[
  {
    "path": ".dockerignore",
    "content": "*/.DS_Store\n.DS_Store\n.DS_Store?\nExport/\nndll/*/lime*\nndll/*/liblime*\nndll/*/nme*\nnddl/*/libnme*\nproject/all_objs\nproject/obj\nproject/vc*.pdb\nproject/winrt/shaders/\n*.userprefs\n*.swp\n.idea/\n*.iml\ntools/*.n\ntools/*.exe\nhaxedoc.xml\ndocs/*.xml\ndocs/xml\ndocs/pages*\n*.git*\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.sh\t\teol=lf"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: [jgranick, joshtynjala]\npatreon: openfl\nopen_collective: openfl\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\non: [push, pull_request]\n\nenv:\n  HAXE_VERSION: 4.2.5\n  HXCPP_COMPILE_CACHE: ${{ github.workspace }}/.hxcpp_cache\n\njobs:\n\n  linux:\n    runs-on: ubuntu-22.04\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - name: Install system dependencies\n        run: |\n          sudo apt-get update\n          sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev g++-multilib gcc-multilib libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib --global update haxelib --quiet\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib install utest --quiet\n\n      - name: Rebuild Lime tools\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime rebuild tools -nocolor -verbose -nocffi\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Rebuild Lime (Linux)\n        run: |\n          lime rebuild linux -32 -release -nocolor -verbose -nocffi\n          lime rebuild linux -64 -release -nocolor -verbose -nocffi\n          lime rebuild hl -clean -release -nocolor -verbose -nocffi\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Linux-NDLL\n          path: |\n            ndll/Linux/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Linux64-NDLL\n          path: |\n            ndll/Linux64/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Linux64-Hashlink\n          path: |\n            templates/bin/hl/Linux64\n          if-no-files-found: error\n\n      - name: Run unit tests\n        working-directory: tests/unit\n        run: |\n          lime test neko -release -verbose -nocolor\n          lime test hl -release -verbose -nocolor\n          lime test linux -release -verbose -nocolor\n\n      - name: Install samples\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld linux -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage linux -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio linux -release -verbose -nocolor\n\n  linux-arm64:\n    runs-on: ubuntu-22.04-arm\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - name: Install system dependencies\n        run: |\n          sudo add-apt-repository ppa:haxe/releases -y\n          sudo apt-get update\n          sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev\n\n      # krdlab/setup-haxe doesn't support arm64 linux\n      # so this is our workaround for now\n      - name: Install Haxe\n        run: |\n          sudo add-apt-repository ppa:haxe/releases -y\n          sudo apt-get update\n          sudo apt-get install -y haxe\n          mkdir $HOME/haxelib\n          haxelib setup $HOME/haxelib\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib --global update haxelib --quiet\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib install utest --quiet\n\n      - name: Enable HXCPP compile cache\n        run: |\n          echo \"HXCPP_COMPILE_CACHE=~/.hxcpp\" >> $GITHUB_ENV\n\n      - name: Rebuild Lime tools\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime rebuild tools -nocolor -verbose -nocffi\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Rebuild Lime (Linux ARM64)\n        run: |\n          lime rebuild linux -release -nocolor -verbose -nocffi\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: LinuxArm64-NDLL\n          path: |\n            ndll/LinuxArm64/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - name: Run unit tests\n        working-directory: tests/unit\n        run: |\n          lime test neko -release -verbose -nocolor\n          lime test linux -release -verbose -nocolor\n\n      - name: Install samples\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld linux -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage linux -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio linux -release -verbose -nocolor\n\n  macos:\n    runs-on: macos-14\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install HashLink dependencies\n        run: |\n          arch -x86_64 /bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"\n          pushd project/lib/hashlink\n          arch -x86_64 /usr/local/bin/brew update\n          rm /usr/local/bin/2to3*\n          rm /usr/local/bin/idle3*\n          rm /usr/local/bin/pydoc3*\n          rm /usr/local/bin/python3*\n          rm /usr/local/bin/pip3*\n          arch -x86_64 /usr/local/bin/brew bundle\n          popd\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib install utest --quiet\n\n      - name: Rebuild Lime tools\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime rebuild tools -nocolor -verbose -nocffi\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Rebuild Lime (macOS)\n        run: |\n          lime rebuild macos -clean -release -64 -nocolor -verbose -nocffi\n          lime rebuild macos -clean -release -arm64 -nocolor -verbose -nocffi\n          lime rebuild hl -clean -release -nocolor -verbose -nocffi\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Mac64-NDLL\n          path: |\n            ndll/Mac64/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: MacArm64-NDLL\n          path: |\n            ndll/MacArm64/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Mac64-Hashlink\n          path: |\n            templates/bin/hl/Mac64\n          if-no-files-found: error\n\n      - name: Run unit tests\n        working-directory: tests/unit\n        run: |\n          lime test neko -release -verbose -nocolor\n          lime test hl -release -verbose -nocolor\n          lime test mac -release -verbose -nocolor\n\n      - name: Install samples\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      # - name: Build HelloWorld sample\n      #   run: |\n      #     lime create HelloWorld -verbose -nocolor\n      #     lime build HelloWorld macos -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage macos -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio macos -release -verbose -nocolor\n\n  windows:\n    runs-on: windows-latest\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - uses: joshtynjala/setup-adobe-air-action@v2\n        with:\n          air-version: \"33.1\"\n          accept-license: true\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$Env:HAXE_STD_PATH\\..\" >> $Env:GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib install utest --quiet\n\n      - name: Rebuild Lime tools\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime rebuild tools -nocolor -verbose -nocffi\n          haxelib run lime setup -alias -y -nocffi\n          haxelib run lime config AIR_SDK ${{ env.AIR_HOME }} -eval\n\n      - name: Rebuild Lime (Windows)\n        run: |\n          lime rebuild windows -32 -release -nocolor -verbose -nocffi\n          lime rebuild windows -64 -release -nocolor -verbose -nocffi\n          lime rebuild hl -clean -release -nocolor -verbose -nocffi\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Windows-NDLL\n          path: |\n            ndll/Windows/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Windows64-NDLL\n          path: |\n            ndll/Windows64/\n            !**/.gitignore\n          if-no-files-found: error\n\n      # - uses: actions/upload-artifact@v7\n      #   with:\n      #     name: Windows-Hashlink\n      #     path: |\n      #       templates/bin/hl/Windows\n      #     if-no-files-found: error\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Windows64-Hashlink\n          path: |\n            templates/bin/hl/Windows64\n          if-no-files-found: error\n\n      - name: Run unit tests\n        working-directory: tests/unit\n        run: |\n          lime test neko -release -verbose -nocolor\n          lime test hl -release -verbose -nocolor\n          lime test air -release -verbose -nocolor\n          lime test windows -release -verbose -nocolor\n\n      - name: Install samples\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld windows -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage windows -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio windows -release -verbose -nocolor\n\n      - name: Rebuild Lime (Windows, Mingw)\n        run: |\n          rm ndll/Windows64/*\n          lime rebuild windows -Dmingw -D MINGW_ROOT=C:\\mingw64 -64 -clean -release -nocolor -verbose -nocffi\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Windows64-MinGW-NDLL\n          path: |\n            ndll/Windows64/\n            !**/.gitignore\n          if-no-files-found: error\n\n  android:\n    runs-on: ubuntu-22.04\n    strategy:\n      matrix:\n        ndk-version: [r28c, stable]\n      fail-fast: false\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - name: Install Android NDK\n        uses: nttld/setup-ndk@v1\n        id: setup-ndk\n        if: matrix.ndk-version != 'stable'\n        with:\n          ndk-version: ${{ matrix.ndk-version }}\n\n      - uses: actions/setup-java@v5\n        with:\n          distribution: \"zulu\"\n          java-version: 17\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime setup -alias -y -nocffi -eval\n\n      - name: Configure Android support\n        run: |\n          lime config ANDROID_SDK $ANDROID_HOME -eval\n          lime config ANDROID_NDK_ROOT ${{ env.LIME_NDK_ROOT }} -eval\n          lime config JAVA_HOME $JAVA_HOME -eval\n          lime config ANDROID_SETUP true -eval\n          lime config -eval\n        env:\n          LIME_NDK_ROOT: ${{ matrix.ndk-version == 'stable' && '$ANDROID_NDK_ROOT' || steps.setup-ndk.outputs.ndk-path }}\n\n      - name: Rebuild Lime (Android)\n        run: |\n          lime rebuild android -release -nocolor -verbose -nocffi -eval\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: Android-NDLL\n          path: |\n            ndll/Android/\n            !**/.gitignore\n          if-no-files-found: error\n        if: matrix.ndk-version != 'stable'\n\n      - name: Install samples\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor -eval\n          lime build HelloWorld android -release -verbose -nocolor -eval\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor -eval\n          lime build SimpleImage android -release -verbose -nocolor -eval\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor -eval\n          lime build SimpleAudio android -release -verbose -nocolor -eval\n  ios:\n    runs-on: macos-14\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime setup -alias -y -nocffi -eval\n\n      - name: Rebuild Lime (iOS)\n        run: |\n          lime rebuild ios -clean -release -verbose -nocolor -eval\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: iPhone-NDLL\n          path: |\n            ndll/iPhone/\n            !**/.gitignore\n          if-no-files-found: error\n\n      - name: Install samples\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      # - name: Build HelloWorld sample\n      #   run: |\n      #     lime create HelloWorld -verbose -nocolor -eval\n      #     lime build HelloWorld ios -simulator -release -verbose -nocolor -eval\n\n      - name: Build SimpleImage sample (Simulator)\n        run: |\n          lime create SimpleImage -verbose -nocolor -eval\n          lime build SimpleImage ios -simulator -release -verbose -nocolor -eval\n\n      - name: Build SimpleAudio sample (Device)\n        run: |\n          lime create SimpleAudio -verbose -nocolor -eval\n          lime build SimpleAudio ios -release -nosign -verbose -nocolor -eval\n\n  package-haxelib:\n    needs: [linux, macos, windows, android, ios]\n    runs-on: ubuntu-22.04\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib install svg --quiet\n          haxelib install openfl --quiet\n\n      - name: Rebuild Lime tools\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime rebuild tools -nocolor -verbose -nocffi\n          haxelib run lime setup -alias -y -nocffi\n          cp project/lib/hashlink/other/osx/entitlements.xml templates/bin/hl/entitlements.xml\n          mkdir templates/bin/hl/include\n          cp project/lib/hashlink/src/hlc.h templates/bin/hl/include/hlc.h\n          cp project/lib/hashlink/src/hl.h templates/bin/hl/include/hl.h\n          cp project/lib/hashlink/src/hlc_main.c templates/bin/hl/include/hlc_main.c\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Android-NDLL\n          path: ndll/Android/\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: iPhone-NDLL\n          path: ndll/iPhone/\n\n      # - uses: actions/download-artifact@v8\n      #   with:\n      #     name: Linux-NDLL\n      #     path: ndll/Linux/\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Linux64-NDLL\n          path: ndll/Linux64/\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Mac64-NDLL\n          path: ndll/Mac64/\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: MacArm64-NDLL\n          path: ndll/MacArm64/\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Windows-NDLL\n          path: ndll/Windows/\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Windows64-NDLL\n          path: ndll/Windows64/\n\n      # - uses: actions/download-artifact@v8\n      #   with:\n      #     name: Windows-Hashlink\n      #     path: templates/bin/hl/Windows\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Windows64-Hashlink\n          path: templates/bin/hl/Windows64\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Mac64-Hashlink\n          path: templates/bin/hl/Mac64\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: Linux64-Hashlink\n          path: templates/bin/hl/Linux64\n\n      - name: Rebuild Lime run.n\n        working-directory: tools\n        run: |\n          haxe run.hxml\n\n      - name: Rebuild Lime svg.n\n        working-directory: tools\n        run: |\n          haxe svg.hxml\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: lime-haxelib\n          path: |\n            ./\n            !project/\n            !haxe-*-*/\n            !neko-*-*/\n            !.git/\n          compression-level: 9\n          if-no-files-found: error\n\n  docs:\n    runs-on: ubuntu-22.04\n    steps:\n\n      - uses: actions/checkout@v6\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          haxelib install dox --quiet\n          haxelib dev lime ${{ github.workspace }}\n\n      - name: Build docs\n        working-directory: docs\n        run: |\n          haxe build.hxml\n\n      - uses: actions/upload-artifact@v7\n        with:\n          name: lime-docs\n          path: docs/pages\n          if-no-files-found: error\n\n  flash-samples:\n    runs-on: ubuntu-22.04\n    steps:\n\n      - uses: actions/checkout@v6\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime setup -alias -y -nocffi -eval\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor -eval\n          lime build HelloWorld flash -release -verbose -nocolor -eval\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor -eval\n          lime build SimpleImage flash -release -verbose -nocolor -eval\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor -eval\n          lime build SimpleAudio flash -release -verbose -nocolor -eval\n\n  air-samples:\n    runs-on: windows-latest\n    strategy:\n      matrix:\n        haxe-version: [4.0.5, 4.1.5, 4.2.5, 4.3.6]\n    steps:\n\n      - uses: actions/checkout@v6\n        with:\n          submodules: true\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ matrix.haxe-version }}\n\n      - uses: joshtynjala/setup-adobe-air-action@v2\n        with:\n          air-version: \"33.1\"\n          accept-license: true\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$Env:HAXE_STD_PATH\\..\" >> $Env:GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip\n          haxelib install ../hxcpp-4.3.45.zip --quiet\n          haxelib install format --quiet\n          haxelib install hxp --quiet\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime ${{ github.workspace }}\n          haxelib run lime setup -alias -y -nocffi -eval\n          haxelib run lime config AIR_SDK ${{ env.AIR_HOME }} -eval\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor -eval\n          lime build HelloWorld air -release -verbose -nocolor -eval\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor -eval\n          lime build SimpleImage air -release -verbose -nocolor -eval\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor -eval\n          lime build SimpleAudio air -release -verbose -nocolor -eval\n\n  hashlink-samples:\n    needs: package-haxelib\n    strategy:\n      matrix:\n        os: [windows-latest, ubuntu-22.04, macos-14]\n    runs-on: ${{ matrix.os }}\n    steps:\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ env.HAXE_VERSION }}\n\n      - name: Set HAXEPATH (Windows)\n        if: runner.os == 'Windows'\n        run: |\n          echo \"HAXEPATH=$Env:HAXE_STD_PATH\\..\" >> $Env:GITHUB_ENV\n      - name: Set HAXEPATH (Mac/Linux)\n        if: runner.os != 'Windows'\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: lime-haxelib\n          path: lime-haxelib\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime lime-haxelib\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld hl -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage hl -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio hl -release -verbose -nocolor\n\n  hashlinkc-samples:\n    needs: package-haxelib\n    strategy:\n      matrix:\n        os: [windows-latest, ubuntu-22.04, macos-14]\n    runs-on: ${{ matrix.os }}\n    steps:\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: 4.3.3 # minimum required version for HL/C is 4.3.3\n\n      - name: Set HAXEPATH (Windows)\n        if: runner.os == 'Windows'\n        run: |\n          echo \"HAXEPATH=$Env:HAXE_STD_PATH\\..\" >> $Env:GITHUB_ENV\n      - name: Set HAXEPATH (Mac/Linux)\n        if: runner.os != 'Windows'\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: lime-haxelib\n          path: lime-haxelib\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime lime-haxelib\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld hlc -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage hlc -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio hlc -release -verbose -nocolor\n\n  html5-samples:\n    needs: package-haxelib\n    runs-on: ubuntu-22.04\n    strategy:\n      matrix:\n        haxe-version: [3.4.7, 4.0.5, 4.1.5, 4.2.5, 4.3.6]\n    steps:\n\n      - uses: actions/checkout@v6\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ matrix.haxe-version }}\n\n      - name: Set HAXEPATH\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          haxelib install genes --quiet\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: lime-haxelib\n          path: lime-haxelib\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime lime-haxelib\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld html5 -release -verbose -nocolor\n\n      - name: Build HelloWorld variants\n        if: ${{ matrix.haxe-version != '3.4.7' }}\n        run: |\n          lime build HelloWorld html5 -clean -release -verbose -nocolor --haxelib=genes\n          lime build HelloWorld html5 -clean -release -verbose -nocolor -minify -terser\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage html5 -release -verbose -nocolor\n\n      - name: Build SimpleImage variants\n        if: ${{ matrix.haxe-version != '3.4.7' }}\n        run: |\n          lime build SimpleImage html5 -clean -release -verbose -nocolor --haxelib=genes\n          lime build SimpleImage html5 -clean -release -verbose -nocolor -minify -terser\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio html5 -release -verbose -nocolor\n\n      - name: Build SimpleAudio variants\n        if: ${{ matrix.haxe-version != '3.4.7' }}\n        run: |\n          lime build SimpleAudio html5 -clean -release -verbose -nocolor --haxelib=genes\n          lime build SimpleAudio html5 -clean -release -verbose -nocolor -minify -terser\n\n  neko-samples:\n    needs: package-haxelib\n    strategy:\n      matrix:\n        haxe-version: [3.4.7, 4.2.5]\n        os: [windows-latest, ubuntu-22.04, macos-14]\n    runs-on: ${{ matrix.os }}\n    steps:\n\n      - uses: krdlab/setup-haxe@v2\n        with:\n          haxe-version: ${{ matrix.haxe-version }}\n\n      - name: Set HAXEPATH (Windows)\n        if: runner.os == 'Windows'\n        run: |\n          echo \"HAXEPATH=$Env:HAXE_STD_PATH\\..\" >> $Env:GITHUB_ENV\n      - name: Set HAXEPATH (Mac/Linux)\n        if: runner.os != 'Windows'\n        run: |\n          echo \"HAXEPATH=$HAXE_STD_PATH/..\" >> $GITHUB_ENV\n\n      - name: Install Haxe dependencies\n        run: |\n          haxelib git lime-samples https://github.com/openfl/lime-samples --quiet\n\n      - uses: actions/download-artifact@v8\n        with:\n          name: lime-haxelib\n          path: lime-haxelib\n\n      - name: Prepare Lime\n        run: |\n          haxelib dev lime lime-haxelib\n          haxelib run lime setup -alias -y -nocffi\n\n      - name: Build HelloWorld sample\n        run: |\n          lime create HelloWorld -verbose -nocolor\n          lime build HelloWorld neko -release -verbose -nocolor\n\n      - name: Build SimpleImage sample\n        run: |\n          lime create SimpleImage -verbose -nocolor\n          lime build SimpleImage neko -release -verbose -nocolor\n\n      - name: Build SimpleAudio sample\n        run: |\n          lime create SimpleAudio -verbose -nocolor\n          lime build SimpleAudio neko -release -verbose -nocolor\n\n  notify:\n    runs-on: ubuntu-22.04\n    needs: [package-haxelib, docs, android, flash-samples, air-samples, hashlink-samples, hashlinkc-samples, html5-samples, ios, linux, macos, neko-samples, windows]\n    if: ${{ github.repository == 'openfl/lime' && github.event_name != 'pull_request' }}\n    steps:\n      - name: Notify Discord\n        uses: nobrayner/discord-webhook@v1\n        with:\n          github-token: ${{ secrets.github_token }}\n          discord-webhook: ${{ secrets.DISCORD_WEBHOOK }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*/.DS_Store\n.DS_Store\n.DS_Store?\nExport/\nndll/*/lime*\nndll/*/liblime*\nndll/*/*.hdll\nndll/*/*.hash\nndll/*/*.so\nndll/*/*.dylib\nndll/*/*.lib\nndll/*/hl*\nndll/*/*.dll\ntemplates/bin/hl/*\nproject/all_objs\nproject/obj\nproject/vc*.pdb\n*.userprefs\n*.swp\n.idea/\n*.iml\ntools/*.n\ntools/*.exe\ntools/obj\nhaxedoc.xml\ndocs/*.xml\ndocs/xml\ndocs/pages*\ndocs/dump\n.vscode/settings.json\npackage-lock.json\nnode_modules\n!templates/**/node_modules\n.vscode/\ntests/**/bin/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"project/lib/vorbis\"]\n\tpath = project/lib/vorbis\n\turl = https://github.com/xiph/vorbis\n\tshallow = true\n[submodule \"project/lib/sdl\"]\n\tpath = project/lib/sdl\n\turl = https://github.com/libsdl-org/SDL\n\tshallow = true\n[submodule \"project/lib/openal\"]\n\tpath = project/lib/openal\n\turl = https://github.com/kcat/openal-soft\n\tshallow = true\n[submodule \"project/lib/curl\"]\n\tpath = project/lib/curl\n\turl = https://github.com/curl/curl\n\tshallow = true\n[submodule \"project/lib/ogg\"]\n\tpath = project/lib/ogg\n\turl = https://github.com/xiph/ogg\n\tshallow = true\n[submodule \"project/lib/zlib\"]\n\tpath = project/lib/zlib\n\turl = https://github.com/madler/zlib\n\tshallow = true\n[submodule \"project/lib/neko\"]\n\tpath = project/lib/neko\n\turl = https://github.com/HaxeFoundation/neko\n\tshallow = true\n[submodule \"project/lib/png\"]\n\tpath = project/lib/png\n\turl = https://github.com/glennrp/libpng\n\tshallow = true\n[submodule \"project/lib/jpeg\"]\n\tpath = project/lib/jpeg\n\turl = https://github.com/libjpeg-turbo/libjpeg-turbo\n\tshallow = true\n[submodule \"project/lib/freetype\"]\n\tpath = project/lib/freetype\n\turl = https://github.com/freetype/freetype\n\tshallow = true\n[submodule \"project/lib/harfbuzz\"]\n\tpath = project/lib/harfbuzz\n\turl = https://github.com/harfbuzz/harfbuzz\n\tshallow = true\n[submodule \"project/lib/cairo\"]\n\tpath = project/lib/cairo\n\turl = https://gitlab.freedesktop.org/cairo/cairo.git\n\tshallow = true\n[submodule \"project/lib/pixman\"]\n\tpath = project/lib/pixman\n\turl = https://gitlab.freedesktop.org/pixman/pixman.git\n\tshallow = true\n[submodule \"project/lib/lzma\"]\n\tpath = project/lib/lzma\n\turl = https://github.com/openfl/liblzma\n\tshallow = true\n[submodule \"project/lib/tinyfiledialogs\"]\n\tpath = project/lib/tinyfiledialogs\n\turl = https://github.com/openfl/libtinyfiledialogs\n\tshallow = true\n[submodule \"project/lib/efsw\"]\n\tpath = project/lib/efsw\n\turl = https://github.com/SpartanJ/efsw\n\tshallow = true\n[submodule \"project/lib/vpx\"]\n\tpath = project/lib/vpx\n\turl = https://github.com/webmproject/libvpx\n\tshallow = true\n[submodule \"project/lib/webm\"]\n\tpath = project/lib/webm\n\turl = https://github.com/webmproject/libwebm\n\tshallow = true\n[submodule \"project/lib/mbedtls\"]\n\tpath = project/lib/mbedtls\n\turl = https://github.com/Mbed-TLS/mbedtls\n\tshallow = true\n[submodule \"project/lib/mojoal\"]\n\tpath = project/lib/mojoal\n\turl = https://github.com/icculus/mojoAL\n\tshallow = true\n[submodule \"project/lib/hashlink\"]\n\tpath = project/lib/hashlink\n\turl = https://github.com/HaxeFoundation/hashlink\n\tshallow = true\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Changelog\n=========\n\n8.3.1 (02/16/2026)\n------------------\n\n- Added validation for `ANDROID_SDK`, `ANDROID_NDK_ROOT`, `JAVA_HOME` and `AIR_SDK` paths to ensure that they exist and are directories.\n- Added verbose log message when rebuilding a Haxelib's tools to show the name of the Haxelib.\n- Added warning log message when rebuilding a Haxelib's tools when no rebuild script is found.\n- Added warning log message when `<architecture/>` value is unrecognized.\n- Added error when attemping to rebuild HashLink for ARM64.\n- Added internal exception message to error reported when NDLL loading fails.\n- Fixed exception on some targets in `AudioBuffer` when trying to read codec signature string from bytes.\n- Fixed `length` value of `Bytes` on HTML5 target when using `Bytes.fromBytes()`.\n- Fixed _lime.ndll_ build on systems with GCC 15 compiler.\n- Fixed _lime.ndll_ build on ARM64 Linux distributions other than Raspberry Pi OS.\n- Fixed `--no-output` behavior in Android build that exited before all architectures were handled.\n- Fixed `JNISafety` to make it safe for macro context.\n- Fixed warnings when building pixman with Android NDKs before r22.\n- Fixed _lime.ndll_ build when using MinGW compiler.\n- Fixed format of `PLATFORM` define for Android.\n- Fixed support for spaces in paths when building for iOS or tvOS.\n- Fixed DCE incorrectly disabling orientation change listeners on Android.\n- Fixed value of `context.attributes.hardware` for `HTML5Window` when creating context.\n- Fixed SDL submodule build for some Linux distributions including Raspberry Pi OS.\n- Fixed emulated `sys.io.File` on Adobe AIR to use `File.workingDirectory` for relative paths, if available.\n\n8.3.0 (11/11/2025)\n------------------\n\n- Added `onDisplayOrientation` and `onDeviceOrientation` events to `Application` to detect mobile device orientation changes.\n- Added `safeArea` property to `Display` to detect region safe from cutouts and rounded corners.\n- Added `rumble()` method to `Gamepad`.\n- Added `-json` flag, which works similarly to the `-xml` flag, but outputs types in JSON format.\n- Added `layoutInDisplayCutoutMode` to `<config:android>`, which may be set to `default`, `always`, `never`, or `shortEdges`.\n- Added support for Windows resource file to set metadata in executable.\n- Added `pannerAttr()` method to `Howler` to configure panner node's attributes for a sound or group of sounds.\n- Added `addString()` method to `HBBuffer` to properly handle encoding conversions in native code.\n- Added `screensize` and `screenDPI` to `<config:air>` to customize the mobile simulator.\n- Added `onUncaughtError` event to `ThreadPool` to allow main thread to handle exceptions in `doWork`.\n- Added `strikethroughPosition` and `strikethroughThickness` to `Font`.\n- Added separate `lime-openalsoft` and `lime-mojoal` defines to help detect which library is used.\n- Added `gradle-properties` to `<config:android>` to customize properties for Android Gradle builds.\n- Fixed missing `hl-ver` define to configure the Haxe compiler to target Lime's bundled HashLink (unless a custom `HL_PATH` is set).\n- Fixed display of preload progress for packed asset libraries.\n- Fixed mouse move and mouse up event failing to dispatch outside window bounds when mouse button is down.\n- Fixed `hardware` attribute not being set on context creation.\n- Fixed some window properties not getting set properly from attributes on window creation.\n- Fixed performance issues in `ThreadPool` by overhauling job scheduling.\n- Fixed exception on Windows when exiting program by using `SDL_QuitSubSystem` in native code.\n- Fixed separate private variables for `visible` and `hidden` that got out of sync.\n- Fixed crash on HashLink when passing `NULL` device to OpenAL bindings.\n- Fixed many variables that defaulted to `Dynamic` because they did not declare a type and were not initialized.\n- Fixed `ThreadPool` throwing an exception when `Application.current` is `null`.\n- Fixed old _run.n_ in Haxelib because the CI server did not build it.\n- Changed Android rebuild to use NDK r28c for Haxelib to support new 16KB native library aligment requirement.\n- Changed Android target SDK version to 35. May require updating to JDK 17 or newer.\n- Changed default Android architecture for x86 from x86_32 to x86_64 (can still rebuild x86_32 manually).\n- Changed default Android emulator architectures to include ARM64 to better support ARM64 on macOS.\n- Changed default Adobe AIR SDK version from 28.0 to 32.0 because 28.0 is no longer available for download from Adobe.\n- Changed `minimum-sdk-version` in `<config:android>` to customize the `PLATFORM` or `PLATFORM_NUMBER` values used by Android builds.\n- Changed _index.html_ template to use `mobile-web-app-capable` instead of deprecated `apple-mobile-web-app-capable`.\n- Removed Linux x86_32 binaries from Haxelib (but can still rebuild them manually).\n- Removed custom implementation of `haxe.io.Bytes`.\n- Updated bundled HashLink executable version to 1.14.\n- Updated SDL submodule to version 2.30.12.\n\n8.2.3 (10/01/2025)\n------------------\n\n- Fixed JPEG rendering on 32-bit platforms.\n- Fixed application hang in `FileDialog` on Windows by forcing `SINGLE_THREADED` flag.\n- Fixed iOS device installation on versions older than iOS 16.\n- Fixed how iOS 16 and newer devices are selected for testing to support more available devices.\n- Fixed ability to specify the version of a Haxelib when using a local _.haxelib_ repository.\n- Fixed exception when initializing vibration on Android and permission was disabled.\n- Fixed parent directory incorrectly opened in `FileDialog` if the default path is a directory.\n- Fixed Unicode system path conversions on Linux.\n- Fixed `password`, `alias`, and `aliasPassword` being assigned incorrectly in Lime tools.\n- Fixed crash in `AudioManager` when `alc.openDevice()` returns `null`.\n- Fixed references to certain types for stricter rules in Haxe 5.\n- Fixed `FFECT_AUTOWAH` typo by adding correct `EFFECT_AUTOWAH` value.\n- Fixed exception in `HTML5HTTPRequest` in some environments when `request.upload` is `null`.\n- Fixed `EXC_BAD_ACCESS` when decoding PNGs and the bytes are `null` or length is `0`.\n- Fixed iOS app sometimes running in iPhone simulator when `<config:ios device=\"ipad\"/>` is specified.\n- Fixed iOS app sometimes not starting in simulator by recognizing more valid simulator IDs.\n- Fixed incorrect request for confirmation when `-alias` or `-cli` flags are specified.\n- Fixed conversions between key codes and scan codes in both directions.\n- Fixed memory leak in cURL bindings from header values not getting freed.\n- Added `CURLOPT_ACCEPT_ENCODING` option for native HTTP requests.\n- Fixed missing macos define when using cpp target on macOS.\n- Fixed compatibility with Haxe 3 in `HTML5Thread` and Lime tools.\n- Fixed failed static build linking on Windows caused by missing _.lib_ file.\n- Fixed failed static builds caused by conflicts between hxcpp's and Lime's mbedtls versions.\n- Fixed missing UTF-8 conversion in `hb_buffer_add_utf8`.\n- Fixed `Font.getGlyphs()` returning an array of zeroes on HashLink.\n- Fixed `Font.getGlyphs()` getting stuck in an infinite loop on encountering an invalid character.\n- Fixed `System.getDirectory()` UTF-16 encoding.\n- Fixed error not getting displayed when NDK 20 or newer is required for Android.\n- Fixed OpenAL Soft build on Android by adding `-std=c++11` option.\n- Fixed deprecation warning on Android caused by using deprecated no-arg constructor in `android.os.Handler`.\n- Fixed unnecessary `untyped __js__` in `ImageCanvasUtil` because externs are now available.\n- Fixed crashes when SDL functions return `NULL` on some targets.\n- Fixed `Timer.stop()` performing redundant iterations.\n- Added `-cli`, `-alias`, and `-noalias` flags to usage instructions.\n- Added instructions to use `lime config remove HL_PATH` to clear a custom HashLink version.\n- Changed `non-exempt-encryption` default for iOS from `true` to `false`.\n- Removed usage of legacy `MAC_USE_CURRENT_SDK` define in Lime tools when targeting macOS.\n- Updated Cairo submodule to version 1.18.2 from a snapshot release.\n- Updated HarfBuzz submodule to version 10.2.0.\n- Updated cURL submodule to version 7.87.0.\n- Updated zlib submodule to version 1.2.13.\n- Updated png submodule to version 1.6.46.\n- Updated efsw submodule to version 1.4.1.\n- Updated tinyfiledialogs submodule to version 3.19.1 and fix compatibility with zenity.\n\n8.2.2 (12/19/2024)\n------------------\n\n- Fixed broken breakpoints in HTML5 debug builds.\n- Fixed unecessary operations in `Promise` by inlining some getter functions.\n- Fixed failure to read `gradle-plugin` attribute in `<config:android>` tag.\n- Fixed failed installation of app on iOS Simulator by choosing only simulators that are considered available.\n- Fixed `lime test ios` to install and launch on a device when using Xcode 16 or newer.\n- Fixed reported version of OpenAL library.\n- Fixed memory cleanup when encoding PNG and JPEG images.\n- Fixed error reporting `@rpath/libhl.dylib` not found on macOS when using HashLink nightly build.\n- Fixed building HashLink on macOS that required cleaning between compiles.\n- Fixed `embedBytes()` macro incorrectly running when `embedByteArray()` macro was also running.\n- Fixed `ImageDataUtil.copyPixels()` causing crash on HashLink.\n- Fixed missing `neko` target flag when cross-compiling to Windows without `-mingw` or `-cpp` flags.\n- Fixed occasional failure running Lime tools by switching certain paths from relative to absolute.\n- Fixed missing warning when `lime rebuild` commands fail because C++ source is not available from Haxelib.\n- Fixed command instructions to specify requirement for absolute paths when setting up a platform.\n- Added detection of `-cpp` flag when cross-compiling to Windows, which works like `-mingw`.\n- Updated FreeType submodule to version 2.12.1 again. Resolved issues encountered when using this version in Lime 8.2.0.\n\n8.2.1 (11/01/2024)\n------------------\n\n- Fixed `Sys.exit()` causing hang instead of exiting application.\n- Fixed paths for _.ndll_ files when targeting Raspberry Pi.\n- Fixed compiling `BackgroundWorker` when targeting HashLink before Haxe 4.\n- Fixed errors compiling `ThreadPool` for HashLink with Haxe 4.0 and 4.1.\n- Fixed `Font.renderGlyph` to support 32-bit colors, including alpha.\n- Fixed OpenFL line height issues by rolling back FreeType submodule to version 2.9.1.\n\n8.2.0 (10/21/2024)\n------------------\n\n- Added Apple Silicon (ARM64) support for macOS target.\n- Added new `hlc` target to support compiling for HashLink/C. Both generates C code and compiles to an executable (requires Haxe 4.3.4 or newer).\n- Added support for inserting attributes into the `<application/>` or `<activity/>` elements of _AndroidManifest.xml_\n- Added `createPerspective()` to `Matrix4`.\n- Added `removeLibrary()` to `lime.utils.Assets`, which removes a library, but makes unloading optional.\n- Added `SINGLE_THREADED` mode to `ThreadPool`, which is used by default when threading is not available.\n- Added `workLoad` property to `ThreadPool` to limit total time spent per frame on green threads.\n- Added optional `-noalias` flag to `lime setup` to skip creating the **lime** executable alias.\n- Added optional `-nosign` flag to `lime build ios` to skip code signing when targeting iOS.\n- Added support for `-64` flag to force compiling for 64-bit Raspberry Pi.without requiring a custom template.\n- Added option to configure `preserveDrawingBuffer` on HTML5 target.\n- Added LZMA compression to HTML5 target.\n- Added automatic deletion of \"stale\" assets and dependency files.\n- Added `VIEW` intents on Android target.\n- Added support for `-mingw` flag when cross-compiling to Windows from another operating system.\n- Added support for `-cpp` flag when cross-compiling to Linux from another operating system (requires homebrew-macos-cross-toolchains on macOS).\n- Added support for `tsa` option in `<config:air>` to pass timestamp URL to Adobe AIR's adt tool.\n- Fixed `lime display` command incorrectly printing old _.hxml_ content after _project.xml_ file has been modified, skipping requirement to build project or restart editor to get valid code intelligence.\n- Fixed HashLink _.app_ bundles on macOS to include all Homebrew library dependencies, so that they run on computers without Homebrew.\n- Fixed `@android:style/Theme.NoTitleBarnull` in generated _AndroidManifest.xml_.\n- Fixed `Image` in a web worker by storing it as `DATA` type.\n- Fixed cURL C++ to Haxe callbacks when targeting HashLink.\n- Fixed icon generation for Android target with `accept-file-intent` config.\n- Fixed exception in Lime tools when resolving full path of Neko _.n_ file.\n- Fixed keyboard input incorrectly getting enabled by default when creating a new window, which could show an IME when unexpected.\n- Fixed `ALC.getContextsDevice()` when targeting HashLink.\n- Fixed potentially uninitialized values in `Matrix3`.\n- Fixed wrong type for `Socket.objectEncoding` in Flash/AIR externs.\n- Fixed `BackgroundWorker` not using threads on HashLink.\n- Improved support for Raspberry Pi 64-bit builds.\n- Changed custom `haxe.Timer` to fall back to the original in a macro context.\n- Changed `Promise` to remove `@:generic` when in a macro context.\n- Changed `Matrix3` to be an abstract over `Float32Array`, similar to `Matrix4`.\n- Changed Raspberry Pi keyboard shortcut to exit to Ctrl + Esc.\n- Changed `-64` and `-32` flags for Intel architectures to `-x86_64` and `-x86_32` to make their purpose more clear (the old flags still work, for now).\n- Removed Joystick trackball APIs because they is supported only on Linux, with a single piece of hardware, and will be removed from SDL 3.\n- Removed ARMV5 architecture from Android rebuilds by default because hxcpp doesn't support it with NDK versions >= 20.\n- Removed 32-bit _liblime.iphonesim.a_ as a default binary because 32-bit iOS is no longer supported by Apple.\n- Updated Cairo submodule to version 1.17.6 and point to upstream repository instead of fork.\n- Updated cURL submodule to version 7.83.1 and point to upstream repository instead of fork.\n- Updated efsw submodule to version 1.2.0 and point to upstream repository instead of fork.\n- Updated FreeType submodule to version 2.12.1 and point to upstream repository instead of fork.\n- Updated HarfBuzz submodule to version 6.0.0 and point to upstream repository instead of fork.\n- Updated libpng submodule to version 1.6.37 and point to upstream repository instead of fork.\n- Updated libjpg-turbo submodule to version 2.1.3 and point to upstream repository instead of fork.\n- Updated libvpx submodule to version 1.11.0 and point to upstream repository instead of fork.\n- Updated libwebm submodule to version 1.0.0.28 and point to upstream repository instead of fork.\n- Updated Mbed TLS submodule to version 2.28.7 and point to upstream repository instead of fork.\n- Updated MojoAL submodule to commit e08dbf3 and point to upstream repository instead of fork.\n- Updated Ogg submodule to version 1.3.5 and point to upstream repository instead of fork.\n- Updated OpenAL-Soft submodule to version 1.20.1 and point to upstream repository instead of fork.\n- Updated Pixman submodule to version 0.42.2 and point to upstream repository instead of fork.\n- Updated SDL submodule to version 2.24.0 and point to upstream repository instead of fork.\n- Updated Tinyfiledialogs submodule to version 3.8.8 (still uses fork due to SourceForge limitationss).\n- Updated Vorbis submodule to version 1.3.7 and point to upstream repository instead of fork.\n- Updated zlib submodule to version 1.2.12 and point to upstream repository instead of fork.\n\n8.1.3 (07/22/2024)\n------------------\n\n- Fixed Unicode conversion issues with various APIs, including as clipboard, window text, file dialogs, and fonts.\n- Fixed Android builds with the `-emulator` flag that broke when using newer Android SDKs.\n- Fixed \"Could not link to neko\" error message on macOS when lime.ndll is built with Xcode 15.\n- Fixed system environment variables with the same name as common targets conflicting with other targets.\n- Fixed `<echo/>` and `<log/>` output confusing Haxe's completion server. Now skipped when `display` is defined.\n- Fixed `Clipboard.text` incorrectly getting cleared to null when targeting HTML5.\n- Fixed integer value parsing in _project.xml_, including immediately reporting errors for invalid values.\n- Fixed incorrect path discovery for NDLL files that found source directory instead.\n- Fixed missing error message if HXP project class name does not match file name.\n- Fixed unspecified behavior from `null` keys in `ObjectPool`.\n- Fixed some issues when running Haxe built natively for Apple Silicon.\n- Fixed missing cancellation of vibration on Android when app is paused or destroyed.\n- Fixed static linking of native curl library on macOS.\n- Fixed deprecation warnings in Android Gradle builds.\n\n8.1.2 (03/13/2024)\n------------------\n\n- Fixed error handling when failing to get joystick information in html5.\n- Fixed error handling when creating `openfl` alias on Linux.\n- Fixed error handling when getting information about Haxelibs.\n- Fixed error when loading fonts in HL.\n- Fixed error when loading grouped music/sound assets.\n- Fixed errors when building on Apple Silicon without Rosetta.\n- Fixed assets not being loaded when using nested asset tags (e.g., `<assets path=\"assets\"> <image path=\"MyImage.png\" /> </assets>`).\n- Fixed VC runtime potentially not being bundled into HL apps built on Windows.\n- Fixed error in `AssetsMacro` when building with Haxe 4.3.4 or newer.\n- Fixed crash on iOS during network operations.\n- Updated howler.js to 2.2.3.\n- Removed ARMv7 architecture from Android default architectures.\n- Removed deprecated ARMv7 architecture from iOS default architectures.\n\n8.1.1 (11/08/2023)\n------------------\n\n- Fixed subset of characters escaped in file paths to fix Android builds on Windows.\n- Fixed playback of very long sounds by changing arithmetic to avoid integer overflow.\n\n8.1.0 (10/16/2023)\n------------------\n\n- Added `visible` property to `Window` to allow it to be shown and hidden\n- Added `opacity` property to `Window`\n- Added `minWidth`, `minHeight`, `maxWidth`, `maxHeight`, `setMinSize()`, and `setMaxSize()` to `Window`\n- Added new `onShow` and `onHide` events to `Window`\n- Added support for _include.hxp_ file in libraries, similar to _include.xml_\n- Added support for multiple file extension filters on `FileDialog` operations\n- Added `-eval` option to run Lime tools without Neko\n- Added `-terser` option to Lime tools for html5 builds to optionally use Terser minifier\n- Added `-npx` option to Lime tools to run minifiers, or Electron, using `npx` instead of the bundled versions\n- Updated the bundled version of Node.js to 18 LTS for the html5 target's HTTP server\n- Exposed more information to _project.xml_, such as `${project.host}` and `${config.android.target-sdk-version}`\n- Updated the Android Gradle plugin\n- Disabled pointer tagging on Android\n- Fixed issues in `emscripten` target and renamed it to `webassembly`\n- Fixed unpopulated `responseData` on `HTTPRequest` when server returns error status code\n- Fixed `Clipboard` contents being empty when app starts up on Windows and macOS\n- Fixed Unicode string conversion for `alert()` method on `Window` on HashLink target\n- Fixed asset cache clearing when unloading asset library\n- Fixed incorrect timer pause and resume behavior when window goes into background and back to foreground\n- Fixed _.app_ file extension for macOS when building Adobe AIR captive runtime bundle\n- Fixed incorrect \"Lime Application\" window title for Adobe AIR applications\n- Fixed null check when opening file with `FileDialog`\n- Fixed expired Adobe AIR debug certificate\n- Fixed Haxe 3 compatibility for enum abstracts\n- Fixed running native apps with current working directory that does not match the program directory\n- Fixed assets being incorrectly located from `Sys.programPath()` instead of `System.applicationDirectory`\n- Fixed timing on html5 target by using `performance.now()` so that system clock changes don't cause issues\n- Fixed parsing of JNI class names\n- Fixed cleanup when windows are closed and the Lime application exits\n- Removed the defunct Kha backend\n\n8.0.2 (05/31/2023)\n------------------\n\n- Resolve new `@:enum abstract` warnings for Haxe 4.3 by replacing with `enum abstract`, if current Haxe version supports it\n- Resolve new `@:extern` warnings for Haxe 4.3 by replacing with `extern`, if current Haxe version supports it\n- Fixed HTTPS requests failing on macOS by updating cURL and mbedtls dependencies\n- Fixed calling `JNI.callMember()` and `JNI.callStatic()` with more than 7 arguments\n- Fixed DPI detection on Android by using `getDisplayMetrics()`\n- Fixed passing `null` or empty string for default library to `Assets.registerLibrary()` to be more consistent with other APIs\n- Fixed failed Lime tools build with some Haxe versions by removing `-D no-inline`\n- Fixed Haxe argument type of OpenAL `alFilteri` wrapper that should be `Int` instead of `Dynamic`\n- Fixed bad UTF string conversion for `FileDialog` that sometimes displayed incorrect characters on some platforms\n- Fixed HTTP request status 400 being incorrectly treated as successful on html5 target\n- Fixed failed Adobe AIR for iOS build on Windows by removing check for simulators, which are available on macOS only\n- Fixed detection of default iPhone simulator to avoid exceptions and support future versions of Xcode\n- Fixed conflict between `window.Image` and `lime.graphics.Image` when using Genes on html5 target\n- Fixed exception in Lime tools if assets directory does not exist\n- Removed legacy `armv7` from default iOS target architectures because it now results in an error (now defaults to `arm64`)\n- AIR for iOS or Android may specify `listen=\"port\"` in `<config:air/>` element to use USB debugging instead of wifi debugging\n- Improved fix for text fields updating properly on Android devices with html5 target\n- Replaced \"Could not find Neko API interface\" error message with more detailed explanation and instructions\n\n8.0.1 (02/21/2023)\n------------------\n\n- Fixed error where low-priority SVG icons (such as the Flixel icon) would override normal- or high-priority PNGs\n- Fixed `NativeHTTPRequest` buffer management for neko\n- Fixed text field losing focus after copying in HTML5\n- Fixed extra or missing slashes in certain cases when loading assets\n- Fixed `Assets.isLocal(null)` not checking all asset types\n- Fixed getting `Clipboard.text` on Linux\n- Fixed building `-static -debug` Windows apps\n- Fixed sounds playing twice on iOS\n- Fixed command line arguments not being passed to HashLink on macOS\n- Fixed a null pointer exception when setting sound position in HTML5\n- Fixed cURL not resending data if there's a redirect\n- Fixed `FileDialog` behavior when filtering by multiple file extensions, or 0 file extensions\n- Fixed error when importing `JNI` during a macro while building for Android\n- Fixed building `-static` Linux apps\n- Fixed crash when compiling iOS apps with no background color\n- Fixed `System.openFile()` on Linux\n- Fixed requiring a keystore to sign AIR apps\n- Fixed requiring a path to create a keystore\n- Fixed HTML5 text fields not updating promptly on Android devices\n\n8.0.0 (08/30/2022)\n------------------\n\n- Updated HashLink to version 1.12\n- Updated Android minimum SDK version to 21\n- Updated Electron template to version 18\n- Updated HTML5 to high DPI by default\n- Added `--template` command line option to Lime tools\n- Added `--appstore` and `--adhoc` command line options for AIR on iOS to Lime tools (to match iOS native)\n- Added `-air-simulator` command line option for AIR to Lime tools (avoids packaging full AIR app)\n- Added `<config:air profile=\"value\"/>` to optionally support custom AIR profiles in simulator\n- Added `setTextInputRect` to `Window` to specify a rectangle that has focus for text input\n- Added `JNISafety` to improve JNI communication on Android\n- Added `manageCookies` to `HTTPRequest` to support cookies on native platforms (only session for now)\n- Added `pitch` property to `AudioSource`\n- Added `-Delectron` flag to Electron builds so that it's possible to use `#if electron`\n- Added icon priorities to allow a library to provide a default icon that the user can override\n- Improved HashLink _.app_ file generation on macOS\n- Improved performance of `HTTPRequest` on native platforms with better buffer management\n- Improved support for Android 12 (SDK 31) and newer\n- Improved output file size if no assets are defined (sets `disable_preloader_assets` define)\n- Improved stage sizing on Electron (defaults to `0` for fluid width/height, same as regular browsers)\n- Fixed garbage collector crash issue on iOS 12\n- Fixed iOS build that failed because of missing _Metal.framework_ dependency\n- Fixed switching between light and dark modes on Android destroying the Lime activity\n- Fixed `getCurrentTime` on `AudioSource` for streaming sounds on native platforms\n- Fixed wrong types on `NativeMenuItem` Flash externs\n- Fixed set clipboard when `null` is passed (now changes to an empty string automatically)\n- Fixed warnings for deprecated \"devicemotion\" events on Firefox\n- Fixed incompatibility with \"genes\" Haxelib to allow generating JS Modules\n\n7.9.0 (03/10/2021)\n------------------\n\n_Notice: We are moving from our custom build server to Github Actions for releases._\n_As a result, official releases support only current macOS versions. Earlier macOS_\n_releases are still supported when building Lime from the source._\n\n- Updated support for Haxe 4.2\n- Updated the default iOS deployment to 9.0\n- Updated `ios-deploy` tool to support newer iOS and Xcode versions\n- Added `failIfMajorPerformanceCaveat` setting for window (default false)\n- Added bindings for OGG Vorbis on the HashLink target\n- Improved iOS target to exclude Core Bluetooth framework\n- Improved the performance for AIR application boot times\n- Improved error message when attempting to use HashLink target on Haxe 3\n- Fixed support for Android screen orientation\n- Fixed touch support on Android hardware that return unusual touch IDs\n- Fixed an issue with excess bytes saved from `FileDialog` on HTML5\n- Fixed null-termination issues on strings returned from `lime.system.System`\n- Fixed support for IEM input text on HTML5\n- Fixed audio stutter on HTML5 when `force-html-audio` is defined\n\n7.8.0 (06/24/2020)\n------------------\n\n- Updated to SDL 2.0.12\n- Updated Google Closure to v20200315\n- Added support for *.xcframework dependencies on iOS\n- Added support for merging \"-Info.plist\" files from native extensions on iOS\n- Fixed warnings when compiling on HTML5 using Haxe 4.1\n- Fixed HTML5 focus to return to previous element after using `lime.app.Clipboard`\n- Fixed an unnecessary `setTextInputEnabled` workaround on Android\n- Fixed return type for `gl.getParameter(GL.RENDERBUFFER_BINDING)`\n- Fixed old default iOS simulator version\n- Fixed the search string for HaxeObject/JNI to be more precise\n- Fixed support for building using `-Djs-es=6`\n\n7.7.0 (01/27/2020)\n------------------\n\n- Updated SDL with a patch for high DPI resolution on macOS\n- Updated tinyfiledialogs with a Unicode patch on Windows\n- Updated macOS to use OpenAL-Soft (rather than deprecated Apple OpenAL library)\n- Added missing properties/methods to `lime.utils.ArrayBuffer`\n- Added support for NVX_gpu_memory_info OpenGL extension\n- Added support for using launch storyboards instead of launch images on iOS\n- Updated Android template to use Gradle 5.6.3 and Android Gradle Plugin 3.5.1\n- Improved `Assets.unloadLibrary` to allow unloading the default asset library\n- Improved HTML5 WebGL to fallback to canvas if \"major performance caveat\"\n- Improved the Electron output template to work without `-lib hxelectron`\n- Improved support for x86-64 on Android target\n- Improved handling of asset library root paths\n- Improved garbage collection performance on `GLRenderbuffer`\n- Fixed \"auto\" window orientation in the AIR template\n- Fixed launch of iOS simulator on some systems\n- Fixed support for `Clipboard` on HTML5\n- Fixed minimize/maximize on some desktop windows that are not resizable\n- Fixed `Image.fromBitmapData` to set `buffer.transparent`\n- Fixed some issues when toggling fullscreen on Android\n- Fixed a potential crash when getting the system locale on iOS or macOS\n- Fixed cleanup of Howler.js sounds after they are stopped\n- Fixed `FileDialog` to not return as completed if the path is an empty string\n- Fixed the default launch screen sizes on the iOS target\n- Fixed Gradle paths to jcenter/Google for HTTPS support\n\n7.6.3 (09/11/2019)\n------------------\n\n- Fixed copying of 64-bit binaries when using Neko on Windows with Haxe 4\n- Fixed support for both 32- and 64-bit Neko on Windows (for Haxe 3 and 4)\n- Fixed support for loading `HTTPRequest` data using the HL target\n\n7.6.2 (09/05/2019)\n------------------\n\n- Fixed support for 64-bit Neko on Windows (included in Haxe 4 RC 4)\n\n7.6.1 (09/04/2019)\n------------------\n\n- Fixed support for array-based form parameters when making HTTP requests\n- Fixed incorrect default root path for asset manifests on some platforms\n- Fixed a crash on the HL target when pasting non-text data\n\n7.6.0 (08/20/2019)\n------------------\n\n- Updated support for Haxe 4 dev versions\n- Updated SDL to 2.10\n- Updated the default Android target API to 28 (per Google guidelines)\n- Updated HashLink support to 1.10 (requires Haxe 4 RC3 or greater)\n- Added official support for Android ARM64 architecture\n- Added ARM64 as a default architecture in Android builds\n- Added `lime.utils.AssetBundle` for standard compressed libraries\n- Added support for pure JSON-based asset manifest data\n- Added AMD support to generated JavaScript output\n- Added `remove` to `lime.utils.ObjectPool`\n- Added initial support for `window.onMove` on the AIR target\n- Improved the performance of `Image.loadFromBytes` on HTML5\n- Improved `DataPointer` to be a more reliable implementation in JavaScript\n- Improved support for pre-generated asset libraries\n- Improved the same origin check for `HTTPRequest` data-based URIs\n- Improved the native main loop behavior on the Android target\n- Fixed a compile error when using `flash.system.SystemIdleMode`\n- Fixed issues with WebGL on the HTML5 target caused by `DataPointer`\n- Fixed an issue where antialiasing was always enabled on HTML5\n- Fixed the behavior of `image.copyPixels` in a few cases\n- Fixed minor issues when using the `-npm` HTML5 template\n\n7.5.0 (05/14/2019)\n------------------\n\n- Update version\n\n7.4.0 (05/14/2019)\n------------------\n\n- Renamed the \"ndll\" folder to \"lib\"\n- Updated SDL to latest development version\n- Updated the minimum target Android API from 14 to 16\n- Added support for CMYK JPEG decoding on native platforms\n- Added an `-npm` option for HTML5 to use Webpack\n- Added \"hashlink\" as an alias for the HL target\n- Improved the Zlib default compression level\n- Improved support for WinRT applications\n- Improved the internal blur implementation\n- Improved support for native joystick connection/disconnection\n- Improved the output HTML5 script wrapper with better Haxe 3.2 support\n- Fixed the values in `lime.ui.MouseButton` to match Lime's historic values (zero based)\n- Fixed issues effecting proper `Image` pixel-level APIs when targeting HL\n- Fixed a missing button value when dispatching HL mouse events\n\n7.3.0 (04/01/2019)\n------------------\n\n- Updated support for Haxe 4 dev versions\n- Updated SDL to 2.0.9\n- Updated howler.js to 2.1.1\n- Added initial display options to improve debugging with VS Code\n- Added initial HashLink 1.9 support (requires Haxe 4 dev)\n- Added initial support for embedding HTML5 projects in unique isolated JS closures\n- Added support for appending dependency JS scripts to the application file\n- Added initial support for haptic feedback on HTML5\n- Improved `lime display` when `lime build` has not been called\n- Improved support for WinRT native builds\n- Improved the behavior of `URLRequest` to re-use `Bytes` when writing\n- Improved the performance of `URLRequest` on native platforms\n- Improved `window.onDropFile` with an initial workaround for HTML5 support\n- Moved internal code style to use the Haxe \"formatter\" library for consistency\n- Fixed possible incorrect names in generated package.json for Electron output\n- Fixed support for building for Android using ARMv5 or ARMv6 only\n- Fixed the event types in `lime.system.ThreadPool`\n- Fixed a possible rounding error when calculating application update times\n- Fixed cases where HTML5 canvas was not properly enabling image smoothing\n- Fixed the behavior of `threadPool.minThreads` to keep threads active\n- Fixed incorrect extern in \"lime/graphics/opengl/ext\" classes on HTML5\n- Fixed incorrect `imageBuffer.bitsPerPixel` handling in `Font.renderGlyph`\n- Fixed incorrect offset when using `image.copyPixels` with an alpha image\n- Fixed Java `HaxeObject.create` to return `null` if handle is `null`\n- Fixed exposure of generated `__ASSET__` classes to display completion\n\n7.2.1 (01/07/2019)\n------------------\n\n- Updated howler.js to 2.1.0\n- Improved the internal HTTP request limit for better transfer speed on HTML5\n- Improved the performance for native HTTP requests\n- Improved the quality of embedded font meta-data on the HTML5 target\n- Improved `lime.utils.Assets` to allow disabling or setting the cache break number\n- Fixed `Window` to not dispatch `onClose` on HTML5 (due to some mobile browsers)\n- Fixed ability to cancel context menus on HTML5 when they occur on mouse down\n- Fixed font support for some video game console targets\n\n7.2.0 (12/04/2018)\n------------------\n\n- Improved support for Haxe 4 preview 5\n- Improved detection of HTML5 browser key codes to convert to Lime key values\n- Improved support for Turkish lowercase values in `lime.text.UTF8String`\n- Improved `HTTPRequest` with `-Dallow-status-0` to allow code 0 as success\n- Improved project XML to allow `<window background=\"null\" />` or `\"transparent\"`\n- Improved `fileDialog.save` support optional MIME types on HTML5\n- Improved munit support by enabling headless testing on the AIR target\n- Improved the Electron target template with minor updates\n- Improved the standard index.html template for cases when the window is transparent\n- Improved performance when converting `lime.utils.DataPointer` on the C++ target\n- Improved support for native `Clipboard` events\n- Improved use of the `-rebuild` flag when targeting Neko on Windows\n- Fixed a memory leak when certain kinds of bytes were loaded from disk\n- Fixed a possible multi-thread crash in Lime native Bytes\n- Fixed the failure case when loading corrupted PNG images\n- Fixed an issue where `window.cursor = null` did not hide the cursor on HTML5\n- Fixed cases where the HTML5 backend attempted to cancel non-cancelable events\n- Fixed support for `Font.renderGlyph` and `Font.renderGlyphs`\n- Fixed an error in `haxe.Timer` if `System.getTimer` returned 0\n- Fixed native libraries to build with SSE3 support for better performance\n- Fixed use of the `-Ddom` define to force HTML5 DOM render mode\n\n7.1.1 (10/02/2018)\n------------------\n\n- Improved the timing on native `HTTPRequest` to process more quickly\n- Improved handling of `haxe.Timer` to pause and resume when the application suspends\n- Fixed `lime rebuild mac` using Xcode 10 (disabled 32-bit rebuilds by default)\n- Fixed an issue in the newer howler.js library regarding IE support\n- Fixed a regression in older desktop CPU support\n- Fixed an issue when using larger than 64-bit background color values on Flash\n- Fixed `context.antialiasing` setting on HTML5 `Window`\n\n7.1.0 (09/26/2018)\n------------------\n\n- Updated Harfbuzz to 1.8.8\n- Updated OpenAL to 1.19.0\n- Updated howler.js to 2.0.15\n- Updated build configuration of pixman to better support each platform\n- Added `application.meta.version` to the default application template\n- Added support for `<undefine name=\"\" />` for undefining values\n- Added support for `<window title=\"\" />` in project.xml\n- Renamed `cairo.operator` to `cairo.setOperator`/`getOperator` on Haxe 4 builds\n- Updated `lime.text.Font` to allow for changes to the font metric meta values\n- Removed `-Ddisplay` on `lime display` output for better cached compilation\n- Removed prefixes on `imageSmoothingEnabled` internally to remove HTML5 warnings\n- Improved use of howler.js to enable sound position\n- Improved HTML5 support for certain MP3 audio files\n- Improved `Image.loadFromBase64`/`Image.fromBase64` to work on non-HTML5 platforms\n- Fixed a possible error when processing directories ending in \".bundle\"\n- Fixed an issue where multiple `HTTPRequest` instances on native could hang\n- Fixed support for `<library type=\"zip\" />` as an alias for type \"deflate\"\n- Fixed minor issues in `TextField` when working with non-UTF8 `String` values\n- Fixed use of specific iOS target devices in the AIR project template\n- Fixed an exception caused in garbage collection for cURL requests\n- Fixed an issue when using `window.readPixels` on HTML5\n- Fixed possible exceptions when working with Harfbuzz languages\n- Fixed a minor encoding issue in `image.encode (BMP)`\n- Fixed setting of `window.parameters` using `WindowAttributes` on creation\n- Fixed default use of Visual Studio Community when older versions are installed\n- Fixed an exception when checking locale on certain iOS devices\n- Fixed compiler errors when using `webgl2.texImage2D` with certain parameters\n- Fixed use of WebGL 2, when available, as the default context on HTML5\n- Fixed support for `-static` native builds for Windows\n- Fixed an issue where `Assets` cache breaking was not working properly\n- Fixed compilation issues in Haxe 4 development builds\n\n7.0.0 (08/09/2018)\n------------------\n\n- Major API re-design to improve workflow outside of command-line tools\n- Migrated the core of the command-line tools into a new project called HXP\n- Updated Freetype to 2.9.1\n- Updated Android minimum SDK to API 14 and the default target SDK to API 26\n- Updated window defaults to always enable depth and stencil buffers\n- Updated window defaults to use a 32-bit (instead of 16-bit) backbuffer\n- Removed `lime.graphics.Renderer`, functionality moved to `Window`\n- Removed `lime.app.Config`, moved `app.frameRate` to `Window`\n- Removed `lime.graphics.format.*`, functionality moved to `image.encode`\n- Removed `lime.utils.compress.*`, functionality moved to `lime.utils.Bytes`\n- Removed `lime.ui.Mouse`, functionality moved to `Window`\n- Renamed `lime.app.Preloader` to `lime.utils.Preloader`\n- Removed `lime.text.TextLayout`, replaced with native Harfbuzz bindings\n- Moved `lime.project` types into `lime.tools`\n- Moved `lime.utils.GLUtils` functionality to `GLProgram` and `GLShader`\n- Added new `lime.graphics.RenderContext` with more lightweight API bindings\n- Divided OpenGL support into separate `OPENGL`, `OPENGLES` and `WEBGL` types\n- Compatibility APIs are provided in one direction (GL -> GLES -> WebGL)\n- Added `lime.ui.WindowAttributes` with broader context creation control\n- Sub-classing `Application` now requires no `window` argument for most methods\n- Multi-window applications should listen to `app.onWindowCreate` instead\n- Added support for Haxe Eval target, and beta support for HashLink (on dev)\n- Added Windows 64-bit support, Android ARM64 support, progress on WinRT support\n- Added bindings for the Harfbuzz native text layout library\n- Added `lime.ui.MouseButton` and `lime.ui.MouseWheelMode`\n- Added MojoAL support (as an alternative to OpenAL-Soft) in dev builds\n- Added cURL Multi support\n- Added support for `<config:air languages=\"\" />`\n- Exposed `window.stage` and `window.element` on Flash/HTML5 targets\n- Improved native build times by not relying on macros for CFFI\n- Improved mouse event bindings, improved consistency of mouse wheel behavior\n- Improved HTML5 fullscreen exit to dispatch a restore, not a resize event\n- Improved `lime.math.*` classes to allow for less GC activity\n- Improved support for Electron on Linux to allow for WebGL on more drivers\n- Improved quality for HTML5 frame rate when set to lower than VSync\n- Improved `HTTPRequest` to dispatch a progress event when loading locally\n- Fixed some cases where allocation could occur during native GC\n- Fixed use of future.then when the result is an error condition\n- Fixed issues with some of the equations in `lime.math.*`\n- Fixed warning in Chrome caused by default HTML5 template\n- Fixed unnecessary AL cleanup message on exit\n- Fixed replay of existing native AudioSource sounds\n- Fixed Unicode paths on Windows when returning paths from the system\n- Fixed pasting Clipboard data when application first launches\n- Fixed webfont loading on mobile Safari\n- Fixed issue with AL.source3i types\n- Fixed support for iOS entitlements paths that include spaces\n\n6.4.0 (06/01/2018)\n------------------\n\n- Updated NPM dependency to `file-saver` from `file-saverjs`\n- Updated Android ARMv7 builds to use `armeabi-v7a` instead of `armeabi-v7`\n- Added (Beta) support for `electron` (`html5 -electron`) target\n- Added `window.onExpose` event (useful when not rendering every frame)\n- Added `raspberrypi` or `rpi` as a target alias\n- Improved `Locale` to better handle `en_US-en` style strings\n- Improved handling of iOS locale values\n- Improved support for current Xcode versions by using an `.entitlements` file\n- Improved support for mouse \"release outside\" behavior on HTML5\n- Improved support for current Raspberry Pi OpenGL/EGL libraries\n- Improved Android Gradle template to include Maven for native extensions\n- Improved error handling when a library handler does not execute properly\n- Fixed crash in `ObjectPool` when setting initial size\n- Fixed setting `powerOfTwo = true` for an `ImageBuffer` with a canvas source\n- Fixed SWF font generation to limit kerning values to the SWF spec maximum\n- Fixed some cases where `HOME` environment variable might return `null`\n\n6.3.1 (05/11/2018)\n------------------\n\n- Improved support for \\*.bundle libraries within an asset folder\n- Improved the output of `lime help`\n- Fixed the behavior of `<define />` to behave like `<haxedef />` + `<set />`\n\n6.3.0 (05/04/2018)\n------------------\n\n- Updated SDL to 2.0.8\n- Updated howler.js to 2.0.9\n- Updated Android NDK platform to a minimum of API 14\n- Updated macOS minimum support version to 10.9\n- Added support for `-D foo` in addition to `-Dfoo`\n- Added support for `--` in addition to `-args` for runtime arguments\n- Added catching of key/value runtime arguments as `window.config.parameters`\n- Added support for `--window-` flags at runtime on Lime applications\n- Added a workaround to fix memory leaks in Apple's OpenAL implementation\n- Added initial HTML5 accelerometer sensor support\n- Added support for exporting multiple iOS IPA types when using `lime deploy`\n- Added `ENHANCED` profile to AIR extern types\n- Improved the behavior of `lime setup`\n- Improved the output of `lime help`\n- Improved failed sound loading on HTML5 to print a runtime warning\n- Improved support for multiple threads in OpenAL, Cairo and cURL GC\n- Improved the generation of webfonts to ignore non-essential formats\n- Improved behavior when calling closure compiler to minify JS\n- Improved `openfl.Vector` to typed array conversion to support OpenFL 8\n- Improved `Assets.getPath` to return the first path if using a path group\n- Improved support for `KHR_debug` in OpenGL\n- Improved handling of errors within OpenAL generation of sources and buffers\n- Improved window focus mouse clicks to still fire an event\n- Improvde handling of disposed native `AudioSource` objects\n- Improved support for opening files with spaces in the path\n- Improved the Gradle template to use jcenter instead of maven for dependencies\n- Fixed detection of font family names on some Android 4.x devices\n- Fixed support for `-dce full` with `embed=true` assets on native\n- Fixed a small memory leak in Zlib compress\n- Fixed a small memory leak when using cURL request headers\n- Fixed a small memory leak in `gamepad.guid`\n- Fixed support for a software fallback when GL support is too old\n- Fixed a regression in support for static desktop builds\n- Fixed a possible garbage collection issue in cURL support\n- Fixed calling `UTF8String.substr()` internally without a length field\n- Fixed request of keyboard input on WebKit when in fullscreen\n- Fixed a possible issue when building on macOS with spaces in the Lime directory\n- Fixed the behavior of `embed=\"false\"` assets on HTML5\n- Fixed a possible race condition in `-Dsimulate-preloader` on Flash target\n- Fixed support for additional iOS icon sizes\n- Fixed fullscreen text input on WebKit browsers\n- Fixed an issue using `Image.fromBase64` in ES6/NPM-based builds\n- Fixed disabling of vsync on native targets when not desired\n\n6.2.0 (02/16/2018)\n------------------\n\n- Added new implementation of `Font.renderGlyphs` for native platforms\n- Added generation of font metrics for embedded HTML5 fonts\n- Improved support for ANGLE builds on Windows\n- Improved accuracy of file seeking in streaming OGG Vorbis sounds on native\n- Fixed regression in `renderer.readPixels` when using an OpenGL renderer\n- Fixed addition of an empty character when using arrow keys on HTML5 text input\n- Fixed fallback for OpenGL ES 2.0 on older iOS devices when 3.0 is not available\n- Fixed using environment variables to define the path to the Emscripten SDK\n- Fixed letting the user focus outside a Lime embed when text input is enabled\n- Fixed `FileDialog.save` to require FileSaver.js when using CommonJS\n\n6.1.0 (02/07/2018)\n------------------\n\n- Added OpenGL ES 3.0 support on iOS\n- Added `System.deviceVendor` and `System.deviceModel`\n- Added `System.platformLabel`, `.platformName` and `.platformVersion`\n- Added support for `<config:html5 dependency-path=\"lib\" />`\n- Added support for `<config:air sdk-version=\"25.0\" />`\n- Improved garbage collection behavior in `lime.net.curl.CURL`\n- Improved performance when requesting static `System` values repeatedly\n- Improved Xcode template for iPhone X and Xcode 9.2\n- Renamed `-Dmodular` to `-Dlime-modular` (to allow for using lib modular)\n- Fixed a possible crash in `ImageDataUtil.gaussianBlur`\n- Fixed an iOS template path for \"haxe/Build.hxml\"\n- Fixed an issue when setting volume in HTML5 before playback starts\n- Fixed default framebuffer binding when using iOS simulator\n- Fixed support for properly detecting MP3 format in some files\n- Fixed support for builds on macOS/Linux when `$HOME` variable is not present\n- Fixed crash in continuous-testing when no window can be initialized\n\n6.0.1 (01/16/2018)\n------------------\n\n- Minor fix for `haxelib run openfl setup` command-line alias installation\n\n6.0.0 (01/15/2018)\n------------------\n\n- Added `-watch` for simple \\*.hx file watching support on commands\n- Added support for OpenAL effects extension where available\n- Added support for forcing a WebGL 1 context at runtime\n- Added support for defining an HTML5 DOM renderer at runtime\n- Added support for automatic iOS device provisioning and registration\n- Added improved support for CommonJS output\n- Improved support for the `haxe-modular` library\n- Improved support for haxelibs that define `classPath` in haxelib.json\n- Improved performance of `image.copyPixels` on HTML5 when image is not a canvas\n- Improved use of external libraries when using CommonJS\n- Improved the quality of locale values returned on Windows\n- Improved handling of null responses in `HTTPRequest`\n- Improved `ObjectPool` to not use generics on HTML5 for better file size\n- Fixed issues preventing compilation of tools for Node.js\n- Fixed use of `rootPath` when loading packed asset libraries\n- Fixed launch image sizes for iPhone X\n- Fixed support for `-Dnocffi` when compiling CLI tools\n- Fixed a possible range error in `DataPointer`\n- Fixed a minor debug message when HXCPP \"std\" is statically linked\n\n5.9.1 (11/30/2017)\n------------------\n\n- Updated howler.js with minor fixes for IE11 and Firefox browsers\n\n5.9.0 (11/29/2017)\n------------------\n\n- Added support for {{variable}} substitution in template file/folder names\n- Added support for packed asset libraries, with optional compression\n- Added initial support for Adobe native extensions (ANE) for AIR\n- Added `-Dlime-default-timeout` to override the default HTTPRequest timeout\n- Added a prompt for keystore password on Android if no password is provided\n- Added a hint to request a discrete GPU on dual-GPU Windows systems\n- Added a general \"ios/template\" template path for copying additional files\n- Added ability to export iOS `-archive` on build\n- Added ability to `lime deploy ios` and output IPA for store or ad-hoc\n- Improved `-verbose` to be ignored by default on `lime display` for IDEs\n- Improved iOS launch image list to support iPhone X fullscreen resolution\n- Improved CSS font generation to skip formats that are not able to convert\n- Improved the behavior of `<window resizable=\"false\" />` on HTML5\n- Fixed handling of HTTP status 0 as an error when not running on Tizen HTML5\n- Fixed an issue with `ContextMenuItem`/`NativeContextMenuItem` for Flash/AIR\n- Fixed the AIR target install folder if `<meta company=\"\" />` is empty\n- Fixed reference to the `EMSCRIPTEN_SDK` when targeting Emscripten/WebAssembly\n- Fixed an issue with double playing of sound on Firefox using howler.js\n- Fixed a possible error in some web browsers when reloading the current page\n- Fixed handling of the newer iOS simulator and file extensions for AIR builds\n- Fixed return to Android fullscreen when dismissing an on-screen keyboard\n- Fixed a minor naming issue when using newer HXCPP and MSVC for static builds\n- Fixed setting of \"ios\" and \"android\" project values when using AIR iOS/Android\n- Fixed handling of Haxe version output with newer Haxe development build\n\n5.8.2 (11/10/2017)\n------------------\n\n- Updated cURL to 7.56.1 and changed SSL library from axTLS to mbedTLS\n- Updated howler.js to 2.0.5, FileSaver.js to 1.3.3\n- Added `-Dcurl-verbose` for additional cURL debug info in native `HTTPRequest`\n- Improved support for `<window color-depth=\"32\" />` on HTML5 target\n- Improved `renderer.readPixels` on native platforms to allow transparency\n- Fixed the behavior of `<asset path=\"Assets\" library=\"default\" />`\n\n5.8.1 (11/06/2017)\n------------------\n\n- Added support for `AudioBuffer.fromBytes` on HTML5\n- Added initial support for `fileDialog.save` on HTML5 (using FileSaver.js)\n- Added initial support for native extensions on the Adobe AIR target\n- Improved the behavior of missing webfonts to no longer crash a web application\n- Improved `window.onClose` to be cancelable on HTML5\n- Improved tools to print warning for unrecognized `<asset type=\"\" />` values\n- Fixed support for Adobe AIR where `nativeWindow` is `null`\n\n5.8.0 (10/24/2017)\n------------------\n\n- Added `httpRequest.withCredentials` for sending cookies with web requests\n- Added initial support for `Touch.onCancel` events\n- Restored `false` as the default `httpRequest.enableResponseHeaders` value\n- Improved image loading to better support progress events on some browsers\n- Improved support for `HTTPRequest` headers on native platforms\n- Improved the handling of `lime.utils.Log` output on web browsers\n- Improved `lime.utils.ObjectPool` to allow abstract types\n- Improved AIR builds to support the `<certificate />` tag for signing\n- Improved the default window size for AIR output for mobile platforms\n- Improved AIR template to respect `<window allow-high-dpi=\"\" />` for iOS\n- Improved AIR template to support additional icon sizes for mobile\n- Fixed the behavior of tailing the `trace` log on Windows/Flash target\n- Fixed HTML5 \"same origin\" calculation for CORS requests\n- Fixed return to Android fullscreen after losing window focus\n- Fixed support for `ANDROID_GRADLE_TASK` with command-line arguments\n- Fixed support for relative provisioning profile paths for AIR target\n\n5.7.1 (10/12/2017)\n------------------\n\n- Updated default `MACOSX_DEPLOYMENT_TARGET` on macOS to 10.7\n- Improved native `HTTPRequest` to complete as error if response status is error\n- Fixed `HTTPRequest` to treat HTTP status code 400 as an error\n\n5.7.0 (10/10/2017)\n------------------\n\n- Updated Freetype to 2.7.1, compiled with Harfbuzz/PNG support enabled\n- Added initial Adobe AIR backend support for multiple windows, alerts, etc\n- Added `threadPool.onRun` to be notified when work is about to be run\n- Added `ModuleHelper.addModuleSource` to improve JS modules from HXP projects\n- Added initial Dockerfile script\n- Added a polyfill for `performance.now()` to restore iPhone 4 HTML5 support\n- Improved Raspberry Pi support by adding \"Escape\" as a default key to exit\n- Improved support for non-premultiplied alpha in `imageDataUtil.gaussianBlur`\n- Improved native `HTTPRequest` to size bytes initially based on Content-Length\n- Improved support for Xcode 9.1\n- Improved support for combined characters in `TextLayout`\n- Fixed setting of `MACOSX_DEPLOYMENT_TARGET` on macOS\n- Fixed support for resolving iOS provisioning profiles for AIR/iOS on Windows\n- Fixed the addition of the HTML5 default cache break string for assets\n- Fixed default asset type assignment for files with upper-case file extensions\n- Fixed support for Raspberry Pi\n- Fixed `threadPool.onProgress` to dispatch in the proper foreground thread\n- Fixed native `HTTPRequest` to calculate timeout from when requests run\n\n5.6.0 (09/26/2017)\n------------------\n\n- Added `lime.system.FileWatcher` for notifications of file events\n- Added support for color output on the Windows 10 standard command prompt\n- Added support for `lime config NAME VALUE` to add/set config values\n- Added initial template support for `lime test winjs` for HTML5/UWP support\n- Updated haxe.io.Bytes to match current official version\n- Improved key events to always set the key modifier on alt/ctrl/shift key press\n- Improved support for Adobe AIR iOS and Android builds\n- Improved Android builds to minimize to background on back button and not exit\n- Improved Linux target to build without HXCPP liblinuxcompat.a\n- Improved support for setting `-dce` on the command-line\n- Fixed support for setting `--window-minimized`, maximized and hidden using CLI\n- Fixed escaping of spaces in Windows paths\n- Fixed the behavior of `image.copyPixels` using an alpha image\n- Fixed the class path order when embedding Flash assets in certain conditions\n- Fixed support for Tizen HTML5 applications\n- Fixed progress event update on HTML5 HTTPRequest uploads\n- Fixed `ImageHelper.resizeImage` to properly handle null parameters\n\n5.5.0 (09/12/2017)\n------------------\n\n- Added an instance-based API for cURL (such as `new CURL ()`)\n- Added `<config:ios non-exempt-encryption=\"true\" />` setting value\n- Added generation of source map when minifying HTML5 on debug\n- Deprecated `lime.net.curl.CURLEasy` in favor of `CURL`\n- Updated tinyfiledialogs to 2.9.3\n- Updated bundled Google Closure Compiler to v20170806\n- Improved the functionality of `System.endianness`\n- Improved Adobe AIR `deploy` command to generate a \\*.bundle file\n- Improved the behavior of native HTTPRequest for better memory management\n- Fixed endianness issues in `image.setPixels`\n- Fixed support for `image.copyPixels` using alpha image and offset point\n- Fixed support for newer HXCPP, including dynamic libs only on Haxe 3.2.1\n- Fixed ability to exclude default architectures on builds\n- Fixed support for `<window fullscreen=\"false\" />` on Android\n- Fixed minor issues caused by detecting some AWD files as text\n\n5.4.0 (08/25/2017)\n------------------\n\n- Added tooling for Adobe AIR (`lime test air`, `lime test windows -air`, etc)\n- Added externs for Adobe AIR classes and types\n- Added `<haxelib repository=\"\" />` for choosing a custom haxelib repository path\n- Added OpenGL ES 3 API support (currently enabled on Linux and Emscripten)\n- Added support for setting `HAXELIB_PATH` environment variable in projects\n- Changed the output directory to not include the build type by default\n- Improved HTML5 to default images to canvas, not a typed array\n- Improved HXP to handle `-nocolor`, `-verbose` and other compile flags\n- Improved HXP to be able to update environment variables for build process\n- Fixed tvOS target to use `<config:tvos provisioning-profile=\"\" />`\n- Fixed Android builds when using an Android SDK older than API 23\n- Fixed an issue when running command-line tools from a root directory\n- Fixed UTF-8 `charCodeAt` when index is out of range\n- Fixed the `strength` property of `ImageDataUtils.gaussianBlur`\n\n5.3.0 (07/31/2017)\n------------------\n\n- Added support for WebAssembly (`emscripten -webassembly` or `-wasm`)\n- Added `lime -version` for simpler Lime version output\n- Added `@:compiler` to add extra compiler arguments to HXP projects\n- Updated howler.js to 2.0.4, plus an additional Firefox WebAudio patch\n- Improved support for using Lime in local .haxelib directories\n- Improved detection of default asset type in command-line tools\n- Improved support for HTML5 -Dmodular builds\n- Improved handling of error messages from howler.js\n- Fixed support for asset libraries in Emscripten/WebAssembly target\n- Fixed `lime create extension` to preserve `ANDROID_GRADLE_PLUGIN` variable\n- Fixed support for preloading fonts on Safari\n\n5.2.1 (06/21/2017)\n------------------\n\n- Improved HTTPRequest with default \"Content-Type\" headers when sending data\n- Fixed case where HTML5 could preload sounds twice, unintentionally\n- Fixed support for compiling HTML5 -Dmodular builds\n\n5.2.0 (06/20/2017)\n------------------\n\n- Added ability to override the target output directory\n- Added `Assets.hasLibrary` to check if a given library is registered\n- Improved webfonts to cache upon generation and not save in asset directory\n- Updated JavaScript timers to use `performance.now()` instead of `new Date()`\n- Fixed support for *.bundle directories which include \"include.xml\"\n- Fixed `AssetLibrary` to preload non-embedded assets if set to preload\n- Fixed an issue when converting non-String values to `UTF8String`\n- Fixed an issue with Node http-server resolving properly to localhost\n- Fixed support for `lime test linux -32` on 64-bit systems\n\n5.1.0 (06/07/2017)\n------------------\n\n- Added `lime.text.UTF8String` with unifill for handling UTF-8 text\n- Added support for `Clipboard.onUpdate` on native and HTML5\n- Added initial support for HTML5 fullscreen\n- Added initial support for `window.setIcon` and `window.title` on HTML5\n- Added support for 32-bit GL color depth on native platforms\n- Added support for making 64-bit Windows builds\n- Added support for automatically detecting latest Android build tools\n- Added support for setting `<config:android build-tools-version=\"\" />`\n- Added support for `<config:ios allow-insecure-http=\"\" />`\n- Added support for `<config:android gradle-build-directory=\"\" />`\n- Updated Node http-server to version 0.10.0\n- Improved handling of crossOrigin requests on HTML5 for same-origin\n- Improved the accuracy of `image.copyPixels` when using alpha image\n- Improved performance of ObjectPool when constantly recycling objects\n- Improved `image.setPixels` to accept bytes and offset\n- Improved performance of creating a new Image with no fill color\n- Fixed issue with OpenAL GC\n- Fixed loading of some WAV files\n- Fixed minor issues in using output of `lime display` for code completion\n- Fixed semi-transparent fillRect on canvas-based Image\n- Fixed minor issues with cURL\n\n5.0.3 (05/24/2017)\n------------------\n\n- Reverted inclusion of custom haxelib build in Lime tools\n- Support for wildcard versioning requires a compatible install of haxelib\n- Added support for optional runtime overriding of haxelib script\n- Improved handling of haxelib errors during HXML generation\n- Fixed support for uploading larger byte objects using HTTPRequest\n- Fixed support for config.rootPath\n\n5.0.2 (05/22/2017)\n------------------\n\n- Improved support for finding versioned haxelib path when using haxelib git\n\n5.0.1 (05/22/2017)\n------------------\n\n- Fixed an issue with PathHelper.getHaxelib outside of Lime tools\n- Fixed regressions in haxelib path resolution\n\n5.0.0 (05/19/2017)\n------------------\n\n- Updated the OpenGL bindings for better performance on HTML5\n- WebGL-specific signatures are now available using \"WEBGL\" suffix\n- Added support for wildcard haxelib versions (such as \"1.0.\\*\")\n- Added a new joystick.onTrackballMove with both x and y values\n- Added support for ThreadPool when there is no Application instance\n- Added haxelib to Lime tools to support path resolution fixes\n- Added ProjectXMLParser.fromFile for consistency\n- Updated default SWF version to 17 to prevent common compile issues\n- Removed deprecated config.assetsPrefix (use config.rootPath)\n- Improved support for HXP projects on Windows\n- Improved performance of image.copyPixels\n- Improved the `lime create extension <name>` template\n- Improved the behavior of Flash Player logging on Linux\n- Improved memory use in Matrix4 and TextLayout\n- Improved render event to allow canceling (avoids a screen flip)\n- Improved `lime setup` to quiet the \"no setup required\" message\n- Fixed dead-code-elimination with OpenGL extension classes\n- Fixed support for >, <, >=, <= and == in XML \"unless\" attribute\n- Fixed complete exit on Android when using the back button\n\n4.1.0 (05/04/2017)\n------------------\n\n- Updated SDL to latest development version\n- Updated Freetype to 2.7.1\n- Updated Harfbuzz to 1.4.6\n- Updated Howler.js to 2.0.3\n- Added window.alwaysOnTop, with initial support on Windows and Linux\n- Added WebP compatibility on HTML5, improved file format detection\n- Added EXT_texture_compression_s3tc to GL extensions\n- Added ability to specify architecture when performing iOS simulator builds\n- Removed deprecated HTML meta for Google Chrome Frame\n- Improved macro compile performance\n- Improved asset manifests to embed when all of their assets are embedded\n- Improved the web template for Flash for better relative URL resolution\n- Improved support for OpenGL extensions when dead-code-elimination is enabled\n- Improved the suspend/resume behavior on Android\n- Improved System.endianness to return BIG_ENDIAN on Flash Player\n- Improved file copying in tools to not copy templates that have not changed\n- Improved Cairo bindings to return the same object reference when possible\n- Improved OpenAL bindings to return the same object reference when possible\n- Fixed an issue with exiting fullscreen on HTML5\n- Fixed an issue with escaped paths when generating Neko executables\n- Fixed possible cases where paths could have been escaped twice in Haxe 3.3\n- Fixed support for GL.compressedTexImage on HTML5\n- Fixed CORS exception on HTML5 if there is no content-type header\n- Fixed static initialization order of core lime.system.CFFI methods\n- Fixed a dead-code-elimination issue in NativeHTTPRequest\n- Fixed the Android Gradle Plugin setting in the Lime extension template\n\n4.0.3 (03/28/2017)\n------------------\n\n- Added support for GL EXT_packed_depth_stencil\n- Improved safety around DataPointer when performing arithmetic\n- Improved Image.loadFromBytes when bytes are not a known image type\n- Improved the performance of Image.fillRect in some cases\n\n4.0.2 (03/21/2017)\n------------------\n\n- Added an internal transfer queue for limiting simultaneous HTML5 requests\n- Added an internal thread pool for limiting simultaneous native HTTPRequests\n- Fixed compilation support with newer Haxe releases on Raspberry Pi\n- Fixed the default \"end\" argument value of ArrayBufferView subarray\n- Fixed a performance regression in WebGL support\n- Fixed native HTTPRequest so that it always returns on the correct thread\n- Fixed path resolution to APK-based assets using HTTPRequest on Android\n- Fixed \"unused pattern\" warning caused by duplicate constant in GL bindings\n- Fixed a mismatch between intptr_t and uintptr_t (affecting Android)\n- Fixed several Window properties when creating a new window without a config\n\n4.0.1 (03/17/2017)\n------------------\n\n- Improved error message when an asset library is not found\n- Improved generated code performance when using ArrayBufferView\n- Fixed some issues with incorrect OpenGL garbage collection\n- Fixed AssetLibrary loadText to use text (not binary) loading on HTML5\n- Fixed support `<library />` tag without using a \"path\" attribute\n- Fixed premature loading of `embed=\"false\"` assets on HTML5\n- Fixed missing bufferData API in WebGLContext\n- Fixed OpenGL bindings to return null OpenGL objects if an ID is zero\n\n4.0.0 (03/15/2017)\n------------------\n\n- Added support for WebGL 2 APIs on HTML5\n- Recreated GL bindings in preparation for GLES3 support\n- Added support for running different Lime tools to match project version\n- Added WebGL, WebGL 2, GLES 2 and GLES 3 abstracts\n- Added initial support for WebGL/GLES2 extension constants\n- Added GL context, type and version properties\n- Added window.displayMode for full-screen display mode switching\n- Added lime.utils.DataPointer for managing native pointers\n- Added lime.utils.BytePointer for Bytes + offset without a new typed array\n- Added lime.utils.ObjectPool as a convenience API for object pooling\n- Added support for `<assets path=\"\" library=\"\" />` for library packing\n- Added support for loading \\*.bundle directories as asset libraries\n- Added support for `${meta.title}` and other project data in project.xml\n- Added support for Cairo textPath\n- Added support for multiple Lime embeds, rewrote HTML5 embed code\n- Added asset type to verbose Preloader messages\n- Added `-Dwebgl1` to use a WebGL 1 context instead of WebGL 2 on HTML5\n- Removed deprecated behaviors from Lime 3\n- Updated Gamepad mappings to support additional models\n- Updated HTML5 window to dispatch resize event if parent element is resized\n- Improved support for deferred loading of asset libraries\n- Improved Asset error events, updated to throw errors when assets not found\n- Improved handling of GL context loss on WebGL\n- Improved behavior of asset manifests included as assets of another library\n- Improved behavior of path groups for audioBuffer assets\n- Improved error message if ANDROID_SDK or ANDROID_NDK_ROOT is not defined\n- Fixed caching for HTML5 cache groups\n- Fixed native HTTPRequest if file is not found or uses ~/ for home directory\n- Fixed copying of files when a directory exists of the same name\n- Fixed dispatch of Renderer.onRender when there is no context\n- Fixed dispatch of Renderer.onContextLost on native platforms\n- Fixed use of image.threshold when source is canvas or HTML5 image\n- Fixed missing warning if `<icon path=\"\" />` is null\n- Fixed `<app path=\"\" />` to be relative to include.xml path\n- Fixed `<splashScreen path=\"\" />` to be relative to include.xml path\n- Fixed case where assets could be processed as templates\n- Fixed support for ATF textures on Flash target\n- Fixed ID value for Joystick/Gamepad guid property\n- Fixed double dispatch of preloader complete verbose message\n- Fixed path of `-options` parameter when calling HXCPP\n\n3.7.4 (02/15/2017)\n------------------\n\n- Improved AudioBuffer/Font/Image/Sound.loadFromFile to support URLs\n- Deprecated AudioBuffer.fromURL and onload/onerror callbacks\n- Added verbose log messages during asset library preload\n- Fixed crash on iOS when rewinding or looping sounds\n\n3.7.3 (02/13/2017)\n------------------\n\n- Improved support for Raspberry Pi\n- Improved configuration for Gradle version on Android builds\n- Fixed a crash in VorbisFile.fromBytes\n- Fixed httpRequest.timeout to timeout only on opening a connection\n- Fixed setting of system clipboard when using Clipboard.text on HTML5\n- Fixed Assets.getBytes for cached text assets\n- Fixed the final progress value when using -Dsimulate-preloader\n- Fixed valid image check when returning cached image assets\n- Fixed a minor memory leak in System application directories\n- Fixed filters and default file name in FileDialog\n- Fixed AudioBuffer.loadFromFile on native for remote assets\n\n3.7.2 (01/26/2017)\n------------------\n\n- Reverted high-DPI HTML5 mouse scale change\n- Improved the DPI values returned from display.dpi\n- Fixed \"Update to Recommended Settings\" message on Xcode 8.2\n\n3.7.1 (01/25/2017)\n------------------\n\n- Improved output of Flash Player log output\n- Fixed minor issues with Flash Player preload logic\n- Fixed use of AudioBuffer in multiple native AudioSource instances\n\n3.7.0 (01/24/2017)\n------------------\n\n- Added `<define />` (implies `<set />` and `<haxedef />`)\n- Added `<dependency force-load=\"\" />` (will default to false in Lime 4)\n- Added `-Dsimulate-preloader=3000` for simulating preload progress\n- Improved Image.loadFromBase64/loadFromBytes/loadFromFile on HTML5\n- Improved Image.loadFromBytes/loadFromFile support on Flash target\n- Improved support for \"library.json\" files that are not embedded\n- Improved support for browsers that do not have context.isPointInPath\n- Improved `lime setup linux` command for some newer environments\n- Improved caching behavior of text assets in AssetLibrary\n- Improved seeking behavior for AudioSource on native targets\n- Improved preload behavior on Flash target\n- Fixed metadata-based font embedding for Flash Player\n- Fixed issues with Windows paths when building tools with Haxe 3.4\n- Fixed preloading of fonts similar to default sans-serif on HTML5\n- Fixed base path for assets loaded from non-default asset libraries\n- Fixed scale of mouse events dispatched for high-DPI HTML5 windows\n\n3.6.2 (01/20/2017)\n------------------\n\n- Improved error when making a directory on an unavailable drive letter\n- Fixed regression in support for HTML5 font preloading\n- Fixed possible font overflow when embedding fonts on Flash target\n- Fixed crash on Neko when using AudioSource with no AudioBuffer\n\n3.6.1 (01/18/2017)\n------------------\n\n- Added streaming audio support to AudioSource\n- Fixed issues in bytesLoaded/bytesTotal calculation\n- Fixed a regression in support for static-linking\n- Fixed a regression in support for lime.utils.JNI\n\n3.6.0 (01/16/2017)\n------------------\n\n- Moved \"lime.audio\" to \"lime.media\"\n- Added Vorbis bindings under \"lime.media.codecs.vorbis\"\n- Added lime.ui.ScanCode, with conversion support to/from KeyCode on native\n- Added tool support for the \"--no-output\" argument\n- Migrated from NFD to tinyfiledialogs for better dialog support\n- Made window.close cancelable on desktop platforms\n- Updated libjpeg to 9b\n- Updated howler.js to 2.0.2\n- Improved support for Haxe 3.4\n- Improved support for progress events while preloading\n- Fixed force install when deploying to Android (API 16+ devices)\n- Fixed an invalid state when returning from background on Android\n- Fixed playback of a single audio buffer multiple times on HTML5\n- Fixed initial volume level in AudioSource on HTML5\n- Fixed a regression in the default architecture list for iOS\n- Fixed merging of multiple `<architecture />` tags in project files\n- Fixed a possible crash when retrieving OpenGL strings\n- Fixed the default template for HTML5 when multiple projects are embedded\n- Fixed support for non-preloaded assets on HTML5\n- Fixed support for image.copyChannel on HTML5 when using WebGL\n- Fixed support for command-line arguments with \"lime rebuild\"\n\n3.5.2 (12/19/2016)\n------------------\n\n- Fixed issues related to @:bitmap, @:file and @:sound\n- Fixed support for HTML5 font preloading\n- Fixed issue with HTTPRequest and IE 11\n- Fixed an issue when merging multiple project.config values\n- Reverted bytes changes to resolve C++ GC issues\n\n3.5.1 (12/16/2016)\n------------------\n\n- Made major changes to Assets and the behavior of asset libraries\n- Made progress on a better asset manifest system\n- Made significant improvements to the iOS project templates\n- Moved lime.Assets to lime.utils.Assets\n- Added lime.utils.AssetLibrary, lime.utils.AssetType, lime.utils.AssetManifest\n- Added static \"loadFrom\" constructors for core types\n- Improved C++ performance on debug builds, added -Dlime-debug\n- Updated CFFI bytes to better support C# target\n- Fixed the 'cannot find build target \"by\"' error with current Haxe releases\n- Fixed support for *.hxp projects\n- Fixed some compile errors when core types were used in macros\n- Fixed a minor issue with HTTPRequest on HTML5\n- Fixed Android template so READ\\_PHONE\\_STATE is not a required permission\n- Fixed support for `<haxelib name=\"\" path=\"\" />`\n- Fixed a regression with the quality of generated SVG icons\n\n3.5.0 (12/07/2016)\n------------------\n\n- Significantly improved lime.net.HTTPRequest\n- Added support for lime.system.Clipboard on HTML5\n- Added System.openURL to launch a website externally\n- Added System.openFile to open a file using a system default application\n- Added -nolaunch option for HTML5 \"test\" command\n- Added support for `<config:ios provisioning-profile=\"\" />` for iOS\n- Updated SDL to dev version to fix Linux keyboard events\n- Updated lime.app.Future with better progress events\n- Updated to initialize WebGL2 on HTML5, when available\n- Refactored certificate storage in HXProject\n- Improved the parsing and merge support for default Lime config\n- Improved the GL context in anticipation for GLES3/WebGL2 support\n- Improved HTML5 mouse events to allow canceling\n- Improved auto-build number detection to support SVN\n- Improved support for toggling window.resizable on native\n- Fixed audioBuffer.dispose for Howler.js buffers\n- Fixed use of deprecated APIs in lime.ui.Haptic implementation on iOS\n- Fixed use of deprecated APIs in accelerometer implementation on iOS\n- Fixed crash when resuming iOS applications from the background\n- Fixed crash if an asset manifest is not found and live reloading is enabled\n- Fixed handling of the default framebuffer on iOS\n- Fixed handling of \\*.jpeg file extension when making Flash builds\n- Fixed an issue in bytes handling for C#\n- Fixed the behavior of window onEnter/onLeave on DOM\n- Fixed the behavior of image.scroll\n- Fixed garbage collection for lime.audio.openal.ALSource\n- Fixed incorrect window scale calculation on the iPhone Plus\n- Fixed some standard APIs when making modular HTML5 builds\n- Fixed crash when setting window.title\n- Fixed the return value of gl.shaderInfoLog on some platforms\n- Fixed the behavior of Event.ACTIVATE when resuming on iOS\n- Fixed missing input event initially on HTML5\n\n3.4.1 (11/01/2016)\n------------------\n\n- Fixed order of Assets.registerLibrary and app.onPreloaderComplete\n- Added a workaround for HAXE_STD_PATH error on -Dmodular\n\n3.4.0 (10/31/2016)\n------------------\n\n- Moved Lime config from ~/.hxcpp_config.xml to ~/.lime/config.xml\n- Added a new \"lime config\" command to print the current config\n- Added \"lime config VARNAME\" command to print a value from the current config\n- Added initial support for modular HTML5 builds (generates separate lime.js)\n- Added support for comparisons in project XML (like ${haxe >= 3.2.1})\n- Added lime.ui.Haptic for initial support of vibrate on iOS/Android\n- Added `<log />` to project XML for info/warning/error/verbose messages\n- Added a build-time error if Haxe is less than 3.2.0\n- Added support for GIT-based meta build number value\n- Added initial high-DPI support for HTML5\n- Updated SDL to version 2.0.5\n- Improved support for Android immersive mode\n- Improved idle performance on macOS\n- Improved Gradle template to output APK filenames based on build type\n- Improved verbose messages for embedded fonts\n- Removed Neko template binaries, updated tools to use host version\n- Fixed IPHONE_VER issues with certain versions of HXCPP\n- Fixed iOS device deployment on macOS Sierra\n- Fixed iOS simulator deployment on macOS Sierra\n- Fixed node.js HTTP server support on macOS Sierra\n- Fixed duplicate symbol error on iOS\n- Fixed support for older CPUs without SSE4 instruction support\n- Fixed crash on negative seek position for HTML5 AudioSource\n- Fixed initial gain and position when playing HTML5 AudioSource sound\n- Fixed compatibility issues with current Haxe development versions\n\n3.3.0 (10/10/2016)\n-----------------\n\n- Added Future.ready and Future.result\n- Added AudioBuffer.loadFromFile and AudioBuffer.loadFromFiles\n- Added favicon support to HTML5 builds\n- Added automatic garbage collection to OpenAL bindings\n- Improved the behavior of AudioSource, added Howler.js for HTML5\n- Improved CFFI bindings to prevent early GC of bytes\n- Improved the behavior of \\*.hxp project files\n- Improved support for the C# target\n- Improved `<meta build-number=\"\" />` to allow a value of 0\n- Improved support for \"-lib lime\" from plain HXML\n- Implemented relative mouse movement events for Flash and HTML5\n- Implemented Locale support for Android\n- Updated the behavior of \"lime run\" to imply \"trace\" (unless \"-notrace\")\n- Updated Android template to allow submission to non-touchscreen devices\n- Fixed support for `<java path=\"\" />` on Android\n- Fixed the value of Assets.isLocal for certain non-embedded assets\n- Fixed an issue affecting touch events after an HTML5 build was rotated\n- Fixed use of a custom HAXELIB_PATH for iOS builds (in Xcode)\n- Fixed numpad key values in HTML5\n- Fixed C++ casting when converting openfl.Vector to Float32Array\n- Fixed support for `<window allow-high-dpi=\"true\" />`\n- Fixed Android compilation using debug\n\n3.2.1 (09/20/2016)\n------------------\n\n- Fixed an issue when GC was executed from another thread\n\n3.2.0 (09/19/2016)\n------------------\n\n- Updated to support Xcode 8 and iOS 10\n- Added lime.system.Locale\n- Added initial changes to support the C# target\n- Updated to OpenAL-Soft 1.17.2\n- Cleaned up some API paths with GC optimizations\n- Changed macOS to use OpenAL.framework, not OpenAL-Soft\n- Changed Android to use the standard OpenAL-Soft release\n- Improved suspend/resume support for Android audio\n- Improved support for `lime setup` on Linux\n- Improved CADisplayLink support for iOS\n- Improved the behavior of ColorMatrix\n- Fixed some crash issues in lime.system.System\n- Fixed setting of window.title\n- Fixed an issue with the Android NDK and debuggable=false\n- Fixed a possible crash when using multiple windows\n- Fixed the Android template for `lime create extension`\n- Corrected support for high DPI windows\n\n3.1.0 (08/29/2016)\n------------------\n\n- Switched from Ant to Gradle for Android builds\n- Added workarounds for some Haxe 3.3.0-rc1 issues\n- Added support for hidden windows on the desktop\n- Improved HTML5 mouse move by ignoring repeat events\n- Fixed issues in ArrayBuffer when values were null\n- Fixed a cross-origin issue that affected some browsers\n- Fixed support for System directories on Android\n- Fixed null fromBytes/fromImage conversion\n\n3.0.3 (07/27/2016)\n------------------\n\n- Improved \"lime test flash -web\" behavior to use HTTP server\n- Fixed an issue with Neko native byte resizing\n\n3.0.2 (07/22/2016)\n------------------\n\n- Added lime.utils.compress.* Deflate, GZip, LZMA and Zlib\n- Added -Dcairo to force use of Cairo software rendering on native\n- Deprecated lime.utils.LZMA\n- Fixed issue where assets were not found on Linux\n\n3.0.1 (07/20/2016)\n------------------\n\n- Improved the exclude/include filter behavior on `<asset />` tags\n- Fixed an issue that caused Window to duplicate event dispatches\n- Fixed the name of generated folder for HTML5 output\n- Fixed support for OpenAL getSource3f\n\n3.0.0 (07/08/2016)\n------------------\n\n- Changed to different build directories for release/debug/final\n- Added support for transparent HTML5 windows\n- Added support for cairo.showGlyphs\n- Added garbage collection to the OpenGL bindings\n- Added audioSource.position for panning\n- Improved the behavior of Image when using WebGL\n- Improved the behavior of the HTML5 cache string\n- Improved the Flash target to embed unsupported audio assets\n- Improved support for integer positioning of unscaled HTML5 content\n- Updated the SVG tool using the latest SVG/OpenFL versions\n- Updated the module system to be more resilient to API changes\n- Updated the iOS plist for newer app store submission guidelines\n- Updated the HTML5 canvas to allow for premultiplied alpha\n- Integrated changes to improve tvOS support\n- Fixed issues in the Cairo bindings for improved Neko support\n- Fixed image.copyPixels when using a negative destination\n- Fixed the fillRect behavior when using alpha on native\n- Fixed an issue with PNG encoding on HTML5\n- Fixed an issue in typed arrays where offset/length were ignored\n- Fixed a crash in ExternalInterface\n- Fixed a case where displayInfo.currentMode is not active yet\n\n2.9.1 (03/28/2016)\n------------------\n\n- Added automatic support for mouse capture when dragging\n- Added initial support for `<haxelib path=\"\" \\>`\n- Added window.onDropFile, window.maximized\n- Added a missing dependency in the iOS project template\n- Added a polyfill for context.isPointInStroke (for IE support)\n- Added a flag to disable \"allow-high-dpi\" support\n- Improved support for Assets.loadBytes on Flash\n- Fixed some minor memory leaks when allocating CFFI strings\n- Fixed a rare crash in the tools when `haxelib path` does not work\n- Fixed the name suffix for Windows builds on newer HXCPP versions\n- Fixed an issue where Cairo could render text at the wrong size\n- Fixed the default company meta to be blank instead of a dummy value\n- Fixed the window position and size to update after fullscreen\n\n2.9.0 (01/22/2016)\n------------------\n\n- Updated to SDL 2.0.4\n- Updated to Cairo 1.14.6 and pixman 0.32.8\n- Changed default Android SDK version to 19 (enables immersive mode)\n- Added initial support for display.dpi\n- Added initial support for window.borderless and window.resizable\n- Added initial support for renderer.readPixels\n- Added support for image.threshold\n- Added open directory support to file dialog\n- Added support for stopping propagation of browser keyboard events\n- Added support for environment variables in if/unless conditionals\n- Added support for variable substitution in if/unless conditionals\n- Added MIPS and MIPSEL to architectures in tools\n- Improved guards against using lime.* classes with legacy\n- Improved support for the newer Android NDK\n- Improved handling of reference leaks in JNI access\n- Removed @:finalizer support, due to issues it caused\n- Fixed compatibility with HXCPP changes regarding Visual Studio 2015\n- Fixed support for window.display on scaled windows\n- Fixed a tool crash when using an unrecognized -armvX flag\n\n2.8.3 (01/02/2016)\n------------------\n\n- Improved support for the latest Android NDK\n- Improved cross-domain image loading on HTML5\n- Improved support for rebuilding and using tools without haxelib\n- Ensured that OpenAL is disabled in static builds by default\n- Fixed support for the current Haxe development build\n- Fixed the setup command to ensure all requested dependencies\n- Fixed a compile error when using `<source />` and an empty path\n- Fixed the -notrace flag (to disable \"trace\" on \"test\" commands)\n\n2.8.2 (12/16/2015)\n------------------\n\n- Enabled WebGL by default on HTML5\n- Added support for Lime event canceling\n- Added default keyboard shortcuts for toggling fullscreen\n- Added default Android back button behavior to quit\n- Added support for `<window resizable=\"false\" />` on HTML5 template\n- Changed iOS default system font path to be more generic\n- Fixed issues with OGG decoding on newer Android NDK\n- Fixed AudioSource complete event when setting currentTime or length\n- Fixed minor issue compiling Neko Windows binaries from Linux\n- Minor updates to the default Android ADB output filter\n- Updated ANGLE binaries to resolve ALT + Enter fullscreen issue\n- Fixed font paths on iOS (legacy)\n\n2.8.1 (12/09/2015)\n------------------\n\n- Disable ANGLE by default on Windows, need to do additional testing\n- Added support for optional haxelib references in XML\n- Fixed an issue with incorrect joystick IDs on connect\n\n2.8.0 (12/07/2015)\n------------------\n\n- Removed lime.utils.ByteArray in favor of Haxe (3.2+) Bytes\n- Enabled ANGLE on Windows builds by default\n- Restored compatibility with Windows XP\n- Added support for HTML5 gamepad/joystick events\n- Removed lime.net.URLLoader, added HTTPRequest as a temporary patch\n- Added cache-break support to HTML5 based on each build\n- Fixed use of 32-bit Windows builds on recent HXCPP versions\n- Fixed support for correct touch event coordinates in HTML5 fullscreen\n- Fixed importing of lime.system.JNI on platforms other than Android\n- Fixed an issue that could cause native crashes on null Vector2 values\n- Fixed embed of runtime-generate asset files\n- Fixed default font paths on new versions of iOS (legacy)\n\n2.7.0 (10/28/2015)\n------------------\n\n- Added a minimum version check for OpenGL (software fallback otherwise)\n- Improved the consistency of frame time on native platforms\n- Fixed an issue where Android applications would crash on unfound files\n- Updated the Neko template for Lime legacy builds\n\n2.6.9 (10/15/2015)\n------------------\n\n- Fixed an issue with certain predictive text keyboards on Android\n- Fixed an issue where ImageBuffer did not update after certain changes\n- Fixed a red tint that occurred on some mobile graphics\n- Fixed a crash on closing applications on OS X 10.11 due to OpenAL\n- Fixed an issue with VERIFY_HOST in the cURL bindings\n- Additional fixes for tvOS compatibility\n- Made minor template updates\n- Fixed the default virtual keyboard type on BlackBerry (legacy)\n\n2.6.8 (10/05/2015)\n------------------\n\n- Updated to a new SDL development version\n- Added window.scale, window size and mouse events are in points\n- Added Lime Joystick events (alongside Gamepad events)\n- Added JPEG and PNG encode support for HTML5\n- Improved tooling support for tvOS builds\n\n2.6.7 (10/02/2015)\n------------------\n\n- Added initial changes to support Apple tvOS\n- Added System.allowScreenTimeout to allow screensaver/sleep\n- Updated CFFI to fix \"hx_register_prim\" issue on Android\n- Improved \"lime setup linux\"\n- Fixed preload when the same asset is listed twice\n- Fixed an issue with importing lime.Assets in legacy builds\n\n2.6.6 (09/24/2015)\n------------------\n\n- Patch support for static C++ builds without use of HXCPP dev\n- Fixed a crash that could occur in Flixel 3.x\n\n2.6.5 (09/23/2015)\n------------------\n\n- Improved automatic garbage collection for native references\n- Removed Cairo reference/destroy (handled internally now)\n- Added lime.system.CFFIPointer\n- Added *.fla to default exclude asset filter\n- Disabled ENABLE_BITCODE on iOS by default\n- Fixed an issue with Image.fromBitmapData when using OpenFL\n- Fixed a minor issue with copyPixels on Firefox\n\n2.6.4 (09/21/2015)\n------------------\n\n- Changed cURL bindings to use Bytes instead of String for callbacks\n- Fixed iOS support for CFFI prime (requires HXCPP update)\n- Reverted SDL2 version to fix regression in iOS window size\n- Disabled Cairo finalizer (for now) to resolve some crash problems\n- Reduced \"unreachable code\" warnings in Firefox\n- Fixed iOS multitouch behavior (legacy)\n\n2.6.3 (09/19/2015)\n------------------\n\n- Added initial support for CFFI-based finalizer callbacks\n- Added initial accelerometer support\n- Fixed an issue with erratic mouse values on Mac\n- Fixed a minor issue with touch events\n- Updated to a newer SDL development version\n- Improved the handling of alpha when using image.setPixel\n- Updated System.exit to go to background on Android if not an error\n- Improved dirty logic with Image pixel operations\n- Added an optimization for repeated Font path lookups\n- Improved support for non-US keyboard layouts (legacy)\n\n2.6.2 (09/08/2015)\n------------------\n\n- Added support for Raspberry Pi 2\n- Added lime.app.Future/lime.app.Promise\n- Migrated asynchronous lime.Assets calls to use futures\n- Added lime.system.CFFI and a new @:cffi macro to use prime\n- Migrated Lime CFFI bindings to use new (faster) prime bindings\n- Added window.alert (taskbar flash, optional message popup)\n- Set the \"lime\" shortcut on Mac and Linux to use \"/usr/local/bin\"\n- Set the Lime tools to use optional CFFI (can run without NDLL)\n- Added -Ddisplay when running \"lime display\" to help code completion\n- Added some minor Windows XP fixes\n- Improved lime.app.Event to be more resilient to other macros\n- Fixed lime.ui.FileDialog on Mac\n- Fixed dispatch of mouse events from touch on HTML5\n- Added \"onBackPressed\" to Android extensions\n\n2.6.1 (08/26/2015)\n------------------\n\n- Added window.focus for raising and focusing windows\n- Added lime.ui.FileDialog for save/open dialogs\n- Made application renderer and window return the first of each array\n- Added renderer.type for simpler comparisons\n- Implemented AudioBuffer.fromURL for OpenFL Sound support\n- Switched to current Lime architecture when processing SVG files\n- Fixed color order in image.getColorBoundsRect\n- Fixed font embedding for HTML5\n- Fixed Cairo inFill, inStroke, inClip\n- Fixed some issues in image.copyPixels\n- Fixed missing callback in Assets.loadLibrary\n- Fixed multi-touch on iOS (legacy)\n\n2.6.0 (08/20/2015)\n------------------\n\n- Added support for multiple windows\n- Improved Lime application config for multiple windows\n- Renamed application.init to application.onWindowCreate\n- Changed many application events to include a window reference\n- Expanded touch input support, added lime.ui.Touch\n- Moved game input events from Window to Gamepad\n- Added application onPreloadProgress/onPreloadComplete events\n- Added onModuleExit events (for a clean shutdown)\n- Added additional key mappings for Flash and HTML5\n- Fixed HTML5 text input with spaces\n- Fixed event.remove\n- Fixed an issue with software-based windows\n- Fixed an unused reference in the Android template\n- Fixed \"std@module_read\" errors on Neko\n\n2.5.3 (08/13/2015)\n------------------\n\n- Ported the JNI class for Android extension support without legacy\n- Added a new Display API for information on connected screens\n- Added lime.system.Clipboard and support for System.endianness\n- Added window.display and window.setTitle\n- Merged updates to the game console render context\n- Standardized touch events to use normalized x/y coordinates\n- Standardized touch events to dispatch mouse events as well\n- Added support for unicode text input on HTML5\n- Added support for specifying the iOS simulator device type\n- Added conversion to/from UInt for Int abstracts\n- Fixed the output color order when image encoding\n- Reduced allocations when using gl.vertexAttribPointer\n- Improved font hinting when using Cairo\n- Fixed decoding support for some JPEG images\n- Fixed support for embedded assets on iOS and Android\n- Fixed a possible issue in the Flash preloader\n- Fixed passing of Haxe defines in the iOS build template\n- Fixed support for lime.utils.Log\n- Fixed support for event.has\n\n2.5.2 (07/23/2015)\n------------------\n\n- Added support for automatic software fallback on native platforms\n- Improved the behavior of image getPixel/setPixel\n- Fixed native fillRect/floodFill when using certain color values\n- Improved color conversion support for Flash\n- Fixed issue preventing Neko from reading 32-bit integers correctly\n\n2.5.1 (07/21/2015)\n------------------\n\n- Made Image properly support all PixelFormat/premultiplied types\n- Updated PixelFormat names to be more descriptive\n- Added prefix support for generated library class names\n- Fixed an issue with Assets.loadImage on HTML5\n- Fixed support for OpenAL playback using a starting offset\n\n2.5.0 (07/17/2015)\n------------------\n\n- Added guards against duplicate gamepad connect events\n- Added guards against gamepad events after a disconnect\n- Added dead zone and repeat value filtering for gamepad axis\n- Added CairoImageSurface, properly separate from CairoSurface\n- Improved HTML5 to use the project FPS setting\n- Improved asset libraries to have an \"unload\" method\n- Fixed repeated calls to Assets.load* with the same ID\n- Fixed \"lime build\" to not progress without sources\n- Fixed a regression in ByteArray.fromFile on Android\n- Fixed a bug in arrayBufferView.set\n- Quieted libpng \"known incorrect profile\" messages\n- Added a patch to allow Wii Remote detection (legacy)\n\n2.4.9 (07/13/2015)\n------------------\n\n- Added lime.system.ThreadPool\n- Added lime.utils.Log\n- Added image.scroll\n- Added event.has\n- Improved performance of Flash target logging\n- Improved \"lime upgrade\" when Git is not in the PATH\n- Improved image.clone when using canvas\n- Updated for compatibility with newer lime-samples\n- Updated to use a default icon when none is available\n- Updated Assets to use a ThreadPool for asynchronous loads\n- Updated to pass -verbose during \"run\" when in verbose mode\n- Fixed an issue when tracing null typed arrays\n- Fixed image.copyChannel when clipping is necessary\n- Fixed use of cURL basic types as Int\n- Improved support for asynchronous SSL requests (legacy)\n\n2.4.8 (07/09/2015)\n------------------\n\n- Improved lime.system.BackgroundWorker onComplete\n- Improved native bytes to guard against premature GC\n- Fixed ENABLE_BITCODE when targeting older iOS versions\n- Fixed possible double mouse events on iOS\n- Fixed embedded font support on iOS\n- Fixed \"lime rebuild ios\" with some versions of HXCPP\n- Fixed mouse middle/right/wheel events on desktop (legacy)\n\n2.4.7 (07/06/2015)\n------------------\n\n- Fixed regression in HTML5 typed array support\n\n2.4.6 (07/06/2015)\n------------------\n\n- Added lime.system.BackgroundWorker for easy threads\n- Made Assets loadImage/loadBytes asynchronous on native\n- Removed the ByteArray \\__init__ and matching CFFI functions\n- Improved the help documentation when using \"lime create\"\n- Fixed a crash that could occur when using Bytes\n- Fixed audioSource.play on native when there is no data\n- Fixed event.remove when using during an event dispatch\n- Fixed the cleanup of OpenAL when closing applications\n- Fixed a crash that could occur using cURL on Mac\n- Fixed static builds for the Mac target\n\n2.4.5 (07/02/2015)\n------------------\n\n- Changed to a new, better Haxe typed array implementation\n- Added an improved Bytes (internal) for native targets\n- Added lime.utils.LZMA for LZMA compression/decompression\n- Expanded support for gamepad devices\n- Improved desktop multitouch support\n- Exposed decodeBytes/decodeFile for PNG and JPG formats\n- Added support for header-only decoding of PNG or JPG\n- Improved support for Flash log output\n- Improved the \"update\" command to support GIT submodules\n- Restored previous rendering behavior on high-DPI Apple devices\n- Fixed support for non-embedded assets on HTML5\n- Fixed other cases in the Assets loading code on HTML5\n- Fixed imageBuffer.bitsPerPixel to default 32, not 4 (bytes)\n- Updated webgl-debug.js for use with HTML5 -Dwebgl -debug\n- Fixed a regression in middle and right click events (legacy)\n- Fixed possible file handle leaks in the audio code (legacy)\n- Added DPI-aware keyboard height for iOS (legacy)\n- Added a hack to identify the type of connected gamepads (legacy)\n- Fixed the sourceRect coordinates for blitChannel (legacy)\n- Added screen resolution width/height for BlackBerry (legacy)\n- Fixed a possible overflow in the LZMA buffer (legacy)\n\n2.4.4 (06/08/2015)\n------------------\n\n- Handle Flash traces, similar to native logging\n- Improved performance of TextLayout\n- Improved the behavior of the Android Activity class\n- Added window activate/deactivate events on mobile\n- Added retina support on Mac desktop\n- Allow --meta overrides when using `lime create project`\n- Added sleep after Android touch events for better performance\n- Improved build support for Raspberry Pi 2\n- Fixed -force_load flag on iOS builds\n- Fixed GL.clearDepth and GL.depthRange bindings\n- Fixed negative System.getTimer value on HTML5\n- Added multi-touch desktop support (legacy)\n- Improved WAV format loading (legacy)\n- Fixed iswalpha crash on BlackBerry (legacy)\n\n2.4.3 (06/01/2015)\n------------------\n\n- Improved support for embedded fonts\n- Fixed regression when embedding certain OTF fonts\n\n2.4.2 (05/30/2015)\n------------------\n\n- Improved iOS and Android build support\n- Add support for application.frameRate\n- Reduce cURL connection timeout to 30 seconds\n- Improved handling of non-transparent image buffers\n- Add cubic support to font decomposition\n- Added Cairo window resize handling\n- Added Cairo Freetype support\n- Added check to remove duplicated `<dependency />` references\n- Minor fix to image premultiply alpha\n- Minor fix to \"lime create\" command\n- Minor fix to rectangle.transform\n- Fixed Windows Neko builds when not running on Windows\n\n2.4.1 (05/13/2015)\n------------------\n\n- Improve handling of custom error types in HTML5 target\n- Guard icon helpers if PNG encoding fails\n- Fixed Emscripten rebuild\n- Fixed issue on the build server\n\n2.4.0 (05/12/2015)\n------------------\n\n- Added Cairo render context and bindings\n- Added support for software windows, using Cairo not OpenGL\n- Added text input/edit events\n- Added onEnter/onLeave events for Window mouse focus\n- Added Image getColorBoundsRect\n- Added build support for ANGLE\n- Removed prevent default for HTML5 arrow and space keys\n- Improved Image copyPixels with merge alpha\n- Fixed static build support\n- Fixed a case where fonts might not be embedded\n- Fixed occasional crash with OpenAL on Neko\n\n2.3.3 (04/21/2015)\n------------------\n\n- Added audioSource.loops, audioSource.offset, audioSource.length\n- Renamed audioSource.timeOffset to audioSource.currentTime\n- Fixed onComplete for AudioSource instances\n- Fixed support for embedded bytes on HTML5\n- Fixed support for hardware anti-aliasing on SDL2 targets\n- Fixed some loose file handles in the format decoders\n- Fixed a possible crash in copyPixels\n- Improved accuracy of URLLoader progress\n\n2.3.2 (04/15/2015)\n------------------\n\n- Improved performance of pixel-based operations in Image\n- Added support for RGBA (default) and ARGB color order\n- Added --port=123 to change the webserver port on HTML5 builds\n- Added support for Unicode Windows system paths\n- Added larger icon sizes requested by Windows 10\n- Improved functionality of BMP.encode\n- Fixed compilation on Android without Sound.java\n- Fixed support for -Doptional-cffi\n- Fixed haxe.Timer (legacy)\n\n2.3.1 (04/08/2015)\n------------------\n\n- Renamed Lime legacy to \"lime-legacy\" to support hybrid builds\n- Added -Dhybrid for using Lime 2 and Lime legacy in the same project\n- Improved support for standalone Neko builds on Linux\n- Fixed loading of OGG sounds on Android\n- Fixed Emscripten support for newer HXCPP\n- Fixed a crash using gl.texSubImage2D on Neko\n- Fixed missing System.fontsDirectory on Linux\n- Fixed crash on NULL system directories\n- Fixed crash when font or JPEG file paths are not found\n- Added softKeyboardRect support for iOS (legacy)\n\n2.3.0 (03/26/2015)\n------------------\n\n- Added initial Lime 2 support for iOS\n- Added Mouse.lock and Mouse.warp on native platforms\n- Added window.onMouseMoveRelative for use with mouse locking\n- Added System.exit\n- Added Lime 2 support for haxe.Timer\n- Changed window.onMouseMove to dispatch only (x, y)\n- Improved window width/height reporting after creation\n- Updated ios-deploy, fixed the run command for iOS\n- Fixed the ByteArray size returned from Image.getPixels\n- Fixed Flash builds for Mac and Haxe 3.2\n- Fixed js.Boot for new changes in Haxe 3.2\n- Fixed an issue in the Gamepad API\n- Fixed the ZipHelper for Haxe 3.2\n- Fixed the -Dstats define for HTML5 builds\n\n2.2.2 (03/25/2015)\n------------------\n\n- Restored support for OpenFL 2.2\n- Added System.fontsDirectory\n- Improved Font.fromFile when the file is not available\n- Improved HTTP server to allow access from other devices\n- Improved System.getTimer to work without haxe.Timer\n- Fixed a crash when using GL.bufferData with zero-length data\n\n2.2.1 (03/21/2015)\n------------------\n\n- Fixed -rebuild for 32-bit Mac/Linux with newer HXCPP\n- Fixed ImageBuffer with newer HXCPP\n- Compile fix\n\n2.2.0 (03/20/2015)\n------------------\n\n- Added formal support for fonts\n- Added formal support for complex text layout\n- Added Gamepad input support\n- Added Haxe 3.2 support\n- Added support for Window fullscreen\n- Added support for Window minimized\n- Added System directories (user, documents, etc)\n- Added the foundation for iOS support\n- Improved support for node.js\n- Improved support for Lime modules\n- Added support for embedded images and sounds\n- Changed Module init() to occur sooner\n- Implemented Assets.getBytes for Flash BitmapData\n- Fixed Assets.isLocal for Flash sound assets\n- Fixed Image and ImageBuffer clone()\n- Fixed support for HXCPP 3.2.x\n- Fixed -rebuild when using the Lime 2 desktop NDLL\n- Fixed \"lime rebuild\" when in the Lime directory\n\n2.1.3 (03/02/2015)\n------------------\n\n- Added lime.ui.KeyModifier\n- Added key modifier support to Flash and HTML5 keyboard events\n- Added support for iOS builds using HXCPP 3.2\n- Now \"create project\" creates unique package IDs instead of a common one\n- Now \"-clean\" is ignored where it does not make sense (such as \"run -clean\")\n- Changed default fullscreen for native targets to SDL_WINDOW_FULLSCREEN_DESKTOP\n- Fixed escaping for quotes and spaces in macro calls on Flash target\n- Removed Lime native dependency defines from Flash and HTML5 builds\n- Improved the behavior of shader isValid/isInvalid\n- Added a request for focus after resuming on Android\n- Fixed an IME issue that affected some Android keyboards\n- Fixed Linux setup on Arch 32-bit systems\n- Fixed an issue when building iOS projects to an absolute build path\n- Fixed issue where iOS builds may lack some defines (such as HXCPP_API_LEVEL)\n- Patched support for Assets.loadSound on Flash target\n- Fixed a null check in lime_alc_open_device\n\n2.1.2 (02/20/2015)\n------------------\n\n- Minor fixes for upcoming Haxe 3.2 release\n- Added \"lime deploy\" to zip and support upload targets\n- Added initial support for Google Drive using \"lime deploy\"\n- Added \"Options.txt\" reading for iOS builds to include -Dhxcpp_api_level\n- Changed \"lime update ios\" to only update, and not open Xcode\n- Added \"-xcode\" flag to open Xcode on iOS \"build\" or \"run\" command\n- Fixed the use of \"lime\" from Windows batch/command files\n- Improved \"haxelib path\" error message when a dependency haxelib is missing\n- Improved PathHelper.relocatePath to resolve issues with absolute paths\n- Fixed issue preventing projects from changing Flash scaleMode/align\n- Improved web font loading on HTML5 target\n- Fixed JavaScript minification that was failing on some systems\n- Fix issue with disappearing keyboards on certain Android devices\n- Fix \"isValid\" check in GLShader to check for zero\n- Set `<config:android install-location=\"auto\" />` by default\n- Request focus in resume on Android, in case an extension has focus (legacy)\n- Added TILE_BLEND_SUBTRACT (legacy)\n\n2.1.1 (02/13/2015)\n------------------\n\n- Added initial Emscripten target support\n- Fixed regression in HTML5 font asset embedding\n- Minor improvement to SWF embedding for Flash target\n\n2.1.0 (02/11/2015)\n------------------\n\n- Refactored, made many events instance-based, not static\n- Removed event managers, moved input events to Window class instances\n- Moved many Lime tool classes into the public lime.* API\n- Added initial Lime 2 support for Android\n- Added official Android X86 emulator support\n- Added support for munit unit testing suite\n- Added System.getTimer for faster delta time calculations\n- Added application.removeWindow and window.close\n- Added support for a custom asset root URL on HTML5\n- Added forced OpenAL cleanup, in case of an unclean exit\n- Fixed support for Haxe 3.2 haxelib behavior\n- Fixed createImageData issue on HTML5 for WebGL\n- Improvements to in-progress Lime text layout API\n- Improved handling of Android Debug Bridge on Linux\n- Improved handling of ANT_HOME for use with ADB\n- Fixed the output of textField.htmlText on Android (legacy)\n- Updated TextField implementation (legacy)\n- Fixed behavior of ColorMatrixFilter (legacy)\n- Fixed textField.setTextFormat with different font (legacy)\n- Fixed crash in Capabilities.language on iOS (legacy)\n\n2.0.6 (01/22/2015)\n------------------\n\n- Resolved asset embedding for Lime resources\n- Added \"js-flatten\" and \"dce full\" to HTML5 -final builds\n- Made \"-minify\" occur by default on HTML5 -final builds\n- Improved the copy behavior for assets on Android and BlackBerry\n- Improved the getDeviceSDKVersion call for Android\n- Fixed support for making typed arrays from OpenFL Vector data\n- Removed unneeded iOS CFBundleIcon references\n- Updated the default iOS deployment to version 5.1.1 for arm64\n- Updated to the latest Google Closure compiler version\n- Added a ConsoleRenderContext, to continue to grow with console efforts\n- Refactored Application, Window, Renderer and other \"backend\" classes\n- Fixed crash in BitmapData rendering (legacy)\n- Fixed rotation of TextField instances (legacy)\n\n2.0.5 (01/13/2015)\n------------------\n\n- Improved the Windows ICO generation support\n- Added support for embedded ICO resources in Windows applications\n- Added caching to improve performance when icons exist\n- Added lime.graphics.format.JPEG/PNG/BMP classes for encoding\n- Improved KeyCode so it automatically casts to/from Int\n- Improved the behavior of Android ADB management\n- Migrated to an \"Asset Catalog\" for iOS icons and launch images\n- Added missing iOS icon and launch image sizes\n- Added image.merge support for software image blending\n- Fixed the color order for Windows icon generation\n- Fixed a possible crash issue in empty Image instances\n- Fixed support for forwarding HXCPP defines on iOS builds\n- Fixed support for dead-code elimination full\n- Guarded Android API calls that require newer device versions\n- Improved lime.embed to support either a DOM object or ID string\n- Improved the behavior of BitmapData getPixels (legacy)\n- Exposed support for shifting pitch on OpenAL (legacy)\n- Fixed a crash in iOS Capabilities.language (legacy)\n- Added bitmapData.merge support (legacy)\n\n2.0.4 (12/31/2014)\n------------------\n\n- Added system mouse cursor support in lime.ui.Mouse\n- Added hide/show cursor support in lime.ui.Mouse\n- Improved the behavior of the embedded web server\n- Fixed the behavior of Image.getPixels\n- Fixed embedded font support for OpenFL HTML5\n- Fixed the Windows application icon\n- Fixed handling of dummy ANT_HOME or JAVA_HOME HXCPP values\n- Improved default context menu behavior on Flash/OpenFL\n- Improved fixed orientation support on iOS (legacy)\n\n2.0.3 (12/27/2014)\n------------------\n\n- Improved linking of OpenAL for Android\n- Added support for cached `<library />` processing\n- Fixed exit code behavior when calling HXCPP\n- Fixed minor issues with \"lime rebuild tools\"\n\n2.0.2 (12/21/2014)\n------------------\n\n- Added ARMV7S, ARM64 and X86_64 support for iOS\n- Added unofficial Java support\n- Added xxhdpi and xxxhdpi icons for Android\n- Added initial support for Android (without legacy)\n- Upgraded to a newer SDL2 release for desktop\n- Improved the behavior of Image.setPixels\n- Improved Image.fromBytes for HTML5\n- Improved Image.fillRect for HTML5\n- Fixed issue causing \"bin\" directories to appear on rebuild\n- Fixed issues with Android ADB\n- Fixed an issue with HTML5 copyPixels\n- Fixed an infinite loop when loading WAV audio\n- Fixed an infinite loop when loading WAV audio (legacy)\n- Fixed GL.getShaderPrecisionFormat (legacy)\n- Removed unnecessary iOS libraries (legacy)\n- Fixed Android x86 builds (legacy)\n- Fixed TextField leading (legacy)\n\n2.0.1 (12/04/2014)\n------------------\n\n- Added GL.isContextLost\n- Added Renderer onRenderContextLost/onRenderContextRestored\n- Improved Android device version check\n- Changed Firefox to type WEB instead of MOBILE\n- Fixed HTML5 touch event coordinates\n\n2.0.0 (11/20/2014)\n------------------\n\n- Improved the \"lime rebuild\" command\n- Added a \"-dryrun\" flag to help test the tools\n- Fixed zero width/height in lime.graphics.Image\n- Populate environment with HXCPP config defines\n- Fixed double dispatch of HTML5 mouse events\n- Improved the \"lime.embed\" JS command\n- Fixed \"lime create openfl\"\n- Made fixes to support the newer Blackberry SDK\n- Fixed GraphicsPath on Neko (legacy)\n\n2.0.0-beta (11/13/2014)\n-----------------------\n\n- Merged the Lime \"legacy\" codebase\n- Initial steps towards Lime node.js support\n- Sped up rasterization of SVG icon images\n- Sped up splash image generation\n- Improved lime.graphics.Image for some browsers\n- Added native PNG/JPG encoding\n- Improved $variable handling in project parsing\n- Other minor fixes\n\n2.0.0-alpha.8 (11/08/2014)\n--------------------------\n\n- Guarded certain CFFI calls\n- Fixed discovery of Java install on OS X\n- Omitting Android force downgrade on old devices\n\n2.0.0-alpha.7 (11/01/2014)\n--------------------------\n\n- Improved handling of haxelib library versions\n- Add patched haxe.CallStack to fix C++ stack order\n- Fix fonts to use the true font name\n- Automatically register fonts embedded in the project\n- Fixed and documented the \"-args\" tool flag\n- Added the force downgrade argument when installing on Android\n\n2.0.0-alpha.6 (10/28/2014)\n--------------------------\n\n- Added initial support for cubic bezier font outlines\n- Added better OpenFL ASCII color on Mac\n- Maybe Java optional during build process for SVG rasterizer\n- Improved \"isText\" file detection\n- Fixed loading of type BINARY files as TEXT\n\n2.0.0-alpha.5 (10/23/2014)\n--------------------------\n\n- Added patched Haxe Boot class, to fix Std.is on Safari\n- Added support for the \"openfl\" command\n- Using the proper font name when embedding in Flash\n- Improved the handling of font family name detection\n- Minor fixes\n\n2.0.0-alpha.4 (10/21/2014)\n--------------------------\n\n- Improved parsing of HXML when compiling for the Flash target\n- Improved the `<config />` data system\n- Enabled splash screen generation for iOS again\n\n2.0.0-alpha.3 (10/20/2014)\n--------------------------\n\n- Fixed handling of HXML with comments when targeting Flash\n- Added initial support for \".bundle\" asset folders\n- Added initial support for `<library path=\"\" preload=\"true\" />`\n- Passing \"-verbose\" when appropriate to library handlers\n- Improved code completion for FlashDevelop\n- Improved population of defines in project file handling\n- Fixed \"lime create extension\"\n- Improvements to `<config />` tag merging\n- Added Tilesheet TILE_RECT support (legacy)\n\n2.0.0-alpha.2 (10/16/2014)\n--------------------------\n\n- Added Lime \"legacy\" binaries for OpenFL v2 native support\n- Merged the Aether tools into Lime\n- Improved the \"lime rebuild\" command\n- Added onSaveInstanceState/onRestoreInstanceState on Android\n- Added TouchEvent handling on HTML5\n- Fixed handling of GL depth and stencil buffers\n- Fixed ImageDataUtil fillRect, copyPixels, colorTransform\n- Fixed iOS framework paths which include spaces\n- Fixed ByteArray.writeBytes when the length is zero\n- Fixed the iOS linker flags project option\n- Moved to JSON asset libraries instead of serialized ones\n- Improved handling of SWF asset embedding\n- Improved handling of HTML5 key events\n- Disabled HTML5 page scrolling using the arrow keys\n- Improved ByteArray support on HTML5\n- Fixed HTML5 mouse coordinates when letterboxing\n- Fixed \"bin\" tool paths when Lime is not included in the project\n- Many other small fixes\n- Fixed sound.length when using streaming OGG audio (legacy)\n- Added a proper shutdown for OpenAL audio (legacy)\n- Fixed null data in URLLoader on Neko (legacy)\n- Added a dead zone filter for joystick events (legacy)\n\n2.0.0-alpha (10/14/2014)\n------------------------\n\n- Created an all-new Lime API\n- The core architecture is built around Application, Window and Renderer\n- Events are similar to C# or signals/slots, and strongly-typed\n- Add support for Flash, DOM, Canvas or GL render contexts\n- Added bindings to OpenAL, as well a simple unified audio API\n- Added networking support, with bindings to cURL on native platforms\n- Added cross-target pixel image manipulation features\n- Fixed support for Xcode 6 publishing for iOS 8\n- Fixed support for BlackBerry 10.3\n- Restored support for old Android devices\n- Added support for static linking on Windows, Mac and Linux\n- Added support for externally defined platform targets\n- Improved Flash asset embedding, to handle larger projects\n- Added Firefox OS publishing using \"lime publish firefox\"\n- Made the asset library system more flexible\n- Many other tool improvements\n\n1.0.1 (06/24/2014)\n------------------\n\n- Fixed BlackBerry support\n- Fixed a memory leak when using LZMA decoding\n\n1.0.0 (05/29/2014)\n-----------------\n\n0.9.9 (05/28/2014)\n-----------------\n\n- Fixed ACTIVATE/DEACTIVATE for Windows on minimize/restore\n- Fixed Mac fullscreen handling\n- Silenced \"missing NDLL\" warning when not in -verbose mode\n- Added \"-nocolor\" option\n\n0.9.8 (05/27/2014)\n------------------\n\n- Fixed issues with Android JNI\n- Fixed a GPU texture issue on iOS\n- Fixed keyboard to only show if a TextField is type INPUT\n- Fixed support for OpenGL on Nvidia drivers for Linux\n- Fixed a bug where OpenGL textures were freed improperly\n- Improved support for reading audio file length\n- Added support for custom user agents in URL requests\n- Other minor fixes\n\n0.9.7 (04/22/2014)\n------------------\n\n- Merged Lime with NME for code collaboration\n- Fixed software rendering path\n- Fixed compile for older Android devices\n- Added OpenAL support for BlackBerry\n- Moved to C++11 by default for iOS builds\n- Added additional Android extension callbacks\n- Improved handling of Android keyboard/gamepad input\n- Confirmed support for the Amazon FireTV\n- Improved cursor visibility when switching to/from fullscreen\n- Improved support for iOS virtual text input\n- Fixed support for BWF wave files\n- Fixed color order for PNG encoding\n\n0.9.6 (03/18/2014)\n------------------\n\n- Fixed Android library instantiation order\n- Fixed Android onKeyUp event\n- Fixed volume and back keys on Android\n- Added stereoscopic 3D support on Android\n- Fixed TextField.textColor rendering\n- Improved support for key codes\n- Improved support for looping audio\n- Minor fixes\n\n0.9.5 (03/04/2014)\n------------------\n\n- Improvements to Lime wrapper\n- Fixed cURL to support larger header sizes\n- Updated the SDL2 backend to support initialization without AA if not supported\n- Added support for Android \"immersive mode\"\n- Improved default \\_sans, \\_serif and \\_typewriter font matching for Mac and iOS\n- Multiple improvements to Android JNI support\n- Added \"count\" support for drawTiles rendering\n- Optimized renderer to perform more with a single draw array\n- Improvements for anti-aliased hardware lines\n- Optimizations to tessellation algorithm\n- Added better support for pre-multiplied alpha, currently per surface\n- Memory fixes for Freetype fonts\n- Fix listing of Lime samples when running \"lime create openfl\"\n- Added proper charCode and keyCode support for Android keyboard input\n- Minor improvement to OpenAL sound\n- Multi-threading fix for Android\n- Fixed OpenGL ES 2 context support for Tizen\n- Keyboard event support on Tizen\n- Resolved rare issue when loading BitmapData from bytes\n- Minor fixes for Emscripten\n- Updated for automated builds: <http://openfl.org/builds/lime>\n\n0.9.4 (01/27/2014)\n------------------\n\n- Fixed support for 8-bit PNG images with alpha\n- Fixed software fallback for certain older cards\n\n0.9.3 (01/22/2014)\n------------------\n\n- Improved the Android extension API\n- Improved OpenAL audio panning behavior\n- Fixed crash in ColorMatrixFilter\n- Fixed GL drawArrays issue on desktop\n\n0.9.2 (12/31/2013)\n------------------\n\n- Fixed Tizen storage directory\n- Fixed support for Emscripten\n\n0.9.1 (12/18/2013)\n------------------\n\n- Lime wrapper improvements\n- Improved performance when loading OGG samples in memory\n- Added support for the Tizen emulator\n\n0.9.0 (12/10/2013)\n------------------\n\n- Added Tizen support\n- Initial wrapper implementation\n- Android JNI improvements\n- Add OpenGL context lost/restored events\n- Fixed support for Android OpenAL audio\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "How To Contribute\n=================\n\nWe welcome your feedback and input in how to make Lime better!\n\nIf you are interested in discussing new features, the direction the project or how to integrate some change, please open an issue so we can talk about.\n\n 1. Fork the repository\n \n 2. Make the desired change\n \n 3. Create a pull request\n\n\nYou may consider creating a branch specific to the fix or improvement you wish to make, in case you have more than one that has not been accepted into the project, or to allow for item-specific changes.\n\nIt is our goal to help Lime evolve as a clean, easy-to-use (but powerful) layer for cross-platform development. Thanks for being a part of making this possible!\n\n## Versioning and Branching Guidelines\n\nWe follow Semantic Versioning (semver): MAJOR.MINOR.PATCH.\n\n### Patch Updates (x.x.x)\n\nAll bug fixes should be submitted to the current stable development branch (e.g., develop).\n\nThese changes are released as patch versions (e.g., 8.2.3 → 8.2.4).\n\n### Minor Updates (x.x.0)\n\nAll new features (non-breaking) should be submitted to the next minor development branch, named x.x.x-dev.\n\nFor example, if the current version is 8.2.2, features targeting 8.3.0 should go into 8.3.0-dev.\n\n### Major Updates (x.0.0)\n\nAny breaking changes or major version updates must be submitted to the next major development branch, named x.0.0-dev.\n\nFor example, breaking changes intended for 9.0.0 go into 9.0.0-dev.\n"
  },
  {
    "path": "Dockerfile",
    "content": "ARG HAXE_VERSION=3.4.3\nARG UBUNTU_VERSION=16.04\n\nFROM haxe:${HAXE_VERSION} as haxe\n\nFROM ubuntu:${UBUNTU_VERSION}\nRUN apt-get update -yqq && apt-get install -yq \\\n\tlibgl1-mesa-dev \\\n\tlibglu1-mesa-dev \\\n\tg++ \\\n\tg++-multilib \\\n\tgcc-multilib \\\n\tlibasound2-dev \\\n\tlibx11-dev \\\n\tlibxext-dev \\\n\tlibxi-dev \\\n\tlibxrandr-dev \\\n\tlibxinerama-dev \\\n\tlibgc1c2 \\\n\tgit \\\n\tvim\n\nCOPY --from=haxe /usr/local/lib/haxe/ /usr/local/lib/haxe/\nCOPY --from=haxe /usr/local/bin/haxe* /usr/local/bin/\nCOPY --from=haxe /usr/local/bin/haxelib /usr/local/bin/\nCOPY --from=haxe /usr/local/lib/neko/ /usr/local/lib/neko/\nCOPY --from=haxe /usr/local/lib/libneko* /usr/local/lib/\nCOPY --from=haxe /usr/local/lib/libneko* /usr/lib/\nCOPY --from=haxe /usr/local/bin/neko* /usr/local/bin/\n\n# TODO: Add Android SDK, Emscripten SDK, etc\n\nRUN haxelib setup /usr/lib/haxe/lib/\nRUN haxelib install hxcpp\nRUN haxelib git format https://github.com/jgranick/format\nRUN haxelib install munit\nRUN haxelib install hxp\n\nCOPY . /opt/lime/\nCOPY templates/bin/lime.sh /usr/local/bin/lime\nRUN haxelib dev lime /opt/lime/\nRUN lime rebuild linux\nRUN lime rebuild tools\n\nRUN rm -rf /opt/lime/project/obj\n\nCMD [ \"lime\" ]"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n===========\n\nCopyright (c) 2013-2025 Joshua Granick and other Lime contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "MAINTAINERS.md",
    "content": "# Maintainer Collaboration Guidelines\n\n## Ownership Boundaries\nCore ownership includes final authority on major project direction, branding, external representation (e.g., website, GitHub org settings), and financial decisions. Project leadership roles should support this structure, not compete with it.  \nJoshua Granick remains the primary owner of OpenFL and related projects under its umbrella, including all copyrights, branding, and rights to external representations.\n\n## Commit Transparency\nAll commits — especially those involving the website or project structure — should be clearly described. Avoid vague or misleading commit messages.\n\n## No Unilateral Decisions\nSignificant changes to the public-facing site, GitHub structure, or future policies (including donation links) must be discussed with the core team before being merged.  \nHigh contribution volume does not entitle anyone to override team consensus or operate outside the established process. We value impact, but we expect humility and collaboration in return.\n\n## Respect Other Maintainers’ Work\nReverting, overwriting, or contradicting another maintainer’s contribution must go through discussion first — ideally via PR, not direct commit.\n\n## Escalation Policy\nIf collaboration issues persist after a discussion, core owners may revoke elevated roles or privileges to protect the health of the project. This isn’t personal — it’s structural.\n\n## Donations & Monetization\nAny personal monetization links (Patreon, Ko-fi, etc.) require approval by the core **owners**. We want to keep funding equitable and transparent.\n\n## Communication First\nIf you disagree with a decision or direction, bring it up in team chat or discussion threads — not by taking action in silence.\n\n## We Are a Team\nLeadership means contributing to both the codebase and the culture. If you’re not supporting both, you’re not fulfilling the role.\n"
  },
  {
    "path": "NOTICE.md",
    "content": "Notices\n=======\n\n### Lime\nCopyright (c) 2013-2025 Joshua Granick and other Lime contributors\n\nThis product bundles cairo 1.15.2, which is available under an\n\"MPL 1.1\" license. For details, see [project/lib/cairo/](project/lib).\n\nThis product bundles libcurl 7.56.1, which is available under an\n\"MIT/X derivate\" license. For details, see [project/lib/curl/](project/lib).\n\nThis product bundles efsw, which is available under an\n\"MIT\" license. For details, see [project/lib/efsw/](project/lib).\n\nThis product bundles freetype 2.9.1, which is available under an\n\"FTL\" (BSD-style) license. For details, see [project/lib/freetype/](project/lib).\n\nThis product bundles harfbuzz 1.8.8, which is available under an\n\"MIT\" license. For details, see [project/lib/harfbuzz/](project/lib).\n\nThis product bundles HashLink 1.9, which is available under an\n\"MIT\" license. For details, see [HaxeFoundation/hashlink/](https://github.com/HaxeFoundation/hashlink/blob/1.9/LICENSE).\n\nThis product bundles libjpeg 6b, which is available under a\n\"libjpeg\" (BSD-style) license. For details, see [project/lib/jpeg/](project/lib).\n\nThis product bundles libogg 1.3.0, which is available under a\n\"BSD\" license. For details, see [project/lib/ogg/](project/lib).\n\nThis product bundles LZMA SDK 4.65, which is available under\npublic domain. For details, see [project/lib/lzma/](project/lzma).\n\nThis product bundles mbedTLS 2.6.0, which is available under an\n\"Apache 2.0\" license. For details, see [project/lib/mbedtls/](project/lib).\n\nThis product bundles OpenAL-Soft 1.19.0, which is available under an\n\"LGPLv2\" license. For details, see [project/lib/openal/](project/lib).\n\n_OpenAL-Soft is only included in dynamically-linked builds, it is excluded\nfrom Lime static builds in order to preserve Lime's permissive nature._\n\nThis product bundles pixman 0.32.8, which is available under an\n\"MIT\" license. For details, see [project/lib/pixman/](project/lib).\n\nThis product bundles libpng 1.6.12, which is available under a\n\"zlib\" (BSD-style) license. For details, see [project/lib/png/](project/lib).\n\nThis product bundles SDL 2.0.12, which is available under a\n\"zlib\" (BSD-style) license. For details, see [project/lib/sdl/](project/lib).\n\nThis product bundles tinyfiledialogs 2.9.3, which is available under a\n\"zlib\" (BSD-style) license. For details, see [project/lib/tinyfiledialogs/](project/lib).\n\nThis product bundles libvorbis 1.3.3, which is available under a\n\"BSD\" license. For details, see [project/lib/vorbis/](project/lib).\n\nThis product bundles zlib 1.2.8, which is available under a\n\"zlib\" (BSD-style) license. For details, see [project/lib/zlib/](project/lib).\n\n-------\n\nModifications and source-repository versions of Haxe core files are included in the\n[haxe/](haxe/) folder, which are available under an \"MIT\" license. For details, see\nhttps://github.com/haxefoundation/haxe\n\nThe following files were developed in collaboration with the NME project,\nwhich is available under an \"MIT\" license. For details, see\nhttps://github.com/haxenme/nme\n\n    lime/utils/JNI.hx\n    project/include/utils/QuickVec.h\n    project/src/graphics/format/\n    project/src/graphics/opengl/\n    project/src/system/JNI.cpp\n    project/src/text/Font.cpp\n    project/src/utils/compress/LZMA.cpp\n    tools/utils/JavaExternGenerator.hx\n\nThe typed array implementation was developed in collaboration with Sven Bergström\nand the hxtypedarray project, which is available under an \"MIT\" license.\nFor details, see https://github.com/underscorediscovery/hxtypedarray\n\nThe unifill project is included in the [lime/text/unifill/](lime/text/unifill/) directory,\nwhich is available under an \"MIT\" license. For details, see https://github.com/mandel59/unifill\n\nlime/_internal/graphics/StackBlur.hx is adapted from original code by Mario Klingemann\nand the EaselJS project, and is available under an \"MIT\" license. For details, see\nhttp://www.quasimondo.com/StackBlurForCanvas/StackBlur.js and\nhttps://github.com/createjs/easeljs\n\n-------\n\n_The following are not embedded in Lime applications directly, but are used\nas dependencies for web-based builds. Their licensing does not affect products\ncreated with Lime._\n\nThis product bundles howler.js 2.1.1, which is available under an\n\"MIT\" license. For details, see [dependencies/howler.min.js](dependencies/howler.min.js).\n\nThis product bundles FileSaver.js 1.3.3, which is available under an\n\"MIT\" license. For details, see [dependencies/FileSaver.min.js](dependencies/FileSaver.min.js).\n\nThis product bundles pako 1.0.2, which is available under an\n\"MIT\" license. For details, see [dependencies/pako.min.js](dependencies/pako.min.js).\n\nThis product bundles LZMA-JS 2.3.2, which is available under an\n\"MIT\" license. For details, see [dependencies/lzma_worker-min.js](dependencies/lzma_worker-min.js).\n\nThis product bundles stats.js r16, which is available under an\n\"MIT\" license. For details, see [dependencies/stats.min.js](dependencies/stats.min.js).\n\nThis product bundles SWFObject 2.2, which is available under an\n\"MIT\" license. For details, see [templates/flash/templates/web/swfobject.js](templates/flash/templates/web/swfobject.js).\n\nThis product bundles webgl-debug.js 1.0.0, which is available under an\n\"MIT\" license. For details, see [dependencies/webgl-debug.min.js](dependencies/webgl-debug.min.js).\n\n-------\n\n_The following are not included in Lime applications, but are used by\nthe Lime command-line tools. Their licensing does not affect products\ncreated with Lime._\n\nThis product bundles Closure Compiler v20200315, which is available under an\n\"Apache 2.0 License\" license. For details, see https://github.com/google/closure-compiler.\n\nThis product bundles ios-deploy 1.9.0, which is available under an\n\"GPLv3\" license. For details, see https://github.com/phonegap/ios-deploy.\n\nThis product bundles node.js 0.10.26, which is available under an\n\"MIT\" license. For details, see https://github.com/joyent/node.\n\nThis product bundles http-server 0.10.0 and its dependencies, which is available under an\n\"MIT\" license. For details, see https://github.com/nodeapps/http-server.\n\nThis product bundles webify 0.1.1.0, which is available under an\n\"MIT\" license. For details, see https://github.com/ananthakumaran/webify.\n\nThis product bundles YUI Compressor 2.4.7, which is available under an\n\"MIT\" license. For details, see https://github.com/yui/yuicompressor.\n"
  },
  {
    "path": "README.md",
    "content": "[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE.md) [![Haxelib Version](https://img.shields.io/github/tag/openfl/lime.svg?style=flat&label=haxelib)](http://lib.haxe.org/p/lime) [![Build Status](https://img.shields.io/github/actions/workflow/status/openfl/lime/main.yml?branch=develop)](https://github.com/openfl/lime/actions) [![Community](https://img.shields.io/discourse/posts?color=24afc4&server=https%3A%2F%2Fcommunity.openfl.org&label=community)](https://community.openfl.org/c/lime/19) [![Discord Server](https://img.shields.io/discord/415681294446493696.svg?color=7289da)](https://discordapp.com/invite/tDgq8EE)\n\nLime\n====\n\nLime is a flexible, lightweight layer for Haxe cross-platform developers.\n\nLime supports native, Flash and HTML5 targets with unified support for:\n\n * Windowing\n * Input\n * Events\n * Audio\n * Render contexts\n * Network access\n * Assets\n\nLime does not include a renderer, but exposes the current context:\n\n * Cairo\n * Canvas\n * DOM\n * Flash\n * GL\n\nThe GL context is based upon the WebGL standard, implemented for both OpenGL and OpenGL ES as needed.\n\nLime provides a unified audio API, but also provides access to OpenAL for advanced audio on native targets.\n\n\nLicense\n=======\n\nLime is free, open-source software under the [MIT license](LICENSE.md).\n\n\nInstallation\n============\n\nFirst, install the latest version of [Haxe](http://www.haxe.org/download).\n\nThen, install Lime from Haxelib and run Lime's setup command.\n\n    haxelib install lime\n    haxelib run lime setup\n\n\nDevelopment Builds\n==================\n\nWhen there are changes, Lime is built nightly. Builds are available for download [here](https://github.com/openfl/lime/actions?query=branch%3Adevelop+is%3Asuccess).\n\nTo install a development build, use the \"haxelib local\" command:\n\n    haxelib local lime-haxelib.zip\n\n\nBuilding from Source\n====================\n\n1. Clone the Lime repository, as well as the submodules:\n\n        haxelib git lime https://github.com/openfl/lime\n\n2. Install required dependencies:\n\n        haxelib install format\n        haxelib install hxp\n\n3. Copy the ndll directory from the latest [Haxelib release](https://lib.haxe.org/p/lime/), or see [project/README.md](project/README.md) for details about building native binaries.\n\n4. After any changes to the [tools](tools) or [lime/tools](src/lime/tools) directories, rebuild from source:\n\n        lime rebuild tools\n\n5. To switch away from a source build:\n\n        haxelib set lime [version number]\n\n\nSample\n======\n\nYou can build a sample Lime project with the following commands:\n\n    lime create HelloWorld\n    cd HelloWorld\n    lime test neko\n\nYou can also list other projects that are available using \"lime create\".\n\n\nTargets\n=======\n\nLime currently supports the following targets:\n\n    lime test windows\n    lime test mac\n    lime test linux\n    lime test android\n    lime test ios\n    lime test html5\n    lime test flash\n    lime test air\n    lime test neko\n    lime test hl\n\nDesktop builds are currently designed to be built on the same host OS\n\n\nJoin the Community\n==================\n\nHave a question? Want a new place to hang out?\n\n * [Forums](https://community.openfl.org/c/lime/19)\n * [Discord](https://discordapp.com/invite/tDgq8EE)\n"
  },
  {
    "path": "assets/docs-theme/config.json",
    "content": "{\n\t\"name\": \"Lime Theme\",\n\t\"author\": \"Lime\",\n\t\"parentTheme\": \"default\"\n}"
  },
  {
    "path": "assets/docs-theme/resources/extra-styles.css",
    "content": "body .navbar .brand:first-of-type {\n\tbackground: url(./images/logo.png) center left no-repeat;\n\tbackground-size: 32px 32px;\n\tpadding-left: 40px;\n\tmargin: 0.5em 0;\n}"
  },
  {
    "path": "assets/docs-theme/resources/index.js",
    "content": "function createCookie(name, value, days) {\n\tlocalStorage.setItem(name, value);\n}\n\nfunction readCookie(name) {\n\treturn localStorage.getItem(name);\n}\n\nfunction isDarkTheme() {\n\treturn document.querySelector(\"html\").classList.contains(\"dark-theme\");\n}\n\nfunction toggleTheme() {\n\tconst htmlTag = document.querySelector(\"html\");\n\tlet isDark = isDarkTheme();\n\tif (isDark) {\n\t\thtmlTag.classList.remove(\"dark-theme\");\n\t} else {\n\t\thtmlTag.classList.add(\"dark-theme\");\n\t}\n\tisDark = isDarkTheme();\n\tlocalStorage.theme = isDark ? \"dark\" : \"light\";\n}\n\nfunction toggleInherited(el) {\n\tvar toggle = $(el).closest(\".toggle\");\n\ttoggle.toggleClass(\"toggle-on\");\n\tif (toggle.hasClass(\"toggle-on\")) {\n\t\t$(\"i\", toggle).removeClass(\"fa-arrow-circle-right\").addClass(\"fa-arrow-circle-down\");\n\t} else {\n\t\t$(\"i\", toggle).addClass(\"fa-arrow-circle-right\").removeClass(\"fa-arrow-circle-down\");\n\t}\n    return false;\n}\n\nfunction toggleCollapsed(el) {\n\tvar toggle = $(el).closest(\".expando\");\n\ttoggle.toggleClass(\"expanded\");\n\n\tif (toggle.hasClass(\"expanded\")) {\n\t\t$(toggle).find(\"i\").first().removeClass(\"fa-arrow-circle-right\").addClass(\"fa-arrow-circle-down\");\n\t} else {\n\t\t$(toggle).find(\"i\").first().addClass(\"fa-arrow-circle-right\").removeClass(\"fa-arrow-circle-down\");\n\t}\n\tupdateTreeState();\n    return false;\n}\n\nfunction updateTreeState(){\n\tvar states = [];\n\t$(\"#nav .expando\").each(function(i, e){\n\t\tstates.push($(e).hasClass(\"expanded\") ? 1 : 0);\n\t});\n\tvar treeState = JSON.stringify(states);\n\tcreateCookie(\"treeState\", treeState);\n}\n\nvar filters = {};\n\nfunction selectVersion(e) {\n\tsetVersion($(e.target).parent().attr(\"data\"));\n}\n\nfunction setPlatform(platform) {\n\tcreateCookie(\"platform\", platform);\n\t$(\"#select-platform\").val(platform);\n\n\tvar styles = \".platform { display:inherit } \";\n\tvar platforms = dox.platforms;\n\n\tstyles += \".package-sys { display:\" + ((platform == \"Flash\" || platform == \"HTML5\") ? \"none\" : \"inherit\") + \" } \";\n\tstyles += \".package-cpp { display:\" + ((platform == \"Flash\" || platform == \"HTML5\" || platform == \"Neko\") ? \"none\" : \"inherit\") + \" } \";\n\tstyles += \".package-neko { display:\" + ((platform == \"Neko\" || platform == \"all\") ? \"inherit\" : \"none\") + \" } \";\n\tstyles += \".package-js { display:\" + ((platform == \"HTML5\" || platform == \"all\") ? \"inherit\" : \"none\") + \" } \";\n\n\tfor (var i = 0; i < platforms.length; i++) {\n\t\tvar p = platforms[i];\n\t\tif (platform == \"all\" || p == platform)\t{\n\t\t\tstyles += \".platform-\" + p + \" { display:inherit } \";\n\t\t} else {\n\t\t\tstyles += \".platform-\" + p + \" { display:none } \";\n\t\t}\n\t}\n\n\t$(\"#dynamicStylesheet\").text(styles);\n}\n/*\nfunction setVersion(version) {\n\tcreateCookie(\"version\", version);\n}\n*/\n\n$(document).ready(function(){\n\t$(\"#nav\").html(navContent);\n\tvar treeState = readCookie(\"treeState\");\n\n\t$(\"#nav .expando\").each(function(i, e){\n\t\t$(\"i\", e).first().addClass(\"fa-arrow-circle-right\").removeClass(\"fa-arrow-circle-down\");\n\t});\n\n\t$(\".treeLink\").each(function() {\n\t\tthis.href = this.href.replace(\"::rootPath::\", dox.rootPath);\n\t});\n\n\tif (treeState != null)\n\t{\n\t\tvar states = JSON.parse(treeState);\n\t\t$(\"#nav .expando\").each(function(i, e){\n\t\t\tif (states[i]) {\n\t\t\t\t$(e).addClass(\"expanded\");\n\t\t\t\t$(\"i\", e).first().removeClass(\"fa-arrow-circle-right\").addClass(\"fa-arrow-circle-down\");\n\t\t\t}\n\t\t});\n\t}\n\t$(\"head\").append(\"<style id='dynamicStylesheet'></style>\");\n\n\tsetPlatform(readCookie(\"platform\") == null ? \"all\" : readCookie(\"platform\"));\n\t//setVersion(readCookie(\"version\") == null ? \"3_0\" : readCookie(\"version\"));\n\n\tvar searchBox = $(\"#search\");\n\tsearchBox.on(\"input\", function(e){\n\t\tsearchQuery(e.target.value);\n\t});\n\t$(window).keydown(function(e){\n\t\tif (searchBox.is(\":focus\")) {\n\t\t\treturn true;\n\t\t} else if (e.key === \"/\" || e.keyCode == 191 /* slash */) {\n\t\t\tsearchBox.focus();\n\t\t\treturn false;\n\t\t} else if (!e.ctrlKey && !e.metaKey && (\n\t\t\t// e.key is only available in newer browsers. On older\n\t\t\t// browsers, we use an ugly blacklist of well-known\n\t\t\t// non-printable keyCodes, and assume everything else is\n\t\t\t// printable.\n\t\t\t(typeof e.key == \"string\" && e.key.length == 1 && e.key != \" \") ||\n\t\t\t(typeof e.key == \"undefined\" && [8, 9, 13, 16, 17, 32, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 91, 92, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 144, 145].indexOf(e.keyCode) >= 0))) {\n\t\t\tsearchBox.focus();\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t});\n\tsearchBox.keydown(function(e){\n\t\tif (e.keyCode == 27 /* Esc */) {\n\t\t\tthis.blur();\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\n\t$(\"#select-platform\").selectpicker().on(\"change\", function(e){\n\t\tvar value = $(\":selected\", this).val();\n\t\tsetPlatform(value);\n\t});\n\n\t$(\"#nav a\").each(function () {\n\t\tif (this.href == location.href) {\n\t\t\t$(this.parentElement).addClass(\"active\");\n\t\t}\n\t});\n\n\t$(\"a.expand-button\").click(function (e) {\n\t\tvar container = $(this).parent().next();\n\t\tcontainer.toggle();\n\t\t$(\"i\", this).removeClass(\"fa-arrow-circle-down\")\n\t\t\t\t.removeClass(\"fa-arrow-circle-right\")\n\t\t\t\t.addClass(container.is(\":visible\") ? \"fa-arrow-circle-down\" : \"fa-arrow-circle-right\");\n\t\treturn false;\n\t});\n\n\t// Because there is no CSS parent selector\n\t$(\"code.prettyprint\").parents(\"pre\").addClass(\"example\");\n});\n\nfunction searchQuery(query) {\n\t$(\"#searchForm\").removeAttr(\"action\");\n\tquery = query.replace(/[&<>\"']/g, \"\");\n\tif (!query || query.length<2) {\n\t\t$(\"#nav\").removeClass(\"searching\");\n\t\t$(\"#nav li\").each(function(index, element){\n\t\t\tvar e = $(element);\n\t\t\te.css(\"display\", \"\");\n\t\t});\n\t\t$(\"#nav ul:first-child\").css(\"display\", \"block\");\n\t\t$(\"#search-results-list\").css(\"display\", \"none\");\n\t\treturn;\n\t}\n\tvar queryParts = query.toLowerCase().split(\" \");\n\tvar listItems = [];\n\tvar bestMatch = 200;\n\t$(\"#nav\").addClass(\"searching\");\n\t$(\"#nav ul:first-child\").css(\"display\",\"none\");\n\t$(\"#nav li\").each(function(index, element) {\n\t\tvar e = $(element);\n\t\tif (!e.hasClass(\"expando\")) {\n\t\t\tvar content = e.attr(\"data_path\");\n\t\t\tvar score = searchMatch(content, queryParts);\n\t\t\tif (score >= 0) {\n\t\t\t\tif (score < bestMatch) {\n\t\t\t\t\tvar url = dox.rootPath + e.attr(\"data_path\").split(\".\").join(\"/\") + \".html\";\n\t\t\t\t\t$(\"#searchForm\").attr(\"action\", url);\n\t\t\t\t\t // best match will be form action\n\t\t\t\t\tbestMatch = score;\n\t\t\t\t}\n\n\t\t\t\tvar elLink = $(\"a\", element);\n\t\t\t\t// highlight matched parts\n\t\t\t\tvar elLinkContent = elLink.text().replace(new RegExp(\"(\" + queryParts.join(\"|\").split(\".\").join(\"|\") + \")\", \"ig\"), \"<strong>$1</strong>\");\n\t\t\t\tvar liStyle = (score == 0) ? (\"font-weight:bold\") : \"\";\n\t\t\t\tlistItems.push({score: score, item: \"<li style='\" + liStyle + \"'><a href='\"+elLink.attr(\"href\")+\"'>\" + elLinkContent + \"</a></li>\"});\n\t\t\t}\n\t\t}\n\t});\n\tif ($(\"#search-results-list\").length == 0) {\n\t\t// append to nav\n\t\t$(\"#nav\").parent().append(\"<ul id='search-results-list' class='nav nav-list'></ul>\");\n\t}\n\tlistItems.sort(function(x, y) { return x.score - y.score; }); // put in order\n\t$(\"#search-results-list\").css(\"display\",\"block\").html(listItems.map(function(x) { return x.item; }).join(\"\"));\n}\n\nfunction match(textParts, query) {\n\tvar queryParts = query.split(\".\");\n\tif (queryParts.length == 1) {\n\t\tvar queryPart = queryParts[0];\n\t\tfor (var i = 0; i < textParts.length; ++i) {\n\t\t\tvar textPart = textParts[i];\n\t\t\tif (textPart.indexOf(queryPart) > -1) {\n\t\t\t\t// We don't want to match the same part twice, so let's remove it\n\t\t\t\ttextParts[i] = textParts[i].split(queryPart).join(\"\");\n\t\t\t\treturn textPart.length - queryPart.length;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvar offset = -1;\n\t\touter:\n\t\twhile (true) {\n\t\t\t++offset;\n\t\t\tif (queryParts.length + offset > textParts.length) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tvar scoreSum = 0;\n\t\t\tfor (var i = 0; i < queryParts.length; ++i) {\n\t\t\t\tvar queryPart = queryParts[i];\n\t\t\t\tvar textPart = textParts[i + offset];\n\t\t\t\tvar index = textPart.indexOf(queryPart);\n\t\t\t\tif (index != 0) {\n\t\t\t\t\tcontinue outer;\n\t\t\t\t}\n\t\t\t\tscoreSum += textPart.length - queryPart.length;\n\t\t\t}\n\t\t\treturn scoreSum;\n\t\t}\n\t}\n}\n\nfunction searchMatch(text, queryParts) {\n\ttext = text.toLowerCase();\n\tvar textParts = text.split(\".\");\n\tvar scoreSum = 0;\n\tfor (var i = 0; i < queryParts.length; ++i) {\n\t\tvar score = match(textParts, queryParts[i]);\n\t\tif (score == -1) {\n\t\t\treturn -1;\n\t\t}\n\t\tscoreSum += score + text.length;\n\t}\n\treturn scoreSum;\n}\n"
  },
  {
    "path": "assets/docs-theme/templates/package_description.mtt",
    "content": "<h1>::api.currentPageName:: <small ::cond api.isDefined(\"version\") && full == \"\"::>version ::api.getValue('version')::</small></h1>\n<p ::cond api.isDefined(\"description\")::>::api.getValue(\"description\")::</p>\n\n<!-- \n::if full == \"\"::\n\t<h1>Haxe API documentation <small ::cond api.isDefined(\"version\")::>version ::api.getValue('version')::</small></h1>\n\t<p>Haxe is an open source toolkit based on a modern, high level, strictly typed programming language, a cross-compiler, a complete cross-platform standard library and ways to access each platform's native capabilities.</p> \n\t<h3>Getting Started With Haxe</h3>\n\t<ul>\n\t\t<li>Take a look at our <a href=\"http://haxe.org/documentation/introduction/\">introduction</a></li>\n\t\t<li>Read through the <a href=\"http://haxe.org/manual/\">Haxe Manual</a></li>\n\t\t<li>Look at these <a href=\"http://haxe.org/use-cases/\">use cases for Haxe</a></li>\n\t\t<li>Find and install <a href=\"http://lib.haxe.org/t/all/\">popular Haxe libraries</a></li>\n\t\t<li>Learn by example with the <a href=\"http://code.haxe.org\">Haxe Code Cookbook</a></li>\n\t</ul>\n\t<hr/>\n\t<h3>Top Level</h3>\n::elseif full.split(\".\").length==1::\n\t<h1>Haxe/::full:: API documentation</h1>\n\t<p>To get started with the Haxe ::full:: target:</p>\n\t<ul>\n\t\t<li>Read through the <a href=\"http://haxe.org/manual/\">Haxe Manual</a></li>\n\t\t<li ::cond full==\"js\"::>Read the <a href=\"http://haxe.org/manual/target-javascript.html\">Haxe/JavaScript target details</a></li>\n\t\t<li ::cond full==\"flash\"::>Read the <a href=\"http://haxe.org/manual/target-flash.html\">Haxe/Flash target details</a></li>\n\t\t<li ::cond full==\"php\"::>Read the <a href=\"http://haxe.org/manual/target-php.html\">Haxe/PHP target details</a></li>\n\t\t<li ::cond full==\"cpp\"::>Read the <a href=\"http://haxe.org/manual/target-cpp.html\">Haxe/C++ target details</a></li>\n\t\t<li ::cond full==\"neko\"::>Read the <a href=\"http://nekovm.org/doc\">Neko documentation</a></li>\n\t\t<li>Find and install <a href=\"http://lib.haxe.org/t/::full::/\">popular Haxe/::full:: libraries</a></li>\n\t\t<li>Learn by example with the <a href=\"http://code.haxe.org\">Haxe Code Cookbook</a></li>\n\t</ul>\n\t<hr/>\n\t<h1><small class=\"directive\">package</small> ::full::</h1>\n::else::\n\t<h1><small class=\"directive\">package</small> ::full::</h1>\n::end::\n-->"
  },
  {
    "path": "assets/docs-theme/templates/topbar.mtt",
    "content": "<style>\n::raw \"\na,\ncode a,\ncode .type,\n.dark-theme a,\n.dark-theme code a,\n.dark-theme code .type {\n\tcolor: #6fac17;\n}\n.navbar .brand {\n\tdisplay: inline-block;\n\tfloat: none;\n\ttext-shadow: 0 0 0 transparent;\n}\n.navbar .brand img {\n\tmax-width: 75px;\n}\n.nav-list>.active>a.treeLink,\n.nav-list>.active>a.treeLink:hover,\n.nav-list>.active>a.treeLink:focus,\n.dark-theme .nav-list>.active>a.treeLink,\n.dark-theme .nav-list>.active>a.treeLink:hover,\n.dark-theme .nav-list>.active>a.treeLink:focus {\n\tbackground: #6fac17;\n\tcolor: #ffffff;\n\ttext-shadow: 0 0 0 transparent;\n}\n.navbar .container {\n\twidth: 940px ;\n}\n@media (max-width: 767px) {\n\t.navbar .container {\n\t\twidth: auto;\n\t}\n}\n@media (max-width: 979px) and (min-width: 768px) {\n\t.navbar .container {\n\t\twidth: 724px;\n\t}\n}\n@media (min-width: 1200px) {\n\t.navbar .container {\n\t\twidth: 1170px;\n\t}\n}\n.navbar .container img {\n\tmargin: 5px 0 0 4px;\n}\n\"::\n</style>\n<nav class=\"nav\">\n\t<div class=\"navbar\">\n\t\t<div class=\"navbar-inner\" style=\"background:$$getHexValue(::themeColor::); border-bottom:1px solid rgba(0,0,0,.09)\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<a ::cond api.isDefined(\"logo\"):: ::attr href if(api.isDefined(\"website\")) api.getValue(\"website\") else api.config.rootPath:: class=\"brand\"><img alt=\"\" ::attr src api.getValue(\"logo\"):: /></a>\n\t\t\t\t<a ::attr href api.config.rootPath:: class=\"brand\" style=\"color:$$getHexValue(::textColor::)\">::if api.config.pageTitle!=null::::api.config.pageTitle::::else::Lime API Documentation::end::</a>\n\t\t\t\t<a href=\"#\" id=\"theme-toggle\" style=\"color:$$getHexValue(::textColor::)\" onclick=\"toggleTheme()\" title=\"Toggle Dark Mode\"><i class=\"fa fa-moon-o\"></i></a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</nav>"
  },
  {
    "path": "dependencies/extension-api/build.gradle",
    "content": "buildscript {\n\trepositories {\n\t\tmavenCentral()\n\t\tgoogle()\n\t}\n\n\tdependencies {\n\t\tclasspath 'com.android.tools.build:gradle:::ANDROID_GRADLE_PLUGIN::'\n\t}\n}\n\napply plugin: 'com.android.library'\n\nandroid {\n\tnamespace 'org.haxe.extension'\n\tcompileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n\tbuildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION\n\n\tdefaultConfig {\n\t\tminSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)\n\t\ttargetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)\n\t}\n}\n"
  },
  {
    "path": "dependencies/extension-api/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" />\n"
  },
  {
    "path": "dependencies/extension-api/src/main/java/org/haxe/HXCPP.java",
    "content": "package org.haxe;\n\n\n// Wrapper for native library\n\n\npublic class HXCPP {\n\t\n\t\n\tprivate static boolean mInit = false;\n\t\n\t\n\tpublic static native void main ();\n\t\n\t\n\tpublic static void run (String inClassName) {\n\t\t\n\t\tSystem.loadLibrary (inClassName);\n\t\t\n\t\tif (!mInit) {\n\t\t\t\n\t\t\tmInit = true;\n\t\t\tmain ();\n\t\t\t\n\t\t}\n\t\t\n\t}\n\t\n\t\n}"
  },
  {
    "path": "dependencies/extension-api/src/main/java/org/haxe/extension/Extension.java",
    "content": "package org.haxe.extension;\n\n\nimport android.app.Activity;\nimport android.content.res.AssetManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\n\n\npublic class Extension {\n\t\n\t\n\tpublic static AssetManager assetManager;\n\tpublic static Handler callbackHandler;\n\tpublic static Activity mainActivity;\n\tpublic static Context mainContext;\n\tpublic static View mainView;\n\tpublic static String packageName;\n\t\n\t\n\t/**\n\t * Called when an activity you launched exits, giving you the requestCode \n\t * you started it with, the resultCode it returned, and any additional data \n\t * from it.\n\t */\n\tpublic boolean onActivityResult (int requestCode, int resultCode, Intent data) {\n\t\t\n\t\treturn true;\n\t\t\n\t}\n\n\tpublic boolean onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {\n\n\t\treturn true;\n\n\t}\n\t\n\t\n\tpublic boolean onBackPressed () {\n\t\t\n\t\treturn true;\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when the activity is starting.\n\t */\n\tpublic void onCreate (Bundle savedInstanceState) {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Perform any final cleanup before an activity is destroyed.\n\t */\n\tpublic void onDestroy () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when the overall system is running low on memory, \n\t * and actively running processes should trim their memory usage.\n\t * This is a backwards compatibility method as it is called at the same time as \n\t * onTrimMemory(TRIM_MEMORY_COMPLETE).\n\t */\n\tpublic void onLowMemory () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when the a new Intent is received\n\t */\n\tpublic void onNewIntent (Intent intent) {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called as part of the activity lifecycle when an activity is going into\n\t * the background, but has not (yet) been killed.\n\t */\n\tpublic void onPause () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after {@link #onStop} when the current activity is being \n\t * re-displayed to the user (the user has navigated back to it).\n\t */\n\tpublic void onRestart () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after {@link #onRestart}, or {@link #onPause}, for your activity \n\t * to start interacting with the user.\n\t */\n\tpublic void onResume () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after onStart() when the activity is being re-initialized from \n\t * a previously saved state.\n\t */\n\tpublic void onRestoreInstanceState (Bundle savedState) {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called to retrieve per-instance state from an activity before being \n\t * killed so that the state can be restored in onCreate\n\t */\n\tpublic void onSaveInstanceState (Bundle outState) {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when  \n\t * the activity had been stopped, but is now again being displayed to the \n\t * user.\n\t */\n\tpublic void onStart () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when the activity is no longer visible to the user, because \n\t * another activity has been resumed and is covering this one. \n\t */\n\tpublic void onStop () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when the operating system has determined that it is a\n\t * good time for a process to trim unneeded memory from its process.\n\t * \n\t * See http://developer.android.com/reference/android/content/ComponentCallbacks2.html for the level explanation.\n\t */\n\tpublic void onTrimMemory (int level) {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n}"
  },
  {
    "path": "dependencies/extension-api/src/main/java/org/haxe/lime/HaxeObject.java",
    "content": "package org.haxe.lime;\n\nimport android.util.Log;\nimport java.lang.Boolean;\nimport java.lang.Byte;\nimport java.lang.Character;\nimport java.lang.Short;\nimport java.lang.Integer;\nimport java.lang.Long;\nimport java.lang.Float;\nimport java.lang.Double;\n\n/**\n   A placeholder for an object created in Haxe. You can call the object's\n   functions using `callN(\"functionName\")`, where N is the number of arguments.\n\n   Caution: the Haxe function will run on whichever thread you call it from.\n   Java code typically runs on the UI thread, not Haxe's main thread, which can\n   easily cause thread-related errors. This cannot be easily remedied using Java\n   code, but is fixable in Haxe using `lime.system.JNI.JNISafety`.\n\n   Sample usage:\n\n   ```haxe\n   // MyHaxeObject.hx\n   import lime.system.JNI;\n\n   class MyHaxeObject implements JNISafety\n   {\n      @:runOnMainThread\n      public function onActivityResult(requestCode:Int, resultCode:Int):Void\n      {\n         // Insert code to process the result. This code will safely run on the\n         // main Haxe thread.\n      }\n   }\n   ```\n\n   ```java\n   // MyJavaTool.java\n   import android.content.Intent;\n   import org.haxe.extension.Extension;\n   import org.haxe.lime.HaxeObject;\n\n   public class MyJavaTool extends Extension\n   {\n      private static var haxeObject:HaxeObject;\n\n      public static function registerHaxeObject(object:HaxeObject)\n      {\n         haxeObject = object;\n      }\n\n      // onActivityResult() always runs on the Android UI thread.\n      @Override public boolean onActivityResult(int requestCode, int resultCode, Intent data)\n      {\n         haxeObject.call2(requestCode, resultCode);\n         return true;\n      }\n   }\n   ```\n**/\npublic class HaxeObject\n{\n   public long __haxeHandle;\n\n   public HaxeObject(long value)\n   {\n      __haxeHandle = value;\n   }\n\n   public static HaxeObject create(long inHandle)\n   {\n      if (inHandle == 0)\n         return null;\n      return new HaxeObject(inHandle);\n   }\n\n\n   protected void finalize() throws Throwable {\n    try {\n        Lime.releaseReference(__haxeHandle);\n    } finally {\n        super.finalize();\n    }\n   }\n   public Object call0(String function)\n   {\n      //Log.e(\"HaxeObject\",\"Calling obj0\" + function + \"()\" );\n      return Lime.callObjectFunction(__haxeHandle,function,new Object[0]);\n   }\n   public Object call1(String function,Object arg0)\n   {\n      Object[] args = new Object[1];\n      args[0] = arg0;\n      //Log.e(\"HaxeObject\",\"Calling obj1 \" + function + \"(\" + arg0 + \")\" );\n      return Lime.callObjectFunction(__haxeHandle,function,args);\n   }\n   public Object call2(String function,Object arg0,Object arg1)\n   {\n      Object[] args = new Object[2];\n      args[0] = arg0;\n      args[1] = arg1;\n      //Log.e(\"HaxeObject\",\"Calling obj2 \" + function + \"(\" + arg0 + \",\" + arg1 + \")\" );\n      return Lime.callObjectFunction(__haxeHandle,function,args);\n   }\n   public Object call3(String function,Object arg0,Object arg1,Object arg2)\n   {\n      Object[] args = new Object[3];\n      args[0] = arg0;\n      args[1] = arg1;\n      args[2] = arg2;\n      //Log.e(\"HaxeObject\",\"Calling obj3 \" + function + \"(\" + arg0 + \",\" + arg1 + \",\" + arg2 + \")\" );\n      return Lime.callObjectFunction(__haxeHandle,function,args);\n   }\n   public Object call4(String function,Object arg0,Object arg1,Object arg2,Object arg3)\n   {\n      Object[] args = new Object[4];\n      args[0] = arg0;\n      args[1] = arg1;\n      args[2] = arg2;\n      args[3] = arg3;\n      //Log.e(\"HaxeObject\",\"Calling obj4 \" + function + \"(\" + arg0 + \",\" + arg1 + \",\" + arg2 + \",\" + arg3 + \")\" );\n      return Lime.callObjectFunction(__haxeHandle,function,args);\n   }\n\n   public double callD0(String function)\n   {\n      //Log.e(\"HaxeObject\",\"Calling objD0 \" + function + \"()\" );\n      return Lime.callNumericFunction(__haxeHandle,function,new Object[0]);\n   }\n   public double callD1(String function,Object arg0)\n   {\n      Object[] args = new Object[1];\n      args[0] = arg0;\n      //Log.e(\"HaxeObject\",\"Calling D1 \" + function + \"(\" + arg0 + \")\" );\n      return Lime.callNumericFunction(__haxeHandle,function,args);\n   }\n   public double callD2(String function,Object arg0,Object arg1)\n   {\n      Object[] args = new Object[2];\n      args[0] = arg0;\n      args[1] = arg1;\n      //Log.e(\"HaxeObject\",\"Calling D2 \" + function + \"(\" + arg0 + \",\" + arg1 + \")\" );\n      return Lime.callNumericFunction(__haxeHandle,function,args);\n   }\n   public double callD3(String function,Object arg0,Object arg1,Object arg2)\n   {\n      Object[] args = new Object[2];\n      args[0] = arg0;\n      args[1] = arg1;\n      args[2] = arg2;\n      //Log.e(\"HaxeObject\",\"Calling D3 \" + function + \"(\" + arg0 + \",\" + arg1 + \",\" + arg2 + \")\" );\n      return Lime.callNumericFunction(__haxeHandle,function,args);\n   }\n\n\n\n\n\n   public Object call(String function, Object[] args)\n   {\n      return Lime.callObjectFunction(__haxeHandle,function,args);\n   }\n   public double callD(String function, Object[] args)\n   {\n     return Lime.callNumericFunction(__haxeHandle,function,args);\n   }\n}\n"
  },
  {
    "path": "dependencies/extension-api/src/main/java/org/haxe/lime/Lime.java",
    "content": "package org.haxe.lime;\n\n\npublic class Lime {\n\t\n\tstatic {\n\t\t\n\t\tSystem.loadLibrary(\"lime\");\n\t\t\n\t}\n\t\n\tpublic static native void onCallback (long inHandle);\n\tpublic static native Object callObjectFunction (long inHandle, String function, Object[] args);\n\tpublic static native double callNumericFunction (long inHandle, String function, Object[] args);\n\tpublic static native void releaseReference (long inHandle);\n\t\n}"
  },
  {
    "path": "dependencies/extension-api/src/main/java/org/haxe/lime/Value.java",
    "content": "package org.haxe.lime;\n\n\npublic class Value {\n\t\n\t\n\tdouble mValue;\n\t\n\tpublic Value (double inValue) { mValue = inValue; }\n\tpublic Value (int inValue) { mValue = inValue; }\n\tpublic Value (short inValue) { mValue = inValue; }\n\tpublic Value (char inValue) { mValue = inValue; }\n\tpublic Value (boolean inValue) { mValue = inValue ? 1.0 : 0.0; }\n\t\n\tpublic double getDouble () { return mValue; }\n\t\n\t\n}"
  },
  {
    "path": "dependencies/lzma_worker-min.js",
    "content": "var e=function(){\"use strict\";function r(e,r){postMessage({action:xt,cbn:r,result:e})}function t(e){var r=[];return r[e-1]=void 0,r}function o(e,r){return i(e[0]+r[0],e[1]+r[1])}function n(e,r){return u(~~Math.max(Math.min(e[1]/Ot,2147483647),-2147483648)&~~Math.max(Math.min(r[1]/Ot,2147483647),-2147483648),c(e)&c(r))}function s(e,r){var t,o;return e[0]==r[0]&&e[1]==r[1]?0:(t=0>e[1],o=0>r[1],t&&!o?-1:!t&&o?1:h(e,r)[1]<0?-1:1)}function i(e,r){var t,o;for(r%=0x10000000000000000,e%=0x10000000000000000,t=r%Ot,o=Math.floor(e/Ot)*Ot,r=r-t+o,e=e-o+t;0>e;)e+=Ot,r-=Ot;for(;e>4294967295;)e-=Ot,r+=Ot;for(r%=0x10000000000000000;r>0x7fffffff00000000;)r-=0x10000000000000000;for(;-0x8000000000000000>r;)r+=0x10000000000000000;return[e,r]}function _(e,r){return e[0]==r[0]&&e[1]==r[1]}function a(e){return e>=0?[e,0]:[e+Ot,-Ot]}function c(e){return e[0]>=2147483648?~~Math.max(Math.min(e[0]-Ot,2147483647),-2147483648):~~Math.max(Math.min(e[0],2147483647),-2147483648)}function u(e,r){var t,o;return t=e*Ot,o=r,0>r&&(o+=Ot),[o,t]}function f(e){return 30>=e?1<<e:f(30)*f(e-30)}function m(e,r){var t,o,n,s;if(r&=63,_(e,Ht))return r?Gt:e;if(0>e[1])throw Error(\"Neg\");return s=f(r),o=e[1]*s%0x10000000000000000,n=e[0]*s,t=n-n%Ot,o+=t,n-=t,o>=0x8000000000000000&&(o-=0x10000000000000000),[n,o]}function d(e,r){var t;return r&=63,t=f(r),i(Math.floor(e[0]/t),e[1]/t)}function p(e,r){var t;return r&=63,t=d(e,r),0>e[1]&&(t=o(t,m([2,0],63-r))),t}function h(e,r){return i(e[0]-r[0],e[1]-r[1])}function P(e,r){return e.Mc=r,e.Lc=0,e.Yb=r.length,e}function l(e){return e.Lc>=e.Yb?-1:255&e.Mc[e.Lc++]}function v(e,r,t,o){return e.Lc>=e.Yb?-1:(o=Math.min(o,e.Yb-e.Lc),M(e.Mc,e.Lc,r,t,o),e.Lc+=o,o)}function B(e){return e.Mc=t(32),e.Yb=0,e}function S(e){var r=e.Mc;return r.length=e.Yb,r}function g(e,r){e.Mc[e.Yb++]=r<<24>>24}function k(e,r,t,o){M(r,t,e.Mc,e.Yb,o),e.Yb+=o}function R(e,r,t,o,n){var s;for(s=r;t>s;++s)o[n++]=e.charCodeAt(s)}function M(e,r,t,o,n){for(var s=0;n>s;++s)t[o+s]=e[r+s]}function D(e,r){Ar(r,1<<e.s),r.n=e.f,Hr(r,e.m),r.eb=0,r.fb=3,r.Y=2,r.y=3}function b(r,t,o,n,i){var _,a;if(s(n,At)<0)throw Error(\"invalid length \"+n);for(r.Tb=n,_=Dr({}),D(i,_),_.Gc=void 0===e.disableEndMark,Gr(_,o),a=0;64>a;a+=8)g(o,255&c(d(n,a)));r.yb=(_.W=0,_.oc=t,_.pc=0,Mr(_),_.d.Ab=o,Fr(_),wr(_),br(_),_.$.rb=_.n+1-2,Qr(_.$,1<<_.Y),_.i.rb=_.n+1-2,Qr(_.i,1<<_.Y),void(_.g=Gt),X({},_))}function w(e,r,t){return e.Nb=B({}),b(e,P({},r),e.Nb,a(r.length),t),e}function E(e,r,t){var o,n,s,i,_=\"\",c=[];for(n=0;5>n;++n){if(s=l(r),-1==s)throw Error(\"truncated input\");c[n]=s<<24>>24}if(o=ir({}),!ar(o,c))throw Error(\"corrupted input\");for(n=0;64>n;n+=8){if(s=l(r),-1==s)throw Error(\"truncated input\");s=s.toString(16),1==s.length&&(s=\"0\"+s),_=s+\"\"+_}/^0+$|^f+$/i.test(_)?e.Tb=At:(i=parseInt(_,16),e.Tb=i>4294967295?At:a(i)),e.yb=nr(o,r,t,e.Tb)}function L(e,r){return e.Nb=B({}),E(e,P({},r),e.Nb),e}function y(e,r,o,n){var s;e.Bc=r,e._b=o,s=r+o+n,(null==e.c||e.Kb!=s)&&(e.c=null,e.Kb=s,e.c=t(e.Kb)),e.H=e.Kb-o}function C(e,r){return e.c[e.f+e.o+r]}function z(e,r,t,o){var n,s;for(e.T&&e.o+r+o>e.h&&(o=e.h-(e.o+r)),++t,s=e.f+e.o+r,n=0;o>n&&e.c[s+n]==e.c[s+n-t];++n);return n}function F(e){return e.h-e.o}function I(e){var r,t,o;for(o=e.f+e.o-e.Bc,o>0&&--o,t=e.f+e.h-o,r=0;t>r;++r)e.c[r]=e.c[o+r];e.f-=o}function x(e){var r;++e.o,e.o>e.zb&&(r=e.f+e.o,r>e.H&&I(e),N(e))}function N(e){var r,t,o;if(!e.T)for(;;){if(o=-e.f+e.Kb-e.h,!o)return;if(r=v(e.cc,e.c,e.f+e.h,o),-1==r)return e.zb=e.h,t=e.f+e.zb,t>e.H&&(e.zb=e.H-e.f),void(e.T=1);e.h+=r,e.h>=e.o+e._b&&(e.zb=e.h-e._b)}}function O(e,r){e.f+=r,e.zb-=r,e.o-=r,e.h-=r}function A(e,r,o,n,s){var i,_,a;1073741567>r&&(e.Fc=16+(n>>1),a=~~((r+o+n+s)/2)+256,y(e,r+o,n+s,a),e.ob=n,i=r+1,e.p!=i&&(e.L=t(2*(e.p=i))),_=65536,e.qb&&(_=r-1,_|=_>>1,_|=_>>2,_|=_>>4,_|=_>>8,_>>=1,_|=65535,_>16777216&&(_>>=1),e.Ec=_,++_,_+=e.R),_!=e.rc&&(e.ub=t(e.rc=_)))}function H(e,r){var t,o,n,s,i,_,a,c,u,f,m,d,p,h,P,l,v,B,S,g,k;if(e.h>=e.o+e.ob)h=e.ob;else if(h=e.h-e.o,e.xb>h)return W(e),0;for(v=0,P=e.o>e.p?e.o-e.p:0,o=e.f+e.o,l=1,c=0,u=0,e.qb?(k=Tt[255&e.c[o]]^255&e.c[o+1],c=1023&k,k^=(255&e.c[o+2])<<8,u=65535&k,f=(k^Tt[255&e.c[o+3]]<<5)&e.Ec):f=255&e.c[o]^(255&e.c[o+1])<<8,n=e.ub[e.R+f]||0,e.qb&&(s=e.ub[c]||0,i=e.ub[1024+u]||0,e.ub[c]=e.o,e.ub[1024+u]=e.o,s>P&&e.c[e.f+s]==e.c[o]&&(r[v++]=l=2,r[v++]=e.o-s-1),i>P&&e.c[e.f+i]==e.c[o]&&(i==s&&(v-=2),r[v++]=l=3,r[v++]=e.o-i-1,s=i),0!=v&&s==n&&(v-=2,l=1)),e.ub[e.R+f]=e.o,S=(e.k<<1)+1,g=e.k<<1,d=p=e.w,0!=e.w&&n>P&&e.c[e.f+n+e.w]!=e.c[o+e.w]&&(r[v++]=l=e.w,r[v++]=e.o-n-1),t=e.Fc;;){if(P>=n||0==t--){e.L[S]=e.L[g]=0;break}if(a=e.o-n,_=(e.k>=a?e.k-a:e.k-a+e.p)<<1,B=e.f+n,m=p>d?d:p,e.c[B+m]==e.c[o+m]){for(;++m!=h&&e.c[B+m]==e.c[o+m];);if(m>l&&(r[v++]=l=m,r[v++]=a-1,m==h)){e.L[g]=e.L[_],e.L[S]=e.L[_+1];break}}(255&e.c[o+m])>(255&e.c[B+m])?(e.L[g]=n,g=_+1,n=e.L[g],p=m):(e.L[S]=n,S=_,n=e.L[S],d=m)}return W(e),v}function G(e){e.f=0,e.o=0,e.h=0,e.T=0,N(e),e.k=0,O(e,-1)}function W(e){var r;++e.k>=e.p&&(e.k=0),x(e),1073741823==e.o&&(r=e.o-e.p,T(e.L,2*e.p,r),T(e.ub,e.rc,r),O(e,r))}function T(e,r,t){var o,n;for(o=0;r>o;++o)n=e[o]||0,t>=n?n=0:n-=t,e[o]=n}function Z(e,r){e.qb=r>2,e.qb?(e.w=0,e.xb=4,e.R=66560):(e.w=2,e.xb=3,e.R=0)}function Y(e,r){var t,o,n,s,i,_,a,c,u,f,m,d,p,h,P,l,v;do{if(e.h>=e.o+e.ob)d=e.ob;else if(d=e.h-e.o,e.xb>d){W(e);continue}for(p=e.o>e.p?e.o-e.p:0,o=e.f+e.o,e.qb?(v=Tt[255&e.c[o]]^255&e.c[o+1],_=1023&v,e.ub[_]=e.o,v^=(255&e.c[o+2])<<8,a=65535&v,e.ub[1024+a]=e.o,c=(v^Tt[255&e.c[o+3]]<<5)&e.Ec):c=255&e.c[o]^(255&e.c[o+1])<<8,n=e.ub[e.R+c],e.ub[e.R+c]=e.o,P=(e.k<<1)+1,l=e.k<<1,f=m=e.w,t=e.Fc;;){if(p>=n||0==t--){e.L[P]=e.L[l]=0;break}if(i=e.o-n,s=(e.k>=i?e.k-i:e.k-i+e.p)<<1,h=e.f+n,u=m>f?f:m,e.c[h+u]==e.c[o+u]){for(;++u!=d&&e.c[h+u]==e.c[o+u];);if(u==d){e.L[l]=e.L[s],e.L[P]=e.L[s+1];break}}(255&e.c[o+u])>(255&e.c[h+u])?(e.L[l]=n,l=s+1,n=e.L[l],m=u):(e.L[P]=n,P=s,n=e.L[P],f=u)}W(e)}while(0!=--r)}function V(e,r,t){var o=e.o-r-1;for(0>o&&(o+=e.M);0!=t;--t)o>=e.M&&(o=0),e.Lb[e.o++]=e.Lb[o++],e.o>=e.M&&$(e)}function j(e,r){(null==e.Lb||e.M!=r)&&(e.Lb=t(r)),e.M=r,e.o=0,e.h=0}function $(e){var r=e.o-e.h;r&&(k(e.cc,e.Lb,e.h,r),e.o>=e.M&&(e.o=0),e.h=e.o)}function K(e,r){var t=e.o-r-1;return 0>t&&(t+=e.M),e.Lb[t]}function q(e,r){e.Lb[e.o++]=r,e.o>=e.M&&$(e)}function J(e){$(e),e.cc=null}function Q(e){return e-=2,4>e?e:3}function U(e){return 4>e?0:10>e?e-3:e-6}function X(e,r){return e.cb=r,e.Z=null,e.zc=1,e}function er(e,r){return e.Z=r,e.cb=null,e.zc=1,e}function rr(e){if(!e.zc)throw Error(\"bad state\");return e.cb?or(e):tr(e),e.zc}function tr(e){var r=sr(e.Z);if(-1==r)throw Error(\"corrupted input\");e.Pb=At,e.Pc=e.Z.g,(r||s(e.Z.Nc,Gt)>=0&&s(e.Z.g,e.Z.Nc)>=0)&&($(e.Z.B),J(e.Z.B),e.Z.e.Ab=null,e.zc=0)}function or(e){Rr(e.cb,e.cb.Xb,e.cb.uc,e.cb.Kc),e.Pb=e.cb.Xb[0],e.cb.Kc[0]&&(Or(e.cb),e.zc=0)}function nr(e,r,t,o){return e.e.Ab=r,J(e.B),e.B.cc=t,_r(e),e.U=0,e.ib=0,e.Jc=0,e.Ic=0,e.Qc=0,e.Nc=o,e.g=Gt,e.jc=0,er({},e)}function sr(e){var r,t,n,i,_,u;if(u=c(e.g)&e.Dc,vt(e.e,e.Gb,(e.U<<4)+u)){if(vt(e.e,e.Zb,e.U))n=0,vt(e.e,e.Cb,e.U)?(vt(e.e,e.Db,e.U)?(vt(e.e,e.Eb,e.U)?(t=e.Qc,e.Qc=e.Ic):t=e.Ic,e.Ic=e.Jc):t=e.Jc,e.Jc=e.ib,e.ib=t):vt(e.e,e.pb,(e.U<<4)+u)||(e.U=7>e.U?9:11,n=1),n||(n=mr(e.sb,e.e,u)+2,e.U=7>e.U?8:11);else if(e.Qc=e.Ic,e.Ic=e.Jc,e.Jc=e.ib,n=2+mr(e.Rb,e.e,u),e.U=7>e.U?7:10,_=at(e.kb[Q(n)],e.e),_>=4){if(i=(_>>1)-1,e.ib=(2|1&_)<<i,14>_)e.ib+=ut(e.kc,e.ib-_-1,e.e,i);else if(e.ib+=Bt(e.e,i-4)<<4,e.ib+=ct(e.Fb,e.e),0>e.ib)return-1==e.ib?1:-1}else e.ib=_;if(s(a(e.ib),e.g)>=0||e.ib>=e.nb)return-1;V(e.B,e.ib,n),e.g=o(e.g,a(n)),e.jc=K(e.B,0)}else r=Pr(e.gb,c(e.g),e.jc),e.jc=7>e.U?vr(r,e.e):Br(r,e.e,K(e.B,e.ib)),q(e.B,e.jc),e.U=U(e.U),e.g=o(e.g,Wt);return 0}function ir(e){e.B={},e.e={},e.Gb=t(192),e.Zb=t(12),e.Cb=t(12),e.Db=t(12),e.Eb=t(12),e.pb=t(192),e.kb=t(4),e.kc=t(114),e.Fb=_t({},4),e.Rb=dr({}),e.sb=dr({}),e.gb={};for(var r=0;4>r;++r)e.kb[r]=_t({},6);return e}function _r(e){e.B.h=0,e.B.o=0,gt(e.Gb),gt(e.pb),gt(e.Zb),gt(e.Cb),gt(e.Db),gt(e.Eb),gt(e.kc),lr(e.gb);for(var r=0;4>r;++r)gt(e.kb[r].G);pr(e.Rb),pr(e.sb),gt(e.Fb.G),St(e.e)}function ar(e,r){var t,o,n,s,i,_,a;if(5>r.length)return 0;for(a=255&r[0],n=a%9,_=~~(a/9),s=_%5,i=~~(_/5),t=0,o=0;4>o;++o)t+=(255&r[1+o])<<8*o;return t>99999999||!ur(e,n,s,i)?0:cr(e,t)}function cr(e,r){return 0>r?0:(e.Ob!=r&&(e.Ob=r,e.nb=Math.max(e.Ob,1),j(e.B,Math.max(e.nb,4096))),1)}function ur(e,r,t,o){if(r>8||t>4||o>4)return 0;hr(e.gb,t,r);var n=1<<o;return fr(e.Rb,n),fr(e.sb,n),e.Dc=n-1,1}function fr(e,r){for(;r>e.O;++e.O)e.ec[e.O]=_t({},3),e.hc[e.O]=_t({},3)}function mr(e,r,t){if(!vt(r,e.wc,0))return at(e.ec[t],r);var o=8;return o+=vt(r,e.wc,1)?8+at(e.tc,r):at(e.hc[t],r)}function dr(e){return e.wc=t(2),e.ec=t(16),e.hc=t(16),e.tc=_t({},8),e.O=0,e}function pr(e){gt(e.wc);for(var r=0;e.O>r;++r)gt(e.ec[r].G),gt(e.hc[r].G);gt(e.tc.G)}function hr(e,r,o){var n,s;if(null==e.V||e.u!=o||e.I!=r)for(e.I=r,e.qc=(1<<r)-1,e.u=o,s=1<<e.u+e.I,e.V=t(s),n=0;s>n;++n)e.V[n]=Sr({})}function Pr(e,r,t){return e.V[((r&e.qc)<<e.u)+((255&t)>>>8-e.u)]}function lr(e){var r,t;for(t=1<<e.u+e.I,r=0;t>r;++r)gt(e.V[r].Ib)}function vr(e,r){var t=1;do t=t<<1|vt(r,e.Ib,t);while(256>t);return t<<24>>24}function Br(e,r,t){var o,n,s=1;do if(n=t>>7&1,t<<=1,o=vt(r,e.Ib,(1+n<<8)+s),s=s<<1|o,n!=o){for(;256>s;)s=s<<1|vt(r,e.Ib,s);break}while(256>s);return s<<24>>24}function Sr(e){return e.Ib=t(768),e}function gr(e,r){var t,o,n,s;e.jb=r,n=e.a[r].r,o=e.a[r].j;do e.a[r].t&&(st(e.a[n]),e.a[n].r=n-1,e.a[r].Ac&&(e.a[n-1].t=0,e.a[n-1].r=e.a[r].r2,e.a[n-1].j=e.a[r].j2)),s=n,t=o,o=e.a[s].j,n=e.a[s].r,e.a[s].j=t,e.a[s].r=r,r=s;while(r>0);return e.mb=e.a[0].j,e.q=e.a[0].r}function kr(e){e.l=0,e.J=0;for(var r=0;4>r;++r)e.v[r]=0}function Rr(e,r,t,n){var i,u,f,m,d,p,P,l,v,B,S,g,k,R,M;if(r[0]=Gt,t[0]=Gt,n[0]=1,e.oc&&(e.b.cc=e.oc,G(e.b),e.W=1,e.oc=null),!e.pc){if(e.pc=1,R=e.g,_(e.g,Gt)){if(!F(e.b))return void Er(e,c(e.g));xr(e),k=c(e.g)&e.y,kt(e.d,e.C,(e.l<<4)+k,0),e.l=U(e.l),f=C(e.b,-e.s),rt(Xr(e.A,c(e.g),e.J),e.d,f),e.J=f,--e.s,e.g=o(e.g,Wt)}if(!F(e.b))return void Er(e,c(e.g));for(;;){if(P=Lr(e,c(e.g)),B=e.mb,k=c(e.g)&e.y,u=(e.l<<4)+k,1==P&&-1==B)kt(e.d,e.C,u,0),f=C(e.b,-e.s),M=Xr(e.A,c(e.g),e.J),7>e.l?rt(M,e.d,f):(v=C(e.b,-e.v[0]-1-e.s),tt(M,e.d,v,f)),e.J=f,e.l=U(e.l);else{if(kt(e.d,e.C,u,1),4>B){if(kt(e.d,e.bb,e.l,1),B?(kt(e.d,e.hb,e.l,1),1==B?kt(e.d,e.Ub,e.l,0):(kt(e.d,e.Ub,e.l,1),kt(e.d,e.vc,e.l,B-2))):(kt(e.d,e.hb,e.l,0),1==P?kt(e.d,e._,u,0):kt(e.d,e._,u,1)),1==P?e.l=7>e.l?9:11:(Kr(e.i,e.d,P-2,k),e.l=7>e.l?8:11),m=e.v[B],0!=B){for(p=B;p>=1;--p)e.v[p]=e.v[p-1];e.v[0]=m}}else{for(kt(e.d,e.bb,e.l,0),e.l=7>e.l?7:10,Kr(e.$,e.d,P-2,k),B-=4,g=Tr(B),l=Q(P),mt(e.K[l],e.d,g),g>=4&&(d=(g>>1)-1,i=(2|1&g)<<d,S=B-i,14>g?Pt(e.Sb,i-g-1,e.d,d,S):(Rt(e.d,S>>4,d-4),pt(e.S,e.d,15&S),++e.Qb)),m=B,p=3;p>=1;--p)e.v[p]=e.v[p-1];e.v[0]=m,++e.Mb}e.J=C(e.b,P-1-e.s)}if(e.s-=P,e.g=o(e.g,a(P)),!e.s){if(e.Mb>=128&&wr(e),e.Qb>=16&&br(e),r[0]=e.g,t[0]=Mt(e.d),!F(e.b))return void Er(e,c(e.g));if(s(h(e.g,R),[4096,0])>=0)return e.pc=0,void(n[0]=0)}}}}function Mr(e){var r,t;e.b||(r={},t=4,e.X||(t=2),Z(r,t),e.b=r),Ur(e.A,e.eb,e.fb),(e.ab!=e.wb||e.Hb!=e.n)&&(A(e.b,e.ab,4096,e.n,274),e.wb=e.ab,e.Hb=e.n)}function Dr(e){var r;for(e.v=t(4),e.a=[],e.d={},e.C=t(192),e.bb=t(12),e.hb=t(12),e.Ub=t(12),e.vc=t(12),e._=t(192),e.K=[],e.Sb=t(114),e.S=ft({},4),e.$=qr({}),e.i=qr({}),e.A={},e.m=[],e.P=[],e.lb=[],e.nc=t(16),e.x=t(4),e.Q=t(4),e.Xb=[Gt],e.uc=[Gt],e.Kc=[0],e.fc=t(5),e.yc=t(128),e.vb=0,e.X=1,e.D=0,e.Hb=-1,e.mb=0,r=0;4096>r;++r)e.a[r]={};for(r=0;4>r;++r)e.K[r]=ft({},6);return e}function br(e){for(var r=0;16>r;++r)e.nc[r]=ht(e.S,r);e.Qb=0}function wr(e){var r,t,o,n,s,i,_,a;for(n=4;128>n;++n)i=Tr(n),o=(i>>1)-1,r=(2|1&i)<<o,e.yc[n]=lt(e.Sb,r-i-1,o,n-r);for(s=0;4>s;++s){for(t=e.K[s],_=s<<6,i=0;e.$b>i;++i)e.P[_+i]=dt(t,i);for(i=14;e.$b>i;++i)e.P[_+i]+=(i>>1)-1-4<<6;for(a=128*s,n=0;4>n;++n)e.lb[a+n]=e.P[_+n];for(;128>n;++n)e.lb[a+n]=e.P[_+Tr(n)]+e.yc[n]}e.Mb=0}function Er(e,r){Nr(e),Wr(e,r&e.y);for(var t=0;5>t;++t)bt(e.d)}function Lr(e,r){var t,o,n,s,i,_,a,c,u,f,m,d,p,h,P,l,v,B,S,g,k,R,M,D,b,w,E,L,y,I,x,N,O,A,H,G,W,T,Z,Y,V,j,$,K,q,J,Q,X,er,rr;if(e.jb!=e.q)return p=e.a[e.q].r-e.q,e.mb=e.a[e.q].j,e.q=e.a[e.q].r,p;if(e.q=e.jb=0,e.N?(d=e.vb,e.N=0):d=xr(e),E=e.D,b=F(e.b)+1,2>b)return e.mb=-1,1;for(b>273&&(b=273),Y=0,u=0;4>u;++u)e.x[u]=e.v[u],e.Q[u]=z(e.b,-1,e.x[u],273),e.Q[u]>e.Q[Y]&&(Y=u);if(e.Q[Y]>=e.n)return e.mb=Y,p=e.Q[Y],Ir(e,p-1),p;if(d>=e.n)return e.mb=e.m[E-1]+4,Ir(e,d-1),d;if(a=C(e.b,-1),v=C(e.b,-e.v[0]-1-1),2>d&&a!=v&&2>e.Q[Y])return e.mb=-1,1;if(e.a[0].Hc=e.l,A=r&e.y,e.a[1].z=Yt[e.C[(e.l<<4)+A]>>>2]+nt(Xr(e.A,r,e.J),e.l>=7,v,a),st(e.a[1]),B=Yt[2048-e.C[(e.l<<4)+A]>>>2],Z=B+Yt[2048-e.bb[e.l]>>>2],v==a&&(V=Z+zr(e,e.l,A),e.a[1].z>V&&(e.a[1].z=V,it(e.a[1]))),m=d>=e.Q[Y]?d:e.Q[Y],2>m)return e.mb=e.a[1].j,1;e.a[1].r=0,e.a[0].bc=e.x[0],e.a[0].ac=e.x[1],e.a[0].dc=e.x[2],e.a[0].lc=e.x[3],f=m;do e.a[f--].z=268435455;while(f>=2);for(u=0;4>u;++u)if(T=e.Q[u],!(2>T)){G=Z+Cr(e,u,e.l,A);do s=G+Jr(e.i,T-2,A),x=e.a[T],x.z>s&&(x.z=s,x.r=0,x.j=u,x.t=0);while(--T>=2)}if(D=B+Yt[e.bb[e.l]>>>2],f=e.Q[0]>=2?e.Q[0]+1:2,d>=f){for(L=0;f>e.m[L];)L+=2;for(;c=e.m[L+1],s=D+yr(e,c,f,A),x=e.a[f],x.z>s&&(x.z=s,x.r=0,x.j=c+4,x.t=0),f!=e.m[L]||(L+=2,L!=E);++f);}for(t=0;;){if(++t,t==m)return gr(e,t);if(S=xr(e),E=e.D,S>=e.n)return e.vb=S,e.N=1,gr(e,t);if(++r,O=e.a[t].r,e.a[t].t?(--O,e.a[t].Ac?($=e.a[e.a[t].r2].Hc,$=4>e.a[t].j2?7>$?8:11:7>$?7:10):$=e.a[O].Hc,$=U($)):$=e.a[O].Hc,O==t-1?$=e.a[t].j?U($):7>$?9:11:(e.a[t].t&&e.a[t].Ac?(O=e.a[t].r2,N=e.a[t].j2,$=7>$?8:11):(N=e.a[t].j,$=4>N?7>$?8:11:7>$?7:10),I=e.a[O],4>N?N?1==N?(e.x[0]=I.ac,e.x[1]=I.bc,e.x[2]=I.dc,e.x[3]=I.lc):2==N?(e.x[0]=I.dc,e.x[1]=I.bc,e.x[2]=I.ac,e.x[3]=I.lc):(e.x[0]=I.lc,e.x[1]=I.bc,e.x[2]=I.ac,e.x[3]=I.dc):(e.x[0]=I.bc,e.x[1]=I.ac,e.x[2]=I.dc,e.x[3]=I.lc):(e.x[0]=N-4,e.x[1]=I.bc,e.x[2]=I.ac,e.x[3]=I.dc)),e.a[t].Hc=$,e.a[t].bc=e.x[0],e.a[t].ac=e.x[1],e.a[t].dc=e.x[2],e.a[t].lc=e.x[3],_=e.a[t].z,a=C(e.b,-1),v=C(e.b,-e.x[0]-1-1),A=r&e.y,o=_+Yt[e.C[($<<4)+A]>>>2]+nt(Xr(e.A,r,C(e.b,-2)),$>=7,v,a),R=e.a[t+1],g=0,R.z>o&&(R.z=o,R.r=t,R.j=-1,R.t=0,g=1),B=_+Yt[2048-e.C[($<<4)+A]>>>2],Z=B+Yt[2048-e.bb[$]>>>2],v!=a||t>R.r&&!R.j||(V=Z+(Yt[e.hb[$]>>>2]+Yt[e._[($<<4)+A]>>>2]),R.z>=V&&(R.z=V,R.r=t,R.j=0,R.t=0,g=1)),w=F(e.b)+1,w=w>4095-t?4095-t:w,b=w,!(2>b)){if(b>e.n&&(b=e.n),!g&&v!=a&&(q=Math.min(w-1,e.n),P=z(e.b,0,e.x[0],q),P>=2)){for(K=U($),H=r+1&e.y,M=o+Yt[2048-e.C[(K<<4)+H]>>>2]+Yt[2048-e.bb[K]>>>2],y=t+1+P;y>m;)e.a[++m].z=268435455;s=M+(J=Jr(e.i,P-2,H),J+Cr(e,0,K,H)),x=e.a[y],x.z>s&&(x.z=s,x.r=t+1,x.j=0,x.t=1,x.Ac=0)}for(j=2,W=0;4>W;++W)if(h=z(e.b,-1,e.x[W],b),!(2>h)){l=h;do{for(;t+h>m;)e.a[++m].z=268435455;s=Z+(Q=Jr(e.i,h-2,A),Q+Cr(e,W,$,A)),x=e.a[t+h],x.z>s&&(x.z=s,x.r=t,x.j=W,x.t=0)}while(--h>=2);if(h=l,W||(j=h+1),w>h&&(q=Math.min(w-1-h,e.n),P=z(e.b,h,e.x[W],q),P>=2)){for(K=7>$?8:11,H=r+h&e.y,n=Z+(X=Jr(e.i,h-2,A),X+Cr(e,W,$,A))+Yt[e.C[(K<<4)+H]>>>2]+nt(Xr(e.A,r+h,C(e.b,h-1-1)),1,C(e.b,h-1-(e.x[W]+1)),C(e.b,h-1)),K=U(K),H=r+h+1&e.y,k=n+Yt[2048-e.C[(K<<4)+H]>>>2],M=k+Yt[2048-e.bb[K]>>>2],y=h+1+P;t+y>m;)e.a[++m].z=268435455;s=M+(er=Jr(e.i,P-2,H),er+Cr(e,0,K,H)),x=e.a[t+y],x.z>s&&(x.z=s,x.r=t+h+1,x.j=0,x.t=1,x.Ac=1,x.r2=t,x.j2=W)}}if(S>b){for(S=b,E=0;S>e.m[E];E+=2);e.m[E]=S,E+=2}if(S>=j){for(D=B+Yt[e.bb[$]>>>2];t+S>m;)e.a[++m].z=268435455;for(L=0;j>e.m[L];)L+=2;for(h=j;;++h)if(i=e.m[L+1],s=D+yr(e,i,h,A),x=e.a[t+h],x.z>s&&(x.z=s,x.r=t,x.j=i+4,x.t=0),h==e.m[L]){if(w>h&&(q=Math.min(w-1-h,e.n),P=z(e.b,h,i,q),P>=2)){for(K=7>$?7:10,H=r+h&e.y,n=s+Yt[e.C[(K<<4)+H]>>>2]+nt(Xr(e.A,r+h,C(e.b,h-1-1)),1,C(e.b,h-(i+1)-1),C(e.b,h-1)),K=U(K),H=r+h+1&e.y,k=n+Yt[2048-e.C[(K<<4)+H]>>>2],M=k+Yt[2048-e.bb[K]>>>2],y=h+1+P;t+y>m;)e.a[++m].z=268435455;s=M+(rr=Jr(e.i,P-2,H),rr+Cr(e,0,K,H)),x=e.a[t+y],x.z>s&&(x.z=s,x.r=t+h+1,x.j=0,x.t=1,x.Ac=1,x.r2=t,x.j2=i+4)}if(L+=2,L==E)break}}}}}function yr(e,r,t,o){var n,s=Q(t);return n=128>r?e.lb[128*s+r]:e.P[(s<<6)+Zr(r)]+e.nc[15&r],n+Jr(e.$,t-2,o)}function Cr(e,r,t,o){var n;return r?(n=Yt[2048-e.hb[t]>>>2],1==r?n+=Yt[e.Ub[t]>>>2]:(n+=Yt[2048-e.Ub[t]>>>2],n+=wt(e.vc[t],r-2))):(n=Yt[e.hb[t]>>>2],n+=Yt[2048-e._[(t<<4)+o]>>>2]),n}function zr(e,r,t){return Yt[e.hb[r]>>>2]+Yt[e._[(r<<4)+t]>>>2]}function Fr(e){kr(e),Dt(e.d),gt(e.C),gt(e._),gt(e.bb),gt(e.hb),gt(e.Ub),gt(e.vc),gt(e.Sb),et(e.A);for(var r=0;4>r;++r)gt(e.K[r].G);jr(e.$,1<<e.Y),jr(e.i,1<<e.Y),gt(e.S.G),e.N=0,e.jb=0,e.q=0,e.s=0}function Ir(e,r){r>0&&(Y(e.b,r),e.s+=r)}function xr(e){var r=0;return e.D=H(e.b,e.m),e.D>0&&(r=e.m[e.D-2],r==e.n&&(r+=z(e.b,r-1,e.m[e.D-1],273-r))),++e.s,r}function Nr(e){e.b&&e.W&&(e.b.cc=null,e.W=0)}function Or(e){Nr(e),e.d.Ab=null}function Ar(e,r){e.ab=r;for(var t=0;r>1<<t;++t);e.$b=2*t}function Hr(e,r){var t=e.X;e.X=r,e.b&&t!=e.X&&(e.wb=-1,e.b=null)}function Gr(e,r){e.fc[0]=9*(5*e.Y+e.eb)+e.fb<<24>>24;for(var t=0;4>t;++t)e.fc[1+t]=e.ab>>8*t<<24>>24;k(r,e.fc,0,5)}function Wr(e,r){if(e.Gc){kt(e.d,e.C,(e.l<<4)+r,1),kt(e.d,e.bb,e.l,0),e.l=7>e.l?7:10,Kr(e.$,e.d,0,r);var t=Q(2);mt(e.K[t],e.d,63),Rt(e.d,67108863,26),pt(e.S,e.d,15)}}function Tr(e){return 2048>e?Zt[e]:2097152>e?Zt[e>>10]+20:Zt[e>>20]+40}function Zr(e){return 131072>e?Zt[e>>6]+12:134217728>e?Zt[e>>16]+32:Zt[e>>26]+52}function Yr(e,r,t,o){8>t?(kt(r,e.db,0,0),mt(e.Vb[o],r,t)):(t-=8,kt(r,e.db,0,1),8>t?(kt(r,e.db,1,0),mt(e.Wb[o],r,t)):(kt(r,e.db,1,1),mt(e.ic,r,t-8)))}function Vr(e){e.db=t(2),e.Vb=t(16),e.Wb=t(16),e.ic=ft({},8);for(var r=0;16>r;++r)e.Vb[r]=ft({},3),e.Wb[r]=ft({},3);return e}function jr(e,r){gt(e.db);for(var t=0;r>t;++t)gt(e.Vb[t].G),gt(e.Wb[t].G);gt(e.ic.G)}function $r(e,r,t,o,n){var s,i,_,a,c;for(s=Yt[e.db[0]>>>2],i=Yt[2048-e.db[0]>>>2],_=i+Yt[e.db[1]>>>2],a=i+Yt[2048-e.db[1]>>>2],c=0,c=0;8>c;++c){if(c>=t)return;o[n+c]=s+dt(e.Vb[r],c)}for(;16>c;++c){if(c>=t)return;o[n+c]=_+dt(e.Wb[r],c-8)}for(;t>c;++c)o[n+c]=a+dt(e.ic,c-8-8)}function Kr(e,r,t,o){Yr(e,r,t,o),0==--e.sc[o]&&($r(e,o,e.rb,e.Cc,272*o),e.sc[o]=e.rb)}function qr(e){return Vr(e),e.Cc=[],e.sc=[],e}function Jr(e,r,t){return e.Cc[272*t+r]}function Qr(e,r){for(var t=0;r>t;++t)$r(e,t,e.rb,e.Cc,272*t),e.sc[t]=e.rb}function Ur(e,r,o){var n,s;if(null==e.V||e.u!=o||e.I!=r)for(e.I=r,e.qc=(1<<r)-1,e.u=o,s=1<<e.u+e.I,e.V=t(s),n=0;s>n;++n)e.V[n]=ot({})}function Xr(e,r,t){return e.V[((r&e.qc)<<e.u)+((255&t)>>>8-e.u)]}function et(e){var r,t=1<<e.u+e.I;for(r=0;t>r;++r)gt(e.V[r].tb)}function rt(e,r,t){var o,n,s=1;for(n=7;n>=0;--n)o=t>>n&1,kt(r,e.tb,s,o),s=s<<1|o}function tt(e,r,t,o){var n,s,i,_,a=1,c=1;for(s=7;s>=0;--s)n=o>>s&1,_=c,a&&(i=t>>s&1,_+=1+i<<8,a=i==n),kt(r,e.tb,_,n),c=c<<1|n}function ot(e){return e.tb=t(768),e}function nt(e,r,t,o){var n,s,i=1,_=7,a=0;if(r)for(;_>=0;--_)if(s=t>>_&1,n=o>>_&1,a+=wt(e.tb[(1+s<<8)+i],n),i=i<<1|n,s!=n){--_;break}for(;_>=0;--_)n=o>>_&1,a+=wt(e.tb[i],n),i=i<<1|n;return a}function st(e){e.j=-1,e.t=0}function it(e){e.j=0,e.t=0}function _t(e,r){return e.F=r,e.G=t(1<<r),e}function at(e,r){var t,o=1;for(t=e.F;0!=t;--t)o=(o<<1)+vt(r,e.G,o);return o-(1<<e.F)}function ct(e,r){var t,o,n=1,s=0;for(o=0;e.F>o;++o)t=vt(r,e.G,n),n<<=1,n+=t,s|=t<<o;return s}function ut(e,r,t,o){var n,s,i=1,_=0;for(s=0;o>s;++s)n=vt(t,e,r+i),i<<=1,i+=n,_|=n<<s;return _}function ft(e,r){return e.F=r,e.G=t(1<<r),e}function mt(e,r,t){var o,n,s=1;for(n=e.F;0!=n;)--n,o=t>>>n&1,kt(r,e.G,s,o),s=s<<1|o}function dt(e,r){var t,o,n=1,s=0;for(o=e.F;0!=o;)--o,t=r>>>o&1,s+=wt(e.G[n],t),n=(n<<1)+t;return s}function pt(e,r,t){var o,n,s=1;for(n=0;e.F>n;++n)o=1&t,kt(r,e.G,s,o),s=s<<1|o,t>>=1}function ht(e,r){var t,o,n=1,s=0;for(o=e.F;0!=o;--o)t=1&r,r>>>=1,s+=wt(e.G[n],t),n=n<<1|t;return s}function Pt(e,r,t,o,n){var s,i,_=1;for(i=0;o>i;++i)s=1&n,kt(t,e,r+_,s),_=_<<1|s,n>>=1}function lt(e,r,t,o){var n,s,i=1,_=0;for(s=t;0!=s;--s)n=1&o,o>>>=1,_+=Yt[(2047&(e[r+i]-n^-n))>>>2],i=i<<1|n;return _}function vt(e,r,t){var o,n=r[t];return o=(e.E>>>11)*n,(-2147483648^o)>(-2147483648^e.Bb)?(e.E=o,r[t]=n+(2048-n>>>5)<<16>>16,-16777216&e.E||(e.Bb=e.Bb<<8|l(e.Ab),e.E<<=8),0):(e.E-=o,e.Bb-=o,r[t]=n-(n>>>5)<<16>>16,-16777216&e.E||(e.Bb=e.Bb<<8|l(e.Ab),e.E<<=8),1)}function Bt(e,r){var t,o,n=0;for(t=r;0!=t;--t)e.E>>>=1,o=e.Bb-e.E>>>31,e.Bb-=e.E&o-1,n=n<<1|1-o,-16777216&e.E||(e.Bb=e.Bb<<8|l(e.Ab),e.E<<=8);return n}function St(e){e.Bb=0,e.E=-1;for(var r=0;5>r;++r)e.Bb=e.Bb<<8|l(e.Ab)}function gt(e){for(var r=e.length-1;r>=0;--r)e[r]=1024}function kt(e,r,t,s){var i,_=r[t];i=(e.E>>>11)*_,s?(e.xc=o(e.xc,n(a(i),[4294967295,0])),e.E-=i,r[t]=_-(_>>>5)<<16>>16):(e.E=i,r[t]=_+(2048-_>>>5)<<16>>16),-16777216&e.E||(e.E<<=8,bt(e))}function Rt(e,r,t){for(var n=t-1;n>=0;--n)e.E>>>=1,1==(r>>>n&1)&&(e.xc=o(e.xc,a(e.E))),-16777216&e.E||(e.E<<=8,bt(e))}function Mt(e){return o(o(a(e.Jb),e.mc),[4,0])}function Dt(e){e.mc=Gt,e.xc=Gt,e.E=-1,e.Jb=1,e.Oc=0}function bt(e){var r,t=c(p(e.xc,32));if(0!=t||s(e.xc,[4278190080,0])<0){e.mc=o(e.mc,a(e.Jb)),r=e.Oc;do g(e.Ab,r+t),r=255;while(0!=--e.Jb);e.Oc=c(e.xc)>>>24}++e.Jb,e.xc=m(n(e.xc,[16777215,0]),8)}function wt(e,r){return Yt[(2047&(e-r^-r))>>>2]}function Et(e){for(var r,t,o,n=0,s=0,i=e.length,_=[],a=[];i>n;++n,++s){if(r=255&e[n],128&r)if(192==(224&r)){if(n+1>=i)return e;if(t=255&e[++n],128!=(192&t))return e;a[s]=(31&r)<<6|63&t}else{if(224!=(240&r))return e;\nif(n+2>=i)return e;if(t=255&e[++n],128!=(192&t))return e;if(o=255&e[++n],128!=(192&o))return e;a[s]=(15&r)<<12|(63&t)<<6|63&o}else{if(!r)return e;a[s]=r}16383==s&&(_.push(String.fromCharCode.apply(String,a)),s=-1)}return s>0&&(a.length=s,_.push(String.fromCharCode.apply(String,a))),_.join(\"\")}function Lt(e){var r,t,o,n=[],s=0,i=e.length;if(\"object\"==typeof e)return e;for(R(e,0,i,n,0),o=0;i>o;++o)r=n[o],r>=1&&127>=r?++s:s+=!r||r>=128&&2047>=r?2:3;for(t=[],s=0,o=0;i>o;++o)r=n[o],r>=1&&127>=r?t[s++]=r<<24>>24:!r||r>=128&&2047>=r?(t[s++]=(192|r>>6&31)<<24>>24,t[s++]=(128|63&r)<<24>>24):(t[s++]=(224|r>>12&15)<<24>>24,t[s++]=(128|r>>6&63)<<24>>24,t[s++]=(128|63&r)<<24>>24);return t}function yt(e){return e[1]+e[0]}function Ct(e,t,o,n){function s(){try{for(var e,r=(new Date).getTime();rr(a.c.yb);)if(i=yt(a.c.yb.Pb)/yt(a.c.Tb),(new Date).getTime()-r>200)return n(i),Nt(s,0),0;n(1),e=S(a.c.Nb),Nt(o.bind(null,e),0)}catch(t){o(null,t)}}var i,_,a={},c=void 0===o&&void 0===n;if(\"function\"!=typeof o&&(_=o,o=n=0),n=n||function(e){return void 0!==_?r(e,_):void 0},o=o||function(e,r){return void 0!==_?postMessage({action:Ft,cbn:_,result:e,error:r}):void 0},c){for(a.c=w({},Lt(e),Vt(t));rr(a.c.yb););return S(a.c.Nb)}try{a.c=w({},Lt(e),Vt(t)),n(0)}catch(u){return o(null,u)}Nt(s,0)}function zt(e,t,o){function n(){try{for(var e,r=0,i=(new Date).getTime();rr(c.d.yb);)if(++r%1e3==0&&(new Date).getTime()-i>200)return _&&(s=yt(c.d.yb.Z.g)/a,o(s)),Nt(n,0),0;o(1),e=Et(S(c.d.Nb)),Nt(t.bind(null,e),0)}catch(u){t(null,u)}}var s,i,_,a,c={},u=void 0===t&&void 0===o;if(\"function\"!=typeof t&&(i=t,t=o=0),o=o||function(e){return void 0!==i?r(_?e:-1,i):void 0},t=t||function(e,r){return void 0!==i?postMessage({action:It,cbn:i,result:e,error:r}):void 0},u){for(c.d=L({},e);rr(c.d.yb););return Et(S(c.d.Nb))}try{c.d=L({},e),a=yt(c.d.Tb),_=a>-1,o(0)}catch(f){return t(null,f)}Nt(n,0)}var Ft=1,It=2,xt=3,Nt=\"function\"==typeof setImmediate?setImmediate:setTimeout,Ot=4294967296,At=[4294967295,-Ot],Ht=[0,-0x8000000000000000],Gt=[0,0],Wt=[1,0],Tt=function(){var e,r,t,o=[];for(e=0;256>e;++e){for(t=e,r=0;8>r;++r)0!=(1&t)?t=t>>>1^-306674912:t>>>=1;o[e]=t}return o}(),Zt=function(){var e,r,t,o=2,n=[0,1];for(t=2;22>t;++t)for(r=1<<(t>>1)-1,e=0;r>e;++e,++o)n[o]=t<<24>>24;return n}(),Yt=function(){var e,r,t,o,n=[];for(r=8;r>=0;--r)for(o=1<<9-r-1,e=1<<9-r,t=o;e>t;++t)n[t]=(r<<6)+(e-t<<6>>>9-r-1);return n}(),Vt=function(){var e=[{s:16,f:64,m:0},{s:20,f:64,m:0},{s:19,f:64,m:1},{s:20,f:64,m:1},{s:21,f:128,m:1},{s:22,f:128,m:1},{s:23,f:128,m:1},{s:24,f:255,m:1},{s:25,f:255,m:1}];return function(r){return e[r-1]||e[6]}}();return\"undefined\"==typeof onmessage||\"undefined\"!=typeof window&&void 0!==window.document||!function(){onmessage=function(r){r&&r.gc&&(r.gc.action==It?e.decompress(r.gc.gc,r.gc.cbn):r.gc.action==Ft&&e.compress(r.gc.gc,r.gc.Rc,r.gc.cbn))}}(),{compress:Ct,decompress:zt}}();this.LZMA=this.LZMA_WORKER=e;"
  },
  {
    "path": "dependencies/webgl-debug.js",
    "content": "/*\n** Copyright (c) 2012 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n// Various functions for helping debug WebGL apps.\n\nWebGLDebugUtils = function() {\n\n/**\n * Wrapped logging function.\n * @param {string} msg Message to log.\n */\nvar log = function(msg) {\n  if (window.console && window.console.log) {\n    window.console.log(msg);\n  }\n};\n\n/**\n * Wrapped error logging function.\n * @param {string} msg Message to log.\n */\nvar error = function(msg) {\n  if (window.console && window.console.error) {\n    window.console.error(msg);\n  } else {\n    log(msg);\n  }\n};\n\n\n/**\n * Which arguments are enums based on the number of arguments to the function.\n * So\n *    'texImage2D': {\n *       9: { 0:true, 2:true, 6:true, 7:true },\n *       6: { 0:true, 2:true, 3:true, 4:true },\n *    },\n *\n * means if there are 9 arguments then 6 and 7 are enums, if there are 6\n * arguments 3 and 4 are enums\n *\n * @type {!Object.<number, !Object.<number, string>}\n */\nvar glValidEnumContexts = {\n  // Generic setters and getters\n\n  'enable': {1: { 0:true }},\n  'disable': {1: { 0:true }},\n  'getParameter': {1: { 0:true }},\n\n  // Rendering\n\n  'drawArrays': {3:{ 0:true }},\n  'drawElements': {4:{ 0:true, 2:true }},\n\n  // Shaders\n\n  'createShader': {1: { 0:true }},\n  'getShaderParameter': {2: { 1:true }},\n  'getProgramParameter': {2: { 1:true }},\n  'getShaderPrecisionFormat': {2: { 0: true, 1:true }},\n\n  // Vertex attributes\n\n  'getVertexAttrib': {2: { 1:true }},\n  'vertexAttribPointer': {6: { 2:true }},\n\n  // Textures\n\n  'bindTexture': {2: { 0:true }},\n  'activeTexture': {1: { 0:true }},\n  'getTexParameter': {2: { 0:true, 1:true }},\n  'texParameterf': {3: { 0:true, 1:true }},\n  'texParameteri': {3: { 0:true, 1:true, 2:true }},\n  'texImage2D': {\n     9: { 0:true, 2:true, 6:true, 7:true },\n     6: { 0:true, 2:true, 3:true, 4:true }\n  },\n  'texSubImage2D': {\n    9: { 0:true, 6:true, 7:true },\n    7: { 0:true, 4:true, 5:true }\n  },\n  'copyTexImage2D': {8: { 0:true, 2:true }},\n  'copyTexSubImage2D': {8: { 0:true }},\n  'generateMipmap': {1: { 0:true }},\n  'compressedTexImage2D': {7: { 0: true, 2:true }},\n  'compressedTexSubImage2D': {8: { 0: true, 6:true }},\n\n  // Buffer objects\n\n  'bindBuffer': {2: { 0:true }},\n  'bufferData': {3: { 0:true, 2:true }},\n  'bufferSubData': {3: { 0:true }},\n  'getBufferParameter': {2: { 0:true, 1:true }},\n\n  // Renderbuffers and framebuffers\n\n  'pixelStorei': {2: { 0:true, 1:true }},\n  'readPixels': {7: { 4:true, 5:true }},\n  'bindRenderbuffer': {2: { 0:true }},\n  'bindFramebuffer': {2: { 0:true }},\n  'checkFramebufferStatus': {1: { 0:true }},\n  'framebufferRenderbuffer': {4: { 0:true, 1:true, 2:true }},\n  'framebufferTexture2D': {5: { 0:true, 1:true, 2:true }},\n  'getFramebufferAttachmentParameter': {3: { 0:true, 1:true, 2:true }},\n  'getRenderbufferParameter': {2: { 0:true, 1:true }},\n  'renderbufferStorage': {4: { 0:true, 1:true }},\n\n  // Frame buffer operations (clear, blend, depth test, stencil)\n\n  'clear': {1: { 0: { 'enumBitwiseOr': ['COLOR_BUFFER_BIT', 'DEPTH_BUFFER_BIT', 'STENCIL_BUFFER_BIT'] }}},\n  'depthFunc': {1: { 0:true }},\n  'blendFunc': {2: { 0:true, 1:true }},\n  'blendFuncSeparate': {4: { 0:true, 1:true, 2:true, 3:true }},\n  'blendEquation': {1: { 0:true }},\n  'blendEquationSeparate': {2: { 0:true, 1:true }},\n  'stencilFunc': {3: { 0:true }},\n  'stencilFuncSeparate': {4: { 0:true, 1:true }},\n  'stencilMaskSeparate': {2: { 0:true }},\n  'stencilOp': {3: { 0:true, 1:true, 2:true }},\n  'stencilOpSeparate': {4: { 0:true, 1:true, 2:true, 3:true }},\n\n  // Culling\n\n  'cullFace': {1: { 0:true }},\n  'frontFace': {1: { 0:true }},\n\n  // ANGLE_instanced_arrays extension\n\n  'drawArraysInstancedANGLE': {4: { 0:true }},\n  'drawElementsInstancedANGLE': {5: { 0:true, 2:true }},\n\n  // EXT_blend_minmax extension\n\n  'blendEquationEXT': {1: { 0:true }}\n};\n\n/**\n * Map of numbers to names.\n * @type {Object}\n */\nvar glEnums = null;\n\n/**\n * Map of names to numbers.\n * @type {Object}\n */\nvar enumStringToValue = null;\n\n/**\n * Initializes this module. Safe to call more than once.\n * @param {!WebGLRenderingContext} ctx A WebGL context. If\n *    you have more than one context it doesn't matter which one\n *    you pass in, it is only used to pull out constants.\n */\nfunction init(ctx) {\n  if (glEnums == null) {\n    glEnums = { };\n    enumStringToValue = { };\n    for (var propertyName in ctx) {\n      if (typeof ctx[propertyName] == 'number') {\n        glEnums[ctx[propertyName]] = propertyName;\n        enumStringToValue[propertyName] = ctx[propertyName];\n      }\n    }\n  }\n}\n\n/**\n * Checks the utils have been initialized.\n */\nfunction checkInit() {\n  if (glEnums == null) {\n    throw 'WebGLDebugUtils.init(ctx) not called';\n  }\n}\n\n/**\n * Returns true or false if value matches any WebGL enum\n * @param {*} value Value to check if it might be an enum.\n * @return {boolean} True if value matches one of the WebGL defined enums\n */\nfunction mightBeEnum(value) {\n  checkInit();\n  return (glEnums[value] !== undefined);\n}\n\n/**\n * Gets an string version of an WebGL enum.\n *\n * Example:\n *   var str = WebGLDebugUtil.glEnumToString(ctx.getError());\n *\n * @param {number} value Value to return an enum for\n * @return {string} The string version of the enum.\n */\nfunction glEnumToString(value) {\n  checkInit();\n  var name = glEnums[value];\n  return (name !== undefined) ? (\"gl.\" + name) :\n      (\"/*UNKNOWN WebGL ENUM*/ 0x\" + value.toString(16) + \"\");\n}\n\n/**\n * Returns the string version of a WebGL argument.\n * Attempts to convert enum arguments to strings.\n * @param {string} functionName the name of the WebGL function.\n * @param {number} numArgs the number of arguments passed to the function.\n * @param {number} argumentIndx the index of the argument.\n * @param {*} value The value of the argument.\n * @return {string} The value as a string.\n */\nfunction glFunctionArgToString(functionName, numArgs, argumentIndex, value) {\n  var funcInfo = glValidEnumContexts[functionName];\n  if (funcInfo !== undefined) {\n    var funcInfo = funcInfo[numArgs];\n    if (funcInfo !== undefined) {\n      if (funcInfo[argumentIndex]) {\n        if (typeof funcInfo[argumentIndex] === 'object' &&\n            funcInfo[argumentIndex]['enumBitwiseOr'] !== undefined) {\n          var enums = funcInfo[argumentIndex]['enumBitwiseOr'];\n          var orResult = 0;\n          var orEnums = [];\n          for (var i = 0; i < enums.length; ++i) {\n            var enumValue = enumStringToValue[enums[i]];\n            if ((value & enumValue) !== 0) {\n              orResult |= enumValue;\n              orEnums.push(glEnumToString(enumValue));\n            }\n          }\n          if (orResult === value) {\n            return orEnums.join(' | ');\n          } else {\n            return glEnumToString(value);\n          }\n        } else {\n          return glEnumToString(value);\n        }\n      }\n    }\n  }\n  if (value === null) {\n    return \"null\";\n  } else if (value === undefined) {\n    return \"undefined\";\n  } else {\n    return value.toString();\n  }\n}\n\n/**\n * Converts the arguments of a WebGL function to a string.\n * Attempts to convert enum arguments to strings.\n *\n * @param {string} functionName the name of the WebGL function.\n * @param {number} args The arguments.\n * @return {string} The arguments as a string.\n */\nfunction glFunctionArgsToString(functionName, args) {\n  // apparently we can't do args.join(\",\");\n  var argStr = \"\";\n  var numArgs = args.length;\n  for (var ii = 0; ii < numArgs; ++ii) {\n    argStr += ((ii == 0) ? '' : ', ') +\n        glFunctionArgToString(functionName, numArgs, ii, args[ii]);\n  }\n  return argStr;\n};\n\n\nfunction makePropertyWrapper(wrapper, original, propertyName) {\n  //log(\"wrap prop: \" + propertyName);\n  wrapper.__defineGetter__(propertyName, function() {\n    return original[propertyName];\n  });\n  // TODO(gmane): this needs to handle properties that take more than\n  // one value?\n  wrapper.__defineSetter__(propertyName, function(value) {\n    //log(\"set: \" + propertyName);\n    original[propertyName] = value;\n  });\n}\n\n// Makes a function that calls a function on another object.\nfunction makeFunctionWrapper(original, functionName) {\n  //log(\"wrap fn: \" + functionName);\n  var f = original[functionName];\n  return function() {\n    //log(\"call: \" + functionName);\n    var result = f.apply(original, arguments);\n    return result;\n  };\n}\n\n/**\n * Given a WebGL context returns a wrapped context that calls\n * gl.getError after every command and calls a function if the\n * result is not gl.NO_ERROR.\n *\n * @param {!WebGLRenderingContext} ctx The webgl context to\n *        wrap.\n * @param {!function(err, funcName, args): void} opt_onErrorFunc\n *        The function to call when gl.getError returns an\n *        error. If not specified the default function calls\n *        console.log with a message.\n * @param {!function(funcName, args): void} opt_onFunc The\n *        function to call when each webgl function is called.\n *        You can use this to log all calls for example.\n * @param {!WebGLRenderingContext} opt_err_ctx The webgl context\n *        to call getError on if different than ctx.\n */\nfunction makeDebugContext(ctx, opt_onErrorFunc, opt_onFunc, opt_err_ctx) {\n  opt_err_ctx = opt_err_ctx || ctx;\n  init(ctx);\n  opt_onErrorFunc = opt_onErrorFunc || function(err, functionName, args) {\n        // apparently we can't do args.join(\",\");\n        var argStr = \"\";\n        var numArgs = args.length;\n        for (var ii = 0; ii < numArgs; ++ii) {\n          argStr += ((ii == 0) ? '' : ', ') +\n              glFunctionArgToString(functionName, numArgs, ii, args[ii]);\n        }\n        error(\"WebGL error \"+ glEnumToString(err) + \" in \"+ functionName +\n              \"(\" + argStr + \")\");\n      };\n\n  // Holds booleans for each GL error so after we get the error ourselves\n  // we can still return it to the client app.\n  var glErrorShadow = { };\n\n  // Makes a function that calls a WebGL function and then calls getError.\n  function makeErrorWrapper(ctx, functionName) {\n    return function() {\n      if (opt_onFunc) {\n        opt_onFunc(functionName, arguments);\n      }\n      var result = ctx[functionName].apply(ctx, arguments);\n      var err = opt_err_ctx.getError();\n      if (err != 0) {\n        glErrorShadow[err] = true;\n        opt_onErrorFunc(err, functionName, arguments);\n      }\n      return result;\n    };\n  }\n\n  // Make a an object that has a copy of every property of the WebGL context\n  // but wraps all functions.\n  var wrapper = {};\n  for (var propertyName in ctx) {\n    if (typeof ctx[propertyName] == 'function') {\n      if (propertyName != 'getExtension') {\n        wrapper[propertyName] = makeErrorWrapper(ctx, propertyName);\n      } else {\n        var wrapped = makeErrorWrapper(ctx, propertyName);\n        wrapper[propertyName] = function () {\n          var result = wrapped.apply(ctx, arguments);\n          return makeDebugContext(result, opt_onErrorFunc, opt_onFunc, opt_err_ctx);\n        };\n      }\n    } else {\n      makePropertyWrapper(wrapper, ctx, propertyName);\n    }\n  }\n\n  // Override the getError function with one that returns our saved results.\n  wrapper.getError = function() {\n    for (var err in glErrorShadow) {\n      if (glErrorShadow.hasOwnProperty(err)) {\n        if (glErrorShadow[err]) {\n          glErrorShadow[err] = false;\n          return err;\n        }\n      }\n    }\n    return ctx.NO_ERROR;\n  };\n\n  return wrapper;\n}\n\nfunction resetToInitialState(ctx) {\n  var numAttribs = ctx.getParameter(ctx.MAX_VERTEX_ATTRIBS);\n  var tmp = ctx.createBuffer();\n  ctx.bindBuffer(ctx.ARRAY_BUFFER, tmp);\n  for (var ii = 0; ii < numAttribs; ++ii) {\n    ctx.disableVertexAttribArray(ii);\n    ctx.vertexAttribPointer(ii, 4, ctx.FLOAT, false, 0, 0);\n    ctx.vertexAttrib1f(ii, 0);\n  }\n  ctx.deleteBuffer(tmp);\n\n  var numTextureUnits = ctx.getParameter(ctx.MAX_TEXTURE_IMAGE_UNITS);\n  for (var ii = 0; ii < numTextureUnits; ++ii) {\n    ctx.activeTexture(ctx.TEXTURE0 + ii);\n    ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, null);\n    ctx.bindTexture(ctx.TEXTURE_2D, null);\n  }\n\n  ctx.activeTexture(ctx.TEXTURE0);\n  ctx.useProgram(null);\n  ctx.bindBuffer(ctx.ARRAY_BUFFER, null);\n  ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null);\n  ctx.bindFramebuffer(ctx.FRAMEBUFFER, null);\n  ctx.bindRenderbuffer(ctx.RENDERBUFFER, null);\n  ctx.disable(ctx.BLEND);\n  ctx.disable(ctx.CULL_FACE);\n  ctx.disable(ctx.DEPTH_TEST);\n  ctx.disable(ctx.DITHER);\n  ctx.disable(ctx.SCISSOR_TEST);\n  ctx.blendColor(0, 0, 0, 0);\n  ctx.blendEquation(ctx.FUNC_ADD);\n  ctx.blendFunc(ctx.ONE, ctx.ZERO);\n  ctx.clearColor(0, 0, 0, 0);\n  ctx.clearDepth(1);\n  ctx.clearStencil(-1);\n  ctx.colorMask(true, true, true, true);\n  ctx.cullFace(ctx.BACK);\n  ctx.depthFunc(ctx.LESS);\n  ctx.depthMask(true);\n  ctx.depthRange(0, 1);\n  ctx.frontFace(ctx.CCW);\n  ctx.hint(ctx.GENERATE_MIPMAP_HINT, ctx.DONT_CARE);\n  ctx.lineWidth(1);\n  ctx.pixelStorei(ctx.PACK_ALIGNMENT, 4);\n  ctx.pixelStorei(ctx.UNPACK_ALIGNMENT, 4);\n  ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, false);\n  ctx.pixelStorei(ctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n  // TODO: Delete this IF.\n  if (ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL) {\n    ctx.pixelStorei(ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL, ctx.BROWSER_DEFAULT_WEBGL);\n  }\n  ctx.polygonOffset(0, 0);\n  ctx.sampleCoverage(1, false);\n  ctx.scissor(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.stencilFunc(ctx.ALWAYS, 0, 0xFFFFFFFF);\n  ctx.stencilMask(0xFFFFFFFF);\n  ctx.stencilOp(ctx.KEEP, ctx.KEEP, ctx.KEEP);\n  ctx.viewport(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT);\n\n  // TODO: This should NOT be needed but Firefox fails with 'hint'\n  while(ctx.getError());\n}\n\nfunction makeLostContextSimulatingCanvas(canvas) {\n  var unwrappedContext_;\n  var wrappedContext_;\n  var onLost_ = [];\n  var onRestored_ = [];\n  var wrappedContext_ = {};\n  var contextId_ = 1;\n  var contextLost_ = false;\n  var resourceId_ = 0;\n  var resourceDb_ = [];\n  var numCallsToLoseContext_ = 0;\n  var numCalls_ = 0;\n  var canRestore_ = false;\n  var restoreTimeout_ = 0;\n\n  // Holds booleans for each GL error so can simulate errors.\n  var glErrorShadow_ = { };\n\n  canvas.getContext = function(f) {\n    return function() {\n      var ctx = f.apply(canvas, arguments);\n      // Did we get a context and is it a WebGL context?\n      if (ctx instanceof WebGLRenderingContext) {\n        if (ctx != unwrappedContext_) {\n          if (unwrappedContext_) {\n            throw \"got different context\"\n          }\n          unwrappedContext_ = ctx;\n          wrappedContext_ = makeLostContextSimulatingContext(unwrappedContext_);\n        }\n        return wrappedContext_;\n      }\n      return ctx;\n    }\n  }(canvas.getContext);\n\n  function wrapEvent(listener) {\n    if (typeof(listener) == \"function\") {\n      return listener;\n    } else {\n      return function(info) {\n        listener.handleEvent(info);\n      }\n    }\n  }\n\n  var addOnContextLostListener = function(listener) {\n    onLost_.push(wrapEvent(listener));\n  };\n\n  var addOnContextRestoredListener = function(listener) {\n    onRestored_.push(wrapEvent(listener));\n  };\n\n\n  function wrapAddEventListener(canvas) {\n    var f = canvas.addEventListener;\n    canvas.addEventListener = function(type, listener, bubble) {\n      switch (type) {\n        case 'webglcontextlost':\n          addOnContextLostListener(listener);\n          break;\n        case 'webglcontextrestored':\n          addOnContextRestoredListener(listener);\n          break;\n        default:\n          f.apply(canvas, arguments);\n      }\n    };\n  }\n\n  wrapAddEventListener(canvas);\n\n  canvas.loseContext = function() {\n    if (!contextLost_) {\n      contextLost_ = true;\n      numCallsToLoseContext_ = 0;\n      ++contextId_;\n      while (unwrappedContext_.getError());\n      clearErrors();\n      glErrorShadow_[unwrappedContext_.CONTEXT_LOST_WEBGL] = true;\n      var event = makeWebGLContextEvent(\"context lost\");\n      var callbacks = onLost_.slice();\n      setTimeout(function() {\n          //log(\"numCallbacks:\" + callbacks.length);\n          for (var ii = 0; ii < callbacks.length; ++ii) {\n            //log(\"calling callback:\" + ii);\n            callbacks[ii](event);\n          }\n          if (restoreTimeout_ >= 0) {\n            setTimeout(function() {\n                canvas.restoreContext();\n              }, restoreTimeout_);\n          }\n        }, 0);\n    }\n  };\n\n  canvas.restoreContext = function() {\n    if (contextLost_) {\n      if (onRestored_.length) {\n        setTimeout(function() {\n            if (!canRestore_) {\n              throw \"can not restore. webglcontestlost listener did not call event.preventDefault\";\n            }\n            freeResources();\n            resetToInitialState(unwrappedContext_);\n            contextLost_ = false;\n            numCalls_ = 0;\n            canRestore_ = false;\n            var callbacks = onRestored_.slice();\n            var event = makeWebGLContextEvent(\"context restored\");\n            for (var ii = 0; ii < callbacks.length; ++ii) {\n              callbacks[ii](event);\n            }\n          }, 0);\n      }\n    }\n  };\n\n  canvas.loseContextInNCalls = function(numCalls) {\n    if (contextLost_) {\n      throw \"You can not ask a lost contet to be lost\";\n    }\n    numCallsToLoseContext_ = numCalls_ + numCalls;\n  };\n\n  canvas.getNumCalls = function() {\n    return numCalls_;\n  };\n\n  canvas.setRestoreTimeout = function(timeout) {\n    restoreTimeout_ = timeout;\n  };\n\n  function isWebGLObject(obj) {\n    //return false;\n    return (obj instanceof WebGLBuffer ||\n            obj instanceof WebGLFramebuffer ||\n            obj instanceof WebGLProgram ||\n            obj instanceof WebGLRenderbuffer ||\n            obj instanceof WebGLShader ||\n            obj instanceof WebGLTexture);\n  }\n\n  function checkResources(args) {\n    for (var ii = 0; ii < args.length; ++ii) {\n      var arg = args[ii];\n      if (isWebGLObject(arg)) {\n        return arg.__webglDebugContextLostId__ == contextId_;\n      }\n    }\n    return true;\n  }\n\n  function clearErrors() {\n    var k = Object.keys(glErrorShadow_);\n    for (var ii = 0; ii < k.length; ++ii) {\n      delete glErrorShadow_[k];\n    }\n  }\n\n  function loseContextIfTime() {\n    ++numCalls_;\n    if (!contextLost_) {\n      if (numCallsToLoseContext_ == numCalls_) {\n        canvas.loseContext();\n      }\n    }\n  }\n\n  // Makes a function that simulates WebGL when out of context.\n  function makeLostContextFunctionWrapper(ctx, functionName) {\n    var f = ctx[functionName];\n    return function() {\n      // log(\"calling:\" + functionName);\n      // Only call the functions if the context is not lost.\n      loseContextIfTime();\n      if (!contextLost_) {\n        //if (!checkResources(arguments)) {\n        //  glErrorShadow_[wrappedContext_.INVALID_OPERATION] = true;\n        //  return;\n        //}\n        var result = f.apply(ctx, arguments);\n        return result;\n      }\n    };\n  }\n\n  function freeResources() {\n    for (var ii = 0; ii < resourceDb_.length; ++ii) {\n      var resource = resourceDb_[ii];\n      if (resource instanceof WebGLBuffer) {\n        unwrappedContext_.deleteBuffer(resource);\n      } else if (resource instanceof WebGLFramebuffer) {\n        unwrappedContext_.deleteFramebuffer(resource);\n      } else if (resource instanceof WebGLProgram) {\n        unwrappedContext_.deleteProgram(resource);\n      } else if (resource instanceof WebGLRenderbuffer) {\n        unwrappedContext_.deleteRenderbuffer(resource);\n      } else if (resource instanceof WebGLShader) {\n        unwrappedContext_.deleteShader(resource);\n      } else if (resource instanceof WebGLTexture) {\n        unwrappedContext_.deleteTexture(resource);\n      }\n    }\n  }\n\n  function makeWebGLContextEvent(statusMessage) {\n    return {\n      statusMessage: statusMessage,\n      preventDefault: function() {\n          canRestore_ = true;\n        }\n    };\n  }\n\n  return canvas;\n\n  function makeLostContextSimulatingContext(ctx) {\n    // copy all functions and properties to wrapper\n    for (var propertyName in ctx) {\n      if (typeof ctx[propertyName] == 'function') {\n         wrappedContext_[propertyName] = makeLostContextFunctionWrapper(\n             ctx, propertyName);\n       } else {\n         makePropertyWrapper(wrappedContext_, ctx, propertyName);\n       }\n    }\n\n    // Wrap a few functions specially.\n    wrappedContext_.getError = function() {\n      loseContextIfTime();\n      if (!contextLost_) {\n        var err;\n        while (err = unwrappedContext_.getError()) {\n          glErrorShadow_[err] = true;\n        }\n      }\n      for (var err in glErrorShadow_) {\n        if (glErrorShadow_[err]) {\n          delete glErrorShadow_[err];\n          return err;\n        }\n      }\n      return wrappedContext_.NO_ERROR;\n    };\n\n    var creationFunctions = [\n      \"createBuffer\",\n      \"createFramebuffer\",\n      \"createProgram\",\n      \"createRenderbuffer\",\n      \"createShader\",\n      \"createTexture\"\n    ];\n    for (var ii = 0; ii < creationFunctions.length; ++ii) {\n      var functionName = creationFunctions[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return null;\n          }\n          var obj = f.apply(ctx, arguments);\n          obj.__webglDebugContextLostId__ = contextId_;\n          resourceDb_.push(obj);\n          return obj;\n        };\n      }(ctx[functionName]);\n    }\n\n    var functionsThatShouldReturnNull = [\n      \"getActiveAttrib\",\n      \"getActiveUniform\",\n      \"getBufferParameter\",\n      \"getContextAttributes\",\n      \"getAttachedShaders\",\n      \"getFramebufferAttachmentParameter\",\n      \"getParameter\",\n      \"getProgramParameter\",\n      \"getProgramInfoLog\",\n      \"getRenderbufferParameter\",\n      \"getShaderParameter\",\n      \"getShaderInfoLog\",\n      \"getShaderSource\",\n      \"getTexParameter\",\n      \"getUniform\",\n      \"getUniformLocation\",\n      \"getVertexAttrib\"\n    ];\n    for (var ii = 0; ii < functionsThatShouldReturnNull.length; ++ii) {\n      var functionName = functionsThatShouldReturnNull[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return null;\n          }\n          return f.apply(ctx, arguments);\n        }\n      }(wrappedContext_[functionName]);\n    }\n\n    var isFunctions = [\n      \"isBuffer\",\n      \"isEnabled\",\n      \"isFramebuffer\",\n      \"isProgram\",\n      \"isRenderbuffer\",\n      \"isShader\",\n      \"isTexture\"\n    ];\n    for (var ii = 0; ii < isFunctions.length; ++ii) {\n      var functionName = isFunctions[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return false;\n          }\n          return f.apply(ctx, arguments);\n        }\n      }(wrappedContext_[functionName]);\n    }\n\n    wrappedContext_.checkFramebufferStatus = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return wrappedContext_.FRAMEBUFFER_UNSUPPORTED;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.checkFramebufferStatus);\n\n    wrappedContext_.getAttribLocation = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return -1;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.getAttribLocation);\n\n    wrappedContext_.getVertexAttribOffset = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return 0;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.getVertexAttribOffset);\n\n    wrappedContext_.isContextLost = function() {\n      return contextLost_;\n    };\n\n    return wrappedContext_;\n  }\n}\n\nreturn {\n  /**\n   * Initializes this module. Safe to call more than once.\n   * @param {!WebGLRenderingContext} ctx A WebGL context. If\n   *    you have more than one context it doesn't matter which one\n   *    you pass in, it is only used to pull out constants.\n   */\n  'init': init,\n\n  /**\n   * Returns true or false if value matches any WebGL enum\n   * @param {*} value Value to check if it might be an enum.\n   * @return {boolean} True if value matches one of the WebGL defined enums\n   */\n  'mightBeEnum': mightBeEnum,\n\n  /**\n   * Gets an string version of an WebGL enum.\n   *\n   * Example:\n   *   WebGLDebugUtil.init(ctx);\n   *   var str = WebGLDebugUtil.glEnumToString(ctx.getError());\n   *\n   * @param {number} value Value to return an enum for\n   * @return {string} The string version of the enum.\n   */\n  'glEnumToString': glEnumToString,\n\n  /**\n   * Converts the argument of a WebGL function to a string.\n   * Attempts to convert enum arguments to strings.\n   *\n   * Example:\n   *   WebGLDebugUtil.init(ctx);\n   *   var str = WebGLDebugUtil.glFunctionArgToString('bindTexture', 2, 0, gl.TEXTURE_2D);\n   *\n   * would return 'TEXTURE_2D'\n   *\n   * @param {string} functionName the name of the WebGL function.\n   * @param {number} numArgs The number of arguments\n   * @param {number} argumentIndx the index of the argument.\n   * @param {*} value The value of the argument.\n   * @return {string} The value as a string.\n   */\n  'glFunctionArgToString': glFunctionArgToString,\n\n  /**\n   * Converts the arguments of a WebGL function to a string.\n   * Attempts to convert enum arguments to strings.\n   *\n   * @param {string} functionName the name of the WebGL function.\n   * @param {number} args The arguments.\n   * @return {string} The arguments as a string.\n   */\n  'glFunctionArgsToString': glFunctionArgsToString,\n\n  /**\n   * Given a WebGL context returns a wrapped context that calls\n   * gl.getError after every command and calls a function if the\n   * result is not NO_ERROR.\n   *\n   * You can supply your own function if you want. For example, if you'd like\n   * an exception thrown on any GL error you could do this\n   *\n   *    function throwOnGLError(err, funcName, args) {\n   *      throw WebGLDebugUtils.glEnumToString(err) +\n   *            \" was caused by call to \" + funcName;\n   *    };\n   *\n   *    ctx = WebGLDebugUtils.makeDebugContext(\n   *        canvas.getContext(\"webgl\"), throwOnGLError);\n   *\n   * @param {!WebGLRenderingContext} ctx The webgl context to wrap.\n   * @param {!function(err, funcName, args): void} opt_onErrorFunc The function\n   *     to call when gl.getError returns an error. If not specified the default\n   *     function calls console.log with a message.\n   * @param {!function(funcName, args): void} opt_onFunc The\n   *     function to call when each webgl function is called. You\n   *     can use this to log all calls for example.\n   */\n  'makeDebugContext': makeDebugContext,\n\n  /**\n   * Given a canvas element returns a wrapped canvas element that will\n   * simulate lost context. The canvas returned adds the following functions.\n   *\n   * loseContext:\n   *   simulates a lost context event.\n   *\n   * restoreContext:\n   *   simulates the context being restored.\n   *\n   * lostContextInNCalls:\n   *   loses the context after N gl calls.\n   *\n   * getNumCalls:\n   *   tells you how many gl calls there have been so far.\n   *\n   * setRestoreTimeout:\n   *   sets the number of milliseconds until the context is restored\n   *   after it has been lost. Defaults to 0. Pass -1 to prevent\n   *   automatic restoring.\n   *\n   * @param {!Canvas} canvas The canvas element to wrap.\n   */\n  'makeLostContextSimulatingCanvas': makeLostContextSimulatingCanvas,\n\n  /**\n   * Resets a context to the initial state.\n   * @param {!WebGLRenderingContext} ctx The webgl context to\n   *     reset.\n   */\n  'resetToInitialState': resetToInitialState\n};\n\n}();\n\n"
  },
  {
    "path": "docs/.editorconfig.txt",
    "content": "# http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\nmax_line_length = 80\ntrim_trailing_whitespace = true\n\n[*.md]\nmax_line_length = 0\ntrim_trailing_whitespace = false\n\n[COMMIT_EDITMSG]\nmax_line_length = 0\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "_site\n.sass-cache\n.jekyll-metadata\n*.gem\n.bundle\nvendor/bundle\n"
  },
  {
    "path": "docs/ImportAll.hx",
    "content": "package;\n\nimport lime.app.Application;\nimport lime.app.Event;\nimport lime.app.Future;\nimport lime.app.IModule;\nimport lime.app.Module;\nimport lime.app.Promise;\nimport lime.graphics.cairo.Cairo;\nimport lime.graphics.cairo.CairoAntialias;\nimport lime.graphics.cairo.CairoContent;\nimport lime.graphics.cairo.CairoExtend;\nimport lime.graphics.cairo.CairoFillRule;\nimport lime.graphics.cairo.CairoFilter;\nimport lime.graphics.cairo.CairoFontFace;\nimport lime.graphics.cairo.CairoFontOptions;\nimport lime.graphics.cairo.CairoFormat;\nimport lime.graphics.cairo.CairoFTFontFace;\nimport lime.graphics.cairo.CairoGlyph;\nimport lime.graphics.cairo.CairoHintMetrics;\nimport lime.graphics.cairo.CairoImageSurface;\nimport lime.graphics.cairo.CairoLineCap;\nimport lime.graphics.cairo.CairoLineJoin;\nimport lime.graphics.cairo.CairoOperator;\nimport lime.graphics.cairo.CairoPattern;\nimport lime.graphics.cairo.CairoStatus;\nimport lime.graphics.cairo.CairoSubpixelOrder;\nimport lime.graphics.cairo.CairoSurface;\nimport lime.graphics.opengl.GL;\nimport lime.graphics.opengl.GLActiveInfo;\nimport lime.graphics.opengl.GLBuffer;\nimport lime.graphics.opengl.GLContextAttributes;\nimport lime.graphics.opengl.GLFramebuffer;\nimport lime.graphics.opengl.GLProgram;\nimport lime.graphics.opengl.GLQuery;\nimport lime.graphics.opengl.GLRenderbuffer;\nimport lime.graphics.opengl.GLSampler;\nimport lime.graphics.opengl.GLShader;\nimport lime.graphics.opengl.GLShaderPrecisionFormat;\nimport lime.graphics.opengl.GLSync;\nimport lime.graphics.opengl.GLTexture;\nimport lime.graphics.opengl.GLTransformFeedback;\nimport lime.graphics.opengl.GLUniformLocation;\nimport lime.graphics.opengl.GLVertexArrayObject;\nimport lime.graphics.CairoRenderContext;\nimport lime.graphics.Canvas2DRenderContext;\nimport lime.graphics.DOMRenderContext;\nimport lime.graphics.FlashRenderContext;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.graphics.ImageChannel;\nimport lime.graphics.ImageFileFormat;\nimport lime.graphics.ImageType;\nimport lime.graphics.OpenGLES2RenderContext;\nimport lime.graphics.OpenGLES3RenderContext;\nimport lime.graphics.OpenGLRenderContext;\nimport lime.graphics.PixelFormat;\nimport lime.graphics.RenderContext;\nimport lime.graphics.RenderContextAttributes;\nimport lime.graphics.RenderContextType;\nimport lime.graphics.WebGL2RenderContext;\nimport lime.graphics.WebGLRenderContext;\nimport lime.math.ARGB;\nimport lime.math.BGRA;\nimport lime.math.ColorMatrix;\nimport lime.math.Matrix3;\nimport lime.math.Matrix4;\nimport lime.math.Rectangle;\nimport lime.math.RGBA;\nimport lime.math.Vector2;\nimport lime.math.Vector4;\nimport lime.media.howlerjs.Howl;\nimport lime.media.howlerjs.Howler;\nimport lime.media.openal.AL;\nimport lime.media.openal.ALAuxiliaryEffectSlot;\nimport lime.media.openal.ALBuffer;\nimport lime.media.openal.ALC;\nimport lime.media.openal.ALContext;\nimport lime.media.openal.ALDevice;\nimport lime.media.openal.ALEffect;\nimport lime.media.openal.ALFilter;\nimport lime.media.openal.ALSource;\nimport lime.media.vorbis.Vorbis;\nimport lime.media.vorbis.VorbisComment;\nimport lime.media.vorbis.VorbisFile;\nimport lime.media.vorbis.VorbisInfo;\nimport lime.media.AudioBuffer;\nimport lime.media.AudioContext;\nimport lime.media.AudioContextType;\nimport lime.media.AudioManager;\nimport lime.media.AudioSource;\nimport lime.media.FlashAudioContext;\nimport lime.media.HTML5AudioContext;\nimport lime.media.OpenALAudioContext;\nimport lime.media.WebAudioContext;\nimport lime.net.curl.CURL;\nimport lime.net.curl.CURLCode;\nimport lime.net.curl.CURLInfo;\nimport lime.net.curl.CURLMulti;\nimport lime.net.curl.CURLMultiCode;\nimport lime.net.curl.CURLMultiMessage;\nimport lime.net.curl.CURLMultiOption;\nimport lime.net.curl.CURLOption;\nimport lime.net.curl.CURLVersion;\nimport lime.net.oauth.OAuthClient;\nimport lime.net.oauth.OAuthConsumer;\nimport lime.net.oauth.OAuthRequest;\nimport lime.net.oauth.OAuthSignatureMethod;\nimport lime.net.oauth.OAuthToken;\nimport lime.net.oauth.OAuthVersion;\nimport lime.net.HTTPRequest;\nimport lime.net.HTTPRequestHeader;\nimport lime.net.HTTPRequestMethod;\nimport lime.net.URIParser;\nimport lime.system.BackgroundWorker;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\nimport lime.system.Clipboard;\nimport lime.system.Display;\nimport lime.system.DisplayMode;\nimport lime.system.Endian;\nimport lime.system.FileWatcher;\nimport lime.system.JNI;\nimport lime.system.Locale;\nimport lime.system.Sensor;\nimport lime.system.SensorType;\nimport lime.system.System;\nimport lime.system.ThreadPool;\nimport lime.system.WorkOutput;\nimport lime.text.harfbuzz.HB;\nimport lime.text.harfbuzz.HBBlob;\nimport lime.text.harfbuzz.HBBuffer;\nimport lime.text.harfbuzz.HBBufferClusterLevel;\nimport lime.text.harfbuzz.HBBufferContentType;\nimport lime.text.harfbuzz.HBBufferFlags;\nimport lime.text.harfbuzz.HBBufferSerializeFlags;\nimport lime.text.harfbuzz.HBBufferSerializeFormat;\nimport lime.text.harfbuzz.HBDirection;\nimport lime.text.harfbuzz.HBFace;\nimport lime.text.harfbuzz.HBFeature;\nimport lime.text.harfbuzz.HBFont;\nimport lime.text.harfbuzz.HBFTFont;\nimport lime.text.harfbuzz.HBGlyphExtents;\nimport lime.text.harfbuzz.HBGlyphInfo;\nimport lime.text.harfbuzz.HBGlyphPosition;\nimport lime.text.harfbuzz.HBLanguage;\nimport lime.text.harfbuzz.HBMemoryMode;\nimport lime.text.harfbuzz.HBScript;\nimport lime.text.harfbuzz.HBSegmentProperties;\nimport lime.text.harfbuzz.HBSet;\nimport lime.text.Font;\nimport lime.text.Glyph;\nimport lime.text.GlyphMetrics;\nimport lime.text.UTF8String;\nimport lime.ui.FileDialog;\nimport lime.ui.FileDialogType;\nimport lime.ui.Gamepad;\nimport lime.ui.GamepadAxis;\nimport lime.ui.GamepadButton;\nimport lime.ui.Haptic;\nimport lime.ui.Joystick;\nimport lime.ui.JoystickHatPosition;\nimport lime.ui.KeyCode;\nimport lime.ui.KeyModifier;\nimport lime.ui.MouseButton;\nimport lime.ui.MouseCursor;\nimport lime.ui.MouseWheelMode;\nimport lime.ui.ScanCode;\nimport lime.ui.Touch;\nimport lime.ui.Window;\nimport lime.ui.WindowAttributes;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.ArrayBufferView;\nimport lime.utils.AssetBundle;\nimport lime.utils.AssetCache;\nimport lime.utils.AssetLibrary;\nimport lime.utils.AssetManifest;\nimport lime.utils.Assets;\nimport lime.utils.AssetType;\nimport lime.utils.BytePointer;\nimport lime.utils.Bytes;\nimport lime.utils.CompressionAlgorithm;\nimport lime.utils.DataPointer;\nimport lime.utils.DataView;\nimport lime.utils.Float32Array;\nimport lime.utils.Float64Array;\nimport lime.utils.Int16Array;\nimport lime.utils.Int32Array;\nimport lime.utils.Int8Array;\nimport lime.utils.Log;\nimport lime.utils.LogLevel;\nimport lime.utils.ObjectPool;\nimport lime.utils.PackedAssetLibrary;\nimport lime.utils.Preloader;\nimport lime.utils.Resource;\nimport lime.utils.UInt16Array;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\nimport lime.utils.UInt8ClampedArray;\n"
  },
  {
    "path": "docs/build.hx",
    "content": "import hxp.*;\n\nclass Build extends Script\n{\n\tpublic function new()\n\t{\n\t\tsuper();\n\n\t\tvar base = new HXML(\n\t\t\t{\n\t\t\t\tdefines: [\"display\", \"doc-gen\", \"lime-doc-gen\"],\n\t\t\t\tclassNames: [\"ImportAll\"],\n\t\t\t\tlibs: [\"lime\"],\n\t\t\t\tnoOutput: true\n\t\t\t});\n\n\t\tvar flash = base.clone();\n\t\tflash.xml = \"xml/Flash.xml\";\n\t\tflash.swf = \"obj/docs\";\n\t\tflash.swfVersion = \"17.0\";\n\t\tflash.build();\n\n\t\tvar native = base.clone();\n\t\tnative.cpp = \"obj/docs\";\n\t\tnative.define(\"native\");\n\t\tnative.define(\"lime-cffi\");\n\n\t\tvar windows = native.clone();\n\t\twindows.xml = \"xml/Windows.xml\";\n\t\twindows.define(\"windows\");\n\t\twindows.build();\n\n\t\tvar mac = native.clone();\n\t\tmac.xml = \"xml/macOS.xml\";\n\t\tmac.define(\"mac\");\n\t\tmac.build();\n\n\t\tvar linux = native.clone();\n\t\tlinux.xml = \"xml/Linux.xml\";\n\t\tlinux.define(\"linux\");\n\t\tlinux.build();\n\n\t\tvar ios = native.clone();\n\t\tios.xml = \"xml/iOS.xml\";\n\t\tios.define(\"ios\");\n\t\tios.build();\n\n\t\tvar android = native.clone();\n\t\tandroid.xml = \"xml/Android.xml\";\n\t\tandroid.define(\"android\");\n\t\tandroid.build();\n\n\t\tvar html5 = base.clone();\n\t\thtml5.xml = \"xml/HTML5.xml\";\n\t\thtml5.js = \"obj/docs\";\n\t\thtml5.define(\"html5\");\n\t\thtml5.build();\n\n\t\tSystem.runCommand(\"\", \"haxelib\", [\n\t\t\t\"run\",\n\t\t\t\"dox\",\n\t\t\t\"-i\",\n\t\t\t\"xml\",\n\t\t\t\"-in\",\n\t\t\t\"lime\",\n\t\t\t\"--title\",\n\t\t\t\"Lime API Reference\",\n\t\t\t\"-D\",\n\t\t\t\"source-path\",\n\t\t\t\"https://github.com/openfl/lime/tree/develop/src/\",\n\t\t\t\"-D\",\n\t\t\t\"website\",\n\t\t\t\"https://lime.openfl.org\",\n\t\t\t\"-D\",\n\t\t\t\"textColor\",\n\t\t\t\"0x777777\",\n\t\t\t\"-theme\",\n\t\t\t\"../assets/docs-theme\",\n\t\t\t\"--toplevel-package\",\n\t\t\t\"lime\"\n\t\t]);\n\t}\n}\n"
  },
  {
    "path": "docs/build.hxml",
    "content": "hxml/flash.hxml\n--next\nhxml/windows.hxml\n--next\nhxml/mac.hxml\n--next\nhxml/linux.hxml\n--next\nhxml/ios.hxml\n--next\nhxml/android.hxml\n--next\nhxml/html5.hxml\n--next\n\n-cmd haxelib run dox -i xml -in lime --title \"Lime API Reference\" -D website \"https://lime.openfl.org\" -D source-path \"https://github.com/openfl/lime/tree/develop/src/\" -D textColor 0x777777 -theme ../assets/docs-theme --toplevel-package lime"
  },
  {
    "path": "docs/hxml/android.hxml",
    "content": "-xml xml/Android.xml\n-cpp obj/docs\n-D display\n-D native\n-D lime-cffi\n-D android\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "docs/hxml/flash.hxml",
    "content": "-xml xml/Flash.xml\n-swf obj/docs\n-swf-version 17.0\n-D display\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "docs/hxml/html5.hxml",
    "content": "-xml xml/HTML5.xml\n-js obj/docs\n-D display\n-D html5\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "docs/hxml/ios.hxml",
    "content": "-xml xml/iOS.xml\n-cpp obj/docs\n-D display\n-D native\n-D lime-cffi\n-D ios\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "docs/hxml/linux.hxml",
    "content": "-xml xml/Linux.xml\n-cpp obj/docs\n-D display\n-D native\n-D lime-cffi\n-D linux\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "docs/hxml/mac.hxml",
    "content": "-xml xml/Mac.xml\n-cpp obj/docs\n-D display\n-D native\n-D lime-cffi\n-D mac\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "docs/hxml/windows.hxml",
    "content": "-xml xml/Windows.xml\n-cpp obj/docs\n-D display\n-D native\n-D lime-cffi\n-D windows\n-D doc_gen\n-D lime-doc-gen\nImportAll\n-lib lime\n--no-output"
  },
  {
    "path": "externs/air/air/desktop/URLFilePromise.hx",
    "content": "package air.desktop;\n\nextern class URLFilePromise extends flash.events.EventDispatcher implements flash.desktop.IFilePromise\n{\n\tvar isAsync(default, never):Bool;\n\tvar relativePath:String;\n\tvar request:flash.net.URLRequest;\n\tfunction new():Void;\n\tfunction close():Void;\n\tfunction open():flash.utils.IDataInput;\n\tfunction reportError(e:flash.events.ErrorEvent):Void;\n}\n"
  },
  {
    "path": "externs/air/air/net/SecureSocketMonitor.hx",
    "content": "package air.net;\n\nextern class SecureSocketMonitor extends SocketMonitor\n{\n\tfunction new(host:String, port:Int):Void;\n}\n"
  },
  {
    "path": "externs/air/air/net/ServiceMonitor.hx",
    "content": "package air.net;\n\nextern class ServiceMonitor extends flash.events.EventDispatcher\n{\n\tvar available:Bool;\n\tvar lastStatusUpdate(default, never):Date;\n\tvar pollInterval:Float;\n\tvar running(default, never):Bool;\n\tfunction new():Void;\n\tfunction start():Void;\n\tfunction stop():Void;\n\tprivate function checkStatus():Void;\n\tstatic function makeJavascriptSubclass(constructorFunction:Dynamic):Void;\n}\n"
  },
  {
    "path": "externs/air/air/net/SocketMonitor.hx",
    "content": "package air.net;\n\nextern class SocketMonitor extends ServiceMonitor\n{\n\tvar host(default, never):String;\n\tvar port(default, never):Int;\n\tfunction new(host:String, port:Int):Void;\n\tprivate function createSocket():flash.net.Socket;\n}\n"
  },
  {
    "path": "externs/air/air/net/URLMonitor.hx",
    "content": "package air.net;\n\nextern class URLMonitor extends ServiceMonitor\n{\n\tvar acceptableStatusCodes:Array<Dynamic>;\n\tvar urlRequest(default, never):flash.net.URLRequest;\n\tfunction new(urlRequest:flash.net.URLRequest, ?acceptableStatusCodes:Array<Dynamic>):Void;\n}\n"
  },
  {
    "path": "externs/air/air/update/ApplicationUpdater.hx",
    "content": "package air.update;\n\nextern class ApplicationUpdater // extends air.update.states.HSM {\n{\n\tvar configurationFile:flash.filesystem.File;\n\tvar currentState(default, never):String;\n\tvar currentVersion(default, never):String;\n\tvar delay:Float;\n\tvar isFirstRun(default, never):Bool;\n\tvar isNewerVersionFunction:Dynamic;\n\tvar previousApplicationStorageDirectory(default, never):flash.filesystem.File;\n\tvar previousVersion(default, never):String;\n\tvar updateDescriptor(default, never):flash.xml.XML;\n\tvar updateURL:String;\n\tvar wasPendingUpdate(default, never):Bool;\n\tfunction new():Void;\n\tfunction cancelUpdate():Void;\n\tfunction checkForUpdate():Void;\n\tfunction checkNow():Void;\n\tfunction downloadUpdate():Void;\n\tfunction initialize():Void;\n\tfunction installFromAIRFile(file:flash.filesystem.File):Void;\n\tfunction installUpdate():Void;\n\tprivate var configuration:Dynamic; // air.update.core.UpdaterConfiguration;\n\tprivate var state:Dynamic; // air.update.core.UpdaterState;\n\tprivate var updaterHSM:Dynamic; // air.update.core.UpdaterHSM;\n\tprivate function dispatchProxy(event:flash.events.Event):Void;\n\tprivate function handleFirstRun():Bool;\n\tprivate function handlePeriodicalCheck():Void;\n\tprivate function onDownloadComplete(event:air.update.events.UpdateEvent):Void;\n\tprivate function onFileInstall():Void;\n\tprivate function onFileStatus(event:air.update.events.StatusFileUpdateEvent):Void;\n\tprivate function onInitializationComplete():Void;\n\tprivate function onInitialize():Void;\n\tprivate function onInstall():Void;\n\tprivate function onStateClear(event:flash.events.Event):Void;\n\tprivate function onTimer(event:flash.events.TimerEvent):Void;\n\tprivate function stateCancelled(event:flash.events.Event):Void;\n\tprivate function stateInitializing(event:flash.events.Event):Void;\n\tprivate function stateReady(event:flash.events.Event):Void;\n\tprivate function stateRunning(event:flash.events.Event):Void;\n\tprivate function stateUninitialized(event:flash.events.Event):Void;\n}\n"
  },
  {
    "path": "externs/air/air/update/ApplicationUpdaterUI.hx",
    "content": "package air.update;\n\nextern class ApplicationUpdaterUI extends flash.events.EventDispatcher\n{\n\tvar configurationFile:flash.filesystem.File;\n\tvar currentVersion(default, never):String;\n\tvar delay:Float;\n\tvar isCheckForUpdateVisible:Bool;\n\tvar isDownloadProgressVisible:Bool;\n\tvar isDownloadUpdateVisible:Bool;\n\tvar isFileUpdateVisible:Bool;\n\tvar isFirstRun(default, never):Bool;\n\tvar isInstallUpdateVisible:Bool;\n\tvar isNewerVersionFunction:Dynamic;\n\tvar isUnexpectedErrorVisible:Bool;\n\tvar isUpdateInProgress(default, never):Bool;\n\tvar localeChain:Array<Dynamic>;\n\tvar previousApplicationStorageDirectory(default, never):flash.filesystem.File;\n\tvar previousVersion(default, never):String;\n\tvar updateDescriptor(default, never):flash.xml.XML;\n\tvar updateURL:String;\n\tvar wasPendingUpdate(default, never):Bool;\n\tfunction new():Void;\n\tfunction addResources(lang:String, res:Dynamic):Void;\n\tfunction cancelUpdate():Void;\n\tfunction checkNow():Void;\n\tfunction initialize():Void;\n\tfunction installFromAIRFile(file:flash.filesystem.File):Void;\n\tprivate function dispatchError(event:flash.events.ErrorEvent):Void;\n\tprivate function dispatchProxy(event:flash.events.Event):Void;\n}\n"
  },
  {
    "path": "externs/air/air/update/events/DownloadErrorEvent.hx",
    "content": "package air.update.events;\n\nextern class DownloadErrorEvent extends flash.events.ErrorEvent\n{\n\tvar subErrorID:Int;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, text:String = \"\", id:Int = 0, subErrorID:Int = 0):Void;\n\tstatic var DOWNLOAD_ERROR(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/air/update/events/StatusFileUpdateErrorEvent.hx",
    "content": "package air.update.events;\n\nextern class StatusFileUpdateErrorEvent extends flash.events.ErrorEvent\n{\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, text:String = \"\", id:Int = 0):Void;\n\tstatic var FILE_UPDATE_ERROR(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/air/update/events/StatusFileUpdateEvent.hx",
    "content": "package air.update.events;\n\nextern class StatusFileUpdateEvent extends UpdateEvent\n{\n\tvar available:Bool;\n\tvar path:String;\n\tvar version:String;\n\tvar versionLabel:String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, available:Bool = false, version:String = \"\", path:String = \"\",\n\t\tversionLabel:String = \"\"):Void;\n\tstatic var FILE_UPDATE_STATUS(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/air/update/events/StatusUpdateErrorEvent.hx",
    "content": "package air.update.events;\n\nextern class StatusUpdateErrorEvent extends flash.events.ErrorEvent\n{\n\tvar subErrorID:Int;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, text:String = \"\", id:Int = 0, subErrorID:Int = 0):Void;\n\tstatic var UPDATE_ERROR(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/air/update/events/StatusUpdateEvent.hx",
    "content": "package air.update.events;\n\nextern class StatusUpdateEvent extends UpdateEvent\n{\n\tvar available:Bool;\n\tvar details:Array<Dynamic>;\n\tvar version:String;\n\tvar versionLabel:String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, available:Bool = false, version:String = \"\", ?details:Array<Dynamic>,\n\t\tversionLabel:String = \"\"):Void;\n\tstatic var UPDATE_STATUS(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/air/update/events/UpdateEvent.hx",
    "content": "package air.update.events;\n\nextern class UpdateEvent extends flash.events.Event\n{\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false):Void;\n\tstatic var BEFORE_INSTALL(default, never):String;\n\tstatic var CHECK_FOR_UPDATE(default, never):String;\n\tstatic var DOWNLOAD_COMPLETE(default, never):String;\n\tstatic var DOWNLOAD_START(default, never):String;\n\tstatic var INITIALIZED(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/data/EncryptedLocalStore.hx",
    "content": "package flash.data;\n\nextern class EncryptedLocalStore\n{\n\tstatic var isSupported(default, never):Bool;\n\tstatic function getItem(name:String):flash.utils.ByteArray;\n\tstatic function removeItem(name:String):Void;\n\tstatic function reset():Void;\n\tstatic function setItem(name:String, data:flash.utils.ByteArray, stronglyBound:Bool = false):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLCollationType.hx",
    "content": "package flash.data;\n\n@:native(\"flash.data.SQLCollationType\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SQLCollationType(String)\n{\n\tvar BINARY = \"binary\";\n\tvar NO_CASE = \"noCase\";\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLColumnNameStyle.hx",
    "content": "package flash.data;\n\n@:native(\"flash.data.SQLColumnNameStyle\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SQLColumnNameStyle(String)\n{\n\tvar DEFAULT = \"default\";\n\tvar LONG = \"long\";\n\tvar SHORT = \"short\";\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLColumnSchema.hx",
    "content": "package flash.data;\n\nextern class SQLColumnSchema\n{\n\tvar allowNull(default, never):Bool;\n\tvar autoIncrement(default, never):Bool;\n\tvar dataType(default, never):String;\n\tvar defaultCollationType(default, never):SQLCollationType;\n\tvar name(default, never):String;\n\tvar primaryKey(default, never):Bool;\n\tfunction new(name:String, primaryKey:Bool, allowNull:Bool, autoIncrement:Bool, dataType:String, defaultCollationType:SQLCollationType):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLConnection.hx",
    "content": "package flash.data;\n\nextern class SQLConnection extends flash.events.EventDispatcher\n{\n\tvar autoCompact(default, never):Bool;\n\tvar cacheSize:UInt; // default 2000\n\tvar columnNameStyle:SQLColumnNameStyle;\n\tvar connected(default, never):Bool;\n\tvar inTransaction(default, never):Bool;\n\tvar lastInsertRowID(default, never):Float;\n\tvar pageSize(default, never):UInt;\n\tvar totalChanges(default, never):Float;\n\tfunction new():Void;\n\tfunction analyze(?resourceName:String, ?responder:flash.net.Responder):Void;\n\tfunction attach(name:String, ?reference:Dynamic, ?responder:flash.net.Responder, ?encryptionKey:flash.utils.ByteArray):Void;\n\tfunction begin(?option:String, ?responder:flash.net.Responder):Void;\n\tfunction cancel(?responder:flash.net.Responder):Void;\n\tfunction close(?responder:flash.net.Responder):Void;\n\tfunction commit(?responder:flash.net.Responder):Void;\n\tfunction compact(?responder:flash.net.Responder):Void;\n\tfunction deanalyze(?responder:flash.net.Responder):Void;\n\tfunction detach(name:String, ?responder:flash.net.Responder):Void;\n\tfunction getSchemaResult():SQLSchemaResult;\n\tfunction loadSchema(?type:Class<Dynamic>, ?name:String, ?database:String = \"main\", ?includeColumnSchema:Bool = true, ?responder:flash.net.Responder):Void;\n\tfunction open(?reference:Dynamic, ?openMode:SQLMode = SQLMode.CREATE, ?autoCompact:Bool = false, ?pageSize:Int = 1024,\n\t\t?encryptionKey:flash.utils.ByteArray):Void;\n\tfunction openAsync(?reference:Dynamic, ?openMode:SQLMode = SQLMode.CREATE, ?responder:flash.net.Responder, ?autoCompact:Bool = false,\n\t\t?pageSize:Int = 1024, ?encryptionKey:flash.utils.ByteArray):Void;\n\tfunction reencrypt(newEncryptionKey:flash.utils.ByteArray, ?responder:flash.net.Responder):Void;\n\tfunction releaseSavepoint(?name:String, ?responder:flash.net.Responder):Void;\n\tfunction rollback(?responder:flash.net.Responder):Void;\n\tfunction rollbackToSavepoint(?name:String, ?responder:flash.net.Responder):Void;\n\tfunction setSavepoint(?name:String, ?responder:flash.net.Responder):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLIndexSchema.hx",
    "content": "package flash.data;\n\nextern class SQLIndexSchema extends SQLSchema\n{\n\tvar table(default, never):String;\n\tfunction new(database:String, name:String, sql:String, table:String):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLMode.hx",
    "content": "package flash.data;\n\n@:native(\"flash.data.SQLMode\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SQLMode(String)\n{\n\tvar CREATE = \"create\";\n\tvar READ = \"read\";\n\tvar UPDATE = \"update\";\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLResult.hx",
    "content": "package flash.data;\n\nextern class SQLResult\n{\n\tvar complete(default, never):Bool;\n\tvar data(default, never):Array<Dynamic>;\n\tvar lastInsertRowID(default, never):Float;\n\tvar rowsAffected(default, never):Float;\n\tfunction new(?data:Array<Dynamic>, ?rowsAffected:Float = 0.0, ?complete:Bool = true, ?rowID:Float = 0.0):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLSchema.hx",
    "content": "package flash.data;\n\nextern class SQLSchema\n{\n\tvar database(default, never):String;\n\tvar name(default, never):String;\n\tvar sql(default, never):String;\n\tfunction new(database:String, name:String, sql:String):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLSchemaResult.hx",
    "content": "package flash.data;\n\nextern class SQLSchemaResult\n{\n\tvar indices(default, never):Array<SQLIndexSchema>;\n\tvar tables(default, never):Array<SQLTableSchema>;\n\tvar triggers(default, never):Array<SQLTriggerSchema>;\n\tvar views(default, never):Array<SQLViewSchema>;\n\tfunction new(tables:Array<SQLTableSchema>, views:Array<SQLViewSchema>, indices:Array<SQLIndexSchema>, triggers:Array<SQLTriggerSchema>):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLStatement.hx",
    "content": "package flash.data;\n\nextern class SQLStatement extends flash.events.EventDispatcher\n{\n\tvar executing(default, never):Bool;\n\tvar itemClass:Class<Dynamic>;\n\tvar parameters(default, never):Dynamic;\n\tvar sqlConnection:SQLConnection;\n\tvar text:String;\n\tfunction new():Void;\n\tfunction cancel():Void;\n\tfunction clearParameters():Void;\n\tfunction execute(?prefetch:Int = -1, ?responder:flash.net.Responder):Void;\n\tfunction getResult():SQLResult;\n\tfunction next(?prefetch:Int = -1, ?responder:flash.net.Responder):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLTableSchema.hx",
    "content": "package flash.data;\n\nextern class SQLTableSchema extends SQLSchema\n{\n\tvar columns(default, never):Array<SQLColumnSchema>;\n\tfunction new(database:String, name:String, sql:String, columns:Array<SQLColumnSchema>):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLTransactionLockType.hx",
    "content": "package flash.data;\n\n@:native(\"flash.data.SQLTransactionLockType\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SQLTransactionLockType(String)\n{\n\tvar DEFERRED = \"deferred\";\n\tvar EXCLUSIVE = \"exclusive\";\n\tvar IMMEDIATE = \"immediate\";\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLTriggerSchema.hx",
    "content": "package flash.data;\n\nextern class SQLTriggerSchema extends SQLSchema\n{\n\tvar table(default, never):String;\n\tfunction new(database:String, name:String, sql:String, table:String):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/data/SQLViewSchema.hx",
    "content": "package flash.data;\n\nextern class SQLViewSchema extends SQLTableSchema\n{\n\tfunction new(database:String, name:String, sql:String, columns:Array<SQLColumnSchema>):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/Clipboard.hx",
    "content": "package flash.desktop;\n\n@:require(flash10) extern class Clipboard\n{\n\tvar formats(default, never):Array<ClipboardFormats>;\n\t#if air\n\tvar supportsFilePromise(default, never):Bool;\n\t#end\n\tfunction clear():Void;\n\tfunction clearData(format:ClipboardFormats):Void;\n\tfunction getData(format:ClipboardFormats, ?transferMode:ClipboardTransferMode):flash.utils.Object;\n\tfunction hasFormat(format:ClipboardFormats):Bool;\n\tfunction setData(format:ClipboardFormats, data:flash.utils.Object, serializable:Bool = true):Bool;\n\tfunction setDataHandler(format:ClipboardFormats, handler:flash.utils.Function, serializable:Bool = true):Bool;\n\tstatic var generalClipboard(default, never):Clipboard;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/DockIcon.hx",
    "content": "package flash.desktop;\n\nextern class DockIcon extends InteractiveIcon\n{\n\tvar menu:flash.display.NativeMenu;\n\tfunction new():Void;\n\tfunction bounce(?priority:NotificationType = NotificationType.INFORMATIONAL):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/FilePromiseManager.hx",
    "content": "package flash.desktop;\n\nextern class FilePromiseManager extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction addPromises(clipboard:Clipboard, dropDirectoryPath:String):Bool;\n\tstatic var ASYNC_FILE_PROMISE_DONE_EVENT(default, never):String;\n\tstatic var DATA_EVENT_TIMEOUT(default, never):Int;\n\tstatic var FILE_PROMISE_ERR_CLOSE(default, never):Int;\n\tstatic var FILE_PROMISE_ERR_OPEN(default, never):Int;\n\tstatic var FILE_PROMISE_ERR_TIMEOUT(default, never):Int;\n\tstatic function newFilePromiseErrorEvent(code:Int):flash.events.Event;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/FilePromiseWrapper.hx",
    "content": "package flash.desktop;\n\nextern class FilePromiseWrapper\n{\n\tvar filePromise(default, never):IFilePromise;\n\tfunction new(fp:IFilePromise):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/IFilePromise.hx",
    "content": "package flash.desktop;\n\nextern interface IFilePromise\n{\n\tvar isAsync(default, never):Bool;\n\tvar relativePath(default, never):String;\n\tfunction close():Void;\n\tfunction open():flash.utils.IDataInput;\n\tfunction reportError(e:flash.events.ErrorEvent):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/Icon.hx",
    "content": "package flash.desktop;\n\nextern class Icon extends flash.events.EventDispatcher\n{\n\tvar bitmaps:Array<Dynamic>;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/InteractiveIcon.hx",
    "content": "package flash.desktop;\n\nextern class InteractiveIcon extends Icon\n{\n\tvar height(default, never):Int;\n\tvar width(default, never):Int;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/InvokeEventReason.hx",
    "content": "package flash.desktop;\n\n@:native(\"flash.desktop.InvokeEventReason\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract InvokeEventReason(String)\n{\n\tvar LOGIN = \"login\";\n\tvar NOTIFICATION = \"notification\";\n\tvar OPEN_URL = \"openUrl\";\n\tvar STANDARD = \"standard\";\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/JSClipboard.hx",
    "content": "package flash.desktop;\n\nextern class JSClipboard\n{\n\tvar clipboard(default, never):Clipboard;\n\tvar dragOptions:NativeDragOptions;\n\tvar dropEffect:String;\n\tvar effectAllowed:String;\n\tvar propagationStopped:Bool;\n\tvar types(default, never):Array<Dynamic>;\n\tfunction new(writable:Bool, forDragging:Bool, ?clipboard:Clipboard, ?dragOptions:NativeDragOptions):Void;\n\tfunction clearAllData():Void;\n\tfunction clearData(mimeType:String):Void;\n\tfunction getData(mimeType:String):Dynamic;\n\tfunction setData(mimeType:String, data:Dynamic):Bool;\n\tstatic function urisFromURIList(uriList:String):Array<Dynamic>;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/MacFilePromiseWrapper.hx",
    "content": "package flash.desktop;\n\nextern class MacFilePromiseWrapper extends flash.events.EventDispatcher\n{\n\tfunction new(promise:IFilePromise, dropDirectory:flash.filesystem.File):Void;\n\tfunction open():Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeApplication.hx",
    "content": "package flash.desktop;\n\nextern class NativeApplication extends flash.events.EventDispatcher\n{\n\tvar activeWindow(default, never):flash.display.NativeWindow;\n\tvar applicationDescriptor(default, never):flash.xml.XML;\n\tvar applicationID(default, never):String;\n\tvar autoExit:Bool;\n\tvar executeInBackground:Bool;\n\tvar icon(default, never):InteractiveIcon;\n\tvar idleThreshold:Int;\n\tvar isCompiledAOT(default, never):Bool;\n\tvar menu:flash.display.NativeMenu;\n\tvar openedWindows(default, never):Array<Dynamic>;\n\tvar publisherID(default, never):String;\n\tvar runtimePatchLevel(default, never):UInt;\n\tvar runtimeVersion(default, never):String;\n\tvar startAtLogin:Bool;\n\tvar systemIdleMode:SystemIdleMode;\n\tvar timeSinceLastUserInput(default, never):Int;\n\tfunction new():Void;\n\tfunction activate(?window:flash.display.NativeWindow):Void;\n\tfunction clear():Bool;\n\tfunction copy():Bool;\n\tfunction cut():Bool;\n\tfunction exit(?errorCode:Int):Void;\n\tfunction getDefaultApplication(extension:String):String;\n\tfunction isSetAsDefaultApplication(extension:String):Bool;\n\tfunction paste():Bool;\n\tfunction removeAsDefaultApplication(extension:String):Void;\n\tfunction selectAll():Bool;\n\tfunction setAsDefaultApplication(extension:String):Void;\n\tstatic var nativeApplication(default, never):NativeApplication;\n\tstatic var supportsDefaultApplication(default, never):Bool;\n\tstatic var supportsDockIcon(default, never):Bool;\n\tstatic var supportsMenu(default, never):Bool;\n\tstatic var supportsStartAtLogin(default, never):Bool;\n\tstatic var supportsSystemTrayIcon(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeDragActions.hx",
    "content": "package flash.desktop;\n\n@:native(\"flash.desktop.NativeDragActions\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NativeDragActions(String)\n{\n\tvar COPY = \"copy\";\n\tvar LINK = \"link\";\n\tvar MOVE = \"move\";\n\tvar NONE = \"none\";\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeDragManager.hx",
    "content": "package flash.desktop;\n\nextern class NativeDragManager\n{\n\tstatic var dragInitiator(default, never):flash.display.InteractiveObject;\n\tstatic var dropAction:NativeDragActions;\n\tstatic var isDragging(default, never):Bool;\n\tstatic var isSupported(default, never):Bool;\n\tstatic function acceptDragDrop(target:flash.display.InteractiveObject):Void;\n\tstatic function doDrag(dragInitiator:flash.display.InteractiveObject, clipboard:Clipboard, ?dragImage:flash.display.BitmapData, ?offset:flash.geom.Point,\n\t\t?allowedActions:NativeDragOptions):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeDragOptions.hx",
    "content": "package flash.desktop;\n\nextern class NativeDragOptions\n{\n\tvar allowCopy:Bool;\n\tvar allowLink:Bool;\n\tvar allowMove:Bool;\n\tfunction new():Void;\n\tfunction toString():String;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeProcess.hx",
    "content": "package flash.desktop;\n\nextern class NativeProcess extends flash.events.EventDispatcher\n{\n\tvar running(default, never):Bool;\n\tvar standardError(default, never):flash.utils.IDataInput;\n\tvar standardInput(default, never):flash.utils.IDataOutput;\n\tvar standardOutput(default, never):flash.utils.IDataInput;\n\tfunction new():Void;\n\tfunction closeInput():Void;\n\tfunction exit(force:Bool = false):Void;\n\tfunction start(info:NativeProcessStartupInfo):Void;\n\tstatic var isSupported(default, never):Bool;\n\tstatic function isValidExecutable(f:flash.filesystem.File):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeProcessStartupInfo.hx",
    "content": "package flash.desktop;\n\nextern class NativeProcessStartupInfo\n{\n\tvar arguments:flash.Vector<String>;\n\tvar executable:flash.filesystem.File;\n\tvar workingDirectory:flash.filesystem.File;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NativeWindowIcon.hx",
    "content": "package flash.desktop;\n\nextern class NativeWindowIcon extends InteractiveIcon\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/NotificationType.hx",
    "content": "package flash.desktop;\n\n@:native(\"flash.desktop.NotificationType\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NotificationType(String)\n{\n\tvar CRITICAL = \"critical\";\n\tvar INFORMATIONAL = \"informational\";\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/SystemIdleMode.hx",
    "content": "package flash.desktop;\n\n@:native(\"flash.desktop.SystemIdleMode\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SystemIdleMode(String)\n{\n\tvar KEEP_AWAKE = \"keepAwake\";\n\tvar NORMAL = \"normal\";\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/SystemTrayIcon.hx",
    "content": "package flash.desktop;\n\nextern class SystemTrayIcon extends InteractiveIcon\n{\n\tvar menu:flash.display.NativeMenu;\n\tvar tooltip:String;\n\tfunction new():Void;\n\tstatic var MAX_TIP_LENGTH(default, never):Float;\n}\n"
  },
  {
    "path": "externs/air/flash/desktop/Updater.hx",
    "content": "package flash.desktop;\n\nextern class Updater\n{\n\tfunction new():Void;\n\tfunction update(airFile:flash.filesystem.File, version:String):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/display/DisplayObject.hx",
    "content": "package flash.display;\n\nextern class DisplayObject extends flash.events.EventDispatcher implements IBitmapDrawable\n{\n\t#if (haxe_ver < 4.3)\n\tvar accessibilityProperties:flash.accessibility.AccessibilityProperties;\n\tvar alpha:Float;\n\tvar blendMode:BlendMode;\n\t@:require(flash10) var blendShader(never, default):Shader;\n\tvar cacheAsBitmap:Bool;\n\t#if air\n\tvar cacheAsBitmapMatrix:flash.geom.Matrix;\n\t#end\n\tvar filters:Array<flash.filters.BitmapFilter>;\n\tvar height:Float;\n\tvar loaderInfo(default, never):LoaderInfo;\n\tvar mask:DisplayObject;\n\tvar mouseX(default, never):Float;\n\tvar mouseY(default, never):Float;\n\tvar name:String;\n\tvar opaqueBackground:Null<UInt>;\n\tvar parent(default, never):DisplayObjectContainer;\n\tvar root(default, never):DisplayObject;\n\tvar rotation:Float;\n\t@:require(flash10) var rotationX:Float;\n\t@:require(flash10) var rotationY:Float;\n\t@:require(flash10) var rotationZ:Float;\n\tvar scale9Grid:flash.geom.Rectangle;\n\tvar scaleX:Float;\n\tvar scaleY:Float;\n\t@:require(flash10) var scaleZ:Float;\n\tvar scrollRect:flash.geom.Rectangle;\n\tvar stage(default, never):Stage;\n\tvar transform:flash.geom.Transform;\n\tvar visible:Bool;\n\tvar width:Float;\n\tvar x:Float;\n\tvar y:Float;\n\t@:require(flash10) var z:Float;\n\t#else\n\t@:flash.property var accessibilityProperties:flash.accessibility.AccessibilityProperties;\n\t@:flash.property var alpha:Float;\n\t@:flash.property var blendMode:BlendMode;\n\t@:flash.property @:require(flash10) var blendShader(never, default):Shader;\n\t@:flash.property var cacheAsBitmap:Bool;\n\t#if air\n\t@:flash.property var cacheAsBitmapMatrix:flash.geom.Matrix;\n\t#end\n\t@:flash.property var filters(get, set):Array<flash.filters.BitmapFilter>;\n\t@:flash.property var height(get, set):Float;\n\t@:flash.property var loaderInfo(get, never):LoaderInfo;\n\t@:flash.property var mask(get, set):DisplayObject;\n\t@:flash.property var mouseX(get, never):Float;\n\t@:flash.property var mouseY(get, never):Float;\n\t@:flash.property var name(get, set):String;\n\t@:flash.property var opaqueBackground(get, set):Null<UInt>;\n\t@:flash.property var parent(get, never):DisplayObjectContainer;\n\t@:flash.property var root(get, never):DisplayObject;\n\t@:flash.property var rotation(get, set):Float;\n\t@:flash.property @:require(flash10) var rotationX(get, set):Float;\n\t@:flash.property @:require(flash10) var rotationY(get, set):Float;\n\t@:flash.property @:require(flash10) var rotationZ(get, set):Float;\n\t@:flash.property var scale9Grid(get, set):flash.geom.Rectangle;\n\t@:flash.property var scaleX(get, set):Float;\n\t@:flash.property var scaleY(get, set):Float;\n\t@:flash.property @:require(flash10) var scaleZ(get, set):Float;\n\t@:flash.property var scrollRect(get, set):flash.geom.Rectangle;\n\t@:flash.property var stage(get, never):Stage;\n\t@:flash.property var transform(get, set):flash.geom.Transform;\n\t@:flash.property var visible(get, set):Bool;\n\t@:flash.property var width(get, set):Float;\n\t@:flash.property var x(get, set):Float;\n\t@:flash.property var y(get, set):Float;\n\t@:flash.property @:require(flash10) var z(get, set):Float;\n\t#end\n\tfunction getBounds(targetCoordinateSpace:DisplayObject):flash.geom.Rectangle;\n\tfunction getRect(targetCoordinateSpace:DisplayObject):flash.geom.Rectangle;\n\tfunction globalToLocal(point:flash.geom.Point):flash.geom.Point;\n\t@:require(flash10) function globalToLocal3D(point:flash.geom.Point):flash.geom.Vector3D;\n\tfunction hitTestObject(obj:DisplayObject):Bool;\n\tfunction hitTestPoint(x:Float, y:Float, shapeFlag:Bool = false):Bool;\n\t@:require(flash10) function local3DToGlobal(point3d:flash.geom.Vector3D):flash.geom.Point;\n\tfunction localToGlobal(point:flash.geom.Point):flash.geom.Point;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_accessibilityProperties():flash.accessibility.AccessibilityProperties;\n\tprivate function get_alpha():Float;\n\tprivate function get_blendMode():BlendMode;\n\tprivate function get_cacheAsBitmap():Bool;\n\tprivate function get_filters():Array<flash.filters.BitmapFilter>;\n\tprivate function get_height():Float;\n\tprivate function get_loaderInfo():LoaderInfo;\n\tprivate function get_mask():DisplayObject;\n\tprivate function get_metaData():Dynamic;\n\tprivate function get_mouseX():Float;\n\tprivate function get_mouseY():Float;\n\tprivate function get_name():String;\n\tprivate function get_opaqueBackground():Null<UInt>;\n\tprivate function get_parent():DisplayObjectContainer;\n\tprivate function get_root():DisplayObject;\n\tprivate function get_rotation():Float;\n\tprivate function get_rotationX():Float;\n\tprivate function get_rotationY():Float;\n\tprivate function get_rotationZ():Float;\n\tprivate function get_scale9Grid():flash.geom.Rectangle;\n\tprivate function get_scaleX():Float;\n\tprivate function get_scaleY():Float;\n\tprivate function get_scaleZ():Float;\n\tprivate function get_scrollRect():flash.geom.Rectangle;\n\tprivate function get_stage():Stage;\n\tprivate function get_transform():flash.geom.Transform;\n\tprivate function get_visible():Bool;\n\tprivate function get_width():Float;\n\tprivate function get_x():Float;\n\tprivate function get_y():Float;\n\tprivate function get_z():Float;\n\t#if air\n\tprivate function get_cacheAsBitmapMatrix():flash.geom.Matrix;\n\t#end\n\tprivate function set_accessibilityProperties(value:flash.accessibility.AccessibilityProperties):flash.accessibility.AccessibilityProperties;\n\tprivate function set_alpha(value:Float):Float;\n\tprivate function set_blendMode(value:BlendMode):BlendMode;\n\tprivate function set_blendShader(value:Shader):Shader;\n\tprivate function set_cacheAsBitmap(value:Bool):Bool;\n\tprivate function set_filters(value:Array<flash.filters.BitmapFilter>):Array<flash.filters.BitmapFilter>;\n\tprivate function set_height(value:Float):Float;\n\tprivate function set_mask(value:DisplayObject):DisplayObject;\n\tprivate function set_metaData(value:Dynamic):Dynamic;\n\tprivate function set_name(value:String):String;\n\tprivate function set_opaqueBackground(value:Null<UInt>):Null<UInt>;\n\tprivate function set_rotation(value:Float):Float;\n\tprivate function set_rotationX(value:Float):Float;\n\tprivate function set_rotationY(value:Float):Float;\n\tprivate function set_rotationZ(value:Float):Float;\n\tprivate function set_scale9Grid(value:flash.geom.Rectangle):flash.geom.Rectangle;\n\tprivate function set_scaleX(value:Float):Float;\n\tprivate function set_scaleY(value:Float):Float;\n\tprivate function set_scaleZ(value:Float):Float;\n\tprivate function set_scrollRect(value:flash.geom.Rectangle):flash.geom.Rectangle;\n\tprivate function set_transform(value:flash.geom.Transform):flash.geom.Transform;\n\tprivate function set_visible(value:Bool):Bool;\n\tprivate function set_width(value:Float):Float;\n\tprivate function set_x(value:Float):Float;\n\tprivate function set_y(value:Float):Float;\n\tprivate function set_z(value:Float):Float;\n\t#if air\n\tprivate function set_cacheAsBitmapMatrix(value:flash.geom.Matrix):flash.geom.Matrix;\n\t#end\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/InteractiveObject.hx",
    "content": "package flash.display;\n\nextern class InteractiveObject extends DisplayObject\n{\n\t#if (haxe_ver < 4.3)\n\tvar accessibilityImplementation:flash.accessibility.AccessibilityImplementation;\n\t// var contextMenu : #if air flash.display.NativeMenu #else flash.ui.ContextMenu #end;\n\tvar contextMenu:NativeMenu;\n\tvar doubleClickEnabled:Bool;\n\tvar focusRect:Dynamic;\n\tvar mouseEnabled:Bool;\n\t@:require(flash11) var needsSoftKeyboard:Bool;\n\t@:require(flash11) var softKeyboardInputAreaOfInterest:flash.geom.Rectangle;\n\tvar tabEnabled:Bool;\n\tvar tabIndex:Int;\n\t#else\n\t@:flash.property var accessibilityImplementation(get, set):flash.accessibility.AccessibilityImplementation;\n\t// @:flash.property var contextMenu : #if air flash.display.NativeMenu #else flash.ui.ContextMenu #end;\n\t@:flash.property var contextMenu(get, set):NativeMenu;\n\t@:flash.property var doubleClickEnabled(get, set):Bool;\n\t@:flash.property var focusRect(get, set):Dynamic;\n\t@:flash.property var mouseEnabled(get, set):Bool;\n\t@:flash.property @:require(flash11) var needsSoftKeyboard(get, set):Bool;\n\t@:flash.property @:require(flash11) var softKeyboardInputAreaOfInterest(get, set):flash.geom.Rectangle;\n\t@:flash.property var tabEnabled(get, set):Bool;\n\t@:flash.property var tabIndex(get, set):Int;\n\t#end\n\tfunction new():Void;\n\t@:require(flash11) function requestSoftKeyboard():Bool;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_accessibilityImplementation():flash.accessibility.AccessibilityImplementation;\n\tprivate function get_contextMenu():#if air flash.display.NativeMenu #else flash.ui.ContextMenu #end;\n\tprivate function get_doubleClickEnabled():Bool;\n\tprivate function get_focusRect():Dynamic;\n\tprivate function get_mouseEnabled():Bool;\n\tprivate function get_needsSoftKeyboard():Bool;\n\tprivate function get_softKeyboardInputAreaOfInterest():flash.geom.Rectangle;\n\tprivate function get_tabEnabled():Bool;\n\tprivate function get_tabIndex():Int;\n\tprivate function set_accessibilityImplementation(value:flash.accessibility.AccessibilityImplementation):flash.accessibility.AccessibilityImplementation;\n\tprivate function set_contextMenu(value:#if air flash.display.NativeMenu #else flash.ui.ContextMenu #end):#if air flash.display.NativeMenu #else flash.ui.ContextMenu #end;\n\tprivate function set_doubleClickEnabled(value:Bool):Bool;\n\tprivate function set_focusRect(value:Dynamic):Dynamic;\n\tprivate function set_mouseEnabled(value:Bool):Bool;\n\tprivate function set_needsSoftKeyboard(value:Bool):Bool;\n\tprivate function set_softKeyboardInputAreaOfInterest(value:flash.geom.Rectangle):flash.geom.Rectangle;\n\tprivate function set_tabEnabled(value:Bool):Bool;\n\tprivate function set_tabIndex(value:Int):Int;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/Loader.hx",
    "content": "package flash.display;\n\nextern class Loader extends DisplayObjectContainer\n{\n\t#if (haxe_ver < 4.3)\n\tvar content(default, never):DisplayObject;\n\tvar contentLoaderInfo(default, never):LoaderInfo;\n\t@:require(flash10_1) var uncaughtErrorEvents(default, never):flash.events.UncaughtErrorEvents;\n\t#else\n\t@:flash.property var content(get, never):DisplayObject;\n\t@:flash.property var contentLoaderInfo(get, never):LoaderInfo;\n\t@:flash.property @:require(flash10_1) var uncaughtErrorEvents(get, never):flash.events.UncaughtErrorEvents;\n\t#end\n\tfunction new():Void;\n\tfunction close():Void;\n\tfunction load(request:flash.net.URLRequest, ?context:flash.system.LoaderContext):Void;\n\tfunction loadBytes(bytes:flash.utils.ByteArray, ?context:flash.system.LoaderContext):Void;\n\t#if air\n\tfunction loadFilePromise(promise:flash.desktop.IFilePromise, ?context:flash.system.LoaderContext):Void;\n\t#end\n\tfunction unload():Void;\n\t@:require(flash10) function unloadAndStop(gc:Bool = true):Void;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_content():DisplayObject;\n\tprivate function get_contentLoaderInfo():LoaderInfo;\n\tprivate function get_uncaughtErrorEvents():flash.events.UncaughtErrorEvents;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeMenu.hx",
    "content": "package flash.display;\n\n@:require(flash10_1) extern class NativeMenu extends flash.events.EventDispatcher\n{\n\t#if (haxe_ver < 4.3)\n\t#if air\n\tvar items:Array<NativeMenuItem>;\n\tvar numItems(default, never):Int;\n\tvar parent(default, never):NativeMenu;\n\tstatic var isSupported(default, never):Bool;\n\t#end\n\t#else\n\t#if air\n\t@:flash.property var items(get, set):Array<NativeMenuItem>;\n\t@:flash.property var numItems(get, never):Int;\n\t@:flash.property var parent(get, never):NativeMenu;\n\t@:flash.property static var isSupported(get, never):Bool;\n\t#end\n\t#end\n\tfunction new():Void;\n\t#if air\n\tfunction addItem(item:NativeMenuItem):NativeMenuItem;\n\tfunction addItemAt(item:NativeMenuItem, index:Int):NativeMenuItem;\n\tfunction addSubmenu(submenu:NativeMenu, label:String):NativeMenuItem;\n\tfunction addSubmenuAt(submenu:NativeMenu, index:Int, label:String):NativeMenuItem;\n\tfunction clone():NativeMenu;\n\tfunction containsItem(item:NativeMenuItem):Bool;\n\tfunction dispatchContextMenuSelect(event:flash.events.MouseEvent):Dynamic;\n\tfunction display(stage:Stage, stageX:Float, stageY:Float):Void;\n\tfunction getItemAt(index:Int):NativeMenuItem;\n\tfunction getItemByName(name:String):NativeMenuItem;\n\tfunction getItemIndex(item:NativeMenuItem):Int;\n\tfunction removeAllItems():Void;\n\tfunction removeItem(item:NativeMenuItem):NativeMenuItem;\n\tfunction removeItemAt(index:Int):NativeMenuItem;\n\tfunction setItemIndex(item:NativeMenuItem, index:Int):Void;\n\t#end\n\n\t#if (haxe_ver >= 4.3)\n\t#if air\n\tprivate function get_items():Array<NativeMenuItem>;\n\tprivate function get_numItems():Int;\n\tprivate function get_parent():NativeMenu;\n\tprivate function set_items(value:Array<NativeMenuItem>):Array<NativeMenuItem>;\n\tprivate static function get_isSupported():Bool;\n\t#end\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeMenuItem.hx",
    "content": "package flash.display;\n\n@:require(flash10_1) extern class NativeMenuItem extends flash.events.EventDispatcher\n{\n\t#if (haxe_ver < 4.3)\n\tvar checked:Bool;\n\tvar data:Dynamic;\n\tvar enabled:Bool;\n\tvar isSeparator(default, never):Bool;\n\tvar keyEquivalent:String;\n\tvar keyEquivalentModifiers:Array<UInt>;\n\tvar label:String;\n\tvar menu(default, never):NativeMenu;\n\tvar mnemonicIndex:Int;\n\tvar name:String;\n\tvar submenu:NativeMenu;\n\t#else\n\t@:flash.property var checked(get, set):Bool;\n\t@:flash.property var data(get, set):Dynamic;\n\t@:flash.property var enabled(get, set):Bool;\n\t@:flash.property var isSeparator(get, never):Bool;\n\t@:flash.property var keyEquivalent(get, set):String;\n\t@:flash.property var keyEquivalentModifiers(get, set):Array<UInt>;\n\t@:flash.property var label(get, set):String;\n\t@:flash.property var menu(get, never):NativeMenu;\n\t@:flash.property var mnemonicIndex(get, set):Int;\n\t@:flash.property var name(get, set):String;\n\t@:flash.property var submenu(get, set):NativeMenu;\n\t#end\n\n\tfunction new(?label:String = \"\", ?isSeparator:Bool = false):Void;\n\tfunction clone():NativeMenuItem;\n\toverride function toString():String;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_checked():Bool;\n\tprivate function get_data():Dynamic;\n\tprivate function get_enabled():Bool;\n\tprivate function get_isSeparator():Bool;\n\tprivate function get_keyEquivalent():String;\n\tprivate function get_keyEquivalentModifiers():Array<UInt>;\n\tprivate function get_label():String;\n\tprivate function get_menu():NativeMenu;\n\tprivate function get_mnemonicIndex():Int;\n\tprivate function get_name():String;\n\tprivate function get_submenu():NativeMenu;\n\tprivate function set_checked(value:Bool):Bool;\n\tprivate function set_data(value:Dynamic):Dynamic;\n\tprivate function set_enabled(value:Bool):Bool;\n\tprivate function set_keyEquivalent(value:String):String;\n\tprivate function set_keyEquivalentModifiers(value:Array<UInt>):Array<UInt>;\n\tprivate function set_label(value:String):String;\n\tprivate function set_mnemonicIndex(value:Int):Int;\n\tprivate function set_name(value:String):String;\n\tprivate function set_submenu(value:NativeMenu):NativeMenu;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindow.hx",
    "content": "package flash.display;\n\nextern class NativeWindow extends flash.events.EventDispatcher\n{\n\t#if (haxe_ver < 4.3)\n\tvar active(default, never):Bool;\n\tvar alwaysInFront:Bool;\n\tvar bounds:flash.geom.Rectangle;\n\tvar closed(default, never):Bool;\n\tvar displayState(default, never):NativeWindowDisplayState;\n\tvar height:Float;\n\tvar maxSize:flash.geom.Point;\n\tvar maximizable(default, never):Bool;\n\tvar menu:NativeMenu;\n\tvar minSize:flash.geom.Point;\n\tvar minimizable(default, never):Bool;\n\tvar owner(default, never):NativeWindow;\n\tvar renderMode(default, never):NativeWindowRenderMode;\n\tvar resizable(default, never):Bool;\n\tvar stage(default, never):Stage;\n\tvar systemChrome(default, never):NativeWindowSystemChrome;\n\tvar title:String;\n\tvar transparent(default, never):Bool;\n\tvar type(default, never):NativeWindowType;\n\tvar visible:Bool;\n\tvar width:Float;\n\tvar x:Float;\n\tvar y:Float;\n\tstatic var isSupported(default, never):Bool;\n\tstatic var supportsMenu(default, never):Bool;\n\tstatic var supportsNotification(default, never):Bool;\n\tstatic var supportsTransparency(default, never):Bool;\n\tstatic var systemMaxSize(default, never):flash.geom.Point;\n\tstatic var systemMinSize(default, never):flash.geom.Point;\n\t#else\n\t@:flash.property var active(get, never):Bool;\n\t@:flash.property var alwaysInFront(get, set):Bool;\n\t@:flash.property var bounds(get, set):flash.geom.Rectangle;\n\t@:flash.property var closed(get, never):Bool;\n\t@:flash.property var displayState(get, never):NativeWindowDisplayState;\n\t@:flash.property var height(get, set):Float;\n\t@:flash.property var maxSize(get, set):flash.geom.Point;\n\t@:flash.property var maximizable(get, never):Bool;\n\t@:flash.property var menu(get, set):NativeMenu;\n\t@:flash.property var minSize(get, set):flash.geom.Point;\n\t@:flash.property var minimizable(get, never):Bool;\n\t@:flash.property var owner(get, never):NativeWindow;\n\t@:flash.property var renderMode(get, never):NativeWindowRenderMode;\n\t@:flash.property var resizable(get, never):Bool;\n\t@:flash.property var stage(get, never):Stage;\n\t@:flash.property var systemChrome(get, never):NativeWindowSystemChrome;\n\t@:flash.property var title(get, set):String;\n\t@:flash.property var transparent(get, never):Bool;\n\t@:flash.property var type(get, never):NativeWindowType;\n\t@:flash.property var visible(get, set):Bool;\n\t@:flash.property var width(get, set):Float;\n\t@:flash.property var x(get, set):Float;\n\t@:flash.property var y(get, set):Float;\n\t@:flash.property static var isSupported(get, never):Bool;\n\t@:flash.property static var supportsMenu(get, never):Bool;\n\t@:flash.property static var supportsNotification(get, never):Bool;\n\t@:flash.property static var supportsTransparency(get, never):Bool;\n\t@:flash.property static var systemMaxSize(get, never):flash.geom.Point;\n\t@:flash.property static var systemMinSize(get, never):flash.geom.Point;\n\t#end\n\n\tfunction new(initOptions:NativeWindowInitOptions):Void;\n\tfunction activate():Void;\n\tfunction close():Void;\n\tfunction globalToScreen(globalPoint:flash.geom.Point):flash.geom.Point;\n\tfunction listOwnedWindows():flash.Vector<NativeWindow>;\n\tfunction maximize():Void;\n\tfunction minimize():Void;\n\tfunction notifyUser(type:flash.desktop.NotificationType):Void;\n\tfunction orderInBackOf(window:NativeWindow):Bool;\n\tfunction orderInFrontOf(window:NativeWindow):Bool;\n\tfunction orderToBack():Bool;\n\tfunction orderToFront():Bool;\n\tfunction restore():Void;\n\tfunction startMove():Bool;\n\tfunction startResize(?edgeOrCorner:NativeWindowResize = NativeWindowResize.BOTTOM_RIGHT):Bool;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_active():Bool;\n\tprivate function get_alwaysInFront():Bool;\n\tprivate function get_bounds():flash.geom.Rectangle;\n\tprivate function get_closed():Bool;\n\tprivate function get_displayState():NativeWindowDisplayState;\n\tprivate function get_height():Float;\n\tprivate function get_maxSize():flash.geom.Point;\n\tprivate function get_maximizable():Bool;\n\tprivate function get_menu():NativeMenu;\n\tprivate function get_minSize():flash.geom.Point;\n\tprivate function get_minimizable():Bool;\n\tprivate function get_owner():NativeWindow;\n\tprivate function get_renderMode():NativeWindowRenderMode;\n\tprivate function get_resizable():Bool;\n\tprivate function get_stage():Stage;\n\tprivate function get_systemChrome():NativeWindowSystemChrome;\n\tprivate function get_title():String;\n\tprivate function get_transparent():Bool;\n\tprivate function get_type():NativeWindowType;\n\tprivate function get_visible():Bool;\n\tprivate function get_width():Float;\n\tprivate function get_x():Float;\n\tprivate function get_y():Float;\n\tprivate function set_alwaysInFront(value:Bool):Bool;\n\tprivate function set_bounds(value:flash.geom.Rectangle):flash.geom.Rectangle;\n\tprivate function set_height(value:Float):Float;\n\tprivate function set_maxSize(value:flash.geom.Point):flash.geom.Point;\n\tprivate function set_maximizable(value:Bool):Bool;\n\tprivate function set_menu(value:NativeMenu):NativeMenu;\n\tprivate function set_minSize(value:flash.geom.Point):flash.geom.Point;\n\tprivate function set_minimizable(value:Bool):Bool;\n\tprivate function set_title(value:String):String;\n\tprivate function set_visible(value:Bool):Bool;\n\tprivate function set_width(value:Float):Float;\n\tprivate function set_x(value:Float):Float;\n\tprivate function set_y(value:Float):Float;\n\tprivate static function get_isSupported():Bool;\n\tprivate static function get_supportsMenu():Bool;\n\tprivate static function get_supportsNotification():Bool;\n\tprivate static function get_supportsTransparency():Bool;\n\tprivate static function get_systemMaxSize():flash.geom.Point;\n\tprivate static function get_systemMinSize():flash.geom.Point;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindowDisplayState.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.NativeWindowDisplayState\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NativeWindowDisplayState(String)\n{\n\tvar MAXIMIZED = \"maximized\";\n\tvar MINIMIZED = \"minimized\";\n\tvar NORMAL = \"normal\";\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindowInitOptions.hx",
    "content": "package flash.display;\n\nextern class NativeWindowInitOptions\n{\n\t#if (haxe_ver < 4.3)\n\tvar maximizable:Bool;\n\tvar minimizable:Bool;\n\tvar owner:NativeWindow;\n\tvar renderMode:NativeWindowRenderMode;\n\tvar resizable:Bool;\n\tvar systemChrome:NativeWindowSystemChrome;\n\tvar transparent:Bool;\n\tvar type:NativeWindowType;\n\t#else\n\t@:flash.property var maximizable(get, set):Bool;\n\t@:flash.property var minimizable(get, set):Bool;\n\t@:flash.property var owner(get, set):NativeWindow;\n\t@:flash.property var renderMode(get, set):NativeWindowRenderMode;\n\t@:flash.property var resizable(get, set):Bool;\n\t@:flash.property var systemChrome(get, set):NativeWindowSystemChrome;\n\t@:flash.property var transparent(get, set):Bool;\n\t@:flash.property var type(get, set):NativeWindowType;\n\t#end\n\n\tfunction new():Void;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_maximizable():Bool;\n\tprivate function get_minimizable():Bool;\n\tprivate function get_owner():NativeWindow;\n\tprivate function get_renderMode():NativeWindowRenderMode;\n\tprivate function get_resizable():Bool;\n\tprivate function get_systemChrome():NativeWindowSystemChrome;\n\tprivate function get_transparent():Bool;\n\tprivate function get_type():NativeWindowType;\n\tprivate function set_maximizable(value:Bool):Bool;\n\tprivate function set_minimizable(value:Bool):Bool;\n\tprivate function set_owner(value:NativeWindow):NativeWindow;\n\tprivate function set_renderMode(value:NativeWindowRenderMode):NativeWindowRenderMode;\n\tprivate function set_resizable(value:Bool):Bool;\n\tprivate function set_systemChrome(value:NativeWindowSystemChrome):NativeWindowSystemChrome;\n\tprivate function set_transparent(value:Bool):Bool;\n\tprivate function set_type(value:NativeWindowType):NativeWindowType;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindowRenderMode.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.NativeWindowRenderMode\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NativeWindowRenderMode(String)\n{\n\tvar AUTO = \"auto\";\n\tvar CPU = \"cpu\";\n\tvar DIRECT = \"direct\";\n\tvar GPU = \"gpu\";\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindowResize.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.NativeWindowResize\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NativeWindowResize(String)\n{\n\tvar BOTTOM = \"bottom\";\n\tvar BOTTOM_LEFT = \"bottomLeft\";\n\tvar BOTTOM_RIGHT = \"bottomRight\";\n\tvar LEFT = \"left\";\n\tvar NONE = \"none\";\n\tvar RIGHT = \"right\";\n\tvar TOP = \"top\";\n\tvar TOP_LEFT = \"topLeft\";\n\tvar TOP_RIGHT = \"topRight\";\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindowSystemChrome.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.NativeWindowSystemChrome\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NativeWindowSystemChrome(String)\n{\n\tvar ALTERNATE = \"alternate\";\n\tvar NONE = \"none\";\n\tvar STANDARD = \"standard\";\n}\n"
  },
  {
    "path": "externs/air/flash/display/NativeWindowType.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.NativeWindowType\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NativeWindowType(String)\n{\n\tvar LIGHTWEIGHT = \"lightweight\";\n\tvar NORMAL = \"normal\";\n\tvar UTILITY = \"utility\";\n}\n"
  },
  {
    "path": "externs/air/flash/display/Screen.hx",
    "content": "package flash.display;\n\nextern class Screen extends flash.events.EventDispatcher\n{\n\t#if (haxe_ver < 4.3)\n\tvar bounds(default, never):flash.geom.Rectangle;\n\tvar colorDepth(default, never):Int;\n\tvar visibleBounds(default, never):flash.geom.Rectangle;\n\tstatic var mainScreen(default, never):Screen;\n\tstatic var screens(default, never):Array<Screen>;\n\t#else\n\t@:flash.property var bounds(get, never):flash.geom.Rectangle;\n\t@:flash.property var colorDepth(get, never):Int;\n\t@:flash.property var visibleBounds(get, never):flash.geom.Rectangle;\n\t@:flash.property static var mainScreen(get, never):Screen;\n\t@:flash.property static var screens(get, never):Array<Screen>;\n\t#end\n\tfunction new():Void;\n\tstatic function getScreensForRectangle(rect:flash.geom.Rectangle):Array<Screen>;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_bounds():flash.geom.Rectangle;\n\tprivate function get_colorDepth():Int;\n\tprivate function get_visibleBounds():flash.geom.Rectangle;\n\tprivate static function get_mainScreen():Screen;\n\tprivate static function get_screens():Array<Screen>;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/Stage.hx",
    "content": "package flash.display;\n\nextern class Stage extends DisplayObjectContainer\n{\n\t#if (haxe_ver < 4.3)\n\tvar align:StageAlign;\n\tvar allowsFullScreen(default, never):Bool;\n\t@:require(flash11_3) var allowsFullScreenInteractive(default, never):Bool;\n\t#if air\n\tvar autoOrients:Bool;\n\t#end\n\tvar browserZoomFactor(default, never):Float;\n\t@:require(flash10_2) var color:UInt;\n\t@:require(flash10) var colorCorrection:ColorCorrection;\n\t@:require(flash10) var colorCorrectionSupport(default, never):ColorCorrectionSupport;\n\t@:require(flash11_4) var contentsScaleFactor(default, never):Float;\n\t#if air\n\tvar deviceOrientation(default, never):StageOrientation;\n\t#end\n\t@:require(flash11) var displayContextInfo(default, never):String;\n\t// var constructor : Dynamic;\n\tvar displayState:StageDisplayState;\n\tvar focus:InteractiveObject;\n\tvar frameRate:Float;\n\tvar fullScreenHeight(default, never):UInt;\n\tvar fullScreenSourceRect:flash.geom.Rectangle;\n\tvar fullScreenWidth(default, never):UInt;\n\t@:require(flash11_2) var mouseLock:Bool;\n\t#if air\n\tvar nativeWindow(default, never):NativeWindow;\n\tvar orientation(default, never):StageOrientation;\n\t#end\n\tvar quality:StageQuality;\n\tvar scaleMode:StageScaleMode;\n\tvar showDefaultContextMenu:Bool;\n\t@:require(flash11) var softKeyboardRect(default, never):flash.geom.Rectangle;\n\t@:require(flash11) var stage3Ds(default, never):flash.Vector<Stage3D>;\n\tvar stageFocusRect:Bool;\n\tvar stageHeight:Int;\n\t@:require(flash10_2) var stageVideos(default, never):flash.Vector<flash.media.StageVideo>;\n\tvar stageWidth:Int;\n\t#if air\n\tvar supportedOrientations(default, never):flash.Vector<StageOrientation>;\n\t#end\n\t@:require(flash10_1) var wmodeGPU(default, never):Bool;\n\tstatic var supportsOrientationChange(default, never):Bool;\n\t#else\n\t@:flash.property var align(get, set):StageAlign;\n\t@:flash.property var allowsFullScreen(get, never):Bool;\n\t@:flash.property @:require(flash11_3) var allowsFullScreenInteractive(get, never):Bool;\n\t#if air\n\t@:flash.property var autoOrients(get, set):Bool;\n\t#end\n\t@:flash.property var browserZoomFactor(get, never):Float;\n\t@:flash.property @:require(flash10_2) var color(get, set):UInt;\n\t@:flash.property @:require(flash10) var colorCorrection(get, set):ColorCorrection;\n\t@:flash.property @:require(flash10) var colorCorrectionSupport(get, never):ColorCorrectionSupport;\n\t@:flash.property @:require(flash11_4) var contentsScaleFactor(get, never):Float;\n\t#if air\n\t@:flash.property var deviceOrientation(get, never):StageOrientation;\n\t#end\n\t@:flash.property @:require(flash11) var displayContextInfo(get, never):String;\n\t@:flash.property var displayState(get, set):StageDisplayState;\n\t@:flash.property var focus(get, set):InteractiveObject;\n\t@:flash.property var frameRate(get, set):Float;\n\t@:flash.property var fullScreenHeight(get, never):UInt;\n\t@:flash.property var fullScreenSourceRect(get, set):flash.geom.Rectangle;\n\t@:flash.property var fullScreenWidth(get, never):UInt;\n\t@:flash.property @:require(flash11_2) var mouseLock(get, set):Bool;\n\t#if air\n\t@:flash.property var nativeWindow(get, never):NativeWindow;\n\t@:flash.property var orientation(get, never):StageOrientation;\n\t#end\n\t@:flash.property var quality(get, set):StageQuality;\n\t@:flash.property var scaleMode(get, set):StageScaleMode;\n\t@:flash.property var showDefaultContextMenu(get, set):Bool;\n\t@:flash.property @:require(flash11) var softKeyboardRect(get, never):flash.geom.Rectangle;\n\t@:flash.property @:require(flash11) var stage3Ds(get, never):flash.Vector<Stage3D>;\n\t@:flash.property var stageFocusRect(get, set):Bool;\n\t@:flash.property var stageHeight(get, set):Int;\n\t@:flash.property @:require(flash10_2) var stageVideos(get, never):flash.Vector<flash.media.StageVideo>;\n\t@:flash.property var stageWidth(get, set):Int;\n\t#if air\n\t@:flash.property var supportedOrientations(get, never):flash.Vector<StageOrientation>;\n\t#end\n\t@:flash.property @:require(flash10_1) var wmodeGPU(get, never):Bool;\n\t@:flash.property static var supportsOrientationChange(get, never):Bool;\n\t#end\n\t#if air\n\tfunction assignFocus(objectToFocus:InteractiveObject, direction:FocusDirection):Void;\n\t#end\n\tfunction invalidate():Void;\n\tfunction isFocusInaccessible():Bool;\n\t#if air\n\tfunction setAspectRatio(newAspectRatio:StageAspectRatio):Void;\n\tfunction setOrientation(newOrientation:StageOrientation):Void;\n\t#end\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_align():StageAlign;\n\tprivate function get_allowsFullScreen():Bool;\n\tprivate function get_allowsFullScreenInteractive():Bool;\n\tprivate function get_browserZoomFactor():Float;\n\tprivate function get_color():UInt;\n\tprivate function get_colorCorrection():ColorCorrection;\n\tprivate function get_colorCorrectionSupport():ColorCorrectionSupport;\n\tprivate function get_constructor():Dynamic;\n\tprivate function get_contentsScaleFactor():Float;\n\tprivate function get_displayContextInfo():String;\n\tprivate function get_displayState():StageDisplayState;\n\tprivate function get_focus():InteractiveObject;\n\tprivate function get_frameRate():Float;\n\tprivate function get_fullScreenHeight():UInt;\n\tprivate function get_fullScreenSourceRect():flash.geom.Rectangle;\n\tprivate function get_fullScreenWidth():UInt;\n\tprivate function get_mouseLock():Bool;\n\tprivate function get_quality():StageQuality;\n\tprivate function get_scaleMode():StageScaleMode;\n\tprivate function get_showDefaultContextMenu():Bool;\n\tprivate function get_softKeyboardRect():flash.geom.Rectangle;\n\tprivate function get_stage3Ds():Vector<Stage3D>;\n\tprivate function get_stageFocusRect():Bool;\n\tprivate function get_stageHeight():Int;\n\tprivate function get_stageVideos():Vector<flash.media.StageVideo>;\n\tprivate function get_stageWidth():Int;\n\tprivate function get_wmodeGPU():Bool;\n\tprivate function set_align(value:StageAlign):StageAlign;\n\tprivate function set_color(value:UInt):UInt;\n\tprivate function set_colorCorrection(value:ColorCorrection):ColorCorrection;\n\tprivate function set_constructor(value:Dynamic):Dynamic;\n\tprivate function set_displayState(value:StageDisplayState):StageDisplayState;\n\tprivate function set_focus(value:InteractiveObject):InteractiveObject;\n\tprivate function set_frameRate(value:Float):Float;\n\tprivate function set_fullScreenSourceRect(value:flash.geom.Rectangle):flash.geom.Rectangle;\n\tprivate function set_mouseLock(value:Bool):Bool;\n\tprivate function set_quality(value:StageQuality):StageQuality;\n\tprivate function set_scaleMode(value:StageScaleMode):StageScaleMode;\n\tprivate function set_showDefaultContextMenu(value:Bool):Bool;\n\tprivate function set_stageFocusRect(value:Bool):Bool;\n\tprivate function set_stageHeight(value:Int):Int;\n\tprivate function set_stageWidth(value:Int):Int;\n\t#if air\n\tprivate static function get_supportsOrientationChange():Bool;\n\tprivate function get_autoOrients():Bool;\n\tprivate function get_deviceOrientation():StageOrientation;\n\tprivate function get_nativeWindow():NativeWindow;\n\tprivate function get_orientation():StageOrientation;\n\tprivate function get_supportedOrientations():Vector<StageOrientation>;\n\tprivate function get_vsyncEnabled():Bool;\n\tprivate function set_autoOrients(value:Bool):Bool;\n\tprivate function set_vsyncEnabled(value:Bool):Bool;\n\t#end\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/display/StageAspectRatio.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.StageAspectRatio\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract StageAspectRatio(String)\n{\n\tvar ANY = \"any\";\n\tvar LANDSCAPE = \"landscape\";\n\tvar PORTRAIT = \"portrait\";\n}\n"
  },
  {
    "path": "externs/air/flash/display/StageOrientation.hx",
    "content": "package flash.display;\n\n@:native(\"flash.display.StageOrientation\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract StageOrientation(String)\n{\n\tvar DEFAULT = \"default\";\n\tvar ROTATED_LEFT = \"rotatedLeft\";\n\tvar ROTATED_RIGHT = \"rotatedRight\";\n\tvar UNKNOWN = \"unknown\";\n\tvar UPSIDE_DOWN = \"upsideDown\";\n}\n"
  },
  {
    "path": "externs/air/flash/display3D/Context3DProfile.hx",
    "content": "package flash.display3D;\n\n@:native(\"flash.display3D.Context3DProfile\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract Context3DProfile(String)\n{\n\tvar BASELINE = \"baseline\";\n\tvar BASELINE_CONSTRAINED = \"baselineConstrained\";\n\tvar BASELINE_EXTENDED = \"baselineExtended\";\n\tvar STANDARD = \"standard\";\n\tvar STANDARD_CONSTRAINED = \"standardConstrained\";\n\tvar STANDARD_EXTENDED = \"standardExtended\";\n\t#if air\n\tvar ENHANCED = \"enhanced\";\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/errors/PermissionError.hx",
    "content": "package flash.errors;\n\nextern class PermissionError extends Error\n{\n\tfunction new(message:String, id:Int):Void;\n\tfunction toString():String;\n}\n"
  },
  {
    "path": "externs/air/flash/errors/SQLError.hx",
    "content": "package flash.errors;\n\nextern class SQLError extends flash.errors.Error\n{\n\tvar detailArguments(default, never):Array<String>;\n\tvar detailID(default, never):Int;\n\tvar details(default, never):String;\n\tvar operation(default, never):SQLErrorOperation;\n\tfunction new(operation:SQLErrorOperation, ?details:String = \"\", ?message:String = \"\", ?id:Int = 0, ?detailID:Int = -1, ?detailArgs:Array<Dynamic>):Void;\n\tfunction toString():String;\n}\n"
  },
  {
    "path": "externs/air/flash/errors/SQLErrorOperation.hx",
    "content": "package flash.errors;\n\n@:native(\"flash.errors.SQLErrorOperation\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SQLErrorOperation(String)\n{\n\tvar ANALYZE = \"analyze\";\n\tvar ATTACH = \"attach\";\n\tvar BEGIN = \"begin\";\n\tvar CLOSE = \"close\";\n\tvar COMMIT = \"commit\";\n\tvar COMPACT = \"compact\";\n\tvar DEANALYZE = \"deanalyze\";\n\tvar DETACH = \"detach\";\n\tvar EXECUTE = \"execute\";\n\tvar OPEN = \"open\";\n\tvar REENCRYPT = \"reencrypt\";\n\tvar RELEASE_SAVEPOINT = \"releaseSavepoint\";\n\tvar ROLLBACK = \"rollback\";\n\tvar ROLLBACK_TO_SAVEPOINT = \"rollbackToSavepoint\";\n\tvar SCHEMA = \"schema\";\n\tvar SET_SAVEPOINT = \"setSavepoint\";\n}\n"
  },
  {
    "path": "externs/air/flash/events/BrowserInvokeEvent.hx",
    "content": "package flash.events;\n\nextern class BrowserInvokeEvent extends Event\n{\n\tvar arguments(default, never):Array<Dynamic>;\n\tvar isHTTPS(default, never):Bool;\n\tvar isUserEvent(default, never):Bool;\n\tvar sandboxType(default, never):String;\n\tvar securityDomain(default, never):String;\n\tfunction new(type:String, bubbles:Bool, cancelable:Bool, arguments:Array<Dynamic>, sandboxType:String, securityDomain:String, isHTTPS:Bool,\n\t\tisUserEvent:Bool):Void;\n\tstatic var BROWSER_INVOKE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/DNSResolverEvent.hx",
    "content": "package flash.events;\n\nextern class DNSResolverEvent extends Event\n{\n\tvar host:String;\n\tvar resourceRecords:Array<Dynamic>;\n\tfunction new(type:String, bubbles:Bool = \"false\", cancelable:Bool = false, host:String = \"\", ?resourceRecords:Array<Dynamic>):Void;\n\tstatic var LOOKUP(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/DRMStatusEvent.hx",
    "content": "package flash.events;\n\n@:require(flash10_1) extern class DRMStatusEvent extends Event\n{\n\tvar contentData:flash.net.drm.DRMContentData;\n\t#if air\n\tvar detail(default, never):String;\n\tvar isAnonymous(default, never):Bool;\n\tvar isAvailableOffline(default, never):Bool;\n\t#end\n\tvar isLocal:Bool;\n\t#if air\n\tvar offlineLeasePeriod(default, never):UInt;\n\tvar policies(default, never):flash.utils.Object;\n\t#end\n\tvar voucher:flash.net.drm.DRMVoucher;\n\t#if air\n\tvar voucherEndDate(default, never):Date;\n\t#end\n\tfunction new(?type:String, bubbles:Bool = false, cancelable:Bool = false, ?inMetadata:flash.net.drm.DRMContentData, ?inVoucher:flash.net.drm.DRMVoucher,\n\t\tinLocal:Bool = false):Void;\n\tstatic var DRM_STATUS(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/DatagramSocketDataEvent.hx",
    "content": "package flash.events;\n\nextern class DatagramSocketDataEvent extends Event\n{\n\tvar data:flash.utils.ByteArray;\n\tvar dstAddress:String;\n\tvar dstPort:Int;\n\tvar srcAddress:String;\n\tvar srcPort:Int;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, srcAddress:String = \"\", srcPort:Int = 0, dstAddress:String = \"\", dstPort:Int = 0,\n\t\t?data:flash.utils.ByteArray):Void;\n\tstatic var DATA(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/DeviceRotationEvent.hx",
    "content": "package flash.events;\n\nextern class DeviceRotationEvent extends Event\n{\n\tvar pitch:Float;\n\tvar quaternion:Array<Float>;\n\tvar roll:Float;\n\tvar timestamp:Float;\n\tvar yaw:Float;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, timestamp:Float = 0, roll:Float = 0, pitch:Float = 0, yaw:Float = 0,\n\t\t?quaternion:Array<Dynamic>):Void;\n\tstatic var UPDATE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/Event.hx",
    "content": "package flash.events;\n\nextern class Event\n{\n\tvar bubbles(default, never):Bool;\n\tvar cancelable(default, never):Bool;\n\tvar currentTarget(default, never):Dynamic;\n\tvar eventPhase(default, never):EventPhase;\n\tvar target(default, never):Dynamic;\n\tvar type(default, never):String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false):Void;\n\tfunction clone():Event;\n\tfunction formatToString(className:String, ?p1:Dynamic, ?p2:Dynamic, ?p3:Dynamic, ?p4:Dynamic, ?p5:Dynamic):String;\n\tfunction isDefaultPrevented():Bool;\n\tfunction preventDefault():Void;\n\tfunction stopImmediatePropagation():Void;\n\tfunction stopPropagation():Void;\n\tfunction toString():String;\n\tstatic var ACTIVATE(default, never):String;\n\tstatic var ADDED(default, never):String;\n\tstatic var ADDED_TO_STAGE(default, never):String;\n\tstatic var BROWSER_ZOOM_CHANGE(default, never):String;\n\tstatic var CANCEL(default, never):String;\n\tstatic var CHANGE(default, never):String;\n\tstatic var CHANNEL_MESSAGE(default, never):String;\n\tstatic var CHANNEL_STATE(default, never):String;\n\t@:require(flash10) static var CLEAR(default, never):String;\n\tstatic var CLOSE(default, never):String;\n\t#if air\n\tstatic var CLOSING(default, never):String;\n\t#end\n\tstatic var COMPLETE(default, never):String;\n\tstatic var CONNECT(default, never):String;\n\t@:require(flash11) static var CONTEXT3D_CREATE(default, never):String;\n\t@:require(flash10) static var COPY(default, never):String;\n\t@:require(flash10) static var CUT(default, never):String;\n\tstatic var DEACTIVATE(default, never):String;\n\t#if air\n\tstatic var DISPLAYING(default, never):String;\n\t#end\n\tstatic var ENTER_FRAME(default, never):String;\n\t#if air\n\tstatic var EXITING(default, never):String;\n\t#end\n\t@:require(flash10) static var EXIT_FRAME(default, never):String;\n\t@:require(flash10) static var FRAME_CONSTRUCTED(default, never):String;\n\t@:require(flash11_3) static var FRAME_LABEL(default, never):String;\n\tstatic var FULLSCREEN(default, never):String;\n\t#if air\n\tstatic var HTML_BOUNDS_CHANGE(default, never):String;\n\tstatic var HTML_DOM_INITIALIZE(default, never):String;\n\tstatic var HTML_RENDER(default, never):String;\n\t#end\n\tstatic var ID3(default, never):String;\n\tstatic var INIT(default, never):String;\n\t#if air\n\tstatic var LOCATION_CHANGE(default, never):String;\n\t#end\n\tstatic var MOUSE_LEAVE(default, never):String;\n\t#if air\n\tstatic var NETWORK_CHANGE(default, never):String;\n\t#end\n\tstatic var OPEN(default, never):String;\n\t@:require(flash10) static var PASTE(default, never):String;\n\t#if air\n\tstatic var PREPARING(default, never):String;\n\t#end\n\tstatic var REMOVED(default, never):String;\n\tstatic var REMOVED_FROM_STAGE(default, never):String;\n\tstatic var RENDER(default, never):String;\n\tstatic var RESIZE(default, never):String;\n\tstatic var SCROLL(default, never):String;\n\tstatic var SELECT(default, never):String;\n\t@:require(flash10) static var SELECT_ALL(default, never):String;\n\tstatic var SOUND_COMPLETE(default, never):String;\n\t#if air\n\tstatic var STANDARD_ERROR_CLOSE(default, never):String;\n\tstatic var STANDARD_INPUT_CLOSE(default, never):String;\n\tstatic var STANDARD_OUTPUT_CLOSE(default, never):String;\n\t#end\n\t@:require(flash11_3) static var SUSPEND(default, never):String;\n\tstatic var TAB_CHILDREN_CHANGE(default, never):String;\n\tstatic var TAB_ENABLED_CHANGE(default, never):String;\n\tstatic var TAB_INDEX_CHANGE(default, never):String;\n\t@:require(flash11_3) static var TEXTURE_READY(default, never):String;\n\t@:require(flash11) static var TEXT_INTERACTION_MODE_CHANGE(default, never):String;\n\tstatic var UNLOAD(default, never):String;\n\t#if air\n\tstatic var USER_IDLE(default, never):String;\n\tstatic var USER_PRESENT(default, never):String;\n\t#end\n\tstatic var VIDEO_FRAME(default, never):String;\n\tstatic var WORKER_STATE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/FileListEvent.hx",
    "content": "package flash.events;\n\nextern class FileListEvent extends Event\n{\n\tvar files:Array<flash.filesystem.File>;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?files:Array<flash.filesystem.File>):Void;\n\tstatic var DIRECTORY_LISTING(default, never):String;\n\tstatic var SELECT_MULTIPLE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/FocusEvent.hx",
    "content": "package flash.events;\n\nextern class FocusEvent extends Event\n{\n\t#if air\n\tvar direction:flash.display.FocusDirection;\n\t#end\n\t@:require(flash10) var isRelatedObjectInaccessible:Bool;\n\tvar keyCode:UInt;\n\tvar relatedObject:flash.display.InteractiveObject;\n\tvar shiftKey:Bool;\n\tfunction new(type:String, bubbles:Bool = true, cancelable:Bool = false, ?relatedObject:flash.display.InteractiveObject, shiftKey:Bool = false,\n\t\tkeyCode:UInt = 0):Void;\n\tstatic var FOCUS_IN(default, never):String;\n\tstatic var FOCUS_OUT(default, never):String;\n\tstatic var KEY_FOCUS_CHANGE(default, never):String;\n\tstatic var MOUSE_FOCUS_CHANGE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/GestureEvent.hx",
    "content": "package flash.events;\n\n@:require(flash10_1) extern class GestureEvent extends Event\n{\n\tvar altKey:Bool;\n\t#if air\n\tvar commandKey:Bool;\n\t#end\n\tvar controlKey:Bool;\n\tvar ctrlKey:Bool;\n\tvar localX:Float;\n\tvar localY:Float;\n\tvar phase:String;\n\tvar shiftKey:Bool;\n\tvar stageX(default, never):Float;\n\tvar stageY(default, never):Float;\n\tfunction new(type:String, bubbles:Bool = true, cancelable:Bool = false, ?phase:String, localX:Float = 0, localY:Float = 0, ctrlKey:Bool = false,\n\t\taltKey:Bool = false, shiftKey:Bool = false):Void;\n\tfunction updateAfterEvent():Void;\n\tstatic var GESTURE_TWO_FINGER_TAP(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/HTMLUncaughtScriptExceptionEvent.hx",
    "content": "package flash.events;\n\nextern class HTMLUncaughtScriptExceptionEvent extends Event\n{\n\tvar exceptionValue:Dynamic;\n\tvar stackTrace:Array<{sourceURL:String, line:Float, functionName:String}>;\n\tfunction new(exceptionValue:Dynamic):Void;\n\tstatic var UNCAUGHT_SCRIPT_EXCEPTION(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/IOErrorEvent.hx",
    "content": "package flash.events;\n\nextern class IOErrorEvent extends ErrorEvent\n{\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?text:String, id:Int = 0):Void;\n\tstatic var DISK_ERROR(default, never):String;\n\tstatic var IO_ERROR(default, never):String;\n\tstatic var NETWORK_ERROR(default, never):String;\n\t#if air\n\tstatic var STANDARD_ERROR_IO_ERROR(default, never):String;\n\tstatic var STANDARD_INPUT_IO_ERROR(default, never):String;\n\tstatic var STANDARD_OUTPUT_IO_ERROR(default, never):String;\n\t#end\n\tstatic var VERIFY_ERROR(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/InvokeEvent.hx",
    "content": "package flash.events;\n\nextern class InvokeEvent extends Event\n{\n\tvar arguments(default, never):Array<String>;\n\tvar currentDirectory(default, never):flash.filesystem.File;\n\tvar reason(default, never):flash.desktop.InvokeEventReason;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?dir:flash.filesystem.File, ?argv:Array<Dynamic>,\n\t\treason:flash.desktop.InvokeEventReason = flash.desktop.InvokeEventReason.STANDARD):Void;\n\tstatic var INVOKE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/KeyboardEvent.hx",
    "content": "package flash.events;\n\nextern class KeyboardEvent extends Event\n{\n\tvar altKey:Bool;\n\tvar charCode:UInt;\n\t#if air\n\tvar commandKey:Bool;\n\t#end\n\tvar controlKey:Bool;\n\tvar ctrlKey:Bool;\n\tvar keyCode:UInt;\n\tvar keyLocation:flash.ui.KeyLocation;\n\tvar shiftKey:Bool;\n\tfunction new(type:String, bubbles:Bool = true, cancelable:Bool = false, charCodeValue:UInt = 0, keyCodeValue:UInt = 0,\n\t\tkeyLocationValue:flash.ui.KeyLocation = STANDARD, ctrlKeyValue:Bool = false, altKeyValue:Bool = false, shiftKeyValue:Bool = false):Void;\n\tfunction updateAfterEvent():Void;\n\tstatic var KEY_DOWN(default, never):String;\n\tstatic var KEY_UP(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/LocationChangeEvent.hx",
    "content": "package flash.events;\n\nextern class LocationChangeEvent extends Event\n{\n\tvar location:String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?location:String):Void;\n\tstatic var LOCATION_CHANGE(default, never):String;\n\tstatic var LOCATION_CHANGING(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/MediaEvent.hx",
    "content": "package flash.events;\n\nextern class MediaEvent extends Event\n{\n\tvar data(default, never):flash.media.MediaPromise;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?data:flash.media.MediaPromise):Void;\n\tstatic var COMPLETE(default, never):String;\n\tstatic var SELECT(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/MouseEvent.hx",
    "content": "package flash.events;\n\nextern class MouseEvent extends Event\n{\n\tvar altKey:Bool;\n\tvar buttonDown:Bool;\n\t#if air\n\tvar clickCount(default, never):Int;\n\tvar commandKey:Bool;\n\tvar controlKey:Bool;\n\t#end\n\tvar ctrlKey:Bool;\n\tvar delta:Int;\n\t@:require(flash10) var isRelatedObjectInaccessible:Bool;\n\tvar localX:Float;\n\tvar localY:Float;\n\t@:require(flash11_2) var movementX:Float;\n\t@:require(flash11_2) var movementY:Float;\n\tvar relatedObject:flash.display.InteractiveObject;\n\tvar shiftKey:Bool;\n\tvar stageX(default, never):Float;\n\tvar stageY(default, never):Float;\n\tfunction new(type:String, bubbles:Bool = true, cancelable:Bool = false, localX:Null<Float> = 0, localY:Null<Float> = 0,\n\t\t?relatedObject:flash.display.InteractiveObject, ctrlKey:Bool = false, altKey:Bool = false, shiftKey:Bool = false, buttonDown:Bool = false,\n\t\tdelta:Int = 0):Void;\n\tfunction updateAfterEvent():Void;\n\tstatic var CLICK(default, never):String;\n\t@:require(flash11_2) static var CONTEXT_MENU(default, never):String;\n\tstatic var DOUBLE_CLICK(default, never):String;\n\t@:require(flash11_2) static var MIDDLE_CLICK(default, never):String;\n\t@:require(flash11_2) static var MIDDLE_MOUSE_DOWN(default, never):String;\n\t@:require(flash11_2) static var MIDDLE_MOUSE_UP(default, never):String;\n\tstatic var MOUSE_DOWN(default, never):String;\n\tstatic var MOUSE_MOVE(default, never):String;\n\tstatic var MOUSE_OUT(default, never):String;\n\tstatic var MOUSE_OVER(default, never):String;\n\tstatic var MOUSE_UP(default, never):String;\n\tstatic var MOUSE_WHEEL(default, never):String;\n\t@:require(flash11_3) static var RELEASE_OUTSIDE(default, never):String;\n\t@:require(flash11_2) static var RIGHT_CLICK(default, never):String;\n\t@:require(flash11_2) static var RIGHT_MOUSE_DOWN(default, never):String;\n\t@:require(flash11_2) static var RIGHT_MOUSE_UP(default, never):String;\n\tstatic var ROLL_OUT(default, never):String;\n\tstatic var ROLL_OVER(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/NativeDragEvent.hx",
    "content": "package flash.events;\n\nextern class NativeDragEvent extends MouseEvent\n{\n\tvar allowedActions:flash.desktop.NativeDragOptions;\n\tvar clipboard:flash.desktop.Clipboard;\n\tvar dropAction:String;\n\tfunction new(type:String, ?bubbles:Bool = false, ?cancelable:Bool = true, ?localX:Float, ?localY:Float, ?relatedObject:flash.display.InteractiveObject,\n\t\t?clipboard:flash.desktop.Clipboard, ?allowedActions:flash.desktop.NativeDragOptions, ?dropAction:String, controlKey:Bool = false, altKey:Bool = false,\n\t\tshiftKey:Bool = false, commandKey:Bool = false):Void;\n\tstatic var NATIVE_DRAG_COMPLETE(default, never):String;\n\tstatic var NATIVE_DRAG_DROP(default, never):String;\n\tstatic var NATIVE_DRAG_ENTER(default, never):String;\n\tstatic var NATIVE_DRAG_EXIT(default, never):String;\n\tstatic var NATIVE_DRAG_OVER(default, never):String;\n\tstatic var NATIVE_DRAG_START(default, never):String;\n\tstatic var NATIVE_DRAG_UPDATE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/NativeProcessExitEvent.hx",
    "content": "package flash.events;\n\nextern class NativeProcessExitEvent extends Event\n{\n\tvar exitCode:Float;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?exitCode:Float):Void;\n\tstatic var EXIT(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/NativeWindowBoundsEvent.hx",
    "content": "package flash.events;\n\nextern class NativeWindowBoundsEvent extends Event\n{\n\tvar afterBounds(default, never):flash.geom.Rectangle;\n\tvar beforeBounds(default, never):flash.geom.Rectangle;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?beforeBounds:flash.geom.Rectangle, ?afterBounds:flash.geom.Rectangle):Void;\n\tstatic var MOVE(default, never):String;\n\tstatic var MOVING(default, never):String;\n\tstatic var RESIZE(default, never):String;\n\tstatic var RESIZING(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/NativeWindowDisplayStateEvent.hx",
    "content": "package flash.events;\n\nextern class NativeWindowDisplayStateEvent extends Event\n{\n\tvar afterDisplayState(default, never):String;\n\tvar beforeDisplayState(default, never):String;\n\tfunction new(type:String, bubbles:Bool = true, cancelable:Bool = false, beforeDisplayState:String = \"\", afterDisplayState:String = \"\"):Void;\n\tstatic var DISPLAY_STATE_CHANGE(default, never):String;\n\tstatic var DISPLAY_STATE_CHANGING(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/PermissionEvent.hx",
    "content": "package flash.events;\n\n@:final extern class PermissionEvent extends Event\n{\n\tvar status(default, never):String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?status:String):Void;\n\tstatic var PERMISSION_STATUS(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/ProgressEvent.hx",
    "content": "package flash.events;\n\nextern class ProgressEvent extends Event\n{\n\tvar bytesLoaded:Float;\n\tvar bytesTotal:Float;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, bytesLoaded:Float = 0, bytesTotal:Float = 0):Void;\n\tstatic var PROGRESS(default, never):String;\n\tstatic var SOCKET_DATA(default, never):String;\n\t#if air\n\tstatic var STANDARD_ERROR_DATA(default, never):String;\n\tstatic var STANDARD_INPUT_PROGRESS(default, never):String;\n\tstatic var STANDARD_OUTPUT_DATA(default, never):String;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/events/RemoteNotificationEvent.hx",
    "content": "package flash.events;\n\n@:final extern class RemoteNotificationEvent extends Event\n{\n\tvar data(default, never):Dynamic;\n\tvar tokenId(default, never):String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?data:Dynamic, ?tokenId:String):Void;\n\tstatic var NOTIFICATION(default, never):String;\n\tstatic var TOKEN(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/SQLErrorEvent.hx",
    "content": "package flash.events;\n\nextern class SQLErrorEvent extends ErrorEvent\n{\n\tvar error(default, never):flash.errors.SQLError;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?error:flash.errors.SQLError):Void;\n\tstatic var ERROR(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/SQLEvent.hx",
    "content": "package flash.events;\n\nextern class SQLEvent extends Event\n{\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false):Void;\n\tstatic var ANALYZE(default, never):String;\n\tstatic var ATTACH(default, never):String;\n\tstatic var BEGIN(default, never):String;\n\tstatic var CANCEL(default, never):String;\n\tstatic var CLOSE(default, never):String;\n\tstatic var COMMIT(default, never):String;\n\tstatic var COMPACT(default, never):String;\n\tstatic var DEANALYZE(default, never):String;\n\tstatic var DETACH(default, never):String;\n\tstatic var OPEN(default, never):String;\n\tstatic var REENCRYPT(default, never):String;\n\tstatic var RELEASE_SAVEPOINT(default, never):String;\n\tstatic var RESULT(default, never):String;\n\tstatic var ROLLBACK(default, never):String;\n\tstatic var ROLLBACK_TO_SAVEPOINT(default, never):String;\n\tstatic var SCHEMA(default, never):String;\n\tstatic var SET_SAVEPOINT(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/SQLUpdateEvent.hx",
    "content": "package flash.events;\n\nextern class SQLUpdateEvent extends Event\n{\n\tvar rowID(default, never):Float;\n\tvar table(default, never):String;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?table:String, rowID:Float = 0.0):Void;\n\tstatic var DELETE(default, never):String;\n\tstatic var INSERT(default, never):String;\n\tstatic var UPDATE(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/ScreenMouseEvent.hx",
    "content": "package flash.events;\n\nextern class ScreenMouseEvent extends MouseEvent\n{\n\tvar screenX(default, never):Float;\n\tvar screenY(default, never):Float;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, screenX:Float, screenY:Float, ctrlKey:Bool, altKey:Bool = false,\n\t\tshiftKey:Bool = false, buttonDown:Bool = false, commandKey:Bool = false, controlKey:Bool = false):Void;\n\tstatic var CLICK(default, never):String;\n\tstatic var MOUSE_DOWN(default, never):String;\n\tstatic var MOUSE_UP(default, never):String;\n\tstatic var RIGHT_CLICK(default, never):String;\n\tstatic var RIGHT_MOUSE_DOWN(default, never):String;\n\tstatic var RIGHT_MOUSE_UP(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/ServerSocketConnectEvent.hx",
    "content": "package flash.events;\n\nextern class ServerSocketConnectEvent extends Event\n{\n\tvar socket:flash.net.Socket;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?socket:flash.net.Socket):Void;\n\tstatic var CONNECT(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/StageOrientationEvent.hx",
    "content": "package flash.events;\n\nextern class StageOrientationEvent extends Event\n{\n\tvar afterOrientation(default, never):flash.display.StageOrientation;\n\tvar beforeOrientation(default, never):flash.display.StageOrientation;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?beforeOrientation:flash.display.StageOrientation,\n\t\t?afterOrientation:flash.display.StageOrientation):Void;\n\tstatic var ORIENTATION_CHANGE(default, never):String;\n\tstatic var ORIENTATION_CHANGING(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/StorageVolumeChangeEvent.hx",
    "content": "package flash.events;\n\nextern class StorageVolumeChangeEvent extends Event\n{\n\tvar _rootDirectory:flash.filesystem.File;\n\tvar _volume:flash.filesystem.StorageVolume;\n\tvar rootDirectory(default, never):flash.filesystem.File;\n\tvar storageVolume(default, never):flash.filesystem.StorageVolume;\n\tfunction new(type:String, bubbles:Bool = false, cancelable:Bool = false, ?path:flash.filesystem.File, ?volume:flash.filesystem.StorageVolume):Void;\n\tstatic var STORAGE_VOLUME_MOUNT(default, never):String;\n\tstatic var STORAGE_VOLUME_UNMOUNT(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/TouchEvent.hx",
    "content": "package flash.events;\n\n@:require(flash10_1) extern class TouchEvent extends Event\n{\n\tvar altKey:Bool;\n\t#if air\n\tvar commandKey:Bool;\n\t#end\n\tvar controlKey:Bool;\n\tvar ctrlKey:Bool;\n\tvar isPrimaryTouchPoint:Bool;\n\tvar isRelatedObjectInaccessible:Bool;\n\t#if air\n\tvar isTouchPointCanceled:Bool;\n\t#end\n\tvar localX:Float;\n\tvar localY:Float;\n\tvar pressure:Float;\n\tvar relatedObject:flash.display.InteractiveObject;\n\tvar shiftKey:Bool;\n\tvar sizeX:Float;\n\tvar sizeY:Float;\n\tvar stageX(default, never):Float;\n\tvar stageY(default, never):Float;\n\t#if air\n\tvar timestamp:Float;\n\tvar touchIntent:TouchEventIntent;\n\t#end\n\tvar touchPointID:Int;\n\tfunction new(type:String, bubbles:Bool = true, cancelable:Bool = false, touchPointID:Int = 0, isPrimaryTouchPoint:Bool = false, localX:Float = 0. /*NaN*/,\n\t\tlocalY:Float = 0. /*NaN*/, sizeX:Float = 0. /*NaN*/, sizeY:Float = 0. /*NaN*/, pressure:Float = 0. /*NaN*/,\n\t\t?relatedObject:flash.display.InteractiveObject, ctrlKey:Bool = false, altKey:Bool = false, shiftKey:Bool = false\n\t\t#if air, commandKey:Bool = false, controlKey:Bool = false, ?timestamp:Float, ?touchIntent:TouchEventIntent, ?samples:flash.utils.ByteArray,\n\t\tisTouchPointCanceled:Bool = false #end):Void;\n\t#if air\n\tfunction getSamples(buffer:flash.utils.ByteArray, append:Bool = false):UInt;\n\tfunction isToolButtonDown(index:Int):Bool;\n\t#end\n\tfunction updateAfterEvent():Void;\n\tstatic var PROXIMITY_BEGIN(default, never):String;\n\tstatic var PROXIMITY_END(default, never):String;\n\tstatic var PROXIMITY_MOVE(default, never):String;\n\tstatic var PROXIMITY_OUT(default, never):String;\n\tstatic var PROXIMITY_OVER(default, never):String;\n\tstatic var PROXIMITY_ROLL_OUT(default, never):String;\n\tstatic var PROXIMITY_ROLL_OVER(default, never):String;\n\tstatic var TOUCH_BEGIN(default, never):String;\n\tstatic var TOUCH_END(default, never):String;\n\tstatic var TOUCH_MOVE(default, never):String;\n\tstatic var TOUCH_OUT(default, never):String;\n\tstatic var TOUCH_OVER(default, never):String;\n\tstatic var TOUCH_ROLL_OUT(default, never):String;\n\tstatic var TOUCH_ROLL_OVER(default, never):String;\n\tstatic var TOUCH_TAP(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/events/TouchEventIntent.hx",
    "content": "package flash.events;\n\n@:native(\"flash.events.TouchEventIntent\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract TouchEventIntent(String)\n{\n\tvar ERASER = \"eraser\";\n\tvar PEN = \"pen\";\n\tvar UNKNOWN = \"unknown\";\n}\n"
  },
  {
    "path": "externs/air/flash/external/ExtensionContext.hx",
    "content": "package flash.external;\n\n@:final extern class ExtensionContext extends flash.events.EventDispatcher\n{\n\tvar actionScriptData:flash.utils.Object;\n\tfunction new():Void;\n\t// function _disposed() : Bool;\n\tfunction call(functionName:String, ?p1:Dynamic, ?p2:Dynamic, ?p3:Dynamic, ?p4:Dynamic, ?p5:Dynamic):Dynamic;\n\tfunction dispose():Void;\n\t// function getActionScriptData() : flash.utils.Object;\n\t// function setActionScriptData(p1 : flash.utils.Object) : Void;\n\tstatic function createExtensionContext(extensionID:String, contextType:String):ExtensionContext;\n\tstatic function getExtensionDirectory(extensionID:String):flash.filesystem.File;\n}\n"
  },
  {
    "path": "externs/air/flash/filesystem/File.hx",
    "content": "package flash.filesystem;\n\nextern class File extends flash.net.FileReference\n{\n\tvar downloaded:Bool;\n\tvar exists(default, never):Bool;\n\tvar icon(default, never):flash.desktop.Icon;\n\tvar isDirectory(default, never):Bool;\n\tvar isHidden(default, never):Bool;\n\tvar isPackage(default, never):Bool;\n\tvar isSymbolicLink(default, never):Bool;\n\tvar nativePath:String;\n\tvar parent(default, never):File;\n\tvar preventBackup:Bool;\n\tvar spaceAvailable(default, never):Float;\n\tvar url:String;\n\tfunction new(?path:String):Void;\n\tfunction browseForDirectory(title:String):Void;\n\tfunction browseForOpen(title:String, ?typeFilter:Array<flash.net.FileFilter>):Void;\n\tfunction browseForOpenMultiple(title:String, ?typeFilter:Array<flash.net.FileFilter>):Void;\n\tfunction browseForSave(title:String):Void;\n\tfunction canonicalize():Void;\n\tfunction clone():File;\n\tfunction copyTo(newLocation:flash.net.FileReference, overwrite:Bool = false):Void;\n\tfunction copyToAsync(newLocation:flash.net.FileReference, overwrite:Bool = false):Void;\n\tfunction createDirectory():Void;\n\tfunction deleteDirectory(deleteDirectoryContents:Bool = false):Void;\n\tfunction deleteDirectoryAsync(deleteDirectoryContents:Bool = false):Void;\n\tfunction deleteFile():Void;\n\tfunction deleteFileAsync():Void;\n\tfunction getDirectoryListing():Array<File>;\n\tfunction getDirectoryListingAsync():Void;\n\tfunction getRelativePath(ref:flash.net.FileReference, useDotDot:Bool = false):String;\n\tfunction moveTo(newLocation:flash.net.FileReference, overwrite:Bool = false):Void;\n\tfunction moveToAsync(newLocation:flash.net.FileReference, overwrite:Bool = false):Void;\n\tfunction moveToTrash():Void;\n\tfunction moveToTrashAsync():Void;\n\tfunction openWithDefaultApplication():Void;\n\tfunction resolvePath(path:String):File;\n\tstatic var applicationDirectory(default, never):File;\n\tstatic var applicationStorageDirectory(default, never):File;\n\tstatic var cacheDirectory(default, never):File;\n\tstatic var desktopDirectory(default, never):File;\n\tstatic var documentsDirectory(default, never):File;\n\tstatic var lineEnding(default, never):String;\n\tstatic var permissionStatus(default, never):String;\n\tstatic var separator(default, never):String;\n\tstatic var systemCharset(default, never):String;\n\tstatic var userDirectory(default, never):File;\n\tstatic function createTempDirectory():File;\n\tstatic function createTempFile():File;\n\tstatic function getRootDirectories():Array<File>;\n}\n"
  },
  {
    "path": "externs/air/flash/filesystem/FileMode.hx",
    "content": "package flash.filesystem;\n\n@:native(\"flash.filesystem.FileMode\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract FileMode(String)\n{\n\tvar APPEND = \"append\";\n\tvar READ = \"read\";\n\tvar UPDATE = \"update\";\n\tvar WRITE = \"write\";\n}\n"
  },
  {
    "path": "externs/air/flash/filesystem/FileStream.hx",
    "content": "package flash.filesystem;\n\nextern class FileStream extends flash.events.EventDispatcher implements flash.utils.IDataInput implements flash.utils.IDataOutput\n{\n\t#if (haxe_ver < 4.3)\n\tvar bytesAvailable(default, never):UInt;\n\tvar endian:flash.utils.Endian;\n\tvar objectEncoding:#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\t#else\n\t@:flash.property var bytesAvailable(get, never):UInt;\n\t@:flash.property var endian(get, set):flash.utils.Endian;\n\t@:flash.property var objectEncoding(get, set):#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\t#end\n\n\tvar position:Float;\n\tvar readAhead:Float;\n\tfunction new():Void;\n\tfunction close():Void;\n\tfunction open(file:File, fileMode:FileMode):Void;\n\tfunction openAsync(file:File, fileMode:FileMode):Void;\n\tfunction readBoolean():Bool;\n\tfunction readByte():Int;\n\tfunction readBytes(bytes:flash.utils.ByteArray, offset:UInt = 0, length:UInt = 0):Void;\n\tfunction readDouble():Float;\n\tfunction readFloat():Float;\n\tfunction readInt():Int;\n\tfunction readMultiByte(length:UInt, charSet:String):String;\n\tfunction readObject():Dynamic;\n\tfunction readShort():Int;\n\tfunction readUTF():String;\n\tfunction readUTFBytes(length:UInt):String;\n\tfunction readUnsignedByte():UInt;\n\tfunction readUnsignedInt():UInt;\n\tfunction readUnsignedShort():UInt;\n\tfunction truncate():Void;\n\tfunction writeBoolean(value:Bool):Void;\n\tfunction writeByte(value:Int):Void;\n\tfunction writeBytes(bytes:flash.utils.ByteArray, offset:UInt = 0, length:UInt = 0):Void;\n\tfunction writeDouble(value:Float):Void;\n\tfunction writeFloat(value:Float):Void;\n\tfunction writeInt(value:Int):Void;\n\tfunction writeMultiByte(value:String, charSet:String):Void;\n\tfunction writeObject(object:Dynamic):Void;\n\tfunction writeShort(value:Int):Void;\n\tfunction writeUTF(value:String):Void;\n\tfunction writeUTFBytes(value:String):Void;\n\tfunction writeUnsignedInt(value:UInt):Void;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_bytesAvailable():UInt;\n\tprivate function get_endian():flash.utils.Endian;\n\tprivate function get_objectEncoding():#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\tprivate function set_endian(value:flash.utils.Endian):flash.utils.Endian;\n\tprivate function set_objectEncoding(value:#if openfl openfl.net.ObjectEncoding #else UInt #end):#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/filesystem/StorageVolume.hx",
    "content": "package flash.filesystem;\n\nextern class StorageVolume\n{\n\tvar drive(default, never):String;\n\tvar fileSystemType(default, never):String;\n\tvar isRemovable(default, never):Bool;\n\tvar isWritable(default, never):Bool;\n\tvar name(default, never):String;\n\tvar rootDirectory(default, never):File;\n\tfunction new(rootDirPath:File, name:String, writable:Bool, removable:Bool, fileSysType:String, drive:String):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/filesystem/StorageVolumeInfo.hx",
    "content": "package flash.filesystem;\n\n@:final extern class StorageVolumeInfo extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction getStorageVolumes():flash.Vector<StorageVolume>;\n\tstatic var isSupported(default, never):Bool;\n\tstatic var storageVolumeInfo(default, never):StorageVolumeInfo;\n}\n"
  },
  {
    "path": "externs/air/flash/html/ControlInitializationError.hx",
    "content": "package flash.html;\n\nextern class ControlInitializationError extends flash.errors.Error\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLBitmap.hx",
    "content": "package flash.html;\n\nextern class HTMLBitmap\n{\n\tfunction new(bitmap:flash.display.BitmapData):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLHistoryItem.hx",
    "content": "package flash.html;\n\nextern class HTMLHistoryItem\n{\n\tvar isPost(default, never):Bool;\n\tvar originalUrl(default, never):String;\n\tvar title(default, never):String;\n\tvar url(default, never):String;\n\tfunction new(url:String, originalUrl:String, isPost:Bool, title:String):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLHost.hx",
    "content": "package flash.html;\n\nextern class HTMLHost\n{\n\tvar htmlLoader(default, never):HTMLLoader;\n\tvar windowRect:flash.geom.Rectangle;\n\tfunction new(defaultBehaviors:Bool = true):Void;\n\tfunction createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader;\n\t// function setHTMLControl(loader : HTMLLoader) : Void;\n\tfunction updateLocation(locationURL:String):Void;\n\tfunction updateStatus(status:String):Void;\n\tfunction updateTitle(title:String):Void;\n\tfunction windowBlur():Void;\n\tfunction windowClose():Void;\n\tfunction windowFocus():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLLoader.hx",
    "content": "package flash.html;\n\nextern class HTMLLoader extends flash.display.Sprite\n{\n\tvar authenticate:Bool;\n\tvar cacheResponse:Bool;\n\tvar contentHeight(default, never):Float;\n\tvar contentWidth(default, never):Float;\n\tvar hasFocusableContent(default, never):Bool;\n\tvar historyLength(default, never):UInt;\n\tvar historyPosition:UInt;\n\tvar htmlHost:HTMLHost;\n\tvar idleTimeout:Float;\n\tvar loaded(default, never):Bool;\n\tvar location(default, never):String;\n\tvar manageCookies:Bool;\n\tvar navigateInSystemBrowser:Bool;\n\tvar pageApplicationDomain(default, never):flash.system.ApplicationDomain;\n\tvar paintsDefaultBackground:Bool;\n\tvar placeLoadStringContentInApplicationSandbox:Bool;\n\tvar runtimeApplicationDomain:flash.system.ApplicationDomain;\n\tvar scrollH:Float;\n\tvar scrollV:Float;\n\tvar textEncodingFallback:String;\n\tvar textEncodingOverride:String;\n\tvar useCache:Bool;\n\tvar userAgent:String;\n\tvar window(default, never):Dynamic;\n\tfunction new():Void;\n\tfunction cancelLoad():Void;\n\tfunction getHistoryAt(position:UInt):HTMLHistoryItem;\n\tfunction historyBack():Void;\n\tfunction historyForward():Void;\n\tfunction historyGo(steps:Int):Void;\n\tfunction load(urlRequestToLoad:flash.net.URLRequest):Void;\n\tfunction loadString(htmlContent:String):Void;\n\tfunction reload():Void;\n\tstatic var isSupported(default, never):Bool;\n\tstatic var pdfCapability(default, never):Int;\n\tstatic var swfCapability(default, never):Int;\n\tstatic function createRootWindow(visible:Bool = true, ?windowInitOptions:flash.display.NativeWindowInitOptions, scrollBarsVisible:Bool = true,\n\t\t?bounds:flash.geom.Rectangle):HTMLLoader;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLPDFCapability.hx",
    "content": "package flash.html;\n\nextern class HTMLPDFCapability\n{\n\tstatic var ERROR_CANNOT_LOAD_READER(default, never):Int;\n\tstatic var ERROR_INSTALLED_READER_NOT_FOUND(default, never):Int;\n\tstatic var ERROR_INSTALLED_READER_TOO_OLD(default, never):Int;\n\tstatic var ERROR_PREFERRED_READER_TOO_OLD(default, never):Int;\n\tstatic var STATUS_OK(default, never):Int;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLPopupWindow.hx",
    "content": "package flash.html;\n\n@:final extern class HTMLPopupWindow\n{\n\tfunction new(owner:HTMLLoader, closePopupWindowIfNeededClosure:Dynamic, setDeactivateClosure:Dynamic, computedFontSize:Float):Void;\n\tfunction close():Void;\n\tfunction isActive():Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLSWFCapability.hx",
    "content": "package flash.html;\n\nextern class HTMLSWFCapability\n{\n\tstatic var ERROR_INSTALLED_PLAYER_NOT_FOUND(default, never):Int;\n\tstatic var ERROR_INSTALLED_PLAYER_TOO_OLD(default, never):Int;\n\tstatic var STATUS_OK(default, never):Int;\n}\n"
  },
  {
    "path": "externs/air/flash/html/HTMLWindowCreateOptions.hx",
    "content": "package flash.html;\n\nextern class HTMLWindowCreateOptions\n{\n\tvar fullscreen:Bool;\n\tvar height:Float;\n\tvar locationBarVisible:Bool;\n\tvar menuBarVisible:Bool;\n\tvar resizable:Bool;\n\tvar scrollBarsVisible:Bool;\n\tvar statusBarVisible:Bool;\n\tvar toolBarVisible:Bool;\n\tvar width:Float;\n\tvar x:Float;\n\tvar y:Float;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/ResourceLoader.hx",
    "content": "package flash.html;\n\nextern class ResourceLoader\n{\n\tfunction new(urlReq:flash.net.URLRequest, htmlControl:HTMLLoader, ?isStageWebViewRequest:Bool):Void;\n\tfunction cancel():Void;\n\t// static var s_AboutURLScheme(default,never) : String;\n\t// static var s_AppStorageURLScheme(default,never) : String;\n\t// static var s_AppURLScheme(default,never) : String;\n\t// static var s_DataURLScheme(default,never) : String;\n\t// static var s_FileURLScheme(default,never) : String;\n\t// static var s_FtpURLScheme(default,never) : String;\n\t// static var s_HttpURLScheme(default,never) : String;\n\t// static var s_HttpsURLScheme(default,never) : String;\n\t// static var s_MailToURLScheme(default,never) : String;\n}\n"
  },
  {
    "path": "externs/air/flash/html/__HTMLScriptArray.hx",
    "content": "package flash.html;\n\nextern class __HTMLScriptArray extends Array<Dynamic> implements Dynamic\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/__HTMLScriptFunction.hx",
    "content": "package flash.html;\n\nextern class __HTMLScriptFunction implements Dynamic\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/__HTMLScriptObject.hx",
    "content": "package flash.html;\n\nextern class __HTMLScriptObject implements Dynamic\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/script/Package.hx",
    "content": "package flash.html.script;\n\nextern class Package extends flash.utils.Proxy\n{\n\tfunction new(parent:Package, packageName:String, appDomain:flash.system.ApplicationDomain):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/html/script/PropertyEnumHelper.hx",
    "content": "package flash.html.script;\n\nextern class PropertyEnumHelper\n{\n\tfunction new(enumPropertiesClosure:Dynamic, getPropertyClosure:Dynamic):Void;\n\tfunction nextName(index:Int):String;\n\tfunction nextNameIndex(lastIndex:Int):Int;\n\tfunction nextValue(index:Int):Dynamic;\n}\n"
  },
  {
    "path": "externs/air/flash/media/AudioPlaybackMode.hx",
    "content": "package flash.media;\n\n@:native(\"flash.media.AudioPlaybackMode\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract AudioPlaybackMode(String)\n{\n\tvar AMBIENT = \"ambient\";\n\tvar MEDIA = \"media\";\n\tvar VOICE = \"voice\";\n}\n"
  },
  {
    "path": "externs/air/flash/media/CameraPosition.hx",
    "content": "package flash.media;\n\n@:native(\"flash.media.CameraPosition\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract CameraPosition(String)\n{\n\tvar BACK = \"back\";\n\tvar FRONT = \"front\";\n\tvar UNKNOWN = \"unknown\";\n}\n"
  },
  {
    "path": "externs/air/flash/media/CameraRoll.hx",
    "content": "package flash.media;\n\nextern class CameraRoll extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction addBitmapData(bitmapData:flash.display.BitmapData):Void;\n\tfunction browseForImage(?value:CameraRollBrowseOptions):Void;\n\tfunction requestPermission():Void;\n\tstatic var permissionStatus(default, never):String;\n\tstatic var supportsAddBitmapData(default, never):Bool;\n\tstatic var supportsBrowseForImage(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/media/CameraRollBrowseOptions.hx",
    "content": "package flash.media;\n\nextern class CameraRollBrowseOptions\n{\n\tvar height:Float;\n\tvar origin:flash.geom.Rectangle;\n\tvar width:Float;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/media/CameraUI.hx",
    "content": "package flash.media;\n\nextern class CameraUI extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction launch(requestedMediaType:String):Void;\n\tfunction requestPermission():Void;\n\tstatic var isSupported(default, never):Bool;\n\tstatic var permissionStatus(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/media/IFilePromise.hx",
    "content": "package flash.media;\n\nextern interface IFilePromise\n{\n\t// var file(default,never) : flash.filesystem.File;\n\tvar isAsync(default, never):Bool;\n\t// var mediaType(default,never) : String;\n\tvar relativePath(default, never):String;\n\t// function new() : Void;\n\tfunction close():Void;\n\tfunction open():flash.utils.IDataInput;\n\tfunction reportError(e:flash.events.ErrorEvent):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/media/InputMediaStream.hx",
    "content": "package flash.media;\n\nextern class InputMediaStream extends flash.events.EventDispatcher implements flash.utils.IDataInput\n{\n\tvar bytesAvailable(default, never):UInt;\n\tvar endian:flash.utils.Endian;\n\tvar objectEncoding:#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\t// function new() : Void;\n\tfunction close():Dynamic;\n\tfunction open():Dynamic;\n\tfunction readBoolean():Bool;\n\tfunction readByte():Int;\n\tfunction readBytes(bytes:flash.utils.ByteArray, ?offset:UInt, ?length:UInt):Void;\n\tfunction readDouble():Float;\n\tfunction readFloat():Float;\n\tfunction readInt():Int;\n\tfunction readMultiByte(length:UInt, charSet:String):String;\n\tfunction readObject():Dynamic;\n\tfunction readShort():Int;\n\tfunction readUTF():String;\n\tfunction readUTFBytes(length:UInt):String;\n\tfunction readUnsignedByte():UInt;\n\tfunction readUnsignedInt():UInt;\n\tfunction readUnsignedShort():UInt;\n}\n"
  },
  {
    "path": "externs/air/flash/media/MediaPromise.hx",
    "content": "package flash.media;\n\nextern class MediaPromise extends flash.events.EventDispatcher implements flash.desktop.IFilePromise\n{\n\tvar file(default, never):flash.filesystem.File;\n\tvar isAsync(default, never):Bool;\n\tvar mediaType(default, never):String;\n\tvar relativePath(default, never):String;\n\tfunction new():Void;\n\tfunction close():Void;\n\tfunction open():flash.utils.IDataInput;\n\tfunction reportError(e:flash.events.ErrorEvent):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/media/MediaType.hx",
    "content": "package flash.media;\n\n@:native(\"flash.media.MediaType\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract MediaType(String)\n{\n\tvar IMAGE = \"image\";\n\tvar VIDEO = \"video\";\n}\n"
  },
  {
    "path": "externs/air/flash/media/StageWebView.hx",
    "content": "package flash.media;\n\n@:final extern class StageWebView extends flash.events.EventDispatcher\n{\n\tvar isHistoryBackEnabled(default, never):Bool;\n\tvar isHistoryForwardEnabled(default, never):Bool;\n\tvar location(default, never):String;\n\tvar mediaPlaybackRequiresUserAction:Bool;\n\tvar stage:flash.display.Stage;\n\tvar title(default, never):String;\n\tvar viewPort:flash.geom.Rectangle;\n\tfunction new():Void;\n\tfunction assignFocus(direction:flash.display.FocusDirection = flash.display.FocusDirection.NONE):Void;\n\tfunction dispose():Void;\n\tfunction drawViewPortToBitmapData(bitmap:flash.display.BitmapData):Void;\n\tfunction historyBack():Void;\n\tfunction historyForward():Void;\n\tfunction loadString(text:String, ?mimeType:String):Void;\n\tfunction loadURL(url:String):Void;\n\tfunction reload():Void;\n\tfunction stop():Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/media/StageWebViewImpl.hx",
    "content": "package flash.media;\n\nextern class StageWebViewImpl extends flash.display.Sprite\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/DatagramSocket.hx",
    "content": "package flash.net;\n\nextern class DatagramSocket extends flash.events.EventDispatcher\n{\n\tvar bound(default, never):Bool;\n\tvar connected(default, never):Bool;\n\tvar localAddress(default, never):String;\n\tvar localPort(default, never):Int;\n\tvar remoteAddress(default, never):String;\n\tvar remotePort(default, never):Int;\n\tfunction new():Void;\n\tfunction bind(localPort:Int = 0, localAddress:String = \"0.0.0.0\"):Void;\n\tfunction close():Void;\n\tfunction connect(remoteAddress:String, remotePort:Int):Void;\n\tfunction receive():Void;\n\tfunction send(bytes:flash.utils.ByteArray, offset:UInt = 0, length:UInt = 0, ?address:String, port:Int = 0):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/net/FileReference.hx",
    "content": "package flash.net;\n\nextern class FileReference extends flash.events.EventDispatcher\n{\n\tvar creationDate(default, never):Date;\n\tvar creator(default, never):String;\n\t@:require(flash10) var data(default, never):flash.utils.ByteArray;\n\t#if air\n\tvar extension(default, never):String;\n\t#end\n\tvar modificationDate(default, never):Date;\n\tvar name(default, never):String;\n\tvar size(default, never):Float;\n\tvar type(default, never):String;\n\tfunction new():Void;\n\tfunction browse(?typeFilter:Array<FileFilter>):Bool;\n\tfunction cancel():Void;\n\tfunction download(request:URLRequest, ?defaultFileName:String):Void;\n\t@:require(flash10) function load():Void;\n\t@:require(flash10) function save(data:Dynamic, ?defaultFileName:String):Void;\n\tfunction upload(request:URLRequest, ?uploadDataFieldName:String, testUpload:Bool = false):Void;\n\t#if air\n\tfunction uploadUnencoded(request:URLRequest):Void;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/net/IPVersion.hx",
    "content": "package flash.net;\n\n@:native(\"flash.net.IPVersion\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract IPVersion(String)\n{\n\tvar IPV4 = \"ipv4\";\n\tvar IPV6 = \"ipv6\";\n}\n"
  },
  {
    "path": "externs/air/flash/net/InterfaceAddress.hx",
    "content": "package flash.net;\n\nextern class InterfaceAddress\n{\n\tvar address:String;\n\tvar broadcast:String;\n\tvar ipVersion:String;\n\tvar prefixLength:Int;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/NetworkInfo.hx",
    "content": "package flash.net;\n\nextern class NetworkInfo extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction findInterfaces():flash.Vector<NetworkInterface>;\n\tstatic var isSupported(default, never):Bool;\n\tstatic var networkInfo(default, never):NetworkInfo;\n}\n"
  },
  {
    "path": "externs/air/flash/net/NetworkInterface.hx",
    "content": "package flash.net;\n\nextern class NetworkInterface\n{\n\tvar active:Bool;\n\tvar addresses:flash.Vector<InterfaceAddress>;\n\tvar displayName:String;\n\tvar hardwareAddress:String;\n\tvar mtu:Int;\n\tvar name:String;\n\tvar parent:NetworkInterface;\n\tvar subInterfaces:flash.Vector<NetworkInterface>;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/ServerSocket.hx",
    "content": "package flash.net;\n\nextern class ServerSocket extends flash.events.EventDispatcher\n{\n\tvar bound(default, never):Bool;\n\tvar listening(default, never):Bool;\n\tvar localAddress(default, never):String;\n\tvar localPort(default, never):Int;\n\tfunction new():Void;\n\tfunction bind(localPort:Int = 0, localAddress:String = \"0.0.0.0\"):Void;\n\tfunction close():Void;\n\tfunction listen(backlog:Int = 0):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/net/Socket.hx",
    "content": "package flash.net;\n\nextern class Socket extends flash.events.EventDispatcher implements flash.utils.IDataOutput implements flash.utils.IDataInput\n{\n\t#if (haxe_ver < 4.3)\n\tvar bytesAvailable(default, never):UInt;\n\t@:require(flash11) var bytesPending(default, never):UInt;\n\tvar connected(default, never):Bool;\n\tvar endian:flash.utils.Endian;\n\tvar objectEncoding:#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\t@:require(flash10) var timeout:UInt;\n\t#if air\n\tvar localAddress(default, never):String;\n\tvar localPort(default, never):Int;\n\tvar remoteAddress(default, never):String;\n\tvar remotePort(default, never):Int;\n\t#end\n\t#else\n\t@:flash.property var bytesAvailable(get, never):UInt;\n\t@:flash.property @:require(flash11) var bytesPending(get, never):UInt;\n\t@:flash.property var connected(get, never):Bool;\n\t@:flash.property var endian(get, set):flash.utils.Endian;\n\t@:flash.property var objectEncoding(get, set):#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\t@:flash.property @:require(flash10) var timeout(get, set):UInt;\n\t#if air\n\t@:flash.property var localAddress(get, never):String;\n\t@:flash.property var localPort(get, never):Int;\n\t@:flash.property var remoteAddress(get, never):String;\n\t@:flash.property var remotePort(get, never):Int;\n\t#end\n\t#end\n\tfunction new(?host:String, port:Int = 0):Void;\n\tfunction close():Void;\n\tfunction connect(host:String, port:Int):Void;\n\tfunction flush():Void;\n\tfunction readBoolean():Bool;\n\tfunction readByte():Int;\n\tfunction readBytes(bytes:flash.utils.ByteArray, offset:UInt = 0, length:UInt = 0):Void;\n\tfunction readDouble():Float;\n\tfunction readFloat():Float;\n\tfunction readInt():Int;\n\tfunction readMultiByte(length:UInt, charSet:String):String;\n\tfunction readObject():Dynamic;\n\tfunction readShort():Int;\n\tfunction readUTF():String;\n\tfunction readUTFBytes(length:UInt):String;\n\tfunction readUnsignedByte():UInt;\n\tfunction readUnsignedInt():UInt;\n\tfunction readUnsignedShort():UInt;\n\tfunction writeBoolean(value:Bool):Void;\n\tfunction writeByte(value:Int):Void;\n\tfunction writeBytes(bytes:flash.utils.ByteArray, offset:UInt = 0, length:UInt = 0):Void;\n\tfunction writeDouble(value:Float):Void;\n\tfunction writeFloat(value:Float):Void;\n\tfunction writeInt(value:Int):Void;\n\tfunction writeMultiByte(value:String, charSet:String):Void;\n\tfunction writeObject(object:Dynamic):Void;\n\tfunction writeShort(value:Int):Void;\n\tfunction writeUTF(value:String):Void;\n\tfunction writeUTFBytes(value:String):Void;\n\tfunction writeUnsignedInt(value:UInt):Void;\n\n\t#if (haxe_ver >= 4.3)\n\tprivate function get_bytesAvailable():UInt;\n\tprivate function get_bytesPending():UInt;\n\tprivate function get_connected():Bool;\n\tprivate function get_endian():flash.utils.Endian;\n\tprivate function get_objectEncoding():#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\tprivate function get_timeout():UInt;\n\t#if air\n\tprivate function get_localAddress():String;\n\tprivate function get_localPort():Int;\n\tprivate function get_remoteAddress():String;\n\tprivate function get_remotePort():Int;\n\t#end\n\tprivate function set_endian(value:flash.utils.Endian):flash.utils.Endian;\n\tprivate function set_objectEncoding(value:#if openfl openfl.net.ObjectEncoding #else UInt #end):#if openfl openfl.net.ObjectEncoding #else UInt #end;\n\tprivate function set_timeout(value:UInt):UInt;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/net/URLRequest.hx",
    "content": "package flash.net;\n\n@:final extern class URLRequest\n{\n\t#if air\n\tvar authenticate:Bool;\n\tvar cacheResponse:Bool;\n\t#end\n\tvar contentType:String;\n\tvar data:Dynamic;\n\tvar digest:String;\n\t#if air\n\tvar followRedirects:Bool;\n\tvar idleTimeout:Float;\n\tvar manageCookies:Bool;\n\t#end\n\tvar method:String;\n\tvar requestHeaders:Array<URLRequestHeader>;\n\tvar url:String;\n\t#if air\n\tvar useCache:Bool;\n\tvar userAgent:String;\n\t#end\n\tfunction new(?url:String):Void;\n\tfunction useRedirectedURL(sourceRequest:URLRequest, wholeURL:Bool = false, ?pattern:Dynamic, ?replace:String):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/URLRequestDefaults.hx",
    "content": "package flash.net;\n\nextern class URLRequestDefaults\n{\n\tstatic var authenticate:Bool;\n\tstatic var cacheResponse:Bool;\n\tstatic var followRedirects:Bool;\n\tstatic var idleTimeout:Float;\n\tstatic var manageCookies:Bool;\n\tstatic var useCache:Bool;\n\tstatic var userAgent:String;\n\tstatic function setLoginCredentialsForHost(hostname:String, user:String, password:String):Dynamic;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/AAAARecord.hx",
    "content": "package flash.net.dns;\n\nextern class AAAARecord extends ResourceRecord\n{\n\tvar address:String;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/ARecord.hx",
    "content": "package flash.net.dns;\n\nextern class ARecord extends ResourceRecord\n{\n\tvar address:String;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/DNSResolver.hx",
    "content": "package flash.net.dns;\n\nextern class DNSResolver extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction lookup(host:String, recordType:Class<Dynamic>):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/MXRecord.hx",
    "content": "package flash.net.dns;\n\nextern class MXRecord extends ResourceRecord\n{\n\tvar exchange:String;\n\tvar preference:Int;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/PTRRecord.hx",
    "content": "package flash.net.dns;\n\nextern class PTRRecord extends ResourceRecord\n{\n\tvar ptrdName:String;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/ResourceRecord.hx",
    "content": "package flash.net.dns;\n\nextern class ResourceRecord\n{\n\tvar name:String;\n\tvar ttl:Int;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/dns/SRVRecord.hx",
    "content": "package flash.net.dns;\n\nextern class SRVRecord extends ResourceRecord\n{\n\tvar port:Int;\n\tvar priority:Int;\n\tvar target:String;\n\tvar weight:Int;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/drm/DRMAddToDeviceGroupContext.hx",
    "content": "package flash.net.drm;\n\nextern class DRMAddToDeviceGroupContext extends DRMManagerSession\n{\n\tfunction new():Void;\n\tfunction addToDeviceGroup(deviceGroup:DRMDeviceGroup, forceRefresh:Bool):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/drm/DRMManager.hx",
    "content": "package flash.net.drm;\n\nextern class DRMManager extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction addToDeviceGroup(deviceGroup:DRMDeviceGroup, forceRefresh:Bool = false):Void;\n\tfunction authenticate(serverURL:String, domain:String, username:String, password:String):Void;\n\tfunction loadPreviewVoucher(contentData:DRMContentData):Void;\n\tfunction loadVoucher(contentData:DRMContentData, setting:String):Void;\n\tfunction removeFromDeviceGroup(deviceGroup:DRMDeviceGroup):Void;\n\tfunction resetDRMVouchers():Void;\n\tfunction resetDRMVouchersInternal(isAutoReset:Bool):Void;\n\tfunction returnVoucher(inServerURL:String, immediateCommit:Bool, licenseID:String, policyID:String):Void;\n\tfunction setAuthenticationToken(serverUrl:String, domain:String, token:flash.utils.ByteArray):Void;\n\tfunction storeVoucher(voucher:flash.utils.ByteArray):Void;\n\tstatic var isSupported(default, never):Bool;\n\tstatic var networkIdleTimeout:Float;\n\tstatic function getDRMManager():DRMManager;\n\tstatic function getDRMManagerInternal():DRMManager;\n}\n"
  },
  {
    "path": "externs/air/flash/net/drm/DRMRemoveFromDeviceGroupContext.hx",
    "content": "package flash.net.drm;\n\nextern class DRMRemoveFromDeviceGroupContext extends DRMManagerSession\n{\n\tfunction new():Void;\n\tfunction removeFromDeviceGroup(deviceGroup:DRMDeviceGroup):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/net/drm/VoucherAccessInfo.hx",
    "content": "package flash.net.drm;\n\n@:final extern class VoucherAccessInfo\n{\n\tvar authenticationMethod(default, never):String;\n\tvar deviceGroup(default, never):DRMDeviceGroup;\n\tvar displayName(default, never):String;\n\tvar domain(default, never):String;\n\tvar policyID(default, never):String;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/notifications/NotificationStyle.hx",
    "content": "package flash.notifications;\n\n@:native(\"flash.notifications.NotificationStyle\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract NotificationStyle(String)\n{\n\tvar ALERT = \"alert\";\n\tvar BADGE = \"badge\";\n\tvar SOUND = \"sound\";\n}\n"
  },
  {
    "path": "externs/air/flash/notifications/RemoteNotifier.hx",
    "content": "package flash.notifications;\n\nextern class RemoteNotifier extends flash.events.EventDispatcher\n{\n\tfunction new():Void;\n\tfunction subscribe(?options:RemoteNotifierSubscribeOptions):Void;\n\tfunction unsubscribe():Void;\n\tstatic var supportedNotificationStyles(default, never):flash.Vector<NotificationStyle>;\n}\n"
  },
  {
    "path": "externs/air/flash/notifications/RemoteNotifierSubscribeOptions.hx",
    "content": "package flash.notifications;\n\n@:final extern class RemoteNotifierSubscribeOptions\n{\n\tvar notificationStyles:flash.Vector<NotificationStyle>;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/permissions/PermissionStatus.hx",
    "content": "package flash.permissions;\n\nextern class PermissionStatus\n{\n\tfunction new():Void;\n\tstatic var DENIED(default, never):String;\n\tstatic var GRANTED(default, never):String;\n\tstatic var UNKNOWN(default, never):String;\n}\n"
  },
  {
    "path": "externs/air/flash/printing/PaperSize.hx",
    "content": "package flash.printing;\n\n@:native(\"flash.printing.PaperSize\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract PaperSize(String)\n{\n\tvar A4 = \"a4\";\n\tvar A5 = \"a5\";\n\tvar A6 = \"a6\";\n\tvar CHOUKEI3GOU = \"choukei3gou\";\n\tvar CHOUKEI4GOU = \"choukei4gou\";\n\tvar ENV_10 = \"env_10\";\n\tvar ENV_B5 = \"env_b5\";\n\tvar ENV_C5 = \"env_c5\";\n\tvar ENV_DL = \"env_dl\";\n\tvar ENV_MONARCH = \"env_monarch\";\n\tvar ENV_PERSONAL = \"env_personal\";\n\tvar EXECUTIVE = \"executive\";\n\tvar FOLIO = \"folio\";\n\tvar JIS_B5 = \"jis_b5\";\n\tvar LEGAL = \"legal\";\n\tvar LETTER = \"letter\";\n\tvar STATEMENT = \"statement\";\n}\n"
  },
  {
    "path": "externs/air/flash/printing/PrintJob.hx",
    "content": "package flash.printing;\n\nextern class PrintJob extends flash.events.EventDispatcher\n{\n\t#if air\n\tvar copies:Int;\n\tvar firstPage(default, never):Int;\n\tvar isColor(default, never):Bool;\n\tvar jobName:String;\n\tvar lastPage(default, never):Int;\n\tvar maxPixelsPerInch(default, never):Float;\n\t#end\n\tvar orientation(default, never):PrintJobOrientation;\n\tvar pageHeight(default, never):Int;\n\tvar pageWidth(default, never):Int;\n\t#if air\n\tvar paperArea(default, never):flash.geom.Rectangle;\n\t#end\n\tvar paperHeight(default, never):Int;\n\tvar paperWidth(default, never):Int;\n\t#if air\n\tvar printableArea(default, never):flash.geom.Rectangle;\n\tvar printer:String;\n\t#end\n\tfunction new():Void;\n\tfunction addPage(sprite:flash.display.Sprite, ?printArea:flash.geom.Rectangle, ?options:PrintJobOptions, frameNum:Int = 0):Void;\n\t#if air\n\tfunction selectPaperSize(paperSize:PaperSize):Void;\n\t#end\n\tfunction send():Void;\n\t#if air\n\tfunction showPageSetupDialog():Bool;\n\t#end\n\tfunction start():Bool;\n\t#if air\n\tfunction start2(?uiOptions:PrintUIOptions, showPrintDialog:Bool = true):Bool;\n\tfunction terminate():Void;\n\tstatic var active(default, never):Bool;\n\t#end\n\t@:require(flash10_1) static var isSupported(default, never):Bool;\n\t#if air\n\tstatic var printers(default, never):flash.Vector<String>;\n\tstatic var supportsPageSetupDialog(default, never):Bool;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/flash/printing/PrintJobOptions.hx",
    "content": "package flash.printing;\n\nextern class PrintJobOptions\n{\n\t#if air\n\tvar pixelsPerInch:Float;\n\t#end\n\tvar printAsBitmap:Bool;\n\t#if air\n\tvar printMethod:PrintMethod;\n\t#end\n\tfunction new(printAsBitmap:Bool = false):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/printing/PrintMethod.hx",
    "content": "package flash.printing;\n\n@:native(\"flash.printing.PrintMethod\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract PrintMethod(String)\n{\n\tvar AUTO = \"auto\";\n\tvar BITMAP = \"bitmap\";\n\tvar VECTOR = \"vector\";\n}\n"
  },
  {
    "path": "externs/air/flash/printing/PrintUIOptions.hx",
    "content": "package flash.printing;\n\n@:final extern class PrintUIOptions\n{\n\tvar disablePageRange:Bool;\n\tvar maxPage:UInt;\n\tvar minPage:UInt;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/sampler/ScriptMember.hx",
    "content": "package flash.sampler;\n\n@:final extern class ScriptMember\n{\n\tvar id(default, never):Float;\n\tvar propertyName(default, never):String;\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/sampler/ScriptSampler.hx",
    "content": "package flash.sampler;\n\nextern class ScriptSampler\n{\n\tfunction new():Void;\n\tstatic function getFilename(p1:Float):String;\n\tstatic function getInvocationCount(p1:Float):Float;\n\tstatic function getMembers(p1:Float):flash.Vector<ScriptMember>;\n\tstatic function getName(p1:Float):String;\n\tstatic function getSize(p1:Float):Float;\n\tstatic function getType(p1:Float):String;\n}\n"
  },
  {
    "path": "externs/air/flash/security/AVMPlusDigest.hx",
    "content": "package flash.security;\n\nextern class AVMPlusDigest\n{\n\tfunction new():Void;\n\tfunction FinishDigest(inDigestToCompare:String):UInt;\n\tfunction Init(algorithm:UInt):Void;\n\tfunction Update(data:flash.utils.IDataInput):UInt;\n\tfunction UpdateWithString(data:String):UInt;\n\tstatic var DIGESTMETHOD_SHA256(default, never):UInt;\n}\n"
  },
  {
    "path": "externs/air/flash/security/CryptContext.hx",
    "content": "package flash.security;\n\nextern class CryptContext extends flash.events.EventDispatcher\n{\n\tvar signerCN(default, never):String;\n\tvar signerDN(default, never):String;\n\tvar signerValidEnd(default, never):UInt;\n\tvar verificationTime(default, never):UInt;\n\tfunction new():Void;\n\tfunction HasValidVerifySession():Bool;\n\tfunction VerifySigASync(sig:String, data:String, ignoreCertTime:Bool):Void;\n\tfunction VerifySigSync(sig:String, data:String, ignoreCertTime:Bool):Void;\n\tfunction addCRLRevEvidenceBase64(crl:String):Void;\n\tfunction addCRLRevEvidenceRaw(crl:flash.utils.ByteArray):Void;\n\tfunction addChainBuildingCertBase64(cert:String, trusted:Bool):Void;\n\tfunction addChainBuildingCertRaw(cert:flash.utils.ByteArray, trusted:Bool):Void;\n\tfunction addTimestampingRootRaw(cert:flash.utils.ByteArray):Void;\n\tfunction getDataTBVStatus():UInt;\n\tfunction getIDStatus():UInt;\n\tfunction getIDSummaryFromSigChain(version:UInt):String;\n\tfunction getOverallStatus():UInt;\n\tfunction getPublicKey(cert:String):flash.utils.ByteArray;\n\tfunction getRevCheckSetting():String;\n\tfunction getSignerExtendedKeyUsages():Array<Dynamic>;\n\tfunction getSignerIDSummary(version:UInt):String;\n\tfunction getSignerTrustFlags():UInt;\n\tfunction getSignerTrustSettings():Array<Dynamic>;\n\tfunction getTimestampRevCheckSetting():String;\n\tfunction getUseSystemTrustStore():Bool;\n\tfunction setRevCheckSetting(setting:String):Void;\n\tfunction setSignerCert(cert:String):Dynamic;\n\tfunction setSignerCertDN(dn:String):Dynamic;\n\tfunction setTimestampRevCheckSetting(setting:String):Void;\n\tfunction useCodeSigningValidationRules():Void;\n\tfunction useSystemTrustStore(trusted:Bool):Void;\n\tfunction verifyTimestamp(tsp:String, data:String, ignoreCertTime:Bool):Void;\n\tstatic var REVCHECK_ALWAYSREQUIRED(default, never):UInt;\n\tstatic var REVCHECK_BEST_EFFORT(default, never):UInt;\n\tstatic var REVCHECK_NEVER(default, never):UInt;\n\tstatic var REVCHECK_REQUIRED_IF_AVAILABLE(default, never):UInt;\n\tstatic var STATUS_INVALID(default, never):UInt;\n\tstatic var STATUS_TROUBLE(default, never):UInt;\n\tstatic var STATUS_UNKNOWN(default, never):UInt;\n\tstatic var STATUS_VALID(default, never):UInt;\n\tstatic var TRUSTFLAG_CODESIGNING(default, never):UInt;\n\tstatic var TRUSTFLAG_PLAYLISTSIGNING(default, never):UInt;\n\tstatic var TRUSTFLAG_SIGNING(default, never):UInt;\n}\n"
  },
  {
    "path": "externs/air/flash/security/IURIDereferencer.hx",
    "content": "package flash.security;\n\nextern interface IURIDereferencer\n{\n\tfunction dereference(uri:String):flash.utils.IDataInput;\n}\n"
  },
  {
    "path": "externs/air/flash/security/ReferencesValidationSetting.hx",
    "content": "package flash.security;\n\n@:native(\"flash.security.ReferencesValidationSetting\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract ReferencesValidationSetting(String)\n{\n\tvar NEVER = \"never\";\n\tvar VALID_IDENTITY = \"validIdentity\";\n\tvar VALID_OR_UNKNOWN_IDENTITY = \"validOrUnknownIdentity\";\n}\n"
  },
  {
    "path": "externs/air/flash/security/RevocationCheckSettings.hx",
    "content": "package flash.security;\n\n@:native(\"flash.security.RevocationCheckSettings\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract RevocationCheckSettings(String)\n{\n\tvar ALWAYS_REQUIRED = \"alwaysRequired\";\n\tvar BEST_EFFORT = \"bestEffort\";\n\tvar NEVER = \"never\";\n\tvar REQUIRED_IF_AVAILABLE = \"requiredIfAvailable\";\n}\n"
  },
  {
    "path": "externs/air/flash/security/SignatureStatus.hx",
    "content": "package flash.security;\n\n@:native(\"flash.security.SignatureStatus\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SignatureStatus(String)\n{\n\tvar INVALID = \"invalid\";\n\tvar UNKNOWN = \"unknown\";\n\tvar VALID = \"valid\";\n}\n"
  },
  {
    "path": "externs/air/flash/security/SignerTrustSettings.hx",
    "content": "package flash.security;\n\n@:native(\"flash.security.SignerTrustSettings\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SignerTrustSettings(String)\n{\n\tvar CODE_SIGNING = \"codeSigning\";\n\tvar PLAYLIST_SIGNING = \"playlistSigning\";\n\tvar SIGNING = \"signing\";\n}\n"
  },
  {
    "path": "externs/air/flash/security/XMLCanonicalizer.hx",
    "content": "package flash.security;\n\nextern class XMLCanonicalizer\n{\n\tfunction new():Void;\n\tfunction CanonicalizeXML(xml:flash.xml.XML):String;\n\tfunction CanonicalizeXMLList(xmlList:flash.xml.XMLList):String;\n}\n"
  },
  {
    "path": "externs/air/flash/security/XMLSignatureEnvelopedTransformer.hx",
    "content": "package flash.security;\n\nextern class XMLSignatureEnvelopedTransformer\n{\n\tfunction new():Void;\n\tfunction transform(sig:flash.xml.XML, doc:flash.xml.XML):flash.xml.XML;\n}\n"
  },
  {
    "path": "externs/air/flash/security/XMLSignatureValidator.hx",
    "content": "package flash.security;\n\nextern class XMLSignatureValidator extends flash.events.EventDispatcher\n{\n\tvar digestStatus(default, never):String;\n\tvar identityStatus(default, never):String;\n\tvar referencesStatus(default, never):String;\n\tvar referencesValidationSetting:ReferencesValidationSetting;\n\tvar revocationCheckSetting:RevocationCheckSettings;\n\tvar signerCN(default, never):String;\n\tvar signerDN(default, never):String;\n\tvar signerExtendedKeyUsages(default, never):Array<Dynamic>;\n\tvar signerTrustSettings(default, never):Array<Dynamic>;\n\tvar uriDereferencer:IURIDereferencer;\n\tvar useSystemTrustStore:Bool;\n\tvar validityStatus(default, never):String;\n\tfunction new():Void;\n\tfunction addCertificate(cert:flash.utils.ByteArray, trusted:Bool):Dynamic;\n\tfunction verify(signature:flash.xml.XML):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/sensors/DeviceRotation.hx",
    "content": "package flash.sensors;\n\nextern class DeviceRotation extends flash.events.EventDispatcher\n{\n\tvar muted(default, never):Bool;\n\tfunction new():Void;\n\tfunction setRequestedUpdateInterval(interval:Float):Void;\n\tstatic var isSupported(default, never):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/system/Capabilities.hx",
    "content": "package flash.system;\n\nextern class Capabilities\n{\n\tstatic var _internal(default, never):UInt;\n\tstatic var avHardwareDisable(default, never):Bool;\n\t@:require(flash10_1) static var cpuArchitecture(default, never):String;\n\tstatic var hasAccessibility(default, never):Bool;\n\tstatic var hasAudio(default, never):Bool;\n\tstatic var hasAudioEncoder(default, never):Bool;\n\tstatic var hasEmbeddedVideo(default, never):Bool;\n\tstatic var hasIME(default, never):Bool;\n\tstatic var hasMP3(default, never):Bool;\n\tstatic var hasPrinting(default, never):Bool;\n\tstatic var hasScreenBroadcast(default, never):Bool;\n\tstatic var hasScreenPlayback(default, never):Bool;\n\tstatic var hasStreamingAudio(default, never):Bool;\n\tstatic var hasStreamingVideo(default, never):Bool;\n\tstatic var hasTLS(default, never):Bool;\n\tstatic var hasVideoEncoder(default, never):Bool;\n\tstatic var isDebugger(default, never):Bool;\n\t@:require(flash10) static var isEmbeddedInAcrobat(default, never):Bool;\n\tstatic var language(default, never):String;\n\t#if air\n\tstatic var languages(default, never):Array<String>;\n\t#end\n\tstatic var localFileReadDisable(default, never):Bool;\n\tstatic var manufacturer(default, never):String;\n\t@:require(flash10) static var maxLevelIDC(default, never):String;\n\tstatic var os(default, never):String;\n\tstatic var pixelAspectRatio(default, never):Float;\n\tstatic var playerType(default, never):String;\n\tstatic var screenColor(default, never):String;\n\tstatic var screenDPI(default, never):Float;\n\tstatic var screenResolutionX(default, never):Float;\n\tstatic var screenResolutionY(default, never):Float;\n\tstatic var serverString(default, never):String;\n\t@:require(flash10_1) static var supports32BitProcesses(default, never):Bool;\n\t@:require(flash10_1) static var supports64BitProcesses(default, never):Bool;\n\t@:require(flash10_1) static var touchscreenType(default, never):TouchscreenType;\n\tstatic var version(default, never):String;\n\t@:require(flash11) static function hasMultiChannelAudio(type:String):Bool;\n}\n"
  },
  {
    "path": "externs/air/flash/system/SecurityPrivilege.hx",
    "content": "package flash.system;\n\nextern class SecurityPrivilege\n{\n\tfunction new():Void;\n\tstatic var FILE(default, never):Dynamic;\n\tstatic var FILE_APPSTORE(default, never):Dynamic;\n\tstatic var FILE_PATHACCESS(default, never):Dynamic;\n\tstatic var FILE_READ(default, never):Dynamic;\n\tstatic var FILE_TEMP(default, never):Dynamic;\n\tstatic var FILE_WRITE(default, never):Dynamic;\n\tstatic var FILE_WRITE_RESOURCE(default, never):Dynamic;\n\tstatic var HTML(default, never):Dynamic;\n\tstatic var HTTP_ALL(default, never):Dynamic;\n\tstatic var SCREEN(default, never):Dynamic;\n\tstatic var WINDOW(default, never):Dynamic;\n}\n"
  },
  {
    "path": "externs/air/flash/text/AutoCapitalize.hx",
    "content": "package flash.text;\n\n@:native(\"flash.text.AutoCapitalize\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract AutoCapitalize(String)\n{\n\tvar ALL = \"all\";\n\tvar NONE = \"none\";\n\tvar SENTENCE = \"sentence\";\n\tvar WORD = \"word\";\n}\n"
  },
  {
    "path": "externs/air/flash/text/ReturnKeyLabel.hx",
    "content": "package flash.text;\n\n@:native(\"flash.text.ReturnKeyLabel\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract ReturnKeyLabel(String)\n{\n\tvar DEFAULT = \"default\";\n\tvar DONE = \"done\";\n\tvar GO = \"go\";\n\tvar NEXT = \"next\";\n\tvar SEARCH = \"search\";\n}\n"
  },
  {
    "path": "externs/air/flash/text/SoftKeyboardType.hx",
    "content": "package flash.text;\n\n@:native(\"flash.text.SoftKeyboardType\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract SoftKeyboardType(String)\n{\n\tvar CONTACT = \"contact\";\n\tvar DEFAULT = \"default\";\n\tvar EMAIL = \"email\";\n\tvar NUMBER = \"number\";\n\tvar PUNCTUATION = \"punctuation\";\n\tvar URL = \"url\";\n}\n"
  },
  {
    "path": "externs/air/flash/text/StageText.hx",
    "content": "package flash.text;\n\n@:final extern class StageText extends flash.events.EventDispatcher\n{\n\tvar autoCapitalize:AutoCapitalize;\n\tvar autoCorrect:Bool;\n\tvar clearButtonMode(never, default):StageTextClearButtonMode;\n\tvar color:UInt;\n\tvar displayAsPassword:Bool;\n\tvar editable:Bool;\n\tvar fontFamily:String;\n\tvar fontPosture:flash.text.engine.FontPosture;\n\tvar fontSize:Int;\n\tvar fontWeight:flash.text.engine.FontWeight;\n\tvar locale:String;\n\tvar maxChars:Int;\n\tvar multiline(default, never):Bool;\n\tvar restrict:String;\n\tvar returnKeyLabel:ReturnKeyLabel;\n\tvar selectionActiveIndex(default, never):Int;\n\tvar selectionAnchorIndex(default, never):Int;\n\tvar softKeyboardType:SoftKeyboardType;\n\tvar stage:flash.display.Stage;\n\tvar text:String;\n\tvar textAlign:flash.text.TextFormatAlign;\n\tvar viewPort:flash.geom.Rectangle;\n\tvar visible:Bool;\n\tfunction new(?initOptions:StageTextInitOptions):Void;\n\tfunction assignFocus():Void;\n\tfunction dispose():Void;\n\tfunction drawViewPortToBitmapData(bitmap:flash.display.BitmapData):Void;\n\tfunction selectRange(anchorIndex:Int, activeIndex:Int):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/text/StageTextClearButtonMode.hx",
    "content": "package flash.text;\n\n@:native(\"flash.text.StageTextClearButtonMode\")\n#if (haxe_ver >= 4.0) extern enum #else @:extern @:enum #end abstract StageTextClearButtonMode(String)\n{\n\tvar ALWAYS = \"always\";\n\tvar NEVER = \"never\";\n\tvar UNLESS_EDITING = \"unlessEditing\";\n\tvar WHILE_EDITING = \"whileEditing\";\n}\n"
  },
  {
    "path": "externs/air/flash/text/StageTextImpl.hx",
    "content": "package flash.text;\n\nextern class StageTextImpl extends flash.display.Sprite\n{\n\tfunction new():Void;\n}\n"
  },
  {
    "path": "externs/air/flash/text/StageTextInitOptions.hx",
    "content": "package flash.text;\n\nextern class StageTextInitOptions\n{\n\tvar multiline:Bool;\n\tfunction new(multiline:Bool = false):Void;\n}\n"
  },
  {
    "path": "externs/air/flash/ui/ContextMenu.hx",
    "content": "package flash.ui;\n\n@:final extern class ContextMenu extends flash.display.NativeMenu\n{\n\tvar builtInItems:ContextMenuBuiltInItems;\n\t@:require(flash10) var clipboardItems:ContextMenuClipboardItems;\n\t@:require(flash10) var clipboardMenu:Bool;\n\tvar customItems:Array<Dynamic>;\n\t@:require(flash10) var link:flash.net.URLRequest;\n\tfunction new():Void;\n\t// function clone() : ContextMenu;\n\tfunction hideBuiltInItems():Void;\n\t@:require(flash10_1) static var isSupported(default, never):Bool;\n\t// override function clone() : flash.display.NativeMenu;\n}\n"
  },
  {
    "path": "externs/air/flash/ui/ContextMenuItem.hx",
    "content": "package flash.ui;\n\n@:final extern class ContextMenuItem #if air extends flash.display.NativeMenuItem #end\n{\n\tvar caption:String;\n\tvar separatorBefore:Bool;\n\tvar visible:Bool;\n\tfunction new(caption:String, separatorBefore:Bool = false, enabled:Bool = true, visible:Bool = true):Void;\n\t#if !air\n\tfunction clone():ContextMenuItem;\n\t#end\n}\n"
  },
  {
    "path": "externs/air/sys/FileSystem.hx",
    "content": "package sys;\n\nimport flash.filesystem.File in FlashFile;\nimport lime.utils.Log;\n\n@:dce\n@:coreApi\nclass FileSystem\n{\n\tpublic static function exists(path:String):Bool\n\t{\n\t\treturn new FlashFile(path).exists;\n\t}\n\n\tpublic static function rename(path:String, newPath:String):Void\n\t{\n\t\tnew FlashFile(path).moveTo(new FlashFile(newPath));\n\t}\n\n\tpublic static function stat(path:String):sys.FileStat\n\t{\n\t\tLog.warn(\"stat is not implemented\");\n\t\treturn null;\n\t}\n\n\tpublic static function fullPath(relPath:String):String\n\t{\n\t\tvar flashFile = new FlashFile(relPath);\n\t\tflashFile.canonicalize();\n\t\treturn flashFile.nativePath;\n\t}\n\n\tpublic static function absolutePath(relPath:String):String\n\t{\n\t\treturn new FlashFile(relPath).nativePath;\n\t}\n\n\tpublic static function isDirectory(path:String):Bool\n\t{\n\t\treturn new FlashFile(path).isDirectory;\n\t}\n\n\tpublic static function createDirectory(path:String):Void\n\t{\n\t\tnew FlashFile(path).createDirectory();\n\t}\n\n\tpublic static function deleteFile(path:String):Void\n\t{\n\t\tnew FlashFile(path).deleteFile();\n\t}\n\n\tpublic static function deleteDirectory(path:String):Void\n\t{\n\t\tnew FlashFile(path).deleteDirectory(false);\n\t}\n\n\tpublic static function readDirectory(path:String):Array<String>\n\t{\n\t\treturn new FlashFile(path).getDirectoryListing().map(function(f:FlashFile):String\n\t\t{\n\t\t\treturn f.name;\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "externs/air/sys/io/File.hx",
    "content": "package sys.io;\n\nimport flash.utils.ByteArray;\nimport flash.filesystem.File in FlashFile;\nimport flash.filesystem.FileMode;\nimport flash.filesystem.FileStream;\nimport lime.utils.Log;\nimport haxe.io.Bytes;\n\n@:dce\n@:coreApi\nclass File\n{\n\tpublic static function getContent(path:String):String\n\t{\n\t\tvar file:FlashFile = null;\n\t\tif (Reflect.hasField(FlashFile, \"workingDirectory\"))\n\t\t{\n\t\t\tfile = Reflect.field(FlashFile, \"workingDirectory\").resolvePath(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfile = new FlashFile(path);\n\t\t}\n\t\tvar stream = new FileStream();\n\t\tstream.open(file, FileMode.READ);\n\t\tvar content = stream.readUTFBytes(stream.bytesAvailable);\n\t\tstream.close();\n\t\treturn content;\n\t}\n\n\tpublic static function saveContent(path:String, content:String):Void\n\t{\n\t\tvar file:FlashFile = null;\n\t\tif (Reflect.hasField(FlashFile, \"workingDirectory\"))\n\t\t{\n\t\t\tfile = Reflect.field(FlashFile, \"workingDirectory\").resolvePath(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfile = new FlashFile(path);\n\t\t}\n\t\tvar stream = new FileStream();\n\t\tstream.open(file, FileMode.WRITE);\n\t\tstream.writeUTFBytes(content);\n\t\tstream.close();\n\t}\n\n\tpublic static function getBytes(path:String):haxe.io.Bytes\n\t{\n\t\tvar file:FlashFile = null;\n\t\tif (Reflect.hasField(FlashFile, \"workingDirectory\"))\n\t\t{\n\t\t\tfile = Reflect.field(FlashFile, \"workingDirectory\").resolvePath(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfile = new FlashFile(path);\n\t\t}\n\t\tvar stream = new FileStream();\n\t\tstream.open(file, FileMode.READ);\n\t\tvar byteArray = new ByteArray();\n\t\tstream.readBytes(byteArray, 0, stream.bytesAvailable);\n\t\tstream.close();\n\t\treturn Bytes.ofData(byteArray);\n\t}\n\n\tpublic static function saveBytes(path:String, bytes:haxe.io.Bytes):Void\n\t{\n\t\tvar byteArray:ByteArray = bytes.getData();\n\t\tvar file:FlashFile = null;\n\t\tif (Reflect.hasField(FlashFile, \"workingDirectory\"))\n\t\t{\n\t\t\tfile = Reflect.field(FlashFile, \"workingDirectory\").resolvePath(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfile = new FlashFile(path);\n\t\t}\n\t\tvar stream = new FileStream();\n\t\tstream.open(file, FileMode.WRITE);\n\t\tstream.writeBytes(byteArray);\n\t\tstream.close();\n\t}\n\n\tpublic static function read(path:String, binary:Bool = true):FileInput\n\t{\n\t\tLog.warn(\"read is not implemented\");\n\t\treturn null;\n\t}\n\n\tpublic static function write(path:String, binary:Bool = true):FileOutput\n\t{\n\t\tLog.warn(\"write is not implemented\");\n\t\treturn null;\n\t}\n\n\tpublic static function append(path:String, binary:Bool = true):FileOutput\n\t{\n\t\tLog.warn(\"append is not implemented\");\n\t\treturn null;\n\t}\n\n\tpublic static function update(path:String, binary:Bool = true):FileOutput\n\t{\n\t\tLog.warn(\"update is not implemented\");\n\t\treturn null;\n\t}\n\n\tpublic static function copy(srcPath:String, dstPath:String):Void\n\t{\n\t\tvar srcFile:FlashFile = null;\n\t\tvar dstFile:FlashFile = null;\n\t\tif (Reflect.hasField(FlashFile, \"workingDirectory\"))\n\t\t{\n\t\t\tsrcFile = Reflect.field(FlashFile, \"workingDirectory\").resolvePath(srcPath);\n\t\t\tdstFile = Reflect.field(FlashFile, \"workingDirectory\").resolvePath(dstPath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsrcFile = new FlashFile(srcPath);\n\t\t\tdstFile = new FlashFile(dstPath);\n\t\t}\n\t\tsrcFile.copyTo(dstFile);\n\t}\n}\n"
  },
  {
    "path": "externs/air/sys/io/FileInput.hx",
    "content": "package sys.io;\n\nimport haxe.io.Bytes;\nimport haxe.io.Eof;\nimport haxe.io.Error;\n\n@:coreApi\nclass FileInput extends haxe.io.Input\n{\n\tprivate var fd:Int;\n\tprivate var pos:Int;\n\n\t@:allow(sys.io.File)\n\tprivate function new(fd:Int)\n\t{\n\t\tthis.fd = fd;\n\t\tpos = 0;\n\t}\n\n\toverride public function readByte():Int\n\t{\n\t\treturn 0;\n\t}\n\n\toverride public function readBytes(s:Bytes, pos:Int, len:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\toverride public function close():Void {}\n\n\tpublic function seek(p:Int, pos:FileSeek):Void\n\t{\n\t\tswitch (pos)\n\t\t{\n\t\t\tcase SeekBegin:\n\t\t\t// this.pos = p;\n\t\t\tcase SeekEnd:\n\t\t\t// this.pos = cast Fs.fstatSync(fd).size + p;\n\t\t\tcase SeekCur:\n\t\t\t\t// this.pos += p;\n\t\t}\n\t}\n\n\tpublic function tell():Int\n\t{\n\t\treturn 0;\n\t}\n\n\tpublic function eof():Bool\n\t{\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "externs/air/sys/io/FileOutput.hx",
    "content": "package sys.io;\n\nimport haxe.io.Bytes;\nimport haxe.io.Eof;\nimport haxe.io.Error;\n\n@:coreApi\nclass FileOutput extends haxe.io.Output\n{\n\tprivate var fd:Int;\n\tprivate var pos:Int;\n\n\t@:allow(sys.io.File)\n\tprivate function new(fd:Int)\n\t{\n\t\tthis.fd = fd;\n\t\tpos = 0;\n\t}\n\n\toverride public function writeByte(b:Int):Void {}\n\n\toverride public function writeBytes(s:Bytes, pos:Int, len:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\toverride public function close():Void {}\n\n\tpublic function seek(p:Int, pos:FileSeek):Void\n\t{\n\t\tswitch (pos)\n\t\t{\n\t\t\tcase SeekBegin:\n\t\t\t// this.pos = p;\n\t\t\tcase SeekEnd:\n\t\t\t// this.pos = cast Fs.fstatSync(fd).size + p;\n\t\t\tcase SeekCur:\n\t\t\t\t// this.pos += p;\n\t\t}\n\t}\n\n\tpublic function tell():Int\n\t{\n\t\treturn 0;\n\t}\n}\n"
  },
  {
    "path": "extraParams.hxml",
    "content": "--macro lime._internal.macros.DefineMacro.run()\n--macro haxe.macro.Compiler.addMetadata(\"@:autoBuild(lime._internal.macros.AssetsMacro.embedBytes())\", \"haxe.io.Bytes\")\n"
  },
  {
    "path": "haxelib.json",
    "content": "{\n\t\"name\": \"lime\",\n\t\"url\": \"https://github.com/openfl/lime\",\n\t\"license\": \"MIT\",\n\t\"tags\": [],\n\t\"description\": \"A foundational Haxe framework for cross-platform development\",\n\t\"version\": \"8.3.1\",\n\t\"releasenote\": \"Various bug fixes\",\n\t\"contributors\": [\n\t\t\"singmajesty\",\n\t\t\"bowlerhat\",\n\t\t\"Dimensionscape\"\n\t],\n\t\"classPath\": \"src\"\n}\n"
  },
  {
    "path": "haxelib.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<haxelib>\n\t\n\t<!-- Including this file is a trick to improve FlashDevelop code completion -->\n\t\n</haxelib>"
  },
  {
    "path": "hxformat.json",
    "content": "{\n\t\"lineEnds\": {\n\t\t\"leftCurly\": \"both\",\n\t\t\"rightCurly\": \"both\"\n\t},\n\t\"sameLine\": {\n\t\t\"ifBody\": \"same\",\n\t\t\"ifElse\": \"next\",\n\t\t\"doWhile\": \"next\",\n\t\t\"tryBody\": \"next\",\n\t\t\"tryCatch\": \"next\"\n\t}\n}"
  },
  {
    "path": "include.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<extension>\n\n\t<log error=\"Lime ${lime} is not compatible with Haxe ${haxe} (version 3.2.0 or higher is required)\" if=\"${haxe < 3.2.0}\" />\n\n\t<log error=\"Lime ${lime} requires Haxe 4 to target HashLink (version ${haxe} found)\" if=\"hl ${${haxe} < 4.0}\" />\n\n\t<set name=\"lime\" />\n\n\t<define name=\"native\" if=\"cpp || neko || nodejs || cs || java || hl\" />\n\t<define name=\"howlerjs\" if=\"html5\" />\n\n\t<define name=\"lime-cairo\" if=\"native\" />\n\t<define name=\"lime-canvas\" if=\"html5\" />\n\t<define name=\"lime-cffi\" if=\"native\" />\n\t<define name=\"lime-curl\" unless=\"lime-console || lime-switch || emscripten || flash || html5\" />\n\t<define name=\"lime-dom\" if=\"html5\" />\n\t<define name=\"lime-harfbuzz\" if=\"native\" />\n\t<define name=\"lime-howlerjs\" if=\"html5\" />\n\t<define name=\"lime-html5\" if=\"html5\" />\n\t<define name=\"lime-native\" if=\"native\" />\n\t<define name=\"lime-openalsoft\" if=\"windows || linux || mac || android\" unless=\"static_link || lime-mojoal || winrt\" />\n\t<define name=\"lime-mojoal\" if=\"lime-switch || static_link || winrt\" unless=\"lime-openalsoft\" />\n\t<define name=\"lime-openal\" if=\"ios || tvos || emscripten || lime-openalsoft || lime-mojoal\" />\n\t<define name=\"lime-opengl\" if=\"desktop\" unless=\"html5\" />\n\t<define name=\"lime-opengles\" if=\"emscripten || mobile\" />\n\t<define name=\"lime-vorbis\" if=\"native\" />\n\t<define name=\"lime-webgl\" if=\"html5\" />\n\n\t<define name=\"no-typedarray-inline\" if=\"cs\" />\n\t<haxedef name=\"no-compilation\" />\n\n\t<templatePath name=\"templates\" />\n\t<source path=\"externs/air\" if=\"air\" />\n\t<haxeflag name=\"--macro\" value=\"allowPackage('sys')\" if=\"air\" />\n\t<sample path=\"samples\" unless=\"openfl\" />\n\n\t<haxelib name=\"nodejs\" if=\"nodejs\" />\n\t<haxelib name=\"format\" if=\"java\" />\n\n\t<target name=\"ps3\" handler=\"lime-ps3\" />\n\t<haxelib name=\"lime-ps3\" if=\"ps3\" />\n\n\t<target name=\"ps4\" handler=\"lime-ps4\" />\n\t<haxelib name=\"lime-ps4\" if=\"ps4\" />\n\n\t<target name=\"vita\" handler=\"lime-vita\" />\n\t<haxelib name=\"lime-vita\" if=\"vita\" />\n\n\t<target name=\"switch\" handler=\"lime-switch\" />\n\t<haxelib name=\"lime-switch\" if=\"switch\" />\n\n\t<target name=\"wiiu\" handler=\"lime-wiiu\" />\n\t<haxelib name=\"lime-wiiu\" if=\"wiiu\" />\n\n\t<target name=\"xbox1\" handler=\"lime-xbox1\" />\n\t<haxelib name=\"lime-xbox1\" if=\"xbox1\" />\n\n\t<target name=\"console-pc\" handler=\"lime-console-pc\" />\n\t<haxelib name=\"lime-console-pc\" if=\"console-pc\" />\n\n\t<section if=\"hxp\" unless=\"lime-tools\">\n\n\t\t<target name=\"air\" path=\"tools/platforms/AIRPlatform.hx\" />\n\t\t<target name=\"android\" path=\"tools/platforms/AndroidPlatform.hx\" />\n\t\t<target name=\"emscripten\" path=\"tools/platforms/EmscriptenPlatform.hx\" />\n\t\t<target name=\"flash\" path=\"tools/platforms/FlashPlatform.hx\" />\n\t\t<target name=\"html5\" path=\"tools/platforms/HTML5Platform.hx\" />\n\t\t<target name=\"ios\" path=\"tools/platforms/IOSPlatform.hx\" />\n\t\t<target name=\"linux\" path=\"tools/platforms/LinuxPlatform.hx\" />\n\t\t<target name=\"mac\" path=\"tools/platforms/MacPlatform.hx\" />\n\t\t<target name=\"tvos\" path=\"tools/platforms/TVOSPlatform.hx\" />\n\t\t<target name=\"windows\" path=\"tools/platforms/WindowsPlatform.hx\" />\n\n\t</section>\n\n\t<section unless=\"display\">\n\n\t\t<section unless=\"force-synchronous || force_synchronous\">\n\t\t\t<haxedef name=\"lime-threads\" if=\"neko || cpp || html5\" unless=\"emscripten\" />\n\t\t\t<!-- `target.threaded` isn't available, so enumerate the targets instead. -->\n\t\t\t<haxedef name=\"lime-threads\" if=\"cs || java || python || hl\" unless=\"${${haxe_ver} < 4}\" />\n\n\t\t\t<!-- For internal use; may be removed or renamed without warning. -->\n\t\t\t<haxedef name=\"lime-threads-deque\" if=\"neko || cpp || cs || java || python || hl\" />\n\t\t</section>\n\n\t\t<section if=\"cpp ${${haxe_ver} < 3.3}\" unless=\"static_link\">\n\t\t\t<ndll name=\"std\" haxelib=\"hxcpp\" />\n\t\t\t<ndll name=\"regexp\" haxelib=\"hxcpp\" />\n\t\t\t<ndll name=\"zlib\" haxelib=\"hxcpp\" unless=\"emscripten || ios || tvos\" />\n\t\t</section>\n\n\t\t<ndll name=\"lime\" if=\"native\" unless=\"lime-console static_link || lime-switch static_link\" />\n\n\t\t<dependency name=\"extension-api\" path=\"dependencies/extension-api\" if=\"android\" />\n\n\t\t<dependency path=\"dependencies/howler.min.js\" if=\"html5 howlerjs\" embed=\"true\" />\n\t\t<dependency path=\"dependencies/pako.min.js\" if=\"html5\" embed=\"true\" allow-web-workers=\"true\" />\n\t\t<dependency path=\"dependencies/lzma_worker-min.js\" if=\"html5\" embed=\"true\" />\n\t\t<dependency path=\"dependencies/FileSaver.min.js\" if=\"html5\" embed=\"true\" />\n\t\t<dependency path=\"dependencies/webgl-debug.js\" if=\"html5 webgl-debug\" embed=\"true\" />\n\t\t<dependency path=\"dependencies/stats.min.js\" if=\"html5 stats\" embed=\"true\" />\n\n\t\t<dependency path=\"dependencies/angle/d3dcompiler_47.dll\" if=\"windows angle\" unless=\"static_link\" />\n\t\t<dependency path=\"dependencies/angle/libegl.dll\" if=\"windows angle\" unless=\"static_link\" />\n\t\t<dependency path=\"dependencies/angle/libglesv2.dll\" if=\"windows angle\" unless=\"static_link\" />\n\n\t\t<!-- TODO: Move to template or move all template dependencies to XML? -->\n\t\t<!-- <dependency name=\"CoreBluetooth.framework\" if=\"ios\" /> -->\n\n\t\t<define name=\"native-trace\" if=\"flash\" unless=\"haxe-trace || haxetrace\" />\n\t\t<define name=\"fdb\" if=\"flash debug\" unless=\"nofdb\" />\n\n\t\t<define name=\"MACOSX_DEPLOYMENT_TARGET\" value=\"10.9\" if=\"mac\" unless=\"MACOSX_DEPLOYMENT_TARGET\" />\n\t\t<setenv name=\"MACOSX_DEPLOYMENT_TARGET\" value=\"${MACOSX_DEPLOYMENT_TARGET}\" if=\"mac\" />\n\n\t\t<architecture name=\"armv7\" if=\"android\" />\n\n\t\t<section if=\"emscripten\">\n\n\t\t\t<dependency name=\"pthread\" />\n\t\t\t<dependency name=\"openal\" if=\"lime-openal\" />\n\n\t\t</section>\n\n\t\t<section if=\"lime-modular\">\n\n\t\t\t<set name=\"haxe-module-name\" value=\"haxe\" unless=\"haxe-module-name\" />\n\t\t\t<set name=\"lime-module-name\" value=\"lime\" unless=\"lime-module-name\" />\n\t\t\t<setenv name=\"HAXE_STD_PATH\" value=\"${HAXE_STD_PATH}\" if=\"HAXE_STD_PATH\" />\n\n\t\t\t<module name=\"${haxe-module-name}\" if=\"html5\" unless=\"exclude-haxe-module\">\n\n\t\t\t\t<!--<source path=\"${HAXE_STD_PATH}\" package=\"js.html\" />-->\n\t\t\t\t<source path=\"${HAXE_STD_PATH}\" package=\"haxe.ds\" exclude=\"haxe.ds.StringMap\" />\n\t\t\t\t<source path=\"${HAXE_STD_PATH}\" package=\"haxe.io\" />\n\n\t\t\t\t<class name=\"haxe.CallStack\" />\n\t\t\t\t<class name=\"haxe.Log\" />\n\t\t\t\t<class name=\"haxe.Timer\" />\n\t\t\t\t<!-- <class name=\"js.Boot\" /> -->\n\t\t\t\t<class name=\"js.Browser\" />\n\t\t\t\t<class name=\"js.Cookie\" />\n\t\t\t\t<class name=\"js.Error\" />\n\t\t\t\t<!-- <class name=\"js.Lib\" /> -->\n\t\t\t\t<class name=\"js.Promise\" />\n\t\t\t\t<class name=\"js.RegExp\" />\n\t\t\t\t<class name=\"js.Selection\" />\n\t\t\t\t<class name=\"js.XMLSocket\" />\n\t\t\t\t<class name=\"EReg\" />\n\t\t\t\t<class name=\"HxOverrides\" />\n\t\t\t\t<class name=\"List\" />\n\t\t\t\t<class name=\"Math\" />\n\t\t\t\t<!-- <class name=\"Reflect\" /> -->\n\t\t\t\t<!-- <class name=\"Std\" /> -->\n\t\t\t\t<class name=\"StringBuf\" />\n\t\t\t\t<class name=\"StringTools\" />\n\t\t\t\t<!-- <class name=\"Type\" /> -->\n\n\t\t\t\t<include type=\"haxe.ds._StringMap.StringMapIterator\" />\n\t\t\t\t<include type=\"haxe.ds.TreeNode\" />\n\t\t\t\t<!-- <include type=\"haxe.IMap\" /> -->\n\t\t\t\t<include type=\"haxe._Int64.___Int64\" />\n\t\t\t\t<include type=\"haxe.StackItem\" />\n\t\t\t\t<include type=\"js.html._CanvasElement.CanvasUtil\" />\n\t\t\t\t<!-- <include type=\"js._Boot.HaxeError\" /> -->\n\t\t\t\t<include type=\"_List.ListIterator\" />\n\n\t\t\t</module>\n\n\t\t\t<module name=\"${lime-module-name}\" if=\"html5\" unless=\"exclude-lime-module\">\n\n\t\t\t\t<source path=\"\" package=\"lime\" exclude=\"lime._backend.*|lime.project.*|lime.tools.*|lime.net.*|lime.graphics.console.*|lime.text.harfbuzz.*\" />\n\t\t\t\t<source path=\"\" package=\"lime\" include=\"lime._backend.html5\" />\n\n\t\t\t\t<class name=\"lime.net.HTTPRequest\" />\n\n\t\t\t\t<include type=\"lime.app._Future.FutureWork\" />\n\t\t\t\t<include type=\"lime.graphics.utils._ImageDataUtil.ImageDataView\" />\n\t\t\t\t<include type=\"lime.system._ThreadPool.ThreadPoolMessageType\" />\n\t\t\t\t<include type=\"lime.AssetLibrary\" />\n\n\t\t\t\t<!-- @:expose on enums do not work in Haxe 3.4.2 -->\n\t\t\t\t<class remove=\"lime.graphics.opengl.GLContextType\" />\n\t\t\t\t<class remove=\"lime.graphics.ImageChannel\" />\n\t\t\t\t<class remove=\"lime.graphics.ImageType\" />\n\t\t\t\t<class remove=\"lime.graphics.RendererType\" />\n\t\t\t\t<class remove=\"lime.ui.FileDialogType\" />\n\t\t\t\t<class remove=\"lime.ui.MouseCursor\" />\n\t\t\t\t<class remove=\"lime.system.Endian\" />\n\t\t\t\t<class remove=\"lime.system.SensorType\" />\n\n\t\t\t\t<exclude type=\"lime.graphics.console.IndexBuffer\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.PointerUtil\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.Primitive\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.RenderState\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.Shader\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.Texture\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.TextureAddressMode\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.TextureData\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.TextureFilter\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.TextureFormat\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.VertexBuffer\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.VertexDecl\" />\n\t\t\t\t<exclude type=\"lime.graphics.console.VertexOutput\" />\n\n\t\t\t</module>\n\n\t\t</section>\n\n\t</section>\n\n\t<haxelib name=\"hxcpp\" if=\"setup\" />\n\t<haxelib name=\"lime-samples\" if=\"setup\" />\n\n\t<include haxelib=\"lime-samples\" if=\"create\" />\n\n\t<section if=\"rebuild\">\n\n\t\t<config:project>\n\t\t\t<rebuild fulldebug=\"true\" />\n\t\t</config:project>\n\n\t</section>\n\n</extension>\n"
  },
  {
    "path": "ndll/Linux/.gitignore",
    "content": ""
  },
  {
    "path": "ndll/Linux64/.gitignore",
    "content": ""
  },
  {
    "path": "ndll/Mac/.gitignore",
    "content": ""
  },
  {
    "path": "ndll/Mac64/.gitignore",
    "content": ""
  },
  {
    "path": "ndll/MacArm64/.gitignore",
    "content": ""
  },
  {
    "path": "ndll/Windows/.gitignore",
    "content": ""
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"lime\",\n  \"private\": true\n}\n"
  },
  {
    "path": "project/Build.xml",
    "content": "<xml>\n\n\t<set name=\"HXCPP_CPP11\" value=\"1\" />\n\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\" />\n\n\t<set name=\"ios\" value=\"1\" if=\"iphone\" />\n\t<set name=\"tvos\" value=\"1\" if=\"appletv\" />\n\n\t<set name=\"LIME_CAIRO\" value=\"1\" />\n\t<set name=\"LIME_CURL\" value=\"1\" unless=\"winrt\" />\n\t<set name=\"LIME_EFSW\" value=\"1\" if=\"windows || mac || linux\" unless=\"winrt\" />\n\t<set name=\"LIME_JPEG\" value=\"1\" />\n\t<!-- <set name=\"LIME_FAUDIO\" value=\"1\" /> -->\n\t<set name=\"LIME_FREETYPE\" value=\"1\" />\n\t<set name=\"LIME_HARFBUZZ\" value=\"1\" unless=\"winrt\" />\n\t<!-- <set name=\"LIME_HASHLINK\" value=\"1\" if=\"windows || mac || linux\" /> -->\n\t<set name=\"LIME_HASHLINK\" value=\"1\" if=\"hashlink\" />\n\t<set name=\"LIME_LZMA\" value=\"1\" />\n\t<set name=\"LIME_MBEDTLS\" value=\"1\" unless=\"emscripten || winrt\" />\n\t<!-- <set name=\"LIME_NEKO\" value=\"1\" if=\"linux\" /> -->\n\t<set name=\"LIME_OGG\" value=\"1\" />\n\t<set name=\"LIME_OPENALSOFT\" value=\"1\" if=\"windows || linux || mac || android\" unless=\"static_link\" />\n\t<set name=\"LIME_OPENAL\" value=\"1\" if=\"iphone || webassembly || tvos\" />\n\t<set name=\"LIME_MOJOAL\" value=\"1\" if=\"switch || static_link || winrt || mojoal\" unless=\"LIME_OPENAL\" />\n\t<unset name=\"LIME_OPENALSOFT\" if=\"LIME_MOJOAL\" />\n\t<set name=\"LIME_OPENAL\" value=\"1\" if=\"LIME_OPENALSOFT || LIME_MOJOAL\" />\n\t<set name=\"LIME_OPENGL\" value=\"1\" />\n\t<set name=\"LIME_PIXMAN\" value=\"1\" />\n\t<set name=\"LIME_PNG\" value=\"1\" />\n\t<set name=\"LIME_SDL\" value=\"1\" />\n\t<!-- <set name=\"LIME_SDL_ANGLE\" value=\"1\" if=\"windows\" unless=\"static_link\" /> -->\n\t<set name=\"LIME_SDL_ANGLE\" value=\"1\" if=\"windows LIME_SDL_ANGLE\" unless=\"static_link\" />\n\t<set name=\"LIME_SDL_ANGLE\" value=\"1\" if=\"windows angle\" unless=\"static_link\" />\n\t<set name=\"LIME_SDL_ANGLE\" value=\"1\" if=\"winrt\" />\n\t<set name=\"LIME_TINYFILEDIALOGS\" value=\"1\" if=\"windows || mac || linux\" unless=\"winrt || emscripten\" />\n\t<set name=\"LIME_VORBIS\" value=\"1\" />\n\t<!-- <set name=\"LIME_VPX\" value=\"1\" />\n\t<set name=\"LIME_WEBM\" value=\"1\" /> -->\n\t<set name=\"LIME_ZLIB\" value=\"1\" />\n\n\t<set name=\"OUTPUT_DIR\" value=\"../ndll\" unless=\"OUTPUT_DIR\" />\n\t<set name=\"NATIVE_TOOLKIT_PATH\" value=\"lib\" unless=\"NATIVE_TOOLKIT_PATH\" />\n\n\t<set name=\"NATIVE_TOOLKIT_HAVE_CAIRO\" value=\"1\" if=\"LIME_CAIRO\" />\n\t<set name=\"NATIVE_TOOLKIT_HAVE_FREETYPE\" value=\"1\" if=\"LIME_FREETYPE\" />\n\t<set name=\"NATIVE_TOOLKIT_HAVE_HARFBUZZ\" value=\"1\" if=\"LIME_HARFBUZZ\" />\n\t<set name=\"NATIVE_TOOLKIT_HAVE_MBEDTLS\" value=\"1\" if=\"LIME_MBEDTLS\" />\n\t<set name=\"NATIVE_TOOLKIT_HAVE_PNG\" value=\"1\" if=\"LIME_PNG\" />\n\t<set name=\"NATIVE_TOOLKIT_HAVE_SDL\" value=\"1\" if=\"LIME_SDL\" />\n\n\t<set name=\"NATIVE_TOOLKIT_SDL_STATIC\" value=\"1\" />\n\t<set name=\"NATIVE_TOOLKIT_SDL_ANGLE\" value=\"1\" if=\"LIME_SDL_ANGLE\" />\n\n\t<files id=\"lime\">\n\n\t\t<!-- setting HXCPP_CPP11 doesn't seem to apply to .mm files -->\n        <compilerflag value=\"-std=c++11\" unless=\"isMsvc\" />\n\t\t<compilerflag value=\"-Iinclude\" />\n\n\t\t<file name=\"src/ExternalInterface.cpp\" />\n\n\t\t<section if=\"LIME_CAIRO\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/src/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/default/\" unless=\"windows || mac || linux\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/linux/\" if=\"linux\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/windows/\" if=\"windows\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/mac/\" if=\"mac\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/cairo/src/\" />\n\t\t\t<compilerflag value=\"-DLIME_CAIRO\" />\n\t\t\t<compilerflag value=\"-DHAVE_CONFIG_H\" />\n\t\t\t<compilerflag value=\"-DCAIRO_WIN32_STATIC_BUILD\" if=\"windows\" />\n\t\t\t<compilerflag value=\"-DCAIRO_HAS_FT_FONT\" />\n\n\t\t\t<file name=\"src/graphics/cairo/CairoBindings.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_CURL\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/curl/include/\" />\n\t\t\t<compilerflag value=\"-DLIME_CURL\" />\n\t\t\t<compilerflag value=\"-DCURL_STATICLIB\" />\n\n\t\t\t<file name=\"src/net/curl/CURLBindings.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_EFSW\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/efsw/include/\" />\n\t\t\t<compilerflag value=\"-DLIME_EFSW\" />\n\n\t\t\t<file name=\"src/system/FileWatcher.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_FAUDIO\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/faudio/src\" />\n\t\t\t<compilerflag value=\"-DLIME_FAUDIO\" />\n\n\t\t\t<!-- <file name=\"src/graphics/format/PNG.cpp\" /> -->\n\n\t\t</section>\n\n\t\t<section if=\"LIME_FREETYPE\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/freetype/include\" />\n\t\t\t<compilerflag value=\"-DLIME_FREETYPE\" />\n\n\t\t\t<!--\n\t\t\t\tprefer FreeType's font metrics algorithm from 2.9.1\n\t\t\t\tit behaves more like SWF than the new algorithm\n\t\t\t-->\n\t\t\t<compilerflag value=\"-DLIME_FREETYPE_LEGACY_METRICS\" />\n\n\t\t\t<file name=\"src/text/Font.cpp\" />\n\n\t\t\t<section if=\"LIME_HARFBUZZ\">\n\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/harfbuzz/src\" />\n\t\t\t\t<compilerflag value=\"-DLIME_HARFBUZZ\" />\n\n\t\t\t\t<file name=\"src/text/harfbuzz/HarfbuzzBindings.cpp\" />\n\n\t\t\t</section>\n\n\t\t</section>\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/hashlink/src\" />\n\n\t\t<section if=\"LIME_HASHLINK\">\n\n\t\t\t<compilerflag value=\"-DLIME_HASHLINK\" />\n\n\t\t</section>\n\n\t\t<section unless=\"LIME_HASHLINK\">\n\n\t\t\t<compilerflag value=\"-DLIBHL_EXPORTS\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_JPEG\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/jpeg/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/jpeg/\" />\n\t\t\t<compilerflag value=\"-DLIME_JPEG\" />\n\n\t\t\t<file name=\"src/graphics/format/JPEG.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_LZMA\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/lzma/src\" />\n\t\t\t<compilerflag value=\"-DLIME_LZMA\" />\n\n\t\t\t<file name=\"src/utils/compress/LZMA.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_NEKO\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/neko/vm/\" />\n\t\t\t<compilerflag value=\"-DLIME_NEKO\" />\n\n\t\t\t<file name=\"src/vm/NekoVM.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_OGG\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/ogg/include/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/ogg/include/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vorbis/include/\" />\n\t\t\t<compilerflag value=\"-DLIME_OGG\" />\n\n\t\t\t<file name=\"src/media/containers/OGG.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_OPENAL\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/openal/include/\" unless=\"LIME_MOJOAL || emscripten\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/mojoal/\" if=\"LIME_MOJOAL\" />\n\t\t\t<compilerflag value=\"-DLIME_OPENAL\" />\n\t\t\t<compilerflag value=\"-DLIME_OPENALSOFT\" if=\"LIME_OPENALSOFT\" />\n\t\t\t<compilerflag value=\"-DLIME_MOJOAL\" if=\"LIME_MOJOAL\" />\n\t\t\t<compilerflag value=\"-DAL_LIBTYPE_STATIC=1\" if=\"LIME_OPENALSOFT || LIME_MOJOAL\" />\n\t\t\t<compilerflag value=\"-DAL_ALEXT_PROTOTYPES\" if=\"LIME_OPENALSOFT\" />\n\n\t\t\t<file name=\"src/media/openal/OpenALBindings.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_OPENGL\">\n\n\t\t\t<compilerflag value=\"-DLIME_OPENGL\" />\n\t\t\t<compilerflag value=\"-I${DEVELOPER_DIR}/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS${TVOS_VER}.sdk/\" if=\"tvos\" />\n\n\t\t\t<file name=\"src/graphics/opengl/OpenGLBindings.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_PNG\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/png/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/png/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/zlib/\" />\n\t\t\t<compilerflag value=\"-DLIME_PNG\" />\n\n\t\t\t<file name=\"src/graphics/format/PNG.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_SDL\">\n\n\t\t\t<section if=\"emscripten\">\n\n\t\t\t\t<compilerflag value=\"-s\" />\n\t\t\t\t<compilerflag value=\"USE_SDL=2\" />\n\n\t\t\t</section>\n\n\t\t\t<section unless=\"emscripten\">\n\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/\" />\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/default/\" unless=\"windows || mac || linux || rpi\" />\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/linux/\" if=\"linux\" unless=\"rpi\" />\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/windows/\" if=\"windows\" unless=\"winrt\" />\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/mac/\" if=\"mac\" />\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/rpi/\" if=\"rpi\" />\n\t\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/winrt/\" if=\"winrt\" />\n\n\t\t\t\t<compilerflag value=\"-DHAVE_LIBC\" />\n\n\t\t\t</section>\n\n\t\t\t<section if=\"rpi\">\n\n\t\t\t\t<compilerflag value=\"-I/usr/include/libdrm\" />\n\t\t\t\t<compilerflag value=\"-I/usr/include/dbus-1.0\" />\n\t\t\t\t<compilerflag value=\"-I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include\" unless=\"HXCPP_ARM64\" />\n\t\t\t\t<compilerflag value=\"-I/usr/lib/aarch64-linux-gnu/dbus-1.0/include\" if=\"HXCPP_ARM64\" />\n\t\t\t\t<compilerflag value=\"-I/usr/local/include\" />\n\n\t\t\t\t<compilerflag value=\"-ldrm\" />\n\t\t\t\t<compilerflag value=\"-lgbm\" />\n\n\t\t\t\t<compilerflag value=\"-Wl,--no-undefined -lm -ldl -ldrm -lpthread -lrt\" />\n\n\t\t\t</section>\n\n\t\t\t<compilerflag value=\"-DLIME_SDL\" />\n\t\t\t<compilerflag value=\"-DNATIVE_TOOLKIT_SDL_ANGLE\" if=\"NATIVE_TOOLKIT_SDL_ANGLE\" />\n\t\t\t<compilerflag value=\"-D__IPHONEOS__\" if=\"ios || tvos\" />\n\t\t\t<compilerflag value=\"-D__APPLETVOS__\" if=\"tvos\" />\n\t\t\t<compilerflag value=\"-DAPPLETV\" if=\"tvos\" />\n\t\t\t<compilerflag value=\"-DHAVE_STDIO_H\" unless=\"windows\" />\n\n\t\t\t<file name=\"src/backend/sdl/SDLApplication.cpp\" />\n\t\t\t<file name=\"src/backend/sdl/SDLGamepad.cpp\" />\n\t\t\t<file name=\"src/backend/sdl/SDLJoystick.cpp\" />\n\t\t\t<file name=\"src/backend/sdl/SDLKeyCode.cpp\" />\n\t\t\t<file name=\"src/backend/sdl/SDLMutex.cpp\" />\n\t\t\t<file name=\"src/backend/sdl/SDLSystem.cpp\" />\n\t\t\t<file name=\"src/backend/sdl/SDLWindow.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_TINYFILEDIALOGS\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/tinyfiledialogs/\" />\n\t\t\t<compilerflag value=\"-DLIME_TINYFILEDIALOGS\" />\n\n\t\t\t<file name=\"src/ui/FileDialog.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_VORBIS\">\n\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/ogg/include/\" />\n\t\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vorbis/include/\" />\n\t\t\t<compilerflag value=\"-DLIME_VORBIS\" />\n\n\t\t\t<file name=\"src/media/codecs/vorbis/VorbisBindings.cpp\" />\n\t\t\t<file name=\"src/media/codecs/vorbis/VorbisFile.cpp\" />\n\n\t\t</section>\n\n\t\t<section if=\"LIME_ZLIB\">\n\n\t\t\t<compilerflag value=\"-DSTATIC_LINK\" if=\"emscripten || ios || tvos\" />\n\t\t\t<compilerflag value=\"-DLIME_ZLIB\" />\n\n\t\t\t<file name=\"src/utils/compress/Zlib.cpp\" />\n\n\t\t</section>\n\n\t\t<file name=\"src/app/ApplicationEvent.cpp\" />\n\t\t<file name=\"src/graphics/Image.cpp\" />\n\t\t<file name=\"src/graphics/ImageBuffer.cpp\" />\n\t\t<file name=\"src/graphics/RenderEvent.cpp\" />\n\t\t<file name=\"src/graphics/utils/ImageDataUtil.cpp\" />\n\t\t<file name=\"src/hx/CFFIExt.cpp\" />\n\t\t<file name=\"src/math/ColorMatrix.cpp\" />\n\t\t<file name=\"src/math/Matrix3.cpp\" />\n\t\t<file name=\"src/math/Rectangle.cpp\" />\n\t\t<file name=\"src/math/Vector2.cpp\" />\n\t\t<file name=\"src/media/AudioBuffer.cpp\" />\n\t\t<file name=\"src/media/containers/WAV.cpp\" />\n\t\t<file name=\"src/system/CFFI.cpp\" />\n\t\t<file name=\"src/system/CFFIPointer.cpp\" />\n\t\t<file name=\"src/system/ClipboardEvent.cpp\" />\n\t\t<file name=\"src/system/Display.mm\" if=\"mac || ios\" />\n\t\t<file name=\"src/system/Display.cpp\" unless=\"mac || ios\" />\n\t\t<file name=\"src/system/DisplayMode.cpp\" />\n\t\t<file name=\"src/system/JNI.cpp\" if=\"android\" />\n\t\t<file name=\"src/system/Locale.cpp\" unless=\"mac || ios\" />\n\t\t<file name=\"src/system/Locale.mm\" if=\"mac || ios\" />\n\t\t<file name=\"src/system/OrientationEvent.cpp\" />\n\t\t<file name=\"src/system/SensorEvent.cpp\" />\n\t\t<file name=\"src/system/System.cpp\" unless=\"ios\" />\n\t\t<file name=\"src/system/System.mm\" if=\"ios\" />\n\t\t<file name=\"src/system/ValuePointer.cpp\" />\n\t\t<file name=\"src/ui/DropEvent.cpp\" />\n\t\t<file name=\"src/ui/GamepadEvent.cpp\" />\n\t\t<file name=\"src/ui/Haptic.mm\" if=\"ios\" />\n\t\t<file name=\"src/ui/JoystickEvent.cpp\" />\n\t\t<file name=\"src/ui/KeyEvent.cpp\" />\n\t\t<file name=\"src/ui/MouseEvent.cpp\" />\n\t\t<file name=\"src/ui/TextEvent.cpp\" />\n\t\t<file name=\"src/ui/TouchEvent.cpp\" />\n\t\t<file name=\"src/ui/WindowEvent.cpp\" />\n\t\t<file name=\"src/utils/ArrayBufferView.cpp\" />\n\t\t<file name=\"src/utils/Bytes.cpp\" />\n\n\t</files>\n\n\t<files id=\"android-cpufeatures\">\n\n\t\t<compilerflag value=\"-I${ANDROID_NDK_ROOT}/sources/android/cpufeatures\" if=\"android\" />\n\t\t<file name=\"${ANDROID_NDK_ROOT}/sources/android/cpufeatures/cpu-features.c\" />\n\n\t</files>\n\n\t<!-- Run setup now so the submodule projects can determine whether clang or GCC will be used. -->\n\t<!-- TODO: if https://github.com/HaxeFoundation/hxcpp/issues/930 ever gets resolved, use that instead. -->\n\t<setup name=\"androidNdk\" if=\"android\" />\n\n\t<include name=\"lib/cairo-files.xml\" />\n\t<include name=\"lib/curl-files.xml\" />\n\t<include name=\"lib/efsw-files.xml\" />\n\t<include name=\"lib/faudio-files.xml\" if=\"LIME_FAUDIO\" />\n\t<include name=\"lib/freetype-files.xml\" />\n\t<include name=\"lib/harfbuzz-files.xml\" />\n\t<include name=\"lib/jpeg-files.xml\" />\n\t<include name=\"lib/lzma-files.xml\" />\n\t<include name=\"lib/mbedtls-files.xml\" />\n\t<include name=\"lib/mojoal-files.xml\" />\n\t<include name=\"lib/neko-files.xml\" />\n\t<include name=\"lib/ogg-files.xml\" />\n\t<include name=\"lib/openal-files.xml\" />\n\t<include name=\"lib/pixman-files.xml\" />\n\t<include name=\"lib/png-files.xml\" />\n\t<include name=\"lib/sdl-files.xml\" />\n\t<include name=\"lib/tinyfiledialogs-files.xml\" />\n\t<include name=\"lib/vorbis-files.xml\" />\n\t<include name=\"lib/vpx-files.xml\" />\n\t<include name=\"lib/webm-files.xml\" />\n\t<include name=\"lib/zlib-files.xml\" />\n\n\t<set name=\"DEBUGEXTRA\" value=\"-debug\" if=\"fulldebug\" />\n\t<set name=\"LIBSUFFIX\" value=\"${HX_TARGET_SUFFIX}\" if=\"HX_TARGET_SUFFIX\" />\n\t<set name=\"LIBSUFFIX\" value=\"${LIBEXTRA}\" unless=\"LIBSUFFIX\" />\n\n\t<target id=\"lime\" output=\"${LIBPREFIX}lime${DEBUGEXTRA}${LIBSUFFIX}\" tool=\"linker\" toolid=\"${STD_MODULE_LINK}\">\n\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\n\t\t<files id=\"lime\" />\n\t\t<files id=\"android-cpufeatures\" if=\"android\" />\n\n\t\t<files id=\"native-toolkit-cairo\" if=\"LIME_CAIRO\" />\n\t\t<files id=\"native-toolkit-curl\" if=\"LIME_CURL\" />\n\t\t<files id=\"native-toolkit-efsw\" if=\"LIME_EFSW\" />\n\t\t<files id=\"native-toolkit-faudio\" if=\"LIME_FAUDIO\" />\n\t\t<files id=\"native-toolkit-freetype\" if=\"LIME_FREETYPE\" />\n\t\t<files id=\"native-toolkit-harfbuzz\" if=\"LIME_HARFBUZZ\" />\n\t\t<files id=\"native-toolkit-jpeg\" if=\"LIME_JPEG\" />\n\t\t<files id=\"native-toolkit-lzma\" if=\"LIME_LZMA\" />\n\t\t<files id=\"native-toolkit-mbedtls\" if=\"LIME_MBEDTLS\" unless=\"static_link\" />\n\t\t<files id=\"native-toolkit-mojoal\" if=\"LIME_MOJOAL\" />\n\t\t<files id=\"native-toolkit-neko\" if=\"LIME_NEKO\" />\n\t\t<files id=\"native-toolkit-ogg\" if=\"LIME_OGG\" />\n\t\t<files id=\"native-toolkit-openal\" if=\"LIME_OPENALSOFT\" />\n\t\t<files id=\"native-toolkit-pixman\" if=\"LIME_PIXMAN\" />\n\t\t<files id=\"native-toolkit-png\" if=\"LIME_PNG\" />\n\t\t<files id=\"native-toolkit-sdl\" if=\"LIME_SDL\" unless=\"emscripten\" />\n\t\t<files id=\"native-toolkit-tinyfiledialogs\" if=\"LIME_TINYFILEDIALOGS\" />\n\t\t<files id=\"native-toolkit-vorbis\" if=\"LIME_VORBIS\" />\n\t\t<files id=\"native-toolkit-vpx\" if=\"LIME_VPX\" />\n\t\t<files id=\"native-toolkit-webm\" if=\"LIME_WEBM\" />\n\t\t<files id=\"native-toolkit-zlib\" if=\"LIME_ZLIB\" />\n\n\t\t<section unless=\"static_link\">\n\n\t\t\t<ext value=\".so\" />\n\t\t\t<ext value=\".ndll\" if=\"windows || mac || linux\" />\n\n\t\t\t<!-- TODO: Support single binary -->\n\t\t\t<ext value=\".hdll\" if=\"LIME_HASHLINK\" />\n\n\t\t\t<section if=\"windows\">\n\n\t\t\t\t<lib name=\"gdi32.lib\" />\n\t\t\t\t<lib name=\"opengl32.lib\" />\n\t\t\t\t<lib name=\"user32.lib\" />\n\t\t\t\t<lib name=\"kernel32.lib\" />\n\t\t\t\t<lib name=\"advapi32.lib\" />\n\t\t\t\t<lib name=\"winmm.lib\" />\n\t\t\t\t<lib name=\"imm32.lib\" />\n\t\t\t\t<lib name=\"ole32.lib\" />\n\t\t\t\t<lib name=\"oleaut32.lib\" />\n\t\t\t\t<lib name=\"version.lib\" />\n\t\t\t\t<lib name=\"ws2_32.lib\" />\n\t\t\t\t<lib name=\"wldap32.lib\" />\n\t\t\t\t<lib name=\"shell32.lib\" />\n\t\t\t\t<lib name=\"comdlg32.lib\" />\n\t\t\t\t<lib name=\"setupapi.lib\" />\n\n\t\t\t\t<lib name=\"bcrypt.lib\" if=\"LIME_CURL\" />\n\n\t\t\t\t<lib name=\"usp10.lib\" if=\"LIME_HARFBUZZ\" />\n\t\t\t\t<lib name=\"rpcrt4.lib\" if=\"LIME_HARFBUZZ\" />\n\t\t\t\t<lib name=\"dwrite.lib\" if=\"LIME_HARFBUZZ\" />\n\n\t\t\t\t<lib name=\"comsuppw.lib\" unless=\"winrt || mingw\" />\n\t\t\t\t<lib name=\"wbemuuid.lib\" />\n\n\t\t\t\t<lib name=\"D3D11.lib\" if=\"winrt\" />\n\t\t\t\t<lib name=\"RuntimeObject.lib\" if=\"winrt\" />\n\t\t\t\t<lib name=\"Xinput.lib\" if=\"winrt\" />\n\t\t\t\t<lib name=\"DXGI.lib\" if=\"winrt\" />\n\n\t\t\t\t<lib name=\"-libpath:../templates/bin/hl/${BINDIR}\" if=\"LIME_HASHLINK\" />\n\t\t\t\t<lib name=\"libhl.lib\" if=\"LIME_HASHLINK\" />\n\t\t\t\t<!-- <lib name=\"-delayload:libhl.dll\" /> -->\n\n\t\t\t</section>\n\n\t\t\t<section if=\"linux\">\n\n\t\t\t\t<lib name=\"-lpthread\" />\n\t\t\t\t<lib name=\"-lrt\" />\n\n\t\t\t\t<lib name=\"-lgc\" if=\"LIME_NEKO\" />\n\t\t\t\t<lib name=\"-lm\" if=\"LIME_NEKO\" />\n\n\t\t\t\t<lib name=\"-L../templates/bin/hl/${BINDIR}\" if=\"LIME_HASHLINK\" />\n\t\t\t\t<lib name=\"-lhl\" if=\"LIME_HASHLINK\" />\n\n\t\t\t</section>\n\n\t\t\t<section if=\"mac\">\n\t\t\t\t<vflag name=\"-install_name\" value=\"@executable_path/lime.hdll\" if=\"LIME_HASHLINK\"/>\n\t\t\t\t<!--\n\t\t\t\t\tstarting in xcode 15, rpath doesn't automatically include\n\t\t\t\t\t/usr/local/lib, but we need it for neko\n\t\t\t\t-->\n\t\t\t\t<vflag name=\"-rpath\" value=\"/usr/local/lib\" />\n\t\t\t\t<vflag name=\"-rpath\" value=\"/opt/homebrew/lib\" if=\"HXCPP_ARM64\"/>\n\n\t\t\t\t<vflag name=\"-l\" value=\"iconv\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"IOKit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"Foundation\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AppKit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AudioToolbox\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AudioUnit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"Carbon\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"Cocoa\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreAudio\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreVideo\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"ForceFeedback\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"OpenAL\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"OpenGL\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"SystemConfiguration\" />\n\n\t\t\t\t<lib name=\"/opt/local/lib/libgc.a\" if=\"LIME_NEKO\" />\n\t\t\t\t<lib name=\"-lm\" if=\"LIME_NEKO\" />\n\n\t\t\t\t<lib name=\"-L../templates/bin/hl/${BINDIR}\" if=\"LIME_HASHLINK\" />\n\t\t\t\t<lib name=\"-lhl\" if=\"LIME_HASHLINK\" />\n\n\t\t\t</section>\n\n\t\t\t<section if=\"android\">\n\n\t\t\t\t<lib name=\"-L../ndll/Android\" />\n\n\t\t\t\t<lib name=\"-ldl\" />\n\t\t\t\t<lib name=\"-llog\" />\n\t\t\t\t<lib name=\"-landroid\" />\n\t\t\t\t<lib name=\"-lm\" />\n\t\t\t\t<lib name=\"-lEGL\" />\n\t\t\t\t<lib name=\"-lGLESv2\" />\n\t\t\t\t<lib name=\"-lGLESv1_CM\" />\n\t\t\t\t<lib name=\"-lOpenSLES\" />\n\n\t\t\t</section>\n\n\t\t\t<section if=\"rpi\">\n\n\t\t\t\t<lib name=\"-ldl\" />\n\t\t\t\t<lib name=\"-ldrm\" />\n\t\t\t\t<lib name=\"-lm\" />\n\t\t\t\t<lib name=\"-lEGL\" />\n\t\t\t\t<lib name=\"-lGLESv2\" />\n\n\t\t\t</section>\n\n\t\t\t<section if=\"tvos\">\n\n\t\t\t\t<vflag name=\"-framework\" value=\"UIKit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"Foundation\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AudioToolbox\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AudioUnit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreAudio\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreVideo\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"GameController\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"OpenAL\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"OpenGLES\" />\n\t\t\t\t<!-- <vflag name=\"-framework\" value=\"CoreBluetooth\" /> -->\n\n\t\t\t\t<lib name=\"-ldl\" />\n\t\t\t\t<lib name=\"-lEGL\" />\n\t\t\t\t<lib name=\"-lGLESv3\" />\n\n\t\t\t</section>\n\n\t\t\t<section if=\"ios\">\n\n\t\t\t\t<vflag name=\"-framework\" value=\"UIKit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"Foundation\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AudioToolbox\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"AudioUnit\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreAudio\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreMotion\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreText\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"CoreVideo\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"OpenAL\" />\n\t\t\t\t<vflag name=\"-framework\" value=\"OpenGLES\" />\n\t\t\t\t<!-- <vflag name=\"-framework\" value=\"CoreBluetooth\" /> -->\n\n\t\t\t\t<lib name=\"-ldl\" />\n\t\t\t\t<lib name=\"-lEGL\" />\n\t\t\t\t<lib name=\"-lGLESv3\" />\n\n\t\t\t</section>\n\n\t\t</section>\n\n\t</target>\n\n\t<include name=\"../legacy/project/Build.xml\" if=\"lime-legacy\" />\n\n\t<target id=\"default\">\n\n\t\t<target id=\"lime\" unless=\"lime-legacy\" />\n\t\t<target id=\"lime-legacy\" if=\"lime-legacy\" />\n\n\t</target>\n\t<copyFile name=\"lime.lib\" from=\"obj/lib/\" overwrite=\"true\" toolId=\"dll\" if=\"windows LIME_HASHLINK\" />\n\n</xml>\n"
  },
  {
    "path": "project/BuildHashlink.xml",
    "content": "<xml>\n\t<error value=\"HashLink not supported on ARM\" if=\"rpi || HXCPP_ARM64\"/>\n\n\t<set name=\"PLATFORM\" value=\"android-21\" if=\"android\" />\n\t<set name=\"HXCPP_CPP11\" value=\"1\" />\n\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\" />\n\n\t<set name=\"ios\" value=\"1\" if=\"iphone\" />\n\t<set name=\"tvos\" value=\"1\" if=\"appletv\" />\n\n\t<set name=\"NATIVE_TOOLKIT_PATH\" value=\"lib\" unless=\"NATIVE_TOOLKIT_PATH\"/>\n\t<set name=\"HASHLINK_PATH\" value=\"lib/hashlink\" unless=\"HASHLINK_PATH\" />\n\n\t<include name=\"lib/mbedtls-files.xml\"/>\n\n\t<files id=\"hl\">\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\n\t\t<file name=\"src/hashlink_main.c\" tag=\"main\"/>\n\t\t<file name=\"${HASHLINK_PATH}/src/code.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/debugger.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/jit.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/main.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/module.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/profile.c\" />\n\t</files>\n\n\t<files id=\"libhl\">\n\t\t<compilerflag value=\"-std=c11\" unless=\"windows\" />\n\t\t<compilerflag value=\"-DLIBHL_EXPORTS\" />\n\t\t<compilerflag value=\"-DHAVE_CONFIG_H\" />\n\t\t<compilerflag value=\"-DPCRE2_CODE_UNIT_WIDTH=16\" />\n\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include\" />\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/pcre\" />\n\n\t\t<file name=\"${HASHLINK_PATH}/src/gc.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/array.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/bytes.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/date.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/error.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/fun.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/obj.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/random.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/socket.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/string.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/sys.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/thread.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/types.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/buffer.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/cast.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/debug.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/file.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/maps.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/math.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/process.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/regexp.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/sys_android.c\" if=\"android\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/sys_ios.m \" if=\"ios\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/track.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/src/std/ucs2.c\" />\n\n\t\t<!-- PCRE -->\n\t\t <file name=\"${HASHLINK_PATH}/include/pcre/pcre2_auto_possess.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_chartables.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_compile.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_config.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_context.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_convert.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_dfa_match.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_error.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_extuni.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_find_bracket.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_jit_compile.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_maketables.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_match.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_match_data.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_newline.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_ord2utf.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_pattern_info.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_script_run.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_serialize.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_string_utils.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_study.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_substitute.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_substring.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_tables.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_ucd.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_ucptables.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_valid_utf.c\"/>\n\t\t<file name=\"${HASHLINK_PATH}/include/pcre/pcre2_xclass.c\"/>\n\n\t\t<!-- macOS debugging -->\n\t\t<file name=\"${HASHLINK_PATH}/include/mdbg/mdbg.c\" if=\"mac\" />\n\t\t<file name=\"${HASHLINK_PATH}/include/mdbg/mach_excServer.c\" if=\"mac\" />\n\t\t<file name=\"${HASHLINK_PATH}/include/mdbg/mach_excUser.c\" if=\"mac\" />\n\t</files>\n\n\t<files id=\"ssl\">\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/hl-ssl\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/mbedtls/include\" />\n\t\t<compilerflag value=\"-D_UNICODE\" if=\"windows\"/>\n\t\t<compilerflag value=\"-DUNICODE\" if=\"windows\"/>\n\t\t<compilerflag value=\"-DMBEDTLS_THREADING_C\"/>\n\t\t<compilerflag value=\"-DMBEDTLS_THREADING_PTHREAD\" unless=\"windows\"/>\n\t\t<compilerflag value=\"-DMBEDTLS_THREADING_ALT\" if=\"windows\"/>\n\t\t<compilerflag value=\"/std:c11\" if=\"windows\"/>\n\t\t<file name=\"${HASHLINK_PATH}/libs/ssl/ssl.c\" />\n\t</files>\n\n\t<files id=\"mysql\">\n\t\t<compilerflag value=\"-std=gnu17\" unless=\"windows\" />\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\t\t<compilerflag value=\"-I/usr/local/include\" if=\"mac\"/>\n\n\t\t<file name=\"${HASHLINK_PATH}/libs/mysql/socket.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/mysql/sha1.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/mysql/my_proto.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/mysql/my_api.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/mysql/mysql.c\" />\n\t</files>\n\n\t<files id=\"fmt\">\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/mikktspace\" />\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/minimp3\" />\n\t\t<compilerflag value=\"-I/usr/local/include\" if=\"mac\"/>\n\t\t<compilerflag value=\"-I/usr/local/opt/libjpeg-turbo/include\" if=\"mac\"/>\n\t\t<compilerflag value=\"-I/usr/local/opt/jpeg-turbo/include\" if=\"mac\"/>\n\t\t<compilerflag value=\"-I/usr/local/opt/libvorbis/include\" if=\"mac\"/>\n\n\n\t\t<file name=\"${HASHLINK_PATH}/libs/fmt/fmt.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/fmt/sha1.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/fmt/dxt.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/fmt/mikkt.c\" />\n\t\t<file name=\"${HASHLINK_PATH}/include/mikktspace/mikktspace.c\" />\n\t\t<section if=\"windows\">\n\t\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/png\"/>\n\t\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/turbojpeg\"/>\n\t\t\t<!-- TODO: arm64 windows -->\n\t\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/turbojpeg/x64\"/>\n\n\t\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/zlib\"/>\n\t\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/vorbis\"/>\n\n\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/png.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngerror.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngget.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngmem.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngpread.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngread.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngrio.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngrtran.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngrutil.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngset.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngtrans.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngwio.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngwrite.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngwtran.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/png/pngwutil.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jaricom.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcapimin.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcapistd.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcarith.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jccoefct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jccolor.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcdctmgr.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jchuff.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcinit.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcmainct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcmarker.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcmaster.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcomapi.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcparam.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcphuff.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcprepct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jcsample.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jctrans.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdapimin.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdapistd.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdarith.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdatadst-tj.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdatadst.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdatasrc-tj.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdatasrc.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdcoefct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdcolor.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jddctmgr.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdhuff.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdinput.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdmainct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdmarker.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdmaster.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdmerge.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdphuff.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdpostct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdsample.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jdtrans.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jerror.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jfdctflt.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jfdctfst.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jfdctint.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jidctflt.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jidctfst.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jidctint.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jidctred.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jmemmgr.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jmemnobs.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jquant1.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jquant2.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jsimd.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/jutils.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/transupp.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/turbojpeg/turbojpeg.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/adler32.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/crc32.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/deflate.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/inffast.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/inflate.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/inftrees.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/trees.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/zlib/zutil.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/bitrate.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/bitwise.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/block.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/codebook.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/envelope.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/floor0.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/floor1.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/framing.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/info.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/lookup.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/lpc.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/lsp.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/mapping0.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/mdct.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/psy.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/registry.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/res0.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/sharedbook.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/smallft.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/synthesis.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/vorbisfile.c\" />\n\t\t\t<file name=\"${HASHLINK_PATH}/include/vorbis/window.c\" />\n\t\t</section>\n\t</files>\n\t<files id=\"ui\">\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\n\t\t<file name=\"${HASHLINK_PATH}/libs/ui/ui_stub.c\" unless=\"windows\" />\n\t\t<file name=\"${HASHLINK_PATH}/libs/ui/ui_win.c\" if=\"windows\" />\n\t</files>\n\t<files id=\"uv\">\n\t\t<compilerflag value=\"-I${HASHLINK_PATH}/src\" />\n\t\t<compilerflag value=\"-I/usr/local/include\" if=\"mac\"/>\n\n\t\t<file name=\"${HASHLINK_PATH}/libs/uv/uv.c\"/>\n\n\t\t<section if=\"windows\">\n\t\t\t<compilerflag value=\"-I${HASHLINK_PATH}/include/libuv/include\"/>\n\t\t\t<compilerflag value=\"-DUV_EXPORTS\"/>\n\t\t\t<compilerflag value=\"-DBUILDING_UV_SHARED\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/fs-poll.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/inet.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/threadpool.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/uv-common.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/version.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/async.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/core.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/dl.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/error.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/fs-event.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/fs.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/getaddrinfo.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/getnameinfo.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/handle.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/loop-watcher.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/pipe.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/poll.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/process-stdio.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/process.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/req.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/signal.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/snprintf.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/stream.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/tcp.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/thread.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/timer.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/tty.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/udp.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/util.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/winapi.c\"/>\n\t\t\t<file name=\"${HASHLINK_PATH}/include/libuv/src/win/winsock.c\"/>\n\t\t</section>\n\t</files>\n\t<set name=\"LIBSUFFIX\" value=\"dll\" if=\"windows\" />\n\t<set name=\"LIBSUFFIX\" value=\"dylib\" if=\"mac || ios || tvos\" />\n\t<set name=\"LIBSUFFIX\" value=\"so\" unless=\"LIBSUFFIX\" />\n\t<!-- <set name=\"BINDIR\" value=\"linux\" if=\"linux\" />\n\t<set name=\"BINDIR\" value=\"mac\" if=\"mac\" />\n\t<set name=\"BINDIR\" value=\"windows\" if=\"windows\" /> -->\n\n\t<set name=\"OUTPUT_DIR\" value=\"../templates/bin/hl\" unless=\"OUTPUT_DIR\" />\n\n\t<target id=\"libhl\" output=\"libhl\" tool=\"linker\" toolid=\"dll\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<files id=\"libhl\" />\n\t\t<ext value=\".${LIBSUFFIX}\" />\n\n\t\t<vflag name=\"-install_name\" value=\"@executable_path/libhl.dylib\" if=\"mac\"/>\n\t\t<lib name=\"-pthread\" if=\"linux\" />\n\n\t\t<section if=\"windows\">\n\t\t\t<lib name=\"user32.lib\" />\n\t\t\t<lib name=\"ws2_32.lib\" />\n\t\t</section>\n\t</target>\n\n\t<target id=\"ssl\" output=\"ssl\" tool=\"linker\" toolid=\"dll\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<ext value=\".hdll\" />\n\t\t<files id=\"ssl\" />\n\t\t<files id=\"native-toolkit-mbedtls\"/>\n\n\t\t<vflag name=\"-install_name\" value=\"@executable_path/ssl.hdll\" if=\"mac\"/>\n\n\t\t<lib name=\"-lhl\" unless=\"windows\" />\n\t\t<lib name=\"-L${OUTPUT_DIR}/${BINDIR}\" unless=\"windows\" />\n\t\t<lib name=\"-libpath:${OUTPUT_DIR}/${BINDIR}\" if=\"windows\" />\n\t\t<lib name=\"libhl.lib\" if=\"windows\" />\n\n\t\t<lib name=\"Advapi32.lib\" if=\"windows\" />\n\t\t<lib name=\"Crypt32.lib\" if=\"windows\" />\n\t\t<lib name=\"ws2_32.lib\" if=\"windows\" />\n\n\t\t<vflag name=\"-framework\" value=\"Security\" if=\"mac || ios || tvos\" />\n\t\t<vflag name=\"-framework\" value=\"CoreFoundation\" if=\"mac || ios || tvos\" />\n\t</target>\n\n\t<target id=\"mysql\" output=\"mysql\" tool=\"linker\" toolid=\"dll\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<ext value=\".hdll\" />\n\t\t<files id=\"mysql\" />\n\n\t\t<vflag name=\"-install_name\" value=\"@executable_path/mysql.hdll\" if=\"mac\"/>\n\n\t\t<lib name=\"-lhl\" unless=\"windows\" />\n\t\t<lib name=\"-L${OUTPUT_DIR}/${BINDIR}\" unless=\"windows\" />\n\t\t<lib name=\"-libpath:${OUTPUT_DIR}/${BINDIR}\" if=\"windows\" />\n\t\t<lib name=\"libhl.lib\" if=\"windows\" />\n\t\t<lib name=\"ws2_32.lib\" if=\"windows\" />\n\t</target>\n\n\t<target id=\"fmt\" output=\"fmt\" tool=\"linker\" toolid=\"dll\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<ext value=\".hdll\" />\n\t\t<files id=\"fmt\" />\n\n\t\t<vflag name=\"-install_name\" value=\"@executable_path/fmt.hdll\" if=\"mac\"/>\n\n\t\t<lib name=\"-L/usr/local/lib\" if=\"mac\" />\n\t\t<lib name=\"-L/usr/local/opt/libjpeg-turbo/lib\" if=\"mac\" />\n\t\t<lib name=\"-L/usr/local/opt/jpeg-turbo/lib\" if=\"mac\" />\n\t\t<lib name=\"-L/usr/local/opt/libvorbis/lib\" if=\"mac\" />\n\n\t\t<lib name=\"-lz\" unless=\"windows\" />\n\t\t<lib name=\"-lvorbis\" unless=\"windows\" />\n\t\t<lib name=\"-lvorbisfile\" unless=\"windows\" />\n\t\t<lib name=\"-lpng\" unless=\"windows\" />\n\n\t\t<lib name=\"-lturbojpeg\" unless=\"windows\" />\n\n\t\t<lib name=\"-lhl\" unless=\"windows\" />\n\t\t<lib name=\"-L${OUTPUT_DIR}/${BINDIR}\" unless=\"windows\" />\n\t\t<lib name=\"-libpath:${OUTPUT_DIR}/${BINDIR}\" if=\"windows\" />\n\t\t<lib name=\"libhl.lib\" if=\"windows\" />\n\t\t<lib name=\"${HASHLINK_PATH}/include/turbojpeg/x64/simd.lib\" if=\"windows HXCPP_M64\"/>\n\t\t<lib name=\"${HASHLINK_PATH}/include/turbojpeg/x86/simd.lib\" if=\"windows\" unless=\"HXCPP_M64\"/>\n\t</target>\n\n\t<target id=\"ui\" output=\"ui\" tool=\"linker\" toolid=\"dll\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<ext value=\".hdll\" />\n\t\t<files id=\"ui\" />\n\n\t\t<vflag name=\"-install_name\" value=\"@executable_path/ui.hdll\" if=\"mac\"/>\n\n\t\t<lib name=\"-lhl\" unless=\"windows\" />\n\t\t<lib name=\"-L${OUTPUT_DIR}/${BINDIR}\" unless=\"windows\" />\n\t\t<section if=\"windows\">\n\t\t\t<lib name=\"-libpath:${OUTPUT_DIR}/${BINDIR}\" />\n\t\t\t<lib name=\"libhl.lib\" />\n\t\t\t<lib name=\"user32.lib\"/>\n\t\t\t<lib name=\"gdi32.lib\" />\n\t\t\t<lib name=\"comdlg32.lib\" />\n\t\t</section>\n\t</target>\n\n\t<target id=\"uv\" output=\"uv\" tool=\"linker\" toolid=\"dll\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<ext value=\".hdll\" />\n\t\t<files id=\"uv\" />\n\n\t\t<vflag name=\"-install_name\" value=\"@executable_path/uv.hdll\" if=\"mac\"/>\n\n\t\t<lib name=\"-L/usr/local/lib\" if=\"mac\" />\n\n\t\t<lib name=\"-luv\" unless=\"windows\" />\n\t\t<lib name=\"-lhl\" unless=\"windows\" />\n\t\t<lib name=\"-L${OUTPUT_DIR}/${BINDIR}\" unless=\"windows\" />\n\t\t<section if=\"windows\">\n\t\t\t<lib name=\"-libpath:${OUTPUT_DIR}/${BINDIR}\" />\n\t\t\t<lib name=\"libhl.lib\" />\n\t\t\t<lib name=\"psapi.lib\"/>\n\t\t\t<lib name=\"iphlpapi.lib\" />\n\t\t\t<lib name=\"userenv.lib\" />\n\t\t\t<lib name=\"advapi32.lib\" if=\"windows\" />\n\t\t\t<lib name=\"ws2_32.lib\" if=\"windows\" />\n\t\t</section>\n\t</target>\n\n\t<target id=\"hl\" output=\"hl\" tool=\"linker\" toolid=\"exe\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\t\t<files id=\"hl\" />\n\n\t\t<lib name=\"-pthread\" if=\"linux\" />\n\n\t\t<!-- Make hashlink pick up binaries in the same directory as itself -->\n\t\t<lib name=\"-Wl,-rpath=$ORIGIN\" if=\"linux\" />\n\n\t\t<lib name=\"-lhl\" unless=\"windows\" />\n\t\t<lib name=\"-L${OUTPUT_DIR}/${BINDIR}\" unless=\"windows\" />\n\t\t<lib name=\"-libpath:${OUTPUT_DIR}/${BINDIR}\" if=\"windows\" />\n\t\t<lib name=\"libhl.lib\" if=\"windows\" />\n\t</target>\n\n\t<target id=\"default\">\n\t\t<outdir name=\"${OUTPUT_DIR}/${BINDIR}\" />\n\n\t\t<target id=\"libhl\" />\n\t\t<target id=\"ssl\" />\n\t\t<target id=\"mysql\" />\n\t\t<target id=\"hl\" />\n\t\t<target id=\"fmt\"/>\n\t\t<target id=\"ui\"/>\n\t\t<target id=\"uv\"/>\n\t</target>\n\n\t<copyFile name=\"libhl.lib\" from=\"obj/lib/\" overwrite=\"true\" toolId=\"dll\" if=\"windows\" />\n\t<copyFile name=\"ssl.lib\" from=\"obj/lib/\" allowMissing=\"true\" overwrite=\"true\" toolid=\"dll\" if=\"windows\" />\n\t<copyFile name=\"mysql.lib\" from=\"obj/lib/\" allowMissing=\"true\" overwrite=\"true\" toolId=\"dll\" if=\"windows\" />\n\t<copyFile name=\"fmt.lib\" from=\"obj/lib/\" allowMissing=\"true\" overwrite=\"true\" toolId=\"dll\" if=\"windows\" />\n\t<copyFile name=\"ui.lib\" from=\"obj/lib/\" allowMissing=\"true\" overwrite=\"true\" toolId=\"dll\" if=\"windows\" />\n\t<copyFile name=\"uv.lib\" from=\"obj/lib/\" allowMissing=\"true\" overwrite=\"true\" toolId=\"dll\" if=\"windows\" />\n</xml>"
  },
  {
    "path": "project/README.md",
    "content": "# C++ backend project\nLime uses this C/C++ code to build reusable binaries for native targets, stored in the [ndll directory](https://github.com/openfl/lime/tree/develop/ndll). Binaries for common targets are included in the Haxelib download, so you won't need to build those yourself unless you make changes.\n\nTip: if you install Lime from Git, you can still copy the ndlls from Lime's latest Haxelib release.\n\n## Project overview\nThis directory contains two categories of code.\n\n- Lime-specific headers and source files can be found under [include](include) and [src](src), respectively. [`ExternalInterface`](src/ExternalInterface.cpp) serves as the entry point into this code.\n- [Submodules](#submodule-projects) such as Cairo, SDL, and OpenAL can be found under [lib](lib).\n\n### Prerequisites\n\n- All platforms require [hxcpp](https://lib.haxe.org/p/hxcpp/).\n- Windows requires [Visual Studio C++ components](https://visualstudio.microsoft.com/vs/features/cplusplus/).\n- Mac requires [Xcode](https://developer.apple.com/xcode/).\n- Linux requires several packages (names may vary per distro).\n   - Ubunutu requires the following packages.\n\n      ```bash\n      sudo apt install libgl1-mesa-dev libglu1-mesa-dev g++ g++-multilib gcc-multilib libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev\n      ```\n   - While Raspberry Pi OS also uses `apt`, it requires a slightly different set of packages.\n\n      ```bash\n      sudo apt install libgl1-mesa-dev libglu1-mesa-dev g++ libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libxcursor-dev libdbus-1-dev libdrm-dev libgbm-dev libudev-dev\n      ```\n   - Fedora requires the following packages.\n\n      ```bash\n      sudo dnf install g++ glibc-devel.x86_64 libstdc++-devel.x86_64 glibc-devel.i686 libstdc++-devel.i686 alsa-lib-devel pulseaudio-libs-devel libX11-devel libXi-devel libXrandr-devel libglvnd-devel\n      ```\n- Building HashLink requires [additional packages](https://github.com/HaxeFoundation/hashlink#readme).\n\n### Rebuilding\nUse `lime rebuild <target>` to build or rebuild a set of binaries. Once finished, you can find them in the [ndll directory](https://github.com/openfl/lime/tree/develop/ndll).\n\n```bash\nlime rebuild windows #Recompile the Windows binary (lime.ndll).\nlime rebuild android -clean #Compile the Android binaries (liblime-##.so) from scratch, even if no changes are detected.\nlime rebuild mac -64 #Recompile only the x86-64 binary (lime.ndll) for Mac.\nlime rebuild hl #Recompile the HashLink binaries (lime.hdll and others).\n```\n\nSee `lime help rebuild` for details and additional options.\n\n> Note: even without an explicit `rebuild` command, running `lime` will automatically build lime.ndll for your machine. Even if you never target C++ or Neko, this binary will help with small tasks such as rendering icons.\n\n### Build troubleshooting\nIf errors appeared after updating Lime, the update process may not be complete. Run these commands:\n\n```bash\ngit submodule init\ngit submodule sync\ngit submodule update\nlime rebuild tools\n```\n\nFor errors that appeared after changing a source file, you may need to update the build configuration.\n\n- Errors in the [src](src) and [include](include) directories usually require updating [Build.xml](Build.xml).\n- Errors in the [lib](lib) directory usually require updating that submodule's xml file. So for instance, if the error message points to lib/cairo/src/cairo.c, you most likely need to edit [cairo-files.xml](lib/cairo-files.xml). If the error message points to lib/hashlink/src/main.c, look at [BuildHashlink.xml](BuildHashlink.xml). (Though libraries do reference one another sometimes, so this isn't a hard rule.)\n\nCommon errors and their solutions:\n\n- `[header].h: No such file or directory`: Include the header if it exists. If not, run `git status` to confirm that your submodules are up to date.\n\n   ```xml\n   <compilerflag value=\"-Iinclude/path/to/header/\" />\n   <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/path/to/another/header/\" />\n   ```\n\n- `undefined reference to [symbol]`: Locate the source file that defines the symbol, then add it.\n\n   ```xml\n   <file name=\"src/path/to/file.cpp\"/>\n   <file name=\"${NATIVE_TOOLKIT_PATH}/path/to/anotherfile.c\"/>\n   ```\n\n- `'std::istringstream' has no member named 'swap'`: Your Android NDK is out of date; switch to version 20 or higher. (Version 21 recommended.)\n\nSee also [submodule troubleshooting](#submodule-troubleshooting).\n\n## Submodule projects\nLime includes code from several other C/C++ libraries, each of which is treated as a [submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules). For more information on the individual libraries, see [lib/README.md](lib/README.md).\n\n### Custom headers and source files\nAll submodules are used as-is, meaning Lime never modifies the contents of the submodule folder. When Lime needs to modify or add a file, the file goes in [lib/custom](lib/custom).\n\nCaution: overriding a file requires extra maintenance. Always try to find a different solution first. lib/custom should contain as few files as possible.\n\n### Updating a submodule\nSubmodules are Git repositories in their own right, and are typically kept in \"detached HEAD\" state. Lime never modifies its submodules directly, but instead changes which commit the HEAD points to.\n\nTo update to a more recent version of a submodule:\n\n1. Open the project's primary repo or GitHub mirror.\n2. Browse the tags until you find the version you wish to update to. (Or browse commits, but that's discouraged.)\n3. Copy the commit ID for your chosen version.\n4. Open your local submodule folder on the command line. (From here, any `git` commands will affect the submodule instead of Lime.)\n5. Update the library:\n\n   ```bash\n   $ git checkout [commit ID]\n   Previous HEAD position was [old commit ID] [old commit message]\n   HEAD is now at [commit ID] [commit message]\n   ```\n\n   If you get a \"reference is not a tree\" error, run `git fetch --unshallow`, then try again. (Lime downloads submodules in \"shallow\" mode to save time and space, and not all commits are fetched until you explicitly fetch them.)\n6. If you exit the submodule and run `git status`, you'll find an unstaged change representing the update. Once you [finish testing](#rebuilding), you can commit this change and submit it as a pull request.\n\n### Submodule troubleshooting\nHere are some submodule-specific problems you might run into while rebuilding.\n\n- The project is missing a crucial header file, or has `[header].h.in` instead of the header you need:\n\n   1. Look for an `autogen.sh` file. If it exists, run it. (On Windows, you may need [WSL](https://docs.microsoft.com/en-us/windows/wsl/about), or you might be able to find a .bat file that does what you need.)\n   2. If step 1 fails, look for instructions on how to configure the project. This will often involving using `make`, `cmake`, and/or `./configure`. (Again, Windows users may need WSL.)\n   3. One of the above steps should hopefully generate the missing header. Place the generated file inside [the custom folder](#custom-headers-and-source-files).\n\n- The compiler uses the submodule's original header instead of Lime's custom header:\n\n   1. Make sure the custom folder is included first.\n\n      ```xml\n      <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/src/\" />\n      <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/cairo/src/\" />\n      ```\n\n   2. If the header is in the same directory as the corresponding source files, you cannot override it. Try setting compiler flags to get the result you want, or look for a different file to override.\n\n      ```xml\n      <compilerflag value=\"-DDISABLE_FEATURE\" />\n      <compilerflag value=\"-DENABLE_OTHER_FEATURE\" />\n      ```\n\n   3. Approach the problem from a different angle. Upgrade or downgrade the submodule, or open an issue.\n"
  },
  {
    "path": "project/include/app/Application.h",
    "content": "#ifndef LIME_APP_APPLICATION_H\n#define LIME_APP_APPLICATION_H\n\n\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tclass Application {\n\n\n\t\tpublic:\n\n\t\t\tvirtual ~Application () {};\n\n\t\t\tstatic AutoGCRoot* callback;\n\n\t\t\tvirtual int Exec () = 0;\n\t\t\tvirtual void Init () = 0;\n\t\t\tvirtual int Quit () = 0;\n\t\t\tvirtual void SetFrameRate (double frameRate) = 0;\n\t\t\tvirtual bool Update () = 0;\n\n\n\t};\n\n\n\tApplication* CreateApplication ();\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/app/ApplicationEvent.h",
    "content": "#ifndef LIME_APP_APPLICATION_EVENT_H\n#define LIME_APP_APPLICATION_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum ApplicationEventType {\n\n\t\tUPDATE,\n\t\tEXIT\n\n\t};\n\n\n\tstruct ApplicationEvent {\n\n\t\thl_type* t;\n\t\tint deltaTime;\n\t\tApplicationEventType type;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tApplicationEvent ();\n\n\t\tstatic void Dispatch (ApplicationEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/Image.h",
    "content": "#ifndef LIME_GRAPHICS_IMAGE_H\n#define LIME_GRAPHICS_IMAGE_H\n\n\n#include <graphics/ImageBuffer.h>\n#include <math/Rectangle.h>\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tstruct Image {\n\n\t\thl_type* t;\n\t\tImageBuffer* buffer;\n\t\tbool dirty;\n\t\tint height;\n\t\tint offsetX;\n\t\tint offsetY;\n\t\tRectangle* rect;\n\t\tvenum* type;\n\t\tint version;\n\t\tint width;\n\t\tdouble x;\n\t\tdouble y;\n\n\t\tImage (value image);\n\t\t~Image ();\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/ImageBuffer.h",
    "content": "#ifndef LIME_GRAPHICS_IMAGE_BUFFER_H\n#define LIME_GRAPHICS_IMAGE_BUFFER_H\n\n\n#include <graphics/PixelFormat.h>\n#include <system/CFFI.h>\n#include <utils/ArrayBufferView.h>\n\n\nnamespace lime {\n\n\n\tstruct ImageBuffer {\n\n\t\thl_type* t;\n\t\tint bitsPerPixel;\n\t\tArrayBufferView* data;\n\t\tPixelFormat format;\n\t\tint height;\n\t\tbool premultiplied;\n\t\tbool transparent;\n\t\tint width;\n\n\t\tvdynamic* __srcBitmapData;\n\t\tvdynamic* __srcCanvas;\n\t\tvdynamic* __srcContext;\n\t\tvdynamic* __srcCustom;\n\t\tvdynamic* __srcImage;\n\t\tvdynamic* __srcImageData;\n\n\t\tImageBuffer (value imageBuffer);\n\t\t~ImageBuffer ();\n\n\t\tvoid Blit (const unsigned char* data, int x, int y, int width, int height);\n\t\tvoid Resize (int width, int height, int bitsPerPixel = 32);\n\t\tint Stride ();\n\t\tvalue Value ();\n\t\tvalue Value (value imageBuffer);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/PixelFormat.h",
    "content": "#ifndef LIME_GRAPHICS_PIXEL_FORMAT_H\n#define LIME_GRAPHICS_PIXEL_FORMAT_H\n\n\nnamespace lime {\n\n\n\tenum PixelFormat {\n\n\t\tRGBA32,\n\t\tARGB32,\n\t\tBGRA32\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/RenderEvent.h",
    "content": "#ifndef LIME_GRAPHICS_RENDER_EVENT_H\n#define LIME_GRAPHICS_RENDER_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum RenderEventType {\n\n\t\tRENDER,\n\t\tRENDER_CONTEXT_LOST,\n\t\tRENDER_CONTEXT_RESTORED\n\n\t};\n\n\n\tstruct RenderEvent {\n\n\t\thl_type* t;\n\t\tRenderEventType type;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tRenderEvent ();\n\n\t\tstatic void Dispatch (RenderEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/format/JPEG.h",
    "content": "#ifndef LIME_GRAPHICS_FORMAT_JPEG_H\n#define LIME_GRAPHICS_FORMAT_JPEG_H\n\n\n#include <graphics/ImageBuffer.h>\n#include <utils/Bytes.h>\n#include <utils/Resource.h>\n\n\nnamespace lime {\n\n\n\tclass JPEG {\n\n\n\t\tpublic:\n\n\t\t\tstatic bool Decode (Resource *resource, ImageBuffer *imageBuffer, bool decodeData = true);\n\t\t\tstatic bool Encode (ImageBuffer *imageBuffer, Bytes *bytes, int quality);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/format/PNG.h",
    "content": "#ifndef LIME_GRAPHICS_FORMAT_PNG_H\n#define LIME_GRAPHICS_FORMAT_PNG_H\n\n\n#include <graphics/ImageBuffer.h>\n#include <utils/Bytes.h>\n#include <utils/Resource.h>\n\n\nnamespace lime {\n\n\n\tclass PNG {\n\n\n\t\tpublic:\n\n\t\t\tstatic bool Decode (Resource *resource, ImageBuffer *imageBuffer, bool decodeData = true);\n\t\t\tstatic bool Encode (ImageBuffer *imageBuffer, Bytes *bytes);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/graphics/utils/ImageDataUtil.h",
    "content": "#ifndef LIME_GRAPHICS_UTILS_IMAGE_DATA_UTIL_H\n#define LIME_GRAPHICS_UTILS_IMAGE_DATA_UTIL_H\n\n\n#include <graphics/Image.h>\n#include <graphics/PixelFormat.h>\n#include <math/ColorMatrix.h>\n#include <math/Rectangle.h>\n#include <math/Vector2.h>\n#include <system/CFFI.h>\n#include <system/Endian.h>\n#include <system/System.h>\n#include <utils/Bytes.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tclass ImageDataUtil {\n\n\n\t\tpublic:\n\n\t\t\tstatic void ColorTransform (Image* image, Rectangle* rect, ColorMatrix* ColorMatrix);\n\t\t\tstatic void CopyChannel (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int srcChannel, int destChannel);\n\t\t\tstatic void CopyPixels (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, Image* alphaImage, Vector2* alphaPoint, bool mergeAlpha);\n\t\t\tstatic void FillRect (Image* image, Rectangle* rect, int32_t color);\n\t\t\tstatic void FloodFill (Image* image, int x, int y, int32_t color);\n\t\t\tstatic void GetPixels (Image* image, Rectangle* rect, PixelFormat format, Bytes* pixels);\n\t\t\tstatic void Merge (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int redMultiplier, int greenMultiplier, int blueMultiplier, int alphaMultiplier);\n\t\t\tstatic void MultiplyAlpha (Image* image);\n\t\t\tstatic void Resize (Image* image, ImageBuffer* buffer, int width, int height);\n\t\t\tstatic void SetFormat (Image* image, PixelFormat format);\n\t\t\tstatic void SetPixels (Image* image, Rectangle* rect, Bytes* bytes, int offset, PixelFormat format, Endian endian);\n\t\t\tstatic int Threshold (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int operation, int32_t threshold, int32_t color, int32_t mask, bool copySource);\n\t\t\tstatic void UnmultiplyAlpha (Image* image);\n\n\n\t};\n\n\n\tclass ImageDataView {\n\n\n\t\tpublic:\n\n\t\t\tImageDataView (Image* image, Rectangle* rect);\n\n\t\t\tvoid Clip (int x, int y, int width, int height);\n\t\t\tbool HasRow (int y);\n\t\t\tvoid Offset (int x, int y);\n\t\t\tint Row (int y);\n\n\t\t\tint x;\n\t\t\tint y;\n\t\t\tint width;\n\t\t\tint height;\n\n\t\tprivate:\n\n\t\t\tvoid __Update ();\n\n\t\t\tint byteOffset;\n\t\t\tImage* image;\n\t\t\tRectangle rect;\n\t\t\tint stride;\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/hx/CFFIExt.h",
    "content": "#ifndef HX_CFFIEXT_INCLUDED\n#define HX_CFFIEXT_INCLUDED\n\n#include <hx/CFFI.h>\n\n#if defined(STATIC_LINK) && defined(IMPLEMENT_CFFI_EXT)\nvoid *LoadFunc(const char *inName) { return 0; }\n#else\nextern void *LoadFunc(const char *inName);\n#endif\n\n#ifdef IMPLEMENT_CFFI_EXT\n#define DEFFUNC_EXT(name,ret,def_args,call_args) \\\n   typedef ret (*FUNC_##name)def_args; \\\n   FUNC_##name IMPL_##name = NULL; \\\n   extern FUNC_##name EXT_##name; \\\n   bool LOADED_##name = false; \\\n   bool HAS_##name () \\\n   { \\\n     if (!LOADED_##name) \\\n     { \\\n       IMPL_##name = (FUNC_##name)LoadFunc(#name); \\\n       LOADED_##name = true; \\\n     } \\\n     return IMPL_##name != NULL; \\\n   } \\\n   ret REAL_##name def_args \\\n   { \\\n      if (!HAS_##name()) \\\n      { \\\n        fprintf(stderr,\"Could not find external function:\" #name \" \\n\"); \\\n        abort(); \\\n      } \\\n      EXT_##name = IMPL_##name; \\\n      return IMPL_##name call_args; \\\n   } \\\n   FUNC_##name EXT_##name = REAL_##name;\n#else\n#define DEFFUNC_EXT(name,ret,def_args,call_args) \\\ntypedef ret (*FUNC_##name)def_args; \\\nextern bool HAS_##name (); \\\nextern FUNC_##name EXT_##name;\n#endif\n\n#define DEFFUNC_EXT_0(ret,name) DEFFUNC_EXT(name,ret, (), ())\n#define DEFFUNC_EXT_1(ret,name,t1) DEFFUNC_EXT(name,ret, (t1 a1), (a1))\n#define DEFFUNC_EXT_2(ret,name,t1,t2) DEFFUNC_EXT(name,ret, (t1 a1, t2 a2), (a1,a2))\n#define DEFFUNC_EXT_3(ret,name,t1,t2,t3) DEFFUNC_EXT(name,ret, (t1 a1, t2 a2, t3 a3), (a1,a2,a3))\n#define DEFFUNC_EXT_4(ret,name,t1,t2,t3,t4) DEFFUNC_EXT(name,ret, (t1 a1, t2 a2, t3 a3, t4 a4), (a1,a2,a3,a4))\n#define DEFFUNC_EXT_5(ret,name,t1,t2,t3,t4,t5) DEFFUNC_EXT(name,ret, (t1 a1, t2 a2, t3 a3, t4 a4,t5 a5), (a1,a2,a3,a4,a5))\n\nDEFFUNC_EXT_1(value,pin_buffer,buffer);\nDEFFUNC_EXT_1(void,unpin_buffer,value);\nDEFFUNC_EXT_2(value,alloc_array_type,int,hxValueType);\n\nstatic value alloc_array_type_wrap(int size, hxValueType type)\n{\n    return HAS_alloc_array_type() ? EXT_alloc_array_type(size, type) : alloc_array (size);\n}\n\n#endif"
  },
  {
    "path": "project/include/math/ColorMatrix.h",
    "content": "#ifndef LIME_MATH_COLOR_MATRIX_H\n#define LIME_MATH_COLOR_MATRIX_H\n\n\n#include <system/CFFI.h>\n#include <system/System.h>\n#include <utils/ArrayBufferView.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tclass ColorMatrix {\n\n\n\t\tpublic:\n\n\t\t\tColorMatrix ();\n\t\t\tColorMatrix (value colorMatrix);\n\t\t\tColorMatrix (ArrayBufferView* colorMatrix);\n\t\t\t~ColorMatrix ();\n\n\t\t\tfloat GetAlphaMultiplier ();\n\t\t\tfloat GetAlphaOffset ();\n\t\t\tvoid GetAlphaTable (unsigned char* table);\n\t\t\tfloat GetBlueMultiplier ();\n\t\t\tfloat GetBlueOffset ();\n\t\t\tvoid GetBlueTable (unsigned char* table);\n\t\t\tint32_t GetColor ();\n\t\t\tfloat GetGreenMultiplier ();\n\t\t\tfloat GetGreenOffset ();\n\t\t\tvoid GetGreenTable (unsigned char* table);\n\t\t\tfloat GetRedMultiplier ();\n\t\t\tfloat GetRedOffset ();\n\t\t\tvoid GetRedTable (unsigned char* table);\n\n\t\t\tfloat data[20];\n\n\t\tprivate:\n\n\t\t\tvoid GetDataTable (unsigned char* table, float multiplier, float offset);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/math/Matrix3.h",
    "content": "#ifndef LIME_MATH_MATRIX_3_H\n#define LIME_MATH_MATRIX_3_H\n\n\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tstruct Matrix3 {\n\n\t\thl_type* t;\n\t\tdouble a;\n\t\tdouble b;\n\t\tdouble c;\n\t\tdouble d;\n\t\tdouble tx;\n\t\tdouble ty;\n\n\t\tMatrix3 (double a, double b, double c, double d, double tx, double ty);\n\t\tMatrix3 (value matrix3);\n\n\t\tvoid SetTo (double a, double b, double c, double d, double tx, double ty);\n\t\tvalue Value ();\n\t\tvalue Value (value matrix3);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/math/Rectangle.h",
    "content": "#ifndef LIME_MATH_RECTANGLE_H\n#define LIME_MATH_RECTANGLE_H\n\n\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tstruct Rectangle {\n\n\t\thl_type* t;\n\t\tdouble height;\n\t\tdouble width;\n\t\tdouble x;\n\t\tdouble y;\n\n\t\tRectangle ();\n\t\tRectangle (double x, double y, double width, double height);\n\t\tRectangle (value rect);\n\n\t\tvoid Contract (double x, double y, double width, double height);\n\t\tvoid SetTo (double x, double y, double width, double height);\n\t\tvalue Value ();\n\t\tvalue Value (value rect);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/math/Vector2.h",
    "content": "#ifndef LIME_MATH_VECTOR2_H\n#define LIME_MATH_VECTOR2_H\n\n\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tstruct Vector2 {\n\n\t\thl_type* t;\n\t\tdouble x;\n\t\tdouble y;\n\n\t\tVector2 (double x, double y);\n\t\tVector2 (value vec);\n\n\t\tvoid SetTo (double x, double y);\n\t\tvalue Value ();\n\t\tvalue Value (value vec);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/math/color/RGBA.h",
    "content": "#ifndef LIME_MATH_COLOR_RGBA_H\n#define LIME_MATH_COLOR_RGBA_H\n\n\n#include <graphics/PixelFormat.h>\n#include <system/Endian.h>\n#include <stdint.h>\n#include <math.h>\n\n\nnamespace lime {\n\n\n\tint __alpha16[0xFF + 1];\n\tint __clamp[0xFF + 0xFF + 1];\n\tstatic int a16;\n\tstatic double unmult;\n\n\tint initValues () {\n\n\t\tfor (int i = 0; i < 256; i++) {\n\n\t\t\t__alpha16[i] = (int) ceil ((float)(i + 1) * ((1 << 16) / 0xFF));\n\n\t\t}\n\n\t\tfor (int i = 0; i < 0xFF; i++) {\n\n\t\t\t__clamp[i] = i;\n\n\t\t}\n\n\t\tfor (int i = 0xFF; i < (0xFF + 0xFF + 1); i++) {\n\n\t\t\t__clamp[i] = 0xFF;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\tstatic int initValues_ = initValues ();\n\n\n\tstruct RGBA {\n\n\n\t\tpublic:\n\n\t\t\tinline RGBA () {\n\n\t\t\t\tr = 0;\n\t\t\t\tg = 0;\n\t\t\t\tb = 0;\n\t\t\t\ta = 0;\n\n\t\t\t}\n\n\n\t\t\tinline RGBA (int32_t rgba) {\n\n\t\t\t\tr = (rgba >> 24) & 0xFF;\n\t\t\t\tg = (rgba >> 16) & 0xFF;\n\t\t\t\tb = (rgba >> 8) & 0xFF;\n\t\t\t\ta = rgba & 0xFF;\n\n\t\t\t}\n\n\n\t\t\tinline RGBA (unsigned char r, unsigned char g, unsigned char b, unsigned char a) {\n\n\t\t\t\tSet (r, g, b, a);\n\n\t\t\t}\n\n\n\t\t\tinline int32_t Get () {\n\n\t\t\t\tint32_t value = ((r & 0xFF) << 24) | ((g & 0xFF) << 16) | ((b & 0xFF) << 8) | (a & 0xFF);\n\t\t\t\treturn value;\n\n\t\t\t}\n\n\n\t\t\tinline void MultiplyAlpha () {\n\n\t\t\t\tif (a == 0) {\n\n\t\t\t\t\tSet (0, 0, 0, 0);\n\n\t\t\t\t} else if (a != 0xFF) {\n\n\t\t\t\t\ta16 = __alpha16[a];\n\t\t\t\t\tSet ((r * a16) >> 16, (g * a16) >> 16, (b * a16) >> 16, a);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tinline void UnmultiplyAlpha () {\n\n\t\t\t\tif (a != 0 && a != 0xFF) {\n\n\t\t\t\t\tunmult = 255.0 / a;\n\t\t\t\t\tSet (__clamp[(int)(r * unmult)], __clamp[(int)(g * unmult)], __clamp[(int)(b * unmult)], a);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tinline void ReadUInt8 (const unsigned char* data, int offset, PixelFormat format, bool premultiplied, Endian endian) {\n\n\t\t\t\tswitch (format) {\n\n\t\t\t\t\tcase BGRA32:\n\n\t\t\t\t\t\tif (endian == LIME_LITTLE_ENDIAN)\n\t\t\t\t\t\t\tSet (data[offset + 1], data[offset + 2], data[offset + 3], data[offset]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tSet (data[offset + 2], data[offset + 1], data[offset], data[offset + 3]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase RGBA32:\n\n\t\t\t\t\t\tif (endian == LIME_LITTLE_ENDIAN)\n\t\t\t\t\t\t\tSet (data[offset + 3], data[offset + 2], data[offset + 1], data[offset]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tSet (data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ARGB32:\n\n\t\t\t\t\t\tif (endian == LIME_LITTLE_ENDIAN)\n\t\t\t\t\t\t\tSet (data[offset + 2], data[offset + 1], data[offset], data[offset + 3]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tSet (data[offset + 1], data[offset + 2], data[offset + 3], data[offset]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif (premultiplied) {\n\n\t\t\t\t\tUnmultiplyAlpha ();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tinline void Set (unsigned char r, unsigned char g, unsigned char b, unsigned char a) {\n\n\t\t\t\tthis->r = r;\n\t\t\t\tthis->g = g;\n\t\t\t\tthis->b = b;\n\t\t\t\tthis->a = a;\n\n\t\t\t}\n\n\n\t\t\tinline void WriteUInt8 (unsigned char* data, int offset, PixelFormat format, bool premultiplied) {\n\n\t\t\t\tif (premultiplied) {\n\n\t\t\t\t\tMultiplyAlpha ();\n\n\t\t\t\t}\n\n\t\t\t\tswitch (format) {\n\n\t\t\t\t\tcase BGRA32:\n\n\t\t\t\t\t\tdata[offset] = b;\n\t\t\t\t\t\tdata[offset + 1] = g;\n\t\t\t\t\t\tdata[offset + 2] = r;\n\t\t\t\t\t\tdata[offset + 3] = a;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase RGBA32:\n\n\t\t\t\t\t\tdata[offset] = r;\n\t\t\t\t\t\tdata[offset + 1] = g;\n\t\t\t\t\t\tdata[offset + 2] = b;\n\t\t\t\t\t\tdata[offset + 3] = a;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ARGB32:\n\n\t\t\t\t\t\tdata[offset] = a;\n\t\t\t\t\t\tdata[offset + 1] = r;\n\t\t\t\t\t\tdata[offset + 2] = g;\n\t\t\t\t\t\tdata[offset + 3] = b;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tinline bool operator == (RGBA& rgba) {\n\n\t\t\t\treturn (a == rgba.a && r == rgba.r && g == rgba.g && b == rgba.b);\n\n\t\t\t}\n\n\n\t\t\tunsigned char r;\n\t\t\tunsigned char g;\n\t\t\tunsigned char b;\n\t\t\tunsigned char a;\n\n\n\t};\n\n\n}\n\n\n#endif\n"
  },
  {
    "path": "project/include/media/AudioBuffer.h",
    "content": "#ifndef LIME_MEDIA_AUDIO_BUFFER_H\n#define LIME_MEDIA_AUDIO_BUFFER_H\n\n\n#include <system/CFFI.h>\n#include <utils/ArrayBufferView.h>\n\n#ifdef ANDROID\n#include <android/log.h>\n#endif\n\n\n#ifdef ANDROID\n#define LOG_SOUND(args,...) __android_log_print(ANDROID_LOG_INFO, \"Lime\", args, ##__VA_ARGS__)\n#else\n#ifdef IPHONE\n//#define LOG_SOUND(args,...) printf(args, ##__VA_ARGS__)\n#define LOG_SOUND(args...) { }\n#elif defined(TIZEN)\n#include <FBase.h>\n#define LOG_SOUND(args,...) AppLog(args, ##__VA_ARGS__)\n#else\n#define LOG_SOUND(args,...) printf(args, ##__VA_ARGS__)\n#endif\n#endif\n//#define LOG_SOUND(args...)  { }\n\n\nnamespace lime {\n\n\n\tstruct AudioBuffer {\n\n\t\thl_type* t;\n\t\tint bitsPerSample;\n\t\tint channels;\n\t\tArrayBufferView* data;\n\t\tint sampleRate;\n\n\t\tvdynamic* __srcAudio;\n\t\tvdynamic* __srcBuffer;\n\t\tvdynamic* __srcCustom;\n\t\tvdynamic* __srcHowl;\n\t\tvdynamic* __srcSound;\n\t\tvdynamic* __srcVorbisFile;\n\n\t\tAudioBuffer (value audioBuffer);\n\t\t~AudioBuffer ();\n\t\tvalue Value (value audioBuffer);\n\t\tvalue Value ();\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/media/codecs/vorbis/VorbisFile.h",
    "content": "#ifndef LIME_MEDIA_CODECS_VORBIS_VORBIS_FILE_H\n#define LIME_MEDIA_CODECS_VORBIS_VORBIS_FILE_H\n\n\n#include <utils/Bytes.h>\n#include <vorbis/vorbisfile.h>\n\n\nnamespace lime {\n\n\n\tclass VorbisFile {\n\n\n\t\tpublic:\n\n\t\t\tstatic OggVorbis_File* FromBytes (Bytes* bytes);\n\t\t\tstatic OggVorbis_File* FromFile (const char* path);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/media/containers/OGG.h",
    "content": "#ifndef LIME_MEDIA_CONTAINERS_OGG_H\n#define LIME_MEDIA_CONTAINERS_OGG_H\n\n\n#include <media/AudioBuffer.h>\n#include <utils/Resource.h>\n\n\nnamespace lime {\n\n\n\tclass OGG {\n\n\n\t\tpublic:\n\n\t\t\tstatic bool Decode (Resource *resource, AudioBuffer *audioBuffer);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/media/containers/WAV.h",
    "content": "#ifndef LIME_MEDIA_CONTAINERS_WAV_H\n#define LIME_MEDIA_CONTAINERS_WAV_H\n\n\n#include <media/AudioBuffer.h>\n#include <utils/Resource.h>\n\n\nnamespace lime {\n\n\n\tstruct RIFF_Header {\n\n\t\tchar chunkID[4];\n\t\tunsigned int chunkSize; //size not including chunkSize or chunkID\n\t\tchar format[4];\n\n\t};\n\n\n\tstruct WAVE_Format {\n\n\t\tchar subChunkID[4];\n\t\tunsigned int subChunkSize;\n\t\tshort audioFormat;\n\t\tshort numChannels;\n\t\tunsigned int sampleRate;\n\t\tunsigned int byteRate;\n\t\tshort blockAlign;\n\t\tshort bitsPerSample;\n\n\t};\n\n\n\tstruct WAVE_Data {\n\n\t\tchar subChunkID[4]; //should contain the word data\n\t\tunsigned int subChunkSize; //Stores the size of the data block\n\n\t};\n\n\n\tclass WAV {\n\n\n\t\tpublic:\n\n\t\t\tstatic bool Decode (Resource *resource, AudioBuffer *audioBuffer);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/CFFI.h",
    "content": "#ifndef LIME_SYSTEM_CFFI_H\n#define LIME_SYSTEM_CFFI_H\n\n\n#define HL_NAME(n) lime_##n\n#include <hl.h>\n#undef DEFINE_PRIM\n#define DEFINE_HL_PRIM(t, name, args) DEFINE_PRIM_WITH_NAME(t, name, args, name)\n\ntypedef vdynamic hl_vdynamic;\ntypedef vobj hl_vobj;\ntypedef vvirtual hl_vvirtual;\ntypedef varray hl_varray;\ntypedef vclosure hl_vclosure;\ntypedef vclosure_wrapper hl_vclosure_wrapper;\ntypedef vdynobj hl_vdynobj;\ntypedef venum hl_venum;\ntypedef vstring hl_vstring;\n\n#undef hl_aptr\n#define hl_aptr(a,t)\t((t*)(((hl_varray*)(a))+1))\n\n\n#include <hx/CFFIPrime.h>\n\n\n#ifndef LIME_HASHLINK\n// define stubs in CFFI.cpp\n#endif\n\n\n#endif"
  },
  {
    "path": "project/include/system/CFFIPointer.h",
    "content": "#ifndef LIME_SYSTEM_CFFI_POINTER_H\n#define LIME_SYSTEM_CFFI_POINTER_H\n\n\n#include <system/CFFI.h>\n\n\nnamespace hx {\n\n\tclass Object;\n\ttypedef void (*finalizer)(value v);\n\n}\n\n\nnamespace lime {\n\n\n\tstruct HL_CFFIPointer {\n\n\t\tvoid* finalizer;\n\t\tvoid* ptr;\n\n\t};\n\n\ttypedef void (*hl_finalizer)(void* v);\n\n\n\tvalue CFFIPointer (void* ptr, hx::finalizer finalizer = 0);\n\tvalue CFFIPointer (value handle, hx::finalizer finalizer = 0);\n\tHL_CFFIPointer* HLCFFIPointer (void* ptr, hl_finalizer finalizer = 0);\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/Clipboard.h",
    "content": "#ifndef LIME_SYSTEM_CLIPBOARD_H\n#define LIME_SYSTEM_CLIPBOARD_H\n\n\nnamespace lime {\n\n\n\tclass Clipboard {\n\n\n\t\tpublic:\n\n\t\t\tstatic const char* GetText ();\n\t\t\tstatic bool HasText ();\n\t\t\tstatic bool SetText (const char* text);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/ClipboardEvent.h",
    "content": "#ifndef LIME_SYSTEM_CLIPBOARD_EVENT_H\n#define LIME_SYSTEM_CLIPBOARD_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum ClipboardEventType {\n\n\t\tCLIPBOARD_UPDATE\n\n\t};\n\n\n\tstruct ClipboardEvent {\n\n\t\thl_type* t;\n\t\tClipboardEventType type;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tClipboardEvent ();\n\n\t\tstatic void Dispatch (ClipboardEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/Display.h",
    "content": "#ifndef LIME_SYSTEM_DISPLAY_H\n#define LIME_SYSTEM_DISPLAY_H\n\n#include <math/Rectangle.h>\n\nnamespace lime {\n\n\n\tclass Display {\n\n\n\t\tpublic:\n\n\t\t\tstatic void GetSafeAreaInsets (int displayIndex, Rectangle * rect);\n\n\n\t};\n\n}\n\n#endif"
  },
  {
    "path": "project/include/system/DisplayMode.h",
    "content": "#ifndef LIME_SYSTEM_DISPLAY_MODE_H\n#define LIME_SYSTEM_DISPLAY_MODE_H\n\n\n#include <graphics/PixelFormat.h>\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tclass DisplayMode {\n\n\t\tpublic:\n\n\t\t\thl_type* t;\n\t\t\tint height;\n\t\t\tPixelFormat pixelFormat;\n\t\t\tint refreshRate;\n\t\t\tint width;\n\n\t\t\tDisplayMode ();\n\t\t\tDisplayMode (value DisplayMode);\n\t\t\tDisplayMode (int width, int height, PixelFormat pixelFormat, int refreshRate);\n\n\t\t\tvoid CopyFrom (DisplayMode* other);\n\t\t\tvoid* Value ();\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/Endian.h",
    "content": "#ifndef LIME_SYSTEM_ENDIAN_H\n#define LIME_SYSTEM_ENDIAN_H\n\n\nnamespace lime {\n\n\n\tenum Endian {\n\n\t\tLIME_LITTLE_ENDIAN,\n\t\tLIME_BIG_ENDIAN\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/FileWatcher.h",
    "content": "#ifndef LIME_SYSTEM_FILE_WATCHER_H\n#define LIME_SYSTEM_FILE_WATCHER_H\n\n#include <system/CFFI.h>\n#include <system/Mutex.h>\n#include <map>\n#include <string>\n#include <vector>\n\n#ifdef RemoveDirectory\n#undef RemoveDirectory\n#endif\n\nnamespace lime {\n\n\n\tstruct FileWatcherEvent {\n\n\t\tlong watchID;\n\t\tstd::string dir;\n\t\tstd::string file;\n\t\tint action;\n\t\tstd::string oldFile;\n\n\t};\n\n\n\tclass FileWatcher {\n\n\n\t\tpublic:\n\n\t\t\tFileWatcher (value callback);\n\t\t\t~FileWatcher ();\n\n\t\t\tlong AddDirectory (const std::string directory, bool recursive);\n\t\t\tvoid QueueEvent (FileWatcherEvent event);\n\t\t\tvoid RemoveDirectory (long watchID);\n\t\t\tvoid Update ();\n\n\n\t\tprivate:\n\n\t\t\tAutoGCRoot* callback;\n\t\t\tvoid* fileWatcher;\n\t\t\tMutex* mutex;\n\t\t\tstd::vector<FileWatcherEvent> queue;\n\t\t\tstd::map<long, void*> listeners;\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/JNI.h",
    "content": "#ifndef LIME_SYSTEM_JNI_H\n#define LIME_SYSTEM_JNI_H\n\n\nnamespace lime {\n\n\n\tclass JNI {\n\n\n\t\tpublic:\n\n\t\t\tstatic void *GetEnv ();\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/Locale.h",
    "content": "#ifndef LIME_SYSTEM_LOCALE_H\n#define LIME_SYSTEM_LOCALE_H\n\n#include <string>\n\n\nnamespace lime {\n\n\n\tclass Locale {\n\n\n\t\tpublic:\n\n\t\t\tstatic std::string* GetSystemLocale ();\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/Mutex.h",
    "content": "#ifndef LIME_SYSTEM_MUTEX_H\n#define LIME_SYSTEM_MUTEX_H\n\n\nnamespace lime {\n\n\n\tclass Mutex {\n\n\n\t\tpublic:\n\n\t\t\tMutex ();\n\t\t\t~Mutex ();\n\n\t\t\tbool Lock () const;\n\t\t\tbool TryLock () const;\n\t\t\tbool Unlock () const;\n\n\t\tprivate:\n\n\t\t\tvoid* mutex;\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/OrientationEvent.h",
    "content": "#ifndef LIME_SYSTEM_ORIENTATION_EVENT_H\n#define LIME_SYSTEM_ORIENTATION_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum OrientationEventType {\n\n\t\tDISPLAY_ORIENTATION_CHANGE,\n\t\tDEVICE_ORIENTATION_CHANGE\n\n\t};\n\n\n\tstruct OrientationEvent {\n\n\t\thl_type* t;\n\t\tint orientation;\n\t\tint display;\n\t\tOrientationEventType type;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tOrientationEvent ();\n\n\t\tstatic void Dispatch (OrientationEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/SensorEvent.h",
    "content": "#ifndef LIME_SYSTEM_SENSOR_EVENT_H\n#define LIME_SYSTEM_SENSOR_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum SensorEventType {\n\n\t\tSENSOR_ACCELEROMETER\n\n\t};\n\n\n\tstruct SensorEvent {\n\n\t\thl_type* t;\n\t\tint id;\n\t\tdouble x;\n\t\tdouble y;\n\t\tdouble z;\n\t\tSensorEventType type;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tSensorEvent ();\n\n\t\tstatic void Dispatch (SensorEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/system/System.h",
    "content": "#ifndef LIME_SYSTEM_SYSTEM_H\n#define LIME_SYSTEM_SYSTEM_H\n\n#include <system/CFFI.h>\n#include <stdio.h>\n#include <string>\n\n\nnamespace lime {\n\n\n\tenum SystemDirectory {\n\n\t\tAPPLICATION,\n\t\tAPPLICATION_STORAGE,\n\t\tDESKTOP,\n\t\tDOCUMENTS,\n\t\tFONTS,\n\t\tUSER\n\n\t};\n\n\n\tclass System {\n\n\n\t\tpublic:\n\n\t\t\tstatic void GCEnterBlocking ();\n\t\t\tstatic void GCExitBlocking ();\n\t\t\tstatic void GCTryEnterBlocking ();\n\t\t\tstatic void GCTryExitBlocking ();\n\t\t\tstatic bool GetAllowScreenTimeout ();\n\t\t\tstatic std::wstring* GetDeviceModel ();\n\t\t\tstatic std::wstring* GetDeviceVendor ();\n\t\t\tstatic std::wstring* GetDirectory (SystemDirectory type, const char* company, const char* title);\n\t\t\tstatic void* GetDisplay (bool useCFFIValue, int id);\n\t\t\t#ifdef IPHONE\n\t\t\tstatic std::wstring* GetIOSDirectory (SystemDirectory type);\n\t\t\tstatic bool GetIOSTablet ();\n\t\t\t#endif\n\t\t\tstatic int GetNumDisplays ();\n\t\t\tstatic int GetDeviceOrientation ();\n\t\t\tstatic std::wstring* GetPlatformLabel ();\n\t\t\tstatic std::wstring* GetPlatformName ();\n\t\t\tstatic std::wstring* GetPlatformVersion ();\n\t\t\tstatic double GetTimer ();\n\t\t\t#if defined(HX_WINDOWS) && !defined (HX_WINRT)\n\t\t\tstatic int GetWindowsConsoleMode (int handleType);\n\t\t\t#endif\n\t\t\tstatic void OpenFile (const char* path);\n\t\t\tstatic void OpenURL (const char* url, const char* target);\n\t\t\tstatic bool SetAllowScreenTimeout (bool allow);\n\t\t\t#if defined(HX_WINDOWS) && !defined (HX_WINRT)\n\t\t\tstatic bool SetWindowsConsoleMode (int handleType, int mode);\n\t\t\t#endif\n\t\t\tstatic void EnableDeviceOrientationChange(bool enable);\n\n\t\tprivate:\n\n\t\t\tstatic bool _isHL;\n\n\n\t};\n\n\n\tstruct FILE_HANDLE {\n\n\t\tvoid *handle;\n\n\t\tFILE_HANDLE (void* handle) : handle (handle) {}\n\n\t\tFILE* getFile ();\n\t\tint getLength ();\n\t\tbool isFile ();\n\n\t};\n\n\n\textern int fclose (FILE_HANDLE *stream);\n\textern FILE_HANDLE *fdopen (int fd, const char *mode);\n\textern FILE_HANDLE *fopen (const char *filename, const char *mode);\n\t//extern FILE* freopen (const char *filename, const char *mode, FILE *stream);\n\textern size_t fread (void *ptr, size_t size, size_t count, FILE_HANDLE *stream);\n\textern int fseek (FILE_HANDLE *stream, long int offset, int origin);\n\textern long int ftell (FILE_HANDLE *stream);\n\textern size_t fwrite (const void *ptr, size_t size, size_t count, FILE_HANDLE *stream);\n\n\n}\n\n\n#if !defined(HX_WINDOWS) || defined(__MINGW32__)\n#include <stdint.h>\n#else\n\n\n// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124\n//\n//  Copyright (c) 2006-2013 Alexander Chemeris\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. Neither the name of the product nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef _MSC_VER // [\n#error \"Use this header only with Microsoft Visual C++ compilers!\"\n#endif // _MSC_VER ]\n\n#ifndef _MSC_STDINT_H_ // [\n#define _MSC_STDINT_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#if _MSC_VER >= 1600 // [\n#include <stdint.h>\n#else // ] _MSC_VER >= 1600 [\n\n#include <limits.h>\n\n// For Visual Studio 6 in C++ mode and for many Visual Studio versions when\n// compiling for ARM we should wrap <wchar.h> include with 'extern \"C++\" {}'\n// or compiler give many errors like this:\n//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#  include <wchar.h>\n#ifdef __cplusplus\n}\n#endif\n\n// Define _W64 macros to mark types changing their size, like intptr_t.\n#ifndef _W64\n#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300\n#     define _W64 __w64\n#  else\n#     define _W64\n#  endif\n#endif\n\n\n// 7.18.1 Integer types\n\n// 7.18.1.1 Exact-width integer types\n\n// Visual Studio 6 and Embedded Visual C++ 4 doesn't\n// realize that, e.g. char has the same size as __int8\n// so we give up on __intX for them.\n#if (_MSC_VER < 1300)\n   typedef signed char       int8_t;\n   typedef signed short      int16_t;\n   typedef signed int        int32_t;\n   typedef unsigned char     uint8_t;\n   typedef unsigned short    uint16_t;\n   typedef unsigned int      uint32_t;\n#else\n   typedef signed __int8     int8_t;\n   typedef signed __int16    int16_t;\n   typedef signed __int32    int32_t;\n   typedef unsigned __int8   uint8_t;\n   typedef unsigned __int16  uint16_t;\n   typedef unsigned __int32  uint32_t;\n#endif\ntypedef signed __int64       int64_t;\ntypedef unsigned __int64     uint64_t;\n\n\n// 7.18.1.2 Minimum-width integer types\ntypedef int8_t    int_least8_t;\ntypedef int16_t   int_least16_t;\ntypedef int32_t   int_least32_t;\ntypedef int64_t   int_least64_t;\ntypedef uint8_t   uint_least8_t;\ntypedef uint16_t  uint_least16_t;\ntypedef uint32_t  uint_least32_t;\ntypedef uint64_t  uint_least64_t;\n\n// 7.18.1.3 Fastest minimum-width integer types\ntypedef int8_t    int_fast8_t;\ntypedef int16_t   int_fast16_t;\ntypedef int32_t   int_fast32_t;\ntypedef int64_t   int_fast64_t;\ntypedef uint8_t   uint_fast8_t;\ntypedef uint16_t  uint_fast16_t;\ntypedef uint32_t  uint_fast32_t;\ntypedef uint64_t  uint_fast64_t;\n\n// 7.18.1.4 Integer types capable of holding object pointers\n#ifdef _WIN64 // [\n   typedef signed __int64    intptr_t;\n   typedef unsigned __int64  uintptr_t;\n#else // _WIN64 ][\n   typedef _W64 signed int   intptr_t;\n   typedef _W64 unsigned int uintptr_t;\n#endif // _WIN64 ]\n\n// 7.18.1.5 Greatest-width integer types\ntypedef int64_t   intmax_t;\ntypedef uint64_t  uintmax_t;\n\n\n// 7.18.2 Limits of specified-width integer types\n\n#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259\n\n// 7.18.2.1 Limits of exact-width integer types\n#define INT8_MIN     ((int8_t)_I8_MIN)\n#define INT8_MAX     _I8_MAX\n#define INT16_MIN    ((int16_t)_I16_MIN)\n#define INT16_MAX    _I16_MAX\n#define INT32_MIN    ((int32_t)_I32_MIN)\n#define INT32_MAX    _I32_MAX\n#define INT64_MIN    ((int64_t)_I64_MIN)\n#define INT64_MAX    _I64_MAX\n#define UINT8_MAX    _UI8_MAX\n#define UINT16_MAX   _UI16_MAX\n#define UINT32_MAX   _UI32_MAX\n#define UINT64_MAX   _UI64_MAX\n\n// 7.18.2.2 Limits of minimum-width integer types\n#define INT_LEAST8_MIN    INT8_MIN\n#define INT_LEAST8_MAX    INT8_MAX\n#define INT_LEAST16_MIN   INT16_MIN\n#define INT_LEAST16_MAX   INT16_MAX\n#define INT_LEAST32_MIN   INT32_MIN\n#define INT_LEAST32_MAX   INT32_MAX\n#define INT_LEAST64_MIN   INT64_MIN\n#define INT_LEAST64_MAX   INT64_MAX\n#define UINT_LEAST8_MAX   UINT8_MAX\n#define UINT_LEAST16_MAX  UINT16_MAX\n#define UINT_LEAST32_MAX  UINT32_MAX\n#define UINT_LEAST64_MAX  UINT64_MAX\n\n// 7.18.2.3 Limits of fastest minimum-width integer types\n#define INT_FAST8_MIN    INT8_MIN\n#define INT_FAST8_MAX    INT8_MAX\n#define INT_FAST16_MIN   INT16_MIN\n#define INT_FAST16_MAX   INT16_MAX\n#define INT_FAST32_MIN   INT32_MIN\n#define INT_FAST32_MAX   INT32_MAX\n#define INT_FAST64_MIN   INT64_MIN\n#define INT_FAST64_MAX   INT64_MAX\n#define UINT_FAST8_MAX   UINT8_MAX\n#define UINT_FAST16_MAX  UINT16_MAX\n#define UINT_FAST32_MAX  UINT32_MAX\n#define UINT_FAST64_MAX  UINT64_MAX\n\n// 7.18.2.4 Limits of integer types capable of holding object pointers\n#ifdef _WIN64 // [\n#  define INTPTR_MIN   INT64_MIN\n#  define INTPTR_MAX   INT64_MAX\n#  define UINTPTR_MAX  UINT64_MAX\n#else // _WIN64 ][\n#  define INTPTR_MIN   INT32_MIN\n#  define INTPTR_MAX   INT32_MAX\n#  define UINTPTR_MAX  UINT32_MAX\n#endif // _WIN64 ]\n\n// 7.18.2.5 Limits of greatest-width integer types\n#define INTMAX_MIN   INT64_MIN\n#define INTMAX_MAX   INT64_MAX\n#define UINTMAX_MAX  UINT64_MAX\n\n// 7.18.3 Limits of other integer types\n\n#ifdef _WIN64 // [\n#  define PTRDIFF_MIN  _I64_MIN\n#  define PTRDIFF_MAX  _I64_MAX\n#else  // _WIN64 ][\n#  define PTRDIFF_MIN  _I32_MIN\n#  define PTRDIFF_MAX  _I32_MAX\n#endif  // _WIN64 ]\n\n#define SIG_ATOMIC_MIN  INT_MIN\n#define SIG_ATOMIC_MAX  INT_MAX\n\n#ifndef SIZE_MAX // [\n#  ifdef _WIN64 // [\n#     define SIZE_MAX  _UI64_MAX\n#  else // _WIN64 ][\n#     define SIZE_MAX  _UI32_MAX\n#  endif // _WIN64 ]\n#endif // SIZE_MAX ]\n\n// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>\n#ifndef WCHAR_MIN // [\n#  define WCHAR_MIN  0\n#endif  // WCHAR_MIN ]\n#ifndef WCHAR_MAX // [\n#  define WCHAR_MAX  _UI16_MAX\n#endif  // WCHAR_MAX ]\n\n#define WINT_MIN  0\n#define WINT_MAX  _UI16_MAX\n\n#endif // __STDC_LIMIT_MACROS ]\n\n\n// 7.18.4 Limits of other integer types\n\n#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\n\n// 7.18.4.1 Macros for minimum-width integer constants\n\n#define INT8_C(val)  val##i8\n#define INT16_C(val) val##i16\n#define INT32_C(val) val##i32\n#define INT64_C(val) val##i64\n\n#define UINT8_C(val)  val##ui8\n#define UINT16_C(val) val##ui16\n#define UINT32_C(val) val##ui32\n#define UINT64_C(val) val##ui64\n\n// 7.18.4.2 Macros for greatest-width integer constants\n// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.\n// Check out Issue 9 for the details.\n#ifndef INTMAX_C //   [\n#  define INTMAX_C   INT64_C\n#endif // INTMAX_C    ]\n#ifndef UINTMAX_C //  [\n#  define UINTMAX_C  UINT64_C\n#endif // UINTMAX_C   ]\n\n#endif // __STDC_CONSTANT_MACROS ]\n\n#endif // _MSC_VER >= 1600 ]\n\n#endif // _MSC_STDINT_H_ ]\n#endif\n\n\n#if defined(ANDROID) && !defined(HXCPP_CLANG)\n\nstd::size_t _mbsrtowcs(wchar_t * ws, const char **src, std::size_t wn, std::mbstate_t *st);\n\n#endif\n\n\n#endif"
  },
  {
    "path": "project/include/system/ValuePointer.h",
    "content": "#ifndef LIME_SYSTEM_VALUE_POINTER_H\n#define LIME_SYSTEM_VALUE_POINTER_H\n\n\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tclass ValuePointer {\n\n\n\t\tpublic:\n\n\t\t\tValuePointer (vobj* handle);\n\t\t\tValuePointer (vdynamic* handle);\n\t\t\tValuePointer (vclosure* handle);\n\t\t\tValuePointer (value handle);\n\t\t\t~ValuePointer ();\n\n\t\t\tvoid* Call ();\n\t\t\tvoid* Call (void* arg0);\n\t\t\tvoid* Call (void* arg0, void* arg1);\n\t\t\tvoid* Call (void* arg0, void* arg1, void* arg2);\n\t\t\tvoid* Call (void* arg0, void* arg1, void* arg2, void* arg3);\n\t\t\tvoid* Call (void* arg0, void* arg1, void* arg2, void* arg3, void* arg4);\n\t\t\tvoid* Get () const;\n\t\t\tbool IsCFFIValue ();\n\t\t\tbool IsHLValue ();\n\t\t\tvoid Set (vobj* handle);\n\t\t\tvoid Set (value handle);\n\n\t\tprivate:\n\n\t\t\tgcroot cffiRoot;\n\t\t\tvalue* cffiValue;\n\t\t\tvobj* hlValue;\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/text/Font.h",
    "content": "#ifndef LIME_TEXT_FONT_H\n#define LIME_TEXT_FONT_H\n\n\n#include <graphics/ImageBuffer.h>\n#include <system/CFFI.h>\n#include <system/System.h>\n#include <utils/Resource.h>\n\n#ifdef HX_WINDOWS\n#undef GetGlyphIndices\n#endif\n\n\nnamespace lime {\n\n\n\ttypedef struct {\n\n\t\tunsigned long codepoint;\n\t\tsize_t size;\n\t\tint index;\n\t\tint height;\n\n\t} GlyphInfo;\n\n\n\ttypedef struct {\n\n\t\tuint32_t index;\n\t\tuint32_t width;\n\t\tuint32_t height;\n\t\tuint32_t x;\n\t\tuint32_t y;\n\t\tunsigned char data;\n\n\t} GlyphImage;\n\n\n\tclass Font {\n\n\n\t\tpublic:\n\n\t\t\tFont (Resource *resource, int faceIndex = 0);\n\t\t\t~Font ();\n\n\t\t\tvoid* Decompose (bool useCFFIValue, int em);\n\t\t\tint GetAscender ();\n\t\t\tint GetDescender ();\n\t\t\twchar_t *GetFamilyName ();\n\t\t\tint GetGlyphIndex (const char* character);\n\t\t\tvoid* GetGlyphIndices (bool useCFFIValue, const char* characters);\n\t\t\tvoid* GetGlyphMetrics (bool useCFFIValue, int index);\n\t\t\tint GetHeight ();\n\t\t\tint GetNumGlyphs ();\n\t\t\tint GetUnderlinePosition ();\n\t\t\tint GetUnderlineThickness ();\n\t\t\tint GetStrikethroughPosition ();\n\t\t\tint GetStrikethroughThickness ();\n\t\t\tint GetUnitsPerEM ();\n\t\t\tint RenderGlyph (int index, Bytes *bytes, int offset = 0);\n\t\t\tint RenderGlyphs (value indices, Bytes *bytes);\n\t\t\tvoid SetSize (size_t size, size_t dpi);\n\n\t\t\tvoid* library;\n\t\t\tvoid* face;\n\t\t\tvoid* faceMemory;\n\n\t\tprivate:\n\n\t\t\tsize_t mSize;\n\n\t};\n\n\n}\n\n\n#endif\n"
  },
  {
    "path": "project/include/ui/Cursor.h",
    "content": "#ifndef LIME_UI_CURSOR_H\n#define LIME_UI_CURSOR_H\n\n\nnamespace lime {\n\n\n\tenum Cursor {\n\n\t\tHIDDEN,\n\t\tARROW,\n\t\tCROSSHAIR,\n\t\tDEFAULT,\n\t\tMOVE,\n\t\tPOINTER,\n\t\tRESIZE_NESW,\n\t\tRESIZE_NS,\n\t\tRESIZE_NWSE,\n\t\tRESIZE_WE,\n\t\tTEXT,\n\t\tWAIT,\n\t\tWAIT_ARROW,\n\t\tCUSTOM\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/DropEvent.h",
    "content": "#ifndef LIME_UI_DROP_EVENT_H\n#define LIME_UI_DROP_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum DropEventType {\n\n\t\tDROP_FILE\n\n\t};\n\n\n\tstruct DropEvent {\n\n\t\thl_type* t;\n\t\tvbyte* file;\n\t\tDropEventType type;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tDropEvent ();\n\n\t\tstatic void Dispatch (DropEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/FileDialog.h",
    "content": "#ifndef LIME_UI_FILE_DIALOG_H\n#define LIME_UI_FILE_DIALOG_H\n\n\n#include <string>\n#include <vector>\n\n\nnamespace lime {\n\n\n\tclass FileDialog {\n\n\t\tpublic:\n\n\t\t\tstatic std::wstring* OpenDirectory (std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);\n\t\t\tstatic std::wstring* OpenFile (std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);\n\t\t\tstatic void OpenFiles (std::vector<std::wstring*>* files, std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);\n\t\t\tstatic std::wstring* SaveFile (std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/Gamepad.h",
    "content": "#ifndef LIME_UI_GAMEPAD_H\n#define LIME_UI_GAMEPAD_H\n\n\nnamespace lime {\n\n\n\tclass Gamepad {\n\n\t\tpublic:\n\n\t\t\tstatic void AddMapping (const char* content);\n\t\t\tstatic const char* GetDeviceGUID (int id);\n\t\t\tstatic const char* GetDeviceName (int id);\n\t\t\tstatic void Rumble (int id, double lowFrequencyRumble, double highFrequencyRumble, int duration);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/GamepadEvent.h",
    "content": "#ifndef LIME_UI_GAMEPAD_EVENT_H\n#define LIME_UI_GAMEPAD_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum GamepadEventType {\n\n\t\tGAMEPAD_AXIS_MOVE,\n\t\tGAMEPAD_BUTTON_DOWN,\n\t\tGAMEPAD_BUTTON_UP,\n\t\tGAMEPAD_CONNECT,\n\t\tGAMEPAD_DISCONNECT\n\n\t};\n\n\n\tstruct GamepadEvent {\n\n\t\thl_type* t;\n\t\tint axis;\n\t\tint button;\n\t\tint id;\n\t\tGamepadEventType type;\n\t\tdouble axisValue;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tGamepadEvent ();\n\n\t\tstatic void Dispatch (GamepadEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/Haptic.h",
    "content": "#ifndef LIME_UI_HAPTIC_H\n#define LIME_UI_HAPTIC_H\n\n\nnamespace lime {\n\n\n\tclass Haptic {\n\n\t\tpublic:\n\n\t\t\tstatic void Vibrate (int period, int duration);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/Joystick.h",
    "content": "#ifndef LIME_UI_JOYSTICK_H\n#define LIME_UI_JOYSTICK_H\n\n\nnamespace lime {\n\n\n\tclass Joystick {\n\n\t\tpublic:\n\n\t\t\tstatic const char* GetDeviceGUID (int id);\n\t\t\tstatic const char* GetDeviceName (int id);\n\t\t\tstatic int GetNumAxes (int id);\n\t\t\tstatic int GetNumButtons (int id);\n\t\t\tstatic int GetNumHats (int id);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/JoystickEvent.h",
    "content": "#ifndef LIME_UI_JOYSTICK_EVENT_H\n#define LIME_UI_JOYSTICK_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tenum JoystickEventType {\n\n\t\tJOYSTICK_AXIS_MOVE = 0,\n\t\tJOYSTICK_HAT_MOVE = 1,\n\t\tJOYSTICK_BUTTON_DOWN = 3,\n\t\tJOYSTICK_BUTTON_UP = 4,\n\t\tJOYSTICK_CONNECT = 5,\n\t\tJOYSTICK_DISCONNECT = 6\n\n\t};\n\n\n\tstruct JoystickEvent {\n\n\t\thl_type* t;\n\t\tint id;\n\t\tint index;\n\t\tJoystickEventType type;\n\t\tint eventValue;\n\t\tdouble x;\n\t\tdouble y;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tJoystickEvent ();\n\n\t\tstatic void Dispatch (JoystickEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/KeyCode.h",
    "content": "#ifndef LIME_UI_KEY_CODE_H\n#define LIME_UI_KEY_CODE_H\n\n\n#include <system/System.h>\n\n\nnamespace lime {\n\n\n\tclass KeyCode {\n\n\t\tpublic:\n\n\t\t\tstatic int32_t FromScanCode (int32_t keyCode);\n\t\t\tstatic int32_t ToScanCode (int32_t keyCode);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/KeyEvent.h",
    "content": "#ifndef LIME_UI_KEY_EVENT_H\n#define LIME_UI_KEY_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tenum KeyEventType {\n\n\t\tKEY_DOWN,\n\t\tKEY_UP\n\n\t};\n\n\n\tstruct KeyEvent {\n\n\t\thl_type* t;\n\t\tdouble keyCode;\n\t\tint modifier;\n\t\tKeyEventType type;\n\t\tint windowID;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tKeyEvent ();\n\n\t\tstatic void Dispatch (KeyEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/MouseEvent.h",
    "content": "#ifndef LIME_UI_MOUSE_EVENT_H\n#define LIME_UI_MOUSE_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tenum MouseEventType {\n\n\t\tMOUSE_DOWN,\n\t\tMOUSE_UP,\n\t\tMOUSE_MOVE,\n\t\tMOUSE_WHEEL\n\n\t};\n\n\n\tstruct MouseEvent {\n\n\t\thl_type* t;\n\t\tint button;\n\t\tdouble movementX;\n\t\tdouble movementY;\n\t\tMouseEventType type;\n\t\tint windowID;\n\t\tdouble x;\n\t\tdouble y;\n\t\tint clickCount;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tMouseEvent ();\n\n\t\tstatic void Dispatch (MouseEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/TextEvent.h",
    "content": "#ifndef LIME_UI_TEXT_EVENT_H\n#define LIME_UI_TEXT_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tenum TextEventType {\n\n\t\tTEXT_INPUT,\n\t\tTEXT_EDIT\n\n\t};\n\n\n\tstruct TextEvent {\n\n\t\thl_type* t;\n\t\tint id;\n\t\tint length;\n\t\tint start;\n\t\tvbyte* text;\n\t\tTextEventType type;\n\t\tint windowID;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tTextEvent ();\n\n\t\tstatic void Dispatch (TextEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/TouchEvent.h",
    "content": "#ifndef LIME_UI_TOUCH_EVENT_H\n#define LIME_UI_TOUCH_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tenum TouchEventType {\n\n\t\tTOUCH_START,\n\t\tTOUCH_END,\n\t\tTOUCH_MOVE\n\n\t};\n\n\n\tstruct TouchEvent {\n\n\t\thl_type* t;\n\t\tint device;\n\t\tdouble dx;\n\t\tdouble dy;\n\t\tint id;\n\t\tdouble pressure;\n\t\tTouchEventType type;\n\t\tdouble x;\n\t\tdouble y;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tTouchEvent ();\n\n\t\tstatic void Dispatch (TouchEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/ui/Window.h",
    "content": "#ifndef LIME_UI_WINDOW_H\n#define LIME_UI_WINDOW_H\n\n\n#ifdef CreateWindow\n#undef CreateWindow\n#endif\n\n#include <app/Application.h>\n#include <graphics/ImageBuffer.h>\n#include <math/Rectangle.h>\n#include <system/CFFI.h>\n#include <system/DisplayMode.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tclass Window {\n\n\n\t\tpublic:\n\n\t\t\tvirtual ~Window () {};\n\n\t\t\tvirtual void Alert (const char* message, const char* title) = 0;\n\t\t\tvirtual void Close () = 0;\n\t\t\tvirtual void ContextFlip () = 0;\n\t\t\tvirtual void* ContextLock (bool useCFFIValue) = 0;\n\t\t\tvirtual void ContextMakeCurrent () = 0;\n\t\t\tvirtual void ContextUnlock () = 0;\n\t\t\tvirtual void Focus () = 0;\n\t\t\tvirtual void* GetContext () = 0;\n\t\t\tvirtual const char* GetContextType () = 0;\n\t\t\t// virtual Cursor GetCursor () = 0;\n\t\t\tvirtual int GetDisplay () = 0;\n\t\t\tvirtual void GetDisplayMode (DisplayMode* displayMode) = 0;\n\t\t\tvirtual int GetHeight () = 0;\n\t\t\tvirtual uint32_t GetID () = 0;\n\t\t\tvirtual bool GetMouseLock () = 0;\n\t\t\tvirtual float GetOpacity () = 0;\n\t\t\tvirtual double GetScale () = 0;\n\t\t\tvirtual bool GetTextInputEnabled () = 0;\n\t\t\tvirtual int GetWidth () = 0;\n\t\t\tvirtual int GetX () = 0;\n\t\t\tvirtual int GetY () = 0;\n\t\t\tvirtual void Move (int x, int y) = 0;\n\t\t\tvirtual void ReadPixels (ImageBuffer *buffer, Rectangle *rect) = 0;\n\t\t\tvirtual void Resize (int width, int height) = 0;\n\t\t\tvirtual void SetMinimumSize (int width, int height) = 0;\n\t\t\tvirtual void SetMaximumSize (int width, int height) = 0;\n\t\t\tvirtual bool SetBorderless (bool borderless) = 0;\n\t\t\tvirtual void SetCursor (Cursor cursor) = 0;\n\t\t\tvirtual void SetDisplayMode (DisplayMode* displayMode) = 0;\n\t\t\tvirtual bool SetFullscreen (bool fullscreen) = 0;\n\t\t\tvirtual void SetIcon (ImageBuffer *imageBuffer) = 0;\n\t\t\tvirtual bool SetMaximized (bool minimized) = 0;\n\t\t\tvirtual bool SetMinimized (bool minimized) = 0;\n\t\t\tvirtual void SetMouseLock (bool mouseLock) = 0;\n\t\t\tvirtual void SetOpacity (float opacity) = 0;\n\t\t\tvirtual bool SetResizable (bool resizable) = 0;\n\t\t\tvirtual void SetTextInputEnabled (bool enable) = 0;\n\t\t\tvirtual void SetTextInputRect (Rectangle *rect) = 0;\n\t\t\tvirtual const char* SetTitle (const char* title) = 0;\n\t\t\tvirtual bool SetVisible (bool visible) = 0;\n\t\t\tvirtual void WarpMouse (int x, int y) = 0;\n\n\t\t\tApplication* currentApplication;\n\t\t\tint flags;\n\n\n\t};\n\n\n\tWindow* CreateWindow (Application* application, int width, int height, int flags, const char* title);\n\n\n\tenum WindowFlags {\n\n\t\tWINDOW_FLAG_FULLSCREEN = 0x00000001,\n\t\tWINDOW_FLAG_BORDERLESS = 0x00000002,\n\t\tWINDOW_FLAG_RESIZABLE = 0x00000004,\n\t\tWINDOW_FLAG_HARDWARE = 0x00000008,\n\t\tWINDOW_FLAG_VSYNC = 0x00000010,\n\t\tWINDOW_FLAG_HW_AA = 0x00000020,\n\t\tWINDOW_FLAG_HW_AA_HIRES = 0x00000060,\n\t\tWINDOW_FLAG_ALLOW_SHADERS = 0x00000080,\n\t\tWINDOW_FLAG_REQUIRE_SHADERS = 0x00000100,\n\t\tWINDOW_FLAG_DEPTH_BUFFER = 0x00000200,\n\t\tWINDOW_FLAG_STENCIL_BUFFER = 0x00000400,\n\t\tWINDOW_FLAG_ALLOW_HIGHDPI = 0x00000800,\n\t\tWINDOW_FLAG_HIDDEN = 0x00001000,\n\t\tWINDOW_FLAG_MINIMIZED = 0x00002000,\n\t\tWINDOW_FLAG_MAXIMIZED = 0x00004000,\n\t\tWINDOW_FLAG_ALWAYS_ON_TOP = 0x00008000,\n\t\tWINDOW_FLAG_COLOR_DEPTH_32_BIT = 0x00010000\n\n\t};\n\n}\n\n\n#endif\n"
  },
  {
    "path": "project/include/ui/WindowEvent.h",
    "content": "#ifndef LIME_UI_WINDOW_EVENT_H\n#define LIME_UI_WINDOW_EVENT_H\n\n\n#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n#include <stdint.h>\n\n\nnamespace lime {\n\n\n\tenum WindowEventType {\n\n\t\tWINDOW_ACTIVATE,\n\t\tWINDOW_CLOSE,\n\t\tWINDOW_DEACTIVATE,\n\t\tWINDOW_ENTER,\n\t\tWINDOW_EXPOSE,\n\t\tWINDOW_FOCUS_IN,\n\t\tWINDOW_FOCUS_OUT,\n\t\tWINDOW_LEAVE,\n\t\tWINDOW_MAXIMIZE,\n\t\tWINDOW_MINIMIZE,\n\t\tWINDOW_MOVE,\n\t\tWINDOW_RESIZE,\n\t\tWINDOW_RESTORE,\n\t\tWINDOW_SHOW,\n\t\tWINDOW_HIDE\n\n\t};\n\n\n\tstruct WindowEvent {\n\n\t\thl_type* t;\n\t\tint height;\n\t\tWindowEventType type;\n\t\tint width;\n\t\tint windowID;\n\t\tint x;\n\t\tint y;\n\n\t\tstatic ValuePointer* callback;\n\t\tstatic ValuePointer* eventObject;\n\n\t\tWindowEvent ();\n\n\t\tstatic void Dispatch (WindowEvent* event);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/ArrayBufferView.h",
    "content": "#ifndef LIME_UTILS_ARRAY_BUFFER_VIEW_H\n#define LIME_UTILS_ARRAY_BUFFER_VIEW_H\n\n\n#include <system/CFFI.h>\n#include <utils/Bytes.h>\n\n\nnamespace lime {\n\n\n\tstruct ArrayBufferView {\n\n\t\thl_type* t;\n\t\t/*TypedArrayType*/ int type;\n\t\tBytes* buffer;\n\t\tint byteOffset;\n\t\tint byteLength;\n\t\tint length;\n\t\tint bytesPerElement;\n\n\t\tArrayBufferView (value arrayBufferView);\n\t\t~ArrayBufferView ();\n\n\t\tvoid Resize (int size);\n\t\tvoid Set (value bytes);\n\t\tvoid Set (const QuickVec<unsigned char> data);\n\t\tvalue Value ();\n\t\tvalue Value (value arrayBufferView);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/Bytes.h",
    "content": "#ifndef LIME_UTILS_BYTES_H\n#define LIME_UTILS_BYTES_H\n\n\n#include <system/CFFI.h>\n#include <utils/QuickVec.h>\n\n\nnamespace lime {\n\n\n\tstruct Bytes {\n\n\t\thl_type* t;\n\t\tint length;\n\t\tunsigned char* b;\n\n\t\tBytes ();\n\t\tBytes (value bytes);\n\t\t~Bytes ();\n\n\t\tvoid ReadFile (const char* path);\n\t\tvoid Resize (int size);\n\t\tvoid Set (value bytes);\n\t\tvoid Set (const QuickVec<unsigned char> data);\n\t\tvalue Value (value bytes);\n\t\tvalue Value ();\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/Object.h",
    "content": "#ifndef LIME_UTILS_OBJECT_H\n#define LIME_UTILS_OBJECT_H\n\n\nnamespace lime {\n\n\n\tclass Object {\n\n\n\t\tprotected:\n\n\t\t\tvirtual ~Object () {}\n\n\t\tpublic:\n\n\t\t\tObject (bool has_initial_ref = false) : ref_count (has_initial_ref ? 1 : 0) {}\n\n\t\t\tObject *grab () {\n\n\t\t\t\tref_count++;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tObject *IncRef () {\n\n\t\t\t\tref_count++;\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvoid DecRef () {\n\n\t\t\t\tref_count--;\n\n\t\t\t\tif (ref_count <= 0) {\n\n\t\t\t\t\tdelete this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvoid drop () {\n\n\t\t\t\tref_count--;\n\n\t\t\t\tif (ref_count <= 0) {\n\t\t\t\t\tdelete this;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tint ref_count;\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/QuickVec.h",
    "content": "#ifndef LIME_UTILS_QUICK_VEC_H\n#define LIME_UTILS_QUICK_VEC_H\n\n\n#include <algorithm>\n#include <stdlib.h>\n#include <string.h>\n\n\nnamespace lime {\n\n\n\ttemplate<typename T>\n\tvoid DoDelete(T &item) { }\n\n\ttemplate<typename T>\n\tvoid DoDelete(T *&item) {\n\t\tdelete item;\n\t\titem = 0;\n\t}\n\n\n\t// Little vector/set class, optimised for small data and not using many malloc calls.\n\t// Data are allocated with \"malloc\", so they should not rely on constructors etc.\n\ttemplate<typename T_,int QBUF_SIZE_=16>\n\tclass QuickVec {\n\n\n\t\tenum { QBufSize = QBUF_SIZE_ };\n\n\n\t\tpublic:\n\n\t\t\ttypedef T_ *iterator;\n\t\t\ttypedef const T_ * const_iterator;\n\n\n\t\tpublic:\n\n\t\t\tQuickVec () {\n\n\t\t\t\tmPtr = QBUF_SIZE_==0 ? 0 : mQBuf;\n\t\t\t\tmAlloc = QBufSize;\n\t\t\t\tmSize = 0;\n\n\t\t\t}\n\n\n\t\t\tQuickVec (const QuickVec<T_,QBUF_SIZE_> &inRHS) {\n\n\t\t\t\tif (QBUF_SIZE_!=0 && inRHS.mSize<=QBufSize) {\n\t\t\t\t\tmAlloc = QBufSize;\n\t\t\t\t\tmPtr = mQBuf;\n\t\t\t\t} else {\n\t\t\t\t\tmAlloc = inRHS.mAlloc;\n\t\t\t\t\tmPtr = (T_ *)malloc(mAlloc * sizeof(T_));\n\t\t\t\t}\n\n\t\t\t\tmSize = inRHS.mSize;\n\t\t\t\tmemcpy (mPtr,inRHS.mPtr,sizeof(T_)*mSize);\n\n\t\t\t}\n\n\n\t\t\tint Mem() const { return mAlloc * sizeof(T_); }\n\n\n\t\t\tQuickVec (const T_ *inData,int inLen) {\n\n\t\t\t\tmPtr = QBUF_SIZE_==0 ? 0 : mQBuf;\n\t\t\t\tmAlloc = QBufSize;\n\t\t\t\tmSize = 0;\n\n\t\t\t\tresize(inLen);\n\t\t\t\tmemcpy(mPtr,inData,sizeof(T_)*inLen);\n\n\t\t\t}\n\n\n\t\t\tQuickVec (int inLen) {\n\n\t\t\t\tmPtr = QBUF_SIZE_==0 ? 0 : mQBuf;\n\t\t\t\tmAlloc = QBufSize;\n\t\t\t\tmSize = 0;\n\n\t\t\t\tresize(inLen);\n\n\t\t\t}\n\n\n\t\t\t~QuickVec () {\n\n\t\t\t\tif (QBUF_SIZE_==0 || mPtr!=mQBuf){\n\t\t\t\t\tif (mPtr) {\n\t\t\t\t\t\tfree(mPtr);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvoid clear () {\n\n\t\t\t\tif (QBUF_SIZE_==0) {\n\n\t\t\t\t\tif (mPtr) {\n\t\t\t\t\t\tfree(mPtr);\n\t\t\t\t\t}\n\n\t\t\t\t\tmPtr = 0;\n\t\t\t\t\tmAlloc = 0;\n\n\t\t\t\t} else if (mPtr!=mQBuf) {\n\n\t\t\t\t\tfree(mPtr);\n\t\t\t\t\tmPtr = mQBuf;\n\t\t\t\t\tmAlloc = QBufSize;\n\n\t\t\t\t}\n\n\t\t\t\tmSize = 0;\n\n\t\t\t}\n\n\n\t\t\tvoid Set(const T_ *inData,int inN) {\n\n\t\t\t\tresize(inN);\n\t\t\t\tif (inN) {\n\t\t\t\t\tmemcpy(mPtr,inData,inN*sizeof(T_));\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvoid Zero() {\n\t\t\t\tif (mPtr && mSize)\n\t\t\t\t\tmemset(mPtr,0,mSize*sizeof(T_));\n\t\t\t}\n\n\n\t\t\t// This assumes the values in the array are sorted.\n\t\t\ttemplate<typename X_, typename D_>\n\t\t\tvoid Change(X_ inValue,D_ inDiff) {\n\t\t\t\tif (mSize==0)\n\t\t\t\t{\n\t\t\t\t\tmPtr[mSize++] = T_(inValue,inDiff);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Before/at start\n\t\t\t\tif (mPtr[0]==inValue)\n\t\t\t\t{\n\t\t\t\t\tmPtr[0] += inDiff;\n\t\t\t\t}\n\t\t\t\telse if (mPtr[0]>inValue)\n\t\t\t\t{\n\t\t\t\t\tInsertAt(0, T_(inValue,inDiff) );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tint last = mSize-1;\n\t\t\t\t\t// After/on end\n\t\t\t\t\tif (mPtr[last]==inValue)\n\t\t\t\t\t{\n\t\t\t\t\t\tmPtr[last] += inDiff;\n\t\t\t\t\t}\n\t\t\t\t\telse if (mPtr[last]<inValue)\n\t\t\t\t\t{\n\t\t\t\t\t\tGrow();\n\t\t\t\t\t\tmPtr[mSize] = T_(inValue,inDiff);\n\t\t\t\t\t\t++mSize;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// between 0 ... last\n\t\t\t\t\t\tint min = 0;\n\t\t\t\t\t\tint max = last;\n\n\t\t\t\t\t\twhile(max>min+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint middle = (max+min+1)/2;\n\t\t\t\t\t\t\tT_ &v = mPtr[middle];\n\t\t\t\t\t\t\tif (v==inValue)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tv += inDiff;\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (v<inValue)\n\t\t\t\t\t\t\t\tmin = middle;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tmax = middle;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Not found, must be between min and max (=min+1)\n\t\t\t\t\t\tInsertAt(min+1,T_(inValue,inDiff) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// This assumes the values in the array are sorted.\n\t\t\tvoid Toggle(T_ inValue) {\n\t\t\t\tif (mSize==0)\n\t\t\t\t{\n\t\t\t\t\tmPtr[mSize++] = inValue;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Before/at start\n\t\t\t\tif (inValue<=mPtr[0])\n\t\t\t\t{\n\t\t\t\t\tif (inValue==mPtr[0])\n\t\t\t\t\t\tEraseAt(0);\n\t\t\t\t\telse\n\t\t\t\t\t\tInsertAt(0,inValue);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tint last = mSize-1;\n\t\t\t\t\t// After/on end\n\t\t\t\t\tif (inValue>=mPtr[last])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (inValue==mPtr[last])\n\t\t\t\t\t\t\tEraseAt(last);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tGrow();\n\t\t\t\t\t\t\tmPtr[mSize] = inValue;\n\t\t\t\t\t\t\t++mSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// between 0 ... last\n\t\t\t\t\t\tint min = 0;\n\t\t\t\t\t\tint max = last;\n\n\t\t\t\t\t\twhile(max>min+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint middle = (max+min+1)/2;\n\t\t\t\t\t\t\tT_ v = mPtr[middle];\n\t\t\t\t\t\t\tif (v==inValue)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tEraseAt(middle);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (v<inValue)\n\t\t\t\t\t\t\t\tmin = middle;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tmax = middle;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Not found, must be between min and max (=min+1)\n\t\t\t\t\t\tInsertAt(min+1,inValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tinline void Grow() {\n\t\t\t\tif (mSize>=mAlloc)\n\t\t\t\t{\n\t\t\t\t\tif (QBUF_SIZE_!=0 && mPtr==mQBuf)\n\t\t\t\t\t{\n\t\t\t\t\t\tmPtr = (T_ *)malloc(sizeof(T_)*(QBufSize*2));\n\t\t\t\t\t\tmemcpy(mPtr, mQBuf, sizeof(mQBuf));\n\t\t\t\t\t\tmAlloc = QBufSize*2;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (mAlloc)\n\t\t\t\t\t\t\tmAlloc *= 2;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmAlloc = 16;\n\t\t\t\t\t\tmPtr = (T_*)realloc(mPtr, sizeof(T_)*mAlloc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvoid reserve(int inSize) {\n\t\t\t\tif (mAlloc<inSize && (QBUF_SIZE_==0 || inSize>QBufSize) )\n\t\t\t\t{\n\t\t\t\t\tmAlloc = inSize;\n\n\t\t\t\t\tif (QBUF_SIZE_==0 || mPtr!=mQBuf)\n\t\t\t\t\t{\n\t\t\t\t\t\tmPtr = (T_ *)realloc(mPtr,sizeof(T_)*mAlloc);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tT_ *buf = (T_ *)malloc(sizeof(T_)*mAlloc);\n\t\t\t\t\t\tmemcpy(buf,mPtr,mSize*sizeof(T_));\n\t\t\t\t\t\tmPtr = buf;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvoid resize(int inSize) {\n\t\t\t\tif (mAlloc<inSize)\n\t\t\t\t{\n\t\t\t\t\tif (QBUF_SIZE_!=0 && mPtr==mQBuf)\n\t\t\t\t\t{\n\t\t\t\t\t\tmAlloc = inSize;\n\t\t\t\t\t\tmPtr = (T_ *)malloc(sizeof(T_)*(mAlloc));\n\t\t\t\t\t\tmemcpy(mPtr, mQBuf, sizeof(T_)*mSize);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tmAlloc = inSize;\n\t\t\t\t\t\tmPtr = (T_*)realloc(mPtr, sizeof(T_)*mAlloc);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tmSize = inSize;\n\t\t\t}\n\n\n\t\t\tinline void push_back(const T_ &inVal) {\n\t\t\t\tGrow();\n\t\t\t\tmPtr[mSize++] = inVal;\n\t\t\t}\n\n\n\t\t\tinline T_ qpop() {\n\t\t\t\treturn mPtr[--mSize];\n\t\t\t}\n\n\n\t\t\tinline void EraseAt(int inPos) {\n\t\t\t\tmemmove(mPtr + inPos, mPtr + inPos + 1, (mSize-inPos-1) * sizeof(T_) );\n\t\t\t\t--mSize;\n\t\t\t}\n\n\n\t\t\tinline void EraseAt(int inFirst,int inLast) {\n\t\t\t\tmemmove(mPtr + inFirst, mPtr + inLast, (mSize-inLast) * sizeof(T_) );\n\t\t\t\tmSize -= inLast-inFirst;\n\t\t\t}\n\n\n\t\t\tvoid erase(int inFirst,int inLen) {\n\t\t\t\tif (inFirst>mSize || inFirst<0)\n\t\t\t\t\treturn;\n\t\t\t\tif (inFirst+inLen>=mSize || inLen<0)\n\t\t\t\t\tresize(inFirst);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmemmove(mPtr + inFirst, mPtr + inFirst + inLen, (mSize-inFirst-inLen) * sizeof(T_) );\n\t\t\t\t\tmSize -= inLen;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tinline void InsertAt(int inPos,const T_ &inValue) {\n\t\t\t\tGrow();\n\t\t\t\tmemmove(mPtr + inPos + 1, mPtr + inPos, (mSize-inPos) * sizeof(T_) );\n\t\t\t\tmemcpy(mPtr+inPos,&inValue, sizeof(T_));\n\t\t\t\t++mSize;\n\t\t\t}\n\n\n\t\t\tinline void InsertAt(int inPos,const T_ *inValues,int inN) {\n\t\t\t\tresize(mSize+inN);\n\t\t\t\tmemmove(mPtr + inPos + inN, mPtr + inPos, (mSize-inPos-inN) * sizeof(T_) );\n\t\t\t\tmemcpy(mPtr+inPos,inValues,inN*sizeof(T_));\n\t\t\t}\n\n\n\t\t\tbool operator == (const QuickVec<T_,QBUF_SIZE_> &inRHS) { return (*mPtr == *(inRHS.mPtr)); }\n\t\t\tbool operator != (const QuickVec<T_,QBUF_SIZE_> &inRHS) { return !(*mPtr == *(inRHS.mPtr)); }\n\n\n\t\t\tinline int size() const { return mSize; }\n\t\t\tinline bool empty() const { return mSize==0; }\n\t\t\tinline T_& operator[](int inIndex) { return mPtr[inIndex]; }\n\t\t\tinline T_& last() { return mPtr[mSize-1]; }\n\t\t\tinline const T_& operator[](int inIndex) const { return mPtr[inIndex]; }\n\t\t\tinline iterator begin() { return mPtr; }\n\t\t\tinline iterator rbegin() { return mPtr + mSize -1; }\n\t\t\tinline iterator end() { return mPtr + mSize; }\n\t\t\tinline const_iterator begin() const { return mPtr; }\n\t\t\tinline const_iterator rbegin() const { return mPtr + mSize - 1; }\n\t\t\tinline const_iterator end() const { return mPtr + mSize; }\n\n\n\t\t\tvoid swap( QuickVec<T_,QBUF_SIZE_> &inRHS ) {\n\t\t\t\tif (QBUF_SIZE_==0)\n\t\t\t\t{\n\t\t\t\t\tstd::swap(mPtr,inRHS.mPtr);\n\t\t\t\t}\n\t\t\t\telse if (mPtr!=mQBuf)\n\t\t\t\t{\n\t\t\t\t\t// Both \"real\" pointers - just swap them\n\t\t\t\t\tif (inRHS.mPtr!=inRHS.mQBuf)\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::swap(mPtr,inRHS.mPtr);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// RHS in in the qbuf, we have a pointer\n\t\t\t\t\t\tmemcpy(mQBuf,inRHS.mQBuf,inRHS.mSize*sizeof(T_));\n\t\t\t\t\t\tinRHS.mPtr = mPtr;\n\t\t\t\t\t\tmPtr = mQBuf;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// We have a qbuf, rhs has a pointer\n\t\t\t\t\tif (inRHS.mPtr!=inRHS.mQBuf)\n\t\t\t\t\t{\n\t\t\t\t\t\tmemcpy(inRHS.mQBuf,mQBuf,mSize*sizeof(T_));\n\t\t\t\t\t\tmPtr = inRHS.mPtr;\n\t\t\t\t\t\tinRHS.mPtr = inRHS.mQBuf;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Both using QBuf ...\n\t\t\t\t\t\tif (mSize && inRHS.mSize)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tT_ tmp[QBufSize];\n\t\t\t\t\t\t\tmemcpy(tmp,mPtr,mSize*sizeof(T_));\n\t\t\t\t\t\t\tmemcpy(mPtr,inRHS.mPtr,inRHS.mSize*sizeof(T_));\n\t\t\t\t\t\t\tmemcpy(inRHS.mPtr,tmp,mSize*sizeof(T_));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (mSize)\n\t\t\t\t\t\t\tmemcpy(inRHS.mQBuf,mQBuf,mSize*sizeof(T_));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmemcpy(mQBuf,inRHS.mQBuf,inRHS.mSize*sizeof(T_));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstd::swap(mAlloc,inRHS.mAlloc);\n\t\t\t\tstd::swap(mSize,inRHS.mSize);\n\t\t\t}\n\n\n\t\t\tQuickVec<T_,QBUF_SIZE_> &operator=(const QuickVec<T_,QBUF_SIZE_> &inRHS) {\n\t\t\t\tif ( (QBUF_SIZE_==0 || mPtr!=mQBuf) && mPtr )\n\t\t\t\t\tfree(mPtr);\n\n\t\t\t\tif (QBUF_SIZE_!=0 && inRHS.mSize<=QBufSize)\n\t\t\t\t{\n\t\t\t\t\tmPtr = mQBuf;\n\t\t\t\t\tmAlloc = QBufSize;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmAlloc = inRHS.mAlloc;\n\t\t\t\t\tmPtr = (T_ *)(mAlloc ? malloc( mAlloc * sizeof(T_)) : 0);\n\t\t\t\t}\n\t\t\t\tmSize = inRHS.mSize;\n\t\t\t\tif (mSize)\n\t\t\t\t\tmemcpy(mPtr,inRHS.mPtr,mSize*sizeof(T_));\n\t\t\t\treturn *this;\n\t\t\t}\n\n\n\t\t\tvoid DeleteAll() {\n\t\t\t\tfor(int i=0;i<mSize;i++)\n\t\t\t\t\tDoDelete( mPtr[i] );\n\t\t\t\tresize(0);\n\t\t\t}\n\n\n\t\t\tvoid append(const QuickVec<T_> &inOther) {\n\t\t\t\tint s = mSize;\n\t\t\t\tresize(mSize+inOther.mSize);\n\t\t\t\tfor(int i=0;i<inOther.mSize;i++)\n\t\t\t\t\tmPtr[s+i] = inOther[i];\n\t\t\t}\n\n\n\t\t\tvoid append(const T_ *inOther,int inLen) {\n\t\t\t\tint s = mSize;\n\t\t\t\tresize(mSize+inLen);\n\t\t\t\tfor(int i=0;i<inLen;i++)\n\t\t\t\t\tmPtr[s+i] = inOther[i];\n\t\t\t}\n\n\n\t\t\tT_  *mPtr;\n\t\t\tT_  mQBuf[QBufSize==0?1:QBufSize];\n\t\t\tint mAlloc;\n\t\t\tint mSize;\n\n\n\t};\n\n\n}\n\n\n#endif\n"
  },
  {
    "path": "project/include/utils/Resource.h",
    "content": "#ifndef LIME_UTILS_RESOURCE_H\n#define LIME_UTILS_RESOURCE_H\n\n\n#include <system/CFFI.h>\n#include <utils/Bytes.h>\n\n\nnamespace lime {\n\n\n\tstruct Resource {\n\n\n\t\tResource () : data (NULL), path (NULL) {}\n\t\tResource (const char* path) : data (NULL), path (path) {}\n\t\tResource (hl_vstring* path) : data (NULL), path (path ? hl_to_utf8 ((const uchar*)path->bytes) : NULL) {}\n\t\tResource (Bytes* data) : data (data), path (NULL) {}\n\n\t\tBytes* data;\n\t\tconst char* path;\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/compress/LZMA.h",
    "content": "#ifndef LIME_UTILS_COMPRESS_LZMA_H\n#define LIME_UTILS_COMPRESS_LZMA_H\n\n\n#include <utils/Bytes.h>\n\n\nnamespace lime {\n\n\n\tclass LZMA {\n\n\n\t\tpublic:\n\n\t\t\tstatic void Compress (Bytes* data, Bytes* result);\n\t\t\tstatic void Decompress (Bytes* data, Bytes* result);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/compress/Zlib.h",
    "content": "#ifndef LIME_UTILS_COMPRESS_ZLIB_H\n#define LIME_UTILS_COMPRESS_ZLIB_H\n\n\n#include <utils/Bytes.h>\n\n\nnamespace lime {\n\n\n\tenum ZlibType {\n\n\t\tDEFLATE,\n\t\tGZIP,\n\t\tZLIB\n\n\t};\n\n\n\tclass Zlib {\n\n\n\t\tpublic:\n\n\t\t\tstatic void Compress (ZlibType type, Bytes* data, Bytes* result);\n\t\t\tstatic void Decompress (ZlibType type, Bytes* data, Bytes* result);\n\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/include/utils/stdint.h",
    "content": "#ifndef HX_WINDOWS\n#include <stdint.h>\n#else\n\n\n// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124\n//\n//  Copyright (c) 2006-2013 Alexander Chemeris\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. Neither the name of the product nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef _MSC_VER // [\n#error \"Use this header only with Microsoft Visual C++ compilers!\"\n#endif // _MSC_VER ]\n\n#ifndef _MSC_STDINT_H_ // [\n#define _MSC_STDINT_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#if _MSC_VER >= 1600 // [\n#include <stdint.h>\n#else // ] _MSC_VER >= 1600 [\n\n#include <limits.h>\n\n// For Visual Studio 6 in C++ mode and for many Visual Studio versions when\n// compiling for ARM we should wrap <wchar.h> include with 'extern \"C++\" {}'\n// or compiler give many errors like this:\n//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#  include <wchar.h>\n#ifdef __cplusplus\n}\n#endif\n\n// Define _W64 macros to mark types changing their size, like intptr_t.\n#ifndef _W64\n#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300\n#     define _W64 __w64\n#  else\n#     define _W64\n#  endif\n#endif\n\n\n// 7.18.1 Integer types\n\n// 7.18.1.1 Exact-width integer types\n\n// Visual Studio 6 and Embedded Visual C++ 4 doesn't\n// realize that, e.g. char has the same size as __int8\n// so we give up on __intX for them.\n#if (_MSC_VER < 1300)\n   typedef signed char       int8_t;\n   typedef signed short      int16_t;\n   typedef signed int        int32_t;\n   typedef unsigned char     uint8_t;\n   typedef unsigned short    uint16_t;\n   typedef unsigned int      uint32_t;\n#else\n   typedef signed __int8     int8_t;\n   typedef signed __int16    int16_t;\n   typedef signed __int32    int32_t;\n   typedef unsigned __int8   uint8_t;\n   typedef unsigned __int16  uint16_t;\n   typedef unsigned __int32  uint32_t;\n#endif\ntypedef signed __int64       int64_t;\ntypedef unsigned __int64     uint64_t;\n\n\n// 7.18.1.2 Minimum-width integer types\ntypedef int8_t    int_least8_t;\ntypedef int16_t   int_least16_t;\ntypedef int32_t   int_least32_t;\ntypedef int64_t   int_least64_t;\ntypedef uint8_t   uint_least8_t;\ntypedef uint16_t  uint_least16_t;\ntypedef uint32_t  uint_least32_t;\ntypedef uint64_t  uint_least64_t;\n\n// 7.18.1.3 Fastest minimum-width integer types\ntypedef int8_t    int_fast8_t;\ntypedef int16_t   int_fast16_t;\ntypedef int32_t   int_fast32_t;\ntypedef int64_t   int_fast64_t;\ntypedef uint8_t   uint_fast8_t;\ntypedef uint16_t  uint_fast16_t;\ntypedef uint32_t  uint_fast32_t;\ntypedef uint64_t  uint_fast64_t;\n\n// 7.18.1.4 Integer types capable of holding object pointers\n#ifdef _WIN64 // [\n   typedef signed __int64    intptr_t;\n   typedef unsigned __int64  uintptr_t;\n#else // _WIN64 ][\n   typedef _W64 signed int   intptr_t;\n   typedef _W64 unsigned int uintptr_t;\n#endif // _WIN64 ]\n\n// 7.18.1.5 Greatest-width integer types\ntypedef int64_t   intmax_t;\ntypedef uint64_t  uintmax_t;\n\n\n// 7.18.2 Limits of specified-width integer types\n\n#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259\n\n// 7.18.2.1 Limits of exact-width integer types\n#define INT8_MIN     ((int8_t)_I8_MIN)\n#define INT8_MAX     _I8_MAX\n#define INT16_MIN    ((int16_t)_I16_MIN)\n#define INT16_MAX    _I16_MAX\n#define INT32_MIN    ((int32_t)_I32_MIN)\n#define INT32_MAX    _I32_MAX\n#define INT64_MIN    ((int64_t)_I64_MIN)\n#define INT64_MAX    _I64_MAX\n#define UINT8_MAX    _UI8_MAX\n#define UINT16_MAX   _UI16_MAX\n#define UINT32_MAX   _UI32_MAX\n#define UINT64_MAX   _UI64_MAX\n\n// 7.18.2.2 Limits of minimum-width integer types\n#define INT_LEAST8_MIN    INT8_MIN\n#define INT_LEAST8_MAX    INT8_MAX\n#define INT_LEAST16_MIN   INT16_MIN\n#define INT_LEAST16_MAX   INT16_MAX\n#define INT_LEAST32_MIN   INT32_MIN\n#define INT_LEAST32_MAX   INT32_MAX\n#define INT_LEAST64_MIN   INT64_MIN\n#define INT_LEAST64_MAX   INT64_MAX\n#define UINT_LEAST8_MAX   UINT8_MAX\n#define UINT_LEAST16_MAX  UINT16_MAX\n#define UINT_LEAST32_MAX  UINT32_MAX\n#define UINT_LEAST64_MAX  UINT64_MAX\n\n// 7.18.2.3 Limits of fastest minimum-width integer types\n#define INT_FAST8_MIN    INT8_MIN\n#define INT_FAST8_MAX    INT8_MAX\n#define INT_FAST16_MIN   INT16_MIN\n#define INT_FAST16_MAX   INT16_MAX\n#define INT_FAST32_MIN   INT32_MIN\n#define INT_FAST32_MAX   INT32_MAX\n#define INT_FAST64_MIN   INT64_MIN\n#define INT_FAST64_MAX   INT64_MAX\n#define UINT_FAST8_MAX   UINT8_MAX\n#define UINT_FAST16_MAX  UINT16_MAX\n#define UINT_FAST32_MAX  UINT32_MAX\n#define UINT_FAST64_MAX  UINT64_MAX\n\n// 7.18.2.4 Limits of integer types capable of holding object pointers\n#ifdef _WIN64 // [\n#  define INTPTR_MIN   INT64_MIN\n#  define INTPTR_MAX   INT64_MAX\n#  define UINTPTR_MAX  UINT64_MAX\n#else // _WIN64 ][\n#  define INTPTR_MIN   INT32_MIN\n#  define INTPTR_MAX   INT32_MAX\n#  define UINTPTR_MAX  UINT32_MAX\n#endif // _WIN64 ]\n\n// 7.18.2.5 Limits of greatest-width integer types\n#define INTMAX_MIN   INT64_MIN\n#define INTMAX_MAX   INT64_MAX\n#define UINTMAX_MAX  UINT64_MAX\n\n// 7.18.3 Limits of other integer types\n\n#ifdef _WIN64 // [\n#  define PTRDIFF_MIN  _I64_MIN\n#  define PTRDIFF_MAX  _I64_MAX\n#else  // _WIN64 ][\n#  define PTRDIFF_MIN  _I32_MIN\n#  define PTRDIFF_MAX  _I32_MAX\n#endif  // _WIN64 ]\n\n#define SIG_ATOMIC_MIN  INT_MIN\n#define SIG_ATOMIC_MAX  INT_MAX\n\n#ifndef SIZE_MAX // [\n#  ifdef _WIN64 // [\n#     define SIZE_MAX  _UI64_MAX\n#  else // _WIN64 ][\n#     define SIZE_MAX  _UI32_MAX\n#  endif // _WIN64 ]\n#endif // SIZE_MAX ]\n\n// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>\n#ifndef WCHAR_MIN // [\n#  define WCHAR_MIN  0\n#endif  // WCHAR_MIN ]\n#ifndef WCHAR_MAX // [\n#  define WCHAR_MAX  _UI16_MAX\n#endif  // WCHAR_MAX ]\n\n#define WINT_MIN  0\n#define WINT_MAX  _UI16_MAX\n\n#endif // __STDC_LIMIT_MACROS ]\n\n\n// 7.18.4 Limits of other integer types\n\n#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\n\n// 7.18.4.1 Macros for minimum-width integer constants\n\n#define INT8_C(val)  val##i8\n#define INT16_C(val) val##i16\n#define INT32_C(val) val##i32\n#define INT64_C(val) val##i64\n\n#define UINT8_C(val)  val##ui8\n#define UINT16_C(val) val##ui16\n#define UINT32_C(val) val##ui32\n#define UINT64_C(val) val##ui64\n\n// 7.18.4.2 Macros for greatest-width integer constants\n// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.\n// Check out Issue 9 for the details.\n#ifndef INTMAX_C //   [\n#  define INTMAX_C   INT64_C\n#endif // INTMAX_C    ]\n#ifndef UINTMAX_C //  [\n#  define UINTMAX_C  UINT64_C\n#endif // UINTMAX_C   ]\n\n#endif // __STDC_CONSTANT_MACROS ]\n\n#endif // _MSC_VER >= 1600 ]\n\n#endif // _MSC_STDINT_H_ ]\n\n\n#endif"
  },
  {
    "path": "project/include/vm/NekoVM.h",
    "content": "#ifndef LIME_VM_NEKOVM_H\n#define LIME_VM_NEKOVM_H\n\n\nnamespace lime {\n\n\n\tclass NekoVM {\n\n\t\tpublic:\n\n\t\t\tstatic void Execute (const char *module);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/lib/README.md",
    "content": "# Submodule projects\nLime includes code from several other C/C++ libraries, listed below. Lime prefers to use GitHub repositories as its submodules, purely so that the links will be clickable when viewed on github.com. However, some of these repos are mirrors, with the development being conducted elsewhere.\n\n**_Always submit issues and pull requests to the primary repo, not to a GitHub mirror._**\n\n- [**Cairo**](https://www.cairographics.org/) | [primary repo](https://gitlab.freedesktop.org/cairo/cairo) | [GitHub mirror](https://github.com/freedesktop/cairo)\n- [**cURL**](https://curl.se/) | [primary repo](https://github.com/curl/curl)\n- **efsw** | [primary repo](https://github.com/SpartanJ/efsw)\n- [**FreeType**](https://freetype.org/) | [primary repo](https://gitlab.freedesktop.org/freetype/freetype) | [GitHub mirror](https://github.com/freetype/freetype)\n- [**HarfBuzz**](https://harfbuzz.github.io/) | [primary repo](https://github.com/harfbuzz/harfbuzz)\n- [**HashLink**](https://hashlink.haxe.org/) | [primary repo](https://github.com/HaxeFoundation/hashlink)\n- [**libjpeg-turbo**](https://www.libjpeg-turbo.org/) | [primary repo](https://github.com/libjpeg-turbo/libjpeg-turbo)\n- **LZMA** | [download](https://www.7-zip.org/sdk.html) | [unofficial GitHub mirror](https://github.com/openfl/liblzma)\n- [**mbed TLS**](https://tls.mbed.org/) | [primary repo](https://github.com/Mbed-TLS/mbedtls)\n- [**MojoAL**](https://icculus.org/mojoAL/) | [primary repo](https://github.com/icculus/mojoAL/)\n- [**Neko**](https://nekovm.org/) | [primary repo](https://github.com/HaxeFoundation/neko)\n- [**Ogg**](https://www.xiph.org/ogg/) | [primary repo](https://github.com/xiph/ogg)\n- [**OpenAL Soft**](https://openal-soft.org/) | [primary repo](https://github.com/kcat/openal-soft)\n- [**Pixman**](http://pixman.org/) | [primary repo](https://gitlab.freedesktop.org/pixman/pixman) | [GitHub mirror](https://github.com/freedesktop/pixman)\n- [**libpng**](http://www.libpng.org/pub/png/libpng.html) | [primary repo](https://sourceforge.net/p/libpng/code) | [GitHub mirror](https://github.com/glennrp/libpng)[^1]\n- [**SDL**](https://www.libsdl.org/) | [primary repo](https://github.com/libsdl-org/SDL)\n- [**tiny file dialogs**](https://sourceforge.net/projects/tinyfiledialogs/) | [primary repo](https://sourceforge.net/p/tinyfiledialogs/code) | [unofficial GitHub mirror](https://github.com/openfl/libtinyfiledialogs)[^1]\n- [**Vorbis**](https://www.xiph.org/vorbis/) | [primary repo](https://github.com/xiph/vorbis)\n- [**libvpx**](https://www.webmproject.org/tools/) | [primary repo](https://chromium.googlesource.com/webm/libvpx/) | [GitHub mirror](https://github.com/webmproject/libvpx/)\n- [**libwebm**](https://www.webmproject.org/about/) | [primary repo](https://chromium.googlesource.com/webm/libwebm) | [GitHub mirror](https://github.com/webmproject/libwebm)\n- [**zlib**](https://zlib.net/) | [primary repo](https://github.com/madler/zlib)\n\n[^1]: Attempting to make a shallow clone of a SourceForge repo (as GitHub Actions does) usually produces the error \"Server does not allow request for unadvertised object.\" Only the most recent commit is \"advertised,\" and all others cause the error. As long as this is the case, Lime will have to use GitHub mirrors of SourceForge repos.\n"
  },
  {
    "path": "project/lib/cairo-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-cairo\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/src/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/default/\" unless=\"windows || mac || linux\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/linux/\" if=\"linux\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/windows/\" if=\"windows\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/cairo/configs/mac/\" if=\"mac\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/cairo/src/\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/freetype/include/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/freetype/include/\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/pixman/pixman/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/pixman/pixman/\" />\n\n\t\t<compilerflag value=\"-DNDEBUG\" unless=\"debug\" />\n\t\t<compilerflag value=\"-DHAVE_CONFIG_H\" />\n\t\t<compilerflag value=\"-DCAIRO_WIN32_STATIC_BUILD\" if=\"windows\" />\n\n\t\t<compilerflag value=\"-Wno-attributes\" unless=\"windows\" />\n\t\t<compilerflag value=\"-Wno-enum-conversion\" unless=\"windows\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-analysis-surface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-arc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-array.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-atomic.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-base64-stream.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-base85-stream.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-bentley-ottmann-rectangular.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-bentley-ottmann-rectilinear.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-bentley-ottmann.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-botor-scan-converter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-boxes-intersect.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-boxes.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-cache.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-clip-boxes.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-clip-polygon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-clip-region.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-clip-surface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-clip-tor-scan-converter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-clip.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-color.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-composite-rectangles.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-contour.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-damage.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-debug.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-default-context.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-device.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-error.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-fallback-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-fixed.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-font-face-twin-data.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-font-face-twin.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-font-face.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-font-options.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-freed-pool.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-freelist.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-ft-font.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-gstate.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-hash.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-hull.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-image-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-image-info.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-image-source.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-image-surface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-line.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-lzw.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-mask-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-matrix.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-mempool.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-mesh-pattern-rasterizer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-misc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-mono-scan-converter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-mutex.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-no-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-observer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-output-stream.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-paginated-surface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-bounds.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-fill.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-fixed.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-in-fill.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-stroke-boxes.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-stroke-polygon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-stroke-traps.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-stroke-tristrip.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path-stroke.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-path.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-pattern.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-pen.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-polygon-intersect.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-polygon-reduce.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-polygon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-raster-source-pattern.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-recording-surface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-rectangle.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-rectangular-scan-converter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-region.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-rtree.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-scaled-font.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-shape-mask-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-slope.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-spans-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-spans.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-spline.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-stroke-dash.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-stroke-style.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-clipper.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-fallback.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-observer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-offset.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-snapshot.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-subsurface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface-wrapper.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-surface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-time.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-tor-scan-converter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-tor22-scan-converter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-toy-font-face.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-traps-compositor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-traps.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-tristrip.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-unicode.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-user-font.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-version.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo-wideint.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/cairo/src/cairo.c\" />\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/curl-files.xml",
    "content": "<xml>\n\t<include name=\"${HXCPP}/project/thirdparty/mbedtls-files.xml\" noerror=\"true\" if=\"static_link\" />\n\t<set name=\"HAS_HXCPP_MBEDTLS_FLAGS\" value=\"1\" if=\"MBEDTLS_DIR\" />\n\t<include name=\"${HXCPP}/src/hx/libs/ssl/Build.xml\" unless=\"MBEDTLS_DIR\"/>\n\n\t<files id=\"native-toolkit-curl-depends\"  >\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/curl.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/curl/lib/curl_config.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/curlver.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/easy.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/mprintf.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/multi.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/stdcheaders.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/curl/include/curl/typecheck-gcc.h\" />\n \t</files>\n\n\t<files id=\"native-toolkit-curl\" tags=\"\">\n\n\t\t<cache value=\"1\" />\n\t\t<tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\t\t<depend files=\"native-toolkit-curl-depends\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/curl/lib/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/curl/include/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/curl/lib/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/zlib/\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/axtls\" if=\"NATIVE_TOOLKIT_HAVE_AXTLS\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/mbedtls/include\" if=\"NATIVE_TOOLKIT_HAVE_MBEDTLS\"  unless=\"static_link\"/>\n\t\t<section if=\"static_link\">\n\n\t\t\t<include name=\"${HXCPP}/project/thirdparty/mbedtls-flags.xml\" if=\"HAS_HXCPP_MBEDTLS_FLAGS\" />\n\n\t\t\t<section unless=\"HAS_HXCPP_MBEDTLS_FLAGS\">\n\n\t\t\t\t<compilerflag value=\"-I${MBEDTLS_DIR}/include\" />\n\t\t\t\t<compilerflag value=\"-I${HXCPP}/src/hx/libs/ssl\" />\n\t\t\t\t<compilerflag value=\"-I${this_dir}/custom/mbedtls_hxcpp\" />\n\t\t\t\t<compilerflag value=\"-DMBEDTLS_USER_CONFIG_FILE=&lt;mbedtls_config.h&gt;\" />\n\n\t\t\t</section>\n\n\t\t</section>\n\n\t\t<compilerflag value=\"-DBUILDING_LIBCURL\" />\n\t\t<compilerflag value=\"-DCURL_STATICLIB\" />\n\t\t<compilerflag value=\"-DUSE_AXTLS=1\" if=\"NATIVE_TOOLKIT_HAVE_AXTLS\" />\n\t\t<compilerflag value=\"-DUSE_MBEDTLS=1\" if=\"NATIVE_TOOLKIT_HAVE_MBEDTLS\" />\n\t\t<compilerflag value=\"-DNATIVE_TOOLKIT_CURL_DISABLE_AXTLS_NONBLOCKING\" if=\"NATIVE_TOOLKIT_CURL_DISABLE_AXTLS_NONBLOCKING\" />\n\t\t<compilerflag value=\"-DHAVE_CONFIG_H\" unless=\"windows\" />\n\t\t<compilerflag value=\"-DWIN32\" if=\"windows\" unless=\"winrt\" />\n\t\t<compilerflag value=\"-DALLOW_MSVC6_WITHOUT_PSDK\" if=\"windows\" />\n\t\t<compilerflag value=\"-DENABLE_IPV6=1\" />\n\t\t<compilerflag value=\"-DNEED_THREAD_SAFE=1\" />\n\t\t<compilerflag value=\"-DCURL_DISABLE_LDAP\" if=\"winrt\" />\n\n\t\t<section if=\"windows\">\n\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/asyn-ares.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_multibyte.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/inet_ntop.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/inet_pton.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/krb5.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/ldap.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/openldap.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/socketpair.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/strtok.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/system_win32.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/version_win32.c\" />\n\n\t\t</section>\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/altsvc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/asyn-thread.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/base64.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/bufref.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/cfilters.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/conncache.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/connect.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/content_encoding.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/cookie.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_addrinfo.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_des.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_endian.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_fnmatch.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_get_line.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_gethostname.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_memrchr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_ntlm_core.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_range.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_sasl.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/curl_threads.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/dict.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/doh.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/dynbuf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/easy.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/escape.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/file.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/fileinfo.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/fopen.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/formdata.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/ftp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/ftplistparser.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/getenv.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/getinfo.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/gopher.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hash.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/headers.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hmac.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hostasyn.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hostip.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hostip4.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hostip6.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hostsyn.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/hsts.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/http_aws_sigv4.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/http_chunks.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/http_digest.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/http_ntlm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/http_proxy.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/http.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/if2ip.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/idn.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/imap.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/llist.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/md4.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/md5.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/mime.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/mprintf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/mqtt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/multi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/netrc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/nonblock.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/noproxy.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/parsedate.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/pingpong.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/pop3.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/progress.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/rand.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/rename.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/rtsp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/select.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/sendf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/setopt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/sha256.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/share.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/slist.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/smb.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/smtp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/socks.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/speedcheck.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/splay.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/strcase.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/strdup.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/strerror.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/strtoofft.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/telnet.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/tftp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/timediff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/timeval.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/transfer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/url.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/urlapi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/cleartext.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/cram.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/digest_sspi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/digest.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/krb5_gssapi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/krb5_sspi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/ntlm_sspi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/ntlm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/oauth2.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/spnego_gssapi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/spnego_sspi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vauth/vauth.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/version.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vtls/hostcheck.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vtls/vtls.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/warnless.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/wildcard.c\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vtls/axtls.c\" if=\"NATIVE_TOOLKIT_HAVE_AXTLS\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vtls/mbedtls.c\" if=\"NATIVE_TOOLKIT_HAVE_MBEDTLS\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/curl/lib/vtls/mbedtls_threadlock.c\" if=\"NATIVE_TOOLKIT_HAVE_MBEDTLS\" />\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/custom/cairo/configs/default/config.h",
    "content": "#ifndef _cairo_config_h\n#define _cairo_config_h\n\n\n// #define CAIRO_HAS_PNG_FUNCTIONS 1\n// #define CAIRO_HAS_XLIB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XRENDER_SURFACE 1\n// #define CAIRO_HAS_XCB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1\n// #define CAIRO_HAS_XCB_SHM_FUNCTIONS 1\n// #define CAIRO_HAS_QT_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_FONT 1\n// #define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1\n// #define CAIRO_HAS_WIN32_SURFACE 1\n// #define CAIRO_HAS_WIN32_FONT 1\n// #define CAIRO_HAS_SKIA_SURFACE 1\n// #define CAIRO_HAS_OS2_SURFACE 1\n// #define CAIRO_HAS_BEOS_SURFACE 1\n// #define CAIRO_HAS_DRM_SURFACE 1\n// #define CAIRO_HAS_GALLIUM_SURFACE 1\n// #define CAIRO_HAS_GL_SURFACE 1\n// #define CAIRO_HAS_GLESV2_SURFACE 1\n// #define CAIRO_HAS_COGL_SURFACE 1\n// #define CAIRO_HAS_DIRECTFB_SURFACE 1\n// #define CAIRO_HAS_VG_SURFACE 1\n// #define CAIRO_HAS_EGL_FUNCTIONS 1\n// #define CAIRO_HAS_GLX_FUNCTIONS 1\n// #define CAIRO_HAS_WGL_FUNCTIONS 1\n// #define CAIRO_HAS_SCRIPT_SURFACE 1\n#define CAIRO_HAS_FT_FONT 1\n// #define CAIRO_HAS_FC_FONT 1\n// #define CAIRO_HAS_PS_SURFACE 1\n// #define CAIRO_HAS_PDF_SURFACE 1\n// #define CAIRO_HAS_SVG_SURFACE 1\n// #define CAIRO_HAS_TEST_SURFACES 1\n// #define CAIRO_HAS_TEE_SURFACE 1\n// #define CAIRO_HAS_XML_SURFACE 1\n#define CAIRO_HAS_PTHREAD 1\n// #define CAIRO_HAS_GOBJECT_FUNCTIONS 1\n// #define CAIRO_HAS_TRACE 1\n// #define CAIRO_HAS_INTERPRETER 1\n// #define CAIRO_HAS_SYMBOL_LOOKUP 1\n#define CAIRO_HAS_DLSYM 1\n\n\n// #define HAVE_BYTESWAP_H 1\n// #define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n// #define HAVE_SYS_INT_TYPES_H 1\n#define HAVE_UNISTD_H 1\n// #define HAVE_UINT128_T 1\n#define HAVE_UINT64_T 1\n\n\n// #define HAVE_INTEL_ATOMIC_PRIMITIVES 1\n// #define HAVE_LIB_ATOMIC_OPS 1\n// #define HAVE_OS_ATOMIC_OPS 1\n\n// #define HAVE_FT_LIBRARY_SETLCDFILTER 1\n// #define HAVE_FT_GLYPHSLOT_EMBOLDEN 1\n// #define HAVE_FT_GLYPHSLOT_OBLIQUE 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n// #define HAVE_FT_GET_X11_FONT_FORMAT 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n\n// #define HAVE_MEMFAULT 1\n// #define HAVE_LOCKDEP 1\n// #define HAVE_FCFINI 1\n// #define HAVE_CTIME_R 1\n// #define HAVE_CLOCK_GETTIME 1\n\n// #define HAVE_X11_EXTENSIONS_XSHM_H 1\n// #define HAVE_X11_EXTENSIONS_SHMPROTO_H 1\n// #define HAVE_X11_EXTENSIONS_SHMSTR_H 1\n\n// #define HAVE_XRENDERCREATESOLIDFILL 1\n// #define HAVE_XRENDERCREATELINEARGRADIENT 1\n// #define HAVE_XRENDERCREATERADIALGRADIENT 1\n// #define HAVE_XRENDERCREATECONICALGRADIENT 1\n\n// #define HAVE_VALGRIND 1\n\n\n#endif"
  },
  {
    "path": "project/lib/custom/cairo/configs/linux/config.h",
    "content": "#ifndef _cairo_config_h\n#define _cairo_config_h\n\n\n// #define CAIRO_HAS_PNG_FUNCTIONS 1\n// #define CAIRO_HAS_XLIB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XRENDER_SURFACE 1\n// #define CAIRO_HAS_XCB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1\n// #define CAIRO_HAS_XCB_SHM_FUNCTIONS 1\n// #define CAIRO_HAS_QT_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_FONT 1\n// #define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1\n// #define CAIRO_HAS_WIN32_SURFACE 1\n// #define CAIRO_HAS_WIN32_FONT 1\n// #define CAIRO_HAS_SKIA_SURFACE 1\n// #define CAIRO_HAS_OS2_SURFACE 1\n// #define CAIRO_HAS_BEOS_SURFACE 1\n// #define CAIRO_HAS_DRM_SURFACE 1\n// #define CAIRO_HAS_GALLIUM_SURFACE 1\n// #define CAIRO_HAS_GL_SURFACE 1\n// #define CAIRO_HAS_GLESV2_SURFACE 1\n// #define CAIRO_HAS_COGL_SURFACE 1\n// #define CAIRO_HAS_DIRECTFB_SURFACE 1\n// #define CAIRO_HAS_VG_SURFACE 1\n// #define CAIRO_HAS_EGL_FUNCTIONS 1\n// #define CAIRO_HAS_GLX_FUNCTIONS 1\n// #define CAIRO_HAS_WGL_FUNCTIONS 1\n// #define CAIRO_HAS_SCRIPT_SURFACE 1\n#define CAIRO_HAS_FT_FONT 1\n// #define CAIRO_HAS_FC_FONT 1\n// #define CAIRO_HAS_PS_SURFACE 1\n// #define CAIRO_HAS_PDF_SURFACE 1\n// #define CAIRO_HAS_SVG_SURFACE 1\n// #define CAIRO_HAS_TEST_SURFACES 1\n// #define CAIRO_HAS_TEE_SURFACE 1\n// #define CAIRO_HAS_XML_SURFACE 1\n#define CAIRO_HAS_PTHREAD 1\n// #define CAIRO_HAS_GOBJECT_FUNCTIONS 1\n// #define CAIRO_HAS_TRACE 1\n// #define CAIRO_HAS_INTERPRETER 1\n// #define CAIRO_HAS_SYMBOL_LOOKUP 1\n#define CAIRO_HAS_DLSYM 1\n\n\n#define HAVE_BYTESWAP_H 1\n// #define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n// #define HAVE_SYS_INT_TYPES_H 1\n#define HAVE_UNISTD_H 1\n// #define HAVE_UINT128_T 1\n#define HAVE_UINT64_T 1\n\n\n// #define HAVE_INTEL_ATOMIC_PRIMITIVES 1\n// #define HAVE_LIB_ATOMIC_OPS 1\n// #define HAVE_OS_ATOMIC_OPS 1\n\n// #define HAVE_FT_LIBRARY_SETLCDFILTER 1\n// #define HAVE_FT_GLYPHSLOT_EMBOLDEN 1\n// #define HAVE_FT_GLYPHSLOT_OBLIQUE 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n// #define HAVE_FT_GET_X11_FONT_FORMAT 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n\n// #define HAVE_MEMFAULT 1\n// #define HAVE_LOCKDEP 1\n// #define HAVE_FCFINI 1\n// #define HAVE_CTIME_R 1\n// #define HAVE_CLOCK_GETTIME 1\n\n// #define HAVE_X11_EXTENSIONS_XSHM_H 1\n// #define HAVE_X11_EXTENSIONS_SHMPROTO_H 1\n// #define HAVE_X11_EXTENSIONS_SHMSTR_H 1\n\n// #define HAVE_XRENDERCREATESOLIDFILL 1\n// #define HAVE_XRENDERCREATELINEARGRADIENT 1\n// #define HAVE_XRENDERCREATERADIALGRADIENT 1\n// #define HAVE_XRENDERCREATECONICALGRADIENT 1\n\n// #define HAVE_VALGRIND 1\n\n\n#endif"
  },
  {
    "path": "project/lib/custom/cairo/configs/mac/config.h",
    "content": "#ifndef _cairo_config_h\n#define _cairo_config_h\n\n\n// #define CAIRO_HAS_PNG_FUNCTIONS 1\n// #define CAIRO_HAS_XLIB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XRENDER_SURFACE 1\n// #define CAIRO_HAS_XCB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1\n// #define CAIRO_HAS_XCB_SHM_FUNCTIONS 1\n// #define CAIRO_HAS_QT_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_FONT 1\n// #define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1\n// #define CAIRO_HAS_WIN32_SURFACE 1\n// #define CAIRO_HAS_WIN32_FONT 1\n// #define CAIRO_HAS_SKIA_SURFACE 1\n// #define CAIRO_HAS_OS2_SURFACE 1\n// #define CAIRO_HAS_BEOS_SURFACE 1\n// #define CAIRO_HAS_DRM_SURFACE 1\n// #define CAIRO_HAS_GALLIUM_SURFACE 1\n// #define CAIRO_HAS_GL_SURFACE 1\n// #define CAIRO_HAS_GLESV2_SURFACE 1\n// #define CAIRO_HAS_COGL_SURFACE 1\n// #define CAIRO_HAS_DIRECTFB_SURFACE 1\n// #define CAIRO_HAS_VG_SURFACE 1\n// #define CAIRO_HAS_EGL_FUNCTIONS 1\n// #define CAIRO_HAS_GLX_FUNCTIONS 1\n// #define CAIRO_HAS_WGL_FUNCTIONS 1\n// #define CAIRO_HAS_SCRIPT_SURFACE 1\n#define CAIRO_HAS_FT_FONT 1\n// #define CAIRO_HAS_FC_FONT 1\n// #define CAIRO_HAS_PS_SURFACE 1\n// #define CAIRO_HAS_PDF_SURFACE 1\n// #define CAIRO_HAS_SVG_SURFACE 1\n// #define CAIRO_HAS_TEST_SURFACES 1\n// #define CAIRO_HAS_TEE_SURFACE 1\n// #define CAIRO_HAS_XML_SURFACE 1\n#define CAIRO_HAS_PTHREAD 1\n// #define CAIRO_HAS_GOBJECT_FUNCTIONS 1\n// #define CAIRO_HAS_TRACE 1\n// #define CAIRO_HAS_INTERPRETER 1\n// #define CAIRO_HAS_SYMBOL_LOOKUP 1\n#define CAIRO_HAS_DLSYM 1\n\n\n// #define HAVE_BYTESWAP_H 1\n// #define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n// #define HAVE_SYS_INT_TYPES_H 1\n#define HAVE_UNISTD_H 1\n// #define HAVE_UINT128_T 1\n#define HAVE_UINT64_T 1\n\n\n// #define HAVE_INTEL_ATOMIC_PRIMITIVES 1\n// #define HAVE_LIB_ATOMIC_OPS 1\n// #define HAVE_OS_ATOMIC_OPS 1\n\n// #define HAVE_FT_LIBRARY_SETLCDFILTER 1\n// #define HAVE_FT_GLYPHSLOT_EMBOLDEN 1\n// #define HAVE_FT_GLYPHSLOT_OBLIQUE 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n// #define HAVE_FT_GET_X11_FONT_FORMAT 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n\n// #define HAVE_MEMFAULT 1\n// #define HAVE_LOCKDEP 1\n// #define HAVE_FCFINI 1\n// #define HAVE_CTIME_R 1\n// #define HAVE_CLOCK_GETTIME 1\n\n// #define HAVE_X11_EXTENSIONS_XSHM_H 1\n// #define HAVE_X11_EXTENSIONS_SHMPROTO_H 1\n// #define HAVE_X11_EXTENSIONS_SHMSTR_H 1\n\n// #define HAVE_XRENDERCREATESOLIDFILL 1\n// #define HAVE_XRENDERCREATELINEARGRADIENT 1\n// #define HAVE_XRENDERCREATERADIALGRADIENT 1\n// #define HAVE_XRENDERCREATECONICALGRADIENT 1\n\n// #define HAVE_VALGRIND 1\n\n\n#endif"
  },
  {
    "path": "project/lib/custom/cairo/configs/windows/config.h",
    "content": "#ifndef _cairo_config_h\n#define _cairo_config_h\n\n\n// #define CAIRO_HAS_PNG_FUNCTIONS 1\n// #define CAIRO_HAS_XLIB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XRENDER_SURFACE 1\n// #define CAIRO_HAS_XCB_SURFACE 1\n// #define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1\n// #define CAIRO_HAS_XCB_SHM_FUNCTIONS 1\n// #define CAIRO_HAS_QT_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_SURFACE 1\n// #define CAIRO_HAS_QUARTZ_FONT 1\n// #define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1\n// #define CAIRO_HAS_WIN32_SURFACE 1\n// #define CAIRO_HAS_WIN32_FONT 1\n// #define CAIRO_HAS_SKIA_SURFACE 1\n// #define CAIRO_HAS_OS2_SURFACE 1\n// #define CAIRO_HAS_BEOS_SURFACE 1\n// #define CAIRO_HAS_DRM_SURFACE 1\n// #define CAIRO_HAS_GALLIUM_SURFACE 1\n// #define CAIRO_HAS_GL_SURFACE 1\n// #define CAIRO_HAS_GLESV2_SURFACE 1\n// #define CAIRO_HAS_COGL_SURFACE 1\n// #define CAIRO_HAS_DIRECTFB_SURFACE 1\n// #define CAIRO_HAS_VG_SURFACE 1\n// #define CAIRO_HAS_EGL_FUNCTIONS 1\n// #define CAIRO_HAS_GLX_FUNCTIONS 1\n// #define CAIRO_HAS_WGL_FUNCTIONS 1\n// #define CAIRO_HAS_SCRIPT_SURFACE 1\n#define CAIRO_HAS_FT_FONT 1\n// #define CAIRO_HAS_FC_FONT 1\n// #define CAIRO_HAS_PS_SURFACE 1\n// #define CAIRO_HAS_PDF_SURFACE 1\n// #define CAIRO_HAS_SVG_SURFACE 1\n// #define CAIRO_HAS_TEST_SURFACES 1\n// #define CAIRO_HAS_TEE_SURFACE 1\n// #define CAIRO_HAS_XML_SURFACE 1\n// #define CAIRO_HAS_PTHREAD 1\n// #define CAIRO_HAS_GOBJECT_FUNCTIONS 1\n// #define CAIRO_HAS_TRACE 1\n// #define CAIRO_HAS_INTERPRETER 1\n// #define CAIRO_HAS_SYMBOL_LOOKUP 1\n// #define CAIRO_HAS_DLSYM 1\n\n\n#ifdef __MINGW32__\n// #define HAVE_BYTESWAP_H 1\n// #define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n// #define HAVE_SYS_INT_TYPES_H 1\n// #define HAVE_UNISTD_H 1\n// #define HAVE_UINT128_T 1\n#define HAVE_UINT64_T 1\n#endif\n\n\n// #define HAVE_INTEL_ATOMIC_PRIMITIVES 1\n// #define HAVE_LIB_ATOMIC_OPS 1\n// #define HAVE_OS_ATOMIC_OPS 1\n\n// #define HAVE_FT_LIBRARY_SETLCDFILTER 1\n// #define HAVE_FT_GLYPHSLOT_EMBOLDEN 1\n// #define HAVE_FT_GLYPHSLOT_OBLIQUE 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n// #define HAVE_FT_GET_X11_FONT_FORMAT 1\n// #define HAVE_FT_LOAD_SFNT_TABLE 1\n\n// #define HAVE_MEMFAULT 1\n// #define HAVE_LOCKDEP 1\n// #define HAVE_FCFINI 1\n// #define HAVE_CTIME_R 1\n// #define HAVE_CLOCK_GETTIME 1\n\n// #define HAVE_X11_EXTENSIONS_XSHM_H 1\n// #define HAVE_X11_EXTENSIONS_SHMPROTO_H 1\n// #define HAVE_X11_EXTENSIONS_SHMSTR_H 1\n\n// #define HAVE_XRENDERCREATESOLIDFILL 1\n// #define HAVE_XRENDERCREATELINEARGRADIENT 1\n// #define HAVE_XRENDERCREATERADIALGRADIENT 1\n// #define HAVE_XRENDERCREATECONICALGRADIENT 1\n\n// #define HAVE_VALGRIND 1\n\n\n#endif"
  },
  {
    "path": "project/lib/custom/cairo/src/cairo-features.h",
    "content": "#ifndef CAIRO_FEATURES_H\n#define CAIRO_FEATURES_H\n\n\n\n#endif\n"
  },
  {
    "path": "project/lib/custom/curl/lib/curl_config.h",
    "content": "/* lib/curl_config.h.  Generated from curl_config.h.in by configure.  */\n/* lib/curl_config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Location of default ca bundle */\n/* #define CURL_CA_BUNDLE \"/etc/ssl/certs/ca-certificates.crt\" */\n\n/* define \"1\" to use built in CA store of SSL library */\n/* #undef CURL_CA_FALLBACK */\n\n/* Location of default ca path */\n/* #undef CURL_CA_PATH */\n\n/* Default SSL backend */\n/* #undef CURL_DEFAULT_SSL_BACKEND */\n\n/* to disable cookies support */\n/* #undef CURL_DISABLE_COOKIES */\n\n/* to disable cryptographic authentication */\n/* #undef CURL_DISABLE_CRYPTO_AUTH */\n\n/* to disable DICT */\n/* #undef CURL_DISABLE_DICT */\n\n/* to disable FILE */\n/* #undef CURL_DISABLE_FILE */\n\n/* to disable FTP */\n/* #undef CURL_DISABLE_FTP */\n\n/* to disable Gopher */\n/* #undef CURL_DISABLE_GOPHER */\n\n/* to disable HTTP */\n/* #undef CURL_DISABLE_HTTP */\n\n/* to disable IMAP */\n/* #undef CURL_DISABLE_IMAP */\n\n/* to disable LDAP */\n#define CURL_DISABLE_LDAP 1\n\n/* to disable LDAPS */\n#define CURL_DISABLE_LDAPS 1\n\n/* to disable --libcurl C code generation option */\n/* #undef CURL_DISABLE_LIBCURL_OPTION */\n\n/* to disable POP3 */\n/* #undef CURL_DISABLE_POP3 */\n\n/* to disable proxies */\n/* #undef CURL_DISABLE_PROXY */\n\n/* to disable RTSP */\n/* #undef CURL_DISABLE_RTSP */\n\n/* to disable SMB/CIFS */\n/* #undef CURL_DISABLE_SMB */\n\n/* to disable SMTP */\n/* #undef CURL_DISABLE_SMTP */\n\n/* to disable TELNET */\n/* #undef CURL_DISABLE_TELNET */\n\n/* to disable TFTP */\n/* #undef CURL_DISABLE_TFTP */\n\n/* to disable TLS-SRP authentication */\n/* #undef CURL_DISABLE_TLS_SRP */\n\n/* to disable verbose strings */\n/* #undef CURL_DISABLE_VERBOSE_STRINGS */\n\n/* Definition to make a library symbol externally visible. */\n/* #define CURL_EXTERN_SYMBOL __attribute__ ((__visibility__ (\"default\"))) */\n\n/* built with multiple SSL backends */\n/* #undef CURL_WITH_MULTI_SSL */\n\n/* your Entropy Gathering Daemon socket pathname */\n/* #undef EGD_SOCKET */\n\n/* Define if you want to enable IPv6 support */\n#define ENABLE_IPV6 1\n\n/* Define to the type of arg 2 for gethostname. */\n#define GETHOSTNAME_TYPE_ARG2 size_t\n\n/* Define to the type qualifier of arg 1 for getnameinfo. */\n#define GETNAMEINFO_QUAL_ARG1 const\n\n/* Define to the type of arg 1 for getnameinfo. */\n#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *\n\n/* Define to the type of arg 2 for getnameinfo. */\n#define GETNAMEINFO_TYPE_ARG2 socklen_t\n\n/* Define to the type of args 4 and 6 for getnameinfo. */\n#define GETNAMEINFO_TYPE_ARG46 socklen_t\n\n/* Define to the type of arg 7 for getnameinfo. */\n#define GETNAMEINFO_TYPE_ARG7 int\n\n/* Specifies the number of arguments to getservbyport_r */\n/* #define GETSERVBYPORT_R_ARGS 6 */\n\n/* Specifies the size of the buffer to pass to getservbyport_r */\n/* #define GETSERVBYPORT_R_BUFSIZE 4096 */\n\n/* Define to 1 if you have the alarm function. */\n#define HAVE_ALARM 1\n\n/* Define to 1 if you have the <alloca.h> header file. */\n#define HAVE_ALLOCA_H 1\n\n/* Define to 1 if you have the <arpa/inet.h> header file. */\n#define HAVE_ARPA_INET_H 1\n\n/* Define to 1 if you have the <arpa/tftp.h> header file. */\n#define HAVE_ARPA_TFTP_H 1\n\n/* Define to 1 if you have the <assert.h> header file. */\n#define HAVE_ASSERT_H 1\n\n/* Define to 1 if you have the basename function. */\n#define HAVE_BASENAME 1\n\n/* Define to 1 if bool is an available type. */\n#define HAVE_BOOL_T 1\n\n/* Define to 1 if using BoringSSL. */\n/* #undef HAVE_BORINGSSL */\n\n/* Define to 1 if you have the __builtin_available function. */\n/* #undef HAVE_BUILTIN_AVAILABLE */\n\n/* Define to 1 if you have the clock_gettime function and monotonic timer. */\n#ifdef HX_LINUX\n#define HAVE_CLOCK_GETTIME_MONOTONIC 1\n#else\n/* #undef HAVE_CLOCK_GETTIME_MONOTONIC */\n#endif\n\n/* Define to 1 if you have the closesocket function. */\n/* #undef HAVE_CLOSESOCKET */\n\n/* Define to 1 if you have the CloseSocket camel case function. */\n/* #undef HAVE_CLOSESOCKET_CAMEL */\n\n/* Define to 1 if you have the connect function. */\n#define HAVE_CONNECT 1\n\n/* Define to 1 if you have the <crypto.h> header file. */\n/* #undef HAVE_CRYPTO_H */\n\n/* Define to 1 if you have the `CyaSSL_CTX_UseSupportedCurve' function. */\n/* #undef HAVE_CYASSL_CTX_USESUPPORTEDCURVE */\n\n/* Define to 1 if you have the <cyassl/error-ssl.h> header file. */\n/* #undef HAVE_CYASSL_ERROR_SSL_H */\n\n/* Define to 1 if you have the `CyaSSL_get_peer_certificate' function. */\n/* #undef HAVE_CYASSL_GET_PEER_CERTIFICATE */\n\n/* Define to 1 if you have the <cyassl/options.h> header file. */\n/* #undef HAVE_CYASSL_OPTIONS_H */\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#define HAVE_DLFCN_H 1\n\n/* Define to 1 if you have the `ENGINE_cleanup' function. */\n/* #undef HAVE_ENGINE_CLEANUP */\n\n/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */\n/* #undef HAVE_ENGINE_LOAD_BUILTIN_ENGINES */\n\n/* Define to 1 if you have the <errno.h> header file. */\n#define HAVE_ERRNO_H 1\n\n/* Define to 1 if you have the <err.h> header file. */\n/* #undef HAVE_ERR_H */\n\n/* Define to 1 if you have the fcntl function. */\n#define HAVE_FCNTL 1\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#define HAVE_FCNTL_H 1\n\n/* Define to 1 if you have a working fcntl O_NONBLOCK function. */\n#define HAVE_FCNTL_O_NONBLOCK 1\n\n/* Define to 1 if you have the fdopen function. */\n#define HAVE_FDOPEN 1\n\n/* Define to 1 if you have the freeaddrinfo function. */\n#define HAVE_FREEADDRINFO 1\n\n/* Define to 1 if you have the freeifaddrs function. */\n#define HAVE_FREEIFADDRS 1\n\n/* Define to 1 if you have the fsetxattr function. */\n#define HAVE_FSETXATTR 1\n\n/* fsetxattr() takes 5 args */\n#define HAVE_FSETXATTR_5 1\n\n/* fsetxattr() takes 6 args */\n/* #undef HAVE_FSETXATTR_6 */\n\n/* Define to 1 if you have the ftruncate function. */\n#define HAVE_FTRUNCATE 1\n\n/* Define to 1 if you have the gai_strerror function. */\n/* #define HAVE_GAI_STRERROR 1 */\n\n/* Define to 1 if you have a working getaddrinfo function. */\n#define HAVE_GETADDRINFO 1\n\n/* Define to 1 if the getaddrinfo function is threadsafe. */\n#define HAVE_GETADDRINFO_THREADSAFE 1\n\n/* Define to 1 if you have the `geteuid' function. */\n#define HAVE_GETEUID 1\n\n/* Define to 1 if you have the gethostbyaddr function. */\n#define HAVE_GETHOSTBYADDR 1\n\n/* Define to 1 if you have the gethostbyaddr_r function. */\n/* #undef HAVE_GETHOSTBYADDR_R */\n\n/* gethostbyaddr_r() takes 5 args */\n/* #undef HAVE_GETHOSTBYADDR_R_5 */\n\n/* gethostbyaddr_r() takes 7 args */\n/* #undef HAVE_GETHOSTBYADDR_R_7 */\n\n/* gethostbyaddr_r() takes 8 args */\n/* #undef HAVE_GETHOSTBYADDR_R_8 */\n\n/* Define to 1 if you have the gethostbyname function. */\n#define HAVE_GETHOSTBYNAME 1\n\n/* Define to 1 if you have the gethostbyname_r function. */\n/* #undef HAVE_GETHOSTBYNAME_R */\n\n/* gethostbyname_r() takes 3 args */\n/* #undef HAVE_GETHOSTBYNAME_R_3 */\n\n/* gethostbyname_r() takes 5 args */\n/* #undef HAVE_GETHOSTBYNAME_R_5 */\n\n/* gethostbyname_r() takes 6 args */\n/* #undef HAVE_GETHOSTBYNAME_R_6 */\n\n/* Define to 1 if you have the gethostname function. */\n#define HAVE_GETHOSTNAME 1\n\n/* Define to 1 if you have a working getifaddrs function. */\n#if !defined(ANDROID) && !defined(HX_LINUX) && !defined(WEBOS) && !defined(BLACKBERRY) && !defined(TIZEN)\n#define HAVE_GETIFADDRS 1\n#endif\n\n/* Define to 1 if you have the getnameinfo function. */\n#define HAVE_GETNAMEINFO 1\n\n/* Define to 1 if you have the `getpass_r' function. */\n/* #undef HAVE_GETPASS_R */\n\n/* Define to 1 if you have the `getppid' function. */\n#define HAVE_GETPPID 1\n\n/* Define to 1 if you have the `getpwuid' function. */\n#define HAVE_GETPWUID 1\n\n/* Define to 1 if you have the `getpwuid_r' function. */\n/* #define HAVE_GETPWUID_R 1 */\n\n/* Define to 1 if you have the `getrlimit' function. */\n#define HAVE_GETRLIMIT 1\n\n/* Define to 1 if you have the getservbyport_r function. */\n/* #undef HAVE_GETSERVBYPORT_R */\n\n/* Define to 1 if you have the `gettimeofday' function. */\n#define HAVE_GETTIMEOFDAY 1\n\n/* Define to 1 if you have a working glibc-style strerror_r function. */\n/* #undef HAVE_GLIBC_STRERROR_R */\n\n/* Define to 1 if you have a working gmtime_r function. */\n#define HAVE_GMTIME_R 1\n\n/* Define to 1 if you have the `gnutls_alpn_set_protocols' function. */\n/* #undef HAVE_GNUTLS_ALPN_SET_PROTOCOLS */\n\n/* Define to 1 if you have the `gnutls_certificate_set_x509_key_file2'\n   function. */\n/* #undef HAVE_GNUTLS_CERTIFICATE_SET_X509_KEY_FILE2 */\n\n/* Define to 1 if you have the `gnutls_ocsp_req_init' function. */\n/* #undef HAVE_GNUTLS_OCSP_REQ_INIT */\n\n/* if you have the function gnutls_srp_verifier */\n/* #undef HAVE_GNUTLS_SRP */\n\n/* if you have GSS-API libraries */\n/* #undef HAVE_GSSAPI */\n\n/* Define to 1 if you have the <gssapi/gssapi_generic.h> header file. */\n/* #undef HAVE_GSSAPI_GSSAPI_GENERIC_H */\n\n/* Define to 1 if you have the <gssapi/gssapi.h> header file. */\n/* #undef HAVE_GSSAPI_GSSAPI_H */\n\n/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */\n/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */\n\n/* if you have GNU GSS */\n/* #undef HAVE_GSSGNU */\n\n/* if you have Heimdal */\n/* #undef HAVE_GSSHEIMDAL */\n\n/* if you have MIT Kerberos */\n/* #undef HAVE_GSSMIT */\n\n/* Define to 1 if you have the <idn2.h> header file. */\n/* #undef HAVE_IDN2_H */\n\n/* Define to 1 if you have the <ifaddrs.h> header file. */\n#if !defined(ANDROID) && !defined(HX_LINUX) && !defined(WEBOS) && !defined(BLACKBERRY) && !defined(TIZEN)\n#define HAVE_IFADDRS_H 1\n#endif\n\n/* Define to 1 if you have the `if_nametoindex' function. */\n/* #define HAVE_IF_NAMETOINDEX 1 */\n\n/* Define to 1 if you have the inet_ntoa_r function. */\n/* #undef HAVE_INET_NTOA_R */\n\n/* inet_ntoa_r() takes 2 args */\n/* #undef HAVE_INET_NTOA_R_2 */\n\n/* inet_ntoa_r() takes 3 args */\n/* #undef HAVE_INET_NTOA_R_3 */\n\n/* Define to 1 if you have a IPv6 capable working inet_ntop function. */\n#define HAVE_INET_NTOP 1\n\n/* Define to 1 if you have a IPv6 capable working inet_pton function. */\n#define HAVE_INET_PTON 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#define HAVE_INTTYPES_H 1\n\n/* Define to 1 if you have the ioctl function. */\n#define HAVE_IOCTL 1\n\n/* Define to 1 if you have the ioctlsocket function. */\n/* #undef HAVE_IOCTLSOCKET */\n\n/* Define to 1 if you have the IoctlSocket camel case function. */\n/* #undef HAVE_IOCTLSOCKET_CAMEL */\n\n/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function.\n   */\n/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */\n\n/* Define to 1 if you have a working ioctlsocket FIONBIO function. */\n/* #undef HAVE_IOCTLSOCKET_FIONBIO */\n\n/* Define to 1 if you have a working ioctl FIONBIO function. */\n#define HAVE_IOCTL_FIONBIO 1\n\n/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */\n#define HAVE_IOCTL_SIOCGIFADDR 1\n\n/* Define to 1 if you have the <io.h> header file. */\n/* #undef HAVE_IO_H */\n\n/* Define to 1 if you have the lber.h header file. */\n/* #undef HAVE_LBER_H */\n\n/* Define to 1 if you have the ldapssl.h header file. */\n/* #undef HAVE_LDAPSSL_H */\n\n/* Define to 1 if you have the ldap.h header file. */\n/* #undef HAVE_LDAP_H */\n\n/* Define to 1 if you have the `ldap_init_fd' function. */\n/* #undef HAVE_LDAP_INIT_FD */\n\n/* Use LDAPS implementation */\n/* #undef HAVE_LDAP_SSL */\n\n/* Define to 1 if you have the ldap_ssl.h header file. */\n/* #undef HAVE_LDAP_SSL_H */\n\n/* Define to 1 if you have the `ldap_url_parse' function. */\n/* #undef HAVE_LDAP_URL_PARSE */\n\n/* Define to 1 if you have the <libgen.h> header file. */\n#define HAVE_LIBGEN_H 1\n\n/* Define to 1 if you have the `idn2' library (-lidn2). */\n/* #undef HAVE_LIBIDN2 */\n\n/* Define to 1 if using libressl. */\n/* #undef HAVE_LIBRESSL */\n\n/* Define to 1 if you have the <librtmp/rtmp.h> header file. */\n/* #undef HAVE_LIBRTMP_RTMP_H */\n\n/* Define to 1 if you have the `ssh2' library (-lssh2). */\n/* #undef HAVE_LIBSSH2 */\n\n/* Define to 1 if you have the <libssh2.h> header file. */\n/* #undef HAVE_LIBSSH2_H */\n\n/* Define to 1 if you have the `ssl' library (-lssl). */\n/* #undef HAVE_LIBSSL */\n\n/* if zlib is available */\n#define HAVE_LIBZ 1\n\n/* Define to 1 if you have the <limits.h> header file. */\n#define HAVE_LIMITS_H 1\n\n/* if your compiler supports LL */\n#define HAVE_LL 1\n\n/* Define to 1 if you have the <locale.h> header file. */\n#define HAVE_LOCALE_H 1\n\n/* Define to 1 if you have a working localtime_r function. */\n#define HAVE_LOCALTIME_R 1\n\n/* Define to 1 if the compiler supports the 'long long' data type. */\n#define HAVE_LONGLONG 1\n\n/* Define to 1 if you have the malloc.h header file. */\n/* #undef HAVE_MALLOC_H */\n\n/* Define to 1 if you have the memory.h header file. */\n#define HAVE_MEMORY_H 1\n\n/* Define to 1 if you have the memrchr function or macro. */\n/* #undef HAVE_MEMRCHR */\n\n/* Define to 1 if you have the MSG_NOSIGNAL flag. */\n/* #undef HAVE_MSG_NOSIGNAL */\n\n/* Define to 1 if you have the <netdb.h> header file. */\n#define HAVE_NETDB_H 1\n\n/* Define to 1 if you have the <netinet/in.h> header file. */\n#define HAVE_NETINET_IN_H 1\n\n/* Define to 1 if you have the <netinet/tcp.h> header file. */\n#define HAVE_NETINET_TCP_H 1\n\n/* Define to 1 if you have the <net/if.h> header file. */\n#define HAVE_NET_IF_H 1\n\n/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */\n/* #undef HAVE_NGHTTP2_NGHTTP2_H */\n\n/* Define to 1 if NI_WITHSCOPEID exists and works. */\n/* #undef HAVE_NI_WITHSCOPEID */\n\n/* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE\n   */\n/* #undef HAVE_OLD_GSSMIT */\n\n/* Define to 1 if you have the <openssl/crypto.h> header file. */\n/* #undef HAVE_OPENSSL_CRYPTO_H */\n\n/* Define to 1 if you have the <openssl/engine.h> header file. */\n/* #undef HAVE_OPENSSL_ENGINE_H */\n\n/* Define to 1 if you have the <openssl/err.h> header file. */\n/* #undef HAVE_OPENSSL_ERR_H */\n\n/* Define to 1 if you have the <openssl/pem.h> header file. */\n/* #undef HAVE_OPENSSL_PEM_H */\n\n/* Define to 1 if you have the <openssl/rsa.h> header file. */\n/* #undef HAVE_OPENSSL_RSA_H */\n\n/* if you have the function SRP_Calc_client_key */\n/* #undef HAVE_OPENSSL_SRP */\n\n/* Define to 1 if you have the <openssl/ssl.h> header file. */\n/* #undef HAVE_OPENSSL_SSL_H */\n\n/* Define to 1 if you have the <openssl/x509.h> header file. */\n/* #undef HAVE_OPENSSL_X509_H */\n\n/* Define to 1 if you have the <pem.h> header file. */\n/* #undef HAVE_PEM_H */\n\n/* Define to 1 if you have the `pipe' function. */\n#define HAVE_PIPE 1\n\n/* Define to 1 if you have a working poll function. */\n/* #undef HAVE_POLL */\n\n/* If you have a fine poll */\n/* #undef HAVE_POLL_FINE */\n\n/* Define to 1 if you have the <poll.h> header file. */\n#define HAVE_POLL_H 1\n\n/* Define to 1 if you have a working POSIX-style strerror_r function. */\n#define HAVE_POSIX_STRERROR_R 1\n\n/* if you have <pthread.h> */\n#define HAVE_PTHREAD_H 1\n\n/* Define to 1 if you have the <pwd.h> header file. */\n#define HAVE_PWD_H 1\n\n/* Define to 1 if you have the `RAND_egd' function. */\n/* #undef HAVE_RAND_EGD */\n\n/* Define to 1 if you have the recv function. */\n#define HAVE_RECV 1\n\n/* Define to 1 if you have the <rsa.h> header file. */\n/* #undef HAVE_RSA_H */\n\n/* Define to 1 if you have the select function. */\n#define HAVE_SELECT 1\n\n/* Define to 1 if you have the send function. */\n#define HAVE_SEND 1\n\n/* Define to 1 if you have the <setjmp.h> header file. */\n#define HAVE_SETJMP_H 1\n\n/* Define to 1 if you have the `setlocale' function. */\n#define HAVE_SETLOCALE 1\n\n/* Define to 1 if you have the `setmode' function. */\n/* #undef HAVE_SETMODE */\n\n/* Define to 1 if you have the `setrlimit' function. */\n#define HAVE_SETRLIMIT 1\n\n/* Define to 1 if you have the setsockopt function. */\n#define HAVE_SETSOCKOPT 1\n\n/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */\n/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */\n\n/* Define to 1 if you have the <sgtty.h> header file. */\n#define HAVE_SGTTY_H 1\n\n/* Define to 1 if you have the sigaction function. */\n#define HAVE_SIGACTION 1\n\n/* Define to 1 if you have the siginterrupt function. */\n#define HAVE_SIGINTERRUPT 1\n\n/* Define to 1 if you have the signal function. */\n#define HAVE_SIGNAL 1\n\n/* Define to 1 if you have the <signal.h> header file. */\n#define HAVE_SIGNAL_H 1\n\n/* Define to 1 if you have the sigsetjmp function or macro. */\n#ifndef ANDROID_X86\n#define HAVE_SIGSETJMP 1\n#endif\n\n/* Define to 1 if sig_atomic_t is an available typedef. */\n#define HAVE_SIG_ATOMIC_T 1\n\n/* Define to 1 if sig_atomic_t is already defined as volatile. */\n/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */\n\n/* Define to 1 if struct sockaddr_in6 has the sin6_scope_id member */\n#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1\n\n/* Define to 1 if you have the socket function. */\n#define HAVE_SOCKET 1\n\n/* Define to 1 if you have the socketpair function. */\n#define HAVE_SOCKETPAIR 1\n\n/* Define to 1 if you have the <socket.h> header file. */\n/* #undef HAVE_SOCKET_H */\n\n/* Define to 1 if you have the `SSLv2_client_method' function. */\n/* #undef HAVE_SSLV2_CLIENT_METHOD */\n\n/* Define to 1 if you have the `SSL_get_shutdown' function. */\n/* #undef HAVE_SSL_GET_SHUTDOWN */\n\n/* Define to 1 if you have the <ssl.h> header file. */\n/* #undef HAVE_SSL_H */\n\n/* Define to 1 if you have the <stdbool.h> header file. */\n#define HAVE_STDBOOL_H 1\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#define HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdio.h> header file. */\n#define HAVE_STDIO_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the strcasecmp function. */\n#define HAVE_STRCASECMP 1\n\n/* Define to 1 if you have the strcmpi function. */\n/* #undef HAVE_STRCMPI */\n\n/* Define to 1 if you have the strdup function. */\n#define HAVE_STRDUP 1\n\n/* Define to 1 if you have the strerror_r function. */\n#define HAVE_STRERROR_R 1\n\n/* Define to 1 if you have the stricmp function. */\n/* #undef HAVE_STRICMP */\n\n/* Define to 1 if you have the <strings.h> header file. */\n#define HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if you have the strncasecmp function. */\n#define HAVE_STRNCASECMP 1\n\n/* Define to 1 if you have the strncmpi function. */\n/* #undef HAVE_STRNCMPI */\n\n/* Define to 1 if you have the strnicmp function. */\n/* #undef HAVE_STRNICMP */\n\n/* Define to 1 if you have the <stropts.h> header file. */\n/* #undef HAVE_STROPTS_H */\n\n/* Define to 1 if you have the strstr function. */\n#define HAVE_STRSTR 1\n\n/* Define to 1 if you have the strtok_r function. */\n#define HAVE_STRTOK_R 1\n\n/* Define to 1 if you have the strtoll function. */\n#define HAVE_STRTOLL 1\n\n/* if struct sockaddr_storage is defined */\n#define HAVE_STRUCT_SOCKADDR_STORAGE 1\n\n/* Define to 1 if you have the timeval struct. */\n#define HAVE_STRUCT_TIMEVAL 1\n\n/* Define to 1 if you have the <sys/filio.h> header file. */\n/* #undef HAVE_SYS_FILIO_H */\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#define HAVE_SYS_IOCTL_H 1\n\n/* Define to 1 if you have the <sys/param.h> header file. */\n#define HAVE_SYS_PARAM_H 1\n\n/* Define to 1 if you have the <sys/poll.h> header file. */\n#define HAVE_SYS_POLL_H 1\n\n/* Define to 1 if you have the <sys/resource.h> header file. */\n#define HAVE_SYS_RESOURCE_H 1\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#define HAVE_SYS_SELECT_H 1\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#define HAVE_SYS_SOCKET_H 1\n\n/* Define to 1 if you have the <sys/sockio.h> header file. */\n#if !defined(ANDROID) && !defined(HX_LINUX) && !defined(WEBOS) && !defined(BLACKBERRY) && !defined(TIZEN) && !defined(EMSCRIPTEN)\n#define HAVE_SYS_SOCKIO_H 1\n#endif\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#define HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#define HAVE_SYS_TIME_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <sys/uio.h> header file. */\n#define HAVE_SYS_UIO_H 1\n\n/* Define to 1 if you have the <sys/un.h> header file. */\n#define HAVE_SYS_UN_H 1\n\n/* Define to 1 if you have the <sys/utime.h> header file. */\n/* #undef HAVE_SYS_UTIME_H */\n\n/* Define to 1 if you have the <sys/wait.h> header file. */\n#define HAVE_SYS_WAIT_H 1\n\n/* Define to 1 if you have the <sys/xattr.h> header file. */\n#define HAVE_SYS_XATTR_H 1\n\n/* Define to 1 if you have the <termios.h> header file. */\n#define HAVE_TERMIOS_H 1\n\n/* Define to 1 if you have the <termio.h> header file. */\n/* #undef HAVE_TERMIO_H */\n\n/* Define to 1 if you have the <time.h> header file. */\n#define HAVE_TIME_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#define HAVE_UNISTD_H 1\n\n/* Define to 1 if you have the `utime' function. */\n#define HAVE_UTIME 1\n\n/* Define to 1 if you have the `utimes' function. */\n#define HAVE_UTIMES 1\n\n/* Define to 1 if you have the <utime.h> header file. */\n#define HAVE_UTIME_H 1\n\n/* Define to 1 if compiler supports C99 variadic macro style. */\n#define HAVE_VARIADIC_MACROS_C99 1\n\n/* Define to 1 if compiler supports old gcc variadic macro style. */\n#define HAVE_VARIADIC_MACROS_GCC 1\n\n/* Define to 1 if you have the winber.h header file. */\n/* #undef HAVE_WINBER_H */\n\n/* Define to 1 if you have the windows.h header file. */\n/* #undef HAVE_WINDOWS_H */\n\n/* Define to 1 if you have the winldap.h header file. */\n/* #undef HAVE_WINLDAP_H */\n\n/* Define to 1 if you have the winsock2.h header file. */\n/* #undef HAVE_WINSOCK2_H */\n\n/* Define to 1 if you have the winsock.h header file. */\n/* #undef HAVE_WINSOCK_H */\n\n/* Define to 1 if you have the `wolfSSLv3_client_method' function. */\n/* #undef HAVE_WOLFSSLV3_CLIENT_METHOD */\n\n/* Define to 1 if you have the `wolfSSL_CTX_UseSupportedCurve' function. */\n/* #undef HAVE_WOLFSSL_CTX_USESUPPORTEDCURVE */\n\n/* Define to 1 if you have the `wolfSSL_get_peer_certificate' function. */\n/* #undef HAVE_WOLFSSL_GET_PEER_CERTIFICATE */\n\n/* Define to 1 if you have the `wolfSSL_UseALPN' function. */\n/* #undef HAVE_WOLFSSL_USEALPN */\n\n/* Define this symbol if your OS supports changing the contents of argv */\n#define HAVE_WRITABLE_ARGV 1\n\n/* Define to 1 if you have the writev function. */\n#define HAVE_WRITEV 1\n\n/* Define to 1 if you have the ws2tcpip.h header file. */\n/* #undef HAVE_WS2TCPIP_H */\n\n/* Define to 1 if you have the <x509.h> header file. */\n/* #undef HAVE_X509_H */\n\n/* if you have the zlib.h header file */\n#define HAVE_ZLIB_H 1\n\n/* Define to the sub-directory where libtool stores uninstalled libraries. */\n#define LT_OBJDIR \".libs/\"\n\n/* Define to 1 if you need the lber.h header file even with ldap.h */\n/* #undef NEED_LBER_H */\n\n/* Define to 1 if you need the malloc.h header file even with stdlib.h */\n/* #undef NEED_MALLOC_H */\n\n/* Define to 1 if you need the memory.h header file even with stdlib.h */\n/* #undef NEED_MEMORY_H */\n\n/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */\n/* #undef NEED_REENTRANT */\n\n/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */\n/* #undef NEED_THREAD_SAFE */\n\n/* Define to enable NTLM delegation to winbind's ntlm_auth helper. */\n/* #define NTLM_WB_ENABLED 1 */\n\n/* Define absolute filename for winbind's ntlm_auth helper. */\n/* #define NTLM_WB_FILE \"/usr/bin/ntlm_auth\" */\n\n/* cpu-machine-OS */\n#define OS \"x86_64-pc-linux-gnu\"\n\n/* Name of package */\n#define PACKAGE \"curl\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"a suitable curl mailing list: https://curl.haxx.se/mail/\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"curl\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"curl -\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"curl\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"-\"\n\n/* a suitable file to read random data from */\n#ifdef HX_LINUX\n#define RANDOM_FILE \"/dev/urandom\"\n#else\n/* #undef RANDOM_FILE */\n#endif\n\n/* Define to the type of arg 1 for recv. */\n#define RECV_TYPE_ARG1 int\n\n/* Define to the type of arg 2 for recv. */\n#define RECV_TYPE_ARG2 void *\n\n/* Define to the type of arg 3 for recv. */\n#define RECV_TYPE_ARG3 size_t\n\n/* Define to the type of arg 4 for recv. */\n#define RECV_TYPE_ARG4 int\n\n/* Define to the function return type for recv. */\n#define RECV_TYPE_RETV ssize_t\n\n/* Define as the return type of signal handlers (`int' or `void'). */\n#define RETSIGTYPE void\n\n/* Define to the type qualifier of arg 5 for select. */\n#define SELECT_QUAL_ARG5\n\n/* Define to the type of arg 1 for select. */\n#define SELECT_TYPE_ARG1 int\n\n/* Define to the type of args 2, 3 and 4 for select. */\n#define SELECT_TYPE_ARG234 fd_set *\n\n/* Define to the type of arg 5 for select. */\n#define SELECT_TYPE_ARG5 struct timeval *\n\n/* Define to the function return type for select. */\n#define SELECT_TYPE_RETV int\n\n/* Define to the type qualifier of arg 2 for send. */\n#define SEND_QUAL_ARG2 const\n\n/* Define to the type of arg 1 for send. */\n#define SEND_TYPE_ARG1 int\n\n/* Define to the type of arg 2 for send. */\n#define SEND_TYPE_ARG2 void *\n\n/* Define to the type of arg 3 for send. */\n#define SEND_TYPE_ARG3 size_t\n\n/* Define to the type of arg 4 for send. */\n#define SEND_TYPE_ARG4 int\n\n/* Define to the function return type for send. */\n#define SEND_TYPE_RETV ssize_t\n\n/* The size of `curl_off_t', as computed by sizeof. */\n#define SIZEOF_CURL_OFF_T 8\n\n/* The size of `int', as computed by sizeof. */\n#define SIZEOF_INT 4\n\n/* The size of `long', as computed by sizeof. */\n#ifdef HXCPP_M64\n#define SIZEOF_LONG 8\n#else\n#define SIZEOF_LONG 4\n#endif\n\n/* The size of `long long', as computed by sizeof. */\n/* #undef SIZEOF_LONG_LONG */\n\n/* The size of `off_t', as computed by sizeof. */\n#define SIZEOF_OFF_T 8\n\n/* The size of `short', as computed by sizeof. */\n#define SIZEOF_SHORT 2\n\n/* The size of `size_t', as computed by sizeof. */\n#ifdef HXCPP_M64\n#define SIZEOF_SIZE_T 8\n#else\n#define SIZEOF_SIZE_T 4\n#endif\n\n/* The size of `time_t', as computed by sizeof. */\n#ifdef HXCPP_M64\n#define SIZEOF_TIME_T 8\n#else\n#define SIZEOF_TIME_T 4\n#endif\n\n/* Define to 1 if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* Define to the type of arg 3 for strerror_r. */\n#define STRERROR_R_TYPE_ARG3 size_t\n\n/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */\n#define TIME_WITH_SYS_TIME 1\n\n/* Define to enable c-ares support */\n/* #undef USE_ARES */\n\n/* if axTLS is enabled */\n/* #undef USE_AXTLS */\n\n/* if CyaSSL/WolfSSL is enabled */\n/* #undef USE_CYASSL */\n\n/* to enable Apple OS native SSL/TLS support */\n/* #undef USE_DARWINSSL */\n\n/* if GnuTLS is enabled */\n/* #undef USE_GNUTLS */\n\n/* if GnuTLS uses nettle as crypto backend */\n/* #undef USE_GNUTLS_NETTLE */\n\n/* PSL support enabled */\n/* #undef USE_LIBPSL */\n\n/* if librtmp is in use */\n/* #undef USE_LIBRTMP */\n\n/* if libSSH2 is in use */\n/* #undef USE_LIBSSH2 */\n\n/* If you want to build curl with the built-in manual */\n#define USE_MANUAL 1\n\n/* if mbedTLS is enabled */\n/* #undef USE_MBEDTLS */\n\n/* Define to enable metalink support */\n/* #undef USE_METALINK */\n\n/* if nghttp2 is in use */\n/* #undef USE_NGHTTP2 */\n\n/* if NSS is enabled */\n/* #undef USE_NSS */\n\n/* Use OpenLDAP-specific code */\n/* #undef USE_OPENLDAP */\n\n/* if OpenSSL is in use */\n/* #undef USE_OPENSSL */\n\n/* if PolarSSL is enabled */\n/* #undef USE_POLARSSL */\n\n/* to enable Windows native SSL/TLS support */\n/* #undef USE_SCHANNEL */\n\n/* if you want POSIX threaded DNS lookup */\n/* #define USE_THREADS_POSIX 1 */\n\n/* if you want Win32 threaded DNS lookup */\n/* #undef USE_THREADS_WIN32 */\n\n/* Use TLS-SRP authentication */\n/* #undef USE_TLS_SRP */\n\n/* Use Unix domain sockets */\n/* #define USE_UNIX_SOCKETS 1 */\n\n/* Define to 1 if you have the `normaliz' (WinIDN) library (-lnormaliz). */\n/* #undef USE_WIN32_IDN */\n\n/* Define to 1 if you are building a Windows target with large file support.\n   */\n/* #undef USE_WIN32_LARGE_FILES */\n\n/* Use Windows LDAP implementation */\n/* #undef USE_WIN32_LDAP */\n\n/* Define to 1 if you are building a Windows target without large file\n   support. */\n/* #undef USE_WIN32_SMALL_FILES */\n\n/* to enable SSPI support */\n/* #undef USE_WINDOWS_SSPI */\n\n/* Version number of package */\n#define VERSION \"7.56.1\"\n\n/* Define to 1 to provide own prototypes. */\n/* #undef WANT_IDN_PROTOTYPES */\n\n/* Define to 1 if OS is AIX. */\n#ifndef _ALL_SOURCE\n/* #  undef _ALL_SOURCE */\n#endif\n\n/* Enable large inode numbers on Mac OS X 10.5.  */\n#ifndef _DARWIN_USE_64_BIT_INODE\n# define _DARWIN_USE_64_BIT_INODE 1\n#endif\n\n/* Number of bits in a file offset, on hosts where this is settable. */\n/* #undef _FILE_OFFSET_BITS */\n\n/* Define for large files, on AIX-style hosts. */\n/* #undef _LARGE_FILES */\n\n/* Define to empty if `const' does not conform to ANSI C. */\n/* #undef const */\n\n/* Type to use in place of in_addr_t when system does not provide it. */\n/* #undef in_addr_t */\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n/* #undef inline */\n#endif\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n/* #undef size_t */\n\n/* the signed version of size_t */\n/* #undef ssize_t */\n"
  },
  {
    "path": "project/lib/custom/freetype/include/freetype/config/ftoption.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ftoption.h                                                             */\n/*                                                                         */\n/*    User-selectable configuration macros (specification only).           */\n/*                                                                         */\n/*  Copyright 1996-2018 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n#ifndef FTOPTION_H_\n#define FTOPTION_H_\n\n\n#include <ft2build.h>\n\n\nFT_BEGIN_HEADER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */\n  /*                                                                       */\n  /* This file contains the default configuration macro definitions for    */\n  /* a standard build of the FreeType library.  There are three ways to    */\n  /* use this file to build project-specific versions of the library:      */\n  /*                                                                       */\n  /*  - You can modify this file by hand, but this is not recommended in   */\n  /*    cases where you would like to build several versions of the        */\n  /*    library from a single source directory.                            */\n  /*                                                                       */\n  /*  - You can put a copy of this file in your build directory, more      */\n  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */\n  /*    is the name of a directory that is included _before_ the FreeType  */\n  /*    include path during compilation.                                   */\n  /*                                                                       */\n  /*    The default FreeType Makefiles and Jamfiles use the build          */\n  /*    directory `builds/<system>' by default, but you can easily change  */\n  /*    that for your own projects.                                        */\n  /*                                                                       */\n  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */\n  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */\n  /*    locate this file during the build.  For example,                   */\n  /*                                                                       */\n  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */\n  /*      #include <freetype/config/ftheader.h>                            */\n  /*                                                                       */\n  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */\n  /*    definitions.                                                       */\n  /*                                                                       */\n  /*    Note also that you can similarly pre-define the macro              */\n  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */\n  /*    that are statically linked to the library at compile time.  By     */\n  /*    default, this file is <freetype/config/ftmodule.h>.                */\n  /*                                                                       */\n  /* We highly recommend using the third method whenever possible.         */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*#***********************************************************************/\n  /*                                                                       */\n  /* If you enable this configuration option, FreeType recognizes an       */\n  /* environment variable called `FREETYPE_PROPERTIES', which can be used  */\n  /* to control the various font drivers and modules.  The controllable    */\n  /* properties are listed in the section @properties.                     */\n  /*                                                                       */\n  /* You have to undefine this configuration option on platforms that lack */\n  /* the concept of environment variables (and thus don't have the         */\n  /* `getenv' function), for example Windows CE.                           */\n  /*                                                                       */\n  /* `FREETYPE_PROPERTIES' has the following syntax form (broken here into */\n  /* multiple lines for better readability).                               */\n  /*                                                                       */\n  /* {                                                                     */\n  /*   <optional whitespace>                                               */\n  /*   <module-name1> ':'                                                  */\n  /*   <property-name1> '=' <property-value1>                              */\n  /*   <whitespace>                                                        */\n  /*   <module-name2> ':'                                                  */\n  /*   <property-name2> '=' <property-value2>                              */\n  /*   ...                                                                 */\n  /* }                                                                     */\n  /*                                                                       */\n  /* Example:                                                              */\n  /*                                                                       */\n  /*   FREETYPE_PROPERTIES=truetype:interpreter-version=35 \\               */\n  /*                       cff:no-stem-darkening=1 \\                       */\n  /*                       autofitter:warping=1                            */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Uncomment the line below if you want to activate LCD rendering        */\n  /* technology similar to ClearType in this build of the library.  This   */\n  /* technology triples the resolution in the direction color subpixels.   */\n  /* To mitigate color fringes inherent to this technology, you also need  */\n  /* to explicitly set up LCD filtering.                                   */\n  /*                                                                       */\n  /* Note that this feature is covered by several Microsoft patents        */\n  /* and should not be activated in any default build of the library.      */\n  /* When this macro is not defined, FreeType offers alternative LCD       */\n  /* rendering technology that produces excellent output without LCD       */\n  /* filtering.                                                            */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */\n  /* by FreeType to speed up some computations.  However, this will create */\n  /* some problems when compiling the library in strict ANSI mode.         */\n  /*                                                                       */\n  /* For this reason, the use of 64-bit integers is normally disabled when */\n  /* the __STDC__ macro is defined.  You can however disable this by       */\n  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */\n  /*                                                                       */\n  /* For most compilers, this will only create compilation warnings when   */\n  /* building the library.                                                 */\n  /*                                                                       */\n  /* ObNote: The compiler-specific 64-bit integers are detected in the     */\n  /*         file `ftconfig.h' either statically or through the            */\n  /*         `configure' script on supported platforms.                    */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_FORCE_INT64\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, do not try to use an assembler version of   */\n  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */\n  /* that to verify that the assembler function works properly, or to      */\n  /* execute benchmark tests of the various implementations.               */\n/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* If this macro is defined, try to use an inlined assembler version of  */\n  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */\n  /* hinting glyphs, and which should be executed as fast as possible.     */\n  /*                                                                       */\n  /* Note that if your compiler or CPU is not supported, this will default */\n  /* to the standard and portable implementation found in `ftcalc.c'.      */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INLINE_MULFIX\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* LZW-compressed file support.                                          */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `compress' program.  This is mostly used to parse many of the PCF   */\n  /*   files that come with various X11 distributions.  The implementation */\n  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */\n  /*   (see src/lzw/ftgzip.c).                                             */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_LZW\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Gzip-compressed file support.                                         */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `gzip' program.  This is mostly used to parse many of the PCF files */\n  /*   that come with XFree86.  The implementation uses `zlib' to          */\n  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.  See also   */\n  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_USE_ZLIB\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* ZLib library selection                                                */\n  /*                                                                       */\n  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */\n  /*   It allows FreeType's `ftgzip' component to link to the system's     */\n  /*   installation of the ZLib library.  This is useful on systems like   */\n  /*   Unix or VMS where it generally is already available.                */\n  /*                                                                       */\n  /*   If you let it undefined, the component will use its own copy        */\n  /*   of the zlib sources instead.  These have been modified to be        */\n  /*   included directly within the component and *not* export external    */\n  /*   function names.  This allows you to link any program with FreeType  */\n  /*   _and_ ZLib without linking conflicts.                               */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n  /*   If you use a build system like cmake or the `configure' script,     */\n  /*   options set by those programs have precendence, overwriting the     */\n  /*   value here with the configured one.                                 */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_SYSTEM_ZLIB\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Bzip2-compressed file support.                                        */\n  /*                                                                       */\n  /*   FreeType now handles font files that have been compressed with the  */\n  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */\n  /*   files that come with XFree86.  The implementation uses `libbz2' to  */\n  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */\n  /*   Contrary to gzip, bzip2 currently is not included and need to use   */\n  /*   the system available bzip2 implementation.                          */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n  /*   If you use a build system like cmake or the `configure' script,     */\n  /*   options set by those programs have precendence, overwriting the     */\n  /*   value here with the configured one.                                 */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_USE_BZIP2 */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define to disable the use of file stream functions and types, FILE,   */\n  /* fopen() etc.  Enables the use of smaller system libraries on embedded */\n  /* systems that have multiple system libraries, some with or without     */\n  /* file stream support, in the cases where file stream support is not    */\n  /* necessary such as memory loading of font files.                       */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* PNG bitmap support.                                                   */\n  /*                                                                       */\n  /*   FreeType now handles loading color bitmap glyphs in the PNG format. */\n  /*   This requires help from the external libpng library.  Uncompressed  */\n  /*   color bitmaps do not need any external libraries and will be        */\n  /*   supported regardless of this configuration.                         */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n  /*   If you use a build system like cmake or the `configure' script,     */\n  /*   options set by those programs have precendence, overwriting the     */\n  /*   value here with the configured one.                                 */\n  /*                                                                       */\n#ifdef NATIVE_TOOLKIT_HAVE_PNG\n#define FT_CONFIG_OPTION_USE_PNG\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* HarfBuzz support.                                                     */\n  /*                                                                       */\n  /*   FreeType uses the HarfBuzz library to improve auto-hinting of       */\n  /*   OpenType fonts.  If available, many glyphs not directly addressable */\n  /*   by a font's character map will be hinted also.                      */\n  /*                                                                       */\n  /*   Define this macro if you want to enable this `feature'.             */\n  /*                                                                       */\n  /*   If you use a build system like cmake or the `configure' script,     */\n  /*   options set by those programs have precendence, overwriting the     */\n  /*   value here with the configured one.                                 */\n  /*                                                                       */\n#ifdef NATIVE_TOOLKIT_HAVE_HARFBUZZ\n#define FT_CONFIG_OPTION_USE_HARFBUZZ\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Glyph Postscript Names handling                                       */\n  /*                                                                       */\n  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */\n  /*   module is in charge of converting a glyph name string into a        */\n  /*   Unicode value, or return a Macintosh standard glyph name for the    */\n  /*   use with the TrueType `post' table.                                 */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want `psnames' compiled in your   */\n  /*   build of FreeType.  This has the following effects:                 */\n  /*                                                                       */\n  /*   - The TrueType driver will provide its own set of glyph names,      */\n  /*     if you build it to support postscript names in the TrueType       */\n  /*     `post' table, but will not synthesize a missing Unicode charmap.  */\n  /*                                                                       */\n  /*   - The Type 1 driver will not be able to synthesize a Unicode        */\n  /*     charmap out of the glyphs found in the fonts.                     */\n  /*                                                                       */\n  /*   You would normally undefine this configuration macro when building  */\n  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Postscript Names to Unicode Values support                            */\n  /*                                                                       */\n  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */\n  /*   in.  Among other things, the module is used to convert a glyph name */\n  /*   into a Unicode value.  This is especially useful in order to        */\n  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */\n  /*   through a big table named the `Adobe Glyph List' (AGL).             */\n  /*                                                                       */\n  /*   Undefine this macro if you do not want the Adobe Glyph List         */\n  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */\n  /*   able to synthesize a Unicode charmap out of the glyphs found in the */\n  /*   fonts.                                                              */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Support for Mac fonts                                                 */\n  /*                                                                       */\n  /*   Define this macro if you want support for outline fonts in Mac      */\n  /*   format (mac dfont, mac resource, macbinary containing a mac         */\n  /*   resource) on non-Mac platforms.                                     */\n  /*                                                                       */\n  /*   Note that the `FOND' resource isn't checked.                        */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_MAC_FONTS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Guessing methods to access embedded resource forks                    */\n  /*                                                                       */\n  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */\n  /*   GNU/Linux).                                                         */\n  /*                                                                       */\n  /*   Resource forks which include fonts data are stored sometimes in     */\n  /*   locations which users or developers don't expected.  In some cases, */\n  /*   resource forks start with some offset from the head of a file.  In  */\n  /*   other cases, the actual resource fork is stored in file different   */\n  /*   from what the user specifies.  If this option is activated,         */\n  /*   FreeType tries to guess whether such offsets or different file      */\n  /*   names must be used.                                                 */\n  /*                                                                       */\n  /*   Note that normal, direct access of resource forks is controlled via */\n  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */\n  /*                                                                       */\n#ifdef FT_CONFIG_OPTION_MAC_FONTS\n#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK\n#endif\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Allow the use of FT_Incremental_Interface to load typefaces that      */\n  /* contain no glyph data, but supply it via a callback function.         */\n  /* This is required by clients supporting document formats which         */\n  /* supply font data incrementally as the document is parsed, such        */\n  /* as the Ghostscript interpreter for the PostScript language.           */\n  /*                                                                       */\n#define FT_CONFIG_OPTION_INCREMENTAL\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* The size in bytes of the render pool used by the scan-line converter  */\n  /* to do all of its work.                                                */\n  /*                                                                       */\n#define FT_RENDER_POOL_SIZE  16384L\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* FT_MAX_MODULES                                                        */\n  /*                                                                       */\n  /*   The maximum number of modules that can be registered in a single    */\n  /*   FreeType library object.  32 is the default.                        */\n  /*                                                                       */\n#define FT_MAX_MODULES  32\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Debug level                                                           */\n  /*                                                                       */\n  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */\n  /*   errors are reported through the `ftdebug' component.  In trace      */\n  /*   mode, additional messages are sent to the standard output during    */\n  /*   execution.                                                          */\n  /*                                                                       */\n  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */\n  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */\n  /*                                                                       */\n  /*   Don't define any of these macros to compile in `release' mode!      */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_LEVEL_ERROR */\n/* #define FT_DEBUG_LEVEL_TRACE */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Autofitter debugging                                                  */\n  /*                                                                       */\n  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */\n  /*   control the autofitter behaviour for debugging purposes with global */\n  /*   boolean variables (consequently, you should *never* enable this     */\n  /*   while compiling in `release' mode):                                 */\n  /*                                                                       */\n  /*     _af_debug_disable_horz_hints                                      */\n  /*     _af_debug_disable_vert_hints                                      */\n  /*     _af_debug_disable_blue_hints                                      */\n  /*                                                                       */\n  /*   Additionally, the following functions provide dumps of various      */\n  /*   internal autofit structures to stdout (using `printf'):             */\n  /*                                                                       */\n  /*     af_glyph_hints_dump_points                                        */\n  /*     af_glyph_hints_dump_segments                                      */\n  /*     af_glyph_hints_dump_edges                                         */\n  /*     af_glyph_hints_get_num_segments                                   */\n  /*     af_glyph_hints_get_segment_offset                                 */\n  /*                                                                       */\n  /*   As an argument, they use another global variable:                   */\n  /*                                                                       */\n  /*     _af_debug_hints                                                   */\n  /*                                                                       */\n  /*   Please have a look at the `ftgrid' demo program to see how those    */\n  /*   variables and macros should be used.                                */\n  /*                                                                       */\n  /*   Do not #undef these macros here since the build system might define */\n  /*   them for certain configurations only.                               */\n  /*                                                                       */\n/* #define FT_DEBUG_AUTOFIT */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Memory Debugging                                                      */\n  /*                                                                       */\n  /*   FreeType now comes with an integrated memory debugger that is       */\n  /*   capable of detecting simple errors like memory leaks or double      */\n  /*   deletes.  To compile it within your build of the library, you       */\n  /*   should define FT_DEBUG_MEMORY here.                                 */\n  /*                                                                       */\n  /*   Note that the memory debugger is only activated at runtime when     */\n  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */\n  /*                                                                       */\n  /*   Do not #undef this macro here since the build system might define   */\n  /*   it for certain configurations only.                                 */\n  /*                                                                       */\n/* #define FT_DEBUG_MEMORY */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Module errors                                                         */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), the higher byte  */\n  /*   of an error code gives the module in which the error has occurred,  */\n  /*   while the lower byte is the real error code.                        */\n  /*                                                                       */\n  /*   Setting this macro makes sense for debugging purposes only, since   */\n  /*   it would break source compatibility of certain programs that use    */\n  /*   FreeType 2.                                                         */\n  /*                                                                       */\n  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */\n  /*                                                                       */\n#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Position Independent Code                                             */\n  /*                                                                       */\n  /*   If this macro is set (which is _not_ the default), FreeType2 will   */\n  /*   avoid creating constants that require address fixups.  Instead the  */\n  /*   constants will be moved into a struct and additional intialization  */\n  /*   code will be used.                                                  */\n  /*                                                                       */\n  /*   Setting this macro is needed for systems that prohibit address      */\n  /*   fixups, such as BREW.  [Note that standard compilers like gcc or    */\n  /*   clang handle PIC generation automatically; you don't have to set    */\n  /*   FT_CONFIG_OPTION_PIC, which is only necessary for very special      */\n  /*   compilers.]                                                         */\n  /*                                                                       */\n  /*   Note that FT_CONFIG_OPTION_PIC support is not available for all     */\n  /*   modules (see `modules.cfg' for a complete list).  For building with */\n  /*   FT_CONFIG_OPTION_PIC support, do the following.                     */\n  /*                                                                       */\n  /*     0. Clone the repository.                                          */\n  /*     1. Define FT_CONFIG_OPTION_PIC.                                   */\n  /*     2. Remove all subdirectories in `src' that don't have             */\n  /*        FT_CONFIG_OPTION_PIC support.                                  */\n  /*     3. Comment out the corresponding modules in `modules.cfg'.        */\n  /*     4. Compile.                                                       */\n  /*                                                                       */\n/* #define FT_CONFIG_OPTION_PIC */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */\n  /* embedded bitmaps in all formats using the SFNT module (namely         */\n  /* TrueType & OpenType).                                                 */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */\n  /* load and enumerate the glyph Postscript names in a TrueType or        */\n  /* OpenType file.                                                        */\n  /*                                                                       */\n  /* Note that when you do not compile the `PSNames' module by undefining  */\n  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */\n  /* contain additional code used to read the PS Names table from a font.  */\n  /*                                                                       */\n  /* (By default, the module uses `PSNames' to extract glyph names.)       */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */\n  /* access the internal name table in a SFNT-based format like TrueType   */\n  /* or OpenType.  The name table contains various strings used to         */\n  /* describe the font, like family name, copyright, version, etc.  It     */\n  /* does not contain any glyph name though.                               */\n  /*                                                                       */\n  /* Accessing SFNT names is done through the functions declared in        */\n  /* `ftsnames.h'.                                                         */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_SFNT_NAMES\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* TrueType CMap support                                                 */\n  /*                                                                       */\n  /*   Here you can fine-tune which TrueType CMap table format shall be    */\n  /*   supported.                                                          */\n#define TT_CONFIG_CMAP_FORMAT_0\n#define TT_CONFIG_CMAP_FORMAT_2\n#define TT_CONFIG_CMAP_FORMAT_4\n#define TT_CONFIG_CMAP_FORMAT_6\n#define TT_CONFIG_CMAP_FORMAT_8\n#define TT_CONFIG_CMAP_FORMAT_10\n#define TT_CONFIG_CMAP_FORMAT_12\n#define TT_CONFIG_CMAP_FORMAT_13\n#define TT_CONFIG_CMAP_FORMAT_14\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */\n  /* a bytecode interpreter in the TrueType driver.                        */\n  /*                                                                       */\n  /* By undefining this, you will only compile the code necessary to load  */\n  /* TrueType glyphs without hinting.                                      */\n  /*                                                                       */\n  /*   Do not #undef this macro here, since the build system might         */\n  /*   define it for certain configurations only.                          */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */\n  /* subpixel hinting support into the TrueType driver.  This modifies the */\n  /* TrueType hinting mechanism when anything but FT_RENDER_MODE_MONO is   */\n  /* requested.                                                            */\n  /*                                                                       */\n  /* In particular, it modifies the bytecode interpreter to interpret (or  */\n  /* not) instructions in a certain way so that all TrueType fonts look    */\n  /* like they do in a Windows ClearType (DirectWrite) environment.  See   */\n  /* [1] for a technical overview on what this means.  See `ttinterp.h'    */\n  /* for more details on the LEAN option.                                  */\n  /*                                                                       */\n  /* There are three possible values.                                      */\n  /*                                                                       */\n  /* Value 1:                                                              */\n  /*    This value is associated with the `Infinality' moniker,            */\n  /*    contributed by an individual nicknamed Infinality with the goal of */\n  /*    making TrueType fonts render better than on Windows.  A high       */\n  /*    amount of configurability and flexibility, down to rules for       */\n  /*    single glyphs in fonts, but also very slow.  Its experimental and  */\n  /*    slow nature and the original developer losing interest meant that  */\n  /*    this option was never enabled in default builds.                   */\n  /*                                                                       */\n  /*    The corresponding interpreter version is v38.                      */\n  /*                                                                       */\n  /* Value 2:                                                              */\n  /*    The new default mode for the TrueType driver.  The Infinality code */\n  /*    base was stripped to the bare minimum and all configurability      */\n  /*    removed in the name of speed and simplicity.  The configurability  */\n  /*    was mainly aimed at legacy fonts like Arial, Times New Roman, or   */\n  /*    Courier.  Legacy fonts are fonts that modify vertical stems to     */\n  /*    achieve clean black-and-white bitmaps.  The new mode focuses on    */\n  /*    applying a minimal set of rules to all fonts indiscriminately so   */\n  /*    that modern and web fonts render well while legacy fonts render    */\n  /*    okay.                                                              */\n  /*                                                                       */\n  /*    The corresponding interpreter version is v40.                      */\n  /*                                                                       */\n  /* Value 3:                                                              */\n  /*    Compile both, making both v38 and v40 available (the latter is the */\n  /*    default).                                                          */\n  /*                                                                       */\n  /* By undefining these, you get rendering behavior like on Windows       */\n  /* without ClearType, i.e., Windows XP without ClearType enabled and     */\n  /* Win9x (interpreter version v35).  Or not, depending on how much       */\n  /* hinting blood and testing tears the font designer put into a given    */\n  /* font.  If you define one or both subpixel hinting options, you can    */\n  /* switch between between v35 and the ones you define (using             */\n  /* `FT_Property_Set').                                                   */\n  /*                                                                       */\n  /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be      */\n  /* defined.                                                              */\n  /*                                                                       */\n  /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */\n  /*                                                                       */\n/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  1         */\n#define TT_CONFIG_OPTION_SUBPIXEL_HINTING  2\n/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  ( 1 | 2 ) */\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */\n  /* TrueType glyph loader to use Apple's definition of how to handle      */\n  /* component offsets in composite glyphs.                                */\n  /*                                                                       */\n  /* Apple and MS disagree on the default behavior of component offsets    */\n  /* in composites.  Apple says that they should be scaled by the scaling  */\n  /* factors in the transformation matrix (roughly, it's more complex)     */\n  /* while MS says they should not.  OpenType defines two bits in the      */\n  /* composite flags array which can be used to disambiguate, but old      */\n  /* fonts will not have them.                                             */\n  /*                                                                       */\n  /*   https://www.microsoft.com/typography/otspec/glyf.htm                */\n  /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */\n  /*                                                                       */\n#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */\n  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */\n  /* and avar tables).  This has many similarities to Type 1 Multiple      */\n  /* Masters support.                                                      */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_GX_VAR_SUPPORT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */\n  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */\n  /*                                                                       */\n#define TT_CONFIG_OPTION_BDF\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Option TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES controls the maximum     */\n  /* number of bytecode instructions executed for a single run of the      */\n  /* bytecode interpreter, needed to prevent infinite loops.  You don't    */\n  /* want to change this except for very special situations (e.g., making  */\n  /* a library fuzzer spend less time to handle broken fonts).             */\n  /*                                                                       */\n  /* It is not expected that this value is ever modified by a configuring  */\n  /* script; instead, it gets surrounded with #ifndef ... #endif so that   */\n  /* the value can be set as a preprocessor option on the compiler's       */\n  /* command line.                                                         */\n  /*                                                                       */\n#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES\n#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES  1000000L\n#endif\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and       */\n  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */\n  /* required.                                                             */\n  /*                                                                       */\n#define T1_MAX_DICT_DEPTH  5\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */\n  /* calls during glyph loading.                                           */\n  /*                                                                       */\n#define T1_MAX_SUBRS_CALLS  16\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */\n  /* minimum of 16 is required.                                            */\n  /*                                                                       */\n  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */\n  /*                                                                       */\n#define T1_MAX_CHARSTRINGS_OPERANDS  256\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */\n  /* files into an existing face.  Note that if set, the T1 driver will be */\n  /* unable to produce kerning distances.                                  */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_AFM\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Define this configuration macro if you want to prevent the            */\n  /* compilation of the Multiple Masters font support in the Type 1        */\n  /* driver.                                                               */\n  /*                                                                       */\n#undef T1_CONFIG_OPTION_NO_MM_SUPPORT\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1     */\n  /* engine gets compiled into FreeType.  If defined, it is possible to    */\n  /* switch between the two engines using the `hinting-engine' property of */\n  /* the type1 driver module.                                              */\n  /*                                                                       */\n/* #define T1_CONFIG_OPTION_OLD_ENGINE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Using CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4} it is      */\n  /* possible to set up the default values of the four control points that */\n  /* define the stem darkening behaviour of the (new) CFF engine.  For     */\n  /* more details please read the documentation of the                     */\n  /* `darkening-parameters' property (file `ftdriver.h'), which allows the */\n  /* control at run-time.                                                  */\n  /*                                                                       */\n  /* Do *not* undefine these macros!                                       */\n  /*                                                                       */\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1   500\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1   400\n\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2  1000\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2   275\n\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3  1667\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3   275\n\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4  2333\n#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4     0\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF       */\n  /* engine gets compiled into FreeType.  If defined, it is possible to    */\n  /* switch between the two engines using the `hinting-engine' property of */\n  /* the cff driver module.                                                */\n  /*                                                                       */\n/* #define CFF_CONFIG_OPTION_OLD_ENGINE */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****         P C F   D R I V E R    C O N F I G U R A T I O N        ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* There are many PCF fonts just called `Fixed' which look completely    */\n  /* different, and which have nothing to do with each other.  When        */\n  /* selecting `Fixed' in KDE or Gnome one gets results that appear rather */\n  /* random, the style changes often if one changes the size and one       */\n  /* cannot select some fonts at all.  This option makes the PCF module    */\n  /* prepend the foundry name (plus a space) to the family name.           */\n  /*                                                                       */\n  /* We also check whether we have `wide' characters; all put together, we */\n  /* get family names like `Sony Fixed' or `Misc Fixed Wide'.              */\n  /*                                                                       */\n  /* If this option is activated, it can be controlled with the            */\n  /* `no-long-family-names' property of the pcf driver module.             */\n  /*                                                                       */\n/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */\n\n\n  /*************************************************************************/\n  /*************************************************************************/\n  /****                                                                 ****/\n  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/\n  /****                                                                 ****/\n  /*************************************************************************/\n  /*************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */\n  /* support.                                                              */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_CJK\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with fallback Indic script support, covering   */\n  /* some scripts that the `latin' submodule of the autofit module doesn't */\n  /* (yet) handle.                                                         */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_INDIC\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Compile autofit module with warp hinting.  The idea of the warping    */\n  /* code is to slightly scale and shift a glyph within a single dimension */\n  /* so that as much of its segments are aligned (more or less) on the     */\n  /* grid.  To find out the optimal scaling and shifting value, various    */\n  /* parameter combinations are tried and scored.                          */\n  /*                                                                       */\n  /* This experimental option is active only if the rendering mode is      */\n  /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the      */\n  /* `warping' property of the auto-hinter (see file `ftdriver.h' for more */\n  /* information; by default it is switched off).                          */\n  /*                                                                       */\n#define AF_CONFIG_OPTION_USE_WARPER\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Use TrueType-like size metrics for `light' auto-hinting.              */\n  /*                                                                       */\n  /* It is strongly recommended to avoid this option, which exists only to */\n  /* help some legacy applications retain its appearance and behaviour     */\n  /* with respect to auto-hinted TrueType fonts.                           */\n  /*                                                                       */\n  /* The very reason this option exists at all are GNU/Linux distributions */\n  /* like Fedora that did not un-patch the following change (which was     */\n  /* present in FreeType between versions 2.4.6 and 2.7.1, inclusive).     */\n  /*                                                                       */\n  /*   2011-07-16  Steven Chu  <steven.f.chu@gmail.com>                    */\n  /*                                                                       */\n  /*     [truetype] Fix metrics on size request for scalable fonts.        */\n  /*                                                                       */\n  /* This problematic commit is now reverted (more or less).               */\n  /*                                                                       */\n/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */\n\n  /* */\n\n\n  /*\n   * This macro is obsolete.  Support has been removed in FreeType\n   * version 2.5.\n   */\n/* #define FT_CONFIG_OPTION_OLD_INTERNALS */\n\n\n  /*\n   * This macro is defined if native TrueType hinting is requested by the\n   * definitions above.\n   */\n#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER\n#define  TT_USE_BYTECODE_INTERPRETER\n\n#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING\n#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1\n#define  TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY\n#endif\n\n#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2\n#define  TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL\n#endif\n#endif\n#endif\n\n\n  /*\n   * Check CFF darkening parameters.  The checks are the same as in function\n   * `cff_property_set' in file `cffdrivr.c'.\n   */\n#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0   || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0   || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0   || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0   || \\\n                                                      \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0   || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0   || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0   || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0   || \\\n                                                      \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 >        \\\n      CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2     || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 >        \\\n      CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3     || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 >        \\\n      CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4     || \\\n                                                      \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \\\n    CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500\n#error \"Invalid CFF darkening parameters!\"\n#endif\n\nFT_END_HEADER\n\n\n#endif /* FTOPTION_H_ */\n\n\n/* END */\n"
  },
  {
    "path": "project/lib/custom/freetype/include/ft2build.h",
    "content": "/***************************************************************************/\n/*                                                                         */\n/*  ft2build.h                                                             */\n/*                                                                         */\n/*    FreeType 2 build and setup macros.                                   */\n/*                                                                         */\n/*  Copyright 1996-2018 by                                                 */\n/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n/*                                                                         */\n/*  This file is part of the FreeType project, and may only be used,       */\n/*  modified, and distributed under the terms of the FreeType project      */\n/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n/*  this file you indicate that you have read the license and              */\n/*  understand and accept it fully.                                        */\n/*                                                                         */\n/***************************************************************************/\n\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* This is the `entry point' for FreeType header file inclusions.  It is */\n  /* the only header file which should be included directly; all other     */\n  /* FreeType header files should be accessed with macro names (after      */\n  /* including `ft2build.h').                                              */\n  /*                                                                       */\n  /* A typical example is                                                  */\n  /*                                                                       */\n  /*   #include <ft2build.h>                                               */\n  /*   #include FT_FREETYPE_H                                              */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n#ifndef FT2BUILD_H_\n#define FT2BUILD_H_\n\n#ifdef HX_WINRT\n#define NOMINMAX\n#define generic GenericFromFreeTypeLibrary\n#endif\n\n#include <freetype/config/ftheader.h>\n\n#endif /* FT2BUILD_H_ */\n\n\n/* END */\n"
  },
  {
    "path": "project/lib/custom/hl-ssl/threading_alt.h",
    "content": "#include <windows.h>\n\ntypedef struct {\n  CRITICAL_SECTION cs;\n  char is_valid;\n} mbedtls_threading_mutex_t;\n"
  },
  {
    "path": "project/lib/custom/jpeg/jconfig.h",
    "content": "/* Version ID for the JPEG library.\n * Might be useful for tests like \"#if JPEG_LIB_VERSION >= 60\".\n */\n#define JPEG_LIB_VERSION  62\n\n/* libjpeg-turbo version */\n#define LIBJPEG_TURBO_VERSION  2.0.7\n\n/* libjpeg-turbo version in integer form */\n#define LIBJPEG_TURBO_VERSION_NUMBER  2000007\n\n/* Support arithmetic encoding */\n#define C_ARITH_CODING_SUPPORTED 1\n\n/* Support arithmetic decoding */\n#define D_ARITH_CODING_SUPPORTED 1\n\n/* Support in-memory source/destination managers */\n#define MEM_SRCDST_SUPPORTED 1\n\n/* Use accelerated SIMD routines. */\n#ifndef __ANDROID__\n#define WITH_SIMD 1\n#endif\n\n/*\n * Define BITS_IN_JSAMPLE as either\n *   8   for 8-bit sample values (the usual setting)\n *   12  for 12-bit sample values\n * Only 8 and 12 are legal data precisions for lossy JPEG according to the\n * JPEG standard, and the IJG code does not support anything else!\n * We do not support run-time selection of data precision, sorry.\n */\n\n#define BITS_IN_JSAMPLE  8      /* use 8 or 12 */\n\n/* Define to 1 if you have the <locale.h> header file. */\n#define HAVE_LOCALE_H 1\n\n/* Define to 1 if you have the <stddef.h> header file. */\n#define HAVE_STDDEF_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define if you need to include <sys/types.h> to get size_t. */\n#define NEED_SYS_TYPES_H 1\n\n/* Define if you have BSD-like bzero and bcopy in <strings.h> rather than\n   memset/memcpy in <string.h>. */\n/* #undef NEED_BSD_STRINGS */\n\n/* Define to 1 if the system has the type `unsigned char'. */\n#define HAVE_UNSIGNED_CHAR 1\n\n/* Define to 1 if the system has the type `unsigned short'. */\n#define HAVE_UNSIGNED_SHORT 1\n\n/* Compiler does not support pointers to undefined structures. */\n/* #undef INCOMPLETE_TYPES_BROKEN */\n\n/* Define if your (broken) compiler shifts signed values as if they were\n   unsigned. */\n/* #undef RIGHT_SHIFT_IS_UNSIGNED */\n\n/* Define to 1 if type `char' is unsigned and you are not using gcc.  */\n#ifndef __CHAR_UNSIGNED__\n/* #undef __CHAR_UNSIGNED__ */\n#endif\n\n/* If rpcndr.h has defined boolean, jmorecfg.h should not. */\n#ifndef __RPCNDR_H__\t\t/* don't conflict if rpcndr.h already read */\ntypedef unsigned char boolean;\n#endif\n#define HAVE_BOOLEAN\t\t/* prevent jmorecfg.h from redefining it */\n\n/* Define to empty if `const' does not conform to ANSI C. */\n/* #undef const */\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n/* #undef size_t */\n"
  },
  {
    "path": "project/lib/custom/jpeg/jconfigint.h",
    "content": "/* libjpeg-turbo build number */\n#define BUILD  \"20220513\"\n\n/* Compiler's inline keyword */\n#undef inline\n\n/* How to obtain function inlining. */\n#if defined(__has_attribute)\n#define INLINE __inline__ __attribute__((always_inline))\n#elif defined(_MSC_VER)\n#define INLINE __forceinline\n#else\n#define INLINE\n#endif\n\n/* How to obtain thread-local storage */\n#define THREAD_LOCAL  __thread\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME  \"libjpeg-turbo\"\n\n/* Version number of package */\n#define VERSION  \"2.0.7\"\n\n/* The size of `size_t', as computed by sizeof. */\n#if (__WORDSIZE == 64) || defined(_WIN64)\n#define SIZEOF_SIZE_T  8\n#else\n#define SIZEOF_SIZE_T  4\n#endif\n\n/* Define if your compiler has __builtin_ctzl() and sizeof(unsigned long) == sizeof(size_t). */\n#ifndef HX_WINDOWS\n#define HAVE_BUILTIN_CTZL\n#endif\n\n/* Define to 1 if you have the <intrin.h> header file. */\n/* #undef HAVE_INTRIN_H */\n\n#if defined(_MSC_VER) && defined(HAVE_INTRIN_H)\n#if (SIZEOF_SIZE_T == 8)\n#define HAVE_BITSCANFORWARD64\n#elif (SIZEOF_SIZE_T == 4)\n#define HAVE_BITSCANFORWARD\n#endif\n#endif\n\n#if defined(__has_attribute)\n#if __has_attribute(fallthrough)\n#define FALLTHROUGH  __attribute__((fallthrough));\n#else\n#define FALLTHROUGH\n#endif\n#else\n#define FALLTHROUGH\n#endif\n"
  },
  {
    "path": "project/lib/custom/jpeg/jversion.h",
    "content": "/*\n * jversion.h\n *\n * This file was part of the Independent JPEG Group's software:\n * Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.\n * libjpeg-turbo Modifications:\n * Copyright (C) 2010, 2012-2022, D. R. Commander.\n * For conditions of distribution and use, see the accompanying README.ijg\n * file.\n *\n * This file contains software version identification.\n */\n\n\n#if JPEG_LIB_VERSION >= 80\n\n#define JVERSION        \"8d  15-Jan-2012\"\n\n#elif JPEG_LIB_VERSION >= 70\n\n#define JVERSION        \"7  27-Jun-2009\"\n\n#else\n\n#define JVERSION        \"6b  27-Mar-1998\"\n\n#endif\n\n/*\n * NOTE: It is our convention to place the authors in the following order:\n * - libjpeg-turbo authors (2009-) in descending order of the date of their\n *   most recent contribution to the project, then in ascending order of the\n *   date of their first contribution to the project, then in alphabetical\n *   order\n * - Upstream authors in descending order of the date of the first inclusion of\n *   their code\n */\n\n#define JCOPYRIGHT \\\n  \"Copyright (C) 2009-2022 D. R. Commander\\n\" \\\n  \"Copyright (C) 2015, 2020 Google, Inc.\\n\" \\\n  \"Copyright (C) 2019 Arm Limited\\n\" \\\n  \"Copyright (C) 2015-2016, 2018 Matthieu Darbois\\n\" \\\n  \"Copyright (C) 2011-2016 Siarhei Siamashka\\n\" \\\n  \"Copyright (C) 2015 Intel Corporation\\n\" \\\n  \"Copyright (C) 2013-2014 Linaro Limited\\n\" \\\n  \"Copyright (C) 2013-2014 MIPS Technologies, Inc.\\n\" \\\n  \"Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB\\n\" \\\n  \"Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)\\n\" \\\n  \"Copyright (C) 1999-2006 MIYASAKA Masaru\\n\" \\\n  \"Copyright (C) 1991-2017 Thomas G. Lane, Guido Vollbeding\"\n\n#define JCOPYRIGHT_SHORT \\\n  \"Copyright (C) 1991-2022 The libjpeg-turbo Project and many others\"\n"
  },
  {
    "path": "project/lib/custom/mbedtls_hxcpp/mbedtls_config.h",
    "content": ""
  },
  {
    "path": "project/lib/custom/ogg/include/ogg/config_types.h",
    "content": "#ifndef __CONFIG_TYPES_H__\n#define __CONFIG_TYPES_H__\n\n#include <inttypes.h>\n\ntypedef int16_t ogg_int16_t;\ntypedef uint16_t ogg_uint16_t;\ntypedef int32_t ogg_int32_t;\ntypedef uint32_t ogg_uint32_t;\ntypedef int64_t ogg_int64_t;\ntypedef uint64_t ogg_uint64_t;\n\n#endif\n"
  },
  {
    "path": "project/lib/custom/openal/alc/hrtf_default.h",
    "content": "static const unsigned char hrtf_default[] = {\n  0x4d, 0x69, 0x6e, 0x50, 0x48, 0x52, 0x30, 0x32, 0x44, 0xac, 0x00, 0x00, 0x01, 0x00, 0x20, 0x01, \n  0x78, 0x05, 0x13, 0x01, 0x0c, 0x18, 0x24, 0x2d, 0x38, 0x3c, 0x48, 0x48, 0x48, 0x48, 0x48, 0x3c, \n  0x38, 0x2d, 0x24, 0x18, 0x0c, 0x01, 0xa3, 0x5d, 0x19, 0x97, 0xe7, 0x20, 0xbc, 0x3f, 0x0b, 0xff, \n  0xcb, 0x08, 0xb7, 0xa4, 0x01, 0x86, 0x64, 0xff, 0x5e, 0x88, 0x02, 0xd3, 0xb5, 0xfb, 0x56, 0x51, \n  0xf5, 0x75, 0xac, 0xfb, 0x2b, 0x52, 0x03, 0x59, 0x8d, 0xfe, 0x0f, 0x7e, 0xfc, 0xbe, 0x36, 0xfa, \n  0xea, 0xfb, 0xfa, 0xf7, 0xcb, 0xfe, 0x75, 0x4f, 0xff, 0xd0, 0xbe, 0xfe, 0xde, 0x5a, 0xff, 0xd7, \n  0x47, 0xff, 0x5f, 0x55, 0xfe, 0x4f, 0x20, 0xff, 0xc6, 0xf9, 0xfd, 0xae, 0x8b, 0xfe, 0x09, 0x42, \n  0xfe, 0x89, 0x33, 0xfd, 0xc0, 0xe9, 0xfd, 0x75, 0xa4, 0xfe, 0x82, 0x1e, 0xff, 0x1e, 0xa0, 0xff, \n  0x86, 0x03, 0x00, 0x76, 0x68, 0xff, 0x21, 0xe4, 0x1a, 0xd6, 0xe6, 0x1f, 0xf0, 0x6d, 0x08, 0xd4, \n  0x60, 0x09, 0xfc, 0xab, 0x01, 0x90, 0xce, 0xfe, 0x2d, 0xa0, 0x02, 0x16, 0x00, 0xfc, 0xa7, 0xbc, \n  0xf5, 0xdd, 0x49, 0xfb, 0xf6, 0x31, 0x03, 0xe8, 0x05, 0xff, 0x56, 0xcc, 0xfc, 0x13, 0x20, 0xfb, \n  0x4b, 0x98, 0xfb, 0xeb, 0xc5, 0xfd, 0xdb, 0x05, 0xff, 0x0c, 0x22, 0xff, 0xbb, 0x2a, 0xff, 0x38, \n  0x25, 0xff, 0x73, 0x2a, 0xfe, 0x07, 0xf0, 0xfe, 0xe9, 0x04, 0xfe, 0x0c, 0x97, 0xfe, 0xc8, 0x68, \n  0xfe, 0x1a, 0x87, 0xfd, 0xa3, 0x0a, 0xfe, 0xcc, 0xff, 0xfe, 0x16, 0x7c, 0xff, 0x2a, 0xbc, 0xff, \n  0xa7, 0x08, 0x00, 0x86, 0x57, 0xff, 0xbb, 0x47, 0x19, 0x2c, 0x52, 0x1e, 0x08, 0x38, 0x08, 0x5b, \n  0x44, 0x08, 0x2a, 0x93, 0x01, 0x19, 0xa7, 0xff, 0x44, 0xa4, 0x02, 0xbb, 0xad, 0xfb, 0xac, 0x21, \n  0xf6, 0xd0, 0x62, 0xfc, 0x7b, 0x1f, 0x03, 0x7a, 0x49, 0xfe, 0xa8, 0xe6, 0xfc, 0x65, 0x46, 0xfb, \n  0x27, 0x2f, 0xfc, 0x05, 0xeb, 0xfe, 0x46, 0x21, 0xff, 0xdb, 0x23, 0xff, 0xaf, 0xa5, 0xff, 0xd7, \n  0x42, 0xff, 0xd9, 0x59, 0xfe, 0x65, 0x43, 0xff, 0xde, 0x20, 0xfe, 0x9f, 0xa5, 0xfe, 0x94, 0x3f, \n  0xfe, 0x3d, 0x69, 0xfd, 0x4d, 0x38, 0xfe, 0x0f, 0xd3, 0xfe, 0xc8, 0x44, 0xff, 0x21, 0xbb, 0xff, \n  0x4b, 0x14, 0x00, 0xe4, 0x73, 0xff, 0xdf, 0x1d, 0x18, 0xd8, 0xc1, 0x1c, 0xc6, 0x97, 0x07, 0x28, \n  0xa9, 0x07, 0x38, 0x44, 0x01, 0xf0, 0xbb, 0xff, 0xaa, 0xba, 0x02, 0xb2, 0xdb, 0xfb, 0xe7, 0x8b, \n  0xf6, 0xe0, 0x27, 0xfd, 0xe0, 0xa2, 0x03, 0xc8, 0x75, 0xfe, 0x52, 0x42, 0xfd, 0xa4, 0x8b, 0xfb, \n  0x42, 0x51, 0xfc, 0x59, 0x72, 0xff, 0x62, 0x6f, 0xff, 0x52, 0xe4, 0xfe, 0xc4, 0x86, 0xff, 0xbe, \n  0x61, 0xff, 0xc2, 0x89, 0xfe, 0xe2, 0x6b, 0xff, 0x80, 0x41, 0xfe, 0x37, 0xdc, 0xfe, 0x08, 0x7e, \n  0xfe, 0xf5, 0x88, 0xfd, 0x3c, 0x47, 0xfe, 0x20, 0xdf, 0xfe, 0x1e, 0x49, 0xff, 0x78, 0xbd, 0xff, \n  0x4d, 0x0f, 0x00, 0x7a, 0x72, 0xff, 0xcd, 0xd8, 0x17, 0xe2, 0x74, 0x1c, 0x94, 0x7d, 0x07, 0xf3, \n  0x8d, 0x07, 0x7e, 0x49, 0x01, 0xc4, 0xf0, 0xff, 0xc9, 0x07, 0x03, 0x32, 0x30, 0xfc, 0xf5, 0xdb, \n  0xf6, 0x3d, 0x71, 0xfd, 0x4c, 0xd4, 0x03, 0x27, 0x88, 0xfe, 0x01, 0x22, 0xfd, 0x01, 0x49, 0xfb, \n  0xed, 0x39, 0xfc, 0xeb, 0x90, 0xff, 0x30, 0x81, 0xff, 0x03, 0xde, 0xfe, 0x61, 0x86, 0xff, 0x06, \n  0x6a, 0xff, 0xf3, 0x8f, 0xfe, 0x68, 0x77, 0xff, 0xb2, 0x57, 0xfe, 0x8a, 0xfe, 0xfe, 0xc4, 0xaa, \n  0xfe, 0xa3, 0xa7, 0xfd, 0x96, 0x56, 0xfe, 0xd3, 0xde, 0xfe, 0x60, 0x2f, 0xff, 0x8a, 0x9d, 0xff, \n  0x8d, 0xf3, 0xff, 0xcf, 0x5c, 0xff, 0x02, 0x3e, 0x18, 0xf4, 0x05, 0x1d, 0x70, 0x92, 0x07, 0xeb, \n  0x55, 0x07, 0x3e, 0xee, 0x00, 0xd3, 0xa1, 0xff, 0xa6, 0xcc, 0x02, 0xed, 0xde, 0xfb, 0xd2, 0x53, \n  0xf6, 0xed, 0xea, 0xfc, 0x84, 0xd5, 0x03, 0x50, 0xc0, 0xfe, 0x4e, 0x29, 0xfd, 0x81, 0x2a, 0xfb, \n  0xa2, 0x15, 0xfc, 0x7d, 0x91, 0xff, 0x44, 0xb2, 0xff, 0xa6, 0x13, 0xff, 0x5e, 0xa9, 0xff, 0x12, \n  0x90, 0xff, 0xfa, 0xab, 0xfe, 0x31, 0x7d, 0xff, 0xd6, 0x4f, 0xfe, 0x50, 0xe7, 0xfe, 0x93, 0x8f, \n  0xfe, 0x94, 0x96, 0xfd, 0x23, 0x5a, 0xfe, 0xec, 0xff, 0xfe, 0xab, 0x6c, 0xff, 0x19, 0xe4, 0xff, \n  0x5f, 0x21, 0x00, 0x05, 0x64, 0xff, 0x21, 0xb8, 0x19, 0x8b, 0xa7, 0x1e, 0xee, 0xbc, 0x07, 0x58, \n  0xb2, 0x07, 0x4e, 0x00, 0x01, 0x51, 0x9b, 0xff, 0x30, 0xc2, 0x02, 0x17, 0x32, 0xfb, 0x8d, 0x41, \n  0xf5, 0xae, 0x39, 0xfc, 0x59, 0x0b, 0x04, 0x95, 0xa8, 0xfe, 0x4c, 0x93, 0xfc, 0x31, 0x8c, 0xfa, \n  0x4f, 0xab, 0xfb, 0x8d, 0x5d, 0xff, 0xd7, 0x96, 0xff, 0xcf, 0xf0, 0xfe, 0x53, 0x9b, 0xff, 0x7c, \n  0x8d, 0xff, 0x51, 0x82, 0xfe, 0x91, 0x6f, 0xff, 0x5b, 0x4c, 0xfe, 0x51, 0xea, 0xfe, 0xd1, 0x8d, \n  0xfe, 0xc9, 0x8e, 0xfd, 0x60, 0x5a, 0xfe, 0x57, 0x0c, 0xff, 0xc7, 0x6a, 0xff, 0xc4, 0xd4, 0xff, \n  0xc1, 0x25, 0x00, 0xa6, 0x7d, 0xff, 0xe0, 0xb3, 0x1a, 0x77, 0x75, 0x20, 0xcc, 0x8d, 0x08, 0xc9, \n  0x0a, 0x08, 0x74, 0x16, 0x01, 0xa6, 0x20, 0xff, 0xe9, 0x96, 0x02, 0x3d, 0xbd, 0xfa, 0x39, 0xf1, \n  0xf4, 0x74, 0x36, 0xfc, 0x69, 0x54, 0x03, 0xca, 0x2e, 0xfe, 0x8a, 0xbd, 0xfc, 0x9a, 0x96, 0xfa, \n  0x9c, 0x8d, 0xfb, 0x91, 0x1b, 0xff, 0x3a, 0x59, 0xff, 0xc3, 0x27, 0xff, 0x21, 0xab, 0xff, 0x7a, \n  0x56, 0xff, 0xfa, 0x59, 0xfe, 0x7f, 0x47, 0xff, 0x1b, 0x23, 0xfe, 0xe7, 0xc2, 0xfe, 0x80, 0x5a, \n  0xfe, 0x35, 0x6b, 0xfd, 0x1e, 0x3f, 0xfe, 0x27, 0xdc, 0xfe, 0x34, 0x59, 0xff, 0x74, 0xca, 0xff, \n  0xa4, 0x22, 0x00, 0xee, 0x76, 0xff, 0x82, 0xe7, 0x1b, 0x1a, 0xfe, 0x20, 0xcd, 0x4c, 0x08, 0x4c, \n  0xff, 0x08, 0x29, 0xb7, 0x01, 0x58, 0x0b, 0xff, 0x22, 0x01, 0x02, 0x11, 0xdc, 0xf9, 0x05, 0x33, \n  0xf5, 0xb0, 0xde, 0xfd, 0x6d, 0xff, 0x02, 0xff, 0x16, 0xfc, 0x8f, 0x15, 0xfc, 0x1c, 0x0f, 0xfb, \n  0xb8, 0x99, 0xfc, 0x04, 0xb3, 0xff, 0xa0, 0xd8, 0xfe, 0x5c, 0xbd, 0xfe, 0x5f, 0xcd, 0xff, 0xc4, \n  0x49, 0xff, 0x26, 0x5e, 0xfe, 0xa1, 0x61, 0xff, 0xa4, 0xf7, 0xfd, 0x65, 0xa3, 0xfe, 0x43, 0x0d, \n  0xfe, 0x54, 0x1f, 0xfd, 0x8d, 0x2d, 0xfe, 0x27, 0xab, 0xfe, 0x31, 0x0a, 0xff, 0xdb, 0xa8, 0xff, \n  0xcb, 0x0d, 0x00, 0x70, 0x4f, 0xff, 0x07, 0x93, 0x1e, 0xe4, 0x0d, 0x23, 0x7a, 0x5d, 0x06, 0x69, \n  0x54, 0x07, 0x70, 0x36, 0x00, 0x9d, 0x25, 0xff, 0x40, 0xc4, 0x03, 0x01, 0x21, 0xfa, 0x60, 0x67, \n  0xf4, 0xb7, 0x8e, 0xfe, 0x1b, 0x2e, 0x05, 0xc5, 0x2a, 0xfc, 0x2f, 0xb3, 0xfa, 0x68, 0xe2, 0xf9, \n  0xb4, 0x73, 0xfc, 0x21, 0x41, 0x00, 0x4f, 0xa3, 0xfe, 0x67, 0x04, 0xfe, 0x67, 0xa6, 0xff, 0x68, \n  0x52, 0xff, 0x53, 0xfa, 0xfd, 0xb4, 0x60, 0xff, 0xb9, 0xe8, 0xfd, 0x44, 0xb3, 0xfe, 0xe4, 0x09, \n  0xfe, 0x64, 0xc1, 0xfc, 0x60, 0x0e, 0xfe, 0x6c, 0xcc, 0xfe, 0xf9, 0x17, 0xff, 0xf1, 0xa3, 0xff, \n  0x58, 0x12, 0x00, 0x75, 0x3f, 0xff, 0xc3, 0x6c, 0x1f, 0xc8, 0x0c, 0x24, 0x46, 0xee, 0x06, 0x31, \n  0xe2, 0x06, 0xa6, 0x0f, 0xff, 0x5c, 0x17, 0xff, 0xed, 0x1c, 0x04, 0xd4, 0xbf, 0xfa, 0x06, 0x57, \n  0xf3, 0x97, 0x53, 0xfd, 0xc3, 0x67, 0x06, 0x6b, 0x15, 0xfe, 0xcc, 0xd2, 0xfa, 0x49, 0xed, 0xf7, \n  0x8e, 0x3d, 0xfb, 0x4b, 0xc0, 0x00, 0xec, 0xbf, 0xff, 0x70, 0xd3, 0xfd, 0xd1, 0x0f, 0xff, 0xd7, \n  0x31, 0xff, 0xe1, 0xcf, 0xfd, 0x30, 0x34, 0xff, 0x04, 0xa8, 0xfd, 0x6c, 0xb5, 0xfe, 0x53, 0x29, \n  0xfe, 0x0b, 0xe6, 0xfc, 0xd6, 0xfa, 0xfd, 0x80, 0xe2, 0xfe, 0xd8, 0x37, 0xff, 0x20, 0x9e, 0xff, \n  0x46, 0xf9, 0xff, 0x57, 0x1a, 0xff, 0x33, 0x58, 0x1e, 0xfe, 0x8c, 0x23, 0x88, 0x16, 0x09, 0xfd, \n  0x0d, 0x08, 0x9c, 0x8c, 0xff, 0x4b, 0xe8, 0xfe, 0xec, 0x08, 0x03, 0xfc, 0x06, 0xfb, 0xdc, 0xa8, \n  0xf2, 0xf1, 0x6a, 0xfb, 0xe9, 0x53, 0x05, 0xdc, 0x21, 0xff, 0x4a, 0x9c, 0xfd, 0xcc, 0x55, 0xf8, \n  0x13, 0x1f, 0xf9, 0xfe, 0x0d, 0x00, 0x61, 0x61, 0x00, 0x18, 0xce, 0xfe, 0x47, 0x3a, 0xff, 0x31, \n  0x0f, 0xff, 0x0e, 0x1f, 0xfe, 0xde, 0x36, 0xff, 0x93, 0xa0, 0xfd, 0x5a, 0xd2, 0xfe, 0x0a, 0x27, \n  0xfe, 0xdd, 0x9b, 0xfc, 0x3d, 0xe0, 0xfd, 0x74, 0x93, 0xfe, 0xad, 0x3b, 0xff, 0xe8, 0xcc, 0xff, \n  0x72, 0x25, 0x00, 0x25, 0x68, 0xff, 0xa4, 0xfd, 0x1c, 0xd5, 0x6b, 0x22, 0xc7, 0x9e, 0x08, 0xf1, \n  0xc7, 0x08, 0xde, 0xf0, 0x00, 0xb2, 0xc8, 0xfe, 0x08, 0x4f, 0x02, 0x7a, 0xf8, 0xfa, 0x1c, 0xba, \n  0xf4, 0xcb, 0xe1, 0xfa, 0xb0, 0x59, 0x04, 0x3f, 0x03, 0xff, 0x4c, 0x7b, 0xfc, 0x38, 0xd2, 0xfa, \n  0xfa, 0x7e, 0xf9, 0x0a, 0x67, 0xfd, 0x2e, 0xe4, 0xff, 0xb5, 0x52, 0xff, 0x48, 0x9f, 0xff, 0xb8, \n  0xa2, 0xff, 0x90, 0x6b, 0xfe, 0x21, 0xe7, 0xfe, 0xf7, 0x7a, 0xfd, 0x79, 0x4e, 0xfe, 0x71, 0x8d, \n  0xfe, 0x48, 0x46, 0xfd, 0xfc, 0xcb, 0xfd, 0x7a, 0xc1, 0xfe, 0x74, 0x3c, 0xff, 0xa9, 0xce, 0xff, \n  0x45, 0x1b, 0x00, 0x29, 0x62, 0xff, 0xc7, 0x24, 0x1c, 0x0f, 0x56, 0x1e, 0x3a, 0xd2, 0x05, 0xd9, \n  0xb4, 0x0a, 0xfe, 0xb4, 0x01, 0xe3, 0xfa, 0xfd, 0xed, 0xc5, 0x02, 0x4d, 0x98, 0xfc, 0x69, 0x48, \n  0xf6, 0xe6, 0x5f, 0xfa, 0xc9, 0xff, 0x02, 0x2e, 0xf0, 0xff, 0xe4, 0x10, 0xfd, 0x87, 0x3d, 0xfc, \n  0x2c, 0x10, 0xfc, 0x69, 0x28, 0xfc, 0xe6, 0xf9, 0xfe, 0x20, 0xc3, 0xff, 0xf7, 0xca, 0xfe, 0x52, \n  0x07, 0xff, 0x21, 0x04, 0xfe, 0x92, 0xb4, 0xfe, 0xa2, 0x2c, 0xfe, 0x01, 0x9b, 0xfe, 0x70, 0x9b, \n  0xfe, 0x37, 0xef, 0xfd, 0xa6, 0x13, 0xfe, 0xaf, 0x68, 0xff, 0xc0, 0xda, 0xff, 0x53, 0xc3, 0xff, \n  0x7d, 0x05, 0x00, 0xf0, 0x45, 0xff, 0xb2, 0xda, 0x19, 0xa9, 0xbf, 0x1c, 0x75, 0x88, 0x06, 0x2c, \n  0xce, 0x09, 0x64, 0x7f, 0x01, 0xa0, 0xb9, 0xfe, 0x42, 0xb1, 0x02, 0x18, 0xf5, 0xfb, 0xcd, 0x11, \n  0xf7, 0xf8, 0xe7, 0xfb, 0x56, 0x2e, 0x02, 0x2f, 0xa5, 0xfe, 0x3b, 0x5f, 0xfd, 0x69, 0x88, 0xfc, \n  0x7f, 0x29, 0xfd, 0xa6, 0xc4, 0xfd, 0x73, 0x30, 0xfe, 0x48, 0x84, 0xff, 0x95, 0xea, 0xff, 0xac, \n  0x2a, 0xff, 0xbd, 0x1d, 0xfe, 0x85, 0x1d, 0xff, 0x6f, 0x57, 0xfe, 0x84, 0xcc, 0xfe, 0xc0, 0x70, \n  0xfe, 0x9e, 0xcf, 0xfd, 0x67, 0x84, 0xfe, 0x4d, 0x18, 0xff, 0xb4, 0x58, 0xff, 0x2c, 0x9e, 0xff, \n  0x2c, 0x17, 0x00, 0x14, 0x7a, 0xff, 0x80, 0x71, 0x18, 0x84, 0x29, 0x1b, 0x98, 0xce, 0x05, 0x24, \n  0x3c, 0x08, 0x76, 0xcd, 0x01, 0x0f, 0xf7, 0xff, 0x4d, 0x92, 0x02, 0x21, 0xd7, 0xfb, 0xb2, 0x47, \n  0xf7, 0xac, 0xc9, 0xfc, 0x5b, 0x84, 0x02, 0xe1, 0x40, 0xfe, 0xf6, 0x82, 0xfd, 0x96, 0x90, 0xfc, \n  0x8a, 0x5f, 0xfd, 0x59, 0x9e, 0xfe, 0xc0, 0xe3, 0xfe, 0x9f, 0xbb, 0xff, 0x71, 0xe4, 0xff, 0x79, \n  0x28, 0xff, 0xff, 0x66, 0xfe, 0x33, 0x66, 0xff, 0x94, 0x54, 0xfe, 0x75, 0xb3, 0xfe, 0x46, 0x38, \n  0xfe, 0x1c, 0xb6, 0xfd, 0x8c, 0x85, 0xfe, 0x62, 0xf5, 0xfe, 0xce, 0x67, 0xff, 0x36, 0xd1, 0xff, \n  0x45, 0x21, 0x00, 0xd4, 0x83, 0xff, 0xd7, 0x24, 0x17, 0x30, 0x98, 0x19, 0x67, 0x21, 0x05, 0xd9, \n  0xa6, 0x07, 0x2b, 0xc0, 0x01, 0x3d, 0xfb, 0xff, 0x5a, 0x80, 0x02, 0x40, 0xf5, 0xfb, 0x17, 0xb1, \n  0xf7, 0xe0, 0x9a, 0xfd, 0xd5, 0xb2, 0x02, 0xcf, 0xfe, 0xfd, 0xae, 0xe1, 0xfd, 0xd0, 0xe8, 0xfc, \n  0x1a, 0x72, 0xfd, 0x25, 0x47, 0xff, 0xf8, 0x3d, 0xff, 0xbc, 0x54, 0xff, 0x1a, 0xbb, 0xff, 0xd0, \n  0x47, 0xff, 0x99, 0x88, 0xfe, 0x76, 0x72, 0xff, 0x06, 0x6b, 0xfe, 0xb1, 0xfe, 0xfe, 0x17, 0x92, \n  0xfe, 0x62, 0xe0, 0xfd, 0x0f, 0x6f, 0xfe, 0x5d, 0xdd, 0xfe, 0xb2, 0x69, 0xff, 0xfb, 0xd5, 0xff, \n  0x51, 0x1a, 0x00, 0x1a, 0x79, 0xff, 0x51, 0xc5, 0x15, 0x73, 0xe6, 0x17, 0xee, 0xd3, 0x04, 0x72, \n  0x0a, 0x07, 0x58, 0x46, 0x01, 0x5f, 0x3f, 0x00, 0xe7, 0xc0, 0x02, 0x1a, 0x3a, 0xfc, 0x5c, 0x2e, \n  0xf8, 0x94, 0x6f, 0xfe, 0xda, 0x78, 0x03, 0xc4, 0x7e, 0xfe, 0x2c, 0x47, 0xfe, 0x0a, 0x15, 0xfd, \n  0x06, 0x99, 0xfd, 0x98, 0xca, 0xff, 0x54, 0x70, 0xff, 0xc0, 0x11, 0xff, 0x63, 0xae, 0xff, 0x08, \n  0x79, 0xff, 0xb5, 0xcc, 0xfe, 0x34, 0xb5, 0xff, 0x6b, 0x93, 0xfe, 0x0a, 0x27, 0xff, 0xcc, 0xb7, \n  0xfe, 0x87, 0xec, 0xfd, 0x06, 0x9e, 0xfe, 0x70, 0x0c, 0xff, 0x24, 0x6e, 0xff, 0x30, 0xd5, 0xff, \n  0x13, 0x15, 0x00, 0xf6, 0x81, 0xff, 0x5e, 0x30, 0x15, 0xc5, 0xe6, 0x16, 0x98, 0x0e, 0x04, 0x2c, \n  0x50, 0x06, 0x07, 0xfa, 0x00, 0x57, 0x67, 0x00, 0x68, 0x44, 0x03, 0x41, 0x21, 0xfd, 0xe2, 0x2d, \n  0xf9, 0x8f, 0x59, 0xff, 0x1f, 0x24, 0x04, 0xc8, 0xda, 0xfe, 0xe3, 0x38, 0xfe, 0x57, 0xc1, 0xfc, \n  0xb3, 0x6b, 0xfd, 0x6f, 0xf3, 0xff, 0xdc, 0xa5, 0xff, 0x7e, 0x26, 0xff, 0x11, 0xbe, 0xff, 0x04, \n  0x8b, 0xff, 0x08, 0xc9, 0xfe, 0x2a, 0xab, 0xff, 0xa3, 0xad, 0xfe, 0xab, 0x57, 0xff, 0x4c, 0xe1, \n  0xfe, 0xe0, 0x0b, 0xfe, 0xb8, 0xcc, 0xfe, 0x8b, 0x41, 0xff, 0x6c, 0x89, 0xff, 0x0d, 0xcc, 0xff, \n  0x22, 0xe8, 0xff, 0x90, 0x42, 0xff, 0xaa, 0x26, 0x15, 0x43, 0x49, 0x17, 0x80, 0xae, 0x04, 0x67, \n  0xd4, 0x06, 0x8c, 0x5a, 0x01, 0x96, 0xb7, 0x00, 0x02, 0x63, 0x03, 0x9e, 0xe5, 0xfc, 0x40, 0xcd, \n  0xf8, 0x44, 0x00, 0xff, 0x82, 0xd4, 0x03, 0xf5, 0x99, 0xfe, 0x13, 0xf7, 0xfd, 0xe6, 0x84, 0xfc, \n  0xbe, 0x76, 0xfd, 0x51, 0x18, 0x00, 0xe0, 0x90, 0xff, 0xd1, 0xfd, 0xfe, 0x0a, 0xaf, 0xff, 0x40, \n  0x8c, 0xff, 0x9a, 0xd8, 0xfe, 0xd1, 0xcd, 0xff, 0x0c, 0xc3, 0xfe, 0x72, 0x6f, 0xff, 0x89, 0x14, \n  0xff, 0xd9, 0x25, 0xfe, 0xfd, 0xb7, 0xfe, 0xfa, 0x06, 0xff, 0xe3, 0x32, 0xff, 0x27, 0x93, 0xff, \n  0xb9, 0xde, 0xff, 0x7b, 0x58, 0xff, 0x92, 0x63, 0x15, 0x9f, 0x76, 0x17, 0x37, 0x6d, 0x04, 0xe5, \n  0x68, 0x06, 0x06, 0x0c, 0x01, 0xf6, 0x9a, 0x00, 0x74, 0x6d, 0x03, 0x41, 0xe9, 0xfc, 0x0b, 0x92, \n  0xf8, 0x0e, 0xcd, 0xfe, 0xb3, 0xee, 0x03, 0x8e, 0xa1, 0xfe, 0x07, 0xc4, 0xfd, 0x5c, 0x3c, 0xfc, \n  0x35, 0x3c, 0xfd, 0xe6, 0x44, 0x00, 0x98, 0x18, 0x00, 0x11, 0x6d, 0xff, 0x8f, 0xde, 0xff, 0x95, \n  0x8f, 0xff, 0xfe, 0xc3, 0xfe, 0x1a, 0x9f, 0xff, 0x4c, 0x88, 0xfe, 0x5a, 0x38, 0xff, 0x01, 0xf4, \n  0xfe, 0x7d, 0x4b, 0xfe, 0x2b, 0x11, 0xff, 0x2a, 0x51, 0xff, 0x3a, 0x56, 0xff, 0xf8, 0x89, 0xff, \n  0xa4, 0xbe, 0xff, 0x6a, 0x3e, 0xff, 0x23, 0x0f, 0x16, 0xc8, 0x79, 0x18, 0xf1, 0xb3, 0x04, 0xdb, \n  0x4b, 0x06, 0x85, 0x98, 0x00, 0xdf, 0x1c, 0x00, 0xc6, 0xf2, 0x02, 0xc6, 0x3c, 0xfc, 0x69, 0xac, \n  0xf7, 0x6f, 0xf3, 0xfd, 0x34, 0xff, 0x03, 0x6a, 0x1c, 0xff, 0xee, 0xf7, 0xfd, 0x02, 0x3c, 0xfc, \n  0xef, 0x2b, 0xfd, 0x50, 0x24, 0x00, 0xec, 0x01, 0x00, 0x18, 0x6b, 0xff, 0x8e, 0xef, 0xff, 0x01, \n  0xd9, 0xff, 0xb5, 0x0d, 0xff, 0xa7, 0xd2, 0xff, 0xf9, 0xae, 0xfe, 0x3f, 0x3c, 0xff, 0xc3, 0xdc, \n  0xfe, 0xae, 0x06, 0xfe, 0x59, 0xc5, 0xfe, 0x38, 0x52, 0xff, 0x41, 0xb6, 0xff, 0x6a, 0x23, 0x00, \n  0x26, 0x33, 0x00, 0x1c, 0x5b, 0xff, 0x6b, 0x4c, 0x17, 0x51, 0xe4, 0x19, 0xab, 0xfb, 0x04, 0x90, \n  0xb3, 0x06, 0x50, 0xaa, 0x00, 0xb9, 0x1a, 0x00, 0xcb, 0xe4, 0x02, 0x8f, 0x9a, 0xfb, 0xda, 0x7b, \n  0xf6, 0xdf, 0xf3, 0xfc, 0x16, 0x14, 0x04, 0x17, 0x09, 0xff, 0x39, 0x50, 0xfd, 0xe5, 0x9b, 0xfb, \n  0xdb, 0xc7, 0xfc, 0x3d, 0x15, 0x00, 0xc4, 0x2a, 0x00, 0x95, 0x7a, 0xff, 0x6a, 0x17, 0x00, 0x52, \n  0x0c, 0x00, 0xab, 0xfe, 0xfe, 0x23, 0xc6, 0xff, 0x7e, 0xa3, 0xfe, 0x73, 0x41, 0xff, 0xcc, 0xfa, \n  0xfe, 0x72, 0x24, 0xfe, 0xe6, 0xed, 0xfe, 0xf2, 0x7e, 0xff, 0xdd, 0xa2, 0xff, 0xe1, 0xe9, 0xff, \n  0x85, 0x18, 0x00, 0x37, 0x88, 0xff, 0xb0, 0x73, 0x19, 0xbe, 0xcd, 0x1b, 0x25, 0x9a, 0x04, 0x84, \n  0x0e, 0x07, 0x25, 0xa7, 0x00, 0x98, 0x07, 0x00, 0x57, 0xdc, 0x02, 0xd4, 0xb2, 0xfa, 0x92, 0x67, \n  0xf5, 0x5e, 0xac, 0xfc, 0xc7, 0xb0, 0x04, 0x07, 0xd9, 0xfe, 0x6b, 0xa5, 0xfc, 0x36, 0xfb, 0xfa, \n  0x96, 0x66, 0xfc, 0x4b, 0xcd, 0xff, 0x18, 0xd3, 0xff, 0x8d, 0x23, 0xff, 0x8d, 0xd9, 0xff, 0x83, \n  0xd7, 0xff, 0xf1, 0xae, 0xfe, 0x34, 0xbf, 0xff, 0x64, 0xab, 0xfe, 0x51, 0x44, 0xff, 0xec, 0xd7, \n  0xfe, 0x41, 0xf5, 0xfd, 0x21, 0xc8, 0xfe, 0xc8, 0x6e, 0xff, 0x62, 0xae, 0xff, 0x8e, 0x00, 0x00, \n  0x95, 0x41, 0x00, 0xf0, 0x94, 0xff, 0x92, 0x33, 0x1b, 0xe3, 0x10, 0x1e, 0xce, 0xa6, 0x04, 0xc4, \n  0x17, 0x07, 0x59, 0xa2, 0x00, 0x8f, 0xc1, 0xff, 0x5c, 0xdf, 0x02, 0x29, 0xc9, 0xf9, 0x75, 0x9d, \n  0xf4, 0xc2, 0xa0, 0xfc, 0x72, 0xa4, 0x04, 0x19, 0xb7, 0xfe, 0xca, 0x95, 0xfc, 0xd7, 0x89, 0xfa, \n  0xfd, 0x18, 0xfc, 0x24, 0xa4, 0xff, 0xf9, 0xae, 0xff, 0x65, 0x46, 0xff, 0xc8, 0xb6, 0xff, 0xdd, \n  0xad, 0xff, 0xa9, 0x8c, 0xfe, 0x52, 0x83, 0xff, 0x20, 0x4b, 0xfe, 0xe3, 0xfe, 0xfe, 0xc4, 0x92, \n  0xfe, 0x47, 0xc2, 0xfd, 0x2a, 0xb7, 0xfe, 0x56, 0x61, 0xff, 0x75, 0xba, 0xff, 0x73, 0xfb, 0xff, \n  0x83, 0x4b, 0x00, 0x93, 0x8d, 0xff, 0xee, 0xb5, 0x1b, 0x5b, 0xab, 0x1f, 0x93, 0xf3, 0x05, 0x4a, \n  0x98, 0x07, 0x12, 0xbe, 0x00, 0x5b, 0xe6, 0xfe, 0x6c, 0x9b, 0x02, 0x50, 0xb4, 0xf9, 0xcd, 0xd0, \n  0xf4, 0x49, 0xbd, 0xfc, 0x93, 0x0e, 0x03, 0x39, 0xf5, 0xfd, 0x66, 0x2b, 0xfd, 0xcb, 0x08, 0xfb, \n  0xdf, 0x1e, 0xfc, 0x02, 0x3e, 0xff, 0xab, 0x58, 0xff, 0x22, 0xb4, 0xff, 0x16, 0xef, 0xff, 0xf6, \n  0x53, 0xff, 0xaa, 0x61, 0xfe, 0x53, 0x6f, 0xff, 0x8d, 0x58, 0xfe, 0x06, 0xf6, 0xfe, 0xc7, 0x6d, \n  0xfe, 0x9b, 0xb2, 0xfd, 0x4a, 0x94, 0xfe, 0x4f, 0x08, 0xff, 0x0f, 0x94, 0xff, 0x7e, 0xee, 0xff, \n  0x9a, 0x3d, 0x00, 0x86, 0x86, 0xff, 0x9e, 0x61, 0x1c, 0xc0, 0x35, 0x20, 0x61, 0x90, 0x06, 0x89, \n  0xec, 0x08, 0xb7, 0xa4, 0x01, 0x43, 0x88, 0xfe, 0x0b, 0x84, 0x01, 0xc5, 0xdb, 0xf8, 0x90, 0x2b, \n  0xf5, 0x4d, 0x28, 0xfe, 0x70, 0xe8, 0x01, 0x17, 0xf1, 0xfb, 0x58, 0x32, 0xfd, 0x39, 0xfe, 0xfb, \n  0xfe, 0x3e, 0xfd, 0x36, 0x4a, 0xff, 0x35, 0x64, 0xfe, 0x1c, 0x56, 0xff, 0x65, 0x31, 0x00, 0x1b, \n  0x66, 0xff, 0xc9, 0xa4, 0xfe, 0x3f, 0x91, 0xff, 0x6a, 0x3b, 0xfe, 0x4b, 0xdc, 0xfe, 0x57, 0x20, \n  0xfe, 0xfe, 0x72, 0xfd, 0xac, 0x79, 0xfe, 0xd2, 0xb0, 0xfe, 0x41, 0x3a, 0xff, 0xe1, 0xd1, 0xff, \n  0x13, 0x33, 0x00, 0xe0, 0x76, 0xff, 0x90, 0x78, 0x1e, 0xf7, 0x8d, 0x20, 0x7e, 0x33, 0x05, 0x7d, \n  0xda, 0x09, 0xb0, 0xea, 0x01, 0xa6, 0x84, 0xfe, 0x41, 0x47, 0x01, 0xd2, 0xd9, 0xf7, 0xc7, 0xa9, \n  0xf5, 0x16, 0x7c, 0x00, 0x37, 0xd2, 0x01, 0x05, 0x39, 0xf9, 0x84, 0x42, 0xfc, 0x51, 0x54, 0xfc, \n  0xe7, 0x66, 0xfe, 0x45, 0x4c, 0x00, 0xc3, 0x02, 0xfe, 0x25, 0xe2, 0xfe, 0x94, 0x5d, 0x00, 0x7f, \n  0x2e, 0xff, 0x69, 0x6e, 0xfe, 0x52, 0xaa, 0xff, 0x40, 0xed, 0xfd, 0xa1, 0xb9, 0xfe, 0xdd, 0xc5, \n  0xfd, 0xa5, 0x1a, 0xfd, 0x7b, 0x82, 0xfe, 0xc0, 0x9d, 0xfe, 0xb4, 0xec, 0xfe, 0x62, 0xb8, 0xff, \n  0x4c, 0x18, 0x00, 0x2e, 0x32, 0xff, 0x09, 0x7c, 0x21, 0xc1, 0x38, 0x23, 0x34, 0x72, 0x02, 0x3a, \n  0xb0, 0x07, 0xb4, 0xe7, 0x00, 0xbc, 0xa2, 0xfe, 0xf8, 0x91, 0x03, 0x04, 0xfd, 0xf7, 0xab, 0x7b, \n  0xf4, 0xc7, 0xa7, 0x01, 0xcb, 0xfb, 0x03, 0xd6, 0x95, 0xf8, 0xdb, 0x94, 0xfa, 0x8c, 0xbd, 0xfb, \n  0x31, 0xb4, 0xfe, 0x87, 0x21, 0x01, 0x8b, 0xcd, 0xfd, 0x72, 0x25, 0xfe, 0xbc, 0x6a, 0x00, 0x93, \n  0x52, 0xff, 0xab, 0x07, 0xfe, 0x02, 0xaa, 0xff, 0xd6, 0xd3, 0xfd, 0xb8, 0xac, 0xfe, 0xb1, 0xa5, \n  0xfd, 0x32, 0xa5, 0xfc, 0x18, 0x82, 0xfe, 0x9d, 0xc2, 0xfe, 0x5f, 0xc9, 0xfe, 0x02, 0x8b, 0xff, \n  0xe9, 0x3c, 0x00, 0x8e, 0x4e, 0xff, 0x9b, 0x9a, 0x24, 0x6c, 0x88, 0x24, 0x0f, 0x23, 0x00, 0x4c, \n  0x8b, 0x06, 0x76, 0xf6, 0xfe, 0xe1, 0x33, 0xff, 0x27, 0x51, 0x05, 0xf6, 0xf7, 0xf7, 0x82, 0xbc, \n  0xf3, 0x26, 0x49, 0x02, 0x42, 0xa6, 0x06, 0xb9, 0xc5, 0xf8, 0x81, 0x07, 0xf9, 0xb8, 0x05, 0xfa, \n  0x89, 0x69, 0xfe, 0x8b, 0xa1, 0x01, 0x8c, 0x60, 0xfd, 0x8c, 0x46, 0xfd, 0x2f, 0x39, 0x00, 0xd8, \n  0x4f, 0xff, 0x3d, 0x87, 0xfd, 0x66, 0xc4, 0xff, 0x8c, 0xcc, 0xfd, 0x5a, 0xe2, 0xfe, 0xd0, 0xb9, \n  0xfd, 0x9f, 0x43, 0xfc, 0x8e, 0x55, 0xfe, 0x41, 0xf4, 0xfe, 0x5e, 0x03, 0xff, 0xc0, 0xa8, 0xff, \n  0xf2, 0x23, 0x00, 0x41, 0x0c, 0xff, 0xc2, 0x38, 0x26, 0x3a, 0xcc, 0x25, 0x1c, 0xf4, 0xff, 0xd4, \n  0x6b, 0x05, 0x85, 0x4a, 0xfd, 0x39, 0xb1, 0xff, 0x7e, 0x64, 0x06, 0x00, 0xb5, 0xf8, 0x10, 0x50, \n  0xf2, 0xb2, 0x57, 0x01, 0x2e, 0xf4, 0x08, 0xe2, 0x6d, 0xfa, 0xce, 0x68, 0xf8, 0x1b, 0x77, 0xf7, \n  0xc3, 0x47, 0xfd, 0xef, 0xba, 0x02, 0x01, 0x23, 0xfe, 0x30, 0xaf, 0xfc, 0x99, 0x9b, 0xff, 0xdd, \n  0x14, 0xff, 0xb4, 0x7e, 0xfd, 0x76, 0xc7, 0xff, 0x97, 0x66, 0xfd, 0xa2, 0xd3, 0xfe, 0x35, 0xe2, \n  0xfd, 0xf2, 0x5b, 0xfc, 0xbe, 0x70, 0xfe, 0x30, 0x3b, 0xff, 0x9d, 0x21, 0xff, 0x79, 0xbd, 0xff, \n  0x35, 0x04, 0x00, 0x27, 0xd4, 0xfe, 0xbf, 0x8e, 0x26, 0x22, 0x94, 0x26, 0x81, 0x24, 0x01, 0x77, \n  0x58, 0x05, 0xc4, 0x6f, 0xfc, 0x39, 0x68, 0xff, 0xcc, 0x24, 0x06, 0xe4, 0x4b, 0xf9, 0xb3, 0x1c, \n  0xf1, 0x72, 0xc0, 0xff, 0xa1, 0xd3, 0x09, 0x00, 0xd8, 0xfc, 0xeb, 0xc0, 0xf8, 0x22, 0x77, 0xf5, \n  0xba, 0x2e, 0xfc, 0x32, 0x24, 0x03, 0x73, 0xce, 0xff, 0xbf, 0x83, 0xfc, 0x64, 0xe9, 0xfe, 0x50, \n  0x30, 0xff, 0xfb, 0x30, 0xfd, 0xa6, 0x6a, 0xff, 0x1b, 0x45, 0xfd, 0x41, 0xfa, 0xfe, 0x42, 0x02, \n  0xfe, 0xe1, 0x8e, 0xfc, 0xde, 0x1d, 0xfe, 0x02, 0x2c, 0xff, 0x8d, 0x46, 0xff, 0x0f, 0x92, 0xff, \n  0x98, 0xeb, 0xff, 0x2c, 0xbe, 0xfe, 0xd6, 0x9a, 0x25, 0xb7, 0xb4, 0x26, 0x10, 0xba, 0x03, 0x9c, \n  0x8c, 0x06, 0xb1, 0x37, 0xfc, 0x3d, 0xf2, 0xfe, 0x24, 0x48, 0x05, 0xb9, 0x68, 0xf9, 0x3c, 0x21, \n  0xf0, 0xd4, 0xb2, 0xfd, 0xd6, 0x39, 0x09, 0xf6, 0x18, 0xff, 0x36, 0xae, 0xfb, 0x2c, 0x68, 0xf4, \n  0x19, 0x22, 0xfa, 0x77, 0x2b, 0x03, 0xc2, 0x27, 0x01, 0x82, 0x73, 0xfd, 0xb5, 0x34, 0xfe, 0x46, \n  0x19, 0xff, 0x06, 0x7a, 0xfd, 0x44, 0x4e, 0xff, 0x1c, 0x7b, 0xfd, 0x23, 0x50, 0xff, 0xaa, 0xfa, \n  0xfd, 0x89, 0x56, 0xfc, 0xcd, 0xef, 0xfd, 0xf5, 0xb6, 0xfe, 0x99, 0x50, 0xff, 0xd9, 0x6f, 0xff, \n  0x1f, 0x06, 0x00, 0xef, 0x22, 0xff, 0x78, 0x13, 0x24, 0x0c, 0xbd, 0x25, 0xea, 0x40, 0x06, 0x35, \n  0x6e, 0x07, 0x8a, 0x32, 0xfd, 0x93, 0xd4, 0xfe, 0x77, 0xb6, 0x03, 0x36, 0x3e, 0xfa, 0x1b, 0x7c, \n  0xef, 0x8e, 0x8e, 0xfb, 0xdb, 0xe6, 0x07, 0x4d, 0x95, 0xff, 0x68, 0xdf, 0xfe, 0x5b, 0x99, 0xf5, \n  0x91, 0x29, 0xf7, 0xf4, 0x22, 0x02, 0x06, 0x7b, 0x01, 0x34, 0x98, 0xfe, 0xbd, 0x01, 0xff, 0x58, \n  0xd1, 0xfe, 0x0d, 0xf0, 0xfd, 0xd0, 0x5a, 0xff, 0x3a, 0x32, 0xfd, 0xc4, 0x3e, 0xff, 0xe6, 0xf4, \n  0xfd, 0xc3, 0xe4, 0xfb, 0xd3, 0xf5, 0xfd, 0xf7, 0x7e, 0xfe, 0x25, 0x66, 0xff, 0x7b, 0xfd, 0xff, \n  0xbe, 0x43, 0x00, 0xbf, 0x63, 0xff, 0x45, 0x4a, 0x22, 0x7e, 0x85, 0x24, 0x02, 0xb3, 0x06, 0xb2, \n  0x0d, 0x09, 0xd7, 0x65, 0xfe, 0x4b, 0x37, 0xfe, 0x9c, 0x7c, 0x03, 0xb1, 0x53, 0xfa, 0xcc, 0x7f, \n  0xf0, 0x18, 0xd2, 0xf9, 0x3e, 0x34, 0x07, 0xc1, 0x50, 0xff, 0xf1, 0xf0, 0xfe, 0x3d, 0xd5, 0xf8, \n  0x27, 0x0a, 0xf5, 0xcf, 0x80, 0xff, 0x73, 0x00, 0x02, 0xc0, 0x91, 0xff, 0x2d, 0xbd, 0xff, 0x02, \n  0xe5, 0xfe, 0xf6, 0x14, 0xfe, 0x82, 0xac, 0xff, 0x89, 0x01, 0xfd, 0x50, 0x04, 0xfe, 0x72, 0x6b, \n  0xfe, 0xf7, 0x35, 0xfc, 0xdb, 0xe5, 0xfd, 0x73, 0xe7, 0xfe, 0xc4, 0x60, 0xff, 0x3c, 0x2d, 0x00, \n  0x17, 0x3a, 0x00, 0x79, 0x5d, 0xff, 0x6f, 0xf7, 0x20, 0x26, 0x87, 0x23, 0x67, 0x84, 0x05, 0x34, \n  0x3f, 0x09, 0xc0, 0x31, 0x00, 0x83, 0x24, 0xfe, 0xb4, 0x0f, 0x02, 0xf1, 0x51, 0xfa, 0x5d, 0x42, \n  0xf4, 0xaa, 0xbd, 0xf9, 0x0c, 0xc8, 0x05, 0x9e, 0x97, 0xff, 0xa1, 0x53, 0xfc, 0xa4, 0xa1, 0xfb, \n  0x22, 0x55, 0xf7, 0xea, 0xe7, 0xfb, 0x90, 0x1a, 0x01, 0x3e, 0xf5, 0xff, 0xf7, 0xc5, 0xff, 0xd5, \n  0x05, 0x00, 0x91, 0x74, 0xfe, 0xfc, 0x8b, 0xfe, 0x68, 0xf1, 0xfc, 0x88, 0x1b, 0xfe, 0x0d, 0x06, \n  0xff, 0xeb, 0x50, 0xfd, 0xa7, 0x95, 0xfd, 0x26, 0xec, 0xfe, 0x1a, 0x5b, 0xff, 0xb0, 0x00, 0x00, \n  0xdc, 0x2b, 0x00, 0xdb, 0x58, 0xff, 0xf7, 0x01, 0x1f, 0xff, 0x0a, 0x21, 0x38, 0x48, 0x05, 0xc5, \n  0x10, 0x0a, 0x06, 0x31, 0x01, 0x85, 0x11, 0xfe, 0x77, 0x0d, 0x02, 0x3d, 0x1b, 0xfb, 0xa9, 0x60, \n  0xf5, 0x94, 0xff, 0xf9, 0x71, 0xec, 0x04, 0x77, 0x8a, 0x00, 0xce, 0xd0, 0xfb, 0xf6, 0xe5, 0xfb, \n  0x56, 0x7f, 0xfa, 0x37, 0x0a, 0xfb, 0x10, 0x88, 0xff, 0xbf, 0xee, 0xff, 0xfa, 0xf0, 0xfe, 0x98, \n  0x87, 0xff, 0xee, 0xa0, 0xfe, 0x66, 0xf8, 0xfe, 0x54, 0xa6, 0xfd, 0x49, 0x34, 0xfe, 0x7d, 0xdd, \n  0xfe, 0x75, 0xe6, 0xfd, 0xa4, 0x8e, 0xfd, 0x53, 0x02, 0xff, 0xab, 0x8c, 0xff, 0x9c, 0xd0, 0xff, \n  0x26, 0x4e, 0x00, 0x43, 0x4d, 0xff, 0x56, 0x0a, 0x1d, 0x97, 0x3f, 0x1c, 0x2f, 0xa1, 0x03, 0x46, \n  0xc7, 0x0c, 0x9f, 0x95, 0x01, 0xb6, 0xdb, 0xfc, 0x1b, 0x0b, 0x03, 0xb4, 0x8d, 0xfd, 0x85, 0xe2, \n  0xf6, 0xca, 0xca, 0xf8, 0x25, 0xdf, 0x02, 0x9a, 0x69, 0x01, 0xde, 0x27, 0xfd, 0xf6, 0x99, 0xfd, \n  0x33, 0x4f, 0xfc, 0x05, 0xe4, 0xf9, 0xfe, 0x5e, 0xff, 0x47, 0x9c, 0x00, 0xc6, 0x22, 0xfe, 0x7e, \n  0xfb, 0xfe, 0x54, 0xe2, 0xfd, 0xe9, 0x69, 0xfe, 0xb4, 0x79, 0xfe, 0xd4, 0x8d, 0xfe, 0x89, 0xde, \n  0xfe, 0x42, 0x6c, 0xfe, 0xa2, 0xfa, 0xfd, 0xe9, 0xe7, 0xff, 0x79, 0x37, 0x00, 0xcf, 0xb1, 0xff, \n  0x17, 0xfe, 0xff, 0x27, 0x36, 0xff, 0x45, 0x1b, 0x1a, 0x04, 0xf0, 0x1a, 0x5c, 0x58, 0x05, 0xa0, \n  0xd7, 0x0b, 0x73, 0x36, 0x01, 0x3f, 0x2f, 0xfd, 0x4d, 0xbe, 0x02, 0x21, 0xa5, 0xfc, 0x1f, 0x13, \n  0xf8, 0xae, 0xce, 0xfa, 0x96, 0x2a, 0x01, 0x74, 0xc4, 0xff, 0x12, 0xe9, 0xfd, 0xab, 0x2f, 0xfe, \n  0x08, 0xcd, 0xfd, 0xec, 0x8c, 0xfb, 0xbc, 0xa3, 0xfd, 0x3c, 0x3f, 0x00, 0xde, 0xf7, 0xff, 0x0e, \n  0x32, 0xff, 0xc3, 0xdf, 0xfd, 0xc8, 0xcf, 0xfe, 0xb7, 0xa3, 0xfe, 0x44, 0xf3, 0xfe, 0x18, 0xd7, \n  0xfe, 0xb7, 0x54, 0xfe, 0x1d, 0x79, 0xfe, 0x07, 0x59, 0xff, 0x54, 0xb2, 0xff, 0xd0, 0x90, 0xff, \n  0x95, 0x08, 0x00, 0xd0, 0x76, 0xff, 0x0e, 0x44, 0x18, 0x0a, 0x0b, 0x19, 0x4c, 0xfd, 0x04, 0x3e, \n  0x23, 0x0a, 0x2c, 0x95, 0x01, 0xf0, 0x43, 0xff, 0x39, 0x9c, 0x02, 0x9b, 0x56, 0xfc, 0xee, 0x90, \n  0xf8, 0xdb, 0xb6, 0xfb, 0xf0, 0x45, 0x01, 0x66, 0x05, 0xff, 0xe8, 0x07, 0xfe, 0x09, 0xf0, 0xfd, \n  0xe8, 0x51, 0xfe, 0xd4, 0x11, 0xfd, 0x63, 0xfe, 0xfd, 0x0c, 0x7c, 0x00, 0x1e, 0x1a, 0x00, 0xf6, \n  0xf5, 0xfe, 0x8d, 0x3f, 0xfe, 0xec, 0x51, 0xff, 0xdd, 0xa9, 0xfe, 0x15, 0xbb, 0xfe, 0x80, 0x4e, \n  0xfe, 0x52, 0x22, 0xfe, 0x2d, 0xd8, 0xfe, 0xfe, 0x20, 0xff, 0x2b, 0x4e, 0xff, 0xdc, 0xaf, 0xff, \n  0x5a, 0x38, 0x00, 0x99, 0x9c, 0xff, 0xf7, 0xb1, 0x16, 0xd6, 0x96, 0x17, 0x1a, 0x4a, 0x04, 0x8e, \n  0x8d, 0x08, 0x5f, 0x45, 0x02, 0xf7, 0x3f, 0x00, 0xc7, 0x46, 0x02, 0xb8, 0x4b, 0xfc, 0x71, 0xc1, \n  0xf8, 0xb6, 0xb8, 0xfc, 0xd0, 0x87, 0x01, 0x2e, 0x9e, 0xfe, 0x54, 0x47, 0xfe, 0xa1, 0x11, 0xfe, \n  0x3b, 0x7c, 0xfe, 0xf4, 0xd4, 0xfd, 0x8d, 0xb2, 0xfe, 0x1c, 0x92, 0x00, 0x3e, 0x07, 0x00, 0xc7, \n  0xf8, 0xfe, 0xed, 0x83, 0xfe, 0x84, 0x85, 0xff, 0x47, 0x98, 0xfe, 0xbe, 0xae, 0xfe, 0x39, 0x2f, \n  0xfe, 0x43, 0x1f, 0xfe, 0x5f, 0xca, 0xfe, 0x3e, 0x0a, 0xff, 0x68, 0x8a, 0xff, 0x5e, 0xe2, 0xff, \n  0x23, 0x2b, 0x00, 0x51, 0x9a, 0xff, 0x8a, 0x40, 0x15, 0x27, 0xf0, 0x15, 0x6b, 0xa3, 0x03, 0xdc, \n  0xf7, 0x07, 0x33, 0x76, 0x02, 0x5f, 0x43, 0x00, 0x75, 0x1d, 0x02, 0x87, 0x70, 0xfc, 0x18, 0x31, \n  0xf9, 0xd6, 0xac, 0xfd, 0x7b, 0xa4, 0x01, 0x6c, 0x40, 0xfe, 0xfc, 0xb1, 0xfe, 0x14, 0x65, 0xfe, \n  0xa5, 0x83, 0xfe, 0x7b, 0x98, 0xfe, 0x1d, 0x2f, 0xff, 0xb6, 0x1a, 0x00, 0xf5, 0xce, 0xff, 0xe1, \n  0x1d, 0xff, 0x7f, 0xb5, 0xfe, 0x19, 0x97, 0xff, 0x98, 0x94, 0xfe, 0x26, 0xe4, 0xfe, 0x61, 0x86, \n  0xfe, 0x5f, 0x5e, 0xfe, 0x52, 0xbf, 0xfe, 0xf8, 0xe8, 0xfe, 0x12, 0x89, 0xff, 0x26, 0xf4, 0xff, \n  0x85, 0x2b, 0x00, 0xd8, 0x85, 0xff, 0x95, 0x8c, 0x13, 0x81, 0x66, 0x14, 0x0a, 0x74, 0x03, 0x47, \n  0x31, 0x07, 0xc5, 0x01, 0x02, 0xda, 0x97, 0x00, 0x44, 0x5f, 0x02, 0xe7, 0x92, 0xfc, 0x55, 0x93, \n  0xf9, 0xef, 0x65, 0xfe, 0x38, 0x04, 0x02, 0x78, 0x6c, 0xfe, 0x02, 0x41, 0xff, 0xaa, 0x9b, 0xfe, \n  0x7d, 0x92, 0xfe, 0x2f, 0x4c, 0xff, 0x89, 0x44, 0xff, 0xba, 0xa4, 0xff, 0xed, 0xd0, 0xff, 0x24, \n  0x4b, 0xff, 0x2a, 0xd5, 0xfe, 0xe1, 0xd2, 0xff, 0xb7, 0xf7, 0xfe, 0x25, 0x43, 0xff, 0x20, 0xaf, \n  0xfe, 0x1d, 0x44, 0xfe, 0x84, 0xbf, 0xfe, 0x46, 0x06, 0xff, 0x61, 0x96, 0xff, 0xd9, 0xe0, 0xff, \n  0x0d, 0x12, 0x00, 0xbf, 0x9e, 0xff, 0xbf, 0x1c, 0x12, 0xc0, 0x8f, 0x12, 0x53, 0x4f, 0x03, 0x05, \n  0xb9, 0x06, 0x0b, 0x9f, 0x01, 0x80, 0xd9, 0x00, 0xc0, 0x87, 0x02, 0x4a, 0xeb, 0xfc, 0xe4, 0x37, \n  0xfa, 0x09, 0x5b, 0xff, 0x01, 0xd1, 0x02, 0x32, 0xd3, 0xfe, 0xf9, 0x89, 0xff, 0x12, 0xcb, 0xfe, \n  0x23, 0xc2, 0xfe, 0x40, 0xcb, 0xff, 0xe0, 0x63, 0xff, 0x16, 0x50, 0xff, 0x1f, 0xce, 0xff, 0xf5, \n  0x8e, 0xff, 0x6c, 0x21, 0xff, 0x2f, 0xf7, 0xff, 0xff, 0xf2, 0xfe, 0x67, 0x67, 0xff, 0x3e, 0xf1, \n  0xfe, 0x35, 0x61, 0xfe, 0x6a, 0xe8, 0xfe, 0x71, 0x2c, 0xff, 0x55, 0x90, 0xff, 0xc6, 0xe7, 0xff, \n  0x60, 0x15, 0x00, 0xaf, 0x99, 0xff, 0x7f, 0x68, 0x11, 0x00, 0x7e, 0x11, 0x27, 0xa4, 0x02, 0x4b, \n  0xcc, 0x05, 0x39, 0x1e, 0x01, 0x9d, 0xf3, 0x00, 0x96, 0x0d, 0x03, 0xbb, 0xcf, 0xfd, 0x26, 0x18, \n  0xfb, 0x20, 0x5c, 0x00, 0xa1, 0xc1, 0x03, 0x2c, 0x6f, 0xff, 0x41, 0xa2, 0xff, 0x37, 0x8c, 0xfe, \n  0xe4, 0x90, 0xfe, 0xe7, 0xe1, 0xff, 0x61, 0x87, 0xff, 0x71, 0x63, 0xff, 0x16, 0x04, 0x00, 0x23, \n  0xb8, 0xff, 0x5d, 0x17, 0xff, 0x4b, 0xeb, 0xff, 0x43, 0x18, 0xff, 0xcb, 0x96, 0xff, 0xa2, 0x0b, \n  0xff, 0xcb, 0x76, 0xfe, 0x49, 0x22, 0xff, 0x72, 0x72, 0xff, 0xac, 0xb5, 0xff, 0x28, 0xf4, 0xff, \n  0x65, 0xf2, 0xff, 0x2b, 0x4d, 0xff, 0x45, 0xea, 0x10, 0x4b, 0xcf, 0x10, 0x7d, 0x22, 0x02, 0x54, \n  0xcf, 0x05, 0xcc, 0xa8, 0x01, 0x8a, 0x73, 0x01, 0xa7, 0x81, 0x03, 0xd4, 0x72, 0xfe, 0x3f, 0xe7, \n  0xfb, 0xdc, 0xd8, 0x00, 0x37, 0xbe, 0x03, 0xdd, 0x19, 0xff, 0xac, 0xfd, 0xfe, 0xfa, 0xf2, 0xfd, \n  0x34, 0x99, 0xfe, 0xb8, 0x5a, 0x00, 0x6b, 0xce, 0xff, 0x12, 0x56, 0xff, 0xeb, 0xbb, 0xff, 0xba, \n  0x96, 0xff, 0x20, 0x25, 0xff, 0x0c, 0xf9, 0xff, 0x4c, 0x2f, 0xff, 0xd0, 0xd1, 0xff, 0x97, 0x5a, \n  0xff, 0xaa, 0x9c, 0xfe, 0xec, 0x2b, 0xff, 0xad, 0x6a, 0xff, 0x83, 0x91, 0xff, 0xeb, 0xad, 0xff, \n  0x50, 0xb2, 0xff, 0xd5, 0x3a, 0xff, 0xb0, 0x0c, 0x11, 0xcd, 0xa3, 0x11, 0xf1, 0x30, 0x03, 0xc2, \n  0x64, 0x06, 0x35, 0xcd, 0x01, 0x88, 0xa3, 0x01, 0x31, 0x84, 0x03, 0xb0, 0xee, 0xfd, 0x87, 0x23, \n  0xfb, 0xfa, 0x30, 0x00, 0x0d, 0x4f, 0x03, 0xfc, 0xed, 0xfe, 0x9a, 0xfa, 0xfe, 0xca, 0xe4, 0xfd, \n  0x24, 0xa6, 0xfe, 0x3e, 0x58, 0x00, 0x51, 0x8b, 0xff, 0xbd, 0x26, 0xff, 0x5e, 0xd3, 0xff, 0xd8, \n  0xaf, 0xff, 0xbf, 0x31, 0xff, 0xcb, 0x1e, 0x00, 0x6b, 0x3f, 0xff, 0x66, 0xd9, 0xff, 0xc8, 0x80, \n  0xff, 0xa3, 0xaf, 0xfe, 0x85, 0x08, 0xff, 0x6c, 0x1d, 0xff, 0xcf, 0x2b, 0xff, 0x1a, 0x83, 0xff, \n  0x5a, 0xc6, 0xff, 0x48, 0x5e, 0xff, 0x97, 0x53, 0x11, 0x2e, 0xcc, 0x11, 0x40, 0xf2, 0x02, 0xb5, \n  0x0c, 0x06, 0x17, 0xa6, 0x01, 0x14, 0xae, 0x01, 0xde, 0xa4, 0x03, 0xc9, 0xf2, 0xfd, 0xba, 0xd5, \n  0xfa, 0x0c, 0xd3, 0xff, 0x0f, 0x39, 0x03, 0xc0, 0xe2, 0xfe, 0x0d, 0xbf, 0xfe, 0x81, 0xb0, 0xfd, \n  0x16, 0x97, 0xfe, 0x3e, 0xa6, 0x00, 0x22, 0x28, 0x00, 0x8f, 0x85, 0xff, 0x80, 0xce, 0xff, 0xc1, \n  0x93, 0xff, 0x1e, 0x1f, 0xff, 0x39, 0xe0, 0xff, 0x9e, 0xf2, 0xfe, 0xa7, 0xb1, 0xff, 0xa8, 0x87, \n  0xff, 0xf2, 0x06, 0xff, 0x2c, 0x6b, 0xff, 0x55, 0x36, 0xff, 0x9f, 0x1d, 0xff, 0xc3, 0x5b, 0xff, \n  0x0e, 0xa3, 0xff, 0x59, 0x5a, 0xff, 0x37, 0xc2, 0x11, 0x64, 0x3c, 0x12, 0xf6, 0xa8, 0x02, 0x5d, \n  0x68, 0x05, 0x86, 0xde, 0x00, 0x1a, 0x27, 0x01, 0xb0, 0x72, 0x03, 0xe8, 0xe0, 0xfd, 0x3b, 0x8e, \n  0xfa, 0x1d, 0xb7, 0xff, 0x28, 0xc1, 0x03, 0x33, 0x5c, 0xff, 0x85, 0xda, 0xfe, 0x48, 0x3b, 0xfd, \n  0x97, 0xec, 0xfd, 0x3d, 0x87, 0x00, 0x8b, 0x6a, 0x00, 0xfd, 0x04, 0x00, 0xd3, 0x71, 0x00, 0x8c, \n  0xdb, 0xff, 0xfb, 0x16, 0xff, 0xfe, 0xe9, 0xff, 0xdc, 0xde, 0xfe, 0x97, 0x58, 0xff, 0xf3, 0x32, \n  0xff, 0x28, 0xbf, 0xfe, 0x07, 0x76, 0xff, 0xa4, 0xd6, 0xff, 0x59, 0xd1, 0xff, 0xda, 0xba, 0xff, \n  0xaa, 0x93, 0xff, 0x64, 0x08, 0xff, 0x55, 0x9b, 0x12, 0xc2, 0x7c, 0x13, 0x0a, 0xf9, 0x02, 0x83, \n  0x78, 0x05, 0x74, 0x9d, 0x00, 0xc5, 0xc3, 0x00, 0x1b, 0xe5, 0x02, 0x63, 0xe5, 0xfc, 0x4d, 0x58, \n  0xf9, 0xad, 0xa1, 0xfe, 0x19, 0xd2, 0x03, 0x78, 0xc5, 0xff, 0x3c, 0xe0, 0xfe, 0x33, 0x67, 0xfd, \n  0x50, 0x35, 0xfe, 0xe6, 0x7c, 0x00, 0xda, 0x4a, 0x00, 0x26, 0xca, 0xff, 0x7e, 0x2a, 0x00, 0x78, \n  0x25, 0x00, 0x60, 0x7c, 0xff, 0x9d, 0x1b, 0x00, 0xd2, 0x1b, 0xff, 0xda, 0x85, 0xff, 0x0e, 0x2c, \n  0xff, 0x2c, 0x86, 0xfe, 0x34, 0x26, 0xff, 0xb4, 0x9b, 0xff, 0x14, 0xfd, 0xff, 0x6a, 0x5e, 0x00, \n  0x2b, 0x38, 0x00, 0x76, 0x50, 0xff, 0xec, 0xec, 0x13, 0x2e, 0xf6, 0x14, 0x4b, 0x2b, 0x03, 0x8f, \n  0xd7, 0x05, 0x5a, 0xa1, 0x00, 0xcd, 0xac, 0x00, 0xae, 0xbd, 0x02, 0xe4, 0x21, 0xfc, 0xc0, 0x13, \n  0xf8, 0xdb, 0x91, 0xfd, 0x5a, 0xec, 0x03, 0xe5, 0xa9, 0xff, 0x11, 0x30, 0xfe, 0x5d, 0xdb, 0xfc, \n  0x6a, 0xf3, 0xfd, 0x7c, 0xa7, 0x00, 0x01, 0x9d, 0x00, 0x0b, 0xe1, 0xff, 0xc1, 0x57, 0x00, 0xfd, \n  0x31, 0x00, 0x00, 0x4c, 0xff, 0x08, 0x27, 0x00, 0x81, 0x11, 0xff, 0xbc, 0x96, 0xff, 0xf2, 0x5d, \n  0xff, 0xfd, 0xa6, 0xfe, 0x5e, 0x40, 0xff, 0xb3, 0xc8, 0xff, 0x49, 0xe6, 0xff, 0x48, 0xff, 0xff, \n  0x79, 0x3a, 0x00, 0x88, 0xc2, 0xff, 0xec, 0xf5, 0x15, 0xa5, 0x8e, 0x16, 0xb9, 0xe1, 0x02, 0xdb, \n  0x5a, 0x06, 0x27, 0x97, 0x00, 0x97, 0xc6, 0x00, 0xc6, 0xce, 0x02, 0x21, 0x5a, 0xfb, 0xa9, 0xc7, \n  0xf6, 0x5e, 0xe6, 0xfc, 0x8a, 0x8f, 0x04, 0x81, 0x80, 0xff, 0x9b, 0x58, 0xfd, 0x1c, 0x1e, 0xfc, \n  0xbd, 0x68, 0xfd, 0x68, 0x45, 0x00, 0xb4, 0x5b, 0x00, 0xe9, 0xa3, 0xff, 0xb7, 0x59, 0x00, 0xa2, \n  0x59, 0x00, 0xab, 0x3d, 0xff, 0xe8, 0x25, 0x00, 0x70, 0x1b, 0xff, 0x07, 0x84, 0xff, 0x22, 0x4c, \n  0xff, 0x9b, 0xb8, 0xfe, 0x93, 0x4d, 0xff, 0xb3, 0xdf, 0xff, 0xf7, 0xdc, 0xff, 0x1b, 0xf6, 0xff, \n  0xb8, 0x21, 0x00, 0xf6, 0x91, 0xff, 0xb3, 0x6c, 0x18, 0xc9, 0x79, 0x18, 0x8f, 0x15, 0x02, 0x2a, \n  0xc9, 0x06, 0x9b, 0x8d, 0x00, 0x90, 0x9b, 0x00, 0x21, 0xc3, 0x02, 0xb1, 0x46, 0xfa, 0xc8, 0xc7, \n  0xf5, 0x19, 0xed, 0xfc, 0xac, 0x49, 0x05, 0x42, 0x2d, 0xff, 0x5e, 0xa9, 0xfc, 0x06, 0x89, 0xfb, \n  0xef, 0x27, 0xfd, 0x70, 0x12, 0x00, 0x8d, 0x0d, 0x00, 0x9c, 0x59, 0xff, 0x07, 0x14, 0x00, 0xc9, \n  0x27, 0x00, 0x3d, 0xda, 0xfe, 0x53, 0x0e, 0x00, 0x1a, 0x1a, 0xff, 0x7d, 0x94, 0xff, 0x0c, 0x22, \n  0xff, 0x48, 0x69, 0xfe, 0xad, 0x2e, 0xff, 0x25, 0xcc, 0xff, 0x86, 0xe9, 0xff, 0x37, 0x24, 0x00, \n  0x53, 0x58, 0x00, 0xaf, 0xb0, 0xff, 0x6f, 0xa1, 0x1a, 0x28, 0xc6, 0x1a, 0xe7, 0x80, 0x01, 0x32, \n  0xe5, 0x06, 0x85, 0xae, 0x00, 0x7f, 0x59, 0x00, 0x23, 0xc2, 0x02, 0x67, 0x2e, 0xf9, 0x36, 0xe2, \n  0xf4, 0x3d, 0x14, 0xfd, 0xf8, 0xa4, 0x05, 0xd9, 0xff, 0xfe, 0xc6, 0x5c, 0xfc, 0x29, 0x0a, 0xfb, \n  0x96, 0xf8, 0xfc, 0x3b, 0x05, 0x00, 0x3e, 0xd4, 0xff, 0xfe, 0x3f, 0xff, 0x52, 0xf1, 0xff, 0xaf, \n  0x1c, 0x00, 0x81, 0xb3, 0xfe, 0x89, 0xc7, 0xff, 0x2a, 0xb8, 0xfe, 0x32, 0x66, 0xff, 0x72, 0xe1, \n  0xfe, 0x95, 0x37, 0xfe, 0x2d, 0x1f, 0xff, 0x52, 0xb8, 0xff, 0xce, 0xee, 0xff, 0x7b, 0x2e, 0x00, \n  0xda, 0x81, 0x00, 0xcc, 0xb9, 0xff, 0xe6, 0xe3, 0x1b, 0x60, 0x12, 0x1d, 0xa0, 0x24, 0x02, 0xd6, \n  0xde, 0x06, 0x52, 0x6a, 0x00, 0x6c, 0xc0, 0xff, 0xf4, 0xf1, 0x02, 0xad, 0x82, 0xf8, 0x75, 0x8e, \n  0xf4, 0xed, 0xf4, 0xfc, 0x22, 0x80, 0x04, 0x81, 0xcc, 0xfe, 0x00, 0xf9, 0xfc, 0x97, 0xcf, 0xfa, \n  0x3d, 0x73, 0xfc, 0x2f, 0xba, 0xff, 0xd5, 0xd1, 0xff, 0x10, 0xec, 0xff, 0xa2, 0xd2, 0xff, 0xb2, \n  0xb5, 0xff, 0x7c, 0x99, 0xfe, 0x49, 0x93, 0xff, 0x97, 0x6f, 0xfe, 0xf1, 0x19, 0xff, 0xc1, 0xa2, \n  0xfe, 0x45, 0x17, 0xfe, 0xf9, 0x0f, 0xff, 0xfb, 0x90, 0xff, 0x0f, 0x03, 0x00, 0x20, 0x1b, 0x00, \n  0xab, 0x66, 0x00, 0x3f, 0x93, 0xff, 0x43, 0x4c, 0x1c, 0x50, 0xa0, 0x1e, 0x78, 0x92, 0x03, 0x27, \n  0x69, 0x07, 0xd4, 0x96, 0x00, 0x5f, 0xa6, 0xfe, 0x06, 0x91, 0x02, 0xf2, 0xa0, 0xf8, 0x4b, 0xfb, \n  0xf4, 0xd7, 0x2a, 0xfd, 0x65, 0x79, 0x02, 0x13, 0xff, 0xfd, 0xb9, 0xc0, 0xfd, 0x9b, 0x84, 0xfb, \n  0x96, 0xa9, 0xfc, 0xe5, 0x2b, 0xff, 0x32, 0x5a, 0xff, 0xe7, 0x6b, 0x00, 0xb9, 0x1a, 0x00, 0x26, \n  0x41, 0xff, 0x8b, 0x71, 0xfe, 0x27, 0x96, 0xff, 0x30, 0x9d, 0xfe, 0x06, 0x20, 0xff, 0xde, 0x7c, \n  0xfe, 0xb6, 0x0d, 0xfe, 0x3a, 0xe4, 0xfe, 0x99, 0x27, 0xff, 0x3c, 0xd2, 0xff, 0x24, 0x0b, 0x00, \n  0x65, 0x55, 0x00, 0xdb, 0x98, 0xff, 0x03, 0xd7, 0x1c, 0x15, 0x53, 0x1f, 0x3c, 0x95, 0x04, 0xb0, \n  0xca, 0x08, 0xf1, 0x68, 0x01, 0xd7, 0xf7, 0xfd, 0x1d, 0x5e, 0x01, 0xad, 0xe2, 0xf7, 0xb7, 0x75, \n  0xf5, 0x52, 0xa6, 0xfe, 0xf0, 0xd8, 0x00, 0xa9, 0xdf, 0xfb, 0xdf, 0x36, 0xfe, 0x2e, 0xc9, 0xfc, \n  0x8b, 0xae, 0xfd, 0x35, 0xef, 0xfe, 0xb2, 0x3c, 0xfe, 0x97, 0x20, 0x00, 0xa0, 0x69, 0x00, 0xa8, \n  0x68, 0xff, 0xec, 0xd8, 0xfe, 0x8b, 0x9b, 0xff, 0x56, 0x69, 0xfe, 0x47, 0x12, 0xff, 0x91, 0x41, \n  0xfe, 0xe9, 0xd9, 0xfd, 0xfc, 0xcb, 0xfe, 0x13, 0xb3, 0xfe, 0x27, 0x76, 0xff, 0x8a, 0xfc, 0xff, \n  0xda, 0x55, 0x00, 0x45, 0x90, 0xff, 0x80, 0x61, 0x1e, 0x1a, 0x5f, 0x1f, 0x26, 0x0f, 0x04, 0x6a, \n  0x68, 0x0a, 0x05, 0x30, 0x02, 0x34, 0xb2, 0xfd, 0x05, 0x37, 0x00, 0xa3, 0xf4, 0xf6, 0x8d, 0x1a, \n  0xf6, 0x1a, 0x99, 0x00, 0x23, 0xad, 0xff, 0x03, 0x4e, 0xf9, 0x05, 0x2a, 0xfe, 0xc6, 0x76, 0xfd, \n  0x71, 0x2c, 0xff, 0xb1, 0x4a, 0xff, 0x91, 0x35, 0xfd, 0x20, 0xe2, 0xff, 0x66, 0xc9, 0x00, 0x9b, \n  0x24, 0xff, 0xdc, 0xe0, 0xfe, 0x50, 0xde, 0xff, 0x05, 0x3e, 0xfe, 0x16, 0xf4, 0xfe, 0x73, 0xb5, \n  0xfd, 0x58, 0x7f, 0xfd, 0x8f, 0xc4, 0xfe, 0xf7, 0x7c, 0xfe, 0x31, 0x24, 0xff, 0x02, 0xe2, 0xff, \n  0x28, 0x29, 0x00, 0x51, 0x4c, 0xff, 0xfa, 0x07, 0x21, 0x46, 0x8f, 0x1f, 0xcd, 0x16, 0x02, 0xb4, \n  0x70, 0x0b, 0x95, 0x20, 0x02, 0x43, 0xbd, 0xfd, 0x86, 0x5d, 0x00, 0xb9, 0xbb, 0xf5, 0xf0, 0xd4, \n  0xf6, 0x84, 0x6a, 0x03, 0x16, 0x8f, 0xff, 0x4b, 0x20, 0xf6, 0x47, 0x33, 0xfd, 0x54, 0xf2, 0xfd, \n  0x62, 0x4d, 0x00, 0x83, 0x7e, 0x00, 0xd4, 0xd4, 0xfc, 0x79, 0x4b, 0xff, 0xd6, 0x05, 0x01, 0x23, \n  0xea, 0xfe, 0xeb, 0x8e, 0xfe, 0xc1, 0xf8, 0xff, 0xa7, 0xd8, 0xfd, 0xfa, 0xce, 0xfe, 0x14, 0x6a, \n  0xfd, 0xde, 0x2c, 0xfd, 0x65, 0xe6, 0xfe, 0x1a, 0x75, 0xfe, 0xd8, 0xc9, 0xfe, 0x23, 0xd2, 0xff, \n  0x66, 0x21, 0x00, 0x45, 0x10, 0xff, 0xce, 0x62, 0x24, 0xde, 0xdb, 0x21, 0xec, 0xd0, 0xfe, 0x9c, \n  0xc6, 0x09, 0x8d, 0x8a, 0x01, 0xf2, 0xee, 0xfd, 0xf3, 0x5a, 0x02, 0x6c, 0x87, 0xf5, 0xed, 0xdf, \n  0xf5, 0x69, 0x21, 0x05, 0x49, 0x8f, 0x01, 0xdf, 0xb1, 0xf4, 0x66, 0x64, 0xfb, 0x7a, 0xae, 0xfd, \n  0x52, 0xfe, 0x00, 0x4a, 0x75, 0x01, 0x5d, 0x73, 0xfc, 0xd8, 0xac, 0xfe, 0x6e, 0x3e, 0x01, 0xb9, \n  0xd3, 0xfe, 0x11, 0x12, 0xfe, 0xc7, 0x31, 0x00, 0xba, 0xb4, 0xfd, 0xf5, 0xa0, 0xfe, 0x44, 0x33, \n  0xfd, 0xb2, 0xc4, 0xfc, 0x46, 0xf4, 0xfe, 0x34, 0x9a, 0xfe, 0xc8, 0xa4, 0xfe, 0xe1, 0xa1, 0xff, \n  0xd8, 0x3a, 0x00, 0x0c, 0x1a, 0xff, 0x8b, 0x8d, 0x28, 0xcc, 0x10, 0x24, 0x1e, 0xcc, 0xfa, 0x59, \n  0xc2, 0x07, 0x0d, 0xd1, 0xff, 0xa0, 0xa9, 0xfe, 0x85, 0x67, 0x05, 0x1a, 0x26, 0xf5, 0x57, 0x7c, \n  0xf4, 0xea, 0x6f, 0x06, 0x54, 0x7d, 0x04, 0x29, 0x5e, 0xf4, 0xb0, 0x53, 0xf9, 0x3e, 0x73, 0xfc, \n  0x08, 0x50, 0x01, 0xb0, 0x33, 0x02, 0xdf, 0xa2, 0xfb, 0x0b, 0x83, 0xfd, 0x5d, 0x81, 0x01, 0x44, \n  0x3a, 0xff, 0x65, 0x69, 0xfd, 0xe0, 0x27, 0x00, 0x21, 0xb9, 0xfd, 0x08, 0xd9, 0xfe, 0x97, 0x39, \n  0xfd, 0x15, 0x39, 0xfc, 0x0a, 0xdb, 0xfe, 0xed, 0xaf, 0xfe, 0xd1, 0xa1, 0xfe, 0x86, 0xb8, 0xff, \n  0xa4, 0x66, 0x00, 0xaa, 0x04, 0xff, 0x40, 0x8c, 0x2b, 0x42, 0x15, 0x25, 0xe8, 0x8a, 0xf8, 0x76, \n  0xd3, 0x06, 0xb1, 0xc7, 0xfd, 0x67, 0x8c, 0xff, 0x98, 0x27, 0x07, 0xbd, 0x13, 0xf5, 0x55, 0x7d, \n  0xf3, 0xaf, 0xe9, 0x06, 0xa5, 0x76, 0x07, 0x44, 0x53, 0xf4, 0x99, 0xbd, 0xf7, 0x55, 0xad, 0xfa, \n  0xab, 0xd1, 0x00, 0xec, 0xc8, 0x02, 0x43, 0x76, 0xfb, 0xe2, 0xaa, 0xfc, 0x2e, 0x1f, 0x01, 0x59, \n  0x2c, 0xff, 0x7a, 0xfb, 0xfc, 0x4d, 0x56, 0x00, 0xd1, 0x9b, 0xfd, 0x9b, 0x1b, 0xff, 0xe6, 0x4c, \n  0xfd, 0x8f, 0xbe, 0xfb, 0xee, 0xc6, 0xfe, 0xa9, 0x13, 0xff, 0x7e, 0xde, 0xfe, 0x3b, 0xb2, 0xff, \n  0xa0, 0x38, 0x00, 0xd4, 0xcc, 0xfe, 0x84, 0x88, 0x2d, 0x74, 0x7f, 0x26, 0xfe, 0x9e, 0xf7, 0xe5, \n  0x76, 0x05, 0xc8, 0xe0, 0xfb, 0xa1, 0x81, 0x00, 0xd8, 0xb5, 0x08, 0xa9, 0x85, 0xf5, 0xbd, 0xce, \n  0xf1, 0xc0, 0x2b, 0x06, 0x35, 0x68, 0x0a, 0x1a, 0xa8, 0xf5, 0x3d, 0xb5, 0xf6, 0x03, 0xcb, 0xf7, \n  0x61, 0xde, 0xff, 0x2c, 0x41, 0x04, 0x55, 0xe6, 0xfb, 0xb0, 0xe2, 0xfb, 0x42, 0x69, 0x00, 0x17, \n  0xff, 0xfe, 0x63, 0xf5, 0xfc, 0xde, 0x72, 0x00, 0xcf, 0x43, 0xfd, 0xcc, 0x09, 0xff, 0x36, 0x5d, \n  0xfd, 0xcc, 0xcc, 0xfb, 0xf8, 0xf9, 0xfe, 0xa2, 0x67, 0xff, 0x43, 0xff, 0xfe, 0xaf, 0xaf, 0xff, \n  0x8c, 0x18, 0x00, 0xc1, 0x9a, 0xfe, 0xe1, 0xd7, 0x2e, 0xd4, 0x4e, 0x27, 0x4c, 0x72, 0xf8, 0x4d, \n  0x9f, 0x04, 0x56, 0x93, 0xfa, 0xee, 0xc2, 0x00, 0x30, 0xea, 0x08, 0xfe, 0x9d, 0xf6, 0x8e, 0x0c, \n  0xf0, 0x25, 0xf2, 0x04, 0xef, 0x7c, 0x0c, 0x29, 0xde, 0xf7, 0x34, 0x19, 0xf6, 0x67, 0x2f, 0xf5, \n  0xae, 0x03, 0xff, 0x19, 0x5b, 0x05, 0x5d, 0x5a, 0xfd, 0x5f, 0x2d, 0xfb, 0x1a, 0xea, 0xff, 0xb4, \n  0xec, 0xfe, 0xb7, 0xe5, 0xfc, 0xe8, 0x2d, 0x00, 0x89, 0xb8, 0xfc, 0x9b, 0x34, 0xff, 0x01, 0xb0, \n  0xfd, 0x54, 0x03, 0xfc, 0x9d, 0xcd, 0xfe, 0x16, 0x8d, 0xff, 0xb3, 0x1a, 0xff, 0x3b, 0xd6, 0xff, \n  0xb3, 0xdf, 0xff, 0x7f, 0x5a, 0xfe, 0xe2, 0xe5, 0x2e, 0x6a, 0x2d, 0x28, 0xda, 0xd3, 0xf9, 0x30, \n  0x8d, 0x04, 0x00, 0xb3, 0xf9, 0x28, 0x70, 0x00, 0x7f, 0x89, 0x08, 0x84, 0x2d, 0xf7, 0xa7, 0xb4, \n  0xee, 0x7d, 0x1e, 0x03, 0x05, 0x75, 0x0d, 0x50, 0xa4, 0xfa, 0x0f, 0x65, 0xf6, 0x96, 0xe8, 0xf2, \n  0x53, 0xf6, 0xfd, 0xa4, 0xdc, 0x05, 0x71, 0x50, 0xff, 0xbf, 0xd7, 0xfa, 0xa7, 0x06, 0xff, 0x25, \n  0x3e, 0xff, 0x52, 0x6f, 0xfc, 0xb2, 0xce, 0xff, 0xd5, 0xc6, 0xfc, 0x8b, 0x61, 0xff, 0x7d, 0xc4, \n  0xfd, 0x27, 0x30, 0xfc, 0x44, 0x57, 0xfe, 0xd3, 0x7e, 0xff, 0x17, 0x46, 0xff, 0xe7, 0x7c, 0xff, \n  0x96, 0xdc, 0xff, 0xf4, 0x52, 0xfe, 0x72, 0xd7, 0x2d, 0x69, 0xce, 0x28, 0x92, 0x97, 0xfc, 0x41, \n  0x98, 0x05, 0x55, 0x11, 0xf9, 0x62, 0xe6, 0xff, 0x01, 0xc9, 0x07, 0x07, 0x38, 0xf7, 0xe0, 0xad, \n  0xed, 0xa4, 0xd3, 0x00, 0x30, 0x60, 0x0d, 0xb0, 0xa0, 0xfd, 0x8d, 0x1a, 0xf9, 0x41, 0xea, 0xf0, \n  0xe6, 0xe8, 0xfb, 0x63, 0x52, 0x06, 0xb2, 0x26, 0x01, 0xb9, 0x9b, 0xfb, 0x7d, 0xcd, 0xfd, 0xf4, \n  0x66, 0xff, 0x37, 0x8d, 0xfc, 0x02, 0xa7, 0xff, 0x4a, 0x2d, 0xfd, 0x65, 0xc2, 0xff, 0x06, 0xa0, \n  0xfd, 0x02, 0xf4, 0xfb, 0xf4, 0x34, 0xfe, 0x3f, 0x06, 0xff, 0x59, 0x65, 0xff, 0xff, 0x27, 0xff, \n  0x4a, 0x02, 0x00, 0xd0, 0xb0, 0xfe, 0x6b, 0x5f, 0x2c, 0xa3, 0x8c, 0x28, 0xae, 0xfc, 0xff, 0xf4, \n  0x5f, 0x06, 0x5d, 0x5a, 0xf9, 0x3a, 0x56, 0xff, 0xaf, 0x77, 0x06, 0x43, 0x37, 0xf8, 0x54, 0x39, \n  0xec, 0x19, 0x9b, 0xfe, 0xda, 0x42, 0x0c, 0x47, 0x6b, 0xff, 0x36, 0x1a, 0xfd, 0x21, 0x56, 0xf0, \n  0x67, 0x03, 0xf9, 0x75, 0x54, 0x06, 0x6f, 0xef, 0x01, 0x9c, 0xd5, 0xfc, 0x09, 0xbf, 0xfd, 0xe1, \n  0xf5, 0xfe, 0x3f, 0x6e, 0xfd, 0x87, 0x80, 0xff, 0x70, 0xea, 0xfc, 0x74, 0x21, 0x00, 0x22, 0xbf, \n  0xfd, 0x9a, 0x84, 0xfb, 0x14, 0x10, 0xfe, 0xce, 0x6c, 0xfe, 0x26, 0x7b, 0xff, 0x0e, 0x92, 0xff, \n  0x77, 0x2b, 0x00, 0xe7, 0x34, 0xff, 0x87, 0xa4, 0x2a, 0x1a, 0x43, 0x27, 0x1c, 0xc7, 0x02, 0xf9, \n  0x0b, 0x07, 0xa4, 0x8b, 0xfa, 0x40, 0x48, 0xff, 0x1a, 0x7d, 0x04, 0x5b, 0x51, 0xf9, 0xfe, 0xb8, \n  0xeb, 0x4b, 0x44, 0xfc, 0xce, 0x0c, 0x0b, 0xa8, 0xc2, 0xff, 0x22, 0x50, 0x00, 0x2a, 0xd5, 0xf1, \n  0x52, 0x4e, 0xf5, 0xde, 0x33, 0x05, 0x10, 0x6a, 0x02, 0xa4, 0x0e, 0xfe, 0x2a, 0xbe, 0xfe, 0x7a, \n  0x94, 0xfe, 0x1a, 0xcb, 0xfd, 0x67, 0x8b, 0xff, 0x2b, 0xa9, 0xfc, 0x1c, 0xdb, 0xff, 0x25, 0x9f, \n  0xfd, 0x0d, 0x0f, 0xfb, 0xae, 0x36, 0xfe, 0x21, 0x5f, 0xfe, 0x02, 0xa1, 0xff, 0xf8, 0x2e, 0x00, \n  0xdc, 0x5c, 0x00, 0xdc, 0x5b, 0xff, 0x5a, 0x70, 0x28, 0xd1, 0xbb, 0x25, 0xf8, 0x23, 0x04, 0x95, \n  0x57, 0x09, 0x85, 0x1b, 0xfb, 0x7a, 0x8b, 0xfe, 0xd5, 0x1b, 0x04, 0x1a, 0x75, 0xf9, 0xb3, 0xba, \n  0xec, 0x02, 0xaf, 0xf9, 0xfb, 0x35, 0x0a, 0x17, 0xe2, 0xff, 0x98, 0x56, 0x01, 0xbe, 0xe8, 0xf4, \n  0x9d, 0xd5, 0xf1, 0x9a, 0xe3, 0x02, 0x16, 0x89, 0x03, 0x7e, 0x0d, 0xff, 0x56, 0x45, 0xff, 0x62, \n  0xab, 0xfe, 0x8b, 0x13, 0xfe, 0xd4, 0xc7, 0xff, 0x51, 0x5f, 0xfc, 0x27, 0x7f, 0xfe, 0x56, 0x2c, \n  0xfe, 0xcd, 0x52, 0xfb, 0xe8, 0x0f, 0xfe, 0x29, 0x99, 0xfe, 0xbc, 0xb5, 0xff, 0x2f, 0xa4, 0x00, \n  0x3f, 0x36, 0x00, 0x80, 0x48, 0xff, 0xc9, 0x03, 0x27, 0x30, 0xfa, 0x24, 0x43, 0x2c, 0x03, 0x49, \n  0x34, 0x0a, 0x3a, 0x36, 0xfd, 0xa5, 0xe4, 0xfc, 0x3b, 0xc1, 0x03, 0xd4, 0x5c, 0xfa, 0x17, 0x2a, \n  0xef, 0x97, 0x90, 0xf8, 0x52, 0x3f, 0x09, 0xa6, 0x64, 0xff, 0xd8, 0x32, 0xff, 0x5d, 0x89, 0xf9, \n  0x83, 0x81, 0xf1, 0x0d, 0xa2, 0xfe, 0x09, 0xdd, 0x03, 0x8f, 0x00, 0x00, 0x7a, 0x2e, 0x00, 0xb8, \n  0x22, 0xff, 0x20, 0xe7, 0xfd, 0x54, 0x75, 0xff, 0x72, 0x33, 0xfc, 0xb4, 0xd2, 0xfd, 0xb8, 0xed, \n  0xfe, 0xf5, 0xf1, 0xfb, 0x50, 0x16, 0xfe, 0xba, 0x41, 0xff, 0x8f, 0x45, 0xff, 0x3f, 0x77, 0x00, \n  0xca, 0x37, 0x00, 0x5b, 0x33, 0xff, 0x81, 0x4f, 0x25, 0x45, 0x21, 0x24, 0x48, 0xfe, 0x01, 0xf0, \n  0x52, 0x0a, 0x44, 0x4d, 0xff, 0x50, 0x76, 0xfd, 0x06, 0xcb, 0x01, 0x72, 0xcd, 0xf9, 0x17, 0xe6, \n  0xf3, 0x25, 0x24, 0xf8, 0x70, 0xc8, 0x07, 0x55, 0x3b, 0x00, 0xb3, 0xf3, 0xfb, 0x27, 0xb7, 0xfc, \n  0x28, 0x54, 0xf4, 0x54, 0x76, 0xfa, 0x8b, 0x16, 0x03, 0xd9, 0x7e, 0x00, 0xbe, 0xc4, 0xff, 0xb7, \n  0x7a, 0x00, 0x73, 0x6c, 0xfe, 0xba, 0x0b, 0xfe, 0x73, 0x65, 0xfc, 0x25, 0xf6, 0xfd, 0x60, 0xb1, \n  0xff, 0x95, 0x46, 0xfd, 0xb6, 0x43, 0xfd, 0x93, 0x2d, 0xff, 0x59, 0x77, 0xff, 0x73, 0x36, 0x00, \n  0x48, 0x33, 0x00, 0x3e, 0x4e, 0xff, 0x7c, 0x5b, 0x23, 0x14, 0xb0, 0x21, 0xe1, 0xde, 0x01, 0x8e, \n  0x54, 0x0b, 0x68, 0x89, 0x00, 0xa2, 0x5c, 0xfd, 0xe4, 0x76, 0x01, 0x98, 0x2e, 0xfa, 0x25, 0x49, \n  0xf5, 0x0d, 0xeb, 0xf8, 0x5e, 0xd6, 0x06, 0xfb, 0x1a, 0x01, 0xa1, 0x0b, 0xfb, 0xdf, 0x4c, 0xfd, \n  0x3f, 0xf7, 0xf7, 0x10, 0x7e, 0xf8, 0x59, 0x2f, 0x01, 0x46, 0xc1, 0x00, 0x6f, 0xf9, 0xfe, 0x89, \n  0x5c, 0x00, 0xee, 0xef, 0xfe, 0xa2, 0x6b, 0xfe, 0xe8, 0xac, 0xfc, 0x3a, 0xfe, 0xfd, 0xae, 0x0f, \n  0x00, 0x12, 0x12, 0xfe, 0x9f, 0xb4, 0xfc, 0x96, 0x1d, 0xff, 0xf2, 0xcd, 0xff, 0x0d, 0xf7, 0xff, \n  0x6a, 0x5d, 0x00, 0x26, 0x52, 0xff, 0xf5, 0x5b, 0x20, 0xab, 0xdd, 0x1e, 0xc4, 0x9e, 0x02, 0x94, \n  0x45, 0x0c, 0xe5, 0x07, 0x01, 0x87, 0xe6, 0xfc, 0x54, 0x32, 0x02, 0x18, 0x20, 0xfc, 0x8a, 0x14, \n  0xf6, 0x80, 0x0f, 0xf8, 0xa5, 0x28, 0x05, 0x6a, 0x6e, 0x02, 0xff, 0x7e, 0xfb, 0xe7, 0x3e, 0xfd, \n  0xb7, 0xd6, 0xfa, 0x14, 0x96, 0xf8, 0xb8, 0x1a, 0x00, 0xe1, 0xc8, 0x00, 0x9d, 0xfc, 0xfd, 0x72, \n  0x5b, 0xff, 0xeb, 0x8c, 0xfe, 0x19, 0xcd, 0xfe, 0xfd, 0x34, 0xfe, 0xc1, 0x20, 0xfe, 0x4b, 0xd8, \n  0xfe, 0x1f, 0x65, 0xfe, 0x3e, 0x8d, 0xfd, 0x91, 0x8b, 0xff, 0xdc, 0xdc, 0xff, 0x83, 0xc4, 0xff, \n  0x80, 0x60, 0x00, 0x43, 0x2c, 0xff, 0x26, 0x7d, 0x1d, 0xb4, 0xb6, 0x19, 0x4a, 0x10, 0x02, 0x53, \n  0x87, 0x0f, 0x32, 0x22, 0x01, 0x21, 0x6c, 0xfb, 0xf3, 0x86, 0x03, 0x78, 0xec, 0xfe, 0xf5, 0x71, \n  0xf7, 0x67, 0x68, 0xf6, 0xc1, 0x01, 0x03, 0x87, 0x88, 0x03, 0xe1, 0xe0, 0xfc, 0xa5, 0x4b, 0xff, \n  0xc2, 0x3b, 0xfc, 0xae, 0xed, 0xf6, 0x15, 0x72, 0x00, 0xc4, 0x98, 0x01, 0x97, 0x18, 0xfd, 0x46, \n  0x17, 0xff, 0x2e, 0xc1, 0xfd, 0xa1, 0x0b, 0xfe, 0x06, 0xf7, 0xfe, 0x2e, 0x62, 0xfe, 0xe8, 0x39, \n  0xff, 0x3e, 0xfd, 0xfe, 0x43, 0xb4, 0xfd, 0x08, 0x8a, 0x00, 0x7b, 0x8c, 0x00, 0x49, 0x84, 0xff, \n  0xff, 0xf7, 0xff, 0xcb, 0x29, 0xff, 0x69, 0xb1, 0x19, 0x6e, 0xb7, 0x18, 0x9e, 0xea, 0x04, 0xe2, \n  0x23, 0x0e, 0x46, 0x8f, 0x00, 0xad, 0x77, 0xfb, 0x2d, 0x03, 0x03, 0x16, 0xb9, 0xfd, 0xdf, 0x31, \n  0xf9, 0xfa, 0x00, 0xf9, 0xa5, 0x29, 0x00, 0x0a, 0x9d, 0x01, 0xd7, 0x47, 0xfe, 0x8d, 0x23, 0x00, \n  0xf5, 0x1d, 0xfe, 0x17, 0x99, 0xf8, 0x1b, 0xb1, 0xfd, 0x4e, 0x50, 0x01, 0x75, 0xc8, 0xff, 0xf4, \n  0x4d, 0xff, 0x4e, 0xa0, 0xfd, 0x25, 0x79, 0xfe, 0x67, 0x1f, 0xff, 0xba, 0x01, 0xff, 0xfe, 0x4d, \n  0xff, 0xa4, 0xde, 0xfe, 0x56, 0x36, 0xfe, 0x5a, 0xa2, 0xff, 0xd5, 0x19, 0x00, 0xda, 0x76, 0xff, \n  0x4a, 0xf9, 0xff, 0x31, 0x7e, 0xff, 0x24, 0x44, 0x17, 0x77, 0xc7, 0x16, 0x82, 0xd3, 0x04, 0xa7, \n  0x60, 0x0c, 0xcc, 0x46, 0x01, 0xeb, 0xcd, 0xfd, 0x4c, 0xbf, 0x02, 0x9e, 0x4e, 0xfd, 0xfe, 0xf8, \n  0xf9, 0xb9, 0xfe, 0xf9, 0x6a, 0xf2, 0xff, 0xd8, 0xa3, 0x00, 0xe9, 0x82, 0xfe, 0x14, 0xc5, 0xff, \n  0x32, 0xfb, 0xfe, 0x19, 0xa1, 0xfa, 0x65, 0x7a, 0xfd, 0x24, 0x8f, 0x01, 0x9b, 0x23, 0x00, 0xdc, \n  0xb5, 0xfe, 0xdf, 0x0a, 0xfe, 0x5b, 0x1f, 0xff, 0x44, 0x21, 0xff, 0x6e, 0xc1, 0xfe, 0x74, 0x9a, \n  0xfe, 0xf6, 0xc1, 0xfe, 0x23, 0xf6, 0xfe, 0x4c, 0x61, 0xff, 0x44, 0x68, 0xff, 0x71, 0x80, 0xff, \n  0x24, 0x3f, 0x00, 0x48, 0xa9, 0xff, 0xb0, 0x61, 0x15, 0x89, 0xff, 0x14, 0xa9, 0x71, 0x04, 0x14, \n  0x34, 0x0a, 0xf7, 0x1a, 0x02, 0xbf, 0xd2, 0xff, 0xc8, 0x15, 0x02, 0xd9, 0x19, 0xfd, 0x5d, 0x48, \n  0xfa, 0xaa, 0x0c, 0xfb, 0xe9, 0x20, 0x00, 0x83, 0xf1, 0xff, 0x42, 0xbf, 0xfe, 0x2e, 0x95, 0xff, \n  0x45, 0x65, 0xff, 0x83, 0xcd, 0xfb, 0xe9, 0x0e, 0xfe, 0x4d, 0xbe, 0x01, 0x31, 0x09, 0x00, 0x64, \n  0xb5, 0xfe, 0x60, 0x88, 0xfe, 0x15, 0x63, 0xff, 0x99, 0x01, 0xff, 0x10, 0x98, 0xfe, 0xd5, 0x2d, \n  0xfe, 0xd4, 0x8e, 0xfe, 0x36, 0xf9, 0xfe, 0x74, 0x29, 0xff, 0x9f, 0x80, 0xff, 0x59, 0xbf, 0xff, \n  0x1e, 0x38, 0x00, 0xf8, 0xc2, 0xff, 0x18, 0x52, 0x13, 0xbd, 0x6f, 0x13, 0xb2, 0xba, 0x03, 0xae, \n  0x9d, 0x08, 0xa0, 0x46, 0x03, 0x86, 0x8f, 0x00, 0x16, 0xa1, 0x01, 0x99, 0x36, 0xfd, 0xe1, 0x9d, \n  0xfa, 0x03, 0x5d, 0xfc, 0x36, 0x46, 0x00, 0x79, 0x6d, 0xff, 0x03, 0x40, 0xff, 0x3b, 0xe4, 0xff, \n  0x3a, 0x71, 0xff, 0xd6, 0xbe, 0xfc, 0x91, 0xed, 0xfe, 0xda, 0xa0, 0x01, 0x61, 0xf5, 0xff, 0xad, \n  0xb8, 0xfe, 0xab, 0xc3, 0xfe, 0x96, 0xb4, 0xff, 0xbd, 0xec, 0xfe, 0x6f, 0x8c, 0xfe, 0x27, 0x30, \n  0xfe, 0xcc, 0xba, 0xfe, 0x62, 0x04, 0xff, 0x7a, 0x09, 0xff, 0x5f, 0xbc, 0xff, 0xb8, 0xff, 0xff, \n  0x03, 0x35, 0x00, 0x50, 0xb3, 0xff, 0x3d, 0xab, 0x11, 0xa8, 0x98, 0x11, 0xa5, 0x3c, 0x03, 0x03, \n  0x35, 0x08, 0x81, 0x5d, 0x03, 0x5d, 0x69, 0x00, 0x59, 0x7b, 0x01, 0xc4, 0x6a, 0xfd, 0x28, 0x27, \n  0xfb, 0x01, 0x62, 0xfd, 0x98, 0x3b, 0x00, 0x27, 0xfb, 0xfe, 0xf9, 0xcd, 0xff, 0xaa, 0x33, 0x00, \n  0x52, 0x6f, 0xff, 0x86, 0xa8, 0xfd, 0x61, 0x49, 0xff, 0xb1, 0xe0, 0x00, 0xc9, 0xba, 0xff, 0xd9, \n  0xfa, 0xfe, 0x6c, 0xfc, 0xfe, 0x57, 0xad, 0xff, 0x01, 0xe8, 0xfe, 0x0d, 0xe1, 0xfe, 0x11, 0xa4, \n  0xfe, 0xf2, 0xf8, 0xfe, 0x22, 0xe1, 0xfe, 0x34, 0xe2, 0xfe, 0x22, 0xb4, 0xff, 0xf2, 0x08, 0x00, \n  0xf9, 0x2f, 0x00, 0x61, 0x9a, 0xff, 0x3c, 0xa4, 0x0f, 0xdf, 0xfb, 0x0f, 0x8c, 0x30, 0x03, 0x57, \n  0x5e, 0x07, 0xbf, 0xf6, 0x02, 0x2c, 0xca, 0x00, 0xd9, 0xb2, 0x01, 0x62, 0x8d, 0xfd, 0x97, 0xa1, \n  0xfb, 0xde, 0x32, 0xfe, 0x2d, 0x7b, 0x00, 0x39, 0x06, 0xff, 0xfd, 0x77, 0x00, 0x43, 0x6d, 0x00, \n  0xb9, 0x76, 0xff, 0xb7, 0x80, 0xfe, 0x90, 0x3e, 0xff, 0x22, 0x45, 0x00, 0xda, 0xd3, 0xff, 0xaa, \n  0x32, 0xff, 0x29, 0x13, 0xff, 0xe9, 0xdd, 0xff, 0xda, 0x53, 0xff, 0x8c, 0x54, 0xff, 0x46, 0xd8, \n  0xfe, 0xe7, 0xd2, 0xfe, 0xd7, 0xce, 0xfe, 0x96, 0xfd, 0xfe, 0x15, 0xc3, 0xff, 0x29, 0xef, 0xff, \n  0xa3, 0x13, 0x00, 0x07, 0xb7, 0xff, 0x82, 0xac, 0x0d, 0x91, 0xfe, 0x0d, 0x63, 0x6c, 0x03, 0x52, \n  0xb1, 0x06, 0xaf, 0x89, 0x02, 0x28, 0x56, 0x01, 0x45, 0xdd, 0x01, 0x38, 0xd6, 0xfd, 0xb4, 0x30, \n  0xfc, 0x41, 0x20, 0xff, 0xb7, 0x3b, 0x01, 0x21, 0x64, 0xff, 0x35, 0xe6, 0x00, 0xdf, 0x90, 0x00, \n  0x29, 0xa1, 0xff, 0x5f, 0x39, 0xff, 0x19, 0x63, 0xff, 0xbf, 0xd4, 0xff, 0x01, 0xc8, 0xff, 0x2f, \n  0x75, 0xff, 0xdc, 0x78, 0xff, 0x32, 0x2e, 0x00, 0xd6, 0x60, 0xff, 0xef, 0x78, 0xff, 0xa4, 0x0a, \n  0xff, 0xaf, 0xdd, 0xfe, 0xc9, 0x09, 0xff, 0xe4, 0x2d, 0xff, 0x38, 0xb2, 0xff, 0xb2, 0xea, 0xff, \n  0x69, 0x0f, 0x00, 0x08, 0xca, 0xff, 0xe9, 0x3b, 0x0c, 0x6e, 0x4d, 0x0c, 0x82, 0x22, 0x03, 0x9a, \n  0xdf, 0x05, 0xa6, 0x0d, 0x02, 0xaa, 0x87, 0x01, 0xe3, 0x44, 0x02, 0x1f, 0x50, 0xfe, 0xd7, 0x1b, \n  0xfd, 0x6b, 0x76, 0x00, 0x9e, 0x3f, 0x02, 0xb8, 0x02, 0x00, 0xa8, 0x01, 0x01, 0xe2, 0xb1, 0x00, \n  0x01, 0xd4, 0xff, 0x5c, 0x8c, 0xff, 0x96, 0x4b, 0xff, 0xa8, 0x7b, 0xff, 0x0e, 0x15, 0x00, 0x9b, \n  0xde, 0xff, 0x97, 0x75, 0xff, 0x25, 0x18, 0x00, 0x8f, 0x8d, 0xff, 0x7c, 0xc0, 0xff, 0x65, 0x3f, \n  0xff, 0xd3, 0xeb, 0xfe, 0x7e, 0x39, 0xff, 0xef, 0x55, 0xff, 0xe3, 0xbf, 0xff, 0xf1, 0x03, 0x00, \n  0xaa, 0x0d, 0x00, 0x2f, 0xa7, 0xff, 0xb7, 0xab, 0x0b, 0x24, 0x4a, 0x0b, 0x03, 0x53, 0x02, 0x59, \n  0xf9, 0x04, 0x3d, 0xc7, 0x01, 0x20, 0xd0, 0x01, 0x2e, 0xf3, 0x02, 0x91, 0xa4, 0xff, 0xc4, 0x1a, \n  0xfe, 0xa4, 0x47, 0x01, 0x9e, 0xfc, 0x02, 0x14, 0x5b, 0x00, 0x5f, 0xe6, 0x00, 0x99, 0x19, 0x00, \n  0x85, 0x74, 0xff, 0xc1, 0xb5, 0xff, 0x6d, 0xaa, 0xff, 0x46, 0xc0, 0xff, 0x4d, 0x21, 0x00, 0x4f, \n  0xd5, 0xff, 0xe1, 0x74, 0xff, 0x85, 0x19, 0x00, 0x7e, 0xa6, 0xff, 0xdb, 0xe6, 0xff, 0x44, 0x5c, \n  0xff, 0x7d, 0x10, 0xff, 0xcd, 0x7d, 0xff, 0xf9, 0xaa, 0xff, 0x72, 0xdf, 0xff, 0x4e, 0xf1, 0xff, \n  0x77, 0xc4, 0xff, 0x6d, 0x3f, 0xff, 0x3a, 0x16, 0x0b, 0x41, 0xa0, 0x0a, 0x46, 0xe7, 0x01, 0x99, \n  0x32, 0x05, 0xf5, 0x8b, 0x02, 0xcf, 0x5b, 0x02, 0x3f, 0x5e, 0x03, 0x61, 0x35, 0x00, 0x59, 0xe5, \n  0xfe, 0xdb, 0xb1, 0x01, 0x9f, 0xd5, 0x02, 0xde, 0xe2, 0xff, 0xcc, 0x19, 0x00, 0x0b, 0x79, 0xff, \n  0xb0, 0xa5, 0xff, 0x77, 0x4f, 0x00, 0xd1, 0xe6, 0xff, 0xb5, 0x99, 0xff, 0x48, 0xc3, 0xff, 0x46, \n  0xb5, 0xff, 0x1a, 0x8f, 0xff, 0x6b, 0x2d, 0x00, 0xc7, 0xc0, 0xff, 0x11, 0x2d, 0x00, 0x0e, 0xba, \n  0xff, 0x70, 0x30, 0xff, 0xef, 0x7a, 0xff, 0xeb, 0x92, 0xff, 0xf6, 0xa8, 0xff, 0x2b, 0x9d, 0xff, \n  0x3a, 0x85, 0xff, 0x0c, 0x3f, 0xff, 0x12, 0x30, 0x0b, 0x82, 0x85, 0x0b, 0x6c, 0xf8, 0x02, 0x21, \n  0xca, 0x05, 0x01, 0xc9, 0x02, 0xec, 0x9b, 0x02, 0xb5, 0x55, 0x03, 0x45, 0x96, 0xff, 0xc3, 0x19, \n  0xfe, 0x6a, 0x1c, 0x01, 0xef, 0x76, 0x02, 0x79, 0xb2, 0xff, 0x27, 0xfa, 0xff, 0xc1, 0x56, 0xff, \n  0xd1, 0xc3, 0xff, 0x45, 0x5e, 0x00, 0xd9, 0x9f, 0xff, 0x82, 0x66, 0xff, 0x31, 0xd5, 0xff, 0x6b, \n  0xc6, 0xff, 0x37, 0xa2, 0xff, 0x94, 0x5e, 0x00, 0x93, 0xd0, 0xff, 0xc3, 0x3a, 0x00, 0x8e, 0xf0, \n  0xff, 0xc9, 0x3f, 0xff, 0xbc, 0x4c, 0xff, 0x22, 0x3b, 0xff, 0x66, 0x37, 0xff, 0x52, 0x74, 0xff, \n  0x61, 0x9d, 0xff, 0xc9, 0x68, 0xff, 0x0d, 0xae, 0x0b, 0x9c, 0x19, 0x0c, 0xa8, 0x4f, 0x03, 0x65, \n  0xb3, 0x05, 0xb5, 0x8d, 0x02, 0x76, 0xb2, 0x02, 0x66, 0x79, 0x03, 0xac, 0x6d, 0xff, 0x54, 0x77, \n  0xfd, 0xbd, 0x21, 0x00, 0xce, 0xea, 0x01, 0x05, 0xe1, 0xff, 0x2a, 0x28, 0x00, 0x10, 0x4f, 0xff, \n  0x80, 0xc5, 0xff, 0x7f, 0x84, 0x00, 0x9b, 0xeb, 0xff, 0x19, 0x98, 0xff, 0x30, 0xcc, 0xff, 0xe1, \n  0xac, 0xff, 0xa7, 0xa5, 0xff, 0xd9, 0x33, 0x00, 0xc5, 0x7d, 0xff, 0x09, 0x25, 0x00, 0xca, 0x3e, \n  0x00, 0x8f, 0xac, 0xff, 0xd8, 0x53, 0xff, 0x10, 0xf7, 0xfe, 0x08, 0x0a, 0xff, 0x45, 0x56, 0xff, \n  0x32, 0x94, 0xff, 0x89, 0x7e, 0xff, 0x8e, 0xd1, 0x0b, 0x33, 0x16, 0x0c, 0x2b, 0x9f, 0x02, 0x5b, \n  0x12, 0x05, 0xea, 0x44, 0x02, 0x81, 0x9a, 0x02, 0xdf, 0x8a, 0x03, 0xfb, 0x6c, 0xff, 0xa3, 0x43, \n  0xfd, 0xd2, 0x81, 0x00, 0xca, 0x99, 0x02, 0x2d, 0x98, 0xff, 0x6a, 0x85, 0xff, 0xf4, 0xdf, 0xfe, \n  0x94, 0x73, 0xff, 0x9b, 0xe7, 0x00, 0x71, 0xbe, 0x00, 0x95, 0x14, 0x00, 0xaa, 0x07, 0x00, 0x97, \n  0xbb, 0xff, 0x5d, 0x6a, 0xff, 0x41, 0xf1, 0xff, 0xea, 0x59, 0xff, 0x42, 0xdc, 0xff, 0x7d, 0xc7, \n  0xff, 0x6e, 0xc9, 0xff, 0xba, 0x18, 0x00, 0x1e, 0x90, 0xff, 0x57, 0x28, 0xff, 0xd1, 0x31, 0xff, \n  0x2a, 0x65, 0xff, 0x97, 0x52, 0xff, 0x7d, 0x8c, 0x0c, 0xd2, 0xf1, 0x0c, 0x46, 0x7b, 0x02, 0x76, \n  0x6f, 0x04, 0xff, 0x4b, 0x01, 0xb2, 0xed, 0x01, 0x12, 0x2a, 0x03, 0x6b, 0x16, 0xff, 0x49, 0xb5, \n  0xfc, 0x5f, 0xff, 0xff, 0xc1, 0x25, 0x03, 0xb5, 0x7b, 0x00, 0x02, 0xe3, 0xff, 0x60, 0x7a, 0xfe, \n  0x41, 0xdc, 0xfe, 0xfb, 0x8f, 0x00, 0xa3, 0xa0, 0x00, 0x84, 0x7f, 0x00, 0xba, 0xb2, 0x00, 0xa1, \n  0x1e, 0x00, 0xaf, 0x9b, 0xff, 0x59, 0x22, 0x00, 0xba, 0x4d, 0xff, 0xd1, 0x98, 0xff, 0x69, 0x82, \n  0xff, 0x21, 0x3f, 0xff, 0xbb, 0xcf, 0xff, 0xd4, 0x20, 0x00, 0x08, 0x19, 0x00, 0xbf, 0xe3, 0xff, \n  0x02, 0x7e, 0xff, 0x2d, 0xfa, 0xfe, 0x79, 0xa7, 0x0d, 0x68, 0x5f, 0x0e, 0xaf, 0xad, 0x02, 0xb2, \n  0x88, 0x04, 0x3d, 0x07, 0x01, 0xf0, 0x82, 0x01, 0xce, 0x90, 0x02, 0xfc, 0xf6, 0xfd, 0x5d, 0x4d, \n  0xfb, 0x9e, 0xce, 0xfe, 0x1e, 0x5c, 0x03, 0xd2, 0xe1, 0x00, 0xec, 0xcc, 0xff, 0xeb, 0xaa, 0xfe, \n  0x3a, 0x28, 0xff, 0xa7, 0x95, 0x00, 0xf1, 0x9c, 0x00, 0xa1, 0x32, 0x00, 0xb5, 0x55, 0x00, 0x8d, \n  0x79, 0x00, 0x1e, 0xf9, 0xff, 0xf4, 0x51, 0x00, 0x04, 0x9d, 0xff, 0x8c, 0xbd, 0xff, 0x9d, 0x81, \n  0xff, 0xcc, 0x16, 0xff, 0x51, 0x76, 0xff, 0x54, 0xde, 0xff, 0x04, 0x43, 0x00, 0x05, 0x95, 0x00, \n  0x9c, 0x2f, 0x00, 0x53, 0x47, 0xff, 0x71, 0x31, 0x0f, 0x68, 0xfd, 0x0f, 0x60, 0xbf, 0x02, 0x47, \n  0xec, 0x04, 0xb5, 0xfd, 0x00, 0xd1, 0x5a, 0x01, 0x76, 0x55, 0x02, 0x6a, 0x08, 0xfd, 0xba, 0xdf, \n  0xf9, 0x20, 0xa5, 0xfd, 0x28, 0x90, 0x03, 0x6f, 0xbd, 0x00, 0x1c, 0x06, 0xff, 0x3a, 0x2a, 0xfe, \n  0x21, 0xfd, 0xfe, 0x99, 0xed, 0x00, 0x94, 0x0b, 0x01, 0x12, 0x43, 0x00, 0xd3, 0x84, 0x00, 0xe5, \n  0x6a, 0x00, 0x32, 0xb3, 0xff, 0xbd, 0x77, 0x00, 0x04, 0x91, 0xff, 0x75, 0xd8, 0xff, 0xaa, 0xc4, \n  0xff, 0xf1, 0x38, 0xff, 0xc4, 0x84, 0xff, 0x98, 0x0e, 0x00, 0xdc, 0x23, 0x00, 0x06, 0x17, 0x00, \n  0x9a, 0x55, 0x00, 0x27, 0xf2, 0xff, 0xa5, 0x40, 0x11, 0x6c, 0x7d, 0x11, 0xa2, 0x6e, 0x02, 0x76, \n  0x8d, 0x05, 0x08, 0xef, 0x00, 0xdc, 0x79, 0x01, 0x88, 0x6e, 0x02, 0x41, 0x35, 0xfc, 0xbe, 0x6d, \n  0xf8, 0xcc, 0xe3, 0xfc, 0xfa, 0x4a, 0x04, 0x44, 0x8a, 0x00, 0x0f, 0x06, 0xfe, 0xf5, 0x5d, 0xfd, \n  0xdf, 0x72, 0xfe, 0x2b, 0x9b, 0x00, 0x8e, 0xfd, 0x00, 0x13, 0x31, 0x00, 0xcd, 0xb1, 0x00, 0x73, \n  0xde, 0x00, 0xba, 0xab, 0xff, 0xc9, 0x46, 0x00, 0x90, 0x8a, 0xff, 0x55, 0xcd, 0xff, 0xe6, 0xc6, \n  0xff, 0x95, 0x53, 0xff, 0x78, 0xc6, 0xff, 0xbf, 0x3a, 0x00, 0xae, 0xf8, 0xff, 0x3c, 0x0a, 0x00, \n  0x3c, 0x12, 0x00, 0xbf, 0xc5, 0xff, 0x9c, 0x39, 0x14, 0xde, 0x4e, 0x13, 0x6e, 0x66, 0x01, 0x62, \n  0x3e, 0x06, 0x8b, 0xbb, 0x00, 0x17, 0x80, 0x01, 0xf7, 0x69, 0x02, 0x06, 0x07, 0xfb, 0xee, 0x20, \n  0xf7, 0xad, 0xa9, 0xfc, 0xde, 0x44, 0x05, 0x5a, 0x0e, 0x00, 0xad, 0x18, 0xfd, 0x7d, 0xb5, 0xfc, \n  0xd3, 0x06, 0xfe, 0xdf, 0x3e, 0x00, 0xda, 0x97, 0x00, 0x1e, 0xc1, 0xff, 0x28, 0x83, 0x00, 0x79, \n  0xac, 0x00, 0xb6, 0x55, 0xff, 0x79, 0x70, 0x00, 0xb8, 0xa5, 0xff, 0x4c, 0xcc, 0xff, 0x95, 0x9b, \n  0xff, 0xc6, 0x33, 0xff, 0xbd, 0x9c, 0xff, 0x3f, 0x3c, 0x00, 0x8a, 0x0f, 0x00, 0xc8, 0x13, 0x00, \n  0x07, 0x34, 0x00, 0xfc, 0xaa, 0xff, 0xaf, 0x43, 0x17, 0x15, 0x7c, 0x15, 0xaa, 0x10, 0x00, 0x81, \n  0xd8, 0x06, 0x0d, 0xb8, 0x00, 0x54, 0x2b, 0x01, 0x1c, 0x66, 0x02, 0xca, 0xa2, 0xf9, 0xa6, 0x1e, \n  0xf6, 0x14, 0xf4, 0xfc, 0x7c, 0x13, 0x06, 0x95, 0xa4, 0xff, 0x8e, 0x69, 0xfc, 0x2f, 0x0b, 0xfc, \n  0xe6, 0xde, 0xfd, 0x9f, 0x2a, 0x00, 0xa7, 0x2c, 0x00, 0xf7, 0x92, 0xff, 0xf4, 0x39, 0x00, 0xf5, \n  0x63, 0x00, 0x2d, 0xf9, 0xfe, 0x67, 0x58, 0x00, 0xb9, 0x8b, 0xff, 0x92, 0xb9, 0xff, 0xe0, 0x5c, \n  0xff, 0xb7, 0xe9, 0xfe, 0xa2, 0x77, 0xff, 0x34, 0x16, 0x00, 0xcb, 0x20, 0x00, 0x99, 0x43, 0x00, \n  0x9b, 0x8b, 0x00, 0x34, 0xf2, 0xff, 0xe6, 0xd4, 0x19, 0x7e, 0xed, 0x17, 0x35, 0x1b, 0xff, 0x69, \n  0xfe, 0x06, 0x0e, 0xdc, 0x00, 0x71, 0xdf, 0x00, 0xc5, 0x6f, 0x02, 0xf7, 0x59, 0xf8, 0x26, 0x3a, \n  0xf5, 0xb7, 0x46, 0xfd, 0xad, 0x67, 0x06, 0x0c, 0x5d, 0xff, 0xab, 0x22, 0xfc, 0xc7, 0x8c, 0xfb, \n  0x09, 0xb7, 0xfd, 0x88, 0x19, 0x00, 0x55, 0xfe, 0xff, 0xc8, 0x76, 0xff, 0x77, 0x18, 0x00, 0x82, \n  0x76, 0x00, 0xb5, 0xc9, 0xfe, 0xf6, 0xf7, 0xff, 0xf2, 0x14, 0xff, 0xe6, 0x9f, 0xff, 0x03, 0x16, \n  0xff, 0x66, 0xad, 0xfe, 0x29, 0x7a, 0xff, 0xd7, 0x0a, 0x00, 0xf2, 0x27, 0x00, 0x05, 0x4f, 0x00, \n  0x65, 0xa8, 0x00, 0x3c, 0xd9, 0xff, 0xe9, 0x98, 0x1b, 0xbc, 0x99, 0x1a, 0xa4, 0x58, 0xff, 0x3a, \n  0xd0, 0x06, 0x4d, 0x7b, 0x00, 0x53, 0x53, 0x00, 0x85, 0xb9, 0x02, 0xac, 0x4d, 0xf7, 0x83, 0xd0, \n  0xf4, 0x9a, 0x2e, 0xfd, 0x34, 0x37, 0x05, 0xc3, 0x5d, 0xff, 0x3b, 0xca, 0xfc, 0xba, 0xfa, 0xfa, \n  0x97, 0x29, 0xfd, 0x27, 0xcb, 0xff, 0x19, 0x10, 0x00, 0xd8, 0x59, 0x00, 0xf6, 0xbb, 0xff, 0x46, \n  0xf9, 0xff, 0xea, 0xbd, 0xfe, 0x8d, 0xc0, 0xff, 0x55, 0xa9, 0xfe, 0x76, 0x38, 0xff, 0xd5, 0xcb, \n  0xfe, 0xb1, 0x87, 0xfe, 0x46, 0x74, 0xff, 0xb1, 0xfa, 0xff, 0x5c, 0x50, 0x00, 0xca, 0x1e, 0x00, \n  0x61, 0x7c, 0x00, 0x70, 0xaa, 0xff, 0xa9, 0x23, 0x1c, 0x09, 0xaf, 0x1c, 0x75, 0xb2, 0x00, 0x25, \n  0x16, 0x07, 0xf0, 0x80, 0x00, 0x07, 0x07, 0xff, 0x9c, 0xcf, 0x02, 0xe6, 0x61, 0xf7, 0x7e, 0x23, \n  0xf5, 0x87, 0x34, 0xfd, 0x76, 0xee, 0x02, 0x63, 0xda, 0xfe, 0x09, 0xf0, 0xfd, 0x8a, 0x8e, 0xfb, \n  0x9c, 0xd3, 0xfc, 0x64, 0x5f, 0xff, 0x48, 0xc5, 0xff, 0xdb, 0xf3, 0x00, 0xf5, 0xf8, 0xff, 0x16, \n  0x7d, 0xff, 0x83, 0x9d, 0xfe, 0x21, 0x9c, 0xff, 0x5e, 0xd2, 0xfe, 0x2a, 0x3b, 0xff, 0x2e, 0xa7, \n  0xfe, 0x46, 0x85, 0xfe, 0xec, 0x43, 0xff, 0x2f, 0x6b, 0xff, 0xd4, 0x36, 0x00, 0x88, 0x38, 0x00, \n  0x1e, 0x81, 0x00, 0xc9, 0xa0, 0xff, 0xeb, 0x9b, 0x1c, 0x7e, 0xf8, 0x1d, 0xf3, 0x4e, 0x02, 0x82, \n  0x21, 0x08, 0x31, 0xfa, 0x00, 0x7b, 0xb6, 0xfd, 0x8b, 0xc7, 0x01, 0x2e, 0x46, 0xf7, 0xe9, 0xc4, \n  0xf5, 0x9a, 0x3d, 0xfe, 0xd1, 0x66, 0x00, 0x1e, 0x21, 0xfd, 0xe1, 0x01, 0xff, 0x53, 0xdb, 0xfc, \n  0x05, 0x95, 0xfd, 0x57, 0x9d, 0xfe, 0xf3, 0xc4, 0xfe, 0x19, 0x3e, 0x01, 0xa4, 0x41, 0x00, 0xde, \n  0x45, 0xff, 0xea, 0xe2, 0xfe, 0xbd, 0x94, 0xff, 0x43, 0xbe, 0xfe, 0x81, 0x4f, 0xff, 0x20, 0x77, \n  0xfe, 0xde, 0x65, 0xfe, 0xc7, 0x1d, 0xff, 0x8d, 0xe0, 0xfe, 0xce, 0xea, 0xff, 0x21, 0x23, 0x00, \n  0x77, 0x68, 0x00, 0xfa, 0x9c, 0xff, 0x41, 0x6c, 0x1d, 0x8c, 0x7f, 0x1e, 0xaf, 0x04, 0x03, 0x23, \n  0xb8, 0x09, 0x31, 0xdc, 0x01, 0x32, 0x01, 0xfd, 0xd8, 0x71, 0x00, 0xe4, 0x5f, 0xf6, 0x96, 0x8f, \n  0xf6, 0xac, 0xfd, 0xff, 0x41, 0x5a, 0xfe, 0x65, 0x11, 0xfb, 0x2a, 0x9b, 0xff, 0xa7, 0x1b, 0xfe, \n  0x6c, 0xd3, 0xfe, 0x6e, 0x3f, 0xfe, 0x86, 0x74, 0xfd, 0x01, 0x09, 0x01, 0xc8, 0xce, 0x00, 0x8f, \n  0x48, 0xff, 0xde, 0x2c, 0xff, 0xe7, 0xc7, 0xff, 0x77, 0xaa, 0xfe, 0xe2, 0x15, 0xff, 0x35, 0x13, \n  0xfe, 0x12, 0x2f, 0xfe, 0x1e, 0x07, 0xff, 0xa7, 0x7d, 0xfe, 0xb8, 0x87, 0xff, 0xcf, 0x11, 0x00, \n  0x00, 0x73, 0x00, 0x8c, 0xab, 0xff, 0xf4, 0x85, 0x1f, 0xc8, 0x33, 0x1e, 0x59, 0x22, 0x02, 0x17, \n  0xdc, 0x0b, 0xb3, 0x7e, 0x02, 0xfd, 0x92, 0xfc, 0x2b, 0x14, 0xff, 0x61, 0x71, 0xf5, 0xf2, 0x7c, \n  0xf7, 0xa0, 0x61, 0x02, 0xee, 0xb0, 0xfc, 0x86, 0xd9, 0xf7, 0xa1, 0xeb, 0xff, 0xb9, 0xdf, 0xfe, \n  0x89, 0x9b, 0x00, 0xa0, 0x96, 0xfe, 0x2d, 0x29, 0xfc, 0x18, 0xea, 0x00, 0x0c, 0x40, 0x01, 0xdf, \n  0xd5, 0xfe, 0xb1, 0x3d, 0xff, 0x5a, 0x11, 0x00, 0x66, 0x57, 0xfe, 0xae, 0x09, 0xff, 0xc2, 0x63, \n  0xfd, 0xa5, 0xcd, 0xfd, 0x46, 0x12, 0xff, 0xa1, 0x3c, 0xfe, 0x41, 0x2f, 0xff, 0x01, 0x00, 0x00, \n  0x78, 0x2f, 0x00, 0x72, 0x43, 0xff, 0x2f, 0x9b, 0x22, 0xcd, 0xea, 0x1d, 0x7d, 0xeb, 0xff, 0xbb, \n  0x99, 0x0d, 0x65, 0x4c, 0x02, 0xe1, 0x91, 0xfc, 0x71, 0x2e, 0xff, 0xf0, 0xf9, 0xf3, 0x3d, 0x8e, \n  0xf8, 0x0f, 0xa9, 0x05, 0x82, 0x01, 0xfc, 0x36, 0xf7, 0xf3, 0x60, 0x58, 0xff, 0x9d, 0xb2, 0xff, \n  0xf0, 0x00, 0x02, 0x56, 0xc9, 0xff, 0x02, 0x6d, 0xfb, 0xc9, 0x5c, 0x00, 0xe1, 0x9f, 0x01, 0x8b, \n  0x81, 0xfe, 0xce, 0x04, 0xff, 0x7d, 0x3c, 0x00, 0x38, 0xc0, 0xfd, 0x4f, 0xec, 0xfe, 0x6b, 0x23, \n  0xfd, 0xca, 0x86, 0xfd, 0x76, 0x3a, 0xff, 0x62, 0x21, 0xfe, 0x60, 0xcf, 0xfe, 0xd5, 0xf8, 0xff, \n  0xe0, 0x1e, 0x00, 0x3d, 0x0a, 0xff, 0x02, 0x88, 0x26, 0x31, 0x5f, 0x1f, 0x38, 0x1e, 0xfc, 0x0b, \n  0x0e, 0x0d, 0x57, 0xf1, 0x01, 0x3b, 0xd9, 0xfc, 0xa6, 0xa5, 0x00, 0x92, 0x0b, 0xf3, 0x60, 0x60, \n  0xf8, 0xb2, 0x60, 0x08, 0x47, 0x3e, 0xfd, 0x36, 0x38, 0xf1, 0xd7, 0xaf, 0xfd, 0xa0, 0xd7, 0xff, \n  0x3d, 0xfa, 0x02, 0x38, 0x13, 0x01, 0x38, 0xf0, 0xfa, 0x15, 0x9d, 0xff, 0xb4, 0x00, 0x02, 0x43, \n  0x3a, 0xfe, 0x33, 0x57, 0xfe, 0x3b, 0x97, 0x00, 0x64, 0x8e, 0xfd, 0x70, 0xb3, 0xfe, 0xf2, 0xb8, \n  0xfc, 0x00, 0x0c, 0xfd, 0xce, 0x72, 0xff, 0x55, 0x47, 0xfe, 0xcb, 0x79, 0xfe, 0xe0, 0xd5, 0xff, \n  0x39, 0x39, 0x00, 0x1c, 0xdb, 0xfe, 0x82, 0xd6, 0x2a, 0x16, 0x91, 0x22, 0x00, 0x07, 0xf7, 0x26, \n  0x69, 0x0a, 0xf9, 0x01, 0x01, 0x9c, 0x6d, 0xfd, 0xc4, 0x92, 0x04, 0xd1, 0x88, 0xf2, 0x06, 0x16, \n  0xf6, 0xb7, 0x1f, 0x0a, 0x55, 0x64, 0x00, 0x28, 0x25, 0xf0, 0x58, 0x76, 0xfb, 0xc8, 0x61, 0xff, \n  0xb4, 0x52, 0x03, 0x6f, 0x07, 0x02, 0xbe, 0x5c, 0xfa, 0x7d, 0x85, 0xfe, 0xb0, 0x49, 0x02, 0xa7, \n  0xa6, 0xfe, 0x46, 0xbf, 0xfd, 0xff, 0x93, 0x00, 0x3e, 0x73, 0xfd, 0xf7, 0xc9, 0xfe, 0xf6, 0xab, \n  0xfc, 0x7a, 0x5c, 0xfc, 0x7d, 0x97, 0xff, 0xfe, 0x7d, 0xfe, 0x7c, 0x3e, 0xfe, 0x74, 0xa0, 0xff, \n  0x60, 0x92, 0x00, 0x79, 0x12, 0xff, 0xa6, 0x33, 0x30, 0xf5, 0x9a, 0x23, 0xd4, 0x24, 0xf2, 0x14, \n  0x6a, 0x09, 0x50, 0xca, 0xfe, 0xed, 0xd2, 0xfe, 0x17, 0x5b, 0x07, 0xee, 0x82, 0xf1, 0xe8, 0x33, \n  0xf5, 0x93, 0xee, 0x0b, 0x1d, 0xbf, 0x03, 0x53, 0x3f, 0xef, 0x0e, 0xe7, 0xf8, 0x18, 0xd3, 0xfd, \n  0x3a, 0x30, 0x04, 0xea, 0xc2, 0x02, 0xd1, 0xeb, 0xf8, 0xc6, 0x57, 0xfd, 0xa0, 0xe1, 0x02, 0xaa, \n  0xd8, 0xfe, 0x83, 0xc5, 0xfc, 0xbc, 0xdd, 0x00, 0xce, 0x7e, 0xfd, 0xc1, 0x0b, 0xff, 0xf5, 0xaf, \n  0xfc, 0xd6, 0xd1, 0xfb, 0xda, 0x61, 0xff, 0x1b, 0x8f, 0xfe, 0x73, 0x71, 0xfe, 0xa1, 0xe8, 0xff, \n  0xb5, 0x8b, 0x00, 0xab, 0xb0, 0xfe, 0x9a, 0x81, 0x33, 0x27, 0x67, 0x24, 0xaa, 0x9f, 0xef, 0xce, \n  0x99, 0x08, 0xdf, 0x71, 0xfc, 0xf2, 0x32, 0x00, 0x19, 0x40, 0x09, 0xc5, 0x4b, 0xf1, 0xa4, 0xe4, \n  0xf3, 0x62, 0x73, 0x0c, 0x6d, 0x51, 0x07, 0xde, 0xd9, 0xee, 0xe5, 0x20, 0xf7, 0xce, 0xd5, 0xfb, \n  0x8a, 0x9b, 0x03, 0x76, 0x92, 0x03, 0xd3, 0xdb, 0xf8, 0x2e, 0x5f, 0xfc, 0x60, 0x5b, 0x02, 0x14, \n  0xcf, 0xfe, 0xb2, 0x5b, 0xfc, 0x71, 0x22, 0x01, 0x56, 0x49, 0xfd, 0x50, 0x64, 0xff, 0x3a, 0xbd, \n  0xfc, 0x3b, 0x38, 0xfb, 0xad, 0x69, 0xff, 0x91, 0x1f, 0xff, 0x29, 0xa9, 0xfe, 0xfe, 0xc4, 0xff, \n  0xb8, 0x4f, 0x00, 0xea, 0x7e, 0xfe, 0xfe, 0x32, 0x36, 0x2f, 0xa8, 0x25, 0x04, 0x27, 0xee, 0x18, \n  0x26, 0x07, 0xc9, 0x2d, 0xfa, 0x8a, 0xcb, 0x01, 0x6d, 0x14, 0x0b, 0x44, 0x7f, 0xf1, 0x24, 0xd4, \n  0xf1, 0x8d, 0xf9, 0x0b, 0xaf, 0xfa, 0x0a, 0xe2, 0xf1, 0xef, 0x50, 0xba, 0xf5, 0x77, 0x6d, 0xf8, \n  0x2f, 0xea, 0x02, 0x59, 0x76, 0x05, 0x0c, 0x20, 0xf9, 0x42, 0x5d, 0xfb, 0xd8, 0x9d, 0x01, 0x33, \n  0xac, 0xfe, 0x71, 0x59, 0xfc, 0xa0, 0x4a, 0x01, 0x7c, 0xe3, 0xfc, 0xcf, 0x68, 0xff, 0x65, 0xc1, \n  0xfc, 0xe1, 0x3e, 0xfb, 0xaf, 0xb1, 0xff, 0x9e, 0x85, 0xff, 0x06, 0xc2, 0xfe, 0xa0, 0xba, 0xff, \n  0x04, 0x28, 0x00, 0x8a, 0x49, 0xfe, 0x15, 0xf8, 0x37, 0x08, 0xb9, 0x26, 0x9b, 0x83, 0xee, 0xac, \n  0xae, 0x05, 0x45, 0x9b, 0xf8, 0xfb, 0x99, 0x02, 0xff, 0xb1, 0x0b, 0x13, 0xbb, 0xf2, 0xef, 0x73, \n  0xef, 0x2e, 0xce, 0x0a, 0xa5, 0x3d, 0x0e, 0x07, 0xec, 0xf1, 0xb8, 0x64, 0xf4, 0xd2, 0x3d, 0xf5, \n  0x6b, 0x33, 0x02, 0xe8, 0x44, 0x07, 0xaa, 0x44, 0xfa, 0xdd, 0x3d, 0xfa, 0xed, 0x1e, 0x01, 0xa1, \n  0x8f, 0xfe, 0x75, 0x67, 0xfc, 0x59, 0x25, 0x01, 0xb8, 0x22, 0xfc, 0xb9, 0x89, 0xff, 0x17, 0x3d, \n  0xfd, 0x2d, 0x60, 0xfb, 0xf2, 0x9d, 0xff, 0x10, 0xd2, 0xff, 0x9f, 0xca, 0xfe, 0x40, 0xf5, 0xff, \n  0xe1, 0xe6, 0xff, 0xbf, 0xf6, 0xfd, 0xf5, 0xcd, 0x38, 0xd8, 0xab, 0x27, 0x6e, 0xb1, 0xef, 0x68, \n  0x02, 0x05, 0xbc, 0x76, 0xf7, 0xcc, 0x84, 0x02, 0xed, 0x99, 0x0b, 0x9c, 0xca, 0xf3, 0x8e, 0x68, \n  0xed, 0x97, 0x52, 0x09, 0x46, 0x29, 0x10, 0xa9, 0xc2, 0xf4, 0x53, 0xb4, 0xf3, 0x48, 0x77, 0xf2, \n  0xbc, 0x90, 0x01, 0x86, 0x31, 0x08, 0xc6, 0x51, 0xfc, 0x45, 0x57, 0xf9, 0xf1, 0x6b, 0x00, 0x53, \n  0xd5, 0xfe, 0xe8, 0x0d, 0xfc, 0x3e, 0xa5, 0x00, 0x7b, 0xec, 0xfb, 0xd4, 0xdd, 0xff, 0xc3, 0x4c, \n  0xfd, 0x83, 0xc3, 0xfb, 0xca, 0x20, 0xff, 0x92, 0xce, 0xff, 0x6b, 0x1c, 0xff, 0x37, 0xd3, 0xff, \n  0xce, 0xa5, 0xff, 0xa1, 0xd8, 0xfd, 0xf7, 0x34, 0x38, 0xdc, 0xee, 0x28, 0xd2, 0xc0, 0xf1, 0x6a, \n  0x20, 0x05, 0xfa, 0x66, 0xf6, 0x87, 0x1a, 0x02, 0x73, 0x0d, 0x0b, 0x38, 0x3d, 0xf4, 0x2a, 0xf3, \n  0xeb, 0x74, 0xd6, 0x06, 0x03, 0x52, 0x11, 0xe3, 0x52, 0xf8, 0x1b, 0x8e, 0xf4, 0x93, 0x7c, 0xef, \n  0x3d, 0x2b, 0x00, 0xd5, 0x0b, 0x09, 0xe8, 0xc2, 0xfe, 0xca, 0x03, 0xf9, 0x74, 0x0f, 0xff, 0x25, \n  0x76, 0xff, 0x4f, 0x74, 0xfb, 0xff, 0x66, 0x00, 0x62, 0x41, 0xfc, 0x2c, 0x1a, 0x00, 0x8f, 0x54, \n  0xfd, 0xad, 0xb3, 0xfb, 0xc4, 0xaf, 0xfe, 0x55, 0xb1, 0xff, 0xc5, 0x40, 0xff, 0x33, 0x3e, 0xff, \n  0xf5, 0xe2, 0xff, 0x18, 0xe5, 0xfd, 0xc2, 0xfc, 0x36, 0xac, 0x9f, 0x29, 0x09, 0x14, 0xf5, 0x03, \n  0xfc, 0x05, 0x45, 0x89, 0xf5, 0xda, 0x9c, 0x01, 0xaa, 0x20, 0x0a, 0xaf, 0x6d, 0xf4, 0xeb, 0xac, \n  0xea, 0x2a, 0x4f, 0x04, 0x3f, 0x6a, 0x11, 0xa4, 0xd7, 0xfb, 0x4c, 0x78, 0xf7, 0xd0, 0xca, 0xec, \n  0xf6, 0xfd, 0xfd, 0x04, 0xd5, 0x09, 0x6f, 0xd0, 0x00, 0x19, 0xb5, 0xf9, 0x06, 0x89, 0xfd, 0xbc, \n  0xc6, 0xff, 0xdf, 0xa6, 0xfb, 0x17, 0x2d, 0x00, 0x21, 0xc2, 0xfc, 0xa3, 0x75, 0x00, 0xc7, 0x1b, \n  0xfd, 0x3a, 0x7a, 0xfb, 0x63, 0x82, 0xfe, 0xbb, 0x26, 0xff, 0xec, 0x77, 0xff, 0xde, 0xd9, 0xfe, \n  0x8d, 0x17, 0x00, 0x35, 0x5e, 0xfe, 0x73, 0x4c, 0x35, 0x7b, 0x7e, 0x29, 0xa0, 0x49, 0xf9, 0x3c, \n  0x86, 0x06, 0x7a, 0x95, 0xf5, 0xf3, 0xe6, 0x00, 0x97, 0xae, 0x08, 0x72, 0xc0, 0xf5, 0x06, 0xbf, \n  0xe8, 0x74, 0xd9, 0x01, 0x88, 0x6b, 0x10, 0x4e, 0x58, 0xfe, 0x60, 0x01, 0xfc, 0x5c, 0x4c, 0xeb, \n  0x9b, 0xb9, 0xfa, 0xac, 0x54, 0x0a, 0xd5, 0xd2, 0x01, 0x69, 0x0c, 0xfb, 0x4c, 0x24, 0xfd, 0x73, \n  0x4c, 0xff, 0xa7, 0xce, 0xfc, 0xd9, 0xd3, 0xff, 0xb8, 0x83, 0xfc, 0x1f, 0xf9, 0x00, 0x87, 0x33, \n  0xfd, 0x62, 0xf6, 0xfa, 0x1a, 0x59, 0xfe, 0x1f, 0x72, 0xfe, 0xd4, 0xa5, 0xff, 0xdc, 0x47, 0xff, \n  0x56, 0x3b, 0x00, 0x35, 0xfe, 0xfe, 0x9f, 0x25, 0x33, 0x54, 0x42, 0x29, 0x3a, 0x92, 0xfc, 0x46, \n  0x32, 0x06, 0xa8, 0x58, 0xf7, 0x7c, 0x80, 0x00, 0x7a, 0x65, 0x06, 0x45, 0x58, 0xf7, 0xaa, 0x5e, \n  0xe7, 0x21, 0x90, 0xff, 0x37, 0x3a, 0x0f, 0x26, 0x24, 0xff, 0x5f, 0x37, 0x00, 0xcc, 0xd4, 0xeb, \n  0xc8, 0x7a, 0xf6, 0xf7, 0x02, 0x0a, 0x2c, 0x63, 0x02, 0xcf, 0x6e, 0xfc, 0x8b, 0xea, 0xfd, 0xff, \n  0x92, 0xfe, 0xcb, 0x60, 0xfd, 0x3c, 0xdb, 0xff, 0x40, 0x38, 0xfc, 0xe1, 0xe3, 0x00, 0x6f, 0x14, \n  0xfd, 0x18, 0x79, 0xfa, 0x53, 0x8e, 0xfe, 0x00, 0xee, 0xfd, 0x8d, 0xfb, 0xff, 0x13, 0xf0, 0xff, \n  0x14, 0x40, 0x00, 0x42, 0x75, 0xff, 0x2c, 0xe3, 0x30, 0x09, 0xd0, 0x26, 0xe2, 0x4a, 0x00, 0x26, \n  0x37, 0x08, 0xda, 0x93, 0xf7, 0xae, 0x1a, 0x00, 0xf8, 0xa7, 0x04, 0xd2, 0xa4, 0xf8, 0x4c, 0x9f, \n  0xe7, 0x90, 0xf9, 0xfb, 0x28, 0x4f, 0x0e, 0x24, 0xca, 0xff, 0x0e, 0x3a, 0x03, 0x4f, 0x32, 0xee, \n  0x43, 0x43, 0xf1, 0x0e, 0x84, 0x08, 0x9e, 0xab, 0x03, 0xa8, 0xc6, 0xfd, 0x8d, 0xda, 0xfe, 0xd7, \n  0x4f, 0xfe, 0x3b, 0xf0, 0xfd, 0xc6, 0xcc, 0xff, 0x09, 0xcb, 0xfb, 0x5a, 0x23, 0x00, 0x8b, 0x53, \n  0xfd, 0x7d, 0x0e, 0xfa, 0xa3, 0xa9, 0xfe, 0x32, 0x4a, 0xfe, 0x5e, 0xfc, 0xff, 0xb9, 0xbc, 0x00, \n  0xcc, 0x68, 0x00, 0x96, 0x3c, 0xff, 0x41, 0x44, 0x2e, 0x8b, 0xed, 0x25, 0x51, 0xe7, 0x00, 0x56, \n  0x83, 0x0a, 0x97, 0x9e, 0xf8, 0x34, 0xc0, 0xfe, 0xda, 0xec, 0x04, 0xe9, 0x88, 0xf8, 0xe5, 0x3b, \n  0xe9, 0x9a, 0x3a, 0xf9, 0xb5, 0xff, 0x0d, 0x93, 0x93, 0xff, 0xf7, 0x0c, 0x03, 0xcc, 0xde, 0xf2, \n  0x0d, 0x46, 0xed, 0x16, 0x85, 0x05, 0x53, 0x62, 0x05, 0x1d, 0xcc, 0xfe, 0x76, 0x65, 0xff, 0x7e, \n  0x4a, 0xfe, 0xa1, 0x15, 0xfe, 0xe9, 0x41, 0x00, 0xa9, 0x6e, 0xfb, 0xef, 0x45, 0xfe, 0x7a, 0x88, \n  0xfe, 0x35, 0x7d, 0xfa, 0x82, 0x61, 0xfe, 0xa8, 0xd3, 0xfe, 0x56, 0xdd, 0xff, 0x8e, 0xfa, 0x00, \n  0x2f, 0x29, 0x00, 0x38, 0x41, 0xff, 0x68, 0xa0, 0x2c, 0x8b, 0x17, 0x25, 0x76, 0xc3, 0xff, 0x0b, \n  0xbc, 0x0b, 0xe6, 0xfa, 0xfa, 0x8c, 0x49, 0xfc, 0x51, 0x96, 0x04, 0x6b, 0xf2, 0xf9, 0x04, 0x54, \n  0xec, 0x22, 0x80, 0xf7, 0xe2, 0xb3, 0x0c, 0x93, 0x45, 0xff, 0x2a, 0x60, 0x00, 0x2b, 0xbd, 0xf8, \n  0xd4, 0x9a, 0xec, 0x88, 0x23, 0x00, 0xc3, 0x57, 0x06, 0xf0, 0xd7, 0xff, 0x1a, 0x54, 0x00, 0x6e, \n  0xf0, 0xfe, 0x98, 0xc2, 0xfd, 0xca, 0xa0, 0xff, 0x42, 0x51, 0xfb, 0x15, 0xb4, 0xfd, 0x5f, 0x72, \n  0xff, 0x19, 0x37, 0xfb, 0x24, 0x55, 0xfe, 0xcd, 0x86, 0xff, 0x70, 0x3c, 0xff, 0xc9, 0xdc, 0x00, \n  0xd6, 0x29, 0x00, 0x42, 0x1b, 0xff, 0xa3, 0xb3, 0x2a, 0x02, 0xa6, 0x24, 0xfc, 0x34, 0xfe, 0x29, \n  0xe1, 0x0b, 0x3c, 0x8f, 0xfd, 0xc2, 0xb5, 0xfc, 0xee, 0xbf, 0x01, 0x0e, 0xdd, 0xf9, 0xd6, 0x82, \n  0xf2, 0x0f, 0xa3, 0xf5, 0x51, 0x53, 0x0b, 0xab, 0x41, 0x00, 0x31, 0xee, 0xfb, 0x8b, 0xa6, 0xfd, \n  0xd7, 0x1e, 0xef, 0xff, 0x86, 0xfa, 0x13, 0x40, 0x06, 0x72, 0x8e, 0x00, 0x0b, 0xf4, 0xff, 0x56, \n  0xcc, 0x00, 0x21, 0xfd, 0xfd, 0xc9, 0x97, 0xfd, 0x97, 0xec, 0xfb, 0x39, 0xb4, 0xfd, 0xba, 0x60, \n  0x00, 0xb3, 0xc4, 0xfc, 0x46, 0x2a, 0xfd, 0xb0, 0x9d, 0xff, 0x58, 0x65, 0xff, 0xa9, 0x89, 0x00, \n  0xba, 0x24, 0x00, 0xeb, 0x36, 0xff, 0x97, 0x28, 0x28, 0xae, 0x56, 0x22, 0x4f, 0x16, 0xfe, 0xdc, \n  0xfa, 0x0c, 0x28, 0x7b, 0xff, 0x19, 0xb8, 0xfc, 0x86, 0x01, 0x01, 0xfb, 0x0f, 0xf9, 0x07, 0xe0, \n  0xf5, 0xe1, 0xbd, 0xf6, 0xcc, 0xf8, 0x08, 0xfe, 0x1c, 0x02, 0xdb, 0xdb, 0xf9, 0xe5, 0x46, 0xff, \n  0xc5, 0xa6, 0xf3, 0x62, 0x54, 0xf6, 0x5d, 0xc3, 0x04, 0x30, 0x34, 0x01, 0x35, 0xb5, 0xfe, 0xcb, \n  0x6f, 0x01, 0x29, 0x00, 0xff, 0x8a, 0x3a, 0xfd, 0xc3, 0xeb, 0xfb, 0x1c, 0x20, 0xfe, 0x53, 0x0d, \n  0x01, 0x13, 0xeb, 0xfd, 0xbd, 0x0b, 0xfc, 0x2e, 0x7e, 0xff, 0x47, 0xec, 0xff, 0x4b, 0x2a, 0x00, \n  0xee, 0x55, 0x00, 0xcd, 0x58, 0xff, 0x21, 0x65, 0x25, 0xd1, 0x49, 0x1f, 0xce, 0xe5, 0xfe, 0x3d, \n  0x32, 0x0e, 0x58, 0x1c, 0x00, 0xb4, 0x0a, 0xfc, 0xfd, 0x72, 0x01, 0xe9, 0x3a, 0xfb, 0xc9, 0xeb, \n  0xf5, 0x04, 0x2d, 0xf6, 0x01, 0x67, 0x08, 0x99, 0x80, 0x03, 0xc0, 0x68, 0xf9, 0x6c, 0x3b, 0xff, \n  0x79, 0xcc, 0xf7, 0x8d, 0x1f, 0xf5, 0xd3, 0xb3, 0x02, 0x39, 0x9c, 0x01, 0xfa, 0x99, 0xfd, 0x31, \n  0x75, 0x00, 0x33, 0x0d, 0xff, 0x71, 0x45, 0xfe, 0xc2, 0x2e, 0xfd, 0x21, 0xb8, 0xfd, 0x26, 0x5f, \n  0x00, 0xf4, 0x9d, 0xfe, 0xaa, 0x3f, 0xfc, 0x94, 0xc6, 0xff, 0xe2, 0x03, 0x00, 0x55, 0xdd, 0xff, \n  0x36, 0xa0, 0x00, 0xd4, 0x19, 0xff, 0x5d, 0x83, 0x21, 0xdc, 0x52, 0x1c, 0x7b, 0x8e, 0x00, 0xc2, \n  0x39, 0x0f, 0xc1, 0x6a, 0x00, 0xc6, 0x74, 0xfb, 0x5c, 0x81, 0x02, 0x04, 0x77, 0xfd, 0xd1, 0xac, \n  0xf6, 0x35, 0x6d, 0xf5, 0xa2, 0xc2, 0x05, 0xf6, 0xaf, 0x04, 0x2a, 0xec, 0xfa, 0xd9, 0xf3, 0xfe, \n  0x69, 0x7b, 0xfa, 0x33, 0x8a, 0xf5, 0x09, 0x82, 0x01, 0x3c, 0xbc, 0x01, 0xd2, 0xc2, 0xfc, 0x75, \n  0x7b, 0xff, 0xdb, 0x7c, 0xfe, 0x83, 0x7a, 0xfe, 0x97, 0xcd, 0xfe, 0x31, 0xe8, 0xfd, 0x5d, 0x04, \n  0xff, 0x05, 0xf6, 0xfe, 0xdc, 0x54, 0xfd, 0x0c, 0x28, 0x00, 0x94, 0x2c, 0x00, 0x22, 0xa5, 0xff, \n  0x81, 0x65, 0x00, 0xcf, 0x14, 0xff, 0x02, 0x63, 0x1d, 0x08, 0xd9, 0x16, 0xcf, 0x52, 0x01, 0x2a, \n  0xd3, 0x12, 0x61, 0x32, 0x00, 0xc0, 0xb0, 0xf9, 0x5e, 0x54, 0x04, 0xd4, 0xbb, 0x00, 0x33, 0xd7, \n  0xf7, 0xa6, 0x1a, 0xf3, 0xe1, 0xa7, 0x03, 0x5b, 0x57, 0x06, 0x77, 0x00, 0xfc, 0xe0, 0x78, 0x01, \n  0x11, 0xb3, 0xfb, 0xc1, 0x40, 0xf3, 0xe3, 0x78, 0x02, 0x0e, 0x91, 0x02, 0x9d, 0x96, 0xfb, 0x09, \n  0x79, 0xff, 0x58, 0x96, 0xfd, 0x22, 0x96, 0xfd, 0xcd, 0xb1, 0xff, 0x38, 0x06, 0xfe, 0xff, 0xb9, \n  0xff, 0xae, 0x9e, 0xff, 0x75, 0x34, 0xfd, 0xfb, 0x5f, 0x01, 0xd8, 0xcf, 0x00, 0xc9, 0x38, 0xff, \n  0x2b, 0xfa, 0xff, 0x27, 0x21, 0xff, 0x38, 0xbd, 0x18, 0x53, 0x80, 0x16, 0x74, 0x77, 0x05, 0x1c, \n  0xc0, 0x10, 0xa2, 0x63, 0xff, 0x9a, 0x4b, 0xf9, 0x3e, 0xa9, 0x03, 0xf5, 0x40, 0xff, 0x1d, 0x42, \n  0xfa, 0x2e, 0x3c, 0xf6, 0x34, 0x59, 0xff, 0xaf, 0x66, 0x04, 0x1a, 0x37, 0xfe, 0x62, 0x87, 0x02, \n  0x44, 0xea, 0xfd, 0x87, 0xb2, 0xf4, 0x21, 0x92, 0xfe, 0x70, 0x90, 0x02, 0xd7, 0x41, 0xff, 0x11, \n  0x96, 0xff, 0xe2, 0x44, 0xfd, 0x89, 0x07, 0xfe, 0xfc, 0xd8, 0xff, 0x1d, 0xf1, 0xfe, 0xf8, 0xf0, \n  0xff, 0x17, 0x6e, 0xff, 0x4d, 0xa8, 0xfd, 0xc2, 0x13, 0x00, 0x71, 0x98, 0x00, 0x23, 0x3d, 0xff, \n  0x75, 0xe5, 0xff, 0x57, 0x8e, 0xff, 0x6e, 0xbf, 0x15, 0xfe, 0xda, 0x14, 0xb2, 0xa4, 0x05, 0x81, \n  0x1d, 0x0f, 0x83, 0x74, 0x00, 0x37, 0x89, 0xfb, 0x8c, 0x5c, 0x03, 0xc7, 0xb7, 0xfe, 0x6c, 0x5a, \n  0xfb, 0xf6, 0x2e, 0xf7, 0xb0, 0xae, 0xfe, 0x4f, 0x54, 0x03, 0x28, 0x91, 0xfe, 0xa4, 0x07, 0x02, \n  0xe7, 0x36, 0xff, 0x3f, 0x25, 0xf7, 0x1a, 0x6f, 0xfd, 0x58, 0xf5, 0x02, 0x4c, 0xef, 0xff, 0xf8, \n  0x6d, 0xfe, 0x3f, 0xc3, 0xfd, 0x57, 0xcb, 0xfe, 0x47, 0xd3, 0xff, 0xd8, 0xb3, 0xfe, 0x95, 0x13, \n  0xff, 0x60, 0x7a, 0xff, 0xe0, 0xd6, 0xfe, 0xb1, 0xc5, 0xff, 0xa0, 0x8c, 0xff, 0xbb, 0x27, 0xff, \n  0xa2, 0x47, 0x00, 0xa0, 0xb7, 0xff, 0x2b, 0x56, 0x13, 0xf3, 0xa6, 0x12, 0x02, 0xc3, 0x05, 0xd1, \n  0x88, 0x0c, 0x07, 0x84, 0x01, 0x93, 0x8f, 0xfe, 0x65, 0x3b, 0x02, 0x55, 0x79, 0xfe, 0x21, 0x0f, \n  0xfc, 0x3a, 0x4e, 0xf8, 0xa4, 0xbe, 0xfe, 0xf4, 0x41, 0x02, 0x62, 0x09, 0xff, 0xfa, 0xa1, 0x01, \n  0xf2, 0xd8, 0xff, 0x25, 0xef, 0xf8, 0xe1, 0xdb, 0xfd, 0xa8, 0x2b, 0x03, 0xd8, 0xd3, 0xff, 0x2a, \n  0x5f, 0xfe, 0xc6, 0x6c, 0xfe, 0xcf, 0x55, 0xff, 0xd3, 0xa7, 0xff, 0x37, 0x5a, 0xfe, 0x56, 0x78, \n  0xfe, 0x71, 0x53, 0xff, 0x83, 0x36, 0xff, 0xb8, 0x3c, 0xff, 0x50, 0x42, 0xff, 0x07, 0xa3, 0xff, \n  0x05, 0x74, 0x00, 0xee, 0xdb, 0xff, 0x21, 0x60, 0x11, 0x2f, 0x32, 0x11, 0x44, 0x58, 0x05, 0x3e, \n  0x34, 0x0a, 0x94, 0xe4, 0x02, 0xcc, 0x21, 0x00, 0x85, 0x44, 0x01, 0x01, 0x6d, 0xfe, 0x27, 0x35, \n  0xfc, 0x24, 0x7c, 0xf9, 0xd9, 0xcd, 0xfe, 0x71, 0xa0, 0x01, 0x33, 0x55, 0xff, 0xe7, 0x7b, 0x01, \n  0x1e, 0x41, 0x00, 0xa8, 0xda, 0xf9, 0x8e, 0x68, 0xfe, 0xcb, 0x40, 0x03, 0x43, 0xaa, 0xff, 0x60, \n  0x6f, 0xfe, 0xf2, 0xe8, 0xfe, 0x3b, 0x5a, 0xff, 0x23, 0x7a, 0xff, 0x06, 0x51, 0xfe, 0x25, 0x1c, \n  0xfe, 0x3c, 0x25, 0xff, 0xce, 0x04, 0xff, 0x00, 0x2f, 0xff, 0x8c, 0xb2, 0xff, 0x39, 0xc0, 0xff, \n  0xc9, 0x38, 0x00, 0xa1, 0xf6, 0xff, 0x6f, 0xec, 0x0e, 0xda, 0xb2, 0x0f, 0x63, 0xaf, 0x04, 0x7f, \n  0xa7, 0x08, 0xfd, 0x7d, 0x04, 0xb8, 0x8c, 0x00, 0x7f, 0xbf, 0x00, 0x6d, 0xb0, 0xfe, 0x94, 0xa0, \n  0xfc, 0x36, 0x02, 0xfb, 0x45, 0xc4, 0xfe, 0x39, 0x09, 0x01, 0xff, 0x12, 0x00, 0xb6, 0xe0, 0x01, \n  0xfa, 0x28, 0x00, 0xa6, 0xf6, 0xfa, 0xc5, 0x59, 0xff, 0x81, 0xea, 0x02, 0xf5, 0x9f, 0xff, 0xfb, \n  0x72, 0xfe, 0x41, 0x1c, 0xff, 0x8f, 0xc4, 0xff, 0x46, 0x5a, 0xff, 0x12, 0x47, 0xfe, 0x8c, 0x3a, \n  0xfe, 0x0d, 0x71, 0xff, 0xb4, 0x1a, 0xff, 0xc3, 0x02, 0xff, 0x56, 0xf0, 0xff, 0x96, 0x0a, 0x00, \n  0x6b, 0x39, 0x00, 0xbf, 0xd9, 0xff, 0xb0, 0x1e, 0x0d, 0x2e, 0xc3, 0x0d, 0xee, 0x4f, 0x04, 0x3d, \n  0x54, 0x08, 0x1c, 0xb5, 0x04, 0x12, 0x46, 0x00, 0x80, 0x8f, 0x00, 0x0a, 0xf5, 0xfe, 0x6c, 0x33, \n  0xfd, 0x67, 0x24, 0xfc, 0x10, 0x92, 0xfe, 0xb8, 0x80, 0x00, 0x6c, 0xbc, 0x00, 0xc2, 0x22, 0x02, \n  0x0c, 0x1d, 0x00, 0x7e, 0x05, 0xfc, 0xa1, 0xbe, 0xff, 0xf6, 0xfa, 0x01, 0xbc, 0x5f, 0xff, 0xa4, \n  0xcb, 0xfe, 0x5a, 0x62, 0xff, 0xbd, 0xb0, 0xff, 0x28, 0x3d, 0xff, 0x7d, 0x9a, 0xfe, 0x39, 0xba, \n  0xfe, 0xa8, 0xc0, 0xff, 0xb8, 0xf2, 0xfe, 0x59, 0xcf, 0xfe, 0xe2, 0xe3, 0xff, 0xbf, 0x1e, 0x00, \n  0x22, 0x37, 0x00, 0xf5, 0xb3, 0xff, 0xe5, 0xf2, 0x0a, 0x12, 0x31, 0x0c, 0x1d, 0x4e, 0x04, 0x84, \n  0xa9, 0x07, 0x32, 0x74, 0x04, 0x40, 0x70, 0x00, 0x20, 0xa3, 0x00, 0x79, 0x22, 0xff, 0xd6, 0xd4, \n  0xfd, 0xa1, 0xf9, 0xfc, 0xb3, 0x68, 0xfe, 0xf1, 0x2e, 0x00, 0xaf, 0x91, 0x01, 0x0a, 0x76, 0x02, \n  0xb5, 0x0f, 0x00, 0xba, 0xfc, 0xfc, 0xf7, 0x71, 0xff, 0x6e, 0x30, 0x01, 0xa4, 0xa6, 0xff, 0x4a, \n  0x09, 0xff, 0x9f, 0x55, 0xff, 0xd7, 0xa6, 0xff, 0xec, 0xac, 0xff, 0x1e, 0x43, 0xff, 0xfc, 0x18, \n  0xff, 0xfe, 0x86, 0xff, 0xe1, 0x96, 0xfe, 0xa5, 0xde, 0xfe, 0xcb, 0xfe, 0xff, 0x81, 0xfc, 0xff, \n  0xb1, 0x19, 0x00, 0x32, 0xc6, 0xff, 0x41, 0x69, 0x08, 0x6c, 0xac, 0x0a, 0x29, 0xbe, 0x04, 0xc0, \n  0x37, 0x06, 0xc9, 0xf8, 0x03, 0xb5, 0x72, 0x01, 0xf0, 0x04, 0x01, 0xc8, 0x2c, 0xff, 0x87, 0x2f, \n  0xfe, 0x22, 0xe3, 0xfd, 0x84, 0x22, 0xff, 0x96, 0xc4, 0x00, 0x65, 0x2f, 0x02, 0x90, 0x5a, 0x02, \n  0xc4, 0x29, 0x00, 0x52, 0xef, 0xfd, 0xef, 0x7f, 0xff, 0x6e, 0xb1, 0x00, 0x9f, 0xb6, 0xff, 0xf3, \n  0x3f, 0xff, 0x70, 0x9b, 0xff, 0x43, 0x43, 0x00, 0x4a, 0x28, 0x00, 0x2b, 0x61, 0xff, 0x21, 0xf0, \n  0xfe, 0xfa, 0x61, 0xff, 0x88, 0x07, 0xff, 0x7b, 0x1e, 0xff, 0xc1, 0xf4, 0xff, 0x27, 0xe2, 0xff, \n  0xa4, 0xfe, 0xff, 0xf8, 0x08, 0x00, 0xb5, 0x64, 0x06, 0xf4, 0x54, 0x08, 0xf2, 0x58, 0x05, 0xe2, \n  0xdf, 0x05, 0x63, 0xa7, 0x03, 0xaa, 0xe0, 0x01, 0x75, 0xec, 0x00, 0x60, 0xad, 0xff, 0x37, 0xf7, \n  0xfe, 0xaa, 0xea, 0xfe, 0x06, 0xde, 0xff, 0xc8, 0xe2, 0x00, 0xc7, 0x7f, 0x02, 0x08, 0x9c, 0x02, \n  0x44, 0x63, 0x00, 0x45, 0x9f, 0xfe, 0x4e, 0x91, 0xff, 0xd4, 0x29, 0x00, 0x10, 0xaf, 0xff, 0x22, \n  0x9d, 0xff, 0x42, 0x21, 0x00, 0xac, 0x55, 0x00, 0x05, 0xd3, 0xff, 0xd8, 0x90, 0xff, 0x4f, 0x6a, \n  0xff, 0x3d, 0x87, 0xff, 0x6c, 0x26, 0xff, 0x77, 0x40, 0xff, 0x77, 0xcf, 0xff, 0xb5, 0xf1, 0xff, \n  0x66, 0x0b, 0x00, 0xc0, 0xfd, 0xff, 0x44, 0xde, 0x04, 0x5e, 0xcb, 0x06, 0xc8, 0x08, 0x05, 0x5c, \n  0xcd, 0x04, 0xea, 0x2d, 0x03, 0xc8, 0x1d, 0x02, 0x71, 0x83, 0x01, 0xbd, 0x28, 0x00, 0x17, 0x02, \n  0x00, 0x5b, 0x6c, 0x00, 0x16, 0xea, 0x00, 0x19, 0x98, 0x01, 0x49, 0x75, 0x02, 0x78, 0xb5, 0x02, \n  0x6f, 0x97, 0x00, 0x1d, 0xdc, 0xfe, 0x6a, 0x5a, 0xff, 0xb3, 0xd3, 0xff, 0xb5, 0x33, 0x00, 0x70, \n  0x0e, 0x00, 0x52, 0xe1, 0xff, 0xe1, 0x30, 0x00, 0x1f, 0x33, 0x00, 0x29, 0xe4, 0xff, 0xe2, 0x86, \n  0xff, 0xe1, 0x87, 0xff, 0xad, 0x61, 0xff, 0xf3, 0x68, 0xff, 0x14, 0xe8, 0xff, 0x48, 0x10, 0x00, \n  0x71, 0x00, 0x00, 0xfd, 0xcd, 0xff, 0x01, 0x4f, 0x04, 0xf1, 0xc7, 0x05, 0x5e, 0x40, 0x04, 0x0e, \n  0xb6, 0x03, 0xf1, 0xd5, 0x02, 0x60, 0x6f, 0x02, 0xcf, 0x3f, 0x02, 0xaa, 0xa6, 0x01, 0x5b, 0xd7, \n  0x00, 0x71, 0x3f, 0x01, 0x7d, 0xd9, 0x01, 0x6f, 0x07, 0x02, 0x73, 0x67, 0x02, 0xe8, 0x03, 0x02, \n  0xb6, 0x1f, 0x00, 0x2f, 0xff, 0xfe, 0x5c, 0xc9, 0xff, 0x4a, 0x2f, 0x00, 0x21, 0x49, 0x00, 0xd8, \n  0xfd, 0xff, 0x48, 0xe3, 0xff, 0xe3, 0x37, 0x00, 0xaa, 0x4b, 0x00, 0x6d, 0x01, 0x00, 0x14, 0x97, \n  0xff, 0x64, 0xae, 0xff, 0xb3, 0xb5, 0xff, 0x80, 0xd2, 0xff, 0x4b, 0x09, 0x00, 0xbe, 0x04, 0x00, \n  0x8d, 0xae, 0xff, 0x2d, 0x4e, 0xff, 0x68, 0x74, 0x03, 0x8e, 0x81, 0x04, 0x10, 0x5b, 0x03, 0x5a, \n  0xb3, 0x03, 0x2b, 0x77, 0x03, 0xae, 0xff, 0x02, 0x44, 0x01, 0x03, 0x40, 0xec, 0x02, 0x14, 0x5d, \n  0x02, 0x52, 0xc3, 0x01, 0xfb, 0x7e, 0x01, 0x66, 0x87, 0x01, 0xda, 0xa7, 0x01, 0x62, 0x5a, 0x01, \n  0x4e, 0x4a, 0x00, 0xfd, 0xb4, 0xff, 0xd5, 0x22, 0x00, 0x71, 0x0d, 0x00, 0x1f, 0xdf, 0xff, 0xbf, \n  0xed, 0xff, 0x37, 0xeb, 0xff, 0x05, 0x27, 0x00, 0x00, 0x6b, 0x00, 0xae, 0x56, 0x00, 0xbd, 0xeb, \n  0xff, 0xbe, 0xd9, 0xff, 0x72, 0xc9, 0xff, 0xf9, 0xd9, 0xff, 0xb0, 0xf5, 0xff, 0x53, 0x9b, 0xff, \n  0x5a, 0x55, 0xff, 0x01, 0x38, 0xff, 0x41, 0x21, 0x03, 0x3e, 0xea, 0x04, 0x7f, 0xe0, 0x03, 0x22, \n  0x96, 0x04, 0xb8, 0xaf, 0x04, 0xf0, 0x6c, 0x03, 0xf9, 0xc6, 0x02, 0x3a, 0x48, 0x02, 0x5e, 0xee, \n  0x01, 0x6d, 0xdb, 0x01, 0x5e, 0x7f, 0x01, 0xd0, 0xff, 0x00, 0x09, 0xa3, 0x00, 0xf8, 0xd9, 0x00, \n  0xeb, 0xd5, 0x00, 0xa0, 0x41, 0x00, 0xc3, 0x06, 0x00, 0x6d, 0xba, 0xff, 0x64, 0x82, 0xff, 0xdd, \n  0xc8, 0xff, 0x74, 0x3b, 0x00, 0xf1, 0x79, 0x00, 0x10, 0x7f, 0x00, 0x11, 0x93, 0x00, 0x37, 0x63, \n  0x00, 0xe8, 0xcd, 0xff, 0xdf, 0x91, 0xff, 0x80, 0x81, 0xff, 0xad, 0x74, 0xff, 0xd7, 0x61, 0xff, \n  0x69, 0x4c, 0xff, 0x15, 0x76, 0xff, 0x79, 0x99, 0x03, 0xd5, 0x66, 0x06, 0xd1, 0x6c, 0x05, 0x40, \n  0xd4, 0x04, 0xe7, 0x0d, 0x04, 0xea, 0x8a, 0x03, 0xd3, 0xd4, 0x02, 0x1f, 0x88, 0x01, 0x2b, 0xcd, \n  0x00, 0x6e, 0xc6, 0x00, 0xe4, 0xdf, 0x00, 0xf3, 0x1f, 0x01, 0x7f, 0x3f, 0x01, 0x80, 0x02, 0x01, \n  0xa7, 0xab, 0x00, 0x99, 0xe6, 0xff, 0x06, 0x88, 0xff, 0x40, 0xa6, 0xff, 0x2e, 0xfe, 0xff, 0xbe, \n  0x04, 0x00, 0xed, 0x1d, 0x00, 0x87, 0x97, 0x00, 0x1d, 0x83, 0x00, 0x1b, 0x7b, 0x00, 0xaa, 0x6f, \n  0x00, 0x58, 0xe9, 0xff, 0x67, 0x5c, 0xff, 0x2c, 0x20, 0xff, 0xe0, 0x08, 0xff, 0xfe, 0x57, 0xff, \n  0x5b, 0x8e, 0xff, 0x49, 0x93, 0xff, 0xac, 0x30, 0x04, 0x35, 0xb1, 0x06, 0x7c, 0x52, 0x05, 0xf1, \n  0x8d, 0x04, 0xcf, 0xee, 0x03, 0x0b, 0xae, 0x03, 0xa9, 0x01, 0x03, 0x09, 0x84, 0x01, 0xdf, 0x3e, \n  0x00, 0x44, 0xc4, 0xff, 0xe6, 0x6d, 0x00, 0x07, 0x74, 0x01, 0x4d, 0x47, 0x01, 0x1c, 0xe1, 0x00, \n  0x20, 0xbe, 0x00, 0x98, 0x3e, 0x00, 0x23, 0x1e, 0x00, 0x64, 0xea, 0xff, 0x98, 0xbe, 0xff, 0x1d, \n  0xcc, 0xff, 0xb0, 0x31, 0x00, 0xee, 0x4b, 0x00, 0x18, 0x0c, 0x00, 0x44, 0x71, 0x00, 0xa9, 0xe5, \n  0x00, 0x81, 0x76, 0x00, 0x4f, 0x65, 0xff, 0xde, 0xd8, 0xfe, 0xbb, 0xf4, 0xfe, 0x92, 0x35, 0xff, \n  0xb1, 0x6f, 0xff, 0x0b, 0xac, 0xff, 0xf9, 0x32, 0x04, 0xd7, 0x83, 0x06, 0xe3, 0x6e, 0x04, 0xe5, \n  0xf6, 0x03, 0xd3, 0xdd, 0x03, 0x7a, 0xb5, 0x03, 0x34, 0x22, 0x03, 0x15, 0x7d, 0x01, 0xc5, 0x10, \n  0x00, 0xfc, 0x73, 0x00, 0xd9, 0x38, 0x01, 0x2f, 0xbe, 0x00, 0xe1, 0x5b, 0x00, 0xcb, 0x8a, 0x00, \n  0x57, 0x8f, 0x00, 0x21, 0xd8, 0x00, 0x46, 0x23, 0x01, 0xd2, 0x4f, 0x00, 0x28, 0xd1, 0xff, 0xc6, \n  0xd1, 0xff, 0x18, 0xe0, 0xff, 0x26, 0xf1, 0xff, 0x4d, 0xf3, 0xff, 0x0f, 0x2d, 0x00, 0x4f, 0x4b, \n  0x00, 0x8e, 0xc0, 0x00, 0x72, 0x80, 0x00, 0x08, 0x63, 0xff, 0xb0, 0xd2, 0xfe, 0xa4, 0xea, 0xfe, \n  0x87, 0x42, 0xff, 0x92, 0x8e, 0xff, 0x51, 0x08, 0x05, 0x06, 0x29, 0x07, 0x32, 0xff, 0x03, 0xce, \n  0x0c, 0x03, 0x45, 0x9b, 0x02, 0x03, 0x00, 0x03, 0xff, 0xf9, 0x02, 0xf7, 0x8d, 0x01, 0xec, 0xae, \n  0xff, 0x11, 0x29, 0x00, 0xdb, 0xff, 0x01, 0x1a, 0xb1, 0x01, 0x87, 0xc3, 0x00, 0xee, 0xa3, 0xff, \n  0xa0, 0x68, 0xff, 0x2e, 0xb9, 0x00, 0x7a, 0x59, 0x01, 0x15, 0x11, 0x01, 0xaf, 0xe9, 0x00, 0x5c, \n  0x07, 0x00, 0x30, 0xbf, 0xff, 0x52, 0x34, 0x00, 0x64, 0xcc, 0xff, 0x98, 0x8c, 0xff, 0x6c, 0x12, \n  0x00, 0x5c, 0x43, 0x00, 0x01, 0x44, 0x00, 0x33, 0x78, 0x00, 0x9a, 0xfd, 0xff, 0x69, 0x63, 0xff, \n  0x51, 0xfa, 0xfe, 0x5f, 0xf9, 0xfe, 0x3e, 0xdc, 0x05, 0xf4, 0x7a, 0x08, 0xd2, 0x08, 0x04, 0xfb, \n  0xc4, 0x02, 0xba, 0x0e, 0x02, 0x76, 0x81, 0x02, 0x52, 0x46, 0x02, 0x7d, 0x6f, 0x00, 0xcb, 0xb1, \n  0xfe, 0x85, 0x3e, 0xff, 0x68, 0x85, 0x02, 0x40, 0x97, 0x02, 0x3e, 0xd8, 0x00, 0x1a, 0xee, 0xff, \n  0x7b, 0xd6, 0xff, 0x1a, 0x0c, 0x00, 0x5a, 0xad, 0x00, 0x53, 0x0a, 0x01, 0xa7, 0xd8, 0x00, 0x93, \n  0xa6, 0x00, 0xff, 0x7e, 0x00, 0xac, 0x43, 0x00, 0xd4, 0xdb, 0xff, 0xb8, 0xe8, 0xff, 0x14, 0xb5, \n  0xff, 0x55, 0x82, 0xff, 0xb8, 0xfc, 0xff, 0xc2, 0x5d, 0x00, 0xff, 0xa1, 0x00, 0x71, 0x6c, 0x00, \n  0x24, 0x95, 0xff, 0x34, 0xec, 0xfe, 0x0f, 0x7e, 0x07, 0xe2, 0x14, 0x0a, 0x1c, 0x0f, 0x04, 0x01, \n  0x30, 0x03, 0x49, 0xf0, 0x01, 0x8f, 0x1e, 0x02, 0x71, 0xb7, 0x01, 0xc1, 0x2b, 0xff, 0xbf, 0xd9, \n  0xfc, 0x08, 0xdd, 0xfd, 0xe5, 0xd0, 0x02, 0xef, 0x96, 0x02, 0x47, 0x7d, 0x00, 0x08, 0x1c, 0x00, \n  0xb9, 0x0b, 0x00, 0xd0, 0x9a, 0x00, 0x16, 0x3a, 0x01, 0xc8, 0x6d, 0x00, 0xd4, 0x35, 0x00, 0x54, \n  0xf5, 0x00, 0x62, 0x86, 0x00, 0x29, 0x84, 0x00, 0x99, 0x6b, 0x00, 0xaf, 0xd2, 0xff, 0x95, 0xfb, \n  0xff, 0x88, 0xd4, 0xff, 0x05, 0x87, 0xff, 0x4b, 0xfe, 0xff, 0x22, 0x7d, 0x00, 0xc1, 0xf3, 0x00, \n  0x73, 0x5a, 0x00, 0x22, 0x6f, 0xff, 0xf0, 0x49, 0x09, 0x23, 0xb7, 0x0b, 0x53, 0xdc, 0x03, 0xf0, \n  0xa3, 0x03, 0x8e, 0xd9, 0x01, 0x0e, 0x07, 0x02, 0x04, 0x97, 0x01, 0x31, 0x3a, 0xfe, 0x12, 0x7b, \n  0xfb, 0xc9, 0xd3, 0xfc, 0x23, 0x3c, 0x03, 0xe3, 0x51, 0x02, 0xda, 0x70, 0xff, 0xec, 0x68, 0xff, \n  0x2b, 0xcc, 0xff, 0x8e, 0xf6, 0x00, 0x6a, 0xa1, 0x01, 0x2a, 0xac, 0x00, 0x7b, 0xb8, 0x00, 0xce, \n  0xb8, 0x00, 0x29, 0x1a, 0x00, 0xa1, 0xb4, 0x00, 0x75, 0x1c, 0x00, 0x42, 0x07, 0x00, 0xca, 0x44, \n  0x00, 0xee, 0xde, 0xff, 0x94, 0xc2, 0xff, 0xce, 0x69, 0x00, 0x04, 0x51, 0x00, 0xb2, 0x04, 0x00, \n  0x45, 0x65, 0x00, 0x83, 0x40, 0x00, 0xdb, 0x84, 0x0b, 0xc1, 0x13, 0x0d, 0x72, 0x62, 0x03, 0xe3, \n  0x69, 0x04, 0xd6, 0xb7, 0x01, 0x3e, 0x32, 0x02, 0x9f, 0xb8, 0x01, 0xf9, 0x53, 0xfd, 0xf3, 0xee, \n  0xf9, 0xd4, 0x25, 0xfc, 0xfa, 0x29, 0x04, 0x43, 0x06, 0x02, 0x6b, 0x52, 0xfe, 0x62, 0x9f, 0xfe, \n  0x0d, 0x44, 0xff, 0xee, 0x9f, 0x00, 0x41, 0xa5, 0x01, 0x8c, 0xa1, 0x00, 0xd8, 0xf1, 0x00, 0x53, \n  0x64, 0x01, 0xbf, 0x0d, 0x00, 0x57, 0x5e, 0x00, 0xfe, 0x1e, 0x00, 0xb6, 0xfa, 0xff, 0xaf, 0x49, \n  0x00, 0xf9, 0xfe, 0xff, 0xc3, 0x20, 0x00, 0xf4, 0x90, 0x00, 0x2b, 0x0c, 0x00, 0xff, 0x14, 0x00, \n  0xe1, 0x00, 0x00, 0x86, 0x03, 0x00, 0x86, 0xea, 0x0e, 0xca, 0xbc, 0x0e, 0xef, 0x1a, 0x02, 0xb3, \n  0x59, 0x05, 0xfc, 0x5d, 0x01, 0xd4, 0x5d, 0x02, 0xad, 0xb3, 0x01, 0xd6, 0x07, 0xfc, 0x40, 0x6e, \n  0xf8, 0xb5, 0xcf, 0xfb, 0xfe, 0x5f, 0x05, 0x03, 0x66, 0x01, 0x22, 0x44, 0xfd, 0xb3, 0xed, 0xfd, \n  0x6f, 0xc0, 0xfe, 0xa8, 0x3a, 0x00, 0x8b, 0x27, 0x01, 0xdf, 0x29, 0x00, 0xc7, 0xe3, 0x00, 0x62, \n  0x21, 0x01, 0xbf, 0xd7, 0xff, 0xcb, 0xbd, 0x00, 0xb0, 0x37, 0x00, 0xb7, 0xcc, 0xff, 0xf4, 0x20, \n  0x00, 0x9c, 0x1a, 0x00, 0x00, 0xda, 0xff, 0x8a, 0xa1, 0x00, 0x54, 0x28, 0x00, 0x1c, 0xf3, 0xff, \n  0x74, 0x26, 0x00, 0x8e, 0xca, 0xff, 0x5a, 0x46, 0x12, 0x85, 0x5f, 0x10, 0x31, 0x6a, 0x00, 0xdc, \n  0x4e, 0x06, 0x55, 0x12, 0x01, 0x1b, 0x32, 0x02, 0x18, 0xaa, 0x01, 0x7e, 0x98, 0xfa, 0x7a, 0x83, \n  0xf7, 0x14, 0x43, 0xfc, 0x98, 0x59, 0x06, 0xfa, 0x92, 0x00, 0x19, 0x71, 0xfc, 0x38, 0x75, 0xfd, \n  0x78, 0x9c, 0xfe, 0x6c, 0xf5, 0xff, 0xe5, 0xee, 0x00, 0x92, 0xc4, 0xff, 0x2f, 0x8b, 0x00, 0xd7, \n  0x0f, 0x01, 0xff, 0x2d, 0xff, 0x96, 0xac, 0x00, 0xcb, 0x4f, 0x00, 0x24, 0x1f, 0x00, 0x78, 0xde, \n  0xff, 0x84, 0x82, 0xff, 0x95, 0xe8, 0xff, 0x77, 0x95, 0x00, 0x64, 0x3c, 0x00, 0x83, 0x52, 0x00, \n  0x26, 0x4b, 0x00, 0x6c, 0xd5, 0xff, 0xb0, 0xd4, 0x15, 0xa5, 0xcf, 0x12, 0x15, 0x80, 0xfe, 0x1b, \n  0x21, 0x07, 0xcd, 0x22, 0x01, 0x6b, 0xa3, 0x01, 0x79, 0xc1, 0x01, 0x2b, 0xdf, 0xf8, 0xd5, 0x86, \n  0xf6, 0xea, 0xbc, 0xfc, 0x2c, 0x20, 0x07, 0xcb, 0x37, 0x00, 0xce, 0xd3, 0xfb, 0x15, 0x9d, 0xfc, \n  0x3a, 0x92, 0xfe, 0x19, 0x12, 0x00, 0xf6, 0x3c, 0x00, 0x43, 0xda, 0xff, 0xe4, 0x47, 0x00, 0x0b, \n  0x94, 0x00, 0x58, 0x13, 0xff, 0xe7, 0x9f, 0x00, 0x99, 0x05, 0x00, 0x02, 0xb0, 0xff, 0x40, 0x97, \n  0xff, 0x0f, 0x7e, 0xff, 0xbd, 0x9c, 0xff, 0x38, 0x56, 0x00, 0x8a, 0x59, 0x00, 0xad, 0x5d, 0x00, \n  0xcc, 0xdc, 0x00, 0xba, 0x50, 0x00, 0x42, 0x80, 0x18, 0xa2, 0x39, 0x15, 0xb5, 0x47, 0xfd, 0x55, \n  0x3f, 0x07, 0xcb, 0x4b, 0x01, 0xd2, 0x5c, 0x01, 0xc6, 0xd6, 0x01, 0xe6, 0x80, 0xf7, 0x75, 0xc0, \n  0xf5, 0xe4, 0x39, 0xfd, 0xab, 0x44, 0x07, 0x71, 0xda, 0xff, 0x8d, 0xb0, 0xfb, 0x4f, 0x37, 0xfc, \n  0x06, 0x6f, 0xfe, 0x15, 0xf2, 0xff, 0x50, 0x3d, 0x00, 0xa0, 0xad, 0xff, 0x8d, 0x32, 0x00, 0x7a, \n  0xe9, 0x00, 0x62, 0xce, 0xfe, 0xc1, 0x14, 0x00, 0x77, 0x78, 0xff, 0x0b, 0xca, 0xff, 0xc3, 0x46, \n  0xff, 0x6d, 0x2d, 0xff, 0x56, 0xca, 0xff, 0x5e, 0x5c, 0x00, 0x8b, 0x5b, 0x00, 0xe9, 0x69, 0x00, \n  0x3e, 0xce, 0x00, 0x0a, 0xf2, 0xff, 0x20, 0x9e, 0x1a, 0x5e, 0x18, 0x18, 0x29, 0x29, 0xfd, 0xf0, \n  0xf5, 0x06, 0xf3, 0xc9, 0x00, 0x7a, 0xde, 0x00, 0x24, 0x3e, 0x02, 0xff, 0x20, 0xf6, 0x92, 0x69, \n  0xf5, 0xee, 0x1f, 0xfd, 0x81, 0xe5, 0x05, 0x60, 0x1f, 0x00, 0x71, 0x6e, 0xfc, 0x88, 0x4b, 0xfb, \n  0x49, 0xe5, 0xfd, 0xce, 0xa0, 0xff, 0x20, 0x67, 0x00, 0x3f, 0xdb, 0x00, 0x90, 0x84, 0xff, 0x86, \n  0x50, 0x00, 0xb1, 0xdd, 0xfe, 0xf2, 0xe1, 0xff, 0x80, 0xf3, 0xfe, 0xdb, 0x46, 0xff, 0x12, 0xfc, \n  0xfe, 0x7b, 0x0c, 0xff, 0xdc, 0xc9, 0xff, 0x7c, 0x5d, 0x00, 0xc5, 0x95, 0x00, 0xe4, 0x13, 0x00, \n  0x7c, 0x97, 0x00, 0x05, 0xc6, 0xff, 0x63, 0x48, 0x1b, 0xa7, 0xa5, 0x1a, 0xfa, 0x38, 0xfe, 0xbe, \n  0xf0, 0x06, 0xe7, 0xb0, 0x00, 0xcf, 0x77, 0xff, 0x03, 0xe7, 0x02, 0xa0, 0x07, 0xf6, 0x99, 0x9c, \n  0xf5, 0x74, 0xf4, 0xfc, 0x76, 0x86, 0x03, 0x04, 0xfe, 0xff, 0x09, 0xdd, 0xfd, 0x00, 0x9d, 0xfb, \n  0x40, 0xf6, 0xfc, 0xb2, 0x8c, 0xff, 0x82, 0x48, 0x00, 0x8d, 0x7b, 0x01, 0x59, 0xaf, 0xff, 0xb1, \n  0xd8, 0xff, 0x80, 0xc5, 0xfe, 0x16, 0x8e, 0xff, 0xd6, 0x1e, 0xff, 0x9b, 0x47, 0xff, 0x39, 0xdc, \n  0xfe, 0x31, 0x11, 0xff, 0x00, 0x96, 0xff, 0xef, 0xa9, 0xff, 0xc3, 0xa1, 0x00, 0x43, 0x58, 0x00, \n  0x50, 0xac, 0x00, 0x72, 0xa4, 0xff, 0x3e, 0xca, 0x1b, 0x19, 0x5b, 0x1c, 0x84, 0xe6, 0xff, 0x25, \n  0x6e, 0x07, 0x44, 0xe6, 0x00, 0xef, 0xce, 0xfd, 0x75, 0x50, 0x02, 0x54, 0x7c, 0xf6, 0x0b, 0x56, \n  0xf6, 0x6d, 0x48, 0xfd, 0xc6, 0x64, 0x00, 0xb1, 0x6c, 0xff, 0x60, 0x12, 0xff, 0xe7, 0x81, 0xfc, \n  0x02, 0x9a, 0xfd, 0x7c, 0x51, 0xfe, 0x20, 0xa6, 0xff, 0xdd, 0x6d, 0x02, 0x1a, 0xe9, 0xff, 0xdd, \n  0x00, 0xff, 0x37, 0xbe, 0xfe, 0x2d, 0xd2, 0xff, 0x91, 0x65, 0xff, 0x43, 0x3c, 0xff, 0x72, 0x9b, \n  0xfe, 0x5a, 0x0e, 0xff, 0xed, 0x57, 0xff, 0xe4, 0x41, 0xff, 0xed, 0x67, 0x00, 0xbb, 0x24, 0x00, \n  0xe5, 0x81, 0x00, 0xa4, 0xcb, 0xff, 0x44, 0x5a, 0x1c, 0x20, 0x72, 0x1d, 0x4f, 0x89, 0x01, 0xe2, \n  0xe1, 0x08, 0x27, 0x7f, 0x01, 0xa2, 0x5a, 0xfc, 0xc8, 0xed, 0x00, 0x5a, 0x0e, 0xf6, 0xa6, 0x10, \n  0xf7, 0x71, 0x22, 0xff, 0x17, 0x7b, 0xfd, 0x9a, 0xca, 0xfc, 0x46, 0xc0, 0x00, 0x4c, 0x40, 0xfe, \n  0xd3, 0x54, 0xfe, 0xa0, 0xa0, 0xfd, 0xbd, 0x39, 0xfe, 0x24, 0x6a, 0x02, 0xb6, 0x3c, 0x00, 0x87, \n  0x47, 0xff, 0x00, 0x74, 0xff, 0x00, 0x69, 0xff, 0x0a, 0xf4, 0xfe, 0x75, 0x7b, 0xff, 0xcf, 0x68, \n  0xfe, 0x72, 0xd7, 0xfe, 0x59, 0x47, 0xff, 0x8c, 0x78, 0xfe, 0x1e, 0x1b, 0x00, 0x1b, 0x3b, 0x00, \n  0x3e, 0x79, 0x00, 0x71, 0xa2, 0xff, 0x1d, 0x70, 0x1d, 0x40, 0xab, 0x1d, 0x92, 0xe2, 0x01, 0x3a, \n  0xb5, 0x0a, 0x9b, 0x5d, 0x02, 0xa7, 0xaa, 0xfb, 0x53, 0x80, 0xff, 0x00, 0x09, 0xf5, 0x07, 0x36, \n  0xf8, 0x6f, 0x05, 0x01, 0xec, 0x0d, 0xfb, 0xa6, 0xff, 0xfa, 0x11, 0x65, 0x01, 0xb0, 0x65, 0xff, \n  0xda, 0xcc, 0xff, 0xd8, 0x16, 0xfd, 0x60, 0xc8, 0xfc, 0xf0, 0x57, 0x02, 0xa2, 0x06, 0x01, 0x34, \n  0x10, 0xff, 0x75, 0x9e, 0xff, 0x90, 0xdb, 0xff, 0x86, 0xfb, 0xfe, 0x2a, 0x06, 0xff, 0xf2, 0xe6, \n  0xfd, 0x6c, 0xa9, 0xfe, 0xa8, 0x33, 0xff, 0xb3, 0x32, 0xfe, 0x5c, 0xae, 0xff, 0x1d, 0x28, 0x00, \n  0xd3, 0x90, 0x00, 0xf5, 0xc9, 0xff, 0xe6, 0xe9, 0x1f, 0x33, 0xf6, 0x1c, 0xbf, 0xdf, 0x00, 0x5e, \n  0x5a, 0x0d, 0x63, 0xd1, 0x02, 0xa2, 0x11, 0xfb, 0xf8, 0xd6, 0xfd, 0xe6, 0x42, 0xf4, 0x11, 0x5e, \n  0xf9, 0x13, 0x99, 0x03, 0xac, 0xc7, 0xf8, 0x66, 0x79, 0xf7, 0xf4, 0x48, 0x02, 0xe8, 0x1d, 0x00, \n  0xed, 0xcf, 0x01, 0x01, 0x3c, 0xfd, 0x73, 0x3a, 0xfb, 0x7a, 0x70, 0x02, 0x92, 0x81, 0x01, 0x43, \n  0x6e, 0xfe, 0xc9, 0xc2, 0xff, 0x89, 0x2b, 0x00, 0xee, 0x91, 0xfe, 0x1b, 0x14, 0xff, 0x67, 0x03, \n  0xfd, 0x35, 0x48, 0xfe, 0x6b, 0x53, 0xff, 0xfc, 0xe3, 0xfd, 0x1c, 0x53, 0xff, 0x93, 0x20, 0x00, \n  0xc0, 0x34, 0x00, 0xdc, 0x3f, 0xff, 0xf3, 0x1d, 0x23, 0x19, 0xfa, 0x1b, 0x0e, 0xe6, 0xfe, 0xa1, \n  0x05, 0x10, 0xa9, 0x5d, 0x02, 0xd6, 0xf0, 0xfa, 0xc8, 0xce, 0xfd, 0x07, 0xb0, 0xf2, 0x16, 0xc7, \n  0xfa, 0x76, 0x1a, 0x07, 0xf3, 0x46, 0xf7, 0x54, 0x17, 0xf3, 0xf4, 0x73, 0x02, 0x4f, 0x4e, 0x01, \n  0x52, 0x7c, 0x03, 0xe9, 0x2a, 0xfe, 0xeb, 0x08, 0xfa, 0xbe, 0x2e, 0x02, 0xac, 0xf9, 0x01, 0x4e, \n  0xf7, 0xfd, 0x63, 0xdc, 0xff, 0x06, 0x58, 0x00, 0x99, 0xa9, 0xfd, 0xe8, 0x0f, 0xff, 0x96, 0xee, \n  0xfc, 0x70, 0x23, 0xfe, 0x21, 0x68, 0xff, 0x7a, 0xa6, 0xfd, 0xfa, 0x09, 0xff, 0xbe, 0x1e, 0x00, \n  0x8d, 0x0d, 0x00, 0xd5, 0x24, 0xff, 0x39, 0x65, 0x27, 0x1e, 0xc9, 0x1b, 0x04, 0x39, 0xfb, 0x7a, \n  0x5e, 0x11, 0x4b, 0xce, 0x01, 0x96, 0x61, 0xfb, 0x20, 0x4b, 0xfe, 0xfa, 0xb9, 0xf0, 0x14, 0x3b, \n  0xfc, 0x70, 0xd9, 0x0a, 0xf1, 0xb6, 0xf6, 0x12, 0xfb, 0xee, 0x81, 0xa2, 0x01, 0xad, 0xcf, 0x01, \n  0x10, 0x73, 0x04, 0xfe, 0xf0, 0xff, 0xea, 0x87, 0xf9, 0x4c, 0x03, 0x01, 0x77, 0x8c, 0x02, 0x55, \n  0x9e, 0xfd, 0x6c, 0xe5, 0xfe, 0xc3, 0xae, 0x00, 0x73, 0x7d, 0xfd, 0xbf, 0xf0, 0xfe, 0x34, 0x2d, \n  0xfc, 0x06, 0x84, 0xfd, 0xea, 0xf5, 0xff, 0x4e, 0xbe, 0xfd, 0x0f, 0x51, 0xfe, 0x44, 0x35, 0x00, \n  0xc9, 0x2e, 0x00, 0x75, 0x8c, 0xfe, 0xf5, 0x11, 0x2c, 0x2c, 0x48, 0x1e, 0x22, 0xd2, 0xf5, 0xc5, \n  0xc2, 0x0f, 0xbb, 0xac, 0x01, 0xf0, 0xa9, 0xfb, 0xb6, 0x25, 0x01, 0xd3, 0x35, 0xf0, 0xc8, 0x89, \n  0xfa, 0x62, 0x48, 0x0d, 0x51, 0x72, 0xf9, 0x02, 0x96, 0xec, 0xeb, 0x69, 0xff, 0x5d, 0x0e, 0x02, \n  0x80, 0xa6, 0x05, 0x48, 0xcc, 0x00, 0xe9, 0x8e, 0xf8, 0xf6, 0xa8, 0x00, 0x9b, 0x09, 0x03, 0xc3, \n  0x36, 0xfd, 0xd0, 0x6a, 0xfe, 0x8b, 0x59, 0x01, 0x65, 0x1a, 0xfd, 0xb4, 0x9b, 0xfe, 0x58, 0x11, \n  0xfc, 0x8e, 0x2b, 0xfd, 0x16, 0x05, 0x00, 0x49, 0xec, 0xfd, 0x47, 0x43, 0xfe, 0xfa, 0xe3, 0xff, \n  0x56, 0x52, 0x00, 0xae, 0xb8, 0xfe, 0x27, 0x15, 0x31, 0x81, 0x91, 0x21, 0x62, 0x37, 0xef, 0x91, \n  0x2b, 0x0d, 0x8b, 0xaa, 0x00, 0x04, 0xac, 0xfc, 0x68, 0x41, 0x06, 0x35, 0xca, 0xee, 0xcc, 0xa3, \n  0xf7, 0x7a, 0x87, 0x0f, 0x6d, 0x0d, 0xfd, 0x39, 0x48, 0xeb, 0x3c, 0xfc, 0xfc, 0x20, 0x9e, 0x01, \n  0x54, 0xbc, 0x05, 0xdf, 0xea, 0x01, 0xa8, 0xdb, 0xf7, 0x74, 0x1f, 0xff, 0x45, 0x81, 0x03, 0xee, \n  0x0b, 0xfe, 0x41, 0x90, 0xfd, 0xb8, 0x23, 0x01, 0xf3, 0x1a, 0xfd, 0x6b, 0xef, 0xfe, 0xd1, 0x03, \n  0xfc, 0xd4, 0x31, 0xfc, 0xb2, 0x5f, 0x00, 0xf2, 0x28, 0xfe, 0x56, 0xdb, 0xfd, 0xa5, 0xbd, 0xff, \n  0x97, 0xe1, 0x00, 0xa9, 0xed, 0xfe, 0x84, 0x97, 0x37, 0xcd, 0x89, 0x21, 0x27, 0x77, 0xe9, 0xc2, \n  0x0e, 0x0d, 0x03, 0x06, 0xfe, 0xa6, 0xbd, 0xfe, 0xec, 0xf9, 0x08, 0xa5, 0x20, 0xed, 0xe4, 0x25, \n  0xf7, 0xee, 0xcf, 0x11, 0x95, 0x91, 0x00, 0x74, 0xc4, 0xe9, 0xba, 0x1b, 0xfa, 0x89, 0x08, 0x00, \n  0x7f, 0x3e, 0x07, 0x64, 0x90, 0x02, 0x61, 0xd2, 0xf5, 0xb6, 0x0b, 0xfe, 0x5e, 0x80, 0x04, 0x52, \n  0x12, 0xfe, 0x66, 0x57, 0xfc, 0xa1, 0xb7, 0x01, 0x67, 0x22, 0xfd, 0x8d, 0x33, 0xff, 0xd6, 0xfc, \n  0xfb, 0xbb, 0xa8, 0xfb, 0xe5, 0x1e, 0x00, 0xbd, 0x30, 0xfe, 0x03, 0x2b, 0xfe, 0x0c, 0x26, 0x00, \n  0xb7, 0xbb, 0x00, 0x1a, 0x61, 0xfe, 0x83, 0x19, 0x3b, 0x85, 0x1f, 0x22, 0x90, 0x50, 0xe6, 0xdc, \n  0xab, 0x0c, 0x05, 0xaf, 0xfb, 0x6c, 0x3c, 0x00, 0x9c, 0xd6, 0x0a, 0x18, 0xa9, 0xec, 0xd8, 0xef, \n  0xf5, 0x20, 0xa9, 0x12, 0xa6, 0x8a, 0x04, 0x39, 0x57, 0xe8, 0xd0, 0xfc, 0xf7, 0x7a, 0xbf, 0xfe, \n  0xe0, 0xc0, 0x06, 0x65, 0x2a, 0x03, 0xeb, 0x9e, 0xf5, 0x7f, 0xf7, 0xfc, 0x33, 0x1f, 0x04, 0xce, \n  0x2c, 0xfe, 0xbe, 0xb3, 0xfb, 0x44, 0x1d, 0x02, 0xde, 0xdd, 0xfc, 0xc8, 0xab, 0xff, 0x2e, 0x22, \n  0xfc, 0x06, 0xc0, 0xfa, 0x77, 0x13, 0x00, 0x98, 0xdc, 0xfe, 0xbf, 0x66, 0xfe, 0x90, 0xee, 0xff, \n  0x5d, 0x77, 0x00, 0x24, 0x2e, 0xfe, 0x3b, 0x8f, 0x3f, 0x49, 0x2e, 0x22, 0xf5, 0xdf, 0xe3, 0xfd, \n  0x9b, 0x0b, 0x43, 0x79, 0xf8, 0x15, 0x35, 0x03, 0x35, 0x06, 0x0d, 0xa6, 0x0f, 0xec, 0x9f, 0xd6, \n  0xf3, 0x71, 0x3a, 0x13, 0xb0, 0x8f, 0x08, 0xa7, 0xb1, 0xe8, 0x81, 0x89, 0xf6, 0x56, 0xb9, 0xfa, \n  0x83, 0xa0, 0x06, 0xa4, 0x39, 0x05, 0x4c, 0x77, 0xf5, 0x35, 0xd7, 0xfb, 0x14, 0x70, 0x03, 0x17, \n  0xfc, 0xfd, 0x23, 0xb3, 0xfb, 0xed, 0x62, 0x02, 0x42, 0x8f, 0xfc, 0x68, 0xf9, 0xff, 0xb2, 0xc4, \n  0xfb, 0x4d, 0xaa, 0xfa, 0xe2, 0xa4, 0x00, 0x24, 0x65, 0xff, 0xbc, 0x64, 0xfe, 0xfc, 0xd4, 0xff, \n  0x2a, 0x47, 0x00, 0x80, 0x04, 0xfe, 0xa5, 0x04, 0x41, 0xd2, 0x5f, 0x24, 0x58, 0xbd, 0xe2, 0x68, \n  0xbc, 0x09, 0xf3, 0x09, 0xf7, 0x14, 0x5c, 0x04, 0x5d, 0x79, 0x0e, 0x12, 0xb7, 0xec, 0x28, 0x29, \n  0xf1, 0x9e, 0x08, 0x12, 0x7e, 0x04, 0x0d, 0xac, 0xda, 0xe9, 0xdc, 0x7e, 0xf4, 0xbd, 0x72, 0xf7, \n  0xf2, 0x15, 0x06, 0xa0, 0xa5, 0x07, 0x8f, 0xb7, 0xf5, 0x74, 0x9d, 0xfa, 0x3b, 0xb8, 0x02, 0x83, \n  0x14, 0xfe, 0x49, 0xb6, 0xfb, 0x59, 0x75, 0x02, 0xfb, 0xe3, 0xfb, 0x47, 0xca, 0xff, 0xfb, 0x37, \n  0xfc, 0x82, 0xd2, 0xfa, 0xbe, 0xab, 0x00, 0x27, 0xac, 0xff, 0x26, 0x86, 0xfe, 0xf4, 0xd2, 0xff, \n  0xdb, 0x20, 0x00, 0x89, 0xbd, 0xfd, 0xc2, 0x51, 0x43, 0x48, 0xb5, 0x24, 0x8c, 0xbc, 0xe3, 0x90, \n  0x1a, 0x08, 0x9e, 0x61, 0xf5, 0x53, 0x7a, 0x05, 0x81, 0x9a, 0x0e, 0xf3, 0x61, 0xee, 0x42, 0x2f, \n  0xee, 0x3b, 0x26, 0x11, 0x4f, 0x93, 0x10, 0xf1, 0xf5, 0xeb, 0x1d, 0xdb, 0xf2, 0x2d, 0xf1, 0xf3, \n  0x3a, 0xcc, 0x05, 0x5d, 0xa3, 0x09, 0xc9, 0x2a, 0xf7, 0x96, 0x15, 0xf9, 0xdb, 0x7b, 0x02, 0xda, \n  0xee, 0xfd, 0xb7, 0xd1, 0xfb, 0x66, 0x28, 0x02, 0xcb, 0xf7, 0xfa, 0xdb, 0x43, 0x00, 0x11, 0xc9, \n  0xfc, 0x49, 0xdd, 0xfa, 0x53, 0x80, 0x00, 0xf0, 0x0f, 0x00, 0x56, 0x73, 0xfe, 0xf6, 0x37, 0x00, \n  0xdf, 0xb7, 0xff, 0xb9, 0x61, 0xfd, 0xa4, 0x1d, 0x44, 0x54, 0xc3, 0x25, 0xc0, 0xf2, 0xe4, 0x4f, \n  0x44, 0x07, 0xd5, 0x42, 0xf4, 0x25, 0x5e, 0x05, 0x7e, 0x7e, 0x0e, 0x49, 0x8e, 0xef, 0x00, 0xc1, \n  0xeb, 0x50, 0xbb, 0x0f, 0x34, 0xca, 0x12, 0x27, 0x04, 0xef, 0x1b, 0xb3, 0xf1, 0x8d, 0xfe, 0xf0, \n  0x73, 0x7c, 0x05, 0xde, 0x9d, 0x0a, 0x94, 0x79, 0xf9, 0xf1, 0xcb, 0xf7, 0xed, 0xca, 0x01, 0xba, \n  0x66, 0xfe, 0x21, 0x50, 0xfb, 0x7e, 0x94, 0x01, 0xe1, 0xe4, 0xfa, 0x1d, 0xac, 0x00, 0x2a, 0xb4, \n  0xfc, 0x46, 0x65, 0xfb, 0x71, 0xd1, 0xff, 0x94, 0x0d, 0x00, 0x2a, 0xe8, 0xfe, 0x49, 0xf3, 0xff, \n  0x65, 0x6f, 0xff, 0x32, 0x53, 0xfd, 0x7e, 0xca, 0x43, 0x8c, 0x04, 0x27, 0x3e, 0xc9, 0xe6, 0x87, \n  0xe3, 0x06, 0x41, 0x1a, 0xf3, 0x59, 0x31, 0x05, 0x15, 0xdf, 0x0d, 0xd4, 0x4b, 0xf0, 0x4a, 0xe6, \n  0xe9, 0x1a, 0x55, 0x0d, 0xf4, 0x8b, 0x14, 0xc2, 0xae, 0xf2, 0xa8, 0x8e, 0xf1, 0x87, 0xb6, 0xed, \n  0x57, 0x9d, 0x04, 0x8f, 0x9b, 0x0b, 0x41, 0x18, 0xfc, 0x2d, 0xc7, 0xf6, 0xf8, 0x89, 0x00, 0xdb, \n  0x46, 0xff, 0x41, 0x63, 0xfa, 0x3e, 0x5d, 0x01, 0xb3, 0x3a, 0xfb, 0xce, 0xc6, 0x00, 0xdc, 0xd4, \n  0xfc, 0x6e, 0x71, 0xfb, 0x34, 0x1d, 0xff, 0x3b, 0x31, 0x00, 0x3e, 0x06, 0xff, 0xd5, 0x41, 0xff, \n  0x8e, 0xc2, 0xff, 0x36, 0x48, 0xfd, 0x19, 0x0b, 0x42, 0x34, 0x56, 0x29, 0x47, 0xee, 0xe9, 0x6e, \n  0x6e, 0x07, 0xe6, 0xba, 0xf1, 0x0a, 0x6d, 0x04, 0x29, 0x72, 0x0d, 0x9c, 0x69, 0xf0, 0xa8, 0x8d, \n  0xe8, 0x56, 0x0b, 0x0a, 0x45, 0xea, 0x15, 0xa5, 0x32, 0xf7, 0xfc, 0xe2, 0xf3, 0xc0, 0x99, 0xe9, \n  0x86, 0x90, 0x02, 0xef, 0x39, 0x0d, 0xdf, 0xd7, 0xfe, 0x87, 0xff, 0xf6, 0xaa, 0x58, 0xfe, 0x75, \n  0x44, 0x00, 0xcb, 0x0a, 0xfa, 0x3e, 0x42, 0x01, 0xe0, 0xda, 0xfb, 0x47, 0x58, 0x01, 0x9a, 0x76, \n  0xfc, 0xf9, 0x01, 0xfb, 0x39, 0x40, 0xff, 0x3e, 0x80, 0xff, 0x17, 0x5f, 0xff, 0x50, 0x9a, 0xfe, \n  0x5d, 0x34, 0x00, 0xa2, 0x7b, 0xfd, 0x87, 0x19, 0x41, 0x62, 0x9b, 0x28, 0xf4, 0x46, 0xee, 0xe6, \n  0xe8, 0x07, 0x44, 0x00, 0xf1, 0xb4, 0x68, 0x04, 0x8c, 0xc1, 0x0b, 0x1c, 0x09, 0xf1, 0x2e, 0xe6, \n  0xe6, 0xa4, 0x13, 0x08, 0xc7, 0x3c, 0x15, 0xe7, 0x81, 0xfa, 0xac, 0x53, 0xf7, 0xf6, 0xf5, 0xe6, \n  0xba, 0x71, 0x00, 0x7f, 0xde, 0x0d, 0x8f, 0x64, 0x00, 0x7a, 0xdb, 0xf7, 0x93, 0xfc, 0xfc, 0xf7, \n  0x54, 0x00, 0x53, 0xda, 0xfa, 0x68, 0xc1, 0x00, 0x98, 0x6f, 0xfc, 0xc5, 0x63, 0x01, 0xbc, 0x3f, \n  0xfc, 0xd3, 0x0c, 0xfb, 0x49, 0xb2, 0xfe, 0xa8, 0x07, 0xff, 0x99, 0xa8, 0xff, 0xbe, 0x56, 0xfe, \n  0xd7, 0x4d, 0x00, 0xbd, 0x5e, 0xfe, 0xfc, 0xa1, 0x3e, 0xee, 0x26, 0x29, 0x6b, 0x54, 0xf3, 0xc2, \n  0xad, 0x07, 0x44, 0x6a, 0xf1, 0x67, 0x27, 0x03, 0x44, 0x4a, 0x0a, 0xa2, 0x57, 0xf3, 0xce, 0x18, \n  0xe4, 0x99, 0x3f, 0x05, 0xa6, 0x5e, 0x14, 0x75, 0x4b, 0xfd, 0x71, 0xe4, 0xfc, 0x8a, 0xd0, 0xe4, \n  0x1f, 0x35, 0xfc, 0x00, 0x18, 0x0f, 0x90, 0x2d, 0x01, 0x58, 0x8a, 0xf9, 0x0c, 0xc3, 0xfc, 0xa2, \n  0x8c, 0xff, 0x98, 0x8c, 0xfc, 0xff, 0x28, 0x00, 0xf7, 0xc4, 0xfb, 0xf9, 0x52, 0x02, 0xea, 0x6a, \n  0xfc, 0x69, 0x19, 0xfa, 0x0e, 0xd5, 0xfe, 0x6c, 0x12, 0xfe, 0x30, 0xf8, 0xff, 0x3f, 0x33, 0xff, \n  0x85, 0x67, 0x00, 0x41, 0xf5, 0xfe, 0x09, 0x2e, 0x3c, 0xaa, 0x36, 0x29, 0x55, 0xc2, 0xf6, 0xd7, \n  0xa0, 0x06, 0x9d, 0xe7, 0xf3, 0xb3, 0x89, 0x02, 0x49, 0x8b, 0x07, 0x4f, 0x6e, 0xf5, 0x9f, 0x6d, \n  0xe2, 0x62, 0x02, 0x03, 0xf0, 0x44, 0x13, 0xb1, 0x03, 0xfe, 0xe8, 0x6b, 0x01, 0x62, 0x30, 0xe5, \n  0xb2, 0x42, 0xf7, 0x74, 0x2c, 0x0f, 0xe0, 0xc7, 0x01, 0xfd, 0xfe, 0xfa, 0xaa, 0x9d, 0xfd, 0x67, \n  0x95, 0xfe, 0xe1, 0x1d, 0xfd, 0xec, 0x39, 0x00, 0x7e, 0x81, 0xfb, 0x71, 0x16, 0x02, 0xa8, 0x38, \n  0xfc, 0xfe, 0xa6, 0xf9, 0xac, 0x2a, 0xff, 0x83, 0x78, 0xfd, 0x04, 0x7b, 0x00, 0x38, 0xda, 0xff, \n  0xed, 0x48, 0x00, 0x84, 0x84, 0xff, 0x99, 0xde, 0x39, 0x77, 0x5b, 0x26, 0x4d, 0x16, 0xfc, 0x2a, \n  0xe2, 0x07, 0x3f, 0x1b, 0xf4, 0x2d, 0x46, 0x02, 0x97, 0xf3, 0x04, 0x0c, 0xc5, 0xf7, 0x28, 0x03, \n  0xe2, 0x97, 0xef, 0xfe, 0x16, 0xa7, 0x12, 0x23, 0xf3, 0xfe, 0xb0, 0x62, 0x05, 0xcb, 0xfc, 0xe6, \n  0xd9, 0xf0, 0xf0, 0x1b, 0x7c, 0x0e, 0x7a, 0x24, 0x03, 0xd4, 0x8b, 0xfc, 0xb1, 0xc1, 0xfe, 0x49, \n  0xf0, 0xfd, 0x33, 0xe7, 0xfd, 0x85, 0xf4, 0xff, 0x65, 0x07, 0xfb, 0xbf, 0xb8, 0x01, 0xab, 0x47, \n  0xfc, 0xd7, 0xd8, 0xf8, 0x8a, 0x90, 0xff, 0x44, 0xf2, 0xfd, 0xce, 0x54, 0x00, 0x7c, 0xd6, 0x00, \n  0xe7, 0x96, 0x00, 0x49, 0x27, 0xff, 0x83, 0x6d, 0x36, 0x5a, 0x2c, 0x25, 0xb9, 0x22, 0xfe, 0x73, \n  0x50, 0x0b, 0xdd, 0x74, 0xf3, 0x40, 0x1c, 0x01, 0xa3, 0x3c, 0x05, 0xbe, 0x72, 0xf7, 0x7e, 0xca, \n  0xe3, 0x90, 0xb1, 0xfa, 0x2f, 0x5e, 0x12, 0xed, 0x7d, 0xff, 0xc7, 0x9f, 0x06, 0x00, 0xd6, 0xea, \n  0x10, 0xe8, 0xea, 0x9e, 0xa6, 0x0c, 0x9f, 0xb0, 0x05, 0xf0, 0x30, 0xfd, 0x31, 0xce, 0xfe, 0x1c, \n  0x41, 0xfe, 0x16, 0x3c, 0xfe, 0x3e, 0x3a, 0x00, 0x64, 0x90, 0xfa, 0xee, 0x7f, 0xff, 0x1f, 0xbd, \n  0xfd, 0x44, 0x4c, 0xf9, 0xf8, 0x07, 0xff, 0x3a, 0x10, 0xfe, 0x2f, 0xa0, 0x00, 0xfc, 0x81, 0x01, \n  0xb3, 0xe0, 0xff, 0xc9, 0x32, 0xff, 0xb1, 0x0d, 0x34, 0xd6, 0x42, 0x25, 0x40, 0x47, 0xfd, 0xa2, \n  0xa1, 0x0c, 0xe0, 0x58, 0xf6, 0x4b, 0xc2, 0xfe, 0xce, 0x07, 0x06, 0x61, 0x7a, 0xf7, 0xef, 0xbd, \n  0xe5, 0x0d, 0x86, 0xf8, 0x31, 0xd9, 0x12, 0x27, 0x43, 0xfe, 0x1b, 0x92, 0x04, 0x61, 0x2d, 0xf2, \n  0x46, 0xd1, 0xe6, 0x08, 0x84, 0x08, 0x73, 0xc4, 0x07, 0x36, 0x70, 0xfe, 0xbb, 0xdf, 0xff, 0x68, \n  0x9d, 0xfd, 0x0b, 0x32, 0xfe, 0x1b, 0x08, 0x01, 0xc2, 0x13, 0xfa, 0xf2, 0xa1, 0xfd, 0x34, 0x9b, \n  0xff, 0xf8, 0x6b, 0xf9, 0xf4, 0xde, 0xfe, 0xbe, 0x6e, 0xff, 0x03, 0xbb, 0xff, 0xe5, 0x4d, 0x01, \n  0xd3, 0x15, 0x00, 0x92, 0x45, 0xff, 0x78, 0x7d, 0x32, 0xe9, 0x0d, 0x24, 0xf7, 0xe2, 0xfb, 0x8e, \n  0x50, 0x0e, 0x85, 0xa0, 0xf8, 0xd5, 0x29, 0xfb, 0x5a, 0x84, 0x05, 0x35, 0x15, 0xfa, 0x5a, 0xe3, \n  0xe9, 0xcc, 0xfe, 0xf5, 0x8d, 0x9e, 0x10, 0xc7, 0xb7, 0xfe, 0x0e, 0xfc, 0x00, 0x42, 0x10, 0xf9, \n  0x48, 0xb4, 0xe6, 0xba, 0x67, 0x01, 0x52, 0x78, 0x09, 0x12, 0x53, 0xff, 0xfb, 0xb4, 0x00, 0xff, \n  0xfa, 0xfe, 0xe5, 0x7d, 0xfd, 0x68, 0x7b, 0xff, 0x52, 0x4c, 0xfa, 0xf7, 0xbb, 0xfd, 0x07, 0x47, \n  0x00, 0x7d, 0x75, 0xfa, 0xaf, 0xb9, 0xfe, 0x7d, 0xe7, 0xff, 0xe6, 0xf6, 0xfe, 0xf9, 0x5c, 0x01, \n  0x1d, 0xfc, 0xff, 0xb8, 0xf4, 0xfe, 0x47, 0x2d, 0x30, 0x58, 0x13, 0x24, 0xda, 0x0d, 0xfa, 0x7f, \n  0x63, 0x0e, 0xfc, 0xae, 0xfb, 0x0c, 0x1d, 0xfc, 0xf3, 0x94, 0x01, 0x21, 0xec, 0xf9, 0x73, 0x9a, \n  0xf1, 0x97, 0xd0, 0xf2, 0x74, 0x9e, 0x0f, 0xa1, 0x2b, 0x00, 0x39, 0x5f, 0xfb, 0xc4, 0x37, 0xff, \n  0xac, 0x49, 0xe9, 0x0c, 0xc6, 0xfa, 0xbd, 0xf9, 0x09, 0x87, 0x16, 0x00, 0x2a, 0xe7, 0xff, 0x23, \n  0x5a, 0x01, 0xac, 0x9d, 0xfd, 0x19, 0xf1, 0xfc, 0xde, 0x77, 0xfb, 0x7e, 0x92, 0xfd, 0x35, 0x6f, \n  0x01, 0x69, 0x3c, 0xfc, 0x53, 0xe0, 0xfc, 0xc8, 0x24, 0x00, 0x01, 0x52, 0xff, 0xe3, 0xdf, 0x00, \n  0x11, 0x08, 0x00, 0xd8, 0x2c, 0xff, 0xe5, 0x29, 0x2d, 0xa1, 0x10, 0x22, 0xab, 0xf7, 0xf9, 0xf3, \n  0x94, 0x0f, 0x4c, 0x1e, 0xfe, 0xbd, 0x06, 0xfc, 0x53, 0x79, 0x00, 0x28, 0x40, 0xf8, 0x93, 0xd6, \n  0xf6, 0xdb, 0xb1, 0xf3, 0x01, 0x09, 0x0c, 0x55, 0x29, 0x03, 0xcb, 0x1a, 0xf8, 0x8a, 0xfa, 0x01, \n  0x90, 0x46, 0xee, 0xb4, 0x7d, 0xf4, 0x26, 0x5d, 0x09, 0x18, 0xfe, 0x00, 0x58, 0x38, 0xfe, 0x39, \n  0xbb, 0x02, 0x23, 0xde, 0xfe, 0x82, 0xda, 0xfb, 0xd9, 0x63, 0xfb, 0x6e, 0x5c, 0xfe, 0x8c, 0x43, \n  0x02, 0x73, 0x99, 0xfd, 0x6e, 0x34, 0xfb, 0x09, 0x1b, 0x00, 0xa3, 0x03, 0x00, 0x09, 0x5a, 0x00, \n  0xfd, 0x46, 0x00, 0x23, 0x65, 0xff, 0xaf, 0xb2, 0x2a, 0xd5, 0xd4, 0x1e, 0x39, 0x16, 0xfb, 0x70, \n  0x10, 0x11, 0x6f, 0xad, 0xfe, 0xbf, 0x2a, 0xfb, 0xbd, 0xa2, 0x00, 0x52, 0x9c, 0xfa, 0xdf, 0x05, \n  0xf6, 0x8f, 0x1b, 0xf4, 0xff, 0x0b, 0x0c, 0xfc, 0xa2, 0x03, 0x2e, 0xc9, 0xf7, 0x4c, 0xea, 0x01, \n  0xbe, 0xee, 0xf2, 0x70, 0x4c, 0xf2, 0x53, 0x98, 0x06, 0x35, 0xf6, 0x01, 0x19, 0x4e, 0xfd, 0xa2, \n  0xe7, 0x01, 0x82, 0x32, 0xff, 0xb8, 0x43, 0xfd, 0xc8, 0xed, 0xfb, 0xd5, 0xb2, 0xfd, 0x5f, 0x87, \n  0x02, 0xea, 0x47, 0xfe, 0xc7, 0xa6, 0xfa, 0x32, 0x5c, 0x00, 0x1c, 0x51, 0x00, 0xc0, 0xf0, 0xff, \n  0x6f, 0xa8, 0x00, 0x7e, 0x27, 0xff, 0xee, 0x92, 0x26, 0xd1, 0xf5, 0x1b, 0x76, 0xba, 0xfc, 0x10, \n  0xfc, 0x11, 0xe8, 0x37, 0xff, 0x57, 0x53, 0xfa, 0xb4, 0xdf, 0x01, 0x5c, 0x12, 0xfd, 0xc7, 0x95, \n  0xf6, 0x03, 0xf7, 0xf1, 0x19, 0xa5, 0x0a, 0xf6, 0xfd, 0x06, 0x25, 0x83, 0xf6, 0xe5, 0x0e, 0x02, \n  0xbf, 0xc1, 0xf7, 0xe6, 0xad, 0xf0, 0x52, 0x55, 0x05, 0x02, 0x62, 0x02, 0x11, 0x61, 0xfb, 0x35, \n  0xc3, 0x00, 0xdf, 0x2e, 0xff, 0x16, 0x19, 0xfe, 0x4b, 0x4c, 0xfe, 0x8a, 0x1b, 0xfd, 0xc9, 0x6b, \n  0x00, 0x69, 0x77, 0xff, 0x03, 0xc2, 0xfb, 0x8b, 0xb8, 0x00, 0x60, 0x0b, 0x00, 0x7e, 0xab, 0xff, \n  0x45, 0x05, 0x01, 0xb1, 0xb6, 0xfe, 0x42, 0xf6, 0x21, 0x23, 0x28, 0x19, 0x1f, 0x6c, 0xff, 0x90, \n  0xe7, 0x12, 0x10, 0x39, 0xff, 0x18, 0xb6, 0xf9, 0x32, 0x31, 0x03, 0x6c, 0x6b, 0xff, 0x23, 0x21, \n  0xf7, 0x99, 0xcb, 0xf1, 0x26, 0xc7, 0x06, 0xa5, 0xa5, 0x07, 0x3d, 0xdf, 0xf9, 0xa6, 0x1a, 0x01, \n  0xa2, 0xbf, 0xf9, 0x35, 0xe2, 0xf1, 0x7f, 0xd7, 0x03, 0x1a, 0xa0, 0x02, 0xdb, 0x01, 0xfb, 0x4a, \n  0xde, 0xff, 0x07, 0x5a, 0xfe, 0x59, 0x11, 0xfe, 0x14, 0xc0, 0xff, 0x1b, 0x78, 0xfd, 0xd8, 0x37, \n  0xff, 0xf1, 0xa8, 0xff, 0x81, 0xfa, 0xfc, 0x6a, 0xf4, 0x00, 0x36, 0x71, 0x00, 0x75, 0x66, 0xff, \n  0x83, 0x68, 0x00, 0x41, 0x03, 0xff, 0x1f, 0xa2, 0x22, 0xa1, 0x3d, 0x16, 0x79, 0x9e, 0xff, 0xa0, \n  0x1f, 0x17, 0x10, 0xad, 0xf9, 0x64, 0xc9, 0xf6, 0xf5, 0xd4, 0x03, 0x3c, 0x0b, 0xfc, 0xce, 0xd4, \n  0xf1, 0x7b, 0xa4, 0xf4, 0x51, 0x29, 0x11, 0x76, 0x8f, 0x04, 0xcb, 0xf3, 0xfa, 0x74, 0xd3, 0x09, \n  0x0b, 0xf9, 0xfa, 0xd2, 0x80, 0xf3, 0xa0, 0x11, 0x05, 0xd8, 0x55, 0x00, 0x1c, 0x3a, 0xf9, 0xf3, \n  0x17, 0xfd, 0x94, 0x1a, 0xfb, 0x56, 0x57, 0xfe, 0x49, 0x14, 0xfe, 0x84, 0xc3, 0xfb, 0x90, 0x99, \n  0xff, 0x81, 0x08, 0xfe, 0x35, 0xac, 0xfd, 0x20, 0x6d, 0x01, 0x92, 0x9a, 0xff, 0xd7, 0xa5, 0xfe, \n  0x61, 0xd7, 0x00, 0x03, 0xee, 0xff, 0x7f, 0xe6, 0x1c, 0xcf, 0xe4, 0x15, 0x98, 0x4c, 0x02, 0x49, \n  0x84, 0x14, 0xe1, 0xae, 0xfd, 0xf5, 0x2b, 0xf5, 0xd3, 0x52, 0x00, 0x93, 0x71, 0xfc, 0xb3, 0x93, \n  0xf5, 0x01, 0x52, 0xf8, 0xdd, 0xbd, 0x0b, 0xeb, 0x9d, 0x05, 0x32, 0xa6, 0xfd, 0x08, 0x49, 0x06, \n  0x24, 0x91, 0xfc, 0xc9, 0x78, 0xf4, 0x74, 0x64, 0x00, 0x3c, 0x36, 0x00, 0x06, 0x99, 0xfb, 0x8b, \n  0x26, 0xff, 0x74, 0xcb, 0xfb, 0x3c, 0x62, 0xfe, 0xb3, 0x23, 0x00, 0x03, 0x2a, 0xfb, 0x7d, 0xc3, \n  0xff, 0x6c, 0x1d, 0xff, 0xa8, 0xf2, 0xfb, 0x6b, 0xf6, 0xff, 0xf6, 0xe4, 0xff, 0xab, 0x46, 0xff, \n  0x9b, 0x26, 0x00, 0x27, 0xce, 0xff, 0x51, 0x94, 0x18, 0xe3, 0xcf, 0x13, 0x06, 0x07, 0x04, 0x4c, \n  0xb6, 0x12, 0xf7, 0xf9, 0xfe, 0x95, 0xcc, 0xf7, 0x5a, 0x75, 0x00, 0x93, 0x58, 0xfc, 0x2b, 0x3a, \n  0xf8, 0x16, 0xcd, 0xf9, 0xc9, 0x46, 0x08, 0x45, 0x0b, 0x05, 0xfb, 0xf0, 0xfd, 0xe0, 0xb6, 0x04, \n  0x7f, 0x8f, 0xfd, 0xb3, 0x21, 0xf6, 0xa5, 0xb6, 0xff, 0x87, 0xb1, 0xff, 0x97, 0xb9, 0xfc, 0xb8, \n  0xc6, 0xff, 0xa0, 0xd3, 0xfc, 0xb8, 0x38, 0xff, 0x28, 0x02, 0x00, 0x2a, 0xe4, 0xfb, 0x48, 0xdb, \n  0xff, 0xd9, 0x00, 0xff, 0x51, 0x35, 0xfc, 0xa7, 0x4a, 0xff, 0x40, 0x5b, 0xff, 0x4f, 0x47, 0xff, \n  0x96, 0x06, 0x00, 0x4f, 0x93, 0xff, 0x8f, 0x52, 0x14, 0xeb, 0xd3, 0x11, 0xc4, 0xbb, 0x05, 0x44, \n  0x9b, 0x10, 0x00, 0x2d, 0x00, 0x37, 0x58, 0xfa, 0x25, 0x58, 0x00, 0x3a, 0x12, 0xfd, 0x18, 0x8d, \n  0xfa, 0x58, 0x98, 0xfa, 0xdf, 0xcc, 0x05, 0x1e, 0xe0, 0x03, 0x43, 0x26, 0xfe, 0x1e, 0x8b, 0x03, \n  0x0e, 0x2e, 0xfe, 0x0b, 0x03, 0xf8, 0x6a, 0xab, 0xfe, 0xc8, 0xaf, 0xff, 0x20, 0x6d, 0xfd, 0x43, \n  0x9e, 0xff, 0x61, 0xaf, 0xfe, 0x2e, 0x7d, 0x00, 0xc5, 0x18, 0x00, 0x67, 0x93, 0xfc, 0x76, 0x81, \n  0xff, 0xe7, 0x9b, 0xfe, 0xdc, 0xa3, 0xfc, 0xa6, 0xa9, 0xfe, 0xed, 0x8d, 0xfe, 0x89, 0xd6, 0xfe, \n  0xa1, 0x06, 0x00, 0xe7, 0xf9, 0xff, 0xcb, 0xdd, 0x10, 0xda, 0x48, 0x10, 0x61, 0x9f, 0x06, 0x9d, \n  0x6c, 0x0e, 0xb6, 0xae, 0x01, 0xea, 0xf6, 0xfb, 0x94, 0x2f, 0x00, 0xc0, 0xd2, 0xfe, 0xb5, 0x00, \n  0xfc, 0x70, 0x17, 0xfb, 0x15, 0x16, 0x04, 0xaf, 0xc4, 0x02, 0x0d, 0x4d, 0xfe, 0xb9, 0x87, 0x02, \n  0x72, 0x14, 0xff, 0x21, 0x33, 0xf9, 0x4b, 0x0a, 0xfe, 0x1c, 0xfd, 0xff, 0x82, 0xe9, 0xfd, 0x83, \n  0x61, 0x00, 0x22, 0x78, 0x00, 0xc8, 0x02, 0x01, 0x6c, 0xd5, 0xff, 0x55, 0x2a, 0xfd, 0x28, 0x06, \n  0xff, 0xb0, 0x50, 0xfe, 0x60, 0x08, 0xfd, 0x0c, 0x1a, 0xfe, 0x2c, 0x5d, 0xfe, 0xb9, 0xd3, 0xfe, \n  0x64, 0xe2, 0xff, 0xb8, 0x00, 0x00, 0xa5, 0x12, 0x0e, 0xe8, 0x1a, 0x0f, 0x29, 0x8b, 0x06, 0x07, \n  0x75, 0x0c, 0xcb, 0x05, 0x03, 0x67, 0xd6, 0xfc, 0xd1, 0xc9, 0x00, 0xc8, 0x2a, 0x00, 0x82, 0xd4, \n  0xfc, 0xfa, 0xd7, 0xfb, 0x03, 0x63, 0x02, 0x86, 0xbc, 0x01, 0x79, 0x84, 0xfe, 0x64, 0xe8, 0x01, \n  0xa3, 0x7a, 0xff, 0x3e, 0x40, 0xfa, 0x0d, 0xf6, 0xfd, 0xa9, 0x3f, 0x00, 0xcb, 0x57, 0xff, 0x96, \n  0x4f, 0x01, 0x19, 0xb3, 0x00, 0xc5, 0x83, 0x00, 0x92, 0xdb, 0xff, 0xc8, 0x9a, 0xfd, 0x8f, 0x97, \n  0xfe, 0x35, 0x2a, 0xfe, 0xb1, 0x3f, 0xfd, 0x0e, 0x72, 0xfe, 0x1d, 0x79, 0xfe, 0x9b, 0xc5, 0xfe, \n  0x0c, 0xaa, 0xff, 0x59, 0xbd, 0xff, 0xa8, 0x60, 0x0c, 0xc2, 0xe7, 0x0d, 0x59, 0x06, 0x06, 0x8b, \n  0xd2, 0x0a, 0xed, 0x3f, 0x03, 0x26, 0xcd, 0xfd, 0xaa, 0x90, 0x01, 0xf7, 0x79, 0x00, 0xf1, 0x95, \n  0xfd, 0xfe, 0x71, 0xfc, 0x3f, 0xc0, 0x00, 0x1f, 0xe9, 0x00, 0x86, 0xe4, 0xfe, 0x79, 0xad, 0x01, \n  0x0e, 0x7c, 0xff, 0x68, 0x20, 0xfb, 0xd8, 0xa4, 0xfe, 0xcf, 0xcc, 0x00, 0xd5, 0x5e, 0x00, 0x5a, \n  0x79, 0x01, 0xe0, 0x1c, 0x00, 0xec, 0x02, 0x00, 0xa8, 0x9c, 0xff, 0xa8, 0x9f, 0xfd, 0x9b, 0x72, \n  0xfe, 0x2c, 0xbf, 0xfe, 0x1b, 0xff, 0xfd, 0xe8, 0x3d, 0xfe, 0xd2, 0x52, 0xfe, 0x89, 0xe5, 0xfe, \n  0x0f, 0xab, 0xff, 0x50, 0xcd, 0xff, 0x79, 0x69, 0x0b, 0x80, 0x3e, 0x0c, 0xe4, 0xb1, 0x05, 0xf9, \n  0x9d, 0x09, 0xad, 0x0a, 0x03, 0x60, 0x5f, 0xff, 0xeb, 0x1c, 0x02, 0xf0, 0xa9, 0x00, 0xf7, 0x60, \n  0xfe, 0x51, 0xdd, 0xfc, 0xbc, 0xb8, 0xff, 0x08, 0x9e, 0x00, 0xef, 0x98, 0xff, 0x1f, 0xae, 0x01, \n  0x33, 0x15, 0x00, 0x44, 0x4a, 0xfc, 0x3d, 0x22, 0xff, 0x5e, 0x63, 0x01, 0xaf, 0x08, 0x01, 0x67, \n  0xf9, 0x00, 0xf5, 0xa0, 0xff, 0xf0, 0xe3, 0xff, 0x07, 0x51, 0xff, 0xe6, 0x47, 0xfe, 0xaa, 0x77, \n  0xff, 0x5d, 0x2b, 0xff, 0xf0, 0xf9, 0xfd, 0x16, 0x40, 0xfe, 0xcc, 0xb9, 0xfe, 0xd8, 0x3f, 0xff, \n  0xb5, 0xe7, 0xff, 0xb5, 0x1a, 0x00, 0x2d, 0x4f, 0x0a, 0x31, 0xf0, 0x0a, 0x94, 0x4e, 0x05, 0x74, \n  0x2c, 0x08, 0x4d, 0x3b, 0x03, 0x9e, 0xa8, 0x00, 0xef, 0x25, 0x02, 0x0e, 0xd3, 0x00, 0x87, 0xf1, \n  0xfe, 0xf6, 0x07, 0xfd, 0x7b, 0x2e, 0xff, 0x73, 0x72, 0x00, 0xc7, 0xc4, 0x00, 0xc4, 0x6b, 0x02, \n  0xe0, 0x1e, 0x00, 0x33, 0xd3, 0xfc, 0x3f, 0x68, 0xff, 0x98, 0xe4, 0x01, 0xfc, 0x2b, 0x01, 0x6b, \n  0x24, 0x00, 0xcb, 0x35, 0xff, 0x6e, 0x24, 0x00, 0xa6, 0x09, 0x00, 0x36, 0xef, 0xfe, 0xb5, 0x7e, \n  0xff, 0x7b, 0x3f, 0xff, 0xb1, 0x37, 0xfe, 0x7f, 0x6f, 0xfe, 0xa6, 0x44, 0xff, 0x72, 0xce, 0xff, \n  0x43, 0x4d, 0x00, 0x73, 0x34, 0x00, 0x33, 0xa5, 0x08, 0x0f, 0x51, 0x0a, 0x7a, 0xd1, 0x04, 0xb5, \n  0x5c, 0x06, 0xed, 0xee, 0x03, 0xc9, 0xc4, 0x01, 0x50, 0x03, 0x02, 0x39, 0xbb, 0x00, 0x6b, 0x3e, \n  0xff, 0x4b, 0x3c, 0xfd, 0xcf, 0x85, 0xff, 0x37, 0xd9, 0x01, 0x6e, 0x4b, 0x01, 0xf2, 0xc7, 0x01, \n  0xe5, 0x2f, 0x00, 0x99, 0x7a, 0xfd, 0x16, 0x95, 0xff, 0xa2, 0xf9, 0x01, 0x8a, 0xca, 0x00, 0xc7, \n  0xac, 0xff, 0x34, 0xe0, 0xff, 0x1d, 0x69, 0x00, 0x26, 0x3d, 0x00, 0x14, 0x4a, 0xff, 0xf9, 0x29, \n  0xff, 0x99, 0x49, 0xff, 0x48, 0xe1, 0xfe, 0xb1, 0x20, 0xff, 0x83, 0xd6, 0xff, 0xe1, 0x43, 0x00, \n  0xd8, 0xd5, 0xff, 0x56, 0x2d, 0xff, 0xde, 0x52, 0x06, 0x9d, 0xc7, 0x08, 0xff, 0x20, 0x05, 0xac, \n  0xd1, 0x05, 0x79, 0x78, 0x04, 0x86, 0xea, 0x01, 0xfc, 0xaf, 0x01, 0x3e, 0x00, 0x01, 0x08, 0x5d, \n  0x00, 0xe4, 0x3e, 0xff, 0x8e, 0x9d, 0xff, 0x89, 0xaf, 0x01, 0x2a, 0xd1, 0x01, 0x6c, 0x18, 0x01, \n  0x6a, 0x44, 0x00, 0xcd, 0x7e, 0xfe, 0xbb, 0x54, 0xff, 0x66, 0xa3, 0x01, 0x8b, 0x1d, 0x01, 0xe6, \n  0xe4, 0xff, 0xd7, 0x14, 0x00, 0xf6, 0x78, 0x00, 0x77, 0x24, 0x00, 0xb9, 0x62, 0xff, 0x8f, 0xa4, \n  0xff, 0x5f, 0xdd, 0xff, 0x4d, 0x73, 0xff, 0x86, 0xcf, 0xff, 0x58, 0xec, 0xff, 0xb3, 0x6d, 0xff, \n  0xfb, 0x24, 0xff, 0x2e, 0x21, 0xff, 0x4e, 0xf7, 0x04, 0xfe, 0x28, 0x08, 0xf3, 0x25, 0x05, 0x56, \n  0xc1, 0x03, 0xaa, 0xc8, 0x03, 0xf5, 0x66, 0x03, 0xa2, 0x59, 0x02, 0x25, 0x4c, 0x01, 0x1a, 0x0f, \n  0x01, 0x32, 0xc5, 0x00, 0x79, 0x9d, 0x00, 0xdd, 0x3e, 0x01, 0x9b, 0x3e, 0x01, 0xf3, 0x59, 0x00, \n  0xdd, 0x3b, 0x00, 0x42, 0x67, 0xff, 0x82, 0xb2, 0xff, 0x4d, 0x6e, 0x01, 0xe7, 0x1a, 0x01, 0x57, \n  0x19, 0x00, 0x12, 0xec, 0xff, 0xeb, 0x44, 0x00, 0x9a, 0x61, 0x00, 0xb8, 0x32, 0x00, 0x55, 0x0d, \n  0x00, 0xaf, 0x27, 0x00, 0x48, 0x0d, 0x00, 0xa4, 0x47, 0xff, 0x06, 0x06, 0xff, 0x94, 0x2c, 0xff, \n  0xf7, 0x57, 0xff, 0xd4, 0x75, 0xff, 0x8b, 0x38, 0x04, 0xa9, 0x4f, 0x06, 0x10, 0x4f, 0x04, 0x31, \n  0xa2, 0x03, 0x77, 0x2d, 0x04, 0x1f, 0xcc, 0x03, 0xb9, 0x44, 0x03, 0x9d, 0xb1, 0x02, 0x11, 0x89, \n  0x01, 0x60, 0x23, 0x01, 0x80, 0xcd, 0x00, 0xcd, 0x8a, 0x00, 0x56, 0xc6, 0x00, 0xc5, 0x63, 0x00, \n  0xa6, 0xa4, 0xff, 0x03, 0x06, 0x00, 0xb9, 0xd4, 0x00, 0x4d, 0xe9, 0x00, 0xa5, 0x92, 0x00, 0x83, \n  0x0a, 0x00, 0xbd, 0x0b, 0x00, 0xf3, 0xbe, 0x00, 0x9e, 0x02, 0x01, 0x95, 0x8e, 0x00, 0x6b, 0x42, \n  0x00, 0x53, 0xba, 0xff, 0xe4, 0x20, 0xff, 0xa7, 0x1c, 0xff, 0x34, 0x30, 0xff, 0xaf, 0x3f, 0xff, \n  0x86, 0x82, 0xff, 0xff, 0x7a, 0xff, 0x23, 0xe8, 0x03, 0x86, 0xc2, 0x04, 0x78, 0xfb, 0x03, 0x02, \n  0x48, 0x05, 0x0d, 0x12, 0x05, 0xab, 0x15, 0x04, 0x2c, 0xc4, 0x02, 0x5d, 0x55, 0x02, 0xfb, 0x4c, \n  0x02, 0xe7, 0x22, 0x01, 0xa6, 0x83, 0x00, 0x2a, 0x3e, 0x00, 0xed, 0x09, 0x00, 0xad, 0x41, 0x00, \n  0x78, 0x3e, 0x00, 0xa5, 0x45, 0x00, 0x90, 0xa8, 0x00, 0xc0, 0x76, 0x00, 0x24, 0x83, 0x00, 0x65, \n  0xea, 0x00, 0xed, 0xcd, 0x00, 0x12, 0xab, 0x00, 0x1a, 0xa7, 0x00, 0xe7, 0x57, 0x00, 0x95, 0xb6, \n  0xff, 0x76, 0x3f, 0xff, 0x79, 0xed, 0xfe, 0x9a, 0x1b, 0xff, 0x97, 0x62, 0xff, 0x2c, 0x50, 0xff, \n  0x02, 0x5a, 0xff, 0xfc, 0x4f, 0xff, 0xff, 0x13, 0x05, 0x7b, 0x83, 0x06, 0xaf, 0x64, 0x04, 0xec, \n  0x33, 0x05, 0xcd, 0xe8, 0x04, 0xe3, 0x09, 0x04, 0x0d, 0x7f, 0x02, 0xba, 0x02, 0x01, 0x03, 0xaa, \n  0x00, 0x88, 0xae, 0x00, 0x88, 0xde, 0x00, 0x7a, 0x5d, 0x00, 0x1c, 0x0e, 0x00, 0x59, 0x53, 0x00, \n  0xf7, 0x94, 0x00, 0x9e, 0x03, 0x00, 0xe3, 0xf9, 0xff, 0xe4, 0xcb, 0x00, 0xa1, 0x5a, 0x01, 0x57, \n  0x92, 0x01, 0x38, 0x14, 0x01, 0xa3, 0x36, 0x00, 0xdb, 0x8b, 0xff, 0x3a, 0x54, 0xff, 0x29, 0x39, \n  0xff, 0x66, 0x2c, 0xff, 0xb4, 0x4b, 0xff, 0xcf, 0x51, 0xff, 0x3f, 0x3e, 0xff, 0x8a, 0x43, 0xff, \n  0x84, 0x27, 0xff, 0xf1, 0x1d, 0xff, 0xce, 0x5f, 0x04, 0xd7, 0x83, 0x06, 0x69, 0x46, 0x05, 0x1c, \n  0x85, 0x05, 0x4e, 0xe3, 0x04, 0xe1, 0xd7, 0x03, 0x19, 0xed, 0x01, 0xca, 0xb6, 0x00, 0x06, 0xa5, \n  0x00, 0xf1, 0x89, 0x00, 0x9a, 0xe9, 0x00, 0xc1, 0xfe, 0x00, 0xa5, 0xaf, 0x00, 0x5d, 0x36, 0x00, \n  0x77, 0xca, 0xff, 0xfe, 0xd5, 0xff, 0x7d, 0x8b, 0x00, 0x58, 0xe5, 0x00, 0xd8, 0x5d, 0x01, 0x6f, \n  0xc5, 0x01, 0xcd, 0x3a, 0x01, 0x86, 0x61, 0x00, 0x79, 0x64, 0xff, 0xd8, 0xcc, 0xfe, 0x0d, 0x05, \n  0xff, 0x85, 0x2c, 0xff, 0x72, 0x5c, 0xff, 0xad, 0x6e, 0xff, 0xe4, 0x3f, 0xff, 0xcf, 0x62, 0xff, \n  0x9e, 0x2e, 0xff, 0xcb, 0x01, 0xff, 0x92, 0x3a, 0x05, 0xdc, 0x43, 0x07, 0x0e, 0x51, 0x04, 0xb6, \n  0x04, 0x05, 0x55, 0xea, 0x03, 0x8e, 0xe8, 0x02, 0x87, 0x68, 0x02, 0x7a, 0xb7, 0x00, 0xf8, 0x38, \n  0x00, 0x4d, 0x35, 0x01, 0x9b, 0x74, 0x01, 0x1e, 0xe3, 0x00, 0x85, 0xfa, 0x00, 0xde, 0xb0, 0xff, \n  0xc8, 0x77, 0xff, 0x75, 0x56, 0x00, 0xd8, 0x8d, 0x00, 0x29, 0xb9, 0x00, 0x2e, 0x5b, 0x01, 0x19, \n  0xd7, 0x01, 0x84, 0x23, 0x01, 0xab, 0x79, 0x00, 0x6a, 0x6b, 0xff, 0xea, 0xb7, 0xfe, 0xb2, 0x0b, \n  0xff, 0xd3, 0x1b, 0xff, 0x8d, 0xf2, 0xfe, 0x46, 0x7e, 0xff, 0x24, 0x7f, 0xff, 0x73, 0x3c, 0xff, \n  0xdf, 0x60, 0xff, 0x2b, 0x13, 0xff, 0x22, 0x27, 0x05, 0x22, 0xd2, 0x06, 0xd8, 0xba, 0x03, 0x50, \n  0x41, 0x04, 0x73, 0x76, 0x03, 0x57, 0x11, 0x03, 0x0c, 0x50, 0x02, 0xf8, 0xf6, 0x00, 0xf1, 0xa9, \n  0x00, 0x92, 0x38, 0x01, 0x23, 0x61, 0x01, 0xe6, 0x35, 0x01, 0x03, 0x42, 0x01, 0x8d, 0xfa, 0xff, \n  0x74, 0x26, 0x00, 0x22, 0x82, 0x00, 0x0c, 0x54, 0x00, 0xa6, 0x6c, 0x00, 0x30, 0xc0, 0x00, 0x9c, \n  0x23, 0x01, 0xf2, 0x97, 0x01, 0x3b, 0xe5, 0x01, 0x8a, 0x2a, 0x00, 0xba, 0x25, 0xff, 0x62, 0xf4, \n  0xfe, 0x18, 0xa4, 0xfe, 0x10, 0x3a, 0xff, 0xaa, 0x6d, 0xff, 0xcc, 0x58, 0xff, 0xa1, 0x6c, 0xff, \n  0xbc, 0x7f, 0xff, 0x0b, 0x44, 0xff, 0x27, 0xda, 0x05, 0xda, 0x90, 0x07, 0x84, 0x59, 0x03, 0xa7, \n  0x4f, 0x03, 0xe5, 0xa9, 0x02, 0xbd, 0x9a, 0x02, 0xeb, 0x3c, 0x02, 0xbf, 0xb4, 0x00, 0xda, 0xea, \n  0xff, 0x0b, 0x2a, 0x01, 0x93, 0x29, 0x02, 0x29, 0x49, 0x01, 0x6a, 0xa6, 0x00, 0x37, 0xb2, 0x00, \n  0x1f, 0x86, 0x00, 0x63, 0x32, 0x00, 0xe8, 0x3a, 0x01, 0x79, 0x89, 0x00, 0x80, 0x41, 0x00, 0xdb, \n  0xee, 0x00, 0x3c, 0x97, 0x00, 0xaf, 0x2d, 0x01, 0xd6, 0xa5, 0x01, 0x49, 0x0f, 0x01, 0x38, 0x2e, \n  0xff, 0x82, 0x7e, 0xfe, 0xff, 0xd2, 0xfe, 0x2f, 0x24, 0xff, 0x92, 0x7e, 0xff, 0x86, 0x8e, 0xff, \n  0x38, 0x93, 0xff, 0x88, 0x54, 0xff, 0x46, 0x23, 0x07, 0xa8, 0x2b, 0x09, 0x4a, 0x46, 0x03, 0x5c, \n  0x39, 0x03, 0x1b, 0x83, 0x01, 0x55, 0x5c, 0x01, 0xbf, 0x43, 0x02, 0x7b, 0x48, 0x00, 0x96, 0xf7, \n  0xfe, 0xf4, 0x7f, 0x00, 0xe9, 0x73, 0x02, 0x9b, 0x4e, 0x01, 0x2e, 0x19, 0x01, 0x3e, 0xaa, 0x00, \n  0x12, 0xec, 0xff, 0x8c, 0xe3, 0x00, 0x0c, 0x4b, 0x01, 0x0d, 0xa0, 0x00, 0xa0, 0x33, 0x01, 0xee, \n  0xd2, 0x00, 0xee, 0xe2, 0xff, 0x0d, 0xf2, 0x00, 0xe0, 0x13, 0x01, 0xf9, 0xed, 0x00, 0x1f, 0xfd, \n  0x00, 0x7e, 0xbb, 0xff, 0xcb, 0xb5, 0xfe, 0x5b, 0xff, 0xfe, 0xe5, 0x68, 0xff, 0xd2, 0x6e, 0xff, \n  0x7d, 0x9c, 0xff, 0x47, 0x8a, 0xff, 0x58, 0x44, 0x08, 0x90, 0xda, 0x09, 0x95, 0x47, 0x03, 0x81, \n  0xd5, 0x03, 0x76, 0xfa, 0x01, 0x03, 0xa7, 0x01, 0x34, 0x99, 0x01, 0x79, 0x88, 0xfe, 0x89, 0xf9, \n  0xfc, 0xa5, 0x59, 0x00, 0xd7, 0x58, 0x03, 0x83, 0xa6, 0x00, 0xc8, 0xbe, 0x00, 0xf9, 0x75, 0x00, \n  0xbc, 0xe3, 0xff, 0x97, 0x05, 0x01, 0x38, 0xa1, 0x00, 0xcf, 0xf8, 0x00, 0x3b, 0xe1, 0x01, 0xbc, \n  0xde, 0x00, 0x9e, 0x41, 0x00, 0xc2, 0x8b, 0x00, 0x56, 0xf8, 0xff, 0x47, 0xc2, 0x00, 0x85, 0xdd, \n  0x00, 0x6e, 0x29, 0x00, 0xf4, 0x75, 0x00, 0x0a, 0xec, 0xff, 0xc6, 0xe5, 0xfe, 0xde, 0xd1, 0xfe, \n  0x93, 0x9a, 0xff, 0xd3, 0x8a, 0xff, 0x6a, 0x0b, 0x0a, 0x75, 0x86, 0x0b, 0xe6, 0xe3, 0x02, 0x98, \n  0x21, 0x04, 0x07, 0x1f, 0x02, 0x43, 0x91, 0x01, 0xc1, 0x33, 0x01, 0x25, 0x2e, 0xfd, 0x29, 0xa3, \n  0xfb, 0x23, 0x48, 0x00, 0x18, 0xf8, 0x03, 0x65, 0x30, 0x00, 0x7d, 0xac, 0xff, 0x60, 0x60, 0xff, \n  0x3f, 0xb3, 0xff, 0x56, 0x37, 0x01, 0xbb, 0x2c, 0x01, 0xea, 0xf8, 0x00, 0xcb, 0x0b, 0x01, 0x27, \n  0x0a, 0x01, 0xbf, 0x41, 0x00, 0x7b, 0xce, 0x00, 0xdb, 0xa6, 0x00, 0xd7, 0x1a, 0x00, 0x34, 0xee, \n  0xff, 0xb5, 0xec, 0xff, 0x3d, 0x84, 0x00, 0xc1, 0xab, 0x00, 0x72, 0x2e, 0x00, 0xed, 0x6b, 0xff, \n  0x7a, 0xfd, 0xfe, 0xd7, 0x05, 0xff, 0xce, 0x42, 0x0c, 0x9e, 0xc5, 0x0d, 0x17, 0x74, 0x02, 0xcd, \n  0x0e, 0x04, 0x8d, 0xab, 0x01, 0xea, 0x53, 0x01, 0xa2, 0x88, 0x01, 0xbf, 0x0a, 0xfc, 0x57, 0x16, \n  0xfa, 0x12, 0x8e, 0x00, 0xf1, 0x9c, 0x04, 0x87, 0x81, 0xff, 0x33, 0x2e, 0xff, 0xe3, 0xa9, 0xfe, \n  0x4d, 0xe6, 0xfe, 0xdd, 0xf4, 0x00, 0x45, 0x08, 0x01, 0xaf, 0xe7, 0x00, 0xb7, 0x86, 0x01, 0xb5, \n  0xc9, 0x00, 0x5b, 0x49, 0xff, 0xa5, 0x25, 0x01, 0xfe, 0xb7, 0x00, 0x18, 0x40, 0x00, 0x52, 0x6c, \n  0x00, 0x99, 0x25, 0xff, 0xb0, 0xc2, 0xff, 0x61, 0xbd, 0x00, 0xb5, 0x65, 0x00, 0xbd, 0xfc, 0xff, \n  0x3f, 0x58, 0x00, 0xa4, 0xbf, 0xff, 0x10, 0x0f, 0x0f, 0xc0, 0xba, 0x0f, 0x18, 0x89, 0x01, 0x4a, \n  0x32, 0x04, 0xf1, 0x9f, 0x01, 0x37, 0x4c, 0x01, 0x15, 0x43, 0x01, 0x70, 0x84, 0xfa, 0x96, 0x06, \n  0xf9, 0x66, 0x80, 0x01, 0x00, 0xfd, 0x04, 0x14, 0xd1, 0xfe, 0xb8, 0xd4, 0xfe, 0xc6, 0xbd, 0xfd, \n  0x90, 0x9b, 0xfe, 0xd5, 0xe0, 0x00, 0x1b, 0x74, 0x00, 0x9c, 0xc6, 0x00, 0x93, 0x63, 0x01, 0x86, \n  0x2e, 0x00, 0xfc, 0x69, 0xff, 0x9b, 0x02, 0x01, 0xad, 0xe6, 0xff, 0x16, 0xa9, 0x00, 0x3e, 0x4e, \n  0x00, 0x1f, 0x1c, 0xff, 0x0c, 0x0f, 0x00, 0xcf, 0xbb, 0xff, 0xc4, 0xef, 0xff, 0x31, 0xa7, 0x00, \n  0xb3, 0xff, 0x00, 0xd3, 0x31, 0x00, 0x9a, 0xef, 0x11, 0x6c, 0xb2, 0x11, 0xa3, 0x8d, 0x00, 0x17, \n  0x81, 0x04, 0x9d, 0xc4, 0x01, 0x80, 0x50, 0x01, 0x86, 0xcb, 0x00, 0x06, 0x84, 0xf8, 0xca, 0x23, \n  0xf8, 0xb0, 0x0a, 0x03, 0xab, 0x6c, 0x05, 0xb1, 0x1d, 0xfe, 0x3d, 0x94, 0xfe, 0x32, 0xbd, 0xfc, \n  0x6e, 0x49, 0xfe, 0xf3, 0xff, 0x00, 0x46, 0x54, 0x00, 0xd5, 0x9e, 0x00, 0x4d, 0xec, 0x00, 0x1b, \n  0xbf, 0xff, 0x58, 0x10, 0xff, 0x65, 0x07, 0x01, 0x76, 0xec, 0xff, 0x5a, 0x01, 0x00, 0x16, 0xd8, \n  0xff, 0xc8, 0xff, 0xfe, 0x9f, 0xad, 0xff, 0xcb, 0x55, 0x00, 0x10, 0x33, 0x00, 0x49, 0xe4, 0xff, \n  0x98, 0xdf, 0x00, 0x3b, 0xa7, 0x00, 0x3c, 0xfb, 0x14, 0x63, 0xf0, 0x13, 0x86, 0xaf, 0xff, 0x2e, \n  0xa5, 0x04, 0x96, 0x4e, 0x01, 0x51, 0x1b, 0x01, 0x43, 0x75, 0x00, 0xb8, 0x93, 0xf6, 0x6b, 0xc0, \n  0xf7, 0xeb, 0x56, 0x04, 0x23, 0x64, 0x05, 0x5a, 0xc9, 0xfd, 0xfb, 0x7d, 0xfe, 0xcf, 0xbf, 0xfb, \n  0x05, 0xf5, 0xfd, 0xcd, 0xf4, 0x00, 0xfb, 0x41, 0x00, 0x62, 0xd0, 0x00, 0xb9, 0x90, 0x00, 0xec, \n  0x11, 0xff, 0xf7, 0xc4, 0xfe, 0x2b, 0xff, 0x00, 0x2f, 0xb4, 0xff, 0x75, 0xee, 0xff, 0xac, 0x12, \n  0xff, 0xde, 0x51, 0xfe, 0xd5, 0xa7, 0xff, 0xd4, 0x57, 0x00, 0xcb, 0x05, 0x00, 0x07, 0xfc, 0xff, \n  0x5c, 0x36, 0x01, 0x1e, 0x36, 0x00, 0x84, 0x67, 0x17, 0x7b, 0x8d, 0x16, 0xdc, 0x5c, 0xff, 0x50, \n  0x9e, 0x04, 0x5a, 0xd3, 0x00, 0x1a, 0x56, 0x00, 0x7a, 0x4a, 0x00, 0xdf, 0x06, 0xf5, 0xf0, 0x95, \n  0xf7, 0x66, 0x26, 0x05, 0xf3, 0xda, 0x04, 0x15, 0xb8, 0xfd, 0x66, 0x8a, 0xfe, 0x95, 0x4b, 0xfb, \n  0xe6, 0x71, 0xfd, 0xfc, 0x81, 0x00, 0xbc, 0x5b, 0x00, 0x27, 0x04, 0x01, 0x95, 0x3c, 0x00, 0xe5, \n  0xba, 0xfe, 0x4d, 0x61, 0xfe, 0x2e, 0x06, 0x01, 0xf1, 0x4c, 0xff, 0xc4, 0x56, 0xff, 0xc7, 0x33, \n  0xff, 0x07, 0x15, 0xfe, 0x5b, 0x40, 0xff, 0x01, 0xc8, 0xff, 0x62, 0xdd, 0xff, 0x87, 0x31, 0x00, \n  0xda, 0xee, 0x00, 0x86, 0x40, 0x00, 0xe7, 0xaf, 0x18, 0x1d, 0xa8, 0x19, 0x8b, 0x33, 0x00, 0x6d, \n  0x4e, 0x04, 0xab, 0xed, 0x00, 0x05, 0x01, 0xff, 0x5a, 0xe5, 0xff, 0xd7, 0x87, 0xf4, 0x4d, 0x8d, \n  0xf7, 0x6a, 0x5e, 0x05, 0xd6, 0x16, 0x04, 0x17, 0xd2, 0xfd, 0x1d, 0x8a, 0xfe, 0x74, 0x69, 0xfb, \n  0xa5, 0x49, 0xfd, 0x31, 0xa5, 0xff, 0x35, 0x2d, 0x00, 0x85, 0x8e, 0x01, 0xf9, 0x10, 0x00, 0xd6, \n  0xa8, 0xfe, 0xf4, 0x0b, 0xfe, 0xc7, 0x4e, 0x00, 0x6d, 0xe4, 0xff, 0xdc, 0x1f, 0xff, 0x0a, 0xb0, \n  0xfe, 0x75, 0x0f, 0xfe, 0xd9, 0xc5, 0xfe, 0x01, 0x11, 0x00, 0x01, 0xa2, 0xff, 0x08, 0x8e, 0xff, \n  0x64, 0xfd, 0x00, 0x36, 0xfc, 0xff, 0xf6, 0x4b, 0x18, 0x8e, 0x92, 0x1c, 0xb8, 0xed, 0x02, 0x9c, \n  0xa4, 0x03, 0xb4, 0x40, 0x01, 0xa0, 0xe2, 0xfd, 0x43, 0xbd, 0xfe, 0x1a, 0xae, 0xf4, 0xdf, 0x92, \n  0xf7, 0x31, 0xae, 0x04, 0x79, 0x64, 0x03, 0x4f, 0x11, 0xfe, 0x94, 0x28, 0xfe, 0x2e, 0xb3, 0xfb, \n  0x99, 0x42, 0xfd, 0xd9, 0xcc, 0xfe, 0x71, 0xe8, 0xff, 0x88, 0xa9, 0x01, 0x71, 0x39, 0x00, 0x45, \n  0x45, 0xfe, 0xb8, 0xc8, 0xfd, 0x7c, 0x56, 0x00, 0x3c, 0xe3, 0xff, 0x7e, 0x11, 0xff, 0x39, 0x28, \n  0xfe, 0xee, 0x0b, 0xfe, 0x7f, 0xa1, 0xfe, 0x80, 0x8e, 0xff, 0x97, 0x84, 0xff, 0x14, 0x2a, 0xff, \n  0x9e, 0xe5, 0x00, 0xd8, 0x5d, 0x00, 0xf6, 0x73, 0x17, 0x1c, 0x1e, 0x1e, 0x9b, 0xcf, 0x06, 0x5f, \n  0x19, 0x04, 0xe0, 0x27, 0x01, 0x0d, 0x79, 0xfd, 0xe5, 0xae, 0xfd, 0x12, 0xc1, 0xf4, 0x66, 0x85, \n  0xf7, 0x2d, 0x99, 0x03, 0x1f, 0xa9, 0x02, 0x02, 0xbb, 0xfe, 0x4d, 0xc6, 0xfd, 0x0a, 0xb2, 0xfb, \n  0x79, 0xa3, 0xfd, 0x34, 0xe0, 0xfd, 0xcd, 0xab, 0xff, 0xd7, 0xad, 0x01, 0xa8, 0xac, 0xff, 0xb5, \n  0x64, 0xff, 0x1e, 0xd5, 0xfd, 0xf0, 0x52, 0xff, 0x0c, 0xfb, 0xff, 0xd0, 0xf3, 0xfe, 0x3e, 0x89, \n  0xfe, 0xd8, 0xfa, 0xfd, 0xd3, 0xfe, 0xfd, 0x94, 0xe7, 0xfe, 0x9e, 0x58, 0xff, 0x36, 0xa6, 0xff, \n  0x96, 0x2d, 0x01, 0xea, 0x32, 0x00, 0x41, 0xc3, 0x17, 0x73, 0x01, 0x1e, 0xe8, 0x5f, 0x09, 0x3e, \n  0x73, 0x06, 0x8d, 0xae, 0x00, 0xb9, 0x64, 0xfd, 0xbd, 0x70, 0xfd, 0x85, 0xca, 0xf4, 0x78, 0xcf, \n  0xf7, 0xbd, 0xfe, 0x01, 0x04, 0x2f, 0x01, 0x6c, 0xcd, 0xff, 0x9a, 0xb1, 0xfd, 0x45, 0x62, 0xfb, \n  0x58, 0x22, 0xfe, 0xbf, 0x3f, 0xfd, 0x59, 0xcb, 0xfe, 0x01, 0x19, 0x02, 0xfb, 0x12, 0x00, 0x12, \n  0xf7, 0xfe, 0x48, 0x64, 0xfe, 0xae, 0x5b, 0xff, 0x54, 0x04, 0x00, 0xd5, 0xc4, 0xfe, 0x14, 0x0b, \n  0xfe, 0x59, 0xf8, 0xfd, 0x64, 0x79, 0xfd, 0x2e, 0x20, 0xff, 0x79, 0xd7, 0xff, 0x26, 0x8c, 0xff, \n  0xe6, 0xaa, 0x00, 0x21, 0x40, 0x00, 0xec, 0xeb, 0x18, 0x46, 0x49, 0x1d, 0x02, 0xeb, 0x09, 0x32, \n  0xc8, 0x09, 0xf6, 0xd4, 0x00, 0x12, 0x9f, 0xfc, 0xe2, 0x5a, 0xfd, 0xf8, 0xf7, 0xf4, 0xb4, 0xc2, \n  0xf8, 0xa8, 0x3c, 0x00, 0x8a, 0x0f, 0xfe, 0x84, 0x8f, 0x00, 0xa4, 0x28, 0xfe, 0xba, 0x7e, 0xfb, \n  0x2e, 0xdd, 0xfe, 0x0a, 0x92, 0xfb, 0xa2, 0xec, 0xfe, 0x45, 0x9b, 0x02, 0x3d, 0x66, 0xff, 0xbf, \n  0x77, 0xff, 0x3b, 0x97, 0xfe, 0x62, 0x03, 0xff, 0x2d, 0x12, 0x00, 0x71, 0xc5, 0xfe, 0x31, 0x77, \n  0xfd, 0x13, 0x30, 0xfe, 0xe1, 0x98, 0xfd, 0x79, 0x9f, 0xfe, 0xcf, 0x3a, 0xff, 0x6e, 0x92, 0xff, \n  0xb3, 0x50, 0x01, 0x79, 0x45, 0x00, 0xd8, 0xfd, 0x1a, 0x4a, 0x71, 0x1c, 0xe0, 0x00, 0x09, 0x97, \n  0xc5, 0x0c, 0x98, 0x8e, 0x01, 0xb0, 0x25, 0xfc, 0x71, 0x64, 0xfd, 0x7e, 0x79, 0xf5, 0xc1, 0x6b, \n  0xfa, 0xa1, 0x4b, 0xff, 0xa0, 0x7f, 0xf9, 0xe4, 0x6e, 0x00, 0x17, 0x67, 0xff, 0xdf, 0x9c, 0xfa, \n  0x84, 0x5a, 0x00, 0xa8, 0x9e, 0xfb, 0x15, 0xb1, 0xfd, 0x38, 0x1c, 0x03, 0xb4, 0x6f, 0xff, 0x3a, \n  0x95, 0xff, 0x80, 0xd8, 0xfe, 0xae, 0x74, 0xfe, 0xbb, 0x16, 0x00, 0x05, 0xf6, 0xfe, 0x8a, 0x3f, \n  0xfd, 0x68, 0xa6, 0xfe, 0xa0, 0x7b, 0xfd, 0x34, 0x01, 0xfe, 0x55, 0x48, 0xff, 0xa7, 0x91, 0xff, \n  0xfb, 0xe3, 0x00, 0x32, 0xd5, 0xff, 0x01, 0x66, 0x1e, 0xce, 0x5d, 0x1b, 0x7b, 0xc3, 0x06, 0x5a, \n  0x93, 0x0f, 0x89, 0x5a, 0x01, 0x42, 0x20, 0xfc, 0xbe, 0xb6, 0xfd, 0x19, 0xd3, 0xf5, 0xb6, 0x0d, \n  0xfd, 0x4a, 0xa7, 0xfe, 0xe2, 0x56, 0xf4, 0xb9, 0xd5, 0xff, 0x07, 0x2c, 0x00, 0xef, 0xca, 0xf9, \n  0x10, 0x0c, 0x02, 0xfe, 0x6c, 0xfb, 0x96, 0x89, 0xfd, 0x26, 0xb8, 0x03, 0x8c, 0x82, 0xfe, 0x42, \n  0x4d, 0xff, 0x68, 0x9d, 0xff, 0xb6, 0x9a, 0xfe, 0x26, 0xdc, 0xff, 0x5b, 0xf3, 0xfe, 0xfa, 0xb8, \n  0xfc, 0x99, 0xce, 0xfe, 0xc5, 0xff, 0xfd, 0x7e, 0xed, 0xfd, 0xf6, 0x91, 0xfe, 0xe3, 0x2a, 0xff, \n  0xba, 0xe4, 0x00, 0xbd, 0xb7, 0xff, 0x4a, 0xf5, 0x21, 0x67, 0x8e, 0x1a, 0xea, 0x8a, 0x03, 0xcb, \n  0xb7, 0x12, 0x7a, 0xb7, 0x00, 0xc9, 0x9a, 0xfb, 0x82, 0x2b, 0xff, 0xc2, 0x45, 0xf6, 0x80, 0xfc, \n  0xff, 0x52, 0x7c, 0xff, 0x23, 0xd5, 0xee, 0xee, 0x4c, 0xfd, 0xba, 0xa6, 0x02, 0x0d, 0xa9, 0xf8, \n  0xa4, 0xa0, 0x02, 0xb7, 0xd4, 0xfc, 0xa7, 0xba, 0xfc, 0x2a, 0xdc, 0x03, 0x44, 0x22, 0xfe, 0x88, \n  0x11, 0xff, 0xf4, 0x82, 0x00, 0x6f, 0xf9, 0xfe, 0x40, 0x5c, 0xff, 0x18, 0xf8, 0xfe, 0x1d, 0xb5, \n  0xfc, 0xd4, 0xd7, 0xfe, 0xbf, 0xf1, 0xfd, 0x7d, 0x72, 0xfd, 0x36, 0x60, 0xfe, 0xb5, 0x84, 0xff, \n  0x7d, 0xfc, 0x00, 0x91, 0xbe, 0xfe, 0xba, 0xe5, 0x25, 0x94, 0xa2, 0x1a, 0xc9, 0xc5, 0xfe, 0x06, \n  0xbe, 0x15, 0x65, 0x5b, 0x00, 0x1e, 0x4f, 0xf9, 0x0f, 0xff, 0x00, 0x29, 0x49, 0xf6, 0x47, 0x9d, \n  0x03, 0xac, 0xc5, 0x01, 0xa5, 0xfc, 0xe8, 0x23, 0x6c, 0xf9, 0xfd, 0xf2, 0x04, 0x31, 0x38, 0xf9, \n  0xcc, 0x44, 0x02, 0x9d, 0x68, 0xfd, 0x30, 0x5e, 0xfc, 0x4c, 0xdd, 0x03, 0x61, 0x36, 0xfe, 0xd4, \n  0x71, 0xfe, 0x0a, 0xaa, 0x00, 0x07, 0xba, 0xff, 0x8a, 0x58, 0xff, 0x5b, 0x13, 0xff, 0xb3, 0x4e, \n  0xfc, 0xcd, 0xf8, 0xfd, 0xb6, 0x1a, 0xfe, 0xe7, 0xd7, 0xfd, 0x10, 0x0e, 0xfe, 0xcc, 0x0b, 0xff, \n  0x42, 0x69, 0x00, 0x03, 0x75, 0xfe, 0x03, 0xdd, 0x29, 0xe6, 0xb6, 0x1c, 0xfa, 0xf0, 0xf8, 0x58, \n  0x52, 0x16, 0x00, 0xb5, 0x01, 0x81, 0x4d, 0xf7, 0x6a, 0xce, 0x02, 0xe9, 0x18, 0xf6, 0x24, 0x98, \n  0x06, 0xc5, 0x85, 0x05, 0xda, 0x6e, 0xe5, 0x45, 0x75, 0xf4, 0x19, 0x1d, 0x06, 0x58, 0xfb, 0xfa, \n  0x4f, 0xba, 0x01, 0x3e, 0x7d, 0xfe, 0xc7, 0x13, 0xfc, 0x8d, 0x68, 0x03, 0x8e, 0x5d, 0xfe, 0xf3, \n  0xf1, 0xfd, 0x28, 0x50, 0x00, 0xa6, 0x14, 0x01, 0x16, 0xda, 0xff, 0x76, 0x43, 0xfe, 0x03, 0x1b, \n  0xfc, 0x86, 0xce, 0xfd, 0xf5, 0x88, 0xfe, 0xb1, 0xeb, 0xfd, 0x30, 0xb7, 0xfc, 0xea, 0xe6, 0xfe, \n  0x29, 0x70, 0x01, 0x07, 0x42, 0xfe, 0x85, 0x9d, 0x2f, 0x2b, 0x81, 0x1f, 0x3a, 0x35, 0xf2, 0x92, \n  0x53, 0x13, 0xa1, 0xb7, 0x02, 0xcc, 0x0c, 0xf7, 0xfd, 0x09, 0x05, 0x54, 0x11, 0xf5, 0xc5, 0xff, \n  0x06, 0x19, 0xb1, 0x09, 0x1a, 0x79, 0xe4, 0x21, 0x03, 0xf0, 0xdc, 0x25, 0x05, 0xda, 0x3d, 0xfd, \n  0xa8, 0x04, 0x02, 0x3c, 0x43, 0xff, 0x74, 0x97, 0xfb, 0xe2, 0x57, 0x02, 0xe4, 0x86, 0xfe, 0xd7, \n  0x56, 0xfd, 0xb8, 0x35, 0x00, 0x8b, 0xbf, 0x01, 0xf0, 0xe1, 0xff, 0x62, 0x8e, 0xfd, 0x5e, 0x40, \n  0xfc, 0xfd, 0x8b, 0xfd, 0x1b, 0xd6, 0xfd, 0x50, 0x02, 0xfe, 0xfa, 0xa8, 0xfc, 0x1f, 0x23, 0xff, \n  0x51, 0xca, 0x01, 0x8c, 0xd7, 0xfd, 0xce, 0x19, 0x35, 0xa5, 0x73, 0x21, 0xf4, 0xf7, 0xec, 0xc4, \n  0xc7, 0x10, 0xbb, 0xd3, 0x02, 0x06, 0x2b, 0xf7, 0xb7, 0x04, 0x07, 0x8c, 0x6a, 0xf3, 0xdb, 0x5e, \n  0x07, 0xf6, 0x86, 0x0f, 0xbb, 0x3b, 0xe3, 0xc4, 0x68, 0xec, 0x93, 0x1f, 0x04, 0x5a, 0xe5, 0xfe, \n  0xb7, 0x37, 0x03, 0xbc, 0x1e, 0xff, 0x0c, 0x85, 0xfb, 0xfe, 0xf5, 0x00, 0x32, 0xc2, 0xfe, 0x6f, \n  0x55, 0xfd, 0x62, 0xe4, 0xff, 0x2c, 0x96, 0x01, 0xb0, 0x05, 0x00, 0x30, 0x90, 0xfd, 0xa7, 0xb3, \n  0xfb, 0x11, 0xfa, 0xfc, 0xe2, 0x71, 0xfd, 0x2e, 0xf4, 0xfe, 0x2d, 0xf3, 0xfc, 0xa8, 0x0d, 0xff, \n  0xa9, 0xcf, 0x01, 0x7c, 0xd3, 0xfd, 0x45, 0xc8, 0x3a, 0xec, 0xda, 0x24, 0x2e, 0xf1, 0xe6, 0x3d, \n  0x7e, 0x0b, 0x67, 0xcc, 0x00, 0xb1, 0x8a, 0xfa, 0xab, 0x11, 0x0a, 0xff, 0xad, 0xef, 0x09, 0x9a, \n  0x06, 0x4d, 0x75, 0x13, 0xee, 0xa0, 0xe3, 0x51, 0x6e, 0xeb, 0x75, 0xa3, 0x02, 0x69, 0x6a, 0xfe, \n  0xc1, 0x11, 0x04, 0xf8, 0xa9, 0xff, 0xd0, 0xff, 0xfa, 0xdd, 0xcc, 0xff, 0xc2, 0xcb, 0xfe, 0x3e, \n  0xe9, 0xfc, 0x67, 0x31, 0xff, 0xf6, 0x9a, 0x01, 0xfa, 0xe4, 0xff, 0xe9, 0xe1, 0xfc, 0x2d, 0xf9, \n  0xfa, 0x15, 0x86, 0xfc, 0x70, 0x76, 0xfd, 0x18, 0xd0, 0xff, 0xa4, 0x27, 0xfd, 0xc1, 0xc7, 0xfe, \n  0x3c, 0x0f, 0x02, 0x14, 0x07, 0xfe, 0x7a, 0x87, 0x40, 0x4e, 0x5b, 0x27, 0x29, 0xac, 0xe2, 0x12, \n  0xa6, 0x07, 0xd5, 0x0c, 0xfe, 0x7c, 0x38, 0xff, 0xbd, 0x8d, 0x0b, 0xd1, 0x83, 0xec, 0x37, 0xa4, \n  0x07, 0xa8, 0xee, 0x15, 0x09, 0x96, 0xe6, 0xb0, 0x42, 0xeb, 0x6f, 0xa7, 0x00, 0xaf, 0x20, 0xfd, \n  0x6f, 0x5e, 0x05, 0x48, 0x8e, 0x01, 0xa2, 0x5a, 0xfa, 0x1a, 0x8a, 0xfe, 0x14, 0xfa, 0xfe, 0xf7, \n  0x17, 0xfd, 0x9a, 0xa7, 0xfe, 0x3a, 0xb2, 0x01, 0x17, 0x5a, 0xff, 0x67, 0xf8, 0xfc, 0xb5, 0xcf, \n  0xfa, 0xc0, 0x04, 0xfc, 0x74, 0xbe, 0xfd, 0x6e, 0x84, 0x00, 0x72, 0x7f, 0xfd, 0xd2, 0x00, 0xff, \n  0x88, 0xce, 0x02, 0xdf, 0xc9, 0xfd, 0xf9, 0x4d, 0x45, 0xc2, 0x54, 0x29, 0x65, 0x63, 0xdf, 0x45, \n  0x60, 0x04, 0xec, 0x44, 0xfb, 0xa0, 0x85, 0x02, 0xc6, 0x5a, 0x0b, 0x36, 0xf1, 0xea, 0x97, 0xcf, \n  0x07, 0x9f, 0xff, 0x17, 0x98, 0x41, 0xea, 0x96, 0x32, 0xea, 0x8f, 0x29, 0xff, 0x21, 0x02, 0xfb, \n  0x43, 0xf3, 0x06, 0xb3, 0x1d, 0x03, 0x8f, 0xcd, 0xf8, 0xa9, 0xdd, 0xfd, 0xd1, 0x4d, 0xff, 0x55, \n  0xf7, 0xfc, 0x76, 0xba, 0xfd, 0xc4, 0x6d, 0x01, 0xf4, 0xcf, 0xfe, 0xde, 0xae, 0xfd, 0x44, 0x5a, \n  0xfa, 0xac, 0x12, 0xfb, 0xc2, 0x0a, 0xfe, 0x2d, 0xfb, 0x00, 0x1b, 0xf0, 0xfd, 0xac, 0x59, 0xff, \n  0xe2, 0xd5, 0x02, 0x80, 0x46, 0xfd, 0x5b, 0x4f, 0x49, 0xba, 0xef, 0x2a, 0x96, 0x5f, 0xdd, 0x95, \n  0xe9, 0x01, 0xdb, 0xe1, 0xf8, 0x84, 0x3d, 0x04, 0x9a, 0xbc, 0x0a, 0x56, 0x19, 0xeb, 0xd6, 0x9f, \n  0x06, 0xcd, 0xaf, 0x19, 0xd3, 0xd7, 0xee, 0x43, 0x1d, 0xe9, 0xd2, 0x3e, 0xfe, 0xdd, 0x86, 0xf8, \n  0x92, 0x07, 0x08, 0x01, 0x99, 0x04, 0x7d, 0x86, 0xf7, 0x34, 0xbf, 0xfd, 0x0d, 0xca, 0xff, 0xad, \n  0x26, 0xfc, 0x55, 0xe4, 0xfc, 0x03, 0xa9, 0x01, 0xe3, 0x70, 0xfe, 0xee, 0x57, 0xfe, 0xb8, 0xcd, \n  0xf9, 0x3d, 0x4c, 0xfa, 0x99, 0x5e, 0xfe, 0x7e, 0x5e, 0x01, 0xed, 0x7c, 0xfe, 0x24, 0x74, 0xff, \n  0x7a, 0x53, 0x02, 0x60, 0x51, 0xfd, 0x57, 0x05, 0x4b, 0x70, 0xc4, 0x2d, 0x74, 0x58, 0xdc, 0xb3, \n  0x02, 0x00, 0x92, 0xed, 0xf6, 0xc1, 0x19, 0x04, 0xc7, 0x3b, 0x0a, 0xc8, 0xdd, 0xeb, 0xe3, 0xcd, \n  0x03, 0x10, 0x1d, 0x1b, 0xfc, 0xbe, 0xf4, 0xa6, 0xda, 0xe7, 0xba, 0x21, 0xfd, 0xdd, 0x0d, 0xf6, \n  0x6d, 0xe0, 0x07, 0x87, 0x7d, 0x06, 0xd3, 0xca, 0xf6, 0x5d, 0x9c, 0xfd, 0x93, 0xfe, 0xff, 0xfe, \n  0x1b, 0xfb, 0x98, 0x39, 0xfc, 0x70, 0x33, 0x02, 0x4f, 0xad, 0xfd, 0xef, 0xba, 0xfe, 0x54, 0xda, \n  0xf9, 0xd9, 0x97, 0xf9, 0x0b, 0x81, 0xfe, 0x33, 0x9d, 0x01, 0x34, 0xbd, 0xfe, 0x4d, 0x28, 0xff, \n  0xc9, 0xf4, 0x01, 0xa8, 0x5c, 0xfd, 0xff, 0x58, 0x4d, 0xbe, 0x42, 0x2e, 0x71, 0x3c, 0xdd, 0xdb, \n  0x18, 0xff, 0xbb, 0xd2, 0xf4, 0x0d, 0xd1, 0x03, 0x52, 0x25, 0x09, 0x91, 0x2e, 0xec, 0x78, 0x5b, \n  0x01, 0xf5, 0x8e, 0x1c, 0x52, 0xaf, 0xf9, 0x13, 0x19, 0xe8, 0xe6, 0x78, 0xfb, 0x6f, 0xd8, 0xf3, \n  0x86, 0xd9, 0x07, 0xb8, 0x80, 0x07, 0x25, 0x49, 0xf7, 0xa3, 0x25, 0xfd, 0x24, 0x39, 0x00, 0xf9, \n  0x3d, 0xfa, 0x70, 0x0c, 0xfc, 0x0a, 0x55, 0x02, 0x9a, 0xe8, 0xfc, 0x2c, 0x36, 0xff, 0x34, 0x34, \n  0xfa, 0x26, 0x70, 0xf9, 0x76, 0x87, 0xfe, 0x29, 0xb4, 0x01, 0xc4, 0x3a, 0xfe, 0x45, 0x3b, 0xff, \n  0x10, 0x8c, 0x01, 0x3a, 0x3a, 0xfd, 0x35, 0xb7, 0x4d, 0x26, 0x62, 0x2f, 0x40, 0x45, 0xdf, 0x94, \n  0x6e, 0xfe, 0x9d, 0x7c, 0xf2, 0x2a, 0xca, 0x02, 0xf8, 0xe9, 0x08, 0xa5, 0x28, 0xeb, 0x88, 0xb1, \n  0xfe, 0x9c, 0xd5, 0x1d, 0xdf, 0xb5, 0xfd, 0x91, 0x7a, 0xe9, 0x53, 0xb1, 0xf9, 0x9d, 0xff, 0xf1, \n  0xa0, 0xd4, 0x06, 0x82, 0x24, 0x08, 0x01, 0xbe, 0xf8, 0x70, 0xe3, 0xfb, 0xe2, 0x4e, 0x00, 0x60, \n  0x53, 0xfa, 0xfe, 0x51, 0xfb, 0x6d, 0xdf, 0x01, 0x88, 0x94, 0xfc, 0xa8, 0xae, 0xff, 0x53, 0xba, \n  0xfa, 0x2a, 0xa7, 0xf9, 0x73, 0x05, 0xfe, 0x7d, 0x42, 0x01, 0xa8, 0xd3, 0xfd, 0xbf, 0xf8, 0xfe, \n  0xc7, 0x4e, 0x01, 0x48, 0x61, 0xfd, 0xb2, 0x59, 0x4c, 0x5f, 0x5c, 0x31, 0x8c, 0xa5, 0xe2, 0x94, \n  0x88, 0xfe, 0x60, 0x79, 0xef, 0x53, 0x97, 0x01, 0xc6, 0x4a, 0x0a, 0x30, 0xd3, 0xe8, 0x5d, 0x2b, \n  0xfc, 0x58, 0x5c, 0x1e, 0xa9, 0x22, 0x01, 0x1c, 0x8f, 0xec, 0xab, 0xb1, 0xf8, 0x86, 0x34, 0xf0, \n  0xd3, 0xc4, 0x04, 0x2d, 0x9e, 0x08, 0xd4, 0xf8, 0xfa, 0x6e, 0xbd, 0xfa, 0x48, 0xe1, 0xff, 0xcb, \n  0x21, 0xfb, 0xcf, 0x70, 0xfa, 0x73, 0x85, 0x01, 0x93, 0xb1, 0xfc, 0x9b, 0x24, 0x00, 0x50, 0xe1, \n  0xfb, 0xd8, 0x26, 0xf9, 0x3c, 0x32, 0xfd, 0x91, 0x14, 0x01, 0xf0, 0x30, 0xfd, 0xdf, 0x3e, 0xff, \n  0x45, 0xa4, 0x01, 0x28, 0x33, 0xfd, 0xd0, 0x72, 0x49, 0x8a, 0x9c, 0x33, 0x2f, 0x6b, 0xe7, 0x78, \n  0x2d, 0xff, 0x4c, 0x72, 0xec, 0x1e, 0x2e, 0x00, 0x1c, 0x47, 0x0c, 0x17, 0x39, 0xe6, 0x9d, 0x52, \n  0xf9, 0x4f, 0x7a, 0x1e, 0xd1, 0xd2, 0x03, 0x4c, 0xda, 0xf0, 0xcf, 0x7d, 0xf9, 0x38, 0x46, 0xed, \n  0x12, 0x79, 0x02, 0x11, 0x24, 0x09, 0x45, 0xa6, 0xfc, 0x79, 0xb7, 0xfa, 0x40, 0xc9, 0xfe, 0x5a, \n  0xa4, 0xfb, 0xe6, 0x56, 0xfa, 0x8f, 0x78, 0x01, 0xce, 0x4c, 0xfd, 0x40, 0xaf, 0x00, 0x80, 0xf2, \n  0xfb, 0x93, 0x17, 0xf9, 0x4e, 0x5d, 0xfc, 0x0c, 0x10, 0x00, 0xd7, 0x29, 0xfe, 0x59, 0x91, 0xff, \n  0x85, 0xb7, 0x01, 0x06, 0x48, 0xfd, 0xee, 0x4d, 0x46, 0x11, 0x69, 0x34, 0xf5, 0x4c, 0xed, 0x78, \n  0x01, 0x00, 0x54, 0xf1, 0xe9, 0x88, 0x3c, 0xff, 0x4c, 0x43, 0x0d, 0xfb, 0x10, 0xe5, 0x32, 0x59, \n  0xf5, 0xdb, 0x4e, 0x1e, 0xe7, 0x85, 0x06, 0x6e, 0x62, 0xf4, 0xdd, 0x7d, 0xfc, 0xfe, 0x8c, 0xe9, \n  0x6e, 0x1a, 0x00, 0x89, 0xe4, 0x09, 0x14, 0x05, 0xfd, 0xd5, 0x5a, 0xfb, 0x93, 0xa5, 0xfd, 0x54, \n  0x36, 0xfb, 0x3b, 0x7d, 0xfb, 0x9d, 0x5d, 0x02, 0x04, 0xd9, 0xfc, 0xfe, 0x08, 0x01, 0x9a, 0x1a, \n  0xfc, 0x43, 0x57, 0xf8, 0x19, 0x55, 0xfc, 0x33, 0xb2, 0xff, 0x7d, 0xf2, 0xfe, 0x0a, 0xd6, 0xff, \n  0x91, 0xd7, 0x01, 0x4d, 0x9a, 0xfd, 0xe8, 0x8c, 0x41, 0x1c, 0xd8, 0x35, 0x96, 0xbf, 0xf3, 0x36, \n  0x91, 0x00, 0x2f, 0xeb, 0xe8, 0x8f, 0xaf, 0xfc, 0xb4, 0xd7, 0x0c, 0xe7, 0xb1, 0xe7, 0x78, 0x6f, \n  0xef, 0xe5, 0x70, 0x1c, 0x2f, 0x52, 0x0b, 0xfe, 0xd7, 0xf5, 0x89, 0xc5, 0x01, 0x4d, 0xbf, 0xe6, \n  0x48, 0xee, 0xfb, 0x47, 0xe5, 0x0a, 0xb2, 0x3d, 0xfc, 0xf8, 0x68, 0xfc, 0x49, 0x83, 0xfd, 0xc6, \n  0x42, 0xfa, 0xbd, 0xe2, 0xfc, 0xb3, 0xcb, 0x02, 0x74, 0x0b, 0xfc, 0xd1, 0x00, 0x02, 0x46, 0x5f, \n  0xfb, 0x25, 0xeb, 0xf7, 0x5a, 0xc3, 0xfd, 0xbb, 0xc4, 0xfe, 0xc5, 0x93, 0xff, 0xa2, 0x6e, 0x00, \n  0xd8, 0x88, 0x01, 0xa5, 0x7e, 0xfd, 0xab, 0x3b, 0x3e, 0xcd, 0x9e, 0x34, 0xb1, 0x13, 0xfa, 0xd6, \n  0x36, 0x01, 0x57, 0x1b, 0xe8, 0xca, 0xea, 0xfa, 0xf2, 0x96, 0x09, 0xf8, 0x6b, 0xec, 0x0f, 0x0e, \n  0xeb, 0x33, 0x61, 0x18, 0xba, 0x41, 0x10, 0x15, 0x8f, 0xf6, 0x32, 0xd3, 0x06, 0x77, 0x9e, 0xe6, \n  0x94, 0xfe, 0xf5, 0xb3, 0x23, 0x0b, 0xd1, 0x5f, 0xfb, 0x61, 0xc9, 0xfc, 0xe5, 0x29, 0xff, 0x40, \n  0x47, 0xf9, 0x0c, 0x40, 0xfc, 0xe2, 0xb9, 0x03, 0xa7, 0xac, 0xfb, 0xdd, 0x67, 0x01, 0xb1, 0x50, \n  0xfc, 0x7d, 0x6e, 0xf7, 0x16, 0xd0, 0xfe, 0x98, 0x30, 0xff, 0xe8, 0x48, 0xff, 0x93, 0x6b, 0x00, \n  0x4c, 0x57, 0x01, 0x3a, 0xbf, 0xfd, 0x93, 0xe9, 0x3b, 0x68, 0x63, 0x32, 0x07, 0x41, 0xfe, 0x04, \n  0x53, 0x03, 0xce, 0x20, 0xe9, 0x29, 0xf4, 0xf8, 0xd0, 0x2e, 0x06, 0x18, 0xa7, 0xef, 0xb8, 0xd1, \n  0xe9, 0xfb, 0xae, 0x13, 0x76, 0xbd, 0x14, 0xc2, 0x31, 0xf8, 0x48, 0x24, 0x09, 0x4e, 0x2e, 0xea, \n  0x4b, 0x64, 0xef, 0xc4, 0xb0, 0x0a, 0xe4, 0x92, 0xfb, 0xd7, 0x3e, 0xfc, 0xb5, 0x97, 0x00, 0xf7, \n  0x41, 0xf9, 0x6f, 0x3f, 0xfc, 0x84, 0x25, 0x03, 0x27, 0x7d, 0xfb, 0xbc, 0x79, 0x01, 0x5a, 0xdc, \n  0xfd, 0xe2, 0x41, 0xf7, 0x88, 0x02, 0x00, 0xa4, 0x3e, 0xff, 0x84, 0xa5, 0xfe, 0x4c, 0x0d, 0x01, \n  0x31, 0xfc, 0x00, 0xee, 0x8a, 0xfd, 0x23, 0x39, 0x3a, 0x23, 0x39, 0x31, 0x19, 0xf5, 0xfd, 0x71, \n  0x54, 0x06, 0xac, 0x26, 0xec, 0xc4, 0xc0, 0xf4, 0xd1, 0x96, 0x04, 0x47, 0xfa, 0xf1, 0x30, 0x4f, \n  0xe8, 0xd9, 0x30, 0x10, 0xdc, 0xf2, 0x18, 0xe3, 0x8c, 0xf9, 0x9a, 0x55, 0x09, 0xce, 0x13, 0xef, \n  0xa5, 0x95, 0xe9, 0x96, 0xec, 0x09, 0xdb, 0xeb, 0xfc, 0x49, 0xef, 0xf9, 0xc8, 0x82, 0x01, 0xe2, \n  0x9e, 0xf9, 0x9e, 0xe9, 0xfb, 0x8f, 0x1e, 0x03, 0x51, 0x0b, 0xfb, 0xf8, 0x13, 0x01, 0x43, 0x0f, \n  0x00, 0x27, 0xea, 0xf7, 0x0f, 0x67, 0xff, 0x31, 0x87, 0xff, 0x0f, 0xfc, 0xfe, 0x0b, 0x98, 0x00, \n  0xb8, 0xa1, 0x00, 0x08, 0xe4, 0xfd, 0xd6, 0xc7, 0x3a, 0xb4, 0xa5, 0x2d, 0x9e, 0x23, 0xfc, 0x47, \n  0xf5, 0x0a, 0x0e, 0x63, 0xec, 0xf8, 0xd5, 0xf1, 0x53, 0x01, 0x05, 0xcc, 0xa8, 0xf3, 0xb7, 0x4b, \n  0xe7, 0xad, 0x84, 0x0c, 0x5a, 0xa2, 0x1b, 0x16, 0x22, 0xfb, 0x39, 0xe4, 0x09, 0x64, 0x8c, 0xf2, \n  0x14, 0xd8, 0xe6, 0x09, 0x18, 0x07, 0x5c, 0xd0, 0xfe, 0x7f, 0xd8, 0xf9, 0xf0, 0xde, 0xff, 0x81, \n  0x60, 0xf9, 0xd0, 0x69, 0xfb, 0x2b, 0x5e, 0x04, 0xef, 0x7a, 0xfb, 0x9a, 0x03, 0x00, 0x71, 0x91, \n  0x01, 0x6a, 0x7a, 0xf8, 0x61, 0x32, 0xff, 0x8f, 0xac, 0xff, 0xcb, 0x73, 0xfe, 0xca, 0xb2, 0x00, \n  0xd1, 0x97, 0x00, 0xe0, 0xb4, 0xfd, 0x5c, 0x69, 0x38, 0x2e, 0x5d, 0x2a, 0xec, 0x33, 0xfd, 0x85, \n  0x74, 0x0f, 0x6a, 0x14, 0xea, 0x64, 0xf9, 0xf0, 0xdb, 0x8e, 0x07, 0x82, 0xbe, 0xf3, 0x1c, 0x78, \n  0xe8, 0x84, 0x8a, 0x05, 0x27, 0x40, 0x1c, 0x7e, 0xfd, 0xfe, 0xb1, 0x53, 0x09, 0x93, 0x8f, 0xf8, \n  0x4c, 0x3c, 0xe4, 0xd6, 0xf4, 0x02, 0xd7, 0x73, 0x01, 0x93, 0x5b, 0xfa, 0xfa, 0x6c, 0xfe, 0x1b, \n  0x35, 0xf8, 0x71, 0x2d, 0xfa, 0x7f, 0x72, 0x05, 0xf9, 0x22, 0xfd, 0xe0, 0xf0, 0xfe, 0x89, 0x30, \n  0x03, 0x6f, 0xfd, 0xf7, 0xc6, 0xa9, 0xfd, 0xb5, 0x76, 0x01, 0x55, 0x48, 0xfe, 0x52, 0x49, 0x00, \n  0xbb, 0x2d, 0x00, 0x02, 0xa0, 0xfd, 0x94, 0x25, 0x34, 0x58, 0xdf, 0x26, 0x35, 0xf2, 0xfe, 0x55, \n  0x86, 0x12, 0x26, 0x6c, 0xeb, 0x5d, 0x7e, 0xf0, 0xe5, 0xa0, 0x07, 0xe2, 0xdb, 0xf5, 0x15, 0xa0, \n  0xe8, 0xeb, 0x0f, 0xff, 0x02, 0xf3, 0x1a, 0x8b, 0x91, 0x02, 0xa4, 0x5c, 0x08, 0x07, 0x7e, 0xfe, \n  0x41, 0x34, 0xe5, 0x96, 0xc3, 0xfd, 0x1b, 0xdf, 0x03, 0xdb, 0xf2, 0xf9, 0xc6, 0xaa, 0xfd, 0x18, \n  0xb8, 0xf8, 0x85, 0x06, 0xf8, 0xf0, 0x5f, 0x04, 0xb6, 0x2e, 0xfe, 0x9d, 0xb0, 0x00, 0x84, 0xe3, \n  0x03, 0xe1, 0xcf, 0xf5, 0x2d, 0xca, 0xfc, 0x0b, 0xae, 0x03, 0x64, 0x3c, 0xfe, 0x7e, 0x53, 0xff, \n  0x4a, 0xfc, 0xff, 0x53, 0x24, 0xfe, 0x98, 0x7e, 0x32, 0x4f, 0x2c, 0x22, 0xf2, 0xa5, 0xfa, 0x19, \n  0x11, 0x17, 0xa8, 0xe4, 0xf1, 0xbe, 0x8d, 0xf0, 0x62, 0x06, 0x06, 0x8e, 0x14, 0xf5, 0xd6, 0xa7, \n  0xe9, 0xef, 0xc2, 0xfa, 0xd7, 0x03, 0x1b, 0xe1, 0x20, 0x05, 0xc9, 0x40, 0x03, 0x38, 0xb4, 0x03, \n  0xf5, 0x0e, 0xea, 0xfd, 0xcb, 0xf9, 0x1d, 0xe0, 0x04, 0xcc, 0xf0, 0xfa, 0x18, 0xf4, 0xfb, 0x67, \n  0xe9, 0xf8, 0x7d, 0x7e, 0xf7, 0xa5, 0x30, 0x02, 0x18, 0x58, 0xff, 0xbf, 0xf7, 0x00, 0xad, 0xfc, \n  0x03, 0xf3, 0x13, 0xf6, 0xac, 0x7a, 0xfb, 0x19, 0xbe, 0x04, 0x68, 0xb0, 0xfe, 0x43, 0xc0, 0xfe, \n  0x50, 0xd7, 0xff, 0xe9, 0xba, 0xfe, 0xcf, 0x1c, 0x2f, 0xf6, 0x86, 0x1e, 0xc8, 0xf3, 0xfa, 0xf8, \n  0x1b, 0x19, 0x6d, 0x3c, 0xf4, 0x7d, 0x9d, 0xf0, 0x09, 0x21, 0x06, 0xae, 0x00, 0xf8, 0x8c, 0xdd, \n  0xea, 0x95, 0xa1, 0xf6, 0xb7, 0xae, 0x19, 0x00, 0xad, 0x05, 0xa1, 0x72, 0xfd, 0x4f, 0x2b, 0x0a, \n  0xa4, 0x26, 0xf1, 0xc2, 0xdb, 0xf3, 0xcd, 0xc0, 0x06, 0x47, 0xf2, 0xfb, 0xec, 0x8f, 0xf9, 0x47, \n  0x33, 0xfb, 0x0b, 0x18, 0xf8, 0xca, 0x03, 0x00, 0xf0, 0x63, 0xfe, 0x47, 0x6d, 0xff, 0x2f, 0x9f, \n  0x04, 0x32, 0x5c, 0xf9, 0x9b, 0x1e, 0xfa, 0x84, 0x19, 0x03, 0x87, 0x11, 0x00, 0x6c, 0x13, 0xff, \n  0xde, 0xef, 0xff, 0xb0, 0xd0, 0xfe, 0x64, 0xe5, 0x2a, 0xcb, 0x72, 0x1b, 0xf1, 0xc4, 0xfc, 0x1a, \n  0xac, 0x18, 0x29, 0x69, 0xf5, 0x1c, 0xc6, 0xf2, 0xac, 0x13, 0x05, 0xa2, 0xe3, 0xf9, 0x30, 0x1f, \n  0xed, 0xf5, 0x3a, 0xf4, 0xb4, 0xbb, 0x17, 0xcb, 0x72, 0x04, 0x92, 0x0a, 0xfb, 0xf0, 0x6d, 0x0c, \n  0xa9, 0xae, 0xf5, 0x25, 0x99, 0xf2, 0x81, 0xa2, 0x06, 0xc8, 0xdd, 0xfc, 0x89, 0x6c, 0xf8, 0x45, \n  0x74, 0xfc, 0x57, 0x1c, 0xf9, 0x0b, 0x39, 0xff, 0xa5, 0x29, 0xfd, 0x67, 0x10, 0xfd, 0xa1, 0xbf, \n  0x03, 0xb8, 0x5d, 0xfc, 0xdc, 0x31, 0xfb, 0x6c, 0x72, 0x01, 0x73, 0x53, 0xff, 0x8a, 0x86, 0xff, \n  0x8d, 0x19, 0x01, 0x7a, 0xf0, 0xfe, 0x92, 0x76, 0x27, 0xd2, 0x54, 0x18, 0xef, 0xab, 0xfd, 0x55, \n  0xb2, 0x18, 0x1f, 0xd8, 0xf6, 0x70, 0xde, 0xf4, 0x88, 0xb7, 0x04, 0x81, 0x6c, 0xfa, 0x52, 0xd1, \n  0xef, 0xaa, 0x15, 0xf4, 0x30, 0x59, 0x14, 0xa2, 0xb1, 0x04, 0x6a, 0x9a, 0xfa, 0xd8, 0x5a, 0x0b, \n  0x32, 0x46, 0xf8, 0x16, 0xb0, 0xf3, 0xe7, 0x3d, 0x06, 0x61, 0xad, 0xfd, 0x09, 0x17, 0xf9, 0x78, \n  0xb3, 0xfc, 0x4a, 0xe9, 0xf9, 0x84, 0xeb, 0xfe, 0xa2, 0x51, 0xfd, 0xb1, 0xff, 0xfb, 0x44, 0x5e, \n  0x01, 0x29, 0x66, 0xfd, 0xd6, 0x32, 0xfd, 0x6a, 0x8b, 0x01, 0x49, 0x76, 0xfe, 0xb5, 0x23, 0xff, \n  0x4d, 0xc1, 0x01, 0xba, 0x4e, 0xff, 0xeb, 0x27, 0x28, 0xe5, 0x4b, 0x18, 0xd3, 0xfb, 0xf2, 0xb9, \n  0x87, 0x19, 0x57, 0xed, 0x01, 0x5f, 0x32, 0xf1, 0x64, 0xb6, 0xff, 0x6d, 0xc0, 0xfd, 0x90, 0x63, \n  0xf2, 0xa7, 0x3c, 0xf5, 0xca, 0xc7, 0x14, 0x81, 0xc9, 0xfe, 0x7d, 0x52, 0xf6, 0xbf, 0x4b, 0x09, \n  0xc1, 0x72, 0xfd, 0x66, 0x83, 0xf9, 0xa1, 0xfe, 0x08, 0x2c, 0x28, 0x02, 0x5c, 0x39, 0xfc, 0x7b, \n  0x14, 0x00, 0xf3, 0x9e, 0xfb, 0xa7, 0x74, 0xfe, 0xbe, 0xbe, 0xf9, 0xa1, 0x17, 0xf8, 0xc3, 0x72, \n  0xfe, 0x00, 0x28, 0xfd, 0x8c, 0x86, 0xfb, 0xb7, 0x7b, 0xff, 0x9c, 0x52, 0xff, 0xaf, 0x0c, 0x00, \n  0x75, 0x7f, 0x01, 0xa4, 0xde, 0xfe, 0x8b, 0x98, 0x21, 0x5f, 0x07, 0x18, 0xed, 0x42, 0xf9, 0xfd, \n  0x28, 0x16, 0x6e, 0xf8, 0x00, 0x34, 0xb5, 0xf2, 0xe0, 0x29, 0x00, 0x5c, 0x2b, 0xfd, 0x6d, 0xa5, \n  0xf4, 0x76, 0x40, 0xf6, 0x77, 0xa6, 0x0f, 0xd0, 0x30, 0x01, 0xf6, 0xd1, 0xf9, 0xc4, 0xaa, 0x07, \n  0xc6, 0x2f, 0xfd, 0x99, 0xcc, 0xf9, 0xe0, 0x91, 0x06, 0xf8, 0xc6, 0x01, 0x0a, 0x7a, 0xfd, 0xf2, \n  0xc7, 0xff, 0xc3, 0x9b, 0xfb, 0x4a, 0xc7, 0xfe, 0x66, 0x3f, 0xfb, 0x39, 0x7e, 0xf9, 0x6b, 0xc9, \n  0xfe, 0xe7, 0xea, 0xfc, 0x88, 0x06, 0xfc, 0xcc, 0x73, 0xff, 0x38, 0x05, 0xff, 0xab, 0x5a, 0xff, \n  0xe9, 0x13, 0x01, 0x7b, 0x92, 0xff, 0xeb, 0x2f, 0x1c, 0xf3, 0x18, 0x16, 0x7c, 0x45, 0xfd, 0x33, \n  0xd8, 0x13, 0x51, 0x63, 0x01, 0x77, 0xbd, 0xf5, 0x01, 0x35, 0x01, 0x8b, 0x38, 0xfd, 0x3f, 0x71, \n  0xf5, 0x37, 0x6f, 0xf7, 0xc7, 0x6f, 0x0c, 0xdc, 0x9e, 0x01, 0x19, 0xd1, 0xfb, 0x4f, 0x29, 0x06, \n  0x50, 0xd4, 0xfd, 0x3a, 0x61, 0xfa, 0xc9, 0xb5, 0x04, 0x33, 0x03, 0x02, 0xa4, 0x9c, 0xfd, 0x2c, \n  0x7d, 0xff, 0x7b, 0x71, 0xfc, 0xaf, 0x58, 0xfe, 0x0a, 0x8a, 0xfc, 0x51, 0x46, 0xfb, 0x1f, 0xeb, \n  0xfe, 0x3b, 0xbb, 0xfd, 0x42, 0x6b, 0xfc, 0x0c, 0x16, 0xff, 0x33, 0x57, 0xff, 0x64, 0xe3, 0xfe, \n  0x58, 0x1d, 0x00, 0x39, 0x60, 0xff, 0x78, 0x71, 0x17, 0x64, 0xd4, 0x13, 0xb5, 0xba, 0x00, 0x60, \n  0x09, 0x12, 0xf2, 0x6d, 0x01, 0x60, 0x8d, 0xf8, 0x5e, 0xa8, 0x02, 0xa7, 0x33, 0xfd, 0xb0, 0xf8, \n  0xf5, 0x70, 0xc6, 0xf8, 0x7f, 0xf3, 0x09, 0x14, 0x31, 0x02, 0x0e, 0xab, 0xfc, 0x2c, 0xc9, 0x04, \n  0x9f, 0x03, 0xff, 0xaf, 0x4d, 0xfa, 0x0e, 0x3d, 0x03, 0x45, 0x69, 0x02, 0x69, 0xd4, 0xfd, 0xab, \n  0x4a, 0xff, 0xce, 0xef, 0xfc, 0x16, 0x71, 0xfe, 0x1b, 0x41, 0xfd, 0x75, 0xe1, 0xfc, 0x27, 0xf0, \n  0xff, 0x90, 0xfc, 0xfd, 0x10, 0xa9, 0xfc, 0x52, 0x2b, 0xff, 0x04, 0x63, 0xff, 0x9d, 0xa4, 0xfe, \n  0x96, 0x75, 0xff, 0x1a, 0xf3, 0xfe, 0x54, 0x19, 0x14, 0xb0, 0xf3, 0x11, 0x8f, 0x17, 0x02, 0xe9, \n  0x24, 0x10, 0x1f, 0x87, 0x02, 0xf8, 0xe0, 0xfa, 0x1e, 0x87, 0x02, 0x99, 0x8b, 0xfd, 0x50, 0x7f, \n  0xf7, 0xba, 0x47, 0xf9, 0x62, 0x43, 0x08, 0xa4, 0x02, 0x03, 0xbf, 0x61, 0xfc, 0xb0, 0xa9, 0x03, \n  0x72, 0xbb, 0xff, 0xba, 0x95, 0xfa, 0xb2, 0x67, 0x02, 0x56, 0x17, 0x02, 0xb0, 0x2b, 0xfe, 0x5f, \n  0x1b, 0xff, 0xf1, 0x4c, 0xfd, 0x3d, 0xb9, 0xfe, 0x67, 0x87, 0xfe, 0x26, 0x1f, 0xfe, 0x06, 0xe2, \n  0xff, 0x90, 0x4d, 0xfe, 0x37, 0x39, 0xfd, 0x3f, 0x52, 0xff, 0x63, 0xfa, 0xfe, 0x26, 0x2f, 0xfe, \n  0x0f, 0x28, 0xff, 0x20, 0xd2, 0xfe, 0x33, 0xe9, 0x11, 0x0d, 0x7b, 0x10, 0x24, 0x2d, 0x02, 0x20, \n  0x27, 0x0e, 0x13, 0x5a, 0x04, 0xb3, 0xfe, 0xfc, 0x34, 0x21, 0x01, 0xf7, 0x1d, 0xfe, 0xc1, 0xdd, \n  0xf9, 0xee, 0xd6, 0xf9, 0xf2, 0xbe, 0x06, 0xf4, 0x52, 0x03, 0x63, 0x8e, 0xfc, 0xb7, 0x5a, 0x02, \n  0x39, 0xd5, 0xff, 0x9e, 0xd9, 0xfb, 0x1d, 0xc3, 0x01, 0x39, 0x77, 0x01, 0x2b, 0x76, 0xfe, 0x9c, \n  0x18, 0xff, 0x0d, 0x31, 0xfe, 0xdc, 0xcb, 0xff, 0x3c, 0x88, 0xff, 0x98, 0x41, 0xfe, 0xef, 0x80, \n  0xff, 0x86, 0xe9, 0xfe, 0xb3, 0xe1, 0xfd, 0xaa, 0xe7, 0xfe, 0xd6, 0x7b, 0xfe, 0x94, 0x33, 0xfe, \n  0xbe, 0x6b, 0xff, 0xa1, 0xa7, 0xfe, 0x13, 0x13, 0x0f, 0xc3, 0xe5, 0x0e, 0xdf, 0x39, 0x03, 0xdf, \n  0xa3, 0x0c, 0x5d, 0xea, 0x04, 0xd7, 0x82, 0xfe, 0x15, 0xe8, 0x00, 0x9e, 0x87, 0xfe, 0x10, 0x54, \n  0xfb, 0x72, 0xc6, 0xfa, 0x3a, 0x30, 0x05, 0x84, 0xa7, 0x02, 0x66, 0x17, 0xfd, 0x9e, 0x65, 0x01, \n  0x0e, 0xdd, 0xff, 0x34, 0xcc, 0xfc, 0xb3, 0xea, 0x00, 0xcb, 0xf9, 0x00, 0x42, 0xd9, 0xfe, 0xc7, \n  0xfc, 0xff, 0x35, 0x28, 0xff, 0x77, 0xef, 0xff, 0x4d, 0xbd, 0xff, 0xc3, 0x41, 0xfe, 0x24, 0x3e, \n  0xff, 0x50, 0x04, 0xff, 0x95, 0x09, 0xfe, 0x65, 0x80, 0xfe, 0x2b, 0x81, 0xfe, 0x72, 0x95, 0xfe, \n  0x6a, 0x4f, 0xff, 0xb1, 0xa4, 0xfe, 0x4d, 0xd4, 0x0c, 0x55, 0x60, 0x0d, 0x44, 0x2c, 0x04, 0x00, \n  0x44, 0x0b, 0x54, 0x3e, 0x05, 0x75, 0xb8, 0xff, 0xc1, 0xb2, 0x00, 0xf6, 0x2e, 0xff, 0x4d, 0xbd, \n  0xfc, 0x43, 0xd3, 0xfb, 0x85, 0x5b, 0x03, 0x21, 0x18, 0x02, 0x17, 0xe1, 0xfd, 0xae, 0x8a, 0x00, \n  0xb3, 0x08, 0x00, 0x8f, 0x7e, 0xfd, 0x37, 0x63, 0x00, 0x2f, 0x58, 0x01, 0xc7, 0xf9, 0xff, 0x84, \n  0x05, 0x00, 0x42, 0x69, 0xff, 0xf9, 0x64, 0x00, 0x03, 0xa9, 0xff, 0xc1, 0x07, 0xfe, 0xe1, 0xf5, \n  0xfe, 0x31, 0x00, 0xff, 0x44, 0x44, 0xfe, 0x24, 0xd0, 0xfe, 0xfb, 0xc0, 0xfe, 0x4b, 0xc1, 0xfe, \n  0xee, 0x76, 0xff, 0x52, 0xed, 0xfe, 0xf0, 0x87, 0x0a, 0x19, 0xf9, 0x0b, 0x20, 0x23, 0x05, 0x10, \n  0x75, 0x0a, 0x44, 0xe0, 0x04, 0xf8, 0x3d, 0x00, 0x3c, 0x89, 0x01, 0x80, 0xd6, 0xff, 0xed, 0x7f, \n  0xfd, 0xa8, 0x66, 0xfc, 0x2c, 0x26, 0x02, 0xc3, 0x87, 0x01, 0xae, 0xe5, 0xfd, 0x0f, 0x88, 0x00, \n  0x94, 0x7a, 0x00, 0x32, 0xee, 0xfd, 0xe3, 0xdc, 0x00, 0xc0, 0xa6, 0x01, 0x30, 0xc2, 0xff, 0xcf, \n  0x08, 0x00, 0xba, 0xff, 0xff, 0xac, 0x63, 0x00, 0xa8, 0x0f, 0xff, 0x76, 0xa9, 0xfd, 0xcc, 0x0c, \n  0xff, 0xe9, 0x7d, 0xff, 0xf7, 0xa8, 0xfe, 0xba, 0xd1, 0xfe, 0x42, 0xe7, 0xfe, 0x55, 0x40, 0xff, \n  0x72, 0xc3, 0xff, 0xe8, 0x3e, 0xff, 0xd1, 0x3c, 0x09, 0x99, 0x00, 0x0b, 0x84, 0x1c, 0x05, 0x28, \n  0x83, 0x09, 0x34, 0xb9, 0x04, 0x3f, 0x83, 0x00, 0xd9, 0xe3, 0x01, 0x77, 0x86, 0x00, 0x1b, 0x51, \n  0xfe, 0xb4, 0x95, 0xfc, 0x7d, 0x06, 0x01, 0x05, 0x0b, 0x01, 0x13, 0x2e, 0xfe, 0xb5, 0xf3, 0x00, \n  0x23, 0x82, 0x01, 0xa8, 0x95, 0xfe, 0xf2, 0x40, 0x00, 0xa3, 0x55, 0x01, 0xb4, 0xff, 0xff, 0xc3, \n  0x42, 0x00, 0xb2, 0x15, 0x00, 0x63, 0x9a, 0xff, 0x08, 0x61, 0xfe, 0x64, 0x6d, 0xfe, 0x65, 0xb4, \n  0xff, 0x01, 0x7f, 0xff, 0x35, 0xca, 0xfe, 0xc4, 0xfb, 0xfe, 0xa9, 0x6d, 0xff, 0x7e, 0xc8, 0xff, \n  0x66, 0x85, 0xff, 0xbe, 0x88, 0xfe, 0x73, 0xc3, 0x08, 0x09, 0xe7, 0x09, 0x17, 0xc0, 0x04, 0x7a, \n  0xf2, 0x08, 0x0b, 0x11, 0x04, 0x20, 0xe1, 0x00, 0x7c, 0x85, 0x02, 0xf8, 0x0f, 0x01, 0xa8, 0x90, \n  0xfe, 0x30, 0xaa, 0xfc, 0xf0, 0x7e, 0x00, 0xa0, 0xa2, 0x00, 0xca, 0xaa, 0xff, 0x02, 0x52, 0x02, \n  0xc4, 0xec, 0x00, 0xf8, 0x46, 0xfe, 0x73, 0x4f, 0x00, 0x02, 0x2d, 0x01, 0x48, 0x57, 0x00, 0x21, \n  0x1b, 0x00, 0xfe, 0x6d, 0xff, 0x7d, 0x5c, 0xff, 0x53, 0x16, 0xff, 0x7c, 0x3a, 0xff, 0xdc, 0xd6, \n  0xff, 0xbc, 0x9a, 0xff, 0xaa, 0x08, 0xff, 0x6a, 0x85, 0xff, 0x61, 0x92, 0xff, 0xcb, 0x21, 0xff, \n  0x1e, 0xdf, 0xfe, 0x4e, 0x51, 0xfe, 0xfb, 0x60, 0x08, 0x48, 0x18, 0x09, 0xeb, 0x2d, 0x04, 0x26, \n  0x22, 0x08, 0x72, 0xc3, 0x03, 0x84, 0x5b, 0x01, 0x3f, 0x2a, 0x03, 0x2b, 0x24, 0x01, 0x3e, 0xae, \n  0xfe, 0xc4, 0x0e, 0xfd, 0x73, 0x96, 0x00, 0x90, 0xe8, 0x01, 0xdc, 0x72, 0x00, 0x94, 0xcd, 0x01, \n  0xd4, 0xb9, 0x00, 0xf7, 0x4d, 0xfe, 0x90, 0x35, 0x00, 0x1b, 0x44, 0x01, 0x9b, 0x0d, 0x00, 0x3b, \n  0xd2, 0xff, 0x96, 0xe6, 0xff, 0xe1, 0xc5, 0xff, 0x94, 0xac, 0xff, 0xc5, 0x92, 0xff, 0x8c, 0x1d, \n  0x00, 0x2f, 0xfc, 0xff, 0xda, 0x0a, 0xff, 0x7a, 0x0e, 0xff, 0xd9, 0xfc, 0xfe, 0x1c, 0xe3, 0xfe, \n  0xdb, 0xe9, 0xfe, 0xb9, 0xdd, 0xfe, 0xe8, 0xbf, 0x07, 0x88, 0x23, 0x08, 0x00, 0x95, 0x03, 0x96, \n  0x79, 0x07, 0xf8, 0xc2, 0x03, 0x31, 0xe4, 0x01, 0x67, 0x71, 0x03, 0x4c, 0x2e, 0x01, 0x4a, 0x49, \n  0xff, 0x70, 0xbd, 0xfe, 0x00, 0xc0, 0x00, 0xbb, 0x58, 0x01, 0x01, 0x0f, 0x01, 0x1f, 0x83, 0x01, \n  0x63, 0x4f, 0x00, 0x14, 0x5b, 0xfe, 0xac, 0xb2, 0xff, 0x3f, 0x2e, 0x01, 0x82, 0xa3, 0x00, 0xfc, \n  0x6d, 0x00, 0xf5, 0xe7, 0xff, 0x2a, 0xd0, 0xff, 0xa8, 0x33, 0x00, 0x37, 0x4a, 0x00, 0x03, 0x40, \n  0x00, 0x47, 0x1e, 0xff, 0xbc, 0x34, 0xfe, 0x2f, 0xd9, 0xfe, 0x11, 0x31, 0xff, 0x1a, 0x46, 0xff, \n  0xa0, 0x2f, 0xff, 0x66, 0xae, 0xfe, 0x50, 0x55, 0x07, 0x98, 0xea, 0x07, 0xcf, 0xe0, 0x02, 0x47, \n  0x83, 0x05, 0x65, 0xf8, 0x03, 0x11, 0x66, 0x03, 0xe6, 0xc1, 0x03, 0xbc, 0xe0, 0x01, 0x63, 0x5c, \n  0x00, 0x9f, 0xb8, 0xfe, 0x8e, 0xc7, 0x00, 0xf6, 0xe2, 0x01, 0x12, 0xb1, 0x00, 0x30, 0xb5, 0x00, \n  0x4e, 0xad, 0xff, 0x78, 0x5f, 0xfe, 0x60, 0xa2, 0x00, 0x8c, 0xf6, 0x01, 0x71, 0x94, 0x00, 0xf4, \n  0x1e, 0x00, 0xb9, 0x35, 0x00, 0x48, 0xda, 0x00, 0x7a, 0xc2, 0x00, 0x11, 0x7c, 0xff, 0x76, 0xe9, \n  0xfe, 0xec, 0xab, 0xfe, 0x2f, 0xa8, 0xfe, 0xaa, 0x41, 0xff, 0xf1, 0x81, 0xff, 0x8a, 0x1f, 0xff, \n  0xcb, 0xe1, 0xfe, 0x8d, 0xc9, 0xfe, 0xe7, 0xaf, 0x05, 0x7f, 0x3b, 0x07, 0x7d, 0x1b, 0x03, 0x53, \n  0xf8, 0x04, 0xa6, 0x52, 0x04, 0x3c, 0x96, 0x03, 0x52, 0x59, 0x05, 0x45, 0x26, 0x03, 0xe3, 0xa6, \n  0x00, 0x80, 0x36, 0xff, 0xfd, 0xc6, 0xff, 0xe0, 0x4c, 0x01, 0xe4, 0xc1, 0x00, 0xec, 0x30, 0x00, \n  0x60, 0xb2, 0xff, 0x07, 0x88, 0xff, 0x48, 0x11, 0x01, 0x21, 0xff, 0x01, 0xf1, 0xf0, 0x00, 0x66, \n  0x51, 0x00, 0x26, 0xb2, 0x00, 0x64, 0xd7, 0x00, 0xe8, 0xed, 0xff, 0xed, 0xc0, 0xfe, 0xc5, 0xe2, \n  0xfe, 0xef, 0xfd, 0xfe, 0xd9, 0xf7, 0xfe, 0x21, 0x6e, 0xff, 0x5e, 0x4a, 0xff, 0x0e, 0x0b, 0xff, \n  0xc5, 0xe9, 0xfe, 0xe8, 0xe1, 0xfe, 0xcc, 0xe3, 0x04, 0xd6, 0x1f, 0x07, 0x72, 0x02, 0x04, 0xe5, \n  0xe8, 0x04, 0xe7, 0x99, 0x05, 0x1c, 0x3e, 0x04, 0x90, 0x90, 0x03, 0x10, 0x1d, 0x03, 0xd9, 0x56, \n  0x01, 0x95, 0x8f, 0xff, 0xf8, 0x5c, 0xff, 0x1f, 0x88, 0xff, 0xf6, 0xfd, 0xff, 0xdc, 0x4a, 0x01, \n  0xb2, 0x3d, 0x01, 0x1d, 0x54, 0x00, 0xde, 0xff, 0x00, 0x0d, 0x9d, 0x01, 0xab, 0x1e, 0x01, 0xdb, \n  0x6d, 0x00, 0x98, 0x39, 0x00, 0x2e, 0xe4, 0xff, 0x88, 0x34, 0xff, 0xcd, 0xf7, 0xfe, 0x18, 0x18, \n  0xff, 0xdd, 0xf8, 0xfe, 0xc7, 0xed, 0xfe, 0xa8, 0x45, 0xff, 0xc2, 0x73, 0xff, 0x22, 0x2a, 0xff, \n  0x89, 0xdb, 0xfe, 0x14, 0x15, 0xff, 0x7a, 0xf8, 0x03, 0x6f, 0x1f, 0x07, 0xa4, 0x7c, 0x05, 0x1f, \n  0xf2, 0x04, 0xb9, 0x9e, 0x05, 0x51, 0x6a, 0x05, 0x13, 0xe2, 0x03, 0xdb, 0xb6, 0x01, 0xa5, 0x09, \n  0x00, 0xdd, 0x53, 0xff, 0x0d, 0x9c, 0xff, 0xc5, 0x4d, 0x00, 0x6b, 0x79, 0x00, 0x71, 0xc7, 0x00, \n  0xb9, 0x7b, 0x01, 0xed, 0x9f, 0x01, 0x43, 0x50, 0x01, 0x83, 0x2d, 0x01, 0x7b, 0xa3, 0x00, 0x60, \n  0xf7, 0xff, 0xe4, 0x9c, 0xff, 0x5c, 0x84, 0xff, 0xae, 0x55, 0xff, 0x97, 0x19, 0xff, 0x86, 0x32, \n  0xff, 0x08, 0x1d, 0xff, 0x50, 0xd5, 0xfe, 0x13, 0xff, 0xfe, 0x1f, 0x65, 0xff, 0x57, 0x5b, 0xff, \n  0x09, 0x5e, 0xff, 0x09, 0x47, 0xff, 0xe9, 0x17, 0x05, 0x2e, 0x7c, 0x07, 0x6c, 0x86, 0x04, 0xf5, \n  0xf5, 0x05, 0x04, 0xc0, 0x05, 0xfb, 0x11, 0x04, 0x8a, 0x2b, 0x04, 0x01, 0xc8, 0x01, 0x4a, 0xda, \n  0xfe, 0xd2, 0x07, 0xff, 0x4a, 0x8f, 0x00, 0xf2, 0x8f, 0x00, 0x64, 0xb3, 0x00, 0x25, 0x4e, 0x01, \n  0xcd, 0x3f, 0x01, 0x63, 0xdb, 0x01, 0xe5, 0x27, 0x02, 0x7b, 0xae, 0x00, 0x98, 0x6a, 0xff, 0xdd, \n  0x6d, 0xff, 0x9d, 0x9c, 0xff, 0x5a, 0x95, 0xff, 0xf6, 0x88, 0xff, 0x6b, 0x30, 0xff, 0xb8, 0xfb, \n  0xfe, 0x35, 0xf9, 0xfe, 0x23, 0x0a, 0xff, 0xed, 0x74, 0xff, 0x5d, 0x41, 0xff, 0xab, 0x24, 0xff, \n  0x01, 0x80, 0xff, 0x14, 0x78, 0xff, 0xbd, 0x05, 0x05, 0x83, 0x6e, 0x07, 0x26, 0x23, 0x05, 0x92, \n  0x67, 0x05, 0x1a, 0xe4, 0x04, 0x30, 0x9a, 0x03, 0xb7, 0x2b, 0x03, 0x8c, 0x21, 0x02, 0xa1, 0x2e, \n  0x00, 0x62, 0xf9, 0xff, 0x9b, 0xa3, 0x00, 0xab, 0x6f, 0x00, 0x6c, 0x82, 0x00, 0x24, 0x17, 0x01, \n  0x0e, 0xc0, 0x01, 0x05, 0x35, 0x02, 0xa2, 0xd3, 0x01, 0x20, 0x2b, 0x00, 0x2a, 0x5e, 0xff, 0x14, \n  0x69, 0xff, 0x91, 0x54, 0xff, 0x74, 0x91, 0xff, 0xb3, 0x9e, 0xff, 0x24, 0x7d, 0xff, 0xf3, 0x0d, \n  0xff, 0x1f, 0xc6, 0xfe, 0xd2, 0x07, 0xff, 0x11, 0x63, 0xff, 0x71, 0x5c, 0xff, 0x73, 0x69, 0xff, \n  0x90, 0x6a, 0xff, 0x47, 0x51, 0xff, 0xdc, 0x7c, 0x05, 0x7d, 0x31, 0x08, 0x86, 0x0a, 0x04, 0xd0, \n  0x84, 0x03, 0x1d, 0x10, 0x04, 0xea, 0x3c, 0x03, 0xc4, 0xc8, 0x02, 0x34, 0x30, 0x03, 0x19, 0x81, \n  0x01, 0x9e, 0xfd, 0xff, 0x77, 0x02, 0x01, 0x0f, 0x88, 0x00, 0x4f, 0x58, 0x00, 0xc2, 0x71, 0x01, \n  0xe7, 0xbe, 0x01, 0xe5, 0x47, 0x01, 0x40, 0xeb, 0x01, 0xcb, 0x37, 0x01, 0x8d, 0x0e, 0xff, 0xec, \n  0xca, 0xfe, 0xca, 0x8b, 0xff, 0xcf, 0xc7, 0xff, 0xc3, 0x55, 0xff, 0x8e, 0x66, 0xff, 0x55, 0x52, \n  0xff, 0x19, 0x04, 0xff, 0x36, 0xe9, 0xfe, 0x0a, 0x01, 0xff, 0xa9, 0x69, 0xff, 0xac, 0x9f, 0xff, \n  0x4b, 0x78, 0xff, 0xb1, 0x3c, 0xff, 0x6f, 0xb9, 0x05, 0xaa, 0xd7, 0x07, 0x1b, 0x0d, 0x03, 0xb6, \n  0x64, 0x02, 0xbb, 0xc2, 0x02, 0xde, 0x23, 0x03, 0x7c, 0xf9, 0x03, 0xcf, 0x00, 0x03, 0xc0, 0x4f, \n  0x01, 0xb0, 0xa2, 0x01, 0xcf, 0x48, 0x01, 0x61, 0xd9, 0xff, 0xaa, 0xe1, 0x00, 0xb9, 0x9b, 0x01, \n  0x92, 0x8e, 0x01, 0x06, 0xa4, 0x01, 0x0b, 0xaa, 0x01, 0x9a, 0x71, 0x01, 0x2a, 0x70, 0x00, 0xcf, \n  0x38, 0xff, 0x3b, 0xc3, 0xfe, 0x78, 0x61, 0xff, 0x1a, 0xc7, 0xff, 0xbf, 0xde, 0xff, 0x80, 0x43, \n  0xff, 0x94, 0x01, 0xff, 0x39, 0x30, 0xff, 0x1e, 0x03, 0xff, 0x33, 0x1f, 0xff, 0xd1, 0x5f, 0xff, \n  0x51, 0xc0, 0xff, 0x36, 0x8a, 0xff, 0x41, 0xdc, 0x05, 0x6a, 0xbb, 0x07, 0xa0, 0xfe, 0x02, 0x8a, \n  0x84, 0x02, 0xde, 0xa8, 0x02, 0x11, 0x6c, 0x02, 0x2f, 0x8f, 0x02, 0x74, 0x0c, 0x02, 0x2d, 0x53, \n  0x01, 0x78, 0x0f, 0x02, 0xf5, 0x27, 0x02, 0xbc, 0x35, 0x01, 0x0a, 0x7c, 0x00, 0x55, 0xcd, 0x00, \n  0x66, 0x2f, 0x02, 0xd6, 0xd3, 0x01, 0xbc, 0x60, 0x01, 0xb0, 0x77, 0x01, 0xf1, 0x8f, 0x01, 0x50, \n  0x5d, 0x00, 0xd7, 0x90, 0xff, 0xf2, 0x29, 0xff, 0x90, 0xa6, 0xfe, 0xa7, 0xe8, 0xff, 0x52, 0xff, \n  0xff, 0xce, 0x41, 0xff, 0xec, 0x33, 0xff, 0xc3, 0x67, 0xff, 0xb0, 0x0e, 0xff, 0xd4, 0x32, 0xff, \n  0x03, 0x97, 0xff, 0xc9, 0x86, 0xff, 0xfa, 0xeb, 0x05, 0xb2, 0x1d, 0x08, 0x8d, 0xe8, 0x02, 0xea, \n  0x4e, 0x02, 0x31, 0x5a, 0x03, 0x74, 0x13, 0x03, 0xf6, 0x09, 0x02, 0x93, 0x0c, 0x00, 0xc1, 0x0e, \n  0xff, 0x8a, 0x50, 0x02, 0x89, 0xa8, 0x03, 0x74, 0x15, 0x01, 0x07, 0x8b, 0x00, 0x3f, 0x16, 0x01, \n  0xed, 0x60, 0x01, 0x93, 0xca, 0x01, 0x25, 0xf7, 0x01, 0x8e, 0x48, 0x01, 0xfd, 0x66, 0x01, 0xb7, \n  0xc9, 0x01, 0x62, 0xc4, 0x00, 0x78, 0x78, 0xff, 0x1e, 0x41, 0xff, 0x50, 0x1c, 0xff, 0x6f, 0xd6, \n  0xfe, 0x85, 0xe5, 0xff, 0xb6, 0xf4, 0xff, 0x33, 0x44, 0xff, 0xd4, 0x5d, 0xff, 0x6b, 0x41, 0xff, \n  0x07, 0x3d, 0xff, 0x9f, 0x7f, 0xff, 0xf2, 0xef, 0x06, 0x9c, 0xc5, 0x08, 0x44, 0x8b, 0x02, 0x61, \n  0x82, 0x02, 0xae, 0x6a, 0x03, 0xa1, 0x46, 0x03, 0xa4, 0xf4, 0x01, 0x22, 0xaf, 0xfe, 0x64, 0x09, \n  0xfe, 0xf3, 0xa1, 0x01, 0xa0, 0xcd, 0x02, 0x89, 0x4d, 0x01, 0x2a, 0xfd, 0x00, 0xa8, 0x1c, 0x00, \n  0xc9, 0x33, 0x01, 0x13, 0x25, 0x02, 0xa4, 0x26, 0x01, 0x34, 0x4d, 0x01, 0xbf, 0xf0, 0x01, 0xb5, \n  0x1e, 0x01, 0xd3, 0x35, 0x01, 0xaf, 0x6d, 0x01, 0x24, 0x88, 0xff, 0xfd, 0xf6, 0xfe, 0x2f, 0xde, \n  0xfe, 0x0a, 0xc6, 0xfe, 0xa1, 0x8a, 0xff, 0xd6, 0xed, 0xff, 0xe4, 0x93, 0xff, 0x64, 0x3c, 0xff, \n  0xd7, 0x4e, 0xff, 0xda, 0x09, 0xff, 0x43, 0x24, 0x08, 0x50, 0x50, 0x0a, 0xb6, 0xc7, 0x02, 0xc5, \n  0x63, 0x02, 0x96, 0xd1, 0x02, 0xbf, 0xe8, 0x02, 0x4b, 0xeb, 0x01, 0xba, 0x18, 0xfe, 0xf4, 0x19, \n  0xfd, 0xb8, 0xdc, 0x01, 0x6a, 0xf3, 0x02, 0x33, 0xe0, 0xff, 0xed, 0x44, 0x00, 0x7d, 0x53, 0x00, \n  0x49, 0x16, 0x01, 0xe7, 0x71, 0x01, 0xac, 0x17, 0x01, 0x5b, 0x89, 0x01, 0xb9, 0x62, 0x01, 0x75, \n  0x6f, 0x01, 0x41, 0x6a, 0x01, 0xe4, 0xf5, 0x00, 0xa2, 0xdc, 0x00, 0x1d, 0x60, 0x00, 0xbc, 0xad, \n  0xfe, 0x7f, 0xdb, 0xfe, 0x01, 0x5b, 0xff, 0xb3, 0x03, 0xff, 0x76, 0x81, 0xff, 0x14, 0xe7, 0xff, \n  0x9c, 0x8e, 0xff, 0x3f, 0x10, 0xff, 0x64, 0xa4, 0x09, 0x7d, 0xae, 0x0b, 0x0c, 0x8e, 0x02, 0x72, \n  0x94, 0x02, 0x74, 0xcc, 0x02, 0x73, 0xf2, 0x02, 0x8e, 0xa6, 0x01, 0x6d, 0x9b, 0xfc, 0x1f, 0x74, \n  0xfc, 0x33, 0x8c, 0x02, 0x6f, 0x11, 0x03, 0x74, 0x75, 0xff, 0x71, 0x83, 0xff, 0xdd, 0xfb, 0xfe, \n  0x3e, 0xe7, 0x00, 0x72, 0xc3, 0x01, 0x08, 0xd9, 0x00, 0xdb, 0x14, 0x01, 0x80, 0x29, 0x01, 0x91, \n  0xfe, 0x00, 0x96, 0x09, 0x01, 0x05, 0xc0, 0x01, 0x0a, 0xbd, 0x00, 0x03, 0x7a, 0x00, 0xcd, 0x5a, \n  0x00, 0x58, 0x79, 0xff, 0xae, 0xfc, 0xfe, 0x8b, 0xff, 0xfe, 0x9d, 0x3f, 0xff, 0xfd, 0x3d, 0xff, \n  0x0c, 0xb1, 0xff, 0x38, 0x91, 0xff, 0x6e, 0x6a, 0x0b, 0xa6, 0x00, 0x0d, 0x0e, 0x11, 0x02, 0xee, \n  0x0a, 0x03, 0x5c, 0x1c, 0x03, 0x45, 0xf8, 0x02, 0x37, 0x35, 0x01, 0x39, 0x3f, 0xfb, 0xfc, 0xfb, \n  0xfb, 0x74, 0x5a, 0x03, 0x62, 0x02, 0x03, 0xe0, 0xf1, 0xfe, 0xe3, 0x58, 0xff, 0x0e, 0x81, 0xfe, \n  0x61, 0x3e, 0x00, 0x88, 0xff, 0x00, 0x0e, 0x00, 0x01, 0x63, 0x6d, 0x01, 0x12, 0xc2, 0x00, 0xde, \n  0x40, 0x00, 0xd8, 0xc8, 0x00, 0x0f, 0x71, 0x01, 0x76, 0xab, 0x00, 0xcf, 0x28, 0x01, 0x62, 0x17, \n  0x00, 0xb4, 0x56, 0x00, 0xcc, 0x88, 0x00, 0x93, 0x07, 0xff, 0x7c, 0x0d, 0xff, 0x5e, 0x4c, 0xff, \n  0xf4, 0x41, 0xff, 0x62, 0x0e, 0xff, 0x3b, 0x7e, 0x0d, 0x75, 0x94, 0x0e, 0x66, 0x82, 0x01, 0x4e, \n  0x55, 0x03, 0xc9, 0x18, 0x03, 0x19, 0xa8, 0x02, 0xe0, 0xa5, 0x00, 0x43, 0xeb, 0xf9, 0x29, 0x3b, \n  0xfc, 0xad, 0x5e, 0x04, 0xe0, 0x63, 0x02, 0x86, 0x26, 0xfe, 0x4a, 0xf5, 0xfe, 0x39, 0x2e, 0xfe, \n  0xf1, 0x5c, 0x00, 0xb7, 0x9b, 0x00, 0x2a, 0x1e, 0x00, 0x25, 0x60, 0x01, 0xb4, 0xd4, 0x00, 0x64, \n  0xfd, 0xff, 0xf5, 0x43, 0x00, 0xb9, 0xaa, 0x00, 0x87, 0x82, 0x00, 0xdd, 0xbc, 0x00, 0xb9, 0x1c, \n  0x00, 0xdb, 0xbd, 0x00, 0x7c, 0x65, 0x00, 0x60, 0x3c, 0x00, 0x41, 0x13, 0x00, 0xc8, 0x0c, 0xff, \n  0xf9, 0x2c, 0xff, 0x33, 0x03, 0xff, 0x91, 0xc0, 0x0f, 0xee, 0x0a, 0x10, 0xe7, 0xdf, 0x00, 0xc8, \n  0xfc, 0x03, 0xe3, 0x53, 0x03, 0x0c, 0x20, 0x02, 0x19, 0xa3, 0xff, 0x92, 0x8a, 0xf8, 0xb9, 0xfa, \n  0xfc, 0x7f, 0xb5, 0x05, 0x93, 0xb8, 0x01, 0x4c, 0x8f, 0xfd, 0x24, 0x6e, 0xfe, 0x54, 0xa4, 0xfd, \n  0x03, 0x92, 0x00, 0xd1, 0x49, 0x00, 0x43, 0x2d, 0x00, 0xf2, 0x42, 0x01, 0x2e, 0x29, 0x00, 0xde, \n  0xdc, 0xff, 0x23, 0x2f, 0x00, 0xe1, 0x87, 0x00, 0x8e, 0xe9, 0xff, 0xfa, 0x35, 0x00, 0x1a, 0xa7, \n  0xff, 0x0a, 0x76, 0x00, 0x24, 0xcf, 0x00, 0x71, 0x5d, 0x00, 0xba, 0x63, 0x00, 0x58, 0x6f, 0x00, \n  0x6e, 0xce, 0xff, 0x06, 0x6d, 0xfe, 0xcc, 0x17, 0x12, 0x40, 0xa3, 0x11, 0xee, 0x37, 0x00, 0x6b, \n  0xb8, 0x04, 0xe1, 0x84, 0x03, 0x12, 0x65, 0x01, 0xc0, 0x59, 0xfe, 0xc3, 0x42, 0xf7, 0x71, 0x3a, \n  0xfe, 0x53, 0xca, 0x06, 0x98, 0xdc, 0x00, 0x4b, 0x29, 0xfd, 0x83, 0x29, 0xfe, 0xca, 0x2f, 0xfd, \n  0xc9, 0x96, 0x00, 0xe4, 0xc0, 0xff, 0xa2, 0xfc, 0xff, 0x33, 0xc7, 0x01, 0x04, 0xdf, 0xff, 0xc2, \n  0x4d, 0xff, 0x3c, 0xeb, 0xff, 0x47, 0x60, 0x00, 0x97, 0xe1, 0xff, 0x0c, 0xf8, 0xff, 0xe8, 0xa9, \n  0xfe, 0xaf, 0x28, 0x00, 0x2a, 0x8b, 0x00, 0x8f, 0x05, 0x00, 0x48, 0x0f, 0x01, 0x09, 0x4c, 0x00, \n  0x20, 0x10, 0x00, 0xd0, 0xd8, 0xff, 0x7e, 0x2f, 0x14, 0x4e, 0xc5, 0x13, 0x0e, 0xad, 0xff, 0x90, \n  0x17, 0x05, 0xf2, 0x9d, 0x03, 0x27, 0x68, 0x00, 0x32, 0x14, 0xfd, 0xdb, 0x2c, 0xf6, 0x56, 0x9d, \n  0xff, 0x7f, 0x8c, 0x07, 0x51, 0xcc, 0xff, 0xca, 0xe8, 0xfc, 0x47, 0xdc, 0xfd, 0x26, 0x15, 0xfd, \n  0x8b, 0xb3, 0x00, 0x4f, 0xfd, 0xfe, 0x44, 0xa1, 0xff, 0x89, 0x08, 0x02, 0xa2, 0xba, 0xff, 0x70, \n  0x4a, 0xff, 0x67, 0x95, 0xff, 0xb0, 0xd5, 0xff, 0x7e, 0xe0, 0xff, 0x4e, 0xbb, 0xff, 0x55, 0x65, \n  0xfe, 0xbc, 0xb6, 0xff, 0x21, 0xc8, 0xff, 0x81, 0x0d, 0x00, 0xe9, 0x43, 0x00, 0x6a, 0x1e, 0x00, \n  0xfd, 0xe5, 0x00, 0xb4, 0xc4, 0xff, 0xcd, 0x04, 0x16, 0x45, 0x04, 0x16, 0x53, 0x89, 0xff, 0xd8, \n  0x44, 0x05, 0x7f, 0xd8, 0x03, 0xc6, 0x6b, 0xff, 0x1f, 0xbc, 0xfb, 0xda, 0x26, 0xf5, 0xbc, 0x1a, \n  0x01, 0x8f, 0x11, 0x08, 0x71, 0xd5, 0xfe, 0x11, 0xbd, 0xfc, 0x1a, 0x6c, 0xfd, 0x0f, 0x37, 0xfd, \n  0x6f, 0xe9, 0x00, 0x4a, 0x72, 0xfe, 0x3c, 0x2c, 0xff, 0x06, 0x00, 0x02, 0xdd, 0x88, 0xff, 0x6c, \n  0x62, 0xff, 0x81, 0x98, 0xff, 0xe2, 0x70, 0xff, 0x33, 0x99, 0xff, 0xa8, 0x8c, 0xff, 0x60, 0x15, \n  0xfe, 0x2f, 0xb7, 0xff, 0x87, 0xb3, 0xff, 0xde, 0x98, 0xfe, 0xb0, 0x17, 0x00, 0xc2, 0xaa, 0x00, \n  0x01, 0x63, 0x00, 0xac, 0x08, 0x00, 0x71, 0xe8, 0x16, 0x19, 0x9e, 0x18, 0x9c, 0x4f, 0x00, 0xe0, \n  0xca, 0x04, 0x47, 0x6f, 0x04, 0x95, 0x71, 0xfe, 0xfa, 0x8e, 0xfa, 0x3e, 0x4e, 0xf4, 0x5b, 0xd9, \n  0x01, 0x21, 0x8d, 0x08, 0xb3, 0x31, 0xfe, 0x6b, 0xaf, 0xfc, 0x7f, 0xbb, 0xfc, 0x1f, 0x51, 0xfd, \n  0x7b, 0x1f, 0x01, 0xc6, 0x29, 0xfe, 0x20, 0xfc, 0xfe, 0x71, 0xaa, 0x01, 0x39, 0x26, 0xff, 0xd0, \n  0x5d, 0xff, 0xe3, 0xa6, 0xff, 0x8f, 0x56, 0xff, 0xe0, 0x7b, 0xff, 0xc9, 0x02, 0xff, 0x79, 0x3e, \n  0xfe, 0xa7, 0x36, 0xff, 0x00, 0xb9, 0xfe, 0x5a, 0x43, 0xff, 0x43, 0xfd, 0xff, 0x5b, 0xe3, 0xff, \n  0x74, 0x53, 0x00, 0x29, 0xd1, 0xff, 0x71, 0x82, 0x16, 0xdd, 0x49, 0x1b, 0x99, 0xa2, 0x02, 0x8e, \n  0xb7, 0x03, 0x47, 0x1d, 0x05, 0xf8, 0xf6, 0xfd, 0x32, 0x82, 0xf9, 0x59, 0xea, 0xf3, 0x46, 0x72, \n  0x01, 0x2e, 0xdc, 0x08, 0xd0, 0x21, 0xfe, 0xa9, 0xb6, 0xfc, 0x70, 0x20, 0xfc, 0x9c, 0x15, 0xfd, \n  0x90, 0x3d, 0x01, 0x83, 0x19, 0xfe, 0xba, 0xdb, 0xfe, 0x0a, 0x8d, 0x01, 0x5c, 0xd9, 0xfe, 0x18, \n  0xef, 0xfe, 0x94, 0xbb, 0xff, 0xf0, 0x1f, 0xff, 0xf5, 0xa2, 0xff, 0xa1, 0x14, 0xff, 0xe5, 0x25, \n  0xfd, 0x34, 0xe0, 0xfe, 0x22, 0x42, 0xff, 0x34, 0xd9, 0xfe, 0x3c, 0xc9, 0xff, 0xa6, 0xf0, 0xff, \n  0x08, 0x02, 0x00, 0x01, 0x9c, 0xff, 0x9d, 0x89, 0x15, 0x35, 0xff, 0x1c, 0xa7, 0x3c, 0x06, 0xbb, \n  0x08, 0x03, 0xfb, 0x0a, 0x05, 0x1f, 0x3b, 0xfe, 0xfa, 0x71, 0xf8, 0xdc, 0xe5, 0xf3, 0xe2, 0x65, \n  0x00, 0x14, 0x8f, 0x08, 0x4f, 0x70, 0xfe, 0x52, 0xbd, 0xfc, 0x78, 0xd3, 0xfb, 0xcd, 0x8b, 0xfc, \n  0xd8, 0x37, 0x01, 0xef, 0x03, 0xfe, 0x1b, 0xb8, 0xfe, 0xbb, 0x87, 0x01, 0xb0, 0xd1, 0xfe, 0x3a, \n  0x8d, 0xfe, 0xef, 0x3b, 0xff, 0xfc, 0x5f, 0xff, 0xcd, 0xa0, 0xff, 0x7d, 0xf1, 0xfd, 0x5b, 0x61, \n  0xfd, 0xa9, 0x03, 0xff, 0x26, 0xc3, 0xfe, 0xed, 0xc5, 0xfe, 0xab, 0x7e, 0xff, 0x2a, 0xf3, 0xff, \n  0xbe, 0x34, 0x00, 0x55, 0xe6, 0xff, 0x85, 0x2c, 0x15, 0x05, 0x5b, 0x1d, 0x22, 0x63, 0x09, 0xc2, \n  0x3b, 0x04, 0xb9, 0x19, 0x04, 0x1f, 0x96, 0xfe, 0x72, 0xea, 0xf7, 0xb7, 0xbd, 0xf3, 0x79, 0xe2, \n  0xff, 0xb4, 0xa2, 0x07, 0xff, 0x83, 0xfe, 0x96, 0xdb, 0xfc, 0x58, 0xaf, 0xfb, 0x52, 0x34, 0xfc, \n  0xe9, 0x0e, 0x01, 0x9d, 0xbe, 0xfd, 0x58, 0xa8, 0xfe, 0x12, 0x8a, 0x01, 0xbc, 0xef, 0xfe, 0xa3, \n  0x60, 0xfe, 0xb3, 0x4c, 0xff, 0x00, 0x91, 0xfe, 0x5c, 0xee, 0xfe, 0x4a, 0xdf, 0xfe, 0x1b, 0xeb, \n  0xfc, 0xb2, 0x82, 0xfe, 0x7f, 0xaa, 0xfe, 0x02, 0xaa, 0xfe, 0x2a, 0x79, 0xff, 0xa1, 0x22, 0x00, \n  0xca, 0x5f, 0x00, 0x5d, 0x65, 0xff, 0x78, 0x81, 0x15, 0x60, 0x29, 0x1d, 0x21, 0xfa, 0x0a, 0x95, \n  0xc9, 0x06, 0x7c, 0xac, 0x03, 0x6e, 0x06, 0xfe, 0x89, 0x1a, 0xf8, 0xbc, 0xb1, 0xf3, 0x27, 0x7e, \n  0xff, 0x77, 0x9a, 0x06, 0xf1, 0x6c, 0xfe, 0xe0, 0xe5, 0xfc, 0x1a, 0x50, 0xfb, 0x0e, 0x30, 0xfc, \n  0x8e, 0xec, 0x00, 0xab, 0x57, 0xfd, 0xfc, 0x90, 0xfe, 0x7f, 0x7d, 0x01, 0x7d, 0x14, 0xff, 0x10, \n  0x2a, 0xff, 0x12, 0x07, 0xfe, 0x70, 0x15, 0xfe, 0xe2, 0x96, 0xff, 0xc3, 0x61, 0xfe, 0x8c, 0x0a, \n  0xfd, 0x7e, 0x11, 0xfe, 0xb6, 0x3e, 0xfe, 0x11, 0xcc, 0xfe, 0x4b, 0xd9, 0xff, 0x21, 0x1b, 0x00, \n  0xea, 0xc1, 0xff, 0x6c, 0x52, 0xff, 0x73, 0xa3, 0x16, 0xf2, 0x8e, 0x1c, 0x4d, 0x19, 0x0b, 0xd3, \n  0x43, 0x09, 0xcb, 0x83, 0x04, 0x96, 0x45, 0xfd, 0xd5, 0x14, 0xf8, 0xf0, 0xcd, 0xf4, 0xfc, 0x0d, \n  0xff, 0x6d, 0x34, 0x05, 0xe8, 0x3d, 0xfe, 0x61, 0x6a, 0xfd, 0xec, 0x67, 0xfa, 0xfc, 0xf9, 0xfb, \n  0x7f, 0x0d, 0x01, 0x6c, 0xb4, 0xfc, 0xe8, 0x5c, 0xfe, 0xaf, 0xb4, 0x01, 0xd2, 0x4f, 0xff, 0x5f, \n  0x65, 0xfe, 0x7b, 0xbc, 0xfe, 0x04, 0x28, 0xfe, 0x2e, 0xce, 0xfe, 0xba, 0x7b, 0xfe, 0x06, 0x1a, \n  0xfd, 0x05, 0x39, 0xfe, 0x74, 0xbf, 0xfd, 0xb2, 0xf6, 0xfe, 0x05, 0xac, 0xff, 0xab, 0x8d, 0xff, \n  0x1b, 0x2e, 0x00, 0xf2, 0xeb, 0xff, 0x27, 0x15, 0x19, 0xea, 0x77, 0x1b, 0x81, 0x42, 0x0a, 0x30, \n  0x8d, 0x0b, 0xb1, 0x11, 0x05, 0xe9, 0x4c, 0xfd, 0x55, 0x0a, 0xf7, 0x6d, 0x9a, 0xf6, 0x8b, 0x83, \n  0xff, 0x82, 0x91, 0x02, 0x9a, 0xea, 0xfd, 0x4c, 0xa1, 0xfe, 0x9c, 0xcb, 0xf9, 0x67, 0x24, 0xfb, \n  0xa0, 0x51, 0x01, 0xac, 0x89, 0xfb, 0x07, 0x21, 0xff, 0x14, 0x51, 0x01, 0x71, 0x33, 0xfe, 0xab, \n  0x17, 0x00, 0xd6, 0x84, 0xfe, 0xa3, 0xb0, 0xfd, 0x3c, 0x04, 0xff, 0x21, 0x2c, 0xfe, 0x16, 0xfc, \n  0xfc, 0xfd, 0xb6, 0xfe, 0x6c, 0xb0, 0xfd, 0x46, 0x34, 0xfe, 0x3a, 0x3e, 0xff, 0x85, 0x05, 0x00, \n  0x58, 0x98, 0x00, 0x51, 0x5c, 0xff, 0x13, 0x4b, 0x1c, 0x70, 0x38, 0x1a, 0xca, 0x3f, 0x08, 0xab, \n  0x33, 0x0e, 0x01, 0x9b, 0x04, 0x40, 0xf5, 0xfd, 0x59, 0x6c, 0xf6, 0xa7, 0x00, 0xf8, 0xe6, 0x6c, \n  0x01, 0xc0, 0xdc, 0xfe, 0x50, 0xc2, 0xfc, 0x21, 0x65, 0x00, 0x68, 0xd0, 0xf9, 0xdb, 0x21, 0xfa, \n  0x4c, 0xf5, 0x00, 0x87, 0x24, 0xfb, 0xb3, 0x83, 0xfe, 0x49, 0xa4, 0x00, 0xcc, 0xdf, 0xfe, 0x20, \n  0x83, 0x00, 0x06, 0x53, 0xfe, 0x32, 0xdf, 0xfd, 0x40, 0xef, 0xfe, 0x48, 0x28, 0xfe, 0x63, 0xe2, \n  0xfc, 0xb0, 0x21, 0xff, 0x70, 0xf7, 0xfc, 0x00, 0xde, 0xfd, 0x0d, 0xea, 0xff, 0xca, 0xb7, 0xff, \n  0x2a, 0xe2, 0xff, 0x88, 0x78, 0xff, 0x6b, 0xc0, 0x1f, 0x08, 0x8d, 0x19, 0x92, 0xf6, 0x04, 0x2a, \n  0x60, 0x11, 0xdf, 0xe8, 0x03, 0x26, 0xc5, 0xfd, 0x1c, 0x63, 0xf7, 0xff, 0xfe, 0xf8, 0x44, 0x40, \n  0x04, 0x02, 0x87, 0xfb, 0x7f, 0xf2, 0xf9, 0x48, 0x91, 0x02, 0x0a, 0xaf, 0xfa, 0x8f, 0x28, 0xf9, \n  0xe8, 0x53, 0x01, 0x06, 0x05, 0xf9, 0x09, 0x29, 0xfe, 0x8a, 0xc6, 0x01, 0x74, 0x2f, 0xfd, 0x2d, \n  0x09, 0x02, 0xb3, 0xbd, 0xfe, 0xcc, 0x67, 0xfd, 0xa9, 0x24, 0xff, 0x49, 0x74, 0xfe, 0xf0, 0x07, \n  0xfd, 0x50, 0xab, 0xfe, 0x2a, 0x02, 0xfd, 0x3b, 0x1e, 0xfe, 0x74, 0xf1, 0xff, 0x80, 0x38, 0xff, \n  0x45, 0xe4, 0xff, 0x7a, 0x3a, 0xff, 0xad, 0xfd, 0x22, 0x5a, 0xe3, 0x19, 0x0f, 0x6c, 0x00, 0x31, \n  0x30, 0x14, 0x31, 0x12, 0x04, 0xeb, 0xc9, 0xfb, 0xa9, 0x20, 0xf9, 0xcc, 0x69, 0xfa, 0x1e, 0x2e, \n  0x07, 0x6d, 0x4d, 0xf9, 0x07, 0x7d, 0xf5, 0x37, 0xc0, 0x03, 0x7a, 0xab, 0xfc, 0x60, 0x44, 0xf9, \n  0xae, 0xb1, 0xff, 0x4c, 0xeb, 0xf7, 0xfa, 0x58, 0xfe, 0x23, 0x12, 0x01, 0x0a, 0xc0, 0xfc, 0xfa, \n  0xe2, 0x02, 0x44, 0x50, 0xff, 0x2a, 0xee, 0xfc, 0xe8, 0x17, 0xff, 0x3f, 0xda, 0xfe, 0xc3, 0x0f, \n  0xfd, 0xa3, 0xc0, 0xfe, 0xa2, 0xda, 0xfc, 0xa8, 0xd7, 0xfd, 0xd8, 0x36, 0x00, 0xe2, 0x36, 0xff, \n  0xb4, 0x8a, 0xff, 0x09, 0xd3, 0xfe, 0x2c, 0x24, 0x27, 0xec, 0xc4, 0x1a, 0xec, 0x12, 0xfb, 0x5d, \n  0x39, 0x15, 0xf4, 0x3c, 0x05, 0x61, 0x89, 0xf9, 0x09, 0x67, 0xfa, 0x21, 0x61, 0xfc, 0x28, 0x1a, \n  0x0a, 0x9e, 0x99, 0xf8, 0x96, 0x2b, 0xf0, 0xbd, 0x3d, 0x03, 0x6f, 0x7b, 0x00, 0x39, 0x3d, 0xf8, \n  0x2e, 0xdc, 0xfe, 0xce, 0xa2, 0xf7, 0x4a, 0xe7, 0xfc, 0xb0, 0xfc, 0x01, 0x49, 0xb9, 0xfb, 0x38, \n  0x30, 0x03, 0xe0, 0x41, 0x00, 0x6f, 0x6e, 0xfc, 0xed, 0x2b, 0xff, 0x6a, 0xd3, 0xfe, 0x9b, 0x0c, \n  0xfd, 0xdb, 0x3c, 0xff, 0x7a, 0xfa, 0xfc, 0x77, 0x34, 0xfd, 0x8a, 0xb8, 0x00, 0x1a, 0x2d, 0xff, \n  0xf7, 0x31, 0xff, 0x4f, 0x69, 0xfe, 0xd6, 0x61, 0x2c, 0x67, 0x4f, 0x1e, 0x85, 0xba, 0xf3, 0x02, \n  0xa5, 0x11, 0x01, 0x0f, 0x08, 0xfb, 0x2c, 0xfa, 0x61, 0xe0, 0xfb, 0x35, 0x83, 0xfc, 0xe4, 0xd2, \n  0x0b, 0x71, 0xa8, 0xfa, 0xba, 0x65, 0xeb, 0x0d, 0x9f, 0x01, 0x55, 0x98, 0x03, 0x02, 0x29, 0xf8, \n  0x2e, 0x72, 0xfe, 0xc1, 0xd4, 0xf6, 0x7b, 0xb0, 0xfc, 0x8c, 0x60, 0x02, 0x32, 0x7d, 0xfb, 0xdd, \n  0xd9, 0x02, 0xa2, 0xb6, 0x00, 0xfd, 0x01, 0xfd, 0x81, 0xde, 0xfe, 0x86, 0x8f, 0xfe, 0xa5, 0xea, \n  0xfc, 0x5b, 0xe6, 0xff, 0xcf, 0x83, 0xfd, 0x25, 0xfb, 0xfc, 0xb5, 0x7c, 0x00, 0x81, 0x77, 0xff, \n  0x11, 0x0a, 0xff, 0x2f, 0xff, 0xfd, 0x8f, 0xa1, 0x31, 0xff, 0x2a, 0x22, 0xc8, 0x71, 0xec, 0x88, \n  0x2e, 0x0c, 0xb7, 0xd7, 0x0a, 0x76, 0x3b, 0xfc, 0x80, 0x1c, 0xfd, 0xb2, 0xe6, 0xfb, 0x3e, 0x77, \n  0x0c, 0x12, 0x38, 0xfd, 0x3a, 0x77, 0xe8, 0x24, 0x7e, 0xfe, 0xd6, 0x2f, 0x05, 0x01, 0xc4, 0xf9, \n  0xb2, 0x8a, 0xfd, 0xa7, 0x81, 0xf6, 0x79, 0x53, 0xfc, 0x75, 0x35, 0x02, 0xc0, 0xc0, 0xfb, 0x19, \n  0x5a, 0x02, 0x2b, 0x18, 0x01, 0xd2, 0x25, 0xfd, 0xb7, 0x58, 0xfe, 0x21, 0x3f, 0xfe, 0x6c, 0x28, \n  0xfd, 0xed, 0x15, 0x00, 0x3c, 0xc7, 0xfd, 0x93, 0xe6, 0xfc, 0x22, 0x1b, 0x00, 0x94, 0xf7, 0xff, \n  0xa5, 0x16, 0xff, 0xb8, 0x4a, 0xfd, 0xa7, 0xa5, 0x36, 0x9e, 0xef, 0x25, 0x8a, 0xf3, 0xe5, 0xe4, \n  0x7f, 0x06, 0x18, 0xa0, 0x0c, 0x7b, 0x84, 0xff, 0xb1, 0x51, 0xfe, 0xb3, 0x18, 0xfb, 0x58, 0x93, \n  0x0c, 0x0f, 0x14, 0x00, 0x47, 0x07, 0xe7, 0x23, 0xf0, 0xfa, 0x47, 0x92, 0x05, 0xdd, 0x3c, 0xfc, \n  0xc1, 0x1c, 0xfd, 0x85, 0x0d, 0xf6, 0xac, 0xa3, 0xfc, 0x5e, 0x7b, 0x01, 0xc4, 0xed, 0xfb, 0xda, \n  0x74, 0x02, 0x79, 0x09, 0x01, 0x7e, 0x0e, 0xfd, 0xb4, 0x34, 0xfe, 0xf4, 0x14, 0xfe, 0x22, 0x51, \n  0xfd, 0x42, 0xf7, 0xff, 0x6d, 0xa7, 0xfd, 0x16, 0x5c, 0xfd, 0x94, 0x00, 0x00, 0xc5, 0x48, 0x00, \n  0x50, 0xe3, 0xfe, 0x18, 0xbc, 0xfc, 0x0c, 0xe2, 0x3c, 0xca, 0xeb, 0x26, 0xfe, 0x5a, 0xe0, 0xa8, \n  0x95, 0x02, 0x98, 0x6e, 0x0c, 0xb2, 0x0e, 0x03, 0x4d, 0xd2, 0xfe, 0xfa, 0xc1, 0xf9, 0xab, 0xa1, \n  0x0d, 0xfd, 0xc3, 0x02, 0xb1, 0x0a, 0xe5, 0x22, 0xd1, 0xf7, 0x50, 0xb8, 0x05, 0x12, 0xea, 0xfd, \n  0xc8, 0xd9, 0xfd, 0x7b, 0x51, 0xf5, 0x84, 0x54, 0xfd, 0xf5, 0x06, 0x00, 0x56, 0xb8, 0xfb, 0x42, \n  0x50, 0x03, 0xae, 0x6d, 0x00, 0xca, 0xbf, 0xfc, 0xcc, 0x3d, 0xfe, 0xd8, 0x21, 0xfe, 0x9c, 0x9a, \n  0xfc, 0x45, 0xec, 0xff, 0xe4, 0x93, 0xfd, 0xcd, 0xdf, 0xfd, 0xde, 0xc0, 0xff, 0x96, 0x16, 0x00, \n  0xd9, 0xf5, 0xfe, 0x03, 0x81, 0xfc, 0xd3, 0x4a, 0x42, 0x49, 0xf2, 0x27, 0xe8, 0xca, 0xdb, 0xf1, \n  0xa8, 0x00, 0xa0, 0x2d, 0x0b, 0x78, 0xec, 0x05, 0x9e, 0x32, 0xff, 0xaf, 0xf8, 0xf7, 0x83, 0xd1, \n  0x10, 0x29, 0xcf, 0x05, 0x79, 0xef, 0xe1, 0xc2, 0xd0, 0xf5, 0x43, 0x12, 0x06, 0x30, 0x79, 0xfe, \n  0x5d, 0x61, 0x00, 0xec, 0x35, 0xf5, 0xdc, 0xc9, 0xfc, 0x0a, 0xff, 0xfe, 0xd8, 0xdb, 0xfb, 0xce, \n  0x2d, 0x04, 0x8c, 0x9b, 0xff, 0xb3, 0xc8, 0xfc, 0x6e, 0xb3, 0xfe, 0x1c, 0x10, 0xfe, 0x8f, 0x8f, \n  0xfb, 0xf9, 0x40, 0x00, 0x87, 0xc6, 0xfd, 0x93, 0xdb, 0xfd, 0xfb, 0xae, 0xff, 0x80, 0x16, 0x00, \n  0xdd, 0x52, 0xff, 0x75, 0x39, 0xfc, 0x1e, 0xf4, 0x46, 0x76, 0x6a, 0x28, 0x50, 0xee, 0xd7, 0x86, \n  0x76, 0x00, 0xb9, 0xb2, 0x08, 0x33, 0x44, 0x07, 0xc9, 0x2b, 0xff, 0xcc, 0x78, 0xf5, 0xac, 0xe4, \n  0x15, 0x68, 0x56, 0x07, 0x05, 0xa5, 0xde, 0x4e, 0x42, 0xf5, 0x1b, 0xa8, 0x04, 0xa0, 0x1f, 0xff, \n  0x4f, 0x55, 0x03, 0x82, 0x33, 0xf5, 0xa8, 0x56, 0xfb, 0xdb, 0x6f, 0xfe, 0x55, 0x23, 0xfc, 0x5e, \n  0xef, 0x03, 0xfa, 0xdd, 0xfe, 0x73, 0x0e, 0xfd, 0xb1, 0x3d, 0xff, 0x45, 0x95, 0xfd, 0x88, 0xa0, \n  0xfa, 0x28, 0x20, 0x00, 0x5a, 0xfe, 0xfd, 0xf4, 0xba, 0xfd, 0x9e, 0x86, 0xff, 0x9d, 0x3b, 0x00, \n  0x85, 0x32, 0xff, 0xb6, 0x1d, 0xfc, 0xb5, 0xeb, 0x4a, 0xaf, 0xca, 0x28, 0xd3, 0x0a, 0xd5, 0xda, \n  0x6f, 0x01, 0xac, 0xbe, 0x05, 0x97, 0x87, 0x07, 0x99, 0xc5, 0xfe, 0x39, 0x32, 0xf3, 0x65, 0x7b, \n  0x1b, 0x47, 0xce, 0x07, 0xd8, 0x09, 0xdd, 0xc5, 0x09, 0xf5, 0x7a, 0x3c, 0x02, 0x7d, 0x3d, 0x00, \n  0xb6, 0xcb, 0x05, 0xc3, 0xc0, 0xf5, 0xf8, 0xbe, 0xf9, 0x7d, 0xa7, 0xfe, 0x93, 0x04, 0xfc, 0xd4, \n  0xbb, 0x02, 0xdb, 0xdc, 0xfe, 0x9d, 0x8c, 0xfd, 0xd9, 0xa3, 0xff, 0x24, 0x00, 0xfd, 0xb1, 0xea, \n  0xf9, 0x2d, 0xd0, 0xff, 0x73, 0x63, 0xfe, 0x8b, 0x8c, 0xfd, 0xac, 0x84, 0xff, 0x8e, 0x1c, 0x00, \n  0xdf, 0x1c, 0xff, 0xc7, 0x7f, 0xfc, 0xb3, 0x06, 0x4f, 0x5c, 0x8f, 0x28, 0x1a, 0x33, 0xd3, 0xfc, \n  0xc3, 0x02, 0x2e, 0x9d, 0x02, 0xc2, 0xc5, 0x07, 0x29, 0xa1, 0xfd, 0xbc, 0xc4, 0xf1, 0xf8, 0x0b, \n  0x20, 0x6a, 0x03, 0x08, 0xd1, 0xa2, 0xdd, 0xb4, 0x34, 0xf4, 0x61, 0x19, 0x00, 0x56, 0xf4, 0x00, \n  0x61, 0xf3, 0x07, 0xd5, 0xcc, 0xf6, 0x2b, 0x7f, 0xf8, 0xb3, 0x5f, 0xff, 0x21, 0x6d, 0xfb, 0x3e, \n  0x10, 0x01, 0xef, 0x5b, 0xff, 0x5a, 0x7e, 0xfe, 0x9d, 0x76, 0xff, 0x78, 0x87, 0xfc, 0x4e, 0x84, \n  0xf9, 0x01, 0xad, 0xff, 0x58, 0xcf, 0xfe, 0xa1, 0x5a, 0xfd, 0x8d, 0x55, 0xff, 0xb1, 0x54, 0x00, \n  0x1e, 0x48, 0xff, 0x75, 0x57, 0xfc, 0x1b, 0x62, 0x51, 0x97, 0x0a, 0x2a, 0xdf, 0x9a, 0xd1, 0xb7, \n  0x3e, 0x03, 0x09, 0xe8, 0xff, 0x93, 0xd7, 0x07, 0x47, 0x2c, 0xfc, 0x8f, 0x89, 0xf0, 0xb9, 0x19, \n  0x22, 0x18, 0x30, 0x09, 0x63, 0xe5, 0xdf, 0xde, 0x68, 0xf2, 0xc3, 0x58, 0xfe, 0xcf, 0xb3, 0x00, \n  0x25, 0xd2, 0x09, 0xd8, 0x17, 0xf8, 0xb7, 0x61, 0xf7, 0xe5, 0x51, 0x00, 0x17, 0x52, 0xfa, 0x0e, \n  0x36, 0xff, 0x8b, 0xee, 0xff, 0x32, 0x8a, 0xff, 0x00, 0xad, 0xfe, 0xe8, 0x60, 0xfc, 0x8a, 0x12, \n  0xf9, 0xd6, 0xb6, 0xff, 0x56, 0x4a, 0xff, 0xf2, 0x8a, 0xfc, 0x95, 0x7a, 0xff, 0x2b, 0xcd, 0x00, \n  0x62, 0xf6, 0xfe, 0xb3, 0xcc, 0xfb, 0x90, 0xcd, 0x53, 0x14, 0xfd, 0x2a, 0x7e, 0x1a, 0xd1, 0xdb, \n  0xe7, 0x02, 0x23, 0x86, 0xfd, 0x16, 0x57, 0x08, 0x5f, 0x0d, 0xfa, 0xfb, 0xd6, 0xef, 0xa0, 0x7d, \n  0x22, 0xa9, 0xa8, 0x0a, 0x09, 0x38, 0xe3, 0x02, 0x83, 0xf0, 0xf9, 0x05, 0xfd, 0xc0, 0xb2, 0xff, \n  0xa0, 0xbd, 0x0b, 0x01, 0x37, 0xf9, 0x32, 0xc4, 0xf6, 0x12, 0x25, 0x01, 0xad, 0x37, 0xf9, 0xac, \n  0x84, 0xfd, 0x21, 0x78, 0x00, 0x0a, 0x32, 0x00, 0x12, 0x0b, 0xfe, 0x8a, 0x89, 0xfc, 0xcd, 0x51, \n  0xf8, 0x75, 0x48, 0x00, 0x8c, 0x60, 0xff, 0xeb, 0xe0, 0xfb, 0x7a, 0x10, 0x00, 0x3d, 0xb1, 0x00, \n  0x22, 0x7c, 0xfe, 0x39, 0x92, 0xfb, 0xe4, 0xbf, 0x55, 0x01, 0xb0, 0x2b, 0xe3, 0xb6, 0xd1, 0x66, \n  0xfb, 0x01, 0x05, 0xa6, 0xfb, 0x85, 0xad, 0x08, 0xe7, 0x24, 0xf8, 0x41, 0x0d, 0xef, 0xbe, 0x44, \n  0x21, 0x4d, 0xe3, 0x0c, 0xa9, 0xb7, 0xe6, 0x25, 0x0f, 0xef, 0x9f, 0x0c, 0xfc, 0x1e, 0x3e, 0xfe, \n  0x9a, 0x5c, 0x0d, 0xe7, 0x34, 0xfa, 0x62, 0xa8, 0xf6, 0x57, 0x6f, 0x01, 0xf1, 0x7a, 0xf8, 0x6c, \n  0x39, 0xfc, 0x00, 0xaa, 0x00, 0xa5, 0x76, 0x00, 0x2c, 0xa4, 0xfd, 0xaa, 0xf9, 0xfc, 0xcd, 0xc4, \n  0xf7, 0x76, 0x69, 0x00, 0x18, 0x75, 0xff, 0x46, 0xf3, 0xfb, 0x3d, 0x08, 0x00, 0xb1, 0x2a, 0x00, \n  0x70, 0x4a, 0xfe, 0x67, 0x6d, 0xfb, 0xdb, 0xfd, 0x55, 0xde, 0xf0, 0x2d, 0x91, 0xed, 0xd2, 0x82, \n  0x81, 0x00, 0xac, 0x4f, 0xfa, 0xc3, 0xfd, 0x07, 0x56, 0x20, 0xf8, 0x3c, 0xc0, 0xec, 0x8b, 0xb7, \n  0x1e, 0x1a, 0x8a, 0x10, 0xa3, 0xb9, 0xe9, 0xde, 0x89, 0xee, 0x98, 0xfd, 0xfa, 0x59, 0xd3, 0xfc, \n  0x5f, 0x48, 0x0e, 0xc7, 0x5f, 0xfb, 0xcf, 0x05, 0xf7, 0x12, 0xfe, 0x00, 0x6b, 0x1b, 0xf8, 0x2a, \n  0x7d, 0xfb, 0x37, 0x77, 0x00, 0x99, 0x60, 0x00, 0x9e, 0x65, 0xfd, 0x9d, 0xc0, 0xfd, 0x3f, 0x7e, \n  0xf7, 0xd1, 0xbf, 0xff, 0x4d, 0x08, 0x00, 0xd8, 0xfa, 0xfb, 0xcc, 0x81, 0xff, 0x71, 0xda, 0xff, \n  0x1c, 0xf7, 0xfd, 0xa4, 0xd4, 0xfb, 0x02, 0x88, 0x54, 0x13, 0x1f, 0x31, 0x2c, 0x46, 0xd5, 0x2a, \n  0x29, 0xff, 0x2e, 0x09, 0xf9, 0xb3, 0x30, 0x06, 0xdd, 0x25, 0xfa, 0xda, 0xbd, 0xe8, 0x1b, 0x53, \n  0x1b, 0x7d, 0x53, 0x15, 0x36, 0x1a, 0xec, 0x6e, 0x30, 0xef, 0x10, 0xdb, 0xf9, 0x38, 0x5a, 0xfb, \n  0x96, 0x57, 0x0e, 0x00, 0xf3, 0xfc, 0xb4, 0xe5, 0xf7, 0x7e, 0xe1, 0xff, 0x9e, 0xea, 0xf7, 0x3e, \n  0x3f, 0xfb, 0x33, 0x5e, 0x00, 0x94, 0x9a, 0xff, 0x61, 0xa7, 0xfd, 0x00, 0x7b, 0xfe, 0xd4, 0x51, \n  0xf7, 0xff, 0x32, 0xff, 0x52, 0xdd, 0xff, 0xa8, 0x30, 0xfc, 0xe8, 0x0e, 0xff, 0x31, 0x65, 0xff, \n  0x07, 0x38, 0xfe, 0xe0, 0xd5, 0xfc, 0xaa, 0x9b, 0x51, 0xf1, 0x90, 0x34, 0xac, 0xe1, 0xd8, 0x92, \n  0x70, 0xfe, 0x3d, 0x97, 0xf7, 0x32, 0xd4, 0x03, 0xf6, 0x45, 0xfd, 0xe9, 0x65, 0xe3, 0x35, 0x80, \n  0x17, 0x9a, 0xb7, 0x1a, 0x8d, 0x2f, 0xee, 0x4d, 0x84, 0xf0, 0x20, 0x66, 0xf9, 0x9a, 0x8f, 0xf9, \n  0x71, 0x90, 0x0d, 0xf4, 0x21, 0xff, 0x63, 0xee, 0xf8, 0xf3, 0x73, 0xfe, 0x98, 0xa1, 0xf7, 0xf6, \n  0xc6, 0xfb, 0x37, 0x21, 0x00, 0x3a, 0x86, 0xfe, 0x0a, 0x1c, 0xfe, 0xec, 0x0c, 0xff, 0xd3, 0x57, \n  0xf7, 0x9d, 0x4c, 0xfe, 0x5f, 0xa6, 0xff, 0xd9, 0x44, 0xfc, 0x10, 0xaa, 0xfe, 0x07, 0xb7, 0xff, \n  0xf8, 0xda, 0xfe, 0xc4, 0x72, 0xfd, 0x45, 0x67, 0x4d, 0x72, 0x8b, 0x37, 0xa7, 0x2b, 0xde, 0x0f, \n  0x2f, 0xfe, 0xf5, 0xb0, 0xf5, 0x54, 0xa3, 0x01, 0xd1, 0x53, 0x00, 0xac, 0x02, 0xde, 0x21, 0xbb, \n  0x12, 0xdb, 0xd1, 0x1f, 0xcb, 0xa2, 0xf0, 0x44, 0x19, 0xf2, 0xf4, 0x1d, 0xfa, 0xbd, 0x04, 0xf7, \n  0xcd, 0xfb, 0x0b, 0xb4, 0xd5, 0x01, 0xab, 0xb3, 0xf9, 0xca, 0xfe, 0xfc, 0x95, 0xe2, 0xf7, 0xde, \n  0xf1, 0xfb, 0xdf, 0x1e, 0x00, 0x95, 0x7f, 0xfd, 0xef, 0xfe, 0xfd, 0x0f, 0xc6, 0xff, 0x73, 0xd4, \n  0xf6, 0x00, 0xef, 0xfd, 0x07, 0xea, 0xfe, 0x9a, 0x32, 0xfc, 0x1b, 0x67, 0xff, 0x5f, 0x09, 0x00, \n  0xd0, 0x4d, 0xff, 0x1a, 0x34, 0xfe, 0x95, 0x8b, 0x48, 0x26, 0x23, 0x3a, 0x1b, 0xb6, 0xe4, 0x5c, \n  0xff, 0xfd, 0xcc, 0xa0, 0xf3, 0xe6, 0x50, 0x00, 0x63, 0xc1, 0x02, 0x4c, 0x3b, 0xda, 0x28, 0x5f, \n  0x0c, 0x3f, 0xce, 0x23, 0xb5, 0xbf, 0xf4, 0xcb, 0x04, 0xf3, 0x3e, 0xdc, 0xfc, 0x03, 0xae, 0xf3, \n  0x17, 0x01, 0x0a, 0xb4, 0xc1, 0x04, 0x42, 0xf4, 0xf9, 0x03, 0xc8, 0xfc, 0xda, 0xfc, 0xf7, 0xbd, \n  0xee, 0xfb, 0x90, 0x2b, 0x00, 0x62, 0x4d, 0xfd, 0x47, 0x61, 0xfc, 0x09, 0x93, 0x00, 0x75, 0x45, \n  0xf7, 0x07, 0x86, 0xfc, 0x80, 0x01, 0xff, 0x6c, 0xab, 0xfc, 0xa7, 0x27, 0x00, 0x8a, 0x67, 0x00, \n  0x99, 0x32, 0x00, 0x91, 0x8a, 0xfe, 0x18, 0x0a, 0x44, 0x73, 0xb9, 0x3b, 0xe3, 0x7a, 0xea, 0xf3, \n  0x0d, 0xfe, 0xb0, 0xfe, 0xf2, 0x7e, 0x66, 0xfe, 0xa1, 0x25, 0x03, 0x70, 0xe7, 0xd9, 0x2d, 0xc1, \n  0x04, 0x52, 0xd5, 0x24, 0x8c, 0x6a, 0xfb, 0x31, 0xb3, 0xf2, 0x08, 0x31, 0x00, 0x93, 0x38, 0xf1, \n  0xa6, 0x86, 0x06, 0x44, 0x28, 0x08, 0xbf, 0xbe, 0xf9, 0x37, 0x3a, 0xfd, 0xba, 0x51, 0xf8, 0x61, \n  0xd6, 0xfa, 0x6f, 0x8c, 0x00, 0xad, 0x06, 0xfd, 0xbc, 0x5f, 0xfa, 0x47, 0xf7, 0x00, 0x6f, 0x74, \n  0xf7, 0xbd, 0x10, 0xfc, 0x0a, 0xb8, 0xff, 0x54, 0x6c, 0xfc, 0xa9, 0x22, 0x01, 0xcb, 0x5c, 0x01, \n  0xd0, 0x30, 0x00, 0xa5, 0x01, 0xfe, 0x5a, 0xcb, 0x40, 0xb7, 0xfe, 0x3b, 0x4b, 0xb4, 0xed, 0xc2, \n  0xd5, 0xfe, 0x79, 0x3c, 0xf5, 0x0e, 0xe9, 0xfa, 0x2a, 0xaf, 0x00, 0x1c, 0xee, 0xdc, 0x83, 0x8e, \n  0xfd, 0x40, 0xfe, 0x22, 0x51, 0xee, 0x02, 0xce, 0x41, 0xf2, 0x0d, 0x9c, 0x02, 0xb1, 0x4c, 0xf0, \n  0x36, 0x67, 0x02, 0x7a, 0xf3, 0x0a, 0x0d, 0x53, 0xfa, 0x3c, 0x3b, 0xfd, 0xc8, 0x51, 0xf9, 0xb7, \n  0xc2, 0xf8, 0xad, 0x8d, 0xff, 0x6a, 0x2c, 0xfe, 0xcd, 0x25, 0xf8, 0xee, 0xc4, 0xff, 0x3f, 0x0b, \n  0xf9, 0xb0, 0x0d, 0xfc, 0x75, 0x3f, 0x00, 0xd9, 0x57, 0xfc, 0x8c, 0xe1, 0x01, 0x19, 0xca, 0x01, \n  0x65, 0xcb, 0xff, 0x95, 0xdb, 0xfd, 0x2a, 0xb5, 0x3f, 0x9c, 0x60, 0x39, 0x86, 0x96, 0xef, 0xf3, \n  0x95, 0x01, 0x17, 0x0b, 0xf8, 0xd0, 0xf1, 0xf7, 0xea, 0x5c, 0xfc, 0xda, 0x43, 0xe1, 0xe7, 0x1f, \n  0xf8, 0x72, 0xe9, 0x20, 0xb5, 0x3e, 0x08, 0xbf, 0x99, 0xf2, 0x12, 0x1f, 0x05, 0x6d, 0xda, 0xee, \n  0x69, 0x47, 0x00, 0x13, 0x51, 0x0c, 0x22, 0xa3, 0xfb, 0x03, 0xd7, 0xfd, 0x49, 0x70, 0xf9, 0xe0, \n  0xb2, 0xf6, 0x5a, 0x08, 0xff, 0xad, 0x37, 0xfe, 0x7c, 0x6a, 0xf6, 0xfd, 0x2d, 0x00, 0xfc, 0xa9, \n  0xf9, 0x74, 0x9b, 0xfc, 0xc4, 0xed, 0x00, 0xb7, 0x1c, 0xfc, 0x95, 0x5b, 0x02, 0x6f, 0xe7, 0x01, \n  0x14, 0x79, 0xff, 0xa4, 0xb6, 0xfd, 0xbb, 0xf0, 0x3e, 0x4e, 0x53, 0x36, 0x37, 0x3c, 0xf0, 0x58, \n  0x2f, 0x05, 0x1a, 0xea, 0xfa, 0xf0, 0x85, 0xf4, 0x9c, 0xbb, 0xf8, 0x88, 0xb8, 0xe6, 0xb2, 0x8c, \n  0xf2, 0x2b, 0x8e, 0x1e, 0x60, 0xa7, 0x0d, 0xc4, 0xa5, 0xf0, 0x44, 0x82, 0x08, 0x4c, 0xff, 0xee, \n  0x62, 0x20, 0xfd, 0xdd, 0xac, 0x0e, 0x5b, 0xb3, 0xfc, 0xff, 0xa5, 0xfd, 0x25, 0xc3, 0xf9, 0x60, \n  0x4f, 0xf6, 0x7a, 0xe0, 0xfc, 0xe4, 0xcb, 0xfd, 0x96, 0xf7, 0xf5, 0xa4, 0xae, 0x00, 0x33, 0x23, \n  0xfb, 0xbe, 0xc4, 0xfb, 0xe2, 0x7a, 0x01, 0x52, 0x9a, 0xfc, 0x38, 0x81, 0x02, 0xea, 0x5e, 0x01, \n  0x34, 0x32, 0xff, 0xe1, 0x7d, 0xfe, 0x05, 0x82, 0x3f, 0x94, 0xed, 0x32, 0x48, 0xed, 0xee, 0x6f, \n  0x21, 0x08, 0x57, 0x4d, 0xfd, 0x01, 0xbe, 0xf1, 0x07, 0x92, 0xf6, 0x09, 0x29, 0xed, 0x74, 0x35, \n  0xef, 0xe7, 0xcc, 0x18, 0x2a, 0xa0, 0x13, 0xc6, 0xd8, 0xed, 0x9c, 0x1c, 0x09, 0xa2, 0xdd, 0xf3, \n  0x62, 0xe1, 0xf7, 0xc6, 0x9b, 0x11, 0x5a, 0xcd, 0xfd, 0x9d, 0x97, 0xfb, 0xcf, 0x2d, 0xfc, 0xf9, \n  0xb7, 0xf5, 0x0b, 0xcd, 0xfa, 0xde, 0x81, 0xfd, 0x46, 0xbe, 0xf5, 0x39, 0xcd, 0x00, 0x59, 0x7d, \n  0xfd, 0xf1, 0x0b, 0xfa, 0x51, 0x9d, 0x01, 0x3c, 0xbe, 0xfd, 0x58, 0x62, 0x01, 0xf3, 0xd7, 0x01, \n  0xaa, 0x0c, 0xff, 0x47, 0xbd, 0xfe, 0x38, 0x74, 0x3e, 0xdc, 0x8f, 0x30, 0xba, 0xf3, 0xed, 0xb4, \n  0x33, 0x0b, 0x7b, 0x0b, 0xff, 0x22, 0xd5, 0xef, 0xd1, 0x6f, 0xf5, 0x49, 0x30, 0xf1, 0xc9, 0xe0, \n  0xed, 0xe9, 0x48, 0x12, 0xbc, 0x1f, 0x19, 0xa6, 0x0f, 0xee, 0x15, 0x05, 0x05, 0xb1, 0x60, 0xfa, \n  0x01, 0x5f, 0xf4, 0xbe, 0x16, 0x11, 0xe0, 0x46, 0x02, 0xb8, 0xc8, 0xf8, 0x08, 0x45, 0xfd, 0x4e, \n  0xbb, 0xf6, 0xf0, 0x71, 0xf9, 0x41, 0x5f, 0xfd, 0xa6, 0x25, 0xf5, 0x04, 0x4f, 0x00, 0x45, 0x0c, \n  0xff, 0xfd, 0x9e, 0xf9, 0xc7, 0xca, 0x00, 0xf3, 0x5b, 0xfe, 0x90, 0xd8, 0x00, 0x55, 0x30, 0x02, \n  0xed, 0x8c, 0xff, 0xe3, 0x68, 0xfe, 0x82, 0x5a, 0x3d, 0xb1, 0xbe, 0x2c, 0x5b, 0xb5, 0xed, 0xe0, \n  0x16, 0x0f, 0x3d, 0xa3, 0xfe, 0x19, 0x4a, 0xef, 0x8e, 0xcf, 0xf6, 0x42, 0x5d, 0xf2, 0x8a, 0xe4, \n  0xec, 0x79, 0x1b, 0x0e, 0x6d, 0xdc, 0x1b, 0xb4, 0x15, 0xef, 0x15, 0xab, 0x01, 0x39, 0xac, 0xfc, \n  0x79, 0x0a, 0xf5, 0xa0, 0xe7, 0x0f, 0x9b, 0xac, 0x04, 0x1b, 0x60, 0xf8, 0x6a, 0x15, 0xfd, 0xa7, \n  0x7f, 0xf8, 0x8f, 0x74, 0xf8, 0x77, 0x56, 0xfe, 0xe2, 0xb3, 0xf4, 0xfc, 0x9f, 0xfd, 0x39, 0xcc, \n  0xff, 0x50, 0x66, 0xfa, 0xa9, 0x86, 0x00, 0xc2, 0x2f, 0xfe, 0x47, 0x62, 0x00, 0xbb, 0x35, 0x02, \n  0xeb, 0xec, 0xff, 0xc2, 0xa9, 0xfe, 0x04, 0x32, 0x3c, 0xff, 0xc0, 0x29, 0xc2, 0xe6, 0xec, 0xca, \n  0x28, 0x12, 0x62, 0x20, 0xfd, 0x9f, 0xe6, 0xed, 0x5e, 0xef, 0xfa, 0x58, 0xfb, 0xf4, 0xb6, 0x7f, \n  0xea, 0x3b, 0x26, 0x09, 0xe1, 0x5a, 0x1f, 0x63, 0xf3, 0xee, 0xb0, 0xbb, 0xfd, 0x63, 0x9e, 0x01, \n  0x27, 0xe8, 0xf3, 0x65, 0x7d, 0x0d, 0x99, 0xe1, 0x07, 0xbd, 0xc2, 0xf8, 0x1e, 0xf1, 0xfc, 0x94, \n  0x81, 0xf9, 0x7a, 0x3c, 0xf8, 0xb0, 0xcc, 0xff, 0xf0, 0x54, 0xf5, 0x5b, 0x4f, 0xf9, 0x32, 0x16, \n  0xff, 0x39, 0xe2, 0xfb, 0x78, 0xdf, 0x00, 0x95, 0x28, 0xff, 0x5e, 0x7f, 0xfe, 0x2b, 0x54, 0x01, \n  0x8c, 0x65, 0x01, 0xfa, 0x91, 0xff, 0xa8, 0x0b, 0x3a, 0x11, 0x7d, 0x28, 0xbd, 0xac, 0xe9, 0x87, \n  0x53, 0x15, 0x76, 0x6b, 0xff, 0xf6, 0x55, 0xea, 0x67, 0x40, 0xfe, 0x4f, 0x66, 0xf8, 0x17, 0xfc, \n  0xe9, 0x69, 0x1d, 0x02, 0x13, 0x55, 0x21, 0x48, 0x9d, 0xf2, 0xf1, 0x33, 0xf8, 0xa6, 0x40, 0x06, \n  0xa4, 0x3d, 0xf4, 0xf6, 0xe4, 0x07, 0x2f, 0x8d, 0x0c, 0x29, 0x25, 0xfa, 0x24, 0x07, 0xfc, 0x68, \n  0xa9, 0xfb, 0x8d, 0xd2, 0xf6, 0x0a, 0x9b, 0x01, 0x56, 0xf3, 0xf6, 0x15, 0x01, 0xf5, 0xb8, 0x09, \n  0xfe, 0xbf, 0xbd, 0xfc, 0x6d, 0x9d, 0x00, 0xcc, 0x2a, 0x01, 0x86, 0x8f, 0xfd, 0x6b, 0x12, 0xff, \n  0x11, 0xfa, 0x02, 0x83, 0x8b, 0x00, 0x8c, 0x8f, 0x38, 0xe3, 0x5e, 0x25, 0xea, 0x71, 0xe8, 0xca, \n  0x51, 0x17, 0xa7, 0x2d, 0x02, 0x85, 0xfd, 0xe9, 0xf9, 0x00, 0xfd, 0xe8, 0x38, 0xfd, 0x22, 0xb5, \n  0xeb, 0xd1, 0x11, 0xfa, 0x8a, 0x8d, 0x22, 0x1a, 0xe3, 0xf6, 0x2b, 0xa3, 0xf4, 0x8c, 0xa0, 0x08, \n  0x3b, 0x06, 0xf6, 0x66, 0x40, 0x03, 0xae, 0x6c, 0x0d, 0x47, 0xe6, 0xfd, 0xce, 0x17, 0xfc, 0x89, \n  0x98, 0xfc, 0x73, 0x57, 0xf7, 0xe7, 0x34, 0x01, 0x4b, 0x2e, 0xf8, 0xf1, 0x40, 0xf4, 0xb1, 0xfa, \n  0xfc, 0xad, 0xe8, 0xfb, 0x24, 0x1f, 0x00, 0xf0, 0xbf, 0x02, 0x94, 0x16, 0xfe, 0xec, 0x51, 0xfe, \n  0x0f, 0x57, 0x02, 0xdb, 0xf2, 0x00, 0xac, 0xf6, 0x35, 0x95, 0xa9, 0x21, 0xf1, 0xb9, 0xe8, 0x37, \n  0xc6, 0x19, 0xc3, 0x8f, 0x02, 0x4b, 0xa7, 0xea, 0x77, 0x3a, 0xfe, 0xf0, 0x9b, 0xfd, 0x18, 0x46, \n  0xed, 0xb7, 0x7d, 0xf7, 0xb5, 0xc4, 0x1f, 0x99, 0x40, 0xf9, 0x84, 0x84, 0xf4, 0x41, 0x06, 0x0a, \n  0x1a, 0xf4, 0xf6, 0xdd, 0xd9, 0xff, 0xe8, 0xe4, 0x0c, 0x44, 0xc6, 0xff, 0xf6, 0xb2, 0xfd, 0xcb, \n  0x2d, 0xfd, 0x90, 0x40, 0xf8, 0xab, 0x19, 0x00, 0x33, 0x1a, 0xf8, 0xf0, 0xb4, 0xf5, 0x49, 0xa4, \n  0xfc, 0x21, 0x23, 0xfb, 0xec, 0x65, 0xfe, 0x77, 0xf3, 0x02, 0x9c, 0x0b, 0xff, 0xa4, 0x3c, 0xff, \n  0xec, 0x42, 0x01, 0x8f, 0xa8, 0xff, 0x22, 0x64, 0x32, 0xce, 0x85, 0x1d, 0xcd, 0x51, 0xeb, 0x83, \n  0x41, 0x1b, 0x9e, 0x87, 0x01, 0x2f, 0xe0, 0xec, 0xe7, 0x39, 0xff, 0x3f, 0xea, 0xfc, 0xd9, 0xc8, \n  0xee, 0xf3, 0xe8, 0xf6, 0x77, 0x36, 0x1c, 0x88, 0x71, 0xfa, 0x2f, 0x3d, 0xf5, 0x33, 0x03, 0x0b, \n  0xa5, 0xa7, 0xf8, 0x8d, 0x3a, 0xfc, 0xba, 0xa2, 0x0c, 0x3b, 0xca, 0x00, 0xba, 0x0a, 0xfd, 0x5e, \n  0xd0, 0xff, 0x1d, 0x99, 0xf8, 0x0a, 0x01, 0xff, 0x38, 0xb9, 0xf8, 0xc1, 0xb8, 0xf5, 0x7f, 0x12, \n  0xfe, 0xd0, 0x70, 0xfb, 0x0a, 0x53, 0xfc, 0x02, 0xbd, 0x01, 0x94, 0xba, 0xff, 0x59, 0x12, 0x00, \n  0x4b, 0x6a, 0x01, 0xec, 0xe6, 0xfe, 0x6e, 0xb0, 0x2d, 0x3c, 0x40, 0x1a, 0xac, 0x23, 0xef, 0x9c, \n  0x42, 0x1b, 0xf8, 0x20, 0x01, 0x29, 0x37, 0xef, 0x8d, 0xb0, 0xff, 0x77, 0x26, 0xfd, 0x2b, 0x69, \n  0xf0, 0x4d, 0x15, 0xf6, 0xc5, 0xcb, 0x18, 0xba, 0x68, 0xfc, 0xc9, 0x85, 0xf5, 0x5d, 0xb9, 0x0a, \n  0x19, 0x80, 0xfb, 0x80, 0xec, 0xf9, 0x31, 0xf0, 0x0a, 0xac, 0x25, 0x02, 0xc3, 0x22, 0xfc, 0xb5, \n  0x63, 0x00, 0x77, 0xbe, 0xfa, 0xb8, 0x18, 0xfe, 0x37, 0x27, 0xf9, 0x1e, 0xd2, 0xf6, 0x36, 0x4c, \n  0xfe, 0x4f, 0xd1, 0xfc, 0xd6, 0x39, 0xfb, 0xa5, 0x46, 0x00, 0xa4, 0xb4, 0xff, 0xde, 0x45, 0x00, \n  0xa8, 0xf3, 0x01, 0x5f, 0xda, 0xfe, 0x9f, 0xa9, 0x2c, 0x1c, 0x6f, 0x14, 0x4b, 0xa3, 0xec, 0x11, \n  0x24, 0x21, 0x47, 0x26, 0x06, 0x4e, 0x7c, 0xe9, 0xdd, 0x11, 0xfd, 0xcd, 0x2d, 0x01, 0x51, 0x40, \n  0xf3, 0xd0, 0x20, 0xfb, 0x54, 0x9d, 0x11, 0x7e, 0x14, 0xf7, 0xc9, 0xb6, 0xf9, 0x3f, 0x17, 0x09, \n  0x3a, 0x9f, 0xfb, 0x27, 0x9c, 0xfd, 0x66, 0xd4, 0x06, 0xa7, 0x23, 0xff, 0xba, 0x8f, 0xff, 0x39, \n  0xb6, 0x01, 0x2e, 0x3d, 0xfe, 0xf7, 0x2c, 0x03, 0xdf, 0x3c, 0xfd, 0xc3, 0xba, 0xfb, 0xca, 0x9a, \n  0x00, 0x31, 0xbd, 0xfc, 0x8b, 0x32, 0xfc, 0x6e, 0x08, 0xff, 0x71, 0xa2, 0xfb, 0xcd, 0x73, 0xfc, \n  0x0e, 0xda, 0xfe, 0xa4, 0x19, 0xfe, 0x38, 0x4f, 0x26, 0x96, 0x3d, 0x13, 0x90, 0x7c, 0xf1, 0xa6, \n  0xd6, 0x1c, 0xca, 0xf1, 0x05, 0x2f, 0x48, 0xee, 0xf2, 0xb6, 0xfd, 0x18, 0x18, 0x00, 0xec, 0x62, \n  0xf5, 0xd1, 0x16, 0xfb, 0x3a, 0xb6, 0x0e, 0x41, 0x3b, 0xf9, 0x8b, 0xe2, 0xf9, 0xa3, 0xbb, 0x07, \n  0x85, 0x74, 0xfc, 0x9e, 0x0c, 0xfd, 0x71, 0x05, 0x06, 0x71, 0xd3, 0xff, 0x5c, 0x44, 0xff, 0x1c, \n  0x33, 0x01, 0x6d, 0xda, 0xfe, 0xeb, 0xac, 0x02, 0x76, 0x11, 0xfd, 0x09, 0x28, 0xfc, 0xf3, 0x8c, \n  0x00, 0x20, 0xd3, 0xfc, 0xb6, 0xee, 0xfc, 0x01, 0x9a, 0xff, 0xe6, 0xbe, 0xfc, 0xb5, 0x2a, 0xfd, \n  0xbd, 0x5c, 0xfe, 0x6a, 0x4f, 0xfe, 0x78, 0x80, 0x20, 0xc5, 0xb3, 0x12, 0x22, 0xdb, 0xf5, 0x0e, \n  0xff, 0x17, 0x00, 0xd7, 0x06, 0x6e, 0xf5, 0xf2, 0x09, 0x51, 0xfd, 0x06, 0xce, 0xff, 0x3a, 0x58, \n  0xf7, 0xa9, 0xe9, 0xfa, 0xf3, 0x80, 0x0c, 0x40, 0x55, 0xfb, 0x33, 0xfc, 0xf9, 0x9d, 0x4f, 0x06, \n  0x56, 0xf2, 0xfd, 0xf0, 0xf4, 0xfc, 0x37, 0xf4, 0x04, 0xd5, 0xa4, 0x00, 0x19, 0x6e, 0xff, 0xb2, \n  0xca, 0x00, 0x00, 0x0a, 0xff, 0x12, 0x3a, 0x02, 0x94, 0xc0, 0xfd, 0xaf, 0x4a, 0xfc, 0x60, 0x10, \n  0x00, 0x02, 0x87, 0xfd, 0xc9, 0x5e, 0xfd, 0x9a, 0x4e, 0x00, 0xd5, 0xc6, 0xfd, 0xfb, 0x8d, 0xfd, \n  0xf6, 0x91, 0xfe, 0x7d, 0x61, 0xfe, 0x3c, 0x4f, 0x1b, 0x8f, 0xff, 0x11, 0x4a, 0x16, 0xf9, 0x93, \n  0xa5, 0x13, 0x06, 0x20, 0x08, 0x20, 0x7f, 0xf6, 0xa3, 0xf0, 0xfc, 0x7c, 0x1e, 0x00, 0x68, 0xd0, \n  0xf8, 0xeb, 0xc2, 0xfa, 0x5c, 0x79, 0x0a, 0x67, 0xeb, 0xfc, 0xc0, 0x07, 0xfa, 0x96, 0xe3, 0x04, \n  0x80, 0x01, 0xff, 0x65, 0x3f, 0xfd, 0x38, 0x09, 0x04, 0x61, 0xb6, 0x00, 0x5f, 0xb9, 0xff, 0x0e, \n  0xb1, 0x00, 0xb8, 0xca, 0xfe, 0xea, 0xcb, 0x01, 0x5e, 0x2c, 0xfe, 0xe9, 0x93, 0xfc, 0x56, 0xc6, \n  0xff, 0x02, 0x5f, 0xfe, 0xf1, 0xfd, 0xfd, 0xdb, 0xd6, 0xff, 0xb7, 0x80, 0xfe, 0x12, 0x37, 0xfe, \n  0x4a, 0xc0, 0xfe, 0xa8, 0x5b, 0xfe, 0x0e, 0xef, 0x16, 0x0e, 0x1f, 0x11, 0x97, 0x86, 0xfb, 0x79, \n  0x74, 0x10, 0xf6, 0x1e, 0x09, 0xa5, 0x24, 0xf9, 0x1d, 0x64, 0xfd, 0x56, 0xc7, 0x00, 0xcc, 0xda, \n  0xf9, 0x64, 0xcf, 0xfa, 0x05, 0xf0, 0x08, 0x7a, 0x03, 0xfe, 0x65, 0x30, 0xfa, 0xd1, 0xf5, 0x03, \n  0x98, 0xef, 0xff, 0x53, 0xcb, 0xfd, 0x69, 0x0a, 0x03, 0x07, 0x00, 0x01, 0x92, 0x43, 0x00, 0x85, \n  0x44, 0x00, 0xf8, 0xfc, 0xfe, 0x37, 0x73, 0x01, 0x53, 0x75, 0xfe, 0xbc, 0x54, 0xfd, 0x2a, 0x4a, \n  0x00, 0x05, 0xd4, 0xfe, 0x3f, 0x16, 0xfe, 0x8f, 0xd3, 0xff, 0x3d, 0xdc, 0xfe, 0x3c, 0xb2, 0xfe, \n  0xb6, 0xe0, 0xfe, 0x57, 0xba, 0xfe, 0x2a, 0x25, 0x13, 0x2c, 0x03, 0x10, 0xa1, 0x3e, 0xfd, 0xb0, \n  0x29, 0x0e, 0x86, 0xd8, 0x09, 0x04, 0x11, 0xfb, 0x5a, 0x12, 0xfe, 0x04, 0x51, 0x01, 0x91, 0xa7, \n  0xfa, 0x90, 0xdd, 0xfa, 0x6b, 0x93, 0x07, 0xe8, 0xab, 0xfe, 0x78, 0x80, 0xfa, 0xc7, 0x43, 0x03, \n  0x24, 0xab, 0x00, 0x7d, 0x01, 0xfe, 0xbd, 0x6d, 0x02, 0x90, 0x90, 0x01, 0x50, 0xed, 0xff, 0x2e, \n  0x02, 0x00, 0xf6, 0x62, 0xff, 0xb1, 0x4c, 0x01, 0x1e, 0x04, 0xff, 0x10, 0xf2, 0xfd, 0xb2, 0x62, \n  0x00, 0x16, 0x21, 0xff, 0xc7, 0x4c, 0xfe, 0xf9, 0x97, 0xff, 0xa2, 0xe3, 0xfe, 0xa5, 0xcf, 0xfe, \n  0xbe, 0x4a, 0xff, 0xf7, 0x07, 0xff, 0x44, 0x49, 0x10, 0x49, 0x29, 0x0e, 0x0e, 0x9f, 0xfe, 0xf1, \n  0xf6, 0x0c, 0x0e, 0xde, 0x09, 0x53, 0x90, 0xfc, 0xa6, 0xe5, 0xfe, 0xc3, 0xbb, 0x01, 0xcb, 0xf6, \n  0xfa, 0x64, 0x2f, 0xfb, 0xc1, 0x5a, 0x06, 0x9a, 0x24, 0xff, 0xc3, 0xde, 0xfa, 0x3d, 0xb3, 0x02, \n  0x41, 0x36, 0x01, 0xb5, 0x3a, 0xfe, 0x6a, 0x49, 0x02, 0x83, 0x4a, 0x01, 0xf7, 0xa8, 0xff, 0x01, \n  0x5a, 0x00, 0x24, 0xf9, 0xff, 0x5c, 0x31, 0x01, 0x00, 0x13, 0xff, 0x4e, 0x81, 0xfe, 0xf2, 0x97, \n  0x00, 0x5c, 0x10, 0xff, 0xc1, 0x2c, 0xfe, 0xdf, 0x53, 0xff, 0xed, 0xe4, 0xfe, 0x7b, 0x21, 0xff, \n  0x61, 0xae, 0xff, 0xb6, 0x62, 0xff, 0x0f, 0x2c, 0x0e, 0x4d, 0xea, 0x0c, 0xc7, 0xf9, 0xff, 0xa4, \n  0x82, 0x0b, 0xf7, 0xda, 0x08, 0x83, 0xec, 0xfd, 0x8a, 0x01, 0x00, 0x08, 0xd1, 0x01, 0x4e, 0x74, \n  0xfb, 0xc2, 0x9a, 0xfb, 0xd7, 0x2b, 0x05, 0x80, 0x2f, 0xff, 0xb4, 0x7c, 0xfb, 0xb1, 0xfd, 0x02, \n  0xf8, 0x4c, 0x01, 0xce, 0x74, 0xfe, 0x0c, 0x10, 0x02, 0x1d, 0xca, 0x00, 0x8f, 0x70, 0x00, 0x55, \n  0xfa, 0x00, 0xca, 0xcf, 0xff, 0x9b, 0x10, 0x01, 0x73, 0x8f, 0xff, 0xe0, 0xb8, 0xfe, 0x8f, 0xff, \n  0xff, 0x7f, 0xfe, 0xfe, 0x04, 0x4b, 0xfe, 0x6a, 0x5d, 0xff, 0x59, 0x5f, 0xff, 0x1a, 0x75, 0xff, \n  0x9f, 0x92, 0xff, 0xb0, 0xf0, 0xfe, 0xdb, 0xf6, 0x0b, 0x43, 0xd8, 0x0b, 0xff, 0xdf, 0x00, 0x05, \n  0x39, 0x0a, 0xea, 0xbd, 0x08, 0xeb, 0x6f, 0xff, 0xae, 0x1e, 0x00, 0x5e, 0x6f, 0x01, 0x5d, 0x98, \n  0xfc, 0x46, 0x9e, 0xfb, 0x9f, 0xbe, 0x03, 0x37, 0xfd, 0xff, 0x73, 0x9d, 0xfc, 0xcf, 0x23, 0x02, \n  0xb0, 0x27, 0x01, 0x75, 0x58, 0xff, 0x56, 0xe0, 0x01, 0x6f, 0x3b, 0x01, 0x4a, 0xe6, 0x00, 0xd2, \n  0xa2, 0x00, 0x93, 0xdf, 0xff, 0x79, 0x01, 0x01, 0x80, 0x8d, 0xff, 0x5e, 0x8c, 0xfe, 0x94, 0x92, \n  0xff, 0xed, 0x19, 0xff, 0x5c, 0xb6, 0xfe, 0xef, 0xb5, 0xff, 0x8b, 0x73, 0xff, 0x64, 0xe0, 0xfe, \n  0x9c, 0xfa, 0xfe, 0x40, 0xd7, 0xfe, 0xfb, 0xe6, 0x09, 0x43, 0xa6, 0x0a, 0xd7, 0x1d, 0x02, 0x9b, \n  0x03, 0x09, 0xf4, 0x7c, 0x08, 0x37, 0x1b, 0x01, 0x6d, 0xf6, 0xff, 0xae, 0xe6, 0x00, 0xc2, 0x9c, \n  0xfd, 0x8d, 0x33, 0xfc, 0x06, 0xb6, 0x02, 0x62, 0x6b, 0x00, 0xde, 0x46, 0xfd, 0x3e, 0x9c, 0x01, \n  0xf6, 0xee, 0x01, 0xc5, 0xb2, 0x00, 0xcc, 0x93, 0x01, 0x91, 0xf1, 0x00, 0xa6, 0x1d, 0x01, 0x16, \n  0x8b, 0x00, 0x9e, 0xeb, 0xff, 0xb1, 0xae, 0x00, 0x54, 0x4d, 0xff, 0xd8, 0x7e, 0xfe, 0x00, 0xf0, \n  0xff, 0x17, 0xa4, 0xff, 0x2c, 0xd3, 0xfe, 0x51, 0x46, 0xff, 0x83, 0xb4, 0xfe, 0x4e, 0xc3, 0xfe, \n  0x1d, 0x37, 0xff, 0x7d, 0x33, 0xff, 0x73, 0x98, 0x08, 0x07, 0x02, 0x0a, 0x3e, 0x01, 0x03, 0xa8, \n  0xb2, 0x07, 0x12, 0x52, 0x08, 0x2d, 0xd9, 0x01, 0x35, 0x50, 0xff, 0xc9, 0x05, 0x01, 0x44, 0xe7, \n  0xfe, 0xdb, 0x76, 0xfc, 0x3a, 0x61, 0x01, 0xbb, 0x10, 0x01, 0x6d, 0x9a, 0xfe, 0x5d, 0x47, 0x02, \n  0x42, 0xd5, 0x02, 0x93, 0x89, 0x00, 0x72, 0xfd, 0x00, 0x30, 0x37, 0x01, 0x72, 0xe6, 0x00, 0x60, \n  0x4c, 0x00, 0x7b, 0xc2, 0xff, 0x3e, 0x47, 0x00, 0xa3, 0xce, 0xff, 0x8a, 0x4a, 0xff, 0xb1, 0xc8, \n  0xff, 0x40, 0xe3, 0xfe, 0x2e, 0x5d, 0xfe, 0x07, 0x08, 0xff, 0x45, 0x19, 0xff, 0x59, 0x25, 0xff, \n  0xc0, 0x57, 0xff, 0xd3, 0x40, 0xff, 0x75, 0xd0, 0x06, 0xfc, 0x49, 0x09, 0x2e, 0x17, 0x04, 0xda, \n  0x6b, 0x06, 0x12, 0xfe, 0x07, 0xd8, 0xa7, 0x02, 0x76, 0xc5, 0xff, 0xd9, 0x0e, 0x01, 0xac, 0x98, \n  0xfe, 0xb0, 0xe5, 0xfc, 0xb3, 0x9f, 0x01, 0x0f, 0x75, 0x02, 0xe2, 0x01, 0x00, 0x4c, 0xed, 0x01, \n  0x52, 0x7a, 0x02, 0xb3, 0x70, 0x00, 0x0f, 0xf9, 0x00, 0x6f, 0x23, 0x01, 0x8d, 0x58, 0x00, 0x18, \n  0x13, 0x00, 0x38, 0x3c, 0x00, 0x8c, 0xb6, 0x00, 0xca, 0xe7, 0xff, 0xf9, 0xc5, 0xfe, 0x85, 0xb5, \n  0xfe, 0x6d, 0xba, 0xfe, 0x52, 0xd5, 0xfe, 0x7e, 0x3d, 0xff, 0x92, 0x4b, 0xff, 0x92, 0x34, 0xff, \n  0x93, 0x18, 0xff, 0xba, 0x0b, 0xff, 0xe7, 0xe7, 0x05, 0x65, 0x26, 0x09, 0x67, 0x08, 0x04, 0x00, \n  0x63, 0x05, 0x5f, 0x39, 0x08, 0xf0, 0xd5, 0x02, 0x7b, 0x25, 0xff, 0xe3, 0xe3, 0x00, 0x3d, 0x9a, \n  0xff, 0x05, 0xb3, 0xfe, 0x7a, 0x7b, 0x02, 0xca, 0x68, 0x02, 0xd7, 0x46, 0x00, 0x09, 0x0b, 0x02, \n  0x5f, 0x12, 0x02, 0x06, 0x41, 0x00, 0x67, 0x6f, 0x00, 0x51, 0xc9, 0x00, 0x11, 0xfb, 0x00, 0x55, \n  0xa0, 0x00, 0x10, 0x24, 0x00, 0x0b, 0xda, 0xff, 0xf2, 0xd9, 0xfe, 0x10, 0x80, 0xfe, 0xb6, 0x12, \n  0xff, 0x6b, 0x2b, 0xff, 0x9c, 0x04, 0xff, 0xf3, 0x29, 0xff, 0x8e, 0x05, 0xff, 0x6e, 0xfd, 0xfe, \n  0x90, 0x2d, 0xff, 0xc9, 0x23, 0xff, 0x15, 0x91, 0x05, 0x32, 0x41, 0x08, 0xaa, 0x51, 0x04, 0x2a, \n  0xfb, 0x05, 0x5f, 0x31, 0x06, 0x99, 0xc8, 0x01, 0x66, 0xef, 0x00, 0xb7, 0xa3, 0x02, 0xfc, 0x98, \n  0x00, 0xcc, 0x3c, 0xff, 0xc2, 0x8e, 0x02, 0x1d, 0x30, 0x02, 0x0c, 0xa1, 0x00, 0xe7, 0x34, 0x02, \n  0x0a, 0x39, 0x01, 0x78, 0xaa, 0xff, 0xd3, 0x17, 0x01, 0x59, 0xb7, 0x01, 0x7a, 0xb2, 0x00, 0xdd, \n  0xa5, 0xff, 0xfe, 0x0d, 0xff, 0xb0, 0x73, 0xff, 0x74, 0x56, 0xff, 0xcc, 0xef, 0xfe, 0x43, 0x37, \n  0xff, 0xea, 0x1f, 0xff, 0x15, 0xca, 0xfe, 0xc8, 0xe3, 0xfe, 0x86, 0x30, 0xff, 0x97, 0x15, 0xff, \n  0x16, 0x3d, 0xff, 0xef, 0x4b, 0xff, 0x6a, 0xa5, 0x05, 0xcb, 0x6f, 0x07, 0x9a, 0x8a, 0x03, 0x63, \n  0x77, 0x05, 0x62, 0xd0, 0x05, 0x6a, 0x76, 0x03, 0xcc, 0xdf, 0x02, 0x49, 0xb4, 0x02, 0x26, 0x48, \n  0x00, 0x67, 0x67, 0xff, 0xdd, 0x02, 0x03, 0x90, 0xa6, 0x02, 0x09, 0x19, 0x00, 0xae, 0xf4, 0x00, \n  0x38, 0xa7, 0x01, 0x49, 0xe5, 0x00, 0x96, 0xed, 0x00, 0x64, 0x90, 0x00, 0x8e, 0x2a, 0xff, 0xc7, \n  0xf7, 0xfe, 0xf1, 0xc0, 0xff, 0x5c, 0x01, 0x00, 0x1c, 0x39, 0xff, 0xd8, 0xc6, 0xfe, 0x66, 0xf5, \n  0xfe, 0x73, 0xd2, 0xfe, 0xdd, 0xc3, 0xfe, 0x3b, 0x02, 0xff, 0x42, 0x3a, 0xff, 0x27, 0x57, 0xff, \n  0x16, 0x52, 0xff, 0xd6, 0x23, 0xff, 0x48, 0x88, 0x04, 0xdb, 0x95, 0x06, 0x46, 0x1f, 0x04, 0xd2, \n  0x41, 0x06, 0xfe, 0x1c, 0x07, 0x71, 0xa6, 0x03, 0xc8, 0x6f, 0x02, 0x86, 0x20, 0x03, 0x80, 0x02, \n  0x01, 0xe0, 0x16, 0x00, 0xac, 0x93, 0x02, 0x3a, 0xea, 0x01, 0x80, 0x51, 0x00, 0xdf, 0xec, 0x01, \n  0x02, 0xbb, 0x01, 0xd4, 0xac, 0xff, 0x1f, 0x82, 0xff, 0xf9, 0xc9, 0xff, 0x32, 0xa8, 0xff, 0xb5, \n  0xc9, 0xff, 0x24, 0xd9, 0xff, 0x5c, 0xa5, 0xff, 0xcb, 0xe1, 0xfe, 0x47, 0xa0, 0xfe, 0x6a, 0xe2, \n  0xfe, 0x36, 0xe3, 0xfe, 0x17, 0xdb, 0xfe, 0xf9, 0x3e, 0xff, 0x23, 0x7e, 0xff, 0xac, 0x41, 0xff, \n  0xc1, 0x3a, 0xff, 0xa1, 0x38, 0xff, 0x21, 0x57, 0x05, 0xe4, 0xb4, 0x08, 0x7f, 0xfb, 0x05, 0x92, \n  0x71, 0x05, 0xb4, 0x29, 0x05, 0xcf, 0xa5, 0x03, 0x7d, 0xe6, 0x02, 0xcb, 0x9f, 0x02, 0xc8, 0x36, \n  0x01, 0x92, 0xbd, 0x00, 0xf5, 0xe1, 0x01, 0x1e, 0x98, 0x02, 0xbd, 0x43, 0x01, 0x56, 0x8c, 0xff, \n  0xaa, 0x92, 0xff, 0x24, 0x96, 0xff, 0x61, 0xef, 0xff, 0x8b, 0x36, 0x00, 0x58, 0xdf, 0xff, 0x71, \n  0xa9, 0xff, 0x88, 0x39, 0xff, 0x6e, 0x1a, 0xff, 0x26, 0xe4, 0xfe, 0xc0, 0xb1, 0xfe, 0x96, 0xdb, \n  0xfe, 0x84, 0x1f, 0xff, 0x97, 0x3a, 0xff, 0x68, 0x2d, 0xff, 0x7a, 0x7d, 0xff, 0x6d, 0x72, 0xff, \n  0xe5, 0x3c, 0xff, 0x9d, 0x21, 0xff, 0x5e, 0x52, 0x05, 0x75, 0xc9, 0x08, 0xc9, 0x0f, 0x06, 0x9b, \n  0xfe, 0x04, 0x7f, 0xe8, 0x04, 0x4a, 0x26, 0x04, 0x6e, 0x8b, 0x03, 0x30, 0x34, 0x03, 0x43, 0x0f, \n  0x02, 0x37, 0xf8, 0x00, 0x1e, 0x9e, 0x01, 0x32, 0x5c, 0x02, 0xef, 0x44, 0x00, 0x37, 0x93, 0xfe, \n  0x1e, 0x62, 0xff, 0xdf, 0x12, 0x00, 0x14, 0x5f, 0x00, 0x50, 0x46, 0x00, 0xe4, 0xa8, 0xff, 0x77, \n  0x38, 0xff, 0xc0, 0x40, 0xff, 0x4b, 0x4e, 0xff, 0xa7, 0xde, 0xfe, 0xbf, 0xc5, 0xfe, 0x64, 0x0c, \n  0xff, 0x9e, 0x25, 0xff, 0x99, 0x21, 0xff, 0x72, 0x4b, 0xff, 0x64, 0x8c, 0xff, 0x9d, 0x79, 0xff, \n  0xe5, 0x57, 0xff, 0x7f, 0x25, 0xff, 0x23, 0x1c, 0x05, 0x9f, 0xa0, 0x07, 0x46, 0x86, 0x04, 0x7f, \n  0x71, 0x04, 0x9a, 0x9a, 0x04, 0x68, 0x42, 0x04, 0xaa, 0x7a, 0x04, 0x87, 0x2a, 0x05, 0xb1, 0x96, \n  0x03, 0x43, 0xb8, 0x01, 0x32, 0x5b, 0x01, 0x38, 0x6b, 0x00, 0xdf, 0x4f, 0x00, 0xba, 0xb4, 0xff, \n  0x17, 0x32, 0xff, 0x58, 0xdd, 0xff, 0xa5, 0x79, 0x00, 0x04, 0x11, 0x00, 0xda, 0x72, 0xff, 0x4a, \n  0x81, 0xff, 0x57, 0x59, 0xff, 0x6a, 0x3a, 0xff, 0xf4, 0x03, 0xff, 0x9d, 0xe8, 0xfe, 0xe1, 0x1e, \n  0xff, 0x1b, 0x24, 0xff, 0x9f, 0xfd, 0xfe, 0x08, 0x48, 0xff, 0xc7, 0x92, 0xff, 0xe1, 0x70, 0xff, \n  0x9d, 0x64, 0xff, 0x77, 0x42, 0xff, 0x4a, 0x88, 0x05, 0xe2, 0xf2, 0x07, 0x14, 0x05, 0x04, 0x72, \n  0xa4, 0x03, 0xb7, 0x5c, 0x03, 0x95, 0x51, 0x03, 0xbd, 0xec, 0x04, 0xef, 0x73, 0x05, 0x3c, 0x8b, \n  0x03, 0xd6, 0xfd, 0x01, 0x76, 0x6e, 0x01, 0x38, 0x6b, 0x01, 0x9c, 0xbc, 0x01, 0x75, 0xf2, 0xff, \n  0xe9, 0x57, 0xff, 0xb4, 0xb0, 0xff, 0xae, 0x8e, 0xff, 0xd8, 0x01, 0x00, 0x19, 0xd6, 0xff, 0x80, \n  0x49, 0xff, 0xbb, 0xf3, 0xfe, 0x9c, 0x53, 0xff, 0x03, 0x57, 0xff, 0xb4, 0x05, 0xff, 0x04, 0x46, \n  0xff, 0x00, 0x6e, 0xff, 0x07, 0x4f, 0xff, 0x08, 0x3a, 0xff, 0xcb, 0x58, 0xff, 0x73, 0x71, 0xff, \n  0x26, 0x45, 0xff, 0x3d, 0x2b, 0xff, 0xa6, 0xce, 0x05, 0x1d, 0xb3, 0x07, 0xe0, 0xf4, 0x02, 0x4b, \n  0x20, 0x03, 0x1e, 0x81, 0x03, 0x51, 0x85, 0x02, 0xbb, 0x7c, 0x02, 0xc8, 0xd2, 0x03, 0xa1, 0x65, \n  0x04, 0x25, 0x92, 0x03, 0xe3, 0xe8, 0x02, 0x69, 0x2d, 0x02, 0x5b, 0xcf, 0x01, 0x13, 0x50, 0x02, \n  0xe5, 0x90, 0x00, 0x43, 0x29, 0xfe, 0x9a, 0x1d, 0xff, 0xa2, 0xac, 0xff, 0x9e, 0xd9, 0xff, 0x27, \n  0xc9, 0xff, 0x45, 0x2b, 0xff, 0x45, 0x35, 0xff, 0x41, 0x54, 0xff, 0xdf, 0x4d, 0xff, 0x90, 0x5e, \n  0xff, 0xc7, 0x77, 0xff, 0x0e, 0x3f, 0xff, 0xaa, 0x7d, 0xff, 0xf0, 0x40, 0xff, 0x9b, 0x26, 0xff, \n  0xcd, 0x77, 0xff, 0x96, 0x21, 0xff, 0x33, 0x74, 0x05, 0xcf, 0x75, 0x07, 0x88, 0xf2, 0x02, 0x7e, \n  0xee, 0x02, 0x50, 0xaa, 0x03, 0x42, 0x33, 0x03, 0xfb, 0x1f, 0x02, 0xd1, 0x01, 0x01, 0x3c, 0xa0, \n  0x01, 0xfc, 0x6c, 0x03, 0xad, 0x14, 0x04, 0x85, 0xfb, 0x02, 0xea, 0x2b, 0x02, 0xc0, 0x58, 0x02, \n  0x47, 0xec, 0x02, 0x86, 0x3a, 0x01, 0x97, 0xb9, 0xfe, 0x09, 0xad, 0xfe, 0xa4, 0x51, 0xff, 0x18, \n  0xa1, 0xff, 0xcb, 0xdd, 0xff, 0x59, 0x98, 0xff, 0xd5, 0x06, 0xff, 0x66, 0x43, 0xff, 0x20, 0x98, \n  0xff, 0xdc, 0x3b, 0xff, 0xbd, 0x4e, 0xff, 0xf7, 0xa1, 0xff, 0x8e, 0x58, 0xff, 0x9b, 0x26, 0xff, \n  0xd1, 0x31, 0xff, 0xdc, 0x4a, 0xff, 0x41, 0xe8, 0x05, 0x95, 0x7c, 0x07, 0xb0, 0xe0, 0x01, 0x7f, \n  0x22, 0x02, 0x26, 0x62, 0x03, 0xf1, 0x0b, 0x03, 0x39, 0x45, 0x02, 0x82, 0xbf, 0x00, 0x66, 0x0b, \n  0x00, 0x20, 0xd1, 0x01, 0xc2, 0xf7, 0x02, 0x36, 0x78, 0x02, 0xf5, 0x29, 0x03, 0xa7, 0xaf, 0x03, \n  0x25, 0xb0, 0x03, 0xb3, 0xb0, 0x02, 0x75, 0x5e, 0x01, 0xfe, 0x54, 0x00, 0x46, 0x05, 0xff, 0x15, \n  0x70, 0xfe, 0x52, 0x28, 0xff, 0xb0, 0xb1, 0xff, 0xc0, 0x70, 0xff, 0xaa, 0x3e, 0xff, 0x11, 0x38, \n  0xff, 0x48, 0x41, 0xff, 0x27, 0x5d, 0xff, 0x87, 0xc8, 0xff, 0x24, 0x7d, 0xff, 0xc6, 0x3f, 0xff, \n  0xdb, 0x64, 0xff, 0xc3, 0x44, 0xff, 0xde, 0x9a, 0x06, 0x92, 0x2f, 0x08, 0x7e, 0xe9, 0x01, 0x51, \n  0xb5, 0x02, 0x07, 0xb1, 0x03, 0x71, 0x93, 0x02, 0xd1, 0xaf, 0x01, 0x67, 0xae, 0xff, 0x6d, 0x0c, \n  0x00, 0xb3, 0xa0, 0x02, 0xaa, 0x88, 0x01, 0xb9, 0x37, 0x00, 0x30, 0x93, 0x01, 0xb8, 0x7f, 0x02, \n  0xa0, 0xee, 0x03, 0xe3, 0x5e, 0x03, 0xc1, 0x4c, 0x02, 0x7e, 0x77, 0x02, 0x43, 0x2e, 0x01, 0xb0, \n  0x74, 0xff, 0xee, 0xae, 0xfe, 0xd6, 0x7f, 0xfe, 0x55, 0xe5, 0xfe, 0x7a, 0xae, 0xff, 0x57, 0xa0, \n  0xff, 0xd8, 0x22, 0xff, 0x08, 0x2c, 0xff, 0x38, 0xaf, 0xff, 0x13, 0x8c, 0xff, 0xca, 0x5a, 0xff, \n  0xb7, 0x88, 0xff, 0xff, 0x3e, 0xff, 0x88, 0x5b, 0x07, 0x93, 0x78, 0x08, 0xe2, 0xa7, 0x01, 0x94, \n  0xaf, 0x03, 0x49, 0xd2, 0x04, 0xf3, 0x25, 0x03, 0x3f, 0xc8, 0x00, 0xf1, 0x8d, 0xfd, 0xa9, 0xb5, \n  0xff, 0xe1, 0xac, 0x03, 0x55, 0x6d, 0x01, 0xf6, 0x74, 0xff, 0x80, 0x2a, 0x00, 0x04, 0x00, 0x01, \n  0x65, 0x92, 0x02, 0x79, 0xb8, 0x01, 0x05, 0x50, 0x02, 0xde, 0x5a, 0x03, 0xd4, 0x4f, 0x02, 0x56, \n  0x81, 0x01, 0x19, 0x75, 0x00, 0x2b, 0x41, 0xff, 0xd8, 0x37, 0xfe, 0x4f, 0x87, 0xfe, 0xcb, 0x49, \n  0xff, 0x82, 0x7b, 0xff, 0x90, 0x8b, 0xff, 0x23, 0x78, 0xff, 0x37, 0x44, 0xff, 0xc9, 0x5b, 0xff, \n  0x05, 0x9a, 0xff, 0x5a, 0x4f, 0xff, 0x46, 0xe2, 0x08, 0x2e, 0x83, 0x0a, 0xc6, 0xa6, 0x01, 0xae, \n  0x0c, 0x03, 0x27, 0x52, 0x04, 0x5a, 0x34, 0x03, 0xb9, 0x00, 0x01, 0x13, 0xdc, 0xfc, 0x7e, 0x89, \n  0xff, 0xf8, 0x89, 0x03, 0x70, 0xbe, 0x00, 0xc9, 0x2b, 0xff, 0x48, 0x2e, 0x00, 0x2b, 0x86, 0x00, \n  0x55, 0x5c, 0x01, 0x1d, 0xf0, 0x00, 0xb2, 0x15, 0x01, 0xeb, 0x2a, 0x02, 0xb1, 0x7e, 0x02, 0x16, \n  0x01, 0x02, 0x3f, 0x36, 0x01, 0x43, 0xd2, 0x00, 0xc4, 0x03, 0x00, 0x93, 0x0d, 0xff, 0x6d, 0x71, \n  0xfe, 0x1e, 0xbb, 0xfe, 0x33, 0x56, 0xff, 0xa3, 0xe2, 0xff, 0x48, 0xb8, 0xff, 0x38, 0x19, 0xff, \n  0x41, 0x2e, 0xff, 0x71, 0x6e, 0xff, 0x4a, 0x3b, 0x0a, 0x89, 0x9e, 0x0b, 0xd5, 0x58, 0x01, 0xb8, \n  0xa8, 0x03, 0x89, 0x42, 0x05, 0xed, 0xdb, 0x02, 0xe0, 0xb5, 0xff, 0xce, 0xab, 0xfb, 0xc4, 0x88, \n  0x00, 0xa0, 0x6e, 0x04, 0xd8, 0x8d, 0xff, 0x68, 0x61, 0xfe, 0x59, 0xb8, 0xff, 0x1a, 0x82, 0x00, \n  0x64, 0xb1, 0x01, 0xbd, 0x1a, 0x00, 0xc6, 0x07, 0x00, 0x72, 0x61, 0x01, 0xf7, 0xf4, 0x00, 0x97, \n  0x17, 0x01, 0x9c, 0xba, 0x01, 0x5e, 0x66, 0x01, 0x1e, 0xff, 0x00, 0x8f, 0x9d, 0x00, 0xd0, 0x98, \n  0xff, 0x7c, 0xee, 0xfe, 0xa7, 0x95, 0xfe, 0xd9, 0x67, 0xff, 0xb1, 0x9f, 0xff, 0x11, 0x50, 0xff, \n  0x24, 0x6b, 0xff, 0x93, 0x09, 0xff, 0x40, 0xb3, 0x0b, 0xe4, 0xbb, 0x0c, 0x3e, 0x06, 0x01, 0x5d, \n  0x61, 0x04, 0xda, 0x28, 0x06, 0x37, 0xb8, 0x02, 0x1e, 0x2d, 0xfe, 0x78, 0x94, 0xfa, 0x59, 0xbc, \n  0x01, 0xc6, 0xad, 0x04, 0x08, 0xbe, 0xfe, 0x7a, 0x61, 0xfe, 0x54, 0x2b, 0xff, 0x16, 0x1e, 0x00, \n  0x3e, 0xc0, 0x01, 0xb5, 0xd1, 0xff, 0xa3, 0xf3, 0xff, 0xda, 0xbf, 0x00, 0x16, 0x15, 0x00, 0x47, \n  0x77, 0x00, 0x25, 0x45, 0x00, 0x19, 0xef, 0x00, 0x6b, 0x7d, 0x01, 0x68, 0xcf, 0x00, 0x99, 0xce, \n  0x00, 0x0e, 0x8c, 0x00, 0xc4, 0x67, 0xff, 0x68, 0x5d, 0xff, 0xf3, 0x18, 0xff, 0x64, 0xf9, 0xfe, \n  0x29, 0x4b, 0xff, 0x33, 0x45, 0xff, 0x47, 0xc5, 0x0d, 0x1f, 0xd7, 0x0e, 0x26, 0xae, 0x00, 0x27, \n  0x04, 0x04, 0x7e, 0x18, 0x06, 0x62, 0x53, 0x02, 0xd3, 0x3c, 0xfd, 0xdc, 0x6b, 0xfa, 0x64, 0xd5, \n  0x02, 0xd6, 0x27, 0x04, 0xd2, 0xa5, 0xfd, 0x21, 0x9a, 0xfe, 0x33, 0x22, 0xff, 0xe7, 0xfd, 0xff, \n  0xa7, 0x9f, 0x01, 0xcb, 0x4c, 0xff, 0x50, 0xda, 0xff, 0xa5, 0xb9, 0x00, 0x00, 0x9b, 0xff, 0x7e, \n  0xd2, 0xff, 0x80, 0xd1, 0xff, 0x4f, 0x38, 0x00, 0x6d, 0x64, 0x00, 0x52, 0x80, 0x00, 0x48, 0x06, \n  0x01, 0xcb, 0xec, 0x00, 0x13, 0x9c, 0x00, 0x74, 0xb7, 0x00, 0x66, 0x82, 0xff, 0x34, 0xc1, 0xfe, \n  0x95, 0x14, 0xff, 0xdd, 0xc6, 0xfe, 0x20, 0x27, 0x0f, 0x0f, 0xdd, 0x0f, 0x66, 0x79, 0x00, 0xc0, \n  0x71, 0x05, 0x32, 0x65, 0x07, 0xa6, 0x25, 0x01, 0xed, 0xbe, 0xfa, 0xe6, 0x5b, 0xfa, 0x7c, 0xcc, \n  0x04, 0x9d, 0xb6, 0x03, 0x3f, 0xa9, 0xfc, 0x40, 0xa4, 0xfe, 0x0a, 0xd0, 0xfe, 0xda, 0x18, 0x00, \n  0x2c, 0x8a, 0x01, 0x54, 0xb9, 0xfe, 0xd3, 0xe4, 0xff, 0xdd, 0xb4, 0x00, 0x8f, 0x15, 0xff, 0x67, \n  0xc9, 0xff, 0x46, 0x4f, 0xff, 0x38, 0x9f, 0xff, 0x6e, 0x62, 0x00, 0x26, 0x68, 0xff, 0x92, 0x06, \n  0x00, 0x97, 0xf9, 0x00, 0x9e, 0x9f, 0x00, 0x2e, 0x56, 0x01, 0x29, 0xcf, 0x00, 0x1a, 0xaf, 0xff, \n  0x37, 0x46, 0xff, 0x9d, 0xa7, 0xfe, 0x2f, 0xb9, 0x10, 0xce, 0xce, 0x11, 0xe0, 0x63, 0x00, 0x13, \n  0xad, 0x05, 0x31, 0x0a, 0x08, 0x63, 0x47, 0x00, 0x39, 0xe2, 0xf8, 0xef, 0xbd, 0xfa, 0x70, 0x70, \n  0x06, 0xcd, 0x9a, 0x02, 0x3b, 0xbe, 0xfb, 0x9e, 0x02, 0xff, 0x77, 0xa9, 0xfe, 0xfe, 0x4b, 0x00, \n  0x27, 0x8d, 0x01, 0x91, 0x2a, 0xfe, 0x74, 0xaf, 0xff, 0x5c, 0xa8, 0x00, 0x25, 0xc6, 0xfe, 0xb2, \n  0xc4, 0xff, 0xc9, 0x24, 0xff, 0x25, 0x59, 0xff, 0x24, 0x02, 0x00, 0xb1, 0xd6, 0xfe, 0xf6, 0xd5, \n  0xff, 0x22, 0x49, 0x00, 0x6b, 0x0f, 0x00, 0x38, 0x2e, 0x01, 0xdb, 0xc4, 0x00, 0x80, 0x54, 0x00, \n  0x6b, 0x5e, 0x00, 0x8d, 0x53, 0xff, 0xa6, 0xdd, 0x11, 0x58, 0xe5, 0x13, 0x83, 0xba, 0x00, 0xf5, \n  0x9e, 0x05, 0xe0, 0xb0, 0x08, 0x1b, 0x7f, 0xff, 0x30, 0xf6, 0xf6, 0x49, 0x1b, 0xfb, 0x09, 0x01, \n  0x08, 0x80, 0x8a, 0x01, 0x31, 0x9e, 0xfa, 0xbc, 0x60, 0xff, 0x82, 0x8c, 0xfe, 0xa7, 0x58, 0x00, \n  0xd6, 0x9e, 0x01, 0x61, 0xd0, 0xfd, 0xb7, 0x82, 0xff, 0xc3, 0x82, 0x00, 0xf5, 0x64, 0xfe, 0x13, \n  0x87, 0xff, 0x27, 0xea, 0xfe, 0xb9, 0x29, 0xff, 0xe5, 0x22, 0x00, 0xf2, 0x5e, 0xfe, 0x7d, 0x31, \n  0xff, 0x62, 0x25, 0x00, 0xc8, 0xc5, 0xff, 0x1b, 0x8c, 0x00, 0x52, 0x58, 0x00, 0x25, 0xef, 0xff, \n  0x5f, 0x64, 0x00, 0x5e, 0x44, 0x00, 0x33, 0xe6, 0x12, 0x79, 0x72, 0x16, 0xfb, 0x6d, 0x01, 0xa2, \n  0x9f, 0x04, 0x9d, 0xfa, 0x08, 0x91, 0x1e, 0xff, 0x39, 0x9d, 0xf5, 0xf0, 0x6e, 0xfb, 0xe6, 0xc2, \n  0x08, 0x6f, 0xef, 0x00, 0xf2, 0xaf, 0xf9, 0x74, 0x40, 0xff, 0x02, 0xbd, 0xfe, 0x22, 0x2f, 0x00, \n  0x33, 0xc5, 0x01, 0x93, 0xb6, 0xfd, 0xed, 0x2b, 0xff, 0xff, 0x76, 0x00, 0x93, 0x36, 0xfe, 0x35, \n  0x2f, 0xff, 0xf0, 0x9d, 0xfe, 0xcd, 0xe4, 0xfe, 0x8e, 0xe9, 0xff, 0xd5, 0x5d, 0xfe, 0x39, 0x04, \n  0xff, 0x7a, 0xb5, 0xff, 0x28, 0x82, 0xff, 0x90, 0x70, 0x00, 0x7a, 0xfa, 0xff, 0x12, 0x85, 0xff, \n  0xf2, 0xde, 0xff, 0x87, 0x5a, 0xff, 0x51, 0x66, 0x13, 0x84, 0xc4, 0x18, 0xe8, 0xa2, 0x02, 0xe8, \n  0x11, 0x04, 0xc4, 0x1f, 0x09, 0x3e, 0xae, 0xfe, 0x64, 0x96, 0xf4, 0x15, 0x93, 0xfb, 0xae, 0x4e, \n  0x09, 0x0a, 0x9c, 0x00, 0xfb, 0x0f, 0xf9, 0x3f, 0xbf, 0xfe, 0x22, 0xdb, 0xfe, 0x2f, 0x22, 0x00, \n  0xb4, 0xca, 0x01, 0x90, 0xed, 0xfd, 0xa3, 0x9f, 0xfe, 0x39, 0x60, 0x00, 0xa4, 0x62, 0xfe, 0x0a, \n  0xfd, 0xfe, 0xeb, 0x49, 0xfe, 0xb3, 0x6a, 0xfe, 0x34, 0xae, 0xff, 0x83, 0x3a, 0xfe, 0xb2, 0xe6, \n  0xfe, 0xab, 0x91, 0xff, 0xcd, 0x60, 0xff, 0xbe, 0x25, 0x00, 0xa7, 0x40, 0x00, 0x8b, 0xef, 0xfe, \n  0x50, 0xc0, 0xfe, 0x62, 0x94, 0xff, 0x16, 0x80, 0x13, 0xe0, 0xce, 0x1a, 0x5d, 0x54, 0x04, 0xcb, \n  0xc8, 0x03, 0x56, 0x0d, 0x09, 0x29, 0x53, 0xfe, 0xce, 0x35, 0xf4, 0xd2, 0x3a, 0xfb, 0x45, 0x76, \n  0x09, 0xf8, 0xc9, 0x00, 0x54, 0x6a, 0xf8, 0x1a, 0x71, 0xfe, 0x32, 0xbf, 0xfe, 0x3a, 0xdf, 0xff, \n  0xa9, 0xf0, 0x01, 0xd7, 0x1a, 0xfe, 0xd6, 0x27, 0xfe, 0x64, 0x3f, 0x00, 0x94, 0x8a, 0xfe, 0x8e, \n  0xdd, 0xfe, 0x88, 0x39, 0xfe, 0xd9, 0xf2, 0xfd, 0x38, 0x6d, 0xff, 0x76, 0xf9, 0xfd, 0x2e, 0x8b, \n  0xfe, 0x66, 0x5f, 0xff, 0xbd, 0x82, 0xff, 0x80, 0x88, 0x00, 0x17, 0x1d, 0xff, 0xa5, 0xa7, 0xfe, \n  0x64, 0x22, 0xff, 0x07, 0xf2, 0xfe, 0xdf, 0x33, 0x14, 0x4a, 0xe3, 0x1c, 0xb4, 0xd8, 0x05, 0x14, \n  0xd3, 0x02, 0xa6, 0x2e, 0x08, 0xa8, 0x8c, 0xfe, 0x4e, 0xe9, 0xf4, 0xaf, 0xa3, 0xfa, 0x2c, 0x45, \n  0x08, 0x76, 0x58, 0x01, 0xab, 0x57, 0xf8, 0x0c, 0xdf, 0xfd, 0x2c, 0x03, 0xff, 0xb0, 0x4b, 0xff, \n  0xf8, 0x8c, 0x01, 0x8c, 0xcc, 0xfe, 0xe1, 0xc0, 0xfd, 0xd0, 0xa4, 0xff, 0x8b, 0xe3, 0xfe, 0x2d, \n  0xc5, 0xfe, 0x88, 0xef, 0xfd, 0x84, 0xe2, 0xfd, 0xb4, 0x4b, 0xff, 0x00, 0xb2, 0xfd, 0xe9, 0xe0, \n  0xfd, 0x0f, 0x97, 0xff, 0x7a, 0x6e, 0xff, 0x9f, 0x60, 0xff, 0xba, 0xa1, 0xff, 0xe6, 0xc9, 0xfe, \n  0xab, 0x6e, 0xfe, 0xfa, 0x11, 0xff, 0xbb, 0xad, 0x14, 0xca, 0xc7, 0x1d, 0xe7, 0x28, 0x08, 0x76, \n  0xb2, 0x02, 0x16, 0xa8, 0x06, 0x67, 0x64, 0x00, 0xd3, 0xb2, 0xf5, 0xa8, 0x26, 0xf9, 0x9a, 0x66, \n  0x07, 0x7e, 0xfa, 0x01, 0x97, 0xe9, 0xf8, 0x16, 0xb4, 0xfd, 0xa2, 0x7b, 0xfe, 0x4b, 0x00, 0xff, \n  0x30, 0x64, 0x01, 0xf3, 0x18, 0xff, 0x5f, 0x1f, 0xfe, 0xa7, 0xd2, 0xfe, 0xb1, 0x6b, 0xfe, 0xf7, \n  0x3b, 0xff, 0x59, 0x69, 0xfe, 0x0c, 0x84, 0xfd, 0xde, 0xce, 0xfe, 0x45, 0x11, 0xfe, 0x9b, 0x5b, \n  0xfe, 0x50, 0x99, 0xfe, 0x5d, 0x5e, 0xfe, 0xd6, 0x19, 0x00, 0x61, 0x51, 0xff, 0x2e, 0xaa, 0xfe, \n  0xae, 0xce, 0xfe, 0xef, 0xc7, 0xfe, 0x7f, 0x2b, 0x16, 0xb2, 0xf2, 0x1c, 0xd3, 0xca, 0x08, 0x17, \n  0x51, 0x05, 0x59, 0xf0, 0x05, 0xff, 0xce, 0x00, 0x3c, 0x92, 0xf5, 0x0f, 0xb8, 0xf8, 0x63, 0xa4, \n  0x06, 0x6d, 0xa4, 0x01, 0x66, 0x22, 0xfa, 0x9a, 0x42, 0xfd, 0xda, 0xd4, 0xfd, 0x79, 0x33, 0xff, \n  0xcc, 0x2a, 0x01, 0x92, 0xef, 0xfe, 0x0e, 0x72, 0xfe, 0xaf, 0x16, 0xfe, 0xa7, 0xfd, 0xfd, 0xd3, \n  0xc2, 0xff, 0xb7, 0x29, 0xfe, 0xdf, 0x47, 0xfd, 0x20, 0xad, 0xfe, 0x30, 0xbb, 0xfe, 0xa7, 0xf4, \n  0xfd, 0x77, 0xdc, 0xfd, 0x09, 0x77, 0xfe, 0x0d, 0x53, 0xff, 0x35, 0x79, 0xff, 0x5e, 0xd8, 0xfe, \n  0x8e, 0x96, 0xfe, 0x86, 0xb7, 0xfe, 0x41, 0xee, 0x17, 0x4e, 0x18, 0x1b, 0x9d, 0x96, 0x08, 0x9c, \n  0x87, 0x09, 0x84, 0xa7, 0x05, 0xf0, 0xda, 0x00, 0x71, 0x65, 0xf5, 0x94, 0xd7, 0xf8, 0x69, 0x0c, \n  0x06, 0x1c, 0xd2, 0xff, 0x6f, 0x03, 0xfc, 0x8c, 0xb0, 0xfd, 0x35, 0xb1, 0xfc, 0x74, 0x9d, 0xff, \n  0x78, 0xd4, 0x00, 0xe6, 0x6a, 0xfe, 0x8c, 0x15, 0xff, 0x76, 0xc3, 0xfd, 0xdb, 0x71, 0xfd, 0x68, \n  0xcd, 0xff, 0x88, 0x67, 0xfd, 0x81, 0x01, 0xfe, 0xf1, 0xdc, 0xfe, 0x64, 0x85, 0xfd, 0x9d, 0xbf, \n  0xfe, 0x97, 0xf4, 0xfd, 0x62, 0x8d, 0xfd, 0x3e, 0x86, 0xff, 0x0a, 0x5d, 0xff, 0x7f, 0xaa, 0xfe, \n  0xf1, 0x9f, 0xfe, 0x2a, 0xd8, 0xfe, 0x5c, 0x4d, 0x1a, 0x46, 0x29, 0x18, 0x29, 0x12, 0x06, 0x15, \n  0xf7, 0x0f, 0xd4, 0x82, 0x07, 0x17, 0x3c, 0xfe, 0xaf, 0x73, 0xf5, 0xc8, 0xd8, 0xfa, 0x29, 0x51, \n  0x04, 0xa9, 0xb7, 0xfc, 0x22, 0xcb, 0xfe, 0x52, 0xad, 0xfe, 0x04, 0x13, 0xfb, 0x5d, 0xd2, 0xff, \n  0x99, 0x76, 0x00, 0x9b, 0x3f, 0xfe, 0x6c, 0x9e, 0xff, 0x45, 0x55, 0xfd, 0xc1, 0xc1, 0xfc, 0x94, \n  0xa3, 0xff, 0x10, 0x71, 0xfd, 0xde, 0xeb, 0xfd, 0xb3, 0xad, 0xfd, 0x68, 0x05, 0xfe, 0x32, 0x33, \n  0xff, 0xd2, 0x93, 0xfd, 0x2e, 0xd1, 0xfd, 0x9a, 0xf1, 0xfe, 0x3e, 0x51, 0xff, 0x70, 0x00, 0xff, \n  0x33, 0x09, 0xff, 0xf7, 0x51, 0xfe, 0xf9, 0xb4, 0x1d, 0x97, 0xb3, 0x17, 0x17, 0xe7, 0x01, 0xcb, \n  0x8f, 0x13, 0x3b, 0x54, 0x09, 0xe6, 0x40, 0xfb, 0x86, 0x27, 0xf7, 0xd0, 0xbb, 0xfe, 0x7c, 0xc3, \n  0x01, 0x43, 0x91, 0xf7, 0xad, 0x42, 0x01, 0x16, 0xae, 0x01, 0x0f, 0xcc, 0xf9, 0xfc, 0x85, 0xff, \n  0x25, 0xe6, 0xff, 0x8a, 0x0d, 0xfe, 0x07, 0xab, 0x00, 0xdb, 0xcc, 0xfc, 0x23, 0xd9, 0xfb, 0x89, \n  0x9f, 0x00, 0x88, 0x0b, 0xfc, 0x15, 0x06, 0xfd, 0x38, 0x02, 0xff, 0xdd, 0xe0, 0xfc, 0x73, 0x86, \n  0xff, 0x90, 0x09, 0xfe, 0xde, 0xbb, 0xfd, 0xc7, 0x21, 0xff, 0x3f, 0x38, 0xff, 0xfc, 0x80, 0xff, \n  0x51, 0xeb, 0xfe, 0xac, 0xa5, 0xfd, 0xd3, 0x21, 0x21, 0xb9, 0x40, 0x18, 0x84, 0xc2, 0xfc, 0x21, \n  0x7f, 0x15, 0xc4, 0x86, 0x0c, 0x40, 0x27, 0xf8, 0x7e, 0xc3, 0xf7, 0xb9, 0xcc, 0x03, 0x10, 0x97, \n  0x00, 0x56, 0x00, 0xf1, 0x4c, 0xa9, 0x01, 0x2e, 0x32, 0x06, 0xae, 0x70, 0xf9, 0xa4, 0x99, 0xfe, \n  0xfa, 0x59, 0xff, 0xb3, 0x4a, 0xfd, 0x1c, 0xbd, 0x01, 0xb8, 0xb1, 0xfc, 0xb2, 0xc0, 0xfb, 0xec, \n  0xb9, 0xff, 0x6e, 0xdb, 0xfa, 0xb0, 0x7a, 0xfd, 0x68, 0x94, 0xfe, 0x08, 0xb5, 0xfc, 0xe5, 0xd7, \n  0xff, 0x37, 0xdc, 0xfd, 0x54, 0xe3, 0xfd, 0xa7, 0xf9, 0xff, 0x66, 0x5a, 0xff, 0x08, 0xa1, 0xfe, \n  0x4a, 0xf8, 0xfe, 0x5f, 0x6f, 0xfe, 0x5f, 0x40, 0x24, 0x78, 0xd0, 0x19, 0x28, 0x76, 0xf7, 0xd9, \n  0x8d, 0x15, 0x28, 0xc3, 0x10, 0x76, 0xf7, 0xf5, 0x5b, 0x57, 0xf7, 0x0e, 0xfc, 0x08, 0x27, 0x54, \n  0x01, 0x49, 0xd2, 0xea, 0xc9, 0x40, 0xff, 0x7f, 0xd6, 0x0a, 0x1f, 0x40, 0xfb, 0x75, 0x3d, 0xfd, \n  0xc9, 0xd6, 0xfe, 0xdf, 0x36, 0xfc, 0x93, 0x60, 0x02, 0x3d, 0x0d, 0xfe, 0x93, 0x3e, 0xfa, 0x1e, \n  0x47, 0xff, 0xb7, 0x03, 0xfb, 0x58, 0xda, 0xfb, 0x6b, 0x59, 0xff, 0xd9, 0xf0, 0xfc, 0x3b, 0x65, \n  0xff, 0xb7, 0x24, 0xfe, 0x8d, 0x13, 0xfe, 0xd7, 0xdc, 0x00, 0x0d, 0x1d, 0xff, 0x55, 0xed, 0xfd, \n  0x85, 0x9b, 0xff, 0xe1, 0xdb, 0xfe, 0xd5, 0x2a, 0x28, 0xce, 0x74, 0x1c, 0xaf, 0x40, 0xf1, 0x52, \n  0x70, 0x12, 0xba, 0xa3, 0x15, 0x71, 0x6e, 0xf6, 0x0a, 0x46, 0xf5, 0x3a, 0x24, 0x0c, 0x1c, 0x43, \n  0x03, 0xec, 0xec, 0xe6, 0x83, 0x08, 0xfb, 0xea, 0x63, 0x0d, 0xa4, 0xac, 0xfe, 0xd9, 0x87, 0xfc, \n  0xef, 0xbe, 0xfd, 0xfc, 0xfe, 0xfa, 0x10, 0x7b, 0x03, 0x50, 0xe2, 0xfd, 0x05, 0xe3, 0xf8, 0x87, \n  0x29, 0x00, 0xd3, 0x0f, 0xfa, 0x11, 0xc5, 0xfa, 0x31, 0x7d, 0xff, 0x73, 0x49, 0xfd, 0xe8, 0x89, \n  0xff, 0x87, 0x03, 0xfe, 0xb2, 0x31, 0xfe, 0x40, 0x0a, 0x01, 0x6a, 0x21, 0xff, 0xe5, 0xe7, 0xfd, \n  0xa9, 0xb3, 0xff, 0x3f, 0xce, 0xfe, 0xaa, 0x66, 0x2c, 0x7d, 0xcb, 0x1e, 0x03, 0xae, 0xeb, 0xb1, \n  0x0a, 0x0f, 0x5a, 0x0a, 0x19, 0x52, 0x0e, 0xf8, 0x6c, 0x91, 0xf3, 0xaa, 0x0c, 0x0f, 0x0d, 0x29, \n  0x05, 0x4c, 0x38, 0xe4, 0xd1, 0xaa, 0xf6, 0xd1, 0x19, 0x0e, 0x5a, 0xff, 0x02, 0x97, 0x14, 0xfd, \n  0x8b, 0xda, 0xfb, 0x65, 0x64, 0xfa, 0x26, 0x0d, 0x04, 0x40, 0x2e, 0xfd, 0xe2, 0xdc, 0xf8, 0xab, \n  0xee, 0xff, 0xc1, 0x1b, 0xfa, 0x7c, 0xfe, 0xf9, 0x0d, 0xea, 0xfe, 0xb8, 0x19, 0xfe, 0xfb, 0xc1, \n  0xff, 0xff, 0x11, 0xfe, 0x89, 0xcc, 0xfd, 0x3b, 0x19, 0x01, 0x75, 0x59, 0xff, 0x30, 0x41, 0xfe, \n  0xae, 0x72, 0xff, 0x47, 0xdd, 0xfe, 0x96, 0x7d, 0x32, 0x96, 0xb6, 0x1f, 0x26, 0xe5, 0xe5, 0x55, \n  0xf3, 0x0b, 0xd6, 0xcf, 0x1a, 0x49, 0xc2, 0xfa, 0x9b, 0x8e, 0xf2, 0x9d, 0x23, 0x11, 0x09, 0x1c, \n  0x06, 0x08, 0xbf, 0xe2, 0xb8, 0x88, 0xf3, 0xfe, 0x41, 0x0d, 0x74, 0x01, 0x07, 0xd5, 0x6c, 0xfe, \n  0x94, 0x2b, 0xfa, 0xda, 0x7a, 0xf9, 0xf8, 0xbb, 0x04, 0xb5, 0x86, 0xfc, 0x02, 0x78, 0xf8, 0x86, \n  0x3a, 0x00, 0xc0, 0xd0, 0xf9, 0x9f, 0xe5, 0xf9, 0x1a, 0xae, 0xfe, 0xae, 0x5a, 0xfe, 0x2b, 0x15, \n  0x00, 0xbd, 0x33, 0xfe, 0xb8, 0x2b, 0xfd, 0x6f, 0x37, 0x01, 0x8e, 0xdc, 0xff, 0xd3, 0x33, 0xfe, \n  0x50, 0x55, 0xff, 0xb0, 0xd2, 0xfe, 0x62, 0x4b, 0x39, 0x66, 0xa8, 0x20, 0x0f, 0x26, 0xdf, 0x10, \n  0x73, 0x08, 0x50, 0xc3, 0x1b, 0x22, 0xa8, 0xfe, 0xae, 0x00, 0xf2, 0xeb, 0x19, 0x11, 0xfd, 0xa6, \n  0x06, 0x29, 0xa0, 0xe2, 0x6a, 0x69, 0xf1, 0x52, 0x2b, 0x0b, 0xd3, 0xa7, 0x09, 0x9e, 0x83, 0x00, \n  0x33, 0x0b, 0xf9, 0x45, 0xcf, 0xf7, 0x9f, 0xa2, 0x05, 0xb4, 0xc9, 0xfb, 0x88, 0xbe, 0xf7, 0x90, \n  0xad, 0x00, 0x0e, 0x4a, 0xf9, 0x8a, 0x78, 0xfa, 0x77, 0x16, 0xfe, 0x3e, 0x74, 0xfe, 0x65, 0x6f, \n  0x00, 0x3f, 0xe1, 0xfd, 0x3f, 0xbc, 0xfc, 0x64, 0x72, 0x01, 0x2e, 0x36, 0x00, 0x43, 0xd0, 0xfd, \n  0xfa, 0x32, 0xff, 0xd0, 0xab, 0xfe, 0xba, 0x1e, 0x3f, 0xc1, 0xde, 0x22, 0x17, 0x80, 0xd8, 0xda, \n  0xff, 0x05, 0xbe, 0xa5, 0x1b, 0x28, 0x66, 0x02, 0x99, 0x70, 0xf2, 0x05, 0x44, 0x10, 0xd5, 0xc3, \n  0x08, 0x19, 0xe2, 0xe2, 0x59, 0xa2, 0xef, 0xad, 0xd2, 0x08, 0xf7, 0x2e, 0x0b, 0xc1, 0xb9, 0x03, \n  0x74, 0x74, 0xf8, 0xe5, 0x5a, 0xf6, 0xb7, 0x5e, 0x06, 0x12, 0x4b, 0xfb, 0x9c, 0x81, 0xf7, 0xd6, \n  0x55, 0x01, 0x1a, 0x11, 0xf9, 0x31, 0xbf, 0xfa, 0x1b, 0x22, 0xfe, 0x49, 0x73, 0xfe, 0xa4, 0x8e, \n  0x00, 0x33, 0xa2, 0xfd, 0xc0, 0xe5, 0xfc, 0x8e, 0xea, 0x01, 0x06, 0xec, 0xff, 0xfb, 0x87, 0xfd, \n  0xcc, 0x71, 0xff, 0xf9, 0xad, 0xfe, 0xc3, 0xf0, 0x45, 0xe4, 0x1e, 0x22, 0xa4, 0x02, 0xd3, 0x6e, \n  0xf0, 0x05, 0xcb, 0xcd, 0x19, 0x01, 0x91, 0x03, 0xd1, 0x69, 0xf3, 0x9a, 0xd4, 0x0f, 0x2e, 0x8a, \n  0x0b, 0x9a, 0x62, 0xe2, 0x04, 0x4d, 0xed, 0x24, 0x49, 0x07, 0x6e, 0x7d, 0x0b, 0xe0, 0x7a, 0x06, \n  0x50, 0xe8, 0xf7, 0x68, 0xe4, 0xf5, 0x07, 0x2e, 0x06, 0xdb, 0xea, 0xf9, 0x78, 0x7b, 0xf8, 0x57, \n  0xe5, 0x01, 0x2d, 0x33, 0xf8, 0x91, 0x99, 0xfa, 0x70, 0xc4, 0xfe, 0x7a, 0xfe, 0xfd, 0xdb, 0x4f, \n  0x00, 0x1c, 0x7c, 0xfd, 0x24, 0x69, 0xfd, 0xfc, 0x30, 0x02, 0x9a, 0xe6, 0xfe, 0x11, 0x9d, 0xfd, \n  0x79, 0x94, 0xff, 0x35, 0xb0, 0xfe, 0x1a, 0x12, 0x4a, 0x78, 0xe3, 0x23, 0xed, 0x2c, 0xce, 0x06, \n  0xd4, 0x06, 0x65, 0x18, 0x17, 0xc0, 0x23, 0x03, 0x7c, 0x74, 0xf4, 0x95, 0xe4, 0x0e, 0xcc, 0x19, \n  0x11, 0x51, 0xf0, 0xe1, 0x78, 0x22, 0xe9, 0x24, 0x79, 0x06, 0x1c, 0xd1, 0x0b, 0x72, 0xb8, 0x07, \n  0x27, 0x01, 0xf9, 0x18, 0x20, 0xf6, 0x67, 0x67, 0x04, 0xb1, 0x86, 0xf9, 0xbe, 0xe7, 0xf9, 0xa9, \n  0xf3, 0x01, 0xe5, 0x8c, 0xf7, 0xe5, 0x7a, 0xfa, 0xea, 0x3e, 0xff, 0x72, 0x54, 0xfd, 0x13, 0x09, \n  0x00, 0x7a, 0xe1, 0xfd, 0xb5, 0xb9, 0xfd, 0xa1, 0x49, 0x02, 0xaf, 0x02, 0xfe, 0x4d, 0xc2, 0xfd, \n  0xd5, 0xd0, 0xff, 0xbb, 0x67, 0xfe, 0xb3, 0xae, 0x4e, 0x8a, 0x3d, 0x23, 0x32, 0x71, 0xcb, 0x64, \n  0x3b, 0x09, 0x27, 0x6b, 0x13, 0x82, 0x26, 0x01, 0x40, 0x66, 0xf4, 0x98, 0x2a, 0x0f, 0x18, 0x31, \n  0x17, 0x54, 0x37, 0xe1, 0xcf, 0xcb, 0xe4, 0x82, 0x1e, 0x06, 0x01, 0xf1, 0x0b, 0xc7, 0x81, 0x07, \n  0xeb, 0x62, 0xfb, 0xd7, 0x64, 0xf6, 0xc0, 0x19, 0x02, 0xfb, 0x08, 0xfa, 0x29, 0xe4, 0xfa, 0x00, \n  0xc9, 0x01, 0x60, 0xbe, 0xf6, 0x26, 0x16, 0xfb, 0x4f, 0x41, 0xff, 0xf2, 0x4c, 0xfc, 0x92, 0xf7, \n  0xff, 0x59, 0x7b, 0xfe, 0xb0, 0xfb, 0xfd, 0xa7, 0x24, 0x02, 0x72, 0x73, 0xfd, 0x7d, 0xab, 0xfd, \n  0x6c, 0x3c, 0x00, 0x9b, 0xa9, 0xfd, 0xaf, 0xd6, 0x51, 0x0d, 0x33, 0x23, 0x1b, 0x5a, 0xca, 0xff, \n  0xb7, 0x0b, 0xfd, 0xb6, 0x0f, 0xb9, 0xee, 0xfe, 0x39, 0xb8, 0xf2, 0xe6, 0x04, 0x10, 0x2a, 0xac, \n  0x1d, 0xa6, 0xed, 0xe0, 0x82, 0x45, 0xe1, 0xee, 0x45, 0x05, 0x8d, 0x97, 0x0b, 0xbf, 0xcc, 0x06, \n  0x8b, 0xf5, 0xfe, 0xe9, 0xe8, 0xf5, 0xbb, 0x48, 0x00, 0x82, 0xa5, 0xfb, 0xcc, 0x9d, 0xfa, 0x3c, \n  0xc4, 0x01, 0x8d, 0x46, 0xf6, 0x96, 0x13, 0xfc, 0x6d, 0xdc, 0xfe, 0x61, 0x5d, 0xfb, 0xb3, 0xc6, \n  0xff, 0x18, 0x45, 0xff, 0x2e, 0x56, 0xfe, 0x15, 0x9d, 0x01, 0x2e, 0x7f, 0xfd, 0x22, 0x7a, 0xfd, \n  0xeb, 0x55, 0x00, 0x1e, 0x90, 0xfc, 0x78, 0xe7, 0x52, 0xeb, 0xca, 0x24, 0xb2, 0x63, 0xca, 0xd3, \n  0x26, 0x0d, 0x88, 0x02, 0x0d, 0x8c, 0x50, 0xfd, 0x32, 0x89, 0xef, 0x28, 0x38, 0x10, 0xf8, 0x78, \n  0x23, 0x7c, 0x00, 0xe2, 0xbc, 0x96, 0xdf, 0x5e, 0xf9, 0x02, 0x59, 0xe2, 0x0a, 0x0f, 0xf2, 0x05, \n  0xea, 0x99, 0x02, 0x0f, 0xa5, 0xf5, 0x96, 0xa1, 0xfe, 0x1b, 0xeb, 0xfd, 0x00, 0xa2, 0xf9, 0x16, \n  0x70, 0x01, 0x7c, 0xaf, 0xf6, 0xe6, 0xff, 0xfc, 0x4e, 0x0d, 0xfe, 0xd1, 0xbd, 0xfa, 0x90, 0x8c, \n  0xff, 0x12, 0xf9, 0xff, 0xad, 0x9a, 0xfe, 0x9c, 0xd2, 0x00, 0x63, 0x57, 0xfe, 0x55, 0xd0, 0xfc, \n  0xa6, 0x9e, 0xff, 0xdc, 0x38, 0xfc, 0xf7, 0x30, 0x54, 0x2d, 0xdb, 0x26, 0x4e, 0x67, 0xca, 0xfd, \n  0xed, 0x0c, 0x25, 0x82, 0x0b, 0x8a, 0x6f, 0xfc, 0xda, 0x3b, 0xeb, 0xee, 0xbd, 0x0f, 0x49, 0xd3, \n  0x27, 0xf9, 0x3d, 0xe4, 0x39, 0x57, 0xdf, 0xdb, 0x52, 0xff, 0xed, 0x59, 0x0a, 0xa8, 0xb0, 0x05, \n  0x05, 0x06, 0x05, 0x00, 0x4b, 0xf6, 0x75, 0x55, 0xfd, 0x3c, 0x6c, 0xff, 0x25, 0x00, 0xf9, 0x31, \n  0xb6, 0x00, 0xaa, 0x8f, 0xf7, 0xff, 0x71, 0xfd, 0xf4, 0x35, 0xfd, 0x5b, 0x70, 0xfa, 0xaf, 0x57, \n  0xff, 0x01, 0x55, 0x00, 0xa0, 0xa7, 0xfe, 0xbd, 0xb6, 0x00, 0x3b, 0xbb, 0xfe, 0x3d, 0x97, 0xfb, \n  0x65, 0x35, 0xff, 0x63, 0x42, 0xfc, 0xb9, 0xf9, 0x54, 0x06, 0x11, 0x28, 0x53, 0xf7, 0xcb, 0xb5, \n  0xe6, 0x0b, 0x4b, 0xb2, 0x0a, 0x76, 0xdc, 0xfb, 0x0e, 0x50, 0xe7, 0x1f, 0x52, 0x0e, 0x35, 0xa5, \n  0x29, 0x17, 0x5c, 0xe8, 0x6b, 0x3a, 0xe0, 0x7c, 0x20, 0xfb, 0xb5, 0x80, 0x09, 0x18, 0x32, 0x06, \n  0xa1, 0xaf, 0x05, 0x10, 0x84, 0xf7, 0x1e, 0x29, 0xfd, 0xbb, 0x77, 0xff, 0xc8, 0x3a, 0xf9, 0x2b, \n  0x0a, 0x00, 0x08, 0x8b, 0xf8, 0x3d, 0x70, 0xfd, 0x91, 0x8e, 0xfc, 0x58, 0x66, 0xfa, 0x7f, 0x02, \n  0xff, 0x20, 0x47, 0x00, 0xb0, 0x04, 0xff, 0x56, 0x90, 0x00, 0xe6, 0xb3, 0xfd, 0x87, 0xa4, 0xfb, \n  0xc9, 0x86, 0xfe, 0x77, 0x25, 0xfc, 0x66, 0xbe, 0x53, 0xff, 0xf0, 0x2a, 0x1f, 0x65, 0xce, 0x7d, \n  0x26, 0x0a, 0x8b, 0x93, 0x0a, 0x2f, 0xc4, 0xfa, 0x4a, 0x66, 0xe5, 0x4b, 0x38, 0x0a, 0x4d, 0x6d, \n  0x2a, 0x27, 0x97, 0xee, 0x18, 0x25, 0xe1, 0xaf, 0x0c, 0xf7, 0x8e, 0x42, 0x08, 0x75, 0x6f, 0x07, \n  0x67, 0x11, 0x05, 0x94, 0x31, 0xf9, 0x28, 0x18, 0xfe, 0x3a, 0x6e, 0xfe, 0x65, 0xc8, 0xf9, 0xf6, \n  0x4a, 0x00, 0x83, 0x18, 0xf9, 0x28, 0x11, 0xfd, 0x7b, 0x3f, 0xfc, 0x49, 0x1a, 0xfa, 0x6a, 0xf1, \n  0xfe, 0x71, 0x7d, 0x00, 0xc7, 0x84, 0xfe, 0x02, 0xe7, 0xff, 0x09, 0x47, 0xfd, 0x00, 0xcd, 0xfb, \n  0x61, 0xf3, 0xfd, 0x89, 0xe7, 0xfc, 0x6a, 0x01, 0x51, 0x3d, 0xe3, 0x2e, 0x3e, 0xbd, 0xd1, 0x10, \n  0x15, 0x08, 0x9c, 0x3b, 0x0a, 0xf5, 0xda, 0xf9, 0xab, 0x8f, 0xe5, 0x6c, 0x6b, 0x03, 0xe6, 0x7d, \n  0x2a, 0x5f, 0xf8, 0xf5, 0xbd, 0x13, 0xe2, 0x92, 0x48, 0xf4, 0x10, 0x30, 0x06, 0x43, 0xd9, 0x08, \n  0xd2, 0xc9, 0x03, 0xd6, 0x1f, 0xfb, 0x1b, 0xf5, 0xff, 0x21, 0x93, 0xfc, 0xe6, 0x07, 0xfb, 0x1c, \n  0xe7, 0x00, 0x1c, 0x66, 0xf9, 0x02, 0x69, 0xfc, 0xdf, 0xd9, 0xfb, 0x6f, 0x2b, 0xfa, 0x90, 0x45, \n  0xff, 0x60, 0xc9, 0xff, 0x59, 0x11, 0xfd, 0xe3, 0x91, 0x00, 0xda, 0x8e, 0xfc, 0x69, 0x2e, 0xfc, \n  0xaa, 0x99, 0xfe, 0x97, 0xc1, 0xfc, 0xb1, 0x0a, 0x4d, 0x2c, 0x73, 0x33, 0x79, 0x1b, 0xd6, 0xf0, \n  0xef, 0x04, 0x5a, 0xea, 0x08, 0xfc, 0x95, 0xfa, 0x2b, 0x7c, 0xe7, 0xfa, 0x18, 0xfa, 0x7c, 0x40, \n  0x29, 0xa1, 0xb5, 0xfd, 0x51, 0x74, 0xe3, 0x25, 0x5a, 0xf3, 0x9e, 0x02, 0x03, 0x9e, 0x21, 0x09, \n  0x4c, 0x28, 0x03, 0xd2, 0x78, 0xfc, 0xae, 0x81, 0x02, 0xa6, 0xe1, 0xfa, 0xc7, 0x05, 0xfc, 0xa4, \n  0xe6, 0x01, 0x52, 0x46, 0xf9, 0x4f, 0x8a, 0xfb, 0x77, 0xa0, 0xfb, 0xcd, 0xc1, 0xfa, 0x7d, 0xfa, \n  0xfd, 0x60, 0xe3, 0xfe, 0xfb, 0x6a, 0xfc, 0xc2, 0xf5, 0x00, 0x20, 0xa2, 0xfc, 0xec, 0xdb, 0xfc, \n  0x30, 0xb5, 0xfe, 0xf1, 0x4d, 0xfc, 0x30, 0x29, 0x49, 0x6e, 0x17, 0x35, 0xd0, 0xae, 0xdc, 0x48, \n  0x90, 0x03, 0xb0, 0xf4, 0x05, 0x6a, 0xdd, 0xfb, 0xe1, 0x31, 0xe8, 0xe9, 0x93, 0xf1, 0xdf, 0x9e, \n  0x27, 0x6f, 0xd1, 0x04, 0xe6, 0xca, 0xe4, 0x33, 0xde, 0xf3, 0x4e, 0xac, 0xff, 0x55, 0xcf, 0x06, \n  0x1a, 0x56, 0x05, 0xc3, 0x49, 0xfc, 0xd6, 0xde, 0x04, 0xcd, 0x17, 0xfb, 0xb4, 0x16, 0xfb, 0x20, \n  0xe4, 0x03, 0x37, 0x9b, 0xf8, 0xc0, 0xf9, 0xfa, 0x9f, 0xab, 0xfb, 0x40, 0xb2, 0xf9, 0xff, 0x9f, \n  0xfc, 0x5d, 0xa1, 0xfe, 0xf2, 0xea, 0xfb, 0x59, 0xc0, 0x01, 0xd4, 0x7b, 0xfd, 0x70, 0x35, 0xfc, \n  0x4b, 0x4e, 0xff, 0x75, 0x6c, 0xfc, 0x2f, 0xee, 0x43, 0xd5, 0xe5, 0x35, 0x29, 0xda, 0xe4, 0x18, \n  0x6a, 0x03, 0x07, 0xff, 0x02, 0x84, 0x07, 0xfd, 0xa1, 0x55, 0xe8, 0xab, 0x7f, 0xe9, 0xb0, 0x60, \n  0x25, 0x78, 0x70, 0x0c, 0x4b, 0xdc, 0xe5, 0xfb, 0x98, 0xf4, 0x4f, 0x05, 0xfe, 0x13, 0x99, 0x01, \n  0xf5, 0x21, 0x09, 0x13, 0x95, 0xfc, 0x52, 0xeb, 0x04, 0xee, 0x80, 0xfe, 0x35, 0xd3, 0xf8, 0x37, \n  0xf4, 0x04, 0xdf, 0xbc, 0xf9, 0x80, 0x78, 0xf9, 0x14, 0x5b, 0xfb, 0x1b, 0xe8, 0xf8, 0x77, 0xe7, \n  0xfa, 0xc7, 0x15, 0xff, 0x49, 0x43, 0xfc, 0x6b, 0xc1, 0x01, 0x22, 0xa7, 0xfe, 0x39, 0x8f, 0xfb, \n  0x5c, 0xd1, 0xff, 0x2a, 0x1d, 0xfc, 0xdb, 0x5b, 0x3f, 0x70, 0xec, 0x36, 0xd3, 0xb6, 0xec, 0x72, \n  0x45, 0x01, 0x70, 0x0c, 0xff, 0xbc, 0xd6, 0xff, 0xfd, 0x31, 0xeb, 0x8d, 0x4c, 0xe2, 0x01, 0x84, \n  0x1f, 0xde, 0x9c, 0x13, 0xb7, 0xc2, 0xe7, 0x66, 0x18, 0xf5, 0x12, 0xbf, 0xff, 0x59, 0xbf, 0xfa, \n  0x43, 0xb5, 0x0a, 0x5f, 0xe4, 0xff, 0x57, 0xd6, 0x02, 0x07, 0x45, 0x02, 0xd0, 0x76, 0xf8, 0xee, \n  0x41, 0x03, 0x5a, 0xb5, 0xfb, 0xfa, 0x97, 0xf8, 0x32, 0x68, 0xfa, 0xea, 0xe9, 0xf8, 0xfc, 0xea, \n  0xf9, 0xcf, 0x21, 0xff, 0x02, 0x41, 0xfd, 0x97, 0x05, 0x01, 0x67, 0xbd, 0xff, 0x60, 0x49, 0xfb, \n  0xe1, 0x41, 0xff, 0x7d, 0xd7, 0xfc, 0x99, 0x7e, 0x3c, 0x7b, 0x07, 0x37, 0x69, 0x17, 0xef, 0xb8, \n  0x43, 0x03, 0x51, 0x26, 0x00, 0xbd, 0x74, 0xfb, 0x41, 0xab, 0xed, 0x74, 0x68, 0xe1, 0xb5, 0xe2, \n  0x16, 0xea, 0xfd, 0x18, 0x02, 0x87, 0xeb, 0xe3, 0x65, 0xf3, 0xfd, 0x6d, 0x03, 0x48, 0xd9, 0xf5, \n  0x31, 0xd9, 0x08, 0x3c, 0x27, 0x05, 0x64, 0xcc, 0x00, 0xe9, 0x3d, 0x03, 0x24, 0x4f, 0xfa, 0x38, \n  0x3b, 0x00, 0x9e, 0x94, 0xfd, 0x72, 0x25, 0xf9, 0x59, 0xcc, 0xf8, 0x5e, 0xb1, 0xfa, 0xe4, 0xae, \n  0xf8, 0xfc, 0xb0, 0xfe, 0x8e, 0x49, 0xfe, 0x20, 0x34, 0x00, 0x00, 0xa2, 0xff, 0xf3, 0xba, 0xfb, \n  0xe0, 0xd6, 0xfe, 0x42, 0x25, 0xfd, 0x42, 0xbb, 0x3d, 0x37, 0x52, 0x34, 0x0b, 0x83, 0xed, 0xa8, \n  0x1a, 0x07, 0x92, 0x16, 0x02, 0xd9, 0xb6, 0xf5, 0x81, 0xe9, 0xed, 0x72, 0xca, 0xe5, 0xcd, 0xbc, \n  0x0e, 0x53, 0xec, 0x19, 0xa6, 0x9b, 0xf0, 0x28, 0x76, 0xf1, 0x31, 0xe6, 0x06, 0x6d, 0x1d, 0xf4, \n  0x09, 0x44, 0x06, 0x48, 0x64, 0x07, 0x04, 0x75, 0x00, 0x24, 0x6e, 0x02, 0xd4, 0xc7, 0xfb, 0xb0, \n  0x90, 0xff, 0xab, 0xa3, 0xfc, 0x26, 0x82, 0xfb, 0xdb, 0x56, 0xf8, 0xdb, 0x17, 0xfc, 0x45, 0xdd, \n  0xf8, 0x6c, 0x88, 0xfc, 0x1c, 0xcd, 0xfe, 0x00, 0x77, 0xff, 0x08, 0xf9, 0xff, 0x54, 0xb5, 0xfb, \n  0xec, 0x5b, 0xfe, 0x39, 0x6b, 0xfd, 0xdf, 0x4a, 0x3d, 0x66, 0x21, 0x33, 0x93, 0xf4, 0xeb, 0x6e, \n  0x32, 0x0a, 0x9b, 0x33, 0x04, 0x7c, 0x1a, 0xf1, 0x51, 0x7a, 0xef, 0xfd, 0x50, 0xe9, 0xea, 0xf5, \n  0x06, 0x05, 0x78, 0x19, 0xec, 0xcb, 0xf7, 0x72, 0x89, 0xee, 0x63, 0xe9, 0x09, 0x35, 0x97, 0xf4, \n  0x0f, 0x73, 0x02, 0x94, 0xce, 0x09, 0x5b, 0x43, 0xfd, 0xb3, 0x2b, 0x04, 0xa2, 0xa1, 0xfc, 0x4b, \n  0xc4, 0xfd, 0x64, 0xb4, 0xfe, 0x91, 0x6c, 0xfd, 0x2f, 0xd6, 0xf8, 0xcd, 0x18, 0xfd, 0xfb, 0x4a, \n  0xf9, 0x42, 0x03, 0xfa, 0x23, 0x9c, 0xfe, 0x1d, 0x9c, 0xfe, 0x75, 0xfb, 0x00, 0xf7, 0xfc, 0xfb, \n  0x84, 0xab, 0xfc, 0x98, 0x09, 0xfe, 0x6d, 0x55, 0x3f, 0x01, 0xc7, 0x2d, 0x28, 0x00, 0xeb, 0x99, \n  0xc8, 0x0e, 0xf1, 0xc7, 0x02, 0x3b, 0x1c, 0xef, 0xa1, 0x37, 0xf1, 0xcc, 0x87, 0xeb, 0x52, 0x9c, \n  0x00, 0x73, 0x9d, 0x19, 0xe0, 0x1c, 0xfd, 0x76, 0x62, 0xec, 0xaf, 0xa9, 0x0a, 0xb5, 0x26, 0xf8, \n  0xda, 0xf2, 0xfd, 0xd2, 0x47, 0x09, 0x6a, 0x3e, 0xfe, 0xc6, 0x83, 0x00, 0x04, 0x6b, 0xff, 0x3c, \n  0x40, 0xfe, 0xfc, 0xf0, 0xff, 0xcd, 0xa6, 0xff, 0xda, 0x77, 0xf8, 0xb2, 0x4b, 0xfd, 0xfe, 0x93, \n  0xfa, 0x58, 0x0d, 0xf9, 0x8b, 0xfb, 0xfb, 0x2d, 0xe8, 0xfe, 0x91, 0x86, 0x00, 0x3e, 0x87, 0xfc, \n  0x4c, 0x55, 0xfc, 0xc0, 0xb2, 0xfd, 0x17, 0x85, 0x40, 0xb9, 0xc3, 0x2b, 0x31, 0x86, 0xe5, 0x6c, \n  0xcd, 0x12, 0x8a, 0x55, 0x06, 0xaf, 0xbd, 0xe9, 0x53, 0xd0, 0xf1, 0xe5, 0xf1, 0xf1, 0x3d, 0x25, \n  0xfc, 0x15, 0xc9, 0x13, 0x74, 0xf6, 0x04, 0x89, 0xc2, 0xeb, 0x9c, 0xfb, 0x07, 0xc6, 0xe5, 0xfc, \n  0x31, 0x01, 0xfb, 0x98, 0xbf, 0x07, 0xa0, 0x98, 0xfe, 0xfb, 0xbd, 0xfd, 0x92, 0x3a, 0x01, 0x65, \n  0xef, 0x01, 0xc8, 0x31, 0xff, 0xd2, 0xf2, 0x00, 0x20, 0x65, 0xf9, 0x10, 0x50, 0xfc, 0xe1, 0x4f, \n  0xfc, 0x93, 0xe4, 0xf8, 0xa3, 0x7f, 0xfa, 0x22, 0x6d, 0xfd, 0xf3, 0x67, 0xff, 0xbe, 0x21, 0xfd, \n  0xef, 0xe4, 0xfd, 0x35, 0x79, 0xfd, 0x32, 0x64, 0x41, 0x65, 0x02, 0x29, 0xa4, 0x73, 0xdf, 0xcf, \n  0x88, 0x18, 0x17, 0xb1, 0x09, 0xb8, 0x56, 0xe3, 0xfe, 0x70, 0xf3, 0x70, 0xca, 0xf8, 0xff, 0x5c, \n  0xf8, 0xc4, 0x03, 0x0d, 0xe5, 0xa6, 0x0b, 0xc2, 0x53, 0xec, 0x2a, 0x93, 0x04, 0x2d, 0xd7, 0x00, \n  0xe7, 0x94, 0xf8, 0xf6, 0xa6, 0x06, 0x28, 0x2c, 0xff, 0x8d, 0xd2, 0xfc, 0x6d, 0x14, 0x02, 0xc5, \n  0xfb, 0x02, 0x50, 0x98, 0x00, 0x9a, 0x6b, 0x01, 0x48, 0xc8, 0xf9, 0x10, 0x6e, 0xfc, 0xdb, 0xa1, \n  0xfc, 0x99, 0x5d, 0xf9, 0x7f, 0xaa, 0xfa, 0xac, 0xc9, 0xfb, 0x34, 0xab, 0xfc, 0x8c, 0xfb, 0xfd, \n  0x7f, 0xc0, 0xff, 0x25, 0xbd, 0xfd, 0xbc, 0x66, 0x42, 0x72, 0xd3, 0x23, 0xa1, 0x74, 0xdb, 0x77, \n  0x75, 0x1f, 0x21, 0x06, 0x0a, 0xb6, 0x38, 0xdf, 0xef, 0xf7, 0xf5, 0xd4, 0x79, 0xfd, 0x34, 0x88, \n  0xf6, 0x87, 0x5b, 0x06, 0x14, 0x67, 0x0f, 0x9b, 0xcb, 0xee, 0x5d, 0x58, 0x02, 0x0f, 0xbe, 0x01, \n  0x61, 0xb2, 0xf6, 0x9e, 0xc9, 0x07, 0xc5, 0x5d, 0x00, 0x06, 0x22, 0xfb, 0x58, 0xc6, 0x03, 0x88, \n  0xb6, 0x01, 0xc8, 0xd6, 0x00, 0x7d, 0x64, 0x04, 0xf6, 0x9b, 0xf8, 0x38, 0x18, 0xfd, 0x36, 0x27, \n  0xfd, 0x95, 0x88, 0xf8, 0x51, 0x77, 0xfc, 0x32, 0x3a, 0xfb, 0xcd, 0xb7, 0xf9, 0xdc, 0xe7, 0xfd, \n  0x5a, 0xa5, 0x00, 0x9e, 0x7b, 0xfe, 0x60, 0x92, 0x42, 0xc6, 0x3e, 0x1d, 0xdb, 0xb6, 0xda, 0xbf, \n  0xef, 0x25, 0x15, 0xdd, 0x07, 0x0b, 0xc7, 0xdd, 0x36, 0x17, 0xf9, 0x36, 0xda, 0x00, 0x01, 0x29, \n  0xf3, 0xf5, 0x36, 0x02, 0x77, 0x83, 0x13, 0x4f, 0x27, 0xef, 0x77, 0xa5, 0xff, 0x29, 0x84, 0x04, \n  0x9c, 0xf2, 0xf5, 0xe1, 0xea, 0x05, 0x76, 0x15, 0x04, 0x04, 0x11, 0xfb, 0xa9, 0xc5, 0x01, 0x9a, \n  0x63, 0x02, 0x18, 0x0d, 0x00, 0x28, 0x23, 0x05, 0x2f, 0xe2, 0xfa, 0xe1, 0x9f, 0xfb, 0xc2, 0x4d, \n  0xfe, 0x7d, 0xd2, 0xf8, 0xd3, 0xe8, 0xfb, 0x53, 0x4a, 0xfd, 0x81, 0x30, 0xf8, 0x2c, 0x29, 0xfc, \n  0x8c, 0xb4, 0x00, 0x29, 0x59, 0xff, 0x01, 0x93, 0x3f, 0xf3, 0x19, 0x18, 0x13, 0x19, 0xde, 0x56, \n  0xac, 0x28, 0x2e, 0x90, 0x04, 0xde, 0x74, 0xe0, 0x18, 0x0c, 0xfc, 0xab, 0xe3, 0xff, 0xb7, 0x8e, \n  0xf1, 0xa8, 0x44, 0x01, 0xd1, 0x64, 0x14, 0x8d, 0xd9, 0xee, 0xad, 0x4d, 0xfe, 0xd6, 0x91, 0x07, \n  0x7a, 0x8a, 0xf5, 0x4f, 0x55, 0x03, 0xe5, 0x16, 0x07, 0x21, 0xd9, 0xfb, 0x15, 0x0f, 0x00, 0x38, \n  0x2f, 0x02, 0xb8, 0x73, 0xff, 0xe9, 0x18, 0x05, 0x9d, 0x10, 0xfc, 0x9d, 0x9c, 0xfb, 0xae, 0x34, \n  0xff, 0x90, 0x5b, 0xf9, 0xe2, 0x48, 0xfb, 0x00, 0x39, 0xfe, 0x05, 0x27, 0xf9, 0xeb, 0x01, 0xfb, \n  0x97, 0x2c, 0xff, 0x9c, 0x90, 0xff, 0xd9, 0x20, 0x3a, 0xc9, 0x42, 0x15, 0xd0, 0x6b, 0xe3, 0xcf, \n  0x8a, 0x27, 0x4d, 0x9f, 0x03, 0xda, 0x8e, 0xe4, 0x29, 0xfb, 0xfb, 0x2c, 0xf2, 0xff, 0xb1, 0x4e, \n  0xf2, 0xae, 0x7c, 0xfe, 0x79, 0x15, 0x14, 0x34, 0x66, 0xf1, 0x5b, 0x55, 0xfc, 0xf3, 0x84, 0x08, \n  0x19, 0xde, 0xf7, 0xa0, 0x38, 0x01, 0xa3, 0xea, 0x06, 0x7a, 0x1f, 0xfd, 0xf1, 0xb9, 0x00, 0x09, \n  0xe4, 0x00, 0xac, 0x86, 0xfe, 0x31, 0xc0, 0x05, 0xd6, 0x61, 0xfb, 0xa9, 0x5e, 0xfc, 0x27, 0xb4, \n  0x00, 0x4b, 0x5f, 0xf9, 0xfa, 0xae, 0xfb, 0xc2, 0x82, 0xfe, 0x9e, 0x05, 0xfa, 0x05, 0x7b, 0xfb, \n  0x61, 0x2f, 0xfe, 0xe3, 0x8d, 0xfe, 0xef, 0x7f, 0x33, 0xa8, 0x88, 0x14, 0xb2, 0xfd, 0xe7, 0x0c, \n  0xbf, 0x24, 0xb2, 0x22, 0x05, 0xcb, 0xa2, 0xe6, 0xf1, 0x06, 0xfc, 0xc5, 0x81, 0x01, 0x6e, 0x67, \n  0xf2, 0x3c, 0xdf, 0xfb, 0xf8, 0xac, 0x13, 0x4a, 0x80, 0xf4, 0x24, 0x27, 0xfa, 0xf4, 0x28, 0x09, \n  0xef, 0x5f, 0xfa, 0x34, 0xf6, 0xfe, 0xa6, 0xa8, 0x06, 0x14, 0x51, 0xfe, 0xff, 0x60, 0x00, 0x32, \n  0x46, 0x01, 0x0e, 0xfe, 0xfd, 0x84, 0x56, 0x04, 0x3d, 0xb8, 0xfc, 0x21, 0xc9, 0xfb, 0xb3, 0xfc, \n  0x00, 0x19, 0x45, 0xfb, 0x1d, 0x87, 0xfb, 0x56, 0x12, 0xff, 0xd9, 0x88, 0xfa, 0x94, 0xf2, 0xfb, \n  0xcb, 0x89, 0xfe, 0x9c, 0x00, 0xfe, 0xbd, 0xbb, 0x29, 0x23, 0xa5, 0x0f, 0x47, 0x9f, 0xf1, 0xf7, \n  0x3e, 0x25, 0x12, 0xe2, 0x02, 0x94, 0xb0, 0xe7, 0x6e, 0xf9, 0xff, 0x60, 0x19, 0x01, 0x00, 0x2d, \n  0xf6, 0x16, 0x0d, 0x00, 0xe1, 0x55, 0x06, 0x09, 0x71, 0xf6, 0x20, 0x82, 0x04, 0x36, 0xbf, 0x05, \n  0x5c, 0x61, 0xf9, 0x13, 0xfa, 0xfe, 0xef, 0x22, 0x03, 0x6b, 0x52, 0xfe, 0x4f, 0x97, 0xfd, 0xb6, \n  0x99, 0x00, 0x96, 0x80, 0xff, 0xaf, 0x08, 0x00, 0xdd, 0xb3, 0xfe, 0xf5, 0xf5, 0x01, 0xad, 0x31, \n  0x02, 0xcc, 0x73, 0x00, 0xe2, 0xbf, 0x00, 0x6e, 0xd2, 0xfe, 0x61, 0x39, 0xfd, 0x1d, 0xd1, 0xfe, \n  0x2d, 0xa5, 0xfd, 0x19, 0x17, 0xfc, 0x70, 0xa0, 0x23, 0x82, 0x74, 0x0f, 0xb6, 0x79, 0xf5, 0x79, \n  0xf9, 0x1f, 0xb4, 0x11, 0x04, 0x07, 0x56, 0xec, 0xca, 0x6f, 0xff, 0x4b, 0x35, 0x00, 0xc7, 0x78, \n  0xf7, 0x9b, 0x11, 0x00, 0x13, 0xdb, 0x05, 0x38, 0x35, 0xf8, 0x83, 0x29, 0x03, 0x55, 0x16, 0x05, \n  0x51, 0xc6, 0xfa, 0x89, 0x42, 0xfe, 0x92, 0x27, 0x02, 0xec, 0xde, 0xfe, 0x39, 0xe5, 0xfd, 0xbd, \n  0xf4, 0xff, 0x3f, 0xb7, 0xff, 0x27, 0xe3, 0x00, 0xef, 0xff, 0xfe, 0xf6, 0xf2, 0x00, 0xc9, 0x32, \n  0x02, 0x71, 0x88, 0x00, 0x6d, 0xfa, 0xff, 0xfb, 0xea, 0xfe, 0x8b, 0xc7, 0xfd, 0x45, 0x87, 0xfe, \n  0xd7, 0x10, 0xfe, 0x9a, 0x6f, 0xfd, 0x2a, 0x98, 0x1e, 0x16, 0x5e, 0x0f, 0x44, 0x65, 0xf8, 0x46, \n  0x4f, 0x1b, 0x0f, 0xae, 0x05, 0x1c, 0xe5, 0xef, 0xdd, 0xbc, 0xfe, 0xa7, 0x2d, 0x00, 0x42, 0xcf, \n  0xf8, 0x33, 0xdf, 0xff, 0xa5, 0x87, 0x05, 0x88, 0x06, 0xfa, 0xa8, 0xae, 0x01, 0xa1, 0xb3, 0x04, \n  0x2c, 0x51, 0xfc, 0xee, 0x95, 0xfd, 0x5d, 0xbe, 0x01, 0x74, 0x59, 0xff, 0xad, 0x28, 0xfe, 0x12, \n  0xee, 0xff, 0x0d, 0x16, 0x00, 0x2a, 0x14, 0x01, 0xc7, 0x16, 0xff, 0xcd, 0xf3, 0x00, 0xb4, 0x87, \n  0x01, 0x3d, 0x1c, 0x00, 0xc5, 0x72, 0x00, 0x9d, 0x59, 0xff, 0xba, 0xe3, 0xfd, 0x75, 0x8e, 0xfe, \n  0x75, 0x97, 0xfe, 0x0b, 0x3d, 0xfe, 0x27, 0x79, 0x1a, 0x81, 0xfe, 0x0e, 0x62, 0x2a, 0xfa, 0xef, \n  0xba, 0x17, 0x43, 0xba, 0x06, 0xc9, 0x9e, 0xf2, 0x98, 0xbe, 0xfe, 0x5f, 0x48, 0x00, 0xfa, 0x07, \n  0xfa, 0xf8, 0xba, 0xff, 0x12, 0x4d, 0x05, 0x5b, 0x0f, 0xfb, 0x6b, 0xa4, 0x00, 0x5b, 0x83, 0x04, \n  0xa6, 0xf6, 0xfc, 0x9e, 0x6f, 0xfd, 0x4c, 0x84, 0x01, 0x3c, 0xc8, 0xff, 0x1a, 0x64, 0xfe, 0x58, \n  0x11, 0x00, 0x8e, 0x94, 0x00, 0x5e, 0x9f, 0x00, 0xad, 0x5b, 0xff, 0xd8, 0xd4, 0x00, 0xf1, 0xcf, \n  0x00, 0xa5, 0x25, 0x00, 0xad, 0xd7, 0x00, 0x66, 0xd2, 0xff, 0x50, 0x16, 0xfe, 0xd4, 0xd9, 0xfe, \n  0x74, 0xea, 0xfe, 0xb1, 0x66, 0xfe, 0xc1, 0x45, 0x17, 0x4f, 0xff, 0x0d, 0xc8, 0x87, 0xfb, 0xf9, \n  0xfe, 0x14, 0x45, 0xe8, 0x06, 0xf0, 0x4b, 0xf5, 0x2b, 0xcc, 0xfe, 0x73, 0x83, 0x00, 0x42, 0x3a, \n  0xfb, 0xd6, 0x7b, 0xff, 0x0a, 0xf6, 0x04, 0x2d, 0xbd, 0xfb, 0xc4, 0x0f, 0x00, 0xe7, 0xfb, 0x03, \n  0xb4, 0x80, 0xfd, 0x2d, 0x85, 0xfd, 0x55, 0x7a, 0x01, 0xbc, 0x14, 0x00, 0xd7, 0x9b, 0xfe, 0x33, \n  0x88, 0x00, 0xab, 0x5e, 0x00, 0xfb, 0x50, 0x00, 0xa9, 0xa8, 0xff, 0x6b, 0x63, 0x00, 0x82, 0xdc, \n  0x00, 0xeb, 0x60, 0x00, 0x6f, 0xdb, 0x00, 0x10, 0x36, 0x00, 0xac, 0x83, 0xfe, 0xfb, 0xf8, 0xfe, \n  0xcd, 0x17, 0xff, 0x8d, 0x8d, 0xfe, 0xc4, 0x7c, 0x14, 0x39, 0xfc, 0x0c, 0x34, 0xe0, 0xfc, 0x92, \n  0x32, 0x12, 0x8b, 0x12, 0x07, 0xdf, 0xee, 0xf7, 0x1b, 0xe6, 0xfe, 0x97, 0xeb, 0x00, 0xba, 0xfd, \n  0xfb, 0xfb, 0x8b, 0xff, 0xde, 0x80, 0x04, 0xbb, 0x1d, 0xfc, 0x98, 0xd2, 0xff, 0xa7, 0x98, 0x03, \n  0x09, 0xee, 0xfd, 0x33, 0xb3, 0xfd, 0x49, 0xab, 0x01, 0xe1, 0x4a, 0x00, 0xd0, 0x30, 0xff, 0xa6, \n  0x67, 0x00, 0x1f, 0x0f, 0x00, 0x20, 0x9f, 0x00, 0x78, 0xa9, 0xff, 0x31, 0x7a, 0x00, 0xa1, 0x09, \n  0x01, 0x8e, 0x92, 0x00, 0x5b, 0xe4, 0x00, 0x9e, 0x40, 0x00, 0xe5, 0xf1, 0xfe, 0xaa, 0x42, 0xff, \n  0x1b, 0x4c, 0xff, 0xff, 0xc4, 0xfe, 0xce, 0xb5, 0x11, 0x18, 0xb5, 0x0b, 0x96, 0x10, 0xfe, 0xd4, \n  0x37, 0x10, 0x1b, 0x95, 0x07, 0xcb, 0xe6, 0xf9, 0x09, 0xf5, 0xfe, 0xb2, 0x3a, 0x01, 0xd1, 0xd7, \n  0xfc, 0x7d, 0x86, 0xff, 0x69, 0xb4, 0x03, 0x65, 0xaf, 0xfc, 0x95, 0xcb, 0xff, 0x60, 0x0b, 0x03, \n  0x09, 0x40, 0xfe, 0xbc, 0x82, 0xfe, 0xf1, 0xa6, 0x01, 0xbd, 0x43, 0x00, 0xdd, 0x91, 0xff, 0x42, \n  0x41, 0x00, 0x9b, 0x6f, 0x00, 0x65, 0xd1, 0x00, 0x75, 0xb1, 0xff, 0x9c, 0x96, 0x00, 0xf5, 0x32, \n  0x01, 0x40, 0x9f, 0x00, 0xe8, 0xe5, 0x00, 0xa4, 0x55, 0x00, 0x61, 0x44, 0xff, 0x95, 0xc5, 0xff, \n  0x4f, 0x3f, 0xff, 0x36, 0x45, 0xfe, 0xb1, 0x13, 0x0f, 0x22, 0xef, 0x0a, 0x96, 0x05, 0xff, 0xcf, \n  0x23, 0x0e, 0x13, 0xe1, 0x07, 0x3e, 0xc2, 0xfb, 0x03, 0x2f, 0xff, 0xb3, 0x71, 0x01, 0x26, 0x6e, \n  0xfd, 0x81, 0x44, 0xff, 0xbb, 0x37, 0x03, 0x69, 0x4b, 0xfd, 0xf4, 0xa9, 0xff, 0x83, 0x8f, 0x02, \n  0x0b, 0xf8, 0xfe, 0xa4, 0xe1, 0xfe, 0x8a, 0x51, 0x01, 0xa2, 0xc6, 0x00, 0x43, 0xd1, 0xff, 0xa2, \n  0x87, 0x00, 0x4e, 0xbb, 0x00, 0x7f, 0xa4, 0x00, 0x3a, 0x00, 0x00, 0xf1, 0xad, 0x00, 0xde, 0x2e, \n  0x01, 0xe9, 0xa5, 0x00, 0xde, 0xd5, 0x00, 0xce, 0x98, 0x00, 0x71, 0x7a, 0xff, 0x2e, 0x3c, 0xff, \n  0x83, 0x93, 0xfe, 0x6f, 0x00, 0xfe, 0x23, 0xf5, 0x0c, 0x7e, 0x12, 0x0a, 0xf1, 0xca, 0xff, 0x15, \n  0x88, 0x0c, 0x06, 0x00, 0x08, 0xd5, 0x57, 0xfd, 0x7a, 0x89, 0xff, 0xa8, 0x83, 0x01, 0x6a, 0xda, \n  0xfd, 0xed, 0x32, 0xff, 0xf5, 0xd9, 0x02, 0x2b, 0x11, 0xfe, 0xbb, 0x97, 0xff, 0xa3, 0x06, 0x02, \n  0xa6, 0x9d, 0xff, 0x26, 0x59, 0xff, 0x7e, 0x8d, 0x01, 0xbd, 0x51, 0x01, 0xc3, 0x2f, 0x00, 0x11, \n  0xc7, 0x00, 0x4d, 0xc0, 0x00, 0x1e, 0xbf, 0x00, 0x4b, 0x4b, 0x00, 0x4c, 0xcc, 0x00, 0xbe, 0x1c, \n  0x01, 0x75, 0xcc, 0x00, 0x0c, 0xd6, 0x00, 0xc0, 0xe4, 0xff, 0xd5, 0xea, 0xfe, 0x36, 0xdc, 0xfe, \n  0x02, 0x8f, 0xfe, 0x3f, 0x26, 0xfe, 0x0e, 0x32, 0x0b, 0xf3, 0x4a, 0x09, 0x57, 0x92, 0x00, 0x50, \n  0x36, 0x0b, 0x3a, 0xaf, 0x07, 0x64, 0x5c, 0xfe, 0x47, 0x32, 0x00, 0xa5, 0x84, 0x01, 0x6a, 0xdb, \n  0xfd, 0x85, 0x70, 0xff, 0x30, 0xea, 0x02, 0x33, 0x37, 0xfe, 0x43, 0x08, 0xff, 0x3b, 0x50, 0x02, \n  0xbe, 0x88, 0x00, 0x2c, 0xe1, 0xff, 0x9d, 0x08, 0x02, 0xeb, 0x60, 0x01, 0xc7, 0x5f, 0x00, 0xee, \n  0x1b, 0x01, 0xce, 0xca, 0x00, 0x5b, 0xdd, 0x00, 0x5b, 0x79, 0x00, 0x0a, 0xca, 0x00, 0x42, 0xb7, \n  0x00, 0x31, 0x0c, 0x00, 0xd4, 0x1c, 0x00, 0x51, 0x6e, 0xff, 0xff, 0xda, 0xfe, 0x25, 0xc0, 0xfe, \n  0x77, 0x48, 0xfe, 0xf5, 0xf3, 0xfd, 0x6c, 0x6e, 0x0a, 0xf7, 0x3f, 0x09, 0x0b, 0xe4, 0x00, 0x03, \n  0x7f, 0x09, 0xfe, 0x06, 0x07, 0x34, 0x1b, 0xff, 0xa6, 0xbf, 0x00, 0x26, 0xab, 0x01, 0x66, 0xeb, \n  0xfd, 0xbc, 0x55, 0xff, 0xf7, 0xa2, 0x02, 0xba, 0xb6, 0xfe, 0x75, 0x65, 0xff, 0x1f, 0x25, 0x03, \n  0xda, 0x5d, 0x01, 0x7c, 0xfa, 0xff, 0x05, 0x36, 0x02, 0xfb, 0xce, 0x01, 0xb2, 0xef, 0x00, 0x95, \n  0xfc, 0x00, 0xbe, 0xad, 0x00, 0x08, 0xf2, 0x00, 0xc3, 0x11, 0x00, 0x09, 0xb2, 0xff, 0x6b, 0xdc, \n  0xff, 0xe3, 0xf6, 0xff, 0xa7, 0xde, 0xff, 0x80, 0x45, 0xff, 0xf5, 0x52, 0xfe, 0xb4, 0x38, 0xfe, \n  0xe7, 0x83, 0xfe, 0x2f, 0x33, 0xfe, 0x6c, 0x0d, 0x09, 0x34, 0x10, 0x08, 0xa6, 0x84, 0x01, 0x7c, \n  0x7d, 0x09, 0xeb, 0xa4, 0x06, 0x55, 0xa6, 0xff, 0x4e, 0x59, 0x01, 0xd9, 0x32, 0x01, 0x9f, 0xd2, \n  0xfd, 0xe4, 0xe0, 0xff, 0xbe, 0xe7, 0x02, 0xf3, 0x6e, 0xff, 0x4d, 0x29, 0x00, 0xed, 0x34, 0x03, \n  0x63, 0xa0, 0x01, 0x7f, 0x1c, 0x01, 0x6c, 0xb8, 0x02, 0xa4, 0xc1, 0x01, 0x1d, 0xb6, 0x00, 0xe9, \n  0xb5, 0x00, 0x46, 0x69, 0x00, 0x24, 0xcb, 0xff, 0x91, 0x29, 0xff, 0x83, 0x62, 0xff, 0x14, 0xde, \n  0xff, 0xd7, 0xf5, 0xff, 0x07, 0x48, 0xff, 0x23, 0xce, 0xfe, 0xc7, 0x52, 0xfe, 0x6e, 0xa7, 0xfe, \n  0x80, 0xb3, 0xfe, 0xce, 0x30, 0xfe, 0x1e, 0x6e, 0x08, 0xa1, 0xf4, 0x07, 0xde, 0xe6, 0x01, 0xa2, \n  0xb1, 0x08, 0x1d, 0x3c, 0x06, 0x7b, 0xd2, 0xff, 0xad, 0xe9, 0x00, 0xff, 0x86, 0x01, 0x40, 0x24, \n  0xff, 0xd0, 0x48, 0x00, 0xfd, 0x03, 0x03, 0x1d, 0x12, 0x00, 0xb1, 0xf2, 0x00, 0x5a, 0x17, 0x04, \n  0x11, 0x9c, 0x02, 0x0f, 0x4d, 0x01, 0x0a, 0x3b, 0x02, 0xa4, 0x61, 0x01, 0x49, 0xf1, 0xff, 0xe7, \n  0xa2, 0xff, 0x11, 0x56, 0xff, 0xf0, 0x9d, 0xff, 0xd2, 0x2a, 0xff, 0x07, 0x43, 0xff, 0xb5, 0xd5, \n  0xff, 0xf8, 0x5d, 0xff, 0x79, 0x1b, 0xff, 0x24, 0xfe, 0xfe, 0x2c, 0xa6, 0xfe, 0x2b, 0xca, 0xfe, \n  0xed, 0xae, 0xfe, 0x74, 0x58, 0xfe, 0x20, 0x39, 0x07, 0x16, 0x5d, 0x07, 0x17, 0xd8, 0x02, 0x32, \n  0xe9, 0x07, 0x56, 0x4f, 0x05, 0x19, 0x09, 0x01, 0x3f, 0xa3, 0x01, 0x04, 0xdb, 0x01, 0x0e, 0x0b, \n  0x00, 0xbe, 0x44, 0x00, 0x52, 0x43, 0x03, 0xe4, 0xa3, 0x01, 0x10, 0x0c, 0x02, 0x9a, 0xf3, 0x03, \n  0x00, 0x57, 0x02, 0xec, 0x05, 0x01, 0x43, 0x32, 0x01, 0x2e, 0xcb, 0xff, 0x73, 0xf2, 0xfe, 0xa8, \n  0x98, 0xff, 0x72, 0x55, 0xff, 0x56, 0x39, 0xff, 0x6b, 0xbc, 0xfe, 0x5f, 0x1c, 0xff, 0x47, 0xd8, \n  0xff, 0x62, 0x77, 0xff, 0x6d, 0x2a, 0xff, 0x07, 0xdf, 0xfe, 0x90, 0xb6, 0xfe, 0x54, 0xe1, 0xfe, \n  0xc9, 0x8e, 0xfe, 0x09, 0x76, 0xfe, 0x35, 0x9c, 0x06, 0xe3, 0xc8, 0x06, 0x05, 0xc5, 0x02, 0x9e, \n  0x71, 0x07, 0x54, 0x48, 0x06, 0x10, 0x50, 0x02, 0x40, 0x9f, 0x01, 0xb4, 0x1b, 0x02, 0xbb, 0x4f, \n  0x01, 0x31, 0x6f, 0x01, 0xbd, 0x77, 0x03, 0x45, 0x8c, 0x02, 0x8d, 0x67, 0x02, 0x05, 0xeb, 0x02, \n  0x93, 0x39, 0x01, 0x2f, 0x93, 0xff, 0xe5, 0xef, 0xff, 0x08, 0xbf, 0xff, 0x10, 0x59, 0xff, 0x23, \n  0x09, 0xff, 0x8e, 0x8e, 0xfe, 0xe6, 0x01, 0xff, 0x7d, 0x4e, 0xff, 0xef, 0xb5, 0xff, 0x69, 0x93, \n  0xff, 0xd0, 0x11, 0xff, 0x58, 0x18, 0xff, 0x07, 0x32, 0xff, 0xa3, 0xd8, 0xfe, 0xe0, 0x90, 0xfe, \n  0xad, 0xaf, 0xfe, 0xd9, 0xe0, 0xfe, 0xed, 0xf4, 0x05, 0xcb, 0xc5, 0x07, 0x4d, 0x5e, 0x04, 0x52, \n  0xa5, 0x06, 0x2d, 0x17, 0x06, 0x7d, 0xcf, 0x02, 0x08, 0xa6, 0x02, 0x13, 0x85, 0x03, 0x9a, 0xce, \n  0x01, 0xe9, 0xec, 0x01, 0x54, 0x83, 0x03, 0x91, 0x5f, 0x01, 0x3b, 0xea, 0x00, 0x2e, 0xb0, 0x01, \n  0x56, 0x1f, 0x00, 0x15, 0x26, 0xff, 0x99, 0x96, 0xff, 0x95, 0x45, 0xff, 0x76, 0xbe, 0xfe, 0xd1, \n  0xdd, 0xfe, 0x71, 0xf0, 0xfe, 0xa4, 0x37, 0xff, 0x63, 0x7a, 0xff, 0x67, 0x9b, 0xff, 0x64, 0x52, \n  0xff, 0x32, 0xf2, 0xfe, 0xca, 0x13, 0xff, 0x31, 0xf6, 0xfe, 0x81, 0xd9, 0xfe, 0x05, 0xd9, 0xfe, \n  0x68, 0xde, 0xfe, 0x4d, 0xfc, 0xfe, 0x79, 0x62, 0x05, 0xaf, 0x0b, 0x08, 0x9a, 0x12, 0x05, 0xc9, \n  0xd5, 0x06, 0x79, 0x1f, 0x08, 0x4c, 0x0c, 0x05, 0xaa, 0x9f, 0x02, 0x3c, 0xfe, 0x02, 0xbe, 0x0e, \n  0x02, 0x2e, 0x03, 0x01, 0x71, 0x78, 0x01, 0x6a, 0x60, 0x00, 0xbc, 0x5a, 0x00, 0xaa, 0x28, 0x01, \n  0xec, 0xf7, 0xff, 0x7e, 0xd1, 0xfe, 0x6f, 0x0e, 0xff, 0x6c, 0xf4, 0xfe, 0xdf, 0xb3, 0xfe, 0xcb, \n  0x0f, 0xff, 0xec, 0x26, 0xff, 0x18, 0x5c, 0xff, 0x66, 0x63, 0xff, 0xd7, 0x32, 0xff, 0xca, 0x14, \n  0xff, 0xd6, 0x13, 0xff, 0x1c, 0x34, 0xff, 0x72, 0x0a, 0xff, 0xae, 0xd2, 0xfe, 0xd1, 0xc4, 0xfe, \n  0xff, 0x01, 0xff, 0x2a, 0x33, 0xff, 0x10, 0xfb, 0x05, 0x5d, 0x99, 0x09, 0x78, 0xb8, 0x06, 0x10, \n  0xf5, 0x07, 0x72, 0x89, 0x07, 0xb6, 0x7e, 0x04, 0xe5, 0xa1, 0x03, 0xf2, 0xcb, 0x02, 0xf5, 0x26, \n  0x00, 0x29, 0x25, 0xff, 0xaf, 0x2a, 0x01, 0x4a, 0xd7, 0x00, 0xea, 0x7d, 0xff, 0x1d, 0x71, 0x00, \n  0x82, 0xf7, 0xff, 0x53, 0x29, 0xfe, 0x7a, 0x15, 0xff, 0xb3, 0x9a, 0xff, 0x8c, 0xbc, 0xfe, 0x96, \n  0x01, 0xff, 0x73, 0x43, 0xff, 0x4f, 0x36, 0xff, 0x29, 0x65, 0xff, 0x71, 0x3e, 0xff, 0x8e, 0x04, \n  0xff, 0x7a, 0x1f, 0xff, 0x91, 0x0c, 0xff, 0xae, 0x1c, 0xff, 0x07, 0x19, 0xff, 0xbf, 0xe2, 0xfe, \n  0x06, 0x0c, 0xff, 0x22, 0x35, 0xff, 0xca, 0x1c, 0x07, 0xde, 0x59, 0x0c, 0x98, 0x4e, 0x08, 0x1b, \n  0x64, 0x06, 0x15, 0xc9, 0x05, 0xc5, 0xe4, 0x03, 0x8e, 0xdd, 0x02, 0xef, 0x02, 0x02, 0xe2, 0x8c, \n  0x00, 0x23, 0x2e, 0x00, 0xbc, 0x44, 0x00, 0xe1, 0x53, 0xff, 0xb7, 0xc3, 0xff, 0x61, 0x2f, 0x00, \n  0x82, 0x4b, 0xff, 0x46, 0xd5, 0xfe, 0x84, 0x3f, 0xff, 0xcd, 0x23, 0xff, 0x46, 0x0d, 0xff, 0x77, \n  0x4a, 0xff, 0x8a, 0x06, 0xff, 0x28, 0x41, 0xff, 0xfe, 0x2f, 0xff, 0x8a, 0x1e, 0xff, 0x90, 0x25, \n  0xff, 0x59, 0x12, 0xff, 0x55, 0x12, 0xff, 0x5d, 0x0e, 0xff, 0xaa, 0x1b, 0xff, 0xdf, 0x0a, 0xff, \n  0x57, 0x3d, 0xff, 0xe3, 0x2c, 0xff, 0x78, 0xd4, 0x07, 0x99, 0x74, 0x0c, 0x6b, 0x86, 0x07, 0xe2, \n  0x48, 0x05, 0xc7, 0x7e, 0x04, 0x34, 0xbc, 0x03, 0x20, 0xcb, 0x03, 0xb9, 0x4d, 0x02, 0x57, 0xbb, \n  0x00, 0x52, 0xba, 0x01, 0xe9, 0xbb, 0x00, 0x4b, 0x14, 0xff, 0x1a, 0x11, 0xff, 0x9a, 0x82, 0xff, \n  0xee, 0x57, 0x00, 0x13, 0x7c, 0xff, 0x9c, 0x65, 0xfe, 0x93, 0x2d, 0xff, 0x32, 0xd5, 0xff, 0x6f, \n  0x2e, 0xff, 0x56, 0x2f, 0xff, 0xd0, 0x3c, 0xff, 0x61, 0xf8, 0xfe, 0x10, 0x39, 0xff, 0x61, 0x0f, \n  0xff, 0xda, 0x24, 0xff, 0x74, 0x34, 0xff, 0x92, 0x2d, 0xff, 0x0c, 0x2f, 0xff, 0x94, 0x29, 0xff, \n  0x95, 0x50, 0xff, 0xb6, 0x4e, 0xff, 0x90, 0x10, 0x07, 0xf2, 0x23, 0x0b, 0xc4, 0x7c, 0x06, 0xf6, \n  0x66, 0x04, 0x42, 0x3f, 0x04, 0x8f, 0x2b, 0x03, 0x44, 0x0c, 0x03, 0x69, 0xb1, 0x03, 0xe0, 0x36, \n  0x02, 0xcd, 0xda, 0x01, 0x25, 0x72, 0x02, 0x1c, 0x34, 0x00, 0x5a, 0x4c, 0xff, 0xbf, 0xf6, 0xff, \n  0x0c, 0x89, 0xff, 0x97, 0x0e, 0xff, 0xbe, 0x9b, 0xff, 0xaf, 0xa0, 0xff, 0x4b, 0x04, 0xff, 0x14, \n  0x7e, 0xff, 0x8e, 0x9c, 0xff, 0x77, 0xed, 0xfe, 0xd2, 0xcc, 0xfe, 0x8c, 0x2b, 0xff, 0xd3, 0x28, \n  0xff, 0x3c, 0x35, 0xff, 0x27, 0x53, 0xff, 0xff, 0x57, 0xff, 0x02, 0x62, 0xff, 0xe2, 0x3c, 0xff, \n  0x04, 0x42, 0xff, 0x11, 0x43, 0xff, 0x02, 0x5c, 0x06, 0x1c, 0x2a, 0x09, 0x90, 0x52, 0x05, 0xa6, \n  0x95, 0x04, 0x55, 0x9b, 0x03, 0x96, 0x9d, 0x02, 0x74, 0xba, 0x02, 0x75, 0xc6, 0x01, 0x96, 0xcd, \n  0x01, 0x3e, 0xe2, 0x03, 0xab, 0x83, 0x03, 0x6d, 0x31, 0x02, 0x3c, 0x76, 0x01, 0x1b, 0x2c, 0x00, \n  0xf9, 0x4f, 0x00, 0x13, 0x9c, 0xff, 0x40, 0xa8, 0xfe, 0x34, 0x4e, 0xff, 0xd5, 0xdf, 0xff, 0xfb, \n  0x52, 0xff, 0xa4, 0xaf, 0xfe, 0xc1, 0x29, 0xff, 0x28, 0x5b, 0xff, 0xcd, 0xff, 0xfe, 0xaa, 0x25, \n  0xff, 0xd0, 0x6d, 0xff, 0x75, 0x78, 0xff, 0x9d, 0x7d, 0xff, 0xd6, 0x3a, 0xff, 0x92, 0x22, 0xff, \n  0xc6, 0x17, 0xff, 0xa7, 0x3d, 0xff, 0x0b, 0x48, 0x05, 0xa7, 0xae, 0x06, 0x9b, 0x53, 0x03, 0x9d, \n  0x84, 0x04, 0x0e, 0xb5, 0x04, 0x8d, 0xa2, 0x03, 0x71, 0x47, 0x01, 0x00, 0x95, 0xff, 0x9c, 0xc6, \n  0x01, 0xbb, 0x48, 0x03, 0xa3, 0xf6, 0x02, 0x52, 0xd2, 0x03, 0xf2, 0xbc, 0x03, 0xeb, 0x04, 0x03, \n  0x01, 0x89, 0x02, 0x3b, 0x45, 0x00, 0x62, 0x97, 0xff, 0x4e, 0xb4, 0xff, 0x41, 0xbe, 0xfe, 0xcc, \n  0xf8, 0xfe, 0x50, 0xa5, 0xff, 0x6a, 0x39, 0xff, 0x76, 0xe3, 0xfe, 0xd5, 0x63, 0xff, 0x78, 0x9a, \n  0xff, 0x20, 0x6e, 0xff, 0x42, 0x41, 0xff, 0xee, 0x9e, 0xff, 0x17, 0x85, 0xff, 0x77, 0x2e, 0xff, \n  0x72, 0x2a, 0xff, 0x1d, 0x2d, 0xff, 0xd2, 0x0b, 0x06, 0xe6, 0x8d, 0x07, 0xd0, 0x49, 0x02, 0x85, \n  0xe3, 0x02, 0x04, 0x0d, 0x04, 0xa5, 0x4d, 0x03, 0x37, 0x2d, 0x01, 0x73, 0x8c, 0xff, 0x96, 0x4b, \n  0x01, 0x7d, 0x88, 0x02, 0x7f, 0xab, 0x01, 0xd6, 0x15, 0x02, 0x8e, 0x5e, 0x03, 0x00, 0x38, 0x04, \n  0xe8, 0x28, 0x04, 0x18, 0x24, 0x02, 0x13, 0x20, 0x01, 0x82, 0x94, 0x00, 0x7a, 0x99, 0xff, 0xa9, \n  0x2b, 0xff, 0x57, 0xa2, 0xfe, 0xaa, 0x25, 0xff, 0xac, 0xb6, 0xff, 0x78, 0x3e, 0xff, 0x12, 0x04, \n  0xff, 0x8a, 0xb4, 0xff, 0xaa, 0xcc, 0xff, 0x35, 0x63, 0xff, 0x5a, 0x32, 0xff, 0xc2, 0x12, 0xff, \n  0x49, 0x58, 0xff, 0x78, 0x4a, 0xff, 0x12, 0x95, 0x06, 0x80, 0x32, 0x08, 0xfc, 0xcb, 0x02, 0xba, \n  0x33, 0x03, 0x1c, 0x09, 0x04, 0x33, 0x21, 0x03, 0xe3, 0x6a, 0x00, 0x94, 0xe3, 0xfe, 0x43, 0x10, \n  0x02, 0xcc, 0xe0, 0x02, 0x3d, 0x19, 0x00, 0xa3, 0xa1, 0x00, 0xf2, 0x9d, 0x01, 0x31, 0x22, 0x02, \n  0x70, 0x83, 0x03, 0xe6, 0xc2, 0x02, 0x7e, 0x65, 0x02, 0x95, 0x8c, 0x02, 0x04, 0xf8, 0x00, 0x83, \n  0xbc, 0xff, 0xba, 0x77, 0xff, 0xdb, 0xfc, 0xfe, 0xd1, 0xd8, 0xfe, 0xaa, 0x35, 0xff, 0xb8, 0x83, \n  0xff, 0x3d, 0x79, 0xff, 0xab, 0x2f, 0xff, 0x8b, 0xa2, 0xff, 0xd6, 0xa4, 0xff, 0xe4, 0xe2, 0xfe, \n  0x61, 0x17, 0xff, 0x8c, 0x7c, 0xff, 0x85, 0x98, 0x07, 0x9c, 0x21, 0x09, 0x87, 0x89, 0x02, 0x90, \n  0xba, 0x03, 0xc3, 0x05, 0x05, 0x52, 0xf7, 0x02, 0x2c, 0x6a, 0xff, 0x06, 0x36, 0xfe, 0x2b, 0xa8, \n  0x02, 0x01, 0xce, 0x02, 0x49, 0x78, 0xff, 0xb1, 0x68, 0x00, 0xaa, 0xde, 0x00, 0x15, 0x2a, 0x01, \n  0xa7, 0xa6, 0x01, 0xe3, 0xac, 0x00, 0x56, 0xe8, 0x01, 0xe4, 0xf0, 0x02, 0x94, 0xd6, 0x01, 0x74, \n  0x82, 0x01, 0x5e, 0xaa, 0x00, 0x80, 0x5c, 0xff, 0xc6, 0x9d, 0xff, 0xdf, 0x28, 0xff, 0x5a, 0xd6, \n  0xfe, 0xfb, 0x97, 0xff, 0x8a, 0xa5, 0xff, 0xdb, 0x50, 0xff, 0xca, 0x05, 0xff, 0x83, 0x3f, 0xff, \n  0x63, 0x5c, 0xff, 0x3e, 0x30, 0xff, 0xb0, 0x8b, 0x08, 0x2d, 0xba, 0x0a, 0x23, 0xd2, 0x02, 0x8c, \n  0x83, 0x03, 0xb6, 0x39, 0x05, 0xeb, 0xf9, 0x02, 0x96, 0xac, 0xfe, 0xf8, 0x15, 0xfe, 0x98, 0x5a, \n  0x03, 0xdc, 0x2f, 0x02, 0x3e, 0xac, 0xfe, 0xb1, 0x83, 0x00, 0x18, 0xb1, 0x00, 0x9f, 0xeb, 0x00, \n  0xc3, 0x6e, 0x01, 0xf5, 0x8e, 0xff, 0xe9, 0x38, 0x00, 0xdd, 0x9a, 0x01, 0xc6, 0x5d, 0x01, 0x7d, \n  0x9b, 0x01, 0x79, 0x59, 0x01, 0xfe, 0xfe, 0x00, 0x48, 0x81, 0x00, 0x35, 0xa4, 0xff, 0xb2, 0x95, \n  0xff, 0x99, 0xb8, 0xff, 0x92, 0x38, 0xff, 0xa9, 0x5b, 0xff, 0xbb, 0x5b, 0xff, 0xe1, 0xd6, 0xfe, \n  0x07, 0xf9, 0xfe, 0x58, 0x5f, 0xff, 0x2b, 0x91, 0x09, 0xf1, 0xfc, 0x0b, 0x64, 0xe1, 0x02, 0xd3, \n  0xe0, 0x03, 0x1b, 0xf2, 0x05, 0x07, 0x96, 0x02, 0xb0, 0x51, 0xfd, 0x40, 0x31, 0xfe, 0x0c, 0x39, \n  0x04, 0x54, 0x8c, 0x01, 0x14, 0x2f, 0xfe, 0xd7, 0x65, 0x00, 0xf8, 0x5c, 0x00, 0xa8, 0xb6, 0x00, \n  0xa6, 0x71, 0x01, 0x13, 0x64, 0xff, 0x86, 0xb5, 0xff, 0xab, 0xcf, 0x00, 0x20, 0xfc, 0xff, 0xf7, \n  0x56, 0x00, 0xb6, 0xc3, 0x00, 0x03, 0x04, 0x01, 0x01, 0x37, 0x01, 0x00, 0xe2, 0x00, 0xb2, 0x7f, \n  0x00, 0xb4, 0x2d, 0x00, 0xac, 0xf9, 0xff, 0xce, 0x8b, 0xff, 0x0c, 0xd6, 0xfe, 0xf7, 0xcf, 0xfe, \n  0xac, 0x2c, 0xff, 0xcf, 0x0c, 0xff, 0x24, 0x28, 0x0b, 0xe9, 0xd2, 0x0d, 0x9d, 0xaa, 0x02, 0x3e, \n  0x85, 0x03, 0x71, 0x48, 0x06, 0xbe, 0x25, 0x02, 0x35, 0x84, 0xfc, 0x2f, 0xc0, 0xfe, 0xc9, 0x63, \n  0x04, 0x13, 0x97, 0x00, 0xa4, 0xf0, 0xfd, 0x60, 0x83, 0x00, 0x06, 0x26, 0x00, 0xbc, 0x82, 0x00, \n  0x7a, 0x42, 0x01, 0x54, 0x30, 0xff, 0x33, 0x9c, 0xff, 0xe2, 0x95, 0x00, 0xbe, 0x75, 0xff, 0x4d, \n  0xc0, 0xff, 0xc2, 0x8f, 0xff, 0x30, 0xdf, 0xff, 0x5f, 0xb9, 0x00, 0x72, 0xa6, 0x00, 0x9b, 0x49, \n  0x01, 0xf7, 0x8d, 0x01, 0xfe, 0x87, 0x00, 0xf8, 0xe3, 0xff, 0x77, 0x86, 0xff, 0x85, 0xcc, 0xfe, \n  0x81, 0xc0, 0xfe, 0xb1, 0x27, 0xff, 0xbb, 0x71, 0x0c, 0xa6, 0x53, 0x0f, 0xd1, 0xc5, 0x02, 0x0d, \n  0xac, 0x03, 0x87, 0xd8, 0x06, 0x67, 0x88, 0x01, 0x93, 0x30, 0xfb, 0x11, 0xa0, 0xff, 0x73, 0x20, \n  0x05, 0x60, 0x58, 0xff, 0x0b, 0xac, 0xfd, 0x4f, 0xbc, 0x00, 0xdf, 0xba, 0xff, 0xe8, 0x6a, 0x00, \n  0x85, 0x67, 0x01, 0xff, 0x06, 0xff, 0xf9, 0x61, 0xff, 0x71, 0x75, 0x00, 0xb1, 0x56, 0xff, 0x31, \n  0x89, 0xff, 0xa4, 0x1d, 0xff, 0x70, 0x56, 0xff, 0x80, 0x9d, 0xff, 0x0a, 0xab, 0xff, 0xe0, 0xf9, \n  0x00, 0x48, 0x89, 0x01, 0x0d, 0x54, 0x01, 0x47, 0xe3, 0x00, 0x81, 0xf0, 0xff, 0xe9, 0x62, 0xff, \n  0x33, 0x83, 0xff, 0xf2, 0x06, 0xff, 0x71, 0x01, 0x0e, 0xfe, 0xd8, 0x10, 0xf8, 0x78, 0x02, 0xf2, \n  0x00, 0x04, 0xc2, 0x87, 0x07, 0xb8, 0x51, 0x00, 0xfc, 0xf5, 0xf9, 0x0d, 0x0f, 0x01, 0x60, 0x5e, \n  0x05, 0x70, 0xf9, 0xfd, 0x48, 0x8c, 0xfd, 0x3f, 0xda, 0x00, 0x6d, 0xa1, 0xff, 0x77, 0x12, 0x00, \n  0x84, 0x3e, 0x01, 0x5c, 0xfb, 0xfe, 0x7c, 0x39, 0xff, 0xba, 0x66, 0x00, 0x3a, 0x35, 0xff, 0x72, \n  0x51, 0xff, 0xf5, 0xcd, 0xfe, 0xa9, 0xfc, 0xfe, 0x18, 0x47, 0xff, 0x3d, 0x1a, 0xff, 0x5e, 0x22, \n  0x00, 0xea, 0xd4, 0x00, 0x4d, 0xcd, 0x00, 0xe7, 0xc3, 0x00, 0xe9, 0xce, 0x00, 0xa0, 0x21, 0x00, \n  0xce, 0xcf, 0xff, 0x85, 0x7c, 0xff, 0x46, 0x33, 0x0f, 0x00, 0x1a, 0x12, 0x9a, 0xe2, 0x02, 0x08, \n  0x6f, 0x04, 0xe8, 0x0b, 0x08, 0x9b, 0x7c, 0xff, 0x19, 0x74, 0xf8, 0xb0, 0x6c, 0x02, 0xf4, 0x2c, \n  0x06, 0x58, 0x6a, 0xfc, 0xfd, 0x4d, 0xfd, 0x07, 0x2e, 0x01, 0xe8, 0x93, 0xff, 0x09, 0xd4, 0xff, \n  0xad, 0x16, 0x01, 0xd5, 0x01, 0xff, 0x42, 0xe7, 0xfe, 0x2f, 0x6f, 0x00, 0x32, 0x5c, 0xff, 0x55, \n  0x13, 0xff, 0x83, 0x90, 0xfe, 0x01, 0xe8, 0xfe, 0xf5, 0x0d, 0xff, 0xb5, 0xcd, 0xfe, 0x8c, 0xd6, \n  0xff, 0x25, 0x36, 0x00, 0xeb, 0x43, 0x00, 0xfe, 0x42, 0x00, 0x70, 0x4d, 0x00, 0x16, 0x26, 0x00, \n  0x2e, 0x68, 0x00, 0x1a, 0x0f, 0x00, 0xc0, 0x4d, 0x10, 0x12, 0xb5, 0x13, 0x19, 0x50, 0x03, 0x82, \n  0x80, 0x04, 0x32, 0x7a, 0x08, 0x43, 0x1b, 0xff, 0xfc, 0x10, 0xf7, 0xa4, 0x67, 0x03, 0x16, 0xe3, \n  0x06, 0x6d, 0x08, 0xfb, 0xd0, 0x49, 0xfd, 0xe3, 0x79, 0x01, 0x07, 0x5e, 0xff, 0x26, 0xad, 0xff, \n  0x84, 0xd8, 0x00, 0x4a, 0x3c, 0xff, 0x1f, 0xd9, 0xfe, 0x2f, 0x00, 0x00, 0x7d, 0x78, 0xff, 0xa2, \n  0xf9, 0xfe, 0x27, 0x74, 0xfe, 0x53, 0x02, 0xff, 0x91, 0xc8, 0xfe, 0xaf, 0x82, 0xfe, 0xec, 0x93, \n  0xff, 0x1a, 0x03, 0x00, 0x4b, 0x37, 0x00, 0x25, 0xc4, 0xff, 0x35, 0x9f, 0xff, 0xf1, 0x8c, 0xff, \n  0x7b, 0x07, 0x00, 0x9f, 0x5b, 0x00, 0x24, 0x19, 0x12, 0x11, 0xb8, 0x15, 0x0b, 0x61, 0x02, 0xa6, \n  0xe2, 0x04, 0x19, 0xed, 0x08, 0x5c, 0xdf, 0xfd, 0x60, 0x05, 0xf7, 0x3b, 0x0b, 0x04, 0x82, 0x9b, \n  0x06, 0x78, 0x43, 0xfa, 0xb1, 0x68, 0xfd, 0xa7, 0xa3, 0x01, 0x57, 0x2a, 0xff, 0x95, 0x57, 0xff, \n  0x92, 0xd1, 0x00, 0x9f, 0x80, 0xff, 0xe8, 0x8a, 0xfe, 0xac, 0xaa, 0xff, 0x09, 0x88, 0xff, 0x03, \n  0xe8, 0xfe, 0xfb, 0x4c, 0xfe, 0x9b, 0xfc, 0xfe, 0x99, 0x84, 0xfe, 0x0c, 0x52, 0xfe, 0xe9, 0xbb, \n  0xff, 0xe9, 0xc0, 0xff, 0xcd, 0xf5, 0xff, 0x00, 0x86, 0xff, 0xf8, 0x2b, 0xff, 0x4e, 0x5a, 0xff, \n  0x31, 0xa7, 0xff, 0x73, 0x95, 0xff, 0xdb, 0x72, 0x13, 0xbf, 0x37, 0x17, 0x18, 0x41, 0x02, 0x4f, \n  0x82, 0x05, 0x2e, 0x31, 0x09, 0x6b, 0xf5, 0xfc, 0xd1, 0xae, 0xf6, 0x13, 0x45, 0x04, 0x75, 0xe6, \n  0x06, 0xb8, 0x95, 0xf9, 0x01, 0x10, 0xfd, 0xf6, 0xe4, 0x01, 0x07, 0x10, 0xff, 0x2c, 0x12, 0xff, \n  0x58, 0xd1, 0x00, 0xfe, 0xa5, 0xff, 0x16, 0x31, 0xfe, 0x34, 0x5d, 0xff, 0x14, 0xa9, 0xff, 0x92, \n  0x01, 0xff, 0x69, 0xeb, 0xfd, 0x7a, 0x9a, 0xfe, 0x38, 0x9b, 0xfe, 0xe5, 0x4b, 0xfe, 0xf2, 0x9f, \n  0xff, 0xe6, 0xb0, 0xff, 0x14, 0x88, 0xff, 0x5b, 0x68, 0xff, 0x41, 0x24, 0xff, 0xeb, 0x07, 0xff, \n  0xf4, 0x56, 0xff, 0x52, 0x34, 0xff, 0x6b, 0x13, 0x14, 0xdf, 0x4b, 0x18, 0xcf, 0xd9, 0x02, 0x61, \n  0x95, 0x06, 0x89, 0x83, 0x09, 0x97, 0x05, 0xfc, 0xad, 0x6d, 0xf6, 0xbf, 0x29, 0x04, 0xb4, 0x34, \n  0x07, 0x30, 0x71, 0xf9, 0xc8, 0x4d, 0xfc, 0x84, 0xf8, 0x01, 0x7f, 0x5c, 0xff, 0x8b, 0xde, 0xfe, \n  0x4c, 0x63, 0x00, 0x61, 0xec, 0xff, 0x31, 0x2c, 0xfe, 0x52, 0xe8, 0xfe, 0x22, 0xde, 0xff, 0x1e, \n  0xb9, 0xfe, 0x83, 0x8d, 0xfd, 0xb1, 0xa6, 0xfe, 0xa1, 0x9a, 0xfe, 0xd5, 0x41, 0xfe, 0x9c, 0x21, \n  0xff, 0x0a, 0x60, 0xff, 0xdc, 0xff, 0xff, 0x13, 0x5c, 0xff, 0x2d, 0xb1, 0xfe, 0xe5, 0xc3, 0xfe, \n  0x99, 0x56, 0xff, 0x8f, 0x09, 0xff, 0x28, 0x99, 0x14, 0x4c, 0x28, 0x19, 0xf7, 0x10, 0x04, 0xd5, \n  0x16, 0x07, 0x11, 0x26, 0x09, 0x70, 0x85, 0xfc, 0xfa, 0x7c, 0xf6, 0xa2, 0xf5, 0x02, 0xfa, 0x5e, \n  0x07, 0xee, 0xc1, 0xf9, 0xa6, 0x71, 0xfb, 0x0e, 0x57, 0x02, 0x1d, 0x8c, 0xff, 0xd3, 0x46, 0xfe, \n  0xa5, 0x42, 0x00, 0x37, 0xf6, 0xff, 0x40, 0xd1, 0xfe, 0x96, 0x93, 0xfe, 0x95, 0xf8, 0xfe, 0x86, \n  0xf3, 0xfe, 0x05, 0x74, 0xfd, 0x80, 0x6a, 0xfe, 0xe4, 0xae, 0xfe, 0x52, 0xfc, 0xfd, 0x2a, 0xba, \n  0xfe, 0x5e, 0x6a, 0xff, 0x54, 0x0c, 0x00, 0x50, 0x6a, 0xff, 0x0e, 0xa3, 0xfe, 0x72, 0x9c, 0xfe, \n  0x55, 0xe1, 0xfe, 0x59, 0x76, 0xfe, 0x6d, 0x42, 0x15, 0x1c, 0x4a, 0x19, 0xe1, 0xaa, 0x05, 0x96, \n  0xb4, 0x07, 0xc7, 0x14, 0x08, 0x84, 0x24, 0xfe, 0x16, 0xc6, 0xf6, 0x03, 0x21, 0x01, 0x93, 0x0a, \n  0x07, 0xb0, 0x8c, 0xfa, 0x90, 0x31, 0xfb, 0x0f, 0xd7, 0x01, 0x97, 0xe7, 0xff, 0xb2, 0xf4, 0xfd, \n  0x01, 0xbc, 0xff, 0xe8, 0x7c, 0x00, 0x7e, 0x58, 0xff, 0x24, 0xfb, 0xfd, 0x32, 0x62, 0xfe, 0xd6, \n  0x22, 0xff, 0xb8, 0x59, 0xfd, 0xca, 0x30, 0xfe, 0xeb, 0x05, 0xfe, 0xbb, 0x0b, 0xfe, 0x07, 0x1e, \n  0xff, 0xb3, 0xeb, 0xfe, 0x21, 0xea, 0xff, 0xdf, 0xa9, 0xff, 0xc1, 0xc2, 0xfe, 0x68, 0x10, 0xfe, \n  0x34, 0x63, 0xfe, 0xec, 0x72, 0xfe, 0x99, 0x46, 0x16, 0xc8, 0x25, 0x18, 0xe4, 0xa5, 0x06, 0xe2, \n  0x06, 0x0a, 0xf6, 0x75, 0x07, 0xea, 0x76, 0xfe, 0xd3, 0xc3, 0xf6, 0x3e, 0xb1, 0x00, 0xd5, 0xdc, \n  0x05, 0x4c, 0xcf, 0xfa, 0x10, 0xf4, 0xfb, 0xb5, 0x75, 0x00, 0x0a, 0xd5, 0xff, 0xc5, 0xa5, 0xfe, \n  0x7f, 0xf5, 0xfe, 0xbe, 0x56, 0x00, 0x22, 0x05, 0x00, 0x36, 0x9e, 0xfd, 0xba, 0xf0, 0xfd, 0xb9, \n  0x7b, 0xff, 0xb8, 0xb3, 0xfc, 0xdc, 0x7c, 0xfd, 0x0f, 0xcb, 0xfd, 0x54, 0x2d, 0xfe, 0x2b, 0x1a, \n  0xff, 0x01, 0x9d, 0xfe, 0x10, 0xc0, 0xff, 0x6b, 0xee, 0xff, 0xaf, 0x6b, 0xfe, 0x43, 0x8b, 0xfd, \n  0x39, 0x8c, 0xfe, 0xf4, 0xa5, 0xfd, 0xff, 0x52, 0x17, 0xea, 0x08, 0x16, 0xbe, 0x72, 0x06, 0x08, \n  0xb0, 0x0e, 0xd2, 0xc7, 0x08, 0xd2, 0x57, 0xfc, 0x04, 0x5f, 0xf6, 0x8a, 0x61, 0x03, 0xc8, 0xc7, \n  0x03, 0x57, 0x5b, 0xf9, 0x1f, 0x91, 0xfe, 0xe3, 0x3e, 0xff, 0x27, 0xcc, 0xfe, 0x31, 0x60, 0x00, \n  0x65, 0x0c, 0xfe, 0x11, 0xb4, 0xff, 0x51, 0x44, 0x01, 0xf9, 0x8e, 0xfd, 0x3b, 0xde, 0xfd, 0xc4, \n  0xa7, 0xff, 0x00, 0xfa, 0xfb, 0x75, 0x49, 0xfd, 0x96, 0xae, 0xfd, 0xb1, 0xd2, 0xfd, 0x68, 0x4f, \n  0xff, 0x67, 0x7c, 0xfe, 0x77, 0xcb, 0xff, 0xaf, 0x69, 0xff, 0xd7, 0xc0, 0xfe, 0x71, 0xb0, 0xfd, \n  0x10, 0xd6, 0xfd, 0x05, 0xcf, 0xfd, 0x3c, 0xc2, 0x19, 0x23, 0x93, 0x14, 0x9a, 0x83, 0x03, 0xc5, \n  0x68, 0x13, 0x44, 0x9f, 0x0a, 0x66, 0xc4, 0xf8, 0x70, 0x8d, 0xf7, 0x70, 0x6d, 0x06, 0xbf, 0xf4, \n  0xff, 0x94, 0xb0, 0xf7, 0x16, 0xeb, 0x01, 0xee, 0xc5, 0xfe, 0xf8, 0xb1, 0xfc, 0x9b, 0x43, 0x01, \n  0x09, 0x33, 0xfe, 0xf5, 0xe1, 0xfe, 0x2b, 0x2c, 0x02, 0x3c, 0x75, 0xfd, 0x97, 0x8e, 0xfd, 0xd0, \n  0xc4, 0xff, 0xcf, 0xe1, 0xfb, 0x66, 0xea, 0xfc, 0x9f, 0xbd, 0xfc, 0x1e, 0xc6, 0xfd, 0x05, 0xc1, \n  0xff, 0xfe, 0x07, 0xfe, 0xd5, 0x1a, 0xff, 0x11, 0x98, 0xff, 0x27, 0x97, 0xfe, 0x8a, 0xa0, 0xfd, \n  0x79, 0x3c, 0xfe, 0x22, 0x51, 0xfd, 0xc8, 0xcf, 0x1c, 0xb6, 0x7a, 0x14, 0x23, 0x43, 0xff, 0x49, \n  0xf1, 0x15, 0x99, 0xd4, 0x0d, 0x1c, 0xec, 0xf5, 0x52, 0x5c, 0xf8, 0x9e, 0xd8, 0x09, 0x37, 0x3f, \n  0xfc, 0x13, 0x53, 0xf5, 0x6e, 0x71, 0x05, 0xea, 0x6d, 0xff, 0x81, 0x1d, 0xfa, 0xb1, 0x5b, 0x01, \n  0x22, 0x82, 0xff, 0x72, 0xb8, 0xfd, 0x51, 0xb1, 0x02, 0x0b, 0xfc, 0xfd, 0x05, 0x03, 0xfd, 0xb2, \n  0x10, 0x00, 0x77, 0x06, 0xfc, 0xa9, 0x54, 0xfc, 0x28, 0x2d, 0xfc, 0xab, 0xf8, 0xfd, 0xf9, 0x8c, \n  0xff, 0xb8, 0x78, 0xfd, 0x2f, 0xaf, 0xfe, 0xc1, 0xbb, 0xff, 0xfc, 0x86, 0xfe, 0x46, 0xdc, 0xfd, \n  0x32, 0x5d, 0xfe, 0x56, 0xed, 0xfc, 0xb4, 0x5f, 0x1f, 0xae, 0x1d, 0x16, 0x08, 0x5a, 0xfa, 0x76, \n  0x15, 0x16, 0xaa, 0x7b, 0x12, 0x16, 0x55, 0xf4, 0x98, 0x31, 0xf8, 0xb7, 0x79, 0x0d, 0x53, 0xaa, \n  0xf9, 0x29, 0xaa, 0xf1, 0xff, 0x70, 0x08, 0x99, 0xad, 0x01, 0x8f, 0xe2, 0xf7, 0xf2, 0xdc, 0xff, \n  0x12, 0x52, 0x01, 0xaf, 0x5f, 0xfd, 0xaa, 0x60, 0x02, 0x6e, 0x1c, 0xff, 0xac, 0x5c, 0xfc, 0x1a, \n  0x52, 0x00, 0xc9, 0x21, 0xfc, 0xc1, 0x5d, 0xfc, 0xb5, 0xe9, 0xfb, 0xd2, 0x37, 0xfd, 0xbb, 0x6a, \n  0xff, 0xf1, 0x46, 0xfd, 0xbc, 0x4b, 0xfe, 0x6b, 0x85, 0xff, 0x89, 0x0b, 0xff, 0xa8, 0xb3, 0xfd, \n  0xb8, 0xab, 0xfe, 0xd5, 0x39, 0xfd, 0x27, 0x01, 0x22, 0x6f, 0xff, 0x17, 0xda, 0xe7, 0xf5, 0x5c, \n  0x4a, 0x14, 0xf2, 0xd2, 0x16, 0x9d, 0x0e, 0xf4, 0x75, 0x88, 0xf7, 0xa1, 0x01, 0x11, 0x0a, 0xc3, \n  0xf7, 0x69, 0x4d, 0xed, 0x81, 0x2c, 0x0a, 0xf9, 0xd8, 0x04, 0xea, 0xa0, 0xf6, 0x22, 0x3a, 0xfd, \n  0xd5, 0x3a, 0x02, 0x65, 0x23, 0xfe, 0xec, 0xa2, 0x01, 0xa5, 0x02, 0x00, 0xca, 0x1b, 0xfc, 0x8a, \n  0xdc, 0xff, 0xba, 0xb2, 0xfc, 0x52, 0x38, 0xfc, 0xa0, 0x76, 0xfb, 0x49, 0xac, 0xfc, 0xd7, 0xc0, \n  0xfe, 0xdc, 0x11, 0xfd, 0x75, 0x76, 0xfe, 0x0e, 0x0f, 0xff, 0x7c, 0x18, 0xff, 0xe5, 0xdb, 0xfd, \n  0x45, 0x12, 0xff, 0xcb, 0xa3, 0xfd, 0xcd, 0x9e, 0x25, 0xc7, 0xf3, 0x18, 0x83, 0x3a, 0xf2, 0x13, \n  0x2c, 0x12, 0xd7, 0x5e, 0x19, 0x1e, 0xb0, 0xf4, 0x6b, 0xa0, 0xf7, 0xd5, 0x80, 0x14, 0x17, 0xb3, \n  0xf5, 0x45, 0x92, 0xe9, 0xe8, 0x96, 0x0a, 0x90, 0x11, 0x08, 0x5b, 0xda, 0xf6, 0x91, 0x5d, 0xfa, \n  0xfe, 0xed, 0x01, 0x88, 0x78, 0xff, 0x8b, 0x79, 0x01, 0xd5, 0x4c, 0x00, 0x21, 0x79, 0xfc, 0x36, \n  0x28, 0xff, 0x84, 0x3d, 0xfd, 0xb5, 0xd8, 0xfb, 0x9f, 0x31, 0xfb, 0x98, 0x55, 0xfc, 0x1f, 0x03, \n  0xfe, 0x8b, 0x20, 0xfd, 0xc9, 0x66, 0xfe, 0x76, 0x19, 0xff, 0xba, 0xc2, 0xfe, 0xb4, 0x48, 0xfe, \n  0x44, 0x79, 0xff, 0xa1, 0xa5, 0xfd, 0x0a, 0x83, 0x29, 0xec, 0xaa, 0x19, 0xcc, 0xdc, 0xee, 0x33, \n  0x79, 0x10, 0xdb, 0xe7, 0x19, 0x36, 0xc1, 0xf5, 0x23, 0xbb, 0xf8, 0xab, 0xc5, 0x17, 0xf9, 0xc6, \n  0xf3, 0x55, 0x9b, 0xe6, 0x51, 0xc3, 0x09, 0xd3, 0xa7, 0x0a, 0x06, 0x7f, 0xf8, 0x14, 0xdf, 0xf7, \n  0x28, 0x94, 0x00, 0x54, 0x7d, 0x00, 0x70, 0x51, 0x02, 0xb5, 0x1b, 0x00, 0xad, 0x1d, 0xfd, 0x57, \n  0xbd, 0xfe, 0xb0, 0xc7, 0xfc, 0xa6, 0x1f, 0xfc, 0xf2, 0xc9, 0xfa, 0x47, 0xea, 0xfb, 0x8f, 0xfc, \n  0xfd, 0x8a, 0xd5, 0xfc, 0x91, 0x25, 0xfe, 0x1d, 0xb8, 0xff, 0x4c, 0xa1, 0xfe, 0x15, 0x1c, 0xfe, \n  0x56, 0xc7, 0xff, 0xa9, 0xc2, 0xfd, 0xfb, 0xae, 0x2e, 0x53, 0xd5, 0x18, 0x88, 0xbc, 0xeb, 0x93, \n  0x10, 0x10, 0x61, 0x93, 0x18, 0xd9, 0x84, 0xf5, 0x39, 0x9d, 0xfb, 0x49, 0xea, 0x1a, 0x99, 0xd6, \n  0xf0, 0xad, 0xf3, 0xe4, 0x8d, 0x8f, 0x08, 0xef, 0xda, 0x0b, 0x33, 0x8b, 0xfa, 0x32, 0x76, 0xf6, \n  0xba, 0xab, 0xfe, 0x49, 0x9e, 0x00, 0xee, 0xe7, 0x03, 0x50, 0xdc, 0xff, 0x35, 0xce, 0xfd, 0x8b, \n  0xed, 0xfd, 0xad, 0xfc, 0xfb, 0x48, 0xcc, 0xfc, 0x24, 0xd9, 0xf9, 0xf2, 0x56, 0xfc, 0xa8, 0x84, \n  0xfd, 0xcc, 0x5b, 0xfc, 0xfa, 0x94, 0xfe, 0xc0, 0x22, 0x00, 0x82, 0x86, 0xfe, 0xc6, 0xb5, 0xfd, \n  0x13, 0xac, 0xff, 0x04, 0x00, 0xfe, 0x82, 0x97, 0x33, 0x2c, 0x86, 0x18, 0xcc, 0x69, 0xe8, 0x9f, \n  0x89, 0x10, 0x88, 0x60, 0x16, 0xe2, 0xa7, 0xf4, 0x8b, 0xfc, 0xfe, 0x35, 0x2e, 0x1e, 0x56, 0xba, \n  0xee, 0x09, 0x56, 0xe3, 0x2a, 0x6b, 0x07, 0xce, 0x56, 0x0c, 0x8b, 0x6d, 0xfc, 0x1c, 0x3d, 0xf6, \n  0x7c, 0xd3, 0xfc, 0xa5, 0xe2, 0xff, 0xa0, 0xba, 0x05, 0xc7, 0x5e, 0x00, 0x66, 0xf5, 0xfd, 0xbd, \n  0x29, 0xfd, 0x30, 0x88, 0xfb, 0x87, 0x12, 0xfd, 0x4e, 0xbd, 0xf9, 0x5d, 0x8c, 0xfc, 0x03, 0xdb, \n  0xfc, 0x2f, 0x7b, 0xfc, 0x65, 0xf1, 0xfe, 0x31, 0xa0, 0x00, 0x2c, 0x70, 0xfe, 0x0f, 0xf4, 0xfc, \n  0x46, 0xab, 0xff, 0x32, 0x88, 0xfe, 0xf5, 0x62, 0x39, 0x4b, 0xfd, 0x18, 0x19, 0x09, 0xe3, 0xbc, \n  0x0d, 0x10, 0x23, 0xe4, 0x15, 0x5b, 0xcf, 0xf4, 0xe7, 0x7c, 0x00, 0xed, 0x59, 0x1f, 0x75, 0x76, \n  0xee, 0x3f, 0x83, 0xe2, 0x00, 0x90, 0x06, 0xf2, 0x1c, 0x0c, 0xe1, 0xda, 0xfc, 0xe8, 0xe5, 0xf6, \n  0x3f, 0xe2, 0xfb, 0x17, 0x85, 0xfe, 0x0b, 0x63, 0x07, 0xfc, 0x3a, 0x01, 0x48, 0xcb, 0xfc, 0xda, \n  0x47, 0xfd, 0xa3, 0x79, 0xfb, 0x8a, 0xa8, 0xfc, 0x3f, 0x09, 0xfa, 0xe8, 0x31, 0xfc, 0x03, 0xf6, \n  0xfc, 0x5d, 0xce, 0xfc, 0xc0, 0xcd, 0xfe, 0x5e, 0x10, 0x01, 0x27, 0x3b, 0xfe, 0x00, 0x4d, 0xfc, \n  0x8e, 0xd7, 0xff, 0x3f, 0x06, 0xff, 0x14, 0x9a, 0x3e, 0x4f, 0x40, 0x1a, 0x57, 0x77, 0xdd, 0xe8, \n  0xd6, 0x0f, 0x62, 0x6a, 0x15, 0xa7, 0xcc, 0xf4, 0xa1, 0x0d, 0x01, 0xeb, 0x44, 0x20, 0xd5, 0xdb, \n  0xef, 0x89, 0x09, 0xe1, 0x04, 0xfd, 0x05, 0xce, 0x1c, 0x0c, 0x16, 0x43, 0xfc, 0x6c, 0xe5, 0xf7, \n  0xe1, 0x0b, 0xfc, 0xff, 0x6d, 0xfc, 0x28, 0x82, 0x08, 0x91, 0x89, 0x02, 0x99, 0x2a, 0xfb, 0x39, \n  0x21, 0xfe, 0x8b, 0x7f, 0xfb, 0xc9, 0x0d, 0xfc, 0x7f, 0x87, 0xfa, 0xd7, 0xed, 0xfb, 0x84, 0x41, \n  0xfd, 0x29, 0x09, 0xfd, 0xa5, 0xcb, 0xfe, 0xfb, 0x18, 0x01, 0x37, 0xfd, 0xfd, 0x72, 0x06, 0xfc, \n  0x9e, 0x46, 0x00, 0x38, 0x14, 0xff, 0xb9, 0x9b, 0x43, 0x64, 0xdc, 0x1a, 0x87, 0x31, 0xd9, 0x52, \n  0xeb, 0x0f, 0xd5, 0x93, 0x14, 0x3b, 0x3b, 0xf4, 0x98, 0xe5, 0x00, 0x0d, 0x47, 0x21, 0x3c, 0x52, \n  0xf2, 0x4f, 0x4b, 0xdf, 0x77, 0x52, 0x05, 0x05, 0x4d, 0x0c, 0xd3, 0x41, 0xfb, 0x6b, 0x0c, 0xf9, \n  0x31, 0xc7, 0xfc, 0x52, 0x19, 0xfa, 0xa7, 0xd8, 0x08, 0x18, 0xe4, 0x03, 0xa1, 0x16, 0xfa, 0x2d, \n  0x0a, 0xff, 0x23, 0x6c, 0xfb, 0x9d, 0x98, 0xfb, 0x58, 0x42, 0xfb, 0xd7, 0xaf, 0xfb, 0x59, 0x47, \n  0xfd, 0xfc, 0x72, 0xfd, 0xee, 0xb5, 0xfe, 0x8e, 0xf6, 0x00, 0xc9, 0xb0, 0xfd, 0xe0, 0xef, 0xfb, \n  0x5c, 0x06, 0x01, 0x10, 0x6d, 0xfe, 0xef, 0x93, 0x46, 0x31, 0xe8, 0x1c, 0xed, 0xf4, 0xd5, 0xaf, \n  0xc0, 0x0f, 0x61, 0x6d, 0x13, 0x41, 0x90, 0xf3, 0x46, 0xf6, 0xfe, 0x3c, 0xb1, 0x22, 0xfd, 0x1d, \n  0xf6, 0x96, 0x24, 0xdd, 0x52, 0x17, 0x04, 0x10, 0x54, 0x0c, 0x12, 0xc5, 0xfa, 0xcb, 0xce, 0xf9, \n  0x0c, 0x87, 0xfd, 0x27, 0x08, 0xf8, 0x7f, 0xfc, 0x07, 0xfa, 0x3d, 0x05, 0xc4, 0xe7, 0xf9, 0x02, \n  0x4b, 0xff, 0x38, 0xb5, 0xfb, 0x28, 0x77, 0xfb, 0xd0, 0xac, 0xfb, 0xb3, 0x70, 0xfb, 0x18, 0x3b, \n  0xfd, 0xf9, 0xc0, 0xfd, 0xbf, 0x9b, 0xfe, 0x12, 0x88, 0x00, 0x4a, 0x95, 0xfd, 0x57, 0x0a, 0xfc, \n  0xa7, 0x1b, 0x01, 0x60, 0xb8, 0xfd, 0xba, 0xf8, 0x48, 0x83, 0x71, 0x1e, 0x02, 0xac, 0xd4, 0xec, \n  0x4b, 0x0f, 0x0e, 0x43, 0x12, 0xac, 0x90, 0xf2, 0x39, 0xdf, 0xfb, 0x95, 0x97, 0x24, 0x49, 0xd4, \n  0xf9, 0x6f, 0xdd, 0xdb, 0xd7, 0xb1, 0x02, 0x3b, 0x90, 0x0b, 0x1b, 0x47, 0xfb, 0xa7, 0x64, 0xfa, \n  0xb0, 0xc7, 0xfd, 0x4a, 0xd1, 0xf6, 0x86, 0x78, 0x06, 0xb7, 0xf6, 0x05, 0x6a, 0xf2, 0xfa, 0x5e, \n  0xcd, 0xfe, 0x14, 0x71, 0xfc, 0x0f, 0x0d, 0xfc, 0xdd, 0x35, 0xfb, 0xe5, 0xa9, 0xfb, 0xc0, 0x2c, \n  0xfd, 0x3f, 0xfb, 0xfd, 0x4a, 0x6b, 0xfe, 0xc8, 0xe5, 0xff, 0x95, 0xdb, 0xfd, 0x92, 0xfe, 0xfb, \n  0xe7, 0x50, 0x00, 0xf2, 0xbe, 0xfd, 0x85, 0xcf, 0x4a, 0x65, 0x22, 0x1f, 0x79, 0x7f, 0xd5, 0x44, \n  0xac, 0x0e, 0x5b, 0x45, 0x11, 0x3b, 0x21, 0xf1, 0x88, 0x23, 0xf8, 0x21, 0x9d, 0x26, 0x82, 0xfb, \n  0xfc, 0xee, 0x05, 0xdc, 0x89, 0x26, 0x01, 0x1d, 0xd8, 0x09, 0x1c, 0xc9, 0xfc, 0xb2, 0x23, 0xfb, \n  0xa1, 0x20, 0xfd, 0x06, 0x52, 0xf6, 0x36, 0x13, 0x05, 0x5c, 0xa9, 0x05, 0xc6, 0x18, 0xfd, 0x21, \n  0xfd, 0xfd, 0xbd, 0x28, 0xfd, 0x05, 0x7a, 0xfd, 0xa1, 0x1c, 0xfa, 0x02, 0x52, 0xfc, 0x12, 0x27, \n  0xfd, 0x66, 0x11, 0xfe, 0x98, 0xf0, 0xfd, 0x57, 0x9e, 0xff, 0xca, 0xc1, 0xfd, 0x0b, 0xa5, 0xfb, \n  0x13, 0xf4, 0xff, 0x69, 0xa6, 0xfd, 0x6f, 0xc8, 0x4a, 0x63, 0xc6, 0x20, 0xae, 0xde, 0xd7, 0x66, \n  0x0d, 0x0e, 0x14, 0x3e, 0x10, 0x02, 0x0f, 0xef, 0x7b, 0x48, 0xf4, 0xa4, 0xf5, 0x27, 0x92, 0x7f, \n  0x00, 0xa5, 0x1c, 0xdd, 0xa1, 0x0b, 0xff, 0x82, 0x9e, 0x07, 0x45, 0x38, 0xff, 0x91, 0x0b, 0xfc, \n  0xba, 0x8d, 0xfb, 0x3e, 0x5c, 0xf6, 0xdd, 0x4d, 0x04, 0x1e, 0x2a, 0x04, 0x84, 0xd1, 0xff, 0x86, \n  0xb1, 0xfd, 0xfe, 0x1e, 0xfd, 0x11, 0xa1, 0xff, 0xe8, 0x33, 0xf9, 0x1a, 0xcb, 0xfc, 0x26, 0x56, \n  0xfd, 0x71, 0x9c, 0xfd, 0x44, 0xd3, 0xfd, 0x98, 0xb5, 0xfe, 0x68, 0x17, 0xfd, 0xad, 0x7d, 0xfc, \n  0xd7, 0x4c, 0xff, 0x47, 0x3a, 0xfd, 0x3a, 0x5a, 0x49, 0xae, 0x1b, 0x23, 0x75, 0x00, 0xdb, 0xa7, \n  0x4b, 0x0d, 0xae, 0x42, 0x0f, 0x3a, 0x61, 0xed, 0x94, 0x84, 0xf0, 0x0d, 0xe0, 0x26, 0x3a, 0xa6, \n  0x04, 0x9f, 0x47, 0xdf, 0x95, 0xae, 0xfc, 0x9c, 0x18, 0x05, 0x4d, 0xb0, 0x01, 0x62, 0xf1, 0xfc, \n  0x52, 0xa5, 0xf9, 0x65, 0x0a, 0xf7, 0xe8, 0xc6, 0x03, 0x6c, 0xc4, 0x01, 0xfd, 0x11, 0x02, 0x4f, \n  0xec, 0xfe, 0x7d, 0x0c, 0xfc, 0xb4, 0xb0, 0x01, 0x69, 0x74, 0xf9, 0x86, 0x57, 0xfc, 0xfa, 0xe1, \n  0xfd, 0x38, 0x55, 0xfd, 0x5d, 0x56, 0xfc, 0xd9, 0x9d, 0xfd, 0x96, 0x6f, 0xfd, 0x77, 0xcf, 0xfc, \n  0x2c, 0x28, 0xff, 0x60, 0xf9, 0xfc, 0x74, 0xa4, 0x46, 0x73, 0x42, 0x25, 0x9d, 0x78, 0xdf, 0x85, \n  0xb2, 0x0d, 0x9d, 0x7d, 0x0d, 0x9e, 0x9b, 0xeb, 0x8d, 0x20, 0xed, 0x27, 0x20, 0x24, 0x0b, 0xc0, \n  0x09, 0x82, 0xa2, 0xe1, 0xcd, 0x0b, 0xfa, 0x11, 0x07, 0x03, 0x21, 0x99, 0x03, 0x47, 0x08, 0xfe, \n  0xa9, 0x40, 0xf8, 0x8a, 0xb7, 0xf7, 0x09, 0x60, 0x03, 0xb5, 0x6f, 0xff, 0xa5, 0x17, 0x03, 0xe2, \n  0x8a, 0x01, 0x39, 0xe4, 0xfa, 0xd9, 0xad, 0x02, 0x7c, 0x35, 0xfb, 0x08, 0x67, 0xfb, 0x80, 0x87, \n  0xfe, 0xc4, 0x02, 0xfc, 0xc2, 0xd9, 0xfa, 0x2d, 0xa8, 0xfd, 0x1a, 0xc7, 0xfc, 0x4a, 0xa7, 0xfd, \n  0x21, 0xb1, 0xff, 0xba, 0xa0, 0xfc, 0xee, 0x85, 0x43, 0x03, 0xce, 0x27, 0x57, 0xc9, 0xe3, 0x93, \n  0x4a, 0x0d, 0x72, 0xe8, 0x0b, 0xb0, 0xb6, 0xec, 0xcb, 0x3d, 0xe9, 0x49, 0x2a, 0x1e, 0x67, 0xd2, \n  0x0f, 0x38, 0x39, 0xe4, 0x3f, 0x18, 0xf8, 0xc3, 0xdb, 0x01, 0x73, 0x5a, 0x03, 0x92, 0xae, 0xff, \n  0x5d, 0x45, 0xf8, 0x0b, 0xec, 0xf7, 0x92, 0x43, 0x03, 0x57, 0x3a, 0xfd, 0xdb, 0xfe, 0x02, 0xb7, \n  0x7e, 0x04, 0x91, 0x1a, 0xfb, 0x63, 0x0e, 0x02, 0x6f, 0x87, 0xfd, 0x34, 0x43, 0xfb, 0xa5, 0xd6, \n  0xfc, 0x0f, 0x50, 0xfc, 0xbc, 0x00, 0xfa, 0x66, 0xc8, 0xfc, 0xee, 0xa7, 0xfc, 0x99, 0x97, 0xfe, \n  0x62, 0xa7, 0x00, 0x4e, 0x71, 0xfc, 0x90, 0xc8, 0x40, 0x41, 0x23, 0x2a, 0x64, 0xe2, 0xe6, 0xba, \n  0x79, 0x0d, 0xc4, 0xb9, 0x09, 0x2d, 0x8e, 0xee, 0x37, 0x45, 0xe7, 0x68, 0x6d, 0x15, 0x6b, 0x0d, \n  0x15, 0xe2, 0xd1, 0xe7, 0x2a, 0x2a, 0xf6, 0x9d, 0x74, 0x01, 0x40, 0x1d, 0x02, 0x23, 0x9e, 0x00, \n  0x1e, 0xe7, 0xf9, 0x78, 0xed, 0xf7, 0x48, 0x98, 0x02, 0x14, 0x48, 0xfc, 0xef, 0xc0, 0x01, 0x5b, \n  0x83, 0x06, 0x4b, 0x43, 0xfc, 0x9a, 0x85, 0x01, 0x9a, 0x6d, 0xfe, 0xc6, 0xe4, 0xfa, 0x24, 0xd2, \n  0xfb, 0xe9, 0xdc, 0xfc, 0x17, 0xc8, 0xf9, 0xc8, 0xf2, 0xfb, 0xd5, 0x91, 0xfc, 0xf2, 0x44, 0xff, \n  0x84, 0x59, 0x01, 0x1a, 0x54, 0xfc, 0xd6, 0x0f, 0x3f, 0xdf, 0xd3, 0x2a, 0x51, 0x90, 0xe9, 0x01, \n  0xff, 0x0e, 0x3d, 0x54, 0x07, 0xba, 0x2a, 0xef, 0x3f, 0x5e, 0xe7, 0x0a, 0xf2, 0x0c, 0xa6, 0xb2, \n  0x17, 0xef, 0xb3, 0xec, 0xf2, 0xf0, 0xf3, 0x02, 0x8d, 0x01, 0x0e, 0x8e, 0x01, 0x90, 0xf7, 0xff, \n  0x73, 0xf9, 0xfc, 0x4f, 0xec, 0xf7, 0xc6, 0x90, 0x01, 0xde, 0xe8, 0xfc, 0xd9, 0x34, 0xff, 0xc8, \n  0x7e, 0x07, 0x33, 0x40, 0xfe, 0x54, 0x6f, 0x00, 0x1f, 0x28, 0xfe, 0xc8, 0xa9, 0xfb, 0x7e, 0x56, \n  0xfb, 0xff, 0xb5, 0xfd, 0x4b, 0x5e, 0xfa, 0x2a, 0x1e, 0xfb, 0x4c, 0x1f, 0xfd, 0xdc, 0x6e, 0xfe, \n  0xe4, 0x3c, 0x01, 0x63, 0x2e, 0xfd, 0x2e, 0x71, 0x3d, 0x8b, 0x8b, 0x2b, 0x4e, 0x7e, 0xeb, 0x53, \n  0x01, 0x11, 0x0c, 0xea, 0x05, 0x12, 0x1b, 0xee, 0x12, 0x98, 0xe9, 0xa2, 0x09, 0x05, 0x4b, 0xae, \n  0x17, 0xd2, 0x6c, 0xf3, 0xe0, 0x14, 0xf1, 0xdd, 0x83, 0x01, 0x5d, 0x13, 0x03, 0x79, 0xbf, 0xfd, \n  0x2a, 0x2f, 0x00, 0xf2, 0x5b, 0xf9, 0xfd, 0xd1, 0xff, 0xe4, 0x8b, 0xfe, 0x2b, 0x2b, 0xfc, 0x8a, \n  0xd9, 0x06, 0x38, 0xa8, 0x00, 0x1a, 0xdd, 0xfe, 0xc9, 0x59, 0xfe, 0x00, 0x24, 0xfd, 0x8c, 0xc2, \n  0xfb, 0xb5, 0x53, 0xfe, 0xc7, 0xec, 0xfb, 0x53, 0x3a, 0xfb, 0x00, 0xf5, 0xfb, 0x38, 0x0a, 0xfd, \n  0x5f, 0x8d, 0x01, 0x28, 0x64, 0xfe, 0xdf, 0x64, 0x3a, 0x62, 0xa9, 0x2c, 0x72, 0xa6, 0xee, 0xce, \n  0xcd, 0x10, 0x36, 0x1e, 0x05, 0x0b, 0xc5, 0xee, 0xb8, 0xf2, 0xea, 0x7d, 0x37, 0xfd, 0x6d, 0x29, \n  0x17, 0xfe, 0xb9, 0xf9, 0x17, 0x75, 0xee, 0xe3, 0x74, 0x01, 0x36, 0x09, 0x05, 0xff, 0x6a, 0xfb, \n  0xe6, 0xc3, 0x02, 0xe7, 0xb7, 0xfb, 0x8c, 0x20, 0xfd, 0xe0, 0x3a, 0x00, 0x02, 0x55, 0xfa, 0x7d, \n  0xf4, 0x02, 0x7a, 0xd9, 0x02, 0x47, 0x3d, 0xff, 0x12, 0xdd, 0xfd, 0x1d, 0x41, 0xff, 0x1a, 0x8e, \n  0xfc, 0xea, 0x6b, 0xff, 0x3b, 0x19, 0xfd, 0x1b, 0xe5, 0xfa, 0x63, 0x38, 0xfb, 0x6c, 0x87, 0xfb, \n  0x18, 0x69, 0x00, 0x40, 0x67, 0xff, 0x2e, 0x54, 0x38, 0xcf, 0xff, 0x2b, 0xce, 0x29, 0xf2, 0x66, \n  0x1c, 0x10, 0xc0, 0x81, 0x03, 0x57, 0x15, 0xf1, 0xed, 0xdc, 0xea, 0x0e, 0x49, 0xf7, 0xe9, 0xea, \n  0x15, 0xe5, 0x09, 0xfe, 0xc5, 0xca, 0xed, 0xfb, 0x33, 0x01, 0xd5, 0x10, 0x06, 0xb3, 0xc7, 0xfa, \n  0x58, 0xe1, 0x04, 0x50, 0x77, 0xfb, 0x24, 0x00, 0xfc, 0xd9, 0xe4, 0x01, 0x5f, 0x13, 0xf8, 0xab, \n  0xbe, 0xff, 0x7b, 0xd3, 0x02, 0x54, 0xee, 0x00, 0xb4, 0x5e, 0xfe, 0xdf, 0xfc, 0x00, 0xac, 0xc8, \n  0xfd, 0x87, 0x6f, 0xff, 0x94, 0x61, 0xfe, 0x85, 0xe6, 0xfa, 0xef, 0x20, 0xfb, 0x77, 0x7b, 0xf9, \n  0xe1, 0x38, 0xfe, 0xb2, 0xfc, 0xff, 0x7d, 0xd1, 0x37, 0x4e, 0xba, 0x29, 0xac, 0x9d, 0xf4, 0x1f, \n  0x24, 0x11, 0x5a, 0x1f, 0x01, 0xcd, 0x6d, 0xf3, 0x21, 0x0f, 0xec, 0x72, 0x44, 0xf2, 0xd5, 0xf0, \n  0x13, 0xaa, 0xab, 0x02, 0x87, 0x4c, 0xed, 0x0a, 0xb3, 0x00, 0x0a, 0x3c, 0x09, 0x70, 0x7b, 0xf9, \n  0x3d, 0x12, 0x05, 0xb4, 0x02, 0xfc, 0xdb, 0xe1, 0xfa, 0x18, 0xec, 0x02, 0x73, 0x52, 0xf7, 0xaf, \n  0xa5, 0xfe, 0xde, 0xc8, 0x00, 0xca, 0xa4, 0x01, 0xc8, 0x9b, 0x02, 0xf0, 0xbd, 0x00, 0x78, 0xe2, \n  0xfd, 0x6c, 0x4d, 0x01, 0x5d, 0xfb, 0xfe, 0x16, 0xfb, 0xfa, 0xd3, 0x25, 0xfb, 0xbf, 0xce, 0xf8, \n  0xb8, 0xb0, 0xfb, 0x5c, 0x14, 0xff, 0x4f, 0x7a, 0x38, 0xe6, 0x72, 0x26, 0xf7, 0xc2, 0xf4, 0x54, \n  0x88, 0x13, 0x26, 0x66, 0xff, 0xc0, 0xd0, 0xf3, 0x6c, 0x88, 0xed, 0x57, 0xda, 0xef, 0x2d, 0x80, \n  0x10, 0x6e, 0x55, 0x06, 0x81, 0xa0, 0xee, 0x21, 0x44, 0xff, 0xaf, 0x2a, 0x0c, 0xfd, 0x6f, 0xf8, \n  0x49, 0xb9, 0x02, 0xb1, 0xc1, 0xfd, 0x15, 0xbd, 0xf9, 0xc9, 0xa8, 0x02, 0xac, 0x17, 0xf9, 0xab, \n  0xf4, 0xfc, 0xf3, 0x47, 0x01, 0x7a, 0x55, 0x00, 0x0d, 0x44, 0x03, 0x0b, 0xeb, 0x03, 0x63, 0xfc, \n  0xfc, 0xf6, 0x5f, 0x02, 0x1b, 0x0d, 0x00, 0xdd, 0x2e, 0xfa, 0x65, 0x8c, 0xfb, 0x4d, 0x3f, 0xf9, \n  0x81, 0xa0, 0xf9, 0xed, 0x8f, 0xfd, 0xca, 0xa5, 0x39, 0x2f, 0x04, 0x24, 0x45, 0x12, 0xf0, 0xbc, \n  0xeb, 0x18, 0x4e, 0xb6, 0x00, 0x5c, 0xdd, 0xee, 0x9c, 0x81, 0xf0, 0x6e, 0xeb, 0xf0, 0x6e, 0x4f, \n  0x0c, 0x62, 0x2a, 0x08, 0x27, 0xc2, 0xf1, 0x73, 0x54, 0xfd, 0x98, 0xd0, 0x0d, 0xe2, 0xce, 0xf7, \n  0x3c, 0x58, 0xff, 0x15, 0x6b, 0x00, 0xe6, 0x71, 0xf9, 0x92, 0x0f, 0x01, 0xf8, 0xe0, 0xfb, 0x72, \n  0xed, 0xfd, 0xed, 0xa2, 0x00, 0x1c, 0x53, 0xff, 0xe8, 0xb3, 0x00, 0xfd, 0xb5, 0x07, 0x4f, 0xa6, \n  0xfe, 0x29, 0x19, 0x00, 0x51, 0x19, 0x03, 0xcb, 0x2f, 0xf9, 0x2e, 0x9d, 0xfa, 0x5e, 0xce, 0xfb, \n  0x97, 0xaf, 0xf8, 0x30, 0x3b, 0xfb, 0xc4, 0xd5, 0x3c, 0xcd, 0x0a, 0x1f, 0xae, 0x1a, 0xe9, 0x91, \n  0x2a, 0x22, 0x76, 0x30, 0x01, 0x3c, 0x22, 0xe6, 0x0d, 0x1b, 0xf5, 0x58, 0x14, 0xf6, 0xdf, 0x46, \n  0x06, 0x25, 0x10, 0x08, 0x38, 0x39, 0xf7, 0x3a, 0x14, 0xf9, 0x41, 0x60, 0x0e, 0x3e, 0x7c, 0xf9, \n  0x3d, 0x86, 0xfa, 0x93, 0xa4, 0x02, 0xe5, 0x74, 0xfb, 0xa0, 0xcc, 0xfe, 0x60, 0xac, 0xfd, 0x0d, \n  0xae, 0x00, 0xbb, 0xce, 0xfe, 0x9a, 0x92, 0xfe, 0x4b, 0xc8, 0xff, 0x6a, 0x35, 0x06, 0x84, 0x56, \n  0x02, 0x9a, 0x49, 0x00, 0x1c, 0xb0, 0x01, 0x7c, 0x25, 0xfb, 0x88, 0xdf, 0xf9, 0x17, 0x33, 0xfc, \n  0x9e, 0x01, 0xfa, 0x4b, 0xb0, 0xf9, 0x79, 0x61, 0x3f, 0x7d, 0x7b, 0x18, 0x86, 0x28, 0xe6, 0x74, \n  0x6d, 0x29, 0x69, 0x1f, 0xfe, 0xa2, 0x0a, 0xe3, 0x19, 0xba, 0xf9, 0x02, 0x4d, 0xf9, 0x9b, 0xe7, \n  0x01, 0xe5, 0x04, 0x07, 0x38, 0x17, 0xfb, 0xc4, 0xe3, 0xf6, 0x2d, 0xc4, 0x0d, 0x1a, 0x80, 0xfa, \n  0x50, 0x39, 0xf8, 0x43, 0x8a, 0x03, 0xef, 0x69, 0xfe, 0x8c, 0xc5, 0xfd, 0x81, 0xe1, 0xfd, 0x1a, \n  0xd5, 0x01, 0x51, 0x47, 0xff, 0x86, 0x11, 0xfe, 0x62, 0xfc, 0xfd, 0x78, 0x5a, 0x05, 0x01, 0x50, \n  0x03, 0x63, 0xce, 0x01, 0x86, 0x0e, 0x01, 0x63, 0xaa, 0xfc, 0x20, 0x65, 0xfa, 0xb3, 0x9e, 0xfa, \n  0x89, 0xe8, 0xfb, 0x86, 0x88, 0xfa, 0xbe, 0xeb, 0x3f, 0x35, 0x55, 0x13, 0x5b, 0x86, 0xe4, 0x40, \n  0x34, 0x2e, 0xe2, 0xd4, 0xfc, 0x6f, 0xf9, 0xdf, 0x44, 0xba, 0xfd, 0x9f, 0xdd, 0xfe, 0xf9, 0x4c, \n  0xfb, 0x8a, 0x41, 0x04, 0xff, 0x96, 0x01, 0x6c, 0x4e, 0xf4, 0x0d, 0xa5, 0x0a, 0x43, 0x09, 0xfe, \n  0xe3, 0xd6, 0xf7, 0x06, 0x3a, 0x02, 0xef, 0x93, 0x00, 0xad, 0x98, 0xfe, 0x52, 0xe9, 0xfd, 0x54, \n  0xd8, 0x00, 0x0b, 0x7e, 0xff, 0x83, 0xb0, 0xff, 0x1e, 0xef, 0xfb, 0x18, 0x81, 0x04, 0xab, 0x13, \n  0x04, 0x3e, 0x88, 0x00, 0x3b, 0x10, 0x03, 0x59, 0xaa, 0xfd, 0x83, 0xac, 0xf9, 0xea, 0xc0, 0xfb, \n  0x63, 0xf1, 0xfb, 0xec, 0x08, 0xfb, 0xd7, 0xb1, 0x3c, 0xe8, 0x07, 0x10, 0x67, 0x31, 0xe6, 0xf5, \n  0x12, 0x30, 0xd8, 0x73, 0xfc, 0x03, 0x53, 0xdf, 0xdf, 0xf9, 0x00, 0x60, 0x97, 0x00, 0xb9, 0x27, \n  0xf7, 0xb4, 0xb3, 0x03, 0x22, 0x5c, 0x04, 0xad, 0x7a, 0xf2, 0x06, 0x21, 0x09, 0x0e, 0x63, 0x01, \n  0x9e, 0x33, 0xf7, 0x7f, 0xe1, 0x01, 0x7c, 0x85, 0x01, 0x71, 0x17, 0xfe, 0x14, 0x2f, 0xff, 0x16, \n  0xf1, 0xff, 0x9c, 0xd9, 0xfe, 0xfd, 0xc4, 0x00, 0xe4, 0x3e, 0xfc, 0x46, 0x0b, 0x03, 0xc8, 0x59, \n  0x03, 0x8a, 0xf6, 0x00, 0xff, 0xef, 0x02, 0x6a, 0xb6, 0xfe, 0xd4, 0x16, 0xfa, 0x47, 0xd8, 0xfc, \n  0xe0, 0x8b, 0xfc, 0x8d, 0xfd, 0xf9, 0xda, 0x81, 0x36, 0xec, 0xca, 0x0e, 0xcc, 0x2a, 0xea, 0x8a, \n  0x79, 0x2e, 0xb1, 0xec, 0xfd, 0x7a, 0x77, 0xe1, 0x08, 0xbc, 0x00, 0x2a, 0x37, 0x01, 0x63, 0x9e, \n  0xf6, 0x7e, 0xd0, 0x01, 0xf9, 0x24, 0x05, 0xa3, 0x63, 0xf3, 0x65, 0xb0, 0x07, 0xd0, 0x18, 0x03, \n  0x91, 0x16, 0xf8, 0xa3, 0x3a, 0x01, 0xcd, 0xae, 0x01, 0x80, 0x1a, 0xfe, 0x31, 0xf8, 0xfe, 0xb4, \n  0x47, 0x00, 0x82, 0xca, 0xfe, 0x28, 0x1d, 0x00, 0xfd, 0x99, 0xfd, 0x71, 0x86, 0x02, 0x76, 0x0a, \n  0x02, 0x3c, 0x72, 0x01, 0xcb, 0x46, 0x02, 0xff, 0x8d, 0xfe, 0x96, 0x13, 0xfc, 0x39, 0x74, 0xfd, \n  0x86, 0xc9, 0xfc, 0x6e, 0x7f, 0xfa, 0x2f, 0xbb, 0x2f, 0x9d, 0x78, 0x0f, 0x04, 0xa9, 0xed, 0xd3, \n  0x1d, 0x2a, 0x3c, 0x2b, 0x01, 0xc6, 0xda, 0xe3, 0x91, 0x21, 0x00, 0x2c, 0xf5, 0x01, 0x68, 0xf2, \n  0xf5, 0xa9, 0x38, 0x00, 0x72, 0x38, 0x06, 0x9c, 0xf2, 0xf4, 0x42, 0xa0, 0x05, 0xde, 0x20, 0x05, \n  0x1d, 0x9e, 0xf8, 0x72, 0xb6, 0xff, 0xe2, 0xe5, 0x02, 0x8a, 0x26, 0xfe, 0xdf, 0xca, 0xfd, 0xbc, \n  0xcd, 0x00, 0x4e, 0x53, 0xff, 0xaa, 0x77, 0xff, 0x11, 0x47, 0xfe, 0xe5, 0xab, 0x02, 0x3b, 0xf4, \n  0x01, 0xed, 0x71, 0x00, 0x38, 0xda, 0x01, 0x71, 0xba, 0xfe, 0x3e, 0x90, 0xfc, 0x33, 0xba, 0xfe, \n  0xc7, 0xf2, 0xfc, 0x8a, 0x1e, 0xfb, 0x07, 0x4a, 0x2a, 0x31, 0x5e, 0x13, 0xdc, 0x8b, 0xf3, 0xfc, \n  0xcd, 0x1d, 0x23, 0xfb, 0xfe, 0xc7, 0x62, 0xeb, 0xbf, 0x01, 0x00, 0xbc, 0x1a, 0xfe, 0xa8, 0x85, \n  0xfd, 0x46, 0xcb, 0x00, 0x86, 0xf5, 0xfd, 0x59, 0x07, 0xfd, 0xa8, 0x24, 0x06, 0xb3, 0x1b, 0x00, \n  0x84, 0x8e, 0xfb, 0xf3, 0x0c, 0xff, 0x1c, 0xf9, 0x00, 0x47, 0xba, 0xfe, 0xea, 0x47, 0xfc, 0x15, \n  0x34, 0x00, 0x70, 0x86, 0x00, 0x76, 0x6f, 0x00, 0xa4, 0x14, 0x00, 0x3d, 0x7b, 0x00, 0x7e, 0x19, \n  0x00, 0xc1, 0xa2, 0x01, 0x50, 0x11, 0x01, 0xbe, 0xa1, 0xff, 0x07, 0xf2, 0xff, 0xfa, 0xa6, 0xff, \n  0xce, 0x13, 0xff, 0x6c, 0x86, 0xff, 0x39, 0xc6, 0x23, 0xfd, 0xd6, 0x11, 0x77, 0x61, 0xf8, 0xca, \n  0xd0, 0x1b, 0x07, 0x30, 0xff, 0xbe, 0x70, 0xee, 0xcf, 0x0a, 0x00, 0xb6, 0x61, 0xfd, 0xbf, 0x31, \n  0xfe, 0x08, 0x14, 0x01, 0x57, 0xf2, 0xfd, 0x36, 0x3b, 0xfd, 0x84, 0x1e, 0x06, 0xc1, 0x7e, 0x00, \n  0x56, 0xa3, 0xfb, 0x36, 0xf8, 0xfe, 0x96, 0x96, 0x00, 0xac, 0xe5, 0xfe, 0xb2, 0xd9, 0xfc, 0xd4, \n  0x34, 0x00, 0x03, 0x1f, 0x00, 0x88, 0x32, 0x00, 0x9c, 0x5b, 0x00, 0xa6, 0x90, 0x00, 0x0b, 0x8a, \n  0x00, 0x77, 0xa3, 0x01, 0x7f, 0xc8, 0x00, 0x4c, 0x88, 0xff, 0xdf, 0x29, 0x00, 0xe0, 0xde, 0xff, \n  0x63, 0xc0, 0xfe, 0x78, 0x88, 0xff, 0x60, 0xc8, 0x1d, 0x8b, 0xdc, 0x10, 0xfb, 0x19, 0xfd, 0xbf, \n  0x1b, 0x18, 0x14, 0xe0, 0xff, 0x1e, 0xc2, 0xf2, 0x85, 0xa4, 0xfe, 0xf5, 0x86, 0xfc, 0xa5, 0x7d, \n  0xff, 0x21, 0x7e, 0x01, 0xe5, 0x73, 0xfd, 0x0d, 0xc8, 0xfd, 0x4e, 0xd9, 0x05, 0xd4, 0x9d, 0x00, \n  0x87, 0x46, 0xfc, 0x83, 0xb6, 0xfe, 0x26, 0x91, 0x00, 0x05, 0xee, 0xfe, 0x06, 0x2d, 0xfd, 0xcf, \n  0x49, 0x00, 0xc4, 0x04, 0x00, 0x2d, 0xf9, 0xff, 0x01, 0x5d, 0x00, 0x4b, 0xc4, 0x00, 0xe6, 0xf8, \n  0x00, 0xb9, 0x57, 0x01, 0xc4, 0x37, 0x00, 0x40, 0xea, 0xff, 0x22, 0x39, 0x00, 0xcb, 0xc4, 0xff, \n  0xd7, 0x71, 0xff, 0xab, 0xbf, 0xff, 0x0f, 0x01, 0x19, 0x3c, 0x8a, 0x10, 0x2e, 0x8f, 0xff, 0xb3, \n  0x32, 0x14, 0x22, 0xa9, 0x01, 0x38, 0xa9, 0xf5, 0x96, 0xc0, 0xfd, 0xe1, 0x9a, 0xfc, 0x9b, 0x30, \n  0x00, 0x57, 0x92, 0x01, 0x86, 0xaf, 0xfd, 0xfd, 0x4b, 0xfe, 0xc7, 0xb8, 0x04, 0xfa, 0xfe, 0x00, \n  0xc3, 0x07, 0xfd, 0xc5, 0x61, 0xfe, 0xf1, 0x5b, 0x00, 0xc2, 0x2f, 0xff, 0xf0, 0x90, 0xfd, 0xdb, \n  0x37, 0x00, 0x0d, 0x13, 0x00, 0x41, 0xfb, 0xff, 0x9f, 0x20, 0x00, 0x51, 0x10, 0x01, 0x65, 0x60, \n  0x01, 0xe7, 0x4f, 0x00, 0xf6, 0x2a, 0x00, 0x70, 0xd6, 0x00, 0xae, 0x05, 0x00, 0x4f, 0x7f, 0xff, \n  0x98, 0x65, 0x00, 0x98, 0x56, 0x00, 0x57, 0xf3, 0x15, 0xbd, 0x4b, 0x10, 0x58, 0xde, 0xff, 0x04, \n  0x5f, 0x11, 0x86, 0x5c, 0x03, 0xaa, 0xd7, 0xf6, 0xac, 0xe1, 0xfd, 0x31, 0xe3, 0xfd, 0x65, 0xfe, \n  0xff, 0x86, 0x16, 0x01, 0xcc, 0xf4, 0xfe, 0x87, 0xb0, 0xfe, 0xc9, 0x19, 0x03, 0xe6, 0x8f, 0x01, \n  0x56, 0xde, 0xfd, 0x52, 0xd6, 0xfd, 0x3c, 0x42, 0x00, 0x36, 0xc1, 0xff, 0x5d, 0xfc, 0xfd, 0xa2, \n  0xfa, 0xff, 0xf7, 0x53, 0x00, 0x60, 0x07, 0x00, 0x62, 0x09, 0x00, 0x7f, 0x90, 0x01, 0x03, 0xef, \n  0x00, 0xdf, 0x0c, 0x00, 0xc0, 0xe2, 0x00, 0x88, 0xf2, 0x00, 0x25, 0xf8, 0xff, 0x20, 0x31, 0x00, \n  0x9c, 0x07, 0x01, 0xad, 0x21, 0x00, 0xc4, 0x36, 0x14, 0x55, 0xbe, 0x0f, 0x7c, 0x72, 0xff, 0x57, \n  0x2e, 0x0f, 0xd3, 0xda, 0x03, 0xcd, 0x1b, 0xf8, 0xbc, 0xe5, 0xfe, 0xa3, 0x97, 0xfe, 0x15, 0x95, \n  0xff, 0x5d, 0x10, 0x01, 0xec, 0x26, 0x00, 0x94, 0x97, 0xfe, 0x05, 0x28, 0x02, 0xb4, 0xe7, 0x01, \n  0x38, 0xf2, 0xfd, 0xaa, 0x01, 0xfe, 0xec, 0x7f, 0x00, 0x31, 0xee, 0xff, 0xf9, 0x2e, 0xfe, 0x4f, \n  0x30, 0x00, 0xfc, 0x83, 0x00, 0x4f, 0xab, 0xff, 0x83, 0xcc, 0x00, 0xcc, 0xbc, 0x01, 0x23, 0x61, \n  0x00, 0x24, 0x78, 0x00, 0xf4, 0x4f, 0x01, 0xc0, 0x38, 0x01, 0x85, 0x53, 0x00, 0x64, 0xbc, 0x00, \n  0xef, 0xad, 0x00, 0xf2, 0x73, 0xff, 0x9f, 0x5d, 0x12, 0xcb, 0xb7, 0x0e, 0x54, 0x71, 0xff, 0xdd, \n  0xa6, 0x0d, 0x43, 0xfc, 0x03, 0x75, 0x71, 0xf9, 0x69, 0xa5, 0xff, 0x51, 0xe6, 0xfe, 0xd5, 0x6a, \n  0xff, 0x72, 0x5b, 0x01, 0xe8, 0xb4, 0x00, 0xad, 0x55, 0xfe, 0xa9, 0x99, 0x01, 0x35, 0xc6, 0x01, \n  0x55, 0x69, 0xfe, 0xac, 0x61, 0xfe, 0x1c, 0x5d, 0x00, 0x2c, 0x00, 0x00, 0x36, 0x7e, 0xfe, 0xcb, \n  0x73, 0x00, 0x84, 0x44, 0x00, 0x58, 0x54, 0x00, 0xcb, 0x99, 0x01, 0xfc, 0xc4, 0x00, 0xb9, 0x8f, \n  0x00, 0x6f, 0x7a, 0x01, 0x05, 0xa8, 0x01, 0xd4, 0x0d, 0x01, 0x98, 0x31, 0x00, 0xf8, 0x7f, 0x00, \n  0x38, 0xd2, 0xff, 0x02, 0x34, 0xff, 0x43, 0x66, 0x10, 0xd8, 0x38, 0x0d, 0x03, 0x0a, 0x00, 0x35, \n  0xd5, 0x0c, 0x4e, 0xf0, 0x03, 0x3a, 0xac, 0xfa, 0xc2, 0xff, 0xff, 0xed, 0x6f, 0xff, 0x64, 0xdd, \n  0xff, 0x8d, 0x42, 0x01, 0xb7, 0x80, 0x00, 0x5b, 0x75, 0xfe, 0x4f, 0xba, 0x01, 0xaa, 0x8d, 0x01, \n  0xd0, 0x95, 0xfe, 0x3b, 0xcb, 0xfe, 0xc9, 0x6f, 0x00, 0x35, 0xe1, 0xff, 0xe7, 0x11, 0xff, 0xcf, \n  0xdb, 0x00, 0x3b, 0x7d, 0x00, 0xa8, 0x34, 0x01, 0xe7, 0x60, 0x01, 0x8a, 0xda, 0x00, 0xae, 0x78, \n  0x01, 0x6d, 0x95, 0x01, 0x79, 0x5b, 0x01, 0x22, 0x66, 0x00, 0xa1, 0xd7, 0xff, 0x74, 0x12, 0x00, \n  0xb5, 0x96, 0xff, 0xcd, 0x32, 0xff, 0x14, 0xc9, 0x0e, 0x65, 0x83, 0x0c, 0x22, 0x60, 0x00, 0x76, \n  0x04, 0x0b, 0x4f, 0x08, 0x04, 0x98, 0x35, 0xfc, 0x2e, 0xa5, 0x00, 0x39, 0x92, 0xff, 0xb9, 0xa3, \n  0xff, 0x4c, 0x6a, 0x01, 0xc7, 0xce, 0x00, 0x91, 0xba, 0xfe, 0xb6, 0x47, 0x01, 0x26, 0x5d, 0x01, \n  0xe3, 0x0c, 0xff, 0x2e, 0x0f, 0xff, 0xa2, 0x62, 0x00, 0xa7, 0x5d, 0x00, 0x82, 0x06, 0x00, 0x32, \n  0xdc, 0x00, 0xb1, 0x37, 0x01, 0x3b, 0x0e, 0x02, 0xcb, 0x34, 0x01, 0xd7, 0x35, 0x01, 0x12, 0x39, \n  0x01, 0x6d, 0xb4, 0x00, 0x90, 0xd2, 0x00, 0xec, 0x14, 0x00, 0x07, 0xa0, 0xff, 0xe6, 0xd9, 0xff, \n  0x4e, 0x96, 0xff, 0xe9, 0xde, 0xfe, 0xe7, 0xd1, 0x0c, 0x07, 0x50, 0x0b, 0xb9, 0xff, 0x00, 0x92, \n  0x45, 0x0a, 0x11, 0x74, 0x04, 0x3d, 0x28, 0xfd, 0x5a, 0xa1, 0x00, 0xf3, 0xdb, 0xff, 0xad, 0x27, \n  0x00, 0x96, 0x5e, 0x01, 0x58, 0x85, 0x00, 0x07, 0x01, 0xff, 0x0f, 0x3a, 0x01, 0xff, 0x2e, 0x01, \n  0xad, 0x77, 0xff, 0x16, 0x8a, 0xff, 0x97, 0xb0, 0x00, 0xf2, 0x0d, 0x01, 0x50, 0xb2, 0x00, 0x6e, \n  0x8e, 0x01, 0x08, 0x17, 0x02, 0x2d, 0xe7, 0x01, 0x4f, 0xb9, 0x00, 0x6d, 0x5f, 0x00, 0x91, 0x5d, \n  0x00, 0x27, 0x78, 0x00, 0x5c, 0x94, 0x00, 0x49, 0x15, 0x00, 0xea, 0x6e, 0xff, 0x9f, 0x6c, 0xff, \n  0x91, 0x5f, 0xff, 0x1b, 0xb1, 0xfe, 0x34, 0xe9, 0x0a, 0xeb, 0x3f, 0x0a, 0x54, 0xf8, 0x01, 0x51, \n  0x77, 0x09, 0xe3, 0x2c, 0x04, 0x9a, 0x53, 0xfe, 0xaf, 0x36, 0x01, 0x09, 0xc0, 0xff, 0x26, 0x41, \n  0x00, 0x74, 0x83, 0x01, 0xd0, 0x59, 0x00, 0x25, 0x0f, 0xff, 0xb1, 0x59, 0x01, 0x9a, 0x84, 0x01, \n  0xe8, 0xff, 0xff, 0x82, 0xe1, 0xff, 0x97, 0x6b, 0x01, 0x56, 0x45, 0x02, 0xa9, 0x5d, 0x01, 0x7b, \n  0xdc, 0x01, 0x77, 0xba, 0x01, 0xee, 0x56, 0x00, 0x47, 0xd2, 0xff, 0xef, 0x3f, 0x00, 0x6d, 0x16, \n  0x00, 0x9e, 0x5f, 0x00, 0x99, 0x58, 0x00, 0x78, 0x89, 0xff, 0x7b, 0x35, 0xff, 0xb1, 0x6c, 0xff, \n  0x77, 0x0a, 0xff, 0x46, 0x60, 0xfe, 0xf0, 0xe1, 0x09, 0x8b, 0xf4, 0x09, 0x4b, 0xfe, 0x01, 0x97, \n  0xf1, 0x07, 0x6d, 0xa2, 0x04, 0xad, 0xce, 0xff, 0x74, 0x0b, 0x01, 0x96, 0xaa, 0xff, 0x67, 0x69, \n  0x00, 0xa4, 0x7e, 0x01, 0x15, 0xdd, 0x00, 0x1e, 0xb7, 0xff, 0xed, 0x63, 0x01, 0x01, 0xbc, 0x01, \n  0xf3, 0x0d, 0x01, 0x67, 0x6c, 0x01, 0xc2, 0x6b, 0x02, 0xf6, 0x5e, 0x02, 0x25, 0xe1, 0x00, 0xc2, \n  0xb5, 0x00, 0x32, 0x86, 0x00, 0x07, 0x0d, 0x00, 0x8f, 0xdd, 0xff, 0x20, 0x07, 0x00, 0xcc, 0xe1, \n  0xff, 0x98, 0x09, 0x00, 0x00, 0x04, 0x00, 0x9c, 0x5e, 0xff, 0xa4, 0x23, 0xff, 0x64, 0x33, 0xff, \n  0x4c, 0xb3, 0xfe, 0x20, 0x65, 0xfe, 0xad, 0xab, 0x07, 0xc4, 0x83, 0x08, 0xe5, 0x9f, 0x03, 0x49, \n  0x1c, 0x08, 0xa9, 0x43, 0x04, 0xc0, 0x7e, 0x00, 0xc6, 0x43, 0x01, 0xd3, 0xcb, 0xff, 0xec, 0x22, \n  0x01, 0x50, 0xc3, 0x01, 0x85, 0xa6, 0x00, 0xa9, 0x69, 0x00, 0xff, 0xbd, 0x02, 0xb5, 0xe2, 0x02, \n  0xd6, 0xa8, 0x01, 0xe9, 0xaf, 0x01, 0x17, 0xfd, 0x01, 0x5d, 0x03, 0x01, 0xbe, 0xf8, 0xff, 0x37, \n  0x6e, 0x00, 0x6f, 0x39, 0x00, 0x8b, 0x25, 0x00, 0x74, 0x99, 0xff, 0x4b, 0x6b, 0xff, 0xfb, 0xa7, \n  0xff, 0x49, 0xbd, 0xff, 0x2b, 0xd6, 0xff, 0xc1, 0x56, 0xff, 0x33, 0xf8, 0xfe, 0x04, 0xe6, 0xfe, \n  0xdb, 0x9b, 0xfe, 0x4d, 0xb3, 0xfe, 0xb3, 0x50, 0x07, 0xe2, 0x1a, 0x09, 0xc0, 0x8e, 0x03, 0xea, \n  0x18, 0x06, 0x8d, 0x95, 0x04, 0x62, 0x72, 0x01, 0xc7, 0x4e, 0x01, 0x35, 0x0d, 0x00, 0x23, 0x5e, \n  0x01, 0x32, 0xe8, 0x02, 0x0c, 0x33, 0x02, 0xcf, 0xd1, 0x01, 0xd1, 0x0c, 0x03, 0x8c, 0xc0, 0x02, \n  0x3b, 0x31, 0x01, 0x99, 0xeb, 0xff, 0x98, 0x64, 0x00, 0x67, 0xfa, 0x00, 0xe2, 0x88, 0x00, 0xd9, \n  0x27, 0x00, 0xff, 0x70, 0xff, 0x87, 0x5b, 0xff, 0x47, 0x5b, 0xff, 0xf2, 0x74, 0xff, 0x5a, 0x7a, \n  0xff, 0x91, 0x80, 0xff, 0x99, 0x4b, 0xff, 0xa0, 0x0d, 0xff, 0xb2, 0x37, 0xff, 0x3c, 0xda, 0xfe, \n  0xec, 0xca, 0xfe, 0x09, 0xc9, 0xfe, 0x41, 0xe2, 0x05, 0xec, 0x02, 0x08, 0x6b, 0x86, 0x04, 0x03, \n  0x9e, 0x06, 0x2d, 0xf1, 0x04, 0xc1, 0x8e, 0x01, 0x8b, 0xb2, 0x01, 0x5a, 0xa8, 0x01, 0xa9, 0x35, \n  0x03, 0x0e, 0xee, 0x03, 0x16, 0xcb, 0x02, 0x9d, 0xfd, 0x01, 0x60, 0x6d, 0x01, 0x64, 0xb6, 0x00, \n  0xba, 0x06, 0x00, 0xba, 0x3a, 0x00, 0xbe, 0x06, 0x01, 0x03, 0xdb, 0x00, 0xa6, 0x9b, 0xff, 0x44, \n  0x47, 0xff, 0x88, 0xd1, 0xff, 0x56, 0x2c, 0xff, 0x38, 0xc4, 0xfe, 0xd5, 0x27, 0xff, 0xe5, 0x5c, \n  0xff, 0xa8, 0x69, 0xff, 0x26, 0x33, 0xff, 0x83, 0x5e, 0xff, 0x1a, 0x2e, 0xff, 0xe9, 0xfe, 0xfe, \n  0xb6, 0xe7, 0xfe, 0x6c, 0xc3, 0xfe, 0x43, 0x53, 0x06, 0xa7, 0xa6, 0x09, 0x48, 0x26, 0x05, 0x69, \n  0xc4, 0x04, 0x62, 0x1a, 0x04, 0x58, 0xbc, 0x03, 0x1e, 0x21, 0x05, 0x5f, 0xc0, 0x03, 0xcc, 0xba, \n  0x02, 0x5c, 0x6a, 0x02, 0xa4, 0xe0, 0x00, 0x2f, 0xd2, 0xff, 0x79, 0x2b, 0x00, 0x6c, 0xc3, 0x00, \n  0xf6, 0x10, 0x01, 0xb0, 0x34, 0x00, 0x58, 0xa5, 0xff, 0xbb, 0x3d, 0x00, 0x6b, 0xad, 0xff, 0xf4, \n  0x1d, 0xff, 0x9b, 0x0e, 0xff, 0x07, 0x81, 0xfe, 0x8b, 0xcd, 0xfe, 0xf1, 0x81, 0xff, 0x4c, 0x62, \n  0xff, 0xc2, 0x39, 0xff, 0xc4, 0x78, 0xff, 0x2c, 0x91, 0xff, 0x1a, 0x14, 0xff, 0xed, 0xc3, 0xfe, \n  0x37, 0xef, 0xfe, 0x86, 0xe9, 0xfe, 0xba, 0xb6, 0x06, 0x16, 0x98, 0x09, 0x78, 0x24, 0x06, 0x9d, \n  0x9c, 0x07, 0xcb, 0x55, 0x06, 0x7c, 0xfb, 0x04, 0x44, 0x18, 0x05, 0x2f, 0xf7, 0x01, 0x9d, 0xfe, \n  0xff, 0x90, 0x4f, 0x00, 0x83, 0x2b, 0x00, 0x54, 0x28, 0x00, 0xab, 0x66, 0x00, 0x6a, 0x57, 0x00, \n  0xea, 0xb0, 0x00, 0x99, 0xb2, 0xff, 0x65, 0x71, 0xff, 0x78, 0xfd, 0xff, 0x9e, 0x0d, 0xff, 0xed, \n  0xc5, 0xfe, 0x0d, 0xbf, 0xfe, 0xf5, 0x69, 0xfe, 0xb9, 0x00, 0xff, 0x24, 0xb1, 0xff, 0xa5, 0x90, \n  0xff, 0x9b, 0x42, 0xff, 0xc2, 0x5b, 0xff, 0xfe, 0x75, 0xff, 0x99, 0x19, 0xff, 0x01, 0xdd, 0xfe, \n  0xdf, 0xdc, 0xfe, 0xb0, 0xcf, 0xfe, 0xec, 0xcd, 0x07, 0x5f, 0x42, 0x0c, 0x64, 0x05, 0x0a, 0xc3, \n  0x86, 0x09, 0x70, 0x2f, 0x05, 0xa8, 0xa6, 0x02, 0x3e, 0x88, 0x01, 0x4c, 0xfc, 0xff, 0xc3, 0xf7, \n  0xff, 0x4b, 0x7b, 0x00, 0xd5, 0x42, 0x00, 0x38, 0x94, 0xff, 0x90, 0xcd, 0xff, 0x8d, 0x18, 0x00, \n  0x01, 0x99, 0x00, 0xc3, 0x7d, 0xff, 0xb2, 0x17, 0xff, 0x8f, 0x5b, 0xff, 0xdf, 0x99, 0xfe, 0x65, \n  0x9e, 0xfe, 0xf7, 0xc1, 0xfe, 0x31, 0x0b, 0xff, 0x8f, 0x39, 0xff, 0x31, 0x4c, 0xff, 0xe4, 0x58, \n  0xff, 0x67, 0x90, 0xff, 0x0e, 0x89, 0xff, 0x11, 0x30, 0xff, 0xca, 0xee, 0xfe, 0xe0, 0xd0, 0xfe, \n  0xa4, 0xed, 0xfe, 0x47, 0xda, 0xfe, 0xde, 0x5f, 0x09, 0x12, 0xdd, 0x10, 0x5e, 0xa3, 0x0c, 0x21, \n  0x98, 0x05, 0xa4, 0x82, 0x00, 0x81, 0x57, 0x01, 0x1e, 0xcd, 0x02, 0x4e, 0xf6, 0x01, 0xa1, 0x42, \n  0xff, 0x81, 0xb9, 0xfe, 0x49, 0xf9, 0xff, 0x41, 0x2c, 0x00, 0xbd, 0xfe, 0xff, 0x43, 0x61, 0xff, \n  0x02, 0x17, 0x00, 0x6b, 0xac, 0xff, 0x3d, 0xe1, 0xfe, 0xf8, 0xdc, 0xfe, 0xdf, 0xac, 0xfe, 0xb3, \n  0x1f, 0xff, 0x7e, 0xed, 0xfe, 0x0f, 0xe7, 0xfe, 0xcc, 0xfe, 0xfe, 0x65, 0x63, 0xff, 0x3b, 0x7a, \n  0xff, 0x41, 0x6a, 0xff, 0x6d, 0x97, 0xff, 0x34, 0x22, 0xff, 0xbe, 0xf3, 0xfe, 0xe6, 0xc1, 0xfe, \n  0xec, 0xe2, 0xfe, 0x2e, 0x1d, 0xff, 0x0a, 0x0a, 0x0a, 0x07, 0xdf, 0x10, 0xf3, 0xbf, 0x08, 0xac, \n  0x22, 0x03, 0x33, 0x01, 0x02, 0x3f, 0x0f, 0x04, 0xbd, 0xcd, 0x04, 0xbd, 0x0e, 0x01, 0xfe, 0x98, \n  0xfe, 0xce, 0x00, 0x00, 0x4f, 0x39, 0x00, 0x7c, 0xed, 0xfe, 0xeb, 0x1a, 0x00, 0xa4, 0xa3, 0xff, \n  0x9e, 0x72, 0xff, 0xf3, 0x81, 0xff, 0xe9, 0xd6, 0xfe, 0x06, 0x43, 0xff, 0xe6, 0x11, 0xff, 0x15, \n  0xd5, 0xfe, 0x61, 0x10, 0xff, 0xc8, 0xe8, 0xfe, 0x97, 0xab, 0xfe, 0x01, 0x55, 0xff, 0xed, 0x81, \n  0xff, 0x0f, 0x46, 0xff, 0xbc, 0x69, 0xff, 0x9e, 0x2f, 0xff, 0xce, 0x15, 0xff, 0x03, 0x07, 0xff, \n  0x5d, 0xe0, 0xfe, 0xa5, 0xf7, 0xfe, 0x0a, 0x19, 0x06, 0x95, 0x40, 0x09, 0x86, 0x26, 0x05, 0x0b, \n  0x45, 0x05, 0x1a, 0x18, 0x06, 0x7c, 0x17, 0x06, 0x18, 0x8b, 0x05, 0x13, 0x9e, 0x02, 0xaf, 0x5a, \n  0x01, 0xf8, 0xe2, 0x01, 0xd0, 0xec, 0x00, 0xbe, 0x90, 0xff, 0x7e, 0x3f, 0xff, 0x33, 0xc3, 0xff, \n  0x99, 0xf2, 0xff, 0xe0, 0xfd, 0xfe, 0xaa, 0xfc, 0xfe, 0x67, 0x76, 0xff, 0x3f, 0x63, 0xff, 0xa6, \n  0x7d, 0xff, 0xbd, 0xe7, 0xfe, 0xf5, 0xd0, 0xfe, 0xeb, 0x35, 0xff, 0x0a, 0xfa, 0xfe, 0x37, 0xf0, \n  0xfe, 0xf6, 0x52, 0xff, 0xc6, 0x35, 0xff, 0xed, 0x1b, 0xff, 0x67, 0x86, 0xff, 0xcf, 0x59, 0xff, \n  0x6a, 0xf5, 0xfe, 0xe9, 0xe9, 0xfe, 0xb2, 0xcf, 0x04, 0x62, 0xa9, 0x06, 0x69, 0x03, 0x03, 0x79, \n  0x82, 0x03, 0xf9, 0x55, 0x05, 0xdb, 0x7b, 0x05, 0x85, 0x36, 0x04, 0x16, 0x41, 0x03, 0x3f, 0x16, \n  0x04, 0xd0, 0x13, 0x04, 0x5f, 0xe1, 0x02, 0xca, 0x94, 0x01, 0x02, 0xd9, 0x00, 0x1d, 0x9a, 0x00, \n  0xce, 0xa4, 0xff, 0x3c, 0x14, 0xff, 0xc7, 0x69, 0xff, 0x6c, 0x10, 0xff, 0xea, 0xf0, 0xfe, 0x2b, \n  0xbc, 0xff, 0x17, 0x3f, 0xff, 0xf4, 0x2a, 0xff, 0x21, 0x87, 0xff, 0x15, 0x13, 0xff, 0xdd, 0x1c, \n  0xff, 0xcb, 0x44, 0xff, 0xba, 0x08, 0xff, 0x31, 0xd2, 0xfe, 0xe4, 0x26, 0xff, 0x71, 0x56, 0xff, \n  0x60, 0x40, 0xff, 0x77, 0x5b, 0xff, 0x9c, 0x47, 0x05, 0xf7, 0x42, 0x07, 0xa9, 0x5d, 0x03, 0xb2, \n  0x9c, 0x03, 0x49, 0x83, 0x04, 0x20, 0x5e, 0x03, 0x33, 0xe1, 0x01, 0xe2, 0x94, 0x01, 0x3f, 0x46, \n  0x03, 0x27, 0x49, 0x04, 0x18, 0x65, 0x03, 0xf4, 0xa4, 0x02, 0xb3, 0x79, 0x02, 0x2b, 0x0f, 0x02, \n  0x37, 0xeb, 0x00, 0xb2, 0xb4, 0xff, 0x94, 0x6d, 0xff, 0xcb, 0x58, 0xff, 0x04, 0x46, 0xff, 0xbf, \n  0x22, 0xff, 0x44, 0xf2, 0xfe, 0x74, 0x43, 0xff, 0xef, 0xa0, 0xff, 0x8b, 0x53, 0xff, 0xd3, 0x2b, \n  0xff, 0x76, 0x5e, 0xff, 0x3e, 0xf6, 0xfe, 0xac, 0xf4, 0xfe, 0xf9, 0x33, 0xff, 0xb1, 0xef, 0xfe, \n  0x6c, 0x1d, 0xff, 0xbb, 0x71, 0xff, 0x13, 0xf8, 0x05, 0x5e, 0xe8, 0x07, 0xa0, 0xa6, 0x02, 0xc0, \n  0x55, 0x03, 0xb9, 0xc1, 0x04, 0xe9, 0x24, 0x03, 0x90, 0xc2, 0x00, 0xf0, 0x3c, 0x00, 0x90, 0x89, \n  0x02, 0x3f, 0x16, 0x03, 0x85, 0xe5, 0x01, 0xac, 0xa5, 0x02, 0xe0, 0x99, 0x03, 0xc1, 0x2d, 0x03, \n  0x76, 0x50, 0x02, 0xe1, 0xea, 0x00, 0x7f, 0x74, 0x00, 0xcc, 0xe8, 0xff, 0xf5, 0x46, 0xff, 0xe4, \n  0x87, 0xff, 0x1b, 0xf8, 0xfe, 0x34, 0xe7, 0xfe, 0x67, 0x94, 0xff, 0xef, 0x51, 0xff, 0xbe, 0x8b, \n  0xff, 0x00, 0xc9, 0xff, 0x9c, 0x17, 0xff, 0x8d, 0x0e, 0xff, 0xb0, 0x36, 0xff, 0x87, 0xda, 0xfe, \n  0x63, 0x14, 0xff, 0xb3, 0x37, 0xff, 0x61, 0x93, 0x06, 0x96, 0x39, 0x09, 0x28, 0x1a, 0x03, 0xae, \n  0x2b, 0x03, 0xc1, 0x99, 0x04, 0xe9, 0x41, 0x02, 0x4a, 0x28, 0x00, 0x0e, 0xde, 0x00, 0x4c, 0xa9, \n  0x02, 0x18, 0x9e, 0x01, 0xdf, 0x86, 0x00, 0x47, 0x74, 0x01, 0x0f, 0x05, 0x02, 0x84, 0xa6, 0x02, \n  0x1b, 0x0c, 0x03, 0x41, 0xf1, 0x01, 0x0f, 0x61, 0x01, 0xca, 0xe5, 0x00, 0x73, 0x4a, 0x00, 0x1a, \n  0x1b, 0x00, 0xf1, 0x2d, 0xff, 0x56, 0x2a, 0xff, 0x18, 0x6a, 0xff, 0xab, 0xf6, 0xfe, 0x1b, 0x7f, \n  0xff, 0x95, 0xcc, 0xff, 0x05, 0x54, 0xff, 0x9f, 0x53, 0xff, 0x97, 0x3f, 0xff, 0x5d, 0xe8, 0xfe, \n  0xa1, 0x0f, 0xff, 0x5e, 0x3a, 0xff, 0x0c, 0x04, 0x07, 0x54, 0xda, 0x09, 0x30, 0x81, 0x03, 0x77, \n  0xa7, 0x03, 0x3b, 0x63, 0x05, 0x15, 0xd9, 0x01, 0xd4, 0xa5, 0xfe, 0x98, 0xdc, 0x00, 0x58, 0x39, \n  0x03, 0xaf, 0x36, 0x01, 0x75, 0x2c, 0x00, 0x98, 0x03, 0x01, 0x14, 0xf1, 0x00, 0x27, 0x3b, 0x01, \n  0xc4, 0x85, 0x01, 0x0a, 0x3f, 0x01, 0xf6, 0xe9, 0x01, 0xb6, 0xfe, 0x01, 0xb1, 0x17, 0x01, 0x2f, \n  0xb1, 0x00, 0xcc, 0x5c, 0x00, 0xda, 0xd3, 0xff, 0x6b, 0x64, 0xff, 0xb7, 0x48, 0xff, 0xdc, 0x5d, \n  0xff, 0xc0, 0x68, 0xff, 0x6e, 0x5f, 0xff, 0xdb, 0x59, 0xff, 0x19, 0x64, 0xff, 0xca, 0x35, 0xff, \n  0x30, 0x09, 0xff, 0x30, 0x1f, 0xff, 0x04, 0xdb, 0x07, 0xc5, 0xfa, 0x0a, 0x86, 0xf0, 0x03, 0x0c, \n  0x87, 0x03, 0xee, 0x69, 0x05, 0xc2, 0x9e, 0x01, 0x5f, 0xdb, 0xfd, 0x36, 0x3c, 0x01, 0x67, 0x4e, \n  0x03, 0x1a, 0x22, 0x00, 0x96, 0xef, 0xff, 0x5d, 0x46, 0x01, 0x2c, 0xdc, 0x00, 0xf9, 0x7b, 0x00, \n  0xdc, 0xc3, 0x00, 0x56, 0x2a, 0x00, 0x16, 0x1a, 0x00, 0xee, 0x33, 0x01, 0x79, 0xa9, 0x01, 0xa1, \n  0x66, 0x01, 0xce, 0xe7, 0x00, 0x82, 0x9a, 0x00, 0x23, 0x30, 0x00, 0x40, 0xa9, 0xff, 0x4e, 0x83, \n  0xff, 0x44, 0x97, 0xff, 0x60, 0x50, 0xff, 0xed, 0x03, 0xff, 0x0f, 0x28, 0xff, 0x0e, 0x56, 0xff, \n  0x14, 0x3d, 0xff, 0x72, 0x0c, 0xff, 0x8f, 0x96, 0x08, 0x64, 0x2f, 0x0c, 0xe9, 0x6d, 0x04, 0x93, \n  0x64, 0x03, 0x77, 0xb7, 0x05, 0x81, 0x8a, 0x01, 0x2c, 0xfa, 0xfc, 0x54, 0x87, 0x01, 0x25, 0x85, \n  0x03, 0xa9, 0x66, 0xff, 0x16, 0xaa, 0xff, 0xa7, 0x78, 0x01, 0x01, 0xc6, 0x00, 0xd7, 0x41, 0x00, \n  0x82, 0xa0, 0x00, 0x6c, 0xd1, 0xff, 0x98, 0x97, 0xff, 0xf1, 0x0d, 0x00, 0x2d, 0x30, 0x00, 0xcf, \n  0xc1, 0x00, 0xfc, 0x24, 0x01, 0x32, 0x7b, 0x01, 0xc0, 0xdd, 0x00, 0x69, 0x41, 0x00, 0x33, 0x51, \n  0x00, 0xe1, 0xf6, 0xff, 0x87, 0x8a, 0xff, 0x67, 0x51, 0xff, 0x8a, 0x1b, 0xff, 0xdf, 0xfe, 0xfe, \n  0xc4, 0x51, 0xff, 0xc3, 0x2a, 0xff, 0x3c, 0xe0, 0x09, 0xff, 0xca, 0x0d, 0x30, 0x5e, 0x04, 0xa3, \n  0xf6, 0x02, 0x8b, 0xc0, 0x05, 0x2b, 0x57, 0x01, 0x51, 0x9c, 0xfc, 0xbb, 0xfd, 0x01, 0x2a, 0x37, \n  0x03, 0xa5, 0x56, 0xfe, 0x92, 0x9e, 0xff, 0x03, 0xc6, 0x01, 0x65, 0xc7, 0x00, 0x4a, 0xe3, 0xff, \n  0x8d, 0x52, 0x00, 0x23, 0xc2, 0xff, 0xb0, 0x5f, 0xff, 0x08, 0xbc, 0xff, 0xb1, 0xbb, 0xff, 0x49, \n  0xc6, 0xff, 0xb2, 0xa4, 0xff, 0x42, 0xc0, 0x00, 0x7b, 0x45, 0x01, 0x19, 0xfd, 0x00, 0x49, 0xbd, \n  0x00, 0x62, 0x66, 0x00, 0x77, 0x39, 0x00, 0xb2, 0xaf, 0xff, 0xd9, 0x37, 0xff, 0x14, 0x13, 0xff, \n  0x55, 0x40, 0xff, 0x9c, 0xfb, 0xfe, 0x92, 0xea, 0x0a, 0x4c, 0x16, 0x0f, 0x38, 0x9a, 0x04, 0x43, \n  0xfa, 0x02, 0x83, 0xea, 0x05, 0x57, 0xcc, 0x00, 0xe8, 0x1a, 0xfc, 0x28, 0xda, 0x02, 0xa6, 0x32, \n  0x03, 0x80, 0x2f, 0xfd, 0x43, 0x4c, 0xff, 0xd6, 0xf7, 0x01, 0x4d, 0xcf, 0x00, 0x09, 0xef, 0xff, \n  0xc9, 0x18, 0x00, 0xb7, 0x75, 0xff, 0xd1, 0x44, 0xff, 0xee, 0xa2, 0xff, 0xcb, 0xa6, 0xff, 0xc6, \n  0x7e, 0xff, 0x4c, 0x1a, 0xff, 0xd2, 0xb0, 0xff, 0x65, 0x1d, 0x00, 0xc8, 0x79, 0x00, 0x99, 0x10, \n  0x01, 0x27, 0xed, 0x00, 0xf9, 0x9e, 0x00, 0xdb, 0x49, 0x00, 0x3f, 0xc9, 0xff, 0x25, 0x4a, 0xff, \n  0x41, 0x51, 0xff, 0xf1, 0x3a, 0xff, 0xe0, 0x3f, 0x0c, 0x9c, 0x6c, 0x10, 0x8a, 0x80, 0x04, 0x98, \n  0x48, 0x03, 0xef, 0x2a, 0x06, 0x7d, 0xe0, 0xff, 0xc6, 0xe9, 0xfb, 0x09, 0x08, 0x04, 0x80, 0xfc, \n  0x02, 0xca, 0x11, 0xfc, 0xd3, 0x31, 0xff, 0x1a, 0x39, 0x02, 0x03, 0xca, 0x00, 0x99, 0xd2, 0xff, \n  0x17, 0x01, 0x00, 0x64, 0x79, 0xff, 0xac, 0x2d, 0xff, 0xab, 0x76, 0xff, 0x44, 0xbd, 0xff, 0xb1, \n  0x6a, 0xff, 0xc8, 0xf9, 0xfe, 0xd2, 0x6a, 0xff, 0xea, 0x9d, 0xff, 0x9b, 0xbd, 0xff, 0xfb, 0x0f, \n  0x00, 0xce, 0x86, 0x00, 0xde, 0xeb, 0x00, 0x1e, 0xb4, 0x00, 0x53, 0x2b, 0x00, 0xf0, 0xdd, 0xff, \n  0x44, 0xf8, 0xff, 0x17, 0x77, 0xff, 0x10, 0xc0, 0x0d, 0x59, 0x9f, 0x11, 0xdc, 0x26, 0x04, 0x2f, \n  0xf3, 0x03, 0x33, 0x57, 0x06, 0xbd, 0x73, 0xfe, 0x99, 0xcf, 0xfb, 0xb5, 0x55, 0x05, 0x35, 0xa2, \n  0x02, 0x95, 0x0c, 0xfb, 0x73, 0xee, 0xfe, 0xee, 0x3f, 0x02, 0xe7, 0xe7, 0x00, 0x62, 0xaa, 0xff, \n  0x38, 0xdd, 0xff, 0xe0, 0x4c, 0xff, 0xf3, 0xf6, 0xfe, 0x19, 0x41, 0xff, 0xf1, 0xef, 0xff, 0x8d, \n  0x50, 0xff, 0x51, 0xd0, 0xfe, 0xd1, 0x5f, 0xff, 0x90, 0x02, 0xff, 0x62, 0xb6, 0xff, 0x43, 0xe8, \n  0xff, 0x34, 0x8a, 0xff, 0xa6, 0xd8, 0xff, 0xba, 0x43, 0x00, 0x4f, 0x6e, 0x00, 0xa6, 0x58, 0x00, \n  0x10, 0x25, 0x00, 0x36, 0xd9, 0xff, 0x7e, 0x70, 0x0f, 0x12, 0xea, 0x12, 0x08, 0xa7, 0x03, 0x83, \n  0x80, 0x04, 0x65, 0x7c, 0x06, 0x91, 0x25, 0xfd, 0x89, 0xcf, 0xfb, 0xd3, 0x6d, 0x06, 0x6a, 0x25, \n  0x02, 0xc4, 0x5a, 0xfa, 0xdd, 0xd3, 0xfe, 0x04, 0x0b, 0x02, 0xfd, 0xda, 0x00, 0x17, 0x88, 0xff, \n  0xa5, 0x1b, 0x00, 0x17, 0x22, 0xff, 0x08, 0x66, 0xfe, 0xde, 0x20, 0xff, 0x9d, 0xfb, 0xff, 0xab, \n  0x6f, 0xff, 0x8f, 0xb4, 0xfe, 0x46, 0x3e, 0xff, 0xdb, 0xc1, 0xfe, 0xec, 0x9d, 0xff, 0x69, 0xe0, \n  0xff, 0xab, 0x4d, 0xff, 0x80, 0x5a, 0xff, 0x99, 0x4e, 0xff, 0xef, 0xab, 0xff, 0x39, 0x07, 0x00, \n  0xfb, 0x51, 0x00, 0x18, 0x16, 0x00, 0xf3, 0xc8, 0x10, 0xd2, 0x3f, 0x14, 0x08, 0xc2, 0x03, 0xa4, \n  0xc0, 0x04, 0x04, 0xb6, 0x06, 0x94, 0x50, 0xfc, 0x6c, 0x5f, 0xfb, 0x90, 0xab, 0x07, 0x17, 0x23, \n  0x02, 0x57, 0x60, 0xf9, 0xd7, 0xee, 0xfe, 0x47, 0xf7, 0x01, 0xb5, 0xb7, 0x00, 0x9f, 0x91, 0xff, \n  0x08, 0x0a, 0x00, 0x60, 0x68, 0xff, 0x3b, 0x2a, 0xfe, 0x4a, 0xb7, 0xfe, 0x14, 0x30, 0x00, 0x6b, \n  0x50, 0xff, 0xbd, 0x7a, 0xfe, 0x6a, 0xb0, 0xff, 0xe0, 0xbe, 0xfe, 0x22, 0x42, 0xff, 0x7a, 0xf5, \n  0xff, 0x1a, 0x3b, 0xff, 0x6f, 0x4d, 0xff, 0x86, 0x29, 0xff, 0x8e, 0xe7, 0xfe, 0x20, 0x36, 0xff, \n  0x9a, 0xda, 0xff, 0x14, 0x12, 0x00, 0xf9, 0xee, 0x11, 0xbe, 0x6e, 0x15, 0x45, 0xde, 0x03, 0x76, \n  0x7a, 0x05, 0x31, 0xee, 0x06, 0x38, 0xc7, 0xfa, 0xbc, 0x28, 0xfb, 0x76, 0xe7, 0x08, 0x42, 0xed, \n  0x01, 0x26, 0xa0, 0xf8, 0x1f, 0xc7, 0xfe, 0x32, 0xe6, 0x01, 0x93, 0x8e, 0x00, 0xdc, 0x5f, 0xff, \n  0xa0, 0xf5, 0xff, 0x4b, 0x9a, 0xff, 0x2c, 0x03, 0xfe, 0x0a, 0x59, 0xfe, 0x2f, 0x34, 0x00, 0x7a, \n  0x33, 0xff, 0x22, 0x28, 0xfe, 0x77, 0xaa, 0xff, 0x93, 0xee, 0xfe, 0x85, 0x22, 0xff, 0xe1, 0xb4, \n  0xff, 0x80, 0x6e, 0xff, 0x3c, 0x36, 0xff, 0x94, 0xc2, 0xfe, 0xcd, 0xa0, 0xfe, 0x04, 0xf3, 0xfe, \n  0x82, 0x8a, 0xff, 0x60, 0x3c, 0xff, 0x57, 0xf8, 0x12, 0xb2, 0xd8, 0x16, 0xef, 0x35, 0x04, 0xd4, \n  0x77, 0x05, 0x66, 0x65, 0x07, 0xf6, 0x2a, 0xfa, 0xce, 0x92, 0xfa, 0x36, 0x8d, 0x09, 0x7e, 0x0d, \n  0x02, 0x33, 0x4d, 0xf8, 0xa8, 0x8e, 0xfe, 0x70, 0xe1, 0x01, 0xf9, 0x44, 0x00, 0xaf, 0x4f, 0xff, \n  0x37, 0xfa, 0xff, 0x46, 0xa8, 0xff, 0xc3, 0x35, 0xfe, 0xb9, 0xc2, 0xfd, 0x18, 0x2a, 0x00, 0x83, \n  0xa8, 0xff, 0x4e, 0xc5, 0xfd, 0xa1, 0x53, 0xff, 0x70, 0xfe, 0xfe, 0x89, 0x3e, 0xff, 0x5b, 0xb6, \n  0xff, 0x91, 0x63, 0xff, 0xf7, 0x3f, 0xff, 0xfe, 0x80, 0xfe, 0x95, 0x7e, 0xfe, 0x2a, 0xe1, 0xfe, \n  0xda, 0x4e, 0xff, 0x56, 0xd1, 0xfe, 0x26, 0xa8, 0x13, 0x5e, 0xbe, 0x18, 0x18, 0xdf, 0x04, 0xbc, \n  0x54, 0x04, 0x9d, 0x0b, 0x08, 0x53, 0xcb, 0xfa, 0xc3, 0x6f, 0xf9, 0x23, 0x37, 0x09, 0x5a, 0x70, \n  0x02, 0xbc, 0xaa, 0xf8, 0x84, 0x08, 0xfe, 0x97, 0x8b, 0x01, 0x5f, 0x53, 0x00, 0x96, 0x02, 0xff, \n  0xfc, 0x15, 0x00, 0xa0, 0xb4, 0xff, 0x2a, 0x3c, 0xfe, 0x3c, 0x85, 0xfd, 0xd9, 0xd4, 0xff, 0xbc, \n  0xec, 0xff, 0xa2, 0xee, 0xfd, 0x74, 0xcd, 0xfe, 0xea, 0xba, 0xfe, 0xf0, 0x98, 0xff, 0xf7, 0x9f, \n  0xff, 0xeb, 0x09, 0xff, 0xc8, 0x50, 0xff, 0x97, 0x98, 0xfe, 0x0a, 0x69, 0xfe, 0x9d, 0xae, 0xfe, \n  0x7a, 0xd8, 0xfe, 0x46, 0xd7, 0xfe, 0x45, 0x2b, 0x14, 0x62, 0xe5, 0x19, 0xb0, 0x21, 0x06, 0xf0, \n  0xc9, 0x03, 0x5c, 0x22, 0x08, 0xb4, 0xec, 0xfb, 0xde, 0x2f, 0xf8, 0x52, 0x7d, 0x08, 0x04, 0x03, \n  0x03, 0xa2, 0x0d, 0xf9, 0x9a, 0xbe, 0xfd, 0x88, 0xf7, 0x00, 0x2e, 0x66, 0x00, 0x87, 0xe1, 0xfe, \n  0x17, 0xdf, 0xff, 0xbb, 0xdb, 0xff, 0x36, 0x62, 0xfe, 0x77, 0x46, 0xfd, 0xaa, 0x89, 0xff, 0xe0, \n  0x08, 0x00, 0xbf, 0xd1, 0xfd, 0xda, 0xd5, 0xfe, 0xd4, 0x9a, 0xfe, 0x58, 0x49, 0xff, 0x7c, 0xb6, \n  0xff, 0xa7, 0xdd, 0xfe, 0xe9, 0x0a, 0xff, 0xfa, 0xe7, 0xfe, 0x45, 0x27, 0xfe, 0x3e, 0x43, 0xfe, \n  0xe6, 0x0e, 0xff, 0x64, 0xbf, 0xfe, 0xd6, 0x7a, 0x15, 0xef, 0xe9, 0x19, 0xa4, 0xc4, 0x06, 0xfc, \n  0x09, 0x05, 0x7c, 0xf2, 0x07, 0xfe, 0x0d, 0xfc, 0x94, 0xb2, 0xf7, 0x2b, 0x3c, 0x08, 0x34, 0xb1, \n  0x02, 0x39, 0xb0, 0xf9, 0x77, 0xdf, 0xfd, 0x56, 0x3b, 0x00, 0x3c, 0x97, 0x00, 0x21, 0xc7, 0xfe, \n  0x13, 0x73, 0xff, 0x46, 0x32, 0x00, 0x58, 0xe2, 0xfe, 0xca, 0xee, 0xfc, 0xc2, 0x1e, 0xff, 0x4a, \n  0x47, 0x00, 0x32, 0xe7, 0xfd, 0xf6, 0xb0, 0xfe, 0xdc, 0x9b, 0xfe, 0x02, 0x15, 0xff, 0xec, 0x9e, \n  0xff, 0x08, 0xf7, 0xfe, 0x70, 0xfa, 0xfe, 0xfc, 0x93, 0xfe, 0xf2, 0x06, 0xfe, 0x7c, 0x20, 0xfe, \n  0xe0, 0x7e, 0xff, 0xc0, 0xa9, 0xfe, 0x11, 0x9d, 0x17, 0x1b, 0xfe, 0x18, 0x5a, 0x2a, 0x06, 0x3f, \n  0xe6, 0x07, 0xb6, 0xfe, 0x07, 0x57, 0xd7, 0xfa, 0x67, 0xe4, 0xf7, 0xd8, 0x65, 0x08, 0x31, 0x25, \n  0x01, 0x96, 0x8f, 0xfa, 0xc8, 0x8e, 0xfe, 0x73, 0x49, 0xff, 0xc8, 0x6e, 0x00, 0xb2, 0xb9, 0xfe, \n  0x95, 0x1a, 0xff, 0x58, 0x34, 0x00, 0x96, 0x98, 0xff, 0x70, 0x8d, 0xfc, 0xcc, 0x88, 0xfe, 0xe5, \n  0x7e, 0x00, 0xca, 0x4a, 0xfe, 0xb7, 0x26, 0xfe, 0xfb, 0x73, 0xfe, 0x07, 0x3c, 0xff, 0x21, 0x4e, \n  0xff, 0xf7, 0x0c, 0xff, 0xb3, 0xeb, 0xfe, 0xc3, 0x09, 0xfe, 0xd2, 0xc3, 0xfd, 0x86, 0x96, 0xfe, \n  0xdc, 0x4c, 0xff, 0xe7, 0x7a, 0xfe, 0x73, 0xfc, 0x18, 0x37, 0xf7, 0x17, 0x03, 0xcc, 0x05, 0xc4, \n  0x9d, 0x0a, 0xbc, 0xab, 0x09, 0xe9, 0x73, 0xf9, 0x69, 0xf1, 0xf6, 0x26, 0x03, 0x0a, 0xbd, 0x00, \n  0xff, 0x0c, 0x84, 0xfa, 0x71, 0xb8, 0x00, 0xee, 0x84, 0xfe, 0xe3, 0x33, 0xff, 0x01, 0x42, 0xff, \n  0x12, 0x14, 0xff, 0x5b, 0x75, 0xff, 0x6e, 0x0f, 0x01, 0xf7, 0x1e, 0xfc, 0x98, 0xcf, 0xfd, 0xe2, \n  0xff, 0x00, 0x5e, 0x78, 0xfe, 0x93, 0xff, 0xfd, 0x2d, 0x15, 0xfe, 0x8c, 0x78, 0xff, 0x25, 0x25, \n  0xff, 0x01, 0xfa, 0xfe, 0xce, 0xb7, 0xfe, 0xb5, 0x04, 0xfe, 0xf9, 0xc1, 0xfd, 0x50, 0x6f, 0xfe, \n  0x04, 0x23, 0xff, 0xb8, 0x7c, 0xfe, 0xa1, 0xc9, 0x1a, 0x86, 0x46, 0x16, 0xeb, 0xb9, 0x03, 0x2b, \n  0xec, 0x0f, 0x86, 0x3d, 0x0b, 0xc6, 0xce, 0xf5, 0x8c, 0x4a, 0xf8, 0x2e, 0x4c, 0x0c, 0x18, 0xeb, \n  0xfa, 0x75, 0x2d, 0xfa, 0xa5, 0xbd, 0x03, 0x15, 0x2e, 0xfe, 0x58, 0x08, 0xfe, 0xd2, 0xd3, 0xfe, \n  0x22, 0x94, 0xff, 0xc6, 0xac, 0xfe, 0x40, 0xd6, 0x01, 0x4b, 0xca, 0xfc, 0xa3, 0xa9, 0xfc, 0x13, \n  0x1d, 0x01, 0xbf, 0xdd, 0xfe, 0xfd, 0x04, 0xfe, 0x37, 0xf9, 0xfd, 0x6d, 0x76, 0xff, 0x21, 0xca, \n  0xfe, 0x85, 0xea, 0xfe, 0x3f, 0x82, 0xfe, 0xfb, 0x8e, 0xfe, 0x37, 0x85, 0xfd, 0xf3, 0x96, 0xfd, \n  0x72, 0x93, 0xff, 0xec, 0x0b, 0xfe, 0xd9, 0x01, 0x1d, 0xff, 0x3d, 0x16, 0xf0, 0x21, 0x00, 0xe7, \n  0xd3, 0x12, 0x4c, 0xf2, 0x0d, 0x86, 0x8c, 0xf3, 0x79, 0x6c, 0xf9, 0x2d, 0x28, 0x0e, 0x3b, 0xec, \n  0xf6, 0x0e, 0x23, 0xf9, 0x06, 0x1e, 0x07, 0xb0, 0x3d, 0xfe, 0xf3, 0xbd, 0xfc, 0xd7, 0x3f, 0xfe, \n  0x78, 0x68, 0x00, 0xde, 0xe1, 0xfd, 0x70, 0x95, 0x01, 0x13, 0x53, 0xfe, 0xf6, 0xa5, 0xfb, 0x21, \n  0xbb, 0x00, 0xf2, 0x8d, 0xff, 0xa1, 0x01, 0xfe, 0x62, 0xeb, 0xfd, 0xf7, 0x90, 0xff, 0x82, 0xa4, \n  0xfe, 0xed, 0x87, 0xfe, 0xf7, 0x81, 0xfe, 0xb0, 0x83, 0xfe, 0x1d, 0xb1, 0xfd, 0x05, 0x54, 0xfd, \n  0xb8, 0xf5, 0xfe, 0x36, 0xd2, 0xfd, 0xd6, 0x34, 0x20, 0x3a, 0x29, 0x17, 0x69, 0x96, 0xfb, 0xe1, \n  0xcd, 0x12, 0x6f, 0xd9, 0x11, 0x5a, 0xd1, 0xf2, 0xa5, 0xbb, 0xf9, 0x63, 0x7d, 0x0f, 0x83, 0xae, \n  0xf3, 0xc5, 0xc2, 0xf7, 0xf5, 0xdd, 0x09, 0xea, 0xf5, 0xfe, 0xff, 0x53, 0xfb, 0x48, 0x9f, 0xfd, \n  0xfb, 0x4c, 0x01, 0x93, 0x92, 0xfd, 0xd2, 0x34, 0x00, 0x7d, 0xd7, 0xff, 0x21, 0xb0, 0xfb, 0xfe, \n  0x7a, 0xff, 0x1a, 0x73, 0x00, 0xad, 0x05, 0xfe, 0x9e, 0xe1, 0xfd, 0xa6, 0x13, 0x00, 0x77, 0x25, \n  0xfe, 0xfa, 0x63, 0xfe, 0x58, 0x72, 0xfe, 0x69, 0xc2, 0xfd, 0xaf, 0x47, 0xfe, 0x05, 0x66, 0xfd, \n  0x52, 0xae, 0xfd, 0xfb, 0x18, 0xfe, 0x62, 0xa6, 0x23, 0x54, 0x60, 0x18, 0xa4, 0xe8, 0xf6, 0xea, \n  0xfb, 0x11, 0xec, 0xe1, 0x14, 0x3b, 0x44, 0xf3, 0xc0, 0x8a, 0xfa, 0x60, 0x10, 0x10, 0xeb, 0x16, \n  0xf1, 0x5c, 0x08, 0xf6, 0xec, 0xa2, 0x0b, 0xc7, 0xa4, 0x00, 0x11, 0x07, 0xfa, 0x59, 0xa8, 0xfc, \n  0x88, 0x17, 0x02, 0xef, 0xa6, 0xfd, 0xa2, 0xc1, 0xfe, 0xad, 0x4c, 0x00, 0x47, 0xd0, 0xfc, 0x8b, \n  0x1f, 0xfe, 0x27, 0x9d, 0x00, 0x86, 0xa1, 0xfe, 0x5f, 0xd6, 0xfd, 0x3a, 0xb2, 0x00, 0x03, 0xbd, \n  0xfd, 0x4e, 0x1b, 0xfe, 0x78, 0x22, 0xfe, 0x22, 0x66, 0xfd, 0x86, 0x2c, 0xfe, 0xab, 0x62, 0xfd, \n  0xb0, 0x85, 0xfd, 0x99, 0xdd, 0xfd, 0x44, 0x94, 0x26, 0xe8, 0x28, 0x1a, 0x63, 0x92, 0xf3, 0x6c, \n  0xc6, 0x0e, 0xce, 0x95, 0x17, 0xed, 0x7e, 0xf5, 0x2d, 0xab, 0xfa, 0x04, 0x21, 0x11, 0xfe, 0xdf, \n  0xee, 0x3a, 0x1b, 0xf4, 0x5b, 0x5d, 0x0c, 0xe1, 0xd8, 0x02, 0xa8, 0x71, 0xf9, 0xf0, 0x37, 0xfb, \n  0xb6, 0xc1, 0x02, 0x36, 0x0d, 0xfe, 0x8a, 0xa4, 0xfd, 0x7f, 0x9f, 0xff, 0x48, 0x71, 0xfe, 0x68, \n  0x70, 0xfd, 0xc2, 0xde, 0xff, 0x8c, 0xc5, 0xff, 0x0e, 0xd3, 0xfd, 0x33, 0x4e, 0x01, 0xba, 0x9d, \n  0xfd, 0xb5, 0x89, 0xfd, 0xa7, 0xfb, 0xfd, 0x0b, 0x01, 0xfd, 0x7a, 0x9d, 0xfd, 0xa2, 0x89, 0xfd, \n  0xc6, 0x25, 0xfe, 0xc6, 0x61, 0xfd, 0x1d, 0x13, 0x29, 0x17, 0x6a, 0x1c, 0x70, 0x34, 0xf1, 0x0f, \n  0x97, 0x0a, 0x5b, 0xe6, 0x18, 0xcf, 0x89, 0xf8, 0xb9, 0x20, 0xfb, 0x42, 0x62, 0x12, 0xc0, 0xd8, \n  0xec, 0x86, 0x4c, 0xf2, 0x5c, 0x41, 0x0c, 0x24, 0xda, 0x04, 0x74, 0xa3, 0xf9, 0x08, 0xb4, 0xf9, \n  0xae, 0xf1, 0x02, 0x36, 0x99, 0xfe, 0x41, 0x23, 0xfd, 0x08, 0x2c, 0xfe, 0xa7, 0x9d, 0xff, 0xce, \n  0xb7, 0xfd, 0x9b, 0xcb, 0xfe, 0x26, 0xb7, 0x00, 0x70, 0x64, 0xfe, 0xe3, 0x50, 0x01, 0xe1, 0x91, \n  0xfd, 0xa7, 0x66, 0xfd, 0x4f, 0xab, 0xfd, 0xb6, 0x54, 0xfc, 0x51, 0x3e, 0xfd, 0x08, 0x9e, 0xfd, \n  0x65, 0xb4, 0xfe, 0x80, 0x8a, 0xfd, 0x11, 0x8d, 0x2d, 0x4b, 0x8e, 0x1c, 0xc1, 0x5d, 0xee, 0x27, \n  0x1d, 0x09, 0x05, 0xc1, 0x17, 0x23, 0x67, 0xf9, 0xd1, 0x2b, 0xff, 0x1a, 0x79, 0x12, 0xad, 0xae, \n  0xe9, 0x34, 0x55, 0xf2, 0x1c, 0xc6, 0x0b, 0x8c, 0xdb, 0x05, 0xe9, 0xef, 0xf9, 0xa9, 0xe8, 0xf8, \n  0x01, 0xc0, 0x02, 0xbe, 0xc3, 0xfe, 0x41, 0x33, 0xfd, 0xd9, 0xd5, 0xfc, 0xd1, 0xb2, 0xff, 0xab, \n  0x84, 0xfe, 0xa6, 0x4f, 0xfe, 0x9c, 0x0c, 0x01, 0xae, 0x9f, 0xff, 0x16, 0xab, 0x00, 0x50, 0x5b, \n  0xfd, 0x8f, 0xf3, 0xfd, 0x16, 0xdf, 0xfc, 0x6a, 0xea, 0xfb, 0xea, 0xe8, 0xfc, 0x85, 0x75, 0xfd, \n  0xad, 0x3f, 0xff, 0xcb, 0x72, 0xfe, 0x13, 0xe2, 0x30, 0x44, 0x61, 0x1e, 0x70, 0x1c, 0xeb, 0xd7, \n  0x1f, 0x08, 0x09, 0xdb, 0x15, 0x3f, 0xd5, 0xf9, 0x4a, 0x05, 0x03, 0xf6, 0x8c, 0x13, 0xd7, 0x26, \n  0xe7, 0xf8, 0x87, 0xf1, 0xd6, 0xe2, 0x0b, 0x0c, 0x1e, 0x06, 0x15, 0x85, 0xfa, 0x2b, 0xa9, 0xf8, \n  0x91, 0x09, 0x02, 0x92, 0xdc, 0xfe, 0x92, 0x90, 0xfd, 0x25, 0x0c, 0xfc, 0x04, 0xe7, 0xfe, 0xd5, \n  0x29, 0xff, 0x1c, 0xc7, 0xfe, 0x9f, 0x4b, 0x01, 0x33, 0x7c, 0x00, 0x19, 0x00, 0x00, 0xb1, 0x90, \n  0xfd, 0xd8, 0x3c, 0xfe, 0x76, 0x56, 0xfc, 0x03, 0xc8, 0xfb, 0xfd, 0x56, 0xfc, 0xb9, 0x5e, 0xfd, \n  0x70, 0xd1, 0xff, 0x4c, 0x7a, 0xff, 0x3b, 0x20, 0x35, 0xbe, 0xc3, 0x1e, 0x10, 0x57, 0xe8, 0xbf, \n  0xb1, 0x07, 0x83, 0xe3, 0x13, 0xf6, 0x3b, 0xf8, 0x8d, 0x6a, 0x07, 0x42, 0xfd, 0x14, 0xd3, 0x5c, \n  0xe4, 0x92, 0xfc, 0xf0, 0x2e, 0x4c, 0x0c, 0xe6, 0xc0, 0x05, 0x58, 0x74, 0xfa, 0xd4, 0x61, 0xf9, \n  0x09, 0xd8, 0x00, 0x7f, 0x63, 0xfe, 0x27, 0x43, 0xfe, 0x8c, 0x92, 0xfb, 0xb9, 0xe2, 0xfd, 0xe5, \n  0xe5, 0xfe, 0xab, 0xfe, 0xff, 0x28, 0x0d, 0x02, 0x11, 0x16, 0x00, 0x60, 0xc3, 0xff, 0xbb, 0x1c, \n  0xfe, 0x53, 0xe9, 0xfd, 0xc8, 0x35, 0xfc, 0x62, 0x99, 0xfb, 0xbe, 0xac, 0xfb, 0xdb, 0x83, 0xfd, \n  0x53, 0xf5, 0xff, 0x12, 0x69, 0x00, 0xd8, 0xed, 0x37, 0xea, 0x10, 0x21, 0x5b, 0x84, 0xe5, 0x1b, \n  0xfa, 0x06, 0x85, 0x6a, 0x12, 0x3e, 0x78, 0xf6, 0xf3, 0x99, 0x09, 0xc3, 0x34, 0x18, 0x44, 0xbb, \n  0xe2, 0xa5, 0x4f, 0xef, 0xfb, 0x14, 0x0d, 0x59, 0x27, 0x05, 0x5f, 0x73, 0xfa, 0x73, 0x60, 0xfa, \n  0x29, 0xc0, 0xff, 0xc6, 0x53, 0xfd, 0x87, 0x5f, 0xff, 0x13, 0x57, 0xfb, 0x34, 0x0d, 0xfd, 0x14, \n  0x46, 0xfe, 0x73, 0xec, 0x00, 0x29, 0xeb, 0x03, 0xef, 0xb2, 0xfe, 0x85, 0xea, 0xff, 0xed, 0x26, \n  0xff, 0x1c, 0x15, 0xfd, 0x89, 0xb5, 0xfc, 0x45, 0x4e, 0xfb, 0xc7, 0x36, 0xfb, 0x6c, 0x78, 0xfd, \n  0x8f, 0xf6, 0xff, 0xcd, 0xe7, 0x00, 0x90, 0xe5, 0x3a, 0xd0, 0x99, 0x22, 0xc2, 0xae, 0xe3, 0x7d, \n  0xdb, 0x05, 0x0f, 0x9a, 0x11, 0xf0, 0xf5, 0xf3, 0x29, 0x72, 0x0a, 0xfe, 0xcb, 0x1b, 0xab, 0x99, \n  0xe1, 0x80, 0x1f, 0xee, 0x70, 0x41, 0x0d, 0x38, 0x82, 0x04, 0x63, 0x68, 0xfa, 0xa8, 0x67, 0xfb, \n  0x3d, 0xbe, 0xfe, 0x71, 0xfc, 0xfb, 0x2a, 0x77, 0x00, 0xa5, 0xfa, 0xfa, 0x30, 0xe1, 0xfc, 0xac, \n  0x56, 0xfd, 0x72, 0x2b, 0x01, 0xfd, 0x42, 0x06, 0x0f, 0x5a, 0xfd, 0xf4, 0xc3, 0xff, 0x59, 0x8d, \n  0x00, 0xd0, 0x2b, 0xfc, 0x5c, 0x2c, 0xfd, 0x98, 0x73, 0xfb, 0x9e, 0x4e, 0xfa, 0x9b, 0x79, 0xfd, \n  0xd7, 0x83, 0xff, 0xec, 0x00, 0x01, 0x1f, 0x63, 0x3d, 0xa1, 0xec, 0x23, 0x88, 0xeb, 0xe2, 0x8e, \n  0x4b, 0x04, 0x9f, 0x75, 0x11, 0x89, 0x35, 0xf1, 0x51, 0xcb, 0x09, 0xc0, 0x7b, 0x1f, 0x47, 0x51, \n  0xe1, 0xd2, 0xbd, 0xed, 0x75, 0x67, 0x0c, 0x1f, 0xc6, 0x03, 0xc6, 0xf5, 0xfa, 0x62, 0xf8, 0xfb, \n  0x38, 0xc9, 0xfd, 0xcd, 0xfc, 0xfa, 0xd0, 0x21, 0x01, 0x83, 0xa3, 0xfa, 0xb5, 0x59, 0xfd, 0x35, \n  0x68, 0xfc, 0x45, 0xa3, 0x00, 0xe6, 0x55, 0x08, 0x41, 0x23, 0xfd, 0xf8, 0xf1, 0xfe, 0xca, 0x2a, \n  0x02, 0xe9, 0xeb, 0xfb, 0x1d, 0x0e, 0xfd, 0xef, 0x10, 0xfc, 0x39, 0x25, 0xf9, 0x71, 0x2b, 0xfd, \n  0x63, 0xc4, 0xfe, 0xd7, 0xde, 0x00, 0x29, 0x92, 0x3f, 0x0d, 0xdb, 0x24, 0x27, 0x78, 0xe2, 0x6c, \n  0xea, 0x03, 0xbf, 0x5e, 0x10, 0x3f, 0xe4, 0xee, 0xd5, 0x79, 0x08, 0xd0, 0xcb, 0x21, 0x88, 0x25, \n  0xe2, 0x74, 0x2f, 0xee, 0x32, 0x08, 0x0b, 0x68, 0x59, 0x02, 0x46, 0x61, 0xfc, 0xb6, 0x01, 0xfc, \n  0xa8, 0x7b, 0xfc, 0xe7, 0xc4, 0xfa, 0xf8, 0x49, 0x01, 0xdb, 0x67, 0xfa, 0x33, 0x08, 0xfe, 0xd1, \n  0xb8, 0xfb, 0x80, 0xa0, 0xff, 0x45, 0x60, 0x09, 0x4c, 0x2f, 0xfe, 0xcd, 0x18, 0xfe, 0x56, 0x38, \n  0x03, 0x4d, 0xcc, 0xfc, 0x27, 0x2c, 0xfc, 0xd4, 0xa3, 0xfc, 0xd1, 0x04, 0xf8, 0x67, 0x8c, 0xfc, \n  0x90, 0x0f, 0xfe, 0xe6, 0x30, 0x00, 0x3b, 0xaf, 0x41, 0x0c, 0x8a, 0x25, 0xdc, 0x36, 0xe2, 0x6a, \n  0x1e, 0x05, 0x6f, 0xfc, 0x0d, 0x77, 0x25, 0xed, 0x50, 0x54, 0x07, 0xfb, 0x32, 0x22, 0xf2, 0x68, \n  0xe4, 0xfb, 0x0b, 0xef, 0x11, 0x3b, 0x09, 0x1d, 0xc9, 0x00, 0x59, 0x5e, 0xfe, 0x69, 0xea, 0xfb, \n  0x38, 0xff, 0xfa, 0x4d, 0x35, 0xfb, 0x8d, 0xb2, 0x01, 0xe8, 0xf8, 0xf9, 0x06, 0xe6, 0xfe, 0xa1, \n  0x88, 0xfb, 0x1c, 0x54, 0xfe, 0x91, 0x3b, 0x09, 0xda, 0x4c, 0x00, 0xe0, 0x43, 0xfe, 0xf3, 0xf8, \n  0x02, 0x2d, 0xbc, 0xfe, 0x5c, 0x0b, 0xfb, 0xac, 0x48, 0xfc, 0xda, 0xcc, 0xf7, 0x6d, 0xdd, 0xfb, \n  0x30, 0x0f, 0xfd, 0xb4, 0x97, 0xff, 0xf0, 0xe1, 0x40, 0x18, 0x57, 0x28, 0xaf, 0x3a, 0xe4, 0x4a, \n  0x4a, 0x03, 0x81, 0xa5, 0x0d, 0x49, 0xc1, 0xeb, 0x25, 0xb0, 0x03, 0xe2, 0xcb, 0x22, 0xdd, 0x14, \n  0xe8, 0x88, 0x7c, 0xef, 0xb5, 0x96, 0x06, 0xd8, 0xe6, 0xff, 0x6d, 0xf9, 0xff, 0x91, 0xb1, 0xfb, \n  0x17, 0x0b, 0xfa, 0xd3, 0x47, 0xfb, 0xf0, 0xa9, 0x02, 0xf4, 0x51, 0xf9, 0xcd, 0x2d, 0xff, 0xa6, \n  0x85, 0xfc, 0xaa, 0x42, 0xfc, 0xbc, 0xb4, 0x07, 0xf8, 0xad, 0x03, 0xe5, 0x22, 0xff, 0xed, 0x6f, \n  0x01, 0x92, 0xfd, 0x00, 0x85, 0xae, 0xf9, 0x5c, 0xd3, 0xfb, 0x5f, 0x5b, 0xf8, 0x43, 0x7c, 0xfa, \n  0x71, 0xda, 0xfc, 0xc3, 0x62, 0xfe, 0xc6, 0xda, 0x3d, 0xbc, 0x26, 0x2c, 0x67, 0xf0, 0xe8, 0xfa, \n  0x55, 0xff, 0xe0, 0x16, 0x0e, 0x30, 0xf4, 0xeb, 0x91, 0x5d, 0xfd, 0x3d, 0x32, 0x23, 0xda, 0x89, \n  0xed, 0x77, 0xc6, 0xee, 0x72, 0xa2, 0x04, 0x75, 0xd3, 0xfe, 0x03, 0xe5, 0x00, 0x64, 0x60, 0xfc, \n  0x16, 0x1b, 0xf9, 0x2a, 0xac, 0xfb, 0x71, 0x4d, 0x03, 0x91, 0xf8, 0xf8, 0x46, 0x37, 0xff, 0x88, \n  0xa3, 0xfd, 0xd7, 0xf3, 0xfa, 0x15, 0x1e, 0x05, 0x45, 0x7d, 0x06, 0xee, 0x63, 0x01, 0x97, 0xff, \n  0xfe, 0xfc, 0xff, 0x01, 0xa2, 0x42, 0xfa, 0xfb, 0xd7, 0xfa, 0xb7, 0xf0, 0xf8, 0x55, 0xf4, 0xf9, \n  0x58, 0x8a, 0xfc, 0x18, 0x77, 0xfd, 0xef, 0x32, 0x3c, 0x6c, 0xc4, 0x2d, 0x17, 0xe3, 0xec, 0x4c, \n  0xfd, 0xfe, 0xa9, 0xaa, 0x0b, 0x9a, 0x2f, 0xed, 0x6d, 0x7f, 0xf8, 0xa7, 0xdd, 0x20, 0xa4, 0xcc, \n  0xf3, 0x35, 0xcd, 0xed, 0xd2, 0xc8, 0x03, 0x8c, 0x6f, 0xfd, 0xf7, 0x15, 0x01, 0x18, 0xf6, 0xfd, \n  0x82, 0x80, 0xf8, 0xb6, 0xec, 0xfb, 0x7c, 0xc9, 0x03, 0x92, 0xc0, 0xf8, 0x1c, 0x52, 0xff, 0x68, \n  0xa7, 0xfe, 0x07, 0x81, 0xfa, 0xfd, 0x5a, 0x03, 0x72, 0x5a, 0x06, 0x6a, 0xe3, 0x03, 0x16, 0xb7, \n  0xfd, 0x90, 0xd9, 0x01, 0xa6, 0xcd, 0xfb, 0xdf, 0x24, 0xfa, 0xb7, 0x83, 0xf9, 0x46, 0x0a, 0xfa, \n  0xd7, 0xc6, 0xfc, 0x86, 0x9b, 0xfc, 0x4f, 0xad, 0x3c, 0x89, 0x4d, 0x2d, 0xef, 0xb3, 0xed, 0x3c, \n  0x0a, 0x04, 0x3c, 0xb0, 0x06, 0xd5, 0x9d, 0xec, 0x82, 0x0a, 0xf8, 0xd4, 0x8f, 0x1b, 0x7f, 0xb7, \n  0xf8, 0x4d, 0xc6, 0xee, 0x08, 0x3f, 0x02, 0xd5, 0x23, 0xfc, 0x9f, 0xf2, 0x01, 0x26, 0xa0, 0xfe, \n  0x84, 0x41, 0xf9, 0xe9, 0x98, 0xfb, 0x95, 0x89, 0x03, 0x79, 0xd5, 0xf9, 0xe4, 0x70, 0xfe, 0xa3, \n  0x5c, 0x00, 0xb0, 0xa4, 0xfa, 0x77, 0xce, 0x01, 0x0b, 0x9d, 0x03, 0xdf, 0x87, 0x05, 0xbe, 0x4e, \n  0xff, 0x7d, 0x25, 0x00, 0x7a, 0xf2, 0xfd, 0x31, 0x2b, 0xfa, 0xb7, 0x92, 0xf9, 0xf4, 0x89, 0xfb, \n  0x29, 0x9c, 0xfc, 0xd0, 0xd4, 0xfa, 0xf8, 0xd9, 0x3c, 0xf3, 0x10, 0x2d, 0x5e, 0x79, 0xed, 0xf0, \n  0x2a, 0x0a, 0x5f, 0x31, 0x02, 0x62, 0x85, 0xea, 0x95, 0x87, 0xf9, 0xb7, 0x24, 0x15, 0x14, 0xa9, \n  0xfc, 0xa7, 0x1e, 0xf1, 0xde, 0x69, 0xff, 0x99, 0xe7, 0xfb, 0x35, 0x74, 0x03, 0x4b, 0x2a, 0xfe, \n  0xa6, 0xf8, 0xfa, 0x6d, 0xd7, 0xfa, 0xd8, 0x75, 0x02, 0x0c, 0x89, 0xfc, 0x8c, 0xbf, 0xfc, 0xff, \n  0x23, 0x02, 0x1e, 0x2a, 0xfb, 0x63, 0xa5, 0xfe, 0xb7, 0x89, 0x01, 0xe3, 0xe9, 0x05, 0x6a, 0xb6, \n  0x01, 0x53, 0x07, 0x00, 0x32, 0x58, 0xfe, 0x77, 0xc9, 0xfb, 0xa3, 0x59, 0xfa, 0xe5, 0x53, 0xfb, \n  0x0d, 0x85, 0xfc, 0x70, 0x8e, 0xfa, 0xa1, 0x6b, 0x3c, 0xaf, 0xa8, 0x2c, 0xf6, 0x58, 0xee, 0xfc, \n  0x48, 0x0e, 0x80, 0x74, 0xff, 0x9d, 0x35, 0xe8, 0xec, 0x7e, 0xfa, 0xef, 0x2f, 0x0f, 0x26, 0xa2, \n  0xff, 0xfd, 0x09, 0xf4, 0x38, 0x0a, 0xfc, 0x06, 0xbf, 0xfc, 0xcf, 0x33, 0x05, 0x19, 0xd5, 0xfc, \n  0x42, 0xb2, 0xfc, 0xd0, 0xd7, 0xfa, 0xd9, 0x57, 0x00, 0xed, 0x5c, 0x00, 0xc5, 0x54, 0xfb, 0xc0, \n  0xfd, 0x00, 0x69, 0xf1, 0xfc, 0x30, 0x2d, 0xfc, 0x5c, 0x38, 0xff, 0xc5, 0xeb, 0x05, 0x12, 0xad, \n  0x03, 0xa1, 0x46, 0x01, 0x2d, 0xe0, 0xfe, 0xa2, 0x38, 0xfd, 0x07, 0x7a, 0xfa, 0x2d, 0x0c, 0xfb, \n  0x7d, 0x50, 0xfd, 0x0b, 0x7f, 0xfa, 0x86, 0xba, 0x3a, 0x5e, 0xaf, 0x2c, 0x18, 0xcf, 0xf0, 0xd3, \n  0x9c, 0x0f, 0x72, 0xa8, 0xfe, 0x26, 0x74, 0xe7, 0x31, 0x1f, 0xf9, 0x8c, 0x69, 0x0a, 0xbd, 0x6f, \n  0x02, 0x5d, 0x4a, 0xf6, 0x1b, 0xdb, 0xf9, 0x3e, 0xc0, 0xfd, 0x7f, 0x8e, 0x06, 0x52, 0x19, 0xfc, \n  0x8a, 0x30, 0xfd, 0xb7, 0x2f, 0xfc, 0x87, 0xcc, 0xfe, 0x14, 0x9d, 0x01, 0xe0, 0x86, 0xfb, 0x5e, \n  0x4c, 0xfe, 0x98, 0xf2, 0xfd, 0xed, 0x37, 0xfd, 0x6e, 0xc4, 0xfc, 0xb6, 0x4a, 0x04, 0x10, 0x37, \n  0x05, 0x34, 0xf0, 0x04, 0x27, 0x23, 0xfe, 0x77, 0xbe, 0xfc, 0xce, 0x50, 0xfd, 0x69, 0x55, 0xfa, \n  0x87, 0xd6, 0xfc, 0xc8, 0x32, 0xfb, 0x40, 0xc7, 0x38, 0xf7, 0x95, 0x2c, 0xdb, 0x4c, 0xf3, 0x0d, \n  0x41, 0x10, 0x38, 0x4f, 0xfe, 0xe5, 0x04, 0xe8, 0xdd, 0x02, 0xf7, 0x37, 0x9a, 0x05, 0x4a, 0x9f, \n  0x05, 0x25, 0x7c, 0xf8, 0x05, 0xc2, 0xf7, 0xc6, 0xa0, 0xff, 0x17, 0x01, 0x07, 0xba, 0xc5, 0xfb, \n  0x95, 0x48, 0xfe, 0x9c, 0xb2, 0xfc, 0x7c, 0x8e, 0xfd, 0x9c, 0x96, 0x01, 0x39, 0x92, 0xfb, 0x3f, \n  0xae, 0xfc, 0x4b, 0x3e, 0xfe, 0x4b, 0xde, 0xff, 0xf4, 0xf4, 0xfa, 0xe4, 0x85, 0x03, 0x52, 0x6c, \n  0x05, 0xde, 0x78, 0x05, 0x78, 0xb8, 0x00, 0xd2, 0x11, 0xfc, 0x09, 0x90, 0xfe, 0x3f, 0x71, 0xfa, \n  0x06, 0xef, 0xfc, 0x3f, 0xa2, 0xfb, 0xcd, 0x9f, 0x38, 0x12, 0x88, 0x29, 0x4e, 0x0f, 0xf6, 0xe2, \n  0x3c, 0x11, 0x02, 0x8f, 0xfc, 0x7f, 0x33, 0xea, 0xab, 0x7f, 0xf4, 0xd9, 0x3e, 0x01, 0xa9, 0x49, \n  0x08, 0x1d, 0x22, 0xfb, 0xbf, 0x8d, 0xf5, 0x52, 0x20, 0x01, 0x8e, 0x73, 0x08, 0xd3, 0x15, 0xfb, \n  0x39, 0x6e, 0xfe, 0x1a, 0x58, 0xfc, 0x51, 0x65, 0xfd, 0xff, 0x2f, 0x00, 0xa2, 0x32, 0xfb, 0xef, \n  0xfe, 0xfd, 0x99, 0xf2, 0xfc, 0x8a, 0x4c, 0x01, 0x08, 0xef, 0xfd, 0x98, 0x5f, 0x01, 0x46, 0xd9, \n  0x02, 0x7e, 0x91, 0x05, 0xef, 0x3c, 0x04, 0xf0, 0xc2, 0xfb, 0xb9, 0x57, 0xfd, 0x16, 0x0a, 0xfd, \n  0xa8, 0xce, 0xfc, 0xed, 0x34, 0xfb, 0xa3, 0xe1, 0x35, 0xce, 0x27, 0x28, 0x95, 0x31, 0xfa, 0x47, \n  0x34, 0x10, 0xa3, 0x57, 0xfb, 0xce, 0x31, 0xef, 0x0c, 0xfd, 0xef, 0x4f, 0x56, 0xfc, 0x97, 0x3f, \n  0x0d, 0x55, 0x7d, 0xfc, 0x22, 0x59, 0xf3, 0xc5, 0xdd, 0x03, 0xa1, 0x4f, 0x08, 0xde, 0x8e, 0xfa, \n  0x9b, 0x0a, 0xff, 0x62, 0x3e, 0xfa, 0x3c, 0xba, 0xfd, 0xbe, 0xf6, 0x00, 0x83, 0xcc, 0xf8, 0x9d, \n  0xeb, 0xff, 0x87, 0x91, 0xfe, 0x57, 0xbf, 0xff, 0x55, 0x33, 0x01, 0x4c, 0xef, 0x00, 0x20, 0xf9, \n  0xff, 0xda, 0xd3, 0x04, 0x21, 0x21, 0x04, 0xf7, 0x98, 0xfe, 0x73, 0x9e, 0xfd, 0x5b, 0xd5, 0xfc, \n  0x8d, 0x53, 0xfe, 0x5b, 0x13, 0xfb, 0xca, 0x2d, 0x35, 0x90, 0x0a, 0x25, 0xf5, 0x29, 0xfd, 0xbd, \n  0x9b, 0x0f, 0x06, 0x51, 0xf8, 0x63, 0xf6, 0xf4, 0xb5, 0xcb, 0xee, 0x13, 0x06, 0xf6, 0x04, 0xee, \n  0x10, 0x34, 0xd5, 0xff, 0x39, 0x39, 0xf1, 0x6d, 0x34, 0x05, 0xe8, 0x6f, 0x08, 0x8d, 0x75, 0xf9, \n  0xe4, 0xa4, 0xfe, 0x38, 0x71, 0xf9, 0x03, 0xe0, 0xfe, 0x43, 0x7a, 0x00, 0xe2, 0xdc, 0xf7, 0x48, \n  0xf7, 0x01, 0xbf, 0x68, 0x00, 0xb8, 0xd2, 0xfd, 0xfa, 0x57, 0x02, 0x71, 0xe5, 0x02, 0x74, 0x31, \n  0xfe, 0xe1, 0x6e, 0x02, 0x49, 0x90, 0x02, 0x79, 0x1d, 0x01, 0x6f, 0xcf, 0xff, 0x79, 0xeb, 0xfb, \n  0xea, 0x4c, 0xff, 0x74, 0x4f, 0xfc, 0x58, 0x19, 0x38, 0xe2, 0x67, 0x21, 0xcc, 0xfd, 0xf8, 0xfb, \n  0x09, 0x13, 0xf9, 0xff, 0xf6, 0xdc, 0x5a, 0xf4, 0xce, 0x29, 0xf1, 0xc5, 0x8f, 0xf5, 0x14, 0xe3, \n  0x0f, 0xe4, 0x56, 0x01, 0xd0, 0xc4, 0xf2, 0x78, 0x45, 0x04, 0x25, 0x56, 0x08, 0x34, 0x52, 0xf8, \n  0xe6, 0xbc, 0xfd, 0x2c, 0x90, 0xfa, 0x64, 0x2b, 0xff, 0xef, 0xec, 0x00, 0xa5, 0x42, 0xf8, 0x6b, \n  0xe6, 0x01, 0x77, 0x3a, 0x01, 0x2b, 0xf3, 0xfe, 0x84, 0x3f, 0x02, 0x46, 0x84, 0x02, 0x89, 0x6d, \n  0xfe, 0x6f, 0xbe, 0x00, 0xae, 0xd4, 0x01, 0xca, 0xa7, 0x00, 0x97, 0x5f, 0x01, 0x54, 0x1e, 0xfe, \n  0x7b, 0xc9, 0xfd, 0xf2, 0x40, 0xfe, 0x44, 0xcb, 0x3a, 0x4a, 0x9a, 0x1c, 0x9a, 0x6a, 0xf3, 0x45, \n  0xa7, 0x19, 0x7f, 0xf4, 0xf5, 0xea, 0x99, 0xef, 0x73, 0x09, 0xf6, 0x1c, 0x71, 0xf7, 0xdb, 0x96, \n  0x0c, 0xe3, 0x94, 0x02, 0x57, 0x51, 0xf3, 0xd9, 0x39, 0x02, 0x52, 0x7c, 0x09, 0x7f, 0xd7, 0xf7, \n  0xfc, 0x89, 0xfb, 0xfb, 0x98, 0xfc, 0xec, 0x30, 0x00, 0x53, 0xbc, 0x00, 0x20, 0xeb, 0xf8, 0x62, \n  0xd2, 0x00, 0xb6, 0xbb, 0x01, 0xb9, 0x8f, 0x00, 0xbe, 0x22, 0x01, 0xce, 0xc8, 0x01, 0x21, 0x4b, \n  0xff, 0x04, 0x76, 0xff, 0xa1, 0x22, 0x01, 0x4c, 0x50, 0x00, 0x68, 0xd8, 0x00, 0xf7, 0xbd, 0x00, \n  0x17, 0xa1, 0xfd, 0xa9, 0x0c, 0xfe, 0x01, 0xdf, 0x39, 0x35, 0x82, 0x18, 0x89, 0x0f, 0xf0, 0xa1, \n  0x99, 0x20, 0x60, 0xf0, 0xf6, 0x27, 0xc8, 0xe9, 0xa3, 0x1d, 0xfa, 0xdb, 0x60, 0xfc, 0xed, 0x1c, \n  0x08, 0xf9, 0x9a, 0x00, 0x03, 0x3f, 0xf6, 0x16, 0x7d, 0x00, 0xad, 0x7d, 0x09, 0x1a, 0x84, 0xf8, \n  0x91, 0xa0, 0xfa, 0x35, 0xb5, 0xfe, 0x63, 0x0d, 0x00, 0x05, 0xe5, 0xff, 0xfd, 0x76, 0xfa, 0x54, \n  0x3c, 0x01, 0xa0, 0x62, 0x00, 0xc8, 0xe5, 0x00, 0x38, 0xa8, 0x01, 0xa2, 0x6c, 0x01, 0x44, 0x10, \n  0xff, 0xdb, 0x1b, 0x00, 0xc3, 0xf3, 0xff, 0x0e, 0x4a, 0xff, 0x0f, 0x2d, 0x02, 0xa1, 0x4d, 0x00, \n  0x17, 0xf5, 0xfe, 0xbc, 0xe6, 0xfe, 0x98, 0x40, 0x38, 0xde, 0xe9, 0x14, 0x0f, 0xf1, 0xee, 0xbf, \n  0xcf, 0x24, 0x72, 0x51, 0xf7, 0x80, 0xd7, 0xe5, 0x26, 0x24, 0xff, 0x66, 0x27, 0xfe, 0x52, 0xe4, \n  0x02, 0x46, 0x99, 0x01, 0x61, 0x19, 0xf8, 0xbc, 0x04, 0xfe, 0x5e, 0x8d, 0x09, 0x15, 0x87, 0xfa, \n  0x97, 0x60, 0xfa, 0x81, 0xef, 0xff, 0xd9, 0x19, 0x00, 0x62, 0x80, 0xfe, 0xb0, 0x3e, 0xfc, 0x15, \n  0x75, 0x01, 0x31, 0x05, 0xff, 0xa6, 0xa4, 0x00, 0xd4, 0x1d, 0x02, 0x63, 0x4a, 0x01, 0x24, 0xc2, \n  0xfe, 0xc1, 0x4e, 0x00, 0x64, 0x30, 0x00, 0xbb, 0x2d, 0xff, 0x84, 0xa0, 0x01, 0x63, 0x59, 0x00, \n  0x15, 0x50, 0xff, 0x54, 0xfc, 0xff, 0x7f, 0xe7, 0x34, 0xb7, 0xdb, 0x13, 0x07, 0x67, 0xef, 0x17, \n  0xda, 0x22, 0xf3, 0xce, 0xf8, 0xea, 0x33, 0xe9, 0x67, 0x6a, 0x00, 0x1c, 0xf7, 0xfb, 0x57, 0x58, \n  0x01, 0xb8, 0x1d, 0x02, 0x9f, 0xa2, 0xf9, 0xe2, 0xdd, 0xfc, 0xa7, 0xf1, 0x08, 0xa5, 0x6c, 0xfc, \n  0x0f, 0xb6, 0xfa, 0x7c, 0x5b, 0x00, 0xd3, 0xe9, 0xff, 0xcd, 0x62, 0xfe, 0x70, 0xa4, 0xfc, 0x30, \n  0xd9, 0x00, 0xe6, 0xa2, 0xff, 0x70, 0xa6, 0x00, 0x71, 0xf7, 0x00, 0xe6, 0x82, 0x01, 0x4e, 0x0f, \n  0xff, 0xd6, 0xe2, 0xff, 0xfa, 0x57, 0x01, 0xd6, 0xcf, 0xff, 0x1d, 0xf6, 0xff, 0xac, 0x33, 0x00, \n  0xcc, 0xc9, 0xff, 0xd8, 0xe2, 0xff, 0x38, 0x69, 0x30, 0x91, 0x78, 0x13, 0x0d, 0xe3, 0xf0, 0x71, \n  0xec, 0x1f, 0x83, 0x14, 0xfc, 0x2f, 0xf9, 0xea, 0x1d, 0x8f, 0xff, 0x90, 0x22, 0xfd, 0x91, 0x3a, \n  0xff, 0x7d, 0x2b, 0x01, 0xcd, 0x1c, 0xfc, 0xa4, 0xe2, 0xfc, 0x16, 0x69, 0x07, 0x15, 0x38, 0xfe, \n  0x62, 0x96, 0xfb, 0x63, 0x68, 0xff, 0xbc, 0x86, 0x00, 0xa2, 0xcb, 0xfe, 0xb6, 0xf7, 0xfb, 0xc9, \n  0x70, 0x00, 0x70, 0xa3, 0x00, 0xc6, 0x84, 0x00, 0x58, 0x02, 0x00, 0x7d, 0x1b, 0x01, 0x76, 0x92, \n  0xff, 0xbd, 0xb3, 0x00, 0x48, 0x6b, 0x01, 0xdf, 0xf6, 0xff, 0x34, 0x9e, 0xff, 0xa7, 0x6d, 0xff, \n  0x08, 0x0a, 0x00, 0x0d, 0xad, 0xff, 0x1e, 0xa2, 0x26, 0x09, 0x0e, 0x16, 0x91, 0xc7, 0xfd, 0x6b, \n  0x44, 0x0f, 0xad, 0xd8, 0xf8, 0xd2, 0x48, 0xf9, 0xa5, 0x83, 0xfb, 0x45, 0x50, 0xfb, 0x26, 0xb2, \n  0x04, 0xeb, 0xe9, 0xff, 0xe3, 0x78, 0xf9, 0xd5, 0x9c, 0x02, 0x71, 0xa4, 0x05, 0xbd, 0x6d, 0xfc, \n  0x04, 0xda, 0xfd, 0xf5, 0xdd, 0xfc, 0x48, 0x83, 0x00, 0x2c, 0x23, 0xff, 0xdc, 0x9e, 0xfb, 0x99, \n  0xf6, 0x00, 0xd2, 0x34, 0xff, 0xcb, 0xf3, 0xfe, 0xfd, 0xcf, 0x00, 0x3a, 0x20, 0x01, 0x7c, 0xa7, \n  0x01, 0xc7, 0x0e, 0x03, 0xdc, 0x52, 0xff, 0x5a, 0xef, 0xfd, 0x39, 0x4e, 0xff, 0xd7, 0x40, 0xfe, \n  0x69, 0x70, 0xff, 0x9c, 0xf5, 0x00, 0xff, 0x80, 0x21, 0x65, 0xbb, 0x15, 0x91, 0xa3, 0xfe, 0x99, \n  0xd9, 0x0d, 0x0a, 0x42, 0xfc, 0x28, 0x79, 0xf8, 0xf1, 0x74, 0xfc, 0xd8, 0x6a, 0xfc, 0xa2, 0x8c, \n  0x02, 0xd7, 0x41, 0x00, 0x27, 0xd5, 0xfa, 0x66, 0xff, 0x01, 0x16, 0xf6, 0x04, 0xf4, 0x7c, 0xfd, \n  0x54, 0xc1, 0xfd, 0x09, 0x25, 0xfd, 0x18, 0x97, 0x00, 0x1b, 0xc0, 0xfe, 0x31, 0xf6, 0xfb, 0x39, \n  0xfd, 0x00, 0x84, 0xdf, 0xfe, 0xed, 0xcc, 0xfe, 0x73, 0x46, 0x01, 0xad, 0x12, 0x01, 0x3f, 0x68, \n  0x01, 0xc7, 0x32, 0x02, 0xde, 0x23, 0xff, 0xc3, 0x15, 0xff, 0xa1, 0x5f, 0xff, 0xa2, 0xfc, 0xfd, \n  0x86, 0xd9, 0xff, 0x73, 0xec, 0x00, 0xb9, 0x45, 0x1d, 0x08, 0xf1, 0x14, 0x08, 0x9d, 0xff, 0x1c, \n  0x9b, 0x0d, 0x04, 0xd0, 0xfd, 0x8f, 0x2d, 0xf8, 0x54, 0xf1, 0xfd, 0x77, 0xc0, 0xfc, 0x05, 0x7a, \n  0x01, 0xe2, 0x59, 0x00, 0xb9, 0x1a, 0xfc, 0x13, 0xe8, 0x01, 0x9e, 0x1f, 0x04, 0x49, 0x52, 0xfe, \n  0xf5, 0x1c, 0xfe, 0x1e, 0xbe, 0xfd, 0xc9, 0x33, 0x00, 0x2f, 0xa1, 0xfe, 0xc1, 0xe2, 0xfc, 0x85, \n  0x9a, 0x00, 0x63, 0xba, 0xfe, 0x8e, 0x3c, 0xff, 0xcb, 0x2c, 0x01, 0x00, 0x29, 0x01, 0xf9, 0x7b, \n  0x01, 0xde, 0x28, 0x01, 0xae, 0x3a, 0xff, 0x7f, 0x2b, 0x00, 0x8c, 0x9a, 0xff, 0xdf, 0x1d, 0xfe, \n  0x75, 0x08, 0x00, 0xcf, 0x29, 0x01, 0xd7, 0x0a, 0x19, 0xb3, 0x6e, 0x13, 0x0d, 0x12, 0x02, 0xc4, \n  0xaf, 0x0c, 0xe5, 0xff, 0xfd, 0x2d, 0xe8, 0xf9, 0xb3, 0x4b, 0xfe, 0x3a, 0xba, 0xfc, 0xfc, 0x7b, \n  0x01, 0xf4, 0x36, 0x00, 0x0f, 0xde, 0xfc, 0xf8, 0xc2, 0x01, 0x3b, 0xb9, 0x03, 0xaa, 0xb1, 0xfe, \n  0xf7, 0x6f, 0xfe, 0xdb, 0x69, 0xfe, 0xe2, 0xba, 0xff, 0x0c, 0xbe, 0xfe, 0xfd, 0x6c, 0xfd, 0xfe, \n  0x3f, 0x00, 0xe4, 0x17, 0xff, 0x40, 0x67, 0xff, 0x17, 0xde, 0x00, 0x0d, 0x4a, 0x01, 0x24, 0x47, \n  0x01, 0x86, 0x77, 0x00, 0x7c, 0xe5, 0xff, 0x1a, 0xb9, 0x00, 0xdb, 0xe7, 0xff, 0x06, 0xc1, 0xfe, \n  0x50, 0xf4, 0xff, 0x74, 0x78, 0x01, 0x12, 0xa2, 0x14, 0x35, 0x18, 0x12, 0xa9, 0x19, 0x05, 0x01, \n  0xbd, 0x0a, 0x61, 0x7c, 0xfe, 0xa9, 0x8a, 0xfc, 0x39, 0xdb, 0xfd, 0x4e, 0x8a, 0xfc, 0x00, 0xf4, \n  0x01, 0xd7, 0x7b, 0x00, 0xc5, 0xf9, 0xfc, 0xeb, 0x9e, 0x01, 0x8e, 0x79, 0x03, 0xff, 0xee, 0xfe, \n  0x50, 0x24, 0xff, 0xab, 0x9e, 0xfe, 0x17, 0x4d, 0xff, 0xde, 0x14, 0xff, 0x0c, 0x01, 0xfe, 0x4b, \n  0xf8, 0xff, 0x54, 0x3c, 0xff, 0x91, 0xa5, 0xff, 0xd5, 0x97, 0x00, 0xa9, 0x47, 0x01, 0xd6, 0xe6, \n  0x00, 0x67, 0x8b, 0x00, 0xdc, 0xc1, 0x00, 0x33, 0x22, 0x01, 0x30, 0x5f, 0x00, 0xc0, 0xff, 0xfe, \n  0x1c, 0x23, 0x00, 0x3d, 0x3a, 0x01, 0x9a, 0x4f, 0x10, 0xcb, 0x95, 0x10, 0x0c, 0xcc, 0x07, 0xc8, \n  0x50, 0x09, 0xa1, 0x50, 0xff, 0x2f, 0x9b, 0xfe, 0x95, 0x72, 0xfd, 0xf6, 0x79, 0xfc, 0x35, 0x85, \n  0x02, 0x10, 0xbf, 0x00, 0x5d, 0xfd, 0xfc, 0xaa, 0x3a, 0x01, 0x06, 0x25, 0x03, 0xe5, 0xee, 0xff, \n  0xba, 0x77, 0xff, 0x1e, 0x14, 0xfe, 0x2a, 0x80, 0xff, 0x48, 0xe5, 0xff, 0x63, 0x0d, 0xfe, 0xa0, \n  0x9c, 0xff, 0x58, 0x93, 0xff, 0x0c, 0x8f, 0xff, 0x75, 0xc8, 0x00, 0x84, 0x3d, 0x01, 0x22, 0x83, \n  0x00, 0xab, 0x41, 0x01, 0x08, 0xc3, 0x01, 0xcf, 0x86, 0x01, 0x43, 0x22, 0x00, 0x55, 0x05, 0xff, \n  0x05, 0x50, 0x00, 0x4f, 0xa0, 0x00, 0xc6, 0xd5, 0x0d, 0x10, 0x7e, 0x0f, 0xe1, 0x51, 0x08, 0x1a, \n  0x1b, 0x08, 0xbe, 0x03, 0x00, 0x4f, 0x94, 0xff, 0x56, 0xfe, 0xfd, 0xc0, 0xe9, 0xfc, 0xc2, 0x0e, \n  0x02, 0x5c, 0xde, 0x00, 0xf2, 0xc0, 0xfd, 0x3a, 0xfb, 0x00, 0xc1, 0x76, 0x02, 0xb6, 0x79, 0x00, \n  0x15, 0xb5, 0xff, 0x90, 0xe0, 0xfd, 0x97, 0xf1, 0xff, 0xe4, 0x46, 0x00, 0xa0, 0xe4, 0xfd, 0xbb, \n  0x77, 0xff, 0x98, 0xe0, 0xff, 0xbe, 0xd8, 0xff, 0xce, 0xf4, 0x00, 0x79, 0x31, 0x01, 0x4f, 0xe9, \n  0x00, 0x3c, 0x26, 0x02, 0xa7, 0x3e, 0x02, 0xef, 0x05, 0x01, 0xc4, 0x6a, 0xff, 0x3e, 0x2d, 0xff, \n  0xed, 0x15, 0x00, 0x08, 0x4d, 0x00, 0x7c, 0x2f, 0x0c, 0xb6, 0x3f, 0x0e, 0x1a, 0x60, 0x08, 0x9d, \n  0x8e, 0x07, 0xd8, 0x21, 0x00, 0x2b, 0x79, 0x00, 0x31, 0xf7, 0xfe, 0xb9, 0xe9, 0xfc, 0x8c, 0xb8, \n  0x01, 0x07, 0x66, 0x01, 0xf2, 0x7d, 0xfe, 0x21, 0x68, 0x00, 0x09, 0xfe, 0x01, 0xf4, 0x3e, 0x01, \n  0x92, 0xd2, 0xff, 0x7f, 0xf1, 0xfd, 0x55, 0x59, 0x00, 0x35, 0x3b, 0x00, 0x3c, 0x06, 0xfe, 0x06, \n  0xf3, 0xff, 0xbe, 0xf3, 0xff, 0x19, 0x62, 0x00, 0xba, 0xd1, 0x01, 0xb6, 0x5b, 0x01, 0xf2, 0x5e, \n  0x01, 0x44, 0x75, 0x02, 0x87, 0xb7, 0x01, 0xbb, 0x34, 0x00, 0xda, 0x38, 0xff, 0xf6, 0x2b, 0xff, \n  0x6b, 0x44, 0x00, 0x21, 0x89, 0x00, 0x59, 0x07, 0x0b, 0xd5, 0xbe, 0x0c, 0x06, 0xe5, 0x07, 0x9e, \n  0xa1, 0x07, 0x62, 0x95, 0x00, 0xf9, 0x7b, 0x00, 0x11, 0x15, 0xff, 0xa2, 0xac, 0xfd, 0x09, 0xe8, \n  0x01, 0xde, 0x26, 0x01, 0xc1, 0x78, 0xfe, 0x26, 0x60, 0x00, 0x25, 0x23, 0x02, 0xef, 0x52, 0x01, \n  0x7c, 0x98, 0xff, 0x52, 0x1a, 0xfe, 0xc9, 0xaf, 0x00, 0x5f, 0x46, 0x00, 0x38, 0x2e, 0xfe, 0x02, \n  0x67, 0x00, 0x41, 0xa7, 0x00, 0x1b, 0x67, 0x01, 0x19, 0x06, 0x02, 0x16, 0xc3, 0x00, 0x5e, 0x5a, \n  0x01, 0xce, 0x12, 0x02, 0x96, 0x98, 0x00, 0x53, 0x96, 0xff, 0x20, 0x94, 0xff, 0x5c, 0x8b, 0xff, \n  0xe1, 0xec, 0xff, 0x44, 0xe4, 0xff, 0xaf, 0xb6, 0x0a, 0x6a, 0x3e, 0x0c, 0xa9, 0xc9, 0x06, 0x9a, \n  0xb1, 0x06, 0xc3, 0xea, 0x00, 0x10, 0xd2, 0x00, 0x6d, 0x94, 0xff, 0x27, 0x32, 0xfe, 0xf8, 0xaf, \n  0x01, 0x8e, 0x0f, 0x01, 0x53, 0xe8, 0xfe, 0xac, 0xdd, 0x00, 0x00, 0xf2, 0x01, 0xef, 0x95, 0x00, \n  0x67, 0xfa, 0xff, 0xc1, 0x12, 0xff, 0x3f, 0x80, 0x00, 0xe3, 0x5f, 0x00, 0x2e, 0x75, 0xff, 0xe2, \n  0x69, 0x01, 0x61, 0x5d, 0x01, 0x59, 0x6e, 0x01, 0x2d, 0xf5, 0x00, 0x0c, 0x6c, 0x00, 0x24, 0x30, \n  0x01, 0xff, 0x2e, 0x01, 0x89, 0x5c, 0x00, 0x02, 0xc8, 0xff, 0x5d, 0x7b, 0xff, 0xbd, 0x57, 0xff, \n  0x86, 0xe7, 0xff, 0x7b, 0xc9, 0xff, 0xc7, 0xc7, 0x09, 0x8f, 0x28, 0x0b, 0xc8, 0x80, 0x06, 0xf0, \n  0xb2, 0x06, 0x8f, 0x42, 0x01, 0xb8, 0xdb, 0x00, 0xb5, 0xae, 0xff, 0xbc, 0xbc, 0xfe, 0x96, 0xe3, \n  0x01, 0x2e, 0x34, 0x01, 0x19, 0x07, 0xff, 0x1a, 0xc2, 0x00, 0x86, 0xe9, 0x01, 0x78, 0xc9, 0x00, \n  0xb9, 0x58, 0x00, 0x87, 0x9f, 0xff, 0xec, 0x44, 0x01, 0x52, 0x71, 0x01, 0xa0, 0x53, 0x00, 0x17, \n  0x2e, 0x01, 0x79, 0x10, 0x01, 0x0c, 0xa7, 0x00, 0x5d, 0x04, 0x00, 0x9b, 0x7a, 0x00, 0xeb, 0x02, \n  0x01, 0xa3, 0x08, 0x01, 0x30, 0x20, 0x00, 0xfd, 0x7a, 0xff, 0x34, 0x80, 0xff, 0x87, 0x5a, 0xff, \n  0x15, 0xdb, 0xff, 0xe8, 0x77, 0xff, 0x1b, 0x0f, 0x09, 0xe6, 0x81, 0x0a, 0xaf, 0x32, 0x06, 0xb4, \n  0x61, 0x06, 0x99, 0x7e, 0x01, 0xae, 0xbb, 0x00, 0x8a, 0xf5, 0xff, 0xd5, 0x9b, 0xff, 0x14, 0x07, \n  0x02, 0x98, 0xd8, 0x00, 0x3d, 0x1f, 0xff, 0x2f, 0x78, 0x01, 0xa7, 0xcd, 0x01, 0x28, 0xcb, 0x00, \n  0x1c, 0xe3, 0x01, 0xe3, 0x0a, 0x01, 0x82, 0x77, 0x01, 0xda, 0x57, 0x01, 0xed, 0xec, 0xff, 0x39, \n  0x82, 0x00, 0x15, 0x88, 0x00, 0xb0, 0xc2, 0xff, 0x98, 0x3b, 0x00, 0x30, 0xf3, 0x00, 0x8b, 0x6e, \n  0x00, 0xe3, 0x84, 0x00, 0xce, 0xff, 0xff, 0x24, 0x83, 0xff, 0xc9, 0x68, 0xff, 0x43, 0x57, 0xff, \n  0xd6, 0x9d, 0xff, 0xf6, 0x49, 0xff, 0x9e, 0xb5, 0x08, 0x0e, 0x51, 0x0a, 0x88, 0xf4, 0x05, 0x30, \n  0x74, 0x05, 0x8b, 0x29, 0x01, 0xac, 0x51, 0x01, 0x9b, 0xe1, 0x00, 0x9f, 0x79, 0xff, 0x3d, 0x92, \n  0x01, 0xa9, 0x7d, 0x01, 0xab, 0xc0, 0xff, 0x7e, 0x7b, 0x01, 0x5a, 0xd7, 0x02, 0x3f, 0x6e, 0x02, \n  0xaa, 0x6c, 0x02, 0x42, 0xae, 0x00, 0x47, 0x6a, 0x00, 0x06, 0x78, 0x00, 0x36, 0x69, 0xff, 0xf5, \n  0x37, 0x00, 0xae, 0x61, 0x00, 0x44, 0xc4, 0xff, 0xbc, 0x26, 0x00, 0x46, 0x79, 0x00, 0x79, 0x74, \n  0x00, 0x2a, 0x2f, 0x00, 0x5f, 0x97, 0xff, 0x8e, 0x5b, 0xff, 0x56, 0x4c, 0xff, 0xa5, 0x66, 0xff, \n  0x5d, 0x51, 0xff, 0x27, 0x03, 0xff, 0x30, 0x10, 0x08, 0x9d, 0x5e, 0x09, 0x12, 0x18, 0x06, 0xc6, \n  0x0e, 0x06, 0x99, 0x71, 0x01, 0xf7, 0xbc, 0x00, 0x7a, 0xab, 0x00, 0x9a, 0xf8, 0x00, 0x40, 0x11, \n  0x02, 0xab, 0x1f, 0x01, 0xe2, 0x47, 0x01, 0x80, 0x68, 0x03, 0x11, 0x4e, 0x03, 0x86, 0xcd, 0x01, \n  0x4a, 0x70, 0x01, 0xe1, 0x8b, 0xff, 0x64, 0xac, 0xff, 0xa9, 0x22, 0x00, 0x38, 0xa6, 0xff, 0x40, \n  0x67, 0x00, 0x09, 0xcb, 0xff, 0xf9, 0xae, 0xff, 0xdb, 0x3a, 0x00, 0x2c, 0x72, 0x00, 0x65, 0x18, \n  0x00, 0xf8, 0xa9, 0xff, 0x11, 0x82, 0xff, 0xba, 0x32, 0xff, 0xee, 0x6b, 0xff, 0xf0, 0x46, 0xff, \n  0x5c, 0xfb, 0xfe, 0x7d, 0xe8, 0xfe, 0x09, 0xd0, 0x07, 0x61, 0xc9, 0x09, 0x08, 0x7d, 0x06, 0x81, \n  0x00, 0x05, 0x22, 0x90, 0x00, 0xfd, 0xad, 0x01, 0x73, 0xcb, 0x01, 0x13, 0x73, 0x01, 0xcf, 0x4f, \n  0x03, 0xa9, 0x42, 0x03, 0xc2, 0x07, 0x02, 0xca, 0x8d, 0x02, 0x25, 0x20, 0x02, 0x4b, 0x3a, 0x00, \n  0x22, 0x34, 0x00, 0x28, 0x67, 0xff, 0x70, 0xff, 0xff, 0x11, 0x19, 0x00, 0x0a, 0x66, 0xff, 0xe1, \n  0x13, 0x00, 0xae, 0xec, 0xff, 0xaf, 0xe3, 0xff, 0xb8, 0x11, 0x00, 0xe7, 0x22, 0x00, 0x17, 0x6a, \n  0xff, 0x1b, 0x82, 0xff, 0x31, 0x77, 0xff, 0x2c, 0x31, 0xff, 0x0d, 0x6d, 0xff, 0xea, 0xed, 0xfe, \n  0xbc, 0xe9, 0xfe, 0x3d, 0xfc, 0xfe, 0x55, 0xce, 0x07, 0x2c, 0xbe, 0x09, 0x05, 0x85, 0x06, 0xdc, \n  0xf1, 0x04, 0xf7, 0x81, 0x00, 0xd4, 0x06, 0x02, 0x67, 0x2f, 0x04, 0xf2, 0x88, 0x04, 0x2e, 0x43, \n  0x03, 0xb2, 0x0e, 0x02, 0x4a, 0x19, 0x01, 0x37, 0xac, 0x00, 0x35, 0x0d, 0x01, 0xb7, 0xba, 0xff, \n  0xa9, 0x17, 0x00, 0x6d, 0xd2, 0xff, 0xb2, 0x4b, 0xff, 0x4b, 0xc9, 0xff, 0x61, 0xd2, 0xff, 0xb3, \n  0xfe, 0xff, 0x57, 0xeb, 0xff, 0xbd, 0xad, 0xff, 0x27, 0x90, 0xff, 0x7d, 0xd2, 0xff, 0xa1, 0x3e, \n  0xff, 0x1a, 0x35, 0xff, 0xc1, 0x67, 0xff, 0x1e, 0x32, 0xff, 0x34, 0x44, 0xff, 0x39, 0x02, 0xff, \n  0x34, 0xda, 0xfe, 0xcf, 0x14, 0xff, 0x25, 0x8b, 0x07, 0x8d, 0x7c, 0x09, 0xe9, 0x7d, 0x06, 0x10, \n  0xae, 0x05, 0xaa, 0xfb, 0x02, 0xac, 0xe6, 0x03, 0x80, 0x75, 0x04, 0x88, 0xc0, 0x04, 0x69, 0x74, \n  0x02, 0x5f, 0x54, 0xff, 0xcb, 0x50, 0xff, 0x1e, 0xf9, 0x00, 0x77, 0x0f, 0x01, 0x3f, 0x49, 0xff, \n  0x4a, 0x8f, 0xff, 0x24, 0x8f, 0xff, 0x70, 0x83, 0xff, 0xe2, 0xb5, 0xff, 0x27, 0xc2, 0xff, 0x29, \n  0xde, 0xff, 0x07, 0x78, 0xff, 0x56, 0x77, 0xff, 0x71, 0x85, 0xff, 0xac, 0x3a, 0xff, 0x62, 0xe6, \n  0xfe, 0xa5, 0x45, 0xff, 0xba, 0x38, 0xff, 0xe7, 0x50, 0xff, 0xbe, 0x48, 0xff, 0xf5, 0xd3, 0xfe, \n  0x48, 0x15, 0xff, 0x12, 0x3b, 0xff, 0xb0, 0xcc, 0x06, 0x6c, 0xe2, 0x0a, 0xa4, 0x2d, 0x09, 0x3f, \n  0x06, 0x07, 0xd0, 0xbe, 0x03, 0xd4, 0xbc, 0x03, 0xaa, 0x2d, 0x04, 0xf8, 0x9c, 0x02, 0x12, 0x06, \n  0x00, 0xd8, 0x12, 0x00, 0xf0, 0xee, 0xff, 0xd9, 0x2d, 0x00, 0x8f, 0x98, 0x00, 0x8f, 0x5b, 0xff, \n  0x22, 0x00, 0x00, 0x58, 0x91, 0xff, 0xc0, 0x4b, 0xff, 0xb6, 0x05, 0x00, 0x6f, 0x9a, 0xff, 0x57, \n  0x8d, 0xff, 0x44, 0xbb, 0xff, 0xc5, 0x82, 0xff, 0xbe, 0x0f, 0xff, 0xeb, 0x01, 0xff, 0x66, 0x0e, \n  0xff, 0xf9, 0x70, 0xff, 0x00, 0x7a, 0xff, 0xb2, 0x63, 0xff, 0x88, 0x50, 0xff, 0x70, 0x0c, 0xff, \n  0x6a, 0x3c, 0xff, 0x27, 0x3b, 0xff, 0xcc, 0x9a, 0x08, 0x47, 0xdc, 0x0f, 0x07, 0x75, 0x0a, 0x09, \n  0xfd, 0x03, 0x77, 0x0a, 0x02, 0xbf, 0xa7, 0x03, 0xfa, 0x0b, 0x02, 0xd2, 0x08, 0x01, 0xd6, 0x96, \n  0x01, 0x29, 0xc6, 0xff, 0x2b, 0x06, 0xff, 0x53, 0xd9, 0xff, 0xe8, 0x38, 0x01, 0xae, 0xde, 0xff, \n  0x61, 0x04, 0xff, 0x07, 0xd2, 0xff, 0xe1, 0x7a, 0xff, 0x5f, 0x44, 0xff, 0xbd, 0xbc, 0xff, 0x41, \n  0xd7, 0xff, 0xd3, 0x7a, 0xff, 0x1f, 0x2c, 0xff, 0x7b, 0xe9, 0xfe, 0x94, 0x0c, 0xff, 0xca, 0x55, \n  0xff, 0xea, 0x75, 0xff, 0x6d, 0x86, 0xff, 0x57, 0x69, 0xff, 0x3e, 0x37, 0xff, 0x8b, 0x23, 0xff, \n  0x84, 0x28, 0xff, 0x36, 0x12, 0xff, 0x6c, 0x04, 0x0a, 0xd3, 0x0f, 0x10, 0x95, 0x5f, 0x09, 0x10, \n  0xc1, 0x04, 0x0d, 0x08, 0x01, 0x20, 0xee, 0x00, 0x4c, 0x64, 0x03, 0x66, 0xe5, 0x02, 0xa4, 0xc4, \n  0xff, 0x5a, 0x7b, 0xff, 0xb1, 0xae, 0x00, 0x27, 0xd7, 0xff, 0x34, 0x5f, 0x00, 0x13, 0x2c, 0x00, \n  0x6c, 0x93, 0xff, 0xc7, 0x52, 0xff, 0x82, 0x1e, 0xff, 0x35, 0x40, 0xff, 0x82, 0xad, 0xff, 0x63, \n  0xca, 0xff, 0xd9, 0x6e, 0xff, 0xd5, 0x59, 0xff, 0xd9, 0xd5, 0xfe, 0xd1, 0x2a, 0xff, 0xdb, 0x6b, \n  0xff, 0x73, 0x59, 0xff, 0x5b, 0x53, 0xff, 0x93, 0x54, 0xff, 0xc0, 0x49, 0xff, 0xef, 0x23, 0xff, \n  0xed, 0x0a, 0xff, 0xe6, 0x1b, 0xff, 0x7b, 0x83, 0x07, 0x25, 0x7f, 0x0d, 0xb8, 0x2e, 0x0a, 0x86, \n  0x7d, 0x05, 0x78, 0x25, 0x01, 0xe2, 0xb9, 0x01, 0xde, 0xb4, 0x03, 0x58, 0xba, 0x02, 0x19, 0x9b, \n  0x00, 0x43, 0xfb, 0xff, 0x82, 0xec, 0x00, 0xa7, 0xe9, 0x00, 0xee, 0x74, 0x00, 0x15, 0xe5, 0xff, \n  0x35, 0x17, 0x00, 0x93, 0x72, 0xff, 0x40, 0x0f, 0xff, 0xb9, 0x43, 0xff, 0xbf, 0x31, 0xff, 0x3c, \n  0x77, 0xff, 0x9a, 0xe9, 0xff, 0x5f, 0x82, 0xff, 0xfb, 0xf0, 0xfe, 0x88, 0x89, 0xff, 0x27, 0x67, \n  0xff, 0x1d, 0x37, 0xff, 0x17, 0x29, 0xff, 0x81, 0x30, 0xff, 0x0c, 0x2f, 0xff, 0x9f, 0x22, 0xff, \n  0x48, 0x3b, 0xff, 0xce, 0x1b, 0xff, 0xe5, 0x29, 0x07, 0xd7, 0xe1, 0x0c, 0x99, 0xf5, 0x07, 0x4e, \n  0xa0, 0x03, 0xdc, 0x82, 0x02, 0xa0, 0xc6, 0x02, 0x00, 0xe4, 0x02, 0xce, 0x92, 0x02, 0xb6, 0x0d, \n  0x02, 0x01, 0xb0, 0x00, 0x0f, 0x9d, 0x00, 0x8c, 0xd0, 0x01, 0xa7, 0x82, 0x01, 0x67, 0x4f, 0x00, \n  0xac, 0x1b, 0x00, 0x12, 0xe8, 0xff, 0x15, 0x75, 0xff, 0x1e, 0xe7, 0xfe, 0xb9, 0x47, 0xff, 0x65, \n  0x82, 0xff, 0xbc, 0x5c, 0xff, 0x0d, 0xa6, 0xff, 0x28, 0xa8, 0xff, 0x70, 0xa3, 0xff, 0x44, 0x8d, \n  0xff, 0xfb, 0x8c, 0xff, 0x09, 0x29, 0xff, 0x9c, 0xef, 0xfe, 0x84, 0xfc, 0xfe, 0xb6, 0x1e, 0xff, \n  0xd8, 0x3e, 0xff, 0x7e, 0x25, 0xff, 0x50, 0xd0, 0x06, 0x76, 0x14, 0x0c, 0x58, 0x97, 0x06, 0x71, \n  0xec, 0x02, 0x91, 0x89, 0x03, 0xbb, 0x67, 0x02, 0xe2, 0x41, 0x01, 0xf4, 0xc2, 0x02, 0x47, 0x9e, \n  0x02, 0x8b, 0x1f, 0x01, 0x02, 0xa6, 0x01, 0x68, 0xcc, 0x01, 0x76, 0x6f, 0x01, 0xd2, 0xa1, 0x01, \n  0xb7, 0x24, 0x01, 0x6e, 0xd1, 0xff, 0xc7, 0xd7, 0xff, 0xd9, 0xd2, 0xff, 0x94, 0xf4, 0xfe, 0x97, \n  0x0c, 0xff, 0x0a, 0xa4, 0xff, 0xac, 0xa2, 0xff, 0x69, 0x3c, 0xff, 0x56, 0x07, 0x00, 0x91, 0x24, \n  0x00, 0x78, 0x7b, 0xff, 0x96, 0x7c, 0xff, 0xb6, 0x2c, 0xff, 0x5c, 0xd7, 0xfe, 0x84, 0xd8, 0xfe, \n  0x8f, 0x0e, 0xff, 0xe9, 0x3f, 0xff, 0x1b, 0x65, 0x06, 0xf1, 0x12, 0x0b, 0x3d, 0x34, 0x06, 0x79, \n  0x65, 0x03, 0xac, 0xe7, 0x03, 0x9f, 0xbb, 0x01, 0x49, 0x54, 0x00, 0xb0, 0xa8, 0x02, 0x24, 0x58, \n  0x02, 0x4e, 0x99, 0x00, 0x75, 0x70, 0x01, 0x16, 0x68, 0x02, 0x1b, 0x35, 0x02, 0xce, 0x7a, 0x01, \n  0x21, 0x27, 0x01, 0x0d, 0x1c, 0x01, 0x26, 0x93, 0x00, 0xba, 0xc9, 0xff, 0x5c, 0xb2, 0xff, 0x52, \n  0x78, 0xff, 0xbb, 0x25, 0xff, 0x02, 0x56, 0xff, 0x64, 0xa0, 0xff, 0xfe, 0xc4, 0xff, 0xe3, 0xc0, \n  0xff, 0xaf, 0x12, 0x00, 0x23, 0xc4, 0xff, 0x13, 0x2f, 0xff, 0x19, 0x30, 0xff, 0x26, 0xf4, 0xfe, \n  0xcc, 0xb1, 0xfe, 0x60, 0xfc, 0xfe, 0xb9, 0x82, 0x06, 0x96, 0x14, 0x0b, 0x1b, 0x21, 0x06, 0x3c, \n  0x52, 0x03, 0x7b, 0xf0, 0x03, 0x9a, 0x7f, 0x01, 0x4c, 0xda, 0xff, 0x00, 0xc0, 0x02, 0x5c, 0x64, \n  0x02, 0x56, 0xcb, 0xff, 0x98, 0x88, 0x00, 0x99, 0x44, 0x02, 0x7a, 0x03, 0x02, 0x53, 0xa8, 0x01, \n  0x70, 0xed, 0x01, 0x23, 0xe4, 0x00, 0x55, 0x7d, 0x00, 0x96, 0x0a, 0x01, 0xe6, 0x7a, 0x00, 0x46, \n  0x68, 0xff, 0xcd, 0xc2, 0xff, 0xdf, 0xf5, 0xff, 0xe9, 0x2e, 0xff, 0xe1, 0x90, 0xff, 0xd6, 0x26, \n  0x00, 0xd4, 0xe0, 0xff, 0x07, 0x8b, 0xff, 0xdb, 0xa8, 0xff, 0x12, 0x6c, 0xff, 0x43, 0x11, 0xff, \n  0x99, 0x12, 0xff, 0x91, 0xea, 0xfe, 0xc4, 0x8d, 0x06, 0x5e, 0xf8, 0x0a, 0x73, 0x3b, 0x06, 0x8f, \n  0x22, 0x04, 0x5d, 0x47, 0x04, 0x38, 0x87, 0x00, 0xc9, 0x53, 0xff, 0xe9, 0x71, 0x03, 0x25, 0x6e, \n  0x02, 0xa2, 0x1a, 0xff, 0x51, 0x35, 0x00, 0x58, 0xd5, 0x01, 0x37, 0x59, 0x01, 0xae, 0x08, 0x01, \n  0x90, 0xaf, 0x01, 0x85, 0x26, 0x01, 0xaa, 0x95, 0x00, 0x48, 0xc5, 0x00, 0x52, 0xce, 0x00, 0xe6, \n  0x6f, 0x00, 0x97, 0x04, 0x00, 0xff, 0x0d, 0x00, 0xfe, 0x15, 0x00, 0x05, 0xe7, 0xff, 0xd2, 0xb5, \n  0xff, 0x4a, 0xd2, 0xff, 0x3c, 0xc6, 0xff, 0xfa, 0x60, 0xff, 0xb3, 0x35, 0xff, 0xf2, 0x6d, 0xff, \n  0x54, 0x41, 0xff, 0x8b, 0x1d, 0xff, 0x35, 0xf4, 0x06, 0x37, 0xbb, 0x0b, 0x11, 0x6a, 0x06, 0x66, \n  0xdf, 0x03, 0xb1, 0x4c, 0x04, 0xf7, 0x7c, 0x00, 0x28, 0x1b, 0xff, 0xc1, 0x59, 0x03, 0x00, 0x6d, \n  0x02, 0x81, 0xe9, 0xfe, 0xc4, 0xeb, 0xff, 0xd5, 0x7c, 0x01, 0x4e, 0x25, 0x01, 0xd3, 0xc0, 0x00, \n  0xcc, 0xf3, 0x00, 0x26, 0xa3, 0x00, 0x48, 0x11, 0x00, 0xd0, 0x7e, 0x00, 0x3f, 0x1b, 0x01, 0x2b, \n  0x70, 0x00, 0x32, 0x0a, 0x00, 0x2a, 0xb9, 0x00, 0x81, 0x85, 0x00, 0x6c, 0x38, 0x00, 0x73, 0x71, \n  0x00, 0xe3, 0x16, 0x00, 0x44, 0x76, 0xff, 0x95, 0x3f, 0xff, 0x9c, 0x33, 0xff, 0x71, 0x26, 0xff, \n  0x83, 0x2b, 0xff, 0xad, 0x55, 0xff, 0x9c, 0x8e, 0x07, 0x30, 0x60, 0x0c, 0xdd, 0x83, 0x06, 0xac, \n  0x3c, 0x04, 0xb2, 0x5e, 0x04, 0x5d, 0xe0, 0xff, 0xea, 0x02, 0xff, 0x58, 0xc7, 0x03, 0x3f, 0x42, \n  0x02, 0x18, 0x90, 0xfe, 0x17, 0xd3, 0xff, 0x57, 0x89, 0x01, 0x33, 0xe3, 0x00, 0x68, 0x48, 0x00, \n  0xd6, 0x28, 0x01, 0x44, 0x8d, 0x00, 0xdc, 0x34, 0xff, 0x15, 0x9b, 0xff, 0x65, 0xb5, 0x00, 0x98, \n  0x82, 0x00, 0x22, 0x0e, 0x00, 0xaf, 0xa7, 0x00, 0x6d, 0xce, 0x00, 0xa4, 0xe8, 0x00, 0x11, 0xcb, \n  0x00, 0x04, 0x90, 0x00, 0x1a, 0x42, 0x00, 0x81, 0x61, 0xff, 0xbe, 0xca, 0xfe, 0xcd, 0x00, 0xff, \n  0x16, 0x48, 0xff, 0x4c, 0x21, 0xff, 0x7d, 0x6f, 0x08, 0xb1, 0x73, 0x0d, 0xb4, 0x74, 0x06, 0x38, \n  0x09, 0x04, 0xc7, 0x6d, 0x04, 0x40, 0xb6, 0xff, 0xa8, 0xfa, 0xfe, 0x28, 0xc4, 0x03, 0x39, 0xfd, \n  0x01, 0x63, 0x5f, 0xfe, 0xe9, 0xef, 0xff, 0xd9, 0x5d, 0x01, 0xe7, 0xa5, 0x00, 0x23, 0x19, 0x00, \n  0x46, 0xec, 0x00, 0x83, 0xc2, 0x00, 0xd9, 0x39, 0xff, 0x6f, 0xf2, 0xfe, 0x45, 0xb2, 0xff, 0x0f, \n  0x18, 0x00, 0x26, 0xc1, 0xff, 0xc7, 0x2e, 0x00, 0xe0, 0x07, 0x01, 0x9f, 0x0c, 0x01, 0x91, 0xfb, \n  0x00, 0x25, 0x15, 0x01, 0x34, 0xa6, 0x00, 0x04, 0xe2, 0xff, 0x27, 0x37, 0xff, 0xdf, 0xf0, 0xfe, \n  0xf5, 0xf6, 0xfe, 0xee, 0x13, 0xff, 0x72, 0xfd, 0x08, 0x23, 0x80, 0x0e, 0x52, 0xd7, 0x06, 0x60, \n  0xc7, 0x03, 0xe6, 0x85, 0x04, 0xfe, 0xa2, 0xff, 0xbb, 0xa3, 0xfe, 0x85, 0x19, 0x04, 0x09, 0xdb, \n  0x01, 0x88, 0xd3, 0xfd, 0x6c, 0xf5, 0xff, 0xbf, 0x70, 0x01, 0xdf, 0x8a, 0x00, 0x52, 0xc9, 0xff, \n  0x3b, 0x85, 0x00, 0x0d, 0xf6, 0x00, 0x11, 0x8c, 0xff, 0x4e, 0xa0, 0xfe, 0x58, 0x4e, 0xff, 0xaa, \n  0x8e, 0xff, 0x53, 0x1a, 0xff, 0xc5, 0xa7, 0xff, 0xb6, 0x74, 0x00, 0xbc, 0x04, 0x01, 0xeb, 0x25, \n  0x01, 0xf2, 0x0e, 0x01, 0x96, 0xfd, 0x00, 0xd2, 0x48, 0x00, 0x02, 0x9a, 0xff, 0xb8, 0x5d, 0xff, \n  0x20, 0x2e, 0xff, 0x22, 0x07, 0xff, 0x1c, 0x02, 0x0a, 0x23, 0xe3, 0x0f, 0x74, 0xc5, 0x06, 0xd8, \n  0x3d, 0x03, 0x04, 0xc1, 0x04, 0xe4, 0xa6, 0xff, 0x3a, 0x69, 0xfe, 0x8e, 0x43, 0x04, 0x17, 0xba, \n  0x01, 0xde, 0x87, 0xfd, 0xb9, 0x00, 0x00, 0x47, 0x4a, 0x01, 0xee, 0x56, 0x00, 0x6f, 0xd3, 0xff, \n  0x3b, 0x35, 0x00, 0x9d, 0xe4, 0x00, 0x46, 0xb9, 0xff, 0xf0, 0xb9, 0xfe, 0x7d, 0x19, 0xff, 0x0a, \n  0x45, 0xff, 0xba, 0x02, 0xff, 0x39, 0x0e, 0xff, 0xbe, 0xc3, 0xff, 0xda, 0xbd, 0x00, 0x29, 0xf7, \n  0x00, 0xf2, 0xc9, 0x00, 0x48, 0x10, 0x01, 0xd4, 0x7d, 0x00, 0x34, 0xc7, 0xff, 0xd7, 0xc3, 0xff, \n  0xed, 0x81, 0xff, 0xa0, 0x4e, 0xff, 0x4c, 0x3f, 0x0b, 0x89, 0x46, 0x11, 0x28, 0x8a, 0x06, 0x3f, \n  0xdd, 0x02, 0xb4, 0xee, 0x04, 0x4f, 0x48, 0xff, 0xaa, 0x69, 0xfe, 0xd2, 0xa7, 0x04, 0xfc, 0x3b, \n  0x01, 0x73, 0x2c, 0xfd, 0xb7, 0x30, 0x00, 0x17, 0x63, 0x01, 0x38, 0xed, 0xff, 0x2c, 0x77, 0xff, \n  0xda, 0x2b, 0x00, 0xc8, 0xc9, 0x00, 0x39, 0xcf, 0xff, 0xc4, 0xbf, 0xfe, 0xa2, 0xf6, 0xfe, 0x4f, \n  0x30, 0xff, 0x02, 0xe6, 0xfe, 0x7b, 0xd8, 0xfe, 0x05, 0x6f, 0xff, 0x15, 0x3c, 0x00, 0xe9, 0xaa, \n  0x00, 0x17, 0x69, 0x00, 0x63, 0x99, 0x00, 0x0b, 0x6c, 0x00, 0xac, 0xd7, 0xff, 0x6d, 0xcc, 0xff, \n  0x21, 0xaa, 0xff, 0xd5, 0xb0, 0xff, 0x38, 0xaf, 0x0c, 0xb9, 0xce, 0x12, 0x94, 0x1c, 0x06, 0xd8, \n  0x8c, 0x02, 0xfb, 0x21, 0x05, 0x13, 0xc4, 0xfe, 0x43, 0x93, 0xfe, 0x62, 0x22, 0x05, 0xbb, 0xa2, \n  0x00, 0x22, 0xeb, 0xfc, 0xad, 0x6f, 0x00, 0x80, 0x6d, 0x01, 0xdf, 0xaf, 0xff, 0x55, 0x2f, 0xff, \n  0x43, 0xff, 0xff, 0x69, 0xa3, 0x00, 0xa8, 0xc6, 0xff, 0x26, 0xf7, 0xfe, 0x83, 0x10, 0xff, 0xc7, \n  0xeb, 0xfe, 0xcb, 0xc6, 0xfe, 0x4f, 0xf0, 0xfe, 0x26, 0x76, 0xff, 0x97, 0xce, 0xff, 0x2a, 0x74, \n  0x00, 0x19, 0x3c, 0x00, 0x02, 0x1f, 0x00, 0xff, 0x25, 0x00, 0x0b, 0x60, 0xff, 0xf1, 0xa7, 0xff, \n  0xc9, 0xf1, 0xff, 0x4a, 0xd6, 0xff, 0xa3, 0x0a, 0x0e, 0xd4, 0x52, 0x14, 0xe1, 0xce, 0x05, 0x48, \n  0x4f, 0x02, 0xc2, 0x59, 0x05, 0xc2, 0x03, 0xfe, 0x1e, 0xad, 0xfe, 0x7a, 0xe1, 0x05, 0x79, 0xfb, \n  0xff, 0x15, 0x82, 0xfc, 0xea, 0xb4, 0x00, 0x2f, 0x89, 0x01, 0x43, 0x83, 0xff, 0x98, 0xd5, 0xfe, \n  0x81, 0xbf, 0xff, 0xc4, 0x85, 0x00, 0x8a, 0xac, 0xff, 0xf0, 0xf5, 0xfe, 0xd7, 0x31, 0xff, 0x4c, \n  0xd9, 0xfe, 0x4f, 0xa3, 0xfe, 0xc9, 0xd4, 0xfe, 0x54, 0xb4, 0xff, 0x4c, 0xa3, 0xff, 0xba, 0xf6, \n  0xff, 0x8f, 0x80, 0x00, 0xc2, 0xd1, 0xff, 0xce, 0x94, 0xff, 0x4f, 0x1c, 0xff, 0xa0, 0x38, 0xff, \n  0x26, 0xa8, 0xff, 0xe5, 0xd4, 0xff, 0xdb, 0x4e, 0x0f, 0x14, 0xfd, 0x15, 0xd4, 0xa1, 0x05, 0x1c, \n  0xdb, 0x01, 0x08, 0xa7, 0x05, 0xdd, 0x3e, 0xfd, 0x53, 0x8d, 0xfe, 0x17, 0xa4, 0x06, 0x5a, 0x6d, \n  0xff, 0x54, 0x1f, 0xfc, 0xb8, 0xe9, 0x00, 0x6c, 0x7e, 0x01, 0x76, 0x74, 0xff, 0xee, 0xa1, 0xfe, \n  0xde, 0x44, 0xff, 0xe0, 0x5c, 0x00, 0xac, 0xa9, 0xff, 0xb7, 0xe9, 0xfe, 0xc9, 0x27, 0xff, 0xba, \n  0xbc, 0xfe, 0xc3, 0xa2, 0xfe, 0x87, 0xb1, 0xfe, 0x52, 0xc7, 0xff, 0x86, 0xd9, 0xff, 0x61, 0x81, \n  0xff, 0xaa, 0x61, 0x00, 0x3e, 0x01, 0x00, 0x5d, 0x24, 0xff, 0xe4, 0xe8, 0xfe, 0xcf, 0xe2, 0xfe, \n  0xf0, 0x0c, 0xff, 0xbe, 0x94, 0xff, 0x9d, 0x50, 0x10, 0xbd, 0xba, 0x17, 0x8b, 0xc2, 0x05, 0x84, \n  0x38, 0x01, 0xb3, 0x05, 0x06, 0x51, 0xc5, 0xfc, 0x91, 0x3f, 0xfe, 0x46, 0x4d, 0x07, 0x07, 0x17, \n  0xff, 0x21, 0xd6, 0xfb, 0xc3, 0x2a, 0x01, 0x84, 0x91, 0x01, 0x84, 0x2c, 0xff, 0xd4, 0xa4, 0xfe, \n  0x34, 0x07, 0xff, 0x8b, 0xea, 0xff, 0xa5, 0xa9, 0xff, 0x3f, 0xea, 0xfe, 0xae, 0x3a, 0xff, 0x9f, \n  0xb6, 0xfe, 0x49, 0x83, 0xfe, 0x2f, 0x84, 0xfe, 0x87, 0xcf, 0xff, 0xea, 0x5d, 0x00, 0x65, 0x74, \n  0xff, 0x25, 0xb9, 0xff, 0xfd, 0x2e, 0x00, 0x80, 0x4f, 0xff, 0x1f, 0xa7, 0xfe, 0x95, 0xc5, 0xfe, \n  0x73, 0x79, 0xfe, 0xa0, 0x38, 0xff, 0x41, 0xdc, 0x11, 0xe3, 0x31, 0x19, 0x9d, 0x6a, 0x05, 0xdc, \n  0x19, 0x01, 0xfd, 0x12, 0x06, 0xe6, 0x02, 0xfc, 0x22, 0x4f, 0xfe, 0x3e, 0x95, 0x07, 0x23, 0x67, \n  0xfe, 0x23, 0x05, 0xfc, 0x62, 0x53, 0x01, 0xbe, 0x70, 0x01, 0x70, 0xe8, 0xfe, 0xcd, 0x87, 0xfe, \n  0xd2, 0x19, 0xff, 0x67, 0x47, 0xff, 0x45, 0x5b, 0xff, 0xab, 0x07, 0xff, 0xc8, 0x5e, 0xff, 0x44, \n  0x9e, 0xfe, 0x9c, 0x4f, 0xfe, 0x7d, 0x5d, 0xfe, 0xf6, 0xc4, 0xff, 0x8c, 0x86, 0x00, 0x51, 0xcb, \n  0xff, 0x07, 0x6d, 0xff, 0x71, 0xa6, 0xff, 0x30, 0x9e, 0xff, 0xd4, 0x7b, 0xfe, 0x79, 0x8e, 0xfe, \n  0x6a, 0x66, 0xfe, 0x3d, 0xb0, 0xfe, 0x22, 0xc0, 0x13, 0x4c, 0x42, 0x1a, 0x35, 0xd9, 0x04, 0x8e, \n  0xc3, 0x01, 0x67, 0xc0, 0x05, 0xb0, 0x48, 0xfb, 0x3b, 0x95, 0xfe, 0x15, 0xa3, 0x07, 0x20, 0xb2, \n  0xfd, 0x4a, 0x5a, 0xfc, 0xa7, 0x9f, 0x01, 0x83, 0x49, 0x01, 0x8e, 0xbd, 0xfe, 0xa2, 0x3e, 0xfe, \n  0xf3, 0x7f, 0xff, 0xe8, 0xae, 0xfe, 0x31, 0xdd, 0xfe, 0x7d, 0x37, 0xff, 0xd5, 0x71, 0xff, 0xa5, \n  0xc5, 0xfe, 0xa7, 0x1b, 0xfe, 0xf1, 0x37, 0xfe, 0xfd, 0xe4, 0xff, 0xe5, 0x6d, 0x00, 0x2a, 0xe3, \n  0xff, 0x36, 0xee, 0xff, 0x24, 0x28, 0xff, 0x35, 0x3e, 0xff, 0x79, 0xa7, 0xfe, 0x98, 0x75, 0xfe, \n  0xbc, 0x5c, 0xfe, 0x41, 0x6d, 0xfe, 0x0b, 0x44, 0x15, 0xe8, 0x0b, 0x1b, 0x16, 0xde, 0x04, 0x2c, \n  0x7d, 0x02, 0x3a, 0x7a, 0x05, 0x33, 0xfb, 0xfa, 0xd1, 0x58, 0xfe, 0xc4, 0x88, 0x07, 0xf0, 0x6d, \n  0xfd, 0xf9, 0x9d, 0xfc, 0x73, 0x9a, 0x01, 0x21, 0x5d, 0x01, 0xdf, 0xe2, 0xfe, 0xba, 0xa9, 0xfd, \n  0xac, 0xc9, 0xff, 0xc4, 0x87, 0xfe, 0x40, 0x49, 0xfe, 0x57, 0x20, 0xff, 0x7f, 0x8e, 0xff, 0xe5, \n  0xfa, 0xfe, 0xd1, 0x40, 0xfe, 0x35, 0xef, 0xfd, 0x7e, 0xce, 0xff, 0xac, 0xa9, 0x00, 0x03, 0xb5, \n  0xff, 0x4d, 0x50, 0x00, 0x4d, 0x36, 0xff, 0x15, 0xbe, 0xfe, 0x91, 0xa6, 0xfe, 0x61, 0x6f, 0xfe, \n  0x38, 0x42, 0xfe, 0xf8, 0x74, 0xfe, 0xcd, 0x7c, 0x16, 0x3e, 0x80, 0x1b, 0x74, 0x46, 0x05, 0x47, \n  0x54, 0x03, 0x97, 0x5b, 0x05, 0x66, 0x02, 0xfb, 0x05, 0x88, 0xfd, 0x77, 0x67, 0x07, 0xe0, 0x58, \n  0xfd, 0x6e, 0xc5, 0xfc, 0x21, 0xa4, 0x01, 0xe0, 0x2b, 0x01, 0x79, 0x48, 0xff, 0xb4, 0x4c, 0xfd, \n  0xec, 0x8d, 0xff, 0x1c, 0xb5, 0xfe, 0x23, 0xec, 0xfd, 0x07, 0x79, 0xfe, 0x12, 0xca, 0xff, 0x54, \n  0x3e, 0xff, 0x8a, 0x64, 0xfe, 0x98, 0xe3, 0xfd, 0x25, 0x48, 0xff, 0xa2, 0x3a, 0x01, 0xf2, 0x97, \n  0xff, 0x6d, 0x0f, 0x00, 0xd8, 0x90, 0xff, 0x4c, 0xac, 0xfe, 0x9f, 0x67, 0xfe, 0x4a, 0x2a, 0xfe, \n  0x87, 0x3f, 0xfe, 0xd3, 0x83, 0xfe, 0xf7, 0xf0, 0x17, 0x52, 0x71, 0x1b, 0x2b, 0x54, 0x05, 0x6a, \n  0xa7, 0x04, 0x39, 0xd2, 0x05, 0xd0, 0x86, 0xfa, 0xc2, 0x93, 0xfc, 0x58, 0x9e, 0x07, 0xe8, 0xe6, \n  0xfc, 0x44, 0xc8, 0xfc, 0x6c, 0xfb, 0x01, 0xbf, 0xd3, 0x00, 0x4d, 0x54, 0xff, 0xa1, 0x84, 0xfd, \n  0xe1, 0x1f, 0xff, 0x16, 0x96, 0xfe, 0x56, 0x07, 0xfe, 0x82, 0x9e, 0xfd, 0x08, 0xab, 0xff, 0x1e, \n  0xc7, 0xff, 0xcc, 0x55, 0xfe, 0x38, 0x0a, 0xfe, 0xb7, 0xf9, 0xfe, 0xee, 0x3c, 0x01, 0xad, 0x00, \n  0x00, 0xa5, 0x80, 0xff, 0x99, 0xa9, 0xff, 0x94, 0x0b, 0xff, 0xfc, 0x11, 0xfe, 0x57, 0xd3, 0xfd, \n  0xf3, 0x63, 0xfe, 0x56, 0x60, 0xfe, 0x16, 0x25, 0x1a, 0xc3, 0xc9, 0x1a, 0x77, 0x0e, 0x04, 0x68, \n  0x57, 0x07, 0x01, 0xdb, 0x06, 0x2e, 0xc2, 0xf8, 0x00, 0x56, 0xfc, 0xee, 0x28, 0x08, 0xf1, 0xde, \n  0xfb, 0x1e, 0xd3, 0xfc, 0xc7, 0x72, 0x02, 0x03, 0xac, 0x00, 0xbf, 0xfe, 0xfe, 0x58, 0xeb, 0xfd, \n  0x30, 0x25, 0xff, 0xdb, 0xf2, 0xfd, 0x85, 0x49, 0xfe, 0xbf, 0x46, 0xfd, 0xac, 0xfc, 0xfe, 0xed, \n  0x3a, 0x00, 0xbd, 0x93, 0xfe, 0xa4, 0x04, 0xfe, 0x54, 0x46, 0xff, 0x3f, 0xce, 0x00, 0x77, 0x42, \n  0x00, 0x0f, 0x95, 0xff, 0xee, 0x6b, 0xff, 0x04, 0x29, 0xff, 0xdc, 0x05, 0xfe, 0x15, 0xbd, 0xfd, \n  0x38, 0x6d, 0xfe, 0x7a, 0x31, 0xfe, 0x82, 0x17, 0x1c, 0x21, 0xc3, 0x19, 0x06, 0x82, 0x02, 0xa0, \n  0x50, 0x0b, 0xc3, 0x22, 0x08, 0xe3, 0xd7, 0xf5, 0xc9, 0xfd, 0xfc, 0xaa, 0x63, 0x09, 0x15, 0xf1, \n  0xf9, 0x11, 0x9e, 0xfc, 0xb6, 0x6b, 0x03, 0x59, 0xbc, 0x00, 0x58, 0x7c, 0xfe, 0xa6, 0x02, 0xfe, \n  0x4a, 0xa3, 0xff, 0x8d, 0x8d, 0xfd, 0xaa, 0x41, 0xfe, 0x9b, 0x41, 0xfd, 0xb6, 0x1b, 0xfe, 0xf1, \n  0x41, 0x00, 0x49, 0x90, 0xff, 0x9d, 0x9d, 0xfd, 0xd9, 0x97, 0xff, 0xaf, 0xca, 0x00, 0x91, 0x0a, \n  0x00, 0x30, 0x47, 0x00, 0x1a, 0xf6, 0xfe, 0xe6, 0xff, 0xfe, 0x33, 0x7a, 0xfe, 0x16, 0xcc, 0xfd, \n  0xfe, 0xf2, 0xfd, 0x42, 0x78, 0xfe, 0x41, 0xd5, 0x1c, 0xa4, 0xd3, 0x18, 0xb3, 0xb7, 0x01, 0xca, \n  0x60, 0x0f, 0x41, 0x63, 0x09, 0x4f, 0xa1, 0xf2, 0xaa, 0x70, 0xfe, 0xea, 0x5d, 0x0b, 0xdf, 0xc0, \n  0xf6, 0x1b, 0xe6, 0xfb, 0xc8, 0x30, 0x05, 0xed, 0xee, 0x00, 0x0c, 0xac, 0xfd, 0xae, 0xbc, 0xfd, \n  0xcf, 0x65, 0x00, 0x49, 0x81, 0xfd, 0xf3, 0xff, 0xfd, 0x09, 0x54, 0xfd, 0x67, 0x44, 0xfd, 0x27, \n  0xa7, 0xff, 0x3b, 0xb9, 0x00, 0xcb, 0x93, 0xfd, 0xe4, 0x60, 0xff, 0x5e, 0x31, 0x01, 0xb6, 0xa4, \n  0xff, 0xbe, 0xe3, 0x00, 0x24, 0xeb, 0xfe, 0xb3, 0xb1, 0xfe, 0xb4, 0xcb, 0xfe, 0x67, 0xe4, 0xfd, \n  0x61, 0x7d, 0xfd, 0xbe, 0xd6, 0xfe, 0x8b, 0x82, 0x1e, 0x8f, 0x34, 0x1a, 0x7b, 0xa4, 0xfe, 0xc8, \n  0x5f, 0x0f, 0xf9, 0xec, 0x0c, 0x1c, 0x0a, 0xf2, 0x0c, 0x66, 0xfd, 0xae, 0x76, 0x0c, 0x02, 0x05, \n  0xf5, 0xaa, 0x0b, 0xfb, 0xb1, 0x7c, 0x06, 0xd8, 0xcc, 0x00, 0x06, 0xdc, 0xfc, 0x1d, 0xa8, 0xfd, \n  0x5e, 0x21, 0x01, 0x98, 0x0e, 0xfd, 0xcc, 0x91, 0xfd, 0x88, 0xce, 0xfd, 0xd2, 0xe2, 0xfc, 0x27, \n  0x66, 0xfe, 0x68, 0x03, 0x01, 0x06, 0x99, 0xfe, 0x47, 0xcb, 0xfe, 0x42, 0x6b, 0x01, 0xcd, 0xb7, \n  0xff, 0x94, 0xe9, 0x00, 0x3a, 0x25, 0xff, 0xa6, 0x80, 0xfe, 0x91, 0xd8, 0xfe, 0xef, 0xd1, 0xfd, \n  0x66, 0x42, 0xfd, 0x7d, 0xb1, 0xfe, 0x05, 0x7e, 0x21, 0x55, 0x80, 0x1b, 0x19, 0x58, 0xfb, 0x54, \n  0x6b, 0x0d, 0x12, 0x88, 0x10, 0x81, 0x06, 0xf3, 0x16, 0x45, 0xfc, 0xa0, 0x87, 0x0c, 0xdc, 0xfe, \n  0xf3, 0x10, 0x86, 0xfa, 0xd6, 0x52, 0x07, 0xb6, 0xf9, 0x00, 0x9a, 0xc1, 0xfb, 0x94, 0xb5, 0xfd, \n  0xe7, 0xe8, 0x01, 0xbc, 0xbc, 0xfc, 0xbf, 0xf5, 0xfc, 0x78, 0x31, 0xfe, 0xb2, 0x15, 0xfd, 0x6a, \n  0x62, 0xfd, 0x2d, 0x66, 0x00, 0xcd, 0xc7, 0xff, 0xd7, 0xd7, 0xfe, 0xc2, 0x19, 0x01, 0x1c, 0x52, \n  0x00, 0x33, 0xce, 0x00, 0x0a, 0x46, 0xff, 0x43, 0xc3, 0xfe, 0xd9, 0xbb, 0xfe, 0x31, 0x92, 0xfd, \n  0x0d, 0x39, 0xfd, 0x19, 0x53, 0xfe, 0xbc, 0x6a, 0x24, 0x90, 0x09, 0x1d, 0x58, 0xf5, 0xf7, 0xb5, \n  0x2c, 0x0b, 0x99, 0xb1, 0x12, 0xb3, 0x6d, 0xf5, 0x3a, 0xa4, 0xfb, 0x8c, 0xc0, 0x0b, 0x2c, 0x9a, \n  0xf3, 0xab, 0xff, 0xf9, 0xb7, 0xd6, 0x07, 0x3d, 0x60, 0x01, 0x7d, 0x9f, 0xfa, 0x48, 0xa1, 0xfd, \n  0xce, 0x75, 0x02, 0xd9, 0x8b, 0xfc, 0x91, 0x5f, 0xfc, 0x0e, 0x48, 0xfe, 0xe0, 0x75, 0xfd, 0x38, \n  0xcd, 0xfc, 0x4c, 0x38, 0xff, 0x33, 0x9e, 0x00, 0x28, 0x82, 0xff, 0x83, 0x66, 0x00, 0x93, 0xfe, \n  0x00, 0x68, 0xf3, 0x00, 0xb0, 0x50, 0xff, 0x6a, 0x49, 0xff, 0xd2, 0x7d, 0xfe, 0x2c, 0x21, 0xfd, \n  0x4c, 0x58, 0xfd, 0x71, 0x04, 0xfe, 0xe0, 0x14, 0x27, 0x2e, 0x13, 0x1f, 0x16, 0x4e, 0xf5, 0xe9, \n  0x15, 0x08, 0x33, 0xf5, 0x13, 0x81, 0x82, 0xf8, 0x20, 0x99, 0xfb, 0x40, 0x95, 0x0a, 0xd1, 0x46, \n  0xf3, 0xc1, 0xc8, 0xf9, 0xc7, 0xc7, 0x07, 0x8f, 0x0d, 0x02, 0x06, 0xb4, 0xf9, 0xf6, 0x5b, 0xfd, \n  0xd4, 0xec, 0x02, 0xdd, 0x73, 0xfc, 0x30, 0x1f, 0xfc, 0x93, 0x06, 0xfe, 0x45, 0x05, 0xfe, 0x4a, \n  0xab, 0xfc, 0x6e, 0x09, 0xfe, 0x53, 0xb7, 0x00, 0x60, 0x96, 0x00, 0x43, 0xec, 0xff, 0xff, 0x38, \n  0x01, 0xd2, 0x80, 0x01, 0x09, 0x83, 0xff, 0xe9, 0xbd, 0xff, 0xe8, 0x37, 0xfe, 0x3b, 0xca, 0xfc, \n  0x9f, 0x4f, 0xfd, 0x84, 0xd1, 0xfd, 0xb0, 0x83, 0x29, 0x2d, 0x5f, 0x21, 0x76, 0x4c, 0xf3, 0x66, \n  0x7d, 0x04, 0x61, 0x68, 0x14, 0x73, 0x41, 0xfb, 0x8c, 0x81, 0xfc, 0xef, 0x74, 0x09, 0xce, 0x6b, \n  0xf2, 0x12, 0x2c, 0xfa, 0x9f, 0x52, 0x07, 0x6e, 0x78, 0x02, 0x08, 0x50, 0xf9, 0x0c, 0xce, 0xfc, \n  0x4b, 0x17, 0x03, 0xd6, 0x6c, 0xfc, 0x16, 0x11, 0xfc, 0x36, 0x92, 0xfd, 0x46, 0x78, 0xfe, 0x13, \n  0xd3, 0xfc, 0xcb, 0x59, 0xfd, 0x00, 0xf7, 0xff, 0xa7, 0x7a, 0x01, 0xec, 0x26, 0x00, 0x23, 0xea, \n  0x00, 0x31, 0x34, 0x02, 0xab, 0xf7, 0xff, 0x66, 0xe8, 0xff, 0x72, 0xf0, 0xfd, 0xd7, 0xbb, 0xfc, \n  0x3e, 0x16, 0xfd, 0x39, 0x77, 0xfd, 0x48, 0x60, 0x2b, 0x48, 0x26, 0x24, 0x9e, 0xa9, 0xf1, 0x80, \n  0xe5, 0x00, 0xa8, 0x32, 0x14, 0xb5, 0x28, 0xfd, 0x2b, 0x1f, 0xfe, 0xd4, 0xef, 0x08, 0x29, 0xde, \n  0xf0, 0x60, 0x0a, 0xfb, 0x0f, 0xd9, 0x06, 0x2a, 0x31, 0x02, 0x03, 0x98, 0xf9, 0x64, 0x22, 0xfc, \n  0xcf, 0xb8, 0x02, 0x00, 0x7d, 0xfc, 0xa7, 0x38, 0xfc, 0x79, 0xfc, 0xfc, 0xe0, 0xcb, 0xfe, 0x4d, \n  0x24, 0xfd, 0x2b, 0x2c, 0xfd, 0x84, 0xdf, 0xfe, 0x4e, 0xb8, 0x01, 0x9b, 0xcd, 0x00, 0x18, 0xa0, \n  0x00, 0xb5, 0xcf, 0x02, 0xda, 0x8d, 0x00, 0xe5, 0xde, 0xff, 0xe4, 0xcb, 0xfd, 0x55, 0xd8, 0xfc, \n  0x0e, 0xcb, 0xfc, 0xf6, 0x0c, 0xfd, 0xb4, 0xdb, 0x2d, 0xaa, 0x7c, 0x26, 0x76, 0x74, 0xef, 0x5c, \n  0xee, 0xfe, 0xd4, 0x0b, 0x13, 0x01, 0xae, 0xfd, 0xb6, 0x98, 0x00, 0xf2, 0xf5, 0x08, 0x1a, 0xc5, \n  0xee, 0x01, 0x49, 0xfc, 0x87, 0xc8, 0x06, 0x9d, 0x10, 0x01, 0xd0, 0x56, 0xfa, 0x79, 0xca, 0xfb, \n  0x82, 0xd9, 0x01, 0x61, 0x67, 0xfc, 0x43, 0xcc, 0xfc, 0x1f, 0x48, 0xfc, 0x72, 0x2a, 0xff, 0x21, \n  0x9e, 0xfd, 0x34, 0x1f, 0xfd, 0x9f, 0x2f, 0xfe, 0xfe, 0x56, 0x01, 0x3d, 0x62, 0x01, 0x98, 0x9d, \n  0x00, 0x72, 0x9b, 0x03, 0xb7, 0x0d, 0x01, 0xb3, 0x92, 0xff, 0x1e, 0xf1, 0xfd, 0xfa, 0xde, 0xfc, \n  0x88, 0x8d, 0xfc, 0x2c, 0xb6, 0xfc, 0x4f, 0x9a, 0x32, 0x41, 0x50, 0x26, 0xe6, 0x08, 0xec, 0x8b, \n  0x40, 0x00, 0x46, 0x2e, 0x10, 0x15, 0xdf, 0xfc, 0x6f, 0x1e, 0x04, 0x35, 0x47, 0x08, 0x1d, 0xde, \n  0xec, 0xcd, 0xfc, 0xfd, 0x59, 0xc3, 0x06, 0x23, 0x38, 0xff, 0x73, 0x52, 0xfb, 0x02, 0xa0, 0xfb, \n  0x12, 0x9b, 0x00, 0xa8, 0x39, 0xfc, 0xe2, 0x44, 0xfd, 0x7b, 0xea, 0xfb, 0xf6, 0x60, 0xff, 0xb9, \n  0x2b, 0xfe, 0x2d, 0xfe, 0xfc, 0xf8, 0xee, 0xfd, 0x14, 0xc8, 0x00, 0x3c, 0x81, 0x01, 0x83, 0xb7, \n  0x00, 0xb5, 0xb2, 0x04, 0x81, 0x7b, 0x01, 0x2d, 0xcb, 0xfe, 0x6d, 0x58, 0xfe, 0x61, 0xa6, 0xfc, \n  0x5e, 0x3c, 0xfc, 0x61, 0xa3, 0xfc, 0x73, 0x25, 0x37, 0x3b, 0x18, 0x26, 0x33, 0xda, 0xe8, 0x58, \n  0x5e, 0x02, 0x1f, 0x85, 0x0c, 0x32, 0x0b, 0xfc, 0x35, 0xfc, 0x06, 0xd7, 0xca, 0x07, 0x99, 0xf3, \n  0xeb, 0x9d, 0x14, 0xff, 0x30, 0xad, 0x06, 0xbb, 0x6a, 0xfd, 0x9e, 0xbb, 0xfc, 0x31, 0xfb, 0xfa, \n  0xae, 0x6f, 0xff, 0x64, 0x5e, 0xfc, 0x26, 0x4c, 0xfd, 0xc7, 0x3c, 0xfc, 0x69, 0x57, 0xff, 0x56, \n  0x95, 0xfe, 0x8a, 0x4e, 0xfd, 0x3f, 0x82, 0xfd, 0xed, 0x77, 0x00, 0x31, 0x66, 0x01, 0x28, 0x8e, \n  0x00, 0x42, 0x12, 0x06, 0x04, 0x0b, 0x02, 0x10, 0xc6, 0xfd, 0x46, 0xaf, 0xfe, 0xa9, 0x79, 0xfc, \n  0xa9, 0xbb, 0xfb, 0x11, 0xf2, 0xfc, 0x65, 0x99, 0x3a, 0x4f, 0x80, 0x26, 0x3b, 0xae, 0xe6, 0x21, \n  0x28, 0x04, 0xaa, 0x15, 0x09, 0xed, 0x06, 0xfb, 0x08, 0xfa, 0x08, 0x53, 0xad, 0x07, 0xc8, 0x32, \n  0xec, 0x88, 0x87, 0xff, 0x1d, 0x32, 0x06, 0x92, 0x58, 0xfc, 0x07, 0xfa, 0xfd, 0x38, 0x37, 0xfa, \n  0x22, 0x61, 0xfe, 0x69, 0xba, 0xfc, 0xee, 0x6f, 0xfd, 0x4d, 0x93, 0xfc, 0x48, 0x4e, 0xff, 0xcb, \n  0xe6, 0xfe, 0xf9, 0xe5, 0xfd, 0x06, 0x1f, 0xfd, 0xfe, 0x37, 0x00, 0x8a, 0x91, 0x01, 0x68, 0xfd, \n  0xff, 0x9a, 0x2d, 0x07, 0xd2, 0xe8, 0x02, 0x8a, 0xe8, 0xfc, 0x69, 0x93, 0xfe, 0x9c, 0x97, 0xfc, \n  0x93, 0x5c, 0xfb, 0xfc, 0x68, 0xfd, 0xc1, 0xb8, 0x3c, 0xc7, 0x7f, 0x27, 0xa7, 0xca, 0xe5, 0x67, \n  0xee, 0x04, 0x34, 0x0f, 0x06, 0x2f, 0x96, 0xf9, 0x90, 0xe9, 0x09, 0xf8, 0xd3, 0x07, 0x17, 0x18, \n  0xed, 0x69, 0x59, 0xff, 0x18, 0x4f, 0x05, 0x3a, 0xaa, 0xfb, 0xed, 0xe0, 0xfe, 0x75, 0x87, 0xf9, \n  0x0e, 0x2f, 0xfd, 0xd8, 0x3f, 0xfd, 0x3e, 0xd2, 0xfd, 0x9f, 0x2e, 0xfc, 0x4f, 0x8f, 0xff, 0xf0, \n  0x0a, 0xff, 0x17, 0x44, 0xfe, 0x6c, 0x2c, 0xfd, 0x18, 0x97, 0xff, 0x05, 0x54, 0x02, 0x70, 0x09, \n  0xff, 0x9c, 0xed, 0x06, 0xbc, 0x0b, 0x04, 0x56, 0xb8, 0xfc, 0xb0, 0x96, 0xfd, 0xd6, 0xf5, 0xfc, \n  0x87, 0x7d, 0xfb, 0x35, 0x64, 0xfd, 0x36, 0x9d, 0x3d, 0x6d, 0xd3, 0x28, 0x0f, 0x8c, 0xe6, 0xd8, \n  0xd7, 0x04, 0x77, 0x90, 0x03, 0xa2, 0xec, 0xf7, 0xeb, 0xf9, 0x09, 0xe7, 0x42, 0x08, 0x10, 0x67, \n  0xee, 0x83, 0x06, 0xff, 0xdc, 0x31, 0x04, 0x16, 0x2a, 0xfb, 0x2c, 0xb5, 0xff, 0x20, 0x16, 0xf9, \n  0x56, 0x2a, 0xfc, 0x01, 0xe4, 0xfd, 0x8c, 0x47, 0xfe, 0xd9, 0x52, 0xfb, 0x61, 0x1b, 0x00, 0x18, \n  0x2b, 0xff, 0xcd, 0x3f, 0xfe, 0xab, 0x06, 0xfe, 0xb4, 0xc9, 0xfe, 0x64, 0x58, 0x03, 0x1b, 0x0f, \n  0xfe, 0x1e, 0x0f, 0x05, 0x2a, 0x51, 0x05, 0x6c, 0x8e, 0xfd, 0x8a, 0x6f, 0xfc, 0xa0, 0x5b, 0xfd, \n  0x0d, 0x13, 0xfc, 0x50, 0x44, 0xfd, 0x4c, 0x1a, 0x3d, 0xf7, 0xd6, 0x2a, 0x6a, 0xa9, 0xe8, 0xe2, \n  0x28, 0x04, 0x8e, 0x57, 0x01, 0xeb, 0x73, 0xf6, 0xa2, 0xfe, 0x08, 0xb5, 0xf6, 0x08, 0xe2, 0x18, \n  0xf0, 0x08, 0x6e, 0xfe, 0x3b, 0x49, 0x03, 0x27, 0x65, 0xfa, 0xfb, 0xdf, 0x00, 0x4e, 0x00, 0xf9, \n  0xa2, 0x78, 0xfb, 0x7a, 0x51, 0xfe, 0x93, 0xa6, 0xfe, 0xef, 0x85, 0xfa, 0x6f, 0x87, 0x00, 0x4e, \n  0x98, 0xff, 0xc1, 0xae, 0xfd, 0x43, 0xf7, 0xff, 0x14, 0xed, 0xfd, 0xdc, 0x6b, 0x03, 0x43, 0xea, \n  0xfd, 0x70, 0x4c, 0x02, 0x86, 0x99, 0x05, 0x86, 0x96, 0xff, 0x01, 0x45, 0xfc, 0xd1, 0xdc, 0xfc, \n  0xcb, 0x5e, 0xfd, 0x08, 0x89, 0xfd, 0xfd, 0x74, 0x3c, 0x4b, 0xc4, 0x2b, 0x10, 0x38, 0xec, 0x87, \n  0x52, 0x03, 0xf1, 0x3e, 0xff, 0x4c, 0x20, 0xf5, 0x79, 0x19, 0x07, 0x1a, 0x09, 0x0a, 0xf0, 0x54, \n  0xf1, 0xd6, 0x37, 0xfe, 0x6a, 0x4e, 0x02, 0x03, 0x85, 0xf9, 0x06, 0x68, 0x02, 0x24, 0x4c, 0xf9, \n  0xac, 0xd5, 0xfa, 0xa2, 0x6a, 0xfe, 0x0f, 0x00, 0xff, 0x18, 0xca, 0xf9, 0x87, 0xfe, 0x00, 0x08, \n  0xdd, 0xff, 0xbc, 0x76, 0xfd, 0x54, 0x1d, 0x02, 0x68, 0x72, 0xfc, 0x72, 0xd0, 0x02, 0x54, 0xdd, \n  0xfe, 0x72, 0x3b, 0xff, 0x7a, 0xc0, 0x04, 0x3a, 0x66, 0x02, 0x4c, 0xba, 0xfc, 0x29, 0x77, 0xfc, \n  0xbc, 0x1b, 0xff, 0x68, 0xe7, 0xfc, 0x63, 0x1c, 0x3b, 0xf5, 0xa0, 0x2c, 0xd5, 0x2f, 0xf0, 0x09, \n  0x75, 0x02, 0x3d, 0xa0, 0xfd, 0xad, 0x3c, 0xf3, 0xd5, 0xda, 0x04, 0x8d, 0x1d, 0x0b, 0x9d, 0xf7, \n  0xf1, 0x07, 0x47, 0xfe, 0xaf, 0x47, 0x01, 0xa7, 0xc5, 0xf8, 0xb5, 0x49, 0x04, 0x95, 0x89, 0xf9, \n  0xe0, 0x46, 0xfa, 0xf1, 0x05, 0xfe, 0xba, 0x35, 0xff, 0x52, 0xae, 0xf9, 0x12, 0x89, 0x00, 0x30, \n  0x22, 0x01, 0xb4, 0x01, 0xfd, 0x04, 0x96, 0x02, 0x81, 0x21, 0xfc, 0xe2, 0x3f, 0x01, 0x71, 0x18, \n  0x00, 0xda, 0xad, 0xfd, 0x35, 0x89, 0x02, 0xcd, 0x3d, 0x04, 0xc5, 0xec, 0xfe, 0xdc, 0x69, 0xfc, \n  0x78, 0x30, 0xff, 0x4c, 0xbb, 0xfc, 0x9f, 0x7b, 0x39, 0x76, 0x7a, 0x2d, 0x1a, 0xaf, 0xf3, 0x1d, \n  0x20, 0x03, 0xdc, 0xfb, 0xfb, 0x43, 0x1e, 0xf1, 0xff, 0x3b, 0x03, 0x78, 0x3c, 0x0b, 0x24, 0xfd, \n  0xf2, 0x42, 0x52, 0xfe, 0x2d, 0xea, 0x00, 0xb9, 0x7f, 0xf8, 0x66, 0x2d, 0x06, 0xa7, 0x0e, 0xfa, \n  0x95, 0x7d, 0xf9, 0xbf, 0xee, 0xfd, 0xa1, 0x1a, 0xff, 0x77, 0x5c, 0xfa, 0xf5, 0x5b, 0x00, 0x10, \n  0xd9, 0x01, 0x6f, 0x12, 0xfc, 0x43, 0xbd, 0x02, 0x84, 0x9e, 0xfc, 0x2c, 0x4d, 0xff, 0xdd, 0xea, \n  0x01, 0x11, 0xbf, 0xfd, 0x1b, 0x75, 0xff, 0x1d, 0xa0, 0x05, 0x35, 0x7e, 0x01, 0x7c, 0x0d, 0xfc, \n  0x38, 0x61, 0xff, 0x5d, 0xc6, 0xfd, 0xaf, 0x2a, 0x37, 0x7e, 0xaa, 0x2e, 0x56, 0xb3, 0xf6, 0x68, \n  0x32, 0x04, 0x55, 0xf0, 0xfa, 0xd6, 0x96, 0xee, 0xd0, 0xb2, 0x01, 0x86, 0x98, 0x0a, 0xc4, 0x43, \n  0xf4, 0x04, 0x7b, 0xfe, 0x5d, 0xb7, 0x00, 0x5b, 0xdc, 0xf8, 0x48, 0x8d, 0x07, 0x4e, 0x69, 0xfa, \n  0xdb, 0x13, 0xf9, 0xfa, 0x52, 0xfd, 0x56, 0x5e, 0xff, 0xf5, 0x51, 0xfc, 0x79, 0x3a, 0xfe, 0x8f, \n  0x0d, 0x02, 0x76, 0x45, 0xfc, 0x70, 0x4c, 0x01, 0x5a, 0x02, 0xfe, 0xed, 0xe9, 0xfe, 0x7f, 0x55, \n  0x01, 0x4a, 0x41, 0x00, 0x32, 0x25, 0xfe, 0xee, 0x18, 0x03, 0x21, 0x83, 0x03, 0xfa, 0xc4, 0xfd, \n  0x7c, 0x58, 0xff, 0x44, 0x80, 0xfd, 0x21, 0x61, 0x35, 0x29, 0x94, 0x2e, 0x3e, 0xbd, 0xf9, 0x18, \n  0x12, 0x05, 0x32, 0x78, 0xfa, 0x42, 0x4d, 0xec, 0xfa, 0x9a, 0xff, 0x00, 0x9b, 0x09, 0x61, 0xe5, \n  0xf5, 0x6d, 0xde, 0xfe, 0x09, 0x85, 0x00, 0xab, 0xac, 0xf9, 0xbc, 0x5f, 0x08, 0x87, 0xd0, 0xfa, \n  0x8b, 0xe4, 0xf7, 0x23, 0x7c, 0xfe, 0x86, 0x69, 0xff, 0x7e, 0x41, 0xfc, 0x5b, 0x44, 0xfd, 0xa9, \n  0x1e, 0x01, 0xaf, 0x86, 0xfc, 0x0a, 0xfe, 0x00, 0xb2, 0xc5, 0xfe, 0xd9, 0xfd, 0xfe, 0x66, 0x03, \n  0x01, 0x84, 0x39, 0x03, 0xc2, 0x56, 0xfd, 0xe1, 0xe8, 0xfe, 0x3d, 0x64, 0x05, 0x7f, 0x46, 0xff, \n  0x3d, 0xdc, 0xfe, 0x4e, 0xe1, 0xfd, 0x74, 0x5b, 0x34, 0x52, 0x48, 0x2d, 0x11, 0x29, 0xfc, 0xc3, \n  0xc5, 0x06, 0x09, 0xb9, 0xf9, 0x6d, 0xa3, 0xea, 0x87, 0x66, 0xfd, 0xa9, 0xf0, 0x07, 0xf0, 0xcb, \n  0xf8, 0x27, 0x59, 0xff, 0x2f, 0x29, 0xff, 0x68, 0x7c, 0xfc, 0x43, 0xb7, 0x07, 0x0a, 0x46, 0xfa, \n  0x2f, 0xe2, 0xf9, 0x63, 0xce, 0xfd, 0x50, 0x80, 0xfe, 0xbe, 0x0d, 0xfd, 0x72, 0x76, 0xfb, 0x76, \n  0x2a, 0x00, 0xb8, 0x4d, 0xfe, 0x2c, 0x6c, 0x00, 0xb2, 0x31, 0xfe, 0xa4, 0xc1, 0x01, 0x57, 0xa0, \n  0x00, 0x36, 0x4b, 0x02, 0x60, 0x2d, 0x00, 0xee, 0x7f, 0xfc, 0xdb, 0xb5, 0x02, 0x27, 0xad, 0x00, \n  0x96, 0x2e, 0x00, 0x90, 0x6f, 0xfe, 0xc5, 0x35, 0x33, 0xa1, 0x18, 0x2c, 0x34, 0xbd, 0xfd, 0x5e, \n  0x93, 0x08, 0x66, 0x27, 0xf9, 0xdc, 0x49, 0xe9, 0x39, 0x92, 0xfa, 0x4d, 0x7d, 0x07, 0x5f, 0x5e, \n  0xfb, 0x33, 0xc2, 0xff, 0x95, 0x80, 0xfe, 0xcd, 0xc3, 0xfd, 0xbd, 0xca, 0x07, 0xc4, 0xf0, 0xfa, \n  0xae, 0x11, 0xfa, 0x69, 0x4e, 0xfd, 0x8f, 0xe3, 0xfd, 0x48, 0x53, 0xfc, 0x64, 0xed, 0xfa, 0x17, \n  0xd8, 0x00, 0x3d, 0xd6, 0xfd, 0x00, 0xdb, 0x00, 0xf4, 0xea, 0xff, 0x46, 0x51, 0x01, 0xa6, 0x79, \n  0x00, 0xfd, 0xa3, 0x02, 0x5b, 0x19, 0x02, 0x59, 0x6a, 0xfb, 0x0b, 0x29, 0xff, 0x7d, 0xdb, 0x00, \n  0x92, 0xdb, 0x01, 0x0d, 0x2c, 0xff, 0xb7, 0x81, 0x33, 0x82, 0xd6, 0x28, 0x65, 0x46, 0xff, 0x6a, \n  0xd1, 0x0a, 0xa1, 0x4e, 0xf7, 0x09, 0x00, 0xe9, 0x56, 0x13, 0xf9, 0x86, 0xc7, 0x05, 0x1b, 0x66, \n  0xff, 0xde, 0xe8, 0xff, 0x07, 0xee, 0xfb, 0xcd, 0x8e, 0x01, 0xf4, 0x23, 0x07, 0x98, 0xf8, 0xf9, \n  0x78, 0xe1, 0xfb, 0xca, 0x89, 0xfb, 0xcf, 0x89, 0xfc, 0x0f, 0x97, 0xfd, 0x61, 0xee, 0xfa, 0x79, \n  0x97, 0xff, 0x57, 0xa9, 0xff, 0x2f, 0xdb, 0x01, 0x17, 0x0d, 0xff, 0x12, 0xe5, 0x00, 0xe4, 0x32, \n  0x02, 0x5b, 0xd2, 0x02, 0xe5, 0xb8, 0x00, 0x16, 0x60, 0xfd, 0xe4, 0x58, 0xfd, 0x8d, 0x2b, 0xfe, \n  0x79, 0xff, 0x02, 0xde, 0x60, 0x00, 0x4f, 0xca, 0x32, 0x4d, 0xe9, 0x25, 0xe9, 0x72, 0x00, 0x3e, \n  0xf7, 0x0c, 0x0d, 0x61, 0xf5, 0x05, 0xa4, 0xe9, 0x26, 0xce, 0xf7, 0xd5, 0x8f, 0x04, 0x04, 0x38, \n  0x02, 0x48, 0x74, 0x00, 0xe3, 0x74, 0xfa, 0x3b, 0xce, 0x02, 0xe2, 0x5a, 0x07, 0x54, 0xaa, 0xf9, \n  0xbb, 0xc5, 0xfb, 0x2a, 0xa1, 0xf9, 0xa5, 0xc4, 0xfd, 0x90, 0xe9, 0xfd, 0xf5, 0x7e, 0xf9, 0xf0, \n  0xe8, 0x01, 0x23, 0x11, 0x00, 0x6f, 0x06, 0x00, 0x12, 0x4d, 0x00, 0xf7, 0x37, 0x01, 0x0c, 0x9b, \n  0x01, 0x4f, 0x86, 0x03, 0x7a, 0xf1, 0xff, 0x89, 0x4f, 0xfe, 0x93, 0xc1, 0xfd, 0x30, 0x19, 0xfb, \n  0x01, 0x61, 0x02, 0xe9, 0x71, 0x01, 0x92, 0x2b, 0x30, 0x33, 0x5c, 0x23, 0x7b, 0xb1, 0x03, 0x16, \n  0x65, 0x0d, 0xe7, 0xda, 0xf2, 0xbb, 0x9f, 0xee, 0x0e, 0xcd, 0xf4, 0x22, 0xaf, 0x00, 0x9a, 0x35, \n  0x09, 0x75, 0xa4, 0xff, 0x63, 0x76, 0xf6, 0x9b, 0x24, 0x06, 0x93, 0xd5, 0x06, 0x85, 0xbb, 0xf8, \n  0x07, 0x08, 0xfc, 0xef, 0x45, 0xf9, 0x1d, 0xe6, 0xfd, 0x95, 0x7e, 0xfe, 0xc8, 0x82, 0xfa, 0x85, \n  0x04, 0x02, 0x52, 0x45, 0xff, 0x45, 0xc5, 0xff, 0x6d, 0xe2, 0x01, 0x48, 0x21, 0x00, 0x89, 0xc2, \n  0x00, 0xd6, 0xe8, 0x04, 0xf8, 0x24, 0x00, 0xe2, 0x68, 0xfd, 0x0e, 0xef, 0xfe, 0xb5, 0xa6, 0xfa, \n  0x01, 0xb3, 0xff, 0x30, 0xe9, 0x01, 0x00, 0x8b, 0x30, 0x78, 0x5f, 0x21, 0x8d, 0x0a, 0x03, 0x30, \n  0x5b, 0x0a, 0xbd, 0x58, 0xf3, 0xd7, 0xbc, 0xf3, 0xee, 0x43, 0xf3, 0x3c, 0x58, 0xff, 0x36, 0x9e, \n  0x0b, 0x94, 0x00, 0xff, 0xab, 0x16, 0xf6, 0x31, 0x75, 0x06, 0x85, 0x7c, 0x05, 0x1c, 0x43, 0xf9, \n  0xf7, 0xb3, 0xfc, 0xe5, 0xd5, 0xf7, 0xe4, 0xbe, 0xff, 0x6c, 0xd7, 0xff, 0xf7, 0x1b, 0xfa, 0x32, \n  0xc7, 0x01, 0x64, 0x1a, 0xff, 0x03, 0x74, 0x00, 0x07, 0x8f, 0x01, 0x10, 0x90, 0xff, 0xc0, 0x2d, \n  0x01, 0xbc, 0x1b, 0x05, 0x9c, 0x3f, 0x00, 0x64, 0x7f, 0xfd, 0x5d, 0x6f, 0xfe, 0x7a, 0x29, 0xfb, \n  0x2c, 0x14, 0xff, 0x32, 0x8f, 0x01, 0xa8, 0x7c, 0x32, 0xe2, 0x1a, 0x1f, 0xf0, 0x78, 0xfd, 0x40, \n  0x8b, 0x0b, 0xb6, 0x12, 0xf3, 0x83, 0xbd, 0xf5, 0xf4, 0x54, 0xf7, 0xa0, 0xf1, 0xfb, 0x1f, 0x60, \n  0x0b, 0x6f, 0x61, 0x00, 0xd2, 0x5e, 0xf5, 0x9b, 0x91, 0x05, 0xe1, 0x68, 0x05, 0x55, 0x04, 0xf9, \n  0x51, 0x83, 0xfc, 0xf8, 0x1c, 0xfa, 0x0c, 0xd7, 0xff, 0x45, 0x67, 0xff, 0x55, 0x9b, 0xfa, 0xe9, \n  0x04, 0x02, 0x8f, 0x9c, 0xff, 0x87, 0x08, 0xff, 0xe5, 0xe6, 0x00, 0x55, 0x0c, 0x01, 0xff, 0x8e, \n  0x01, 0x80, 0xbd, 0x03, 0x9b, 0x62, 0x00, 0x80, 0xfa, 0xfd, 0xed, 0xbf, 0xfd, 0x0b, 0xe7, 0xfb, \n  0x72, 0x6b, 0xff, 0x02, 0x86, 0x00, 0xdc, 0x66, 0x32, 0xb7, 0xd2, 0x1b, 0x7e, 0xce, 0xf9, 0xf4, \n  0x29, 0x0f, 0x9d, 0x2c, 0xf4, 0x1a, 0xf3, 0xf4, 0x66, 0x4b, 0xf9, 0x70, 0xc4, 0xfd, 0x7d, 0xac, \n  0x08, 0xe0, 0xc4, 0xfe, 0x1b, 0x7f, 0xf7, 0xba, 0xde, 0x04, 0x8e, 0x11, 0x05, 0x66, 0x84, 0xf8, \n  0x37, 0xe8, 0xfd, 0x9b, 0xb7, 0xfb, 0xda, 0x81, 0xff, 0xff, 0xf1, 0xfe, 0x92, 0xe9, 0xfa, 0x5e, \n  0xd8, 0x02, 0x9c, 0x01, 0xff, 0xed, 0x3d, 0xfe, 0x0f, 0x09, 0x01, 0x4a, 0x81, 0x01, 0x1b, 0xca, \n  0x01, 0x85, 0x62, 0x03, 0x4b, 0xea, 0xff, 0x4f, 0x24, 0xfe, 0x9c, 0xd6, 0xfd, 0xc5, 0x6a, 0xfc, \n  0xde, 0x14, 0x00, 0x39, 0x1d, 0x00, 0x60, 0x24, 0x30, 0x85, 0x3d, 0x19, 0x06, 0xee, 0xf7, 0xba, \n  0xc2, 0x12, 0xdc, 0x8c, 0xf5, 0x5c, 0xf2, 0xf2, 0xe1, 0x3f, 0xfd, 0xfe, 0xc4, 0xfd, 0x6e, 0xbc, \n  0x04, 0x2b, 0xd6, 0xff, 0x22, 0xa2, 0xf8, 0x66, 0xbf, 0x03, 0x57, 0x0f, 0x05, 0x0c, 0xba, 0xf9, \n  0x58, 0x35, 0xfe, 0x99, 0xa6, 0xfc, 0x0d, 0x78, 0xff, 0xac, 0x9f, 0xfe, 0x7b, 0xf3, 0xfb, 0x77, \n  0xf7, 0x01, 0xea, 0x9e, 0xfe, 0x0b, 0xef, 0xfe, 0xff, 0xde, 0x00, 0x80, 0xd5, 0x00, 0x1e, 0x63, \n  0x02, 0x81, 0x99, 0x03, 0xcb, 0x1b, 0xff, 0x67, 0x18, 0xfe, 0x01, 0x67, 0xfe, 0x74, 0xfd, 0xfc, \n  0x6d, 0x02, 0x00, 0xb2, 0xe7, 0x00, 0x8f, 0xff, 0x2b, 0x74, 0x0c, 0x17, 0xb6, 0x2d, 0xfa, 0xfb, \n  0x44, 0x12, 0x57, 0x42, 0xf6, 0xf8, 0x47, 0xf6, 0x5e, 0x65, 0xfd, 0x79, 0x54, 0xfb, 0xfc, 0x0f, \n  0x05, 0x03, 0xfd, 0xff, 0x12, 0xab, 0xf8, 0xf0, 0x28, 0x03, 0xf2, 0x92, 0x05, 0xf1, 0x04, 0xfb, \n  0x98, 0x0f, 0xfe, 0x4e, 0x0c, 0xfd, 0x11, 0x98, 0xff, 0xdc, 0x34, 0xff, 0x1b, 0xda, 0xfb, 0x72, \n  0x0b, 0x01, 0xb8, 0x09, 0xff, 0xe8, 0x3e, 0xff, 0xb0, 0x72, 0x00, 0x0b, 0xde, 0x00, 0xdb, 0x70, \n  0x02, 0x50, 0x37, 0x03, 0xc3, 0x39, 0xff, 0xb9, 0xc0, 0xfd, 0x02, 0xde, 0xfe, 0xd4, 0xfb, 0xfd, \n  0xec, 0x8d, 0xff, 0xaa, 0xf4, 0x00, 0xd5, 0xa0, 0x26, 0x4c, 0x78, 0x16, 0xa6, 0xae, 0x00, 0x69, \n  0xb9, 0x0b, 0x73, 0x77, 0xf4, 0xb5, 0x93, 0xf9, 0xfc, 0x44, 0x00, 0xda, 0x6e, 0xff, 0x35, 0x64, \n  0xff, 0x82, 0xcc, 0xfd, 0xd7, 0x17, 0xfb, 0xf7, 0x42, 0x04, 0x45, 0x34, 0x03, 0x96, 0xa4, 0xfa, \n  0x75, 0xa5, 0x00, 0x81, 0xcb, 0xfc, 0x6a, 0xd0, 0xfe, 0x8f, 0xd2, 0xff, 0x94, 0x27, 0xfc, 0x8a, \n  0xf6, 0x00, 0xd1, 0x2c, 0xff, 0x21, 0x14, 0xfe, 0x89, 0xfa, 0x00, 0xd8, 0x93, 0x00, 0x10, 0xea, \n  0xfe, 0xb0, 0x3d, 0x02, 0xdf, 0xe7, 0x00, 0x83, 0x82, 0xff, 0x2c, 0x55, 0x00, 0xa2, 0x93, 0xfd, \n  0x83, 0x36, 0xff, 0x8c, 0x7a, 0xff, 0xae, 0x8b, 0x20, 0xbe, 0xa2, 0x15, 0xec, 0xc9, 0x03, 0x5d, \n  0x3b, 0x09, 0x25, 0x6e, 0xf7, 0x4d, 0xa9, 0xfc, 0x2d, 0xb2, 0xfe, 0x3d, 0x86, 0xfe, 0x37, 0x6c, \n  0x00, 0xcb, 0x6f, 0xfe, 0xa7, 0xe6, 0xfa, 0xab, 0x80, 0x03, 0xe3, 0xda, 0x03, 0x14, 0xc6, 0xfb, \n  0xeb, 0x39, 0x00, 0xe5, 0x55, 0xfd, 0x60, 0x3e, 0xff, 0x00, 0xb5, 0xff, 0xd8, 0xca, 0xfc, 0x0d, \n  0x9f, 0x00, 0x90, 0x2c, 0xff, 0x5a, 0x6e, 0xfe, 0xb9, 0xc2, 0x00, 0xec, 0x66, 0x00, 0xd3, 0x60, \n  0xff, 0xed, 0x40, 0x02, 0x55, 0xd9, 0x00, 0x91, 0xe7, 0xff, 0x3d, 0xc5, 0xff, 0xcf, 0xc5, 0xfd, \n  0x09, 0x0c, 0x00, 0x1c, 0xfd, 0xff, 0xea, 0x05, 0x1a, 0x62, 0x9b, 0x15, 0x4d, 0x9a, 0x06, 0x52, \n  0x76, 0x06, 0xdb, 0x7e, 0xfa, 0x7c, 0x6a, 0xfe, 0x29, 0xd2, 0xfd, 0x92, 0xce, 0xfd, 0xc4, 0xce, \n  0x00, 0xed, 0xdb, 0xfe, 0x31, 0x5b, 0xfb, 0xcd, 0x02, 0x03, 0x84, 0x37, 0x03, 0xd2, 0x09, 0xfd, \n  0x4b, 0x0f, 0x00, 0xe3, 0xce, 0xfd, 0x9d, 0x34, 0xff, 0x3b, 0x75, 0xff, 0x8a, 0x9e, 0xfd, 0xa8, \n  0x62, 0x00, 0x17, 0xe7, 0xfe, 0xa3, 0x89, 0xfe, 0x78, 0xd5, 0x00, 0x55, 0x21, 0x00, 0x56, 0xcc, \n  0xff, 0x30, 0xc3, 0x01, 0x3d, 0xaa, 0x00, 0xcb, 0x5e, 0x00, 0x82, 0x93, 0xff, 0xd2, 0x41, 0xfe, \n  0x8b, 0x8b, 0x00, 0x26, 0x85, 0x00, 0x63, 0xc8, 0x15, 0xd1, 0x72, 0x14, 0xa5, 0x00, 0x07, 0xae, \n  0x8d, 0x06, 0x2c, 0x8d, 0xfc, 0xa6, 0xf5, 0xfd, 0x2f, 0x8d, 0xfe, 0x4c, 0x77, 0xfe, 0xda, 0x7f, \n  0x00, 0xdd, 0xb7, 0xfe, 0x80, 0x6b, 0xfc, 0x99, 0x9f, 0x02, 0x2d, 0xc5, 0x02, 0xf5, 0xa5, 0xfd, \n  0xe7, 0x02, 0x00, 0x5c, 0x80, 0xfe, 0x50, 0x02, 0xff, 0xb1, 0xa8, 0xff, 0xb3, 0x33, 0xfe, 0x5d, \n  0xe9, 0xff, 0x41, 0x0f, 0xff, 0x5b, 0x30, 0xff, 0x5b, 0x58, 0x00, 0xfd, 0xdb, 0xff, 0xbe, 0x51, \n  0x00, 0xf6, 0x74, 0x01, 0xb4, 0x03, 0x01, 0x3c, 0xaa, 0x00, 0xe3, 0xa6, 0xff, 0xfc, 0x47, 0xff, \n  0x28, 0xf2, 0x00, 0xee, 0x05, 0x00, 0xb6, 0x3d, 0x13, 0x19, 0x76, 0x12, 0x71, 0xb6, 0x06, 0x9c, \n  0x3a, 0x07, 0x72, 0x81, 0xfd, 0x61, 0x73, 0xfd, 0xfd, 0x86, 0xff, 0x43, 0x75, 0xff, 0x02, 0xad, \n  0xff, 0xbb, 0xcb, 0xfe, 0xb0, 0x93, 0xfd, 0x91, 0x02, 0x02, 0xed, 0x5f, 0x02, 0x93, 0xe2, 0xfd, \n  0xa4, 0x45, 0x00, 0xb7, 0x21, 0xff, 0x4d, 0xaf, 0xfe, 0xc1, 0xbd, 0xff, 0x0a, 0xde, 0xfe, 0x4b, \n  0xbf, 0xff, 0xd3, 0x14, 0xff, 0x61, 0x76, 0xff, 0x7e, 0xe1, 0xff, 0x04, 0x10, 0x00, 0x48, 0xc4, \n  0x00, 0x60, 0x80, 0x01, 0x75, 0xad, 0x01, 0xd7, 0xaa, 0x00, 0xf6, 0xbd, 0xff, 0xeb, 0xe4, 0xff, \n  0x4e, 0x8e, 0x00, 0xdf, 0x64, 0xff, 0x1a, 0xbc, 0x10, 0x3f, 0x9a, 0x10, 0xed, 0x13, 0x07, 0x06, \n  0x67, 0x07, 0x9e, 0x58, 0xfe, 0x84, 0xa0, 0xfd, 0x24, 0xe9, 0xff, 0x51, 0x46, 0x00, 0x5e, 0x82, \n  0xff, 0xc6, 0x29, 0xff, 0x10, 0x1a, 0xfe, 0xce, 0x4b, 0x01, 0x82, 0x5b, 0x02, 0xa7, 0x9c, 0xfe, \n  0xeb, 0x48, 0x00, 0x8d, 0x3f, 0xff, 0xcd, 0xe6, 0xfe, 0xd9, 0x4b, 0x00, 0x22, 0x4f, 0xff, 0xb1, \n  0x28, 0xff, 0x3b, 0x82, 0xff, 0x8e, 0xe7, 0xff, 0x1a, 0xaf, 0xff, 0x35, 0xd8, 0x00, 0x6c, 0x38, \n  0x01, 0xd6, 0xc3, 0x01, 0x87, 0xf0, 0x01, 0x0d, 0x4d, 0x00, 0x82, 0xb8, 0xff, 0xc7, 0xda, 0xff, \n  0xdb, 0x23, 0x00, 0xd0, 0x24, 0xff, 0xbe, 0x5b, 0x0e, 0x85, 0xe7, 0x0e, 0x4e, 0x81, 0x07, 0x20, \n  0x77, 0x07, 0x04, 0x25, 0xff, 0x57, 0xc5, 0xfd, 0xd6, 0x11, 0x00, 0x07, 0x37, 0x01, 0x31, 0x7f, \n  0xff, 0x20, 0x3d, 0xff, 0xfb, 0x6f, 0xfe, 0x39, 0xe7, 0x00, 0xcc, 0x60, 0x02, 0xa0, 0x00, 0xff, \n  0x5d, 0x61, 0x00, 0x38, 0x8a, 0xff, 0x45, 0x45, 0xff, 0x55, 0x96, 0x00, 0xa9, 0x45, 0xff, 0xb1, \n  0x3d, 0xff, 0x8c, 0x49, 0x00, 0x10, 0x63, 0x00, 0xad, 0x27, 0x00, 0x4e, 0x22, 0x01, 0xc2, 0x39, \n  0x01, 0x76, 0xfa, 0x01, 0x57, 0x51, 0x01, 0x0e, 0x8b, 0xff, 0x41, 0xdd, 0xff, 0xd2, 0x09, 0x00, \n  0xf0, 0xe2, 0xff, 0xb3, 0xf6, 0xfe, 0x65, 0x8e, 0x0c, 0x24, 0xf2, 0x0d, 0x8e, 0x5d, 0x07, 0x5b, \n  0xc4, 0x06, 0xe7, 0x15, 0x00, 0x6d, 0x41, 0xfe, 0x8a, 0x41, 0x00, 0x02, 0x96, 0x01, 0xe6, 0x89, \n  0xff, 0xab, 0xa8, 0xff, 0x70, 0xbc, 0xfe, 0x4b, 0x5b, 0x00, 0xc8, 0x66, 0x02, 0xef, 0xe7, 0xff, \n  0xdd, 0x38, 0x00, 0x9c, 0xa6, 0xff, 0x86, 0xd1, 0xff, 0x41, 0xab, 0x00, 0xc1, 0xd0, 0xff, 0xef, \n  0x32, 0x00, 0x0e, 0x19, 0x01, 0x91, 0x49, 0x00, 0x94, 0x1d, 0x00, 0x91, 0x62, 0x01, 0x4a, 0xe7, \n  0x00, 0x95, 0x0c, 0x01, 0x01, 0xc6, 0x00, 0x75, 0xcc, 0xff, 0xe1, 0x0e, 0x00, 0xa6, 0xef, 0xff, \n  0xb7, 0x83, 0xff, 0x45, 0x19, 0xff, 0x63, 0x8d, 0x0a, 0xce, 0x72, 0x0c, 0x91, 0xe5, 0x07, 0x96, \n  0x2c, 0x07, 0xbc, 0x59, 0x00, 0xa1, 0x35, 0xfe, 0x9b, 0x80, 0x00, 0xe9, 0x4a, 0x02, 0x30, 0xcd, \n  0xff, 0x8d, 0x7f, 0xff, 0xce, 0xf3, 0xfe, 0x06, 0x73, 0x00, 0x8d, 0x74, 0x02, 0x1b, 0x42, 0x00, \n  0x33, 0x44, 0x00, 0xb9, 0xfb, 0xff, 0x0f, 0xaf, 0x00, 0x1e, 0x80, 0x01, 0x6a, 0x9e, 0x00, 0x88, \n  0x9a, 0x00, 0x64, 0xa0, 0x00, 0x52, 0x20, 0x00, 0x38, 0x01, 0x00, 0x6a, 0x8a, 0x00, 0x94, 0x9b, \n  0x00, 0xca, 0xdf, 0x00, 0x92, 0xa5, 0x00, 0xba, 0xd5, 0xff, 0x53, 0x19, 0x00, 0xc8, 0xea, 0xff, \n  0xb8, 0x48, 0xff, 0x3a, 0x4e, 0xff, 0x95, 0xa6, 0x09, 0xe0, 0xd7, 0x0b, 0xde, 0xc2, 0x07, 0x28, \n  0x2e, 0x06, 0x2d, 0x73, 0x00, 0x47, 0xd5, 0xfe, 0x1c, 0x06, 0x01, 0x4b, 0x30, 0x02, 0x34, 0xec, \n  0xff, 0xb1, 0xd9, 0xff, 0x39, 0x2a, 0xff, 0xee, 0x99, 0x00, 0x66, 0x78, 0x02, 0x1e, 0x78, 0x00, \n  0xab, 0xe5, 0x00, 0x1f, 0x80, 0x01, 0x02, 0x84, 0x01, 0xe1, 0x27, 0x01, 0x9b, 0x7c, 0x00, 0x32, \n  0x7e, 0x00, 0x9f, 0xbe, 0xff, 0x65, 0x6a, 0xff, 0x69, 0x0a, 0x00, 0x64, 0x7f, 0x00, 0x72, 0x68, \n  0x00, 0x9f, 0x8c, 0x00, 0x60, 0x62, 0x00, 0x2d, 0x13, 0x00, 0x1c, 0x30, 0x00, 0x20, 0x81, 0xff, \n  0x61, 0x41, 0xff, 0x7d, 0x38, 0xff, 0xcb, 0xa5, 0x08, 0x7d, 0x14, 0x0b, 0xc1, 0xe8, 0x07, 0x91, \n  0xf8, 0x05, 0xe1, 0x30, 0x00, 0xd4, 0x07, 0xff, 0xd4, 0xbe, 0x01, 0x84, 0x73, 0x02, 0xca, 0xce, \n  0xff, 0xb7, 0x4a, 0x00, 0xed, 0x75, 0xff, 0x78, 0x6f, 0x00, 0x49, 0x87, 0x03, 0x38, 0xf6, 0x01, \n  0x27, 0x5b, 0x01, 0x89, 0x4b, 0x01, 0x57, 0x11, 0x01, 0x02, 0xed, 0x00, 0x98, 0xd6, 0xff, 0x1d, \n  0x42, 0xff, 0xbe, 0x93, 0xff, 0xfc, 0x01, 0x00, 0x92, 0xb0, 0xff, 0xd8, 0x10, 0x00, 0x54, 0x61, \n  0x00, 0xea, 0x7d, 0x00, 0x70, 0x65, 0x00, 0x96, 0xe7, 0xff, 0x33, 0xe8, 0xff, 0x10, 0x4b, 0xff, \n  0x5a, 0x25, 0xff, 0xfe, 0x2d, 0xff, 0x55, 0x43, 0x08, 0x89, 0xec, 0x0a, 0xd6, 0xb4, 0x07, 0xde, \n  0x2b, 0x05, 0xb8, 0xfe, 0xff, 0xdb, 0xbc, 0xff, 0x13, 0x55, 0x02, 0x8b, 0xb5, 0x02, 0x14, 0x88, \n  0xff, 0x79, 0x68, 0x00, 0x2c, 0x5d, 0x01, 0x32, 0xfa, 0x01, 0x02, 0x57, 0x03, 0x8b, 0x44, 0x01, \n  0x88, 0x1f, 0x01, 0x44, 0xeb, 0x00, 0x22, 0xf1, 0xff, 0x3a, 0xed, 0xff, 0x1d, 0xac, 0xff, 0xfd, \n  0x48, 0xff, 0xfb, 0x92, 0xff, 0x9f, 0xbc, 0xff, 0x65, 0x7b, 0xff, 0xde, 0x86, 0x00, 0xfa, 0x42, \n  0x00, 0x87, 0xab, 0xff, 0x4c, 0x41, 0x00, 0x23, 0x07, 0x00, 0xec, 0x6d, 0xff, 0x67, 0x27, 0xff, \n  0xd7, 0x34, 0xff, 0x75, 0xe5, 0xfe, 0xbc, 0x91, 0x08, 0xce, 0x6a, 0x0b, 0xc2, 0xf8, 0x06, 0x24, \n  0x2b, 0x04, 0xf5, 0x33, 0x00, 0x62, 0xc1, 0x00, 0xb8, 0x56, 0x02, 0x21, 0x24, 0x03, 0x11, 0x74, \n  0x01, 0xb1, 0x9f, 0x01, 0x2a, 0xbb, 0x01, 0xa4, 0x10, 0x01, 0x90, 0x72, 0x02, 0xc3, 0xfc, 0x00, \n  0xb8, 0xe0, 0xff, 0xc0, 0xf9, 0xff, 0xe2, 0x0c, 0x00, 0xd5, 0xd7, 0xff, 0x59, 0x4b, 0xff, 0x8d, \n  0x08, 0xff, 0x42, 0x07, 0x00, 0xb5, 0x35, 0x00, 0xb5, 0x63, 0xff, 0x60, 0x00, 0x00, 0xdd, 0xa7, \n  0xff, 0x3b, 0xaf, 0xff, 0xd3, 0x52, 0x00, 0x73, 0xe7, 0xff, 0x6b, 0x25, 0xff, 0x6d, 0xea, 0xfe, \n  0x52, 0x4a, 0xff, 0x72, 0xf9, 0xfe, 0x5b, 0xf8, 0x08, 0x21, 0x86, 0x0c, 0xe0, 0xfd, 0x05, 0x85, \n  0x34, 0x03, 0x98, 0x21, 0x00, 0xea, 0x67, 0x02, 0xe4, 0x5d, 0x05, 0xfb, 0xb4, 0x03, 0xe4, 0xe3, \n  0x00, 0x41, 0xf3, 0x00, 0x28, 0x6c, 0x01, 0xb3, 0x4c, 0x00, 0xc0, 0x05, 0x01, 0xa1, 0x40, 0x00, \n  0x86, 0x1b, 0x00, 0xc6, 0xe6, 0xff, 0xea, 0x71, 0xff, 0xbb, 0xb8, 0xff, 0x11, 0x88, 0xff, 0xd1, \n  0xfa, 0xff, 0xda, 0x2b, 0x00, 0x8d, 0x78, 0xff, 0xd2, 0x15, 0xff, 0x5b, 0xbf, 0xff, 0xeb, 0xac, \n  0xff, 0x51, 0xb6, 0xff, 0x69, 0x52, 0x00, 0xc2, 0xa9, 0xff, 0x10, 0xdc, 0xfe, 0x38, 0x27, 0xff, \n  0x5f, 0x7c, 0xff, 0x9c, 0x36, 0xff, 0x56, 0x18, 0x09, 0x48, 0xf7, 0x0c, 0xd4, 0x2a, 0x05, 0xbe, \n  0xee, 0x02, 0xa1, 0x5e, 0x03, 0xf8, 0xa0, 0x04, 0xdd, 0x77, 0x04, 0xcc, 0xae, 0x02, 0x60, 0xa0, \n  0x00, 0xe5, 0x36, 0x00, 0x9c, 0x70, 0x00, 0xf3, 0xc7, 0xff, 0x3c, 0xc3, 0x00, 0x35, 0x01, 0x00, \n  0x4d, 0xe4, 0xff, 0x57, 0xcf, 0xff, 0x33, 0x47, 0xff, 0x07, 0x54, 0x00, 0x5e, 0x68, 0x00, 0x96, \n  0x6f, 0xff, 0x57, 0x56, 0xff, 0x9c, 0x96, 0xff, 0xf0, 0x37, 0xff, 0x85, 0x3c, 0xff, 0x6a, 0x92, \n  0xff, 0x5b, 0x17, 0x00, 0x31, 0xd8, 0xff, 0x11, 0x88, 0xff, 0x70, 0x56, 0xff, 0x2c, 0x54, 0xff, \n  0xc1, 0x59, 0xff, 0x32, 0x28, 0xff, 0x99, 0x3b, 0x08, 0x24, 0x7d, 0x0c, 0x2d, 0xda, 0x07, 0x10, \n  0x3b, 0x05, 0x96, 0x7c, 0x02, 0xa4, 0x12, 0x04, 0x63, 0xac, 0x04, 0x1e, 0xff, 0x01, 0xa7, 0xd4, \n  0xff, 0x5d, 0xd6, 0xff, 0x3e, 0x85, 0x00, 0xa0, 0xde, 0xff, 0x26, 0x38, 0x00, 0x50, 0xe6, 0xff, \n  0x88, 0xfb, 0xff, 0x1f, 0x22, 0x00, 0xd0, 0x47, 0x00, 0x27, 0x54, 0x00, 0x6f, 0xaa, 0xff, 0x68, \n  0x88, 0xff, 0x43, 0x8f, 0xff, 0xc3, 0x5e, 0xff, 0xf0, 0xf1, 0xfe, 0xc0, 0x5d, 0xff, 0x88, 0x96, \n  0xff, 0xab, 0xd3, 0xff, 0xb3, 0x1b, 0x00, 0xb1, 0xe4, 0xff, 0x1d, 0x95, 0xff, 0x90, 0x39, 0xff, \n  0x09, 0x0b, 0xff, 0x4c, 0x2c, 0xff, 0xb9, 0x52, 0x0a, 0xac, 0xac, 0x0f, 0x35, 0x80, 0x06, 0xb4, \n  0x5f, 0x02, 0x3c, 0x14, 0x03, 0x78, 0x2c, 0x04, 0x6e, 0x79, 0x03, 0x50, 0x95, 0x01, 0xd2, 0x89, \n  0xff, 0xd9, 0xd4, 0xff, 0x94, 0x79, 0x00, 0xff, 0x01, 0x00, 0x4e, 0x6d, 0x00, 0xb0, 0x8f, 0xff, \n  0xea, 0x5f, 0x00, 0xb2, 0x4f, 0x01, 0x7a, 0x3b, 0x00, 0x25, 0x3a, 0xff, 0xec, 0xef, 0xff, 0x2a, \n  0xf9, 0xff, 0x4e, 0x31, 0xff, 0xb4, 0x0a, 0xff, 0xca, 0x11, 0xff, 0x17, 0x78, 0xff, 0xb8, 0x72, \n  0xff, 0xab, 0x1c, 0x00, 0x7e, 0x6e, 0x00, 0x83, 0x04, 0x00, 0xf7, 0x48, 0xff, 0xfd, 0xfb, 0xfe, \n  0x6b, 0x2c, 0xff, 0x3d, 0x00, 0xff, 0x4d, 0xe6, 0x0a, 0x94, 0xef, 0x10, 0x52, 0x75, 0x05, 0x01, \n  0xb9, 0x00, 0x50, 0x10, 0x03, 0x1d, 0xb5, 0x03, 0x2f, 0x34, 0x03, 0x06, 0x34, 0x02, 0x08, 0x04, \n  0x00, 0x11, 0x4e, 0xff, 0x78, 0xe1, 0x00, 0xf6, 0x4b, 0x00, 0xbe, 0x31, 0x00, 0x0a, 0x45, 0x00, \n  0x40, 0xe1, 0x00, 0x96, 0x3b, 0x01, 0xf7, 0xf7, 0xff, 0x3e, 0xbd, 0xff, 0x7c, 0xee, 0xff, 0x53, \n  0xcc, 0xff, 0xad, 0x37, 0xff, 0xf8, 0x42, 0xff, 0x47, 0x12, 0xff, 0x67, 0x1e, 0xff, 0x8c, 0xb8, \n  0xff, 0x0c, 0x38, 0x00, 0x69, 0x76, 0x00, 0x42, 0xf4, 0xff, 0x0d, 0x7d, 0xff, 0x31, 0xf8, 0xfe, \n  0xea, 0x0b, 0xff, 0x00, 0x16, 0xff, 0xf0, 0x32, 0x08, 0x22, 0x53, 0x0f, 0x68, 0xeb, 0x08, 0x22, \n  0x84, 0x01, 0x4e, 0xc0, 0x00, 0x58, 0x71, 0x02, 0x9d, 0xa9, 0x03, 0x40, 0x61, 0x03, 0xe2, 0x38, \n  0x00, 0x17, 0x67, 0xff, 0xe8, 0x27, 0x01, 0x62, 0x01, 0x01, 0x3e, 0xf8, 0xff, 0x5b, 0x26, 0x00, \n  0x12, 0x55, 0x01, 0xdb, 0x5d, 0x01, 0xca, 0x91, 0x00, 0xad, 0xc7, 0xff, 0xdc, 0xde, 0xff, 0xe1, \n  0x1c, 0x00, 0x68, 0x92, 0xff, 0x28, 0x0f, 0xff, 0xc4, 0x3c, 0xff, 0x93, 0x56, 0xff, 0xe7, 0x59, \n  0xff, 0x78, 0x0a, 0x00, 0xac, 0x63, 0x00, 0xe6, 0x23, 0x00, 0xfe, 0x94, 0xff, 0x4e, 0x47, 0xff, \n  0x7f, 0x26, 0xff, 0x73, 0x08, 0xff, 0x8d, 0xd5, 0x06, 0xc1, 0x7d, 0x0d, 0x5c, 0xf4, 0x09, 0xc6, \n  0x34, 0x03, 0x6d, 0x6f, 0x00, 0x27, 0x79, 0x01, 0x95, 0xc8, 0x02, 0x8e, 0x51, 0x03, 0x51, 0xcd, \n  0x00, 0x55, 0x71, 0xff, 0x7e, 0x0d, 0x01, 0x21, 0x94, 0x01, 0xe6, 0x57, 0x00, 0x66, 0x2f, 0x00, \n  0x1d, 0x26, 0x01, 0x2f, 0x02, 0x01, 0x3b, 0x2d, 0x01, 0x8d, 0x74, 0x00, 0xed, 0x15, 0x00, 0x91, \n  0x27, 0x00, 0x94, 0x86, 0xff, 0x22, 0x82, 0xff, 0xb5, 0x99, 0xff, 0x69, 0x42, 0xff, 0xde, 0x36, \n  0xff, 0x2e, 0xfa, 0xff, 0xa9, 0x53, 0x00, 0x9f, 0xf8, 0xff, 0xcc, 0x70, 0xff, 0xaa, 0x87, 0xff, \n  0x88, 0x72, 0xff, 0x03, 0x1b, 0xff, 0x30, 0xc4, 0x06, 0xe8, 0x23, 0x0d, 0x8b, 0x60, 0x09, 0x69, \n  0xa4, 0x03, 0x08, 0xeb, 0x00, 0x20, 0xf5, 0x00, 0x41, 0x96, 0x02, 0xea, 0x5b, 0x03, 0x71, 0x7d, \n  0x00, 0x72, 0xd7, 0xfe, 0x3f, 0xd4, 0x00, 0x67, 0xce, 0x01, 0x34, 0x91, 0x00, 0x1e, 0x25, 0x00, \n  0x81, 0x2c, 0x01, 0x15, 0x26, 0x01, 0xd3, 0xe3, 0x00, 0xfb, 0x94, 0x00, 0xaa, 0x91, 0x00, 0xea, \n  0x77, 0x00, 0x7c, 0xd4, 0xff, 0x64, 0xb0, 0xff, 0x44, 0xab, 0xff, 0xbb, 0x91, 0xff, 0x9a, 0xb8, \n  0xff, 0xa3, 0xb5, 0xff, 0x5b, 0x11, 0x00, 0x09, 0x34, 0x00, 0x92, 0x66, 0xff, 0xc0, 0x33, 0xff, \n  0x49, 0x48, 0xff, 0xb7, 0x70, 0xff, 0xbb, 0x0e, 0x07, 0xb9, 0x23, 0x0d, 0xd2, 0xee, 0x08, 0x9d, \n  0xe3, 0x03, 0x9d, 0x45, 0x01, 0x07, 0xaa, 0x00, 0xc9, 0x52, 0x02, 0x4b, 0x73, 0x03, 0x15, 0x92, \n  0x00, 0xc8, 0xa7, 0xfe, 0x77, 0x62, 0x00, 0x0b, 0x5a, 0x01, 0x34, 0x46, 0x00, 0x7c, 0x05, 0x00, \n  0x2e, 0x19, 0x01, 0x5d, 0xe9, 0x00, 0x3b, 0xd0, 0x00, 0x3d, 0x11, 0x01, 0x43, 0x62, 0x00, 0x7f, \n  0x2a, 0x00, 0x80, 0x54, 0x00, 0xe2, 0x00, 0x00, 0x4f, 0xe3, 0xff, 0x46, 0xe3, 0xff, 0x14, 0xf9, \n  0xff, 0xd8, 0xee, 0xff, 0x2c, 0x28, 0x00, 0xe6, 0x1c, 0x00, 0x5d, 0x8d, 0xff, 0x2d, 0x18, 0xff, \n  0x0c, 0x08, 0xff, 0xe7, 0x3b, 0xff, 0xef, 0xb1, 0x07, 0xcb, 0xb8, 0x0d, 0xd7, 0x83, 0x08, 0x6c, \n  0xc6, 0x03, 0x2f, 0x67, 0x01, 0x1d, 0x92, 0x00, 0x97, 0x67, 0x02, 0xc2, 0x86, 0x03, 0x34, 0x5d, \n  0x00, 0xb5, 0x8b, 0xfe, 0x2a, 0x69, 0x00, 0xc7, 0x50, 0x01, 0xa8, 0x31, 0x00, 0x88, 0x4a, 0xff, \n  0x81, 0x85, 0x00, 0x3e, 0xbe, 0x00, 0x65, 0x79, 0x00, 0x45, 0x1f, 0x01, 0xf9, 0xb5, 0x00, 0xac, \n  0x2a, 0x00, 0x1e, 0x0e, 0x00, 0x98, 0xbf, 0xff, 0xfe, 0x5b, 0x00, 0x6b, 0x6a, 0x00, 0x9c, 0xf3, \n  0xff, 0x89, 0x80, 0x00, 0xc9, 0x79, 0x00, 0xc0, 0x21, 0x00, 0xa6, 0xbc, 0xff, 0xfa, 0x41, 0xff, \n  0x2f, 0x08, 0xff, 0xef, 0xfc, 0xfe, 0x87, 0x38, 0x08, 0x53, 0x9e, 0x0e, 0xd7, 0x67, 0x08, 0xf8, \n  0x5f, 0x03, 0xc3, 0xbb, 0x01, 0x48, 0x77, 0x00, 0x0d, 0x31, 0x02, 0x42, 0xaf, 0x03, 0x4f, 0x4a, \n  0x00, 0xc9, 0x6d, 0xfe, 0x0c, 0x44, 0x00, 0x6b, 0x3d, 0x01, 0x8a, 0x70, 0x00, 0xea, 0x19, 0xff, \n  0x6a, 0xf3, 0xff, 0xca, 0x5b, 0x00, 0x83, 0xa8, 0xff, 0xc7, 0x95, 0x00, 0x11, 0x3a, 0x01, 0x3c, \n  0x22, 0x00, 0xe0, 0xb9, 0xff, 0xb1, 0xb7, 0xff, 0xd7, 0x11, 0x00, 0xd7, 0x79, 0x00, 0x83, 0x27, \n  0x00, 0x33, 0xbc, 0x00, 0x30, 0xcf, 0x00, 0x18, 0x63, 0x00, 0x6a, 0x27, 0x00, 0x5a, 0x6b, 0xff, \n  0xd5, 0xf8, 0xfe, 0x0b, 0x27, 0xff, 0xf5, 0xec, 0x08, 0x80, 0xbd, 0x0f, 0x7c, 0x47, 0x08, 0x29, \n  0x0a, 0x03, 0xc1, 0x02, 0x02, 0x5f, 0x35, 0x00, 0x69, 0x06, 0x02, 0x28, 0xe6, 0x03, 0x8f, 0x19, \n  0x00, 0x42, 0x18, 0xfe, 0xfa, 0x5c, 0x00, 0xfc, 0x35, 0x01, 0x8d, 0x52, 0x00, 0x95, 0x3a, 0xff, \n  0x7c, 0x9d, 0xff, 0x07, 0x2b, 0x00, 0x37, 0x51, 0xff, 0xd2, 0xa7, 0xff, 0xd0, 0x12, 0x01, 0xde, \n  0x2a, 0x00, 0x2f, 0x75, 0xff, 0x10, 0x97, 0xff, 0x1c, 0xbc, 0xff, 0xfb, 0x67, 0x00, 0xee, 0x27, \n  0x00, 0xc5, 0x69, 0x00, 0x3d, 0x05, 0x01, 0x44, 0xb3, 0x00, 0x29, 0x30, 0x00, 0x3a, 0xeb, 0xff, \n  0x86, 0x79, 0xff, 0xdf, 0x00, 0xff, 0x63, 0xeb, 0x09, 0xa1, 0x21, 0x11, 0xdc, 0x18, 0x08, 0xfd, \n  0x82, 0x02, 0xf4, 0x58, 0x02, 0xa4, 0x12, 0x00, 0x1a, 0xcf, 0x01, 0x3a, 0x1d, 0x04, 0xcb, 0xf6, \n  0xff, 0x3e, 0xd1, 0xfd, 0xd5, 0x66, 0x00, 0x9e, 0x36, 0x01, 0x60, 0x2e, 0x00, 0x50, 0x72, 0xff, \n  0x7c, 0x7d, 0xff, 0xeb, 0xe0, 0xff, 0xa9, 0x4b, 0xff, 0x9a, 0x25, 0xff, 0x9c, 0xba, 0x00, 0x23, \n  0x72, 0x00, 0x15, 0x03, 0xff, 0x64, 0x15, 0xff, 0xc0, 0xce, 0xff, 0xe2, 0x3c, 0x00, 0x60, 0x0c, \n  0x00, 0x9c, 0x18, 0x00, 0x79, 0xfe, 0x00, 0x5f, 0xbd, 0x00, 0xb2, 0x0a, 0x00, 0xe3, 0x3f, 0x00, \n  0xd4, 0xd3, 0xff, 0x83, 0x69, 0xff, 0xb7, 0x16, 0x0b, 0x9e, 0xc0, 0x12, 0x9e, 0xe5, 0x07, 0x75, \n  0xd3, 0x01, 0xc9, 0xa4, 0x02, 0x06, 0xeb, 0xff, 0x20, 0xac, 0x01, 0x3e, 0x62, 0x04, 0x4a, 0x83, \n  0xff, 0x0f, 0xa4, 0xfd, 0xdc, 0x9f, 0x00, 0xa9, 0x29, 0x01, 0x1c, 0xe2, 0xff, 0x0c, 0x66, 0xff, \n  0x3e, 0xbc, 0xff, 0x6b, 0xa1, 0xff, 0xef, 0x0f, 0xff, 0x4d, 0xfd, 0xfe, 0x6e, 0x40, 0x00, 0x56, \n  0xb5, 0x00, 0x49, 0x32, 0xff, 0xaa, 0x72, 0xfe, 0xb8, 0x95, 0xff, 0x58, 0x1a, 0x00, 0x07, 0xe7, \n  0xff, 0x12, 0x05, 0x00, 0x11, 0x8a, 0x00, 0xd0, 0x94, 0x00, 0x2b, 0x28, 0x00, 0x20, 0x04, 0x00, \n  0xb4, 0xdf, 0xff, 0x97, 0xb6, 0xff, 0x29, 0x94, 0x0c, 0x1f, 0x80, 0x14, 0x1e, 0x75, 0x07, 0xe3, \n  0x34, 0x01, 0xa7, 0xd8, 0x02, 0xc9, 0x92, 0xff, 0x9d, 0xc0, 0x01, 0xce, 0xab, 0x04, 0x13, 0xcb, \n  0xfe, 0xcd, 0x6f, 0xfd, 0xfa, 0x0b, 0x01, 0xfe, 0x24, 0x01, 0x15, 0x75, 0xff, 0x3c, 0x3e, 0xff, \n  0x8f, 0xe2, 0xff, 0x4c, 0x78, 0xff, 0x3e, 0xc4, 0xfe, 0x9d, 0xde, 0xfe, 0xbb, 0xf8, 0xff, 0x27, \n  0x88, 0x00, 0xde, 0x9b, 0xff, 0xa3, 0x40, 0xfe, 0x5c, 0x40, 0xff, 0x52, 0x2a, 0x00, 0x51, 0x91, \n  0xff, 0x1e, 0xdd, 0xff, 0xe6, 0x48, 0x00, 0xbe, 0x21, 0x00, 0x7f, 0x03, 0x00, 0x1b, 0xf1, 0xff, \n  0x02, 0xda, 0xff, 0x7d, 0x88, 0xff, 0xe8, 0x0b, 0x0e, 0x2c, 0x58, 0x16, 0x5f, 0x26, 0x07, 0x83, \n  0x85, 0x00, 0x11, 0xda, 0x02, 0x5c, 0x12, 0xff, 0x18, 0xe8, 0x01, 0x88, 0xff, 0x04, 0x6b, 0xd9, \n  0xfd, 0x84, 0x1a, 0xfd, 0x04, 0x92, 0x01, 0xd1, 0x25, 0x01, 0x07, 0xe9, 0xfe, 0x09, 0xf7, 0xfe, \n  0xf1, 0x05, 0x00, 0x19, 0x4a, 0xff, 0xfd, 0x52, 0xfe, 0xc5, 0x9b, 0xfe, 0x8f, 0xcd, 0xff, 0x8e, \n  0x49, 0x00, 0x06, 0xb9, 0xff, 0xa2, 0x6b, 0xfe, 0x65, 0xdd, 0xfe, 0x50, 0x25, 0x00, 0xd3, 0xa3, \n  0xff, 0x48, 0x79, 0xff, 0x68, 0x2e, 0x00, 0x0a, 0x7f, 0xff, 0xc2, 0x8e, 0xff, 0x4e, 0x08, 0x00, \n  0x8d, 0x9f, 0xff, 0xe3, 0x65, 0xff, 0xb4, 0x87, 0x0f, 0xb1, 0x43, 0x18, 0x2d, 0x1a, 0x07, 0x29, \n  0x18, 0x00, 0xac, 0xcb, 0x02, 0xa9, 0x91, 0xfe, 0x3a, 0x49, 0x02, 0x8d, 0x8f, 0x05, 0xa5, 0xe7, \n  0xfc, 0x86, 0xdc, 0xfc, 0x14, 0x54, 0x02, 0x24, 0x54, 0x01, 0xc7, 0x8b, 0xfe, 0x4b, 0xb6, 0xfe, \n  0xf8, 0x45, 0x00, 0xca, 0x51, 0xff, 0xff, 0x0e, 0xfe, 0x09, 0x6a, 0xfe, 0xe3, 0x97, 0xff, 0x3e, \n  0x40, 0x00, 0x20, 0xe5, 0xff, 0xb2, 0xbe, 0xfe, 0xa4, 0xf8, 0xfe, 0x51, 0xd3, 0xff, 0x57, 0x0f, \n  0x00, 0x4f, 0xa0, 0xff, 0xa6, 0xdc, 0xff, 0x69, 0x83, 0xff, 0xa9, 0x03, 0xff, 0x8e, 0xdd, 0xff, \n  0x01, 0xc3, 0xff, 0x41, 0x4d, 0xff, 0x0f, 0x9b, 0x10, 0xea, 0x14, 0x1a, 0x5a, 0xab, 0x07, 0x17, \n  0x93, 0xff, 0x9b, 0x90, 0x02, 0x88, 0xee, 0xfd, 0x3e, 0x55, 0x02, 0x6d, 0x49, 0x06, 0xa9, 0xfd, \n  0xfb, 0x65, 0x41, 0xfc, 0x3e, 0x01, 0x03, 0x7e, 0x9e, 0x01, 0xcb, 0x19, 0xfe, 0x94, 0x56, 0xfe, \n  0x2c, 0x54, 0x00, 0x55, 0x55, 0xff, 0x7d, 0xd5, 0xfd, 0xa9, 0x11, 0xfe, 0x55, 0x27, 0xff, 0xb8, \n  0x21, 0x00, 0xec, 0x00, 0x00, 0x9d, 0xb9, 0xfe, 0x91, 0x5f, 0xff, 0x8f, 0xa0, 0xff, 0x42, 0xd5, \n  0xff, 0x3b, 0x28, 0x00, 0xde, 0x8e, 0xff, 0x82, 0x35, 0xff, 0x0c, 0x13, 0xff, 0x71, 0x3f, 0xff, \n  0xea, 0x94, 0xff, 0x89, 0x73, 0xff, 0xe3, 0x87, 0x11, 0xd9, 0xf1, 0x1b, 0x3a, 0x71, 0x08, 0x88, \n  0x20, 0xff, 0xf6, 0x52, 0x02, 0x2f, 0x96, 0xfd, 0x09, 0x23, 0x02, 0xcb, 0xb5, 0x06, 0x12, 0x90, \n  0xfb, 0x0f, 0x9e, 0xfb, 0xd4, 0x75, 0x03, 0x60, 0x16, 0x02, 0xdf, 0xd3, 0xfd, 0xd9, 0xe8, 0xfd, \n  0x8b, 0x67, 0x00, 0x94, 0x54, 0xff, 0x6a, 0xab, 0xfd, 0xe9, 0xf9, 0xfd, 0xe5, 0x8c, 0xfe, 0x46, \n  0xd0, 0xff, 0x81, 0x80, 0x00, 0x1e, 0x82, 0xfe, 0x46, 0x79, 0xff, 0x9a, 0x3a, 0x00, 0x1d, 0x59, \n  0xff, 0x0e, 0x57, 0x00, 0x00, 0xfb, 0xff, 0x1b, 0xc0, 0xfe, 0xc0, 0xe5, 0xfe, 0x40, 0x4c, 0xff, \n  0xa9, 0x18, 0xff, 0xc1, 0xa9, 0xff, 0x28, 0x22, 0x12, 0x58, 0xbf, 0x1d, 0x69, 0xa1, 0x09, 0x3e, \n  0x74, 0xfe, 0x6a, 0x4f, 0x02, 0x16, 0xa8, 0xfd, 0x1d, 0x8a, 0x01, 0xfc, 0x98, 0x06, 0x3d, 0xaf, \n  0xfb, 0xcf, 0x33, 0xfb, 0xb7, 0x60, 0x03, 0xf1, 0x96, 0x02, 0x87, 0xc6, 0xfd, 0x5c, 0x9d, 0xfd, \n  0x1e, 0x47, 0x00, 0xae, 0x52, 0xff, 0x45, 0x6d, 0xfd, 0x08, 0x00, 0xfe, 0x68, 0x47, 0xfe, 0xff, \n  0xe6, 0xfe, 0x05, 0xcc, 0x00, 0xd0, 0x15, 0xff, 0x85, 0xf4, 0xfe, 0xa0, 0xc2, 0x00, 0xe5, 0x8e, \n  0xff, 0x58, 0xd1, 0xff, 0xfd, 0x9a, 0x00, 0x1c, 0xd2, 0xfe, 0x02, 0x40, 0xfe, 0x2c, 0x50, 0xff, \n  0xa3, 0xf7, 0xfe, 0xf0, 0x8d, 0xff, 0x96, 0x5d, 0x13, 0x7a, 0x40, 0x1f, 0x28, 0xd3, 0x09, 0x97, \n  0x7d, 0xfe, 0xa6, 0x77, 0x02, 0x47, 0x6e, 0xfd, 0x65, 0x1e, 0x01, 0xa8, 0x0e, 0x06, 0x0f, 0xbd, \n  0xfb, 0x7a, 0x25, 0xfb, 0x75, 0x18, 0x03, 0x6a, 0xd1, 0x02, 0x61, 0xc9, 0xfd, 0x34, 0x72, 0xfd, \n  0xa0, 0x20, 0x00, 0xb2, 0x45, 0xff, 0x04, 0xff, 0xfc, 0xb7, 0x09, 0xfe, 0x45, 0x3a, 0xfe, 0xf3, \n  0x20, 0xfe, 0x7c, 0x57, 0x00, 0x01, 0xf2, 0xff, 0x77, 0xf8, 0xfe, 0x65, 0x64, 0x00, 0x28, 0x69, \n  0x00, 0x68, 0x5a, 0xff, 0x02, 0x85, 0x00, 0xdd, 0x83, 0xff, 0x3d, 0xce, 0xfd, 0xcc, 0xcb, 0xfe, \n  0xc3, 0x16, 0xff, 0x26, 0x49, 0xff, 0x2d, 0xd5, 0x15, 0x2d, 0x3c, 0x20, 0xe2, 0x6a, 0x08, 0x4e, \n  0x83, 0xff, 0x9e, 0x50, 0x03, 0xd0, 0x9d, 0xfc, 0x6d, 0xa2, 0x00, 0xb6, 0xf6, 0x05, 0x3d, 0x3b, \n  0xfb, 0xfb, 0x9d, 0xfb, 0xdf, 0xbf, 0x02, 0xd2, 0xe8, 0x02, 0x13, 0xf9, 0xfd, 0x52, 0x1b, 0xfd, \n  0x06, 0x56, 0x00, 0x56, 0x02, 0xff, 0xb3, 0xec, 0xfc, 0x03, 0xb3, 0xfd, 0x29, 0x59, 0xfe, 0x97, \n  0xe0, 0xfd, 0xc8, 0x81, 0xff, 0x76, 0x52, 0x00, 0x09, 0xec, 0xff, 0xe0, 0xe1, 0xff, 0x0a, 0xa8, \n  0x00, 0x20, 0xeb, 0xff, 0xf9, 0xe2, 0xff, 0x04, 0xf6, 0xff, 0x04, 0x2f, 0xfe, 0xca, 0x11, 0xfe, \n  0x82, 0xef, 0xfe, 0x08, 0x66, 0xff, 0x79, 0xa4, 0x18, 0x46, 0x8e, 0x20, 0x97, 0xee, 0x05, 0x8a, \n  0x11, 0x02, 0x2f, 0xbf, 0x04, 0x87, 0x67, 0xfa, 0x9c, 0x3f, 0x00, 0x7b, 0xaa, 0x06, 0x16, 0x57, \n  0xfa, 0x5a, 0xb4, 0xfb, 0x8d, 0xa4, 0x02, 0x42, 0xcb, 0x02, 0x9f, 0x3a, 0xfe, 0xc8, 0xa3, 0xfc, \n  0x9f, 0x85, 0x00, 0x5b, 0xa5, 0xfe, 0x05, 0x05, 0xfd, 0x89, 0x5d, 0xfd, 0xa6, 0x1c, 0xfe, 0x74, \n  0xf1, 0xfd, 0xa1, 0xe0, 0xfe, 0x20, 0xdf, 0xff, 0x06, 0xe8, 0x00, 0x4c, 0x47, 0x00, 0x3e, 0x10, \n  0x00, 0xa7, 0x95, 0x00, 0x86, 0xab, 0xff, 0x73, 0xd1, 0xff, 0x01, 0xc3, 0xfe, 0x65, 0xdf, 0xfd, \n  0x93, 0x4d, 0xfe, 0xcc, 0x6b, 0xff, 0x91, 0xe5, 0x1a, 0x90, 0x12, 0x20, 0x77, 0x9d, 0x03, 0x72, \n  0x81, 0x06, 0x0f, 0xed, 0x05, 0x4a, 0xa2, 0xf6, 0x4b, 0xbf, 0x00, 0x53, 0x47, 0x08, 0xee, 0xc8, \n  0xf8, 0x6d, 0x08, 0xfb, 0xf9, 0x5f, 0x03, 0x9d, 0x87, 0x02, 0xcd, 0x09, 0xfe, 0x96, 0x7a, 0xfc, \n  0xd4, 0xad, 0x00, 0x73, 0x27, 0xfe, 0x23, 0x01, 0xfd, 0x2c, 0x5b, 0xfd, 0x0c, 0xbf, 0xfd, 0x24, \n  0xe4, 0xfd, 0x86, 0x94, 0xfe, 0x45, 0x34, 0xff, 0x7e, 0x39, 0x01, 0x88, 0x29, 0x01, 0x27, 0xbb, \n  0xff, 0xd8, 0xcb, 0x00, 0x9a, 0xce, 0xff, 0x0f, 0x88, 0xff, 0xfa, 0xfe, 0xfe, 0xed, 0x45, 0xfe, \n  0xc3, 0xf2, 0xfd, 0x91, 0xce, 0xfe, 0xfe, 0xa3, 0x1c, 0x10, 0xc6, 0x1e, 0x09, 0x4b, 0x02, 0x0f, \n  0x12, 0x0c, 0x62, 0x23, 0x06, 0xd5, 0x84, 0xf2, 0xd6, 0x85, 0x02, 0x0d, 0x12, 0x0a, 0xbc, 0x77, \n  0xf6, 0xe2, 0x50, 0xfa, 0x6e, 0xe1, 0x04, 0xb5, 0x1a, 0x02, 0x77, 0x4a, 0xfd, 0x69, 0xee, 0xfc, \n  0x97, 0xdb, 0x00, 0x9f, 0x83, 0xfd, 0x1a, 0xf6, 0xfc, 0x85, 0xb0, 0xfd, 0x5f, 0x7f, 0xfd, 0x66, \n  0x99, 0xfd, 0x5a, 0xa9, 0xfe, 0x5f, 0xc8, 0xfe, 0xff, 0xf0, 0x00, 0xb8, 0xba, 0x01, 0x98, 0x1b, \n  0x00, 0xc1, 0x10, 0x01, 0x4f, 0xec, 0xff, 0x81, 0x5b, 0xff, 0xb4, 0xf7, 0xfe, 0x8e, 0x02, 0xff, \n  0x0b, 0x05, 0xfe, 0x06, 0x49, 0xfe, 0xba, 0x0c, 0x21, 0xd1, 0x57, 0x1f, 0x19, 0x7d, 0xfd, 0xc6, \n  0xa4, 0x0c, 0xb4, 0xdc, 0x08, 0x91, 0x75, 0xf2, 0x85, 0x58, 0x01, 0x18, 0x8d, 0x09, 0x31, 0xe9, \n  0xf5, 0x77, 0xa9, 0xfa, 0x3a, 0x76, 0x05, 0xb9, 0x36, 0x01, 0x8d, 0x77, 0xfc, 0xfd, 0x80, 0xfd, \n  0xc9, 0xcf, 0x00, 0x39, 0xa1, 0xfc, 0x73, 0xf5, 0xfc, 0x31, 0x92, 0xfd, 0x8e, 0xb5, 0xfd, 0xcf, \n  0x41, 0xfd, 0x48, 0xbb, 0xfe, 0xbd, 0xb6, 0xfe, 0xb9, 0x3a, 0x00, 0xae, 0x3e, 0x02, 0x90, 0x8a, \n  0x00, 0xf7, 0xd7, 0x00, 0x57, 0x11, 0x00, 0x4c, 0x92, 0xff, 0x89, 0xaf, 0xfe, 0xe2, 0x33, 0xff, \n  0x15, 0x31, 0xfe, 0xc7, 0x86, 0xfe, 0xc4, 0x63, 0x25, 0xad, 0x55, 0x20, 0xaf, 0xeb, 0xf8, 0x48, \n  0xe5, 0x0b, 0x27, 0x7a, 0x0b, 0x35, 0xe7, 0xf3, 0x69, 0x8f, 0xff, 0x33, 0xcd, 0x08, 0x88, 0xe2, \n  0xf5, 0x61, 0xf7, 0xfa, 0x1d, 0xdb, 0x05, 0xcb, 0x96, 0x00, 0xfd, 0xa8, 0xfb, 0xfc, 0xd3, 0xfd, \n  0x1b, 0xef, 0x00, 0xb3, 0x9c, 0xfb, 0x64, 0x2f, 0xfd, 0x95, 0x3e, 0xfd, 0x83, 0x2b, 0xfe, 0x1d, \n  0x27, 0xfd, 0x62, 0x86, 0xfe, 0x7d, 0x45, 0xff, 0x33, 0x4f, 0xff, 0x0f, 0x3d, 0x02, 0xa2, 0x46, \n  0x01, 0x91, 0xd0, 0x00, 0x76, 0xeb, 0xff, 0xcc, 0xeb, 0xff, 0x19, 0xc7, 0xfe, 0x4f, 0x3a, 0xff, \n  0x0e, 0x62, 0xfe, 0xcc, 0x15, 0xff, 0x30, 0x12, 0x29, 0xc3, 0x42, 0x22, 0x87, 0xb7, 0xf4, 0xd9, \n  0xf8, 0x09, 0xe9, 0x82, 0x0d, 0x73, 0xa5, 0xf6, 0x11, 0x93, 0xfd, 0xa1, 0xab, 0x07, 0xb9, 0x62, \n  0xf6, 0x46, 0x1f, 0xfb, 0x0e, 0x01, 0x06, 0x4e, 0x10, 0x00, 0xe5, 0x4e, 0xfb, 0x8b, 0x7c, 0xfd, \n  0xe1, 0x29, 0x01, 0xbe, 0xc2, 0xfa, 0x4d, 0x38, 0xfd, 0x11, 0x0b, 0xfd, 0x97, 0x84, 0xfe, 0xc8, \n  0x82, 0xfd, 0x0f, 0xf4, 0xfd, 0xa0, 0xff, 0xff, 0x64, 0xd3, 0xfe, 0x1a, 0x93, 0x01, 0x11, 0xcd, \n  0x01, 0xde, 0x48, 0x01, 0x0a, 0x78, 0xff, 0x8d, 0x40, 0x00, 0xc7, 0x33, 0xff, 0xd9, 0xec, 0xfe, \n  0xba, 0xf2, 0xfe, 0x5f, 0x4a, 0xff, 0x10, 0x60, 0x2d, 0x36, 0x61, 0x23, 0xf4, 0x1f, 0xf1, 0xd4, \n  0x03, 0x08, 0xca, 0xff, 0x0d, 0x2a, 0xb7, 0xf9, 0x4b, 0x85, 0xfc, 0xd9, 0xf2, 0x05, 0x2f, 0xcc, \n  0xf6, 0xf5, 0xde, 0xfb, 0xb9, 0x9e, 0x05, 0x82, 0x6b, 0xff, 0x03, 0x81, 0xfb, 0x39, 0xa4, 0xfc, \n  0xbd, 0x22, 0x01, 0xa6, 0x4f, 0xfa, 0x72, 0xee, 0xfc, 0x46, 0x29, 0xfd, 0x64, 0xaf, 0xfe, 0x1c, \n  0xfc, 0xfd, 0x57, 0xa1, 0xfd, 0xf0, 0x2d, 0x00, 0x1c, 0x38, 0xff, 0x90, 0x7a, 0x00, 0x48, 0xf9, \n  0x01, 0x97, 0xef, 0x01, 0xe0, 0xf9, 0xfe, 0xf1, 0x9b, 0x00, 0x43, 0x93, 0xff, 0x1a, 0x9b, 0xfe, \n  0xd6, 0xa0, 0xff, 0x41, 0x2f, 0xff, 0x66, 0xfe, 0x30, 0x0b, 0x2f, 0x25, 0xc8, 0xd3, 0xed, 0x51, \n  0x32, 0x06, 0x89, 0x6a, 0x0d, 0x64, 0x7c, 0xfc, 0xab, 0x7a, 0xfc, 0xe4, 0xf2, 0x03, 0x11, 0x74, \n  0xf7, 0x7b, 0x97, 0xfc, 0x58, 0x06, 0x05, 0x29, 0xb5, 0xfe, 0x77, 0x34, 0xfc, 0x32, 0x5c, 0xfb, \n  0x98, 0xe6, 0x00, 0x4d, 0x3e, 0xfa, 0x69, 0x78, 0xfc, 0x8f, 0x9f, 0xfd, 0x9f, 0xa3, 0xfe, 0x4f, \n  0x64, 0xfe, 0x9d, 0xa4, 0xfd, 0x86, 0x04, 0x00, 0xd7, 0xda, 0xff, 0xfe, 0xd7, 0xff, 0xf5, 0x65, \n  0x01, 0xb4, 0xd1, 0x02, 0x83, 0xa3, 0xfe, 0x3a, 0x89, 0x00, 0x56, 0x0f, 0x00, 0x24, 0x68, 0xfe, \n  0xfc, 0xf0, 0xff, 0xd6, 0x44, 0xff, 0x25, 0x1f, 0x34, 0xf7, 0x56, 0x27, 0x94, 0xfe, 0xea, 0xba, \n  0xd7, 0x04, 0x0b, 0xe8, 0x0b, 0x88, 0x55, 0xfe, 0xaf, 0x77, 0xfd, 0x95, 0xfd, 0x01, 0x2c, 0x50, \n  0xf8, 0x99, 0xfa, 0xfc, 0x0e, 0x7b, 0x04, 0xbd, 0x1a, 0xfe, 0x25, 0xd5, 0xfc, 0x8d, 0x48, 0xfa, \n  0x15, 0x6c, 0x00, 0x57, 0x69, 0xfa, 0x3d, 0x4a, 0xfc, 0xe5, 0x11, 0xfe, 0xbc, 0x73, 0xfe, 0x85, \n  0xd4, 0xfe, 0xe8, 0xd3, 0xfd, 0x0a, 0xc5, 0xff, 0xfb, 0x6c, 0x00, 0x7c, 0xf0, 0xff, 0x5f, 0x5c, \n  0x00, 0x8e, 0xb8, 0x03, 0x41, 0x79, 0xfe, 0x9f, 0xcd, 0xff, 0xa8, 0xb3, 0x00, 0x15, 0x59, 0xfe, \n  0x41, 0xeb, 0xff, 0xc4, 0xd0, 0xff, 0x62, 0xf9, 0x37, 0x0e, 0xf8, 0x27, 0xec, 0x14, 0xe9, 0xfe, \n  0x57, 0x04, 0x17, 0x7f, 0x09, 0x2d, 0x32, 0xff, 0x04, 0xd4, 0xfe, 0xa2, 0xd5, 0x00, 0x30, 0xc0, \n  0xf8, 0x17, 0x55, 0xfd, 0x0a, 0xf0, 0x03, 0xf9, 0x9e, 0xfd, 0x69, 0x1e, 0xfd, 0xac, 0xb8, 0xf9, \n  0x4e, 0xc1, 0xff, 0xcb, 0xb3, 0xfa, 0xf4, 0xa1, 0xfc, 0x2f, 0xfb, 0xfd, 0x9c, 0x61, 0xfe, 0x45, \n  0x55, 0xff, 0x6f, 0xea, 0xfd, 0x0f, 0xcf, 0xff, 0xcd, 0x9d, 0x00, 0xa1, 0xa4, 0x00, 0xed, 0xa9, \n  0xff, 0x5e, 0xbd, 0x03, 0x69, 0x99, 0xfe, 0x8d, 0xb4, 0xfe, 0x22, 0xe5, 0x00, 0x61, 0x8f, 0xfe, \n  0xdc, 0x3b, 0x00, 0x36, 0x2f, 0x00, 0xbe, 0xb8, 0x3a, 0xcb, 0x17, 0x29, 0x5d, 0x43, 0xe8, 0xc4, \n  0xa4, 0x03, 0xc7, 0xc3, 0x06, 0x02, 0x13, 0xff, 0x37, 0x34, 0x00, 0x4e, 0x70, 0x00, 0x99, 0xc7, \n  0xf8, 0x90, 0x6c, 0xfd, 0x92, 0x75, 0x03, 0x5b, 0xd2, 0xfc, 0x9c, 0xc4, 0xfd, 0xdf, 0x48, 0xf9, \n  0x3b, 0x01, 0xff, 0xae, 0x74, 0xfb, 0xce, 0xc2, 0xfc, 0x7c, 0x92, 0xfd, 0x2e, 0x62, 0xfe, 0x3b, \n  0xdc, 0xff, 0xf0, 0xeb, 0xfd, 0x2b, 0xea, 0xff, 0xe5, 0xb6, 0x00, 0xb5, 0xb9, 0x01, 0x81, 0xfd, \n  0xfe, 0x8a, 0xd7, 0x02, 0xfa, 0x27, 0xff, 0xf9, 0x76, 0xfd, 0x52, 0x3b, 0x00, 0x28, 0x7e, 0xff, \n  0x19, 0xa4, 0x00, 0x1f, 0x46, 0x00, 0x5c, 0x97, 0x3c, 0x6d, 0x44, 0x2a, 0xeb, 0xa2, 0xe8, 0xd7, \n  0x32, 0x03, 0x8e, 0x7e, 0x03, 0x97, 0x70, 0xfe, 0xf4, 0xaa, 0x01, 0x9e, 0x47, 0x00, 0x5d, 0xb4, \n  0xf8, 0xef, 0x9d, 0xfd, 0x4f, 0x9e, 0x02, 0x47, 0x15, 0xfc, 0x97, 0x13, 0xff, 0x6e, 0xf3, 0xf8, \n  0x9f, 0x67, 0xfe, 0xf6, 0x48, 0xfc, 0x11, 0xbd, 0xfc, 0xf7, 0x08, 0xfd, 0x5d, 0x73, 0xfe, 0x89, \n  0x95, 0x00, 0x55, 0x8e, 0xfd, 0x4a, 0x81, 0x00, 0x80, 0x07, 0x01, 0xe1, 0x04, 0x02, 0xa0, 0xae, \n  0xfe, 0x0c, 0xb6, 0x01, 0x01, 0x6d, 0xff, 0x15, 0xd3, 0xfc, 0x44, 0x93, 0xff, 0x2e, 0xd7, 0xff, \n  0x50, 0x5e, 0x01, 0x69, 0x22, 0x01, 0x95, 0xd3, 0x3d, 0xbb, 0xf1, 0x2a, 0x32, 0x39, 0xea, 0x3f, \n  0x33, 0x03, 0xfa, 0x55, 0xff, 0xfe, 0xc6, 0xfd, 0xb1, 0xbf, 0x02, 0x56, 0x0b, 0x00, 0x39, 0xa9, \n  0xf8, 0xfe, 0xbc, 0xfd, 0x30, 0x77, 0x01, 0xd0, 0xa0, 0xfb, 0x9b, 0x08, 0x01, 0xe4, 0x8b, 0xf8, \n  0x1c, 0xd6, 0xfd, 0x9a, 0x0c, 0xfd, 0x02, 0x58, 0xfc, 0xa2, 0xb7, 0xfc, 0x90, 0xba, 0xfe, 0xab, \n  0xa7, 0x00, 0x62, 0xe0, 0xfd, 0x85, 0x2f, 0x01, 0xf6, 0x57, 0x00, 0xb2, 0x32, 0x02, 0x2b, 0xb2, \n  0xfe, 0x52, 0x49, 0x00, 0x4a, 0x9e, 0xff, 0x48, 0x53, 0xfd, 0x62, 0xa3, 0xfe, 0x90, 0x6b, 0xff, \n  0xfd, 0xb7, 0x02, 0x6b, 0xaf, 0x01, 0x1c, 0x47, 0x3e, 0xb6, 0x61, 0x2b, 0x6e, 0xb7, 0xec, 0xcf, \n  0x46, 0x03, 0x87, 0xca, 0xfa, 0x0d, 0xe9, 0xfc, 0x07, 0x62, 0x03, 0x4c, 0xac, 0xff, 0xb6, 0x62, \n  0xf8, 0xbb, 0xd0, 0xfd, 0x29, 0x60, 0x00, 0xd2, 0xb2, 0xfb, 0x53, 0x26, 0x03, 0x3d, 0xfc, 0xf7, \n  0xa2, 0x70, 0xfd, 0xc1, 0x27, 0xfd, 0x61, 0x19, 0xfc, 0x0a, 0xdc, 0xfc, 0xb2, 0x4e, 0xfe, 0x46, \n  0x81, 0x01, 0x2e, 0xbc, 0xfd, 0xab, 0xda, 0x00, 0x10, 0xfa, 0xff, 0xf4, 0x07, 0x02, 0x37, 0x6f, \n  0xfe, 0x93, 0xb8, 0xff, 0xdf, 0x0c, 0x00, 0x3e, 0x27, 0xfd, 0xca, 0x26, 0xff, 0x44, 0xde, 0xfe, \n  0xa0, 0xb1, 0x01, 0xa5, 0xcd, 0x02, 0x86, 0x39, 0x3d, 0x4a, 0x51, 0x2c, 0x1e, 0x37, 0xf0, 0xa3, \n  0x99, 0x03, 0xb5, 0xda, 0xf6, 0x79, 0x7a, 0xfb, 0x46, 0xbe, 0x03, 0x97, 0x59, 0xff, 0x9f, 0x07, \n  0xf8, 0x4c, 0x36, 0xfe, 0x5f, 0x24, 0x00, 0xb6, 0xc0, 0xfb, 0xb3, 0x56, 0x05, 0xcf, 0xe6, 0xf7, \n  0x23, 0x63, 0xfc, 0xd7, 0xc7, 0xfd, 0x92, 0xd0, 0xfb, 0x7a, 0x61, 0xfd, 0xfa, 0x90, 0xfe, 0xc3, \n  0xfb, 0x00, 0xcc, 0x5e, 0xfd, 0xe1, 0x12, 0x01, 0x58, 0x13, 0xff, 0x36, 0xd1, 0x01, 0xd2, 0x54, \n  0xff, 0xc8, 0x33, 0xff, 0x3b, 0x33, 0x00, 0xa3, 0x48, 0xfe, 0x54, 0x71, 0xff, 0x85, 0xd0, 0xfd, \n  0xbc, 0x7d, 0x00, 0x86, 0x99, 0x03, 0xfc, 0x21, 0x3d, 0xb7, 0x06, 0x2b, 0x93, 0x7e, 0xf4, 0xb9, \n  0xab, 0x03, 0x66, 0x64, 0xf3, 0x5a, 0x71, 0xf9, 0xc4, 0x75, 0x03, 0xf6, 0x35, 0xff, 0x36, 0x5e, \n  0xf7, 0x69, 0xc1, 0xff, 0xfb, 0x51, 0xff, 0x9d, 0x74, 0xfc, 0xf5, 0xfe, 0x06, 0xcf, 0x88, 0xf7, \n  0x20, 0x8a, 0xfb, 0x8a, 0xcf, 0xfd, 0x62, 0x31, 0xfd, 0x16, 0x35, 0xfd, 0x7a, 0x4f, 0xfd, 0x2e, \n  0xdf, 0x00, 0xb5, 0x24, 0xfd, 0x6f, 0x6a, 0x00, 0x17, 0x00, 0xff, 0xbf, 0x21, 0x02, 0xfe, 0x4e, \n  0xff, 0xa5, 0xb3, 0xff, 0x71, 0xea, 0x00, 0xc4, 0x19, 0xfe, 0xaf, 0x1f, 0xff, 0xe6, 0xc6, 0xfe, \n  0xe1, 0x29, 0xff, 0x63, 0x41, 0x01, 0x1b, 0xc1, 0x3a, 0x0c, 0x53, 0x2b, 0xd7, 0xcc, 0xf8, 0xd6, \n  0xf6, 0x03, 0x4f, 0x73, 0xf1, 0x7e, 0x69, 0xf6, 0x57, 0x49, 0x02, 0xe5, 0x2d, 0x00, 0xa1, 0x94, \n  0xf7, 0xc0, 0x7c, 0x00, 0x8e, 0x53, 0xff, 0xc4, 0x0e, 0xfd, 0xea, 0x62, 0x08, 0x77, 0xf6, 0xf6, \n  0x4d, 0xf2, 0xfa, 0x01, 0x0e, 0x00, 0x19, 0x2f, 0xfc, 0x82, 0x87, 0xfc, 0x7e, 0x20, 0xfd, 0x6f, \n  0xde, 0xff, 0x84, 0x32, 0xfd, 0x1c, 0xc0, 0x00, 0xe8, 0xd5, 0xfe, 0xc5, 0xf4, 0x01, 0xd8, 0xcc, \n  0x00, 0x0b, 0x06, 0x00, 0xe3, 0xab, 0xff, 0x63, 0x25, 0xff, 0x34, 0x28, 0x00, 0xae, 0x80, 0xfd, \n  0xfc, 0x75, 0xff, 0xfe, 0x35, 0xff, 0x94, 0xa4, 0x38, 0xfd, 0x9c, 0x2a, 0x67, 0xd6, 0xfc, 0xeb, \n  0x08, 0x04, 0x4a, 0x7c, 0xf0, 0x08, 0xbd, 0xf2, 0x35, 0x76, 0x00, 0xef, 0xe9, 0x02, 0x06, 0xa4, \n  0xf7, 0xf5, 0x4c, 0x00, 0x6f, 0x25, 0x00, 0x01, 0xf1, 0xfd, 0x7e, 0x2d, 0x07, 0x41, 0xe6, 0xf8, \n  0x01, 0x64, 0xfb, 0x4a, 0xa6, 0xfe, 0x18, 0x90, 0xfc, 0x83, 0xc4, 0xfb, 0x3f, 0x3f, 0xfc, 0xdb, \n  0xe1, 0xff, 0xa1, 0xe7, 0xfd, 0x77, 0xf8, 0xff, 0x6b, 0x8b, 0xff, 0xd1, 0x3b, 0x03, 0x6d, 0x8d, \n  0xff, 0xdc, 0x38, 0x00, 0xb6, 0x7f, 0x00, 0xd0, 0xe5, 0xfe, 0xce, 0x64, 0x00, 0x2a, 0xfe, 0xfc, \n  0xdd, 0x29, 0x00, 0x47, 0x75, 0xfe, 0x98, 0x8f, 0x36, 0xb0, 0xe2, 0x29, 0x05, 0xd3, 0xfe, 0xdf, \n  0xf6, 0x05, 0xe8, 0x2b, 0xef, 0xd7, 0xb7, 0xee, 0xad, 0xc1, 0x00, 0xdb, 0xe7, 0x04, 0x7a, 0x34, \n  0xf7, 0xa4, 0xea, 0x01, 0x73, 0x32, 0xff, 0x63, 0xe8, 0xfd, 0xce, 0x90, 0x09, 0xfa, 0x3f, 0xf8, \n  0xa6, 0x1e, 0xfb, 0x13, 0xc2, 0xfe, 0x7c, 0xec, 0xfa, 0xfe, 0x66, 0xfc, 0x87, 0x99, 0xfc, 0xa5, \n  0x19, 0xff, 0x55, 0x4e, 0xfe, 0x62, 0x4e, 0x01, 0x7f, 0xd6, 0xff, 0xca, 0xab, 0x01, 0x2f, 0x16, \n  0x00, 0x97, 0x73, 0x01, 0xc8, 0xaf, 0xff, 0xa6, 0x17, 0xfe, 0x28, 0x28, 0x02, 0x17, 0xe7, 0xfc, \n  0xbf, 0xdb, 0xfe, 0x08, 0xff, 0xff, 0x07, 0x62, 0x36, 0x8a, 0x21, 0x26, 0xdf, 0x10, 0x01, 0xbf, \n  0xa3, 0x07, 0x86, 0x85, 0xec, 0xa0, 0x22, 0xee, 0xf4, 0x83, 0x00, 0xf6, 0xd2, 0x05, 0x1d, 0x11, \n  0xf9, 0xc2, 0xfe, 0x00, 0x78, 0xa9, 0xfe, 0xb1, 0x46, 0x00, 0xea, 0x76, 0x08, 0x27, 0x6d, 0xf8, \n  0x5a, 0x5e, 0xfb, 0x0d, 0x9c, 0xfc, 0x22, 0xdc, 0xfb, 0xd5, 0xd4, 0xfd, 0x51, 0xec, 0xfa, 0x66, \n  0xc3, 0xff, 0xa9, 0xda, 0x00, 0x79, 0x9c, 0xff, 0xf0, 0x32, 0xff, 0x8d, 0xde, 0x02, 0x96, 0xd1, \n  0xff, 0xef, 0xa6, 0x00, 0x53, 0x20, 0x00, 0x5c, 0x6c, 0xfe, 0x1e, 0x24, 0x02, 0x9d, 0x9b, 0xfd, \n  0x61, 0xda, 0xfd, 0x8e, 0x5d, 0x00, 0x1d, 0x27, 0x34, 0x27, 0x77, 0x23, 0xbc, 0x5e, 0x03, 0xf5, \n  0xe6, 0x07, 0x15, 0x2b, 0xec, 0x92, 0x13, 0xee, 0xb1, 0x34, 0x00, 0xa4, 0xf3, 0x05, 0x38, 0xce, \n  0xfa, 0x1c, 0x35, 0x02, 0xba, 0x1a, 0xfb, 0x73, 0x92, 0x02, 0x9a, 0xf9, 0x08, 0x6e, 0x74, 0xf6, \n  0x2c, 0xb3, 0xfb, 0x0e, 0x93, 0xfc, 0x0e, 0xb6, 0xfc, 0x77, 0x6d, 0xfd, 0x74, 0x09, 0xfc, 0x86, \n  0xce, 0x00, 0xbd, 0x7e, 0xff, 0x94, 0x8e, 0xff, 0x98, 0x59, 0x00, 0x13, 0xcc, 0x01, 0xae, 0x2f, \n  0xff, 0x78, 0x3f, 0x01, 0x48, 0x4e, 0x00, 0xcf, 0xae, 0xfe, 0x3c, 0x97, 0x01, 0xd6, 0x42, 0xfe, \n  0x44, 0x53, 0xfe, 0x82, 0xa2, 0xfe, 0xa7, 0x7d, 0x30, 0x17, 0x86, 0x22, 0x2d, 0x62, 0x04, 0x8d, \n  0x8b, 0x06, 0x7d, 0x10, 0xee, 0x46, 0x20, 0xf1, 0x76, 0xd3, 0xfc, 0x67, 0x46, 0x06, 0x56, 0xcc, \n  0xff, 0x14, 0x10, 0xfe, 0xa5, 0x69, 0xfa, 0x1f, 0x71, 0x05, 0x67, 0x0f, 0x06, 0xaf, 0xac, 0xf6, \n  0xa4, 0x84, 0xfd, 0x87, 0x5c, 0xfb, 0x32, 0x3c, 0xfd, 0x6e, 0xff, 0xff, 0xab, 0x28, 0xfb, 0x67, \n  0xec, 0xff, 0x4d, 0x93, 0x00, 0x10, 0x9f, 0xff, 0x9b, 0x7a, 0xff, 0xff, 0x61, 0x01, 0x65, 0xc6, \n  0xff, 0x75, 0x15, 0x01, 0x36, 0x65, 0x00, 0x62, 0x07, 0xff, 0x30, 0x71, 0x01, 0x85, 0x74, 0xfe, \n  0xf1, 0x9e, 0xfe, 0x84, 0x02, 0xfe, 0x9b, 0x2e, 0x31, 0xb7, 0x3a, 0x20, 0x22, 0x15, 0xff, 0x0e, \n  0x9d, 0x07, 0xce, 0x2b, 0xef, 0x74, 0xa3, 0xf3, 0x8f, 0xd4, 0xff, 0x95, 0x27, 0x03, 0x9f, 0x8c, \n  0xff, 0x7a, 0x4d, 0xff, 0xf5, 0x9f, 0xf9, 0x71, 0x67, 0x05, 0xc9, 0xe1, 0x04, 0xf9, 0xd9, 0xf6, \n  0xbd, 0x55, 0xfe, 0x4d, 0xf9, 0xfb, 0xf6, 0xd6, 0xfe, 0x27, 0x71, 0xff, 0xa1, 0x71, 0xfa, 0x8a, \n  0x7a, 0x01, 0xab, 0xb3, 0x00, 0x1e, 0xf4, 0xfd, 0x26, 0xc8, 0xff, 0x95, 0xb1, 0x01, 0xc6, 0xd6, \n  0xff, 0x69, 0xf8, 0x00, 0xa4, 0xe4, 0xff, 0x8e, 0xd4, 0xff, 0x47, 0xca, 0x01, 0x2f, 0x9a, 0xfd, \n  0x5a, 0x62, 0xfe, 0x30, 0xf8, 0xfe, 0x66, 0xd9, 0x2e, 0x64, 0xe5, 0x1b, 0x26, 0xdf, 0xff, 0xf9, \n  0x32, 0x09, 0x2b, 0xc1, 0xee, 0x86, 0xaf, 0xf8, 0xa0, 0xa7, 0xfe, 0x9d, 0x45, 0x01, 0x8e, 0x16, \n  0x02, 0xd2, 0xbf, 0xfc, 0xc6, 0x2e, 0xf9, 0x6b, 0xd8, 0x06, 0x2c, 0xf2, 0x03, 0x7e, 0x84, 0xf6, \n  0x91, 0x57, 0x00, 0x9f, 0xd3, 0xfc, 0x5f, 0xaa, 0xfe, 0x01, 0x43, 0xff, 0x91, 0xe7, 0xfa, 0x0d, \n  0x19, 0x02, 0x06, 0xc5, 0xff, 0xb7, 0xa3, 0xfd, 0xaf, 0x53, 0x00, 0x60, 0xa8, 0x01, 0x02, 0x4f, \n  0xff, 0xcb, 0x38, 0x01, 0x25, 0x86, 0x00, 0x23, 0xad, 0xff, 0x1c, 0x80, 0x01, 0xb3, 0x9e, 0xfd, \n  0x7a, 0x7e, 0xfe, 0x24, 0x24, 0xff, 0x5c, 0x3b, 0x2b, 0x07, 0x74, 0x18, 0xf5, 0x7d, 0x00, 0xc9, \n  0xcc, 0x0a, 0x40, 0xc3, 0xf1, 0xf5, 0x84, 0xf8, 0x31, 0x43, 0xff, 0x24, 0xe6, 0x01, 0xdc, 0xf7, \n  0xff, 0x64, 0x5c, 0xfc, 0x71, 0xa4, 0xfa, 0x04, 0x56, 0x06, 0xb8, 0x8b, 0x02, 0xcb, 0xa5, 0xf8, \n  0x7a, 0x62, 0x01, 0x29, 0x84, 0xfc, 0x12, 0xc8, 0xfe, 0xa5, 0x6d, 0xff, 0x9a, 0xb1, 0xfb, 0x8c, \n  0x9b, 0x01, 0xd2, 0x4a, 0xff, 0x7e, 0xc6, 0xfd, 0x7d, 0xf2, 0x00, 0x0f, 0xfe, 0x00, 0x8e, 0xe9, \n  0xfe, 0xee, 0x19, 0x02, 0x61, 0xb5, 0x00, 0xc1, 0x64, 0xff, 0x03, 0x30, 0x01, 0x10, 0xc9, 0xfd, \n  0xb9, 0x71, 0xfe, 0x60, 0x65, 0xff, 0xb2, 0x46, 0x29, 0xb2, 0xed, 0x1d, 0x15, 0x50, 0x06, 0x4b, \n  0x3f, 0x01, 0xe2, 0xf5, 0xe4, 0xcf, 0xd0, 0xf6, 0x28, 0xf6, 0x07, 0x35, 0xb4, 0x08, 0xa5, 0xa9, \n  0xfe, 0xa3, 0xe2, 0xfa, 0x4a, 0x20, 0xf7, 0xf8, 0xae, 0x00, 0x2c, 0x65, 0x04, 0x9f, 0xbf, 0xfa, \n  0xb1, 0x1e, 0x03, 0x8a, 0x0f, 0xff, 0x17, 0x75, 0xfe, 0x80, 0x9b, 0x01, 0x07, 0x41, 0xfe, 0x77, \n  0x45, 0x01, 0xda, 0xcf, 0xff, 0x7c, 0x50, 0xfe, 0x6a, 0x5d, 0xff, 0x52, 0x30, 0xfe, 0xe6, 0xe7, \n  0xfe, 0x60, 0x74, 0x01, 0x3f, 0x8b, 0xfe, 0xff, 0xbc, 0xff, 0x15, 0x93, 0x02, 0xc3, 0x2c, 0xff, \n  0x5d, 0x9a, 0x00, 0x0b, 0xb6, 0xff, 0xfe, 0xc0, 0x22, 0x9c, 0x34, 0x1d, 0xc5, 0x76, 0x08, 0x96, \n  0x61, 0x03, 0x64, 0xf6, 0xe8, 0x64, 0x82, 0xf3, 0xe2, 0x99, 0x05, 0xe7, 0x31, 0x07, 0x79, 0x17, \n  0x01, 0xe1, 0xd0, 0xfd, 0x45, 0x9e, 0xf7, 0x68, 0x9d, 0xfe, 0x76, 0x16, 0x03, 0x5e, 0x2c, 0xfd, \n  0x12, 0x9c, 0x02, 0x5a, 0xee, 0xfe, 0x4c, 0xcf, 0xfe, 0xf6, 0xe9, 0x01, 0x76, 0x89, 0xfe, 0x3f, \n  0xb9, 0x00, 0xdb, 0xaa, 0x00, 0x11, 0xd7, 0xfe, 0x27, 0x6f, 0xff, 0x6e, 0x6c, 0xfe, 0xfe, 0x6a, \n  0xfe, 0x79, 0xb2, 0x00, 0x2d, 0x28, 0xfe, 0xda, 0x22, 0x00, 0x2c, 0xf6, 0x02, 0x4c, 0xb9, 0xff, \n  0x5b, 0x18, 0x01, 0x4b, 0xbe, 0xff, 0xde, 0x12, 0x1e, 0xa9, 0xd3, 0x1a, 0x33, 0x24, 0x09, 0x6d, \n  0xaa, 0x04, 0xf6, 0xd0, 0xec, 0x37, 0x83, 0xf4, 0xe3, 0xfb, 0x03, 0x26, 0x0d, 0x05, 0x5c, 0x6d, \n  0x01, 0xa6, 0xd3, 0xfe, 0x9f, 0xff, 0xf8, 0xd1, 0xe0, 0xfd, 0xa1, 0xf5, 0x02, 0x92, 0x15, 0xfe, \n  0x29, 0x73, 0x01, 0xca, 0x48, 0xff, 0x1f, 0xee, 0xfe, 0x44, 0xb1, 0x01, 0xef, 0xf5, 0xfe, 0xc6, \n  0x49, 0x00, 0xd2, 0xb4, 0x00, 0x35, 0x6e, 0xff, 0x93, 0x3f, 0xff, 0x88, 0x76, 0xfe, 0xe8, 0xb6, \n  0xfe, 0xff, 0x22, 0x00, 0x76, 0x6f, 0xfe, 0x96, 0x89, 0x00, 0x90, 0xa1, 0x02, 0x5d, 0x48, 0x00, \n  0xe1, 0xf5, 0x00, 0x86, 0x93, 0xff, 0x8e, 0xbd, 0x18, 0x28, 0x60, 0x18, 0xed, 0xaf, 0x0a, 0x9c, \n  0x02, 0x05, 0xe6, 0xcc, 0xf0, 0x8c, 0x40, 0xf6, 0x1e, 0xa9, 0x01, 0xdf, 0xd5, 0x03, 0x07, 0xd0, \n  0x01, 0xc2, 0x86, 0xff, 0x39, 0x7d, 0xfa, 0x16, 0x89, 0xfd, 0x54, 0xaf, 0x02, 0x4c, 0x85, 0xfe, \n  0xfa, 0xb4, 0x00, 0xf5, 0xaa, 0xff, 0x52, 0x16, 0xff, 0x0b, 0x71, 0x01, 0x5e, 0x73, 0xff, 0x90, \n  0x0d, 0x00, 0xb0, 0xd3, 0x00, 0x48, 0xea, 0xff, 0x4d, 0x11, 0xff, 0xa1, 0xa6, 0xfe, 0x64, 0xef, \n  0xfe, 0xce, 0x0a, 0x00, 0xcd, 0x4b, 0xff, 0xae, 0xc5, 0x00, 0xdb, 0x14, 0x02, 0x3a, 0x87, 0x00, \n  0x39, 0x9e, 0x00, 0x65, 0x7b, 0xff, 0x62, 0xbd, 0x14, 0xea, 0xbc, 0x16, 0xae, 0xcf, 0x0b, 0x31, \n  0xc1, 0x04, 0x3f, 0xd4, 0xf3, 0x7d, 0x8f, 0xf7, 0x60, 0x5e, 0x00, 0x8e, 0x53, 0x03, 0x89, 0xc6, \n  0x01, 0x90, 0x14, 0x00, 0xcc, 0xc7, 0xfb, 0x14, 0x88, 0xfd, 0x72, 0x1d, 0x02, 0xdb, 0xc8, 0xfe, \n  0x0f, 0xa5, 0x00, 0xf7, 0xe6, 0xff, 0xb0, 0x19, 0xff, 0x69, 0x68, 0x01, 0x80, 0xf9, 0xff, 0x01, \n  0xf9, 0xff, 0xe7, 0xe6, 0x00, 0x90, 0x17, 0x00, 0x0c, 0x1e, 0xff, 0x31, 0x40, 0xff, 0x75, 0x83, \n  0xff, 0x07, 0x0d, 0x00, 0xc7, 0x9d, 0xff, 0xb4, 0xb9, 0x00, 0x67, 0x79, 0x01, 0x95, 0x74, 0x00, \n  0x51, 0x5e, 0x00, 0x1f, 0x5d, 0xff, 0x2d, 0xcc, 0x10, 0xbf, 0xc8, 0x14, 0xb0, 0x84, 0x0c, 0x77, \n  0x0f, 0x05, 0x09, 0x96, 0xf6, 0xfa, 0x4c, 0xf8, 0x9b, 0x90, 0xff, 0xf7, 0xde, 0x02, 0x2d, 0xdc, \n  0x01, 0x3f, 0x8f, 0x00, 0x1d, 0xb1, 0xfc, 0x6e, 0xc4, 0xfd, 0xfd, 0xa1, 0x01, 0x57, 0xd9, 0xfe, \n  0x82, 0x82, 0x00, 0x57, 0x4c, 0x00, 0xb1, 0x4a, 0xff, 0xb3, 0x43, 0x01, 0xc0, 0x5c, 0x00, 0x04, \n  0x08, 0x00, 0x9a, 0xdc, 0x00, 0x3f, 0x91, 0x00, 0x99, 0xdf, 0xff, 0x78, 0xe8, 0xff, 0x78, 0x88, \n  0xff, 0xae, 0x6b, 0xff, 0xf7, 0xb7, 0xff, 0x77, 0x71, 0x00, 0x80, 0xb3, 0x00, 0x91, 0x51, 0x00, \n  0x92, 0x39, 0x00, 0x43, 0x94, 0xff, 0x57, 0x29, 0x0e, 0x61, 0xff, 0x12, 0xfe, 0xf2, 0x0c, 0xe9, \n  0xce, 0x05, 0xbb, 0x4f, 0xf8, 0x6b, 0xca, 0xf8, 0x6f, 0x4c, 0xff, 0x37, 0xba, 0x02, 0x8d, 0x21, \n  0x02, 0x13, 0xbc, 0x00, 0x78, 0x6c, 0xfd, 0x5d, 0x59, 0xfe, 0x3d, 0x21, 0x01, 0xcc, 0xdb, 0xfe, \n  0x39, 0xda, 0x00, 0xb2, 0x9c, 0x00, 0x41, 0x88, 0xff, 0xa2, 0x61, 0x01, 0x22, 0x6b, 0x00, 0x1a, \n  0xa0, 0x00, 0x5e, 0xc4, 0x01, 0xbf, 0xd6, 0x00, 0x25, 0xe7, 0xff, 0x9e, 0x07, 0x00, 0xbd, 0x49, \n  0xff, 0xc3, 0xd5, 0xfe, 0x56, 0xd1, 0xff, 0x36, 0x63, 0x00, 0xfb, 0x68, 0x00, 0xe5, 0x85, 0x00, \n  0x16, 0x35, 0x00, 0x64, 0x66, 0xff, 0x7a, 0x9f, 0x0c, 0x17, 0xd3, 0x11, 0xf4, 0x7d, 0x0c, 0x42, \n  0x6d, 0x05, 0xb3, 0x3a, 0xf9, 0x79, 0xc1, 0xf9, 0xcf, 0x6e, 0xff, 0x54, 0x4d, 0x02, 0x55, 0x18, \n  0x02, 0xe1, 0xef, 0x00, 0xd9, 0xff, 0xfd, 0xef, 0x78, 0xfe, 0x85, 0xcc, 0x00, 0x82, 0x0b, 0xff, \n  0x04, 0x13, 0x01, 0xd8, 0xaf, 0x00, 0xa6, 0x94, 0xff, 0xa1, 0xcc, 0x01, 0xc6, 0x42, 0x01, 0xaa, \n  0x0e, 0x01, 0x77, 0x82, 0x01, 0xfe, 0x74, 0x00, 0x80, 0xa5, 0xff, 0x2b, 0x94, 0xff, 0x5b, 0x9c, \n  0xfe, 0x6e, 0xea, 0xfe, 0xb7, 0x1e, 0x00, 0xd1, 0xed, 0xff, 0xd9, 0x6b, 0x00, 0xd9, 0x26, 0x00, \n  0x1d, 0xbe, 0xff, 0xbf, 0x15, 0x00, 0x24, 0x14, 0x0b, 0x18, 0x3d, 0x10, 0x37, 0x3d, 0x0c, 0xda, \n  0xb5, 0x05, 0x05, 0x1b, 0xfa, 0xf8, 0x41, 0xfa, 0xdc, 0x83, 0xff, 0x0b, 0x63, 0x02, 0xd3, 0x3f, \n  0x02, 0xae, 0xf8, 0x00, 0xac, 0x9f, 0xfe, 0xa6, 0xd6, 0xfe, 0xdf, 0xa4, 0x00, 0x2f, 0x4a, 0xff, \n  0x3e, 0x08, 0x01, 0xd7, 0x83, 0x01, 0x27, 0xfc, 0x00, 0x7d, 0xef, 0x01, 0x63, 0x0b, 0x01, 0xe7, \n  0xb7, 0x00, 0xca, 0xfc, 0x00, 0xdf, 0xcc, 0xff, 0x08, 0x24, 0xff, 0xf0, 0xa1, 0xff, 0x48, 0x94, \n  0xfe, 0x1a, 0x22, 0xff, 0x86, 0x3e, 0x00, 0x31, 0x6a, 0xff, 0x00, 0xf7, 0xff, 0xe1, 0x97, 0x00, \n  0x82, 0x21, 0x00, 0x6a, 0xee, 0xff, 0x8f, 0xa1, 0x0a, 0x68, 0xdf, 0x0f, 0x60, 0x59, 0x0b, 0x70, \n  0xda, 0x04, 0x39, 0x9a, 0xfa, 0xae, 0x3c, 0xfb, 0x62, 0x16, 0x00, 0x1d, 0x7a, 0x02, 0x71, 0x50, \n  0x02, 0xf0, 0x08, 0x01, 0xfc, 0x5f, 0xff, 0x1e, 0x1b, 0xff, 0x82, 0x65, 0x00, 0xbf, 0x31, 0x00, \n  0x15, 0x2e, 0x02, 0x6a, 0x25, 0x02, 0x95, 0xba, 0x00, 0xd5, 0x33, 0x01, 0x09, 0xb4, 0x00, 0x46, \n  0x67, 0x00, 0x53, 0x78, 0x00, 0x9d, 0xa7, 0xff, 0x91, 0x62, 0xff, 0xb2, 0x80, 0xff, 0x37, 0xd9, \n  0xfe, 0xcd, 0x47, 0xff, 0xf1, 0x98, 0xff, 0x69, 0xfb, 0xff, 0x29, 0x89, 0x00, 0xa6, 0x15, 0x00, \n  0x97, 0xeb, 0xff, 0x8d, 0x1a, 0x00, 0xe7, 0x71, 0x0a, 0x2a, 0x5a, 0x0f, 0xc5, 0x74, 0x0a, 0x79, \n  0xfe, 0x03, 0x47, 0xed, 0xfa, 0x89, 0x71, 0xfc, 0xe8, 0xdb, 0x00, 0xec, 0x77, 0x02, 0xfe, 0x8b, \n  0x02, 0xf5, 0x55, 0x01, 0x35, 0xc7, 0xff, 0xd2, 0xd8, 0xff, 0xbd, 0x98, 0x01, 0xb8, 0xde, 0x00, \n  0x02, 0xa7, 0x01, 0x32, 0x64, 0x01, 0xf4, 0x29, 0x00, 0x7c, 0xa0, 0x00, 0xd3, 0x58, 0x00, 0x9b, \n  0x5e, 0x00, 0xaa, 0x5e, 0x00, 0x17, 0xb7, 0xff, 0xac, 0x36, 0xff, 0x30, 0x60, 0xff, 0xf4, 0xdf, \n  0xfe, 0x1b, 0xbf, 0xff, 0x67, 0x61, 0x00, 0xa2, 0x6f, 0xff, 0x62, 0x02, 0x00, 0x02, 0x08, 0x00, \n  0x02, 0x27, 0x00, 0xdb, 0x45, 0x00, 0x1e, 0x59, 0x0a, 0xfc, 0x42, 0x0f, 0x61, 0x6e, 0x09, 0x76, \n  0x76, 0x03, 0x4d, 0xa0, 0xfb, 0x5d, 0x26, 0xfd, 0x0a, 0xa7, 0x01, 0x2e, 0xd5, 0x02, 0xa1, 0x61, \n  0x02, 0x16, 0xe2, 0x01, 0xe9, 0x5c, 0x01, 0x6a, 0x15, 0x00, 0x17, 0xba, 0x00, 0x52, 0x99, 0x00, \n  0x73, 0xf0, 0x00, 0xb7, 0xda, 0x00, 0x6b, 0x12, 0x00, 0xf0, 0x79, 0x00, 0xcd, 0x73, 0x00, 0x14, \n  0x60, 0x00, 0xcf, 0x1f, 0x00, 0x9e, 0x95, 0xff, 0x3a, 0x18, 0xff, 0x3e, 0x92, 0xff, 0xdd, 0x06, \n  0x00, 0xe8, 0xbc, 0xff, 0x24, 0x5f, 0xff, 0x92, 0x80, 0xff, 0xc1, 0x08, 0x00, 0xf8, 0x0c, 0x00, \n  0xab, 0x0e, 0x00, 0x1f, 0x63, 0x00, 0x57, 0xbe, 0x09, 0x3e, 0xf3, 0x0e, 0x41, 0x02, 0x09, 0xe5, \n  0x49, 0x03, 0xa8, 0xbf, 0xfc, 0x93, 0x2f, 0xfe, 0x7b, 0x46, 0x02, 0xb4, 0x3f, 0x03, 0x58, 0x71, \n  0x03, 0x71, 0x6b, 0x02, 0xab, 0x77, 0x00, 0x19, 0x86, 0xff, 0xfc, 0x01, 0x00, 0x1e, 0xec, 0xff, \n  0x71, 0xb6, 0x00, 0xa3, 0xa0, 0x00, 0xa6, 0x3f, 0x00, 0x44, 0x5d, 0x00, 0x5d, 0x42, 0x00, 0x0a, \n  0x2f, 0x00, 0x51, 0x06, 0x00, 0xa2, 0xb4, 0xff, 0x6c, 0xaf, 0xff, 0x65, 0x82, 0x00, 0xff, 0x56, \n  0xff, 0x5f, 0xfb, 0xfe, 0xc3, 0x86, 0xff, 0x37, 0xa7, 0xff, 0x72, 0xa1, 0xff, 0x7e, 0xcf, 0xff, \n  0xbd, 0x98, 0x00, 0x8a, 0xe2, 0xff, 0x00, 0xa1, 0x09, 0xf8, 0xed, 0x0e, 0x99, 0x64, 0x08, 0xf2, \n  0x10, 0x03, 0x80, 0x3a, 0xfe, 0xcb, 0x2f, 0xff, 0xbd, 0x0f, 0x03, 0x5b, 0x15, 0x04, 0x57, 0x85, \n  0x02, 0x0e, 0x3e, 0x01, 0x40, 0x37, 0x00, 0xd1, 0x44, 0xff, 0x08, 0xd5, 0xff, 0xf2, 0xa7, 0xff, \n  0x86, 0xb0, 0x00, 0x9a, 0xa2, 0x00, 0xb2, 0x0a, 0x00, 0xb9, 0x29, 0x00, 0xac, 0x3e, 0x00, 0xbf, \n  0x87, 0x00, 0xea, 0xc1, 0xff, 0x53, 0x78, 0x00, 0xb8, 0x81, 0x00, 0x09, 0x2b, 0xff, 0x44, 0x22, \n  0xff, 0xc1, 0x6b, 0xff, 0x48, 0x5a, 0xff, 0x01, 0x3d, 0xff, 0x3d, 0xc2, 0xff, 0xa5, 0xf9, 0xff, \n  0x62, 0xd6, 0xff, 0x3b, 0x16, 0x00, 0x62, 0xef, 0x09, 0x2f, 0x1d, 0x0f, 0x28, 0xea, 0x07, 0xf8, \n  0xfc, 0x02, 0x0d, 0x53, 0xff, 0x81, 0x92, 0x00, 0x5a, 0x3c, 0x03, 0x1a, 0x07, 0x03, 0x17, 0x9c, \n  0x01, 0xef, 0xc2, 0x00, 0xfd, 0x04, 0x00, 0x81, 0x6a, 0xff, 0xa7, 0xdf, 0xff, 0x69, 0x66, 0xff, \n  0xe8, 0x9d, 0x00, 0x76, 0x98, 0x00, 0x0f, 0x9e, 0xff, 0x3c, 0x51, 0x00, 0xea, 0xdb, 0x00, 0xd2, \n  0x14, 0x00, 0x75, 0x69, 0x00, 0xba, 0x37, 0x01, 0x28, 0x41, 0xff, 0xb8, 0x22, 0xff, 0x6f, 0x76, \n  0xff, 0x77, 0x1c, 0xff, 0x27, 0x03, 0xff, 0xf2, 0x8a, 0xff, 0x76, 0xc9, 0xff, 0x99, 0x2e, 0xff, \n  0x1d, 0x12, 0x00, 0xb7, 0x94, 0x00, 0x82, 0xd4, 0x09, 0x46, 0xf1, 0x0f, 0x9e, 0xa2, 0x08, 0x9e, \n  0xdf, 0x02, 0x98, 0x7a, 0xff, 0xdb, 0x58, 0x00, 0xd1, 0x94, 0x02, 0xf1, 0x97, 0x02, 0x0e, 0x4a, \n  0x01, 0x16, 0xb0, 0x00, 0x7d, 0x5c, 0x00, 0xb2, 0x05, 0xff, 0x04, 0xd0, 0xff, 0xce, 0xb8, 0xff, \n  0x0d, 0x1d, 0x00, 0x78, 0x8e, 0x00, 0x6e, 0xea, 0xff, 0xe3, 0xa5, 0x00, 0x50, 0x75, 0x00, 0xb6, \n  0xb9, 0x00, 0x11, 0x77, 0x01, 0x0c, 0xc7, 0xff, 0x7b, 0x39, 0xff, 0x40, 0xe5, 0xff, 0x73, 0x05, \n  0xff, 0x73, 0x98, 0xfe, 0x93, 0x54, 0xff, 0x90, 0x9f, 0xff, 0xbf, 0x1a, 0xff, 0xb1, 0x82, 0xff, \n  0x24, 0x6a, 0x00, 0x45, 0xd9, 0x00, 0x56, 0x6c, 0x0a, 0xe3, 0x00, 0x11, 0x34, 0xf4, 0x08, 0x00, \n  0x45, 0x02, 0x83, 0xd4, 0xfe, 0x9d, 0x32, 0xff, 0x33, 0xf8, 0x01, 0x3c, 0x21, 0x03, 0x1c, 0x79, \n  0x01, 0x47, 0xa6, 0x00, 0xf0, 0x6c, 0x00, 0x1f, 0xe1, 0xfe, 0x10, 0x82, 0xff, 0x63, 0xde, 0xff, \n  0x84, 0x56, 0x00, 0x6a, 0x61, 0x00, 0xd7, 0x56, 0x00, 0xf4, 0x83, 0x00, 0x35, 0x37, 0x00, 0x15, \n  0xd4, 0x01, 0x30, 0x05, 0x01, 0xf4, 0x43, 0xff, 0xbf, 0xb5, 0xff, 0x73, 0xba, 0xff, 0x41, 0xf6, \n  0xfe, 0xce, 0x9d, 0xfe, 0x68, 0x66, 0xff, 0xa1, 0x0a, 0xff, 0x1d, 0x24, 0xff, 0xf8, 0x39, 0x00, \n  0x73, 0x96, 0x00, 0xd9, 0x4f, 0x00, 0xbc, 0x86, 0x0a, 0x6e, 0x07, 0x12, 0x61, 0x68, 0x09, 0xc1, \n  0x8f, 0x01, 0x12, 0x3a, 0xfe, 0xd8, 0x58, 0xfe, 0xef, 0x88, 0x01, 0x48, 0x07, 0x03, 0xd0, 0x58, \n  0x01, 0xb2, 0x01, 0x01, 0x65, 0x8d, 0x00, 0x25, 0xa8, 0xfe, 0xb5, 0x94, 0xff, 0xde, 0x0b, 0x00, \n  0x6d, 0x34, 0x00, 0x7b, 0x86, 0x00, 0xe4, 0xbc, 0x00, 0x5c, 0xe7, 0xff, 0x14, 0x58, 0x00, 0x90, \n  0x98, 0x02, 0xe7, 0x98, 0x00, 0x71, 0x41, 0xff, 0x8f, 0xff, 0xff, 0xe6, 0x94, 0xff, 0x04, 0xd5, \n  0xfe, 0x6f, 0x13, 0xff, 0xb5, 0x46, 0xff, 0xa8, 0x90, 0xfe, 0x5b, 0x2f, 0xff, 0xe6, 0x8b, 0x00, \n  0x38, 0xf6, 0x00, 0xc4, 0xb4, 0xff, 0x05, 0x01, 0x0a, 0x92, 0x4f, 0x12, 0xab, 0x78, 0x0a, 0xaa, \n  0x54, 0x01, 0x07, 0x83, 0xfd, 0xa5, 0x12, 0xfe, 0x78, 0xaf, 0x01, 0xcd, 0x18, 0x03, 0x4c, 0xe8, \n  0x00, 0x13, 0x48, 0x00, 0x15, 0x6d, 0x00, 0x2c, 0x2d, 0xff, 0xf9, 0x9e, 0xff, 0xa8, 0xfe, 0xff, \n  0xea, 0xa4, 0x00, 0x5e, 0x7a, 0x00, 0xe6, 0x52, 0x00, 0xa8, 0x1e, 0x00, 0xb7, 0x31, 0x00, 0x62, \n  0x58, 0x02, 0xd6, 0x31, 0x01, 0x2c, 0x56, 0xff, 0x03, 0xd9, 0xff, 0x6a, 0xb3, 0xff, 0x7d, 0xe8, \n  0xfe, 0x66, 0x3a, 0xff, 0x76, 0x38, 0xff, 0x1a, 0x9c, 0xfe, 0xec, 0x3b, 0xff, 0x58, 0x53, 0x00, \n  0x60, 0xdf, 0x00, 0x75, 0xce, 0xff, 0x65, 0x31, 0x09, 0xb8, 0x44, 0x12, 0xa9, 0xee, 0x0b, 0x20, \n  0xd7, 0x01, 0x53, 0xcf, 0xfc, 0xb0, 0x9a, 0xfd, 0x9f, 0xbd, 0x01, 0x65, 0xa7, 0x03, 0x2b, 0x5e, \n  0x01, 0xe7, 0x8c, 0xff, 0x75, 0xa1, 0xff, 0x07, 0xf9, 0xfe, 0xae, 0x3f, 0xff, 0x5f, 0x66, 0x00, \n  0x9c, 0x4d, 0x01, 0xa9, 0x80, 0x00, 0x40, 0x5b, 0x00, 0x2b, 0x45, 0x00, 0x92, 0x99, 0xff, 0xd5, \n  0x0e, 0x02, 0x12, 0x02, 0x02, 0x96, 0x7e, 0xff, 0x77, 0xa9, 0xff, 0x10, 0x0e, 0x00, 0xd4, 0x43, \n  0xff, 0x75, 0x4d, 0xff, 0x25, 0x59, 0xff, 0x81, 0xd6, 0xfe, 0x84, 0x3e, 0xff, 0x8e, 0x56, 0x00, \n  0xb4, 0xd9, 0x00, 0xb0, 0xc6, 0xff, 0xd7, 0x02, 0x09, 0xdf, 0x5d, 0x12, 0x1c, 0xaf, 0x0c, 0x15, \n  0x22, 0x02, 0xf4, 0x57, 0xfc, 0x3b, 0x20, 0xfd, 0x85, 0xc0, 0x01, 0x16, 0x14, 0x04, 0x96, 0x9a, \n  0x01, 0x79, 0x58, 0xff, 0xb6, 0x57, 0xff, 0xcc, 0xcc, 0xfe, 0x9a, 0x90, 0xfe, 0x69, 0xab, 0xff, \n  0x38, 0x4e, 0x01, 0x79, 0x13, 0x01, 0x89, 0x53, 0x00, 0xa4, 0x5b, 0x00, 0x7f, 0xcf, 0xff, 0xdf, \n  0x20, 0x01, 0xbe, 0x38, 0x02, 0x63, 0x0d, 0x00, 0xaf, 0x3c, 0xff, 0x95, 0xcd, 0xff, 0x91, 0x98, \n  0xff, 0x59, 0xb4, 0xff, 0x4c, 0x7d, 0xff, 0x7f, 0xcd, 0xfe, 0xb5, 0x36, 0xff, 0x9f, 0x76, 0x00, \n  0xfe, 0xb6, 0x00, 0x02, 0xf0, 0xff, 0x19, 0x6e, 0x09, 0xcf, 0xfb, 0x12, 0x8d, 0xe0, 0x0c, 0x59, \n  0x3e, 0x02, 0xc2, 0xc0, 0xfb, 0x38, 0xb1, 0xfc, 0x5a, 0x1e, 0x02, 0xd7, 0x52, 0x04, 0xd3, 0xcf, \n  0x01, 0x42, 0x1c, 0xff, 0x88, 0x27, 0xff, 0xb2, 0x02, 0xff, 0xf3, 0x5f, 0xfe, 0x97, 0x33, 0xff, \n  0xd4, 0xb9, 0x00, 0x90, 0xd8, 0x00, 0x66, 0x41, 0x00, 0x27, 0x7e, 0x00, 0x3c, 0x5a, 0x00, 0xca, \n  0xc8, 0x00, 0x66, 0xfd, 0x01, 0x09, 0xc1, 0x00, 0x92, 0x01, 0xff, 0x53, 0x24, 0xff, 0xaa, 0xb4, \n  0xff, 0x6e, 0xf6, 0xff, 0x20, 0xe2, 0xff, 0x0f, 0x10, 0xff, 0xa4, 0x46, 0xff, 0x8c, 0x72, 0x00, \n  0x9e, 0xab, 0x00, 0xdf, 0x2e, 0x00, 0xdf, 0x05, 0x0a, 0x30, 0xee, 0x13, 0xd3, 0x73, 0x0d, 0x23, \n  0x1c, 0x02, 0x81, 0xff, 0xfa, 0x0c, 0x36, 0xfc, 0x7a, 0x48, 0x02, 0x20, 0x03, 0x05, 0xb2, 0xcf, \n  0x01, 0x85, 0xaf, 0xfe, 0x3b, 0x26, 0xff, 0x27, 0x0d, 0xff, 0x4c, 0x73, 0xfe, 0x9b, 0x16, 0xff, \n  0x40, 0x57, 0x00, 0x9f, 0x9b, 0x00, 0x45, 0xbc, 0xff, 0xe1, 0xc7, 0xff, 0x61, 0xba, 0x00, 0x81, \n  0xcc, 0x00, 0xc4, 0xb6, 0x01, 0xf2, 0x8d, 0x01, 0xba, 0x72, 0xff, 0xe0, 0x6e, 0xfe, 0x92, 0x10, \n  0xff, 0x73, 0xe7, 0xff, 0x79, 0x3e, 0x00, 0x33, 0x6d, 0xff, 0x52, 0x44, 0xff, 0x6f, 0xae, 0x00, \n  0x9d, 0xb1, 0x00, 0x47, 0x3c, 0x00, 0x22, 0xa5, 0x0a, 0x79, 0x42, 0x15, 0xe9, 0xfb, 0x0d, 0x38, \n  0x65, 0x01, 0x26, 0x5d, 0xfa, 0x88, 0xea, 0xfb, 0x7b, 0x63, 0x02, 0xd7, 0x98, 0x05, 0x48, 0xa9, \n  0x01, 0xdf, 0x2e, 0xfe, 0xf7, 0x06, 0xff, 0xf6, 0x1a, 0xff, 0x0b, 0x8e, 0xfe, 0xfc, 0x1b, 0xff, \n  0xde, 0x15, 0x00, 0x85, 0x66, 0x00, 0x41, 0xc4, 0xff, 0x80, 0x22, 0xff, 0x97, 0x41, 0x00, 0x82, \n  0xd7, 0x00, 0xf7, 0x47, 0x01, 0x31, 0x99, 0x01, 0xc6, 0x5d, 0x00, 0xa4, 0x8a, 0xfe, 0x51, 0x57, \n  0xfe, 0x9a, 0x81, 0xff, 0xd9, 0x3b, 0x00, 0xcb, 0x88, 0xff, 0xf5, 0x40, 0xff, 0x8f, 0xae, 0x00, \n  0xa7, 0x9a, 0x00, 0xb2, 0x50, 0x00, 0x47, 0xc2, 0x0b, 0x60, 0x01, 0x17, 0x49, 0x88, 0x0e, 0xc8, \n  0x81, 0x00, 0x49, 0x90, 0xf9, 0x5e, 0x49, 0xfb, 0xae, 0xa7, 0x02, 0xeb, 0xb9, 0x06, 0x94, 0x42, \n  0x01, 0xdb, 0x61, 0xfd, 0x32, 0xe5, 0xfe, 0x76, 0x41, 0xff, 0x4a, 0x93, 0xfe, 0x69, 0x2c, 0xff, \n  0x82, 0x1a, 0x00, 0xba, 0x2e, 0x00, 0x21, 0xb0, 0xff, 0xdf, 0xdf, 0xfe, 0x5c, 0xe9, 0xff, 0xf9, \n  0xa2, 0x00, 0x30, 0xcc, 0x00, 0xdf, 0x2e, 0x01, 0x8a, 0xdc, 0x00, 0x4d, 0x04, 0xff, 0x98, 0x4e, \n  0xfe, 0x3e, 0x13, 0xff, 0xc4, 0xf7, 0xff, 0xf1, 0xae, 0xff, 0x93, 0x1c, 0xff, 0xd4, 0x6c, 0x00, \n  0xd7, 0x5f, 0x00, 0xb4, 0x2e, 0x00, 0xb4, 0x1c, 0x0d, 0x74, 0xcd, 0x18, 0x13, 0xba, 0x0e, 0xa2, \n  0x88, 0xff, 0xb2, 0xae, 0xf8, 0xe7, 0xa9, 0xfa, 0x65, 0x37, 0x03, 0x4e, 0xaa, 0x07, 0x20, 0xc2, \n  0x00, 0x03, 0x9a, 0xfc, 0x74, 0xc5, 0xfe, 0x0f, 0x72, 0xff, 0x89, 0x6b, 0xfe, 0x8b, 0x35, 0xff, \n  0x1b, 0x44, 0x00, 0x90, 0xfd, 0xff, 0x83, 0x8e, 0xff, 0xbb, 0xb7, 0xfe, 0xd7, 0xcc, 0xff, 0xd2, \n  0x83, 0x00, 0xf0, 0x71, 0x00, 0x2e, 0xcc, 0x00, 0x20, 0xe7, 0x00, 0xc8, 0x5b, 0xff, 0xe7, 0x2a, \n  0xfe, 0x27, 0xf3, 0xfe, 0x3d, 0xfb, 0xff, 0xd0, 0xb8, 0xff, 0xae, 0x0c, 0xff, 0xb7, 0x4b, 0x00, \n  0x87, 0x12, 0x00, 0x98, 0x74, 0xff, 0xcd, 0xdd, 0x0d, 0x92, 0x44, 0x1b, 0x14, 0xd2, 0x0f, 0x24, \n  0x4f, 0xfe, 0x76, 0x85, 0xf7, 0x43, 0x13, 0xfa, 0x7c, 0x74, 0x03, 0x02, 0xd0, 0x08, 0x36, 0x72, \n  0x00, 0x13, 0x87, 0xfb, 0xbd, 0xb1, 0xfe, 0xd5, 0x8b, 0xff, 0xbb, 0x6a, 0xfe, 0xf9, 0x00, 0xff, \n  0x0a, 0x74, 0x00, 0x74, 0xe2, 0xff, 0x1f, 0x38, 0xff, 0x7c, 0xd4, 0xfe, 0x6b, 0x89, 0xff, 0xee, \n  0x55, 0x00, 0xd5, 0x55, 0x00, 0x2d, 0x34, 0x00, 0x8f, 0xe1, 0x00, 0x0f, 0xad, 0xff, 0xc4, 0x46, \n  0xfe, 0x8a, 0xbb, 0xfe, 0x17, 0x9b, 0xff, 0xa3, 0xc7, 0xff, 0xe7, 0x88, 0xff, 0x7f, 0x0f, 0x00, \n  0x59, 0xc8, 0xff, 0x40, 0x0a, 0xff, 0xfa, 0x7a, 0x0f, 0x2a, 0x95, 0x1d, 0xef, 0xf1, 0x0f, 0x57, \n  0x07, 0xfd, 0x5f, 0x45, 0xf6, 0x40, 0xd3, 0xf9, 0x41, 0x46, 0x04, 0x47, 0x9f, 0x09, 0xf3, 0xd2, \n  0xff, 0x3b, 0x83, 0xfa, 0x16, 0xdc, 0xfe, 0xb3, 0xbd, 0xff, 0xc8, 0x4c, 0xfe, 0x4b, 0xeb, 0xfe, \n  0xdc, 0xa8, 0x00, 0xca, 0xd7, 0xff, 0xac, 0xe1, 0xfe, 0x12, 0xd8, 0xfe, 0x21, 0x8f, 0xff, 0xa0, \n  0x4e, 0x00, 0xf9, 0x26, 0x00, 0x95, 0xcb, 0xff, 0x72, 0xd8, 0x00, 0xac, 0xd7, 0xff, 0x4d, 0x84, \n  0xfe, 0x28, 0xc0, 0xfe, 0xd1, 0x77, 0xff, 0x9e, 0x8b, 0xff, 0xca, 0x94, 0xff, 0x35, 0x76, 0x00, \n  0xfb, 0x9c, 0xff, 0x64, 0xec, 0xfe, 0x00, 0x9d, 0x10, 0x6b, 0xed, 0x1f, 0x9b, 0x9d, 0x10, 0x98, \n  0x05, 0xfc, 0xa5, 0xf1, 0xf4, 0x00, 0x58, 0xf9, 0xf6, 0x0a, 0x05, 0x08, 0x4b, 0x0a, 0xdd, 0x6e, \n  0xff, 0xa2, 0x82, 0xf9, 0x12, 0xdf, 0xfe, 0x68, 0x22, 0x00, 0xea, 0x20, 0xfe, 0xa4, 0xb0, 0xfe, \n  0x93, 0xd9, 0x00, 0xb5, 0xfa, 0xff, 0x4c, 0x84, 0xfe, 0x99, 0xb3, 0xfe, 0xce, 0x9c, 0xff, 0x86, \n  0x4e, 0x00, 0x33, 0x1e, 0x00, 0xf4, 0x4f, 0xff, 0xe7, 0x9b, 0x00, 0xbd, 0x1e, 0x00, 0x20, 0xbb, \n  0xfe, 0x9a, 0xfc, 0xfe, 0x01, 0x4c, 0xff, 0x36, 0x75, 0xff, 0xae, 0x6d, 0xff, 0x3c, 0x94, 0x00, \n  0x65, 0xb3, 0xff, 0x06, 0xde, 0xfe, 0x20, 0x15, 0x12, 0x1e, 0x58, 0x22, 0x32, 0x6d, 0x11, 0x5b, \n  0xd6, 0xfa, 0xd7, 0x21, 0xf3, 0x44, 0x9d, 0xf8, 0x11, 0xce, 0x05, 0xbc, 0xf2, 0x0a, 0x0f, 0x9d, \n  0xfe, 0x45, 0x2b, 0xf8, 0xdb, 0xd1, 0xfe, 0x49, 0x8c, 0x00, 0x63, 0xd8, 0xfd, 0xae, 0x44, 0xfe, \n  0x81, 0xb9, 0x00, 0x6d, 0x25, 0x00, 0xb6, 0x28, 0xfe, 0x70, 0x68, 0xfe, 0x7c, 0x5a, 0xff, 0xbe, \n  0x39, 0x00, 0x62, 0x18, 0x00, 0x3e, 0xc1, 0xfe, 0xdd, 0x07, 0x00, 0xf7, 0x2a, 0x00, 0xf1, 0xf1, \n  0xfe, 0x40, 0x38, 0xff, 0x99, 0x54, 0xff, 0x03, 0x21, 0xff, 0xb6, 0x53, 0xff, 0x25, 0x42, 0x00, \n  0xc0, 0xda, 0xff, 0x1b, 0x9b, 0xfe, 0xd4, 0x16, 0x13, 0x8c, 0x61, 0x24, 0x31, 0x69, 0x12, 0xbf, \n  0xcf, 0xfa, 0xf6, 0xe4, 0xf1, 0xd0, 0xc5, 0xf7, 0x3c, 0xba, 0x06, 0x03, 0x74, 0x0b, 0x83, 0x6a, \n  0xfe, 0xfd, 0x36, 0xf7, 0xcc, 0xb4, 0xfe, 0x64, 0x57, 0x01, 0x0a, 0xcb, 0xfd, 0x15, 0x0f, 0xfe, \n  0xb3, 0xcb, 0x00, 0x53, 0x50, 0x00, 0x71, 0x14, 0xfe, 0xcb, 0x84, 0xfe, 0xf7, 0x41, 0xff, 0x8d, \n  0x30, 0x00, 0xf9, 0x41, 0x00, 0x23, 0xa3, 0xfe, 0x6a, 0x96, 0xff, 0xc7, 0x3a, 0x00, 0x69, 0x67, \n  0xff, 0xcd, 0x5e, 0xff, 0x40, 0xdc, 0xff, 0xb8, 0x03, 0xff, 0x8c, 0x82, 0xff, 0x34, 0x22, 0x00, \n  0x70, 0xd1, 0xff, 0x6e, 0xde, 0xfe, 0xc5, 0x2e, 0x15, 0x18, 0x44, 0x26, 0x5f, 0x4e, 0x12, 0xa4, \n  0x30, 0xfb, 0x50, 0x8b, 0xf0, 0xfb, 0xa8, 0xf6, 0x26, 0x04, 0x08, 0xb1, 0x92, 0x0b, 0xae, 0x98, \n  0xfd, 0xde, 0x60, 0xf6, 0x55, 0x6b, 0xfe, 0x32, 0x09, 0x02, 0x1c, 0xcd, 0xfd, 0x84, 0x8d, 0xfd, \n  0x0b, 0xf2, 0x00, 0x47, 0x52, 0x00, 0xad, 0xc8, 0xfd, 0x32, 0x93, 0xfe, 0x6d, 0x2c, 0xff, 0x94, \n  0x1e, 0x00, 0xc5, 0x2a, 0x00, 0x94, 0xb8, 0xfe, 0x4e, 0xdc, 0xfe, 0x30, 0xdc, 0xff, 0x85, 0x21, \n  0x00, 0xda, 0x65, 0xff, 0x2f, 0x3b, 0x00, 0x16, 0x30, 0xff, 0x76, 0x6b, 0xff, 0x9c, 0x4c, 0x00, \n  0x25, 0x8f, 0xff, 0x16, 0xe0, 0xfe, 0x8a, 0x88, 0x17, 0x45, 0xfb, 0x27, 0xaa, 0x0c, 0x11, 0x44, \n  0x26, 0xfb, 0xe2, 0x2c, 0xf0, 0x13, 0x3a, 0xf6, 0x1a, 0x06, 0x09, 0x4f, 0xf4, 0x0a, 0xcd, 0xc1, \n  0xfc, 0x89, 0x45, 0xf6, 0x56, 0xf8, 0xfd, 0xc7, 0x63, 0x02, 0x39, 0x06, 0xfe, 0x6b, 0x0c, 0xfd, \n  0xfc, 0xf2, 0x00, 0x3d, 0x68, 0x00, 0x5e, 0x81, 0xfd, 0x3a, 0xa0, 0xfe, 0x4b, 0x20, 0xff, 0xc1, \n  0x0c, 0x00, 0x67, 0xf5, 0xff, 0xde, 0xee, 0xfe, 0x99, 0x94, 0xfe, 0x2d, 0xf5, 0xfe, 0xb4, 0xbd, \n  0x00, 0x37, 0xc0, 0xff, 0x83, 0x33, 0x00, 0x39, 0xb0, 0xff, 0xe7, 0x39, 0xff, 0xb5, 0x5d, 0x00, \n  0x41, 0xb7, 0xff, 0x35, 0x93, 0xfe, 0x37, 0x01, 0x1c, 0xb4, 0xcd, 0x29, 0xbf, 0x0e, 0x0d, 0x0e, \n  0xdb, 0xfa, 0xbd, 0xed, 0xf0, 0xcf, 0x86, 0xf6, 0x56, 0xb6, 0x09, 0xb1, 0xaa, 0x09, 0x99, 0x60, \n  0xfb, 0xf6, 0xd3, 0xf6, 0xa9, 0x88, 0xfd, 0xd3, 0x3d, 0x02, 0x5f, 0x9e, 0xfe, 0xf8, 0x74, 0xfc, \n  0xf5, 0xbb, 0x00, 0xe7, 0x5c, 0x00, 0x48, 0x6e, 0xfd, 0xeb, 0x93, 0xfe, 0x2a, 0x37, 0xff, 0x8a, \n  0xfb, 0xff, 0x4d, 0x8c, 0xff, 0xf9, 0x08, 0xff, 0xe0, 0xae, 0xfe, 0xb8, 0x03, 0xfe, 0xb5, 0xca, \n  0x00, 0x76, 0x98, 0x00, 0xe3, 0xd6, 0xff, 0xf3, 0x5f, 0x00, 0x57, 0x72, 0xff, 0x35, 0xe2, 0xff, \n  0x61, 0x32, 0x00, 0xed, 0x4b, 0xfe, 0x3b, 0xa8, 0x1f, 0xff, 0x17, 0x2a, 0xe5, 0xd3, 0x09, 0x00, \n  0xe2, 0xfc, 0x45, 0xd7, 0xf1, 0x0a, 0xfa, 0xf4, 0x15, 0x37, 0x0a, 0x64, 0xc3, 0x09, 0xea, 0x0f, \n  0xfa, 0x5d, 0xd1, 0xf6, 0xee, 0x7e, 0xfd, 0x88, 0x2e, 0x02, 0xb0, 0xe6, 0xfe, 0x0f, 0x11, 0xfc, \n  0xec, 0x8c, 0x00, 0x85, 0x38, 0x00, 0xfd, 0x62, 0xfd, 0xd3, 0xaa, 0xfe, 0xb9, 0x8a, 0xff, 0x50, \n  0xbd, 0xff, 0x17, 0x46, 0xff, 0x96, 0x0a, 0xff, 0x79, 0xe6, 0xfe, 0x21, 0x9d, 0xfd, 0xd3, 0x2f, \n  0x00, 0xd7, 0x96, 0x01, 0xca, 0xa9, 0xff, 0xf3, 0xa0, 0x00, 0xa5, 0x08, 0x00, 0x0b, 0x75, 0xff, \n  0xaf, 0x70, 0x00, 0x01, 0x52, 0xfe, 0x91, 0x33, 0x23, 0xcb, 0xd8, 0x29, 0x1b, 0x87, 0x06, 0x9c, \n  0xab, 0xff, 0xd9, 0xc6, 0xf2, 0xa7, 0x29, 0xf3, 0xd4, 0x9e, 0x0a, 0x20, 0xfe, 0x09, 0x67, 0x9b, \n  0xf8, 0xd6, 0xae, 0xf6, 0x8a, 0xe3, 0xfd, 0x39, 0xd8, 0x01, 0x8b, 0xe7, 0xfe, 0x7f, 0xe0, 0xfb, \n  0x7a, 0x67, 0x00, 0x60, 0xdb, 0xff, 0x83, 0x33, 0xfd, 0x82, 0xf1, 0xfe, 0x06, 0x15, 0x00, 0xed, \n  0x45, 0xff, 0x35, 0xfe, 0xfe, 0xad, 0x31, 0xff, 0x3b, 0xcf, 0xfe, 0xf4, 0x8c, 0xfd, 0x61, 0x75, \n  0xff, 0x10, 0x34, 0x02, 0x59, 0xf1, 0xff, 0xdf, 0x7a, 0x00, 0xbb, 0xa4, 0x00, 0x0e, 0x5b, 0xff, \n  0x06, 0x3c, 0x00, 0xb9, 0x83, 0xfe, 0xa1, 0x4c, 0x28, 0x2a, 0x21, 0x2b, 0xcb, 0x34, 0x00, 0x9e, \n  0x1f, 0x00, 0xed, 0x99, 0xf5, 0xca, 0xaa, 0xf3, 0xea, 0xb2, 0x09, 0x7d, 0x07, 0x09, 0x84, 0xa2, \n  0xf7, 0xb8, 0xa6, 0xf6, 0x50, 0x78, 0xfe, 0xb6, 0x31, 0x01, 0x85, 0x19, 0xff, 0x6e, 0x85, 0xfb, \n  0xb6, 0x13, 0x00, 0xf6, 0x7d, 0xff, 0x84, 0x2c, 0xfd, 0x12, 0x11, 0xff, 0x59, 0xaf, 0x00, 0x0a, \n  0x39, 0xff, 0x08, 0x78, 0xfe, 0x21, 0x47, 0xff, 0xe0, 0x6e, 0xfe, 0xf6, 0xfa, 0xfd, 0x80, 0xef, \n  0xfe, 0xb1, 0x01, 0x02, 0x37, 0xbc, 0x00, 0x26, 0x7c, 0x00, 0x50, 0xc4, 0x00, 0x83, 0xa6, 0xff, \n  0x13, 0xc5, 0xff, 0x89, 0x92, 0xfe, 0x94, 0xb6, 0x2d, 0xbc, 0x9c, 0x2b, 0xa2, 0x67, 0xfa, 0xd6, \n  0xec, 0xff, 0x8d, 0xe8, 0xf7, 0x82, 0x7b, 0xf5, 0xcf, 0x8d, 0x08, 0xf5, 0xda, 0x07, 0xe2, 0x34, \n  0xf7, 0x54, 0x75, 0xf6, 0x95, 0x0e, 0xff, 0x83, 0xd1, 0x00, 0xfe, 0x32, 0xff, 0x28, 0x18, 0xfb, \n  0x62, 0x0a, 0x00, 0x91, 0x00, 0xff, 0xda, 0x59, 0xfd, 0xd5, 0x5b, 0xff, 0x54, 0x16, 0x01, 0x41, \n  0x53, 0xff, 0x9f, 0xf8, 0xfd, 0x16, 0x83, 0xff, 0x1b, 0x0a, 0xfe, 0xd1, 0x71, 0xfe, 0x4b, 0xec, \n  0xfe, 0x05, 0x8e, 0x01, 0x44, 0x3a, 0x01, 0xbf, 0xe1, 0x00, 0x39, 0x80, 0x00, 0xb3, 0xd8, 0xff, \n  0xdd, 0xb9, 0xff, 0xef, 0x36, 0xfe, 0x88, 0xac, 0x32, 0x10, 0xa9, 0x2d, 0x4a, 0x08, 0xf4, 0xf4, \n  0x5d, 0xfe, 0x0a, 0xa0, 0xfa, 0x46, 0x39, 0xf8, 0x21, 0xb6, 0x06, 0x53, 0x7e, 0x06, 0xe3, 0x93, \n  0xf7, 0x84, 0x7e, 0xf5, 0x22, 0x9a, 0xff, 0x94, 0x67, 0x00, 0xb5, 0x5c, 0xff, 0x8d, 0x7c, 0xfa, \n  0x4b, 0xe4, 0xff, 0x2a, 0x94, 0xfe, 0x2e, 0xa3, 0xfd, 0x99, 0xb7, 0xff, 0x9d, 0x44, 0x01, 0x2d, \n  0xad, 0xff, 0x34, 0x2a, 0xfd, 0x10, 0xd7, 0xff, 0x3e, 0xb8, 0xfd, 0xba, 0xc6, 0xfe, 0x09, 0x43, \n  0xff, 0xcd, 0x14, 0x01, 0x06, 0x07, 0x01, 0x6f, 0x8e, 0x01, 0x4b, 0x2d, 0x00, 0x96, 0x78, 0xff, \n  0xea, 0x21, 0x00, 0x19, 0xc3, 0xfd, 0xda, 0xec, 0x36, 0x67, 0x36, 0x2f, 0x3c, 0x54, 0xef, 0x40, \n  0x4e, 0xfc, 0x3b, 0x37, 0xfc, 0x7d, 0x15, 0xfb, 0xca, 0x2f, 0x05, 0xaf, 0x7b, 0x05, 0xeb, 0x19, \n  0xf8, 0x5a, 0x6d, 0xf4, 0x6f, 0xe4, 0xff, 0x35, 0x0d, 0x00, 0x41, 0x75, 0xff, 0xb5, 0x23, 0xfa, \n  0xd5, 0xbb, 0xff, 0xa5, 0x58, 0xfe, 0x41, 0x07, 0xfe, 0x80, 0xef, 0xff, 0x89, 0x3b, 0x01, 0xc5, \n  0x08, 0x00, 0x09, 0x84, 0xfc, 0x2e, 0x22, 0x00, 0xe8, 0x96, 0xfd, 0x84, 0xdf, 0xfe, 0x18, 0xf1, \n  0xff, 0xa9, 0xd7, 0x00, 0x0f, 0x24, 0x00, 0x81, 0x0d, 0x02, 0x3d, 0x1b, 0x00, 0x79, 0xd5, 0xfe, \n  0x1d, 0x87, 0x00, 0xd3, 0xde, 0xfd, 0x9f, 0xaa, 0x3b, 0x8c, 0xd9, 0x30, 0x2d, 0x1f, 0xeb, 0x18, \n  0x48, 0xf9, 0xea, 0x02, 0xfd, 0x16, 0x5f, 0xfe, 0x7c, 0xee, 0x03, 0x68, 0xcd, 0x04, 0x3c, 0x84, \n  0xf8, 0x27, 0x30, 0xf3, 0x54, 0xe8, 0xff, 0x12, 0x7b, 0xff, 0xe9, 0xbf, 0xff, 0xe7, 0x02, 0xfa, \n  0xd8, 0xb8, 0xff, 0x45, 0x44, 0xfe, 0xf6, 0x7f, 0xfe, 0xad, 0xfd, 0xff, 0xbd, 0x14, 0x01, 0x71, \n  0x77, 0x00, 0x73, 0x07, 0xfc, 0xda, 0x7d, 0x00, 0x68, 0x52, 0xfd, 0x3b, 0x45, 0xff, 0x29, 0xbd, \n  0x00, 0x48, 0x5d, 0x00, 0xe7, 0x16, 0xff, 0xe8, 0xe5, 0x01, 0xdb, 0x51, 0x00, 0x0b, 0x66, 0xfe, \n  0x4f, 0xb4, 0x00, 0x52, 0x90, 0xfe, 0x8a, 0xfd, 0x3e, 0x46, 0xac, 0x32, 0x66, 0x60, 0xe8, 0x4b, \n  0x95, 0xf6, 0x54, 0xa7, 0xfc, 0x4f, 0x7c, 0x00, 0x95, 0xc5, 0x03, 0xf8, 0x81, 0x04, 0x54, 0xa5, \n  0xf8, 0x4a, 0x31, 0xf2, 0xbe, 0x7c, 0xff, 0x37, 0xde, 0xfe, 0x7d, 0x54, 0x00, 0xcc, 0x33, 0xfa, \n  0xf0, 0xbf, 0xff, 0x04, 0x76, 0xfe, 0x1d, 0x98, 0xfe, 0x56, 0xd5, 0xff, 0xf8, 0xea, 0x00, 0xdb, \n  0xf9, 0x00, 0x73, 0xde, 0xfb, 0x3f, 0x82, 0x00, 0x3c, 0x5e, 0xfd, 0xbd, 0xc3, 0xff, 0x3d, 0xb6, \n  0x00, 0xae, 0x10, 0x00, 0xe0, 0x51, 0xfe, 0x5b, 0x25, 0x01, 0xff, 0xcb, 0x00, 0x37, 0x87, 0xfe, \n  0x2b, 0x9e, 0x00, 0x28, 0x17, 0xff, 0xd3, 0xc8, 0x41, 0x00, 0x6b, 0x34, 0x47, 0xc4, 0xe6, 0x0c, \n  0x72, 0xf4, 0xd0, 0xf3, 0xfa, 0xd4, 0x06, 0x02, 0x7c, 0x76, 0x04, 0xb5, 0x4b, 0x04, 0x05, 0xaf, \n  0xf8, 0xd2, 0x57, 0xf1, 0x1d, 0xa5, 0xfe, 0x6f, 0x4a, 0xfe, 0x7e, 0x8b, 0x01, 0x3e, 0x8a, 0xfa, \n  0x98, 0xd6, 0xff, 0x26, 0xd7, 0xfe, 0xcc, 0x54, 0xfe, 0xcc, 0x8f, 0xff, 0x26, 0x02, 0x01, 0xe3, \n  0xa0, 0x01, 0xba, 0xb5, 0xfb, 0xaa, 0xa9, 0x00, 0xac, 0x9e, 0xfd, 0x86, 0xac, 0xff, 0x49, 0x68, \n  0x00, 0xf3, 0xeb, 0xff, 0x2c, 0x98, 0xfd, 0x3e, 0x85, 0x00, 0xc6, 0x71, 0x01, 0x2c, 0xee, 0xfe, \n  0x95, 0x75, 0x00, 0x4d, 0x7f, 0xff, 0xb5, 0xc6, 0x44, 0x1e, 0xcc, 0x35, 0xa3, 0xf8, 0xe5, 0x53, \n  0xa6, 0xf2, 0x28, 0x30, 0xf7, 0x1c, 0x3f, 0x03, 0xb0, 0xf4, 0x05, 0x04, 0xfd, 0x03, 0x41, 0x83, \n  0xf8, 0xf7, 0x64, 0xf0, 0xf7, 0x4c, 0xfd, 0x67, 0x0c, 0xfe, 0x25, 0x97, 0x03, 0x3a, 0xa5, 0xfa, \n  0x5b, 0x2f, 0x00, 0x23, 0xec, 0xfe, 0x8f, 0xa3, 0xfd, 0x01, 0xab, 0xff, 0xa9, 0x46, 0x01, 0xa4, \n  0xe7, 0x01, 0xe8, 0x36, 0xfc, 0x10, 0xd4, 0x00, 0x74, 0xc4, 0xfc, 0x8c, 0x85, 0xff, 0x24, 0x01, \n  0x00, 0xbe, 0x6c, 0xff, 0xce, 0x85, 0xfd, 0x92, 0x3f, 0x00, 0x4e, 0xae, 0x01, 0x72, 0x8d, 0xff, \n  0x3f, 0xb2, 0x00, 0x66, 0x7c, 0xff, 0x4c, 0x0d, 0x47, 0xe0, 0x1c, 0x36, 0xf1, 0x8a, 0xe6, 0x51, \n  0x86, 0xf1, 0x52, 0xfd, 0xf2, 0x18, 0xfe, 0x03, 0x0f, 0x25, 0x07, 0x3d, 0xd0, 0x03, 0xce, 0xfc, \n  0xf7, 0x65, 0xf0, 0xef, 0x46, 0x63, 0xfc, 0x7b, 0x51, 0xfe, 0xb7, 0x41, 0x05, 0xba, 0xc4, 0xfa, \n  0xaa, 0x52, 0x00, 0x48, 0x5f, 0xfe, 0x52, 0xa2, 0xfd, 0xb7, 0xf9, 0xff, 0x14, 0x24, 0x01, 0x6b, \n  0x8e, 0x02, 0x70, 0xa9, 0xfc, 0x66, 0xbc, 0xff, 0xc8, 0x3b, 0xfc, 0x9e, 0x6a, 0xff, 0x47, 0x64, \n  0xff, 0x49, 0x90, 0xff, 0x40, 0x0e, 0xfe, 0x0b, 0xdc, 0xff, 0x4b, 0x8e, 0x01, 0x7b, 0x7f, 0x00, \n  0x92, 0xae, 0x00, 0x5e, 0xd1, 0xfe, 0x1c, 0x1f, 0x48, 0x32, 0xaf, 0x36, 0x73, 0xb6, 0xe8, 0xcb, \n  0x6a, 0xf0, 0x57, 0xd8, 0xed, 0x88, 0xa6, 0x03, 0x93, 0x9a, 0x08, 0x2f, 0x8b, 0x03, 0xa6, 0x3c, \n  0xf7, 0xf0, 0xb9, 0xf0, 0xfd, 0x77, 0xfb, 0xf2, 0x79, 0xfe, 0xed, 0x51, 0x07, 0xa9, 0xb2, 0xfa, \n  0x05, 0xa6, 0xff, 0xa8, 0x7e, 0xfe, 0xb8, 0xda, 0xfd, 0xf7, 0x34, 0x00, 0x2f, 0xb5, 0x01, 0x2f, \n  0x45, 0x02, 0x13, 0x0f, 0xfc, 0x98, 0x27, 0xff, 0xdb, 0x6c, 0xfb, 0x07, 0x3b, 0xff, 0xbf, 0xaa, \n  0xff, 0x7a, 0xdc, 0xff, 0xc5, 0x60, 0xfe, 0x64, 0xca, 0xff, 0xc5, 0x95, 0x01, 0x40, 0x82, 0x00, \n  0xc4, 0xd8, 0x00, 0xc5, 0xf4, 0xfe, 0xdd, 0x48, 0x47, 0x33, 0x2f, 0x38, 0x6d, 0x43, 0xeb, 0xc4, \n  0x3d, 0xf0, 0xe9, 0x40, 0xe9, 0xf0, 0xdb, 0x01, 0xda, 0x28, 0x0a, 0x5c, 0xcc, 0x02, 0x25, 0xe0, \n  0xf7, 0xca, 0x01, 0xf2, 0x1b, 0x7b, 0xfa, 0xeb, 0xd5, 0xfe, 0x4a, 0x82, 0x08, 0xca, 0x78, 0xfa, \n  0x93, 0x24, 0xff, 0x56, 0x1e, 0xff, 0x5e, 0x2f, 0xfe, 0x78, 0x2a, 0x01, 0x26, 0x68, 0x00, 0x03, \n  0x89, 0x01, 0xa8, 0x62, 0xfc, 0x9e, 0x35, 0xfe, 0x9b, 0x4d, 0xfb, 0x66, 0xc7, 0xff, 0xfe, 0xc9, \n  0xff, 0x84, 0xd5, 0xff, 0x1e, 0x21, 0xff, 0x21, 0xc1, 0xff, 0x3a, 0xc3, 0x00, 0x64, 0xad, 0x00, \n  0xe9, 0xf0, 0x01, 0xbc, 0x55, 0xfe, 0x00, 0x71, 0x47, 0xea, 0xda, 0x36, 0xeb, 0x9a, 0xef, 0xec, \n  0x73, 0xf0, 0x0a, 0xa5, 0xe3, 0x06, 0x9c, 0xff, 0xd6, 0xad, 0x0a, 0x88, 0x9c, 0x03, 0x1c, 0xe4, \n  0xf8, 0x7d, 0xa6, 0xf3, 0xa5, 0xd0, 0xf9, 0xe1, 0xed, 0xfe, 0x99, 0x38, 0x09, 0xf6, 0x00, 0xfa, \n  0x62, 0x3a, 0xff, 0x19, 0xe5, 0x00, 0xe3, 0x4f, 0xfe, 0x38, 0xd0, 0xff, 0x3a, 0xa8, 0xff, 0xd6, \n  0xc5, 0x00, 0x90, 0xa6, 0xfc, 0xb8, 0x1d, 0xfe, 0xf2, 0xbb, 0xfb, 0xfa, 0x0c, 0x00, 0x0b, 0xd9, \n  0xff, 0x3e, 0x5a, 0x00, 0x11, 0x06, 0xff, 0x43, 0x7d, 0xff, 0xe0, 0xe6, 0x00, 0x54, 0xac, 0x00, \n  0x07, 0x3b, 0x02, 0x8c, 0x68, 0xfe, 0x2d, 0x82, 0x45, 0xdf, 0xfd, 0x36, 0xc7, 0x85, 0xf3, 0xb5, \n  0x2f, 0xf1, 0x83, 0x68, 0xdf, 0x09, 0x19, 0xfc, 0xc9, 0xb2, 0x0b, 0xd9, 0x99, 0x05, 0xc4, 0x8f, \n  0xf9, 0x09, 0x2b, 0xf5, 0x8a, 0x8e, 0xf9, 0x6d, 0x65, 0xfe, 0x2d, 0x1f, 0x09, 0x98, 0xa0, 0xfa, \n  0xf9, 0x99, 0x00, 0x82, 0xdb, 0x00, 0x71, 0xfd, 0xfc, 0xc9, 0xb3, 0xff, 0xc5, 0xb3, 0xfe, 0xe6, \n  0xc0, 0x00, 0x71, 0x96, 0xfd, 0x47, 0x05, 0xfe, 0x93, 0x30, 0xfc, 0x0f, 0x73, 0x00, 0x80, 0xce, \n  0xff, 0xa6, 0xc8, 0xff, 0xb3, 0x87, 0xff, 0xcb, 0xeb, 0xff, 0xe6, 0x73, 0x00, 0xc3, 0x6f, 0x00, \n  0x51, 0xd3, 0x02, 0xe3, 0x79, 0xfe, 0x1d, 0xba, 0x44, 0x0d, 0x0c, 0x35, 0xf6, 0xc8, 0xf6, 0x65, \n  0x50, 0xf2, 0x93, 0x14, 0xdb, 0xdb, 0x2d, 0xf9, 0x51, 0x83, 0x0d, 0x75, 0x3e, 0x07, 0x8e, 0xb0, \n  0xf9, 0xfc, 0x59, 0xf7, 0x50, 0xc8, 0xf8, 0x08, 0x06, 0xfd, 0xf6, 0x90, 0x0a, 0x70, 0x82, 0xfb, \n  0xcd, 0xfd, 0xff, 0xec, 0x86, 0x00, 0x44, 0xdc, 0xfb, 0xd6, 0x84, 0xff, 0xf0, 0xeb, 0xfe, 0x20, \n  0xac, 0x00, 0x1c, 0x2a, 0xfe, 0xaf, 0x48, 0xfe, 0x04, 0x0d, 0xfd, 0x9f, 0xcb, 0xff, 0x26, 0x37, \n  0xff, 0x3c, 0x56, 0x00, 0x66, 0xef, 0xff, 0xfc, 0x76, 0xff, 0xa6, 0x75, 0x00, 0x14, 0x90, 0x00, \n  0xc7, 0xc9, 0x02, 0x38, 0x75, 0xfe, 0x7c, 0xbb, 0x42, 0x62, 0xcc, 0x32, 0xd2, 0xd6, 0xf9, 0xa9, \n  0x13, 0xf4, 0x73, 0xda, 0xd6, 0xf0, 0xb8, 0xf7, 0x4b, 0x92, 0x0e, 0x1d, 0xb0, 0x08, 0x91, 0x40, \n  0xfb, 0x26, 0x68, 0xf8, 0x50, 0x27, 0xf7, 0x47, 0x5b, 0xfe, 0x2a, 0xdd, 0x0a, 0x29, 0x8d, 0xfa, \n  0x33, 0x5d, 0x00, 0x49, 0xb3, 0xfe, 0xc9, 0xf8, 0xfb, 0xbe, 0xca, 0x00, 0x6e, 0x30, 0xfe, 0x15, \n  0xe9, 0x00, 0xec, 0x6e, 0xff, 0xd0, 0x87, 0xfe, 0x20, 0x78, 0xfc, 0xc4, 0x80, 0xff, 0xe2, 0xc4, \n  0xff, 0x55, 0x1b, 0x00, 0xc2, 0xe6, 0xff, 0x3b, 0x95, 0xff, 0x7b, 0xa1, 0x00, 0xc3, 0x73, 0x00, \n  0xd7, 0x72, 0x02, 0xb7, 0x8f, 0xfe, 0xac, 0xe4, 0x40, 0x25, 0xbf, 0x2f, 0xd4, 0x57, 0xfc, 0x2b, \n  0x92, 0xf4, 0xdb, 0x78, 0xd6, 0x24, 0x99, 0xf6, 0x81, 0x8b, 0x0e, 0xf3, 0xed, 0x0a, 0x4e, 0xdf, \n  0xfa, 0x93, 0xac, 0xf9, 0xc2, 0x68, 0xf7, 0xc1, 0xbf, 0xfd, 0x9f, 0xd1, 0x0a, 0xf1, 0x2b, 0xfa, \n  0xec, 0x26, 0xff, 0x6f, 0x01, 0xff, 0x82, 0xef, 0xfc, 0x87, 0x98, 0x00, 0xd5, 0x61, 0xfe, 0x50, \n  0xc5, 0x01, 0xd9, 0x63, 0xff, 0x51, 0xdd, 0xfd, 0xab, 0x1e, 0xfd, 0x91, 0xb2, 0xff, 0x83, 0x2e, \n  0xff, 0xb2, 0x1f, 0x00, 0x2e, 0x45, 0x00, 0xc5, 0x83, 0xff, 0x9d, 0xab, 0x00, 0xe8, 0x34, 0x00, \n  0x85, 0x7a, 0x02, 0x73, 0x9d, 0xfe, 0x78, 0x03, 0x3d, 0x29, 0x73, 0x2c, 0xe8, 0x88, 0xfe, 0x05, \n  0xae, 0xf6, 0xdf, 0xd6, 0xd7, 0xeb, 0x32, 0xf5, 0x00, 0x46, 0x0e, 0xe4, 0x3b, 0x0b, 0x69, 0x21, \n  0xfd, 0x19, 0x87, 0xfa, 0x70, 0x44, 0xf5, 0x2d, 0x36, 0xff, 0xbf, 0x56, 0x09, 0xd0, 0x38, 0xf9, \n  0xb7, 0xda, 0xff, 0x03, 0x3d, 0xff, 0xc8, 0x41, 0xfd, 0x30, 0x60, 0x01, 0xf6, 0x1d, 0xff, 0x3e, \n  0xac, 0x00, 0x89, 0x83, 0xff, 0x34, 0x73, 0xfe, 0x0e, 0x85, 0xfd, 0x82, 0x1c, 0xff, 0x0a, 0xd5, \n  0xfe, 0x30, 0xb1, 0x00, 0x7a, 0x66, 0x00, 0x37, 0xf4, 0xfe, 0x02, 0xd5, 0x00, 0x65, 0xd5, 0x00, \n  0x24, 0xaa, 0x01, 0x2d, 0x8a, 0xfe, 0x7b, 0x49, 0x39, 0xf6, 0xe2, 0x28, 0xc2, 0xcc, 0xff, 0xa1, \n  0xc5, 0xf9, 0x7d, 0x17, 0xda, 0x24, 0x44, 0xf4, 0xa5, 0xbf, 0x0c, 0xc8, 0x0e, 0x0d, 0x03, 0xaa, \n  0xfd, 0x08, 0xb9, 0xf9, 0x07, 0x9a, 0xf5, 0xf2, 0xe7, 0xfe, 0xb7, 0x9c, 0x08, 0xcc, 0x2a, 0xf9, \n  0x02, 0x61, 0x00, 0x60, 0x2c, 0xff, 0xa8, 0x36, 0xfe, 0xfb, 0x51, 0x02, 0x8c, 0x9f, 0xfd, 0x5b, \n  0xc3, 0x00, 0x66, 0x6e, 0x00, 0x5a, 0x24, 0xfe, 0x36, 0xa7, 0xfd, 0x54, 0xdc, 0xfe, 0xcc, 0xe1, \n  0xfe, 0xa4, 0x2a, 0x01, 0x2e, 0xb7, 0xff, 0x6e, 0xc5, 0xfe, 0x43, 0xe2, 0x01, 0x08, 0x75, 0x00, \n  0x6d, 0xe1, 0x00, 0x20, 0x05, 0xff, 0x7a, 0xa4, 0x34, 0x3b, 0xd9, 0x23, 0x74, 0x93, 0x01, 0xe8, \n  0x9d, 0xfe, 0x24, 0xfd, 0xdb, 0x55, 0xf2, 0xf3, 0x94, 0x51, 0x0d, 0x79, 0x60, 0x0b, 0xd3, 0xfa, \n  0xfd, 0xd6, 0xa3, 0xfa, 0x9f, 0x4e, 0xf4, 0x50, 0x71, 0x00, 0x10, 0x8d, 0x07, 0xe8, 0xc6, 0xf8, \n  0xcc, 0x49, 0x01, 0x56, 0xd4, 0xff, 0x4d, 0x1f, 0xff, 0x53, 0x3c, 0x01, 0xde, 0x77, 0xfd, 0x94, \n  0x9a, 0x01, 0xd6, 0x64, 0x00, 0xc1, 0xa1, 0xfd, 0x60, 0x4c, 0xfe, 0xb6, 0xda, 0xfe, 0x8e, 0xe0, \n  0xfe, 0xa1, 0xff, 0x00, 0xdc, 0x69, 0xff, 0x28, 0x42, 0xff, 0xbb, 0x25, 0x02, 0xa0, 0x16, 0x00, \n  0x96, 0x72, 0x00, 0xa7, 0x56, 0xff, 0x76, 0x05, 0x2f, 0x77, 0xbf, 0x20, 0x05, 0x14, 0x04, 0x6d, \n  0x8d, 0x00, 0x9e, 0x17, 0xdf, 0x24, 0x30, 0xf6, 0xcb, 0xa5, 0x0a, 0xbf, 0x9b, 0x09, 0x5d, 0x35, \n  0xff, 0x79, 0xed, 0xf9, 0x11, 0x9c, 0xf5, 0xb7, 0xd9, 0x00, 0xd9, 0xfb, 0x05, 0xdd, 0x57, 0xf9, \n  0x93, 0x56, 0x02, 0xb9, 0x1e, 0x00, 0x38, 0x4b, 0xfe, 0xd9, 0x56, 0x01, 0x32, 0xfc, 0xfd, 0xd3, \n  0x87, 0x01, 0x12, 0x07, 0x00, 0x94, 0xbe, 0xfd, 0x28, 0x0a, 0xff, 0x29, 0x92, 0xfe, 0x99, 0x99, \n  0xfe, 0xf4, 0x4a, 0x01, 0x3c, 0x4a, 0xff, 0xbb, 0x1f, 0xff, 0x15, 0x8a, 0x02, 0x07, 0xaf, 0xff, \n  0xa1, 0x4d, 0x00, 0x10, 0x8a, 0xff, 0x1c, 0x96, 0x2c, 0xd5, 0xaf, 0x1f, 0x76, 0x3c, 0x01, 0xa0, \n  0x74, 0xfb, 0x0e, 0xd8, 0xe1, 0xb5, 0x7e, 0xff, 0xea, 0x6d, 0x0d, 0x26, 0x11, 0x04, 0x96, 0x05, \n  0xfc, 0xad, 0x2f, 0xfc, 0x27, 0xfe, 0xf8, 0xa9, 0x06, 0xff, 0xbb, 0xd2, 0x05, 0x7c, 0xac, 0xf9, \n  0x16, 0xa8, 0x01, 0x21, 0x59, 0x00, 0x41, 0x4a, 0xfe, 0x63, 0xd3, 0x00, 0xee, 0xe5, 0xfe, 0x5e, \n  0x3e, 0x01, 0x54, 0x8a, 0xff, 0x26, 0x64, 0xfe, 0xba, 0x4c, 0xfe, 0x41, 0x70, 0xff, 0xcc, 0x56, \n  0xff, 0x0e, 0xf9, 0xff, 0x1b, 0xef, 0xff, 0xf3, 0xca, 0xff, 0xf8, 0x6a, 0xff, 0xc1, 0x6c, 0xff, \n  0xfe, 0x33, 0x02, 0x39, 0x9b, 0xff, 0x53, 0x2f, 0x24, 0xe9, 0xde, 0x1f, 0xad, 0x97, 0x08, 0x15, \n  0xa9, 0xfd, 0x89, 0x69, 0xe2, 0x97, 0xa9, 0xf8, 0x05, 0xdd, 0x08, 0x88, 0xf0, 0x06, 0xa1, 0xd0, \n  0x01, 0x17, 0x3e, 0xfd, 0xf3, 0x58, 0xf8, 0x52, 0x1b, 0xfd, 0x74, 0x39, 0x03, 0x31, 0xed, 0xfb, \n  0x52, 0x0e, 0x03, 0x95, 0x85, 0x00, 0x6b, 0xd3, 0xfd, 0xbe, 0xab, 0x01, 0xa3, 0x12, 0xff, 0x69, \n  0x51, 0x00, 0x5a, 0xb9, 0x00, 0x39, 0x1a, 0xff, 0x6b, 0xa0, 0xfe, 0x2a, 0x66, 0x00, 0x9d, 0xb2, \n  0xfd, 0x95, 0xd4, 0xfe, 0xe8, 0xfd, 0xff, 0xa8, 0x27, 0xff, 0xe7, 0xdb, 0x00, 0x8c, 0xd2, 0x00, \n  0xcf, 0x14, 0x02, 0xa3, 0xdf, 0xff, 0x41, 0xb9, 0x1d, 0x00, 0xfd, 0x1c, 0xff, 0x7a, 0x0a, 0x82, \n  0xc3, 0xff, 0x45, 0xa2, 0xe8, 0x8d, 0x2f, 0xf8, 0xbb, 0x5c, 0x06, 0xe4, 0x0a, 0x06, 0x04, 0x92, \n  0x01, 0xa9, 0x1f, 0xfe, 0xde, 0x3b, 0xfa, 0x79, 0x0c, 0xfd, 0x77, 0x2e, 0x02, 0xb3, 0x60, 0xfd, \n  0x65, 0x79, 0x02, 0x76, 0x63, 0x00, 0x44, 0x29, 0xfe, 0x83, 0x89, 0x01, 0x63, 0x62, 0xff, 0xdc, \n  0x21, 0x00, 0x3e, 0xfe, 0x00, 0x6c, 0x6e, 0xff, 0x44, 0x31, 0xff, 0xfd, 0x6d, 0x00, 0x79, 0xe7, \n  0xfd, 0x40, 0x09, 0xff, 0x3f, 0x47, 0x00, 0x42, 0x57, 0xff, 0x51, 0x8f, 0x00, 0xaf, 0x03, 0x01, \n  0x68, 0xae, 0x01, 0x5d, 0xf2, 0xff, 0x90, 0x81, 0x18, 0xe4, 0x64, 0x1a, 0x40, 0x45, 0x0b, 0xbe, \n  0xbb, 0x01, 0xb3, 0x9c, 0xed, 0x69, 0x15, 0xf8, 0xd8, 0xaa, 0x04, 0x1b, 0xc4, 0x04, 0xea, 0x86, \n  0x01, 0xda, 0x32, 0xff, 0x5a, 0x9e, 0xfb, 0x07, 0x14, 0xfd, 0x80, 0xb5, 0x01, 0x66, 0x45, 0xfe, \n  0x92, 0xd1, 0x01, 0xf0, 0x6d, 0x00, 0x32, 0x90, 0xfe, 0x32, 0x65, 0x01, 0xd5, 0xa9, 0xff, 0xbb, \n  0x24, 0x00, 0x23, 0x23, 0x01, 0x5a, 0xf9, 0xff, 0xdd, 0x68, 0xff, 0xa1, 0x8e, 0x00, 0x13, 0xc3, \n  0xfe, 0x48, 0x26, 0xff, 0xc6, 0x22, 0x00, 0xcd, 0x28, 0xff, 0xb8, 0x49, 0x00, 0xa7, 0xe4, 0x00, \n  0xee, 0x4f, 0x01, 0xf0, 0x1c, 0x00, 0x17, 0x9f, 0x14, 0xa6, 0xe4, 0x17, 0xed, 0x96, 0x0b, 0xcc, \n  0xd6, 0x02, 0x86, 0x3f, 0xf1, 0x94, 0xa2, 0xf8, 0x73, 0x6a, 0x03, 0x36, 0x9b, 0x03, 0x8e, 0xab, \n  0x01, 0x10, 0xf4, 0xff, 0x1e, 0xa5, 0xfc, 0x2b, 0x5a, 0xfd, 0x05, 0x4b, 0x01, 0xde, 0xcb, 0xfe, \n  0x32, 0x48, 0x01, 0x6e, 0x92, 0x00, 0x3f, 0xe5, 0xfe, 0x26, 0x34, 0x01, 0xfc, 0xfb, 0xff, 0xb7, \n  0x3d, 0x00, 0xfb, 0x39, 0x01, 0x84, 0x84, 0x00, 0x6c, 0xfa, 0xff, 0x55, 0xb4, 0x00, 0x92, 0x00, \n  0xff, 0xd5, 0xd5, 0xfe, 0x72, 0xc3, 0xff, 0xde, 0x0c, 0xff, 0x1d, 0xb3, 0xff, 0x00, 0xb9, 0x00, \n  0xb9, 0x72, 0x01, 0x5a, 0x13, 0x00, 0x65, 0xe1, 0x11, 0x43, 0x1a, 0x16, 0x72, 0x3e, 0x0b, 0x74, \n  0x34, 0x03, 0xb5, 0x32, 0xf4, 0x13, 0xaa, 0xf9, 0x35, 0x88, 0x02, 0x70, 0xf6, 0x02, 0x5e, 0xeb, \n  0x01, 0x66, 0x5f, 0x00, 0x07, 0xa2, 0xfd, 0x03, 0xd5, 0xfd, 0x70, 0x22, 0x01, 0xb2, 0x19, 0xff, \n  0x86, 0x23, 0x01, 0xbd, 0xd4, 0x00, 0xf3, 0x41, 0xff, 0x60, 0x38, 0x01, 0xb6, 0x44, 0x00, 0x59, \n  0xe3, 0x00, 0x47, 0xc7, 0x01, 0x24, 0xdf, 0x00, 0xb8, 0x09, 0x00, 0x01, 0x73, 0x00, 0x6d, 0x0d, \n  0xff, 0x4b, 0xa5, 0xfe, 0xe1, 0x73, 0xff, 0xc5, 0xf7, 0xfe, 0xcb, 0x96, 0xff, 0x70, 0xd9, 0x00, \n  0x98, 0x8b, 0x01, 0x0e, 0x16, 0x00, 0xf2, 0xdd, 0x0f, 0x45, 0x51, 0x14, 0x67, 0xee, 0x0a, 0xc9, \n  0x19, 0x03, 0x6b, 0x06, 0xf6, 0x64, 0x93, 0xfa, 0x95, 0xf8, 0x01, 0x2a, 0x6f, 0x02, 0x99, 0xf3, \n  0x01, 0xbb, 0xb0, 0x00, 0xec, 0x59, 0xfe, 0xbf, 0x38, 0xfe, 0x13, 0xc1, 0x00, 0x62, 0x4f, 0xff, \n  0xd5, 0x2a, 0x01, 0x02, 0xc9, 0x00, 0xd4, 0x74, 0xff, 0x0c, 0x7e, 0x01, 0xb1, 0xe9, 0x00, 0xa4, \n  0x10, 0x01, 0xaf, 0x70, 0x01, 0xc9, 0x73, 0x00, 0x10, 0xb8, 0xff, 0x35, 0x2f, 0x00, 0x36, 0xd4, \n  0xfe, 0xbc, 0x6b, 0xfe, 0xec, 0x54, 0xff, 0xdc, 0xda, 0xfe, 0xd9, 0x46, 0xff, 0x0e, 0xe2, 0x00, \n  0x8f, 0x55, 0x01, 0x33, 0xcc, 0xff, 0x12, 0x7d, 0x0e, 0xfc, 0x3e, 0x13, 0x87, 0x37, 0x0a, 0x4a, \n  0xb4, 0x02, 0x82, 0xc2, 0xf7, 0x60, 0x80, 0xfb, 0x4b, 0xc5, 0x01, 0xe0, 0x50, 0x02, 0x76, 0x2d, \n  0x02, 0x72, 0xfb, 0x00, 0xbf, 0x08, 0xff, 0xcf, 0xb5, 0xfe, 0xd4, 0xa6, 0x00, 0xcb, 0xa6, 0xff, \n  0x85, 0x40, 0x01, 0x54, 0x42, 0x01, 0x01, 0x0e, 0x00, 0x85, 0x80, 0x01, 0x00, 0xe6, 0x00, 0xfa, \n  0xc2, 0x00, 0x4e, 0xfa, 0x00, 0xed, 0x50, 0x00, 0x8e, 0x99, 0xff, 0x60, 0x08, 0x00, 0x6e, 0x25, \n  0xff, 0x1a, 0x6c, 0xfe, 0xd4, 0x0d, 0xff, 0x35, 0xe7, 0xfe, 0xd6, 0x65, 0xff, 0xb2, 0xb7, 0x00, \n  0x98, 0x99, 0x01, 0x45, 0x5e, 0x00, 0x9b, 0x93, 0x0d, 0x5d, 0x81, 0x12, 0xfd, 0x68, 0x09, 0x74, \n  0x22, 0x02, 0x88, 0x33, 0xf9, 0x48, 0x4e, 0xfc, 0xc0, 0xe4, 0x01, 0x41, 0x84, 0x02, 0xe2, 0x5d, \n  0x02, 0x65, 0x3b, 0x01, 0xc0, 0x8c, 0xff, 0xae, 0x39, 0xff, 0xd5, 0x9f, 0x00, 0x77, 0x38, 0x00, \n  0x73, 0xac, 0x01, 0x17, 0x30, 0x01, 0xe1, 0xdf, 0xff, 0x08, 0xe9, 0x00, 0x76, 0xd2, 0x00, 0x10, \n  0xa4, 0x00, 0x53, 0x87, 0x00, 0xeb, 0x5a, 0x00, 0x68, 0xcc, 0xff, 0x5a, 0xfa, 0xff, 0x22, 0x24, \n  0xff, 0x8b, 0x7b, 0xfe, 0xae, 0x10, 0xff, 0x95, 0xbd, 0xfe, 0xc1, 0xe0, 0xff, 0xce, 0x4f, 0x01, \n  0xc4, 0xf6, 0x00, 0xef, 0x0a, 0x00, 0x6d, 0xdf, 0x0c, 0x91, 0x22, 0x12, 0xc4, 0xa1, 0x08, 0x6e, \n  0x68, 0x01, 0x26, 0x6f, 0xfa, 0xab, 0x12, 0xfd, 0xbf, 0x39, 0x02, 0xe3, 0xe6, 0x02, 0x1d, 0x58, \n  0x02, 0xa6, 0x88, 0x01, 0x5b, 0xcc, 0xff, 0xd0, 0xad, 0xff, 0x0f, 0x11, 0x01, 0x3d, 0x11, 0x00, \n  0xd6, 0x33, 0x01, 0xf4, 0xda, 0x00, 0xf2, 0x98, 0xff, 0x56, 0x57, 0x00, 0x2e, 0xbd, 0x00, 0xa7, \n  0xb5, 0x00, 0x0b, 0x4f, 0x00, 0xeb, 0x68, 0x00, 0x0b, 0xd6, 0xff, 0xaf, 0xb0, 0xff, 0x03, 0x7a, \n  0xff, 0x86, 0xa7, 0xfe, 0x46, 0x91, 0xfe, 0xdb, 0xc7, 0xff, 0x1e, 0x34, 0x00, 0xa3, 0x0f, 0x00, \n  0x36, 0x7d, 0x00, 0x10, 0x56, 0x00, 0x97, 0x6b, 0x0c, 0x53, 0x11, 0x12, 0xb5, 0x06, 0x08, 0x73, \n  0x02, 0x01, 0x9c, 0x80, 0xfb, 0x59, 0xe2, 0xfd, 0xbf, 0x9c, 0x02, 0x72, 0x74, 0x03, 0x90, 0x55, \n  0x02, 0x69, 0xbc, 0x01, 0x50, 0x84, 0x00, 0xec, 0x4f, 0xff, 0xb0, 0xdd, 0x00, 0x98, 0xf5, 0xff, \n  0x84, 0xc7, 0x00, 0x06, 0xd5, 0x00, 0x3e, 0x6d, 0xff, 0x52, 0x03, 0x00, 0x43, 0xa6, 0x00, 0x79, \n  0x22, 0x01, 0xd8, 0x3c, 0x00, 0x11, 0x29, 0x00, 0xd2, 0x2e, 0x00, 0x04, 0x0f, 0x00, 0x7d, 0x31, \n  0xff, 0x5b, 0x21, 0xff, 0x25, 0xbe, 0xff, 0x70, 0xfb, 0xfe, 0xb3, 0x8a, 0xff, 0x29, 0x2f, 0x00, \n  0x63, 0x3e, 0x00, 0x9c, 0x68, 0x00, 0x09, 0x45, 0x0c, 0x8c, 0xf8, 0x11, 0x6f, 0xa8, 0x07, 0x3d, \n  0xf4, 0x00, 0x83, 0x59, 0xfc, 0x4c, 0x52, 0xfe, 0xdc, 0xbb, 0x02, 0x83, 0x93, 0x03, 0x46, 0xad, \n  0x02, 0x7c, 0x98, 0x01, 0x8c, 0x6a, 0x00, 0xc3, 0xe5, 0xfe, 0x81, 0x23, 0x00, 0x43, 0x3f, 0x00, \n  0x50, 0x8d, 0x00, 0x56, 0xac, 0x00, 0x7f, 0x4c, 0xff, 0xf2, 0xbf, 0xff, 0xdc, 0xcb, 0x00, 0xc4, \n  0xd6, 0x00, 0x3f, 0x3f, 0x00, 0xe5, 0x50, 0x00, 0xec, 0x67, 0x00, 0xd0, 0xb4, 0xff, 0x38, 0xd7, \n  0xff, 0x4b, 0x39, 0x00, 0x5f, 0x86, 0xfe, 0xf4, 0x7c, 0xfe, 0xba, 0xa2, 0xff, 0x75, 0x1c, 0x00, \n  0x90, 0x13, 0x00, 0x1c, 0x2c, 0x00, 0xd9, 0x04, 0x0c, 0x22, 0x1e, 0x12, 0x5b, 0xf4, 0x07, 0xa9, \n  0x2b, 0x01, 0xc8, 0xf8, 0xfc, 0x93, 0x39, 0xfe, 0x1f, 0x64, 0x02, 0x68, 0x7d, 0x03, 0x60, 0x73, \n  0x02, 0xc1, 0xbc, 0x01, 0x3b, 0x47, 0x00, 0xa7, 0xb3, 0xfe, 0xa8, 0xe8, 0xff, 0xb0, 0xd1, 0xff, \n  0xcd, 0x9d, 0x00, 0xff, 0xa2, 0x00, 0xfb, 0x7c, 0xff, 0x1e, 0xa7, 0xff, 0xb9, 0x94, 0x00, 0xf2, \n  0xc3, 0x00, 0x0b, 0x03, 0x00, 0x9c, 0xc5, 0x00, 0x80, 0x07, 0x00, 0xfe, 0x3a, 0x00, 0xd1, 0x23, \n  0x01, 0x3e, 0xd6, 0xfe, 0xd0, 0x2e, 0xfe, 0xb4, 0x0e, 0xff, 0x37, 0x2a, 0xff, 0xf6, 0xe2, 0xff, \n  0x3f, 0x72, 0x00, 0x63, 0xf0, 0xff, 0x31, 0x17, 0x0c, 0x28, 0xb2, 0x12, 0xda, 0x53, 0x08, 0xfc, \n  0x0d, 0x01, 0x3e, 0x1c, 0xfd, 0x0b, 0x54, 0xfe, 0xb6, 0xd8, 0x01, 0x6c, 0xef, 0x02, 0xc4, 0x12, \n  0x02, 0x68, 0x56, 0x01, 0xde, 0xcd, 0x00, 0xa9, 0xf5, 0xfe, 0xaa, 0x71, 0xff, 0xfe, 0xd9, 0xff, \n  0xaf, 0x35, 0x00, 0xa4, 0x8e, 0x00, 0x3f, 0xee, 0xff, 0x20, 0xed, 0xff, 0x12, 0x59, 0x00, 0x0f, \n  0x42, 0x00, 0xc2, 0x6e, 0x00, 0xb0, 0x40, 0x00, 0x32, 0x07, 0x00, 0x30, 0xe4, 0x01, 0x89, 0x42, \n  0x00, 0x14, 0x12, 0xfe, 0x5a, 0xd5, 0xfe, 0xe3, 0xf7, 0xfe, 0xe1, 0x17, 0xff, 0x68, 0x04, 0x00, \n  0x39, 0x72, 0x00, 0xa0, 0x43, 0xff, 0x4e, 0x44, 0x0c, 0x8f, 0x92, 0x13, 0xb4, 0xd8, 0x08, 0x8b, \n  0x76, 0x00, 0xd3, 0xff, 0xfc, 0xb7, 0x52, 0xfe, 0xc6, 0xbd, 0x01, 0xaa, 0xe9, 0x02, 0x6c, 0x3d, \n  0x01, 0x99, 0xcf, 0x00, 0xd1, 0xbb, 0x00, 0xa2, 0xf3, 0xfe, 0xe5, 0xf7, 0xff, 0x5a, 0xd5, 0xff, \n  0xfa, 0x1b, 0x00, 0x8c, 0x98, 0x00, 0xe1, 0xb9, 0xff, 0x93, 0x37, 0x00, 0x8c, 0x90, 0x00, 0x2f, \n  0x2c, 0x00, 0x60, 0x29, 0x00, 0xd3, 0xe4, 0xff, 0x41, 0xad, 0x00, 0xc5, 0x28, 0x02, 0x96, 0x86, \n  0xff, 0xf6, 0x57, 0xfe, 0xd9, 0x04, 0xff, 0x67, 0xe1, 0xfe, 0x50, 0x7a, 0xff, 0x04, 0x4a, 0x00, \n  0x25, 0xf9, 0xff, 0xd5, 0xe8, 0xfe, 0x17, 0x3d, 0x0c, 0xe2, 0xb1, 0x14, 0xae, 0x87, 0x09, 0x06, \n  0xd5, 0xff, 0x32, 0x99, 0xfc, 0x1f, 0xdd, 0xfd, 0x67, 0x03, 0x02, 0xed, 0x5c, 0x03, 0xc6, 0xe8, \n  0x00, 0x2e, 0x45, 0x00, 0xa9, 0x06, 0x00, 0x38, 0x80, 0xfe, 0x85, 0xb4, 0xff, 0x32, 0x3d, 0x00, \n  0xb9, 0xc3, 0x00, 0xfe, 0x8b, 0x00, 0x52, 0xbb, 0xff, 0x28, 0x18, 0x00, 0x16, 0x46, 0x00, 0xaa, \n  0x65, 0x00, 0x91, 0x5f, 0x00, 0x6c, 0x8b, 0xff, 0x32, 0x96, 0x00, 0x4d, 0x53, 0x02, 0x19, 0x22, \n  0xff, 0x86, 0x5f, 0xfe, 0x58, 0x5a, 0xff, 0x90, 0xd1, 0xfe, 0xaf, 0xdf, 0xff, 0x0c, 0x86, 0x00, \n  0x57, 0x91, 0xff, 0xe8, 0xe4, 0xfe, 0x9d, 0x5a, 0x0c, 0x11, 0xb1, 0x15, 0x7f, 0x89, 0x0a, 0x9a, \n  0x43, 0xff, 0x87, 0xce, 0xfb, 0x79, 0x7a, 0xfd, 0x03, 0x57, 0x02, 0x60, 0xf3, 0x03, 0xa4, 0xf3, \n  0x00, 0xbc, 0x0a, 0x00, 0x90, 0xa4, 0xff, 0xac, 0x07, 0xfe, 0xad, 0xe8, 0xfe, 0xcd, 0x04, 0x00, \n  0x14, 0xee, 0x00, 0xb5, 0xf3, 0x00, 0x0c, 0x44, 0x00, 0xb0, 0x1b, 0x00, 0x70, 0x2d, 0x00, 0xe2, \n  0x25, 0x00, 0xa1, 0x7c, 0x00, 0x9d, 0x9e, 0xff, 0xe2, 0x6a, 0x00, 0x95, 0x52, 0x02, 0x06, 0xf7, \n  0xfe, 0x7b, 0x4e, 0xfe, 0x41, 0x7c, 0xff, 0xf3, 0xe6, 0xfe, 0x81, 0x3c, 0x00, 0x47, 0xb9, 0x00, \n  0xcc, 0x92, 0xff, 0xcf, 0xe2, 0xfe, 0x60, 0x87, 0x0c, 0xae, 0xfb, 0x16, 0xd4, 0x66, 0x0b, 0x06, \n  0xd6, 0xfe, 0x28, 0xef, 0xfa, 0xfb, 0xcb, 0xfc, 0x41, 0xda, 0x02, 0xbe, 0x6b, 0x04, 0x2d, 0x0d, \n  0x01, 0x2b, 0xd5, 0xff, 0x71, 0x73, 0xff, 0x5f, 0xf2, 0xfd, 0x61, 0x78, 0xfe, 0x71, 0x79, 0xff, \n  0xc1, 0x9f, 0x00, 0xe8, 0xc2, 0x00, 0x9b, 0x29, 0x00, 0x73, 0x81, 0x00, 0x33, 0xb0, 0x00, 0x17, \n  0x1b, 0x00, 0xd4, 0x46, 0x00, 0x5a, 0xe3, 0xff, 0x3f, 0xb8, 0xff, 0x3f, 0x1b, 0x02, 0x12, 0xcc, \n  0xff, 0x66, 0xc6, 0xfd, 0x76, 0x15, 0xff, 0x2c, 0x2f, 0xff, 0xe1, 0x64, 0x00, 0x30, 0xc2, 0x00, \n  0xbc, 0xc4, 0xff, 0x2e, 0x13, 0xff, 0x53, 0xe8, 0x0c, 0x1f, 0x64, 0x18, 0xa4, 0x92, 0x0c, 0x10, \n  0xf3, 0xfd, 0xbc, 0xaa, 0xf9, 0xfe, 0xc0, 0xfc, 0xb3, 0x29, 0x03, 0xb2, 0x0a, 0x05, 0x81, 0x25, \n  0x01, 0x8f, 0x12, 0xff, 0xb6, 0x9a, 0xff, 0xd6, 0x0a, 0xfe, 0x9c, 0x10, 0xfe, 0xc2, 0x65, 0xff, \n  0xc0, 0x38, 0x00, 0xa8, 0x70, 0x00, 0x63, 0xb3, 0xff, 0x8b, 0x06, 0x00, 0x42, 0x04, 0x01, 0xa4, \n  0x40, 0x00, 0x66, 0x67, 0x00, 0x8a, 0x84, 0x00, 0x72, 0xf6, 0xfe, 0x39, 0x66, 0x01, 0x44, 0xb8, \n  0x00, 0x54, 0xb2, 0xfd, 0xca, 0x9e, 0xfe, 0xda, 0x42, 0xff, 0x3e, 0x24, 0x00, 0x7f, 0xd5, 0x00, \n  0xeb, 0xf7, 0xff, 0x65, 0x06, 0xff, 0x7f, 0x6a, 0x0d, 0xcf, 0x0f, 0x1a, 0xdd, 0x03, 0x0e, 0xeb, \n  0x11, 0xfd, 0x62, 0x29, 0xf8, 0x74, 0x82, 0xfc, 0x03, 0x89, 0x03, 0x05, 0xb6, 0x05, 0xcb, 0x0f, \n  0x01, 0x5e, 0x57, 0xfe, 0xbb, 0xa5, 0xff, 0x40, 0x6b, 0xfe, 0x41, 0xcc, 0xfd, 0xae, 0x5c, 0xff, \n  0xb2, 0x10, 0x00, 0x78, 0x1c, 0x00, 0x0f, 0x92, 0xff, 0x3b, 0x77, 0xff, 0xcf, 0xc9, 0x00, 0x55, \n  0x7e, 0x00, 0x56, 0xe5, 0xff, 0x0f, 0xe3, 0x00, 0xc5, 0x9f, 0xff, 0xd7, 0x2c, 0x00, 0xc7, 0x35, \n  0x01, 0x34, 0xd5, 0xfe, 0x1e, 0xd3, 0xfd, 0xde, 0xaa, 0xfe, 0x05, 0x2f, 0x00, 0x6d, 0xcc, 0x00, \n  0x17, 0xd6, 0xff, 0xa0, 0x27, 0xff, 0x85, 0xa6, 0x0d, 0x8a, 0xe3, 0x1b, 0x49, 0x31, 0x10, 0xd5, \n  0x12, 0xfc, 0x4f, 0x7a, 0xf6, 0xcc, 0x20, 0xfc, 0x9e, 0xc5, 0x03, 0x9f, 0xa4, 0x06, 0xa4, 0xf4, \n  0x00, 0xe1, 0x68, 0xfd, 0xfd, 0x6a, 0xff, 0xfe, 0xf2, 0xfe, 0xab, 0xad, 0xfd, 0x08, 0x3e, 0xff, \n  0x97, 0x35, 0x00, 0x85, 0xc1, 0xff, 0xf7, 0x5c, 0xff, 0x4c, 0x24, 0xff, 0xca, 0x72, 0x00, 0x4a, \n  0xca, 0x00, 0x87, 0x91, 0xff, 0x58, 0x35, 0x00, 0x67, 0x29, 0x00, 0x24, 0xb0, 0xff, 0xc1, 0xe8, \n  0x00, 0x59, 0x62, 0x00, 0x06, 0x1e, 0xfe, 0xfc, 0xf2, 0xfd, 0x5a, 0xa4, 0xff, 0xc0, 0x6e, 0x00, \n  0x71, 0x05, 0x00, 0xe4, 0x30, 0xff, 0xa9, 0x05, 0x0e, 0xf4, 0xeb, 0x1d, 0xd8, 0x8f, 0x12, 0x32, \n  0xf5, 0xfa, 0xcd, 0x77, 0xf4, 0x4d, 0xd3, 0xfb, 0x89, 0x2c, 0x04, 0x49, 0x9f, 0x07, 0x9a, 0xd6, \n  0x00, 0xad, 0x40, 0xfc, 0x02, 0x24, 0xff, 0xaf, 0x7c, 0xff, 0xfe, 0x9f, 0xfd, 0x4e, 0x0a, 0xff, \n  0x7f, 0x64, 0x00, 0x37, 0xb3, 0xff, 0x30, 0x0a, 0xff, 0xac, 0xf1, 0xfe, 0x78, 0x28, 0x00, 0xaa, \n  0xb2, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x7e, 0xff, 0x69, 0xb0, 0xff, 0x15, 0xda, 0xff, 0xc4, 0xf9, \n  0xff, 0xde, 0x1f, 0x01, 0x88, 0xe8, 0xff, 0xf7, 0xae, 0xfd, 0x10, 0xbb, 0xfe, 0x5f, 0x6c, 0x00, \n  0x63, 0xa4, 0xff, 0x32, 0xf7, 0xfe, 0xca, 0x09, 0x10, 0x7b, 0xf5, 0x20, 0xfc, 0xaa, 0x12, 0x25, \n  0xbd, 0xf8, 0x5c, 0xad, 0xf2, 0x36, 0xc4, 0xfb, 0x9b, 0x88, 0x05, 0xa5, 0x50, 0x08, 0xed, 0xd2, \n  0xff, 0xb3, 0x1e, 0xfb, 0xe3, 0x03, 0xff, 0x2c, 0xca, 0xff, 0xd4, 0xa3, 0xfd, 0x79, 0xd9, 0xfe, \n  0x08, 0x6c, 0x00, 0xe1, 0xaa, 0xff, 0xff, 0xa9, 0xfe, 0xcf, 0xd1, 0xfe, 0xc4, 0xff, 0xff, 0xc5, \n  0x78, 0x00, 0xbb, 0x25, 0x00, 0xe2, 0x73, 0xff, 0x15, 0x04, 0xff, 0xa7, 0x7c, 0xff, 0xa5, 0xb2, \n  0xff, 0x45, 0xc8, 0x00, 0xaf, 0x0e, 0x01, 0x5e, 0xcc, 0xfe, 0x90, 0x09, 0xfe, 0x51, 0xd4, 0xff, \n  0xb3, 0xc5, 0xff, 0xb2, 0x8d, 0xfe, 0xa9, 0x50, 0x11, 0xa2, 0x94, 0x23, 0xfc, 0x28, 0x14, 0x76, \n  0x25, 0xf7, 0xfb, 0x71, 0xf0, 0xb4, 0xcb, 0xfb, 0x43, 0x86, 0x06, 0xa7, 0xeb, 0x08, 0xd5, 0x55, \n  0xff, 0x55, 0xd5, 0xf9, 0x36, 0xb5, 0xfe, 0x38, 0x8b, 0x00, 0xe8, 0x5d, 0xfd, 0x64, 0xb6, 0xfe, \n  0xf0, 0x9d, 0x00, 0xa9, 0x71, 0xff, 0x4d, 0x82, 0xfe, 0x00, 0xc9, 0xfe, 0x56, 0xc6, 0xff, 0x4f, \n  0x75, 0x00, 0xce, 0x0c, 0x00, 0x58, 0x79, 0xff, 0xf6, 0xfa, 0xfe, 0x6d, 0x95, 0xfe, 0xbf, 0xa7, \n  0xff, 0x40, 0x96, 0x00, 0x1a, 0x38, 0x01, 0x7e, 0x4a, 0x00, 0xff, 0x60, 0xfe, 0x3d, 0xc8, 0xfe, \n  0x3a, 0xce, 0xff, 0x3c, 0xa7, 0xfe, 0x7a, 0x96, 0x12, 0x63, 0xf7, 0x25, 0x94, 0xf6, 0x15, 0x67, \n  0xda, 0xf5, 0xc3, 0xdf, 0xed, 0xdf, 0xd9, 0xfb, 0xdb, 0x95, 0x07, 0x09, 0x59, 0x09, 0xf8, 0xcc, \n  0xfe, 0x6a, 0x8d, 0xf8, 0xc8, 0x25, 0xfe, 0x8c, 0x86, 0x01, 0xde, 0x3d, 0xfd, 0xd1, 0x22, 0xfe, \n  0xd7, 0xdc, 0x00, 0x39, 0x70, 0xff, 0x2b, 0x29, 0xfe, 0xd5, 0xb4, 0xfe, 0x5c, 0xd8, 0xff, 0xa7, \n  0x20, 0x00, 0x00, 0x2e, 0x00, 0x2f, 0x28, 0xff, 0xd1, 0x27, 0xff, 0x53, 0x31, 0xfe, 0x18, 0xd4, \n  0xfe, 0x60, 0xdb, 0x00, 0x7c, 0x1d, 0x01, 0xc1, 0xd7, 0x00, 0xe0, 0xb5, 0xff, 0xa3, 0x58, 0xfe, \n  0x60, 0xc5, 0xfe, 0x13, 0x19, 0xff, 0xeb, 0x3f, 0x15, 0xff, 0xc8, 0x28, 0xed, 0x91, 0x15, 0x36, \n  0x46, 0xf4, 0xa3, 0x0d, 0xec, 0x02, 0x05, 0xfc, 0x93, 0x47, 0x09, 0xc5, 0x70, 0x09, 0x44, 0x72, \n  0xfd, 0x7c, 0xa6, 0xf7, 0x36, 0xff, 0xfd, 0xa7, 0x10, 0x02, 0x6d, 0x4f, 0xfd, 0x3d, 0xae, 0xfd, \n  0x75, 0xfb, 0x00, 0x4f, 0x4e, 0xff, 0xa4, 0x25, 0xfe, 0x12, 0x80, 0xfe, 0x5c, 0x05, 0x00, 0x1d, \n  0x1a, 0x00, 0x48, 0xd4, 0xff, 0x16, 0x38, 0xff, 0xfb, 0xf6, 0xfe, 0x71, 0x35, 0xfe, 0xaa, 0x62, \n  0xfe, 0x2f, 0x8d, 0x00, 0xf3, 0x7a, 0x01, 0x32, 0xd3, 0x00, 0xda, 0x74, 0x00, 0x31, 0x5e, 0xff, \n  0xd0, 0xb5, 0xfd, 0x18, 0x94, 0xfe, 0x0b, 0x83, 0x17, 0xc3, 0x15, 0x2b, 0xd3, 0x6b, 0x15, 0x3d, \n  0xd6, 0xf3, 0xc8, 0x6a, 0xea, 0x3b, 0xa4, 0xfb, 0xb2, 0xe9, 0x0a, 0x9a, 0x44, 0x09, 0x0e, 0x71, \n  0xfc, 0xe7, 0xff, 0xf6, 0xc1, 0x6f, 0xfd, 0x6d, 0xa2, 0x02, 0xfc, 0x8e, 0xfd, 0xe3, 0x05, 0xfd, \n  0xd9, 0x09, 0x01, 0xe0, 0x58, 0xff, 0xa1, 0xf9, 0xfd, 0x02, 0x94, 0xfe, 0xc2, 0x16, 0x00, 0xd7, \n  0x24, 0x00, 0x16, 0x83, 0xff, 0xb5, 0x23, 0xff, 0x99, 0xda, 0xfe, 0x0f, 0x3f, 0xfe, 0xc2, 0x6c, \n  0xfe, 0xe7, 0xe3, 0xff, 0xad, 0xaa, 0x01, 0xd0, 0x22, 0x01, 0x92, 0x5a, 0x00, 0xbe, 0x91, 0x00, \n  0xfa, 0xff, 0xfd, 0x4e, 0x3c, 0xfd, 0xb2, 0xd1, 0x19, 0x6c, 0x28, 0x2d, 0xb1, 0x63, 0x14, 0x9b, \n  0xdc, 0xf3, 0xab, 0xa3, 0xe9, 0x36, 0xae, 0xfa, 0x5a, 0x39, 0x0c, 0xb9, 0x03, 0x09, 0x7a, 0x57, \n  0xfb, 0x42, 0x92, 0xf6, 0x76, 0xc7, 0xfc, 0xb0, 0xf3, 0x02, 0x72, 0xbf, 0xfd, 0x8d, 0x56, 0xfc, \n  0x36, 0xca, 0x00, 0x0d, 0x6d, 0xff, 0x99, 0xcf, 0xfd, 0x09, 0xac, 0xfe, 0x3e, 0x1f, 0x00, 0xb0, \n  0x22, 0x00, 0xd3, 0x3f, 0xff, 0x14, 0xb4, 0xfe, 0xdc, 0xe5, 0xfe, 0x58, 0x08, 0xfe, 0x87, 0xd0, \n  0xfe, 0x19, 0x8b, 0xff, 0xf9, 0xf0, 0x00, 0x26, 0xb3, 0x01, 0x2d, 0x36, 0x00, 0xfe, 0xb7, 0x00, \n  0xf1, 0x3f, 0xff, 0x93, 0x6b, 0xfc, 0x57, 0xfc, 0x1d, 0xe2, 0x34, 0x2f, 0xee, 0xe9, 0x10, 0x85, \n  0x43, 0xf3, 0x82, 0x50, 0xea, 0x79, 0x6c, 0xfa, 0x6a, 0x2e, 0x0d, 0xea, 0x9a, 0x08, 0x4e, 0xe5, \n  0xf9, 0x25, 0x49, 0xf6, 0x48, 0xd7, 0xfc, 0x46, 0xf2, 0x02, 0x69, 0xa7, 0xfd, 0xcb, 0x10, 0xfc, \n  0x1b, 0x7c, 0x00, 0x59, 0x57, 0xff, 0x8e, 0xff, 0xfd, 0xf8, 0xcc, 0xfe, 0x7a, 0x4f, 0x00, 0xa0, \n  0x45, 0x00, 0x0f, 0xd5, 0xfe, 0xea, 0x76, 0xfe, 0x12, 0xde, 0xfe, 0x37, 0xe5, 0xfd, 0xba, 0x30, \n  0xff, 0xc3, 0x06, 0x00, 0xbc, 0xec, 0xff, 0xf5, 0xae, 0x01, 0x02, 0xa0, 0x00, 0x66, 0x43, 0x00, \n  0x8e, 0x4d, 0x00, 0x78, 0xb6, 0xfc, 0x27, 0xee, 0x22, 0x3f, 0x0e, 0x31, 0x84, 0xf8, 0x0b, 0x3d, \n  0xe1, 0xf2, 0x71, 0xdd, 0xeb, 0x16, 0xd2, 0xfa, 0x73, 0x56, 0x0d, 0x0c, 0x1b, 0x08, 0x50, 0xe9, \n  0xf8, 0xcb, 0xca, 0xf5, 0xa1, 0x5f, 0xfd, 0xd0, 0x8f, 0x02, 0xd4, 0xb3, 0xfd, 0xb2, 0xc4, 0xfb, \n  0xc5, 0x46, 0x00, 0x00, 0x3f, 0xff, 0x42, 0x4e, 0xfe, 0x2b, 0x0a, 0xff, 0x67, 0x70, 0x00, 0x9a, \n  0x9d, 0x00, 0x0b, 0x37, 0xfe, 0xe1, 0x98, 0xfe, 0xa3, 0xad, 0xfe, 0xbd, 0xf3, 0xfd, 0x65, 0x7b, \n  0xff, 0x32, 0xc3, 0x00, 0x6c, 0x35, 0xff, 0x9e, 0x07, 0x01, 0x2c, 0x15, 0x01, 0xff, 0xe8, 0xff, \n  0x24, 0xc3, 0x00, 0x37, 0x8c, 0xfd, 0x09, 0xec, 0x27, 0xee, 0x03, 0x33, 0xb5, 0x23, 0x06, 0xb0, \n  0x30, 0xf2, 0x9e, 0xe7, 0xed, 0xae, 0x7c, 0xfb, 0x92, 0xab, 0x0c, 0xe7, 0x91, 0x07, 0xb0, 0x61, \n  0xf8, 0xfe, 0xeb, 0xf4, 0xb5, 0xef, 0xfd, 0x17, 0xbf, 0x01, 0x82, 0xe1, 0xfd, 0x57, 0x7a, 0xfb, \n  0x39, 0xfa, 0xff, 0x23, 0x4b, 0xff, 0x9b, 0x71, 0xfe, 0x86, 0x51, 0xff, 0x40, 0x52, 0x00, 0x0d, \n  0xf3, 0x00, 0x0d, 0x89, 0xfd, 0x6c, 0xef, 0xfe, 0xaa, 0x5f, 0xfe, 0xc8, 0x03, 0xfe, 0x8a, 0xce, \n  0xff, 0x5f, 0x19, 0x01, 0x98, 0xd4, 0xfe, 0x28, 0xfa, 0xff, 0x6c, 0x37, 0x01, 0xb1, 0xcb, 0xff, \n  0xc4, 0xcc, 0x00, 0x44, 0x6d, 0xfe, 0x6a, 0x2a, 0x2e, 0xfa, 0x30, 0x34, 0xd7, 0x76, 0xff, 0x88, \n  0x49, 0xf1, 0x3a, 0x06, 0xf0, 0x4c, 0x14, 0xfd, 0x6f, 0x8b, 0x0b, 0x5c, 0x18, 0x07, 0x84, 0xcd, \n  0xf7, 0x21, 0x2f, 0xf4, 0x5d, 0x68, 0xfe, 0xce, 0xd0, 0x00, 0x2a, 0x2e, 0xfe, 0xef, 0x72, 0xfb, \n  0x17, 0xf4, 0xff, 0x86, 0x40, 0xff, 0x73, 0xc6, 0xfe, 0xc1, 0x5c, 0xff, 0xbe, 0x54, 0x00, 0x1d, \n  0x15, 0x01, 0x83, 0x2d, 0xfd, 0x17, 0x5a, 0xff, 0xf8, 0x1c, 0xfe, 0xf8, 0x44, 0xfe, 0x00, 0x2a, \n  0x00, 0xf6, 0xf9, 0x00, 0x8a, 0x79, 0xfe, 0x68, 0x49, 0xff, 0x99, 0xd6, 0x00, 0x20, 0xeb, 0xff, \n  0xfa, 0x02, 0x01, 0xe9, 0x26, 0xff, 0xfe, 0xa8, 0x34, 0x3d, 0xf3, 0x34, 0x51, 0xe2, 0xf8, 0xe7, \n  0x42, 0xf0, 0xdd, 0xa4, 0xf1, 0x50, 0x0a, 0xff, 0xa4, 0x71, 0x0a, 0x76, 0xbb, 0x06, 0xb3, 0x35, \n  0xf7, 0x72, 0x56, 0xf3, 0x61, 0x96, 0xfe, 0x38, 0xd8, 0xff, 0x96, 0xd9, 0xfe, 0xc7, 0xd3, 0xfb, \n  0x7e, 0xe8, 0xff, 0x3a, 0x48, 0xff, 0x85, 0x0d, 0xff, 0x05, 0x0d, 0xff, 0x95, 0x8a, 0x00, 0x36, \n  0x34, 0x01, 0x5b, 0x1c, 0xfd, 0x32, 0xaf, 0xff, 0xa7, 0xf1, 0xfd, 0x8c, 0xad, 0xfe, 0x64, 0x22, \n  0x00, 0xcd, 0x7d, 0x00, 0x9e, 0x4c, 0xfe, 0x0e, 0xd6, 0xfe, 0x1d, 0x46, 0x00, 0xf6, 0x51, 0x00, \n  0x18, 0x4d, 0x01, 0x67, 0x9a, 0xff, 0xa2, 0x50, 0x3a, 0x54, 0xd6, 0x35, 0xcb, 0xf7, 0xf2, 0xa4, \n  0x61, 0xef, 0x4e, 0x46, 0xf2, 0x61, 0x1a, 0x01, 0x32, 0xb0, 0x09, 0x99, 0x5b, 0x06, 0xbc, 0x9e, \n  0xf6, 0x26, 0x37, 0xf2, 0x19, 0xad, 0xfe, 0x1a, 0xeb, 0xfe, 0x1a, 0x52, 0x00, 0x4f, 0x12, 0xfc, \n  0xb0, 0xe2, 0xff, 0x8f, 0x73, 0xff, 0x09, 0xb5, 0xfe, 0x86, 0xe7, 0xfe, 0x57, 0xde, 0x00, 0x3a, \n  0x7c, 0x01, 0xfd, 0x19, 0xfd, 0xa8, 0xfb, 0xff, 0x26, 0xc6, 0xfd, 0x71, 0xa3, 0xfe, 0xed, 0xd6, \n  0xff, 0x3d, 0x24, 0x00, 0x8f, 0x2d, 0xfe, 0x26, 0x9b, 0xfe, 0x1f, 0x12, 0x00, 0x9d, 0xa7, 0x00, \n  0x27, 0x18, 0x01, 0x5f, 0x52, 0x00, 0x58, 0x43, 0x3f, 0x8b, 0xca, 0x36, 0xdb, 0x19, 0xee, 0xd2, \n  0x66, 0xee, 0xa3, 0x9c, 0xf1, 0x69, 0x36, 0x03, 0xa0, 0x7f, 0x09, 0x2a, 0xae, 0x05, 0xf7, 0xf1, \n  0xf5, 0xe8, 0xf6, 0xf0, 0x11, 0xdf, 0xfe, 0x26, 0x77, 0xfe, 0x59, 0x3e, 0x02, 0x7f, 0xec, 0xfb, \n  0xdb, 0x49, 0x00, 0x3a, 0x16, 0xff, 0x7b, 0x2b, 0xfe, 0xcf, 0x51, 0xff, 0xd7, 0x11, 0x01, 0xe2, \n  0xf5, 0x01, 0xd9, 0x1d, 0xfd, 0xff, 0x2e, 0x00, 0xf5, 0xcd, 0xfc, 0xcb, 0x7a, 0xfe, 0x95, 0xcd, \n  0xff, 0x88, 0xc4, 0xff, 0xea, 0x30, 0xfe, 0xbe, 0x26, 0xff, 0xdd, 0xc7, 0xff, 0x32, 0x5f, 0x00, \n  0xcf, 0x53, 0x01, 0x57, 0xce, 0x00, 0x53, 0x66, 0x43, 0x3f, 0x91, 0x37, 0x7d, 0xb1, 0xea, 0x47, \n  0x33, 0xed, 0x45, 0xef, 0xef, 0x3d, 0xf8, 0x04, 0xb3, 0xca, 0x09, 0xd1, 0xad, 0x04, 0x79, 0x02, \n  0xf5, 0x5c, 0x5c, 0xf0, 0xdb, 0x70, 0xff, 0xec, 0x33, 0xfe, 0xf8, 0x37, 0x04, 0x60, 0xc3, 0xfb, \n  0x34, 0x51, 0x00, 0x56, 0x8d, 0xfe, 0xa4, 0x35, 0xfe, 0x48, 0xed, 0xff, 0xa6, 0x0c, 0x01, 0x58, \n  0x9b, 0x02, 0x04, 0xf1, 0xfc, 0x98, 0x4b, 0xff, 0x30, 0xf2, 0xfb, 0xd1, 0xcd, 0xfe, 0x5b, 0x75, \n  0xff, 0x6f, 0xfe, 0xff, 0xa6, 0xba, 0xfe, 0x4a, 0x67, 0xff, 0x28, 0x3c, 0xff, 0x5b, 0x87, 0x00, \n  0x2e, 0x4b, 0x01, 0xf5, 0x7e, 0x00, 0x91, 0xb1, 0x46, 0x3b, 0xaa, 0x37, 0xaa, 0xa4, 0xe8, 0xb1, \n  0x66, 0xec, 0x21, 0x8e, 0xed, 0x74, 0x07, 0x06, 0x60, 0x80, 0x0a, 0x20, 0x1b, 0x03, 0x68, 0x47, \n  0xf4, 0x1c, 0x73, 0xf1, 0xe3, 0x51, 0xff, 0xcd, 0x6a, 0xfe, 0x9d, 0xfc, 0x05, 0xf1, 0x2c, 0xfb, \n  0xa5, 0x06, 0x00, 0x01, 0xb9, 0xfe, 0xd4, 0xb2, 0xfe, 0x54, 0x3e, 0x00, 0x9d, 0x26, 0x01, 0x42, \n  0x60, 0x02, 0xaa, 0x09, 0xfc, 0x88, 0xd1, 0xfe, 0x47, 0x97, 0xfb, 0x40, 0xcb, 0xfe, 0x63, 0x18, \n  0x00, 0xda, 0x76, 0x00, 0x62, 0xa5, 0xfe, 0x40, 0x9c, 0xff, 0x2c, 0x65, 0xff, 0xd8, 0xf4, 0xff, \n  0x45, 0xee, 0x00, 0x2c, 0xee, 0x00, 0xc1, 0x39, 0x48, 0x45, 0xdc, 0x37, 0x9d, 0x6d, 0xe7, 0x30, \n  0xc6, 0xec, 0x5f, 0x54, 0xea, 0xda, 0x71, 0x06, 0x04, 0x73, 0x0b, 0x5d, 0x2e, 0x01, 0x39, 0x14, \n  0xf5, 0xe0, 0x94, 0xf2, 0x72, 0x44, 0xff, 0x31, 0xc6, 0xfe, 0xc7, 0xf4, 0x06, 0x16, 0x5c, 0xfa, \n  0x81, 0xff, 0xff, 0x08, 0xd5, 0xff, 0x9e, 0xc2, 0xfe, 0x8c, 0x71, 0x00, 0xc9, 0xe0, 0xff, 0xa2, \n  0xbf, 0x01, 0xa5, 0x08, 0xfc, 0x82, 0x78, 0xfe, 0xee, 0x6d, 0xfb, 0xf8, 0xbc, 0xff, 0xa0, 0xcb, \n  0x00, 0x26, 0xef, 0xff, 0x6f, 0x35, 0xff, 0x51, 0xcf, 0xff, 0xd6, 0xe8, 0xfe, 0xbd, 0x89, 0xff, \n  0xf4, 0x25, 0x01, 0xf2, 0xcd, 0x00, 0x9f, 0xf4, 0x49, 0x94, 0xf8, 0x35, 0x10, 0x6b, 0xe8, 0x9f, \n  0xe0, 0xec, 0x81, 0xba, 0xe5, 0xe0, 0x66, 0x06, 0x2e, 0x7c, 0x0c, 0x93, 0x0d, 0x01, 0x60, 0x6c, \n  0xf5, 0x22, 0x6a, 0xf4, 0x59, 0xb0, 0xfe, 0x38, 0xaf, 0xfe, 0x50, 0x93, 0x07, 0xdd, 0x04, 0xfa, \n  0x82, 0xf7, 0x00, 0xe1, 0x8f, 0x00, 0xdd, 0x33, 0xfe, 0x7b, 0x16, 0xff, 0x06, 0x6b, 0xff, 0x53, \n  0x79, 0x01, 0x01, 0x42, 0xfc, 0x37, 0x96, 0xfe, 0x04, 0xef, 0xfb, 0x64, 0x2a, 0x00, 0xa7, 0x9d, \n  0x00, 0x26, 0x09, 0x00, 0xfb, 0x60, 0xff, 0x5d, 0xa6, 0xff, 0x54, 0xf0, 0xfe, 0x12, 0x4a, 0xff, \n  0x30, 0x18, 0x01, 0x25, 0xb6, 0x00, 0x32, 0x2e, 0x49, 0xc1, 0x1e, 0x35, 0x7e, 0x16, 0xea, 0xd8, \n  0x78, 0xed, 0xe5, 0x94, 0xe0, 0x5d, 0x8b, 0x05, 0x78, 0x33, 0x0f, 0x14, 0x95, 0x00, 0xd9, 0x3d, \n  0xf6, 0xe6, 0x62, 0xf6, 0x58, 0x7d, 0xfd, 0x09, 0x00, 0xfe, 0x7c, 0xf0, 0x08, 0x6a, 0x4d, 0xfa, \n  0x00, 0x53, 0x01, 0x48, 0x5a, 0x00, 0x0d, 0x38, 0xfc, 0x5a, 0x51, 0xff, 0x81, 0x21, 0xff, 0x02, \n  0x38, 0x01, 0xcb, 0x44, 0xfd, 0xf7, 0xfc, 0xfe, 0x16, 0xd9, 0xfb, 0xc7, 0x47, 0x00, 0x5c, 0x92, \n  0x00, 0xf0, 0xc3, 0xff, 0x97, 0xb7, 0xff, 0x9f, 0x84, 0xff, 0x0a, 0x04, 0xff, 0xbc, 0xef, 0xfe, \n  0xbe, 0x55, 0x01, 0xcc, 0x77, 0x00, 0xca, 0x36, 0x49, 0x9c, 0x09, 0x31, 0xe9, 0xa3, 0xec, 0x2a, \n  0x15, 0xee, 0x6c, 0x13, 0xdc, 0xcc, 0xc9, 0x06, 0x3a, 0x83, 0x10, 0x1b, 0x60, 0x00, 0xb1, 0x41, \n  0xf7, 0x14, 0x1a, 0xf8, 0x0b, 0xaf, 0xfb, 0x02, 0xf0, 0xfe, 0x77, 0xfa, 0x09, 0x3b, 0x7b, 0xf9, \n  0xb3, 0x5d, 0x01, 0xb8, 0xda, 0xfe, 0x97, 0xf9, 0xfb, 0x70, 0x03, 0x00, 0x20, 0xbf, 0xfe, 0x50, \n  0x97, 0x01, 0x6c, 0x6f, 0xfe, 0x7e, 0x84, 0xfe, 0x1f, 0xec, 0xfb, 0xf6, 0x6d, 0x00, 0xf1, 0x4a, \n  0x00, 0xf5, 0xc1, 0xff, 0x16, 0xc2, 0xff, 0xcb, 0x93, 0xff, 0x17, 0x0c, 0xff, 0x9d, 0xdf, 0xfe, \n  0x72, 0x8b, 0x01, 0x1b, 0xfa, 0xff, 0xed, 0xcd, 0x46, 0xd6, 0xe5, 0x2d, 0x12, 0x5e, 0xef, 0x7f, \n  0x47, 0xef, 0x93, 0xf3, 0xd9, 0x56, 0xd9, 0x06, 0xba, 0x43, 0x11, 0x09, 0x22, 0x01, 0x1c, 0xb8, \n  0xf7, 0x4f, 0x7b, 0xf9, 0x87, 0x5d, 0xfb, 0xf6, 0x1d, 0xff, 0xff, 0xf1, 0x09, 0x16, 0xae, 0xf8, \n  0x93, 0x78, 0x00, 0xe1, 0xf3, 0xfe, 0x40, 0x6e, 0xfc, 0x5c, 0x28, 0x00, 0x0f, 0x55, 0xff, 0x81, \n  0xd9, 0x01, 0xae, 0xab, 0xfe, 0xb2, 0x31, 0xfe, 0xea, 0x54, 0xfc, 0x8b, 0x8f, 0x00, 0xe4, 0xb0, \n  0xff, 0x7c, 0xde, 0xff, 0xb6, 0xf1, 0xff, 0xf2, 0xa1, 0xff, 0x09, 0x39, 0xff, 0x5d, 0xbd, 0xfe, \n  0xfb, 0xaa, 0x01, 0x76, 0xea, 0xff, 0x3c, 0xa7, 0x41, 0x53, 0x21, 0x2b, 0x57, 0x75, 0xf2, 0x7e, \n  0x02, 0xf2, 0x3f, 0xdb, 0xd9, 0x2b, 0x82, 0x05, 0x5a, 0xb6, 0x11, 0xe3, 0x4a, 0x01, 0x49, 0x12, \n  0xf9, 0x57, 0xf1, 0xfa, 0xed, 0x51, 0xfa, 0xf4, 0x08, 0xff, 0xff, 0x43, 0x09, 0x42, 0xa9, 0xf7, \n  0x24, 0xcf, 0x00, 0xbd, 0x69, 0xff, 0x28, 0x3f, 0xfc, 0x7a, 0x86, 0x01, 0x26, 0x37, 0xff, 0x8b, \n  0x52, 0x01, 0x6b, 0xfa, 0xfe, 0x5f, 0x49, 0xfe, 0xd0, 0xf1, 0xfc, 0xba, 0xc2, 0xff, 0x31, 0xb5, \n  0xff, 0xf6, 0x02, 0x00, 0xe6, 0xf3, 0xff, 0x9b, 0xc5, 0xff, 0x3f, 0x24, 0xff, 0x47, 0xcf, 0xfe, \n  0x67, 0xe5, 0x01, 0x32, 0x89, 0xff, 0x53, 0xc0, 0x3b, 0x9e, 0xec, 0x26, 0x5e, 0x33, 0xf7, 0x5b, \n  0xf6, 0xf4, 0x6a, 0x70, 0xdb, 0xf0, 0xc9, 0x03, 0x0b, 0x14, 0x10, 0x75, 0x28, 0x03, 0xc3, 0x5f, \n  0xfa, 0x6c, 0xff, 0xfa, 0x39, 0x0f, 0xfa, 0xc6, 0xa9, 0xfe, 0xd3, 0xb1, 0x07, 0x75, 0x85, 0xf8, \n  0x85, 0xf0, 0x00, 0x57, 0x47, 0xff, 0xef, 0xa6, 0xfd, 0x11, 0xb4, 0x01, 0x97, 0xa1, 0xfe, 0xd0, \n  0x06, 0x01, 0xbc, 0xbd, 0xff, 0xd7, 0x3c, 0xfe, 0x35, 0xde, 0xfc, 0x67, 0xd1, 0xff, 0xdf, 0x9d, \n  0xff, 0x8b, 0xf7, 0xff, 0x88, 0x0f, 0x00, 0x99, 0xad, 0xff, 0xa5, 0x61, 0xff, 0x55, 0xf4, 0xfe, \n  0x76, 0xaa, 0x01, 0xf6, 0x9c, 0xff, 0x47, 0xbc, 0x34, 0x91, 0xf4, 0x22, 0x60, 0x3e, 0xfc, 0xbd, \n  0x48, 0xf8, 0x89, 0x54, 0xde, 0x95, 0x19, 0x01, 0xf4, 0x2f, 0x0f, 0xd8, 0x7a, 0x04, 0x52, 0x7c, \n  0xfa, 0xdb, 0x13, 0xfc, 0xee, 0x52, 0xf9, 0xcf, 0x46, 0xfe, 0xb0, 0x4f, 0x07, 0x9f, 0xeb, 0xf8, \n  0xeb, 0x08, 0x01, 0x6b, 0x1c, 0x00, 0xa3, 0x44, 0xfe, 0xc0, 0x40, 0x01, 0x4d, 0x61, 0xfe, 0x89, \n  0x71, 0x01, 0x8c, 0xd9, 0xff, 0x65, 0xd1, 0xfd, 0x7a, 0xc4, 0xfd, 0xfa, 0xad, 0xff, 0x01, 0x62, \n  0xff, 0xec, 0x16, 0x00, 0x61, 0xf9, 0xff, 0x4d, 0xd8, 0xff, 0x6d, 0x74, 0xff, 0xcd, 0xe7, 0xfe, \n  0xd6, 0xf2, 0x01, 0x7a, 0xdd, 0xff, 0x90, 0xe9, 0x29, 0xe1, 0x02, 0x1b, 0x26, 0x3d, 0xf7, 0x4c, \n  0xa0, 0xfc, 0x37, 0xa4, 0xf4, 0x32, 0xdf, 0x08, 0x33, 0x3f, 0x05, 0x6d, 0x69, 0xfa, 0x09, 0xd2, \n  0xfa, 0x2a, 0x88, 0x00, 0x78, 0x96, 0x00, 0x14, 0x2c, 0xff, 0xc6, 0x95, 0x03, 0x0a, 0x32, 0xfa, \n  0x6f, 0x25, 0x00, 0xdf, 0xb2, 0xff, 0x76, 0x03, 0xfd, 0x84, 0x64, 0x00, 0x93, 0xda, 0xfe, 0x28, \n  0x27, 0x00, 0x67, 0xa1, 0xff, 0x00, 0xa0, 0xfe, 0x77, 0x3c, 0xfe, 0x86, 0x20, 0x02, 0x99, 0xc8, \n  0xff, 0x13, 0x0a, 0x00, 0x3a, 0x51, 0x00, 0x91, 0x38, 0xfe, 0x28, 0xd2, 0xff, 0x22, 0xb8, 0xfe, \n  0x71, 0x54, 0xff, 0xcc, 0x10, 0x00, 0x8e, 0xe2, 0x23, 0x4a, 0x78, 0x1a, 0x25, 0xe9, 0xfa, 0x88, \n  0x72, 0xfc, 0x1a, 0x3f, 0xf5, 0x58, 0x11, 0x07, 0x52, 0x42, 0x06, 0xb8, 0x38, 0xfc, 0xa1, 0x44, \n  0xfb, 0xca, 0x01, 0x00, 0x6b, 0xdd, 0xff, 0x72, 0x30, 0xff, 0x2d, 0x29, 0x03, 0x4f, 0x32, 0xfb, \n  0x78, 0xe9, 0xff, 0x8f, 0x16, 0x00, 0x2e, 0xb6, 0xfd, 0xc9, 0x28, 0x00, 0x79, 0x54, 0xff, 0x0f, \n  0x2d, 0x00, 0xb8, 0xa1, 0xff, 0x1a, 0xb9, 0xfe, 0x89, 0x23, 0xfe, 0xb7, 0xac, 0x01, 0x99, 0x15, \n  0x00, 0x4b, 0x0a, 0x00, 0x64, 0xac, 0x00, 0x8c, 0xb1, 0xfe, 0x94, 0xa8, 0xff, 0x33, 0xf6, 0xfe, \n  0x3e, 0x55, 0xff, 0x7c, 0xd2, 0xff, 0xb0, 0xd9, 0x1e, 0xf7, 0x60, 0x19, 0x8b, 0x29, 0xfe, 0x83, \n  0x9e, 0xfc, 0xf5, 0x64, 0xf6, 0xcc, 0xa4, 0x05, 0x76, 0x90, 0x06, 0xc9, 0xa1, 0xfd, 0x0c, 0x15, \n  0xfc, 0xbb, 0x8b, 0xff, 0x13, 0x72, 0xff, 0x69, 0x8d, 0xff, 0x7d, 0xa7, 0x02, 0xa1, 0x41, 0xfc, \n  0x80, 0xe6, 0xff, 0x49, 0x76, 0x00, 0xf5, 0x5e, 0xfe, 0x71, 0x22, 0x00, 0x7b, 0xcd, 0xff, 0x37, \n  0x41, 0x00, 0x8e, 0xc0, 0xff, 0x7d, 0xf7, 0xfe, 0x3f, 0x54, 0xfe, 0x1d, 0x55, 0x01, 0x56, 0x7d, \n  0x00, 0xfb, 0x27, 0x00, 0x2e, 0xb3, 0x00, 0xca, 0x0d, 0xff, 0xb7, 0x99, 0xff, 0x11, 0x37, 0xff, \n  0x96, 0x43, 0xff, 0x6b, 0xbf, 0xff, 0x28, 0xce, 0x1a, 0xea, 0x6d, 0x18, 0xa5, 0x3c, 0x00, 0x55, \n  0xd4, 0xfc, 0xd5, 0x9c, 0xf7, 0x0e, 0xa3, 0x04, 0x44, 0x83, 0x06, 0x29, 0xcd, 0xfe, 0x28, 0xea, \n  0xfc, 0xb5, 0x36, 0xff, 0x42, 0x70, 0xff, 0x03, 0xcd, 0xff, 0xc5, 0x30, 0x02, 0xef, 0x2c, 0xfd, \n  0xfc, 0x23, 0x00, 0x60, 0xb7, 0x00, 0x80, 0xe5, 0xfe, 0xbc, 0x34, 0x00, 0xda, 0x2f, 0x00, 0x3c, \n  0x6f, 0x00, 0x60, 0xd5, 0xff, 0xfb, 0x60, 0xff, 0xda, 0xaf, 0xfe, 0x89, 0x0d, 0x01, 0xc3, 0xa5, \n  0x00, 0x54, 0x2a, 0x00, 0x7d, 0x9a, 0x00, 0x7a, 0x54, 0xff, 0xf8, 0x97, 0xff, 0x5c, 0x53, 0xff, \n  0x79, 0x6a, 0xff, 0x99, 0xbd, 0xff, 0xce, 0xc7, 0x17, 0xfa, 0x8a, 0x17, 0x33, 0x5b, 0x01, 0x23, \n  0xc6, 0xfc, 0xa4, 0xc9, 0xf8, 0x05, 0xe5, 0x03, 0xf9, 0x25, 0x06, 0x1e, 0xa5, 0xff, 0x77, 0x8f, \n  0xfd, 0x98, 0x1c, 0xff, 0xef, 0x83, 0xff, 0x09, 0xd3, 0xff, 0x0e, 0xcd, 0x01, 0x1d, 0xf9, 0xfd, \n  0x19, 0x56, 0x00, 0xea, 0xbf, 0x00, 0x10, 0x4b, 0xff, 0x38, 0x42, 0x00, 0x20, 0x60, 0x00, 0x5c, \n  0x9d, 0x00, 0x5c, 0xf0, 0xff, 0xbe, 0xad, 0xff, 0x68, 0xdd, 0xfe, 0x72, 0x95, 0x00, 0x1f, 0x9a, \n  0x00, 0xa2, 0x1e, 0x00, 0x82, 0x47, 0x00, 0xdf, 0x76, 0xff, 0x4c, 0x9e, 0xff, 0x9f, 0x79, 0xff, \n  0x97, 0x6b, 0xff, 0xf1, 0x67, 0xff, 0xe7, 0x95, 0x15, 0xcd, 0xb3, 0x16, 0x6c, 0xeb, 0x01, 0xf6, \n  0xbb, 0xfc, 0x1e, 0xf1, 0xf9, 0x60, 0x59, 0x03, 0x8e, 0xb4, 0x05, 0x3f, 0x5c, 0x00, 0x50, 0x16, \n  0xfe, 0x73, 0x3d, 0xff, 0x9d, 0x9f, 0xff, 0x68, 0xdd, 0xff, 0x05, 0xb3, 0x01, 0xe4, 0x89, 0xfe, \n  0xb3, 0x83, 0x00, 0x8f, 0xcc, 0x00, 0xa4, 0x98, 0xff, 0x3f, 0x4f, 0x00, 0x87, 0x96, 0x00, 0x12, \n  0xbe, 0x00, 0xe5, 0xe1, 0xff, 0x92, 0xd6, 0xff, 0x01, 0xf6, 0xfe, 0x8e, 0x1c, 0x00, 0x5e, 0x79, \n  0x00, 0xd9, 0x0a, 0x00, 0x6a, 0x0a, 0x00, 0x44, 0xb5, 0xff, 0x21, 0xac, 0xff, 0xa9, 0x6b, 0xff, \n  0x97, 0x63, 0xff, 0x13, 0x7a, 0xff, 0x78, 0xed, 0x13, 0xde, 0x2d, 0x16, 0x2a, 0x2c, 0x02, 0x45, \n  0xb5, 0xfc, 0xe8, 0xee, 0xfa, 0xf0, 0xf4, 0x02, 0x7e, 0x5f, 0x05, 0xd5, 0x01, 0x01, 0x5d, 0x70, \n  0xfe, 0x5c, 0x86, 0xff, 0x9e, 0x00, 0x00, 0xf1, 0xc6, 0xff, 0xcd, 0xd0, 0x01, 0x70, 0xf7, 0xfe, \n  0x35, 0x92, 0x00, 0xaf, 0xf3, 0x00, 0xd3, 0xd7, 0xff, 0x00, 0x55, 0x00, 0x91, 0x91, 0x00, 0xb9, \n  0xe1, 0x00, 0xee, 0xc6, 0xff, 0xf4, 0xcf, 0xff, 0x3e, 0x21, 0xff, 0x86, 0xae, 0xff, 0x38, 0x55, \n  0x00, 0x2e, 0x41, 0x00, 0x34, 0xe9, 0xff, 0xc8, 0xd1, 0xff, 0x65, 0xb0, 0xff, 0xf9, 0x91, 0xff, \n  0xc7, 0x7a, 0xff, 0x7d, 0x2f, 0xff, 0xe8, 0xeb, 0x12, 0xa6, 0xc0, 0x15, 0xe0, 0x2c, 0x02, 0x86, \n  0x98, 0xfc, 0xa5, 0xd3, 0xfb, 0x96, 0xd1, 0x02, 0x3f, 0x0b, 0x05, 0x7c, 0x71, 0x01, 0xb7, 0x9e, \n  0xfe, 0xf1, 0xc5, 0xff, 0xe0, 0xa1, 0x00, 0xdd, 0x88, 0xff, 0x18, 0xcc, 0x01, 0xdd, 0x76, 0xff, \n  0x2c, 0x61, 0x00, 0x05, 0x15, 0x01, 0x0e, 0xf2, 0xff, 0xd2, 0x15, 0x00, 0xbf, 0x83, 0x00, 0x1e, \n  0xec, 0x00, 0xc6, 0xb7, 0xff, 0x72, 0x8e, 0xff, 0x30, 0x3b, 0xff, 0xbc, 0xa5, 0xff, 0xe7, 0x1b, \n  0x00, 0x9b, 0x63, 0x00, 0x9c, 0xd5, 0xff, 0x82, 0xc9, 0xff, 0xba, 0xf6, 0xff, 0x1b, 0x66, 0xff, \n  0xe6, 0xa2, 0xff, 0xe1, 0x25, 0x00, 0xd4, 0xed, 0x11, 0x8c, 0xbd, 0x15, 0x6b, 0x52, 0x02, 0xc0, \n  0x8f, 0xfc, 0x43, 0x9e, 0xfc, 0x14, 0xc9, 0x02, 0xf9, 0xc9, 0x04, 0x55, 0x8f, 0x01, 0x29, 0xec, \n  0xfe, 0x8a, 0xab, 0xff, 0x2c, 0x4b, 0x01, 0x1d, 0xb7, 0xff, 0x99, 0x2f, 0x01, 0x3e, 0x15, 0x00, \n  0x53, 0x55, 0x00, 0x2f, 0x98, 0x00, 0x9e, 0x2e, 0x00, 0x53, 0x04, 0x00, 0x1d, 0x32, 0x00, 0x86, \n  0xe6, 0x00, 0xfc, 0xdc, 0xff, 0x31, 0x5b, 0xff, 0x6c, 0x27, 0xff, 0x8d, 0xff, 0xff, 0x8a, 0xd2, \n  0xff, 0x98, 0x32, 0x00, 0x49, 0x26, 0x00, 0xf2, 0xc9, 0xff, 0x65, 0xc0, 0xff, 0x6c, 0x21, 0x00, \n  0x0e, 0x3b, 0x00, 0x30, 0x72, 0xff, 0xa4, 0x89, 0x11, 0x32, 0x87, 0x15, 0xae, 0x85, 0x02, 0x25, \n  0x97, 0xfc, 0x72, 0x4b, 0xfd, 0x20, 0xf6, 0x02, 0x68, 0x8c, 0x04, 0x69, 0x69, 0x01, 0x6f, 0xd8, \n  0xfe, 0x4e, 0xd4, 0xff, 0x8f, 0x46, 0x01, 0x6a, 0x20, 0x00, 0x82, 0x0c, 0x01, 0x5a, 0xbe, 0xff, \n  0x32, 0xba, 0x00, 0xfc, 0x46, 0x00, 0xde, 0xc1, 0xff, 0x2d, 0x4f, 0x00, 0x9c, 0x18, 0x00, 0x5b, \n  0x7f, 0x00, 0x6d, 0xf2, 0xff, 0x86, 0xb9, 0xff, 0xc8, 0xf4, 0xfe, 0xb1, 0xc5, 0xff, 0xbe, 0xf9, \n  0xff, 0x05, 0x26, 0x00, 0x52, 0x01, 0x00, 0xbb, 0xa9, 0xff, 0x61, 0xa8, 0x00, 0x6d, 0x6a, 0x00, \n  0xcd, 0x82, 0xff, 0xcf, 0x9c, 0xff, 0xfa, 0x40, 0x11, 0xe5, 0xc0, 0x15, 0x85, 0xa8, 0x02, 0xdb, \n  0x8e, 0xfc, 0xe5, 0xd2, 0xfd, 0x95, 0x20, 0x03, 0x8f, 0x60, 0x04, 0xb1, 0x39, 0x01, 0x8e, 0x83, \n  0xfe, 0xbf, 0x9c, 0xff, 0x85, 0x5a, 0x01, 0xf1, 0xe1, 0xff, 0x1e, 0x38, 0x01, 0xa5, 0xe2, 0xff, \n  0x13, 0x39, 0x00, 0x74, 0x87, 0x00, 0x40, 0x8d, 0xff, 0xe0, 0xcb, 0xff, 0x79, 0x69, 0x00, 0x72, \n  0x62, 0x00, 0xba, 0x9b, 0xff, 0xa4, 0xf2, 0xff, 0x98, 0x3b, 0xff, 0x41, 0x3a, 0xff, 0x71, 0xd7, \n  0xff, 0xa9, 0x70, 0x00, 0x71, 0x71, 0xff, 0xce, 0x3d, 0x00, 0x1d, 0x36, 0x01, 0xf6, 0x9d, 0xff, \n  0x52, 0xbd, 0xff, 0x39, 0x8a, 0xff, 0x7d, 0x73, 0x11, 0x5f, 0x3c, 0x16, 0xfe, 0x98, 0x02, 0x04, \n  0x4f, 0xfc, 0x84, 0x55, 0xfe, 0x73, 0x9c, 0x03, 0x1f, 0x73, 0x04, 0x5f, 0xfe, 0x00, 0x83, 0x53, \n  0xfe, 0x5a, 0x3b, 0xff, 0xfd, 0x24, 0x01, 0xba, 0xea, 0xff, 0x37, 0xeb, 0x00, 0x7f, 0x29, 0x00, \n  0x45, 0x9f, 0x00, 0x7d, 0x39, 0x00, 0x99, 0x8c, 0xff, 0x48, 0x06, 0x00, 0xbc, 0xf3, 0xff, 0x29, \n  0x80, 0x00, 0x6c, 0xf3, 0xff, 0x2c, 0xb9, 0xff, 0x8b, 0x3b, 0xff, 0xe9, 0x73, 0xff, 0xf6, 0xed, \n  0xff, 0x22, 0xc8, 0xff, 0x5a, 0xd8, 0xff, 0x44, 0x2c, 0x01, 0xf5, 0x51, 0x00, 0x8c, 0xa5, 0xff, \n  0x50, 0x44, 0x00, 0xb2, 0x21, 0xff, 0xe7, 0xd5, 0x11, 0x84, 0xfd, 0x16, 0x0f, 0x7f, 0x02, 0x77, \n  0x8b, 0xfb, 0x7e, 0x98, 0xfe, 0x81, 0x0e, 0x04, 0xef, 0xa3, 0x04, 0xfd, 0xf0, 0x00, 0xf4, 0xb7, \n  0xfd, 0xe6, 0xe4, 0xfe, 0x10, 0x06, 0x01, 0xdc, 0x5a, 0xff, 0x37, 0x92, 0x00, 0x73, 0x28, 0x00, \n  0xe9, 0x8a, 0x00, 0x71, 0x8e, 0x00, 0xf1, 0x7d, 0xff, 0x4b, 0xaa, 0xff, 0x52, 0x31, 0x00, 0x77, \n  0x2c, 0x00, 0xa9, 0x99, 0xff, 0xeb, 0x0f, 0x00, 0xa5, 0xf8, 0xfe, 0xde, 0x61, 0xff, 0xb6, 0x18, \n  0x00, 0x45, 0x70, 0xff, 0x3d, 0x17, 0x00, 0x70, 0x26, 0x01, 0x09, 0xcb, 0xff, 0x14, 0xd4, 0xff, \n  0xb0, 0x02, 0x00, 0x57, 0x2c, 0xff, 0x5d, 0x45, 0x12, 0xb4, 0x22, 0x18, 0x14, 0x89, 0x02, 0x60, \n  0xb8, 0xfa, 0x32, 0xad, 0xfe, 0x91, 0x76, 0x04, 0xcc, 0xe7, 0x04, 0x77, 0xff, 0x00, 0xe4, 0x63, \n  0xfd, 0x73, 0x71, 0xfe, 0xbf, 0x0b, 0x01, 0x19, 0x2f, 0xff, 0x2b, 0xf6, 0xff, 0xb1, 0xe2, 0xff, \n  0xe0, 0xa2, 0x00, 0x06, 0x75, 0x00, 0x89, 0x89, 0xff, 0x48, 0x09, 0x00, 0xd8, 0x09, 0x00, 0x5a, \n  0x22, 0x00, 0x0d, 0x99, 0xff, 0x27, 0xab, 0xff, 0x53, 0xdb, 0xfe, 0xe4, 0xb9, 0xff, 0x1c, 0x1f, \n  0x00, 0x83, 0x42, 0xff, 0x95, 0x71, 0x00, 0x61, 0x13, 0x01, 0x79, 0x42, 0xff, 0x1d, 0xce, 0xff, \n  0x89, 0x02, 0x00, 0xfc, 0x2d, 0xff, 0xc9, 0xf0, 0x12, 0xe2, 0x8f, 0x19, 0x45, 0x80, 0x02, 0x05, \n  0xa4, 0xf9, 0x4f, 0xda, 0xfe, 0xb1, 0xe5, 0x04, 0xcb, 0x24, 0x05, 0x3f, 0x13, 0x01, 0x00, 0xe9, \n  0xfc, 0x7b, 0x64, 0xfe, 0x0a, 0x2c, 0x01, 0x34, 0xea, 0xfe, 0x30, 0xa0, 0xff, 0xd0, 0xad, 0xff, \n  0x37, 0x5f, 0x00, 0x5c, 0x54, 0x00, 0xcc, 0x69, 0xff, 0x18, 0xf1, 0xff, 0x3e, 0x6e, 0x00, 0xf8, \n  0x4d, 0x00, 0x48, 0x5a, 0xff, 0x50, 0xad, 0xff, 0x49, 0xb2, 0xfe, 0x79, 0x71, 0xff, 0x78, 0x74, \n  0x00, 0x83, 0x84, 0xff, 0x2d, 0x45, 0x00, 0x60, 0x3c, 0x01, 0x57, 0x31, 0xff, 0x6e, 0x80, 0xff, \n  0x37, 0xbb, 0xff, 0xf0, 0x43, 0xff, 0x55, 0x14, 0x14, 0x51, 0xf3, 0x1a, 0x24, 0x2d, 0x02, 0x36, \n  0x95, 0xf8, 0x6f, 0xff, 0xfe, 0x7f, 0x77, 0x05, 0x29, 0x31, 0x05, 0x54, 0xda, 0x00, 0xa8, 0x58, \n  0xfc, 0x41, 0x58, 0xfe, 0x78, 0x97, 0x01, 0xcc, 0xb7, 0xfe, 0x59, 0x33, 0xff, 0x15, 0x58, 0xff, \n  0x89, 0x5e, 0x00, 0x91, 0x14, 0x00, 0x2f, 0xec, 0xfe, 0xf0, 0xd2, 0xff, 0x04, 0x6f, 0x00, 0x37, \n  0x50, 0x00, 0x3e, 0x74, 0xff, 0x49, 0xb2, 0xff, 0xfc, 0x88, 0xfe, 0x43, 0x6c, 0xff, 0xcb, 0x6b, \n  0x00, 0xe2, 0x67, 0xff, 0xf9, 0x21, 0x00, 0xd9, 0x8f, 0x01, 0x32, 0x5d, 0xff, 0x4c, 0xf0, 0xfe, \n  0x3c, 0xaa, 0xff, 0x8e, 0x2d, 0xff, 0xaa, 0x75, 0x15, 0x58, 0x87, 0x1c, 0x98, 0x8c, 0x01, 0x18, \n  0x59, 0xf7, 0xa7, 0x35, 0xff, 0x6c, 0x0e, 0x06, 0x4c, 0x2d, 0x05, 0xcb, 0x63, 0x00, 0x77, 0xae, \n  0xfb, 0x4c, 0x35, 0xfe, 0x37, 0x12, 0x02, 0xc7, 0x8e, 0xfe, 0xff, 0xb0, 0xfe, 0xed, 0x1d, 0xff, \n  0x2b, 0x25, 0x00, 0xf1, 0xcd, 0xff, 0x2e, 0xa2, 0xfe, 0x5b, 0x62, 0xff, 0x1a, 0x3a, 0x00, 0x3d, \n  0x2a, 0x00, 0xe9, 0x27, 0xff, 0x4c, 0xd1, 0xff, 0x4b, 0xb6, 0xfe, 0x04, 0x4f, 0xff, 0xd3, 0x68, \n  0x00, 0xaa, 0x92, 0xff, 0x8a, 0x44, 0xff, 0x4b, 0x69, 0x01, 0x87, 0x51, 0x00, 0xe1, 0x7b, 0xfe, \n  0x2e, 0x37, 0xff, 0xf4, 0x3c, 0xff, 0x8c, 0x76, 0x17, 0xc4, 0x4e, 0x1e, 0x2f, 0xa4, 0x00, 0x3a, \n  0x32, 0xf6, 0x9e, 0xa5, 0xff, 0x92, 0xf6, 0x06, 0x70, 0x23, 0x05, 0xfc, 0xd5, 0xff, 0xbc, 0xfe, \n  0xfa, 0xa4, 0x70, 0xfe, 0x73, 0xb7, 0x02, 0x4f, 0x90, 0xfe, 0xad, 0x49, 0xfe, 0xb2, 0xf5, 0xfe, \n  0xb4, 0x57, 0x00, 0x41, 0x94, 0xff, 0x5c, 0x49, 0xfe, 0x38, 0x74, 0xff, 0x6d, 0x1a, 0x00, 0x7f, \n  0xd2, 0xff, 0x0f, 0x12, 0xff, 0xee, 0xaa, 0xff, 0x20, 0x1c, 0xff, 0x98, 0xb4, 0xff, 0x88, 0x4d, \n  0x00, 0x32, 0xf4, 0xff, 0xd7, 0xf5, 0xfe, 0x18, 0xa6, 0x00, 0x4a, 0x03, 0x01, 0xf8, 0xf8, 0xfe, \n  0x5f, 0xbb, 0xfe, 0x9c, 0x64, 0xff, 0x22, 0xb5, 0x19, 0xdc, 0xf0, 0x1f, 0xeb, 0x96, 0xff, 0xea, \n  0x14, 0xf5, 0xe6, 0xfb, 0xff, 0x26, 0xde, 0x07, 0x36, 0xea, 0x04, 0xea, 0x19, 0xff, 0x20, 0x15, \n  0xfa, 0x1e, 0xb3, 0xfe, 0x2c, 0x56, 0x03, 0x14, 0x84, 0xfe, 0xc6, 0xcc, 0xfd, 0x00, 0xa7, 0xfe, \n  0xf9, 0x69, 0x00, 0x29, 0x77, 0xff, 0x0f, 0xdd, 0xfd, 0x54, 0x42, 0xff, 0x01, 0x3b, 0x00, 0xc6, \n  0x3f, 0xff, 0xe4, 0xe2, 0xfe, 0x58, 0x76, 0xff, 0xdd, 0x0f, 0xff, 0x49, 0x5e, 0x00, 0xac, 0x33, \n  0x00, 0x21, 0xfb, 0xff, 0x4d, 0x16, 0xff, 0xe1, 0xb8, 0xff, 0x3e, 0xfc, 0x00, 0x65, 0xdd, 0xff, \n  0xc8, 0x43, 0xfe, 0xad, 0x38, 0xff, 0x34, 0xf2, 0x1b, 0xe0, 0xe8, 0x21, 0x9c, 0x95, 0xfe, 0x7f, \n  0x03, 0xf4, 0x39, 0x3a, 0x00, 0xa0, 0xd4, 0x08, 0xb1, 0xc3, 0x04, 0x7d, 0x51, 0xfe, 0x48, 0x57, \n  0xf9, 0x68, 0xca, 0xfe, 0x54, 0x28, 0x04, 0x98, 0x6e, 0xfe, 0x60, 0x71, 0xfd, 0xa5, 0x69, 0xfe, \n  0x8d, 0x69, 0x00, 0x4f, 0x5d, 0xff, 0x54, 0xac, 0xfd, 0xce, 0x05, 0xff, 0x62, 0x67, 0x00, 0x47, \n  0xef, 0xfe, 0xe1, 0x89, 0xfe, 0x0e, 0x8a, 0xff, 0x79, 0xd9, 0xfe, 0x03, 0xee, 0x00, 0xe6, 0x65, \n  0x00, 0x12, 0xde, 0xff, 0x31, 0x42, 0xff, 0x40, 0x53, 0xff, 0xf7, 0x3a, 0x00, 0xc3, 0xd1, 0x00, \n  0x19, 0xa3, 0xfe, 0x2b, 0x75, 0xfe, 0x42, 0xb0, 0x1d, 0x6a, 0x1a, 0x24, 0x48, 0x06, 0xfe, 0xd9, \n  0x3a, 0xf3, 0xc6, 0x21, 0x00, 0x7c, 0x9a, 0x09, 0x1b, 0xd2, 0x04, 0xb7, 0x85, 0xfd, 0x22, 0xed, \n  0xf8, 0x49, 0x96, 0xfe, 0xe9, 0xf3, 0x04, 0x69, 0x5d, 0xfe, 0x38, 0x22, 0xfd, 0xa9, 0x41, 0xfe, \n  0xfd, 0x66, 0x00, 0x08, 0x3b, 0xff, 0x98, 0x7d, 0xfd, 0x44, 0xe8, 0xfe, 0xba, 0x5c, 0x00, 0x6d, \n  0xfe, 0xfe, 0x57, 0x1f, 0xfe, 0x57, 0xba, 0xff, 0x12, 0xa5, 0xfe, 0x97, 0x49, 0x01, 0x7e, 0xbc, \n  0x00, 0x4b, 0xc3, 0xff, 0x26, 0x51, 0xff, 0xc2, 0x34, 0xff, 0xba, 0x83, 0xff, 0x41, 0xf7, 0x00, \n  0x19, 0xdb, 0xff, 0x74, 0xdb, 0xfd, 0x94, 0xba, 0x1f, 0xc0, 0x0e, 0x26, 0xae, 0x41, 0xfd, 0xef, \n  0xc1, 0xf2, 0x17, 0xcf, 0xff, 0xf5, 0x21, 0x0a, 0x5c, 0xc6, 0x04, 0x7a, 0xc3, 0xfc, 0xed, 0x81, \n  0xf8, 0x2f, 0x6e, 0xfe, 0x29, 0x7d, 0x05, 0x13, 0x44, 0xfe, 0xb8, 0xbb, 0xfc, 0xf1, 0x26, 0xfe, \n  0x1c, 0x57, 0x00, 0x8e, 0x17, 0xff, 0x3c, 0x41, 0xfd, 0xca, 0xba, 0xfe, 0xf6, 0x39, 0x00, 0xdf, \n  0x0a, 0xff, 0x4a, 0xdf, 0xfd, 0xa4, 0xde, 0xff, 0x96, 0x9c, 0xfe, 0x8a, 0x43, 0x01, 0xb4, 0x12, \n  0x01, 0x7e, 0xb5, 0xff, 0x17, 0x37, 0xff, 0x6e, 0x0a, 0xff, 0xf3, 0x10, 0xff, 0x6d, 0x72, 0x00, \n  0x60, 0xf9, 0x00, 0xf5, 0x21, 0xfe, 0xed, 0x54, 0x22, 0x06, 0x44, 0x27, 0xc3, 0x4a, 0xfc, 0x5d, \n  0xcf, 0xf2, 0x59, 0x7d, 0xff, 0x0d, 0x48, 0x0a, 0xc8, 0xa1, 0x04, 0x18, 0x35, 0xfc, 0xd4, 0x29, \n  0xf8, 0x91, 0x5c, 0xfe, 0x19, 0xc4, 0x05, 0x1f, 0x1b, 0xfe, 0x12, 0x6c, 0xfc, 0xa6, 0x07, 0xfe, \n  0x57, 0x4d, 0x00, 0x1c, 0xea, 0xfe, 0xd3, 0x1e, 0xfd, 0xb3, 0x7d, 0xfe, 0x75, 0x0a, 0x00, 0xef, \n  0x0f, 0xff, 0x42, 0xe9, 0xfd, 0xb3, 0xd7, 0xff, 0x86, 0xde, 0xfe, 0xac, 0x28, 0x01, 0x81, 0x1d, \n  0x01, 0xc5, 0xc6, 0xff, 0x39, 0x28, 0xff, 0xc0, 0xba, 0xfe, 0x98, 0xd4, 0xfe, 0xc5, 0xf5, 0xff, \n  0x79, 0x40, 0x01, 0xaf, 0x30, 0xff, 0xe4, 0xe0, 0x24, 0xe3, 0x92, 0x28, 0xfd, 0x00, 0xfb, 0x12, \n  0x3f, 0xf3, 0x76, 0x3d, 0xff, 0xd2, 0xe6, 0x09, 0x5b, 0x8b, 0x04, 0xfb, 0xdb, 0xfb, 0xb7, 0xf4, \n  0xf7, 0x36, 0x20, 0xfe, 0x2e, 0xf7, 0x05, 0x4f, 0xed, 0xfd, 0xbe, 0x4a, 0xfc, 0x07, 0xee, 0xfd, \n  0x4e, 0x25, 0x00, 0xe5, 0xda, 0xfe, 0x5b, 0x05, 0xfd, 0xd4, 0x3d, 0xfe, 0xff, 0xdd, 0xff, 0x1f, \n  0x2e, 0xff, 0xc1, 0x15, 0xfe, 0xed, 0xbe, 0xff, 0x2a, 0x36, 0xff, 0x95, 0x1d, 0x01, 0xb1, 0xe6, \n  0x00, 0x19, 0xe6, 0xff, 0xe9, 0x2a, 0xff, 0x6e, 0x61, 0xfe, 0xbe, 0x9f, 0xfe, 0xf9, 0xce, 0xff, \n  0x8a, 0xca, 0x00, 0x0d, 0x44, 0x00, 0x22, 0x66, 0x27, 0x0a, 0xfd, 0x29, 0x76, 0xc4, 0xf8, 0x81, \n  0xfc, 0xf3, 0xfb, 0x33, 0xff, 0xf4, 0xfd, 0x08, 0x58, 0x8e, 0x04, 0x06, 0x93, 0xfb, 0xb1, 0xc2, \n  0xf7, 0xae, 0xa5, 0xfd, 0xe8, 0x0a, 0x06, 0x39, 0xa2, 0xfd, 0x19, 0x7a, 0xfc, 0x95, 0xac, 0xfd, \n  0x15, 0xed, 0xff, 0x43, 0xc9, 0xfe, 0x22, 0xdb, 0xfc, 0xf7, 0x10, 0xfe, 0x29, 0x90, 0xff, 0xc2, \n  0x83, 0xff, 0x67, 0x17, 0xfe, 0x50, 0xb5, 0xff, 0xc6, 0x6c, 0xff, 0x1f, 0xfd, 0x00, 0x9c, 0x81, \n  0x00, 0xb8, 0x17, 0x00, 0xec, 0x03, 0xff, 0xb6, 0x26, 0xfe, 0xa2, 0x81, 0xfe, 0x74, 0xa6, 0xff, \n  0xb7, 0x21, 0x00, 0x04, 0xd1, 0x00, 0x31, 0x4e, 0x2b, 0x9c, 0x7e, 0x2a, 0xfe, 0x2b, 0xf5, 0x16, \n  0x6b, 0xf5, 0x48, 0x88, 0xff, 0x13, 0xfe, 0x07, 0xe4, 0x58, 0x04, 0xe8, 0x35, 0xfb, 0xa6, 0x74, \n  0xf7, 0xb5, 0x71, 0xfd, 0x74, 0x1b, 0x06, 0xa3, 0x30, 0xfd, 0xd2, 0x31, 0xfd, 0xb0, 0x37, 0xfd, \n  0x27, 0xf7, 0xff, 0xc7, 0x88, 0xfe, 0xd8, 0xae, 0xfc, 0x0d, 0x1b, 0xfe, 0x37, 0x70, 0xff, 0x1b, \n  0xd8, 0xff, 0x1d, 0xf7, 0xfd, 0xe4, 0x05, 0x00, 0xc6, 0x31, 0xff, 0x9f, 0xf2, 0x00, 0x4a, 0x40, \n  0x00, 0xa0, 0x2b, 0x00, 0x40, 0xd0, 0xfe, 0x8d, 0x35, 0xfe, 0x9f, 0x9e, 0xfe, 0xab, 0x1f, 0xff, \n  0x6a, 0xdc, 0xff, 0xd6, 0x01, 0x01, 0xfa, 0x5f, 0x30, 0x76, 0xcc, 0x29, 0x8f, 0xa0, 0xf0, 0x2a, \n  0x7f, 0xf7, 0x0e, 0xab, 0xff, 0x78, 0x63, 0x07, 0xd7, 0xaa, 0x03, 0xcd, 0xd1, 0xfa, 0x2d, 0xf3, \n  0xf6, 0x53, 0x99, 0xfd, 0xbf, 0x3b, 0x06, 0x09, 0xb5, 0xfc, 0x3b, 0x20, 0xfe, 0x70, 0xc0, 0xfc, \n  0xf5, 0x19, 0x00, 0x53, 0x15, 0xfe, 0x0c, 0xa4, 0xfc, 0x25, 0x6e, 0xfe, 0x2d, 0x67, 0xff, 0x91, \n  0xd4, 0xff, 0x3f, 0x24, 0xfe, 0xf7, 0x10, 0x00, 0x5a, 0x97, 0xfe, 0x0a, 0x67, 0x01, 0x00, 0xdc, \n  0xff, 0xc0, 0x18, 0x00, 0xec, 0xfe, 0xfe, 0x9c, 0x53, 0xfe, 0x40, 0x78, 0xfe, 0xd6, 0xba, 0xfe, \n  0x90, 0x0a, 0x00, 0xe9, 0x99, 0x00, 0xa4, 0x4c, 0x35, 0x18, 0x76, 0x28, 0xe1, 0x3b, 0xec, 0x94, \n  0xae, 0xf9, 0x06, 0x8d, 0xff, 0x18, 0x18, 0x07, 0x87, 0xa0, 0x02, 0x88, 0x5b, 0xfa, 0x11, 0x5c, \n  0xf6, 0x90, 0xfa, 0xfd, 0xb2, 0x8c, 0x06, 0x07, 0x1d, 0xfc, 0x05, 0x3d, 0xff, 0x40, 0x4f, 0xfc, \n  0xf6, 0x10, 0x00, 0xd4, 0xa4, 0xfd, 0xe2, 0xf4, 0xfc, 0xe8, 0xe3, 0xfe, 0x53, 0xcc, 0xfe, 0xd9, \n  0x2f, 0x00, 0x3d, 0x08, 0xfe, 0x01, 0x6a, 0xff, 0x7b, 0xb8, 0xfe, 0xa5, 0xa0, 0x01, 0x5c, 0x51, \n  0xff, 0x92, 0x8b, 0x00, 0xa5, 0x3b, 0xff, 0x38, 0xdc, 0xfd, 0xbc, 0x8f, 0xfe, 0x44, 0xde, 0xfe, \n  0xc1, 0x9b, 0xff, 0x9b, 0x1d, 0x00, 0x43, 0xd5, 0x39, 0x56, 0xb4, 0x26, 0x41, 0x5d, 0xe8, 0x70, \n  0xe1, 0xfb, 0x3e, 0x2f, 0xff, 0x96, 0xf7, 0x06, 0xee, 0x8f, 0x01, 0x3e, 0xc3, 0xf9, 0x24, 0x0f, \n  0xf6, 0x3f, 0xe8, 0xfe, 0xa7, 0x9a, 0x06, 0x72, 0xaf, 0xfb, 0xf9, 0xaa, 0x00, 0xaa, 0x8f, 0xfb, \n  0x97, 0x14, 0x00, 0x4f, 0xcb, 0xfd, 0xff, 0x68, 0xfd, 0x08, 0xd0, 0xfe, 0xc3, 0x9a, 0xfe, 0xfb, \n  0x33, 0x00, 0x3d, 0x61, 0xfd, 0x6a, 0x98, 0xff, 0x6a, 0x8d, 0xfe, 0x81, 0xd4, 0x01, 0x07, 0x98, \n  0xff, 0xe4, 0xe1, 0x00, 0xdd, 0xe8, 0xfe, 0x35, 0xc8, 0xfd, 0x1b, 0x21, 0xff, 0x13, 0x65, 0xfe, \n  0x83, 0x22, 0xff, 0x16, 0x32, 0x00, 0xcc, 0x3c, 0x3d, 0xe0, 0x0c, 0x25, 0x02, 0x50, 0xe5, 0x09, \n  0xf6, 0xfd, 0xae, 0x12, 0xfe, 0xa6, 0x06, 0x07, 0xf3, 0xcb, 0x00, 0xf9, 0xeb, 0xf8, 0x61, 0x76, \n  0xf6, 0xc6, 0xb9, 0xff, 0xb7, 0x5d, 0x06, 0x8f, 0xb8, 0xfb, 0x8c, 0xde, 0x01, 0xab, 0x88, 0xfa, \n  0xe7, 0xc3, 0x00, 0xc3, 0x39, 0xfe, 0xc9, 0x10, 0xfd, 0x61, 0x3f, 0xff, 0xed, 0xaa, 0xfd, 0x69, \n  0x14, 0x00, 0x13, 0x96, 0xfd, 0xf5, 0x12, 0xff, 0x05, 0xae, 0xfe, 0x3b, 0xc3, 0x02, 0x7f, 0x8b, \n  0xff, 0x7b, 0xa9, 0x00, 0x2e, 0x29, 0xff, 0x54, 0xe0, 0xfd, 0x39, 0xfd, 0xfe, 0x9a, 0x13, 0xfe, \n  0x74, 0x0c, 0xff, 0xa8, 0x25, 0x00, 0x40, 0x78, 0x3f, 0xe3, 0xca, 0x22, 0x32, 0x0a, 0xe4, 0x51, \n  0x78, 0xff, 0xf1, 0x25, 0xfc, 0x94, 0x90, 0x07, 0x85, 0x71, 0x00, 0xbd, 0x4f, 0xf8, 0x6d, 0xf4, \n  0xf6, 0xa8, 0x98, 0x00, 0x14, 0xdb, 0x05, 0xa2, 0xf2, 0xfb, 0xb8, 0xb3, 0x02, 0x8d, 0x2d, 0xfa, \n  0x7e, 0x70, 0x01, 0xb3, 0x37, 0xfe, 0x20, 0x11, 0xfd, 0x82, 0x87, 0xfe, 0x58, 0x5e, 0xfd, 0x71, \n  0x6a, 0x00, 0x41, 0x1b, 0xfd, 0x14, 0x33, 0xff, 0xd7, 0x4e, 0xff, 0x7b, 0x15, 0x03, 0xb8, 0x30, \n  0xff, 0xdc, 0x19, 0x01, 0x08, 0x2f, 0xff, 0xff, 0x82, 0xfd, 0x61, 0x14, 0xff, 0xfb, 0xeb, 0xfd, \n  0x30, 0xf4, 0xfe, 0x44, 0x21, 0x00, 0x5d, 0x4a, 0x40, 0xf4, 0x3a, 0x20, 0xed, 0xd5, 0xe4, 0x78, \n  0xe5, 0xff, 0xef, 0x9f, 0xf9, 0x41, 0x9f, 0x08, 0x01, 0xd4, 0x00, 0x39, 0x86, 0xf7, 0xd5, 0x87, \n  0xf7, 0x6e, 0xb6, 0x01, 0x04, 0x9d, 0x04, 0xf3, 0x66, 0xfc, 0xae, 0x25, 0x04, 0x3b, 0x72, 0xf9, \n  0xa2, 0xea, 0x01, 0x27, 0x6d, 0xfe, 0xcb, 0xce, 0xfb, 0x76, 0xec, 0xfe, 0x70, 0x4f, 0xfd, 0xf5, \n  0x0e, 0x00, 0x4a, 0xc0, 0xfd, 0xde, 0x53, 0xff, 0xa6, 0x5b, 0xff, 0x7b, 0x2e, 0x03, 0xa9, 0x7c, \n  0xff, 0x05, 0xfb, 0x00, 0x0d, 0x16, 0xff, 0x7c, 0x59, 0xfd, 0xc9, 0x29, 0xff, 0x83, 0xf1, 0xfd, \n  0x6b, 0xc4, 0xfe, 0xd2, 0x54, 0x00, 0x81, 0xd8, 0x3e, 0x84, 0xa3, 0x1e, 0xec, 0xb9, 0xe6, 0xb0, \n  0x89, 0xff, 0xfd, 0x10, 0xf7, 0xdf, 0x2e, 0x0a, 0x35, 0x79, 0x01, 0x2e, 0xc8, 0xf6, 0xd5, 0x91, \n  0xf8, 0x5c, 0xf1, 0x01, 0x41, 0x54, 0x03, 0x8f, 0xc0, 0xfd, 0xbd, 0xa5, 0x04, 0x46, 0x09, 0xf9, \n  0xdf, 0x17, 0x02, 0x8e, 0xbb, 0xfd, 0x34, 0xcd, 0xfb, 0x7f, 0x23, 0xff, 0x2a, 0x22, 0xfd, 0x6e, \n  0x8a, 0x00, 0xc5, 0x40, 0xfe, 0x38, 0x05, 0xff, 0x0f, 0x44, 0xff, 0xe6, 0x94, 0x03, 0x0b, 0x4c, \n  0xff, 0x82, 0xc9, 0x00, 0xac, 0x1d, 0xff, 0x6e, 0x45, 0xfd, 0xe3, 0x72, 0xff, 0xf9, 0xb5, 0xfd, \n  0x49, 0xdb, 0xfe, 0x08, 0x9e, 0x00, 0xd2, 0x72, 0x3b, 0x76, 0xa2, 0x1d, 0x49, 0xb6, 0xe9, 0xed, \n  0xa0, 0xfe, 0x20, 0x55, 0xf5, 0x00, 0x2d, 0x0b, 0xcb, 0x5f, 0x02, 0x3c, 0xdf, 0xf6, 0x68, 0x08, \n  0xf9, 0xc4, 0xee, 0x01, 0xb0, 0xd9, 0x02, 0xdc, 0x3b, 0xfe, 0x72, 0x29, 0x05, 0x1e, 0xbb, 0xf8, \n  0x93, 0x42, 0x01, 0x35, 0x5f, 0xfe, 0x60, 0x7f, 0xfb, 0xf5, 0x86, 0xff, 0xc9, 0xa3, 0xfd, 0x47, \n  0xbd, 0x00, 0xa5, 0x73, 0xfe, 0x52, 0xca, 0xfe, 0xea, 0x47, 0xff, 0x29, 0x81, 0x03, 0x07, 0x2d, \n  0xff, 0x18, 0x6a, 0x00, 0xc1, 0x9b, 0xff, 0xc9, 0x3a, 0xfd, 0x4d, 0x7b, 0xff, 0x59, 0xcb, 0xfd, \n  0x77, 0x36, 0xff, 0xfb, 0x90, 0x00, 0x86, 0x07, 0x37, 0xdd, 0x12, 0x1c, 0x44, 0x2d, 0xee, 0x56, \n  0x75, 0xfd, 0x96, 0x76, 0xf4, 0xcf, 0x40, 0x0b, 0x71, 0x8a, 0x03, 0x47, 0x57, 0xf7, 0x50, 0x7e, \n  0xf9, 0xf8, 0x5b, 0x02, 0x0d, 0x64, 0x01, 0x63, 0x4f, 0xff, 0x4f, 0xcc, 0x04, 0x76, 0x74, 0xf8, \n  0x9d, 0x3e, 0x01, 0x19, 0x86, 0xfe, 0xea, 0xed, 0xfb, 0xc3, 0xe5, 0xff, 0x00, 0x5c, 0xfe, 0x8e, \n  0x68, 0x00, 0x9e, 0xc7, 0xfe, 0x58, 0xcc, 0xfe, 0x0d, 0x11, 0xff, 0x58, 0x1c, 0x03, 0xf1, 0x10, \n  0xff, 0xd6, 0x88, 0x00, 0xec, 0xd1, 0xff, 0x38, 0x4a, 0xfd, 0x66, 0x9b, 0xff, 0x26, 0x47, 0xfe, \n  0xe7, 0x31, 0xff, 0xa1, 0x88, 0x00, 0x68, 0xfd, 0x30, 0x6f, 0x71, 0x1b, 0xa5, 0x9b, 0xf2, 0x88, \n  0xb1, 0xfc, 0x48, 0x21, 0xf4, 0xd6, 0x90, 0x0a, 0xed, 0x85, 0x04, 0x59, 0x74, 0xf8, 0xe6, 0x71, \n  0xfa, 0x9c, 0x63, 0x01, 0x32, 0xed, 0x00, 0x40, 0x86, 0xff, 0x88, 0xf0, 0x03, 0xa4, 0x4b, 0xf9, \n  0x8b, 0x95, 0x00, 0x47, 0x2d, 0xff, 0x18, 0x61, 0xfc, 0x18, 0x4a, 0x00, 0x16, 0xb3, 0xfe, 0xff, \n  0x05, 0x00, 0x66, 0x58, 0xff, 0x28, 0xc0, 0xfe, 0xdd, 0x83, 0xfe, 0x56, 0x9c, 0x02, 0xb6, 0x6e, \n  0xff, 0x08, 0x51, 0x00, 0xec, 0x08, 0x00, 0x5b, 0x96, 0xfd, 0xe7, 0xdd, 0xff, 0xd8, 0x7b, 0xfe, \n  0x01, 0x4d, 0xff, 0x37, 0x6a, 0x00, 0xcb, 0x28, 0x28, 0x84, 0xa7, 0x1b, 0x34, 0xa8, 0xf5, 0x98, \n  0x17, 0xfd, 0x16, 0x08, 0xfb, 0x5d, 0x99, 0x05, 0x78, 0xfa, 0x00, 0x4c, 0x37, 0xfa, 0xc8, 0xce, \n  0xfa, 0x1a, 0x6f, 0x01, 0xe3, 0x1a, 0x02, 0x9e, 0x87, 0xff, 0x99, 0x11, 0x03, 0xf7, 0x0e, 0xfc, \n  0x3e, 0xc9, 0x00, 0x0a, 0x0a, 0x00, 0x04, 0x81, 0xfd, 0x4e, 0x9d, 0xff, 0xeb, 0x45, 0xff, 0x6e, \n  0x09, 0x00, 0x64, 0xe3, 0xfe, 0x01, 0x32, 0xff, 0x46, 0xee, 0xfe, 0x8f, 0xa3, 0x01, 0x94, 0x51, \n  0xff, 0xcc, 0xec, 0xff, 0x8d, 0x56, 0x00, 0x3d, 0x5f, 0xfe, 0x51, 0x39, 0xff, 0xdf, 0xcd, 0xfe, \n  0x52, 0xed, 0xfe, 0xa2, 0xb4, 0xff, 0x78, 0x27, 0x22, 0xbd, 0xf8, 0x1a, 0xfb, 0x86, 0xf9, 0xcc, \n  0x29, 0xfc, 0x9e, 0x04, 0xfb, 0x05, 0x46, 0x05, 0x6a, 0x2d, 0x02, 0x3e, 0xb3, 0xfb, 0x12, 0x84, \n  0xfb, 0x84, 0x4d, 0x00, 0xc8, 0xcc, 0x01, 0x86, 0xaf, 0xff, 0xa4, 0x84, 0x02, 0x88, 0x08, 0xfd, \n  0xb5, 0x2b, 0x00, 0x95, 0x68, 0x00, 0xe1, 0x43, 0xfe, 0xce, 0x01, 0x00, 0xc9, 0xbd, 0xff, 0x6a, \n  0x16, 0x00, 0x04, 0x56, 0xff, 0xb4, 0x1a, 0xff, 0x58, 0xa0, 0xfe, 0xaf, 0x3b, 0x01, 0xb4, 0x99, \n  0xff, 0x43, 0xd3, 0xff, 0xbe, 0x95, 0x00, 0x12, 0xd8, 0xfe, 0x02, 0x5c, 0xff, 0xdd, 0x00, 0xff, \n  0x67, 0x0c, 0xff, 0x00, 0x8d, 0xff, 0xc4, 0x39, 0x1d, 0x2f, 0x11, 0x1a, 0x52, 0x60, 0xfc, 0x9f, \n  0xb8, 0xfb, 0xf5, 0x6b, 0xfb, 0x3b, 0x91, 0x04, 0xa3, 0xdf, 0x02, 0xd3, 0x3e, 0xfd, 0xc1, 0x0a, \n  0xfc, 0x9a, 0x97, 0xff, 0x6f, 0x95, 0x01, 0xc9, 0xad, 0xff, 0x4c, 0x41, 0x02, 0x18, 0xef, 0xfd, \n  0x00, 0xe6, 0xff, 0x7b, 0xb0, 0x00, 0xad, 0x14, 0xff, 0x1d, 0x0f, 0x00, 0x73, 0x11, 0x00, 0x10, \n  0x6f, 0x00, 0x8b, 0x73, 0xff, 0x9c, 0x45, 0xff, 0x63, 0x95, 0xfe, 0x0a, 0xc1, 0x00, 0x1b, 0xd9, \n  0xff, 0xdd, 0xb8, 0xff, 0x42, 0x7a, 0x00, 0x3d, 0x36, 0xff, 0x3f, 0x75, 0xff, 0xc0, 0x2a, 0xff, \n  0xeb, 0x45, 0xff, 0xa9, 0x4f, 0xff, 0xd6, 0x88, 0x19, 0xf0, 0x2d, 0x19, 0x79, 0x1d, 0xfe, 0x0b, \n  0x76, 0xfb, 0x57, 0xf6, 0xfb, 0xf4, 0xdd, 0x03, 0xb5, 0x32, 0x03, 0x3b, 0x58, 0xfe, 0xd1, 0x91, \n  0xfc, 0x14, 0x3a, 0xff, 0xca, 0x6a, 0x01, 0x13, 0xb8, 0xff, 0x9d, 0xec, 0x01, 0x9b, 0xbf, 0xfe, \n  0x2a, 0xe9, 0xff, 0x8b, 0xb4, 0x00, 0xdf, 0x9c, 0xff, 0x6e, 0x04, 0x00, 0x51, 0x45, 0x00, 0x5c, \n  0xa2, 0x00, 0x7d, 0x8d, 0xff, 0x7a, 0x65, 0xff, 0xfd, 0x8b, 0xfe, 0x60, 0x41, 0x00, 0x64, 0xd1, \n  0xff, 0x8b, 0x84, 0xff, 0xcd, 0x24, 0x00, 0x95, 0x93, 0xff, 0x41, 0x8f, 0xff, 0x65, 0x45, 0xff, \n  0x69, 0x4b, 0xff, 0xed, 0x27, 0xff, 0x20, 0x31, 0x17, 0x5b, 0x60, 0x18, 0x65, 0x23, 0xff, 0xc8, \n  0x5a, 0xfb, 0xbf, 0xa5, 0xfc, 0x28, 0x6f, 0x03, 0xd2, 0x54, 0x03, 0x2b, 0x21, 0xff, 0xb3, 0x11, \n  0xfd, 0x1f, 0x2e, 0xff, 0xe9, 0x5f, 0x01, 0xa7, 0x03, 0x00, 0xd8, 0xbb, 0x01, 0x68, 0x54, 0xff, \n  0x70, 0x47, 0x00, 0x72, 0x94, 0x00, 0x15, 0xda, 0xff, 0x6e, 0x2c, 0x00, 0x83, 0x5e, 0x00, 0x2c, \n  0xa9, 0x00, 0xa6, 0xa5, 0xff, 0x8b, 0x92, 0xff, 0x60, 0x8b, 0xfe, 0x96, 0xcc, 0xff, 0x6a, 0xb8, \n  0xff, 0x15, 0x6d, 0xff, 0x5b, 0x17, 0x00, 0xbb, 0xf7, 0xff, 0xc3, 0x90, 0xff, 0x8d, 0x42, 0xff, \n  0x1b, 0xab, 0xff, 0xed, 0x3f, 0xff, 0x14, 0x94, 0x15, 0x1e, 0xe5, 0x17, 0x4a, 0xcb, 0xff, 0x6f, \n  0x40, 0xfb, 0x55, 0x5d, 0xfd, 0xd1, 0x30, 0x03, 0x86, 0x4e, 0x03, 0xcb, 0xa6, 0xff, 0x49, 0x27, \n  0xfd, 0xc6, 0x38, 0xff, 0xc4, 0x6c, 0x01, 0x0c, 0x2f, 0x00, 0x35, 0xd0, 0x01, 0x30, 0x77, 0xff, \n  0x6b, 0x8a, 0x00, 0x22, 0xbe, 0x00, 0xb2, 0x90, 0xff, 0xe2, 0x19, 0x00, 0x24, 0x85, 0x00, 0x7c, \n  0x7f, 0x00, 0x28, 0x70, 0xff, 0x6f, 0xcf, 0xff, 0x3c, 0x99, 0xfe, 0x74, 0x38, 0xff, 0x07, 0xbb, \n  0xff, 0xcf, 0xa9, 0xff, 0x80, 0xe6, 0xff, 0x54, 0xcd, 0xff, 0xf1, 0xd7, 0xff, 0xb5, 0xa2, 0xff, \n  0x5a, 0x48, 0xff, 0xbe, 0xc3, 0xff, 0xf0, 0xba, 0x14, 0xb1, 0xb8, 0x17, 0x04, 0x19, 0x00, 0x61, \n  0x2e, 0xfb, 0x0a, 0x1c, 0xfe, 0x6d, 0x5a, 0x03, 0x49, 0x04, 0x03, 0xee, 0xe6, 0xff, 0xca, 0x16, \n  0xfd, 0x01, 0xe2, 0xfe, 0x52, 0xb9, 0x01, 0xe6, 0x03, 0x00, 0x63, 0xb2, 0x01, 0xfd, 0xf9, 0xff, \n  0xf4, 0x5c, 0x00, 0x39, 0xcf, 0x00, 0xe6, 0xb5, 0xff, 0x1c, 0x82, 0xff, 0x17, 0x64, 0x00, 0x25, \n  0xc2, 0x00, 0x74, 0x1f, 0xff, 0xf0, 0x6e, 0xff, 0x47, 0xf9, 0xfe, 0xf2, 0x56, 0xff, 0xe6, 0x56, \n  0xff, 0x52, 0xba, 0xff, 0xde, 0xbd, 0xff, 0x1d, 0xc6, 0xff, 0xaa, 0x0e, 0x00, 0x0c, 0x4b, 0xff, \n  0x9d, 0x58, 0x00, 0x2f, 0x7f, 0x00, 0x37, 0xb2, 0x14, 0xb1, 0xf6, 0x17, 0xa6, 0xe2, 0xff, 0x62, \n  0x08, 0xfb, 0x21, 0xd5, 0xfe, 0x29, 0xd9, 0x03, 0x41, 0x04, 0x03, 0x87, 0x7d, 0xff, 0x02, 0x08, \n  0xfd, 0x57, 0xb2, 0xfe, 0x46, 0x60, 0x01, 0x2b, 0x01, 0x00, 0xd0, 0x5d, 0x01, 0xaf, 0x19, 0x00, \n  0x96, 0xce, 0x00, 0x83, 0xac, 0x00, 0xef, 0x98, 0xff, 0x72, 0xb9, 0xff, 0x90, 0x04, 0x00, 0x56, \n  0x56, 0x00, 0x48, 0x59, 0xff, 0x7f, 0x59, 0xff, 0xe8, 0xae, 0xfe, 0x93, 0xa0, 0xff, 0xad, 0xbc, \n  0xff, 0xc1, 0x1e, 0xff, 0xf7, 0x9c, 0xff, 0x91, 0x21, 0x00, 0x80, 0x74, 0xff, 0xd6, 0x28, 0x00, \n  0x83, 0x07, 0x01, 0x3d, 0x4b, 0xff, 0xca, 0xe4, 0x14, 0x2b, 0xd4, 0x18, 0xa1, 0xcc, 0xff, 0xdc, \n  0x85, 0xfa, 0x9f, 0x89, 0xff, 0x91, 0x6e, 0x04, 0x82, 0x28, 0x03, 0x7e, 0x4b, 0xff, 0xf9, 0x83, \n  0xfc, 0xe0, 0x85, 0xfe, 0x11, 0x71, 0x01, 0xad, 0x75, 0xff, 0x7e, 0xee, 0x00, 0xd9, 0x37, 0x00, \n  0xdf, 0xb4, 0x00, 0xec, 0x0f, 0x01, 0xd2, 0xc0, 0xff, 0xf3, 0x9f, 0xff, 0x99, 0x50, 0x00, 0xa6, \n  0x1c, 0x00, 0x40, 0xaf, 0xfe, 0x51, 0x7e, 0xff, 0xdf, 0x0a, 0xff, 0xcc, 0x6c, 0xff, 0xf2, 0x96, \n  0xff, 0x1a, 0x97, 0xff, 0xa4, 0xcd, 0xff, 0x09, 0x2f, 0xff, 0x2c, 0xec, 0xff, 0x00, 0x0a, 0x01, \n  0x39, 0xf5, 0xff, 0x4c, 0x1e, 0xff, 0xe8, 0x05, 0x16, 0x29, 0xd5, 0x19, 0xb0, 0x3d, 0xff, 0xa6, \n  0xe6, 0xf9, 0x20, 0x1d, 0x00, 0x17, 0x21, 0x05, 0x9a, 0x30, 0x03, 0x15, 0x0b, 0xff, 0x06, 0x2a, \n  0xfc, 0xf7, 0x3b, 0xfe, 0x80, 0x86, 0x01, 0xec, 0x48, 0xff, 0x1a, 0x58, 0x00, 0x9e, 0xc7, 0xff, \n  0x1c, 0xc9, 0x00, 0x4d, 0x09, 0x01, 0xed, 0x91, 0xff, 0xbc, 0x12, 0x00, 0x17, 0x9b, 0x00, 0xc9, \n  0xed, 0xff, 0x19, 0x98, 0xfe, 0x98, 0x32, 0xff, 0xa3, 0xa2, 0xfe, 0x6d, 0xca, 0xff, 0x78, 0xd0, \n  0xff, 0xec, 0x67, 0xff, 0xbd, 0xd2, 0xff, 0xd8, 0x60, 0xff, 0x26, 0x19, 0x00, 0xdf, 0x9e, 0x00, \n  0x4c, 0x96, 0xff, 0x54, 0x30, 0xff, 0xca, 0x9d, 0x17, 0xb1, 0x44, 0x1b, 0x00, 0x44, 0xfe, 0x25, \n  0x11, 0xf9, 0xfe, 0xd9, 0x00, 0x61, 0x9e, 0x05, 0x81, 0x08, 0x03, 0x54, 0x9f, 0xfe, 0x24, 0xa6, \n  0xfb, 0x22, 0x43, 0xfe, 0xfe, 0xb7, 0x01, 0x1c, 0x05, 0xff, 0x88, 0xbd, 0xff, 0x55, 0x7b, 0xff, \n  0x4b, 0xaf, 0x00, 0x4c, 0xa8, 0x00, 0xa8, 0x45, 0xff, 0x4e, 0xff, 0xff, 0x04, 0xd3, 0x00, 0x86, \n  0x05, 0x00, 0xb4, 0x8f, 0xfe, 0x8e, 0x18, 0xff, 0x79, 0x6b, 0xfe, 0xff, 0xaf, 0xff, 0x6e, 0x92, \n  0xff, 0x1d, 0xb6, 0xff, 0x59, 0xe3, 0xff, 0xb3, 0x1f, 0xff, 0x15, 0x0f, 0x00, 0xe9, 0xc2, 0x00, \n  0xa6, 0x68, 0xff, 0xa5, 0x82, 0xfe, 0x23, 0xb9, 0x19, 0x53, 0xe4, 0x1c, 0x0f, 0xf3, 0xfc, 0x61, \n  0x58, 0xf8, 0x15, 0xa4, 0x01, 0x3f, 0x1f, 0x06, 0x09, 0x7d, 0x02, 0x13, 0x0e, 0xfe, 0x0f, 0x27, \n  0xfb, 0x2e, 0x7b, 0xfe, 0x79, 0x3f, 0x02, 0x6b, 0x8a, 0xfe, 0x44, 0x52, 0xff, 0x17, 0x14, 0xff, \n  0xef, 0xbd, 0x00, 0xfa, 0x80, 0x00, 0x5a, 0x92, 0xfe, 0x16, 0xda, 0xff, 0xb9, 0xc9, 0x00, 0x51, \n  0xc4, 0xff, 0x8c, 0x94, 0xfe, 0xf3, 0x57, 0xff, 0x91, 0x50, 0xfe, 0xb9, 0xfe, 0xff, 0x64, 0x65, \n  0xff, 0x55, 0x31, 0xff, 0xd3, 0xfe, 0xff, 0xf9, 0x5d, 0xff, 0x58, 0x90, 0xff, 0x51, 0x71, 0x00, \n  0x54, 0x15, 0x00, 0xda, 0x55, 0xfe, 0x76, 0x6e, 0x1c, 0x9a, 0xa5, 0x1e, 0xfd, 0x46, 0xfb, 0x5a, \n  0xdf, 0xf7, 0xa5, 0x78, 0x02, 0xb7, 0x91, 0x06, 0x2d, 0xce, 0x01, 0x22, 0x35, 0xfd, 0xac, 0xc1, \n  0xfa, 0x91, 0xe0, 0xfe, 0x6e, 0x0b, 0x03, 0x7f, 0x08, 0xfe, 0x1a, 0xc7, 0xfe, 0x40, 0xf2, 0xfe, \n  0xff, 0xc5, 0x00, 0x93, 0x57, 0x00, 0xfe, 0x42, 0xfe, 0xe7, 0x79, 0xff, 0xa7, 0x91, 0x00, 0x29, \n  0xa5, 0xff, 0xe8, 0x38, 0xfe, 0xc0, 0xa7, 0xff, 0xe8, 0x7e, 0xfe, 0xdf, 0x49, 0x00, 0xe4, 0xb1, \n  0xff, 0x01, 0xdb, 0xfe, 0xaa, 0xb4, 0xff, 0x70, 0x47, 0xff, 0x7c, 0x4e, 0xff, 0x22, 0x15, 0x00, \n  0xcd, 0x9d, 0x00, 0x1f, 0xba, 0xfe, 0xcc, 0x79, 0x1f, 0x9f, 0x8d, 0x20, 0xec, 0x94, 0xf9, 0xf0, \n  0xc4, 0xf7, 0xed, 0x18, 0x03, 0x0b, 0xd3, 0x06, 0x11, 0x32, 0x01, 0xbf, 0x67, 0xfc, 0x56, 0x79, \n  0xfa, 0x29, 0x5e, 0xff, 0x71, 0xe7, 0x03, 0x0c, 0xa4, 0xfd, 0x4f, 0x58, 0xfe, 0x75, 0xd9, 0xfe, \n  0x8f, 0x01, 0x01, 0x02, 0x16, 0x00, 0x20, 0x10, 0xfe, 0x93, 0x6e, 0xff, 0x16, 0x2c, 0x00, 0xcf, \n  0x94, 0xff, 0x35, 0x1d, 0xfe, 0x85, 0xbc, 0xff, 0x0c, 0xd8, 0xfe, 0x71, 0x8f, 0x00, 0xbe, 0xee, \n  0xff, 0x3c, 0x07, 0xff, 0x2e, 0x8f, 0xff, 0xf7, 0xff, 0xfe, 0x9e, 0xe8, 0xfe, 0x8a, 0xc2, 0xff, \n  0x94, 0xc7, 0x00, 0x68, 0xd5, 0xff, 0xd9, 0xcd, 0x22, 0xb1, 0x4c, 0x22, 0x73, 0xa9, 0xf7, 0xd2, \n  0xe5, 0xf7, 0xd2, 0x30, 0x03, 0xa4, 0x9b, 0x06, 0x84, 0x96, 0x00, 0x79, 0xaf, 0xfb, 0xa0, 0x22, \n  0xfa, 0x93, 0xb4, 0xff, 0x97, 0x80, 0x04, 0x07, 0x1a, 0xfd, 0x2a, 0x0f, 0xfe, 0x26, 0xa5, 0xfe, \n  0x09, 0x13, 0x01, 0xbb, 0xd1, 0xff, 0xcb, 0xba, 0xfd, 0xef, 0x2e, 0xff, 0x23, 0xe6, 0xff, 0xe7, \n  0x82, 0xff, 0x0f, 0xf1, 0xfd, 0x93, 0xcb, 0xff, 0xdd, 0x06, 0xff, 0x3a, 0x96, 0x00, 0x8d, 0xe9, \n  0xff, 0x07, 0x51, 0xff, 0xd3, 0x58, 0xff, 0x14, 0xbe, 0xfe, 0x16, 0x7a, 0xfe, 0x30, 0x47, 0xff, \n  0xb6, 0x6f, 0x00, 0xba, 0xb0, 0x00, 0x75, 0x29, 0x26, 0x54, 0x0f, 0x24, 0xd2, 0xa8, 0xf5, 0xfc, \n  0x75, 0xf8, 0x57, 0xe8, 0x02, 0x4b, 0x02, 0x06, 0xe4, 0x3f, 0x00, 0x4d, 0x47, 0xfb, 0x13, 0xed, \n  0xf9, 0x7f, 0xda, 0xff, 0x44, 0xf9, 0x04, 0xfa, 0xb0, 0xfc, 0xee, 0x08, 0xfe, 0x9a, 0x81, 0xfe, \n  0xdf, 0x0e, 0x01, 0xbc, 0xb0, 0xff, 0xfd, 0x77, 0xfd, 0xbf, 0xe7, 0xfe, 0xad, 0xc1, 0xff, 0x41, \n  0xa7, 0xff, 0x6b, 0xe3, 0xfd, 0xc9, 0x02, 0x00, 0x94, 0x15, 0xff, 0x01, 0x8f, 0x00, 0x62, 0xc8, \n  0xff, 0x20, 0xad, 0xff, 0x21, 0x3f, 0xff, 0xa1, 0x8f, 0xfe, 0x4d, 0x59, 0xfe, 0xd5, 0xb4, 0xfe, \n  0x17, 0x33, 0x00, 0xf6, 0x06, 0x01, 0xe1, 0xf5, 0x29, 0x2f, 0x22, 0x25, 0x74, 0x09, 0xf3, 0xf4, \n  0x64, 0xf9, 0xfd, 0x49, 0x02, 0x7c, 0xf8, 0x04, 0x56, 0xd6, 0xff, 0x3c, 0xee, 0xfa, 0x14, 0x98, \n  0xf9, 0xef, 0xce, 0xff, 0xb2, 0x21, 0x05, 0x17, 0x4e, 0xfc, 0x63, 0x34, 0xfe, 0xde, 0x35, 0xfe, \n  0x30, 0xf1, 0x00, 0x15, 0x6b, 0xff, 0x4f, 0x2f, 0xfd, 0x42, 0xa2, 0xfe, 0x37, 0xa7, 0xff, 0x9d, \n  0x9d, 0xff, 0xef, 0xde, 0xfd, 0x87, 0x25, 0x00, 0x77, 0xc8, 0xfe, 0x76, 0x95, 0x00, 0x37, 0x6e, \n  0xff, 0xc2, 0xca, 0xff, 0x0a, 0x46, 0xff, 0xe3, 0x59, 0xfe, 0x33, 0x3d, 0xfe, 0x71, 0x0a, 0xfe, \n  0xba, 0x21, 0x00, 0x4d, 0xdd, 0x00, 0x3a, 0x4c, 0x2e, 0x6d, 0x67, 0x25, 0x98, 0xba, 0xef, 0xa8, \n  0xe9, 0xfa, 0x71, 0xba, 0x01, 0x42, 0xed, 0x03, 0xdf, 0x3c, 0xff, 0x55, 0xc0, 0xfa, 0x35, 0x3d, \n  0xf9, 0x55, 0xd2, 0xff, 0x70, 0x88, 0x05, 0x5e, 0xd3, 0xfb, 0x8f, 0xcf, 0xfe, 0x46, 0x00, 0xfe, \n  0xc7, 0xd2, 0x00, 0x39, 0x14, 0xff, 0x98, 0x36, 0xfd, 0x4d, 0xbb, 0xfe, 0x1f, 0x2a, 0xff, 0x53, \n  0xe9, 0xff, 0xb0, 0xe4, 0xfd, 0xfe, 0xca, 0xff, 0xdb, 0xcb, 0xfe, 0x61, 0xb0, 0x00, 0x50, 0xff, \n  0xfe, 0xf6, 0x1b, 0x00, 0x46, 0x8c, 0xff, 0x65, 0xea, 0xfd, 0x11, 0x45, 0xfe, 0x1c, 0xf8, 0xfd, \n  0x70, 0xc5, 0xff, 0x3b, 0x8a, 0x00, 0x44, 0xe7, 0x32, 0xa7, 0x60, 0x24, 0xb0, 0x52, 0xec, 0xca, \n  0xf7, 0xfc, 0x13, 0x48, 0x01, 0xf0, 0x05, 0x03, 0x1c, 0x4f, 0xfe, 0x09, 0xbd, 0xfa, 0x18, 0xba, \n  0xf8, 0xd2, 0x87, 0x00, 0x34, 0xd7, 0x05, 0x4d, 0x43, 0xfb, 0x36, 0x0d, 0x00, 0x4c, 0x95, 0xfd, \n  0x30, 0xb7, 0x00, 0x04, 0x0e, 0xff, 0xe0, 0xbe, 0xfd, 0x5c, 0x4c, 0xfe, 0x88, 0xf2, 0xfe, 0x80, \n  0x4d, 0x00, 0x1b, 0x2e, 0xfd, 0xde, 0xf6, 0xff, 0x3b, 0xc3, 0xfe, 0xd0, 0xa4, 0x00, 0x99, 0x38, \n  0xff, 0x34, 0x8d, 0x00, 0xaa, 0x69, 0xff, 0xfa, 0x97, 0xfd, 0x9a, 0xcc, 0xfe, 0xbe, 0xd3, 0xfd, \n  0x86, 0x08, 0xff, 0x18, 0x8d, 0x00, 0xed, 0x29, 0x36, 0xea, 0x23, 0x23, 0x4c, 0x58, 0xe9, 0x82, \n  0x07, 0xff, 0x2a, 0x86, 0x00, 0x25, 0x2e, 0x02, 0x8b, 0x8a, 0xfd, 0x53, 0x49, 0xfa, 0x42, 0xc1, \n  0xf8, 0xe0, 0x3a, 0x01, 0x10, 0xbf, 0x05, 0x5f, 0x40, 0xfb, 0x09, 0x2b, 0x01, 0x46, 0xb9, 0xfc, \n  0x64, 0x22, 0x01, 0x45, 0x76, 0xff, 0x53, 0x5b, 0xfd, 0xf5, 0x75, 0xfe, 0x71, 0x48, 0xfe, 0xc9, \n  0xfc, 0xff, 0x26, 0x44, 0xfd, 0x6c, 0x95, 0xff, 0xcc, 0xb9, 0xfe, 0x44, 0x6d, 0x01, 0x84, 0x3b, \n  0xff, 0x82, 0x79, 0x00, 0xc9, 0x8c, 0xff, 0x8d, 0xb0, 0xfd, 0xef, 0xa1, 0xfe, 0x2d, 0x8a, 0xfd, \n  0xc4, 0xd4, 0xfe, 0x78, 0x54, 0x00, 0xb1, 0xd9, 0x37, 0xfe, 0xf8, 0x20, 0x7d, 0x80, 0xe8, 0x34, \n  0x95, 0x00, 0x42, 0x34, 0xff, 0x2e, 0x29, 0x02, 0xd3, 0xfe, 0xfc, 0x42, 0x11, 0xfa, 0x11, 0xfe, \n  0xf8, 0x33, 0xe9, 0x01, 0x07, 0x96, 0x05, 0x3c, 0x87, 0xfb, 0x54, 0xe9, 0x01, 0x43, 0x97, 0xfc, \n  0x49, 0xa3, 0x01, 0xad, 0x4b, 0xff, 0x92, 0xa9, 0xfd, 0x2d, 0xc9, 0xfd, 0xdd, 0xce, 0xfd, 0xc2, \n  0x47, 0x00, 0xd5, 0xcd, 0xfc, 0xf0, 0xb8, 0xff, 0x0b, 0x5f, 0xff, 0xc4, 0xb8, 0x01, 0x97, 0x06, \n  0xff, 0x38, 0xfa, 0x00, 0x37, 0x9f, 0xff, 0x33, 0x4f, 0xfd, 0xf9, 0x94, 0xfe, 0x76, 0xa6, 0xfd, \n  0x02, 0xb2, 0xfe, 0x30, 0x15, 0x00, 0x78, 0x1a, 0x37, 0x35, 0x01, 0x1f, 0x2b, 0xd4, 0xe9, 0x8c, \n  0xd2, 0x00, 0xda, 0xa1, 0xfd, 0x58, 0xfe, 0x02, 0x00, 0x63, 0xfd, 0xe4, 0x92, 0xf9, 0x79, 0x5e, \n  0xf9, 0xaf, 0xb6, 0x02, 0x59, 0x90, 0x04, 0x1c, 0x56, 0xfc, 0x35, 0x3f, 0x03, 0xd8, 0xd3, 0xfb, \n  0xbc, 0x1b, 0x02, 0x58, 0x8f, 0xff, 0xc1, 0xac, 0xfc, 0xa9, 0x4d, 0xfe, 0xc8, 0x8d, 0xfd, 0xba, \n  0x05, 0x00, 0x8c, 0x98, 0xfd, 0x61, 0xac, 0xff, 0x1e, 0x73, 0xff, 0xc5, 0x10, 0x02, 0x90, 0x55, \n  0xff, 0x2d, 0xd3, 0x00, 0xe2, 0x72, 0xff, 0xc4, 0x5f, 0xfd, 0xa5, 0xa9, 0xfe, 0x38, 0xd0, 0xfd, \n  0x6d, 0x9b, 0xfe, 0xc2, 0xfa, 0xff, 0xae, 0xf1, 0x33, 0x57, 0x49, 0x1d, 0xd1, 0x0b, 0xed, 0xa0, \n  0xcd, 0xff, 0x42, 0x38, 0xfc, 0x43, 0x6c, 0x04, 0xe1, 0x27, 0xfe, 0xc6, 0x3d, 0xf9, 0xb4, 0xf0, \n  0xf9, 0x88, 0x7d, 0x02, 0x08, 0xbe, 0x03, 0xae, 0xd2, 0xfd, 0xc6, 0x4c, 0x03, 0x76, 0xf1, 0xfb, \n  0x61, 0xca, 0x01, 0x50, 0x3f, 0xff, 0x76, 0xf9, 0xfc, 0xaf, 0x46, 0xfe, 0x64, 0xfd, 0xfd, 0xc4, \n  0x40, 0x00, 0x4a, 0x09, 0xfe, 0x7e, 0x53, 0xff, 0x6a, 0x8b, 0xff, 0x5d, 0x71, 0x02, 0xfc, 0x01, \n  0xff, 0xeb, 0x8b, 0x00, 0x6b, 0x9d, 0xff, 0x3d, 0x94, 0xfd, 0x91, 0xd3, 0xfe, 0x9a, 0xe7, 0xfd, \n  0x7e, 0xc1, 0xfe, 0x5f, 0x2a, 0x00, 0x52, 0x93, 0x2e, 0x9d, 0x74, 0x1c, 0xf2, 0x23, 0xf1, 0xe0, \n  0x34, 0xfe, 0x95, 0x50, 0xfb, 0x0f, 0x53, 0x05, 0x00, 0x7a, 0xff, 0xff, 0x72, 0xf9, 0x41, 0x10, \n  0xfa, 0x38, 0x35, 0x02, 0x63, 0xf4, 0x02, 0x2c, 0x86, 0xfe, 0x5d, 0xbe, 0x03, 0xf9, 0x86, 0xfb, \n  0xd1, 0x33, 0x01, 0x1e, 0xd3, 0xff, 0x9c, 0xbe, 0xfc, 0x8a, 0x23, 0xff, 0x12, 0x83, 0xfe, 0xe3, \n  0x28, 0x00, 0xdb, 0x67, 0xfe, 0x12, 0x18, 0xff, 0x7e, 0x7f, 0xff, 0x92, 0xed, 0x01, 0x3e, 0x0d, \n  0xff, 0x56, 0x3a, 0x00, 0x2d, 0xe6, 0xff, 0x8e, 0xe9, 0xfd, 0xc4, 0xe2, 0xfe, 0x9f, 0x5d, 0xfe, \n  0x45, 0xfc, 0xfe, 0xc8, 0xd5, 0xff, 0xdf, 0x10, 0x25, 0xa2, 0x3f, 0x1b, 0x3a, 0x6a, 0xf4, 0xe6, \n  0xee, 0xfe, 0x70, 0x67, 0x01, 0x6e, 0x18, 0x03, 0x1f, 0xc3, 0xfe, 0x05, 0xa2, 0xfb, 0x45, 0x61, \n  0xfb, 0xff, 0xa2, 0x01, 0x25, 0x75, 0x03, 0xb3, 0x68, 0xfe, 0x3e, 0x91, 0x01, 0xc9, 0x2d, 0xfe, \n  0xf3, 0x54, 0x01, 0xc2, 0xb9, 0xff, 0x0a, 0xfe, 0xfd, 0x45, 0xa9, 0xfe, 0x3b, 0x69, 0xfe, 0xea, \n  0x08, 0x00, 0x8c, 0xb7, 0xfe, 0xd5, 0xa5, 0xff, 0xf4, 0x8f, 0xff, 0x58, 0x98, 0x01, 0xca, 0x8e, \n  0xff, 0x9d, 0x2a, 0x00, 0x64, 0xca, 0xff, 0xdc, 0x2d, 0xfe, 0x62, 0xc5, 0xfe, 0xfe, 0x8e, 0xfe, \n  0xab, 0xe6, 0xfe, 0xd8, 0x62, 0xff, 0x26, 0xd1, 0x21, 0xc9, 0x64, 0x1b, 0x3a, 0x3d, 0xf6, 0xf0, \n  0x5d, 0xfc, 0x9c, 0xbb, 0x00, 0xbf, 0x98, 0x04, 0x3b, 0x42, 0x00, 0x79, 0x2e, 0xfc, 0x48, 0xf9, \n  0xfa, 0x99, 0x0f, 0x00, 0x78, 0x1d, 0x03, 0xa6, 0x21, 0xff, 0xe1, 0xca, 0x01, 0xe8, 0x9f, 0xfe, \n  0xee, 0x2f, 0x01, 0x26, 0x8f, 0x00, 0x00, 0x4c, 0xfe, 0x2b, 0x41, 0xff, 0x8c, 0x64, 0xff, 0x87, \n  0xf3, 0xff, 0x6c, 0xea, 0xfe, 0xb2, 0x62, 0xff, 0x99, 0x00, 0xff, 0xaf, 0x7f, 0x01, 0xc4, 0x98, \n  0xff, 0x50, 0xb8, 0xff, 0xef, 0x2f, 0x00, 0xff, 0xa2, 0xfe, 0x16, 0xef, 0xfe, 0x0c, 0xd9, 0xfe, \n  0x98, 0x0f, 0xff, 0xb5, 0x88, 0xff, 0xac, 0x1d, 0x1f, 0x5f, 0x9f, 0x1b, 0x1f, 0x01, 0xf8, 0x56, \n  0x89, 0xfa, 0x37, 0xea, 0xff, 0xfb, 0xe1, 0x04, 0x98, 0x62, 0x01, 0xad, 0x2e, 0xfd, 0xa6, 0x1d, \n  0xfb, 0x8e, 0x1e, 0xff, 0x2a, 0x9f, 0x02, 0x53, 0x6f, 0xff, 0xa3, 0xe0, 0x01, 0xd2, 0x14, 0xff, \n  0x52, 0x1d, 0x01, 0x66, 0xf5, 0x00, 0x75, 0xd8, 0xfe, 0x36, 0x5f, 0xff, 0x59, 0xf7, 0xff, 0x1f, \n  0x1a, 0x00, 0x09, 0xdc, 0xfe, 0x73, 0x82, 0xff, 0x8c, 0x7a, 0xfe, 0x24, 0xe1, 0x00, 0x78, 0xe8, \n  0xff, 0x52, 0x60, 0xff, 0x69, 0x0f, 0x00, 0x59, 0x31, 0xff, 0x33, 0x03, 0xff, 0x75, 0x02, 0xff, \n  0x4c, 0x6a, 0xff, 0xb9, 0x60, 0xff, 0xd6, 0x7f, 0x1d, 0x34, 0xf9, 0x1b, 0x67, 0xf6, 0xf8, 0x1f, \n  0xad, 0xf9, 0xb7, 0xcc, 0xff, 0xf6, 0xf5, 0x04, 0x33, 0xd2, 0x01, 0x9f, 0x8b, 0xfd, 0xf4, 0x54, \n  0xfb, 0x0f, 0xc1, 0xfe, 0xa9, 0x4f, 0x02, 0x22, 0x4d, 0xff, 0xa1, 0xc4, 0x01, 0x33, 0x46, 0xff, \n  0xda, 0x2c, 0x01, 0x6a, 0x3b, 0x01, 0xfa, 0xfd, 0xfe, 0xf4, 0x99, 0xff, 0xbd, 0x19, 0x00, 0xe2, \n  0xed, 0xff, 0xe4, 0xa0, 0xfe, 0x5a, 0xa4, 0xff, 0xba, 0x48, 0xfe, 0x27, 0x1c, 0x00, 0xff, 0x22, \n  0x00, 0x2a, 0x74, 0xff, 0xab, 0xd3, 0xff, 0x1a, 0x49, 0xff, 0xe1, 0x3c, 0xff, 0xbd, 0x14, 0xff, \n  0x0f, 0x7c, 0xff, 0xc6, 0x91, 0xff, 0x65, 0x5b, 0x1d, 0x4d, 0x3e, 0x1c, 0x7a, 0xca, 0xf8, 0xa8, \n  0x9c, 0xf9, 0x45, 0xdb, 0x00, 0xe7, 0x51, 0x05, 0xa2, 0xba, 0x01, 0x15, 0x28, 0xfd, 0xfe, 0x36, \n  0xfb, 0xbe, 0xdb, 0xfe, 0x5d, 0x63, 0x02, 0x39, 0x04, 0xff, 0x6e, 0x09, 0x01, 0x49, 0x8e, 0xff, \n  0x1d, 0x12, 0x01, 0xb5, 0x2d, 0x01, 0xc9, 0x46, 0xff, 0x2c, 0xba, 0xff, 0x41, 0x51, 0x00, 0x76, \n  0xbe, 0xff, 0x46, 0x2d, 0xfe, 0xfa, 0x4f, 0xff, 0x9a, 0x88, 0xfe, 0x5d, 0x0a, 0x00, 0x14, 0xd7, \n  0xff, 0x23, 0xb9, 0xff, 0x00, 0xd1, 0xff, 0x4b, 0x44, 0xff, 0xb7, 0x5c, 0xff, 0x02, 0xd2, 0xfe, \n  0x0c, 0x96, 0xff, 0x8f, 0x14, 0x00, 0x77, 0xc7, 0x1e, 0x53, 0x07, 0x1c, 0x34, 0xb9, 0xf7, 0x6e, \n  0x91, 0xfa, 0x98, 0x77, 0x02, 0x23, 0xaa, 0x05, 0x47, 0xe7, 0x00, 0xb5, 0x80, 0xfc, 0x2a, 0x21, \n  0xfb, 0xed, 0x51, 0xff, 0x4c, 0x9b, 0x02, 0x3e, 0xa7, 0xfe, 0x69, 0x54, 0x00, 0xcd, 0x1b, 0xff, \n  0x1c, 0x62, 0x01, 0x73, 0xb2, 0x00, 0x60, 0xde, 0xfe, 0x82, 0x60, 0x00, 0x98, 0x4d, 0x00, 0x3f, \n  0x6d, 0xff, 0x63, 0x29, 0xfe, 0x13, 0xef, 0xfe, 0x05, 0x5f, 0xfe, 0x61, 0x6b, 0x00, 0xff, 0xfe, \n  0xff, 0xe6, 0x8b, 0xff, 0x72, 0xbc, 0xff, 0x42, 0x7c, 0xff, 0x7f, 0x1d, 0xff, 0x64, 0xac, 0xfe, \n  0x02, 0x9e, 0xff, 0xf1, 0x2e, 0x00, 0x06, 0xcd, 0x20, 0x7e, 0x5f, 0x1c, 0xde, 0x9f, 0xf6, 0xae, \n  0xfe, 0xfb, 0x13, 0xa9, 0x03, 0xfa, 0xfa, 0x04, 0xe3, 0xd3, 0xff, 0x9b, 0xf7, 0xfb, 0x6e, 0x70, \n  0xfb, 0x7b, 0x41, 0x00, 0xfb, 0x17, 0x03, 0x07, 0xff, 0xfd, 0xfa, 0x90, 0xff, 0x3e, 0x1e, 0xff, \n  0x05, 0x2b, 0x01, 0x60, 0x0e, 0x00, 0xc8, 0x8f, 0xfe, 0x17, 0xfe, 0xff, 0x14, 0x3c, 0x00, 0xfc, \n  0x45, 0xff, 0x5b, 0x28, 0xfe, 0x3e, 0x29, 0xff, 0xc3, 0x80, 0xfe, 0xc2, 0x6a, 0x00, 0x55, 0xc7, \n  0xff, 0xf2, 0xf9, 0xff, 0x38, 0x9a, 0xff, 0x38, 0x1e, 0xff, 0xc7, 0xf6, 0xfe, 0xcb, 0x86, 0xfe, \n  0x12, 0xa3, 0xff, 0x3c, 0x22, 0x00, 0x5d, 0xa7, 0x23, 0xbb, 0x4a, 0x1d, 0x0f, 0x5d, 0xf5, 0x4e, \n  0x2f, 0xfd, 0xf5, 0x63, 0x03, 0x0d, 0x68, 0x03, 0x0c, 0x08, 0xff, 0xfe, 0x07, 0xfc, 0xc9, 0x05, \n  0xfc, 0xc6, 0x8f, 0x01, 0x1d, 0x80, 0x03, 0x5f, 0x0e, 0xfd, 0xdd, 0x44, 0xff, 0xdb, 0x12, 0xff, \n  0x73, 0xc6, 0x00, 0x91, 0x45, 0xff, 0x9f, 0x51, 0xfe, 0x80, 0x14, 0xff, 0x16, 0xb0, 0xff, 0x1a, \n  0x89, 0xff, 0x8a, 0x08, 0xfe, 0xd2, 0xa9, 0xff, 0xd8, 0xe0, 0xfe, 0x84, 0x45, 0x00, 0xec, 0x90, \n  0xff, 0x93, 0x4c, 0x00, 0x44, 0x85, 0xff, 0x39, 0x7f, 0xfe, 0x6c, 0xf0, 0xfe, 0x84, 0x55, 0xfe, \n  0x06, 0x48, 0xff, 0x3f, 0x34, 0x00, 0xb0, 0x0d, 0x27, 0xa4, 0xdd, 0x1e, 0x25, 0x49, 0xf3, 0xb5, \n  0x9f, 0xfd, 0x7e, 0xde, 0x01, 0x62, 0xab, 0x01, 0x80, 0xf5, 0xfe, 0xf1, 0x6e, 0xfc, 0x6a, 0x7e, \n  0xfc, 0x5f, 0xa9, 0x02, 0x78, 0xc9, 0x03, 0x64, 0x04, 0xfc, 0x37, 0xcb, 0xff, 0xeb, 0xab, 0xfe, \n  0x73, 0xfa, 0xff, 0x6d, 0x40, 0xff, 0x79, 0x80, 0xfd, 0x45, 0x1a, 0xfe, 0x86, 0x8f, 0xff, 0xb4, \n  0xac, 0xff, 0x0b, 0xe5, 0xfd, 0x32, 0x1a, 0x00, 0x34, 0xf8, 0xfe, 0xba, 0x31, 0x00, 0x19, 0xc9, \n  0xff, 0xa3, 0x4f, 0x00, 0xaa, 0x21, 0xff, 0xe4, 0x3e, 0xfe, 0x91, 0xfc, 0xfe, 0x41, 0xb2, 0xfd, \n  0xf7, 0xf5, 0xfe, 0x67, 0x6e, 0x00, 0x63, 0x5e, 0x2a, 0xaa, 0xe5, 0x1e, 0x57, 0x62, 0xf1, 0x1b, \n  0x8a, 0xfe, 0xd0, 0x90, 0x00, 0xc3, 0x89, 0x00, 0xe5, 0x0b, 0xff, 0x9e, 0xca, 0xfc, 0x9b, 0xd4, \n  0xfc, 0x9a, 0x8b, 0x03, 0x72, 0xd6, 0x03, 0x35, 0xb5, 0xfb, 0x7a, 0xb2, 0x00, 0xe9, 0x09, 0xfe, \n  0xa9, 0xd1, 0xff, 0x67, 0x53, 0xff, 0x78, 0xde, 0xfc, 0x9f, 0xae, 0xfd, 0xd7, 0x4f, 0xff, 0xc8, \n  0xf8, 0xff, 0x54, 0xf3, 0xfd, 0x51, 0x30, 0x00, 0x89, 0x4f, 0xff, 0xf0, 0x65, 0x00, 0x73, 0x11, \n  0x00, 0x3f, 0x49, 0x00, 0xb1, 0xfe, 0xfe, 0xf4, 0x5d, 0xfe, 0xad, 0xa1, 0xfe, 0xfa, 0x6d, 0xfd, \n  0xae, 0xf8, 0xfe, 0x58, 0x69, 0x00, 0x99, 0xda, 0x2a, 0xa2, 0x39, 0x1e, 0x2c, 0xce, 0xf0, 0xc3, \n  0x80, 0xff, 0xb3, 0x4d, 0x00, 0xa9, 0x35, 0x00, 0xd2, 0x8c, 0xfe, 0xe6, 0x90, 0xfc, 0x18, 0xa9, \n  0xfc, 0xd9, 0x99, 0x03, 0xd0, 0x1b, 0x04, 0x88, 0xdd, 0xfb, 0x0f, 0x1b, 0x01, 0x71, 0x3c, 0xfe, \n  0xab, 0xb5, 0xff, 0x59, 0x57, 0xff, 0xa6, 0x50, 0xfd, 0x18, 0xeb, 0xfc, 0x83, 0xff, 0xfe, 0xbc, \n  0x3c, 0x00, 0x1c, 0x89, 0xfd, 0xb8, 0x85, 0x00, 0x46, 0xb8, 0xff, 0xd7, 0x86, 0x00, 0x11, 0x0a, \n  0x00, 0x63, 0x80, 0x00, 0x43, 0x0e, 0xff, 0x8a, 0xf0, 0xfd, 0x6c, 0xa0, 0xfe, 0x31, 0x8c, 0xfd, \n  0x31, 0xc9, 0xfe, 0x62, 0x26, 0x00, 0xbd, 0xff, 0x28, 0x01, 0x5a, 0x1c, 0xa0, 0x18, 0xf2, 0x40, \n  0xf4, 0xff, 0x8b, 0xf3, 0x00, 0x0d, 0x29, 0x01, 0xd2, 0x26, 0xfe, 0x43, 0x0e, 0xfc, 0xc4, 0x00, \n  0xfc, 0x7b, 0x2c, 0x03, 0x97, 0xe8, 0x03, 0x5c, 0xc9, 0xfc, 0x13, 0xa6, 0x01, 0x8c, 0x09, 0xfe, \n  0x91, 0x90, 0x00, 0x94, 0x95, 0xff, 0x0e, 0x73, 0xfd, 0x9c, 0x9d, 0xfd, 0x77, 0x59, 0xfe, 0xc9, \n  0x07, 0x00, 0x9e, 0x2b, 0xfe, 0xc6, 0x3e, 0x00, 0xbe, 0xe2, 0xff, 0x42, 0xe2, 0x00, 0xde, 0xfe, \n  0xff, 0x32, 0x7c, 0x00, 0xaa, 0x21, 0xff, 0x76, 0xfe, 0xfd, 0x61, 0xa6, 0xfe, 0x78, 0x1d, 0xfe, \n  0x17, 0xb1, 0xfe, 0xa0, 0xb5, 0xff, 0x77, 0x72, 0x1f, 0xa3, 0x75, 0x1b, 0xc1, 0xdb, 0xf7, 0x24, \n  0x51, 0xfe, 0x00, 0x8e, 0x03, 0x5a, 0x96, 0x01, 0x93, 0x47, 0xff, 0x25, 0xfb, 0xfc, 0x42, 0x55, \n  0xfd, 0x51, 0xd9, 0x02, 0xbb, 0x4f, 0x03, 0xa0, 0xf8, 0xfd, 0xd4, 0xf2, 0xff, 0x88, 0x7e, 0xff, \n  0xb4, 0x61, 0x00, 0x07, 0xd8, 0xff, 0xc3, 0xa6, 0xfe, 0xa2, 0xfb, 0xfd, 0x74, 0x1e, 0xff, 0x57, \n  0xd1, 0xff, 0x6d, 0x17, 0xfe, 0x19, 0xf5, 0xff, 0x22, 0xf7, 0xff, 0x12, 0xd5, 0x00, 0x06, 0xc4, \n  0x00, 0x9b, 0xaa, 0x00, 0x16, 0x0e, 0xff, 0x74, 0xa7, 0xfd, 0xab, 0x04, 0xfe, 0xd3, 0x8a, 0xfe, \n  0x64, 0xdc, 0xff, 0xbd, 0x92, 0x00, 0x06, 0x09, 0x0a, 0x0a, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, \n  0x07, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, \n  0x0b, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, \n  0x10, 0x11, 0x11, 0x12, 0x14, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, \n  0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0b, \n  0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x17, 0x15, 0x15, 0x14, 0x13, 0x12, \n  0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, 0x06, \n  0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, \n  0x0f, 0x10, 0x11, 0x12, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x1b, 0x18, 0x17, 0x16, 0x15, 0x15, \n  0x14, 0x13, 0x12, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, \n  0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x07, \n  0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x15, 0x16, \n  0x17, 0x18, 0x19, 0x1a, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, \n  0x10, 0x0f, 0x0e, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, \n  0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, \n  0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, \n  0x1f, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, \n  0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, \n  0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, \n  0x04, 0x05, 0x05, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, \n  0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x1b, 0x1b, 0x1a, 0x19, 0x19, 0x18, 0x17, \n  0x16, 0x16, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, \n  0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x04, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, \n  0x09, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, \n  0x1b, 0x1c, 0x1f, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, \n  0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x03, \n  0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, \n  0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, \n  0x12, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x1b, 0x1a, 0x19, 0x18, \n  0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, \n  0x08, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, \n  0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, \n  0x1b, 0x1d, 0x1d, 0x1d, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, \n  0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x05, 0x05, \n  0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, \n  0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, \n  0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, \n  0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, \n  0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, \n  0x05, 0x06, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, \n  0x18, 0x18, 0x18, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, \n  0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, \n  0x05, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x07, 0x08, 0x09, 0x0a, \n  0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, \n  0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, \n  0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, \n  0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x0d, 0x0e, \n  0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x08, \n  0x08, 0x09, 0x09, 0x0a, 0x0b, 0x08, 0x09, 0x0a, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x07, \n  0x08, 0x06, \n};\n"
  },
  {
    "path": "project/lib/custom/openal/build/bsinc_inc.h",
    "content": "/* Generated by bsincgen, do not edit! */\n#pragma once\n\nstatic_assert(BSINC_SCALE_COUNT == 16, \"Unexpected BSINC_SCALE_COUNT value!\");\nstatic_assert(BSINC_PHASE_COUNT == 32, \"Unexpected BSINC_PHASE_COUNT value!\");\n\nnamespace {\n\nstruct BSincTable {\n    const float scaleBase, scaleRange;\n    const unsigned int m[BSINC_SCALE_COUNT];\n    const unsigned int filterOffset[BSINC_SCALE_COUNT];\n    const float *Tab;\n};\n\n/* This 23rd order filter has a rejection of -60dB, yielding a transition width\n * of ~0.158 (normalized frequency). Order increases when downsampling to a\n * limit of one octave, after which the quality of the filter (transition\n * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound\n * after downsampling by ~3.67 octaves.\n */\nalignas(16) constexpr float bsinc24_tab[81920] = {\n    /*  0, 0 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f,\n    +7.201639933e-06f, +7.808824226e-06f, +7.060810728e-06f, +4.363309672e-06f, -8.494304210e-07f, -9.042191405e-06f, -2.050403146e-05f, -3.527979396e-05f, -5.311682607e-05f, -7.343513463e-05f, -9.532739769e-05f, -1.175924836e-04f, -1.388026701e-04f, -1.574009775e-04f, -1.718213704e-04f, -1.806214921e-04f, -1.826154788e-04f, -1.769935670e-04f, -1.634158161e-04f, -1.420693226e-04f, -1.136816124e-04f, -7.948714106e-05f, -4.114853805e-05f, -6.388853996e-07f, +3.990461040e-05f, +7.834217668e-05f, +1.126932717e-04f, +1.412836031e-04f, +1.628639195e-04f, +1.766901015e-04f, +1.825581262e-04f, +1.807921168e-04f, +1.721884081e-04f, +1.579228174e-04f, +1.394316620e-04f, +1.182791553e-04f, +9.602447380e-05f, +7.410099365e-05f, +5.371811474e-05f, +3.579302665e-05f, +2.091612006e-05f, +9.349966785e-06f, +1.058315911e-06f, -4.241239355e-06f, -7.009111338e-06f, -7.809025104e-06f, -7.235395433e-06f, -5.850110091e-06f,\n    /*  0, 1 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.724423225e-04f, -7.151403879e-04f, -9.578278075e-04f, -1.147940629e-03f, -1.214156681e-03f, -1.068414757e-03f, -6.103091546e-04f, +2.661968716e-04f, +1.664078274e-03f, +3.673193623e-03f, +6.359724439e-03f, +9.756128885e-03f, +1.385269489e-02f, +1.859172564e-02f, +2.386521801e-02f, +2.951661261e-02f, +3.534682755e-02f, +4.112437288e-02f, +4.659892291e-02f, +5.151734626e-02f, +5.564090171e-02f, +5.876213779e-02f, +6.072000814e-02f, +6.141184024e-02f, +6.080106129e-02f, +5.891996710e-02f, +5.586727659e-02f, +5.180069918e-02f, +4.692520265e-02f, +4.147805655e-02f, +3.571200116e-02f, +2.987802621e-02f, +2.420922778e-02f, +1.890704943e-02f, +1.413092922e-02f, +9.992000524e-03f, +6.551076310e-03f, +3.820729751e-03f, +1.770913215e-03f, +3.372696922e-04f, -5.688890031e-04f, -1.050022599e-03f, -1.212248935e-03f, -1.156545178e-03f, -9.718977296e-04f, -7.307582372e-04f, -4.868793578e-04f, -2.753458351e-04f,\n    +7.167114757e-06f, +7.807302866e-06f, +7.110604110e-06f, +4.482915520e-06f, -6.434694612e-07f, -8.737628506e-06f, -2.009520355e-05f, -3.476957772e-05f, -5.251798750e-05f, -7.277083693e-05f, -9.463070442e-05f, -1.169047926e-04f, -1.381711284e-04f, -1.568750475e-04f, -1.714488231e-04f, -1.804441899e-04f, -1.826653555e-04f, -1.772892198e-04f, -1.639600817e-04f, -1.428481242e-04f, -1.146642473e-04f, -8.062803289e-05f, -4.239033203e-05f, -1.916622938e-06f, +3.865861306e-05f, +7.719319639e-05f, +1.116992702e-04f, +1.404909963e-04f, +1.623044060e-04f, +1.763788209e-04f, +1.824932796e-04f, +1.809560329e-04f, +1.725498952e-04f, +1.584405205e-04f, +1.400580555e-04f, +1.189647611e-04f, +9.672189189e-05f, +7.476838129e-05f, +5.432183054e-05f, +3.630926307e-05f, +2.133146638e-05f, +9.660960103e-06f, +1.270137912e-06f, -4.116688316e-06f, -6.955487723e-06f, -7.807887439e-06f, -7.268365081e-06f, -5.900645350e-06f,\n    /*  0, 2 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f,\n    +7.131836001e-06f, +7.804479049e-06f, +7.158509723e-06f, +4.600073246e-06f, -4.404208828e-07f, -8.436272395e-06f, -1.968963904e-05f, -3.426239038e-05f, -5.192162170e-05f, -7.210813297e-05f, -9.393443463e-05f, -1.162161284e-04f, -1.375370856e-04f, -1.563450745e-04f, -1.710708076e-04f, -1.802602417e-04f, -1.827077745e-04f, -1.775770628e-04f, -1.644967024e-04f, -1.436199778e-04f, -1.156411315e-04f, -8.176479580e-05f, -4.362992850e-05f, -3.194260694e-06f, +3.741061019e-05f, +7.604025715e-05f, +1.106996535e-04f, +1.396915333e-04f, +1.617372905e-04f, +1.760597234e-04f, +1.824209217e-04f, +1.811132097e-04f, +1.729057912e-04f, +1.589540398e-04f, +1.406818019e-04f, +1.196492544e-04f, +9.741961088e-05f, +7.543726457e-05f, +5.492795017e-05f, +3.682849015e-05f, +2.175006713e-05f, +9.975176579e-06f, +1.484908233e-06f, -3.989640402e-06f, -6.899921698e-06f, -7.805393139e-06f, -7.300532620e-06f, -5.950853705e-06f,\n    /*  0, 3 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.581433717e-04f, -6.995286060e-04f, -9.435586937e-04f, -1.138857640e-03f, -1.215240571e-03f, -1.085588658e-03f, -6.500939972e-04f, +1.971649035e-04f, +1.559638665e-03f, +3.528314653e-03f, +6.171159300e-03f, +9.523007964e-03f, +1.357698668e-02f, +1.827850552e-02f, +2.352269837e-02f, +2.915590817e-02f, +3.498145442e-02f, +4.076950660e-02f, +4.627046613e-02f, +5.123087815e-02f, +5.541059633e-02f, +5.859974496e-02f, +6.063398788e-02f, +6.140672936e-02f, +6.087713051e-02f, +5.907320056e-02f, +5.608967552e-02f, +5.208088171e-02f, +4.724924434e-02f, +4.183049510e-02f, +3.607691536e-02f, +3.024009546e-02f, +2.455468347e-02f, +1.922444399e-02f, +1.441166908e-02f, +1.023061454e-02f, +6.745217813e-03f, +3.970935397e-03f, +1.880162996e-03f, +4.104074455e-04f, -5.258074696e-04f, -1.030386462e-03f, -1.209493888e-03f, -1.164651507e-03f, -9.857531390e-04f, -7.463715178e-04f, -5.014482555e-04f, -2.871973341e-04f,\n    +7.095819678e-06f, +7.800370763e-06f, +7.204545832e-06f, +4.714799292e-06f, -2.402723706e-07f, -8.138117147e-06f, -1.928734033e-05f, -3.375824403e-05f, -5.132775100e-05f, -7.144705488e-05f, -9.323862873e-05f, -1.155265373e-04f, -1.369005902e-04f, -1.558111055e-04f, -1.706873651e-04f, -1.800696793e-04f, -1.827427547e-04f, -1.778570993e-04f, -1.650256649e-04f, -1.443848538e-04f, -1.166122207e-04f, -8.289737375e-05f, -4.486726377e-05f, -4.471732158e-06f, +3.616066610e-05f, +7.488341620e-05f, +1.096944677e-04f, +1.388852458e-04f, +1.611625883e-04f, +1.757328077e-04f, +1.823410354e-04f, +1.812636169e-04f, +1.732560555e-04f, +1.594633288e-04f, +1.413028526e-04f, +1.203325886e-04f, +9.811758948e-05f, +7.610761022e-05f, +5.553645002e-05f, +3.735069452e-05f, +2.217191876e-05f, +1.029262119e-05f, +1.702638511e-06f, -3.860079559e-06f, -6.842395104e-06f, -7.801524077e-06f, -7.331881716e-06f, -6.000721856e-06f,\n    /*  0, 4 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f,\n    +7.059081716e-06f, +7.794995958e-06f, +7.248730722e-06f, +4.827110191e-06f, -4.301144525e-08f, -7.843156605e-06f, -1.888830955e-05f, -3.325715046e-05f, -5.073639743e-05f, -7.078763450e-05f, -9.254332692e-05f, -1.148360655e-04f, -1.362616909e-04f, -1.552731878e-04f, -1.702985375e-04f, -1.798725349e-04f, -1.827703153e-04f, -1.781293332e-04f, -1.655469566e-04f, -1.451427229e-04f, -1.175774709e-04f, -8.402571100e-05f, -4.610227435e-05f, -5.748970827e-06f, +3.490884522e-05f, +7.372273107e-05f, +1.086837592e-04f, +1.380721657e-04f, +1.605803153e-04f, +1.753980729e-04f, +1.822536042e-04f, +1.814072243e-04f, +1.736006478e-04f, +1.599683410e-04f, +1.419211588e-04f, +1.210147169e-04f, +9.881578617e-05f, +7.677938468e-05f, +5.614730615e-05f, +3.787586248e-05f, +2.259701741e-05f, +1.061329869e-05f, +1.923340206e-06f, -3.727989835e-06f, -6.782889817e-06f, -7.796262099e-06f, -7.362395954e-06f, -6.050236397e-06f,\n    /*  0, 5 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.439884703e-04f, -6.839332393e-04f, -9.291054171e-04f, -1.129315731e-03f, -1.215523855e-03f, -1.101569931e-03f, -6.882696471e-04f, +1.301495090e-04f, +1.457574517e-03f, +3.386079964e-03f, +5.985377344e-03f, +9.292645361e-03f, +1.330382439e-02f, +1.796742122e-02f, +2.318171247e-02f, +2.879596596e-02f, +3.461594135e-02f, +4.041352017e-02f, +4.593989350e-02f, +5.094135058e-02f, +5.517640664e-02f, +5.843282187e-02f, +6.054301834e-02f, +6.139650865e-02f, +6.094820002e-02f, +5.922180670e-02f, +5.630805374e-02f, +5.235783912e-02f, +4.757098725e-02f, +4.218162598e-02f, +3.644151000e-02f, +3.060276630e-02f, +2.490154017e-02f, +1.954387566e-02f, +1.469489309e-02f, +1.047196184e-02f, +6.942151189e-03f, +4.123822392e-03f, +1.991846752e-03f, +4.856340025e-04f, -4.810385334e-04f, -1.009480542e-03f, -1.205867910e-03f, -1.172239576e-03f, -9.993784239e-04f, -7.619693040e-04f, -5.161425332e-04f, -2.992482924e-04f,\n    +7.021637960e-06f, +7.788372543e-06f, +7.291082698e-06f, +4.937022566e-06f, +1.513745344e-07f, -7.551384381e-06f, -1.849254854e-05f, -3.275912115e-05f, -5.014758269e-05f, -7.012990339e-05f, -9.184856916e-05f, -1.141447587e-04f, -1.356204362e-04f, -1.547313687e-04f, -1.699043667e-04f, -1.796688410e-04f, -1.827904761e-04f, -1.783937689e-04f, -1.660605652e-04f, -1.458935566e-04f, -1.185368387e-04f, -8.514975212e-05f, -4.733489691e-05f, -7.025910221e-06f, +3.365521214e-05f, +7.255825958e-05f, +1.076675748e-04f, +1.372523257e-04f, +1.599904879e-04f, +1.750555188e-04f, +1.821586121e-04f, +1.815440025e-04f, +1.739395284e-04f, +1.604690300e-04f, +1.425366721e-04f, +1.216955923e-04f, +9.951415924e-05f, +7.745255413e-05f, +5.676049434e-05f, +3.840398002e-05f, +2.302535893e-05f, +1.093721356e-05f, +2.147024604e-06f, -3.593355386e-06f, -6.721387745e-06f, -7.789589021e-06f, -7.392058845e-06f, -6.099383813e-06f,\n    /*  0, 6 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f,\n    +6.983504168e-06f, +7.780518386e-06f, +7.331620083e-06f, +5.044553124e-06f, +3.428983692e-07f, -7.262793860e-06f, -1.810005886e-05f, -3.226416726e-05f, -4.956132816e-05f, -6.947389279e-05f, -9.115439517e-05f, -1.134526627e-04f, -1.349768747e-04f, -1.541856957e-04f, -1.695048947e-04f, -1.794586306e-04f, -1.828032572e-04f, -1.786504114e-04f, -1.665664791e-04f, -1.466373266e-04f, -1.194902810e-04f, -8.626944199e-05f, -4.856506828e-05f, -8.302483877e-06f, +3.239983159e-05f, +7.139005983e-05f, +1.066459616e-04f, +1.364257588e-04f, +1.593931230e-04f, +1.747051455e-04f, +1.820560435e-04f, +1.816739221e-04f, +1.742726574e-04f, +1.609653496e-04f, +1.431493437e-04f, +1.223751678e-04f, +1.002126668e-04f, +7.812708446e-05f, +5.737599002e-05f, +3.893503281e-05f, +2.345693889e-05f, +1.126437005e-05f, +2.373702808e-06f, -3.456160473e-06f, -6.657870832e-06f, -7.781486633e-06f, -7.420853824e-06f, -6.148150484e-06f,\n    /*  0, 7 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.299833282e-04f, -6.683643483e-04f, -9.144827144e-04f, -1.119334155e-03f, -1.215029582e-03f, -1.116384110e-03f, -7.248622545e-04f, +6.512622063e-05f, +1.357865606e-03f, +3.246476168e-03f, +5.802374380e-03f, +9.065047940e-03f, +1.303322708e-02f, +1.765850416e-02f, +2.284230321e-02f, +2.843683849e-02f, +3.425034762e-02f, +4.005647599e-02f, +4.560726646e-02f, +5.064881970e-02f, +5.493837952e-02f, +5.826140268e-02f, +6.044711838e-02f, +6.138118026e-02f, +6.101425507e-02f, +5.936575502e-02f, +5.652236728e-02f, +5.263151721e-02f, +4.789037086e-02f, +4.253138664e-02f, +3.680572465e-02f, +3.096598422e-02f, +2.524975236e-02f, +1.986531004e-02f, +1.498057911e-02f, +1.071603260e-02f, +7.141878015e-03f, +4.279402031e-03f, +2.105983236e-03f, +5.629730153e-04f, -4.345562356e-04f, -9.872789584e-04f, -1.201347182e-03f, -1.179289092e-03f, -1.012757683e-03f, -7.775403796e-04f, -5.309554459e-04f, -3.114958267e-04f,\n    +6.944696012e-06f, +7.771451312e-06f, +7.370361214e-06f, +5.149718660e-06f, +5.315730174e-07f, -6.977378204e-06f, -1.771084180e-05f, -3.177229965e-05f, -4.897765493e-05f, -6.881963368e-05f, -9.046084446e-05f, -1.127598233e-04f, -1.343310549e-04f, -1.536362162e-04f, -1.691001640e-04f, -1.792419368e-04f, -1.828086792e-04f, -1.788992659e-04f, -1.670646871e-04f, -1.473740055e-04f, -1.204377551e-04f, -8.738472583e-05f, -4.979272550e-05f, -9.578625365e-06f, +3.114276840e-05f, +7.021819019e-05f, +1.056189673e-04f, +1.355924986e-04f, +1.587882379e-04f, +1.743469537e-04f, +1.819458831e-04f, +1.817969543e-04f, +1.745999956e-04f, +1.614572536e-04f, +1.437591249e-04f, +1.230533962e-04f, +1.009112666e-04f, +7.880294129e-05f, +5.799376832e-05f, +3.946900620e-05f, +2.389175254e-05f, +1.159477218e-05f, +2.603385740e-06f, -3.316389466e-06f, -6.592321062e-06f, -7.771936700e-06f, -7.448764252e-06f, -6.196522682e-06f,\n    /*  0, 8 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f,\n    +6.905229076e-06f, +7.761189099e-06f, +7.407324442e-06f, +5.252536049e-06f, +7.174115923e-07f, -6.695130348e-06f, -1.732489835e-05f, -3.128352883e-05f, -4.839658372e-05f, -6.816715673e-05f, -8.976795629e-05f, -1.120662859e-04f, -1.336830254e-04f, -1.530829779e-04f, -1.686902173e-04f, -1.790187932e-04f, -1.828067631e-04f, -1.791403384e-04f, -1.675551786e-04f, -1.481035659e-04f, -1.213792189e-04f, -8.849554918e-05f, -5.101780578e-05f, -1.085426828e-05f, +2.988408757e-05f, +6.904270931e-05f, +1.045866398e-04f, +1.347525789e-04f, +1.581758507e-04f, +1.739809448e-04f, +1.818281164e-04f, +1.819130706e-04f, +1.749215037e-04f, +1.619446962e-04f, +1.443659673e-04f, +1.237302304e-04f, +1.016099164e-04f, +7.948008996e-05f, +5.861380406e-05f, +4.000588521e-05f, +2.432979486e-05f, +1.192842370e-05f, +2.836084140e-06f, -3.174026850e-06f, -6.524720458e-06f, -7.760920964e-06f, -7.475773419e-06f, -6.244486575e-06f,\n    /*  0, 9 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.161334031e-04f, -6.528317079e-04f, -8.997050287e-04f, -1.108931901e-03f, -1.213780598e-03f, -1.130056618e-03f, -7.598979946e-04f, +2.070392152e-06f, +1.260491367e-03f, +3.109489377e-03f, +5.622145579e-03f, +8.840221830e-03f, +1.276521300e-02f, +1.735178496e-02f, +2.250451283e-02f, +2.807857776e-02f, +3.388473218e-02f, +3.969843638e-02f, +4.527264659e-02f, +5.035334212e-02f, +5.469656255e-02f, +5.808552240e-02f, +6.034630785e-02f, +6.136074737e-02f, +6.107528192e-02f, +5.950501592e-02f, +5.673257289e-02f, +5.290186229e-02f, +4.820733494e-02f, +4.287971454e-02f, +3.716949865e-02f, +3.132969425e-02f, +2.559927386e-02f, +2.018871199e-02f, +1.526870420e-02f, +1.096281623e-02f, +7.344399198e-03f, +4.437685062e-03f, +2.222590809e-03f, +6.424479067e-04f, -3.863346882e-04f, -9.637557625e-04f, -1.195907712e-03f, -1.185779509e-03f, -1.025874724e-03f, -7.930732373e-04f, -5.458799835e-04f, -3.239368359e-04f,\n    +6.865118852e-06f, +7.749749481e-06f, +7.442528130e-06f, +5.353022246e-06f, +9.004273601e-07f, -6.416043006e-06f, -1.694222924e-05f, -3.079786504e-05f, -4.781813497e-05f, -6.751649231e-05f, -8.907576968e-05f, -1.113720959e-04f, -1.330328344e-04f, -1.525260286e-04f, -1.682750973e-04f, -1.787892338e-04f, -1.827975304e-04f, -1.793736353e-04f, -1.680379435e-04f, -1.488259813e-04f, -1.223146305e-04f, -8.960185788e-05f, -5.224024653e-05f, -1.212934627e-05f, +2.862385418e-05f, +6.786367609e-05f, +1.035490276e-04f, +1.339060344e-04f, +1.575559798e-04f, +1.736071204e-04f, +1.817027291e-04f, +1.820222430e-04f, +1.752371429e-04f, +1.624276316e-04f, +1.449698222e-04f, +1.244056229e-04f, +1.023085737e-04f, +8.015849554e-05f, +5.923607174e-05f, +4.054565455e-05f, +2.477106051e-05f, +1.226532812e-05f, +3.071808559e-06f, -3.029057220e-06f, -6.455051086e-06f, -7.748421147e-06f, -7.501864540e-06f, -6.292028226e-06f,\n    /*  0,10 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f,\n    +6.824380746e-06f, +7.737150143e-06f, +7.475990650e-06f, +5.451194286e-06f, +1.080633738e-06f, -6.140108674e-06f, -1.656283491e-05f, -3.031531818e-05f, -4.724232877e-05f, -6.686767051e-05f, -8.838432342e-05f, -1.106772984e-04f, -1.323805306e-04f, -1.519654159e-04f, -1.678548470e-04f, -1.785532927e-04f, -1.827810030e-04f, -1.795991635e-04f, -1.685129721e-04f, -1.495412255e-04f, -1.232439486e-04f, -9.070359815e-05f, -5.345998535e-05f, -1.340379299e-05f, +2.736213345e-05f, +6.668114971e-05f, +1.025061794e-04f, +1.330529000e-04f, +1.569286442e-04f, +1.732254828e-04f, +1.815697075e-04f, +1.821244437e-04f, +1.755468747e-04f, +1.629060141e-04f, +1.455706410e-04f, +1.250795263e-04f, +1.030071957e-04f, +8.083812284e-05f, +5.986054554e-05f, +4.108829861e-05f, +2.521554387e-05f, +1.260548869e-05f, +3.310569361e-06f, -2.881465290e-06f, -6.383295056e-06f, -7.734418951e-06f, -7.527020764e-06f, -6.339133594e-06f,\n    /*  0,11 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -4.024439035e-04f, -6.373448083e-04f, -8.847865099e-04f, -1.098127684e-03f, -1.211799537e-03f, -1.142612770e-03f, -7.934030588e-04f, -5.904279106e-05f, +1.165430903e-03f, +2.975105214e-03f, +5.444685486e-03f, +8.618172436e-03f, +1.249979964e-02f, +1.704729352e-02f, +2.216838289e-02f, +2.772123523e-02f, +3.351915364e-02f, +3.933946359e-02f, +4.493609568e-02f, +5.005497492e-02f, +5.445100397e-02f, +5.790521695e-02f, +6.024060761e-02f, +6.133521423e-02f, +6.113126791e-02f, +5.963956075e-02f, +5.693862809e-02f, +5.316882122e-02f, +4.852181957e-02f, +4.322654714e-02f, +3.753277109e-02f, +3.169384093e-02f, +2.595005788e-02f, +2.051404564e-02f, +1.555924466e-02f, +1.121230138e-02f, +7.549714967e-03f, +4.598681680e-03f, +2.341687426e-03f, +7.240818599e-04f, -3.363480838e-04f, -9.388849457e-04f, -1.189525335e-03f, -1.191690031e-03f, -1.038713070e-03f, -8.085560774e-04f, -5.609088688e-04f, -3.365679977e-04f,\n    +6.783030070e-06f, +7.723408718e-06f, +7.507730380e-06f, +5.547069277e-06f, +1.258044290e-06f, -5.867319628e-06f, -1.618671553e-05f, -2.983589784e-05f, -4.666918493e-05f, -6.622072111e-05f, -8.769365605e-05f, -1.099819384e-04f, -1.317261621e-04f, -1.514011878e-04f, -1.674295098e-04f, -1.783110046e-04f, -1.827572033e-04f, -1.798169304e-04f, -1.689802556e-04f, -1.502492729e-04f, -1.241671324e-04f, -9.180071650e-05f, -5.467696004e-05f, -1.467754219e-05f, +2.609899070e-05f, +6.549518960e-05f, +1.014581444e-04f, +1.321932110e-04f, +1.562938633e-04f, +1.728360349e-04f, +1.814290384e-04f, +1.822196454e-04f, +1.758506607e-04f, +1.633797983e-04f, +1.461683752e-04f, +1.257518931e-04f, +1.037057395e-04f, +8.151893637e-05f, +6.048719935e-05f, +4.163380147e-05f, +2.566323901e-05f, +1.294890841e-05f, +3.552376721e-06f, -2.731235893e-06f, -6.309434527e-06f, -7.718896060e-06f, -7.551225169e-06f, -6.385788534e-06f,\n    /*  0,12 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f,\n    +6.741082046e-06f, +7.708542790e-06f, +7.537765705e-06f, +5.640664402e-06f, +1.432672729e-06f, -5.597667930e-06f, -1.581387101e-05f, -2.935961333e-05f, -4.609872289e-05f, -6.557567358e-05f, -8.700380586e-05f, -1.092860609e-04f, -1.310697774e-04f, -1.508333922e-04f, -1.669991291e-04f, -1.780624044e-04f, -1.827261540e-04f, -1.800269439e-04f, -1.694397852e-04f, -1.509500984e-04f, -1.250841413e-04f, -9.289315982e-05f, -5.589110862e-05f, -1.595052764e-05f, +2.483449136e-05f, +6.430585546e-05f, +1.004049721e-04f, +1.313270034e-04f, +1.556516572e-04f, +1.724387800e-04f, +1.812807091e-04f, +1.823078213e-04f, +1.761484629e-04f, +1.638489388e-04f, +1.467629763e-04f, +1.264226756e-04f, +1.044041619e-04f, +8.220090042e-05f, +6.111600674e-05f, +4.218214685e-05f, +2.611413971e-05f, +1.329559004e-05f, +3.797240619e-06f, -2.578353981e-06f, -6.233451705e-06f, -7.701834142e-06f, -7.574460766e-06f, -6.431978801e-06f,\n    /*  0,13 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.889197914e-04f, -6.219128568e-04f, -8.697410138e-04f, -1.086939950e-03f, -1.209108819e-03f, -1.154077757e-03f, -8.254036453e-04f, -1.182383022e-04f, +1.072662996e-03f, +2.843308820e-03f, +5.269988024e-03f, +8.398904437e-03f, +1.223700370e-02f, +1.674505894e-02f, +2.183395425e-02f, +2.736486182e-02f, +3.315367029e-02f, +3.897961971e-02f, +4.459767564e-02f, +4.975377555e-02f, +5.420175269e-02f, +5.772052307e-02f, +6.013003955e-02f, +6.130458616e-02f, +6.118220139e-02f, +5.976936179e-02f, +5.714049121e-02f, +5.343234143e-02f, +4.883376509e-02f, +4.357182196e-02f, +3.789548084e-02f, +3.205836840e-02f, +2.630205700e-02f, +2.084127438e-02f, +1.585217601e-02f, +1.146447595e-02f, +7.757824868e-03f, +4.762401517e-03f, +2.463290632e-03f, +8.078978082e-04f, -2.845707051e-04f, -9.126404473e-04f, -1.182175717e-03f, -1.196999621e-03f, -1.051255956e-03f, -8.239768076e-04f, -5.760345548e-04f, -3.493857651e-04f,\n    +6.698551799e-06f, +7.692569891e-06f, +7.566115013e-06f, +5.731996914e-06f, +1.604532908e-06f, -5.331145428e-06f, -1.544430097e-05f, -2.888647360e-05f, -4.553096181e-05f, -6.493255712e-05f, -8.631481091e-05f, -1.085897106e-04f, -1.304114247e-04f, -1.502620772e-04f, -1.665637486e-04f, -1.778075273e-04f, -1.826878783e-04f, -1.802292123e-04f, -1.698915531e-04f, -1.516436772e-04f, -1.259949353e-04f, -9.398087530e-05f, -5.710236930e-05f, -1.722268318e-05f, +2.356870096e-05f, +6.311320721e-05f, +9.934671235e-05f, +1.304543135e-04f, +1.550020465e-04f, +1.720337218e-04f, +1.811247071e-04f, +1.823889449e-04f, +1.764402438e-04f, +1.643133904e-04f, +1.473543959e-04f, +1.270918263e-04f, +1.051024197e-04f, +8.288397896e-05f, +6.174694096e-05f, +4.273331820e-05f, +2.656823942e-05f, +1.364553606e-05f, +4.045170841e-06f, -2.422804631e-06f, -6.155328848e-06f, -7.683214852e-06f, -7.596710501e-06f, -6.477690047e-06f,\n    /*  0,14 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f,\n    +6.655454364e-06f, +7.675507496e-06f, +7.592796692e-06f, +5.821084136e-06f, +1.773638826e-06f, -5.067743758e-06f, -1.507800476e-05f, -2.841648733e-05f, -4.496592050e-05f, -6.429140060e-05f, -8.562670900e-05f, -1.078929320e-04f, -1.297511522e-04f, -1.496872908e-04f, -1.661234121e-04f, -1.775464088e-04f, -1.826423998e-04f, -1.804237446e-04f, -1.703355517e-04f, -1.523299854e-04f, -1.268994749e-04f, -9.506381053e-05f, -5.831068052e-05f, -1.849394269e-05f, +2.230168514e-05f, +6.191730505e-05f, +9.828341550e-05f, +1.295751782e-04f, +1.543450521e-04f, +1.716208647e-04f, +1.809610208e-04f, +1.824629900e-04f, +1.767259657e-04f, +1.647731083e-04f, +1.479425855e-04f, +1.277592971e-04f, +1.058004694e-04f, +8.356813575e-05f, +6.237997497e-05f, +4.328729862e-05f, +2.702553133e-05f, +1.399874871e-05f, +4.296176977e-06f, -2.264573046e-06f, -6.075048267e-06f, -7.663019833e-06f, -7.617957255e-06f, -6.522907823e-06f,\n    /*  0,15 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.755657852e-04f, -6.065447794e-04f, -8.545821021e-04f, -1.075386869e-03f, -1.205730648e-03f, -1.164476647e-03f, -8.559259511e-04f, -1.755412632e-04f, +9.821661133e-04f, +2.714084862e-03f, +5.098046504e-03f, +8.182421794e-03f, +1.197684112e-02f, +1.644510957e-02f, +2.150126709e-02f, +2.700950789e-02f, +3.278834001e-02f, +3.861896676e-02f, +4.425744853e-02f, +4.944980188e-02f, +5.394885828e-02f, +5.753147838e-02f, +6.001462650e-02f, +6.126886953e-02f, +6.122807178e-02f, +5.989439231e-02f, +5.733812134e-02f, +5.369237093e-02f, +4.914311219e-02f, +4.391547655e-02f, +3.825756657e-02f, +3.242322034e-02f, +2.665522321e-02f, +2.117036087e-02f, +1.614747299e-02f, +1.171932707e-02f, +7.968727757e-03f, +4.928853632e-03f, +2.587417548e-03f, +8.939184250e-04f, -2.309769343e-04f, -8.849961625e-04f, -1.173834369e-03f, -1.201686999e-03f, -1.063486334e-03f, -8.393230423e-04f, -5.912492225e-04f, -3.623863630e-04f,\n    +6.611804677e-06f, +7.657373026e-06f, +7.617829132e-06f, +5.907943456e-06f, +1.940004617e-06f, -4.807454348e-06f, -1.471498148e-05f, -2.794966288e-05f, -4.440361746e-05f, -6.365223261e-05f, -8.493953768e-05f, -1.071957695e-04f, -1.290890081e-04f, -1.491090813e-04f, -1.656781636e-04f, -1.772790849e-04f, -1.825897425e-04f, -1.806105501e-04f, -1.707717740e-04f, -1.530089992e-04f, -1.277977209e-04f, -9.614191340e-05f, -5.951598093e-05f, -1.976424015e-05f, +2.103350960e-05f, +6.071820940e-05f, +9.721513218e-05f, +1.286896348e-04f, +1.536806957e-04f, +1.712002137e-04f, +1.807896387e-04f, +1.825299310e-04f, +1.770055917e-04f, +1.652280476e-04f, +1.485274967e-04f, +1.284250404e-04f, +1.064982673e-04f, +8.425333425e-05f, +6.301508140e-05f, +4.384407088e-05f, +2.748600830e-05f, +1.435522994e-05f, +4.550268416e-06f, -2.103644554e-06f, -5.992592328e-06f, -7.641230718e-06f, -7.638183844e-06f, -6.567617582e-06f,\n    /*  0,16 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f,\n    +6.567617582e-06f, +7.638183844e-06f, +7.641230718e-06f, +5.992592328e-06f, +2.103644554e-06f, -4.550268416e-06f, -1.435522994e-05f, -2.748600830e-05f, -4.384407088e-05f, -6.301508140e-05f, -8.425333425e-05f, -1.064982673e-04f, -1.284250404e-04f, -1.485274967e-04f, -1.652280476e-04f, -1.770055917e-04f, -1.825299310e-04f, -1.807896387e-04f, -1.712002137e-04f, -1.536806957e-04f, -1.286896348e-04f, -9.721513218e-05f, -6.071820940e-05f, -2.103350960e-05f, +1.976424015e-05f, +5.951598093e-05f, +9.614191340e-05f, +1.277977209e-04f, +1.530089992e-04f, +1.707717740e-04f, +1.806105501e-04f, +1.825897425e-04f, +1.772790849e-04f, +1.656781636e-04f, +1.491090813e-04f, +1.290890081e-04f, +1.071957695e-04f, +8.493953768e-05f, +6.365223261e-05f, +4.440361746e-05f, +2.794966288e-05f, +1.471498148e-05f, +4.807454348e-06f, -1.940004617e-06f, -5.907943456e-06f, -7.617829132e-06f, -7.657373026e-06f, -6.611804677e-06f,\n    /*  0,17 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.623863630e-04f, -5.912492225e-04f, -8.393230423e-04f, -1.063486334e-03f, -1.201686999e-03f, -1.173834369e-03f, -8.849961625e-04f, -2.309769343e-04f, +8.939184250e-04f, +2.587417548e-03f, +4.928853632e-03f, +7.968727757e-03f, +1.171932707e-02f, +1.614747299e-02f, +2.117036087e-02f, +2.665522321e-02f, +3.242322034e-02f, +3.825756657e-02f, +4.391547655e-02f, +4.914311219e-02f, +5.369237093e-02f, +5.733812134e-02f, +5.989439231e-02f, +6.122807178e-02f, +6.126886953e-02f, +6.001462650e-02f, +5.753147838e-02f, +5.394885828e-02f, +4.944980188e-02f, +4.425744853e-02f, +3.861896676e-02f, +3.278834001e-02f, +2.700950789e-02f, +2.150126709e-02f, +1.644510957e-02f, +1.197684112e-02f, +8.182421794e-03f, +5.098046504e-03f, +2.714084862e-03f, +9.821661133e-04f, -1.755412632e-04f, -8.559259511e-04f, -1.164476647e-03f, -1.205730648e-03f, -1.075386869e-03f, -8.545821021e-04f, -6.065447794e-04f, -3.755657852e-04f,\n    +6.522907823e-06f, +7.617957255e-06f, +7.663019833e-06f, +6.075048267e-06f, +2.264573046e-06f, -4.296176977e-06f, -1.399874871e-05f, -2.702553133e-05f, -4.328729862e-05f, -6.237997497e-05f, -8.356813575e-05f, -1.058004694e-04f, -1.277592971e-04f, -1.479425855e-04f, -1.647731083e-04f, -1.767259657e-04f, -1.824629900e-04f, -1.809610208e-04f, -1.716208647e-04f, -1.543450521e-04f, -1.295751782e-04f, -9.828341550e-05f, -6.191730505e-05f, -2.230168514e-05f, +1.849394269e-05f, +5.831068052e-05f, +9.506381053e-05f, +1.268994749e-04f, +1.523299854e-04f, +1.703355517e-04f, +1.804237446e-04f, +1.826423998e-04f, +1.775464088e-04f, +1.661234121e-04f, +1.496872908e-04f, +1.297511522e-04f, +1.078929320e-04f, +8.562670900e-05f, +6.429140060e-05f, +4.496592050e-05f, +2.841648733e-05f, +1.507800476e-05f, +5.067743758e-06f, -1.773638826e-06f, -5.821084136e-06f, -7.592796692e-06f, -7.675507496e-06f, -6.655454364e-06f,\n    /*  0,18 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f,\n    +6.477690047e-06f, +7.596710501e-06f, +7.683214852e-06f, +6.155328848e-06f, +2.422804631e-06f, -4.045170841e-06f, -1.364553606e-05f, -2.656823942e-05f, -4.273331820e-05f, -6.174694096e-05f, -8.288397896e-05f, -1.051024197e-04f, -1.270918263e-04f, -1.473543959e-04f, -1.643133904e-04f, -1.764402438e-04f, -1.823889449e-04f, -1.811247071e-04f, -1.720337218e-04f, -1.550020465e-04f, -1.304543135e-04f, -9.934671235e-05f, -6.311320721e-05f, -2.356870096e-05f, +1.722268318e-05f, +5.710236930e-05f, +9.398087530e-05f, +1.259949353e-04f, +1.516436772e-04f, +1.698915531e-04f, +1.802292123e-04f, +1.826878783e-04f, +1.778075273e-04f, +1.665637486e-04f, +1.502620772e-04f, +1.304114247e-04f, +1.085897106e-04f, +8.631481091e-05f, +6.493255712e-05f, +4.553096181e-05f, +2.888647360e-05f, +1.544430097e-05f, +5.331145428e-06f, -1.604532908e-06f, -5.731996914e-06f, -7.566115013e-06f, -7.692569891e-06f, -6.698551799e-06f,\n    /*  0,19 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.493857651e-04f, -5.760345548e-04f, -8.239768076e-04f, -1.051255956e-03f, -1.196999621e-03f, -1.182175717e-03f, -9.126404473e-04f, -2.845707051e-04f, +8.078978082e-04f, +2.463290632e-03f, +4.762401517e-03f, +7.757824868e-03f, +1.146447595e-02f, +1.585217601e-02f, +2.084127438e-02f, +2.630205700e-02f, +3.205836840e-02f, +3.789548084e-02f, +4.357182196e-02f, +4.883376509e-02f, +5.343234143e-02f, +5.714049121e-02f, +5.976936179e-02f, +6.118220139e-02f, +6.130458616e-02f, +6.013003955e-02f, +5.772052307e-02f, +5.420175269e-02f, +4.975377555e-02f, +4.459767564e-02f, +3.897961971e-02f, +3.315367029e-02f, +2.736486182e-02f, +2.183395425e-02f, +1.674505894e-02f, +1.223700370e-02f, +8.398904437e-03f, +5.269988024e-03f, +2.843308820e-03f, +1.072662996e-03f, -1.182383022e-04f, -8.254036453e-04f, -1.154077757e-03f, -1.209108819e-03f, -1.086939950e-03f, -8.697410138e-04f, -6.219128568e-04f, -3.889197914e-04f,\n    +6.431978801e-06f, +7.574460766e-06f, +7.701834142e-06f, +6.233451705e-06f, +2.578353981e-06f, -3.797240619e-06f, -1.329559004e-05f, -2.611413971e-05f, -4.218214685e-05f, -6.111600674e-05f, -8.220090042e-05f, -1.044041619e-04f, -1.264226756e-04f, -1.467629763e-04f, -1.638489388e-04f, -1.761484629e-04f, -1.823078213e-04f, -1.812807091e-04f, -1.724387800e-04f, -1.556516572e-04f, -1.313270034e-04f, -1.004049721e-04f, -6.430585546e-05f, -2.483449136e-05f, +1.595052764e-05f, +5.589110862e-05f, +9.289315982e-05f, +1.250841413e-04f, +1.509500984e-04f, +1.694397852e-04f, +1.800269439e-04f, +1.827261540e-04f, +1.780624044e-04f, +1.669991291e-04f, +1.508333922e-04f, +1.310697774e-04f, +1.092860609e-04f, +8.700380586e-05f, +6.557567358e-05f, +4.609872289e-05f, +2.935961333e-05f, +1.581387101e-05f, +5.597667930e-06f, -1.432672729e-06f, -5.640664402e-06f, -7.537765705e-06f, -7.708542790e-06f, -6.741082046e-06f,\n    /*  0,20 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f,\n    +6.385788534e-06f, +7.551225169e-06f, +7.718896060e-06f, +6.309434527e-06f, +2.731235893e-06f, -3.552376721e-06f, -1.294890841e-05f, -2.566323901e-05f, -4.163380147e-05f, -6.048719935e-05f, -8.151893637e-05f, -1.037057395e-04f, -1.257518931e-04f, -1.461683752e-04f, -1.633797983e-04f, -1.758506607e-04f, -1.822196454e-04f, -1.814290384e-04f, -1.728360349e-04f, -1.562938633e-04f, -1.321932110e-04f, -1.014581444e-04f, -6.549518960e-05f, -2.609899070e-05f, +1.467754219e-05f, +5.467696004e-05f, +9.180071650e-05f, +1.241671324e-04f, +1.502492729e-04f, +1.689802556e-04f, +1.798169304e-04f, +1.827572033e-04f, +1.783110046e-04f, +1.674295098e-04f, +1.514011878e-04f, +1.317261621e-04f, +1.099819384e-04f, +8.769365605e-05f, +6.622072111e-05f, +4.666918493e-05f, +2.983589784e-05f, +1.618671553e-05f, +5.867319628e-06f, -1.258044290e-06f, -5.547069277e-06f, -7.507730380e-06f, -7.723408718e-06f, -6.783030070e-06f,\n    /*  0,21 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.365679977e-04f, -5.609088688e-04f, -8.085560774e-04f, -1.038713070e-03f, -1.191690031e-03f, -1.189525335e-03f, -9.388849457e-04f, -3.363480838e-04f, +7.240818599e-04f, +2.341687426e-03f, +4.598681680e-03f, +7.549714967e-03f, +1.121230138e-02f, +1.555924466e-02f, +2.051404564e-02f, +2.595005788e-02f, +3.169384093e-02f, +3.753277109e-02f, +4.322654714e-02f, +4.852181957e-02f, +5.316882122e-02f, +5.693862809e-02f, +5.963956075e-02f, +6.113126791e-02f, +6.133521423e-02f, +6.024060761e-02f, +5.790521695e-02f, +5.445100397e-02f, +5.005497492e-02f, +4.493609568e-02f, +3.933946359e-02f, +3.351915364e-02f, +2.772123523e-02f, +2.216838289e-02f, +1.704729352e-02f, +1.249979964e-02f, +8.618172436e-03f, +5.444685486e-03f, +2.975105214e-03f, +1.165430903e-03f, -5.904279106e-05f, -7.934030588e-04f, -1.142612770e-03f, -1.211799537e-03f, -1.098127684e-03f, -8.847865099e-04f, -6.373448083e-04f, -4.024439035e-04f,\n    +6.339133594e-06f, +7.527020764e-06f, +7.734418951e-06f, +6.383295056e-06f, +2.881465290e-06f, -3.310569361e-06f, -1.260548869e-05f, -2.521554387e-05f, -4.108829861e-05f, -5.986054554e-05f, -8.083812284e-05f, -1.030071957e-04f, -1.250795263e-04f, -1.455706410e-04f, -1.629060141e-04f, -1.755468747e-04f, -1.821244437e-04f, -1.815697075e-04f, -1.732254828e-04f, -1.569286442e-04f, -1.330529000e-04f, -1.025061794e-04f, -6.668114971e-05f, -2.736213345e-05f, +1.340379299e-05f, +5.345998535e-05f, +9.070359815e-05f, +1.232439486e-04f, +1.495412255e-04f, +1.685129721e-04f, +1.795991635e-04f, +1.827810030e-04f, +1.785532927e-04f, +1.678548470e-04f, +1.519654159e-04f, +1.323805306e-04f, +1.106772984e-04f, +8.838432342e-05f, +6.686767051e-05f, +4.724232877e-05f, +3.031531818e-05f, +1.656283491e-05f, +6.140108674e-06f, -1.080633738e-06f, -5.451194286e-06f, -7.475990650e-06f, -7.737150143e-06f, -6.824380746e-06f,\n    /*  0,22 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f,\n    +6.292028226e-06f, +7.501864540e-06f, +7.748421147e-06f, +6.455051086e-06f, +3.029057220e-06f, -3.071808559e-06f, -1.226532812e-05f, -2.477106051e-05f, -4.054565455e-05f, -5.923607174e-05f, -8.015849554e-05f, -1.023085737e-04f, -1.244056229e-04f, -1.449698222e-04f, -1.624276316e-04f, -1.752371429e-04f, -1.820222430e-04f, -1.817027291e-04f, -1.736071204e-04f, -1.575559798e-04f, -1.339060344e-04f, -1.035490276e-04f, -6.786367609e-05f, -2.862385418e-05f, +1.212934627e-05f, +5.224024653e-05f, +8.960185788e-05f, +1.223146305e-04f, +1.488259813e-04f, +1.680379435e-04f, +1.793736353e-04f, +1.827975304e-04f, +1.787892338e-04f, +1.682750973e-04f, +1.525260286e-04f, +1.330328344e-04f, +1.113720959e-04f, +8.907576968e-05f, +6.751649231e-05f, +4.781813497e-05f, +3.079786504e-05f, +1.694222924e-05f, +6.416043006e-06f, -9.004273601e-07f, -5.353022246e-06f, -7.442528130e-06f, -7.749749481e-06f, -6.865118852e-06f,\n    /*  0,23 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.239368359e-04f, -5.458799835e-04f, -7.930732373e-04f, -1.025874724e-03f, -1.185779509e-03f, -1.195907712e-03f, -9.637557625e-04f, -3.863346882e-04f, +6.424479067e-04f, +2.222590809e-03f, +4.437685062e-03f, +7.344399198e-03f, +1.096281623e-02f, +1.526870420e-02f, +2.018871199e-02f, +2.559927386e-02f, +3.132969425e-02f, +3.716949865e-02f, +4.287971454e-02f, +4.820733494e-02f, +5.290186229e-02f, +5.673257289e-02f, +5.950501592e-02f, +6.107528192e-02f, +6.136074737e-02f, +6.034630785e-02f, +5.808552240e-02f, +5.469656255e-02f, +5.035334212e-02f, +4.527264659e-02f, +3.969843638e-02f, +3.388473218e-02f, +2.807857776e-02f, +2.250451283e-02f, +1.735178496e-02f, +1.276521300e-02f, +8.840221830e-03f, +5.622145579e-03f, +3.109489377e-03f, +1.260491367e-03f, +2.070392152e-06f, -7.598979946e-04f, -1.130056618e-03f, -1.213780598e-03f, -1.108931901e-03f, -8.997050287e-04f, -6.528317079e-04f, -4.161334031e-04f,\n    +6.244486575e-06f, +7.475773419e-06f, +7.760920964e-06f, +6.524720458e-06f, +3.174026850e-06f, -2.836084140e-06f, -1.192842370e-05f, -2.432979486e-05f, -4.000588521e-05f, -5.861380406e-05f, -7.948008996e-05f, -1.016099164e-04f, -1.237302304e-04f, -1.443659673e-04f, -1.619446962e-04f, -1.749215037e-04f, -1.819130706e-04f, -1.818281164e-04f, -1.739809448e-04f, -1.581758507e-04f, -1.347525789e-04f, -1.045866398e-04f, -6.904270931e-05f, -2.988408757e-05f, +1.085426828e-05f, +5.101780578e-05f, +8.849554918e-05f, +1.213792189e-04f, +1.481035659e-04f, +1.675551786e-04f, +1.791403384e-04f, +1.828067631e-04f, +1.790187932e-04f, +1.686902173e-04f, +1.530829779e-04f, +1.336830254e-04f, +1.120662859e-04f, +8.976795629e-05f, +6.816715673e-05f, +4.839658372e-05f, +3.128352883e-05f, +1.732489835e-05f, +6.695130348e-06f, -7.174115923e-07f, -5.252536049e-06f, -7.407324442e-06f, -7.761189099e-06f, -6.905229076e-06f,\n    /*  0,24 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f,\n    +6.196522682e-06f, +7.448764252e-06f, +7.771936700e-06f, +6.592321062e-06f, +3.316389466e-06f, -2.603385740e-06f, -1.159477218e-05f, -2.389175254e-05f, -3.946900620e-05f, -5.799376832e-05f, -7.880294129e-05f, -1.009112666e-04f, -1.230533962e-04f, -1.437591249e-04f, -1.614572536e-04f, -1.745999956e-04f, -1.817969543e-04f, -1.819458831e-04f, -1.743469537e-04f, -1.587882379e-04f, -1.355924986e-04f, -1.056189673e-04f, -7.021819019e-05f, -3.114276840e-05f, +9.578625365e-06f, +4.979272550e-05f, +8.738472583e-05f, +1.204377551e-04f, +1.473740055e-04f, +1.670646871e-04f, +1.788992659e-04f, +1.828086792e-04f, +1.792419368e-04f, +1.691001640e-04f, +1.536362162e-04f, +1.343310549e-04f, +1.127598233e-04f, +9.046084446e-05f, +6.881963368e-05f, +4.897765493e-05f, +3.177229965e-05f, +1.771084180e-05f, +6.977378204e-06f, -5.315730174e-07f, -5.149718660e-06f, -7.370361214e-06f, -7.771451312e-06f, -6.944696012e-06f,\n    /*  0,25 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.114958267e-04f, -5.309554459e-04f, -7.775403796e-04f, -1.012757683e-03f, -1.179289092e-03f, -1.201347182e-03f, -9.872789584e-04f, -4.345562356e-04f, +5.629730153e-04f, +2.105983236e-03f, +4.279402031e-03f, +7.141878015e-03f, +1.071603260e-02f, +1.498057911e-02f, +1.986531004e-02f, +2.524975236e-02f, +3.096598422e-02f, +3.680572465e-02f, +4.253138664e-02f, +4.789037086e-02f, +5.263151721e-02f, +5.652236728e-02f, +5.936575502e-02f, +6.101425507e-02f, +6.138118026e-02f, +6.044711838e-02f, +5.826140268e-02f, +5.493837952e-02f, +5.064881970e-02f, +4.560726646e-02f, +4.005647599e-02f, +3.425034762e-02f, +2.843683849e-02f, +2.284230321e-02f, +1.765850416e-02f, +1.303322708e-02f, +9.065047940e-03f, +5.802374380e-03f, +3.246476168e-03f, +1.357865606e-03f, +6.512622063e-05f, -7.248622545e-04f, -1.116384110e-03f, -1.215029582e-03f, -1.119334155e-03f, -9.144827144e-04f, -6.683643483e-04f, -4.299833282e-04f,\n    +6.148150484e-06f, +7.420853824e-06f, +7.781486633e-06f, +6.657870832e-06f, +3.456160473e-06f, -2.373702808e-06f, -1.126437005e-05f, -2.345693889e-05f, -3.893503281e-05f, -5.737599002e-05f, -7.812708446e-05f, -1.002126668e-04f, -1.223751678e-04f, -1.431493437e-04f, -1.609653496e-04f, -1.742726574e-04f, -1.816739221e-04f, -1.820560435e-04f, -1.747051455e-04f, -1.593931230e-04f, -1.364257588e-04f, -1.066459616e-04f, -7.139005983e-05f, -3.239983159e-05f, +8.302483877e-06f, +4.856506828e-05f, +8.626944199e-05f, +1.194902810e-04f, +1.466373266e-04f, +1.665664791e-04f, +1.786504114e-04f, +1.828032572e-04f, +1.794586306e-04f, +1.695048947e-04f, +1.541856957e-04f, +1.349768747e-04f, +1.134526627e-04f, +9.115439517e-05f, +6.947389279e-05f, +4.956132816e-05f, +3.226416726e-05f, +1.810005886e-05f, +7.262793860e-06f, -3.428983692e-07f, -5.044553124e-06f, -7.331620083e-06f, -7.780518386e-06f, -6.983504168e-06f,\n    /*  0,26 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f,\n    +6.099383813e-06f, +7.392058845e-06f, +7.789589021e-06f, +6.721387745e-06f, +3.593355386e-06f, -2.147024604e-06f, -1.093721356e-05f, -2.302535893e-05f, -3.840398002e-05f, -5.676049434e-05f, -7.745255413e-05f, -9.951415924e-05f, -1.216955923e-04f, -1.425366721e-04f, -1.604690300e-04f, -1.739395284e-04f, -1.815440025e-04f, -1.821586121e-04f, -1.750555188e-04f, -1.599904879e-04f, -1.372523257e-04f, -1.076675748e-04f, -7.255825958e-05f, -3.365521214e-05f, +7.025910221e-06f, +4.733489691e-05f, +8.514975212e-05f, +1.185368387e-04f, +1.458935566e-04f, +1.660605652e-04f, +1.783937689e-04f, +1.827904761e-04f, +1.796688410e-04f, +1.699043667e-04f, +1.547313687e-04f, +1.356204362e-04f, +1.141447587e-04f, +9.184856916e-05f, +7.012990339e-05f, +5.014758269e-05f, +3.275912115e-05f, +1.849254854e-05f, +7.551384381e-06f, -1.513745344e-07f, -4.937022566e-06f, -7.291082698e-06f, -7.788372543e-06f, -7.021637960e-06f,\n    /*  0,27 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -2.992482924e-04f, -5.161425332e-04f, -7.619693040e-04f, -9.993784239e-04f, -1.172239576e-03f, -1.205867910e-03f, -1.009480542e-03f, -4.810385334e-04f, +4.856340025e-04f, +1.991846752e-03f, +4.123822392e-03f, +6.942151189e-03f, +1.047196184e-02f, +1.469489309e-02f, +1.954387566e-02f, +2.490154017e-02f, +3.060276630e-02f, +3.644151000e-02f, +4.218162598e-02f, +4.757098725e-02f, +5.235783912e-02f, +5.630805374e-02f, +5.922180670e-02f, +6.094820002e-02f, +6.139650865e-02f, +6.054301834e-02f, +5.843282187e-02f, +5.517640664e-02f, +5.094135058e-02f, +4.593989350e-02f, +4.041352017e-02f, +3.461594135e-02f, +2.879596596e-02f, +2.318171247e-02f, +1.796742122e-02f, +1.330382439e-02f, +9.292645361e-03f, +5.985377344e-03f, +3.386079964e-03f, +1.457574517e-03f, +1.301495090e-04f, -6.882696471e-04f, -1.101569931e-03f, -1.215523855e-03f, -1.129315731e-03f, -9.291054171e-04f, -6.839332393e-04f, -4.439884703e-04f,\n    +6.050236397e-06f, +7.362395954e-06f, +7.796262099e-06f, +6.782889817e-06f, +3.727989835e-06f, -1.923340206e-06f, -1.061329869e-05f, -2.259701741e-05f, -3.787586248e-05f, -5.614730615e-05f, -7.677938468e-05f, -9.881578617e-05f, -1.210147169e-04f, -1.419211588e-04f, -1.599683410e-04f, -1.736006478e-04f, -1.814072243e-04f, -1.822536042e-04f, -1.753980729e-04f, -1.605803153e-04f, -1.380721657e-04f, -1.086837592e-04f, -7.372273107e-05f, -3.490884522e-05f, +5.748970827e-06f, +4.610227435e-05f, +8.402571100e-05f, +1.175774709e-04f, +1.451427229e-04f, +1.655469566e-04f, +1.781293332e-04f, +1.827703153e-04f, +1.798725349e-04f, +1.702985375e-04f, +1.552731878e-04f, +1.362616909e-04f, +1.148360655e-04f, +9.254332692e-05f, +7.078763450e-05f, +5.073639743e-05f, +3.325715046e-05f, +1.888830955e-05f, +7.843156605e-06f, +4.301144525e-08f, -4.827110191e-06f, -7.248730722e-06f, -7.794995958e-06f, -7.059081716e-06f,\n    /*  0,28 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f,\n    +6.000721856e-06f, +7.331881716e-06f, +7.801524077e-06f, +6.842395104e-06f, +3.860079559e-06f, -1.702638511e-06f, -1.029262119e-05f, -2.217191876e-05f, -3.735069452e-05f, -5.553645002e-05f, -7.610761022e-05f, -9.811758948e-05f, -1.203325886e-04f, -1.413028526e-04f, -1.594633288e-04f, -1.732560555e-04f, -1.812636169e-04f, -1.823410354e-04f, -1.757328077e-04f, -1.611625883e-04f, -1.388852458e-04f, -1.096944677e-04f, -7.488341620e-05f, -3.616066610e-05f, +4.471732158e-06f, +4.486726377e-05f, +8.289737375e-05f, +1.166122207e-04f, +1.443848538e-04f, +1.650256649e-04f, +1.778570993e-04f, +1.827427547e-04f, +1.800696793e-04f, +1.706873651e-04f, +1.558111055e-04f, +1.369005902e-04f, +1.155265373e-04f, +9.323862873e-05f, +7.144705488e-05f, +5.132775100e-05f, +3.375824403e-05f, +1.928734033e-05f, +8.138117147e-06f, +2.402723706e-07f, -4.714799292e-06f, -7.204545832e-06f, -7.800370763e-06f, -7.095819678e-06f,\n    /*  0,29 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -2.871973341e-04f, -5.014482555e-04f, -7.463715178e-04f, -9.857531390e-04f, -1.164651507e-03f, -1.209493888e-03f, -1.030386462e-03f, -5.258074696e-04f, +4.104074455e-04f, +1.880162996e-03f, +3.970935397e-03f, +6.745217813e-03f, +1.023061454e-02f, +1.441166908e-02f, +1.922444399e-02f, +2.455468347e-02f, +3.024009546e-02f, +3.607691536e-02f, +4.183049510e-02f, +4.724924434e-02f, +5.208088171e-02f, +5.608967552e-02f, +5.907320056e-02f, +6.087713051e-02f, +6.140672936e-02f, +6.063398788e-02f, +5.859974496e-02f, +5.541059633e-02f, +5.123087815e-02f, +4.627046613e-02f, +4.076950660e-02f, +3.498145442e-02f, +2.915590817e-02f, +2.352269837e-02f, +1.827850552e-02f, +1.357698668e-02f, +9.523007964e-03f, +6.171159300e-03f, +3.528314653e-03f, +1.559638665e-03f, +1.971649035e-04f, -6.500939972e-04f, -1.085588658e-03f, -1.215240571e-03f, -1.138857640e-03f, -9.435586937e-04f, -6.995286060e-04f, -4.581433717e-04f,\n    +5.950853705e-06f, +7.300532620e-06f, +7.805393139e-06f, +6.899921698e-06f, +3.989640402e-06f, -1.484908233e-06f, -9.975176579e-06f, -2.175006713e-05f, -3.682849015e-05f, -5.492795017e-05f, -7.543726457e-05f, -9.741961088e-05f, -1.196492544e-04f, -1.406818019e-04f, -1.589540398e-04f, -1.729057912e-04f, -1.811132097e-04f, -1.824209217e-04f, -1.760597234e-04f, -1.617372905e-04f, -1.396915333e-04f, -1.106996535e-04f, -7.604025715e-05f, -3.741061019e-05f, +3.194260694e-06f, +4.362992850e-05f, +8.176479580e-05f, +1.156411315e-04f, +1.436199778e-04f, +1.644967024e-04f, +1.775770628e-04f, +1.827077745e-04f, +1.802602417e-04f, +1.710708076e-04f, +1.563450745e-04f, +1.375370856e-04f, +1.162161284e-04f, +9.393443463e-05f, +7.210813297e-05f, +5.192162170e-05f, +3.426239038e-05f, +1.968963904e-05f, +8.436272395e-06f, +4.404208828e-07f, -4.600073246e-06f, -7.158509723e-06f, -7.804479049e-06f, -7.131836001e-06f,\n    /*  0,30 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f,\n    +5.900645350e-06f, +7.268365081e-06f, +7.807887439e-06f, +6.955487723e-06f, +4.116688316e-06f, -1.270137912e-06f, -9.660960103e-06f, -2.133146638e-05f, -3.630926307e-05f, -5.432183054e-05f, -7.476838129e-05f, -9.672189189e-05f, -1.189647611e-04f, -1.400580555e-04f, -1.584405205e-04f, -1.725498952e-04f, -1.809560329e-04f, -1.824932796e-04f, -1.763788209e-04f, -1.623044060e-04f, -1.404909963e-04f, -1.116992702e-04f, -7.719319639e-05f, -3.865861306e-05f, +1.916622938e-06f, +4.239033203e-05f, +8.062803289e-05f, +1.146642473e-04f, +1.428481242e-04f, +1.639600817e-04f, +1.772892198e-04f, +1.826653555e-04f, +1.804441899e-04f, +1.714488231e-04f, +1.568750475e-04f, +1.381711284e-04f, +1.169047926e-04f, +9.463070442e-05f, +7.277083693e-05f, +5.251798750e-05f, +3.476957772e-05f, +2.009520355e-05f, +8.737628506e-06f, +6.434694612e-07f, -4.482915520e-06f, -7.110604110e-06f, -7.807302866e-06f, -7.167114757e-06f,\n    /*  0,31 (48) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    -2.753458351e-04f, -4.868793578e-04f, -7.307582372e-04f, -9.718977296e-04f, -1.156545178e-03f, -1.212248935e-03f, -1.050022599e-03f, -5.688890031e-04f, +3.372696922e-04f, +1.770913215e-03f, +3.820729751e-03f, +6.551076310e-03f, +9.992000524e-03f, +1.413092922e-02f, +1.890704943e-02f, +2.420922778e-02f, +2.987802621e-02f, +3.571200116e-02f, +4.147805655e-02f, +4.692520265e-02f, +5.180069918e-02f, +5.586727659e-02f, +5.891996710e-02f, +6.080106129e-02f, +6.141184024e-02f, +6.072000814e-02f, +5.876213779e-02f, +5.564090171e-02f, +5.151734626e-02f, +4.659892291e-02f, +4.112437288e-02f, +3.534682755e-02f, +2.951661261e-02f, +2.386521801e-02f, +1.859172564e-02f, +1.385269489e-02f, +9.756128885e-03f, +6.359724439e-03f, +3.673193623e-03f, +1.664078274e-03f, +2.661968716e-04f, -6.103091546e-04f, -1.068414757e-03f, -1.214156681e-03f, -1.147940629e-03f, -9.578278075e-04f, -7.151403879e-04f, -4.724423225e-04f,\n    +5.850110091e-06f, +7.235395433e-06f, +7.809025104e-06f, +7.009111338e-06f, +4.241239355e-06f, -1.058315911e-06f, -9.349966785e-06f, -2.091612006e-05f, -3.579302665e-05f, -5.371811474e-05f, -7.410099365e-05f, -9.602447380e-05f, -1.182791553e-04f, -1.394316620e-04f, -1.579228174e-04f, -1.721884081e-04f, -1.807921168e-04f, -1.825581262e-04f, -1.766901015e-04f, -1.628639195e-04f, -1.412836031e-04f, -1.126932717e-04f, -7.834217668e-05f, -3.990461040e-05f, +6.388853996e-07f, +4.114853805e-05f, +7.948714106e-05f, +1.136816124e-04f, +1.420693226e-04f, +1.634158161e-04f, +1.769935670e-04f, +1.826154788e-04f, +1.806214921e-04f, +1.718213704e-04f, +1.574009775e-04f, +1.388026701e-04f, +1.175924836e-04f, +9.532739769e-05f, +7.343513463e-05f, +5.311682607e-05f, +3.527979396e-05f, +2.050403146e-05f, +9.042191405e-06f, +8.494304210e-07f, -4.363309672e-06f, -7.060810728e-06f, -7.808824226e-06f, -7.201639933e-06f,\n    /*  1, 0 (48) */\n    -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f,\n    +7.201639933e-06f, +7.808824226e-06f, +7.060810728e-06f, +4.363309672e-06f, -8.494304210e-07f, -9.042191405e-06f, -2.050403146e-05f, -3.527979396e-05f, -5.311682607e-05f, -7.343513463e-05f, -9.532739769e-05f, -1.175924836e-04f, -1.388026701e-04f, -1.574009775e-04f, -1.718213704e-04f, -1.806214921e-04f, -1.826154788e-04f, -1.769935670e-04f, -1.634158161e-04f, -1.420693226e-04f, -1.136816124e-04f, -7.948714106e-05f, -4.114853805e-05f, -6.388853996e-07f, +3.990461040e-05f, +7.834217668e-05f, +1.126932717e-04f, +1.412836031e-04f, +1.628639195e-04f, +1.766901015e-04f, +1.825581262e-04f, +1.807921168e-04f, +1.721884081e-04f, +1.579228174e-04f, +1.394316620e-04f, +1.182791553e-04f, +9.602447380e-05f, +7.410099365e-05f, +5.371811474e-05f, +3.579302665e-05f, +2.091612006e-05f, +9.349966785e-06f, +1.058315911e-06f, -4.241239355e-06f, -7.009111338e-06f, -7.809025104e-06f, -7.235395433e-06f, -5.850110091e-06f,\n    +7.400711575e-04f, +1.375020608e-03f, +2.149280883e-03f, +2.889370620e-03f, +3.314167096e-03f, +3.062969010e-03f, +1.758157367e-03f, -9.035293376e-04f, -5.046849967e-03f, -1.052447103e-02f, -1.686036328e-02f, -2.325321288e-02f, -2.865282346e-02f, -3.190731847e-02f, -3.196179918e-02f, -2.807404400e-02f, -2.000388698e-02f, -8.133017718e-03f, +6.517945993e-03f, +2.238959427e-02f, +3.759199639e-02f, +5.018871167e-02f, +5.850644264e-02f, +6.141247912e-02f, +5.850644264e-02f, +5.018871167e-02f, +3.759199639e-02f, +2.238959427e-02f, +6.517945993e-03f, -8.133017718e-03f, -2.000388698e-02f, -2.807404400e-02f, -3.196179918e-02f, -3.190731847e-02f, -2.865282346e-02f, -2.325321288e-02f, -1.686036328e-02f, -1.052447103e-02f, -5.046849967e-03f, -9.035293376e-04f, +1.758157367e-03f, +3.062969010e-03f, +3.314167096e-03f, +2.889370620e-03f, +2.149280883e-03f, +1.375020608e-03f, +7.400711575e-04f, +3.136419749e-04f,\n    -1.659937380e-05f, -2.256041491e-05f, -2.486780869e-05f, -2.006906889e-05f, -5.045062098e-06f, +2.191765594e-05f, +6.008443510e-05f, +1.055682666e-04f, +1.512517643e-04f, +1.875167265e-04f, +2.037839118e-04f, +1.906528266e-04f, +1.422374703e-04f, +5.817440947e-05f, -5.522355901e-05f, -1.850656642e-04f, -3.133868468e-04f, -4.199011281e-04f, -4.855454817e-04f, -4.961329892e-04f, -4.453540068e-04f, -3.364549421e-04f, -1.821741084e-04f, -2.871243403e-06f, +1.768283313e-04f, +3.322313388e-04f, +4.427876402e-04f, +4.954835019e-04f, +4.867652811e-04f, +4.226610826e-04f, +3.171517381e-04f, +1.892017453e-04f, +5.911498836e-05f, -5.502368951e-05f, -1.401349478e-04f, -1.896917185e-04f, -2.038605671e-04f, -1.883821463e-04f, -1.525821837e-04f, -1.070377027e-04f, -6.142412938e-05f, -2.295246704e-05f, +4.386614560e-06f, +1.976802667e-05f, +2.484354255e-05f, +2.270517913e-05f, +1.680953745e-05f, +1.011663066e-05f,\n    /*  1, 1 (48) */\n    -4.724423225e-04f, -7.151403879e-04f, -9.578278075e-04f, -1.147940629e-03f, -1.214156681e-03f, -1.068414757e-03f, -6.103091546e-04f, +2.661968716e-04f, +1.664078274e-03f, +3.673193623e-03f, +6.359724439e-03f, +9.756128885e-03f, +1.385269489e-02f, +1.859172564e-02f, +2.386521801e-02f, +2.951661261e-02f, +3.534682755e-02f, +4.112437288e-02f, +4.659892291e-02f, +5.151734626e-02f, +5.564090171e-02f, +5.876213779e-02f, +6.072000814e-02f, +6.141184024e-02f, +6.080106129e-02f, +5.891996710e-02f, +5.586727659e-02f, +5.180069918e-02f, +4.692520265e-02f, +4.147805655e-02f, +3.571200116e-02f, +2.987802621e-02f, +2.420922778e-02f, +1.890704943e-02f, +1.413092922e-02f, +9.992000524e-03f, +6.551076310e-03f, +3.820729751e-03f, +1.770913215e-03f, +3.372696922e-04f, -5.688890031e-04f, -1.050022599e-03f, -1.212248935e-03f, -1.156545178e-03f, -9.718977296e-04f, -7.307582372e-04f, -4.868793578e-04f, -2.753458351e-04f,\n    +7.167114757e-06f, +7.807302866e-06f, +7.110604110e-06f, +4.482915520e-06f, -6.434694612e-07f, -8.737628506e-06f, -2.009520355e-05f, -3.476957772e-05f, -5.251798750e-05f, -7.277083693e-05f, -9.463070442e-05f, -1.169047926e-04f, -1.381711284e-04f, -1.568750475e-04f, -1.714488231e-04f, -1.804441899e-04f, -1.826653555e-04f, -1.772892198e-04f, -1.639600817e-04f, -1.428481242e-04f, -1.146642473e-04f, -8.062803289e-05f, -4.239033203e-05f, -1.916622938e-06f, +3.865861306e-05f, +7.719319639e-05f, +1.116992702e-04f, +1.404909963e-04f, +1.623044060e-04f, +1.763788209e-04f, +1.824932796e-04f, +1.809560329e-04f, +1.725498952e-04f, +1.584405205e-04f, +1.400580555e-04f, +1.189647611e-04f, +9.672189189e-05f, +7.476838129e-05f, +5.432183054e-05f, +3.630926307e-05f, +2.133146638e-05f, +9.660960103e-06f, +1.270137912e-06f, -4.116688316e-06f, -6.955487723e-06f, -7.807887439e-06f, -7.268365081e-06f, -5.900645350e-06f,\n    +7.234717837e-04f, +1.352460193e-03f, +2.124413074e-03f, +2.869301551e-03f, +3.309122034e-03f, +3.084886666e-03f, +1.818241802e-03f, -7.979610710e-04f, -4.895598203e-03f, -1.033695430e-02f, -1.665657936e-02f, -2.306256005e-02f, -2.851058599e-02f, -3.184914406e-02f, -3.201702274e-02f, -2.825910966e-02f, -2.031727383e-02f, -8.552918846e-03f, +6.032400511e-03f, +2.189346129e-02f, +3.714664238e-02f, +4.985225673e-02f, +5.832426853e-02f, +6.140960788e-02f, +5.868327097e-02f, +5.052094301e-02f, +3.803478403e-02f, +2.288507778e-02f, +7.004711274e-03f, -7.710356635e-03f, -1.968673524e-02f, -2.788484225e-02f, -3.190268420e-02f, -3.196234216e-02f, -2.879295841e-02f, -2.344290460e-02f, -1.706422384e-02f, -1.071285317e-02f, -5.199432151e-03f, -1.010567040e-03f, +1.696733238e-03f, +3.040016543e-03f, +3.318553711e-03f, +2.909138647e-03f, +2.174124425e-03f, +1.397725787e-03f, +7.568806949e-04f, +3.237586056e-04f,\n    -1.638859383e-05f, -2.241212896e-05f, -2.488511074e-05f, -2.036001099e-05f, -5.691648011e-06f, +2.089404958e-05f, +5.875215808e-05f, +1.040992379e-04f, +1.499122321e-04f, +1.866316842e-04f, +2.036782580e-04f, +1.915790189e-04f, +1.443046239e-04f, +6.129593148e-05f, -5.134861502e-05f, -1.809282955e-04f, -3.096005616e-04f, -4.171008580e-04f, -4.842712606e-04f, -4.967217519e-04f, -4.478628235e-04f, -3.406335909e-04f, -1.874950937e-04f, -8.613337121e-06f, +1.714584810e-04f, +3.279633107e-04f, +4.401639799e-04f, +4.947732413e-04f, +4.879303311e-04f, +4.253801896e-04f, +3.208946069e-04f, +1.933359288e-04f, +6.302241295e-05f, -5.184407396e-05f, -1.379971457e-04f, -1.886955890e-04f, -2.039079747e-04f, -1.892276213e-04f, -1.539031669e-04f, -1.085072808e-04f, -6.277106912e-05f, -2.399841424e-05f, +3.716284432e-06f, +1.945680269e-05f, +2.481220449e-05f, +2.284631865e-05f, +1.701900789e-05f, +1.031543611e-05f,\n    /*  1, 2 (48) */\n    -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f,\n    +7.131836001e-06f, +7.804479049e-06f, +7.158509723e-06f, +4.600073246e-06f, -4.404208828e-07f, -8.436272395e-06f, -1.968963904e-05f, -3.426239038e-05f, -5.192162170e-05f, -7.210813297e-05f, -9.393443463e-05f, -1.162161284e-04f, -1.375370856e-04f, -1.563450745e-04f, -1.710708076e-04f, -1.802602417e-04f, -1.827077745e-04f, -1.775770628e-04f, -1.644967024e-04f, -1.436199778e-04f, -1.156411315e-04f, -8.176479580e-05f, -4.362992850e-05f, -3.194260694e-06f, +3.741061019e-05f, +7.604025715e-05f, +1.106996535e-04f, +1.396915333e-04f, +1.617372905e-04f, +1.760597234e-04f, +1.824209217e-04f, +1.811132097e-04f, +1.729057912e-04f, +1.589540398e-04f, +1.406818019e-04f, +1.196492544e-04f, +9.741961088e-05f, +7.543726457e-05f, +5.492795017e-05f, +3.682849015e-05f, +2.175006713e-05f, +9.975176579e-06f, +1.484908233e-06f, -3.989640402e-06f, -6.899921698e-06f, -7.805393139e-06f, -7.300532620e-06f, -5.950853705e-06f,\n    +7.070831898e-04f, +1.330048064e-03f, +2.099527963e-03f, +2.848941540e-03f, +3.303430386e-03f, +3.105780715e-03f, +1.876993960e-03f, -6.938618331e-04f, -4.745685971e-03f, -1.015032262e-02f, -1.645290111e-02f, -2.287098103e-02f, -2.836628136e-02f, -3.178784813e-02f, -3.206837136e-02f, -2.844003796e-02f, -2.062687439e-02f, -8.970019704e-03f, +5.548129250e-03f, +2.139673953e-02f, +3.669877956e-02f, +4.951162314e-02f, +5.813677344e-02f, +6.140099454e-02f, +5.885472945e-02f, +5.084890632e-02f, +3.847494801e-02f, +2.337985102e-02f, +7.492641605e-03f, -7.284976446e-03f, -1.936584064e-02f, -2.769150633e-02f, -3.183966178e-02f, -3.201418624e-02f, -2.893095555e-02f, -2.363160019e-02f, -1.726813182e-02f, -1.090208080e-02f, -5.353335318e-03f, -1.119074321e-03f, +1.633962169e-03f, +3.016018128e-03f, +3.322269995e-03f, +2.928595450e-03f, +2.198936630e-03f, +1.420572106e-03f, +7.738997028e-04f, +3.340740417e-04f,\n    -1.617727343e-05f, -2.226042371e-05f, -2.489555680e-05f, -2.064093598e-05f, -6.326395649e-06f, +1.988171347e-05f, +5.742746693e-05f, +1.026308797e-04f, +1.485639094e-04f, +1.857273426e-04f, +2.035438583e-04f, +1.924704065e-04f, +1.463363255e-04f, +6.438795966e-05f, -4.749064148e-05f, -1.767902467e-04f, -3.057935123e-04f, -4.142608086e-04f, -4.829429533e-04f, -4.972498479e-04f, -4.503138436e-04f, -3.447667631e-04f, -1.927905726e-04f, -1.435425164e-05f, +1.660652804e-04f, +3.236513949e-04f, +4.374832914e-04f, +4.940021681e-04f, +4.890403118e-04f, +4.280579225e-04f, +3.246148259e-04f, +1.974676028e-04f, +6.694533766e-05f, -4.863587167e-05f, -1.358241603e-04f, -1.876643381e-04f, -2.039258891e-04f, -1.900528304e-04f, -1.552143899e-04f, -1.099767330e-04f, -6.412507928e-05f, -2.505542575e-05f, +3.034053170e-06f, +1.913531668e-05f, +2.477368699e-05f, +2.298372996e-05f, +1.722770722e-05f, +1.051543136e-05f,\n    /*  1, 3 (48) */\n    -4.581433717e-04f, -6.995286060e-04f, -9.435586937e-04f, -1.138857640e-03f, -1.215240571e-03f, -1.085588658e-03f, -6.500939972e-04f, +1.971649035e-04f, +1.559638665e-03f, +3.528314653e-03f, +6.171159300e-03f, +9.523007964e-03f, +1.357698668e-02f, +1.827850552e-02f, +2.352269837e-02f, +2.915590817e-02f, +3.498145442e-02f, +4.076950660e-02f, +4.627046613e-02f, +5.123087815e-02f, +5.541059633e-02f, +5.859974496e-02f, +6.063398788e-02f, +6.140672936e-02f, +6.087713051e-02f, +5.907320056e-02f, +5.608967552e-02f, +5.208088171e-02f, +4.724924434e-02f, +4.183049510e-02f, +3.607691536e-02f, +3.024009546e-02f, +2.455468347e-02f, +1.922444399e-02f, +1.441166908e-02f, +1.023061454e-02f, +6.745217813e-03f, +3.970935397e-03f, +1.880162996e-03f, +4.104074455e-04f, -5.258074696e-04f, -1.030386462e-03f, -1.209493888e-03f, -1.164651507e-03f, -9.857531390e-04f, -7.463715178e-04f, -5.014482555e-04f, -2.871973341e-04f,\n    +7.095819678e-06f, +7.800370763e-06f, +7.204545832e-06f, +4.714799292e-06f, -2.402723706e-07f, -8.138117147e-06f, -1.928734033e-05f, -3.375824403e-05f, -5.132775100e-05f, -7.144705488e-05f, -9.323862873e-05f, -1.155265373e-04f, -1.369005902e-04f, -1.558111055e-04f, -1.706873651e-04f, -1.800696793e-04f, -1.827427547e-04f, -1.778570993e-04f, -1.650256649e-04f, -1.443848538e-04f, -1.166122207e-04f, -8.289737375e-05f, -4.486726377e-05f, -4.471732158e-06f, +3.616066610e-05f, +7.488341620e-05f, +1.096944677e-04f, +1.388852458e-04f, +1.611625883e-04f, +1.757328077e-04f, +1.823410354e-04f, +1.812636169e-04f, +1.732560555e-04f, +1.594633288e-04f, +1.413028526e-04f, +1.203325886e-04f, +9.811758948e-05f, +7.610761022e-05f, +5.553645002e-05f, +3.735069452e-05f, +2.217191876e-05f, +1.029262119e-05f, +1.702638511e-06f, -3.860079559e-06f, -6.842395104e-06f, -7.801524077e-06f, -7.331881716e-06f, -6.000721856e-06f,\n    +6.909059164e-04f, +1.307787641e-03f, +2.074632406e-03f, +2.828300604e-03f, +3.297103990e-03f, +3.125662429e-03f, +1.934421427e-03f, -5.912309534e-04f, -4.597122062e-03f, -9.964595275e-03f, -1.624935725e-02f, -2.267851063e-02f, -2.821994504e-02f, -3.172346017e-02f, -3.211586200e-02f, -2.861682821e-02f, -2.093266790e-02f, -9.384280512e-03f, +5.065186297e-03f, +2.089948969e-02f, +3.624846571e-02f, +4.916685638e-02f, +5.794398287e-02f, +6.138664029e-02f, +5.902079474e-02f, +5.117255772e-02f, +3.891243130e-02f, +2.387385319e-02f, +7.981681917e-03f, -6.856918523e-03f, -1.904122581e-02f, -2.749403872e-02f, -3.177271645e-02f, -3.206282211e-02f, -2.906677971e-02f, -2.381926452e-02f, -1.747205771e-02f, -1.109213363e-02f, -5.508549708e-03f, -1.229051054e-03f, +1.569837089e-03f, +2.990962703e-03f, +3.325304048e-03f, +2.947730766e-03f, +2.223710317e-03f, +1.443555836e-03f, +7.911274100e-04f, +3.445894731e-04f,\n    -1.596548744e-05f, -2.210540102e-05f, -2.489925524e-05f, -2.091192815e-05f, -6.949330726e-06f, +1.888071007e-05f, +5.611052704e-05f, +1.011634523e-04f, +1.472071174e-04f, +1.848040261e-04f, +2.033809683e-04f, +1.933271055e-04f, +1.483324988e-04f, +6.745020468e-05f, -4.365011838e-05f, -1.726521230e-04f, -3.019663296e-04f, -4.113815210e-04f, -4.815609030e-04f, -4.977173448e-04f, -4.527068295e-04f, -3.488539443e-04f, -1.980598351e-04f, -2.009320106e-05f, +1.606494561e-04f, +3.192961356e-04f, +4.347458496e-04f, +4.931702526e-04f, +4.900949110e-04f, +4.306937594e-04f, +3.283117689e-04f, +2.015961528e-04f, +7.088326246e-05f, -4.539939795e-05f, -1.336160942e-04f, -1.865978710e-04f, -2.039140682e-04f, -1.908574537e-04f, -1.565155274e-04f, -1.114457889e-04f, -6.548598165e-05f, -2.612342670e-05f, +2.339904673e-06f, +1.880348977e-05f, +2.472788286e-05f, +2.311730902e-05f, +1.743555650e-05f, +1.071657227e-05f,\n    /*  1, 4 (48) */\n    -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f,\n    +7.059081716e-06f, +7.794995958e-06f, +7.248730722e-06f, +4.827110191e-06f, -4.301144525e-08f, -7.843156605e-06f, -1.888830955e-05f, -3.325715046e-05f, -5.073639743e-05f, -7.078763450e-05f, -9.254332692e-05f, -1.148360655e-04f, -1.362616909e-04f, -1.552731878e-04f, -1.702985375e-04f, -1.798725349e-04f, -1.827703153e-04f, -1.781293332e-04f, -1.655469566e-04f, -1.451427229e-04f, -1.175774709e-04f, -8.402571100e-05f, -4.610227435e-05f, -5.748970827e-06f, +3.490884522e-05f, +7.372273107e-05f, +1.086837592e-04f, +1.380721657e-04f, +1.605803153e-04f, +1.753980729e-04f, +1.822536042e-04f, +1.814072243e-04f, +1.736006478e-04f, +1.599683410e-04f, +1.419211588e-04f, +1.210147169e-04f, +9.881578617e-05f, +7.677938468e-05f, +5.614730615e-05f, +3.787586248e-05f, +2.259701741e-05f, +1.061329869e-05f, +1.923340206e-06f, -3.727989835e-06f, -6.782889817e-06f, -7.796262099e-06f, -7.362395954e-06f, -6.050236397e-06f,\n    +6.749404290e-04f, +1.285682239e-03f, +2.049733151e-03f, +2.807388676e-03f, +3.290154659e-03f, +3.144543139e-03f, +1.990531954e-03f, -4.900675011e-04f, -4.449914944e-03f, -9.779791249e-03f, -1.604597628e-02f, -2.248518352e-02f, -2.807161254e-02f, -3.165600997e-02f, -3.215951212e-02f, -2.878948033e-02f, -2.123463423e-02f, -9.795662033e-03f, +4.583625394e-03f, +2.040177234e-02f, +3.579575888e-02f, +4.881800243e-02f, +5.774592303e-02f, +6.136654709e-02f, +5.918144419e-02f, +5.149185385e-02f, +3.934717715e-02f, +2.436702344e-02f, +8.471776828e-03f, -6.426224764e-03f, -1.871291404e-02f, -2.729244257e-02f, -3.170183318e-02f, -3.210822151e-02f, -2.920039581e-02f, -2.400586239e-02f, -1.767597177e-02f, -1.128299108e-02f, -5.665065235e-03f, -1.340496843e-03f, +1.504351108e-03f, +2.964839276e-03f, +3.327643953e-03f, +2.966534256e-03f, +2.248438199e-03f, +1.466673145e-03f, +8.085629665e-04f, +3.553060453e-04f,\n    -1.575330966e-05f, -2.194716213e-05f, -2.489631464e-05f, -2.117307309e-05f, -7.560481282e-06f, +1.789109874e-05f, +5.480150053e-05f, +9.969721340e-05f, +1.458421761e-04f, +1.838620601e-04f, +2.031898472e-04f, +1.941492378e-04f, +1.502930739e-04f, +7.048238377e-05f, -3.982752051e-05f, -1.685145269e-04f, -2.981196454e-04f, -4.084635409e-04f, -4.801254603e-04f, -4.981243193e-04f, -4.550415531e-04f, -3.528946277e-04f, -2.033021755e-04f, -2.582939980e-05f, +1.552117387e-04f, +3.148980846e-04f, +4.319519384e-04f, +4.922774745e-04f, +4.910938247e-04f, +4.332871834e-04f, +3.319848116e-04f, +2.057209625e-04f, +7.483568249e-05f, -4.213497453e-05f, -1.313730568e-04f, -1.854960989e-04f, -2.038722735e-04f, -1.916411728e-04f, -1.578062534e-04f, -1.129141757e-04f, -6.685359483e-05f, -2.720233902e-05f, +1.633825320e-06f, +1.846124455e-05f, +2.467468530e-05f, +2.324695131e-05f, +1.764247584e-05f, +1.091881357e-05f,\n    /*  1, 5 (48) */\n    -4.439884703e-04f, -6.839332393e-04f, -9.291054171e-04f, -1.129315731e-03f, -1.215523855e-03f, -1.101569931e-03f, -6.882696471e-04f, +1.301495090e-04f, +1.457574517e-03f, +3.386079964e-03f, +5.985377344e-03f, +9.292645361e-03f, +1.330382439e-02f, +1.796742122e-02f, +2.318171247e-02f, +2.879596596e-02f, +3.461594135e-02f, +4.041352017e-02f, +4.593989350e-02f, +5.094135058e-02f, +5.517640664e-02f, +5.843282187e-02f, +6.054301834e-02f, +6.139650865e-02f, +6.094820002e-02f, +5.922180670e-02f, +5.630805374e-02f, +5.235783912e-02f, +4.757098725e-02f, +4.218162598e-02f, +3.644151000e-02f, +3.060276630e-02f, +2.490154017e-02f, +1.954387566e-02f, +1.469489309e-02f, +1.047196184e-02f, +6.942151189e-03f, +4.123822392e-03f, +1.991846752e-03f, +4.856340025e-04f, -4.810385334e-04f, -1.009480542e-03f, -1.205867910e-03f, -1.172239576e-03f, -9.993784239e-04f, -7.619693040e-04f, -5.161425332e-04f, -2.992482924e-04f,\n    +7.021637960e-06f, +7.788372543e-06f, +7.291082698e-06f, +4.937022566e-06f, +1.513745344e-07f, -7.551384381e-06f, -1.849254854e-05f, -3.275912115e-05f, -5.014758269e-05f, -7.012990339e-05f, -9.184856916e-05f, -1.141447587e-04f, -1.356204362e-04f, -1.547313687e-04f, -1.699043667e-04f, -1.796688410e-04f, -1.827904761e-04f, -1.783937689e-04f, -1.660605652e-04f, -1.458935566e-04f, -1.185368387e-04f, -8.514975212e-05f, -4.733489691e-05f, -7.025910221e-06f, +3.365521214e-05f, +7.255825958e-05f, +1.076675748e-04f, +1.372523257e-04f, +1.599904879e-04f, +1.750555188e-04f, +1.821586121e-04f, +1.815440025e-04f, +1.739395284e-04f, +1.604690300e-04f, +1.425366721e-04f, +1.216955923e-04f, +9.951415924e-05f, +7.745255413e-05f, +5.676049434e-05f, +3.840398002e-05f, +2.302535893e-05f, +1.093721356e-05f, +2.147024604e-06f, -3.593355386e-06f, -6.721387745e-06f, -7.789589021e-06f, -7.392058845e-06f, -6.099383813e-06f,\n    +6.591871193e-04f, +1.263735077e-03f, +2.024836836e-03f, +2.786215603e-03f, +3.282594178e-03f, +3.162434237e-03f, +2.045333455e-03f, -3.903702877e-04f, -4.304072768e-03f, -9.595929189e-03f, -1.584278643e-02f, -2.229103428e-02f, -2.792131946e-02f, -3.158552758e-02f, -3.219933964e-02f, -2.895799486e-02f, -2.153275388e-02f, -1.020412557e-02f, +4.103499934e-03f, +1.990364802e-02f, +3.534071733e-02f, +4.846510781e-02f, +5.754262086e-02f, +6.134071769e-02f, +5.933665593e-02f, +5.180675194e-02f, +3.977912909e-02f, +2.485930091e-02f, +8.962870652e-03f, -5.992937580e-03f, -1.838092923e-02f, -2.708672161e-02f, -3.162699750e-02f, -3.215035648e-02f, -2.933176886e-02f, -2.419135849e-02f, -1.787984405e-02f, -1.147463225e-02f, -5.822871489e-03f, -1.453411019e-03f, +1.437497513e-03f, +2.937636937e-03f, +3.329277778e-03f, +2.984995501e-03f, +2.273112885e-03f, +1.489920096e-03f, +8.262054424e-04f, +3.662248589e-04f,\n    -1.554081285e-05f, -2.178580768e-05f, -2.488684375e-05f, -2.142445762e-05f, -8.159877660e-06f, +1.691293576e-05f, +5.350054635e-05f, +9.823241829e-05f, +1.444694044e-04f, +1.829017706e-04f, +2.029707573e-04f, +1.949369302e-04f, +1.522179874e-04f, +7.348422069e-05f, -3.602331742e-05f, -1.643780583e-04f, -2.942540920e-04f, -4.055074182e-04f, -4.786369835e-04f, -4.984708574e-04f, -4.573177959e-04f, -3.568883141e-04f, -2.085168925e-04f, -3.156206276e-05f, +1.497528627e-04f, +3.104578006e-04f, +4.291018512e-04f, +4.913238229e-04f, +4.920367567e-04f, +4.358376830e-04f, +3.356333310e-04f, +2.098414137e-04f, +7.880208811e-05f, -3.884292954e-05f, -1.290951640e-04f, -1.843589381e-04f, -2.038002702e-04f, -1.924036704e-04f, -1.590862412e-04f, -1.143816183e-04f, -6.822773425e-05f, -2.829208151e-05f, +9.158039886e-07f, +1.810850509e-05f, +2.461398792e-05f, +2.337255185e-05f, +1.784838432e-05f, +1.112210891e-05f,\n    /*  1, 6 (48) */\n    -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f,\n    +6.983504168e-06f, +7.780518386e-06f, +7.331620083e-06f, +5.044553124e-06f, +3.428983692e-07f, -7.262793860e-06f, -1.810005886e-05f, -3.226416726e-05f, -4.956132816e-05f, -6.947389279e-05f, -9.115439517e-05f, -1.134526627e-04f, -1.349768747e-04f, -1.541856957e-04f, -1.695048947e-04f, -1.794586306e-04f, -1.828032572e-04f, -1.786504114e-04f, -1.665664791e-04f, -1.466373266e-04f, -1.194902810e-04f, -8.626944199e-05f, -4.856506828e-05f, -8.302483877e-06f, +3.239983159e-05f, +7.139005983e-05f, +1.066459616e-04f, +1.364257588e-04f, +1.593931230e-04f, +1.747051455e-04f, +1.820560435e-04f, +1.816739221e-04f, +1.742726574e-04f, +1.609653496e-04f, +1.431493437e-04f, +1.223751678e-04f, +1.002126668e-04f, +7.812708446e-05f, +5.737599002e-05f, +3.893503281e-05f, +2.345693889e-05f, +1.126437005e-05f, +2.373702808e-06f, -3.456160473e-06f, -6.657870832e-06f, -7.781486633e-06f, -7.420853824e-06f, -6.148150484e-06f,\n    +6.436463064e-04f, +1.241949270e-03f, +1.999949993e-03f, +2.764791145e-03f, +3.274434301e-03f, +3.179347173e-03f, +2.098834001e-03f, -2.921378694e-04f, -4.159603364e-03f, -9.413027418e-03f, -1.563981567e-02f, -2.209609735e-02f, -2.776910148e-02f, -3.151204336e-02f, -3.223536296e-02f, -2.912237291e-02f, -2.182700797e-02f, -1.060963299e-02f, +3.624862950e-03f, +1.940517716e-02f, +3.488339953e-02f, +4.810821949e-02f, +5.733410396e-02f, +6.130915563e-02f, +5.948640879e-02f, +5.211720974e-02f, +4.020823094e-02f, +2.535062474e-02f, +9.454907409e-03f, -5.557099897e-03f, -1.804529590e-02f, -2.687688019e-02f, -3.154819541e-02f, -3.218919941e-02f, -2.946086403e-02f, -2.437571743e-02f, -1.808364432e-02f, -1.166703592e-02f, -5.981957730e-03f, -1.567792637e-03f, +1.369269778e-03f, +2.909344855e-03f, +3.330193582e-03f, +3.003104006e-03f, +2.297726873e-03f, +1.513292648e-03f, +8.440538267e-04f, +3.773469678e-04f,\n    -1.532806871e-05f, -2.162143767e-05f, -2.487095151e-05f, -2.166616976e-05f, -8.747552469e-06f, +1.594627439e-05f, +5.220782014e-05f, +9.676931944e-05f, +1.430891199e-04f, +1.819234847e-04f, +2.027239640e-04f, +1.956903147e-04f, +1.541071826e-04f, +7.645544584e-05f, -3.223797337e-05f, -1.602433145e-04f, -2.903703028e-04f, -4.025137075e-04f, -4.770958382e-04f, -4.987570545e-04f, -4.595353487e-04f, -3.608345123e-04f, -2.137032898e-04f, -3.729040543e-05f, +1.442735657e-04f, +3.059758495e-04f, +4.261958904e-04f, +4.903092966e-04f, +4.929234191e-04f, +4.383447518e-04f, +3.392567061e-04f, +2.139568862e-04f, +8.278196499e-05f, -3.552359748e-05f, -1.267825385e-04f, -1.831863109e-04f, -2.036978274e-04f, -1.931446308e-04f, -1.603551633e-04f, -1.158478390e-04f, -6.960821217e-05f, -2.939256978e-05f, +1.858320897e-07f, +1.774519696e-05f, +2.454568474e-05f, +2.349400520e-05f, +1.805320008e-05f, +1.132641078e-05f,\n    /*  1, 7 (48) */\n    -4.299833282e-04f, -6.683643483e-04f, -9.144827144e-04f, -1.119334155e-03f, -1.215029582e-03f, -1.116384110e-03f, -7.248622545e-04f, +6.512622063e-05f, +1.357865606e-03f, +3.246476168e-03f, +5.802374380e-03f, +9.065047940e-03f, +1.303322708e-02f, +1.765850416e-02f, +2.284230321e-02f, +2.843683849e-02f, +3.425034762e-02f, +4.005647599e-02f, +4.560726646e-02f, +5.064881970e-02f, +5.493837952e-02f, +5.826140268e-02f, +6.044711838e-02f, +6.138118026e-02f, +6.101425507e-02f, +5.936575502e-02f, +5.652236728e-02f, +5.263151721e-02f, +4.789037086e-02f, +4.253138664e-02f, +3.680572465e-02f, +3.096598422e-02f, +2.524975236e-02f, +1.986531004e-02f, +1.498057911e-02f, +1.071603260e-02f, +7.141878015e-03f, +4.279402031e-03f, +2.105983236e-03f, +5.629730153e-04f, -4.345562356e-04f, -9.872789584e-04f, -1.201347182e-03f, -1.179289092e-03f, -1.012757683e-03f, -7.775403796e-04f, -5.309554459e-04f, -3.114958267e-04f,\n    +6.944696012e-06f, +7.771451312e-06f, +7.370361214e-06f, +5.149718660e-06f, +5.315730174e-07f, -6.977378204e-06f, -1.771084180e-05f, -3.177229965e-05f, -4.897765493e-05f, -6.881963368e-05f, -9.046084446e-05f, -1.127598233e-04f, -1.343310549e-04f, -1.536362162e-04f, -1.691001640e-04f, -1.792419368e-04f, -1.828086792e-04f, -1.788992659e-04f, -1.670646871e-04f, -1.473740055e-04f, -1.204377551e-04f, -8.738472583e-05f, -4.979272550e-05f, -9.578625365e-06f, +3.114276840e-05f, +7.021819019e-05f, +1.056189673e-04f, +1.355924986e-04f, +1.587882379e-04f, +1.743469537e-04f, +1.819458831e-04f, +1.817969543e-04f, +1.745999956e-04f, +1.614572536e-04f, +1.437591249e-04f, +1.230533962e-04f, +1.009112666e-04f, +7.880294129e-05f, +5.799376832e-05f, +3.946900620e-05f, +2.389175254e-05f, +1.159477218e-05f, +2.603385740e-06f, -3.316389466e-06f, -6.592321062e-06f, -7.771936700e-06f, -7.448764252e-06f, -6.196522682e-06f,\n    +6.283182377e-04f, +1.220327832e-03f, +1.975079041e-03f, +2.743124976e-03f, +3.265686748e-03f, +3.195293448e-03f, +2.151041821e-03f, -1.953685500e-04f, -4.016514244e-03f, -9.231103934e-03f, -1.543709171e-02f, -2.190040704e-02f, -2.761499429e-02f, -3.143558792e-02f, -3.226760093e-02f, -2.928261623e-02f, -2.211737827e-02f, -1.101214670e-02f, +3.147767112e-03f, +1.890642011e-02f, +3.442386419e-02f, +4.774738498e-02f, +5.712040067e-02f, +6.127186522e-02f, +5.963068236e-02f, +5.242318559e-02f, +4.063442683e-02f, +2.584093403e-02f, +9.947830828e-03f, -5.118755146e-03f, -1.770603919e-02f, -2.666292331e-02f, -3.146541345e-02f, -3.222472301e-02f, -2.958764656e-02f, -2.455890374e-02f, -1.828734215e-02f, -1.186018055e-02f, -6.142312893e-03f, -1.683640476e-03f, +1.299661566e-03f, +2.879952286e-03f, +3.330379414e-03f, +3.020849203e-03f, +2.322272557e-03f, +1.536786653e-03f, +8.621070268e-04f, +3.886733786e-04f,\n    -1.511514789e-05f, -2.145415145e-05f, -2.484874698e-05f, -2.189829870e-05f, -9.323540560e-06f, +1.499116485e-05f, +5.092347434e-05f, +9.530816669e-05f, +1.417016390e-04f, +1.809275301e-04f, +2.024497358e-04f, +1.964095286e-04f, +1.559606090e-04f, +7.939579618e-05f, -2.847194725e-05f, -1.561108897e-04f, -2.864689115e-04f, -3.994829673e-04f, -4.755023974e-04f, -4.989830154e-04f, -4.616940118e-04f, -3.647327390e-04f, -2.188606756e-04f, -4.301364407e-05f, +1.387745892e-04f, +3.014528043e-04f, +4.232343676e-04f, +4.892339038e-04f, +4.937535320e-04f, +4.408078890e-04f, +3.428543174e-04f, +2.180667583e-04f, +8.677479417e-05f, -3.217731919e-05f, -1.244353095e-04f, -1.819781453e-04f, -2.035647178e-04f, -1.938637399e-04f, -1.616126915e-04f, -1.173125582e-04f, -7.099483771e-05f, -3.050371628e-05f, -5.560964085e-07f, +1.737124731e-05f, +2.446967027e-05f, +2.361120550e-05f, +1.825684027e-05f, +1.153167060e-05f,\n    /*  1, 8 (48) */\n    -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f,\n    +6.905229076e-06f, +7.761189099e-06f, +7.407324442e-06f, +5.252536049e-06f, +7.174115923e-07f, -6.695130348e-06f, -1.732489835e-05f, -3.128352883e-05f, -4.839658372e-05f, -6.816715673e-05f, -8.976795629e-05f, -1.120662859e-04f, -1.336830254e-04f, -1.530829779e-04f, -1.686902173e-04f, -1.790187932e-04f, -1.828067631e-04f, -1.791403384e-04f, -1.675551786e-04f, -1.481035659e-04f, -1.213792189e-04f, -8.849554918e-05f, -5.101780578e-05f, -1.085426828e-05f, +2.988408757e-05f, +6.904270931e-05f, +1.045866398e-04f, +1.347525789e-04f, +1.581758507e-04f, +1.739809448e-04f, +1.818281164e-04f, +1.819130706e-04f, +1.749215037e-04f, +1.619446962e-04f, +1.443659673e-04f, +1.237302304e-04f, +1.016099164e-04f, +7.948008996e-05f, +5.861380406e-05f, +4.000588521e-05f, +2.432979486e-05f, +1.192842370e-05f, +2.836084140e-06f, -3.174026850e-06f, -6.524720458e-06f, -7.760920964e-06f, -7.475773419e-06f, -6.244486575e-06f,\n    +6.132030899e-04f, +1.198873681e-03f, +1.950230294e-03f, +2.721226677e-03f, +3.256363208e-03f, +3.210284612e-03f, +2.201965296e-03f, -1.000603833e-04f, -3.874812605e-03f, -9.050176404e-03f, -1.523464198e-02f, -2.170399751e-02f, -2.745903369e-02f, -3.135619212e-02f, -3.229607288e-02f, -2.943872712e-02f, -2.240384718e-02f, -1.141162967e-02f, +2.672264714e-03f, +1.840743709e-02f, +3.396217017e-02f, +4.738265224e-02f, +5.690154000e-02f, +6.122885158e-02f, +5.976945695e-02f, +5.272463839e-02f, +4.105766120e-02f, +2.633016794e-02f, +1.044158436e-02f, -4.677947257e-03f, -1.736318488e-02f, -2.644485655e-02f, -3.137863865e-02f, -3.225690033e-02f, -2.971208187e-02f, -2.474088189e-02f, -1.849090686e-02f, -1.205404429e-02f, -6.303925585e-03f, -1.800953034e-03f, +1.228666729e-03f, +2.849448569e-03f, +3.329823318e-03f, +3.038220450e-03f, +2.346742228e-03f, +1.560397859e-03f, +8.803638670e-04f, +4.002050492e-04f,\n    -1.490211996e-05f, -2.128404769e-05f, -2.482033930e-05f, -2.212093478e-05f, -9.887878991e-06f, +1.404765433e-05f, +4.964765813e-05f, +9.384920717e-05f, +1.403072766e-04f, +1.799142352e-04f, +2.021483440e-04f, +1.970947142e-04f, +1.577782226e-04f, +8.230501533e-05f, -2.472569254e-05f, -1.519813755e-04f, -2.825505523e-04f, -3.964157603e-04f, -4.738570412e-04f, -4.991488536e-04f, -4.637935950e-04f, -3.685825189e-04f, -2.239883633e-04f, -4.873099576e-05f, +1.332566780e-04f, +2.968892447e-04f, +4.202176034e-04f, +4.880976622e-04f, +4.945268237e-04f, +4.432265991e-04f, +3.464255475e-04f, +2.221704064e-04f, +9.078005214e-05f, -2.880444182e-05f, -1.220536131e-04f, -1.807343748e-04f, -2.034007180e-04f, -1.945606850e-04f, -1.628584972e-04f, -1.187754937e-04f, -7.238741685e-05f, -3.162543024e-05f, -1.309984952e-06f, +1.698658485e-05f, +2.438583951e-05f, +2.372404648e-05f, +1.845922109e-05f, +1.173783863e-05f,\n    /*  1, 9 (48) */\n    -4.161334031e-04f, -6.528317079e-04f, -8.997050287e-04f, -1.108931901e-03f, -1.213780598e-03f, -1.130056618e-03f, -7.598979946e-04f, +2.070392152e-06f, +1.260491367e-03f, +3.109489377e-03f, +5.622145579e-03f, +8.840221830e-03f, +1.276521300e-02f, +1.735178496e-02f, +2.250451283e-02f, +2.807857776e-02f, +3.388473218e-02f, +3.969843638e-02f, +4.527264659e-02f, +5.035334212e-02f, +5.469656255e-02f, +5.808552240e-02f, +6.034630785e-02f, +6.136074737e-02f, +6.107528192e-02f, +5.950501592e-02f, +5.673257289e-02f, +5.290186229e-02f, +4.820733494e-02f, +4.287971454e-02f, +3.716949865e-02f, +3.132969425e-02f, +2.559927386e-02f, +2.018871199e-02f, +1.526870420e-02f, +1.096281623e-02f, +7.344399198e-03f, +4.437685062e-03f, +2.222590809e-03f, +6.424479067e-04f, -3.863346882e-04f, -9.637557625e-04f, -1.195907712e-03f, -1.185779509e-03f, -1.025874724e-03f, -7.930732373e-04f, -5.458799835e-04f, -3.239368359e-04f,\n    +6.865118852e-06f, +7.749749481e-06f, +7.442528130e-06f, +5.353022246e-06f, +9.004273601e-07f, -6.416043006e-06f, -1.694222924e-05f, -3.079786504e-05f, -4.781813497e-05f, -6.751649231e-05f, -8.907576968e-05f, -1.113720959e-04f, -1.330328344e-04f, -1.525260286e-04f, -1.682750973e-04f, -1.787892338e-04f, -1.827975304e-04f, -1.793736353e-04f, -1.680379435e-04f, -1.488259813e-04f, -1.223146305e-04f, -8.960185788e-05f, -5.224024653e-05f, -1.212934627e-05f, +2.862385418e-05f, +6.786367609e-05f, +1.035490276e-04f, +1.339060344e-04f, +1.575559798e-04f, +1.736071204e-04f, +1.817027291e-04f, +1.820222430e-04f, +1.752371429e-04f, +1.624276316e-04f, +1.449698222e-04f, +1.244056229e-04f, +1.023085737e-04f, +8.015849554e-05f, +5.923607174e-05f, +4.054565455e-05f, +2.477106051e-05f, +1.226532812e-05f, +3.071808559e-06f, -3.029057220e-06f, -6.455051086e-06f, -7.748421147e-06f, -7.501864540e-06f, -6.292028226e-06f,\n    +5.983009699e-04f, +1.177589633e-03f, +1.925409955e-03f, +2.699105742e-03f, +3.246475329e-03f, +3.224332267e-03f, +2.251612954e-03f, -6.211176122e-06f, -3.734505328e-03f, -8.870262169e-03f, -1.503249363e-02f, -2.150690279e-02f, -2.730125546e-02f, -3.127388711e-02f, -3.232079857e-02f, -2.959070849e-02f, -2.268639774e-02f, -1.180804543e-02f, +2.198407673e-03f, +1.790828824e-02f, +3.349837658e-02f, +4.701406972e-02f, +5.667755164e-02f, +6.118012058e-02f, +5.990271363e-02f, +5.302152764e-02f, +4.147787880e-02f, +2.681826560e-02f, +1.093611118e-02f, -4.234720657e-03f, -1.701675933e-02f, -2.622268614e-02f, -3.128785860e-02f, -3.228570477e-02f, -2.983413549e-02f, -2.492161626e-02f, -1.869430758e-02f, -1.224860498e-02f, -6.466784082e-03f, -1.919728528e-03f, +1.156279312e-03f, +2.817823139e-03f, +3.328513333e-03f, +3.055207035e-03f, +2.371128067e-03f, +1.584121905e-03f, +8.988230881e-04f, +4.119428878e-04f,\n    -1.468905343e-05f, -2.111122436e-05f, -2.478583769e-05f, -2.233416943e-05f, -1.044060700e-05f, +1.311578707e-05f, +4.838051740e-05f, +9.239268525e-05f, +1.389063463e-04f, +1.788839288e-04f, +2.018200630e-04f, +1.977460188e-04f, +1.595599860e-04f, +8.518285353e-05f, -2.099965721e-05f, -1.478553601e-04f, -2.786158599e-04f, -3.933126532e-04f, -4.721601571e-04f, -4.992546924e-04f, -4.658339177e-04f, -3.723833847e-04f, -2.290856711e-04f, -5.444167862e-05f, +1.277205798e-04f, +2.922857573e-04f, +4.171459276e-04f, +4.869005993e-04f, +4.952430311e-04f, +4.456003923e-04f, +3.499697813e-04f, +2.262672056e-04f, +9.479721092e-05f, -2.540531878e-05f, -1.196375918e-04f, -1.794549389e-04f, -2.032056088e-04f, -1.952351551e-04f, -1.640922509e-04f, -1.202363612e-04f, -7.378575245e-05f, -3.275761770e-05f, -2.075834377e-06f, +1.659113991e-05f, +2.429408800e-05f, +2.383242151e-05f, +1.866025781e-05f, +1.194486404e-05f,\n    /*  1,10 (48) */\n    -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f,\n    +6.824380746e-06f, +7.737150143e-06f, +7.475990650e-06f, +5.451194286e-06f, +1.080633738e-06f, -6.140108674e-06f, -1.656283491e-05f, -3.031531818e-05f, -4.724232877e-05f, -6.686767051e-05f, -8.838432342e-05f, -1.106772984e-04f, -1.323805306e-04f, -1.519654159e-04f, -1.678548470e-04f, -1.785532927e-04f, -1.827810030e-04f, -1.795991635e-04f, -1.685129721e-04f, -1.495412255e-04f, -1.232439486e-04f, -9.070359815e-05f, -5.345998535e-05f, -1.340379299e-05f, +2.736213345e-05f, +6.668114971e-05f, +1.025061794e-04f, +1.330529000e-04f, +1.569286442e-04f, +1.732254828e-04f, +1.815697075e-04f, +1.821244437e-04f, +1.755468747e-04f, +1.629060141e-04f, +1.455706410e-04f, +1.250795263e-04f, +1.030071957e-04f, +8.083812284e-05f, +5.986054554e-05f, +4.108829861e-05f, +2.521554387e-05f, +1.260548869e-05f, +3.310569361e-06f, -2.881465290e-06f, -6.383295056e-06f, -7.734418951e-06f, -7.527020764e-06f, -6.339133594e-06f,\n    +5.836119165e-04f, +1.156478409e-03f, +1.900624117e-03f, +2.676771573e-03f, +3.236034722e-03f, +3.237448054e-03f, +2.299993471e-03f, +8.618150913e-05f, -3.595598982e-03f, -8.691378240e-03f, -1.483067357e-02f, -2.130915678e-02f, -2.714169548e-02f, -3.118870425e-02f, -3.234179823e-02f, -2.973856385e-02f, -2.296501360e-02f, -1.220135808e-02f, +1.726247516e-03f, +1.740903355e-02f, +3.303254266e-02f, +4.664168634e-02f, +5.644846596e-02f, +6.112567891e-02f, +6.003043421e-02f, +5.331381339e-02f, +4.189502473e-02f, +2.730516620e-02f, +1.143135421e-02f, -3.789120265e-03f, -1.666678955e-02f, -2.599641894e-02f, -3.119306139e-02f, -3.231111009e-02f, -2.995377308e-02f, -2.510107120e-02f, -1.889751319e-02f, -1.244384013e-02f, -6.630876333e-03f, -2.039964889e-03f, +1.082493559e-03f, +2.785065521e-03f, +3.326437498e-03f, +3.071798175e-03f, +2.395422155e-03f, +1.607954327e-03f, +9.174833459e-04f, +4.238877519e-04f,\n    -1.447601573e-05f, -2.093577875e-05f, -2.474535144e-05f, -2.253809516e-05f, -1.098176596e-05f, +1.219560428e-05f, +4.712219483e-05f, +9.093884253e-05f, +1.374991601e-04f, +1.778369407e-04f, +2.014651700e-04f, +1.983635946e-04f, +1.613058679e-04f, +8.802906768e-05f, -1.729428370e-05f, -1.437334289e-04f, -2.746654690e-04f, -3.901742165e-04f, -4.704121395e-04f, -4.993006637e-04f, -4.678148086e-04f, -3.761348771e-04f, -2.341519224e-04f, -6.014491190e-05f, +1.221670459e-04f, +2.876429354e-04f, +4.140196788e-04f, +4.856427518e-04f, +4.959018989e-04f, +4.479287843e-04f, +3.534864055e-04f, +2.303565294e-04f, +9.882573812e-05f, -2.198030972e-05f, -1.171873950e-04f, -1.781397830e-04f, -2.029791747e-04f, -1.958868412e-04f, -1.653136230e-04f, -1.216948744e-04f, -7.518964427e-05f, -3.390018149e-05f, -2.853642879e-06f, +1.618484449e-05f, +2.419431183e-05f, +2.393622360e-05f, +1.885986474e-05f, +1.215269488e-05f,\n    /*  1,11 (48) */\n    -4.024439035e-04f, -6.373448083e-04f, -8.847865099e-04f, -1.098127684e-03f, -1.211799537e-03f, -1.142612770e-03f, -7.934030588e-04f, -5.904279106e-05f, +1.165430903e-03f, +2.975105214e-03f, +5.444685486e-03f, +8.618172436e-03f, +1.249979964e-02f, +1.704729352e-02f, +2.216838289e-02f, +2.772123523e-02f, +3.351915364e-02f, +3.933946359e-02f, +4.493609568e-02f, +5.005497492e-02f, +5.445100397e-02f, +5.790521695e-02f, +6.024060761e-02f, +6.133521423e-02f, +6.113126791e-02f, +5.963956075e-02f, +5.693862809e-02f, +5.316882122e-02f, +4.852181957e-02f, +4.322654714e-02f, +3.753277109e-02f, +3.169384093e-02f, +2.595005788e-02f, +2.051404564e-02f, +1.555924466e-02f, +1.121230138e-02f, +7.549714967e-03f, +4.598681680e-03f, +2.341687426e-03f, +7.240818599e-04f, -3.363480838e-04f, -9.388849457e-04f, -1.189525335e-03f, -1.191690031e-03f, -1.038713070e-03f, -8.085560774e-04f, -5.609088688e-04f, -3.365679977e-04f,\n    +6.783030070e-06f, +7.723408718e-06f, +7.507730380e-06f, +5.547069277e-06f, +1.258044290e-06f, -5.867319628e-06f, -1.618671553e-05f, -2.983589784e-05f, -4.666918493e-05f, -6.622072111e-05f, -8.769365605e-05f, -1.099819384e-04f, -1.317261621e-04f, -1.514011878e-04f, -1.674295098e-04f, -1.783110046e-04f, -1.827572033e-04f, -1.798169304e-04f, -1.689802556e-04f, -1.502492729e-04f, -1.241671324e-04f, -9.180071650e-05f, -5.467696004e-05f, -1.467754219e-05f, +2.609899070e-05f, +6.549518960e-05f, +1.014581444e-04f, +1.321932110e-04f, +1.562938633e-04f, +1.728360349e-04f, +1.814290384e-04f, +1.822196454e-04f, +1.758506607e-04f, +1.633797983e-04f, +1.461683752e-04f, +1.257518931e-04f, +1.037057395e-04f, +8.151893637e-05f, +6.048719935e-05f, +4.163380147e-05f, +2.566323901e-05f, +1.294890841e-05f, +3.552376721e-06f, -2.731235893e-06f, -6.309434527e-06f, -7.718896060e-06f, -7.551225169e-06f, -6.385788534e-06f,\n    +5.691359007e-04f, +1.135542630e-03f, +1.875878766e-03f, +2.654233478e-03f, +3.225052956e-03f, +3.249643658e-03f, +2.347115666e-03f, +1.771203517e-04f, -3.458099822e-03f, -8.513541299e-03f, -1.462920840e-02f, -2.111079318e-02f, -2.698038961e-02f, -3.110067518e-02f, -3.235909251e-02f, -2.988229728e-02f, -2.323967906e-02f, -1.259153230e-02f, +1.255835377e-03f, +1.690973288e-02f, +3.256472785e-02f, +4.626555146e-02f, +5.621431404e-02f, +6.106553399e-02f, +6.015260125e-02f, +5.360145633e-02f, +4.230904441e-02f, +2.779080895e-02f, +1.192725611e-02f, -3.341191481e-03f, -1.631330314e-02f, -2.576606241e-02f, -3.109423565e-02f, -3.233309040e-02f, -3.007096047e-02f, -2.527921098e-02f, -1.910049237e-02f, -1.263972698e-02f, -6.796189956e-03f, -2.161659764e-03f, +1.007303915e-03f, +2.751165340e-03f, +3.323583856e-03f, +3.087983019e-03f, +2.419616467e-03f, +1.631890550e-03f, +9.363432107e-04f, +4.360404467e-04f,\n    -1.426307319e-05f, -2.075780740e-05f, -2.469898981e-05f, -2.273280550e-05f, -1.151139937e-05f, +1.128714424e-05f, +4.587282982e-05f, +8.948791782e-05f, +1.360860288e-04f, +1.767736006e-04f, +2.010839449e-04f, +1.989475989e-04f, +1.630158436e-04f, +9.084342132e-05f, -1.361000888e-05f, -1.396161639e-04f, -2.707000147e-04f, -3.870010247e-04f, -4.686133899e-04f, -4.992869089e-04f, -4.697361063e-04f, -3.798365454e-04f, -2.391864458e-04f, -6.583991611e-05f, +1.165968301e-04f, +2.829613790e-04f, +4.108392049e-04f, +4.843241664e-04f, +4.965031808e-04f, +4.502112968e-04f, +3.569748093e-04f, +2.344377501e-04f, +1.028650970e-04f, -1.852978049e-05f, -1.147031788e-04f, -1.767888582e-04f, -2.027212045e-04f, -1.965154358e-04f, -1.665222834e-04f, -1.231507447e-04f, -7.659888899e-05f, -3.505302122e-05f, -3.643405993e-06f, +1.576763225e-05f, +2.408640770e-05f, +2.403534541e-05f, +1.905795531e-05f, +1.236127806e-05f,\n    /*  1,12 (48) */\n    -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f,\n    +6.741082046e-06f, +7.708542790e-06f, +7.537765705e-06f, +5.640664402e-06f, +1.432672729e-06f, -5.597667930e-06f, -1.581387101e-05f, -2.935961333e-05f, -4.609872289e-05f, -6.557567358e-05f, -8.700380586e-05f, -1.092860609e-04f, -1.310697774e-04f, -1.508333922e-04f, -1.669991291e-04f, -1.780624044e-04f, -1.827261540e-04f, -1.800269439e-04f, -1.694397852e-04f, -1.509500984e-04f, -1.250841413e-04f, -9.289315982e-05f, -5.589110862e-05f, -1.595052764e-05f, +2.483449136e-05f, +6.430585546e-05f, +1.004049721e-04f, +1.313270034e-04f, +1.556516572e-04f, +1.724387800e-04f, +1.812807091e-04f, +1.823078213e-04f, +1.761484629e-04f, +1.638489388e-04f, +1.467629763e-04f, +1.264226756e-04f, +1.044041619e-04f, +8.220090042e-05f, +6.111600674e-05f, +4.218214685e-05f, +2.611413971e-05f, +1.329559004e-05f, +3.797240619e-06f, -2.578353981e-06f, -6.233451705e-06f, -7.701834142e-06f, -7.574460766e-06f, -6.431978801e-06f,\n    +5.548728275e-04f, +1.114784822e-03f, +1.851179776e-03f, +2.631500672e-03f, +3.213541556e-03f, +3.260930802e-03f, +2.392988496e-03f, +2.666082695e-04f, -3.322013793e-03f, -8.336767698e-03f, -1.442812445e-02f, -2.091184558e-02f, -2.681737377e-02f, -3.100983176e-02f, -3.237270252e-02f, -3.002191345e-02f, -2.351037908e-02f, -1.297853332e-02f, +7.872219866e-04f, +1.641044598e-02f, +3.209499175e-02f, +4.588571491e-02f, +5.597512760e-02f, +6.099969408e-02f, +6.026919808e-02f, +5.388441771e-02f, +4.271988361e-02f, +2.827513312e-02f, +1.242375929e-02f, -2.890980184e-03f, -1.595632833e-02f, -2.553162466e-02f, -3.099137055e-02f, -3.235162018e-02f, -3.018566365e-02f, -2.545599984e-02f, -1.930321357e-02f, -1.283624241e-02f, -6.962712239e-03f, -2.284810508e-03f, +9.307050260e-04f, +2.716112319e-03f, +3.319940450e-03f, +3.103750651e-03f, +2.443702875e-03f, +1.655925896e-03f, +9.554011660e-04f, +4.484017248e-04f,\n    -1.405029109e-05f, -2.057740610e-05f, -2.464686208e-05f, -2.291839499e-05f, -1.202955281e-05f, +1.039044230e-05f, +4.463255849e-05f, +8.804014709e-05f, +1.346672613e-04f, +1.756942389e-04f, +2.006766703e-04f, +1.994981936e-04f, +1.646898946e-04f, +9.362568470e-05f, -9.947263949e-06f, -1.355041440e-04f, -2.667201318e-04f, -3.837936558e-04f, -4.667643167e-04f, -4.992135781e-04f, -4.715976586e-04f, -3.834879467e-04f, -2.441885755e-04f, -7.152591317e-05f, +1.110106893e-04f, +2.782416943e-04f, +4.076048624e-04f, +4.829448989e-04f, +4.970466386e-04f, +4.524474573e-04f, +3.604343844e-04f, +2.385102389e-04f, +1.069147467e-04f, -1.505410309e-05f, -1.121851058e-04f, -1.754021216e-04f, -2.024314911e-04f, -1.971206335e-04f, -1.677179014e-04f, -1.246036813e-04f, -7.801328021e-05f, -3.621603328e-05f, -4.445116563e-06f, +1.533943858e-05f, +2.397027294e-05f, +2.412967932e-05f, +1.925444200e-05f, +1.257055940e-05f,\n    /*  1,13 (48) */\n    -3.889197914e-04f, -6.219128568e-04f, -8.697410138e-04f, -1.086939950e-03f, -1.209108819e-03f, -1.154077757e-03f, -8.254036453e-04f, -1.182383022e-04f, +1.072662996e-03f, +2.843308820e-03f, +5.269988024e-03f, +8.398904437e-03f, +1.223700370e-02f, +1.674505894e-02f, +2.183395425e-02f, +2.736486182e-02f, +3.315367029e-02f, +3.897961971e-02f, +4.459767564e-02f, +4.975377555e-02f, +5.420175269e-02f, +5.772052307e-02f, +6.013003955e-02f, +6.130458616e-02f, +6.118220139e-02f, +5.976936179e-02f, +5.714049121e-02f, +5.343234143e-02f, +4.883376509e-02f, +4.357182196e-02f, +3.789548084e-02f, +3.205836840e-02f, +2.630205700e-02f, +2.084127438e-02f, +1.585217601e-02f, +1.146447595e-02f, +7.757824868e-03f, +4.762401517e-03f, +2.463290632e-03f, +8.078978082e-04f, -2.845707051e-04f, -9.126404473e-04f, -1.182175717e-03f, -1.196999621e-03f, -1.051255956e-03f, -8.239768076e-04f, -5.760345548e-04f, -3.493857651e-04f,\n    +6.698551799e-06f, +7.692569891e-06f, +7.566115013e-06f, +5.731996914e-06f, +1.604532908e-06f, -5.331145428e-06f, -1.544430097e-05f, -2.888647360e-05f, -4.553096181e-05f, -6.493255712e-05f, -8.631481091e-05f, -1.085897106e-04f, -1.304114247e-04f, -1.502620772e-04f, -1.665637486e-04f, -1.778075273e-04f, -1.826878783e-04f, -1.802292123e-04f, -1.698915531e-04f, -1.516436772e-04f, -1.259949353e-04f, -9.398087530e-05f, -5.710236930e-05f, -1.722268318e-05f, +2.356870096e-05f, +6.311320721e-05f, +9.934671235e-05f, +1.304543135e-04f, +1.550020465e-04f, +1.720337218e-04f, +1.811247071e-04f, +1.823889449e-04f, +1.764402438e-04f, +1.643133904e-04f, +1.473543959e-04f, +1.270918263e-04f, +1.051024197e-04f, +8.288397896e-05f, +6.174694096e-05f, +4.273331820e-05f, +2.656823942e-05f, +1.364553606e-05f, +4.045170841e-06f, -2.422804631e-06f, -6.155328848e-06f, -7.683214852e-06f, -7.596710501e-06f, -6.477690047e-06f,\n    +5.408225365e-04f, +1.094207416e-03f, +1.826532914e-03f, +2.608582277e-03f, +3.201512003e-03f, +3.271321245e-03f, +2.437621054e-03f, +3.546484166e-04f, -3.187346532e-03f, -8.161073460e-03f, -1.422744778e-02f, -2.071234739e-02f, -2.665268387e-02f, -3.091620608e-02f, -3.238264978e-02f, -3.015741759e-02f, -2.377709921e-02f, -1.336232698e-02f, +3.204576699e-04f, +1.591123240e-02f, +3.162339409e-02f, +4.550222697e-02f, +5.573093902e-02f, +6.092816816e-02f, +6.038020877e-02f, +5.416265940e-02f, +4.312748847e-02f, +2.875807801e-02f, +1.292080593e-02f, -2.438532727e-03f, -1.559589395e-02f, -2.529311442e-02f, -3.088445581e-02f, -3.236667428e-02f, -3.029784876e-02f, -2.563140196e-02f, -1.950564506e-02f, -1.303336304e-02f, -7.130430141e-03f, -2.409414189e-03f, +8.526917458e-04f, +2.679896285e-03f, +3.315495333e-03f, +3.119090090e-03f, +2.467673148e-03f, +1.680055575e-03f, +9.746556080e-04f, +4.609722842e-04f,\n    -1.383773357e-05f, -2.039466990e-05f, -2.458907746e-05f, -2.309495914e-05f, -1.253627391e-05f, +9.505530872e-06f, +4.340151373e-05f, +8.659576347e-05f, +1.332431650e-04f, +1.745991863e-04f, +2.002436315e-04f, +2.000155457e-04f, +1.663280088e-04f, +9.637563473e-05f, -6.306474398e-06f, -1.313979444e-04f, -2.627264553e-04f, -3.805526914e-04f, -4.648653351e-04f, -4.990808307e-04f, -4.733993232e-04f, -3.870886467e-04f, -2.491576510e-04f, -7.720212654e-05f, +1.054093829e-04f, +2.734844944e-04f, +4.043170167e-04f, +4.815050153e-04f, +4.975320429e-04f, +4.546367993e-04f, +3.638645247e-04f, +2.425733656e-04f, +1.109741421e-04f, -1.155365566e-05f, -1.096333455e-04f, -1.739795362e-04f, -2.021098317e-04f, -1.977021306e-04f, -1.689001464e-04f, -1.260533915e-04f, -7.943260847e-05f, -3.738911081e-05f, -5.258764720e-06f, +1.490020064e-05f, +2.384580553e-05f, +2.421911742e-05f, +1.944923643e-05f, +1.278048359e-05f,\n    /*  1,14 (48) */\n    -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f,\n    +6.655454364e-06f, +7.675507496e-06f, +7.592796692e-06f, +5.821084136e-06f, +1.773638826e-06f, -5.067743758e-06f, -1.507800476e-05f, -2.841648733e-05f, -4.496592050e-05f, -6.429140060e-05f, -8.562670900e-05f, -1.078929320e-04f, -1.297511522e-04f, -1.496872908e-04f, -1.661234121e-04f, -1.775464088e-04f, -1.826423998e-04f, -1.804237446e-04f, -1.703355517e-04f, -1.523299854e-04f, -1.268994749e-04f, -9.506381053e-05f, -5.831068052e-05f, -1.849394269e-05f, +2.230168514e-05f, +6.191730505e-05f, +9.828341550e-05f, +1.295751782e-04f, +1.543450521e-04f, +1.716208647e-04f, +1.809610208e-04f, +1.824629900e-04f, +1.767259657e-04f, +1.647731083e-04f, +1.479425855e-04f, +1.277592971e-04f, +1.058004694e-04f, +8.356813575e-05f, +6.237997497e-05f, +4.328729862e-05f, +2.702553133e-05f, +1.399874871e-05f, +4.296176977e-06f, -2.264573046e-06f, -6.075048267e-06f, -7.663019833e-06f, -7.617957255e-06f, -6.522907823e-06f,\n    +5.269848029e-04f, +1.073812746e-03f, +1.801943836e-03f, +2.585487318e-03f, +3.188975729e-03f, +3.280826776e-03f, +2.481022568e-03f, +4.412441800e-04f, -3.054103367e-03f, -7.986474273e-03f, -1.402720415e-02f, -2.051233184e-02f, -2.648635586e-02f, -3.081983044e-02f, -3.238895626e-02f, -3.028881553e-02f, -2.403982567e-02f, -1.374287967e-02f, -1.444076651e-04f, +1.541215157e-02f, +3.114999476e-02f, +4.511513832e-02f, +5.548178137e-02f, +6.085096604e-02f, +6.048561815e-02f, +5.443614390e-02f, +4.353180549e-02f, +2.923958303e-02f, +1.341833798e-02f, -1.983895928e-03f, -1.523202942e-02f, -2.505054105e-02f, -3.077348167e-02f, -3.237822794e-02f, -3.040748210e-02f, -2.580538150e-02f, -1.970775489e-02f, -1.323106518e-02f, -7.299330287e-03f, -2.535467581e-03f, +7.732591374e-04f, +2.642507175e-03f, +3.310236568e-03f, +3.133990291e-03f, +2.491518953e-03f, +1.704274692e-03f, +9.941048444e-04f, +4.737527678e-04f,\n    -1.362546371e-05f, -2.020969306e-05f, -2.452574511e-05f, -2.326259437e-05f, -1.303161231e-05f, +8.632439490e-06f, +4.217982515e-05f, +8.515499721e-05f, +1.318140456e-04f, +1.734887737e-04f, +1.997851162e-04f, +2.004998266e-04f, +1.679301801e-04f, +9.909305502e-05f, -2.688059979e-06f, -1.272981371e-04f, -2.587196197e-04f, -3.772787163e-04f, -4.629168670e-04f, -4.988888348e-04f, -4.751409672e-04f, -3.906382195e-04f, -2.540930173e-04f, -8.286778134e-05f, +9.979367328e-05f, +2.686903983e-04f, +4.009760422e-04f, +4.800045906e-04f, +4.979591725e-04f, +4.567788623e-04f, +3.672646271e-04f, +2.466264993e-04f, +1.150427340e-04f, -8.028822401e-06f, -1.070480740e-04f, -1.725210712e-04f, -2.017560275e-04f, -1.982596258e-04f, -1.700686873e-04f, -1.274995807e-04f, -8.085666129e-05f, -3.857214372e-05f, -6.084337856e-06f, +1.444985736e-05f, +2.371290417e-05f, +2.430355154e-05f, +1.964224932e-05f, +1.299099421e-05f,\n    /*  1,15 (48) */\n    -3.755657852e-04f, -6.065447794e-04f, -8.545821021e-04f, -1.075386869e-03f, -1.205730648e-03f, -1.164476647e-03f, -8.559259511e-04f, -1.755412632e-04f, +9.821661133e-04f, +2.714084862e-03f, +5.098046504e-03f, +8.182421794e-03f, +1.197684112e-02f, +1.644510957e-02f, +2.150126709e-02f, +2.700950789e-02f, +3.278834001e-02f, +3.861896676e-02f, +4.425744853e-02f, +4.944980188e-02f, +5.394885828e-02f, +5.753147838e-02f, +6.001462650e-02f, +6.126886953e-02f, +6.122807178e-02f, +5.989439231e-02f, +5.733812134e-02f, +5.369237093e-02f, +4.914311219e-02f, +4.391547655e-02f, +3.825756657e-02f, +3.242322034e-02f, +2.665522321e-02f, +2.117036087e-02f, +1.614747299e-02f, +1.171932707e-02f, +7.968727757e-03f, +4.928853632e-03f, +2.587417548e-03f, +8.939184250e-04f, -2.309769343e-04f, -8.849961625e-04f, -1.173834369e-03f, -1.201686999e-03f, -1.063486334e-03f, -8.393230423e-04f, -5.912492225e-04f, -3.623863630e-04f,\n    +6.611804677e-06f, +7.657373026e-06f, +7.617829132e-06f, +5.907943456e-06f, +1.940004617e-06f, -4.807454348e-06f, -1.471498148e-05f, -2.794966288e-05f, -4.440361746e-05f, -6.365223261e-05f, -8.493953768e-05f, -1.071957695e-04f, -1.290890081e-04f, -1.491090813e-04f, -1.656781636e-04f, -1.772790849e-04f, -1.825897425e-04f, -1.806105501e-04f, -1.707717740e-04f, -1.530089992e-04f, -1.277977209e-04f, -9.614191340e-05f, -5.951598093e-05f, -1.976424015e-05f, +2.103350960e-05f, +6.071820940e-05f, +9.721513218e-05f, +1.286896348e-04f, +1.536806957e-04f, +1.712002137e-04f, +1.807896387e-04f, +1.825299310e-04f, +1.770055917e-04f, +1.652280476e-04f, +1.485274967e-04f, +1.284250404e-04f, +1.064982673e-04f, +8.425333425e-05f, +6.301508140e-05f, +4.384407088e-05f, +2.748600830e-05f, +1.435522994e-05f, +4.550268416e-06f, -2.103644554e-06f, -5.992592328e-06f, -7.641230718e-06f, -7.638183844e-06f, -6.567617582e-06f,\n    +5.133593392e-04f, +1.053603053e-03f, +1.777418091e-03f, +2.562224724e-03f, +3.175944117e-03f, +3.289459215e-03f, +2.523202393e-03f, +5.263991772e-04f, -2.922289321e-03f, -7.812985500e-03f, -1.382741904e-02f, -2.031183202e-02f, -2.631842568e-02f, -3.072073739e-02f, -3.239164432e-02f, -3.041611367e-02f, -2.429854529e-02f, -1.412015839e-02f, -6.073245321e-04f, +1.491326273e-02f, +3.067485380e-02f, +4.472450010e-02f, +5.522768835e-02f, +6.076809826e-02f, +6.058541183e-02f, +5.470483430e-02f, +4.393278153e-02f, +2.971958762e-02f, +1.391629715e-02f, -1.527117065e-03f, -1.486476480e-02f, -2.480391455e-02f, -3.065843893e-02f, -3.238625676e-02f, -3.051453018e-02f, -2.597790257e-02f, -1.990951092e-02f, -1.342932480e-02f, -7.469398974e-03f, -2.662967162e-03f, +6.924024761e-04f, +2.603935031e-03f, +3.304152230e-03f, +3.148440148e-03f, +2.515231857e-03f, +1.728578244e-03f, +1.013747094e-03f, +4.867437620e-04f,\n    -1.341354347e-05f, -2.002256905e-05f, -2.445697407e-05f, -2.342139801e-05f, -1.351561964e-05f, +7.771194801e-06f, +4.096761910e-05f, +8.371807564e-05f, +1.303802073e-04f, +1.723633322e-04f, +1.993014146e-04f, +2.009512126e-04f, +1.694964089e-04f, +1.017777359e-04f, +9.075653692e-07f, -1.232052905e-04f, -2.547002593e-04f, -3.739723191e-04f, -4.609193410e-04f, -4.986377677e-04f, -4.768224673e-04f, -3.941362476e-04f, -2.589940252e-04f, -8.852210449e-05f, +9.416432483e-05f, +2.638600314e-04f, +3.975823219e-04f, +4.784437097e-04f, +4.983278153e-04f, +4.588731922e-04f, +3.706340911e-04f, +2.506690081e-04f, +1.191199691e-04f, -4.479993558e-06f, -1.044294743e-04f, -1.710267017e-04f, -2.013698844e-04f, -1.987928195e-04f, -1.712231930e-04f, -1.289419522e-04f, -8.228522318e-05f, -3.976501868e-05f, -6.921820601e-06f, +1.398834949e-05f, +2.357146827e-05f, +2.438287329e-05f, +1.983339052e-05f, +1.320203372e-05f,\n    /*  1,16 (48) */\n    -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f,\n    +6.567617582e-06f, +7.638183844e-06f, +7.641230718e-06f, +5.992592328e-06f, +2.103644554e-06f, -4.550268416e-06f, -1.435522994e-05f, -2.748600830e-05f, -4.384407088e-05f, -6.301508140e-05f, -8.425333425e-05f, -1.064982673e-04f, -1.284250404e-04f, -1.485274967e-04f, -1.652280476e-04f, -1.770055917e-04f, -1.825299310e-04f, -1.807896387e-04f, -1.712002137e-04f, -1.536806957e-04f, -1.286896348e-04f, -9.721513218e-05f, -6.071820940e-05f, -2.103350960e-05f, +1.976424015e-05f, +5.951598093e-05f, +9.614191340e-05f, +1.277977209e-04f, +1.530089992e-04f, +1.707717740e-04f, +1.806105501e-04f, +1.825897425e-04f, +1.772790849e-04f, +1.656781636e-04f, +1.491090813e-04f, +1.290890081e-04f, +1.071957695e-04f, +8.493953768e-05f, +6.365223261e-05f, +4.440361746e-05f, +2.794966288e-05f, +1.471498148e-05f, +4.807454348e-06f, -1.940004617e-06f, -5.907943456e-06f, -7.617829132e-06f, -7.657373026e-06f, -6.611804677e-06f,\n    +4.999457957e-04f, +1.033580484e-03f, +1.752961117e-03f, +2.538803326e-03f, +3.162428497e-03f, +3.297230410e-03f, +2.564170012e-03f, +6.101172529e-04f, -2.791909114e-03f, -7.640622167e-03f, -1.362811762e-02f, -2.011088080e-02f, -2.614892927e-02f, -3.061895965e-02f, -3.239073675e-02f, -3.053931896e-02f, -2.455324555e-02f, -1.449413070e-02f, -1.068243873e-03f, +1.441462496e-02f, +3.019803133e-02f, +4.433036385e-02f, +5.496869433e-02f, +6.067957615e-02f, +6.067957615e-02f, +5.496869433e-02f, +4.433036385e-02f, +3.019803133e-02f, +1.441462496e-02f, -1.068243873e-03f, -1.449413070e-02f, -2.455324555e-02f, -3.053931896e-02f, -3.239073675e-02f, -3.061895965e-02f, -2.614892927e-02f, -2.011088080e-02f, -1.362811762e-02f, -7.640622167e-03f, -2.791909114e-03f, +6.101172529e-04f, +2.564170012e-03f, +3.297230410e-03f, +3.162428497e-03f, +2.538803326e-03f, +1.752961117e-03f, +1.033580484e-03f, +4.999457957e-04f,\n    -1.320203372e-05f, -1.983339052e-05f, -2.438287329e-05f, -2.357146827e-05f, -1.398834949e-05f, +6.921820601e-06f, +3.976501868e-05f, +8.228522318e-05f, +1.289419522e-04f, +1.712231930e-04f, +1.987928195e-04f, +2.013698844e-04f, +1.710267017e-04f, +1.044294743e-04f, +4.479993558e-06f, -1.191199691e-04f, -2.506690081e-04f, -3.706340911e-04f, -4.588731922e-04f, -4.983278153e-04f, -4.784437097e-04f, -3.975823219e-04f, -2.638600314e-04f, -9.416432483e-05f, +8.852210449e-05f, +2.589940252e-04f, +3.941362476e-04f, +4.768224673e-04f, +4.986377677e-04f, +4.609193410e-04f, +3.739723191e-04f, +2.547002593e-04f, +1.232052905e-04f, -9.075653692e-07f, -1.017777359e-04f, -1.694964089e-04f, -2.009512126e-04f, -1.993014146e-04f, -1.723633322e-04f, -1.303802073e-04f, -8.371807564e-05f, -4.096761910e-05f, -7.771194801e-06f, +1.351561964e-05f, +2.342139801e-05f, +2.445697407e-05f, +2.002256905e-05f, +1.341354347e-05f,\n    /*  1,17 (48) */\n    -3.623863630e-04f, -5.912492225e-04f, -8.393230423e-04f, -1.063486334e-03f, -1.201686999e-03f, -1.173834369e-03f, -8.849961625e-04f, -2.309769343e-04f, +8.939184250e-04f, +2.587417548e-03f, +4.928853632e-03f, +7.968727757e-03f, +1.171932707e-02f, +1.614747299e-02f, +2.117036087e-02f, +2.665522321e-02f, +3.242322034e-02f, +3.825756657e-02f, +4.391547655e-02f, +4.914311219e-02f, +5.369237093e-02f, +5.733812134e-02f, +5.989439231e-02f, +6.122807178e-02f, +6.126886953e-02f, +6.001462650e-02f, +5.753147838e-02f, +5.394885828e-02f, +4.944980188e-02f, +4.425744853e-02f, +3.861896676e-02f, +3.278834001e-02f, +2.700950789e-02f, +2.150126709e-02f, +1.644510957e-02f, +1.197684112e-02f, +8.182421794e-03f, +5.098046504e-03f, +2.714084862e-03f, +9.821661133e-04f, -1.755412632e-04f, -8.559259511e-04f, -1.164476647e-03f, -1.205730648e-03f, -1.075386869e-03f, -8.545821021e-04f, -6.065447794e-04f, -3.755657852e-04f,\n    +6.522907823e-06f, +7.617957255e-06f, +7.663019833e-06f, +6.075048267e-06f, +2.264573046e-06f, -4.296176977e-06f, -1.399874871e-05f, -2.702553133e-05f, -4.328729862e-05f, -6.237997497e-05f, -8.356813575e-05f, -1.058004694e-04f, -1.277592971e-04f, -1.479425855e-04f, -1.647731083e-04f, -1.767259657e-04f, -1.824629900e-04f, -1.809610208e-04f, -1.716208647e-04f, -1.543450521e-04f, -1.295751782e-04f, -9.828341550e-05f, -6.191730505e-05f, -2.230168514e-05f, +1.849394269e-05f, +5.831068052e-05f, +9.506381053e-05f, +1.268994749e-04f, +1.523299854e-04f, +1.703355517e-04f, +1.804237446e-04f, +1.826423998e-04f, +1.775464088e-04f, +1.661234121e-04f, +1.496872908e-04f, +1.297511522e-04f, +1.078929320e-04f, +8.562670900e-05f, +6.429140060e-05f, +4.496592050e-05f, +2.841648733e-05f, +1.507800476e-05f, +5.067743758e-06f, -1.773638826e-06f, -5.821084136e-06f, -7.592796692e-06f, -7.675507496e-06f, -6.655454364e-06f,\n    +4.867437620e-04f, +1.013747094e-03f, +1.728578244e-03f, +2.515231857e-03f, +3.148440148e-03f, +3.304152230e-03f, +2.603935031e-03f, +6.924024761e-04f, -2.662967162e-03f, -7.469398974e-03f, -1.342932480e-02f, -1.990951092e-02f, -2.597790257e-02f, -3.051453018e-02f, -3.238625676e-02f, -3.065843893e-02f, -2.480391455e-02f, -1.486476480e-02f, -1.527117065e-03f, +1.391629715e-02f, +2.971958762e-02f, +4.393278153e-02f, +5.470483430e-02f, +6.058541183e-02f, +6.076809826e-02f, +5.522768835e-02f, +4.472450010e-02f, +3.067485380e-02f, +1.491326273e-02f, -6.073245321e-04f, -1.412015839e-02f, -2.429854529e-02f, -3.041611367e-02f, -3.239164432e-02f, -3.072073739e-02f, -2.631842568e-02f, -2.031183202e-02f, -1.382741904e-02f, -7.812985500e-03f, -2.922289321e-03f, +5.263991772e-04f, +2.523202393e-03f, +3.289459215e-03f, +3.175944117e-03f, +2.562224724e-03f, +1.777418091e-03f, +1.053603053e-03f, +5.133593392e-04f,\n    -1.299099421e-05f, -1.964224932e-05f, -2.430355154e-05f, -2.371290417e-05f, -1.444985736e-05f, +6.084337856e-06f, +3.857214372e-05f, +8.085666129e-05f, +1.274995807e-04f, +1.700686873e-04f, +1.982596258e-04f, +2.017560275e-04f, +1.725210712e-04f, +1.070480740e-04f, +8.028822401e-06f, -1.150427340e-04f, -2.466264993e-04f, -3.672646271e-04f, -4.567788623e-04f, -4.979591725e-04f, -4.800045906e-04f, -4.009760422e-04f, -2.686903983e-04f, -9.979367328e-05f, +8.286778134e-05f, +2.540930173e-04f, +3.906382195e-04f, +4.751409672e-04f, +4.988888348e-04f, +4.629168670e-04f, +3.772787163e-04f, +2.587196197e-04f, +1.272981371e-04f, +2.688059979e-06f, -9.909305502e-05f, -1.679301801e-04f, -2.004998266e-04f, -1.997851162e-04f, -1.734887737e-04f, -1.318140456e-04f, -8.515499721e-05f, -4.217982515e-05f, -8.632439490e-06f, +1.303161231e-05f, +2.326259437e-05f, +2.452574511e-05f, +2.020969306e-05f, +1.362546371e-05f,\n    /*  1,18 (48) */\n    -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f,\n    +6.477690047e-06f, +7.596710501e-06f, +7.683214852e-06f, +6.155328848e-06f, +2.422804631e-06f, -4.045170841e-06f, -1.364553606e-05f, -2.656823942e-05f, -4.273331820e-05f, -6.174694096e-05f, -8.288397896e-05f, -1.051024197e-04f, -1.270918263e-04f, -1.473543959e-04f, -1.643133904e-04f, -1.764402438e-04f, -1.823889449e-04f, -1.811247071e-04f, -1.720337218e-04f, -1.550020465e-04f, -1.304543135e-04f, -9.934671235e-05f, -6.311320721e-05f, -2.356870096e-05f, +1.722268318e-05f, +5.710236930e-05f, +9.398087530e-05f, +1.259949353e-04f, +1.516436772e-04f, +1.698915531e-04f, +1.802292123e-04f, +1.826878783e-04f, +1.778075273e-04f, +1.665637486e-04f, +1.502620772e-04f, +1.304114247e-04f, +1.085897106e-04f, +8.631481091e-05f, +6.493255712e-05f, +4.553096181e-05f, +2.888647360e-05f, +1.544430097e-05f, +5.331145428e-06f, -1.604532908e-06f, -5.731996914e-06f, -7.566115013e-06f, -7.692569891e-06f, -6.698551799e-06f,\n    +4.737527678e-04f, +9.941048444e-04f, +1.704274692e-03f, +2.491518953e-03f, +3.133990291e-03f, +3.310236568e-03f, +2.642507175e-03f, +7.732591374e-04f, -2.535467581e-03f, -7.299330287e-03f, -1.323106518e-02f, -1.970775489e-02f, -2.580538150e-02f, -3.040748210e-02f, -3.237822794e-02f, -3.077348167e-02f, -2.505054105e-02f, -1.523202942e-02f, -1.983895928e-03f, +1.341833798e-02f, +2.923958303e-02f, +4.353180549e-02f, +5.443614390e-02f, +6.048561815e-02f, +6.085096604e-02f, +5.548178137e-02f, +4.511513832e-02f, +3.114999476e-02f, +1.541215157e-02f, -1.444076651e-04f, -1.374287967e-02f, -2.403982567e-02f, -3.028881553e-02f, -3.238895626e-02f, -3.081983044e-02f, -2.648635586e-02f, -2.051233184e-02f, -1.402720415e-02f, -7.986474273e-03f, -3.054103367e-03f, +4.412441800e-04f, +2.481022568e-03f, +3.280826776e-03f, +3.188975729e-03f, +2.585487318e-03f, +1.801943836e-03f, +1.073812746e-03f, +5.269848029e-04f,\n    -1.278048359e-05f, -1.944923643e-05f, -2.421911742e-05f, -2.384580553e-05f, -1.490020064e-05f, +5.258764720e-06f, +3.738911081e-05f, +7.943260847e-05f, +1.260533915e-04f, +1.689001464e-04f, +1.977021306e-04f, +2.021098317e-04f, +1.739795362e-04f, +1.096333455e-04f, +1.155365566e-05f, -1.109741421e-04f, -2.425733656e-04f, -3.638645247e-04f, -4.546367993e-04f, -4.975320429e-04f, -4.815050153e-04f, -4.043170167e-04f, -2.734844944e-04f, -1.054093829e-04f, +7.720212654e-05f, +2.491576510e-04f, +3.870886467e-04f, +4.733993232e-04f, +4.990808307e-04f, +4.648653351e-04f, +3.805526914e-04f, +2.627264553e-04f, +1.313979444e-04f, +6.306474398e-06f, -9.637563473e-05f, -1.663280088e-04f, -2.000155457e-04f, -2.002436315e-04f, -1.745991863e-04f, -1.332431650e-04f, -8.659576347e-05f, -4.340151373e-05f, -9.505530872e-06f, +1.253627391e-05f, +2.309495914e-05f, +2.458907746e-05f, +2.039466990e-05f, +1.383773357e-05f,\n    /*  1,19 (48) */\n    -3.493857651e-04f, -5.760345548e-04f, -8.239768076e-04f, -1.051255956e-03f, -1.196999621e-03f, -1.182175717e-03f, -9.126404473e-04f, -2.845707051e-04f, +8.078978082e-04f, +2.463290632e-03f, +4.762401517e-03f, +7.757824868e-03f, +1.146447595e-02f, +1.585217601e-02f, +2.084127438e-02f, +2.630205700e-02f, +3.205836840e-02f, +3.789548084e-02f, +4.357182196e-02f, +4.883376509e-02f, +5.343234143e-02f, +5.714049121e-02f, +5.976936179e-02f, +6.118220139e-02f, +6.130458616e-02f, +6.013003955e-02f, +5.772052307e-02f, +5.420175269e-02f, +4.975377555e-02f, +4.459767564e-02f, +3.897961971e-02f, +3.315367029e-02f, +2.736486182e-02f, +2.183395425e-02f, +1.674505894e-02f, +1.223700370e-02f, +8.398904437e-03f, +5.269988024e-03f, +2.843308820e-03f, +1.072662996e-03f, -1.182383022e-04f, -8.254036453e-04f, -1.154077757e-03f, -1.209108819e-03f, -1.086939950e-03f, -8.697410138e-04f, -6.219128568e-04f, -3.889197914e-04f,\n    +6.431978801e-06f, +7.574460766e-06f, +7.701834142e-06f, +6.233451705e-06f, +2.578353981e-06f, -3.797240619e-06f, -1.329559004e-05f, -2.611413971e-05f, -4.218214685e-05f, -6.111600674e-05f, -8.220090042e-05f, -1.044041619e-04f, -1.264226756e-04f, -1.467629763e-04f, -1.638489388e-04f, -1.761484629e-04f, -1.823078213e-04f, -1.812807091e-04f, -1.724387800e-04f, -1.556516572e-04f, -1.313270034e-04f, -1.004049721e-04f, -6.430585546e-05f, -2.483449136e-05f, +1.595052764e-05f, +5.589110862e-05f, +9.289315982e-05f, +1.250841413e-04f, +1.509500984e-04f, +1.694397852e-04f, +1.800269439e-04f, +1.827261540e-04f, +1.780624044e-04f, +1.669991291e-04f, +1.508333922e-04f, +1.310697774e-04f, +1.092860609e-04f, +8.700380586e-05f, +6.557567358e-05f, +4.609872289e-05f, +2.935961333e-05f, +1.581387101e-05f, +5.597667930e-06f, -1.432672729e-06f, -5.640664402e-06f, -7.537765705e-06f, -7.708542790e-06f, -6.741082046e-06f,\n    +4.609722842e-04f, +9.746556080e-04f, +1.680055575e-03f, +2.467673148e-03f, +3.119090090e-03f, +3.315495333e-03f, +2.679896285e-03f, +8.526917458e-04f, -2.409414189e-03f, -7.130430141e-03f, -1.303336304e-02f, -1.950564506e-02f, -2.563140196e-02f, -3.029784876e-02f, -3.236667428e-02f, -3.088445581e-02f, -2.529311442e-02f, -1.559589395e-02f, -2.438532727e-03f, +1.292080593e-02f, +2.875807801e-02f, +4.312748847e-02f, +5.416265940e-02f, +6.038020877e-02f, +6.092816816e-02f, +5.573093902e-02f, +4.550222697e-02f, +3.162339409e-02f, +1.591123240e-02f, +3.204576699e-04f, -1.336232698e-02f, -2.377709921e-02f, -3.015741759e-02f, -3.238264978e-02f, -3.091620608e-02f, -2.665268387e-02f, -2.071234739e-02f, -1.422744778e-02f, -8.161073460e-03f, -3.187346532e-03f, +3.546484166e-04f, +2.437621054e-03f, +3.271321245e-03f, +3.201512003e-03f, +2.608582277e-03f, +1.826532914e-03f, +1.094207416e-03f, +5.408225365e-04f,\n    -1.257055940e-05f, -1.925444200e-05f, -2.412967932e-05f, -2.397027294e-05f, -1.533943858e-05f, +4.445116563e-06f, +3.621603328e-05f, +7.801328021e-05f, +1.246036813e-04f, +1.677179014e-04f, +1.971206335e-04f, +2.024314911e-04f, +1.754021216e-04f, +1.121851058e-04f, +1.505410309e-05f, -1.069147467e-04f, -2.385102389e-04f, -3.604343844e-04f, -4.524474573e-04f, -4.970466386e-04f, -4.829448989e-04f, -4.076048624e-04f, -2.782416943e-04f, -1.110106893e-04f, +7.152591317e-05f, +2.441885755e-04f, +3.834879467e-04f, +4.715976586e-04f, +4.992135781e-04f, +4.667643167e-04f, +3.837936558e-04f, +2.667201318e-04f, +1.355041440e-04f, +9.947263949e-06f, -9.362568470e-05f, -1.646898946e-04f, -1.994981936e-04f, -2.006766703e-04f, -1.756942389e-04f, -1.346672613e-04f, -8.804014709e-05f, -4.463255849e-05f, -1.039044230e-05f, +1.202955281e-05f, +2.291839499e-05f, +2.464686208e-05f, +2.057740610e-05f, +1.405029109e-05f,\n    /*  1,20 (48) */\n    -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f,\n    +6.385788534e-06f, +7.551225169e-06f, +7.718896060e-06f, +6.309434527e-06f, +2.731235893e-06f, -3.552376721e-06f, -1.294890841e-05f, -2.566323901e-05f, -4.163380147e-05f, -6.048719935e-05f, -8.151893637e-05f, -1.037057395e-04f, -1.257518931e-04f, -1.461683752e-04f, -1.633797983e-04f, -1.758506607e-04f, -1.822196454e-04f, -1.814290384e-04f, -1.728360349e-04f, -1.562938633e-04f, -1.321932110e-04f, -1.014581444e-04f, -6.549518960e-05f, -2.609899070e-05f, +1.467754219e-05f, +5.467696004e-05f, +9.180071650e-05f, +1.241671324e-04f, +1.502492729e-04f, +1.689802556e-04f, +1.798169304e-04f, +1.827572033e-04f, +1.783110046e-04f, +1.674295098e-04f, +1.514011878e-04f, +1.317261621e-04f, +1.099819384e-04f, +8.769365605e-05f, +6.622072111e-05f, +4.666918493e-05f, +2.983589784e-05f, +1.618671553e-05f, +5.867319628e-06f, -1.258044290e-06f, -5.547069277e-06f, -7.507730380e-06f, -7.723408718e-06f, -6.783030070e-06f,\n    +4.484017248e-04f, +9.554011660e-04f, +1.655925896e-03f, +2.443702875e-03f, +3.103750651e-03f, +3.319940450e-03f, +2.716112319e-03f, +9.307050260e-04f, -2.284810508e-03f, -6.962712239e-03f, -1.283624241e-02f, -1.930321357e-02f, -2.545599984e-02f, -3.018566365e-02f, -3.235162018e-02f, -3.099137055e-02f, -2.553162466e-02f, -1.595632833e-02f, -2.890980184e-03f, +1.242375929e-02f, +2.827513312e-02f, +4.271988361e-02f, +5.388441771e-02f, +6.026919808e-02f, +6.099969408e-02f, +5.597512760e-02f, +4.588571491e-02f, +3.209499175e-02f, +1.641044598e-02f, +7.872219866e-04f, -1.297853332e-02f, -2.351037908e-02f, -3.002191345e-02f, -3.237270252e-02f, -3.100983176e-02f, -2.681737377e-02f, -2.091184558e-02f, -1.442812445e-02f, -8.336767698e-03f, -3.322013793e-03f, +2.666082695e-04f, +2.392988496e-03f, +3.260930802e-03f, +3.213541556e-03f, +2.631500672e-03f, +1.851179776e-03f, +1.114784822e-03f, +5.548728275e-04f,\n    -1.236127806e-05f, -1.905795531e-05f, -2.403534541e-05f, -2.408640770e-05f, -1.576763225e-05f, +3.643405993e-06f, +3.505302122e-05f, +7.659888899e-05f, +1.231507447e-04f, +1.665222834e-04f, +1.965154358e-04f, +2.027212045e-04f, +1.767888582e-04f, +1.147031788e-04f, +1.852978049e-05f, -1.028650970e-04f, -2.344377501e-04f, -3.569748093e-04f, -4.502112968e-04f, -4.965031808e-04f, -4.843241664e-04f, -4.108392049e-04f, -2.829613790e-04f, -1.165968301e-04f, +6.583991611e-05f, +2.391864458e-04f, +3.798365454e-04f, +4.697361063e-04f, +4.992869089e-04f, +4.686133899e-04f, +3.870010247e-04f, +2.707000147e-04f, +1.396161639e-04f, +1.361000888e-05f, -9.084342132e-05f, -1.630158436e-04f, -1.989475989e-04f, -2.010839449e-04f, -1.767736006e-04f, -1.360860288e-04f, -8.948791782e-05f, -4.587282982e-05f, -1.128714424e-05f, +1.151139937e-05f, +2.273280550e-05f, +2.469898981e-05f, +2.075780740e-05f, +1.426307319e-05f,\n    /*  1,21 (48) */\n    -3.365679977e-04f, -5.609088688e-04f, -8.085560774e-04f, -1.038713070e-03f, -1.191690031e-03f, -1.189525335e-03f, -9.388849457e-04f, -3.363480838e-04f, +7.240818599e-04f, +2.341687426e-03f, +4.598681680e-03f, +7.549714967e-03f, +1.121230138e-02f, +1.555924466e-02f, +2.051404564e-02f, +2.595005788e-02f, +3.169384093e-02f, +3.753277109e-02f, +4.322654714e-02f, +4.852181957e-02f, +5.316882122e-02f, +5.693862809e-02f, +5.963956075e-02f, +6.113126791e-02f, +6.133521423e-02f, +6.024060761e-02f, +5.790521695e-02f, +5.445100397e-02f, +5.005497492e-02f, +4.493609568e-02f, +3.933946359e-02f, +3.351915364e-02f, +2.772123523e-02f, +2.216838289e-02f, +1.704729352e-02f, +1.249979964e-02f, +8.618172436e-03f, +5.444685486e-03f, +2.975105214e-03f, +1.165430903e-03f, -5.904279106e-05f, -7.934030588e-04f, -1.142612770e-03f, -1.211799537e-03f, -1.098127684e-03f, -8.847865099e-04f, -6.373448083e-04f, -4.024439035e-04f,\n    +6.339133594e-06f, +7.527020764e-06f, +7.734418951e-06f, +6.383295056e-06f, +2.881465290e-06f, -3.310569361e-06f, -1.260548869e-05f, -2.521554387e-05f, -4.108829861e-05f, -5.986054554e-05f, -8.083812284e-05f, -1.030071957e-04f, -1.250795263e-04f, -1.455706410e-04f, -1.629060141e-04f, -1.755468747e-04f, -1.821244437e-04f, -1.815697075e-04f, -1.732254828e-04f, -1.569286442e-04f, -1.330529000e-04f, -1.025061794e-04f, -6.668114971e-05f, -2.736213345e-05f, +1.340379299e-05f, +5.345998535e-05f, +9.070359815e-05f, +1.232439486e-04f, +1.495412255e-04f, +1.685129721e-04f, +1.795991635e-04f, +1.827810030e-04f, +1.785532927e-04f, +1.678548470e-04f, +1.519654159e-04f, +1.323805306e-04f, +1.106772984e-04f, +8.838432342e-05f, +6.686767051e-05f, +4.724232877e-05f, +3.031531818e-05f, +1.656283491e-05f, +6.140108674e-06f, -1.080633738e-06f, -5.451194286e-06f, -7.475990650e-06f, -7.737150143e-06f, -6.824380746e-06f,\n    +4.360404467e-04f, +9.363432107e-04f, +1.631890550e-03f, +2.419616467e-03f, +3.087983019e-03f, +3.323583856e-03f, +2.751165340e-03f, +1.007303915e-03f, -2.161659764e-03f, -6.796189956e-03f, -1.263972698e-02f, -1.910049237e-02f, -2.527921098e-02f, -3.007096047e-02f, -3.233309040e-02f, -3.109423565e-02f, -2.576606241e-02f, -1.631330314e-02f, -3.341191481e-03f, +1.192725611e-02f, +2.779080895e-02f, +4.230904441e-02f, +5.360145633e-02f, +6.015260125e-02f, +6.106553399e-02f, +5.621431404e-02f, +4.626555146e-02f, +3.256472785e-02f, +1.690973288e-02f, +1.255835377e-03f, -1.259153230e-02f, -2.323967906e-02f, -2.988229728e-02f, -3.235909251e-02f, -3.110067518e-02f, -2.698038961e-02f, -2.111079318e-02f, -1.462920840e-02f, -8.513541299e-03f, -3.458099822e-03f, +1.771203517e-04f, +2.347115666e-03f, +3.249643658e-03f, +3.225052956e-03f, +2.654233478e-03f, +1.875878766e-03f, +1.135542630e-03f, +5.691359007e-04f,\n    -1.215269488e-05f, -1.885986474e-05f, -2.393622360e-05f, -2.419431183e-05f, -1.618484449e-05f, +2.853642879e-06f, +3.390018149e-05f, +7.518964427e-05f, +1.216948744e-04f, +1.653136230e-04f, +1.958868412e-04f, +2.029791747e-04f, +1.781397830e-04f, +1.171873950e-04f, +2.198030972e-05f, -9.882573812e-05f, -2.303565294e-04f, -3.534864055e-04f, -4.479287843e-04f, -4.959018989e-04f, -4.856427518e-04f, -4.140196788e-04f, -2.876429354e-04f, -1.221670459e-04f, +6.014491190e-05f, +2.341519224e-04f, +3.761348771e-04f, +4.678148086e-04f, +4.993006637e-04f, +4.704121395e-04f, +3.901742165e-04f, +2.746654690e-04f, +1.437334289e-04f, +1.729428370e-05f, -8.802906768e-05f, -1.613058679e-04f, -1.983635946e-04f, -2.014651700e-04f, -1.778369407e-04f, -1.374991601e-04f, -9.093884253e-05f, -4.712219483e-05f, -1.219560428e-05f, +1.098176596e-05f, +2.253809516e-05f, +2.474535144e-05f, +2.093577875e-05f, +1.447601573e-05f,\n    /*  1,22 (48) */\n    -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f,\n    +6.292028226e-06f, +7.501864540e-06f, +7.748421147e-06f, +6.455051086e-06f, +3.029057220e-06f, -3.071808559e-06f, -1.226532812e-05f, -2.477106051e-05f, -4.054565455e-05f, -5.923607174e-05f, -8.015849554e-05f, -1.023085737e-04f, -1.244056229e-04f, -1.449698222e-04f, -1.624276316e-04f, -1.752371429e-04f, -1.820222430e-04f, -1.817027291e-04f, -1.736071204e-04f, -1.575559798e-04f, -1.339060344e-04f, -1.035490276e-04f, -6.786367609e-05f, -2.862385418e-05f, +1.212934627e-05f, +5.224024653e-05f, +8.960185788e-05f, +1.223146305e-04f, +1.488259813e-04f, +1.680379435e-04f, +1.793736353e-04f, +1.827975304e-04f, +1.787892338e-04f, +1.682750973e-04f, +1.525260286e-04f, +1.330328344e-04f, +1.113720959e-04f, +8.907576968e-05f, +6.751649231e-05f, +4.781813497e-05f, +3.079786504e-05f, +1.694222924e-05f, +6.416043006e-06f, -9.004273601e-07f, -5.353022246e-06f, -7.442528130e-06f, -7.749749481e-06f, -6.865118852e-06f,\n    +4.238877519e-04f, +9.174833459e-04f, +1.607954327e-03f, +2.395422155e-03f, +3.071798175e-03f, +3.326437498e-03f, +2.785065521e-03f, +1.082493559e-03f, -2.039964889e-03f, -6.630876333e-03f, -1.244384013e-02f, -1.889751319e-02f, -2.510107120e-02f, -2.995377308e-02f, -3.231111009e-02f, -3.119306139e-02f, -2.599641894e-02f, -1.666678955e-02f, -3.789120265e-03f, +1.143135421e-02f, +2.730516620e-02f, +4.189502473e-02f, +5.331381339e-02f, +6.003043421e-02f, +6.112567891e-02f, +5.644846596e-02f, +4.664168634e-02f, +3.303254266e-02f, +1.740903355e-02f, +1.726247516e-03f, -1.220135808e-02f, -2.296501360e-02f, -2.973856385e-02f, -3.234179823e-02f, -3.118870425e-02f, -2.714169548e-02f, -2.130915678e-02f, -1.483067357e-02f, -8.691378240e-03f, -3.595598982e-03f, +8.618150913e-05f, +2.299993471e-03f, +3.237448054e-03f, +3.236034722e-03f, +2.676771573e-03f, +1.900624117e-03f, +1.156478409e-03f, +5.836119165e-04f,\n    -1.194486404e-05f, -1.866025781e-05f, -2.383242151e-05f, -2.429408800e-05f, -1.659113991e-05f, +2.075834377e-06f, +3.275761770e-05f, +7.378575245e-05f, +1.202363612e-04f, +1.640922509e-04f, +1.952351551e-04f, +2.032056088e-04f, +1.794549389e-04f, +1.196375918e-04f, +2.540531878e-05f, -9.479721092e-05f, -2.262672056e-04f, -3.499697813e-04f, -4.456003923e-04f, -4.952430311e-04f, -4.869005993e-04f, -4.171459276e-04f, -2.922857573e-04f, -1.277205798e-04f, +5.444167862e-05f, +2.290856711e-04f, +3.723833847e-04f, +4.658339177e-04f, +4.992546924e-04f, +4.721601571e-04f, +3.933126532e-04f, +2.786158599e-04f, +1.478553601e-04f, +2.099965721e-05f, -8.518285353e-05f, -1.595599860e-04f, -1.977460188e-04f, -2.018200630e-04f, -1.788839288e-04f, -1.389063463e-04f, -9.239268525e-05f, -4.838051740e-05f, -1.311578707e-05f, +1.044060700e-05f, +2.233416943e-05f, +2.478583769e-05f, +2.111122436e-05f, +1.468905343e-05f,\n    /*  1,23 (48) */\n    -3.239368359e-04f, -5.458799835e-04f, -7.930732373e-04f, -1.025874724e-03f, -1.185779509e-03f, -1.195907712e-03f, -9.637557625e-04f, -3.863346882e-04f, +6.424479067e-04f, +2.222590809e-03f, +4.437685062e-03f, +7.344399198e-03f, +1.096281623e-02f, +1.526870420e-02f, +2.018871199e-02f, +2.559927386e-02f, +3.132969425e-02f, +3.716949865e-02f, +4.287971454e-02f, +4.820733494e-02f, +5.290186229e-02f, +5.673257289e-02f, +5.950501592e-02f, +6.107528192e-02f, +6.136074737e-02f, +6.034630785e-02f, +5.808552240e-02f, +5.469656255e-02f, +5.035334212e-02f, +4.527264659e-02f, +3.969843638e-02f, +3.388473218e-02f, +2.807857776e-02f, +2.250451283e-02f, +1.735178496e-02f, +1.276521300e-02f, +8.840221830e-03f, +5.622145579e-03f, +3.109489377e-03f, +1.260491367e-03f, +2.070392152e-06f, -7.598979946e-04f, -1.130056618e-03f, -1.213780598e-03f, -1.108931901e-03f, -8.997050287e-04f, -6.528317079e-04f, -4.161334031e-04f,\n    +6.244486575e-06f, +7.475773419e-06f, +7.760920964e-06f, +6.524720458e-06f, +3.174026850e-06f, -2.836084140e-06f, -1.192842370e-05f, -2.432979486e-05f, -4.000588521e-05f, -5.861380406e-05f, -7.948008996e-05f, -1.016099164e-04f, -1.237302304e-04f, -1.443659673e-04f, -1.619446962e-04f, -1.749215037e-04f, -1.819130706e-04f, -1.818281164e-04f, -1.739809448e-04f, -1.581758507e-04f, -1.347525789e-04f, -1.045866398e-04f, -6.904270931e-05f, -2.988408757e-05f, +1.085426828e-05f, +5.101780578e-05f, +8.849554918e-05f, +1.213792189e-04f, +1.481035659e-04f, +1.675551786e-04f, +1.791403384e-04f, +1.828067631e-04f, +1.790187932e-04f, +1.686902173e-04f, +1.530829779e-04f, +1.336830254e-04f, +1.120662859e-04f, +8.976795629e-05f, +6.816715673e-05f, +4.839658372e-05f, +3.128352883e-05f, +1.732489835e-05f, +6.695130348e-06f, -7.174115923e-07f, -5.252536049e-06f, -7.407324442e-06f, -7.761189099e-06f, -6.905229076e-06f,\n    +4.119428878e-04f, +8.988230881e-04f, +1.584121905e-03f, +2.371128067e-03f, +3.055207035e-03f, +3.328513333e-03f, +2.817823139e-03f, +1.156279312e-03f, -1.919728528e-03f, -6.466784082e-03f, -1.224860498e-02f, -1.869430758e-02f, -2.492161626e-02f, -2.983413549e-02f, -3.228570477e-02f, -3.128785860e-02f, -2.622268614e-02f, -1.701675933e-02f, -4.234720657e-03f, +1.093611118e-02f, +2.681826560e-02f, +4.147787880e-02f, +5.302152764e-02f, +5.990271363e-02f, +6.118012058e-02f, +5.667755164e-02f, +4.701406972e-02f, +3.349837658e-02f, +1.790828824e-02f, +2.198407673e-03f, -1.180804543e-02f, -2.268639774e-02f, -2.959070849e-02f, -3.232079857e-02f, -3.127388711e-02f, -2.730125546e-02f, -2.150690279e-02f, -1.503249363e-02f, -8.870262169e-03f, -3.734505328e-03f, -6.211176122e-06f, +2.251612954e-03f, +3.224332267e-03f, +3.246475329e-03f, +2.699105742e-03f, +1.925409955e-03f, +1.177589633e-03f, +5.983009699e-04f,\n    -1.173783863e-05f, -1.845922109e-05f, -2.372404648e-05f, -2.438583951e-05f, -1.698658485e-05f, +1.309984952e-06f, +3.162543024e-05f, +7.238741685e-05f, +1.187754937e-04f, +1.628584972e-04f, +1.945606850e-04f, +2.034007180e-04f, +1.807343748e-04f, +1.220536131e-04f, +2.880444182e-05f, -9.078005214e-05f, -2.221704064e-04f, -3.464255475e-04f, -4.432265991e-04f, -4.945268237e-04f, -4.880976622e-04f, -4.202176034e-04f, -2.968892447e-04f, -1.332566780e-04f, +4.873099576e-05f, +2.239883633e-04f, +3.685825189e-04f, +4.637935950e-04f, +4.991488536e-04f, +4.738570412e-04f, +3.964157603e-04f, +2.825505523e-04f, +1.519813755e-04f, +2.472569254e-05f, -8.230501533e-05f, -1.577782226e-04f, -1.970947142e-04f, -2.021483440e-04f, -1.799142352e-04f, -1.403072766e-04f, -9.384920717e-05f, -4.964765813e-05f, -1.404765433e-05f, +9.887878991e-06f, +2.212093478e-05f, +2.482033930e-05f, +2.128404769e-05f, +1.490211996e-05f,\n    /*  1,24 (48) */\n    -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f,\n    +6.196522682e-06f, +7.448764252e-06f, +7.771936700e-06f, +6.592321062e-06f, +3.316389466e-06f, -2.603385740e-06f, -1.159477218e-05f, -2.389175254e-05f, -3.946900620e-05f, -5.799376832e-05f, -7.880294129e-05f, -1.009112666e-04f, -1.230533962e-04f, -1.437591249e-04f, -1.614572536e-04f, -1.745999956e-04f, -1.817969543e-04f, -1.819458831e-04f, -1.743469537e-04f, -1.587882379e-04f, -1.355924986e-04f, -1.056189673e-04f, -7.021819019e-05f, -3.114276840e-05f, +9.578625365e-06f, +4.979272550e-05f, +8.738472583e-05f, +1.204377551e-04f, +1.473740055e-04f, +1.670646871e-04f, +1.788992659e-04f, +1.828086792e-04f, +1.792419368e-04f, +1.691001640e-04f, +1.536362162e-04f, +1.343310549e-04f, +1.127598233e-04f, +9.046084446e-05f, +6.881963368e-05f, +4.897765493e-05f, +3.177229965e-05f, +1.771084180e-05f, +6.977378204e-06f, -5.315730174e-07f, -5.149718660e-06f, -7.370361214e-06f, -7.771451312e-06f, -6.944696012e-06f,\n    +4.002050492e-04f, +8.803638670e-04f, +1.560397859e-03f, +2.346742228e-03f, +3.038220450e-03f, +3.329823318e-03f, +2.849448569e-03f, +1.228666729e-03f, -1.800953034e-03f, -6.303925585e-03f, -1.205404429e-02f, -1.849090686e-02f, -2.474088189e-02f, -2.971208187e-02f, -3.225690033e-02f, -3.137863865e-02f, -2.644485655e-02f, -1.736318488e-02f, -4.677947257e-03f, +1.044158436e-02f, +2.633016794e-02f, +4.105766120e-02f, +5.272463839e-02f, +5.976945695e-02f, +6.122885158e-02f, +5.690154000e-02f, +4.738265224e-02f, +3.396217017e-02f, +1.840743709e-02f, +2.672264714e-03f, -1.141162967e-02f, -2.240384718e-02f, -2.943872712e-02f, -3.229607288e-02f, -3.135619212e-02f, -2.745903369e-02f, -2.170399751e-02f, -1.523464198e-02f, -9.050176404e-03f, -3.874812605e-03f, -1.000603833e-04f, +2.201965296e-03f, +3.210284612e-03f, +3.256363208e-03f, +2.721226677e-03f, +1.950230294e-03f, +1.198873681e-03f, +6.132030899e-04f,\n    -1.153167060e-05f, -1.825684027e-05f, -2.361120550e-05f, -2.446967027e-05f, -1.737124731e-05f, +5.560964085e-07f, +3.050371628e-05f, +7.099483771e-05f, +1.173125582e-04f, +1.616126915e-04f, +1.938637399e-04f, +2.035647178e-04f, +1.819781453e-04f, +1.244353095e-04f, +3.217731919e-05f, -8.677479417e-05f, -2.180667583e-04f, -3.428543174e-04f, -4.408078890e-04f, -4.937535320e-04f, -4.892339038e-04f, -4.232343676e-04f, -3.014528043e-04f, -1.387745892e-04f, +4.301364407e-05f, +2.188606756e-04f, +3.647327390e-04f, +4.616940118e-04f, +4.989830154e-04f, +4.755023974e-04f, +3.994829673e-04f, +2.864689115e-04f, +1.561108897e-04f, +2.847194725e-05f, -7.939579618e-05f, -1.559606090e-04f, -1.964095286e-04f, -2.024497358e-04f, -1.809275301e-04f, -1.417016390e-04f, -9.530816669e-05f, -5.092347434e-05f, -1.499116485e-05f, +9.323540560e-06f, +2.189829870e-05f, +2.484874698e-05f, +2.145415145e-05f, +1.511514789e-05f,\n    /*  1,25 (48) */\n    -3.114958267e-04f, -5.309554459e-04f, -7.775403796e-04f, -1.012757683e-03f, -1.179289092e-03f, -1.201347182e-03f, -9.872789584e-04f, -4.345562356e-04f, +5.629730153e-04f, +2.105983236e-03f, +4.279402031e-03f, +7.141878015e-03f, +1.071603260e-02f, +1.498057911e-02f, +1.986531004e-02f, +2.524975236e-02f, +3.096598422e-02f, +3.680572465e-02f, +4.253138664e-02f, +4.789037086e-02f, +5.263151721e-02f, +5.652236728e-02f, +5.936575502e-02f, +6.101425507e-02f, +6.138118026e-02f, +6.044711838e-02f, +5.826140268e-02f, +5.493837952e-02f, +5.064881970e-02f, +4.560726646e-02f, +4.005647599e-02f, +3.425034762e-02f, +2.843683849e-02f, +2.284230321e-02f, +1.765850416e-02f, +1.303322708e-02f, +9.065047940e-03f, +5.802374380e-03f, +3.246476168e-03f, +1.357865606e-03f, +6.512622063e-05f, -7.248622545e-04f, -1.116384110e-03f, -1.215029582e-03f, -1.119334155e-03f, -9.144827144e-04f, -6.683643483e-04f, -4.299833282e-04f,\n    +6.148150484e-06f, +7.420853824e-06f, +7.781486633e-06f, +6.657870832e-06f, +3.456160473e-06f, -2.373702808e-06f, -1.126437005e-05f, -2.345693889e-05f, -3.893503281e-05f, -5.737599002e-05f, -7.812708446e-05f, -1.002126668e-04f, -1.223751678e-04f, -1.431493437e-04f, -1.609653496e-04f, -1.742726574e-04f, -1.816739221e-04f, -1.820560435e-04f, -1.747051455e-04f, -1.593931230e-04f, -1.364257588e-04f, -1.066459616e-04f, -7.139005983e-05f, -3.239983159e-05f, +8.302483877e-06f, +4.856506828e-05f, +8.626944199e-05f, +1.194902810e-04f, +1.466373266e-04f, +1.665664791e-04f, +1.786504114e-04f, +1.828032572e-04f, +1.794586306e-04f, +1.695048947e-04f, +1.541856957e-04f, +1.349768747e-04f, +1.134526627e-04f, +9.115439517e-05f, +6.947389279e-05f, +4.956132816e-05f, +3.226416726e-05f, +1.810005886e-05f, +7.262793860e-06f, -3.428983692e-07f, -5.044553124e-06f, -7.331620083e-06f, -7.780518386e-06f, -6.983504168e-06f,\n    +3.886733786e-04f, +8.621070268e-04f, +1.536786653e-03f, +2.322272557e-03f, +3.020849203e-03f, +3.330379414e-03f, +2.879952286e-03f, +1.299661566e-03f, -1.683640476e-03f, -6.142312893e-03f, -1.186018055e-02f, -1.828734215e-02f, -2.455890374e-02f, -2.958764656e-02f, -3.222472301e-02f, -3.146541345e-02f, -2.666292331e-02f, -1.770603919e-02f, -5.118755146e-03f, +9.947830828e-03f, +2.584093403e-02f, +4.063442683e-02f, +5.242318559e-02f, +5.963068236e-02f, +6.127186522e-02f, +5.712040067e-02f, +4.774738498e-02f, +3.442386419e-02f, +1.890642011e-02f, +3.147767112e-03f, -1.101214670e-02f, -2.211737827e-02f, -2.928261623e-02f, -3.226760093e-02f, -3.143558792e-02f, -2.761499429e-02f, -2.190040704e-02f, -1.543709171e-02f, -9.231103934e-03f, -4.016514244e-03f, -1.953685500e-04f, +2.151041821e-03f, +3.195293448e-03f, +3.265686748e-03f, +2.743124976e-03f, +1.975079041e-03f, +1.220327832e-03f, +6.283182377e-04f,\n    -1.132641078e-05f, -1.805320008e-05f, -2.349400520e-05f, -2.454568474e-05f, -1.774519696e-05f, -1.858320897e-07f, +2.939256978e-05f, +6.960821217e-05f, +1.158478390e-04f, +1.603551633e-04f, +1.931446308e-04f, +2.036978274e-04f, +1.831863109e-04f, +1.267825385e-04f, +3.552359748e-05f, -8.278196499e-05f, -2.139568862e-04f, -3.392567061e-04f, -4.383447518e-04f, -4.929234191e-04f, -4.903092966e-04f, -4.261958904e-04f, -3.059758495e-04f, -1.442735657e-04f, +3.729040543e-05f, +2.137032898e-04f, +3.608345123e-04f, +4.595353487e-04f, +4.987570545e-04f, +4.770958382e-04f, +4.025137075e-04f, +2.903703028e-04f, +1.602433145e-04f, +3.223797337e-05f, -7.645544584e-05f, -1.541071826e-04f, -1.956903147e-04f, -2.027239640e-04f, -1.819234847e-04f, -1.430891199e-04f, -9.676931944e-05f, -5.220782014e-05f, -1.594627439e-05f, +8.747552469e-06f, +2.166616976e-05f, +2.487095151e-05f, +2.162143767e-05f, +1.532806871e-05f,\n    /*  1,26 (48) */\n    -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f,\n    +6.099383813e-06f, +7.392058845e-06f, +7.789589021e-06f, +6.721387745e-06f, +3.593355386e-06f, -2.147024604e-06f, -1.093721356e-05f, -2.302535893e-05f, -3.840398002e-05f, -5.676049434e-05f, -7.745255413e-05f, -9.951415924e-05f, -1.216955923e-04f, -1.425366721e-04f, -1.604690300e-04f, -1.739395284e-04f, -1.815440025e-04f, -1.821586121e-04f, -1.750555188e-04f, -1.599904879e-04f, -1.372523257e-04f, -1.076675748e-04f, -7.255825958e-05f, -3.365521214e-05f, +7.025910221e-06f, +4.733489691e-05f, +8.514975212e-05f, +1.185368387e-04f, +1.458935566e-04f, +1.660605652e-04f, +1.783937689e-04f, +1.827904761e-04f, +1.796688410e-04f, +1.699043667e-04f, +1.547313687e-04f, +1.356204362e-04f, +1.141447587e-04f, +9.184856916e-05f, +7.012990339e-05f, +5.014758269e-05f, +3.275912115e-05f, +1.849254854e-05f, +7.551384381e-06f, -1.513745344e-07f, -4.937022566e-06f, -7.291082698e-06f, -7.788372543e-06f, -7.021637960e-06f,\n    +3.773469678e-04f, +8.440538267e-04f, +1.513292648e-03f, +2.297726873e-03f, +3.003104006e-03f, +3.330193582e-03f, +2.909344855e-03f, +1.369269778e-03f, -1.567792637e-03f, -5.981957730e-03f, -1.166703592e-02f, -1.808364432e-02f, -2.437571743e-02f, -2.946086403e-02f, -3.218919941e-02f, -3.154819541e-02f, -2.687688019e-02f, -1.804529590e-02f, -5.557099897e-03f, +9.454907409e-03f, +2.535062474e-02f, +4.020823094e-02f, +5.211720974e-02f, +5.948640879e-02f, +6.130915563e-02f, +5.733410396e-02f, +4.810821949e-02f, +3.488339953e-02f, +1.940517716e-02f, +3.624862950e-03f, -1.060963299e-02f, -2.182700797e-02f, -2.912237291e-02f, -3.223536296e-02f, -3.151204336e-02f, -2.776910148e-02f, -2.209609735e-02f, -1.563981567e-02f, -9.413027418e-03f, -4.159603364e-03f, -2.921378694e-04f, +2.098834001e-03f, +3.179347173e-03f, +3.274434301e-03f, +2.764791145e-03f, +1.999949993e-03f, +1.241949270e-03f, +6.436463064e-04f,\n    -1.112210891e-05f, -1.784838432e-05f, -2.337255185e-05f, -2.461398792e-05f, -1.810850509e-05f, -9.158039886e-07f, +2.829208151e-05f, +6.822773425e-05f, +1.143816183e-04f, +1.590862412e-04f, +1.924036704e-04f, +2.038002702e-04f, +1.843589381e-04f, +1.290951640e-04f, +3.884292954e-05f, -7.880208811e-05f, -2.098414137e-04f, -3.356333310e-04f, -4.358376830e-04f, -4.920367567e-04f, -4.913238229e-04f, -4.291018512e-04f, -3.104578006e-04f, -1.497528627e-04f, +3.156206276e-05f, +2.085168925e-04f, +3.568883141e-04f, +4.573177959e-04f, +4.984708574e-04f, +4.786369835e-04f, +4.055074182e-04f, +2.942540920e-04f, +1.643780583e-04f, +3.602331742e-05f, -7.348422069e-05f, -1.522179874e-04f, -1.949369302e-04f, -2.029707573e-04f, -1.829017706e-04f, -1.444694044e-04f, -9.823241829e-05f, -5.350054635e-05f, -1.691293576e-05f, +8.159877660e-06f, +2.142445762e-05f, +2.488684375e-05f, +2.178580768e-05f, +1.554081285e-05f,\n    /*  1,27 (48) */\n    -2.992482924e-04f, -5.161425332e-04f, -7.619693040e-04f, -9.993784239e-04f, -1.172239576e-03f, -1.205867910e-03f, -1.009480542e-03f, -4.810385334e-04f, +4.856340025e-04f, +1.991846752e-03f, +4.123822392e-03f, +6.942151189e-03f, +1.047196184e-02f, +1.469489309e-02f, +1.954387566e-02f, +2.490154017e-02f, +3.060276630e-02f, +3.644151000e-02f, +4.218162598e-02f, +4.757098725e-02f, +5.235783912e-02f, +5.630805374e-02f, +5.922180670e-02f, +6.094820002e-02f, +6.139650865e-02f, +6.054301834e-02f, +5.843282187e-02f, +5.517640664e-02f, +5.094135058e-02f, +4.593989350e-02f, +4.041352017e-02f, +3.461594135e-02f, +2.879596596e-02f, +2.318171247e-02f, +1.796742122e-02f, +1.330382439e-02f, +9.292645361e-03f, +5.985377344e-03f, +3.386079964e-03f, +1.457574517e-03f, +1.301495090e-04f, -6.882696471e-04f, -1.101569931e-03f, -1.215523855e-03f, -1.129315731e-03f, -9.291054171e-04f, -6.839332393e-04f, -4.439884703e-04f,\n    +6.050236397e-06f, +7.362395954e-06f, +7.796262099e-06f, +6.782889817e-06f, +3.727989835e-06f, -1.923340206e-06f, -1.061329869e-05f, -2.259701741e-05f, -3.787586248e-05f, -5.614730615e-05f, -7.677938468e-05f, -9.881578617e-05f, -1.210147169e-04f, -1.419211588e-04f, -1.599683410e-04f, -1.736006478e-04f, -1.814072243e-04f, -1.822536042e-04f, -1.753980729e-04f, -1.605803153e-04f, -1.380721657e-04f, -1.086837592e-04f, -7.372273107e-05f, -3.490884522e-05f, +5.748970827e-06f, +4.610227435e-05f, +8.402571100e-05f, +1.175774709e-04f, +1.451427229e-04f, +1.655469566e-04f, +1.781293332e-04f, +1.827703153e-04f, +1.798725349e-04f, +1.702985375e-04f, +1.552731878e-04f, +1.362616909e-04f, +1.148360655e-04f, +9.254332692e-05f, +7.078763450e-05f, +5.073639743e-05f, +3.325715046e-05f, +1.888830955e-05f, +7.843156605e-06f, +4.301144525e-08f, -4.827110191e-06f, -7.248730722e-06f, -7.794995958e-06f, -7.059081716e-06f,\n    +3.662248589e-04f, +8.262054424e-04f, +1.489920096e-03f, +2.273112885e-03f, +2.984995501e-03f, +3.329277778e-03f, +2.937636937e-03f, +1.437497513e-03f, -1.453411019e-03f, -5.822871489e-03f, -1.147463225e-02f, -1.787984405e-02f, -2.419135849e-02f, -2.933176886e-02f, -3.215035648e-02f, -3.162699750e-02f, -2.708672161e-02f, -1.838092923e-02f, -5.992937580e-03f, +8.962870652e-03f, +2.485930091e-02f, +3.977912909e-02f, +5.180675194e-02f, +5.933665593e-02f, +6.134071769e-02f, +5.754262086e-02f, +4.846510781e-02f, +3.534071733e-02f, +1.990364802e-02f, +4.103499934e-03f, -1.020412557e-02f, -2.153275388e-02f, -2.895799486e-02f, -3.219933964e-02f, -3.158552758e-02f, -2.792131946e-02f, -2.229103428e-02f, -1.584278643e-02f, -9.595929189e-03f, -4.304072768e-03f, -3.903702877e-04f, +2.045333455e-03f, +3.162434237e-03f, +3.282594178e-03f, +2.786215603e-03f, +2.024836836e-03f, +1.263735077e-03f, +6.591871193e-04f,\n    -1.091881357e-05f, -1.764247584e-05f, -2.324695131e-05f, -2.467468530e-05f, -1.846124455e-05f, -1.633825320e-06f, +2.720233902e-05f, +6.685359483e-05f, +1.129141757e-04f, +1.578062534e-04f, +1.916411728e-04f, +2.038722735e-04f, +1.854960989e-04f, +1.313730568e-04f, +4.213497453e-05f, -7.483568249e-05f, -2.057209625e-04f, -3.319848116e-04f, -4.332871834e-04f, -4.910938247e-04f, -4.922774745e-04f, -4.319519384e-04f, -3.148980846e-04f, -1.552117387e-04f, +2.582939980e-05f, +2.033021755e-04f, +3.528946277e-04f, +4.550415531e-04f, +4.981243193e-04f, +4.801254603e-04f, +4.084635409e-04f, +2.981196454e-04f, +1.685145269e-04f, +3.982752051e-05f, -7.048238377e-05f, -1.502930739e-04f, -1.941492378e-04f, -2.031898472e-04f, -1.838620601e-04f, -1.458421761e-04f, -9.969721340e-05f, -5.480150053e-05f, -1.789109874e-05f, +7.560481282e-06f, +2.117307309e-05f, +2.489631464e-05f, +2.194716213e-05f, +1.575330966e-05f,\n    /*  1,28 (48) */\n    -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f,\n    +6.000721856e-06f, +7.331881716e-06f, +7.801524077e-06f, +6.842395104e-06f, +3.860079559e-06f, -1.702638511e-06f, -1.029262119e-05f, -2.217191876e-05f, -3.735069452e-05f, -5.553645002e-05f, -7.610761022e-05f, -9.811758948e-05f, -1.203325886e-04f, -1.413028526e-04f, -1.594633288e-04f, -1.732560555e-04f, -1.812636169e-04f, -1.823410354e-04f, -1.757328077e-04f, -1.611625883e-04f, -1.388852458e-04f, -1.096944677e-04f, -7.488341620e-05f, -3.616066610e-05f, +4.471732158e-06f, +4.486726377e-05f, +8.289737375e-05f, +1.166122207e-04f, +1.443848538e-04f, +1.650256649e-04f, +1.778570993e-04f, +1.827427547e-04f, +1.800696793e-04f, +1.706873651e-04f, +1.558111055e-04f, +1.369005902e-04f, +1.155265373e-04f, +9.323862873e-05f, +7.144705488e-05f, +5.132775100e-05f, +3.375824403e-05f, +1.928734033e-05f, +8.138117147e-06f, +2.402723706e-07f, -4.714799292e-06f, -7.204545832e-06f, -7.800370763e-06f, -7.095819678e-06f,\n    +3.553060453e-04f, +8.085629665e-04f, +1.466673145e-03f, +2.248438199e-03f, +2.966534256e-03f, +3.327643953e-03f, +2.964839276e-03f, +1.504351108e-03f, -1.340496843e-03f, -5.665065235e-03f, -1.128299108e-02f, -1.767597177e-02f, -2.400586239e-02f, -2.920039581e-02f, -3.210822151e-02f, -3.170183318e-02f, -2.729244257e-02f, -1.871291404e-02f, -6.426224764e-03f, +8.471776828e-03f, +2.436702344e-02f, +3.934717715e-02f, +5.149185385e-02f, +5.918144419e-02f, +6.136654709e-02f, +5.774592303e-02f, +4.881800243e-02f, +3.579575888e-02f, +2.040177234e-02f, +4.583625394e-03f, -9.795662033e-03f, -2.123463423e-02f, -2.878948033e-02f, -3.215951212e-02f, -3.165600997e-02f, -2.807161254e-02f, -2.248518352e-02f, -1.604597628e-02f, -9.779791249e-03f, -4.449914944e-03f, -4.900675011e-04f, +1.990531954e-03f, +3.144543139e-03f, +3.290154659e-03f, +2.807388676e-03f, +2.049733151e-03f, +1.285682239e-03f, +6.749404290e-04f,\n    -1.071657227e-05f, -1.743555650e-05f, -2.311730902e-05f, -2.472788286e-05f, -1.880348977e-05f, -2.339904673e-06f, +2.612342670e-05f, +6.548598165e-05f, +1.114457889e-04f, +1.565155274e-04f, +1.908574537e-04f, +2.039140682e-04f, +1.865978710e-04f, +1.336160942e-04f, +4.539939795e-05f, -7.088326246e-05f, -2.015961528e-04f, -3.283117689e-04f, -4.306937594e-04f, -4.900949110e-04f, -4.931702526e-04f, -4.347458496e-04f, -3.192961356e-04f, -1.606494561e-04f, +2.009320106e-05f, +1.980598351e-04f, +3.488539443e-04f, +4.527068295e-04f, +4.977173448e-04f, +4.815609030e-04f, +4.113815210e-04f, +3.019663296e-04f, +1.726521230e-04f, +4.365011838e-05f, -6.745020468e-05f, -1.483324988e-04f, -1.933271055e-04f, -2.033809683e-04f, -1.848040261e-04f, -1.472071174e-04f, -1.011634523e-04f, -5.611052704e-05f, -1.888071007e-05f, +6.949330726e-06f, +2.091192815e-05f, +2.489925524e-05f, +2.210540102e-05f, +1.596548744e-05f,\n    /*  1,29 (48) */\n    -2.871973341e-04f, -5.014482555e-04f, -7.463715178e-04f, -9.857531390e-04f, -1.164651507e-03f, -1.209493888e-03f, -1.030386462e-03f, -5.258074696e-04f, +4.104074455e-04f, +1.880162996e-03f, +3.970935397e-03f, +6.745217813e-03f, +1.023061454e-02f, +1.441166908e-02f, +1.922444399e-02f, +2.455468347e-02f, +3.024009546e-02f, +3.607691536e-02f, +4.183049510e-02f, +4.724924434e-02f, +5.208088171e-02f, +5.608967552e-02f, +5.907320056e-02f, +6.087713051e-02f, +6.140672936e-02f, +6.063398788e-02f, +5.859974496e-02f, +5.541059633e-02f, +5.123087815e-02f, +4.627046613e-02f, +4.076950660e-02f, +3.498145442e-02f, +2.915590817e-02f, +2.352269837e-02f, +1.827850552e-02f, +1.357698668e-02f, +9.523007964e-03f, +6.171159300e-03f, +3.528314653e-03f, +1.559638665e-03f, +1.971649035e-04f, -6.500939972e-04f, -1.085588658e-03f, -1.215240571e-03f, -1.138857640e-03f, -9.435586937e-04f, -6.995286060e-04f, -4.581433717e-04f,\n    +5.950853705e-06f, +7.300532620e-06f, +7.805393139e-06f, +6.899921698e-06f, +3.989640402e-06f, -1.484908233e-06f, -9.975176579e-06f, -2.175006713e-05f, -3.682849015e-05f, -5.492795017e-05f, -7.543726457e-05f, -9.741961088e-05f, -1.196492544e-04f, -1.406818019e-04f, -1.589540398e-04f, -1.729057912e-04f, -1.811132097e-04f, -1.824209217e-04f, -1.760597234e-04f, -1.617372905e-04f, -1.396915333e-04f, -1.106996535e-04f, -7.604025715e-05f, -3.741061019e-05f, +3.194260694e-06f, +4.362992850e-05f, +8.176479580e-05f, +1.156411315e-04f, +1.436199778e-04f, +1.644967024e-04f, +1.775770628e-04f, +1.827077745e-04f, +1.802602417e-04f, +1.710708076e-04f, +1.563450745e-04f, +1.375370856e-04f, +1.162161284e-04f, +9.393443463e-05f, +7.210813297e-05f, +5.192162170e-05f, +3.426239038e-05f, +1.968963904e-05f, +8.436272395e-06f, +4.404208828e-07f, -4.600073246e-06f, -7.158509723e-06f, -7.804479049e-06f, -7.131836001e-06f,\n    +3.445894731e-04f, +7.911274100e-04f, +1.443555836e-03f, +2.223710317e-03f, +2.947730766e-03f, +3.325304048e-03f, +2.990962703e-03f, +1.569837089e-03f, -1.229051054e-03f, -5.508549708e-03f, -1.109213363e-02f, -1.747205771e-02f, -2.381926452e-02f, -2.906677971e-02f, -3.206282211e-02f, -3.177271645e-02f, -2.749403872e-02f, -1.904122581e-02f, -6.856918523e-03f, +7.981681917e-03f, +2.387385319e-02f, +3.891243130e-02f, +5.117255772e-02f, +5.902079474e-02f, +6.138664029e-02f, +5.794398287e-02f, +4.916685638e-02f, +3.624846571e-02f, +2.089948969e-02f, +5.065186297e-03f, -9.384280512e-03f, -2.093266790e-02f, -2.861682821e-02f, -3.211586200e-02f, -3.172346017e-02f, -2.821994504e-02f, -2.267851063e-02f, -1.624935725e-02f, -9.964595275e-03f, -4.597122062e-03f, -5.912309534e-04f, +1.934421427e-03f, +3.125662429e-03f, +3.297103990e-03f, +2.828300604e-03f, +2.074632406e-03f, +1.307787641e-03f, +6.909059164e-04f,\n    -1.051543136e-05f, -1.722770722e-05f, -2.298372996e-05f, -2.477368699e-05f, -1.913531668e-05f, -3.034053170e-06f, +2.505542575e-05f, +6.412507928e-05f, +1.099767330e-04f, +1.552143899e-04f, +1.900528304e-04f, +2.039258891e-04f, +1.876643381e-04f, +1.358241603e-04f, +4.863587167e-05f, -6.694533766e-05f, -1.974676028e-04f, -3.246148259e-04f, -4.280579225e-04f, -4.890403118e-04f, -4.940021681e-04f, -4.374832914e-04f, -3.236513949e-04f, -1.660652804e-04f, +1.435425164e-05f, +1.927905726e-04f, +3.447667631e-04f, +4.503138436e-04f, +4.972498479e-04f, +4.829429533e-04f, +4.142608086e-04f, +3.057935123e-04f, +1.767902467e-04f, +4.749064148e-05f, -6.438795966e-05f, -1.463363255e-04f, -1.924704065e-04f, -2.035438583e-04f, -1.857273426e-04f, -1.485639094e-04f, -1.026308797e-04f, -5.742746693e-05f, -1.988171347e-05f, +6.326395649e-06f, +2.064093598e-05f, +2.489555680e-05f, +2.226042371e-05f, +1.617727343e-05f,\n    /*  1,30 (48) */\n    -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f,\n    +5.900645350e-06f, +7.268365081e-06f, +7.807887439e-06f, +6.955487723e-06f, +4.116688316e-06f, -1.270137912e-06f, -9.660960103e-06f, -2.133146638e-05f, -3.630926307e-05f, -5.432183054e-05f, -7.476838129e-05f, -9.672189189e-05f, -1.189647611e-04f, -1.400580555e-04f, -1.584405205e-04f, -1.725498952e-04f, -1.809560329e-04f, -1.824932796e-04f, -1.763788209e-04f, -1.623044060e-04f, -1.404909963e-04f, -1.116992702e-04f, -7.719319639e-05f, -3.865861306e-05f, +1.916622938e-06f, +4.239033203e-05f, +8.062803289e-05f, +1.146642473e-04f, +1.428481242e-04f, +1.639600817e-04f, +1.772892198e-04f, +1.826653555e-04f, +1.804441899e-04f, +1.714488231e-04f, +1.568750475e-04f, +1.381711284e-04f, +1.169047926e-04f, +9.463070442e-05f, +7.277083693e-05f, +5.251798750e-05f, +3.476957772e-05f, +2.009520355e-05f, +8.737628506e-06f, +6.434694612e-07f, -4.482915520e-06f, -7.110604110e-06f, -7.807302866e-06f, -7.167114757e-06f,\n    +3.340740417e-04f, +7.738997028e-04f, +1.420572106e-03f, +2.198936630e-03f, +2.928595450e-03f, +3.322269995e-03f, +3.016018128e-03f, +1.633962169e-03f, -1.119074321e-03f, -5.353335318e-03f, -1.090208080e-02f, -1.726813182e-02f, -2.363160019e-02f, -2.893095555e-02f, -3.201418624e-02f, -3.183966178e-02f, -2.769150633e-02f, -1.936584064e-02f, -7.284976446e-03f, +7.492641605e-03f, +2.337985102e-02f, +3.847494801e-02f, +5.084890632e-02f, +5.885472945e-02f, +6.140099454e-02f, +5.813677344e-02f, +4.951162314e-02f, +3.669877956e-02f, +2.139673953e-02f, +5.548129250e-03f, -8.970019704e-03f, -2.062687439e-02f, -2.844003796e-02f, -3.206837136e-02f, -3.178784813e-02f, -2.836628136e-02f, -2.287098103e-02f, -1.645290111e-02f, -1.015032262e-02f, -4.745685971e-03f, -6.938618331e-04f, +1.876993960e-03f, +3.105780715e-03f, +3.303430386e-03f, +2.848941540e-03f, +2.099527963e-03f, +1.330048064e-03f, +7.070831898e-04f,\n    -1.031543611e-05f, -1.701900789e-05f, -2.284631865e-05f, -2.481220449e-05f, -1.945680269e-05f, -3.716284432e-06f, +2.399841424e-05f, +6.277106912e-05f, +1.085072808e-04f, +1.539031669e-04f, +1.892276213e-04f, +2.039079747e-04f, +1.886955890e-04f, +1.379971457e-04f, +5.184407396e-05f, -6.302241295e-05f, -1.933359288e-04f, -3.208946069e-04f, -4.253801896e-04f, -4.879303311e-04f, -4.947732413e-04f, -4.401639799e-04f, -3.279633107e-04f, -1.714584810e-04f, +8.613337121e-06f, +1.874950937e-04f, +3.406335909e-04f, +4.478628235e-04f, +4.967217519e-04f, +4.842712606e-04f, +4.171008580e-04f, +3.096005616e-04f, +1.809282955e-04f, +5.134861502e-05f, -6.129593148e-05f, -1.443046239e-04f, -1.915790189e-04f, -2.036782580e-04f, -1.866316842e-04f, -1.499122321e-04f, -1.040992379e-04f, -5.875215808e-05f, -2.089404958e-05f, +5.691648011e-06f, +2.036001099e-05f, +2.488511074e-05f, +2.241212896e-05f, +1.638859383e-05f,\n    /*  1,31 (48) */\n    -2.753458351e-04f, -4.868793578e-04f, -7.307582372e-04f, -9.718977296e-04f, -1.156545178e-03f, -1.212248935e-03f, -1.050022599e-03f, -5.688890031e-04f, +3.372696922e-04f, +1.770913215e-03f, +3.820729751e-03f, +6.551076310e-03f, +9.992000524e-03f, +1.413092922e-02f, +1.890704943e-02f, +2.420922778e-02f, +2.987802621e-02f, +3.571200116e-02f, +4.147805655e-02f, +4.692520265e-02f, +5.180069918e-02f, +5.586727659e-02f, +5.891996710e-02f, +6.080106129e-02f, +6.141184024e-02f, +6.072000814e-02f, +5.876213779e-02f, +5.564090171e-02f, +5.151734626e-02f, +4.659892291e-02f, +4.112437288e-02f, +3.534682755e-02f, +2.951661261e-02f, +2.386521801e-02f, +1.859172564e-02f, +1.385269489e-02f, +9.756128885e-03f, +6.359724439e-03f, +3.673193623e-03f, +1.664078274e-03f, +2.661968716e-04f, -6.103091546e-04f, -1.068414757e-03f, -1.214156681e-03f, -1.147940629e-03f, -9.578278075e-04f, -7.151403879e-04f, -4.724423225e-04f,\n    +5.850110091e-06f, +7.235395433e-06f, +7.809025104e-06f, +7.009111338e-06f, +4.241239355e-06f, -1.058315911e-06f, -9.349966785e-06f, -2.091612006e-05f, -3.579302665e-05f, -5.371811474e-05f, -7.410099365e-05f, -9.602447380e-05f, -1.182791553e-04f, -1.394316620e-04f, -1.579228174e-04f, -1.721884081e-04f, -1.807921168e-04f, -1.825581262e-04f, -1.766901015e-04f, -1.628639195e-04f, -1.412836031e-04f, -1.126932717e-04f, -7.834217668e-05f, -3.990461040e-05f, +6.388853996e-07f, +4.114853805e-05f, +7.948714106e-05f, +1.136816124e-04f, +1.420693226e-04f, +1.634158161e-04f, +1.769935670e-04f, +1.826154788e-04f, +1.806214921e-04f, +1.718213704e-04f, +1.574009775e-04f, +1.388026701e-04f, +1.175924836e-04f, +9.532739769e-05f, +7.343513463e-05f, +5.311682607e-05f, +3.527979396e-05f, +2.050403146e-05f, +9.042191405e-06f, +8.494304210e-07f, -4.363309672e-06f, -7.060810728e-06f, -7.808824226e-06f, -7.201639933e-06f,\n    +3.237586056e-04f, +7.568806949e-04f, +1.397725787e-03f, +2.174124425e-03f, +2.909138647e-03f, +3.318553711e-03f, +3.040016543e-03f, +1.696733238e-03f, -1.010567040e-03f, -5.199432151e-03f, -1.071285317e-02f, -1.706422384e-02f, -2.344290460e-02f, -2.879295841e-02f, -3.196234216e-02f, -3.190268420e-02f, -2.788484225e-02f, -1.968673524e-02f, -7.710356635e-03f, +7.004711274e-03f, +2.288507778e-02f, +3.803478403e-02f, +5.052094301e-02f, +5.868327097e-02f, +6.140960788e-02f, +5.832426853e-02f, +4.985225673e-02f, +3.714664238e-02f, +2.189346129e-02f, +6.032400511e-03f, -8.552918846e-03f, -2.031727383e-02f, -2.825910966e-02f, -3.201702274e-02f, -3.184914406e-02f, -2.851058599e-02f, -2.306256005e-02f, -1.665657936e-02f, -1.033695430e-02f, -4.895598203e-03f, -7.979610710e-04f, +1.818241802e-03f, +3.084886666e-03f, +3.309122034e-03f, +2.869301551e-03f, +2.124413074e-03f, +1.352460193e-03f, +7.234717837e-04f,\n    -1.011663066e-05f, -1.680953745e-05f, -2.270517913e-05f, -2.484354255e-05f, -1.976802667e-05f, -4.386614560e-06f, +2.295246704e-05f, +6.142412938e-05f, +1.070377027e-04f, +1.525821837e-04f, +1.883821463e-04f, +2.038605671e-04f, +1.896917185e-04f, +1.401349478e-04f, +5.502368951e-05f, -5.911498836e-05f, -1.892017453e-04f, -3.171517381e-04f, -4.226610826e-04f, -4.867652811e-04f, -4.954835019e-04f, -4.427876402e-04f, -3.322313388e-04f, -1.768283313e-04f, +2.871243403e-06f, +1.821741084e-04f, +3.364549421e-04f, +4.453540068e-04f, +4.961329892e-04f, +4.855454817e-04f, +4.199011281e-04f, +3.133868468e-04f, +1.850656642e-04f, +5.522355901e-05f, -5.817440947e-05f, -1.422374703e-04f, -1.906528266e-04f, -2.037839118e-04f, -1.875167265e-04f, -1.512517643e-04f, -1.055682666e-04f, -6.008443510e-05f, -2.191765594e-05f, +5.045062098e-06f, +2.006906889e-05f, +2.486780869e-05f, +2.256041491e-05f, +1.659937380e-05f,\n    /*  2, 0 (48) */\n    +2.604271951e-04f, +6.520713960e-04f, +1.184392264e-03f, +1.737066681e-03f, +2.100859845e-03f, +2.003596444e-03f, +1.168352244e-03f, -6.020526720e-04f, -3.329654867e-03f, -6.777842271e-03f, -1.040531144e-02f, -1.337949151e-02f, -1.466132590e-02f, -1.315819186e-02f, -7.924759808e-03f, +1.623190098e-03f, +1.552555605e-02f, +3.316834873e-02f, +5.328028472e-02f, +7.404900985e-02f, +9.334657971e-02f, +1.090303366e-01f, +1.192675993e-01f, +1.228249582e-01f, +1.192675993e-01f, +1.090303366e-01f, +9.334657971e-02f, +7.404900985e-02f, +5.328028472e-02f, +3.316834873e-02f, +1.552555605e-02f, +1.623190098e-03f, -7.924759808e-03f, -1.315819186e-02f, -1.466132590e-02f, -1.337949151e-02f, -1.040531144e-02f, -6.777842271e-03f, -3.329654867e-03f, -6.020526720e-04f, +1.168352244e-03f, +2.003596444e-03f, +2.100859845e-03f, +1.737066681e-03f, +1.184392264e-03f, +6.520713960e-04f, +2.604271951e-04f, +4.414624996e-05f,\n    -9.397733863e-06f, -1.475159068e-05f, -1.780699796e-05f, -1.570575921e-05f, -5.894492519e-06f, +1.287546454e-05f, +3.958040364e-05f, +7.028847262e-05f, +9.813493822e-05f, +1.140815919e-04f, +1.084565141e-04f, +7.306034295e-05f, +3.434800198e-06f, -9.922656802e-05f, -2.270449294e-04f, -3.656871562e-04f, -4.960023257e-04f, -5.968946951e-04f, -6.489612978e-04f, -6.382023119e-04f, -5.590356192e-04f, -4.159420831e-04f, -2.233226464e-04f, -3.510128802e-06f, +2.167329417e-04f, +4.105735155e-04f, +5.554809118e-04f, +6.367671050e-04f, +6.496292006e-04f, +5.993511841e-04f, +4.997098643e-04f, +3.699938620e-04f, +2.313033964e-04f, +1.028991279e-04f, -7.032857366e-07f, -7.141256319e-05f, -1.078360932e-04f, -1.142811527e-04f, -9.886406891e-05f, -7.124467603e-05f, -4.050800932e-05f, -1.360250026e-05f, +5.444930471e-06f, +1.552678732e-05f, +1.783443122e-05f, +1.489615403e-05f, +9.574142015e-06f, +4.266520574e-06f,\n    +7.781537535e-05f, -5.172646125e-04f, -1.673334699e-03f, -3.203343269e-03f, -4.525223175e-03f, -4.733635501e-03f, -2.892950492e-03f, +1.502882723e-03f, +8.068686861e-03f, +1.529267543e-02f, +2.072324747e-02f, +2.163579289e-02f, +1.603304991e-02f, +3.643522741e-03f, -1.349956937e-02f, -3.123170394e-02f, -4.427068528e-02f, -4.783283965e-02f, -3.933589198e-02f, -1.956599624e-02f, +7.183458326e-03f, +3.415533317e-02f, +5.408068209e-02f, +6.141247912e-02f, +5.408068209e-02f, +3.415533317e-02f, +7.183458326e-03f, -1.956599624e-02f, -3.933589198e-02f, -4.783283965e-02f, -4.427068528e-02f, -3.123170394e-02f, -1.349956937e-02f, +3.643522741e-03f, +1.603304991e-02f, +2.163579289e-02f, +2.072324747e-02f, +1.529267543e-02f, +8.068686861e-03f, +1.502882723e-03f, -2.892950492e-03f, -4.733635501e-03f, -4.525223175e-03f, -3.203343269e-03f, -1.673334699e-03f, -5.172646125e-04f, +7.781537535e-05f, +2.181178524e-04f,\n    +1.021445183e-05f, +2.711764488e-05f, +4.373606909e-05f, +4.870636224e-05f, +2.965876477e-05f, -2.020862008e-05f, -9.543065144e-05f, -1.750445952e-04f, -2.258666913e-04f, -2.129807855e-04f, -1.147623742e-04f, +6.321493412e-05f, +2.820361204e-04f, +4.757918698e-04f, +5.706234531e-04f, +5.111620793e-04f, +2.849053907e-04f, -6.564268988e-05f, -4.497141734e-04f, -7.537672688e-04f, -8.781008671e-04f, -7.718669222e-04f, -4.533676142e-04f, -7.335878262e-06f, +4.407740003e-04f, +7.648400958e-04f, +8.783629926e-04f, +7.607940572e-04f, +4.610216661e-04f, +7.770478446e-05f, -2.754656586e-04f, -5.065395392e-04f, -5.712966145e-04f, -4.806170152e-04f, -2.888598211e-04f, -6.972252126e-05f, +1.102912474e-04f, +2.112555732e-04f, +2.265914423e-04f, +1.772601301e-04f, +9.800087468e-05f, +2.224447147e-05f, -2.857587745e-05f, -4.853198241e-05f, -4.413533489e-05f, -2.769009656e-05f, -1.066792104e-05f, +3.030211128e-07f,\n    /*  2, 1 (48) */\n    +2.510294612e-04f, +6.373198053e-04f, +1.166585266e-03f, +1.721360922e-03f, +2.094965353e-03f, +2.016471909e-03f, +1.207932647e-03f, -5.317641994e-04f, -3.231519929e-03f, -6.663760679e-03f, -1.029685493e-02f, -1.330643117e-02f, -1.465789110e-02f, -1.325741842e-02f, -8.151804737e-03f, +1.257502941e-03f, +1.502955372e-02f, +3.257145404e-02f, +5.263132342e-02f, +7.341080754e-02f, +9.278754409e-02f, +1.086143945e-01f, +1.190442767e-01f, +1.228214481e-01f, +1.194843323e-01f, +1.094409101e-01f, +9.390206062e-02f, +7.468577696e-02f, +5.392991392e-02f, +3.376769992e-02f, +1.602526591e-02f, +1.993183960e-03f, -7.693456411e-03f, -1.305529273e-02f, -1.466202918e-02f, -1.345090407e-02f, -1.051314753e-02f, -6.892123423e-03f, -3.428518936e-03f, -6.732973481e-04f, +1.127844235e-03f, +1.989993944e-03f, +2.106304776e-03f, +1.752593469e-03f, +1.202226696e-03f, +6.669675500e-04f, +2.700013371e-04f, +4.841277053e-05f,\n    -9.221479075e-06f, -1.460482609e-05f, -1.777450663e-05f, -1.587709547e-05f, -6.335117472e-06f, +1.215642107e-05f, +3.865695453e-05f, +6.932966021e-05f, +9.739424462e-05f, +1.138608472e-04f, +1.090475536e-04f, +7.467422635e-05f, +6.133495444e-06f, -9.557911602e-05f, -2.227974382e-04f, -3.613724853e-04f, -4.922659171e-04f, -5.943900778e-04f, -6.482313423e-04f, -6.395698761e-04f, -5.625270708e-04f, -4.212616238e-04f, -2.298854257e-04f, -1.052996006e-05f, +2.101170941e-04f, +4.051565071e-04f, +5.518632500e-04f, +6.352642376e-04f, +6.502347371e-04f, +6.017590106e-04f, +5.033878865e-04f, +3.742919618e-04f, +2.355723082e-04f, +1.065964465e-04f, +2.060909781e-06f, -6.973082794e-05f, -1.071860828e-04f, -1.144592400e-04f, -9.958133640e-05f, -7.219801774e-05f, -4.143960274e-05f, -1.433745413e-05f, +4.986422344e-06f, +1.534011438e-05f, +1.785671677e-05f, +1.503843121e-05f, +9.750642811e-06f, +4.414790764e-06f,\n    +8.802982718e-05f, -4.901469677e-04f, -1.629598630e-03f, -3.154636907e-03f, -4.495564410e-03f, -4.753844121e-03f, -2.988381144e-03f, +1.327838128e-03f, +7.842820170e-03f, +1.507969465e-02f, +2.060848510e-02f, +2.169900783e-02f, +1.631508603e-02f, +4.119314611e-03f, -1.292894591e-02f, -3.072054186e-02f, -4.398577989e-02f, -4.789848234e-02f, -3.978560615e-02f, -2.031976351e-02f, +6.305357459e-03f, +3.338346624e-02f, +5.362731448e-02f, +6.140514325e-02f, +5.452145609e-02f, +3.492017326e-02f, +8.061821318e-03f, -1.880520218e-02f, -3.887487031e-02f, -4.775513486e-02f, -4.454615094e-02f, -3.173824348e-02f, -1.407086598e-02f, +3.162905726e-03f, +1.574419009e-02f, +2.156607037e-02f, +2.083353872e-02f, +1.550393101e-02f, +8.295278303e-03f, +1.680142853e-03f, -2.794949618e-03f, -4.711391030e-03f, -4.553799053e-03f, -3.251875252e-03f, -1.717470034e-03f, -5.449547091e-04f, +6.714745431e-05f, +2.184208735e-04f,\n    +9.767473893e-06f, +2.654535421e-05f, +4.332554241e-05f, +4.885683791e-05f, +3.071051883e-05f, -1.819886387e-05f, -9.286579528e-05f, -1.728011389e-04f, -2.250786348e-04f, -2.146203664e-04f, -1.191527570e-04f, +5.674957623e-05f, +2.751886761e-04f, +4.708685948e-04f, +5.697959909e-04f, +5.156170440e-04f, +2.942196033e-04f, -5.361531476e-05f, -4.383273960e-04f, -7.465608329e-04f, -8.776076910e-04f, -7.786807920e-04f, -4.658332083e-04f, -2.200554834e-05f, +4.280558673e-04f, +7.576020354e-04f, +8.783935306e-04f, +7.676386936e-04f, +4.722463287e-04f, +8.979821280e-05f, -2.659025952e-04f, -5.017498821e-04f, -5.718143049e-04f, -4.853418550e-04f, -2.956574536e-04f, -7.627062286e-05f, +1.057400680e-04f, +2.094444104e-04f, +2.272519091e-04f, +1.794465983e-04f, +1.005755783e-04f, +2.430601068e-05f, -2.746179810e-05f, -4.833335192e-05f, -4.452293401e-05f, -2.826241838e-05f, -1.112777301e-05f, +7.525040422e-08f,\n    /*  2, 2 (48) */\n    +2.418079821e-04f, +6.227149792e-04f, +1.148810760e-03f, +1.705483827e-03f, +2.088630235e-03f, +2.028628330e-03f, +1.246589602e-03f, -4.624345392e-04f, -3.134125684e-03f, -6.549899832e-03f, -1.018780737e-02f, -1.323175694e-02f, -1.465175760e-02f, -1.335299754e-02f, -8.374602175e-03f, +8.961304561e-04f, +1.453728781e-02f, +3.197706396e-02f, +5.198309208e-02f, +7.277123767e-02f, +9.222501702e-02f, +1.081931329e-01f, +1.188143913e-01f, +1.228109182e-01f, +1.196944494e-01f, +1.098460666e-01f, +9.445392387e-02f, +7.532104120e-02f, +5.458014866e-02f, +3.436945893e-02f, +1.652865380e-02f, +2.367475921e-03f, -7.457884103e-03f, -1.294869628e-02f, -1.465996827e-02f, -1.352063490e-02f, -1.062033362e-02f, -7.006582663e-03f, -3.528100272e-03f, -7.454953658e-04f, +1.086404632e-03f, +1.975656490e-03f, +2.111291198e-03f, +1.767933583e-03f, +1.220083412e-03f, +6.820059812e-04f, +2.797519799e-04f, +5.282756130e-05f,\n    -9.045437432e-06f, -1.445594466e-05f, -1.773704708e-05f, -1.604086273e-05f, -6.766816532e-06f, +1.144544108e-05f, +3.773782790e-05f, +6.836848933e-05f, +9.664228773e-05f, +1.136192096e-04f, +1.096094236e-04f, +7.625427805e-05f, +8.799239900e-06f, -9.195711480e-05f, -2.185614491e-04f, -3.570504884e-04f, -4.885012868e-04f, -5.918378714e-04f, -6.474396557e-04f, -6.408698258e-04f, -5.659549751e-04f, -4.265315589e-04f, -2.364205011e-04f, -1.754851234e-05f, +2.034758906e-04f, +3.996916520e-04f, +5.481829449e-04f, +6.336937015e-04f, +6.507776023e-04f, +6.041176459e-04f, +5.070357475e-04f, +3.785808125e-04f, +2.398511288e-04f, +1.103181681e-04f, +4.857641601e-06f, -6.801508365e-05f, -1.065062782e-04f, -1.146155658e-04f, -1.002864397e-04f, -7.314824287e-05f, -4.237501215e-05f, -1.508024918e-05f, +4.518961403e-06f, +1.514567628e-05f, +1.787376529e-05f, +1.517833682e-05f, +9.927174596e-06f, +4.564577659e-06f,\n    +9.779730107e-05f, -4.636016135e-04f, -1.586273087e-03f, -3.105780069e-03f, -4.464853891e-03f, -4.772042985e-03f, -3.081246939e-03f, +1.155036989e-03f, +7.617741535e-03f, +1.486507428e-02f, +2.048933234e-02f, +2.175575740e-02f, +1.659027470e-02f, +4.590183206e-03f, -1.235914992e-02f, -3.020492482e-02f, -4.369156029e-02f, -4.795209765e-02f, -4.022393355e-02f, -2.106632434e-02f, +5.427749768e-03f, +3.260478545e-02f, +5.316148127e-02f, +6.138313770e-02f, +5.494951196e-02f, +3.567777530e-02f, +8.940214849e-03f, -1.803756349e-02f, -3.840262399e-02f, -4.766533665e-02f, -4.481205354e-02f, -3.223999336e-02f, -1.464268029e-02f, +2.677563871e-03f, +1.544853263e-02f, +2.148979975e-02f, +2.093927879e-02f, +1.571337542e-02f, +8.522530212e-03f, +1.859589451e-03f, -2.694374039e-03f, -4.687085019e-03f, -4.581260851e-03f, -3.300208604e-03f, -1.761992968e-03f, -5.732171275e-04f, +5.601968130e-05f, +2.184961239e-04f,\n    +9.327090145e-06f, +2.597351020e-05f, +4.290415923e-05f, +4.898376114e-05f, +3.173121068e-05f, -1.621559433e-05f, -9.030718001e-05f, -1.705309043e-04f, -2.242282643e-04f, -2.161746624e-04f, -1.234617384e-04f, +5.032813447e-05f, +2.683198039e-04f, +4.658493838e-04f, +5.688154408e-04f, +5.199040306e-04f, +3.034061574e-04f, -4.162602116e-05f, -4.268648926e-04f, -7.391773030e-04f, -8.768840711e-04f, -7.852800500e-04f, -4.781673233e-04f, -3.666895974e-05f, +4.152167559e-04f, +7.501545301e-04f, +8.781920142e-04f, +7.742987235e-04f, +4.833846306e-04f, +1.019195666e-04f, -2.562184377e-04f, -4.967936220e-04f, -5.721753980e-04f, -4.899642325e-04f, -3.024266850e-04f, -8.285749660e-05f, +1.011095612e-04f, +2.075470058e-04f, +2.278471264e-04f, +1.816028521e-04f, +1.031538630e-04f, +2.639281442e-05f, -2.631648037e-05f, -4.811012979e-05f, -4.489845939e-05f, -2.883431423e-05f, -1.159389361e-05f, -1.598987474e-07f,\n    /*  2, 3 (48) */\n    +2.327625447e-04f, +6.082590345e-04f, +1.131073713e-03f, +1.689442964e-03f, +2.081863419e-03f, +2.040073771e-03f, +1.284327430e-03f, -3.940660499e-04f, -3.037483396e-03f, -6.436280622e-03f, -1.007819795e-02f, -1.315550266e-02f, -1.464295836e-02f, -1.344495466e-02f, -8.593163625e-03f, +5.390799677e-04f, +1.404878652e-02f, +3.138522609e-02f, +5.133565242e-02f, +7.213036784e-02f, +9.165906204e-02f, +1.077666013e-01f, +1.185779707e-01f, +1.227933696e-01f, +1.198979252e-01f, +1.102457583e-01f, +9.500210682e-02f, +7.595473490e-02f, +5.523092626e-02f, +3.497357657e-02f, +1.703568955e-02f, +2.746056734e-03f, -7.218032974e-03f, -1.283837811e-02f, -1.465511063e-02f, -1.358864998e-02f, -1.072683989e-02f, -7.121198229e-03f, -3.628386712e-03f, -8.186436087e-04f, +1.044029620e-03f, +1.960576241e-03f, +2.115810160e-03f, +1.783079259e-03f, +1.237957178e-03f, +6.971843180e-04f, +2.896791545e-04f, +5.739213896e-05f,\n    -8.869667763e-06f, -1.430503026e-05f, -1.769470941e-05f, -1.619712886e-05f, -7.189603096e-06f, +1.074259293e-05f, +3.682318671e-05f, +6.740520824e-05f, +9.587936640e-05f, +1.133569712e-04f, +1.101423396e-04f, +7.780056820e-05f, +1.143190856e-05f, -8.836090079e-05f, -2.143374835e-04f, -3.527218023e-04f, -4.847090843e-04f, -5.892386203e-04f, -6.465865679e-04f, -6.421021986e-04f, -5.693190501e-04f, -4.317513181e-04f, -2.429270989e-04f, -2.456493322e-05f, +1.968101222e-04f, +3.941795518e-04f, +5.444403173e-04f, +6.320554984e-04f, +6.512574993e-04f, +6.064265671e-04f, +5.106528043e-04f, +3.828597697e-04f, +2.441393179e-04f, +1.140639309e-04f, +7.686758355e-06f, -6.626528240e-05f, -1.057964787e-04f, -1.147498435e-04f, -1.009790774e-04f, -7.409509441e-05f, -4.331406289e-05f, -1.583080551e-05f, +4.042543184e-06f, +1.494341021e-05f, +1.788548775e-05f, +1.531578494e-05f, +1.010367479e-05f, +4.715850413e-06f,\n    +1.071243912e-04f, -4.376281033e-04f, -1.543368928e-03f, -3.056796308e-03f, -4.433122681e-03f, -4.788258580e-03f, -3.171554119e-03f, +9.845060845e-04f, +7.393513271e-03f, +1.464889962e-02f, +2.036587060e-02f, +2.180608554e-02f, +1.685859451e-02f, +5.056032590e-03f, -1.179033448e-02f, -2.968502079e-02f, -4.338815413e-02f, -4.799372367e-02f, -4.065079844e-02f, -2.180550164e-02f, +4.550865697e-03f, +3.181950540e-02f, +5.268331394e-02f, +6.134646874e-02f, +5.536472871e-02f, +3.642792983e-02f, +9.818406863e-03f, -1.726326477e-02f, -3.791923935e-02f, -4.756341708e-02f, -4.506827197e-02f, -3.273678699e-02f, -1.521485568e-02f, +2.187599639e-03f, +1.514610595e-02f, +2.140694225e-02f, +2.104038835e-02f, +1.592092242e-02f, +8.750377339e-03f, +2.041192303e-03f, -2.591220176e-03f, -4.660692205e-03f, -4.607577331e-03f, -3.348318733e-03f, -1.806891427e-03f, -6.020514417e-04f, +4.442578769e-05f, +2.183362251e-04f,\n    +8.893397928e-06f, +2.540239313e-05f, +4.247232228e-05f, +4.908748870e-05f, +3.272092345e-05f, -1.425918711e-05f, -8.775566630e-05f, -1.682350316e-04f, -2.233165834e-04f, -2.176440466e-04f, -1.276886948e-04f, +4.395226739e-05f, +2.614318102e-04f, +4.607364475e-04f, +5.676830579e-04f, +5.240226921e-04f, +3.124629637e-04f, -2.967814651e-05f, -4.153302342e-04f, -7.316192808e-04f, -8.759306836e-04f, -7.916631086e-04f, -4.903665421e-04f, -5.132194230e-05f, +4.022602460e-04f, +7.424994357e-04f, +8.777580473e-04f, +7.807717433e-04f, +4.944330571e-04f, +1.140654159e-04f, -2.464154710e-04f, -4.916713289e-04f, -5.723788116e-04f, -4.944820104e-04f, -3.091651753e-04f, -8.948137306e-05f, +9.640048616e-05f, +2.055630957e-04f, +2.283761428e-04f, +1.837277423e-04f, +1.057348169e-04f, +2.850444351e-05f, -2.513989055e-05f, -4.786198073e-05f, -4.526150288e-05f, -2.940548286e-05f, -1.206616299e-05f, -4.024611317e-07f,\n    /*  2, 4 (48) */\n    +2.238928769e-04f, +5.939540043e-04f, +1.113379003e-03f, +1.673245835e-03f, +2.074673816e-03f, +2.050816364e-03f, +1.321150617e-03f, -3.266608416e-04f, -2.941604030e-03f, -6.322923651e-03f, -9.968055609e-03f, -1.307770209e-02f, -1.463152645e-02f, -1.353331556e-02f, -8.807501108e-03f, +1.863581655e-04f, +1.356407744e-02f, +3.079598747e-02f, +5.068906585e-02f, +7.148826564e-02f, +9.108974299e-02f, +1.073348500e-01f, +1.183350437e-01f, +1.227688047e-01f, +1.200947354e-01f, +1.106399378e-01f, +9.554654713e-02f, +7.658679040e-02f, +5.588218376e-02f, +3.558000314e-02f, +1.754634235e-02f, +3.128916504e-03f, -6.973893657e-03f, -1.272431418e-02f, -1.464742387e-02f, -1.365491527e-02f, -1.083263637e-02f, -7.235948073e-03f, -3.729365789e-03f, -8.927387031e-04f, +1.000715557e-03f, +1.944745435e-03f, +2.119852703e-03f, +1.798022669e-03f, +1.255842665e-03f, +7.125001030e-04f, +2.997828293e-04f, +6.210798937e-05f,\n    -8.694227944e-06f, -1.415216617e-05f, -1.764758391e-05f, -1.634596290e-05f, -7.603492727e-06f, +1.004794213e-05f, +3.591319099e-05f, +6.644006295e-05f, +9.510577867e-05f, +1.130744256e-04f, +1.106465203e-04f, +7.931317237e-05f, +1.403138297e-05f, -8.479080402e-05f, -2.101260580e-04f, -3.483870618e-04f, -4.808899607e-04f, -5.865928741e-04f, -6.456724169e-04f, -6.432670421e-04f, -5.726190240e-04f, -4.369203387e-04f, -2.494044498e-04f, -3.157837062e-05f, +1.901205840e-04f, +3.886208156e-04f, +5.406356977e-04f, +6.303496402e-04f, +6.516741400e-04f, +6.086852563e-04f, +5.142384158e-04f, +3.871281868e-04f, +2.484363303e-04f, +1.178333665e-04f, +1.054810206e-05f, -6.448138195e-05f, -1.050564873e-04f, -1.148617881e-04f, -1.016589473e-04f, -7.503831325e-05f, -4.425657742e-05f, -1.658904033e-05f, +3.557165526e-06f, +1.473325471e-05f, +1.789179549e-05f, +1.545068921e-05f, +1.028007989e-05f, +4.868577177e-06f,\n    +1.160177891e-04f, -4.122257101e-04f, -1.500896606e-03f, -3.007708819e-03f, -4.400401757e-03f, -4.802517767e-03f, -3.259309785e-03f, +8.162710528e-04f, +7.170196687e-03f, +1.443125557e-02f, +2.023818191e-02f, +2.185003780e-02f, +1.712002632e-02f, +5.516769037e-03f, -1.122265142e-02f, -2.916099810e-02f, -4.307569117e-02f, -4.802340182e-02f, -4.106612868e-02f, -2.253712093e-02f, +3.674935013e-03f, +3.102784229e-02f, +5.219294740e-02f, +6.129514680e-02f, +5.576698896e-02f, +3.717042926e-02f, +1.069616491e-02f, -1.648249302e-02f, -3.742480630e-02f, -4.744935167e-02f, -4.531468744e-02f, -3.322845831e-02f, -1.578723449e-02f, +1.693117628e-03f, +1.483694077e-02f, +2.131746088e-02f, +2.113678884e-02f, +1.612648552e-02f, +8.978753482e-03f, +2.224920046e-03f, -2.485485359e-03f, -4.632187761e-03f, -4.632717222e-03f, -3.396180714e-03f, -1.852152930e-03f, -6.314569246e-04f, +3.235962470e-05f, +2.179337640e-04f,\n    +8.466489063e-06f, +2.483227790e-05f, +4.203043254e-05f, +4.916838214e-05f, +3.367975215e-05f, -1.233000201e-05f, -8.521210150e-05f, -1.659146577e-04f, -2.223446079e-04f, -2.190289187e-04f, -1.318330365e-04f, +3.762360484e-05f, +2.545269905e-04f, +4.555320128e-04f, +5.664001392e-04f, +5.279727365e-04f, +3.213879831e-04f, -1.777500250e-05f, -4.037270028e-04f, -7.238894151e-04f, -8.747482740e-04f, -7.978284485e-04f, -5.024274914e-04f, -6.596032919e-05f, +3.891899554e-04f, +7.346386734e-04f, +8.770913041e-04f, +7.870554015e-04f, +5.053881103e-04f, +1.262323105e-04f, -2.364960278e-04f, -4.863836286e-04f, -5.724235080e-04f, -4.988930718e-04f, -3.158705776e-04f, -9.614045620e-05f, +9.161363612e-05f, +2.034924447e-04f, +2.288380210e-04f, +1.858201188e-04f, +1.083175159e-04f, +3.064044285e-05f, -2.393200775e-05f, -4.758857544e-05f, -4.561165540e-05f, -2.997561797e-05f, -1.254445566e-05f, -6.524678118e-07f,\n    /*  2, 5 (48) */\n    +2.151986490e-04f, +5.798018381e-04f, +1.095731419e-03f, +1.656899872e-03f, +2.067070323e-03f, +2.060864306e-03f, +1.357063808e-03f, -2.602207787e-04f, -2.846498251e-03f, -6.209849225e-03f, -9.857409088e-03f, -1.299838892e-02f, -1.461749507e-02f, -1.361810636e-02f, -9.017627166e-03f, -1.620288963e-04f, +1.308318748e-02f, +3.020939460e-02f, +5.004339344e-02f, +7.084499860e-02f, +9.051712397e-02f, +1.068979297e-01f, +1.180856392e-01f, +1.227372263e-01f, +1.202848560e-01f, +1.110285586e-01f, +9.608718283e-02f, +7.721714004e-02f, +5.653385790e-02f, +3.618868840e-02f, +1.806058077e-02f, +3.516044690e-03f, -6.725457326e-03f, -1.260648082e-02f, -1.463687577e-02f, -1.371939665e-02f, -1.093769286e-02f, -7.350809861e-03f, -3.831024737e-03f, -9.677770163e-04f, +9.564589793e-04f, +1.928156395e-03f, +2.123409868e-03f, +1.812755924e-03f, +1.273734461e-03f, +7.279507922e-04f, +3.100629092e-04f, +6.697656655e-05f,\n    -8.519174888e-06f, -1.399743514e-05f, -1.759576105e-05f, -1.648743506e-05f, -8.008503125e-06f, +9.361551378e-06f, +3.500799781e-05f, +6.547329714e-05f, +9.432182171e-05f, +1.127718672e-04f, +1.111221882e-04f, +8.079217154e-05f, +1.659755120e-05f, -8.124714801e-05f, -2.059276841e-04f, -3.440468994e-04f, -4.770445681e-04f, -5.839011872e-04f, -6.446975487e-04f, -6.443644139e-04f, -5.758546346e-04f, -4.420380662e-04f, -2.558517894e-04f, -3.858797298e-05f, +1.834080748e-04f, +3.830160601e-04f, +5.367694260e-04f, +6.285761486e-04f, +6.520272446e-04f, +6.108932017e-04f, +5.177919432e-04f, +3.913854162e-04f, +2.527416165e-04f, +1.216261004e-04f, +1.344150808e-05f, -6.266334577e-05f, -1.042861110e-04f, -1.149511162e-04f, -1.023257469e-04f, -7.597763824e-05f, -4.520237532e-05f, -1.735486795e-05f, +3.062828592e-06f, +1.451514970e-05f, +1.789260018e-05f, +1.558296283e-05f, +1.045632548e-05f, +5.022725094e-06f,\n    +1.244842782e-04f, -3.873934322e-04f, -1.458866173e-03f, -2.958540437e-03f, -4.366722005e-03f, -4.814847769e-03f, -3.344521887e-03f, +6.503563952e-04f, +6.947852079e-03f, +1.421222665e-02f, +2.010634887e-02f, +2.188766141e-02f, +1.737455331e-02f, +5.972301050e-03f, -1.065625128e-02f, -2.863302536e-02f, -4.275430318e-02f, -4.804117682e-02f, -4.146985568e-02f, -2.326101034e-02f, +2.800186739e-03f, +3.023001384e-02f, +5.169051991e-02f, +6.122918647e-02f, +5.615617891e-02f, +3.790506794e-02f, +1.157325621e-02f, -1.569543762e-02f, -3.691941819e-02f, -4.732311936e-02f, -4.555118347e-02f, -3.371484194e-02f, -1.635965800e-02f, +1.194224557e-03f, +1.452107019e-02f, +2.122132042e-02f, +2.122840247e-02f, +1.632997796e-02f, +9.207591503e-03f, +2.410740164e-03f, -2.377167844e-03f, -4.601547318e-03f, -4.656649229e-03f, -3.443769290e-03f, -1.897764586e-03f, -6.614325425e-04f, +1.981516904e-05f, +2.172812962e-04f,\n    +8.046449887e-06f, +2.426343398e-05f, +4.157888904e-05f, +4.922680759e-05f, +3.460780348e-05f, -1.042838306e-05f, -8.267731948e-05f, -1.635709156e-04f, -2.213133645e-04f, -2.203297043e-04f, -1.358942076e-04f, +3.134374756e-05f, +2.476076295e-04f, +4.502383222e-04f, +5.649680224e-04f, +5.317539276e-04f, +3.301792273e-04f, -5.919874154e-06f, -3.920587902e-04f, -7.159904009e-04f, -8.733376566e-04f, -8.037746187e-04f, -5.143468419e-04f, -8.057995834e-05f, +3.760095383e-04f, +7.265742297e-04f, +8.761915298e-04f, +7.931473988e-04f, +5.162463108e-04f, +1.384167806e-04f, -2.264624880e-04f, -4.809312030e-04f, -5.723084953e-04f, -5.031953214e-04f, -3.225405397e-04f, -1.028329237e-04f, +8.674983814e-05f, +2.013348463e-04f, +2.292318388e-04f, +1.878788303e-04f, +1.109010239e-04f, +3.280034141e-05f, -2.269282404e-05f, -4.728959078e-05f, -4.594850717e-05f, -3.054440828e-05f, -1.302864034e-05f, -9.099460397e-07f,\n    /*  2, 6 (48) */\n    +2.066794741e-04f, +5.658044030e-04f, +1.078135658e-03f, +1.640412437e-03f, +2.059061820e-03f, +2.070225857e-03f, +1.392071805e-03f, -1.947474815e-04f, -2.752176430e-03f, -6.097077358e-03f, -9.746286900e-03f, -1.291759675e-02f, -1.460089752e-02f, -1.369935351e-02f, -9.223554850e-03f, -5.060757957e-04f, +1.260614291e-02f, +2.962549341e-02f, +4.939869589e-02f, +7.020063419e-02f, +8.994126933e-02f, +1.064558916e-01f, +1.178297874e-01f, +1.226986384e-01f, +1.204682640e-01f, +1.114115747e-01f, +9.662395226e-02f, +7.784571619e-02f, +5.718588514e-02f, +3.679958160e-02f, +1.857837271e-02f, +3.907430107e-03f, -6.472715710e-03f, -1.248485472e-02f, -1.462343426e-02f, -1.378205999e-02f, -1.104197897e-02f, -7.465760977e-03f, -3.933350484e-03f, -1.043754655e-03f, +9.112566040e-04f, +1.910801527e-03f, +2.126472697e-03f, +1.827271074e-03f, +1.291627061e-03f, +7.435337550e-04f, +3.205192346e-04f, +7.199929164e-05f,\n    -8.344564540e-06f, -1.384091928e-05f, -1.753933143e-05f, -1.662161663e-05f, -8.404654100e-06f, +8.683480529e-06f, +3.410776128e-05f, +6.450515218e-05f, +9.352779174e-05f, +1.124495919e-04f, +1.115695688e-04f, +8.223765199e-05f, +1.913030786e-05f, -7.773024984e-05f, -2.017428681e-04f, -3.397019451e-04f, -4.731735600e-04f, -5.811641189e-04f, -6.436623173e-04f, -6.453943812e-04f, -5.790256297e-04f, -4.471039543e-04f, -2.622683581e-04f, -4.559288931e-05f, +1.766733973e-04f, +3.773659094e-04f, +5.328418520e-04f, +6.267350554e-04f, +6.523165421e-04f, +6.130498973e-04f, +5.213127495e-04f, +3.956308083e-04f, +2.570546224e-04f, +1.254417521e-04f, +1.636680517e-05f, -6.081114311e-05f, -1.034851606e-04f, -1.150175463e-04f, -1.029791733e-04f, -7.691280619e-05f, -4.615127328e-05f, -1.812819973e-05f, +2.559534897e-06f, +1.428903649e-05f, +1.788781391e-05f, +1.571251857e-05f, +1.063234626e-05f, +5.178260298e-06f,\n    +1.325307281e-04f, -3.631299982e-04f, -1.417287284e-03f, -2.909313630e-03f, -4.332114202e-03f, -4.825276152e-03f, -3.427199206e-03f, +4.867854796e-04f, +6.726538715e-03f, +1.399189695e-02f, +1.997045467e-02f, +2.191900516e-02f, +1.762216094e-02f, +6.422539372e-03f, -1.009128326e-02f, -2.810127143e-02f, -4.242412396e-02f, -4.804709670e-02f, -4.186191447e-02f, -2.397700074e-02f, +1.926849082e-03f, +2.942623922e-02f, +5.117617307e-02f, +6.114860651e-02f, +5.653218845e-02f, +3.863164217e-02f, +1.244944774e-02f, -1.490229022e-02f, -3.640317188e-02f, -4.718470258e-02f, -4.577764596e-02f, -3.419577315e-02f, -1.693196650e-02f, +6.910292352e-04f, +1.419852965e-02f, +2.111848750e-02f, +2.131515231e-02f, +1.653131281e-02f, +9.436823341e-03f, +2.598618995e-03f, -2.266266820e-03f, -4.568746977e-03f, -4.679342053e-03f, -3.491058880e-03f, -1.943713093e-03f, -6.919769508e-04f, +6.786528698e-06f, +2.163713502e-04f,\n    +7.633361304e-06f, +2.369612532e-05f, +4.111808869e-05f, +4.926313550e-05f, +3.550519564e-05f, -8.554658539e-06f, -8.015214039e-05f, -1.612049344e-04f, -2.202238910e-04f, -2.215468551e-04f, -1.398716859e-04f, +2.511426691e-05f, +2.406760000e-04f, +4.448576322e-04f, +5.633880856e-04f, +5.353660836e-04f, +3.388347590e-04f, +5.883981206e-06f, -3.803291967e-04f, -7.079249784e-04f, -8.716997142e-04f, -8.095002376e-04f, -5.261213105e-04f, -9.517667379e-05f, +3.627226851e-04f, +7.183081557e-04f, +8.750585407e-04f, +7.990454901e-04f, +5.270041986e-04f, +1.506153382e-04f, -2.163172775e-04f, -4.753147901e-04f, -5.720328272e-04f, -5.073866860e-04f, -3.291727038e-04f, -1.095569277e-04f, +8.180995317e-05f, +1.990901227e-04f, +2.295566890e-04f, +1.899027257e-04f, +1.134843933e-04f, +3.498365227e-05f, -2.142234465e-05f, -4.696471002e-05f, -4.627164787e-05f, -3.111153756e-05f, -1.351858005e-05f, -1.174919173e-06f,\n    /*  2, 7 (48) */\n    +1.983349096e-04f, +5.519634837e-04f, +1.060596327e-03f, +1.623790820e-03f, +2.050657166e-03f, +2.078909338e-03f, +1.426179567e-03f, -1.302423294e-04f, -2.658648638e-03f, -5.984627766e-03f, -9.634717331e-03f, -1.283535910e-02f, -1.458176721e-02f, -1.377708376e-02f, -9.425297718e-03f, -8.457777408e-04f, +1.213296935e-02f, +2.904432929e-02f, +4.875503357e-02f, +6.955523980e-02f, +8.936224371e-02f, +1.060087877e-01f, +1.175675191e-01f, +1.226530455e-01f, +1.206449374e-01f, +1.117889406e-01f, +9.715679411e-02f, +7.847245124e-02f, +5.783820168e-02f, +3.741263150e-02f, +1.909968546e-02f, +4.303060915e-03f, -6.215661087e-03f, -1.235941296e-02f, -1.460706746e-02f, -1.384287114e-02f, -1.114546413e-02f, -7.580778523e-03f, -4.036329657e-03f, -1.120667461e-03f, +8.651053307e-04f, +1.892673327e-03f, +2.129032232e-03f, +1.841560110e-03f, +1.309514875e-03f, +7.592462736e-04f, +3.311515809e-04f, +7.717755194e-05f,\n    -8.170451874e-06f, -1.368270014e-05f, -1.747838576e-05f, -1.674858004e-05f, -8.791967543e-06f, +8.013786642e-06f, +3.321263254e-05f, +6.353586705e-05f, +9.272398405e-05f, +1.121078964e-04f, +1.119888913e-04f, +8.364970531e-05f, +2.162955402e-05f, -7.424042003e-05f, -1.975721113e-04f, -3.353528265e-04f, -4.692775907e-04f, -5.783822332e-04f, -6.425670845e-04f, -6.463570208e-04f, -5.821317669e-04f, -4.521174649e-04f, -2.686534011e-04f, -5.259226943e-05f, +1.699173576e-04f, +3.716709945e-04f, +5.288533349e-04f, +6.248264024e-04f, +6.525417699e-04f, +6.151548427e-04f, +5.248002005e-04f, +3.998637126e-04f, +2.613747898e-04f, +1.292799344e-04f, +1.932381540e-05f, -5.892474902e-05f, -1.026534512e-04f, -1.150607986e-04f, -1.036189232e-04f, -7.784355196e-05f, -4.710308517e-05f, -1.890894410e-05f, +2.047289331e-06f, +1.405485785e-05f, +1.787734921e-05f, +1.583926880e-05f, +1.080807602e-05f, +5.335147914e-06f,\n    +1.401640894e-04f, -3.394338729e-04f, -1.376169196e-03f, -2.860050494e-03f, -4.296609006e-03f, -4.833830810e-03f, -3.507351347e-03f, +3.255805452e-04f, +6.506314824e-03f, +1.377035010e-02f, +1.983058298e-02f, +2.194411942e-02f, +1.786283694e-02f, +6.867397005e-03f, -9.527895176e-03f, -2.756590535e-02f, -4.208528920e-02f, -4.804121272e-02f, -4.224224367e-02f, -2.468492572e-02f, +1.055149368e-03f, +2.861673899e-02f, +5.065005176e-02f, +6.105342983e-02f, +5.689491114e-02f, +3.934995032e-02f, +1.332450628e-02f, -1.410324473e-02f, -3.587616768e-02f, -4.703408724e-02f, -4.599396324e-02f, -3.467108794e-02f, -1.750399933e-02f, +1.836425491e-04f, +1.386935695e-02f, +2.100893057e-02f, +2.139696226e-02f, +1.673040293e-02f, +9.666380030e-03f, +2.788521720e-03f, -2.152782426e-03f, -4.533763325e-03f, -4.700764398e-03f, -3.538023590e-03f, -1.989984741e-03f, -7.230884884e-04f, -6.732051356e-06f, +2.151964310e-04f,\n    +7.227298826e-06f, +2.313061035e-05f, +4.064842614e-05f, +4.927774042e-05f, +3.637205811e-05f, -6.709141053e-06f, -7.763737051e-05f, -1.588178385e-04f, -2.190772355e-04f, -2.226808477e-04f, -1.437649828e-04f, +1.893670441e-05f, +2.337343623e-04f, +4.393922133e-04f, +5.616617465e-04f, +5.388090779e-04f, +3.473526926e-04f, +1.763333493e-05f, -3.685418302e-04f, -6.996959320e-04f, -8.698353975e-04f, -8.150039925e-04f, -5.377476602e-04f, -1.097463270e-04f, +3.493331199e-04f, +7.098425667e-04f, +8.736922246e-04f, +8.047474842e-04f, +5.376583343e-04f, +1.628244780e-04f, -2.060628682e-04f, -4.695351836e-04f, -5.715956042e-04f, -5.114651158e-04f, -3.357647084e-04f, -1.163105947e-04f, +7.679487601e-05f, +1.967581254e-04f, +2.298116804e-04f, +1.918906538e-04f, +1.160666647e-04f, +3.718987259e-05f, -2.012058813e-05f, -4.661362310e-05f, -4.658066683e-05f, -3.167668481e-05f, -1.401413201e-05f, -1.447406595e-06f,\n    /*  2, 8 (48) */\n    +1.901644577e-04f, +5.382807835e-04f, +1.043117941e-03f, +1.607042240e-03f, +2.041865198e-03f, +2.086923125e-03f, +1.459392199e-03f, -6.670646231e-05f, -2.565924654e-03f, -5.872519870e-03f, -9.522728440e-03f, -1.275170939e-02f, -1.456013766e-02f, -1.385132418e-02f, -9.622869830e-03f, -1.181130567e-03f, +1.166369176e-02f, +2.846594706e-02f, +4.811246649e-02f, +6.890888278e-02f, +8.878011194e-02f, +1.055566702e-01f, +1.172988657e-01f, +1.226004532e-01f, +1.208148548e-01f, +1.121606116e-01f, +9.768564744e-02f, +7.909727764e-02f, +5.849074345e-02f, +3.802778634e-02f, +1.962448566e-02f, +4.702924628e-03f, -5.954286298e-03f, -1.223013303e-02f, -1.458774364e-02f, -1.390179589e-02f, -1.124811758e-02f, -7.695839322e-03f, -4.139948580e-03f, -1.198511013e-03f, +8.180022455e-04f, +1.873764383e-03f, +2.131079521e-03f, +1.855614968e-03f, +1.327392224e-03f, +7.750855424e-04f, +3.419596569e-04f, +8.251269985e-05f,\n    -7.996890882e-06f, -1.352285859e-05f, -1.741301485e-05f, -1.686839873e-05f, -9.170467399e-06f, +7.352523987e-06f, +3.232275977e-05f, +6.256567834e-05f, +9.191069286e-05f, +1.117470784e-04f, +1.123803877e-04f, +8.502842828e-05f, +2.409519724e-05f, -7.077796261e-05f, -1.934159098e-04f, -3.310001687e-04f, -4.653573154e-04f, -5.755560987e-04f, -6.414122198e-04f, -6.472524196e-04f, -5.851728139e-04f, -4.570780681e-04f, -2.750061691e-04f, -5.958526404e-05f, +1.631407655e-04f, +3.659319540e-04f, +5.248042432e-04f, +6.228502412e-04f, +6.527026745e-04f, +6.172075439e-04f, +5.282536639e-04f, +4.040834770e-04f, +2.657015558e-04f, +1.331402544e-04f, +2.231235421e-05f, -5.700414440e-05f, -1.017908016e-04f, -1.150805950e-04f, -1.042446931e-04f, -7.876960845e-05f, -4.805762199e-05f, -1.969700654e-05f, +1.526099187e-06f, +1.381255800e-05f, +1.786111905e-05f, +1.596312552e-05f, +1.098344767e-05f, +5.493352053e-06f,\n    +1.473913882e-04f, -3.163032626e-04f, -1.335520770e-03f, -2.810772754e-03f, -4.260236948e-03f, -4.840539951e-03f, -3.584988717e-03f, +1.667627067e-04f, +6.287237588e-03f, +1.354766925e-02f, +1.968681800e-02f, +2.196305613e-02f, +1.809657130e-02f, +7.306789218e-03f, -8.966233429e-03f, -2.702709627e-02f, -4.173793651e-02f, -4.802357938e-02f, -4.261078550e-02f, -2.538462165e-02f, +1.853139707e-04f, +2.780173499e-02f, +5.011230410e-02f, +6.094368351e-02f, +5.724424426e-02f, +4.005979289e-02f, +1.419819851e-02f, -1.329849725e-02f, -3.533850934e-02f, -4.687126276e-02f, -4.620002611e-02f, -3.514062312e-02f, -1.807559493e-02f, -3.278225666e-04f, +1.353359224e-02f, +2.089261998e-02f, +2.147375714e-02f, +1.692716106e-02f, +9.896191711e-03f, +2.980412374e-03f, -2.036715762e-03f, -4.496573452e-03f, -4.720884986e-03f, -3.584637213e-03f, -2.036565407e-03f, -7.547651732e-04f, -2.074618336e-05f, +2.137490244e-04f,\n    +6.828332627e-06f, +2.256714189e-05f, +4.017029362e-05f, +4.927100079e-05f, +3.720853147e-05f, -4.892127566e-06f, -7.513380208e-05f, -1.564107476e-04f, -2.178744558e-04f, -2.237321840e-04f, -1.475736432e-04f, +1.281257153e-05f, +2.267849633e-04f, +4.338443485e-04f, +5.597904616e-04f, +5.420828385e-04f, +3.557311946e-04f, +2.932498800e-05f, -3.567003045e-04f, -6.913060890e-04f, -8.677457248e-04f, -8.202846407e-04f, -5.492227019e-04f, -1.242847781e-04f, +3.358446005e-04f, +7.011796411e-04f, +8.720925403e-04f, +8.102512456e-04f, +5.482053006e-04f, +1.750406785e-04f, -1.957017770e-04f, -4.635932335e-04f, -5.709959738e-04f, -5.154285844e-04f, -3.423141883e-04f, -1.230920268e-04f, +7.170553526e-05f, +1.943387355e-04f, +2.299959380e-04f, +1.938414640e-04f, +1.186468676e-04f, +3.941848368e-05f, -1.878758649e-05f, -4.623602683e-05f, -4.687515319e-05f, -3.223952423e-05f, -1.451514763e-05f, -1.727423627e-06f,\n    /*  2, 9 (48) */\n    +1.821675668e-04f, +5.247579250e-04f, +1.025704926e-03f, +1.590173842e-03f, +2.032694731e-03f, +2.094275649e-03f, +1.491714959e-03f, -4.140783970e-06f, -2.474013961e-03f, -5.760772791e-03f, -9.410348052e-03f, -1.266668096e-02f, -1.453604246e-02f, -1.392210214e-02f, -9.816285739e-03f, -1.512130736e-03f, +1.119833444e-02f, +2.789039096e-02f, +4.747105427e-02f, +6.826163036e-02f, +8.819493912e-02f, +1.050995921e-01f, +1.170238595e-01f, +1.225408679e-01f, +1.209779955e-01f, +1.125265436e-01f, +9.821045169e-02f, +7.972012788e-02f, +5.914344613e-02f, +3.864499388e-02f, +2.015273933e-02f, +5.107008105e-03f, -5.688584742e-03f, -1.209699277e-02f, -1.456543129e-02f, -1.395880003e-02f, -1.134990838e-02f, -7.810919917e-03f, -4.244193273e-03f, -1.277280621e-03f, +7.699446236e-04f, +1.854067377e-03f, +2.132605620e-03f, +1.869427526e-03f, +1.345253343e-03f, +7.910486679e-04f, +3.529431046e-04f, +8.800605191e-05f,\n    -7.823934576e-06f, -1.336147488e-05f, -1.734330956e-05f, -1.698114718e-05f, -9.540179638e-06f, +6.699744060e-06f, +3.143828816e-05f, +6.159482021e-05f, +9.108821130e-05f, +1.113674365e-04f, +1.127442933e-04f, +8.637392289e-05f, +2.652715154e-05f, -6.734317504e-05f, -1.892747545e-04f, -3.266445939e-04f, -4.614133903e-04f, -5.726862885e-04f, -6.401981006e-04f, -6.480806737e-04f, -5.881485482e-04f, -4.619852426e-04f, -2.813259176e-04f, -6.657102488e-05f, +1.563444340e-04f, +3.601494334e-04f, +5.206949552e-04f, +6.208066337e-04f, +6.527990109e-04f, +6.192075126e-04f, +5.316725104e-04f, +4.082894485e-04f, +2.700343538e-04f, +1.370223128e-04f, +2.533223037e-05f, -5.504931606e-05f, -1.008970351e-04f, -1.150766596e-04f, -1.048561792e-04f, -7.969070668e-05f, -4.901469194e-05f, -2.049228958e-05f, +9.959741817e-07f, +1.356208269e-05f, +1.783903691e-05f, +1.608400036e-05f, +1.115839327e-05f, +5.652835814e-06f,\n    +1.542197209e-04f, -2.937361207e-04f, -1.295350476e-03f, -2.761501753e-03f, -4.223028416e-03f, -4.845432079e-03f, -3.660122519e-03f, +1.035195909e-05f, +6.069363132e-03f, +1.332393706e-02f, +1.953924435e-02f, +2.197586870e-02f, +1.832335626e-02f, +7.740633566e-03f, -8.406442968e-03f, -2.648501343e-02f, -4.138220531e-02f, -4.799425439e-02f, -4.296748580e-02f, -2.607592774e-02f, -6.824317540e-04f, +2.698145035e-02f, +4.956308140e-02f, +6.081939873e-02f, +5.758008886e-02f, +4.076097253e-02f, +1.507029105e-02f, -1.248824600e-02f, -3.479030404e-02f, -4.669622208e-02f, -4.639572788e-02f, -3.560421635e-02f, -1.864659090e-02f, -8.432511510e-04f, +1.319127805e-02f, +2.076952795e-02f, +2.154546268e-02f, +1.712149979e-02f, +1.012618765e-02f, +3.174253838e-03f, -1.918068894e-03f, -4.457154968e-03f, -4.739672573e-03f, -3.630873240e-03f, -2.083440561e-03f, -7.870046974e-04f, -3.526133099e-05f, +2.120216008e-04f,\n    +6.436527589e-06f, +2.200596715e-05f, +3.968408078e-05f, +4.924329868e-05f, +3.801476720e-05f, -3.103899478e-06f, -7.264221312e-05f, -1.539847759e-04f, -2.166166192e-04f, -2.247013900e-04f, -1.512972455e-04f, +6.743349257e-06f, +2.198300360e-04f, +4.282163328e-04f, +5.577757256e-04f, +5.451873476e-04f, +3.639684837e-04f, +4.095577201e-05f, -3.448082387e-04f, -6.827583192e-04f, -8.654317815e-04f, -8.253410091e-04f, -5.605432950e-04f, -1.387878976e-04f, +3.222609165e-04f, +6.923216202e-04f, +8.702595184e-04f, +8.155546947e-04f, +5.586417028e-04f, +1.872604035e-04f, -1.852365655e-04f, -4.574898456e-04f, -5.702331310e-04f, -5.192750907e-04f, -3.488187759e-04f, -1.298993015e-04f, +6.654289323e-05f, +1.918318640e-04f, +2.301086035e-04f, +1.957540069e-04f, +1.212240206e-04f, +4.166895100e-05f, -1.742338539e-05f, -4.583162515e-05f, -4.715469618e-05f, -3.279972542e-05f, -1.502147253e-05f, -2.014981454e-06f,\n    /*  2,10 (48) */\n    +1.743436322e-04f, +5.113964501e-04f, +1.008361617e-03f, +1.573192694e-03f, +2.023154551e-03f, +2.100975393e-03f, +1.523153247e-03f, +5.745403624e-05f, -2.382925750e-03f, -5.649405355e-03f, -9.297603759e-03f, -1.258030704e-02f, -1.450951531e-02f, -1.398944532e-02f, -1.000556049e-02f, -1.838775330e-03f, +1.073692105e-02f, +2.731770467e-02f, +4.683085617e-02f, +6.761354969e-02f, +8.760679058e-02f, +1.046376069e-01f, +1.167425336e-01f, +1.224742969e-01f, +1.211343400e-01f, +1.128866930e-01f, +9.873114664e-02f, +8.034093452e-02f, +5.979624514e-02f, +3.926420140e-02f, +2.068441184e-02f, +5.515297553e-03f, -5.418550388e-03f, -1.195997046e-02f, -1.454009906e-02f, -1.401384935e-02f, -1.145080542e-02f, -7.925996577e-03f, -4.349049452e-03f, -1.356971328e-03f, +7.209299316e-04f, +1.833575087e-03f, +2.133601595e-03f, +1.882989609e-03f, +1.363092380e-03f, +8.071326683e-04f, +3.641014979e-04f, +9.365888772e-05f,\n    -7.651634979e-06f, -1.319862861e-05f, -1.726936079e-05f, -1.708690087e-05f, -9.901132222e-06f, +6.055495601e-06f, +3.055935993e-05f, +6.062352435e-05f, +9.025683137e-05f, +1.109692702e-04f, +1.130808466e-04f, +8.768629623e-05f, +2.892533735e-05f, -6.393634822e-05f, -1.851491307e-04f, -3.222867216e-04f, -4.574464721e-04f, -5.697733800e-04f, -6.389251117e-04f, -6.488418893e-04f, -5.910587572e-04f, -4.668384753e-04f, -2.876119077e-04f, -7.354870489e-05f, +1.495291793e-04f, +3.543240851e-04f, +5.165258583e-04f, +6.186956518e-04f, +6.528305431e-04f, +6.211542671e-04f, +5.350561130e-04f, +4.124809731e-04f, +2.743726128e-04f, +1.409257044e-04f, +2.838324597e-05f, -5.306025672e-05f, -9.997197899e-05f, -1.150487184e-04f, -1.054530775e-04f, -8.060657581e-05f, -4.997410040e-05f, -2.129469280e-05f, +4.569264820e-07f, +1.330337920e-05f, +1.781101677e-05f, +1.620180464e-05f, +1.133284398e-05f, +5.813561281e-06f,\n    +1.606562484e-04f, -2.717301535e-04f, -1.255666395e-03f, -2.712258454e-03f, -4.185013649e-03f, -4.848535978e-03f, -3.732764732e-03f, -1.436328168e-04f, +5.852746513e-03f, +1.309923567e-02f, +1.938794711e-02f, +2.198261205e-02f, +1.854318630e-02f, +8.168849899e-03f, -7.848667242e-03f, -2.593982609e-02f, -4.101823683e-02f, -4.795329862e-02f, -4.331229404e-02f, -2.675868606e-02f, -1.547863536e-03f, +2.615610935e-02f, +4.900253810e-02f, +6.068061083e-02f, +5.790234977e-02f, +4.145329415e-02f, +1.594055057e-02f, -1.167269131e-02f, -3.423166234e-02f, -4.650896168e-02f, -4.658096445e-02f, -3.606170620e-02f, -1.921682403e-02f, -1.362526242e-03f, +1.284245928e-02f, +2.063962865e-02f, +2.161200557e-02f, +1.731333166e-02f, +1.035629625e-02f, +3.370007845e-03f, -1.796844873e-03f, -4.415486017e-03f, -4.757095958e-03f, -3.676704865e-03f, -2.130595257e-03f, -8.198044229e-04f, -5.028280352e-05f, +2.100066193e-04f,\n    +6.051943364e-06f, +2.144732766e-05f, +3.919017456e-05f, +4.919501962e-05f, +3.879092743e-05f, -1.344722690e-06f, -7.016336728e-05f, -1.515410319e-04f, -2.153048015e-04f, -2.255890162e-04f, -1.549354012e-04f, +7.304878903e-07f, +2.128717986e-04f, +4.225104719e-04f, +5.556190707e-04f, +5.481226416e-04f, +3.720628316e-04f, +5.252255007e-05f, -3.328692552e-04f, -6.740555333e-04f, -8.628947198e-04f, -8.301719951e-04f, -5.717063486e-04f, -1.532515671e-04f, +3.085858884e-04f, +6.832708074e-04f, +8.681932613e-04f, +8.206558088e-04f, +5.689641709e-04f, +1.994801026e-04f, -1.746698386e-04f, -4.512259819e-04f, -5.693063191e-04f, -5.230026589e-04f, -3.552761018e-04f, -1.367304729e-04f, +6.130794585e-05f, +1.892374520e-04f, +2.301488361e-04f, +1.976271346e-04f, +1.237971315e-04f, +4.394072422e-05f, -1.602804428e-05f, -4.540012932e-05f, -4.741888520e-05f, -3.335695340e-05f, -1.553294649e-05f, -2.310087044e-06f,\n    /*  2,11 (48) */\n    +1.666919973e-04f, +4.981978215e-04f, +9.910922559e-04f, +1.556105794e-03f, +2.013253419e-03f, +2.107030888e-03f, +1.553712607e-03f, +1.180775606e-04f, -2.292668918e-03f, -5.538436085e-03f, -9.184522912e-03f, -1.249262075e-02f, -1.448058997e-02f, -1.405338166e-02f, -1.019070962e-02f, -2.161062051e-03f, +1.027947458e-02f, +2.674793129e-02f, +4.619193106e-02f, +6.696470780e-02f, +8.701573182e-02f, +1.041707684e-01f, +1.164549217e-01f, +1.224007482e-01f, +1.212838692e-01f, +1.132410171e-01f, +9.924767250e-02f, +8.095963017e-02f, +6.044907568e-02f, +3.988535566e-02f, +2.121946795e-02f, +5.927778526e-03f, -5.144177775e-03f, -1.181904476e-02f, -1.451171581e-02f, -1.406690960e-02f, -1.155077740e-02f, -8.041045295e-03f, -4.454502530e-03f, -1.437577904e-03f, +6.709558312e-04f, +1.812280394e-03f, +2.134058521e-03f, +1.896292988e-03f, +1.380903397e-03f, +8.233344729e-04f, +3.754343418e-04f, +9.947244900e-05f,\n    -7.480043122e-06f, -1.303439868e-05f, -1.719125943e-05f, -1.718573622e-05f, -1.025335508e-05f, +5.419824611e-06f, +2.968611429e-05f, +5.965201997e-05f, +8.941684389e-05f, +1.105528795e-04f, +1.133902888e-04f, +8.896566043e-05f, +3.128968150e-05f, -6.055776647e-05f, -1.810395187e-04f, -3.179271685e-04f, -4.534572180e-04f, -5.668179551e-04f, -6.375936455e-04f, -6.495361818e-04f, -5.939032386e-04f, -4.716372619e-04f, -2.938634059e-04f, -8.051745830e-05f, +1.426958208e-04f, +3.484565686e-04f, +5.122973493e-04f, +6.165173774e-04f, +6.527970441e-04f, +6.230473317e-04f, +5.384038478e-04f, +4.166573956e-04f, +2.787157577e-04f, +1.448500178e-04f, +3.146519645e-05f, -5.103696510e-05f, -9.901546503e-05f, -1.149964995e-04f, -1.060350840e-04f, -8.151694320e-05f, -5.093564998e-05f, -2.210411281e-05f, -9.102927193e-08f, +1.303639635e-05f, +1.777697317e-05f, +1.631644935e-05f, +1.150673014e-05f, +5.975489525e-06f,\n    +1.667081918e-04f, -2.502828259e-04f, -1.216476221e-03f, -2.663063435e-03f, -4.146222722e-03f, -4.849880701e-03f, -3.802928100e-03f, -2.951738487e-04f, +5.637441712e-03f, +1.287364666e-02f, +1.923301171e-02f, +2.198334254e-02f, +1.875605810e-02f, +8.591360371e-03f, -7.293048172e-03f, -2.539170344e-02f, -4.064617400e-02f, -4.790077607e-02f, -4.364516329e-02f, -2.743274159e-02f, -2.410758255e-03f, +2.532593735e-02f, +4.843083175e-02f, +6.052735927e-02f, +5.821093566e-02f, +4.213656496e-02f, +1.680874383e-02f, -1.085203550e-02f, -3.366269817e-02f, -4.630948158e-02f, -4.675563429e-02f, -3.651293218e-02f, -1.978613035e-02f, -1.885528901e-03f, +1.248718318e-02f, +2.050289818e-02f, +2.167331351e-02f, +1.750256911e-02f, +1.058644509e-02f, +3.567634980e-03f, -1.673047742e-03f, -4.371545293e-03f, -4.773124002e-03f, -3.722104995e-03f, -2.178014142e-03f, -8.531613762e-04f, -6.581575001e-05f, +2.076965323e-04f,\n    +5.674634421e-06f, +2.089145928e-05f, +3.868895900e-05f, +4.912655230e-05f, +3.953718479e-05f, +3.851523159e-07f, -6.769801371e-05f, -1.490806182e-04f, -2.139400871e-04f, -2.263956365e-04f, -1.584877552e-04f, -5.224593305e-06f, +2.059124541e-04f, +4.167290819e-04f, +5.533220657e-04f, +5.508888108e-04f, +3.800125628e-04f, +6.402221775e-05f, -3.208869794e-04f, -6.652006819e-04f, -8.601357579e-04f, -8.347765667e-04f, -5.827088224e-04f, -1.676716814e-04f, +2.948233659e-04f, +6.740295675e-04f, +8.658939429e-04f, +8.255526230e-04f, +5.791693600e-04f, +2.116962129e-04f, -1.640042448e-04f, -4.448026599e-04f, -5.682148300e-04f, -5.266093397e-04f, -3.616837955e-04f, -1.435835716e-04f, +5.600172260e-05f, +1.865554712e-04f, +2.301158125e-04f, +1.994597013e-04f, +1.263651979e-04f, +4.623323722e-05f, -1.460163653e-05f, -4.494125820e-05f, -4.766731014e-05f, -3.391086871e-05f, -1.604940348e-05f, -2.612743069e-06f,\n    /*  2,12 (48) */\n    +1.592119541e-04f, +4.851634228e-04f, +9.739009964e-04f, +1.538920057e-03f, +2.003000064e-03f, +2.112450713e-03f, +1.583398721e-03f, +1.777295806e-04f, -2.203252074e-03f, -5.427883205e-03f, -9.071132624e-03f, -1.240365508e-02f, -1.444930029e-02f, -1.411393943e-02f, -1.037174914e-02f, -2.478989220e-03f, +9.826017361e-03f, +2.618111333e-02f, +4.555433741e-02f, +6.631517162e-02f, +8.642182858e-02f, +1.036991311e-01f, +1.161610583e-01f, +1.223202308e-01f, +1.214265650e-01f, +1.135894736e-01f, +9.975996985e-02f, +8.157614755e-02f, +6.110187273e-02f, +4.050840299e-02f, +2.175787180e-02f, +6.344435922e-03f, -4.865462017e-03f, -1.167419474e-02f, -1.448025062e-02f, -1.411794657e-02f, -1.164979286e-02f, -8.156041794e-03f, -4.560537614e-03f, -1.519094847e-03f, +6.200201812e-04f, +1.790176281e-03f, +2.133967492e-03f, +1.909329384e-03f, +1.398680370e-03f, +8.396509222e-04f, +3.869410720e-04f, +1.054479385e-04f,\n    -7.309209040e-06f, -1.286886331e-05f, -1.710909637e-05f, -1.727773059e-05f, -1.059688009e-05f, +4.792774367e-06f, +2.881868748e-05f, +5.868053377e-05f, +8.856853840e-05f, +1.101185653e-04f, +1.136728644e-04f, +9.021213267e-05f, +3.362011720e-05f, -5.720770752e-05f, -1.769463931e-04f, -3.135665484e-04f, -4.494462858e-04f, -5.638205997e-04f, -6.362041019e-04f, -6.501636765e-04f, -5.966817999e-04f, -4.763811065e-04f, -3.000796842e-04f, -8.747644082e-05f, +1.358451806e-04f, +3.425475498e-04f, +5.080098345e-04f, +6.142719023e-04f, +6.526982959e-04f, +6.248862372e-04f, +5.417150934e-04f, +4.208180602e-04f, +2.830632097e-04f, +1.487948357e-04f, +3.457787058e-05f, -4.897944593e-05f, -9.802732920e-05f, -1.149197331e-04f, -1.066018947e-04f, -8.242153441e-05f, -5.189914050e-05f, -2.292044324e-05f, -6.478759438e-07f, +1.276108460e-05f, +1.773682123e-05f, +1.642784518e-05f, +1.167998123e-05f, +6.138580599e-06f,\n    +1.723828262e-04f, -2.293913666e-04f, -1.177787262e-03f, -2.613936882e-03f, -4.106685537e-03f, -4.849495549e-03f, -3.870626113e-03f, -4.442544670e-04f, +5.423501625e-03f, +1.264725102e-02f, +1.907452395e-02f, +2.197811794e-02f, +1.896197055e-02f, +9.008089453e-03f, -6.739726106e-03f, -2.484081463e-02f, -4.026616143e-02f, -4.783675385e-02f, -4.396605027e-02f, -2.809794228e-02f, -3.270894013e-03f, +2.449116078e-02f, +4.784812293e-02f, +6.035968758e-02f, +5.850575903e-02f, +4.281059452e-02f, +1.767463777e-02f, -1.002648288e-02f, -3.308352881e-02f, -4.609778536e-02f, -4.691963853e-02f, -3.695773484e-02f, -2.035434518e-02f, -2.412138240e-03f, +1.212549938e-02f, +2.035931460e-02f, +2.172931524e-02f, +1.768912458e-02f, +1.081656090e-02f, +3.767094681e-03f, -1.546682544e-03f, -4.325312056e-03f, -4.787725639e-03f, -3.767046253e-03f, -2.225681452e-03f, -8.870722450e-04f, -8.186515349e-05f, +2.050837892e-04f,\n    +5.304650110e-06f, +2.033859211e-05f, +3.818081515e-05f, +4.903828840e-05f, +4.025372215e-05f, +2.085490399e-06f, -6.524688689e-05f, -1.466046309e-04f, -2.125235683e-04f, -2.271218480e-04f, -1.619539854e-04f, -1.112050636e-05f, +1.989541894e-04f, +4.108744881e-04f, +5.508863156e-04f, +5.534859988e-04f, +3.878160556e-04f, +7.545170401e-05f, -3.088650378e-04f, -6.561967548e-04f, -8.571561795e-04f, -8.391537625e-04f, -5.935477276e-04f, -1.820441491e-04f, +2.809772275e-04f, +6.646003260e-04f, +8.633618090e-04f, +8.302432309e-04f, +5.892539518e-04f, +2.239051597e-04f, -1.532424745e-04f, -4.382209531e-04f, -5.669580047e-04f, -5.300932113e-04f, -3.680394865e-04f, -1.504566055e-04f, +5.062528636e-05f, +1.837859237e-04f, +2.300087278e-04f, +2.012505635e-04f, +1.289272071e-04f, +4.854590819e-05f, -1.314424960e-05f, -4.445473845e-05f, -4.789956147e-05f, -3.446112759e-05f, -1.657067159e-05f, -2.922947826e-06f,\n    /*  2,13 (48) */\n    +1.519027451e-04f, +4.722945595e-04f, +9.567919001e-04f, +1.521642327e-03f, +1.992403184e-03f, +2.117243487e-03f, +1.612217409e-03f, +2.364101143e-04f, -2.114683536e-03f, -5.317764640e-03f, -8.957459759e-03f, -1.231344295e-02f, -1.441568017e-02f, -1.417114714e-02f, -1.054869554e-02f, -2.792555768e-03f, +9.376571075e-03f, +2.561729273e-02f, +4.491813331e-02f, +6.566500794e-02f, +8.582514678e-02f, +1.032227500e-01f, +1.158609786e-01f, +1.222327543e-01f, +1.215624102e-01f, +1.139320212e-01f, +1.002679797e-01f, +8.219041945e-02f, +6.175457102e-02f, +4.113328923e-02f, +2.229958689e-02f, +6.765253982e-03f, -4.582398808e-03f, -1.152539990e-02f, -1.444567275e-02f, -1.416692601e-02f, -1.174782019e-02f, -8.270961528e-03f, -4.667139508e-03f, -1.601516381e-03f, +5.681210407e-04f, +1.767255838e-03f, +2.133319616e-03f, +1.922090469e-03f, +1.416417191e-03f, +8.560787674e-04f, +3.986210532e-04f, +1.115865191e-04f,\n    -7.139181769e-06f, -1.270210001e-05f, -1.702296245e-05f, -1.736296222e-05f, -1.093174100e-05f, +4.174385444e-06f, +2.795721277e-05f, +5.770928988e-05f, +8.771220318e-05f, +1.096666292e-04f, +1.139288206e-04f, +9.142583506e-05f, +3.591658402e-05f, -5.388644247e-05f, -1.728702230e-04f, -3.092054717e-04f, -4.454143335e-04f, -5.607819037e-04f, -6.347568882e-04f, -6.507245079e-04f, -5.993942585e-04f, -4.810695220e-04f, -3.062600203e-04f, -9.442480972e-05f, +1.289780839e-04f, +3.365977016e-04f, +5.036637291e-04f, +6.119593288e-04f, +6.525340894e-04f, +6.266705210e-04f, +5.449892318e-04f, +4.249623105e-04f, +2.874143859e-04f, +1.527597348e-04f, +3.772105044e-05f, -4.688770998e-05f, -9.700741192e-05f, -1.148181517e-04f, -1.071532054e-04f, -8.332007332e-05f, -5.286436904e-05f, -2.374357475e-05f, -1.213593878e-06f, +1.247739601e-05f, +1.769047668e-05f, +1.653590257e-05f, +1.185252593e-05f, +6.302793544e-06f,\n    +1.776874763e-04f, -2.090527745e-04f, -1.139606446e-03f, -2.564898594e-03f, -4.066431815e-03f, -4.847410058e-03f, -3.935873000e-03f, -5.908590979e-04f, +5.210978056e-03f, +1.242012917e-02f, +1.891256997e-02f, +2.196699744e-02f, +1.916092474e-02f, +9.418963941e-03f, -6.188839790e-03f, -2.428732863e-02f, -3.987834538e-02f, -4.776130215e-02f, -4.427491531e-02f, -2.875413903e-02f, -4.128050193e-03f, +2.365200702e-02f, +4.725457520e-02f, +6.017764343e-02f, +5.878673626e-02f, +4.347519485e-02f, +1.853799958e-02f, -9.196239645e-03f, -3.249427486e-02f, -4.587388020e-02f, -4.707288101e-02f, -3.739595579e-02f, -2.092130319e-02f, -2.942231452e-03f, +1.175745989e-02f, +2.020885800e-02f, +2.177994052e-02f, +1.787291050e-02f, +1.104656963e-02f, +3.968345245e-03f, -1.417755337e-03f, -4.276766148e-03f, -4.800869888e-03f, -3.811500991e-03f, -2.273581014e-03f, -9.215333726e-04f, -9.843582508e-05f, +2.021608414e-04f,\n    +4.942034718e-06f, +1.978895051e-05f, +3.766612089e-05f, +4.893062236e-05f, +4.094073241e-05f, +3.756071670e-06f, -6.281070650e-05f, -1.441141591e-04f, -2.110563443e-04f, -2.277682708e-04f, -1.653338023e-04f, -1.695589485e-05f, +1.919991747e-04f, +4.049490240e-04f, +5.483134604e-04f, +5.559144026e-04f, +3.954717418e-04f, +8.680797206e-05f, -2.968070569e-04f, -6.470467794e-04f, -8.539573337e-04f, -8.433026921e-04f, -6.042201278e-04f, -1.963648945e-04f, +2.670513784e-04f, +6.549855683e-04f, +8.605971771e-04f, +8.347257851e-04f, +5.992146559e-04f, +2.361033579e-04f, -1.423872601e-04f, -4.314819906e-04f, -5.655352339e-04f, -5.334523797e-04f, -3.743408051e-04f, -1.573475604e-04f, +4.517973332e-05f, +1.809288428e-04f, +2.298267956e-04f, +2.029985807e-04f, +1.314821367e-04f, +5.087813966e-05f, -1.165598518e-05f, -4.394030475e-05f, -4.811523052e-05f, -3.500738196e-05f, -1.709657307e-05f, -3.240695165e-06f,\n    /*  2,14 (48) */\n    +1.447635633e-04f, +4.595924595e-04f, +9.397689376e-04f, +1.504279365e-03f, +1.981471443e-03f, +2.121417873e-03f, +1.640174622e-03f, +2.941194042e-04f, -2.026971333e-03f, -5.208098011e-03f, -8.843530939e-03f, -1.222201712e-02f, -1.437976359e-02f, -1.422503358e-02f, -1.072156576e-02f, -3.101761240e-03f, +8.931156742e-03f, +2.505651083e-02f, +4.428337642e-02f, +6.501428343e-02f, +8.522575252e-02f, +1.027416805e-01f, +1.155547185e-01f, +1.221383295e-01f, +1.216913882e-01f, +1.142686189e-01f, +1.007716434e-01f, +8.280237878e-02f, +6.240710511e-02f, +4.175995975e-02f, +2.284457612e-02f, +7.190216292e-03f, -4.294984422e-03f, -1.137264017e-02f, -1.440795170e-02f, -1.421381372e-02f, -1.184482760e-02f, -8.385779679e-03f, -4.774292714e-03f, -1.684836455e-03f, +5.152566717e-04f, +1.743512263e-03f, +2.132106022e-03f, +1.934567865e-03f, +1.434107668e-03f, +8.726146700e-04f, +4.104735791e-04f, +1.178893127e-04f,\n    -6.970009343e-06f, -1.253418557e-05f, -1.693294841e-05f, -1.744151023e-05f, -1.125797349e-05f, +3.564695732e-06f, +2.710182039e-05f, +5.673850988e-05f, +8.684812514e-05f, +1.091973731e-04f, +1.141584072e-04f, +9.260689457e-05f, +3.817902783e-05f, -5.059423580e-05f, -1.688114720e-04f, -3.048445460e-04f, -4.413620194e-04f, -5.577024609e-04f, -6.332524186e-04f, -6.512188202e-04f, -6.020404421e-04f, -4.857020300e-04f, -3.124036978e-04f, -1.013617240e-04f, +1.220953584e-04f, +3.306077033e-04f, +4.992594577e-04f, +6.095797688e-04f, +6.523042246e-04f, +6.283997270e-04f, +5.482256479e-04f, +4.290894893e-04f, +2.917686997e-04f, +1.567442859e-04f, +4.089451147e-05f, -4.476177412e-05f, -9.595555809e-05f, -1.146914900e-04f, -1.076887123e-04f, -8.421228209e-05f, -5.383112996e-05f, -2.457339501e-05f, -1.788160879e-06f, +1.218528431e-05f, +1.763785591e-05f, +1.664053171e-05f, +1.202429206e-05f, +6.468086385e-06f,\n    +1.826295111e-04f, -1.892638240e-04f, -1.101940326e-03f, -2.515967971e-03f, -4.025491083e-03f, -4.843653987e-03f, -3.998683707e-03f, -7.349732570e-04f, +4.999921712e-03f, +1.219236090e-02f, +1.874723616e-02f, +2.195004154e-02f, +1.935292392e-02f, +9.823912965e-03f, -5.640526330e-03f, -2.373141423e-02f, -3.948287364e-02f, -4.767449418e-02f, -4.457172237e-02f, -2.940118581e-02f, -4.982007526e-03f, +2.280870433e-02f, +4.665035507e-02f, +5.998127854e-02f, +5.905378763e-02f, +4.413018042e-02f, +1.939859676e-02f, -8.361513860e-03f, -3.189506020e-02f, -4.563777685e-02f, -4.721526827e-02f, -3.782743778e-02f, -2.148683842e-02f, -3.475683831e-03f, +1.138311909e-02f, +2.005151044e-02f, +2.182512026e-02f, +1.805383935e-02f, +1.127639642e-02f, +4.171343825e-03f, -1.286273200e-03f, -4.225888008e-03f, -4.812525874e-03f, -3.855441296e-03f, -2.321696244e-03f, -9.565407545e-04f, -1.155323981e-04f, +1.989201462e-04f,\n    +4.586827532e-06f, +1.924275306e-05f, +3.714525083e-05f, +4.880395116e-05f, +4.159841831e-05f, +5.396691400e-06f, -6.039017732e-05f, -1.416102850e-04f, -2.095395216e-04f, -2.283355473e-04f, -1.686269495e-04f, -2.272943417e-05f, +1.850495629e-04f, +3.989550309e-04f, +5.456051746e-04f, +5.581742720e-04f, +4.029781075e-04f, +9.808802026e-05f, -2.847166625e-04f, -6.377538201e-04f, -8.505406338e-04f, -8.472225364e-04f, -6.147231401e-04f, -2.106298584e-04f, +2.530497498e-04f, +6.451878390e-04f, +8.576004368e-04f, +8.389984984e-04f, +6.090482106e-04f, +2.482872132e-04f, -1.314413747e-04f, -4.245869572e-04f, -5.639459584e-04f, -5.366849801e-04f, -3.805853830e-04f, -1.642544006e-04f, +3.966619283e-05f, +1.779842931e-04f, +2.295692488e-04f, +2.047026160e-04f, +1.340289548e-04f, +5.322931859e-05f, -1.013695931e-05f, -4.339770006e-05f, -4.831390965e-05f, -3.554927965e-05f, -1.762692433e-05f, -3.565974415e-06f,\n    /*  2,15 (48) */\n    +1.377935540e-04f, +4.470582739e-04f, +9.228359892e-04f, +1.486837854e-03f, +1.970213469e-03f, +2.124982568e-03f, +1.667276442e-03f, +3.508579141e-04f, -1.940123208e-03f, -5.098900637e-03f, -8.729372531e-03f, -1.212941022e-02f, -1.434158456e-02f, -1.427562782e-02f, -1.089037723e-02f, -3.406605786e-03f, +8.489794722e-03f, +2.449880837e-02f, +4.365012400e-02f, +6.436306461e-02f, +8.462371208e-02f, +1.022559785e-01f, +1.152423148e-01f, +1.220369678e-01f, +1.218134836e-01f, +1.145992266e-01f, +1.012709029e-01f, +8.341195855e-02f, +6.305940934e-02f, +4.238835948e-02f, +2.339280177e-02f, +7.619305782e-03f, -4.003215722e-03f, -1.121589588e-02f, -1.436705718e-02f, -1.425857550e-02f, -1.194078316e-02f, -8.500471169e-03f, -4.881981426e-03f, -1.769048737e-03f, +4.614255417e-04f, +1.718938868e-03f, +2.130317861e-03f, +1.946753149e-03f, +1.451745524e-03f, +8.892552017e-04f, +4.224978712e-04f, +1.243573991e-04f,\n    -6.801738791e-06f, -1.236519602e-05f, -1.683914494e-05f, -1.751345456e-05f, -1.157561503e-05f, +2.963740453e-06f, +2.625263763e-05f, +5.576841276e-05f, +8.597658981e-05f, +1.087110996e-04f, +1.143618770e-04f, +9.375544306e-05f, +4.040740079e-05f, -4.733134538e-05f, -1.647705983e-04f, -3.004843754e-04f, -4.372900018e-04f, -5.545828692e-04f, -6.316911150e-04f, -6.516467669e-04f, -6.046201882e-04f, -4.902781610e-04f, -3.185100062e-04f, -1.082863446e-04f, +1.151978344e-04f, +3.245782408e-04f, +4.947974541e-04f, +6.071333445e-04f, +6.520085110e-04f, +6.300734059e-04f, +5.514237298e-04f, +4.331989390e-04f, +2.961255608e-04f, +1.607480540e-04f, +4.409802242e-05f, -4.260166134e-05f, -9.487161712e-05f, -1.145394853e-04f, -1.082081116e-04f, -8.509788127e-05f, -5.479921488e-05f, -2.540978874e-05f, -2.371552186e-06f, +1.188470494e-05f, +1.757887595e-05f, +1.674164258e-05f, +1.219520668e-05f, +6.634416134e-06f,\n    +1.872163386e-04f, -1.700210709e-04f, -1.064795075e-03f, -2.467164020e-03f, -3.983892664e-03f, -4.838257295e-03f, -4.059073884e-03f, -8.765835420e-04f, +4.790382190e-03f, +1.196402535e-02f, +1.857860921e-02f, +2.192731211e-02f, +1.953797348e-02f, +1.022286800e-02f, -5.094921155e-03f, -2.317323996e-02f, -3.907989553e-02f, -4.757640616e-02f, -4.485643903e-02f, -3.003893963e-02f, -5.832548160e-03f, +2.196148179e-02f, +4.603563193e-02f, +5.977064868e-02f, +5.930683738e-02f, +4.477536826e-02f, +2.025619720e-02f, -7.522515361e-03f, -3.128601199e-02f, -4.538948963e-02f, -4.734670964e-02f, -3.825202474e-02f, -2.205078438e-02f, -4.012368812e-03f, +1.100253371e-02f, +1.988725604e-02f, +2.186478645e-02f, +1.823182364e-02f, +1.150596567e-02f, +4.376046441e-03f, -1.152244245e-03f, -4.172658690e-03f, -4.822662833e-03f, -3.898838996e-03f, -2.370010154e-03f, -9.920900342e-04f, -1.331593225e-04f, +1.953541718e-04f,\n    +4.239062902e-06f, +1.870021254e-05f, +3.661857613e-05f, +4.865867407e-05f, +4.222699221e-05f, +7.007159918e-06f, -5.798598908e-05f, -1.390940832e-04f, -2.079742128e-04f, -2.288243418e-04f, -1.718332028e-04f, -2.843983174e-05f, +1.781074890e-04f, +3.928948564e-04f, +5.427631665e-04f, +5.602659095e-04f, +4.103336929e-04f, +1.092888830e-04f, -2.725974779e-04f, -6.283209769e-04f, -8.469075570e-04f, -8.509125476e-04f, -6.250539358e-04f, -2.248349998e-04f, +2.389762973e-04f, +6.352097412e-04f, +8.543720493e-04f, +8.430596442e-04f, +6.187513844e-04f, +2.604531230e-04f, -1.204076315e-04f, -4.175370929e-04f, -5.621896695e-04f, -5.397891773e-04f, -3.867708543e-04f, -1.711750692e-04f, +3.408582724e-05f, +1.749523706e-04f, +2.292353400e-04f, +2.063615363e-04f, +1.365666202e-04f, +5.559881639e-05f, -8.587302511e-06f, -4.282667583e-05f, -4.849519248e-05f, -3.608646442e-05f, -1.816153592e-05f, -3.898770305e-06f,\n    /*  2,16 (48) */\n    +1.309918152e-04f, +4.346930779e-04f, +9.059968443e-04f, +1.469324400e-03f, +1.958637854e-03f, +2.127946309e-03f, +1.693529080e-03f, +4.066263268e-04f, -1.854146618e-03f, -4.990189538e-03f, -8.615010654e-03f, -1.203565478e-02f, -1.430117716e-02f, -1.432295916e-02f, -1.105514783e-02f, -3.707090161e-03f, +8.052504721e-03f, +2.394422550e-02f, +4.301843289e-02f, +6.371141785e-02f, +8.401909189e-02f, +1.017657003e-01f, +1.149238048e-01f, +1.219286814e-01f, +1.219286814e-01f, +1.149238048e-01f, +1.017657003e-01f, +8.401909189e-02f, +6.371141785e-02f, +4.301843289e-02f, +2.394422550e-02f, +8.052504721e-03f, -3.707090161e-03f, -1.105514783e-02f, -1.432295916e-02f, -1.430117716e-02f, -1.203565478e-02f, -8.615010654e-03f, -4.990189538e-03f, -1.854146618e-03f, +4.066263268e-04f, +1.693529080e-03f, +2.127946309e-03f, +1.958637854e-03f, +1.469324400e-03f, +9.059968443e-04f, +4.346930779e-04f, +1.309918152e-04f,\n    -6.634416134e-06f, -1.219520668e-05f, -1.674164258e-05f, -1.757887595e-05f, -1.188470494e-05f, +2.371552186e-06f, +2.540978874e-05f, +5.479921488e-05f, +8.509788127e-05f, +1.082081116e-04f, +1.145394853e-04f, +9.487161712e-05f, +4.260166134e-05f, -4.409802242e-05f, -1.607480540e-04f, -2.961255608e-04f, -4.331989390e-04f, -5.514237298e-04f, -6.300734059e-04f, -6.520085110e-04f, -6.071333445e-04f, -4.947974541e-04f, -3.245782408e-04f, -1.151978344e-04f, +1.082863446e-04f, +3.185100062e-04f, +4.902781610e-04f, +6.046201882e-04f, +6.516467669e-04f, +6.316911150e-04f, +5.545828692e-04f, +4.372900018e-04f, +3.004843754e-04f, +1.647705983e-04f, +4.733134538e-05f, -4.040740079e-05f, -9.375544306e-05f, -1.143618770e-04f, -1.087110996e-04f, -8.597658981e-05f, -5.576841276e-05f, -2.625263763e-05f, -2.963740453e-06f, +1.157561503e-05f, +1.751345456e-05f, +1.683914494e-05f, +1.236519602e-05f, +6.801738791e-06f,\n    +1.914554015e-04f, -1.513208584e-04f, -1.028176499e-03f, -2.418505346e-03f, -3.941665672e-03f, -4.831250135e-03f, -4.117059873e-03f, -1.015677625e-03f, +4.582407978e-03f, +1.173520101e-02f, +1.840677601e-02f, +2.189887228e-02f, +1.971608097e-02f, +1.061576285e-02f, -4.552157989e-03f, -2.261297405e-02f, -3.866956183e-02f, -4.746711727e-02f, -4.512903651e-02f, -3.066726061e-02f, -6.679455717e-03f, +2.111056924e-02f, +4.541057800e-02f, +5.954581368e-02f, +5.954581368e-02f, +4.541057800e-02f, +2.111056924e-02f, -6.679455717e-03f, -3.066726061e-02f, -4.512903651e-02f, -4.746711727e-02f, -3.866956183e-02f, -2.261297405e-02f, -4.552157989e-03f, +1.061576285e-02f, +1.971608097e-02f, +2.189887228e-02f, +1.840677601e-02f, +1.173520101e-02f, +4.582407978e-03f, -1.015677625e-03f, -4.117059873e-03f, -4.831250135e-03f, -3.941665672e-03f, -2.418505346e-03f, -1.028176499e-03f, -1.513208584e-04f, +1.914554015e-04f,\n    +3.898770305e-06f, +1.816153592e-05f, +3.608646442e-05f, +4.849519248e-05f, +4.282667583e-05f, +8.587302511e-06f, -5.559881639e-05f, -1.365666202e-04f, -2.063615363e-04f, -2.292353400e-04f, -1.749523706e-04f, -3.408582724e-05f, +1.711750692e-04f, +3.867708543e-04f, +5.397891773e-04f, +5.621896695e-04f, +4.175370929e-04f, +1.204076315e-04f, -2.604531230e-04f, -6.187513844e-04f, -8.430596442e-04f, -8.543720493e-04f, -6.352097412e-04f, -2.389762973e-04f, +2.248349998e-04f, +6.250539358e-04f, +8.509125476e-04f, +8.469075570e-04f, +6.283209769e-04f, +2.725974779e-04f, -1.092888830e-04f, -4.103336929e-04f, -5.602659095e-04f, -5.427631665e-04f, -3.928948564e-04f, -1.781074890e-04f, +2.843983174e-05f, +1.718332028e-04f, +2.288243418e-04f, +2.079742128e-04f, +1.390940832e-04f, +5.798598908e-05f, -7.007159918e-06f, -4.222699221e-05f, -4.865867407e-05f, -3.661857613e-05f, -1.870021254e-05f, -4.239062902e-06f,\n    /*  2,17 (48) */\n    +1.243573991e-04f, +4.224978712e-04f, +8.892552017e-04f, +1.451745524e-03f, +1.946753149e-03f, +2.130317861e-03f, +1.718938868e-03f, +4.614255417e-04f, -1.769048737e-03f, -4.881981426e-03f, -8.500471169e-03f, -1.194078316e-02f, -1.425857550e-02f, -1.436705718e-02f, -1.121589588e-02f, -4.003215722e-03f, +7.619305782e-03f, +2.339280177e-02f, +4.238835948e-02f, +6.305940934e-02f, +8.341195855e-02f, +1.012709029e-01f, +1.145992266e-01f, +1.218134836e-01f, +1.220369678e-01f, +1.152423148e-01f, +1.022559785e-01f, +8.462371208e-02f, +6.436306461e-02f, +4.365012400e-02f, +2.449880837e-02f, +8.489794722e-03f, -3.406605786e-03f, -1.089037723e-02f, -1.427562782e-02f, -1.434158456e-02f, -1.212941022e-02f, -8.729372531e-03f, -5.098900637e-03f, -1.940123208e-03f, +3.508579141e-04f, +1.667276442e-03f, +2.124982568e-03f, +1.970213469e-03f, +1.486837854e-03f, +9.228359892e-04f, +4.470582739e-04f, +1.377935540e-04f,\n    -6.468086385e-06f, -1.202429206e-05f, -1.664053171e-05f, -1.763785591e-05f, -1.218528431e-05f, +1.788160879e-06f, +2.457339501e-05f, +5.383112996e-05f, +8.421228209e-05f, +1.076887123e-04f, +1.146914900e-04f, +9.595555809e-05f, +4.476177412e-05f, -4.089451147e-05f, -1.567442859e-04f, -2.917686997e-04f, -4.290894893e-04f, -5.482256479e-04f, -6.283997270e-04f, -6.523042246e-04f, -6.095797688e-04f, -4.992594577e-04f, -3.306077033e-04f, -1.220953584e-04f, +1.013617240e-04f, +3.124036978e-04f, +4.857020300e-04f, +6.020404421e-04f, +6.512188202e-04f, +6.332524186e-04f, +5.577024609e-04f, +4.413620194e-04f, +3.048445460e-04f, +1.688114720e-04f, +5.059423580e-05f, -3.817902783e-05f, -9.260689457e-05f, -1.141584072e-04f, -1.091973731e-04f, -8.684812514e-05f, -5.673850988e-05f, -2.710182039e-05f, -3.564695732e-06f, +1.125797349e-05f, +1.744151023e-05f, +1.693294841e-05f, +1.253418557e-05f, +6.970009343e-06f,\n    +1.953541718e-04f, -1.331593225e-04f, -9.920900342e-04f, -2.370010154e-03f, -3.898838996e-03f, -4.822662833e-03f, -4.172658690e-03f, -1.152244245e-03f, +4.376046441e-03f, +1.150596567e-02f, +1.823182364e-02f, +2.186478645e-02f, +1.988725604e-02f, +1.100253371e-02f, -4.012368812e-03f, -2.205078438e-02f, -3.825202474e-02f, -4.734670964e-02f, -4.538948963e-02f, -3.128601199e-02f, -7.522515361e-03f, +2.025619720e-02f, +4.477536826e-02f, +5.930683738e-02f, +5.977064868e-02f, +4.603563193e-02f, +2.196148179e-02f, -5.832548160e-03f, -3.003893963e-02f, -4.485643903e-02f, -4.757640616e-02f, -3.907989553e-02f, -2.317323996e-02f, -5.094921155e-03f, +1.022286800e-02f, +1.953797348e-02f, +2.192731211e-02f, +1.857860921e-02f, +1.196402535e-02f, +4.790382190e-03f, -8.765835420e-04f, -4.059073884e-03f, -4.838257295e-03f, -3.983892664e-03f, -2.467164020e-03f, -1.064795075e-03f, -1.700210709e-04f, +1.872163386e-04f,\n    +3.565974415e-06f, +1.762692433e-05f, +3.554927965e-05f, +4.831390965e-05f, +4.339770006e-05f, +1.013695931e-05f, -5.322931859e-05f, -1.340289548e-04f, -2.047026160e-04f, -2.295692488e-04f, -1.779842931e-04f, -3.966619283e-05f, +1.642544006e-04f, +3.805853830e-04f, +5.366849801e-04f, +5.639459584e-04f, +4.245869572e-04f, +1.314413747e-04f, -2.482872132e-04f, -6.090482106e-04f, -8.389984984e-04f, -8.576004368e-04f, -6.451878390e-04f, -2.530497498e-04f, +2.106298584e-04f, +6.147231401e-04f, +8.472225364e-04f, +8.505406338e-04f, +6.377538201e-04f, +2.847166625e-04f, -9.808802026e-05f, -4.029781075e-04f, -5.581742720e-04f, -5.456051746e-04f, -3.989550309e-04f, -1.850495629e-04f, +2.272943417e-05f, +1.686269495e-04f, +2.283355473e-04f, +2.095395216e-04f, +1.416102850e-04f, +6.039017732e-05f, -5.396691400e-06f, -4.159841831e-05f, -4.880395116e-05f, -3.714525083e-05f, -1.924275306e-05f, -4.586827532e-06f,\n    /*  2,18 (48) */\n    +1.178893127e-04f, +4.104735791e-04f, +8.726146700e-04f, +1.434107668e-03f, +1.934567865e-03f, +2.132106022e-03f, +1.743512263e-03f, +5.152566717e-04f, -1.684836455e-03f, -4.774292714e-03f, -8.385779679e-03f, -1.184482760e-02f, -1.421381372e-02f, -1.440795170e-02f, -1.137264017e-02f, -4.294984422e-03f, +7.190216292e-03f, +2.284457612e-02f, +4.175995975e-02f, +6.240710511e-02f, +8.280237878e-02f, +1.007716434e-01f, +1.142686189e-01f, +1.216913882e-01f, +1.221383295e-01f, +1.155547185e-01f, +1.027416805e-01f, +8.522575252e-02f, +6.501428343e-02f, +4.428337642e-02f, +2.505651083e-02f, +8.931156742e-03f, -3.101761240e-03f, -1.072156576e-02f, -1.422503358e-02f, -1.437976359e-02f, -1.222201712e-02f, -8.843530939e-03f, -5.208098011e-03f, -2.026971333e-03f, +2.941194042e-04f, +1.640174622e-03f, +2.121417873e-03f, +1.981471443e-03f, +1.504279365e-03f, +9.397689376e-04f, +4.595924595e-04f, +1.447635633e-04f,\n    -6.302793544e-06f, -1.185252593e-05f, -1.653590257e-05f, -1.769047668e-05f, -1.247739601e-05f, +1.213593878e-06f, +2.374357475e-05f, +5.286436904e-05f, +8.332007332e-05f, +1.071532054e-04f, +1.148181517e-04f, +9.700741192e-05f, +4.688770998e-05f, -3.772105044e-05f, -1.527597348e-04f, -2.874143859e-04f, -4.249623105e-04f, -5.449892318e-04f, -6.266705210e-04f, -6.525340894e-04f, -6.119593288e-04f, -5.036637291e-04f, -3.365977016e-04f, -1.289780839e-04f, +9.442480972e-05f, +3.062600203e-04f, +4.810695220e-04f, +5.993942585e-04f, +6.507245079e-04f, +6.347568882e-04f, +5.607819037e-04f, +4.454143335e-04f, +3.092054717e-04f, +1.728702230e-04f, +5.388644247e-05f, -3.591658402e-05f, -9.142583506e-05f, -1.139288206e-04f, -1.096666292e-04f, -8.771220318e-05f, -5.770928988e-05f, -2.795721277e-05f, -4.174385444e-06f, +1.093174100e-05f, +1.736296222e-05f, +1.702296245e-05f, +1.270210001e-05f, +7.139181769e-06f,\n    +1.989201462e-04f, -1.155323981e-04f, -9.565407545e-04f, -2.321696244e-03f, -3.855441296e-03f, -4.812525874e-03f, -4.225888008e-03f, -1.286273200e-03f, +4.171343825e-03f, +1.127639642e-02f, +1.805383935e-02f, +2.182512026e-02f, +2.005151044e-02f, +1.138311909e-02f, -3.475683831e-03f, -2.148683842e-02f, -3.782743778e-02f, -4.721526827e-02f, -4.563777685e-02f, -3.189506020e-02f, -8.361513860e-03f, +1.939859676e-02f, +4.413018042e-02f, +5.905378763e-02f, +5.998127854e-02f, +4.665035507e-02f, +2.280870433e-02f, -4.982007526e-03f, -2.940118581e-02f, -4.457172237e-02f, -4.767449418e-02f, -3.948287364e-02f, -2.373141423e-02f, -5.640526330e-03f, +9.823912965e-03f, +1.935292392e-02f, +2.195004154e-02f, +1.874723616e-02f, +1.219236090e-02f, +4.999921712e-03f, -7.349732570e-04f, -3.998683707e-03f, -4.843653987e-03f, -4.025491083e-03f, -2.515967971e-03f, -1.101940326e-03f, -1.892638240e-04f, +1.826295111e-04f,\n    +3.240695165e-06f, +1.709657307e-05f, +3.500738196e-05f, +4.811523052e-05f, +4.394030475e-05f, +1.165598518e-05f, -5.087813966e-05f, -1.314821367e-04f, -2.029985807e-04f, -2.298267956e-04f, -1.809288428e-04f, -4.517973332e-05f, +1.573475604e-04f, +3.743408051e-04f, +5.334523797e-04f, +5.655352339e-04f, +4.314819906e-04f, +1.423872601e-04f, -2.361033579e-04f, -5.992146559e-04f, -8.347257851e-04f, -8.605971771e-04f, -6.549855683e-04f, -2.670513784e-04f, +1.963648945e-04f, +6.042201278e-04f, +8.433026921e-04f, +8.539573337e-04f, +6.470467794e-04f, +2.968070569e-04f, -8.680797206e-05f, -3.954717418e-04f, -5.559144026e-04f, -5.483134604e-04f, -4.049490240e-04f, -1.919991747e-04f, +1.695589485e-05f, +1.653338023e-04f, +2.277682708e-04f, +2.110563443e-04f, +1.441141591e-04f, +6.281070650e-05f, -3.756071670e-06f, -4.094073241e-05f, -4.893062236e-05f, -3.766612089e-05f, -1.978895051e-05f, -4.942034718e-06f,\n    /*  2,19 (48) */\n    +1.115865191e-04f, +3.986210532e-04f, +8.560787674e-04f, +1.416417191e-03f, +1.922090469e-03f, +2.133319616e-03f, +1.767255838e-03f, +5.681210407e-04f, -1.601516381e-03f, -4.667139508e-03f, -8.270961528e-03f, -1.174782019e-02f, -1.416692601e-02f, -1.444567275e-02f, -1.152539990e-02f, -4.582398808e-03f, +6.765253982e-03f, +2.229958689e-02f, +4.113328923e-02f, +6.175457102e-02f, +8.219041945e-02f, +1.002679797e-01f, +1.139320212e-01f, +1.215624102e-01f, +1.222327543e-01f, +1.158609786e-01f, +1.032227500e-01f, +8.582514678e-02f, +6.566500794e-02f, +4.491813331e-02f, +2.561729273e-02f, +9.376571075e-03f, -2.792555768e-03f, -1.054869554e-02f, -1.417114714e-02f, -1.441568017e-02f, -1.231344295e-02f, -8.957459759e-03f, -5.317764640e-03f, -2.114683536e-03f, +2.364101143e-04f, +1.612217409e-03f, +2.117243487e-03f, +1.992403184e-03f, +1.521642327e-03f, +9.567919001e-04f, +4.722945595e-04f, +1.519027451e-04f,\n    -6.138580599e-06f, -1.167998123e-05f, -1.642784518e-05f, -1.773682123e-05f, -1.276108460e-05f, +6.478759438e-07f, +2.292044324e-05f, +5.189914050e-05f, +8.242153441e-05f, +1.066018947e-04f, +1.149197331e-04f, +9.802732920e-05f, +4.897944593e-05f, -3.457787058e-05f, -1.487948357e-04f, -2.830632097e-04f, -4.208180602e-04f, -5.417150934e-04f, -6.248862372e-04f, -6.526982959e-04f, -6.142719023e-04f, -5.080098345e-04f, -3.425475498e-04f, -1.358451806e-04f, +8.747644082e-05f, +3.000796842e-04f, +4.763811065e-04f, +5.966817999e-04f, +6.501636765e-04f, +6.362041019e-04f, +5.638205997e-04f, +4.494462858e-04f, +3.135665484e-04f, +1.769463931e-04f, +5.720770752e-05f, -3.362011720e-05f, -9.021213267e-05f, -1.136728644e-04f, -1.101185653e-04f, -8.856853840e-05f, -5.868053377e-05f, -2.881868748e-05f, -4.792774367e-06f, +1.059688009e-05f, +1.727773059e-05f, +1.710909637e-05f, +1.286886331e-05f, +7.309209040e-06f,\n    +2.021608414e-04f, -9.843582508e-05f, -9.215333726e-04f, -2.273581014e-03f, -3.811500991e-03f, -4.800869888e-03f, -4.276766148e-03f, -1.417755337e-03f, +3.968345245e-03f, +1.104656963e-02f, +1.787291050e-02f, +2.177994052e-02f, +2.020885800e-02f, +1.175745989e-02f, -2.942231452e-03f, -2.092130319e-02f, -3.739595579e-02f, -4.707288101e-02f, -4.587388020e-02f, -3.249427486e-02f, -9.196239645e-03f, +1.853799958e-02f, +4.347519485e-02f, +5.878673626e-02f, +6.017764343e-02f, +4.725457520e-02f, +2.365200702e-02f, -4.128050193e-03f, -2.875413903e-02f, -4.427491531e-02f, -4.776130215e-02f, -3.987834538e-02f, -2.428732863e-02f, -6.188839790e-03f, +9.418963941e-03f, +1.916092474e-02f, +2.196699744e-02f, +1.891256997e-02f, +1.242012917e-02f, +5.210978056e-03f, -5.908590979e-04f, -3.935873000e-03f, -4.847410058e-03f, -4.066431815e-03f, -2.564898594e-03f, -1.139606446e-03f, -2.090527745e-04f, +1.776874763e-04f,\n    +2.922947826e-06f, +1.657067159e-05f, +3.446112759e-05f, +4.789956147e-05f, +4.445473845e-05f, +1.314424960e-05f, -4.854590819e-05f, -1.289272071e-04f, -2.012505635e-04f, -2.300087278e-04f, -1.837859237e-04f, -5.062528636e-05f, +1.504566055e-04f, +3.680394865e-04f, +5.300932113e-04f, +5.669580047e-04f, +4.382209531e-04f, +1.532424745e-04f, -2.239051597e-04f, -5.892539518e-04f, -8.302432309e-04f, -8.633618090e-04f, -6.646003260e-04f, -2.809772275e-04f, +1.820441491e-04f, +5.935477276e-04f, +8.391537625e-04f, +8.571561795e-04f, +6.561967548e-04f, +3.088650378e-04f, -7.545170401e-05f, -3.878160556e-04f, -5.534859988e-04f, -5.508863156e-04f, -4.108744881e-04f, -1.989541894e-04f, +1.112050636e-05f, +1.619539854e-04f, +2.271218480e-04f, +2.125235683e-04f, +1.466046309e-04f, +6.524688689e-05f, -2.085490399e-06f, -4.025372215e-05f, -4.903828840e-05f, -3.818081515e-05f, -2.033859211e-05f, -5.304650110e-06f,\n    /*  2,20 (48) */\n    +1.054479385e-04f, +3.869410720e-04f, +8.396509222e-04f, +1.398680370e-03f, +1.909329384e-03f, +2.133967492e-03f, +1.790176281e-03f, +6.200201812e-04f, -1.519094847e-03f, -4.560537614e-03f, -8.156041794e-03f, -1.164979286e-02f, -1.411794657e-02f, -1.448025062e-02f, -1.167419474e-02f, -4.865462017e-03f, +6.344435922e-03f, +2.175787180e-02f, +4.050840299e-02f, +6.110187273e-02f, +8.157614755e-02f, +9.975996985e-02f, +1.135894736e-01f, +1.214265650e-01f, +1.223202308e-01f, +1.161610583e-01f, +1.036991311e-01f, +8.642182858e-02f, +6.631517162e-02f, +4.555433741e-02f, +2.618111333e-02f, +9.826017361e-03f, -2.478989220e-03f, -1.037174914e-02f, -1.411393943e-02f, -1.444930029e-02f, -1.240365508e-02f, -9.071132624e-03f, -5.427883205e-03f, -2.203252074e-03f, +1.777295806e-04f, +1.583398721e-03f, +2.112450713e-03f, +2.003000064e-03f, +1.538920057e-03f, +9.739009964e-04f, +4.851634228e-04f, +1.592119541e-04f,\n    -5.975489525e-06f, -1.150673014e-05f, -1.631644935e-05f, -1.777697317e-05f, -1.303639635e-05f, +9.102927193e-08f, +2.210411281e-05f, +5.093564998e-05f, +8.151694320e-05f, +1.060350840e-04f, +1.149964995e-04f, +9.901546503e-05f, +5.103696510e-05f, -3.146519645e-05f, -1.448500178e-04f, -2.787157577e-04f, -4.166573956e-04f, -5.384038478e-04f, -6.230473317e-04f, -6.527970441e-04f, -6.165173774e-04f, -5.122973493e-04f, -3.484565686e-04f, -1.426958208e-04f, +8.051745830e-05f, +2.938634059e-04f, +4.716372619e-04f, +5.939032386e-04f, +6.495361818e-04f, +6.375936455e-04f, +5.668179551e-04f, +4.534572180e-04f, +3.179271685e-04f, +1.810395187e-04f, +6.055776647e-05f, -3.128968150e-05f, -8.896566043e-05f, -1.133902888e-04f, -1.105528795e-04f, -8.941684389e-05f, -5.965201997e-05f, -2.968611429e-05f, -5.419824611e-06f, +1.025335508e-05f, +1.718573622e-05f, +1.719125943e-05f, +1.303439868e-05f, +7.480043122e-06f,\n    +2.050837892e-04f, -8.186515349e-05f, -8.870722450e-04f, -2.225681452e-03f, -3.767046253e-03f, -4.787725639e-03f, -4.325312056e-03f, -1.546682544e-03f, +3.767094681e-03f, +1.081656090e-02f, +1.768912458e-02f, +2.172931524e-02f, +2.035931460e-02f, +1.212549938e-02f, -2.412138240e-03f, -2.035434518e-02f, -3.695773484e-02f, -4.691963853e-02f, -4.609778536e-02f, -3.308352881e-02f, -1.002648288e-02f, +1.767463777e-02f, +4.281059452e-02f, +5.850575903e-02f, +6.035968758e-02f, +4.784812293e-02f, +2.449116078e-02f, -3.270894013e-03f, -2.809794228e-02f, -4.396605027e-02f, -4.783675385e-02f, -4.026616143e-02f, -2.484081463e-02f, -6.739726106e-03f, +9.008089453e-03f, +1.896197055e-02f, +2.197811794e-02f, +1.907452395e-02f, +1.264725102e-02f, +5.423501625e-03f, -4.442544670e-04f, -3.870626113e-03f, -4.849495549e-03f, -4.106685537e-03f, -2.613936882e-03f, -1.177787262e-03f, -2.293913666e-04f, +1.723828262e-04f,\n    +2.612743069e-06f, +1.604940348e-05f, +3.391086871e-05f, +4.766731014e-05f, +4.494125820e-05f, +1.460163653e-05f, -4.623323722e-05f, -1.263651979e-04f, -1.994597013e-04f, -2.301158125e-04f, -1.865554712e-04f, -5.600172260e-05f, +1.435835716e-04f, +3.616837955e-04f, +5.266093397e-04f, +5.682148300e-04f, +4.448026599e-04f, +1.640042448e-04f, -2.116962129e-04f, -5.791693600e-04f, -8.255526230e-04f, -8.658939429e-04f, -6.740295675e-04f, -2.948233659e-04f, +1.676716814e-04f, +5.827088224e-04f, +8.347765667e-04f, +8.601357579e-04f, +6.652006819e-04f, +3.208869794e-04f, -6.402221775e-05f, -3.800125628e-04f, -5.508888108e-04f, -5.533220657e-04f, -4.167290819e-04f, -2.059124541e-04f, +5.224593305e-06f, +1.584877552e-04f, +2.263956365e-04f, +2.139400871e-04f, +1.490806182e-04f, +6.769801371e-05f, -3.851523159e-07f, -3.953718479e-05f, -4.912655230e-05f, -3.868895900e-05f, -2.089145928e-05f, -5.674634421e-06f,\n    /*  2,21 (48) */\n    +9.947244900e-05f, +3.754343418e-04f, +8.233344729e-04f, +1.380903397e-03f, +1.896292988e-03f, +2.134058521e-03f, +1.812280394e-03f, +6.709558312e-04f, -1.437577904e-03f, -4.454502530e-03f, -8.041045295e-03f, -1.155077740e-02f, -1.406690960e-02f, -1.451171581e-02f, -1.181904476e-02f, -5.144177775e-03f, +5.927778526e-03f, +2.121946795e-02f, +3.988535566e-02f, +6.044907568e-02f, +8.095963017e-02f, +9.924767250e-02f, +1.132410171e-01f, +1.212838692e-01f, +1.224007482e-01f, +1.164549217e-01f, +1.041707684e-01f, +8.701573182e-02f, +6.696470780e-02f, +4.619193106e-02f, +2.674793129e-02f, +1.027947458e-02f, -2.161062051e-03f, -1.019070962e-02f, -1.405338166e-02f, -1.448058997e-02f, -1.249262075e-02f, -9.184522912e-03f, -5.538436085e-03f, -2.292668918e-03f, +1.180775606e-04f, +1.553712607e-03f, +2.107030888e-03f, +2.013253419e-03f, +1.556105794e-03f, +9.910922559e-04f, +4.981978215e-04f, +1.666919973e-04f,\n    -5.813561281e-06f, -1.133284398e-05f, -1.620180464e-05f, -1.781101677e-05f, -1.330337920e-05f, -4.569264820e-07f, +2.129469280e-05f, +4.997410040e-05f, +8.060657581e-05f, +1.054530775e-04f, +1.150487184e-04f, +9.997197899e-05f, +5.306025672e-05f, -2.838324597e-05f, -1.409257044e-04f, -2.743726128e-04f, -4.124809731e-04f, -5.350561130e-04f, -6.211542671e-04f, -6.528305431e-04f, -6.186956518e-04f, -5.165258583e-04f, -3.543240851e-04f, -1.495291793e-04f, +7.354870489e-05f, +2.876119077e-04f, +4.668384753e-04f, +5.910587572e-04f, +6.488418893e-04f, +6.389251117e-04f, +5.697733800e-04f, +4.574464721e-04f, +3.222867216e-04f, +1.851491307e-04f, +6.393634822e-05f, -2.892533735e-05f, -8.768629623e-05f, -1.130808466e-04f, -1.109692702e-04f, -9.025683137e-05f, -6.062352435e-05f, -3.055935993e-05f, -6.055495601e-06f, +9.901132222e-06f, +1.708690087e-05f, +1.726936079e-05f, +1.319862861e-05f, +7.651634979e-06f,\n    +2.076965323e-04f, -6.581575001e-05f, -8.531613762e-04f, -2.178014142e-03f, -3.722104995e-03f, -4.773124002e-03f, -4.371545293e-03f, -1.673047742e-03f, +3.567634980e-03f, +1.058644509e-02f, +1.750256911e-02f, +2.167331351e-02f, +2.050289818e-02f, +1.248718318e-02f, -1.885528901e-03f, -1.978613035e-02f, -3.651293218e-02f, -4.675563429e-02f, -4.630948158e-02f, -3.366269817e-02f, -1.085203550e-02f, +1.680874383e-02f, +4.213656496e-02f, +5.821093566e-02f, +6.052735927e-02f, +4.843083175e-02f, +2.532593735e-02f, -2.410758255e-03f, -2.743274159e-02f, -4.364516329e-02f, -4.790077607e-02f, -4.064617400e-02f, -2.539170344e-02f, -7.293048172e-03f, +8.591360371e-03f, +1.875605810e-02f, +2.198334254e-02f, +1.923301171e-02f, +1.287364666e-02f, +5.637441712e-03f, -2.951738487e-04f, -3.802928100e-03f, -4.849880701e-03f, -4.146222722e-03f, -2.663063435e-03f, -1.216476221e-03f, -2.502828259e-04f, +1.667081918e-04f,\n    +2.310087044e-06f, +1.553294649e-05f, +3.335695340e-05f, +4.741888520e-05f, +4.540012932e-05f, +1.602804428e-05f, -4.394072422e-05f, -1.237971315e-04f, -1.976271346e-04f, -2.301488361e-04f, -1.892374520e-04f, -6.130794585e-05f, +1.367304729e-04f, +3.552761018e-04f, +5.230026589e-04f, +5.693063191e-04f, +4.512259819e-04f, +1.746698386e-04f, -1.994801026e-04f, -5.689641709e-04f, -8.206558088e-04f, -8.681932613e-04f, -6.832708074e-04f, -3.085858884e-04f, +1.532515671e-04f, +5.717063486e-04f, +8.301719951e-04f, +8.628947198e-04f, +6.740555333e-04f, +3.328692552e-04f, -5.252255007e-05f, -3.720628316e-04f, -5.481226416e-04f, -5.556190707e-04f, -4.225104719e-04f, -2.128717986e-04f, -7.304878903e-07f, +1.549354012e-04f, +2.255890162e-04f, +2.153048015e-04f, +1.515410319e-04f, +7.016336728e-05f, +1.344722690e-06f, -3.879092743e-05f, -4.919501962e-05f, -3.919017456e-05f, -2.144732766e-05f, -6.051943364e-06f,\n    /*  2,22 (48) */\n    +9.365888772e-05f, +3.641014979e-04f, +8.071326683e-04f, +1.363092380e-03f, +1.882989609e-03f, +2.133601595e-03f, +1.833575087e-03f, +7.209299316e-04f, -1.356971328e-03f, -4.349049452e-03f, -7.925996577e-03f, -1.145080542e-02f, -1.401384935e-02f, -1.454009906e-02f, -1.195997046e-02f, -5.418550388e-03f, +5.515297553e-03f, +2.068441184e-02f, +3.926420140e-02f, +5.979624514e-02f, +8.034093452e-02f, +9.873114664e-02f, +1.128866930e-01f, +1.211343400e-01f, +1.224742969e-01f, +1.167425336e-01f, +1.046376069e-01f, +8.760679058e-02f, +6.761354969e-02f, +4.683085617e-02f, +2.731770467e-02f, +1.073692105e-02f, -1.838775330e-03f, -1.000556049e-02f, -1.398944532e-02f, -1.450951531e-02f, -1.258030704e-02f, -9.297603759e-03f, -5.649405355e-03f, -2.382925750e-03f, +5.745403624e-05f, +1.523153247e-03f, +2.100975393e-03f, +2.023154551e-03f, +1.573192694e-03f, +1.008361617e-03f, +5.113964501e-04f, +1.743436322e-04f,\n    -5.652835814e-06f, -1.115839327e-05f, -1.608400036e-05f, -1.783903691e-05f, -1.356208269e-05f, -9.959741817e-07f, +2.049228958e-05f, +4.901469194e-05f, +7.969070668e-05f, +1.048561792e-04f, +1.150766596e-04f, +1.008970351e-04f, +5.504931606e-05f, -2.533223037e-05f, -1.370223128e-04f, -2.700343538e-04f, -4.082894485e-04f, -5.316725104e-04f, -6.192075126e-04f, -6.527990109e-04f, -6.208066337e-04f, -5.206949552e-04f, -3.601494334e-04f, -1.563444340e-04f, +6.657102488e-05f, +2.813259176e-04f, +4.619852426e-04f, +5.881485482e-04f, +6.480806737e-04f, +6.401981006e-04f, +5.726862885e-04f, +4.614133903e-04f, +3.266445939e-04f, +1.892747545e-04f, +6.734317504e-05f, -2.652715154e-05f, -8.637392289e-05f, -1.127442933e-04f, -1.113674365e-04f, -9.108821130e-05f, -6.159482021e-05f, -3.143828816e-05f, -6.699744060e-06f, +9.540179638e-06f, +1.698114718e-05f, +1.734330956e-05f, +1.336147488e-05f, +7.823934576e-06f,\n    +2.100066193e-04f, -5.028280352e-05f, -8.198044229e-04f, -2.130595257e-03f, -3.676704865e-03f, -4.757095958e-03f, -4.415486017e-03f, -1.796844873e-03f, +3.370007845e-03f, +1.035629625e-02f, +1.731333166e-02f, +2.161200557e-02f, +2.063962865e-02f, +1.284245928e-02f, -1.362526242e-03f, -1.921682403e-02f, -3.606170620e-02f, -4.658096445e-02f, -4.650896168e-02f, -3.423166234e-02f, -1.167269131e-02f, +1.594055057e-02f, +4.145329415e-02f, +5.790234977e-02f, +6.068061083e-02f, +4.900253810e-02f, +2.615610935e-02f, -1.547863536e-03f, -2.675868606e-02f, -4.331229404e-02f, -4.795329862e-02f, -4.101823683e-02f, -2.593982609e-02f, -7.848667242e-03f, +8.168849899e-03f, +1.854318630e-02f, +2.198261205e-02f, +1.938794711e-02f, +1.309923567e-02f, +5.852746513e-03f, -1.436328168e-04f, -3.732764732e-03f, -4.848535978e-03f, -4.185013649e-03f, -2.712258454e-03f, -1.255666395e-03f, -2.717301535e-04f, +1.606562484e-04f,\n    +2.014981454e-06f, +1.502147253e-05f, +3.279972542e-05f, +4.715469618e-05f, +4.583162515e-05f, +1.742338539e-05f, -4.166895100e-05f, -1.212240206e-04f, -1.957540069e-04f, -2.301086035e-04f, -1.918318640e-04f, -6.654289323e-05f, +1.298993015e-04f, +3.488187759e-04f, +5.192750907e-04f, +5.702331310e-04f, +4.574898456e-04f, +1.852365655e-04f, -1.872604035e-04f, -5.586417028e-04f, -8.155546947e-04f, -8.702595184e-04f, -6.923216202e-04f, -3.222609165e-04f, +1.387878976e-04f, +5.605432950e-04f, +8.253410091e-04f, +8.654317815e-04f, +6.827583192e-04f, +3.448082387e-04f, -4.095577201e-05f, -3.639684837e-04f, -5.451873476e-04f, -5.577757256e-04f, -4.282163328e-04f, -2.198300360e-04f, -6.743349257e-06f, +1.512972455e-04f, +2.247013900e-04f, +2.166166192e-04f, +1.539847759e-04f, +7.264221312e-05f, +3.103899478e-06f, -3.801476720e-05f, -4.924329868e-05f, -3.968408078e-05f, -2.200596715e-05f, -6.436527589e-06f,\n    /*  2,23 (48) */\n    +8.800605191e-05f, +3.529431046e-04f, +7.910486679e-04f, +1.345253343e-03f, +1.869427526e-03f, +2.132605620e-03f, +1.854067377e-03f, +7.699446236e-04f, -1.277280621e-03f, -4.244193273e-03f, -7.810919917e-03f, -1.134990838e-02f, -1.395880003e-02f, -1.456543129e-02f, -1.209699277e-02f, -5.688584742e-03f, +5.107008105e-03f, +2.015273933e-02f, +3.864499388e-02f, +5.914344613e-02f, +7.972012788e-02f, +9.821045169e-02f, +1.125265436e-01f, +1.209779955e-01f, +1.225408679e-01f, +1.170238595e-01f, +1.050995921e-01f, +8.819493912e-02f, +6.826163036e-02f, +4.747105427e-02f, +2.789039096e-02f, +1.119833444e-02f, -1.512130736e-03f, -9.816285739e-03f, -1.392210214e-02f, -1.453604246e-02f, -1.266668096e-02f, -9.410348052e-03f, -5.760772791e-03f, -2.474013961e-03f, -4.140783970e-06f, +1.491714959e-03f, +2.094275649e-03f, +2.032694731e-03f, +1.590173842e-03f, +1.025704926e-03f, +5.247579250e-04f, +1.821675668e-04f,\n    -5.493352053e-06f, -1.098344767e-05f, -1.596312552e-05f, -1.786111905e-05f, -1.381255800e-05f, -1.526099187e-06f, +1.969700654e-05f, +4.805762199e-05f, +7.876960845e-05f, +1.042446931e-04f, +1.150805950e-04f, +1.017908016e-04f, +5.700414440e-05f, -2.231235421e-05f, -1.331402544e-04f, -2.657015558e-04f, -4.040834770e-04f, -5.282536639e-04f, -6.172075439e-04f, -6.527026745e-04f, -6.228502412e-04f, -5.248042432e-04f, -3.659319540e-04f, -1.631407655e-04f, +5.958526404e-05f, +2.750061691e-04f, +4.570780681e-04f, +5.851728139e-04f, +6.472524196e-04f, +6.414122198e-04f, +5.755560987e-04f, +4.653573154e-04f, +3.310001687e-04f, +1.934159098e-04f, +7.077796261e-05f, -2.409519724e-05f, -8.502842828e-05f, -1.123803877e-04f, -1.117470784e-04f, -9.191069286e-05f, -6.256567834e-05f, -3.232275977e-05f, -7.352523987e-06f, +9.170467399e-06f, +1.686839873e-05f, +1.741301485e-05f, +1.352285859e-05f, +7.996890882e-06f,\n    +2.120216008e-04f, -3.526133099e-05f, -7.870046974e-04f, -2.083440561e-03f, -3.630873240e-03f, -4.739672573e-03f, -4.457154968e-03f, -1.918068894e-03f, +3.174253838e-03f, +1.012618765e-02f, +1.712149979e-02f, +2.154546268e-02f, +2.076952795e-02f, +1.319127805e-02f, -8.432511510e-04f, -1.864659090e-02f, -3.560421635e-02f, -4.639572788e-02f, -4.669622208e-02f, -3.479030404e-02f, -1.248824600e-02f, +1.507029105e-02f, +4.076097253e-02f, +5.758008886e-02f, +6.081939873e-02f, +4.956308140e-02f, +2.698145035e-02f, -6.824317540e-04f, -2.607592774e-02f, -4.296748580e-02f, -4.799425439e-02f, -4.138220531e-02f, -2.648501343e-02f, -8.406442968e-03f, +7.740633566e-03f, +1.832335626e-02f, +2.197586870e-02f, +1.953924435e-02f, +1.332393706e-02f, +6.069363132e-03f, +1.035195909e-05f, -3.660122519e-03f, -4.845432079e-03f, -4.223028416e-03f, -2.761501753e-03f, -1.295350476e-03f, -2.937361207e-04f, +1.542197209e-04f,\n    +1.727423627e-06f, +1.451514763e-05f, +3.223952423e-05f, +4.687515319e-05f, +4.623602683e-05f, +1.878758649e-05f, -3.941848368e-05f, -1.186468676e-04f, -1.938414640e-04f, -2.299959380e-04f, -1.943387355e-04f, -7.170553526e-05f, +1.230920268e-04f, +3.423141883e-04f, +5.154285844e-04f, +5.709959738e-04f, +4.635932335e-04f, +1.957017770e-04f, -1.750406785e-04f, -5.482053006e-04f, -8.102512456e-04f, -8.720925403e-04f, -7.011796411e-04f, -3.358446005e-04f, +1.242847781e-04f, +5.492227019e-04f, +8.202846407e-04f, +8.677457248e-04f, +6.913060890e-04f, +3.567003045e-04f, -2.932498800e-05f, -3.557311946e-04f, -5.420828385e-04f, -5.597904616e-04f, -4.338443485e-04f, -2.267849633e-04f, -1.281257153e-05f, +1.475736432e-04f, +2.237321840e-04f, +2.178744558e-04f, +1.564107476e-04f, +7.513380208e-05f, +4.892127566e-06f, -3.720853147e-05f, -4.927100079e-05f, -4.017029362e-05f, -2.256714189e-05f, -6.828332627e-06f,\n    /*  2,24 (48) */\n    +8.251269985e-05f, +3.419596569e-04f, +7.750855424e-04f, +1.327392224e-03f, +1.855614968e-03f, +2.131079521e-03f, +1.873764383e-03f, +8.180022455e-04f, -1.198511013e-03f, -4.139948580e-03f, -7.695839322e-03f, -1.124811758e-02f, -1.390179589e-02f, -1.458774364e-02f, -1.223013303e-02f, -5.954286298e-03f, +4.702924628e-03f, +1.962448566e-02f, +3.802778634e-02f, +5.849074345e-02f, +7.909727764e-02f, +9.768564744e-02f, +1.121606116e-01f, +1.208148548e-01f, +1.226004532e-01f, +1.172988657e-01f, +1.055566702e-01f, +8.878011194e-02f, +6.890888278e-02f, +4.811246649e-02f, +2.846594706e-02f, +1.166369176e-02f, -1.181130567e-03f, -9.622869830e-03f, -1.385132418e-02f, -1.456013766e-02f, -1.275170939e-02f, -9.522728440e-03f, -5.872519870e-03f, -2.565924654e-03f, -6.670646231e-05f, +1.459392199e-03f, +2.086923125e-03f, +2.041865198e-03f, +1.607042240e-03f, +1.043117941e-03f, +5.382807835e-04f, +1.901644577e-04f,\n    -5.335147914e-06f, -1.080807602e-05f, -1.583926880e-05f, -1.787734921e-05f, -1.405485785e-05f, -2.047289331e-06f, +1.890894410e-05f, +4.710308517e-05f, +7.784355196e-05f, +1.036189232e-04f, +1.150607986e-04f, +1.026534512e-04f, +5.892474902e-05f, -1.932381540e-05f, -1.292799344e-04f, -2.613747898e-04f, -3.998637126e-04f, -5.248002005e-04f, -6.151548427e-04f, -6.525417699e-04f, -6.248264024e-04f, -5.288533349e-04f, -3.716709945e-04f, -1.699173576e-04f, +5.259226943e-05f, +2.686534011e-04f, +4.521174649e-04f, +5.821317669e-04f, +6.463570208e-04f, +6.425670845e-04f, +5.783822332e-04f, +4.692775907e-04f, +3.353528265e-04f, +1.975721113e-04f, +7.424042003e-05f, -2.162955402e-05f, -8.364970531e-05f, -1.119888913e-04f, -1.121078964e-04f, -9.272398405e-05f, -6.353586705e-05f, -3.321263254e-05f, -8.013786642e-06f, +8.791967543e-06f, +1.674858004e-05f, +1.747838576e-05f, +1.368270014e-05f, +8.170451874e-06f,\n    +2.137490244e-04f, -2.074618336e-05f, -7.547651732e-04f, -2.036565407e-03f, -3.584637213e-03f, -4.720884986e-03f, -4.496573452e-03f, -2.036715762e-03f, +2.980412374e-03f, +9.896191711e-03f, +1.692716106e-02f, +2.147375714e-02f, +2.089261998e-02f, +1.353359224e-02f, -3.278225666e-04f, -1.807559493e-02f, -3.514062312e-02f, -4.620002611e-02f, -4.687126276e-02f, -3.533850934e-02f, -1.329849725e-02f, +1.419819851e-02f, +4.005979289e-02f, +5.724424426e-02f, +6.094368351e-02f, +5.011230410e-02f, +2.780173499e-02f, +1.853139707e-04f, -2.538462165e-02f, -4.261078550e-02f, -4.802357938e-02f, -4.173793651e-02f, -2.702709627e-02f, -8.966233429e-03f, +7.306789218e-03f, +1.809657130e-02f, +2.196305613e-02f, +1.968681800e-02f, +1.354766925e-02f, +6.287237588e-03f, +1.667627067e-04f, -3.584988717e-03f, -4.840539951e-03f, -4.260236948e-03f, -2.810772754e-03f, -1.335520770e-03f, -3.163032626e-04f, +1.473913882e-04f,\n    +1.447406595e-06f, +1.401413201e-05f, +3.167668481e-05f, +4.658066683e-05f, +4.661362310e-05f, +2.012058813e-05f, -3.718987259e-05f, -1.160666647e-04f, -1.918906538e-04f, -2.298116804e-04f, -1.967581254e-04f, -7.679487601e-05f, +1.163105947e-04f, +3.357647084e-04f, +5.114651158e-04f, +5.715956042e-04f, +4.695351836e-04f, +2.060628682e-04f, -1.628244780e-04f, -5.376583343e-04f, -8.047474842e-04f, -8.736922246e-04f, -7.098425667e-04f, -3.493331199e-04f, +1.097463270e-04f, +5.377476602e-04f, +8.150039925e-04f, +8.698353975e-04f, +6.996959320e-04f, +3.685418302e-04f, -1.763333493e-05f, -3.473526926e-04f, -5.388090779e-04f, -5.616617465e-04f, -4.393922133e-04f, -2.337343623e-04f, -1.893670441e-05f, +1.437649828e-04f, +2.226808477e-04f, +2.190772355e-04f, +1.588178385e-04f, +7.763737051e-05f, +6.709141053e-06f, -3.637205811e-05f, -4.927774042e-05f, -4.064842614e-05f, -2.313061035e-05f, -7.227298826e-06f,\n    /*  2,25 (48) */\n    +7.717755194e-05f, +3.311515809e-04f, +7.592462736e-04f, +1.309514875e-03f, +1.841560110e-03f, +2.129032232e-03f, +1.892673327e-03f, +8.651053307e-04f, -1.120667461e-03f, -4.036329657e-03f, -7.580778523e-03f, -1.114546413e-02f, -1.384287114e-02f, -1.460706746e-02f, -1.235941296e-02f, -6.215661087e-03f, +4.303060915e-03f, +1.909968546e-02f, +3.741263150e-02f, +5.783820168e-02f, +7.847245124e-02f, +9.715679411e-02f, +1.117889406e-01f, +1.206449374e-01f, +1.226530455e-01f, +1.175675191e-01f, +1.060087877e-01f, +8.936224371e-02f, +6.955523980e-02f, +4.875503357e-02f, +2.904432929e-02f, +1.213296935e-02f, -8.457777408e-04f, -9.425297718e-03f, -1.377708376e-02f, -1.458176721e-02f, -1.283535910e-02f, -9.634717331e-03f, -5.984627766e-03f, -2.658648638e-03f, -1.302423294e-04f, +1.426179567e-03f, +2.078909338e-03f, +2.050657166e-03f, +1.623790820e-03f, +1.060596327e-03f, +5.519634837e-04f, +1.983349096e-04f,\n    -5.178260298e-06f, -1.063234626e-05f, -1.571251857e-05f, -1.788781391e-05f, -1.428903649e-05f, -2.559534897e-06f, +1.812819973e-05f, +4.615127328e-05f, +7.691280619e-05f, +1.029791733e-04f, +1.150175463e-04f, +1.034851606e-04f, +6.081114311e-05f, -1.636680517e-05f, -1.254417521e-04f, -2.570546224e-04f, -3.956308083e-04f, -5.213127495e-04f, -6.130498973e-04f, -6.523165421e-04f, -6.267350554e-04f, -5.328418520e-04f, -3.773659094e-04f, -1.766733973e-04f, +4.559288931e-05f, +2.622683581e-04f, +4.471039543e-04f, +5.790256297e-04f, +6.453943812e-04f, +6.436623173e-04f, +5.811641189e-04f, +4.731735600e-04f, +3.397019451e-04f, +2.017428681e-04f, +7.773024984e-05f, -1.913030786e-05f, -8.223765199e-05f, -1.115695688e-04f, -1.124495919e-04f, -9.352779174e-05f, -6.450515218e-05f, -3.410776128e-05f, -8.683480529e-06f, +8.404654100e-06f, +1.662161663e-05f, +1.753933143e-05f, +1.384091928e-05f, +8.344564540e-06f,\n    +2.151964310e-04f, -6.732051356e-06f, -7.230884884e-04f, -1.989984741e-03f, -3.538023590e-03f, -4.700764398e-03f, -4.533763325e-03f, -2.152782426e-03f, +2.788521720e-03f, +9.666380030e-03f, +1.673040293e-02f, +2.139696226e-02f, +2.100893057e-02f, +1.386935695e-02f, +1.836425491e-04f, -1.750399933e-02f, -3.467108794e-02f, -4.599396324e-02f, -4.703408724e-02f, -3.587616768e-02f, -1.410324473e-02f, +1.332450628e-02f, +3.934995032e-02f, +5.689491114e-02f, +6.105342983e-02f, +5.065005176e-02f, +2.861673899e-02f, +1.055149368e-03f, -2.468492572e-02f, -4.224224367e-02f, -4.804121272e-02f, -4.208528920e-02f, -2.756590535e-02f, -9.527895176e-03f, +6.867397005e-03f, +1.786283694e-02f, +2.194411942e-02f, +1.983058298e-02f, +1.377035010e-02f, +6.506314824e-03f, +3.255805452e-04f, -3.507351347e-03f, -4.833830810e-03f, -4.296609006e-03f, -2.860050494e-03f, -1.376169196e-03f, -3.394338729e-04f, +1.401640894e-04f,\n    +1.174919173e-06f, +1.351858005e-05f, +3.111153756e-05f, +4.627164787e-05f, +4.696471002e-05f, +2.142234465e-05f, -3.498365227e-05f, -1.134843933e-04f, -1.899027257e-04f, -2.295566890e-04f, -1.990901227e-04f, -8.180995317e-05f, +1.095569277e-04f, +3.291727038e-04f, +5.073866860e-04f, +5.720328272e-04f, +4.753147901e-04f, +2.163172775e-04f, -1.506153382e-04f, -5.270041986e-04f, -7.990454901e-04f, -8.750585407e-04f, -7.183081557e-04f, -3.627226851e-04f, +9.517667379e-05f, +5.261213105e-04f, +8.095002376e-04f, +8.716997142e-04f, +7.079249784e-04f, +3.803291967e-04f, -5.883981206e-06f, -3.388347590e-04f, -5.353660836e-04f, -5.633880856e-04f, -4.448576322e-04f, -2.406760000e-04f, -2.511426691e-05f, +1.398716859e-04f, +2.215468551e-04f, +2.202238910e-04f, +1.612049344e-04f, +8.015214039e-05f, +8.554658539e-06f, -3.550519564e-05f, -4.926313550e-05f, -4.111808869e-05f, -2.369612532e-05f, -7.633361304e-06f,\n    /*  2,26 (48) */\n    +7.199929164e-05f, +3.205192346e-04f, +7.435337550e-04f, +1.291627061e-03f, +1.827271074e-03f, +2.126472697e-03f, +1.910801527e-03f, +9.112566040e-04f, -1.043754655e-03f, -3.933350484e-03f, -7.465760977e-03f, -1.104197897e-02f, -1.378205999e-02f, -1.462343426e-02f, -1.248485472e-02f, -6.472715710e-03f, +3.907430107e-03f, +1.857837271e-02f, +3.679958160e-02f, +5.718588514e-02f, +7.784571619e-02f, +9.662395226e-02f, +1.114115747e-01f, +1.204682640e-01f, +1.226986384e-01f, +1.178297874e-01f, +1.064558916e-01f, +8.994126933e-02f, +7.020063419e-02f, +4.939869589e-02f, +2.962549341e-02f, +1.260614291e-02f, -5.060757957e-04f, -9.223554850e-03f, -1.369935351e-02f, -1.460089752e-02f, -1.291759675e-02f, -9.746286900e-03f, -6.097077358e-03f, -2.752176430e-03f, -1.947474815e-04f, +1.392071805e-03f, +2.070225857e-03f, +2.059061820e-03f, +1.640412437e-03f, +1.078135658e-03f, +5.658044030e-04f, +2.066794741e-04f,\n    -5.022725094e-06f, -1.045632548e-05f, -1.558296283e-05f, -1.789260018e-05f, -1.451514970e-05f, -3.062828592e-06f, +1.735486795e-05f, +4.520237532e-05f, +7.597763824e-05f, +1.023257469e-04f, +1.149511162e-04f, +1.042861110e-04f, +6.266334577e-05f, -1.344150808e-05f, -1.216261004e-04f, -2.527416165e-04f, -3.913854162e-04f, -5.177919432e-04f, -6.108932017e-04f, -6.520272446e-04f, -6.285761486e-04f, -5.367694260e-04f, -3.830160601e-04f, -1.834080748e-04f, +3.858797298e-05f, +2.558517894e-04f, +4.420380662e-04f, +5.758546346e-04f, +6.443644139e-04f, +6.446975487e-04f, +5.839011872e-04f, +4.770445681e-04f, +3.440468994e-04f, +2.059276841e-04f, +8.124714801e-05f, -1.659755120e-05f, -8.079217154e-05f, -1.111221882e-04f, -1.127718672e-04f, -9.432182171e-05f, -6.547329714e-05f, -3.500799781e-05f, -9.361551378e-06f, +8.008503125e-06f, +1.648743506e-05f, +1.759576105e-05f, +1.399743514e-05f, +8.519174888e-06f,\n    +2.163713502e-04f, +6.786528698e-06f, -6.919769508e-04f, -1.943713093e-03f, -3.491058880e-03f, -4.679342053e-03f, -4.568746977e-03f, -2.266266820e-03f, +2.598618995e-03f, +9.436823341e-03f, +1.653131281e-02f, +2.131515231e-02f, +2.111848750e-02f, +1.419852965e-02f, +6.910292352e-04f, -1.693196650e-02f, -3.419577315e-02f, -4.577764596e-02f, -4.718470258e-02f, -3.640317188e-02f, -1.490229022e-02f, +1.244944774e-02f, +3.863164217e-02f, +5.653218845e-02f, +6.114860651e-02f, +5.117617307e-02f, +2.942623922e-02f, +1.926849082e-03f, -2.397700074e-02f, -4.186191447e-02f, -4.804709670e-02f, -4.242412396e-02f, -2.810127143e-02f, -1.009128326e-02f, +6.422539372e-03f, +1.762216094e-02f, +2.191900516e-02f, +1.997045467e-02f, +1.399189695e-02f, +6.726538715e-03f, +4.867854796e-04f, -3.427199206e-03f, -4.825276152e-03f, -4.332114202e-03f, -2.909313630e-03f, -1.417287284e-03f, -3.631299982e-04f, +1.325307281e-04f,\n    +9.099460397e-07f, +1.302864034e-05f, +3.054440828e-05f, +4.594850717e-05f, +4.728959078e-05f, +2.269282404e-05f, -3.280034141e-05f, -1.109010239e-04f, -1.878788303e-04f, -2.292318388e-04f, -2.013348463e-04f, -8.674983814e-05f, +1.028329237e-04f, +3.225405397e-04f, +5.031953214e-04f, +5.723084953e-04f, +4.809312030e-04f, +2.264624880e-04f, -1.384167806e-04f, -5.162463108e-04f, -7.931473988e-04f, -8.761915298e-04f, -7.265742297e-04f, -3.760095383e-04f, +8.057995834e-05f, +5.143468419e-04f, +8.037746187e-04f, +8.733376566e-04f, +7.159904009e-04f, +3.920587902e-04f, +5.919874154e-06f, -3.301792273e-04f, -5.317539276e-04f, -5.649680224e-04f, -4.502383222e-04f, -2.476076295e-04f, -3.134374756e-05f, +1.358942076e-04f, +2.203297043e-04f, +2.213133645e-04f, +1.635709156e-04f, +8.267731948e-05f, +1.042838306e-05f, -3.460780348e-05f, -4.922680759e-05f, -4.157888904e-05f, -2.426343398e-05f, -8.046449887e-06f,\n    /*  2,27 (48) */\n    +6.697656655e-05f, +3.100629092e-04f, +7.279507922e-04f, +1.273734461e-03f, +1.812755924e-03f, +2.123409868e-03f, +1.928156395e-03f, +9.564589793e-04f, -9.677770163e-04f, -3.831024737e-03f, -7.350809861e-03f, -1.093769286e-02f, -1.371939665e-02f, -1.463687577e-02f, -1.260648082e-02f, -6.725457326e-03f, +3.516044690e-03f, +1.806058077e-02f, +3.618868840e-02f, +5.653385790e-02f, +7.721714004e-02f, +9.608718283e-02f, +1.110285586e-01f, +1.202848560e-01f, +1.227372263e-01f, +1.180856392e-01f, +1.068979297e-01f, +9.051712397e-02f, +7.084499860e-02f, +5.004339344e-02f, +3.020939460e-02f, +1.308318748e-02f, -1.620288963e-04f, -9.017627166e-03f, -1.361810636e-02f, -1.461749507e-02f, -1.299838892e-02f, -9.857409088e-03f, -6.209849225e-03f, -2.846498251e-03f, -2.602207787e-04f, +1.357063808e-03f, +2.060864306e-03f, +2.067070323e-03f, +1.656899872e-03f, +1.095731419e-03f, +5.798018381e-04f, +2.151986490e-04f,\n    -4.868577177e-06f, -1.028007989e-05f, -1.545068921e-05f, -1.789179549e-05f, -1.473325471e-05f, -3.557165526e-06f, +1.658904033e-05f, +4.425657742e-05f, +7.503831325e-05f, +1.016589473e-04f, +1.148617881e-04f, +1.050564873e-04f, +6.448138195e-05f, -1.054810206e-05f, -1.178333665e-04f, -2.484363303e-04f, -3.871281868e-04f, -5.142384158e-04f, -6.086852563e-04f, -6.516741400e-04f, -6.303496402e-04f, -5.406356977e-04f, -3.886208156e-04f, -1.901205840e-04f, +3.157837062e-05f, +2.494044498e-04f, +4.369203387e-04f, +5.726190240e-04f, +6.432670421e-04f, +6.456724169e-04f, +5.865928741e-04f, +4.808899607e-04f, +3.483870618e-04f, +2.101260580e-04f, +8.479080402e-05f, -1.403138297e-05f, -7.931317237e-05f, -1.106465203e-04f, -1.130744256e-04f, -9.510577867e-05f, -6.644006295e-05f, -3.591319099e-05f, -1.004794213e-05f, +7.603492727e-06f, +1.634596290e-05f, +1.764758391e-05f, +1.415216617e-05f, +8.694227944e-06f,\n    +2.172812962e-04f, +1.981516904e-05f, -6.614325425e-04f, -1.897764586e-03f, -3.443769290e-03f, -4.656649229e-03f, -4.601547318e-03f, -2.377167844e-03f, +2.410740164e-03f, +9.207591503e-03f, +1.632997796e-02f, +2.122840247e-02f, +2.122132042e-02f, +1.452107019e-02f, +1.194224557e-03f, -1.635965800e-02f, -3.371484194e-02f, -4.555118347e-02f, -4.732311936e-02f, -3.691941819e-02f, -1.569543762e-02f, +1.157325621e-02f, +3.790506794e-02f, +5.615617891e-02f, +6.122918647e-02f, +5.169051991e-02f, +3.023001384e-02f, +2.800186739e-03f, -2.326101034e-02f, -4.146985568e-02f, -4.804117682e-02f, -4.275430318e-02f, -2.863302536e-02f, -1.065625128e-02f, +5.972301050e-03f, +1.737455331e-02f, +2.188766141e-02f, +2.010634887e-02f, +1.421222665e-02f, +6.947852079e-03f, +6.503563952e-04f, -3.344521887e-03f, -4.814847769e-03f, -4.366722005e-03f, -2.958540437e-03f, -1.458866173e-03f, -3.873934322e-04f, +1.244842782e-04f,\n    +6.524678118e-07f, +1.254445566e-05f, +2.997561797e-05f, +4.561165540e-05f, +4.758857544e-05f, +2.393200775e-05f, -3.064044285e-05f, -1.083175159e-04f, -1.858201188e-04f, -2.288380210e-04f, -2.034924447e-04f, -9.161363612e-05f, +9.614045620e-05f, +3.158705776e-04f, +4.988930718e-04f, +5.724235080e-04f, +4.863836286e-04f, +2.364960278e-04f, -1.262323105e-04f, -5.053881103e-04f, -7.870554015e-04f, -8.770913041e-04f, -7.346386734e-04f, -3.891899554e-04f, +6.596032919e-05f, +5.024274914e-04f, +7.978284485e-04f, +8.747482740e-04f, +7.238894151e-04f, +4.037270028e-04f, +1.777500250e-05f, -3.213879831e-04f, -5.279727365e-04f, -5.664001392e-04f, -4.555320128e-04f, -2.545269905e-04f, -3.762360484e-05f, +1.318330365e-04f, +2.190289187e-04f, +2.223446079e-04f, +1.659146577e-04f, +8.521210150e-05f, +1.233000201e-05f, -3.367975215e-05f, -4.916838214e-05f, -4.203043254e-05f, -2.483227790e-05f, -8.466489063e-06f,\n    /*  2,28 (48) */\n    +6.210798937e-05f, +2.997828293e-04f, +7.125001030e-04f, +1.255842665e-03f, +1.798022669e-03f, +2.119852703e-03f, +1.944745435e-03f, +1.000715557e-03f, -8.927387031e-04f, -3.729365789e-03f, -7.235948073e-03f, -1.083263637e-02f, -1.365491527e-02f, -1.464742387e-02f, -1.272431418e-02f, -6.973893657e-03f, +3.128916504e-03f, +1.754634235e-02f, +3.558000314e-02f, +5.588218376e-02f, +7.658679040e-02f, +9.554654713e-02f, +1.106399378e-01f, +1.200947354e-01f, +1.227688047e-01f, +1.183350437e-01f, +1.073348500e-01f, +9.108974299e-02f, +7.148826564e-02f, +5.068906585e-02f, +3.079598747e-02f, +1.356407744e-02f, +1.863581655e-04f, -8.807501108e-03f, -1.353331556e-02f, -1.463152645e-02f, -1.307770209e-02f, -9.968055609e-03f, -6.322923651e-03f, -2.941604030e-03f, -3.266608416e-04f, +1.321150617e-03f, +2.050816364e-03f, +2.074673816e-03f, +1.673245835e-03f, +1.113379003e-03f, +5.939540043e-04f, +2.238928769e-04f,\n    -4.715850413e-06f, -1.010367479e-05f, -1.531578494e-05f, -1.788548775e-05f, -1.494341021e-05f, -4.042543184e-06f, +1.583080551e-05f, +4.331406289e-05f, +7.409509441e-05f, +1.009790774e-04f, +1.147498435e-04f, +1.057964787e-04f, +6.626528240e-05f, -7.686758355e-06f, -1.140639309e-04f, -2.441393179e-04f, -3.828597697e-04f, -5.106528043e-04f, -6.064265671e-04f, -6.512574993e-04f, -6.320554984e-04f, -5.444403173e-04f, -3.941795518e-04f, -1.968101222e-04f, +2.456493322e-05f, +2.429270989e-04f, +4.317513181e-04f, +5.693190501e-04f, +6.421021986e-04f, +6.465865679e-04f, +5.892386203e-04f, +4.847090843e-04f, +3.527218023e-04f, +2.143374835e-04f, +8.836090079e-05f, -1.143190856e-05f, -7.780056820e-05f, -1.101423396e-04f, -1.133569712e-04f, -9.587936640e-05f, -6.740520824e-05f, -3.682318671e-05f, -1.074259293e-05f, +7.189603096e-06f, +1.619712886e-05f, +1.769470941e-05f, +1.430503026e-05f, +8.869667763e-06f,\n    +2.179337640e-04f, +3.235962470e-05f, -6.314569246e-04f, -1.852152930e-03f, -3.396180714e-03f, -4.632717222e-03f, -4.632187761e-03f, -2.485485359e-03f, +2.224920046e-03f, +8.978753482e-03f, +1.612648552e-02f, +2.113678884e-02f, +2.131746088e-02f, +1.483694077e-02f, +1.693117628e-03f, -1.578723449e-02f, -3.322845831e-02f, -4.531468744e-02f, -4.744935167e-02f, -3.742480630e-02f, -1.648249302e-02f, +1.069616491e-02f, +3.717042926e-02f, +5.576698896e-02f, +6.129514680e-02f, +5.219294740e-02f, +3.102784229e-02f, +3.674935013e-03f, -2.253712093e-02f, -4.106612868e-02f, -4.802340182e-02f, -4.307569117e-02f, -2.916099810e-02f, -1.122265142e-02f, +5.516769037e-03f, +1.712002632e-02f, +2.185003780e-02f, +2.023818191e-02f, +1.443125557e-02f, +7.170196687e-03f, +8.162710528e-04f, -3.259309785e-03f, -4.802517767e-03f, -4.400401757e-03f, -3.007708819e-03f, -1.500896606e-03f, -4.122257101e-04f, +1.160177891e-04f,\n    +4.024611317e-07f, +1.206616299e-05f, +2.940548286e-05f, +4.526150288e-05f, +4.786198073e-05f, +2.513989055e-05f, -2.850444351e-05f, -1.057348169e-04f, -1.837277423e-04f, -2.283761428e-04f, -2.055630957e-04f, -9.640048616e-05f, +8.948137306e-05f, +3.091651753e-04f, +4.944820104e-04f, +5.723788116e-04f, +4.916713289e-04f, +2.464154710e-04f, -1.140654159e-04f, -4.944330571e-04f, -7.807717433e-04f, -8.777580473e-04f, -7.424994357e-04f, -4.022602460e-04f, +5.132194230e-05f, +4.903665421e-04f, +7.916631086e-04f, +8.759306836e-04f, +7.316192808e-04f, +4.153302342e-04f, +2.967814651e-05f, -3.124629637e-04f, -5.240226921e-04f, -5.676830579e-04f, -4.607364475e-04f, -2.614318102e-04f, -4.395226739e-05f, +1.276886948e-04f, +2.176440466e-04f, +2.233165834e-04f, +1.682350316e-04f, +8.775566630e-05f, +1.425918711e-05f, -3.272092345e-05f, -4.908748870e-05f, -4.247232228e-05f, -2.540239313e-05f, -8.893397928e-06f,\n    /*  2,29 (48) */\n    +5.739213896e-05f, +2.896791545e-04f, +6.971843180e-04f, +1.237957178e-03f, +1.783079259e-03f, +2.115810160e-03f, +1.960576241e-03f, +1.044029620e-03f, -8.186436087e-04f, -3.628386712e-03f, -7.121198229e-03f, -1.072683989e-02f, -1.358864998e-02f, -1.465511063e-02f, -1.283837811e-02f, -7.218032974e-03f, +2.746056734e-03f, +1.703568955e-02f, +3.497357657e-02f, +5.523092626e-02f, +7.595473490e-02f, +9.500210682e-02f, +1.102457583e-01f, +1.198979252e-01f, +1.227933696e-01f, +1.185779707e-01f, +1.077666013e-01f, +9.165906204e-02f, +7.213036784e-02f, +5.133565242e-02f, +3.138522609e-02f, +1.404878652e-02f, +5.390799677e-04f, -8.593163625e-03f, -1.344495466e-02f, -1.464295836e-02f, -1.315550266e-02f, -1.007819795e-02f, -6.436280622e-03f, -3.037483396e-03f, -3.940660499e-04f, +1.284327430e-03f, +2.040073771e-03f, +2.081863419e-03f, +1.689442964e-03f, +1.131073713e-03f, +6.082590345e-04f, +2.327625447e-04f,\n    -4.564577659e-06f, -9.927174596e-06f, -1.517833682e-05f, -1.787376529e-05f, -1.514567628e-05f, -4.518961403e-06f, +1.508024918e-05f, +4.237501215e-05f, +7.314824287e-05f, +1.002864397e-04f, +1.146155658e-04f, +1.065062782e-04f, +6.801508365e-05f, -4.857641601e-06f, -1.103181681e-04f, -2.398511288e-04f, -3.785808125e-04f, -5.070357475e-04f, -6.041176459e-04f, -6.507776023e-04f, -6.336937015e-04f, -5.481829449e-04f, -3.996916520e-04f, -2.034758906e-04f, +1.754851234e-05f, +2.364205011e-04f, +4.265315589e-04f, +5.659549751e-04f, +6.408698258e-04f, +6.474396557e-04f, +5.918378714e-04f, +4.885012868e-04f, +3.570504884e-04f, +2.185614491e-04f, +9.195711480e-05f, -8.799239900e-06f, -7.625427805e-05f, -1.096094236e-04f, -1.136192096e-04f, -9.664228773e-05f, -6.836848933e-05f, -3.773782790e-05f, -1.144544108e-05f, +6.766816532e-06f, +1.604086273e-05f, +1.773704708e-05f, +1.445594466e-05f, +9.045437432e-06f,\n    +2.183362251e-04f, +4.442578769e-05f, -6.020514417e-04f, -1.806891427e-03f, -3.348318733e-03f, -4.607577331e-03f, -4.660692205e-03f, -2.591220176e-03f, +2.041192303e-03f, +8.750377339e-03f, +1.592092242e-02f, +2.104038835e-02f, +2.140694225e-02f, +1.514610595e-02f, +2.187599639e-03f, -1.521485568e-02f, -3.273678699e-02f, -4.506827197e-02f, -4.756341708e-02f, -3.791923935e-02f, -1.726326477e-02f, +9.818406863e-03f, +3.642792983e-02f, +5.536472871e-02f, +6.134646874e-02f, +5.268331394e-02f, +3.181950540e-02f, +4.550865697e-03f, -2.180550164e-02f, -4.065079844e-02f, -4.799372367e-02f, -4.338815413e-02f, -2.968502079e-02f, -1.179033448e-02f, +5.056032590e-03f, +1.685859451e-02f, +2.180608554e-02f, +2.036587060e-02f, +1.464889962e-02f, +7.393513271e-03f, +9.845060845e-04f, -3.171554119e-03f, -4.788258580e-03f, -4.433122681e-03f, -3.056796308e-03f, -1.543368928e-03f, -4.376281033e-04f, +1.071243912e-04f,\n    +1.598987474e-07f, +1.159389361e-05f, +2.883431423e-05f, +4.489845939e-05f, +4.811012979e-05f, +2.631648037e-05f, -2.639281442e-05f, -1.031538630e-04f, -1.816028521e-04f, -2.278471264e-04f, -2.075470058e-04f, -1.011095612e-04f, +8.285749660e-05f, +3.024266850e-04f, +4.899642325e-04f, +5.721753980e-04f, +4.967936220e-04f, +2.562184377e-04f, -1.019195666e-04f, -4.833846306e-04f, -7.742987235e-04f, -8.781920142e-04f, -7.501545301e-04f, -4.152167559e-04f, +3.666895974e-05f, +4.781673233e-04f, +7.852800500e-04f, +8.768840711e-04f, +7.391773030e-04f, +4.268648926e-04f, +4.162602116e-05f, -3.034061574e-04f, -5.199040306e-04f, -5.688154408e-04f, -4.658493838e-04f, -2.683198039e-04f, -5.032813447e-05f, +1.234617384e-04f, +2.161746624e-04f, +2.242282643e-04f, +1.705309043e-04f, +9.030718001e-05f, +1.621559433e-05f, -3.173121068e-05f, -4.898376114e-05f, -4.290415923e-05f, -2.597351020e-05f, -9.327090145e-06f,\n    /*  2,30 (48) */\n    +5.282756130e-05f, +2.797519799e-04f, +6.820059812e-04f, +1.220083412e-03f, +1.767933583e-03f, +2.111291198e-03f, +1.975656490e-03f, +1.086404632e-03f, -7.454953658e-04f, -3.528100272e-03f, -7.006582663e-03f, -1.062033362e-02f, -1.352063490e-02f, -1.465996827e-02f, -1.294869628e-02f, -7.457884103e-03f, +2.367475921e-03f, +1.652865380e-02f, +3.436945893e-02f, +5.458014866e-02f, +7.532104120e-02f, +9.445392387e-02f, +1.098460666e-01f, +1.196944494e-01f, +1.228109182e-01f, +1.188143913e-01f, +1.081931329e-01f, +9.222501702e-02f, +7.277123767e-02f, +5.198309208e-02f, +3.197706396e-02f, +1.453728781e-02f, +8.961304561e-04f, -8.374602175e-03f, -1.335299754e-02f, -1.465175760e-02f, -1.323175694e-02f, -1.018780737e-02f, -6.549899832e-03f, -3.134125684e-03f, -4.624345392e-04f, +1.246589602e-03f, +2.028628330e-03f, +2.088630235e-03f, +1.705483827e-03f, +1.148810760e-03f, +6.227149792e-04f, +2.418079821e-04f,\n    -4.414790764e-06f, -9.750642811e-06f, -1.503843121e-05f, -1.785671677e-05f, -1.534011438e-05f, -4.986422344e-06f, +1.433745413e-05f, +4.143960274e-05f, +7.219801774e-05f, +9.958133640e-05f, +1.144592400e-04f, +1.071860828e-04f, +6.973082794e-05f, -2.060909781e-06f, -1.065964465e-04f, -2.355723082e-04f, -3.742919618e-04f, -5.033878865e-04f, -6.017590106e-04f, -6.502347371e-04f, -6.352642376e-04f, -5.518632500e-04f, -4.051565071e-04f, -2.101170941e-04f, +1.052996006e-05f, +2.298854257e-04f, +4.212616238e-04f, +5.625270708e-04f, +6.395698761e-04f, +6.482313423e-04f, +5.943900778e-04f, +4.922659171e-04f, +3.613724853e-04f, +2.227974382e-04f, +9.557911602e-05f, -6.133495444e-06f, -7.467422635e-05f, -1.090475536e-04f, -1.138608472e-04f, -9.739424462e-05f, -6.932966021e-05f, -3.865695453e-05f, -1.215642107e-05f, +6.335117472e-06f, +1.587709547e-05f, +1.777450663e-05f, +1.460482609e-05f, +9.221479075e-06f,\n    +2.184961239e-04f, +5.601968130e-05f, -5.732171275e-04f, -1.761992968e-03f, -3.300208604e-03f, -4.581260851e-03f, -4.687085019e-03f, -2.694374039e-03f, +1.859589451e-03f, +8.522530212e-03f, +1.571337542e-02f, +2.093927879e-02f, +2.148979975e-02f, +1.544853263e-02f, +2.677563871e-03f, -1.464268029e-02f, -3.223999336e-02f, -4.481205354e-02f, -4.766533665e-02f, -3.840262399e-02f, -1.803756349e-02f, +8.940214849e-03f, +3.567777530e-02f, +5.494951196e-02f, +6.138313770e-02f, +5.316148127e-02f, +3.260478545e-02f, +5.427749768e-03f, -2.106632434e-02f, -4.022393355e-02f, -4.795209765e-02f, -4.369156029e-02f, -3.020492482e-02f, -1.235914992e-02f, +4.590183206e-03f, +1.659027470e-02f, +2.175575740e-02f, +2.048933234e-02f, +1.486507428e-02f, +7.617741535e-03f, +1.155036989e-03f, -3.081246939e-03f, -4.772042985e-03f, -4.464853891e-03f, -3.105780069e-03f, -1.586273087e-03f, -4.636016135e-04f, +9.779730107e-05f,\n    -7.525040422e-08f, +1.112777301e-05f, +2.826241838e-05f, +4.452293401e-05f, +4.833335192e-05f, +2.746179810e-05f, -2.430601068e-05f, -1.005755783e-04f, -1.794465983e-04f, -2.272519091e-04f, -2.094444104e-04f, -1.057400680e-04f, +7.627062286e-05f, +2.956574536e-04f, +4.853418550e-04f, +5.718143049e-04f, +5.017498821e-04f, +2.659025952e-04f, -8.979821280e-05f, -4.722463287e-04f, -7.676386936e-04f, -8.783935306e-04f, -7.576020354e-04f, -4.280558673e-04f, +2.200554834e-05f, +4.658332083e-04f, +7.786807920e-04f, +8.776076910e-04f, +7.465608329e-04f, +4.383273960e-04f, +5.361531476e-05f, -2.942196033e-04f, -5.156170440e-04f, -5.697959909e-04f, -4.708685948e-04f, -2.751886761e-04f, -5.674957623e-05f, +1.191527570e-04f, +2.146203664e-04f, +2.250786348e-04f, +1.728011389e-04f, +9.286579528e-05f, +1.819886387e-05f, -3.071051883e-05f, -4.885683791e-05f, -4.332554241e-05f, -2.654535421e-05f, -9.767473893e-06f,\n    /*  2,31 (48) */\n    +4.841277053e-05f, +2.700013371e-04f, +6.669675500e-04f, +1.202226696e-03f, +1.752593469e-03f, +2.106304776e-03f, +1.989993944e-03f, +1.127844235e-03f, -6.732973481e-04f, -3.428518936e-03f, -6.892123423e-03f, -1.051314753e-02f, -1.345090407e-02f, -1.466202918e-02f, -1.305529273e-02f, -7.693456411e-03f, +1.993183960e-03f, +1.602526591e-02f, +3.376769992e-02f, +5.392991392e-02f, +7.468577696e-02f, +9.390206062e-02f, +1.094409101e-01f, +1.194843323e-01f, +1.228214481e-01f, +1.190442767e-01f, +1.086143945e-01f, +9.278754409e-02f, +7.341080754e-02f, +5.263132342e-02f, +3.257145404e-02f, +1.502955372e-02f, +1.257502941e-03f, -8.151804737e-03f, -1.325741842e-02f, -1.465789110e-02f, -1.330643117e-02f, -1.029685493e-02f, -6.663760679e-03f, -3.231519929e-03f, -5.317641994e-04f, +1.207932647e-03f, +2.016471909e-03f, +2.094965353e-03f, +1.721360922e-03f, +1.166585266e-03f, +6.373198053e-04f, +2.510294612e-04f,\n    -4.266520574e-06f, -9.574142015e-06f, -1.489615403e-05f, -1.783443122e-05f, -1.552678732e-05f, -5.444930471e-06f, +1.360250026e-05f, +4.050800932e-05f, +7.124467603e-05f, +9.886406891e-05f, +1.142811527e-04f, +1.078360932e-04f, +7.141256319e-05f, +7.032857366e-07f, -1.028991279e-04f, -2.313033964e-04f, -3.699938620e-04f, -4.997098643e-04f, -5.993511841e-04f, -6.496292006e-04f, -6.367671050e-04f, -5.554809118e-04f, -4.105735155e-04f, -2.167329417e-04f, +3.510128802e-06f, +2.233226464e-04f, +4.159420831e-04f, +5.590356192e-04f, +6.382023119e-04f, +6.489612978e-04f, +5.968946951e-04f, +4.960023257e-04f, +3.656871562e-04f, +2.270449294e-04f, +9.922656802e-05f, -3.434800198e-06f, -7.306034295e-05f, -1.084565141e-04f, -1.140815919e-04f, -9.813493822e-05f, -7.028847262e-05f, -3.958040364e-05f, -1.287546454e-05f, +5.894492519e-06f, +1.570575921e-05f, +1.780699796e-05f, +1.475159068e-05f, +9.397733863e-06f,\n    +2.184208735e-04f, +6.714745431e-05f, -5.449547091e-04f, -1.717470034e-03f, -3.251875252e-03f, -4.553799053e-03f, -4.711391030e-03f, -2.794949618e-03f, +1.680142853e-03f, +8.295278303e-03f, +1.550393101e-02f, +2.083353872e-02f, +2.156607037e-02f, +1.574419009e-02f, +3.162905726e-03f, -1.407086598e-02f, -3.173824348e-02f, -4.454615094e-02f, -4.775513486e-02f, -3.887487031e-02f, -1.880520218e-02f, +8.061821318e-03f, +3.492017326e-02f, +5.452145609e-02f, +6.140514325e-02f, +5.362731448e-02f, +3.338346624e-02f, +6.305357459e-03f, -2.031976351e-02f, -3.978560615e-02f, -4.789848234e-02f, -4.398577989e-02f, -3.072054186e-02f, -1.292894591e-02f, +4.119314611e-03f, +1.631508603e-02f, +2.169900783e-02f, +2.060848510e-02f, +1.507969465e-02f, +7.842820170e-03f, +1.327838128e-03f, -2.988381144e-03f, -4.753844121e-03f, -4.495564410e-03f, -3.154636907e-03f, -1.629598630e-03f, -4.901469677e-04f, +8.802982718e-05f,\n    -3.030211128e-07f, +1.066792104e-05f, +2.769009656e-05f, +4.413533489e-05f, +4.853198241e-05f, +2.857587745e-05f, -2.224447147e-05f, -9.800087468e-05f, -1.772601301e-04f, -2.265914423e-04f, -2.112555732e-04f, -1.102912474e-04f, +6.972252126e-05f, +2.888598211e-04f, +4.806170152e-04f, +5.712966145e-04f, +5.065395392e-04f, +2.754656586e-04f, -7.770478446e-05f, -4.610216661e-04f, -7.607940572e-04f, -8.783629926e-04f, -7.648400958e-04f, -4.407740003e-04f, +7.335878262e-06f, +4.533676142e-04f, +7.718669222e-04f, +8.781008671e-04f, +7.537672688e-04f, +4.497141734e-04f, +6.564268988e-05f, -2.849053907e-04f, -5.111620793e-04f, -5.706234531e-04f, -4.757918698e-04f, -2.820361204e-04f, -6.321493412e-05f, +1.147623742e-04f, +2.129807855e-04f, +2.258666913e-04f, +1.750445952e-04f, +9.543065144e-05f, +2.020862008e-05f, -2.965876477e-05f, -4.870636224e-05f, -4.373606909e-05f, -2.711764488e-05f, -1.021445183e-05f,\n    /*  3, 0 (48) */\n    +3.382425704e-04f, +1.348067834e-04f, -4.889424346e-04f, -1.466276588e-03f, -2.424363330e-03f, -2.730039057e-03f, -1.724598248e-03f, +9.008300509e-04f, +4.739031994e-03f, +8.514833164e-03f, +1.031793603e-02f, +8.256301383e-03f, +1.371724009e-03f, -9.514669115e-03f, -2.142432917e-02f, -2.960851385e-02f, -2.874512923e-02f, -1.466449091e-02f, +1.394439274e-02f, +5.448301361e-02f, +1.005300380e-01f, +1.431856698e-01f, +1.733482814e-01f, +1.842374374e-01f, +1.733482814e-01f, +1.431856698e-01f, +1.005300380e-01f, +5.448301361e-02f, +1.394439274e-02f, -1.466449091e-02f, -2.874512923e-02f, -2.960851385e-02f, -2.142432917e-02f, -9.514669115e-03f, +1.371724009e-03f, +8.256301383e-03f, +1.031793603e-02f, +8.514833164e-03f, +4.739031994e-03f, +9.008300509e-04f, -1.724598248e-03f, -2.730039057e-03f, -2.424363330e-03f, -1.466276588e-03f, -4.889424346e-04f, +1.348067834e-04f, +3.382425704e-04f, +2.622641023e-04f,\n    +8.167179641e-07f, +1.236605420e-05f, +2.592907112e-05f, +3.300060303e-05f, +2.376427225e-05f, -7.333155539e-06f, -5.585024780e-05f, -1.047561226e-04f, -1.277317531e-04f, -9.889919355e-05f, -6.305860108e-06f, +1.362752771e-04f, +2.854709206e-04f, +3.765653018e-04f, +3.435785237e-04f, +1.454749231e-04f, -2.110969350e-04f, -6.625373850e-04f, -1.098675471e-03f, -1.391969581e-03f, -1.437136486e-03f, -1.187809005e-03f, -6.766902606e-04f, -1.084600706e-05f, +6.575069420e-04f, +1.175413611e-03f, +1.433843904e-03f, +1.397561162e-03f, +1.110650867e-03f, +6.770559685e-04f, +2.242442057e-04f, -1.365456772e-04f, -3.399932180e-04f, -3.777178872e-04f, -2.895631068e-04f, -1.411350845e-04f, +2.455154195e-06f, +9.697442048e-05f, +1.277273734e-04f, +1.060154541e-04f, +5.749286536e-05f, +8.641971212e-06f, -2.313094698e-05f, -3.300519509e-05f, -2.630090367e-05f, -1.279394254e-05f, -1.093779023e-06f, +4.569541687e-06f,\n    -7.823217465e-04f, -9.084685290e-04f, -9.527730581e-05f, +1.939581772e-03f, +4.521325238e-03f, +5.889778654e-03f, +3.972523948e-03f, -2.097746258e-03f, -1.059839761e-02f, -1.714075782e-02f, -1.654476645e-02f, -6.064599171e-03f, +1.185220802e-02f, +2.935028356e-02f, +3.641246564e-02f, +2.636698292e-02f, +6.586074871e-04f, -3.028063400e-02f, -5.133665227e-02f, -5.043564613e-02f, -2.556515975e-02f, +1.309926646e-02f, +4.764810534e-02f, +6.141247912e-02f, +4.764810534e-02f, +1.309926646e-02f, -2.556515975e-02f, -5.043564613e-02f, -5.133665227e-02f, -3.028063400e-02f, +6.586074871e-04f, +2.636698292e-02f, +3.641246564e-02f, +2.935028356e-02f, +1.185220802e-02f, -6.064599171e-03f, -1.654476645e-02f, -1.714075782e-02f, -1.059839761e-02f, -2.097746258e-03f, +3.972523948e-03f, +5.889778654e-03f, +4.521325238e-03f, +1.939581772e-03f, -9.527730581e-05f, -9.084685290e-04f, -7.823217465e-04f, -3.493719860e-04f,\n    +1.207582970e-05f, -7.181807980e-06f, -4.436800841e-05f, -7.843946816e-05f, -7.358044464e-05f, -2.500652728e-06f, +1.238811450e-04f, +2.431713521e-04f, +2.638049775e-04f, +1.207343630e-04f, -1.652856064e-04f, -4.682220434e-04f, -6.050322369e-04f, -4.385471672e-04f, +2.078504744e-05f, +5.833325336e-04f, +9.558098825e-04f, +8.968475170e-04f, +3.682537994e-04f, -4.129216663e-04f, -1.066580545e-03f, -1.246399629e-03f, -8.336386060e-04f, -1.403262768e-05f, +8.124734222e-04f, +1.242276557e-03f, +1.080734367e-03f, +4.373988820e-04f, -3.459355243e-04f, -8.869413989e-04f, -9.613405219e-04f, -5.994210138e-04f, -3.819750226e-05f, +4.280763606e-04f, +6.048271801e-04f, +4.759656788e-04f, +1.753901006e-04f, -1.135609871e-04f, -2.619740203e-04f, -2.457850786e-04f, -1.281625351e-04f, -8.067819448e-07f, +7.243049474e-05f, +7.907266217e-05f, +4.564423467e-05f, +8.126265744e-06f, -1.179589871e-05f, -1.279054036e-05f,\n    /*  3, 1 (48) */\n    +3.390592884e-04f, +1.471728376e-04f, -4.630133635e-04f, -1.433275985e-03f, -2.400599057e-03f, -2.737372213e-03f, -1.780448496e-03f, +7.960739283e-04f, +4.611300241e-03f, +8.415933970e-03f, +1.031163017e-02f, +8.392576660e-03f, +1.657194930e-03f, -9.138103813e-03f, -2.108075065e-02f, -2.946303892e-02f, -2.895622617e-02f, -1.532702830e-02f, +1.284571727e-02f, +5.309104403e-02f, +9.909290155e-02f, +1.419978608e-01f, +1.726715912e-01f, +1.842265914e-01f, +1.740057884e-01f, +1.443610834e-01f, +1.019638819e-01f, +5.588057478e-02f, +1.505504361e-02f, -1.398743494e-02f, -2.852088503e-02f, -2.974505952e-02f, -2.176432239e-02f, -9.892387002e-03f, +1.082160902e-03f, +8.115166299e-03f, +1.032039119e-02f, +8.611807584e-03f, +4.866759367e-03f, +1.006845505e-03f, -1.667105383e-03f, -2.721397086e-03f, -2.447494277e-03f, -1.499281783e-03f, -5.152433383e-04f, +1.220128409e-04f, +3.371487914e-04f, +2.668336440e-04f,\n    +5.459948177e-07f, +1.194052812e-05f, +2.555103579e-05f, +3.297974244e-05f, +2.437540135e-05f, -6.042442799e-06f, -5.420884075e-05f, -1.034714787e-04f, -1.276843902e-04f, -1.007595192e-04f, -1.010520338e-05f, +1.314238026e-04f, +2.813221715e-04f, +3.752894788e-04f, +3.469985528e-04f, +1.542445587e-04f, -1.980463138e-04f, -6.480053926e-04f, -1.086558738e-03f, -1.386130709e-03f, -1.440134762e-03f, -1.199942416e-03f, -6.957186340e-04f, -3.253550840e-05f, +6.381729614e-04f, +1.162758543e-03f, +1.430256781e-03f, +1.402902931e-03f, +1.122481066e-03f, +6.915572233e-04f, +2.374852913e-04f, -1.274579203e-04f, -3.362419967e-04f, -3.787454085e-04f, -2.935965438e-04f, -1.460014508e-04f, -1.446014787e-06f, +9.498517043e-05f, +1.276705727e-04f, +1.072485805e-04f, +5.913597559e-05f, +9.968556543e-06f, -2.247537575e-05f, -3.299323754e-05f, -2.666621724e-05f, -1.322398717e-05f, -1.377130203e-06f, +4.490041168e-06f,\n    -7.702459168e-04f, -9.156503370e-04f, -1.396453142e-04f, +1.861142303e-03f, +4.447744793e-03f, +5.887278001e-03f, +4.096405093e-03f, -1.854574906e-03f, -1.033459263e-02f, -1.702002346e-02f, -1.671005206e-02f, -6.532821215e-03f, +1.124717579e-02f, +2.891173640e-02f, +3.643325068e-02f, +2.695031545e-02f, +1.614417370e-03f, -2.938378648e-02f, -5.096839847e-02f, -5.084856780e-02f, -2.663174030e-02f, +1.185286683e-02f, +4.681446674e-02f, +6.139844650e-02f, +4.846057877e-02f, +1.434154302e-02f, -2.448442539e-02f, -4.999824725e-02f, -5.168258780e-02f, -3.116757540e-02f, -3.027330347e-04f, +2.576756190e-02f, +3.637426813e-02f, +2.977835992e-02f, +1.245703520e-02f, -5.588633492e-03f, -1.636937635e-02f, -1.725431881e-02f, -1.086037163e-02f, -2.343531337e-03f, +3.844361413e-03f, +5.888971872e-03f, +4.593755732e-03f, +2.018654434e-03f, -4.963307114e-05f, -9.003422633e-04f, -7.941176452e-04f, -3.621625263e-04f,\n    +1.233653283e-05f, -6.256675746e-06f, -4.309016406e-05f, -7.776765626e-05f, -7.466243631e-05f, -5.749470101e-06f, +1.195956183e-04f, +2.404591937e-04f, +2.654686322e-04f, +1.277587669e-04f, -1.552029443e-04f, -4.603124626e-04f, -6.049282845e-04f, -4.487161370e-04f, +3.482797389e-06f, +5.670541940e-04f, +9.498402261e-04f, +9.062725306e-04f, +3.903108881e-04f, -3.883171580e-04f, -1.051944096e-03f, -1.249917253e-03f, -8.543876214e-04f, -4.209082247e-05f, +7.909024357e-04f, +1.237549266e-03f, +1.094397381e-03f, +4.617360196e-04f, -3.233665128e-04f, -8.765571829e-04f, -9.664270613e-04f, -6.153101469e-04f, -5.571174430e-05f, +4.173070169e-04f, +6.043106357e-04f, +4.835375958e-04f, +1.855110352e-04f, -1.062410242e-04f, -2.599747520e-04f, -2.482974822e-04f, -1.324370954e-04f, -4.171674522e-06f, +7.121214734e-05f, +7.966604217e-05f, +4.691785108e-05f, +9.089735452e-06f, -1.149649446e-05f, -1.295244630e-05f,\n    /*  3, 2 (48) */\n    +3.396052832e-04f, +1.591133657e-04f, -4.374623277e-04f, -1.400296242e-03f, -2.376223656e-03f, -2.743414655e-03f, -1.834657337e-03f, +6.926024496e-04f, +4.483615851e-03f, +8.315174451e-03f, +1.030152497e-02f, +8.524000463e-03f, +1.938517101e-03f, -8.762814334e-03f, -2.073375210e-02f, -2.930879436e-02f, -2.915427248e-02f, -1.597503369e-02f, +1.175915853e-02f, +5.170491332e-02f, +9.765276679e-02f, +1.407979183e-01f, +1.719758725e-01f, +1.841940559e-01f, +1.746439613e-01f, +1.455238419e-01f, +1.033941387e-01f, +5.728347771e-02f, +1.617752467e-02f, -1.329587772e-02f, -2.828339973e-02f, -2.987251744e-02f, -2.210056439e-02f, -1.027113241e-02f, +7.885643586e-04f, +7.969164848e-03f, +1.031894517e-02f, +8.706792755e-03f, +4.994429940e-03f, +1.114094085e-03f, -1.607969408e-03f, -2.711428529e-03f, -2.469969652e-03f, -1.532275021e-03f, -5.419095556e-04f, +1.087888537e-04f, +3.357716612e-04f, +2.713236852e-04f,\n    +2.816527132e-07f, +1.151756553e-05f, +2.516711215e-05f, +3.294289841e-05f, +2.496439415e-05f, -4.770153257e-06f, -5.256935211e-05f, -1.021624150e-04f, -1.275859766e-04f, -1.025554528e-04f, -1.385231473e-05f, +1.265824125e-04f, +2.771190438e-04f, +3.738922690e-04f, +3.502539917e-04f, +1.628535423e-04f, -1.850951294e-04f, -6.334638925e-04f, -1.074304548e-03f, -1.380047129e-03f, -1.442839046e-03f, -1.211811609e-03f, -7.145878244e-04f, -5.421747208e-05f, +6.186926465e-04f, +1.149846182e-03f, +1.426374959e-03f, +1.407992425e-03f, +1.134162233e-03f, +7.060372125e-04f, +2.508173099e-04f, -1.182128095e-04f, -3.323242692e-04f, -3.796460644e-04f, -2.975690434e-04f, -1.508725802e-04f, -5.396717026e-06f, +9.293143999e-05f, +1.275606867e-04f, +1.084546092e-04f, +6.077885086e-05f, +1.131256524e-05f, -2.179751896e-05f, -3.296445351e-05f, -2.702469411e-05f, -1.365597741e-05f, -1.666719010e-06f, +4.404678912e-06f,\n    -7.579093840e-04f, -9.219070127e-04f, -1.827354783e-04f, +1.783374647e-03f, +4.373082357e-03f, +5.881528531e-03f, +4.216000711e-03f, -1.614115712e-03f, -1.006912400e-02f, -1.689226469e-02f, -1.686525500e-02f, -6.993133677e-03f, +1.064224750e-02f, +2.846302026e-02f, +3.643673348e-02f, +2.751736964e-02f, +2.564257596e-03f, -2.847751395e-02f, -5.057808759e-02f, -5.123688496e-02f, -2.768368439e-02f, +1.060294958e-02f, +4.596007912e-02f, +6.135635567e-02f, +4.925148120e-02f, +1.557909228e-02f, -2.339002800e-02f, -4.953651123e-02f, -5.200595431e-02f, -3.204413258e-02f, -1.269160096e-03f, +2.515225176e-02f, +3.631855639e-02f, +3.019566694e-02f, +1.306134584e-02f, -5.105095897e-03f, -1.618386532e-02f, -1.736055983e-02f, -1.112034638e-02f, -2.591828819e-03f, +3.711924318e-03f, +5.884800197e-03f, +4.664967880e-03f, +2.098320476e-03f, -2.715220056e-06f, -8.912525278e-04f, -8.056141397e-04f, -3.751149726e-04f,\n    +1.257826480e-05f, -5.351160797e-06f, -4.181167602e-05f, -7.705842929e-05f, -7.567694817e-05f, -8.938566172e-06f, +1.153086141e-04f, +2.376515187e-04f, +2.669660816e-04f, +1.346319256e-04f, -1.451474416e-04f, -4.522427527e-04f, -6.045179545e-04f, -4.585801599e-04f, -1.370094375e-05f, +5.505955327e-04f, +9.434368467e-04f, +9.152137016e-04f, +4.120965150e-04f, -3.635981751e-04f, -1.036833437e-03f, -1.252828523e-03f, -8.747103281e-04f, -7.012783938e-05f, +7.689362327e-04f, +1.232219304e-03f, +1.107561650e-03f, +4.859203331e-04f, -3.005573838e-04f, -8.656981442e-04f, -9.710646329e-04f, -6.309905005e-04f, -7.331924678e-05f, +4.062426254e-04f, +6.034802808e-04f, +4.909320686e-04f, +1.956429568e-04f, -9.877697198e-05f, -2.578062539e-04f, -2.507056983e-04f, -1.367021002e-04f, -7.592810238e-06f, +6.992500318e-05f, +8.021841976e-05f, +4.818784893e-05f, +1.007188154e-05f, -1.117738321e-05f, -1.310576536e-05f,\n    /*  3, 3 (48) */\n    +3.398869359e-04f, +1.706309313e-04f, -4.122952156e-04f, -1.367353344e-03f, -2.351259262e-03f, -2.748184809e-03f, -1.887226689e-03f, +5.904400346e-04f, +4.356029874e-03f, +8.212618998e-03f, +1.028767266e-02f, +8.650582875e-03f, +2.215636145e-03f, -8.388922065e-03f, -2.038349811e-02f, -2.914594082e-02f, -2.933936761e-02f, -1.660849758e-02f, +1.068485398e-02f, +5.032486620e-02f, +9.620992774e-02f, +1.395861067e-01f, +1.712612847e-01f, +1.841398384e-01f, +1.752626540e-01f, +1.466736881e-01f, +1.048205137e-01f, +5.869147013e-02f, +1.731168690e-02f, -1.258984051e-02f, -2.803258242e-02f, -2.999073025e-02f, -2.243288866e-02f, -1.065077847e-02f, +4.909953152e-04f, +7.818292268e-03f, +1.031354846e-02f, +8.799724195e-03f, +5.121990627e-03f, +1.222548695e-03f, -1.547190557e-03f, -2.700115964e-03f, -2.491767171e-03f, -1.565239474e-03f, -5.689342497e-04f, +9.513287631e-05f, +3.341049422e-04f, +2.757283641e-04f,\n    +2.373016503e-08f, +1.109736287e-05f, +2.477761287e-05f, +3.289035984e-05f, +2.553132036e-05f, -3.516594185e-06f, -5.093247959e-05f, -1.008298234e-04f, -1.274372170e-04f, -1.042870754e-04f, -1.754635521e-05f, +1.217528356e-04f, +2.728637187e-04f, +3.723755467e-04f, +3.533455744e-04f, +1.713008898e-04f, -1.722461206e-04f, -6.189167668e-04f, -1.061916802e-03f, -1.373721479e-03f, -1.445249734e-03f, -1.223414427e-03f, -7.332936410e-04f, -7.588687551e-05f, +5.990703682e-04f, +1.136678987e-03f, +1.422198365e-03f, +1.412827242e-03f, +1.145690556e-03f, +7.204919830e-04f, +2.642373334e-04f, -1.088115592e-04f, -3.282394937e-04f, -3.804180795e-04f, -3.014784169e-04f, -1.557466555e-04f, -9.395992526e-06f, +9.081325215e-05f, +1.273970654e-04f, +1.096326479e-04f, +6.242075398e-05f, +1.267363801e-05f, -2.109734737e-05f, -3.291857052e-05f, -2.737601512e-05f, -1.408969792e-05f, -1.962488206e-06f, +4.313389282e-06f,\n    -7.453311192e-04f, -9.272581735e-04f, -2.245471543e-04f, +1.706316218e-03f, +4.297405409e-03f, +5.872589965e-03f, +4.331309326e-03f, -1.376464193e-03f, -9.802157915e-03f, -1.675763276e-02f, -1.701040245e-02f, -7.445376430e-03f, +1.003772955e-02f, +2.800444010e-02f, +3.642303254e-02f, +2.806796518e-02f, +3.507694442e-03f, -2.756230025e-02f, -5.016599107e-02f, -5.160048313e-02f, -2.872051783e-02f, +9.350121055e-03f, +4.508536879e-02f, +6.128622784e-02f, +5.002041744e-02f, +1.681131159e-02f, -2.228246635e-02f, -4.905059090e-02f, -5.230651169e-02f, -3.290983073e-02f, -2.240224729e-03f, +2.452126126e-02f, +3.624523714e-02f, +3.060190957e-02f, +1.366482612e-02f, -4.614163828e-03f, -1.598822236e-02f, -1.745933680e-02f, -1.137815263e-02f, -2.842534517e-03f, +3.575222217e-03f, +5.877207387e-03f, +4.734892883e-03f, +2.178538896e-03f, +4.547262888e-05f, -8.811806463e-04f, -8.167915229e-04f, -3.882207380e-04f,\n    +1.280129310e-05f, -4.465533215e-06f, -4.053350083e-05f, -7.631299584e-05f, -7.662449684e-05f, -1.206689233e-05f, +1.110227562e-04f, +2.347512644e-04f, +2.682985099e-04f, +1.413516791e-04f, -1.351243585e-04f, -4.440187700e-04f, -6.038040284e-04f, -4.681363162e-04f, -3.075798926e-05f, +5.339661313e-04f, +9.366052454e-04f, +9.236685619e-04f, +4.336005838e-04f, -3.387775609e-04f, -1.021257219e-03f, -1.255132848e-03f, -8.945968170e-04f, -9.812957267e-05f, +7.465856134e-04f, +1.226288538e-03f, +1.120219483e-03f, +5.099391233e-04f, -2.775189198e-04f, -8.543678256e-04f, -9.752485870e-04f, -6.464527035e-04f, -9.101137782e-05f, +3.948868638e-04f, +6.023339503e-04f, +4.981434225e-04f, +2.057803530e-04f, -9.117143940e-05f, -2.554676994e-04f, -2.530068907e-04f, -1.409547922e-04f, -1.106891903e-05f, +6.856870388e-05f, +8.072861528e-05f, +4.945320309e-05f, +1.107234635e-05f, -1.083834336e-05f, -1.325010149e-05f,\n    /*  3, 4 (48) */\n    +3.399106661e-04f, +1.817282941e-04f, -3.875176027e-04f, -1.334462984e-03f, -2.325727942e-03f, -2.751701403e-03f, -1.938159169e-03f, +4.896102112e-04f, +4.228592657e-03f, +8.108331923e-03f, +1.027012630e-02f, +8.772335711e-03f, +2.488499864e-03f, -8.016546519e-03f, -2.003015253e-02f, -2.897463993e-02f, -2.951161373e-02f, -1.722741435e-02f, +9.622937179e-03f, +4.895114472e-02f, +9.476467801e-02f, +1.383626923e-01f, +1.705279911e-01f, +1.840639515e-01f, +1.758617243e-01f, +1.478103671e-01f, +1.062427120e-01f, +6.010429737e-02f, +1.845737746e-02f, -1.186934853e-02f, -2.776834509e-02f, -3.009954181e-02f, -2.276112815e-02f, -1.103119655e-02f, +1.895168983e-04f, +7.662545612e-03f, +1.030415246e-02f, +8.890537447e-03f, +5.249387692e-03f, +1.332181343e-03f, -1.484769803e-03f, -2.687442326e-03f, -2.512864519e-03f, -1.598158045e-03f, -5.963102648e-04f, +8.104317839e-05f, +3.321424540e-04f, +2.800417534e-04f,\n    -2.277388815e-07f, +1.068011173e-05f, +2.438284863e-05f, +3.282241924e-05f, +2.607625943e-05f, -2.282059878e-06f, -4.929891051e-05f, -9.947459474e-05f, -1.272388292e-04f, -1.059544931e-04f, -2.118651621e-05f, +1.169367772e-04f, +2.685583734e-04f, +3.707412088e-04f, +3.562740812e-04f, +1.795856748e-04f, -1.595019776e-04f, -6.043678766e-04f, -1.049399420e-03f, -1.367156457e-03f, -1.447367298e-03f, -1.234748787e-03f, -7.518319412e-04f, -9.753869981e-05f, +5.793105393e-04f, +1.123259489e-03f, +1.417727002e-03f, +1.417405042e-03f, +1.157062250e-03f, +7.349175668e-04f, +2.777423880e-04f, -9.925544176e-05f, -3.239871777e-04f, -3.810597053e-04f, -3.053224756e-04f, -1.606218381e-04f, -1.344285118e-05f, +8.863065662e-05f, +1.271790738e-04f, +1.107818055e-04f, +6.406093845e-05f, +1.405140252e-05f, -2.037484222e-05f, -3.285532073e-05f, -2.771985991e-05f, -1.452492876e-05f, -2.264375771e-06f, +4.216109366e-06f,\n    -7.325298261e-04f, -9.317237067e-04f, -2.650806551e-04f, +1.630003222e-03f, +4.220780912e-03f, +5.860523072e-03f, +4.442332082e-03f, -1.141712929e-03f, -9.533859405e-03f, -1.661628108e-02f, -1.714552680e-02f, -7.889395200e-03f, +9.433925520e-03f, +2.753630378e-02f, +3.639227455e-02f, +2.860193131e-02f, +4.444299688e-03f, -2.663863169e-02f, -4.973239049e-02f, -5.193926069e-02f, -2.974177505e-02f, +8.094988206e-03f, +4.419077197e-02f, +6.118809826e-02f, +5.076700305e-02f, +1.803760013e-02f, -2.116224687e-02f, -4.854065178e-02f, -5.258403061e-02f, -3.376419855e-02f, -3.215473316e-03f, +2.387480855e-02f, +3.615422576e-02f, +3.099679643e-02f, +1.426716007e-02f, -4.116020405e-03f, -1.578244201e-02f, -1.755050824e-02f, -1.163362033e-02f, -3.095541408e-03f, +3.434267425e-03f, +5.866138468e-03f, +4.803461587e-03f, +2.259267511e-03f, +9.492583196e-05f, -8.701082999e-04f, -8.276298662e-04f, -4.014708395e-04f,\n    +1.300589560e-05f, -3.600041585e-06f, -3.925657677e-05f, -7.553256929e-05f, -7.750563625e-05f, -1.513345528e-05f, +1.067406320e-04f, +2.317613882e-04f, +2.694671867e-04f, +1.479159801e-04f, -1.251388857e-04f, -4.356464065e-04f, -6.027894352e-04f, -4.773818773e-04f, -4.768027379e-05f, +5.171756103e-04f, +9.293511264e-04f, +9.316349126e-04f, +4.548131826e-04f, -3.138681769e-04f, -1.005224319e-03f, -1.256829962e-03f, -9.140374150e-04f, -1.260819359e-04f, +7.238615871e-04f, +1.219759154e-03f, +1.132363442e-03f, +5.337797449e-04f, -2.542620618e-04f, -8.425700365e-04f, -9.789744964e-04f, -6.616874512e-04f, -1.087794048e-04f, +3.832435974e-04f, +6.008696396e-04f, +5.051660376e-04f, +2.159176551e-04f, -8.342714677e-05f, -2.529583551e-04f, -2.551982542e-04f, -1.451923846e-04f, -1.459867564e-05f, +6.714293286e-05f, +8.119545879e-05f, +5.071287250e-05f, +1.209074997e-05f, -1.047916587e-05f, -1.338505782e-05f,\n    /*  3, 5 (48) */\n    +3.396829272e-04f, +1.924084059e-04f, -3.631347541e-04f, -1.301640565e-03f, -2.299651682e-03f, -2.753983463e-03f, -1.987458079e-03f, +3.901356165e-04f, +4.101353828e-03f, +8.002377430e-03f, +1.024893978e-02f, +8.889272488e-03f, +2.757058237e-03f, -7.645805310e-03f, -1.967387845e-02f, -2.879505426e-02f, -2.967111571e-02f, -1.783178223e-02f, +8.573537759e-03f, +4.758398826e-02f, +9.331731071e-02f, +1.371279435e-01f, +1.697761591e-01f, +1.839664128e-01f, +1.764410349e-01f, +1.489336266e-01f, +1.076604390e-01f, +6.152170242e-02f, +1.961443971e-02f, -1.113443096e-02f, -2.749060270e-02f, -3.019879725e-02f, -2.308511533e-02f, -1.141225626e-02f, -1.158055773e-04f, +7.501923774e-03f, +1.029070961e-02f, +8.979168103e-03f, +5.376566766e-03f, +1.442963148e-03f, -1.420708864e-03f, -2.673390924e-03f, -2.533239361e-03f, -1.631013365e-03f, -6.240301247e-04f, +6.651824963e-05f, +3.298780782e-04f, +2.842578627e-04f,\n    -4.727250007e-07f, +1.026599884e-05f, +2.398312798e-05f, +3.273937254e-05f, +2.659930036e-05f, -1.066831678e-06f, -4.766932167e-05f, -9.809761845e-05f, -1.269915428e-04f, -1.075578371e-04f, -2.477201947e-05f, +1.121359191e-04f, +2.642051807e-04f, +3.689911742e-04f, +3.590403383e-04f, +1.877070282e-04f, -1.468653409e-04f, -5.898210613e-04f, -1.036756339e-03f, -1.360354815e-03f, -1.449192291e-03f, -1.245812685e-03f, -7.701986314e-04f, -1.191679313e-04f, +5.594176131e-04f, +1.109590290e-03f, +1.412960956e-03f, +1.421723547e-03f, +1.168273555e-03f, +7.493099823e-04f, +2.913294552e-04f, -8.954578688e-05f, -3.195668788e-04f, -3.815692209e-04f, -3.090990316e-04f, -1.654962695e-04f, -1.753627284e-05f, +8.638373006e-05f, +1.269060919e-04f, +1.119011921e-04f, +6.569864863e-05f, +1.544547346e-05f, -1.962999545e-05f, -3.277444107e-05f, -2.805590700e-05f, -1.496144545e-05f, -2.572314865e-06f, +4.112779054e-06f,\n    -7.195239305e-04f, -9.353237483e-04f, -3.043372319e-04f, +1.554470653e-03f, +4.143275275e-03f, +5.845389617e-03f, +4.549072714e-03f, -9.099515406e-04f, -9.264392218e-03f, -1.646836510e-02f, -1.727066569e-02f, -8.325041607e-03f, +8.831136085e-03f, +2.705892191e-02f, +3.634459427e-02f, +2.911910692e-02f, +5.373650814e-03f, -2.570699678e-02f, -4.927757730e-02f, -5.225312887e-02f, -3.074699937e-02f, +6.838158244e-03f, +4.327673456e-02f, +6.106201633e-02f, +5.149086464e-02f, +1.925735928e-02f, -2.002988343e-02f, -4.800687203e-02f, -5.283829268e-02f, -3.460676859e-02f, -4.194447812e-03f, +2.321312110e-02f, +3.604544636e-02f, +3.138004003e-02f, +1.486802971e-02f, -3.610854368e-03f, -1.556652435e-02f, -1.763393539e-02f, -1.188657869e-02f, -3.350739662e-03f, +3.289075041e-03f, +5.851539792e-03f, +4.870604520e-03f, +2.340462970e-03f, +1.456387045e-04f, -8.580175499e-04f, -8.381090321e-04f, -4.148558973e-04f,\n    +1.319236015e-05f, -2.754913188e-06f, -3.798182344e-05f, -7.471836679e-05f, -7.832095665e-05f, -1.813731700e-05f, +1.024647908e-04f, +2.286848653e-04f, +2.704734651e-04f, +1.543228943e-04f, -1.151961420e-04f, -4.271315862e-04f, -6.014772487e-04f, -4.863143052e-04f, -6.445985719e-05f, +5.002336227e-04f, +9.216803928e-04f, +9.391108251e-04f, +4.757245889e-04f, -2.888828959e-04f, -9.887438369e-04f, -1.257919916e-03f, -9.330226906e-04f, -1.539708695e-04f, +7.007753656e-04f, +1.212633655e-03f, +1.143986344e-03f, +5.574296133e-04f, -2.307979033e-04f, -8.303088519e-04f, -9.822381595e-04f, -6.766855115e-04f, -1.266144987e-04f, +3.713168784e-04f, +5.990855072e-04f, +5.119943527e-04f, +2.260492410e-04f, -7.554692499e-05f, -2.502775821e-04f, -2.572770162e-04f, -1.494120619e-04f, -1.818069976e-05f, +6.564741609e-05f, +8.161779110e-05f, +5.196580074e-05f, +1.312669022e-05f, -1.009965468e-05f, -1.351023705e-05f,\n    /*  3, 6 (48) */\n    +3.392102022e-04f, +2.026744047e-04f, -3.391516261e-04f, -1.268901192e-03f, -2.273052382e-03f, -2.755050294e-03f, -2.035127401e-03f, +2.920379980e-04f, +3.974362285e-03f, +7.894819592e-03f, +1.022416777e-02f, +9.001408407e-03f, +3.021263418e-03f, -7.276814136e-03f, -1.931483811e-02f, -2.860734723e-02f, -2.981798105e-02f, -1.842160329e-02f, +7.536781420e-03f, +4.622363344e-02f, +9.186811842e-02f, +1.358821308e-01f, +1.690059605e-01f, +1.838472449e-01f, +1.770004525e-01f, +1.500432169e-01f, +1.090734000e-01f, +6.294342596e-02f, +2.078271327e-02f, -1.038512098e-02f, -2.719927325e-02f, -3.028834304e-02f, -2.340468221e-02f, -1.179382548e-02f, -4.249046089e-04f, +7.336427504e-03f, +1.027317334e-02f, +9.065551833e-03f, +5.503472858e-03f, +1.554864340e-03f, -1.355010216e-03f, -2.657945450e-03f, -2.552869356e-03f, -1.663787806e-03f, -6.520860317e-04f, +5.155680418e-05f, +3.273057633e-04f, +2.883706418e-04f,\n    -7.112032361e-07f, +9.855206040e-06f, +2.357875726e-05f, +3.264151887e-05f, +2.710054154e-05f, +1.288219903e-07f, -4.604437911e-05f, -9.669978219e-05f, -1.266960993e-04f, -1.090972631e-04f, -2.830211710e-05f, +1.073519189e-04f, +2.598063079e-04f, +3.671273824e-04f, +3.616452175e-04f, +1.956641385e-04f, -1.343388010e-04f, -5.752801377e-04f, -1.023991514e-03f, -1.353319360e-03f, -1.450725344e-03f, -1.256604192e-03f, -7.883896686e-04f, -1.407695631e-04f, +5.393960823e-04f, +1.095674065e-03f, +1.407900393e-03f, +1.425780546e-03f, +1.179320741e-03f, +7.636652355e-04f, +3.049954720e-04f, -7.968398176e-05f, -3.149782048e-04f, -3.819449340e-04f, -3.128058986e-04f, -1.703680708e-04f, -2.167520746e-05f, +8.407257635e-05f, +1.265775157e-04f, +1.129899195e-04f, +6.733312003e-05f, +1.685545253e-05f, -1.886280976e-05f, -3.267567353e-05f, -2.838383397e-05f, -1.539901900e-05f, -2.886233797e-06f, +4.003341125e-06f,\n    -7.063315703e-04f, -9.380786615e-04f, -3.423190553e-04f, +1.479752286e-03f, +4.064954319e-03f, +5.827252300e-03f, +4.651537505e-03f, -6.812666753e-04f, -8.993918753e-03f, -1.631404221e-02f, -1.738586183e-02f, -8.752173193e-03f, +8.229658837e-03f, +2.657260760e-02f, +3.628013442e-02f, +2.961934054e-02f, +6.295331207e-03f, -2.476788595e-02f, -4.880185272e-02f, -5.254201177e-02f, -3.173574321e-02f, +5.580238328e-03f, +4.234371187e-02f, +6.090804546e-02f, +5.219164000e-02f, +2.046999293e-02f, -1.888589709e-02f, -4.744944242e-02f, -5.306909058e-02f, -3.543707744e-02f, -5.176685972e-03f, +2.253643559e-02f, +3.591883186e-02f, +3.175135691e-02f, +1.546711522e-02f, -3.098860015e-03f, -1.534047511e-02f, -1.770948231e-02f, -1.213685627e-02f, -3.608016678e-03f, +3.139662979e-03f, +5.833359092e-03f, +4.936251936e-03f, +2.422080761e-03f, +1.976045052e-04f, -8.448908597e-04f, -8.482086868e-04f, -4.283661344e-04f,\n    +1.336098404e-05f, -1.930354200e-06f, -3.671014137e-05f, -7.387160839e-05f, -7.907108373e-05f, -2.107759459e-05f, +9.819774306e-05f, +2.255246866e-04f, +2.713187798e-04f, +1.605706006e-04f, -1.053011715e-04f, -4.184802618e-04f, -5.998706843e-04f, -4.949312534e-04f, -8.108892828e-05f, +4.831498493e-04f, +9.135991424e-04f, +9.460946405e-04f, +4.963252740e-04f, -2.638345942e-04f, -9.718250891e-04f, -1.258403080e-03f, -9.515434587e-04f, -1.817823486e-04f, +6.773383576e-04f, +1.204914861e-03f, +1.155081271e-03f, +5.808762122e-04f, -2.071376851e-04f, -8.175886110e-04f, -9.850356039e-04f, -6.914377299e-04f, -1.445077386e-04f, +3.591109445e-04f, +5.969798764e-04f, +5.186228688e-04f, +2.361694382e-04f, -6.753371491e-05f, -2.474248378e-04f, -2.592404393e-04f, -1.536109821e-04f, -2.181355622e-05f, +6.408192298e-05f, +8.199446477e-05f, +5.321091650e-05f, +1.417974247e-05f, -9.699627145e-06f, -1.362524182e-05f,\n    /*  3, 7 (48) */\n    +3.384989990e-04f, +2.125296108e-04f, -3.155728688e-04f, -1.236259674e-03f, -2.245951840e-03f, -2.754921472e-03f, -2.081171780e-03f, +1.953382158e-04f, +3.847666186e-03f, +7.785722329e-03f, +1.019586565e-02f, +9.108760326e-03f, +3.281069726e-03f, -6.909686753e-03f, -1.895319289e-02f, -2.841168309e-02f, -2.995231985e-02f, -1.899688343e-02f, +6.512789906e-03f, +4.487031408e-02f, +9.041739307e-02f, +1.346255266e-01f, +1.682175708e-01f, +1.837064753e-01f, +1.775398486e-01f, +1.511388909e-01f, +1.104813004e-01f, +6.436920651e-02f, +2.196203401e-02f, -9.621455742e-03f, -2.689427778e-02f, -3.036802702e-02f, -2.371966041e-02f, -1.217577041e-02f, -7.377105075e-04f, +7.166059434e-03f, +1.025149813e-02f, +9.149624410e-03f, +5.630050374e-03f, +1.667854260e-03f, -1.287677096e-03f, -2.641089998e-03f, -2.571732166e-03f, -1.696463480e-03f, -6.804698657e-04f, +3.615778519e-05f, +3.244195295e-04f, +2.923739829e-04f,\n    -9.431530473e-07f, +9.447910213e-06f, +2.317004037e-05f, +3.252916038e-05f, +2.758009056e-05f, +1.304645589e-06f, -4.442473797e-05f, -9.528197147e-05f, -1.263532515e-04f, -1.105729513e-04f, -3.177609154e-05f, +1.025864097e-04f, +2.553639164e-04f, +3.651517933e-04f, +3.640896352e-04f, +2.034562514e-04f, -1.219248981e-04f, -5.607488983e-04f, -1.011108915e-03f, -1.346052953e-03f, -1.451967164e-03f, -1.267121457e-03f, -8.064010613e-04f, -1.623385964e-04f, +5.192504775e-04f, +1.081513561e-03f, +1.402545559e-03f, +1.429573887e-03f, +1.190200104e-03f, +7.779793207e-04f, +3.187373323e-04f, -6.967147102e-05f, -3.102208145e-04f, -3.821851813e-04f, -3.164408930e-04f, -1.752353437e-04f, -2.585857515e-05f, +8.169732682e-05f, +1.261927572e-04f, +1.140471018e-04f, +6.896357953e-05f, +1.828092849e-05f, -1.807329880e-05f, -3.255876525e-05f, -2.870331762e-05f, -1.583741601e-05f, -3.206055989e-06f, +3.887741319e-06f,\n    -6.929705863e-04f, -9.400090157e-04f, -3.790291967e-04f, +1.405880678e-03f, +3.985883235e-03f, +5.806174705e-03f, +4.749735248e-03f, -4.557419887e-04f, -8.722599973e-03f, -1.615347161e-02f, -1.749116300e-02f, -9.170653454e-03f, +7.629788152e-03f, +2.607767635e-02f, +3.619904549e-02f, +3.010249039e-02f, +7.208930350e-03f, -2.382179131e-02f, -4.830552744e-02f, -5.280584636e-02f, -3.270756830e-02f, +4.321835247e-03f, +4.139216841e-02f, +6.072626311e-02f, +5.286897836e-02f, +2.167490780e-02f, -1.773081582e-02f, -4.686856621e-02f, -5.327622826e-02f, -3.625466605e-02f, -6.161721576e-03f, +2.184499786e-02f, +3.577432412e-02f, +3.211046785e-02f, +1.606409509e-02f, -2.580237146e-03f, -1.510430567e-02f, -1.777701603e-02f, -1.238428111e-02f, -3.867257117e-03f, +2.986051997e-03f, +5.811545536e-03f, +5.000333859e-03f, +2.504075226e-03f, +2.508154217e-04f, -8.307111173e-04f, -8.579083139e-04f, -4.419913762e-04f,\n    +1.351207367e-05f, -1.126549914e-06f, -3.544241166e-05f, -7.299351605e-05f, -7.975667761e-05f, -2.395346008e-05f, +9.394195902e-05f, +2.222838567e-04f, +2.720046459e-04f, +1.666573908e-04f, -9.545894178e-05f, -4.096984102e-04f, -5.979730964e-04f, -5.032305666e-04f, -9.755980851e-05f, +4.659339923e-04f, +9.051136635e-04f, +9.525849697e-04f, +5.166059077e-04f, -2.387361456e-04f, -9.544776028e-04f, -1.258280144e-03f, -9.695907853e-04f, -2.095023907e-04f, +6.535621626e-04f, +1.196605909e-03f, +1.165641565e-03f, +6.041071003e-04f, -1.832927891e-04f, -8.044139162e-04f, -9.873630894e-04f, -7.059350357e-04f, -1.624501163e-04f, +3.466302178e-04f, +5.945512379e-04f, +5.250461533e-04f, +2.462725265e-04f, -5.939056664e-05f, -2.443996772e-04f, -2.610858231e-04f, -1.577862775e-04f, -2.549575523e-05f, +6.244626716e-05f, +8.232434518e-05f, +5.444713427e-05f, +1.524945968e-05f, -9.278914423e-06f, -1.372967500e-05f,\n    /*  3, 8 (48) */\n    +3.375558459e-04f, +2.219775210e-04f, -2.924028285e-04f, -1.203730513e-03f, -2.218371750e-03f, -2.753616827e-03f, -2.125596518e-03f, +1.000562444e-04f, +3.721312934e-03f, +7.675149378e-03f, +1.016408956e-02f, +9.211346736e-03f, +3.536433642e-03f, -6.544534960e-03f, -1.858910326e-02f, -2.820822684e-02f, -3.007424475e-02f, -1.955763232e-02f, +5.501680991e-03f, +4.352426113e-02f, +8.896542591e-02f, +1.333584052e-01f, +1.674111697e-01f, +1.835441367e-01f, +1.780590990e-01f, +1.522204045e-01f, +1.118838460e-01f, +6.579878040e-02f, +2.315223411e-02f, -8.843476421e-03f, -2.657554044e-02f, -3.043769849e-02f, -2.402988123e-02f, -1.255795560e-02f, -1.054151401e-03f, +6.990824090e-03f, +1.022563956e-02f, +9.231321737e-03f, +5.756243131e-03f, +1.781901362e-03f, -1.218713516e-03f, -2.622809069e-03f, -2.589805465e-03f, -1.729022245e-03f, -7.091731833e-04f, +2.032036918e-05f, +3.212134736e-04f, +2.962617242e-04f,\n    -1.168558256e-06f, +9.044283303e-06f, +2.275727877e-05f, +3.240260206e-05f, +2.803806407e-05f, +2.460396421e-06f, -4.281104231e-05f, -9.384506926e-05f, -1.259637630e-04f, -1.119851055e-04f, -3.519325555e-05f, +9.784099981e-05f, +2.508801606e-04f, +3.630663859e-04f, +3.663745517e-04f, +2.110826698e-04f, -1.096261208e-04f, -5.462311107e-04f, -9.981125244e-04f, -1.338558509e-03f, -1.452918539e-03f, -1.277362709e-03f, -8.242288710e-04f, -1.838700421e-04f, +4.989853661e-04f, +1.067111595e-03f, +1.396896783e-03f, +1.433101487e-03f, +1.200907975e-03f, +7.922482224e-04f, +3.325518869e-04f, -5.950975647e-05f, -3.052944180e-04f, -3.822883300e-04f, -3.200018341e-04f, -1.800961712e-04f, -3.008526632e-05f, +7.925814052e-05f, +1.257512449e-04f, +1.150718556e-04f, +7.058924562e-05f, +1.972147714e-05f, -1.726148731e-05f, -3.242346883e-05f, -2.901403414e-05f, -1.627639872e-05f, -3.531699954e-06f, +3.765928427e-06f,\n    -6.794585126e-04f, -9.411355656e-04f, -4.144716084e-04f, +1.332887162e-03f, +3.906126557e-03f, +5.782221245e-03f, +4.843677207e-03f, -2.334581321e-04f, -8.450595327e-03f, -1.598681422e-02f, -1.758662195e-02f, -9.580351865e-03f, +7.031815056e-03f, +2.557444578e-02f, +3.610148568e-02f, +3.056842438e-02f, +8.114044013e-03f, -2.286920634e-02f, -4.778892153e-02f, -5.304458251e-02f, -3.366204590e-02f, +3.063555103e-03f, +4.042257762e-02f, +6.051676072e-02f, +5.352254052e-02f, +2.287151370e-02f, -1.656517425e-02f, -4.626445911e-02f, -5.345952105e-02f, -3.705907997e-02f, -7.149084665e-03f, +2.113906282e-02f, +3.561187401e-02f, +3.245709807e-02f, +1.665864633e-02f, -2.055190993e-03f, -1.485803315e-02f, -1.783640660e-02f, -1.262868078e-02f, -4.128342940e-03f, +2.828265719e-03f, +5.786049781e-03f, +5.062780126e-03f, +2.586399571e-03f, +3.052625560e-04f, -8.154616576e-04f, -8.671872283e-04f, -4.557210512e-04f,\n    +1.364594403e-05f, -3.436649713e-07f, -3.417949566e-05f, -7.208531271e-05f, -8.037843185e-05f, -2.676414031e-05f, +8.969986767e-05f, +2.189653917e-04f, +2.725326564e-04f, +1.725816699e-04f, -8.567434117e-05f, -4.007920296e-04f, -5.957879751e-04f, -5.112102807e-04f, -1.138649555e-04f, +4.485957701e-04f, +8.962304303e-04f, +9.585806927e-04f, +5.365573630e-04f, -2.136004132e-04f, -9.367111105e-04f, -1.257552114e-03f, -9.871559923e-04f, -2.371170630e-04f, +6.294585642e-04f, +1.187710250e-03f, +1.175660842e-03f, +6.271099183e-04f, -1.592747329e-04f, -7.907896309e-04f, -9.892171113e-04f, -7.201684470e-04f, -1.804325406e-04f, +3.338793035e-04f, +5.917982521e-04f, +5.312588432e-04f, +2.563527416e-04f, -5.112063874e-05f, -2.412017540e-04f, -2.628105067e-04f, -1.619350567e-04f, -2.922575262e-05f, +6.074030726e-05f, +8.260631152e-05f, +5.567335481e-05f, +1.633537227e-05f, -8.837361929e-06f, -1.382314016e-05f,\n    /*  3, 9 (48) */\n    +3.363872877e-04f, +2.310218043e-04f, -2.696455497e-04f, -1.171327911e-03f, -2.190333686e-03f, -2.751156430e-03f, -2.168407560e-03f, +6.211175117e-06f, +3.595349171e-03f, +7.563164272e-03f, +1.012889630e-02f, +9.309187736e-03f, +3.787313803e-03f, -6.181468574e-03f, -1.822272871e-02f, -2.799714417e-02f, -3.018387087e-02f, -2.010386343e-02f, +4.503568467e-03f, +4.218570262e-02f, +8.751250737e-02f, +1.320810425e-01f, +1.665869409e-01f, +1.833602667e-01f, +1.785580844e-01f, +1.532875161e-01f, +1.132807427e-01f, +6.723188188e-02f, +2.435314209e-02f, -8.051228198e-03f, -2.624298856e-02f, -3.049720825e-02f, -2.433517564e-02f, -1.294024393e-02f, -1.374153235e-03f, +6.810727919e-03f, +1.019555429e-02f, +9.310579877e-03f, +5.881994376e-03f, +1.896973217e-03f, -1.148124270e-03f, -2.603087592e-03f, -2.607066952e-03f, -1.761445714e-03f, -7.381872174e-04f, +4.043970461e-06f, +3.176817736e-04f, +3.000276527e-04f,\n    -1.387406987e-06f, +8.644492266e-06f, +2.234077122e-05f, +3.226215150e-05f, +2.847458756e-05f, +3.595844583e-06f, -4.120392496e-05f, -9.238995567e-05f, -1.255284079e-04f, -1.133339535e-04f, -3.855295216e-05f, +9.311727215e-05f, +2.463571875e-04f, +3.608731577e-04f, +3.685009711e-04f, +2.185427537e-04f, -9.744490656e-05f, -5.317305164e-04f, -9.850063393e-04f, -1.330838993e-03f, -1.453580330e-03f, -1.287326252e-03f, -8.418692126e-04f, -2.053589224e-04f, +4.786053506e-04f, +1.052471054e-03f, +1.390954474e-03f, +1.436361328e-03f, +1.211440714e-03f, +8.064679161e-04f, +3.464359449e-04f, -4.920039709e-05f, -3.001987772e-04f, -3.822527779e-04f, -3.234865456e-04f, -1.849486176e-04f, -3.435414183e-05f, +7.675520442e-05f, +1.252524243e-04f, +1.160633002e-04f, +7.220932865e-05f, +2.117666142e-05f, -1.642741121e-05f, -3.226954245e-05f, -2.931565927e-05f, -1.671572506e-05f, -3.863079261e-06f, +3.637854360e-06f,\n    -6.658125686e-04f, -9.414792306e-04f, -4.486511040e-04f, +1.260801849e-03f, +3.825748126e-03f, +5.755457105e-03f, +4.933377074e-03f, -1.449274037e-05f, -8.178062671e-03f, -1.581423255e-02f, -1.767229629e-02f, -9.981143894e-03f, +6.436027081e-03f, +2.506323550e-02f, +3.598762072e-02f, +3.101702015e-02f, +9.010274443e-03f, -2.191062565e-02f, -4.725236417e-02f, -5.325818292e-02f, -3.459875701e-02f, +1.806002989e-03f, +3.943542163e-02f, +6.027964365e-02f, +5.415199909e-02f, +2.405922395e-02f, -1.538951341e-02f, -4.563734919e-02f, -5.361879579e-02f, -3.784986960e-02f, -8.138301776e-03f, +2.041889438e-02f, +3.543144146e-02f, +3.279097737e-02f, +1.725044458e-02f, -1.523932150e-03f, -1.460168041e-02f, -1.788752723e-02f, -1.286988254e-02f, -4.391153447e-03f, +2.666330662e-03f, +5.756824028e-03f, +5.123520433e-03f, +2.669005882e-03f, +3.609359108e-04f, -7.991262853e-04f, -8.760245903e-04f, -4.695441913e-04f,\n    +1.376291828e-05f, +4.181563958e-07f, -3.292223457e-05f, -7.114822141e-05f, -8.093707251e-05f, -2.950891663e-05f, +8.547385565e-05f, +2.155723173e-04f, +2.729044808e-04f, +1.783419554e-04f, -7.595217688e-05f, -3.917671351e-04f, -5.933189432e-04f, -5.188686224e-04f, -1.299969664e-04f, +4.311449117e-04f, +8.869560984e-04f, +9.640809589e-04f, +5.561707202e-04f, -1.884402431e-04f, -9.185355443e-04f, -1.256220314e-03f, -1.004230662e-03f, -2.646124904e-04f, +6.050395244e-04f, +1.178231646e-03f, +1.185132988e-03f, +6.498723961e-04f, -1.350951634e-04f, -7.767208785e-04f, -9.905944033e-04f, -7.341290765e-04f, -1.984458425e-04f, +3.208629886e-04f, +5.887197505e-04f, +5.372556494e-04f, +2.664042772e-04f, -4.272719737e-05f, -2.378308219e-04f, -2.644118708e-04f, -1.660544062e-04f, -3.300195016e-05f, +5.896394766e-05f, +8.283925787e-05f, +5.688846585e-05f, +1.743698814e-05f, -8.374829719e-06f, -1.390524188e-05f,\n    /*  3,10 (48) */\n    +3.349998807e-04f, +2.396662965e-04f, -2.473047785e-04f, -1.139065760e-03f, -2.161859098e-03f, -2.747560586e-03f, -2.209611485e-03f, -8.617878055e-05f, +3.469820763e-03f, +7.449830319e-03f, +1.009034335e-02f, +9.402305008e-03f, +4.033670990e-03f, -5.820595416e-03f, -1.785422774e-02f, -2.777860141e-02f, -3.028131578e-02f, -2.063559395e-02f, +3.518562128e-03f, +4.085486363e-02f, +8.605892704e-02f, +1.307937162e-01f, +1.657450717e-01f, +1.831549078e-01f, +1.790366898e-01f, +1.543399871e-01f, +1.146716972e-01f, +6.866824321e-02f, +2.556458280e-02f, -7.244760282e-03f, -2.589655261e-02f, -3.054640865e-02f, -2.463537442e-02f, -1.332249670e-02f, -1.697639780e-03f, +6.625779301e-03f, +1.016120015e-02f, +9.387335081e-03f, +6.007246800e-03f, +2.013036517e-03f, -1.075914942e-03f, -2.581910930e-03f, -2.623494363e-03f, -1.793715256e-03f, -7.675028767e-04f, -1.267175460e-05f, +3.138186943e-04f, +3.036655070e-04f,\n    -1.599691615e-06f, +8.248699053e-06f, +2.192081377e-05f, +3.210811875e-05f, +2.888979521e-05f, +4.710772911e-06f, -3.960400736e-05f, -9.091750758e-05f, -1.250479701e-04f, -1.146197461e-04f, -4.185455463e-05f, +8.841678412e-05f, +2.417971359e-04f, +3.585741237e-04f, +3.704699399e-04f, +2.258359200e-04f, -8.538364049e-05f, -5.172508300e-04f, -9.717943669e-04f, -1.322897423e-03f, -1.453953477e-03f, -1.297010470e-03f, -8.593182563e-04f, -2.268002720e-04f, +4.581150677e-04f, +1.037594893e-03f, +1.384719120e-03f, +1.439351461e-03f, +1.221794714e-03f, +8.206343697e-04f, +3.603862744e-04f, -3.874500880e-05f, -2.949337063e-04f, -3.820769545e-04f, -3.268928558e-04f, -1.897907297e-04f, -3.866403314e-05f, +7.418873365e-05f, +1.246957586e-04f, +1.170205588e-04f, +7.382303112e-05f, +2.264603142e-05f, -1.557111780e-05f, -3.209675012e-05f, -2.960786843e-05f, -1.715514875e-05f, -4.200102517e-06f, +3.503474237e-06f,\n    -6.520496503e-04f, -9.410610742e-04f, -4.815733386e-04f, +1.189653627e-03f, +3.744811053e-03f, +5.725948188e-03f, +5.018850930e-03f, +2.010795769e-04f, -7.905158190e-03f, -1.563589059e-02f, -1.774824846e-02f, -1.037291103e-02f, +5.842708137e-03f, +2.454436688e-02f, +3.585762376e-02f, +3.144816507e-02f, +9.897230542e-03f, -2.094654469e-02f, -4.669619345e-02f, -5.344662316e-02f, -3.551729255e-02f, +5.497826750e-04f, +3.843119097e-02f, +6.001503116e-02f, +5.475703861e-02f, +2.523745560e-02f, -1.420438042e-02f, -4.498747679e-02f, -5.375389095e-02f, -3.862659048e-02f, -9.128896180e-03f, +1.968476530e-02f, +3.523299562e-02f, +3.311184036e-02f, +1.783916434e-02f, -9.866765005e-04f, -1.433527613e-02f, -1.793025443e-02f, -1.310771336e-02f, -4.655565318e-03f, +2.500276256e-03f, +5.723822078e-03f, +5.182484381e-03f, +2.751845140e-03f, +4.178243766e-04f, -7.816892972e-04f, -8.843994200e-04f, -4.834494332e-04f,\n    +1.386332733e-05f, +1.158790106e-06f, -3.167144923e-05f, -7.018346438e-05f, -8.143335712e-05f, -3.218712466e-05f, +8.126626625e-05f, +2.121076666e-04f, +2.731218630e-04f, +1.839368776e-04f, -6.629717269e-05f, -3.826297553e-04f, -5.905697532e-04f, -5.262040092e-04f, -1.459485814e-04f, +4.135911510e-04f, +8.772975004e-04f, +9.690851856e-04f, +5.754372713e-04f, -1.632684572e-04f, -8.999610301e-04f, -1.254286383e-03f, -1.020806642e-03f, -2.919748629e-04f, +5.803171765e-04f, +1.168174171e-03f, +1.194052169e-03f, +6.723823597e-04f, -1.107658511e-04f, -7.622130399e-04f, -9.914919407e-04f, -7.478081370e-04f, -2.164807795e-04f, +3.075862399e-04f, +5.853147382e-04f, +5.430313600e-04f, +2.764212891e-04f, -3.421361529e-05f, -2.342867362e-04f, -2.658873395e-04f, -1.701413919e-04f, -3.682269594e-05f, +5.711713924e-05f, +8.302209420e-05f, +5.809134268e-05f, +1.855379262e-05f, -7.891192903e-06f, -1.397558619e-05f,\n    /*  3,11 (48) */\n    +3.334001891e-04f, +2.479149956e-04f, -2.253839647e-04f, -1.106957641e-03f, -2.132969303e-03f, -2.742849813e-03f, -2.249215493e-03f, -1.770962881e-04f, +3.344772793e-03f, +7.335210573e-03f, +1.004848879e-02f, +9.490721792e-03f, +4.275468126e-03f, -5.462021293e-03f, -1.748375780e-02f, -2.755276549e-02f, -3.036669942e-02f, -2.115284478e-02f, +2.546767761e-03f, +3.953196621e-02f, +8.460497356e-02f, +1.294967058e-01f, +1.648857534e-01f, +1.829281075e-01f, +1.794948048e-01f, +1.553775820e-01f, +1.160564163e-01f, +7.010759467e-02f, +2.678637751e-02f, -6.424125913e-03f, -2.553616634e-02f, -3.058515366e-02f, -2.493030813e-02f, -1.370457366e-02f, -2.024532636e-03f, +6.435988572e-03f, +1.012253612e-02f, +9.461523815e-03f, +6.131942559e-03f, +2.130057076e-03f, -1.002091911e-03f, -2.559264899e-03f, -2.639065481e-03f, -1.825812007e-03f, -7.971107451e-04f, -2.982690335e-05f, +3.096185918e-04f, +3.071689813e-04f,\n    -1.805408701e-06f, +7.857060596e-06f, +2.149769957e-05f, +3.194081607e-05f, +2.928382971e-05f, +5.804976927e-06f, -3.801189943e-05f, -8.942859827e-05f, -1.245232433e-04f, -1.158427570e-04f, -4.509746638e-05f, +8.374106713e-05f, +2.372021356e-04f, +3.561713154e-04f, +3.722825470e-04f, +2.329616422e-04f, -7.344465519e-05f, -5.027957374e-04f, -9.584806249e-04f, -1.314736864e-03f, -1.454038996e-03f, -1.306413829e-03f, -8.765722283e-04f, -2.481891397e-04f, +4.375191867e-04f, +1.022486136e-03f, +1.378191292e-03f, +1.442070000e-03f, +1.231966404e-03f, +8.347435446e-04f, +3.743996030e-04f, -2.814526430e-05f, -2.894990723e-04f, -3.817593219e-04f, -3.302185990e-04f, -1.946205367e-04f, -4.301374243e-05f, +7.155897168e-05f, +1.240807285e-04f, +1.179427581e-04f, +7.542954791e-05f, +2.412912441e-05f, -1.469266580e-05f, -3.190486185e-05f, -2.989033697e-05f, -1.759441937e-05f, -4.542673343e-06f, +3.362746456e-06f,\n    -6.381863229e-04f, -9.399022841e-04f, -5.132447878e-04f, +1.119470163e-03f, +3.663377696e-03f, +5.693761064e-03f, +5.100117196e-03f, +4.131872435e-04f, -7.632036327e-03f, -1.545195372e-02f, -1.781454564e-02f, -1.075554078e-02f, +5.252138384e-03f, +2.401816287e-02f, +3.571167518e-02f, +3.186175622e-02f, +1.077452804e-02f, -1.997745950e-02f, -4.612075618e-02f, -5.360989162e-02f, -3.641725358e-02f, -7.045037083e-04f, +3.741038433e-02f, +5.972305630e-02f, +5.533735579e-02f, +2.640562977e-02f, -1.301032825e-02f, -4.431509443e-02f, -5.386465680e-02f, -3.938880352e-02f, -1.012038812e-02f, +1.893695716e-02f, +3.501651484e-02f, +3.341942660e-02f, +1.842447907e-02f, -4.436451405e-04f, -1.405885484e-02f, -1.796446805e-02f, -1.334200010e-02f, -4.921452657e-03f, +2.330134864e-03f, +5.686999382e-03f, +5.239601520e-03f, +2.834867234e-03f, +4.759157193e-04f, -7.631355045e-04f, -8.922906129e-04f, -4.974250194e-04f,\n    +1.394750936e-05f, +1.878131958e-06f, -3.042793978e-05f, -6.919226211e-05f, -8.186807367e-05f, -3.479815397e-05f, +7.707939839e-05f, +2.085744781e-04f, +2.731866196e-04f, +1.893651790e-04f, -5.671396693e-05f, -3.733859286e-04f, -5.875442840e-04f, -5.332150490e-04f, -1.617126870e-04f, +3.959442215e-04f, +8.672616412e-04f, +9.735930579e-04f, +5.943485240e-04f, -1.380978459e-04f, -8.809978815e-04f, -1.251752275e-03f, -1.036876048e-03f, -3.191904429e-04f, +5.553038192e-04f, +1.157542210e-03f, +1.202412830e-03f, +6.946277381e-04f, -8.629868392e-05f, -7.472717518e-04f, -9.919069428e-04f, -7.611969468e-04f, -2.345280409e-04f, +2.940542028e-04f, +5.815823955e-04f, +5.485808445e-04f, +2.863978978e-04f, -2.558337091e-05f, -2.305694545e-04f, -2.672343829e-04f, -1.741930608e-04f, -4.068628472e-05f, +5.519988007e-05f, +8.315374743e-05f, +5.928084880e-05f, +1.968524855e-05f, -7.386342037e-06f, -1.403378090e-05f,\n    /*  3,12 (48) */\n    +3.315947804e-04f, +2.557720562e-04f, -2.038862651e-04f, -1.075016825e-03f, -2.103685473e-03f, -2.737044836e-03f, -2.287227392e-03f, -2.665248864e-04f, +3.220249550e-03f, +7.219367816e-03f, +1.000339133e-02f, +9.574462859e-03f, +4.512670262e-03f, -5.105849977e-03f, -1.711147525e-02f, -2.731980385e-02f, -3.044014407e-02f, -2.165564052e-02f, +1.588287136e-03f, +3.821722934e-02f, +8.315093457e-02f, +1.281902919e-01f, +1.640091812e-01f, +1.826799183e-01f, +1.799323240e-01f, +1.564000682e-01f, +1.174346076e-01f, +7.154966467e-02f, +2.801834392e-02f, -5.589382368e-03f, -2.516176673e-02f, -3.061329892e-02f, -2.521980720e-02f, -1.408633298e-02f, -2.354751235e-03f, +6.241368035e-03f, +1.007952237e-02f, +9.533082787e-03f, +6.256023287e-03f, +2.247999834e-03f, -9.266623627e-04f, -2.535135775e-03f, -2.653758147e-03f, -1.857716868e-03f, -8.270010821e-04f, -4.742132272e-05f, +3.050759185e-04f, +3.105317277e-04f,\n    -2.004558929e-06f, +7.469728793e-06f, +2.107171878e-05f, +3.176055781e-05f, +2.965684206e-05f, +6.878264766e-06f, -3.642819940e-05f, -8.792409713e-05f, -1.239550299e-04f, -1.170032827e-04f, -4.828112092e-05f, +7.909162632e-05f, +2.325743066e-04f, +3.536667805e-04f, +3.739399226e-04f, +2.399194504e-04f, -6.163023022e-05f, -4.883688957e-04f, -9.450691397e-04f, -1.306360431e-03f, -1.453837979e-03f, -1.315534869e-03f, -8.936274118e-04f, -2.695205899e-04f, +4.168224081e-04f, +1.007147876e-03f, +1.371371643e-03f, +1.444515133e-03f, +1.241952248e-03f, +8.487913969e-04f, +3.884726189e-04f, -1.740289287e-05f, -2.838947950e-04f, -3.812983756e-04f, -3.334616159e-04f, -1.994360514e-04f, -4.740204284e-05f, +6.886619058e-05f, +1.234068331e-04f, +1.188290291e-04f, +7.702806658e-05f, +2.562546495e-05f, -1.379212554e-05f, -3.169365385e-05f, -3.016274024e-05f, -1.803328241e-05f, -4.890690353e-06f, +3.215632773e-06f,\n    -6.242388136e-04f, -9.380241521e-04f, -5.436727276e-04f, +1.050277901e-03f, +3.581509622e-03f, +5.658962910e-03f, +5.177196595e-03f, +6.217617216e-04f, -7.358849707e-03f, -1.526258854e-02f, -1.787125960e-02f, -1.112892671e-02f, +4.664594100e-03f, +2.348494782e-02f, +3.554996249e-02f, +3.225770044e-02f, +1.164178968e-02f, -1.900386645e-02f, -4.552640766e-02f, -5.374798947e-02f, -3.729825146e-02f, -1.956255983e-03f, +3.637350828e-02f, +5.940386586e-02f, +5.589265961e-02f, +2.756317198e-02f, -1.180791542e-02f, -4.362046669e-02f, -5.395095548e-02f, -4.013607527e-02f, -1.111229506e-02f, +1.817576022e-02f, +3.478198680e-02f, +3.371348080e-02f, +1.900606147e-02f, +1.049357040e-04f, -1.377245694e-02f, -1.799005142e-02f, -1.357256955e-02f, -5.188687040e-03f, +2.155941804e-03f, +5.646313098e-03f, +5.294801400e-03f, +2.918020982e-03f, +5.351965681e-04f, -7.434502560e-04f, -8.996769549e-04f, -5.114588003e-04f,\n    +1.401580941e-05f, +2.576097353e-06f, -2.919248539e-05f, -6.817583254e-05f, -8.224203962e-05f, -3.734144779e-05f, +7.291550570e-05f, +2.049757937e-04f, +2.731006376e-04f, +1.946257141e-04f, -4.720711048e-05f, -3.640416994e-04f, -5.842465376e-04f, -5.399005393e-04f, -1.772823189e-04f, +3.782138509e-04f, +8.568556929e-04f, +9.776045272e-04f, +6.128962056e-04f, -1.129411618e-04f, -8.616565938e-04f, -1.248620255e-03f, -1.052431269e-03f, -3.462455733e-04f, +5.300119093e-04f, +1.146340453e-03f, +1.210209701e-03f, +7.165965704e-04f, -6.170566071e-05f, -7.319029046e-04f, -9.918368755e-04f, -7.742869352e-04f, -2.525782520e-04f, +2.802721994e-04f, +5.775220799e-04f, +5.538990566e-04f, +2.963281919e-04f, -1.684004711e-05f, -2.266790381e-04f, -2.684505191e-04f, -1.782064426e-04f, -4.459095839e-05f, +5.321221614e-05f, +8.323316251e-05f, +6.045583661e-05f, +2.083079621e-05f, -6.860183518e-06f, -1.407943605e-05f,\n    /*  3,13 (48) */\n    +3.295902214e-04f, +2.632417850e-04f, -1.828145464e-04f, -1.043256267e-03f, -2.074028631e-03f, -2.730166571e-03f, -2.323655591e-03f, -3.544489835e-04f, +3.096294520e-03f, +7.102364533e-03f, +9.955110207e-03f, +9.653554485e-03f, +4.745244568e-03f, -4.752183197e-03f, -1.673753533e-02f, -2.707988440e-02f, -3.050177430e-02f, -2.214400941e-02f, +6.432179961e-04f, +3.691086891e-02f, +8.169709659e-02f, +1.268747571e-01f, +1.631155538e-01f, +1.824103978e-01f, +1.803491464e-01f, +1.574072160e-01f, +1.188059793e-01f, +7.299417980e-02f, +2.926029617e-02f, -4.740590971e-03f, -2.477329412e-02f, -3.063070181e-02f, -2.550370200e-02f, -1.446763136e-02f, -2.688212851e-03f, +6.041931983e-03f, +1.003212033e-02f, +9.601948977e-03f, +6.379430120e-03f, +2.366828863e-03f, -8.496342961e-04f, -2.509510310e-03f, -2.667550273e-03f, -1.889410522e-03f, -8.571638223e-04f, -6.545460513e-05f, +3.001852281e-04f, +3.137473605e-04f,\n    -2.197147050e-06f, +7.086850493e-06f, +2.064315845e-05f, +3.156766014e-05f, +3.000899140e-05f, +7.930457114e-06f, -3.485349373e-05f, -8.640486925e-05f, -1.233441411e-04f, -1.181016416e-04f, -5.140498176e-05f, +7.446994021e-05f, +2.279157587e-04f, +3.510625815e-04f, +3.754432374e-04f, +2.467089309e-04f, -4.994259172e-05f, -4.739739316e-04f, -9.315639451e-04f, -1.297771287e-03f, -1.453351592e-03f, -1.324372214e-03f, -9.104801481e-04f, -2.907897042e-04f, +3.960294623e-04f, +9.915832698e-04f, +1.364260906e-03f, +1.446685114e-03f, +1.251748745e-03f, +8.627738789e-04f, +4.026019717e-04f, -6.519680158e-06f, -2.781208480e-04f, -3.806926450e-04f, -3.366197546e-04f, -2.042352704e-04f, -5.182767860e-05f, +6.611069114e-05f, +1.226735902e-04f, +1.196785074e-04f, +7.861776763e-05f, +2.713456492e-05f, -1.286957906e-05f, -3.146290874e-05f, -3.042475383e-05f, -1.847147940e-05f, -5.244047141e-06f, +3.062098378e-06f,\n    -6.102230042e-04f, -9.354480548e-04f, -5.728652130e-04f, +9.821020684e-04f, +3.499267583e-03f, +5.621621462e-03f, +5.250112100e-03f, +8.267375154e-04f, -7.085749070e-03f, -1.506796282e-02f, -1.791846671e-02f, -1.149296841e-02f, +4.080347563e-03f, +2.294504728e-02f, +3.537268017e-02f, +3.263591429e-02f, +1.249864538e-02f, -1.802626192e-02f, -4.491351145e-02f, -5.386093063e-02f, -3.815990806e-02f, -3.204876238e-03f, +3.532107701e-02f, +5.905762029e-02f, +5.642267152e-02f, +2.870951243e-02f, -1.059770572e-02f, -4.290387012e-02f, -5.401266115e-02f, -4.086797817e-02f, -1.210413194e-02f, +1.740147328e-02f, +3.452940855e-02f, +3.399375300e-02f, +1.958358355e-02f, +6.588347606e-04f, -1.347612875e-02f, -1.800689146e-02f, -1.379924859e-02f, -5.457137559e-03f, +1.977735361e-03f, +5.601722139e-03f, +5.348013616e-03f, +3.001254144e-03f, +5.956524047e-04f, -7.226194598e-04f, -9.065371384e-04f, -5.255382364e-04f,\n    +1.406857895e-05f, +3.252620996e-06f, -2.796584406e-05f, -6.713539017e-05f, -8.255610087e-05f, -3.981650256e-05f, +6.877679563e-05f, +2.013146568e-04f, +2.728658730e-04f, +1.997174486e-04f, -3.778106486e-05f, -3.546031149e-04f, -5.806806360e-04f, -5.462594666e-04f, -1.926506653e-04f, +3.604097550e-04f, +8.460869904e-04f, +9.811198106e-04f, +6.310722668e-04f, -8.781111195e-05f, -8.419478380e-04f, -1.244892900e-03f, -1.067464972e-03f, -3.731266840e-04f, +5.044540557e-04f, +1.134573895e-03f, +1.217437800e-03f, +7.382770122e-04f, -3.699888530e-05f, -7.161126399e-04f, -9.912794543e-04f, -7.870696480e-04f, -2.706219801e-04f, +2.662457264e-04f, +5.731333272e-04f, +5.589810390e-04f, +3.062062311e-04f, -7.987330131e-06f, -2.226156529e-04f, -2.695333162e-04f, -1.821785519e-04f, -4.853490644e-05f, +5.115424196e-05f, +8.325930343e-05f, +6.161514808e-05f, +2.198985344e-05f, -6.312639966e-06f, -1.411216429e-05f,\n    /*  3,14 (48) */\n    +3.273930744e-04f, +2.703286355e-04f, -1.621713879e-04f, -1.011688607e-03f, -2.044019640e-03f, -2.722236114e-03f, -2.358509085e-03f, -4.408538528e-04f, +2.972950379e-03f, +6.984262892e-03f, +9.903705225e-03f, +9.728024426e-03f, +4.973160327e-03f, -4.401120615e-03f, -1.636209209e-02f, -2.683317547e-02f, -3.055171689e-02f, -2.261798335e-02f, -2.883459489e-04f, +3.561309763e-02f, +8.024374500e-02f, +1.255503848e-01f, +1.622050736e-01f, +1.821196081e-01f, +1.807451759e-01f, +1.583987993e-01f, +1.201702402e-01f, +7.444086492e-02f, +3.051204491e-02f, -3.877817092e-03f, -2.437069214e-02f, -3.063722149e-02f, -2.578182284e-02f, -1.484832400e-02f, -3.024832606e-03f, +5.837696713e-03f, +9.980292652e-03f, +9.668059669e-03f, +6.502103710e-03f, +2.486507371e-03f, -7.710165285e-04f, -2.482375745e-03f, -2.680419852e-03f, -1.920873431e-03f, -8.875885761e-04f, -8.392608453e-05f, +2.949411810e-04f, +3.168094589e-04f,\n    -2.383181810e-06f, +6.708567489e-06f, +2.021230241e-05f, +3.136244093e-05f, +3.034044483e-05f, +8.961387132e-06f, -3.328835692e-05f, -8.487177515e-05f, -1.226913964e-04f, -1.191381742e-04f, -5.446854234e-05f, +6.987746041e-05f, +2.232285908e-04f, +3.483607951e-04f, +3.767937026e-04f, +2.533297261e-04f, -3.838391195e-05f, -4.596144407e-04f, -9.179690811e-04f, -1.288972640e-03f, -1.452581076e-03f, -1.332924566e-03f, -9.271268379e-04f, -3.119915824e-04f, +3.751451082e-04f, +9.757955423e-04f, +1.356859895e-03f, +1.448578267e-03f, +1.261352435e-03f, +8.766869402e-04f, +4.167842732e-04f, +4.502532065e-06f, -2.721772587e-04f, -3.799406942e-04f, -3.396908715e-04f, -2.090161747e-04f, -5.628936525e-05f, +6.329280311e-05f, +1.218805365e-04f, +1.204903340e-04f, +8.019782480e-05f, +2.865592357e-05f, -1.192512019e-05f, -3.121241575e-05f, -3.067605374e-05f, -1.890874794e-05f, -5.602632266e-06f, +2.902111970e-06f,\n    -5.961544252e-04f, -9.321954338e-04f, -6.008310570e-04f, +9.149666782e-04f, +3.416711482e-03f, +5.581804959e-03f, +5.318888896e-03f, +1.028052172e-03f, -6.812883197e-03f, -1.486824537e-02f, -1.795624778e-02f, -1.184757153e-02f, +3.499666927e-03f, +2.239878781e-02f, +3.518002950e-02f, +3.299632404e-02f, +1.334473237e-02f, -1.704514211e-02f, -4.428243918e-02f, -5.394874174e-02f, -3.900185590e-02f, -4.449769137e-03f, +3.425361204e-02f, +5.868449360e-02f, +5.692712557e-02f, +2.984408633e-02f, -9.380267921e-03f, -4.216559311e-02f, -5.404966003e-02f, -4.158409081e-02f, -1.309541139e-02f, +1.661440363e-02f, +3.425878657e-02f, +3.425999873e-02f, +2.015671688e-02f, +1.217815800e-03f, -1.316992252e-02f, -1.801487879e-02f, -1.402186424e-02f, -5.726670876e-03f, +1.795556809e-03f, +5.553187233e-03f, +5.399167858e-03f, +3.084513448e-03f, +6.572675528e-04f, -7.006296063e-04f, -9.128497784e-04f, -5.396504007e-04f,\n    +1.410617540e-05f, +3.907656596e-06f, -2.674875237e-05f, -6.607214521e-05f, -8.281113071e-05f, -4.222286763e-05f, +6.466542856e-05f, +1.975941101e-04f, +2.724843481e-04f, +2.046394595e-04f, -2.844020036e-05f, -3.450762209e-04f, -5.768508178e-04f, -5.522910060e-04f, -2.078110696e-04f, +3.425416332e-04f, +8.349630263e-04f, +9.841393894e-04f, +6.488688858e-04f, -6.272035180e-05f, -8.218824541e-04f, -1.240573095e-03f, -1.081970105e-03f, -3.998203004e-04f, +4.786430117e-04f, +1.122247835e-03f, +1.224092438e-03f, +7.596573427e-04f, -1.219055996e-05f, -6.999073479e-04f, -9.902326461e-04f, -7.995367523e-04f, -2.886497384e-04f, +2.519804530e-04f, +5.684158539e-04f, +5.638219262e-04f, +3.160260501e-04f, +9.709917061e-07f, -2.183795704e-04f, -2.704803945e-04f, -1.861063893e-04f, -5.251626648e-05f, +4.902610125e-05f, +8.323115426e-05f, +6.275761546e-05f, +2.316181566e-05f, -5.743650604e-06f, -1.413158128e-05f,\n    /*  3,15 (48) */\n    +3.250098926e-04f, +2.770372030e-04f, -1.419590855e-04f, -9.803261659e-04f, -2.013679195e-03f, -2.713274727e-03f, -2.391797442e-03f, -5.257256279e-04f, +2.850258983e-03f, +6.865124717e-03f, +9.849236683e-03f, +9.797901886e-03f, +5.196388918e-03f, -4.052759820e-03f, -1.598529839e-02f, -2.657984575e-02f, -3.059010081e-02f, -2.307759779e-02f, -1.206315030e-03f, +3.432412499e-02f, +7.879116392e-02f, +1.242174603e-01f, +1.612779468e-01f, +1.818076165e-01f, +1.811203210e-01f, +1.593745949e-01f, +1.215271001e-01f, +7.588944319e-02f, +3.177339735e-02f, -3.001130152e-03f, -2.395390787e-02f, -3.063271896e-02f, -2.605400010e-02f, -1.522826470e-02f, -3.364523477e-03f, +5.628680538e-03f, +9.924003287e-03f, +9.731352472e-03f, +6.623984247e-03f, +2.606997705e-03f, -6.908187037e-04f, -2.453719821e-03f, -2.692344972e-03f, -1.952085847e-03f, -9.182646299e-04f, -1.028348325e-04f, +2.893385487e-04f, +3.197115708e-04f,\n    -2.562675888e-06f, +6.335016514e-06f, +1.977943119e-05f, +3.114521951e-05f, +3.065137718e-05f, +9.970900371e-06f, -3.173335146e-05f, -8.332567041e-05f, -1.219976229e-04f, -1.201132422e-04f, -5.747132589e-05f, +6.531561133e-05f, +2.185148898e-04f, +3.455635110e-04f, +3.779925682e-04f, +2.597815341e-04f, -2.695630896e-05f, -4.452939862e-04f, -9.042885929e-04f, -1.279967744e-03f, -1.451527745e-03f, -1.341190709e-03f, -9.435639419e-04f, -3.331213445e-04f, +3.541741317e-04f, +9.597879820e-04f, +1.349169503e-03f, +1.450192989e-03f, +1.270759895e-03f, +8.905265289e-04f, +4.310160983e-04f, +1.566184617e-05f, -2.660641087e-04f, -3.790411232e-04f, -3.426728319e-04f, -2.137767305e-04f, -6.078578988e-05f, +6.041288532e-05f, +1.210272284e-04f, +1.212636550e-04f, +8.176740537e-05f, +3.018902766e-05f, -1.095885470e-05f, -3.094197089e-05f, -3.091631653e-05f, -1.934482185e-05f, -5.966329238e-06f, +2.735645829e-06f,\n    -5.820482498e-04f, -9.282877772e-04f, -6.275798094e-04f, +8.488945330e-04f, +3.333900351e-03f, +5.539582092e-03f, +5.383554324e-03f, +1.225646282e-03f, -6.540398849e-03f, -1.466360591e-02f, -1.798468798e-02f, -1.219264775e-02f, +2.922816109e-03f, +2.184649681e-02f, +3.497221844e-02f, +3.333886568e-02f, +1.417969539e-02f, -1.606100272e-02f, -4.363357030e-02f, -5.401146209e-02f, -3.982373835e-02f, -5.690342233e-03f, +3.317164193e-02f, +5.828467330e-02f, +5.740576858e-02f, +3.096633416e-02f, -8.156175483e-03f, -4.140593577e-02f, -5.406185059e-02f, -4.228399816e-02f, -1.408564404e-02f, +1.581486688e-02f, +3.397013683e-02f, +3.451197918e-02f, +2.072513273e-02f, +1.781637726e-03f, -1.285389647e-02f, -1.801390780e-02f, -1.424024381e-02f, -5.997151270e-03f, +1.609450420e-03f, +5.500670966e-03f, +5.448193960e-03f, +3.167744602e-03f, +7.200251683e-04f, -6.774677907e-04f, -9.185934290e-04f, -5.537819819e-04f,\n    +1.412896176e-05f, +4.541176552e-06f, -2.554192529e-05f, -6.498730276e-05f, -8.300802883e-05f, -4.456014472e-05f, +6.058351699e-05f, +1.938171938e-04f, +2.719581501e-04f, +2.093909339e-04f, -1.918879431e-05f, -3.354670587e-04f, -5.727614348e-04f, -5.579945201e-04f, -2.227570335e-04f, +3.246191624e-04f, +8.234914461e-04f, +9.866640079e-04f, +6.662784709e-04f, -3.768147783e-05f, -8.014714454e-04f, -1.235664035e-03f, -1.095939898e-03f, -4.263130497e-04f, +4.525916689e-04f, +1.109367871e-03f, +1.230169216e-03f, +7.807259716e-04f, +1.270702101e-05f, -6.832936650e-04f, -9.886946717e-04f, -8.116800428e-04f, -3.066519920e-04f, +2.374822193e-04f, +5.633695578e-04f, +5.684169483e-04f, +3.257816614e-04f, +1.003102933e-05f, -2.139711689e-04f, -2.712894287e-04f, -1.899869437e-04f, -5.653312481e-05f, +4.682798754e-05f, +8.314772024e-05f, +6.388206201e-05f, +2.434605598e-05f, -5.153171625e-06f, -1.413730612e-05f,\n    /*  3,16 (48) */\n    +3.224472167e-04f, +2.833722195e-04f, -1.221796543e-04f, -9.491809464e-04f, -1.983027818e-03f, -2.703303827e-03f, -2.423530794e-03f, -6.090512983e-04f, +2.728261360e-03f, +6.745011475e-03f, +9.791765357e-03f, +9.863217497e-03f, +5.414903808e-03f, -3.707196309e-03f, -1.560730582e-02f, -2.632006421e-02f, -3.061705711e-02f, -2.352289177e-02f, -2.110603623e-03f, +3.304415724e-02f, +7.733963617e-02f, +1.228762696e-01f, +1.603343828e-01f, +1.814744951e-01f, +1.814744951e-01f, +1.603343828e-01f, +1.228762696e-01f, +7.733963617e-02f, +3.304415724e-02f, -2.110603623e-03f, -2.352289177e-02f, -3.061705711e-02f, -2.632006421e-02f, -1.560730582e-02f, -3.707196309e-03f, +5.414903808e-03f, +9.863217497e-03f, +9.791765357e-03f, +6.745011475e-03f, +2.728261360e-03f, -6.090512983e-04f, -2.423530794e-03f, -2.703303827e-03f, -1.983027818e-03f, -9.491809464e-04f, -1.221796543e-04f, +2.833722195e-04f, +3.224472167e-04f,\n    -2.735645829e-06f, +5.966329238e-06f, +1.934482185e-05f, +3.091631653e-05f, +3.094197089e-05f, +1.095885470e-05f, -3.018902766e-05f, -8.176740537e-05f, -1.212636550e-04f, -1.210272284e-04f, -6.041288532e-05f, +6.078578988e-05f, +2.137767305e-04f, +3.426728319e-04f, +3.790411232e-04f, +2.660641087e-04f, -1.566184617e-05f, -4.310160983e-04f, -8.905265289e-04f, -1.270759895e-03f, -1.450192989e-03f, -1.349169503e-03f, -9.597879820e-04f, -3.541741317e-04f, +3.331213445e-04f, +9.435639419e-04f, +1.341190709e-03f, +1.451527745e-03f, +1.279967744e-03f, +9.042885929e-04f, +4.452939862e-04f, +2.695630896e-05f, -2.597815341e-04f, -3.779925682e-04f, -3.455635110e-04f, -2.185148898e-04f, -6.531561133e-05f, +5.747132589e-05f, +1.201132422e-04f, +1.219976229e-04f, +8.332567041e-05f, +3.173335146e-05f, -9.970900371e-06f, -3.065137718e-05f, -3.114521951e-05f, -1.977943119e-05f, -6.335016514e-06f, +2.562675888e-06f,\n    -5.679192881e-04f, -9.237466006e-04f, -6.531217347e-04f, +7.839072303e-04f, +3.250892322e-03f, +5.495021947e-03f, +5.444137841e-03f, +1.419463476e-03f, -6.268440699e-03f, -1.445421498e-02f, -1.800387677e-02f, -1.252811481e-02f, +2.350054674e-03f, +2.128850229e-02f, +3.474946140e-02f, +3.366348484e-02f, +1.500318684e-02f, -1.507433871e-02f, -4.296729183e-02f, -5.404914357e-02f, -4.062520980e-02f, -6.926006268e-03f, +3.207570204e-02f, +5.785836025e-02f, +5.785836025e-02f, +3.207570204e-02f, -6.926006268e-03f, -4.062520980e-02f, -5.404914357e-02f, -4.296729183e-02f, -1.507433871e-02f, +1.500318684e-02f, +3.366348484e-02f, +3.474946140e-02f, +2.128850229e-02f, +2.350054674e-03f, -1.252811481e-02f, -1.800387677e-02f, -1.445421498e-02f, -6.268440699e-03f, +1.419463476e-03f, +5.444137841e-03f, +5.495021947e-03f, +3.250892322e-03f, +7.839072303e-04f, -6.531217347e-04f, -9.237466006e-04f, -5.679192881e-04f,\n    +1.413730612e-05f, +5.153171625e-06f, -2.434605598e-05f, -6.388206201e-05f, -8.314772024e-05f, -4.682798754e-05f, +5.653312481e-05f, +1.899869437e-04f, +2.712894287e-04f, +2.139711689e-04f, -1.003102933e-05f, -3.257816614e-04f, -5.684169483e-04f, -5.633695578e-04f, -2.374822193e-04f, +3.066519920e-04f, +8.116800428e-04f, +9.886946717e-04f, +6.832936650e-04f, -1.270702101e-05f, -7.807259716e-04f, -1.230169216e-03f, -1.109367871e-03f, -4.525916689e-04f, +4.263130497e-04f, +1.095939898e-03f, +1.235664035e-03f, +8.014714454e-04f, +3.768147783e-05f, -6.662784709e-04f, -9.866640079e-04f, -8.234914461e-04f, -3.246191624e-04f, +2.227570335e-04f, +5.579945201e-04f, +5.727614348e-04f, +3.354670587e-04f, +1.918879431e-05f, -2.093909339e-04f, -2.719581501e-04f, -1.938171938e-04f, -6.058351699e-05f, +4.456014472e-05f, +8.300802883e-05f, +6.498730276e-05f, +2.554192529e-05f, -4.541176552e-06f, -1.412896176e-05f,\n    /*  3,17 (48) */\n    +3.197115708e-04f, +2.893385487e-04f, -1.028348325e-04f, -9.182646299e-04f, -1.952085847e-03f, -2.692344972e-03f, -2.453719821e-03f, -6.908187037e-04f, +2.606997705e-03f, +6.623984247e-03f, +9.731352472e-03f, +9.924003287e-03f, +5.628680538e-03f, -3.364523477e-03f, -1.522826470e-02f, -2.605400010e-02f, -3.063271896e-02f, -2.395390787e-02f, -3.001130152e-03f, +3.177339735e-02f, +7.588944319e-02f, +1.215271001e-01f, +1.593745949e-01f, +1.811203210e-01f, +1.818076165e-01f, +1.612779468e-01f, +1.242174603e-01f, +7.879116392e-02f, +3.432412499e-02f, -1.206315030e-03f, -2.307759779e-02f, -3.059010081e-02f, -2.657984575e-02f, -1.598529839e-02f, -4.052759820e-03f, +5.196388918e-03f, +9.797901886e-03f, +9.849236683e-03f, +6.865124717e-03f, +2.850258983e-03f, -5.257256279e-04f, -2.391797442e-03f, -2.713274727e-03f, -2.013679195e-03f, -9.803261659e-04f, -1.419590855e-04f, +2.770372030e-04f, +3.250098926e-04f,\n    -2.902111970e-06f, +5.602632266e-06f, +1.890874794e-05f, +3.067605374e-05f, +3.121241575e-05f, +1.192512019e-05f, -2.865592357e-05f, -8.019782480e-05f, -1.204903340e-04f, -1.218805365e-04f, -6.329280311e-05f, +5.628936525e-05f, +2.090161747e-04f, +3.396908715e-04f, +3.799406942e-04f, +2.721772587e-04f, -4.502532065e-06f, -4.167842732e-04f, -8.766869402e-04f, -1.261352435e-03f, -1.448578267e-03f, -1.356859895e-03f, -9.757955423e-04f, -3.751451082e-04f, +3.119915824e-04f, +9.271268379e-04f, +1.332924566e-03f, +1.452581076e-03f, +1.288972640e-03f, +9.179690811e-04f, +4.596144407e-04f, +3.838391195e-05f, -2.533297261e-04f, -3.767937026e-04f, -3.483607951e-04f, -2.232285908e-04f, -6.987746041e-05f, +5.446854234e-05f, +1.191381742e-04f, +1.226913964e-04f, +8.487177515e-05f, +3.328835692e-05f, -8.961387132e-06f, -3.034044483e-05f, -3.136244093e-05f, -2.021230241e-05f, -6.708567489e-06f, +2.383181810e-06f,\n    -5.537819819e-04f, -9.185934290e-04f, -6.774677907e-04f, +7.200251683e-04f, +3.167744602e-03f, +5.448193960e-03f, +5.500670966e-03f, +1.609450420e-03f, -5.997151270e-03f, -1.424024381e-02f, -1.801390780e-02f, -1.285389647e-02f, +1.781637726e-03f, +2.072513273e-02f, +3.451197918e-02f, +3.397013683e-02f, +1.581486688e-02f, -1.408564404e-02f, -4.228399816e-02f, -5.406185059e-02f, -4.140593577e-02f, -8.156175483e-03f, +3.096633416e-02f, +5.740576858e-02f, +5.828467330e-02f, +3.317164193e-02f, -5.690342233e-03f, -3.982373835e-02f, -5.401146209e-02f, -4.363357030e-02f, -1.606100272e-02f, +1.417969539e-02f, +3.333886568e-02f, +3.497221844e-02f, +2.184649681e-02f, +2.922816109e-03f, -1.219264775e-02f, -1.798468798e-02f, -1.466360591e-02f, -6.540398849e-03f, +1.225646282e-03f, +5.383554324e-03f, +5.539582092e-03f, +3.333900351e-03f, +8.488945330e-04f, -6.275798094e-04f, -9.282877772e-04f, -5.820482498e-04f,\n    +1.413158128e-05f, +5.743650604e-06f, -2.316181566e-05f, -6.275761546e-05f, -8.323115426e-05f, -4.902610125e-05f, +5.251626648e-05f, +1.861063893e-04f, +2.704803945e-04f, +2.183795704e-04f, -9.709917061e-07f, -3.160260501e-04f, -5.638219262e-04f, -5.684158539e-04f, -2.519804530e-04f, +2.886497384e-04f, +7.995367523e-04f, +9.902326461e-04f, +6.999073479e-04f, +1.219055996e-05f, -7.596573427e-04f, -1.224092438e-03f, -1.122247835e-03f, -4.786430117e-04f, +3.998203004e-04f, +1.081970105e-03f, +1.240573095e-03f, +8.218824541e-04f, +6.272035180e-05f, -6.488688858e-04f, -9.841393894e-04f, -8.349630263e-04f, -3.425416332e-04f, +2.078110696e-04f, +5.522910060e-04f, +5.768508178e-04f, +3.450762209e-04f, +2.844020036e-05f, -2.046394595e-04f, -2.724843481e-04f, -1.975941101e-04f, -6.466542856e-05f, +4.222286763e-05f, +8.281113071e-05f, +6.607214521e-05f, +2.674875237e-05f, -3.907656596e-06f, -1.410617540e-05f,\n    /*  3,18 (48) */\n    +3.168094589e-04f, +2.949411810e-04f, -8.392608453e-05f, -8.875885761e-04f, -1.920873431e-03f, -2.680419852e-03f, -2.482375745e-03f, -7.710165285e-04f, +2.486507371e-03f, +6.502103710e-03f, +9.668059669e-03f, +9.980292652e-03f, +5.837696713e-03f, -3.024832606e-03f, -1.484832400e-02f, -2.578182284e-02f, -3.063722149e-02f, -2.437069214e-02f, -3.877817092e-03f, +3.051204491e-02f, +7.444086492e-02f, +1.201702402e-01f, +1.583987993e-01f, +1.807451759e-01f, +1.821196081e-01f, +1.622050736e-01f, +1.255503848e-01f, +8.024374500e-02f, +3.561309763e-02f, -2.883459489e-04f, -2.261798335e-02f, -3.055171689e-02f, -2.683317547e-02f, -1.636209209e-02f, -4.401120615e-03f, +4.973160327e-03f, +9.728024426e-03f, +9.903705225e-03f, +6.984262892e-03f, +2.972950379e-03f, -4.408538528e-04f, -2.358509085e-03f, -2.722236114e-03f, -2.044019640e-03f, -1.011688607e-03f, -1.621713879e-04f, +2.703286355e-04f, +3.273930744e-04f,\n    -3.062098378e-06f, +5.244047141e-06f, +1.847147940e-05f, +3.042475383e-05f, +3.146290874e-05f, +1.286957906e-05f, -2.713456492e-05f, -7.861776763e-05f, -1.196785074e-04f, -1.226735902e-04f, -6.611069114e-05f, +5.182767860e-05f, +2.042352704e-04f, +3.366197546e-04f, +3.806926450e-04f, +2.781208480e-04f, +6.519680158e-06f, -4.026019717e-04f, -8.627738789e-04f, -1.251748745e-03f, -1.446685114e-03f, -1.364260906e-03f, -9.915832698e-04f, -3.960294623e-04f, +2.907897042e-04f, +9.104801481e-04f, +1.324372214e-03f, +1.453351592e-03f, +1.297771287e-03f, +9.315639451e-04f, +4.739739316e-04f, +4.994259172e-05f, -2.467089309e-04f, -3.754432374e-04f, -3.510625815e-04f, -2.279157587e-04f, -7.446994021e-05f, +5.140498176e-05f, +1.181016416e-04f, +1.233441411e-04f, +8.640486925e-05f, +3.485349373e-05f, -7.930457114e-06f, -3.000899140e-05f, -3.156766014e-05f, -2.064315845e-05f, -7.086850493e-06f, +2.197147050e-06f,\n    -5.396504007e-04f, -9.128497784e-04f, -7.006296063e-04f, +6.572675528e-04f, +3.084513448e-03f, +5.399167858e-03f, +5.553187233e-03f, +1.795556809e-03f, -5.726670876e-03f, -1.402186424e-02f, -1.801487879e-02f, -1.316992252e-02f, +1.217815800e-03f, +2.015671688e-02f, +3.425999873e-02f, +3.425878657e-02f, +1.661440363e-02f, -1.309541139e-02f, -4.158409081e-02f, -5.404966003e-02f, -4.216559311e-02f, -9.380267921e-03f, +2.984408633e-02f, +5.692712557e-02f, +5.868449360e-02f, +3.425361204e-02f, -4.449769137e-03f, -3.900185590e-02f, -5.394874174e-02f, -4.428243918e-02f, -1.704514211e-02f, +1.334473237e-02f, +3.299632404e-02f, +3.518002950e-02f, +2.239878781e-02f, +3.499666927e-03f, -1.184757153e-02f, -1.795624778e-02f, -1.486824537e-02f, -6.812883197e-03f, +1.028052172e-03f, +5.318888896e-03f, +5.581804959e-03f, +3.416711482e-03f, +9.149666782e-04f, -6.008310570e-04f, -9.321954338e-04f, -5.961544252e-04f,\n    +1.411216429e-05f, +6.312639966e-06f, -2.198985344e-05f, -6.161514808e-05f, -8.325930343e-05f, -5.115424196e-05f, +4.853490644e-05f, +1.821785519e-04f, +2.695333162e-04f, +2.226156529e-04f, +7.987330131e-06f, -3.062062311e-04f, -5.589810390e-04f, -5.731333272e-04f, -2.662457264e-04f, +2.706219801e-04f, +7.870696480e-04f, +9.912794543e-04f, +7.161126399e-04f, +3.699888530e-05f, -7.382770122e-04f, -1.217437800e-03f, -1.134573895e-03f, -5.044540557e-04f, +3.731266840e-04f, +1.067464972e-03f, +1.244892900e-03f, +8.419478380e-04f, +8.781111195e-05f, -6.310722668e-04f, -9.811198106e-04f, -8.460869904e-04f, -3.604097550e-04f, +1.926506653e-04f, +5.462594666e-04f, +5.806806360e-04f, +3.546031149e-04f, +3.778106486e-05f, -1.997174486e-04f, -2.728658730e-04f, -2.013146568e-04f, -6.877679563e-05f, +3.981650256e-05f, +8.255610087e-05f, +6.713539017e-05f, +2.796584406e-05f, -3.252620996e-06f, -1.406857895e-05f,\n    /*  3,19 (48) */\n    +3.137473605e-04f, +3.001852281e-04f, -6.545460513e-05f, -8.571638223e-04f, -1.889410522e-03f, -2.667550273e-03f, -2.509510310e-03f, -8.496342961e-04f, +2.366828863e-03f, +6.379430120e-03f, +9.601948977e-03f, +1.003212033e-02f, +6.041931983e-03f, -2.688212851e-03f, -1.446763136e-02f, -2.550370200e-02f, -3.063070181e-02f, -2.477329412e-02f, -4.740590971e-03f, +2.926029617e-02f, +7.299417980e-02f, +1.188059793e-01f, +1.574072160e-01f, +1.803491464e-01f, +1.824103978e-01f, +1.631155538e-01f, +1.268747571e-01f, +8.169709659e-02f, +3.691086891e-02f, +6.432179961e-04f, -2.214400941e-02f, -3.050177430e-02f, -2.707988440e-02f, -1.673753533e-02f, -4.752183197e-03f, +4.745244568e-03f, +9.653554485e-03f, +9.955110207e-03f, +7.102364533e-03f, +3.096294520e-03f, -3.544489835e-04f, -2.323655591e-03f, -2.730166571e-03f, -2.074028631e-03f, -1.043256267e-03f, -1.828145464e-04f, +2.632417850e-04f, +3.295902214e-04f,\n    -3.215632773e-06f, +4.890690353e-06f, +1.803328241e-05f, +3.016274024e-05f, +3.169365385e-05f, +1.379212554e-05f, -2.562546495e-05f, -7.702806658e-05f, -1.188290291e-04f, -1.234068331e-04f, -6.886619058e-05f, +4.740204284e-05f, +1.994360514e-04f, +3.334616159e-04f, +3.812983756e-04f, +2.838947950e-04f, +1.740289287e-05f, -3.884726189e-04f, -8.487913969e-04f, -1.241952248e-03f, -1.444515133e-03f, -1.371371643e-03f, -1.007147876e-03f, -4.168224081e-04f, +2.695205899e-04f, +8.936274118e-04f, +1.315534869e-03f, +1.453837979e-03f, +1.306360431e-03f, +9.450691397e-04f, +4.883688957e-04f, +6.163023022e-05f, -2.399194504e-04f, -3.739399226e-04f, -3.536667805e-04f, -2.325743066e-04f, -7.909162632e-05f, +4.828112092e-05f, +1.170032827e-04f, +1.239550299e-04f, +8.792409713e-05f, +3.642819940e-05f, -6.878264766e-06f, -2.965684206e-05f, -3.176055781e-05f, -2.107171878e-05f, -7.469728793e-06f, +2.004558929e-06f,\n    -5.255382364e-04f, -9.065371384e-04f, -7.226194598e-04f, +5.956524047e-04f, +3.001254144e-03f, +5.348013616e-03f, +5.601722139e-03f, +1.977735361e-03f, -5.457137559e-03f, -1.379924859e-02f, -1.800689146e-02f, -1.347612875e-02f, +6.588347606e-04f, +1.958358355e-02f, +3.399375300e-02f, +3.452940855e-02f, +1.740147328e-02f, -1.210413194e-02f, -4.086797817e-02f, -5.401266115e-02f, -4.290387012e-02f, -1.059770572e-02f, +2.870951243e-02f, +5.642267152e-02f, +5.905762029e-02f, +3.532107701e-02f, -3.204876238e-03f, -3.815990806e-02f, -5.386093063e-02f, -4.491351145e-02f, -1.802626192e-02f, +1.249864538e-02f, +3.263591429e-02f, +3.537268017e-02f, +2.294504728e-02f, +4.080347563e-03f, -1.149296841e-02f, -1.791846671e-02f, -1.506796282e-02f, -7.085749070e-03f, +8.267375154e-04f, +5.250112100e-03f, +5.621621462e-03f, +3.499267583e-03f, +9.821020684e-04f, -5.728652130e-04f, -9.354480548e-04f, -6.102230042e-04f,\n    +1.407943605e-05f, +6.860183518e-06f, -2.083079621e-05f, -6.045583661e-05f, -8.323316251e-05f, -5.321221614e-05f, +4.459095839e-05f, +1.782064426e-04f, +2.684505191e-04f, +2.266790381e-04f, +1.684004711e-05f, -2.963281919e-04f, -5.538990566e-04f, -5.775220799e-04f, -2.802721994e-04f, +2.525782520e-04f, +7.742869352e-04f, +9.918368755e-04f, +7.319029046e-04f, +6.170566071e-05f, -7.165965704e-04f, -1.210209701e-03f, -1.146340453e-03f, -5.300119093e-04f, +3.462455733e-04f, +1.052431269e-03f, +1.248620255e-03f, +8.616565938e-04f, +1.129411618e-04f, -6.128962056e-04f, -9.776045272e-04f, -8.568556929e-04f, -3.782138509e-04f, +1.772823189e-04f, +5.399005393e-04f, +5.842465376e-04f, +3.640416994e-04f, +4.720711048e-05f, -1.946257141e-04f, -2.731006376e-04f, -2.049757937e-04f, -7.291550570e-05f, +3.734144779e-05f, +8.224203962e-05f, +6.817583254e-05f, +2.919248539e-05f, -2.576097353e-06f, -1.401580941e-05f,\n    /*  3,20 (48) */\n    +3.105317277e-04f, +3.050759185e-04f, -4.742132272e-05f, -8.270010821e-04f, -1.857716868e-03f, -2.653758147e-03f, -2.535135775e-03f, -9.266623627e-04f, +2.247999834e-03f, +6.256023287e-03f, +9.533082787e-03f, +1.007952237e-02f, +6.241368035e-03f, -2.354751235e-03f, -1.408633298e-02f, -2.521980720e-02f, -3.061329892e-02f, -2.516176673e-02f, -5.589382368e-03f, +2.801834392e-02f, +7.154966467e-02f, +1.174346076e-01f, +1.564000682e-01f, +1.799323240e-01f, +1.826799183e-01f, +1.640091812e-01f, +1.281902919e-01f, +8.315093457e-02f, +3.821722934e-02f, +1.588287136e-03f, -2.165564052e-02f, -3.044014407e-02f, -2.731980385e-02f, -1.711147525e-02f, -5.105849977e-03f, +4.512670262e-03f, +9.574462859e-03f, +1.000339133e-02f, +7.219367816e-03f, +3.220249550e-03f, -2.665248864e-04f, -2.287227392e-03f, -2.737044836e-03f, -2.103685473e-03f, -1.075016825e-03f, -2.038862651e-04f, +2.557720562e-04f, +3.315947804e-04f,\n    -3.362746456e-06f, +4.542673343e-06f, +1.759441937e-05f, +2.989033697e-05f, +3.190486185e-05f, +1.469266580e-05f, -2.412912441e-05f, -7.542954791e-05f, -1.179427581e-04f, -1.240807285e-04f, -7.155897168e-05f, +4.301374243e-05f, +1.946205367e-04f, +3.302185990e-04f, +3.817593219e-04f, +2.894990723e-04f, +2.814526430e-05f, -3.743996030e-04f, -8.347435446e-04f, -1.231966404e-03f, -1.442070000e-03f, -1.378191292e-03f, -1.022486136e-03f, -4.375191867e-04f, +2.481891397e-04f, +8.765722283e-04f, +1.306413829e-03f, +1.454038996e-03f, +1.314736864e-03f, +9.584806249e-04f, +5.027957374e-04f, +7.344465519e-05f, -2.329616422e-04f, -3.722825470e-04f, -3.561713154e-04f, -2.372021356e-04f, -8.374106713e-05f, +4.509746638e-05f, +1.158427570e-04f, +1.245232433e-04f, +8.942859827e-05f, +3.801189943e-05f, -5.804976927e-06f, -2.928382971e-05f, -3.194081607e-05f, -2.149769957e-05f, -7.857060596e-06f, +1.805408701e-06f,\n    -5.114588003e-04f, -8.996769549e-04f, -7.434502560e-04f, +5.351965681e-04f, +2.918020982e-03f, +5.294801400e-03f, +5.646313098e-03f, +2.155941804e-03f, -5.188687040e-03f, -1.357256955e-02f, -1.799005142e-02f, -1.377245694e-02f, +1.049357040e-04f, +1.900606147e-02f, +3.371348080e-02f, +3.478198680e-02f, +1.817576022e-02f, -1.111229506e-02f, -4.013607527e-02f, -5.395095548e-02f, -4.362046669e-02f, -1.180791542e-02f, +2.756317198e-02f, +5.589265961e-02f, +5.940386586e-02f, +3.637350828e-02f, -1.956255983e-03f, -3.729825146e-02f, -5.374798947e-02f, -4.552640766e-02f, -1.900386645e-02f, +1.164178968e-02f, +3.225770044e-02f, +3.554996249e-02f, +2.348494782e-02f, +4.664594100e-03f, -1.112892671e-02f, -1.787125960e-02f, -1.526258854e-02f, -7.358849707e-03f, +6.217617216e-04f, +5.177196595e-03f, +5.658962910e-03f, +3.581509622e-03f, +1.050277901e-03f, -5.436727276e-04f, -9.380241521e-04f, -6.242388136e-04f,\n    +1.403378090e-05f, +7.386342037e-06f, -1.968524855e-05f, -5.928084880e-05f, -8.315374743e-05f, -5.519988007e-05f, +4.068628472e-05f, +1.741930608e-04f, +2.672343829e-04f, +2.305694545e-04f, +2.558337091e-05f, -2.863978978e-04f, -5.485808445e-04f, -5.815823955e-04f, -2.940542028e-04f, +2.345280409e-04f, +7.611969468e-04f, +9.919069428e-04f, +7.472717518e-04f, +8.629868392e-05f, -6.946277381e-04f, -1.202412830e-03f, -1.157542210e-03f, -5.553038192e-04f, +3.191904429e-04f, +1.036876048e-03f, +1.251752275e-03f, +8.809978815e-04f, +1.380978459e-04f, -5.943485240e-04f, -9.735930579e-04f, -8.672616412e-04f, -3.959442215e-04f, +1.617126870e-04f, +5.332150490e-04f, +5.875442840e-04f, +3.733859286e-04f, +5.671396693e-05f, -1.893651790e-04f, -2.731866196e-04f, -2.085744781e-04f, -7.707939839e-05f, +3.479815397e-05f, +8.186807367e-05f, +6.919226211e-05f, +3.042793978e-05f, -1.878131958e-06f, -1.394750936e-05f,\n    /*  3,21 (48) */\n    +3.071689813e-04f, +3.096185918e-04f, -2.982690335e-05f, -7.971107451e-04f, -1.825812007e-03f, -2.639065481e-03f, -2.559264899e-03f, -1.002091911e-03f, +2.130057076e-03f, +6.131942559e-03f, +9.461523815e-03f, +1.012253612e-02f, +6.435988572e-03f, -2.024532636e-03f, -1.370457366e-02f, -2.493030813e-02f, -3.058515366e-02f, -2.553616634e-02f, -6.424125913e-03f, +2.678637751e-02f, +7.010759467e-02f, +1.160564163e-01f, +1.553775820e-01f, +1.794948048e-01f, +1.829281075e-01f, +1.648857534e-01f, +1.294967058e-01f, +8.460497356e-02f, +3.953196621e-02f, +2.546767761e-03f, -2.115284478e-02f, -3.036669942e-02f, -2.755276549e-02f, -1.748375780e-02f, -5.462021293e-03f, +4.275468126e-03f, +9.490721792e-03f, +1.004848879e-02f, +7.335210573e-03f, +3.344772793e-03f, -1.770962881e-04f, -2.249215493e-03f, -2.742849813e-03f, -2.132969303e-03f, -1.106957641e-03f, -2.253839647e-04f, +2.479149956e-04f, +3.334001891e-04f,\n    -3.503474237e-06f, +4.200102517e-06f, +1.715514875e-05f, +2.960786843e-05f, +3.209675012e-05f, +1.557111780e-05f, -2.264603142e-05f, -7.382303112e-05f, -1.170205588e-04f, -1.246957586e-04f, -7.418873365e-05f, +3.866403314e-05f, +1.897907297e-04f, +3.268928558e-04f, +3.820769545e-04f, +2.949337063e-04f, +3.874500880e-05f, -3.603862744e-04f, -8.206343697e-04f, -1.221794714e-03f, -1.439351461e-03f, -1.384719120e-03f, -1.037594893e-03f, -4.581150677e-04f, +2.268002720e-04f, +8.593182563e-04f, +1.297010470e-03f, +1.453953477e-03f, +1.322897423e-03f, +9.717943669e-04f, +5.172508300e-04f, +8.538364049e-05f, -2.258359200e-04f, -3.704699399e-04f, -3.585741237e-04f, -2.417971359e-04f, -8.841678412e-05f, +4.185455463e-05f, +1.146197461e-04f, +1.250479701e-04f, +9.091750758e-05f, +3.960400736e-05f, -4.710772911e-06f, -2.888979521e-05f, -3.210811875e-05f, -2.192081377e-05f, -8.248699053e-06f, +1.599691615e-06f,\n    -4.974250194e-04f, -8.922906129e-04f, -7.631355045e-04f, +4.759157193e-04f, +2.834867234e-03f, +5.239601520e-03f, +5.686999382e-03f, +2.330134864e-03f, -4.921452657e-03f, -1.334200010e-02f, -1.796446805e-02f, -1.405885484e-02f, -4.436451405e-04f, +1.842447907e-02f, +3.341942660e-02f, +3.501651484e-02f, +1.893695716e-02f, -1.012038812e-02f, -3.938880352e-02f, -5.386465680e-02f, -4.431509443e-02f, -1.301032825e-02f, +2.640562977e-02f, +5.533735579e-02f, +5.972305630e-02f, +3.741038433e-02f, -7.045037083e-04f, -3.641725358e-02f, -5.360989162e-02f, -4.612075618e-02f, -1.997745950e-02f, +1.077452804e-02f, +3.186175622e-02f, +3.571167518e-02f, +2.401816287e-02f, +5.252138384e-03f, -1.075554078e-02f, -1.781454564e-02f, -1.545195372e-02f, -7.632036327e-03f, +4.131872435e-04f, +5.100117196e-03f, +5.693761064e-03f, +3.663377696e-03f, +1.119470163e-03f, -5.132447878e-04f, -9.399022841e-04f, -6.381863229e-04f,\n    +1.397558619e-05f, +7.891192903e-06f, -1.855379262e-05f, -5.809134268e-05f, -8.302209420e-05f, -5.711713924e-05f, +3.682269594e-05f, +1.701413919e-04f, +2.658873395e-04f, +2.342867362e-04f, +3.421361529e-05f, -2.764212891e-04f, -5.430313600e-04f, -5.853147382e-04f, -3.075862399e-04f, +2.164807795e-04f, +7.478081370e-04f, +9.914919407e-04f, +7.622130399e-04f, +1.107658511e-04f, -6.723823597e-04f, -1.194052169e-03f, -1.168174171e-03f, -5.803171765e-04f, +2.919748629e-04f, +1.020806642e-03f, +1.254286383e-03f, +8.999610301e-04f, +1.632684572e-04f, -5.754372713e-04f, -9.690851856e-04f, -8.772975004e-04f, -4.135911510e-04f, +1.459485814e-04f, +5.262040092e-04f, +5.905697532e-04f, +3.826297553e-04f, +6.629717269e-05f, -1.839368776e-04f, -2.731218630e-04f, -2.121076666e-04f, -8.126626625e-05f, +3.218712466e-05f, +8.143335712e-05f, +7.018346438e-05f, +3.167144923e-05f, -1.158790106e-06f, -1.386332733e-05f,\n    /*  3,22 (48) */\n    +3.036655070e-04f, +3.138186943e-04f, -1.267175460e-05f, -7.675028767e-04f, -1.793715256e-03f, -2.623494363e-03f, -2.581910930e-03f, -1.075914942e-03f, +2.013036517e-03f, +6.007246800e-03f, +9.387335081e-03f, +1.016120015e-02f, +6.625779301e-03f, -1.697639780e-03f, -1.332249670e-02f, -2.463537442e-02f, -3.054640865e-02f, -2.589655261e-02f, -7.244760282e-03f, +2.556458280e-02f, +6.866824321e-02f, +1.146716972e-01f, +1.543399871e-01f, +1.790366898e-01f, +1.831549078e-01f, +1.657450717e-01f, +1.307937162e-01f, +8.605892704e-02f, +4.085486363e-02f, +3.518562128e-03f, -2.063559395e-02f, -3.028131578e-02f, -2.777860141e-02f, -1.785422774e-02f, -5.820595416e-03f, +4.033670990e-03f, +9.402305008e-03f, +1.009034335e-02f, +7.449830319e-03f, +3.469820763e-03f, -8.617878055e-05f, -2.209611485e-03f, -2.747560586e-03f, -2.161859098e-03f, -1.139065760e-03f, -2.473047785e-04f, +2.396662965e-04f, +3.349998807e-04f,\n    -3.637854360e-06f, +3.863079261e-06f, +1.671572506e-05f, +2.931565927e-05f, +3.226954245e-05f, +1.642741121e-05f, -2.117666142e-05f, -7.220932865e-05f, -1.160633002e-04f, -1.252524243e-04f, -7.675520442e-05f, +3.435414183e-05f, +1.849486176e-04f, +3.234865456e-04f, +3.822527779e-04f, +3.001987772e-04f, +4.920039709e-05f, -3.464359449e-04f, -8.064679161e-04f, -1.211440714e-03f, -1.436361328e-03f, -1.390954474e-03f, -1.052471054e-03f, -4.786053506e-04f, +2.053589224e-04f, +8.418692126e-04f, +1.287326252e-03f, +1.453580330e-03f, +1.330838993e-03f, +9.850063393e-04f, +5.317305164e-04f, +9.744490656e-05f, -2.185427537e-04f, -3.685009711e-04f, -3.608731577e-04f, -2.463571875e-04f, -9.311727215e-05f, +3.855295216e-05f, +1.133339535e-04f, +1.255284079e-04f, +9.238995567e-05f, +4.120392496e-05f, -3.595844583e-06f, -2.847458756e-05f, -3.226215150e-05f, -2.234077122e-05f, -8.644492266e-06f, +1.387406987e-06f,\n    -4.834494332e-04f, -8.843994200e-04f, -7.816892972e-04f, +4.178243766e-04f, +2.751845140e-03f, +5.182484381e-03f, +5.723822078e-03f, +2.500276256e-03f, -4.655565318e-03f, -1.310771336e-02f, -1.793025443e-02f, -1.433527613e-02f, -9.866765005e-04f, +1.783916434e-02f, +3.311184036e-02f, +3.523299562e-02f, +1.968476530e-02f, -9.128896180e-03f, -3.862659048e-02f, -5.375389095e-02f, -4.498747679e-02f, -1.420438042e-02f, +2.523745560e-02f, +5.475703861e-02f, +6.001503116e-02f, +3.843119097e-02f, +5.497826750e-04f, -3.551729255e-02f, -5.344662316e-02f, -4.669619345e-02f, -2.094654469e-02f, +9.897230542e-03f, +3.144816507e-02f, +3.585762376e-02f, +2.454436688e-02f, +5.842708137e-03f, -1.037291103e-02f, -1.774824846e-02f, -1.563589059e-02f, -7.905158190e-03f, +2.010795769e-04f, +5.018850930e-03f, +5.725948188e-03f, +3.744811053e-03f, +1.189653627e-03f, -4.815733386e-04f, -9.410610742e-04f, -6.520496503e-04f,\n    +1.390524188e-05f, +8.374829719e-06f, -1.743698814e-05f, -5.688846585e-05f, -8.283925787e-05f, -5.896394766e-05f, +3.300195016e-05f, +1.660544062e-04f, +2.644118708e-04f, +2.378308219e-04f, +4.272719737e-05f, -2.664042772e-04f, -5.372556494e-04f, -5.887197505e-04f, -3.208629886e-04f, +1.984458425e-04f, +7.341290765e-04f, +9.905944033e-04f, +7.767208785e-04f, +1.350951634e-04f, -6.498723961e-04f, -1.185132988e-03f, -1.178231646e-03f, -6.050395244e-04f, +2.646124904e-04f, +1.004230662e-03f, +1.256220314e-03f, +9.185355443e-04f, +1.884402431e-04f, -5.561707202e-04f, -9.640809589e-04f, -8.869560984e-04f, -4.311449117e-04f, +1.299969664e-04f, +5.188686224e-04f, +5.933189432e-04f, +3.917671351e-04f, +7.595217688e-05f, -1.783419554e-04f, -2.729044808e-04f, -2.155723173e-04f, -8.547385565e-05f, +2.950891663e-05f, +8.093707251e-05f, +7.114822141e-05f, +3.292223457e-05f, -4.181563958e-07f, -1.376291828e-05f,\n    /*  3,23 (48) */\n    +3.000276527e-04f, +3.176817736e-04f, +4.043970461e-06f, -7.381872174e-04f, -1.761445714e-03f, -2.607066952e-03f, -2.603087592e-03f, -1.148124270e-03f, +1.896973217e-03f, +5.881994376e-03f, +9.310579877e-03f, +1.019555429e-02f, +6.810727919e-03f, -1.374153235e-03f, -1.294024393e-02f, -2.433517564e-02f, -3.049720825e-02f, -2.624298856e-02f, -8.051228198e-03f, +2.435314209e-02f, +6.723188188e-02f, +1.132807427e-01f, +1.532875161e-01f, +1.785580844e-01f, +1.833602667e-01f, +1.665869409e-01f, +1.320810425e-01f, +8.751250737e-02f, +4.218570262e-02f, +4.503568467e-03f, -2.010386343e-02f, -3.018387087e-02f, -2.799714417e-02f, -1.822272871e-02f, -6.181468574e-03f, +3.787313803e-03f, +9.309187736e-03f, +1.012889630e-02f, +7.563164272e-03f, +3.595349171e-03f, +6.211175117e-06f, -2.168407560e-03f, -2.751156430e-03f, -2.190333686e-03f, -1.171327911e-03f, -2.696455497e-04f, +2.310218043e-04f, +3.363872877e-04f,\n    -3.765928427e-06f, +3.531699954e-06f, +1.627639872e-05f, +2.901403414e-05f, +3.242346883e-05f, +1.726148731e-05f, -1.972147714e-05f, -7.058924562e-05f, -1.150718556e-04f, -1.257512449e-04f, -7.925814052e-05f, +3.008526632e-05f, +1.800961712e-04f, +3.200018341e-04f, +3.822883300e-04f, +3.052944180e-04f, +5.950975647e-05f, -3.325518869e-04f, -7.922482224e-04f, -1.200907975e-03f, -1.433101487e-03f, -1.396896783e-03f, -1.067111595e-03f, -4.989853661e-04f, +1.838700421e-04f, +8.242288710e-04f, +1.277362709e-03f, +1.452918539e-03f, +1.338558509e-03f, +9.981125244e-04f, +5.462311107e-04f, +1.096261208e-04f, -2.110826698e-04f, -3.663745517e-04f, -3.630663859e-04f, -2.508801606e-04f, -9.784099981e-05f, +3.519325555e-05f, +1.119851055e-04f, +1.259637630e-04f, +9.384506926e-05f, +4.281104231e-05f, -2.460396421e-06f, -2.803806407e-05f, -3.240260206e-05f, -2.275727877e-05f, -9.044283303e-06f, +1.168558256e-06f,\n    -4.695441913e-04f, -8.760245903e-04f, -7.991262853e-04f, +3.609359108e-04f, +2.669005882e-03f, +5.123520433e-03f, +5.756824028e-03f, +2.666330662e-03f, -4.391153447e-03f, -1.286988254e-02f, -1.788752723e-02f, -1.460168041e-02f, -1.523932150e-03f, +1.725044458e-02f, +3.279097737e-02f, +3.543144146e-02f, +2.041889438e-02f, -8.138301776e-03f, -3.784986960e-02f, -5.361879579e-02f, -4.563734919e-02f, -1.538951341e-02f, +2.405922395e-02f, +5.415199909e-02f, +6.027964365e-02f, +3.943542163e-02f, +1.806002989e-03f, -3.459875701e-02f, -5.325818292e-02f, -4.725236417e-02f, -2.191062565e-02f, +9.010274443e-03f, +3.101702015e-02f, +3.598762072e-02f, +2.506323550e-02f, +6.436027081e-03f, -9.981143894e-03f, -1.767229629e-02f, -1.581423255e-02f, -8.178062671e-03f, -1.449274037e-05f, +4.933377074e-03f, +5.755457105e-03f, +3.825748126e-03f, +1.260801849e-03f, -4.486511040e-04f, -9.414792306e-04f, -6.658125686e-04f,\n    +1.382314016e-05f, +8.837361929e-06f, -1.633537227e-05f, -5.567335481e-05f, -8.260631152e-05f, -6.074030726e-05f, +2.922575262e-05f, +1.619350567e-04f, +2.628105067e-04f, +2.412017540e-04f, +5.112063874e-05f, -2.563527416e-04f, -5.312588432e-04f, -5.917982521e-04f, -3.338793035e-04f, +1.804325406e-04f, +7.201684470e-04f, +9.892171113e-04f, +7.907896309e-04f, +1.592747329e-04f, -6.271099183e-04f, -1.175660842e-03f, -1.187710250e-03f, -6.294585642e-04f, +2.371170630e-04f, +9.871559923e-04f, +1.257552114e-03f, +9.367111105e-04f, +2.136004132e-04f, -5.365573630e-04f, -9.585806927e-04f, -8.962304303e-04f, -4.485957701e-04f, +1.138649555e-04f, +5.112102807e-04f, +5.957879751e-04f, +4.007920296e-04f, +8.567434117e-05f, -1.725816699e-04f, -2.725326564e-04f, -2.189653917e-04f, -8.969986767e-05f, +2.676414031e-05f, +8.037843185e-05f, +7.208531271e-05f, +3.417949566e-05f, +3.436649713e-07f, -1.364594403e-05f,\n    /*  3,24 (48) */\n    +2.962617242e-04f, +3.212134736e-04f, +2.032036918e-05f, -7.091731833e-04f, -1.729022245e-03f, -2.589805465e-03f, -2.622809069e-03f, -1.218713516e-03f, +1.781901362e-03f, +5.756243131e-03f, +9.231321737e-03f, +1.022563956e-02f, +6.990824090e-03f, -1.054151401e-03f, -1.255795560e-02f, -2.402988123e-02f, -3.043769849e-02f, -2.657554044e-02f, -8.843476421e-03f, +2.315223411e-02f, +6.579878040e-02f, +1.118838460e-01f, +1.522204045e-01f, +1.780590990e-01f, +1.835441367e-01f, +1.674111697e-01f, +1.333584052e-01f, +8.896542591e-02f, +4.352426113e-02f, +5.501680991e-03f, -1.955763232e-02f, -3.007424475e-02f, -2.820822684e-02f, -1.858910326e-02f, -6.544534960e-03f, +3.536433642e-03f, +9.211346736e-03f, +1.016408956e-02f, +7.675149378e-03f, +3.721312934e-03f, +1.000562444e-04f, -2.125596518e-03f, -2.753616827e-03f, -2.218371750e-03f, -1.203730513e-03f, -2.924028285e-04f, +2.219775210e-04f, +3.375558459e-04f,\n    -3.887741319e-06f, +3.206055989e-06f, +1.583741601e-05f, +2.870331762e-05f, +3.255876525e-05f, +1.807329880e-05f, -1.828092849e-05f, -6.896357953e-05f, -1.140471018e-04f, -1.261927572e-04f, -8.169732682e-05f, +2.585857515e-05f, +1.752353437e-04f, +3.164408930e-04f, +3.821851813e-04f, +3.102208145e-04f, +6.967147102e-05f, -3.187373323e-04f, -7.779793207e-04f, -1.190200104e-03f, -1.429573887e-03f, -1.402545559e-03f, -1.081513561e-03f, -5.192504775e-04f, +1.623385964e-04f, +8.064010613e-04f, +1.267121457e-03f, +1.451967164e-03f, +1.346052953e-03f, +1.011108915e-03f, +5.607488983e-04f, +1.219248981e-04f, -2.034562514e-04f, -3.640896352e-04f, -3.651517933e-04f, -2.553639164e-04f, -1.025864097e-04f, +3.177609154e-05f, +1.105729513e-04f, +1.263532515e-04f, +9.528197147e-05f, +4.442473797e-05f, -1.304645589e-06f, -2.758009056e-05f, -3.252916038e-05f, -2.317004037e-05f, -9.447910213e-06f, +9.431530473e-07f,\n    -4.557210512e-04f, -8.671872283e-04f, -8.154616576e-04f, +3.052625560e-04f, +2.586399571e-03f, +5.062780126e-03f, +5.786049781e-03f, +2.828265719e-03f, -4.128342940e-03f, -1.262868078e-02f, -1.783640660e-02f, -1.485803315e-02f, -2.055190993e-03f, +1.665864633e-02f, +3.245709807e-02f, +3.561187401e-02f, +2.113906282e-02f, -7.149084665e-03f, -3.705907997e-02f, -5.345952105e-02f, -4.626445911e-02f, -1.656517425e-02f, +2.287151370e-02f, +5.352254052e-02f, +6.051676072e-02f, +4.042257762e-02f, +3.063555103e-03f, -3.366204590e-02f, -5.304458251e-02f, -4.778892153e-02f, -2.286920634e-02f, +8.114044013e-03f, +3.056842438e-02f, +3.610148568e-02f, +2.557444578e-02f, +7.031815056e-03f, -9.580351865e-03f, -1.758662195e-02f, -1.598681422e-02f, -8.450595327e-03f, -2.334581321e-04f, +4.843677207e-03f, +5.782221245e-03f, +3.906126557e-03f, +1.332887162e-03f, -4.144716084e-04f, -9.411355656e-04f, -6.794585126e-04f,\n    +1.372967500e-05f, +9.278914423e-06f, -1.524945968e-05f, -5.444713427e-05f, -8.232434518e-05f, -6.244626716e-05f, +2.549575523e-05f, +1.577862775e-04f, +2.610858231e-04f, +2.443996772e-04f, +5.939056664e-05f, -2.462725265e-04f, -5.250461533e-04f, -5.945512379e-04f, -3.466302178e-04f, +1.624501163e-04f, +7.059350357e-04f, +9.873630894e-04f, +8.044139162e-04f, +1.832927891e-04f, -6.041071003e-04f, -1.165641565e-03f, -1.196605909e-03f, -6.535621626e-04f, +2.095023907e-04f, +9.695907853e-04f, +1.258280144e-03f, +9.544776028e-04f, +2.387361456e-04f, -5.166059077e-04f, -9.525849697e-04f, -9.051136635e-04f, -4.659339923e-04f, +9.755980851e-05f, +5.032305666e-04f, +5.979730964e-04f, +4.096984102e-04f, +9.545894178e-05f, -1.666573908e-04f, -2.720046459e-04f, -2.222838567e-04f, -9.394195902e-05f, +2.395346008e-05f, +7.975667761e-05f, +7.299351605e-05f, +3.544241166e-05f, +1.126549914e-06f, -1.351207367e-05f,\n    /*  3,25 (48) */\n    +2.923739829e-04f, +3.244195295e-04f, +3.615778519e-05f, -6.804698657e-04f, -1.696463480e-03f, -2.571732166e-03f, -2.641089998e-03f, -1.287677096e-03f, +1.667854260e-03f, +5.630050374e-03f, +9.149624410e-03f, +1.025149813e-02f, +7.166059434e-03f, -7.377105075e-04f, -1.217577041e-02f, -2.371966041e-02f, -3.036802702e-02f, -2.689427778e-02f, -9.621455742e-03f, +2.196203401e-02f, +6.436920651e-02f, +1.104813004e-01f, +1.511388909e-01f, +1.775398486e-01f, +1.837064753e-01f, +1.682175708e-01f, +1.346255266e-01f, +9.041739307e-02f, +4.487031408e-02f, +6.512789906e-03f, -1.899688343e-02f, -2.995231985e-02f, -2.841168309e-02f, -1.895319289e-02f, -6.909686753e-03f, +3.281069726e-03f, +9.108760326e-03f, +1.019586565e-02f, +7.785722329e-03f, +3.847666186e-03f, +1.953382158e-04f, -2.081171780e-03f, -2.754921472e-03f, -2.245951840e-03f, -1.236259674e-03f, -3.155728688e-04f, +2.125296108e-04f, +3.384989990e-04f,\n    -4.003341125e-06f, +2.886233797e-06f, +1.539901900e-05f, +2.838383397e-05f, +3.267567353e-05f, +1.886280976e-05f, -1.685545253e-05f, -6.733312003e-05f, -1.129899195e-04f, -1.265775157e-04f, -8.407257635e-05f, +2.167520746e-05f, +1.703680708e-04f, +3.128058986e-04f, +3.819449340e-04f, +3.149782048e-04f, +7.968398176e-05f, -3.049954720e-04f, -7.636652355e-04f, -1.179320741e-03f, -1.425780546e-03f, -1.407900393e-03f, -1.095674065e-03f, -5.393960823e-04f, +1.407695631e-04f, +7.883896686e-04f, +1.256604192e-03f, +1.450725344e-03f, +1.353319360e-03f, +1.023991514e-03f, +5.752801377e-04f, +1.343388010e-04f, -1.956641385e-04f, -3.616452175e-04f, -3.671273824e-04f, -2.598063079e-04f, -1.073519189e-04f, +2.830211710e-05f, +1.090972631e-04f, +1.266960993e-04f, +9.669978219e-05f, +4.604437911e-05f, -1.288219903e-07f, -2.710054154e-05f, -3.264151887e-05f, -2.357875726e-05f, -9.855206040e-06f, +7.112032361e-07f,\n    -4.419913762e-04f, -8.579083139e-04f, -8.307111173e-04f, +2.508154217e-04f, +2.504075226e-03f, +5.000333859e-03f, +5.811545536e-03f, +2.986051997e-03f, -3.867257117e-03f, -1.238428111e-02f, -1.777701603e-02f, -1.510430567e-02f, -2.580237146e-03f, +1.606409509e-02f, +3.211046785e-02f, +3.577432412e-02f, +2.184499786e-02f, -6.161721576e-03f, -3.625466605e-02f, -5.327622826e-02f, -4.686856621e-02f, -1.773081582e-02f, +2.167490780e-02f, +5.286897836e-02f, +6.072626311e-02f, +4.139216841e-02f, +4.321835247e-03f, -3.270756830e-02f, -5.280584636e-02f, -4.830552744e-02f, -2.382179131e-02f, +7.208930350e-03f, +3.010249039e-02f, +3.619904549e-02f, +2.607767635e-02f, +7.629788152e-03f, -9.170653454e-03f, -1.749116300e-02f, -1.615347161e-02f, -8.722599973e-03f, -4.557419887e-04f, +4.749735248e-03f, +5.806174705e-03f, +3.985883235e-03f, +1.405880678e-03f, -3.790291967e-04f, -9.400090157e-04f, -6.929705863e-04f,\n    +1.362524182e-05f, +9.699627145e-06f, -1.417974247e-05f, -5.321091650e-05f, -8.199446477e-05f, -6.408192298e-05f, +2.181355622e-05f, +1.536109821e-04f, +2.592404393e-04f, +2.474248378e-04f, +6.753371491e-05f, -2.361694382e-04f, -5.186228688e-04f, -5.969798764e-04f, -3.591109445e-04f, +1.445077386e-04f, +6.914377299e-04f, +9.850356039e-04f, +8.175886110e-04f, +2.071376851e-04f, -5.808762122e-04f, -1.155081271e-03f, -1.204914861e-03f, -6.773383576e-04f, +1.817823486e-04f, +9.515434587e-04f, +1.258403080e-03f, +9.718250891e-04f, +2.638345942e-04f, -4.963252740e-04f, -9.460946405e-04f, -9.135991424e-04f, -4.831498493e-04f, +8.108892828e-05f, +4.949312534e-04f, +5.998706843e-04f, +4.184802618e-04f, +1.053011715e-04f, -1.605706006e-04f, -2.713187798e-04f, -2.255246866e-04f, -9.819774306e-05f, +2.107759459e-05f, +7.907108373e-05f, +7.387160839e-05f, +3.671014137e-05f, +1.930354200e-06f, -1.336098404e-05f,\n    /*  3,26 (48) */\n    +2.883706418e-04f, +3.273057633e-04f, +5.155680418e-05f, -6.520860317e-04f, -1.663787806e-03f, -2.552869356e-03f, -2.657945450e-03f, -1.355010216e-03f, +1.554864340e-03f, +5.503472858e-03f, +9.065551833e-03f, +1.027317334e-02f, +7.336427504e-03f, -4.249046089e-04f, -1.179382548e-02f, -2.340468221e-02f, -3.028834304e-02f, -2.719927325e-02f, -1.038512098e-02f, +2.078271327e-02f, +6.294342596e-02f, +1.090734000e-01f, +1.500432169e-01f, +1.770004525e-01f, +1.838472449e-01f, +1.690059605e-01f, +1.358821308e-01f, +9.186811842e-02f, +4.622363344e-02f, +7.536781420e-03f, -1.842160329e-02f, -2.981798105e-02f, -2.860734723e-02f, -1.931483811e-02f, -7.276814136e-03f, +3.021263418e-03f, +9.001408407e-03f, +1.022416777e-02f, +7.894819592e-03f, +3.974362285e-03f, +2.920379980e-04f, -2.035127401e-03f, -2.755050294e-03f, -2.273052382e-03f, -1.268901192e-03f, -3.391516261e-04f, +2.026744047e-04f, +3.392102022e-04f,\n    -4.112779054e-06f, +2.572314865e-06f, +1.496144545e-05f, +2.805590700e-05f, +3.277444107e-05f, +1.962999545e-05f, -1.544547346e-05f, -6.569864863e-05f, -1.119011921e-04f, -1.269060919e-04f, -8.638373006e-05f, +1.753627284e-05f, +1.654962695e-04f, +3.090990316e-04f, +3.815692209e-04f, +3.195668788e-04f, +8.954578688e-05f, -2.913294552e-04f, -7.493099823e-04f, -1.168273555e-03f, -1.421723547e-03f, -1.412960956e-03f, -1.109590290e-03f, -5.594176131e-04f, +1.191679313e-04f, +7.701986314e-04f, +1.245812685e-03f, +1.449192291e-03f, +1.360354815e-03f, +1.036756339e-03f, +5.898210613e-04f, +1.468653409e-04f, -1.877070282e-04f, -3.590403383e-04f, -3.689911742e-04f, -2.642051807e-04f, -1.121359191e-04f, +2.477201947e-05f, +1.075578371e-04f, +1.269915428e-04f, +9.809761845e-05f, +4.766932167e-05f, +1.066831678e-06f, -2.659930036e-05f, -3.273937254e-05f, -2.398312798e-05f, -1.026599884e-05f, +4.727250007e-07f,\n    -4.283661344e-04f, -8.482086868e-04f, -8.448908597e-04f, +1.976045052e-04f, +2.422080761e-03f, +4.936251936e-03f, +5.833359092e-03f, +3.139662979e-03f, -3.608016678e-03f, -1.213685627e-02f, -1.770948231e-02f, -1.534047511e-02f, -3.098860015e-03f, +1.546711522e-02f, +3.175135691e-02f, +3.591883186e-02f, +2.253643559e-02f, -5.176685972e-03f, -3.543707744e-02f, -5.306909058e-02f, -4.744944242e-02f, -1.888589709e-02f, +2.046999293e-02f, +5.219164000e-02f, +6.090804546e-02f, +4.234371187e-02f, +5.580238328e-03f, -3.173574321e-02f, -5.254201177e-02f, -4.880185272e-02f, -2.476788595e-02f, +6.295331207e-03f, +2.961934054e-02f, +3.628013442e-02f, +2.657260760e-02f, +8.229658837e-03f, -8.752173193e-03f, -1.738586183e-02f, -1.631404221e-02f, -8.993918753e-03f, -6.812666753e-04f, +4.651537505e-03f, +5.827252300e-03f, +4.064954319e-03f, +1.479752286e-03f, -3.423190553e-04f, -9.380786615e-04f, -7.063315703e-04f,\n    +1.351023705e-05f, +1.009965468e-05f, -1.312669022e-05f, -5.196580074e-05f, -8.161779110e-05f, -6.564741609e-05f, +1.818069976e-05f, +1.494120619e-04f, +2.572770162e-04f, +2.502775821e-04f, +7.554692499e-05f, -2.260492410e-04f, -5.119943527e-04f, -5.990855072e-04f, -3.713168784e-04f, +1.266144987e-04f, +6.766855115e-04f, +9.822381595e-04f, +8.303088519e-04f, +2.307979033e-04f, -5.574296133e-04f, -1.143986344e-03f, -1.212633655e-03f, -7.007753656e-04f, +1.539708695e-04f, +9.330226906e-04f, +1.257919916e-03f, +9.887438369e-04f, +2.888828959e-04f, -4.757245889e-04f, -9.391108251e-04f, -9.216803928e-04f, -5.002336227e-04f, +6.445985719e-05f, +4.863143052e-04f, +6.014772487e-04f, +4.271315862e-04f, +1.151961420e-04f, -1.543228943e-04f, -2.704734651e-04f, -2.286848653e-04f, -1.024647908e-04f, +1.813731700e-05f, +7.832095665e-05f, +7.471836679e-05f, +3.798182344e-05f, +2.754913188e-06f, -1.319236015e-05f,\n    /*  3,27 (48) */\n    +2.842578627e-04f, +3.298780782e-04f, +6.651824963e-05f, -6.240301247e-04f, -1.631013365e-03f, -2.533239361e-03f, -2.673390924e-03f, -1.420708864e-03f, +1.442963148e-03f, +5.376566766e-03f, +8.979168103e-03f, +1.029070961e-02f, +7.501923774e-03f, -1.158055773e-04f, -1.141225626e-02f, -2.308511533e-02f, -3.019879725e-02f, -2.749060270e-02f, -1.113443096e-02f, +1.961443971e-02f, +6.152170242e-02f, +1.076604390e-01f, +1.489336266e-01f, +1.764410349e-01f, +1.839664128e-01f, +1.697761591e-01f, +1.371279435e-01f, +9.331731071e-02f, +4.758398826e-02f, +8.573537759e-03f, -1.783178223e-02f, -2.967111571e-02f, -2.879505426e-02f, -1.967387845e-02f, -7.645805310e-03f, +2.757058237e-03f, +8.889272488e-03f, +1.024893978e-02f, +8.002377430e-03f, +4.101353828e-03f, +3.901356165e-04f, -1.987458079e-03f, -2.753983463e-03f, -2.299651682e-03f, -1.301640565e-03f, -3.631347541e-04f, +1.924084059e-04f, +3.396829272e-04f,\n    -4.216109366e-06f, +2.264375771e-06f, +1.452492876e-05f, +2.771985991e-05f, +3.285532073e-05f, +2.037484222e-05f, -1.405140252e-05f, -6.406093845e-05f, -1.107818055e-04f, -1.271790738e-04f, -8.863065662e-05f, +1.344285118e-05f, +1.606218381e-04f, +3.053224756e-04f, +3.810597053e-04f, +3.239871777e-04f, +9.925544176e-05f, -2.777423880e-04f, -7.349175668e-04f, -1.157062250e-03f, -1.417405042e-03f, -1.417727002e-03f, -1.123259489e-03f, -5.793105393e-04f, +9.753869981e-05f, +7.518319412e-04f, +1.234748787e-03f, +1.447367298e-03f, +1.367156457e-03f, +1.049399420e-03f, +6.043678766e-04f, +1.595019776e-04f, -1.795856748e-04f, -3.562740812e-04f, -3.707412088e-04f, -2.685583734e-04f, -1.169367772e-04f, +2.118651621e-05f, +1.059544931e-04f, +1.272388292e-04f, +9.947459474e-05f, +4.929891051e-05f, +2.282059878e-06f, -2.607625943e-05f, -3.282241924e-05f, -2.438284863e-05f, -1.068011173e-05f, +2.277388815e-07f,\n    -4.148558973e-04f, -8.381090321e-04f, -8.580175499e-04f, +1.456387045e-04f, +2.340462970e-03f, +4.870604520e-03f, +5.851539792e-03f, +3.289075041e-03f, -3.350739662e-03f, -1.188657869e-02f, -1.763393539e-02f, -1.556652435e-02f, -3.610854368e-03f, +1.486802971e-02f, +3.138004003e-02f, +3.604544636e-02f, +2.321312110e-02f, -4.194447812e-03f, -3.460676859e-02f, -5.283829268e-02f, -4.800687203e-02f, -2.002988343e-02f, +1.925735928e-02f, +5.149086464e-02f, +6.106201633e-02f, +4.327673456e-02f, +6.838158244e-03f, -3.074699937e-02f, -5.225312887e-02f, -4.927757730e-02f, -2.570699678e-02f, +5.373650814e-03f, +2.911910692e-02f, +3.634459427e-02f, +2.705892191e-02f, +8.831136085e-03f, -8.325041607e-03f, -1.727066569e-02f, -1.646836510e-02f, -9.264392218e-03f, -9.099515406e-04f, +4.549072714e-03f, +5.845389617e-03f, +4.143275275e-03f, +1.554470653e-03f, -3.043372319e-04f, -9.353237483e-04f, -7.195239305e-04f,\n    +1.338505782e-05f, +1.047916587e-05f, -1.209074997e-05f, -5.071287250e-05f, -8.119545879e-05f, -6.714293286e-05f, +1.459867564e-05f, +1.451923846e-04f, +2.551982542e-04f, +2.529583551e-04f, +8.342714677e-05f, -2.159176551e-04f, -5.051660376e-04f, -6.008696396e-04f, -3.832435974e-04f, +1.087794048e-04f, +6.616874512e-04f, +9.789744964e-04f, +8.425700365e-04f, +2.542620618e-04f, -5.337797449e-04f, -1.132363442e-03f, -1.219759154e-03f, -7.238615871e-04f, +1.260819359e-04f, +9.140374150e-04f, +1.256829962e-03f, +1.005224319e-03f, +3.138681769e-04f, -4.548131826e-04f, -9.316349126e-04f, -9.293511264e-04f, -5.171756103e-04f, +4.768027379e-05f, +4.773818773e-04f, +6.027894352e-04f, +4.356464065e-04f, +1.251388857e-04f, -1.479159801e-04f, -2.694671867e-04f, -2.317613882e-04f, -1.067406320e-04f, +1.513345528e-05f, +7.750563625e-05f, +7.553256929e-05f, +3.925657677e-05f, +3.600041585e-06f, -1.300589560e-05f,\n    /*  3,28 (48) */\n    +2.800417534e-04f, +3.321424540e-04f, +8.104317839e-05f, -5.963102648e-04f, -1.598158045e-03f, -2.512864519e-03f, -2.687442326e-03f, -1.484769803e-03f, +1.332181343e-03f, +5.249387692e-03f, +8.890537447e-03f, +1.030415246e-02f, +7.662545612e-03f, +1.895168983e-04f, -1.103119655e-02f, -2.276112815e-02f, -3.009954181e-02f, -2.776834509e-02f, -1.186934853e-02f, +1.845737746e-02f, +6.010429737e-02f, +1.062427120e-01f, +1.478103671e-01f, +1.758617243e-01f, +1.840639515e-01f, +1.705279911e-01f, +1.383626923e-01f, +9.476467801e-02f, +4.895114472e-02f, +9.622937179e-03f, -1.722741435e-02f, -2.951161373e-02f, -2.897463993e-02f, -2.003015253e-02f, -8.016546519e-03f, +2.488499864e-03f, +8.772335711e-03f, +1.027012630e-02f, +8.108331923e-03f, +4.228592657e-03f, +4.896102112e-04f, -1.938159169e-03f, -2.751701403e-03f, -2.325727942e-03f, -1.334462984e-03f, -3.875176027e-04f, +1.817282941e-04f, +3.399106661e-04f,\n    -4.313389282e-06f, +1.962488206e-06f, +1.408969792e-05f, +2.737601512e-05f, +3.291857052e-05f, +2.109734737e-05f, -1.267363801e-05f, -6.242075398e-05f, -1.096326479e-04f, -1.273970654e-04f, -9.081325215e-05f, +9.395992526e-06f, +1.557466555e-04f, +3.014784169e-04f, +3.804180795e-04f, +3.282394937e-04f, +1.088115592e-04f, -2.642373334e-04f, -7.204919830e-04f, -1.145690556e-03f, -1.412827242e-03f, -1.422198365e-03f, -1.136678987e-03f, -5.990703682e-04f, +7.588687551e-05f, +7.332936410e-04f, +1.223414427e-03f, +1.445249734e-03f, +1.373721479e-03f, +1.061916802e-03f, +6.189167668e-04f, +1.722461206e-04f, -1.713008898e-04f, -3.533455744e-04f, -3.723755467e-04f, -2.728637187e-04f, -1.217528356e-04f, +1.754635521e-05f, +1.042870754e-04f, +1.274372170e-04f, +1.008298234e-04f, +5.093247959e-05f, +3.516594185e-06f, -2.553132036e-05f, -3.289035984e-05f, -2.477761287e-05f, -1.109736287e-05f, -2.373016503e-08f,\n    -4.014708395e-04f, -8.276298662e-04f, -8.701082999e-04f, +9.492583196e-05f, +2.259267511e-03f, +4.803461587e-03f, +5.866138468e-03f, +3.434267425e-03f, -3.095541408e-03f, -1.163362033e-02f, -1.755050824e-02f, -1.578244201e-02f, -4.116020405e-03f, +1.426716007e-02f, +3.099679643e-02f, +3.615422576e-02f, +2.387480855e-02f, -3.215473316e-03f, -3.376419855e-02f, -5.258403061e-02f, -4.854065178e-02f, -2.116224687e-02f, +1.803760013e-02f, +5.076700305e-02f, +6.118809826e-02f, +4.419077197e-02f, +8.094988206e-03f, -2.974177505e-02f, -5.193926069e-02f, -4.973239049e-02f, -2.663863169e-02f, +4.444299688e-03f, +2.860193131e-02f, +3.639227455e-02f, +2.753630378e-02f, +9.433925520e-03f, -7.889395200e-03f, -1.714552680e-02f, -1.661628108e-02f, -9.533859405e-03f, -1.141712929e-03f, +4.442332082e-03f, +5.860523072e-03f, +4.220780912e-03f, +1.630003222e-03f, -2.650806551e-04f, -9.317237067e-04f, -7.325298261e-04f,\n    +1.325010149e-05f, +1.083834336e-05f, -1.107234635e-05f, -4.945320309e-05f, -8.072861528e-05f, -6.856870388e-05f, +1.106891903e-05f, +1.409547922e-04f, +2.530068907e-04f, +2.554676994e-04f, +9.117143940e-05f, -2.057803530e-04f, -4.981434225e-04f, -6.023339503e-04f, -3.948868638e-04f, +9.101137782e-05f, +6.464527035e-04f, +9.752485870e-04f, +8.543678256e-04f, +2.775189198e-04f, -5.099391233e-04f, -1.120219483e-03f, -1.226288538e-03f, -7.465856134e-04f, +9.812957267e-05f, +8.945968170e-04f, +1.255132848e-03f, +1.021257219e-03f, +3.387775609e-04f, -4.336005838e-04f, -9.236685619e-04f, -9.366052454e-04f, -5.339661313e-04f, +3.075798926e-05f, +4.681363162e-04f, +6.038040284e-04f, +4.440187700e-04f, +1.351243585e-04f, -1.413516791e-04f, -2.682985099e-04f, -2.347512644e-04f, -1.110227562e-04f, +1.206689233e-05f, +7.662449684e-05f, +7.631299584e-05f, +4.053350083e-05f, +4.465533215e-06f, -1.280129310e-05f,\n    /*  3,29 (48) */\n    +2.757283641e-04f, +3.341049422e-04f, +9.513287631e-05f, -5.689342497e-04f, -1.565239474e-03f, -2.491767171e-03f, -2.700115964e-03f, -1.547190557e-03f, +1.222548695e-03f, +5.121990627e-03f, +8.799724195e-03f, +1.031354846e-02f, +7.818292268e-03f, +4.909953152e-04f, -1.065077847e-02f, -2.243288866e-02f, -2.999073025e-02f, -2.803258242e-02f, -1.258984051e-02f, +1.731168690e-02f, +5.869147013e-02f, +1.048205137e-01f, +1.466736881e-01f, +1.752626540e-01f, +1.841398384e-01f, +1.712612847e-01f, +1.395861067e-01f, +9.620992774e-02f, +5.032486620e-02f, +1.068485398e-02f, -1.660849758e-02f, -2.933936761e-02f, -2.914594082e-02f, -2.038349811e-02f, -8.388922065e-03f, +2.215636145e-03f, +8.650582875e-03f, +1.028767266e-02f, +8.212618998e-03f, +4.356029874e-03f, +5.904400346e-04f, -1.887226689e-03f, -2.748184809e-03f, -2.351259262e-03f, -1.367353344e-03f, -4.122952156e-04f, +1.706309313e-04f, +3.398869359e-04f,\n    -4.404678912e-06f, +1.666719010e-06f, +1.365597741e-05f, +2.702469411e-05f, +3.296445351e-05f, +2.179751896e-05f, -1.131256524e-05f, -6.077885086e-05f, -1.084546092e-04f, -1.275606867e-04f, -9.293143999e-05f, +5.396717026e-06f, +1.508725802e-04f, +2.975690434e-04f, +3.796460644e-04f, +3.323242692e-04f, +1.182128095e-04f, -2.508173099e-04f, -7.060372125e-04f, -1.134162233e-03f, -1.407992425e-03f, -1.426374959e-03f, -1.149846182e-03f, -6.186926465e-04f, +5.421747208e-05f, +7.145878244e-04f, +1.211811609e-03f, +1.442839046e-03f, +1.380047129e-03f, +1.074304548e-03f, +6.334638925e-04f, +1.850951294e-04f, -1.628535423e-04f, -3.502539917e-04f, -3.738922690e-04f, -2.771190438e-04f, -1.265824125e-04f, +1.385231473e-05f, +1.025554528e-04f, +1.275859766e-04f, +1.021624150e-04f, +5.256935211e-05f, +4.770153257e-06f, -2.496439415e-05f, -3.294289841e-05f, -2.516711215e-05f, -1.151756553e-05f, -2.816527132e-07f,\n    -3.882207380e-04f, -8.167915229e-04f, -8.811806463e-04f, +4.547262888e-05f, +2.178538896e-03f, +4.734892883e-03f, +5.877207387e-03f, +3.575222217e-03f, -2.842534517e-03f, -1.137815263e-02f, -1.745933680e-02f, -1.598822236e-02f, -4.614163828e-03f, +1.366482612e-02f, +3.060190957e-02f, +3.624523714e-02f, +2.452126126e-02f, -2.240224729e-03f, -3.290983073e-02f, -5.230651169e-02f, -4.905059090e-02f, -2.228246635e-02f, +1.681131159e-02f, +5.002041744e-02f, +6.128622784e-02f, +4.508536879e-02f, +9.350121055e-03f, -2.872051783e-02f, -5.160048313e-02f, -5.016599107e-02f, -2.756230025e-02f, +3.507694442e-03f, +2.806796518e-02f, +3.642303254e-02f, +2.800444010e-02f, +1.003772955e-02f, -7.445376430e-03f, -1.701040245e-02f, -1.675763276e-02f, -9.802157915e-03f, -1.376464193e-03f, +4.331309326e-03f, +5.872589965e-03f, +4.297405409e-03f, +1.706316218e-03f, -2.245471543e-04f, -9.272581735e-04f, -7.453311192e-04f,\n    +1.310576536e-05f, +1.117738321e-05f, -1.007188154e-05f, -4.818784893e-05f, -8.021841976e-05f, -6.992500318e-05f, +7.592810238e-06f, +1.367021002e-04f, +2.507056983e-04f, +2.578062539e-04f, +9.877697198e-05f, -1.956429568e-04f, -4.909320686e-04f, -6.034802808e-04f, -4.062426254e-04f, +7.331924678e-05f, +6.309905005e-04f, +9.710646329e-04f, +8.656981442e-04f, +3.005573838e-04f, -4.859203331e-04f, -1.107561650e-03f, -1.232219304e-03f, -7.689362327e-04f, +7.012783938e-05f, +8.747103281e-04f, +1.252828523e-03f, +1.036833437e-03f, +3.635981751e-04f, -4.120965150e-04f, -9.152137016e-04f, -9.434368467e-04f, -5.505955327e-04f, +1.370094375e-05f, +4.585801599e-04f, +6.045179545e-04f, +4.522427527e-04f, +1.451474416e-04f, -1.346319256e-04f, -2.669660816e-04f, -2.376515187e-04f, -1.153086141e-04f, +8.938566172e-06f, +7.567694817e-05f, +7.705842929e-05f, +4.181167602e-05f, +5.351160797e-06f, -1.257826480e-05f,\n    /*  3,30 (48) */\n    +2.713236852e-04f, +3.357716612e-04f, +1.087888537e-04f, -5.419095556e-04f, -1.532275021e-03f, -2.469969652e-03f, -2.711428529e-03f, -1.607969408e-03f, +1.114094085e-03f, +4.994429940e-03f, +8.706792755e-03f, +1.031894517e-02f, +7.969164848e-03f, +7.885643586e-04f, -1.027113241e-02f, -2.210056439e-02f, -2.987251744e-02f, -2.828339973e-02f, -1.329587772e-02f, +1.617752467e-02f, +5.728347771e-02f, +1.033941387e-01f, +1.455238419e-01f, +1.746439613e-01f, +1.841940559e-01f, +1.719758725e-01f, +1.407979183e-01f, +9.765276679e-02f, +5.170491332e-02f, +1.175915853e-02f, -1.597503369e-02f, -2.915427248e-02f, -2.930879436e-02f, -2.073375210e-02f, -8.762814334e-03f, +1.938517101e-03f, +8.524000463e-03f, +1.030152497e-02f, +8.315174451e-03f, +4.483615851e-03f, +6.926024496e-04f, -1.834657337e-03f, -2.743414655e-03f, -2.376223656e-03f, -1.400296242e-03f, -4.374623277e-04f, +1.591133657e-04f, +3.396052832e-04f,\n    -4.490041168e-06f, +1.377130203e-06f, +1.322398717e-05f, +2.666621724e-05f, +3.299323754e-05f, +2.247537575e-05f, -9.968556543e-06f, -5.913597559e-05f, -1.072485805e-04f, -1.276705727e-04f, -9.498517043e-05f, +1.446014787e-06f, +1.460014508e-04f, +2.935965438e-04f, +3.787454085e-04f, +3.362419967e-04f, +1.274579203e-04f, -2.374852913e-04f, -6.915572233e-04f, -1.122481066e-03f, -1.402902931e-03f, -1.430256781e-03f, -1.162758543e-03f, -6.381729614e-04f, +3.253550840e-05f, +6.957186340e-04f, +1.199942416e-03f, +1.440134762e-03f, +1.386130709e-03f, +1.086558738e-03f, +6.480053926e-04f, +1.980463138e-04f, -1.542445587e-04f, -3.469985528e-04f, -3.752894788e-04f, -2.813221715e-04f, -1.314238026e-04f, +1.010520338e-05f, +1.007595192e-04f, +1.276843902e-04f, +1.034714787e-04f, +5.420884075e-05f, +6.042442799e-06f, -2.437540135e-05f, -3.297974244e-05f, -2.555103579e-05f, -1.194052812e-05f, -5.459948177e-07f,\n    -3.751149726e-04f, -8.056141397e-04f, -8.912525278e-04f, -2.715220056e-06f, +2.098320476e-03f, +4.664967880e-03f, +5.884800197e-03f, +3.711924318e-03f, -2.591828819e-03f, -1.112034638e-02f, -1.736055983e-02f, -1.618386532e-02f, -5.105095897e-03f, +1.306134584e-02f, +3.019566694e-02f, +3.631855639e-02f, +2.515225176e-02f, -1.269160096e-03f, -3.204413258e-02f, -5.200595431e-02f, -4.953651123e-02f, -2.339002800e-02f, +1.557909228e-02f, +4.925148120e-02f, +6.135635567e-02f, +4.596007912e-02f, +1.060294958e-02f, -2.768368439e-02f, -5.123688496e-02f, -5.057808759e-02f, -2.847751395e-02f, +2.564257596e-03f, +2.751736964e-02f, +3.643673348e-02f, +2.846302026e-02f, +1.064224750e-02f, -6.993133677e-03f, -1.686525500e-02f, -1.689226469e-02f, -1.006912400e-02f, -1.614115712e-03f, +4.216000711e-03f, +5.881528531e-03f, +4.373082357e-03f, +1.783374647e-03f, -1.827354783e-04f, -9.219070127e-04f, -7.579093840e-04f,\n    +1.295244630e-05f, +1.149649446e-05f, -9.089735452e-06f, -4.691785108e-05f, -7.966604217e-05f, -7.121214734e-05f, +4.171674522e-06f, +1.324370954e-04f, +2.482974822e-04f, +2.599747520e-04f, +1.062410242e-04f, -1.855110352e-04f, -4.835375958e-04f, -6.043106357e-04f, -4.173070169e-04f, +5.571174430e-05f, +6.153101469e-04f, +9.664270613e-04f, +8.765571829e-04f, +3.233665128e-04f, -4.617360196e-04f, -1.094397381e-03f, -1.237549266e-03f, -7.909024357e-04f, +4.209082247e-05f, +8.543876214e-04f, +1.249917253e-03f, +1.051944096e-03f, +3.883171580e-04f, -3.903108881e-04f, -9.062725306e-04f, -9.498402261e-04f, -5.670541940e-04f, -3.482797389e-06f, +4.487161370e-04f, +6.049282845e-04f, +4.603124626e-04f, +1.552029443e-04f, -1.277587669e-04f, -2.654686322e-04f, -2.404591937e-04f, -1.195956183e-04f, +5.749470101e-06f, +7.466243631e-05f, +7.776765626e-05f, +4.309016406e-05f, +6.256675746e-06f, -1.233653283e-05f,\n    /*  3,31 (48) */\n    +2.668336440e-04f, +3.371487914e-04f, +1.220128409e-04f, -5.152433383e-04f, -1.499281783e-03f, -2.447494277e-03f, -2.721397086e-03f, -1.667105383e-03f, +1.006845505e-03f, +4.866759367e-03f, +8.611807584e-03f, +1.032039119e-02f, +8.115166299e-03f, +1.082160902e-03f, -9.892387002e-03f, -2.176432239e-02f, -2.974505952e-02f, -2.852088503e-02f, -1.398743494e-02f, +1.505504361e-02f, +5.588057478e-02f, +1.019638819e-01f, +1.443610834e-01f, +1.740057884e-01f, +1.842265914e-01f, +1.726715912e-01f, +1.419978608e-01f, +9.909290155e-02f, +5.309104403e-02f, +1.284571727e-02f, -1.532702830e-02f, -2.895622617e-02f, -2.946303892e-02f, -2.108075065e-02f, -9.138103813e-03f, +1.657194930e-03f, +8.392576660e-03f, +1.031163017e-02f, +8.415933970e-03f, +4.611300241e-03f, +7.960739283e-04f, -1.780448496e-03f, -2.737372213e-03f, -2.400599057e-03f, -1.433275985e-03f, -4.630133635e-04f, +1.471728376e-04f, +3.390592884e-04f,\n    -4.569541687e-06f, +1.093779023e-06f, +1.279394254e-05f, +2.630090367e-05f, +3.300519509e-05f, +2.313094698e-05f, -8.641971212e-06f, -5.749286536e-05f, -1.060154541e-04f, -1.277273734e-04f, -9.697442048e-05f, -2.455154195e-06f, +1.411350845e-04f, +2.895631068e-04f, +3.777178872e-04f, +3.399932180e-04f, +1.365456772e-04f, -2.242442057e-04f, -6.770559685e-04f, -1.110650867e-03f, -1.397561162e-03f, -1.433843904e-03f, -1.175413611e-03f, -6.575069420e-04f, +1.084600706e-05f, +6.766902606e-04f, +1.187809005e-03f, +1.437136486e-03f, +1.391969581e-03f, +1.098675471e-03f, +6.625373850e-04f, +2.110969350e-04f, -1.454749231e-04f, -3.435785237e-04f, -3.765653018e-04f, -2.854709206e-04f, -1.362752771e-04f, +6.305860108e-06f, +9.889919355e-05f, +1.277317531e-04f, +1.047561226e-04f, +5.585024780e-05f, +7.333155539e-06f, -2.376427225e-05f, -3.300060303e-05f, -2.592907112e-05f, -1.236605420e-05f, -8.167179641e-07f,\n    -3.621625263e-04f, -7.941176452e-04f, -9.003422633e-04f, -4.963307114e-05f, +2.018654434e-03f, +4.593755732e-03f, +5.888971872e-03f, +3.844361413e-03f, -2.343531337e-03f, -1.086037163e-02f, -1.725431881e-02f, -1.636937635e-02f, -5.588633492e-03f, +1.245703520e-02f, +2.977835992e-02f, +3.637426813e-02f, +2.576756190e-02f, -3.027330347e-04f, -3.116757540e-02f, -5.168258780e-02f, -4.999824725e-02f, -2.448442539e-02f, +1.434154302e-02f, +4.846057877e-02f, +6.139844650e-02f, +4.681446674e-02f, +1.185286683e-02f, -2.663174030e-02f, -5.084856780e-02f, -5.096839847e-02f, -2.938378648e-02f, +1.614417370e-03f, +2.695031545e-02f, +3.643325068e-02f, +2.891173640e-02f, +1.124717579e-02f, -6.532821215e-03f, -1.671005206e-02f, -1.702002346e-02f, -1.033459263e-02f, -1.854574906e-03f, +4.096405093e-03f, +5.887278001e-03f, +4.447744793e-03f, +1.861142303e-03f, -1.396453142e-04f, -9.156503370e-04f, -7.702459168e-04f,\n    +1.279054036e-05f, +1.179589871e-05f, -8.126265744e-06f, -4.564423467e-05f, -7.907266217e-05f, -7.243049474e-05f, +8.067819448e-07f, +1.281625351e-04f, +2.457850786e-04f, +2.619740203e-04f, +1.135609871e-04f, -1.753901006e-04f, -4.759656788e-04f, -6.048271801e-04f, -4.280763606e-04f, +3.819750226e-05f, +5.994210138e-04f, +9.613405219e-04f, +8.869413989e-04f, +3.459355243e-04f, -4.373988820e-04f, -1.080734367e-03f, -1.242276557e-03f, -8.124734222e-04f, +1.403262768e-05f, +8.336386060e-04f, +1.246399629e-03f, +1.066580545e-03f, +4.129216663e-04f, -3.682537994e-04f, -8.968475170e-04f, -9.558098825e-04f, -5.833325336e-04f, -2.078504744e-05f, +4.385471672e-04f, +6.050322369e-04f, +4.682220434e-04f, +1.652856064e-04f, -1.207343630e-04f, -2.638049775e-04f, -2.431713521e-04f, -1.238811450e-04f, +2.500652728e-06f, +7.358044464e-05f, +7.843946816e-05f, +4.436800841e-05f, +7.181807980e-06f, -1.207582970e-05f,\n    /*  4, 0 (48) */\n    -4.440791761e-04f, -7.736617456e-04f, -5.842197404e-04f, +4.733051837e-04f, +2.096961908e-03f, +3.159739597e-03f, +2.247925700e-03f, -1.196916207e-03f, -5.859365612e-03f, -8.625924656e-03f, -6.226830420e-03f, +2.191702212e-03f, +1.322393203e-02f, +1.983561445e-02f, +1.498813646e-02f, -3.241530928e-03f, -2.808652174e-02f, -4.494512491e-02f, -3.739225953e-02f, +4.047367480e-03f, +7.496487828e-02f, +1.562849362e-01f, +2.209963868e-01f, +2.456499165e-01f, +2.209963868e-01f, +1.562849362e-01f, +7.496487828e-02f, +4.047367480e-03f, -3.739225953e-02f, -4.494512491e-02f, -2.808652174e-02f, -3.241530928e-03f, +1.498813646e-02f, +1.983561445e-02f, +1.322393203e-02f, +2.191702212e-03f, -6.226830420e-03f, -8.625924656e-03f, -5.859365612e-03f, -1.196916207e-03f, +2.247925700e-03f, +3.159739597e-03f, +2.096961908e-03f, +4.733051837e-04f, -5.842197404e-04f, -7.736617456e-04f, -4.440791761e-04f, -8.710788365e-05f,\n    +1.289254766e-05f, +5.184246216e-06f, -1.843893728e-05f, -4.543886514e-05f, -4.981617239e-05f, -9.833808267e-06f, +6.803089721e-05f, +1.384152296e-04f, +1.360732244e-04f, +2.183516949e-05f, -1.715914665e-04f, -3.319467664e-04f, -3.195613163e-04f, -6.198186541e-05f, +3.643635712e-04f, +7.288074567e-04f, +7.447129475e-04f, +2.343101320e-04f, -7.304216719e-04f, -1.804891247e-03f, -2.503717032e-03f, -2.434208634e-03f, -1.510328867e-03f, -2.487863475e-05f, +1.469980364e-03f, +2.417690168e-03f, +2.514578272e-03f, +1.834960044e-03f, +7.647153423e-04f, -2.098854303e-04f, -7.370963161e-04f, -7.359666910e-04f, -3.781907203e-04f, +5.035847333e-05f, +3.152640733e-04f, +3.348305944e-04f, +1.778452548e-04f, -1.658656658e-05f, -1.342466470e-04f, -1.397696245e-04f, -7.066966975e-05f, +7.835189267e-06f, +4.929954776e-05f, +4.606746708e-05f, +1.934333100e-05f, -4.667676794e-06f, -1.288967773e-05f, -8.220998674e-06f,\n    +3.469535659e-04f, +1.336667044e-03f, +1.790286751e-03f, +2.794767810e-04f, -3.303519821e-03f, -6.405731284e-03f, -4.976271198e-03f, +2.686342793e-03f, +1.248168983e-02f, +1.571582859e-02f, +5.946321108e-03f, -1.341789307e-02f, -2.845267002e-02f, -2.424163753e-02f, +1.494761300e-03f, +3.267286932e-02f, +4.455848173e-02f, +2.351503337e-02f, -1.915629477e-02f, -5.272885293e-02f, -4.998568337e-02f, -9.883103547e-03f, +3.944741130e-02f, +6.141247912e-02f, +3.944741130e-02f, -9.883103547e-03f, -4.998568337e-02f, -5.272885293e-02f, -1.915629477e-02f, +2.351503337e-02f, +4.455848173e-02f, +3.267286932e-02f, +1.494761300e-03f, -2.424163753e-02f, -2.845267002e-02f, -1.341789307e-02f, +5.946321108e-03f, +1.571582859e-02f, +1.248168983e-02f, +2.686342793e-03f, -4.976271198e-03f, -6.405731284e-03f, -3.303519821e-03f, +2.794767810e-04f, +1.790286751e-03f, +1.336667044e-03f, +3.469535659e-04f, -1.608870261e-04f,\n    -2.571773609e-05f, -3.050953535e-05f, +9.392727151e-06f, +8.433841439e-05f, +1.247277122e-04f, +4.822503056e-05f, -1.430114735e-04f, -3.094170965e-04f, -2.554768633e-04f, +8.152129225e-05f, +4.999795024e-04f, +6.290315529e-04f, +2.366593558e-04f, -4.941058242e-04f, -1.010568477e-03f, -8.041570547e-04f, +1.137522031e-04f, +1.110810779e-03f, +1.375457392e-03f, +5.907998826e-04f, -7.311358218e-04f, -1.591834473e-03f, -1.292881518e-03f, -2.296124824e-05f, +1.264336964e-03f, +1.601633554e-03f, +7.702899258e-04f, -5.529630450e-04f, -1.366287754e-03f, -1.133732786e-03f, -1.481780446e-04f, +7.843461819e-04f, +1.016717124e-03f, +5.168134989e-04f, -2.167432336e-04f, -6.249418104e-04f, -5.103339566e-04f, -9.510474086e-05f, +2.489011455e-04f, +3.119466899e-04f, +1.496270931e-04f, -4.360734750e-05f, -1.244160341e-04f, -8.660920381e-05f, -1.142115956e-05f, +3.003560201e-05f, +2.628081681e-05f, +6.143495962e-06f,\n    /*  4, 1 (48) */\n    -4.311866284e-04f, -7.684774994e-04f, -6.026586777e-04f, +4.278663186e-04f, +2.047145736e-03f, +3.149905788e-03f, +2.315956597e-03f, -1.058500977e-03f, -5.723292387e-03f, -8.604089486e-03f, -6.398421886e-03f, +1.859755445e-03f, +1.290437072e-02f, +1.977363258e-02f, +1.535250003e-02f, -2.512723471e-03f, -2.734180880e-02f, -4.471081478e-02f, -3.812268121e-02f, +2.242476233e-03f, +7.246116125e-02f, +1.538507276e-01f, +2.194860579e-01f, +2.456250379e-01f, +2.224663671e-01f, +1.587026264e-01f, +7.747945655e-02f, +5.882327524e-03f, -3.662754419e-02f, -4.515501034e-02f, -2.882361806e-02f, -3.977497619e-03f, +1.460994574e-02f, +1.988597292e-02f, +1.353919611e-02f, +2.526532806e-03f, -6.048985165e-03f, -8.642511222e-03f, -5.993612259e-03f, -1.336685832e-03f, +2.177256030e-03f, +3.167574786e-03f, +2.146261456e-03f, +5.193726508e-04f, -5.648764094e-04f, -7.783294224e-04f, -4.569688538e-04f, -9.532888232e-05f,\n    +1.288252765e-05f, +5.683852374e-06f, -1.753912827e-05f, -4.478791382e-05f, -5.028703496e-05f, -1.179191290e-05f, +6.538677752e-05f, +1.369877151e-04f, +1.377842419e-04f, +2.699924766e-05f, -1.653081477e-04f, -3.288886600e-04f, -3.236061130e-04f, -7.342665820e-05f, +3.504813501e-04f, +7.212987527e-04f, +7.517939123e-04f, +2.582671380e-04f, -6.962478502e-04f, -1.774447867e-03f, -2.492078858e-03f, -2.449859669e-03f, -1.550106255e-03f, -7.462633087e-05f, +1.429075397e-03f, +2.400307809e-03f, +2.524654162e-03f, +1.864638951e-03f, +7.991145529e-04f, -1.849999595e-04f, -7.289417700e-04f, -7.427680672e-04f, -3.919537410e-04f, +3.856160836e-05f, +3.107140920e-04f, +3.375361450e-04f, +1.840650204e-04f, -1.125585379e-05f, -1.323041793e-04f, -1.410489017e-04f, -7.330111985e-05f, +5.796882022e-06f, +4.873677159e-05f, +4.667280462e-05f, +2.025163384e-05f, -4.134251716e-06f, -1.287362466e-05f, -8.462405133e-06f,\n    +3.212358298e-04f, +1.306157508e-03f, +1.799679478e-03f, +3.638151954e-04f, -3.178792109e-03f, -6.357506254e-03f, -5.119282672e-03f, +2.376925696e-03f, +1.222621297e-02f, +1.579734988e-02f, +6.446300611e-03f, -1.278886151e-02f, -2.821601066e-02f, -2.473574335e-02f, +4.841928232e-04f, +3.186871227e-02f, +4.467223393e-02f, +2.462584415e-02f, -1.778083738e-02f, -5.213805305e-02f, -5.071681919e-02f, -1.147493802e-02f, +3.815452979e-02f, +6.138951788e-02f, +4.071174827e-02f, -8.281469993e-03f, -4.921539345e-02f, -5.328181598e-02f, -2.052258252e-02f, +2.238130058e-02f, +4.441030368e-02f, +3.345721550e-02f, +2.511478425e-03f, -2.372482403e-02f, -2.866941325e-02f, -1.404283488e-02f, +5.435987152e-03f, +1.562072385e-02f, +1.273059098e-02f, +2.998289482e-03f, -4.826644105e-03f, -6.449338632e-03f, -3.427935855e-03f, +1.928675772e-04f, +1.778865592e-03f, +1.366702646e-03f, +3.732343827e-04f, -1.547435301e-04f,\n    -2.514036432e-05f, -3.093642097e-05f, +7.404259204e-06f, +8.203562472e-05f, +1.249178960e-04f, +5.271780462e-05f, -1.363776150e-04f, -3.066609371e-04f, -2.617518459e-04f, +6.803395823e-05f, +4.893309108e-04f, +6.325743770e-04f, +2.562102288e-04f, -4.711862525e-04f, -1.003667029e-03f, -8.232157439e-04f, +7.942130382e-05f, +1.087129161e-03f, +1.383526417e-03f, +6.280668059e-04f, -6.915044642e-04f, -1.580821894e-03f, -1.320407745e-03f, -6.886550882e-05f, +1.234796034e-03f, +1.610209589e-03f, +8.089345225e-04f, -5.145848785e-04f, -1.356020827e-03f, -1.155873363e-03f, -1.826714690e-04f, +7.637947150e-04f, +1.022102766e-03f, +5.392888856e-04f, -1.964753024e-04f, -6.203033410e-04f, -5.203823168e-04f, -1.087736719e-04f, +2.420266134e-04f, +3.142442435e-04f, +1.562180990e-04f, -3.886700897e-05f, -1.239808950e-04f, -8.884499839e-05f, -1.348826031e-05f, +2.951398656e-05f, +2.682848005e-05f, +6.706631824e-06f,\n    /*  4, 2 (48) */\n    -4.183041008e-04f, -7.627936470e-04f, -6.201978060e-04f, +3.830784047e-04f, +1.996858701e-03f, +3.138113875e-03f, +2.381343374e-03f, -9.215132624e-04f, -5.585508145e-03f, -8.577090238e-03f, -6.563730034e-03f, +1.530866785e-03f, +1.258076460e-02f, +1.970020593e-02f, +1.570298138e-02f, -1.791424718e-03f, -2.659001489e-02f, -4.445254764e-02f, -3.881892906e-02f, +4.680283662e-04f, +6.996908239e-02f, +1.514008679e-01f, +2.179359516e-01f, +2.455504115e-01f, +2.238954425e-01f, +1.611029342e-01f, +8.000411071e-02f, +7.746966475e-03f, -3.582842964e-02f, -4.534001030e-02f, -2.955255983e-02f, -4.720265686e-03f, +1.421799200e-02f, +1.992453453e-02f, +1.384991020e-02f, +2.864068951e-03f, -5.864920145e-03f, -8.653767076e-03f, -6.125916438e-03f, -1.477734733e-03f, +2.103954910e-03f, +3.173371668e-03f, +2.194998227e-03f, +5.660454554e-04f, -5.446247756e-04f, -7.824636741e-04f, -4.698424785e-04f, -1.037912875e-04f,\n    +1.285991751e-05f, +6.166404737e-06f, -1.664456387e-05f, -4.411553088e-05f, -5.071255403e-05f, -1.370871943e-05f, +6.273926195e-05f, +1.354891037e-04f, +1.393801050e-04f, +3.207647279e-05f, -1.589997563e-04f, -3.256603402e-04f, -3.273989107e-04f, -8.468789089e-05f, +3.365530480e-04f, +7.134490749e-04f, +7.583417174e-04f, +2.817498091e-04f, -6.622080333e-04f, -1.743645304e-03f, -2.479672483e-03f, -2.464640132e-03f, -1.589298153e-03f, -1.243453115e-04f, +1.387628879e-03f, +2.382065486e-03f, +2.533936609e-03f, +1.893912758e-03f, +8.336048491e-04f, -1.596609317e-04f, -7.202473230e-04f, -7.492033100e-04f, -4.056435160e-04f, +2.659656099e-05f, +3.059112374e-04f, +3.400594884e-04f, +1.902462398e-04f, -5.845531987e-06f, -1.302455672e-04f, -1.422510891e-04f, -7.592324930e-05f, +3.719755005e-06f, +4.812748421e-05f, +4.725396625e-05f, +2.116315483e-05f, -3.584095864e-06f, -1.284410222e-05f, -8.701086450e-06f,\n    +2.960954655e-04f, +1.275221087e-03f, +1.807083737e-03f, +4.458508201e-04f, -3.053874213e-03f, -6.304788449e-03f, -5.255660287e-03f, +2.070264759e-03f, +1.196446112e-02f, +1.586538384e-02f, +6.935631522e-03f, -1.215628714e-02f, -2.795980043e-02f, -2.520692960e-02f, -5.194742057e-04f, +3.104549652e-02f, +4.475165524e-02f, +2.571297331e-02f, -1.639731096e-02f, -5.150998624e-02f, -5.140832366e-02f, -1.305575991e-02f, +3.683412204e-02f, +6.132065237e-02f, +4.194654430e-02f, -6.671260404e-03f, -4.840645892e-02f, -5.379640085e-02f, -2.187860335e-02f, +2.122542722e-02f, +4.422763222e-02f, +3.422101022e-02f, +3.533581191e-03f, -2.318553514e-02f, -2.886588855e-02f, -1.466313822e-02f, +4.915604835e-03f, +1.551195017e-02f, +1.297261759e-02f, +3.312533726e-03f, -4.670426006e-03f, -6.488205641e-03f, -3.551916750e-03f, +1.040225788e-04f, +1.765377331e-03f, +1.396216632e-03f, +4.000628628e-04f, -1.480368983e-04f,\n    -2.454981878e-05f, -3.131693383e-05f, +5.456981773e-06f, +7.970380656e-05f, +1.249886400e-04f, +5.708357236e-05f, -1.297318172e-04f, -3.036838206e-04f, -2.677244663e-04f, +5.465316782e-05f, +4.784002737e-04f, +6.355725464e-04f, +2.753828356e-04f, -4.480752018e-04f, -9.960235479e-04f, -8.415113541e-04f, +4.521248951e-05f, +1.062710289e-03f, +1.390492424e-03f, +6.647357780e-04f, -6.514284292e-04f, -1.568606346e-03f, -1.346894540e-03f, -1.147150770e-04f, +1.204281511e-03f, +1.617554017e-03f, +8.470377077e-04f, -4.756944942e-04f, -1.344660851e-03f, -1.177211241e-03f, -2.172049221e-04f, +7.425149321e-04f, +1.026715774e-03f, +5.615116392e-04f, -1.758694164e-04f, -6.151147960e-04f, -5.301127742e-04f, -1.225172574e-04f, +2.348554835e-04f, +3.163044258e-04f, +1.627780462e-04f, -3.400642472e-05f, -1.234204187e-04f, -9.104278358e-05f, -1.559266332e-05f, +2.894409669e-05f, +2.735959138e-05f, +7.280845023e-06f,\n    /*  4, 3 (48) */\n    -4.054441832e-04f, -7.566272423e-04f, -6.368423699e-04f, +3.389628739e-04f, +1.946146147e-03f, +3.124405156e-03f, +2.444082636e-03f, -7.860241587e-04f, -5.446128040e-03f, -8.545013766e-03f, -6.722729790e-03f, +1.205206445e-03f, +1.225336569e-02f, +1.961551803e-02f, +1.603953443e-02f, -1.077975643e-03f, -2.583167317e-02f, -4.417079783e-02f, -3.948113709e-02f, -1.275616938e-03f, +6.748940991e-02f, +1.489362278e-01f, +2.163466535e-01f, +2.454260662e-01f, +2.252830714e-01f, +1.634849997e-01f, +8.253804732e-02f, +9.640879233e-03f, -3.499482479e-02f, -4.549967124e-02f, -3.027280715e-02f, -5.469468996e-03f, +1.381234848e-02f, +1.995113109e-02f, +1.415582144e-02f, +3.204128440e-03f, -5.674673905e-03f, -8.659612608e-03f, -6.256162005e-03f, -1.619985822e-03f, +2.028031661e-03f, +3.177091423e-03f, +2.243125712e-03f, +6.132994217e-04f, -5.234616208e-04f, -7.860477700e-04f, -4.826865807e-04f, -1.124923739e-04f,\n    +1.282502326e-05f, +6.631829657e-06f, -1.575588796e-05f, -4.342263601e-05f, -5.109317649e-05f, -1.558348651e-05f, +6.009027664e-05f, +1.339214410e-04f, +1.408612929e-04f, +3.706460373e-05f, -1.526707137e-04f, -3.222659344e-04f, -3.309403096e-04f, -9.576076956e-05f, +3.225875851e-04f, +7.052670211e-04f, +7.643591248e-04f, +3.047517951e-04f, -6.283162183e-04f, -1.712499040e-03f, -2.466506952e-03f, -2.478547275e-03f, -1.627890458e-03f, -1.740164482e-04f, +1.345655982e-03f, +2.362967526e-03f, +2.542417848e-03f, +1.922766365e-03f, +8.681716366e-04f, -1.338758426e-04f, -7.110112536e-04f, -7.552642627e-04f, -4.192508715e-04f, +1.446878429e-05f, +3.008555334e-04f, +3.423967670e-04f, +1.963843605e-04f, -3.581872455e-07f, -1.280706340e-04f, -1.433742428e-04f, -7.853403820e-05f, +1.604718976e-06f, +4.747135652e-05f, +4.781004476e-05f, +2.207718797e-05f, -3.017351572e-06f, -1.280083156e-05f, -8.936712204e-06f,\n    +2.715456467e-04f, +1.243904153e-03f, +1.812540719e-03f, +5.255546267e-04f, -2.928885573e-03f, -6.247704877e-03f, -5.385392104e-03f, +1.766580938e-03f, +1.169673666e-02f, +1.592003700e-02f, +7.414031795e-03f, -1.152071459e-02f, -2.768441760e-02f, -2.565500481e-02f, -1.515497754e-03f, +3.020398517e-02f, +4.479686773e-02f, +2.677568360e-02f, -1.500681854e-02f, -5.084525046e-02f, -5.205975209e-02f, -1.462436626e-02f, +3.548722750e-02f, +6.120593729e-02f, +4.315082581e-02f, -5.053706387e-03f, -4.755942122e-02f, -5.427209535e-02f, -2.322326420e-02f, +2.004821598e-02f, +4.401042729e-02f, +3.496352515e-02f, +4.560296965e-03f, -2.262402350e-02f, -2.904175797e-02f, -1.527825301e-02f, +4.385492061e-03f, +1.538943292e-02f, +1.320747308e-02f, +3.628838152e-03f, -4.507647960e-03f, -6.522212065e-03f, -3.675337169e-03f, +1.297979522e-05f, +1.749784668e-03f, +1.425160729e-03f, +4.274224541e-04f, -1.407560533e-04f,\n    -2.394720634e-05f, -3.165178783e-05f, +3.552050772e-06f, +7.734590613e-05f, +1.249420826e-04f, +6.132039239e-05f, -1.230802996e-04f, -3.004914841e-04f, -2.733933896e-04f, +4.138913951e-05f, +4.671998064e-04f, +6.380287732e-04f, +2.941645902e-04f, -4.247930999e-04f, -9.876493535e-04f, -8.590336898e-04f, +1.115266394e-05f, +1.037577029e-03f, +1.396353923e-03f, +7.007793324e-04f, -6.109405869e-04f, -1.555199324e-03f, -1.372321662e-03f, -1.604735422e-04f, +1.172816986e-03f, +1.623659271e-03f, +8.845679552e-04f, -4.363215056e-04f, -1.332212982e-03f, -1.197725728e-03f, -2.517506783e-04f, +7.205197926e-04f, +1.030547109e-03f, +5.834614779e-04f, -1.549398357e-04f, -6.093752927e-04f, -5.395136800e-04f, -1.363244821e-04f, +2.273902694e-04f, +3.181220543e-04f, +1.693004253e-04f, -2.902816071e-05f, -1.227328237e-04f, -9.319952775e-05f, -1.773293279e-05f, +2.832538384e-05f, +2.787300974e-05f, +7.865645190e-06f,\n    /*  4, 4 (48) */\n    -3.926191600e-04f, -7.499954126e-04f, -6.525982578e-04f, +2.955402379e-04f, +1.895052970e-03f, +3.108821669e-03f, +2.504172913e-03f, -6.521027177e-04f, -5.305266748e-03f, -8.507949162e-03f, -6.875400504e-03f, +8.829405108e-04f, +1.192242538e-02f, +1.951975726e-02f, +1.636212202e-02f, -3.727086224e-04f, -2.506731404e-02f, -4.386604604e-02f, -4.010945331e-02f, -2.988115978e-03f, +6.502290296e-02f, +1.464576805e-01f, +2.147187630e-01f, +2.452520498e-01f, +2.266287274e-01f, +1.658479672e-01f, +8.508046517e-02f, +1.156364560e-02f, -3.412665315e-02f, -4.563354708e-02f, -3.098381841e-02f, -6.224733259e-03f, +1.339309761e-02f, +1.996559988e-02f, +1.445667697e-02f, +3.546525207e-03f, -5.478289544e-03f, -8.659970795e-03f, -6.384232639e-03f, -1.763360065e-03f, +1.949497623e-03f, +3.178696142e-03f, +2.290597068e-03f, +6.611094664e-04f, -5.013844328e-04f, -7.890651215e-04f, -4.954874122e-04f, -1.214290861e-04f,\n    +1.277815672e-05f, +7.080070146e-06f, -1.487372814e-05f, -4.271015005e-05f, -5.142937682e-05f, -1.741551516e-05f, +5.744172148e-05f, +1.322867935e-04f, +1.422283575e-04f, +4.196148700e-05f, -1.463254020e-04f, -3.187096293e-04f, -3.342310618e-04f, -1.066406684e-04f, +3.085938074e-04f, +6.967612850e-04f, +7.698491488e-04f, +3.272670360e-04f, -5.945862371e-04f, -1.681024634e-03f, -2.452591617e-03f, -2.491578750e-03f, -1.665869356e-03f, -2.236206357e-04f, +1.303172126e-03f, +2.343018643e-03f, +2.550090443e-03f, +1.951184787e-03f, +9.028001885e-04f, -1.076524697e-04f, -7.012321084e-04f, -7.609428930e-04f, -4.327665825e-04f, +2.183892139e-06f, +2.955471640e-04f, +3.445441995e-04f, +2.024748039e-04f, +5.203509853e-06f, -1.257792813e-04f, -1.444164487e-04f, -8.113144611e-05f, -5.472731236e-07f, +4.676809063e-05f, +4.834013806e-05f, +2.299301259e-05f, -2.434178788e-06f, -1.274354164e-05f, -9.168948451e-06f,\n    +2.475984404e-04f, +1.212252366e-03f, +1.816092770e-03f, +6.029005328e-04f, -2.803943490e-03f, -6.186384484e-03f, -5.508472404e-03f, +1.466089454e-03f, +1.142334327e-02f, +1.596142614e-02f, +7.881231602e-03f, -1.088268582e-02f, -2.739025301e-02f, -2.607979791e-02f, -2.503147107e-03f, +2.934495148e-02f, +4.480802039e-02f, +2.781326063e-02f, -1.361046461e-02f, -5.014447113e-02f, -5.267069267e-02f, -1.617956558e-02f, +3.411490584e-02f, +6.104546375e-02f, +4.432364280e-02f, -3.430047117e-03f, -4.667485326e-02f, -5.470841685e-02f, -2.455547718e-02f, +1.885049025e-02f, +4.375867662e-02f, +3.568404494e-02f, +5.590844074e-03f, -2.204056203e-02f, -2.919669781e-02f, -1.588762831e-02f, +3.845978381e-03f, +1.525310843e-02f, +1.343486335e-02f, +3.946960206e-03f, -4.338347535e-03f, -6.551240226e-03f, -3.798069993e-03f, -8.021973253e-05f, +1.732051735e-03f, +1.453486113e-03f, +4.552954639e-04f, -1.328904081e-04f,\n    -2.333362236e-05f, -3.194173417e-05f, +1.690552013e-06f, +7.496484133e-05f, +1.247804426e-04f, +6.542647888e-05f, -1.164291964e-04f, -2.970897857e-04f, -2.787575706e-04f, +2.825187413e-05f, +4.557418356e-04f, +6.399462117e-04f, +3.125433452e-04f, -4.013603659e-04f, -9.785563028e-04f, -8.757732603e-04f, -2.273152976e-05f, +1.011752738e-03f, +1.401110338e-03f, +7.361705945e-04f, -5.700740732e-04f, -1.540613279e-03f, -1.396669752e-03f, -2.061045701e-04f, +1.140426844e-03f, +1.628518790e-03f, +9.214941434e-04f, -3.964960053e-04f, -1.318683292e-03f, -1.217396724e-03f, -2.862808627e-04f, +6.978229305e-04f, +1.033588332e-03f, +6.051182020e-04f, -1.337012165e-04f, -6.030844187e-04f, -5.485735572e-04f, -1.501841507e-04f, +2.196337826e-04f, +3.196921023e-04f, +1.757786675e-04f, -2.393493880e-05f, -1.219164262e-04f, -9.531218521e-05f, -1.990756350e-05f, +2.765734466e-05f, +2.836758865e-05f, +8.460514288e-06f,\n    /*  4, 5 (48) */\n    -3.798410033e-04f, -7.429153425e-04f, -6.674719860e-04f, +2.528300878e-04f, +1.843623593e-03f, +3.091406154e-03f, +2.561614635e-03f, -5.198159242e-04f, -5.163038390e-03f, -8.465987675e-03f, -7.021725906e-03f, +5.642308816e-04f, +1.158819432e-02f, +1.941311660e-02f, +1.667071582e-02f, +3.240526627e-04f, -2.429746489e-02f, -4.353877900e-02f, -4.070403955e-02f, -4.669140612e-03f, +6.257031134e-02f, +1.439661018e-01f, +2.130528937e-01f, +2.450284291e-01f, +2.279318995e-01f, +1.681909859e-01f, +8.763055561e-02f, +1.351483038e-02f, -3.322385297e-02f, -4.574119955e-02f, -3.168505052e-02f, -6.985676151e-03f, +1.296033103e-02f, +1.996778377e-02f, +1.475222413e-02f, +3.891069406e-03f, -5.275814740e-03f, -8.654767285e-03f, -6.510011921e-03f, -1.907776514e-03f, +1.868366177e-03f, +3.178148869e-03f, +2.337365159e-03f, +7.094496045e-04f, -4.783914202e-04f, -7.914993003e-04f, -5.082309539e-04f, -1.305980346e-04f,\n    +1.271963515e-05f, +7.511085657e-06f, -1.399869545e-05f, -4.197899425e-05f, -5.172165629e-05f, -1.920414868e-05f, +5.479546913e-05f, +1.305872469e-04f, +1.434819223e-04f, +4.676505722e-05f, -1.399681615e-04f, -3.149956671e-04f, -3.372720680e-04f, -1.173231310e-04f, +2.945804811e-04f, +6.879406509e-04f, +7.748150519e-04f, +3.492897638e-04f, -5.610317500e-04f, -1.649237711e-03f, -2.437936128e-03f, -2.503732601e-03f, -1.703221322e-03f, -2.731388008e-04f, +1.260192979e-03f, +2.322223945e-03f, +2.556947300e-03f, +1.979153161e-03f, +9.374756521e-04f, -8.099886954e-05f, -6.909087043e-04f, -7.662312983e-04f, -4.461813775e-04f, -1.025234248e-05f, +2.899864756e-04f, +3.464980832e-04f, +2.085129681e-04f, +1.083680508e-05f, -1.233714902e-04f, -1.453758241e-04f, -8.371341332e-05f, -2.735226303e-06f, +4.601742064e-05f, +4.884335002e-05f, +2.390989374e-05f, -1.834755230e-06f, -1.267196955e-05f, -9.397458000e-06f,\n    +2.242648180e-04f, +1.180310631e-03f, +1.817783322e-03f, +6.778653741e-04f, -2.679163048e-03f, -6.120958005e-03f, -5.624901600e-03f, +1.168999668e-03f, +1.114458570e-02f, +1.598967802e-02f, +8.336973437e-03f, -1.024273960e-02f, -2.707770966e-02f, -2.648115827e-02f, -3.481703410e-03f, +2.846917822e-02f, +4.478528886e-02f, +2.882501336e-02f, -1.220935428e-02f, -4.940830054e-02f, -5.324076675e-02f, -1.772017886e-02f, +3.271823609e-02f, +6.083935918e-02f, +4.546406964e-02f, -1.801528327e-03f, -4.575335912e-02f, -5.510491286e-02f, -2.587416048e-02f, +1.763309353e-02f, +4.347239575e-02f, +3.638186787e-02f, +6.624432406e-03f, -2.143544382e-02f, -2.933039902e-02f, -1.649071272e-02f, +3.297404824e-03f, +1.510292428e-02f, +1.365449713e-02f, +4.266652308e-03f, -4.162568867e-03f, -6.575175165e-03f, -3.919986419e-03f, -1.755319177e-04f, +1.712144172e-03f, +1.481143457e-03f, +4.836630525e-04f, -1.244298938e-04f,\n    -2.271014949e-05f, -3.218755973e-05f, -1.264986970e-07f, +7.256349920e-05f, +1.245060156e-04f, +6.940020102e-05f, -1.097845518e-04f, -2.934846979e-04f, -2.838162517e-04f, +1.525114812e-05f, +4.440387867e-04f, +6.413284520e-04f, +3.305073988e-04f, -3.777973932e-04f, -9.687567770e-04f, -8.917212832e-04f, -5.641373053e-05f, +9.852612407e-04f, +1.404762002e-03f, +7.708833030e-04f, -5.288622618e-04f, -1.524861610e-03f, -1.419920346e-03f, -2.515719334e-04f, +1.107136239e-03f, +1.632127022e-03f, +9.577855825e-04f, -3.562485408e-04f, -1.304078768e-03f, -1.236204745e-03f, -3.207674749e-04f, +6.744386457e-04f, +1.035831615e-03f, +6.264617115e-04f, -1.121686012e-04f, -5.962422370e-04f, -5.572811128e-04f, -1.640848971e-04f, +2.115891334e-04f, +3.210097061e-04f, +1.822061507e-04f, -1.872963638e-05f, -1.209696434e-04f, -9.737769918e-05f, -2.211498118e-05f, +2.693952258e-05f, +2.884217760e-05f, +9.064906686e-06f,\n    /*  4, 6 (48) */\n    -3.671213681e-04f, -7.354042568e-04f, -6.814706814e-04f, +2.108510936e-04f, +1.791901937e-03f, +3.072202006e-03f, +2.616410104e-03f, -3.892286773e-04f, -5.019556468e-03f, -8.419222618e-03f, -7.161694067e-03f, +2.492352145e-04f, +1.125092225e-02f, +1.929579347e-02f, +1.696529630e-02f, +1.011993314e-03f, -2.352264984e-02f, -4.318948924e-02f, -4.126507130e-02f, -6.318378323e-03f, +6.013237521e-02f, +1.414623692e-01f, +2.113496723e-01f, +2.447552903e-01f, +2.291920925e-01f, +1.705132098e-01f, +9.018750292e-02f, +1.549398355e-02f, -3.228637731e-02f, -4.582219842e-02f, -3.237595922e-02f, -7.751907450e-03f, +1.251414965e-02f, +1.995753143e-02f, +1.504221061e-02f, +4.237567489e-03f, -5.067301772e-03f, -8.643930480e-03f, -6.633383411e-03f, -2.053152338e-03f, +1.784652763e-03f, +3.175413642e-03f, +2.383382579e-03f, +7.582929545e-04f, -4.544815265e-04f, -7.933340555e-04f, -5.209029234e-04f, -1.399954926e-04f,\n    +1.264978081e-05f, +7.924851840e-06f, -1.313138411e-05f, -4.123008952e-05f, -5.197054220e-05f, -2.094877260e-05f, +5.215336394e-05f, +1.288249044e-04f, +1.446226806e-04f, +5.147333744e-05f, -1.336032886e-04f, -3.111283429e-04f, -3.400643764e-04f, -1.278038710e-04f, +2.805562892e-04f, +6.788139878e-04f, +7.792603414e-04f, +3.708145029e-04f, -5.276662400e-04f, -1.617153954e-03f, -2.422550433e-03f, -2.515007272e-03f, -1.739933127e-03f, -3.225519117e-04f, +1.216734440e-03f, +2.300588926e-03f, +2.562981663e-03f, +2.006656758e-03f, +9.721830556e-04f, -5.392337557e-05f, -6.800401319e-04f, -7.711217117e-04f, -4.594859434e-04f, -2.283398945e-05f, +2.841739777e-04f, +3.482547981e-04f, +2.144942307e-04f, +1.653886144e-05f, -1.208473221e-04f, -1.462505197e-04f, -8.627786209e-05f, -4.958103691e-06f, +4.521911322e-05f, +4.931879124e-05f, +2.482708254e-05f, -1.219276524e-06f, -1.258586094e-05f, -9.621900691e-06f,\n    +2.015546685e-04f, +1.148123072e-03f, +1.817656823e-03f, +7.504288733e-04f, -2.554657032e-03f, -6.051557804e-03f, -5.734686152e-03f, +8.755149706e-04f, +1.086076945e-02f, +1.600492917e-02f, +8.781012224e-03f, -9.601411153e-03f, -2.674720226e-02f, -2.685895566e-02f, -4.450460187e-03f, +2.757745693e-02f, +4.472887513e-02f, +2.981027461e-02f, -1.080459227e-02f, -4.863741723e-02f, -5.376962901e-02f, -1.924504047e-02f, +3.129831574e-02f, +6.058778724e-02f, +4.657120588e-02f, -1.694013043e-04f, -4.479557353e-02f, -5.546116140e-02f, -2.717823924e-02f, +1.639688878e-02f, +4.315162828e-02f, +3.705630652e-02f, +7.660264021e-03f, -2.080898211e-02f, -2.944256762e-02f, -1.708695496e-02f, +2.740123711e-03f, +1.493883939e-02f, +1.386608626e-02f, +4.587662014e-03f, -3.980362717e-03f, -6.593904801e-03f, -4.040956062e-03f, -2.729096169e-04f, +1.690029190e-03f, +1.508082980e-03f, +5.125052301e-04f, -1.153649871e-04f,\n    -2.207785664e-05f, -3.239008541e-05f, -1.898155368e-06f, +7.014473331e-05f, +1.241211704e-04f, +7.324008229e-05f, -1.031523155e-04f, -2.896822997e-04f, -2.885689603e-04f, +2.396506984e-06f, +4.321031721e-04f, +6.421795125e-04f, +3.480455019e-04f, -3.541245312e-04f, -9.582636675e-04f, -9.068696886e-04f, -8.986788047e-05f, +9.581268104e-04f, +1.407310159e-03f, +8.048918298e-04f, -4.873387349e-04f, -1.507958646e-03f, -1.442055892e-03f, -2.968395419e-04f, +1.072971079e-03f, +1.634479434e-03f, +9.934120415e-04f, -3.156100896e-04f, -1.288407306e-03f, -1.254130937e-03f, -3.551824120e-04f, +6.503818960e-04f, +1.037269751e-03f, +6.474720252e-04f, -9.035740848e-05f, -5.888492894e-04f, -5.656252499e-04f, -1.780151924e-04f, +2.032597318e-04f, +3.220701710e-04f, +1.885762046e-04f, -1.341528578e-05f, -1.198909969e-04f, -9.939300496e-05f, -2.435354300e-05f, +2.617150928e-05f, +2.929562340e-05f, +9.678249260e-06f,\n    /*  4, 7 (48) */\n    -3.544715873e-04f, -7.274794050e-04f, -6.946020655e-04f, +1.696210040e-04f, +1.739931395e-03f, +3.051253233e-03f, +2.668563468e-03f, -2.604037729e-04f, -4.874933787e-03f, -8.367749280e-03f, -7.295297356e-03f, -6.189312840e-05f, +1.091085788e-02f, +1.916798959e-02f, +1.724585259e-02f, +1.690807301e-03f, -2.274338950e-02f, -4.281867474e-02f, -4.179273754e-02f, -7.935532277e-03f, +5.770982478e-02f, +1.389473619e-01f, +2.096097392e-01f, +2.444327384e-01f, +2.304088269e-01f, +1.728137987e-01f, +9.275048458e-02f, +1.750064030e-02f, -3.131419426e-02f, -4.587612179e-02f, -3.305599935e-02f, -8.523029162e-03f, +1.205466371e-02f, +1.993469744e-02f, +1.532638459e-02f, +4.585822287e-03f, -4.852807542e-03f, -8.627391619e-03f, -6.754230733e-03f, -2.199402858e-03f, +1.698374901e-03f, +3.170455539e-03f, +2.428601693e-03f, +8.076117457e-04f, -4.296544439e-04f, -7.945533321e-04f, -5.334887844e-04f, -1.496173933e-04f,\n    +1.256892063e-05f, +8.321360299e-06f, -1.227237129e-05f, -4.046435566e-05f, -5.217658705e-05f, -2.264881449e-05f, +4.951722105e-05f, +1.270018852e-04f, +1.456513944e-04f, +5.608443952e-05f, -1.272350333e-04f, -3.071120005e-04f, -3.426091801e-04f, -1.380787733e-04f, +2.665298267e-04f, +6.693902437e-04f, +7.831887655e-04f, +3.918360714e-04f, -4.945030070e-04f, -1.584789098e-03f, -2.406444767e-03f, -2.525401601e-03f, -1.775991847e-03f, -3.718409871e-04f, +1.172812640e-03f, +2.278119471e-03f, +2.568187124e-03f, +2.033680987e-03f, +1.006907315e-03f, -2.643459550e-05f, -6.686257571e-04f, -7.756065067e-04f, -4.726709308e-04f, -3.555496353e-05f, +2.781103449e-04f, +3.498108096e-04f, +2.204139514e-04f, +2.230676018e-05f, -1.182069200e-04f, -1.470387212e-04f, -8.882269798e-05f, -7.214826744e-06f, +4.437296836e-05f, +4.976557993e-05f, +2.574381665e-05f, -5.879563279e-07f, -1.248497041e-05f, -9.841933680e-06f,\n    +1.794768119e-04f, +1.115732986e-03f, +1.815758668e-03f, +8.205736066e-04f, -2.430535862e-03f, -5.978317722e-03f, -5.837838467e-03f, +5.858326709e-04f, +1.057220049e-02f, +1.600732567e-02f, +9.213115396e-03f, -8.959231640e-03f, -2.639915676e-02f, -2.721308020e-02f, -5.408723854e-03f, +2.667058725e-02f, +4.463900725e-02f, +3.076840142e-02f, -9.397282114e-03f, -4.783252540e-02f, -5.425696774e-02f, -2.075299912e-02f, +2.985625985e-02f, +6.029094770e-02f, +4.764417696e-02f, +1.465078130e-03f, -4.380216149e-02f, -5.577677149e-02f, -2.846664655e-02f, +1.514275784e-02f, +4.279644587e-02f, +3.770668841e-02f, +8.697533773e-03f, -2.016151009e-02f, -2.953292503e-02f, -1.767580425e-02f, +2.174498461e-03f, +1.476082419e-02f, +1.406934599e-02f, +4.909732185e-03f, -3.791786512e-03f, -6.607320087e-03f, -4.160847059e-03f, -3.723026219e-04f, +1.665675647e-03f, +1.534254489e-03f, +5.418008535e-04f, -1.056867379e-04f,\n    -2.143779791e-05f, -3.255016448e-05f, -3.623541571e-06f, +6.771136134e-05f, +1.236283455e-04f, +7.694479968e-05f, -9.653833807e-05f, -2.856887703e-04f, -2.930155053e-04f, -1.030274097e-05f, +4.199475789e-04f, +6.425038326e-04f, +3.651468636e-04f, -3.303620685e-04f, -9.470903609e-04f, -9.212111215e-04f, -1.230682455e-04f, +9.303741423e-04f, +1.408756955e-03f, +8.381711999e-04f, -4.455372552e-04f, -1.489919637e-03f, -1.463059761e-03f, -3.418714729e-04f, +1.037957999e-03f, +1.635572511e-03f, +1.028343774e-03f, -2.746120345e-04f, -1.271677709e-03f, -1.271157102e-03f, -3.894974920e-04f, +6.256682876e-04f, +1.037896166e-03f, +6.681292984e-04f, -6.828342250e-05f, -5.809066006e-04f, -5.735950795e-04f, -1.919633541e-04f, +1.946492873e-04f, +3.228689785e-04f, +1.948821172e-04f, -7.995073534e-06f, -1.186791159e-04f, -1.013550330e-04f, -2.662153812e-05f, +2.535294614e-05f, +2.972677158e-05f, +1.029994154e-05f,\n    /*  4, 8 (48) */\n    -3.419026667e-04f, -7.191580447e-04f, -7.068744368e-04f, +1.291566484e-04f, +1.687754808e-03f, +3.028604419e-03f, +2.718080689e-03f, -1.334018877e-04f, -4.729282393e-03f, -8.311664841e-03f, -7.422532389e-03f, -3.690051289e-04f, +1.056824870e-02f, +1.902991082e-02f, +1.751238242e-02f, +2.360197545e-03f, -2.196020074e-02f, -4.242683867e-02f, -4.228724054e-02f, -9.520321375e-03f, +5.530338001e-02f, +1.364219603e-01f, +2.078337474e-01f, +2.440608974e-01f, +2.315816396e-01f, +1.750919182e-01f, +9.531867170e-02f, +1.953432129e-02f, -3.030728694e-02f, -4.590255639e-02f, -3.372462511e-02f, -9.298635668e-03f, +1.158199278e-02f, +1.989914247e-02f, +1.560449493e-02f, +4.935633097e-03f, -4.632393590e-03f, -8.605084859e-03f, -6.872437653e-03f, -2.346441579e-03f, +1.609552203e-03f, +3.163240712e-03f, +2.472974661e-03f, +8.573773257e-04f, -4.039106273e-04f, -7.951412884e-04f, -5.459737548e-04f, -1.594593269e-04f,\n    +1.247738578e-05f, +8.700618332e-06f, -1.142221689e-05f, -3.968271065e-05f, -5.234036778e-05f, -2.430374389e-05f, +4.688882536e-05f, +1.251203224e-04f, +1.465688934e-04f, +6.059656432e-05f, -1.208675967e-04f, -3.029510298e-04f, -3.449078145e-04f, -1.481438948e-04f, +2.525095963e-04f, +6.596784399e-04f, +7.866043095e-04f, +4.123495821e-04f, -4.615551614e-04f, -1.552158922e-03f, -2.389629649e-03f, -2.534914823e-03f, -1.811384863e-03f, -4.209871051e-04f, +1.128443930e-03f, +2.254821845e-03f, +2.572557625e-03f, +2.060211405e-03f, +1.041633242e-03f, +1.458591480e-06f, -6.566652244e-04f, -7.796782035e-04f, -4.857269586e-04f, -4.840902647e-05f, +2.717964180e-04f, +3.511626720e-04f, +2.262674753e-04f, +2.813750178e-05f, -1.154505091e-04f, -1.477386512e-04f, -9.134581111e-05f, -9.504275476e-06f, +4.347881995e-05f, +5.018284270e-05f, +2.665932067e-05f, +5.897355422e-08f, -1.236906188e-05f, -1.005721173e-05f,\n    +1.580390140e-04f, +1.083182822e-03f, +1.812135126e-03f, +8.882849680e-04f, -2.306907516e-03f, -5.901372922e-03f, -5.934376806e-03f, +3.001439006e-04f, +1.027918498e-02f, +1.599702293e-02f, +9.633062975e-03f, -8.316727808e-03f, -2.603400990e-02f, -2.754344226e-02f, -6.355814215e-03f, +2.574937612e-02f, +4.451593900e-02f, +3.169877556e-02f, -7.988525159e-03f, -4.699435420e-02f, -5.470250500e-02f, -2.224291876e-02f, +2.839320009e-02f, +5.994907623e-02f, +4.868213496e-02f, +3.100650641e-03f, -4.277381772e-02f, -5.605138352e-02f, -2.973832426e-02f, +1.387160074e-02f, +4.240694837e-02f, +3.833235670e-02f, +9.735429939e-03f, -1.949338079e-02f, -2.960120845e-02f, -1.825671085e-02f, +1.600903381e-03f, +1.456886084e-02f, +1.426399528e-02f, +5.232601164e-03f, -3.596904395e-03f, -6.615315161e-03f, -4.279526175e-03f, -4.736576549e-04f, +1.639054109e-03f, +1.559607435e-03f, +5.715276251e-04f, -9.538679632e-05f,\n    -2.079101159e-05f, -3.266868091e-05f, -5.301850104e-06f, +6.526616266e-05f, +1.230300454e-04f, +8.051318266e-05f, -8.994836685e-05f, -2.815103813e-04f, -2.971559747e-04f, -2.283753055e-05f, +4.075846569e-04f, +6.423062653e-04f, +3.818011580e-04f, -3.065302152e-04f, -9.352507246e-04f, -9.347389443e-04f, -1.559894358e-04f, +9.020283335e-04f, +1.409105432e-03f, +8.706971109e-04f, -4.034917365e-04f, -1.470760737e-03f, -1.482916267e-03f, -3.866320012e-04f, +1.002124343e-03f, +1.635403767e-03f, +1.062551544e-03f, -2.332861382e-04f, -1.253899682e-03f, -1.287265709e-03f, -4.236844779e-04f, +6.003140652e-04f, +1.037704928e-03f, +6.884138412e-04f, -4.596278178e-05f, -5.724156817e-04f, -5.811799325e-04f, -2.059175552e-04f, +1.857618093e-04f, +3.234017925e-04f, +2.011171405e-04f, -2.472339476e-06f, -1.173327403e-04f, -1.032607123e-04f, -2.891718833e-05f, +2.448352570e-05f, +3.013446780e-05f, +1.092935588e-05f,\n    /*  4, 9 (48) */\n    -3.294252809e-04f, -7.104574263e-04f, -7.182966537e-04f, +8.947393773e-05f, +1.635414440e-03f, +3.004300675e-03f, +2.764969514e-03f, -8.281565258e-06f, -4.582713499e-03f, -8.251068276e-03f, -7.543399986e-03f, -6.719561588e-04f, +1.022334088e-02f, +1.888176693e-02f, +1.776489202e-02f, +3.019875985e-03f, -2.117359643e-02f, -4.201448908e-02f, -4.274879570e-02f, -1.107248030e-02f, +5.291375036e-02f, +1.338870455e-01f, +2.060223625e-01f, +2.436399103e-01f, +2.327100835e-01f, +1.773467400e-01f, +9.789122933e-02f, +2.159453270e-02f, -2.926565370e-02f, -4.590109780e-02f, -3.438129033e-02f, -1.007831387e-02f, +1.109626582e-02f, +1.985073345e-02f, +1.587629135e-02f, +5.286795769e-03f, -4.406126115e-03f, -8.576947357e-03f, -6.987888162e-03f, -2.494180230e-03f, +1.518206392e-03f, +3.153736437e-03f, +2.516453481e-03f, +9.075601684e-04f, -3.772513066e-04f, -7.950823148e-04f, -5.583428167e-04f, -1.695165387e-04f,\n    +1.237551130e-05f, +9.062648661e-06f, -1.058146335e-05f, -3.888606991e-05f, -5.246248495e-05f, -2.591307205e-05f, +4.426993069e-05f, +1.231823616e-04f, +1.473760729e-04f, +6.500800187e-05f, -1.145051290e-04f, -2.986498630e-04f, -3.469617557e-04f, -1.579954647e-04f, +2.385040047e-04f, +6.496876654e-04f, +7.895111918e-04f, +4.323504425e-04f, -4.288356190e-04f, -1.519279236e-03f, -2.372115874e-03f, -2.543546566e-03f, -1.846099875e-03f, -4.699714128e-04f, +1.083644875e-03f, +2.230702699e-03f, +2.576087462e-03f, +2.086233724e-03f, +1.076345550e-03f, +2.974703766e-05f, -6.441584584e-04f, -7.833294736e-04f, -4.986446197e-04f, -6.138978928e-05f, +2.652332049e-04f, +3.523070318e-04f, +2.320501354e-04f, +3.402800705e-05f, -1.125783976e-04f, -1.483485705e-04f, -9.384507757e-05f, -1.182528874e-05f, +4.253653645e-05f, +5.056971542e-05f, +2.757280659e-05f, +7.212630777e-07f, -1.223790898e-05f, -1.026738752e-05f,\n    +1.372480024e-04f, +1.050514141e-03f, +1.806833276e-03f, +9.535511306e-04f, -2.183877471e-03f, -5.820859740e-03f, -6.024325172e-03f, +1.863351932e-05f, +9.982029006e-03f, +1.597418540e-02f, +1.004064763e-02f, -7.674421542e-03f, -2.565220874e-02f, -2.784997248e-02f, -7.291064940e-03f, +2.481463718e-02f, +4.435994957e-02f, +3.260080389e-02f, -6.579419727e-03f, -4.612365709e-02f, -5.510599674e-02f, -2.371367949e-02f, +2.691028382e-02f, +5.956244423e-02f, +4.968425930e-02f, +4.736054408e-03f, -4.171126617e-02f, -5.628466966e-02f, -3.099222394e-02f, +1.258433503e-02f, +4.198326390e-02f, +3.893267077e-02f, +1.077313487e-02f, -1.880496695e-02f, -2.964717124e-02f, -1.882912653e-02f, +1.019723449e-03f, +1.436294328e-02f, +1.444975709e-02f, +5.556002956e-03f, -3.395787254e-03f, -6.617787500e-03f, -4.396858915e-03f, -5.769183672e-04f, +1.610136921e-03f, +1.584090961e-03f, +6.016620929e-04f, -8.445744044e-05f,\n    -2.013851916e-05f, -3.274654767e-05f, -6.932342584e-06f, +6.281187603e-05f, +1.223288367e-04f, +8.394421207e-05f, -8.338804160e-05f, -2.771534900e-04f, -3.009907318e-04f, -3.519904534e-05f, +3.950271064e-04f, +6.415920685e-04f, +3.979985283e-04f, -2.826490864e-04f, -9.227590917e-04f, -9.474472378e-04f, -1.886064256e-04f, +8.731148588e-04f, +1.408359528e-03f, +9.024459511e-04f, -3.612362155e-04f, -1.450498990e-03f, -1.501610669e-03f, -4.310856293e-04f, +9.654981397e-04f, +1.633971743e-03f, +1.096006654e-03f, -1.916645172e-04f, -1.235083830e-03f, -1.302439913e-03f, -4.577151014e-04f, +5.743361015e-04f, +1.036690754e-03f, +7.083061374e-04f, -2.341196786e-05f, -5.633785327e-04f, -5.883693712e-04f, -2.198658333e-04f, +1.766016064e-04f, +3.236644660e-04f, +2.072744965e-04f, +3.149424362e-06f, -1.158507237e-04f, -1.051069733e-04f, -3.123864879e-05f, +2.356299303e-05f, +3.051755931e-05f, +1.156583771e-05f,\n    /*  4,10 (48) */\n    -3.170497696e-04f, -7.013947777e-04f, -7.288781171e-04f, +5.058786781e-05f, +1.582951955e-03f, +2.978387603e-03f, +2.809239445e-03f, +1.149007964e-04f, -4.435337427e-03f, -8.186060275e-03f, -7.657905115e-03f, -9.706060217e-04f, +9.876379128e-03f, +1.872377146e-02f, +1.800339602e-02f, +3.669563650e-03f, -2.038408523e-02f, -4.158213864e-02f, -4.317763132e-02f, -1.259175953e-02f, +5.054163449e-02f, +1.313434989e-01f, +2.041762626e-01f, +2.431699389e-01f, +2.337937284e-01f, +1.795774427e-01f, +1.004673168e-01f, +2.368076642e-02f, -2.818930815e-02f, -4.587135076e-02f, -3.502544879e-02f, -1.086164335e-02f, +1.059762120e-02f, +1.978934366e-02f, +1.614152455e-02f, +5.639102801e-03f, -4.174075979e-03f, -8.542919350e-03f, -7.100466560e-03f, -2.642528801e-03f, +1.424361314e-03f, +3.141911148e-03f, +2.558990017e-03f, +9.581298838e-04f, -3.496785000e-04f, -7.943610518e-04f, -5.705807257e-04f, -1.797839262e-04f,\n    +1.226363572e-05f, +9.407489159e-06f, -9.750635465e-06f, -3.807534563e-05f, -5.254356191e-05f, -2.747635175e-05f, +4.166225889e-05f, +1.211901590e-04f, +1.480738929e-04f, +6.931713154e-05f, -1.081517273e-04f, -2.942129712e-04f, -3.487726173e-04f, -1.676298856e-04f, +2.245213585e-04f, +6.394270710e-04f, +7.919138599e-04f, +4.518343557e-04f, -3.963570956e-04f, -1.486165880e-03f, -2.353914507e-03f, -2.551296854e-03f, -1.880124898e-03f, -5.187751349e-04f, +1.038432244e-03f, +2.205769064e-03f, +2.578771288e-03f, +2.111733820e-03f, +1.111028863e-03f, +5.842132989e-05f, -6.311056663e-04f, -7.865531458e-04f, -5.114144858e-04f, -7.449071459e-05f, +2.584218823e-04f, +3.532406304e-04f, +2.377572560e-04f, +3.997511835e-05f, -1.095909776e-04f, -1.488667806e-04f, -9.631836077e-05f, -1.417666452e-05f, +4.154602144e-05f, +5.092534407e-05f, +2.848347424e-05f, +1.398643874e-06f, -1.209129542e-05f, -1.047211195e-05f,\n    +1.171094832e-04f, +1.017767593e-03f, +1.799900934e-03f, +1.016363007e-03f, -2.061548634e-03f, -5.736915528e-03f, -6.107713214e-03f, -2.585199707e-04f, +9.681038274e-03f, +1.593898636e-02f, +1.043567474e-02f, -7.032829474e-03f, -2.525421021e-02f, -2.813262157e-02f, -8.213824032e-03f, +2.386718994e-02f, +4.417134314e-02f, +3.347391875e-02f, -5.171060199e-03f, -4.522121114e-02f, -5.546723295e-02f, -2.516417848e-02f, +2.540867315e-02f, +5.913135860e-02f, +5.064975744e-02f, +6.370026151e-03f, -4.061525952e-02f, -5.647633418e-02f, -3.222730777e-02f, +1.128189512e-02f, +4.152554879e-02f, +3.950700687e-02f, +1.180982562e-02f, -1.809666081e-02f, -2.967058320e-02f, -1.939250507e-02f, +4.313540776e-04f, +1.414307745e-02f, +1.462635870e-02f, +5.879667422e-03f, -3.188512758e-03f, -6.614638076e-03f, -4.512709639e-03f, -6.820253404e-04f, +1.578898272e-03f, +1.607653954e-03f, +6.321796522e-04f, -7.289160273e-05f,\n    -1.948132439e-05f, -3.278470509e-05f, -8.514348974e-06f, +6.035119738e-05f, +1.215273449e-04f, +8.723701883e-05f, -7.686289059e-05f, -2.726245321e-04f, -3.045204117e-04f, -4.737872311e-05f, +3.822876665e-04f, +6.403668975e-04f, +4.137295927e-04f, -2.587386849e-04f, -9.096302455e-04f, -9.593308029e-04f, -2.208945727e-04f, +8.436595480e-04f, +1.406524065e-03f, +9.333948178e-04f, -3.188048226e-04f, -1.429152316e-03f, -1.519129192e-03f, -4.751971168e-04f, +9.281080801e-04f, +1.631276012e-03f, +1.128680965e-03f, -1.497796158e-04f, -1.215241647e-03f, -1.316663576e-03f, -4.915610870e-04f, +5.477518863e-04f, +1.034849023e-03f, +7.277868621e-04f, -6.477933725e-07f, -5.537976452e-04f, -5.951532014e-04f, -2.337961005e-04f, +1.671732861e-04f, +3.236530469e-04f, +2.133473835e-04f, +8.866574981e-06f, -1.142320367e-04f, -1.068907517e-04f, -3.358400885e-05f, +2.259114707e-05f, +3.087489644e-05f, +1.220870577e-05f,\n    /*  4,11 (48) */\n    -3.047861339e-04f, -6.919872885e-04f, -7.386287525e-04f, +1.251252218e-05f, +1.530408393e-03f, +2.950911251e-03f, +2.850901704e-03f, +2.360909554e-04f, -4.287263534e-03f, -8.116743143e-03f, -7.766056842e-03f, -1.264818993e-03f, +9.527606511e-03f, +1.855614158e-02f, +1.822791738e-02f, +4.308990721e-03f, -1.959217137e-02f, -4.113030429e-02f, -4.357398842e-02f, -1.407792541e-02f, +4.818771998e-02f, +1.287922020e-01f, +2.022961377e-01f, +2.426511638e-01f, +2.348321606e-01f, +1.817832118e-01f, +1.030460881e-01f, +2.579250024e-02f, -2.707827929e-02f, -4.581292943e-02f, -3.565655446e-02f, -1.164819649e-02f, +1.008620671e-02f, +1.971485294e-02f, +1.639994644e-02f, +5.992343431e-03f, -3.936318723e-03f, -8.502944231e-03f, -7.210057537e-03f, -2.791395581e-03f, +1.328042954e-03f, +3.127734483e-03f, +2.600536039e-03f, +1.009055228e-03f, -3.211950258e-04f, -7.929624079e-04f, -5.826720211e-04f, -1.902560381e-04f,\n    +1.214210066e-05f, +9.735192555e-06f, -8.930240209e-06f, -3.725144604e-05f, -5.258424396e-05f, -2.899317705e-05f, +3.906749896e-05f, +1.191458798e-04f, +1.486633763e-04f, +7.352242204e-05f, -1.018114333e-04f, -2.896448614e-04f, -3.503421484e-04f, -1.770437336e-04f, +2.105698600e-04f, +6.289058638e-04f, +7.938169860e-04f, +4.707973205e-04f, -3.641321009e-04f, -1.452834710e-03f, -2.335036878e-03f, -2.558166103e-03f, -1.913448276e-03f, -5.673795826e-04f, +9.928230059e-04f, +2.180028346e-03f, +2.580604122e-03f, +2.136697738e-03f, +1.145667720e-03f, +8.747179280e-05f, -6.175073398e-04f, -7.893422111e-04f, -5.240271131e-04f, -8.770511911e-05f, +2.513637965e-04f, +3.539603077e-04f, +2.433841554e-04f, +4.597560078e-05f, -1.064887260e-04f, -1.492916248e-04f, -9.876351284e-05f, -1.655716031e-05f, +4.050721427e-05f, +5.124888558e-05f, +2.939051183e-05f, +2.090829182e-06f, -1.192901538e-05f, -1.067103444e-05f,\n    +9.762815885e-05f, +9.849828881e-04f, +1.791386585e-03f, +1.076714204e-03f, -1.940021289e-03f, -5.649678509e-03f, -6.184576105e-03f, -5.311445028e-04f, +9.376517862e-03f, +1.589160763e-02f, +1.081796240e-02f, -6.392462576e-03f, -2.484048062e-02f, -2.839136025e-02f, -9.123454277e-03f, +2.290785914e-02f, +4.395044857e-02f, +3.431757830e-02f, -3.764536134e-03f, -4.428781632e-02f, -5.578603777e-02f, -2.659333080e-02f, +2.388954396e-02f, +5.865616148e-02f, +5.157786552e-02f, +8.001302163e-03f, -3.948657856e-02f, -5.662611379e-02f, -3.344254942e-02f, +9.965231544e-03f, +4.103398771e-02f, +4.005475875e-02f, +1.284467464e-02f, -1.736887395e-02f, -2.967123100e-02f, -1.994630271e-02f, -1.637991238e-04f, +1.390928135e-02f, +1.479353198e-02f, +6.203320469e-03f, -2.975165374e-03f, -6.605771501e-03f, -4.626941676e-03f, -7.889160921e-04f, +1.545314263e-03f, +1.630245101e-03f, +6.630545487e-04f, -6.068289696e-05f,\n    -1.882041246e-05f, -3.278411916e-05f, -1.004726703e-05f, +5.788677766e-05f, +1.206282501e-04f, +9.039088257e-05f, -7.037832680e-05f, -2.679300144e-04f, -3.077459176e-04f, -5.936826082e-05f, +3.693791032e-04f, +6.386367957e-04f, +4.289854480e-04f, -2.348188846e-04f, -8.958794037e-04f, -9.703851603e-04f, -2.528296377e-04f, +8.136885621e-04f, +1.403604744e-03f, +9.635215340e-04f, -2.762317526e-04f, -1.406739489e-03f, -1.535459032e-03f, -5.189315099e-04f, +8.899834931e-04f, +1.627317182e-03f, +1.160546927e-03f, -1.076641795e-04f, -1.194385510e-03f, -1.329921279e-03f, -5.251941758e-04f, +5.205795147e-04f, +1.032175779e-03f, +7.468369003e-04f, +2.231261017e-05f, -5.436760041e-04f, -6.015214833e-04f, -2.476961529e-04f, +1.574817538e-04f, +3.233637847e-04f, +2.193289824e-04f, +1.467531985e-05f, -1.124757694e-04f, -1.086089913e-04f, -3.595129296e-05f, +2.156784201e-05f, +3.120533410e-05f, +1.285725242e-05f,\n    /*  4,12 (48) */\n    -2.926440332e-04f, -6.822520959e-04f, -7.475589927e-04f, -2.473892386e-05f, +1.477824149e-03f, +2.921918074e-03f, +2.889969203e-03f, +3.552368352e-04f, -4.138600157e-03f, -8.043220721e-03f, -7.867868276e-03f, -1.554463854e-03f, +9.177264362e-03f, +1.837909784e-02f, +1.843848724e-02f, +4.937896585e-03f, -1.879835439e-02f, -4.065950696e-02f, -4.393812052e-02f, -1.553076012e-02f, +4.585268310e-02f, +1.262340359e-01f, +2.003826895e-01f, +2.420837842e-01f, +2.358249836e-01f, +1.839632402e-01f, +1.056266922e-01f, +2.792919798e-02f, -2.593261157e-02f, -4.572545764e-02f, -3.627406180e-02f, -1.243753870e-02f, +9.562179601e-03f, +1.962714782e-02f, +1.665131023e-02f, +6.346303739e-03f, -3.692934568e-03f, -8.456968631e-03f, -7.316546263e-03f, -2.940687206e-03f, +1.229279441e-03f, +3.111177323e-03f, +2.641043253e-03f, +1.060304113e-03f, -2.918045140e-04f, -7.908715787e-04f, -5.946010365e-04f, -2.009270726e-04f,\n    +1.201125048e-05f, +1.004582615e-05f, -8.120766612e-06f, -3.641527474e-05f, -5.258519756e-05f, -3.046318302e-05f, +3.648730630e-05f, +1.170516966e-04f, +1.491456078e-04f, +7.762243142e-05f, -9.548823139e-05f, -2.849500731e-04f, -3.516722310e-04f, -1.862337587e-04f, +1.966576036e-04f, +6.181333013e-04f, +7.952254626e-04f, +4.892356315e-04f, -3.321729341e-04f, -1.419301593e-03f, -2.315494573e-03f, -2.564155124e-03f, -1.946058681e-03f, -6.157661632e-04f, +9.468343174e-04f, +2.153488329e-03f, +2.581581344e-03f, +2.161111704e-03f, +1.180246587e-03f, +1.168884923e-04f, -6.033642566e-04f, -7.916898281e-04f, -5.364730471e-04f, -1.010261762e-04f, +2.440604639e-04f, +3.544630052e-04f, +2.489261490e-04f, +5.202614347e-05f, -1.032722050e-04f, -1.496214900e-04f, -1.011783760e-04f, -1.896549344e-05f, +3.942009059e-05f, +5.153950867e-05f, +3.029309637e-05f, +2.797513799e-06f, -1.175087387e-05f, -1.086380328e-05f,\n    +7.880774639e-05f, +9.521987690e-04f, +1.781339318e-03f, +1.134600982e-03f, -1.819393039e-03f, -5.559287626e-03f, -6.254954431e-03f, -7.990745172e-04f, +9.068771944e-03f, +1.583223937e-02f, +1.118734151e-02f, -5.753825781e-03f, -2.441149517e-02f, -2.862617914e-02f, -1.001933368e-02f, +2.193747398e-02f, +4.369761893e-02f, +3.513126686e-02f, -2.360931390e-03f, -4.332429479e-02f, -5.606226953e-02f, -2.800007029e-02f, +2.235408493e-02f, +5.813722997e-02f, +5.246784902e-02f, +9.628619345e-03f, -3.832603163e-02f, -5.673377797e-02f, -3.463693493e-02f, +8.635310265e-03f, +4.050879353e-02f, +4.057533827e-02f, +1.387685042e-02f, -1.662203705e-02f, -2.964891839e-02f, -2.048997872e-02f, -7.653206070e-04f, +1.366158520e-02f, +1.495101374e-02f, +6.526684254e-03f, -2.755836392e-03f, -6.591096181e-03f, -4.739417445e-03f, -8.975250834e-04f, +1.509362970e-03f, +1.651812943e-03f, +6.942598828e-04f, -4.782564454e-05f,\n    -1.815674907e-05f, -3.274577985e-05f, -1.153056169e-05f, +5.542122079e-05f, +1.196342840e-04f, +9.340523006e-05f, -6.393964423e-05f, -2.630765080e-04f, -3.106684165e-04f, -7.115961947e-05f, +3.563141973e-04f, +6.364081860e-04f, +4.437576740e-04f, -2.109094147e-04f, -8.815222021e-04f, -9.806065503e-04f, -2.843878024e-04f, +7.832283699e-04f, +1.399608137e-03f, +9.928046655e-04f, -2.335512367e-04f, -1.383280130e-03f, -1.550588370e-03f, -5.622541709e-04f, +8.511543217e-04f, +1.622096891e-03f, +1.191577599e-03f, -6.535122827e-05f, -1.172528677e-03f, -1.342198342e-03f, -5.585861505e-04f, +4.928376748e-04f, +1.028667743e-03f, +7.654373648e-04f, +4.545180504e-05f, -5.330170897e-04f, -6.074645433e-04f, -2.615536806e-04f, +1.475322116e-04f, +3.227931365e-04f, +2.252124631e-04f, +2.057171849e-05f, -1.105811345e-04f, -1.102586480e-04f, -3.833846165e-05f, +2.049298849e-05f, +3.150773327e-05f, +1.351074403e-05f,\n    /*  4,13 (48) */\n    -2.806327827e-04f, -6.722062698e-04f, -7.556797593e-04f, -6.115419859e-05f, +1.425238952e-03f, +2.891454891e-03f, +2.926456509e-03f, +4.722885319e-04f, -3.989454550e-03f, -7.965598290e-03f, -7.963356507e-03f, -1.839413927e-03f, +8.825592131e-03f, +1.819286408e-02f, +1.863514484e-02f, +5.556029886e-03f, -1.800312893e-02f, -4.017027133e-02f, -4.427029345e-02f, -1.695006172e-02f, +4.353718853e-02f, +1.236698808e-01f, +1.984366308e-01f, +2.414680180e-01f, +2.367718179e-01f, +1.861167285e-01f, +1.082082735e-01f, +3.009030968e-02f, -2.475236498e-02f, -4.560856914e-02f, -3.687742605e-02f, -1.322922853e-02f, +9.025706554e-03f, +1.952612165e-02f, +1.689537070e-02f, +6.700766744e-03f, -3.444008419e-03f, -8.404942487e-03f, -7.419818468e-03f, -3.090308696e-03f, +1.128101065e-03f, +3.092211830e-03f, +2.680463344e-03f, +1.111843622e-03f, -2.615114176e-04f, -7.880740649e-04f, -6.063519103e-04f, -2.117908759e-04f,\n    +1.187143190e-05f, +1.033947149e-05f, -7.322685613e-06f, -3.556773003e-05f, -5.254710946e-05f, -3.188604545e-05f, +3.392330190e-05f, +1.149097875e-04f, +1.495217318e-04f, +8.161580702e-05f, -8.918604661e-05f, -2.801331747e-04f, -3.527648773e-04f, -1.951968851e-04f, +1.827925721e-04f, +6.071186859e-04f, +7.961443986e-04f, +5.071458790e-04f, -3.004916782e-04f, -1.385582399e-03f, -2.295299430e-03f, -2.569265114e-03f, -1.977945120e-03f, -6.639163882e-04f, +9.004835180e-04f, +2.126157165e-03f, +2.581698707e-03f, +2.184962126e-03f, +1.214749860e-03f, +1.466612390e-04f, -5.886774826e-04f, -7.935893281e-04f, -5.487428281e-04f, -1.144469186e-04f, +2.365135726e-04f, +3.547457686e-04f, +2.543785525e-04f, +5.812336101e-05f, -9.994206275e-05f, -1.498548087e-04f, -1.035607843e-04f, -2.140034152e-05f, +3.828466290e-05f, +5.179639469e-05f, +3.119039424e-05f, +3.518374039e-06f, -1.155668711e-05f, -1.105006591e-05f,\n    +6.065099732e-05f, +9.194529891e-04f, +1.769808756e-03f, +1.190022202e-03f, -1.699758755e-03f, -5.465882396e-03f, -6.318894076e-03f, -1.062151025e-03f, +8.758103528e-03f, +1.576107975e-02f, +1.154365571e-02f, -5.117417595e-03f, -2.396773750e-02f, -2.883708855e-02f, -1.090085588e-02f, +2.095686743e-02f, +4.341323113e-02f, +3.591449523e-02f, -9.613232535e-04f, -4.233149012e-02f, -5.629582076e-02f, -2.938335042e-02f, +2.080349656e-02f, +5.757497580e-02f, +5.331900334e-02f, +1.125071624e-02f, -3.713445403e-02f, -5.679912920e-02f, -3.580946361e-02f, +7.293111923e-03f, +3.995020738e-02f, +4.106817594e-02f, +1.490551817e-02f, -1.585659968e-02f, -2.960346658e-02f, -2.102299581e-02f, -1.372785150e-03f, +1.340003152e-02f, +1.509854595e-02f, +6.849477391e-03f, -2.530623929e-03f, -6.570524462e-03f, -4.849998580e-03f, -1.007783731e-03f, +1.471024509e-03f, +1.672305932e-03f, +7.257676160e-04f, -3.431490051e-05f,\n    -1.749127965e-05f, -3.267069945e-05f, -1.296376440e-05f, +5.295708166e-05f, +1.185482258e-04f, +9.627963359e-05f, -5.755201443e-05f, -2.580706410e-04f, -3.132893352e-04f, -8.274502853e-05f, +3.431057333e-04f, +6.336878614e-04f, +4.580383367e-04f, -1.870298427e-04f, -8.665746790e-04f, -9.899919317e-04f, -3.155456883e-04f, +7.523057237e-04f, +1.394541677e-03f, +1.021223537e-03f, -1.907975127e-04f, -1.358794677e-03f, -1.564506376e-03f, -6.051308071e-04f, +8.116510977e-04f, +1.615617815e-03f, +1.221746674e-03f, -2.287402917e-05f, -1.149685270e-03f, -1.353480834e-03f, -5.917088586e-04f, +4.645456348e-04f, +1.024322317e-03f, +7.835696146e-04f, +6.875206024e-05f, -5.218248785e-04f, -6.129729854e-04f, -2.753562781e-04f, +1.373301571e-04f, +3.219377725e-04f, +2.309909909e-04f, +2.655168425e-05f, -1.085474701e-04f, -1.118366926e-04f, -4.074341266e-05f, +1.936655489e-05f, +3.178096262e-05f, +1.416842128e-05f,\n    /*  4,14 (48) */\n    -2.687613508e-04f, -6.618667983e-04f, -7.630024450e-04f, -9.672192862e-05f, +1.372691842e-03f, +2.859568845e-03f, +2.960379811e-03f, +5.871983194e-04f, -3.839932818e-03f, -7.883982483e-03f, -8.052542554e-03f, -2.119547102e-03f, +8.472827254e-03f, +1.799766720e-02f, +1.881793742e-02f, +6.163148572e-03f, -1.720698453e-02f, -3.966312545e-02f, -4.457078513e-02f, -1.833564411e-02f, +4.124188910e-02f, +1.211006157e-01f, +1.964586857e-01f, +2.408041017e-01f, +2.376723015e-01f, +1.882428856e-01f, +1.107899723e-01f, +3.227527181e-02f, -2.353761512e-02f, -4.546190791e-02f, -3.746610354e-02f, -1.402281786e-02f, +8.476963726e-03f, +1.941167473e-02f, +1.713188427e-02f, +7.055512513e-03f, -3.189629866e-03f, -8.346819126e-03f, -7.519760531e-03f, -3.240163505e-03f, +1.024540281e-03f, +3.070811488e-03f, +2.718748007e-03f, +1.163640017e-03f, -2.303210233e-04f, -7.845556909e-04f, -6.179085974e-04f, -2.228409418e-04f,\n    +1.172299359e-05f, +1.061622408e-05f, -6.536449958e-06f, -3.470970428e-05f, -5.247068588e-05f, -3.326148050e-05f, +3.137707163e-05f, +1.127223349e-04f, +1.497929516e-04f, +8.550128532e-05f, -8.290874270e-05f, -2.751987605e-04f, -3.536222271e-04f, -2.039302110e-04f, +1.689826330e-04f, +5.958713593e-04f, +7.965791143e-04f, +5.245249488e-04f, -2.691001954e-04f, -1.351692992e-03f, -2.274463530e-03f, -2.573497662e-03f, -2.009096942e-03f, -7.118118828e-04f, +8.537881199e-04f, +2.098043378e-03f, +2.580952332e-03f, +2.208235610e-03f, +1.249161875e-03f, +1.767795924e-04f, -5.734483729e-04f, -7.950342203e-04f, -5.608269972e-04f, -1.279602412e-04f, +2.287249824e-04f, +3.548057515e-04f, +2.597366849e-04f, +6.426379482e-05f, -9.649903394e-05f, -1.499900605e-04f, -1.059085645e-04f, -2.386034291e-05f, +3.710098106e-05f, +5.201873851e-05f, +3.208156172e-05f, +4.253067716e-06f, -1.134628287e-05f, -1.122946931e-05f,\n    +4.315971767e-05f, +8.867822897e-04f, +1.756844992e-03f, +1.242979284e-03f, -1.581210529e-03f, -5.369602763e-03f, -6.376446090e-03f, -1.320221666e-03f, +8.444814193e-03f, +1.567833472e-02f, +1.188676144e-02f, -4.483729733e-03f, -2.350969916e-02f, -2.902411839e-02f, -1.176743056e-02f, +1.996687550e-02f, +4.309768544e-02f, +3.666680095e-02f, +4.332184234e-04f, -4.131026659e-02f, -5.648661828e-02f, -3.074214510e-02f, +1.923899018e-02f, +5.696984499e-02f, +5.413065444e-02f, +1.286633405e-02f, -3.591270736e-02f, -5.682200323e-02f, -3.695914888e-02f, +5.939631090e-03f, +3.935849852e-02f, +4.153272158e-02f, +1.592984048e-02f, -1.507303007e-02f, -2.953471452e-02f, -2.154482068e-02f, -1.985758136e-03f, +1.312467524e-02f, +1.523587610e-02f, +7.171415163e-03f, -2.299632938e-03f, -6.543972778e-03f, -4.958546050e-03f, -1.119620424e-03f, +1.430281096e-03f, +1.691672486e-03f, +7.575485786e-04f, -2.014647924e-05f,\n    -1.682492863e-05f, -3.255991088e-05f, -1.434647234e-05f, +5.049686428e-05f, +1.173728985e-04f, +9.901380912e-05f, -5.122048314e-05f, -2.529190916e-04f, -3.156103559e-04f, -9.411699013e-05f, +3.297664872e-04f, +6.304829761e-04f, +4.718199911e-04f, -1.631995593e-04f, -8.510532580e-04f, -9.985389804e-04f, -3.462803737e-04f, +7.209476360e-04f, +1.388413650e-03f, +1.048758245e-03f, -1.480047969e-04f, -1.333304376e-03f, -1.577203222e-03f, -6.475274993e-04f, +7.715049169e-04f, +1.607883660e-03f, +1.251028504e-03f, +1.973393099e-05f, -1.125870273e-03f, -1.363755593e-03f, -6.245342378e-04f, +4.357232295e-04f, +1.019137592e-03f, +8.012152726e-04f, +9.219536492e-05f, -5.101038438e-04f, -6.180377019e-04f, -2.890914543e-04f, +1.268813810e-04f, +3.207945823e-04f, +2.366577331e-04f, +3.261098626e-05f, -1.063742421e-04f, -1.133401148e-04f, -4.316398208e-05f, +1.818856848e-05f, +3.202390001e-05f, +1.482949967e-05f,\n    /*  4,15 (48) */\n    -2.570383573e-04f, -6.512505742e-04f, -7.695388949e-04f, -1.314316329e-04f, +1.320221156e-03f, +2.826307365e-03f, +2.991756882e-03f, +6.999206543e-04f, -3.690139866e-03f, -7.798481197e-03f, -8.135451297e-03f, -2.394745863e-03f, +8.119205027e-03f, +1.779373699e-02f, +1.898692005e-02f, +6.759019932e-03f, -1.641040541e-02f, -3.913860051e-02f, -4.483988533e-02f, -1.968733711e-02f, +3.896742557e-02f, +1.185271180e-01f, +1.944495887e-01f, +2.400922898e-01f, +2.385260896e-01f, +1.903409290e-01f, +1.133709246e-01f, +3.448350742e-02f, -2.228845324e-02f, -4.528512831e-02f, -3.803955191e-02f, -1.481785208e-02f, +7.916136729e-03f, +1.928371449e-02f, +1.736060925e-02f, +7.410318264e-03f, -2.929893182e-03f, -8.282555331e-03f, -7.616259565e-03f, -3.390153565e-03f, +9.186317160e-04f, +3.046951145e-03f, +2.755848988e-03f, +1.215658755e-03f, -1.982394616e-04f, -7.803026232e-04f, -6.292548803e-04f, -2.340704111e-04f,\n    +1.156628587e-05f, +1.087619307e-05f, -5.762494102e-06f, -3.384208325e-05f, -5.235665165e-05f, -3.458924435e-05f, +2.885016553e-05f, +1.104915233e-04f, +1.499605271e-04f, +8.927769176e-05f, -7.666012020e-05f, -2.701514474e-04f, -3.542465450e-04f, -2.124310090e-04f, +1.552355348e-04f, +5.844006965e-04f, +7.965351371e-04f, +5.413700217e-04f, -2.380101219e-04f, -1.317649222e-03f, -2.252999191e-03f, -2.576854743e-03f, -2.039503840e-03f, -7.594343941e-04f, +8.067658006e-04f, +2.069155853e-03f, +2.579338719e-03f, +2.230918960e-03f, +1.283466916e-03f, +2.072328639e-04f, -5.576785734e-04f, -7.960181966e-04f, -5.727161007e-04f, -1.415589039e-04f, +2.206967259e-04f, +3.546402178e-04f, +2.649958715e-04f, +7.044391465e-05f, -9.294394045e-05f, -1.500257737e-04f, -1.082195383e-04f, -2.634409715e-05f, +3.586913284e-05f, +5.220574935e-05f, +3.296574548e-05f, +5.001234134e-06f, -1.111950086e-05f, -1.140166030e-05f,\n    +2.633478904e-05f, +8.542223788e-04f, +1.742498519e-03f, +1.293476148e-03f, -1.463837631e-03f, -5.270588954e-03f, -6.427666573e-03f, -1.573140758e-03f, +8.129203837e-03f, +1.558421773e-02f, +1.221652793e-02f, -3.853246757e-03f, -2.303787917e-02f, -2.918731795e-02f, -1.261848382e-02f, +1.896833652e-02f, +4.275140507e-02f, +3.738774859e-02f, +1.821632073e-03f, -4.026150834e-02f, -5.663462307e-02f, -3.207544947e-02f, +1.766178696e-02f, +5.632231750e-02f, +5.490215935e-02f, +1.447421771e-02f, -3.466167885e-02f, -5.680226930e-02f, -3.808501915e-02f, +4.575875497e-03f, +3.873396428e-02f, +4.196844481e-02f, +1.694897807e-02f, -1.427181479e-02f, -2.944251916e-02f, -2.205492453e-02f, -2.603795838e-03f, +1.283558378e-02f, +1.536275749e-02f, +7.492209745e-03f, -2.062975205e-03f, -6.511361792e-03f, -5.064920292e-03f, -1.232960539e-03f, +1.387117114e-03f, +1.709861055e-03f, +7.895724787e-04f, -5.316979569e-06f,\n    -1.615859866e-05f, -3.241446603e-05f, -1.567834766e-05f, +4.804301997e-05f, +1.161111654e-04f, +1.016076144e-04f, -4.494996720e-05f, -2.476285808e-04f, -3.176334114e-04f, -1.052682830e-04f, +3.163092155e-04f, +6.268010350e-04f, +4.850956842e-04f, -1.394377625e-04f, -8.349747314e-04f, -1.006246087e-03f, -3.765694119e-04f, +6.891813548e-04f, +1.381233184e-03f, +1.075389676e-03f, -1.052072550e-04f, -1.306831259e-03f, -1.588670087e-03f, -6.894107303e-04f, +7.307474127e-04f, +1.598899162e-03f, +1.279398121e-03f, +6.243897335e-05f, -1.101099518e-03f, -1.373010239e-03f, -6.570343398e-04f, +4.063908467e-04f, +1.013112354e-03f, +8.183562434e-04f, +1.157634420e-04f, -4.978589565e-04f, -6.226498844e-04f, -3.027466434e-04f, +1.161919659e-04f, +3.193606803e-04f, +2.422058659e-04f, +3.874525151e-05f, -1.040610471e-04f, -1.147659265e-04f, -4.559794561e-05f, +1.695911659e-05f, +3.223543411e-05f, +1.549316995e-05f,\n    /*  4,16 (48) */\n    -2.454720714e-04f, -6.403743812e-04f, -7.753013890e-04f, -1.652737161e-04f, +1.267864505e-03f, +2.791718120e-03f, +3.020607048e-03f, +8.104121777e-04f, -3.540179339e-03f, -7.709203505e-03f, -8.212111417e-03f, -2.664897310e-03f, +7.764958482e-03f, +1.758130598e-02f, +1.914215558e-02f, +7.343420628e-03f, -1.561387028e-02f, -3.859723048e-02f, -4.507789545e-02f, -2.100498633e-02f, +3.671442638e-02f, +1.159502633e-01f, +1.924100849e-01f, +2.393328554e-01f, +2.393328554e-01f, +1.924100849e-01f, +1.159502633e-01f, +3.671442638e-02f, -2.100498633e-02f, -4.507789545e-02f, -3.859723048e-02f, -1.561387028e-02f, +7.343420628e-03f, +1.914215558e-02f, +1.758130598e-02f, +7.764958482e-03f, -2.664897310e-03f, -8.212111417e-03f, -7.709203505e-03f, -3.540179339e-03f, +8.104121777e-04f, +3.020607048e-03f, +2.791718120e-03f, +1.267864505e-03f, -1.652737161e-04f, -7.753013890e-04f, -6.403743812e-04f, -2.454720714e-04f,\n    +1.140166030e-05f, +1.111950086e-05f, -5.001234134e-06f, -3.296574548e-05f, -5.220574935e-05f, -3.586913284e-05f, +2.634409715e-05f, +1.082195383e-04f, +1.500257737e-04f, +9.294394045e-05f, -7.044391465e-05f, -2.649958715e-04f, -3.546402178e-04f, -2.206967259e-04f, +1.415589039e-04f, +5.727161007e-04f, +7.960181966e-04f, +5.576785734e-04f, -2.072328639e-04f, -1.283466916e-03f, -2.230918960e-03f, -2.579338719e-03f, -2.069155853e-03f, -8.067658006e-04f, +7.594343941e-04f, +2.039503840e-03f, +2.576854743e-03f, +2.252999191e-03f, +1.317649222e-03f, +2.380101219e-04f, -5.413700217e-04f, -7.965351371e-04f, -5.844006965e-04f, -1.552355348e-04f, +2.124310090e-04f, +3.542465450e-04f, +2.701514474e-04f, +7.666012020e-05f, -8.927769176e-05f, -1.499605271e-04f, -1.104915233e-04f, -2.885016553e-05f, +3.458924435e-05f, +5.235665165e-05f, +3.384208325e-05f, +5.762494102e-06f, -1.087619307e-05f, -1.156628587e-05f,\n    +1.017619038e-05f, +8.218079128e-04f, +1.726820172e-03f, +1.341519168e-03f, -1.347726465e-03f, -5.168981339e-03f, -6.472616540e-03f, -1.820769339e-03f, +7.811570426e-03f, +1.547894945e-02f, +1.253283714e-02f, -3.226445722e-03f, -2.255278348e-02f, -2.932675571e-02f, -1.345345855e-02f, +1.796209043e-02f, +4.237483565e-02f, +3.807692994e-02f, +3.202865258e-03f, -3.918611867e-02f, -5.673983033e-02f, -3.338228073e-02f, +1.607311687e-02f, +5.563290677e-02f, +5.563290677e-02f, +1.607311687e-02f, -3.338228073e-02f, -5.673983033e-02f, -3.918611867e-02f, +3.202865258e-03f, +3.807692994e-02f, +4.237483565e-02f, +1.796209043e-02f, -1.345345855e-02f, -2.932675571e-02f, -2.255278348e-02f, -3.226445722e-03f, +1.253283714e-02f, +1.547894945e-02f, +7.811570426e-03f, -1.820769339e-03f, -6.472616540e-03f, -5.168981339e-03f, -1.347726465e-03f, +1.341519168e-03f, +1.726820172e-03f, +8.218079128e-04f, +1.017619038e-05f,\n    -1.549316995e-05f, -3.223543411e-05f, -1.695911659e-05f, +4.559794561e-05f, +1.147659265e-04f, +1.040610471e-04f, -3.874525151e-05f, -2.422058659e-04f, -3.193606803e-04f, -1.161919659e-04f, +3.027466434e-04f, +6.226498844e-04f, +4.978589565e-04f, -1.157634420e-04f, -8.183562434e-04f, -1.013112354e-03f, -4.063908467e-04f, +6.570343398e-04f, +1.373010239e-03f, +1.101099518e-03f, -6.243897335e-05f, -1.279398121e-03f, -1.598899162e-03f, -7.307474127e-04f, +6.894107303e-04f, +1.588670087e-03f, +1.306831259e-03f, +1.052072550e-04f, -1.075389676e-03f, -1.381233184e-03f, -6.891813548e-04f, +3.765694119e-04f, +1.006246087e-03f, +8.349747314e-04f, +1.394377625e-04f, -4.850956842e-04f, -6.268010350e-04f, -3.163092155e-04f, +1.052682830e-04f, +3.176334114e-04f, +2.476285808e-04f, +4.494996720e-05f, -1.016076144e-04f, -1.161111654e-04f, -4.804301997e-05f, +1.567834766e-05f, +3.241446603e-05f, +1.615859866e-05f,\n    /*  4,17 (48) */\n    -2.340704111e-04f, -6.292548803e-04f, -7.803026232e-04f, -1.982394616e-04f, +1.215658755e-03f, +2.755848988e-03f, +3.046951145e-03f, +9.186317160e-04f, -3.390153565e-03f, -7.616259565e-03f, -8.282555331e-03f, -2.929893182e-03f, +7.410318264e-03f, +1.736060925e-02f, +1.928371449e-02f, +7.916136729e-03f, -1.481785208e-02f, -3.803955191e-02f, -4.528512831e-02f, -2.228845324e-02f, +3.448350742e-02f, +1.133709246e-01f, +1.903409290e-01f, +2.385260896e-01f, +2.400922898e-01f, +1.944495887e-01f, +1.185271180e-01f, +3.896742557e-02f, -1.968733711e-02f, -4.483988533e-02f, -3.913860051e-02f, -1.641040541e-02f, +6.759019932e-03f, +1.898692005e-02f, +1.779373699e-02f, +8.119205027e-03f, -2.394745863e-03f, -8.135451297e-03f, -7.798481197e-03f, -3.690139866e-03f, +6.999206543e-04f, +2.991756882e-03f, +2.826307365e-03f, +1.320221156e-03f, -1.314316329e-04f, -7.695388949e-04f, -6.512505742e-04f, -2.570383573e-04f,\n    +1.122946931e-05f, +1.134628287e-05f, -4.253067716e-06f, -3.208156172e-05f, -5.201873851e-05f, -3.710098106e-05f, +2.386034291e-05f, +1.059085645e-04f, +1.499900605e-04f, +9.649903394e-05f, -6.426379482e-05f, -2.597366849e-04f, -3.548057515e-04f, -2.287249824e-04f, +1.279602412e-04f, +5.608269972e-04f, +7.950342203e-04f, +5.734483729e-04f, -1.767795924e-04f, -1.249161875e-03f, -2.208235610e-03f, -2.580952332e-03f, -2.098043378e-03f, -8.537881199e-04f, +7.118118828e-04f, +2.009096942e-03f, +2.573497662e-03f, +2.274463530e-03f, +1.351692992e-03f, +2.691001954e-04f, -5.245249488e-04f, -7.965791143e-04f, -5.958713593e-04f, -1.689826330e-04f, +2.039302110e-04f, +3.536222271e-04f, +2.751987605e-04f, +8.290874270e-05f, -8.550128532e-05f, -1.497929516e-04f, -1.127223349e-04f, -3.137707163e-05f, +3.326148050e-05f, +5.247068588e-05f, +3.470970428e-05f, +6.536449958e-06f, -1.061622408e-05f, -1.172299359e-05f,\n    -5.316979569e-06f, +7.895724787e-04f, +1.709861055e-03f, +1.387117114e-03f, -1.232960539e-03f, -5.064920292e-03f, -6.511361792e-03f, -2.062975205e-03f, +7.492209745e-03f, +1.536275749e-02f, +1.283558378e-02f, -2.603795838e-03f, -2.205492453e-02f, -2.944251916e-02f, -1.427181479e-02f, +1.694897807e-02f, +4.196844481e-02f, +3.873396428e-02f, +4.575875497e-03f, -3.808501915e-02f, -5.680226930e-02f, -3.466167885e-02f, +1.447421771e-02f, +5.490215935e-02f, +5.632231750e-02f, +1.766178696e-02f, -3.207544947e-02f, -5.663462307e-02f, -4.026150834e-02f, +1.821632073e-03f, +3.738774859e-02f, +4.275140507e-02f, +1.896833652e-02f, -1.261848382e-02f, -2.918731795e-02f, -2.303787917e-02f, -3.853246757e-03f, +1.221652793e-02f, +1.558421773e-02f, +8.129203837e-03f, -1.573140758e-03f, -6.427666573e-03f, -5.270588954e-03f, -1.463837631e-03f, +1.293476148e-03f, +1.742498519e-03f, +8.542223788e-04f, +2.633478904e-05f,\n    -1.482949967e-05f, -3.202390001e-05f, -1.818856848e-05f, +4.316398208e-05f, +1.133401148e-04f, +1.063742421e-04f, -3.261098626e-05f, -2.366577331e-04f, -3.207945823e-04f, -1.268813810e-04f, +2.890914543e-04f, +6.180377019e-04f, +5.101038438e-04f, -9.219536492e-05f, -8.012152726e-04f, -1.019137592e-03f, -4.357232295e-04f, +6.245342378e-04f, +1.363755593e-03f, +1.125870273e-03f, -1.973393099e-05f, -1.251028504e-03f, -1.607883660e-03f, -7.715049169e-04f, +6.475274993e-04f, +1.577203222e-03f, +1.333304376e-03f, +1.480047969e-04f, -1.048758245e-03f, -1.388413650e-03f, -7.209476360e-04f, +3.462803737e-04f, +9.985389804e-04f, +8.510532580e-04f, +1.631995593e-04f, -4.718199911e-04f, -6.304829761e-04f, -3.297664872e-04f, +9.411699013e-05f, +3.156103559e-04f, +2.529190916e-04f, +5.122048314e-05f, -9.901380912e-05f, -1.173728985e-04f, -5.049686428e-05f, +1.434647234e-05f, +3.255991088e-05f, +1.682492863e-05f,\n    /*  4,18 (48) */\n    -2.228409418e-04f, -6.179085974e-04f, -7.845556909e-04f, -2.303210233e-04f, +1.163640017e-03f, +2.718748007e-03f, +3.070811488e-03f, +1.024540281e-03f, -3.240163505e-03f, -7.519760531e-03f, -8.346819126e-03f, -3.189629866e-03f, +7.055512513e-03f, +1.713188427e-02f, +1.941167473e-02f, +8.476963726e-03f, -1.402281786e-02f, -3.746610354e-02f, -4.546190791e-02f, -2.353761512e-02f, +3.227527181e-02f, +1.107899723e-01f, +1.882428856e-01f, +2.376723015e-01f, +2.408041017e-01f, +1.964586857e-01f, +1.211006157e-01f, +4.124188910e-02f, -1.833564411e-02f, -4.457078513e-02f, -3.966312545e-02f, -1.720698453e-02f, +6.163148572e-03f, +1.881793742e-02f, +1.799766720e-02f, +8.472827254e-03f, -2.119547102e-03f, -8.052542554e-03f, -7.883982483e-03f, -3.839932818e-03f, +5.871983194e-04f, +2.960379811e-03f, +2.859568845e-03f, +1.372691842e-03f, -9.672192862e-05f, -7.630024450e-04f, -6.618667983e-04f, -2.687613508e-04f,\n    +1.105006591e-05f, +1.155668711e-05f, -3.518374039e-06f, -3.119039424e-05f, -5.179639469e-05f, -3.828466290e-05f, +2.140034152e-05f, +1.035607843e-04f, +1.498548087e-04f, +9.994206275e-05f, -5.812336101e-05f, -2.543785525e-04f, -3.547457686e-04f, -2.365135726e-04f, +1.144469186e-04f, +5.487428281e-04f, +7.935893281e-04f, +5.886774826e-04f, -1.466612390e-04f, -1.214749860e-03f, -2.184962126e-03f, -2.581698707e-03f, -2.126157165e-03f, -9.004835180e-04f, +6.639163882e-04f, +1.977945120e-03f, +2.569265114e-03f, +2.295299430e-03f, +1.385582399e-03f, +3.004916782e-04f, -5.071458790e-04f, -7.961443986e-04f, -6.071186859e-04f, -1.827925721e-04f, +1.951968851e-04f, +3.527648773e-04f, +2.801331747e-04f, +8.918604661e-05f, -8.161580702e-05f, -1.495217318e-04f, -1.149097875e-04f, -3.392330190e-05f, +3.188604545e-05f, +5.254710946e-05f, +3.556773003e-05f, +7.322685613e-06f, -1.033947149e-05f, -1.187143190e-05f,\n    -2.014647924e-05f, +7.575485786e-04f, +1.691672486e-03f, +1.430281096e-03f, -1.119620424e-03f, -4.958546050e-03f, -6.543972778e-03f, -2.299632938e-03f, +7.171415163e-03f, +1.523587610e-02f, +1.312467524e-02f, -1.985758136e-03f, -2.154482068e-02f, -2.953471452e-02f, -1.507303007e-02f, +1.592984048e-02f, +4.153272158e-02f, +3.935849852e-02f, +5.939631090e-03f, -3.695914888e-02f, -5.682200323e-02f, -3.591270736e-02f, +1.286633405e-02f, +5.413065444e-02f, +5.696984499e-02f, +1.923899018e-02f, -3.074214510e-02f, -5.648661828e-02f, -4.131026659e-02f, +4.332184234e-04f, +3.666680095e-02f, +4.309768544e-02f, +1.996687550e-02f, -1.176743056e-02f, -2.902411839e-02f, -2.350969916e-02f, -4.483729733e-03f, +1.188676144e-02f, +1.567833472e-02f, +8.444814193e-03f, -1.320221666e-03f, -6.376446090e-03f, -5.369602763e-03f, -1.581210529e-03f, +1.242979284e-03f, +1.756844992e-03f, +8.867822897e-04f, +4.315971767e-05f,\n    -1.416842128e-05f, -3.178096262e-05f, -1.936655489e-05f, +4.074341266e-05f, +1.118366926e-04f, +1.085474701e-04f, -2.655168425e-05f, -2.309909909e-04f, -3.219377725e-04f, -1.373301571e-04f, +2.753562781e-04f, +6.129729854e-04f, +5.218248785e-04f, -6.875206024e-05f, -7.835696146e-04f, -1.024322317e-03f, -4.645456348e-04f, +5.917088586e-04f, +1.353480834e-03f, +1.149685270e-03f, +2.287402917e-05f, -1.221746674e-03f, -1.615617815e-03f, -8.116510977e-04f, +6.051308071e-04f, +1.564506376e-03f, +1.358794677e-03f, +1.907975127e-04f, -1.021223537e-03f, -1.394541677e-03f, -7.523057237e-04f, +3.155456883e-04f, +9.899919317e-04f, +8.665746790e-04f, +1.870298427e-04f, -4.580383367e-04f, -6.336878614e-04f, -3.431057333e-04f, +8.274502853e-05f, +3.132893352e-04f, +2.580706410e-04f, +5.755201443e-05f, -9.627963359e-05f, -1.185482258e-04f, -5.295708166e-05f, +1.296376440e-05f, +3.267069945e-05f, +1.749127965e-05f,\n    /*  4,19 (48) */\n    -2.117908759e-04f, -6.063519103e-04f, -7.880740649e-04f, -2.615114176e-04f, +1.111843622e-03f, +2.680463344e-03f, +3.092211830e-03f, +1.128101065e-03f, -3.090308696e-03f, -7.419818468e-03f, -8.404942487e-03f, -3.444008419e-03f, +6.700766744e-03f, +1.689537070e-02f, +1.952612165e-02f, +9.025706554e-03f, -1.322922853e-02f, -3.687742605e-02f, -4.560856914e-02f, -2.475236498e-02f, +3.009030968e-02f, +1.082082735e-01f, +1.861167285e-01f, +2.367718179e-01f, +2.414680180e-01f, +1.984366308e-01f, +1.236698808e-01f, +4.353718853e-02f, -1.695006172e-02f, -4.427029345e-02f, -4.017027133e-02f, -1.800312893e-02f, +5.556029886e-03f, +1.863514484e-02f, +1.819286408e-02f, +8.825592131e-03f, -1.839413927e-03f, -7.963356507e-03f, -7.965598290e-03f, -3.989454550e-03f, +4.722885319e-04f, +2.926456509e-03f, +2.891454891e-03f, +1.425238952e-03f, -6.115419859e-05f, -7.556797593e-04f, -6.722062698e-04f, -2.806327827e-04f,\n    +1.086380328e-05f, +1.175087387e-05f, -2.797513799e-06f, -3.029309637e-05f, -5.153950867e-05f, -3.942009059e-05f, +1.896549344e-05f, +1.011783760e-04f, +1.496214900e-04f, +1.032722050e-04f, -5.202614347e-05f, -2.489261490e-04f, -3.544630052e-04f, -2.440604639e-04f, +1.010261762e-04f, +5.364730471e-04f, +7.916898281e-04f, +6.033642566e-04f, -1.168884923e-04f, -1.180246587e-03f, -2.161111704e-03f, -2.581581344e-03f, -2.153488329e-03f, -9.468343174e-04f, +6.157661632e-04f, +1.946058681e-03f, +2.564155124e-03f, +2.315494573e-03f, +1.419301593e-03f, +3.321729341e-04f, -4.892356315e-04f, -7.952254626e-04f, -6.181333013e-04f, -1.966576036e-04f, +1.862337587e-04f, +3.516722310e-04f, +2.849500731e-04f, +9.548823139e-05f, -7.762243142e-05f, -1.491456078e-04f, -1.170516966e-04f, -3.648730630e-05f, +3.046318302e-05f, +5.258519756e-05f, +3.641527474e-05f, +8.120766612e-06f, -1.004582615e-05f, -1.201125048e-05f,\n    -3.431490051e-05f, +7.257676160e-04f, +1.672305932e-03f, +1.471024509e-03f, -1.007783731e-03f, -4.849998580e-03f, -6.570524462e-03f, -2.530623929e-03f, +6.849477391e-03f, +1.509854595e-02f, +1.340003152e-02f, -1.372785150e-03f, -2.102299581e-02f, -2.960346658e-02f, -1.585659968e-02f, +1.490551817e-02f, +4.106817594e-02f, +3.995020738e-02f, +7.293111923e-03f, -3.580946361e-02f, -5.679912920e-02f, -3.713445403e-02f, +1.125071624e-02f, +5.331900334e-02f, +5.757497580e-02f, +2.080349656e-02f, -2.938335042e-02f, -5.629582076e-02f, -4.233149012e-02f, -9.613232535e-04f, +3.591449523e-02f, +4.341323113e-02f, +2.095686743e-02f, -1.090085588e-02f, -2.883708855e-02f, -2.396773750e-02f, -5.117417595e-03f, +1.154365571e-02f, +1.576107975e-02f, +8.758103528e-03f, -1.062151025e-03f, -6.318894076e-03f, -5.465882396e-03f, -1.699758755e-03f, +1.190022202e-03f, +1.769808756e-03f, +9.194529891e-04f, +6.065099732e-05f,\n    -1.351074403e-05f, -3.150773327e-05f, -2.049298849e-05f, +3.833846165e-05f, +1.102586480e-04f, +1.105811345e-04f, -2.057171849e-05f, -2.252124631e-04f, -3.227931365e-04f, -1.475322116e-04f, +2.615536806e-04f, +6.074645433e-04f, +5.330170897e-04f, -4.545180504e-05f, -7.654373648e-04f, -1.028667743e-03f, -4.928376748e-04f, +5.585861505e-04f, +1.342198342e-03f, +1.172528677e-03f, +6.535122827e-05f, -1.191577599e-03f, -1.622096891e-03f, -8.511543217e-04f, +5.622541709e-04f, +1.550588370e-03f, +1.383280130e-03f, +2.335512367e-04f, -9.928046655e-04f, -1.399608137e-03f, -7.832283699e-04f, +2.843878024e-04f, +9.806065503e-04f, +8.815222021e-04f, +2.109094147e-04f, -4.437576740e-04f, -6.364081860e-04f, -3.563141973e-04f, +7.115961947e-05f, +3.106684165e-04f, +2.630765080e-04f, +6.393964423e-05f, -9.340523006e-05f, -1.196342840e-04f, -5.542122079e-05f, +1.153056169e-05f, +3.274577985e-05f, +1.815674907e-05f,\n    /*  4,20 (48) */\n    -2.009270726e-04f, -5.946010365e-04f, -7.908715787e-04f, -2.918045140e-04f, +1.060304113e-03f, +2.641043253e-03f, +3.111177323e-03f, +1.229279441e-03f, -2.940687206e-03f, -7.316546263e-03f, -8.456968631e-03f, -3.692934568e-03f, +6.346303739e-03f, +1.665131023e-02f, +1.962714782e-02f, +9.562179601e-03f, -1.243753870e-02f, -3.627406180e-02f, -4.572545764e-02f, -2.593261157e-02f, +2.792919798e-02f, +1.056266922e-01f, +1.839632402e-01f, +2.358249836e-01f, +2.420837842e-01f, +2.003826895e-01f, +1.262340359e-01f, +4.585268310e-02f, -1.553076012e-02f, -4.393812052e-02f, -4.065950696e-02f, -1.879835439e-02f, +4.937896585e-03f, +1.843848724e-02f, +1.837909784e-02f, +9.177264362e-03f, -1.554463854e-03f, -7.867868276e-03f, -8.043220721e-03f, -4.138600157e-03f, +3.552368352e-04f, +2.889969203e-03f, +2.921918074e-03f, +1.477824149e-03f, -2.473892386e-05f, -7.475589927e-04f, -6.822520959e-04f, -2.926440332e-04f,\n    +1.067103444e-05f, +1.192901538e-05f, -2.090829182e-06f, -2.939051183e-05f, -5.124888558e-05f, -4.050721427e-05f, +1.655716031e-05f, +9.876351284e-05f, +1.492916248e-04f, +1.064887260e-04f, -4.597560078e-05f, -2.433841554e-04f, -3.539603077e-04f, -2.513637965e-04f, +8.770511911e-05f, +5.240271131e-04f, +7.893422111e-04f, +6.175073398e-04f, -8.747179280e-05f, -1.145667720e-03f, -2.136697738e-03f, -2.580604122e-03f, -2.180028346e-03f, -9.928230059e-04f, +5.673795826e-04f, +1.913448276e-03f, +2.558166103e-03f, +2.335036878e-03f, +1.452834710e-03f, +3.641321009e-04f, -4.707973205e-04f, -7.938169860e-04f, -6.289058638e-04f, -2.105698600e-04f, +1.770437336e-04f, +3.503421484e-04f, +2.896448614e-04f, +1.018114333e-04f, -7.352242204e-05f, -1.486633763e-04f, -1.191458798e-04f, -3.906749896e-05f, +2.899317705e-05f, +5.258424396e-05f, +3.725144604e-05f, +8.930240209e-06f, -9.735192555e-06f, -1.214210066e-05f,\n    -4.782564454e-05f, +6.942598828e-04f, +1.651812943e-03f, +1.509362970e-03f, -8.975250834e-04f, -4.739417445e-03f, -6.591096181e-03f, -2.755836392e-03f, +6.526684254e-03f, +1.495101374e-02f, +1.366158520e-02f, -7.653206070e-04f, -2.048997872e-02f, -2.964891839e-02f, -1.662203705e-02f, +1.387685042e-02f, +4.057533827e-02f, +4.050879353e-02f, +8.635310265e-03f, -3.463693493e-02f, -5.673377797e-02f, -3.832603163e-02f, +9.628619345e-03f, +5.246784902e-02f, +5.813722997e-02f, +2.235408493e-02f, -2.800007029e-02f, -5.606226953e-02f, -4.332429479e-02f, -2.360931390e-03f, +3.513126686e-02f, +4.369761893e-02f, +2.193747398e-02f, -1.001933368e-02f, -2.862617914e-02f, -2.441149517e-02f, -5.753825781e-03f, +1.118734151e-02f, +1.583223937e-02f, +9.068771944e-03f, -7.990745172e-04f, -6.254954431e-03f, -5.559287626e-03f, -1.819393039e-03f, +1.134600982e-03f, +1.781339318e-03f, +9.521987690e-04f, +7.880774639e-05f,\n    -1.285725242e-05f, -3.120533410e-05f, -2.156784201e-05f, +3.595129296e-05f, +1.086089913e-04f, +1.124757694e-04f, -1.467531985e-05f, -2.193289824e-04f, -3.233637847e-04f, -1.574817538e-04f, +2.476961529e-04f, +6.015214833e-04f, +5.436760041e-04f, -2.231261017e-05f, -7.468369003e-04f, -1.032175779e-03f, -5.205795147e-04f, +5.251941758e-04f, +1.329921279e-03f, +1.194385510e-03f, +1.076641795e-04f, -1.160546927e-03f, -1.627317182e-03f, -8.899834931e-04f, +5.189315099e-04f, +1.535459032e-03f, +1.406739489e-03f, +2.762317526e-04f, -9.635215340e-04f, -1.403604744e-03f, -8.136885621e-04f, +2.528296377e-04f, +9.703851603e-04f, +8.958794037e-04f, +2.348188846e-04f, -4.289854480e-04f, -6.386367957e-04f, -3.693791032e-04f, +5.936826082e-05f, +3.077459176e-04f, +2.679300144e-04f, +7.037832680e-05f, -9.039088257e-05f, -1.206282501e-04f, -5.788677766e-05f, +1.004726703e-05f, +3.278411916e-05f, +1.882041246e-05f,\n    /*  4,21 (48) */\n    -1.902560381e-04f, -5.826720211e-04f, -7.929624079e-04f, -3.211950258e-04f, +1.009055228e-03f, +2.600536039e-03f, +3.127734483e-03f, +1.328042954e-03f, -2.791395581e-03f, -7.210057537e-03f, -8.502944231e-03f, -3.936318723e-03f, +5.992343431e-03f, +1.639994644e-02f, +1.971485294e-02f, +1.008620671e-02f, -1.164819649e-02f, -3.565655446e-02f, -4.581292943e-02f, -2.707827929e-02f, +2.579250024e-02f, +1.030460881e-01f, +1.817832118e-01f, +2.348321606e-01f, +2.426511638e-01f, +2.022961377e-01f, +1.287922020e-01f, +4.818771998e-02f, -1.407792541e-02f, -4.357398842e-02f, -4.113030429e-02f, -1.959217137e-02f, +4.308990721e-03f, +1.822791738e-02f, +1.855614158e-02f, +9.527606511e-03f, -1.264818993e-03f, -7.766056842e-03f, -8.116743143e-03f, -4.287263534e-03f, +2.360909554e-04f, +2.850901704e-03f, +2.950911251e-03f, +1.530408393e-03f, +1.251252218e-05f, -7.386287525e-04f, -6.919872885e-04f, -3.047861339e-04f,\n    +1.047211195e-05f, +1.209129542e-05f, -1.398643874e-06f, -2.848347424e-05f, -5.092534407e-05f, -4.154602144e-05f, +1.417666452e-05f, +9.631836077e-05f, +1.488667806e-04f, +1.095909776e-04f, -3.997511835e-05f, -2.377572560e-04f, -3.532406304e-04f, -2.584218823e-04f, +7.449071459e-05f, +5.114144858e-04f, +7.865531458e-04f, +6.311056663e-04f, -5.842132989e-05f, -1.111028863e-03f, -2.111733820e-03f, -2.578771288e-03f, -2.205769064e-03f, -1.038432244e-03f, +5.187751349e-04f, +1.880124898e-03f, +2.551296854e-03f, +2.353914507e-03f, +1.486165880e-03f, +3.963570956e-04f, -4.518343557e-04f, -7.919138599e-04f, -6.394270710e-04f, -2.245213585e-04f, +1.676298856e-04f, +3.487726173e-04f, +2.942129712e-04f, +1.081517273e-04f, -6.931713154e-05f, -1.480738929e-04f, -1.211901590e-04f, -4.166225889e-05f, +2.747635175e-05f, +5.254356191e-05f, +3.807534563e-05f, +9.750635465e-06f, -9.407489159e-06f, -1.226363572e-05f,\n    -6.068289696e-05f, +6.630545487e-04f, +1.630245101e-03f, +1.545314263e-03f, -7.889160921e-04f, -4.626941676e-03f, -6.605771501e-03f, -2.975165374e-03f, +6.203320469e-03f, +1.479353198e-02f, +1.390928135e-02f, -1.637991238e-04f, -1.994630271e-02f, -2.967123100e-02f, -1.736887395e-02f, +1.284467464e-02f, +4.005475875e-02f, +4.103398771e-02f, +9.965231544e-03f, -3.344254942e-02f, -5.662611379e-02f, -3.948657856e-02f, +8.001302163e-03f, +5.157786552e-02f, +5.865616148e-02f, +2.388954396e-02f, -2.659333080e-02f, -5.578603777e-02f, -4.428781632e-02f, -3.764536134e-03f, +3.431757830e-02f, +4.395044857e-02f, +2.290785914e-02f, -9.123454277e-03f, -2.839136025e-02f, -2.484048062e-02f, -6.392462576e-03f, +1.081796240e-02f, +1.589160763e-02f, +9.376517862e-03f, -5.311445028e-04f, -6.184576105e-03f, -5.649678509e-03f, -1.940021289e-03f, +1.076714204e-03f, +1.791386585e-03f, +9.849828881e-04f, +9.762815885e-05f,\n    -1.220870577e-05f, -3.087489644e-05f, -2.259114707e-05f, +3.358400885e-05f, +1.068907517e-04f, +1.142320367e-04f, -8.866574981e-06f, -2.133473835e-04f, -3.236530469e-04f, -1.671732861e-04f, +2.337961005e-04f, +5.951532014e-04f, +5.537976452e-04f, +6.477933725e-07f, -7.277868621e-04f, -1.034849023e-03f, -5.477518863e-04f, +4.915610870e-04f, +1.316663576e-03f, +1.215241647e-03f, +1.497796158e-04f, -1.128680965e-03f, -1.631276012e-03f, -9.281080801e-04f, +4.751971168e-04f, +1.519129192e-03f, +1.429152316e-03f, +3.188048226e-04f, -9.333948178e-04f, -1.406524065e-03f, -8.436595480e-04f, +2.208945727e-04f, +9.593308029e-04f, +9.096302455e-04f, +2.587386849e-04f, -4.137295927e-04f, -6.403668975e-04f, -3.822876665e-04f, +4.737872311e-05f, +3.045204117e-04f, +2.726245321e-04f, +7.686289059e-05f, -8.723701883e-05f, -1.215273449e-04f, -6.035119738e-05f, +8.514348974e-06f, +3.278470509e-05f, +1.948132439e-05f,\n    /*  4,22 (48) */\n    -1.797839262e-04f, -5.705807257e-04f, -7.943610518e-04f, -3.496785000e-04f, +9.581298838e-04f, +2.558990017e-03f, +3.141911148e-03f, +1.424361314e-03f, -2.642528801e-03f, -7.100466560e-03f, -8.542919350e-03f, -4.174075979e-03f, +5.639102801e-03f, +1.614152455e-02f, +1.978934366e-02f, +1.059762120e-02f, -1.086164335e-02f, -3.502544879e-02f, -4.587135076e-02f, -2.818930815e-02f, +2.368076642e-02f, +1.004673168e-01f, +1.795774427e-01f, +2.337937284e-01f, +2.431699389e-01f, +2.041762626e-01f, +1.313434989e-01f, +5.054163449e-02f, -1.259175953e-02f, -4.317763132e-02f, -4.158213864e-02f, -2.038408523e-02f, +3.669563650e-03f, +1.800339602e-02f, +1.872377146e-02f, +9.876379128e-03f, -9.706060217e-04f, -7.657905115e-03f, -8.186060275e-03f, -4.435337427e-03f, +1.149007964e-04f, +2.809239445e-03f, +2.978387603e-03f, +1.582951955e-03f, +5.058786781e-05f, -7.288781171e-04f, -7.013947777e-04f, -3.170497696e-04f,\n    +1.026738752e-05f, +1.223790898e-05f, -7.212630777e-07f, -2.757280659e-05f, -5.056971542e-05f, -4.253653645e-05f, +1.182528874e-05f, +9.384507757e-05f, +1.483485705e-04f, +1.125783976e-04f, -3.402800705e-05f, -2.320501354e-04f, -3.523070318e-04f, -2.652332049e-04f, +6.138978928e-05f, +4.986446197e-04f, +7.833294736e-04f, +6.441584584e-04f, -2.974703766e-05f, -1.076345550e-03f, -2.086233724e-03f, -2.576087462e-03f, -2.230702699e-03f, -1.083644875e-03f, +4.699714128e-04f, +1.846099875e-03f, +2.543546566e-03f, +2.372115874e-03f, +1.519279236e-03f, +4.288356190e-04f, -4.323504425e-04f, -7.895111918e-04f, -6.496876654e-04f, -2.385040047e-04f, +1.579954647e-04f, +3.469617557e-04f, +2.986498630e-04f, +1.145051290e-04f, -6.500800187e-05f, -1.473760729e-04f, -1.231823616e-04f, -4.426993069e-05f, +2.591307205e-05f, +5.246248495e-05f, +3.888606991e-05f, +1.058146335e-05f, -9.062648661e-06f, -1.237551130e-05f,\n    -7.289160273e-05f, +6.321796522e-04f, +1.607653954e-03f, +1.578898272e-03f, -6.820253404e-04f, -4.512709639e-03f, -6.614638076e-03f, -3.188512758e-03f, +5.879667422e-03f, +1.462635870e-02f, +1.414307745e-02f, +4.313540776e-04f, -1.939250507e-02f, -2.967058320e-02f, -1.809666081e-02f, +1.180982562e-02f, +3.950700687e-02f, +4.152554879e-02f, +1.128189512e-02f, -3.222730777e-02f, -5.647633418e-02f, -4.061525952e-02f, +6.370026151e-03f, +5.064975744e-02f, +5.913135860e-02f, +2.540867315e-02f, -2.516417848e-02f, -5.546723295e-02f, -4.522121114e-02f, -5.171060199e-03f, +3.347391875e-02f, +4.417134314e-02f, +2.386718994e-02f, -8.213824032e-03f, -2.813262157e-02f, -2.525421021e-02f, -7.032829474e-03f, +1.043567474e-02f, +1.593898636e-02f, +9.681038274e-03f, -2.585199707e-04f, -6.107713214e-03f, -5.736915528e-03f, -2.061548634e-03f, +1.016363007e-03f, +1.799900934e-03f, +1.017767593e-03f, +1.171094832e-04f,\n    -1.156583771e-05f, -3.051755931e-05f, -2.356299303e-05f, +3.123864879e-05f, +1.051069733e-04f, +1.158507237e-04f, -3.149424362e-06f, -2.072744965e-04f, -3.236644660e-04f, -1.766016064e-04f, +2.198658333e-04f, +5.883693712e-04f, +5.633785327e-04f, +2.341196786e-05f, -7.083061374e-04f, -1.036690754e-03f, -5.743361015e-04f, +4.577151014e-04f, +1.302439913e-03f, +1.235083830e-03f, +1.916645172e-04f, -1.096006654e-03f, -1.633971743e-03f, -9.654981397e-04f, +4.310856293e-04f, +1.501610669e-03f, +1.450498990e-03f, +3.612362155e-04f, -9.024459511e-04f, -1.408359528e-03f, -8.731148588e-04f, +1.886064256e-04f, +9.474472378e-04f, +9.227590917e-04f, +2.826490864e-04f, -3.979985283e-04f, -6.415920685e-04f, -3.950271064e-04f, +3.519904534e-05f, +3.009907318e-04f, +2.771534900e-04f, +8.338804160e-05f, -8.394421207e-05f, -1.223288367e-04f, -6.281187603e-05f, +6.932342584e-06f, +3.274654767e-05f, +2.013851916e-05f,\n    /*  4,23 (48) */\n    -1.695165387e-04f, -5.583428167e-04f, -7.950823148e-04f, -3.772513066e-04f, +9.075601684e-04f, +2.516453481e-03f, +3.153736437e-03f, +1.518206392e-03f, -2.494180230e-03f, -6.987888162e-03f, -8.576947357e-03f, -4.406126115e-03f, +5.286795769e-03f, +1.587629135e-02f, +1.985073345e-02f, +1.109626582e-02f, -1.007831387e-02f, -3.438129033e-02f, -4.590109780e-02f, -2.926565370e-02f, +2.159453270e-02f, +9.789122933e-02f, +1.773467400e-01f, +2.327100835e-01f, +2.436399103e-01f, +2.060223625e-01f, +1.338870455e-01f, +5.291375036e-02f, -1.107248030e-02f, -4.274879570e-02f, -4.201448908e-02f, -2.117359643e-02f, +3.019875985e-03f, +1.776489202e-02f, +1.888176693e-02f, +1.022334088e-02f, -6.719561588e-04f, -7.543399986e-03f, -8.251068276e-03f, -4.582713499e-03f, -8.281565258e-06f, +2.764969514e-03f, +3.004300675e-03f, +1.635414440e-03f, +8.947393773e-05f, -7.182966537e-04f, -7.104574263e-04f, -3.294252809e-04f,\n    +1.005721173e-05f, +1.236906188e-05f, -5.897355422e-08f, -2.665932067e-05f, -5.018284270e-05f, -4.347881995e-05f, +9.504275476e-06f, +9.134581111e-05f, +1.477386512e-04f, +1.154505091e-04f, -2.813750178e-05f, -2.262674753e-04f, -3.511626720e-04f, -2.717964180e-04f, +4.840902647e-05f, +4.857269586e-04f, +7.796782035e-04f, +6.566652244e-04f, -1.458591480e-06f, -1.041633242e-03f, -2.060211405e-03f, -2.572557625e-03f, -2.254821845e-03f, -1.128443930e-03f, +4.209871051e-04f, +1.811384863e-03f, +2.534914823e-03f, +2.389629649e-03f, +1.552158922e-03f, +4.615551614e-04f, -4.123495821e-04f, -7.866043095e-04f, -6.596784399e-04f, -2.525095963e-04f, +1.481438948e-04f, +3.449078145e-04f, +3.029510298e-04f, +1.208675967e-04f, -6.059656432e-05f, -1.465688934e-04f, -1.251203224e-04f, -4.688882536e-05f, +2.430374389e-05f, +5.234036778e-05f, +3.968271065e-05f, +1.142221689e-05f, -8.700618332e-06f, -1.247738578e-05f,\n    -8.445744044e-05f, +6.016620929e-04f, +1.584090961e-03f, +1.610136921e-03f, -5.769183672e-04f, -4.396858915e-03f, -6.617787500e-03f, -3.395787254e-03f, +5.556002956e-03f, +1.444975709e-02f, +1.436294328e-02f, +1.019723449e-03f, -1.882912653e-02f, -2.964717124e-02f, -1.880496695e-02f, +1.077313487e-02f, +3.893267077e-02f, +4.198326390e-02f, +1.258433503e-02f, -3.099222394e-02f, -5.628466966e-02f, -4.171126617e-02f, +4.736054408e-03f, +4.968425930e-02f, +5.956244423e-02f, +2.691028382e-02f, -2.371367949e-02f, -5.510599674e-02f, -4.612365709e-02f, -6.579419727e-03f, +3.260080389e-02f, +4.435994957e-02f, +2.481463718e-02f, -7.291064940e-03f, -2.784997248e-02f, -2.565220874e-02f, -7.674421542e-03f, +1.004064763e-02f, +1.597418540e-02f, +9.982029006e-03f, +1.863351932e-05f, -6.024325172e-03f, -5.820859740e-03f, -2.183877471e-03f, +9.535511306e-04f, +1.806833276e-03f, +1.050514141e-03f, +1.372480024e-04f,\n    -1.092935588e-05f, -3.013446780e-05f, -2.448352570e-05f, +2.891718833e-05f, +1.032607123e-04f, +1.173327403e-04f, +2.472339476e-06f, -2.011171405e-04f, -3.234017925e-04f, -1.857618093e-04f, +2.059175552e-04f, +5.811799325e-04f, +5.724156817e-04f, +4.596278178e-05f, -6.884138412e-04f, -1.037704928e-03f, -6.003140652e-04f, +4.236844779e-04f, +1.287265709e-03f, +1.253899682e-03f, +2.332861382e-04f, -1.062551544e-03f, -1.635403767e-03f, -1.002124343e-03f, +3.866320012e-04f, +1.482916267e-03f, +1.470760737e-03f, +4.034917365e-04f, -8.706971109e-04f, -1.409105432e-03f, -9.020283335e-04f, +1.559894358e-04f, +9.347389443e-04f, +9.352507246e-04f, +3.065302152e-04f, -3.818011580e-04f, -6.423062653e-04f, -4.075846569e-04f, +2.283753055e-05f, +2.971559747e-04f, +2.815103813e-04f, +8.994836685e-05f, -8.051318266e-05f, -1.230300454e-04f, -6.526616266e-05f, +5.301850104e-06f, +3.266868091e-05f, +2.079101159e-05f,\n    /*  4,24 (48) */\n    -1.594593269e-04f, -5.459737548e-04f, -7.951412884e-04f, -4.039106273e-04f, +8.573773257e-04f, +2.472974661e-03f, +3.163240712e-03f, +1.609552203e-03f, -2.346441579e-03f, -6.872437653e-03f, -8.605084859e-03f, -4.632393590e-03f, +4.935633097e-03f, +1.560449493e-02f, +1.989914247e-02f, +1.158199278e-02f, -9.298635668e-03f, -3.372462511e-02f, -4.590255639e-02f, -3.030728694e-02f, +1.953432129e-02f, +9.531867170e-02f, +1.750919182e-01f, +2.315816396e-01f, +2.440608974e-01f, +2.078337474e-01f, +1.364219603e-01f, +5.530338001e-02f, -9.520321375e-03f, -4.228724054e-02f, -4.242683867e-02f, -2.196020074e-02f, +2.360197545e-03f, +1.751238242e-02f, +1.902991082e-02f, +1.056824870e-02f, -3.690051289e-04f, -7.422532389e-03f, -8.311664841e-03f, -4.729282393e-03f, -1.334018877e-04f, +2.718080689e-03f, +3.028604419e-03f, +1.687754808e-03f, +1.291566484e-04f, -7.068744368e-04f, -7.191580447e-04f, -3.419026667e-04f,\n    +9.841933680e-06f, +1.248497041e-05f, +5.879563279e-07f, -2.574381665e-05f, -4.976557993e-05f, -4.437296836e-05f, +7.214826744e-06f, +8.882269798e-05f, +1.470387212e-04f, +1.182069200e-04f, -2.230676018e-05f, -2.204139514e-04f, -3.498108096e-04f, -2.781103449e-04f, +3.555496353e-05f, +4.726709308e-04f, +7.756065067e-04f, +6.686257571e-04f, +2.643459550e-05f, -1.006907315e-03f, -2.033680987e-03f, -2.568187124e-03f, -2.278119471e-03f, -1.172812640e-03f, +3.718409871e-04f, +1.775991847e-03f, +2.525401601e-03f, +2.406444767e-03f, +1.584789098e-03f, +4.945030070e-04f, -3.918360714e-04f, -7.831887655e-04f, -6.693902437e-04f, -2.665298267e-04f, +1.380787733e-04f, +3.426091801e-04f, +3.071120005e-04f, +1.272350333e-04f, -5.608443952e-05f, -1.456513944e-04f, -1.270018852e-04f, -4.951722105e-05f, +2.264881449e-05f, +5.217658705e-05f, +4.046435566e-05f, +1.227237129e-05f, -8.321360299e-06f, -1.256892063e-05f,\n    -9.538679632e-05f, +5.715276251e-04f, +1.559607435e-03f, +1.639054109e-03f, -4.736576549e-04f, -4.279526175e-03f, -6.615315161e-03f, -3.596904395e-03f, +5.232601164e-03f, +1.426399528e-02f, +1.456886084e-02f, +1.600903381e-03f, -1.825671085e-02f, -2.960120845e-02f, -1.949338079e-02f, +9.735429939e-03f, +3.833235670e-02f, +4.240694837e-02f, +1.387160074e-02f, -2.973832426e-02f, -5.605138352e-02f, -4.277381772e-02f, +3.100650641e-03f, +4.868213496e-02f, +5.994907623e-02f, +2.839320009e-02f, -2.224291876e-02f, -5.470250500e-02f, -4.699435420e-02f, -7.988525159e-03f, +3.169877556e-02f, +4.451593900e-02f, +2.574937612e-02f, -6.355814215e-03f, -2.754344226e-02f, -2.603400990e-02f, -8.316727808e-03f, +9.633062975e-03f, +1.599702293e-02f, +1.027918498e-02f, +3.001439006e-04f, -5.934376806e-03f, -5.901372922e-03f, -2.306907516e-03f, +8.882849680e-04f, +1.812135126e-03f, +1.083182822e-03f, +1.580390140e-04f,\n    -1.029994154e-05f, -2.972677158e-05f, -2.535294614e-05f, +2.662153812e-05f, +1.013550330e-04f, +1.186791159e-04f, +7.995073534e-06f, -1.948821172e-04f, -3.228689785e-04f, -1.946492873e-04f, +1.919633541e-04f, +5.735950795e-04f, +5.809066006e-04f, +6.828342250e-05f, -6.681292984e-04f, -1.037896166e-03f, -6.256682876e-04f, +3.894974920e-04f, +1.271157102e-03f, +1.271677709e-03f, +2.746120345e-04f, -1.028343774e-03f, -1.635572511e-03f, -1.037957999e-03f, +3.418714729e-04f, +1.463059761e-03f, +1.489919637e-03f, +4.455372552e-04f, -8.381711999e-04f, -1.408756955e-03f, -9.303741423e-04f, +1.230682455e-04f, +9.212111215e-04f, +9.470903609e-04f, +3.303620685e-04f, -3.651468636e-04f, -6.425038326e-04f, -4.199475789e-04f, +1.030274097e-05f, +2.930155053e-04f, +2.856887703e-04f, +9.653833807e-05f, -7.694479968e-05f, -1.236283455e-04f, -6.771136134e-05f, +3.623541571e-06f, +3.255016448e-05f, +2.143779791e-05f,\n    /*  4,25 (48) */\n    -1.496173933e-04f, -5.334887844e-04f, -7.945533321e-04f, -4.296544439e-04f, +8.076117457e-04f, +2.428601693e-03f, +3.170455539e-03f, +1.698374901e-03f, -2.199402858e-03f, -6.754230733e-03f, -8.627391619e-03f, -4.852807542e-03f, +4.585822287e-03f, +1.532638459e-02f, +1.993469744e-02f, +1.205466371e-02f, -8.523029162e-03f, -3.305599935e-02f, -4.587612179e-02f, -3.131419426e-02f, +1.750064030e-02f, +9.275048458e-02f, +1.728137987e-01f, +2.304088269e-01f, +2.444327384e-01f, +2.096097392e-01f, +1.389473619e-01f, +5.770982478e-02f, -7.935532277e-03f, -4.179273754e-02f, -4.281867474e-02f, -2.274338950e-02f, +1.690807301e-03f, +1.724585259e-02f, +1.916798959e-02f, +1.091085788e-02f, -6.189312840e-05f, -7.295297356e-03f, -8.367749280e-03f, -4.874933787e-03f, -2.604037729e-04f, +2.668563468e-03f, +3.051253233e-03f, +1.739931395e-03f, +1.696210040e-04f, -6.946020655e-04f, -7.274794050e-04f, -3.544715873e-04f,\n    +9.621900691e-06f, +1.258586094e-05f, +1.219276524e-06f, -2.482708254e-05f, -4.931879124e-05f, -4.521911322e-05f, +4.958103691e-06f, +8.627786209e-05f, +1.462505197e-04f, +1.208473221e-04f, -1.653886144e-05f, -2.144942307e-04f, -3.482547981e-04f, -2.841739777e-04f, +2.283398945e-05f, +4.594859434e-04f, +7.711217117e-04f, +6.800401319e-04f, +5.392337557e-05f, -9.721830556e-04f, -2.006656758e-03f, -2.562981663e-03f, -2.300588926e-03f, -1.216734440e-03f, +3.225519117e-04f, +1.739933127e-03f, +2.515007272e-03f, +2.422550433e-03f, +1.617153954e-03f, +5.276662400e-04f, -3.708145029e-04f, -7.792603414e-04f, -6.788139878e-04f, -2.805562892e-04f, +1.278038710e-04f, +3.400643764e-04f, +3.111283429e-04f, +1.336032886e-04f, -5.147333744e-05f, -1.446226806e-04f, -1.288249044e-04f, -5.215336394e-05f, +2.094877260e-05f, +5.197054220e-05f, +4.123008952e-05f, +1.313138411e-05f, -7.924851840e-06f, -1.264978081e-05f,\n    -1.056867379e-04f, +5.418008535e-04f, +1.534254489e-03f, +1.665675647e-03f, -3.723026219e-04f, -4.160847059e-03f, -6.607320087e-03f, -3.791786512e-03f, +4.909732185e-03f, +1.406934599e-02f, +1.476082419e-02f, +2.174498461e-03f, -1.767580425e-02f, -2.953292503e-02f, -2.016151009e-02f, +8.697533773e-03f, +3.770668841e-02f, +4.279644587e-02f, +1.514275784e-02f, -2.846664655e-02f, -5.577677149e-02f, -4.380216149e-02f, +1.465078130e-03f, +4.764417696e-02f, +6.029094770e-02f, +2.985625985e-02f, -2.075299912e-02f, -5.425696774e-02f, -4.783252540e-02f, -9.397282114e-03f, +3.076840142e-02f, +4.463900725e-02f, +2.667058725e-02f, -5.408723854e-03f, -2.721308020e-02f, -2.639915676e-02f, -8.959231640e-03f, +9.213115396e-03f, +1.600732567e-02f, +1.057220049e-02f, +5.858326709e-04f, -5.837838467e-03f, -5.978317722e-03f, -2.430535862e-03f, +8.205736066e-04f, +1.815758668e-03f, +1.115732986e-03f, +1.794768119e-04f,\n    -9.678249260e-06f, -2.929562340e-05f, -2.617150928e-05f, +2.435354300e-05f, +9.939300496e-05f, +1.198909969e-04f, +1.341528578e-05f, -1.885762046e-04f, -3.220701710e-04f, -2.032597318e-04f, +1.780151924e-04f, +5.656252499e-04f, +5.888492894e-04f, +9.035740848e-05f, -6.474720252e-04f, -1.037269751e-03f, -6.503818960e-04f, +3.551824120e-04f, +1.254130937e-03f, +1.288407306e-03f, +3.156100896e-04f, -9.934120415e-04f, -1.634479434e-03f, -1.072971079e-03f, +2.968395419e-04f, +1.442055892e-03f, +1.507958646e-03f, +4.873387349e-04f, -8.048918298e-04f, -1.407310159e-03f, -9.581268104e-04f, +8.986788047e-05f, +9.068696886e-04f, +9.582636675e-04f, +3.541245312e-04f, -3.480455019e-04f, -6.421795125e-04f, -4.321031721e-04f, -2.396506984e-06f, +2.885689603e-04f, +2.896822997e-04f, +1.031523155e-04f, -7.324008229e-05f, -1.241211704e-04f, -7.014473331e-05f, +1.898155368e-06f, +3.239008541e-05f, +2.207785664e-05f,\n    /*  4,26 (48) */\n    -1.399954926e-04f, -5.209029234e-04f, -7.933340555e-04f, -4.544815265e-04f, +7.582929545e-04f, +2.383382579e-03f, +3.175413642e-03f, +1.784652763e-03f, -2.053152338e-03f, -6.633383411e-03f, -8.643930480e-03f, -5.067301772e-03f, +4.237567489e-03f, +1.504221061e-02f, +1.995753143e-02f, +1.251414965e-02f, -7.751907450e-03f, -3.237595922e-02f, -4.582219842e-02f, -3.228637731e-02f, +1.549398355e-02f, +9.018750292e-02f, +1.705132098e-01f, +2.291920925e-01f, +2.447552903e-01f, +2.113496723e-01f, +1.414623692e-01f, +6.013237521e-02f, -6.318378323e-03f, -4.126507130e-02f, -4.318948924e-02f, -2.352264984e-02f, +1.011993314e-03f, +1.696529630e-02f, +1.929579347e-02f, +1.125092225e-02f, +2.492352145e-04f, -7.161694067e-03f, -8.419222618e-03f, -5.019556468e-03f, -3.892286773e-04f, +2.616410104e-03f, +3.072202006e-03f, +1.791901937e-03f, +2.108510936e-04f, -6.814706814e-04f, -7.354042568e-04f, -3.671213681e-04f,\n    +9.397458000e-06f, +1.267196955e-05f, +1.834755230e-06f, -2.390989374e-05f, -4.884335002e-05f, -4.601742064e-05f, +2.735226303e-06f, +8.371341332e-05f, +1.453758241e-04f, +1.233714902e-04f, -1.083680508e-05f, -2.085129681e-04f, -3.464980832e-04f, -2.899864756e-04f, +1.025234248e-05f, +4.461813775e-04f, +7.662312983e-04f, +6.909087043e-04f, +8.099886954e-05f, -9.374756521e-04f, -1.979153161e-03f, -2.556947300e-03f, -2.322223945e-03f, -1.260192979e-03f, +2.731388008e-04f, +1.703221322e-03f, +2.503732601e-03f, +2.437936128e-03f, +1.649237711e-03f, +5.610317500e-04f, -3.492897638e-04f, -7.748150519e-04f, -6.879406509e-04f, -2.945804811e-04f, +1.173231310e-04f, +3.372720680e-04f, +3.149956671e-04f, +1.399681615e-04f, -4.676505722e-05f, -1.434819223e-04f, -1.305872469e-04f, -5.479546913e-05f, +1.920414868e-05f, +5.172165629e-05f, +4.197899425e-05f, +1.399869545e-05f, -7.511085657e-06f, -1.271963515e-05f,\n    -1.153649871e-04f, +5.125052301e-04f, +1.508082980e-03f, +1.690029190e-03f, -2.729096169e-04f, -4.040956062e-03f, -6.593904801e-03f, -3.980362717e-03f, +4.587662014e-03f, +1.386608626e-02f, +1.493883939e-02f, +2.740123711e-03f, -1.708695496e-02f, -2.944256762e-02f, -2.080898211e-02f, +7.660264021e-03f, +3.705630652e-02f, +4.315162828e-02f, +1.639688878e-02f, -2.717823924e-02f, -5.546116140e-02f, -4.479557353e-02f, -1.694013043e-04f, +4.657120588e-02f, +6.058778724e-02f, +3.129831574e-02f, -1.924504047e-02f, -5.376962901e-02f, -4.863741723e-02f, -1.080459227e-02f, +2.981027461e-02f, +4.472887513e-02f, +2.757745693e-02f, -4.450460187e-03f, -2.685895566e-02f, -2.674720226e-02f, -9.601411153e-03f, +8.781012224e-03f, +1.600492917e-02f, +1.086076945e-02f, +8.755149706e-04f, -5.734686152e-03f, -6.051557804e-03f, -2.554657032e-03f, +7.504288733e-04f, +1.817656823e-03f, +1.148123072e-03f, +2.015546685e-04f,\n    -9.064906686e-06f, -2.884217760e-05f, -2.693952258e-05f, +2.211498118e-05f, +9.737769918e-05f, +1.209696434e-04f, +1.872963638e-05f, -1.822061507e-04f, -3.210097061e-04f, -2.115891334e-04f, +1.640848971e-04f, +5.572811128e-04f, +5.962422370e-04f, +1.121686012e-04f, -6.264617115e-04f, -1.035831615e-03f, -6.744386457e-04f, +3.207674749e-04f, +1.236204745e-03f, +1.304078768e-03f, +3.562485408e-04f, -9.577855825e-04f, -1.632127022e-03f, -1.107136239e-03f, +2.515719334e-04f, +1.419920346e-03f, +1.524861610e-03f, +5.288622618e-04f, -7.708833030e-04f, -1.404762002e-03f, -9.852612407e-04f, +5.641373053e-05f, +8.917212832e-04f, +9.687567770e-04f, +3.777973932e-04f, -3.305073988e-04f, -6.413284520e-04f, -4.440387867e-04f, -1.525114812e-05f, +2.838162517e-04f, +2.934846979e-04f, +1.097845518e-04f, -6.940020102e-05f, -1.245060156e-04f, -7.256349920e-05f, +1.264986970e-07f, +3.218755973e-05f, +2.271014949e-05f,\n    /*  4,27 (48) */\n    -1.305980346e-04f, -5.082309539e-04f, -7.914993003e-04f, -4.783914202e-04f, +7.094496045e-04f, +2.337365159e-03f, +3.178148869e-03f, +1.868366177e-03f, -1.907776514e-03f, -6.510011921e-03f, -8.654767285e-03f, -5.275814740e-03f, +3.891069406e-03f, +1.475222413e-02f, +1.996778377e-02f, +1.296033103e-02f, -6.985676151e-03f, -3.168505052e-02f, -4.574119955e-02f, -3.322385297e-02f, +1.351483038e-02f, +8.763055561e-02f, +1.681909859e-01f, +2.279318995e-01f, +2.450284291e-01f, +2.130528937e-01f, +1.439661018e-01f, +6.257031134e-02f, -4.669140612e-03f, -4.070403955e-02f, -4.353877900e-02f, -2.429746489e-02f, +3.240526627e-04f, +1.667071582e-02f, +1.941311660e-02f, +1.158819432e-02f, +5.642308816e-04f, -7.021725906e-03f, -8.465987675e-03f, -5.163038390e-03f, -5.198159242e-04f, +2.561614635e-03f, +3.091406154e-03f, +1.843623593e-03f, +2.528300878e-04f, -6.674719860e-04f, -7.429153425e-04f, -3.798410033e-04f,\n    +9.168948451e-06f, +1.274354164e-05f, +2.434178788e-06f, -2.299301259e-05f, -4.834013806e-05f, -4.676809063e-05f, +5.472731236e-07f, +8.113144611e-05f, +1.444164487e-04f, +1.257792813e-04f, -5.203509853e-06f, -2.024748039e-04f, -3.445441995e-04f, -2.955471640e-04f, -2.183892139e-06f, +4.327665825e-04f, +7.609428930e-04f, +7.012321084e-04f, +1.076524697e-04f, -9.028001885e-04f, -1.951184787e-03f, -2.550090443e-03f, -2.343018643e-03f, -1.303172126e-03f, +2.236206357e-04f, +1.665869356e-03f, +2.491578750e-03f, +2.452591617e-03f, +1.681024634e-03f, +5.945862371e-04f, -3.272670360e-04f, -7.698491488e-04f, -6.967612850e-04f, -3.085938074e-04f, +1.066406684e-04f, +3.342310618e-04f, +3.187096293e-04f, +1.463254020e-04f, -4.196148700e-05f, -1.422283575e-04f, -1.322867935e-04f, -5.744172148e-05f, +1.741551516e-05f, +5.142937682e-05f, +4.271015005e-05f, +1.487372814e-05f, -7.080070146e-06f, -1.277815672e-05f,\n    -1.244298938e-04f, +4.836630525e-04f, +1.481143457e-03f, +1.712144172e-03f, -1.755319177e-04f, -3.919986419e-03f, -6.575175165e-03f, -4.162568867e-03f, +4.266652308e-03f, +1.365449713e-02f, +1.510292428e-02f, +3.297404824e-03f, -1.649071272e-02f, -2.933039902e-02f, -2.143544382e-02f, +6.624432406e-03f, +3.638186787e-02f, +4.347239575e-02f, +1.763309353e-02f, -2.587416048e-02f, -5.510491286e-02f, -4.575335912e-02f, -1.801528327e-03f, +4.546406964e-02f, +6.083935918e-02f, +3.271823609e-02f, -1.772017886e-02f, -5.324076675e-02f, -4.940830054e-02f, -1.220935428e-02f, +2.882501336e-02f, +4.478528886e-02f, +2.846917822e-02f, -3.481703410e-03f, -2.648115827e-02f, -2.707770966e-02f, -1.024273960e-02f, +8.336973437e-03f, +1.598967802e-02f, +1.114458570e-02f, +1.168999668e-03f, -5.624901600e-03f, -6.120958005e-03f, -2.679163048e-03f, +6.778653741e-04f, +1.817783322e-03f, +1.180310631e-03f, +2.242648180e-04f,\n    -8.460514288e-06f, -2.836758865e-05f, -2.765734466e-05f, +1.990756350e-05f, +9.531218521e-05f, +1.219164262e-04f, +2.393493880e-05f, -1.757786675e-04f, -3.196921023e-04f, -2.196337826e-04f, +1.501841507e-04f, +5.485735572e-04f, +6.030844187e-04f, +1.337012165e-04f, -6.051182020e-04f, -1.033588332e-03f, -6.978229305e-04f, +2.862808627e-04f, +1.217396724e-03f, +1.318683292e-03f, +3.964960053e-04f, -9.214941434e-04f, -1.628518790e-03f, -1.140426844e-03f, +2.061045701e-04f, +1.396669752e-03f, +1.540613279e-03f, +5.700740732e-04f, -7.361705945e-04f, -1.401110338e-03f, -1.011752738e-03f, +2.273152976e-05f, +8.757732603e-04f, +9.785563028e-04f, +4.013603659e-04f, -3.125433452e-04f, -6.399462117e-04f, -4.557418356e-04f, -2.825187413e-05f, +2.787575706e-04f, +2.970897857e-04f, +1.164291964e-04f, -6.542647888e-05f, -1.247804426e-04f, -7.496484133e-05f, -1.690552013e-06f, +3.194173417e-05f, +2.333362236e-05f,\n    /*  4,28 (48) */\n    -1.214290861e-04f, -4.954874122e-04f, -7.890651215e-04f, -5.013844328e-04f, +6.611094664e-04f, +2.290597068e-03f, +3.178696142e-03f, +1.949497623e-03f, -1.763360065e-03f, -6.384232639e-03f, -8.659970795e-03f, -5.478289544e-03f, +3.546525207e-03f, +1.445667697e-02f, +1.996559988e-02f, +1.339309761e-02f, -6.224733259e-03f, -3.098381841e-02f, -4.563354708e-02f, -3.412665315e-02f, +1.156364560e-02f, +8.508046517e-02f, +1.658479672e-01f, +2.266287274e-01f, +2.452520498e-01f, +2.147187630e-01f, +1.464576805e-01f, +6.502290296e-02f, -2.988115978e-03f, -4.010945331e-02f, -4.386604604e-02f, -2.506731404e-02f, -3.727086224e-04f, +1.636212202e-02f, +1.951975726e-02f, +1.192242538e-02f, +8.829405108e-04f, -6.875400504e-03f, -8.507949162e-03f, -5.305266748e-03f, -6.521027177e-04f, +2.504172913e-03f, +3.108821669e-03f, +1.895052970e-03f, +2.955402379e-04f, -6.525982578e-04f, -7.499954126e-04f, -3.926191600e-04f,\n    +8.936712204e-06f, +1.280083156e-05f, +3.017351572e-06f, -2.207718797e-05f, -4.781004476e-05f, -4.747135652e-05f, -1.604718976e-06f, +7.853403820e-05f, +1.433742428e-04f, +1.280706340e-04f, +3.581872455e-07f, -1.963843605e-04f, -3.423967670e-04f, -3.008555334e-04f, -1.446878429e-05f, +4.192508715e-04f, +7.552642627e-04f, +7.110112536e-04f, +1.338758426e-04f, -8.681716366e-04f, -1.922766365e-03f, -2.542417848e-03f, -2.362967526e-03f, -1.345655982e-03f, +1.740164482e-04f, +1.627890458e-03f, +2.478547275e-03f, +2.466506952e-03f, +1.712499040e-03f, +6.283162183e-04f, -3.047517951e-04f, -7.643591248e-04f, -7.052670211e-04f, -3.225875851e-04f, +9.576076956e-05f, +3.309403096e-04f, +3.222659344e-04f, +1.526707137e-04f, -3.706460373e-05f, -1.408612929e-04f, -1.339214410e-04f, -6.009027664e-05f, +1.558348651e-05f, +5.109317649e-05f, +4.342263601e-05f, +1.575588796e-05f, -6.631829657e-06f, -1.282502326e-05f,\n    -1.328904081e-04f, +4.552954639e-04f, +1.453486113e-03f, +1.732051735e-03f, -8.021973253e-05f, -3.798069993e-03f, -6.551240226e-03f, -4.338347535e-03f, +3.946960206e-03f, +1.343486335e-02f, +1.525310843e-02f, +3.845978381e-03f, -1.588762831e-02f, -2.919669781e-02f, -2.204056203e-02f, +5.590844074e-03f, +3.568404494e-02f, +4.375867662e-02f, +1.885049025e-02f, -2.455547718e-02f, -5.470841685e-02f, -4.667485326e-02f, -3.430047117e-03f, +4.432364280e-02f, +6.104546375e-02f, +3.411490584e-02f, -1.617956558e-02f, -5.267069267e-02f, -5.014447113e-02f, -1.361046461e-02f, +2.781326063e-02f, +4.480802039e-02f, +2.934495148e-02f, -2.503147107e-03f, -2.607979791e-02f, -2.739025301e-02f, -1.088268582e-02f, +7.881231602e-03f, +1.596142614e-02f, +1.142334327e-02f, +1.466089454e-03f, -5.508472404e-03f, -6.186384484e-03f, -2.803943490e-03f, +6.029005328e-04f, +1.816092770e-03f, +1.212252366e-03f, +2.475984404e-04f,\n    -7.865645190e-06f, -2.787300974e-05f, -2.832538384e-05f, +1.773293279e-05f, +9.319952775e-05f, +1.227328237e-04f, +2.902816071e-05f, -1.693004253e-04f, -3.181220543e-04f, -2.273902694e-04f, +1.363244821e-04f, +5.395136800e-04f, +6.093752927e-04f, +1.549398357e-04f, -5.834614779e-04f, -1.030547109e-03f, -7.205197926e-04f, +2.517506783e-04f, +1.197725728e-03f, +1.332212982e-03f, +4.363215056e-04f, -8.845679552e-04f, -1.623659271e-03f, -1.172816986e-03f, +1.604735422e-04f, +1.372321662e-03f, +1.555199324e-03f, +6.109405869e-04f, -7.007793324e-04f, -1.396353923e-03f, -1.037577029e-03f, -1.115266394e-05f, +8.590336898e-04f, +9.876493535e-04f, +4.247930999e-04f, -2.941645902e-04f, -6.380287732e-04f, -4.671998064e-04f, -4.138913951e-05f, +2.733933896e-04f, +3.004914841e-04f, +1.230802996e-04f, -6.132039239e-05f, -1.249420826e-04f, -7.734590613e-05f, -3.552050772e-06f, +3.165178783e-05f, +2.394720634e-05f,\n    /*  4,29 (48) */\n    -1.124923739e-04f, -4.826865807e-04f, -7.860477700e-04f, -5.234616208e-04f, +6.132994217e-04f, +2.243125712e-03f, +3.177091423e-03f, +2.028031661e-03f, -1.619985822e-03f, -6.256162005e-03f, -8.659612608e-03f, -5.674673905e-03f, +3.204128440e-03f, +1.415582144e-02f, +1.995113109e-02f, +1.381234848e-02f, -5.469468996e-03f, -3.027280715e-02f, -4.549967124e-02f, -3.499482479e-02f, +9.640879233e-03f, +8.253804732e-02f, +1.634849997e-01f, +2.252830714e-01f, +2.454260662e-01f, +2.163466535e-01f, +1.489362278e-01f, +6.748940991e-02f, -1.275616938e-03f, -3.948113709e-02f, -4.417079783e-02f, -2.583167317e-02f, -1.077975643e-03f, +1.603953443e-02f, +1.961551803e-02f, +1.225336569e-02f, +1.205206445e-03f, -6.722729790e-03f, -8.545013766e-03f, -5.446128040e-03f, -7.860241587e-04f, +2.444082636e-03f, +3.124405156e-03f, +1.946146147e-03f, +3.389628739e-04f, -6.368423699e-04f, -7.566272423e-04f, -4.054441832e-04f,\n    +8.701086450e-06f, +1.284410222e-05f, +3.584095864e-06f, -2.116315483e-05f, -4.725396625e-05f, -4.812748421e-05f, -3.719755005e-06f, +7.592324930e-05f, +1.422510891e-04f, +1.302455672e-04f, +5.845531987e-06f, -1.902462398e-04f, -3.400594884e-04f, -3.059112374e-04f, -2.659656099e-05f, +4.056435160e-04f, +7.492033100e-04f, +7.202473230e-04f, +1.596609317e-04f, -8.336048491e-04f, -1.893912758e-03f, -2.533936609e-03f, -2.382065486e-03f, -1.387628879e-03f, +1.243453115e-04f, +1.589298153e-03f, +2.464640132e-03f, +2.479672483e-03f, +1.743645304e-03f, +6.622080333e-04f, -2.817498091e-04f, -7.583417174e-04f, -7.134490749e-04f, -3.365530480e-04f, +8.468789089e-05f, +3.273989107e-04f, +3.256603402e-04f, +1.589997563e-04f, -3.207647279e-05f, -1.393801050e-04f, -1.354891037e-04f, -6.273926195e-05f, +1.370871943e-05f, +5.071255403e-05f, +4.411553088e-05f, +1.664456387e-05f, -6.166404737e-06f, -1.285991751e-05f,\n    -1.407560533e-04f, +4.274224541e-04f, +1.425160729e-03f, +1.749784668e-03f, +1.297979522e-05f, -3.675337169e-03f, -6.522212065e-03f, -4.507647960e-03f, +3.628838152e-03f, +1.320747308e-02f, +1.538943292e-02f, +4.385492061e-03f, -1.527825301e-02f, -2.904175797e-02f, -2.262402350e-02f, +4.560296965e-03f, +3.496352515e-02f, +4.401042729e-02f, +2.004821598e-02f, -2.322326420e-02f, -5.427209535e-02f, -4.755942122e-02f, -5.053706387e-03f, +4.315082581e-02f, +6.120593729e-02f, +3.548722750e-02f, -1.462436626e-02f, -5.205975209e-02f, -5.084525046e-02f, -1.500681854e-02f, +2.677568360e-02f, +4.479686773e-02f, +3.020398517e-02f, -1.515497754e-03f, -2.565500481e-02f, -2.768441760e-02f, -1.152071459e-02f, +7.414031795e-03f, +1.592003700e-02f, +1.169673666e-02f, +1.766580938e-03f, -5.385392104e-03f, -6.247704877e-03f, -2.928885573e-03f, +5.255546267e-04f, +1.812540719e-03f, +1.243904153e-03f, +2.715456467e-04f,\n    -7.280845023e-06f, -2.735959138e-05f, -2.894409669e-05f, +1.559266332e-05f, +9.104278358e-05f, +1.234204187e-04f, +3.400642472e-05f, -1.627780462e-04f, -3.163044258e-04f, -2.348554835e-04f, +1.225172574e-04f, +5.301127742e-04f, +6.151147960e-04f, +1.758694164e-04f, -5.615116392e-04f, -1.026715774e-03f, -7.425149321e-04f, +2.172049221e-04f, +1.177211241e-03f, +1.344660851e-03f, +4.756944942e-04f, -8.470377077e-04f, -1.617554017e-03f, -1.204281511e-03f, +1.147150770e-04f, +1.346894540e-03f, +1.568606346e-03f, +6.514284292e-04f, -6.647357780e-04f, -1.390492424e-03f, -1.062710289e-03f, -4.521248951e-05f, +8.415113541e-04f, +9.960235479e-04f, +4.480752018e-04f, -2.753828356e-04f, -6.355725464e-04f, -4.784002737e-04f, -5.465316782e-05f, +2.677244663e-04f, +3.036838206e-04f, +1.297318172e-04f, -5.708357236e-05f, -1.249886400e-04f, -7.970380656e-05f, -5.456981773e-06f, +3.131693383e-05f, +2.454981878e-05f,\n    /*  4,30 (48) */\n    -1.037912875e-04f, -4.698424785e-04f, -7.824636741e-04f, -5.446247756e-04f, +5.660454554e-04f, +2.194998227e-03f, +3.173371668e-03f, +2.103954910e-03f, -1.477734733e-03f, -6.125916438e-03f, -8.653767076e-03f, -5.864920145e-03f, +2.864068951e-03f, +1.384991020e-02f, +1.992453453e-02f, +1.421799200e-02f, -4.720265686e-03f, -2.955255983e-02f, -4.534001030e-02f, -3.582842964e-02f, +7.746966475e-03f, +8.000411071e-02f, +1.611029342e-01f, +2.238954425e-01f, +2.455504115e-01f, +2.179359516e-01f, +1.514008679e-01f, +6.996908239e-02f, +4.680283662e-04f, -3.881892906e-02f, -4.445254764e-02f, -2.659001489e-02f, -1.791424718e-03f, +1.570298138e-02f, +1.970020593e-02f, +1.258076460e-02f, +1.530866785e-03f, -6.563730034e-03f, -8.577090238e-03f, -5.585508145e-03f, -9.215132624e-04f, +2.381343374e-03f, +3.138113875e-03f, +1.996858701e-03f, +3.830784047e-04f, -6.201978060e-04f, -7.627936470e-04f, -4.183041008e-04f,\n    +8.462405133e-06f, +1.287362466e-05f, +4.134251716e-06f, -2.025163384e-05f, -4.667280462e-05f, -4.873677159e-05f, -5.796882022e-06f, +7.330111985e-05f, +1.410489017e-04f, +1.323041793e-04f, +1.125585379e-05f, -1.840650204e-04f, -3.375361450e-04f, -3.107140920e-04f, -3.856160836e-05f, +3.919537410e-04f, +7.427680672e-04f, +7.289417700e-04f, +1.849999595e-04f, -7.991145529e-04f, -1.864638951e-03f, -2.524654162e-03f, -2.400307809e-03f, -1.429075397e-03f, +7.462633087e-05f, +1.550106255e-03f, +2.449859669e-03f, +2.492078858e-03f, +1.774447867e-03f, +6.962478502e-04f, -2.582671380e-04f, -7.517939123e-04f, -7.212987527e-04f, -3.504813501e-04f, +7.342665820e-05f, +3.236061130e-04f, +3.288886600e-04f, +1.653081477e-04f, -2.699924766e-05f, -1.377842419e-04f, -1.369877151e-04f, -6.538677752e-05f, +1.179191290e-05f, +5.028703496e-05f, +4.478791382e-05f, +1.753912827e-05f, -5.683852374e-06f, -1.288252765e-05f,\n    -1.480368983e-04f, +4.000628628e-04f, +1.396216632e-03f, +1.765377331e-03f, +1.040225788e-04f, -3.551916750e-03f, -6.488205641e-03f, -4.670426006e-03f, +3.312533726e-03f, +1.297261759e-02f, +1.551195017e-02f, +4.915604835e-03f, -1.466313822e-02f, -2.886588855e-02f, -2.318553514e-02f, +3.533581191e-03f, +3.422101022e-02f, +4.422763222e-02f, +2.122542722e-02f, -2.187860335e-02f, -5.379640085e-02f, -4.840645892e-02f, -6.671260404e-03f, +4.194654430e-02f, +6.132065237e-02f, +3.683412204e-02f, -1.305575991e-02f, -5.140832366e-02f, -5.150998624e-02f, -1.639731096e-02f, +2.571297331e-02f, +4.475165524e-02f, +3.104549652e-02f, -5.194742057e-04f, -2.520692960e-02f, -2.795980043e-02f, -1.215628714e-02f, +6.935631522e-03f, +1.586538384e-02f, +1.196446112e-02f, +2.070264759e-03f, -5.255660287e-03f, -6.304788449e-03f, -3.053874213e-03f, +4.458508201e-04f, +1.807083737e-03f, +1.275221087e-03f, +2.960954655e-04f,\n    -6.706631824e-06f, -2.682848005e-05f, -2.951398656e-05f, +1.348826031e-05f, +8.884499839e-05f, +1.239808950e-04f, +3.886700897e-05f, -1.562180990e-04f, -3.142442435e-04f, -2.420266134e-04f, +1.087736719e-04f, +5.203823168e-04f, +6.203033410e-04f, +1.964753024e-04f, -5.392888856e-04f, -1.022102766e-03f, -7.637947150e-04f, +1.826714690e-04f, +1.155873363e-03f, +1.356020827e-03f, +5.145848785e-04f, -8.089345225e-04f, -1.610209589e-03f, -1.234796034e-03f, +6.886550882e-05f, +1.320407745e-03f, +1.580821894e-03f, +6.915044642e-04f, -6.280668059e-04f, -1.383526417e-03f, -1.087129161e-03f, -7.942130382e-05f, +8.232157439e-04f, +1.003667029e-03f, +4.711862525e-04f, -2.562102288e-04f, -6.325743770e-04f, -4.893309108e-04f, -6.803395823e-05f, +2.617518459e-04f, +3.066609371e-04f, +1.363776150e-04f, -5.271780462e-05f, -1.249178960e-04f, -8.203562472e-05f, -7.404259204e-06f, +3.093642097e-05f, +2.514036432e-05f,\n    /*  4,31 (48) */\n    -9.532888232e-05f, -4.569688538e-04f, -7.783294224e-04f, -5.648764094e-04f, +5.193726508e-04f, +2.146261456e-03f, +3.167574786e-03f, +2.177256030e-03f, -1.336685832e-03f, -5.993612259e-03f, -8.642511222e-03f, -6.048985165e-03f, +2.526532806e-03f, +1.353919611e-02f, +1.988597292e-02f, +1.460994574e-02f, -3.977497619e-03f, -2.882361806e-02f, -4.515501034e-02f, -3.662754419e-02f, +5.882327524e-03f, +7.747945655e-02f, +1.587026264e-01f, +2.224663671e-01f, +2.456250379e-01f, +2.194860579e-01f, +1.538507276e-01f, +7.246116125e-02f, +2.242476233e-03f, -3.812268121e-02f, -4.471081478e-02f, -2.734180880e-02f, -2.512723471e-03f, +1.535250003e-02f, +1.977363258e-02f, +1.290437072e-02f, +1.859755445e-03f, -6.398421886e-03f, -8.604089486e-03f, -5.723292387e-03f, -1.058500977e-03f, +2.315956597e-03f, +3.149905788e-03f, +2.047145736e-03f, +4.278663186e-04f, -6.026586777e-04f, -7.684774994e-04f, -4.311866284e-04f,\n    +8.220998674e-06f, +1.288967773e-05f, +4.667676794e-06f, -1.934333100e-05f, -4.606746708e-05f, -4.929954776e-05f, -7.835189267e-06f, +7.066966975e-05f, +1.397696245e-04f, +1.342466470e-04f, +1.658656658e-05f, -1.778452548e-04f, -3.348305944e-04f, -3.152640733e-04f, -5.035847333e-05f, +3.781907203e-04f, +7.359666910e-04f, +7.370963161e-04f, +2.098854303e-04f, -7.647153423e-04f, -1.834960044e-03f, -2.514578272e-03f, -2.417690168e-03f, -1.469980364e-03f, +2.487863475e-05f, +1.510328867e-03f, +2.434208634e-03f, +2.503717032e-03f, +1.804891247e-03f, +7.304216719e-04f, -2.343101320e-04f, -7.447129475e-04f, -7.288074567e-04f, -3.643635712e-04f, +6.198186541e-05f, +3.195613163e-04f, +3.319467664e-04f, +1.715914665e-04f, -2.183516949e-05f, -1.360732244e-04f, -1.384152296e-04f, -6.803089721e-05f, +9.833808267e-06f, +4.981617239e-05f, +4.543886514e-05f, +1.843893728e-05f, -5.184246216e-06f, -1.289254766e-05f,\n    -1.547435301e-04f, +3.732343827e-04f, +1.366702646e-03f, +1.778865592e-03f, +1.928675772e-04f, -3.427935855e-03f, -6.449338632e-03f, -4.826644105e-03f, +2.998289482e-03f, +1.273059098e-02f, +1.562072385e-02f, +5.435987152e-03f, -1.404283488e-02f, -2.866941325e-02f, -2.372482403e-02f, +2.511478425e-03f, +3.345721550e-02f, +4.441030368e-02f, +2.238130058e-02f, -2.052258252e-02f, -5.328181598e-02f, -4.921539345e-02f, -8.281469993e-03f, +4.071174827e-02f, +6.138951788e-02f, +3.815452979e-02f, -1.147493802e-02f, -5.071681919e-02f, -5.213805305e-02f, -1.778083738e-02f, +2.462584415e-02f, +4.467223393e-02f, +3.186871227e-02f, +4.841928232e-04f, -2.473574335e-02f, -2.821601066e-02f, -1.278886151e-02f, +6.446300611e-03f, +1.579734988e-02f, +1.222621297e-02f, +2.376925696e-03f, -5.119282672e-03f, -6.357506254e-03f, -3.178792109e-03f, +3.638151954e-04f, +1.799679478e-03f, +1.306157508e-03f, +3.212358298e-04f,\n    -6.143495962e-06f, -2.628081681e-05f, -3.003560201e-05f, +1.142115956e-05f, +8.660920381e-05f, +1.244160341e-04f, +4.360734750e-05f, -1.496270931e-04f, -3.119466899e-04f, -2.489011455e-04f, +9.510474086e-05f, +5.103339566e-04f, +6.249418104e-04f, +2.167432336e-04f, -5.168134989e-04f, -1.016717124e-03f, -7.843461819e-04f, +1.481780446e-04f, +1.133732786e-03f, +1.366287754e-03f, +5.529630450e-04f, -7.702899258e-04f, -1.601633554e-03f, -1.264336964e-03f, +2.296124824e-05f, +1.292881518e-03f, +1.591834473e-03f, +7.311358218e-04f, -5.907998826e-04f, -1.375457392e-03f, -1.110810779e-03f, -1.137522031e-04f, +8.041570547e-04f, +1.010568477e-03f, +4.941058242e-04f, -2.366593558e-04f, -6.290315529e-04f, -4.999795024e-04f, -8.152129225e-05f, +2.554768633e-04f, +3.094170965e-04f, +1.430114735e-04f, -4.822503056e-05f, -1.247277122e-04f, -8.433841439e-05f, -9.392727151e-06f, +3.050953535e-05f, +2.571773609e-05f,\n    /*  5, 0 (48) */\n    -9.712561017e-05f, +5.630052980e-04f, +1.206067011e-03f, +7.527819647e-04f, -1.206557913e-03f, -3.245991688e-03f, -2.728345499e-03f, +1.489426586e-03f, +6.622324221e-03f, +7.089903931e-03f, -2.805093114e-04f, -1.122619085e-02f, -1.522873798e-02f, -4.406023078e-03f, +1.648289776e-02f, +2.943133839e-02f, +1.647195998e-02f, -2.143009154e-02f, -5.654855430e-02f, -4.868148545e-02f, +2.497919491e-02f, +1.464018327e-01f, +2.604437981e-01f, +3.070623956e-01f, +2.604437981e-01f, +1.464018327e-01f, +2.497919491e-02f, -4.868148545e-02f, -5.654855430e-02f, -2.143009154e-02f, +1.647195998e-02f, +2.943133839e-02f, +1.648289776e-02f, -4.406023078e-03f, -1.522873798e-02f, -1.122619085e-02f, -2.805093114e-04f, +7.089903931e-03f, +6.622324221e-03f, +1.489426586e-03f, -2.728345499e-03f, -3.245991688e-03f, -1.206557913e-03f, +7.527819647e-04f, +1.206067011e-03f, +5.630052980e-04f, -9.712561017e-05f, -2.479949097e-04f,\n    -1.282518843e-05f, -2.532528913e-05f, -9.046210131e-06f, +3.889954925e-05f, +7.491153978e-05f, +3.839122229e-05f, -7.498057630e-05f, -1.710018670e-04f, -1.194036389e-04f, +1.033564617e-04f, +3.283880359e-04f, +2.970847865e-04f, -8.290196051e-05f, -5.560876896e-04f, -6.462049060e-04f, -7.534959806e-05f, +8.584651506e-04f, +1.345120911e-03f, +6.450357199e-04f, -1.214091364e-03f, -3.234852854e-03f, -4.026043107e-03f, -2.803210385e-03f, -4.783988299e-05f, +2.734317328e-03f, +4.019323722e-03f, +3.284868198e-03f, +1.281996999e-03f, -6.015724119e-04f, -1.343618217e-03f, -8.852743607e-04f, +4.837949091e-05f, +6.385264040e-04f, +5.671719722e-04f, +9.852083963e-05f, -2.901112160e-04f, -3.324887018e-04f, -1.116913074e-04f, +1.146544985e-04f, +1.721770654e-04f, +7.895742338e-05f, -3.577215824e-05f, -7.511648637e-05f, -4.054173673e-05f, +7.922171439e-06f, +2.536792522e-05f, +1.339113908e-05f, -2.077502712e-06f,\n    +5.939400487e-04f, -2.971519080e-04f, -2.102283883e-03f, -2.360885377e-03f, +1.198769271e-03f, +6.225411832e-03f, +5.885033052e-03f, -3.266913899e-03f, -1.360369760e-02f, -1.128997664e-02f, +6.959510654e-03f, +2.424665836e-02f, +1.796260386e-02f, -1.233743150e-02f, -3.690527276e-02f, -2.458115068e-02f, +1.881243249e-02f, +4.916511396e-02f, +2.951026661e-02f, -2.514630357e-02f, -5.812289420e-02f, -3.141212080e-02f, +2.978290985e-02f, +6.141247912e-02f, +2.978290985e-02f, -3.141212080e-02f, -5.812289420e-02f, -2.514630357e-02f, +2.951026661e-02f, +4.916511396e-02f, +1.881243249e-02f, -2.458115068e-02f, -3.690527276e-02f, -1.233743150e-02f, +1.796260386e-02f, +2.424665836e-02f, +6.959510654e-03f, -1.128997664e-02f, -1.360369760e-02f, -3.266913899e-03f, +5.885033052e-03f, +6.225411832e-03f, +1.198769271e-03f, -2.360885377e-03f, -2.102283883e-03f, -2.971519080e-04f, +5.939400487e-04f, +3.757269824e-04f,\n    +5.619091256e-06f, +4.877898058e-05f, +5.001166561e-05f, -4.580540148e-05f, -1.616706026e-04f, -1.138544649e-04f, +1.507196706e-04f, +3.732587375e-04f, +1.958668817e-04f, -3.489190265e-04f, -6.864866184e-04f, -2.710473447e-04f, +6.463035710e-04f, +1.064299823e-03f, +3.066330440e-04f, -1.011454792e-03f, -1.432111537e-03f, -2.770896161e-04f, +1.375500241e-03f, +1.699573653e-03f, +1.785591216e-04f, -1.650720551e-03f, -1.793723894e-03f, -3.412141537e-05f, +1.761957904e-03f, +1.688158924e-03f, -1.142151055e-04f, -1.676686855e-03f, -1.413748698e-03f, +2.233016724e-04f, +1.418809249e-03f, +1.045542951e-03f, -2.671187145e-04f, -1.058968687e-03f, -6.727082646e-04f, +2.459798275e-04f, +6.862098894e-04f, +3.664436410e-04f, -1.825774125e-04f, -3.750921654e-04f, -1.603876878e-04f, +1.083483004e-04f, +1.635764684e-04f, +4.996526961e-05f, -4.852002281e-05f, -4.990376237e-05f, -6.801361925e-06f, +1.364337518e-05f,\n    /*  5, 1 (48) */\n    -1.099507986e-04f, +5.376800088e-04f, +1.197020801e-03f, +7.916815140e-04f, -1.131646373e-03f, -3.207600465e-03f, -2.803326075e-03f, +1.318424719e-03f, +6.502920583e-03f, +7.193260392e-03f, +4.787872449e-05f, -1.092910607e-02f, -1.531163994e-02f, -4.962110768e-03f, +1.583669286e-02f, +2.935598879e-02f, +1.733042513e-02f, -2.008497063e-02f, -5.590351858e-02f, -4.989557681e-02f, +2.174434206e-02f, +1.423757896e-01f, +2.576405877e-01f, +3.070145557e-01f, +2.631781154e-01f, +1.504211564e-01f, +2.826406311e-02f, -4.739948845e-02f, -5.715012672e-02f, -2.277370976e-02f, +1.558668562e-02f, +2.947971788e-02f, +1.712142417e-02f, -3.838851106e-03f, -1.513021714e-02f, -1.151630207e-02f, -6.129980132e-04f, +6.978212623e-03f, +6.736978720e-03f, +1.661603651e-03f, -2.649388075e-03f, -3.281763846e-03f, -1.281674399e-03f, +7.122402280e-04f, +1.213989182e-03f, +5.883732232e-04f, -8.373447109e-05f, -2.500724124e-04f,\n    -1.225783667e-05f, -2.525256859e-05f, -1.013486907e-05f, +3.724771090e-05f, +7.463086104e-05f, +4.092589172e-05f, -7.099083746e-05f, -1.696732221e-04f, -1.239676040e-04f, +9.503320589e-05f, +3.240227631e-04f, +3.036857170e-04f, -6.739588425e-05f, -5.446129107e-04f, -6.531856788e-04f, -1.019169912e-04f, +8.312152161e-04f, +1.345396299e-03f, +6.872785669e-04f, -1.146381061e-03f, -3.183583322e-03f, -4.030681563e-03f, -2.870514001e-03f, -1.434918397e-04f, +2.663871431e-03f, +4.010517398e-03f, +3.333588684e-03f, +1.350054072e-03f, -5.569062743e-04f, -1.340873323e-03f, -9.116132390e-04f, +2.102664783e-05f, +6.301490248e-04f, +5.778504940e-04f, +1.142387896e-04f, -2.827671959e-04f, -3.363172964e-04f, -1.200295256e-04f, +1.097224341e-04f, +1.731953418e-04f, +8.291697915e-05f, -3.307012695e-05f, -7.524412339e-05f, -4.217219376e-05f, +6.763373530e-06f, +2.537973484e-05f, +1.395485539e-05f, -1.755773309e-06f,\n    +5.995591399e-04f, -2.483729274e-04f, -2.052272217e-03f, -2.406690779e-03f, +1.037098668e-03f, +6.111557367e-03f, +6.035752723e-03f, -2.893655162e-03f, -1.340783072e-02f, -1.163889566e-02f, +6.273024036e-03f, +2.397561102e-02f, +1.860890744e-02f, -1.127313167e-02f, -3.659863972e-02f, -2.559260547e-02f, +1.738032095e-02f, +4.888802435e-02f, +3.088576685e-02f, -2.344672992e-02f, -5.794433508e-02f, -3.306284135e-02f, +2.798918595e-02f, +6.137835771e-02f, +3.154486775e-02f, -2.972396188e-02f, -5.823710931e-02f, -2.682299043e-02f, +2.809651791e-02f, +4.938841564e-02f, +2.023124174e-02f, -2.353560773e-02f, -3.717239147e-02f, -1.339640018e-02f, +1.728989560e-02f, +2.449263819e-02f, +7.645720544e-03f, -1.092353299e-02f, -1.378627501e-02f, -3.642006065e-03f, +5.724645364e-03f, +6.333760132e-03f, +1.362345739e-03f, -2.310920108e-03f, -2.150803906e-03f, -3.470556704e-04f, +5.871386867e-04f, +3.893703576e-04f,\n    +4.466594439e-06f, +4.761327908e-05f, +5.139596134e-05f, -4.167685723e-05f, -1.595939104e-04f, -1.191183543e-04f, +1.410228537e-04f, +3.709989590e-04f, +2.087436413e-04f, -3.311930698e-04f, -6.859527169e-04f, -2.955495186e-04f, +6.193841835e-04f, +1.068359147e-03f, +3.455152596e-04f, -9.764189553e-04f, -1.443705745e-03f, -3.303161911e-04f, +1.335830847e-03f, +1.720460254e-03f, +2.425559345e-04f, -1.611465173e-03f, -1.823431103e-03f, -1.023247407e-04f, +1.728168432e-03f, +1.723734218e-03f, -4.959784783e-05f, -1.651820586e-03f, -1.450526321e-03f, +1.690127679e-04f, +1.403805461e-03f, +1.078637439e-03f, -2.270146915e-04f, -1.052362092e-03f, -6.985620449e-04f, +2.203717640e-04f, +6.851140893e-04f, +3.837428672e-04f, -1.688864313e-04f, -3.764907428e-04f, -1.700139223e-04f, +1.026029163e-04f, +1.653056012e-04f, +5.415123641e-05f, -4.692069522e-05f, -5.098474714e-05f, -8.012240443e-06f, +1.355093038e-05f,\n    /*  5, 2 (48) */\n    -1.222086353e-04f, +5.124274402e-04f, +1.186885931e-03f, +8.289292249e-04f, -1.057015512e-03f, -3.166674574e-03f, -2.874316912e-03f, +1.148751496e-03f, +6.378952979e-03f, +7.288293598e-03f, +3.719014876e-04f, -1.062542035e-02f, -1.537903583e-02f, -5.506723678e-03f, +1.518350718e-02f, +2.925407180e-02f, +1.816164035e-02f, -1.873957433e-02f, -5.521624002e-02f, -5.104195788e-02f, +1.856075873e-02f, +1.383451080e-01f, +2.547700737e-01f, +3.068710639e-01f, +2.658419868e-01f, +1.544316738e-01f, +3.159765179e-02f, -4.604943438e-02f, -5.770703299e-02f, -2.411458308e-02f, +1.467507238e-02f, +2.950074453e-02f, +1.775157319e-02f, -3.261000612e-03f, -1.501597835e-02f, -1.179906927e-02f, -9.493153096e-04f, +6.858183098e-03f, +6.846701154e-03f, +1.834798993e-03f, -2.566471096e-03f, -3.314833973e-03f, -1.356918523e-03f, +6.700680342e-04f, +1.220752556e-03f, +6.137529580e-04f, -6.977961571e-05f, -2.518281858e-04f,\n    -1.168990126e-05f, -2.515052909e-05f, -1.118758209e-05f, +3.558827568e-05f, +7.427608600e-05f, +4.337485293e-05f, -6.699255526e-05f, -1.681947169e-04f, -1.283443613e-04f, +8.672964061e-05f, +3.194005173e-04f, +3.099122062e-04f, -5.201607505e-05f, -5.327630927e-04f, -6.594704999e-04f, -1.280622791e-04f, +8.035542069e-04f, +1.344460098e-03f, +7.282843910e-04f, -1.078909526e-03f, -3.131100912e-03f, -4.033246478e-03f, -2.936192693e-03f, -2.390603885e-04f, +2.591910390e-03f, +3.999619503e-03f, +3.380974317e-03f, +1.418218264e-03f, -5.110560018e-04f, -1.336872173e-03f, -9.374522451e-04f, -6.688377871e-06f, +6.210722581e-04f, +5.881082002e-04f, +1.300418210e-04f, -2.750553076e-04f, -3.398665344e-04f, -1.283627894e-04f, +1.046099163e-04f, +1.740533367e-04f, +8.685479693e-05f, -3.028666972e-05f, -7.529293449e-05f, -4.378881732e-05f, +5.570491509e-06f, +2.536000083e-05f, +1.451548917e-05f, -1.420241427e-06f,\n    +6.040257344e-04f, -2.007596483e-04f, -2.000876256e-03f, -2.448367636e-03f, +8.775047576e-04f, +5.992439012e-03f, +6.176775576e-03f, -2.522656203e-03f, -1.319908707e-02f, -1.197008873e-02f, +5.587071319e-03f, +2.368006150e-02f, +1.922829162e-02f, -1.020477253e-02f, -3.625312446e-02f, -2.656902443e-02f, +1.593661521e-02f, +4.855770816e-02f, +3.222159770e-02f, -2.172626967e-02f, -5.770177914e-02f, -3.467430652e-02f, +2.616575485e-02f, +6.127603297e-02f, +3.327303618e-02f, -2.800022766e-02f, -5.828670715e-02f, -2.847481101e-02f, +2.664599159e-02f, +4.955742841e-02f, +2.163504720e-02f, -2.245697029e-02f, -3.739940617e-02f, -1.444876228e-02f, +1.659133356e-02f, +2.471300995e-02f, +8.330834633e-03f, -1.053979013e-02f, -1.395516144e-02f, -4.018496808e-03f, +5.554631442e-03f, +6.436363048e-03f, +1.527651340e-03f, -2.256768871e-03f, -2.197724601e-03f, -3.980404175e-04f, +5.791264463e-04f, +4.029212880e-04f,\n    +3.344956610e-06f, +4.640953171e-05f, +5.267340081e-05f, -3.758471417e-05f, -1.573524280e-04f, -1.241372887e-04f, +1.313100623e-04f, +3.683217620e-04f, +2.211971578e-04f, -3.132897930e-04f, -6.846175414e-04f, -3.194624803e-04f, +5.919866399e-04f, +1.071151816e-03f, +3.837239896e-04f, -9.404822960e-04f, -1.453587369e-03f, -3.829219223e-04f, +1.294791911e-03f, +1.739328359e-03f, +3.061321530e-04f, -1.570440944e-03f, -1.851046690e-03f, -1.704095971e-04f, +1.692393190e-03f, +1.757402499e-03f, +1.521820702e-05f, -1.624997983e-03f, -1.485784786e-03f, +1.142841741e-04f, +1.387108823e-03f, +1.110693183e-03f, -1.863643975e-04f, -1.044477917e-03f, -7.238290583e-04f, +1.942488568e-04f, +6.831917134e-04f, +4.007926665e-04f, -1.548057940e-04f, -3.774464191e-04f, -1.795852487e-04f, +9.662174551e-05f, +1.668522344e-04f, +5.835793373e-05f, -4.521350195e-05f, -5.201905875e-05f, -9.250480050e-06f, +1.342746520e-05f,\n    /*  5, 3 (48) */\n    -1.338985365e-04f, +4.872769112e-04f, +1.175698349e-03f, +8.645175005e-04f, -9.827394263e-04f, -3.123299721e-03f, -2.941309468e-03f, +9.805567796e-04f, +6.250608617e-03f, +7.375023239e-03f, +6.913020049e-04f, -1.031550814e-02f, -1.543105190e-02f, -6.039486771e-03f, +1.452403668e-02f, +2.912600952e-02f, +1.896519456e-02f, -1.739511424e-02f, -5.448795563e-02f, -5.212086740e-02f, +1.542965782e-02f, +1.343118615e-01f, +2.518338810e-01f, +3.066320035e-01f, +2.684338972e-01f, +1.584312933e-01f, +3.497862611e-02f, -4.463121611e-02f, -5.821808899e-02f, -2.545145526e-02f, +1.373762014e-02f, +2.949405615e-02f, +1.837264545e-02f, -2.672892411e-03f, -1.488593653e-02f, -1.207412457e-02f, -1.289181844e-03f, +6.729820308e-03f, +6.951311070e-03f, +2.008852329e-03f, -2.479616299e-03f, -3.345120643e-03f, -1.432211457e-03f, +6.262792169e-04f, +1.226323047e-03f, +6.391129589e-04f, -5.526412654e-05f, -2.532484272e-04f,\n    -1.112218308e-05f, -2.501995817e-05f, -1.220383718e-05f, +3.392327012e-05f, +7.384890615e-05f, +4.573690588e-05f, -6.299002298e-05f, -1.665700430e-04f, -1.325320967e-04f, +7.845374324e-05f, +3.145290927e-04f, +3.157628388e-04f, -3.677571941e-05f, -5.205538694e-04f, -6.650617683e-04f, -1.537666687e-04f, +7.755117888e-04f, +1.342328824e-03f, +7.680377050e-04f, -1.011719708e-03f, -3.077447539e-03f, -4.033746599e-03f, -3.000212120e-03f, -3.344899904e-04f, +2.518472968e-03f, +3.986626796e-03f, +3.426985803e-03f, +1.486444859e-03f, -4.640413452e-04f, -1.331601571e-03f, -9.627619319e-04f, -3.474447002e-05f, +6.112962379e-04f, +5.979302622e-04f, +1.459156977e-04f, -2.669785256e-04f, -3.431293195e-04f, -1.366826693e-04f, +9.931963539e-05f, +1.747478114e-04f, +9.076638712e-05f, -2.742344173e-05f, -7.526146721e-05f, -4.538948299e-05f, +4.344255180e-06f, +2.530803227e-05f, +1.507217817e-05f, -1.071067014e-06f,\n    +6.073706910e-04f, -1.543501166e-04f, -1.948202855e-03f, -2.485952350e-03f, +7.201523296e-04f, +5.868301724e-03f, +6.308085639e-03f, -2.154334441e-03f, -1.297788992e-02f, -1.228337852e-02f, +4.902453778e-03f, +2.336059902e-02f, +1.982027826e-02f, -9.133620712e-03f, -3.586940047e-02f, -2.750950673e-02f, +1.448302784e-02f, +4.817478624e-02f, +3.351638961e-02f, -1.998694131e-02f, -5.739564699e-02f, -3.624474747e-02f, +2.431470816e-02f, +6.110562337e-02f, +3.496542937e-02f, -2.624282516e-02f, -5.827148895e-02f, -3.009980900e-02f, +2.516020681e-02f, +4.967171258e-02f, +2.302215602e-02f, -2.134627711e-02f, -3.758577056e-02f, -1.549324019e-02f, +1.586750450e-02f, +2.490725881e-02f, +9.014026346e-03f, -1.013899746e-02f, -1.410996723e-02f, -4.395943227e-03f, +5.375046193e-03f, +6.532984794e-03f, +1.694503575e-03f, -2.198410938e-03f, -2.242938103e-03f, -4.500594762e-04f, +5.698759662e-04f, +4.163487532e-04f,\n    +2.255182080e-06f, +4.517060431e-05f, +5.384462416e-05f, -3.353389702e-05f, -1.549523100e-04f, -1.289089615e-04f, +1.215939488e-04f, +3.652364931e-04f, +2.332175677e-04f, -2.952331641e-04f, -6.824913432e-04f, -3.427633103e-04f, +5.641477479e-04f, +1.072684480e-03f, +4.212189541e-04f, -9.036924671e-04f, -1.461753968e-03f, -4.348483358e-04f, +1.252436269e-03f, +1.756162112e-03f, +3.692150440e-04f, -1.527698035e-03f, -1.876540307e-03f, -2.382971639e-04f, +1.654672260e-03f, +1.789122022e-03f, +8.015822091e-05f, -1.596244569e-03f, -1.519477402e-03f, +5.917795491e-05f, +1.368730061e-03f, +1.141666093e-03f, -1.452122113e-04f, -1.035315582e-03f, -7.484738657e-04f, +1.676376893e-04f, +6.804362127e-04f, +4.175690386e-04f, -1.403480063e-04f, -3.779516098e-04f, -1.890884151e-04f, +9.040859955e-05f, +1.682107523e-04f, +6.257985583e-05f, -4.339842234e-05f, -5.300382693e-05f, -1.051475348e-05f, +1.327219129e-05f,\n    /*  5, 4 (48) */\n    -1.450207196e-04f, +4.622569530e-04f, +1.163494512e-03f, +8.984407707e-04f, -9.088905201e-04f, -3.077562815e-03f, -3.004299491e-03f, +8.139867365e-04f, +6.118076521e-03f, +7.453476982e-03f, +1.005831098e-03f, -9.999745306e-03f, -1.546782762e-02f, -6.560040640e-03f, +1.385897491e-02f, +2.897224286e-02f, +1.974070635e-02f, -1.605278541e-02f, -5.371991792e-02f, -5.313258711e-02f, +1.235221028e-02f, +1.302781149e-01f, +2.488336689e-01f, +3.062975135e-01f, +2.709523702e-01f, +1.624179201e-01f, +3.840561191e-02f, -4.314477126e-02f, -5.868213034e-02f, -2.678305683e-02f, +1.277485821e-02f, +2.945931168e-02f, +1.898394169e-02f, -2.074962149e-03f, -1.474002084e-02f, -1.234110310e-02f, -1.632311164e-03f, +6.593137639e-03f, +7.050630706e-03f, +2.183600141e-03f, -2.388849912e-03f, -3.372544084e-03f, -1.507472925e-03f, +5.808897339e-04f, +1.230667302e-03f, +6.644209911e-04f, -4.019194836e-05f, -2.543194942e-04f,\n    -1.055546563e-05f, -2.486166402e-05f, -1.318317613e-05f, +3.225469128e-05f, +7.335106579e-05f, +4.801096373e-05f, -5.898747491e-05f, -1.648029922e-04f, -1.365292130e-04f, +7.021336113e-05f, +3.094164336e-04f, +3.212365825e-04f, -2.168771654e-05f, -5.080010344e-04f, -6.699624954e-04f, -1.790119753e-04f, +7.471176191e-04f, +1.339019774e-03f, +8.065241007e-04f, -9.448540396e-04f, -3.022665690e-03f, -4.032192029e-03f, -3.062539108e-03f, -4.297252058e-04f, +2.443598970e-03f, +3.971537433e-03f, +3.471584587e-03f, +1.554688781e-03f, -4.158831038e-04f, -1.325049194e-03f, -9.875129711e-04f, -6.311996246e-05f, +6.008217499e-04f, +6.073020941e-04f, +1.618459476e-04f, -2.585402193e-04f, -3.460987533e-04f, -1.449806409e-04f, +9.385450125e-05f, +1.752756536e-04f, +9.464722144e-05f, -2.448221192e-05f, -7.514833557e-05f, -4.697204714e-05f, +3.085449097e-06f, +2.522316587e-05f, +1.562404701e-05f, -7.084341628e-07f,\n    +6.096258730e-04f, -1.091795123e-04f, -1.894358231e-03f, -2.519486247e-03f, +5.652000196e-04f, +5.739392762e-03f, +6.429679587e-03f, -1.789097948e-03f, -1.274467235e-02f, -1.257861169e-02f, +4.219962434e-03f, +2.301783571e-02f, +2.038442601e-02f, -8.060936232e-03f, -3.544818151e-02f, -2.841319919e-02f, +1.302127387e-02f, +4.773993790e-02f, +3.476882588e-02f, -1.823077919e-02f, -5.702643195e-02f, -3.777244550e-02f, +2.243816785e-02f, +6.086732621e-02f, +3.662010163e-02f, -2.445370314e-02f, -5.819133072e-02f, -3.169605357e-02f, +2.364072940e-02f, +4.973089053e-02f, +2.439088608e-02f, -2.020461102e-02f, -3.773098278e-02f, -1.652855578e-02f, +1.511903063e-02f, +2.507489650e-02f, +9.694462559e-03f, -9.721428422e-03f, -1.425031524e-02f, -4.773894837e-03f, +5.185957778e-03f, +6.623393393e-03f, +1.862714327e-03f, -2.135831082e-03f, -2.286336525e-03f, -5.030633032e-04f, +5.593612128e-04f, +4.296209445e-04f,\n    +1.198194503e-06f, +4.389935025e-05f, +5.491041683e-05f, -2.952917350e-05f, -1.523998194e-04f, -1.334314370e-04f, +1.118869784e-04f, +3.617528960e-04f, +2.447956822e-04f, -2.770470667e-04f, -6.795852465e-04f, -3.654300590e-04f, +5.359045371e-04f, +1.072965264e-03f, +4.579610073e-04f, -8.660978565e-04f, -1.468205161e-03f, -4.860380252e-04f, +1.208818120e-03f, +1.770948110e-03f, +4.317326185e-04f, -1.483288570e-03f, -1.899884136e-03f, -3.059088574e-04f, +1.615048053e-03f, +1.818853291e-03f, +1.451470514e-04f, -1.565588232e-03f, -1.551559172e-03f, +3.756894563e-06f, +1.348681970e-03f, +1.171513123e-03f, -1.036034182e-04f, -1.024876061e-03f, -7.724614896e-04f, +1.405657006e-04f, +6.768420109e-04f, +4.340480528e-04f, -1.255262157e-04f, -3.779992129e-04f, -1.985100593e-04f, +8.396766904e-05f, +1.693757007e-04f, +6.681136497e-05f, -4.147559932e-05f, -5.393619212e-05f, -1.180365334e-05f, +1.308435842e-05f,\n    /*  5, 5 (48) */\n    -1.555761852e-04f, +4.373952890e-04f, +1.150311336e-03f, +9.306954619e-04f, -8.355394543e-04f, -3.029551851e-03f, -3.063286966e-03f, +6.491837443e-04f, +5.981547307e-03f, +7.523690343e-03f, +1.315247531e-03f, -9.678508723e-03f, -1.548951534e-02f, -7.068041675e-03f, +1.318901241e-02f, +2.879323088e-02f, +2.048782397e-02f, -1.471376564e-02f, -5.291339382e-02f, -5.407744115e-02f, +9.329544592e-03f, +1.262459229e-01f, +2.457711298e-01f, +3.058677883e-01f, +2.733959691e-01f, +1.663894575e-01f, +4.187719650e-02f, -4.159008247e-02f, -5.909801344e-02f, -2.810810602e-02f, +1.178734524e-02f, +2.939619172e-02f, +1.958476344e-02f, -1.467660055e-03f, -1.457817489e-02f, -1.259964332e-02f, -1.978409917e-03f, +6.448156998e-03f, +7.144485207e-03f, +2.358875794e-03f, -2.294202691e-03f, -3.397026296e-03f, -1.582621260e-03f, +5.339176868e-04f, +1.233752751e-03f, +6.896441570e-04f, -2.456790136e-05f, -2.550279284e-04f,\n    -9.990514341e-06f, -2.467647407e-05f, -1.412519415e-05f, +3.058450494e-05f, +7.278435928e-05f, +5.019605233e-05f, -5.498908266e-05f, -1.628974510e-04f, -1.403343294e-04f, +6.201620534e-05f, +3.040706252e-04f, +3.263327849e-04f, -6.764669129e-06f, -4.951205242e-04f, -6.741762959e-04f, -2.037806323e-04f, +7.184013214e-04f, +1.334551005e-03f, +8.437302523e-04f, -8.783544077e-04f, -2.966798390e-03f, -4.028594211e-03f, -3.123141668e-03f, -5.247107342e-04f, +2.367329218e-03f, +3.954350967e-03f, +3.514732883e-03f, +1.622904620e-03f, -3.666031161e-04f, -1.317203614e-03f, -1.011676179e-03f, -9.179265262e-05f, +5.896502377e-04f, +6.162093691e-04f, +1.778178744e-04f, -2.497441538e-04f, -3.487681447e-04f, -1.532480920e-04f, +8.821764323e-05f, +1.756338820e-04f, +9.849273735e-05f, -2.146486268e-05f, -7.495222276e-05f, -4.853434916e-05f, +1.794912561e-06f, +2.510476735e-05f, +1.617020805e-05f, -3.325513140e-07f,\n    +6.108240676e-04f, -6.528016204e-05f, -1.839447814e-03f, -2.549015421e-03f, +4.128002002e-04f, +5.605961325e-03f, +6.541566566e-03f, -1.427345052e-03f, -1.249987667e-02f, -1.285565876e-02f, +3.540377188e-03f, +2.265240565e-02f, +2.092033054e-02f, -6.987970968e-03f, -3.499022051e-02f, -2.927929705e-02f, +1.155306871e-02f, +4.725389987e-02f, +3.597764400e-02f, -1.645983108e-02f, -5.659469933e-02f, -3.925573407e-02f, +2.053828372e-02f, +6.056141735e-02f, +3.823514968e-02f, -2.263484985e-02f, -5.804618367e-02f, -3.326164180e-02f, +2.208917023e-02f, +4.973464743e-02f, +2.573956805e-02f, -1.903309789e-02f, -3.783458619e-02f, -1.755343184e-02f, +1.434656914e-02f, +2.521546220e-02f, +1.037130457e-02f, -9.287380369e-03f, -1.437584146e-02f, -5.151894049e-03f, +4.987447719e-03f, +6.707361062e-03f, +2.032090028e-03f, -2.069019717e-03f, -2.327812125e-03f, -5.569994953e-04f, +5.475575594e-04f, +4.427053029e-04f,\n    +1.748371843e-07f, +4.259860619e-05f, +5.587170545e-05f, -2.557515028e-05f, -1.497013158e-04f, -1.377031470e-04f, +1.022014149e-04f, +3.578810928e-04f, +2.559229908e-04f, -2.587552704e-04f, -6.759112251e-04f, -3.874417647e-04f, +5.072942109e-04f, +1.072003745e-03f, +4.939121784e-04f, -8.277475240e-04f, -1.472942613e-03f, -5.364347167e-04f, +1.163992963e-03f, +1.783675417e-03f, +4.936137165e-04f, -1.437266567e-03f, -1.921052916e-03f, -3.731664260e-04f, +1.573565251e-03f, +1.846559109e-03f, +2.101093419e-04f, -1.533059196e-03f, -1.581986859e-03f, -5.191557569e-05f, +1.326979411e-03f, +1.200192326e-03f, -6.158416111e-05f, -1.013161888e-03f, -7.957574627e-04f, +1.130611588e-04f, +6.724045223e-04f, +4.502058804e-04f, -1.103542023e-04f, -3.775826245e-04f, -2.078367251e-04f, +7.730352398e-05f, +1.703417977e-04f, +7.104669728e-05f, -3.944534245e-05f, -5.481331037e-05f, -1.311569267e-05f, +1.286325678e-05f,\n    /*  5, 6 (48) */\n    -1.655666996e-04f, +4.127188149e-04f, +1.136186142e-03f, +9.612799669e-04f, -7.627550950e-04f, -2.979355799e-03f, -3.118276048e-03f, +4.862862933e-04f, +5.841212978e-03f, +7.585706549e-03f, +1.619318156e-03f, -9.352175938e-03f, -1.549628001e-02f, -7.563162199e-03f, +1.251483612e-02f, +2.858945025e-02f, +2.120622529e-02f, -1.337921463e-02f, -5.206966357e-02f, -5.495579556e-02f, +6.362746202e-03f, +1.222173287e-01f, +2.426479881e-01f, +3.053430776e-01f, +2.757632984e-01f, +1.703438085e-01f, +4.539192938e-02f, -3.996717785e-02f, -5.946461656e-02f, -2.942530964e-02f, +1.077566906e-02f, +2.930439907e-02f, +2.017441367e-02f, -8.514506861e-04f, -1.440035701e-02f, -1.284938747e-02f, -2.327178061e-03f, +6.294908906e-03f, +7.232702850e-03f, +2.534509676e-03f, -2.195709953e-03f, -3.418491159e-03f, -1.657573483e-03f, +4.853833376e-04f, +1.235547664e-03f, +7.147489243e-04f, -8.397693308e-06f, -2.553604797e-04f,\n    -9.428075830e-06f, -2.446523357e-05f, -1.502953948e-05f, +2.891464378e-05f, +7.215062819e-05f, +5.229130969e-05f, -5.099895153e-05f, -1.608573953e-04f, -1.439462797e-04f, +5.386984442e-05f, +2.984998835e-04f, +3.310511696e-04f, +7.981125454e-06f, -4.819284022e-04f, -6.777073783e-04f, -2.280557008e-04f, +6.893924609e-04f, +1.328941313e-03f, +8.796439193e-04f, -8.122621241e-04f, -2.909889168e-03f, -4.022965919e-03f, -3.181989019e-03f, -6.193914536e-04f, +2.289705519e-03f, +3.935068360e-03f, +3.556393705e-03f, +1.691046668e-03f, -3.162242503e-04f, -1.308054313e-03f, -1.035222544e-03f, -1.207398156e-04f, +5.777838078e-04f, +6.246380358e-04f, +1.938165692e-04f, -2.405944913e-04f, -3.511310192e-04f, -1.614763310e-04f, +8.241240968e-05f, +1.758196513e-04f, +1.022983425e-04f, -1.837338947e-05f, -7.467188368e-05f, -5.007421371e-05f, +4.735395420e-07f, +2.495223275e-05f, +1.670976246e-05f, +5.634856882e-08f,\n    +6.109989047e-04f, -2.268155584e-05f, -1.783576109e-03f, -2.574590571e-03f, +2.630988845e-04f, +5.468258178e-03f, +6.643767981e-03f, -1.069463959e-03f, -1.224395368e-02f, -1.311441403e-02f, +2.864465963e-03f, +2.226496388e-02f, +2.142762475e-02f, -5.915967223e-03f, -3.449630833e-02f, -3.010704457e-02f, +1.008012610e-02f, +4.671746516e-02f, +3.714163696e-02f, -1.467615567e-02f, -5.610108561e-02f, -4.069300064e-02f, +1.861723080e-02f, +6.018825092e-02f, +3.980871493e-02f, -2.078829074e-02f, -5.783607433e-02f, -3.479470099e-02f, +2.050718337e-02f, +4.968273185e-02f, +2.706654746e-02f, -1.783290557e-02f, -3.789617035e-02f, -1.856659372e-02f, +1.355081168e-02f, +2.532852336e-02f, +1.104370909e-02f, -8.837174489e-03f, -1.448619566e-02f, -5.529476674e-03f, +4.779610994e-03f, +6.784664586e-03f, +2.202431825e-03f, -1.997973020e-03f, -2.367257467e-03f, -6.118128057e-04f, +5.344418668e-04f, +4.555685597e-04f,\n    -8.141264825e-07f, +4.127118779e-05f, +5.672955354e-05f, -2.167626924e-05f, -1.468632456e-04f, -1.417228871e-04f, +9.254930693e-05f, +3.536315659e-04f, +2.665916643e-04f, -2.403814012e-04f, -6.714820789e-04f, -4.087784712e-04f, +4.783540991e-04f, +1.069810928e-03f, +5.290357102e-04f, -7.886911375e-04f, -1.475970030e-03f, -5.859833326e-04f, +1.118017518e-03f, +1.794335564e-03f, +5.547880913e-04f, -1.389687861e-03f, -1.940023976e-03f, -4.399920438e-04f, +1.530270760e-03f, +1.872204622e-03f, +2.749696122e-04f, -1.498689992e-03f, -1.610719037e-03f, -1.077754521e-04f, +1.303639304e-03f, +1.227662917e-03f, -1.920138852e-05f, -1.000177170e-03f, -8.183278745e-04f, +8.515313225e-05f, +6.671201672e-04f, +4.660188261e-04f, -9.484636779e-05f, -3.766957546e-04f, -2.170548800e-04f, +7.042111331e-05f, +1.711039439e-04f, +7.527996901e-05f, -3.730813087e-05f, -5.563235826e-05f, -1.444930562e-05f, +1.260821934e-05f,\n    /*  5, 7 (48) */\n    -1.749947754e-04f, +3.882535813e-04f, +1.121156602e-03f, +9.901946107e-04f, -6.906044669e-04f, -2.927064489e-03f, -3.169275000e-03f, +3.254288980e-04f, +5.697266698e-03f, +7.639576393e-03f, +1.917818040e-03f, -9.021124769e-03f, -1.548829888e-02f, -8.045090601e-03f, +1.183712874e-02f, +2.836139455e-02f, +2.189561775e-02f, -1.205027332e-02f, -5.119001965e-02f, -5.576805768e-02f, +3.452857034e-03f, +1.181943628e-01f, +2.394659991e-01f, +3.047236861e-01f, +2.780530039e-01f, +1.742788769e-01f, +4.894832309e-02f, -3.827613119e-02f, -5.978084081e-02f, -3.073336395e-02f, +9.740446513e-03f, +2.918365925e-02f, +2.075219748e-02f, -2.268126503e-04f, -1.420654044e-02f, -1.308998196e-02f, -2.678309081e-03f, +6.133432575e-03f, +7.315115260e-03f, +2.710329328e-03f, -2.093411611e-03f, -3.436864548e-03f, -1.732245367e-03f, +4.353091239e-04f, +1.236021203e-03f, +7.397011571e-04f, +8.312069153e-06f, -2.553041311e-04f,\n    -8.868877284e-06f, -2.422880418e-05f, -1.589591286e-05f, +2.724700567e-05f, +7.145175848e-05f, +5.429598519e-05f, -4.702111702e-05f, -1.586868851e-04f, -1.473641109e-04f, +4.578169855e-05f, +2.927125456e-04f, +3.353918321e-04f, +2.253768358e-05f, -4.684408418e-04f, -6.805605342e-04f, -2.518208778e-04f, +6.601205199e-04f, +1.322210214e-03f, +9.142539476e-04f, -7.466178985e-04f, -2.851982022e-03f, -4.015321239e-03f, -3.239051608e-03f, -7.137124599e-04f, +2.210770639e-03f, +3.913691982e-03f, +3.596530898e-03f, +1.759068952e-03f, -2.647703935e-04f, -1.297591698e-03f, -1.058123249e-03f, -1.499382191e-04f, +5.652252355e-04f, +6.325743348e-04f, +2.098269225e-04f, -2.310957910e-04f, -3.531811281e-04f, -1.696565939e-04f, +7.644236730e-05f, +1.758302573e-04f, +1.060594193e-04f, -1.520990028e-05f, -7.430614754e-05f, -5.158945309e-05f, -8.777214654e-07f, +2.476498981e-05f, +1.724180117e-05f, +4.580078570e-07f,\n    +6.101847783e-04f, +1.858963195e-05f, -1.726846555e-03f, -2.596266840e-03f, +1.162356389e-04f, +5.326535291e-03f, +6.736317288e-03f, -7.158323930e-04f, -1.197736201e-02f, -1.335479543e-02f, +2.192983884e-03f, +2.185618541e-02f, +2.190597885e-02f, -4.846156295e-03f, -3.396727262e-02f, -3.089573571e-02f, +8.604156065e-03f, +4.613148183e-02f, +3.825965448e-02f, -1.288182010e-02f, -5.554629752e-02f, -4.208268850e-02f, +1.667720682e-02f, +5.974825888e-02f, +4.133898570e-02f, -1.891608611e-02f, -5.756110472e-02f, -3.629339099e-02f, +1.889646434e-02f, +4.957495640e-02f, +2.837018677e-02f, -1.660524265e-02f, -3.791537174e-02f, -1.956677089e-02f, +1.273248380e-02f, +2.541367649e-02f, +1.171082926e-02f, -8.371155662e-03f, -1.458104203e-02f, -5.906172429e-03f, +4.562556114e-03f, +6.855085700e-03f, +2.373535769e-03f, -1.922693051e-03f, -2.404565598e-03f, -6.674451639e-04f, +5.199925611e-04f, +4.681767790e-04f,\n    -1.768012448e-06f, +3.991988566e-05f, +5.748515713e-05f, -1.783680397e-05f, -1.438921311e-04f, -1.454898128e-04f, +8.294247518e-05f, +3.490151391e-04f, +2.767945562e-04f, -2.219489135e-04f, -6.663114089e-04f, -4.294212432e-04f, +4.491216100e-04f, +1.066399226e-03f, +5.632960958e-04f, -7.489789079e-04f, -1.477293135e-03f, -6.346300523e-04f, +1.070949660e-03f, +1.802922556e-03f, +6.151864918e-04f, -1.340610040e-03f, -1.956777258e-03f, -5.063084046e-04f, +1.485213656e-03f, +1.895757366e-03f, +3.396523490e-04f, -1.462515425e-03f, -1.637716154e-03f, -1.637582340e-04f, +1.278680614e-03f, +1.253885324e-03f, +2.349719803e-05f, -9.859275928e-04f, -8.401394188e-04f, +5.687146046e-05f, +6.609863865e-04f, +4.814633604e-04f, -7.901772440e-05f, -3.753330419e-04f, -2.261509316e-04f, +6.332576399e-05f, +1.716572328e-04f, +7.950518296e-05f, -3.506461595e-05f, -5.639053797e-05f, -1.580284829e-05f, +1.231862419e-05f,\n    /*  5, 8 (48) */\n    -1.838636527e-04f, +3.640247771e-04f, +1.105260690e-03f, +1.017441616e-03f, -6.191527084e-04f, -2.872768504e-03f, -3.216296117e-03f, +1.667420129e-04f, +5.549902587e-03f, +7.685358092e-03f, +2.210530586e-03f, -8.685732937e-03f, -1.546576120e-02f, -8.513531443e-03f, +1.115656820e-02f, +2.810957367e-02f, +2.255573827e-02f, -1.072806311e-02f, -5.027576570e-02f, -5.651467558e-02f, +6.008750117e-04f, +1.141790415e-01f, +2.362269475e-01f, +3.040099737e-01f, +2.802637745e-01f, +1.781925688e-01f, +5.254485398e-02f, -3.651706223e-02f, -6.004561120e-02f, -3.203095565e-02f, +8.682323264e-03f, +2.903372103e-02f, +2.131742272e-02f, +4.057616846e-04f, -1.399671352e-02f, -1.332107775e-02f, -3.031490209e-03f, +5.963775981e-03f, +7.391557627e-03f, +2.886159585e-03f, -1.987352192e-03f, -3.452074449e-03f, -1.806551514e-03f, +3.837196708e-04f, +1.235143482e-03f, +7.644661469e-04f, +2.555387032e-05f, -2.548461232e-04f,\n    -8.313625809e-06f, -2.396806258e-05f, -1.672406700e-05f, +2.558345201e-05f, +7.068967762e-05f, +5.620943877e-05f, -4.305954150e-05f, -1.563900589e-04f, -1.505870813e-04f, +3.775903377e-05f, +2.867170601e-04f, +3.393552354e-04f, +3.689334343e-05f, -4.546741100e-04f, -6.827411283e-04f, -2.750605043e-04f, +6.306148736e-04f, +1.314377916e-03f, +9.475502706e-04f, -6.814618109e-04f, -2.793121386e-03f, -4.005675560e-03f, -3.294301130e-03f, -8.076191064e-04f, +2.130568273e-03f, +3.890225612e-03f, +3.635109170e-03f, +1.826925267e-03f, -2.122664403e-04f, -1.285807117e-03f, -1.080349702e-03f, -1.793641383e-04f, +5.519779693e-04f, +6.400048148e-04f, +2.258336362e-04f, -2.212530097e-04f, -3.549124572e-04f, -1.777800534e-04f, +7.031130021e-05f, +1.756631414e-04f, +1.097713294e-04f, -1.197661495e-05f, -7.385392033e-05f, -5.307786957e-05f, -2.257867657e-06f, +2.454249926e-05f, +1.776540592e-05f, +8.721441469e-07f,\n    +6.084167658e-04f, +5.850951761e-05f, -1.669361398e-03f, -2.614103644e-03f, -2.765649223e-05f, +5.181045478e-03f, +6.819259763e-03f, -3.668172540e-04f, -1.170056746e-02f, -1.357674434e-02f, +1.526672475e-03f, +2.142676417e-02f, +2.235510046e-02f, -3.779757068e-03f, -3.340397652e-02f, -3.164471462e-02f, +7.126862931e-03f, +4.549685177e-02f, +3.933060414e-02f, -1.107889755e-02f, -5.493111103e-02f, -4.342329854e-02f, +1.472042957e-02f, +5.924195048e-02f, +4.282419935e-02f, -1.702032875e-02f, -5.722145237e-02f, -3.775590641e-02f, +1.725874818e-02f, +4.941119817e-02f, +2.964886738e-02f, -1.535135733e-02f, -3.789187454e-02f, -2.055269849e-02f, +1.189234439e-02f, +2.547054795e-02f, +1.237181565e-02f, -7.889692302e-03f, -1.466005975e-02f, -6.281505470e-03f, +4.336405182e-03f, +6.918411464e-03f, +2.545193002e-03f, -1.843187868e-03f, -2.439630214e-03f, -7.238357019e-04f, +5.041897128e-04f, +4.804954032e-04f,\n    -2.686215319e-06f, +3.854746139e-05f, +5.813984021e-05f, -1.406085667e-05f, -1.407945597e-04f, -1.490034349e-04f, +7.339249953e-05f, +3.440429587e-04f, +2.865252041e-04f, -2.034810611e-04f, -6.604135915e-04f, -4.493521809e-04f, +4.196341833e-04f, +1.061782430e-03f, +5.966591145e-04f, -7.086615254e-04f, -1.476919655e-03f, -6.823223727e-04f, +1.022848338e-03f, +1.809432872e-03f, +6.747407438e-04f, -1.290092373e-03f, -1.971295339e-03f, -5.720388143e-04f, +1.438445122e-03f, +1.917187310e-03f, +4.040820973e-04f, -1.424572536e-03f, -1.662940582e-03f, -2.197990000e-04f, +1.252124341e-03f, +1.278821250e-03f, +6.646319794e-05f, -9.704204222e-04f, -8.611594400e-04f, +2.824672336e-05f, +6.540016554e-04f, +4.965161516e-04f, -6.288388262e-05f, -3.734894680e-04f, -2.351112459e-04f, +5.602317951e-05f, +1.719969615e-04f, +8.371623530e-05f, -3.271562375e-05f, -5.708508235e-05f, -1.717459974e-05f, +1.199389677e-05f,\n    /*  5, 9 (48) */\n    -1.921772785e-04f, +3.400567146e-04f, +1.088536623e-03f, +1.043025068e-03f, -5.484630308e-04f, -2.816559065e-03f, -3.259355658e-03f, +1.035195406e-05f, +5.399315506e-03f, +7.723117125e-03f, +2.497247646e-03f, -8.346377701e-03f, -1.542886786e-02f, -8.968205553e-03f, +1.047382708e-02f, +2.783451316e-02f, +2.318635314e-02f, -9.413685192e-03f, -4.932821543e-02f, -5.719613739e-02f, -2.192246374e-03f, +1.101733660e-01f, +2.329326463e-01f, +3.032023546e-01f, +2.823943428e-01f, +1.820827945e-01f, +5.617996315e-02f, -3.469013697e-02f, -6.025787764e-02f, -3.331676276e-02f, +7.601973562e-03f, +2.885435689e-02f, +2.186940069e-02f, +1.045766499e-03f, -1.377087989e-02f, -1.354233076e-02f, -3.386402666e-03f, +5.785995928e-03f, +7.461868927e-03f, +3.061822726e-03f, -1.877580862e-03f, -3.464051064e-03f, -1.880405434e-03f, +3.306418012e-04f, +1.232885614e-03f, +7.890086462e-04f, +4.331927624e-05f, -2.539739791e-04f,\n    -7.763007857e-06f, -2.368389901e-05f, -1.751380594e-05f, +2.392580611e-05f, +6.986635178e-05f, +5.803114002e-05f, -3.911811091e-05f, -1.539711284e-04f, -1.536146589e-04f, +2.980895653e-05f, +2.805219773e-04f, +3.429422056e-04f, +5.103677261e-05f, -4.406445511e-04f, -6.842550870e-04f, -2.977595724e-04f, +6.009047662e-04f, +1.305465301e-03f, +9.795239089e-04f, -6.168332849e-04f, -2.733352090e-03f, -3.994045556e-03f, -3.347710544e-03f, -9.010570422e-04f, +2.049143015e-03f, +3.864674442e-03f, +3.672094116e-03f, +1.894569207e-03f, -1.587382800e-04f, -1.272692875e-03f, -1.101873560e-03f, -2.089933721e-04f, +5.380461344e-04f, +6.469163482e-04f, +2.418212370e-04f, -2.110715010e-04f, -3.563192359e-04f, -1.858378263e-04f, +6.402320883e-05f, +1.753158955e-04f, +1.134294190e-04f, -8.675864377e-06f, -7.331418729e-05f, -5.453725787e-05f, -3.665842204e-06f, +2.428425610e-05f, +1.827965033e-05f, +1.298450182e-06f,\n    +6.057305505e-04f, +9.705697900e-05f, -1.611221558e-03f, -2.628164501e-03f, -1.684510519e-04f, +5.032042043e-03f, +6.892652262e-03f, -2.277429524e-05f, -1.141404225e-02f, -1.378022540e-02f, +8.662588835e-04f, +2.097741199e-02f, +2.277473465e-02f, -2.717974638e-03f, -3.280731741e-02f, -3.235337614e-02f, +5.649943275e-03f, +4.481452940e-02f, +4.035345248e-02f, -9.269464674e-03f, -5.425637028e-02f, -4.471339091e-02f, +1.274913423e-02f, +5.866991166e-02f, +4.426264447e-02f, -1.510314144e-02f, -5.681737027e-02f, -3.918047895e-02f, +1.559580760e-02f, +4.919139917e-02f, +3.090099172e-02f, -1.407253608e-02f, -3.782541135e-02f, -2.152311891e-02f, +1.103118495e-02f, +2.549879468e-02f, +1.302581730e-02f, -7.393176150e-03f, -1.472294363e-02f, -6.654994938e-03f, +4.101293936e-03f, +6.974434643e-03f, +2.717189964e-03f, -1.759471632e-03f, -2.472345838e-03f, -7.809207842e-04f, +4.870151131e-04f, +4.924893000e-04f,\n    -3.568207542e-06f, +3.715664369e-05f, +5.869505005e-05f, -1.035235536e-05f, -1.375771734e-04f, -1.522636143e-04f, +6.391070698e-05f, +3.387264748e-04f, +2.957778293e-04f, -1.850008703e-04f, -6.538037531e-04f, -4.685544326e-04f, +3.899292429e-04f, +1.055975683e-03f, +6.290918642e-04f, -6.677900939e-04f, -1.474859304e-03f, -7.290091656e-04f, +9.737735056e-04f, +1.813865457e-03f, +7.333838297e-04f, -1.238195732e-03f, -1.983563450e-03f, -6.371072837e-04f, +1.390018391e-03f, +1.936466895e-03f, +4.681835516e-04f, -1.384900566e-03f, -1.686356674e-03f, -2.758324854e-04f, +1.223993503e-03f, +1.302433720e-03f, +1.096475668e-04f, -9.536645096e-04f, -8.813559796e-04f, -6.897906872e-07f, +6.461654956e-04f, +5.111540984e-04f, -4.646103780e-05f, -3.711605712e-04f, -2.439221649e-04f, +4.851943780e-05f, +1.721186407e-04f, +8.790692255e-05f, -3.026215731e-05f, -5.771326009e-05f, -1.856276310e-05f, +1.163351217e-05f,\n    /*  5,10 (48) */\n    -1.999402864e-04f, +3.163728156e-04f, +1.071022817e-03f, +1.066950874e-03f, -4.785966790e-04f, -2.758527925e-03f, -3.298473769e-03f, -1.436191744e-04f, +5.245700847e-03f, +7.752926082e-03f, +2.777769623e-03f, -8.003435496e-03f, -1.537783108e-02f, -9.408850104e-03f, +9.789571990e-03f, +2.753675359e-02f, +2.378725791e-02f, -8.108219891e-03f, -4.834869152e-02f, -5.781297067e-02f, -4.925598463e-03f, +1.061793204e-01f, +2.295849358e-01f, +3.023012975e-01f, +2.844434858e-01f, +1.859474689e-01f, +5.985205727e-02f, -3.279556776e-02f, -6.041661592e-02f, -3.458945564e-02f, +6.500100002e-03f, +2.864536352e-02f, +2.240744682e-02f, +1.692682847e-03f, -1.352905865e-02f, -1.375340227e-02f, -3.742721902e-03f, +5.600158101e-03f, +7.525892136e-03f, +3.237138622e-03f, -1.764151443e-03f, -3.472726928e-03f, -1.953719622e-03f, +2.761045433e-04f, +1.229219772e-03f, +8.132929023e-04f, +6.159892657e-05f, -2.526755289e-04f,\n    -7.217688677e-06f, -2.337721593e-05f, -1.826498444e-05f, +2.227585175e-05f, +6.898378297e-05f, +5.976066708e-05f, -3.520063170e-05f, -1.514343731e-04f, -1.564465189e-04f, +2.193840843e-05f, +2.741359392e-04f, +3.461539264e-04f, +6.495697539e-05f, -4.263685705e-04f, -6.851088870e-04f, -3.199037319e-04f, +5.710192872e-04f, +1.295493904e-03f, +1.010166969e-03f, -5.527710620e-04f, -2.672719330e-03f, -3.980449169e-03f, -3.399254090e-03f, -9.939722517e-04f, +1.966540324e-03f, +3.837045076e-03f, +3.707452254e-03f, +1.961954204e-03f, -1.042127838e-04f, -1.258242246e-03f, -1.122666753e-03f, -2.388012594e-04f, +5.234345368e-04f, +6.532961475e-04f, +2.577740890e-04f, -2.005570148e-04f, -3.573959454e-04f, -1.938209822e-04f, +5.758230847e-05f, +1.747862663e-04f, +1.170290228e-04f, -5.310089543e-06f, -7.268601529e-05f, -5.596540759e-05f, -5.100534608e-06f, +2.398979095e-05f, +1.878360102e-05f, +1.736593812e-06f,\n    +6.021623429e-04f, +1.342136227e-04f, -1.552526508e-03f, -2.638516856e-03f, -3.060282253e-04f, +4.879778429e-03f, +6.956562969e-03f, +3.159521796e-04f, -1.111826442e-02f, -1.396522627e-02f, +2.124551303e-04f, +2.050885756e-02f, +2.316466389e-02f, -1.661998956e-03f, -3.217822554e-02f, -3.302116624e-02f, +4.175083971e-03f, +4.408552023e-02f, +4.132722598e-02f, -7.455599217e-03f, -5.352298645e-02f, -4.595158665e-02f, +1.076557078e-02f, +5.803280438e-02f, +4.565266287e-02f, -1.316667454e-02f, -5.634918672e-02f, -4.056537951e-02f, +1.390945093e-02f, +4.891556668e-02f, +3.212498523e-02f, -1.277010236e-02f, -3.771576378e-02f, -2.247678342e-02f, +1.014982897e-02f, +2.549810488e-02f, +1.367198280e-02f, -6.882022052e-03f, -1.476940467e-02f, -7.026155510e-03f, +3.857371771e-03f, +7.022954081e-03f, +2.889308604e-03f, -1.671564710e-03f, -2.502607995e-03f, -8.386340443e-04f, +4.684523500e-04f, +5.041228121e-04f,\n    -4.413538483e-06f, +3.575012473e-05f, +5.915235252e-05f, -6.715051279e-06f, -1.342466589e-04f, -1.552705567e-04f, +5.450816010e-05f, +3.330774214e-04f, +3.045473361e-04f, -1.665311122e-04f, -6.464977422e-04f, -4.870122059e-04f, +3.600441509e-04f, +1.048995450e-03f, +6.605627939e-04f, -6.264160665e-04f, -1.471123755e-03f, -7.746407335e-04f, +9.237860406e-04f, +1.816221724e-03f, +7.910499668e-04f, -1.184982522e-03f, -1.993569491e-03f, -7.014386192e-04f, +1.339988683e-03f, +1.953571069e-03f, +5.318816467e-04f, -1.343540912e-03f, -1.707930808e-03f, -3.317931603e-04f, +1.194313118e-03f, +1.324687140e-03f, +1.530006729e-04f, -9.356702918e-04f, -9.006978220e-04f, -2.990611803e-05f, +6.374784862e-04f, +5.253543618e-04f, -2.976595604e-05f, -3.683424601e-04f, -2.525700247e-04f, +4.082098868e-05f, +1.720180044e-04f, +9.207094896e-05f, -2.770539860e-05f, -5.827238086e-05f, -1.996546693e-05f, +1.123699732e-05f,\n    /*  5,11 (48) */\n    -2.071579750e-04f, +2.929955996e-04f, +1.052757832e-03f, +1.089226726e-03f, -4.096128960e-04f, -2.698767258e-03f, -3.333674401e-03f, -2.950535474e-04f, +5.089254328e-03f, +7.774864490e-03f, +3.051905562e-03f, -7.657281569e-03f, -1.531287411e-02f, -9.835218674e-03f, +9.104463103e-03f, +2.721684986e-02f, +2.435827719e-02f, -6.812725987e-03f, -4.733852455e-02f, -5.836574174e-02f, -7.598317793e-03f, +1.021988712e-01f, +2.261856817e-01f, +3.013073253e-01f, +2.864100261e-01f, +1.897845140e-01f, +6.355950952e-02f, -3.083361355e-02f, -6.052082871e-02f, -3.584769789e-02f, +5.377433249e-03f, +2.840656226e-02f, +2.293088136e-02f, +2.345978995e-03f, -1.327128456e-02f, -1.395395928e-02f, -4.100117847e-03f, +5.406337119e-03f, +7.583474445e-03f, +3.411924888e-03f, -1.647122420e-03f, -3.478037017e-03f, -2.026405637e-03f, +2.201391358e-04f, +1.224119238e-03f, +8.372826932e-04f, +8.038252759e-05f, -2.509389351e-04f,\n    -6.678311802e-06f, -2.304892660e-05f, -1.897750724e-05f, +2.063533162e-05f, +6.804400617e-05f, +6.139770552e-05f, -3.131082784e-05f, -1.487841346e-04f, -1.590825413e-04f, +1.415416122e-05f, +2.675676699e-04f, +3.489919343e-04f, +7.864329961e-05f, -4.118626183e-04f, -6.853095436e-04f, -3.414792965e-04f, +5.409873483e-04f, +1.284485883e-03f, +1.039472643e-03f, -4.893131757e-04f, -2.611268631e-03f, -3.964905593e-03f, -3.448907308e-03f, -1.086311093e-03f, +1.882806499e-03f, +3.807345528e-03f, +3.741151049e-03f, +2.029033559e-03f, -4.871779011e-05f, -1.242449486e-03f, -1.142701516e-03f, -2.687626964e-04f, +5.081486657e-04f, +6.591317812e-04f, +2.736764066e-04f, -1.897156964e-04f, -3.581373279e-04f, -2.017205521e-04f, +5.099302774e-05f, +1.740721600e-04f, +1.205654696e-04f, -1.881840462e-06f, -7.196855515e-05f, -5.736010574e-05f, -6.560781128e-06f, +2.365867119e-05f, +1.927631872e-05f, +2.186217979e-06f,\n    +5.977488045e-04f, +1.699637474e-04f, -1.493374155e-03f, -2.645231908e-03f, -4.402748842e-04f, +4.724507873e-03f, +7.011071129e-03f, +6.490296010e-04f, -1.081371709e-02f, -1.413175738e-02f, -4.340426119e-04f, +2.002184535e-02f, +2.352470804e-02f, -6.130035059e-04f, -3.151766275e-02f, -3.364758230e-02f, +2.703960216e-03f, +4.331087950e-02f, +4.225101202e-02f, -5.639377493e-03f, -5.273193649e-02f, -4.713656917e-02f, +8.772001286e-03f, +5.733136576e-02f, +4.699265155e-02f, -1.121310348e-02f, -5.581730507e-02f, -4.190892042e-02f, +1.220152012e-02f, +4.858377352e-02f, +3.331929834e-02f, -1.144541522e-02f, -3.756276311e-02f, -2.341245371e-02f, +9.249131144e-03f, +2.546819877e-02f, +1.430946128e-02f, -6.356667690e-03f, -1.479917063e-02f, -7.394497970e-03f, +3.604801746e-03f, +7.063775070e-03f, +3.061326609e-03f, -1.579493761e-03f, -2.530313393e-03f, -8.969064252e-04f, +4.484868831e-04f, +5.153598095e-04f,\n    -5.221833379e-06f, +3.433055652e-05f, +5.951342718e-05f, -3.152516786e-06f, -1.308097366e-04f, -1.580248070e-04f, +4.519564591e-05f, +3.271077973e-04f, +3.128293097e-04f, -1.480942770e-04f, -6.385121023e-04f, -5.047107781e-04f, +3.300161610e-04f, +1.040859489e-03f, +6.910417326e-04f, -5.845911801e-04f, -1.465726618e-03f, -8.191688640e-04f, +8.729476697e-04f, +1.816505538e-03f, +8.476746833e-04f, -1.130516597e-03f, -2.001304046e-03f, -7.649585135e-04f, +1.288413138e-03f, +1.968477322e-03f, +5.951016491e-04f, -1.300537084e-03f, -1.727631438e-03f, -3.876153077e-04f, +1.163110185e-03f, +1.345547346e-03f, +1.964723545e-04f, -9.164497890e-04f, -9.191545389e-04f, -5.936965397e-05f, +6.279422738e-04f, +5.390943982e-04f, -1.281595904e-05f, -3.650318258e-04f, -2.610411744e-04f, +3.293465062e-05f, +1.716910203e-04f, +9.620193407e-05f, -2.504671030e-05f, -5.875980060e-05f, -2.138076662e-05f, +1.080393312e-05f,\n    /*  5,12 (48) */\n    -2.138362868e-04f, +2.699466730e-04f, +1.033780325e-03f, +1.109862058e-03f, -3.415688898e-04f, -2.637369552e-03f, -3.364985229e-03f, -4.438376820e-04f, +4.930171787e-03f, +7.789018652e-03f, +3.319473232e-03f, -7.308289635e-03f, -1.523423081e-02f, -1.024708129e-02f, +8.419153559e-03f, +2.687537056e-02f, +2.489926454e-02f, -5.528240104e-03f, -4.629905191e-02f, -5.885505491e-02f, -1.020958642e-02f, +9.823396566e-02f, +2.227367744e-01f, +3.002210142e-01f, +2.882928326e-01f, +1.935918595e-01f, +6.730066057e-02f, -2.880458000e-02f, -6.056954650e-02f, -3.709014737e-02f, +4.234731733e-03f, +2.813779957e-02f, +2.343903002e-02f, +3.005110776e-03f, -1.299760815e-02f, -1.414367498e-02f, -4.458255175e-03f, +5.204616567e-03f, +7.634467472e-03f, +3.585997048e-03f, -1.526556951e-03f, -3.479918858e-03f, -2.098374192e-03f, +1.627790300e-04f, +1.217558456e-03f, +8.609413644e-04f, +9.965884631e-05f, -2.487527171e-04f,\n    -6.145498583e-06f, -2.269995370e-05f, -1.965132830e-05f, +1.900594605e-05f, +6.704908649e-05f, +6.294204704e-05f, -2.745233794e-05f, -1.460248114e-04f, -1.615228087e-04f, +6.462811949e-06f, +2.608259660e-04f, +3.514581129e-04f, +9.208544302e-05f, -3.971431734e-04f, -6.848645985e-04f, -3.624732490e-04f, +5.108376602e-04f, +1.272464001e-03f, +1.067435203e-03f, -4.264969275e-04f, -2.549045810e-03f, -3.947435253e-03f, -3.496647051e-03f, -1.178020334e-03f, +1.797988639e-03f, +3.775585220e-03f, +3.773158943e-03f, +2.095760475e-03f, +7.717910193e-06f, -1.225309849e-03f, -1.161950407e-03f, -2.988521533e-04f, +4.921946958e-04f, +6.644111886e-04f, +2.895122690e-04f, -1.785540845e-04f, -3.585383943e-04f, -2.095275372e-04f, +4.426000660e-05f, +1.731716465e-04f, +1.240340870e-04f, +1.606225050e-06f, -7.116104395e-05f, -5.871913933e-05f, -8.045365282e-06f, +2.329050229e-05f, +1.975685940e-05f, +2.646940749e-06f,\n    +5.925269711e-04f, +2.042943039e-04f, -1.433860728e-03f, -2.648384424e-03f, -5.710846208e-04f, +4.566483066e-03f, +7.056266775e-03f, +9.761373983e-04f, -1.050088778e-02f, -1.427985166e-02f, -1.072554714e-03f, +1.951713457e-02f, +2.385472420e-02f, +4.278559834e-04f, -3.082662102e-02f, -3.423217348e-02f, +1.238233598e-03f, +4.249171064e-02f, +4.312395969e-02f, -3.822871955e-03f, -5.188426180e-02f, -4.826708576e-02f, +6.770697241e-03f, +5.656640725e-02f, +4.828106469e-02f, -9.244626154e-03f, -5.522220343e-02f, -4.320945751e-02f, +1.047388868e-02f, +4.819615821e-02f, +3.448240853e-02f, -1.009986787e-02f, -3.736629075e-02f, -2.432890350e-02f, +8.329976605e-03f, +2.540882911e-02f, +1.493740356e-02f, -5.817573292e-03f, -1.481198659e-02f, -7.759529796e-03f, +3.343760572e-03f, +7.096709720e-03f, +3.233017629e-03f, -1.483291827e-03f, -2.555360104e-03f, -9.556662258e-04f, +4.271061165e-04f, +5.261637426e-04f,\n    -5.992792188e-06f, +3.290054749e-05f, +5.978006238e-05f, +3.318566004e-07f, -1.272731508e-04f, -1.605272429e-04f, +3.598366537e-05f, +3.208298467e-04f, +3.206200138e-04f, -1.297125478e-04f, -6.298640435e-04f, -5.216365040e-04f, +2.998823734e-04f, +1.031586820e-03f, +7.204999172e-04f, -5.423673907e-04f, -1.458683414e-03f, -8.625468812e-04f, +8.213208904e-04f, +1.814723206e-03f, +9.031948932e-04f, -1.074863185e-03f, -2.006760386e-03f, -8.275936346e-04f, +1.235350750e-03f, +1.981165714e-03f, +6.577692475e-04f, -1.255934658e-03f, -1.745429140e-03f, -4.432331034e-04f, +1.130413656e-03f, +1.364981652e-03f, +2.400119783e-04f, -8.960166017e-04f, -9.366965344e-04f, -8.904718824e-05f, +6.175595806e-04f, +5.523519909e-04f, +4.371091988e-06f, -3.612259542e-04f, -2.693219942e-04f, +2.486760706e-05f, +1.711338991e-04f, +1.002934205e-04f, -2.228763733e-05f, -5.917292671e-05f, -2.280664602e-05f, +1.033395661e-05f,\n    /*  5,13 (48) */\n    -2.199817854e-04f, +2.472467193e-04f, +1.014128997e-03f, +1.128868004e-03f, -2.745198034e-04f, -2.574427505e-03f, -3.392437567e-03f, -5.898624934e-04f, +4.768648978e-03f, +7.795481463e-03f, +3.580299198e-03f, -6.956831522e-03f, -1.514214537e-02f, -1.064422447e-02f, +7.734288960e-03f, +2.651289731e-02f, +2.541010220e-02f, -4.255776103e-03f, -4.523161671e-02f, -5.928155184e-02f, -1.275863223e-02f, +9.428653040e-02f, +2.192401273e-01f, +2.990429938e-01f, +2.900908213e-01f, +1.973674447e-01f, +7.107381951e-02f, -2.670881952e-02f, -6.056182859e-02f, -3.831545722e-02f, +3.072781326e-03f, +2.783894741e-02f, +2.393122472e-02f, +3.669521965e-03f, -1.270809588e-02f, -1.432222906e-02f, -4.816793569e-03f, +4.995089030e-03f, +7.678727479e-03f, +3.759168695e-03f, -1.402522864e-03f, -3.478312633e-03f, -2.169535236e-03f, +1.040598907e-04f, +1.209513091e-03f, +8.842318667e-04f, +1.194157057e-04f, -2.461057764e-04f,\n    -5.619847753e-06f, -2.233122796e-05f, -2.028645001e-05f, +1.738935163e-05f, +6.600111633e-05f, +6.439358814e-05f, -2.362871253e-05f, -1.431608535e-04f, -1.637676033e-04f, -1.129221506e-06f, +2.539196867e-04f, +3.535546868e-04f, +1.052734594e-04f, -3.822267278e-04f, -6.837821069e-04f, -3.828732458e-04f, +4.805987104e-04f, +1.259451603e-03f, +1.094049999e-03f, -3.643588626e-04f, -2.486096943e-03f, -3.928059791e-03f, -3.542451496e-03f, -1.269047195e-03f, +1.712134616e-03f, +3.741774980e-03f, +3.803445380e-03f, +2.162088097e-03f, +6.506458990e-05f, -1.206819595e-03f, -1.180386341e-03f, -3.290436934e-04f, +4.755794889e-04f, +6.691226960e-04f, +3.052656328e-04f, -1.670791099e-04f, -3.585944329e-04f, -2.172329171e-04f, +3.738809433e-05f, +1.720829637e-04f, +1.274302066e-04f, +5.151342728e-06f, -7.026280721e-05f, -6.004029793e-05f, -9.553018418e-06f, +2.288492893e-05f, +2.022427551e-05f, +3.118355367e-06f,\n    +5.865341789e-04f, +2.371948514e-04f, -1.374080666e-03f, -2.648052568e-03f, -6.983577715e-04f, +4.405955823e-03f, +7.092250441e-03f, +1.296967245e-03f, -1.018026776e-02f, -1.440956421e-02f, -1.702418758e-03f, +1.899549807e-02f, +2.415460658e-02f, +1.459442803e-03f, -3.010612110e-02f, -3.477454088e-02f, -2.204498169e-04f, +4.162916376e-02f, +4.394528058e-02f, -2.008148749e-03f, -5.098106691e-02f, -4.934194895e-02f, +4.763936855e-03f, +5.573881361e-02f, +4.951641544e-02f, -7.263460440e-03f, -5.456443418e-02f, -4.446539217e-02f, +8.728459539e-03f, +4.775292511e-02f, +3.561282219e-02f, -8.734886219e-03f, -3.712627877e-02f, -2.522492010e-02f, +7.393280071e-03f, +2.531978192e-02f, +1.555496314e-02f, -5.265221301e-03f, -1.480761550e-02f, -8.120755750e-03f, +3.074438578e-03f, +7.121577327e-03f, +3.404151528e-03f, -1.382998406e-03f, -2.577647741e-03f, -1.014839153e-03f, +4.042994704e-04f, +5.364976992e-04f,\n    -6.726188338e-06f, +3.146265921e-05f, +5.995415024e-05f, +3.734859764e-06f, -1.236436595e-04f, -1.627790681e-04f, +2.688242340e-05f, +3.142560394e-04f, +3.279163869e-04f, -1.114077755e-04f, -6.205714137e-04f, -5.377768232e-04f, +2.696796894e-04f, +1.021197686e-03f, +7.489100181e-04f, -4.997968082e-04f, -1.450011546e-03f, -9.047296952e-04f, +7.689688922e-04f, +1.810883461e-03f, +9.575489692e-04f, -1.018088808e-03f, -2.009934480e-03f, -8.892717136e-04f, +1.180862295e-03f, +1.991618904e-03f, +7.198106432e-04f, -1.209781226e-03f, -1.761296652e-03f, -4.985806950e-04f, +1.096254414e-03f, +1.382958902e-03f, +2.835684992e-04f, -8.743859052e-04f, -9.532950886e-04f, -1.189049414e-04f, +6.063342116e-04f, +5.651052827e-04f, +2.177681319e-05f, -3.569227371e-04f, -2.773989148e-04f, +1.662740206e-05f, +1.703431041e-04f, +1.043388822e-04f, -1.942990811e-05f, -5.950922336e-05f, -2.424101926e-05f, +9.826762982e-06f,\n    /*  5,14 (48) */\n    -2.256016332e-04f, +2.249154914e-04f, +9.938425466e-04f, +1.146257356e-03f, -2.085186870e-04f, -2.510033917e-03f, -3.416066279e-03f, -7.330233469e-04f, +4.604881375e-03f, +7.794352242e-03f, +3.834218885e-03f, -6.603276835e-03f, -1.503687191e-02f, -1.102645119e-02f, +7.050506854e-03f, +2.613002407e-02f, +2.589070091e-02f, -2.996324500e-03f, -4.413756671e-02f, -5.964591070e-02f, -1.524472918e-02f, +9.035847061e-02f, +2.156976758e-01f, +2.977739466e-01f, +2.918029559e-01f, +2.011092197e-01f, +7.487726489e-02f, -2.454673142e-02f, -6.049676400e-02f, -3.952227682e-02f, +1.892394985e-03f, +2.750990372e-02f, +2.440680421e-02f, +4.338644661e-03f, -1.240283025e-02f, -1.448930817e-02f, -5.175388002e-03f, +4.777856113e-03f, +7.716115573e-03f, +3.931251658e-03f, -1.275092657e-03f, -3.473161290e-03f, -2.239798043e-03f, +4.401959277e-05f, +1.199960073e-03f, +9.071167956e-04f, +1.396399812e-04f, -2.429874210e-04f,\n    -5.101935035e-06f, -2.194368679e-05f, -2.088292230e-05f, +1.578716000e-05f, +6.490221258e-05f, +6.575232863e-05f, -1.984341151e-05f, -1.401967567e-04f, -1.658174043e-04f, -8.615704811e-06f, +2.468577445e-04f, +3.552842156e-04f, +1.181977641e-04f, -3.671297703e-04f, -6.820706251e-04f, -4.026676212e-04f, +4.502987406e-04f, +1.245472585e-03f, +1.119313455e-03f, -3.029347472e-04f, -2.422468327e-03f, -3.906802038e-03f, -3.586300165e-03f, -1.359339382e-03f, +1.625293037e-03f, +3.705927037e-03f, +3.831980836e-03f, +2.227969541e-03f, +1.232916022e-04f, -1.186976001e-03f, -1.197982611e-03f, -3.593109908e-04f, +4.583105953e-04f, +6.732550314e-04f, +3.209203473e-04f, -1.552980924e-04f, -3.583010170e-04f, -2.248276595e-04f, +3.038234710e-05f, +1.708045217e-04f, +1.307491686e-04f, +8.750643349e-06f, -6.927326105e-05f, -6.132137632e-05f, -1.108242036e-05f, +2.244163619e-05f, +2.067761714e-05f, +3.600030357e-06f,\n    +5.798079906e-04f, +2.686575106e-04f, -1.314126515e-03f, -2.644317708e-03f, -8.220014310e-04f, +4.243176755e-03f, +7.119132864e-03f, +1.611223284e-03f, -9.852351375e-03f, -1.452097198e-02f, -2.322990171e-03f, +1.845772125e-02f, +2.442428626e-02f, +2.480640490e-03f, -2.935721108e-02f, -3.527433768e-02f, -1.670461363e-03f, +4.072443406e-02f, +4.471424948e-02f, -1.972652877e-04f, -5.002351794e-02f, -5.036003776e-02f, +2.754002374e-03f, +5.484954190e-02f, +5.069727773e-02f, -5.271841536e-03f, -5.384462353e-02f, -4.567517339e-02f, +6.967162887e-03f, +4.725434442e-02f, +3.670907660e-02f, -7.351927317e-03f, -3.684271028e-02f, -2.609930601e-02f, +6.439984982e-03f, +2.520087698e-02f, +1.616129735e-02f, -4.700116019e-03f, -1.478583868e-02f, -8.477678487e-03f, +2.797039663e-03f, +7.138204729e-03f, +3.574494632e-03f, -1.278659524e-03f, -2.597077649e-03f, -1.074348376e-03f, +3.800584512e-04f, +5.463244622e-04f,\n    -7.421867367e-06f, +3.001940325e-05f, +6.003768156e-05f, +7.053467277e-06f, -1.199280247e-04f, -1.647818060e-04f, +1.790181941e-05f, +3.073990511e-04f, +3.347160378e-04f, -9.320145502e-05f, -6.106526693e-04f, -5.531202657e-04f, +2.394447676e-04f, +1.009713527e-03f, +7.762461630e-04f, -4.569316317e-04f, -1.439730266e-03f, -9.456738503e-04f, +7.159554776e-04f, +1.804997449e-03f, +1.010676813e-03f, -9.602611958e-04f, -2.010824996e-03f, -9.499216317e-04f, +1.125010260e-03f, +1.999822172e-03f, +7.811526405e-04f, -1.162126342e-03f, -1.775208914e-03f, -5.535922821e-04f, +1.060665243e-03f, +1.399449515e-03f, +3.270905203e-04f, -8.515744417e-04f, -9.689224002e-04f, -1.489086026e-04f, +5.942710605e-04f, +5.773328080e-04f, +3.938231595e-05f, -3.521206831e-04f, -2.852584363e-04f, +8.221935396e-06f, +1.693153605e-04f, +1.083317326e-04f, -1.647543552e-05f, -5.976621677e-05f, -2.568173259e-05f, +9.282107604e-06f,\n    /*  5,15 (48) */\n    -2.307035682e-04f, +2.029718046e-04f, +9.729596243e-04f, +1.162044516e-03f, -1.436164744e-04f, -2.444281589e-03f, -3.435909691e-03f, -8.732201035e-04f, +4.439063971e-03f, +7.785736537e-03f, +4.081076629e-03f, -6.247992620e-03f, -1.491867414e-02f, -1.139358096e-02f, +6.368436228e-03f, +2.572735645e-02f, +2.634099965e-02f, -1.750851916e-03f, -4.301825325e-02f, -5.994884545e-02f, -1.766719750e-02f, +8.645166857e-02f, +2.121113757e-01f, +2.964146073e-01f, +2.934282489e-01f, +2.048151467e-01f, +7.870924573e-02f, -2.231876188e-02f, -6.037347239e-02f, -4.070925282e-02f, +6.944123742e-04f, +2.715059273e-02f, +2.486511480e-02f, +5.011899692e-03f, -1.208190990e-02f, -1.464460626e-02f, -5.533689019e-03f, +4.553028453e-03f, +7.746497920e-03f, +4.102056180e-03f, -1.144343489e-03f, -3.464410647e-03f, -2.309071304e-03f, -1.730178355e-05f, +1.188877652e-03f, +9.295584318e-04f, +1.603175984e-04f, -2.393873907e-04f,\n    -4.592312781e-06f, -2.153827296e-05f, -2.144084177e-05f, +1.420093672e-05f, +6.375451373e-05f, +6.701837009e-05f, -1.609980167e-05f, -1.371370575e-04f, -1.676728842e-04f, -1.599059122e-05f, +2.396490953e-04f, +3.566495875e-04f, +1.308491393e-04f, -3.518687715e-04f, -6.797391967e-04f, -4.218453906e-04f, +4.199657252e-04f, +1.230551377e-03f, +1.143223062e-03f, -2.422595454e-04f, -2.358206446e-03f, -3.883686002e-03f, -3.628173926e-03f, -1.448845124e-03f, +1.537513213e-03f, +3.668055015e-03f, +3.858736840e-03f, +2.293357934e-03f, +1.823673981e-04f, -1.165777375e-03f, -1.214712913e-03f, -3.896273500e-04f, +4.403962535e-04f, +6.767973395e-04f, +3.364601680e-04f, -1.432187388e-04f, -3.576540129e-04f, -2.323027288e-04f, +2.324802542e-05f, +1.693349066e-04f, +1.339863276e-04f, +1.240115436e-05f, -6.819191421e-05f, -6.256017717e-05f, -1.263220012e-05f, +2.196035072e-05f, +2.111593325e-05f, +4.091509657e-06f,\n    +5.723861232e-04f, +2.986769139e-04f, -1.254088834e-03f, -2.637264241e-03f, -9.419294558e-04f, +4.078394949e-03f, +7.137034683e-03f, +1.918622335e-03f, -9.517635337e-03f, -1.461417344e-02f, -2.933642841e-03f, +1.790460098e-02f, +2.466373103e-02f, +3.490354017e-03f, -2.858096492e-02f, -3.573126931e-02f, -3.110191630e-03f, +3.977876021e-02f, +4.543020495e-02f, +1.607732162e-03f, -4.901284113e-02f, -5.132029895e-02f, +7.431773778e-04f, +5.389962027e-02f, +5.182228799e-02f, -3.272019363e-03f, -5.306347089e-02f, -4.683729973e-02f, +5.191953973e-03f, +4.670075213e-02f, +3.776974184e-02f, -5.952477802e-03f, -3.651561975e-02f, -2.695088045e-02f, +5.471062582e-03f, +2.505196838e-02f, +1.675556841e-02f, -4.122783211e-03f, -1.474645637e-02f, -8.829799170e-03f, +2.511781227e-03f, +7.146426665e-03f, +3.743809993e-03f, -1.170327791e-03f, -2.613553085e-03f, -1.134114593e-03f, +3.543767186e-04f, +5.556065698e-04f,\n    -8.079745468e-06f, +2.857323814e-05f, +6.003274073e-05f, +1.028483838e-05f, -1.161330024e-04f, -1.665372915e-04f, +9.051438444e-06f, +3.002717441e-04f, +3.410172403e-04f, -7.511470104e-05f, -6.001268452e-04f, -5.676564557e-04f, +2.092139797e-04f, +9.971569364e-04f, +8.024839588e-04f, -4.138240856e-04f, -1.427860644e-03f, -9.853375695e-04f, +6.623449825e-04f, +1.797078701e-03f, +1.062519925e-03f, -9.014492054e-04f, -2.009433298e-03f, -1.009473505e-03f, +1.067858769e-03f, +2.005763443e-03f, +8.417227355e-04f, -1.113021470e-03f, -1.787143111e-03f, -6.082021965e-04f, +1.023680798e-03f, +1.414425528e-03f, +3.705263544e-04f, -8.276005109e-04f, -9.835516288e-04f, -1.790233679e-04f, +5.813761142e-04f, +5.890135245e-04f, +5.716822562e-05f, -3.468189271e-04f, -2.928871472e-04f, -3.405428706e-07f, +1.680476643e-04f, +1.122653332e-04f, -1.342631768e-05f, -5.994150050e-05f, -2.712656655e-05f, +8.699807951e-06f,\n    /*  5,16 (48) */\n    -2.352958810e-04f, +1.814335316e-04f, +9.515187825e-04f, +1.176245452e-03f, -7.986196071e-05f, -2.377263219e-03f, -3.452009492e-03f, -1.010357161e-03f, +4.271391087e-03f, +7.769745946e-03f, +4.320725725e-03f, -5.891343032e-03f, -1.478782500e-02f, -1.174544974e-02f, +5.688697032e-03f, +2.530551106e-02f, +2.676096538e-02f, -5.203005390e-04f, -4.187503019e-02f, -6.019110499e-02f, -2.002540395e-02f, +8.256798257e-02f, +2.084832017e-01f, +2.949657621e-01f, +2.949657621e-01f, +2.084832017e-01f, +8.256798257e-02f, -2.002540395e-02f, -6.019110499e-02f, -4.187503019e-02f, -5.203005390e-04f, +2.676096538e-02f, +2.530551106e-02f, +5.688697032e-03f, -1.174544974e-02f, -1.478782500e-02f, -5.891343032e-03f, +4.320725725e-03f, +7.769745946e-03f, +4.271391087e-03f, -1.010357161e-03f, -3.452009492e-03f, -2.377263219e-03f, -7.986196071e-05f, +1.176245452e-03f, +9.515187825e-04f, +1.814335316e-04f, -2.352958810e-04f,\n    -4.091509657e-06f, -2.111593325e-05f, -2.196035072e-05f, +1.263220012e-05f, +6.256017717e-05f, +6.819191421e-05f, -1.240115436e-05f, -1.339863276e-04f, -1.693349066e-04f, -2.324802542e-05f, +2.323027288e-04f, +3.576540129e-04f, +1.432187388e-04f, -3.364601680e-04f, -6.767973395e-04f, -4.403962535e-04f, +3.896273500e-04f, +1.214712913e-03f, +1.165777375e-03f, -1.823673981e-04f, -2.293357934e-03f, -3.858736840e-03f, -3.668055015e-03f, -1.537513213e-03f, +1.448845124e-03f, +3.628173926e-03f, +3.883686002e-03f, +2.358206446e-03f, +2.422595454e-04f, -1.143223062e-03f, -1.230551377e-03f, -4.199657252e-04f, +4.218453906e-04f, +6.797391967e-04f, +3.518687715e-04f, -1.308491393e-04f, -3.566495875e-04f, -2.396490953e-04f, +1.599059122e-05f, +1.676728842e-04f, +1.371370575e-04f, +1.609980167e-05f, -6.701837009e-05f, -6.375451373e-05f, -1.420093672e-05f, +2.144084177e-05f, +2.153827296e-05f, +4.592312781e-06f,\n    +5.643063777e-04f, +3.272501520e-04f, -1.194056093e-03f, -2.626979402e-03f, -1.058062458e-03f, +3.911857657e-03f, +7.146086122e-03f, +2.218894080e-03f, -9.176618097e-03f, -1.468928814e-02f, -3.533769686e-03f, +1.733694452e-02f, +2.487294501e-02f, +4.487510953e-03f, -2.777848096e-02f, -3.614509340e-02f, -4.538052273e-03f, +3.879342264e-02f, +4.609254994e-02f, +3.404810862e-03f, -4.795032120e-02f, -5.222174816e-02f, -1.266255920e-03f, +5.289014676e-02f, +5.289014676e-02f, -1.266255920e-03f, -5.222174816e-02f, -4.795032120e-02f, +3.404810862e-03f, +4.609254994e-02f, +3.879342264e-02f, -4.538052273e-03f, -3.614509340e-02f, -2.777848096e-02f, +4.487510953e-03f, +2.487294501e-02f, +1.733694452e-02f, -3.533769686e-03f, -1.468928814e-02f, -9.176618097e-03f, +2.218894080e-03f, +7.146086122e-03f, +3.911857657e-03f, -1.058062458e-03f, -2.626979402e-03f, -1.194056093e-03f, +3.272501520e-04f, +5.643063777e-04f,\n    -8.699807951e-06f, +2.712656655e-05f, +5.994150050e-05f, +1.342631768e-05f, -1.122653332e-04f, -1.680476643e-04f, +3.405428706e-07f, +2.928871472e-04f, +3.468189271e-04f, -5.716822562e-05f, -5.890135245e-04f, -5.813761142e-04f, +1.790233679e-04f, +9.835516288e-04f, +8.276005109e-04f, -3.705263544e-04f, -1.414425528e-03f, -1.023680798e-03f, +6.082021965e-04f, +1.787143111e-03f, +1.113021470e-03f, -8.417227355e-04f, -2.005763443e-03f, -1.067858769e-03f, +1.009473505e-03f, +2.009433298e-03f, +9.014492054e-04f, -1.062519925e-03f, -1.797078701e-03f, -6.623449825e-04f, +9.853375695e-04f, +1.427860644e-03f, +4.138240856e-04f, -8.024839588e-04f, -9.971569364e-04f, -2.092139797e-04f, +5.676564557e-04f, +6.001268452e-04f, +7.511470104e-05f, -3.410172403e-04f, -3.002717441e-04f, -9.051438444e-06f, +1.665372915e-04f, +1.161330024e-04f, -1.028483838e-05f, -6.003274073e-05f, -2.857323814e-05f, +8.079745468e-06f,\n    /*  5,17 (48) */\n    -2.393873907e-04f, +1.603175984e-04f, +9.295584318e-04f, +1.188877652e-03f, -1.730178355e-05f, -2.309071304e-03f, -3.464410647e-03f, -1.144343489e-03f, +4.102056180e-03f, +7.746497920e-03f, +4.553028453e-03f, -5.533689019e-03f, -1.464460626e-02f, -1.208190990e-02f, +5.011899692e-03f, +2.486511480e-02f, +2.715059273e-02f, +6.944123742e-04f, -4.070925282e-02f, -6.037347239e-02f, -2.231876188e-02f, +7.870924573e-02f, +2.048151467e-01f, +2.934282489e-01f, +2.964146073e-01f, +2.121113757e-01f, +8.645166857e-02f, -1.766719750e-02f, -5.994884545e-02f, -4.301825325e-02f, -1.750851916e-03f, +2.634099965e-02f, +2.572735645e-02f, +6.368436228e-03f, -1.139358096e-02f, -1.491867414e-02f, -6.247992620e-03f, +4.081076629e-03f, +7.785736537e-03f, +4.439063971e-03f, -8.732201035e-04f, -3.435909691e-03f, -2.444281589e-03f, -1.436164744e-04f, +1.162044516e-03f, +9.729596243e-04f, +2.029718046e-04f, -2.307035682e-04f,\n    -3.600030357e-06f, -2.067761714e-05f, -2.244163619e-05f, +1.108242036e-05f, +6.132137632e-05f, +6.927326105e-05f, -8.750643349e-06f, -1.307491686e-04f, -1.708045217e-04f, -3.038234710e-05f, +2.248276595e-04f, +3.583010170e-04f, +1.552980924e-04f, -3.209203473e-04f, -6.732550314e-04f, -4.583105953e-04f, +3.593109908e-04f, +1.197982611e-03f, +1.186976001e-03f, -1.232916022e-04f, -2.227969541e-03f, -3.831980836e-03f, -3.705927037e-03f, -1.625293037e-03f, +1.359339382e-03f, +3.586300165e-03f, +3.906802038e-03f, +2.422468327e-03f, +3.029347472e-04f, -1.119313455e-03f, -1.245472585e-03f, -4.502987406e-04f, +4.026676212e-04f, +6.820706251e-04f, +3.671297703e-04f, -1.181977641e-04f, -3.552842156e-04f, -2.468577445e-04f, +8.615704811e-06f, +1.658174043e-04f, +1.401967567e-04f, +1.984341151e-05f, -6.575232863e-05f, -6.490221258e-05f, -1.578716000e-05f, +2.088292230e-05f, +2.194368679e-05f, +5.101935035e-06f,\n    +5.556065698e-04f, +3.543767186e-04f, -1.134114593e-03f, -2.613553085e-03f, -1.170327791e-03f, +3.743809993e-03f, +7.146426665e-03f, +2.511781227e-03f, -8.829799170e-03f, -1.474645637e-02f, -4.122783211e-03f, +1.675556841e-02f, +2.505196838e-02f, +5.471062582e-03f, -2.695088045e-02f, -3.651561975e-02f, -5.952477802e-03f, +3.776974184e-02f, +4.670075213e-02f, +5.191953973e-03f, -4.683729973e-02f, -5.306347089e-02f, -3.272019363e-03f, +5.182228799e-02f, +5.389962027e-02f, +7.431773778e-04f, -5.132029895e-02f, -4.901284113e-02f, +1.607732162e-03f, +4.543020495e-02f, +3.977876021e-02f, -3.110191630e-03f, -3.573126931e-02f, -2.858096492e-02f, +3.490354017e-03f, +2.466373103e-02f, +1.790460098e-02f, -2.933642841e-03f, -1.461417344e-02f, -9.517635337e-03f, +1.918622335e-03f, +7.137034683e-03f, +4.078394949e-03f, -9.419294558e-04f, -2.637264241e-03f, -1.254088834e-03f, +2.986769139e-04f, +5.723861232e-04f,\n    -9.282107604e-06f, +2.568173259e-05f, +5.976621677e-05f, +1.647543552e-05f, -1.083317326e-04f, -1.693153605e-04f, -8.221935396e-06f, +2.852584363e-04f, +3.521206831e-04f, -3.938231595e-05f, -5.773328080e-04f, -5.942710605e-04f, +1.489086026e-04f, +9.689224002e-04f, +8.515744417e-04f, -3.270905203e-04f, -1.399449515e-03f, -1.060665243e-03f, +5.535922821e-04f, +1.775208914e-03f, +1.162126342e-03f, -7.811526405e-04f, -1.999822172e-03f, -1.125010260e-03f, +9.499216317e-04f, +2.010824996e-03f, +9.602611958e-04f, -1.010676813e-03f, -1.804997449e-03f, -7.159554776e-04f, +9.456738503e-04f, +1.439730266e-03f, +4.569316317e-04f, -7.762461630e-04f, -1.009713527e-03f, -2.394447676e-04f, +5.531202657e-04f, +6.106526693e-04f, +9.320145502e-05f, -3.347160378e-04f, -3.073990511e-04f, -1.790181941e-05f, +1.647818060e-04f, +1.199280247e-04f, -7.053467277e-06f, -6.003768156e-05f, -3.001940325e-05f, +7.421867367e-06f,\n    /*  5,18 (48) */\n    -2.429874210e-04f, +1.396399812e-04f, +9.071167956e-04f, +1.199960073e-03f, +4.401959277e-05f, -2.239798043e-03f, -3.473161290e-03f, -1.275092657e-03f, +3.931251658e-03f, +7.716115573e-03f, +4.777856113e-03f, -5.175388002e-03f, -1.448930817e-02f, -1.240283025e-02f, +4.338644661e-03f, +2.440680421e-02f, +2.750990372e-02f, +1.892394985e-03f, -3.952227682e-02f, -6.049676400e-02f, -2.454673142e-02f, +7.487726489e-02f, +2.011092197e-01f, +2.918029559e-01f, +2.977739466e-01f, +2.156976758e-01f, +9.035847061e-02f, -1.524472918e-02f, -5.964591070e-02f, -4.413756671e-02f, -2.996324500e-03f, +2.589070091e-02f, +2.613002407e-02f, +7.050506854e-03f, -1.102645119e-02f, -1.503687191e-02f, -6.603276835e-03f, +3.834218885e-03f, +7.794352242e-03f, +4.604881375e-03f, -7.330233469e-04f, -3.416066279e-03f, -2.510033917e-03f, -2.085186870e-04f, +1.146257356e-03f, +9.938425466e-04f, +2.249154914e-04f, -2.256016332e-04f,\n    -3.118355367e-06f, -2.022427551e-05f, -2.288492893e-05f, +9.553018418e-06f, +6.004029793e-05f, +7.026280721e-05f, -5.151342728e-06f, -1.274302066e-04f, -1.720829637e-04f, -3.738809433e-05f, +2.172329171e-04f, +3.585944329e-04f, +1.670791099e-04f, -3.052656328e-04f, -6.691226960e-04f, -4.755794889e-04f, +3.290436934e-04f, +1.180386341e-03f, +1.206819595e-03f, -6.506458990e-05f, -2.162088097e-03f, -3.803445380e-03f, -3.741774980e-03f, -1.712134616e-03f, +1.269047195e-03f, +3.542451496e-03f, +3.928059791e-03f, +2.486096943e-03f, +3.643588626e-04f, -1.094049999e-03f, -1.259451603e-03f, -4.805987104e-04f, +3.828732458e-04f, +6.837821069e-04f, +3.822267278e-04f, -1.052734594e-04f, -3.535546868e-04f, -2.539196867e-04f, +1.129221506e-06f, +1.637676033e-04f, +1.431608535e-04f, +2.362871253e-05f, -6.439358814e-05f, -6.600111633e-05f, -1.738935163e-05f, +2.028645001e-05f, +2.233122796e-05f, +5.619847753e-06f,\n    +5.463244622e-04f, +3.800584512e-04f, -1.074348376e-03f, -2.597077649e-03f, -1.278659524e-03f, +3.574494632e-03f, +7.138204729e-03f, +2.797039663e-03f, -8.477678487e-03f, -1.478583868e-02f, -4.700116019e-03f, +1.616129735e-02f, +2.520087698e-02f, +6.439984982e-03f, -2.609930601e-02f, -3.684271028e-02f, -7.351927317e-03f, +3.670907660e-02f, +4.725434442e-02f, +6.967162887e-03f, -4.567517339e-02f, -5.384462353e-02f, -5.271841536e-03f, +5.069727773e-02f, +5.484954190e-02f, +2.754002374e-03f, -5.036003776e-02f, -5.002351794e-02f, -1.972652877e-04f, +4.471424948e-02f, +4.072443406e-02f, -1.670461363e-03f, -3.527433768e-02f, -2.935721108e-02f, +2.480640490e-03f, +2.442428626e-02f, +1.845772125e-02f, -2.322990171e-03f, -1.452097198e-02f, -9.852351375e-03f, +1.611223284e-03f, +7.119132864e-03f, +4.243176755e-03f, -8.220014310e-04f, -2.644317708e-03f, -1.314126515e-03f, +2.686575106e-04f, +5.798079906e-04f,\n    -9.826762982e-06f, +2.424101926e-05f, +5.950922336e-05f, +1.942990811e-05f, -1.043388822e-04f, -1.703431041e-04f, -1.662740206e-05f, +2.773989148e-04f, +3.569227371e-04f, -2.177681319e-05f, -5.651052827e-04f, -6.063342116e-04f, +1.189049414e-04f, +9.532950886e-04f, +8.743859052e-04f, -2.835684992e-04f, -1.382958902e-03f, -1.096254414e-03f, +4.985806950e-04f, +1.761296652e-03f, +1.209781226e-03f, -7.198106432e-04f, -1.991618904e-03f, -1.180862295e-03f, +8.892717136e-04f, +2.009934480e-03f, +1.018088808e-03f, -9.575489692e-04f, -1.810883461e-03f, -7.689688922e-04f, +9.047296952e-04f, +1.450011546e-03f, +4.997968082e-04f, -7.489100181e-04f, -1.021197686e-03f, -2.696796894e-04f, +5.377768232e-04f, +6.205714137e-04f, +1.114077755e-04f, -3.279163869e-04f, -3.142560394e-04f, -2.688242340e-05f, +1.627790681e-04f, +1.236436595e-04f, -3.734859764e-06f, -5.995415024e-05f, -3.146265921e-05f, +6.726188338e-06f,\n    /*  5,19 (48) */\n    -2.461057764e-04f, +1.194157057e-04f, +8.842318667e-04f, +1.209513091e-03f, +1.040598907e-04f, -2.169535236e-03f, -3.478312633e-03f, -1.402522864e-03f, +3.759168695e-03f, +7.678727479e-03f, +4.995089030e-03f, -4.816793569e-03f, -1.432222906e-02f, -1.270809588e-02f, +3.669521965e-03f, +2.393122472e-02f, +2.783894741e-02f, +3.072781326e-03f, -3.831545722e-02f, -6.056182859e-02f, -2.670881952e-02f, +7.107381951e-02f, +1.973674447e-01f, +2.900908213e-01f, +2.990429938e-01f, +2.192401273e-01f, +9.428653040e-02f, -1.275863223e-02f, -5.928155184e-02f, -4.523161671e-02f, -4.255776103e-03f, +2.541010220e-02f, +2.651289731e-02f, +7.734288960e-03f, -1.064422447e-02f, -1.514214537e-02f, -6.956831522e-03f, +3.580299198e-03f, +7.795481463e-03f, +4.768648978e-03f, -5.898624934e-04f, -3.392437567e-03f, -2.574427505e-03f, -2.745198034e-04f, +1.128868004e-03f, +1.014128997e-03f, +2.472467193e-04f, -2.199817854e-04f,\n    -2.646940749e-06f, -1.975685940e-05f, -2.329050229e-05f, +8.045365282e-06f, +5.871913933e-05f, +7.116104395e-05f, -1.606225050e-06f, -1.240340870e-04f, -1.731716465e-04f, -4.426000660e-05f, +2.095275372e-04f, +3.585383943e-04f, +1.785540845e-04f, -2.895122690e-04f, -6.644111886e-04f, -4.921946958e-04f, +2.988521533e-04f, +1.161950407e-03f, +1.225309849e-03f, -7.717910193e-06f, -2.095760475e-03f, -3.773158943e-03f, -3.775585220e-03f, -1.797988639e-03f, +1.178020334e-03f, +3.496647051e-03f, +3.947435253e-03f, +2.549045810e-03f, +4.264969275e-04f, -1.067435203e-03f, -1.272464001e-03f, -5.108376602e-04f, +3.624732490e-04f, +6.848645985e-04f, +3.971431734e-04f, -9.208544302e-05f, -3.514581129e-04f, -2.608259660e-04f, -6.462811949e-06f, +1.615228087e-04f, +1.460248114e-04f, +2.745233794e-05f, -6.294204704e-05f, -6.704908649e-05f, -1.900594605e-05f, +1.965132830e-05f, +2.269995370e-05f, +6.145498583e-06f,\n    +5.364976992e-04f, +4.042994704e-04f, -1.014839153e-03f, -2.577647741e-03f, -1.382998406e-03f, +3.404151528e-03f, +7.121577327e-03f, +3.074438578e-03f, -8.120755750e-03f, -1.480761550e-02f, -5.265221301e-03f, +1.555496314e-02f, +2.531978192e-02f, +7.393280071e-03f, -2.522492010e-02f, -3.712627877e-02f, -8.734886219e-03f, +3.561282219e-02f, +4.775292511e-02f, +8.728459539e-03f, -4.446539217e-02f, -5.456443418e-02f, -7.263460440e-03f, +4.951641544e-02f, +5.573881361e-02f, +4.763936855e-03f, -4.934194895e-02f, -5.098106691e-02f, -2.008148749e-03f, +4.394528058e-02f, +4.162916376e-02f, -2.204498169e-04f, -3.477454088e-02f, -3.010612110e-02f, +1.459442803e-03f, +2.415460658e-02f, +1.899549807e-02f, -1.702418758e-03f, -1.440956421e-02f, -1.018026776e-02f, +1.296967245e-03f, +7.092250441e-03f, +4.405955823e-03f, -6.983577715e-04f, -2.648052568e-03f, -1.374080666e-03f, +2.371948514e-04f, +5.865341789e-04f,\n    -1.033395661e-05f, +2.280664602e-05f, +5.917292671e-05f, +2.228763733e-05f, -1.002934205e-04f, -1.711338991e-04f, -2.486760706e-05f, +2.693219942e-04f, +3.612259542e-04f, -4.371091988e-06f, -5.523519909e-04f, -6.175595806e-04f, +8.904718824e-05f, +9.366965344e-04f, +8.960166017e-04f, -2.400119783e-04f, -1.364981652e-03f, -1.130413656e-03f, +4.432331034e-04f, +1.745429140e-03f, +1.255934658e-03f, -6.577692475e-04f, -1.981165714e-03f, -1.235350750e-03f, +8.275936346e-04f, +2.006760386e-03f, +1.074863185e-03f, -9.031948932e-04f, -1.814723206e-03f, -8.213208904e-04f, +8.625468812e-04f, +1.458683414e-03f, +5.423673907e-04f, -7.204999172e-04f, -1.031586820e-03f, -2.998823734e-04f, +5.216365040e-04f, +6.298640435e-04f, +1.297125478e-04f, -3.206200138e-04f, -3.208298467e-04f, -3.598366537e-05f, +1.605272429e-04f, +1.272731508e-04f, -3.318566004e-07f, -5.978006238e-05f, -3.290054749e-05f, +5.992792188e-06f,\n    /*  5,20 (48) */\n    -2.487527171e-04f, +9.965884631e-05f, +8.609413644e-04f, +1.217558456e-03f, +1.627790300e-04f, -2.098374192e-03f, -3.479918858e-03f, -1.526556951e-03f, +3.585997048e-03f, +7.634467472e-03f, +5.204616567e-03f, -4.458255175e-03f, -1.414367498e-02f, -1.299760815e-02f, +3.005110776e-03f, +2.343903002e-02f, +2.813779957e-02f, +4.234731733e-03f, -3.709014737e-02f, -6.056954650e-02f, -2.880458000e-02f, +6.730066057e-02f, +1.935918595e-01f, +2.882928326e-01f, +3.002210142e-01f, +2.227367744e-01f, +9.823396566e-02f, -1.020958642e-02f, -5.885505491e-02f, -4.629905191e-02f, -5.528240104e-03f, +2.489926454e-02f, +2.687537056e-02f, +8.419153559e-03f, -1.024708129e-02f, -1.523423081e-02f, -7.308289635e-03f, +3.319473232e-03f, +7.789018652e-03f, +4.930171787e-03f, -4.438376820e-04f, -3.364985229e-03f, -2.637369552e-03f, -3.415688898e-04f, +1.109862058e-03f, +1.033780325e-03f, +2.699466730e-04f, -2.138362868e-04f,\n    -2.186217979e-06f, -1.927631872e-05f, -2.365867119e-05f, +6.560781128e-06f, +5.736010574e-05f, +7.196855515e-05f, +1.881840462e-06f, -1.205654696e-04f, -1.740721600e-04f, -5.099302774e-05f, +2.017205521e-04f, +3.581373279e-04f, +1.897156964e-04f, -2.736764066e-04f, -6.591317812e-04f, -5.081486657e-04f, +2.687626964e-04f, +1.142701516e-03f, +1.242449486e-03f, +4.871779011e-05f, -2.029033559e-03f, -3.741151049e-03f, -3.807345528e-03f, -1.882806499e-03f, +1.086311093e-03f, +3.448907308e-03f, +3.964905593e-03f, +2.611268631e-03f, +4.893131757e-04f, -1.039472643e-03f, -1.284485883e-03f, -5.409873483e-04f, +3.414792965e-04f, +6.853095436e-04f, +4.118626183e-04f, -7.864329961e-05f, -3.489919343e-04f, -2.675676699e-04f, -1.415416122e-05f, +1.590825413e-04f, +1.487841346e-04f, +3.131082784e-05f, -6.139770552e-05f, -6.804400617e-05f, -2.063533162e-05f, +1.897750724e-05f, +2.304892660e-05f, +6.678311802e-06f,\n    +5.261637426e-04f, +4.271061165e-04f, -9.556662258e-04f, -2.555360104e-03f, -1.483291827e-03f, +3.233017629e-03f, +7.096709720e-03f, +3.343760572e-03f, -7.759529796e-03f, -1.481198659e-02f, -5.817573292e-03f, +1.493740356e-02f, +2.540882911e-02f, +8.329976605e-03f, -2.432890350e-02f, -3.736629075e-02f, -1.009986787e-02f, +3.448240853e-02f, +4.819615821e-02f, +1.047388868e-02f, -4.320945751e-02f, -5.522220343e-02f, -9.244626154e-03f, +4.828106469e-02f, +5.656640725e-02f, +6.770697241e-03f, -4.826708576e-02f, -5.188426180e-02f, -3.822871955e-03f, +4.312395969e-02f, +4.249171064e-02f, +1.238233598e-03f, -3.423217348e-02f, -3.082662102e-02f, +4.278559834e-04f, +2.385472420e-02f, +1.951713457e-02f, -1.072554714e-03f, -1.427985166e-02f, -1.050088778e-02f, +9.761373983e-04f, +7.056266775e-03f, +4.566483066e-03f, -5.710846208e-04f, -2.648384424e-03f, -1.433860728e-03f, +2.042943039e-04f, +5.925269711e-04f,\n    -1.080393312e-05f, +2.138076662e-05f, +5.875980060e-05f, +2.504671030e-05f, -9.620193407e-05f, -1.716910203e-04f, -3.293465062e-05f, +2.610411744e-04f, +3.650318258e-04f, +1.281595904e-05f, -5.390943982e-04f, -6.279422738e-04f, +5.936965397e-05f, +9.191545389e-04f, +9.164497890e-04f, -1.964723545e-04f, -1.345547346e-03f, -1.163110185e-03f, +3.876153077e-04f, +1.727631438e-03f, +1.300537084e-03f, -5.951016491e-04f, -1.968477322e-03f, -1.288413138e-03f, +7.649585135e-04f, +2.001304046e-03f, +1.130516597e-03f, -8.476746833e-04f, -1.816505538e-03f, -8.729476697e-04f, +8.191688640e-04f, +1.465726618e-03f, +5.845911801e-04f, -6.910417326e-04f, -1.040859489e-03f, -3.300161610e-04f, +5.047107781e-04f, +6.385121023e-04f, +1.480942770e-04f, -3.128293097e-04f, -3.271077973e-04f, -4.519564591e-05f, +1.580248070e-04f, +1.308097366e-04f, +3.152516786e-06f, -5.951342718e-05f, -3.433055652e-05f, +5.221833379e-06f,\n    /*  5,21 (48) */\n    -2.509389351e-04f, +8.038252759e-05f, +8.372826932e-04f, +1.224119238e-03f, +2.201391358e-04f, -2.026405637e-03f, -3.478037017e-03f, -1.647122420e-03f, +3.411924888e-03f, +7.583474445e-03f, +5.406337119e-03f, -4.100117847e-03f, -1.395395928e-02f, -1.327128456e-02f, +2.345978995e-03f, +2.293088136e-02f, +2.840656226e-02f, +5.377433249e-03f, -3.584769789e-02f, -6.052082871e-02f, -3.083361355e-02f, +6.355950952e-02f, +1.897845140e-01f, +2.864100261e-01f, +3.013073253e-01f, +2.261856817e-01f, +1.021988712e-01f, -7.598317793e-03f, -5.836574174e-02f, -4.733852455e-02f, -6.812725987e-03f, +2.435827719e-02f, +2.721684986e-02f, +9.104463103e-03f, -9.835218674e-03f, -1.531287411e-02f, -7.657281569e-03f, +3.051905562e-03f, +7.774864490e-03f, +5.089254328e-03f, -2.950535474e-04f, -3.333674401e-03f, -2.698767258e-03f, -4.096128960e-04f, +1.089226726e-03f, +1.052757832e-03f, +2.929955996e-04f, -2.071579750e-04f,\n    -1.736593812e-06f, -1.878360102e-05f, -2.398979095e-05f, +5.100534608e-06f, +5.596540759e-05f, +7.268601529e-05f, +5.310089543e-06f, -1.170290228e-04f, -1.747862663e-04f, -5.758230847e-05f, +1.938209822e-04f, +3.573959454e-04f, +2.005570148e-04f, -2.577740890e-04f, -6.532961475e-04f, -5.234345368e-04f, +2.388012594e-04f, +1.122666753e-03f, +1.258242246e-03f, +1.042127838e-04f, -1.961954204e-03f, -3.707452254e-03f, -3.837045076e-03f, -1.966540324e-03f, +9.939722517e-04f, +3.399254090e-03f, +3.980449169e-03f, +2.672719330e-03f, +5.527710620e-04f, -1.010166969e-03f, -1.295493904e-03f, -5.710192872e-04f, +3.199037319e-04f, +6.851088870e-04f, +4.263685705e-04f, -6.495697539e-05f, -3.461539264e-04f, -2.741359392e-04f, -2.193840843e-05f, +1.564465189e-04f, +1.514343731e-04f, +3.520063170e-05f, -5.976066708e-05f, -6.898378297e-05f, -2.227585175e-05f, +1.826498444e-05f, +2.337721593e-05f, +7.217688677e-06f,\n    +5.153598095e-04f, +4.484868831e-04f, -8.969064252e-04f, -2.530313393e-03f, -1.579493761e-03f, +3.061326609e-03f, +7.063775070e-03f, +3.604801746e-03f, -7.394497970e-03f, -1.479917063e-02f, -6.356667690e-03f, +1.430946128e-02f, +2.546819877e-02f, +9.249131144e-03f, -2.341245371e-02f, -3.756276311e-02f, -1.144541522e-02f, +3.331929834e-02f, +4.858377352e-02f, +1.220152012e-02f, -4.190892042e-02f, -5.581730507e-02f, -1.121310348e-02f, +4.699265155e-02f, +5.733136576e-02f, +8.772001286e-03f, -4.713656917e-02f, -5.273193649e-02f, -5.639377493e-03f, +4.225101202e-02f, +4.331087950e-02f, +2.703960216e-03f, -3.364758230e-02f, -3.151766275e-02f, -6.130035059e-04f, +2.352470804e-02f, +2.002184535e-02f, -4.340426119e-04f, -1.413175738e-02f, -1.081371709e-02f, +6.490296010e-04f, +7.011071129e-03f, +4.724507873e-03f, -4.402748842e-04f, -2.645231908e-03f, -1.493374155e-03f, +1.699637474e-04f, +5.977488045e-04f,\n    -1.123699732e-05f, +1.996546693e-05f, +5.827238086e-05f, +2.770539860e-05f, -9.207094896e-05f, -1.720180044e-04f, -4.082098868e-05f, +2.525700247e-04f, +3.683424601e-04f, +2.976595604e-05f, -5.253543618e-04f, -6.374784862e-04f, +2.990611803e-05f, +9.006978220e-04f, +9.356702918e-04f, -1.530006729e-04f, -1.324687140e-03f, -1.194313118e-03f, +3.317931603e-04f, +1.707930808e-03f, +1.343540912e-03f, -5.318816467e-04f, -1.953571069e-03f, -1.339988683e-03f, +7.014386192e-04f, +1.993569491e-03f, +1.184982522e-03f, -7.910499668e-04f, -1.816221724e-03f, -9.237860406e-04f, +7.746407335e-04f, +1.471123755e-03f, +6.264160665e-04f, -6.605627939e-04f, -1.048995450e-03f, -3.600441509e-04f, +4.870122059e-04f, +6.464977422e-04f, +1.665311122e-04f, -3.045473361e-04f, -3.330774214e-04f, -5.450816010e-05f, +1.552705567e-04f, +1.342466589e-04f, +6.715051279e-06f, -5.915235252e-05f, -3.575012473e-05f, +4.413538483e-06f,\n    /*  5,22 (48) */\n    -2.526755289e-04f, +6.159892657e-05f, +8.132929023e-04f, +1.229219772e-03f, +2.761045433e-04f, -1.953719622e-03f, -3.472726928e-03f, -1.764151443e-03f, +3.237138622e-03f, +7.525892136e-03f, +5.600158101e-03f, -3.742721902e-03f, -1.375340227e-02f, -1.352905865e-02f, +1.692682847e-03f, +2.240744682e-02f, +2.864536352e-02f, +6.500100002e-03f, -3.458945564e-02f, -6.041661592e-02f, -3.279556776e-02f, +5.985205727e-02f, +1.859474689e-01f, +2.844434858e-01f, +3.023012975e-01f, +2.295849358e-01f, +1.061793204e-01f, -4.925598463e-03f, -5.781297067e-02f, -4.834869152e-02f, -8.108219891e-03f, +2.378725791e-02f, +2.753675359e-02f, +9.789571990e-03f, -9.408850104e-03f, -1.537783108e-02f, -8.003435496e-03f, +2.777769623e-03f, +7.752926082e-03f, +5.245700847e-03f, -1.436191744e-04f, -3.298473769e-03f, -2.758527925e-03f, -4.785966790e-04f, +1.066950874e-03f, +1.071022817e-03f, +3.163728156e-04f, -1.999402864e-04f,\n    -1.298450182e-06f, -1.827965033e-05f, -2.428425610e-05f, +3.665842204e-06f, +5.453725787e-05f, +7.331418729e-05f, +8.675864377e-06f, -1.134294190e-04f, -1.753158955e-04f, -6.402320883e-05f, +1.858378263e-04f, +3.563192359e-04f, +2.110715010e-04f, -2.418212370e-04f, -6.469163482e-04f, -5.380461344e-04f, +2.089933721e-04f, +1.101873560e-03f, +1.272692875e-03f, +1.587382800e-04f, -1.894569207e-03f, -3.672094116e-03f, -3.864674442e-03f, -2.049143015e-03f, +9.010570422e-04f, +3.347710544e-03f, +3.994045556e-03f, +2.733352090e-03f, +6.168332849e-04f, -9.795239089e-04f, -1.305465301e-03f, -6.009047662e-04f, +2.977595724e-04f, +6.842550870e-04f, +4.406445511e-04f, -5.103677261e-05f, -3.429422056e-04f, -2.805219773e-04f, -2.980895653e-05f, +1.536146589e-04f, +1.539711284e-04f, +3.911811091e-05f, -5.803114002e-05f, -6.986635178e-05f, -2.392580611e-05f, +1.751380594e-05f, +2.368389901e-05f, +7.763007857e-06f,\n    +5.041228121e-04f, +4.684523500e-04f, -8.386340443e-04f, -2.502607995e-03f, -1.671564710e-03f, +2.889308604e-03f, +7.022954081e-03f, +3.857371771e-03f, -7.026155510e-03f, -1.476940467e-02f, -6.882022052e-03f, +1.367198280e-02f, +2.549810488e-02f, +1.014982897e-02f, -2.247678342e-02f, -3.771576378e-02f, -1.277010236e-02f, +3.212498523e-02f, +4.891556668e-02f, +1.390945093e-02f, -4.056537951e-02f, -5.634918672e-02f, -1.316667454e-02f, +4.565266287e-02f, +5.803280438e-02f, +1.076557078e-02f, -4.595158665e-02f, -5.352298645e-02f, -7.455599217e-03f, +4.132722598e-02f, +4.408552023e-02f, +4.175083971e-03f, -3.302116624e-02f, -3.217822554e-02f, -1.661998956e-03f, +2.316466389e-02f, +2.050885756e-02f, +2.124551303e-04f, -1.396522627e-02f, -1.111826442e-02f, +3.159521796e-04f, +6.956562969e-03f, +4.879778429e-03f, -3.060282253e-04f, -2.638516856e-03f, -1.552526508e-03f, +1.342136227e-04f, +6.021623429e-04f,\n    -1.163351217e-05f, +1.856276310e-05f, +5.771326009e-05f, +3.026215731e-05f, -8.790692255e-05f, -1.721186407e-04f, -4.851943780e-05f, +2.439221649e-04f, +3.711605712e-04f, +4.646103780e-05f, -5.111540984e-04f, -6.461654956e-04f, +6.897906872e-07f, +8.813559796e-04f, +9.536645096e-04f, -1.096475668e-04f, -1.302433720e-03f, -1.223993503e-03f, +2.758324854e-04f, +1.686356674e-03f, +1.384900566e-03f, -4.681835516e-04f, -1.936466895e-03f, -1.390018391e-03f, +6.371072837e-04f, +1.983563450e-03f, +1.238195732e-03f, -7.333838297e-04f, -1.813865457e-03f, -9.737735056e-04f, +7.290091656e-04f, +1.474859304e-03f, +6.677900939e-04f, -6.290918642e-04f, -1.055975683e-03f, -3.899292429e-04f, +4.685544326e-04f, +6.538037531e-04f, +1.850008703e-04f, -2.957778293e-04f, -3.387264748e-04f, -6.391070698e-05f, +1.522636143e-04f, +1.375771734e-04f, +1.035235536e-05f, -5.869505005e-05f, -3.715664369e-05f, +3.568207542e-06f,\n    /*  5,23 (48) */\n    -2.539739791e-04f, +4.331927624e-05f, +7.890086462e-04f, +1.232885614e-03f, +3.306418012e-04f, -1.880405434e-03f, -3.464051064e-03f, -1.877580862e-03f, +3.061822726e-03f, +7.461868927e-03f, +5.785995928e-03f, -3.386402666e-03f, -1.354233076e-02f, -1.377087989e-02f, +1.045766499e-03f, +2.186940069e-02f, +2.885435689e-02f, +7.601973562e-03f, -3.331676276e-02f, -6.025787764e-02f, -3.469013697e-02f, +5.617996315e-02f, +1.820827945e-01f, +2.823943428e-01f, +3.032023546e-01f, +2.329326463e-01f, +1.101733660e-01f, -2.192246374e-03f, -5.719613739e-02f, -4.932821543e-02f, -9.413685192e-03f, +2.318635314e-02f, +2.783451316e-02f, +1.047382708e-02f, -8.968205553e-03f, -1.542886786e-02f, -8.346377701e-03f, +2.497247646e-03f, +7.723117125e-03f, +5.399315506e-03f, +1.035195406e-05f, -3.259355658e-03f, -2.816559065e-03f, -5.484630308e-04f, +1.043025068e-03f, +1.088536623e-03f, +3.400567146e-04f, -1.921772785e-04f,\n    -8.721441469e-07f, -1.776540592e-05f, -2.454249926e-05f, +2.257867657e-06f, +5.307786957e-05f, +7.385392033e-05f, +1.197661495e-05f, -1.097713294e-04f, -1.756631414e-04f, -7.031130021e-05f, +1.777800534e-04f, +3.549124572e-04f, +2.212530097e-04f, -2.258336362e-04f, -6.400048148e-04f, -5.519779693e-04f, +1.793641383e-04f, +1.080349702e-03f, +1.285807117e-03f, +2.122664403e-04f, -1.826925267e-03f, -3.635109170e-03f, -3.890225612e-03f, -2.130568273e-03f, +8.076191064e-04f, +3.294301130e-03f, +4.005675560e-03f, +2.793121386e-03f, +6.814618109e-04f, -9.475502706e-04f, -1.314377916e-03f, -6.306148736e-04f, +2.750605043e-04f, +6.827411283e-04f, +4.546741100e-04f, -3.689334343e-05f, -3.393552354e-04f, -2.867170601e-04f, -3.775903377e-05f, +1.505870813e-04f, +1.563900589e-04f, +4.305954150e-05f, -5.620943877e-05f, -7.068967762e-05f, -2.558345201e-05f, +1.672406700e-05f, +2.396806258e-05f, +8.313625809e-06f,\n    +4.924893000e-04f, +4.870151131e-04f, -7.809207842e-04f, -2.472345838e-03f, -1.759471632e-03f, +2.717189964e-03f, +6.974434643e-03f, +4.101293936e-03f, -6.654994938e-03f, -1.472294363e-02f, -7.393176150e-03f, +1.302581730e-02f, +2.549879468e-02f, +1.103118495e-02f, -2.152311891e-02f, -3.782541135e-02f, -1.407253608e-02f, +3.090099172e-02f, +4.919139917e-02f, +1.559580760e-02f, -3.918047895e-02f, -5.681737027e-02f, -1.510314144e-02f, +4.426264447e-02f, +5.866991166e-02f, +1.274913423e-02f, -4.471339091e-02f, -5.425637028e-02f, -9.269464674e-03f, +4.035345248e-02f, +4.481452940e-02f, +5.649943275e-03f, -3.235337614e-02f, -3.280731741e-02f, -2.717974638e-03f, +2.277473465e-02f, +2.097741199e-02f, +8.662588835e-04f, -1.378022540e-02f, -1.141404225e-02f, -2.277429524e-05f, +6.892652262e-03f, +5.032042043e-03f, -1.684510519e-04f, -2.628164501e-03f, -1.611221558e-03f, +9.705697900e-05f, +6.057305505e-04f,\n    -1.199389677e-05f, +1.717459974e-05f, +5.708508235e-05f, +3.271562375e-05f, -8.371623530e-05f, -1.719969615e-04f, -5.602317951e-05f, +2.351112459e-04f, +3.734894680e-04f, +6.288388262e-05f, -4.965161516e-04f, -6.540016554e-04f, -2.824672336e-05f, +8.611594400e-04f, +9.704204222e-04f, -6.646319794e-05f, -1.278821250e-03f, -1.252124341e-03f, +2.197990000e-04f, +1.662940582e-03f, +1.424572536e-03f, -4.040820973e-04f, -1.917187310e-03f, -1.438445122e-03f, +5.720388143e-04f, +1.971295339e-03f, +1.290092373e-03f, -6.747407438e-04f, -1.809432872e-03f, -1.022848338e-03f, +6.823223727e-04f, +1.476919655e-03f, +7.086615254e-04f, -5.966591145e-04f, -1.061782430e-03f, -4.196341833e-04f, +4.493521809e-04f, +6.604135915e-04f, +2.034810611e-04f, -2.865252041e-04f, -3.440429587e-04f, -7.339249953e-05f, +1.490034349e-04f, +1.407945597e-04f, +1.406085667e-05f, -5.813984021e-05f, -3.854746139e-05f, +2.686215319e-06f,\n    /*  5,24 (48) */\n    -2.548461232e-04f, +2.555387032e-05f, +7.644661469e-04f, +1.235143482e-03f, +3.837196708e-04f, -1.806551514e-03f, -3.452074449e-03f, -1.987352192e-03f, +2.886159585e-03f, +7.391557627e-03f, +5.963775981e-03f, -3.031490209e-03f, -1.332107775e-02f, -1.399671352e-02f, +4.057616846e-04f, +2.131742272e-02f, +2.903372103e-02f, +8.682323264e-03f, -3.203095565e-02f, -6.004561120e-02f, -3.651706223e-02f, +5.254485398e-02f, +1.781925688e-01f, +2.802637745e-01f, +3.040099737e-01f, +2.362269475e-01f, +1.141790415e-01f, +6.008750117e-04f, -5.651467558e-02f, -5.027576570e-02f, -1.072806311e-02f, +2.255573827e-02f, +2.810957367e-02f, +1.115656820e-02f, -8.513531443e-03f, -1.546576120e-02f, -8.685732937e-03f, +2.210530586e-03f, +7.685358092e-03f, +5.549902587e-03f, +1.667420129e-04f, -3.216296117e-03f, -2.872768504e-03f, -6.191527084e-04f, +1.017441616e-03f, +1.105260690e-03f, +3.640247771e-04f, -1.838636527e-04f,\n    -4.580078570e-07f, -1.724180117e-05f, -2.476498981e-05f, +8.777214654e-07f, +5.158945309e-05f, +7.430614754e-05f, +1.520990028e-05f, -1.060594193e-04f, -1.758302573e-04f, -7.644236730e-05f, +1.696565939e-04f, +3.531811281e-04f, +2.310957910e-04f, -2.098269225e-04f, -6.325743348e-04f, -5.652252355e-04f, +1.499382191e-04f, +1.058123249e-03f, +1.297591698e-03f, +2.647703935e-04f, -1.759068952e-03f, -3.596530898e-03f, -3.913691982e-03f, -2.210770639e-03f, +7.137124599e-04f, +3.239051608e-03f, +4.015321239e-03f, +2.851982022e-03f, +7.466178985e-04f, -9.142539476e-04f, -1.322210214e-03f, -6.601205199e-04f, +2.518208778e-04f, +6.805605342e-04f, +4.684408418e-04f, -2.253768358e-05f, -3.353918321e-04f, -2.927125456e-04f, -4.578169855e-05f, +1.473641109e-04f, +1.586868851e-04f, +4.702111702e-05f, -5.429598519e-05f, -7.145175848e-05f, -2.724700567e-05f, +1.589591286e-05f, +2.422880418e-05f, +8.868877284e-06f,\n    +4.804954032e-04f, +5.041897128e-04f, -7.238357019e-04f, -2.439630214e-03f, -1.843187868e-03f, +2.545193002e-03f, +6.918411464e-03f, +4.336405182e-03f, -6.281505470e-03f, -1.466005975e-02f, -7.889692302e-03f, +1.237181565e-02f, +2.547054795e-02f, +1.189234439e-02f, -2.055269849e-02f, -3.789187454e-02f, -1.535135733e-02f, +2.964886738e-02f, +4.941119817e-02f, +1.725874818e-02f, -3.775590641e-02f, -5.722145237e-02f, -1.702032875e-02f, +4.282419935e-02f, +5.924195048e-02f, +1.472042957e-02f, -4.342329854e-02f, -5.493111103e-02f, -1.107889755e-02f, +3.933060414e-02f, +4.549685177e-02f, +7.126862931e-03f, -3.164471462e-02f, -3.340397652e-02f, -3.779757068e-03f, +2.235510046e-02f, +2.142676417e-02f, +1.526672475e-03f, -1.357674434e-02f, -1.170056746e-02f, -3.668172540e-04f, +6.819259763e-03f, +5.181045478e-03f, -2.765649223e-05f, -2.614103644e-03f, -1.669361398e-03f, +5.850951761e-05f, +6.084167658e-04f,\n    -1.231862419e-05f, +1.580284829e-05f, +5.639053797e-05f, +3.506461595e-05f, -7.950518296e-05f, -1.716572328e-04f, -6.332576399e-05f, +2.261509316e-04f, +3.753330419e-04f, +7.901772440e-05f, -4.814633604e-04f, -6.609863865e-04f, -5.687146046e-05f, +8.401394188e-04f, +9.859275928e-04f, -2.349719803e-05f, -1.253885324e-03f, -1.278680614e-03f, +1.637582340e-04f, +1.637716154e-03f, +1.462515425e-03f, -3.396523490e-04f, -1.895757366e-03f, -1.485213656e-03f, +5.063084046e-04f, +1.956777258e-03f, +1.340610040e-03f, -6.151864918e-04f, -1.802922556e-03f, -1.070949660e-03f, +6.346300523e-04f, +1.477293135e-03f, +7.489789079e-04f, -5.632960958e-04f, -1.066399226e-03f, -4.491216100e-04f, +4.294212432e-04f, +6.663114089e-04f, +2.219489135e-04f, -2.767945562e-04f, -3.490151391e-04f, -8.294247518e-05f, +1.454898128e-04f, +1.438921311e-04f, +1.783680397e-05f, -5.748515713e-05f, -3.991988566e-05f, +1.768012448e-06f,\n    /*  5,25 (48) */\n    -2.553041311e-04f, +8.312069153e-06f, +7.397011571e-04f, +1.236021203e-03f, +4.353091239e-04f, -1.732245367e-03f, -3.436864548e-03f, -2.093411611e-03f, +2.710329328e-03f, +7.315115260e-03f, +6.133432575e-03f, -2.678309081e-03f, -1.308998196e-02f, -1.420654044e-02f, -2.268126503e-04f, +2.075219748e-02f, +2.918365925e-02f, +9.740446513e-03f, -3.073336395e-02f, -5.978084081e-02f, -3.827613119e-02f, +4.894832309e-02f, +1.742788769e-01f, +2.780530039e-01f, +3.047236861e-01f, +2.394659991e-01f, +1.181943628e-01f, +3.452857034e-03f, -5.576805768e-02f, -5.119001965e-02f, -1.205027332e-02f, +2.189561775e-02f, +2.836139455e-02f, +1.183712874e-02f, -8.045090601e-03f, -1.548829888e-02f, -9.021124769e-03f, +1.917818040e-03f, +7.639576393e-03f, +5.697266698e-03f, +3.254288980e-04f, -3.169275000e-03f, -2.927064489e-03f, -6.906044669e-04f, +9.901946107e-04f, +1.121156602e-03f, +3.882535813e-04f, -1.749947754e-04f,\n    -5.634856882e-08f, -1.670976246e-05f, -2.495223275e-05f, -4.735395420e-07f, +5.007421371e-05f, +7.467188368e-05f, +1.837338947e-05f, -1.022983425e-04f, -1.758196513e-04f, -8.241240968e-05f, +1.614763310e-04f, +3.511310192e-04f, +2.405944913e-04f, -1.938165692e-04f, -6.246380358e-04f, -5.777838078e-04f, +1.207398156e-04f, +1.035222544e-03f, +1.308054313e-03f, +3.162242503e-04f, -1.691046668e-03f, -3.556393705e-03f, -3.935068360e-03f, -2.289705519e-03f, +6.193914536e-04f, +3.181989019e-03f, +4.022965919e-03f, +2.909889168e-03f, +8.122621241e-04f, -8.796439193e-04f, -1.328941313e-03f, -6.893924609e-04f, +2.280557008e-04f, +6.777073783e-04f, +4.819284022e-04f, -7.981125454e-06f, -3.310511696e-04f, -2.984998835e-04f, -5.386984442e-05f, +1.439462797e-04f, +1.608573953e-04f, +5.099895153e-05f, -5.229130969e-05f, -7.215062819e-05f, -2.891464378e-05f, +1.502953948e-05f, +2.446523357e-05f, +9.428075830e-06f,\n    +4.681767790e-04f, +5.199925611e-04f, -6.674451639e-04f, -2.404565598e-03f, -1.922693051e-03f, +2.373535769e-03f, +6.855085700e-03f, +4.562556114e-03f, -5.906172429e-03f, -1.458104203e-02f, -8.371155662e-03f, +1.171082926e-02f, +2.541367649e-02f, +1.273248380e-02f, -1.956677089e-02f, -3.791537174e-02f, -1.660524265e-02f, +2.837018677e-02f, +4.957495640e-02f, +1.889646434e-02f, -3.629339099e-02f, -5.756110472e-02f, -1.891608611e-02f, +4.133898570e-02f, +5.974825888e-02f, +1.667720682e-02f, -4.208268850e-02f, -5.554629752e-02f, -1.288182010e-02f, +3.825965448e-02f, +4.613148183e-02f, +8.604156065e-03f, -3.089573571e-02f, -3.396727262e-02f, -4.846156295e-03f, +2.190597885e-02f, +2.185618541e-02f, +2.192983884e-03f, -1.335479543e-02f, -1.197736201e-02f, -7.158323930e-04f, +6.736317288e-03f, +5.326535291e-03f, +1.162356389e-04f, -2.596266840e-03f, -1.726846555e-03f, +1.858963195e-05f, +6.101847783e-04f,\n    -1.260821934e-05f, +1.444930562e-05f, +5.563235826e-05f, +3.730813087e-05f, -7.527996901e-05f, -1.711039439e-04f, -7.042111331e-05f, +2.170548800e-04f, +3.766957546e-04f, +9.484636779e-05f, -4.660188261e-04f, -6.671201672e-04f, -8.515313225e-05f, +8.183278745e-04f, +1.000177170e-03f, +1.920138852e-05f, -1.227662917e-03f, -1.303639304e-03f, +1.077754521e-04f, +1.610719037e-03f, +1.498689992e-03f, -2.749696122e-04f, -1.872204622e-03f, -1.530270760e-03f, +4.399920438e-04f, +1.940023976e-03f, +1.389687861e-03f, -5.547880913e-04f, -1.794335564e-03f, -1.118017518e-03f, +5.859833326e-04f, +1.475970030e-03f, +7.886911375e-04f, -5.290357102e-04f, -1.069810928e-03f, -4.783540991e-04f, +4.087784712e-04f, +6.714820789e-04f, +2.403814012e-04f, -2.665916643e-04f, -3.536315659e-04f, -9.254930693e-05f, +1.417228871e-04f, +1.468632456e-04f, +2.167626924e-05f, -5.672955354e-05f, -4.127118779e-05f, +8.141264825e-07f,\n    /*  5,26 (48) */\n    -2.553604797e-04f, -8.397693308e-06f, +7.147489243e-04f, +1.235547664e-03f, +4.853833376e-04f, -1.657573483e-03f, -3.418491159e-03f, -2.195709953e-03f, +2.534509676e-03f, +7.232702850e-03f, +6.294908906e-03f, -2.327178061e-03f, -1.284938747e-02f, -1.440035701e-02f, -8.514506861e-04f, +2.017441367e-02f, +2.930439907e-02f, +1.077566906e-02f, -2.942530964e-02f, -5.946461656e-02f, -3.996717785e-02f, +4.539192938e-02f, +1.703438085e-01f, +2.757632984e-01f, +3.053430776e-01f, +2.426479881e-01f, +1.222173287e-01f, +6.362746202e-03f, -5.495579556e-02f, -5.206966357e-02f, -1.337921463e-02f, +2.120622529e-02f, +2.858945025e-02f, +1.251483612e-02f, -7.563162199e-03f, -1.549628001e-02f, -9.352175938e-03f, +1.619318156e-03f, +7.585706549e-03f, +5.841212978e-03f, +4.862862933e-04f, -3.118276048e-03f, -2.979355799e-03f, -7.627550950e-04f, +9.612799669e-04f, +1.136186142e-03f, +4.127188149e-04f, -1.655666996e-04f,\n    +3.325513140e-07f, -1.617020805e-05f, -2.510476735e-05f, -1.794912561e-06f, +4.853434916e-05f, +7.495222276e-05f, +2.146486268e-05f, -9.849273735e-05f, -1.756338820e-04f, -8.821764323e-05f, +1.532480920e-04f, +3.487681447e-04f, +2.497441538e-04f, -1.778178744e-04f, -6.162093691e-04f, -5.896502377e-04f, +9.179265262e-05f, +1.011676179e-03f, +1.317203614e-03f, +3.666031161e-04f, -1.622904620e-03f, -3.514732883e-03f, -3.954350967e-03f, -2.367329218e-03f, +5.247107342e-04f, +3.123141668e-03f, +4.028594211e-03f, +2.966798390e-03f, +8.783544077e-04f, -8.437302523e-04f, -1.334551005e-03f, -7.184013214e-04f, +2.037806323e-04f, +6.741762959e-04f, +4.951205242e-04f, +6.764669129e-06f, -3.263327849e-04f, -3.040706252e-04f, -6.201620534e-05f, +1.403343294e-04f, +1.628974510e-04f, +5.498908266e-05f, -5.019605233e-05f, -7.278435928e-05f, -3.058450494e-05f, +1.412519415e-05f, +2.467647407e-05f, +9.990514341e-06f,\n    +4.555685597e-04f, +5.344418668e-04f, -6.118128057e-04f, -2.367257467e-03f, -1.997973020e-03f, +2.202431825e-03f, +6.784664586e-03f, +4.779610994e-03f, -5.529476674e-03f, -1.448619566e-02f, -8.837174489e-03f, +1.104370909e-02f, +2.532852336e-02f, +1.355081168e-02f, -1.856659372e-02f, -3.789617035e-02f, -1.783290557e-02f, +2.706654746e-02f, +4.968273185e-02f, +2.050718337e-02f, -3.479470099e-02f, -5.783607433e-02f, -2.078829074e-02f, +3.980871493e-02f, +6.018825092e-02f, +1.861723080e-02f, -4.069300064e-02f, -5.610108561e-02f, -1.467615567e-02f, +3.714163696e-02f, +4.671746516e-02f, +1.008012610e-02f, -3.010704457e-02f, -3.449630833e-02f, -5.915967223e-03f, +2.142762475e-02f, +2.226496388e-02f, +2.864465963e-03f, -1.311441403e-02f, -1.224395368e-02f, -1.069463959e-03f, +6.643767981e-03f, +5.468258178e-03f, +2.630988845e-04f, -2.574590571e-03f, -1.783576109e-03f, -2.268155584e-05f, +6.109989047e-04f,\n    -1.286325678e-05f, +1.311569267e-05f, +5.481331037e-05f, +3.944534245e-05f, -7.104669728e-05f, -1.703417977e-04f, -7.730352398e-05f, +2.078367251e-04f, +3.775826245e-04f, +1.103542023e-04f, -4.502058804e-04f, -6.724045223e-04f, -1.130611588e-04f, +7.957574627e-04f, +1.013161888e-03f, +6.158416111e-05f, -1.200192326e-03f, -1.326979411e-03f, +5.191557569e-05f, +1.581986859e-03f, +1.533059196e-03f, -2.101093419e-04f, -1.846559109e-03f, -1.573565251e-03f, +3.731664260e-04f, +1.921052916e-03f, +1.437266567e-03f, -4.936137165e-04f, -1.783675417e-03f, -1.163992963e-03f, +5.364347167e-04f, +1.472942613e-03f, +8.277475240e-04f, -4.939121784e-04f, -1.072003745e-03f, -5.072942109e-04f, +3.874417647e-04f, +6.759112251e-04f, +2.587552704e-04f, -2.559229908e-04f, -3.578810928e-04f, -1.022014149e-04f, +1.377031470e-04f, +1.497013158e-04f, +2.557515028e-05f, -5.587170545e-05f, -4.259860619e-05f, -1.748371843e-07f,\n    /*  5,27 (48) */\n    -2.550279284e-04f, -2.456790136e-05f, +6.896441570e-04f, +1.233752751e-03f, +5.339176868e-04f, -1.582621260e-03f, -3.397026296e-03f, -2.294202691e-03f, +2.358875794e-03f, +7.144485207e-03f, +6.448156998e-03f, -1.978409917e-03f, -1.259964332e-02f, -1.457817489e-02f, -1.467660055e-03f, +1.958476344e-02f, +2.939619172e-02f, +1.178734524e-02f, -2.810810602e-02f, -5.909801344e-02f, -4.159008247e-02f, +4.187719650e-02f, +1.663894575e-01f, +2.733959691e-01f, +3.058677883e-01f, +2.457711298e-01f, +1.262459229e-01f, +9.329544592e-03f, -5.407744115e-02f, -5.291339382e-02f, -1.471376564e-02f, +2.048782397e-02f, +2.879323088e-02f, +1.318901241e-02f, -7.068041675e-03f, -1.548951534e-02f, -9.678508723e-03f, +1.315247531e-03f, +7.523690343e-03f, +5.981547307e-03f, +6.491837443e-04f, -3.063286966e-03f, -3.029551851e-03f, -8.355394543e-04f, +9.306954619e-04f, +1.150311336e-03f, +4.373952890e-04f, -1.555761852e-04f,\n    +7.084341628e-07f, -1.562404701e-05f, -2.522316587e-05f, -3.085449097e-06f, +4.697204714e-05f, +7.514833557e-05f, +2.448221192e-05f, -9.464722144e-05f, -1.752756536e-04f, -9.385450125e-05f, +1.449806409e-04f, +3.460987533e-04f, +2.585402193e-04f, -1.618459476e-04f, -6.073020941e-04f, -6.008217499e-04f, +6.311996246e-05f, +9.875129711e-04f, +1.325049194e-03f, +4.158831038e-04f, -1.554688781e-03f, -3.471584587e-03f, -3.971537433e-03f, -2.443598970e-03f, +4.297252058e-04f, +3.062539108e-03f, +4.032192029e-03f, +3.022665690e-03f, +9.448540396e-04f, -8.065241007e-04f, -1.339019774e-03f, -7.471176191e-04f, +1.790119753e-04f, +6.699624954e-04f, +5.080010344e-04f, +2.168771654e-05f, -3.212365825e-04f, -3.094164336e-04f, -7.021336113e-05f, +1.365292130e-04f, +1.648029922e-04f, +5.898747491e-05f, -4.801096373e-05f, -7.335106579e-05f, -3.225469128e-05f, +1.318317613e-05f, +2.486166402e-05f, +1.055546563e-05f,\n    +4.427053029e-04f, +5.475575594e-04f, -5.569994953e-04f, -2.327812125e-03f, -2.069019717e-03f, +2.032090028e-03f, +6.707361062e-03f, +4.987447719e-03f, -5.151894049e-03f, -1.437584146e-02f, -9.287380369e-03f, +1.037130457e-02f, +2.521546220e-02f, +1.434656914e-02f, -1.755343184e-02f, -3.783458619e-02f, -1.903309789e-02f, +2.573956805e-02f, +4.973464743e-02f, +2.208917023e-02f, -3.326164180e-02f, -5.804618367e-02f, -2.263484985e-02f, +3.823514968e-02f, +6.056141735e-02f, +2.053828372e-02f, -3.925573407e-02f, -5.659469933e-02f, -1.645983108e-02f, +3.597764400e-02f, +4.725389987e-02f, +1.155306871e-02f, -2.927929705e-02f, -3.499022051e-02f, -6.987970968e-03f, +2.092033054e-02f, +2.265240565e-02f, +3.540377188e-03f, -1.285565876e-02f, -1.249987667e-02f, -1.427345052e-03f, +6.541566566e-03f, +5.605961325e-03f, +4.128002002e-04f, -2.549015421e-03f, -1.839447814e-03f, -6.528016204e-05f, +6.108240676e-04f,\n    -1.308435842e-05f, +1.180365334e-05f, +5.393619212e-05f, +4.147559932e-05f, -6.681136497e-05f, -1.693757007e-04f, -8.396766904e-05f, +1.985100593e-04f, +3.779992129e-04f, +1.255262157e-04f, -4.340480528e-04f, -6.768420109e-04f, -1.405657006e-04f, +7.724614896e-04f, +1.024876061e-03f, +1.036034182e-04f, -1.171513123e-03f, -1.348681970e-03f, -3.756894563e-06f, +1.551559172e-03f, +1.565588232e-03f, -1.451470514e-04f, -1.818853291e-03f, -1.615048053e-03f, +3.059088574e-04f, +1.899884136e-03f, +1.483288570e-03f, -4.317326185e-04f, -1.770948110e-03f, -1.208818120e-03f, +4.860380252e-04f, +1.468205161e-03f, +8.660978565e-04f, -4.579610073e-04f, -1.072965264e-03f, -5.359045371e-04f, +3.654300590e-04f, +6.795852465e-04f, +2.770470667e-04f, -2.447956822e-04f, -3.617528960e-04f, -1.118869784e-04f, +1.334314370e-04f, +1.523998194e-04f, +2.952917350e-05f, -5.491041683e-05f, -4.389935025e-05f, -1.198194503e-06f,\n    /*  5,28 (48) */\n    -2.543194942e-04f, -4.019194836e-05f, +6.644209911e-04f, +1.230667302e-03f, +5.808897339e-04f, -1.507472925e-03f, -3.372544084e-03f, -2.388849912e-03f, +2.183600141e-03f, +7.050630706e-03f, +6.593137639e-03f, -1.632311164e-03f, -1.234110310e-02f, -1.474002084e-02f, -2.074962149e-03f, +1.898394169e-02f, +2.945931168e-02f, +1.277485821e-02f, -2.678305683e-02f, -5.868213034e-02f, -4.314477126e-02f, +3.840561191e-02f, +1.624179201e-01f, +2.709523702e-01f, +3.062975135e-01f, +2.488336689e-01f, +1.302781149e-01f, +1.235221028e-02f, -5.313258711e-02f, -5.371991792e-02f, -1.605278541e-02f, +1.974070635e-02f, +2.897224286e-02f, +1.385897491e-02f, -6.560040640e-03f, -1.546782762e-02f, -9.999745306e-03f, +1.005831098e-03f, +7.453476982e-03f, +6.118076521e-03f, +8.139867365e-04f, -3.004299491e-03f, -3.077562815e-03f, -9.088905201e-04f, +8.984407707e-04f, +1.163494512e-03f, +4.622569530e-04f, -1.450207196e-04f,\n    +1.071067014e-06f, -1.507217817e-05f, -2.530803227e-05f, -4.344255180e-06f, +4.538948299e-05f, +7.526146721e-05f, +2.742344173e-05f, -9.076638712e-05f, -1.747478114e-04f, -9.931963539e-05f, +1.366826693e-04f, +3.431293195e-04f, +2.669785256e-04f, -1.459156977e-04f, -5.979302622e-04f, -6.112962379e-04f, +3.474447002e-05f, +9.627619319e-04f, +1.331601571e-03f, +4.640413452e-04f, -1.486444859e-03f, -3.426985803e-03f, -3.986626796e-03f, -2.518472968e-03f, +3.344899904e-04f, +3.000212120e-03f, +4.033746599e-03f, +3.077447539e-03f, +1.011719708e-03f, -7.680377050e-04f, -1.342328824e-03f, -7.755117888e-04f, +1.537666687e-04f, +6.650617683e-04f, +5.205538694e-04f, +3.677571941e-05f, -3.157628388e-04f, -3.145290927e-04f, -7.845374324e-05f, +1.325320967e-04f, +1.665700430e-04f, +6.299002298e-05f, -4.573690588e-05f, -7.384890615e-05f, -3.392327012e-05f, +1.220383718e-05f, +2.501995817e-05f, +1.112218308e-05f,\n    +4.296209445e-04f, +5.593612128e-04f, -5.030633032e-04f, -2.286336525e-03f, -2.135831082e-03f, +1.862714327e-03f, +6.623393393e-03f, +5.185957778e-03f, -4.773894837e-03f, -1.425031524e-02f, -9.721428422e-03f, +9.694462559e-03f, +2.507489650e-02f, +1.511903063e-02f, -1.652855578e-02f, -3.773098278e-02f, -2.020461102e-02f, +2.439088608e-02f, +4.973089053e-02f, +2.364072940e-02f, -3.169605357e-02f, -5.819133072e-02f, -2.445370314e-02f, +3.662010163e-02f, +6.086732621e-02f, +2.243816785e-02f, -3.777244550e-02f, -5.702643195e-02f, -1.823077919e-02f, +3.476882588e-02f, +4.773993790e-02f, +1.302127387e-02f, -2.841319919e-02f, -3.544818151e-02f, -8.060936232e-03f, +2.038442601e-02f, +2.301783571e-02f, +4.219962434e-03f, -1.257861169e-02f, -1.274467235e-02f, -1.789097948e-03f, +6.429679587e-03f, +5.739392762e-03f, +5.652000196e-04f, -2.519486247e-03f, -1.894358231e-03f, -1.091795123e-04f, +6.096258730e-04f,\n    -1.327219129e-05f, +1.051475348e-05f, +5.300382693e-05f, +4.339842234e-05f, -6.257985583e-05f, -1.682107523e-04f, -9.040859955e-05f, +1.890884151e-04f, +3.779516098e-04f, +1.403480063e-04f, -4.175690386e-04f, -6.804362127e-04f, -1.676376893e-04f, +7.484738657e-04f, +1.035315582e-03f, +1.452122113e-04f, -1.141666093e-03f, -1.368730061e-03f, -5.917795491e-05f, +1.519477402e-03f, +1.596244569e-03f, -8.015822091e-05f, -1.789122022e-03f, -1.654672260e-03f, +2.382971639e-04f, +1.876540307e-03f, +1.527698035e-03f, -3.692150440e-04f, -1.756162112e-03f, -1.252436269e-03f, +4.348483358e-04f, +1.461753968e-03f, +9.036924671e-04f, -4.212189541e-04f, -1.072684480e-03f, -5.641477479e-04f, +3.427633103e-04f, +6.824913432e-04f, +2.952331641e-04f, -2.332175677e-04f, -3.652364931e-04f, -1.215939488e-04f, +1.289089615e-04f, +1.549523100e-04f, +3.353389702e-05f, -5.384462416e-05f, -4.517060431e-05f, -2.255182080e-06f,\n    /*  5,29 (48) */\n    -2.532484272e-04f, -5.526412654e-05f, +6.391129589e-04f, +1.226323047e-03f, +6.262792169e-04f, -1.432211457e-03f, -3.345120643e-03f, -2.479616299e-03f, +2.008852329e-03f, +6.951311070e-03f, +6.729820308e-03f, -1.289181844e-03f, -1.207412457e-02f, -1.488593653e-02f, -2.672892411e-03f, +1.837264545e-02f, +2.949405615e-02f, +1.373762014e-02f, -2.545145526e-02f, -5.821808899e-02f, -4.463121611e-02f, +3.497862611e-02f, +1.584312933e-01f, +2.684338972e-01f, +3.066320035e-01f, +2.518338810e-01f, +1.343118615e-01f, +1.542965782e-02f, -5.212086740e-02f, -5.448795563e-02f, -1.739511424e-02f, +1.896519456e-02f, +2.912600952e-02f, +1.452403668e-02f, -6.039486771e-03f, -1.543105190e-02f, -1.031550814e-02f, +6.913020049e-04f, +7.375023239e-03f, +6.250608617e-03f, +9.805567796e-04f, -2.941309468e-03f, -3.123299721e-03f, -9.827394263e-04f, +8.645175005e-04f, +1.175698349e-03f, +4.872769112e-04f, -1.338985365e-04f,\n    +1.420241427e-06f, -1.451548917e-05f, -2.536000083e-05f, -5.570491509e-06f, +4.378881732e-05f, +7.529293449e-05f, +3.028666972e-05f, -8.685479693e-05f, -1.740533367e-04f, -1.046099163e-04f, +1.283627894e-04f, +3.398665344e-04f, +2.750553076e-04f, -1.300418210e-04f, -5.881082002e-04f, -6.210722581e-04f, +6.688377871e-06f, +9.374522451e-04f, +1.336872173e-03f, +5.110560018e-04f, -1.418218264e-03f, -3.380974317e-03f, -3.999619503e-03f, -2.591910390e-03f, +2.390603885e-04f, +2.936192693e-03f, +4.033246478e-03f, +3.131100912e-03f, +1.078909526e-03f, -7.282843910e-04f, -1.344460098e-03f, -8.035542069e-04f, +1.280622791e-04f, +6.594704999e-04f, +5.327630927e-04f, +5.201607505e-05f, -3.099122062e-04f, -3.194005173e-04f, -8.672964061e-05f, +1.283443613e-04f, +1.681947169e-04f, +6.699255526e-05f, -4.337485293e-05f, -7.427608600e-05f, -3.558827568e-05f, +1.118758209e-05f, +2.515052909e-05f, +1.168990126e-05f,\n    +4.163487532e-04f, +5.698759662e-04f, -4.500594762e-04f, -2.242938103e-03f, -2.198410938e-03f, +1.694503575e-03f, +6.532984794e-03f, +5.375046193e-03f, -4.395943227e-03f, -1.410996723e-02f, -1.013899746e-02f, +9.014026346e-03f, +2.490725881e-02f, +1.586750450e-02f, -1.549324019e-02f, -3.758577056e-02f, -2.134627711e-02f, +2.302215602e-02f, +4.967171258e-02f, +2.516020681e-02f, -3.009980900e-02f, -5.827148895e-02f, -2.624282516e-02f, +3.496542937e-02f, +6.110562337e-02f, +2.431470816e-02f, -3.624474747e-02f, -5.739564699e-02f, -1.998694131e-02f, +3.351638961e-02f, +4.817478624e-02f, +1.448302784e-02f, -2.750950673e-02f, -3.586940047e-02f, -9.133620712e-03f, +1.982027826e-02f, +2.336059902e-02f, +4.902453778e-03f, -1.228337852e-02f, -1.297788992e-02f, -2.154334441e-03f, +6.308085639e-03f, +5.868301724e-03f, +7.201523296e-04f, -2.485952350e-03f, -1.948202855e-03f, -1.543501166e-04f, +6.073706910e-04f,\n    -1.342746520e-05f, +9.250480050e-06f, +5.201905875e-05f, +4.521350195e-05f, -5.835793373e-05f, -1.668522344e-04f, -9.662174551e-05f, +1.795852487e-04f, +3.774464191e-04f, +1.548057940e-04f, -4.007926665e-04f, -6.831917134e-04f, -1.942488568e-04f, +7.238290583e-04f, +1.044477917e-03f, +1.863643975e-04f, -1.110693183e-03f, -1.387108823e-03f, -1.142841741e-04f, +1.485784786e-03f, +1.624997983e-03f, -1.521820702e-05f, -1.757402499e-03f, -1.692393190e-03f, +1.704095971e-04f, +1.851046690e-03f, +1.570440944e-03f, -3.061321530e-04f, -1.739328359e-03f, -1.294791911e-03f, +3.829219223e-04f, +1.453587369e-03f, +9.404822960e-04f, -3.837239896e-04f, -1.071151816e-03f, -5.919866399e-04f, +3.194624803e-04f, +6.846175414e-04f, +3.132897930e-04f, -2.211971578e-04f, -3.683217620e-04f, -1.313100623e-04f, +1.241372887e-04f, +1.573524280e-04f, +3.758471417e-05f, -5.267340081e-05f, -4.640953171e-05f, -3.344956610e-06f,\n    /*  5,30 (48) */\n    -2.518281858e-04f, -6.977961571e-05f, +6.137529580e-04f, +1.220752556e-03f, +6.700680342e-04f, -1.356918523e-03f, -3.314833973e-03f, -2.566471096e-03f, +1.834798993e-03f, +6.846701154e-03f, +6.858183098e-03f, -9.493153096e-04f, -1.179906927e-02f, -1.501597835e-02f, -3.261000612e-03f, +1.775157319e-02f, +2.950074453e-02f, +1.467507238e-02f, -2.411458308e-02f, -5.770703299e-02f, -4.604943438e-02f, +3.159765179e-02f, +1.544316738e-01f, +2.658419868e-01f, +3.068710639e-01f, +2.547700737e-01f, +1.383451080e-01f, +1.856075873e-02f, -5.104195788e-02f, -5.521624002e-02f, -1.873957433e-02f, +1.816164035e-02f, +2.925407180e-02f, +1.518350718e-02f, -5.506723678e-03f, -1.537903583e-02f, -1.062542035e-02f, +3.719014876e-04f, +7.288293598e-03f, +6.378952979e-03f, +1.148751496e-03f, -2.874316912e-03f, -3.166674574e-03f, -1.057015512e-03f, +8.289292249e-04f, +1.186885931e-03f, +5.124274402e-04f, -1.222086353e-04f,\n    +1.755773309e-06f, -1.395485539e-05f, -2.537973484e-05f, -6.763373530e-06f, +4.217219376e-05f, +7.524412339e-05f, +3.307012695e-05f, -8.291697915e-05f, -1.731953418e-04f, -1.097224341e-04f, +1.200295256e-04f, +3.363172964e-04f, +2.827671959e-04f, -1.142387896e-04f, -5.778504940e-04f, -6.301490248e-04f, -2.102664783e-05f, +9.116132390e-04f, +1.340873323e-03f, +5.569062743e-04f, -1.350054072e-03f, -3.333588684e-03f, -4.010517398e-03f, -2.663871431e-03f, +1.434918397e-04f, +2.870514001e-03f, +4.030681563e-03f, +3.183583322e-03f, +1.146381061e-03f, -6.872785669e-04f, -1.345396299e-03f, -8.312152161e-04f, +1.019169912e-04f, +6.531856788e-04f, +5.446129107e-04f, +6.739588425e-05f, -3.036857170e-04f, -3.240227631e-04f, -9.503320589e-05f, +1.239676040e-04f, +1.696732221e-04f, +7.099083746e-05f, -4.092589172e-05f, -7.463086104e-05f, -3.724771090e-05f, +1.013486907e-05f, +2.525256859e-05f, +1.225783667e-05f,\n    +4.029212880e-04f, +5.791264463e-04f, -3.980404175e-04f, -2.197724601e-03f, -2.256768871e-03f, +1.527651340e-03f, +6.436363048e-03f, +5.554631442e-03f, -4.018496808e-03f, -1.395516144e-02f, -1.053979013e-02f, +8.330834633e-03f, +2.471300995e-02f, +1.659133356e-02f, -1.444876228e-02f, -3.739940617e-02f, -2.245697029e-02f, +2.163504720e-02f, +4.955742841e-02f, +2.664599159e-02f, -2.847481101e-02f, -5.828670715e-02f, -2.800022766e-02f, +3.327303618e-02f, +6.127603297e-02f, +2.616575485e-02f, -3.467430652e-02f, -5.770177914e-02f, -2.172626967e-02f, +3.222159770e-02f, +4.855770816e-02f, +1.593661521e-02f, -2.656902443e-02f, -3.625312446e-02f, -1.020477253e-02f, +1.922829162e-02f, +2.368006150e-02f, +5.587071319e-03f, -1.197008873e-02f, -1.319908707e-02f, -2.522656203e-03f, +6.176775576e-03f, +5.992439012e-03f, +8.775047576e-04f, -2.448367636e-03f, -2.000876256e-03f, -2.007596483e-04f, +6.040257344e-04f,\n    -1.355093038e-05f, +8.012240443e-06f, +5.098474714e-05f, +4.692069522e-05f, -5.415123641e-05f, -1.653056012e-04f, -1.026029163e-04f, +1.700139223e-04f, +3.764907428e-04f, +1.688864313e-04f, -3.837428672e-04f, -6.851140893e-04f, -2.203717640e-04f, +6.985620449e-04f, +1.052362092e-03f, +2.270146915e-04f, -1.078637439e-03f, -1.403805461e-03f, -1.690127679e-04f, +1.450526321e-03f, +1.651820586e-03f, +4.959784783e-05f, -1.723734218e-03f, -1.728168432e-03f, +1.023247407e-04f, +1.823431103e-03f, +1.611465173e-03f, -2.425559345e-04f, -1.720460254e-03f, -1.335830847e-03f, +3.303161911e-04f, +1.443705745e-03f, +9.764189553e-04f, -3.455152596e-04f, -1.068359147e-03f, -6.193841835e-04f, +2.955495186e-04f, +6.859527169e-04f, +3.311930698e-04f, -2.087436413e-04f, -3.709989590e-04f, -1.410228537e-04f, +1.191183543e-04f, +1.595939104e-04f, +4.167685723e-05f, -5.139596134e-05f, -4.761327908e-05f, -4.466594439e-06f,\n    /*  5,31 (48) */\n    -2.500724124e-04f, -8.373447109e-05f, +5.883732232e-04f, +1.213989182e-03f, +7.122402280e-04f, -1.281674399e-03f, -3.281763846e-03f, -2.649388075e-03f, +1.661603651e-03f, +6.736978720e-03f, +6.978212623e-03f, -6.129980132e-04f, -1.151630207e-02f, -1.513021714e-02f, -3.838851106e-03f, +1.712142417e-02f, +2.947971788e-02f, +1.558668562e-02f, -2.277370976e-02f, -5.715012672e-02f, -4.739948845e-02f, +2.826406311e-02f, +1.504211564e-01f, +2.631781154e-01f, +3.070145557e-01f, +2.576405877e-01f, +1.423757896e-01f, +2.174434206e-02f, -4.989557681e-02f, -5.590351858e-02f, -2.008497063e-02f, +1.733042513e-02f, +2.935598879e-02f, +1.583669286e-02f, -4.962110768e-03f, -1.531163994e-02f, -1.092910607e-02f, +4.787872449e-05f, +7.193260392e-03f, +6.502920583e-03f, +1.318424719e-03f, -2.803326075e-03f, -3.207600465e-03f, -1.131646373e-03f, +7.916815140e-04f, +1.197020801e-03f, +5.376800088e-04f, -1.099507986e-04f,\n    +2.077502712e-06f, -1.339113908e-05f, -2.536792522e-05f, -7.922171439e-06f, +4.054173673e-05f, +7.511648637e-05f, +3.577215824e-05f, -7.895742338e-05f, -1.721770654e-04f, -1.146544985e-04f, +1.116913074e-04f, +3.324887018e-04f, +2.901112160e-04f, -9.852083963e-05f, -5.671719722e-04f, -6.385264040e-04f, -4.837949091e-05f, +8.852743607e-04f, +1.343618217e-03f, +6.015724119e-04f, -1.281996999e-03f, -3.284868198e-03f, -4.019323722e-03f, -2.734317328e-03f, +4.783988299e-05f, +2.803210385e-03f, +4.026043107e-03f, +3.234852854e-03f, +1.214091364e-03f, -6.450357199e-04f, -1.345120911e-03f, -8.584651506e-04f, +7.534959806e-05f, +6.462049060e-04f, +5.560876896e-04f, +8.290196051e-05f, -2.970847865e-04f, -3.283880359e-04f, -1.033564617e-04f, +1.194036389e-04f, +1.710018670e-04f, +7.498057630e-05f, -3.839122229e-05f, -7.491153978e-05f, -3.889954925e-05f, +9.046210131e-06f, +2.532528913e-05f, +1.282518843e-05f,\n    +3.893703576e-04f, +5.871386867e-04f, -3.470556704e-04f, -2.150803906e-03f, -2.310920108e-03f, +1.362345739e-03f, +6.333760132e-03f, +5.724645364e-03f, -3.642006065e-03f, -1.378627501e-02f, -1.092353299e-02f, +7.645720544e-03f, +2.449263819e-02f, +1.728989560e-02f, -1.339640018e-02f, -3.717239147e-02f, -2.353560773e-02f, +2.023124174e-02f, +4.938841564e-02f, +2.809651791e-02f, -2.682299043e-02f, -5.823710931e-02f, -2.972396188e-02f, +3.154486775e-02f, +6.137835771e-02f, +2.798918595e-02f, -3.306284135e-02f, -5.794433508e-02f, -2.344672992e-02f, +3.088576685e-02f, +4.888802435e-02f, +1.738032095e-02f, -2.559260547e-02f, -3.659863972e-02f, -1.127313167e-02f, +1.860890744e-02f, +2.397561102e-02f, +6.273024036e-03f, -1.163889566e-02f, -1.340783072e-02f, -2.893655162e-03f, +6.035752723e-03f, +6.111557367e-03f, +1.037098668e-03f, -2.406690779e-03f, -2.052272217e-03f, -2.483729274e-04f, +5.995591399e-04f,\n    -1.364337518e-05f, +6.801361925e-06f, +4.990376237e-05f, +4.852002281e-05f, -4.996526961e-05f, -1.635764684e-04f, -1.083483004e-04f, +1.603876878e-04f, +3.750921654e-04f, +1.825774125e-04f, -3.664436410e-04f, -6.862098894e-04f, -2.459798275e-04f, +6.727082646e-04f, +1.058968687e-03f, +2.671187145e-04f, -1.045542951e-03f, -1.418809249e-03f, -2.233016724e-04f, +1.413748698e-03f, +1.676686855e-03f, +1.142151055e-04f, -1.688158924e-03f, -1.761957904e-03f, +3.412141537e-05f, +1.793723894e-03f, +1.650720551e-03f, -1.785591216e-04f, -1.699573653e-03f, -1.375500241e-03f, +2.770896161e-04f, +1.432111537e-03f, +1.011454792e-03f, -3.066330440e-04f, -1.064299823e-03f, -6.463035710e-04f, +2.710473447e-04f, +6.864866184e-04f, +3.489190265e-04f, -1.958668817e-04f, -3.732587375e-04f, -1.507196706e-04f, +1.138544649e-04f, +1.616706026e-04f, +4.580540148e-05f, -5.001166561e-05f, -4.877898058e-05f, -5.619091256e-06f,\n    /*  6, 0 (48) */\n    +4.968144385e-04f, +2.658533900e-04f, -8.962168723e-04f, -1.608103413e-03f, -7.788642489e-06f, +2.979420144e-03f, +3.156687553e-03f, -1.777487314e-03f, -6.981373376e-03f, -4.200072704e-03f, +6.679001343e-03f, +1.302046751e-02f, +2.733865881e-03f, -1.674345458e-02f, -2.042237500e-02f, +4.850187710e-03f, +3.528439247e-02f, +2.773502242e-02f, -2.703828769e-02f, -7.382778902e-02f, -3.314369929e-02f, +1.149897119e-01f, +2.902267079e-01f, +3.684748747e-01f, +2.902267079e-01f, +1.149897119e-01f, -3.314369929e-02f, -7.382778902e-02f, -2.703828769e-02f, +2.773502242e-02f, +3.528439247e-02f, +4.850187710e-03f, -2.042237500e-02f, -1.674345458e-02f, +2.733865881e-03f, +1.302046751e-02f, +6.679001343e-03f, -4.200072704e-03f, -6.981373376e-03f, -1.777487314e-03f, +3.156687553e-03f, +2.979420144e-03f, -7.788642489e-06f, -1.608103413e-03f, -8.962168723e-04f, +2.658533900e-04f, +4.968144385e-04f, +1.277320727e-04f,\n    -7.206097170e-06f, +2.345369145e-05f, +4.096545548e-05f, -6.905852224e-06f, -8.675906281e-05f, -7.546324261e-05f, +7.573909431e-05f, +2.022568705e-04f, +7.646324280e-05f, -2.455625648e-04f, -3.580985825e-04f, +2.603744181e-05f, +5.634016105e-04f, +5.082121336e-04f, -3.395718620e-04f, -1.086804390e-03f, -5.736463860e-04f, +1.068031294e-03f, +2.020535961e-03f, +4.854822889e-04f, -3.056293732e-03f, -5.676763658e-03f, -4.596934279e-03f, -8.196129835e-05f, +4.496275233e-03f, +5.707482646e-03f, +3.170653092e-03f, -3.946898559e-04f, -2.015321110e-03f, -1.120316544e-03f, +5.335348884e-04f, +1.093922442e-03f, +3.714076894e-04f, -4.917967149e-04f, -5.741874250e-04f, -4.413138857e-05f, +3.537211876e-04f, +2.547523335e-04f, -6.792291394e-05f, -2.029151000e-04f, -8.143026444e-05f, +7.257614213e-05f, +8.845998205e-05f, +9.423532883e-06f, -4.059785137e-05f, -2.453583715e-05f, +6.589777155e-06f, +1.156587247e-05f,\n    -4.968144385e-04f, -7.842817921e-04f, +8.994291019e-04f, +2.915640051e-03f, +8.438649895e-04f, -5.098406932e-03f, -6.009425829e-03f, +3.886651395e-03f, +1.308708603e-02f, +4.180565853e-03f, -1.651382305e-02f, -1.845487053e-02f, +9.460496445e-03f, +3.171517895e-02f, +1.017220246e-02f, -3.304107863e-02f, -3.524088677e-02f, +1.560130303e-02f, +5.143354543e-02f, +1.625027633e-02f, -4.622585189e-02f, -4.721341238e-02f, +1.858986948e-02f, +6.004110985e-02f, +1.858986948e-02f, -4.721341238e-02f, -4.622585189e-02f, +1.625027633e-02f, +5.143354543e-02f, +1.560130303e-02f, -3.524088677e-02f, -3.304107863e-02f, +1.017220246e-02f, +3.171517895e-02f, +9.460496445e-03f, -1.845487053e-02f, -1.651382305e-02f, +4.180565853e-03f, +1.308708603e-02f, +3.886651395e-03f, -6.009425829e-03f, -5.098406932e-03f, +8.438649895e-04f, +2.915640051e-03f, +8.994291019e-04f, -7.842817921e-04f, -6.202569526e-04f, -1.277320727e-04f,\n    +7.206097170e-06f, -1.905086070e-05f, -7.742340156e-05f, -2.244308745e-05f, +1.497789702e-04f, +1.680758405e-04f, -1.428957736e-04f, -4.031178103e-04f, -7.079960453e-05f, +5.796643399e-04f, +5.287520583e-04f, -4.584378263e-04f, -1.058776278e-03f, -1.168871057e-04f, +1.299923556e-03f, +1.022760899e-03f, -9.173623485e-04f, -1.822672317e-03f, -1.123708632e-04f, +1.992771091e-03f, +1.381254679e-03f, -1.285058184e-03f, -2.242170783e-03f, -4.645487730e-05f, +2.215111194e-03f, +1.360178459e-03f, -1.312782922e-03f, -2.024189074e-03f, +3.287736205e-05f, +1.807031638e-03f, +9.774392195e-04f, -9.777611267e-04f, -1.325464625e-03f, +6.806222398e-05f, +1.053802351e-03f, +4.924109527e-04f, -5.086829447e-04f, -5.938112090e-04f, +5.080677731e-05f, +4.032233109e-04f, +1.552090461e-04f, -1.629782250e-04f, -1.544976859e-04f, +1.804669126e-05f, +7.810303453e-05f, +2.113479253e-05f, -2.026107605e-05f, -1.156587247e-05f,\n    /*  6, 1 (48) */\n    +4.896083413e-04f, +2.893070814e-04f, -8.552514168e-04f, -1.615009265e-03f, -9.454770530e-05f, +2.903956901e-03f, +3.232426648e-03f, -1.575230443e-03f, -6.904910133e-03f, -4.445635269e-03f, +6.320902760e-03f, +1.304650495e-02f, +3.297267492e-03f, -1.623524244e-02f, -2.076194686e-02f, +3.763383320e-03f, +3.471074609e-02f, +2.880305371e-02f, -2.501775173e-02f, -7.334230673e-02f, -3.619999302e-02f, +1.093129482e-01f, +2.856297736e-01f, +3.683929135e-01f, +2.947229831e-01f, +1.206971945e-01f, -2.997304620e-02f, -7.422247888e-02f, -2.905360880e-02f, +2.661470588e-02f, +3.581792736e-02f, +5.944110152e-03f, -2.005096731e-02f, -1.723525129e-02f, +2.159678456e-03f, +1.297633612e-02f, +7.032722530e-03f, -3.945320371e-03f, -7.049296290e-03f, -1.980402414e-03f, +3.075257289e-03f, +3.051996286e-03f, +8.067133956e-05f, -1.598679880e-03f, -9.368147236e-04f, +2.413175528e-04f, +5.034042156e-04f, +1.392979451e-04f,\n    -7.791242229e-06f, +2.236071049e-05f, +4.126109227e-05f, -4.429146330e-06f, -8.496304936e-05f, -7.819246260e-05f, +7.003201622e-05f, +2.013257369e-04f, +8.477603732e-05f, -2.361598639e-04f, -3.619299538e-04f, +8.136198435e-06f, +5.519882992e-04f, +5.237462362e-04f, -3.076704192e-04f, -1.078335946e-03f, -6.124905293e-04f, +1.015080108e-03f, +2.023109414e-03f, +5.740791932e-04f, -2.941027388e-03f, -5.642146737e-03f, -4.693945103e-03f, -2.458165803e-04f, +4.392039864e-03f, +5.734251616e-03f, +3.283990837e-03f, -3.017665142e-04f, -2.007432595e-03f, -1.171860555e-03f, +4.921922220e-04f, +1.099664087e-03f, +4.031343334e-04f, -4.745115978e-04f, -5.843232553e-04f, -6.239543190e-05f, +3.487967929e-04f, +2.637133416e-04f, -5.916399725e-05f, -2.032954010e-04f, -8.709694318e-05f, +6.953278931e-05f, +9.006147782e-05f, +1.197904264e-05f, -4.015732169e-05f, -2.560501230e-05f, +5.942614945e-06f, +1.179515707e-05f,\n    -4.896083413e-04f, -8.033326528e-04f, +8.220057003e-04f, +2.893196964e-03f, +9.936439597e-04f, -4.930331092e-03f, -6.152321602e-03f, +3.483533585e-03f, +1.301628643e-02f, +4.760230193e-03f, -1.598507100e-02f, -1.891330835e-02f, +8.401720167e-03f, +3.159829184e-02f, +1.147212602e-02f, -3.201831773e-02f, -3.615824912e-02f, +1.377863072e-02f, +5.132117457e-02f, +1.824304742e-02f, -4.484459721e-02f, -4.849847057e-02f, +1.634769870e-02f, +5.999465498e-02f, +2.080498068e-02f, -4.585323392e-02f, -4.753863481e-02f, +1.422608725e-02f, +5.146642279e-02f, +1.740833467e-02f, -3.426344755e-02f, -3.401883976e-02f, +8.846737837e-03f, +3.178324117e-02f, +1.051429880e-02f, -1.796245957e-02f, -1.702250600e-02f, +3.586754644e-03f, +1.313789281e-02f, +4.289874706e-03f, -5.854216783e-03f, -5.261385157e-03f, +6.893673036e-04f, +2.933686743e-03f, +9.775321364e-04f, -7.631469996e-04f, -6.405180286e-04f, -1.392979451e-04f,\n    +7.791242229e-06f, -1.699747862e-05f, -7.662225966e-05f, -2.669496967e-05f, +1.449047117e-04f, +1.727947999e-04f, -1.305561128e-04f, -4.023534357e-04f, -9.039874540e-05f, +5.647600865e-04f, +5.477436456e-04f, -4.240808264e-04f, -1.062018502e-03f, -1.651246880e-04f, +1.272510612e-03f, +1.065857194e-03f, -8.561708638e-04f, -1.835368929e-03f, -1.913789724e-04f, +1.958317289e-03f, +1.447398043e-03f, -1.208034611e-03f, -2.265687070e-03f, -1.392905295e-04f, +2.184548817e-03f, +1.433272568e-03f, -1.242086964e-03f, -2.052511654e-03f, -4.697585680e-05f, +1.788458344e-03f, +1.036298510e-03f, -9.309185690e-04f, -1.349078811e-03f, +1.872481803e-05f, +1.047088999e-03f, +5.259403172e-04f, -4.875573858e-04f, -6.071675411e-04f, +3.044856647e-05f, +4.026596693e-04f, +1.674741398e-04f, -1.575038342e-04f, -1.590490714e-04f, +1.351057922e-05f, +7.865658953e-05f, +2.324588111e-05f, -1.989502124e-05f, -1.179515707e-05f,\n    /*  6, 2 (48) */\n    +4.818170991e-04f, +3.116677919e-04f, -8.139903245e-04f, -1.619438411e-03f, -1.795107547e-04f, +2.825764439e-03f, +3.302458664e-03f, -1.373904706e-03f, -6.820134096e-03f, -4.681795133e-03f, +5.958972806e-03f, +1.305464115e-02f, +3.849255791e-03f, -1.571149621e-02f, -2.106961728e-02f, +2.685047373e-03f, +3.409825556e-02f, +2.981813382e-02f, -2.299464232e-02f, -7.276822754e-02f, -3.914102041e-02f, +1.036708015e-01f, +2.809358285e-01f, +3.681470969e-01f, +2.991150230e-01f, +1.264314461e-01f, -2.668905536e-02f, -7.452424539e-02f, -3.106104140e-02f, +2.544284532e-02f, +3.631011958e-02f, +7.043774239e-03f, -1.964783298e-02f, -1.770976289e-02f, +1.575355201e-03f, +1.291394069e-02f, +7.381519323e-03f, -3.681607029e-03f, -7.108460287e-03f, -2.183697815e-03f, +2.988160346e-03f, +3.121529075e-03f, +1.707328174e-04f, -1.586700837e-03f, -9.769720453e-04f, +2.157125405e-04f, +5.093468306e-04f, +1.510931022e-04f,\n    -8.344944653e-06f, +2.125900262e-05f, +4.148581872e-05f, -1.996438486e-06f, -8.307634195e-05f, -8.076243575e-05f, +6.431750700e-05f, +2.001270451e-04f, +9.285279645e-05f, -2.265601524e-04f, -3.652170240e-04f, -9.550274047e-06f, +5.399705649e-04f, +5.383887230e-04f, -2.757465103e-04f, -1.068544575e-03f, -6.500331626e-04f, +9.615381760e-04f, +2.023076302e-03f, +6.604188335e-04f, -2.824968759e-03f, -5.603687422e-03f, -4.787239382e-03f, -4.094699856e-04f, +4.284303580e-03f, +5.757022002e-03f, +3.396192524e-03f, -2.067797193e-04f, -1.996840788e-03f, -1.222587999e-03f, +4.496565782e-04f, +1.104004805e-03f, +4.347078605e-04f, -4.563697166e-04f, -5.937872373e-04f, -8.080645084e-05f, +3.433251790e-04f, +2.724298771e-04f, -5.019587769e-05f, -2.033930824e-04f, -9.273045181e-05f, +6.633507579e-05f, +9.155929989e-05f, +1.456911640e-05f, -3.964301044e-05f, -2.665905792e-05f, +5.265009118e-06f, +1.200722377e-05f,\n    -4.818170991e-04f, -8.203301315e-04f, +7.453834406e-04f, +2.866501994e-03f, +1.138548671e-03f, -4.757536292e-03f, -6.282877715e-03f, +3.081180149e-03f, +1.292588768e-02f, +5.324990279e-03f, -1.543732735e-02f, -1.933738918e-02f, +7.339701665e-03f, +3.143316715e-02f, +1.274463663e-02f, -3.095246054e-02f, -3.701441998e-02f, +1.194326179e-02f, +5.112979559e-02f, +2.020136471e-02f, -4.339719917e-02f, -4.970650518e-02f, +1.408201163e-02f, +5.985536445e-02f, +2.298952949e-02f, -4.441996135e-02f, -4.878072178e-02f, +1.217357560e-02f, +5.141944693e-02f, +1.919679302e-02f, -3.322714904e-02f, -3.494975833e-02f, +7.497659026e-03f, +3.180196599e-02f, +1.156138780e-02f, -1.743651926e-02f, -1.751006338e-02f, +2.979587103e-03f, +1.316834138e-02f, +4.692534375e-03f, -5.686742643e-03f, -5.418888992e-03f, +5.303182322e-04f, +2.947197322e-03f, +1.056188726e-03f, -7.399011185e-04f, -6.604130498e-04f, -1.510931022e-04f,\n    +8.344944653e-06f, -1.497788212e-05f, -7.570430487e-05f, -3.079791745e-05f, +1.398867490e-04f, +1.771339313e-04f, -1.182115470e-04f, -4.009414406e-04f, -1.095769468e-04f, +5.491324766e-04f, +5.656386610e-04f, -3.893998840e-04f, -1.063539538e-03f, -2.127017604e-04f, +1.243283477e-03f, +1.106992809e-03f, -7.939689928e-04f, -1.845114860e-03f, -2.697772798e-04f, +1.920891995e-03f, +1.511112825e-03f, -1.129233506e-03f, -2.285625305e-03f, -2.319039960e-04f, +2.150529871e-03f, +1.504220745e-03f, -1.169274842e-03f, -2.077684101e-03f, -1.270620581e-04f, +1.766968726e-03f, +1.093838693e-03f, -8.822973255e-04f, -1.370713898e-03f, -3.104888631e-05f, +1.038631332e-03f, +5.589661769e-04f, -4.653984841e-04f, -6.197011272e-04f, +9.754288189e-06f, +4.014176345e-04f, +1.796689918e-04f, -1.516552664e-04f, -1.634214139e-04f, +8.839925616e-06f, +7.907963685e-05f, +2.538057954e-05f, -1.947093683e-05f, -1.200722377e-05f,\n    /*  6, 3 (48) */\n    +4.734721544e-04f, +3.329267946e-04f, -7.725045058e-04f, -1.621434850e-03f, -2.625870966e-04f, +2.745002003e-03f, +3.366776171e-03f, -1.173777661e-03f, -6.727281299e-03f, -4.908355286e-03f, +5.593755782e-03f, +1.304509087e-02f, +4.389226356e-03f, -1.517310748e-02f, -2.134536379e-02f, +1.616502798e-03f, +3.344822240e-02f, +3.077967200e-02f, -2.097156602e-02f, -7.210780871e-02f, -4.196598917e-02f, +9.806711406e-02f, +2.761485891e-01f, +3.677376269e-01f, +3.033993266e-01f, +1.321884681e-01f, -2.329286284e-02f, -7.473102511e-02f, -3.305788219e-02f, +2.422025732e-02f, +3.675977616e-02f, +8.147779044e-03f, -1.921312512e-02f, -1.816613260e-02f, +9.815679637e-04f, +1.283313424e-02f, +7.724844502e-03f, -3.409177152e-03f, -7.158656165e-03f, -2.387090897e-03f, +2.895429894e-03f, +3.187864151e-03f, +2.622921173e-04f, -1.572131721e-03f, -1.016615056e-03f, +1.890534826e-04f, +5.146118397e-04f, +1.631003260e-04f,\n    -8.867001001e-06f, +2.015064614e-05f, +4.164078698e-05f, +3.893731059e-07f, -8.110340390e-05f, -8.317205561e-05f, +5.860392582e-05f, +1.986664501e-04f, +1.006854710e-04f, -2.167794209e-04f, -3.679622505e-04f, -2.700047156e-05f, +5.273720285e-04f, +5.521306107e-04f, -2.438428143e-04f, -1.057459136e-03f, -6.862421796e-04f, +9.074804882e-04f, +2.020473974e-03f, +7.444424040e-04f, -2.708232495e-03f, -5.561444633e-03f, -4.876752428e-03f, -5.727871543e-04f, +4.173145228e-03f, +5.775748818e-03f, +3.507144024e-03f, -1.097997096e-04f, -1.983518747e-03f, -1.272423616e-03f, +4.059681292e-04f, +1.106921623e-03f, +4.660840266e-04f, -4.373853199e-04f, -6.025581680e-04f, -9.934083637e-05f, +3.373068931e-04f, +2.808863692e-04f, -4.102837087e-05f, -2.032037984e-04f, -9.832202803e-05f, +6.298515782e-05f, +9.294928507e-05f, +1.719037284e-05f, -3.905416716e-05f, -2.769579466e-05f, +4.557424696e-06f, +1.220112428e-05f,\n    -4.734721544e-04f, -8.353080136e-04f, +6.696791358e-04f, +2.835704077e-03f, +1.278435420e-03f, -4.580402361e-03f, -6.401089262e-03f, +2.680238709e-03f, +1.281631074e-02f, +5.874122756e-03f, -1.487168869e-02f, -1.972678906e-02f, +6.276162127e-03f, +3.122046539e-02f, +1.398792011e-02f, -2.984546773e-02f, -3.780838897e-02f, +1.009814693e-02f, +5.086001831e-02f, +2.212225670e-02f, -4.188608634e-02f, -5.083573868e-02f, +1.179638632e-02f, +5.962346045e-02f, +2.514005936e-02f, -4.291574061e-02f, -4.994999662e-02f, +1.009589150e-02f, +5.129238488e-02f, +2.096376174e-02f, -3.213331035e-02f, -3.583205565e-02f, +6.126945128e-03f, +3.177091710e-02f, +1.260001913e-02f, -1.687755308e-02f, -1.797546187e-02f, +2.359885976e-03f, +1.317809567e-02f, +5.093952010e-03f, -5.507073651e-03f, -5.570544258e-03f, +3.668968183e-04f, +2.956037248e-03f, +1.135268363e-03f, -7.145205390e-04f, -6.798839867e-04f, -1.631003260e-04f,\n    +8.867001001e-06f, -1.299514687e-05f, -7.467434777e-05f, -3.474788864e-05f, +1.347369482e-04f, +1.810927613e-04f, -1.058832189e-04f, -3.988940296e-04f, -1.283080387e-04f, +5.328163443e-04f, +5.824201054e-04f, -3.544548708e-04f, -1.063352654e-03f, -2.595467868e-04f, +1.212302398e-03f, +1.146114099e-03f, -7.308620442e-04f, -1.851908327e-03f, -3.474428399e-04f, +1.880564154e-03f, +1.572302999e-03f, -1.048783316e-03f, -2.301956556e-03f, -3.241475586e-04f, +2.113106202e-03f, +1.572906527e-03f, -1.094458265e-03f, -2.099656640e-03f, -2.072536508e-04f, +1.742583914e-03f, +1.149959854e-03f, -8.319648170e-04f, -1.390320562e-03f, -8.118132958e-05f, +1.028427323e-03f, +5.914290376e-04f, -4.422313454e-04f, -6.313807691e-04f, -1.124576621e-05f, +3.994890047e-04f, +1.917713026e-04f, -1.454358454e-04f, -1.676030986e-04f, +4.040278685e-06f, +7.936789852e-05f, +2.753519081e-05f, -1.898771574e-05f, -1.220112428e-05f,\n    /*  6, 4 (48) */\n    +4.646051534e-04f, +3.530774407e-04f, -7.308637188e-04f, -1.621045477e-03f, -3.436905005e-04f, +2.661829947e-03f, +3.425380097e-03f, -9.751112112e-04f, -6.626595828e-03f, -5.125134706e-03f, +5.225793532e-03f, +1.301809040e-02f, +4.916598384e-03f, -1.462097687e-02f, -2.158920660e-02f, +5.590436624e-04f, +3.276198022e-02f, +3.168715249e-02f, -1.895109204e-02f, -7.136336630e-02f, -4.467422166e-02f, +9.250566943e-02f, +2.712718367e-01f, +3.671648397e-01f, +3.075724718e-01f, +1.379642170e-01f, -1.978571881e-02f, -7.484082482e-02f, -3.504140093e-02f, +2.294783371e-02f, +3.716574429e-02f, +9.254700667e-03f, -1.874704109e-02f, -1.860351792e-02f, +3.790097958e-04f, +1.273379340e-02f, +8.062151396e-03f, -3.128290783e-03f, -7.199684535e-03f, -2.590294696e-03f, +2.797107866e-03f, +3.250849309e-03f, +3.552414023e-04f, -1.554941348e-03f, -1.055669223e-03f, +1.613576880e-04f, +5.191692644e-04f, +1.753014503e-04f,\n    -9.357271131e-06f, +1.903768623e-05f, +4.172724070e-05f, +2.725517788e-06f, -7.904875357e-05f, -8.542047327e-05f, +5.289950351e-05f, +1.969499038e-04f, +1.082664692e-04f, -2.068337056e-04f, -3.701688128e-04f, -4.419347652e-05f, +5.142168205e-04f, +5.649642299e-04f, -2.120014881e-04f, -1.045109832e-03f, -7.210875415e-04f, +8.529817484e-04f, +2.015342221e-03f, +8.260940707e-04f, -2.590933072e-03f, -5.515480599e-03f, -4.962423244e-03f, -7.356340633e-04f, +4.058647023e-03f, +5.790390724e-03f, +3.616731638e-03f, -1.089945062e-05f, -1.967442276e-03f, -1.321292299e-03f, +3.611689990e-04f, +1.108393160e-03f, +4.972183318e-04f, -4.175739665e-04f, -6.106155420e-04f, -1.179745186e-04f, +3.307432576e-04f, +2.890674119e-04f, -3.167171449e-05f, -2.027235592e-04f, -1.038628378e-04f, +5.948545712e-05f, +9.422736517e-05f, +1.983931782e-05f, -3.839015022e-05f, -2.871302625e-05f, +3.820393667e-06f, +1.237592426e-05f,\n    -4.646051534e-04f, -8.483031605e-04f, +5.950047880e-04f, +2.800956188e-03f, +1.413172369e-03f, -4.399309599e-03f, -6.506972481e-03f, +2.281344679e-03f, +1.268800270e-02f, +6.406939100e-03f, -1.428926858e-02f, -2.008124393e-02f, +5.212809473e-03f, +3.096091860e-02f, +1.520022250e-02f, -2.869935363e-02f, -3.853925102e-02f, +8.246238601e-03f, +5.051257547e-02f, +2.400282086e-02f, -4.031378334e-02f, -5.188452200e-02f, +9.494429766e-03f, +5.929931289e-02f, +2.725316557e-02f, -4.134283408e-02f, -5.104445488e-02f, +7.996234859e-03f, +5.108513123e-02f, +2.270634566e-02f, -3.098335049e-02f, -3.666402047e-02f, +4.736624566e-03f, +3.168973577e-02f, +1.362844645e-02f, -1.628612404e-02f, -1.841769321e-02f, +1.728505206e-03f, +1.316684990e-02f, +5.493441015e-03f, -5.315302348e-03f, -5.715980103e-03f, +1.992937197e-04f, +2.960077526e-03f, +1.214636261e-03f, -6.869853482e-04f, -6.988717024e-04f, -1.753014503e-04f,\n    +9.357271131e-06f, -1.105218590e-05f, -7.353730115e-05f, -3.854121934e-05f, +1.294671807e-04f, +1.846715044e-04f, -9.359189777e-05f, -3.962243230e-04f, -1.465669659e-04f, +5.158472603e-04f, +5.980730325e-04f, -3.193054982e-04f, -1.061473822e-03f, -3.055900125e-04f, +1.179630067e-03f, +1.183171051e-03f, -6.669562287e-04f, -1.855752352e-03f, -4.242543686e-04f, +1.837407206e-03f, +1.630876849e-03f, -9.668149639e-04f, -2.314657752e-03f, -4.158741060e-04f, +2.072335209e-03f, +1.639216953e-03f, -1.017752442e-03f, -2.118384554e-03f, -2.874223964e-04f, +1.715329861e-03f, +1.204563872e-03f, -7.799916939e-04f, -1.407852481e-03f, -1.315937390e-04f, +1.016477841e-03f, +6.232697581e-04f, -4.180830575e-04f, -6.421763456e-04f, -3.252037081e-05f, +3.968666565e-04f, +2.037585732e-04f, -1.388496268e-04f, -1.715826333e-04f, -8.824424543e-07f, +7.951726066e-05f, +2.970587195e-05f, -1.844435346e-05f, -1.237592426e-05f,\n    /*  6, 5 (48) */\n    +4.552478823e-04f, +3.721151269e-04f, -6.891364781e-04f, -1.618319959e-03f, -4.227392541e-04f, +2.576409474e-03f, +3.478279600e-03f, -7.781613074e-04f, -6.518329359e-03f, -5.331968412e-03f, +4.855624719e-03f, +1.297389693e-02f, +5.430815205e-03f, -1.405601264e-02f, -2.180120809e-02f, -4.860661693e-04f, +3.204089267e-02f, +3.254013424e-02f, -1.693574982e-02f, -7.053727223e-02f, -4.726515474e-02f, +8.699018883e-02f, +2.663094135e-01f, +3.664292057e-01f, +3.116311188e-01f, +1.437546077e-01f, -1.616898718e-02f, -7.485172427e-02f, -3.700884321e-02f, +2.162654141e-02f, +3.752691329e-02f, +1.036309383e-02f, -1.824982276e-02f, -1.902109189e-02f, -2.316057463e-04f, +1.261581888e-02f, +8.392894653e-03f, -2.839223371e-03f, -7.231356250e-03f, -2.793018255e-03f, +2.693245028e-03f, +3.310334766e-03f, +4.494687675e-04f, -1.535102030e-03f, -1.094059373e-03f, +1.326446617e-04f, +5.229896581e-04f, +1.876773745e-04f,\n    -9.815677156e-06f, +1.792213212e-05f, +4.174651130e-05f, +5.009354660e-06f, -7.691695648e-05f, -8.750709462e-05f, +4.721233222e-05f, +1.949836418e-04f, +1.155886614e-04f, -1.967390650e-04f, -3.718405999e-04f, -6.110897977e-05f, +5.005295418e-04f, +5.768832206e-04f, -1.802641175e-04f, -1.031528156e-03f, -7.545412919e-04f, +7.981162878e-04f, +2.007723215e-03f, +9.053210094e-04f, -2.473184673e-03f, -5.465860778e-03f, -5.044194584e-03f, -8.978771603e-04f, +3.940894468e-03f, +5.800910076e-03f, +3.724842225e-03f, +8.984542406e-05f, -1.948589975e-03f, -1.369119190e-03f, +3.153032321e-04f, +1.108399673e-03f, +5.280660766e-04f, -3.969525186e-04f, -6.179395883e-04f, -1.366829950e-04f, +3.236363777e-04f, +2.969577884e-04f, -2.213655910e-05f, -2.019487425e-04f, -1.093439878e-04f, +5.583866130e-05f, +9.538957497e-05f, +2.251234812e-05f, -3.765042989e-05f, -2.970854302e-05f, +3.054515381e-06f, +1.253070546e-05f,\n    -4.552478823e-04f, -8.593553464e-04f, +5.214674869e-04f, +2.762414969e-03f, +1.542639549e-03f, -4.214638095e-03f, -6.600564379e-03f, +1.885120356e-03f, +1.254143573e-02f, +6.922786361e-03f, -1.369119555e-02f, -2.040054943e-02f, +4.151335652e-03f, +3.065532859e-02f, +1.637985257e-02f, -2.751618258e-02f, -3.920620725e-02f, +6.390486249e-03f, +5.008832111e-02f, +2.584022806e-02f, -3.868290649e-02f, -5.285133696e-02f, +7.179772015e-03f, +5.888343879e-02f, +2.932550077e-02f, -3.970361713e-02f, -5.206220732e-02f, +5.877850305e-03f, +5.079770883e-02f, +2.442167552e-02f, -2.977878662e-02f, -3.744401216e-02f, +3.328772085e-03f, +3.155814203e-02f, +1.464492429e-02f, -1.566285428e-02f, -1.883577627e-02f, +1.086328861e-03f, +1.313432953e-02f, +5.890307671e-03f, -5.111543775e-03f, -5.854829730e-03f, +2.771108642e-05f, +2.959195084e-03f, +1.294153522e-03f, -6.572794762e-04f, -7.173160559e-04f, -1.876773745e-04f,\n    +9.815677156e-06f, -9.151747540e-06f, -7.229816771e-05f, -4.217462308e-05f, +1.240893005e-04f, +1.878710499e-04f, -8.135794825e-05f, -3.929463207e-04f, -1.643298167e-04f, +4.982614622e-04f, +6.125845522e-04f, -2.840112181e-04f, -1.057921668e-03f, -3.507635665e-04f, +1.145331498e-03f, +1.218117339e-03f, -6.023584774e-04f, -1.856654741e-03f, -5.000924368e-04f, +1.791498952e-03f, +1.686747109e-03f, -8.834616194e-04f, -2.323711714e-03f, -5.069373762e-04f, +2.028279749e-03f, +1.703042750e-03f, -9.392758951e-04f, -2.133828266e-03f, -3.674396180e-04f, +1.685237321e-03f, +1.257554585e-03f, -7.264517373e-04f, -1.423266428e-03f, -1.822062518e-04f, +1.002786671e-03f, +6.544296547e-04f, -3.929826645e-04f, -6.520588780e-04f, -5.403740792e-05f, +3.935445733e-04f, +2.156081422e-04f, -1.319014032e-04f, -1.753486718e-04f, -5.921951639e-06f, +7.952378569e-05f, +3.188863867e-05f, -1.783995335e-05f, -1.253070546e-05f,\n    /*  6, 6 (48) */\n    +4.454322052e-04f, +3.900372591e-04f, -6.473899668e-04f, -1.613310604e-03f, -4.996562106e-04f, +2.488902380e-03f, +3.525491932e-03f, -5.831776656e-04f, -6.402740698e-03f, -5.528707477e-03f, +4.483784119e-03f, +1.291278795e-02f, +5.931344747e-03f, -1.347912942e-02f, -2.198147221e-02f, -1.517594326e-03f, +3.128635138e-02f, +3.333825052e-02f, -1.492802661e-02f, -6.963195122e-02f, -4.973833941e-02f, +8.152432805e-02f, +2.612652189e-01f, +3.655313285e-01f, +3.155720133e-01f, +1.495555178e-01f, -1.244414495e-02f, -7.476187885e-02f, -3.895743318e-02f, +2.025742222e-02f, +3.784221652e-02f, +1.147149350e-02f, -1.772175668e-02f, -1.941804441e-02f, -8.495453346e-04f, +1.247913589e-02f, +8.716531031e-03f, -2.542265583e-03f, -7.253492809e-03f, -2.994966997e-03f, +2.583901040e-03f, +3.366173427e-03f, +5.448583425e-04f, -1.512589682e-03f, -1.131709803e-03f, +1.029361187e-04f, +5.260441735e-04f, +2.002080800e-04f,\n    -1.024220231e-05f, +1.680595422e-05f, +4.170001406e-05f, +7.238374544e-06f, -7.471261742e-05f, -8.943157738e-05f, +4.155035540e-05f, +1.927741706e-04f, +1.226453846e-04f, -1.865115568e-04f, -3.729821955e-04f, -7.772730152e-05f, +4.863352246e-04f, +5.878825260e-04f, -1.486716681e-04f, -1.016746838e-03f, -7.865775689e-04f, +7.429579806e-04f, +1.997661437e-03f, +9.820734400e-04f, -2.355101077e-03f, -5.412653779e-03f, -5.122012995e-03f, -1.059383497e-03f, +3.819976279e-03f, +5.807272982e-03f, +3.831363317e-03f, +1.923566759e-04f, -1.926943287e-03f, -1.415829765e-03f, +2.684167601e-04f, +1.106923101e-03f, +5.585824193e-04f, -3.755391344e-04f, -6.245113053e-04f, -1.554413590e-04f, +3.159891480e-04f, +3.045424952e-04f, -1.243395811e-05f, -2.008761034e-04f, -1.147565375e-04f, +5.204772384e-05f, +9.643206018e-05f, +2.520575530e-05f, -3.683459133e-05f, -3.068012551e-05f, +2.260456842e-06f, +1.266456791e-05f,\n    -4.454322052e-04f, -8.685070939e-04f, +4.491693191e-04f, +2.720240346e-03f, +1.666728850e-03f, -4.026767045e-03f, -6.681922327e-03f, +1.492174035e-03f, +1.237710592e-02f, +7.421047823e-03f, -1.307861100e-02f, -2.068456065e-02f, +3.093413984e-03f, +3.030456503e-02f, +1.752518407e-02f, -2.629806524e-02f, -3.980856572e-02f, +4.533831508e-03f, +4.958822867e-02f, +2.763172701e-02f, -3.699615939e-02f, -5.373479858e-02f, +4.856060301e-03f, +5.837650141e-02f, +3.135378052e-02f, -3.800057438e-02f, -5.300148322e-02f, +3.744022040e-03f, +5.043026921e-02f, +2.610691284e-02f, -2.852123204e-02f, -3.817046390e-02f, +1.905505657e-03f, +3.137593578e-02f, +1.564771096e-02f, -1.500842463e-02f, -1.922875894e-02f, +4.342699829e-04f, +1.308029212e-02f, +6.283852244e-03f, -4.895935633e-03f, -5.986731133e-03f, -1.476375854e-04f, +2.953273132e-03f, +1.373677308e-03f, -6.253908375e-04f, -7.351560092e-04f, -2.002080800e-04f,\n    +1.024220231e-05f, -7.296413674e-06f, -7.096202782e-05f, -4.564518926e-05f, +1.186151225e-04f, +1.906929491e-04f, -6.920130012e-05f, -3.890748647e-04f, -1.815738499e-04f, +4.800957835e-04f, +6.259438306e-04f, -2.486311244e-04f, -1.052717418e-03f, -3.950015605e-04f, +1.109473904e-03f, +1.250910379e-03f, -5.371762618e-04f, -1.854628048e-03f, -5.748396599e-04f, +1.742921408e-03f, +1.739831097e-03f, -7.988584839e-04f, -2.329107182e-03f, -5.971921956e-04f, +1.981008035e-03f, +1.764278523e-03f, -8.591502741e-04f, -2.145953423e-03f, -4.471764115e-04f, +1.652341818e-03f, +1.308837966e-03f, -6.714217553e-04f, -1.436522367e-03f, -2.329380412e-04f, +9.873605329e-04f, +6.848506056e-04f, -3.669611382e-04f, -6.610005937e-04f, -7.576391290e-05f, +3.895178720e-04f, +2.272972249e-04f, -1.245967078e-04f, -1.788900391e-04f, -1.107160032e-05f, +7.938372451e-05f, +3.407937034e-05f, -1.717373175e-05f, -1.266456791e-05f,\n    /*  6, 7 (48) */\n    +4.351900028e-04f, +4.068432133e-04f, -6.056899527e-04f, -1.606072230e-03f, -5.743688280e-04f, +2.399470802e-03f, +3.567042288e-03f, -3.904034950e-04f, -6.280095313e-03f, -5.715219034e-03f, +4.110801924e-03f, +1.283506064e-02f, +6.417679971e-03f, -1.289124690e-02f, -2.213014388e-02f, -2.534341164e-03f, +3.049977381e-02f, +3.408120850e-02f, -1.293036517e-02f, -6.864987778e-02f, -5.209344049e-02f, +7.611167427e-02f, +2.561432059e-01f, +3.644719450e-01f, +3.193919896e-01f, +1.553627907e-01f, -8.612781634e-03f, -7.456952217e-02f, -4.088437647e-02f, +1.884159245e-02f, +3.811063328e-02f, +1.257841660e-02f, -1.716317426e-02f, -1.979358354e-02f, -1.474056640e-03f, +1.232369453e-02f, +9.032520179e-03f, -2.237723088e-03f, -7.265926767e-03f, -3.195843101e-03f, +2.469144503e-03f, +3.418221151e-03f, +6.412904027e-04f, -1.487383927e-03f, -1.168544394e-03f, +7.225599318e-05f, +5.283046303e-04f, +2.128726479e-04f,\n    -1.063688973e-05f, +1.569108148e-05f, +4.158924427e-05f, +9.410201707e-06f, -7.244037263e-05f, -9.119382763e-05f, +3.592135816e-05f, +1.903282540e-04f, +1.294304454e-04f, -1.761672149e-04f, -3.735988633e-04f, -9.402941106e-05f, +4.716592936e-04f, +5.979583844e-04f, -1.172644383e-04f, -1.000799786e-03f, -8.171726146e-04f, +6.875801614e-04f, +1.985203607e-03f, +1.056304658e-03f, -2.236795531e-03f, -5.355931279e-03f, -5.195828866e-03f, -1.220020865e-03f, +3.695984295e-03f, +5.809449348e-03f, +3.936183247e-03f, +2.965535273e-04f, -1.902486547e-03f, -1.461349932e-03f, +2.205573646e-04f, +1.103947105e-03f, +5.887224336e-04f, -3.533532580e-04f, -6.303124963e-04f, -1.742243306e-04f, +3.078052584e-04f, +3.118067665e-04f, -2.575357107e-06f, -1.995027847e-04f, -1.200915124e-04f, +4.811586372e-05f, +9.735108524e-05f, +2.791572988e-05f, -3.594233741e-05f, -3.162554815e-05f, +1.438952877e-06f, +1.277663204e-05f,\n    -4.351900028e-04f, -8.758035076e-04f, +3.782072913e-04f, +2.674595157e-03f, +1.785343972e-03f, -3.836074096e-03f, -6.751123627e-03f, +1.103099171e-03f, +1.219553207e-02f, +7.901143606e-03f, -1.245266717e-02f, -2.093319177e-02f, +2.040696565e-03f, +2.990956347e-02f, +1.863465797e-02f, -2.504715486e-02f, -4.034574199e-02f, +2.679203460e-03f, +4.901338901e-02f, +2.937464842e-02f, -3.525632829e-02f, -5.453365707e-02f, +2.526953119e-03f, +5.777930921e-02f, +3.333478856e-02f, -3.623629586e-02f, -5.386063349e-02f, +1.598068617e-03f, +4.998309280e-02f, +2.775925466e-02f, -2.721239407e-02f, -3.884188566e-02f, +4.689832901e-04f, +3.114299774e-02f, +1.663507149e-02f, -1.432357402e-02f, -1.959572007e-02f, -2.267306108e-04f, +1.300452821e-02f, +6.673370117e-03f, -4.668638408e-03f, -6.111327841e-03f, -3.265276245e-04f, +2.942201532e-03f, +1.453061032e-03f, -5.913114672e-04f, -7.523297410e-04f, -2.128726479e-04f,\n    +1.063688973e-05f, -5.488598499e-06f, -6.953402739e-05f, -4.895038091e-05f, +1.130564007e-04f, +1.931394007e-04f, -5.714141947e-05f, -3.846256007e-04f, -1.982775184e-04f, +4.613875835e-04f, +6.381420856e-04f, -2.132238567e-04f, -1.045884839e-03f, -4.382401831e-04f, +1.072126567e-03f, +1.281511380e-03f, -4.715174124e-04f, -1.849689529e-03f, -6.483808839e-04f, +1.691760662e-03f, +1.790050839e-03f, -7.131425620e-04f, -2.330838826e-03f, -6.864947182e-04f, +1.930593536e-03f, +1.822822929e-03f, -7.775001628e-04f, -2.154730967e-03f, -5.265038580e-04f, +1.616683612e-03f, +1.358322287e-03f, -6.149814725e-04f, -1.447583542e-03f, -2.837074452e-04f, +9.702090995e-04f, +7.144751560e-04f, -3.400513450e-04f, -6.689749892e-04f, -9.766612121e-05f, +3.847828278e-04f, +2.388029525e-04f, -1.169418174e-04f, -1.821957554e-04f, -1.632438305e-05f, +7.909352851e-05f, +3.627381541e-05f, -1.644502299e-05f, -1.277663204e-05f,\n    /*  6, 8 (48) */\n    +4.245531131e-04f, +4.225342948e-04f, -5.641007085e-04f, -1.596662028e-03f, -6.468092006e-04f, +2.308276975e-03f, +3.602963646e-03f, -2.000752410e-04f, -6.150664868e-03f, -5.891386249e-03f, +3.737203061e-03f, +1.274103123e-02f, +6.889339265e-03f, -1.229328851e-02f, -2.224740832e-02f, -3.535140950e-03f, +2.968260120e-02f, +3.476878867e-02f, -1.094516156e-02f, -6.759357313e-02f, -5.433023602e-02f, +7.075574299e-02f, +2.509473770e-01f, +3.632519241e-01f, +3.230879739e-01f, +1.611722401e-01f, -4.676598387e-03f, -7.427296864e-02f, -4.278686302e-02f, +1.738024252e-02f, +3.833119065e-02f, +1.368236371e-02f, -1.657445183e-02f, -2.014693680e-02f, -2.104369136e-03f, +1.214947020e-02f, +9.340325437e-03f, -1.925916321e-03f, -7.268502124e-03f, -3.395345886e-03f, +2.349052990e-03f, +3.466337015e-03f, +7.386414879e-04f, -1.459468197e-03f, -1.204486732e-03f, +4.063044502e-05f, +5.297435832e-04f, +2.256492799e-04f,\n    -1.099984113e-05f, +1.457939881e-05f, +4.141577321e-05f, +1.152259533e-05f, -7.010488204e-05f, -9.279399612e-05f, +3.033295803e-05f, +1.876528999e-04f, +1.359381228e-04f, -1.657220273e-04f, -3.736965314e-04f, -1.099969455e-04f, +4.565275267e-04f, +6.071083201e-04f, -8.608201384e-05f, -9.837220297e-04f, -8.463047818e-04f, +6.320555428e-04f, +1.970398609e-03f, +1.127971061e-03f, -2.118380642e-03f, -5.295767933e-03f, -5.265596469e-03f, -1.379657921e-03f, +3.569013395e-03f, +5.807412922e-03f, +4.039191267e-03f, +4.023527308e-04f, -1.875207023e-03f, -1.505606117e-03f, +1.717746382e-04f, +1.099457111e-03f, +6.184411672e-04f, -3.304156074e-04f, -6.353258038e-04f, -1.930062863e-04f, +2.990891982e-04f, +3.187360982e-04f, +7.427417591e-06f, -1.978263266e-04f, -1.253399165e-04f, +4.404656456e-05f, +9.814304120e-05f, +3.063836572e-05f, -3.497349141e-05f, -3.254258310e-05f, +5.908061777e-07f, +1.286604092e-05f,\n    -4.245531131e-04f, -8.812921061e-04f, +3.086732639e-04f, +2.625644776e-03f, +1.898400373e-03f, -3.642934695e-03f, -6.808265047e-03f, +7.184735700e-04f, +1.199725455e-02f, +8.362531190e-03f, -1.181452508e-02f, -2.114641563e-02f, +9.948117267e-04f, +2.947132328e-02f, +1.970678454e-02f, -2.376564348e-02f, -4.081725940e-02f, +8.295139303e-04f, +4.836500812e-02f, +3.106640908e-02f, -3.346627745e-02f, -5.524679963e-02f, +1.961142931e-04f, +5.709281450e-02f, +3.526538209e-02f, -3.441347293e-02f, -5.463813366e-02f, -5.566623497e-04f, +4.945658894e-02f, +2.937593827e-02f, -2.585407178e-02f, -3.945686713e-02f, -9.786002519e-04f, +3.085929029e-02f, +1.760528059e-02f, -1.360909887e-02f, -1.993577142e-02f, -8.957056000e-04f, +1.290686209e-02f, +7.058152944e-03f, -4.429835456e-03f, -6.228269659e-03f, -5.087233799e-04f, +2.925877149e-03f, +1.532154561e-03f, -5.550376518e-04f, -7.687747640e-04f, -2.256492799e-04f,\n    +1.099984113e-05f, -3.730547622e-06f, -6.801936589e-05f, -5.208803166e-05f, +1.074248073e-04f, +1.952132355e-04f, -4.519728111e-05f, -3.796149388e-04f, -2.144204917e-04f, +4.421746762e-04f, +6.491725796e-04f, -1.778475050e-04f, -1.037450173e-03f, -4.804177901e-04f, +1.033360712e-03f, +1.309885380e-03f, -4.054899386e-04f, -1.841861095e-03f, -7.206033657e-04f, +1.638106717e-03f, +1.837333188e-03f, -6.264524348e-04f, -2.328907250e-03f, -7.747026606e-04f, +1.877114848e-03f, +1.878578852e-03f, -6.944528796e-04f, -2.160137196e-03f, -6.052932368e-04f, +1.578307649e-03f, +1.405918285e-03f, -5.572134148e-04f, -1.456416562e-03f, -3.344320979e-04f, +9.513450014e-04f, +7.432466222e-04f, -3.122880098e-04f, -6.759568904e-04f, -1.197095174e-04f, +3.793368971e-04f, +2.501024122e-04f, -1.089437530e-04f, -1.852550607e-04f, -2.167294376e-05f, +7.864986146e-05f, +3.846759729e-05f, -1.565328426e-05f, -1.286604092e-05f,\n    /*  6, 9 (48) */\n    +4.135532720e-04f, +4.371136936e-04f, -5.226849353e-04f, -1.585139433e-03f, -7.169140826e-04f, +2.215482978e-03f, +3.633296604e-03f, -1.242234118e-05f, -6.014726745e-03f, -6.057108276e-03f, +3.363506529e-03f, +1.263103429e-02f, +7.345866792e-03f, -1.168618019e-02f, -2.233349033e-02f, -4.518862979e-03f, +2.883629642e-02f, +3.540084421e-02f, -8.974762953e-03f, -6.646560206e-02f, -5.644861666e-02f, +6.545997506e-02f, +2.456817806e-01f, +3.618722662e-01f, +3.266569873e-01f, +1.669796530e-01f, -6.374071197e-04f, -7.387061591e-02f, -4.466207004e-02f, +1.587463640e-02f, +3.850296528e-02f, +1.478182082e-02f, -1.595601066e-02f, -2.047735241e-02f, -2.739694940e-03f, +1.195646391e-02f, +9.639414635e-03f, -1.607180223e-03f, -7.261074707e-03f, -3.593172212e-03f, +2.223713074e-03f, +3.510383580e-03f, +8.367845291e-04f, -1.428829831e-03f, -1.239460223e-03f, +8.087861927e-06f, +5.303343893e-04f, +2.385153209e-04f,\n    -1.133121540e-05f, +1.347274469e-05f, +4.118124412e-05f, +1.357345076e-05f, -6.771082165e-05f, -9.423247423e-05f, +2.479259607e-05f, +1.847553464e-04f, +1.421631704e-04f, -1.551919137e-04f, -3.732817758e-04f, -1.256122270e-04f, +4.409660155e-04f, +6.153311316e-04f, -5.516322276e-05f, -9.655496663e-04f, -8.739545383e-04f, +5.764561357e-04f, +1.953297415e-03f, +1.197032172e-03f, -1.999968260e-03f, -5.232241289e-03f, -5.331273993e-03f, -1.538164326e-03f, +3.439161406e-03f, +5.801141337e-03f, +4.140277667e-03f, +5.096686415e-04f, -1.845094954e-03f, -1.548525361e-03f, +1.221199429e-04f, +1.093440348e-03f, +6.476937013e-04f, -3.067481615e-04f, -6.395347426e-04f, -2.117612916e-04f, +2.898462597e-04f, +3.253162721e-04f, +1.756217103e-05f, -1.958446757e-04f, -1.304927459e-04f, +3.984357343e-05f, +9.880445341e-05f, +3.336966467e-05f, -3.392799952e-05f, -3.342900398e-05f, -2.831127739e-07f, +1.293196236e-05f,\n    -4.135532720e-04f, -8.850226537e-04f, +2.406538980e-04f, +2.573556744e-03f, +2.005825180e-03f, -3.447721460e-03f, -6.853462328e-03f, +3.388586312e-04f, +1.178283406e-02f, +8.804705866e-03f, -1.116535250e-02f, -2.132426314e-02f, -4.263844613e-05f, +2.899090549e-02f, +2.074014525e-02f, -2.245575810e-02f, -4.122274934e-02f, -1.012347165e-03f, +4.764440476e-02f, +3.270451580e-02f, -3.162894426e-02f, -5.587325206e-02f, -2.132792957e-03f, +5.631811183e-02f, +3.714249694e-02f, -3.253489408e-02f, -5.533258654e-02f, -2.716799546e-03f, +4.885129570e-02f, +3.095424592e-02f, -2.444815350e-02f, -4.001408054e-02f, -2.435016814e-03f, +3.052485820e-02f, +1.855662560e-02f, -1.286585224e-02f, -2.024805943e-02f, -1.571662490e-03f, +1.278715257e-02f, +7.437489841e-03f, -4.179733044e-03f, -6.337213412e-03f, -6.939784406e-04f, +2.904204205e-03f, +1.610804422e-03f, -5.165700545e-04f, -7.844280482e-04f, -2.385153209e-04f,\n    +1.133121540e-05f, -2.024337558e-06f, -6.642328452e-05f, -5.505634216e-05f, +1.017319127e-04f, +1.969179001e-04f, -3.338734227e-05f, -3.740600133e-04f, -2.299836744e-04f, +4.224952597e-04f, +6.590306087e-04f, -1.425595170e-04f, -1.027442075e-03f, -5.214749907e-04f, +9.932493695e-04f, +1.336001281e-03f, -3.392018486e-04f, -1.831169253e-03f, -7.913969501e-04f, +1.582053332e-03f, +1.881609933e-03f, -5.389280292e-04f, -2.323318986e-03f, -8.616755363e-04f, +1.820655579e-03f, +1.931453568e-03f, -6.101382732e-04f, -2.162153822e-03f, -6.834162386e-04f, +1.537263510e-03f, +1.451539319e-03f, -4.982027884e-04f, -1.462991477e-03f, -3.850290623e-04f, +9.307838329e-04f, +7.711091956e-04f, -2.837076758e-04f, -6.819225126e-04f, -1.418588860e-04f, +3.731787393e-04f, +2.611726881e-04f, -1.006102801e-04f, -1.880574393e-04f, -2.710958291e-05f, +7.804961113e-05f, +4.065622061e-05f, -1.479810028e-05f, -1.293196236e-05f,\n    /*  6,10 (48) */\n    +4.022220566e-04f, +4.505864383e-04f, -4.815036912e-04f, -1.571565982e-03f, -7.846249043e-04f, +2.121250504e-03f, +3.658089200e-03f, +1.723330052e-04f, -5.872563574e-03f, -6.212300190e-03f, +2.990224753e-03f, +1.250542206e-02f, +7.786832807e-03f, -1.107084906e-02f, -2.238865355e-02f, -5.484412646e-03f, +2.796234188e-02f, +3.597730034e-02f, -7.021465538e-03f, -6.526856989e-02f, -5.844858492e-02f, +6.022773377e-02f, +2.403505066e-01f, +3.603341019e-01f, +3.300961487e-01f, +1.727807943e-01f, +3.502870548e-03f, -7.336094727e-02f, -4.650716500e-02f, +1.432611104e-02f, +3.862508523e-02f, +1.587526117e-02f, -1.530831696e-02f, -2.078410057e-02f, -3.379229683e-03f, +1.174470262e-02f, +9.929260895e-03f, -1.281863951e-03f, -7.243512536e-03f, -3.789016888e-03f, +2.093220328e-03f, +3.550227153e-03f, +9.355889825e-04f, -1.395460166e-03f, -1.273388223e-03f, -2.534114206e-05f, +5.300512766e-04f, +2.514472832e-04f,\n    -1.163122716e-05f, +1.237290880e-05f, +4.088736808e-05f, +1.556080047e-05f, -6.526287593e-05f, -9.550988961e-05f, +1.930752840e-05f, +1.816430483e-04f, +1.481008172e-04f, -1.445927038e-04f, -3.723618031e-04f, -1.408582796e-04f, +4.250011263e-04f, +6.226268793e-04f, -2.454609306e-05f, -9.463197984e-04f, -9.001044679e-04f, +5.208531702e-04f, +1.933953010e-03f, +1.263450662e-03f, -1.881669363e-03f, -5.165431691e-03f, -5.392823581e-03f, -1.695410871e-03f, +3.306529007e-03f, +5.790616145e-03f, +4.239333900e-03f, +6.184132929e-04f, -1.812143592e-03f, -1.590035406e-03f, +7.164636522e-05f, +1.085885881e-03f, +6.764352098e-04f, -2.823741443e-04f, -6.429237330e-04f, -2.304631328e-04f, +2.800825408e-04f, +3.315333797e-04f, +2.781635243e-05f, -1.935561938e-04f, -1.355410019e-04f, +3.551089913e-05f, +9.933198915e-05f, +3.610554137e-05f, -3.280593321e-05f, -3.428258992e-05f, -1.181865908e-06f, +1.297359113e-05f,\n    -4.022220566e-04f, -8.870469913e-04f, +1.742306135e-04f, +2.518500402e-03f, +2.107557093e-03f, -3.250803560e-03f, -6.886849670e-03f, -3.520138210e-05f, +1.155285038e-02f, +9.227201126e-03f, -1.050632189e-02f, -2.146682265e-02f, -1.070080522e-03f, +2.846943050e-02f, +2.173339462e-02f, -2.111975682e-02f, -4.156195119e-02f, -2.843516418e-03f, +4.685300781e-02f, +3.428656913e-02f, -2.974733433e-02f, -5.641218009e-02f, -4.456111943e-03f, +5.545643630e-02f, +3.896315252e-02f, -3.060344051e-02f, -5.594272481e-02f, -4.878953368e-03f, +4.816787947e-02f, +3.249150943e-02f, -2.299661418e-02f, -4.051228333e-02f, -3.898008290e-03f, +3.013982913e-02f, +1.948740943e-02f, -1.209474305e-02f, -2.053176710e-02f, -2.253585003e-03f, +1.264529368e-02f, +7.810668581e-03f, -3.918560355e-03f, -6.437823692e-03f, -8.820358799e-04f, +2.877094622e-03f, +1.688854033e-03f, -4.759138339e-04f, -7.992261485e-04f, -2.514472832e-04f,\n    +1.163122716e-05f, -3.718756133e-07f, -6.475105451e-05f, -5.785387577e-05f, +9.598916518e-05f, +1.982574397e-04f, -2.172951773e-05f, -3.679786417e-04f, -2.449492238e-04f, +4.023878455e-04f, +6.677134881e-04f, -1.074166071e-04f, -1.015891543e-03f, -5.613547283e-04f, +9.518672422e-04f, +1.359831878e-03f, -2.727609708e-04f, -1.817645040e-03f, -8.606542412e-04f, +1.523697855e-03f, +1.922817896e-03f, -4.507103864e-04f, -2.314086478e-03f, -9.472748852e-04f, +1.761304204e-03f, +1.981358900e-03f, -5.246885145e-04f, -2.160768010e-03f, -7.607451793e-04f, +1.493605346e-03f, +1.495101536e-03f, -4.380373535e-04f, -1.467281854e-03f, -4.354149662e-04f, +9.085441513e-04f, +7.980080470e-04f, -2.543486610e-04f, -6.868495175e-04f, -1.640783646e-04f, +3.663082355e-04f, +2.719909026e-04f, -9.194990665e-05f, -1.905926445e-04f, -3.262626545e-05f, +7.728990083e-05f, +4.283507783e-05f, -1.387918782e-05f, -1.297359113e-05f,\n    /*  6,11 (48) */\n    +3.905908294e-04f, +4.629593471e-04f, -4.406163231e-04f, -1.556005181e-03f, -8.498877802e-04f, +2.025740615e-03f, +3.677396728e-03f, +3.539760536e-04f, -5.724462757e-03f, -6.356892894e-03f, +2.617862950e-03f, +1.236456378e-02f, +8.211833933e-03f, -1.044822218e-02f, -2.241319965e-02f, -6.430732444e-03f, +2.706223741e-02f, +3.649815351e-02f, -5.087512528e-03f, -6.400511923e-02f, -6.033025428e-02f, +5.506230208e-02f, +2.349576830e-01f, +3.586386910e-01f, +3.334026777e-01f, +1.785714105e-01f, +7.742204448e-03f, -7.274253398e-02f, -4.831930859e-02f, +1.273607564e-02f, +3.869673159e-02f, +1.696114705e-02f, -1.463188175e-02f, -2.106647472e-02f, -4.022153416e-03f, +1.151423949e-02f, +1.020934344e-02f, -9.503305711e-04f, -7.215696183e-03f, -3.982573082e-03f, +1.957679326e-03f, +3.585738052e-03f, +1.034920972e-03f, -1.359354625e-03f, -1.306194156e-03f, -5.962373197e-05f, +5.288694107e-04f, +2.644208743e-04f,\n    -1.190014518e-05f, +1.128162992e-05f, +4.053591994e-05f, +1.748281484e-05f, -6.276573041e-05f, -9.662710150e-05f, +1.388481807e-05f, +1.783236627e-04f, +1.537467684e-04f, -1.339401158e-04f, -3.709444324e-04f, -1.557188438e-04f, +4.086594606e-04f, +6.289968711e-04f, +5.732189004e-06f, -9.260704767e-04f, -9.247392699e-04f, +4.653170186e-04f, +1.912420313e-03f, +1.327192362e-03f, -1.763593947e-03f, -5.095422190e-03f, -5.450211354e-03f, -1.851269606e-03f, +3.171219637e-03f, +5.775822850e-03f, +4.336252698e-03f, +7.284964753e-04f, -1.776349229e-03f, -1.630064794e-03f, +2.040866966e-05f, +1.076784649e-03f, +7.046210202e-04f, -2.573180078e-04f, -6.454781322e-04f, -2.490853503e-04f, +2.698049460e-04f, +3.373738461e-04f, +3.817706870e-05f, -1.909596659e-04f, -1.404757048e-04f, +3.105281016e-05f, +9.972246519e-05f, +3.884182833e-05f, -3.160749143e-05f, -3.510112941e-05f, -2.104447899e-06f, +1.299015110e-05f,\n    -3.905908294e-04f, -8.874188669e-04f, +1.094795590e-04f, +2.460646526e-03f, +2.203546258e-03f, -3.052546120e-03f, -6.908579188e-03f, -4.031800238e-04f, +1.130790116e-02f, +9.629588971e-03f, -9.838608406e-03f, -2.157423926e-02f, -2.085972064e-03f, +2.790807577e-02f, +2.268526186e-02f, -1.975992494e-02f, -4.183471216e-02f, -4.661161458e-03f, +4.599235357e-02f, +3.581026699e-02f, -2.782451643e-02f, -5.686289048e-02f, -6.770198421e-03f, +5.450916141e-02f, +4.072445673e-02f, -2.862208161e-02f, -5.646741332e-02f, -7.039721378e-03f, +4.740713429e-02f, +3.398511477e-02f, -2.150151264e-02f, -4.095032069e-02f, -5.365290145e-03f, +2.970441417e-02f, +2.039595358e-02f, -1.129673500e-02f, -2.078611577e-02f, -2.940434520e-03f, +1.248121532e-02f, +8.176976816e-03f, -3.646569453e-03f, -6.529773598e-03f, -1.072628524e-03f, +2.844468357e-03f, +1.766143934e-03f, -4.330787560e-04f, -8.131053364e-04f, -2.644208743e-04f,\n    +1.190014518e-05f, +1.225099856e-06f, -6.300796565e-05f, -6.047955359e-05f, +9.020787174e-05f, +1.992364803e-04f, -1.024115626e-05f, -3.613892836e-04f, -2.593005639e-04f, +3.818911886e-04f, +6.752205347e-04f, -7.247466745e-05f, -1.002831839e-03f, -6.000023574e-04f, +9.092905707e-04f, +1.381353880e-03f, -2.062747762e-04f, -1.801323952e-03f, -9.282707680e-04f, +1.463141052e-03f, +1.960899026e-03f, -3.619414277e-04f, -2.301228055e-03f, -1.031364501e-03f, +1.699153931e-03f, +2.028211372e-03f, -4.382378834e-04f, -2.155972421e-03f, -8.371532126e-04f, +1.447391809e-03f, +1.536524015e-03f, -3.768072929e-04f, -1.469264846e-03f, -4.855061388e-04f, +8.846474702e-04f, +8.238894287e-04f, -2.242510113e-04f, -6.907170695e-04f, -1.863314983e-04f, +3.587265066e-04f, +2.825342586e-04f, -8.297188020e-05f, -1.928507229e-04f, -3.821462953e-05f, +7.636810055e-05f, +4.499945636e-05f, -1.289640005e-05f, -1.299015110e-05f,\n    /*  6,12 (48) */\n    +3.786906842e-04f, +4.742409770e-04f, -4.000804031e-04f, -1.538522367e-03f, -9.126535106e-04f, +1.929113513e-03f, +3.691281546e-03f, +5.322997163e-04f, -5.570715989e-03f, -6.490833009e-03f, +2.246918518e-03f, +1.220884494e-02f, +8.620493394e-03f, -9.819225309e-03f, -2.240746746e-02f, -7.356802921e-03f, +2.613749814e-02f, +3.696347053e-02f, -3.175092215e-03f, -6.267792687e-02f, -6.209384823e-02f, +4.996687989e-02f, +2.295074716e-01f, +3.567874214e-01f, +3.365738973e-01f, +1.843472333e-01f, +1.207845715e-02f, -7.201403750e-02f, -5.009565782e-02f, +1.110601084e-02f, +3.871714026e-02f, +1.803793170e-02f, -1.392726073e-02f, -2.132379272e-02f, -4.667631548e-03f, +1.126515414e-02f, +1.047914838e-02f, -6.129567250e-04f, -7.177519115e-03f, -4.173532748e-03f, +1.817203621e-03f, +3.616790862e-03f, +1.134643437e-03f, -1.320512797e-03f, -1.337801647e-03f, -9.472486139e-05f, +5.267649628e-04f, +2.774110254e-04f,\n    -1.213829077e-05f, +1.020059379e-05f, +4.012873408e-05f, +1.933780265e-05f, -6.022406427e-05f, -9.758519584e-05f, +8.531327437e-06f, +1.748050353e-04f, +1.590972051e-04f, -1.232497358e-04f, -3.690380776e-04f, -1.701783911e-04f, +3.919678164e-04f, +6.344436463e-04f, +3.563531872e-05f, -9.048406397e-04f, -9.478457543e-04f, +4.099171202e-04f, +1.888756093e-03f, +1.388226278e-03f, -1.645850917e-03f, -5.022298439e-03f, -5.503407437e-03f, -2.005613969e-03f, +3.033339389e-03f, +5.756750934e-03f, +4.430928190e-03f, +8.398258175e-04f, -1.737711230e-03f, -1.668542953e-03f, -3.153675092e-05f, +1.066129499e-03f, +7.322066741e-04f, -2.316054131e-04f, -6.471842655e-04f, -2.676012728e-04f, +2.590211863e-04f, +3.428244537e-04f, +4.863109859e-05f, -1.880543077e-04f, -1.452879072e-04f, +2.647383212e-05f, +9.997285517e-05f, +4.157428121e-05f, -3.033300262e-05f, -3.588242442e-05f, -3.049786624e-06f, +1.298089736e-05f,\n    -3.786906842e-04f, -8.861937670e-04f, +4.647159335e-05f, +2.400166972e-03f, +2.293754130e-03f, -2.853309640e-03f, -6.918820344e-03f, -7.645693074e-04f, +1.104860059e-02f, +1.001148016e-02f, -9.163387871e-03f, -2.164671393e-02f, -3.088803903e-03f, +2.730807342e-02f, +2.359455243e-02f, -1.837857106e-02f, -4.204098693e-02f, -6.462485410e-03f, +4.506408280e-02f, +3.727340804e-02f, -2.586361741e-02f, -5.722483191e-02f, -9.071426476e-03f, +5.347779691e-02f, +4.242361066e-02f, -2.659387024e-02f, -5.690565121e-02f, -9.195693798e-03f, +4.656998107e-02f, +3.543250658e-02f, -1.996498863e-02f, -4.132712798e-02f, -6.834554991e-03f, +2.921890803e-02f, +2.128060105e-02f, -1.047284557e-02f, -2.101036678e-02f, -3.631151590e-03f, +1.229488382e-02f, +8.535703323e-03f, -3.364035194e-03f, -6.612745479e-03f, -1.265479247e-03f, +2.806253727e-03f, +1.842512035e-03f, -3.880792997e-04f, -8.260017364e-04f, -2.774110254e-04f,\n    +1.213829077e-05f, +2.765018826e-06f, -6.119931503e-05f, -6.293264893e-05f, +8.439917964e-05f, +1.998602095e-04f, +1.060981472e-06f, -3.543109979e-04f, -2.730223974e-04f, +3.610442174e-04f, +6.815530458e-04f, -3.778868120e-05f, -9.882984193e-04f, -6.373657158e-04f, +8.655969926e-04f, +1.400547921e-03f, -1.398502021e-04f, -1.782245864e-03f, -9.941451458e-04f, +1.400486931e-03f, +1.995800483e-03f, -2.727637206e-04f, -2.284767897e-03f, -1.113810654e-03f, +1.634302546e-03f, +2.071932351e-03f, -3.509225522e-04f, -2.147765234e-03f, -9.125145432e-04f, +1.398685977e-03f, +1.575728923e-03f, -3.146050762e-04f, -1.468921251e-03f, -5.352187495e-04f, +8.591182488e-04f, +8.487007769e-04f, -1.934564494e-04f, -6.935058886e-04f, -2.085812962e-04f, +3.504359284e-04f, +2.927800816e-04f, -7.368618329e-05f, -1.948220386e-04f, -4.386599617e-05f, +7.528183798e-05f, +4.714454596e-05f, -1.184973062e-05f, -1.298089736e-05f,\n    /*  6,13 (48) */\n    +3.665523935e-04f, +4.844415708e-04f, -3.599516690e-04f, -1.519184564e-03f, -9.728775749e-04f, +1.831528317e-03f, +3.699812874e-03f, +7.071047516e-04f, -5.411618784e-03f, -6.614082745e-03f, +1.877880440e-03f, +1.203866655e-02f, +9.012461210e-03f, -9.184781663e-03f, -2.237183214e-02f, -8.261643560e-03f, +2.518965239e-02f, +3.737338765e-02f, -1.286336122e-03f, -6.128970059e-02f, -6.373969915e-02f, +4.494458145e-02f, +2.240040642e-01f, +3.547818075e-01f, +3.396072367e-01f, +1.901039843e-01f, +1.650938534e-02f, -7.117421169e-02f, -5.183336905e-02f, +9.437467890e-03f, +3.868560351e-02f, +1.910406119e-02f, -1.319505405e-02f, -2.155539814e-02f, -5.314815813e-03f, +1.099755286e-02f, +1.073816957e-02f, -2.701322713e-04f, -7.128888016e-03f, -4.361587055e-03f, +1.671915714e-03f, +3.643264694e-03f, +1.234616292e-03f, -1.278938516e-03f, -1.368134650e-03f, -1.306072858e-04f, +5.237151761e-04f, +2.903919228e-04f,\n    -1.234603609e-05f, +9.131431252e-06f, +3.966770023e-05f, +2.112421139e-05f, -5.764254316e-05f, -9.838547999e-05f, +3.253710870e-06f, +1.710951859e-04f, +1.641487836e-04f, -1.125369970e-04f, -3.666517270e-04f, -1.842221365e-04f, +3.749531488e-04f, +6.389709586e-04f, +6.512791117e-05f, -8.826700539e-04f, -9.694128361e-04f, +3.547219075e-04f, +1.863018891e-03f, +1.446524599e-03f, -1.528547974e-03f, -4.946148599e-03f, -5.552385977e-03f, -2.158318909e-03f, +2.892996910e-03f, +5.733393884e-03f, +4.523256024e-03f, +9.523068714e-04f, -1.696232062e-03f, -1.705400290e-03f, -8.413192717e-05f, +1.053915209e-03f, +7.591479881e-04f, -2.052632092e-04f, -6.480294558e-04f, -2.859840513e-04f, +2.477397787e-04f, +3.478723656e-04f, +5.916490752e-05f, -1.848397734e-04f, -1.499687083e-04f, +2.177874479e-05f, +1.000802969e-04f, +4.429858431e-05f, -2.898292652e-05f, -3.662429443e-05f, -4.016743749e-06f, +1.294511835e-05f,\n    -3.665523935e-04f, -8.834287482e-04f, -1.472772168e-05f, +2.337234324e-03f, +2.378153310e-03f, -2.653449430e-03f, -6.917759363e-03f, -1.118880305e-03f, +1.077557820e-02f, +1.037252438e-02f, -8.481834825e-03f, -2.168450261e-02f, -4.077102323e-03f, +2.667070770e-02f, +2.446014943e-02f, -1.697802314e-02f, -4.218083714e-02f, -8.244731274e-03f, +4.406993765e-02f, +3.867389497e-02f, -2.386781692e-02f, -5.749759563e-02f, -1.135619437e-02f, +5.236398626e-02f, +4.405791320e-02f, -2.452193789e-02f, -5.725657376e-02f, -1.134345903e-02f, +4.565746653e-02f, +3.683119256e-02f, -1.838925970e-02f, -4.164173305e-02f, -8.303476242e-03f, +2.868368928e-02f, +2.213971930e-02f, -9.624144797e-03f, -2.120382323e-02f, -4.324657479e-03f, +1.208630252e-02f, +8.886139251e-03f, -3.071255113e-03f, -6.686431662e-03f, -1.460301286e-03f, +2.762387731e-03f, +1.917793873e-03f, -3.409347537e-04f, -8.378514670e-04f, -2.903919228e-04f,\n    +1.234603609e-05f, +4.246478632e-06f, -5.933039603e-05f, -6.521278117e-05f, +7.857405835e-05f, +2.001343575e-04f, +1.216074364e-05f, -3.467634009e-04f, -2.861007156e-04f, +3.398859639e-04f, +6.867142749e-04f, -3.412638687e-06f, -9.723288509e-04f, -6.733951917e-04f, +8.208654043e-04f, +1.417398567e-03f, -7.359347869e-05f, -1.760454940e-03f, -1.058179230e-03f, +1.335842558e-03f, +2.027474710e-03f, -1.833202433e-04f, -2.264735987e-03f, -1.194482311e-03f, +1.566852253e-03f, +2.112448184e-03f, -2.628803648e-04f, -2.136150166e-03f, -9.867046377e-04f, +1.347555264e-03f, +1.612641656e-03f, -2.515253188e-04f, -1.466235570e-03f, -5.844689476e-04f, +8.319838752e-04f, +8.723908122e-04f, -1.620083209e-04f, -6.951983024e-04f, -2.307902896e-04f, +3.414401451e-04f, +3.027058630e-04f, -6.410352750e-05f, -1.964972977e-04f, -4.957137964e-05f, +7.402900911e-05f, +4.926544663e-05f, -1.073931758e-05f, -1.294511835e-05f,\n    /*  6,14 (48) */\n    +3.542063574e-04f, +4.935730020e-04f, -3.202839688e-04f, -1.498060353e-03f, -1.030520118e-03f, +1.733142837e-03f, +3.703066585e-03f, +8.781999375e-04f, -5.247470000e-03f, -6.726619742e-03f, +1.511228713e-03f, +1.185444441e-02f, +9.387414359e-03f, -8.545810704e-03f, -2.230670423e-02f, -9.144313614e-03f, +2.422023955e-02f, +3.772810956e-02f, +5.766827686e-04f, -5.984317599e-02f, -6.526824712e-02f, +3.999843285e-02f, +2.184516782e-01f, +3.526234885e-01f, +3.425002336e-01f, +1.958373782e-01f, +2.103264136e-02f, -7.022190482e-02f, -5.352960111e-02f, +7.732067600e-03f, +3.860147158e-02f, +2.015797640e-02f, -1.243590607e-02f, -2.176066135e-02f, -5.962845269e-03f, +1.071156881e-02f, +1.098590935e-02f, +7.774009424e-05f, -7.069723108e-03f, -4.546426829e-03f, +1.521947006e-03f, +3.665043439e-03f, +1.334696589e-03f, -1.234639931e-03f, -1.397117576e-03f, -1.672315802e-04f, +5.196984324e-04f, +3.033370412e-04f,\n    -1.252380240e-05f, +8.075716455e-06f, +3.915475926e-05f, +2.284062728e-05f, -5.502581215e-05f, -9.902947732e-05f, -1.941592106e-06f, +1.672022944e-04f, +1.688986336e-04f, -1.018171598e-04f, -3.637949248e-04f, -1.978360502e-04f, +3.576425317e-04f, +6.425837567e-04f, +9.417553793e-05f, -8.595992529e-04f, -9.894315259e-04f, +2.997987345e-04f, +1.835268932e-03f, +1.502062702e-03f, -1.411791514e-03f, -4.867063234e-03f, -5.597125161e-03f, -2.309261014e-03f, +2.750303297e-03f, +5.705749210e-03f, +4.613133477e-03f, +1.065843199e-03f, -1.651917312e-03f, -1.740568283e-03f, -1.373173676e-04f, +1.040138524e-03f, +7.854011156e-04f, -1.783194103e-04f, -6.480020529e-04f, -3.042066950e-04f, +2.359700435e-04f, +3.525051485e-04f, +6.976466306e-05f, -1.813161613e-04f, -1.545092677e-04f, +1.697257874e-05f, +1.000420994e-04f, +4.701035630e-05f, -2.755785588e-05f, -3.732458058e-05f, -5.004115458e-06f, +1.288213796e-05f,\n    -3.542063574e-04f, -8.791822696e-04f, -7.405811770e-05f, +2.272021542e-03f, +2.456727368e-03f, -2.453315073e-03f, -6.905598619e-03f, -1.465643706e-03f, +1.048947748e-02f, +1.071241034e-02f, -7.795120550e-03f, -2.168791525e-02f, -5.049431174e-03f, +2.599731251e-02f, +2.528101483e-02f, -1.556062457e-02f, -4.225443061e-02f, -1.000518621e-02f, +4.301175842e-02f, +4.000973753e-02f, -2.184034221e-02f, -5.768091587e-02f, -1.362093036e-02f, +5.116950395e-02f, +4.562476546e-02f, -2.240948970e-02f, -5.751945412e-02f, -1.347960920e-02f, +4.467076189e-02f, +3.817874782e-02f, -1.677661805e-02f, -4.189325837e-02f, -9.769711812e-03f, +2.809922033e-02f, +2.297170317e-02f, -8.751753984e-03f, -2.136583155e-02f, -5.019855781e-03f, +1.185551223e-02f, +9.227579396e-03f, -2.768549250e-03f, -6.750535189e-03f, -1.656798584e-03f, +2.712816351e-03f, +1.991822882e-03f, -2.916693071e-04f, -8.485907846e-04f, -3.033370412e-04f,\n    +1.252380240e-05f, +5.668242641e-06f, -5.740648749e-05f, -6.731990907e-05f, +7.274328220e-05f, +2.000651765e-04f, +2.304260649e-05f, -3.387666227e-04f, -2.985228050e-04f, +3.184554961e-04f, +6.907094046e-04f, +3.060054439e-05f, -9.549627299e-04f, -7.080437859e-04f, +7.751758193e-04f, +1.431894319e-03f, -7.609956241e-06f, -1.735999543e-03f, -1.120278267e-03f, +1.269317874e-03f, +2.055879498e-03f, -9.375414920e-05f, -2.241168059e-03f, -1.273251348e-03f, +1.496909514e-03f, +2.149690319e-03f, -1.742506136e-04f, -2.121136482e-03f, -1.059600435e-03f, +1.294071328e-03f, +1.647190982e-03f, -1.876646366e-04f, -1.461196060e-03f, -6.331730036e-04f, +8.032746449e-04f, +8.949096394e-04f, -1.299515369e-04f, -6.957782950e-04f, -2.529205913e-04f, +3.317440804e-04f, +3.122893028e-04f, -5.423534605e-05f, -1.978675716e-04f, -5.532149868e-05f, +7.260778855e-05f, +5.135717680e-05f, -9.565447060e-06f, -1.288213796e-05f,\n    /*  6,15 (48) */\n    +3.416825550e-04f, +5.016487185e-04f, -2.811292096e-04f, -1.475219725e-03f, -1.085545930e-03f, +1.634113360e-03f, +3.701124993e-03f, +1.045402232e-03f, -5.078571367e-03f, -6.828436902e-03f, +1.147433788e-03f, +1.165660836e-02f, +9.745056891e-03f, -7.903226948e-03f, -2.221252869e-02f, -1.000391287e-02f, +2.323080802e-02f, +3.802790829e-02f, +2.411951701e-03f, -5.834111329e-02f, -6.668003863e-02f, +3.513136962e-02f, +2.128545531e-01f, +3.503142275e-01f, +3.452505369e-01f, +2.015431274e-01f, +2.564577484e-02f, -6.915606162e-02f, -5.518151842e-02f, +5.991499317e-03f, +3.846415422e-02f, +2.119811493e-02f, -1.165050495e-02f, -2.193898076e-02f, -6.610847322e-03f, +1.040736212e-02f, +1.122187939e-02f, +4.302452427e-04f, -6.999958445e-03f, -4.727742990e-03f, +1.367437738e-03f, +3.682016018e-03f, +1.434738688e-03f, -1.187629575e-03f, -1.424675432e-03f, -2.045561608e-04f, +5.146943169e-04f, +3.162191791e-04f,\n    -1.267205825e-05f, +7.034965172e-06f, +3.859189896e-05f, +2.448577510e-05f, -5.237848872e-05f, -9.951892142e-05f, -7.048363227e-06f, +1.631346866e-04f, +1.733443561e-04f, -9.110529226e-05f, -3.604777500e-04f, -2.110068681e-04f, +3.400631189e-04f, +6.452881649e-04f, +1.227447621e-04f, -8.356694761e-04f, -1.007894918e-03f, +2.452138071e-04f, +1.805568045e-03f, +1.554819155e-03f, -1.295686520e-03f, -4.785135208e-03f, -5.637607225e-03f, -2.458318630e-03f, +2.605371983e-03f, +5.673818458e-03f, +4.700459576e-03f, +1.180336464e-03f, -1.604775713e-03f, -1.773979571e-03f, -1.910321154e-04f, +1.024798178e-03f, +8.109226079e-04f, -1.508031714e-04f, -6.470914609e-04f, -3.222421066e-04f, +2.237221013e-04f, +3.567107958e-04f, +8.041625104e-05f, -1.774840205e-04f, -1.589008196e-04f, +1.206061149e-05f, +9.985575014e-05f, +4.970515603e-05f, -2.605851780e-05f, -3.798114978e-05f, -6.010633299e-06f, +1.279131761e-05f,\n    -3.416825550e-04f, -8.735140269e-04f, -1.314646052e-04f, +2.204701633e-03f, +2.529470650e-03f, -2.253249896e-03f, -6.882556012e-03f, -1.804410329e-03f, +1.019095468e-02f, +1.103086584e-02f, -7.104411146e-03f, -2.165731470e-02f, -6.004393903e-03f, +2.528926872e-02f, +2.605619065e-02f, -1.412873026e-02f, -4.226204057e-02f, -1.174118576e-02f, +4.189148016e-02f, +4.127905540e-02f, -1.978446272e-02f, -5.777467002e-02f, -1.586209842e-02f, +4.989625260e-02f, +4.712167497e-02f, -2.025979938e-02f, -5.769370474e-02f, -1.560074568e-02f, +4.361116146e-02f, +3.947281915e-02f, -1.512942707e-02f, -4.208092301e-02f, -1.123090787e-02f, +2.746604733e-02f, +2.377497782e-02f, -7.856844345e-03f, -2.149578308e-02f, -5.715634076e-03f, +1.160259164e-02f, +9.559323477e-03f, -2.456259947e-03f, -6.804770535e-03f, -1.854666155e-03f, +2.657494853e-03f, +2.064430670e-03f, -2.403121303e-04f, -8.581562317e-04f, -3.162191791e-04f,\n    +1.267205825e-05f, +7.029238600e-06f, -5.543284324e-05f, -6.925432346e-05f, +6.691741390e-05f, +1.996594200e-04f, +3.369169212e-05f, -3.303412642e-04f, -3.102772523e-04f, +2.967918487e-04f, +6.935455157e-04f, +6.419910584e-05f, -9.362415961e-04f, -7.412671690e-04f, +7.286092271e-04f, +1.444027608e-03f, +5.799606398e-05f, -1.708932137e-03f, -1.180351032e-03f, +1.201025502e-03f, +2.080978043e-03f, -4.208531243e-06f, -2.214105531e-03f, -1.349992761e-03f, +1.424584869e-03f, +2.183595432e-03f, -8.517381261e-05f, -2.102738992e-03f, -1.131080554e-03f, +1.238309972e-03f, +1.679309172e-03f, -1.231214967e-04f, -1.453794775e-03f, -6.812474507e-04f, +7.730237344e-04f, +9.162088455e-04f, -9.733251319e-05f, -6.952315542e-04f, -2.749339573e-04f, +3.213539468e-04f, +3.215083537e-04f, -4.409378486e-05f, -1.989243212e-04f, -6.110678857e-05f, +7.101663954e-05f, +5.341468188e-05f, -8.328556656e-06f, -1.279131761e-05f,\n    /*  6,16 (48) */\n    +3.290104967e-04f, +5.086836836e-04f, -2.425373106e-04f, -1.450733950e-03f, -1.137924419e-03f, +1.534594438e-03f, +3.694076629e-03f, +1.208536918e-03f, -4.905227010e-03f, -6.919542194e-03f, +7.869560385e-04f, +1.144560149e-02f, +1.008512001e-02f, -7.257938783e-03f, -2.208978393e-02f, -1.083958234e-02f, +2.222291311e-02f, +3.827312210e-02f, +4.217519746e-03f, -5.678629413e-02f, -6.797572515e-02f, +3.034623441e-02f, +2.072169458e-01f, +3.478559089e-01f, +3.478559089e-01f, +2.072169458e-01f, +3.034623441e-02f, -6.797572515e-02f, -5.678629413e-02f, +4.217519746e-03f, +3.827312210e-02f, +2.222291311e-02f, -1.083958234e-02f, -2.208978393e-02f, -7.257938783e-03f, +1.008512001e-02f, +1.144560149e-02f, +7.869560385e-04f, -6.919542194e-03f, -4.905227010e-03f, +1.208536918e-03f, +3.694076629e-03f, +1.534594438e-03f, -1.137924419e-03f, -1.450733950e-03f, -2.425373106e-04f, +5.086836836e-04f, +3.290104967e-04f,\n    -1.279131761e-05f, +6.010633299e-06f, +3.798114978e-05f, +2.605851780e-05f, -4.970515603e-05f, -9.985575014e-05f, -1.206061149e-05f, +1.589008196e-04f, +1.774840205e-04f, -8.041625104e-05f, -3.567107958e-04f, -2.237221013e-04f, +3.222421066e-04f, +6.470914609e-04f, +1.508031714e-04f, -8.109226079e-04f, -1.024798178e-03f, +1.910321154e-04f, +1.773979571e-03f, +1.604775713e-03f, -1.180336464e-03f, -4.700459576e-03f, -5.673818458e-03f, -2.605371983e-03f, +2.458318630e-03f, +5.637607225e-03f, +4.785135208e-03f, +1.295686520e-03f, -1.554819155e-03f, -1.805568045e-03f, -2.452138071e-04f, +1.007894918e-03f, +8.356694761e-04f, -1.227447621e-04f, -6.452881649e-04f, -3.400631189e-04f, +2.110068681e-04f, +3.604777500e-04f, +9.110529226e-05f, -1.733443561e-04f, -1.631346866e-04f, +7.048363227e-06f, +9.951892142e-05f, +5.237848872e-05f, -2.448577510e-05f, -3.859189896e-05f, -7.034965172e-06f, +1.267205825e-05f,\n    -3.290104967e-04f, -8.664847883e-04f, -1.868974484e-04f, +2.135447310e-03f, +2.596388064e-03f, -2.053590476e-03f, -6.848864320e-03f, -2.134751593e-03f, +9.880677424e-03f, +1.132765769e-02f, -6.410865630e-03f, -2.159311560e-02f, -6.940635500e-03f, +2.454800155e-02f, +2.678479988e-02f, -1.268470265e-02f, -4.220404451e-02f, -1.345011789e-02f, +4.071112912e-02f, +4.248008090e-02f, -1.770348467e-02f, -5.777887855e-02f, -1.807620395e-02f, +4.854625984e-02f, +4.854625984e-02f, -1.807620395e-02f, -5.777887855e-02f, -1.770348467e-02f, +4.248008090e-02f, +4.071112912e-02f, -1.345011789e-02f, -4.220404451e-02f, -1.268470265e-02f, +2.678479988e-02f, +2.454800155e-02f, -6.940635500e-03f, -2.159311560e-02f, -6.410865630e-03f, +1.132765769e-02f, +9.880677424e-03f, -2.134751593e-03f, -6.848864320e-03f, -2.053590476e-03f, +2.596388064e-03f, +2.135447310e-03f, -1.868974484e-04f, -8.664847883e-04f, -3.290104967e-04f,\n    +1.279131761e-05f, +8.328556656e-06f, -5.341468188e-05f, -7.101663954e-05f, +6.110678857e-05f, +1.989243212e-04f, +4.409378486e-05f, -3.215083537e-04f, -3.213539468e-04f, +2.749339573e-04f, +6.952315542e-04f, +9.733251319e-05f, -9.162088455e-04f, -7.730237344e-04f, +6.812474507e-04f, +1.453794775e-03f, +1.231214967e-04f, -1.679309172e-03f, -1.238309972e-03f, +1.131080554e-03f, +2.102738992e-03f, +8.517381261e-05f, -2.183595432e-03f, -1.424584869e-03f, +1.349992761e-03f, +2.214105531e-03f, +4.208531243e-06f, -2.080978043e-03f, -1.201025502e-03f, +1.180351032e-03f, +1.708932137e-03f, -5.799606398e-05f, -1.444027608e-03f, -7.286092271e-04f, +7.412671690e-04f, +9.362415961e-04f, -6.419910584e-05f, -6.935455157e-04f, -2.967918487e-04f, +3.102772523e-04f, +3.303412642e-04f, -3.369169212e-05f, -1.996594200e-04f, -6.691741390e-05f, +6.925432346e-05f, +5.543284324e-05f, -7.029238600e-06f, -1.267205825e-05f,\n    /*  6,17 (48) */\n    +3.162191791e-04f, +5.146943169e-04f, -2.045561608e-04f, -1.424675432e-03f, -1.187629575e-03f, +1.434738688e-03f, +3.682016018e-03f, +1.367437738e-03f, -4.727742990e-03f, -6.999958445e-03f, +4.302452427e-04f, +1.122187939e-02f, +1.040736212e-02f, -6.610847322e-03f, -2.193898076e-02f, -1.165050495e-02f, +2.119811493e-02f, +3.846415422e-02f, +5.991499317e-03f, -5.518151842e-02f, -6.915606162e-02f, +2.564577484e-02f, +2.015431274e-01f, +3.452505369e-01f, +3.503142275e-01f, +2.128545531e-01f, +3.513136962e-02f, -6.668003863e-02f, -5.834111329e-02f, +2.411951701e-03f, +3.802790829e-02f, +2.323080802e-02f, -1.000391287e-02f, -2.221252869e-02f, -7.903226948e-03f, +9.745056891e-03f, +1.165660836e-02f, +1.147433788e-03f, -6.828436902e-03f, -5.078571367e-03f, +1.045402232e-03f, +3.701124993e-03f, +1.634113360e-03f, -1.085545930e-03f, -1.475219725e-03f, -2.811292096e-04f, +5.016487185e-04f, +3.416825550e-04f,\n    -1.288213796e-05f, +5.004115458e-06f, +3.732458058e-05f, +2.755785588e-05f, -4.701035630e-05f, -1.000420994e-04f, -1.697257874e-05f, +1.545092677e-04f, +1.813161613e-04f, -6.976466306e-05f, -3.525051485e-04f, -2.359700435e-04f, +3.042066950e-04f, +6.480020529e-04f, +1.783194103e-04f, -7.854011156e-04f, -1.040138524e-03f, +1.373173676e-04f, +1.740568283e-03f, +1.651917312e-03f, -1.065843199e-03f, -4.613133477e-03f, -5.705749210e-03f, -2.750303297e-03f, +2.309261014e-03f, +5.597125161e-03f, +4.867063234e-03f, +1.411791514e-03f, -1.502062702e-03f, -1.835268932e-03f, -2.997987345e-04f, +9.894315259e-04f, +8.595992529e-04f, -9.417553793e-05f, -6.425837567e-04f, -3.576425317e-04f, +1.978360502e-04f, +3.637949248e-04f, +1.018171598e-04f, -1.688986336e-04f, -1.672022944e-04f, +1.941592106e-06f, +9.902947732e-05f, +5.502581215e-05f, -2.284062728e-05f, -3.915475926e-05f, -8.075716455e-06f, +1.252380240e-05f,\n    -3.162191791e-04f, -8.581562317e-04f, -2.403121303e-04f, +2.064430670e-03f, +2.657494853e-03f, -1.854666155e-03f, -6.804770535e-03f, -2.456259947e-03f, +9.559323477e-03f, +1.160259164e-02f, -5.715634076e-03f, -2.149578308e-02f, -7.856844345e-03f, +2.377497782e-02f, +2.746604733e-02f, -1.123090787e-02f, -4.208092301e-02f, -1.512942707e-02f, +3.947281915e-02f, +4.361116146e-02f, -1.560074568e-02f, -5.769370474e-02f, -2.025979938e-02f, +4.712167497e-02f, +4.989625260e-02f, -1.586209842e-02f, -5.777467002e-02f, -1.978446272e-02f, +4.127905540e-02f, +4.189148016e-02f, -1.174118576e-02f, -4.226204057e-02f, -1.412873026e-02f, +2.605619065e-02f, +2.528926872e-02f, -6.004393903e-03f, -2.165731470e-02f, -7.104411146e-03f, +1.103086584e-02f, +1.019095468e-02f, -1.804410329e-03f, -6.882556012e-03f, -2.253249896e-03f, +2.529470650e-03f, +2.204701633e-03f, -1.314646052e-04f, -8.735140269e-04f, -3.416825550e-04f,\n    +1.288213796e-05f, +9.565447060e-06f, -5.135717680e-05f, -7.260778855e-05f, +5.532149868e-05f, +1.978675716e-04f, +5.423534605e-05f, -3.122893028e-04f, -3.317440804e-04f, +2.529205913e-04f, +6.957782950e-04f, +1.299515369e-04f, -8.949096394e-04f, -8.032746449e-04f, +6.331730036e-04f, +1.461196060e-03f, +1.876646366e-04f, -1.647190982e-03f, -1.294071328e-03f, +1.059600435e-03f, +2.121136482e-03f, +1.742506136e-04f, -2.149690319e-03f, -1.496909514e-03f, +1.273251348e-03f, +2.241168059e-03f, +9.375414920e-05f, -2.055879498e-03f, -1.269317874e-03f, +1.120278267e-03f, +1.735999543e-03f, +7.609956241e-06f, -1.431894319e-03f, -7.751758193e-04f, +7.080437859e-04f, +9.549627299e-04f, -3.060054439e-05f, -6.907094046e-04f, -3.184554961e-04f, +2.985228050e-04f, +3.387666227e-04f, -2.304260649e-05f, -2.000651765e-04f, -7.274328220e-05f, +6.731990907e-05f, +5.740648749e-05f, -5.668242641e-06f, -1.252380240e-05f,\n    /*  6,18 (48) */\n    +3.033370412e-04f, +5.196984324e-04f, -1.672315802e-04f, -1.397117576e-03f, -1.234639931e-03f, +1.334696589e-03f, +3.665043439e-03f, +1.521947006e-03f, -4.546426829e-03f, -7.069723108e-03f, +7.774009424e-05f, +1.098590935e-02f, +1.071156881e-02f, -5.962845269e-03f, -2.176066135e-02f, -1.243590607e-02f, +2.015797640e-02f, +3.860147158e-02f, +7.732067600e-03f, -5.352960111e-02f, -7.022190482e-02f, +2.103264136e-02f, +1.958373782e-01f, +3.425002336e-01f, +3.526234885e-01f, +2.184516782e-01f, +3.999843285e-02f, -6.526824712e-02f, -5.984317599e-02f, +5.766827686e-04f, +3.772810956e-02f, +2.422023955e-02f, -9.144313614e-03f, -2.230670423e-02f, -8.545810704e-03f, +9.387414359e-03f, +1.185444441e-02f, +1.511228713e-03f, -6.726619742e-03f, -5.247470000e-03f, +8.781999375e-04f, +3.703066585e-03f, +1.733142837e-03f, -1.030520118e-03f, -1.498060353e-03f, -3.202839688e-04f, +4.935730020e-04f, +3.542063574e-04f,\n    -1.294511835e-05f, +4.016743749e-06f, +3.662429443e-05f, +2.898292652e-05f, -4.429858431e-05f, -1.000802969e-04f, -2.177874479e-05f, +1.499687083e-04f, +1.848397734e-04f, -5.916490752e-05f, -3.478723656e-04f, -2.477397787e-04f, +2.859840513e-04f, +6.480294558e-04f, +2.052632092e-04f, -7.591479881e-04f, -1.053915209e-03f, +8.413192717e-05f, +1.705400290e-03f, +1.696232062e-03f, -9.523068714e-04f, -4.523256024e-03f, -5.733393884e-03f, -2.892996910e-03f, +2.158318909e-03f, +5.552385977e-03f, +4.946148599e-03f, +1.528547974e-03f, -1.446524599e-03f, -1.863018891e-03f, -3.547219075e-04f, +9.694128361e-04f, +8.826700539e-04f, -6.512791117e-05f, -6.389709586e-04f, -3.749531488e-04f, +1.842221365e-04f, +3.666517270e-04f, +1.125369970e-04f, -1.641487836e-04f, -1.710951859e-04f, -3.253710870e-06f, +9.838547999e-05f, +5.764254316e-05f, -2.112421139e-05f, -3.966770023e-05f, -9.131431252e-06f, +1.234603609e-05f,\n    -3.033370412e-04f, -8.485907846e-04f, -2.916693071e-04f, +1.991822882e-03f, +2.712816351e-03f, -1.656798584e-03f, -6.750535189e-03f, -2.768549250e-03f, +9.227579396e-03f, +1.185551223e-02f, -5.019855781e-03f, -2.136583155e-02f, -8.751753984e-03f, +2.297170317e-02f, +2.809922033e-02f, -9.769711812e-03f, -4.189325837e-02f, -1.677661805e-02f, +3.817874782e-02f, +4.467076189e-02f, -1.347960920e-02f, -5.751945412e-02f, -2.240948970e-02f, +4.562476546e-02f, +5.116950395e-02f, -1.362093036e-02f, -5.768091587e-02f, -2.184034221e-02f, +4.000973753e-02f, +4.301175842e-02f, -1.000518621e-02f, -4.225443061e-02f, -1.556062457e-02f, +2.528101483e-02f, +2.599731251e-02f, -5.049431174e-03f, -2.168791525e-02f, -7.795120550e-03f, +1.071241034e-02f, +1.048947748e-02f, -1.465643706e-03f, -6.905598619e-03f, -2.453315073e-03f, +2.456727368e-03f, +2.272021542e-03f, -7.405811770e-05f, -8.791822696e-04f, -3.542063574e-04f,\n    +1.294511835e-05f, +1.073931758e-05f, -4.926544663e-05f, -7.402900911e-05f, +4.957137964e-05f, +1.964972977e-04f, +6.410352750e-05f, -3.027058630e-04f, -3.414401451e-04f, +2.307902896e-04f, +6.951983024e-04f, +1.620083209e-04f, -8.723908122e-04f, -8.319838752e-04f, +5.844689476e-04f, +1.466235570e-03f, +2.515253188e-04f, -1.612641656e-03f, -1.347555264e-03f, +9.867046377e-04f, +2.136150166e-03f, +2.628803648e-04f, -2.112448184e-03f, -1.566852253e-03f, +1.194482311e-03f, +2.264735987e-03f, +1.833202433e-04f, -2.027474710e-03f, -1.335842558e-03f, +1.058179230e-03f, +1.760454940e-03f, +7.359347869e-05f, -1.417398567e-03f, -8.208654043e-04f, +6.733951917e-04f, +9.723288509e-04f, +3.412638687e-06f, -6.867142749e-04f, -3.398859639e-04f, +2.861007156e-04f, +3.467634009e-04f, -1.216074364e-05f, -2.001343575e-04f, -7.857405835e-05f, +6.521278117e-05f, +5.933039603e-05f, -4.246478632e-06f, -1.234603609e-05f,\n    /*  6,19 (48) */\n    +2.903919228e-04f, +5.237151761e-04f, -1.306072858e-04f, -1.368134650e-03f, -1.278938516e-03f, +1.234616292e-03f, +3.643264694e-03f, +1.671915714e-03f, -4.361587055e-03f, -7.128888016e-03f, -2.701322713e-04f, +1.073816957e-02f, +1.099755286e-02f, -5.314815813e-03f, -2.155539814e-02f, -1.319505405e-02f, +1.910406119e-02f, +3.868560351e-02f, +9.437467890e-03f, -5.183336905e-02f, -7.117421169e-02f, +1.650938534e-02f, +1.901039843e-01f, +3.396072367e-01f, +3.547818075e-01f, +2.240040642e-01f, +4.494458145e-02f, -6.373969915e-02f, -6.128970059e-02f, -1.286336122e-03f, +3.737338765e-02f, +2.518965239e-02f, -8.261643560e-03f, -2.237183214e-02f, -9.184781663e-03f, +9.012461210e-03f, +1.203866655e-02f, +1.877880440e-03f, -6.614082745e-03f, -5.411618784e-03f, +7.071047516e-04f, +3.699812874e-03f, +1.831528317e-03f, -9.728775749e-04f, -1.519184564e-03f, -3.599516690e-04f, +4.844415708e-04f, +3.665523935e-04f,\n    -1.298089736e-05f, +3.049786624e-06f, +3.588242442e-05f, +3.033300262e-05f, -4.157428121e-05f, -9.997285517e-05f, -2.647383212e-05f, +1.452879072e-04f, +1.880543077e-04f, -4.863109859e-05f, -3.428244537e-04f, -2.590211863e-04f, +2.676012728e-04f, +6.471842655e-04f, +2.316054131e-04f, -7.322066741e-04f, -1.066129499e-03f, +3.153675092e-05f, +1.668542953e-03f, +1.737711230e-03f, -8.398258175e-04f, -4.430928190e-03f, -5.756750934e-03f, -3.033339389e-03f, +2.005613969e-03f, +5.503407437e-03f, +5.022298439e-03f, +1.645850917e-03f, -1.388226278e-03f, -1.888756093e-03f, -4.099171202e-04f, +9.478457543e-04f, +9.048406397e-04f, -3.563531872e-05f, -6.344436463e-04f, -3.919678164e-04f, +1.701783911e-04f, +3.690380776e-04f, +1.232497358e-04f, -1.590972051e-04f, -1.748050353e-04f, -8.531327437e-06f, +9.758519584e-05f, +6.022406427e-05f, -1.933780265e-05f, -4.012873408e-05f, -1.020059379e-05f, +1.213829077e-05f,\n    -2.903919228e-04f, -8.378514670e-04f, -3.409347537e-04f, +1.917793873e-03f, +2.762387731e-03f, -1.460301286e-03f, -6.686431662e-03f, -3.071255113e-03f, +8.886139251e-03f, +1.208630252e-02f, -4.324657479e-03f, -2.120382323e-02f, -9.624144797e-03f, +2.213971930e-02f, +2.868368928e-02f, -8.303476242e-03f, -4.164173305e-02f, -1.838925970e-02f, +3.683119256e-02f, +4.565746653e-02f, -1.134345903e-02f, -5.725657376e-02f, -2.452193789e-02f, +4.405791320e-02f, +5.236398626e-02f, -1.135619437e-02f, -5.749759563e-02f, -2.386781692e-02f, +3.867389497e-02f, +4.406993765e-02f, -8.244731274e-03f, -4.218083714e-02f, -1.697802314e-02f, +2.446014943e-02f, +2.667070770e-02f, -4.077102323e-03f, -2.168450261e-02f, -8.481834825e-03f, +1.037252438e-02f, +1.077557820e-02f, -1.118880305e-03f, -6.917759363e-03f, -2.653449430e-03f, +2.378153310e-03f, +2.337234324e-03f, -1.472772168e-05f, -8.834287482e-04f, -3.665523935e-04f,\n    +1.298089736e-05f, +1.184973062e-05f, -4.714454596e-05f, -7.528183798e-05f, +4.386599617e-05f, +1.948220386e-04f, +7.368618329e-05f, -2.927800816e-04f, -3.504359284e-04f, +2.085812962e-04f, +6.935058886e-04f, +1.934564494e-04f, -8.487007769e-04f, -8.591182488e-04f, +5.352187495e-04f, +1.468921251e-03f, +3.146050762e-04f, -1.575728923e-03f, -1.398685977e-03f, +9.125145432e-04f, +2.147765234e-03f, +3.509225522e-04f, -2.071932351e-03f, -1.634302546e-03f, +1.113810654e-03f, +2.284767897e-03f, +2.727637206e-04f, -1.995800483e-03f, -1.400486931e-03f, +9.941451458e-04f, +1.782245864e-03f, +1.398502021e-04f, -1.400547921e-03f, -8.655969926e-04f, +6.373657158e-04f, +9.882984193e-04f, +3.778868120e-05f, -6.815530458e-04f, -3.610442174e-04f, +2.730223974e-04f, +3.543109979e-04f, -1.060981472e-06f, -1.998602095e-04f, -8.439917964e-05f, +6.293264893e-05f, +6.119931503e-05f, -2.765018826e-06f, -1.213829077e-05f,\n    /*  6,20 (48) */\n    +2.774110254e-04f, +5.267649628e-04f, -9.472486139e-05f, -1.337801647e-03f, -1.320512797e-03f, +1.134643437e-03f, +3.616790862e-03f, +1.817203621e-03f, -4.173532748e-03f, -7.177519115e-03f, -6.129567250e-04f, +1.047914838e-02f, +1.126515414e-02f, -4.667631548e-03f, -2.132379272e-02f, -1.392726073e-02f, +1.803793170e-02f, +3.871714026e-02f, +1.110601084e-02f, -5.009565782e-02f, -7.201403750e-02f, +1.207845715e-02f, +1.843472333e-01f, +3.365738973e-01f, +3.567874214e-01f, +2.295074716e-01f, +4.996687989e-02f, -6.209384823e-02f, -6.267792687e-02f, -3.175092215e-03f, +3.696347053e-02f, +2.613749814e-02f, -7.356802921e-03f, -2.240746746e-02f, -9.819225309e-03f, +8.620493394e-03f, +1.220884494e-02f, +2.246918518e-03f, -6.490833009e-03f, -5.570715989e-03f, +5.322997163e-04f, +3.691281546e-03f, +1.929113513e-03f, -9.126535106e-04f, -1.538522367e-03f, -4.000804031e-04f, +4.742409770e-04f, +3.786906842e-04f,\n    -1.299015110e-05f, +2.104447899e-06f, +3.510112941e-05f, +3.160749143e-05f, -3.884182833e-05f, -9.972246519e-05f, -3.105281016e-05f, +1.404757048e-04f, +1.909596659e-04f, -3.817706870e-05f, -3.373738461e-04f, -2.698049460e-04f, +2.490853503e-04f, +6.454781322e-04f, +2.573180078e-04f, -7.046210202e-04f, -1.076784649e-03f, -2.040866966e-05f, +1.630064794e-03f, +1.776349229e-03f, -7.284964753e-04f, -4.336252698e-03f, -5.775822850e-03f, -3.171219637e-03f, +1.851269606e-03f, +5.450211354e-03f, +5.095422190e-03f, +1.763593947e-03f, -1.327192362e-03f, -1.912420313e-03f, -4.653170186e-04f, +9.247392699e-04f, +9.260704767e-04f, -5.732189004e-06f, -6.289968711e-04f, -4.086594606e-04f, +1.557188438e-04f, +3.709444324e-04f, +1.339401158e-04f, -1.537467684e-04f, -1.783236627e-04f, -1.388481807e-05f, +9.662710150e-05f, +6.276573041e-05f, -1.748281484e-05f, -4.053591994e-05f, -1.128162992e-05f, +1.190014518e-05f,\n    -2.774110254e-04f, -8.260017364e-04f, -3.880792997e-04f, +1.842512035e-03f, +2.806253727e-03f, -1.265479247e-03f, -6.612745479e-03f, -3.364035194e-03f, +8.535703323e-03f, +1.229488382e-02f, -3.631151590e-03f, -2.101036678e-02f, -1.047284557e-02f, +2.128060105e-02f, +2.921890803e-02f, -6.834554991e-03f, -4.132712798e-02f, -1.996498863e-02f, +3.543250658e-02f, +4.656998107e-02f, -9.195693798e-03f, -5.690565121e-02f, -2.659387024e-02f, +4.242361066e-02f, +5.347779691e-02f, -9.071426476e-03f, -5.722483191e-02f, -2.586361741e-02f, +3.727340804e-02f, +4.506408280e-02f, -6.462485410e-03f, -4.204098693e-02f, -1.837857106e-02f, +2.359455243e-02f, +2.730807342e-02f, -3.088803903e-03f, -2.164671393e-02f, -9.163387871e-03f, +1.001148016e-02f, +1.104860059e-02f, -7.645693074e-04f, -6.918820344e-03f, -2.853309640e-03f, +2.293754130e-03f, +2.400166972e-03f, +4.647159335e-05f, -8.861937670e-04f, -3.786906842e-04f,\n    +1.299015110e-05f, +1.289640005e-05f, -4.499945636e-05f, -7.636810055e-05f, +3.821462953e-05f, +1.928507229e-04f, +8.297188020e-05f, -2.825342586e-04f, -3.587265066e-04f, +1.863314983e-04f, +6.907170695e-04f, +2.242510113e-04f, -8.238894287e-04f, -8.846474702e-04f, +4.855061388e-04f, +1.469264846e-03f, +3.768072929e-04f, -1.536524015e-03f, -1.447391809e-03f, +8.371532126e-04f, +2.155972421e-03f, +4.382378834e-04f, -2.028211372e-03f, -1.699153931e-03f, +1.031364501e-03f, +2.301228055e-03f, +3.619414277e-04f, -1.960899026e-03f, -1.463141052e-03f, +9.282707680e-04f, +1.801323952e-03f, +2.062747762e-04f, -1.381353880e-03f, -9.092905707e-04f, +6.000023574e-04f, +1.002831839e-03f, +7.247466745e-05f, -6.752205347e-04f, -3.818911886e-04f, +2.593005639e-04f, +3.613892836e-04f, +1.024115626e-05f, -1.992364803e-04f, -9.020787174e-05f, +6.047955359e-05f, +6.300796565e-05f, -1.225099856e-06f, -1.190014518e-05f,\n    /*  6,21 (48) */\n    +2.644208743e-04f, +5.288694107e-04f, -5.962373197e-05f, -1.306194156e-03f, -1.359354625e-03f, +1.034920972e-03f, +3.585738052e-03f, +1.957679326e-03f, -3.982573082e-03f, -7.215696183e-03f, -9.503305711e-04f, +1.020934344e-02f, +1.151423949e-02f, -4.022153416e-03f, -2.106647472e-02f, -1.463188175e-02f, +1.696114705e-02f, +3.869673159e-02f, +1.273607564e-02f, -4.831930859e-02f, -7.274253398e-02f, +7.742204448e-03f, +1.785714105e-01f, +3.334026777e-01f, +3.586386910e-01f, +2.349576830e-01f, +5.506230208e-02f, -6.033025428e-02f, -6.400511923e-02f, -5.087512528e-03f, +3.649815351e-02f, +2.706223741e-02f, -6.430732444e-03f, -2.241319965e-02f, -1.044822218e-02f, +8.211833933e-03f, +1.236456378e-02f, +2.617862950e-03f, -6.356892894e-03f, -5.724462757e-03f, +3.539760536e-04f, +3.677396728e-03f, +2.025740615e-03f, -8.498877802e-04f, -1.556005181e-03f, -4.406163231e-04f, +4.629593471e-04f, +3.905908294e-04f,\n    -1.297359113e-05f, +1.181865908e-06f, +3.428258992e-05f, +3.280593321e-05f, -3.610554137e-05f, -9.933198915e-05f, -3.551089913e-05f, +1.355410019e-04f, +1.935561938e-04f, -2.781635243e-05f, -3.315333797e-04f, -2.800825408e-04f, +2.304631328e-04f, +6.429237330e-04f, +2.823741443e-04f, -6.764352098e-04f, -1.085885881e-03f, -7.164636522e-05f, +1.590035406e-03f, +1.812143592e-03f, -6.184132929e-04f, -4.239333900e-03f, -5.790616145e-03f, -3.306529007e-03f, +1.695410871e-03f, +5.392823581e-03f, +5.165431691e-03f, +1.881669363e-03f, -1.263450662e-03f, -1.933953010e-03f, -5.208531702e-04f, +9.001044679e-04f, +9.463197984e-04f, +2.454609306e-05f, -6.226268793e-04f, -4.250011263e-04f, +1.408582796e-04f, +3.723618031e-04f, +1.445927038e-04f, -1.481008172e-04f, -1.816430483e-04f, -1.930752840e-05f, +9.550988961e-05f, +6.526287593e-05f, -1.556080047e-05f, -4.088736808e-05f, -1.237290880e-05f, +1.163122716e-05f,\n    -2.644208743e-04f, -8.131053364e-04f, -4.330787560e-04f, +1.766143934e-03f, +2.844468357e-03f, -1.072628524e-03f, -6.529773598e-03f, -3.646569453e-03f, +8.176976816e-03f, +1.248121532e-02f, -2.940434520e-03f, -2.078611577e-02f, -1.129673500e-02f, +2.039595358e-02f, +2.970441417e-02f, -5.365290145e-03f, -4.095032069e-02f, -2.150151264e-02f, +3.398511477e-02f, +4.740713429e-02f, -7.039721378e-03f, -5.646741332e-02f, -2.862208161e-02f, +4.072445673e-02f, +5.450916141e-02f, -6.770198421e-03f, -5.686289048e-02f, -2.782451643e-02f, +3.581026699e-02f, +4.599235357e-02f, -4.661161458e-03f, -4.183471216e-02f, -1.975992494e-02f, +2.268526186e-02f, +2.790807577e-02f, -2.085972064e-03f, -2.157423926e-02f, -9.838608406e-03f, +9.629588971e-03f, +1.130790116e-02f, -4.031800238e-04f, -6.908579188e-03f, -3.052546120e-03f, +2.203546258e-03f, +2.460646526e-03f, +1.094795590e-04f, -8.874188669e-04f, -3.905908294e-04f,\n    +1.297359113e-05f, +1.387918782e-05f, -4.283507783e-05f, -7.728990083e-05f, +3.262626545e-05f, +1.905926445e-04f, +9.194990665e-05f, -2.719909026e-04f, -3.663082355e-04f, +1.640783646e-04f, +6.868495175e-04f, +2.543486610e-04f, -7.980080470e-04f, -9.085441513e-04f, +4.354149662e-04f, +1.467281854e-03f, +4.380373535e-04f, -1.495101536e-03f, -1.493605346e-03f, +7.607451793e-04f, +2.160768010e-03f, +5.246885145e-04f, -1.981358900e-03f, -1.761304204e-03f, +9.472748852e-04f, +2.314086478e-03f, +4.507103864e-04f, -1.922817896e-03f, -1.523697855e-03f, +8.606542412e-04f, +1.817645040e-03f, +2.727609708e-04f, -1.359831878e-03f, -9.518672422e-04f, +5.613547283e-04f, +1.015891543e-03f, +1.074166071e-04f, -6.677134881e-04f, -4.023878455e-04f, +2.449492238e-04f, +3.679786417e-04f, +2.172951773e-05f, -1.982574397e-04f, -9.598916518e-05f, +5.785387577e-05f, +6.475105451e-05f, +3.718756133e-07f, -1.163122716e-05f,\n    /*  6,22 (48) */\n    +2.514472832e-04f, +5.300512766e-04f, -2.534114206e-05f, -1.273388223e-03f, -1.395460166e-03f, +9.355889825e-04f, +3.550227153e-03f, +2.093220328e-03f, -3.789016888e-03f, -7.243512536e-03f, -1.281863951e-03f, +9.929260895e-03f, +1.174470262e-02f, -3.379229683e-03f, -2.078410057e-02f, -1.530831696e-02f, +1.587526117e-02f, +3.862508523e-02f, +1.432611104e-02f, -4.650716500e-02f, -7.336094727e-02f, +3.502870548e-03f, +1.727807943e-01f, +3.300961487e-01f, +3.603341019e-01f, +2.403505066e-01f, +6.022773377e-02f, -5.844858492e-02f, -6.526856989e-02f, -7.021465538e-03f, +3.597730034e-02f, +2.796234188e-02f, -5.484412646e-03f, -2.238865355e-02f, -1.107084906e-02f, +7.786832807e-03f, +1.250542206e-02f, +2.990224753e-03f, -6.212300190e-03f, -5.872563574e-03f, +1.723330052e-04f, +3.658089200e-03f, +2.121250504e-03f, -7.846249043e-04f, -1.571565982e-03f, -4.815036912e-04f, +4.505864383e-04f, +4.022220566e-04f,\n    -1.293196236e-05f, +2.831127739e-07f, +3.342900398e-05f, +3.392799952e-05f, -3.336966467e-05f, -9.880445341e-05f, -3.984357343e-05f, +1.304927459e-04f, +1.958446757e-04f, -1.756217103e-05f, -3.253162721e-04f, -2.898462597e-04f, +2.117612916e-04f, +6.395347426e-04f, +3.067481615e-04f, -6.476937013e-04f, -1.093440348e-03f, -1.221199429e-04f, +1.548525361e-03f, +1.845094954e-03f, -5.096686415e-04f, -4.140277667e-03f, -5.801141337e-03f, -3.439161406e-03f, +1.538164326e-03f, +5.331273993e-03f, +5.232241289e-03f, +1.999968260e-03f, -1.197032172e-03f, -1.953297415e-03f, -5.764561357e-04f, +8.739545383e-04f, +9.655496663e-04f, +5.516322276e-05f, -6.153311316e-04f, -4.409660155e-04f, +1.256122270e-04f, +3.732817758e-04f, +1.551919137e-04f, -1.421631704e-04f, -1.847553464e-04f, -2.479259607e-05f, +9.423247423e-05f, +6.771082165e-05f, -1.357345076e-05f, -4.118124412e-05f, -1.347274469e-05f, +1.133121540e-05f,\n    -2.514472832e-04f, -7.992261485e-04f, -4.759138339e-04f, +1.688854033e-03f, +2.877094622e-03f, -8.820358799e-04f, -6.437823692e-03f, -3.918560355e-03f, +7.810668581e-03f, +1.264529368e-02f, -2.253585003e-03f, -2.053176710e-02f, -1.209474305e-02f, +1.948740943e-02f, +3.013982913e-02f, -3.898008290e-03f, -4.051228333e-02f, -2.299661418e-02f, +3.249150943e-02f, +4.816787947e-02f, -4.878953368e-03f, -5.594272481e-02f, -3.060344051e-02f, +3.896315252e-02f, +5.545643630e-02f, -4.456111943e-03f, -5.641218009e-02f, -2.974733433e-02f, +3.428656913e-02f, +4.685300781e-02f, -2.843516418e-03f, -4.156195119e-02f, -2.111975682e-02f, +2.173339462e-02f, +2.846943050e-02f, -1.070080522e-03f, -2.146682265e-02f, -1.050632189e-02f, +9.227201126e-03f, +1.155285038e-02f, -3.520138210e-05f, -6.886849670e-03f, -3.250803560e-03f, +2.107557093e-03f, +2.518500402e-03f, +1.742306135e-04f, -8.870469913e-04f, -4.022220566e-04f,\n    +1.293196236e-05f, +1.479810028e-05f, -4.065622061e-05f, -7.804961113e-05f, +2.710958291e-05f, +1.880574393e-04f, +1.006102801e-04f, -2.611726881e-04f, -3.731787393e-04f, +1.418588860e-04f, +6.819225126e-04f, +2.837076758e-04f, -7.711091956e-04f, -9.307838329e-04f, +3.850290623e-04f, +1.462991477e-03f, +4.982027884e-04f, -1.451539319e-03f, -1.537263510e-03f, +6.834162386e-04f, +2.162153822e-03f, +6.101382732e-04f, -1.931453568e-03f, -1.820655579e-03f, +8.616755363e-04f, +2.323318986e-03f, +5.389280292e-04f, -1.881609933e-03f, -1.582053332e-03f, +7.913969501e-04f, +1.831169253e-03f, +3.392018486e-04f, -1.336001281e-03f, -9.932493695e-04f, +5.214749907e-04f, +1.027442075e-03f, +1.425595170e-04f, -6.590306087e-04f, -4.224952597e-04f, +2.299836744e-04f, +3.740600133e-04f, +3.338734227e-05f, -1.969179001e-04f, -1.017319127e-04f, +5.505634216e-05f, +6.642328452e-05f, +2.024337558e-06f, -1.133121540e-05f,\n    /*  6,23 (48) */\n    +2.385153209e-04f, +5.303343893e-04f, +8.087861927e-06f, -1.239460223e-03f, -1.428829831e-03f, +8.367845291e-04f, +3.510383580e-03f, +2.223713074e-03f, -3.593172212e-03f, -7.261074707e-03f, -1.607180223e-03f, +9.639414635e-03f, +1.195646391e-02f, -2.739694940e-03f, -2.047735241e-02f, -1.595601066e-02f, +1.478182082e-02f, +3.850296528e-02f, +1.587463640e-02f, -4.466207004e-02f, -7.387061591e-02f, -6.374071197e-04f, +1.669796530e-01f, +3.266569873e-01f, +3.618722662e-01f, +2.456817806e-01f, +6.545997506e-02f, -5.644861666e-02f, -6.646560206e-02f, -8.974762953e-03f, +3.540084421e-02f, +2.883629642e-02f, -4.518862979e-03f, -2.233349033e-02f, -1.168618019e-02f, +7.345866792e-03f, +1.263103429e-02f, +3.363506529e-03f, -6.057108276e-03f, -6.014726745e-03f, -1.242234118e-05f, +3.633296604e-03f, +2.215482978e-03f, -7.169140826e-04f, -1.585139433e-03f, -5.226849353e-04f, +4.371136936e-04f, +4.135532720e-04f,\n    -1.286604092e-05f, -5.908061777e-07f, +3.254258310e-05f, +3.497349141e-05f, -3.063836572e-05f, -9.814304120e-05f, -4.404656456e-05f, +1.253399165e-04f, +1.978263266e-04f, -7.427417591e-06f, -3.187360982e-04f, -2.990891982e-04f, +1.930062863e-04f, +6.353258038e-04f, +3.304156074e-04f, -6.184411672e-04f, -1.099457111e-03f, -1.717746382e-04f, +1.505606117e-03f, +1.875207023e-03f, -4.023527308e-04f, -4.039191267e-03f, -5.807412922e-03f, -3.569013395e-03f, +1.379657921e-03f, +5.265596469e-03f, +5.295767933e-03f, +2.118380642e-03f, -1.127971061e-03f, -1.970398609e-03f, -6.320555428e-04f, +8.463047818e-04f, +9.837220297e-04f, +8.608201384e-05f, -6.071083201e-04f, -4.565275267e-04f, +1.099969455e-04f, +3.736965314e-04f, +1.657220273e-04f, -1.359381228e-04f, -1.876528999e-04f, -3.033295803e-05f, +9.279399612e-05f, +7.010488204e-05f, -1.152259533e-05f, -4.141577321e-05f, -1.457939881e-05f, +1.099984113e-05f,\n    -2.385153209e-04f, -7.844280482e-04f, -5.165700545e-04f, +1.610804422e-03f, +2.904204205e-03f, -6.939784406e-04f, -6.337213412e-03f, -4.179733044e-03f, +7.437489841e-03f, +1.278715257e-02f, -1.571662490e-03f, -2.024805943e-02f, -1.286585224e-02f, +1.855662560e-02f, +3.052485820e-02f, -2.435016814e-03f, -4.001408054e-02f, -2.444815350e-02f, +3.095424592e-02f, +4.885129570e-02f, -2.716799546e-03f, -5.533258654e-02f, -3.253489408e-02f, +3.714249694e-02f, +5.631811183e-02f, -2.132792957e-03f, -5.587325206e-02f, -3.162894426e-02f, +3.270451580e-02f, +4.764440476e-02f, -1.012347165e-03f, -4.122274934e-02f, -2.245575810e-02f, +2.074014525e-02f, +2.899090549e-02f, -4.263844613e-05f, -2.132426314e-02f, -1.116535250e-02f, +8.804705866e-03f, +1.178283406e-02f, +3.388586312e-04f, -6.853462328e-03f, -3.447721460e-03f, +2.005825180e-03f, +2.573556744e-03f, +2.406538980e-04f, -8.850226537e-04f, -4.135532720e-04f,\n    +1.286604092e-05f, +1.565328426e-05f, -3.846759729e-05f, -7.864986146e-05f, +2.167294376e-05f, +1.852550607e-04f, +1.089437530e-04f, -2.501024122e-04f, -3.793368971e-04f, +1.197095174e-04f, +6.759568904e-04f, +3.122880098e-04f, -7.432466222e-04f, -9.513450014e-04f, +3.344320979e-04f, +1.456416562e-03f, +5.572134148e-04f, -1.405918285e-03f, -1.578307649e-03f, +6.052932368e-04f, +2.160137196e-03f, +6.944528796e-04f, -1.878578852e-03f, -1.877114848e-03f, +7.747026606e-04f, +2.328907250e-03f, +6.264524348e-04f, -1.837333188e-03f, -1.638106717e-03f, +7.206033657e-04f, +1.841861095e-03f, +4.054899386e-04f, -1.309885380e-03f, -1.033360712e-03f, +4.804177901e-04f, +1.037450173e-03f, +1.778475050e-04f, -6.491725796e-04f, -4.421746762e-04f, +2.144204917e-04f, +3.796149388e-04f, +4.519728111e-05f, -1.952132355e-04f, -1.074248073e-04f, +5.208803166e-05f, +6.801936589e-05f, +3.730547622e-06f, -1.099984113e-05f,\n    /*  6,24 (48) */\n    +2.256492799e-04f, +5.297435832e-04f, +4.063044502e-05f, -1.204486732e-03f, -1.459468197e-03f, +7.386414879e-04f, +3.466337015e-03f, +2.349052990e-03f, -3.395345886e-03f, -7.268502124e-03f, -1.925916321e-03f, +9.340325437e-03f, +1.214947020e-02f, -2.104369136e-03f, -2.014693680e-02f, -1.657445183e-02f, +1.368236371e-02f, +3.833119065e-02f, +1.738024252e-02f, -4.278686302e-02f, -7.427296864e-02f, -4.676598387e-03f, +1.611722401e-01f, +3.230879739e-01f, +3.632519241e-01f, +2.509473770e-01f, +7.075574299e-02f, -5.433023602e-02f, -6.759357313e-02f, -1.094516156e-02f, +3.476878867e-02f, +2.968260120e-02f, -3.535140950e-03f, -2.224740832e-02f, -1.229328851e-02f, +6.889339265e-03f, +1.274103123e-02f, +3.737203061e-03f, -5.891386249e-03f, -6.150664868e-03f, -2.000752410e-04f, +3.602963646e-03f, +2.308276975e-03f, -6.468092006e-04f, -1.596662028e-03f, -5.641007085e-04f, +4.225342948e-04f, +4.245531131e-04f,\n    -1.277663204e-05f, -1.438952877e-06f, +3.162554815e-05f, +3.594233741e-05f, -2.791572988e-05f, -9.735108524e-05f, -4.811586372e-05f, +1.200915124e-04f, +1.995027847e-04f, +2.575357107e-06f, -3.118067665e-04f, -3.078052584e-04f, +1.742243306e-04f, +6.303124963e-04f, +3.533532580e-04f, -5.887224336e-04f, -1.103947105e-03f, -2.205573646e-04f, +1.461349932e-03f, +1.902486547e-03f, -2.965535273e-04f, -3.936183247e-03f, -5.809449348e-03f, -3.695984295e-03f, +1.220020865e-03f, +5.195828866e-03f, +5.355931279e-03f, +2.236795531e-03f, -1.056304658e-03f, -1.985203607e-03f, -6.875801614e-04f, +8.171726146e-04f, +1.000799786e-03f, +1.172644383e-04f, -5.979583844e-04f, -4.716592936e-04f, +9.402941106e-05f, +3.735988633e-04f, +1.761672149e-04f, -1.294304454e-04f, -1.903282540e-04f, -3.592135816e-05f, +9.119382763e-05f, +7.244037263e-05f, -9.410201707e-06f, -4.158924427e-05f, -1.569108148e-05f, +1.063688973e-05f,\n    -2.256492799e-04f, -7.687747640e-04f, -5.550376518e-04f, +1.532154561e-03f, +2.925877149e-03f, -5.087233799e-04f, -6.228269659e-03f, -4.429835456e-03f, +7.058152944e-03f, +1.290686209e-02f, -8.957056000e-04f, -1.993577142e-02f, -1.360909887e-02f, +1.760528059e-02f, +3.085929029e-02f, -9.786002519e-04f, -3.945686713e-02f, -2.585407178e-02f, +2.937593827e-02f, +4.945658894e-02f, -5.566623497e-04f, -5.463813366e-02f, -3.441347293e-02f, +3.526538209e-02f, +5.709281450e-02f, +1.961142931e-04f, -5.524679963e-02f, -3.346627745e-02f, +3.106640908e-02f, +4.836500812e-02f, +8.295139303e-04f, -4.081725940e-02f, -2.376564348e-02f, +1.970678454e-02f, +2.947132328e-02f, +9.948117267e-04f, -2.114641563e-02f, -1.181452508e-02f, +8.362531190e-03f, +1.199725455e-02f, +7.184735700e-04f, -6.808265047e-03f, -3.642934695e-03f, +1.898400373e-03f, +2.625644776e-03f, +3.086732639e-04f, -8.812921061e-04f, -4.245531131e-04f,\n    +1.277663204e-05f, +1.644502299e-05f, -3.627381541e-05f, -7.909352851e-05f, +1.632438305e-05f, +1.821957554e-04f, +1.169418174e-04f, -2.388029525e-04f, -3.847828278e-04f, +9.766612121e-05f, +6.689749892e-04f, +3.400513450e-04f, -7.144751560e-04f, -9.702090995e-04f, +2.837074452e-04f, +1.447583542e-03f, +6.149814725e-04f, -1.358322287e-03f, -1.616683612e-03f, +5.265038580e-04f, +2.154730967e-03f, +7.775001628e-04f, -1.822822929e-03f, -1.930593536e-03f, +6.864947182e-04f, +2.330838826e-03f, +7.131425620e-04f, -1.790050839e-03f, -1.691760662e-03f, +6.483808839e-04f, +1.849689529e-03f, +4.715174124e-04f, -1.281511380e-03f, -1.072126567e-03f, +4.382401831e-04f, +1.045884839e-03f, +2.132238567e-04f, -6.381420856e-04f, -4.613875835e-04f, +1.982775184e-04f, +3.846256007e-04f, +5.714141947e-05f, -1.931394007e-04f, -1.130564007e-04f, +4.895038091e-05f, +6.953402739e-05f, +5.488598499e-06f, -1.063688973e-05f,\n    /*  6,25 (48) */\n    +2.128726479e-04f, +5.283046303e-04f, +7.225599318e-05f, -1.168544394e-03f, -1.487383927e-03f, +6.412904027e-04f, +3.418221151e-03f, +2.469144503e-03f, -3.195843101e-03f, -7.265926767e-03f, -2.237723088e-03f, +9.032520179e-03f, +1.232369453e-02f, -1.474056640e-03f, -1.979358354e-02f, -1.716317426e-02f, +1.257841660e-02f, +3.811063328e-02f, +1.884159245e-02f, -4.088437647e-02f, -7.456952217e-02f, -8.612781634e-03f, +1.553627907e-01f, +3.193919896e-01f, +3.644719450e-01f, +2.561432059e-01f, +7.611167427e-02f, -5.209344049e-02f, -6.864987778e-02f, -1.293036517e-02f, +3.408120850e-02f, +3.049977381e-02f, -2.534341164e-03f, -2.213014388e-02f, -1.289124690e-02f, +6.417679971e-03f, +1.283506064e-02f, +4.110801924e-03f, -5.715219034e-03f, -6.280095313e-03f, -3.904034950e-04f, +3.567042288e-03f, +2.399470802e-03f, -5.743688280e-04f, -1.606072230e-03f, -6.056899527e-04f, +4.068432133e-04f, +4.351900028e-04f,\n    -1.266456791e-05f, -2.260456842e-06f, +3.068012551e-05f, +3.683459133e-05f, -2.520575530e-05f, -9.643206018e-05f, -5.204772384e-05f, +1.147565375e-04f, +2.008761034e-04f, +1.243395811e-05f, -3.045424952e-04f, -3.159891480e-04f, +1.554413590e-04f, +6.245113053e-04f, +3.755391344e-04f, -5.585824193e-04f, -1.106923101e-03f, -2.684167601e-04f, +1.415829765e-03f, +1.926943287e-03f, -1.923566759e-04f, -3.831363317e-03f, -5.807272982e-03f, -3.819976279e-03f, +1.059383497e-03f, +5.122012995e-03f, +5.412653779e-03f, +2.355101077e-03f, -9.820734400e-04f, -1.997661437e-03f, -7.429579806e-04f, +7.865775689e-04f, +1.016746838e-03f, +1.486716681e-04f, -5.878825260e-04f, -4.863352246e-04f, +7.772730152e-05f, +3.729821955e-04f, +1.865115568e-04f, -1.226453846e-04f, -1.927741706e-04f, -4.155035540e-05f, +8.943157738e-05f, +7.471261742e-05f, -7.238374544e-06f, -4.170001406e-05f, -1.680595422e-05f, +1.024220231e-05f,\n    -2.128726479e-04f, -7.523297410e-04f, -5.913114672e-04f, +1.453061032e-03f, +2.942201532e-03f, -3.265276245e-04f, -6.111327841e-03f, -4.668638408e-03f, +6.673370117e-03f, +1.300452821e-02f, -2.267306108e-04f, -1.959572007e-02f, -1.432357402e-02f, +1.663507149e-02f, +3.114299774e-02f, +4.689832901e-04f, -3.884188566e-02f, -2.721239407e-02f, +2.775925466e-02f, +4.998309280e-02f, +1.598068617e-03f, -5.386063349e-02f, -3.623629586e-02f, +3.333478856e-02f, +5.777930921e-02f, +2.526953119e-03f, -5.453365707e-02f, -3.525632829e-02f, +2.937464842e-02f, +4.901338901e-02f, +2.679203460e-03f, -4.034574199e-02f, -2.504715486e-02f, +1.863465797e-02f, +2.990956347e-02f, +2.040696565e-03f, -2.093319177e-02f, -1.245266717e-02f, +7.901143606e-03f, +1.219553207e-02f, +1.103099171e-03f, -6.751123627e-03f, -3.836074096e-03f, +1.785343972e-03f, +2.674595157e-03f, +3.782072913e-04f, -8.758035076e-04f, -4.351900028e-04f,\n    +1.266456791e-05f, +1.717373175e-05f, -3.407937034e-05f, -7.938372451e-05f, +1.107160032e-05f, +1.788900391e-04f, +1.245967078e-04f, -2.272972249e-04f, -3.895178720e-04f, +7.576391290e-05f, +6.610005937e-04f, +3.669611382e-04f, -6.848506056e-04f, -9.873605329e-04f, +2.329380412e-04f, +1.436522367e-03f, +6.714217553e-04f, -1.308837966e-03f, -1.652341818e-03f, +4.471764115e-04f, +2.145953423e-03f, +8.591502741e-04f, -1.764278523e-03f, -1.981008035e-03f, +5.971921956e-04f, +2.329107182e-03f, +7.988584839e-04f, -1.739831097e-03f, -1.742921408e-03f, +5.748396599e-04f, +1.854628048e-03f, +5.371762618e-04f, -1.250910379e-03f, -1.109473904e-03f, +3.950015605e-04f, +1.052717418e-03f, +2.486311244e-04f, -6.259438306e-04f, -4.800957835e-04f, +1.815738499e-04f, +3.890748647e-04f, +6.920130012e-05f, -1.906929491e-04f, -1.186151225e-04f, +4.564518926e-05f, +7.096202782e-05f, +7.296413674e-06f, -1.024220231e-05f,\n    /*  6,26 (48) */\n    +2.002080800e-04f, +5.260441735e-04f, +1.029361187e-04f, -1.131709803e-03f, -1.512589682e-03f, +5.448583425e-04f, +3.366173427e-03f, +2.583901040e-03f, -2.994966997e-03f, -7.253492809e-03f, -2.542265583e-03f, +8.716531031e-03f, +1.247913589e-02f, -8.495453346e-04f, -1.941804441e-02f, -1.772175668e-02f, +1.147149350e-02f, +3.784221652e-02f, +2.025742222e-02f, -3.895743318e-02f, -7.476187885e-02f, -1.244414495e-02f, +1.495555178e-01f, +3.155720133e-01f, +3.655313285e-01f, +2.612652189e-01f, +8.152432805e-02f, -4.973833941e-02f, -6.963195122e-02f, -1.492802661e-02f, +3.333825052e-02f, +3.128635138e-02f, -1.517594326e-03f, -2.198147221e-02f, -1.347912942e-02f, +5.931344747e-03f, +1.291278795e-02f, +4.483784119e-03f, -5.528707477e-03f, -6.402740698e-03f, -5.831776656e-04f, +3.525491932e-03f, +2.488902380e-03f, -4.996562106e-04f, -1.613310604e-03f, -6.473899668e-04f, +3.900372591e-04f, +4.454322052e-04f,\n    -1.253070546e-05f, -3.054515381e-06f, +2.970854302e-05f, +3.765042989e-05f, -2.251234812e-05f, -9.538957497e-05f, -5.583866130e-05f, +1.093439878e-04f, +2.019487425e-04f, +2.213655910e-05f, -2.969577884e-04f, -3.236363777e-04f, +1.366829950e-04f, +6.179395883e-04f, +3.969525186e-04f, -5.280660766e-04f, -1.108399673e-03f, -3.153032321e-04f, +1.369119190e-03f, +1.948589975e-03f, -8.984542406e-05f, -3.724842225e-03f, -5.800910076e-03f, -3.940894468e-03f, +8.978771603e-04f, +5.044194584e-03f, +5.465860778e-03f, +2.473184673e-03f, -9.053210094e-04f, -2.007723215e-03f, -7.981162878e-04f, +7.545412919e-04f, +1.031528156e-03f, +1.802641175e-04f, -5.768832206e-04f, -5.005295418e-04f, +6.110897977e-05f, +3.718405999e-04f, +1.967390650e-04f, -1.155886614e-04f, -1.949836418e-04f, -4.721233222e-05f, +8.750709462e-05f, +7.691695648e-05f, -5.009354660e-06f, -4.174651130e-05f, -1.792213212e-05f, +9.815677156e-06f,\n    -2.002080800e-04f, -7.351560092e-04f, -6.253908375e-04f, +1.373677308e-03f, +2.953273132e-03f, -1.476375854e-04f, -5.986731133e-03f, -4.895935633e-03f, +6.283852244e-03f, +1.308029212e-02f, +4.342699829e-04f, -1.922875894e-02f, -1.500842463e-02f, +1.564771096e-02f, +3.137593578e-02f, +1.905505657e-03f, -3.817046390e-02f, -2.852123204e-02f, +2.610691284e-02f, +5.043026921e-02f, +3.744022040e-03f, -5.300148322e-02f, -3.800057438e-02f, +3.135378052e-02f, +5.837650141e-02f, +4.856060301e-03f, -5.373479858e-02f, -3.699615939e-02f, +2.763172701e-02f, +4.958822867e-02f, +4.533831508e-03f, -3.980856572e-02f, -2.629806524e-02f, +1.752518407e-02f, +3.030456503e-02f, +3.093413984e-03f, -2.068456065e-02f, -1.307861100e-02f, +7.421047823e-03f, +1.237710592e-02f, +1.492174035e-03f, -6.681922327e-03f, -4.026767045e-03f, +1.666728850e-03f, +2.720240346e-03f, +4.491693191e-04f, -8.685070939e-04f, -4.454322052e-04f,\n    +1.253070546e-05f, +1.783995335e-05f, -3.188863867e-05f, -7.952378569e-05f, +5.921951639e-06f, +1.753486718e-04f, +1.319014032e-04f, -2.156081422e-04f, -3.935445733e-04f, +5.403740792e-05f, +6.520588780e-04f, +3.929826645e-04f, -6.544296547e-04f, -1.002786671e-03f, +1.822062518e-04f, +1.423266428e-03f, +7.264517373e-04f, -1.257554585e-03f, -1.685237321e-03f, +3.674396180e-04f, +2.133828266e-03f, +9.392758951e-04f, -1.703042750e-03f, -2.028279749e-03f, +5.069373762e-04f, +2.323711714e-03f, +8.834616194e-04f, -1.686747109e-03f, -1.791498952e-03f, +5.000924368e-04f, +1.856654741e-03f, +6.023584774e-04f, -1.218117339e-03f, -1.145331498e-03f, +3.507635665e-04f, +1.057921668e-03f, +2.840112181e-04f, -6.125845522e-04f, -4.982614622e-04f, +1.643298167e-04f, +3.929463207e-04f, +8.135794825e-05f, -1.878710499e-04f, -1.240893005e-04f, +4.217462308e-05f, +7.229816771e-05f, +9.151747540e-06f, -9.815677156e-06f,\n    /*  6,27 (48) */\n    +1.876773745e-04f, +5.229896581e-04f, +1.326446617e-04f, -1.094059373e-03f, -1.535102030e-03f, +4.494687675e-04f, +3.310334766e-03f, +2.693245028e-03f, -2.793018255e-03f, -7.231356250e-03f, -2.839223371e-03f, +8.392894653e-03f, +1.261581888e-02f, -2.316057463e-04f, -1.902109189e-02f, -1.824982276e-02f, +1.036309383e-02f, +3.752691329e-02f, +2.162654141e-02f, -3.700884321e-02f, -7.485172427e-02f, -1.616898718e-02f, +1.437546077e-01f, +3.116311188e-01f, +3.664292057e-01f, +2.663094135e-01f, +8.699018883e-02f, -4.726515474e-02f, -7.053727223e-02f, -1.693574982e-02f, +3.254013424e-02f, +3.204089267e-02f, -4.860661693e-04f, -2.180120809e-02f, -1.405601264e-02f, +5.430815205e-03f, +1.297389693e-02f, +4.855624719e-03f, -5.331968412e-03f, -6.518329359e-03f, -7.781613074e-04f, +3.478279600e-03f, +2.576409474e-03f, -4.227392541e-04f, -1.618319959e-03f, -6.891364781e-04f, +3.721151269e-04f, +4.552478823e-04f,\n    -1.237592426e-05f, -3.820393667e-06f, +2.871302625e-05f, +3.839015022e-05f, -1.983931782e-05f, -9.422736517e-05f, -5.948545712e-05f, +1.038628378e-04f, +2.027235592e-04f, +3.167171449e-05f, -2.890674119e-04f, -3.307432576e-04f, +1.179745186e-04f, +6.106155420e-04f, +4.175739665e-04f, -4.972183318e-04f, -1.108393160e-03f, -3.611689990e-04f, +1.321292299e-03f, +1.967442276e-03f, +1.089945062e-05f, -3.616731638e-03f, -5.790390724e-03f, -4.058647023e-03f, +7.356340633e-04f, +4.962423244e-03f, +5.515480599e-03f, +2.590933072e-03f, -8.260940707e-04f, -2.015342221e-03f, -8.529817484e-04f, +7.210875415e-04f, +1.045109832e-03f, +2.120014881e-04f, -5.649642299e-04f, -5.142168205e-04f, +4.419347652e-05f, +3.701688128e-04f, +2.068337056e-04f, -1.082664692e-04f, -1.969499038e-04f, -5.289950351e-05f, +8.542047327e-05f, +7.904875357e-05f, -2.725517788e-06f, -4.172724070e-05f, -1.903768623e-05f, +9.357271131e-06f,\n    -1.876773745e-04f, -7.173160559e-04f, -6.572794762e-04f, +1.294153522e-03f, +2.959195084e-03f, +2.771108642e-05f, -5.854829730e-03f, -5.111543775e-03f, +5.890307671e-03f, +1.313432953e-02f, +1.086328861e-03f, -1.883577627e-02f, -1.566285428e-02f, +1.464492429e-02f, +3.155814203e-02f, +3.328772085e-03f, -3.744401216e-02f, -2.977878662e-02f, +2.442167552e-02f, +5.079770883e-02f, +5.877850305e-03f, -5.206220732e-02f, -3.970361713e-02f, +2.932550077e-02f, +5.888343879e-02f, +7.179772015e-03f, -5.285133696e-02f, -3.868290649e-02f, +2.584022806e-02f, +5.008832111e-02f, +6.390486249e-03f, -3.920620725e-02f, -2.751618258e-02f, +1.637985257e-02f, +3.065532859e-02f, +4.151335652e-03f, -2.040054943e-02f, -1.369119555e-02f, +6.922786361e-03f, +1.254143573e-02f, +1.885120356e-03f, -6.600564379e-03f, -4.214638095e-03f, +1.542639549e-03f, +2.762414969e-03f, +5.214674869e-04f, -8.593553464e-04f, -4.552478823e-04f,\n    +1.237592426e-05f, +1.844435346e-05f, -2.970587195e-05f, -7.951726066e-05f, +8.824424543e-07f, +1.715826333e-04f, +1.388496268e-04f, -2.037585732e-04f, -3.968666565e-04f, +3.252037081e-05f, +6.421763456e-04f, +4.180830575e-04f, -6.232697581e-04f, -1.016477841e-03f, +1.315937390e-04f, +1.407852481e-03f, +7.799916939e-04f, -1.204563872e-03f, -1.715329861e-03f, +2.874223964e-04f, +2.118384554e-03f, +1.017752442e-03f, -1.639216953e-03f, -2.072335209e-03f, +4.158741060e-04f, +2.314657752e-03f, +9.668149639e-04f, -1.630876849e-03f, -1.837407206e-03f, +4.242543686e-04f, +1.855752352e-03f, +6.669562287e-04f, -1.183171051e-03f, -1.179630067e-03f, +3.055900125e-04f, +1.061473822e-03f, +3.193054982e-04f, -5.980730325e-04f, -5.158472603e-04f, +1.465669659e-04f, +3.962243230e-04f, +9.359189777e-05f, -1.846715044e-04f, -1.294671807e-04f, +3.854121934e-05f, +7.353730115e-05f, +1.105218590e-05f, -9.357271131e-06f,\n    /*  6,28 (48) */\n    +1.753014503e-04f, +5.191692644e-04f, +1.613576880e-04f, -1.055669223e-03f, -1.554941348e-03f, +3.552414023e-04f, +3.250849309e-03f, +2.797107866e-03f, -2.590294696e-03f, -7.199684535e-03f, -3.128290783e-03f, +8.062151396e-03f, +1.273379340e-02f, +3.790097958e-04f, -1.860351792e-02f, -1.874704109e-02f, +9.254700667e-03f, +3.716574429e-02f, +2.294783371e-02f, -3.504140093e-02f, -7.484082482e-02f, -1.978571881e-02f, +1.379642170e-01f, +3.075724718e-01f, +3.671648397e-01f, +2.712718367e-01f, +9.250566943e-02f, -4.467422166e-02f, -7.136336630e-02f, -1.895109204e-02f, +3.168715249e-02f, +3.276198022e-02f, +5.590436624e-04f, -2.158920660e-02f, -1.462097687e-02f, +4.916598384e-03f, +1.301809040e-02f, +5.225793532e-03f, -5.125134706e-03f, -6.626595828e-03f, -9.751112112e-04f, +3.425380097e-03f, +2.661829947e-03f, -3.436905005e-04f, -1.621045477e-03f, -7.308637188e-04f, +3.530774407e-04f, +4.646051534e-04f,\n    -1.220112428e-05f, -4.557424696e-06f, +2.769579466e-05f, +3.905416716e-05f, -1.719037284e-05f, -9.294928507e-05f, -6.298515782e-05f, +9.832202803e-05f, +2.032037984e-04f, +4.102837087e-05f, -2.808863692e-04f, -3.373068931e-04f, +9.934083637e-05f, +6.025581680e-04f, +4.373853199e-04f, -4.660840266e-04f, -1.106921623e-03f, -4.059681292e-04f, +1.272423616e-03f, +1.983518747e-03f, +1.097997096e-04f, -3.507144024e-03f, -5.775748818e-03f, -4.173145228e-03f, +5.727871543e-04f, +4.876752428e-03f, +5.561444633e-03f, +2.708232495e-03f, -7.444424040e-04f, -2.020473974e-03f, -9.074804882e-04f, +6.862421796e-04f, +1.057459136e-03f, +2.438428143e-04f, -5.521306107e-04f, -5.273720285e-04f, +2.700047156e-05f, +3.679622505e-04f, +2.167794209e-04f, -1.006854710e-04f, -1.986664501e-04f, -5.860392582e-05f, +8.317205561e-05f, +8.110340390e-05f, -3.893731059e-07f, -4.164078698e-05f, -2.015064614e-05f, +8.867001001e-06f,\n    -1.753014503e-04f, -6.988717024e-04f, -6.869853482e-04f, +1.214636261e-03f, +2.960077526e-03f, +1.992937197e-04f, -5.715980103e-03f, -5.315302348e-03f, +5.493441015e-03f, +1.316684990e-02f, +1.728505206e-03f, -1.841769321e-02f, -1.628612404e-02f, +1.362844645e-02f, +3.168973577e-02f, +4.736624566e-03f, -3.666402047e-02f, -3.098335049e-02f, +2.270634566e-02f, +5.108513123e-02f, +7.996234859e-03f, -5.104445488e-02f, -4.134283408e-02f, +2.725316557e-02f, +5.929931289e-02f, +9.494429766e-03f, -5.188452200e-02f, -4.031378334e-02f, +2.400282086e-02f, +5.051257547e-02f, +8.246238601e-03f, -3.853925102e-02f, -2.869935363e-02f, +1.520022250e-02f, +3.096091860e-02f, +5.212809473e-03f, -2.008124393e-02f, -1.428926858e-02f, +6.406939100e-03f, +1.268800270e-02f, +2.281344679e-03f, -6.506972481e-03f, -4.399309599e-03f, +1.413172369e-03f, +2.800956188e-03f, +5.950047880e-04f, -8.483031605e-04f, -4.646051534e-04f,\n    +1.220112428e-05f, +1.898771574e-05f, -2.753519081e-05f, -7.936789852e-05f, -4.040278685e-06f, +1.676030986e-04f, +1.454358454e-04f, -1.917713026e-04f, -3.994890047e-04f, +1.124576621e-05f, +6.313807691e-04f, +4.422313454e-04f, -5.914290376e-04f, -1.028427323e-03f, +8.118132958e-05f, +1.390320562e-03f, +8.319648170e-04f, -1.149959854e-03f, -1.742583914e-03f, +2.072536508e-04f, +2.099656640e-03f, +1.094458265e-03f, -1.572906527e-03f, -2.113106202e-03f, +3.241475586e-04f, +2.301956556e-03f, +1.048783316e-03f, -1.572302999e-03f, -1.880564154e-03f, +3.474428399e-04f, +1.851908327e-03f, +7.308620442e-04f, -1.146114099e-03f, -1.212302398e-03f, +2.595467868e-04f, +1.063352654e-03f, +3.544548708e-04f, -5.824201054e-04f, -5.328163443e-04f, +1.283080387e-04f, +3.988940296e-04f, +1.058832189e-04f, -1.810927613e-04f, -1.347369482e-04f, +3.474788864e-05f, +7.467434777e-05f, +1.299514687e-05f, -8.867001001e-06f,\n    /*  6,29 (48) */\n    +1.631003260e-04f, +5.146118397e-04f, +1.890534826e-04f, -1.016615056e-03f, -1.572131721e-03f, +2.622921173e-04f, +3.187864151e-03f, +2.895429894e-03f, -2.387090897e-03f, -7.158656165e-03f, -3.409177152e-03f, +7.724844502e-03f, +1.283313424e-02f, +9.815679637e-04f, -1.816613260e-02f, -1.921312512e-02f, +8.147779044e-03f, +3.675977616e-02f, +2.422025732e-02f, -3.305788219e-02f, -7.473102511e-02f, -2.329286284e-02f, +1.321884681e-01f, +3.033993266e-01f, +3.677376269e-01f, +2.761485891e-01f, +9.806711406e-02f, -4.196598917e-02f, -7.210780871e-02f, -2.097156602e-02f, +3.077967200e-02f, +3.344822240e-02f, +1.616502798e-03f, -2.134536379e-02f, -1.517310748e-02f, +4.389226356e-03f, +1.304509087e-02f, +5.593755782e-03f, -4.908355286e-03f, -6.727281299e-03f, -1.173777661e-03f, +3.366776171e-03f, +2.745002003e-03f, -2.625870966e-04f, -1.621434850e-03f, -7.725045058e-04f, +3.329267946e-04f, +4.734721544e-04f,\n    -1.200722377e-05f, -5.265009118e-06f, +2.665905792e-05f, +3.964301044e-05f, -1.456911640e-05f, -9.155929989e-05f, -6.633507579e-05f, +9.273045181e-05f, +2.033930824e-04f, +5.019587769e-05f, -2.724298771e-04f, -3.433251790e-04f, +8.080645084e-05f, +5.937872373e-04f, +4.563697166e-04f, -4.347078605e-04f, -1.104004805e-03f, -4.496565782e-04f, +1.222587999e-03f, +1.996840788e-03f, +2.067797193e-04f, -3.396192524e-03f, -5.757022002e-03f, -4.284303580e-03f, +4.094699856e-04f, +4.787239382e-03f, +5.603687422e-03f, +2.824968759e-03f, -6.604188335e-04f, -2.023076302e-03f, -9.615381760e-04f, +6.500331626e-04f, +1.068544575e-03f, +2.757465103e-04f, -5.383887230e-04f, -5.399705649e-04f, +9.550274047e-06f, +3.652170240e-04f, +2.265601524e-04f, -9.285279645e-05f, -2.001270451e-04f, -6.431750700e-05f, +8.076243575e-05f, +8.307634195e-05f, +1.996438486e-06f, -4.148581872e-05f, -2.125900262e-05f, +8.344944653e-06f,\n    -1.631003260e-04f, -6.798839867e-04f, -7.145205390e-04f, +1.135268363e-03f, +2.956037248e-03f, +3.668968183e-04f, -5.570544258e-03f, -5.507073651e-03f, +5.093952010e-03f, +1.317809567e-02f, +2.359885976e-03f, -1.797546187e-02f, -1.687755308e-02f, +1.260001913e-02f, +3.177091710e-02f, +6.126945128e-03f, -3.583205565e-02f, -3.213331035e-02f, +2.096376174e-02f, +5.129238488e-02f, +1.009589150e-02f, -4.994999662e-02f, -4.291574061e-02f, +2.514005936e-02f, +5.962346045e-02f, +1.179638632e-02f, -5.083573868e-02f, -4.188608634e-02f, +2.212225670e-02f, +5.086001831e-02f, +1.009814693e-02f, -3.780838897e-02f, -2.984546773e-02f, +1.398792011e-02f, +3.122046539e-02f, +6.276162127e-03f, -1.972678906e-02f, -1.487168869e-02f, +5.874122756e-03f, +1.281631074e-02f, +2.680238709e-03f, -6.401089262e-03f, -4.580402361e-03f, +1.278435420e-03f, +2.835704077e-03f, +6.696791358e-04f, -8.353080136e-04f, -4.734721544e-04f,\n    +1.200722377e-05f, +1.947093683e-05f, -2.538057954e-05f, -7.907963685e-05f, -8.839925616e-06f, +1.634214139e-04f, +1.516552664e-04f, -1.796689918e-04f, -4.014176345e-04f, -9.754288189e-06f, +6.197011272e-04f, +4.653984841e-04f, -5.589661769e-04f, -1.038631332e-03f, +3.104888631e-05f, +1.370713898e-03f, +8.822973255e-04f, -1.093838693e-03f, -1.766968726e-03f, +1.270620581e-04f, +2.077684101e-03f, +1.169274842e-03f, -1.504220745e-03f, -2.150529871e-03f, +2.319039960e-04f, +2.285625305e-03f, +1.129233506e-03f, -1.511112825e-03f, -1.920891995e-03f, +2.697772798e-04f, +1.845114860e-03f, +7.939689928e-04f, -1.106992809e-03f, -1.243283477e-03f, +2.127017604e-04f, +1.063539538e-03f, +3.893998840e-04f, -5.656386610e-04f, -5.491324766e-04f, +1.095769468e-04f, +4.009414406e-04f, +1.182115470e-04f, -1.771339313e-04f, -1.398867490e-04f, +3.079791745e-05f, +7.570430487e-05f, +1.497788212e-05f, -8.344944653e-06f,\n    /*  6,30 (48) */\n    +1.510931022e-04f, +5.093468306e-04f, +2.157125405e-04f, -9.769720453e-04f, -1.586700837e-03f, +1.707328174e-04f, +3.121529075e-03f, +2.988160346e-03f, -2.183697815e-03f, -7.108460287e-03f, -3.681607029e-03f, +7.381519323e-03f, +1.291394069e-02f, +1.575355201e-03f, -1.770976289e-02f, -1.964783298e-02f, +7.043774239e-03f, +3.631011958e-02f, +2.544284532e-02f, -3.106104140e-02f, -7.452424539e-02f, -2.668905536e-02f, +1.264314461e-01f, +2.991150230e-01f, +3.681470969e-01f, +2.809358285e-01f, +1.036708015e-01f, -3.914102041e-02f, -7.276822754e-02f, -2.299464232e-02f, +2.981813382e-02f, +3.409825556e-02f, +2.685047373e-03f, -2.106961728e-02f, -1.571149621e-02f, +3.849255791e-03f, +1.305464115e-02f, +5.958972806e-03f, -4.681795133e-03f, -6.820134096e-03f, -1.373904706e-03f, +3.302458664e-03f, +2.825764439e-03f, -1.795107547e-04f, -1.619438411e-03f, -8.139903245e-04f, +3.116677919e-04f, +4.818170991e-04f,\n    -1.179515707e-05f, -5.942614945e-06f, +2.560501230e-05f, +4.015732169e-05f, -1.197904264e-05f, -9.006147782e-05f, -6.953278931e-05f, +8.709694318e-05f, +2.032954010e-04f, +5.916399725e-05f, -2.637133416e-04f, -3.487967929e-04f, +6.239543190e-05f, +5.843232553e-04f, +4.745115978e-04f, -4.031343334e-04f, -1.099664087e-03f, -4.921922220e-04f, +1.171860555e-03f, +2.007432595e-03f, +3.017665142e-04f, -3.283990837e-03f, -5.734251616e-03f, -4.392039864e-03f, +2.458165803e-04f, +4.693945103e-03f, +5.642146737e-03f, +2.941027388e-03f, -5.740791932e-04f, -2.023109414e-03f, -1.015080108e-03f, +6.124905293e-04f, +1.078335946e-03f, +3.076704192e-04f, -5.237462362e-04f, -5.519882992e-04f, -8.136198435e-06f, +3.619299538e-04f, +2.361598639e-04f, -8.477603732e-05f, -2.013257369e-04f, -7.003201622e-05f, +7.819246260e-05f, +8.496304936e-05f, +4.429146330e-06f, -4.126109227e-05f, -2.236071049e-05f, +7.791242229e-06f,\n    -1.510931022e-04f, -6.604130498e-04f, -7.399011185e-04f, +1.056188726e-03f, +2.947197322e-03f, +5.303182322e-04f, -5.418888992e-03f, -5.686742643e-03f, +4.692534375e-03f, +1.316834138e-02f, +2.979587103e-03f, -1.751006338e-02f, -1.743651926e-02f, +1.156138780e-02f, +3.180196599e-02f, +7.497659026e-03f, -3.494975833e-02f, -3.322714904e-02f, +1.919679302e-02f, +5.141944693e-02f, +1.217357560e-02f, -4.878072178e-02f, -4.441996135e-02f, +2.298952949e-02f, +5.985536445e-02f, +1.408201163e-02f, -4.970650518e-02f, -4.339719917e-02f, +2.020136471e-02f, +5.112979559e-02f, +1.194326179e-02f, -3.701441998e-02f, -3.095246054e-02f, +1.274463663e-02f, +3.143316715e-02f, +7.339701665e-03f, -1.933738918e-02f, -1.543732735e-02f, +5.324990279e-03f, +1.292588768e-02f, +3.081180149e-03f, -6.282877715e-03f, -4.757536292e-03f, +1.138548671e-03f, +2.866501994e-03f, +7.453834406e-04f, -8.203301315e-04f, -4.818170991e-04f,\n    +1.179515707e-05f, +1.989502124e-05f, -2.324588111e-05f, -7.865658953e-05f, -1.351057922e-05f, +1.590490714e-04f, +1.575038342e-04f, -1.674741398e-04f, -4.026596693e-04f, -3.044856647e-05f, +6.071675411e-04f, +4.875573858e-04f, -5.259403172e-04f, -1.047088999e-03f, -1.872481803e-05f, +1.349078811e-03f, +9.309185690e-04f, -1.036298510e-03f, -1.788458344e-03f, +4.697585680e-05f, +2.052511654e-03f, +1.242086964e-03f, -1.433272568e-03f, -2.184548817e-03f, +1.392905295e-04f, +2.265687070e-03f, +1.208034611e-03f, -1.447398043e-03f, -1.958317289e-03f, +1.913789724e-04f, +1.835368929e-03f, +8.561708638e-04f, -1.065857194e-03f, -1.272510612e-03f, +1.651246880e-04f, +1.062018502e-03f, +4.240808264e-04f, -5.477436456e-04f, -5.647600865e-04f, +9.039874540e-05f, +4.023534357e-04f, +1.305561128e-04f, -1.727947999e-04f, -1.449047117e-04f, +2.669496967e-05f, +7.662225966e-05f, +1.699747862e-05f, -7.791242229e-06f,\n    /*  6,31 (48) */\n    +1.392979451e-04f, +5.034042156e-04f, +2.413175528e-04f, -9.368147236e-04f, -1.598679880e-03f, +8.067133956e-05f, +3.051996286e-03f, +3.075257289e-03f, -1.980402414e-03f, -7.049296290e-03f, -3.945320371e-03f, +7.032722530e-03f, +1.297633612e-02f, +2.159678456e-03f, -1.723525129e-02f, -2.005096731e-02f, +5.944110152e-03f, +3.581792736e-02f, +2.661470588e-02f, -2.905360880e-02f, -7.422247888e-02f, -2.997304620e-02f, +1.206971945e-01f, +2.947229831e-01f, +3.683929135e-01f, +2.856297736e-01f, +1.093129482e-01f, -3.619999302e-02f, -7.334230673e-02f, -2.501775173e-02f, +2.880305371e-02f, +3.471074609e-02f, +3.763383320e-03f, -2.076194686e-02f, -1.623524244e-02f, +3.297267492e-03f, +1.304650495e-02f, +6.320902760e-03f, -4.445635269e-03f, -6.904910133e-03f, -1.575230443e-03f, +3.232426648e-03f, +2.903956901e-03f, -9.454770530e-05f, -1.615009265e-03f, -8.552514168e-04f, +2.893070814e-04f, +4.896083413e-04f,\n    -1.156587247e-05f, -6.589777155e-06f, +2.453583715e-05f, +4.059785137e-05f, -9.423532883e-06f, -8.845998205e-05f, -7.257614213e-05f, +8.143026444e-05f, +2.029151000e-04f, +6.792291394e-05f, -2.547523335e-04f, -3.537211876e-04f, +4.413138857e-05f, +5.741874250e-04f, +4.917967149e-04f, -3.714076894e-04f, -1.093922442e-03f, -5.335348884e-04f, +1.120316544e-03f, +2.015321110e-03f, +3.946898559e-04f, -3.170653092e-03f, -5.707482646e-03f, -4.496275233e-03f, +8.196129835e-05f, +4.596934279e-03f, +5.676763658e-03f, +3.056293732e-03f, -4.854822889e-04f, -2.020535961e-03f, -1.068031294e-03f, +5.736463860e-04f, +1.086804390e-03f, +3.395718620e-04f, -5.082121336e-04f, -5.634016105e-04f, -2.603744181e-05f, +3.580985825e-04f, +2.455625648e-04f, -7.646324280e-05f, -2.022568705e-04f, -7.573909431e-05f, +7.546324261e-05f, +8.675906281e-05f, +6.905852224e-06f, -4.096545548e-05f, -2.345369145e-05f, +7.206097170e-06f,\n    -1.392979451e-04f, -6.405180286e-04f, -7.631469996e-04f, +9.775321364e-04f, +2.933686743e-03f, +6.893673036e-04f, -5.261385157e-03f, -5.854216783e-03f, +4.289874706e-03f, +1.313789281e-02f, +3.586754644e-03f, -1.702250600e-02f, -1.796245957e-02f, +1.051429880e-02f, +3.178324117e-02f, +8.846737837e-03f, -3.401883976e-02f, -3.426344755e-02f, +1.740833467e-02f, +5.146642279e-02f, +1.422608725e-02f, -4.753863481e-02f, -4.585323392e-02f, +2.080498068e-02f, +5.999465498e-02f, +1.634769870e-02f, -4.849847057e-02f, -4.484459721e-02f, +1.824304742e-02f, +5.132117457e-02f, +1.377863072e-02f, -3.615824912e-02f, -3.201831773e-02f, +1.147212602e-02f, +3.159829184e-02f, +8.401720167e-03f, -1.891330835e-02f, -1.598507100e-02f, +4.760230193e-03f, +1.301628643e-02f, +3.483533585e-03f, -6.152321602e-03f, -4.930331092e-03f, +9.936439597e-04f, +2.893196964e-03f, +8.220057003e-04f, -8.033326528e-04f, -4.896083413e-04f,\n    +1.156587247e-05f, +2.026107605e-05f, -2.113479253e-05f, -7.810303453e-05f, -1.804669126e-05f, +1.544976859e-04f, +1.629782250e-04f, -1.552090461e-04f, -4.032233109e-04f, -5.080677731e-05f, +5.938112090e-04f, +5.086829447e-04f, -4.924109527e-04f, -1.053802351e-03f, -6.806222398e-05f, +1.325464625e-03f, +9.777611267e-04f, -9.774392195e-04f, -1.807031638e-03f, -3.287736205e-05f, +2.024189074e-03f, +1.312782922e-03f, -1.360178459e-03f, -2.215111194e-03f, +4.645487730e-05f, +2.242170783e-03f, +1.285058184e-03f, -1.381254679e-03f, -1.992771091e-03f, +1.123708632e-04f, +1.822672317e-03f, +9.173623485e-04f, -1.022760899e-03f, -1.299923556e-03f, +1.168871057e-04f, +1.058776278e-03f, +4.584378263e-04f, -5.287520583e-04f, -5.796643399e-04f, +7.079960453e-05f, +4.031178103e-04f, +1.428957736e-04f, -1.680758405e-04f, -1.497789702e-04f, +2.244308745e-05f, +7.742340156e-05f, +1.905086070e-05f, -7.206097170e-06f,\n    /*  7, 0 (48) */\n    +0.000000000e+00f, -5.184284022e-04f, +3.212229602e-06f, +1.307536639e-03f, +8.360763470e-04f, -2.118986788e-03f, -2.852738276e-03f, +2.109164081e-03f, +6.105712658e-03f, -1.950685165e-05f, -9.834821711e-03f, -5.434403018e-03f, +1.219436233e-02f, +1.497172437e-02f, -1.025017254e-02f, -2.819089092e-02f, +4.350570367e-05f, +4.333632545e-02f, +2.439525774e-02f, -5.757751269e-02f, -7.936955118e-02f, +6.777629950e-02f, +3.088165774e-01f, +4.285159846e-01f, +3.088165774e-01f, +6.777629950e-02f, -7.936955118e-02f, -5.757751269e-02f, +2.439525774e-02f, +4.333632545e-02f, +4.350570367e-05f, -2.819089092e-02f, -1.025017254e-02f, +1.497172437e-02f, +1.219436233e-02f, -5.434403018e-03f, -9.834821711e-03f, -1.950685165e-05f, +6.105712658e-03f, +2.109164081e-03f, -2.852738276e-03f, -2.118986788e-03f, +8.360763470e-04f, +1.307536639e-03f, +3.212229602e-06f, -5.184284022e-04f, -1.234425141e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.402830756e-06f, -3.645794608e-05f, -2.934893968e-05f, +6.301990736e-05f, +9.261259788e-05f, -6.715667929e-05f, -2.008609397e-04f, +5.663638279e-06f, +3.341017752e-04f, +1.706534758e-04f, -4.324003844e-04f, -4.953746677e-04f, +3.913250279e-04f, +9.603516939e-04f, -6.404349089e-05f, -1.491008734e-03f, -7.546410229e-04f, +1.908165098e-03f, +2.478253380e-03f, -1.675039053e-03f, -6.961821842e-03f, -6.839105062e-03f, -1.284161757e-04f, +6.711386426e-03f, +7.067661105e-03f, +1.857870170e-03f, -2.418878930e-03f, -1.982443748e-03f, +6.867150942e-04f, +1.510974108e-03f, +1.161613155e-04f, -9.540569351e-04f, -4.237344909e-04f, +4.796149263e-04f, +4.482795641e-04f, -1.549617571e-04f, -3.390588754e-04f, -1.711613663e-05f, +2.003082109e-04f, +7.377878167e-05f, -9.040208288e-05f, -6.603770382e-05f, +2.747022415e-05f, +3.750518317e-05f, -3.401044618e-06f, -1.367129889e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.184284022e-04f, -3.212229602e-06f, -1.888597505e-03f, -1.236145466e-03f, +3.592023527e-03f, +4.047052782e-03f, -4.982450802e-03f, -8.918259580e-03f, +4.834186303e-03f, +1.556156622e-02f, -1.810767405e-03f, -2.277524083e-02f, -4.954253986e-03f, +2.859390823e-02f, +1.529315124e-02f, -3.084300852e-02f, -2.774230592e-02f, +2.793154400e-02f, +3.977726494e-02f, -1.956380632e-02f, -4.852880250e-02f, +7.038976371e-03f, +5.173229864e-02f, +7.038976371e-03f, -4.852880250e-02f, -1.956380632e-02f, +3.977726494e-02f, +2.793154400e-02f, -2.774230592e-02f, -3.084300852e-02f, +1.529315124e-02f, +2.859390823e-02f, -4.954253986e-03f, -2.277524083e-02f, -1.810767405e-03f, +1.556156622e-02f, +4.834186303e-03f, -8.918259580e-03f, -4.982450802e-03f, +4.047052782e-03f, +3.592023527e-03f, -1.236145466e-03f, -1.888597505e-03f, +7.853369693e-05f, +5.184284022e-04f, +1.234425141e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.402830756e-06f, +3.645794608e-05f, +4.990674596e-05f, -1.015072581e-04f, -1.466967147e-04f, +1.503045336e-04f, +3.210858882e-04f, -1.523377155e-04f, -5.718326359e-04f, +5.538729978e-05f, +8.642556210e-04f, +1.831321024e-04f, -1.130066542e-03f, -5.730390367e-04f, +1.282908753e-03f, +1.075471433e-03f, -1.246505957e-03f, -1.603675632e-03f, +9.852715527e-04f, +2.043673952e-03f, -5.241715658e-04f, -2.289024217e-03f, -5.221704922e-05f, +2.276646540e-03f, +6.230870902e-04f, -2.009071323e-03f, -1.068995934e-03f, +1.553665861e-03f, +1.308989800e-03f, -1.019137686e-03f, -1.322769487e-03f, +5.192197337e-04f, +1.150169523e-03f, -1.383111949e-04f, -8.701498844e-04f, -8.814437108e-05f, +5.697403375e-04f, +1.732332348e-04f, -3.161963751e-04f, -1.617501818e-04f, +1.422584669e-04f, +1.067364938e-04f, -4.720273898e-05f, -4.992298047e-05f, +3.401044618e-06f, +1.367129889e-05f, +0.000000000e+00f,\n    /*  7, 1 (48) */\n    +0.000000000e+00f, -5.140255714e-04f, -3.324571648e-05f, +1.278187699e-03f, +8.990962544e-04f, -2.026374191e-03f, -2.919894955e-03f, +1.908303142e-03f, +6.111376296e-03f, +3.145949235e-04f, -9.664168235e-03f, -5.866803403e-03f, +1.169898766e-02f, +1.536304940e-02f, -9.289820844e-03f, -2.825493441e-02f, -1.447503031e-03f, +4.258168443e-02f, +2.630342283e-02f, -5.509925932e-02f, -8.104459023e-02f, +6.081447766e-02f, +3.019774723e-01f, +4.283875684e-01f, +3.155279638e-01f, +7.484396060e-02f, -7.751168101e-02f, -5.999639162e-02f, +2.241281399e-02f, +4.402304055e-02f, +1.554479812e-03f, -2.807472961e-02f, -1.120422947e-02f, +1.454798988e-02f, +1.267397725e-02f, -4.986123454e-03f, -9.989783468e-03f, -3.585657271e-04f, +6.088596521e-03f, +2.309472292e-03f, -2.778959494e-03f, -2.209388871e-03f, +7.700386432e-04f, +1.335006863e-03f, +4.071741277e-05f, -5.218294468e-04f, -1.371138130e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.363231868e-06f, -3.536116739e-05f, -3.112411600e-05f, +5.994166238e-05f, +9.460233729e-05f, -6.052409654e-05f, -2.010276988e-04f, -5.622708085e-06f, +3.286002227e-04f, +1.858136918e-04f, -4.159446280e-04f, -5.100302025e-04f, +3.586215482e-04f, +9.648401929e-04f, -1.247875202e-05f, -1.468661393e-03f, -8.202888207e-04f, +1.831730441e-03f, +2.532396482e-03f, -1.493629345e-03f, -6.850181348e-03f, -6.959632173e-03f, -3.851071098e-04f, +6.576588681e-03f, +7.167524184e-03f, +2.041903873e-03f, -2.354278168e-03f, -2.054408452e-03f, +6.165977888e-04f, +1.528490732e-03f, +1.687455178e-04f, -9.459444776e-04f, -4.557867798e-04f, +4.627657440e-04f, +4.635448853e-04f, -1.387605929e-04f, -3.434541995e-04f, -2.871543078e-05f, +1.993642683e-04f, +8.037719661e-05f, -8.797104486e-05f, -6.898759360e-05f, +2.548962186e-05f, +3.849926784e-05f, -2.359131188e-06f, -1.395240629e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.140255714e-04f, +3.324571648e-05f, -1.838690760e-03f, -1.337652724e-03f, +3.445326813e-03f, +4.197357316e-03f, -4.661364913e-03f, -9.070597296e-03f, +4.262353667e-03f, +1.561695352e-02f, -9.465117840e-04f, -2.259210873e-02f, -6.084320528e-03f, +2.802086920e-02f, +1.657605999e-02f, -2.976753709e-02f, -2.898881188e-02f, +2.632786837e-02f, +4.076253650e-02f, -1.752013237e-02f, -4.905297407e-02f, +4.749952153e-03f, +5.168008159e-02f, +9.315622911e-03f, -4.790571541e-02f, -2.157287765e-02f, +3.870826901e-02f, +2.948520986e-02f, -2.643331612e-02f, -3.186214621e-02f, +1.397038175e-02f, +2.911312797e-02f, -3.804084463e-03f, -2.291355203e-02f, -2.680917289e-03f, +1.547342185e-02f, +5.403926640e-03f, -8.745026346e-03f, -5.298647177e-03f, +3.885302601e-03f, +3.734281994e-03f, -1.129408972e-03f, -1.935800244e-03f, +2.861071646e-05f, +5.218294468e-04f, +1.371138130e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.363231868e-06f, +3.536116739e-05f, +5.242115229e-05f, -9.617976463e-05f, -1.507233495e-04f, +1.387530092e-04f, +3.252146092e-04f, -1.314375733e-04f, -5.727039945e-04f, +2.291445353e-05f, +8.566381906e-04f, +2.271364703e-04f, -1.107813740e-03f, -6.252668419e-04f, +1.240686479e-03f, +1.129274547e-03f, -1.181780527e-03f, -1.650202515e-03f, +8.998052987e-04f, +2.074017417e-03f, -4.243447843e-04f, -2.296715000e-03f, -1.565431243e-04f, +2.259603869e-03f, +7.208850167e-04f, -1.970271063e-03f, -1.150799020e-03f, +1.500263071e-03f, +1.369090876e-03f, -9.603762505e-04f, -1.360169373e-03f, +4.639097211e-04f, +1.168061624e-03f, -9.276064125e-05f, -8.742896207e-04f, -1.211189995e-04f, +5.664150925e-04f, +1.940785686e-04f, -3.105441002e-04f, -1.730623710e-04f, +1.374100914e-04f, +1.118528453e-04f, -4.431058451e-05f, -5.177662578e-05f, +2.359131188e-06f, +1.395240629e-05f, +0.000000000e+00f,\n    /*  7, 2 (48) */\n    +0.000000000e+00f, -5.086623395e-04f, -6.860688387e-05f, +1.247063583e-03f, +9.590379168e-04f, -1.931771853e-03f, -2.980419051e-03f, +1.707275443e-03f, +6.105753588e-03f, +6.431951462e-04f, -9.478354543e-03f, -6.282748031e-03f, +1.118895746e-02f, +1.572167095e-02f, -8.324980651e-03f, -2.826741316e-02f, -2.916164424e-03f, +4.176139561e-02f, +2.813515328e-02f, -5.256686283e-02f, -8.253821958e-02f, +5.396429631e-02f, +2.950178402e-01f, +4.280024613e-01f, +3.221045525e-01f, +8.201148479e-02f, -7.546977714e-02f, -6.235066979e-02f, +2.035840554e-02f, +4.463963834e-02f, +3.082970544e-03f, -2.790598409e-02f, -1.215017395e-02f, +1.409220310e-02f, +1.313674300e-02f, -4.522578569e-03f, -1.012854406e-02f, -7.020199266e-04f, +6.059881091e-03f, +2.508836561e-03f, -2.698582297e-03f, -2.297359916e-03f, +7.010510496e-04f, +1.360496485e-03f, +7.921668061e-05f, -5.241885780e-04f, -1.510662193e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.281120501e-06f, -3.421848615e-05f, -3.279435594e-05f, +5.681040703e-05f, +9.637149550e-05f, -5.389403999e-05f, -2.008143956e-04f, -1.672415031e-05f, +3.225723242e-04f, +2.004216370e-04f, -3.989501581e-04f, -5.235689730e-04f, +3.256869626e-04f, +9.675369667e-04f, +3.844823356e-05f, -1.444002155e-03f, -8.835766843e-04f, +1.753299022e-03f, +2.581310828e-03f, -1.313855934e-03f, -6.732920928e-03f, -7.072864687e-03f, -6.413739816e-04f, +6.434833450e-03f, +7.261242746e-03f, +2.226917682e-03f, -2.284463820e-03f, -2.123902846e-03f, +5.443807266e-04f, +1.543495271e-03f, +2.217074795e-04f, -9.360060371e-04f, -4.874186029e-04f, +4.448440945e-04f, +4.781597261e-04f, -1.220733051e-04f, -3.472712501e-04f, -4.044158950e-05f, +1.980245521e-04f, +8.693853995e-05f, -8.532019059e-05f, -7.186211401e-05f, +2.340904202e-05f, +3.943662641e-05f, -1.278478377e-06f, -1.420592772e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.086623395e-04f, +6.860688387e-05f, -1.786269607e-03f, -1.433832489e-03f, +3.294603463e-03f, +4.336110325e-03f, -4.336150304e-03f, -9.202034869e-03f, +3.689649672e-03f, +1.563986797e-02f, -8.987359339e-05f, -2.236497226e-02f, -7.192134268e-03f, +2.739560235e-02f, +1.781674647e-02f, -2.863826254e-02f, -3.017059240e-02f, +2.467766585e-02f, +4.166234180e-02f, -1.544611496e-02f, -4.947731885e-02f, +2.453237153e-03f, +5.152353847e-02f, +1.157522678e-02f, -4.718483039e-02f, -2.354314871e-02f, +3.755746999e-02f, +3.098547293e-02f, -2.506422524e-02f, -3.282252246e-02f, +1.261021237e-02f, +2.957703769e-02f, -2.636022839e-03f, -2.300631267e-02f, -3.555206910e-03f, +1.535230285e-02f, +5.970341733e-03f, -8.550947777e-03f, -5.609191277e-03f, +3.712240230e-03f, +3.871692085e-03f, -1.017556127e-03f, -1.980110829e-03f, -2.316590932e-05f, +5.241885780e-04f, +1.510662193e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.281120501e-06f, +3.421848615e-05f, +5.474500924e-05f, -9.076854688e-05f, -1.543378622e-04f, +1.271229364e-04f, +3.285861621e-04f, -1.105777184e-04f, -5.723689113e-04f, -9.208901701e-06f, +8.473323064e-04f, +2.702399750e-04f, -1.083476215e-03f, -6.758064862e-04f, +1.196206297e-03f, +1.180449996e-03f, -1.114958710e-03f, -1.693164308e-03f, +8.127796729e-04f, +2.100049250e-03f, -3.238146663e-04f, -2.299706817e-03f, -2.605453583e-04f, +2.237927891e-03f, +8.173610248e-04f, -1.927343658e-03f, -1.230504856e-03f, +1.443564632e-03f, +1.426672350e-03f, -8.992957936e-04f, -1.395013665e-03f, +4.072137252e-04f, +1.183685991e-03f, -4.656973925e-05f, -8.766469271e-04f, -1.542432463e-04f, +5.618474442e-04f, +2.148275953e-04f, -3.041287796e-04f, -1.842133237e-04f, +1.321540652e-04f, +1.168416268e-04f, -4.123224846e-05f, -5.356478109e-05f, +1.278478377e-06f, +1.420592772e-05f, +0.000000000e+00f,\n    /*  7, 3 (48) */\n    +0.000000000e+00f, -5.023812190e-04f, -1.028253700e-04f, +1.214269227e-03f, +1.015848324e-03f, -1.835400358e-03f, -3.034313091e-03f, +1.506461047e-03f, +6.089029438e-03f, +9.657674704e-04f, -9.277932906e-03f, -6.681698189e-03f, +1.066538848e-02f, +1.604735791e-02f, -7.357443684e-03f, -2.822896493e-02f, -4.360166579e-03f, +4.087781893e-02f, +2.988845230e-02f, -4.998555200e-02f, -8.385207551e-02f, +4.723137538e-02f, +2.879449755e-01f, +4.273610873e-01f, +3.285393859e-01f, +8.927272753e-02f, -7.324285945e-02f, -6.463513361e-02f, +1.823450269e-02f, +4.518401906e-02f, +4.626465814e-03f, -2.768427661e-02f, -1.308617999e-02f, +1.360478450e-02f, +1.358158709e-02f, -4.044418843e-03f, -1.025061737e-02f, -1.049291177e-03f, +6.019439501e-03f, +2.706861113e-03f, -2.611643757e-03f, -2.382680107e-03f, +6.291889356e-04f, +1.383905527e-03f, +1.186533070e-04f, -5.254670563e-04f, -1.652721470e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.155499268e-06f, -3.303356079e-05f, -3.435851553e-05f, +5.363354428e-05f, +9.792070572e-05f, -4.727929308e-05f, -2.002275795e-04f, -2.762256769e-05f, +3.160369234e-04f, +2.144578550e-04f, -3.814553423e-04f, -5.359806252e-04f, +2.925838239e-04f, +9.684595838e-04f, +8.865496331e-05f, -1.417104224e-03f, -9.444278384e-04f, +1.673031134e-03f, +2.625006558e-03f, -1.135929496e-03f, -6.610227950e-03f, -7.178708984e-03f, -8.969347129e-04f, +6.286251430e-03f, +7.348655345e-03f, +2.412685758e-03f, -2.209456350e-03f, -2.190772398e-03f, +4.701602984e-04f, +1.555927983e-03f, +2.749568061e-04f, -9.242365355e-04f, -5.185666495e-04f, +4.258691551e-04f, +4.920882012e-04f, -1.049244523e-04f, -3.504943998e-04f, -5.227413708e-05f, +1.962852063e-04f, +9.344927460e-05f, -8.245068760e-05f, -7.465381357e-05f, +2.123065152e-05f, +4.031373136e-05f, -1.606038524e-07f, -1.443029105e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.023812190e-04f, +1.028253700e-04f, -1.731524598e-03f, -1.524601036e-03f, +3.140265601e-03f, +4.463233262e-03f, -4.007564142e-03f, -9.312612588e-03f, +3.117280761e-03f, +1.563065907e-02f, +7.574587130e-04f, -2.209473228e-02f, -8.275610483e-03f, +2.671979587e-02f, +1.901295276e-02f, -2.745781254e-02f, -3.128555111e-02f, +2.298450154e-02f, +4.247512147e-02f, -1.334606571e-02f, -4.980113352e-02f, +1.535303363e-04f, +5.126299311e-02f, +1.381315467e-02f, -4.636746937e-02f, -2.547049237e-02f, +3.632696513e-02f, +3.242903756e-02f, -2.363755289e-02f, -3.372181825e-02f, +1.121519871e-02f, +2.998425141e-02f, -1.452336848e-03f, -2.305288241e-02f, -4.431853837e-03f, +1.519805960e-02f, +6.532189177e-03f, -8.336120182e-03f, -5.913320056e-03f, +3.528026906e-03f, +4.003846151e-03f, -9.007144999e-04f, -2.021343077e-03f, -7.673069041e-05f, +5.254670563e-04f, +1.652721470e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.155499268e-06f, +3.303356079e-05f, +5.687786299e-05f, -8.528801151e-05f, -1.575407020e-04f, +1.154413295e-04f, +3.312057915e-04f, -8.980231717e-05f, -5.708443107e-04f, -4.091902851e-05f, +8.363759240e-04f, +3.123610207e-04f, -1.057122928e-03f, -7.245656074e-04f, +1.149575910e-03f, +1.228906834e-03f, -1.046189401e-03f, -1.732486615e-03f, +7.243798566e-04f, +2.121726136e-03f, -2.227902696e-04f, -2.297997438e-03f, -3.640086191e-04f, +2.211660024e-03f, +9.123132502e-04f, -1.880368423e-03f, -1.307941340e-03f, +1.383675242e-03f, +1.481602044e-03f, -8.360105083e-04f, -1.427212413e-03f, +3.492402140e-04f, +1.196990134e-03f, +1.699807130e-07f, -8.771974561e-04f, -1.874480376e-04f, +5.560305404e-04f, +2.354337306e-04f, -2.969518419e-04f, -1.951751290e-04f, +1.264938699e-04f, +1.216881284e-04f, -3.797021669e-05f, -5.528070823e-05f, +1.606038524e-07f, +1.443029105e-05f, +0.000000000e+00f,\n    /*  7, 4 (48) */\n    +0.000000000e+00f, -4.952257198e-04f, -1.358589308e-04f, +1.179910712e-03f, +1.069481868e-03f, -1.737479652e-03f, -3.081592384e-03f, +1.306233468e-03f, +6.061406870e-03f, +1.281804394e-03f, -9.063475051e-03f, -7.063153531e-03f, +1.012940786e-02f, +1.633994173e-02f, -6.388984100e-03f, -2.814030997e-02f, -5.777270803e-03f, +3.993339109e-02f, +3.156148343e-02f, -4.736054545e-02f, -8.498800501e-02f, +4.062114743e-02f, +2.807662665e-01f, +4.264641526e-01f, +3.348256374e-01f, +9.662138288e-02f, -7.083017370e-02f, -6.684458996e-02f, +1.604373029e-02f, +4.565417936e-02f, +6.182393798e-03f, -2.740931980e-02f, -1.401041652e-02f, +1.308621785e-02f, +1.400745625e-02f, -3.552330642e-03f, -1.035554182e-02f, -1.399785577e-03f, +5.967165364e-03f, +2.903146319e-03f, -2.518194483e-03f, -2.465130794e-03f, +5.545351220e-04f, +1.405136178e-03f, +1.589670384e-04f, -5.256276602e-04f, -1.797024380e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.985500330e-06f, -3.181006045e-05f, -3.581570155e-05f, +5.041842712e-05f, +9.925103113e-05f, -4.069239427e-05f, -1.992744192e-04f, -3.830049673e-05f, +3.090135547e-04f, +2.279042196e-04f, -3.634989747e-04f, -5.472570011e-04f, +2.593742174e-04f, +9.676285787e-04f, +1.380612193e-04f, -1.388043770e-03f, -1.002770603e-03f, +1.591087852e-03f, +2.663501277e-03f, -9.600562222e-04f, -6.482295563e-03f, -7.277080996e-03f, -1.151508169e-03f, +6.130982232e-03f, +7.429607677e-03f, +2.598979196e-03f, -2.129284004e-03f, -2.254864673e-03f, +3.940375622e-04f, +1.565732871e-03f, +3.284014664e-04f, -9.106341493e-04f, -5.491677055e-04f, +4.058622990e-04f, +5.052952394e-04f, -8.733979986e-05f, -3.531089337e-04f, -6.419208530e-05f, +1.941430972e-04f, +9.989573536e-05f, -7.936416972e-05f, -7.735526809e-05f, +1.895687537e-05f, +4.112711044e-05f, +9.928457007e-07f, -1.462395980e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.952257198e-04f, +1.358589308e-04f, -1.674646735e-03f, -1.609889047e-03f, +2.982724899e-03f, +4.578674591e-03f, -3.676358351e-03f, -9.402414905e-03f, +2.546436450e-03f, +1.558974004e-02f, +1.593834637e-03f, -2.178237126e-02f, -9.332733411e-03f, +2.599523026e-02f, +2.016252867e-02f, -2.622890571e-02f, -3.233174051e-02f, +2.125201493e-02f, +4.319950132e-02f, -1.122433957e-02f, -5.002392379e-02f, -2.144467102e-03f, +5.089898449e-02f, +1.602481470e-02f, -4.545515612e-02f, -2.735086079e-02f, +3.501902379e-02f, +3.381271281e-02f, -2.215595085e-02f, -3.455782876e-02f, +9.787986297e-03f, +3.033349163e-02f, -2.553467138e-04f, -2.305271243e-02f, -5.309051293e-03f, +1.501061156e-02f, +7.088219717e-03f, -8.100686451e-03f, -6.210271898e-03f, +3.332851777e-03f, +4.130340021e-03f, -7.790263715e-04f, -2.059313294e-03f, -1.320113986e-04f, +5.256276602e-04f, +1.797024380e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.985500330e-06f, +3.181006045e-05f, +5.881974410e-05f, -7.975240632e-05f, -1.603332576e-04f, +1.037348326e-04f, +3.330803253e-04f, -6.915470437e-05f, -5.681494757e-04f, -7.215383980e-05f, +8.238101248e-04f, +3.534208899e-04f, -1.028826526e-03f, -7.714563107e-04f, +1.100906835e-03f, +1.274560359e-03f, -9.756248546e-04f, -1.768102977e-03f, +6.347933102e-04f, +2.139013986e-03f, -1.214813444e-04f, -2.291594477e-03f, -4.667189164e-04f, +2.180851332e-03f, +1.005542717e-03f, -1.829433348e-03f, -1.382940602e-03f, +1.320706728e-03f, +1.533752739e-03f, -7.706398975e-04f, -1.456680690e-03f, +2.901011902e-04f, +1.207926078e-03f, +4.736493450e-05f, -8.759205059e-04f, -2.206633037e-04f, +5.489601822e-04f, +2.558500265e-04f, -2.890164525e-04f, -2.059198058e-04f, +1.204340034e-04f, +1.263776520e-04f, -3.452750106e-05f, -5.691766838e-05f, -9.928457007e-07f, +1.462395980e-05f, +0.000000000e+00f,\n    /*  7, 5 (48) */\n    +0.000000000e+00f, -4.872402194e-04f, -1.676689913e-04f, +1.144095010e-03f, +1.119900295e-03f, -1.638228621e-03f, -3.122284779e-03f, +1.106959049e-03f, +6.023106374e-03f, +1.590817949e-03f, -8.835570832e-03f, -7.426652506e-03f, +9.582150857e-03f, +1.659931595e-02f, -5.421355521e-03f, -2.800224875e-02f, -7.165314573e-03f, +3.893062048e-02f, +3.315257128e-02f, -4.469704417e-02f, -8.594806123e-02f, +3.413885187e-02f, +2.734891855e-01f, +4.253126445e-01f, +3.409566196e-01f, +1.040509906e-01f, -6.823119450e-02f, -6.897387397e-02f, +1.378886562e-02f, +4.604821692e-02f, +7.748126668e-03f, -2.708091834e-02f, -1.492105067e-02f, +1.253705014e-02f, +1.441331855e-02f, -3.047035402e-03f, -1.044288162e-02f, -1.752894510e-03f, +5.902973279e-03f, +3.097289416e-03f, -2.418298747e-03f, -2.544494964e-03f, +4.771798539e-04f, +1.424093054e-03f, +2.000941488e-04f, -5.246348145e-04f, -1.943263978e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.770384584e-06f, -3.055165641e-05f, -3.716526842e-05f, +4.717234406e-05f, +1.003639553e-04f, -3.414561603e-05f, -1.979626789e-04f, -4.874115534e-05f, +3.015223972e-04f, +2.407439523e-04f, -3.451201979e-04f, -5.573921262e-04f, +2.261196541e-04f, +9.650673803e-04f, +1.865891824e-04f, -1.356899769e-03f, -1.058538454e-03f, +1.507630778e-03f, +2.696819961e-03f, -7.864375643e-04f, -6.349322397e-03f, -7.367906298e-03f, -1.404814536e-03f, +5.969174217e-03f, +7.503952826e-03f, +2.785566329e-03f, -2.043982842e-03f, -2.316029593e-03f, +3.161181312e-04f, +1.572857817e-03f, +3.819479360e-04f, -8.952003513e-04f, -5.791587704e-04f, +3.848470823e-04f, +5.177466597e-04f, -6.934628683e-05f, -3.551010896e-04f, -7.617396702e-05f, +1.915958308e-04f, +1.062641544e-04f, -7.606274189e-05f, -7.995909681e-05f, +1.659039649e-05f, +4.187335580e-05f, +2.180095653e-06f, -1.478543797e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.872402194e-04f, +1.676689913e-04f, -1.615826991e-03f, -1.689641453e-03f, +2.822391641e-03f, +4.682409424e-03f, -3.343278025e-03f, -9.471569609e-03f, +1.978286975e-03f, +1.551758620e-02f, +2.417644762e-03f, -2.142895037e-02f, -1.036155994e-02f, +2.522377395e-02f, +2.126343551e-02f, -2.495434535e-02f, -3.330736537e-02f, +1.948391195e-02f, +4.383429464e-02f, -9.085325584e-03f, -5.014540513e-02f, -4.436061579e-03f, +5.043226558e-02f, +1.820566603e-02f, -4.444961340e-02f, -2.918029414e-02f, +3.363608319e-02f, +3.513341953e-02f, -2.062219811e-02f, -3.532846866e-02f, +8.331305607e-03f, +3.062359282e-02f, +9.525793645e-04f, -2.300534749e-02f, -6.184971799e-03f, +1.478994826e-02f, +7.637179899e-03f, -7.844836425e-03f, -6.499288351e-03f, +3.126931971e-03f, +4.250774024e-03f, -6.526487195e-04f, -2.093840795e-03f, -1.889290670e-04f, +5.246348145e-04f, +1.943263978e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.770384584e-06f, +3.055165641e-05f, +6.057115596e-05f, -7.417578898e-05f, -1.627178350e-04f, +9.202966494e-05f, +3.342181337e-04f, -4.867729821e-05f, -5.643059740e-04f, -1.028530154e-04f, +8.096789935e-04f, +3.933438867e-04f, -9.986631499e-04f, -8.163953233e-04f, +1.050314142e-03f, +1.317332257e-03f, -9.034203447e-04f, -1.799954978e-03f, +5.442093688e-04f, +2.151887982e-03f, -2.009788815e-05f, -2.280515365e-03f, -5.684638544e-04f, +2.145562425e-03f, +1.096853765e-03f, -1.774634935e-03f, -1.455339376e-03f, +1.254777836e-03f, +1.583002471e-03f, -7.033085484e-04f, -1.483338804e-03f, +2.299119763e-04f, +1.216450505e-03f, +9.491966892e-05f, -8.727991044e-04f, -2.538181231e-04f, +5.406348675e-04f, +2.760292722e-04f, -2.803275333e-04f, -2.164193667e-04f, +1.139799881e-04f, +1.308955478e-04f, -3.090764417e-05f, -5.846894037e-05f, -2.180095653e-06f, +1.478543797e-05f, +0.000000000e+00f,\n    /*  7, 6 (48) */\n    +0.000000000e+00f, -4.784698349e-04f, -1.982206477e-04f, +1.106929742e-03f, +1.167072639e-03f, -1.537864666e-03f, -3.156430395e-03f, +9.089963697e-04f, +5.974365218e-03f, +1.892340346e-03f, -8.594826879e-03f, -7.771772704e-03f, +9.024758730e-03f, +1.682543560e-02f, -4.456288141e-03f, -2.781565957e-02f, -8.522214343e-03f, +3.787208203e-02f, +3.466020206e-02f, -4.200022421e-02f, -8.673449879e-02f, +2.778952947e-02f, +2.661212792e-01f, +4.239078299e-01f, +3.469257938e-01f, +1.115549434e-01f, -6.544562817e-02f, -7.101785681e-02f, +1.147283603e-02f, +4.636433506e-02f, +9.320984485e-03f, -2.669897040e-02f, -1.581625102e-02f, +1.195789137e-02f, +1.479816563e-02f, -2.529288742e-03f, -1.051222790e-02f, -2.107995600e-03f, +5.826799312e-03f, +3.288885247e-03f, -2.312034593e-03f, -2.620557706e-03f, +3.972207571e-04f, +1.440683450e-03f, +2.419675046e-04f, -5.224547188e-04f, -2.091118358e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.509540550e-06f, -2.926201376e-05f, -3.840681472e-05f, +4.390250510e-05f, +1.012613717e-04f, -2.765094472e-05f, -1.963006941e-04f, -5.892846530e-05f, +2.935842267e-04f, +2.529616351e-04f, -3.263584260e-04f, -5.663821937e-04f, +1.928809655e-04f, +9.608022356e-04f, +2.341635411e-04f, -1.323753831e-03f, -1.111670068e-03f, +1.422821778e-03f, +2.724994848e-03f, -6.152699801e-04f, -6.211512263e-03f, -7.451120177e-03f, -1.656575693e-03f, +5.800984315e-03f, +7.571551505e-03f, +2.972213043e-03f, -1.953596747e-03f, -2.374119699e-03f, +2.365120531e-04f, +1.577254726e-03f, +4.355013456e-04f, -8.779399475e-04f, -6.084771756e-04f, +3.628492277e-04f, +5.294092466e-04f, -5.097199019e-05f, -3.564580986e-04f, -8.819787101e-05f, +1.886417687e-04f, +1.125406874e-04f, -7.254898397e-05f, -8.245797894e-05f, +1.413415498e-05f, +4.254913318e-05f, +3.399244831e-06f, -1.491327491e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.784698349e-04f, +1.982206477e-04f, -1.555255835e-03f, -1.763817242e-03f, +2.659673806e-03f, +4.774439089e-03f, -3.009059891e-03f, -9.520246907e-03f, +1.413981001e-03f, +1.541473318e-02f, +3.227323755e-03f, -2.103560649e-02f, -1.136022309e-02f, +2.440737863e-02f, +2.231374965e-02f, -2.363701309e-02f, -3.421078571e-02f, +1.768395697e-02f, +4.437850400e-02f, -6.933437601e-03f, -5.016550302e-02f, -6.716576944e-03f, +4.986380172e-02f, +2.035122845e-02f, -4.335275964e-02f, -3.095492907e-02f, +3.218074382e-02f, +3.638819737e-02f, -1.903919564e-02f, -3.603177721e-02f, +6.847966803e-03f, +3.085350479e-02f, +2.169029869e-03f, -2.291042782e-02f, -7.057770904e-03f, +1.453613013e-02f, +8.177814767e-03f, -7.568807152e-03f, -6.779615884e-03f, +2.910512605e-03f, +4.364754012e-03f, -5.217531717e-04f, -2.124748439e-03f, -2.473980074e-04f, +5.224547188e-04f, +2.091118358e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.509540550e-06f, +2.926201376e-05f, +6.213306230e-05f, -6.857199685e-05f, -1.646976352e-04f, +8.035156716e-05f, +3.346290863e-04f, -2.841151869e-05f, -5.593375809e-04f, -1.329581136e-04f, +7.940294904e-04f, +4.320574712e-04f, -9.667122445e-04f, -8.593041379e-04f, +9.979161819e-04f, +1.357150735e-03f, -8.297338200e-04f, -1.827992339e-03f, +4.528188339e-04f, +2.160332612e-03f, +8.115029959e-05f, -2.264787302e-03f, -6.690330814e-04f, +2.105863338e-03f, +1.186054466e-03f, -1.716078009e-03f, -1.524979356e-03f, +1.186014010e-03f, +1.629234820e-03f, -6.341458936e-04f, -1.507112506e-03f, +1.687909899e-04f, +1.222524883e-03f, +1.427370524e-04f, -8.678200852e-04f, -2.868408691e-04f, +5.310558291e-04f, +2.959240970e-04f, -2.708917795e-04f, -2.266458833e-04f, +1.071383779e-04f, +1.352272513e-04f, -2.711472282e-05f, -5.992783944e-05f, -3.399244831e-06f, +1.491327491e-05f, +0.000000000e+00f,\n    /*  7, 7 (48) */\n    +0.000000000e+00f, -4.689602943e-04f, -2.274826614e-04f, +1.068522927e-03f, +1.210975144e-03f, -1.436603294e-03f, -3.184081339e-03f, +7.126956756e-04f, +5.915436753e-03f, +2.185924572e-03f, -8.341865244e-03f, -8.098131130e-03f, +8.458376537e-03f, +1.701831657e-02f, -3.495485906e-03f, -2.758149602e-02f, -9.845968173e-03f, +3.676041196e-02f, +3.608302384e-02f, -3.927522936e-02f, -8.734976877e-02f, +2.157801721e-02f, +2.586701590e-01f, +4.222512542e-01f, +3.527267781e-01f, +1.191264949e-01f, -6.247341513e-02f, -7.297145356e-02f, +9.098716328e-03f, +4.660084711e-02f, +1.089823921e-02f, -2.626346905e-02f, -1.669419097e-02f, +1.134941420e-02f, +1.516101486e-02f, -1.999879496e-03f, -1.056319989e-02f, -2.464453698e-03f, +5.738601441e-03f, +3.477527016e-03f, -2.199493906e-03f, -2.693106690e-03f, +3.147627782e-04f, +1.454817605e-03f, +2.845166378e-04f, -5.190554740e-04f, -2.240251107e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.020248298e-05f, -2.794478312e-05f, -3.954017920e-05f, +4.061602803e-05f, +1.019455730e-04f, -2.122006131e-05f, -1.942973467e-04f, -6.884707305e-05f, +2.852203686e-04f, +2.645432223e-04f, -3.072532678e-04f, -5.742255451e-04f, +1.597182014e-04f, +9.548621291e-04f, +2.807115945e-04f, -1.288690027e-03f, -1.162109368e-03f, +1.336822724e-03f, +2.748065320e-03f, -4.467446921e-04f, -6.069073841e-03f, -7.526667692e-03f, -1.906515583e-03f, +5.626577831e-03f, +7.632272277e-03f, +3.158683085e-03f, -1.858177439e-03f, -2.428990405e-03f, +1.553336802e-04f, +1.578879652e-03f, +4.889656325e-04f, -8.588611084e-04f, -6.370607032e-04f, +3.398966032e-04f, +5.402508255e-04f, -3.224608662e-05f, -3.571682227e-04f, -1.002414783e-04f, +1.852800431e-04f, +1.187114401e-04f, -6.882595364e-05f, -8.484467018e-05f, +1.159134683e-05f, +4.315119110e-05f, +4.648267252e-06f, -1.500607012e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.689602943e-04f, +2.274826614e-04f, -1.493122773e-03f, -1.832389239e-03f, +2.494976171e-03f, +4.854790656e-03f, -2.674430805e-03f, -9.548658426e-03f, +8.546434197e-04f, +1.528177507e-02f, +4.021353246e-03f, -2.060354902e-02f, -1.232693533e-02f, +2.354807449e-02f, +2.331166583e-02f, -2.227986236e-02f, -3.504051953e-02f, +1.585596463e-02f, +4.483132284e-02f, -4.773104989e-03f, -5.008435272e-02f, -8.981364246e-03f, +4.919476864e-02f, +2.245709179e-02f, -4.216670517e-02f, -3.267100708e-02f, +3.065576446e-02f, +3.757421138e-02f, -1.740996082e-02f, -3.666592310e-02f, +5.340854297e-03f, +3.102229578e-02f, +3.391554752e-03f, -2.276769077e-02f, -7.925590989e-03f, +1.424928927e-02f, +8.708870596e-03f, -7.272883055e-03f, -7.050507664e-03f, +2.683866721e-03f, +4.471892390e-03f, -3.865259204e-04f, -2.151863162e-03f, -3.073258468e-04f, +5.190554740e-04f, +2.240251107e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.020248298e-05f, +2.794478312e-05f, +6.350687369e-05f, -6.295461800e-05f, -1.662767285e-04f, +6.872575091e-05f, +3.343245057e-04f, -8.397709338e-06f, -5.532701980e-04f, -1.624126768e-04f, +7.769113186e-04f, +4.694923866e-04f, -9.330563568e-04f, -9.001091448e-04f, +9.438343146e-04f, +1.393950635e-03f, -7.547255546e-04f, -1.852172990e-03f, +3.608135648e-04f, +2.164341675e-03f, +1.820540613e-04f, -2.244447194e-03f, -7.682187358e-04f, +2.061833388e-03f, +1.272957041e-03f, -1.653875520e-03f, -1.591707552e-03f, +1.114547142e-03f, +1.672339179e-03f, -5.632859609e-04f, -1.527933181e-03f, +1.068595109e-04f, +1.226115595e-03f, +1.907184711e-04f, -8.609741559e-04f, -3.196593601e-04f, +5.202270671e-04f, +3.154870750e-04f, -2.607176712e-04f, -2.365715527e-04f, +9.991676201e-05f, +1.393583212e-04f, -2.315335024e-05f, -6.128773634e-05f, -4.648267252e-06f, +1.500607012e-05f, +0.000000000e+00f,\n    /*  7, 8 (48) */\n    +0.000000000e+00f, -4.587578113e-04f, -2.554274445e-04f, +1.028982748e-03f, +1.251591172e-03f, -1.334657721e-03f, -3.205301401e-03f, +5.183983289e-04f, +5.846589680e-03f, +2.471144941e-03f, -8.077322022e-03f, -8.405384397e-03f, +7.884150992e-03f, +1.717803477e-02f, -2.540623776e-03f, -2.730078443e-02f, -1.113465820e-02f, +3.559830260e-02f, +3.741984656e-02f, -3.652716404e-02f, -8.779651347e-02f, +1.550894337e-02f, +2.511434913e-01f, +4.203447386e-01f, +3.583533560e-01f, +1.267587672e-01f, -5.931473204e-02f, -7.482963099e-02f, +6.669725923e-03f, +4.675618079e-02f, +1.247711886e-02f, -2.577450342e-02f, -1.755305208e-02f, +1.071235349e-02f, +1.550091146e-02f, -1.459628670e-03f, -1.059544598e-02f, -2.821621921e-03f, +5.638359962e-03f, +3.662807059e-03f, -2.080782465e-03f, -2.761932644e-03f, +2.299181080e-04f, +1.466408952e-03f, +3.276678289e-04f, -5.144072068e-04f, -2.390311808e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.084885119e-05f, -2.660359268e-05f, -4.056543633e-05f, +3.731992528e-05f, +1.024192393e-04f, -1.486432307e-05f, -1.919620389e-04f, -7.848236882e-05f, +2.764526489e-04f, +2.754760482e-04f, -2.878444504e-04f, -5.809226461e-04f, +1.266905299e-04f, +9.472786986e-04f, +3.261633500e-04f, -1.251794720e-03f, -1.209805552e-03f, +1.249795243e-03f, +2.766077777e-03f, -2.810474539e-04f, -5.922220368e-03f, -7.594503719e-03f, -2.154360581e-03f, +5.446128244e-03f, +7.685991774e-03f, +3.344738387e-03f, -1.757784465e-03f, -2.480500260e-03f, +7.270153211e-05f, +1.577692923e-03f, +5.422436965e-04f, -8.379753945e-04f, -6.648477053e-04f, +3.160191976e-04f, +5.502403358e-04f, -1.319881162e-05f, -3.572207922e-04f, -1.122820998e-04f, +1.815105706e-04f, +1.247624957e-04f, -6.489718843e-05f, -8.711201950e-05f, +8.965421965e-06f, +4.367637005e-05f, +5.925014199e-06f, -1.506247809e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.587578113e-04f, +2.554274445e-04f, -1.429615899e-03f, -1.895343857e-03f, +2.328699442e-03f, +4.923516407e-03f, -2.340106299e-03f, -9.557056136e-03f, +3.013732217e-04f, +1.511936239e-02f, +4.798264564e-03f, -2.013405663e-02f, -1.325999169e-02f, +2.264796534e-02f, +2.425550015e-02f, -2.088591172e-02f, -3.579524509e-02f, +1.400379164e-02f, +4.519213640e-02f, -2.608763314e-03f, -4.990229866e-02f, -1.122581144e-02f, +4.842654990e-02f, +2.451892518e-02f, -4.089374813e-02f, -3.432488260e-02f, +2.906405691e-02f, +3.868875852e-02f, -1.573762164e-02f, -3.722920906e-02f, +3.812921116e-03f, +3.112915529e-02f, +4.617670347e-03f, -2.257697230e-02f, -8.786565145e-03f, +1.392962991e-02f, +9.229097663e-03f, -6.957395980e-03f, -7.311225335e-03f, +2.447295169e-03f, +4.571809152e-03f, -2.471675992e-04f, -2.175016512e-03f, -3.686135832e-04f, +5.144072068e-04f, +2.390311808e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.084885119e-05f, +2.660359268e-05f, +6.469443335e-05f, -5.733696346e-05f, -1.674600283e-04f, +5.717684970e-05f, +3.333171188e-04f, +1.132493745e-05f, -5.461317680e-04f, -1.911623324e-04f, +7.583767867e-04f, +5.055827778e-04f, -8.977809330e-04f, -9.387417533e-04f, +8.881926267e-04f, +1.427673533e-03f, -6.785577956e-04f, -1.872463125e-03f, +2.683860678e-04f, +2.163918277e-03f, +2.824053234e-04f, -2.219541565e-03f, -8.658158848e-04f, +2.013561012e-03f, +1.357378262e-03f, -1.588148312e-03f, -1.655376630e-03f, +1.040515324e-03f, +1.712211021e-03f, -4.908671114e-04f, -1.545738034e-03f, +4.424144080e-05f, +1.227194049e-03f, +2.387640299e-04f, -8.522559589e-04f, -3.522010130e-04f, +5.081553750e-04f, +3.346708314e-04f, -2.498154825e-04f, -2.461687640e-04f, +9.232376686e-05f, +1.432744774e-04f, -1.902867683e-05f, -6.254207668e-05f, -5.925014199e-06f, +1.506247809e-05f, +0.000000000e+00f,\n    /*  7, 9 (48) */\n    +0.000000000e+00f, -4.479089601e-04f, -2.820310372e-04f, +9.884173113e-04f, +1.288911098e-03f, -1.232238482e-03f, -3.220165724e-03f, +3.264362900e-04f, +5.768107311e-03f, +2.747597590e-03f, -7.801845974e-03f, -8.693228848e-03f, +7.303228346e-03f, +1.730472530e-02f, -1.593345078e-03f, -2.697462108e-02f, -1.238645292e-02f, +3.438849704e-02f, +3.866964181e-02f, -3.376108626e-02f, -8.807756092e-02f, +9.586722998e-03f, +2.435489876e-01f, +4.181903781e-01f, +3.637994842e-01f, +1.344447589e-01f, -5.596999366e-02f, -7.658741546e-02f, +4.189225664e-03f, +4.682888232e-02f, +1.405481179e-02f, -2.523225973e-02f, -1.839102747e-02f, +1.004750579e-02f, +1.581693066e-02f, -9.093883346e-04f, -1.060864479e-02f, -3.178842713e-03f, +5.526077863e-03f, +3.844317629e-03f, -1.956019970e-03f, -2.826829832e-03f, +1.428060885e-04f, +1.475374374e-03f, +3.713441989e-04f, -5.084821926e-04f, -2.540936589e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.144840713e-05f, -2.524204041e-05f, -4.148289141e-05f, +3.402109109e-05f, +1.026854258e-04f, -8.594746194e-06f, -1.893046668e-04f, -8.782050396e-05f, +2.673033459e-04f, +2.857488329e-04f, -2.681717440e-04f, -5.864760599e-04f, +9.385614083e-05f, +9.380861467e-04f, +3.704516143e-04f, -1.213156387e-03f, -1.254713117e-03f, +1.161900464e-03f, +2.779085504e-03f, -1.183583270e-04f, -5.771169318e-03f, -7.654592979e-03f, -2.399839862e-03f, +5.259816984e-03f, +7.732594905e-03f, +3.530139394e-03f, -1.652485180e-03f, -2.528511193e-03f, -1.126185069e-05f, +1.573659262e-03f, +5.952375593e-04f, -8.152977755e-04f, -6.917772238e-04f, +2.912490903e-04f, +5.593479040e-04f, +6.138583950e-06f, -3.566062405e-04f, -1.242967150e-04f, +1.773340635e-04f, +1.306799422e-04f, -6.076670666e-05f, -8.925298590e-05f, +6.260081759e-06f, +4.412161161e-05f, +7.227216627e-06f, -1.508121306e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.479089601e-04f, +2.820310372e-04f, -1.364921466e-03f, -1.952680821e-03f, +2.161239414e-03f, +4.980693256e-03f, -2.006789181e-03f, -9.545731198e-03f, -2.447585463e-04f, +1.492820006e-02f, +5.556641351e-03f, -1.962847385e-02f, -1.415777262e-02f, +2.170922359e-02f, +2.514369277e-02f, -1.945823819e-02f, -3.647380288e-02f, +1.213132852e-02f, +4.546052247e-02f, -4.448450370e-04f, -4.961989334e-02f, -1.344535300e-02f, +4.756073402e-02f, +2.653248619e-02f, -3.953636987e-02f, -3.591303092e-02f, +2.740868028e-02f, +3.972927384e-02f, -1.402541062e-02f, -3.772007617e-02f, +2.267183082e-03f, +3.117339673e-02f, +5.844864396e-03f, -2.233820827e-02f, -9.638821104e-03f, +1.357742889e-02f, +9.737253038e-03f, -6.622725149e-03f, -7.561040817e-03f, +2.201126405e-03f, +4.664132919e-03f, -1.038931219e-04f, -2.194045189e-03f, -4.311556598e-04f, +5.084821926e-04f, +2.540936589e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.144840713e-05f, +2.524204041e-05f, +6.569800200e-05f, -5.173204069e-05f, -1.682532630e-04f, +4.572887222e-05f, +3.316210050e-04f, +3.071845145e-05f, -5.379521862e-04f, -2.191548864e-04f, +7.384806670e-04f, +5.402663004e-04f, -8.609741092e-04f, -9.751384994e-04f, +8.311176495e-04f, +1.458267827e-03f, -6.013944085e-04f, -1.888837242e-03f, +1.757290856e-04f, +2.159074794e-03f, +3.819975348e-04f, -2.190126450e-03f, -9.616229592e-04f, +1.961143586e-03f, +1.439139845e-03f, -1.519024892e-03f, -1.715845240e-03f, +9.640625692e-04f, +1.748752148e-03f, -4.170317670e-04f, -1.560470263e-03f, -1.893694541e-05f, +1.225736781e-03f, +2.867727586e-04f, -8.416641236e-04f, -3.843929989e-04f, +4.948503601e-04f, +3.534281504e-04f, -2.381972856e-04f, -2.554101662e-04f, +8.436905505e-05f, +1.469616392e-04f, -1.474638968e-05f, -6.368440066e-05f, -7.227216627e-06f, +1.508121306e-05f, +0.000000000e+00f,\n    /*  7,10 (48) */\n    +0.000000000e+00f, -4.364605530e-04f, -3.072730776e-04f, +9.469344199e-04f, +1.322932189e-03f, -1.129553056e-03f, -3.228760470e-03f, +1.371316231e-04f, +5.680286807e-03f, +3.014900936e-03f, -7.516097141e-03f, -8.961400592e-03f, +6.716752286e-03f, +1.739858144e-02f, -6.552589311e-04f, -2.660416947e-02f, -1.359960931e-02f, +3.313378393e-02f, +3.983154227e-02f, -3.098200076e-02f, -8.819591925e-02f, +3.815553680e-03f, +2.358943946e-01f, +4.157905382e-01f, +3.690593012e-01f, +1.421773538e-01f, -5.243985426e-02f, -7.823990064e-02f, +1.660714471e-03f, +4.681762047e-02f, +1.562847105e-02f, -2.463702217e-02f, -1.920632525e-02f, +9.355728563e-03f, +1.610817975e-02f, -3.500404306e-04f, -1.060250621e-02f, -3.535448954e-03f, +5.401781148e-03f, +4.021651693e-03f, -1.825340028e-03f, -2.887596539e-03f, +5.355310260e-05f, +1.481634456e-03f, +4.154658105e-04f, -5.012549759e-04f, -2.691748720e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.200103319e-05f, -2.386368643e-05f, -4.229307530e-05f, +3.072628925e-05f, +1.027475501e-04f, -2.421989333e-06f, -1.863355934e-04f, -9.684840658e-05f, +2.577951417e-04f, +2.953516851e-04f, -2.482748867e-04f, -5.908904165e-04f, +6.127215102e-05f, +9.273211492e-04f, +4.135120799e-04f, -1.172865439e-03f, -1.296791870e-03f, +1.073298769e-03f, +2.787148517e-03f, +4.114853267e-05f, -5.616142078e-03f, -7.706910059e-03f, -2.642685756e-03f, +5.067833211e-03f, +7.771975044e-03f, +3.714645386e-03f, -1.542354717e-03f, -2.572888771e-03f, -9.643006054e-05f, +1.566747901e-03f, +6.478485272e-04f, -7.908466446e-04f, -7.177891105e-04f, +2.656204183e-04f, +5.675449142e-04f, +2.573387983e-05f, -3.553161379e-04f, -1.362620122e-04f, +1.727520416e-04f, +1.364499007e-04f, -5.643900752e-05f, -9.126065537e-05f, +3.479275925e-06f, +4.448396762e-05f, +8.552487914e-06f, -1.506105373e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.364605530e-04f, +3.072730776e-04f, -1.299223464e-03f, -2.004412861e-03f, +1.992986151e-03f, +5.026422129e-03f, -1.675168176e-03f, -9.515012747e-03f, -7.827107325e-04f, +1.470904517e-02f, +6.295122018e-03f, -1.908820755e-02f, -1.501874673e-02f, +2.073408509e-02f, +2.597481042e-02f, -1.799997036e-02f, -3.707519729e-02f, +1.024249128e-02f, +4.563625156e-02f, +1.714229757e-03f, -4.923789580e-02f, -1.563547945e-02f, +4.659911106e-02f, +2.849362978e-02f, -3.809723002e-02f, -3.743205581e-02f, +2.569283504e-02f, +4.069333641e-02f, -1.227665847e-02f, -3.813710794e-02f, +7.067128194e-04f, +3.115445979e-02f, +7.070601177e-03f, -2.205143551e-02f, -1.048048523e-02f, +1.319303589e-02f, +1.023210340e-02f, -6.269296998e-03f, -7.799238103e-03f, +1.945716238e-03f, +4.748501974e-03f, +4.306851739e-05f, -2.208791579e-03f, -4.948400605e-04f, +5.012549759e-04f, +2.691748720e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.200103319e-05f, +2.386368643e-05f, +6.652024205e-05f, -4.615252836e-05f, -1.686629464e-04f, +3.440515789e-05f, +3.292515434e-04f, +4.974615180e-05f, -5.287632087e-04f, -2.463404129e-04f, +7.172800494e-04f, +5.734842225e-04f, -8.227264984e-04f, -1.009241144e-03f, +7.727380717e-04f, +1.485688805e-03f, -5.234005202e-04f, -1.901278162e-03f, +8.303518807e-05f, +2.149832828e-03f, +4.806261020e-04f, -2.156267264e-03f, -1.055442178e-03f, +1.904687222e-03f, +1.518068837e-03f, -1.446641169e-03f, -1.772978338e-03f, +8.853385352e-04f, +1.781870932e-03f, -3.419261273e-04f, -1.572079214e-03f, -8.254725443e-05f, +1.221725550e-03f, +3.346428214e-04f, -8.292013105e-04f, -4.161624012e-04f, +4.803244579e-04f, +3.717120835e-04f, -2.258769512e-04f, -2.642687365e-04f, +7.606332210e-05f, +1.504059649e-04f, -1.031271056e-05f, -6.470836289e-05f, -8.552487914e-06f, +1.506105373e-05f, +0.000000000e+00f,\n    /*  7,11 (48) */\n    +0.000000000e+00f, -4.244595198e-04f, -3.311367641e-04f, +9.046413446e-04f, +1.353658478e-03f, -1.026805506e-03f, -3.231182459e-03f, -4.920397027e-05f, +5.583438400e-03f, +3.272696078e-03f, -7.220745456e-03f, -9.209675479e-03f, +6.125861869e-03f, +1.745985359e-02f, +2.720622181e-04f, -2.619065739e-02f, -1.477247475e-02f, +3.183699206e-02f, +4.090484104e-02f, -2.819485224e-02f, -8.815477071e-02f, -1.800588398e-03f, +2.281874846e-01f, +4.131478524e-01f, +3.741271344e-01f, +1.499493289e-01f, -4.872520888e-02f, -7.978225536e-02f, -9.121743007e-04f, +4.672119041e-02f, +1.719521895e-02f, -2.398917364e-02f, -1.999717189e-02f, +8.637939453e-03f, +1.637380016e-02f, +2.175044837e-04f, -1.057677233e-02f, -3.890765092e-03f, +5.265519135e-03f, +4.194403735e-03f, -1.688890127e-03f, -2.944035546e-03f, -3.770755277e-05f, +1.485113732e-03f, +4.599497782e-04f, -4.927024880e-04f, -2.842359257e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.250672977e-05f, -2.247204570e-05f, -4.299673875e-05f, +2.744214133e-05f, +1.026093788e-04f, +3.643661803e-06f, -1.830656208e-04f, -1.055537955e-04f, +2.479510728e-04f, +3.042761023e-04f, -2.281935112e-04f, -5.941723784e-04f, +2.899451371e-05f, +9.150227597e-04f, +4.552834036e-04f, -1.131014046e-03f, -1.336006934e-03f, +9.841495448e-04f, +2.790333414e-03f, +1.973050787e-04f, -5.457363617e-03f, -7.751439409e-03f, -2.882634107e-03f, +4.870373568e-03f, +7.804034221e-03f, +3.898014814e-03f, -1.427475945e-03f, -2.613502441e-03f, -1.826729847e-04f, +1.556932685e-03f, +6.999773566e-04f, -7.646438261e-04f, -7.428241466e-04f, +2.391693380e-04f, +5.748040784e-04f, +4.555393470e-05f, -3.533432234e-04f, -1.481544296e-04f, +1.677668407e-04f, +1.420585538e-04f, -5.191907005e-05f, -9.312825770e-05f, +6.271988012e-07f, +4.476060912e-05f, +9.898326944e-06f, -1.500084795e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.244595198e-04f, +3.311367641e-04f, -1.232703222e-03f, -2.050565390e-03f, +1.824323205e-03f, +5.060827286e-03f, -1.345916632e-03f, -9.465266595e-03f, -1.311473941e-03f, +1.446270476e-02f, +7.012402067e-03f, -1.851472333e-02f, -1.584147323e-02f, +1.972484395e-02f, +2.674754850e-02f, -1.651428156e-02f, -3.759859781e-02f, +8.341213115e-03f, +4.571928674e-02f, +3.864062585e-03f, -4.875726970e-02f, -1.779174672e-02f, +4.554366888e-02f, +3.039831700e-02f, -3.657916119e-02f, -3.887869698e-02f, +2.391985670e-02f, +4.157867495e-02f, -1.049478754e-02f, -3.847903407e-02f, -8.653663943e-04f, +3.107191253e-02f, +8.292326727e-03f, -2.171679269e-02f, -1.130968654e-02f, +1.277687349e-02f, +1.071242786e-02f, -5.897584915e-03f, -8.025115054e-03f, +1.681447502e-03f, +4.824565296e-03f, +1.934744823e-04f, -2.219104290e-03f, -5.595484234e-04f, +4.927024880e-04f, +2.842359257e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.250672977e-05f, +2.247204570e-05f, +6.716420108e-05f, -4.061075246e-05f, -1.686963471e-04f, +2.322833477e-05f, +3.262253562e-04f, +6.837271040e-05f, -5.185983570e-04f, -2.726713359e-04f, +6.948341928e-04f, +6.051815166e-04f, -7.831309738e-04f, -1.040996755e-03f, +7.131844500e-04f, +1.509898702e-03f, -4.447421613e-04f, -1.909777027e-03f, -9.503635785e-06f, +2.136223136e-03f, +5.780888186e-04f, -2.118038660e-03f, -1.147079970e-03f, +1.844306549e-03f, +1.593997990e-03f, -1.371140182e-03f, -1.826647489e-03f, +8.044982205e-04f, +1.811482537e-03f, -2.656998777e-04f, -1.580520533e-03f, -1.464592362e-04f, +1.215147420e-03f, +3.822717313e-04f, -8.148742466e-04f, -4.474363760e-04f, +4.645929399e-04f, +3.894760597e-04f, -2.128701444e-04f, -2.727178485e-04f, +6.741829055e-05f, +1.535938897e-04f, -5.734392500e-06f, -6.560775245e-05f, -9.898326944e-06f, +1.500084795e-05f, +0.000000000e+00f,\n    /*  7,12 (48) */\n    +0.000000000e+00f, -4.119527900e-04f, -3.536088098e-04f, +8.616446058e-04f, +1.381100619e-03f, -9.241961269e-04f, -3.227538798e-03f, -2.322695911e-04f, +5.477884605e-03f, +3.520647150e-03f, -6.916469353e-03f, -9.437868990e-03f, +5.531689491e-03f, +1.748884811e-02f, +1.187084978e-03f, -2.573537398e-02f, -1.590348879e-02f, +3.050098512e-02f, +4.188899058e-02f, -2.540451883e-02f, -8.795746564e-02f, -7.257952015e-03f, +2.204360452e-01f, +4.102652183e-01f, +3.789975080e-01f, +1.577533631e-01f, -4.482719406e-02f, -8.120973130e-02f, -3.525676742e-03f, +4.653851743e-02f, +1.875215164e-02f, -2.328919628e-02f, -2.076181572e-02f, +7.895115306e-03f, +1.661296950e-02f, +7.923085621e-04f, -1.053121839e-02f, -4.244108315e-03f, +5.117364706e-03f, +4.362170575e-03f, -1.546831573e-03f, -2.995954616e-03f, -1.308358105e-04f, +1.485740930e-03f, +5.047103873e-04f, -4.828041611e-04f, -2.992367736e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.296561261e-05f, -2.107058095e-05f, -4.359484627e-05f, +2.417511538e-05f, +1.022750137e-04f, +9.592308909e-06f, -1.795059626e-04f, -1.139251923e-04f, +2.377944815e-04f, +3.125149683e-04f, -2.079670723e-04f, -5.963306029e-04f, -2.922069502e-06f, +9.012323114e-04f, +4.957072808e-04f, -1.087695956e-03f, -1.372328744e-03f, +8.946109473e-04f, +2.788713209e-03f, +3.499495666e-04f, -5.295062159e-03f, -7.788175333e-03f, -3.119424623e-03f, +4.667641934e-03f, +7.828683285e-03f, +4.080005638e-03f, -1.307939416e-03f, -2.650225773e-03f, -2.698569752e-04f, +1.544192172e-03f, +7.515244226e-04f, -7.367145768e-04f, -7.668241626e-04f, +2.119339833e-04f, +5.810995041e-04f, +6.556473697e-05f, -3.506814349e-04f, -1.599501977e-04f, +1.623816207e-04f, +1.474921745e-04f, -4.721235117e-05f, -9.484918346e-05f, -2.291714961e-06f, +4.494883537e-05f, +1.126212154e-05f, -1.489951724e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.119527900e-04f, +3.536088098e-04f, -1.165539020e-03f, -2.091176142e-03f, +1.655626858e-03f, +5.084055621e-03f, -1.019691276e-03f, -9.396893884e-03f, -1.830072298e-03f, +1.419003343e-02f, +7.707236260e-03f, -1.790954181e-02f, -1.662460420e-02f, +1.868384719e-02f, +2.746073294e-02f, -1.500438286e-02f, -3.804333997e-02f, +6.431436087e-03f, +4.570978311e-02f, +6.000285721e-03f, -4.817918088e-02f, -1.990978538e-02f, +4.439658891e-02f, +3.224262355e-02f, -3.498516320e-02f, -4.024983716e-02f, +2.209320921e-02f, +4.238317317e-02f, -8.683305000e-03f, -3.874473394e-02f, -2.445886927e-03f, +3.092545330e-02f, +9.507474147e-03f, -2.133452096e-02f, -1.212456078e-02f, +1.232943712e-02f, +1.117702080e-02f, -5.508108855e-03f, -8.237985198e-03f, +1.408729653e-03f, +4.891983586e-03f, +3.470683719e-04f, -2.224838682e-03f, -6.251561758e-04f, +4.828041611e-04f, +2.992367736e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.296561261e-05f, +2.107058095e-05f, +6.763329471e-05f, -3.511866381e-05f, -1.683614557e-04f, +1.222027980e-05f, +3.225602511e-04f, +8.656421125e-05f, -5.074928212e-04f, -2.981025057e-04f, +6.712043721e-04f, +6.353069426e-04f, -7.422824492e-04f, -1.070357785e-03f, +6.525889165e-04f, +1.530866736e-03f, -3.655859086e-04f, -1.914333292e-03f, -1.016963831e-04f, +2.118285537e-03f, +6.741862898e-04f, -2.075524354e-03f, -1.236347376e-03f, +1.780124475e-03f, +1.666766124e-03f, -1.292671811e-03f, -1.876731160e-03f, +7.217016570e-04f, +1.837509136e-03f, -1.885058871e-04f, -1.585756300e-03f, -2.105410514e-04f, +1.205994828e-03f, +4.295565671e-04f, -7.986937526e-04f, -4.781423133e-04f, +4.476739156e-04f, +4.066739952e-04f, -1.991943163e-04f, -2.807313413e-04f, +5.844670138e-05f, +1.565121654e-04f, -1.018715016e-06f, -6.637651307e-05f, -1.126212154e-05f, +1.489951724e-05f, +0.000000000e+00f,\n    /*  7,13 (48) */\n    +0.000000000e+00f, -3.989871774e-04f, -3.746793907e-04f, +8.180497596e-04f, +1.405275735e-03f, -8.219211132e-04f, -3.217946489e-03f, -4.117755537e-04f, +5.363959413e-03f, +3.758441632e-03f, -6.603954385e-03f, -9.645836062e-03f, +4.935358888e-03f, +1.748592604e-02f, +2.088317289e-03f, -2.523966670e-02f, -1.699118475e-02f, +2.912865638e-02f, +4.278360153e-02f, -2.261580562e-02f, -8.760751607e-02f, -1.255301417e-02f, +2.126478698e-01f, +4.071457937e-01f, +3.836651499e-01f, +1.655820464e-01f, -4.074718842e-02f, -8.251767072e-02f, -6.175902515e-03f, +4.626866045e-02f, +2.029634381e-02f, -2.253767186e-02f, -2.149853030e-02f, +7.128291144e-03f, +1.682490349e-02f, +1.373408066e-03f, -1.046565366e-02f, -4.594789750e-03f, +4.957414508e-03f, +4.524552196e-03f, -1.399339399e-03f, -3.043166967e-03f, -2.256849939e-04f, +1.483449215e-03f, +5.496592227e-04f, -4.715420395e-04f, -3.141362909e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.337790988e-05f, -1.966269580e-05f, -4.408856978e-05f, +2.093151518e-05f, +1.017488775e-04f, +1.541445451e-05f, -1.756682150e-04f, -1.219519320e-04f, +2.273489669e-04f, +3.200625479e-04f, -1.876347751e-04f, -5.973757021e-04f, -3.442423318e-05f, +8.859933155e-04f, +5.347285126e-04f, -1.043006315e-03f, -1.405733032e-03f, +8.048396605e-04f, +2.782367157e-03f, +4.989267366e-04f, -5.129468842e-03f, -7.817121964e-03f, -3.352801220e-03f, +4.459849164e-03f, +7.845842068e-03f, +4.260375659e-03f, -1.183843295e-03f, -2.682936699e-03f, -3.578450253e-04f, +1.528509729e-03f, +8.023898903e-04f, -7.070875820e-04f, -7.897321568e-04f, +1.839544194e-04f, +5.864067609e-04f, +8.573145784e-05f, -3.473259368e-04f, -1.716253821e-04f, +1.566003717e-04f, +1.527371547e-04f, -4.232478271e-05f, -9.641700079e-05f, -5.272795322e-06f, +4.504608258e-05f, +1.264115220e-05f, -1.475606133e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.989871774e-04f, +3.746793907e-04f, -1.097905726e-03f, -2.126294806e-03f, +1.487265402e-03f, +5.096275901e-03f, -6.971310248e-04f, -9.310329673e-03f, -2.337565119e-03f, +1.389193092e-02f, +8.378440632e-03f, -1.727423487e-02f, -1.736688665e-02f, +1.761348941e-02f, +2.811332186e-02f, -1.347351612e-02f, -3.840892588e-02f, +4.517102796e-03f, +4.560808673e-02f, +8.118571258e-03f, -4.750499459e-02f, -2.198530973e-02f, +4.316024154e-02f, +3.402274802e-02f, -3.331839707e-02f, -4.154250897e-02f, +2.021647805e-02f, +4.310487483e-02f, -6.845795863e-03f, -3.893323983e-02f, -4.031643228e-03f, +3.071491225e-02f, +1.071346897e-02f, -2.090496439e-02f, -1.292325454e-02f, +1.185129480e-02f, +1.162469471e-02f, -5.101434860e-03f, -8.437179515e-03f, +1.127998312e-03f, +4.950430288e-03f, +5.035805373e-04f, -2.225857397e-03f, -6.915326889e-04f, +4.715420395e-04f, +3.141362909e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.337790988e-05f, +1.966269580e-05f, +6.793128886e-05f, -2.968781694e-05f, -1.676669522e-04f, +1.402081619e-06f, +3.182751618e-04f, +1.042882057e-04f, -4.954833594e-04f, -3.225912690e-04f, +6.464537228e-04f, +6.638131218e-04f, -7.002776567e-04f, -1.097282124e-03f, +5.910848864e-04f, +1.548569136e-03f, -2.860985280e-04f, -1.914954680e-03f, -1.933534389e-04f, +2.096068812e-03f, +7.687223488e-04f, -2.028816945e-03f, -1.323060455e-03f, +1.712271930e-03f, +1.736218473e-03f, -1.211392477e-03f, -1.923114997e-03f, +6.371135868e-04f, +1.859880104e-03f, -1.104998981e-04f, -1.587755150e-03f, -2.746595442e-04f, +1.194265648e-03f, +4.763941934e-04f, -7.806747605e-04f, -5.082080004e-04f, +4.295883275e-04f, +4.232604045e-04f, -1.848686923e-04f, -2.882835876e-04f, +4.916230295e-05f, +1.591478992e-04f, +3.826522264e-06f, -6.700876330e-05f, -1.264115220e-05f, +1.475606133e-05f, +0.000000000e+00f,\n    /*  7,14 (48) */\n    +0.000000000e+00f, -3.856092675e-04f, -3.943420865e-04f, +7.739611898e-04f, +1.426207250e-03f, -7.201722357e-04f, -3.202532034e-03f, -5.874437687e-04f, +5.242007481e-03f, +3.985790599e-03f, -6.283891837e-03f, -9.833470837e-03f, +4.337983186e-03f, +1.745150180e-02f, +2.974310605e-03f, -2.470493819e-02f, -1.803419106e-02f, +2.772292335e-02f, +4.358844119e-02f, -1.983343846e-02f, -8.710858933e-02f, -1.768248302e-02f, +2.048307479e-01f, +4.037929925e-01f, +3.881249991e-01f, +1.734278885e-01f, -3.648681276e-02f, -8.370151401e-02f, -8.858839214e-03f, +4.591081542e-02f, +2.182485354e-02f, -2.173528197e-02f, -2.220561788e-02f, +6.338558987e-03f, +1.700885791e-02f, +1.959814827e-03f, -1.037992220e-02f, -4.942115687e-03f, +4.785789126e-03f, +4.681152568e-03f, -1.246602244e-03f, -3.085491750e-03f, -3.221019947e-04f, +1.478176420e-03f, +5.947053052e-04f, -4.589008873e-04f, -3.288923522e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.374395910e-05f, -1.825172823e-05f, -4.447928178e-05f, +1.771747005e-05f, +1.010356992e-04f, +2.110101439e-05f, -1.715643282e-04f, -1.296241714e-04f, +2.166383362e-04f, +3.269144798e-04f, -1.672355058e-04f, -5.973201982e-04f, -6.546002915e-05f, +8.693513573e-04f, +5.722950666e-04f, -9.970414821e-04f, -1.436200809e-03f, +7.149906656e-04f, +2.771380576e-03f, +6.440879846e-04f, -4.960817383e-03f, -7.838293220e-03f, -3.582512362e-03f, +4.247212811e-03f, +7.855439529e-03f, +4.438882863e-03f, -1.055293283e-03f, -2.711517747e-03f, -4.464969546e-04f, +1.509873614e-03f, +8.524738878e-04f, -6.757949444e-04f, -8.114924139e-04f, +1.552725920e-04f, +5.907029444e-04f, +1.060185066e-04f, -3.432731465e-04f, -1.831559283e-04f, +1.504279191e-04f, +1.577800351e-04f, -3.726276731e-05f, -9.782547217e-05f, -8.311142389e-06f, +4.504993268e-05f, +1.403259622e-05f, -1.456956252e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.856092675e-04f, +3.943420865e-04f, -1.029974437e-03f, -2.155982623e-03f, +1.319598450e-03f, +5.097677983e-03f, -3.788558631e-04f, -9.206041467e-03f, -2.833048479e-03f, +1.356933965e-02f, +9.024894355e-03f, -1.661042175e-02f, -1.806716431e-02f, +1.651620728e-02f, +2.870440675e-02f, -1.192494699e-02f, -3.869502441e-02f, +2.602148116e-03f, +4.541473329e-02f, +1.021464007e-02f, -4.673627224e-02f, -2.401412668e-02f, +4.183718108e-02f, +3.573501995e-02f, -3.158217860e-02f, -4.275390145e-02f, +1.829336305e-02f, +4.374198841e-02f, -4.985915759e-03f, -3.904373973e-02f, -5.619398378e-03f, +3.044025270e-02f, +1.190773462e-02f, -2.042857020e-02f, -1.370392930e-02f, +1.134308680e-02f, +1.205428304e-02f, -4.678174456e-03f, -8.622048207e-03f, +8.397147245e-04f, +4.999592591e-03f, +6.627284365e-04f, -2.222030875e-03f, -7.585414522e-04f, +4.589008873e-04f, +3.288923522e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.374395910e-05f, +1.825172823e-05f, +6.806228152e-05f, -2.432935045e-05f, -1.666221717e-04f, -9.205994243e-06f, +3.133900864e-04f, +1.215137638e-04f, -4.826081954e-04f, -3.460975324e-04f, +6.206470836e-04f, +6.906566020e-04f, -6.572149221e-04f, -1.121733156e-03f, +5.288067630e-04f, +1.562989149e-03f, -2.064466181e-04f, -1.911657141e-03f, -2.842869735e-04f, +2.069630568e-03f, +8.615044673e-04f, -1.978017705e-03f, -1.407040669e-03f, +1.640887595e-03f, +1.802207023e-03f, -1.127464817e-03f, -1.965692091e-03f, +5.509031291e-04f, +1.878532204e-03f, -3.184020880e-05f, -1.586492380e-03f, -3.386805202e-04f, +1.179963238e-03f, +5.226814836e-04f, -7.608363226e-04f, -5.375617856e-04f, +4.103599397e-04f, +4.391905107e-04f, -1.699142545e-04f, -2.953495630e-04f, +3.957983714e-05f, +1.614885928e-04f, +8.793007373e-06f, -6.749881676e-05f, -1.403259622e-05f, +1.456956252e-05f, +0.000000000e+00f,\n    /*  7,15 (48) */\n    +0.000000000e+00f, -3.718653085e-04f, -4.125938147e-04f, +7.294819080e-04f, +1.443924720e-03f, -6.191365365e-04f, -3.181431020e-03f, -7.590080970e-04f, +5.112383309e-03f, +4.202428935e-03f, -5.956977357e-03f, -1.000070634e-02f, +3.740662988e-03f, +1.738604177e-02f, +3.843661962e-03f, -2.413264312e-02f, -1.903123255e-02f, +2.628672254e-02f, +4.430343186e-02f, -1.706205789e-02f, -8.646450135e-02f, -2.264330040e-02f, +1.969924546e-01f, +4.002104801e-01f, +3.923722119e-01f, +1.812833280e-01f, -3.204792990e-02f, -8.475680730e-02f, -1.157035696e-02f, +4.546431847e-02f, +2.333472715e-02f, -2.088280808e-02f, -2.288141282e-02f, +5.527066573e-03f, +1.716413050e-02f, +2.550517771e-03f, -1.027390369e-02f, -5.285388833e-03f, +4.602633198e-03f, +4.831580487e-03f, -1.088822209e-03f, -3.122754517e-03f, -4.199274669e-04f, +1.469865278e-03f, +6.397552379e-04f, -4.448682911e-04f, -3.434619147e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.406420377e-05f, -1.684094428e-05f, -4.476854836e-05f, +1.453892518e-05f, +1.001404985e-04f, +2.664332890e-05f, -1.672065776e-04f, -1.369328962e-04f, +2.056865565e-04f, +3.330677657e-04f, -1.468077623e-04f, -5.961784772e-04f, -9.597900412e-05f, +8.513539892e-04f, +6.083581318e-04f, -9.498988544e-04f, -1.463718330e-03f, +6.252170128e-04f, +2.755844657e-03f, +7.852915229e-04f, -4.789343739e-03f, -7.851712756e-03f, -3.808311390e-03f, +4.029956851e-03f, +7.857413890e-03f, +4.615285763e-03f, -9.224025289e-04f, -2.735856267e-03f, -5.356695997e-04f, +1.488277057e-03f, +9.016766817e-04f, -6.428721674e-04f, -8.320506221e-04f, +1.259322736e-04f, +5.939667389e-04f, +1.263895881e-04f, -3.385207585e-04f, -1.945177063e-04f, +1.438699263e-04f, +1.626075341e-04f, -3.203317336e-05f, -9.906857111e-05f, -1.140163254e-05f, +4.495812173e-05f, +1.543353210e-05f, -1.433918995e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.718653085e-04f, +4.125938147e-04f, -9.619121554e-04f, -2.180311973e-03f, +1.152976278e-03f, +5.088471988e-03f, -6.546577670e-05f, -9.084527704e-03f, -3.315656674e-03f, +1.322324212e-02f, +9.645541439e-03f, -1.591976515e-02f, -1.872437923e-02f, +1.539447413e-02f, +2.923321351e-02f, -1.036195784e-02f, -3.890147103e-02f, +6.904909747e-04f, +4.513044631e-02f, +1.228427064e-02f, -4.587476777e-02f, -2.599214438e-02f, +4.043014041e-02f, +3.737590755e-02f, -2.977997158e-02f, -4.388136626e-02f, +1.632767096e-02f, +4.429289154e-02f, -3.107383555e-03f, -3.907557994e-02f, -7.205890758e-03f, +3.010157218e-02f, +1.308769786e-02f, -1.990588871e-02f, -1.446476562e-02f, +1.080552502e-02f, +1.246464298e-02f, -4.238983945e-03f, -8.791962461e-03f, +5.443651615e-04f, +5.039172428e-03f, +8.242170293e-04f, -2.213237867e-03f, -8.260402690e-04f, +4.448682911e-04f, +3.434619147e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.406420377e-05f, +1.684094428e-05f, +6.803068410e-05f, -1.905396874e-05f, -1.652370684e-04f, -1.958453755e-05f, +3.079260246e-04f, +1.382115211e-04f, -4.689069142e-04f, -3.685838193e-04f, +5.938508359e-04f, +7.157979128e-04f, -6.131939395e-04f, -1.143679789e-03f, +4.658896441e-04f, +1.574117035e-03f, -1.267962571e-04f, -1.904464776e-03f, -3.743113350e-04f, +2.039037101e-03f, +9.523441555e-04f, -1.923236358e-03f, -1.488115258e-03f, +1.566117607e-03f, +1.864590837e-03f, -1.041057354e-03f, -2.004363224e-03f, +4.632434352e-04f, +1.893409753e-03f, +4.731265204e-05f, -1.581950044e-03f, -4.024690279e-04f, +1.163096477e-03f, +5.683155438e-04f, -7.392016120e-04f, -5.661327428e-04f, +3.900153209e-04f, +4.544203565e-04f, -1.543537211e-04f, -3.019049137e-04f, +2.971502298e-05f, +1.635221805e-04f, +1.387192530e-05f, -6.784120230e-05f, -1.543353210e-05f, +1.433918995e-05f, +0.000000000e+00f,\n    /*  7,16 (48) */\n    +0.000000000e+00f, -3.578011047e-04f, -4.294347590e-04f, +6.847133596e-04f, +1.458463645e-03f, -5.189960380e-04f, -3.154787691e-03f, -9.262146746e-04f, +4.975450413e-03f, +4.408115492e-03f, -5.623909592e-03f, -1.014751411e-02f, +3.144484510e-03f, +1.729006277e-02f, +4.695015951e-03f, -2.352428499e-02f, -1.998113140e-02f, +2.482300421e-02f, +4.492864887e-02f, -1.430621323e-02f, -8.567920983e-02f, -2.743264414e-02f, +1.891407419e-01f, +3.964021687e-01f, +3.964021687e-01f, +1.891407419e-01f, -2.743264414e-02f, -8.567920983e-02f, -1.430621323e-02f, +4.492864887e-02f, +2.482300421e-02f, -1.998113140e-02f, -2.352428499e-02f, +4.695015951e-03f, +1.729006277e-02f, +3.144484510e-03f, -1.014751411e-02f, -5.623909592e-03f, +4.408115492e-03f, +4.975450413e-03f, -9.262146746e-04f, -3.154787691e-03f, -5.189960380e-04f, +1.458463645e-03f, +6.847133596e-04f, -4.294347590e-04f, -3.578011047e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.433918995e-05f, -1.543353210e-05f, -4.495812173e-05f, +1.140163254e-05f, +9.906857111e-05f, +3.203317336e-05f, -1.626075341e-04f, -1.438699263e-04f, +1.945177063e-04f, +3.385207585e-04f, -1.263895881e-04f, -5.939667389e-04f, -1.259322736e-04f, +8.320506221e-04f, +6.428721674e-04f, -9.016766817e-04f, -1.488277057e-03f, +5.356695997e-04f, +2.735856267e-03f, +9.224025289e-04f, -4.615285763e-03f, -7.857413890e-03f, -4.029956851e-03f, +3.808311390e-03f, +7.851712756e-03f, +4.789343739e-03f, -7.852915229e-04f, -2.755844657e-03f, -6.252170128e-04f, +1.463718330e-03f, +9.498988544e-04f, -6.083581318e-04f, -8.513539892e-04f, +9.597900412e-05f, +5.961784772e-04f, +1.468077623e-04f, -3.330677657e-04f, -2.056865565e-04f, +1.369328962e-04f, +1.672065776e-04f, -2.664332890e-05f, -1.001404985e-04f, -1.453892518e-05f, +4.476854836e-05f, +1.684094428e-05f, -1.406420377e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.578011047e-04f, +4.294347590e-04f, -8.938814713e-04f, -2.199365942e-03f, +9.877392098e-04f, +5.068887451e-03f, +2.424602479e-04f, -8.946316183e-03f, -3.784563588e-03f, +1.285465830e-02f, +1.023939227e-02f, -1.520396723e-02f, -1.933757317e-02f, +1.425079434e-02f, +2.969910316e-02f, -8.787840802e-03f, -3.902826729e-02f, -1.213973801e-03f, +4.475613498e-02f, +1.432330774e-02f, -4.492242362e-02f, -2.791538074e-02f, +3.894202515e-02f, +3.894202515e-02f, -2.791538074e-02f, -4.492242362e-02f, +1.432330774e-02f, +4.475613498e-02f, -1.213973801e-03f, -3.902826729e-02f, -8.787840802e-03f, +2.969910316e-02f, +1.425079434e-02f, -1.933757317e-02f, -1.520396723e-02f, +1.023939227e-02f, +1.285465830e-02f, -3.784563588e-03f, -8.946316183e-03f, +2.424602479e-04f, +5.068887451e-03f, +9.877392098e-04f, -2.199365942e-03f, -8.938814713e-04f, +4.294347590e-04f, +3.578011047e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.433918995e-05f, +1.543353210e-05f, +6.784120230e-05f, -1.387192530e-05f, -1.635221805e-04f, -2.971502298e-05f, +3.019049137e-04f, +1.543537211e-04f, -4.544203565e-04f, -3.900153209e-04f, +5.661327428e-04f, +7.392016120e-04f, -5.683155438e-04f, -1.163096477e-03f, +4.024690279e-04f, +1.581950044e-03f, -4.731265204e-05f, -1.893409753e-03f, -4.632434352e-04f, +2.004363224e-03f, +1.041057354e-03f, -1.864590837e-03f, -1.566117607e-03f, +1.488115258e-03f, +1.923236358e-03f, -9.523441555e-04f, -2.039037101e-03f, +3.743113350e-04f, +1.904464776e-03f, +1.267962571e-04f, -1.574117035e-03f, -4.658896441e-04f, +1.143679789e-03f, +6.131939395e-04f, -7.157979128e-04f, -5.938508359e-04f, +3.685838193e-04f, +4.689069142e-04f, -1.382115211e-04f, -3.079260246e-04f, +1.958453755e-05f, +1.652370684e-04f, +1.905396874e-05f, -6.803068410e-05f, -1.684094428e-05f, +1.406420377e-05f, +0.000000000e+00f,\n    /*  7,17 (48) */\n    +0.000000000e+00f, -3.434619147e-04f, -4.448682911e-04f, +6.397552379e-04f, +1.469865278e-03f, -4.199274669e-04f, -3.122754517e-03f, -1.088822209e-03f, +4.831580487e-03f, +4.602633198e-03f, -5.285388833e-03f, -1.027390369e-02f, +2.550517771e-03f, +1.716413050e-02f, +5.527066573e-03f, -2.288141282e-02f, -2.088280808e-02f, +2.333472715e-02f, +4.546431847e-02f, -1.157035696e-02f, -8.475680730e-02f, -3.204792990e-02f, +1.812833280e-01f, +3.923722119e-01f, +4.002104801e-01f, +1.969924546e-01f, -2.264330040e-02f, -8.646450135e-02f, -1.706205789e-02f, +4.430343186e-02f, +2.628672254e-02f, -1.903123255e-02f, -2.413264312e-02f, +3.843661962e-03f, +1.738604177e-02f, +3.740662988e-03f, -1.000070634e-02f, -5.956977357e-03f, +4.202428935e-03f, +5.112383309e-03f, -7.590080970e-04f, -3.181431020e-03f, -6.191365365e-04f, +1.443924720e-03f, +7.294819080e-04f, -4.125938147e-04f, -3.718653085e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.456956252e-05f, -1.403259622e-05f, -4.504993268e-05f, +8.311142389e-06f, +9.782547217e-05f, +3.726276731e-05f, -1.577800351e-04f, -1.504279191e-04f, +1.831559283e-04f, +3.432731465e-04f, -1.060185066e-04f, -5.907029444e-04f, -1.552725920e-04f, +8.114924139e-04f, +6.757949444e-04f, -8.524738878e-04f, -1.509873614e-03f, +4.464969546e-04f, +2.711517747e-03f, +1.055293283e-03f, -4.438882863e-03f, -7.855439529e-03f, -4.247212811e-03f, +3.582512362e-03f, +7.838293220e-03f, +4.960817383e-03f, -6.440879846e-04f, -2.771380576e-03f, -7.149906656e-04f, +1.436200809e-03f, +9.970414821e-04f, -5.722950666e-04f, -8.693513573e-04f, +6.546002915e-05f, +5.973201982e-04f, +1.672355058e-04f, -3.269144798e-04f, -2.166383362e-04f, +1.296241714e-04f, +1.715643282e-04f, -2.110101439e-05f, -1.010356992e-04f, -1.771747005e-05f, +4.447928178e-05f, +1.825172823e-05f, -1.374395910e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.434619147e-04f, +4.448682911e-04f, -8.260402690e-04f, -2.213237867e-03f, +8.242170293e-04f, +5.039172428e-03f, +5.443651615e-04f, -8.791962461e-03f, -4.238983945e-03f, +1.246464298e-02f, +1.080552502e-02f, -1.446476562e-02f, -1.990588871e-02f, +1.308769786e-02f, +3.010157218e-02f, -7.205890758e-03f, -3.907557994e-02f, -3.107383555e-03f, +4.429289154e-02f, +1.632767096e-02f, -4.388136626e-02f, -2.977997158e-02f, +3.737590755e-02f, +4.043014041e-02f, -2.599214438e-02f, -4.587476777e-02f, +1.228427064e-02f, +4.513044631e-02f, +6.904909747e-04f, -3.890147103e-02f, -1.036195784e-02f, +2.923321351e-02f, +1.539447413e-02f, -1.872437923e-02f, -1.591976515e-02f, +9.645541439e-03f, +1.322324212e-02f, -3.315656674e-03f, -9.084527704e-03f, -6.546577670e-05f, +5.088471988e-03f, +1.152976278e-03f, -2.180311973e-03f, -9.619121554e-04f, +4.125938147e-04f, +3.718653085e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.456956252e-05f, +1.403259622e-05f, +6.749881676e-05f, -8.793007373e-06f, -1.614885928e-04f, -3.957983714e-05f, +2.953495630e-04f, +1.699142545e-04f, -4.391905107e-04f, -4.103599397e-04f, +5.375617856e-04f, +7.608363226e-04f, -5.226814836e-04f, -1.179963238e-03f, +3.386805202e-04f, +1.586492380e-03f, +3.184020880e-05f, -1.878532204e-03f, -5.509031291e-04f, +1.965692091e-03f, +1.127464817e-03f, -1.802207023e-03f, -1.640887595e-03f, +1.407040669e-03f, +1.978017705e-03f, -8.615044673e-04f, -2.069630568e-03f, +2.842869735e-04f, +1.911657141e-03f, +2.064466181e-04f, -1.562989149e-03f, -5.288067630e-04f, +1.121733156e-03f, +6.572149221e-04f, -6.906566020e-04f, -6.206470836e-04f, +3.460975324e-04f, +4.826081954e-04f, -1.215137638e-04f, -3.133900864e-04f, +9.205994243e-06f, +1.666221717e-04f, +2.432935045e-05f, -6.806228152e-05f, -1.825172823e-05f, +1.374395910e-05f, +0.000000000e+00f,\n    /*  7,18 (48) */\n    +0.000000000e+00f, -3.288923522e-04f, -4.589008873e-04f, +5.947053052e-04f, +1.478176420e-03f, -3.221019947e-04f, -3.085491750e-03f, -1.246602244e-03f, +4.681152568e-03f, +4.785789126e-03f, -4.942115687e-03f, -1.037992220e-02f, +1.959814827e-03f, +1.700885791e-02f, +6.338558987e-03f, -2.220561788e-02f, -2.173528197e-02f, +2.182485354e-02f, +4.591081542e-02f, -8.858839214e-03f, -8.370151401e-02f, -3.648681276e-02f, +1.734278885e-01f, +3.881249991e-01f, +4.037929925e-01f, +2.048307479e-01f, -1.768248302e-02f, -8.710858933e-02f, -1.983343846e-02f, +4.358844119e-02f, +2.772292335e-02f, -1.803419106e-02f, -2.470493819e-02f, +2.974310605e-03f, +1.745150180e-02f, +4.337983186e-03f, -9.833470837e-03f, -6.283891837e-03f, +3.985790599e-03f, +5.242007481e-03f, -5.874437687e-04f, -3.202532034e-03f, -7.201722357e-04f, +1.426207250e-03f, +7.739611898e-04f, -3.943420865e-04f, -3.856092675e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.475606133e-05f, -1.264115220e-05f, -4.504608258e-05f, +5.272795322e-06f, +9.641700079e-05f, +4.232478271e-05f, -1.527371547e-04f, -1.566003717e-04f, +1.716253821e-04f, +3.473259368e-04f, -8.573145784e-05f, -5.864067609e-04f, -1.839544194e-04f, +7.897321568e-04f, +7.070875820e-04f, -8.023898903e-04f, -1.528509729e-03f, +3.578450253e-04f, +2.682936699e-03f, +1.183843295e-03f, -4.260375659e-03f, -7.845842068e-03f, -4.459849164e-03f, +3.352801220e-03f, +7.817121964e-03f, +5.129468842e-03f, -4.989267366e-04f, -2.782367157e-03f, -8.048396605e-04f, +1.405733032e-03f, +1.043006315e-03f, -5.347285126e-04f, -8.859933155e-04f, +3.442423318e-05f, +5.973757021e-04f, +1.876347751e-04f, -3.200625479e-04f, -2.273489669e-04f, +1.219519320e-04f, +1.756682150e-04f, -1.541445451e-05f, -1.017488775e-04f, -2.093151518e-05f, +4.408856978e-05f, +1.966269580e-05f, -1.337790988e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.288923522e-04f, +4.589008873e-04f, -7.585414522e-04f, -2.222030875e-03f, +6.627284365e-04f, +4.999592591e-03f, +8.397147245e-04f, -8.622048207e-03f, -4.678174456e-03f, +1.205428304e-02f, +1.134308680e-02f, -1.370392930e-02f, -2.042857020e-02f, +1.190773462e-02f, +3.044025270e-02f, -5.619398378e-03f, -3.904373973e-02f, -4.985915759e-03f, +4.374198841e-02f, +1.829336305e-02f, -4.275390145e-02f, -3.158217860e-02f, +3.573501995e-02f, +4.183718108e-02f, -2.401412668e-02f, -4.673627224e-02f, +1.021464007e-02f, +4.541473329e-02f, +2.602148116e-03f, -3.869502441e-02f, -1.192494699e-02f, +2.870440675e-02f, +1.651620728e-02f, -1.806716431e-02f, -1.661042175e-02f, +9.024894355e-03f, +1.356933965e-02f, -2.833048479e-03f, -9.206041467e-03f, -3.788558631e-04f, +5.097677983e-03f, +1.319598450e-03f, -2.155982623e-03f, -1.029974437e-03f, +3.943420865e-04f, +3.856092675e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.475606133e-05f, +1.264115220e-05f, +6.700876330e-05f, -3.826522264e-06f, -1.591478992e-04f, -4.916230295e-05f, +2.882835876e-04f, +1.848686923e-04f, -4.232604045e-04f, -4.295883275e-04f, +5.082080004e-04f, +7.806747605e-04f, -4.763941934e-04f, -1.194265648e-03f, +2.746595442e-04f, +1.587755150e-03f, +1.104998981e-04f, -1.859880104e-03f, -6.371135868e-04f, +1.923114997e-03f, +1.211392477e-03f, -1.736218473e-03f, -1.712271930e-03f, +1.323060455e-03f, +2.028816945e-03f, -7.687223488e-04f, -2.096068812e-03f, +1.933534389e-04f, +1.914954680e-03f, +2.860985280e-04f, -1.548569136e-03f, -5.910848864e-04f, +1.097282124e-03f, +7.002776567e-04f, -6.638131218e-04f, -6.464537228e-04f, +3.225912690e-04f, +4.954833594e-04f, -1.042882057e-04f, -3.182751618e-04f, -1.402081619e-06f, +1.676669522e-04f, +2.968781694e-05f, -6.793128886e-05f, -1.966269580e-05f, +1.337790988e-05f, +0.000000000e+00f,\n    /*  7,19 (48) */\n    +0.000000000e+00f, -3.141362909e-04f, -4.715420395e-04f, +5.496592227e-04f, +1.483449215e-03f, -2.256849939e-04f, -3.043166967e-03f, -1.399339399e-03f, +4.524552196e-03f, +4.957414508e-03f, -4.594789750e-03f, -1.046565366e-02f, +1.373408066e-03f, +1.682490349e-02f, +7.128291144e-03f, -2.149853030e-02f, -2.253767186e-02f, +2.029634381e-02f, +4.626866045e-02f, -6.175902515e-03f, -8.251767072e-02f, -4.074718842e-02f, +1.655820464e-01f, +3.836651499e-01f, +4.071457937e-01f, +2.126478698e-01f, -1.255301417e-02f, -8.760751607e-02f, -2.261580562e-02f, +4.278360153e-02f, +2.912865638e-02f, -1.699118475e-02f, -2.523966670e-02f, +2.088317289e-03f, +1.748592604e-02f, +4.935358888e-03f, -9.645836062e-03f, -6.603954385e-03f, +3.758441632e-03f, +5.363959413e-03f, -4.117755537e-04f, -3.217946489e-03f, -8.219211132e-04f, +1.405275735e-03f, +8.180497596e-04f, -3.746793907e-04f, -3.989871774e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.489951724e-05f, -1.126212154e-05f, -4.494883537e-05f, +2.291714961e-06f, +9.484918346e-05f, +4.721235117e-05f, -1.474921745e-04f, -1.623816207e-04f, +1.599501977e-04f, +3.506814349e-04f, -6.556473697e-05f, -5.810995041e-04f, -2.119339833e-04f, +7.668241626e-04f, +7.367145768e-04f, -7.515244226e-04f, -1.544192172e-03f, +2.698569752e-04f, +2.650225773e-03f, +1.307939416e-03f, -4.080005638e-03f, -7.828683285e-03f, -4.667641934e-03f, +3.119424623e-03f, +7.788175333e-03f, +5.295062159e-03f, -3.499495666e-04f, -2.788713209e-03f, -8.946109473e-04f, +1.372328744e-03f, +1.087695956e-03f, -4.957072808e-04f, -9.012323114e-04f, +2.922069502e-06f, +5.963306029e-04f, +2.079670723e-04f, -3.125149683e-04f, -2.377944815e-04f, +1.139251923e-04f, +1.795059626e-04f, -9.592308909e-06f, -1.022750137e-04f, -2.417511538e-05f, +4.359484627e-05f, +2.107058095e-05f, -1.296561261e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.141362909e-04f, +4.715420395e-04f, -6.915326889e-04f, -2.225857397e-03f, +5.035805373e-04f, +4.950430288e-03f, +1.127998312e-03f, -8.437179515e-03f, -5.101434860e-03f, +1.162469471e-02f, +1.185129480e-02f, -1.292325454e-02f, -2.090496439e-02f, +1.071346897e-02f, +3.071491225e-02f, -4.031643228e-03f, -3.893323983e-02f, -6.845795863e-03f, +4.310487483e-02f, +2.021647805e-02f, -4.154250897e-02f, -3.331839707e-02f, +3.402274802e-02f, +4.316024154e-02f, -2.198530973e-02f, -4.750499459e-02f, +8.118571258e-03f, +4.560808673e-02f, +4.517102796e-03f, -3.840892588e-02f, -1.347351612e-02f, +2.811332186e-02f, +1.761348941e-02f, -1.736688665e-02f, -1.727423487e-02f, +8.378440632e-03f, +1.389193092e-02f, -2.337565119e-03f, -9.310329673e-03f, -6.971310248e-04f, +5.096275901e-03f, +1.487265402e-03f, -2.126294806e-03f, -1.097905726e-03f, +3.746793907e-04f, +3.989871774e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.489951724e-05f, +1.126212154e-05f, +6.637651307e-05f, +1.018715016e-06f, -1.565121654e-04f, -5.844670138e-05f, +2.807313413e-04f, +1.991943163e-04f, -4.066739952e-04f, -4.476739156e-04f, +4.781423133e-04f, +7.986937526e-04f, -4.295565671e-04f, -1.205994828e-03f, +2.105410514e-04f, +1.585756300e-03f, +1.885058871e-04f, -1.837509136e-03f, -7.217016570e-04f, +1.876731160e-03f, +1.292671811e-03f, -1.666766124e-03f, -1.780124475e-03f, +1.236347376e-03f, +2.075524354e-03f, -6.741862898e-04f, -2.118285537e-03f, +1.016963831e-04f, +1.914333292e-03f, +3.655859086e-04f, -1.530866736e-03f, -6.525889165e-04f, +1.070357785e-03f, +7.422824492e-04f, -6.353069426e-04f, -6.712043721e-04f, +2.981025057e-04f, +5.074928212e-04f, -8.656421125e-05f, -3.225602511e-04f, -1.222027980e-05f, +1.683614557e-04f, +3.511866381e-05f, -6.763329471e-05f, -2.107058095e-05f, +1.296561261e-05f, +0.000000000e+00f,\n    /*  7,20 (48) */\n    +0.000000000e+00f, -2.992367736e-04f, -4.828041611e-04f, +5.047103873e-04f, +1.485740930e-03f, -1.308358105e-04f, -2.995954616e-03f, -1.546831573e-03f, +4.362170575e-03f, +5.117364706e-03f, -4.244108315e-03f, -1.053121839e-02f, +7.923085621e-04f, +1.661296950e-02f, +7.895115306e-03f, -2.076181572e-02f, -2.328919628e-02f, +1.875215164e-02f, +4.653851743e-02f, -3.525676742e-03f, -8.120973130e-02f, -4.482719406e-02f, +1.577533631e-01f, +3.789975080e-01f, +4.102652183e-01f, +2.204360452e-01f, -7.257952015e-03f, -8.795746564e-02f, -2.540451883e-02f, +4.188899058e-02f, +3.050098512e-02f, -1.590348879e-02f, -2.573537398e-02f, +1.187084978e-03f, +1.748884811e-02f, +5.531689491e-03f, -9.437868990e-03f, -6.916469353e-03f, +3.520647150e-03f, +5.477884605e-03f, -2.322695911e-04f, -3.227538798e-03f, -9.241961269e-04f, +1.381100619e-03f, +8.616446058e-04f, -3.536088098e-04f, -4.119527900e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.500084795e-05f, -9.898326944e-06f, -4.476060912e-05f, -6.271988012e-07f, +9.312825770e-05f, +5.191907005e-05f, -1.420585538e-04f, -1.677668407e-04f, +1.481544296e-04f, +3.533432234e-04f, -4.555393470e-05f, -5.748040784e-04f, -2.391693380e-04f, +7.428241466e-04f, +7.646438261e-04f, -6.999773566e-04f, -1.556932685e-03f, +1.826729847e-04f, +2.613502441e-03f, +1.427475945e-03f, -3.898014814e-03f, -7.804034221e-03f, -4.870373568e-03f, +2.882634107e-03f, +7.751439409e-03f, +5.457363617e-03f, -1.973050787e-04f, -2.790333414e-03f, -9.841495448e-04f, +1.336006934e-03f, +1.131014046e-03f, -4.552834036e-04f, -9.150227597e-04f, -2.899451371e-05f, +5.941723784e-04f, +2.281935112e-04f, -3.042761023e-04f, -2.479510728e-04f, +1.055537955e-04f, +1.830656208e-04f, -3.643661803e-06f, -1.026093788e-04f, -2.744214133e-05f, +4.299673875e-05f, +2.247204570e-05f, -1.250672977e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.992367736e-04f, +4.828041611e-04f, -6.251561758e-04f, -2.224838682e-03f, +3.470683719e-04f, +4.891983586e-03f, +1.408729653e-03f, -8.237985198e-03f, -5.508108855e-03f, +1.117702080e-02f, +1.232943712e-02f, -1.212456078e-02f, -2.133452096e-02f, +9.507474147e-03f, +3.092545330e-02f, -2.445886927e-03f, -3.874473394e-02f, -8.683305000e-03f, +4.238317317e-02f, +2.209320921e-02f, -4.024983716e-02f, -3.498516320e-02f, +3.224262355e-02f, +4.439658891e-02f, -1.990978538e-02f, -4.817918088e-02f, +6.000285721e-03f, +4.570978311e-02f, +6.431436087e-03f, -3.804333997e-02f, -1.500438286e-02f, +2.746073294e-02f, +1.868384719e-02f, -1.662460420e-02f, -1.790954181e-02f, +7.707236260e-03f, +1.419003343e-02f, -1.830072298e-03f, -9.396893884e-03f, -1.019691276e-03f, +5.084055621e-03f, +1.655626858e-03f, -2.091176142e-03f, -1.165539020e-03f, +3.536088098e-04f, +4.119527900e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.500084795e-05f, +9.898326944e-06f, +6.560775245e-05f, +5.734392500e-06f, -1.535938897e-04f, -6.741829055e-05f, +2.727178485e-04f, +2.128701444e-04f, -3.894760597e-04f, -4.645929399e-04f, +4.474363760e-04f, +8.148742466e-04f, -3.822717313e-04f, -1.215147420e-03f, +1.464592362e-04f, +1.580520533e-03f, +2.656998777e-04f, -1.811482537e-03f, -8.044982205e-04f, +1.826647489e-03f, +1.371140182e-03f, -1.593997990e-03f, -1.844306549e-03f, +1.147079970e-03f, +2.118038660e-03f, -5.780888186e-04f, -2.136223136e-03f, +9.503635785e-06f, +1.909777027e-03f, +4.447421613e-04f, -1.509898702e-03f, -7.131844500e-04f, +1.040996755e-03f, +7.831309738e-04f, -6.051815166e-04f, -6.948341928e-04f, +2.726713359e-04f, +5.185983570e-04f, -6.837271040e-05f, -3.262253562e-04f, -2.322833477e-05f, +1.686963471e-04f, +4.061075246e-05f, -6.716420108e-05f, -2.247204570e-05f, +1.250672977e-05f, +0.000000000e+00f,\n    /*  7,21 (48) */\n    +0.000000000e+00f, -2.842359257e-04f, -4.927024880e-04f, +4.599497782e-04f, +1.485113732e-03f, -3.770755277e-05f, -2.944035546e-03f, -1.688890127e-03f, +4.194403735e-03f, +5.265519135e-03f, -3.890765092e-03f, -1.057677233e-02f, +2.175044837e-04f, +1.637380016e-02f, +8.637939453e-03f, -1.999717189e-02f, -2.398917364e-02f, +1.719521895e-02f, +4.672119041e-02f, -9.121743007e-04f, -7.978225536e-02f, -4.872520888e-02f, +1.499493289e-01f, +3.741271344e-01f, +4.131478524e-01f, +2.281874846e-01f, -1.800588398e-03f, -8.815477071e-02f, -2.819485224e-02f, +4.090484104e-02f, +3.183699206e-02f, -1.477247475e-02f, -2.619065739e-02f, +2.720622181e-04f, +1.745985359e-02f, +6.125861869e-03f, -9.209675479e-03f, -7.220745456e-03f, +3.272696078e-03f, +5.583438400e-03f, -4.920397027e-05f, -3.231182459e-03f, -1.026805506e-03f, +1.353658478e-03f, +9.046413446e-04f, -3.311367641e-04f, -4.244595198e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.506105373e-05f, -8.552487914e-06f, -4.448396762e-05f, -3.479275925e-06f, +9.126065537e-05f, +5.643900752e-05f, -1.364499007e-04f, -1.727520416e-04f, +1.362620122e-04f, +3.553161379e-04f, -2.573387983e-05f, -5.675449142e-04f, -2.656204183e-04f, +7.177891105e-04f, +7.908466446e-04f, -6.478485272e-04f, -1.566747901e-03f, +9.643006054e-05f, +2.572888771e-03f, +1.542354717e-03f, -3.714645386e-03f, -7.771975044e-03f, -5.067833211e-03f, +2.642685756e-03f, +7.706910059e-03f, +5.616142078e-03f, -4.114853267e-05f, -2.787148517e-03f, -1.073298769e-03f, +1.296791870e-03f, +1.172865439e-03f, -4.135120799e-04f, -9.273211492e-04f, -6.127215102e-05f, +5.908904165e-04f, +2.482748867e-04f, -2.953516851e-04f, -2.577951417e-04f, +9.684840658e-05f, +1.863355934e-04f, +2.421989333e-06f, -1.027475501e-04f, -3.072628925e-05f, +4.229307530e-05f, +2.386368643e-05f, -1.200103319e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.842359257e-04f, +4.927024880e-04f, -5.595484234e-04f, -2.219104290e-03f, +1.934744823e-04f, +4.824565296e-03f, +1.681447502e-03f, -8.025115054e-03f, -5.897584915e-03f, +1.071242786e-02f, +1.277687349e-02f, -1.130968654e-02f, -2.171679269e-02f, +8.292326727e-03f, +3.107191253e-02f, -8.653663943e-04f, -3.847903407e-02f, -1.049478754e-02f, +4.157867495e-02f, +2.391985670e-02f, -3.887869698e-02f, -3.657916119e-02f, +3.039831700e-02f, +4.554366888e-02f, -1.779174672e-02f, -4.875726970e-02f, +3.864062585e-03f, +4.571928674e-02f, +8.341213115e-03f, -3.759859781e-02f, -1.651428156e-02f, +2.674754850e-02f, +1.972484395e-02f, -1.584147323e-02f, -1.851472333e-02f, +7.012402067e-03f, +1.446270476e-02f, -1.311473941e-03f, -9.465266595e-03f, -1.345916632e-03f, +5.060827286e-03f, +1.824323205e-03f, -2.050565390e-03f, -1.232703222e-03f, +3.311367641e-04f, +4.244595198e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.506105373e-05f, +8.552487914e-06f, +6.470836289e-05f, +1.031271056e-05f, -1.504059649e-04f, -7.606332210e-05f, +2.642687365e-04f, +2.258769512e-04f, -3.717120835e-04f, -4.803244579e-04f, +4.161624012e-04f, +8.292013105e-04f, -3.346428214e-04f, -1.221725550e-03f, +8.254725443e-05f, +1.572079214e-03f, +3.419261273e-04f, -1.781870932e-03f, -8.853385352e-04f, +1.772978338e-03f, +1.446641169e-03f, -1.518068837e-03f, -1.904687222e-03f, +1.055442178e-03f, +2.156267264e-03f, -4.806261020e-04f, -2.149832828e-03f, -8.303518807e-05f, +1.901278162e-03f, +5.234005202e-04f, -1.485688805e-03f, -7.727380717e-04f, +1.009241144e-03f, +8.227264984e-04f, -5.734842225e-04f, -7.172800494e-04f, +2.463404129e-04f, +5.287632087e-04f, -4.974615180e-05f, -3.292515434e-04f, -3.440515789e-05f, +1.686629464e-04f, +4.615252836e-05f, -6.652024205e-05f, -2.386368643e-05f, +1.200103319e-05f, +0.000000000e+00f,\n    /*  7,22 (48) */\n    +0.000000000e+00f, -2.691748720e-04f, -5.012549759e-04f, +4.154658105e-04f, +1.481634456e-03f, +5.355310260e-05f, -2.887596539e-03f, -1.825340028e-03f, +4.021651693e-03f, +5.401781148e-03f, -3.535448954e-03f, -1.060250621e-02f, -3.500404306e-04f, +1.610817975e-02f, +9.355728563e-03f, -1.920632525e-02f, -2.463702217e-02f, +1.562847105e-02f, +4.681762047e-02f, +1.660714471e-03f, -7.823990064e-02f, -5.243985426e-02f, +1.421773538e-01f, +3.690593012e-01f, +4.157905382e-01f, +2.358943946e-01f, +3.815553680e-03f, -8.819591925e-02f, -3.098200076e-02f, +3.983154227e-02f, +3.313378393e-02f, -1.359960931e-02f, -2.660416947e-02f, -6.552589311e-04f, +1.739858144e-02f, +6.716752286e-03f, -8.961400592e-03f, -7.516097141e-03f, +3.014900936e-03f, +5.680286807e-03f, +1.371316231e-04f, -3.228760470e-03f, -1.129553056e-03f, +1.322932189e-03f, +9.469344199e-04f, -3.072730776e-04f, -4.364605530e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.508121306e-05f, -7.227216627e-06f, -4.412161161e-05f, -6.260081759e-06f, +8.925298590e-05f, +6.076670666e-05f, -1.306799422e-04f, -1.773340635e-04f, +1.242967150e-04f, +3.566062405e-04f, -6.138583950e-06f, -5.593479040e-04f, -2.912490903e-04f, +6.917772238e-04f, +8.152977755e-04f, -5.952375593e-04f, -1.573659262e-03f, +1.126185069e-05f, +2.528511193e-03f, +1.652485180e-03f, -3.530139394e-03f, -7.732594905e-03f, -5.259816984e-03f, +2.399839862e-03f, +7.654592979e-03f, +5.771169318e-03f, +1.183583270e-04f, -2.779085504e-03f, -1.161900464e-03f, +1.254713117e-03f, +1.213156387e-03f, -3.704516143e-04f, -9.380861467e-04f, -9.385614083e-05f, +5.864760599e-04f, +2.681717440e-04f, -2.857488329e-04f, -2.673033459e-04f, +8.782050396e-05f, +1.893046668e-04f, +8.594746194e-06f, -1.026854258e-04f, -3.402109109e-05f, +4.148289141e-05f, +2.524204041e-05f, -1.144840713e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.691748720e-04f, +5.012549759e-04f, -4.948400605e-04f, -2.208791579e-03f, +4.306851739e-05f, +4.748501974e-03f, +1.945716238e-03f, -7.799238103e-03f, -6.269296998e-03f, +1.023210340e-02f, +1.319303589e-02f, -1.048048523e-02f, -2.205143551e-02f, +7.070601177e-03f, +3.115445979e-02f, +7.067128194e-04f, -3.813710794e-02f, -1.227665847e-02f, +4.069333641e-02f, +2.569283504e-02f, -3.743205581e-02f, -3.809723002e-02f, +2.849362978e-02f, +4.659911106e-02f, -1.563547945e-02f, -4.923789580e-02f, +1.714229757e-03f, +4.563625156e-02f, +1.024249128e-02f, -3.707519729e-02f, -1.799997036e-02f, +2.597481042e-02f, +2.073408509e-02f, -1.501874673e-02f, -1.908820755e-02f, +6.295122018e-03f, +1.470904517e-02f, -7.827107325e-04f, -9.515012747e-03f, -1.675168176e-03f, +5.026422129e-03f, +1.992986151e-03f, -2.004412861e-03f, -1.299223464e-03f, +3.072730776e-04f, +4.364605530e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.508121306e-05f, +7.227216627e-06f, +6.368440066e-05f, +1.474638968e-05f, -1.469616392e-04f, -8.436905505e-05f, +2.554101662e-04f, +2.381972856e-04f, -3.534281504e-04f, -4.948503601e-04f, +3.843929989e-04f, +8.416641236e-04f, -2.867727586e-04f, -1.225736781e-03f, +1.893694541e-05f, +1.560470263e-03f, +4.170317670e-04f, -1.748752148e-03f, -9.640625692e-04f, +1.715845240e-03f, +1.519024892e-03f, -1.439139845e-03f, -1.961143586e-03f, +9.616229592e-04f, +2.190126450e-03f, -3.819975348e-04f, -2.159074794e-03f, -1.757290856e-04f, +1.888837242e-03f, +6.013944085e-04f, -1.458267827e-03f, -8.311176495e-04f, +9.751384994e-04f, +8.609741092e-04f, -5.402663004e-04f, -7.384806670e-04f, +2.191548864e-04f, +5.379521862e-04f, -3.071845145e-05f, -3.316210050e-04f, -4.572887222e-05f, +1.682532630e-04f, +5.173204069e-05f, -6.569800200e-05f, -2.524204041e-05f, +1.144840713e-05f, +0.000000000e+00f,\n    /*  7,23 (48) */\n    +0.000000000e+00f, -2.540936589e-04f, -5.084821926e-04f, +3.713441989e-04f, +1.475374374e-03f, +1.428060885e-04f, -2.826829832e-03f, -1.956019970e-03f, +3.844317629e-03f, +5.526077863e-03f, -3.178842713e-03f, -1.060864479e-02f, -9.093883346e-04f, +1.581693066e-02f, +1.004750579e-02f, -1.839102747e-02f, -2.523225973e-02f, +1.405481179e-02f, +4.682888232e-02f, +4.189225664e-03f, -7.658741546e-02f, -5.596999366e-02f, +1.344447589e-01f, +3.637994842e-01f, +4.181903781e-01f, +2.435489876e-01f, +9.586722998e-03f, -8.807756092e-02f, -3.376108626e-02f, +3.866964181e-02f, +3.438849704e-02f, -1.238645292e-02f, -2.697462108e-02f, -1.593345078e-03f, +1.730472530e-02f, +7.303228346e-03f, -8.693228848e-03f, -7.801845974e-03f, +2.747597590e-03f, +5.768107311e-03f, +3.264362900e-04f, -3.220165724e-03f, -1.232238482e-03f, +1.288911098e-03f, +9.884173113e-04f, -2.820310372e-04f, -4.479089601e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.506247809e-05f, -5.925014199e-06f, -4.367637005e-05f, -8.965421965e-06f, +8.711201950e-05f, +6.489718843e-05f, -1.247624957e-04f, -1.815105706e-04f, +1.122820998e-04f, +3.572207922e-04f, +1.319881162e-05f, -5.502403358e-04f, -3.160191976e-04f, +6.648477053e-04f, +8.379753945e-04f, -5.422436965e-04f, -1.577692923e-03f, -7.270153211e-05f, +2.480500260e-03f, +1.757784465e-03f, -3.344738387e-03f, -7.685991774e-03f, -5.446128244e-03f, +2.154360581e-03f, +7.594503719e-03f, +5.922220368e-03f, +2.810474539e-04f, -2.766077777e-03f, -1.249795243e-03f, +1.209805552e-03f, +1.251794720e-03f, -3.261633500e-04f, -9.472786986e-04f, -1.266905299e-04f, +5.809226461e-04f, +2.878444504e-04f, -2.754760482e-04f, -2.764526489e-04f, +7.848236882e-05f, +1.919620389e-04f, +1.486432307e-05f, -1.024192393e-04f, -3.731992528e-05f, +4.056543633e-05f, +2.660359268e-05f, -1.084885119e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.540936589e-04f, +5.084821926e-04f, -4.311556598e-04f, -2.194045189e-03f, -1.038931219e-04f, +4.664132919e-03f, +2.201126405e-03f, -7.561040817e-03f, -6.622725149e-03f, +9.737253038e-03f, +1.357742889e-02f, -9.638821104e-03f, -2.233820827e-02f, +5.844864396e-03f, +3.117339673e-02f, +2.267183082e-03f, -3.772007617e-02f, -1.402541062e-02f, +3.972927384e-02f, +2.740868028e-02f, -3.591303092e-02f, -3.953636987e-02f, +2.653248619e-02f, +4.756073402e-02f, -1.344535300e-02f, -4.961989334e-02f, -4.448450370e-04f, +4.546052247e-02f, +1.213132852e-02f, -3.647380288e-02f, -1.945823819e-02f, +2.514369277e-02f, +2.170922359e-02f, -1.415777262e-02f, -1.962847385e-02f, +5.556641351e-03f, +1.492820006e-02f, -2.447585463e-04f, -9.545731198e-03f, -2.006789181e-03f, +4.980693256e-03f, +2.161239414e-03f, -1.952680821e-03f, -1.364921466e-03f, +2.820310372e-04f, +4.479089601e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.506247809e-05f, +5.925014199e-06f, +6.254207668e-05f, +1.902867683e-05f, -1.432744774e-04f, -9.232376686e-05f, +2.461687640e-04f, +2.498154825e-04f, -3.346708314e-04f, -5.081553750e-04f, +3.522010130e-04f, +8.522559589e-04f, -2.387640299e-04f, -1.227194049e-03f, -4.424144080e-05f, +1.545738034e-03f, +4.908671114e-04f, -1.712211021e-03f, -1.040515324e-03f, +1.655376630e-03f, +1.588148312e-03f, -1.357378262e-03f, -2.013561012e-03f, +8.658158848e-04f, +2.219541565e-03f, -2.824053234e-04f, -2.163918277e-03f, -2.683860678e-04f, +1.872463125e-03f, +6.785577956e-04f, -1.427673533e-03f, -8.881926267e-04f, +9.387417533e-04f, +8.977809330e-04f, -5.055827778e-04f, -7.583767867e-04f, +1.911623324e-04f, +5.461317680e-04f, -1.132493745e-05f, -3.333171188e-04f, -5.717684970e-05f, +1.674600283e-04f, +5.733696346e-05f, -6.469443335e-05f, -2.660359268e-05f, +1.084885119e-05f, +0.000000000e+00f,\n    /*  7,24 (48) */\n    +0.000000000e+00f, -2.390311808e-04f, -5.144072068e-04f, +3.276678289e-04f, +1.466408952e-03f, +2.299181080e-04f, -2.761932644e-03f, -2.080782465e-03f, +3.662807059e-03f, +5.638359962e-03f, -2.821621921e-03f, -1.059544598e-02f, -1.459628670e-03f, +1.550091146e-02f, +1.071235349e-02f, -1.755305208e-02f, -2.577450342e-02f, +1.247711886e-02f, +4.675618079e-02f, +6.669725923e-03f, -7.482963099e-02f, -5.931473204e-02f, +1.267587672e-01f, +3.583533560e-01f, +4.203447386e-01f, +2.511434913e-01f, +1.550894337e-02f, -8.779651347e-02f, -3.652716404e-02f, +3.741984656e-02f, +3.559830260e-02f, -1.113465820e-02f, -2.730078443e-02f, -2.540623776e-03f, +1.717803477e-02f, +7.884150992e-03f, -8.405384397e-03f, -8.077322022e-03f, +2.471144941e-03f, +5.846589680e-03f, +5.183983289e-04f, -3.205301401e-03f, -1.334657721e-03f, +1.251591172e-03f, +1.028982748e-03f, -2.554274445e-04f, -4.587578113e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.500607012e-05f, -4.648267252e-06f, -4.315119110e-05f, -1.159134683e-05f, +8.484467018e-05f, +6.882595364e-05f, -1.187114401e-04f, -1.852800431e-04f, +1.002414783e-04f, +3.571682227e-04f, +3.224608662e-05f, -5.402508255e-04f, -3.398966032e-04f, +6.370607032e-04f, +8.588611084e-04f, -4.889656325e-04f, -1.578879652e-03f, -1.553336802e-04f, +2.428990405e-03f, +1.858177439e-03f, -3.158683085e-03f, -7.632272277e-03f, -5.626577831e-03f, +1.906515583e-03f, +7.526667692e-03f, +6.069073841e-03f, +4.467446921e-04f, -2.748065320e-03f, -1.336822724e-03f, +1.162109368e-03f, +1.288690027e-03f, -2.807115945e-04f, -9.548621291e-04f, -1.597182014e-04f, +5.742255451e-04f, +3.072532678e-04f, -2.645432223e-04f, -2.852203686e-04f, +6.884707305e-05f, +1.942973467e-04f, +2.122006131e-05f, -1.019455730e-04f, -4.061602803e-05f, +3.954017920e-05f, +2.794478312e-05f, -1.020248298e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.390311808e-04f, +5.144072068e-04f, -3.686135832e-04f, -2.175016512e-03f, -2.471675992e-04f, +4.571809152e-03f, +2.447295169e-03f, -7.311225335e-03f, -6.957395980e-03f, +9.229097663e-03f, +1.392962991e-02f, -8.786565145e-03f, -2.257697230e-02f, +4.617670347e-03f, +3.112915529e-02f, +3.812921116e-03f, -3.722920906e-02f, -1.573762164e-02f, +3.868875852e-02f, +2.906405691e-02f, -3.432488260e-02f, -4.089374813e-02f, +2.451892518e-02f, +4.842654990e-02f, -1.122581144e-02f, -4.990229866e-02f, -2.608763314e-03f, +4.519213640e-02f, +1.400379164e-02f, -3.579524509e-02f, -2.088591172e-02f, +2.425550015e-02f, +2.264796534e-02f, -1.325999169e-02f, -2.013405663e-02f, +4.798264564e-03f, +1.511936239e-02f, +3.013732217e-04f, -9.557056136e-03f, -2.340106299e-03f, +4.923516407e-03f, +2.328699442e-03f, -1.895343857e-03f, -1.429615899e-03f, +2.554274445e-04f, +4.587578113e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.500607012e-05f, +4.648267252e-06f, +6.128773634e-05f, +2.315335024e-05f, -1.393583212e-04f, -9.991676201e-05f, +2.365715527e-04f, +2.607176712e-04f, -3.154870750e-04f, -5.202270671e-04f, +3.196593601e-04f, +8.609741559e-04f, -1.907184711e-04f, -1.226115595e-03f, -1.068595109e-04f, +1.527933181e-03f, +5.632859609e-04f, -1.672339179e-03f, -1.114547142e-03f, +1.591707552e-03f, +1.653875520e-03f, -1.272957041e-03f, -2.061833388e-03f, +7.682187358e-04f, +2.244447194e-03f, -1.820540613e-04f, -2.164341675e-03f, -3.608135648e-04f, +1.852172990e-03f, +7.547255546e-04f, -1.393950635e-03f, -9.438343146e-04f, +9.001091448e-04f, +9.330563568e-04f, -4.694923866e-04f, -7.769113186e-04f, +1.624126768e-04f, +5.532701980e-04f, +8.397709338e-06f, -3.343245057e-04f, -6.872575091e-05f, +1.662767285e-04f, +6.295461800e-05f, -6.350687369e-05f, -2.794478312e-05f, +1.020248298e-05f, +0.000000000e+00f,\n    /*  7,25 (48) */\n    +0.000000000e+00f, -2.240251107e-04f, -5.190554740e-04f, +2.845166378e-04f, +1.454817605e-03f, +3.147627782e-04f, -2.693106690e-03f, -2.199493906e-03f, +3.477527016e-03f, +5.738601441e-03f, -2.464453698e-03f, -1.056319989e-02f, -1.999879496e-03f, +1.516101486e-02f, +1.134941420e-02f, -1.669419097e-02f, -2.626346905e-02f, +1.089823921e-02f, +4.660084711e-02f, +9.098716328e-03f, -7.297145356e-02f, -6.247341513e-02f, +1.191264949e-01f, +3.527267781e-01f, +4.222512542e-01f, +2.586701590e-01f, +2.157801721e-02f, -8.734976877e-02f, -3.927522936e-02f, +3.608302384e-02f, +3.676041196e-02f, -9.845968173e-03f, -2.758149602e-02f, -3.495485906e-03f, +1.701831657e-02f, +8.458376537e-03f, -8.098131130e-03f, -8.341865244e-03f, +2.185924572e-03f, +5.915436753e-03f, +7.126956756e-04f, -3.184081339e-03f, -1.436603294e-03f, +1.210975144e-03f, +1.068522927e-03f, -2.274826614e-04f, -4.689602943e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.491327491e-05f, -3.399244831e-06f, -4.254913318e-05f, -1.413415498e-05f, +8.245797894e-05f, +7.254898397e-05f, -1.125406874e-04f, -1.886417687e-04f, +8.819787101e-05f, +3.564580986e-04f, +5.097199019e-05f, -5.294092466e-04f, -3.628492277e-04f, +6.084771756e-04f, +8.779399475e-04f, -4.355013456e-04f, -1.577254726e-03f, -2.365120531e-04f, +2.374119699e-03f, +1.953596747e-03f, -2.972213043e-03f, -7.571551505e-03f, -5.800984315e-03f, +1.656575693e-03f, +7.451120177e-03f, +6.211512263e-03f, +6.152699801e-04f, -2.724994848e-03f, -1.422821778e-03f, +1.111670068e-03f, +1.323753831e-03f, -2.341635411e-04f, -9.608022356e-04f, -1.928809655e-04f, +5.663821937e-04f, +3.263584260e-04f, -2.529616351e-04f, -2.935842267e-04f, +5.892846530e-05f, +1.963006941e-04f, +2.765094472e-05f, -1.012613717e-04f, -4.390250510e-05f, +3.840681472e-05f, +2.926201376e-05f, -9.509540550e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.240251107e-04f, +5.190554740e-04f, -3.073258468e-04f, -2.151863162e-03f, -3.865259204e-04f, +4.471892390e-03f, +2.683866721e-03f, -7.050507664e-03f, -7.272883055e-03f, +8.708870596e-03f, +1.424928927e-02f, -7.925590989e-03f, -2.276769077e-02f, +3.391554752e-03f, +3.102229578e-02f, +5.340854297e-03f, -3.666592310e-02f, -1.740996082e-02f, +3.757421138e-02f, +3.065576446e-02f, -3.267100708e-02f, -4.216670517e-02f, +2.245709179e-02f, +4.919476864e-02f, -8.981364246e-03f, -5.008435272e-02f, -4.773104989e-03f, +4.483132284e-02f, +1.585596463e-02f, -3.504051953e-02f, -2.227986236e-02f, +2.331166583e-02f, +2.354807449e-02f, -1.232693533e-02f, -2.060354902e-02f, +4.021353246e-03f, +1.528177507e-02f, +8.546434197e-04f, -9.548658426e-03f, -2.674430805e-03f, +4.854790656e-03f, +2.494976171e-03f, -1.832389239e-03f, -1.493122773e-03f, +2.274826614e-04f, +4.689602943e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.491327491e-05f, +3.399244831e-06f, +5.992783944e-05f, +2.711472282e-05f, -1.352272513e-04f, -1.071383779e-04f, +2.266458833e-04f, +2.708917795e-04f, -2.959240970e-04f, -5.310558291e-04f, +2.868408691e-04f, +8.678200852e-04f, -1.427370524e-04f, -1.222524883e-03f, -1.687909899e-04f, +1.507112506e-03f, +6.341458936e-04f, -1.629234820e-03f, -1.186014010e-03f, +1.524979356e-03f, +1.716078009e-03f, -1.186054466e-03f, -2.105863338e-03f, +6.690330814e-04f, +2.264787302e-03f, -8.115029959e-05f, -2.160332612e-03f, -4.528188339e-04f, +1.827992339e-03f, +8.297338200e-04f, -1.357150735e-03f, -9.979161819e-04f, +8.593041379e-04f, +9.667122445e-04f, -4.320574712e-04f, -7.940294904e-04f, +1.329581136e-04f, +5.593375809e-04f, +2.841151869e-05f, -3.346290863e-04f, -8.035156716e-05f, +1.646976352e-04f, +6.857199685e-05f, -6.213306230e-05f, -2.926201376e-05f, +9.509540550e-06f, +0.000000000e+00f,\n    /*  7,26 (48) */\n    +0.000000000e+00f, -2.091118358e-04f, -5.224547188e-04f, +2.419675046e-04f, +1.440683450e-03f, +3.972207571e-04f, -2.620557706e-03f, -2.312034593e-03f, +3.288885247e-03f, +5.826799312e-03f, -2.107995600e-03f, -1.051222790e-02f, -2.529288742e-03f, +1.479816563e-02f, +1.195789137e-02f, -1.581625102e-02f, -2.669897040e-02f, +9.320984485e-03f, +4.636433506e-02f, +1.147283603e-02f, -7.101785681e-02f, -6.544562817e-02f, +1.115549434e-01f, +3.469257938e-01f, +4.239078299e-01f, +2.661212792e-01f, +2.778952947e-02f, -8.673449879e-02f, -4.200022421e-02f, +3.466020206e-02f, +3.787208203e-02f, -8.522214343e-03f, -2.781565957e-02f, -4.456288141e-03f, +1.682543560e-02f, +9.024758730e-03f, -7.771772704e-03f, -8.594826879e-03f, +1.892340346e-03f, +5.974365218e-03f, +9.089963697e-04f, -3.156430395e-03f, -1.537864666e-03f, +1.167072639e-03f, +1.106929742e-03f, -1.982206477e-04f, -4.784698349e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.478543797e-05f, -2.180095653e-06f, -4.187335580e-05f, -1.659039649e-05f, +7.995909681e-05f, +7.606274189e-05f, -1.062641544e-04f, -1.915958308e-04f, +7.617396702e-05f, +3.551010896e-04f, +6.934628683e-05f, -5.177466597e-04f, -3.848470823e-04f, +5.791587704e-04f, +8.952003513e-04f, -3.819479360e-04f, -1.572857817e-03f, -3.161181312e-04f, +2.316029593e-03f, +2.043982842e-03f, -2.785566329e-03f, -7.503952826e-03f, -5.969174217e-03f, +1.404814536e-03f, +7.367906298e-03f, +6.349322397e-03f, +7.864375643e-04f, -2.696819961e-03f, -1.507630778e-03f, +1.058538454e-03f, +1.356899769e-03f, -1.865891824e-04f, -9.650673803e-04f, -2.261196541e-04f, +5.573921262e-04f, +3.451201979e-04f, -2.407439523e-04f, -3.015223972e-04f, +4.874115534e-05f, +1.979626789e-04f, +3.414561603e-05f, -1.003639553e-04f, -4.717234406e-05f, +3.716526842e-05f, +3.055165641e-05f, -8.770384584e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.091118358e-04f, +5.224547188e-04f, -2.473980074e-04f, -2.124748439e-03f, -5.217531717e-04f, +4.364754012e-03f, +2.910512605e-03f, -6.779615884e-03f, -7.568807152e-03f, +8.177814767e-03f, +1.453613013e-02f, -7.057770904e-03f, -2.291042782e-02f, +2.169029869e-03f, +3.085350479e-02f, +6.847966803e-03f, -3.603177721e-02f, -1.903919564e-02f, +3.638819737e-02f, +3.218074382e-02f, -3.095492907e-02f, -4.335275964e-02f, +2.035122845e-02f, +4.986380172e-02f, -6.716576944e-03f, -5.016550302e-02f, -6.933437601e-03f, +4.437850400e-02f, +1.768395697e-02f, -3.421078571e-02f, -2.363701309e-02f, +2.231374965e-02f, +2.440737863e-02f, -1.136022309e-02f, -2.103560649e-02f, +3.227323755e-03f, +1.541473318e-02f, +1.413981001e-03f, -9.520246907e-03f, -3.009059891e-03f, +4.774439089e-03f, +2.659673806e-03f, -1.763817242e-03f, -1.555255835e-03f, +1.982206477e-04f, +4.784698349e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.478543797e-05f, +2.180095653e-06f, +5.846894037e-05f, +3.090764417e-05f, -1.308955478e-04f, -1.139799881e-04f, +2.164193667e-04f, +2.803275333e-04f, -2.760292722e-04f, -5.406348675e-04f, +2.538181231e-04f, +8.727991044e-04f, -9.491966892e-05f, -1.216450505e-03f, -2.299119763e-04f, +1.483338804e-03f, +7.033085484e-04f, -1.583002471e-03f, -1.254777836e-03f, +1.455339376e-03f, +1.774634935e-03f, -1.096853765e-03f, -2.145562425e-03f, +5.684638544e-04f, +2.280515365e-03f, +2.009788815e-05f, -2.151887982e-03f, -5.442093688e-04f, +1.799954978e-03f, +9.034203447e-04f, -1.317332257e-03f, -1.050314142e-03f, +8.163953233e-04f, +9.986631499e-04f, -3.933438867e-04f, -8.096789935e-04f, +1.028530154e-04f, +5.643059740e-04f, +4.867729821e-05f, -3.342181337e-04f, -9.202966494e-05f, +1.627178350e-04f, +7.417578898e-05f, -6.057115596e-05f, -3.055165641e-05f, +8.770384584e-06f, +0.000000000e+00f,\n    /*  7,27 (48) */\n    +0.000000000e+00f, -1.943263978e-04f, -5.246348145e-04f, +2.000941488e-04f, +1.424093054e-03f, +4.771798539e-04f, -2.544494964e-03f, -2.418298747e-03f, +3.097289416e-03f, +5.902973279e-03f, -1.752894510e-03f, -1.044288162e-02f, -3.047035402e-03f, +1.441331855e-02f, +1.253705014e-02f, -1.492105067e-02f, -2.708091834e-02f, +7.748126668e-03f, +4.604821692e-02f, +1.378886562e-02f, -6.897387397e-02f, -6.823119450e-02f, +1.040509906e-01f, +3.409566196e-01f, +4.253126445e-01f, +2.734891855e-01f, +3.413885187e-02f, -8.594806123e-02f, -4.469704417e-02f, +3.315257128e-02f, +3.893062048e-02f, -7.165314573e-03f, -2.800224875e-02f, -5.421355521e-03f, +1.659931595e-02f, +9.582150857e-03f, -7.426652506e-03f, -8.835570832e-03f, +1.590817949e-03f, +6.023106374e-03f, +1.106959049e-03f, -3.122284779e-03f, -1.638228621e-03f, +1.119900295e-03f, +1.144095010e-03f, -1.676689913e-04f, -4.872402194e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.462395980e-05f, -9.928457007e-07f, -4.112711044e-05f, -1.895687537e-05f, +7.735526809e-05f, +7.936416972e-05f, -9.989573536e-05f, -1.941430972e-04f, +6.419208530e-05f, +3.531089337e-04f, +8.733979986e-05f, -5.052952394e-04f, -4.058622990e-04f, +5.491677055e-04f, +9.106341493e-04f, -3.284014664e-04f, -1.565732871e-03f, -3.940375622e-04f, +2.254864673e-03f, +2.129284004e-03f, -2.598979196e-03f, -7.429607677e-03f, -6.130982232e-03f, +1.151508169e-03f, +7.277080996e-03f, +6.482295563e-03f, +9.600562222e-04f, -2.663501277e-03f, -1.591087852e-03f, +1.002770603e-03f, +1.388043770e-03f, -1.380612193e-04f, -9.676285787e-04f, -2.593742174e-04f, +5.472570011e-04f, +3.634989747e-04f, -2.279042196e-04f, -3.090135547e-04f, +3.830049673e-05f, +1.992744192e-04f, +4.069239427e-05f, -9.925103113e-05f, -5.041842712e-05f, +3.581570155e-05f, +3.181006045e-05f, -7.985500330e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.943263978e-04f, +5.246348145e-04f, -1.889290670e-04f, -2.093840795e-03f, -6.526487195e-04f, +4.250774024e-03f, +3.126931971e-03f, -6.499288351e-03f, -7.844836425e-03f, +7.637179899e-03f, +1.478994826e-02f, -6.184971799e-03f, -2.300534749e-02f, +9.525793645e-04f, +3.062359282e-02f, +8.331305607e-03f, -3.532846866e-02f, -2.062219811e-02f, +3.513341953e-02f, +3.363608319e-02f, -2.918029414e-02f, -4.444961340e-02f, +1.820566603e-02f, +5.043226558e-02f, -4.436061579e-03f, -5.014540513e-02f, -9.085325584e-03f, +4.383429464e-02f, +1.948391195e-02f, -3.330736537e-02f, -2.495434535e-02f, +2.126343551e-02f, +2.522377395e-02f, -1.036155994e-02f, -2.142895037e-02f, +2.417644762e-03f, +1.551758620e-02f, +1.978286975e-03f, -9.471569609e-03f, -3.343278025e-03f, +4.682409424e-03f, +2.822391641e-03f, -1.689641453e-03f, -1.615826991e-03f, +1.676689913e-04f, +4.872402194e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.462395980e-05f, +9.928457007e-07f, +5.691766838e-05f, +3.452750106e-05f, -1.263776520e-04f, -1.204340034e-04f, +2.059198058e-04f, +2.890164525e-04f, -2.558500265e-04f, -5.489601822e-04f, +2.206633037e-04f, +8.759205059e-04f, -4.736493450e-05f, -1.207926078e-03f, -2.901011902e-04f, +1.456680690e-03f, +7.706398975e-04f, -1.533752739e-03f, -1.320706728e-03f, +1.382940602e-03f, +1.829433348e-03f, -1.005542717e-03f, -2.180851332e-03f, +4.667189164e-04f, +2.291594477e-03f, +1.214813444e-04f, -2.139013986e-03f, -6.347933102e-04f, +1.768102977e-03f, +9.756248546e-04f, -1.274560359e-03f, -1.100906835e-03f, +7.714563107e-04f, +1.028826526e-03f, -3.534208899e-04f, -8.238101248e-04f, +7.215383980e-05f, +5.681494757e-04f, +6.915470437e-05f, -3.330803253e-04f, -1.037348326e-04f, +1.603332576e-04f, +7.975240632e-05f, -5.881974410e-05f, -3.181006045e-05f, +7.985500330e-06f, +0.000000000e+00f,\n    /*  7,28 (48) */\n    +0.000000000e+00f, -1.797024380e-04f, -5.256276602e-04f, +1.589670384e-04f, +1.405136178e-03f, +5.545351220e-04f, -2.465130794e-03f, -2.518194483e-03f, +2.903146319e-03f, +5.967165364e-03f, -1.399785577e-03f, -1.035554182e-02f, -3.552330642e-03f, +1.400745625e-02f, +1.308621785e-02f, -1.401041652e-02f, -2.740931980e-02f, +6.182393798e-03f, +4.565417936e-02f, +1.604373029e-02f, -6.684458996e-02f, -7.083017370e-02f, +9.662138288e-02f, +3.348256374e-01f, +4.264641526e-01f, +2.807662665e-01f, +4.062114743e-02f, -8.498800501e-02f, -4.736054545e-02f, +3.156148343e-02f, +3.993339109e-02f, -5.777270803e-03f, -2.814030997e-02f, -6.388984100e-03f, +1.633994173e-02f, +1.012940786e-02f, -7.063153531e-03f, -9.063475051e-03f, +1.281804394e-03f, +6.061406870e-03f, +1.306233468e-03f, -3.081592384e-03f, -1.737479652e-03f, +1.069481868e-03f, +1.179910712e-03f, -1.358589308e-04f, -4.952257198e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.443029105e-05f, +1.606038524e-07f, -4.031373136e-05f, -2.123065152e-05f, +7.465381357e-05f, +8.245068760e-05f, -9.344927460e-05f, -1.962852063e-04f, +5.227413708e-05f, +3.504943998e-04f, +1.049244523e-04f, -4.920882012e-04f, -4.258691551e-04f, +5.185666495e-04f, +9.242365355e-04f, -2.749568061e-04f, -1.555927983e-03f, -4.701602984e-04f, +2.190772398e-03f, +2.209456350e-03f, -2.412685758e-03f, -7.348655345e-03f, -6.286251430e-03f, +8.969347129e-04f, +7.178708984e-03f, +6.610227950e-03f, +1.135929496e-03f, -2.625006558e-03f, -1.673031134e-03f, +9.444278384e-04f, +1.417104224e-03f, -8.865496331e-05f, -9.684595838e-04f, -2.925838239e-04f, +5.359806252e-04f, +3.814553423e-04f, -2.144578550e-04f, -3.160369234e-04f, +2.762256769e-05f, +2.002275795e-04f, +4.727929308e-05f, -9.792070572e-05f, -5.363354428e-05f, +3.435851553e-05f, +3.303356079e-05f, -7.155499268e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.797024380e-04f, +5.256276602e-04f, -1.320113986e-04f, -2.059313294e-03f, -7.790263715e-04f, +4.130340021e-03f, +3.332851777e-03f, -6.210271898e-03f, -8.100686451e-03f, +7.088219717e-03f, +1.501061156e-02f, -5.309051293e-03f, -2.305271243e-02f, -2.553467138e-04f, +3.033349163e-02f, +9.787986297e-03f, -3.455782876e-02f, -2.215595085e-02f, +3.381271281e-02f, +3.501902379e-02f, -2.735086079e-02f, -4.545515612e-02f, +1.602481470e-02f, +5.089898449e-02f, -2.144467102e-03f, -5.002392379e-02f, -1.122433957e-02f, +4.319950132e-02f, +2.125201493e-02f, -3.233174051e-02f, -2.622890571e-02f, +2.016252867e-02f, +2.599523026e-02f, -9.332733411e-03f, -2.178237126e-02f, +1.593834637e-03f, +1.558974004e-02f, +2.546436450e-03f, -9.402414905e-03f, -3.676358351e-03f, +4.578674591e-03f, +2.982724899e-03f, -1.609889047e-03f, -1.674646735e-03f, +1.358589308e-04f, +4.952257198e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.443029105e-05f, -1.606038524e-07f, +5.528070823e-05f, +3.797021669e-05f, -1.216881284e-04f, -1.264938699e-04f, +1.951751290e-04f, +2.969518419e-04f, -2.354337306e-04f, -5.560305404e-04f, +1.874480376e-04f, +8.771974561e-04f, -1.699807130e-07f, -1.196990134e-03f, -3.492402140e-04f, +1.427212413e-03f, +8.360105083e-04f, -1.481602044e-03f, -1.383675242e-03f, +1.307941340e-03f, +1.880368423e-03f, -9.123132502e-04f, -2.211660024e-03f, +3.640086191e-04f, +2.297997438e-03f, +2.227902696e-04f, -2.121726136e-03f, -7.243798566e-04f, +1.732486615e-03f, +1.046189401e-03f, -1.228906834e-03f, -1.149575910e-03f, +7.245656074e-04f, +1.057122928e-03f, -3.123610207e-04f, -8.363759240e-04f, +4.091902851e-05f, +5.708443107e-04f, +8.980231717e-05f, -3.312057915e-04f, -1.154413295e-04f, +1.575407020e-04f, +8.528801151e-05f, -5.687786299e-05f, -3.303356079e-05f, +7.155499268e-06f, +0.000000000e+00f,\n    /*  7,29 (48) */\n    +0.000000000e+00f, -1.652721470e-04f, -5.254670563e-04f, +1.186533070e-04f, +1.383905527e-03f, +6.291889356e-04f, -2.382680107e-03f, -2.611643757e-03f, +2.706861113e-03f, +6.019439501e-03f, -1.049291177e-03f, -1.025061737e-02f, -4.044418843e-03f, +1.358158709e-02f, +1.360478450e-02f, -1.308617999e-02f, -2.768427661e-02f, +4.626465814e-03f, +4.518401906e-02f, +1.823450269e-02f, -6.463513361e-02f, -7.324285945e-02f, +8.927272753e-02f, +3.285393859e-01f, +4.273610873e-01f, +2.879449755e-01f, +4.723137538e-02f, -8.385207551e-02f, -4.998555200e-02f, +2.988845230e-02f, +4.087781893e-02f, -4.360166579e-03f, -2.822896493e-02f, -7.357443684e-03f, +1.604735791e-02f, +1.066538848e-02f, -6.681698189e-03f, -9.277932906e-03f, +9.657674704e-04f, +6.089029438e-03f, +1.506461047e-03f, -3.034313091e-03f, -1.835400358e-03f, +1.015848324e-03f, +1.214269227e-03f, -1.028253700e-04f, -5.023812190e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.420592772e-05f, +1.278478377e-06f, -3.943662641e-05f, -2.340904202e-05f, +7.186211401e-05f, +8.532019059e-05f, -8.693853995e-05f, -1.980245521e-04f, +4.044158950e-05f, +3.472712501e-04f, +1.220733051e-04f, -4.781597261e-04f, -4.448440945e-04f, +4.874186029e-04f, +9.360060371e-04f, -2.217074795e-04f, -1.543495271e-03f, -5.443807266e-04f, +2.123902846e-03f, +2.284463820e-03f, -2.226917682e-03f, -7.261242746e-03f, -6.434833450e-03f, +6.413739816e-04f, +7.072864687e-03f, +6.732920928e-03f, +1.313855934e-03f, -2.581310828e-03f, -1.753299022e-03f, +8.835766843e-04f, +1.444002155e-03f, -3.844823356e-05f, -9.675369667e-04f, -3.256869626e-04f, +5.235689730e-04f, +3.989501581e-04f, -2.004216370e-04f, -3.225723242e-04f, +1.672415031e-05f, +2.008143956e-04f, +5.389403999e-05f, -9.637149550e-05f, -5.681040703e-05f, +3.279435594e-05f, +3.421848615e-05f, -6.281120501e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.652721470e-04f, +5.254670563e-04f, -7.673069041e-05f, -2.021343077e-03f, -9.007144999e-04f, +4.003846151e-03f, +3.528026906e-03f, -5.913320056e-03f, -8.336120182e-03f, +6.532189177e-03f, +1.519805960e-02f, -4.431853837e-03f, -2.305288241e-02f, -1.452336848e-03f, +2.998425141e-02f, +1.121519871e-02f, -3.372181825e-02f, -2.363755289e-02f, +3.242903756e-02f, +3.632696513e-02f, -2.547049237e-02f, -4.636746937e-02f, +1.381315467e-02f, +5.126299311e-02f, +1.535303363e-04f, -4.980113352e-02f, -1.334606571e-02f, +4.247512147e-02f, +2.298450154e-02f, -3.128555111e-02f, -2.745781254e-02f, +1.901295276e-02f, +2.671979587e-02f, -8.275610483e-03f, -2.209473228e-02f, +7.574587130e-04f, +1.563065907e-02f, +3.117280761e-03f, -9.312612588e-03f, -4.007564142e-03f, +4.463233262e-03f, +3.140265601e-03f, -1.524601036e-03f, -1.731524598e-03f, +1.028253700e-04f, +5.023812190e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.420592772e-05f, -1.278478377e-06f, +5.356478109e-05f, +4.123224846e-05f, -1.168416268e-04f, -1.321540652e-04f, +1.842133237e-04f, +3.041287796e-04f, -2.148275953e-04f, -5.618474442e-04f, +1.542432463e-04f, +8.766469271e-04f, +4.656973925e-05f, -1.183685991e-03f, -4.072137252e-04f, +1.395013665e-03f, +8.992957936e-04f, -1.426672350e-03f, -1.443564632e-03f, +1.230504856e-03f, +1.927343658e-03f, -8.173610248e-04f, -2.237927891e-03f, +2.605453583e-04f, +2.299706817e-03f, +3.238146663e-04f, -2.100049250e-03f, -8.127796729e-04f, +1.693164308e-03f, +1.114958710e-03f, -1.180449996e-03f, -1.196206297e-03f, +6.758064862e-04f, +1.083476215e-03f, -2.702399750e-04f, -8.473323064e-04f, +9.208901701e-06f, +5.723689113e-04f, +1.105777184e-04f, -3.285861621e-04f, -1.271229364e-04f, +1.543378622e-04f, +9.076854688e-05f, -5.474500924e-05f, -3.421848615e-05f, +6.281120501e-06f, +0.000000000e+00f,\n    /*  7,30 (48) */\n    +0.000000000e+00f, -1.510662193e-04f, -5.241885780e-04f, +7.921668061e-05f, +1.360496485e-03f, +7.010510496e-04f, -2.297359916e-03f, -2.698582297e-03f, +2.508836561e-03f, +6.059881091e-03f, -7.020199266e-04f, -1.012854406e-02f, -4.522578569e-03f, +1.313674300e-02f, +1.409220310e-02f, -1.215017395e-02f, -2.790598409e-02f, +3.082970544e-03f, +4.463963834e-02f, +2.035840554e-02f, -6.235066979e-02f, -7.546977714e-02f, +8.201148479e-02f, +3.221045525e-01f, +4.280024613e-01f, +2.950178402e-01f, +5.396429631e-02f, -8.253821958e-02f, -5.256686283e-02f, +2.813515328e-02f, +4.176139561e-02f, -2.916164424e-03f, -2.826741316e-02f, -8.324980651e-03f, +1.572167095e-02f, +1.118895746e-02f, -6.282748031e-03f, -9.478354543e-03f, +6.431951462e-04f, +6.105753588e-03f, +1.707275443e-03f, -2.980419051e-03f, -1.931771853e-03f, +9.590379168e-04f, +1.247063583e-03f, -6.860688387e-05f, -5.086623395e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.395240629e-05f, +2.359131188e-06f, -3.849926784e-05f, -2.548962186e-05f, +6.898759360e-05f, +8.797104486e-05f, -8.037719661e-05f, -1.993642683e-04f, +2.871543078e-05f, +3.434541995e-04f, +1.387605929e-04f, -4.635448853e-04f, -4.627657440e-04f, +4.557867798e-04f, +9.459444776e-04f, -1.687455178e-04f, -1.528490732e-03f, -6.165977888e-04f, +2.054408452e-03f, +2.354278168e-03f, -2.041903873e-03f, -7.167524184e-03f, -6.576588681e-03f, +3.851071098e-04f, +6.959632173e-03f, +6.850181348e-03f, +1.493629345e-03f, -2.532396482e-03f, -1.831730441e-03f, +8.202888207e-04f, +1.468661393e-03f, +1.247875202e-05f, -9.648401929e-04f, -3.586215482e-04f, +5.100302025e-04f, +4.159446280e-04f, -1.858136918e-04f, -3.286002227e-04f, +5.622708085e-06f, +2.010276988e-04f, +6.052409654e-05f, -9.460233729e-05f, -5.994166238e-05f, +3.112411600e-05f, +3.536116739e-05f, -5.363231868e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.510662193e-04f, +5.241885780e-04f, -2.316590932e-05f, -1.980110829e-03f, -1.017556127e-03f, +3.871692085e-03f, +3.712240230e-03f, -5.609191277e-03f, -8.550947777e-03f, +5.970341733e-03f, +1.535230285e-02f, -3.555206910e-03f, -2.300631267e-02f, -2.636022839e-03f, +2.957703769e-02f, +1.261021237e-02f, -3.282252246e-02f, -2.506422524e-02f, +3.098547293e-02f, +3.755746999e-02f, -2.354314871e-02f, -4.718483039e-02f, +1.157522678e-02f, +5.152353847e-02f, +2.453237153e-03f, -4.947731885e-02f, -1.544611496e-02f, +4.166234180e-02f, +2.467766585e-02f, -3.017059240e-02f, -2.863826254e-02f, +1.781674647e-02f, +2.739560235e-02f, -7.192134268e-03f, -2.236497226e-02f, -8.987359339e-05f, +1.563986797e-02f, +3.689649672e-03f, -9.202034869e-03f, -4.336150304e-03f, +4.336110325e-03f, +3.294603463e-03f, -1.433832489e-03f, -1.786269607e-03f, +6.860688387e-05f, +5.086623395e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.395240629e-05f, -2.359131188e-06f, +5.177662578e-05f, +4.431058451e-05f, -1.118528453e-04f, -1.374100914e-04f, +1.730623710e-04f, +3.105441002e-04f, -1.940785686e-04f, -5.664150925e-04f, +1.211189995e-04f, +8.742896207e-04f, +9.276064125e-05f, -1.168061624e-03f, -4.639097211e-04f, +1.360169373e-03f, +9.603762505e-04f, -1.369090876e-03f, -1.500263071e-03f, +1.150799020e-03f, +1.970271063e-03f, -7.208850167e-04f, -2.259603869e-03f, +1.565431243e-04f, +2.296715000e-03f, +4.243447843e-04f, -2.074017417e-03f, -8.998052987e-04f, +1.650202515e-03f, +1.181780527e-03f, -1.129274547e-03f, -1.240686479e-03f, +6.252668419e-04f, +1.107813740e-03f, -2.271364703e-04f, -8.566381906e-04f, -2.291445353e-05f, +5.727039945e-04f, +1.314375733e-04f, -3.252146092e-04f, -1.387530092e-04f, +1.507233495e-04f, +9.617976463e-05f, -5.242115229e-05f, -3.536116739e-05f, +5.363231868e-06f, +0.000000000e+00f,\n    /*  7,31 (48) */\n    +0.000000000e+00f, -1.371138130e-04f, -5.218294468e-04f, +4.071741277e-05f, +1.335006863e-03f, +7.700386432e-04f, -2.209388871e-03f, -2.778959494e-03f, +2.309472292e-03f, +6.088596521e-03f, -3.585657271e-04f, -9.989783468e-03f, -4.986123454e-03f, +1.267397725e-02f, +1.454798988e-02f, -1.120422947e-02f, -2.807472961e-02f, +1.554479812e-03f, +4.402304055e-02f, +2.241281399e-02f, -5.999639162e-02f, -7.751168101e-02f, +7.484396060e-02f, +3.155279638e-01f, +4.283875684e-01f, +3.019774723e-01f, +6.081447766e-02f, -8.104459023e-02f, -5.509925932e-02f, +2.630342283e-02f, +4.258168443e-02f, -1.447503031e-03f, -2.825493441e-02f, -9.289820844e-03f, +1.536304940e-02f, +1.169898766e-02f, -5.866803403e-03f, -9.664168235e-03f, +3.145949235e-04f, +6.111376296e-03f, +1.908303142e-03f, -2.919894955e-03f, -2.026374191e-03f, +8.990962544e-04f, +1.278187699e-03f, -3.324571648e-05f, -5.140255714e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.367129889e-05f, +3.401044618e-06f, -3.750518317e-05f, -2.747022415e-05f, +6.603770382e-05f, +9.040208288e-05f, -7.377878167e-05f, -2.003082109e-04f, +1.711613663e-05f, +3.390588754e-04f, +1.549617571e-04f, -4.482795641e-04f, -4.796149263e-04f, +4.237344909e-04f, +9.540569351e-04f, -1.161613155e-04f, -1.510974108e-03f, -6.867150942e-04f, +1.982443748e-03f, +2.418878930e-03f, -1.857870170e-03f, -7.067661105e-03f, -6.711386426e-03f, +1.284161757e-04f, +6.839105062e-03f, +6.961821842e-03f, +1.675039053e-03f, -2.478253380e-03f, -1.908165098e-03f, +7.546410229e-04f, +1.491008734e-03f, +6.404349089e-05f, -9.603516939e-04f, -3.913250279e-04f, +4.953746677e-04f, +4.324003844e-04f, -1.706534758e-04f, -3.341017752e-04f, -5.663638279e-06f, +2.008609397e-04f, +6.715667929e-05f, -9.261259788e-05f, -6.301990736e-05f, +2.934893968e-05f, +3.645794608e-05f, -4.402830756e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.371138130e-04f, +5.218294468e-04f, +2.861071646e-05f, -1.935800244e-03f, -1.129408972e-03f, +3.734281994e-03f, +3.885302601e-03f, -5.298647177e-03f, -8.745026346e-03f, +5.403926640e-03f, +1.547342185e-02f, -2.680917289e-03f, -2.291355203e-02f, -3.804084463e-03f, +2.911312797e-02f, +1.397038175e-02f, -3.186214621e-02f, -2.643331612e-02f, +2.948520986e-02f, +3.870826901e-02f, -2.157287765e-02f, -4.790571541e-02f, +9.315622911e-03f, +5.168008159e-02f, +4.749952153e-03f, -4.905297407e-02f, -1.752013237e-02f, +4.076253650e-02f, +2.632786837e-02f, -2.898881188e-02f, -2.976753709e-02f, +1.657605999e-02f, +2.802086920e-02f, -6.084320528e-03f, -2.259210873e-02f, -9.465117840e-04f, +1.561695352e-02f, +4.262353667e-03f, -9.070597296e-03f, -4.661364913e-03f, +4.197357316e-03f, +3.445326813e-03f, -1.337652724e-03f, -1.838690760e-03f, +3.324571648e-05f, +5.140255714e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.367129889e-05f, -3.401044618e-06f, +4.992298047e-05f, +4.720273898e-05f, -1.067364938e-04f, -1.422584669e-04f, +1.617501818e-04f, +3.161963751e-04f, -1.732332348e-04f, -5.697403375e-04f, +8.814437108e-05f, +8.701498844e-04f, +1.383111949e-04f, -1.150169523e-03f, -5.192197337e-04f, +1.322769487e-03f, +1.019137686e-03f, -1.308989800e-03f, -1.553665861e-03f, +1.068995934e-03f, +2.009071323e-03f, -6.230870902e-04f, -2.276646540e-03f, +5.221704922e-05f, +2.289024217e-03f, +5.241715658e-04f, -2.043673952e-03f, -9.852715527e-04f, +1.603675632e-03f, +1.246505957e-03f, -1.075471433e-03f, -1.282908753e-03f, +5.730390367e-04f, +1.130066542e-03f, -1.831321024e-04f, -8.642556210e-04f, -5.538729978e-05f, +5.718326359e-04f, +1.523377155e-04f, -3.210858882e-04f, -1.503045336e-04f, +1.466967147e-04f, +1.015072581e-04f, -4.990674596e-05f, -3.645794608e-05f, +4.402830756e-06f, +0.000000000e+00f,\n    /*  8, 0 (44) */\n    +0.000000000e+00f, -5.810608668e-04f, -4.000691189e-04f, +1.473036739e-03f, +1.194314507e-03f, -2.873286720e-03f, -2.812546922e-03f, +4.814679451e-03f, +5.726744505e-03f, -7.245170423e-03f, -1.058087851e-02f, +1.001747038e-02f, +1.834373570e-02f, -1.289773969e-02f, -3.079950282e-02f, +1.559401954e-02f, +5.232680174e-02f, -1.780024775e-02f, -9.893335750e-02f, +1.924749700e-02f, +3.158555538e-01f, +4.802482832e-01f, +3.158555538e-01f, +1.924749700e-02f, -9.893335750e-02f, -1.780024775e-02f, +5.232680174e-02f, +1.559401954e-02f, -3.079950282e-02f, -1.289773969e-02f, +1.834373570e-02f, +1.001747038e-02f, -1.058087851e-02f, -7.245170423e-03f, +5.726744505e-03f, +4.814679451e-03f, -2.812546922e-03f, -2.873286720e-03f, +1.194314507e-03f, +1.473036739e-03f, -4.000691189e-04f, -5.810608668e-04f, +8.174592653e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.055780628e-05f, -3.848735070e-05f, -5.408411680e-05f, +8.314785430e-05f, +1.202249485e-04f, -1.466740772e-04f, -2.377308607e-04f, +2.260407756e-04f, +4.318552366e-04f, -3.122425653e-04f, -7.387415145e-04f, +3.873126573e-04f, +1.218865262e-03f, -4.155373014e-04f, -2.001146980e-03f, +3.044894664e-04f, +3.463524932e-03f, +3.686348989e-04f, -7.485993408e-03f, -9.128129279e-03f, -1.806332249e-04f, +8.988032967e-03f, +7.690748195e-03f, -1.512011525e-04f, -3.487874864e-03f, -4.287778866e-04f, +1.995704894e-03f, +4.918364215e-04f, -1.206608172e-03f, -4.348372014e-04f, +7.264350323e-04f, +3.413037314e-04f, -4.218703204e-04f, -2.431061282e-04f, +2.306814620e-04f, +1.561170982e-04f, -1.158881642e-04f, -8.797140009e-05f, +5.185638397e-05f, +4.069879002e-05f, -1.973251484e-05f, -1.241779730e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.810608668e-04f, +4.000691189e-04f, -2.174762082e-03f, -1.369356920e-03f, +4.931706478e-03f, +2.614276448e-03f, -9.249493921e-03f, -4.085126069e-03f, +1.521344320e-02f, +5.480993556e-03f, -2.257913432e-02f, -6.427039238e-03f, +3.073327098e-02f, +6.578871207e-03f, -3.875145264e-02f, -5.735049828e-03f, +4.555317997e-02f, +3.918145659e-03f, -5.012182275e-02f, -1.392488435e-03f, +5.173229864e-02f, -1.392488435e-03f, -5.012182275e-02f, +3.918145659e-03f, +4.555317997e-02f, -5.735049828e-03f, -3.875145264e-02f, +6.578871207e-03f, +3.073327098e-02f, -6.427039238e-03f, -2.257913432e-02f, +5.480993556e-03f, +1.521344320e-02f, -4.085126069e-03f, -9.249493921e-03f, +2.614276448e-03f, +4.931706478e-03f, -1.369356920e-03f, -2.174762082e-03f, +5.133746463e-04f, +5.810608668e-04f, -8.174592653e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.055780628e-05f, +3.848735070e-05f, +7.767317955e-05f, -1.452272650e-04f, -1.550874398e-04f, +3.095240124e-04f, +2.539588194e-04f, -5.576059524e-04f, -3.584684405e-04f, +8.884770433e-04f, +4.455839699e-04f, -1.282216489e-03f, -4.906064529e-04f, +1.699715456e-03f, +4.743906180e-04f, -2.087962664e-03f, -3.898920508e-04f, +2.390160510e-03f, +2.456691656e-04f, -2.558217123e-03f, -6.486431433e-05f, +2.564123150e-03f, -1.202879539e-04f, -2.406829384e-03f, +2.767965642e-04f, +2.112517436e-03f, -3.794418868e-04f, -1.728177459e-03f, +4.167838078e-04f, +1.310459866e-03f, -3.928611841e-04f, -9.131253679e-04f, +3.243325880e-04f, +5.766242397e-04f, -2.343593103e-04f, -3.223784588e-04f, +1.455110959e-04f, +1.526349625e-04f, -7.405458027e-05f, -5.496512532e-05f, +1.973251484e-05f, +1.241779730e-05f, +0.000000000e+00f,\n    /*  8, 1 (44) */\n    +0.000000000e+00f, -5.605030605e-04f, -4.385564696e-04f, +1.418952622e-03f, +1.277462361e-03f, -2.753061772e-03f, -2.959221000e-03f, +4.576948590e-03f, +5.952785281e-03f, -6.813315187e-03f, -1.089312107e-02f, +9.278728870e-03f, +1.873104835e-02f, -1.167887442e-02f, -3.121504012e-02f, +1.359287256e-02f, +5.263129120e-02f, -1.433672282e-02f, -9.856472261e-02f, +1.176150359e-02f, +3.067274245e-01f, +4.800676500e-01f, +3.248435867e-01f, +2.693824519e-02f, -9.908455866e-02f, -2.128812261e-02f, +5.189802385e-02f, +1.758972443e-02f, -3.030766640e-02f, -1.410434786e-02f, +1.790889849e-02f, +1.074390542e-02f, -1.023957477e-02f, -7.667040744e-03f, +5.483638377e-03f, +5.045360913e-03f, -2.656429824e-03f, -2.989174884e-03f, +1.106343107e-03f, +1.524893123e-03f, -3.593703289e-04f, -6.007933817e-04f, +6.932812923e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.129703629e-05f, -3.623810225e-05f, -5.612101223e-05f, +7.822891266e-05f, +1.241869104e-04f, -1.370602814e-04f, -2.441037719e-04f, +2.087281453e-04f, +4.406935626e-04f, -2.828937322e-04f, -7.491921922e-04f, +3.395733510e-04f, +1.228207727e-03f, -3.393868463e-04f, -2.002069348e-03f, +1.815279258e-04f, +3.432201781e-03f, +5.803880719e-04f, -7.274526133e-03f, -9.256347174e-03f, -5.416502342e-04f, +8.836192550e-03f, +7.888409201e-03f, +7.163281020e-05f, -3.505077189e-03f, -5.541453813e-04f, +1.985688665e-03f, +5.681144816e-04f, -1.191423856e-03f, -4.820347566e-04f, +7.122748442e-04f, +3.700051028e-04f, -4.107447354e-04f, -2.598795924e-04f, +2.229608930e-04f, +1.653631379e-04f, -1.111798319e-04f, -9.268517436e-05f, +4.943904653e-05f, +4.286525175e-05f, -1.882096265e-05f, -1.327735794e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.605030605e-04f, +4.385564696e-04f, -2.097088902e-03f, -1.514584185e-03f, +4.776619039e-03f, +2.923800461e-03f, -8.995535102e-03f, -4.642732022e-03f, +1.485497475e-02f, +6.369470600e-03f, -2.213355035e-02f, -7.709255728e-03f, +3.024266452e-02f, +8.278586662e-03f, -3.827706203e-02f, -7.823012491e-03f, +4.516328792e-02f, +6.308306169e-03f, -4.987615359e-02f, -3.950705558e-03f, +5.166743433e-02f, +1.171634715e-03f, -5.024211071e-02f, +1.511316275e-03f, +4.582997653e-02f, -3.622532391e-03f, -3.913089453e-02f, +4.850693747e-03f, +3.115005478e-02f, -5.116579372e-03f, -2.297199551e-02f, +4.567868188e-03f, +1.553777578e-02f, -3.508501830e-03f, -9.483853231e-03f, +2.291897989e-03f, +5.077217574e-03f, -1.216721958e-03f, -2.248816662e-03f, +4.584095210e-04f, +6.007933817e-04f, -6.932812923e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.129703629e-05f, +3.623810225e-05f, +8.096929242e-05f, -1.376061596e-04f, -1.640445681e-04f, +2.960972531e-04f, +2.725676232e-04f, -5.374266916e-04f, -3.912278939e-04f, +8.618392464e-04f, +4.966166449e-04f, -1.250960538e-03f, -5.625883596e-04f, +1.667127252e-03f, +5.675804767e-04f, -2.058226523e-03f, -5.015668458e-04f, +2.367477734e-03f, +3.701898939e-04f, -2.545828660e-03f, -1.944264780e-04f, +2.563525537e-03f, +5.633100092e-06f, -2.417424508e-03f, +1.625664531e-04f, +2.131802680e-03f, -2.829697519e-04f, -1.752411078e-03f, +3.412978666e-04f, +1.335589277e-03f, -3.385690670e-04f, -9.356957414e-04f, +2.888928305e-04f, +5.944132943e-04f, -2.138056599e-04f, -3.346144730e-04f, +1.353292048e-04f, +1.598027048e-04f, -7.011533139e-05f, -5.833250182e-05f, +1.882096265e-05f, +1.327735794e-05f, +0.000000000e+00f,\n    /*  8, 2 (44) */\n    +0.000000000e+00f, -5.392060243e-04f, -4.747945719e-04f, +1.362831610e-03f, +1.355691274e-03f, -2.628874861e-03f, -3.096281281e-03f, +4.332844818e-03f, +6.161513426e-03f, -6.372621624e-03f, -1.117601480e-02f, +8.529536678e-03f, +1.907062170e-02f, -1.045066670e-02f, -3.155442696e-02f, +1.159080321e-02f, +5.281281913e-02f, -1.090452104e-02f, -9.798433453e-02f, +4.486977456e-03f, +2.974710773e-01f, +4.795259998e-01f, +3.336797793e-01f, +3.482665439e-02f, -9.901292585e-02f, -2.479319980e-02f, +5.134387847e-02f, +1.957541309e-02f, -2.973955191e-02f, -1.529577171e-02f, +1.742686374e-02f, +1.145618026e-02f, -9.869569671e-03f, -8.077785479e-03f, +5.223758785e-03f, +5.268321806e-03f, -2.491066686e-03f, -3.100354716e-03f, +1.013657932e-03f, +1.574332169e-03f, -3.165050772e-04f, -6.196143443e-04f, +5.605077129e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.195065330e-05f, -3.395813985e-05f, -5.796636668e-05f, +7.322889637e-05f, +1.277717665e-04f, -1.273018687e-04f, -2.497965870e-04f, +1.912127353e-04f, +4.483821483e-04f, -2.533289979e-04f, -7.577892523e-04f, +2.917304806e-04f, +1.234654531e-03f, -2.635521593e-04f, -1.998535394e-03f, +6.013471407e-05f, +3.394090501e-03f, +7.861933153e-04f, -7.056735594e-03f, -9.372571504e-03f, -9.019193399e-04f, +8.672761342e-03f, +8.078603771e-03f, +2.995740239e-04f, -3.514968676e-03f, -6.803382136e-04f, +1.971053077e-03f, +6.441994771e-04f, -1.173306186e-03f, -5.287923119e-04f, +6.962673879e-04f, +3.982743552e-04f, -3.984872011e-04f, -2.763165514e-04f, +2.145761941e-04f, +1.743860058e-04f, -1.061042274e-04f, -9.727478371e-05f, +4.683387456e-05f, +4.497951281e-05f, -1.782320644e-05f, -1.412815468e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.392060243e-04f, +4.747945719e-04f, -2.016119610e-03f, -1.652190345e-03f, +4.612574470e-03f, +3.219897714e-03f, -8.722967479e-03f, -5.180158713e-03f, +1.446374686e-02f, +7.231309846e-03f, -2.163693371e-02f, -8.960216265e-03f, +2.968007616e-02f, +9.945713914e-03f, -3.770948155e-02f, -9.881239015e-03f, +4.466172107e-02f, +8.675783903e-03f, -4.950596369e-02f, -6.496534218e-03f, +5.147300785e-02f, +3.735160252e-03f, -5.023647761e-02f, -9.061082325e-04f, +4.599254299e-02f, -1.490729711e-03f, -3.941386428e-02f, +3.098282669e-03f, +3.149135265e-02f, -3.780990095e-03f, -2.331056457e-02f, +3.632172447e-03f, +1.582666861e-02f, -2.914088535e-03f, -9.697658891e-03f, +1.957283516e-03f, +5.212546779e-03f, -1.056919253e-03f, -2.318931993e-03f, +4.000770192e-04f, +6.196143443e-04f, -5.605077129e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.195065330e-05f, +3.395813985e-05f, +8.394210187e-05f, -1.297982064e-04f, -1.723708327e-04f, +2.821450487e-04f, +2.901524419e-04f, -5.161568565e-04f, -4.225430608e-04f, +8.333047132e-04f, +5.458441169e-04f, -1.216800403e-03f, -6.325582952e-04f, +1.630525108e-03f, +6.587819237e-04f, -2.023410232e-03f, -6.115396462e-04f, +2.338856349e-03f, +4.935323277e-04f, -2.526995766e-03f, -3.234896838e-04f, +2.556419947e-03f, +1.317713624e-04f, -2.421901676e-03f, +4.749181134e-05f, +2.145743589e-03f, -1.852150214e-04f, -1.772324548e-03f, +2.643318554e-04f, +1.357510663e-03f, -2.828338165e-04f, -9.561042310e-04f, +2.522261286e-04f, +6.109072174e-04f, -1.923376664e-04f, -3.461868290e-04f, +1.245574544e-04f, +1.667040381e-04f, -6.585830902e-05f, -6.163946680e-05f, +1.782320644e-05f, +1.412815468e-05f, +0.000000000e+00f,\n    /*  8, 3 (44) */\n    +0.000000000e+00f, -5.172553710e-04f, -5.087527117e-04f, +1.304865243e-03f, +1.428920170e-03f, -2.501103095e-03f, -3.223583150e-03f, +4.083048231e-03f, +6.352726162e-03f, -5.924239476e-03f, -1.142934380e-02f, +7.771747426e-03f, +1.936235218e-02f, -9.216012166e-03f, -3.181797912e-02f, +9.592267814e-03f, +5.287295384e-02f, -7.510430536e-03f, -9.719814122e-02f, -2.569758138e-03f, +2.880985058e-01f, +4.786240804e-01f, +3.423525406e-01f, +4.290525816e-02f, -9.871335182e-02f, -2.830816848e-02f, +5.066354025e-02f, +2.154646617e-02f, -2.909535244e-02f, -1.646907790e-02f, +1.689807143e-02f, +1.215244765e-02f, -9.471295316e-03f, -8.476272680e-03f, +4.947442234e-03f, +5.482898000e-03f, -2.316680681e-03f, -3.206458944e-03f, +9.163831487e-04f, +1.621166044e-03f, -2.715255644e-04f, -6.374375508e-04f, +4.192261661e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.251934746e-05f, -3.165446722e-05f, -5.961999631e-05f, +6.816203638e-05f, +1.309782120e-04f, -1.174248849e-04f, -2.548073873e-04f, +1.735388265e-04f, +4.549205816e-04f, -2.236196045e-04f, -7.645391042e-04f, +2.438939764e-04f, +1.238230873e-03f, -1.881973897e-04f, -1.990617239e-03f, -5.945548166e-05f, +3.349386414e-03f, +9.857966404e-04f, -6.833018219e-03f, -9.476706422e-03f, -1.260943332e-03f, +8.497911455e-03f, +8.260968595e-03f, +5.323173350e-04f, -3.517397689e-03f, -8.070971557e-04f, +1.951762343e-03f, +7.199174749e-04f, -1.152255607e-03f, -5.749963216e-04f, +6.784234845e-04f, +4.260391358e-04f, -3.851092549e-04f, -2.923724898e-04f, +2.055361406e-04f, +1.831595935e-04f, -1.006666355e-04f, -1.017258544e-04f, +4.404318231e-05f, +4.703431483e-05f, -1.673956517e-05f, -1.496697687e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.172553710e-04f, +5.087527117e-04f, -1.932177508e-03f, -1.781988551e-03f, +4.440203638e-03f, +3.502042762e-03f, -8.432815037e-03f, -5.696315570e-03f, +1.404120380e-02f, +8.064614559e-03f, -2.109108959e-02f, -1.017701667e-02f, +2.904751787e-02f, +1.157623902e-02f, -3.705069963e-02f, -1.190464925e-02f, +4.405018143e-02f, +1.101464025e-02f, -4.901243137e-02f, -9.023529984e-03f, +5.114951817e-02f, +6.291580199e-03f, -5.010470624e-02f, -3.328009908e-03f, +4.604003480e-02f, +6.550138773e-04f, -3.959907930e-02f, +1.325958121e-03f, +3.175568451e-02f, -2.423479432e-03f, -2.359339839e-02f, +2.676068216e-03f, +1.607889474e-02f, -2.303181318e-03f, -9.889996558e-03f, +1.611096687e-03f, +5.337104233e-03f, -8.902152149e-04f, -2.384790302e-03f, +3.384375524e-04f, +6.374375508e-04f, -4.192261661e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.251934746e-05f, +3.165446722e-05f, +8.659178844e-05f, -1.218299000e-04f, -1.800565991e-04f, +2.677148706e-04f, +3.066833210e-04f, -4.938687636e-04f, -4.523507860e-04f, +8.029701393e-04f, +5.931572319e-04f, -1.179851125e-03f, -7.003516420e-04f, +1.590031001e-03f, +7.477719213e-04f, -1.983627737e-03f, -7.195346339e-04f, +2.304386847e-03f, +6.153823148e-04f, -2.501773131e-03f, -4.517227478e-04f, +2.542818943e-03f, +2.578030512e-04f, -2.420232485e-03f, -6.813399060e-05f, +2.154278965e-03f, -8.642323395e-05f, -1.787836834e-03f, +1.860743392e-04f, +1.376137616e-03f, -2.257867632e-04f, -9.742717304e-04f, +2.144137544e-04f, +6.260426865e-04f, -1.699983012e-04f, -3.570513405e-04f, +1.132135465e-04f, +1.733126841e-04f, -6.128744519e-05f, -6.487345079e-05f, +1.673956517e-05f, +1.496697687e-05f, +0.000000000e+00f,\n    /*  8, 4 (44) */\n    +0.000000000e+00f, -4.947360235e-04f, -5.404071790e-04f, +1.245245247e-03f, +1.497082207e-03f, -2.370124883e-03f, -3.341008035e-03f, +3.828240844e-03f, +6.526264988e-03f, -5.469318894e-03f, -1.165296341e-02f, +7.007208321e-03f, +1.960624616e-02f, -7.977781293e-03f, -3.200617651e-02f, +7.601650574e-03f, +5.281349836e-02f, -4.161044122e-03f, -9.621234458e-02f, -9.402776357e-03f, +2.786217994e-01f, +4.773631371e-01f, +3.508504521e-01f, +5.116622676e-02f, -9.818103449e-02f, -3.182556617e-02f, +4.985644310e-02f, +2.349822851e-02f, -2.837543496e-02f, -1.762133351e-02f, +1.632307510e-02f, +1.283087113e-02f, -9.045256180e-03f, -8.861381935e-03f, +4.655069744e-03f, +5.688434141e-03f, -2.133521087e-03f, -3.307125579e-03f, +8.146572943e-04f, +1.665209226e-03f, -2.244912495e-04f, -6.541771159e-04f, +2.695563973e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.300404255e-05f, -2.933397920e-05f, -6.108222644e-05f, +6.304243838e-05f, +1.338059061e-04f, -1.074552011e-04f, -2.591359210e-04f, +1.557503799e-04f, +4.603111501e-04f, -1.938361112e-04f, -7.694523085e-04f, +1.961722680e-04f, +1.238968054e-03f, -1.134834115e-04f, -1.978395458e-03f, -1.770151251e-04f, +3.298294587e-03f, +1.178957764e-03f, -6.603776907e-03f, -9.568675473e-03f, -1.618227086e-03f, +8.311833564e-03f, +8.435150394e-03f, +7.695458477e-04f, -3.512224607e-03f, -9.341579451e-04f, +1.927790301e-03f, +7.950929731e-04f, -1.128279224e-03f, -6.205329591e-04f, +6.587583729e-04f, +4.532272335e-04f, -3.706252664e-04f, -3.080031036e-04f, +1.958512485e-04f, +1.916579412e-04f, -9.487335522e-05f, -1.060240704e-04f, +4.106983364e-05f, +4.902238392e-05f, -1.557062569e-05f, -1.579055794e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.947360235e-04f, +5.404071790e-04f, -1.845585719e-03f, -1.903818451e-03f, +4.260147039e-03f, +3.769757633e-03f, -8.126131716e-03f, -6.190184334e-03f, +1.358885301e-02f, +8.867584699e-03f, -2.049793236e-02f, -1.135686779e-02f, +2.834716623e-02f, +1.316627002e-02f, -3.630292770e-02f, -1.388827698e-02f, +4.333064679e-02f, +1.331902710e-02f, -4.839704905e-02f, -1.152530311e-02f, +5.069779542e-02f, +8.834399142e-03f, -4.984690319e-02f, -5.748242393e-03f, +4.597190081e-02f, +2.809292843e-03f, -3.968550254e-02f, -4.618787135e-04f, +3.194175885e-02f, -1.047341816e-03f, -2.381918515e-02f, +1.701796486e-03f, +1.629330850e-02f, -1.677138632e-03f, -1.005999486e-02f, +1.254045347e-03f, +5.450317780e-03f, -7.169025308e-04f, -2.446077748e-03f, +2.735641016e-04f, +6.541771159e-04f, -2.695563973e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.300404255e-05f, +2.933397920e-05f, +8.891950538e-05f, -1.137275915e-04f, -1.870942350e-04f, +2.528546485e-04f, +3.221336618e-04f, -4.706364215e-04f, -4.805927579e-04f, +7.709358742e-04f, +6.384530061e-04f, -1.140234026e-03f, -7.658107828e-04f, +1.545776231e-03f, +8.343344836e-04f, -1.939005358e-03f, -8.252821801e-04f, +2.264174645e-03f, +7.354301793e-04f, -2.470231970e-03f, -5.787966648e-04f, +2.522751965e-03f, +3.834040852e-04f, -2.412404450e-03f, -1.840150670e-04f, +2.157361451e-03f, +1.315596484e-05f, -1.798877921e-03f, +1.067187602e-04f, +1.391391680e-03f, -1.675640669e-04f, -9.901242290e-04f, +1.755411240e-04f, +6.397591682e-04f, -1.468336382e-04f, -3.671650045e-04f, +1.013171845e-04f, +1.796026234e-04f, -5.640774150e-05f, -6.802174843e-05f, +1.557062569e-05f, +1.579055794e-05f, +0.000000000e+00f,\n    /*  8, 5 (44) */\n    +0.000000000e+00f, -4.717319809e-04f, -5.697411582e-04f, +1.184163020e-03f, +1.560124645e-03f, -2.236318977e-03f, -3.448463236e-03f, +3.569104923e-03f, +6.682015368e-03f, -5.009007744e-03f, -1.184679952e-02f, +6.237756013e-03f, +1.980241843e-02f, -6.738813239e-03f, -3.211965993e-02f, +5.623255116e-03f, +5.263648323e-02f, -8.627495342e-04f, -9.503338681e-02f, -1.600655326e-02f, +2.690531239e-01f, +4.757449100e-01f, +3.591622856e-01f, +5.960137715e-02f, -9.741148864e-02f, -3.533779078e-02f, +4.892228515e-02f, +2.542601882e-02f, -2.758034199e-02f, -1.874961273e-02f, +1.570254214e-02f, +1.348962951e-02f, -8.592028947e-03f, -9.232007201e-03f, +4.347066640e-03f, +5.884285389e-03f, -1.941863146e-03f, -3.401998934e-03f, +7.086332239e-04f, +1.706279060e-03f, -1.754688656e-04f, -6.697477416e-04f, +1.116508179e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.340588755e-05f, -2.700344492e-05f, -6.235387979e-05f, +5.788404891e-05f, +1.362554549e-04f, -9.741845355e-05f, -2.627835768e-04f, +1.378909369e-04f, +4.645587956e-04f, -1.640482395e-04f, -7.725434958e-04f, +1.486720570e-04f, +1.236903324e-03f, -3.956751245e-05f, -1.961958798e-03f, -2.923242001e-04f, +3.241029330e-03f, +1.365450418e-03f, -6.369420286e-03f, -9.648421663e-03f, -1.973278391e-03f, +8.114736642e-03f, +8.600806591e-03f, +1.010931395e-03f, -3.499322218e-03f, -1.061251757e-03f, +1.899120603e-03f, +8.695492688e-04f, -1.101390868e-03f, -6.652883750e-04f, +6.372917343e-04f, +4.797667512e-04f, -3.550524448e-04f, -3.231644100e-04f, +1.855337779e-04f, +1.998553052e-04f, -8.873170256e-05f, -1.101552123e-04f, +3.791724618e-05f, +5.093645098e-05f, -1.431724768e-05f, -1.659558457e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.717319809e-04f, +5.697411582e-04f, -1.756666214e-03f, -2.017546043e-03f, +4.073052804e-03f, +4.022612281e-03f, -7.803998054e-03f, -6.660820755e-03f, +1.310826026e-02f, +9.638520573e-03f, -1.985947935e-02f, -1.249710182e-02f, +2.758135544e-02f, +1.471204625e-02f, -3.546859322e-02f, -1.582728234e-02f, +4.250536461e-02f, +1.558320174e-02f, -4.766161887e-02f, -1.399553509e-02f, +5.011899875e-02f, +1.135715111e-02f, -4.946349911e-02f, -8.160646843e-03f, +4.578788574e-02f, +4.966654293e-03f, -3.967234657e-02f, -2.260756634e-03f, +3.204847761e-02f, +3.440498641e-04f, -2.398674922e-02f, +7.116722567e-04f, +1.646884962e-02f, -1.037379463e-03f, -1.020682850e-02f, +8.868803424e-04f, +5.551634964e-03f, -5.372999074e-04f, -2.502485489e-03f, +2.055423531e-04f, +6.697477416e-04f, -1.116508179e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.340588755e-05f, +2.700344492e-05f, +9.092735126e-05f, -1.055174142e-04f, -1.934780934e-04f, +2.376126283e-04f, +3.364802418e-04f, -4.465353040e-04f, -5.072156049e-04f, +7.373056101e-04f, +6.816348387e-04f, -1.098076332e-03f, -8.287854638e-04f, +1.497901017e-03f, +9.182612062e-04f, -1.889681393e-03f, -9.285195307e-04f, +2.218339760e-03f, +8.533715254e-04f, -2.432459817e-03f, -7.043854709e-04f, +2.496265270e-03f, +5.082509356e-04f, -2.398421082e-03f, -2.998537883e-04f, +2.154957710e-03f, +1.132694617e-04f, -1.805389067e-03f, +2.646295790e-05f, +1.403202629e-03f, -1.083063974e-04f, -1.003593071e-03f, +1.356976152e-04f, +6.519991251e-04f, -1.228927735e-04f, -3.764861458e-04f, +8.889005515e-05f, +1.855481789e-04f, -5.122527963e-05f, -7.107155702e-05f, +1.431724768e-05f, +1.659558457e-05f, +0.000000000e+00f,\n    /*  8, 6 (44) */\n    +0.000000000e+00f, -4.483260934e-04f, -5.967446031e-04f, +1.121809141e-03f, +1.618008694e-03f, -2.100063522e-03f, -3.545881689e-03f, +3.306321346e-03f, +6.819906305e-03f, -4.544448948e-03f, -1.201084776e-02f, +5.465212517e-03f, +1.995109049e-02f, -5.501909915e-03f, -3.215922744e-02f, +3.661296318e-03f, +5.234415903e-02f, +2.378279796e-03f, -9.366793640e-02f, -2.237597355e-02f, +2.594047022e-01f, +4.737716316e-01f, +3.672770223e-01f, +6.820218374e-02f, -9.640055725e-02f, -3.883711299e-02f, +4.786103340e-02f, +2.732513942e-02f, -2.671079272e-02f, -1.985100360e-02f, +1.503725377e-02f, +1.412692124e-02f, -8.112262196e-03f, -9.587059646e-03f, +4.023902230e-03f, +6.069819167e-03f, -1.742007841e-03f, -3.490730637e-03f, +5.984780117e-04f, +1.744196306e-03f, -1.245324146e-04f, -6.840649893e-04f, -5.430502781e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.372624758e-05f, -2.466949175e-05f, -6.343626354e-05f, +5.270062244e-05f, +1.383283922e-04f, -8.733998399e-05f, -2.657533541e-04f, +1.200035216e-04f, +4.676710644e-04f, -1.343247226e-04f, -7.738312790e-04f, +1.014980978e-04f, +1.232079723e-03f, +3.339690446e-05f, -1.941403888e-03f, -4.051705618e-04f, +3.177813682e-03f, +1.545062632e-03f, -6.130361963e-03f, -9.715907479e-03f, -2.325608775e-03f, +7.906847652e-03f, +8.757605971e-03f, +1.256135034e-03f, -3.478576103e-03f, -1.188105689e-03f, +1.865746873e-03f, +9.431088328e-04f, -1.071611160e-03f, -7.091489576e-04f, +6.140477072e-04f, +5.055862801e-04f, -3.384108386e-04f, -3.378128593e-04f, +1.745977306e-04f, +2.077262260e-04f, -8.225001081e-05f, -1.141051959e-04f, +3.458939389e-05f, +5.276927238e-05f, -1.298056784e-05f, -1.737870626e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.483260934e-04f, +5.967446031e-04f, -1.665738863e-03f, -2.123063457e-03f, +3.879574710e-03f, +4.260224910e-03f, -7.467517812e-03f, -7.107356059e-03f, +1.260104465e-02f, +1.037582618e-02f, -1.917784451e-02f, -1.359517815e-02f, +2.675256998e-02f, +1.620994727e-02f, -3.455033201e-02f, -1.771696373e-02f, +4.157684508e-02f, +1.780154150e-02f, -4.680824735e-02f, -1.642799490e-02f, +4.941461328e-02f, +1.385341638e-02f, -4.895524817e-02f, -1.055906793e-02f, +4.548803195e-02f, +7.121612003e-03f, -3.955907711e-02f, -4.066145701e-03f, +3.207494056e-02f, +1.747252493e-03f, -2.409505562e-02f, -2.919208143e-04f, +1.660454724e-02f, -3.853803383e-04f, -1.032972127e-02f, +5.103941965e-04f, +5.640525020e-03f, -3.517517285e-04f, -2.553710769e-03f, +1.344707961e-04f, +6.840649893e-04f, +5.430502781e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.372624758e-05f, +2.466949175e-05f, +9.261834034e-05f, -9.722521034e-05f, -1.992044890e-04f, +2.220372295e-04f, +3.497032258e-04f, -4.216421221e-04f, -5.321709771e-04f, +7.021860642e-04f, +7.226127060e-04f, -1.053510781e-03f, -8.891331350e-04f, +1.446554062e-03f, +9.993517718e-04f, -1.835805697e-03f, -1.028991470e-03f, +2.167016456e-03f, +9.689080262e-04f, -2.388560283e-03f, -8.281670986e-04f, +2.463421819e-03f, +6.320214768e-04f, -2.378301921e-03f, -4.153515593e-04f, +2.147048585e-03f, +2.136613268e-04f, -1.807323043e-03f, -5.449132512e-05f, +1.411508730e-03f, -4.815859980e-05f, -1.014615202e-03f, +9.497637221e-05f, +6.627082172e-04f, -9.822773494e-05f, -3.849745594e-04f, +7.595580378e-05f, +1.911241015e-04f, -4.574722876e-05f, -7.401001638e-05f, +1.298056784e-05f, +1.737870626e-05f, +0.000000000e+00f,\n    /*  8, 7 (44) */\n    +0.000000000e+00f, -4.245998458e-04f, -6.214140948e-04f, +1.058372877e-03f, +1.670709316e-03f, -1.961735130e-03f, -3.633221673e-03f, +3.040567992e-03f, +6.939909826e-03f, -4.076777884e-03f, -1.214517248e-02f, +4.691381238e-03f, +2.005258858e-02f, -4.269830192e-03f, -3.212583053e-02f, +1.719892430e-03f, +5.193898847e-02f, +5.556093478e-03f, -9.212287376e-02f, -2.850633551e-02f, +2.496887948e-01f, +4.714460229e-01f, +3.751838699e-01f, +7.695978971e-02f, -9.514442221e-02f, -4.231568910e-02f, +4.667292771e-02f, +2.919088629e-02f, -2.576768389e-02f, -2.092261476e-02f, +1.432810481e-02f, +1.474096895e-02f, -7.606675916e-03f, -9.925470485e-03f, +3.686089371e-03f, +6.244416898e-03f, -1.534281615e-03f, -3.572980648e-03f, +4.843728157e-04f, +1.778785700e-03f, -7.176314224e-05f, -6.970455571e-04f, -2.280920904e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.396669449e-05f, -2.233858996e-05f, -6.433115545e-05f, +4.750568960e-05f, +1.400271590e-04f, -7.724478239e-05f, -2.680498294e-04f, +1.021305455e-04f, +4.696580509e-04f, -1.047331584e-04f, -7.733381554e-04f, +5.475298431e-05f, +1.224545909e-03f, +1.052606080e-04f, -1.916834922e-03f, -5.153502663e-04f, +3.108878884e-03f, +1.717596983e-03f, -5.887019779e-03f, -9.771114886e-03f, -2.674734318e-03f, +7.688411219e-03f, +8.905229318e-03f, +1.504807565e-03f, -3.449884991e-03f, -1.314443263e-03f, +1.827672860e-03f, +1.015593691e-03f, -1.038967548e-03f, -7.520015975e-04f, +5.890548917e-04f, +5.306150743e-04f, -3.207233305e-04f, -3.519054467e-04f, +1.630588444e-04f, +2.152455967e-04f, -7.543762803e-05f, -1.178601126e-04f, +3.109080837e-05f, +5.451365104e-05f, -1.156200341e-05f, -1.813654524e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.245998458e-04f, +6.214140948e-04f, -1.573120522e-03f, -2.220288667e-03f, +3.680370221e-03f, +4.482262139e-03f, -7.117814586e-03f, -7.528998181e-03f, +1.206887367e-02f, +1.107801225e-02f, -1.845523181e-02f, -1.464868893e-02f, +2.586343685e-02f, +1.765650133e-02f, -3.355098024e-02f, -1.955276943e-02f, +4.054785361e-02f, +1.996855796e-02f, -4.583933932e-02f, -1.881655519e-02f, +4.858644618e-02f, +1.631683820e-02f, -4.832322670e-02f, -1.293736985e-02f, +4.507268039e-02f, +9.268660589e-03f, -3.934541578e-02f, -5.873468744e-03f, +3.202044924e-02f, +3.158761223e-03f, -2.414321422e-02f, -1.306536016e-03f, +1.669952361e-02f, +2.773278789e-04f, -1.042794901e-02f, +1.254196371e-04f, +5.716480823e-03f, -1.606276271e-04f, -2.599457997e-03f, +6.046077973e-05f, +6.970455571e-04f, +2.280920904e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.396669449e-05f, +2.233858996e-05f, +9.399637063e-05f, -8.887646084e-05f, -2.042716706e-04f, +2.061769061e-04f, +3.617861668e-04f, -3.960345967e-04f, -5.554156132e-04f, +6.656866567e-04f, +7.613033350e-04f, -1.006675221e-03f, -9.467192680e-04f, +1.391892103e-03f, +1.077414432e-03f, -1.777539236e-03f, -1.126450964e-03f, +2.110352850e-03f, +1.081748194e-03f, -2.338652763e-03f, -9.498242216e-04f, +2.424301130e-03f, +7.543958355e-04f, -2.352082522e-03f, -5.302096033e-04f, +2.133629210e-03f, +3.140734770e-04f, -1.804644322e-03f, -1.359389520e-04f, +1.416256979e-03f, +1.273065514e-05f, -1.023133402e-03f, +5.347409763e-05f, +6.718354979e-04f, -7.289338143e-05f, -3.925916505e-04f, +6.254000361e-05f, +1.963056544e-04f, -3.998184953e-05f, -7.682424980e-05f, +1.156200341e-05f, +1.813654524e-05f, +0.000000000e+00f,\n    /*  8, 8 (44) */\n    +0.000000000e+00f, -4.006331513e-04f, -6.437526848e-04f, +9.940417215e-04f, +1.718215006e-03f, -1.821707971e-03f, -3.710466456e-03f, +2.772518163e-03f, +7.042040372e-03f, -3.607119833e-03f, -1.224990564e-02f, +3.918043083e-03f, +2.010734157e-02f, -3.045284283e-03f, -3.202056993e-02f, -1.969424922e-04f, +5.142363821e-02f, +8.664972362e-03f, -9.040527678e-02f, -3.439335529e-02f, +2.399176799e-01f, +4.687712885e-01f, +3.828722811e-01f, +8.586501903e-02f, -9.363961465e-02f, -4.576557409e-02f, +4.535848444e-02f, +3.101855915e-02f, -2.475209020e-02f, -2.196158231e-02f, +1.357610321e-02f, +1.533002384e-02f, -7.076060841e-03f, -1.024619382e-02f, +3.334183924e-03f, +6.407475742e-03f, -1.319036018e-03f, -3.648418276e-03f, +3.665127031e-04f, +1.809876508e-03f, -1.724949120e-05f, -7.086075605e-04f, -4.094575428e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.412899703e-05f, -2.001703818e-05f, -6.504078892e-05f, +4.231252662e-05f, +1.413550798e-04f, -6.715743137e-05f, -2.696791191e-04f, +8.431371580e-05f, +4.705323363e-04f, -7.533986833e-05f, -7.710904031e-04f, +8.536945332e-06f, +1.214355977e-03f, +1.758788128e-04f, -1.888363348e-03f, -6.226678819e-04f, +3.034463845e-03f, +1.882870823e-03f, -5.639815044e-03f, -9.814045284e-03f, -3.020176466e-03f, +7.459689256e-03f, +9.043370036e-03f, +1.756590075e-03f, -3.413161095e-03f, -1.439984936e-03f, +1.784912553e-03f, +1.086825811e-03f, -1.003494338e-03f, -7.937339537e-04f, +5.623463434e-04f, +5.547832275e-04f, -3.020156231e-04f, -3.653998246e-04f, +1.509345828e-04f, +2.223887316e-04f, -6.830491191e-05f, -1.214062683e-04f, +2.742657843e-05f, +5.616245785e-05f, -1.006325487e-05f, -1.886570663e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.006331513e-04f, +6.437526848e-04f, -1.479124152e-03f, -2.309165128e-03f, +3.476098551e-03f, +4.688439045e-03f, -6.756028420e-03f, -7.925032778e-03f, +1.151345806e-02f, +1.174369890e-02f, -1.769392847e-02f, -1.565536415e-02f, +2.491671758e-02f, +1.904839344e-02f, -3.247356581e-02f, -2.133030867e-02f, +3.942140265e-02f, +2.207891081e-02f, -4.475759113e-02f, -2.115520795e-02f, +4.763662196e-02f, +1.874113933e-02f, -4.756883086e-02f, -1.528945237e-02f, +4.454247079e-02f, +1.140228980e-02f, -3.903134231e-02f, -7.678113066e-03f, +3.188451029e-02f, +4.575018202e-03f, -2.413048356e-02f, -2.329669418e-03f, +1.675299771e-02f, +9.491633768e-04f, -1.050084239e-02f, -2.671720134e-04f, +5.779020827e-03f, +3.567802731e-05f, -2.639439847e-03f, -1.636347006e-05f, +7.086075605e-04f, +4.094575428e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.412899703e-05f, +2.001703818e-05f, +9.506618998e-05f, -8.049621737e-05f, -2.086797875e-04f, +1.900800085e-04f, +3.727159975e-04f, -3.697912301e-04f, -5.769113925e-04f, +6.279191849e-04f, +7.976303570e-04f, -9.577121940e-04f, -1.001417649e-03f, +1.334079442e-03f, +1.152266461e-03f, -1.715053605e-03f, -1.220659775e-03f, +2.048510478e-03f, +1.191608132e-03f, -2.282872110e-03f, -1.069045087e-03f, +2.378999080e-03f, +8.750572352e-04f, -2.319814411e-03f, -6.441297486e-04f, +2.114709087e-03f, +4.142463470e-04f, -1.797329261e-03f, -2.176719137e-04f, +1.417403325e-03f, +7.420923400e-05f, -1.029096508e-03f, +1.129083210e-05f, +6.793336019e-04f, -4.694729371e-05f, -3.993005730e-04f, +4.867011854e-05f, +2.010686993e-04f, -3.393849481e-05f, -7.950140619e-05f, +1.006325487e-05f, +1.886570663e-05f, +0.000000000e+00f,\n    /*  8, 9 (44) */\n    +0.000000000e+00f, -3.765041543e-04f, -6.637697230e-04f, +9.290009326e-04f, +1.760527533e-03f, -1.680352891e-03f, -3.777623887e-03f, +2.502839044e-03f, +7.126354088e-03f, -3.136587497e-03f, -1.232524551e-02f, +3.146952680e-03f, +2.011587851e-02f, -1.830928306e-03f, -3.184469111e-02f, -2.085305840e-03f, +5.080097032e-02f, +1.169943621e-02f, -8.852240596e-02f, -4.003317034e-02f, +2.301036346e-01f, +4.657511121e-01f, +3.903319704e-01f, +9.490838907e-02f, -9.188302457e-02f, -4.917873518e-02f, +4.391849951e-02f, +3.280347170e-02f, -2.366526438e-02f, -2.296507664e-02f, +1.278236926e-02f, +1.589237018e-02f, -6.521277614e-03f, -1.054820944e-02f, +2.968784100e-03f, +6.558410325e-03f, -1.096647286e-03f, -3.716723188e-03f, +2.451064348e-04f, +1.837303087e-03f, +3.891296665e-05f, -7.186708154e-04f, -5.981146091e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.421511060e-05f, -1.771094961e-05f, -6.556783713e-05f, +3.713412602e-05f, +1.423163382e-04f, -5.710205251e-05f, -2.706488403e-04f, +6.659394642e-05f, +4.703089230e-04f, -4.620975957e-05f, -7.671179684e-04f, -3.705235275e-05f, +1.201569264e-03f, +2.451114403e-04f, -1.856107526e-03f, -7.269367777e-04f, +2.954814590e-03f, +2.040716467e-03f, -5.389171783e-03f, -9.844719429e-03f, -3.361462821e-03f, +7.220960571e-03f, +9.171734749e-03f, +2.011114502e-03f, -3.368330420e-03f, -1.564448624e-03f, +1.737490298e-03f, +1.156627495e-03f, -9.652327035e-04f, -8.342347209e-04f, +5.339595571e-04f, +5.780218488e-04f, -2.823162196e-04f, -3.782544149e-04f, +1.382441196e-04f, +2.291314354e-04f, -6.086322209e-05f, -1.247302240e-04f, +2.360234839e-05f, +5.770865334e-05f, -8.486307925e-06f, -1.956278904e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.765041543e-04f, +6.637697230e-04f, -1.384057962e-03f, -2.389661345e-03f, +3.267418763e-03f, +4.878519054e-03f, -6.383312422e-03f, -8.294824008e-03f, +1.093654667e-02f, +1.237161809e-02f, -1.689629811e-02f, -1.661307635e-02f, +2.391529993e-02f, +2.038247288e-02f, -3.132129935e-02f, -2.304536227e-02f, +3.820074287e-02f, +2.412742129e-02f, -4.356598299e-02f, -2.343808006e-02f, +4.656757688e-02f, +2.112013841e-02f, -4.669377363e-02f, -1.760926678e-02f, +4.389834104e-02f, +1.351699889e-02f, -3.861709596e-02f, -9.475442327e-03f, +3.166683837e-02f, +5.992421528e-03f, -2.405627433e-02f, -3.358765927e-03f, +1.676428854e-02f, +1.628496979e-03f, -1.054778968e-02f, -6.664725864e-04f, +5.827690945e-03f, +2.367467266e-04f, -2.673378342e-03f, -9.586487626e-05f, +7.186708154e-04f, +5.981146091e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.421511060e-05f, +1.771094961e-05f, +9.583336027e-05f, -7.210903727e-05f, -2.124308514e-04f, +1.737946493e-04f, +3.824830127e-04f, -3.429910801e-04f, -5.966253717e-04f, +5.889974946e-04f, +8.315244415e-04f, -9.067685159e-04f, -1.053110646e-03f, +1.273287459e-03f, +1.223734587e-03f, -1.648530526e-03f, -1.311389056e-03f, +1.981663839e-03f, +1.298212264e-03f, -2.221368260e-03f, -1.185524330e-03f, +2.327627661e-03f, +9.936928337e-04f, -2.281564981e-03f, -7.568152173e-04f, +2.090312125e-03f, +5.139195696e-04f, -1.785366232e-03f, -2.994798621e-04f, +1.414912861e-03f, +1.361219172e-04f, -1.032459620e-03f, -3.147027837e-05f, +6.851589268e-04f, -2.044965488e-05f, -4.050663648e-04f, +3.437545963e-05f, +2.053897813e-04f, -2.762760690e-05f, -8.202870318e-05f, +8.486307925e-06f, +1.956278904e-05f, +0.000000000e+00f,\n    /*  8,10 (44) */\n    +0.000000000e+00f, -3.522890437e-04f, -6.814806726e-04f, +8.634330955e-04f, +1.797661659e-03f, -1.538036552e-03f, -3.834725940e-03f, +2.232190203e-03f, +7.192948034e-03f, -2.666278574e-03f, -1.237145527e-02f, +2.379834711e-03f, +2.007882616e-02f, -6.293590427e-04f, -3.159957967e-02f, -3.941413366e-03f, +5.007403355e-02f, +1.465425080e-02f, -8.648168949e-02f, -4.542234212e-02f, +2.202589152e-01f, +4.623896493e-01f, +3.975529310e-01f, +1.040801238e-01f, -8.987191007e-02f, -5.254706560e-02f, +4.235405088e-02f, +3.454096200e-02f, -2.250863689e-02f, -2.393030935e-02f, +1.194813454e-02f, +1.642632974e-02f, -5.943255765e-03f, -1.083052566e-02f, +2.590529685e-03f, +6.696654445e-03f, -8.675158509e-04f, -3.777586410e-03f, +1.203762108e-04f, +1.860905435e-03f, +9.662161999e-05f, -7.271571233e-04f, -7.937424996e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.422716675e-05f, -1.542623912e-05f, -6.591539633e-05f, +3.198316856e-05f, +1.429159500e-04f, -4.710225478e-05f, -2.709680669e-04f, +4.901127214e-05f, +4.690051627e-04f, -1.740619401e-05f, -7.614543474e-04f, -8.191999454e-05f, +1.186250152e-03f, +3.128233666e-04f, -1.820192390e-03f, -8.279793927e-04f, +2.870183705e-03f, +2.190981361e-03f, -5.135515976e-03f, -9.863177323e-03f, -3.698127934e-03f, +6.972520433e-03f, +9.290043881e-03f, +2.268004217e-03f, -3.315333055e-03f, -1.687550236e-03f, +1.685440871e-03f, +1.224821774e-03f, -9.242306866e-04f, -8.733938990e-04f, +5.039364399e-04f, +6.002632396e-04f, -2.616563963e-04f, -3.904285214e-04f, +1.250083200e-04f, +2.354500713e-04f, -5.312490959e-05f, -1.278188358e-04f, +1.962431458e-05f, +5.914530952e-05f, -6.833434631e-06f, -2.022439527e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.522890437e-04f, +6.814806726e-04f, -1.288224602e-03f, -2.461770383e-03f, +3.054987912e-03f, +5.052313703e-03f, -6.000829409e-03f, -8.637815088e-03f, +1.033992130e-02f, +1.296061558e-02f, -1.606477367e-02f, -1.751984486e-02f, +2.286218928e-02f, +2.165576034e-02f, -3.009756476e-02f, -2.469389280e-02f, +3.688935382e-02f, +2.610908513e-02f, -4.226777073e-02f, -2.565944832e-02f, +4.538205255e-02f, +2.344776607e-02f, -4.570008079e-02f, -1.989083176e-02f, +4.314152582e-02f, +1.560731101e-02f, -3.810317639e-02f, -1.126080856e-02f, +3.136735851e-02f, +7.407334389e-03f, -2.392015241e-02f, -4.391225546e-03f, +1.673281826e-02f, +2.313655906e-03f, -1.056823934e-02f, -1.071538951e-03f, +5.862066405e-03f, +4.421365079e-04f, -2.701005949e-03f, -1.778935794e-04f, +7.271571233e-04f, +7.937424996e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.422716675e-05f, +1.542623912e-05f, +9.630421979e-05f, -6.373892123e-05f, -2.155286933e-04f, +1.573685710e-04f, +3.910808416e-04f, -3.157135344e-04f, -6.145298076e-04f, +5.490371495e-04f, +8.629234091e-04f, -8.539948454e-04f, -1.101689457e-03f, +1.209694110e-03f, +1.291655395e-03f, -1.578161324e-03f, -1.398419915e-03f, +1.909999891e-03f, +1.401294039e-03f, -2.154305823e-03f, -1.298963777e-03f, +2.270314702e-03f, +1.109994551e-03f, -2.237417363e-03f, -8.679714118e-04f, +2.060476642e-03f, +6.128326608e-04f, -1.768755735e-03f, -3.811506542e-04f, +1.408759996e-03f, +1.983107871e-04f, -1.033184287e-03f, -7.470322627e-05f, +6.892718057e-04f, +6.536878019e-06f, -4.098560803e-04f, +1.968713542e-05f, +2.092462143e-04f, -2.106071123e-05f, -8.439347096e-05f, +6.833434631e-06f, +2.022439527e-05f, +0.000000000e+00f,\n    /*  8,11 (44) */\n    +0.000000000e+00f, -3.280618770e-04f, -6.969069117e-04f, +7.975176992e-04f, +1.829644827e-03f, -1.395120602e-03f, -3.881828194e-03f, +1.961222136e-03f, +7.241959306e-03f, -2.197273411e-03f, -1.238886146e-02f, +1.618380364e-03f, +1.999690617e-02f, +5.568911090e-04f, -3.128675631e-02f, -5.761605756e-03f, +4.924605415e-02f, +1.752443450e-02f, -8.429070813e-02f, -5.055785810e-02f, +2.103957378e-01f, +4.586915213e-01f, +4.045254514e-01f, +1.133701677e-01f, -8.760390585e-02f, -5.586239866e-02f, +4.066650065e-02f, +3.622640287e-02f, -2.128381512e-02f, -2.485454003e-02f, +1.107474064e-02f, +1.693026618e-02f, -5.342992525e-03f, -1.109218205e-02f, +2.200101163e-03f, +6.821662764e-03f, -6.320657796e-04f, -3.830711319e-03f, -7.442625010e-06f, +1.880529750e-03f, +1.557669295e-04f, -7.339905580e-04f, -9.959864522e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.416746233e-05f, -1.316861113e-05f, -6.608696828e-05f, +2.687199657e-05f, +1.431597354e-04f, -3.718108509e-05f, -2.706472842e-04f, +3.160476641e-05f, +4.666406816e-04f, +1.100913829e-05f, -7.541364601e-04f, -1.259739956e-04f, +1.168467854e-03f, +3.788846557e-04f, -1.780749095e-03f, -9.256274826e-04f, +2.780829778e-03f, +2.333528214e-03f, -4.879274799e-03f, -9.869478069e-03f, -4.029714077e-03f, +6.714680117e-03f, +9.398032212e-03f, +2.526874633e-03f, -3.254123434e-03f, -1.809004221e-03f, +1.628809553e-03f, +1.291232807e-03f, -8.805431766e-04f, -9.111030623e-04f, +4.723232733e-04f, +6.214410693e-04f, -2.400701682e-04f, -4.018824413e-04f, +1.112497165e-04f, +2.413216300e-04f, -4.510330362e-05f, -1.306592947e-04f, +1.549922050e-05f, +6.046563196e-05f, -5.107193698e-06f, -2.084714333e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.280618770e-04f, +6.969069117e-04f, -1.191920382e-03f, -2.525509304e-03f, +2.839459219e-03f, +5.209682274e-03f, -5.609748568e-03f, -8.953528623e-03f, +9.725391489e-03f, +1.350965273e-02f, -1.520185026e-02f, -1.837383971e-02f, +2.176049983e-02f, +2.286545445e-02f, -2.880590937e-02f, -2.627205412e-02f, +3.549093390e-02f, +2.801908502e-02f, -4.086647669e-02f, -2.781375414e-02f, +4.408308877e-02f, +2.571808077e-02f, -4.459008624e-02f, -2.212824912e-02f, +4.227355441e-02f, +1.766778765e-02f, -3.749034373e-02f, -1.302956429e-02f, +3.098620786e-02f, +8.816094385e-03f, -2.372184162e-02f, -5.424409833e-03f, +1.665811503e-02f, +3.002927711e-03f, -1.056170246e-02f, -1.481395032e-03f, +5.881753541e-03f, +6.513827222e-04f, -2.722066660e-03f, -2.622870504e-04f, +7.339905580e-04f, +9.959864522e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.416746233e-05f, +1.316861113e-05f, +9.648584411e-05f, -5.540925410e-05f, -2.179789158e-04f, +1.408490179e-04f, +3.985064122e-04f, -2.880380885e-04f, -6.306021650e-04f, +5.081550995e-04f, +8.917723239e-04f, -7.995452478e-04f, -1.147054322e-03f, +1.143483410e-03f, +1.355875694e-03f, -1.504146369e-03f, -1.481543950e-03f, +1.833717525e-03f, +1.500596614e-03f, -2.081863637e-03f, -1.409073225e-03f, +2.207203543e-03f, +1.223659887e-03f, -2.187470241e-03f, -9.773066992e-04f, +2.025255326e-03f, +7.107257092e-04f, -1.747510474e-03f, -4.624709043e-04f, +1.398928609e-03f, +2.606156279e-04f, -1.031238692e-03f, -1.182993974e-04f, +6.916366713e-04f, +3.394731136e-05f, -4.136389188e-04f, +4.637995848e-06f, +2.126161649e-04f, -1.425040657e-05f, -8.658319699e-05f, +5.107193698e-06f, +2.084714333e-05f, +0.000000000e+00f,\n    /*  8,12 (44) */\n    +0.000000000e+00f, -3.038944146e-04f, -7.100755228e-04f, +7.314307309e-04f, +1.856516824e-03f, -1.251960867e-03f, -3.919009279e-03f, +1.690574852e-03f, +7.273564073e-03f, -1.730632730e-03f, -1.237785232e-02f, +8.642439036e-04f, +1.987093217e-02f, +1.725358962e-03f, -3.090787165e-02f, -7.542354851e-03f, +4.832042667e-02f, +2.030526428e-02f, -8.195717992e-02f, -5.543713289e-02f, +2.005262598e-01f, +4.546618072e-01f, +4.112401315e-01f, +1.227681999e-01f, -8.507703122e-02f, -5.911652209e-02f, +3.885749643e-02f, +3.785521243e-02f, -1.999258231e-02f, -2.573508321e-02f, +1.016363758e-02f, +1.740258945e-02f, -4.721551456e-03f, -1.133225222e-02f, +1.798218722e-03f, +6.932912481e-03f, -3.907441495e-04f, -3.875814623e-03f, -1.381019197e-04f, +1.896028970e-03f, +2.162325615e-04f, -7.390977517e-04f, -1.204457886e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.403844844e-05f, -1.094354843e-05f, -6.608644198e-05f, +2.181258871e-05f, +1.430542885e-04f, -2.736098108e-05f, -2.696983397e-04f, +1.441246259e-05f, +4.632372998e-04f, +3.897633968e-05f, -7.452045187e-04f, -1.691254733e-04f, +1.148296197e-03f, +4.431707792e-04f, -1.737914652e-03f, -1.019722344e-03f, +2.687016826e-03f, +2.468235104e-03f, -4.620875869e-03f, -9.863699687e-03f, -4.355771999e-03f, +6.447766409e-03f, +9.495449409e-03f, +2.787333827e-03f, -3.184670576e-03f, -1.928524116e-03f, +1.567652161e-03f, +1.355686285e-03f, -8.342318778e-04f, -9.472556282e-04f, +4.391706653e-04f, +6.414905504e-04f, -2.175942485e-04f, -4.125775763e-04f, +9.699248076e-05f, +2.467237975e-04f, -3.681269562e-05f, -1.332391668e-04f, +1.123435021e-05f, +6.166298190e-05f, -3.310429977e-06f, -2.142767771e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.038944146e-04f, +7.100755228e-04f, -1.095434538e-03f, -2.580918558e-03f, +2.621480303e-03f, +5.350531292e-03f, -5.211242156e-03f, -9.241566711e-03f, +9.094789324e-03f, +1.401780783e-02f, -1.431007794e-02f, -1.917338496e-02f, +2.061344550e-02f, +2.400893786e-02f, -2.745003367e-02f, -2.777620049e-02f, +3.400938995e-02f, +2.985280254e-02f, -3.936588008e-02f, -2.989561778e-02f, +4.267401554e-02f, +2.792528431e-02f, -4.336642635e-02f, -2.431571937e-02f, +4.129624771e-02f, +1.969304298e-02f, -3.677961802e-02f, -1.477707477e-02f, +3.052373695e-02f, +1.021502299e-02f, -2.346122599e-02f, -6.455648525e-03f, +1.653981564e-02f, +3.694564383e-03f, -1.052775515e-02f, -1.895033950e-03f, +5.886391536e-03f, +8.639988871e-04f, -2.736317066e-03f, -3.488702474e-04f, +7.390977517e-04f, +1.204457886e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.403844844e-05f, +1.094354843e-05f, +9.638600554e-05f, -4.714274876e-05f, -2.197888415e-04f, +1.242826112e-04f, +4.047599059e-04f, -2.600441250e-04f, -6.448251093e-04f, +4.664693497e-04f, +9.180235657e-04f, -7.435767528e-04f, -1.189114717e-03f, +1.074844904e-03f, +1.416252865e-03f, -1.426694509e-03f, -1.560563756e-03f, +1.753027009e-03f, +1.595873504e-03f, -2.004234274e-03f, -1.515571199e-03f, +2.138452665e-03f, +1.334392726e-03f, -2.131837634e-03f, -1.084533190e-03f, +1.984715161e-03f, +8.073400673e-04f, -1.721655398e-03f, -5.432265444e-04f, +1.385412165e-03f, +3.228743345e-04f, -1.026597802e-03f, -1.621478363e-04f, +6.922222111e-04f, +6.171446108e-05f, -4.163863488e-04f, -1.073742985e-05f, +2.154787367e-04f, -7.210351542e-06f, -8.858557120e-05f, +3.310429977e-06f, +2.142767771e-05f, +0.000000000e+00f,\n    /*  8,13 (44) */\n    +0.000000000e+00f, -2.798559662e-04f, -7.210190713e-04f, +6.653442889e-04f, +1.878329412e-03f, -1.108906579e-03f, -3.946370260e-03f, +1.420876512e-03f, +7.287976535e-03f, -1.267395430e-03f, -1.233887598e-02f, +1.190393849e-04f, +1.970180670e-02f, +2.873655160e-03f, -3.046470087e-02f, -9.280269503e-03f, +4.730070433e-02f, +2.299228111e-02f, -7.948894481e-02f, -6.005800876e-02f, +1.906625601e-01f, +4.503060352e-01f, +4.176878979e-01f, +1.322636493e-01f, -8.228969739e-02f, -6.230119267e-02f, +3.692897231e-02f, +3.942286459e-02f, -1.863689602e-02f, -2.656931509e-02f, +9.216381950e-03f, +1.784176012e-02f, -4.080060906e-03f, -1.154984647e-02f, +1.385641146e-03f, +7.029904962e-03f, -1.440203520e-04f, -3.912627319e-03f, -2.713410865e-04f, +1.907263320e-03f, +2.778955434e-04f, -7.424081816e-04f, -1.418734663e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.384271908e-05f, -8.756301760e-06f, -6.591807472e-05f, +1.681653613e-05f, +1.426069468e-04f, -1.766372628e-05f, -2.681343925e-04f, -2.528721062e-06f, +4.588189477e-04f, +6.643741972e-05f, -7.347018899e-04f, -2.112888089e-04f, +1.125813399e-03f, +5.055628209e-04f, -1.691831560e-03f, -1.110115020e-03f, +2.589013718e-03f, +2.594995548e-03f, -4.360746493e-03f, -9.845938909e-03f, -4.675861675e-03f, +6.172121094e-03f, +9.582060540e-03f, +3.048983182e-03f, -3.106958292e-03f, -2.045823112e-03f, +1.502035079e-03f, +1.418009831e-03f, -7.853652598e-04f, -9.817471263e-04f, +4.045334914e-04f, +6.603486128e-04f, -1.942679996e-04f, -4.224765426e-04f, +8.226239070e-05f, +2.516350224e-04f, -2.826832053e-05f, -1.355464329e-04f, +6.837520235e-06f, +6.273089843e-05f, -1.446273059e-06f, -2.196268072e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.798559662e-04f, +7.210190713e-04f, -9.990485321e-04f, -2.628061307e-03f, +2.401691461e-03f, +5.474813903e-03f, -4.806482250e-03f, -9.501610836e-03f, +8.449964215e-03f, +1.448427718e-02f, -1.339205437e-02f, -1.991696171e-02f, +1.942433079e-02f, +2.508378276e-02f, -2.603378081e-02f, -2.920289500e-02f, +3.244882620e-02f, +3.160582955e-02f, -3.777000657e-02f, -3.189985205e-02f, +4.115844435e-02f, +3.006373698e-02f, -4.203203363e-02f, -2.644755700e-02f, +4.021171452e-02f, +2.167775814e-02f, -3.597227795e-02f, -1.649873017e-02f, +2.998051041e-02f, +1.160043516e-02f, -2.313835166e-02f, -7.482246328e-03f, +1.637766780e-02f, +4.386786594e-03f, -1.046604069e-02f, -2.311420299e-03f, +5.875654107e-03f, +1.079477624e-03f, -2.743527418e-03f, -4.374558186e-04f, +7.424081816e-04f, +1.418734663e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.384271908e-05f, +8.756301760e-06f, +9.601313121e-05f, -3.896139322e-05f, -2.209674568e-04f, +1.077152281e-04f, +4.098447046e-04f, -2.318106980e-04f, -6.571864865e-04f, +4.240986292e-04f, +9.416368807e-04f, -6.862489085e-04f, -1.227789521e-03f, +1.003973129e-03f, +1.472655172e-03f, -1.346022477e-03f, -1.635293398e-03f, +1.668149396e-03f, +1.686889213e-03f, -1.921623528e-03f, -1.618185689e-03f, +2.064235287e-03f, +1.441904120e-03f, -2.070648629e-03f, -1.189367509e-03f, +1.938937307e-03f, +9.024190434e-04f, -1.691227717e-03f, -6.232033897e-04f, +1.368213823e-03f, +3.849233317e-04f, -1.019243517e-03f, -2.061355206e-04f, +6.910015121e-04f, +8.976910722e-05f, -4.180722284e-04f, -2.640300149e-05f, +2.178140521e-04f, +4.475248966e-08f, -9.038853164e-05f, +1.446273059e-06f, +2.196268072e-05f, +0.000000000e+00f,\n    /*  8,14 (44) */\n    +0.000000000e+00f, -2.560132471e-04f, -7.297753730e-04f, +5.994262142e-04f, +1.895145949e-03f, -9.662996318e-04f, -3.964033987e-03f, +1.152742120e-03f, +7.285447814e-03f, -8.085764820e-04f, -1.227243856e-02f, -6.156625050e-04f, +1.949051789e-02f, +3.999468559e-03f, -2.995913805e-02f, -1.097210106e-02f, +4.619058931e-02f, +2.558129482e-02f, -7.689394926e-02f, -6.441875526e-02f, +1.808166212e-01f, +4.456301736e-01f, +4.238600190e-01f, +1.418457099e-01f, -7.924071421e-02f, -6.540815096e-02f, +3.488314920e-02f, +4.092489967e-02f, -1.721888619e-02f, -2.735468035e-02f, +8.234634824e-03f, +1.824629361e-02f, -3.419712293e-03f, -1.174411447e-02f, +9.631646030e-04f, +7.112167352e-03f, +1.076146704e-04f, -3.940895639e-03f, -4.068875194e-04f, +1.914100841e-03f, +3.406264418e-04f, -7.438544547e-04f, -1.638361470e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.358299974e-05f, -6.611880398e-06f, -6.558647250e-05f, +1.189502014e-05f, +1.418257581e-04f, -8.110407545e-06f, -2.659698591e-04f, -1.918305259e-05f, +4.534115778e-04f, +9.333640378e-05f, -7.226749513e-04f, -2.523817992e-04f, +1.101101830e-03f, +5.659476670e-04f, -1.642647427e-03f, -1.196666476e-03f, +2.487093602e-03f, +2.713718553e-03f, -4.099312916e-03f, -9.816310925e-03f, -4.989553031e-03f, +5.888100406e-03f, +9.657646552e-03f, +3.311418047e-03f, -3.020985374e-03f, -2.160614618e-03f, +1.432035250e-03f, +1.478033405e-03f, -7.340184918e-04f, -1.014475465e-03f, +3.684708245e-04f, +6.779540756e-04f, -1.701333783e-04f, -4.315432790e-04f, +6.708679320e-05f, +2.560345824e-04f, -1.948633533e-05f, -1.375695279e-04f, +2.317069827e-06f, +6.366312058e-05f, +4.818649841e-07f, -2.244888408e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.560132471e-04f, +7.297753730e-04f, -9.030354009e-04f, -2.667022700e-03f, +2.180724004e-03f, +5.582529131e-03f, -4.396637545e-03f, -9.733421534e-03f, +7.792777728e-03f, +1.490837581e-02f, -1.245041749e-02f, -2.060321062e-02f, +1.819654127e-02f, +2.608775589e-02f, -2.456112564e-02f, -3.054891748e-02f, +3.081353280e-02f, +3.327397895e-02f, -3.608311736e-02f, -3.382147558e-02f, +3.954025866e-02f, +3.212797226e-02f, -4.059012951e-02f, -2.851820563e-02f, +3.902234701e-02f, +2.361669545e-02f, -3.506985891e-02f, -1.818995788e-02f, +2.935730702e-02f, +1.296864898e-02f, -2.275342833e-02f, -8.501489845e-03f, +1.617153228e-02f, +5.077788106e-03f, -1.037627158e-02f, -2.729492528e-03f, +5.849251105e-03f, +1.297291676e-03f, -2.743482666e-03f, -5.278443502e-04f, +7.438544547e-04f, +1.638361470e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.358299974e-05f, +6.611880398e-06f, +9.537626022e-05f, -3.088640110e-05f, -2.215253523e-04f, +9.119188536e-05f, +4.137673286e-04f, -2.034163201e-04f, -6.676792871e-04f, +3.811620628e-04f, +9.625794128e-04f, -6.277233333e-04f, -1.263007155e-03f, +9.310670614e-04f, +1.524962044e-03f, -1.262354277e-03f, -1.705558856e-03f, +1.579315914e-03f, +1.773419819e-03f, -1.834249851e-03f, -1.716654862e-03f, +1.984738917e-03f, +1.545913065e-03f, -2.004047085e-03f, -1.291531559e-03f, +1.888016951e-03f, +9.957085918e-04f, -1.656276876e-03f, -7.021877095e-04f, +1.347346503e-03f, +4.465980006e-04f, -1.009164789e-03f, -2.501476454e-04f, +6.879521958e-04f, +1.180401565e-04f, -4.186729204e-04f, -4.232104223e-05f, +2.196033337e-04f, +7.499182172e-06f, -9.198031050e-05f, -4.818649841e-07f, +2.244888408e-05f, +0.000000000e+00f,\n    /*  8,15 (44) */\n    +0.000000000e+00f, -2.324302474e-04f, -7.363872534e-04f, +5.338397417e-04f, +1.907040969e-03f, -8.244738737e-04f, -3.972144394e-03f, +8.867722608e-04f, +7.266264762e-03f, -3.551649042e-04f, -1.217910216e-02f, -1.338337456e-03f, +1.923813609e-02f, +5.100570388e-03f, -2.939319038e-02f, -1.261474849e-02f, +4.499392283e-02f, +2.806838843e-02f, -7.418023071e-02f, -6.851806817e-02f, +1.710003103e-01f, +4.406406205e-01f, +4.297481194e-01f, +1.515033564e-01f, -7.592929617e-02f, -6.842913633e-02f, +3.272253458e-02f, +4.235693492e-02f, -1.574085279e-02f, -2.808869884e-02f, +7.220159360e-03f, +1.861476443e-02f, -2.741758217e-03f, -1.191424785e-02f, +5.316213240e-04f, +7.179254146e-03f, +3.636492528e-04f, -3.960381975e-03f, -5.444570472e-04f, +1.916417910e-03f, +4.042895624e-04f, -7.433725897e-04f, -1.862850311e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.326213574e-05f, -4.515043563e-06f, -6.509656988e-05f, +7.058791348e-06f, +1.407194469e-04f, +1.278624870e-06f, -2.632203577e-04f, -3.551605358e-05f, +4.470430736e-04f, +1.196194356e-04f, -7.091729436e-04f, -2.923257993e-04f, +1.074247776e-03f, +6.242181808e-04f, -1.590514587e-03f, -1.279247763e-03f, +2.381533322e-03f, +2.824328624e-03f, -3.836999584e-03f, -9.774949114e-03f, -5.296426649e-03f, +5.596074459e-03f, +9.722004727e-03f, +3.574228409e-03f, -2.926765753e-03f, -2.272612832e-03f, +1.357740153e-03f, +1.535589709e-03f, -6.802733621e-04f, -1.045341195e-03f, +3.310458549e-04f, +6.942478174e-04f, -1.452348731e-04f, -4.397431547e-04f, +5.149456241e-05f, +2.599026502e-04f, -1.048379485e-05f, -1.392973795e-04f, -2.318150385e-06f, +6.445360941e-05f, +2.470292752e-06f, -2.288308057e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.324302474e-04f, +7.363872534e-04f, -8.076591407e-04f, -2.697909101e-03f, +1.959198652e-03f, +5.673721017e-03f, -3.982870217e-03f, -9.936837854e-03f, +7.125098441e-03f, +1.528953787e-02f, -1.148783808e-02f, -2.123093395e-02f, +1.693353411e-02f, +2.701882295e-02f, -2.303616359e-02f, -3.181127175e-02f, +2.910797394e-02f, +3.485329486e-02f, -3.430969754e-02f, -3.565572543e-02f, +3.782360379e-02f, +3.411271118e-02f, -3.904421644e-02f, -3.052225271e-02f, +3.773081546e-02f, +2.550471240e-02f, -3.407415032e-02f, -1.984623476e-02f, +2.865511931e-02f, +1.431599548e-02f, -2.230683033e-02f, -9.510654634e-03f, +1.592138463e-02f, +5.765740302e-03f, -1.025823142e-02f, -3.148165448e-03f, +5.806930063e-03f, +1.516895010e-03f, -2.735983483e-03f, -6.198246607e-04f, +7.433725897e-04f, +1.862850311e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.326213574e-05f, +4.515043563e-06f, +9.448499971e-05f, -2.293816556e-05f, -2.214746593e-04f, +7.475662740e-05f, +4.165373671e-04f, -1.749387546e-04f, -6.763015984e-04f, +3.377788445e-04f, +9.808257139e-04f, -5.681632653e-04f, -1.294705690e-03f, +8.563295593e-04f, +1.573064329e-03f, -1.175920565e-03f, -1.771198429e-03f, +1.486767326e-03f, +1.855253545e-03f, -1.742343765e-03f, -1.810727743e-03f, +1.900164870e-03f, +1.646147245e-03f, -1.932191282e-03f, -1.390753267e-03f, +1.832063116e-03f, +1.086957999e-03f, -1.616864506e-03f, -7.799668001e-04f, +1.322832937e-03f, +5.077331119e-04f, -9.963577334e-04f, -2.940679154e-04f, +6.830565413e-04f, +1.464548128e-04f, -4.181674015e-04f, -5.845241879e-05f, +2.208289832e-04f, +1.513621662e-05f, -9.334948024e-05f, -2.470292752e-06f, +2.288308057e-05f, +0.000000000e+00f,\n    /*  8,16 (44) */\n    +0.000000000e+00f, -2.091681116e-04f, -7.409022970e-04f, +4.687431718e-04f, +1.914099760e-03f, -6.837544268e-04f, -3.970865769e-03f, +6.235519031e-04f, +7.230748708e-03f, +9.187816936e-05f, -1.205948272e-02f, -2.047510400e-03f, +1.894581029e-02f, +6.174818164e-03f, -2.876897220e-02f, -1.420526308e-02f, +4.371467507e-02f, +3.044992175e-02f, -7.135590209e-02f, -7.235506776e-02f, +1.612253611e-01f, +4.353441939e-01f, +4.353441939e-01f, +1.612253611e-01f, -7.235506776e-02f, -7.135590209e-02f, +3.044992175e-02f, +4.371467507e-02f, -1.420526308e-02f, -2.876897220e-02f, +6.174818164e-03f, +1.894581029e-02f, -2.047510400e-03f, -1.205948272e-02f, +9.187816936e-05f, +7.230748708e-03f, +6.235519031e-04f, -3.970865769e-03f, -6.837544268e-04f, +1.914099760e-03f, +4.687431718e-04f, -7.409022970e-04f, -2.091681116e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.288308057e-05f, -2.470292752e-06f, -6.445360941e-05f, +2.318150385e-06f, +1.392973795e-04f, +1.048379485e-05f, -2.599026502e-04f, -5.149456241e-05f, +4.397431547e-04f, +1.452348731e-04f, -6.942478174e-04f, -3.310458549e-04f, +1.045341195e-03f, +6.802733621e-04f, -1.535589709e-03f, -1.357740153e-03f, +2.272612832e-03f, +2.926765753e-03f, -3.574228409e-03f, -9.722004727e-03f, -5.596074459e-03f, +5.296426649e-03f, +9.774949114e-03f, +3.836999584e-03f, -2.824328624e-03f, -2.381533322e-03f, +1.279247763e-03f, +1.590514587e-03f, -6.242181808e-04f, -1.074247776e-03f, +2.923257993e-04f, +7.091729436e-04f, -1.196194356e-04f, -4.470430736e-04f, +3.551605358e-05f, +2.632203577e-04f, -1.278624870e-06f, -1.407194469e-04f, -7.058791348e-06f, +6.509656988e-05f, +4.515043563e-06f, -2.326213574e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.091681116e-04f, +7.409022970e-04f, -7.131741410e-04f, -2.720847267e-03f, +1.737723993e-03f, +5.748477644e-03f, -3.566332849e-03f, -1.011177661e-02f, +6.448796843e-03f, +1.562731672e-02f, -1.050701237e-02f, -2.179909722e-02f, +1.563882842e-02f, +2.787515251e-02f, -2.146309926e-02f, -3.298719232e-02f, +2.733677551e-02f, +3.634006219e-02f, -3.245444399e-02f, -3.739806920e-02f, +3.601287605e-02f, +3.601287605e-02f, -3.739806920e-02f, -3.245444399e-02f, +3.634006219e-02f, +2.733677551e-02f, -3.298719232e-02f, -2.146309926e-02f, +2.787515251e-02f, +1.563882842e-02f, -2.179909722e-02f, -1.050701237e-02f, +1.562731672e-02f, +6.448796843e-03f, -1.011177661e-02f, -3.566332849e-03f, +5.748477644e-03f, +1.737723993e-03f, -2.720847267e-03f, -7.131741410e-04f, +7.409022970e-04f, +2.091681116e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.288308057e-05f, +2.470292752e-06f, +9.334948024e-05f, -1.513621662e-05f, -2.208289832e-04f, +5.845241879e-05f, +4.181674015e-04f, -1.464548128e-04f, -6.830565413e-04f, +2.940679154e-04f, +9.963577334e-04f, -5.077331119e-04f, -1.322832937e-03f, +7.799668001e-04f, +1.616864506e-03f, -1.086957999e-03f, -1.832063116e-03f, +1.390753267e-03f, +1.932191282e-03f, -1.646147245e-03f, -1.900164870e-03f, +1.810727743e-03f, +1.742343765e-03f, -1.855253545e-03f, -1.486767326e-03f, +1.771198429e-03f, +1.175920565e-03f, -1.573064329e-03f, -8.563295593e-04f, +1.294705690e-03f, +5.681632653e-04f, -9.808257139e-04f, -3.377788445e-04f, +6.763015984e-04f, +1.749387546e-04f, -4.165373671e-04f, -7.475662740e-05f, +2.214746593e-04f, +2.293816556e-05f, -9.448499971e-05f, -4.515043563e-06f, +2.326213574e-05f, +0.000000000e+00f,\n    /*  8,17 (44) */\n    +0.000000000e+00f, -1.862850311e-04f, -7.433725897e-04f, +4.042895624e-04f, +1.916417910e-03f, -5.444570472e-04f, -3.960381975e-03f, +3.636492528e-04f, +7.179254146e-03f, +5.316213240e-04f, -1.191424785e-02f, -2.741758217e-03f, +1.861476443e-02f, +7.220159360e-03f, -2.808869884e-02f, -1.574085279e-02f, +4.235693492e-02f, +3.272253458e-02f, -6.842913633e-02f, -7.592929617e-02f, +1.515033564e-01f, +4.297481194e-01f, +4.406406205e-01f, +1.710003103e-01f, -6.851806817e-02f, -7.418023071e-02f, +2.806838843e-02f, +4.499392283e-02f, -1.261474849e-02f, -2.939319038e-02f, +5.100570388e-03f, +1.923813609e-02f, -1.338337456e-03f, -1.217910216e-02f, -3.551649042e-04f, +7.266264762e-03f, +8.867722608e-04f, -3.972144394e-03f, -8.244738737e-04f, +1.907040969e-03f, +5.338397417e-04f, -7.363872534e-04f, -2.324302474e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.244888408e-05f, -4.818649841e-07f, -6.366312058e-05f, -2.317069827e-06f, +1.375695279e-04f, +1.948633533e-05f, -2.560345824e-04f, -6.708679320e-05f, +4.315432790e-04f, +1.701333783e-04f, -6.779540756e-04f, -3.684708245e-04f, +1.014475465e-03f, +7.340184918e-04f, -1.478033405e-03f, -1.432035250e-03f, +2.160614618e-03f, +3.020985374e-03f, -3.311418047e-03f, -9.657646552e-03f, -5.888100406e-03f, +4.989553031e-03f, +9.816310925e-03f, +4.099312916e-03f, -2.713718553e-03f, -2.487093602e-03f, +1.196666476e-03f, +1.642647427e-03f, -5.659476670e-04f, -1.101101830e-03f, +2.523817992e-04f, +7.226749513e-04f, -9.333640378e-05f, -4.534115778e-04f, +1.918305259e-05f, +2.659698591e-04f, +8.110407545e-06f, -1.418257581e-04f, -1.189502014e-05f, +6.558647250e-05f, +6.611880398e-06f, -2.358299974e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.862850311e-04f, +7.433725897e-04f, -6.198246607e-04f, -2.735983483e-03f, +1.516895010e-03f, +5.806930063e-03f, -3.148165448e-03f, -1.025823142e-02f, +5.765740302e-03f, +1.592138463e-02f, -9.510654634e-03f, -2.230683033e-02f, +1.431599548e-02f, +2.865511931e-02f, -1.984623476e-02f, -3.407415032e-02f, +2.550471240e-02f, +3.773081546e-02f, -3.052225271e-02f, -3.904421644e-02f, +3.411271118e-02f, +3.782360379e-02f, -3.565572543e-02f, -3.430969754e-02f, +3.485329486e-02f, +2.910797394e-02f, -3.181127175e-02f, -2.303616359e-02f, +2.701882295e-02f, +1.693353411e-02f, -2.123093395e-02f, -1.148783808e-02f, +1.528953787e-02f, +7.125098441e-03f, -9.936837854e-03f, -3.982870217e-03f, +5.673721017e-03f, +1.959198652e-03f, -2.697909101e-03f, -8.076591407e-04f, +7.363872534e-04f, +2.324302474e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.244888408e-05f, +4.818649841e-07f, +9.198031050e-05f, -7.499182172e-06f, -2.196033337e-04f, +4.232104223e-05f, +4.186729204e-04f, -1.180401565e-04f, -6.879521958e-04f, +2.501476454e-04f, +1.009164789e-03f, -4.465980006e-04f, -1.347346503e-03f, +7.021877095e-04f, +1.656276876e-03f, -9.957085918e-04f, -1.888016951e-03f, +1.291531559e-03f, +2.004047085e-03f, -1.545913065e-03f, -1.984738917e-03f, +1.716654862e-03f, +1.834249851e-03f, -1.773419819e-03f, -1.579315914e-03f, +1.705558856e-03f, +1.262354277e-03f, -1.524962044e-03f, -9.310670614e-04f, +1.263007155e-03f, +6.277233333e-04f, -9.625794128e-04f, -3.811620628e-04f, +6.676792871e-04f, +2.034163201e-04f, -4.137673286e-04f, -9.119188536e-05f, +2.215253523e-04f, +3.088640110e-05f, -9.537626022e-05f, -6.611880398e-06f, +2.358299974e-05f, +0.000000000e+00f,\n    /*  8,18 (44) */\n    +0.000000000e+00f, -1.638361470e-04f, -7.438544547e-04f, +3.406264418e-04f, +1.914100841e-03f, -4.068875194e-04f, -3.940895639e-03f, +1.076146704e-04f, +7.112167352e-03f, +9.631646030e-04f, -1.174411447e-02f, -3.419712293e-03f, +1.824629361e-02f, +8.234634824e-03f, -2.735468035e-02f, -1.721888619e-02f, +4.092489967e-02f, +3.488314920e-02f, -6.540815096e-02f, -7.924071421e-02f, +1.418457099e-01f, +4.238600190e-01f, +4.456301736e-01f, +1.808166212e-01f, -6.441875526e-02f, -7.689394926e-02f, +2.558129482e-02f, +4.619058931e-02f, -1.097210106e-02f, -2.995913805e-02f, +3.999468559e-03f, +1.949051789e-02f, -6.156625050e-04f, -1.227243856e-02f, -8.085764820e-04f, +7.285447814e-03f, +1.152742120e-03f, -3.964033987e-03f, -9.662996318e-04f, +1.895145949e-03f, +5.994262142e-04f, -7.297753730e-04f, -2.560132471e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.196268072e-05f, +1.446273059e-06f, -6.273089843e-05f, -6.837520235e-06f, +1.355464329e-04f, +2.826832053e-05f, -2.516350224e-04f, -8.226239070e-05f, +4.224765426e-04f, +1.942679996e-04f, -6.603486128e-04f, -4.045334914e-04f, +9.817471263e-04f, +7.853652598e-04f, -1.418009831e-03f, -1.502035079e-03f, +2.045823112e-03f, +3.106958292e-03f, -3.048983182e-03f, -9.582060540e-03f, -6.172121094e-03f, +4.675861675e-03f, +9.845938909e-03f, +4.360746493e-03f, -2.594995548e-03f, -2.589013718e-03f, +1.110115020e-03f, +1.691831560e-03f, -5.055628209e-04f, -1.125813399e-03f, +2.112888089e-04f, +7.347018899e-04f, -6.643741972e-05f, -4.588189477e-04f, +2.528721062e-06f, +2.681343925e-04f, +1.766372628e-05f, -1.426069468e-04f, -1.681653613e-05f, +6.591807472e-05f, +8.756301760e-06f, -2.384271908e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.638361470e-04f, +7.438544547e-04f, -5.278443502e-04f, -2.743482666e-03f, +1.297291676e-03f, +5.849251105e-03f, -2.729492528e-03f, -1.037627158e-02f, +5.077788106e-03f, +1.617153228e-02f, -8.501489845e-03f, -2.275342833e-02f, +1.296864898e-02f, +2.935730702e-02f, -1.818995788e-02f, -3.506985891e-02f, +2.361669545e-02f, +3.902234701e-02f, -2.851820563e-02f, -4.059012951e-02f, +3.212797226e-02f, +3.954025866e-02f, -3.382147558e-02f, -3.608311736e-02f, +3.327397895e-02f, +3.081353280e-02f, -3.054891748e-02f, -2.456112564e-02f, +2.608775589e-02f, +1.819654127e-02f, -2.060321062e-02f, -1.245041749e-02f, +1.490837581e-02f, +7.792777728e-03f, -9.733421534e-03f, -4.396637545e-03f, +5.582529131e-03f, +2.180724004e-03f, -2.667022700e-03f, -9.030354009e-04f, +7.297753730e-04f, +2.560132471e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.196268072e-05f, -1.446273059e-06f, +9.038853164e-05f, -4.475248966e-08f, -2.178140521e-04f, +2.640300149e-05f, +4.180722284e-04f, -8.976910722e-05f, -6.910015121e-04f, +2.061355206e-04f, +1.019243517e-03f, -3.849233317e-04f, -1.368213823e-03f, +6.232033897e-04f, +1.691227717e-03f, -9.024190434e-04f, -1.938937307e-03f, +1.189367509e-03f, +2.070648629e-03f, -1.441904120e-03f, -2.064235287e-03f, +1.618185689e-03f, +1.921623528e-03f, -1.686889213e-03f, -1.668149396e-03f, +1.635293398e-03f, +1.346022477e-03f, -1.472655172e-03f, -1.003973129e-03f, +1.227789521e-03f, +6.862489085e-04f, -9.416368807e-04f, -4.240986292e-04f, +6.571864865e-04f, +2.318106980e-04f, -4.098447046e-04f, -1.077152281e-04f, +2.209674568e-04f, +3.896139322e-05f, -9.601313121e-05f, -8.756301760e-06f, +2.384271908e-05f, +0.000000000e+00f,\n    /*  8,19 (44) */\n    +0.000000000e+00f, -1.418734663e-04f, -7.424081816e-04f, +2.778955434e-04f, +1.907263320e-03f, -2.713410865e-04f, -3.912627319e-03f, -1.440203520e-04f, +7.029904962e-03f, +1.385641146e-03f, -1.154984647e-02f, -4.080060906e-03f, +1.784176012e-02f, +9.216381950e-03f, -2.656931509e-02f, -1.863689602e-02f, +3.942286459e-02f, +3.692897231e-02f, -6.230119267e-02f, -8.228969739e-02f, +1.322636493e-01f, +4.176878979e-01f, +4.503060352e-01f, +1.906625601e-01f, -6.005800876e-02f, -7.948894481e-02f, +2.299228111e-02f, +4.730070433e-02f, -9.280269503e-03f, -3.046470087e-02f, +2.873655160e-03f, +1.970180670e-02f, +1.190393849e-04f, -1.233887598e-02f, -1.267395430e-03f, +7.287976535e-03f, +1.420876512e-03f, -3.946370260e-03f, -1.108906579e-03f, +1.878329412e-03f, +6.653442889e-04f, -7.210190713e-04f, -2.798559662e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.142767771e-05f, +3.310429977e-06f, -6.166298190e-05f, -1.123435021e-05f, +1.332391668e-04f, +3.681269562e-05f, -2.467237975e-04f, -9.699248076e-05f, +4.125775763e-04f, +2.175942485e-04f, -6.414905504e-04f, -4.391706653e-04f, +9.472556282e-04f, +8.342318778e-04f, -1.355686285e-03f, -1.567652161e-03f, +1.928524116e-03f, +3.184670576e-03f, -2.787333827e-03f, -9.495449409e-03f, -6.447766409e-03f, +4.355771999e-03f, +9.863699687e-03f, +4.620875869e-03f, -2.468235104e-03f, -2.687016826e-03f, +1.019722344e-03f, +1.737914652e-03f, -4.431707792e-04f, -1.148296197e-03f, +1.691254733e-04f, +7.452045187e-04f, -3.897633968e-05f, -4.632372998e-04f, -1.441246259e-05f, +2.696983397e-04f, +2.736098108e-05f, -1.430542885e-04f, -2.181258871e-05f, +6.608644198e-05f, +1.094354843e-05f, -2.403844844e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.418734663e-04f, +7.424081816e-04f, -4.374558186e-04f, -2.743527418e-03f, +1.079477624e-03f, +5.875654107e-03f, -2.311420299e-03f, -1.046604069e-02f, +4.386786594e-03f, +1.637766780e-02f, -7.482246328e-03f, -2.313835166e-02f, +1.160043516e-02f, +2.998051041e-02f, -1.649873017e-02f, -3.597227795e-02f, +2.167775814e-02f, +4.021171452e-02f, -2.644755700e-02f, -4.203203363e-02f, +3.006373698e-02f, +4.115844435e-02f, -3.189985205e-02f, -3.777000657e-02f, +3.160582955e-02f, +3.244882620e-02f, -2.920289500e-02f, -2.603378081e-02f, +2.508378276e-02f, +1.942433079e-02f, -1.991696171e-02f, -1.339205437e-02f, +1.448427718e-02f, +8.449964215e-03f, -9.501610836e-03f, -4.806482250e-03f, +5.474813903e-03f, +2.401691461e-03f, -2.628061307e-03f, -9.990485321e-04f, +7.210190713e-04f, +2.798559662e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.142767771e-05f, -3.310429977e-06f, +8.858557120e-05f, +7.210351542e-06f, -2.154787367e-04f, +1.073742985e-05f, +4.163863488e-04f, -6.171446108e-05f, -6.922222111e-04f, +1.621478363e-04f, +1.026597802e-03f, -3.228743345e-04f, -1.385412165e-03f, +5.432265444e-04f, +1.721655398e-03f, -8.073400673e-04f, -1.984715161e-03f, +1.084533190e-03f, +2.131837634e-03f, -1.334392726e-03f, -2.138452665e-03f, +1.515571199e-03f, +2.004234274e-03f, -1.595873504e-03f, -1.753027009e-03f, +1.560563756e-03f, +1.426694509e-03f, -1.416252865e-03f, -1.074844904e-03f, +1.189114717e-03f, +7.435767528e-04f, -9.180235657e-04f, -4.664693497e-04f, +6.448251093e-04f, +2.600441250e-04f, -4.047599059e-04f, -1.242826112e-04f, +2.197888415e-04f, +4.714274876e-05f, -9.638600554e-05f, -1.094354843e-05f, +2.403844844e-05f, +0.000000000e+00f,\n    /*  8,20 (44) */\n    +0.000000000e+00f, -1.204457886e-04f, -7.390977517e-04f, +2.162325615e-04f, +1.896028970e-03f, -1.381019197e-04f, -3.875814623e-03f, -3.907441495e-04f, +6.932912481e-03f, +1.798218722e-03f, -1.133225222e-02f, -4.721551456e-03f, +1.740258945e-02f, +1.016363758e-02f, -2.573508321e-02f, -1.999258231e-02f, +3.785521243e-02f, +3.885749643e-02f, -5.911652209e-02f, -8.507703122e-02f, +1.227681999e-01f, +4.112401315e-01f, +4.546618072e-01f, +2.005262598e-01f, -5.543713289e-02f, -8.195717992e-02f, +2.030526428e-02f, +4.832042667e-02f, -7.542354851e-03f, -3.090787165e-02f, +1.725358962e-03f, +1.987093217e-02f, +8.642439036e-04f, -1.237785232e-02f, -1.730632730e-03f, +7.273564073e-03f, +1.690574852e-03f, -3.919009279e-03f, -1.251960867e-03f, +1.856516824e-03f, +7.314307309e-04f, -7.100755228e-04f, -3.038944146e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.084714333e-05f, +5.107193698e-06f, -6.046563196e-05f, -1.549922050e-05f, +1.306592947e-04f, +4.510330362e-05f, -2.413216300e-04f, -1.112497165e-04f, +4.018824413e-04f, +2.400701682e-04f, -6.214410693e-04f, -4.723232733e-04f, +9.111030623e-04f, +8.805431766e-04f, -1.291232807e-03f, -1.628809553e-03f, +1.809004221e-03f, +3.254123434e-03f, -2.526874633e-03f, -9.398032212e-03f, -6.714680117e-03f, +4.029714077e-03f, +9.869478069e-03f, +4.879274799e-03f, -2.333528214e-03f, -2.780829778e-03f, +9.256274826e-04f, +1.780749095e-03f, -3.788846557e-04f, -1.168467854e-03f, +1.259739956e-04f, +7.541364601e-04f, -1.100913829e-05f, -4.666406816e-04f, -3.160476641e-05f, +2.706472842e-04f, +3.718108509e-05f, -1.431597354e-04f, -2.687199657e-05f, +6.608696828e-05f, +1.316861113e-05f, -2.416746233e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.204457886e-04f, +7.390977517e-04f, -3.488702474e-04f, -2.736317066e-03f, +8.639988871e-04f, +5.886391536e-03f, -1.895033950e-03f, -1.052775515e-02f, +3.694564383e-03f, +1.653981564e-02f, -6.455648525e-03f, -2.346122599e-02f, +1.021502299e-02f, +3.052373695e-02f, -1.477707477e-02f, -3.677961802e-02f, +1.969304298e-02f, +4.129624771e-02f, -2.431571937e-02f, -4.336642635e-02f, +2.792528431e-02f, +4.267401554e-02f, -2.989561778e-02f, -3.936588008e-02f, +2.985280254e-02f, +3.400938995e-02f, -2.777620049e-02f, -2.745003367e-02f, +2.400893786e-02f, +2.061344550e-02f, -1.917338496e-02f, -1.431007794e-02f, +1.401780783e-02f, +9.094789324e-03f, -9.241566711e-03f, -5.211242156e-03f, +5.350531292e-03f, +2.621480303e-03f, -2.580918558e-03f, -1.095434538e-03f, +7.100755228e-04f, +3.038944146e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.084714333e-05f, -5.107193698e-06f, +8.658319699e-05f, +1.425040657e-05f, -2.126161649e-04f, -4.637995848e-06f, +4.136389188e-04f, -3.394731136e-05f, -6.916366713e-04f, +1.182993974e-04f, +1.031238692e-03f, -2.606156279e-04f, -1.398928609e-03f, +4.624709043e-04f, +1.747510474e-03f, -7.107257092e-04f, -2.025255326e-03f, +9.773066992e-04f, +2.187470241e-03f, -1.223659887e-03f, -2.207203543e-03f, +1.409073225e-03f, +2.081863637e-03f, -1.500596614e-03f, -1.833717525e-03f, +1.481543950e-03f, +1.504146369e-03f, -1.355875694e-03f, -1.143483410e-03f, +1.147054322e-03f, +7.995452478e-04f, -8.917723239e-04f, -5.081550995e-04f, +6.306021650e-04f, +2.880380885e-04f, -3.985064122e-04f, -1.408490179e-04f, +2.179789158e-04f, +5.540925410e-05f, -9.648584411e-05f, -1.316861113e-05f, +2.416746233e-05f, +0.000000000e+00f,\n    /*  8,21 (44) */\n    +0.000000000e+00f, -9.959864522e-05f, -7.339905580e-04f, +1.557669295e-04f, +1.880529750e-03f, -7.442625010e-06f, -3.830711319e-03f, -6.320657796e-04f, +6.821662764e-03f, +2.200101163e-03f, -1.109218205e-02f, -5.342992525e-03f, +1.693026618e-02f, +1.107474064e-02f, -2.485454003e-02f, -2.128381512e-02f, +3.622640287e-02f, +4.066650065e-02f, -5.586239866e-02f, -8.760390585e-02f, +1.133701677e-01f, +4.045254514e-01f, +4.586915213e-01f, +2.103957378e-01f, -5.055785810e-02f, -8.429070813e-02f, +1.752443450e-02f, +4.924605415e-02f, -5.761605756e-03f, -3.128675631e-02f, +5.568911090e-04f, +1.999690617e-02f, +1.618380364e-03f, -1.238886146e-02f, -2.197273411e-03f, +7.241959306e-03f, +1.961222136e-03f, -3.881828194e-03f, -1.395120602e-03f, +1.829644827e-03f, +7.975176992e-04f, -6.969069117e-04f, -3.280618770e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.022439527e-05f, +6.833434631e-06f, -5.914530952e-05f, -1.962431458e-05f, +1.278188358e-04f, +5.312490959e-05f, -2.354500713e-04f, -1.250083200e-04f, +3.904285214e-04f, +2.616563963e-04f, -6.002632396e-04f, -5.039364399e-04f, +8.733938990e-04f, +9.242306866e-04f, -1.224821774e-03f, -1.685440871e-03f, +1.687550236e-03f, +3.315333055e-03f, -2.268004217e-03f, -9.290043881e-03f, -6.972520433e-03f, +3.698127934e-03f, +9.863177323e-03f, +5.135515976e-03f, -2.190981361e-03f, -2.870183705e-03f, +8.279793927e-04f, +1.820192390e-03f, -3.128233666e-04f, -1.186250152e-03f, +8.191999454e-05f, +7.614543474e-04f, +1.740619401e-05f, -4.690051627e-04f, -4.901127214e-05f, +2.709680669e-04f, +4.710225478e-05f, -1.429159500e-04f, -3.198316856e-05f, +6.591539633e-05f, +1.542623912e-05f, -2.422716675e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.959864522e-05f, +7.339905580e-04f, -2.622870504e-04f, -2.722066660e-03f, +6.513827222e-04f, +5.881753541e-03f, -1.481395032e-03f, -1.056170246e-02f, +3.002927711e-03f, +1.665811503e-02f, -5.424409833e-03f, -2.372184162e-02f, +8.816094385e-03f, +3.098620786e-02f, -1.302956429e-02f, -3.749034373e-02f, +1.766778765e-02f, +4.227355441e-02f, -2.212824912e-02f, -4.459008624e-02f, +2.571808077e-02f, +4.408308877e-02f, -2.781375414e-02f, -4.086647669e-02f, +2.801908502e-02f, +3.549093390e-02f, -2.627205412e-02f, -2.880590937e-02f, +2.286545445e-02f, +2.176049983e-02f, -1.837383971e-02f, -1.520185026e-02f, +1.350965273e-02f, +9.725391489e-03f, -8.953528623e-03f, -5.609748568e-03f, +5.209682274e-03f, +2.839459219e-03f, -2.525509304e-03f, -1.191920382e-03f, +6.969069117e-04f, +3.280618770e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.022439527e-05f, -6.833434631e-06f, +8.439347096e-05f, +2.106071123e-05f, -2.092462143e-04f, -1.968713542e-05f, +4.098560803e-04f, -6.536878019e-06f, -6.892718057e-04f, +7.470322627e-05f, +1.033184287e-03f, -1.983107871e-04f, -1.408759996e-03f, +3.811506542e-04f, +1.768755735e-03f, -6.128326608e-04f, -2.060476642e-03f, +8.679714118e-04f, +2.237417363e-03f, -1.109994551e-03f, -2.270314702e-03f, +1.298963777e-03f, +2.154305823e-03f, -1.401294039e-03f, -1.909999891e-03f, +1.398419915e-03f, +1.578161324e-03f, -1.291655395e-03f, -1.209694110e-03f, +1.101689457e-03f, +8.539948454e-04f, -8.629234091e-04f, -5.490371495e-04f, +6.145298076e-04f, +3.157135344e-04f, -3.910808416e-04f, -1.573685710e-04f, +2.155286933e-04f, +6.373892123e-05f, -9.630421979e-05f, -1.542623912e-05f, +2.422716675e-05f, +0.000000000e+00f,\n    /*  8,22 (44) */\n    +0.000000000e+00f, -7.937424996e-05f, -7.271571233e-04f, +9.662161999e-05f, +1.860905435e-03f, +1.203762108e-04f, -3.777586410e-03f, -8.675158509e-04f, +6.696654445e-03f, +2.590529685e-03f, -1.083052566e-02f, -5.943255765e-03f, +1.642632974e-02f, +1.194813454e-02f, -2.393030935e-02f, -2.250863689e-02f, +3.454096200e-02f, +4.235405088e-02f, -5.254706560e-02f, -8.987191007e-02f, +1.040801238e-01f, +3.975529310e-01f, +4.623896493e-01f, +2.202589152e-01f, -4.542234212e-02f, -8.648168949e-02f, +1.465425080e-02f, +5.007403355e-02f, -3.941413366e-03f, -3.159957967e-02f, -6.293590427e-04f, +2.007882616e-02f, +2.379834711e-03f, -1.237145527e-02f, -2.666278574e-03f, +7.192948034e-03f, +2.232190203e-03f, -3.834725940e-03f, -1.538036552e-03f, +1.797661659e-03f, +8.634330955e-04f, -6.814806726e-04f, -3.522890437e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.956278904e-05f, +8.486307925e-06f, -5.770865334e-05f, -2.360234839e-05f, +1.247302240e-04f, +6.086322209e-05f, -2.291314354e-04f, -1.382441196e-04f, +3.782544149e-04f, +2.823162196e-04f, -5.780218488e-04f, -5.339595571e-04f, +8.342347209e-04f, +9.652327035e-04f, -1.156627495e-03f, -1.737490298e-03f, +1.564448624e-03f, +3.368330420e-03f, -2.011114502e-03f, -9.171734749e-03f, -7.220960571e-03f, +3.361462821e-03f, +9.844719429e-03f, +5.389171783e-03f, -2.040716467e-03f, -2.954814590e-03f, +7.269367777e-04f, +1.856107526e-03f, -2.451114403e-04f, -1.201569264e-03f, +3.705235275e-05f, +7.671179684e-04f, +4.620975957e-05f, -4.703089230e-04f, -6.659394642e-05f, +2.706488403e-04f, +5.710205251e-05f, -1.423163382e-04f, -3.713412602e-05f, +6.556783713e-05f, +1.771094961e-05f, -2.421511060e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.937424996e-05f, +7.271571233e-04f, -1.778935794e-04f, -2.701005949e-03f, +4.421365079e-04f, +5.862066405e-03f, -1.071538951e-03f, -1.056823934e-02f, +2.313655906e-03f, +1.673281826e-02f, -4.391225546e-03f, -2.392015241e-02f, +7.407334389e-03f, +3.136735851e-02f, -1.126080856e-02f, -3.810317639e-02f, +1.560731101e-02f, +4.314152582e-02f, -1.989083176e-02f, -4.570008079e-02f, +2.344776607e-02f, +4.538205255e-02f, -2.565944832e-02f, -4.226777073e-02f, +2.610908513e-02f, +3.688935382e-02f, -2.469389280e-02f, -3.009756476e-02f, +2.165576034e-02f, +2.286218928e-02f, -1.751984486e-02f, -1.606477367e-02f, +1.296061558e-02f, +1.033992130e-02f, -8.637815088e-03f, -6.000829409e-03f, +5.052313703e-03f, +3.054987912e-03f, -2.461770383e-03f, -1.288224602e-03f, +6.814806726e-04f, +3.522890437e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.956278904e-05f, -8.486307925e-06f, +8.202870318e-05f, +2.762760690e-05f, -2.053897813e-04f, -3.437545963e-05f, +4.050663648e-04f, +2.044965488e-05f, -6.851589268e-04f, +3.147027837e-05f, +1.032459620e-03f, -1.361219172e-04f, -1.414912861e-03f, +2.994798621e-04f, +1.785366232e-03f, -5.139195696e-04f, -2.090312125e-03f, +7.568152173e-04f, +2.281564981e-03f, -9.936928337e-04f, -2.327627661e-03f, +1.185524330e-03f, +2.221368260e-03f, -1.298212264e-03f, -1.981663839e-03f, +1.311389056e-03f, +1.648530526e-03f, -1.223734587e-03f, -1.273287459e-03f, +1.053110646e-03f, +9.067685159e-04f, -8.315244415e-04f, -5.889974946e-04f, +5.966253717e-04f, +3.429910801e-04f, -3.824830127e-04f, -1.737946493e-04f, +2.124308514e-04f, +7.210903727e-05f, -9.583336027e-05f, -1.771094961e-05f, +2.421511060e-05f, +0.000000000e+00f,\n    /*  8,23 (44) */\n    +0.000000000e+00f, -5.981146091e-05f, -7.186708154e-04f, +3.891296665e-05f, +1.837303087e-03f, +2.451064348e-04f, -3.716723188e-03f, -1.096647286e-03f, +6.558410325e-03f, +2.968784100e-03f, -1.054820944e-02f, -6.521277614e-03f, +1.589237018e-02f, +1.278236926e-02f, -2.296507664e-02f, -2.366526438e-02f, +3.280347170e-02f, +4.391849951e-02f, -4.917873518e-02f, -9.188302457e-02f, +9.490838907e-02f, +3.903319704e-01f, +4.657511121e-01f, +2.301036346e-01f, -4.003317034e-02f, -8.852240596e-02f, +1.169943621e-02f, +5.080097032e-02f, -2.085305840e-03f, -3.184469111e-02f, -1.830928306e-03f, +2.011587851e-02f, +3.146952680e-03f, -1.232524551e-02f, -3.136587497e-03f, +7.126354088e-03f, +2.502839044e-03f, -3.777623887e-03f, -1.680352891e-03f, +1.760527533e-03f, +9.290009326e-04f, -6.637697230e-04f, -3.765041543e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.886570663e-05f, +1.006325487e-05f, -5.616245785e-05f, -2.742657843e-05f, +1.214062683e-04f, +6.830491191e-05f, -2.223887316e-04f, -1.509345828e-04f, +3.653998246e-04f, +3.020156231e-04f, -5.547832275e-04f, -5.623463434e-04f, +7.937339537e-04f, +1.003494338e-03f, -1.086825811e-03f, -1.784912553e-03f, +1.439984936e-03f, +3.413161095e-03f, -1.756590075e-03f, -9.043370036e-03f, -7.459689256e-03f, +3.020176466e-03f, +9.814045284e-03f, +5.639815044e-03f, -1.882870823e-03f, -3.034463845e-03f, +6.226678819e-04f, +1.888363348e-03f, -1.758788128e-04f, -1.214355977e-03f, -8.536945332e-06f, +7.710904031e-04f, +7.533986833e-05f, -4.705323363e-04f, -8.431371580e-05f, +2.696791191e-04f, +6.715743137e-05f, -1.413550798e-04f, -4.231252662e-05f, +6.504078892e-05f, +2.001703818e-05f, -2.412899703e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.981146091e-05f, +7.186708154e-04f, -9.586487626e-05f, -2.673378342e-03f, +2.367467266e-04f, +5.827690945e-03f, -6.664725864e-04f, -1.054778968e-02f, +1.628496979e-03f, +1.676428854e-02f, -3.358765927e-03f, -2.405627433e-02f, +5.992421528e-03f, +3.166683837e-02f, -9.475442327e-03f, -3.861709596e-02f, +1.351699889e-02f, +4.389834104e-02f, -1.760926678e-02f, -4.669377363e-02f, +2.112013841e-02f, +4.656757688e-02f, -2.343808006e-02f, -4.356598299e-02f, +2.412742129e-02f, +3.820074287e-02f, -2.304536227e-02f, -3.132129935e-02f, +2.038247288e-02f, +2.391529993e-02f, -1.661307635e-02f, -1.689629811e-02f, +1.237161809e-02f, +1.093654667e-02f, -8.294824008e-03f, -6.383312422e-03f, +4.878519054e-03f, +3.267418763e-03f, -2.389661345e-03f, -1.384057962e-03f, +6.637697230e-04f, +3.765041543e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.886570663e-05f, -1.006325487e-05f, +7.950140619e-05f, +3.393849481e-05f, -2.010686993e-04f, -4.867011854e-05f, +3.993005730e-04f, +4.694729371e-05f, -6.793336019e-04f, -1.129083210e-05f, +1.029096508e-03f, -7.420923400e-05f, -1.417403325e-03f, +2.176719137e-04f, +1.797329261e-03f, -4.142463470e-04f, -2.114709087e-03f, +6.441297486e-04f, +2.319814411e-03f, -8.750572352e-04f, -2.378999080e-03f, +1.069045087e-03f, +2.282872110e-03f, -1.191608132e-03f, -2.048510478e-03f, +1.220659775e-03f, +1.715053605e-03f, -1.152266461e-03f, -1.334079442e-03f, +1.001417649e-03f, +9.577121940e-04f, -7.976303570e-04f, -6.279191849e-04f, +5.769113925e-04f, +3.697912301e-04f, -3.727159975e-04f, -1.900800085e-04f, +2.086797875e-04f, +8.049621737e-05f, -9.506618998e-05f, -2.001703818e-05f, +2.412899703e-05f, +0.000000000e+00f,\n    /*  8,24 (44) */\n    +0.000000000e+00f, -4.094575428e-05f, -7.086075605e-04f, -1.724949120e-05f, +1.809876508e-03f, +3.665127031e-04f, -3.648418276e-03f, -1.319036018e-03f, +6.407475742e-03f, +3.334183924e-03f, -1.024619382e-02f, -7.076060841e-03f, +1.533002384e-02f, +1.357610321e-02f, -2.196158231e-02f, -2.475209020e-02f, +3.101855915e-02f, +4.535848444e-02f, -4.576557409e-02f, -9.363961465e-02f, +8.586501903e-02f, +3.828722811e-01f, +4.687712885e-01f, +2.399176799e-01f, -3.439335529e-02f, -9.040527678e-02f, +8.664972362e-03f, +5.142363821e-02f, -1.969424922e-04f, -3.202056993e-02f, -3.045284283e-03f, +2.010734157e-02f, +3.918043083e-03f, -1.224990564e-02f, -3.607119833e-03f, +7.042040372e-03f, +2.772518163e-03f, -3.710466456e-03f, -1.821707971e-03f, +1.718215006e-03f, +9.940417215e-04f, -6.437526848e-04f, -4.006331513e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.813654524e-05f, +1.156200341e-05f, -5.451365104e-05f, -3.109080837e-05f, +1.178601126e-04f, +7.543762803e-05f, -2.152455967e-04f, -1.630588444e-04f, +3.519054467e-04f, +3.207233305e-04f, -5.306150743e-04f, -5.890548917e-04f, +7.520015975e-04f, +1.038967548e-03f, -1.015593691e-03f, -1.827672860e-03f, +1.314443263e-03f, +3.449884991e-03f, -1.504807565e-03f, -8.905229318e-03f, -7.688411219e-03f, +2.674734318e-03f, +9.771114886e-03f, +5.887019779e-03f, -1.717596983e-03f, -3.108878884e-03f, +5.153502663e-04f, +1.916834922e-03f, -1.052606080e-04f, -1.224545909e-03f, -5.475298431e-05f, +7.733381554e-04f, +1.047331584e-04f, -4.696580509e-04f, -1.021305455e-04f, +2.680498294e-04f, +7.724478239e-05f, -1.400271590e-04f, -4.750568960e-05f, +6.433115545e-05f, +2.233858996e-05f, -2.396669449e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.094575428e-05f, +7.086075605e-04f, -1.636347006e-05f, -2.639439847e-03f, +3.567802731e-05f, +5.779020827e-03f, -2.671720134e-04f, -1.050084239e-02f, +9.491633768e-04f, +1.675299771e-02f, -2.329669418e-03f, -2.413048356e-02f, +4.575018202e-03f, +3.188451029e-02f, -7.678113066e-03f, -3.903134231e-02f, +1.140228980e-02f, +4.454247079e-02f, -1.528945237e-02f, -4.756883086e-02f, +1.874113933e-02f, +4.763662196e-02f, -2.115520795e-02f, -4.475759113e-02f, +2.207891081e-02f, +3.942140265e-02f, -2.133030867e-02f, -3.247356581e-02f, +1.904839344e-02f, +2.491671758e-02f, -1.565536415e-02f, -1.769392847e-02f, +1.174369890e-02f, +1.151345806e-02f, -7.925032778e-03f, -6.756028420e-03f, +4.688439045e-03f, +3.476098551e-03f, -2.309165128e-03f, -1.479124152e-03f, +6.437526848e-04f, +4.006331513e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.813654524e-05f, -1.156200341e-05f, +7.682424980e-05f, +3.998184953e-05f, -1.963056544e-04f, -6.254000361e-05f, +3.925916505e-04f, +7.289338143e-05f, -6.718354979e-04f, -5.347409763e-05f, +1.023133402e-03f, -1.273065514e-05f, -1.416256979e-03f, +1.359389520e-04f, +1.804644322e-03f, -3.140734770e-04f, -2.133629210e-03f, +5.302096033e-04f, +2.352082522e-03f, -7.543958355e-04f, -2.424301130e-03f, +9.498242216e-04f, +2.338652763e-03f, -1.081748194e-03f, -2.110352850e-03f, +1.126450964e-03f, +1.777539236e-03f, -1.077414432e-03f, -1.391892103e-03f, +9.467192680e-04f, +1.006675221e-03f, -7.613033350e-04f, -6.656866567e-04f, +5.554156132e-04f, +3.960345967e-04f, -3.617861668e-04f, -2.061769061e-04f, +2.042716706e-04f, +8.887646084e-05f, -9.399637063e-05f, -2.233858996e-05f, +2.396669449e-05f, +0.000000000e+00f,\n    /*  8,25 (44) */\n    +0.000000000e+00f, -2.280920904e-05f, -6.970455571e-04f, -7.176314224e-05f, +1.778785700e-03f, +4.843728157e-04f, -3.572980648e-03f, -1.534281615e-03f, +6.244416898e-03f, +3.686089371e-03f, -9.925470485e-03f, -7.606675916e-03f, +1.474096895e-02f, +1.432810481e-02f, -2.092261476e-02f, -2.576768389e-02f, +2.919088629e-02f, +4.667292771e-02f, -4.231568910e-02f, -9.514442221e-02f, +7.695978971e-02f, +3.751838699e-01f, +4.714460229e-01f, +2.496887948e-01f, -2.850633551e-02f, -9.212287376e-02f, +5.556093478e-03f, +5.193898847e-02f, +1.719892430e-03f, -3.212583053e-02f, -4.269830192e-03f, +2.005258858e-02f, +4.691381238e-03f, -1.214517248e-02f, -4.076777884e-03f, +6.939909826e-03f, +3.040567992e-03f, -3.633221673e-03f, -1.961735130e-03f, +1.670709316e-03f, +1.058372877e-03f, -6.214140948e-04f, -4.245998458e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.737870626e-05f, +1.298056784e-05f, -5.276927238e-05f, -3.458939389e-05f, +1.141051959e-04f, +8.225001081e-05f, -2.077262260e-04f, -1.745977306e-04f, +3.378128593e-04f, +3.384108386e-04f, -5.055862801e-04f, -6.140477072e-04f, +7.091489576e-04f, +1.071611160e-03f, -9.431088328e-04f, -1.865746873e-03f, +1.188105689e-03f, +3.478576103e-03f, -1.256135034e-03f, -8.757605971e-03f, -7.906847652e-03f, +2.325608775e-03f, +9.715907479e-03f, +6.130361963e-03f, -1.545062632e-03f, -3.177813682e-03f, +4.051705618e-04f, +1.941403888e-03f, -3.339690446e-05f, -1.232079723e-03f, -1.014980978e-04f, +7.738312790e-04f, +1.343247226e-04f, -4.676710644e-04f, -1.200035216e-04f, +2.657533541e-04f, +8.733998399e-05f, -1.383283922e-04f, -5.270062244e-05f, +6.343626354e-05f, +2.466949175e-05f, -2.372624758e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.280920904e-05f, +6.970455571e-04f, +6.046077973e-05f, -2.599457997e-03f, -1.606276271e-04f, +5.716480823e-03f, +1.254196371e-04f, -1.042794901e-02f, +2.773278789e-04f, +1.669952361e-02f, -1.306536016e-03f, -2.414321422e-02f, +3.158761223e-03f, +3.202044924e-02f, -5.873468744e-03f, -3.934541578e-02f, +9.268660589e-03f, +4.507268039e-02f, -1.293736985e-02f, -4.832322670e-02f, +1.631683820e-02f, +4.858644618e-02f, -1.881655519e-02f, -4.583933932e-02f, +1.996855796e-02f, +4.054785361e-02f, -1.955276943e-02f, -3.355098024e-02f, +1.765650133e-02f, +2.586343685e-02f, -1.464868893e-02f, -1.845523181e-02f, +1.107801225e-02f, +1.206887367e-02f, -7.528998181e-03f, -7.117814586e-03f, +4.482262139e-03f, +3.680370221e-03f, -2.220288667e-03f, -1.573120522e-03f, +6.214140948e-04f, +4.245998458e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.737870626e-05f, -1.298056784e-05f, +7.401001638e-05f, +4.574722876e-05f, -1.911241015e-04f, -7.595580378e-05f, +3.849745594e-04f, +9.822773494e-05f, -6.627082172e-04f, -9.497637221e-05f, +1.014615202e-03f, +4.815859980e-05f, -1.411508730e-03f, +5.449132512e-05f, +1.807323043e-03f, -2.136613268e-04f, -2.147048585e-03f, +4.153515593e-04f, +2.378301921e-03f, -6.320214768e-04f, -2.463421819e-03f, +8.281670986e-04f, +2.388560283e-03f, -9.689080262e-04f, -2.167016456e-03f, +1.028991470e-03f, +1.835805697e-03f, -9.993517718e-04f, -1.446554062e-03f, +8.891331350e-04f, +1.053510781e-03f, -7.226127060e-04f, -7.021860642e-04f, +5.321709771e-04f, +4.216421221e-04f, -3.497032258e-04f, -2.220372295e-04f, +1.992044890e-04f, +9.722521034e-05f, -9.261834034e-05f, -2.466949175e-05f, +2.372624758e-05f, +0.000000000e+00f,\n    /*  8,26 (44) */\n    +0.000000000e+00f, -5.430502781e-06f, -6.840649893e-04f, -1.245324146e-04f, +1.744196306e-03f, +5.984780117e-04f, -3.490730637e-03f, -1.742007841e-03f, +6.069819167e-03f, +4.023902230e-03f, -9.587059646e-03f, -8.112262196e-03f, +1.412692124e-02f, +1.503725377e-02f, -1.985100360e-02f, -2.671079272e-02f, +2.732513942e-02f, +4.786103340e-02f, -3.883711299e-02f, -9.640055725e-02f, +6.820218374e-02f, +3.672770223e-01f, +4.737716316e-01f, +2.594047022e-01f, -2.237597355e-02f, -9.366793640e-02f, +2.378279796e-03f, +5.234415903e-02f, +3.661296318e-03f, -3.215922744e-02f, -5.501909915e-03f, +1.995109049e-02f, +5.465212517e-03f, -1.201084776e-02f, -4.544448948e-03f, +6.819906305e-03f, +3.306321346e-03f, -3.545881689e-03f, -2.100063522e-03f, +1.618008694e-03f, +1.121809141e-03f, -5.967446031e-04f, -4.483260934e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.659558457e-05f, +1.431724768e-05f, -5.093645098e-05f, -3.791724618e-05f, +1.101552123e-04f, +8.873170256e-05f, -1.998553052e-04f, -1.855337779e-04f, +3.231644100e-04f, +3.550524448e-04f, -4.797667512e-04f, -6.372917343e-04f, +6.652883750e-04f, +1.101390868e-03f, -8.695492688e-04f, -1.899120603e-03f, +1.061251757e-03f, +3.499322218e-03f, -1.010931395e-03f, -8.600806591e-03f, -8.114736642e-03f, +1.973278391e-03f, +9.648421663e-03f, +6.369420286e-03f, -1.365450418e-03f, -3.241029330e-03f, +2.923242001e-04f, +1.961958798e-03f, +3.956751245e-05f, -1.236903324e-03f, -1.486720570e-04f, +7.725434958e-04f, +1.640482395e-04f, -4.645587956e-04f, -1.378909369e-04f, +2.627835768e-04f, +9.741845355e-05f, -1.362554549e-04f, -5.788404891e-05f, +6.235387979e-05f, +2.700344492e-05f, -2.340588755e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.430502781e-06f, +6.840649893e-04f, +1.344707961e-04f, -2.553710769e-03f, -3.517517285e-04f, +5.640525020e-03f, +5.103941965e-04f, -1.032972127e-02f, -3.853803383e-04f, +1.660454724e-02f, -2.919208143e-04f, -2.409505562e-02f, +1.747252493e-03f, +3.207494056e-02f, -4.066145701e-03f, -3.955907711e-02f, +7.121612003e-03f, +4.548803195e-02f, -1.055906793e-02f, -4.895524817e-02f, +1.385341638e-02f, +4.941461328e-02f, -1.642799490e-02f, -4.680824735e-02f, +1.780154150e-02f, +4.157684508e-02f, -1.771696373e-02f, -3.455033201e-02f, +1.620994727e-02f, +2.675256998e-02f, -1.359517815e-02f, -1.917784451e-02f, +1.037582618e-02f, +1.260104465e-02f, -7.107356059e-03f, -7.467517812e-03f, +4.260224910e-03f, +3.879574710e-03f, -2.123063457e-03f, -1.665738863e-03f, +5.967446031e-04f, +4.483260934e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.659558457e-05f, -1.431724768e-05f, +7.107155702e-05f, +5.122527963e-05f, -1.855481789e-04f, -8.889005515e-05f, +3.764861458e-04f, +1.228927735e-04f, -6.519991251e-04f, -1.356976152e-04f, +1.003593071e-03f, +1.083063974e-04f, -1.403202629e-03f, -2.646295790e-05f, +1.805389067e-03f, -1.132694617e-04f, -2.154957710e-03f, +2.998537883e-04f, +2.398421082e-03f, -5.082509356e-04f, -2.496265270e-03f, +7.043854709e-04f, +2.432459817e-03f, -8.533715254e-04f, -2.218339760e-03f, +9.285195307e-04f, +1.889681393e-03f, -9.182612062e-04f, -1.497901017e-03f, +8.287854638e-04f, +1.098076332e-03f, -6.816348387e-04f, -7.373056101e-04f, +5.072156049e-04f, +4.465353040e-04f, -3.364802418e-04f, -2.376126283e-04f, +1.934780934e-04f, +1.055174142e-04f, -9.092735126e-05f, -2.700344492e-05f, +2.340588755e-05f, +0.000000000e+00f,\n    /*  8,27 (44) */\n    +0.000000000e+00f, +1.116508179e-05f, -6.697477416e-04f, -1.754688656e-04f, +1.706279060e-03f, +7.086332239e-04f, -3.401998934e-03f, -1.941863146e-03f, +5.884285389e-03f, +4.347066640e-03f, -9.232007201e-03f, -8.592028947e-03f, +1.348962951e-02f, +1.570254214e-02f, -1.874961273e-02f, -2.758034199e-02f, +2.542601882e-02f, +4.892228515e-02f, -3.533779078e-02f, -9.741148864e-02f, +5.960137715e-02f, +3.591622856e-01f, +4.757449100e-01f, +2.690531239e-01f, -1.600655326e-02f, -9.503338681e-02f, -8.627495342e-04f, +5.263648323e-02f, +5.623255116e-03f, -3.211965993e-02f, -6.738813239e-03f, +1.980241843e-02f, +6.237756013e-03f, -1.184679952e-02f, -5.009007744e-03f, +6.682015368e-03f, +3.569104923e-03f, -3.448463236e-03f, -2.236318977e-03f, +1.560124645e-03f, +1.184163020e-03f, -5.697411582e-04f, -4.717319809e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.579055794e-05f, +1.557062569e-05f, -4.902238392e-05f, -4.106983364e-05f, +1.060240704e-04f, +9.487335522e-05f, -1.916579412e-04f, -1.958512485e-04f, +3.080031036e-04f, +3.706252664e-04f, -4.532272335e-04f, -6.587583729e-04f, +6.205329591e-04f, +1.128279224e-03f, -7.950929731e-04f, -1.927790301e-03f, +9.341579451e-04f, +3.512224607e-03f, -7.695458477e-04f, -8.435150394e-03f, -8.311833564e-03f, +1.618227086e-03f, +9.568675473e-03f, +6.603776907e-03f, -1.178957764e-03f, -3.298294587e-03f, +1.770151251e-04f, +1.978395458e-03f, +1.134834115e-04f, -1.238968054e-03f, -1.961722680e-04f, +7.694523085e-04f, +1.938361112e-04f, -4.603111501e-04f, -1.557503799e-04f, +2.591359210e-04f, +1.074552011e-04f, -1.338059061e-04f, -6.304243838e-05f, +6.108222644e-05f, +2.933397920e-05f, -2.300404255e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.116508179e-05f, +6.697477416e-04f, +2.055423531e-04f, -2.502485489e-03f, -5.372999074e-04f, +5.551634964e-03f, +8.868803424e-04f, -1.020682850e-02f, -1.037379463e-03f, +1.646884962e-02f, +7.116722567e-04f, -2.398674922e-02f, +3.440498641e-04f, +3.204847761e-02f, -2.260756634e-03f, -3.967234657e-02f, +4.966654293e-03f, +4.578788574e-02f, -8.160646843e-03f, -4.946349911e-02f, +1.135715111e-02f, +5.011899875e-02f, -1.399553509e-02f, -4.766161887e-02f, +1.558320174e-02f, +4.250536461e-02f, -1.582728234e-02f, -3.546859322e-02f, +1.471204625e-02f, +2.758135544e-02f, -1.249710182e-02f, -1.985947935e-02f, +9.638520573e-03f, +1.310826026e-02f, -6.660820755e-03f, -7.803998054e-03f, +4.022612281e-03f, +4.073052804e-03f, -2.017546043e-03f, -1.756666214e-03f, +5.697411582e-04f, +4.717319809e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.579055794e-05f, -1.557062569e-05f, +6.802174843e-05f, +5.640774150e-05f, -1.796026234e-04f, -1.013171845e-04f, +3.671650045e-04f, +1.468336382e-04f, -6.397591682e-04f, -1.755411240e-04f, +9.901242290e-04f, +1.675640669e-04f, -1.391391680e-03f, -1.067187602e-04f, +1.798877921e-03f, -1.315596484e-05f, -2.157361451e-03f, +1.840150670e-04f, +2.412404450e-03f, -3.834040852e-04f, -2.522751965e-03f, +5.787966648e-04f, +2.470231970e-03f, -7.354301793e-04f, -2.264174645e-03f, +8.252821801e-04f, +1.939005358e-03f, -8.343344836e-04f, -1.545776231e-03f, +7.658107828e-04f, +1.140234026e-03f, -6.384530061e-04f, -7.709358742e-04f, +4.805927579e-04f, +4.706364215e-04f, -3.221336618e-04f, -2.528546485e-04f, +1.870942350e-04f, +1.137275915e-04f, -8.891950538e-05f, -2.933397920e-05f, +2.300404255e-05f, +0.000000000e+00f,\n    /*  8,28 (44) */\n    +0.000000000e+00f, +2.695563973e-05f, -6.541771159e-04f, -2.244912495e-04f, +1.665209226e-03f, +8.146572943e-04f, -3.307125579e-03f, -2.133521087e-03f, +5.688434141e-03f, +4.655069744e-03f, -8.861381935e-03f, -9.045256180e-03f, +1.283087113e-02f, +1.632307510e-02f, -1.762133351e-02f, -2.837543496e-02f, +2.349822851e-02f, +4.985644310e-02f, -3.182556617e-02f, -9.818103449e-02f, +5.116622676e-02f, +3.508504521e-01f, +4.773631371e-01f, +2.786217994e-01f, -9.402776357e-03f, -9.621234458e-02f, -4.161044122e-03f, +5.281349836e-02f, +7.601650574e-03f, -3.200617651e-02f, -7.977781293e-03f, +1.960624616e-02f, +7.007208321e-03f, -1.165296341e-02f, -5.469318894e-03f, +6.526264988e-03f, +3.828240844e-03f, -3.341008035e-03f, -2.370124883e-03f, +1.497082207e-03f, +1.245245247e-03f, -5.404071790e-04f, -4.947360235e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.496697687e-05f, +1.673956517e-05f, -4.703431483e-05f, -4.404318231e-05f, +1.017258544e-04f, +1.006666355e-04f, -1.831595935e-04f, -2.055361406e-04f, +2.923724898e-04f, +3.851092549e-04f, -4.260391358e-04f, -6.784234845e-04f, +5.749963216e-04f, +1.152255607e-03f, -7.199174749e-04f, -1.951762343e-03f, +8.070971557e-04f, +3.517397689e-03f, -5.323173350e-04f, -8.260968595e-03f, -8.497911455e-03f, +1.260943332e-03f, +9.476706422e-03f, +6.833018219e-03f, -9.857966404e-04f, -3.349386414e-03f, +5.945548166e-05f, +1.990617239e-03f, +1.881973897e-04f, -1.238230873e-03f, -2.438939764e-04f, +7.645391042e-04f, +2.236196045e-04f, -4.549205816e-04f, -1.735388265e-04f, +2.548073873e-04f, +1.174248849e-04f, -1.309782120e-04f, -6.816203638e-05f, +5.961999631e-05f, +3.165446722e-05f, -2.251934746e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.695563973e-05f, +6.541771159e-04f, +2.735641016e-04f, -2.446077748e-03f, -7.169025308e-04f, +5.450317780e-03f, +1.254045347e-03f, -1.005999486e-02f, -1.677138632e-03f, +1.629330850e-02f, +1.701796486e-03f, -2.381918515e-02f, -1.047341816e-03f, +3.194175885e-02f, -4.618787135e-04f, -3.968550254e-02f, +2.809292843e-03f, +4.597190081e-02f, -5.748242393e-03f, -4.984690319e-02f, +8.834399142e-03f, +5.069779542e-02f, -1.152530311e-02f, -4.839704905e-02f, +1.331902710e-02f, +4.333064679e-02f, -1.388827698e-02f, -3.630292770e-02f, +1.316627002e-02f, +2.834716623e-02f, -1.135686779e-02f, -2.049793236e-02f, +8.867584699e-03f, +1.358885301e-02f, -6.190184334e-03f, -8.126131716e-03f, +3.769757633e-03f, +4.260147039e-03f, -1.903818451e-03f, -1.845585719e-03f, +5.404071790e-04f, +4.947360235e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.496697687e-05f, -1.673956517e-05f, +6.487345079e-05f, +6.128744519e-05f, -1.733126841e-04f, -1.132135465e-04f, +3.570513405e-04f, +1.699983012e-04f, -6.260426865e-04f, -2.144137544e-04f, +9.742717304e-04f, +2.257867632e-04f, -1.376137616e-03f, -1.860743392e-04f, +1.787836834e-03f, +8.642323395e-05f, -2.154278965e-03f, +6.813399060e-05f, +2.420232485e-03f, -2.578030512e-04f, -2.542818943e-03f, +4.517227478e-04f, +2.501773131e-03f, -6.153823148e-04f, -2.304386847e-03f, +7.195346339e-04f, +1.983627737e-03f, -7.477719213e-04f, -1.590031001e-03f, +7.003516420e-04f, +1.179851125e-03f, -5.931572319e-04f, -8.029701393e-04f, +4.523507860e-04f, +4.938687636e-04f, -3.066833210e-04f, -2.677148706e-04f, +1.800565991e-04f, +1.218299000e-04f, -8.659178844e-05f, -3.165446722e-05f, +2.251934746e-05f, +0.000000000e+00f,\n    /*  8,29 (44) */\n    +0.000000000e+00f, +4.192261661e-05f, -6.374375508e-04f, -2.715255644e-04f, +1.621166044e-03f, +9.163831487e-04f, -3.206458944e-03f, -2.316680681e-03f, +5.482898000e-03f, +4.947442234e-03f, -8.476272680e-03f, -9.471295316e-03f, +1.215244765e-02f, +1.689807143e-02f, -1.646907790e-02f, -2.909535244e-02f, +2.154646617e-02f, +5.066354025e-02f, -2.830816848e-02f, -9.871335182e-02f, +4.290525816e-02f, +3.423525406e-01f, +4.786240804e-01f, +2.880985058e-01f, -2.569758138e-03f, -9.719814122e-02f, -7.510430536e-03f, +5.287295384e-02f, +9.592267814e-03f, -3.181797912e-02f, -9.216012166e-03f, +1.936235218e-02f, +7.771747426e-03f, -1.142934380e-02f, -5.924239476e-03f, +6.352726162e-03f, +4.083048231e-03f, -3.223583150e-03f, -2.501103095e-03f, +1.428920170e-03f, +1.304865243e-03f, -5.087527117e-04f, -5.172553710e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.412815468e-05f, +1.782320644e-05f, -4.497951281e-05f, -4.683387456e-05f, +9.727478371e-05f, +1.061042274e-04f, -1.743860058e-04f, -2.145761941e-04f, +2.763165514e-04f, +3.984872011e-04f, -3.982743552e-04f, -6.962673879e-04f, +5.287923119e-04f, +1.173306186e-03f, -6.441994771e-04f, -1.971053077e-03f, +6.803382136e-04f, +3.514968676e-03f, -2.995740239e-04f, -8.078603771e-03f, -8.672761342e-03f, +9.019193399e-04f, +9.372571504e-03f, +7.056735594e-03f, -7.861933153e-04f, -3.394090501e-03f, -6.013471407e-05f, +1.998535394e-03f, +2.635521593e-04f, -1.234654531e-03f, -2.917304806e-04f, +7.577892523e-04f, +2.533289979e-04f, -4.483821483e-04f, -1.912127353e-04f, +2.497965870e-04f, +1.273018687e-04f, -1.277717665e-04f, -7.322889637e-05f, +5.796636668e-05f, +3.395813985e-05f, -2.195065330e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.192261661e-05f, +6.374375508e-04f, +3.384375524e-04f, -2.384790302e-03f, -8.902152149e-04f, +5.337104233e-03f, +1.611096687e-03f, -9.889996558e-03f, -2.303181318e-03f, +1.607889474e-02f, +2.676068216e-03f, -2.359339839e-02f, -2.423479432e-03f, +3.175568451e-02f, +1.325958121e-03f, -3.959907930e-02f, +6.550138773e-04f, +4.604003480e-02f, -3.328009908e-03f, -5.010470624e-02f, +6.291580199e-03f, +5.114951817e-02f, -9.023529984e-03f, -4.901243137e-02f, +1.101464025e-02f, +4.405018143e-02f, -1.190464925e-02f, -3.705069963e-02f, +1.157623902e-02f, +2.904751787e-02f, -1.017701667e-02f, -2.109108959e-02f, +8.064614559e-03f, +1.404120380e-02f, -5.696315570e-03f, -8.432815037e-03f, +3.502042762e-03f, +4.440203638e-03f, -1.781988551e-03f, -1.932177508e-03f, +5.087527117e-04f, +5.172553710e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.412815468e-05f, -1.782320644e-05f, +6.163946680e-05f, +6.585830902e-05f, -1.667040381e-04f, -1.245574544e-04f, +3.461868290e-04f, +1.923376664e-04f, -6.109072174e-04f, -2.522261286e-04f, +9.561042310e-04f, +2.828338165e-04f, -1.357510663e-03f, -2.643318554e-04f, +1.772324548e-03f, +1.852150214e-04f, -2.145743589e-03f, -4.749181134e-05f, +2.421901676e-03f, -1.317713624e-04f, -2.556419947e-03f, +3.234896838e-04f, +2.526995766e-03f, -4.935323277e-04f, -2.338856349e-03f, +6.115396462e-04f, +2.023410232e-03f, -6.587819237e-04f, -1.630525108e-03f, +6.325582952e-04f, +1.216800403e-03f, -5.458441169e-04f, -8.333047132e-04f, +4.225430608e-04f, +5.161568565e-04f, -2.901524419e-04f, -2.821450487e-04f, +1.723708327e-04f, +1.297982064e-04f, -8.394210187e-05f, -3.395813985e-05f, +2.195065330e-05f, +0.000000000e+00f,\n    /*  8,30 (44) */\n    +0.000000000e+00f, +5.605077129e-05f, -6.196143443e-04f, -3.165050772e-04f, +1.574332169e-03f, +1.013657932e-03f, -3.100354716e-03f, -2.491066686e-03f, +5.268321806e-03f, +5.223758785e-03f, -8.077785479e-03f, -9.869569671e-03f, +1.145618026e-02f, +1.742686374e-02f, -1.529577171e-02f, -2.973955191e-02f, +1.957541309e-02f, +5.134387847e-02f, -2.479319980e-02f, -9.901292585e-02f, +3.482665439e-02f, +3.336797793e-01f, +4.795259998e-01f, +2.974710773e-01f, +4.486977456e-03f, -9.798433453e-02f, -1.090452104e-02f, +5.281281913e-02f, +1.159080321e-02f, -3.155442696e-02f, -1.045066670e-02f, +1.907062170e-02f, +8.529536678e-03f, -1.117601480e-02f, -6.372621624e-03f, +6.161513426e-03f, +4.332844818e-03f, -3.096281281e-03f, -2.628874861e-03f, +1.355691274e-03f, +1.362831610e-03f, -4.747945719e-04f, -5.392060243e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.327735794e-05f, +1.882096265e-05f, -4.286525175e-05f, -4.943904653e-05f, +9.268517436e-05f, +1.111798319e-04f, -1.653631379e-04f, -2.229608930e-04f, +2.598795924e-04f, +4.107447354e-04f, -3.700051028e-04f, -7.122748442e-04f, +4.820347566e-04f, +1.191423856e-03f, -5.681144816e-04f, -1.985688665e-03f, +5.541453813e-04f, +3.505077189e-03f, -7.163281020e-05f, -7.888409201e-03f, -8.836192550e-03f, +5.416502342e-04f, +9.256347174e-03f, +7.274526133e-03f, -5.803880719e-04f, -3.432201781e-03f, -1.815279258e-04f, +2.002069348e-03f, +3.393868463e-04f, -1.228207727e-03f, -3.395733510e-04f, +7.491921922e-04f, +2.828937322e-04f, -4.406935626e-04f, -2.087281453e-04f, +2.441037719e-04f, +1.370602814e-04f, -1.241869104e-04f, -7.822891266e-05f, +5.612101223e-05f, +3.623810225e-05f, -2.129703629e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.605077129e-05f, +6.196143443e-04f, +4.000770192e-04f, -2.318931993e-03f, -1.056919253e-03f, +5.212546779e-03f, +1.957283516e-03f, -9.697658891e-03f, -2.914088535e-03f, +1.582666861e-02f, +3.632172447e-03f, -2.331056457e-02f, -3.780990095e-03f, +3.149135265e-02f, +3.098282669e-03f, -3.941386428e-02f, -1.490729711e-03f, +4.599254299e-02f, -9.061082325e-04f, -5.023647761e-02f, +3.735160252e-03f, +5.147300785e-02f, -6.496534218e-03f, -4.950596369e-02f, +8.675783903e-03f, +4.466172107e-02f, -9.881239015e-03f, -3.770948155e-02f, +9.945713914e-03f, +2.968007616e-02f, -8.960216265e-03f, -2.163693371e-02f, +7.231309846e-03f, +1.446374686e-02f, -5.180158713e-03f, -8.722967479e-03f, +3.219897714e-03f, +4.612574470e-03f, -1.652190345e-03f, -2.016119610e-03f, +4.747945719e-04f, +5.392060243e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.327735794e-05f, -1.882096265e-05f, +5.833250182e-05f, +7.011533139e-05f, -1.598027048e-04f, -1.353292048e-04f, +3.346144730e-04f, +2.138056599e-04f, -5.944132943e-04f, -2.888928305e-04f, +9.356957414e-04f, +3.385690670e-04f, -1.335589277e-03f, -3.412978666e-04f, +1.752411078e-03f, +2.829697519e-04f, -2.131802680e-03f, -1.625664531e-04f, +2.417424508e-03f, -5.633100092e-06f, -2.563525537e-03f, +1.944264780e-04f, +2.545828660e-03f, -3.701898939e-04f, -2.367477734e-03f, +5.015668458e-04f, +2.058226523e-03f, -5.675804767e-04f, -1.667127252e-03f, +5.625883596e-04f, +1.250960538e-03f, -4.966166449e-04f, -8.618392464e-04f, +3.912278939e-04f, +5.374266916e-04f, -2.725676232e-04f, -2.960972531e-04f, +1.640445681e-04f, +1.376061596e-04f, -8.096929242e-05f, -3.623810225e-05f, +2.129703629e-05f, +0.000000000e+00f,\n    /*  8,31 (44) */\n    +0.000000000e+00f, +6.932812923e-05f, -6.007933817e-04f, -3.593703289e-04f, +1.524893123e-03f, +1.106343107e-03f, -2.989174884e-03f, -2.656429824e-03f, +5.045360913e-03f, +5.483638377e-03f, -7.667040744e-03f, -1.023957477e-02f, +1.074390542e-02f, +1.790889849e-02f, -1.410434786e-02f, -3.030766640e-02f, +1.758972443e-02f, +5.189802385e-02f, -2.128812261e-02f, -9.908455866e-02f, +2.693824519e-02f, +3.248435867e-01f, +4.800676500e-01f, +3.067274245e-01f, +1.176150359e-02f, -9.856472261e-02f, -1.433672282e-02f, +5.263129120e-02f, +1.359287256e-02f, -3.121504012e-02f, -1.167887442e-02f, +1.873104835e-02f, +9.278728870e-03f, -1.089312107e-02f, -6.813315187e-03f, +5.952785281e-03f, +4.576948590e-03f, -2.959221000e-03f, -2.753061772e-03f, +1.277462361e-03f, +1.418952622e-03f, -4.385564696e-04f, -5.605030605e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.241779730e-05f, +1.973251484e-05f, -4.069879002e-05f, -5.185638397e-05f, +8.797140009e-05f, +1.158881642e-04f, -1.561170982e-04f, -2.306814620e-04f, +2.431061282e-04f, +4.218703204e-04f, -3.413037314e-04f, -7.264350323e-04f, +4.348372014e-04f, +1.206608172e-03f, -4.918364215e-04f, -1.995704894e-03f, +4.287778866e-04f, +3.487874864e-03f, +1.512011525e-04f, -7.690748195e-03f, -8.988032967e-03f, +1.806332249e-04f, +9.128129279e-03f, +7.485993408e-03f, -3.686348989e-04f, -3.463524932e-03f, -3.044894664e-04f, +2.001146980e-03f, +4.155373014e-04f, -1.218865262e-03f, -3.873126573e-04f, +7.387415145e-04f, +3.122425653e-04f, -4.318552366e-04f, -2.260407756e-04f, +2.377308607e-04f, +1.466740772e-04f, -1.202249485e-04f, -8.314785430e-05f, +5.408411680e-05f, +3.848735070e-05f, -2.055780628e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.932812923e-05f, +6.007933817e-04f, +4.584095210e-04f, -2.248816662e-03f, -1.216721958e-03f, +5.077217574e-03f, +2.291897989e-03f, -9.483853231e-03f, -3.508501830e-03f, +1.553777578e-02f, +4.567868188e-03f, -2.297199551e-02f, -5.116579372e-03f, +3.115005478e-02f, +4.850693747e-03f, -3.913089453e-02f, -3.622532391e-03f, +4.582997653e-02f, +1.511316275e-03f, -5.024211071e-02f, +1.171634715e-03f, +5.166743433e-02f, -3.950705558e-03f, -4.987615359e-02f, +6.308306169e-03f, +4.516328792e-02f, -7.823012491e-03f, -3.827706203e-02f, +8.278586662e-03f, +3.024266452e-02f, -7.709255728e-03f, -2.213355035e-02f, +6.369470600e-03f, +1.485497475e-02f, -4.642732022e-03f, -8.995535102e-03f, +2.923800461e-03f, +4.776619039e-03f, -1.514584185e-03f, -2.097088902e-03f, +4.385564696e-04f, +5.605030605e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.241779730e-05f, -1.973251484e-05f, +5.496512532e-05f, +7.405458027e-05f, -1.526349625e-04f, -1.455110959e-04f, +3.223784588e-04f, +2.343593103e-04f, -5.766242397e-04f, -3.243325880e-04f, +9.131253679e-04f, +3.928611841e-04f, -1.310459866e-03f, -4.167838078e-04f, +1.728177459e-03f, +3.794418868e-04f, -2.112517436e-03f, -2.767965642e-04f, +2.406829384e-03f, +1.202879539e-04f, -2.564123150e-03f, +6.486431433e-05f, +2.558217123e-03f, -2.456691656e-04f, -2.390160510e-03f, +3.898920508e-04f, +2.087962664e-03f, -4.743906180e-04f, -1.699715456e-03f, +4.906064529e-04f, +1.282216489e-03f, -4.455839699e-04f, -8.884770433e-04f, +3.584684405e-04f, +5.576059524e-04f, -2.539588194e-04f, -3.095240124e-04f, +1.550874398e-04f, +1.452272650e-04f, -7.767317955e-05f, -3.848735070e-05f, +2.055780628e-05f, +0.000000000e+00f,\n    /*  9, 0 (40) */\n    +0.000000000e+00f, -7.017253429e-04f, -1.750424134e-04f, +2.058419758e-03f, -1.982704743e-04f, -4.434814470e-03f, +1.641618436e-03f, +7.968272772e-03f, -5.099884949e-03f, -1.256166394e-02f, +1.191669646e-02f, +1.783553129e-02f, -2.422063161e-02f, -2.315743311e-02f, +4.659175191e-02f, +2.775293222e-02f, -9.501521185e-02f, -3.087432576e-02f, +3.144630653e-01f, +5.319805819e-01f, +3.144630653e-01f, -3.087432576e-02f, -9.501521185e-02f, +2.775293222e-02f, +4.659175191e-02f, -2.315743311e-02f, -2.422063161e-02f, +1.783553129e-02f, +1.191669646e-02f, -1.256166394e-02f, -5.099884949e-03f, +7.968272772e-03f, +1.641618436e-03f, -4.434814470e-03f, -1.982704743e-04f, +2.058419758e-03f, -1.750424134e-04f, -7.017253429e-04f, +1.133055274e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.358906275e-05f, -6.207941071e-05f, -3.486249123e-05f, +1.628499352e-04f, +1.622795872e-05f, -3.315651769e-04f, +7.338679611e-05f, +5.762344780e-04f, -2.931575445e-04f, -8.949038318e-04f, +7.282588089e-04f, +1.284178155e-03f, -1.526756362e-03f, -1.783473198e-03f, +3.073632881e-03f, +2.758795409e-03f, -7.240324242e-03f, -1.168634640e-02f, -2.454975392e-04f, +1.155215612e-02f, +7.570460241e-03f, -2.558030536e-03f, -3.211078300e-03f, +1.683739550e-03f, +1.616263007e-03f, -1.236341038e-03f, -7.898243641e-04f, +8.756226649e-04f, +3.335738481e-04f, -5.718216365e-04f, -9.753773237e-05f, +3.335181116e-04f, -3.677848260e-06f, -1.662613606e-04f, +2.962293171e-05f, +6.466356242e-05f, -2.219819630e-05f, -1.426633530e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.017253429e-04f, +1.750424134e-04f, -2.819252016e-03f, +1.317047024e-03f, +5.813065763e-03f, -5.638484823e-03f, -8.056056973e-03f, +1.356304760e-02f, +6.644294405e-03f, -2.362138728e-02f, +9.950267494e-04f, +3.194086253e-02f, -1.503480532e-02f, -3.374209658e-02f, +3.210410297e-02f, +2.603063562e-02f, -4.623861285e-02f, -9.813316511e-03f, +5.173229864e-02f, -9.813316511e-03f, -4.623861285e-02f, +2.603063562e-02f, +3.210410297e-02f, -3.374209658e-02f, -1.503480532e-02f, +3.194086253e-02f, +9.950267494e-04f, -2.362138728e-02f, +6.644294405e-03f, +1.356304760e-02f, -8.056056973e-03f, -5.638484823e-03f, +5.813065763e-03f, +1.317047024e-03f, -2.819252016e-03f, +8.373329469e-05f, +7.017253429e-04f, -1.133055274e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.358906275e-05f, +6.207941071e-05f, +2.894835191e-05f, -2.491776424e-04f, +9.111288168e-05f, +4.535489080e-04f, -4.195534187e-04f, -5.571422708e-04f, +9.581496479e-04f, +3.714972203e-04f, -1.555869431e-03f, +2.195481678e-04f, +1.936460947e-03f, -1.142211979e-03f, -1.832375687e-03f, +2.111638671e-03f, +1.154106075e-03f, -2.749369645e-03f, -7.898385675e-05f, +2.782464711e-03f, -1.015321536e-03f, -2.198575782e-03f, +1.742426403e-03f, +1.252483614e-03f, -1.904009142e-03f, -3.198737579e-04f, +1.568194600e-03f, -3.024963154e-04f, -9.914079357e-04f, +5.230583249e-04f, +4.520995028e-04f, -4.445270837e-04f, -1.118440529e-04f, +2.514351183e-04f, -2.038303472e-05f, -8.927911243e-05f, +2.219819630e-05f, +1.426633530e-05f, +0.000000000e+00f,\n    /*  9, 1 (40) */\n    +0.000000000e+00f, -6.781362801e-04f, -2.371218241e-04f, +2.023557267e-03f, -3.542053911e-05f, -4.418586511e-03f, +1.310053259e-03f, +8.041659568e-03f, -4.523650471e-03f, -1.285482148e-02f, +1.102179262e-02f, +1.856379010e-02f, -2.293645346e-02f, -2.468418947e-02f, +4.480827871e-02f, +3.082656510e-02f, -9.225641644e-02f, -3.811465000e-02f, +3.027767189e-01f, +5.317350843e-01f, +3.260152214e-01f, -2.330386552e-02f, -9.757324238e-02f, +2.454185392e-02f, +4.827549146e-02f, -2.154117010e-02f, -2.545697265e-02f, +1.704570693e-02f, +1.279231912e-02f, -1.222809009e-02f, -5.671706586e-03f, +7.870735040e-03f, +1.975136548e-03f, -4.438492318e-03f, -3.645318349e-04f, +2.088042690e-03f, -1.103788509e-04f, -7.239235392e-04f, +9.903919207e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.484828019e-05f, -5.937724690e-05f, -3.985765772e-05f, +1.590369716e-04f, +2.846385128e-05f, -3.286985463e-04f, +4.946566872e-05f, +5.789455142e-04f, -2.525755473e-04f, -9.113871867e-04f, +6.656193674e-04f, +1.327740406e-03f, -1.434488871e-03f, -1.876698597e-03f, +2.930634935e-03f, +2.947865806e-03f, -6.904336239e-03f, -1.180217583e-02f, -7.360767122e-04f, +1.139971809e-02f, +7.894042301e-03f, -2.345791698e-03f, -3.342510736e-03f, +1.577657299e-03f, +1.702718913e-03f, -1.184296597e-03f, -8.501259890e-04f, +8.535545205e-04f, +3.737057772e-04f, -5.656906386e-04f, -1.218519049e-04f, +3.345337019e-04f, +9.155233045e-06f, -1.692513351e-04f, +2.414937287e-05f, +6.711753041e-05f, -2.067628486e-05f, -1.546725007e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.781362801e-04f, +2.371218241e-04f, -2.790303664e-03f, +1.067869382e-03f, +5.904178645e-03f, -5.184935915e-03f, -8.475610392e-03f, +1.300590533e-02f, +7.602444053e-03f, -2.324989006e-02f, -5.608426814e-04f, +3.216041070e-02f, -1.309834438e-02f, -3.488430856e-02f, +3.027172728e-02f, +2.814227429e-02f, -4.508450678e-02f, -1.256268616e-02f, +5.165331479e-02f, -7.030851800e-03f, -4.725393439e-02f, +2.383205984e-02f, +3.384652937e-02f, -3.248961297e-02f, -1.693881447e-02f, +3.162098877e-02f, +2.563221349e-03f, -2.392388360e-02f, +5.652886470e-03f, +1.408610593e-02f, -7.603957470e-03f, -6.083011907e-03f, +5.701221710e-03f, +1.568482143e-03f, -2.839635051e-03f, -5.545817737e-06f, +7.239235392e-04f, -9.903919207e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.484828019e-05f, +5.937724690e-05f, +3.716170056e-05f, -2.461543489e-04f, +7.053763744e-05f, +4.609517421e-04f, -3.862230372e-04f, -5.889763422e-04f, +9.223241014e-04f, +4.385649540e-04f, -1.538832243e-03f, +1.193812653e-04f, +1.962691735e-03f, -1.029049061e-03f, -1.916252486e-03f, +2.018479416e-03f, +1.289012509e-03f, -2.707823740e-03f, -2.367048336e-04f, +2.806996037e-03f, -8.730845232e-04f, -2.278997210e-03f, +1.646659396e-03f, +1.359500260e-03f, -1.865395081e-03f, -4.200416145e-04f, +1.575722699e-03f, -2.317611561e-04f, -1.021958948e-03f, +4.868021676e-04f, +4.837415165e-04f, -4.338856277e-04f, -1.326642441e-04f, +2.528998792e-04f, -1.148671485e-05f, -9.273332497e-05f, +2.067628486e-05f, +1.546725007e-05f, +0.000000000e+00f,\n    /*  9, 2 (40) */\n    +0.000000000e+00f, -6.532880000e-04f, -2.964990710e-04f, +1.983699609e-03f, +1.236164325e-04f, -4.390122660e-03f, +9.813547128e-04f, +8.091125237e-03f, -3.944704957e-03f, -1.310739703e-02f, +1.011040544e-02f, +1.922940947e-02f, -2.160871305e-02f, -2.611867834e-02f, +4.293158011e-02f, +3.375720004e-02f, -8.930855063e-02f, -4.501898624e-02f, +2.909745431e-01f, +5.309990076e-01f, +3.374149395e-01f, -1.540982321e-02f, -9.991903408e-02f, +2.119934318e-02f, +4.985314876e-02f, -1.983845119e-02f, -2.664126924e-02f, +1.619558094e-02f, +1.364587364e-02f, -1.185438431e-02f, -6.237397224e-03f, +7.748883135e-03f, +2.309670250e-03f, -4.429337085e-03f, -5.337831700e-04f, +2.112192063e-03f, -4.326132053e-05f, -7.445998240e-04f, +8.357194200e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.597573519e-05f, -5.656931007e-05f, -4.459906621e-05f, +1.548431800e-04f, +4.035585483e-05f, -3.249441212e-04f, +2.583908748e-05f, +5.799757153e-04f, -2.119451354e-04f, -9.250699226e-04f, +6.020962355e-04f, +1.366972949e-03f, -1.339753471e-03f, -1.963275518e-03f, +2.782550855e-03f, +3.125049664e-03f, -6.563203266e-03f, -1.189956727e-02f, -1.225409024e-03f, +1.122918129e-02f, +8.210375133e-03f, -2.122327652e-03f, -3.467476865e-03f, +1.465405375e-03f, +1.785838056e-03f, -1.128125071e-03f, -9.089743302e-04f, +8.287183510e-04f, +4.134335714e-04f, -5.578298758e-04f, -1.462610725e-04f, +3.345906660e-04f, +2.223852773e-05f, -1.718008233e-04f, +1.845322694e-05f, +6.942925435e-05f, -1.902443446e-05f, -1.665995399e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.532880000e-04f, +2.964990710e-04f, -2.753141964e-03f, +8.217150332e-04f, +5.974716282e-03f, -4.723984173e-03f, -8.861833429e-03f, +1.241692899e-02f, +8.524768155e-03f, -2.281132511e-02f, -2.099674924e-03f, +3.227979197e-02f, -1.113565264e-02f, -3.591335762e-02f, +2.835547480e-02f, +3.016075371e-02f, -4.379549427e-02f, -1.527050990e-02f, +5.141660995e-02f, -4.223855762e-03f, -4.812701891e-02f, +2.155306263e-02f, +3.549318877e-02f, -3.113011271e-02f, -1.880420955e-02f, +3.120094716e-02f, +4.138944048e-03f, -2.415564475e-02f, +4.630927521e-03f, +1.457290810e-02f, -7.120215954e-03f, -6.516897535e-03f, +5.568557466e-03f, +1.821382022e-03f, -2.851121766e-03f, -9.827914271e-05f, +7.445998240e-04f, -8.357194200e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.597573519e-05f, +5.656931007e-05f, +4.500395056e-05f, -2.423941790e-04f, +5.018332352e-05f, +4.667416090e-04f, -3.522287850e-04f, -6.184912964e-04f, +8.840778467e-04f, +5.035089837e-04f, -1.517182323e-03f, +1.968637598e-05f, +1.982662889e-03f, -9.133656519e-04f, -1.993822389e-03f, +1.919410225e-03f, +1.419628401e-03f, -2.657966449e-03f, -3.936863883e-04f, +2.822877675e-03f, -7.278325354e-04f, -2.352629094e-03f, +1.545349051e-03f, +1.462906510e-03f, -1.820697626e-03f, -5.197332231e-04f, +1.578383327e-03f, -1.594984803e-04f, -1.049669748e-03f, +4.484597407e-04f, +5.143607579e-04f, -4.216293789e-04f, -1.535048423e-04f, +2.535472158e-04f, -2.282161354e-06f, -9.596697517e-05f, +1.902443446e-05f, +1.665995399e-05f, +0.000000000e+00f,\n    /*  9, 3 (40) */\n    +0.000000000e+00f, -6.273122648e-04f, -3.530683810e-04f, +1.939100543e-03f, +2.784596125e-04f, -4.349766805e-03f, +6.564105917e-04f, +8.116964324e-03f, -3.364729242e-03f, -1.331934216e-02f, +9.185335516e-03f, +1.983150570e-02f, -2.024174010e-02f, -2.745843181e-02f, +4.096830459e-02f, +3.653975089e-02f, -8.618350097e-02f, -5.158218950e-02f, +2.790749758e-01f, +5.297735986e-01f, +3.486441208e-01f, -7.199448081e-03f, -1.020413617e-01f, +1.773186632e-02f, +5.131855413e-02f, -1.805261313e-02f, -2.776939432e-02f, +1.528660661e-02f, +1.447459199e-02f, -1.144095074e-02f, -6.795227100e-03f, +7.602622062e-03f, +2.644260916e-03f, -4.407098558e-03f, -7.055839932e-04f, +2.130645290e-03f, +2.616793381e-05f, -7.636242585e-04f, +6.691198800e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.697179213e-05f, -5.366786361e-05f, -4.907838704e-05f, +1.502899857e-04f, +5.187593367e-05f, -3.203299372e-04f, +2.569795609e-06f, +5.793505348e-04f, -1.713818723e-04f, -9.359571487e-04f, +5.378792310e-04f, +1.401833611e-03f, -1.242845318e-03f, -2.043083219e-03f, +2.629851781e-03f, +3.290183488e-03f, -6.217635905e-03f, -1.197847955e-02f, -1.712666080e-03f, +1.104073040e-02f, +8.518771646e-03f, -1.887915150e-03f, -3.585531680e-03f, +1.347181810e-03f, +1.865339109e-03f, -1.067919359e-03f, -9.661812678e-04f, +8.011412946e-04f, +4.526367213e-04f, -5.482325946e-04f, -1.706955005e-04f, +3.336701967e-04f, +3.553783943e-05f, -1.738917470e-04f, +1.254691095e-05f, +7.158682972e-05f, -1.724426288e-05f, -1.783913596e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.273122648e-04f, +3.530683810e-04f, -2.708138013e-03f, +5.793208542e-04f, +6.024899606e-03f, -4.257242564e-03f, -9.214062214e-03f, +1.179843769e-02f, +9.408846001e-03f, -2.230781612e-02f, -3.616857248e-03f, +3.229947834e-02f, -9.152989753e-03f, -3.682672327e-02f, +2.636165241e-02f, +3.208016393e-02f, -4.237586587e-02f, -1.792847634e-02f, +5.102292356e-02f, -1.400978088e-03f, -4.885485145e-02f, +1.920043354e-02f, +3.703853782e-02f, -2.966720620e-02f, -2.062490717e-02f, +3.068121394e-02f, +5.717327375e-03f, -2.431514323e-02f, +3.581257773e-03f, +1.502136784e-02f, -6.605855196e-03f, -6.938526914e-03f, +5.415052624e-03f, +2.074929238e-03f, -2.853403927e-03f, -1.942461179e-04f, +7.636242585e-04f, -6.691198800e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.697179213e-05f, +5.366786361e-05f, +5.245783240e-05f, -2.379279690e-04f, +3.011285216e-05f, +4.709297982e-04f, -3.176913299e-04f, -6.456264225e-04f, +8.435634077e-04f, +5.661476899e-04f, -1.491032742e-03f, -7.922725540e-05f, +1.996355930e-03f, -7.955384059e-04f, -2.064871998e-03f, +1.814760920e-03f, +1.545555799e-03f, -2.599963312e-03f, -5.494381966e-04f, +2.830050922e-03f, -5.800135591e-04f, -2.419218187e-03f, +1.438788586e-03f, +1.562356451e-03f, -1.770015613e-03f, -6.186289941e-04f, +1.576121102e-03f, -8.592225231e-05f, -1.074415005e-03f, +4.081250930e-04f, +5.438400155e-04f, -4.077687376e-04f, -1.742957362e-04f, +2.533547466e-04f, +7.206093704e-06f, -9.896008361e-05f, +1.724426288e-05f, +1.783913596e-05f, +0.000000000e+00f,\n    /*  9, 4 (40) */\n    +0.000000000e+00f, -6.003404726e-04f, -4.067362447e-04f, +1.890022156e-03f, +4.287495982e-04f, -4.297890872e-03f, +3.360806545e-04f, +8.119534120e-03f, -2.785378707e-03f, -1.349072404e-02f, +8.249378367e-03f, +2.036938493e-02f, -1.883990649e-02f, -2.870127713e-02f, +3.892522138e-02f, +3.916960267e-02f, -8.289331748e-02f, -5.779982541e-02f, +2.670964963e-01f, +5.280609325e-01f, +3.596848512e-01f, +1.319323565e-03f, -1.039292769e-01f, +1.414633464e-02f, +5.266573594e-02f, -1.618727402e-02f, -2.883731368e-02f, +1.432042534e-02f, +1.527573329e-02f, -1.098831402e-02f, -7.343459695e-03f, +7.431926562e-03f, +2.977931112e-03f, -4.371560718e-03f, -8.794757402e-04f, +2.143192201e-03f, +9.775476354e-05f, -7.808685214e-04f, +4.907285204e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.783727893e-05f, -5.068515312e-05f, -5.328832891e-05f, +1.453994474e-04f, +6.299774079e-05f, -3.148860417e-04f, -2.028160784e-05f, +5.770997631e-04f, -1.309993024e-04f, -9.440617580e-04f, +4.731572712e-04f, +1.432292819e-03f, -1.144060974e-03f, -2.116020483e-03f, +2.473012407e-03f, +3.443132409e-03f, -5.868346728e-03f, -1.203890744e-02f, -2.197023751e-03f, +1.083458553e-02f, +8.818554479e-03f, -1.642858602e-03f, -3.696239674e-03f, +1.223203506e-03f, +1.940946266e-03f, -1.003784947e-03f, -1.021560463e-03f, +7.708587210e-04f, +4.911943059e-04f, -5.368969955e-04f, -1.950841424e-04f, +3.317560647e-04f, +4.901761035e-05f, -1.755070633e-04f, +6.443829298e-06f, +7.357855293e-05f, -1.533790785e-05f, -1.899936450e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.003404726e-04f, +4.067362447e-04f, -2.655680181e-03f, +3.413928852e-04f, +6.055012458e-03f, -3.786312766e-03f, -9.531753544e-03f, +1.115281127e-02f, +1.025240941e-02f, -2.174166843e-02f, -5.107889989e-03f, +3.222025109e-02f, -7.156633823e-03f, -3.762226168e-02f, +2.429678041e-02f, +3.389492485e-02f, -4.083031007e-02f, -2.052843966e-02f, +5.047348537e-02f, +1.429072834e-03f, -4.943486501e-02f, +1.678121535e-02f, +3.847732640e-02f, -2.810484974e-02f, -2.239492279e-02f, +3.006258494e-02f, +7.293448477e-03f, -2.440106548e-02f, +2.506842768e-03f, +1.542949293e-02f, -6.062015180e-03f, -7.346295651e-03f, +5.240756887e-03f, +2.328283984e-03f, -2.846197833e-03f, -2.932062015e-04f, +7.808685214e-04f, -4.907285204e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.783727893e-05f, +5.068515312e-05f, +5.950795440e-05f, -2.327882978e-04f, +1.038686813e-05f, +4.735327339e-04f, -2.827311737e-04f, -6.703296232e-04f, +8.009387080e-04f, +6.263088608e-04f, -1.460509853e-03f, -1.770554280e-04f, +2.003772433e-03f, -6.759485959e-04f, -2.129209512e-03f, +1.704877822e-03f, +1.666412475e-03f, -2.534005390e-03f, -7.034738605e-04f, +2.828484546e-03f, -4.300846601e-04f, -2.478532739e-03f, +1.327289183e-03f, +1.657514825e-03f, -1.713467675e-03f, -7.164092911e-04f, +1.568895977e-03f, -1.125303696e-05f, -1.096077505e-03f, +3.659001780e-04f, +5.720639893e-04f, -3.923197286e-04f, -1.949655339e-04f, +2.523025512e-04f, +1.695180326e-05f, -1.016930039e-04f, +1.533790785e-05f, +1.899936450e-05f, +0.000000000e+00f,\n    /*  9, 5 (40) */\n    +0.000000000e+00f, -5.725031937e-04f, -4.574213978e-04f, +1.836733827e-03f, +5.741490457e-04f, -4.234893131e-03f, +2.119461283e-05f, +8.099252512e-03f, -2.208278944e-03f, -1.362172334e-02f, +7.305316609e-03f, +2.084254221e-02f, -1.740761367e-02f, -2.984533810e-02f, +3.680920089e-02f, +4.164261508e-02f, -7.945018507e-02f, -6.366817214e-02f, +2.550575888e-01f, +5.258639088e-01f, +3.705194367e-01f, +1.013787804e-02f, -1.055721355e-01f, +1.045009497e-02f, +5.388893945e-02f, -1.424632776e-02f, -2.984109862e-02f, +1.329886488e-02f, +1.604659201e-02f, -1.049711971e-02f, -7.880356690e-03f, +7.236842420e-03f, +3.309687177e-03f, -4.322543108e-03f, -1.054982803e-03f, +2.149636030e-03f, +1.713333165e-04f, -7.962064292e-04f, +3.007348754e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.857347147e-05f, -4.763336528e-05f, -5.722263853e-05f, +1.401941747e-04f, +7.369666498e-05f, -3.086443671e-04f, -4.265680927e-05f, +5.732573706e-04f, -9.090865714e-05f, -9.494042749e-04f, +4.081178602e-04f, +1.458333504e-03f, -1.043697592e-03f, -2.182005593e-03f, +2.312509799e-03f, +3.583790178e-03f, -5.516048760e-03f, -1.208088148e-02f, -2.677663862e-03f, +1.061100191e-02f, +9.109057526e-03f, -1.387489687e-03f, -3.799176006e-03f, +1.093705953e-03f, +2.012390064e-03f, -9.358397985e-04f, -1.074927910e-03f, +7.379142543e-04f, +5.289853368e-04f, -5.238263198e-04f, -2.193548295e-04f, +3.288347151e-04f, +6.264100433e-05f, -1.766308406e-04f, +1.583525942e-07f, +7.539296666e-05f, -1.330803346e-05f, -2.013510604e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.725031937e-04f, +4.574213978e-04f, -2.596172226e-03f, +1.086045874e-04f, +6.065399326e-03f, -3.312780032e-03f, -9.814484717e-03f, +1.048248165e-02f, +1.105334812e-02f, -2.111535957e-02f, -6.568399842e-03f, +3.204319566e-02f, -5.152861390e-03f, -3.829821027e-02f, +2.216757090e-02f, +3.559980268e-02f, -3.916389760e-02f, -2.306244505e-02f, +4.977001151e-02f, +4.257557380e-03f, -4.986494967e-02f, +1.430268261e-02f, +3.980461559e-02f, -2.644733492e-02f, -2.410839046e-02f, +2.934617565e-02f, +8.862344454e-03f, -2.441231852e-02f, +1.410765263e-03f, +1.579539311e-02f, -5.489951191e-03f, -7.738615380e-03f, +5.045791354e-03f, +2.580586535e-03f, -2.829246030e-03f, -3.948992054e-04f, +7.962064292e-04f, -3.007348754e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.857347147e-05f, +4.763336528e-05f, +6.614081253e-05f, -2.270093316e-04f, -8.936416261e-06f, +4.745718276e-04f, -2.474682509e-04f, -6.925574664e-04f, +7.563664866e-04f, +6.838301498e-04f, -1.425752763e-03f, -2.734999243e-04f, +2.004933884e-03f, -5.549808657e-04f, -2.186665243e-03f, +1.590122586e-03f, +1.781833104e-03f, -2.460308630e-03f, -8.553124615e-04f, +2.818174904e-03f, -2.785105402e-04f, -2.530363307e-03f, +1.211179078e-03f, +1.748058174e-03f, -1.651191985e-03f, -8.127554692e-04f, +1.556683522e-03f, +6.428265365e-05f, -1.114548639e-03f, +3.218946234e-04f, +5.989197119e-04f, -3.753040453e-04f, -2.154417879e-04f, +2.503732986e-04f, +2.692706094e-05f, -1.041465109e-04f, +1.330803346e-05f, +2.013510604e-05f, +0.000000000e+00f,\n    /*  9, 6 (40) */\n    +0.000000000e+00f, -5.439297222e-04f, -5.050547631e-04f, +1.779511189e-03f, +7.143432204e-04f, -4.161196466e-03f, -2.874497542e-04f, +8.056595703e-03f, -1.635021573e-03f, -1.371263200e-02f, +6.355912334e-03f, +2.125066007e-02f, -1.594928017e-02f, -3.088903570e-02f, +3.462719530e-02f, +4.395512488e-02f, -7.586639489e-02f, -6.918422090e-02f, +2.429767073e-01f, +5.231862449e-01f, +3.811304387e-01f, +1.924693557e-02f, -1.069596252e-01f, +6.650918960e-03f, +5.498264540e-02f, -1.223393769e-02f, -3.077693842e-02f, +1.222393697e-02f, +1.678450626e-02f, -9.968134376e-03f, -8.404183010e-03f, +7.017487590e-03f, +3.638521892e-03f, -4.259902104e-03f, -1.231613644e-03f, +2.149794383e-03f, +2.467262831e-04f, -8.095144627e-04f, +9.938381493e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.918207680e-05f, -4.452458790e-05f, -6.087609675e-05f, +1.346972455e-04f, +8.394987165e-05f, -3.016386006e-04f, -6.449991268e-05f, +5.678613416e-04f, -5.121857295e-05f, -9.520126834e-04f, +3.429465880e-04f, +1.479950966e-03f, -9.420521158e-04f, -2.240976259e-03f, +2.148822212e-03f, +3.712079088e-03f, -5.161453937e-03f, -1.210446776e-02f, -3.153775873e-03f, +1.037026947e-02f, +9.389627448e-03f, -1.122166887e-03f, -3.893927662e-03f, +9.589428966e-04f, +2.079408200e-03f, -8.642142097e-04f, -1.126102485e-03f, +7.023597721e-04f, +5.658891074e-04f, -5.090289217e-04f, -2.434344664e-04f, +3.248953579e-04f, +7.636999562e-05f, -1.772483334e-04f, -6.294207036e-06f, +7.701890551e-05f, -1.115783486e-05f, -2.124074400e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.439297222e-04f, +5.050547631e-04f, -2.530031414e-03f, -1.184047442e-04f, +6.056462910e-03f, -2.838208205e-03f, -1.006195297e-02f, +9.789924182e-03f, +1.180971460e-02f, -2.043152942e-02f, -7.994152605e-03f, +3.176969573e-02f, -3.147927506e-03f, -3.885319114e-02f, +1.998090565e-02f, +3.718992526e-02f, -3.738206449e-02f, -2.552275368e-02f, +4.891469905e-02f, +7.075732284e-03f, -5.014346021e-02f, +1.177231930e-02f, +4.101579467e-02f, -2.469927675e-02f, -2.575958245e-02f, +2.853342018e-02f, +1.041902798e-02f, -2.434803587e-02f, +2.962166243e-04f, +1.611728773e-02f, -4.891031479e-03f, -8.113919425e-03f, +4.830349566e-03f, +2.830959834e-03f, -2.802318969e-03f, -4.990457162e-04f, +8.095144627e-04f, -9.938381493e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.918207680e-05f, +4.452458790e-05f, +7.234479279e-05f, -2.206266656e-04f, -2.780137444e-05f, +4.740733165e-04f, -2.120215373e-04f, -7.122752061e-04f, +7.100137044e-04f, +7.385594970e-04f, -1.386912755e-03f, -3.682694225e-04f, +1.999881476e-03f, -4.330219789e-04f, -2.237092061e-03f, +1.470870997e-03f, +1.891470399e-03f, -2.379113140e-03f, -1.004480095e-03f, +2.799145988e-03f, -1.257620654e-04f, -2.574523496e-03f, +1.090802571e-03f, +1.833675941e-03f, -1.583345947e-03f, -9.073509170e-04f, +1.539475140e-03f, +1.404530410e-04f, -1.129728864e-03f, +2.762254699e-04f, +6.242969676e-04f, -3.567490754e-04f, -2.356512299e-04f, +2.475523674e-04f, +3.710236442e-05f, -1.063018892e-04f, +1.115783486e-05f, +2.124074400e-05f, +0.000000000e+00f,\n    /*  9, 7 (40) */\n    +0.000000000e+00f, -5.147476454e-04f, -5.495793510e-04f, +1.718635092e-03f, +8.490404659e-04f, -4.077246594e-03f, -5.890883548e-04f, +7.992095790e-03f, -1.067160232e-03f, -1.376385057e-02f, +5.403899651e-03f, +2.159360665e-02f, -1.446932920e-02f, -3.183108781e-02f, +3.238621904e-02f, +4.610394709e-02f, -7.215431580e-02f, -7.434567483e-02f, +2.308722396e-01f, +5.200324690e-01f, +3.915007081e-01f, +2.863656302e-02f, -1.080817921e-01f, +2.756991298e-03f, +5.594158830e-02f, -1.015452949e-02f, -3.164115263e-02f, +1.109783448e-02f, +1.748686604e-02f, -9.402245269e-03f, -8.913211932e-03f, +6.774053124e-03f, +3.963417250e-03f, -4.183532108e-03f, -1.408861977e-03f, +2.143500175e-03f, +3.237451886e-04f, -8.206722976e-04f, -1.130236251e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.966521518e-05f, -4.137077124e-05f, -6.424451154e-05f, +1.289321237e-04f, +9.373633740e-05f, -2.939040512e-04f, -8.575756238e-05f, +5.609534982e-04f, -1.203482045e-05f, -9.519222367e-04f, +2.778266412e-04f, +1.497152711e-03f, -8.394204909e-04f, -2.292889502e-03f, +1.982427921e-03f, +3.827949833e-03f, -4.805271585e-03f, -1.210976765e-02f, -3.624558540e-03f, +1.011271235e-02f, +9.659625154e-03f, -8.472749576e-04f, -3.980094595e-03f, +8.191859473e-04f, +2.141746337e-03f, -7.890506312e-04f, -1.174906500e-03f, +6.642553817e-04f, +6.017855469e-04f, -4.925183278e-04f, -2.672492328e-04f, +3.199300511e-04f, +9.016546299e-05f, -1.773460538e-04f, -1.289762441e-05f, +7.844554178e-05f, -8.891041164e-06f, -2.231059876e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.147476454e-04f, +5.495793510e-04f, -2.457686621e-03f, -3.390314097e-04f, +6.028661535e-03f, -2.364134888e-03f, -1.027397451e-02f, +9.077648976e-03f, +1.251972831e-02f, -1.969296993e-02f, -9.381065360e-03f, +3.140142631e-02f, -1.148046030e-03f, -3.928621312e-02f, +1.774381359e-02f, +3.866079626e-02f, -3.549059409e-02f, -2.790186682e-02f, +4.791021895e-02f, +9.874878272e-03f, -5.026922227e-02f, +9.197795807e-03f, +4.210659724e-02f, -2.286560080e-02f, -2.734292839e-02f, +2.762606927e-02f, +1.195850312e-02f, -2.420758283e-02f, -8.335122396e-04f, +1.639351320e-02f, -4.266734511e-03f, -8.470668501e-03f, +4.594698336e-03f, +3.078512201e-03f, -2.765216605e-03f, -6.053476054e-04f, +8.206722976e-04f, +1.130236251e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.966521518e-05f, +4.137077124e-05f, +7.811016640e-05f, -2.136771647e-04f, -4.615510668e-05f, +4.720680878e-04f, -1.765086660e-04f, -7.294567753e-04f, +6.620509438e-04f, +7.903555101e-04f, -1.344152686e-03f, -4.610803787e-04f, +1.988675834e-03f, -3.104595657e-04f, -2.280365757e-03f, +1.347511719e-03f, +1.994996168e-03f, -2.290682395e-03f, -1.150511382e-03f, +2.771449368e-03f, +2.768522710e-05f, -2.610850631e-03f, +9.665189953e-04f, +1.914071544e-03f, -1.510105810e-03f, -9.998821001e-04f, +1.517278249e-03f, +2.170217854e-04f, -1.141528149e-03f, +2.290168826e-04f, +6.480887084e-04f, -3.366879062e-04f, -2.555200118e-04f, +2.438279597e-04f, +4.744668640e-05f, -1.081410225e-04f, +8.891041164e-06f, +2.231059876e-05f, +0.000000000e+00f,\n    /*  9, 8 (40) */\n    +0.000000000e+00f, -4.850824302e-04f, -5.909501222e-04f, +1.654390580e-03f, +9.779725896e-04f, -3.983510257e-03f, -8.829924060e-04f, +7.906338228e-03f, -5.062067334e-04f, -1.377588539e-02f, +4.451977414e-03f, +2.187143329e-02f, -1.297217649e-02f, -3.267050830e-02f, +3.009332954e-02f, +4.808637501e-02f, -6.832636597e-02f, -7.915094642e-02f, +2.187624719e-01f, +5.164079105e-01f, +4.016134205e-01f, +3.829618817e-02f, -1.089290670e-01f, -1.223103297e-03f, +5.676077424e-02f, -8.012783156e-03f, -3.243020326e-02f, +9.922927981e-03f, +1.815112142e-02f, -8.800459722e-03f, -9.405730259e-03f, +6.506803891e-03f, +4.283347301e-03f, -4.093366645e-03f, -1.586208031e-03f, +2.130602551e-03f, +4.021907304e-04f, -8.295633387e-04f, -3.361296126e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.002540106e-05f, -3.818369075e-05f, -6.732470766e-05f, +1.229225772e-04f, +1.030368784e-04f, -2.854775143e-04f, -1.063790562e-04f, +5.525793165e-04f, +2.653995388e-05f, -9.491752487e-04f, +2.129383280e-04f, +1.509958254e-03f, -7.360968874e-04f, -2.337721486e-03f, +1.813804071e-03f, +3.931381301e-03f, -4.448206912e-03f, -1.209691739e-02f, -4.089221553e-03f, +9.838688335e-03f, +9.918427271e-03f, -5.632243356e-04f, -4.057290844e-03f, +6.747241509e-04f, +2.199158900e-03f, -7.105034497e-04f, -1.221166251e-03f, +6.236693718e-04f, +6.365555774e-04f, -4.743132810e-04f, -2.907247910e-04f, +3.139337773e-04f, +1.039872891e-04f, -1.769118413e-04f, -1.963479337e-05f, +7.966243098e-05f, -6.511916378e-06f, -2.333894834e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.850824302e-04f, +5.909501222e-04f, -2.379576454e-03f, -5.527085745e-04f, +5.982506429e-03f, -1.892066800e-03f, -1.045048317e-02f, +8.348192201e-03f, +1.318177925e-02f, -1.890261442e-02f, -1.072521805e-02f, +3.094034593e-02f, +8.406298037e-04f, -3.959667268e-02f, +1.546344784e-02f, +4.000830798e-02f, -3.349559792e-02f, -3.019254921e-02f, +4.675970757e-02f, +1.264632764e-02f, -5.024153705e-02f, +6.586945176e-03f, +4.307311623e-02f, -2.095152926e-02f, -2.885303420e-02f, +2.662618717e-02f, +1.347578136e-02f, -2.399056104e-02f, -1.975040388e-03f, +1.662253008e-02f, -3.618645803e-03f, -8.807356407e-03f, +4.339178324e-03f, +3.322340161e-03f, -2.717769918e-03f, -7.134886279e-04f, +8.295633387e-04f, +3.361296126e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.002540106e-05f, +3.818369075e-05f, +8.342907803e-05f, -2.061988025e-04f, -6.394756893e-05f, +4.685914899e-04f, -1.410455555e-04f, -7.440847489e-04f, +6.126518040e-04f, +8.390878083e-04f, -1.297646345e-03f, -5.516578768e-04f, +1.971396687e-03f, -1.876808763e-04f, -2.316385335e-03f, +1.220445003e-03f, +2.092102327e-03f, -2.195302367e-03f, -1.292950954e-03f, +2.735164053e-03f, +1.813526412e-04f, -2.639206348e-03f, +8.387016222e-04f, +1.988963407e-03f, -1.431666225e-03f, -1.090039604e-03f, +1.490116400e-03f, +2.937487134e-04f, -1.149866382e-03f, +1.803998335e-04f, +6.701914660e-04f, -3.151593111e-04f, -2.749739539e-04f, +2.391912064e-04f, +5.792755312e-05f, -1.096464823e-04f, +6.511916378e-06f, +2.333894834e-05f, +0.000000000e+00f,\n    /*  9, 9 (40) */\n    +0.000000000e+00f, -4.550570292e-04f, -6.291338129e-04f, +1.587065873e-03f, +1.100895167e-03f, -3.880473378e-03f, -1.168469920e-03f, +7.799959172e-03f, +4.637258314e-05f, -1.374934544e-02f, +3.502802165e-03f, +2.208437162e-02f, -1.146221824e-02f, -3.340660519e-02f, +2.775560805e-02f, +4.990017908e-02f, -6.439498467e-02f, -8.359915333e-02f, +2.066655545e-01f, +5.123186890e-01f, +4.114521088e-01f, +4.821461544e-02f, -1.094922914e-01f, -5.280394140e-03f, +5.743549839e-02f, -5.813624256e-03f, -3.314070671e-02f, +8.701761730e-03f, +1.877479079e-02f, -8.163904144e-03f, -9.880043540e-03f, +6.216079100e-03f, +4.597281078e-03f, -3.989379356e-03f, -1.763119873e-03f, +2.110967758e-03f, +4.818531614e-04f, -8.360752551e-04f, -5.695190960e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.026552314e-05f, -3.497491124e-05f, -7.011451321e-05f, +1.166925968e-04f, +1.118341724e-04f, -2.763971337e-04f, -1.263164487e-04f, +5.427877350e-04f, +6.440647307e-05f, -9.438208686e-04f, +1.484586174e-04f, +1.518398899e-03f, -6.323729384e-04f, -2.375467304e-03f, +1.643425534e-03f, +4.022380306e-03f, -4.090959519e-03f, -1.206608769e-02f, -4.546987151e-03f, +9.548588231e-03f, +1.016542758e-02f, -2.704504794e-04f, -4.125145637e-03f, +5.258635010e-04f, +2.251409867e-03f, -6.287387368e-04f, -1.264712566e-03f, +5.806781401e-04f, +6.700814743e-04f, -4.544377708e-04f, -3.137864980e-04f, +3.069045119e-04f, +1.177944647e-04f, -1.759349294e-04f, -2.648776246e-05f, +8.065955729e-05f, -4.025258508e-06f, -2.432004984e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.550570292e-04f, +6.291338129e-04f, -2.296147376e-03f, -7.589073770e-04f, +5.918558860e-03f, -1.423475310e-03f, -1.059152873e-02f, +7.604107452e-03f, +1.379443106e-02f, -1.806352661e-02f, -1.202286439e-02f, +3.038868806e-02f, +2.812026491e-03f, -3.978435356e-02f, +1.314706250e-02f, +4.122875298e-02f, -3.140349560e-02f, -3.238785158e-02f, +4.546675661e-02f, +1.538149169e-02f, -5.006018440e-02f, +3.947738828e-03f, +4.391181785e-02f, -1.896256585e-02f, -3.028470043e-02f, +2.553614756e-02f, +1.496589776e-02f, -2.369681233e-02f, -3.124906771e-03f, +1.680292992e-02f, -2.948454337e-03f, -9.122515718e-03f, +4.064204370e-03f, +3.561531368e-03f, -2.659842365e-03f, -8.231351102e-04f, +8.360752551e-04f, +5.695190960e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.026552314e-05f, +3.497491124e-05f, +8.829552714e-05f, -1.982304998e-04f, -8.113168891e-05f, +4.636831315e-04f, -1.057460482e-04f, -7.561502784e-04f, +5.619922933e-04f, +8.846373242e-04f, -1.247577785e-03f, -6.397364432e-04f, +1.948142476e-03f, -6.507154126e-05f, -2.345073229e-03f, +1.090081376e-03f, +2.182501822e-03f, -2.093280578e-03f, -1.431354905e-03f, +2.690396264e-03f, +3.347598469e-04f, -2.659477117e-03f, +7.077365253e-04f, +2.058085942e-03f, -1.348239735e-03f, -1.177519168e-03f, +1.458029351e-03f, +3.703905661e-04f, -1.154673760e-03f, +1.305117571e-04f, +6.905057570e-04f, -2.922077150e-04f, -2.939387987e-04f, +2.336362639e-04f, +6.851113018e-05f, -1.108016165e-04f, +4.025258508e-06f, +2.432004984e-05f, +0.000000000e+00f,\n    /*  9,10 (40) */\n    +0.000000000e+00f, -4.247915060e-04f, -6.641087242e-04f, +1.516951359e-03f, +1.217587764e-03f, -3.768639206e-03f, -1.444867054e-03f, +7.673642723e-03f, +5.891603182e-04f, -1.368493896e-02f, +2.558981297e-03f, +2.223283024e-02f, -9.943819336e-03f, -3.403897813e-02f, +2.538014075e-02f, +5.154360462e-02f, -6.037260436e-02f, -8.769011285e-02f, +1.945994668e-01f, +5.077717018e-01f, +4.210006970e-01f, +5.838004303e-02f, -1.097627418e-01f, -9.405539777e-03f, +5.796136190e-02f, -3.562214389e-03f, -3.376944545e-02f, +7.437049164e-03f, +1.935546893e-02f, -7.493822670e-03f, -1.033448131e-02f, +5.902292602e-03f, +4.904185590e-03f, -3.871584891e-03f, -1.939054802e-03f, +2.084479995e-03f, +5.625127187e-04f, -8.401005136e-04f, -8.127195944e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.038882345e-05f, -3.175575267e-05f, -7.261274324e-05f, +1.102663162e-04f, +1.201127747e-04f, -2.667022623e-04f, -1.455246449e-04f, +5.316309555e-04f, +1.014690617e-04f, -9.359148400e-04f, +8.456069436e-05f, +1.522517476e-03f, -5.285369950e-04f, -2.406140717e-03f, +1.471763790e-03f, +4.100981252e-03f, -3.734221936e-03f, -1.201748315e-02f, -4.997091712e-03f, +9.242835135e-03f, +1.040003843e-02f, +3.058685352e-05f, -4.183304467e-03f, +3.729264058e-04f, +2.298273532e-03f, -5.439339613e-04f, -1.305381341e-03f, +5.353660973e-04f, +7.022472270e-04f, -4.329210476e-04f, -3.363596225e-04f, +2.988432843e-04f, +1.315451980e-04f, -1.744060091e-04f, -3.343777417e-05f, +8.142737847e-05f, -1.436396644e-06f, -2.524816144e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.247915060e-04f, +6.641087242e-04f, -2.207851849e-03f, -9.571378768e-04f, +5.837427171e-03f, -9.597921789e-04f, -1.069727478e-02f, +6.847957174e-03f, +1.435642335e-02f, -1.717888928e-02f, -1.327044218e-02f, +2.974895161e-02f, +4.760168967e-03f, -3.984942510e-02f, +1.080198927e-02f, +4.231883436e-02f, -2.922099377e-02f, -3.448113216e-02f, +4.403540171e-02f, +1.807188796e-02f, -4.972542456e-02f, +1.288261711e-03f, +4.461955438e-02f, -1.690447991e-02f, -3.163294016e-02f, +2.435862839e-02f, +1.642392712e-02f, -2.332642176e-02f, -4.279580531e-03f, +1.693344167e-02f, -2.257948580e-03f, -9.414723433e-03f, +3.770265571e-03f, +3.795167631e-03f, -2.591331235e-03f, -9.339367267e-04f, +8.401005136e-04f, +8.127195944e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.038882345e-05f, +3.175575267e-05f, +9.270534274e-05f, -1.898119631e-04f, -9.766346956e-05f, +4.573866696e-04f, -7.072156256e-05f, -7.656529984e-04f, +5.102502210e-04f, +9.268965660e-04f, -1.194140631e-03f, -7.250608239e-04f, +1.919029903e-03f, +5.698565503e-05f, -2.366375433e-03f, +9.568402833e-04f, +2.265929507e-03f, -1.984945093e-03f, -1.565292203e-03f, +2.637279115e-03f, +4.874264133e-04f, -2.671574675e-03f, +5.740213917e-04f, +2.121190497e-03f, -1.260056211e-03f, -1.262022715e-03f, +1.421073082e-03f, +4.467017651e-04f, -1.155891140e-03f, +7.949617923e-05f, +7.089364809e-04f, -2.678831402e-04f, -3.123404704e-04f, +2.271604025e-04f, +7.916231559e-05f, -1.115906368e-04f, +1.436396644e-06f, +2.524816144e-05f, +0.000000000e+00f,\n    /*  9,11 (40) */\n    +0.000000000e+00f, -3.944026826e-04f, -6.958644769e-04f, +1.444338616e-03f, +1.327854080e-03f, -3.648526431e-03f, -1.711569316e-03f, +7.528118078e-03f, +1.120791274e-03f, -1.358346990e-02f, +1.623066457e-03f, +2.231739093e-02f, -8.421301860e-03f, -3.456751512e-02f, +2.297400003e-02f, +5.301536841e-02f, -5.627162311e-02f, -9.142433479e-02f, +1.825819837e-01f, +5.027746101e-01f, +4.302435322e-01f, +6.878008146e-02f, -1.097321550e-01f, -1.358884424e-02f, +5.833428830e-02f, -1.263940857e-03f, -3.431337941e-02f, +6.131667824e-03f, +1.989083503e-02f, -6.791575443e-03f, -1.076740236e-02f, +5.565932979e-03f, +5.203028875e-03f, -3.740039693e-03f, -2.113460811e-03f, +2.051042221e-03f, +6.439400972e-04f, -8.415369103e-04f, -1.065201209e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.039887583e-05f, -2.853725754e-05f, -7.481918043e-05f, +1.036679328e-04f, +1.278591280e-04f, -2.564333221e-04f, -1.639614834e-04f, +5.191642378e-04f, +1.376358638e-04f, -9.255192434e-04f, +2.141353182e-05f, +1.522368065e-03f, -4.248734012e-04f, -2.429773852e-03f, +1.299285828e-03f, +4.167245739e-03f, -3.378678185e-03f, -1.195134171e-02f, -5.438787302e-03f, +8.921883660e-03f, +1.062169210e-02f, +3.394043914e-04f, -4.231430134e-03f, +2.162511058e-04f, +2.339535262e-03f, -4.562776664e-04f, -1.343014081e-03f, +4.878255463e-04f, +7.329389011e-04f, -4.097976228e-04f, -3.583695657e-04f, +2.897542300e-04f, +1.451970278e-04f, -1.723172887e-04f, -4.046530777e-05f, +8.195687024e-05f, +1.248813931e-06f, -2.611756503e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.944026826e-04f, +6.958644769e-04f, -2.115146507e-03f, -1.146949840e-03f, +5.739763701e-03f, -5.024055093e-04f, -1.076799634e-02f, +6.082304175e-03f, +1.486667357e-02f, -1.625199272e-02f, -1.446458281e-02f, +2.902389079e-02f, +6.679198870e-03f, -3.979243945e-02f, +8.435613839e-03f, +4.327567464e-02f, -2.695506427e-02f, -3.646607725e-02f, +4.247010951e-02f, +2.070916707e-02f, -4.923799814e-02f, -1.383312964e-03f, +4.519357577e-02f, -1.478328941e-02f, -3.289299638e-02f, +2.309660568e-02f, +1.784500020e-02f, -2.287972000e-02f, -5.435471671e-03f, +1.701293785e-02f, -1.549012099e-03f, -9.682606573e-03f, +3.457925101e-03f, +4.022328034e-03f, -2.512168919e-03f, -1.045527363e-03f, +8.415369103e-04f, +1.065201209e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.039887583e-05f, +2.853725754e-05f, +9.665615182e-05f, -1.809835241e-04f, -1.135020794e-04f, +4.497495869e-04f, -3.608075842e-05f, -7.726009063e-04f, +4.576045913e-04f, +9.657698389e-04f, -1.137537353e-03f, -8.073867218e-04f, +1.884193427e-03f, +1.781119850e-04f, -2.380261573e-03f, +8.211487210e-04f, +2.342142925e-03f, -1.870643441e-03f, -1.694346065e-03f, +2.575972209e-03f, +6.388733453e-04f, -2.675436391e-03f, +4.379642943e-04f, +2.178046240e-03f, -1.167362215e-03f, -1.343259367e-03f, +1.379319762e-03f, +5.224351940e-04f, -1.153470363e-03f, +2.750232073e-05f, +7.253933090e-04f, -2.422411314e-04f, -3.301053375e-04f, +2.197640842e-04f, +8.984483985e-05f, -1.119987057e-04f, -1.248813931e-06f, +2.611756503e-05f, +0.000000000e+00f,\n    /*  9,12 (40) */\n    +0.000000000e+00f, -3.640038068e-04f, -7.244017344e-04f, +1.369519436e-03f, +1.431522013e-03f, -3.520667303e-03f, -1.968002638e-03f, +7.364156595e-03f, +1.639955511e-03f, -1.344583404e-02f, +6.975472133e-04f, +2.233880447e-02f, -6.898933795e-03f, -3.499238852e-02f, +2.054422618e-02f, +5.431465423e-02f, -5.210437737e-02f, -9.480301297e-02f, +1.706306420e-01f, +4.973358228e-01f, +4.391654158e-01f, +7.940177356e-02f, -1.093927506e-01f, -1.782027438e-02f, +5.855053941e-02f, +1.075594405e-03f, -3.476965708e-02f, +4.788653743e-03f, +2.037866057e-02f, -6.058636542e-03f, -1.117719998e-02f, +5.207563414e-03f, +5.492783105e-03f, -3.594842665e-03f, -2.285778100e-03f, +2.010576913e-03f, +7.258969674e-04f, -8.402880963e-04f, -1.326376859e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.029956355e-05f, -2.533016005e-05f, -7.673455300e-05f, +9.692163009e-05f, +1.350615662e-04f, -2.456316624e-04f, -1.815878095e-04f, +5.054456894e-04f, +1.728190469e-04f, -9.127022261e-04f, -4.081851943e-05f, +1.518015683e-03f, -3.216617875e-04f, -2.446416853e-03f, +1.126453069e-03f, +4.221262112e-03f, -3.025002365e-03f, -1.186793396e-02f, -5.871343198e-03f, +8.586219074e-03f, +1.082984213e-02f, +6.554961931e-04f, -4.269203766e-03f, +5.619104480e-05f, +2.374992228e-03f, -3.659691126e-04f, -1.377458422e-03f, +4.381565367e-04f, +7.620449998e-04f, -3.851072520e-04f, -3.797420848e-04f, +2.796446348e-04f, +1.587069418e-04f, -1.696625512e-04f, -4.755012547e-05f, +8.223956993e-05f, +4.023998668e-06f, -2.692258929e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.640038068e-04f, +7.244017344e-04f, -2.018490355e-03f, -1.327933364e-03f, +5.626261622e-03f, -5.265592234e-05f, -1.080407710e-02f, +5.309703269e-03f, +1.532427816e-02f, -1.528622288e-02f, -1.560212016e-02f, +2.821650407e-02f, +8.563392298e-03f, -3.961432746e-02f, +6.055352266e-03f, +4.409682336e-02f, -2.461292134e-02f, -3.833672069e-02f, +4.077576344e-02f, +2.328513928e-02f, -4.859912480e-02f, -4.058749355e-03f, +4.563154007e-02f, -1.260524317e-02f, -3.406035859e-02f, +2.175334631e-02f, +1.922431996e-02f, -2.235728480e-02f, -6.588942035e-03f, +1.704044017e-02f, -8.236187902e-04f, -9.924847704e-03f, +3.127819764e-03f, +4.242092118e-03f, -2.422324079e-03f, -1.157526069e-03f, +8.402880963e-04f, +1.326376859e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.029956355e-05f, +2.533016005e-05f, +1.001473417e-04f, -1.717859800e-04f, -1.286099302e-04f, +4.408229601e-04f, -1.929217109e-06f, -7.770102152e-04f, +4.042349999e-04f, +1.001173424e-03f, -1.077978527e-03f, -8.864814924e-04f, +1.843784705e-03f, +2.979339676e-04f, -2.386724879e-03f, +6.834398429e-04f, +2.410923030e-03f, -1.750741478e-03f, -1.818115282e-03f, +2.506661150e-03f, +7.886246180e-04f, -2.671025537e-03f, +2.999824235e-04f, +2.228440998e-03f, -1.070420316e-03f, -1.420946441e-03f, +1.332857660e-03f, +5.973429932e-04f, -1.147374546e-03f, -2.531532391e-05f, +7.397910623e-04f, -2.153426602e-04f, -3.471604799e-04f, +2.114510313e-04f, +1.005213727e-04f, -1.120120209e-04f, -4.023998668e-06f, +2.692258929e-05f, +0.000000000e+00f,\n    /*  9,13 (40) */\n    +0.000000000e+00f, -3.337042432e-04f, -7.497318944e-04f, +1.292784883e-03f, +1.528443643e-03f, -3.385605737e-03f, -2.213634301e-03f, +7.182568785e-03f, +2.145401201e-03f, -1.327301499e-02f, -2.151550127e-04f, +2.229798595e-02f, -5.380918111e-03f, -3.531405031e-02f, +1.809780933e-02f, +5.544110730e-02f, -4.788311526e-02f, -9.782801534e-02f, +1.587627080e-01f, +4.914644796e-01f, +4.477516349e-01f, +9.023161569e-02f, -1.087372544e-01f, -2.208947814e-02f, +5.860673045e-02f, +3.450586633e-03f, -3.513562619e-02f, +3.411195321e-03f, +2.081681711e-02f, -5.296591542e-03f, -1.156230723e-02f, +4.827821329e-03f, +5.772427739e-03f, -3.436135723e-03f, -2.455440651e-03f, +1.963026788e-03f, +8.081365373e-04f, -8.362640977e-04f, -1.595602752e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.009505649e-05f, -2.214485708e-05f, -7.836051003e-05f, +9.005150179e-05f, +1.417103121e-04f, -2.343394191e-04f, -1.983675388e-04f, +4.905360490e-04f, +2.069349908e-04f, -8.975377174e-04f, -1.019761223e-04f, +1.509535950e-03f, -2.191763885e-04f, -2.456137496e-03f, +9.537203194e-04f, +4.263144944e-03f, -2.673857280e-03f, -1.176756244e-02f, -6.294047364e-03f, +8.236356381e-03f, +1.102396466e-02f, +9.783345528e-04f, -4.296325801e-03f, -1.068858057e-04f, +2.404454123e-03f, -2.732178855e-04f, -1.408568650e-03f, +3.864666965e-04f, +7.894568231e-04f, -3.588949042e-04f, -4.004035202e-04f, +2.685249696e-04f, +1.720314979e-04f, -1.664372060e-04f, -5.467132202e-05f, +8.226761923e-05f, +6.882272725e-06f, -2.765763321e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.337042432e-04f, +7.497318944e-04f, -1.918343013e-03f, -1.499719344e-03f, +5.497651691e-03f, +3.881670377e-04f, -1.080600631e-02f, +4.532693054e-03f, +1.572851316e-02f, -1.428504945e-02f, -1.668009869e-02f, +2.733002257e-02f, +1.040717700e-02f, -3.931639349e-02f, +3.668627387e-03f, +4.478026320e-02f, -2.220199831e-02f, -4.008746217e-02f, +3.895764816e-02f, +2.579180043e-02f, -4.781050018e-02f, -6.729774892e-03f, +4.593152249e-02f, -1.037680218e-02f, -3.513077891e-02f, +2.033239987e-02f, +2.055717762e-02f, -2.175994181e-02f, -7.736316581e-03f, +1.701512485e-02f, -8.382772788e-05f, -1.014019036e-02f, +2.780659284e-03f, +4.453543149e-03f, -2.321802707e-03f, -1.269538090e-03f, +8.362640977e-04f, +1.595602752e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.009505649e-05f, +2.214485708e-05f, +1.031800165e-04f, -1.622604362e-04f, -1.429527411e-04f, +4.306612196e-04f, +3.163086284e-05f, -7.789051815e-04f, +3.503210368e-04f, +1.033035717e-03f, -1.015682073e-03f, -9.621247953e-04f, +1.797971976e-03f, +4.160845349e-04f, -2.385782103e-03f, +5.441515527e-04f, +2.472074827e-03f, -1.625622197e-03f, -1.936215494e-03f, +2.429556966e-03f, +9.362087048e-04f, -2.658331485e-03f, +1.605007859e-04f, +2.272182037e-03f, -9.695083428e-04f, -1.494810429e-03f, +1.281791000e-03f, +6.711773652e-04f, -1.137578335e-03f, -7.879743099e-05f, +7.520500784e-04f, -1.872540094e-04f, -3.634339578e-04f, +2.022282840e-04f, +1.111536367e-04f, -1.116178988e-04f, -6.882272725e-06f, +2.765763321e-05f, +0.000000000e+00f,\n    /*  9,14 (40) */\n    +0.000000000e+00f, -3.036091867e-04f, -7.718767515e-04f, +1.214424373e-03f, +1.618495145e-03f, -3.243895425e-03f, -2.447973720e-03f, +6.984201246e-03f, +2.635937250e-03f, -1.306608000e-02f, -1.112692730e-03f, +2.219600982e-02f, -3.871382161e-03f, -3.553322670e-02f, +1.564167183e-02f, +5.639482762e-02f, -4.361997031e-02f, -1.005018726e-01f, +1.469951456e-01f, +4.851704322e-01f, +4.559879913e-01f, +1.012555804e-01f, -1.077589198e-01f, -2.638580394e-02f, +5.849984465e-02f, +5.855040756e-03f, -3.540884407e-02f, +2.002626671e-03f, +2.120328381e-02f, -4.507134719e-03f, -1.192120214e-02f, +4.427417809e-03f, +6.040952709e-03f, -3.264104226e-03f, -2.621877857e-03f, +1.908355466e-03f, +8.904041566e-04f, -8.293818249e-04f, -1.872179084e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.978978772e-05f, -1.899138096e-05f, -7.969959423e-05f, +8.308147782e-05f, +1.477974694e-04f, -2.225993727e-04f, -2.142677093e-04f, +4.744984666e-04f, +2.399044616e-04f, -8.801051325e-04f, -1.619053252e-04f, +1.497014728e-03f, -1.176853828e-04f, -2.459020753e-03f, +7.815347469e-04f, +4.293034467e-03f, -2.325893097e-03f, -1.165056078e-02f, -6.706207893e-03f, +7.872839323e-03f, +1.120355962e-02f, +1.307370962e-03f, -4.312516933e-03f, -2.725976668e-04f, +2.427743841e-03f, -1.782434709e-04f, -1.436206201e-03f, +3.328710381e-04f, +8.150688250e-04f, -3.312107135e-04f, -4.202810237e-04f, +2.564089168e-04f, +1.851269497e-04f, -1.626383379e-04f, -6.180737756e-05f, +8.203380579e-05f, +9.816251999e-06f, -2.831718992e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.036091867e-04f, +7.718767515e-04f, -1.815162996e-03f, -1.661979780e-03f, +5.354698950e-03f, +8.188282573e-04f, -1.077437545e-02f, +3.753787872e-03f, +1.607883420e-02f, -1.325201374e-02f, -1.769578076e-02f, +2.636789778e-02f, +1.220514898e-02f, -3.890030896e-02f, +1.282845284e-03f, +4.532441476e-02f, -1.972992349e-02f, -4.171308437e-02f, +3.702143267e-02f, +2.822135740e-02f, -4.687429148e-02f, -9.388106377e-03f, +4.609202328e-02f, -8.104620140e-03f, -3.610028725e-02f, +1.883758944e-02f, +2.183896862e-02f, -2.108876444e-02f, -8.873894916e-03f, +1.693632742e-02f, +6.682223505e-04f, -1.032744437e-02f, +2.417225326e-03f, +4.655771433e-03f, -2.210649070e-03f, -1.381155989e-03f, +8.293818249e-04f, +1.872179084e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.978978772e-05f, +1.899138096e-05f, +1.057569484e-04f, -1.524481502e-04f, -1.564995900e-04f, +4.193219023e-04f, +6.450095362e-05f, -7.783179074e-04f, +2.960416965e-04f, +1.061297325e-03f, -9.508724753e-04f, -1.034109200e-03f, +1.746939406e-03f, +5.322041701e-04f, -2.377473344e-03f, +4.037250874e-04f, +2.525427928e-03f, -1.495684471e-03f, -2.048280410e-03f, +2.344895453e-03f, +1.081160093e-03f, -2.637369813e-03f, +1.995087094e-05f, +2.309096785e-03f, -8.649185849e-04f, -1.564587960e-03f, +1.226239766e-03f, +7.436913879e-04f, -1.124068126e-03f, -1.327803143e-04f, +7.620965634e-04f, -1.580466366e-04f, -3.788550823e-04f, +1.921062474e-04f, +1.217025262e-04f, -1.108048548e-04f, -9.816251999e-06f, +2.831718992e-05f, +0.000000000e+00f,\n    /*  9,15 (40) */\n    +0.000000000e+00f, -2.738193990e-04f, -7.908681325e-04f, +1.134724778e-03f, +1.701576622e-03f, -3.096097956e-03f, -2.670573093e-03f, +6.769933537e-03f, +3.110435716e-03f, -1.282617554e-02f, -1.992797863e-03f, +2.203410450e-02f, -2.374367433e-03f, -3.565091208e-02f, +1.318265108e-02f, +5.717636237e-02f, -3.932693585e-02f, -1.028277657e-01f, +1.353445848e-01f, +4.784642243e-01f, +4.638608306e-01f, +1.124591400e-01f, -1.064515489e-01f, -3.069832088e-02f, +5.822724698e-02f, +8.282784597e-03f, -3.558708755e-02f, +5.664204697e-04f, +2.153615484e-02f, -3.692065894e-03f, -1.225241285e-02f, +4.007136785e-03f, +6.297361626e-03f, -3.078977276e-03f, -2.784516195e-03f, +1.846548088e-03f, +9.724379623e-04f, -8.195655729e-04f, -2.155350983e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.938842983e-05f, -1.587937421e-05f, -8.075521240e-05f, +7.603525227e-05f, +1.533170094e-04f, -2.104548082e-04f, -2.292585248e-04f, +4.573982800e-04f, +2.716527702e-04f, -8.604890646e-04f, -2.204579139e-04f, +1.480547740e-03f, -1.745025803e-05f, -2.455168328e-03f, +6.103348932e-04f, +4.311095950e-03f, -1.981746038e-03f, -1.151729288e-02f, -7.107154392e-03f, +7.496239329e-03f, +1.136815197e-02f, +1.642037127e-03f, -4.317519020e-03f, -4.405497161e-04f, +2.444698152e-03f, -8.127479651e-05f, -1.460240162e-03f, +2.774917416e-04f, +8.387789667e-04f, -3.021099160e-04f, -4.393027885e-04f, +2.433133867e-04f, +1.979493752e-04f, -1.582647513e-04f, -6.893621365e-05f, +8.153160369e-05f, +1.281806624e-05f, -2.889587082e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.738193990e-04f, +7.908681325e-04f, -1.709406048e-03f, -1.814427930e-03f, +5.198199360e-03f, +1.238150160e-03f, -1.070987450e-02f, +2.975469965e-03f, +1.637487589e-02f, -1.219071641e-02f, -1.864665324e-02f, +2.533378858e-02f, +1.395208839e-02f, -3.836810479e-02f, -1.094628060e-03f, +4.572813984e-02f, -1.720449556e-02f, -4.320876884e-02f, +3.497315226e-02f, +3.056625285e-02f, -4.579313138e-02f, -1.202547619e-02f, +4.611197415e-02f, -5.795523355e-03f, -3.696520583e-02f, +1.727300148e-02f, +2.306520838e-02f, -2.034507306e-02f, -9.997963042e-03f, +1.680354711e-02f, +1.430318914e-03f, -1.048549101e-02f, +2.038370244e-03f, +4.847877681e-03f, -2.088946544e-03f, -1.491960844e-03f, +8.195655729e-04f, +2.155350983e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.938842983e-05f, +1.587937421e-05f, +1.078825232e-04f, -1.423903798e-04f, -1.692229526e-04f, +4.068653973e-04f, +9.658646901e-05f, -7.752881205e-04f, +2.415747975e-04f, +1.085911119e-03f, -8.837799877e-04f, -1.102240746e-03f, +1.690886375e-03f, +6.459420146e-04f, -2.361861807e-03f, +2.626035945e-04f, +2.570837034e-03f, -1.361341764e-03f, -2.153962968e-03f, +2.252936439e-03f, +1.223020782e-03f, -2.608182334e-03f, -1.212307080e-04f, +2.339033488e-03f, -7.569569405e-04f, -1.630026723e-03f, +1.166339449e-03f, +8.146398330e-04f, -1.106842251e-03f, -1.870964128e-04f, +7.698629303e-04f, -1.277970174e-04f, -3.933546868e-04f, +1.810987270e-04f, +1.321282337e-04f, -1.095626813e-04f, -1.281806624e-05f, +2.889587082e-05f, +0.000000000e+00f,\n    /*  9,16 (40) */\n    +0.000000000e+00f, -2.444309692e-04f, -8.067475067e-04f, +1.053969566e-03f, +1.777611875e-03f, -2.942780946e-03f, -2.881027901e-03f, +6.540675012e-03f, +3.567833996e-03f, -1.255452277e-02f, -2.853286927e-03f, +2.181364659e-02f, -8.938196926e-04f, -3.566836234e-02f, +1.072748275e-02f, +5.778669726e-02f, -3.501583990e-02f, -1.048095118e-01f, +1.238272919e-01f, +4.713570699e-01f, +4.713570699e-01f, +1.238272919e-01f, -1.048095118e-01f, -3.501583990e-02f, +5.778669726e-02f, +1.072748275e-02f, -3.566836234e-02f, -8.938196926e-04f, +2.181364659e-02f, -2.853286927e-03f, -1.255452277e-02f, +3.567833996e-03f, +6.540675012e-03f, -2.881027901e-03f, -2.942780946e-03f, +1.777611875e-03f, +1.053969566e-03f, -8.067475067e-04f, -2.444309692e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.889587082e-05f, -1.281806624e-05f, -8.153160369e-05f, +6.893621365e-05f, +1.582647513e-04f, -1.979493752e-04f, -2.433133867e-04f, +4.393027885e-04f, +3.021099160e-04f, -8.387789667e-04f, -2.774917416e-04f, +1.460240162e-03f, +8.127479651e-05f, -2.444698152e-03f, +4.405497161e-04f, +4.317519020e-03f, -1.642037127e-03f, -1.136815197e-02f, -7.496239329e-03f, +7.107154392e-03f, +1.151729288e-02f, +1.981746038e-03f, -4.311095950e-03f, -6.103348932e-04f, +2.455168328e-03f, +1.745025803e-05f, -1.480547740e-03f, +2.204579139e-04f, +8.604890646e-04f, -2.716527702e-04f, -4.573982800e-04f, +2.292585248e-04f, +2.104548082e-04f, -1.533170094e-04f, -7.603525227e-05f, +8.075521240e-05f, +1.587937421e-05f, -2.938842983e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.444309692e-04f, +8.067475067e-04f, -1.601523525e-03f, -1.956818310e-03f, +5.028976408e-03f, +1.645015557e-03f, -1.061328803e-02f, +2.200181844e-03f, +1.661645069e-02f, -1.110480529e-02f, -1.953043322e-02f, +2.423154783e-02f, +1.564297476e-02f, -3.772216277e-02f, -3.456489867e-03f, +4.599074344e-02f, -1.463365852e-02f, -4.457011060e-02f, +3.281918929e-02f, +3.281918929e-02f, -4.457011060e-02f, -1.463365852e-02f, +4.599074344e-02f, -3.456489867e-03f, -3.772216277e-02f, +1.564297476e-02f, +2.423154783e-02f, -1.953043322e-02f, -1.110480529e-02f, +1.661645069e-02f, +2.200181844e-03f, -1.061328803e-02f, +1.645015557e-03f, +5.028976408e-03f, -1.956818310e-03f, -1.601523525e-03f, +8.067475067e-04f, +2.444309692e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.889587082e-05f, +1.281806624e-05f, +1.095626813e-04f, -1.321282337e-04f, -1.810987270e-04f, +3.933546868e-04f, +1.277970174e-04f, -7.698629303e-04f, +1.870964128e-04f, +1.106842251e-03f, -8.146398330e-04f, -1.166339449e-03f, +1.630026723e-03f, +7.569569405e-04f, -2.339033488e-03f, +1.212307080e-04f, +2.608182334e-03f, -1.223020782e-03f, -2.252936439e-03f, +2.153962968e-03f, +1.361341764e-03f, -2.570837034e-03f, -2.626035945e-04f, +2.361861807e-03f, -6.459420146e-04f, -1.690886375e-03f, +1.102240746e-03f, +8.837799877e-04f, -1.085911119e-03f, -2.415747975e-04f, +7.752881205e-04f, -9.658646901e-05f, -4.068653973e-04f, +1.692229526e-04f, +1.423903798e-04f, -1.078825232e-04f, -1.587937421e-05f, +2.938842983e-05f, +0.000000000e+00f,\n    /*  9,17 (40) */\n    +0.000000000e+00f, -2.155350983e-04f, -8.195655729e-04f, +9.724379623e-04f, +1.846548088e-03f, -2.784516195e-03f, -3.078977276e-03f, +6.297361626e-03f, +4.007136785e-03f, -1.225241285e-02f, -3.692065894e-03f, +2.153615484e-02f, +5.664204697e-04f, -3.558708755e-02f, +8.282784597e-03f, +5.822724698e-02f, -3.069832088e-02f, -1.064515489e-01f, +1.124591400e-01f, +4.638608306e-01f, +4.784642243e-01f, +1.353445848e-01f, -1.028277657e-01f, -3.932693585e-02f, +5.717636237e-02f, +1.318265108e-02f, -3.565091208e-02f, -2.374367433e-03f, +2.203410450e-02f, -1.992797863e-03f, -1.282617554e-02f, +3.110435716e-03f, +6.769933537e-03f, -2.670573093e-03f, -3.096097956e-03f, +1.701576622e-03f, +1.134724778e-03f, -7.908681325e-04f, -2.738193990e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.831718992e-05f, -9.816251999e-06f, -8.203380579e-05f, +6.180737756e-05f, +1.626383379e-04f, -1.851269497e-04f, -2.564089168e-04f, +4.202810237e-04f, +3.312107135e-04f, -8.150688250e-04f, -3.328710381e-04f, +1.436206201e-03f, +1.782434709e-04f, -2.427743841e-03f, +2.725976668e-04f, +4.312516933e-03f, -1.307370962e-03f, -1.120355962e-02f, -7.872839323e-03f, +6.706207893e-03f, +1.165056078e-02f, +2.325893097e-03f, -4.293034467e-03f, -7.815347469e-04f, +2.459020753e-03f, +1.176853828e-04f, -1.497014728e-03f, +1.619053252e-04f, +8.801051325e-04f, -2.399044616e-04f, -4.744984666e-04f, +2.142677093e-04f, +2.225993727e-04f, -1.477974694e-04f, -8.308147782e-05f, +7.969959423e-05f, +1.899138096e-05f, -2.978978772e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.155350983e-04f, +8.195655729e-04f, -1.491960844e-03f, -2.088946544e-03f, +4.847877681e-03f, +2.038370244e-03f, -1.048549101e-02f, +1.430318914e-03f, +1.680354711e-02f, -9.997963042e-03f, -2.034507306e-02f, +2.306520838e-02f, +1.727300148e-02f, -3.696520583e-02f, -5.795523355e-03f, +4.611197415e-02f, -1.202547619e-02f, -4.579313138e-02f, +3.056625285e-02f, +3.497315226e-02f, -4.320876884e-02f, -1.720449556e-02f, +4.572813984e-02f, -1.094628060e-03f, -3.836810479e-02f, +1.395208839e-02f, +2.533378858e-02f, -1.864665324e-02f, -1.219071641e-02f, +1.637487589e-02f, +2.975469965e-03f, -1.070987450e-02f, +1.238150160e-03f, +5.198199360e-03f, -1.814427930e-03f, -1.709406048e-03f, +7.908681325e-04f, +2.738193990e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.831718992e-05f, +9.816251999e-06f, +1.108048548e-04f, -1.217025262e-04f, -1.921062474e-04f, +3.788550823e-04f, +1.580466366e-04f, -7.620965634e-04f, +1.327803143e-04f, +1.124068126e-03f, -7.436913879e-04f, -1.226239766e-03f, +1.564587960e-03f, +8.649185849e-04f, -2.309096785e-03f, -1.995087094e-05f, +2.637369813e-03f, -1.081160093e-03f, -2.344895453e-03f, +2.048280410e-03f, +1.495684471e-03f, -2.525427928e-03f, -4.037250874e-04f, +2.377473344e-03f, -5.322041701e-04f, -1.746939406e-03f, +1.034109200e-03f, +9.508724753e-04f, -1.061297325e-03f, -2.960416965e-04f, +7.783179074e-04f, -6.450095362e-05f, -4.193219023e-04f, +1.564995900e-04f, +1.524481502e-04f, -1.057569484e-04f, -1.899138096e-05f, +2.978978772e-05f, +0.000000000e+00f,\n    /*  9,18 (40) */\n    +0.000000000e+00f, -1.872179084e-04f, -8.293818249e-04f, +8.904041566e-04f, +1.908355466e-03f, -2.621877857e-03f, -3.264104226e-03f, +6.040952709e-03f, +4.427417809e-03f, -1.192120214e-02f, -4.507134719e-03f, +2.120328381e-02f, +2.002626671e-03f, -3.540884407e-02f, +5.855040756e-03f, +5.849984465e-02f, -2.638580394e-02f, -1.077589198e-01f, +1.012555804e-01f, +4.559879913e-01f, +4.851704322e-01f, +1.469951456e-01f, -1.005018726e-01f, -4.361997031e-02f, +5.639482762e-02f, +1.564167183e-02f, -3.553322670e-02f, -3.871382161e-03f, +2.219600982e-02f, -1.112692730e-03f, -1.306608000e-02f, +2.635937250e-03f, +6.984201246e-03f, -2.447973720e-03f, -3.243895425e-03f, +1.618495145e-03f, +1.214424373e-03f, -7.718767515e-04f, -3.036091867e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.765763321e-05f, -6.882272725e-06f, -8.226761923e-05f, +5.467132202e-05f, +1.664372060e-04f, -1.720314979e-04f, -2.685249696e-04f, +4.004035202e-04f, +3.588949042e-04f, -7.894568231e-04f, -3.864666965e-04f, +1.408568650e-03f, +2.732178855e-04f, -2.404454123e-03f, +1.068858057e-04f, +4.296325801e-03f, -9.783345528e-04f, -1.102396466e-02f, -8.236356381e-03f, +6.294047364e-03f, +1.176756244e-02f, +2.673857280e-03f, -4.263144944e-03f, -9.537203194e-04f, +2.456137496e-03f, +2.191763885e-04f, -1.509535950e-03f, +1.019761223e-04f, +8.975377174e-04f, -2.069349908e-04f, -4.905360490e-04f, +1.983675388e-04f, +2.343394191e-04f, -1.417103121e-04f, -9.005150179e-05f, +7.836051003e-05f, +2.214485708e-05f, -3.009505649e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.872179084e-04f, +8.293818249e-04f, -1.381155989e-03f, -2.210649070e-03f, +4.655771433e-03f, +2.417225326e-03f, -1.032744437e-02f, +6.682223505e-04f, +1.693632742e-02f, -8.873894916e-03f, -2.108876444e-02f, +2.183896862e-02f, +1.883758944e-02f, -3.610028725e-02f, -8.104620140e-03f, +4.609202328e-02f, -9.388106377e-03f, -4.687429148e-02f, +2.822135740e-02f, +3.702143267e-02f, -4.171308437e-02f, -1.972992349e-02f, +4.532441476e-02f, +1.282845284e-03f, -3.890030896e-02f, +1.220514898e-02f, +2.636789778e-02f, -1.769578076e-02f, -1.325201374e-02f, +1.607883420e-02f, +3.753787872e-03f, -1.077437545e-02f, +8.188282573e-04f, +5.354698950e-03f, -1.661979780e-03f, -1.815162996e-03f, +7.718767515e-04f, +3.036091867e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.765763321e-05f, +6.882272725e-06f, +1.116178988e-04f, -1.111536367e-04f, -2.022282840e-04f, +3.634339578e-04f, +1.872540094e-04f, -7.520500784e-04f, +7.879743099e-05f, +1.137578335e-03f, -6.711773652e-04f, -1.281791000e-03f, +1.494810429e-03f, +9.695083428e-04f, -2.272182037e-03f, -1.605007859e-04f, +2.658331485e-03f, -9.362087048e-04f, -2.429556966e-03f, +1.936215494e-03f, +1.625622197e-03f, -2.472074827e-03f, -5.441515527e-04f, +2.385782103e-03f, -4.160845349e-04f, -1.797971976e-03f, +9.621247953e-04f, +1.015682073e-03f, -1.033035717e-03f, -3.503210368e-04f, +7.789051815e-04f, -3.163086284e-05f, -4.306612196e-04f, +1.429527411e-04f, +1.622604362e-04f, -1.031800165e-04f, -2.214485708e-05f, +3.009505649e-05f, +0.000000000e+00f,\n    /*  9,19 (40) */\n    +0.000000000e+00f, -1.595602752e-04f, -8.362640977e-04f, +8.081365373e-04f, +1.963026788e-03f, -2.455440651e-03f, -3.436135723e-03f, +5.772427739e-03f, +4.827821329e-03f, -1.156230723e-02f, -5.296591542e-03f, +2.081681711e-02f, +3.411195321e-03f, -3.513562619e-02f, +3.450586633e-03f, +5.860673045e-02f, -2.208947814e-02f, -1.087372544e-01f, +9.023161569e-02f, +4.477516349e-01f, +4.914644796e-01f, +1.587627080e-01f, -9.782801534e-02f, -4.788311526e-02f, +5.544110730e-02f, +1.809780933e-02f, -3.531405031e-02f, -5.380918111e-03f, +2.229798595e-02f, -2.151550127e-04f, -1.327301499e-02f, +2.145401201e-03f, +7.182568785e-03f, -2.213634301e-03f, -3.385605737e-03f, +1.528443643e-03f, +1.292784883e-03f, -7.497318944e-04f, -3.337042432e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.692258929e-05f, -4.023998668e-06f, -8.223956993e-05f, +4.755012547e-05f, +1.696625512e-04f, -1.587069418e-04f, -2.796446348e-04f, +3.797420848e-04f, +3.851072520e-04f, -7.620449998e-04f, -4.381565367e-04f, +1.377458422e-03f, +3.659691126e-04f, -2.374992228e-03f, -5.619104480e-05f, +4.269203766e-03f, -6.554961931e-04f, -1.082984213e-02f, -8.586219074e-03f, +5.871343198e-03f, +1.186793396e-02f, +3.025002365e-03f, -4.221262112e-03f, -1.126453069e-03f, +2.446416853e-03f, +3.216617875e-04f, -1.518015683e-03f, +4.081851943e-05f, +9.127022261e-04f, -1.728190469e-04f, -5.054456894e-04f, +1.815878095e-04f, +2.456316624e-04f, -1.350615662e-04f, -9.692163009e-05f, +7.673455300e-05f, +2.533016005e-05f, -3.029956355e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.595602752e-04f, +8.362640977e-04f, -1.269538090e-03f, -2.321802707e-03f, +4.453543149e-03f, +2.780659284e-03f, -1.014019036e-02f, -8.382772788e-05f, +1.701512485e-02f, -7.736316581e-03f, -2.175994181e-02f, +2.055717762e-02f, +2.033239987e-02f, -3.513077891e-02f, -1.037680218e-02f, +4.593152249e-02f, -6.729774892e-03f, -4.781050018e-02f, +2.579180043e-02f, +3.895764816e-02f, -4.008746217e-02f, -2.220199831e-02f, +4.478026320e-02f, +3.668627387e-03f, -3.931639349e-02f, +1.040717700e-02f, +2.733002257e-02f, -1.668009869e-02f, -1.428504945e-02f, +1.572851316e-02f, +4.532693054e-03f, -1.080600631e-02f, +3.881670377e-04f, +5.497651691e-03f, -1.499719344e-03f, -1.918343013e-03f, +7.497318944e-04f, +3.337042432e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.692258929e-05f, +4.023998668e-06f, +1.120120209e-04f, -1.005213727e-04f, -2.114510313e-04f, +3.471604799e-04f, +2.153426602e-04f, -7.397910623e-04f, +2.531532391e-05f, +1.147374546e-03f, -5.973429932e-04f, -1.332857660e-03f, +1.420946441e-03f, +1.070420316e-03f, -2.228440998e-03f, -2.999824235e-04f, +2.671025537e-03f, -7.886246180e-04f, -2.506661150e-03f, +1.818115282e-03f, +1.750741478e-03f, -2.410923030e-03f, -6.834398429e-04f, +2.386724879e-03f, -2.979339676e-04f, -1.843784705e-03f, +8.864814924e-04f, +1.077978527e-03f, -1.001173424e-03f, -4.042349999e-04f, +7.770102152e-04f, +1.929217109e-06f, -4.408229601e-04f, +1.286099302e-04f, +1.717859800e-04f, -1.001473417e-04f, -2.533016005e-05f, +3.029956355e-05f, +0.000000000e+00f,\n    /*  9,20 (40) */\n    +0.000000000e+00f, -1.326376859e-04f, -8.402880963e-04f, +7.258969674e-04f, +2.010576913e-03f, -2.285778100e-03f, -3.594842665e-03f, +5.492783105e-03f, +5.207563414e-03f, -1.117719998e-02f, -6.058636542e-03f, +2.037866057e-02f, +4.788653743e-03f, -3.476965708e-02f, +1.075594405e-03f, +5.855053941e-02f, -1.782027438e-02f, -1.093927506e-01f, +7.940177356e-02f, +4.391654158e-01f, +4.973358228e-01f, +1.706306420e-01f, -9.480301297e-02f, -5.210437737e-02f, +5.431465423e-02f, +2.054422618e-02f, -3.499238852e-02f, -6.898933795e-03f, +2.233880447e-02f, +6.975472133e-04f, -1.344583404e-02f, +1.639955511e-03f, +7.364156595e-03f, -1.968002638e-03f, -3.520667303e-03f, +1.431522013e-03f, +1.369519436e-03f, -7.244017344e-04f, -3.640038068e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.611756503e-05f, -1.248813931e-06f, -8.195687024e-05f, +4.046530777e-05f, +1.723172887e-04f, -1.451970278e-04f, -2.897542300e-04f, +3.583695657e-04f, +4.097976228e-04f, -7.329389011e-04f, -4.878255463e-04f, +1.343014081e-03f, +4.562776664e-04f, -2.339535262e-03f, -2.162511058e-04f, +4.231430134e-03f, -3.394043914e-04f, -1.062169210e-02f, -8.921883660e-03f, +5.438787302e-03f, +1.195134171e-02f, +3.378678185e-03f, -4.167245739e-03f, -1.299285828e-03f, +2.429773852e-03f, +4.248734012e-04f, -1.522368065e-03f, -2.141353182e-05f, +9.255192434e-04f, -1.376358638e-04f, -5.191642378e-04f, +1.639614834e-04f, +2.564333221e-04f, -1.278591280e-04f, -1.036679328e-04f, +7.481918043e-05f, +2.853725754e-05f, -3.039887583e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.326376859e-04f, +8.402880963e-04f, -1.157526069e-03f, -2.422324079e-03f, +4.242092118e-03f, +3.127819764e-03f, -9.924847704e-03f, -8.236187902e-04f, +1.704044017e-02f, -6.588942035e-03f, -2.235728480e-02f, +1.922431996e-02f, +2.175334631e-02f, -3.406035859e-02f, -1.260524317e-02f, +4.563154007e-02f, -4.058749355e-03f, -4.859912480e-02f, +2.328513928e-02f, +4.077576344e-02f, -3.833672069e-02f, -2.461292134e-02f, +4.409682336e-02f, +6.055352266e-03f, -3.961432746e-02f, +8.563392298e-03f, +2.821650407e-02f, -1.560212016e-02f, -1.528622288e-02f, +1.532427816e-02f, +5.309703269e-03f, -1.080407710e-02f, -5.265592234e-05f, +5.626261622e-03f, -1.327933364e-03f, -2.018490355e-03f, +7.244017344e-04f, +3.640038068e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.611756503e-05f, +1.248813931e-06f, +1.119987057e-04f, -8.984483985e-05f, -2.197640842e-04f, +3.301053375e-04f, +2.422411314e-04f, -7.253933090e-04f, -2.750232073e-05f, +1.153470363e-03f, -5.224351940e-04f, -1.379319762e-03f, +1.343259367e-03f, +1.167362215e-03f, -2.178046240e-03f, -4.379642943e-04f, +2.675436391e-03f, -6.388733453e-04f, -2.575972209e-03f, +1.694346065e-03f, +1.870643441e-03f, -2.342142925e-03f, -8.211487210e-04f, +2.380261573e-03f, -1.781119850e-04f, -1.884193427e-03f, +8.073867218e-04f, +1.137537353e-03f, -9.657698389e-04f, -4.576045913e-04f, +7.726009063e-04f, +3.608075842e-05f, -4.497495869e-04f, +1.135020794e-04f, +1.809835241e-04f, -9.665615182e-05f, -2.853725754e-05f, +3.039887583e-05f, +0.000000000e+00f,\n    /*  9,21 (40) */\n    +0.000000000e+00f, -1.065201209e-04f, -8.415369103e-04f, +6.439400972e-04f, +2.051042221e-03f, -2.113460811e-03f, -3.740039693e-03f, +5.203028875e-03f, +5.565932979e-03f, -1.076740236e-02f, -6.791575443e-03f, +1.989083503e-02f, +6.131667824e-03f, -3.431337941e-02f, -1.263940857e-03f, +5.833428830e-02f, -1.358884424e-02f, -1.097321550e-01f, +6.878008146e-02f, +4.302435322e-01f, +5.027746101e-01f, +1.825819837e-01f, -9.142433479e-02f, -5.627162311e-02f, +5.301536841e-02f, +2.297400003e-02f, -3.456751512e-02f, -8.421301860e-03f, +2.231739093e-02f, +1.623066457e-03f, -1.358346990e-02f, +1.120791274e-03f, +7.528118078e-03f, -1.711569316e-03f, -3.648526431e-03f, +1.327854080e-03f, +1.444338616e-03f, -6.958644769e-04f, -3.944026826e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.524816144e-05f, +1.436396644e-06f, -8.142737847e-05f, +3.343777417e-05f, +1.744060091e-04f, -1.315451980e-04f, -2.988432843e-04f, +3.363596225e-04f, +4.329210476e-04f, -7.022472270e-04f, -5.353660973e-04f, +1.305381341e-03f, +5.439339613e-04f, -2.298273532e-03f, -3.729264058e-04f, +4.183304467e-03f, -3.058685352e-05f, -1.040003843e-02f, -9.242835135e-03f, +4.997091712e-03f, +1.201748315e-02f, +3.734221936e-03f, -4.100981252e-03f, -1.471763790e-03f, +2.406140717e-03f, +5.285369950e-04f, -1.522517476e-03f, -8.456069436e-05f, +9.359148400e-04f, -1.014690617e-04f, -5.316309555e-04f, +1.455246449e-04f, +2.667022623e-04f, -1.201127747e-04f, -1.102663162e-04f, +7.261274324e-05f, +3.175575267e-05f, -3.038882345e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.065201209e-04f, +8.415369103e-04f, -1.045527363e-03f, -2.512168919e-03f, +4.022328034e-03f, +3.457925101e-03f, -9.682606573e-03f, -1.549012099e-03f, +1.701293785e-02f, -5.435471671e-03f, -2.287972000e-02f, +1.784500020e-02f, +2.309660568e-02f, -3.289299638e-02f, -1.478328941e-02f, +4.519357577e-02f, -1.383312964e-03f, -4.923799814e-02f, +2.070916707e-02f, +4.247010951e-02f, -3.646607725e-02f, -2.695506427e-02f, +4.327567464e-02f, +8.435613839e-03f, -3.979243945e-02f, +6.679198870e-03f, +2.902389079e-02f, -1.446458281e-02f, -1.625199272e-02f, +1.486667357e-02f, +6.082304175e-03f, -1.076799634e-02f, -5.024055093e-04f, +5.739763701e-03f, -1.146949840e-03f, -2.115146507e-03f, +6.958644769e-04f, +3.944026826e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.524816144e-05f, -1.436396644e-06f, +1.115906368e-04f, -7.916231559e-05f, -2.271604025e-04f, +3.123404704e-04f, +2.678831402e-04f, -7.089364809e-04f, -7.949617923e-05f, +1.155891140e-03f, -4.467017651e-04f, -1.421073082e-03f, +1.262022715e-03f, +1.260056211e-03f, -2.121190497e-03f, -5.740213917e-04f, +2.671574675e-03f, -4.874264133e-04f, -2.637279115e-03f, +1.565292203e-03f, +1.984945093e-03f, -2.265929507e-03f, -9.568402833e-04f, +2.366375433e-03f, -5.698565503e-05f, -1.919029903e-03f, +7.250608239e-04f, +1.194140631e-03f, -9.268965660e-04f, -5.102502210e-04f, +7.656529984e-04f, +7.072156256e-05f, -4.573866696e-04f, +9.766346956e-05f, +1.898119631e-04f, -9.270534274e-05f, -3.175575267e-05f, +3.038882345e-05f, +0.000000000e+00f,\n    /*  9,22 (40) */\n    +0.000000000e+00f, -8.127195944e-05f, -8.401005136e-04f, +5.625127187e-04f, +2.084479995e-03f, -1.939054802e-03f, -3.871584891e-03f, +4.904185590e-03f, +5.902292602e-03f, -1.033448131e-02f, -7.493822670e-03f, +1.935546893e-02f, +7.437049164e-03f, -3.376944545e-02f, -3.562214389e-03f, +5.796136190e-02f, -9.405539777e-03f, -1.097627418e-01f, +5.838004303e-02f, +4.210006970e-01f, +5.077717018e-01f, +1.945994668e-01f, -8.769011285e-02f, -6.037260436e-02f, +5.154360462e-02f, +2.538014075e-02f, -3.403897813e-02f, -9.943819336e-03f, +2.223283024e-02f, +2.558981297e-03f, -1.368493896e-02f, +5.891603182e-04f, +7.673642723e-03f, -1.444867054e-03f, -3.768639206e-03f, +1.217587764e-03f, +1.516951359e-03f, -6.641087242e-04f, -4.247915060e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.432004984e-05f, +4.025258508e-06f, -8.065955729e-05f, +2.648776246e-05f, +1.759349294e-04f, -1.177944647e-04f, -3.069045119e-04f, +3.137864980e-04f, +4.544377708e-04f, -6.700814743e-04f, -5.806781401e-04f, +1.264712566e-03f, +6.287387368e-04f, -2.251409867e-03f, -5.258635010e-04f, +4.125145637e-03f, +2.704504794e-04f, -1.016542758e-02f, -9.548588231e-03f, +4.546987151e-03f, +1.206608769e-02f, +4.090959519e-03f, -4.022380306e-03f, -1.643425534e-03f, +2.375467304e-03f, +6.323729384e-04f, -1.518398899e-03f, -1.484586174e-04f, +9.438208686e-04f, -6.440647307e-05f, -5.427877350e-04f, +1.263164487e-04f, +2.763971337e-04f, -1.118341724e-04f, -1.166925968e-04f, +7.011451321e-05f, +3.497491124e-05f, -3.026552314e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.127195944e-05f, +8.401005136e-04f, -9.339367267e-04f, -2.591331235e-03f, +3.795167631e-03f, +3.770265571e-03f, -9.414723433e-03f, -2.257948580e-03f, +1.693344167e-02f, -4.279580531e-03f, -2.332642176e-02f, +1.642392712e-02f, +2.435862839e-02f, -3.163294016e-02f, -1.690447991e-02f, +4.461955438e-02f, +1.288261711e-03f, -4.972542456e-02f, +1.807188796e-02f, +4.403540171e-02f, -3.448113216e-02f, -2.922099377e-02f, +4.231883436e-02f, +1.080198927e-02f, -3.984942510e-02f, +4.760168967e-03f, +2.974895161e-02f, -1.327044218e-02f, -1.717888928e-02f, +1.435642335e-02f, +6.847957174e-03f, -1.069727478e-02f, -9.597921789e-04f, +5.837427171e-03f, -9.571378768e-04f, -2.207851849e-03f, +6.641087242e-04f, +4.247915060e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.432004984e-05f, -4.025258508e-06f, +1.108016165e-04f, -6.851113018e-05f, -2.336362639e-04f, +2.939387987e-04f, +2.922077150e-04f, -6.905057570e-04f, -1.305117571e-04f, +1.154673760e-03f, -3.703905661e-04f, -1.458029351e-03f, +1.177519168e-03f, +1.348239735e-03f, -2.058085942e-03f, -7.077365253e-04f, +2.659477117e-03f, -3.347598469e-04f, -2.690396264e-03f, +1.431354905e-03f, +2.093280578e-03f, -2.182501822e-03f, -1.090081376e-03f, +2.345073229e-03f, +6.507154126e-05f, -1.948142476e-03f, +6.397364432e-04f, +1.247577785e-03f, -8.846373242e-04f, -5.619922933e-04f, +7.561502784e-04f, +1.057460482e-04f, -4.636831315e-04f, +8.113168891e-05f, +1.982304998e-04f, -8.829552714e-05f, -3.497491124e-05f, +3.026552314e-05f, +0.000000000e+00f,\n    /*  9,23 (40) */\n    +0.000000000e+00f, -5.695190960e-05f, -8.360752551e-04f, +4.818531614e-04f, +2.110967758e-03f, -1.763119873e-03f, -3.989379356e-03f, +4.597281078e-03f, +6.216079100e-03f, -9.880043540e-03f, -8.163904144e-03f, +1.877479079e-02f, +8.701761730e-03f, -3.314070671e-02f, -5.813624256e-03f, +5.743549839e-02f, -5.280394140e-03f, -1.094922914e-01f, +4.821461544e-02f, +4.114521088e-01f, +5.123186890e-01f, +2.066655545e-01f, -8.359915333e-02f, -6.439498467e-02f, +4.990017908e-02f, +2.775560805e-02f, -3.340660519e-02f, -1.146221824e-02f, +2.208437162e-02f, +3.502802165e-03f, -1.374934544e-02f, +4.637258314e-05f, +7.799959172e-03f, -1.168469920e-03f, -3.880473378e-03f, +1.100895167e-03f, +1.587065873e-03f, -6.291338129e-04f, -4.550570292e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.333894834e-05f, +6.511916378e-06f, -7.966243098e-05f, +1.963479337e-05f, +1.769118413e-04f, -1.039872891e-04f, -3.139337773e-04f, +2.907247910e-04f, +4.743132810e-04f, -6.365555774e-04f, -6.236693718e-04f, +1.221166251e-03f, +7.105034497e-04f, -2.199158900e-03f, -6.747241509e-04f, +4.057290844e-03f, +5.632243356e-04f, -9.918427271e-03f, -9.838688335e-03f, +4.089221553e-03f, +1.209691739e-02f, +4.448206912e-03f, -3.931381301e-03f, -1.813804071e-03f, +2.337721486e-03f, +7.360968874e-04f, -1.509958254e-03f, -2.129383280e-04f, +9.491752487e-04f, -2.653995388e-05f, -5.525793165e-04f, +1.063790562e-04f, +2.854775143e-04f, -1.030368784e-04f, -1.229225772e-04f, +6.732470766e-05f, +3.818369075e-05f, -3.002540106e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.695190960e-05f, +8.360752551e-04f, -8.231351102e-04f, -2.659842365e-03f, +3.561531368e-03f, +4.064204370e-03f, -9.122515718e-03f, -2.948454337e-03f, +1.680292992e-02f, -3.124906771e-03f, -2.369681233e-02f, +1.496589776e-02f, +2.553614756e-02f, -3.028470043e-02f, -1.896256585e-02f, +4.391181785e-02f, +3.947738828e-03f, -5.006018440e-02f, +1.538149169e-02f, +4.546675661e-02f, -3.238785158e-02f, -3.140349560e-02f, +4.122875298e-02f, +1.314706250e-02f, -3.978435356e-02f, +2.812026491e-03f, +3.038868806e-02f, -1.202286439e-02f, -1.806352661e-02f, +1.379443106e-02f, +7.604107452e-03f, -1.059152873e-02f, -1.423475310e-03f, +5.918558860e-03f, -7.589073770e-04f, -2.296147376e-03f, +6.291338129e-04f, +4.550570292e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.333894834e-05f, -6.511916378e-06f, +1.096464823e-04f, -5.792755312e-05f, -2.391912064e-04f, +2.749739539e-04f, +3.151593111e-04f, -6.701914660e-04f, -1.803998335e-04f, +1.149866382e-03f, -2.937487134e-04f, -1.490116400e-03f, +1.090039604e-03f, +1.431666225e-03f, -1.988963407e-03f, -8.387016222e-04f, +2.639206348e-03f, -1.813526412e-04f, -2.735164053e-03f, +1.292950954e-03f, +2.195302367e-03f, -2.092102327e-03f, -1.220445003e-03f, +2.316385335e-03f, +1.876808763e-04f, -1.971396687e-03f, +5.516578768e-04f, +1.297646345e-03f, -8.390878083e-04f, -6.126518040e-04f, +7.440847489e-04f, +1.410455555e-04f, -4.685914899e-04f, +6.394756893e-05f, +2.061988025e-04f, -8.342907803e-05f, -3.818369075e-05f, +3.002540106e-05f, +0.000000000e+00f,\n    /*  9,24 (40) */\n    +0.000000000e+00f, -3.361296126e-05f, -8.295633387e-04f, +4.021907304e-04f, +2.130602551e-03f, -1.586208031e-03f, -4.093366645e-03f, +4.283347301e-03f, +6.506803891e-03f, -9.405730259e-03f, -8.800459722e-03f, +1.815112142e-02f, +9.922927981e-03f, -3.243020326e-02f, -8.012783156e-03f, +5.676077424e-02f, -1.223103297e-03f, -1.089290670e-01f, +3.829618817e-02f, +4.016134205e-01f, +5.164079105e-01f, +2.187624719e-01f, -7.915094642e-02f, -6.832636597e-02f, +4.808637501e-02f, +3.009332954e-02f, -3.267050830e-02f, -1.297217649e-02f, +2.187143329e-02f, +4.451977414e-03f, -1.377588539e-02f, -5.062067334e-04f, +7.906338228e-03f, -8.829924060e-04f, -3.983510257e-03f, +9.779725896e-04f, +1.654390580e-03f, -5.909501222e-04f, -4.850824302e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.231059876e-05f, +8.891041164e-06f, -7.844554178e-05f, +1.289762441e-05f, +1.773460538e-04f, -9.016546299e-05f, -3.199300511e-04f, +2.672492328e-04f, +4.925183278e-04f, -6.017855469e-04f, -6.642553817e-04f, +1.174906500e-03f, +7.890506312e-04f, -2.141746337e-03f, -8.191859473e-04f, +3.980094595e-03f, +8.472749576e-04f, -9.659625154e-03f, -1.011271235e-02f, +3.624558540e-03f, +1.210976765e-02f, +4.805271585e-03f, -3.827949833e-03f, -1.982427921e-03f, +2.292889502e-03f, +8.394204909e-04f, -1.497152711e-03f, -2.778266412e-04f, +9.519222367e-04f, +1.203482045e-05f, -5.609534982e-04f, +8.575756238e-05f, +2.939040512e-04f, -9.373633740e-05f, -1.289321237e-04f, +6.424451154e-05f, +4.137077124e-05f, -2.966521518e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.361296126e-05f, +8.295633387e-04f, -7.134886279e-04f, -2.717769918e-03f, +3.322340161e-03f, +4.339178324e-03f, -8.807356407e-03f, -3.618645803e-03f, +1.662253008e-02f, -1.975040388e-03f, -2.399056104e-02f, +1.347578136e-02f, +2.662618717e-02f, -2.885303420e-02f, -2.095152926e-02f, +4.307311623e-02f, +6.586945176e-03f, -5.024153705e-02f, +1.264632764e-02f, +4.675970757e-02f, -3.019254921e-02f, -3.349559792e-02f, +4.000830798e-02f, +1.546344784e-02f, -3.959667268e-02f, +8.406298037e-04f, +3.094034593e-02f, -1.072521805e-02f, -1.890261442e-02f, +1.318177925e-02f, +8.348192201e-03f, -1.045048317e-02f, -1.892066800e-03f, +5.982506429e-03f, -5.527085745e-04f, -2.379576454e-03f, +5.909501222e-04f, +4.850824302e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.231059876e-05f, -8.891041164e-06f, +1.081410225e-04f, -4.744668640e-05f, -2.438279597e-04f, +2.555200118e-04f, +3.366879062e-04f, -6.480887084e-04f, -2.290168826e-04f, +1.141528149e-03f, -2.170217854e-04f, -1.517278249e-03f, +9.998821001e-04f, +1.510105810e-03f, -1.914071544e-03f, -9.665189953e-04f, +2.610850631e-03f, -2.768522710e-05f, -2.771449368e-03f, +1.150511382e-03f, +2.290682395e-03f, -1.994996168e-03f, -1.347511719e-03f, +2.280365757e-03f, +3.104595657e-04f, -1.988675834e-03f, +4.610803787e-04f, +1.344152686e-03f, -7.903555101e-04f, -6.620509438e-04f, +7.294567753e-04f, +1.765086660e-04f, -4.720680878e-04f, +4.615510668e-05f, +2.136771647e-04f, -7.811016640e-05f, -4.137077124e-05f, +2.966521518e-05f, +0.000000000e+00f,\n    /*  9,25 (40) */\n    +0.000000000e+00f, -1.130236251e-05f, -8.206722976e-04f, +3.237451886e-04f, +2.143500175e-03f, -1.408861977e-03f, -4.183532108e-03f, +3.963417250e-03f, +6.774053124e-03f, -8.913211932e-03f, -9.402245269e-03f, +1.748686604e-02f, +1.109783448e-02f, -3.164115263e-02f, -1.015452949e-02f, +5.594158830e-02f, +2.756991298e-03f, -1.080817921e-01f, +2.863656302e-02f, +3.915007081e-01f, +5.200324690e-01f, +2.308722396e-01f, -7.434567483e-02f, -7.215431580e-02f, +4.610394709e-02f, +3.238621904e-02f, -3.183108781e-02f, -1.446932920e-02f, +2.159360665e-02f, +5.403899651e-03f, -1.376385057e-02f, -1.067160232e-03f, +7.992095790e-03f, -5.890883548e-04f, -4.077246594e-03f, +8.490404659e-04f, +1.718635092e-03f, -5.495793510e-04f, -5.147476454e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.124074400e-05f, +1.115783486e-05f, -7.701890551e-05f, +6.294207036e-06f, +1.772483334e-04f, -7.636999562e-05f, -3.248953579e-04f, +2.434344664e-04f, +5.090289217e-04f, -5.658891074e-04f, -7.023597721e-04f, +1.126102485e-03f, +8.642142097e-04f, -2.079408200e-03f, -9.589428966e-04f, +3.893927662e-03f, +1.122166887e-03f, -9.389627448e-03f, -1.037026947e-02f, +3.153775873e-03f, +1.210446776e-02f, +5.161453937e-03f, -3.712079088e-03f, -2.148822212e-03f, +2.240976259e-03f, +9.420521158e-04f, -1.479950966e-03f, -3.429465880e-04f, +9.520126834e-04f, +5.121857295e-05f, -5.678613416e-04f, +6.449991268e-05f, +3.016386006e-04f, -8.394987165e-05f, -1.346972455e-04f, +6.087609675e-05f, +4.452458790e-05f, -2.918207680e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.130236251e-05f, +8.206722976e-04f, -6.053476054e-04f, -2.765216605e-03f, +3.078512201e-03f, +4.594698336e-03f, -8.470668501e-03f, -4.266734511e-03f, +1.639351320e-02f, -8.335122396e-04f, -2.420758283e-02f, +1.195850312e-02f, +2.762606927e-02f, -2.734292839e-02f, -2.286560080e-02f, +4.210659724e-02f, +9.197795807e-03f, -5.026922227e-02f, +9.874878272e-03f, +4.791021895e-02f, -2.790186682e-02f, -3.549059409e-02f, +3.866079626e-02f, +1.774381359e-02f, -3.928621312e-02f, -1.148046030e-03f, +3.140142631e-02f, -9.381065360e-03f, -1.969296993e-02f, +1.251972831e-02f, +9.077648976e-03f, -1.027397451e-02f, -2.364134888e-03f, +6.028661535e-03f, -3.390314097e-04f, -2.457686621e-03f, +5.495793510e-04f, +5.147476454e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.124074400e-05f, -1.115783486e-05f, +1.063018892e-04f, -3.710236442e-05f, -2.475523674e-04f, +2.356512299e-04f, +3.567490754e-04f, -6.242969676e-04f, -2.762254699e-04f, +1.129728864e-03f, -1.404530410e-04f, -1.539475140e-03f, +9.073509170e-04f, +1.583345947e-03f, -1.833675941e-03f, -1.090802571e-03f, +2.574523496e-03f, +1.257620654e-04f, -2.799145988e-03f, +1.004480095e-03f, +2.379113140e-03f, -1.891470399e-03f, -1.470870997e-03f, +2.237092061e-03f, +4.330219789e-04f, -1.999881476e-03f, +3.682694225e-04f, +1.386912755e-03f, -7.385594970e-04f, -7.100137044e-04f, +7.122752061e-04f, +2.120215373e-04f, -4.740733165e-04f, +2.780137444e-05f, +2.206266656e-04f, -7.234479279e-05f, -4.452458790e-05f, +2.918207680e-05f, +0.000000000e+00f,\n    /*  9,26 (40) */\n    +0.000000000e+00f, +9.938381493e-06f, -8.095144627e-04f, +2.467262831e-04f, +2.149794383e-03f, -1.231613644e-03f, -4.259902104e-03f, +3.638521892e-03f, +7.017487590e-03f, -8.404183010e-03f, -9.968134376e-03f, +1.678450626e-02f, +1.222393697e-02f, -3.077693842e-02f, -1.223393769e-02f, +5.498264540e-02f, +6.650918960e-03f, -1.069596252e-01f, +1.924693557e-02f, +3.811304387e-01f, +5.231862449e-01f, +2.429767073e-01f, -6.918422090e-02f, -7.586639489e-02f, +4.395512488e-02f, +3.462719530e-02f, -3.088903570e-02f, -1.594928017e-02f, +2.125066007e-02f, +6.355912334e-03f, -1.371263200e-02f, -1.635021573e-03f, +8.056595703e-03f, -2.874497542e-04f, -4.161196466e-03f, +7.143432204e-04f, +1.779511189e-03f, -5.050547631e-04f, -5.439297222e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.013510604e-05f, +1.330803346e-05f, -7.539296666e-05f, -1.583525942e-07f, +1.766308406e-04f, -6.264100433e-05f, -3.288347151e-04f, +2.193548295e-04f, +5.238263198e-04f, -5.289853368e-04f, -7.379142543e-04f, +1.074927910e-03f, +9.358397985e-04f, -2.012390064e-03f, -1.093705953e-03f, +3.799176006e-03f, +1.387489687e-03f, -9.109057526e-03f, -1.061100191e-02f, +2.677663862e-03f, +1.208088148e-02f, +5.516048760e-03f, -3.583790178e-03f, -2.312509799e-03f, +2.182005593e-03f, +1.043697592e-03f, -1.458333504e-03f, -4.081178602e-04f, +9.494042749e-04f, +9.090865714e-05f, -5.732573706e-04f, +4.265680927e-05f, +3.086443671e-04f, -7.369666498e-05f, -1.401941747e-04f, +5.722263853e-05f, +4.763336528e-05f, -2.857347147e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.938381493e-06f, +8.095144627e-04f, -4.990457162e-04f, -2.802318969e-03f, +2.830959834e-03f, +4.830349566e-03f, -8.113919425e-03f, -4.891031479e-03f, +1.611728773e-02f, +2.962166243e-04f, -2.434803587e-02f, +1.041902798e-02f, +2.853342018e-02f, -2.575958245e-02f, -2.469927675e-02f, +4.101579467e-02f, +1.177231930e-02f, -5.014346021e-02f, +7.075732284e-03f, +4.891469905e-02f, -2.552275368e-02f, -3.738206449e-02f, +3.718992526e-02f, +1.998090565e-02f, -3.885319114e-02f, -3.147927506e-03f, +3.176969573e-02f, -7.994152605e-03f, -2.043152942e-02f, +1.180971460e-02f, +9.789924182e-03f, -1.006195297e-02f, -2.838208205e-03f, +6.056462910e-03f, -1.184047442e-04f, -2.530031414e-03f, +5.050547631e-04f, +5.439297222e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.013510604e-05f, -1.330803346e-05f, +1.041465109e-04f, -2.692706094e-05f, -2.503732986e-04f, +2.154417879e-04f, +3.753040453e-04f, -5.989197119e-04f, -3.218946234e-04f, +1.114548639e-03f, -6.428265365e-05f, -1.556683522e-03f, +8.127554692e-04f, +1.651191985e-03f, -1.748058174e-03f, -1.211179078e-03f, +2.530363307e-03f, +2.785105402e-04f, -2.818174904e-03f, +8.553124615e-04f, +2.460308630e-03f, -1.781833104e-03f, -1.590122586e-03f, +2.186665243e-03f, +5.549808657e-04f, -2.004933884e-03f, +2.734999243e-04f, +1.425752763e-03f, -6.838301498e-04f, -7.563664866e-04f, +6.925574664e-04f, +2.474682509e-04f, -4.745718276e-04f, +8.936416261e-06f, +2.270093316e-04f, -6.614081253e-05f, -4.763336528e-05f, +2.857347147e-05f, +0.000000000e+00f,\n    /*  9,27 (40) */\n    +0.000000000e+00f, +3.007348754e-05f, -7.962064292e-04f, +1.713333165e-04f, +2.149636030e-03f, -1.054982803e-03f, -4.322543108e-03f, +3.309687177e-03f, +7.236842420e-03f, -7.880356690e-03f, -1.049711971e-02f, +1.604659201e-02f, +1.329886488e-02f, -2.984109862e-02f, -1.424632776e-02f, +5.388893945e-02f, +1.045009497e-02f, -1.055721355e-01f, +1.013787804e-02f, +3.705194367e-01f, +5.258639088e-01f, +2.550575888e-01f, -6.366817214e-02f, -7.945018507e-02f, +4.164261508e-02f, +3.680920089e-02f, -2.984533810e-02f, -1.740761367e-02f, +2.084254221e-02f, +7.305316609e-03f, -1.362172334e-02f, -2.208278944e-03f, +8.099252512e-03f, +2.119461283e-05f, -4.234893131e-03f, +5.741490457e-04f, +1.836733827e-03f, -4.574213978e-04f, -5.725031937e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.899936450e-05f, +1.533790785e-05f, -7.357855293e-05f, -6.443829298e-06f, +1.755070633e-04f, -4.901761035e-05f, -3.317560647e-04f, +1.950841424e-04f, +5.368969955e-04f, -4.911943059e-04f, -7.708587210e-04f, +1.021560463e-03f, +1.003784947e-03f, -1.940946266e-03f, -1.223203506e-03f, +3.696239674e-03f, +1.642858602e-03f, -8.818554479e-03f, -1.083458553e-02f, +2.197023751e-03f, +1.203890744e-02f, +5.868346728e-03f, -3.443132409e-03f, -2.473012407e-03f, +2.116020483e-03f, +1.144060974e-03f, -1.432292819e-03f, -4.731572712e-04f, +9.440617580e-04f, +1.309993024e-04f, -5.770997631e-04f, +2.028160784e-05f, +3.148860417e-04f, -6.299774079e-05f, -1.453994474e-04f, +5.328832891e-05f, +5.068515312e-05f, -2.783727893e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.007348754e-05f, +7.962064292e-04f, -3.948992054e-04f, -2.829246030e-03f, +2.580586535e-03f, +5.045791354e-03f, -7.738615380e-03f, -5.489951191e-03f, +1.579539311e-02f, +1.410765263e-03f, -2.441231852e-02f, +8.862344454e-03f, +2.934617565e-02f, -2.410839046e-02f, -2.644733492e-02f, +3.980461559e-02f, +1.430268261e-02f, -4.986494967e-02f, +4.257557380e-03f, +4.977001151e-02f, -2.306244505e-02f, -3.916389760e-02f, +3.559980268e-02f, +2.216757090e-02f, -3.829821027e-02f, -5.152861390e-03f, +3.204319566e-02f, -6.568399842e-03f, -2.111535957e-02f, +1.105334812e-02f, +1.048248165e-02f, -9.814484717e-03f, -3.312780032e-03f, +6.065399326e-03f, +1.086045874e-04f, -2.596172226e-03f, +4.574213978e-04f, +5.725031937e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.899936450e-05f, -1.533790785e-05f, +1.016930039e-04f, -1.695180326e-05f, -2.523025512e-04f, +1.949655339e-04f, +3.923197286e-04f, -5.720639893e-04f, -3.659001780e-04f, +1.096077505e-03f, +1.125303696e-05f, -1.568895977e-03f, +7.164092911e-04f, +1.713467675e-03f, -1.657514825e-03f, -1.327289183e-03f, +2.478532739e-03f, +4.300846601e-04f, -2.828484546e-03f, +7.034738605e-04f, +2.534005390e-03f, -1.666412475e-03f, -1.704877822e-03f, +2.129209512e-03f, +6.759485959e-04f, -2.003772433e-03f, +1.770554280e-04f, +1.460509853e-03f, -6.263088608e-04f, -8.009387080e-04f, +6.703296232e-04f, +2.827311737e-04f, -4.735327339e-04f, -1.038686813e-05f, +2.327882978e-04f, -5.950795440e-05f, -5.068515312e-05f, +2.783727893e-05f, +0.000000000e+00f,\n    /*  9,28 (40) */\n    +0.000000000e+00f, +4.907285204e-05f, -7.808685214e-04f, +9.775476354e-05f, +2.143192201e-03f, -8.794757402e-04f, -4.371560718e-03f, +2.977931112e-03f, +7.431926562e-03f, -7.343459695e-03f, -1.098831402e-02f, +1.527573329e-02f, +1.432042534e-02f, -2.883731368e-02f, -1.618727402e-02f, +5.266573594e-02f, +1.414633464e-02f, -1.039292769e-01f, +1.319323565e-03f, +3.596848512e-01f, +5.280609325e-01f, +2.670964963e-01f, -5.779982541e-02f, -8.289331748e-02f, +3.916960267e-02f, +3.892522138e-02f, -2.870127713e-02f, -1.883990649e-02f, +2.036938493e-02f, +8.249378367e-03f, -1.349072404e-02f, -2.785378707e-03f, +8.119534120e-03f, +3.360806545e-04f, -4.297890872e-03f, +4.287495982e-04f, +1.890022156e-03f, -4.067362447e-04f, -6.003404726e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.783913596e-05f, +1.724426288e-05f, -7.158682972e-05f, -1.254691095e-05f, +1.738917470e-04f, -3.553783943e-05f, -3.336701967e-04f, +1.706955005e-04f, +5.482325946e-04f, -4.526367213e-04f, -8.011412946e-04f, +9.661812678e-04f, +1.067919359e-03f, -1.865339109e-03f, -1.347181810e-03f, +3.585531680e-03f, +1.887915150e-03f, -8.518771646e-03f, -1.104073040e-02f, +1.712666080e-03f, +1.197847955e-02f, +6.217635905e-03f, -3.290183488e-03f, -2.629851781e-03f, +2.043083219e-03f, +1.242845318e-03f, -1.401833611e-03f, -5.378792310e-04f, +9.359571487e-04f, +1.713818723e-04f, -5.793505348e-04f, -2.569795609e-06f, +3.203299372e-04f, -5.187593367e-05f, -1.502899857e-04f, +4.907838704e-05f, +5.366786361e-05f, -2.697179213e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.907285204e-05f, +7.808685214e-04f, -2.932062015e-04f, -2.846197833e-03f, +2.328283984e-03f, +5.240756887e-03f, -7.346295651e-03f, -6.062015180e-03f, +1.542949293e-02f, +2.506842768e-03f, -2.440106548e-02f, +7.293448477e-03f, +3.006258494e-02f, -2.239492279e-02f, -2.810484974e-02f, +3.847732640e-02f, +1.678121535e-02f, -4.943486501e-02f, +1.429072834e-03f, +5.047348537e-02f, -2.052843966e-02f, -4.083031007e-02f, +3.389492485e-02f, +2.429678041e-02f, -3.762226168e-02f, -7.156633823e-03f, +3.222025109e-02f, -5.107889989e-03f, -2.174166843e-02f, +1.025240941e-02f, +1.115281127e-02f, -9.531753544e-03f, -3.786312766e-03f, +6.055012458e-03f, +3.413928852e-04f, -2.655680181e-03f, +4.067362447e-04f, +6.003404726e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.783913596e-05f, -1.724426288e-05f, +9.896008361e-05f, -7.206093704e-06f, -2.533547466e-04f, +1.742957362e-04f, +4.077687376e-04f, -5.438400155e-04f, -4.081250930e-04f, +1.074415005e-03f, +8.592225231e-05f, -1.576121102e-03f, +6.186289941e-04f, +1.770015613e-03f, -1.562356451e-03f, -1.438788586e-03f, +2.419218187e-03f, +5.800135591e-04f, -2.830050922e-03f, +5.494381966e-04f, +2.599963312e-03f, -1.545555799e-03f, -1.814760920e-03f, +2.064871998e-03f, +7.955384059e-04f, -1.996355930e-03f, +7.922725540e-05f, +1.491032742e-03f, -5.661476899e-04f, -8.435634077e-04f, +6.456264225e-04f, +3.176913299e-04f, -4.709297982e-04f, -3.011285216e-05f, +2.379279690e-04f, -5.245783240e-05f, -5.366786361e-05f, +2.697179213e-05f, +0.000000000e+00f,\n    /*  9,29 (40) */\n    +0.000000000e+00f, +6.691198800e-05f, -7.636242585e-04f, +2.616793381e-05f, +2.130645290e-03f, -7.055839932e-04f, -4.407098558e-03f, +2.644260916e-03f, +7.602622062e-03f, -6.795227100e-03f, -1.144095074e-02f, +1.447459199e-02f, +1.528660661e-02f, -2.776939432e-02f, -1.805261313e-02f, +5.131855413e-02f, +1.773186632e-02f, -1.020413617e-01f, -7.199448081e-03f, +3.486441208e-01f, +5.297735986e-01f, +2.790749758e-01f, -5.158218950e-02f, -8.618350097e-02f, +3.653975089e-02f, +4.096830459e-02f, -2.745843181e-02f, -2.024174010e-02f, +1.983150570e-02f, +9.185335516e-03f, -1.331934216e-02f, -3.364729242e-03f, +8.116964324e-03f, +6.564105917e-04f, -4.349766805e-03f, +2.784596125e-04f, +1.939100543e-03f, -3.530683810e-04f, -6.273122648e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.665995399e-05f, +1.902443446e-05f, -6.942925435e-05f, -1.845322694e-05f, +1.718008233e-04f, -2.223852773e-05f, -3.345906660e-04f, +1.462610725e-04f, +5.578298758e-04f, -4.134335714e-04f, -8.287183510e-04f, +9.089743302e-04f, +1.128125071e-03f, -1.785838056e-03f, -1.465405375e-03f, +3.467476865e-03f, +2.122327652e-03f, -8.210375133e-03f, -1.122918129e-02f, +1.225409024e-03f, +1.189956727e-02f, +6.563203266e-03f, -3.125049664e-03f, -2.782550855e-03f, +1.963275518e-03f, +1.339753471e-03f, -1.366972949e-03f, -6.020962355e-04f, +9.250699226e-04f, +2.119451354e-04f, -5.799757153e-04f, -2.583908748e-05f, +3.249441212e-04f, -4.035585483e-05f, -1.548431800e-04f, +4.459906621e-05f, +5.656931007e-05f, -2.597573519e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.691198800e-05f, +7.636242585e-04f, -1.942461179e-04f, -2.853403927e-03f, +2.074929238e-03f, +5.415052624e-03f, -6.938526914e-03f, -6.605855196e-03f, +1.502136784e-02f, +3.581257773e-03f, -2.431514323e-02f, +5.717327375e-03f, +3.068121394e-02f, -2.062490717e-02f, -2.966720620e-02f, +3.703853782e-02f, +1.920043354e-02f, -4.885485145e-02f, -1.400978088e-03f, +5.102292356e-02f, -1.792847634e-02f, -4.237586587e-02f, +3.208016393e-02f, +2.636165241e-02f, -3.682672327e-02f, -9.152989753e-03f, +3.229947834e-02f, -3.616857248e-03f, -2.230781612e-02f, +9.408846001e-03f, +1.179843769e-02f, -9.214062214e-03f, -4.257242564e-03f, +6.024899606e-03f, +5.793208542e-04f, -2.708138013e-03f, +3.530683810e-04f, +6.273122648e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.665995399e-05f, -1.902443446e-05f, +9.596697517e-05f, +2.282161354e-06f, -2.535472158e-04f, +1.535048423e-04f, +4.216293789e-04f, -5.143607579e-04f, -4.484597407e-04f, +1.049669748e-03f, +1.594984803e-04f, -1.578383327e-03f, +5.197332231e-04f, +1.820697626e-03f, -1.462906510e-03f, -1.545349051e-03f, +2.352629094e-03f, +7.278325354e-04f, -2.822877675e-03f, +3.936863883e-04f, +2.657966449e-03f, -1.419628401e-03f, -1.919410225e-03f, +1.993822389e-03f, +9.133656519e-04f, -1.982662889e-03f, -1.968637598e-05f, +1.517182323e-03f, -5.035089837e-04f, -8.840778467e-04f, +6.184912964e-04f, +3.522287850e-04f, -4.667416090e-04f, -5.018332352e-05f, +2.423941790e-04f, -4.500395056e-05f, -5.656931007e-05f, +2.597573519e-05f, +0.000000000e+00f,\n    /*  9,30 (40) */\n    +0.000000000e+00f, +8.357194200e-05f, -7.445998240e-04f, -4.326132053e-05f, +2.112192063e-03f, -5.337831700e-04f, -4.429337085e-03f, +2.309670250e-03f, +7.748883135e-03f, -6.237397224e-03f, -1.185438431e-02f, +1.364587364e-02f, +1.619558094e-02f, -2.664126924e-02f, -1.983845119e-02f, +4.985314876e-02f, +2.119934318e-02f, -9.991903408e-02f, -1.540982321e-02f, +3.374149395e-01f, +5.309990076e-01f, +2.909745431e-01f, -4.501898624e-02f, -8.930855063e-02f, +3.375720004e-02f, +4.293158011e-02f, -2.611867834e-02f, -2.160871305e-02f, +1.922940947e-02f, +1.011040544e-02f, -1.310739703e-02f, -3.944704957e-03f, +8.091125237e-03f, +9.813547128e-04f, -4.390122660e-03f, +1.236164325e-04f, +1.983699609e-03f, -2.964990710e-04f, -6.532880000e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.546725007e-05f, +2.067628486e-05f, -6.711753041e-05f, -2.414937287e-05f, +1.692513351e-04f, -9.155233045e-06f, -3.345337019e-04f, +1.218519049e-04f, +5.656906386e-04f, -3.737057772e-04f, -8.535545205e-04f, +8.501259890e-04f, +1.184296597e-03f, -1.702718913e-03f, -1.577657299e-03f, +3.342510736e-03f, +2.345791698e-03f, -7.894042301e-03f, -1.139971809e-02f, +7.360767122e-04f, +1.180217583e-02f, +6.904336239e-03f, -2.947865806e-03f, -2.930634935e-03f, +1.876698597e-03f, +1.434488871e-03f, -1.327740406e-03f, -6.656193674e-04f, +9.113871867e-04f, +2.525755473e-04f, -5.789455142e-04f, -4.946566872e-05f, +3.286985463e-04f, -2.846385128e-05f, -1.590369716e-04f, +3.985765772e-05f, +5.937724690e-05f, -2.484828019e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.357194200e-05f, +7.445998240e-04f, -9.827914271e-05f, -2.851121766e-03f, +1.821382022e-03f, +5.568557466e-03f, -6.516897535e-03f, -7.120215954e-03f, +1.457290810e-02f, +4.630927521e-03f, -2.415564475e-02f, +4.138944048e-03f, +3.120094716e-02f, -1.880420955e-02f, -3.113011271e-02f, +3.549318877e-02f, +2.155306263e-02f, -4.812701891e-02f, -4.223855762e-03f, +5.141660995e-02f, -1.527050990e-02f, -4.379549427e-02f, +3.016075371e-02f, +2.835547480e-02f, -3.591335762e-02f, -1.113565264e-02f, +3.227979197e-02f, -2.099674924e-03f, -2.281132511e-02f, +8.524768155e-03f, +1.241692899e-02f, -8.861833429e-03f, -4.723984173e-03f, +5.974716282e-03f, +8.217150332e-04f, -2.753141964e-03f, +2.964990710e-04f, +6.532880000e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.546725007e-05f, -2.067628486e-05f, +9.273332497e-05f, +1.148671485e-05f, -2.528998792e-04f, +1.326642441e-04f, +4.338856277e-04f, -4.837415165e-04f, -4.868021676e-04f, +1.021958948e-03f, +2.317611561e-04f, -1.575722699e-03f, +4.200416145e-04f, +1.865395081e-03f, -1.359500260e-03f, -1.646659396e-03f, +2.278997210e-03f, +8.730845232e-04f, -2.806996037e-03f, +2.367048336e-04f, +2.707823740e-03f, -1.289012509e-03f, -2.018479416e-03f, +1.916252486e-03f, +1.029049061e-03f, -1.962691735e-03f, -1.193812653e-04f, +1.538832243e-03f, -4.385649540e-04f, -9.223241014e-04f, +5.889763422e-04f, +3.862230372e-04f, -4.609517421e-04f, -7.053763744e-05f, +2.461543489e-04f, -3.716170056e-05f, -5.937724690e-05f, +2.484828019e-05f, +0.000000000e+00f,\n    /*  9,31 (40) */\n    +0.000000000e+00f, +9.903919207e-05f, -7.239235392e-04f, -1.103788509e-04f, +2.088042690e-03f, -3.645318349e-04f, -4.438492318e-03f, +1.975136548e-03f, +7.870735040e-03f, -5.671706586e-03f, -1.222809009e-02f, +1.279231912e-02f, +1.704570693e-02f, -2.545697265e-02f, -2.154117010e-02f, +4.827549146e-02f, +2.454185392e-02f, -9.757324238e-02f, -2.330386552e-02f, +3.260152214e-01f, +5.317350843e-01f, +3.027767189e-01f, -3.811465000e-02f, -9.225641644e-02f, +3.082656510e-02f, +4.480827871e-02f, -2.468418947e-02f, -2.293645346e-02f, +1.856379010e-02f, +1.102179262e-02f, -1.285482148e-02f, -4.523650471e-03f, +8.041659568e-03f, +1.310053259e-03f, -4.418586511e-03f, -3.542053911e-05f, +2.023557267e-03f, -2.371218241e-04f, -6.781362801e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.426633530e-05f, +2.219819630e-05f, -6.466356242e-05f, -2.962293171e-05f, +1.662613606e-04f, +3.677848260e-06f, -3.335181116e-04f, +9.753773237e-05f, +5.718216365e-04f, -3.335738481e-04f, -8.756226649e-04f, +7.898243641e-04f, +1.236341038e-03f, -1.616263007e-03f, -1.683739550e-03f, +3.211078300e-03f, +2.558030536e-03f, -7.570460241e-03f, -1.155215612e-02f, +2.454975392e-04f, +1.168634640e-02f, +7.240324242e-03f, -2.758795409e-03f, -3.073632881e-03f, +1.783473198e-03f, +1.526756362e-03f, -1.284178155e-03f, -7.282588089e-04f, +8.949038318e-04f, +2.931575445e-04f, -5.762344780e-04f, -7.338679611e-05f, +3.315651769e-04f, -1.622795872e-05f, -1.628499352e-04f, +3.486249123e-05f, +6.207941071e-05f, -2.358906275e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.903919207e-05f, +7.239235392e-04f, -5.545817737e-06f, -2.839635051e-03f, +1.568482143e-03f, +5.701221710e-03f, -6.083011907e-03f, -7.603957470e-03f, +1.408610593e-02f, +5.652886470e-03f, -2.392388360e-02f, +2.563221349e-03f, +3.162098877e-02f, -1.693881447e-02f, -3.248961297e-02f, +3.384652937e-02f, +2.383205984e-02f, -4.725393439e-02f, -7.030851800e-03f, +5.165331479e-02f, -1.256268616e-02f, -4.508450678e-02f, +2.814227429e-02f, +3.027172728e-02f, -3.488430856e-02f, -1.309834438e-02f, +3.216041070e-02f, -5.608426814e-04f, -2.324989006e-02f, +7.602444053e-03f, +1.300590533e-02f, -8.475610392e-03f, -5.184935915e-03f, +5.904178645e-03f, +1.067869382e-03f, -2.790303664e-03f, +2.371218241e-04f, +6.781362801e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.426633530e-05f, -2.219819630e-05f, +8.927911243e-05f, +2.038303472e-05f, -2.514351183e-04f, +1.118440529e-04f, +4.445270837e-04f, -4.520995028e-04f, -5.230583249e-04f, +9.914079357e-04f, +3.024963154e-04f, -1.568194600e-03f, +3.198737579e-04f, +1.904009142e-03f, -1.252483614e-03f, -1.742426403e-03f, +2.198575782e-03f, +1.015321536e-03f, -2.782464711e-03f, +7.898385675e-05f, +2.749369645e-03f, -1.154106075e-03f, -2.111638671e-03f, +1.832375687e-03f, +1.142211979e-03f, -1.936460947e-03f, -2.195481678e-04f, +1.555869431e-03f, -3.714972203e-04f, -9.581496479e-04f, +5.571422708e-04f, +4.195534187e-04f, -4.535489080e-04f, -9.111288168e-05f, +2.491776424e-04f, -2.894835191e-05f, -6.207941071e-05f, +2.358906275e-05f, +0.000000000e+00f,\n    /* 10, 0 (36) */\n    +0.000000000e+00f, -7.608322579e-04f, +1.118776550e-03f, +1.378251293e-03f, -3.996866387e-03f, -8.778420085e-05f, +8.463162654e-03f, -5.917369532e-03f, -1.170469082e-02f, +1.883055804e-02f, +7.720230922e-03f, -3.819223843e-02f, +1.284965533e-02f, +5.985703519e-02f, -6.898457622e-02f, -7.711293861e-02f, +3.046497488e-01f, +5.837128805e-01f, +3.046497488e-01f, -7.711293861e-02f, -6.898457622e-02f, +5.985703519e-02f, +1.284965533e-02f, -3.819223843e-02f, +7.720230922e-03f, +1.883055804e-02f, -1.170469082e-02f, -5.917369532e-03f, +8.463162654e-03f, -8.778420085e-05f, -3.996866387e-03f, +1.378251293e-03f, +1.118776550e-03f, -7.608322579e-04f, -9.130911868e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.914139316e-06f, -8.632770721e-05f, +1.073408404e-04f, +1.219837312e-04f, -3.461666226e-04f, +1.909220717e-05f, +6.649921034e-04f, -5.234066115e-04f, -8.276106219e-04f, +1.503726322e-03f, +4.097045852e-04f, -2.925685177e-03f, +1.241257195e-03f, +4.870434080e-03f, -6.086218167e-03f, -1.443571605e-02f, -3.244813960e-04f, +1.433462083e-02f, +6.555138706e-03f, -4.756606318e-03f, -1.468651897e-03f, +2.936223164e-03f, -2.877461347e-04f, -1.556214796e-03f, +7.783702355e-04f, +5.731263495e-04f, -6.578340876e-04f, -4.876331166e-05f, +3.545617704e-04f, -1.110089722e-04f, -1.155219012e-04f, +8.517375766e-05f, +9.239896990e-06f, -2.461555001e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.608322579e-04f, -1.118776550e-03f, -1.032757977e-03f, +5.537963620e-03f, -3.277985306e-03f, -8.278225430e-03f, +1.383882521e-02f, +1.771302895e-03f, -2.355345110e-02f, +1.719759611e-02f, +1.895372978e-02f, -3.796855404e-02f, +5.697284657e-03f, +4.123561278e-02f, -3.721413273e-02f, -1.801118074e-02f, +5.173229864e-02f, -1.801118074e-02f, -3.721413273e-02f, +4.123561278e-02f, +5.697284657e-03f, -3.796855404e-02f, +1.895372978e-02f, +1.719759611e-02f, -2.355345110e-02f, +1.771302895e-03f, +1.383882521e-02f, -8.278225430e-03f, -3.277985306e-03f, +5.537963620e-03f, -1.032757977e-03f, -1.549282673e-03f, +7.608322579e-04f, +9.130911868e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.914139316e-06f, +8.632770721e-05f, -1.783547172e-04f, -6.543241704e-05f, +4.910517381e-04f, -3.801515912e-04f, -5.372059098e-04f, +1.157186281e-03f, -1.982043651e-04f, -1.547251752e-03f, +1.594954770e-03f, +7.330013445e-04f, -2.601260275e-03f, +1.166260110e-03f, +2.082984900e-03f, -2.839630915e-03f, -9.467771006e-05f, +2.909566064e-03f, -1.952337783e-03f, -1.322643785e-03f, +2.595171601e-03f, -5.983288007e-04f, -1.679199776e-03f, +1.499902243e-03f, +2.884034970e-04f, -1.180697021e-03f, +4.941452697e-04f, +4.191009431e-04f, -4.896739099e-04f, +4.546527100e-05f, +1.883368647e-04f, -1.024473576e-04f, -9.239896990e-06f, +2.461555001e-05f, +0.000000000e+00f,\n    /* 10, 1 (36) */\n    +0.000000000e+00f, -7.667463972e-04f, +1.032448843e-03f, +1.485592133e-03f, -3.874882656e-03f, -4.339508234e-04f, +8.482254862e-03f, -5.252377428e-03f, -1.222809744e-02f, +1.800294742e-02f, +9.223957244e-03f, -3.778253385e-02f, +9.923970151e-03f, +6.109829238e-02f, -6.411414215e-02f, -8.319915678e-02f, +2.902140328e-01f, +5.833883991e-01f, +3.189843696e-01f, -7.055779991e-02f, -7.374118254e-02f, +5.838838329e-02f, +1.578587849e-02f, -3.847998457e-02f, +6.164016126e-03f, +1.960892828e-02f, -1.113156447e-02f, -6.575203619e-03f, +8.414399343e-03f, +2.667775696e-04f, -4.107875360e-03f, +1.262729392e-03f, +1.203950308e-03f, -7.515923609e-04f, -1.159246687e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.695957155e-06f, -8.711737723e-05f, +9.900148872e-05f, +1.322531958e-04f, -3.367573684e-04f, -1.003082804e-05f, +6.697485541e-04f, -4.728222327e-04f, -8.732128755e-04f, +1.447121671e-03f, +5.282028638e-04f, -2.905747658e-03f, +1.014382450e-03f, +4.966345222e-03f, -5.615323730e-03f, -1.450999957e-02f, -9.727815458e-04f, +1.420671412e-02f, +7.020957778e-03f, -4.624788907e-03f, -1.695851340e-03f, +2.937157559e-03f, -1.626761686e-04f, -1.604338211e-03f, +7.255967097e-04f, +6.217933644e-04f, -6.482531711e-04f, -7.888847102e-05f, +3.618896117e-04f, -9.935192578e-05f, -1.235090111e-04f, +8.364854408e-05f, +1.266265802e-05f, -2.561579456e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.667463972e-04f, -1.032448843e-03f, -1.211112694e-03f, +5.472531203e-03f, -2.786933568e-03f, -8.658377021e-03f, +1.330161930e-02f, +2.928489176e-03f, -2.375165546e-02f, +1.565034436e-02f, +2.054868455e-02f, -3.723555270e-02f, +3.096024382e-03f, +4.240187289e-02f, -3.513114783e-02f, -2.085081165e-02f, +5.163762093e-02f, -1.510161467e-02f, -3.916647051e-02f, +3.991296900e-02f, +8.292456257e-03f, -3.856688284e-02f, +1.727453001e-02f, +1.869749835e-02f, -2.326504760e-02f, +5.906058744e-04f, +1.433297048e-02f, -7.859124487e-03f, -3.767659216e-03f, +5.583428891e-03f, -8.444211122e-04f, -1.651730030e-03f, +7.515923609e-04f, +1.159246687e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.695957155e-06f, +8.711737723e-05f, -1.679480372e-04f, -8.462796079e-05f, +4.905006326e-04f, -3.404933445e-04f, -5.775260078e-04f, +1.129665192e-03f, -1.083713075e-04f, -1.588342783e-03f, +1.505522069e-03f, +8.639878579e-04f, -2.597677261e-03f, +1.006217692e-03f, +2.205556864e-03f, -2.759282259e-03f, -2.836783930e-04f, +2.968811143e-03f, -1.814083871e-03f, -1.474765034e-03f, +2.579379779e-03f, -4.604535010e-04f, -1.757891766e-03f, +1.446409830e-03f, +3.786266502e-04f, -1.200049301e-03f, +4.484675188e-04f, +4.571734157e-04f, -4.863304728e-04f, +2.478992676e-05f, +1.978385212e-04f, -9.952780372e-05f, -1.266265802e-05f, +2.561579456e-05f, +0.000000000e+00f,\n    /* 10, 2 (36) */\n    +0.000000000e+00f, -7.694423543e-04f, +9.453314657e-04f, +1.584593622e-03f, -3.742629460e-03f, -7.707081919e-04f, +8.472224034e-03f, -4.582628874e-03f, -1.270091967e-02f, +1.712973454e-02f, +1.067107892e-02f, -3.725433098e-02f, +7.018222492e-03f, +6.211267483e-02f, -5.914779692e-02f, -8.881448051e-02f, +2.757040332e-01f, +5.824156176e-01f, +3.331910838e-01f, -6.353684213e-02f, -7.836597145e-02f, +5.669253195e-02f, +1.872303605e-02f, -3.864266074e-02f, +4.559677915e-03f, +2.033452499e-02f, -1.050977111e-02f, -7.223456790e-03f, +8.335510872e-03f, +6.286671812e-04f, -4.207227285e-03f, +1.139220381e-03f, +1.287598852e-03f, -7.389297029e-04f, -1.415404632e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.048843568e-07f, -8.755099897e-05f, +9.053917835e-05f, +1.417974878e-04f, -3.263896975e-04f, -3.851558106e-05f, +6.721327113e-04f, -4.215609389e-04f, -9.150860880e-04f, +1.386659325e-03f, +6.429094186e-04f, -2.876641169e-03f, +7.887284655e-04f, +5.044459890e-03f, -5.143574865e-03f, -1.455753372e-02f, -1.619095412e-03f, +1.405205896e-02f, +7.482542598e-03f, -4.474956746e-03f, -1.922127813e-03f, +2.928311885e-03f, -3.485957021e-05f, -1.647858294e-03f, +6.694089971e-04f, +6.692198707e-04f, -6.362361767e-04f, -1.093701351e-04f, +3.680996854e-04f, -8.703871292e-05f, -1.312663145e-04f, +8.174639255e-05f, +1.617106558e-05f, -2.653772083e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.694423543e-04f, -9.453314657e-04f, -1.379060731e-03f, +5.387903242e-03f, -2.296432935e-03f, -8.998870366e-03f, +1.272409329e-02f, +4.058154368e-03f, -2.386002677e-02f, +1.406200157e-02f, +2.205420662e-02f, -3.637156484e-02f, +4.983471210e-04f, +4.340809058e-02f, -3.292559096e-02f, -2.361009391e-02f, +5.135394254e-02f, -1.213280353e-02f, -4.098055438e-02f, +3.843820396e-02f, +1.087183604e-02f, -3.902733634e-02f, +1.551663824e-02f, +2.014390818e-02f, -2.288642095e-02f, -6.094434262e-04f, +1.478143799e-02f, -7.401951071e-03f, -4.253989689e-03f, +5.608218818e-03f, -6.465825911e-04f, -1.751257834e-03f, +7.389297029e-04f, +1.415404632e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.048843568e-07f, +8.755099897e-05f, -1.571730812e-04f, -1.029932155e-04f, +4.880643032e-04f, -3.002939445e-04f, -6.149948290e-04f, +1.098295382e-03f, -1.924088598e-05f, -1.623084914e-03f, +1.411283666e-03f, +9.908224858e-04f, -2.584490563e-03f, +8.431315882e-04f, +2.319617192e-03f, -2.668835727e-03f, -4.716162238e-04f, +3.017129766e-03f, -1.668721691e-03f, -1.622033927e-03f, +2.553890217e-03f, -3.198743867e-04f, -1.830683648e-03f, +1.386915047e-03f, +4.685275682e-04f, -1.215109297e-03f, +4.003084851e-04f, +4.942014676e-04f, -4.809920841e-04f, +3.474341315e-06f, +2.068042874e-04f, -9.605047892e-05f, -1.617106558e-05f, +2.653772083e-05f, +0.000000000e+00f,\n    /* 10, 3 (36) */\n    +0.000000000e+00f, -7.690374700e-04f, +8.577804668e-04f, +1.675132800e-03f, -3.600831973e-03f, -1.097097889e-03f, +8.433708453e-03f, -3.910496163e-03f, -1.312248061e-02f, +1.621464846e-02f, +1.205773824e-02f, -3.661142156e-02f, +4.141581323e-03f, +6.290140330e-02f, -5.410333703e-02f, -9.395805537e-02f, +2.611464995e-01f, +5.807965222e-01f, +3.472431427e-01f, -5.605429953e-02f, -8.284092820e-02f, +5.477040414e-02f, +2.165134794e-02f, -3.867752031e-02f, +2.911819621e-03f, +2.100393398e-02f, -9.840551239e-03f, -7.859692967e-03f, +8.226140737e-03f, +9.967668667e-04f, -4.294265998e-03f, +1.007954066e-03f, +1.369345244e-03f, -7.227586373e-04f, -1.680781841e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.379445362e-06f, -8.763798329e-05f, +8.198878583e-05f, +1.505998611e-04f, -3.151215343e-04f, -6.627588767e-05f, +6.721815354e-04f, -3.698094587e-04f, -9.531535107e-04f, +1.322606356e-03f, +7.535106118e-04f, -2.838621625e-03f, +5.649797821e-04f, +5.104944408e-03f, -4.672080105e-03f, -1.457844287e-02f, -2.262104276e-03f, +1.387078132e-02f, +7.938758087e-03f, -4.307133336e-03f, -2.146743094e-03f, +2.909538260e-03f, +9.532349545e-05f, -1.686548354e-03f, +6.099398339e-04f, +7.152190423e-04f, -6.217782838e-04f, -1.401075016e-04f, +3.731445150e-04f, -7.409854095e-05f, -1.387578968e-04f, +7.946299958e-05f, +1.975300466e-05f, -2.737325389e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.690374700e-04f, -8.577804668e-04f, -1.536233813e-03f, +5.284910027e-03f, -1.808368632e-03f, -9.299164310e-03f, +1.210909846e-02f, +5.156449751e-03f, -2.387926765e-02f, +1.243891666e-02f, +2.346549029e-02f, -3.538074236e-02f, -2.086143442e-03f, +4.425122217e-02f, -3.060597377e-02f, -2.627892964e-02f, +5.088232632e-02f, -9.115673763e-03f, -4.264927607e-02f, +3.681617003e-02f, +1.342572625e-02f, -3.934721073e-02f, +1.368595459e-02f, +2.153082323e-02f, -2.241789338e-02f, -1.824552723e-03f, +1.518174648e-02f, -6.907749604e-03f, -4.734981773e-03f, +5.611693159e-03f, -4.397783037e-04f, -1.847308313e-03f, +7.227586373e-04f, +1.680781841e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.379445362e-06f, +8.763798329e-05f, -1.460861484e-04f, -1.204743522e-04f, +4.837931722e-04f, -2.597202162e-04f, -6.495145785e-04f, +1.063251170e-03f, +6.885707847e-05f, -1.651412983e-03f, +1.312636598e-03f, +1.113058466e-03f, -2.561804269e-03f, +6.776258297e-04f, +2.424762866e-03f, -2.568644751e-03f, -6.577871599e-04f, +3.054326685e-03f, -1.516778097e-03f, -1.763876605e-03f, +2.518745368e-03f, -1.771042394e-04f, -1.897248067e-03f, +1.321583081e-03f, +5.577571095e-04f, -1.225758205e-03f, +3.498160386e-04f, +5.300186960e-04f, -4.736370068e-04f, -1.840916351e-05f, +2.151795872e-04f, -9.201197506e-05f, -1.975300466e-05f, +2.737325389e-05f, +0.000000000e+00f,\n    /* 10, 4 (36) */\n    +0.000000000e+00f, -7.656580246e-04f, +7.701424835e-04f, +1.757121586e-03f, -3.450232112e-03f, -1.412219424e-03f, +8.367432565e-03f, -3.238314627e-03f, -1.349229007e-02f, +1.526149494e-02f, +1.338034460e-02f, -3.585791095e-02f, +1.302959698e-03f, +6.346638308e-02f, -4.899839262e-02f, -9.863013548e-02f, +2.465680566e-01f, +5.785344179e-01f, +3.611139240e-01f, -4.811554144e-02f, -8.714806153e-02f, +5.262366104e-02f, +2.456088620e-02f, -3.858219681e-02f, +1.225271268e-03f, +2.161387382e-02f, -9.125332197e-03f, -8.481471251e-03f, +8.086033235e-03f, +1.369911382e-03f, -4.368364539e-03f, +8.691961692e-04f, +1.448808244e-03f, -7.030056326e-04f, -1.954514380e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.219625487e-06f, -8.738885041e-05f, +7.338460892e-05f, +1.586466923e-04f, -3.030127815e-04f, -9.322986019e-05f, +6.699394056e-04f, -3.177528972e-04f, -9.873525818e-04f, +1.255237391e-03f, +8.597114582e-04f, -2.791969079e-03f, +3.438028954e-04f, +5.148010231e-03f, -4.201934253e-03f, -1.457291283e-02f, -2.900497611e-03f, +1.366307007e-02f, +8.388469819e-03f, -4.121391341e-03f, -2.368950490e-03f, +2.880718331e-03f, +2.274785910e-04f, -1.720194238e-03f, +5.473355139e-04f, +7.596056841e-04f, -6.048831993e-04f, -1.709968175e-04f, +3.769798469e-04f, -6.056366392e-05f, -1.459479235e-04f, +7.679548794e-05f, +2.339563256e-05f, -2.811445097e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.656580246e-04f, -7.701424835e-04f, -1.682319961e-03f, +5.164435675e-03f, -1.324575460e-03f, -9.558884527e-03f, +1.145958388e-02f, +6.219700920e-03f, -2.381041058e-02f, +1.078750368e-02f, +2.477812689e-02f, -3.426768389e-02f, -4.647947712e-03f, +4.492884800e-02f, -2.818121091e-02f, -2.884757439e-02f, +5.022453916e-02f, -6.061347078e-03f, -4.416605417e-02f, +3.505229343e-02f, +1.594447162e-02f, -3.952431497e-02f, +1.178870653e-02f, +2.285240631e-02f, -2.186013627e-02f, -3.050310928e-03f, +1.553156252e-02f, -6.377730908e-03f, -5.208618780e-03f, +5.593283996e-03f, -2.245987165e-04f, -1.939320288e-03f, +7.030056326e-04f, +1.954514380e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.219625487e-06f, +8.738885041e-05f, -1.347433312e-04f, -1.370225164e-04f, +4.777440308e-04f, -2.189374102e-04f, -6.810005888e-04f, +1.024718709e-03f, +1.556007156e-04f, -1.673287075e-03f, +1.209991291e-03f, +1.230269716e-03f, -2.529757947e-03f, +5.103309886e-04f, +2.520625783e-03f, -2.459099157e-03f, -8.414939287e-04f, +3.080248590e-03f, -1.358806323e-03f, -1.899737561e-03f, +2.474024768e-03f, -3.266778794e-05f, -1.957278847e-03f, +1.250603378e-03f, +6.459645926e-04f, -1.231892916e-03f, +2.971496820e-04f, +5.644605407e-04f, -4.642513548e-04f, -4.078411243e-05f, +2.229109352e-04f, -8.741141862e-05f, -2.339563256e-05f, +2.811445097e-05f, +0.000000000e+00f,\n    /* 10, 5 (36) */\n    +0.000000000e+00f, -7.594383991e-04f, +6.827536331e-04f, +1.830506195e-03f, -3.291585419e-03f, -1.715232205e-03f, +8.274202705e-03f, -2.568375222e-03f, -1.381004296e-02f, +1.427414236e-02f, +1.463558199e-02f, -3.499819949e-02f, -1.489009381e-03f, +6.381018598e-02f, -4.385038239e-02f, -1.028320697e-01f, +2.319951438e-01f, +5.756339203e-01f, +3.747769941e-01f, -3.972707162e-02f, -9.126945287e-02f, +5.025471055e-02f, +2.744160453e-02f, -3.835471822e-02f, -4.949229710e-04f, +2.216120933e-02f, -8.365726513e-03f, -9.086354450e-03f, +7.915036418e-03f, +1.746891229e-03f, -4.428928203e-03f, +7.232482457e-04f, +1.525603732e-03f, -6.796100001e-04f, -2.235658889e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.918174004e-06f, -8.681515683e-05f, +6.476024872e-05f, +1.659274605e-04f, -2.901250602e-04f, -1.193000958e-04f, +6.654578295e-04f, -2.655741250e-04f, -1.017634902e-03f, +1.184833580e-03f, +9.612362918e-04f, -2.736986459e-03f, +1.258445563e-04f, +5.173912764e-03f, -3.734215656e-03f, -1.454119011e-02f, -3.532976323e-03f, +1.342917682e-02f, +8.830546986e-03f, -3.917852994e-03f, -2.587996928e-03f, +2.841764127e-03f, +3.611980788e-04f, -1.748595268e-03f, +4.817556115e-04f, +8.021969079e-04f, -5.855633017e-04f, -2.019316964e-04f, +3.795648824e-04f, -4.646933020e-05f, -1.528007835e-04f, +7.374245794e-05f, +2.708541354e-05f, -2.875354420e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.594383991e-04f, -6.827536331e-04f, -1.817063292e-03f, +5.027413158e-03f, -8.468314290e-04f, -9.777821937e-03f, +1.077858329e-02f, +7.244419629e-03f, -2.365480986e-02f, +9.114216603e-03f, +2.598811818e-02f, -3.303741417e-02f, -7.177705658e-03f, +4.543917899e-02f, -2.566058512e-02f, -3.130667354e-02f, +4.938304523e-02f, -2.981098487e-03f, -4.552486049e-02f, +3.315255587e-02f, +1.841849639e-02f, -3.955698276e-02f, +9.831427680e-03f, +2.410300969e-02f, -2.121417168e-02f, -4.282203844e-03f, +1.582871220e-02f, -5.813270367e-03f, -5.672870134e-03f, +5.552499883e-03f, -1.687781361e-06f, -2.026731707e-03f, +6.796100001e-04f, +2.235658889e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.918174004e-06f, +8.681515683e-05f, -1.232002731e-04f, -1.525939204e-04f, +4.699796753e-04f, -1.781085629e-04f, -7.093814518e-04f, +9.828950914e-04f, +2.406772698e-04f, -1.688692430e-03f, +1.103769857e-03f, +1.342052330e-03f, -2.488525914e-03f, +3.418817327e-04f, +2.606874067e-03f, -2.340623620e-03f, -1.022048699e-03f, +3.094784748e-03f, -1.195383927e-03f, -2.029081848e-03f, +2.419844927e-03f, +1.129002439e-04f, -2.010492361e-03f, +1.174189137e-03f, +7.327991633e-04f, -1.233426639e-03f, +2.424800867e-04f, +5.973649916e-04f, -4.528293106e-04f, -6.357011090e-05f, +2.299462057e-04f, -8.225054997e-05f, -2.708541354e-05f, +2.875354420e-05f, +0.000000000e+00f,\n    /* 10, 6 (36) */\n    +0.000000000e+00f, -7.505202251e-04f, +5.959384762e-04f, +1.895266444e-03f, -3.125657959e-03f, -2.005357265e-03f, +8.154902609e-03f, -1.902917392e-03f, -1.407561709e-02f, +1.325650746e-02f, +1.582041557e-02f, -3.403696320e-02f, -4.225995840e-03f, +6.393603053e-02f, -3.867646963e-02f, -1.065662854e-01f, +2.174539537e-01f, +5.721009440e-01f, +3.882061709e-01f, -3.089652464e-02f, -9.518730587e-02f, +4.766671363e-02f, +3.028336865e-02f, -3.799352014e-02f, -2.243518239e-03f, +2.264296494e-02f, -7.563529605e-03f, -9.671917752e-03f, +7.713104721e-03f, +2.126456111e-03f, -4.475397533e-03f, +5.704474622e-04f, +1.599346190e-03f, -6.525245865e-04f, -2.523194331e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.146869604e-05f, -8.592942003e-05f, +5.614849721e-05f, +1.724347159e-04f, -2.765214500e-04f, -1.444138644e-04f, +6.587951315e-04f, -2.134531864e-04f, -1.043966167e-03f, +1.111681544e-03f, +1.057829360e-03f, -2.673998238e-03f, -8.826984939e-05f, +5.182950086e-03f, -3.269983539e-03f, -1.448358090e-02f, -4.158255968e-03f, +1.316941546e-02f, +9.263865382e-03f, -3.696690383e-03f, -2.803125091e-03f, +2.792618837e-03f, +4.960622527e-04f, -1.771565127e-03f, +4.133726548e-04f, +8.428128131e-04f, -5.638397564e-04f, -2.328034518e-04f, +3.808625011e-04f, -3.185371746e-05f, -1.592812343e-04f, +7.030403398e-05f, +3.080815738e-05f, -2.928298365e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.505202251e-04f, -5.959384762e-04f, -1.940263565e-03f, +4.874819238e-03f, -3.768517537e-04f, -9.955930500e-03f, +1.006920184e-02f, +8.227314721e-03f, -2.341413259e-02f, +7.425524173e-03f, +2.709188803e-02f, -3.169536184e-02f, -9.666231573e-03f, +4.578106072e-02f, -2.305371106e-02f, -3.364729716e-02f, +4.836099653e-02f, +1.136862607e-04f, -4.672024442e-02f, +3.112347402e-02f, +2.083834132e-02f, -3.944408252e-02f, +7.820935319e-03f, +2.527719883e-02f, -2.048137252e-02f, -5.515630483e-03f, +1.607119229e-02f, -5.215905376e-03f, -6.125699445e-03f, +5.488929773e-03f, +2.282584243e-04f, -2.108982257e-03f, +6.525245865e-04f, +2.523194331e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.146869604e-05f, +8.592942003e-05f, -1.115119337e-04f, -1.671499120e-04f, +4.605685252e-04f, -1.373938764e-04f, -7.345990946e-04f, +9.379874212e-04f, +3.237842138e-04f, -1.697639239e-03f, +9.944043599e-04f, +1.448025975e-03f, -2.438316371e-03f, +1.729143738e-04f, +2.683213238e-03f, -2.213675986e-03f, -1.198775712e-03f, +3.097867476e-03f, -1.027110630e-03f, -2.151397215e-03f, +2.356359075e-03f, +2.590571425e-04f, -2.056628820e-03f, +1.092576711e-03f, +8.179111777e-04f, -1.230289469e-03f, +1.859885772e-04f, +6.285732982e-04f, -4.393733119e-04f, -8.668310176e-05f, +2.362349022e-04f, -7.653379225e-05f, -3.080815738e-05f, +2.928298365e-05f, +0.000000000e+00f,\n    /* 10, 7 (36) */\n    +0.000000000e+00f, -7.390515291e-04f, +5.100090562e-04f, +1.951414941e-03f, -2.953223243e-03f, -2.281878715e-03f, +8.010488745e-03f, -1.244122261e-03f, -1.428907027e-02f, +1.221254129e-02f, +1.693209711e-02f, -3.297913384e-02f, -6.899994078e-03f, +6.384776068e-02f, -3.349351954e-02f, -1.098362689e-01f, +2.029703728e-01f, +5.679426880e-01f, +4.013755864e-01f, -2.163265925e-02f, -9.888399625e-02f, +4.486358854e-02f, +3.307598749e-02f, -3.749745789e-02f, -4.015083365e-03f, +2.305633760e-02f, -6.720716792e-03f, -1.023575751e-02f, +7.480301269e-03f, +2.507318612e-03f, -4.507251251e-03f, +4.111662279e-04f, +1.669650224e-03f, -6.217164291e-04f, -2.816024168e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.386565486e-05f, -8.474504102e-05f, +4.758123071e-05f, +1.781640366e-04f, -2.622662284e-04f, -1.685032771e-04f, +6.500161234e-04f, -1.615667266e-04f, -1.066326044e-03f, +1.036072332e-03f, +1.149255343e-03f, -2.603349068e-03f, -2.979378363e-04f, +5.175461552e-03f, -2.810275417e-03f, -1.440045004e-02f, -4.775069922e-03f, +1.288416172e-02f, +9.687310381e-03f, -3.458125588e-03f, -3.013575599e-03f, +2.733257492e-03f, +6.316405263e-04f, -1.788932731e-03f, +3.423717487e-04f, +8.812771671e-04f, -5.397426018e-04f, -2.635014452e-04f, +3.808394755e-04f, -1.675785505e-05f, -1.653545488e-04f, +6.648190592e-05f, +3.454906199e-05f, -2.969548071e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.390515291e-04f, -5.100090562e-04f, -2.051775499e-03f, +4.707669326e-03f, +8.371677150e-05f, -1.009332438e-02f, +9.334602745e-03f, +9.165302142e-03f, -2.309034838e-02f, +5.727884933e-03f, +2.808629239e-02f, -3.024733587e-02f, -1.210454794e-02f, +4.595397510e-02f, -2.037049782e-02f, -3.586097315e-02f, +4.716222082e-02f, +3.211553737e-03f, -4.774735505e-02f, +2.897207681e-02f, +2.319470039e-02f, -3.918502537e-02f, +5.764306499e-03f, +2.636977554e-02f, -1.966346134e-02f, -6.745919952e-03f, +1.625718086e-02f, -4.587332077e-03f, -6.565072757e-03f, +5.402246671e-03f, +4.644933266e-04f, -2.185516049e-03f, +6.217164291e-04f, +2.816024168e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.386565486e-05f, +8.474504102e-05f, -9.973236345e-05f, -1.806570197e-04f, +4.495842258e-04f, -9.695012096e-05f, -7.566088004e-04f, +8.902118581e-04f, +4.046303101e-04f, -1.700162350e-03f, +8.823350607e-04f, +1.547835191e-03f, -2.379370406e-03f, +4.064419775e-06f, +2.749387231e-03f, -2.078745462e-03f, -1.371013874e-03f, +3.089472453e-03f, -8.546060723e-04f, -2.266196171e-03f, +2.283756763e-03f, +4.052542535e-04f, -2.095453481e-03f, +1.006024907e-03f, +9.009535962e-04f, -1.222428889e-03f, +1.278665634e-04f, +6.579306774e-04f, -4.238942074e-04f, -1.100356434e-04f, +2.417284259e-04f, -7.026830925e-05f, -3.454906199e-05f, +2.969548071e-05f, +0.000000000e+00f,\n    /* 10, 8 (36) */\n    +0.000000000e+00f, -7.251858742e-04f, +4.252640152e-04f, +1.998996172e-03f, -2.775059206e-03f, -2.544144944e-03f, +7.841985467e-03f, -5.941061375e-04f, -1.445063700e-02f, +1.114621525e-02f, +1.796816944e-02f, -3.182987850e-02f, -9.503343145e-03f, +6.354982285e-02f, -2.831805799e-02f, -1.126465443e-01f, +1.885699227e-01f, +5.631676181e-01f, +4.142597481e-01f, -1.194534887e-02f, -1.023421218e-01f, +4.185001294e-02f, +3.580924498e-02f, -3.686581736e-02f, -5.804016097e-03f, +2.339870935e-02f, -5.839439625e-03f, -1.077550011e-02f, +7.216799824e-03f, +2.888158088e-03f, -4.524009106e-03f, +2.458116791e-04f, +1.736132130e-03f, -5.871673671e-04f, -3.112978975e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.610437038e-05f, -8.327622540e-05f, +3.908930945e-05f, +1.831139756e-04f, -2.474246117e-04f, -1.915054324e-04f, +6.391917579e-04f, -1.100874403e-04f, -1.084708017e-03f, +9.583003777e-04f, +1.235299800e-03f, -2.525402363e-03f, -5.025812648e-04f, +5.151826305e-03f, -2.356104585e-03f, -1.429221976e-02f, -5.382172507e-03f, +1.257385239e-02f, +1.009977991e-02f, -3.202430684e-03f, -3.218589221e-03f, +2.663687558e-03f, +7.674926758e-04f, -1.800543053e-03f, +2.689501487e-04f, +9.174180851e-04f, -5.133108049e-04f, -2.939134475e-04f, +3.794666750e-04f, -1.225533759e-06f, -1.709866648e-04f, +6.227936507e-05f, +3.829275975e-05f, -2.998405133e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.251858742e-04f, -4.252640152e-04f, -2.151507862e-03f, +4.527012306e-03f, +5.333009973e-04f, -1.019027450e-02f, +8.577993945e-03f, +1.005551400e-02f, -2.268571807e-02f, +4.027722584e-03f, +2.896862746e-02f, -2.869950068e-02f, -1.448391835e-02f, +4.595803951e-02f, -1.762111059e-02f, -3.793971861e-02f, +4.579120694e-02f, +6.301026190e-03f, -4.860196112e-02f, +2.670588063e-02f, +2.547845715e-02f, -3.877977112e-02f, +3.668853018e-03f, +2.737580044e-02f, -1.876250774e-02f, -7.968348841e-03f, +1.638504743e-02f, -3.929401400e-03f, -6.988966964e-03f, +5.292211027e-03f, +7.062217525e-04f, -2.255784358e-03f, +5.871673671e-04f, +3.112978975e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.610437038e-05f, +8.327622540e-05f, -8.791448778e-05f, -1.930869736e-04f, +4.371052354e-04f, -5.693006235e-05f, -7.753791751e-04f, +8.397926405e-04f, +4.829366141e-04f, -1.696320876e-03f, +7.680086419e-04f, +1.641150580e-03f, -2.311960884e-03f, -1.640358600e-04f, +2.805179267e-03f, -1.936350697e-03f, -1.538119278e-03f, +3.069618857e-03f, -6.785074790e-04f, -2.373017956e-03f, +2.202263322e-03f, +5.509390681e-04f, -2.126757767e-03f, +9.148141966e-04f, +9.815833829e-04f, -1.209810209e-03f, +6.831492326e-05f, +6.852870172e-04f, -4.064113792e-04f, -1.335372086e-04f, +2.463803425e-04f, -6.346405180e-05f, -3.829275975e-05f, +2.998405133e-05f, +0.000000000e+00f,\n    /* 10, 9 (36) */\n    +0.000000000e+00f, -7.090815039e-04f, +3.419877898e-04f, +2.038085481e-03f, -2.591945231e-03f, -2.791569555e-03f, +7.650480035e-03f, +4.508562038e-05f, -1.456072444e-02f, +1.006150723e-02f, +1.892646982e-02f, -3.059457870e-02f, -1.202874551e-02f, +6.304724158e-02f, -2.316623169e-02f, -1.150026489e-01f, +1.742777030e-01f, +5.577854456e-01f, +4.268336005e-01f, -1.845568962e-03f, -1.055445525e-01f, +3.863142371e-02f, +3.847293254e-02f, -3.609832469e-02f, -7.604559150e-03f, +2.366765949e-02f, -4.922021540e-03f, -1.128881091e-02f, +6.922886377e-03f, +3.267624763e-03f, -4.525234640e-03f, +7.482501437e-05f, +1.798411495e-03f, -5.488746074e-04f, -3.412819488e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.818101394e-05f, -8.153790302e-05f, +3.070248344e-05f, +1.872859978e-04f, -2.320624969e-04f, -2.133625434e-04f, +6.263987663e-04f, -5.918354445e-05f, -1.099119168e-03f, +8.786624560e-04f, +1.315769538e-03f, -2.440538845e-03f, -7.016476946e-04f, +5.112461682e-03f, -1.908457696e-03f, -1.415936827e-02f, -5.978342056e-03f, +1.223898450e-02f, +1.050018743e-02f, -2.929927596e-03f, -3.417409112e-03f, +2.583949443e-03f, +9.031701321e-04f, -1.806257904e-03f, +1.933167852e-04f, +9.510687062e-04f, -4.845922862e-04f, -3.239260137e-04f, +3.767192590e-04f, +1.469679696e-05f, -1.761443340e-04f, +5.770133452e-05f, +4.202336772e-05f, -3.014205917e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.090815039e-04f, -3.419877898e-04f, -2.239422350e-03f, +4.333925333e-03f, +9.704062327e-04f, -1.024720456e-02f, +7.802614769e-03f, +1.089530664e-02f, -2.220278145e-02f, +2.331401707e-03f, +2.973663610e-02f, -2.705835010e-02f, -1.679587923e-02f, +4.579400365e-02f, -1.481593132e-02f, -3.987606931e-02f, +4.425308766e-02f, +9.370645047e-03f, -4.928046860e-02f, +2.433286268e-02f, +2.768072048e-02f, -3.822883205e-02f, +1.542095251e-03f, +2.829061464e-02f, -1.778092436e-02f, -9.178159050e-03f, +1.645336235e-02f, -3.244114383e-03f, -7.395378343e-03f, +5.158673819e-03f, +9.526020949e-04f, -2.319248410e-03f, +5.488746074e-04f, +3.412819488e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.818101394e-05f, +8.153790302e-05f, -7.610990162e-05f, -2.044167045e-04f, +4.232144021e-04f, -1.748191534e-05f, -7.908920603e-04f, +7.869610876e-04f, +5.584374170e-04f, -1.686197720e-03f, +6.518764250e-04f, +1.727669888e-03f, -2.236391213e-03f, -3.307598458e-04f, +2.850412561e-03f, -1.787037745e-03f, -1.699467671e-03f, +3.038369337e-03f, -4.994672567e-04f, -2.471430410e-03f, +2.112139179e-03f, +6.955573382e-04f, -2.150360292e-03f, +8.192458243e-04f, +1.059462904e-03f, -1.192416947e-03f, +7.543337918e-06f, +7.104975722e-04f, -3.869528322e-04f, -1.570945041e-04f, +2.501466451e-04f, -5.613379215e-05f, -4.202336772e-05f, +3.014205917e-05f, +0.000000000e+00f,\n    /* 10,10 (36) */\n    +0.000000000e+00f, -6.909004899e-04f, +2.604498868e-04f, +2.068787965e-03f, -2.404659233e-03f, -3.023632052e-03f, +7.437117492e-03f, +6.714843867e-04f, -1.461990799e-02f, +8.962388064e-03f, +1.980513228e-02f, -2.927880916e-02f, -1.446928435e-02f, +6.234559389e-02f, -1.805377000e-02f, -1.169111066e-01f, +1.601183347e-01f, +5.518071035e-01f, +4.390725850e-01f, +8.654618468e-03f, -1.084744801e-01f, +3.521401460e-02f, +4.105688198e-02f, -3.519515455e-02f, -9.410817054e-03f, +2.386097628e-02f, -3.970952834e-03f, -1.177340320e-02f, +6.598960363e-03f, +3.644344022e-03f, -4.510537843e-03f, -1.013193196e-04f, +1.856112829e-03f, -5.068512397e-04f, -3.714240080e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.009259950e-05f, -7.954564686e-05f, +2.244930511e-05f, +1.906844073e-04f, -2.162462075e-04f, -2.340220430e-04f, +6.117192827e-04f, -9.018273929e-06f, -1.109579937e-03f, +7.974566525e-04f, +1.390492908e-03f, -2.349155062e-03f, -8.946116431e-04f, +5.057821535e-03f, -1.468292429e-03f, -1.400242824e-02f, -6.562383914e-03f, +1.188011425e-02f, +1.088746485e-02f, -2.640987822e-03f, -3.609283075e-03f, +2.494116903e-03f, +1.038217321e-03f, -1.805956677e-03f, +1.156917410e-04f, +9.820678624e-04f, -4.536439134e-04f, -3.534248684e-04f, +3.725768584e-04f, +3.096014414e-05f, -1.807952724e-04f, +5.275439348e-05f, +4.572454142e-05f, -3.016325832e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.909004899e-04f, -2.604498868e-04f, -2.315532252e-03f, +4.129508628e-03f, +1.393620635e-03f, -1.026468647e-02f, +7.011722709e-03f, +1.168226773e-02f, -2.164434404e-02f, +6.452039870e-04f, +3.038851252e-02f, -2.533068021e-02f, -1.903227045e-02f, +4.546324381e-02f, -1.196551876e-02f, -4.166310706e-02f, +4.255361999e-02f, +1.240901438e-02f, -4.977993586e-02f, +2.186143227e-02f, +2.979285965e-02f, -3.753327471e-02f, -6.082650413e-04f, +2.910986046e-02f, -1.672146145e-02f, -1.037057600e-02f, +1.646090569e-02f, -2.533616811e-03f, -7.782331176e-03f, +5.001579315e-03f, +1.202748740e-03f, -2.375382202e-03f, +5.068512397e-04f, +3.714240080e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.009259950e-05f, +7.954564686e-05f, -6.436867513e-05f, -2.146283198e-04f, +4.079985290e-04f, +2.125117424e-05f, -8.031423941e-04f, +7.319545879e-04f, +6.308811252e-04f, -1.669898998e-03f, +5.343925828e-04f, +1.807118973e-03f, -2.152994000e-03f, -4.954889467e-04f, +2.884950883e-03f, -1.631377929e-03f, -1.854456839e-03f, +2.995829819e-03f, -3.181505232e-04f, -2.561031746e-03f, +2.013679029e-03f, +8.385552114e-04f, -2.166107787e-03f, +7.196408316e-04f, +1.134261323e-03f, -1.170251128e-03f, -5.423041956e-05f, +7.334236496e-04f, -3.655552479e-04f, -1.806118080e-04f, +2.529860138e-04f, -4.829314578e-05f, -4.572454142e-05f, +3.016325832e-05f, +0.000000000e+00f,\n    /* 10,11 (36) */\n    +0.000000000e+00f, -6.708078904e-04f, +1.809042399e-04f, +2.091237270e-03f, -2.213974826e-03f, -3.239878260e-03f, +7.203095449e-03f, +1.283203669e-03f, -1.462892626e-02f, +7.852808127e-03f, +2.060258893e-02f, -2.788831625e-02f, -1.681843941e-02f, +6.145098224e-02f, -1.299594847e-02f, -1.183793991e-01f, +1.461159065e-01f, +5.452447196e-01f, +4.509526992e-01f, +1.954208331e-02f, -1.111154679e-01f, +3.160473153e-02f, +4.355099889e-02f, -3.415693723e-02f, -1.121677373e-02f, +2.397666802e-02f, -2.988884971e-03f, -1.222704711e-02f, +6.245535495e-03f, +4.016920880e-03f, -4.479577698e-03f, -2.821145921e-04f, +1.908867223e-03f, -4.611266983e-04f, -4.015872663e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.183697139e-05f, -7.731559125e-05f, +1.435704857e-05f, +1.933162649e-04f, -2.000422418e-04f, -2.534366685e-04f, +5.952404552e-04f, +4.025059554e-05f, -1.116123821e-03f, +7.149813435e-04f, +1.459320026e-03f, -2.251661867e-03f, -1.080975745e-03f, +4.988394460e-03f, -1.036535260e-03f, -1.382198515e-02f, -7.133133367e-03f, +1.149785587e-02f, +1.126056544e-02f, -2.336032000e-03f, -3.793465839e-03f, +2.394297346e-03f, +1.172173047e-03f, -1.799537034e-03f, +3.630568119e-05f, +1.010260740e-03f, -4.205314624e-04f, -3.822953020e-04f, +3.670237433e-04f, +4.751309867e-05f, -1.849083097e-04f, +4.744679547e-05f, +4.937953208e-05f, -3.004183543e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.708078904e-04f, -1.809042399e-04f, -2.379900927e-03f, +3.914880308e-03f, +1.801619164e-03f, -1.024343530e-02f, +6.208580315e-03f, +1.241422232e-02f, -2.101346291e-02f, -1.024695011e-03f, +3.092290510e-02f, -2.352356124e-02f, -2.118526445e-02f, +4.496775486e-02f, -9.080567878e-03f, -4.329448498e-02f, +4.069916315e-02f, +1.540484420e-02f, -5.009808638e-02f, +1.930040052e-02f, +3.180653868e-02f, -3.669471950e-02f, -2.774372828e-03f, +2.982950130e-02f, -1.558720013e-02f, -1.154082712e-02f, +1.640667527e-02f, -1.800193161e-03f, -8.147886423e-03f, +4.820967507e-03f, +1.455734754e-03f, -2.423675348e-03f, +4.611266983e-04f, +4.015872663e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.183697139e-05f, +7.731559125e-05f, -5.273917113e-05f, -2.237090575e-04f, +3.915479326e-04f, +5.913161749e-05f, -8.121380210e-04f, +6.750155765e-04f, +7.000310732e-04f, -1.647553387e-03f, +4.160123580e-04f, +1.879252654e-03f, -2.062129603e-03f, -6.576149381e-04f, +2.908698956e-03f, -1.469965605e-03f, -2.002508902e-03f, +2.942149141e-03f, -1.352325835e-04f, -2.641452209e-03f, +1.907210877e-03f, +9.793813793e-04f, -2.173875921e-03f, +6.163389903e-04f, +1.205655978e-03f, -1.143333523e-03f, -1.167812386e-04f, +7.539332808e-04f, -3.422640026e-04f, -2.039913259e-04f, +2.548600675e-04f, -3.996058038e-05f, -4.937953208e-05f, +3.004183543e-05f, +0.000000000e+00f,\n    /* 10,12 (36) */\n    +0.000000000e+00f, -6.489709190e-04f, +1.035886486e-04f, +2.105594318e-03f, -2.020658561e-03f, -3.439920502e-03f, +6.949658780e-03f, +1.878444125e-03f, -1.458867566e-02f, +6.736684306e-03f, +2.131757027e-02f, -2.642899623e-02f, -1.907010128e-02f, +6.037000650e-02f, -8.007554010e-03f, -1.194159343e-01f, +1.322939213e-01f, +5.381115862e-01f, +4.624505551e-01f, +3.080264876e-02f, -1.134514999e-01f, +2.781126569e-02f, +4.594529623e-02f, -3.298476419e-02f, -1.301631076e-02f, +2.401297370e-02f, -1.978624231e-03f, -1.264757858e-02f, +5.863240193e-03f, +4.383944623e-03f, -4.432064600e-03f, -4.670229017e-04f, +1.956314018e-03f, -4.117471662e-04f, -4.316291017e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.341278869e-05f, -7.486434995e-05f, +6.451635999e-06f, +1.951912976e-04f, -1.835170266e-04f, -2.715645258e-04f, +5.770540469e-04f, +8.847119811e-05f, -1.118797047e-03f, +6.315341909e-04f, +1.522122917e-03f, -2.148482886e-03f, -1.260271810e-03f, +4.904701955e-03f, -6.140793350e-04f, -1.361867544e-02f, -7.689458480e-03f, +1.109288022e-02f, +1.161846675e-02f, -2.015529344e-03f, -3.969221342e-03f, +2.284632042e-03f, +1.304571912e-03f, -1.786915553e-03f, -4.460076216e-05f, +1.035499530e-03f, -3.853295463e-04f, -4.104225760e-04f, +3.600489775e-04f, +6.430197459e-05f, -1.884535380e-04f, +4.178848004e-05f, +5.297124727e-05f, -2.977245098e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.489709190e-04f, -1.035886486e-04f, -2.432640098e-03f, +3.691171251e-03f, +2.193167096e-03f, -1.018430368e-02f, +5.396442294e-03f, +1.308923789e-02f, -2.031343184e-02f, -2.672248398e-03f, +3.133891746e-02f, -2.164430858e-02f, -2.324739405e-02f, +4.431013992e-02f, -6.171868922e-03f, -4.476445059e-02f, +3.869665425e-02f, +1.834699334e-02f, -5.023331897e-02f, +1.665894831e-02f, +3.371374956e-02f, -3.571533812e-02f, -4.948248749e-03f, +3.044584029e-02f, -1.438154415e-02f, -1.268416065e-02f, +1.628989403e-02f, -1.046259880e-03f, -8.490150426e-03f, +4.616976181e-03f, +1.710594821e-03f, -2.463635928e-03f, +4.117471662e-04f, +4.316291017e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.341278869e-05f, +7.486434995e-05f, -4.126787494e-05f, -2.316512189e-04f, +3.739559945e-04f, +9.602783878e-05f, -8.178994521e-04f, +6.163905061e-04f, +7.656662674e-04f, -1.619311390e-03f, +2.971902916e-04f, +1.943855444e-03f, -1.964184579e-03f, -8.165422488e-04f, +2.921602689e-03f, -1.303415851e-03f, -2.143072522e-03f, +2.877518520e-03f, +4.860364050e-05f, -2.712355611e-03f, +1.793094934e-03f, +1.117489228e-03f, -2.173570016e-03f, +5.096976529e-04f, +1.273333749e-03f, -1.111703812e-03f, -1.798774665e-04f, +7.719018766e-04f, -3.171331497e-04f, -2.271335633e-04f, +2.557336104e-04f, -3.115741146e-05f, -5.297124727e-05f, +2.977245098e-05f, +0.000000000e+00f,\n    /* 10,13 (36) */\n    +0.000000000e+00f, -6.255581303e-04f, +2.872429870e-05f, +2.112045954e-03f, -1.825467263e-03f, -3.623437528e-03f, +6.678094254e-03f, +2.455498171e-03f, -1.450020447e-02f, +5.617887259e-03f, +2.194910446e-02f, -2.490687331e-02f, -2.121858417e-02f, +5.910973469e-02f, -3.102852055e-03f, -1.200300136e-01f, +1.186752459e-01f, +5.304221278e-01f, +4.735434353e-01f, +4.242111551e-02f, -1.154670293e-01f, +2.384204435e-02f, +4.822992828e-02f, -3.168019227e-02f, -1.480322632e-02f, +2.396837294e-02f, -9.431247010e-04f, -1.303290812e-02f, +5.452817617e-03f, +4.743993601e-03f, -4.367762625e-03f, -6.554764398e-04f, +1.998102498e-03f, -3.587759189e-04f, -4.614015527e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.481950651e-05f, -7.220893438e-05f, -1.242428974e-06f, +1.963218005e-04f, -1.667366759e-04f, -2.883691325e-04f, +5.572560277e-04f, +1.354979999e-04f, -1.117658196e-03f, +5.474111549e-04f, +1.578795588e-03f, -2.040052961e-03f, -1.432061784e-03f, +4.807296497e-03f, -2.017824537e-04f, -1.339318463e-02f, -8.230262858e-03f, +1.066591335e-02f, +1.196017336e-02f, -1.679996932e-03f, -4.135825015e-03f, +2.165296231e-03f, +1.434945780e-03f, -1.768028315e-03f, -1.267776495e-04f, +1.057644062e-03f, -3.481215116e-04f, -4.376923352e-04f, +3.516465582e-04f, +8.127096016e-05f, -1.914024599e-04f, +3.579107793e-05f, +5.648231466e-05f, -2.935027957e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.255581303e-04f, -2.872429870e-05f, -2.473907973e-03f, +3.459520032e-03f, +2.567123091e-03f, -1.008827584e-02f, +4.578542842e-03f, +1.370562840e-02f, -1.954776557e-02f, -4.291559788e-03f, +3.163610775e-02f, -1.970045314e-02f, -2.521157863e-02f, +4.349359768e-02f, -3.250266233e-03f, -4.606786644e-02f, +3.655358173e-02f, +2.122451186e-02f, -5.018471533e-02f, +1.394659270e-02f, +3.550684449e-02f, -3.459784889e-02f, -7.121818765e-03f, +3.095553794e-02f, -1.310821040e-02f, -1.379586446e-02f, +1.611001656e-02f, -2.743580035e-04f, -8.807283576e-03f, +4.389842617e-03f, +1.966328432e-03f, -2.494793340e-03f, +3.587759189e-04f, +4.614015527e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.481950651e-05f, +7.220893438e-05f, -2.999923690e-05f, -2.384520814e-04f, +3.553187094e-04f, +1.318146992e-04f, -8.204595783e-04f, +5.563288172e-04f, +8.275820591e-04f, -1.585344515e-03f, +1.783784702e-04f, +2.000742161e-03f, -1.859570048e-03f, -9.716901891e-04f, +2.923649260e-03f, -1.132362069e-03f, -2.275625000e-03f, +2.802170855e-03f, +2.326702145e-04f, -2.773440751e-03f, +1.671722392e-03f, +1.252338987e-03f, -2.165125655e-03f, +4.000905217e-04f, +1.336992400e-03f, -1.075420669e-03f, -2.432817430e-04f, +7.872128629e-04f, -2.902253637e-04f, -2.499377138e-04f, +2.555748688e-04f, -2.190778440e-05f, -5.648231466e-05f, +2.935027957e-05f, +0.000000000e+00f,\n    /* 10,14 (36) */\n    +0.000000000e+00f, -6.007386238e-04f, -4.348463569e-05f, +2.110803525e-03f, -1.629145463e-03f, -3.790174204e-03f, +6.389725122e-03f, +3.012754199e-03f, -1.436470647e-02f, +4.500229063e-03f, +2.249651562e-02f, -2.332807772e-02f, -2.325863713e-02f, +5.767767291e-02f, +1.704444442e-03f, -1.202317961e-01f, +1.052820612e-01f, +5.221918649e-01f, +4.842093487e-01f, +5.438128888e-02f, -1.171470262e-01f, +1.970621933e-02f, +5.039522451e-02f, -3.024524649e-02f, -1.657125463e-02f, +2.384159529e-02f, +1.145193607e-04f, -1.338102963e-02f, +5.015125282e-03f, +5.095640159e-03f, -4.286491665e-03f, -8.468788996e-04f, +2.033893576e-03f, -3.022936042e-04f, -4.907518323e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.605735419e-05f, -6.936667235e-05f, -8.702120614e-06f, +1.967225296e-04f, -1.497667557e-04f, -3.038194408e-04f, +5.359461581e-04f, +1.811921923e-04f, -1.112777800e-03f, +4.629055282e-04f, +1.629254024e-03f, -1.926816583e-03f, -1.595938597e-03f, +4.696759554e-03f, +1.995348309e-04f, -1.314624525e-02f, -8.754488303e-03f, +1.021773478e-02f, +1.228471971e-02f, -1.329998851e-03f, -4.292566062e-03f, +2.036499118e-03f, +1.562825257e-03f, -1.742831430e-03f, -2.099664357e-04f, +1.076562426e-03f, -3.089993010e-04f, -4.639910278e-04f, +3.418155397e-04f, +9.836228015e-05f, -1.937281326e-04f, +2.946790943e-05f, +5.989514869e-05f, -2.877104896e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.007386238e-04f, +4.348463569e-05f, -2.503907210e-03f, +3.221067951e-03f, +2.922441800e-03f, -9.956461145e-03f, +3.758083264e-03f, +1.426195722e-02f, -1.872018351e-02f, -5.876904303e-03f, +3.181448622e-02f, -1.769971098e-02f, -2.707114868e-02f, +4.252190749e-02f, -3.266169733e-04f, -4.720022851e-02f, +3.427795673e-02f, +2.402668272e-02f, -4.995204511e-02f, +1.117315195e-02f, +3.717856689e-02f, -3.334550991e-02f, -9.286944420e-03f, +3.135562846e-02f, -1.177121800e-02f, -1.487128513e-02f, +1.586673482e-02f, +5.128548594e-04f, -9.097508940e-03f, +4.139904904e-03f, +2.221903300e-03f, -2.516701124e-03f, +3.022936042e-04f, +4.907518323e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.605735419e-05f, +6.936667235e-05f, -1.897552822e-05f, -2.441137911e-04f, +3.357342316e-04f, +1.663738859e-04f, -8.198633372e-04f, +4.950819092e-04f, +8.855907438e-04f, -1.545844387e-03f, +6.002479865e-05f, +2.049758416e-03f, -1.748719956e-03f, -1.122495110e-03f, +2.914867028e-03f, -9.574535272e-04f, -2.399674268e-03f, +2.716379876e-03f, +4.162768226e-04f, -2.824442691e-03f, +1.543514070e-03f, +1.383399859e-03f, -2.148509167e-03f, +2.879063420e-04f, +1.396341886e-03f, -1.034561779e-03f, -3.067518688e-04f, +7.997582934e-04f, -2.616118483e-04f, -2.723020604e-04f, +2.543557191e-04f, -1.223864264e-05f, -5.989514869e-05f, +2.877104896e-05f, +0.000000000e+00f,\n    /* 10,15 (36) */\n    +0.000000000e+00f, -5.746812696e-04f, -1.128513080e-04f, +2.102101405e-03f, -1.432422933e-03f, -3.939940960e-03f, +6.085905681e-03f, +3.548700357e-03f, -1.418351427e-02f, +3.387451263e-03f, +2.295942115e-02f, -2.169882370e-02f, -2.518545371e-02f, +5.608173431e-02f, +6.401203997e-03f, -1.200322613e-01f, +9.213581598e-02f, +5.134373766e-01f, +4.944270835e-01f, +6.666600858e-02f, -1.184770251e-01f, +1.541365327e-02f, +5.243172362e-02f, -2.868242124e-02f, -1.831408606e-02f, +2.363162885e-02f, +1.191081787e-03f, -1.369002894e-02f, +4.551134254e-03f, +5.437455699e-03f, -4.188129385e-03f, -1.040607032e-03f, +2.063361486e-03f, -2.423984556e-04f, -5.195228812e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.712731076e-05f, -6.635512750e-05f, -1.590594318e-05f, +1.964105891e-04f, -1.326720558e-04f, -3.178898405e-04f, +5.132275677e-04f, +2.254220541e-04f, -1.104237902e-03f, +3.783069945e-04f, +1.673436117e-03f, -1.809226314e-03f, -1.751526913e-03f, +4.573699545e-03f, +5.890909962e-04f, -1.287863464e-02f, -9.261117360e-03f, +9.749175768e-03f, +1.259117275e-02f, -9.661452078e-04f, -4.438749728e-03f, +1.898483772e-03f, +1.687741212e-03f, -1.711301519e-03f, -2.939007135e-04f, +1.092131575e-03f, -2.680632841e-04f, -4.892063288e-04f, +3.305601419e-04f, +1.155163692e-04f, -1.954053116e-04f, +2.283397571e-05f, +6.319202002e-05f, -2.803107764e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.746812696e-04f, +1.128513080e-04f, -2.522882738e-03f, +2.976954160e-03f, +3.258176032e-03f, -9.790087259e-03f, +2.938219927e-03f, +1.475703912e-02f, -1.783459277e-02f, -7.422748691e-03f, +3.187451102e-02f, -1.564995256e-02f, -2.881986863e-02f, +4.139941238e-02f, +2.588250055e-03f, -4.815768204e-02f, +3.187828246e-02f, +2.674306260e-02f, -4.953576829e-02f, +8.348709260e-03f, +3.872208096e-02f, -3.196211005e-02f, -1.143545359e-02f, +3.164353480e-02f, -1.037487612e-02f, -1.590584691e-02f, +1.555998295e-02f, +1.312613153e-03f, -9.359120788e-03f, +3.867602843e-03f, +2.476259020e-03f, -2.528939767e-03f, +2.423984556e-04f, +5.195228812e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.712731076e-05f, +6.635512750e-05f, -8.236710362e-06f, -2.486432361e-04f, +3.153024208e-04f, +1.995942661e-04f, -8.161673367e-04f, +4.329021186e-04f, +9.395220870e-04f, -1.501021790e-03f, -5.742869633e-05f, +2.090780974e-03f, -1.632089278e-03f, -1.268412490e-03f, +2.895325297e-03f, -7.793528412e-04f, -2.514760751e-03f, +2.620459116e-03f, +5.987334116e-04f, -2.865133908e-03f, +1.408918930e-03f, +1.510152137e-03f, -2.123718000e-03f, +1.735475238e-04f, +1.451105637e-03f, -9.892237732e-04f, -3.700417080e-04f, +8.094394370e-04f, -2.313722053e-04f, -2.941243906e-04f, +2.520519038e-04f, -2.179681792e-06f, -6.319202002e-05f, +2.803107764e-05f, +0.000000000e+00f,\n    /* 10,16 (36) */\n    +0.000000000e+00f, -5.475539589e-04f, -1.792064355e-04f, +2.086195461e-03f, -1.236012344e-03f, -4.072613016e-03f, +5.768015841e-03f, +4.061927925e-03f, -1.395809222e-02f, +2.283213361e-03f, +2.333772814e-02f, -2.002538758e-02f, -2.699468003e-02f, +5.433020740e-02f, +1.097490354e-02f, -1.194431703e-01f, +7.925718134e-02f, +5.041762592e-01f, +5.041762592e-01f, +7.925718134e-02f, -1.194431703e-01f, +1.097490354e-02f, +5.433020740e-02f, -2.699468003e-02f, -2.002538758e-02f, +2.333772814e-02f, +2.283213361e-03f, -1.395809222e-02f, +4.061927925e-03f, +5.768015841e-03f, -4.072613016e-03f, -1.236012344e-03f, +2.086195461e-03f, -1.792064355e-04f, -5.475539589e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.803107764e-05f, -6.319202002e-05f, -2.283397571e-05f, +1.954053116e-04f, -1.155163692e-04f, -3.305601419e-04f, +4.892063288e-04f, +2.680632841e-04f, -1.092131575e-03f, +2.939007135e-04f, +1.711301519e-03f, -1.687741212e-03f, -1.898483772e-03f, +4.438749728e-03f, +9.661452078e-04f, -1.259117275e-02f, -9.749175768e-03f, +9.261117360e-03f, +1.287863464e-02f, -5.890909962e-04f, -4.573699545e-03f, +1.751526913e-03f, +1.809226314e-03f, -1.673436117e-03f, -3.783069945e-04f, +1.104237902e-03f, -2.254220541e-04f, -5.132275677e-04f, +3.178898405e-04f, +1.326720558e-04f, -1.964105891e-04f, +1.590594318e-05f, +6.635512750e-05f, -2.712731076e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.475539589e-04f, +1.792064355e-04f, -2.531119449e-03f, +2.728310923e-03f, +3.573478453e-03f, -9.590492993e-03f, +2.122052590e-03f, +1.518994124e-02f, -1.689507068e-02f, -8.923770481e-03f, +3.181708233e-02f, -1.355917159e-02f, -3.045195791e-02f, +4.013099989e-02f, +5.483575352e-03f, -4.893703488e-02f, +2.936352171e-02f, +2.936352171e-02f, -4.893703488e-02f, +5.483575352e-03f, +4.013099989e-02f, -3.045195791e-02f, -1.355917159e-02f, +3.181708233e-02f, -8.923770481e-03f, -1.689507068e-02f, +1.518994124e-02f, +2.122052590e-03f, -9.590492993e-03f, +3.573478453e-03f, +2.728310923e-03f, -2.531119449e-03f, +1.792064355e-04f, +5.475539589e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.803107764e-05f, +6.319202002e-05f, +2.179681792e-06f, -2.520519038e-04f, +2.941243906e-04f, +2.313722053e-04f, -8.094394370e-04f, +3.700417080e-04f, +9.892237732e-04f, -1.451105637e-03f, -1.735475238e-04f, +2.123718000e-03f, -1.510152137e-03f, -1.408918930e-03f, +2.865133908e-03f, -5.987334116e-04f, -2.620459116e-03f, +2.514760751e-03f, +7.793528412e-04f, -2.895325297e-03f, +1.268412490e-03f, +1.632089278e-03f, -2.090780974e-03f, +5.742869633e-05f, +1.501021790e-03f, -9.395220870e-04f, -4.329021186e-04f, +8.161673367e-04f, -1.995942661e-04f, -3.153024208e-04f, +2.486432361e-04f, +8.236710362e-06f, -6.635512750e-05f, +2.712731076e-05f, +0.000000000e+00f,\n    /* 10,17 (36) */\n    +0.000000000e+00f, -5.195228812e-04f, -2.423984556e-04f, +2.063361486e-03f, -1.040607032e-03f, -4.188129385e-03f, +5.437455699e-03f, +4.551134254e-03f, -1.369002894e-02f, +1.191081787e-03f, +2.363162885e-02f, -1.831408606e-02f, -2.868242124e-02f, +5.243172362e-02f, +1.541365327e-02f, -1.184770251e-01f, +6.666600858e-02f, +4.944270835e-01f, +5.134373766e-01f, +9.213581598e-02f, -1.200322613e-01f, +6.401203997e-03f, +5.608173431e-02f, -2.518545371e-02f, -2.169882370e-02f, +2.295942115e-02f, +3.387451263e-03f, -1.418351427e-02f, +3.548700357e-03f, +6.085905681e-03f, -3.939940960e-03f, -1.432422933e-03f, +2.102101405e-03f, -1.128513080e-04f, -5.746812696e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.877104896e-05f, -5.989514869e-05f, -2.946790943e-05f, +1.937281326e-04f, -9.836228015e-05f, -3.418155397e-04f, +4.639910278e-04f, +3.089993010e-04f, -1.076562426e-03f, +2.099664357e-04f, +1.742831430e-03f, -1.562825257e-03f, -2.036499118e-03f, +4.292566062e-03f, +1.329998851e-03f, -1.228471971e-02f, -1.021773478e-02f, +8.754488303e-03f, +1.314624525e-02f, -1.995348309e-04f, -4.696759554e-03f, +1.595938597e-03f, +1.926816583e-03f, -1.629254024e-03f, -4.629055282e-04f, +1.112777800e-03f, -1.811921923e-04f, -5.359461581e-04f, +3.038194408e-04f, +1.497667557e-04f, -1.967225296e-04f, +8.702120614e-06f, +6.936667235e-05f, -2.605735419e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.195228812e-04f, +2.423984556e-04f, -2.528939767e-03f, +2.476259020e-03f, +3.867602843e-03f, -9.359120788e-03f, +1.312613153e-03f, +1.555998295e-02f, -1.590584691e-02f, -1.037487612e-02f, +3.164353480e-02f, -1.143545359e-02f, -3.196211005e-02f, +3.872208096e-02f, +8.348709260e-03f, -4.953576829e-02f, +2.674306260e-02f, +3.187828246e-02f, -4.815768204e-02f, +2.588250055e-03f, +4.139941238e-02f, -2.881986863e-02f, -1.564995256e-02f, +3.187451102e-02f, -7.422748691e-03f, -1.783459277e-02f, +1.475703912e-02f, +2.938219927e-03f, -9.790087259e-03f, +3.258176032e-03f, +2.976954160e-03f, -2.522882738e-03f, +1.128513080e-04f, +5.746812696e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.877104896e-05f, +5.989514869e-05f, +1.223864264e-05f, -2.543557191e-04f, +2.723020604e-04f, +2.616118483e-04f, -7.997582934e-04f, +3.067518688e-04f, +1.034561779e-03f, -1.396341886e-03f, -2.879063420e-04f, +2.148509167e-03f, -1.383399859e-03f, -1.543514070e-03f, +2.824442691e-03f, -4.162768226e-04f, -2.716379876e-03f, +2.399674268e-03f, +9.574535272e-04f, -2.914867028e-03f, +1.122495110e-03f, +1.748719956e-03f, -2.049758416e-03f, -6.002479865e-05f, +1.545844387e-03f, -8.855907438e-04f, -4.950819092e-04f, +8.198633372e-04f, -1.663738859e-04f, -3.357342316e-04f, +2.441137911e-04f, +1.897552822e-05f, -6.936667235e-05f, +2.605735419e-05f, +0.000000000e+00f,\n    /* 10,18 (36) */\n    +0.000000000e+00f, -4.907518323e-04f, -3.022936042e-04f, +2.033893576e-03f, -8.468788996e-04f, -4.286491665e-03f, +5.095640159e-03f, +5.015125282e-03f, -1.338102963e-02f, +1.145193607e-04f, +2.384159529e-02f, -1.657125463e-02f, -3.024524649e-02f, +5.039522451e-02f, +1.970621933e-02f, -1.171470262e-01f, +5.438128888e-02f, +4.842093487e-01f, +5.221918649e-01f, +1.052820612e-01f, -1.202317961e-01f, +1.704444442e-03f, +5.767767291e-02f, -2.325863713e-02f, -2.332807772e-02f, +2.249651562e-02f, +4.500229063e-03f, -1.436470647e-02f, +3.012754199e-03f, +6.389725122e-03f, -3.790174204e-03f, -1.629145463e-03f, +2.110803525e-03f, -4.348463569e-05f, -6.007386238e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.935027957e-05f, -5.648231466e-05f, -3.579107793e-05f, +1.914024599e-04f, -8.127096016e-05f, -3.516465582e-04f, +4.376923352e-04f, +3.481215116e-04f, -1.057644062e-03f, +1.267776495e-04f, +1.768028315e-03f, -1.434945780e-03f, -2.165296231e-03f, +4.135825015e-03f, +1.679996932e-03f, -1.196017336e-02f, -1.066591335e-02f, +8.230262858e-03f, +1.339318463e-02f, +2.017824537e-04f, -4.807296497e-03f, +1.432061784e-03f, +2.040052961e-03f, -1.578795588e-03f, -5.474111549e-04f, +1.117658196e-03f, -1.354979999e-04f, -5.572560277e-04f, +2.883691325e-04f, +1.667366759e-04f, -1.963218005e-04f, +1.242428974e-06f, +7.220893438e-05f, -2.481950651e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.907518323e-04f, +3.022936042e-04f, -2.516701124e-03f, +2.221903300e-03f, +4.139904904e-03f, -9.097508940e-03f, +5.128548594e-04f, +1.586673482e-02f, -1.487128513e-02f, -1.177121800e-02f, +3.135562846e-02f, -9.286944420e-03f, -3.334550991e-02f, +3.717856689e-02f, +1.117315195e-02f, -4.995204511e-02f, +2.402668272e-02f, +3.427795673e-02f, -4.720022851e-02f, -3.266169733e-04f, +4.252190749e-02f, -2.707114868e-02f, -1.769971098e-02f, +3.181448622e-02f, -5.876904303e-03f, -1.872018351e-02f, +1.426195722e-02f, +3.758083264e-03f, -9.956461145e-03f, +2.922441800e-03f, +3.221067951e-03f, -2.503907210e-03f, +4.348463569e-05f, +6.007386238e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.935027957e-05f, +5.648231466e-05f, +2.190778440e-05f, -2.555748688e-04f, +2.499377138e-04f, +2.902253637e-04f, -7.872128629e-04f, +2.432817430e-04f, +1.075420669e-03f, -1.336992400e-03f, -4.000905217e-04f, +2.165125655e-03f, -1.252338987e-03f, -1.671722392e-03f, +2.773440751e-03f, -2.326702145e-04f, -2.802170855e-03f, +2.275625000e-03f, +1.132362069e-03f, -2.923649260e-03f, +9.716901891e-04f, +1.859570048e-03f, -2.000742161e-03f, -1.783784702e-04f, +1.585344515e-03f, -8.275820591e-04f, -5.563288172e-04f, +8.204595783e-04f, -1.318146992e-04f, -3.553187094e-04f, +2.384520814e-04f, +2.999923690e-05f, -7.220893438e-05f, +2.481950651e-05f, +0.000000000e+00f,\n    /* 10,19 (36) */\n    +0.000000000e+00f, -4.614015527e-04f, -3.587759189e-04f, +1.998102498e-03f, -6.554764398e-04f, -4.367762625e-03f, +4.743993601e-03f, +5.452817617e-03f, -1.303290812e-02f, -9.431247010e-04f, +2.396837294e-02f, -1.480322632e-02f, -3.168019227e-02f, +4.822992828e-02f, +2.384204435e-02f, -1.154670293e-01f, +4.242111551e-02f, +4.735434353e-01f, +5.304221278e-01f, +1.186752459e-01f, -1.200300136e-01f, -3.102852055e-03f, +5.910973469e-02f, -2.121858417e-02f, -2.490687331e-02f, +2.194910446e-02f, +5.617887259e-03f, -1.450020447e-02f, +2.455498171e-03f, +6.678094254e-03f, -3.623437528e-03f, -1.825467263e-03f, +2.112045954e-03f, +2.872429870e-05f, -6.255581303e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.977245098e-05f, -5.297124727e-05f, -4.178848004e-05f, +1.884535380e-04f, -6.430197459e-05f, -3.600489775e-04f, +4.104225760e-04f, +3.853295463e-04f, -1.035499530e-03f, +4.460076216e-05f, +1.786915553e-03f, -1.304571912e-03f, -2.284632042e-03f, +3.969221342e-03f, +2.015529344e-03f, -1.161846675e-02f, -1.109288022e-02f, +7.689458480e-03f, +1.361867544e-02f, +6.140793350e-04f, -4.904701955e-03f, +1.260271810e-03f, +2.148482886e-03f, -1.522122917e-03f, -6.315341909e-04f, +1.118797047e-03f, -8.847119811e-05f, -5.770540469e-04f, +2.715645258e-04f, +1.835170266e-04f, -1.951912976e-04f, -6.451635999e-06f, +7.486434995e-05f, -2.341278869e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.614015527e-04f, +3.587759189e-04f, -2.494793340e-03f, +1.966328432e-03f, +4.389842617e-03f, -8.807283576e-03f, -2.743580035e-04f, +1.611001656e-02f, -1.379586446e-02f, -1.310821040e-02f, +3.095553794e-02f, -7.121818765e-03f, -3.459784889e-02f, +3.550684449e-02f, +1.394659270e-02f, -5.018471533e-02f, +2.122451186e-02f, +3.655358173e-02f, -4.606786644e-02f, -3.250266233e-03f, +4.349359768e-02f, -2.521157863e-02f, -1.970045314e-02f, +3.163610775e-02f, -4.291559788e-03f, -1.954776557e-02f, +1.370562840e-02f, +4.578542842e-03f, -1.008827584e-02f, +2.567123091e-03f, +3.459520032e-03f, -2.473907973e-03f, -2.872429870e-05f, +6.255581303e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.977245098e-05f, +5.297124727e-05f, +3.115741146e-05f, -2.557336104e-04f, +2.271335633e-04f, +3.171331497e-04f, -7.719018766e-04f, +1.798774665e-04f, +1.111703812e-03f, -1.273333749e-03f, -5.096976529e-04f, +2.173570016e-03f, -1.117489228e-03f, -1.793094934e-03f, +2.712355611e-03f, -4.860364050e-05f, -2.877518520e-03f, +2.143072522e-03f, +1.303415851e-03f, -2.921602689e-03f, +8.165422488e-04f, +1.964184579e-03f, -1.943855444e-03f, -2.971902916e-04f, +1.619311390e-03f, -7.656662674e-04f, -6.163905061e-04f, +8.178994521e-04f, -9.602783878e-05f, -3.739559945e-04f, +2.316512189e-04f, +4.126787494e-05f, -7.486434995e-05f, +2.341278869e-05f, +0.000000000e+00f,\n    /* 10,20 (36) */\n    +0.000000000e+00f, -4.316291017e-04f, -4.117471662e-04f, +1.956314018e-03f, -4.670229017e-04f, -4.432064600e-03f, +4.383944623e-03f, +5.863240193e-03f, -1.264757858e-02f, -1.978624231e-03f, +2.401297370e-02f, -1.301631076e-02f, -3.298476419e-02f, +4.594529623e-02f, +2.781126569e-02f, -1.134514999e-01f, +3.080264876e-02f, +4.624505551e-01f, +5.381115862e-01f, +1.322939213e-01f, -1.194159343e-01f, -8.007554010e-03f, +6.037000650e-02f, -1.907010128e-02f, -2.642899623e-02f, +2.131757027e-02f, +6.736684306e-03f, -1.458867566e-02f, +1.878444125e-03f, +6.949658780e-03f, -3.439920502e-03f, -2.020658561e-03f, +2.105594318e-03f, +1.035886486e-04f, -6.489709190e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.004183543e-05f, -4.937953208e-05f, -4.744679547e-05f, +1.849083097e-04f, -4.751309867e-05f, -3.670237433e-04f, +3.822953020e-04f, +4.205314624e-04f, -1.010260740e-03f, -3.630568119e-05f, +1.799537034e-03f, -1.172173047e-03f, -2.394297346e-03f, +3.793465839e-03f, +2.336032000e-03f, -1.126056544e-02f, -1.149785587e-02f, +7.133133367e-03f, +1.382198515e-02f, +1.036535260e-03f, -4.988394460e-03f, +1.080975745e-03f, +2.251661867e-03f, -1.459320026e-03f, -7.149813435e-04f, +1.116123821e-03f, -4.025059554e-05f, -5.952404552e-04f, +2.534366685e-04f, +2.000422418e-04f, -1.933162649e-04f, -1.435704857e-05f, +7.731559125e-05f, -2.183697139e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.316291017e-04f, +4.117471662e-04f, -2.463635928e-03f, +1.710594821e-03f, +4.616976181e-03f, -8.490150426e-03f, -1.046259880e-03f, +1.628989403e-02f, -1.268416065e-02f, -1.438154415e-02f, +3.044584029e-02f, -4.948248749e-03f, -3.571533812e-02f, +3.371374956e-02f, +1.665894831e-02f, -5.023331897e-02f, +1.834699334e-02f, +3.869665425e-02f, -4.476445059e-02f, -6.171868922e-03f, +4.431013992e-02f, -2.324739405e-02f, -2.164430858e-02f, +3.133891746e-02f, -2.672248398e-03f, -2.031343184e-02f, +1.308923789e-02f, +5.396442294e-03f, -1.018430368e-02f, +2.193167096e-03f, +3.691171251e-03f, -2.432640098e-03f, -1.035886486e-04f, +6.489709190e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.004183543e-05f, +4.937953208e-05f, +3.996058038e-05f, -2.548600675e-04f, +2.039913259e-04f, +3.422640026e-04f, -7.539332808e-04f, +1.167812386e-04f, +1.143333523e-03f, -1.205655978e-03f, -6.163389903e-04f, +2.173875921e-03f, -9.793813793e-04f, -1.907210877e-03f, +2.641452209e-03f, +1.352325835e-04f, -2.942149141e-03f, +2.002508902e-03f, +1.469965605e-03f, -2.908698956e-03f, +6.576149381e-04f, +2.062129603e-03f, -1.879252654e-03f, -4.160123580e-04f, +1.647553387e-03f, -7.000310732e-04f, -6.750155765e-04f, +8.121380210e-04f, -5.913161749e-05f, -3.915479326e-04f, +2.237090575e-04f, +5.273917113e-05f, -7.731559125e-05f, +2.183697139e-05f, +0.000000000e+00f,\n    /* 10,21 (36) */\n    +0.000000000e+00f, -4.015872663e-04f, -4.611266983e-04f, +1.908867223e-03f, -2.821145921e-04f, -4.479577698e-03f, +4.016920880e-03f, +6.245535495e-03f, -1.222704711e-02f, -2.988884971e-03f, +2.397666802e-02f, -1.121677373e-02f, -3.415693723e-02f, +4.355099889e-02f, +3.160473153e-02f, -1.111154679e-01f, +1.954208331e-02f, +4.509526992e-01f, +5.452447196e-01f, +1.461159065e-01f, -1.183793991e-01f, -1.299594847e-02f, +6.145098224e-02f, -1.681843941e-02f, -2.788831625e-02f, +2.060258893e-02f, +7.852808127e-03f, -1.462892626e-02f, +1.283203669e-03f, +7.203095449e-03f, -3.239878260e-03f, -2.213974826e-03f, +2.091237270e-03f, +1.809042399e-04f, -6.708078904e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.016325832e-05f, -4.572454142e-05f, -5.275439348e-05f, +1.807952724e-04f, -3.096014414e-05f, -3.725768584e-04f, +3.534248684e-04f, +4.536439134e-04f, -9.820678624e-04f, -1.156917410e-04f, +1.805956677e-03f, -1.038217321e-03f, -2.494116903e-03f, +3.609283075e-03f, +2.640987822e-03f, -1.088746485e-02f, -1.188011425e-02f, +6.562383914e-03f, +1.400242824e-02f, +1.468292429e-03f, -5.057821535e-03f, +8.946116431e-04f, +2.349155062e-03f, -1.390492908e-03f, -7.974566525e-04f, +1.109579937e-03f, +9.018273929e-06f, -6.117192827e-04f, +2.340220430e-04f, +2.162462075e-04f, -1.906844073e-04f, -2.244930511e-05f, +7.954564686e-05f, -2.009259950e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.015872663e-04f, +4.611266983e-04f, -2.423675348e-03f, +1.455734754e-03f, +4.820967507e-03f, -8.147886423e-03f, -1.800193161e-03f, +1.640667527e-02f, -1.154082712e-02f, -1.558720013e-02f, +2.982950130e-02f, -2.774372828e-03f, -3.669471950e-02f, +3.180653868e-02f, +1.930040052e-02f, -5.009808638e-02f, +1.540484420e-02f, +4.069916315e-02f, -4.329448498e-02f, -9.080567878e-03f, +4.496775486e-02f, -2.118526445e-02f, -2.352356124e-02f, +3.092290510e-02f, -1.024695011e-03f, -2.101346291e-02f, +1.241422232e-02f, +6.208580315e-03f, -1.024343530e-02f, +1.801619164e-03f, +3.914880308e-03f, -2.379900927e-03f, -1.809042399e-04f, +6.708078904e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.016325832e-05f, +4.572454142e-05f, +4.829314578e-05f, -2.529860138e-04f, +1.806118080e-04f, +3.655552479e-04f, -7.334236496e-04f, +5.423041956e-05f, +1.170251128e-03f, -1.134261323e-03f, -7.196408316e-04f, +2.166107787e-03f, -8.385552114e-04f, -2.013679029e-03f, +2.561031746e-03f, +3.181505232e-04f, -2.995829819e-03f, +1.854456839e-03f, +1.631377929e-03f, -2.884950883e-03f, +4.954889467e-04f, +2.152994000e-03f, -1.807118973e-03f, -5.343925828e-04f, +1.669898998e-03f, -6.308811252e-04f, -7.319545879e-04f, +8.031423941e-04f, -2.125117424e-05f, -4.079985290e-04f, +2.146283198e-04f, +6.436867513e-05f, -7.954564686e-05f, +2.009259950e-05f, +0.000000000e+00f,\n    /* 10,22 (36) */\n    +0.000000000e+00f, -3.714240080e-04f, -5.068512397e-04f, +1.856112829e-03f, -1.013193196e-04f, -4.510537843e-03f, +3.644344022e-03f, +6.598960363e-03f, -1.177340320e-02f, -3.970952834e-03f, +2.386097628e-02f, -9.410817054e-03f, -3.519515455e-02f, +4.105688198e-02f, +3.521401460e-02f, -1.084744801e-01f, +8.654618468e-03f, +4.390725850e-01f, +5.518071035e-01f, +1.601183347e-01f, -1.169111066e-01f, -1.805377000e-02f, +6.234559389e-02f, -1.446928435e-02f, -2.927880916e-02f, +1.980513228e-02f, +8.962388064e-03f, -1.461990799e-02f, +6.714843867e-04f, +7.437117492e-03f, -3.023632052e-03f, -2.404659233e-03f, +2.068787965e-03f, +2.604498868e-04f, -6.909004899e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.014205917e-05f, -4.202336772e-05f, -5.770133452e-05f, +1.761443340e-04f, -1.469679696e-05f, -3.767192590e-04f, +3.239260137e-04f, +4.845922862e-04f, -9.510687062e-04f, -1.933167852e-04f, +1.806257904e-03f, -9.031701321e-04f, -2.583949443e-03f, +3.417409112e-03f, +2.929927596e-03f, -1.050018743e-02f, -1.223898450e-02f, +5.978342056e-03f, +1.415936827e-02f, +1.908457696e-03f, -5.112461682e-03f, +7.016476946e-04f, +2.440538845e-03f, -1.315769538e-03f, -8.786624560e-04f, +1.099119168e-03f, +5.918354445e-05f, -6.263987663e-04f, +2.133625434e-04f, +2.320624969e-04f, -1.872859978e-04f, -3.070248344e-05f, +8.153790302e-05f, -1.818101394e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.714240080e-04f, +5.068512397e-04f, -2.375382202e-03f, +1.202748740e-03f, +5.001579315e-03f, -7.782331176e-03f, -2.533616811e-03f, +1.646090569e-02f, -1.037057600e-02f, -1.672146145e-02f, +2.910986046e-02f, -6.082650413e-04f, -3.753327471e-02f, +2.979285965e-02f, +2.186143227e-02f, -4.977993586e-02f, +1.240901438e-02f, +4.255361999e-02f, -4.166310706e-02f, -1.196551876e-02f, +4.546324381e-02f, -1.903227045e-02f, -2.533068021e-02f, +3.038851252e-02f, +6.452039870e-04f, -2.164434404e-02f, +1.168226773e-02f, +7.011722709e-03f, -1.026468647e-02f, +1.393620635e-03f, +4.129508628e-03f, -2.315532252e-03f, -2.604498868e-04f, +6.909004899e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.014205917e-05f, +4.202336772e-05f, +5.613379215e-05f, -2.501466451e-04f, +1.570945041e-04f, +3.869528322e-04f, -7.104975722e-04f, -7.543337918e-06f, +1.192416947e-03f, -1.059462904e-03f, -8.192458243e-04f, +2.150360292e-03f, -6.955573382e-04f, -2.112139179e-03f, +2.471430410e-03f, +4.994672567e-04f, -3.038369337e-03f, +1.699467671e-03f, +1.787037745e-03f, -2.850412561e-03f, +3.307598458e-04f, +2.236391213e-03f, -1.727669888e-03f, -6.518764250e-04f, +1.686197720e-03f, -5.584374170e-04f, -7.869610876e-04f, +7.908920603e-04f, +1.748191534e-05f, -4.232144021e-04f, +2.044167045e-04f, +7.610990162e-05f, -8.153790302e-05f, +1.818101394e-05f, +0.000000000e+00f,\n    /* 10,23 (36) */\n    +0.000000000e+00f, -3.412819488e-04f, -5.488746074e-04f, +1.798411495e-03f, +7.482501437e-05f, -4.525234640e-03f, +3.267624763e-03f, +6.922886377e-03f, -1.128881091e-02f, -4.922021540e-03f, +2.366765949e-02f, -7.604559150e-03f, -3.609832469e-02f, +3.847293254e-02f, +3.863142371e-02f, -1.055445525e-01f, -1.845568962e-03f, +4.268336005e-01f, +5.577854456e-01f, +1.742777030e-01f, -1.150026489e-01f, -2.316623169e-02f, +6.304724158e-02f, -1.202874551e-02f, -3.059457870e-02f, +1.892646982e-02f, +1.006150723e-02f, -1.456072444e-02f, +4.508562038e-05f, +7.650480035e-03f, -2.791569555e-03f, -2.591945231e-03f, +2.038085481e-03f, +3.419877898e-04f, -7.090815039e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.998405133e-05f, -3.829275975e-05f, -6.227936507e-05f, +1.709866648e-04f, +1.225533759e-06f, -3.794666750e-04f, +2.939134475e-04f, +5.133108049e-04f, -9.174180851e-04f, -2.689501487e-04f, +1.800543053e-03f, -7.674926758e-04f, -2.663687558e-03f, +3.218589221e-03f, +3.202430684e-03f, -1.009977991e-02f, -1.257385239e-02f, +5.382172507e-03f, +1.429221976e-02f, +2.356104585e-03f, -5.151826305e-03f, +5.025812648e-04f, +2.525402363e-03f, -1.235299800e-03f, -9.583003777e-04f, +1.084708017e-03f, +1.100874403e-04f, -6.391917579e-04f, +1.915054324e-04f, +2.474246117e-04f, -1.831139756e-04f, -3.908930945e-05f, +8.327622540e-05f, -1.610437038e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.412819488e-04f, +5.488746074e-04f, -2.319248410e-03f, +9.526020949e-04f, +5.158673819e-03f, -7.395378343e-03f, -3.244114383e-03f, +1.645336235e-02f, -9.178159050e-03f, -1.778092436e-02f, +2.829061464e-02f, +1.542095251e-03f, -3.822883205e-02f, +2.768072048e-02f, +2.433286268e-02f, -4.928046860e-02f, +9.370645047e-03f, +4.425308766e-02f, -3.987606931e-02f, -1.481593132e-02f, +4.579400365e-02f, -1.679587923e-02f, -2.705835010e-02f, +2.973663610e-02f, +2.331401707e-03f, -2.220278145e-02f, +1.089530664e-02f, +7.802614769e-03f, -1.024720456e-02f, +9.704062327e-04f, +4.333925333e-03f, -2.239422350e-03f, -3.419877898e-04f, +7.090815039e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.998405133e-05f, +3.829275975e-05f, +6.346405180e-05f, -2.463803425e-04f, +1.335372086e-04f, +4.064113792e-04f, -6.852870172e-04f, -6.831492326e-05f, +1.209810209e-03f, -9.815833829e-04f, -9.148141966e-04f, +2.126757767e-03f, -5.509390681e-04f, -2.202263322e-03f, +2.373017956e-03f, +6.785074790e-04f, -3.069618857e-03f, +1.538119278e-03f, +1.936350697e-03f, -2.805179267e-03f, +1.640358600e-04f, +2.311960884e-03f, -1.641150580e-03f, -7.680086419e-04f, +1.696320876e-03f, -4.829366141e-04f, -8.397926405e-04f, +7.753791751e-04f, +5.693006235e-05f, -4.371052354e-04f, +1.930869736e-04f, +8.791448778e-05f, -8.327622540e-05f, +1.610437038e-05f, +0.000000000e+00f,\n    /* 10,24 (36) */\n    +0.000000000e+00f, -3.112978975e-04f, -5.871673671e-04f, +1.736132130e-03f, +2.458116791e-04f, -4.524009106e-03f, +2.888158088e-03f, +7.216799824e-03f, -1.077550011e-02f, -5.839439625e-03f, +2.339870935e-02f, -5.804016097e-03f, -3.686581736e-02f, +3.580924498e-02f, +4.185001294e-02f, -1.023421218e-01f, -1.194534887e-02f, +4.142597481e-01f, +5.631676181e-01f, +1.885699227e-01f, -1.126465443e-01f, -2.831805799e-02f, +6.354982285e-02f, -9.503343145e-03f, -3.182987850e-02f, +1.796816944e-02f, +1.114621525e-02f, -1.445063700e-02f, -5.941061375e-04f, +7.841985467e-03f, -2.544144944e-03f, -2.775059206e-03f, +1.998996172e-03f, +4.252640152e-04f, -7.251858742e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.969548071e-05f, -3.454906199e-05f, -6.648190592e-05f, +1.653545488e-04f, +1.675785505e-05f, -3.808394755e-04f, +2.635014452e-04f, +5.397426018e-04f, -8.812771671e-04f, -3.423717487e-04f, +1.788932731e-03f, -6.316405263e-04f, -2.733257492e-03f, +3.013575599e-03f, +3.458125588e-03f, -9.687310381e-03f, -1.288416172e-02f, +4.775069922e-03f, +1.440045004e-02f, +2.810275417e-03f, -5.175461552e-03f, +2.979378363e-04f, +2.603349068e-03f, -1.149255343e-03f, -1.036072332e-03f, +1.066326044e-03f, +1.615667266e-04f, -6.500161234e-04f, +1.685032771e-04f, +2.622662284e-04f, -1.781640366e-04f, -4.758123071e-05f, +8.474504102e-05f, -1.386565486e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.112978975e-04f, +5.871673671e-04f, -2.255784358e-03f, +7.062217525e-04f, +5.292211027e-03f, -6.988966964e-03f, -3.929401400e-03f, +1.638504743e-02f, -7.968348841e-03f, -1.876250774e-02f, +2.737580044e-02f, +3.668853018e-03f, -3.877977112e-02f, +2.547845715e-02f, +2.670588063e-02f, -4.860196112e-02f, +6.301026190e-03f, +4.579120694e-02f, -3.793971861e-02f, -1.762111059e-02f, +4.595803951e-02f, -1.448391835e-02f, -2.869950068e-02f, +2.896862746e-02f, +4.027722584e-03f, -2.268571807e-02f, +1.005551400e-02f, +8.577993945e-03f, -1.019027450e-02f, +5.333009973e-04f, +4.527012306e-03f, -2.151507862e-03f, -4.252640152e-04f, +7.251858742e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.969548071e-05f, +3.454906199e-05f, +7.026830925e-05f, -2.417284259e-04f, +1.100356434e-04f, +4.238942074e-04f, -6.579306774e-04f, -1.278665634e-04f, +1.222428889e-03f, -9.009535962e-04f, -1.006024907e-03f, +2.095453481e-03f, -4.052542535e-04f, -2.283756763e-03f, +2.266196171e-03f, +8.546060723e-04f, -3.089472453e-03f, +1.371013874e-03f, +2.078745462e-03f, -2.749387231e-03f, -4.064419775e-06f, +2.379370406e-03f, -1.547835191e-03f, -8.823350607e-04f, +1.700162350e-03f, -4.046303101e-04f, -8.902118581e-04f, +7.566088004e-04f, +9.695012096e-05f, -4.495842258e-04f, +1.806570197e-04f, +9.973236345e-05f, -8.474504102e-05f, +1.386565486e-05f, +0.000000000e+00f,\n    /* 10,25 (36) */\n    +0.000000000e+00f, -2.816024168e-04f, -6.217164291e-04f, +1.669650224e-03f, +4.111662279e-04f, -4.507251251e-03f, +2.507318612e-03f, +7.480301269e-03f, -1.023575751e-02f, -6.720716792e-03f, +2.305633760e-02f, -4.015083365e-03f, -3.749745789e-02f, +3.307598749e-02f, +4.486358854e-02f, -9.888399625e-02f, -2.163265925e-02f, +4.013755864e-01f, +5.679426880e-01f, +2.029703728e-01f, -1.098362689e-01f, -3.349351954e-02f, +6.384776068e-02f, -6.899994078e-03f, -3.297913384e-02f, +1.693209711e-02f, +1.221254129e-02f, -1.428907027e-02f, -1.244122261e-03f, +8.010488745e-03f, -2.281878715e-03f, -2.953223243e-03f, +1.951414941e-03f, +5.100090562e-04f, -7.390515291e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.928298365e-05f, -3.080815738e-05f, -7.030403398e-05f, +1.592812343e-04f, +3.185371746e-05f, -3.808625011e-04f, +2.328034518e-04f, +5.638397564e-04f, -8.428128131e-04f, -4.133726548e-04f, +1.771565127e-03f, -4.960622527e-04f, -2.792618837e-03f, +2.803125091e-03f, +3.696690383e-03f, -9.263865382e-03f, -1.316941546e-02f, +4.158255968e-03f, +1.448358090e-02f, +3.269983539e-03f, -5.182950086e-03f, +8.826984939e-05f, +2.673998238e-03f, -1.057829360e-03f, -1.111681544e-03f, +1.043966167e-03f, +2.134531864e-04f, -6.587951315e-04f, +1.444138644e-04f, +2.765214500e-04f, -1.724347159e-04f, -5.614849721e-05f, +8.592942003e-05f, -1.146869604e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.816024168e-04f, +6.217164291e-04f, -2.185516049e-03f, +4.644933266e-04f, +5.402246671e-03f, -6.565072757e-03f, -4.587332077e-03f, +1.625718086e-02f, -6.745919952e-03f, -1.966346134e-02f, +2.636977554e-02f, +5.764306499e-03f, -3.918502537e-02f, +2.319470039e-02f, +2.897207681e-02f, -4.774735505e-02f, +3.211553737e-03f, +4.716222082e-02f, -3.586097315e-02f, -2.037049782e-02f, +4.595397510e-02f, -1.210454794e-02f, -3.024733587e-02f, +2.808629239e-02f, +5.727884933e-03f, -2.309034838e-02f, +9.165302142e-03f, +9.334602745e-03f, -1.009332438e-02f, +8.371677150e-05f, +4.707669326e-03f, -2.051775499e-03f, -5.100090562e-04f, +7.390515291e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.928298365e-05f, +3.080815738e-05f, +7.653379225e-05f, -2.362349022e-04f, +8.668310176e-05f, +4.393733119e-04f, -6.285732982e-04f, -1.859885772e-04f, +1.230289469e-03f, -8.179111777e-04f, -1.092576711e-03f, +2.056628820e-03f, -2.590571425e-04f, -2.356359075e-03f, +2.151397215e-03f, +1.027110630e-03f, -3.097867476e-03f, +1.198775712e-03f, +2.213675986e-03f, -2.683213238e-03f, -1.729143738e-04f, +2.438316371e-03f, -1.448025975e-03f, -9.944043599e-04f, +1.697639239e-03f, -3.237842138e-04f, -9.379874212e-04f, +7.345990946e-04f, +1.373938764e-04f, -4.605685252e-04f, +1.671499120e-04f, +1.115119337e-04f, -8.592942003e-05f, +1.146869604e-05f, +0.000000000e+00f,\n    /* 10,26 (36) */\n    +0.000000000e+00f, -2.523194331e-04f, -6.525245865e-04f, +1.599346190e-03f, +5.704474622e-04f, -4.475397533e-03f, +2.126456111e-03f, +7.713104721e-03f, -9.671917752e-03f, -7.563529605e-03f, +2.264296494e-02f, -2.243518239e-03f, -3.799352014e-02f, +3.028336865e-02f, +4.766671363e-02f, -9.518730587e-02f, -3.089652464e-02f, +3.882061709e-01f, +5.721009440e-01f, +2.174539537e-01f, -1.065662854e-01f, -3.867646963e-02f, +6.393603053e-02f, -4.225995840e-03f, -3.403696320e-02f, +1.582041557e-02f, +1.325650746e-02f, -1.407561709e-02f, -1.902917392e-03f, +8.154902609e-03f, -2.005357265e-03f, -3.125657959e-03f, +1.895266444e-03f, +5.959384762e-04f, -7.505202251e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.875354420e-05f, -2.708541354e-05f, -7.374245794e-05f, +1.528007835e-04f, +4.646933020e-05f, -3.795648824e-04f, +2.019316964e-04f, +5.855633017e-04f, -8.021969079e-04f, -4.817556115e-04f, +1.748595268e-03f, -3.611980788e-04f, -2.841764127e-03f, +2.587996928e-03f, +3.917852994e-03f, -8.830546986e-03f, -1.342917682e-02f, +3.532976323e-03f, +1.454119011e-02f, +3.734215656e-03f, -5.173912764e-03f, -1.258445563e-04f, +2.736986459e-03f, -9.612362918e-04f, -1.184833580e-03f, +1.017634902e-03f, +2.655741250e-04f, -6.654578295e-04f, +1.193000958e-04f, +2.901250602e-04f, -1.659274605e-04f, -6.476024872e-05f, +8.681515683e-05f, -8.918174004e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.523194331e-04f, +6.525245865e-04f, -2.108982257e-03f, +2.282584243e-04f, +5.488929773e-03f, -6.125699445e-03f, -5.215905376e-03f, +1.607119229e-02f, -5.515630483e-03f, -2.048137252e-02f, +2.527719883e-02f, +7.820935319e-03f, -3.944408252e-02f, +2.083834132e-02f, +3.112347402e-02f, -4.672024442e-02f, +1.136862607e-04f, +4.836099653e-02f, -3.364729716e-02f, -2.305371106e-02f, +4.578106072e-02f, -9.666231573e-03f, -3.169536184e-02f, +2.709188803e-02f, +7.425524173e-03f, -2.341413259e-02f, +8.227314721e-03f, +1.006920184e-02f, -9.955930500e-03f, -3.768517537e-04f, +4.874819238e-03f, -1.940263565e-03f, -5.959384762e-04f, +7.505202251e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.875354420e-05f, +2.708541354e-05f, +8.225054997e-05f, -2.299462057e-04f, +6.357011090e-05f, +4.528293106e-04f, -5.973649916e-04f, -2.424800867e-04f, +1.233426639e-03f, -7.327991633e-04f, -1.174189137e-03f, +2.010492361e-03f, -1.129002439e-04f, -2.419844927e-03f, +2.029081848e-03f, +1.195383927e-03f, -3.094784748e-03f, +1.022048699e-03f, +2.340623620e-03f, -2.606874067e-03f, -3.418817327e-04f, +2.488525914e-03f, -1.342052330e-03f, -1.103769857e-03f, +1.688692430e-03f, -2.406772698e-04f, -9.828950914e-04f, +7.093814518e-04f, +1.781085629e-04f, -4.699796753e-04f, +1.525939204e-04f, +1.232002731e-04f, -8.681515683e-05f, +8.918174004e-06f, +0.000000000e+00f,\n    /* 10,27 (36) */\n    +0.000000000e+00f, -2.235658889e-04f, -6.796100001e-04f, +1.525603732e-03f, +7.232482457e-04f, -4.428928203e-03f, +1.746891229e-03f, +7.915036418e-03f, -9.086354450e-03f, -8.365726513e-03f, +2.216120933e-02f, -4.949229710e-04f, -3.835471822e-02f, +2.744160453e-02f, +5.025471055e-02f, -9.126945287e-02f, -3.972707162e-02f, +3.747769941e-01f, +5.756339203e-01f, +2.319951438e-01f, -1.028320697e-01f, -4.385038239e-02f, +6.381018598e-02f, -1.489009381e-03f, -3.499819949e-02f, +1.463558199e-02f, +1.427414236e-02f, -1.381004296e-02f, -2.568375222e-03f, +8.274202705e-03f, -1.715232205e-03f, -3.291585419e-03f, +1.830506195e-03f, +6.827536331e-04f, -7.594383991e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.811445097e-05f, -2.339563256e-05f, -7.679548794e-05f, +1.459479235e-04f, +6.056366392e-05f, -3.769798469e-04f, +1.709968175e-04f, +6.048831993e-04f, -7.596056841e-04f, -5.473355139e-04f, +1.720194238e-03f, -2.274785910e-04f, -2.880718331e-03f, +2.368950490e-03f, +4.121391341e-03f, -8.388469819e-03f, -1.366307007e-02f, +2.900497611e-03f, +1.457291283e-02f, +4.201934253e-03f, -5.148010231e-03f, -3.438028954e-04f, +2.791969079e-03f, -8.597114582e-04f, -1.255237391e-03f, +9.873525818e-04f, +3.177528972e-04f, -6.699394056e-04f, +9.322986019e-05f, +3.030127815e-04f, -1.586466923e-04f, -7.338460892e-05f, +8.738885041e-05f, -6.219625487e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.235658889e-04f, +6.796100001e-04f, -2.026731707e-03f, -1.687781361e-06f, +5.552499883e-03f, -5.672870134e-03f, -5.813270367e-03f, +1.582871220e-02f, -4.282203844e-03f, -2.121417168e-02f, +2.410300969e-02f, +9.831427680e-03f, -3.955698276e-02f, +1.841849639e-02f, +3.315255587e-02f, -4.552486049e-02f, -2.981098487e-03f, +4.938304523e-02f, -3.130667354e-02f, -2.566058512e-02f, +4.543917899e-02f, -7.177705658e-03f, -3.303741417e-02f, +2.598811818e-02f, +9.114216603e-03f, -2.365480986e-02f, +7.244419629e-03f, +1.077858329e-02f, -9.777821937e-03f, -8.468314290e-04f, +5.027413158e-03f, -1.817063292e-03f, -6.827536331e-04f, +7.594383991e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.811445097e-05f, +2.339563256e-05f, +8.741141862e-05f, -2.229109352e-04f, +4.078411243e-05f, +4.642513548e-04f, -5.644605407e-04f, -2.971496820e-04f, +1.231892916e-03f, -6.459645926e-04f, -1.250603378e-03f, +1.957278847e-03f, +3.266778794e-05f, -2.474024768e-03f, +1.899737561e-03f, +1.358806323e-03f, -3.080248590e-03f, +8.414939287e-04f, +2.459099157e-03f, -2.520625783e-03f, -5.103309886e-04f, +2.529757947e-03f, -1.230269716e-03f, -1.209991291e-03f, +1.673287075e-03f, -1.556007156e-04f, -1.024718709e-03f, +6.810005888e-04f, +2.189374102e-04f, -4.777440308e-04f, +1.370225164e-04f, +1.347433312e-04f, -8.738885041e-05f, +6.219625487e-06f, +0.000000000e+00f,\n    /* 10,28 (36) */\n    +0.000000000e+00f, -1.954514380e-04f, -7.030056326e-04f, +1.448808244e-03f, +8.691961692e-04f, -4.368364539e-03f, +1.369911382e-03f, +8.086033235e-03f, -8.481471251e-03f, -9.125332197e-03f, +2.161387382e-02f, +1.225271268e-03f, -3.858219681e-02f, +2.456088620e-02f, +5.262366104e-02f, -8.714806153e-02f, -4.811554144e-02f, +3.611139240e-01f, +5.785344179e-01f, +2.465680566e-01f, -9.863013548e-02f, -4.899839262e-02f, +6.346638308e-02f, +1.302959698e-03f, -3.585791095e-02f, +1.338034460e-02f, +1.526149494e-02f, -1.349229007e-02f, -3.238314627e-03f, +8.367432565e-03f, -1.412219424e-03f, -3.450232112e-03f, +1.757121586e-03f, +7.701424835e-04f, -7.656580246e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.737325389e-05f, -1.975300466e-05f, -7.946299958e-05f, +1.387578968e-04f, +7.409854095e-05f, -3.731445150e-04f, +1.401075016e-04f, +6.217782838e-04f, -7.152190423e-04f, -6.099398339e-04f, +1.686548354e-03f, -9.532349545e-05f, -2.909538260e-03f, +2.146743094e-03f, +4.307133336e-03f, -7.938758087e-03f, -1.387078132e-02f, +2.262104276e-03f, +1.457844287e-02f, +4.672080105e-03f, -5.104944408e-03f, -5.649797821e-04f, +2.838621625e-03f, -7.535106118e-04f, -1.322606356e-03f, +9.531535107e-04f, +3.698094587e-04f, -6.721815354e-04f, +6.627588767e-05f, +3.151215343e-04f, -1.505998611e-04f, -8.198878583e-05f, +8.763798329e-05f, -3.379445362e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.954514380e-04f, +7.030056326e-04f, -1.939320288e-03f, -2.245987165e-04f, +5.593283996e-03f, -5.208618780e-03f, -6.377730908e-03f, +1.553156252e-02f, -3.050310928e-03f, -2.186013627e-02f, +2.285240631e-02f, +1.178870653e-02f, -3.952431497e-02f, +1.594447162e-02f, +3.505229343e-02f, -4.416605417e-02f, -6.061347078e-03f, +5.022453916e-02f, -2.884757439e-02f, -2.818121091e-02f, +4.492884800e-02f, -4.647947712e-03f, -3.426768389e-02f, +2.477812689e-02f, +1.078750368e-02f, -2.381041058e-02f, +6.219700920e-03f, +1.145958388e-02f, -9.558884527e-03f, -1.324575460e-03f, +5.164435675e-03f, -1.682319961e-03f, -7.701424835e-04f, +7.656580246e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.737325389e-05f, +1.975300466e-05f, +9.201197506e-05f, -2.151795872e-04f, +1.840916351e-05f, +4.736370068e-04f, -5.300186960e-04f, -3.498160386e-04f, +1.225758205e-03f, -5.577571095e-04f, -1.321583081e-03f, +1.897248067e-03f, +1.771042394e-04f, -2.518745368e-03f, +1.763876605e-03f, +1.516778097e-03f, -3.054326685e-03f, +6.577871599e-04f, +2.568644751e-03f, -2.424762866e-03f, -6.776258297e-04f, +2.561804269e-03f, -1.113058466e-03f, -1.312636598e-03f, +1.651412983e-03f, -6.885707847e-05f, -1.063251170e-03f, +6.495145785e-04f, +2.597202162e-04f, -4.837931722e-04f, +1.204743522e-04f, +1.460861484e-04f, -8.763798329e-05f, +3.379445362e-06f, +0.000000000e+00f,\n    /* 10,29 (36) */\n    +0.000000000e+00f, -1.680781841e-04f, -7.227586373e-04f, +1.369345244e-03f, +1.007954066e-03f, -4.294265998e-03f, +9.967668667e-04f, +8.226140737e-03f, -7.859692967e-03f, -9.840551239e-03f, +2.100393398e-02f, +2.911819621e-03f, -3.867752031e-02f, +2.165134794e-02f, +5.477040414e-02f, -8.284092820e-02f, -5.605429953e-02f, +3.472431427e-01f, +5.807965222e-01f, +2.611464995e-01f, -9.395805537e-02f, -5.410333703e-02f, +6.290140330e-02f, +4.141581323e-03f, -3.661142156e-02f, +1.205773824e-02f, +1.621464846e-02f, -1.312248061e-02f, -3.910496163e-03f, +8.433708453e-03f, -1.097097889e-03f, -3.600831973e-03f, +1.675132800e-03f, +8.577804668e-04f, -7.690374700e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.653772083e-05f, -1.617106558e-05f, -8.174639255e-05f, +1.312663145e-04f, +8.703871292e-05f, -3.680996854e-04f, +1.093701351e-04f, +6.362361767e-04f, -6.692198707e-04f, -6.694089971e-04f, +1.647858294e-03f, +3.485957021e-05f, -2.928311885e-03f, +1.922127813e-03f, +4.474956746e-03f, -7.482542598e-03f, -1.405205896e-02f, +1.619095412e-03f, +1.455753372e-02f, +5.143574865e-03f, -5.044459890e-03f, -7.887284655e-04f, +2.876641169e-03f, -6.429094186e-04f, -1.386659325e-03f, +9.150860880e-04f, +4.215609389e-04f, -6.721327113e-04f, +3.851558106e-05f, +3.263896975e-04f, -1.417974878e-04f, -9.053917835e-05f, +8.755099897e-05f, -4.048843568e-07f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.680781841e-04f, +7.227586373e-04f, -1.847308313e-03f, -4.397783037e-04f, +5.611693159e-03f, -4.734981773e-03f, -6.907749604e-03f, +1.518174648e-02f, -1.824552723e-03f, -2.241789338e-02f, +2.153082323e-02f, +1.368595459e-02f, -3.934721073e-02f, +1.342572625e-02f, +3.681617003e-02f, -4.264927607e-02f, -9.115673763e-03f, +5.088232632e-02f, -2.627892964e-02f, -3.060597377e-02f, +4.425122217e-02f, -2.086143442e-03f, -3.538074236e-02f, +2.346549029e-02f, +1.243891666e-02f, -2.387926765e-02f, +5.156449751e-03f, +1.210909846e-02f, -9.299164310e-03f, -1.808368632e-03f, +5.284910027e-03f, -1.536233813e-03f, -8.577804668e-04f, +7.690374700e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.653772083e-05f, +1.617106558e-05f, +9.605047892e-05f, -2.068042874e-04f, -3.474341315e-06f, +4.809920841e-04f, -4.942014676e-04f, -4.003084851e-04f, +1.215109297e-03f, -4.685275682e-04f, -1.386915047e-03f, +1.830683648e-03f, +3.198743867e-04f, -2.553890217e-03f, +1.622033927e-03f, +1.668721691e-03f, -3.017129766e-03f, +4.716162238e-04f, +2.668835727e-03f, -2.319617192e-03f, -8.431315882e-04f, +2.584490563e-03f, -9.908224858e-04f, -1.411283666e-03f, +1.623084914e-03f, +1.924088598e-05f, -1.098295382e-03f, +6.149948290e-04f, +3.002939445e-04f, -4.880643032e-04f, +1.029932155e-04f, +1.571730812e-04f, -8.755099897e-05f, +4.048843568e-07f, +0.000000000e+00f,\n    /* 10,30 (36) */\n    +0.000000000e+00f, -1.415404632e-04f, -7.389297029e-04f, +1.287598852e-03f, +1.139220381e-03f, -4.207227285e-03f, +6.286671812e-04f, +8.335510872e-03f, -7.223456790e-03f, -1.050977111e-02f, +2.033452499e-02f, +4.559677915e-03f, -3.864266074e-02f, +1.872303605e-02f, +5.669253195e-02f, -7.836597145e-02f, -6.353684213e-02f, +3.331910838e-01f, +5.824156176e-01f, +2.757040332e-01f, -8.881448051e-02f, -5.914779692e-02f, +6.211267483e-02f, +7.018222492e-03f, -3.725433098e-02f, +1.067107892e-02f, +1.712973454e-02f, -1.270091967e-02f, -4.582628874e-03f, +8.472224034e-03f, -7.707081919e-04f, -3.742629460e-03f, +1.584593622e-03f, +9.453314657e-04f, -7.694423543e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.561579456e-05f, -1.266265802e-05f, -8.364854408e-05f, +1.235090111e-04f, +9.935192578e-05f, -3.618896117e-04f, +7.888847102e-05f, +6.482531711e-04f, -6.217933644e-04f, -7.255967097e-04f, +1.604338211e-03f, +1.626761686e-04f, -2.937157559e-03f, +1.695851340e-03f, +4.624788907e-03f, -7.020957778e-03f, -1.420671412e-02f, +9.727815458e-04f, +1.450999957e-02f, +5.615323730e-03f, -4.966345222e-03f, -1.014382450e-03f, +2.905747658e-03f, -5.282028638e-04f, -1.447121671e-03f, +8.732128755e-04f, +4.728222327e-04f, -6.697485541e-04f, +1.003082804e-05f, +3.367573684e-04f, -1.322531958e-04f, -9.900148872e-05f, +8.711737723e-05f, +2.695957155e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.415404632e-04f, +7.389297029e-04f, -1.751257834e-03f, -6.465825911e-04f, +5.608218818e-03f, -4.253989689e-03f, -7.401951071e-03f, +1.478143799e-02f, -6.094434262e-04f, -2.288642095e-02f, +2.014390818e-02f, +1.551663824e-02f, -3.902733634e-02f, +1.087183604e-02f, +3.843820396e-02f, -4.098055438e-02f, -1.213280353e-02f, +5.135394254e-02f, -2.361009391e-02f, -3.292559096e-02f, +4.340809058e-02f, +4.983471210e-04f, -3.637156484e-02f, +2.205420662e-02f, +1.406200157e-02f, -2.386002677e-02f, +4.058154368e-03f, +1.272409329e-02f, -8.998870366e-03f, -2.296432935e-03f, +5.387903242e-03f, -1.379060731e-03f, -9.453314657e-04f, +7.694423543e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.561579456e-05f, +1.266265802e-05f, +9.952780372e-05f, -1.978385212e-04f, -2.478992676e-05f, +4.863304728e-04f, -4.571734157e-04f, -4.484675188e-04f, +1.200049301e-03f, -3.786266502e-04f, -1.446409830e-03f, +1.757891766e-03f, +4.604535010e-04f, -2.579379779e-03f, +1.474765034e-03f, +1.814083871e-03f, -2.968811143e-03f, +2.836783930e-04f, +2.759282259e-03f, -2.205556864e-03f, -1.006217692e-03f, +2.597677261e-03f, -8.639878579e-04f, -1.505522069e-03f, +1.588342783e-03f, +1.083713075e-04f, -1.129665192e-03f, +5.775260078e-04f, +3.404933445e-04f, -4.905006326e-04f, +8.462796079e-05f, +1.679480372e-04f, -8.711737723e-05f, -2.695957155e-06f, +0.000000000e+00f,\n    /* 10,31 (36) */\n    +0.000000000e+00f, -1.159246687e-04f, -7.515923609e-04f, +1.203950308e-03f, +1.262729392e-03f, -4.107875360e-03f, +2.667775696e-04f, +8.414399343e-03f, -6.575203619e-03f, -1.113156447e-02f, +1.960892828e-02f, +6.164016126e-03f, -3.847998457e-02f, +1.578587849e-02f, +5.838838329e-02f, -7.374118254e-02f, -7.055779991e-02f, +3.189843696e-01f, +5.833883991e-01f, +2.902140328e-01f, -8.319915678e-02f, -6.411414215e-02f, +6.109829238e-02f, +9.923970151e-03f, -3.778253385e-02f, +9.223957244e-03f, +1.800294742e-02f, -1.222809744e-02f, -5.252377428e-03f, +8.482254862e-03f, -4.339508234e-04f, -3.874882656e-03f, +1.485592133e-03f, +1.032448843e-03f, -7.667463972e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.461555001e-05f, -9.239896990e-06f, -8.517375766e-05f, +1.155219012e-04f, +1.110089722e-04f, -3.545617704e-04f, +4.876331166e-05f, +6.578340876e-04f, -5.731263495e-04f, -7.783702355e-04f, +1.556214796e-03f, +2.877461347e-04f, -2.936223164e-03f, +1.468651897e-03f, +4.756606318e-03f, -6.555138706e-03f, -1.433462083e-02f, +3.244813960e-04f, +1.443571605e-02f, +6.086218167e-03f, -4.870434080e-03f, -1.241257195e-03f, +2.925685177e-03f, -4.097045852e-04f, -1.503726322e-03f, +8.276106219e-04f, +5.234066115e-04f, -6.649921034e-04f, -1.909220717e-05f, +3.461666226e-04f, -1.219837312e-04f, -1.073408404e-04f, +8.632770721e-05f, +5.914139316e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.159246687e-04f, +7.515923609e-04f, -1.651730030e-03f, -8.444211122e-04f, +5.583428891e-03f, -3.767659216e-03f, -7.859124487e-03f, +1.433297048e-02f, +5.906058744e-04f, -2.326504760e-02f, +1.869749835e-02f, +1.727453001e-02f, -3.856688284e-02f, +8.292456257e-03f, +3.991296900e-02f, -3.916647051e-02f, -1.510161467e-02f, +5.163762093e-02f, -2.085081165e-02f, -3.513114783e-02f, +4.240187289e-02f, +3.096024382e-03f, -3.723555270e-02f, +2.054868455e-02f, +1.565034436e-02f, -2.375165546e-02f, +2.928489176e-03f, +1.330161930e-02f, -8.658377021e-03f, -2.786933568e-03f, +5.472531203e-03f, -1.211112694e-03f, -1.032448843e-03f, +7.667463972e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.461555001e-05f, +9.239896990e-06f, +1.024473576e-04f, -1.883368647e-04f, -4.546527100e-05f, +4.896739099e-04f, -4.191009431e-04f, -4.941452697e-04f, +1.180697021e-03f, -2.884034970e-04f, -1.499902243e-03f, +1.679199776e-03f, +5.983288007e-04f, -2.595171601e-03f, +1.322643785e-03f, +1.952337783e-03f, -2.909566064e-03f, +9.467771006e-05f, +2.839630915e-03f, -2.082984900e-03f, -1.166260110e-03f, +2.601260275e-03f, -7.330013445e-04f, -1.594954770e-03f, +1.547251752e-03f, +1.982043651e-04f, -1.157186281e-03f, +5.372059098e-04f, +3.801515912e-04f, -4.910517381e-04f, +6.543241704e-05f, +1.783547172e-04f, -8.632770721e-05f, -5.914139316e-06f, +0.000000000e+00f,\n    /* 11, 0 (32) */\n    +0.000000000e+00f, +3.454933159e-04f, +1.541097233e-03f, -3.365769507e-03f, +1.849372243e-04f, +7.921455674e-03f, -9.933387929e-03f, -4.722893055e-03f, +2.491782703e-02f, -1.923850865e-02f, -2.511889872e-02f, +6.555431985e-02f, -2.774896345e-02f, -1.143270713e-01f, +2.866385681e-01f, +6.354451792e-01f, +2.866385681e-01f, -1.143270713e-01f, -2.774896345e-02f, +6.555431985e-02f, -2.511889872e-02f, -1.923850865e-02f, +2.491782703e-02f, -4.722893055e-03f, -9.933387929e-03f, +7.921455674e-03f, +1.849372243e-04f, -3.365769507e-03f, +1.541097233e-03f, +3.454933159e-04f, -4.305061225e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.101387684e-05f, +5.655131412e-05f, +1.448851155e-04f, -3.610593840e-04f, +1.277861936e-04f, +6.337796691e-04f, -1.025814987e-03f, -4.352543003e-05f, +2.004659355e-03f, -2.192683832e-03f, -1.360003080e-03f, +6.036694190e-03f, -4.003233266e-03f, -1.727534696e-02f, -4.191591060e-04f, +1.724418689e-02f, +4.602800923e-03f, -6.079250102e-03f, +1.126519703e-03f, +2.337894363e-03f, -1.966945911e-03f, -5.631255252e-05f, +1.066773732e-03f, -6.075706714e-04f, -1.636888179e-04f, +3.703376314e-04f, -1.351121395e-04f, -6.554370115e-05f, +7.281496347e-05f, -1.727359999e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.454933159e-04f, -1.287417451e-03f, +5.082890229e-03f, -4.452826306e-03f, -5.152110347e-03f, +1.588482173e-02f, -1.131295515e-02f, -1.199676363e-02f, +3.147222030e-02f, -1.942348993e-02f, -1.990214054e-02f, +4.584722208e-02f, -2.506967236e-02f, -2.523864421e-02f, +5.173229864e-02f, -2.523864421e-02f, -2.506967236e-02f, +4.584722208e-02f, -1.990214054e-02f, -1.942348993e-02f, +3.147222030e-02f, -1.199676363e-02f, -1.131295515e-02f, +1.588482173e-02f, -5.152110347e-03f, -4.452826306e-03f, +5.082890229e-03f, -1.287417451e-03f, -7.762310022e-04f, +4.305061225e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.101387684e-05f, -1.418209216e-04f, -6.562212109e-05f, +4.928895181e-04f, -6.050820446e-04f, -1.179125761e-04f, +1.239577499e-03f, -1.396234898e-03f, -1.564208422e-04f, +2.155328008e-03f, -2.269433978e-03f, -1.561627150e-04f, +2.839407163e-03f, -2.815838079e-03f, -1.107507574e-04f, +2.928700180e-03f, -2.741319471e-03f, -4.020126626e-05f, +2.370842601e-03f, -2.090262312e-03f, +2.150884940e-05f, +1.466738437e-03f, -1.209113201e-03f, +4.975225277e-05f, +6.412573280e-04f, -4.853095666e-04f, +4.385512737e-05f, +1.537652081e-04f, -1.002695547e-04f, +1.727359999e-05f, +0.000000000e+00f,\n    /* 11, 1 (32) */\n    +0.000000000e+00f, +2.744794391e-04f, +1.597648547e-03f, -3.220884391e-03f, -1.761221597e-04f, +8.049241867e-03f, -9.299608260e-03f, -5.748708042e-03f, +2.487430160e-02f, -1.723384929e-02f, -2.731158255e-02f, +6.419431677e-02f, -2.171226926e-02f, -1.183303046e-01f, +2.693632211e-01f, +6.350260201e-01f, +3.038827550e-01f, -1.097242704e-01f, -3.382821355e-02f, +6.668083955e-02f, -2.278100435e-02f, -2.120545456e-02f, +2.486151448e-02f, -3.656119323e-03f, -1.054095860e-02f, +7.757766856e-03f, +5.552748558e-04f, -3.500881646e-03f, +1.475553532e-03f, +4.183082794e-04f, -4.477797225e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.894654851e-05f, +4.762523496e-05f, +1.537432642e-04f, -3.505241726e-04f, +9.222254628e-05f, +6.568429598e-04f, -9.815841830e-04f, -1.412211116e-04f, +2.033724933e-03f, -2.041759800e-03f, -1.583294811e-03f, +5.972562914e-03f, -3.409766865e-03f, -1.726928183e-02f, -1.256459939e-03f, +1.717552527e-02f, +5.206873907e-03f, -6.099553942e-03f, +8.835284387e-04f, +2.476704058e-03f, -1.920567935e-03f, -1.579283810e-04f, +1.104223360e-03f, -5.782559362e-04f, -1.997856523e-04f, +3.782849447e-04f, -1.244408611e-04f, -7.456199901e-05f, +7.432951012e-05f, -1.587925964e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.744794391e-04f, -1.429238372e-03f, +5.017268108e-03f, -3.959936788e-03f, -5.757192392e-03f, +1.576690915e-02f, -1.007337765e-02f, -1.339299853e-02f, +3.131579945e-02f, -1.726816192e-02f, -2.217157452e-02f, +4.569105936e-02f, -2.223026519e-02f, -2.805448229e-02f, +5.162154789e-02f, -2.230994403e-02f, -2.781099183e-02f, +4.580702081e-02f, -1.753129794e-02f, -2.151375224e-02f, +3.149372914e-02f, -1.053002519e-02f, -1.252206835e-02f, +1.593457398e-02f, -4.510853019e-03f, -4.938135872e-03f, +5.126745357e-03f, -1.133652243e-03f, -8.765005569e-04f, +4.477797225e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.894654851e-05f, -1.296007205e-04f, -8.643911408e-05f, +4.980291667e-04f, -5.669451485e-04f, -1.843390432e-04f, +1.264126917e-03f, -1.320520896e-03f, -2.892181057e-04f, +2.210463330e-03f, -2.158870932e-03f, -3.508593867e-04f, +2.924870034e-03f, -2.690969630e-03f, -3.317666361e-04f, +3.029040832e-03f, -2.630996745e-03f, -2.373751464e-04f, +2.462586420e-03f, -2.015469923e-03f, -1.149374980e-04f, +1.531648112e-03f, -1.172783428e-03f, -1.985905989e-05f, +6.752609872e-04f, -4.752661866e-04f, +2.121927248e-05f, +1.653604951e-04f, -1.007616128e-04f, +1.587925964e-05f, +0.000000000e+00f,\n    /* 11, 2 (32) */\n    +0.000000000e+00f, +2.055328905e-04f, +1.645273782e-03f, -3.067141127e-03f, -5.266463322e-04f, +8.141464414e-03f, -8.642765300e-03f, -6.730292225e-03f, +2.473308049e-02f, -1.520012436e-02f, -2.935334235e-02f, +6.261102195e-02f, -1.573970634e-02f, -1.217400715e-01f, +2.520939393e-01f, +6.337695601e-01f, +3.210582802e-01f, -1.045173965e-01f, -3.992776749e-02f, +6.756436799e-02f, -2.030430029e-02f, -2.312602249e-02f, +2.470358610e-02f, -2.551895963e-03f, -1.111921454e-02f, +7.557981204e-03f, +9.335598005e-04f, -3.625322507e-03f, +1.400991533e-03f, +4.926377895e-04f, -4.636589821e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.663390283e-05f, +3.880427232e-05f, +1.616746057e-04f, -3.388095256e-04f, +5.713788228e-05f, +6.767344434e-04f, -9.343269739e-04f, -2.364255892e-04f, +2.054193084e-03f, -1.885818684e-03f, -1.795762098e-03f, +5.887591478e-03f, -2.823957673e-03f, -1.722636945e-02f, -2.090711636e-03f, +1.706918873e-02f, +5.813820907e-03f, -6.096990672e-03f, +6.317624037e-04f, +2.608437499e-03f, -1.865543218e-03f, -2.609432477e-04f, +1.137936565e-03f, -5.458894262e-04f, -2.359276916e-04f, +3.848313325e-04f, -1.128923987e-04f, -8.356437160e-05f, +7.553797284e-05f, -1.430408636e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.055328905e-04f, -1.558839093e-03f, +4.930828994e-03f, -3.461907621e-03f, -6.324137540e-03f, +1.558257011e-02f, -8.809250736e-03f, -1.471351943e-02f, +3.102658135e-02f, -1.505769859e-02f, -2.433044545e-02f, +4.534019998e-02f, -1.930539516e-02f, -3.074545192e-02f, +5.128978125e-02f, -1.928090320e-02f, -3.044198857e-02f, +4.556964567e-02f, -1.506871152e-02f, -2.352922217e-02f, +3.137879165e-02f, -8.998377082e-03f, -1.369485178e-02f, +1.591471492e-02f, -3.835592032e-03f, -5.413402059e-03f, +5.147964629e-03f, -9.682917474e-04f, -9.772621697e-04f, +4.636589821e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.663390283e-05f, -1.171768659e-04f, -1.062318554e-04f, +5.007627948e-04f, -5.270616700e-04f, -2.487615761e-04f, +1.282739667e-03f, -1.239998590e-03f, -4.193357355e-04f, +2.255510631e-03f, -2.039701187e-03f, -5.430429681e-04f, +2.997375566e-03f, -2.554662325e-03f, -5.513277849e-04f, +3.116399721e-03f, -2.508884473e-03f, -4.344936997e-04f, +2.544194950e-03f, -1.931200014e-03f, -2.523248602e-04f, +1.590601295e-03f, -1.130665368e-03f, -9.062683597e-05f, +7.068891457e-04f, -4.627477756e-04f, -2.197657769e-06f, +1.765332510e-04f, -1.006917880e-04f, +1.430408636e-05f, +0.000000000e+00f,\n    /* 11, 3 (32) */\n    +0.000000000e+00f, +1.388989877e-04f, +1.684078054e-03f, -2.905466521e-03f, -8.654558578e-04f, +8.198602296e-03f, -7.966030856e-03f, -7.664619199e-03f, +2.449665490e-02f, -1.314593127e-02f, -3.123916103e-02f, +6.081525986e-02f, -9.852114863e-03f, -1.245640291e-01f, +2.348675698e-01f, +6.316788485e-01f, +3.381274690e-01f, -9.870357560e-02f, -4.602475816e-02f, +6.819613039e-02f, -1.769586280e-02f, -2.499156571e-02f, +2.444264285e-02f, -1.413959398e-03f, -1.166510396e-02f, +7.322053512e-03f, +1.318391133e-03f, -3.738214906e-03f, +1.317427161e-03f, +5.681757623e-04f, -4.779630685e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.409736252e-05f, +3.012550886e-05f, +1.686716379e-04f, -3.259961039e-04f, +2.266695685e-05f, +6.934417111e-04f, -8.842964323e-04f, -3.288066269e-04f, +2.066147209e-03f, -1.725563159e-03f, -1.996824487e-03f, +5.782570238e-03f, -2.247317239e-03f, -1.714708762e-02f, -2.919891436e-03f, +1.692510800e-02f, +6.421979990e-03f, -6.071009941e-03f, +3.720022736e-04f, +2.732434021e-03f, -1.801924571e-03f, -3.649652725e-04f, +1.167696943e-03f, -5.105391625e-04f, -2.719622451e-04f, +3.899111944e-04f, -1.004924917e-04f, -9.250770446e-05f, +7.642169036e-05f, -1.254897547e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.388989877e-04f, -1.676015959e-03f, +4.824597139e-03f, -2.961144826e-03f, -6.851199210e-03f, +1.533380853e-02f, -7.526511069e-03f, -1.595351802e-02f, +3.060724561e-02f, -1.280218796e-02f, -2.637014664e-02f, +4.479715701e-02f, -1.630801959e-02f, -3.330011425e-02f, +5.073845346e-02f, -1.616450348e-02f, -3.295087304e-02f, +4.513515197e-02f, -1.252451657e-02f, -2.546042218e-02f, +3.112646679e-02f, -7.407775787e-03f, -1.482551715e-02f, +1.582408808e-02f, -3.128702886e-03f, -5.876149835e-03f, +5.145766972e-03f, -7.917584964e-04f, -1.077953958e-03f, +4.779630685e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.409736252e-05f, -1.046204324e-04f, -1.249331840e-04f, +5.011354274e-04f, -4.856505384e-04f, -3.109239366e-04f, +1.295421288e-03f, -1.155086836e-03f, -5.462267062e-04f, +2.290358631e-03f, -1.912507091e-03f, -7.318830510e-04f, +3.056649812e-03f, -2.407533414e-03f, -7.684716360e-04f, +3.190373477e-03f, -2.375482011e-03f, -6.306877531e-04f, +2.615239996e-03f, -1.837746491e-03f, -3.900495221e-04f, +1.643258051e-03f, -1.082864033e-03f, -1.622460947e-04f, +7.359451690e-04f, -4.477545695e-04f, -2.630151461e-05f, +1.872098875e-04f, -1.000372204e-04f, +1.254897547e-05f, +0.000000000e+00f,\n    /* 11, 4 (32) */\n    +0.000000000e+00f, +7.480162519e-05f, +1.714203563e-03f, -2.736794883e-03f, -1.191451962e-03f, +8.221269253e-03f, -7.272589145e-03f, -8.548915631e-03f, +2.416784827e-02f, -1.107978407e-02f, -3.296472419e-02f, +5.881843537e-02f, -4.069544625e-03f, -1.268113464e-01f, +2.177204822e-01f, +6.287589571e-01f, +3.550525770e-01f, -9.228159561e-02f, -5.209576810e-02f, +6.856813267e-02f, -1.496342877e-02f, -2.679349028e-02f, +2.407767758e-02f, -2.462624541e-04f, -1.217564313e-02f, +7.050091267e-03f, +1.708302327e-03f, -3.838707398e-03f, +1.224919457e-03f, +6.445974527e-04f, -4.905120440e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.135872231e-05f, +2.162417585e-05f, +1.747312493e-04f, -3.121672704e-04f, -1.106118323e-05f, +7.069658116e-04f, -8.317518661e-04f, -4.180496835e-04f, +2.069702749e-03f, -1.561699363e-03f, -2.185955052e-03f, +5.658341220e-03f, -1.681308471e-03f, -1.703201199e-02f, -3.741991540e-03f, +1.674331867e-02f, +7.029663496e-03f, -6.021128903e-03f, +1.050742777e-04f, +2.848050543e-03f, -1.729800256e-03f, -4.695908602e-04f, +1.193300107e-03f, -4.722872316e-04f, -3.077335173e-04f, +3.934637232e-04f, -8.727150786e-05f, -1.013477763e-04f, +7.696301166e-05f, -1.061593068e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.480162519e-05f, -1.780636391e-03f, +4.699663955e-03f, -2.460009399e-03f, -7.336849749e-03f, +1.502288459e-02f, -6.231089781e-03f, -1.710860485e-02f, +3.006101891e-02f, -1.051182933e-02f, -2.828265373e-02f, +4.406527396e-02f, -1.325136978e-02f, -3.570764766e-02f, +4.996998183e-02f, -1.297413000e-02f, -3.532635506e-02f, +4.450446421e-02f, -9.909276578e-03f, -2.729816867e-02f, +3.073641726e-02f, -5.764517736e-03f, -1.590838118e-02f, +1.566184199e-02f, -2.392757717e-03f, -6.323904404e-03f, +5.119465457e-03f, -6.045486089e-04f, -1.177991178e-03f, +4.905120440e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.135872231e-05f, -9.200096162e-05f, -1.424831887e-04f, +4.992023741e-04f, -4.429334640e-04f, -3.705846943e-04f, +1.302204225e-03f, -1.066219067e-03f, -6.693641742e-04f, +2.314942528e-03f, -1.777902771e-03f, -9.165682554e-04f, +3.102478442e-03f, -2.250247059e-03f, -9.822464652e-04f, +3.250617563e-03f, -2.231340502e-03f, -8.250880908e-04f, +2.675337866e-03f, -1.735447020e-03f, -5.275000579e-04f, +1.689302989e-03f, -1.029512157e-03f, -2.344026744e-04f, +7.622407565e-04f, -4.302989061e-04f, -5.099210984e-05f, +1.973171607e-04f, -9.877768243e-05f, +1.061593068e-05f, +0.000000000e+00f,\n    /* 11, 5 (32) */\n    +0.000000000e+00f, +1.344290287e-05f, +1.735827739e-03f, -2.562063634e-03f, -1.503619232e-03f, +8.210208070e-03f, -6.565623334e-03f, -9.380667497e-03f, +2.374979859e-02f, -9.010081316e-03f, -3.452642355e-02f, +5.663248032e-02f, +1.588796594e-03f, -1.284926549e-01f, +2.006884702e-01f, +6.250169655e-01f, +3.717958956e-01f, -8.525193212e-02f, -5.811689701e-02f, +6.867320694e-02f, -1.211537823e-02f, -2.852329054e-02f, +2.360808672e-02f, +9.470376524e-04f, -1.264793036e-02f, +6.742357750e-03f, +2.101766051e-03f, -3.925978906e-03f, +1.123571680e-03f, +7.215604643e-04f, -5.011279746e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.844002441e-05f, +1.333354016e-05f, +1.798546151e-04f, -2.974086587e-04f, -4.392362233e-05f, +7.173209664e-04f, -7.769576327e-04f, -5.038588502e-04f, +2.065006149e-03f, -1.394934129e-03f, -2.362681358e-03f, +5.515794497e-03f, -1.127341589e-03f, -1.688181373e-02f, -4.555025022e-03f, +1.652396156e-02f, +7.635163059e-03f, -5.946934842e-03f, -1.681520007e-04f, +2.954664371e-03f, -1.649294283e-03f, -5.744061304e-04f, +1.214554775e-03f, -4.312297312e-04f, -3.430832150e-04f, +3.954332952e-04f, -7.326442817e-05f, -1.100394411e-04f, +7.714542216e-05f, -8.508092032e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.344290287e-05f, -1.872637353e-03f, +4.557180766e-03f, -1.960807025e-03f, -7.779783213e-03f, +1.465229990e-02f, -4.928885556e-03f, -1.817482392e-02f, +2.939165473e-02f, -8.196886804e-03f, -3.006055650e-02f, +4.314870570e-02f, -1.014889134e-02f, -3.795789472e-02f, +4.898773536e-02f, -9.723512442e-03f, -3.755769556e-02f, +4.367937612e-02f, -7.233938712e-03f, -2.903361569e-02f, +3.020891721e-02f, -4.075214748e-03f, -1.693789334e-02f, +1.542743931e-02f, -1.630516961e-03f, -6.754203310e-03f, +5.068473347e-03f, -4.072314483e-04f, -1.276768860e-03f, +5.011279746e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.844002441e-05f, -7.938613329e-05f, -1.588293267e-04f, +4.950287292e-04f, -3.991338273e-04f, -4.275181090e-04f, +1.303147295e-03f, -9.738411283e-04f, -7.882436644e-04f, +2.329243902e-03f, -1.636531151e-03f, -1.096309781e-03f, +3.134707495e-03f, -2.083511266e-03f, -1.191715659e-03f, +3.296847912e-03f, -2.077060559e-03f, -1.016829376e-03f, +2.724151392e-03f, -1.624681845e-03f, -6.640600564e-04f, +1.728447016e-03f, -9.707699758e-04f, -3.067745716e-04f, +7.855970127e-04f, -4.104054317e-04f, -7.616357881e-05f, +2.067825811e-04f, -9.689578485e-05f, +8.508092032e-06f, +0.000000000e+00f,\n    /* 11, 6 (32) */\n    +0.000000000e+00f, -4.499712153e-05f, +1.749161279e-03f, -2.382209019e-03f, -1.801027891e-03f, +8.166284447e-03f, -5.848302367e-03f, -1.015762513e-02f, +2.324593974e-02f, -6.945075168e-03f, -3.592135768e-02f, +5.426979896e-02f, +7.104591091e-03f, -1.296199964e-01f, +1.838066565e-01f, +6.204619405e-01f, +3.883198572e-01f, -7.761676906e-02f, -6.406383185e-02f, +6.850505494e-02f, -9.160713861e-03f, -3.017258482e-02f, +2.303368059e-02f, +2.161592427e-03f, -1.307916009e-02f, +6.399274535e-03f, +2.497199346e-03f, -3.999243334e-03f, +1.013532239e-03f, +7.987058865e-04f, -5.096360667e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.536343650e-05f, +5.284803911e-06f, +1.840470753e-04f, -2.818077408e-04f, -7.580396313e-05f, +7.245342347e-04f, -7.201819531e-04f, -5.859576958e-04f, +2.052233720e-03f, -1.225972263e-03f, -2.526586220e-03f, +5.355864460e-03f, -5.867703010e-04f, -1.669725689e-02f, -5.357031680e-03f, +1.626728294e-02f, +8.236754752e-03f, -5.848087598e-03f, -4.467660161e-04f, +3.051675980e-03f, -1.560566567e-03f, -6.789884160e-04f, +1.231283832e-03f, -3.874766561e-04f, -3.778511793e-04f, +3.957698464e-04f, -5.851081077e-05f, -1.185368192e-04f, +7.695366797e-05f, -6.229758273e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.499712153e-05f, -1.952023486e-03f, +4.398351440e-03f, -1.465778295e-03f, -8.178917040e-03f, +1.422478179e-02f, -3.625738261e-03f, -1.914866505e-02f, +2.860341107e-02f, -5.867642902e-03f, -3.169708765e-02f, +4.205239592e-02f, -7.014183843e-03f, -4.004140599e-02f, +4.779601970e-02f, -6.426664530e-03f, -3.963475612e-02f, +4.266254675e-02f, -4.509787320e-03f, -3.065829754e-02f, +2.954485715e-02f, -2.346767732e-03f, -1.790866331e-02f, +1.512066474e-02f, -8.449199480e-04f, -7.164608742e-03f, +4.992309768e-03f, -2.004488672e-04f, -1.373664645e-03f, +5.096360667e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.536343650e-05f, -6.684145543e-05f, -1.739265019e-04f, +4.886888339e-04f, -3.544755813e-04f, -4.815149239e-04f, +1.298335032e-03f, -8.784090850e-04f, -9.023851319e-04f, +2.333290406e-03f, -1.489060860e-03f, -1.270344836e-03f, +3.153243872e-03f, -1.908074638e-03f, -1.395961915e-03f, +3.328842288e-03f, -1.913289705e-03f, -1.205054076e-03f, +2.761391756e-03f, -1.505872406e-03f, -7.991108973e-04f, +1.760428988e-03f, -9.068248614e-04f, -3.790333387e-04f, +8.058454924e-04f, -3.881112511e-04f, -1.017047819e-04f, +2.155348307e-04f, -9.437717204e-05f, +6.229758273e-06f, +0.000000000e+00f,\n    /* 11, 7 (32) */\n    +0.000000000e+00f, -1.003605580e-04f, +1.754446083e-03f, -2.198161944e-03f, -2.082835632e-03f, +8.090480484e-03f, -5.123768133e-03f, -1.087780708e-02f, +2.265998204e-02f, -4.892841448e-03f, -3.714732995e-02f, +5.174321274e-02f, +1.246045555e-02f, -1.302067667e-01f, +1.671093996e-01f, +6.151049088e-01f, +4.045871401e-01f, -6.938001431e-02f, -6.991191945e-02f, +6.805828893e-02f, -6.109037881e-03f, -3.173315139e-02f, +2.235469217e-02f, +3.392876260e-03f, -1.346663674e-02f, +6.021423355e-03f, +2.892969192e-03f, -4.057754145e-03f, +8.949954200e-04f, +8.756595545e-04f, -5.158658249e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.215113274e-05f, -2.492983095e-06f, +1.873179974e-04f, -2.654533980e-04f, -1.065926770e-04f, +7.286451315e-04f, -6.616957344e-04f, -6.640900180e-04f, +2.031590404e-03f, -1.055513877e-03f, -2.677308242e-03f, +5.179525972e-03f, -6.088818554e-05f, -1.647919551e-02f, -6.146083796e-03f, +1.597363417e-02f, +8.832704308e-03f, -5.724321760e-03f, -7.298188369e-04f, +3.138511745e-03f, -1.463812955e-03f, -7.829078243e-04f, +1.243325345e-03f, -3.411517215e-04f, -4.118760385e-04f, +3.944292323e-04f, -4.305473184e-05f, -1.267934984e-04f, +7.637387715e-05f, -3.786403335e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.003605580e-04f, -2.018864941e-03f, +4.224424938e-03f, -9.770894616e-04f, -8.533392621e-03f, +1.374326687e-02f, -2.327403229e-03f, -2.002707413e-02f, +2.770102594e-02f, -3.534352496e-03f, -3.318614851e-02f, +4.078205108e-02f, -3.860939971e-03f, -4.194948063e-02f, +4.640005779e-02f, -3.097822242e-03f, -4.154804582e-02f, +4.145749267e-02f, -1.748395563e-03f, -3.216416994e-02f, +2.874574625e-02f, -5.863387437e-04f, -1.881548818e-02f, +1.474163140e-02f, -3.907445562e-05f, -7.552719993e-03f, +4.890604986e-03f, +1.508596358e-05f, -1.468041817e-03f, +5.158658249e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.215113274e-05f, -5.442997476e-05f, -1.877371019e-04f, +4.802657043e-04f, -3.091821714e-04f, -5.323830676e-04f, +1.287876920e-03f, -7.803870073e-04f, -1.011334890e-03f, +2.327155243e-03f, -1.336183052e-03f, -1.437939937e-03f, +3.158055539e-03f, -1.724722939e-03f, -1.594091349e-03f, +3.346441362e-03f, -1.740719604e-03f, -1.388916364e-03f, +2.786820098e-03f, -1.379479749e-03f, -9.320345641e-04f, +1.785017248e-03f, -8.378908291e-04f, -4.508455358e-04f, +8.228292131e-04f, -3.634660170e-04f, -1.274997434e-04f, +2.235041847e-04f, -9.121070548e-05f, +3.786403335e-06f, +0.000000000e+00f,\n    /* 11, 8 (32) */\n    +0.000000000e+00f, -1.525116908e-04f, +1.751953100e-03f, -2.010843946e-03f, -2.348289030e-03f, +7.983887807e-03f, -4.395123001e-03f, -1.153950282e-02f, +2.199589203e-02f, -2.861251044e-03f, -3.820284382e-02f, +4.906590450e-02f, +1.763998152e-02f, -1.302676549e-01f, +1.506302041e-01f, +6.089588250e-01f, +4.205607743e-01f, -6.054731000e-02f, -7.563624121e-02f, +6.732847009e-02f, -2.970526136e-03f, -3.319696434e-02f, +2.157178435e-02f, +4.636201605e-03f, -1.380778847e-02f, +5.609547317e-03f, +3.287398424e-03f, -4.100808877e-03f, +7.682019216e-04f, +9.520334316e-04f, -5.196522283e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.882517833e-05f, -9.972998001e-06f, +1.896806238e-04f, -2.484354947e-04f, -1.361874172e-04f, +7.297052001e-04f, -6.017714024e-04f, -7.380204988e-04f, +2.003308442e-03f, -8.842517829e-04f, -2.814542149e-03f, +4.987790445e-03f, +4.490746814e-04f, -1.622857046e-02f, -6.920291785e-03f, +1.564347125e-02f, +9.421272433e-03f, -5.575448640e-03f, -1.016325899e-03f, +3.214626626e-03f, -1.359265091e-03f, -8.857288567e-04f, +1.250533532e-03f, -2.923921239e-04f, -4.449958816e-04f, +3.913735697e-04f, -2.694470422e-05f, -1.347627424e-04f, +7.539367768e-05f, -1.184686737e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.525116908e-04f, -2.073294916e-03f, +4.036687836e-03f, -4.968237572e-04f, -8.842574792e-03f, +1.321088380e-02f, -1.039526309e-03f, -2.080746114e-02f, +2.668969105e-02f, -1.207197253e-03f, -3.452233157e-02f, +3.934411115e-02f, -7.028844317e-04f, -4.367420357e-02f, +4.480596644e-02f, +2.486191205e-04f, -4.328876543e-02f, +4.006857631e-02f, +1.038424535e-03f, -3.354364969e-02f, +2.781371169e-02f, +1.198678504e-03f, -1.965337901e-02f, +1.429078587e-02f, +7.837547575e-04f, -7.916186010e-03f, +4.763105243e-03f, +2.385901483e-04f, -1.559252523e-03f, +5.196522283e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.882517833e-05f, -4.221200833e-05f, -2.002309966e-04f, +4.698504283e-04f, -2.634754778e-04f, -5.799482627e-04f, +1.271906527e-03f, -6.802447451e-04f, -1.114667396e-03f, +2.310956446e-03f, -1.178608129e-03f, -1.598394050e-03f, +3.149171460e-03f, -1.534275501e-03f, -1.785237499e-03f, +3.349549514e-03f, -1.560083072e-03f, -1.567585990e-03f, +2.800248911e-03f, -1.246002744e-03f, -1.062216482e-03f, +1.802011045e-03f, -7.642079094e-04f, -5.218742281e-04f, +8.364036307e-04f, -3.365319592e-04f, -1.534281255e-04f, +2.306229360e-04f, -8.738863370e-05f, +1.184686737e-06f, +0.000000000e+00f,\n    /* 11, 9 (32) */\n    +0.000000000e+00f, -2.013368691e-04f, +1.741980102e-03f, -1.821163323e-03f, -2.596724524e-03f, +7.847700390e-03f, -3.665417801e-03f, -1.214127422e-02f, +2.125787153e-02f, -8.579426022e-04f, -3.908709561e-02f, +4.625136235e-02f, +2.262777197e-02f, -1.298185802e-01f, +1.344016336e-01f, +6.020385332e-01f, +4.362042455e-01f, -5.112603756e-02f, -8.121168985e-02f, +6.631214419e-02f, +2.441004899e-04f, -3.455622943e-02f, +2.068605549e-02f, +5.886735136e-03f, -1.410018059e-02f, +5.164551435e-03f, +3.678771994e-03f, -4.127753581e-03f, +6.334391792e-04f, +1.027427109e-03f, -5.208369150e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.540741818e-05f, -1.713070666e-05f, +1.911519052e-04f, -2.308444587e-04f, -1.644932940e-04f, +7.277775432e-04f, -5.406817511e-04f, -8.075352641e-04f, +1.967645963e-03f, -7.128689572e-04f, -2.938038908e-03f, +4.781701836e-03f, +9.419548641e-04f, -1.594640601e-02f, -7.677809727e-03f, +1.527735383e-02f, +1.000072017e-02f, -5.401358006e-03f, -1.305269933e-03f, +3.279506782e-03f, -1.247190160e-03f, -9.870120801e-04f, +1.252779690e-03f, -2.413482406e-04f, -4.770489483e-04f, +3.865715585e-04f, -1.023357321e-05f, -1.423977072e-04f, +7.400231112e-05f, +1.567542367e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.013368691e-04f, -2.115506924e-03f, +3.836456839e-03f, -2.697332892e-05f, -9.106050270e-03f, +1.263093554e-02f, +2.323802171e-04f, -2.148770588e-02f, +2.557502365e-02f, +1.103759193e-03f, -3.570093969e-02f, +3.774571710e-02f, +2.446287029e-03f, -4.520847907e-02f, +4.302072894e-02f, +3.598168635e-03f, -4.484884850e-02f, +3.850099032e-02f, +3.838673446e-03f, -3.478965244e-02f, +2.675149521e-02f, +3.000689549e-03f, -2.041758691e-02f, +1.376891164e-02f, +1.620158388e-03f, -8.252717969e-03f, +4.609677117e-03f, +4.692130843e-04f, -1.646641156e-03f, +5.208369150e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.540741818e-05f, -3.024489743e-05f, -2.113854967e-04f, +4.575415349e-04f, -2.175747863e-04f, -6.240545397e-04f, +1.250580530e-03f, -5.784557033e-04f, -1.211986895e-03f, +2.284855957e-03f, -1.017062415e-03f, -1.751041576e-03f, +3.126681251e-03f, -1.337581486e-03f, -1.968565202e-03f, +3.338135339e-03f, -1.372150902e-03f, -1.740252096e-03f, +2.801543206e-03f, -1.105976113e-03f, -1.189048365e-03f, +1.811241825e-03f, -6.860413896e-04f, -5.917805257e-04f, +8.464375711e-04f, -3.073838501e-04f, -1.793657373e-04f, +2.368258200e-04f, -8.290674739e-05f, -1.567542367e-06f, +0.000000000e+00f,\n    /* 11,10 (32) */\n    +0.000000000e+00f, -2.467442873e-04f, +1.724849395e-03f, -1.630011418e-03f, -2.827568983e-03f, +7.683207096e-03f, -2.937640258e-03f, -1.268195597e-02f, +2.045033626e-02f, +1.109703361e-03f, -3.979996456e-02f, +4.331332344e-02f, +2.740947380e-02f, -1.288766254e-01f, +1.184552276e-01f, +5.943607235e-01f, +4.514815994e-01f, -4.112531739e-02f, -8.661304785e-02f, +6.500687426e-02f, +3.523607271e-03f, -3.580341959e-02f, +1.969904341e-02f, +7.139514826e-03f, -1.434152883e-02f, +4.687502487e-03f, +4.065343553e-03f, -4.137987154e-03f, +4.910414720e-04f, +1.101429420e-03f, -5.192693727e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.191937002e-05f, -2.394391249e-05f, +1.917523215e-04f, -2.127708687e-04f, -1.914231114e-04f, +7.229363140e-04f, -4.786988118e-04f, -8.724423452e-04f, +1.924885491e-03f, -5.420360887e-04f, -3.047605643e-03f, +4.562332588e-03f, +1.416658454e-03f, -1.563380617e-02f, -8.416840753e-03f, +1.487594407e-02f, +1.056931432e-02f, -5.202019568e-03f, -1.595604045e-03f, +3.332672114e-03f, -1.127890466e-03f, -1.086315845e-03f, +1.249953064e-03f, -1.881832653e-04f, -5.078743329e-04f, +3.799987812e-04f, +7.021610511e-06f, -1.496516639e-04f, +7.219074135e-05f, +4.461247698e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.467442873e-04f, -2.145751822e-03f, +3.625071342e-03f, +4.305682060e-04f, -9.323625057e-03f, +1.200688100e-02f, +1.482960747e-03f, -2.206616159e-02f, +2.436303675e-02f, +3.388615151e-03f, -3.671800211e-02f, +3.599467552e-02f, +5.572968280e-03f, -4.654606055e-02f, +4.105216374e-02f, +6.936303974e-03f, -4.622099940e-02f, +3.676073822e-02f, +6.640216652e-03f, -3.589562855e-02f, +2.556244684e-02f, +4.811931374e-03f, -2.110362830e-02f, +1.317713111e-02f, +2.466595959e-03f, -8.560101819e-03f, +4.430311380e-03f, +7.060389043e-04f, -1.729547904e-03f, +5.192693727e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.191937002e-05f, -1.858278450e-05f, -2.211852757e-04f, +4.434443410e-04f, -1.716957904e-04f, -6.645646552e-04f, +1.224077651e-03f, -4.754946277e-04f, -1.302928899e-03f, +2.249058511e-03f, -8.522847680e-04f, -1.895255156e-03f, +3.090734556e-03f, -1.135516017e-03f, -2.143274330e-03f, +3.312231865e-03f, -1.177728500e-03f, -1.906126961e-03f, +2.790621447e-03f, -9.599682835e-04f, -1.311931067e-03f, +1.812574388e-03f, -6.036809243e-04f, -6.602251554e-04f, +8.528141140e-04f, -2.761089073e-04f, -2.051850750e-04f, +2.420504378e-04f, -7.776451838e-05f, -4.461247698e-06f, +0.000000000e+00f,\n    /* 11,11 (32) */\n    +0.000000000e+00f, -2.886636573e-04f, +1.700905483e-03f, -1.438259096e-03f, -3.040339852e-03f, +7.491783984e-03f, -2.214703944e-03f, -1.316065478e-02f, +1.957789392e-02f, +3.034588851e-03f, -4.034200065e-02f, +4.026571780e-02f, +3.197180639e-02f, -1.274599669e-01f, +1.028214215e-01f, +5.859438828e-01f, +4.663575434e-01f, -3.055600307e-02f, -9.181506742e-02f, +6.341127021e-02f, +6.856279386e-03f, -3.693131006e-02f, +1.861272757e-02f, +8.389467890e-03f, -1.452971210e-02f, +4.179628154e-03f, +4.445342334e-03f, -4.130965543e-03f, +3.413898082e-04f, +1.173620162e-03f, -5.148081250e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.838212256e-05f, -3.039279260e-05f, +1.915056908e-04f, -1.943050510e-04f, -2.168975658e-04f, +7.152661720e-04f, -4.160927482e-04f, -9.325720438e-04f, +1.875332384e-03f, -3.724092127e-04f, -3.143105347e-03f, +4.330779522e-03f, +1.872163695e-03f, -1.529195075e-02f, -9.135642269e-03f, +1.444000501e-02f, +1.112533286e-02f, -4.977484209e-03f, -1.886254962e-03f, +3.373678725e-03f, -1.001702874e-03f, -1.183198043e-03f, +1.241961659e-03f, -1.330727827e-04f, -5.373127009e-04f, +3.716379788e-04f, +2.475974066e-05f, -1.564782272e-04f, +6.995175781e-05f, +7.486215084e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.886636573e-04f, -2.164334606e-03f, +3.403886067e-03f, +8.740125470e-04f, -9.495320847e-03f, +1.134231634e-02f, +2.707038398e-03f, -2.254165622e-02f, +2.306010786e-02f, +5.637673661e-03f, -3.757028688e-02f, +3.409942037e-02f, +8.663702835e-03f, -4.768157657e-02f, +3.890888941e-02f, +1.024853584e-02f, -4.739872790e-02f, +3.485461126e-02f, +9.430838100e-03f, -3.685559683e-02f, +2.425051577e-02f, +6.624505763e-03f, -2.170730923e-02f, +1.251690596e-02f, +3.319410073e-03f, -8.836210727e-03f, +4.225126305e-03f, +9.480893421e-04f, -1.807312422e-03f, +5.148081250e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.838212256e-05f, -7.276413694e-06f, -2.296222555e-04f, +4.276702774e-04f, -1.260496305e-04f, -7.013604142e-04f, +1.192597501e-03f, -3.718354120e-04f, -1.387161515e-03f, +2.203810330e-03f, -6.850231627e-04f, -2.030448288e-03f, +3.041540159e-03f, -9.289761989e-04f, -2.308603358e-03f, +3.271936477e-03f, -9.776523587e-04f, -2.064449652e-03f, +2.767456242e-03f, -8.085790630e-04f, -1.430277407e-03f, +1.805907898e-03f, -5.174395197e-04f, -7.268700597e-04f, +8.554314227e-04f, -2.428066312e-04f, -2.307558929e-04f, +2.462376742e-04f, -7.196522133e-05f, -7.486215084e-06f, +0.000000000e+00f,\n    /* 11,12 (32) */\n    +0.000000000e+00f, -3.270457799e-04f, +1.670512690e-03f, -1.246753405e-03f, -3.234644903e-03f, +7.274886419e-03f, -1.499437772e-03f, -1.357674753e-02f, +1.864532187e-02f, +4.909921236e-03f, -4.071440986e-02f, +3.712261245e-02f, +3.630258591e-02f, -1.255878032e-01f, +8.752947072e-02f, +5.768082405e-01f, +4.807975485e-01f, -1.943067021e-02f, -9.679255163e-02f, +6.152501525e-02f, +1.022995811e-02f, -3.793301293e-02f, +1.742952952e-02f, +9.631429549e-03f, -1.466278488e-02f, +3.642315453e-03f, +4.816980313e-03f, -4.106205803e-03f, +1.849115809e-04f, +1.243571920e-03f, -5.073219099e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.481623894e-05f, -3.645992124e-05f, +1.904389678e-04f, -1.755366871e-04f, -2.408454052e-04f, +7.048617042e-04f, -3.531307794e-04f, -9.877771993e-04f, +1.819313209e-03f, -2.046274417e-04f, -3.224456389e-03f, +4.088159706e-03f, +2.307523354e-03f, -1.492209129e-02f, -9.832531001e-03f, +1.397039874e-02f, +1.166707039e-02f, -4.727884956e-03f, -2.176126409e-03f, +3.402121271e-03f, -8.689981039e-04f, -1.277217900e-03f, +1.228732987e-03f, -7.620428164e-05f, -5.652070128e-04f, +3.614793007e-04f, +4.291582785e-05f, -1.628315887e-04f, +6.728007231e-05f, +1.063106857e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.270457799e-04f, -2.171611020e-03f, +3.174263811e-03f, +1.301682824e-03f, -9.621370478e-03f, +1.064095593e-02f, +3.899635899e-03f, -2.291349163e-02f, +2.167294634e-02f, +7.841483992e-03f, -3.825531004e-02f, +3.206897208e-02f, +1.170524299e-02f, -4.861055277e-02f, +3.660028605e-02f, +1.352047232e-02f, -4.837638026e-02f, +3.279016161e-02f, +1.219829434e-02f, -3.766417590e-02f, +2.282023837e-02f, +8.430413660e-03f, -2.222474875e-02f, +1.179003590e-02f, +4.174841496e-03f, -9.079017358e-03f, +3.994370412e-03f, +1.194327016e-03f, -1.879277644e-03f, +5.073219099e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.481623894e-05f, +3.627044358e-06f, -2.366954563e-04f, +4.103362001e-04f, -8.084197358e-05f, -7.343428956e-04f, +1.156359346e-03f, -2.679489359e-04f, -1.464386609e-03f, +2.149397652e-03f, -5.160312554e-04f, -2.156077746e-03f, +2.979364830e-03f, -7.188770533e-04f, -2.463832767e-03f, +3.217410555e-03f, -7.727863800e-04f, -2.214489575e-03f, +2.732074795e-03f, -6.524371545e-04f, -1.543514979e-03f, +1.791176744e-03f, -4.276523932e-04f, -7.913800148e-04f, +8.542035150e-04f, -2.075885776e-04f, -2.559458012e-04f, +2.493321100e-04f, -6.551603683e-05f, -1.063106857e-05f, +0.000000000e+00f,\n    /* 11,13 (32) */\n    +0.000000000e+00f, -3.618620188e-04f, +1.634052769e-03f, -1.056314437e-03f, -3.410181590e-03f, +7.034041013e-03f, -7.945760677e-04f, -1.392987831e-02f, +1.765754468e-02f, +6.729234444e-03f, -4.091903731e-02f, +3.389815606e-02f, +4.039074562e-02f, -1.232802799e-01f, +7.260737943e-02f, +5.669757095e-01f, +4.947679472e-01f, -7.763599815e-03f, -1.015204366e-01f, +5.934888884e-02f, +1.363207938e-02f, -3.880201104e-02f, +1.615231162e-02f, +1.086016254e-02f, -1.473898916e-02f, +3.077108440e-03f, +5.178459613e-03f, -4.063289975e-03f, +2.207999221e-05f, +1.310851992e-03f, -4.966908413e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.124166587e-05f, -4.213028094e-05f, +1.885820335e-04f, -1.565544333e-04f, -2.632035506e-04f, +6.918268172e-04f, -2.900761367e-04f, -1.037933360e-03f, +1.757174058e-03f, -3.931079982e-05f, -3.291631831e-03f, +3.835606308e-03f, +2.721866806e-03f, -1.452554670e-02f, -1.050588786e-02f, +1.346808420e-02f, +1.219284358e-02f, -4.453437683e-03f, -2.464102623e-03f, +3.417635218e-03f, -7.301798757e-04f, -1.367937793e-03f, +1.210214751e-03f, -1.777660704e-05f, -5.914032546e-04f, +3.495205277e-04f, +6.142119444e-05f, -1.686667536e-04f, +6.417240898e-05f, +1.388329353e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.618620188e-04f, -2.167983976e-03f, +2.937568355e-03f, +1.712019025e-03f, -9.702212451e-03f, +9.906613032e-03f, +5.055995245e-03f, -2.318144056e-02f, +2.020855973e-02f, +9.990881644e-03f, -3.877134130e-02f, +2.991289433e-02f, +1.468460782e-02f, -4.932942982e-02f, +3.413645328e-02f, +1.673788287e-02f, -4.914916664e-02f, +3.057567203e-02f, +1.493036914e-02f, -3.831661305e-02f, +2.127672339e-02f, +1.022159040e-02f, -2.265240114e-02f, +1.099865588e-02f, +5.029045011e-03f, -9.286605935e-03f, +3.738424611e-03f, +1.443659126e-03f, -1.944793680e-03f, +4.966908413e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.124166587e-05f, +1.408414334e-05f, -2.424108144e-04f, +3.915636883e-04f, -3.627213688e-05f, -7.634325823e-04f, +1.115600795e-03f, -1.643009442e-04f, -1.534340794e-03f, +2.086145071e-03f, -3.460649457e-04f, -2.271645788e-03f, +2.904531903e-03f, -5.061473728e-04f, -2.608288242e-03f, +3.148878810e-03f, -5.640180608e-04f, -2.355549894e-03f, +2.684559105e-03f, -4.921975209e-04f, -1.651088905e-03f, +1.768351253e-03f, -3.346757134e-04f, -8.534242601e-04f, +8.490609702e-04f, -1.705780658e-04f, -2.806208902e-04f, +2.512824241e-04f, -5.842813484e-05f, -1.388329353e-05f, +0.000000000e+00f,\n    /* 11,14 (32) */\n    +0.000000000e+00f, -3.931036847e-04f, +1.591922488e-03f, -8.677324040e-04f, -3.566736023e-03f, +6.770837463e-03f, -1.027492505e-04f, -1.421995445e-02f, +1.661961131e-02f, +8.486408502e-03f, -4.095834811e-02f, +3.060652423e-02f, +4.422635193e-02f, -1.205584131e-01f, +5.808183272e-02f, +5.564698216e-01f, +5.082360314e-01f, +4.429243765e-03f, -1.059738743e-01f, +5.688478622e-02f, +1.704971460e-02f, -3.953219091e-02f, +1.478437383e-02f, +1.207037729e-02f, -1.475676577e-02f, +2.485705186e-03f, +5.527980141e-03f, -4.001868780e-03f, -1.465867614e-04f, +1.375024401e-03f, -4.828075478e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.767764884e-05f, -4.739126146e-05f, +1.859674759e-04f, -1.374455549e-04f, -2.839171791e-04f, +6.762741015e-04f, -2.271870567e-04f, -1.082938859e-03f, +1.689278822e-03f, +1.229418331e-04f, -3.344658553e-03f, +3.574264444e-03f, +3.114401859e-03f, -1.410369877e-02f, -1.115416257e-02f, +1.293411465e-02f, +1.270099653e-02f, -4.154441542e-03f, -2.749051993e-03f, +3.419898977e-03f, -5.856839105e-04f, -1.454925088e-03f, +1.186375451e-03f, +4.200064683e-05f, -6.157511698e-04f, +3.357672655e-04f, +8.020369137e-05f, -1.739397803e-04f, +6.062758652e-05f, +1.722926679e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.931036847e-04f, -2.153899832e-03f, +2.695157541e-03f, +2.103582713e-03f, -9.738484588e-03f, +9.143180449e-03f, +6.171596040e-03f, -2.334574151e-02f, +1.867421894e-02f, +1.207702671e-02f, -3.911740624e-02f, +2.764124854e-02f, +1.758913973e-02f, -4.983557720e-02f, +3.152816504e-02f, +1.988676168e-02f, -4.971318470e-02f, +2.822012214e-02f, +1.761492824e-02f, -3.880881057e-02f, +1.962563448e-02f, +1.198994166e-02f, -2.298707685e-02f, +1.014523162e-02f, +5.878105981e-03f, -9.457184001e-03f, +3.457803721e-03f, +1.694941550e-03f, -2.003221815e-03f, +4.828075478e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.767764884e-05f, +2.405528726e-05f, -2.467809675e-04f, +3.714783352e-04f, +7.467739994e-06f, -7.885693971e-04f, +1.070576424e-03f, -6.134997616e-05f, -1.596796259e-03f, +2.014413729e-03f, -1.758789525e-04f, -2.376702145e-03f, +2.817419619e-03f, -2.917255273e-04f, -2.741343672e-03f, +3.066628344e-03f, -3.522545645e-04f, -2.486970825e-03f, +2.625045922e-03f, -3.285386074e-04f, -1.752464547e-03f, +1.737438236e-03f, -2.388852243e-04f, -9.126781313e-04f, +8.399515688e-04f, -1.319098211e-04f, -3.046463754e-04f, +2.520417849e-04f, -5.071673752e-05f, -1.722926679e-05f, +0.000000000e+00f,\n    /* 11,15 (32) */\n    +0.000000000e+00f, -4.207813335e-04f, +1.544531227e-03f, -6.817649281e-04f, -3.704181578e-03f, +6.486920284e-03f, +5.735248510e-04f, -1.444714150e-02f, +1.553667246e-02f, +1.017568732e-02f, -4.083540627e-02f, +2.726186568e-02f, +4.780061637e-02f, -1.174440112e-01f, +4.397813395e-02f, +5.453156591e-01f, +5.211701461e-01f, +1.713024030e-02f, -1.101283158e-01f, +5.413573422e-02f, +2.046961358e-02f, -4.011787482e-02f, +1.332944874e-02f, +1.325675274e-02f, -1.471476512e-02f, +1.869954016e-03f, +5.863747407e-03f, -3.921665089e-03f, -3.205265417e-04f, +1.435651987e-03f, -4.655782810e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.414265355e-05f, -5.223264705e-05f, +1.826303650e-04f, -1.182955744e-04f, -3.029397690e-04f, +6.583241727e-04f, -1.647158146e-04f, -1.122714796e-03f, +1.616007420e-03f, +2.815546607e-04f, -3.383616192e-03f, +3.305287055e-03f, +3.484416293e-03f, -1.365798748e-02f, -1.177587811e-02f, +1.236963488e-02f, +1.318990617e-02f, -3.831279116e-03f, -3.029830798e-03f, +3.408635909e-03f, -4.359767877e-04f, -1.537753995e-03f, +1.157204923e-03f, +1.029078014e-04f, -6.381049921e-04f, +3.202331082e-04f, +9.918793658e-05f, -1.786080213e-04f, +5.664659220e-05f, +2.065429392e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.207813335e-04f, -2.129844545e-03f, +2.448376573e-03f, +2.475061048e-03f, -9.731016848e-03f, +8.354611052e-03f, +7.242172463e-03f, -2.340709148e-02f, +1.707742268e-02f, +1.409144044e-02f, -3.929328519e-02f, +2.526454640e-02f, +2.040655935e-02f, -5.012730272e-02f, +2.878682137e-02f, +2.295339003e-02f, -5.006543927e-02f, +2.573315131e-02f, +2.023997416e-02f, -3.913734918e-02f, +1.787316994e-02f, +1.372737989e-02f, -2.322596208e-02f, +9.232553493e-03f, +6.718057550e-03f, -9.589093822e-03f, +3.153157345e-03f, +1.946983335e-03f, -2.053938553e-03f, +4.655782810e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.414265355e-05f, +3.350483173e-05f, -2.498250112e-04f, +3.502090341e-04f, +5.019347232e-05f, -8.097126439e-04f, +1.021556339e-03f, +4.045464573e-05f, -1.651561414e-03f, +1.934599351e-03f, -6.223419220e-06f, -2.470845787e-03f, +2.718459209e-03f, -7.655523313e-05f, -2.862423931e-03f, +2.971007414e-03f, -1.384186910e-04f, -2.608132755e-03f, +2.553726448e-03f, -1.621594355e-04f, -1.847130142e-03f, +1.698481370e-03f, -1.406747584e-04f, -9.688246898e-04f, +8.268408584e-04f, -9.172955338e-05f, -3.278872634e-04f, +2.515682268e-04f, -4.240116050e-05f, -2.065429392e-05f, +0.000000000e+00f,\n    /* 11,16 (32) */\n    +0.000000000e+00f, -4.449239871e-04f, +1.492298580e-03f, -4.991345630e-04f, -3.822477153e-03f, +6.183980515e-03f, +1.231849024e-03f, -1.461185732e-02f, +1.441395766e-02f, +1.179169475e-02f, -4.055385161e-02f, +2.387824949e-02f, +5.110590343e-02f, -1.139595949e-01f, +3.032014646e-02f, +5.335397809e-01f, +5.335397809e-01f, +3.032014646e-02f, -1.139595949e-01f, +5.110590343e-02f, +2.387824949e-02f, -4.055385161e-02f, +1.179169475e-02f, +1.441395766e-02f, -1.461185732e-02f, +1.231849024e-03f, +6.183980515e-03f, -3.822477153e-03f, -4.991345630e-04f, +1.492298580e-03f, -4.449239871e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.065429392e-05f, -5.664659220e-05f, +1.786080213e-04f, -9.918793658e-05f, -3.202331082e-04f, +6.381049921e-04f, -1.029078014e-04f, -1.157204923e-03f, +1.537753995e-03f, +4.359767877e-04f, -3.408635909e-03f, +3.029830798e-03f, +3.831279116e-03f, -1.318990617e-02f, -1.236963488e-02f, +1.177587811e-02f, +1.365798748e-02f, -3.484416293e-03f, -3.305287055e-03f, +3.383616192e-03f, -2.815546607e-04f, -1.616007420e-03f, +1.122714796e-03f, +1.647158146e-04f, -6.583241727e-04f, +3.029397690e-04f, +1.182955744e-04f, -1.826303650e-04f, +5.223264705e-05f, +2.414265355e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.449239871e-04f, -2.096339713e-03f, +2.198551562e-03f, +2.825270082e-03f, -9.680823376e-03f, +7.544898408e-03f, +8.263728803e-03f, -2.336663684e-02f, +1.542586126e-02f, +1.602603979e-02f, -3.929950861e-02f, +2.279370061e-02f, +2.312501856e-02f, -5.020385796e-02f, +2.592439744e-02f, +2.592439744e-02f, -5.020385796e-02f, +2.312501856e-02f, +2.279370061e-02f, -3.929950861e-02f, +1.602603979e-02f, +1.542586126e-02f, -2.336663684e-02f, +8.263728803e-03f, +7.544898408e-03f, -9.680823376e-03f, +2.825270082e-03f, +2.198551562e-03f, -2.096339713e-03f, +4.449239871e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.065429392e-05f, +4.240116050e-05f, -2.515682268e-04f, +3.278872634e-04f, +9.172955338e-05f, -8.268408584e-04f, +9.688246898e-04f, +1.406747584e-04f, -1.698481370e-03f, +1.847130142e-03f, +1.621594355e-04f, -2.553726448e-03f, +2.608132755e-03f, +1.384186910e-04f, -2.971007414e-03f, +2.862423931e-03f, +7.655523313e-05f, -2.718459209e-03f, +2.470845787e-03f, +6.223419220e-06f, -1.934599351e-03f, +1.651561414e-03f, -4.045464573e-05f, -1.021556339e-03f, +8.097126439e-04f, -5.019347232e-05f, -3.502090341e-04f, +2.498250112e-04f, -3.350483173e-05f, -2.414265355e-05f, +0.000000000e+00f,\n    /* 11,17 (32) */\n    +0.000000000e+00f, -4.655782810e-04f, +1.435651987e-03f, -3.205265417e-04f, -3.921665089e-03f, +5.863747407e-03f, +1.869954016e-03f, -1.471476512e-02f, +1.325675274e-02f, +1.332944874e-02f, -4.011787482e-02f, +2.046961358e-02f, +5.413573422e-02f, -1.101283158e-01f, +1.713024030e-02f, +5.211701461e-01f, +5.453156591e-01f, +4.397813395e-02f, -1.174440112e-01f, +4.780061637e-02f, +2.726186568e-02f, -4.083540627e-02f, +1.017568732e-02f, +1.553667246e-02f, -1.444714150e-02f, +5.735248510e-04f, +6.486920284e-03f, -3.704181578e-03f, -6.817649281e-04f, +1.544531227e-03f, -4.207813335e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.722926679e-05f, -6.062758652e-05f, +1.739397803e-04f, -8.020369137e-05f, -3.357672655e-04f, +6.157511698e-04f, -4.200064683e-05f, -1.186375451e-03f, +1.454925088e-03f, +5.856839105e-04f, -3.419898977e-03f, +2.749051993e-03f, +4.154441542e-03f, -1.270099653e-02f, -1.293411465e-02f, +1.115416257e-02f, +1.410369877e-02f, -3.114401859e-03f, -3.574264444e-03f, +3.344658553e-03f, -1.229418331e-04f, -1.689278822e-03f, +1.082938859e-03f, +2.271870567e-04f, -6.762741015e-04f, +2.839171791e-04f, +1.374455549e-04f, -1.859674759e-04f, +4.739126146e-05f, +2.767764884e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.655782810e-04f, -2.053938553e-03f, +1.946983335e-03f, +3.153157345e-03f, -9.589093822e-03f, +6.718057550e-03f, +9.232553493e-03f, -2.322596208e-02f, +1.372737989e-02f, +1.787316994e-02f, -3.913734918e-02f, +2.023997416e-02f, +2.573315131e-02f, -5.006543927e-02f, +2.295339003e-02f, +2.878682137e-02f, -5.012730272e-02f, +2.040655935e-02f, +2.526454640e-02f, -3.929328519e-02f, +1.409144044e-02f, +1.707742268e-02f, -2.340709148e-02f, +7.242172463e-03f, +8.354611052e-03f, -9.731016848e-03f, +2.475061048e-03f, +2.448376573e-03f, -2.129844545e-03f, +4.207813335e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.722926679e-05f, +5.071673752e-05f, -2.520417849e-04f, +3.046463754e-04f, +1.319098211e-04f, -8.399515688e-04f, +9.126781313e-04f, +2.388852243e-04f, -1.737438236e-03f, +1.752464547e-03f, +3.285386074e-04f, -2.625045922e-03f, +2.486970825e-03f, +3.522545645e-04f, -3.066628344e-03f, +2.741343672e-03f, +2.917255273e-04f, -2.817419619e-03f, +2.376702145e-03f, +1.758789525e-04f, -2.014413729e-03f, +1.596796259e-03f, +6.134997616e-05f, -1.070576424e-03f, +7.885693971e-04f, -7.467739994e-06f, -3.714783352e-04f, +2.467809675e-04f, -2.405528726e-05f, -2.767764884e-05f, +0.000000000e+00f,\n    /* 11,18 (32) */\n    +0.000000000e+00f, -4.828075478e-04f, +1.375024401e-03f, -1.465867614e-04f, -4.001868780e-03f, +5.527980141e-03f, +2.485705186e-03f, -1.475676577e-02f, +1.207037729e-02f, +1.478437383e-02f, -3.953219091e-02f, +1.704971460e-02f, +5.688478622e-02f, -1.059738743e-01f, +4.429243765e-03f, +5.082360314e-01f, +5.564698216e-01f, +5.808183272e-02f, -1.205584131e-01f, +4.422635193e-02f, +3.060652423e-02f, -4.095834811e-02f, +8.486408502e-03f, +1.661961131e-02f, -1.421995445e-02f, -1.027492505e-04f, +6.770837463e-03f, -3.566736023e-03f, -8.677324040e-04f, +1.591922488e-03f, -3.931036847e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.388329353e-05f, -6.417240898e-05f, +1.686667536e-04f, -6.142119444e-05f, -3.495205277e-04f, +5.914032546e-04f, +1.777660704e-05f, -1.210214751e-03f, +1.367937793e-03f, +7.301798757e-04f, -3.417635218e-03f, +2.464102623e-03f, +4.453437683e-03f, -1.219284358e-02f, -1.346808420e-02f, +1.050588786e-02f, +1.452554670e-02f, -2.721866806e-03f, -3.835606308e-03f, +3.291631831e-03f, +3.931079982e-05f, -1.757174058e-03f, +1.037933360e-03f, +2.900761367e-04f, -6.918268172e-04f, +2.632035506e-04f, +1.565544333e-04f, -1.885820335e-04f, +4.213028094e-05f, +3.124166587e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.828075478e-04f, -2.003221815e-03f, +1.694941550e-03f, +3.457803721e-03f, -9.457184001e-03f, +5.878105981e-03f, +1.014523162e-02f, -2.298707685e-02f, +1.198994166e-02f, +1.962563448e-02f, -3.880881057e-02f, +1.761492824e-02f, +2.822012214e-02f, -4.971318470e-02f, +1.988676168e-02f, +3.152816504e-02f, -4.983557720e-02f, +1.758913973e-02f, +2.764124854e-02f, -3.911740624e-02f, +1.207702671e-02f, +1.867421894e-02f, -2.334574151e-02f, +6.171596040e-03f, +9.143180449e-03f, -9.738484588e-03f, +2.103582713e-03f, +2.695157541e-03f, -2.153899832e-03f, +3.931036847e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.388329353e-05f, +5.842813484e-05f, -2.512824241e-04f, +2.806208902e-04f, +1.705780658e-04f, -8.490609702e-04f, +8.534242601e-04f, +3.346757134e-04f, -1.768351253e-03f, +1.651088905e-03f, +4.921975209e-04f, -2.684559105e-03f, +2.355549894e-03f, +5.640180608e-04f, -3.148878810e-03f, +2.608288242e-03f, +5.061473728e-04f, -2.904531903e-03f, +2.271645788e-03f, +3.460649457e-04f, -2.086145071e-03f, +1.534340794e-03f, +1.643009442e-04f, -1.115600795e-03f, +7.634325823e-04f, +3.627213688e-05f, -3.915636883e-04f, +2.424108144e-04f, -1.408414334e-05f, -3.124166587e-05f, +0.000000000e+00f,\n    /* 11,19 (32) */\n    +0.000000000e+00f, -4.966908413e-04f, +1.310851992e-03f, +2.207999221e-05f, -4.063289975e-03f, +5.178459613e-03f, +3.077108440e-03f, -1.473898916e-02f, +1.086016254e-02f, +1.615231162e-02f, -3.880201104e-02f, +1.363207938e-02f, +5.934888884e-02f, -1.015204366e-01f, -7.763599815e-03f, +4.947679472e-01f, +5.669757095e-01f, +7.260737943e-02f, -1.232802799e-01f, +4.039074562e-02f, +3.389815606e-02f, -4.091903731e-02f, +6.729234444e-03f, +1.765754468e-02f, -1.392987831e-02f, -7.945760677e-04f, +7.034041013e-03f, -3.410181590e-03f, -1.056314437e-03f, +1.634052769e-03f, -3.618620188e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.063106857e-05f, -6.728007231e-05f, +1.628315887e-04f, -4.291582785e-05f, -3.614793007e-04f, +5.652070128e-04f, +7.620428164e-05f, -1.228732987e-03f, +1.277217900e-03f, +8.689981039e-04f, -3.402121271e-03f, +2.176126409e-03f, +4.727884956e-03f, -1.166707039e-02f, -1.397039874e-02f, +9.832531001e-03f, +1.492209129e-02f, -2.307523354e-03f, -4.088159706e-03f, +3.224456389e-03f, +2.046274417e-04f, -1.819313209e-03f, +9.877771993e-04f, +3.531307794e-04f, -7.048617042e-04f, +2.408454052e-04f, +1.755366871e-04f, -1.904389678e-04f, +3.645992124e-05f, +3.481623894e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.966908413e-04f, -1.944793680e-03f, +1.443659126e-03f, +3.738424611e-03f, -9.286605935e-03f, +5.029045011e-03f, +1.099865588e-02f, -2.265240114e-02f, +1.022159040e-02f, +2.127672339e-02f, -3.831661305e-02f, +1.493036914e-02f, +3.057567203e-02f, -4.914916664e-02f, +1.673788287e-02f, +3.413645328e-02f, -4.932942982e-02f, +1.468460782e-02f, +2.991289433e-02f, -3.877134130e-02f, +9.990881644e-03f, +2.020855973e-02f, -2.318144056e-02f, +5.055995245e-03f, +9.906613032e-03f, -9.702212451e-03f, +1.712019025e-03f, +2.937568355e-03f, -2.167983976e-03f, +3.618620188e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.063106857e-05f, +6.551603683e-05f, -2.493321100e-04f, +2.559458012e-04f, +2.075885776e-04f, -8.542035150e-04f, +7.913800148e-04f, +4.276523932e-04f, -1.791176744e-03f, +1.543514979e-03f, +6.524371545e-04f, -2.732074795e-03f, +2.214489575e-03f, +7.727863800e-04f, -3.217410555e-03f, +2.463832767e-03f, +7.188770533e-04f, -2.979364830e-03f, +2.156077746e-03f, +5.160312554e-04f, -2.149397652e-03f, +1.464386609e-03f, +2.679489359e-04f, -1.156359346e-03f, +7.343428956e-04f, +8.084197358e-05f, -4.103362001e-04f, +2.366954563e-04f, -3.627044358e-06f, -3.481623894e-05f, +0.000000000e+00f,\n    /* 11,20 (32) */\n    +0.000000000e+00f, -5.073219099e-04f, +1.243571920e-03f, +1.849115809e-04f, -4.106205803e-03f, +4.816980313e-03f, +3.642315453e-03f, -1.466278488e-02f, +9.631429549e-03f, +1.742952952e-02f, -3.793301293e-02f, +1.022995811e-02f, +6.152501525e-02f, -9.679255163e-02f, -1.943067021e-02f, +4.807975485e-01f, +5.768082405e-01f, +8.752947072e-02f, -1.255878032e-01f, +3.630258591e-02f, +3.712261245e-02f, -4.071440986e-02f, +4.909921236e-03f, +1.864532187e-02f, -1.357674753e-02f, -1.499437772e-03f, +7.274886419e-03f, -3.234644903e-03f, -1.246753405e-03f, +1.670512690e-03f, -3.270457799e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.486215084e-06f, -6.995175781e-05f, +1.564782272e-04f, -2.475974066e-05f, -3.716379788e-04f, +5.373127009e-04f, +1.330727827e-04f, -1.241961659e-03f, +1.183198043e-03f, +1.001702874e-03f, -3.373678725e-03f, +1.886254962e-03f, +4.977484209e-03f, -1.112533286e-02f, -1.444000501e-02f, +9.135642269e-03f, +1.529195075e-02f, -1.872163695e-03f, -4.330779522e-03f, +3.143105347e-03f, +3.724092127e-04f, -1.875332384e-03f, +9.325720438e-04f, +4.160927482e-04f, -7.152661720e-04f, +2.168975658e-04f, +1.943050510e-04f, -1.915056908e-04f, +3.039279260e-05f, +3.838212256e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.073219099e-04f, -1.879277644e-03f, +1.194327016e-03f, +3.994370412e-03f, -9.079017358e-03f, +4.174841496e-03f, +1.179003590e-02f, -2.222474875e-02f, +8.430413660e-03f, +2.282023837e-02f, -3.766417590e-02f, +1.219829434e-02f, +3.279016161e-02f, -4.837638026e-02f, +1.352047232e-02f, +3.660028605e-02f, -4.861055277e-02f, +1.170524299e-02f, +3.206897208e-02f, -3.825531004e-02f, +7.841483992e-03f, +2.167294634e-02f, -2.291349163e-02f, +3.899635899e-03f, +1.064095593e-02f, -9.621370478e-03f, +1.301682824e-03f, +3.174263811e-03f, -2.171611020e-03f, +3.270457799e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.486215084e-06f, +7.196522133e-05f, -2.462376742e-04f, +2.307558929e-04f, +2.428066312e-04f, -8.554314227e-04f, +7.268700597e-04f, +5.174395197e-04f, -1.805907898e-03f, +1.430277407e-03f, +8.085790630e-04f, -2.767456242e-03f, +2.064449652e-03f, +9.776523587e-04f, -3.271936477e-03f, +2.308603358e-03f, +9.289761989e-04f, -3.041540159e-03f, +2.030448288e-03f, +6.850231627e-04f, -2.203810330e-03f, +1.387161515e-03f, +3.718354120e-04f, -1.192597501e-03f, +7.013604142e-04f, +1.260496305e-04f, -4.276702774e-04f, +2.296222555e-04f, +7.276413694e-06f, -3.838212256e-05f, +0.000000000e+00f,\n    /* 11,21 (32) */\n    +0.000000000e+00f, -5.148081250e-04f, +1.173620162e-03f, +3.413898082e-04f, -4.130965543e-03f, +4.445342334e-03f, +4.179628154e-03f, -1.452971210e-02f, +8.389467890e-03f, +1.861272757e-02f, -3.693131006e-02f, +6.856279386e-03f, +6.341127021e-02f, -9.181506742e-02f, -3.055600307e-02f, +4.663575434e-01f, +5.859438828e-01f, +1.028214215e-01f, -1.274599669e-01f, +3.197180639e-02f, +4.026571780e-02f, -4.034200065e-02f, +3.034588851e-03f, +1.957789392e-02f, -1.316065478e-02f, -2.214703944e-03f, +7.491783984e-03f, -3.040339852e-03f, -1.438259096e-03f, +1.700905483e-03f, -2.886636573e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.461247698e-06f, -7.219074135e-05f, +1.496516639e-04f, -7.021610511e-06f, -3.799987812e-04f, +5.078743329e-04f, +1.881832653e-04f, -1.249953064e-03f, +1.086315845e-03f, +1.127890466e-03f, -3.332672114e-03f, +1.595604045e-03f, +5.202019568e-03f, -1.056931432e-02f, -1.487594407e-02f, +8.416840753e-03f, +1.563380617e-02f, -1.416658454e-03f, -4.562332588e-03f, +3.047605643e-03f, +5.420360887e-04f, -1.924885491e-03f, +8.724423452e-04f, +4.786988118e-04f, -7.229363140e-04f, +1.914231114e-04f, +2.127708687e-04f, -1.917523215e-04f, +2.394391249e-05f, +4.191937002e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.148081250e-04f, -1.807312422e-03f, +9.480893421e-04f, +4.225126305e-03f, -8.836210727e-03f, +3.319410073e-03f, +1.251690596e-02f, -2.170730923e-02f, +6.624505763e-03f, +2.425051577e-02f, -3.685559683e-02f, +9.430838100e-03f, +3.485461126e-02f, -4.739872790e-02f, +1.024853584e-02f, +3.890888941e-02f, -4.768157657e-02f, +8.663702835e-03f, +3.409942037e-02f, -3.757028688e-02f, +5.637673661e-03f, +2.306010786e-02f, -2.254165622e-02f, +2.707038398e-03f, +1.134231634e-02f, -9.495320847e-03f, +8.740125470e-04f, +3.403886067e-03f, -2.164334606e-03f, +2.886636573e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.461247698e-06f, +7.776451838e-05f, -2.420504378e-04f, +2.051850750e-04f, +2.761089073e-04f, -8.528141140e-04f, +6.602251554e-04f, +6.036809243e-04f, -1.812574388e-03f, +1.311931067e-03f, +9.599682835e-04f, -2.790621447e-03f, +1.906126961e-03f, +1.177728500e-03f, -3.312231865e-03f, +2.143274330e-03f, +1.135516017e-03f, -3.090734556e-03f, +1.895255156e-03f, +8.522847680e-04f, -2.249058511e-03f, +1.302928899e-03f, +4.754946277e-04f, -1.224077651e-03f, +6.645646552e-04f, +1.716957904e-04f, -4.434443410e-04f, +2.211852757e-04f, +1.858278450e-05f, -4.191937002e-05f, +0.000000000e+00f,\n    /* 11,22 (32) */\n    +0.000000000e+00f, -5.192693727e-04f, +1.101429420e-03f, +4.910414720e-04f, -4.137987154e-03f, +4.065343553e-03f, +4.687502487e-03f, -1.434152883e-02f, +7.139514826e-03f, +1.969904341e-02f, -3.580341959e-02f, +3.523607271e-03f, +6.500687426e-02f, -8.661304785e-02f, -4.112531739e-02f, +4.514815994e-01f, +5.943607235e-01f, +1.184552276e-01f, -1.288766254e-01f, +2.740947380e-02f, +4.331332344e-02f, -3.979996456e-02f, +1.109703361e-03f, +2.045033626e-02f, -1.268195597e-02f, -2.937640258e-03f, +7.683207096e-03f, -2.827568983e-03f, -1.630011418e-03f, +1.724849395e-03f, -2.467442873e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.567542367e-06f, -7.400231112e-05f, +1.423977072e-04f, +1.023357321e-05f, -3.865715585e-04f, +4.770489483e-04f, +2.413482406e-04f, -1.252779690e-03f, +9.870120801e-04f, +1.247190160e-03f, -3.279506782e-03f, +1.305269933e-03f, +5.401358006e-03f, -1.000072017e-02f, -1.527735383e-02f, +7.677809727e-03f, +1.594640601e-02f, -9.419548641e-04f, -4.781701836e-03f, +2.938038908e-03f, +7.128689572e-04f, -1.967645963e-03f, +8.075352641e-04f, +5.406817511e-04f, -7.277775432e-04f, +1.644932940e-04f, +2.308444587e-04f, -1.911519052e-04f, +1.713070666e-05f, +4.540741818e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.192693727e-04f, -1.729547904e-03f, +7.060389043e-04f, +4.430311380e-03f, -8.560101819e-03f, +2.466595959e-03f, +1.317713111e-02f, -2.110362830e-02f, +4.811931374e-03f, +2.556244684e-02f, -3.589562855e-02f, +6.640216652e-03f, +3.676073822e-02f, -4.622099940e-02f, +6.936303974e-03f, +4.105216374e-02f, -4.654606055e-02f, +5.572968280e-03f, +3.599467552e-02f, -3.671800211e-02f, +3.388615151e-03f, +2.436303675e-02f, -2.206616159e-02f, +1.482960747e-03f, +1.200688100e-02f, -9.323625057e-03f, +4.305682060e-04f, +3.625071342e-03f, -2.145751822e-03f, +2.467442873e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.567542367e-06f, +8.290674739e-05f, -2.368258200e-04f, +1.793657373e-04f, +3.073838501e-04f, -8.464375711e-04f, +5.917805257e-04f, +6.860413896e-04f, -1.811241825e-03f, +1.189048365e-03f, +1.105976113e-03f, -2.801543206e-03f, +1.740252096e-03f, +1.372150902e-03f, -3.338135339e-03f, +1.968565202e-03f, +1.337581486e-03f, -3.126681251e-03f, +1.751041576e-03f, +1.017062415e-03f, -2.284855957e-03f, +1.211986895e-03f, +5.784557033e-04f, -1.250580530e-03f, +6.240545397e-04f, +2.175747863e-04f, -4.575415349e-04f, +2.113854967e-04f, +3.024489743e-05f, -4.540741818e-05f, +0.000000000e+00f,\n    /* 11,23 (32) */\n    +0.000000000e+00f, -5.208369150e-04f, +1.027427109e-03f, +6.334391792e-04f, -4.127753581e-03f, +3.678771994e-03f, +5.164551435e-03f, -1.410018059e-02f, +5.886735136e-03f, +2.068605549e-02f, -3.455622943e-02f, +2.441004899e-04f, +6.631214419e-02f, -8.121168985e-02f, -5.112603756e-02f, +4.362042455e-01f, +6.020385332e-01f, +1.344016336e-01f, -1.298185802e-01f, +2.262777197e-02f, +4.625136235e-02f, -3.908709561e-02f, -8.579426022e-04f, +2.125787153e-02f, -1.214127422e-02f, -3.665417801e-03f, +7.847700390e-03f, -2.596724524e-03f, -1.821163323e-03f, +1.741980102e-03f, -2.013368691e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.184686737e-06f, -7.539367768e-05f, +1.347627424e-04f, +2.694470422e-05f, -3.913735697e-04f, +4.449958816e-04f, +2.923921239e-04f, -1.250533532e-03f, +8.857288567e-04f, +1.359265091e-03f, -3.214626626e-03f, +1.016325899e-03f, +5.575448640e-03f, -9.421272433e-03f, -1.564347125e-02f, +6.920291785e-03f, +1.622857046e-02f, -4.490746814e-04f, -4.987790445e-03f, +2.814542149e-03f, +8.842517829e-04f, -2.003308442e-03f, +7.380204988e-04f, +6.017714024e-04f, -7.297052001e-04f, +1.361874172e-04f, +2.484354947e-04f, -1.896806238e-04f, +9.972998001e-06f, +4.882517833e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.208369150e-04f, -1.646641156e-03f, +4.692130843e-04f, +4.609677117e-03f, -8.252717969e-03f, +1.620158388e-03f, +1.376891164e-02f, -2.041758691e-02f, +3.000689549e-03f, +2.675149521e-02f, -3.478965244e-02f, +3.838673446e-03f, +3.850099032e-02f, -4.484884850e-02f, +3.598168635e-03f, +4.302072894e-02f, -4.520847907e-02f, +2.446287029e-03f, +3.774571710e-02f, -3.570093969e-02f, +1.103759193e-03f, +2.557502365e-02f, -2.148770588e-02f, +2.323802171e-04f, +1.263093554e-02f, -9.106050270e-03f, -2.697332892e-05f, +3.836456839e-03f, -2.115506924e-03f, +2.013368691e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.184686737e-06f, +8.738863370e-05f, -2.306229360e-04f, +1.534281255e-04f, +3.365319592e-04f, -8.364036307e-04f, +5.218742281e-04f, +7.642079094e-04f, -1.802011045e-03f, +1.062216482e-03f, +1.246002744e-03f, -2.800248911e-03f, +1.567585990e-03f, +1.560083072e-03f, -3.349549514e-03f, +1.785237499e-03f, +1.534275501e-03f, -3.149171460e-03f, +1.598394050e-03f, +1.178608129e-03f, -2.310956446e-03f, +1.114667396e-03f, +6.802447451e-04f, -1.271906527e-03f, +5.799482627e-04f, +2.634754778e-04f, -4.698504283e-04f, +2.002309966e-04f, +4.221200833e-05f, -4.882517833e-05f, +0.000000000e+00f,\n    /* 11,24 (32) */\n    +0.000000000e+00f, -5.196522283e-04f, +9.520334316e-04f, +7.682019216e-04f, -4.100808877e-03f, +3.287398424e-03f, +5.609547317e-03f, -1.380778847e-02f, +4.636201605e-03f, +2.157178435e-02f, -3.319696434e-02f, -2.970526136e-03f, +6.732847009e-02f, -7.563624121e-02f, -6.054731000e-02f, +4.205607743e-01f, +6.089588250e-01f, +1.506302041e-01f, -1.302676549e-01f, +1.763998152e-02f, +4.906590450e-02f, -3.820284382e-02f, -2.861251044e-03f, +2.199589203e-02f, -1.153950282e-02f, -4.395123001e-03f, +7.983887807e-03f, -2.348289030e-03f, -2.010843946e-03f, +1.751953100e-03f, -1.525116908e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.786403335e-06f, -7.637387715e-05f, +1.267934984e-04f, +4.305473184e-05f, -3.944292323e-04f, +4.118760385e-04f, +3.411517215e-04f, -1.243325345e-03f, +7.829078243e-04f, +1.463812955e-03f, -3.138511745e-03f, +7.298188369e-04f, +5.724321760e-03f, -8.832704308e-03f, -1.597363417e-02f, +6.146083796e-03f, +1.647919551e-02f, +6.088818554e-05f, -5.179525972e-03f, +2.677308242e-03f, +1.055513877e-03f, -2.031590404e-03f, +6.640900180e-04f, +6.616957344e-04f, -7.286451315e-04f, +1.065926770e-04f, +2.654533980e-04f, -1.873179974e-04f, +2.492983095e-06f, +5.215113274e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.196522283e-04f, -1.559252523e-03f, +2.385901483e-04f, +4.763105243e-03f, -7.916186010e-03f, +7.837547575e-04f, +1.429078587e-02f, -1.965337901e-02f, +1.198678504e-03f, +2.781371169e-02f, -3.354364969e-02f, +1.038424535e-03f, +4.006857631e-02f, -4.328876543e-02f, +2.486191205e-04f, +4.480596644e-02f, -4.367420357e-02f, -7.028844317e-04f, +3.934411115e-02f, -3.452233157e-02f, -1.207197253e-03f, +2.668969105e-02f, -2.080746114e-02f, -1.039526309e-03f, +1.321088380e-02f, -8.842574792e-03f, -4.968237572e-04f, +4.036687836e-03f, -2.073294916e-03f, +1.525116908e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.786403335e-06f, +9.121070548e-05f, -2.235041847e-04f, +1.274997434e-04f, +3.634660170e-04f, -8.228292131e-04f, +4.508455358e-04f, +8.378908291e-04f, -1.785017248e-03f, +9.320345641e-04f, +1.379479749e-03f, -2.786820098e-03f, +1.388916364e-03f, +1.740719604e-03f, -3.346441362e-03f, +1.594091349e-03f, +1.724722939e-03f, -3.158055539e-03f, +1.437939937e-03f, +1.336183052e-03f, -2.327155243e-03f, +1.011334890e-03f, +7.803870073e-04f, -1.287876920e-03f, +5.323830676e-04f, +3.091821714e-04f, -4.802657043e-04f, +1.877371019e-04f, +5.442997476e-05f, -5.215113274e-05f, +0.000000000e+00f,\n    /* 11,25 (32) */\n    +0.000000000e+00f, -5.158658249e-04f, +8.756595545e-04f, +8.949954200e-04f, -4.057754145e-03f, +2.892969192e-03f, +6.021423355e-03f, -1.346663674e-02f, +3.392876260e-03f, +2.235469217e-02f, -3.173315139e-02f, -6.109037881e-03f, +6.805828893e-02f, -6.991191945e-02f, -6.938001431e-02f, +4.045871401e-01f, +6.151049088e-01f, +1.671093996e-01f, -1.302067667e-01f, +1.246045555e-02f, +5.174321274e-02f, -3.714732995e-02f, -4.892841448e-03f, +2.265998204e-02f, -1.087780708e-02f, -5.123768133e-03f, +8.090480484e-03f, -2.082835632e-03f, -2.198161944e-03f, +1.754446083e-03f, -1.003605580e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.229758273e-06f, -7.695366797e-05f, +1.185368192e-04f, +5.851081077e-05f, -3.957698464e-04f, +3.778511793e-04f, +3.874766561e-04f, -1.231283832e-03f, +6.789884160e-04f, +1.560566567e-03f, -3.051675980e-03f, +4.467660161e-04f, +5.848087598e-03f, -8.236754752e-03f, -1.626728294e-02f, +5.357031680e-03f, +1.669725689e-02f, +5.867703010e-04f, -5.355864460e-03f, +2.526586220e-03f, +1.225972263e-03f, -2.052233720e-03f, +5.859576958e-04f, +7.201819531e-04f, -7.245342347e-04f, +7.580396313e-05f, +2.818077408e-04f, -1.840470753e-04f, -5.284803911e-06f, +5.536343650e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.158658249e-04f, -1.468041817e-03f, +1.508596358e-05f, +4.890604986e-03f, -7.552719993e-03f, -3.907445562e-05f, +1.474163140e-02f, -1.881548818e-02f, -5.863387437e-04f, +2.874574625e-02f, -3.216416994e-02f, -1.748395563e-03f, +4.145749267e-02f, -4.154804582e-02f, -3.097822242e-03f, +4.640005779e-02f, -4.194948063e-02f, -3.860939971e-03f, +4.078205108e-02f, -3.318614851e-02f, -3.534352496e-03f, +2.770102594e-02f, -2.002707413e-02f, -2.327403229e-03f, +1.374326687e-02f, -8.533392621e-03f, -9.770894616e-04f, +4.224424938e-03f, -2.018864941e-03f, +1.003605580e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.229758273e-06f, +9.437717204e-05f, -2.155348307e-04f, +1.017047819e-04f, +3.881112511e-04f, -8.058454924e-04f, +3.790333387e-04f, +9.068248614e-04f, -1.760428988e-03f, +7.991108973e-04f, +1.505872406e-03f, -2.761391756e-03f, +1.205054076e-03f, +1.913289705e-03f, -3.328842288e-03f, +1.395961915e-03f, +1.908074638e-03f, -3.153243872e-03f, +1.270344836e-03f, +1.489060860e-03f, -2.333290406e-03f, +9.023851319e-04f, +8.784090850e-04f, -1.298335032e-03f, +4.815149239e-04f, +3.544755813e-04f, -4.886888339e-04f, +1.739265019e-04f, +6.684145543e-05f, -5.536343650e-05f, +0.000000000e+00f,\n    /* 11,26 (32) */\n    +0.000000000e+00f, -5.096360667e-04f, +7.987058865e-04f, +1.013532239e-03f, -3.999243334e-03f, +2.497199346e-03f, +6.399274535e-03f, -1.307916009e-02f, +2.161592427e-03f, +2.303368059e-02f, -3.017258482e-02f, -9.160713861e-03f, +6.850505494e-02f, -6.406383185e-02f, -7.761676906e-02f, +3.883198572e-01f, +6.204619405e-01f, +1.838066565e-01f, -1.296199964e-01f, +7.104591091e-03f, +5.426979896e-02f, -3.592135768e-02f, -6.945075168e-03f, +2.324593974e-02f, -1.015762513e-02f, -5.848302367e-03f, +8.166284447e-03f, -1.801027891e-03f, -2.382209019e-03f, +1.749161279e-03f, -4.499712153e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.508092032e-06f, -7.714542216e-05f, +1.100394411e-04f, +7.326442817e-05f, -3.954332952e-04f, +3.430832150e-04f, +4.312297312e-04f, -1.214554775e-03f, +5.744061304e-04f, +1.649294283e-03f, -2.954664371e-03f, +1.681520007e-04f, +5.946934842e-03f, -7.635163059e-03f, -1.652396156e-02f, +4.555025022e-03f, +1.688181373e-02f, +1.127341589e-03f, -5.515794497e-03f, +2.362681358e-03f, +1.394934129e-03f, -2.065006149e-03f, +5.038588502e-04f, +7.769576327e-04f, -7.173209664e-04f, +4.392362233e-05f, +2.974086587e-04f, -1.798546151e-04f, -1.333354016e-05f, +5.844002441e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.096360667e-04f, -1.373664645e-03f, -2.004488672e-04f, +4.992309768e-03f, -7.164608742e-03f, -8.449199480e-04f, +1.512066474e-02f, -1.790866331e-02f, -2.346767732e-03f, +2.954485715e-02f, -3.065829754e-02f, -4.509787320e-03f, +4.266254675e-02f, -3.963475612e-02f, -6.426664530e-03f, +4.779601970e-02f, -4.004140599e-02f, -7.014183843e-03f, +4.205239592e-02f, -3.169708765e-02f, -5.867642902e-03f, +2.860341107e-02f, -1.914866505e-02f, -3.625738261e-03f, +1.422478179e-02f, -8.178917040e-03f, -1.465778295e-03f, +4.398351440e-03f, -1.952023486e-03f, +4.499712153e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.508092032e-06f, +9.689578485e-05f, -2.067825811e-04f, +7.616357881e-05f, +4.104054317e-04f, -7.855970127e-04f, +3.067745716e-04f, +9.707699758e-04f, -1.728447016e-03f, +6.640600564e-04f, +1.624681845e-03f, -2.724151392e-03f, +1.016829376e-03f, +2.077060559e-03f, -3.296847912e-03f, +1.191715659e-03f, +2.083511266e-03f, -3.134707495e-03f, +1.096309781e-03f, +1.636531151e-03f, -2.329243902e-03f, +7.882436644e-04f, +9.738411283e-04f, -1.303147295e-03f, +4.275181090e-04f, +3.991338273e-04f, -4.950287292e-04f, +1.588293267e-04f, +7.938613329e-05f, -5.844002441e-05f, +0.000000000e+00f,\n    /* 11,27 (32) */\n    +0.000000000e+00f, -5.011279746e-04f, +7.215604643e-04f, +1.123571680e-03f, -3.925978906e-03f, +2.101766051e-03f, +6.742357750e-03f, -1.264793036e-02f, +9.470376524e-04f, +2.360808672e-02f, -2.852329054e-02f, -1.211537823e-02f, +6.867320694e-02f, -5.811689701e-02f, -8.525193212e-02f, +3.717958956e-01f, +6.250169655e-01f, +2.006884702e-01f, -1.284926549e-01f, +1.588796594e-03f, +5.663248032e-02f, -3.452642355e-02f, -9.010081316e-03f, +2.374979859e-02f, -9.380667497e-03f, -6.565623334e-03f, +8.210208070e-03f, -1.503619232e-03f, -2.562063634e-03f, +1.735827739e-03f, +1.344290287e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.061593068e-05f, -7.696301166e-05f, +1.013477763e-04f, +8.727150786e-05f, -3.934637232e-04f, +3.077335173e-04f, +4.722872316e-04f, -1.193300107e-03f, +4.695908602e-04f, +1.729800256e-03f, -2.848050543e-03f, -1.050742777e-04f, +6.021128903e-03f, -7.029663496e-03f, -1.674331867e-02f, +3.741991540e-03f, +1.703201199e-02f, +1.681308471e-03f, -5.658341220e-03f, +2.185955052e-03f, +1.561699363e-03f, -2.069702749e-03f, +4.180496835e-04f, +8.317518661e-04f, -7.069658116e-04f, +1.106118323e-05f, +3.121672704e-04f, -1.747312493e-04f, -2.162417585e-05f, +6.135872231e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.011279746e-04f, -1.276768860e-03f, -4.072314483e-04f, +5.068473347e-03f, -6.754203310e-03f, -1.630516961e-03f, +1.542743931e-02f, -1.693789334e-02f, -4.075214748e-03f, +3.020891721e-02f, -2.903361569e-02f, -7.233938712e-03f, +4.367937612e-02f, -3.755769556e-02f, -9.723512442e-03f, +4.898773536e-02f, -3.795789472e-02f, -1.014889134e-02f, +4.314870570e-02f, -3.006055650e-02f, -8.196886804e-03f, +2.939165473e-02f, -1.817482392e-02f, -4.928885556e-03f, +1.465229990e-02f, -7.779783213e-03f, -1.960807025e-03f, +4.557180766e-03f, -1.872637353e-03f, -1.344290287e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.061593068e-05f, +9.877768243e-05f, -1.973171607e-04f, +5.099210984e-05f, +4.302989061e-04f, -7.622407565e-04f, +2.344026744e-04f, +1.029512157e-03f, -1.689302989e-03f, +5.275000579e-04f, +1.735447020e-03f, -2.675337866e-03f, +8.250880908e-04f, +2.231340502e-03f, -3.250617563e-03f, +9.822464652e-04f, +2.250247059e-03f, -3.102478442e-03f, +9.165682554e-04f, +1.777902771e-03f, -2.314942528e-03f, +6.693641742e-04f, +1.066219067e-03f, -1.302204225e-03f, +3.705846943e-04f, +4.429334640e-04f, -4.992023741e-04f, +1.424831887e-04f, +9.200096162e-05f, -6.135872231e-05f, +0.000000000e+00f,\n    /* 11,28 (32) */\n    +0.000000000e+00f, -4.905120440e-04f, +6.445974527e-04f, +1.224919457e-03f, -3.838707398e-03f, +1.708302327e-03f, +7.050091267e-03f, -1.217564313e-02f, -2.462624541e-04f, +2.407767758e-02f, -2.679349028e-02f, -1.496342877e-02f, +6.856813267e-02f, -5.209576810e-02f, -9.228159561e-02f, +3.550525770e-01f, +6.287589571e-01f, +2.177204822e-01f, -1.268113464e-01f, -4.069544625e-03f, +5.881843537e-02f, -3.296472419e-02f, -1.107978407e-02f, +2.416784827e-02f, -8.548915631e-03f, -7.272589145e-03f, +8.221269253e-03f, -1.191451962e-03f, -2.736794883e-03f, +1.714203563e-03f, +7.480162519e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.254897547e-05f, -7.642169036e-05f, +9.250770446e-05f, +1.004924917e-04f, -3.899111944e-04f, +2.719622451e-04f, +5.105391625e-04f, -1.167696943e-03f, +3.649652725e-04f, +1.801924571e-03f, -2.732434021e-03f, -3.720022736e-04f, +6.071009941e-03f, -6.421979990e-03f, -1.692510800e-02f, +2.919891436e-03f, +1.714708762e-02f, +2.247317239e-03f, -5.782570238e-03f, +1.996824487e-03f, +1.725563159e-03f, -2.066147209e-03f, +3.288066269e-04f, +8.842964323e-04f, -6.934417111e-04f, -2.266695685e-05f, +3.259961039e-04f, -1.686716379e-04f, -3.012550886e-05f, +6.409736252e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.905120440e-04f, -1.177991178e-03f, -6.045486089e-04f, +5.119465457e-03f, -6.323904404e-03f, -2.392757717e-03f, +1.566184199e-02f, -1.590838118e-02f, -5.764517736e-03f, +3.073641726e-02f, -2.729816867e-02f, -9.909276578e-03f, +4.450446421e-02f, -3.532635506e-02f, -1.297413000e-02f, +4.996998183e-02f, -3.570764766e-02f, -1.325136978e-02f, +4.406527396e-02f, -2.828265373e-02f, -1.051182933e-02f, +3.006101891e-02f, -1.710860485e-02f, -6.231089781e-03f, +1.502288459e-02f, -7.336849749e-03f, -2.460009399e-03f, +4.699663955e-03f, -1.780636391e-03f, -7.480162519e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.254897547e-05f, +1.000372204e-04f, -1.872098875e-04f, +2.630151461e-05f, +4.477545695e-04f, -7.359451690e-04f, +1.622460947e-04f, +1.082864033e-03f, -1.643258051e-03f, +3.900495221e-04f, +1.837746491e-03f, -2.615239996e-03f, +6.306877531e-04f, +2.375482011e-03f, -3.190373477e-03f, +7.684716360e-04f, +2.407533414e-03f, -3.056649812e-03f, +7.318830510e-04f, +1.912507091e-03f, -2.290358631e-03f, +5.462267062e-04f, +1.155086836e-03f, -1.295421288e-03f, +3.109239366e-04f, +4.856505384e-04f, -5.011354274e-04f, +1.249331840e-04f, +1.046204324e-04f, -6.409736252e-05f, +0.000000000e+00f,\n    /* 11,29 (32) */\n    +0.000000000e+00f, -4.779630685e-04f, +5.681757623e-04f, +1.317427161e-03f, -3.738214906e-03f, +1.318391133e-03f, +7.322053512e-03f, -1.166510396e-02f, -1.413959398e-03f, +2.444264285e-02f, -2.499156571e-02f, -1.769586280e-02f, +6.819613039e-02f, -4.602475816e-02f, -9.870357560e-02f, +3.381274690e-01f, +6.316788485e-01f, +2.348675698e-01f, -1.245640291e-01f, -9.852114863e-03f, +6.081525986e-02f, -3.123916103e-02f, -1.314593127e-02f, +2.449665490e-02f, -7.664619199e-03f, -7.966030856e-03f, +8.198602296e-03f, -8.654558578e-04f, -2.905466521e-03f, +1.684078054e-03f, +1.388989877e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.430408636e-05f, -7.553797284e-05f, +8.356437160e-05f, +1.128923987e-04f, -3.848313325e-04f, +2.359276916e-04f, +5.458894262e-04f, -1.137936565e-03f, +2.609432477e-04f, +1.865543218e-03f, -2.608437499e-03f, -6.317624037e-04f, +6.096990672e-03f, -5.813820907e-03f, -1.706918873e-02f, +2.090711636e-03f, +1.722636945e-02f, +2.823957673e-03f, -5.887591478e-03f, +1.795762098e-03f, +1.885818684e-03f, -2.054193084e-03f, +2.364255892e-04f, +9.343269739e-04f, -6.767344434e-04f, -5.713788228e-05f, +3.388095256e-04f, -1.616746057e-04f, -3.880427232e-05f, +6.663390283e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.779630685e-04f, -1.077953958e-03f, -7.917584964e-04f, +5.145766972e-03f, -5.876149835e-03f, -3.128702886e-03f, +1.582408808e-02f, -1.482551715e-02f, -7.407775787e-03f, +3.112646679e-02f, -2.546042218e-02f, -1.252451657e-02f, +4.513515197e-02f, -3.295087304e-02f, -1.616450348e-02f, +5.073845346e-02f, -3.330011425e-02f, -1.630801959e-02f, +4.479715701e-02f, -2.637014664e-02f, -1.280218796e-02f, +3.060724561e-02f, -1.595351802e-02f, -7.526511069e-03f, +1.533380853e-02f, -6.851199210e-03f, -2.961144826e-03f, +4.824597139e-03f, -1.676015959e-03f, -1.388989877e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.430408636e-05f, +1.006917880e-04f, -1.765332510e-04f, +2.197657769e-06f, +4.627477756e-04f, -7.068891457e-04f, +9.062683597e-05f, +1.130665368e-03f, -1.590601295e-03f, +2.523248602e-04f, +1.931200014e-03f, -2.544194950e-03f, +4.344936997e-04f, +2.508884473e-03f, -3.116399721e-03f, +5.513277849e-04f, +2.554662325e-03f, -2.997375566e-03f, +5.430429681e-04f, +2.039701187e-03f, -2.255510631e-03f, +4.193357355e-04f, +1.239998590e-03f, -1.282739667e-03f, +2.487615761e-04f, +5.270616700e-04f, -5.007627948e-04f, +1.062318554e-04f, +1.171768659e-04f, -6.663390283e-05f, +0.000000000e+00f,\n    /* 11,30 (32) */\n    +0.000000000e+00f, -4.636589821e-04f, +4.926377895e-04f, +1.400991533e-03f, -3.625322507e-03f, +9.335598005e-04f, +7.557981204e-03f, -1.111921454e-02f, -2.551895963e-03f, +2.470358610e-02f, -2.312602249e-02f, -2.030430029e-02f, +6.756436799e-02f, -3.992776749e-02f, -1.045173965e-01f, +3.210582802e-01f, +6.337695601e-01f, +2.520939393e-01f, -1.217400715e-01f, -1.573970634e-02f, +6.261102195e-02f, -2.935334235e-02f, -1.520012436e-02f, +2.473308049e-02f, -6.730292225e-03f, -8.642765300e-03f, +8.141464414e-03f, -5.266463322e-04f, -3.067141127e-03f, +1.645273782e-03f, +2.055328905e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.587925964e-05f, -7.432951012e-05f, +7.456199901e-05f, +1.244408611e-04f, -3.782849447e-04f, +1.997856523e-04f, +5.782559362e-04f, -1.104223360e-03f, +1.579283810e-04f, +1.920567935e-03f, -2.476704058e-03f, -8.835284387e-04f, +6.099553942e-03f, -5.206873907e-03f, -1.717552527e-02f, +1.256459939e-03f, +1.726928183e-02f, +3.409766865e-03f, -5.972562914e-03f, +1.583294811e-03f, +2.041759800e-03f, -2.033724933e-03f, +1.412211116e-04f, +9.815841830e-04f, -6.568429598e-04f, -9.222254628e-05f, +3.505241726e-04f, -1.537432642e-04f, -4.762523496e-05f, +6.894654851e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.636589821e-04f, -9.772621697e-04f, -9.682917474e-04f, +5.147964629e-03f, -5.413402059e-03f, -3.835592032e-03f, +1.591471492e-02f, -1.369485178e-02f, -8.998377082e-03f, +3.137879165e-02f, -2.352922217e-02f, -1.506871152e-02f, +4.556964567e-02f, -3.044198857e-02f, -1.928090320e-02f, +5.128978125e-02f, -3.074545192e-02f, -1.930539516e-02f, +4.534019998e-02f, -2.433044545e-02f, -1.505769859e-02f, +3.102658135e-02f, -1.471351943e-02f, -8.809250736e-03f, +1.558257011e-02f, -6.324137540e-03f, -3.461907621e-03f, +4.930828994e-03f, -1.558839093e-03f, -2.055328905e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.587925964e-05f, +1.007616128e-04f, -1.653604951e-04f, -2.121927248e-05f, +4.752661866e-04f, -6.752609872e-04f, +1.985905989e-05f, +1.172783428e-03f, -1.531648112e-03f, +1.149374980e-04f, +2.015469923e-03f, -2.462586420e-03f, +2.373751464e-04f, +2.630996745e-03f, -3.029040832e-03f, +3.317666361e-04f, +2.690969630e-03f, -2.924870034e-03f, +3.508593867e-04f, +2.158870932e-03f, -2.210463330e-03f, +2.892181057e-04f, +1.320520896e-03f, -1.264126917e-03f, +1.843390432e-04f, +5.669451485e-04f, -4.980291667e-04f, +8.643911408e-05f, +1.296007205e-04f, -6.894654851e-05f, +0.000000000e+00f,\n    /* 11,31 (32) */\n    +0.000000000e+00f, -4.477797225e-04f, +4.183082794e-04f, +1.475553532e-03f, -3.500881646e-03f, +5.552748558e-04f, +7.757766856e-03f, -1.054095860e-02f, -3.656119323e-03f, +2.486151448e-02f, -2.120545456e-02f, -2.278100435e-02f, +6.668083955e-02f, -3.382821355e-02f, -1.097242704e-01f, +3.038827550e-01f, +6.350260201e-01f, +2.693632211e-01f, -1.183303046e-01f, -2.171226926e-02f, +6.419431677e-02f, -2.731158255e-02f, -1.723384929e-02f, +2.487430160e-02f, -5.748708042e-03f, -9.299608260e-03f, +8.049241867e-03f, -1.761221597e-04f, -3.220884391e-03f, +1.597648547e-03f, +2.744794391e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.727359999e-05f, -7.281496347e-05f, +6.554370115e-05f, +1.351121395e-04f, -3.703376314e-04f, +1.636888179e-04f, +6.075706714e-04f, -1.066773732e-03f, +5.631255252e-05f, +1.966945911e-03f, -2.337894363e-03f, -1.126519703e-03f, +6.079250102e-03f, -4.602800923e-03f, -1.724418689e-02f, +4.191591060e-04f, +1.727534696e-02f, +4.003233266e-03f, -6.036694190e-03f, +1.360003080e-03f, +2.192683832e-03f, -2.004659355e-03f, +4.352543003e-05f, +1.025814987e-03f, -6.337796691e-04f, -1.277861936e-04f, +3.610593840e-04f, -1.448851155e-04f, -5.655131412e-05f, +7.101387684e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.477797225e-04f, -8.765005569e-04f, -1.133652243e-03f, +5.126745357e-03f, -4.938135872e-03f, -4.510853019e-03f, +1.593457398e-02f, -1.252206835e-02f, -1.053002519e-02f, +3.149372914e-02f, -2.151375224e-02f, -1.753129794e-02f, +4.580702081e-02f, -2.781099183e-02f, -2.230994403e-02f, +5.162154789e-02f, -2.805448229e-02f, -2.223026519e-02f, +4.569105936e-02f, -2.217157452e-02f, -1.726816192e-02f, +3.131579945e-02f, -1.339299853e-02f, -1.007337765e-02f, +1.576690915e-02f, -5.757192392e-03f, -3.959936788e-03f, +5.017268108e-03f, -1.429238372e-03f, -2.744794391e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.727359999e-05f, +1.002695547e-04f, -1.537652081e-04f, -4.385512737e-05f, +4.853095666e-04f, -6.412573280e-04f, -4.975225277e-05f, +1.209113201e-03f, -1.466738437e-03f, -2.150884940e-05f, +2.090262312e-03f, -2.370842601e-03f, +4.020126626e-05f, +2.741319471e-03f, -2.928700180e-03f, +1.107507574e-04f, +2.815838079e-03f, -2.839407163e-03f, +1.561627150e-04f, +2.269433978e-03f, -2.155328008e-03f, +1.564208422e-04f, +1.396234898e-03f, -1.239577499e-03f, +1.179125761e-04f, +6.050820446e-04f, -4.928895181e-04f, +6.562212109e-05f, +1.418209216e-04f, -7.101387684e-05f, +0.000000000e+00f,\n    /* 12, 0 (28) */\n    +2.536797823e-04f, +1.717120723e-03f, -4.267889081e-03f, +2.769345327e-03f, +5.951433797e-03f, -1.603584821e-02f, +1.292106340e-02f, +1.223371165e-02f, -4.454238865e-02f, +4.565217930e-02f, +1.809825863e-02f, -1.393967437e-01f, +2.613999239e-01f, +6.871774778e-01f, +2.613999239e-01f, -1.393967437e-01f, +1.809825863e-02f, +4.565217930e-02f, -4.454238865e-02f, +1.223371165e-02f, +1.292106340e-02f, -1.603584821e-02f, +5.951433797e-03f, +2.769345327e-03f, -4.267889081e-03f, +1.717120723e-03f, +2.536797823e-04f, -4.307376863e-04f,\n    -8.526960746e-05f, +7.926299444e-05f, +1.318301341e-04f, -4.772958510e-04f, +5.158670931e-04f, +2.137625121e-04f, -1.439760328e-03f, +1.848238513e-03f, -3.735582438e-05f, -3.629437058e-03f, +5.880531475e-03f, -1.163826103e-03f, -2.009118504e-02f, -5.299098635e-04f, +2.017288707e-02f, +1.861481453e-03f, -6.119451369e-03f, +3.497362304e-03f, +2.476320516e-04f, -1.945437062e-03f, +1.410425884e-03f, -1.423394688e-04f, -5.578184186e-04f, +4.775685101e-04f, -1.149719352e-04f, -9.125701215e-05f, +8.822150698e-05f, -2.745459118e-05f,\n    -2.536797823e-04f, -1.150482282e-03f, +5.406716708e-03f, -7.717177369e-03f, +1.823839110e-03f, +1.228216497e-02f, -2.346784071e-02f, +1.698003719e-02f, +9.330273566e-03f, -3.702545451e-02f, +4.007418410e-02f, -9.979930894e-03f, -3.212484989e-02f, +5.173229864e-02f, -3.212484989e-02f, -9.979930894e-03f, +4.007418410e-02f, -3.702545451e-02f, +9.330273566e-03f, +1.698003719e-02f, -2.346784071e-02f, +1.228216497e-02f, +1.823839110e-03f, -7.717177369e-03f, +5.406716708e-03f, -1.150482282e-03f, -7.255512597e-04f, +4.307376863e-04f,\n    +8.526960746e-05f, -1.854904982e-04f, +3.237785643e-05f, +4.455277979e-04f, -9.335634383e-04f, +7.835579473e-04f, +3.394120637e-04f, -1.815168006e-03f, +2.293903971e-03f, -8.991337447e-04f, -1.663773246e-03f, +3.389161541e-03f, -2.669210172e-03f, -1.289232061e-04f, +2.834582782e-03f, -3.352244024e-03f, +1.472695063e-03f, +1.092228303e-03f, -2.364105091e-03f, +1.751821072e-03f, -2.249406299e-04f, -8.609019613e-04f, +9.443600182e-04f, -4.163629789e-04f, -6.280130302e-05f, +1.995966708e-04f, -1.186846730e-04f, +2.745459118e-05f,\n    /* 12, 1 (28) */\n    +1.684101748e-04f, +1.796383717e-03f, -4.136058947e-03f, +2.292049476e-03f, +6.467300890e-03f, -1.582208569e-02f, +1.148130307e-02f, +1.408195016e-02f, -4.457974447e-02f, +4.202274224e-02f, +2.397879011e-02f, -1.405605698e-01f, +2.413087388e-01f, +6.866475680e-01f, +2.815728109e-01f, -1.375352622e-01f, +1.197880726e-02f, +4.914954161e-02f, -4.429475660e-02f, +1.028827459e-02f, +1.433148928e-02f, -1.617818768e-02f, +5.393615378e-03f, +3.246913837e-03f, -4.382861017e-03f, +1.625863710e-03f, +3.419012893e-04f, -4.581922775e-04f,\n    -8.197548550e-05f, +6.730415010e-05f, +1.475049942e-04f, -4.747226022e-04f, +4.725039166e-04f, +2.825427336e-04f, -1.461742008e-03f, +1.744506828e-03f, +1.687035297e-04f, -3.742165744e-03f, +5.621703527e-03f, -4.848968310e-04f, -1.996025146e-02f, -1.588226575e-03f, +2.020456610e-02f, +2.575877161e-03f, -6.336929088e-03f, +3.346114859e-03f, +4.612341352e-04f, -2.035505433e-03f, +1.373719731e-03f, -6.856006816e-05f, -5.981149961e-04f, +4.754753349e-04f, -9.698124191e-05f, -1.032215887e-04f, +9.079849612e-05f, -2.643210268e-05f,\n    -1.684101748e-04f, -1.335972780e-03f, +5.439094564e-03f, -7.271649571e-03f, +8.902756715e-04f, +1.306572292e-02f, -2.312842865e-02f, +1.516486918e-02f, +1.162417754e-02f, -3.792458825e-02f, +3.841041086e-02f, -6.590769352e-03f, -3.479406006e-02f, +5.160337544e-02f, -2.929026710e-02f, -1.333217492e-02f, +4.154687917e-02f, -3.593322620e-02f, +6.966168475e-03f, +1.873185826e-02f, -2.369278134e-02f, +1.142126301e-02f, +2.768199128e-03f, -8.133540348e-03f, +5.343915405e-03f, -9.508856112e-04f, -8.442359327e-04f, +4.581922775e-04f,\n    +8.197548550e-05f, -1.708411199e-04f, +2.693099346e-06f, +4.716071764e-04f, -9.181381898e-04f, +7.035481900e-04f, +4.504588533e-04f, -1.868519948e-03f, +2.212789912e-03f, -7.030032145e-04f, -1.845359890e-03f, +3.408857351e-03f, -2.490700469e-03f, -3.861118649e-04f, +2.985948991e-03f, -3.298229076e-03f, +1.273052197e-03f, +1.281268207e-03f, -2.422921794e-03f, +1.678687701e-03f, -1.075964685e-04f, -9.351215115e-04f, +9.503729501e-04f, -3.841981137e-04f, -9.381007205e-05f, +2.130536507e-04f, -1.198041350e-04f, +2.643210268e-05f,\n    /* 12, 2 (28) */\n    +8.643468934e-05f, +1.863687867e-03f, -3.988553953e-03f, +1.817326873e-03f, +6.939804807e-03f, -1.553954296e-02f, +1.001956106e-02f, +1.582645699e-02f, -4.441104094e-02f, +3.828057650e-02f, +2.960049363e-02f, -1.410454666e-01f, +2.213484874e-01f, +6.850593414e-01f, +3.017773770e-01f, -1.349593851e-01f, +5.641878176e-03f, +5.249565646e-02f, -4.383352246e-02f, +8.252769153e-03f, +1.570520902e-02f, -1.624674774e-02f, +4.795500382e-03f, +3.722389172e-03f, -4.479842259e-03f, +1.522642122e-03f, +4.326997854e-04f, -4.846243802e-04f,\n    -7.837259355e-05f, +5.544275033e-05f, +1.619532692e-04f, -4.699237877e-04f, +4.279728673e-04f, +3.484126929e-04f, -1.476424179e-03f, +1.634857349e-03f, +3.696919477e-04f, -3.835463284e-03f, +5.344548510e-03f, +1.734178923e-04f, -1.978103177e-02f, -2.642039421e-03f, +2.018558845e-02f, +3.304936433e-03f, -6.531484372e-03f, +3.175957353e-03f, +6.772374843e-04f, -2.117868078e-03f, +1.329658048e-03f, +7.271196806e-06f, -6.365162621e-04f, +4.709614541e-04f, -7.791644304e-05f, -1.150900565e-04f, +9.296887939e-05f, -2.515381512e-05f,\n    -8.643468934e-05f, -1.506813900e-03f, +5.441787664e-03f, -6.800042395e-03f, -2.786251825e-05f, +1.376927111e-02f, -2.267796980e-02f, +1.329634923e-02f, +1.383696745e-02f, -3.862759146e-02f, +3.656505097e-02f, -3.181912001e-03f, -3.728476053e-02f, +5.121726357e-02f, -2.630431811e-02f, -1.663040399e-02f, +4.281993136e-02f, -3.465195799e-02f, +4.543246681e-03f, +2.041054596e-02f, -2.380037781e-02f, +1.048614150e-02f, +3.718572078e-03f, -8.517738462e-03f, +5.250105333e-03f, -7.378319605e-04f, -9.640400678e-04f, +4.846243802e-04f,\n    +7.837259355e-05f, -1.557543963e-04f, -2.610804149e-05f, +4.945347714e-04f, -8.982611748e-04f, +6.213378295e-04f, +5.575549909e-04f, -1.911723046e-03f, +2.121286551e-03f, -5.048633795e-04f, -2.016582388e-03f, +3.411296493e-03f, -2.299989110e-03f, -6.413306954e-04f, +3.122510283e-03f, -3.227329962e-03f, +1.065821184e-03f, +1.465248192e-03f, -2.469937770e-03f, +1.596030675e-03f, +1.204521806e-05f, -1.005766924e-03f, +9.514704756e-04f, -3.491375938e-04f, -1.252430481e-04f, +2.257559918e-04f, -1.201746071e-04f, +2.515381512e-05f,\n    /* 12, 3 (28) */\n    +8.062095791e-06f, +1.919130618e-03f, -3.826600684e-03f, +1.347403086e-03f, +7.367777674e-03f, -1.519113027e-02f, +8.543136885e-03f, +1.746131434e-02f, -4.404134900e-02f, +3.444511322e-02f, +3.494504214e-02f, -1.408720487e-01f, +2.015674556e-01f, +6.824173020e-01f, +3.219629655e-01f, -1.316544486e-01f, -8.896061963e-04f, +5.567161382e-02f, -4.315628498e-02f, +6.134901075e-03f, +1.703486706e-02f, -1.623947655e-02f, +4.158984120e-03f, +4.193350626e-03f, -4.557758702e-03f, +1.407552065e-03f, +5.256686648e-04f, -5.097781953e-04f,\n    -7.449492353e-05f, +4.373845388e-05f, +1.751393235e-04f, -4.629835816e-04f, +3.825177745e-04f, +4.111248556e-04f, -1.483893463e-03f, +1.519920503e-03f, +5.647954722e-04f, -3.909331578e-03f, +5.050687187e-03f, +8.093325730e-04f, -1.955462103e-02f, -3.688363072e-03f, +2.011548148e-02f, +4.046497979e-03f, -6.701697695e-03f, +2.987242269e-03f, +8.946875297e-04f, -2.191974093e-03f, +1.278292778e-03f, +8.483291066e-05f, -6.727852572e-04f, +4.639829239e-04f, -5.784337511e-05f, -1.267940064e-04f, +9.470218299e-05f, -2.361553000e-05f,\n    -8.062095791e-06f, -1.662568296e-03f, +5.415679622e-03f, -6.305507623e-03f, -9.261236930e-04f, +1.439060894e-02f, -2.212041481e-02f, +1.138462619e-02f, +1.595825400e-02f, -3.913245484e-02f, +3.454846858e-02f, +2.293844911e-04f, -3.958474964e-02f, +5.057593288e-02f, -2.318180783e-02f, -1.985773396e-02f, +4.388575255e-02f, -3.318670980e-02f, +2.073308911e-03f, +2.200657664e-02f, -2.378833259e-02f, +9.480374572e-03f, +4.670042554e-03f, -8.866876055e-03f, +5.124862285e-03f, -5.120759688e-04f, -1.084214675e-03f, +5.097781953e-04f,\n    +7.449492353e-05f, -1.403354128e-04f, -5.388970461e-05f, +5.142632352e-04f, -8.741298214e-04f, +5.373958055e-04f, +6.602028232e-04f, -1.944678327e-03f, +2.019966433e-03f, -3.057434476e-04f, -2.176626640e-03f, +3.396533172e-03f, -2.098072660e-03f, -8.932778993e-04f, +3.243543226e-03f, -3.139848145e-03f, +8.520233772e-04f, +1.643181823e-03f, -2.504794604e-03f, +1.504166230e-03f, +1.333887276e-04f, -1.072400192e-03f, +9.475452486e-04f, -3.113046415e-04f, -1.569321239e-04f, +2.375994722e-04f, -1.197612733e-04f, +2.361553000e-05f,\n    /* 12, 4 (28) */\n    -6.643282774e-05f, +1.962869071e-03f, -3.651461360e-03f, +8.844195042e-04f, +7.750295448e-03f, -1.478000541e-02f, +7.059243422e-03f, +1.898123484e-02f, -4.347655352e-02f, +3.053578164e-02f, +3.999572933e-02f, -1.400627162e-01f, +1.820128346e-01f, +6.787289389e-01f, +3.420784470e-01f, -1.276079507e-01f, -7.591303891e-03f, +5.865885609e-02f, -4.226159745e-02f, +3.942926982e-03f, +1.831315984e-02f, -1.615464364e-02f, +3.486198863e-03f, +4.657333550e-03f, -4.615602077e-03f, +1.280758059e-03f, +6.203708478e-04f, -5.333937253e-04f,\n    -7.037678577e-05f, +3.224806064e-05f, +1.870351037e-04f, -4.539946472e-04f, +3.363811173e-04f, +4.704523592e-04f, -1.484268751e-03f, +1.400338575e-03f, +7.532431649e-04f, -3.963857823e-03f, +4.741772964e-03f, +1.421169971e-03f, -1.928225905e-02f, -4.724238005e-03f, +1.999393623e-02f, +4.798322993e-03f, -6.846216993e-03f, +2.780412143e-03f, +1.112603523e-03f, -2.257300314e-03f, +1.219712128e-03f, +1.637879495e-04f, -7.066899060e-04f, +4.545072392e-04f, -3.683518294e-05f, -1.382636177e-04f, +9.596938431e-05f, -2.181467077e-05f,\n    +6.643282774e-05f, -1.802903709e-03f, +5.361789918e-03f, -5.791244388e-03f, -1.800253514e-03f, +1.492800474e-02f, -2.146021198e-02f, +9.439947860e-03f, +1.797822043e-02f, -3.943819829e-02f, +3.237184194e-02f, +3.625917663e-03f, -4.168282230e-02f, +4.968265498e-02f, -1.993826460e-02f, -2.299758210e-02f, +4.473777593e-02f, -3.154352798e-02f, -4.314856932e-04f, +2.351074287e-02f, -2.365494387e-02f, +8.407974380e-03f, +5.617587802e-03f, -9.178180697e-03f, +4.967930161e-03f, -2.744764966e-04f, -1.203975948e-03f, +5.333937253e-04f,\n    +7.037678577e-05f, -1.246878551e-04f, -8.052564960e-05f, +5.307640527e-04f, -8.459605991e-04f, +4.521922591e-04f, +7.579353121e-04f, -1.967341574e-03f, +1.909447527e-03f, -1.066697545e-04f, -2.324740980e-03f, +3.364710146e-03f, -1.886003496e-03f, -1.140668745e-03f, +3.348403385e-03f, -3.036172011e-03f, +6.327198303e-04f, +1.814106837e-03f, -2.527194232e-03f, +1.403462982e-03f, +2.558207948e-04f, -1.134597567e-03f, +9.385154098e-04f, -2.708410303e-04f, -1.887030176e-04f, +2.484817892e-04f, -1.185333513e-04f, +2.181467077e-05f,\n    /* 12, 5 (28) */\n    -1.368096135e-04f, +1.995117132e-03f, -3.464426257e-03f, +4.304248570e-04f, +8.086676566e-03f, -1.430955305e-02f, +5.574974672e-03f, +2.038157341e-02f, -4.272331036e-02f, +2.657192382e-02f, +4.473750230e-02f, -1.386415462e-01f, +1.627305755e-01f, +6.740047009e-01f, +3.620723832e-01f, -1.228096277e-01f, -1.443752088e-02f, +6.143926823e-02f, -4.114899392e-02f, +1.685626668e-03f, +1.953287197e-02f, -1.599085569e-02f, +2.779508957e-03f, +5.111840789e-03f, -4.652437260e-03f, +1.142494441e-03f, +7.163402321e-04f, -5.552083961e-04f,\n    -6.605259312e-05f, +2.102528838e-05f, +1.976200705e-04f, -4.430574496e-04f, +2.898028574e-04f, +5.261896628e-04f, -1.477699978e-03f, +1.276762484e-03f, +9.343097736e-04f, -3.999212509e-03f, +4.419484716e-03f, +2.007365906e-03f, -1.896532500e-02f, -5.746740681e-03f, +1.982080948e-02f, +5.558102500e-03f, -6.963764219e-03f, +2.555999392e-03f, +1.329982526e-03f, -2.313354339e-03f, +1.154040886e-03f, +2.437847990e-04f, -7.380043028e-04f, +4.425137977e-04f, -1.497213655e-05f, -1.494280070e-04f, +9.674314000e-05f, -1.975036269e-05f,\n    +1.368096135e-04f, -1.927591564e-03f, +5.281264268e-03f, -5.260480335e-03f, -2.646214113e-03f, +1.538019700e-02f, -2.070227667e-02f, +7.472606287e-03f, +1.988766796e-02f, -3.954486805e-02f, +3.004710096e-02f, +6.990627809e-03f, -4.356882579e-02f, +4.854198623e-02f, -1.658986122e-02f, -2.603375411e-02f, +4.537049576e-02f, -2.972942114e-02f, -2.958679925e-03f, +2.491420585e-02f, -2.339912307e-02f, +7.273376813e-03f, +6.556103212e-03f, -9.449021727e-03f, +4.779227143e-03f, -2.599470746e-05f, -1.322509300e-03f, +5.552083961e-04f,\n    +6.605259312e-05f, -1.089134097e-04f, -1.058997420e-04f, +5.440272734e-04f, -8.139874555e-04f, +3.661959696e-04f, +8.503180963e-04f, -1.979722913e-03f, +1.790389534e-03f, +9.133959482e-05f, -2.460239749e-03f, +3.316057636e-03f, -1.664884210e-03f, -1.382242268e-03f, +3.436528816e-03f, -2.916775147e-03f, +4.090059313e-04f, +1.977090400e-03f, -2.536901083e-03f, +1.294340562e-03f, +3.787136644e-04f, -1.191952126e-03f, +9.243255382e-04f, -2.279066910e-04f, -2.203761488e-04f, +2.583032615e-04f, -1.164644421e-04f, +1.975036269e-05f,\n    /* 12, 6 (28) */\n    -2.028622066e-04f, +2.016142420e-03f, -3.266806186e-03f, -1.263259257e-05f, +8.376479423e-03f, -1.378336339e-02f, +4.097274693e-03f, +2.165833590e-02f, -4.178900058e-02f, +2.257271131e-02f, +4.915698701e-02f, -1.366341803e-01f, +1.437652505e-01f, +6.682579602e-01f, +3.818931927e-01f, -1.172515252e-01f, -2.140128510e-02f, +6.399526762e-02f, -3.981901140e-02f, -6.277276711e-04f, +2.068691286e-02f, -1.574707089e-02f, +2.041504654e-03f, +5.554354587e-03f, -4.667409396e-03f, +9.930664343e-04f, +8.130833721e-04f, -5.749587588e-04f,\n    -6.155665152e-05f, +1.012057341e-05f, +2.068810931e-04f, -4.302795444e-04f, +2.430193108e-04f, +5.781530785e-04f, -1.464366781e-03f, +1.149848588e-03f, +1.107318143e-03f, -4.015647081e-03f, +4.085519624e-03f, +2.566473571e-03f, -1.860533153e-02f, -6.752993596e-03f, +1.959612522e-02f, +6.323465047e-03f, -7.053141674e-03f, +2.314625740e-03f, +1.545803574e-03f, -2.359677465e-03f, +1.081440572e-03f, +3.244589710e-04f, -7.665099949e-04f, +4.279943131e-04f, +7.658595322e-06f, -1.602155927e-04f, +9.699801152e-05f, -1.742350407e-05f,\n    +2.028622066e-04f, -2.036504974e-03f, +5.175364526e-03f, -4.716453062e-03f, -3.460201569e-03f, +1.574639297e-02f, -1.985195857e-02f, +5.492883374e-03f, +2.167805749e-02f, -3.945352845e-02f, +2.758686121e-02f, +1.030668545e-02f, -4.523371000e-02f, +4.715974396e-02f, -1.315333240e-02f, -2.895052926e-02f, +4.577950169e-02f, -2.775233074e-02f, -5.495581009e-03f, +2.620854641e-02f, -2.302040941e-02f, +6.081424687e-03f, +7.480428750e-03f, -9.676928418e-03f, +4.558850994e-03f, +2.323085540e-04f, -1.438973742e-03f, +5.749587588e-04f,\n    +6.155665152e-05f, -9.311119447e-05f, -1.299063660e-04f, +5.540611438e-04f, -7.784601854e-04f, +2.798718401e-04f, +9.369513494e-04f, -1.981886117e-03f, +1.663490005e-03f, +2.872800010e-04f, -2.582506499e-03f, +3.250891791e-03f, -1.435861754e-03f, -1.616767842e-03f, +3.507443127e-03f, -2.782214148e-03f, +1.820058337e-04f, +2.131234238e-03f, -2.533743915e-03f, +1.177267952e-03f, +5.014282841e-04f, -1.244076270e-03f, +9.049474690e-04f, -1.826792043e-04f, -2.517675669e-04f, +2.669675349e-04f, -1.135328592e-04f, +1.742350407e-05f,\n    /* 12, 7 (28) */\n    -2.644188582e-04f, +2.026262994e-03f, -3.059925093e-03f, -4.429121370e-04f, +8.619498734e-03f, -1.320521031e-02f, +2.632907913e-03f, +2.280818449e-02f, -4.068168244e-02f, +1.855706423e-02f, +5.324250664e-02f, -1.340677067e-01f, +1.251599190e-01f, +6.615049666e-01f, +4.014893179e-01f, -1.109280601e-01f, -2.845442678e-02f, +6.630989336e-02f, -3.827320782e-02f, -2.987405136e-03f, +2.176835343e-02f, -1.542261192e-02f, +1.274994659e-03f, +5.982348900e-03f, -4.659750801e-03f, +8.328508416e-04f, +9.100813836e-04f, -5.923822628e-04f,\n    -5.692295785e-05f, -4.191045679e-07f, +2.148123063e-04f, -4.157748484e-04f, +1.962620639e-04f, +6.261811852e-04f, -1.444477025e-03f, +1.020255514e-03f, +1.271641366e-03f, -4.013491294e-03f, +3.741586035e-03f, +3.097167353e-03f, -1.820391845e-02f, -7.740175145e-03f, +1.932007553e-02f, +7.091984704e-03f, -7.113238123e-03f, +2.057001262e-03f, +1.759031996e-03f, -2.395847519e-03f, +1.002109424e-03f, +4.054345159e-04f, -7.919972572e-04f, +4.109531747e-04f, +3.096321530e-05f, -1.705544752e-04f, +9.671068632e-05f, -1.483682833e-05f,\n    +2.644188582e-04f, -2.129616169e-03f, +5.045458160e-03f, -4.162391918e-03f, -4.238661754e-03f, +1.602626481e-02f, -1.891500722e-02f, +3.510997257e-03f, +2.334154750e-02f, -3.916624845e-02f, +2.500435471e-02f, +1.355757724e-02f, -4.666957176e-02f, +4.554297612e-02f, -9.645889277e-03f, -3.173274341e-02f, +4.596150752e-02f, -2.562109651e-02f, -8.029324923e-03f, +2.738581436e-02f, -2.251898112e-02f, +4.837348417e-03f, +8.385376219e-03f, -9.859607622e-03f, +4.307083428e-03f, +4.992760890e-04f, -1.552506601e-03f, +5.923822628e-04f,\n    +5.692295785e-05f, -7.737722171e-05f, -1.524507642e-04f, +5.608916427e-04f, -7.396427412e-04f, +1.936784465e-04f, +1.017471423e-03f, -1.973947623e-03f, +1.529480302e-03f, +4.801655327e-04f, -2.690996815e-03f, +3.169612698e-03f, -1.200121368e-03f, -1.843051590e-03f, +3.560758106e-03f, -2.633125982e-03f, -4.713329735e-05f, +2.275679629e-03f, -2.517617312e-03f, +1.052761539e-03f, +6.233176040e-04f, -1.290604166e-03f, +8.803809735e-04f, -1.353531788e-04f, -2.826899302e-04f, +2.743822870e-04f, -1.097219377e-04f, +1.483682833e-05f,\n    /* 12, 8 (28) */\n    -3.213418160e-04f, +2.025843889e-03f, -2.845112787e-03f, -8.586869854e-04f, +8.815760798e-03f, -1.257902913e-02f, +1.188430887e-03f, +2.382844000e-02f, -3.941004108e-02f, +1.454357293e-02f, +5.698409267e-02f, -1.309705394e-01f, +1.069560005e-01f, +6.537647915e-01f, +4.208093934e-01f, -1.038360754e-01f, -3.556766490e-02f, +6.836689462e-02f, -3.651417583e-02f, -5.383252654e-03f, +2.277046285e-02f, -1.501717740e-02f, +4.829974021e-04f, +6.393302074e-03f, -4.628787586e-03f, +6.622963664e-04f, +1.006792070e-03f, -6.072190912e-04f,\n    -5.218500633e-05f, -1.055037285e-05f, +2.214149336e-04f, -3.996628950e-04f, +1.497569375e-04f, +6.701351241e-04f, -1.418265244e-03f, +8.886410456e-04f, +1.426704663e-03f, -3.993150278e-03f, +3.389396395e-03f, +3.598246142e-03f, -1.776284596e-02f, -8.705529283e-03f, +1.899302076e-02f, +7.861189361e-03f, -7.143034629e-03f, +1.783923012e-03f, +1.968623882e-03f, -2.421481573e-03f, +9.162821881e-04f, +4.863256222e-04f, -8.142663520e-04f, +3.914077491e-04f, +5.484161054e-05f, -1.803728297e-04f, +9.586019359e-05f, -1.199495602e-05f,\n    +3.213418160e-04f, -2.206993390e-03f, +4.893007396e-03f, -3.601500275e-03f, -4.978304495e-03f, +1.621994326e-02f, -1.789753580e-02f, +1.537049634e-03f, +2.487102780e-02f, -3.868608292e-02f, +2.231335790e-02f, +1.672718993e-02f, -4.786969313e-02f, +4.369992453e-02f, -6.085131171e-03f, -3.436586939e-02f, +4.591437422e-02f, -2.334541688e-02f, -1.054694224e-02f, +2.843857590e-02f, -2.189566352e-02f, +3.546744251e-03f, +9.265757193e-03f, -9.994960801e-03f, +4.024393497e-03f, +7.736583760e-04f, -1.662228538e-03f, +6.072190912e-04f,\n    +5.218500633e-05f, -6.180389510e-05f, -1.734493045e-04f, +5.645619254e-04f, -6.978114977e-04f, +1.080656606e-04f, +1.091552273e-03f, -1.956075280e-03f, +1.389121404e-03f, +6.690339518e-04f, -2.785240741e-03f, +3.072701960e-03f, -9.588803138e-04f, -2.059942603e-03f, +3.596175871e-03f, -2.470224928e-03f, -2.772471895e-04f, +2.409612213e-03f, -2.488482851e-03f, +9.213828945e-04f, +7.437299621e-04f, -1.331194103e-03f, +8.506542926e-04f, -8.613951762e-05f, -3.129535284e-04f, +2.804599254e-04f, -1.050203171e-04f, +1.199495602e-05f,\n    /* 12, 9 (28) */\n    -3.735268223e-04f, +2.015293516e-03f, -2.623697853e-03f, -1.258349880e-03f, +8.965517735e-03f, -1.190889400e-02f, -2.298343566e-04f, +2.471708105e-02f, -3.798333641e-02f, +1.055042265e-02f, +6.037348907e-02f, -1.273722932e-01f, +8.919315458e-02f, +6.450592622e-01f, +4.398024142e-01f, -9.597488606e-02f, -4.271069953e-02f, +7.015081764e-02f, -3.454555195e-02f, -7.804734227e-03f, +2.368674504e-02f, -1.453085178e-02f, -3.312689499e-04f, +6.784709823e-03f, -4.573945975e-03f, +4.819235367e-04f, +1.102652264e-03f, -6.192140472e-04f,\n    -4.737560409e-05f, -2.023359148e-05f, +2.266970762e-04f, -3.820680803e-04f, +1.037230035e-04f, +7.098987788e-04f, -1.385990967e-03f, +7.556590677e-04f, +1.571987000e-03f, -3.955101323e-03f, +3.030660260e-03f, +4.068636115e-03f, -1.728398750e-02f, -9.646374929e-03f, +1.861548917e-02f, +8.628569271e-03f, -7.141610102e-03f, +1.496273273e-03f, +2.173530669e-03f, -2.436238526e-03f, +8.242297451e-04f, +5.667383000e-04f, -8.331287663e-04f, +3.693886228e-04f, +7.918770840e-05f, -1.895993105e-04f, +9.442811283e-05f, -8.904436267e-06f,\n    +3.735268223e-04f, -2.268797285e-03f, +4.719558091e-03f, -3.036938350e-03f, -5.676115993e-03f, +1.632800892e-02f, -1.680598353e-02f, -4.190256462e-04f, +2.626014920e-02f, -3.801704897e-02f, +1.952811716e-02f, +1.979989189e-02f, -4.882857344e-02f, +4.163998193e-02f, -2.488955300e-03f, -3.683609432e-02f, +4.563712703e-02f, -2.093580466e-02f, -1.303542509e-02f, +2.935995880e-02f, -2.115193356e-02f, +2.215550148e-03f, +1.011641149e-02f, -1.008110032e-02f, +3.711439969e-03f, +1.054118301e-03f, -1.767248856e-03f, +6.192140472e-04f,\n    +4.737560409e-05f, -4.647954436e-05f, -1.928296731e-04f, +5.651316816e-04f, -6.532534799e-04f, +2.347236056e-05f, +1.158906659e-03f, -1.928486842e-03f, +1.243199610e-03f, +8.529515726e-04f, -2.864844789e-03f, +2.960719855e-03f, -7.133814587e-04f, -2.266338921e-03f, +3.613490558e-03f, -2.294299080e-03f, -5.071604885e-04f, +2.532266599e-03f, -2.446369913e-03f, +7.837362753e-04f, +8.620125415e-04f, -1.365530751e-03f, +8.158245201e-04f, -3.526457500e-05f, -3.423673458e-04f, +2.851182762e-04f, -9.942219887e-05f, +8.904436267e-06f,\n    /* 12,10 (28) */\n    -4.209024264e-04f, +1.995059925e-03f, -2.397000777e-03f, -1.640417961e-03f, +9.069240739e-03f, -1.119899522e-02f, -1.615825324e-03f, +2.547274011e-02f, -3.641134941e-02f, +6.595321331e-03f, +6.340414933e-02f, -1.233036571e-01f, +7.190916708e-02f, +6.354128872e-01f, +4.584179034e-01f, -8.734631679e-02f, -4.985230963e-02f, +7.164709091e-02f, -3.237202128e-02f, -1.024097275e-02f, +2.451097478e-02f, -1.396411348e-02f, -1.164397716e-03f, +7.154098446e-03f, -4.494758267e-03f, +2.923242262e-04f, +1.197080376e-03f, -6.281184835e-04f,\n    -4.252669699e-05f, -2.943295419e-05f, +2.306734722e-04f, -3.631189019e-04f, +5.837165877e-05f, +7.453788393e-04f, -1.347936973e-03f, +6.219565921e-04f, +1.707022422e-03f, -3.899890411e-03f, +2.667077432e-03f, +4.507393009e-03f, -1.676932219e-02f, -1.056011508e-02f, +1.818817593e-02f, +9.391585822e-03f, -7.108146529e-03f, +1.195017402e-03f, +2.372703831e-03f, -2.439821533e-03f, +7.262585434e-04f, +6.462721396e-04f, -8.484084206e-04f, +3.449397811e-04f, +1.038898739e-04f, -1.981634645e-04f, +9.239877388e-05f, -5.573777025e-06f,\n    +4.209024264e-04f, -2.315276830e-03f, +4.526728418e-03f, -2.471806669e-03f, -6.329369473e-03f, +1.635148128e-02f, -1.564707687e-02f, -2.347512488e-03f, +2.750334881e-02f, -3.716409739e-02f, +1.666327237e-02f, +2.276061175e-02f, -4.954195490e-02f, +3.937364301e-02f, +1.124535258e-03f, -3.913039340e-02f, +4.512996655e-02f, -1.840353806e-02f, -1.548179500e-02f, +3.014369507e-02f, -2.028992102e-02f, +8.500193977e-04f, +1.093223601e-02f, -1.011636489e-02f, +3.369072623e-03f, +1.339236578e-03f, -1.866671054e-03f, +6.281184835e-04f,\n    +4.252669699e-05f, -3.148799859e-05f, -2.105309957e-04f, +5.626764120e-04f, -6.062645651e-04f, -5.967576009e-05f, +1.219287120e-03f, -1.891448198e-03f, +1.092522140e-03f, +1.031017933e-03f, -2.929493549e-03f, +2.834302082e-03f, -4.648867336e-04f, -2.461193263e-03f, +3.612589519e-03f, -2.106206468e-03f, -7.356928729e-04f, +2.642930742e-03f, -2.391376140e-03f, +6.404658755e-04f, +9.775148784e-04f, -1.393327309e-03f, +7.759778291e-04f, +1.703079537e-05f, -3.707401563e-04f, +2.882812579e-04f, -9.292757299e-05f, +5.573777025e-06f,\n    /* 12,11 (28) */\n    -4.634291234e-04f, +1.965626971e-03f, -2.166327305e-03f, -2.003536863e-03f, +9.127612398e-03f, -1.045361638e-02f, -2.963762297e-03f, +2.609469671e-02f, -3.470432699e-02f, +2.695430920e-03f, +6.607122676e-02f, -1.187962641e-01f, +5.513984490e-02f, +6.248527722e-01f, +4.766060793e-01f, -7.795473097e-02f, -5.696045616e-02f, +7.284210831e-02f, -2.999931745e-02f, -1.268079429e-02f, +2.523723333e-02f, -1.331784134e-02f, -2.012806137e-03f, +7.499038227e-03f, -4.390868393e-03f, +9.416076170e-05f, +1.289479150e-03f, -6.336922605e-04f,\n    -3.766920629e-05f, -3.811656467e-05f, +2.333652264e-04f, -3.429471964e-04f, +1.390575777e-05f, +7.765047531e-04f, -1.304407456e-03f, +4.881708689e-04f, +1.831401118e-03f, -3.828128510e-03f, +2.300331234e-03f, +4.913703855e-03f, -1.622092695e-02f, -1.144424563e-02f, +1.771194149e-02f, +1.014768050e-02f, -7.041933861e-03f, +8.812012801e-04f, +2.565099662e-03f, -2.431980281e-03f, +6.227098544e-04f, +7.245221393e-04f, -8.599428424e-04f, +3.181187218e-04f, +1.288313475e-04f, -2.059961522e-04f, +8.975944697e-05f, -2.013463527e-06f,\n    +4.634291234e-04f, -2.346764828e-03f, +4.316197423e-03f, -1.909130257e-03f, -6.935634038e-03f, +1.629180552e-02f, -1.442778975e-02f, -4.238960687e-03f, +2.859587095e-02f, -3.613307946e-02f, +1.373377882e-02f, +2.559491383e-02f, -5.000684163e-02f, +3.691244974e-02f, +4.737124778e-03f, -4.123659986e-02f, +4.439427367e-02f, -1.576060732e-02f, -1.787317114e-02f, +3.078416095e-02f, -1.931240614e-02f, -5.433079116e-04f, +1.170821383e-02f, -1.009933410e-02f, +2.998332467e-03f, +1.627517835e-03f, -1.959598627e-03f, +6.336922605e-04f,\n    +3.766920629e-05f, -1.690820033e-05f, -2.265038872e-04f, +5.572866306e-04f, -5.571476709e-04f, -1.409682746e-04f, +1.272486715e-03f, -1.845271380e-03f, +9.379126719e-04f, +1.202370254e-03f, -2.978950855e-03f, +2.694156138e-03f, -2.146705087e-04f, -2.643518461e-03f, +3.593454033e-03f, -1.906870778e-03f, -9.616652248e-04f, +2.740950072e-03f, -2.323667529e-03f, +4.922528271e-04f, +1.089592404e-03f, -1.414327532e-03f, +7.312295386e-04f, +7.049229540e-05f, -3.978816489e-04f, +2.898795343e-04f, -8.554241336e-05f, +2.013463527e-06f,\n    /* 12,12 (28) */\n    -5.010983297e-04f, +1.927510406e-03f, -1.932962079e-03f, -2.346484059e-03f, +9.141518155e-03f, -9.677111632e-03f, -4.268169753e-03f, +2.658286758e-02f, -3.287292587e-02f, -1.132697590e-03f, +6.837155799e-02f, -1.138825602e-01f, +3.891891795e-02f, +6.134085265e-01f, +4.943180208e-01f, -6.780705047e-02f, -6.400239002e-02f, +7.372330959e-02f, -2.743421778e-02f, -1.511277457e-02f, +2.585994318e-02f, -1.259331920e-02f, -2.872748979e-03f, +7.817156949e-03f, -4.262037045e-03f, -1.118353905e-04f, +1.379238597e-03f, -6.357057240e-04f,\n    -3.283287688e-05f, -4.625648846e-05f, +2.347995131e-04f, -3.216873788e-04f, -2.948119133e-05f, +8.032285666e-04f, -1.255726135e-03f, +3.549265999e-04f, +1.944770211e-03f, -3.740487645e-03f, +1.932081960e-03f, +5.286888184e-03f, -1.564096834e-02f, -1.229636377e-02f, +1.718780930e-02f, +1.089428401e-02f, -6.942374530e-03f, +5.559483860e-04f, +2.749684116e-03f, -2.412513083e-03f, +5.139588436e-04f, +8.010805940e-04f, -8.675842964e-04f, +2.889965021e-04f, +1.538907230e-04f, -2.130299734e-04f, +8.650052123e-05f, +1.764035475e-06f,\n    +5.010983297e-04f, -2.363673029e-03f, +4.089693535e-03f, -1.351843626e-03f, -7.492781709e-03f, +1.615083724e-02f, -1.315530303e-02f, -6.084232066e-03f, +2.953378363e-02f, -3.493070921e-02f, +1.075482796e-02f, +2.828906997e-02f, -5.022151214e-02f, +3.426893128e-02f, +8.330578811e-03f, -4.314347064e-02f, +4.343260845e-02f, -1.301965725e-02f, -2.019683867e-02f, +3.127641377e-02f, -1.822281373e-02f, -1.957635444e-03f, +1.243944337e-02f, -1.002884180e-02f, +2.600450818e-03f, +1.917397370e-03f, -2.045141041e-03f, +6.357057240e-04f,\n    +3.283287688e-05f, -2.813861650e-06f, -2.407104306e-04f, +5.490669975e-04f, -5.062109379e-04f, -2.200119860e-04f, +1.318339542e-03f, -1.790312330e-03f, +7.802068301e-04f, +1.366187658e-03f, -3.013060547e-03f, +2.541057314e-03f, +3.598708343e-05f, -2.812392575e-03f, +3.556159520e-03f, -1.697276728e-03f, -1.183905825e-03f, +2.825731336e-03f, -2.243478158e-03f, +3.398119693e-04f, +1.197610003e-03f, -1.428307611e-03f, +6.817240173e-04f, +1.248533379e-04f, -4.236035727e-04f, +2.898511448e-04f, -7.727883873e-05f, -1.764035475e-06f,\n    /* 12,13 (28) */\n    -5.339312066e-04f, +1.881253918e-03f, -1.698162565e-03f, -2.668171438e-03f, +9.112036964e-03f, -8.873883065e-03f, -5.523895888e-03f, +2.693779418e-02f, -3.092815566e-02f, -4.873185235e-03f, +7.030363995e-02f, -1.085956721e-01f, +2.327794960e-02f, +6.011121628e-01f, +5.115058301e-01f, -5.691276645e-02f, -7.094476455e-02f, +7.427925798e-02f, -2.468453367e-02f, -1.752528765e-02f, +2.637390203e-02f, -1.179223861e-02f, -3.740333276e-03f, +8.106153451e-03f, -4.108146322e-03f, -3.248653639e-04f, +1.465739118e-03f, -6.339416885e-04f,\n    -2.804613760e-05f, -5.382878091e-05f, +2.350092550e-04f, -2.994756875e-04f, -7.160576514e-05f, +8.255246579e-04f, -1.202234304e-03f, +2.228332636e-04f, +2.046834271e-03f, -3.637696777e-03f, +1.563960519e-03f, +5.626398709e-03f, -1.503169408e-02f, -1.311417610e-02f, +1.661696301e-02f, +1.162882552e-02f, -6.808987577e-03f, +2.204564815e-04f, +2.925437697e-03f, -2.381268781e-03f, +4.004134605e-04f, +8.755390372e-04f, -8.712008671e-04f, +2.576577157e-04f, +1.789424619e-04f, -2.191996958e-04f, +8.261567046e-05f, +5.744274138e-06f,\n    +5.339312066e-04f, -2.366486890e-03f, +3.848983105e-03f, -8.027766284e-04f, -7.998992647e-03f, +1.593082526e-02f, -1.183696349e-02f, -7.874544396e-03f, +3.031399046e-02f, -3.356452155e-02f, +7.741767417e-03f, +3.083012728e-02f, -5.018552506e-02f, +3.145653871e-02f, +1.188673833e-02f, -4.484074737e-02f, +4.224870262e-02f, -1.019392592e-02f, -2.244031683e-02f, +3.161622574e-02f, -1.702520373e-02f, -3.385943055e-03f, +1.312116739e-02f, -9.903988465e-03f, +2.176847245e-03f, +2.207248515e-03f, -2.122419880e-03f, +6.339416885e-04f,\n    +2.804613760e-05f, +1.072683668e-05f, -2.531240887e-04f, +5.381353907e-04f, -4.537659197e-04f, -2.964327627e-04f, +1.356721015e-03f, -1.726968476e-03f, +6.202476605e-04f, +1.521695141e-03f, -3.031746785e-03f, +2.375844364e-03f, +2.858068374e-04f, -2.966963659e-03f, +3.500875260e-03f, -1.478465097e-03f, -1.401256537e-03f, +2.896746143e-03f, -2.151109553e-03f, +1.838884019e-04f, +1.300945557e-03f, -1.435077914e-03f, +6.276344208e-04f, +1.798362973e-04f, -4.477208986e-04f, +2.881421043e-04f, -6.815523746e-05f, -5.744274138e-06f,\n    /* 12,14 (28) */\n    -5.619773442e-04f, +1.827425137e-03f, -1.463153310e-03f, -2.967647125e-03f, +9.040431199e-03f, -8.048358407e-03f, -6.726130192e-03f, +2.716062744e-02f, -2.888132139e-02f, -8.510882012e-03f, +7.186760047e-02f, -1.029692733e-01f, +8.246255527e-03f, +5.879979867e-01f, +5.281227931e-01f, -4.528394094e-02f, -7.775375213e-02f, +7.449971446e-02f, -2.175909597e-02f, -1.990655643e-02f, +2.677431549e-02f, -1.091669957e-02f, -4.611534143e-03f, +8.363811167e-03f, -3.929203860e-03f, -5.440650596e-04f, +1.548354789e-03f, -6.281974144e-04f,\n    -2.333597420e-05f, -6.081349163e-05f, +2.340327803e-04f, -2.764494391e-04f, -1.122952956e-04f, +8.433893668e-04f, -1.144288835e-03f, +9.248256318e-05f, +2.137355562e-03f, -3.520537505e-03f, +1.197562299e-03f, +5.931821479e-03f, -1.439542430e-02f, -1.389550624e-02f, +1.600074300e-02f, +1.234874197e-02f, -6.641412367e-03f, -1.240060706e-04f, +3.091360370e-03f, -2.338148458e-03f, +2.825131478e-04f, +9.474902263e-04f, -8.706774845e-04f, +2.242003990e-04f, +2.038574445e-04f, -2.244426840e-04f, +7.810200457e-05f, +9.910848994e-06f,\n    +5.619773442e-04f, -2.355760054e-03f, +3.595859016e-03f, -2.646412378e-04f, -8.452758567e-03f, +1.563439249e-02f, -1.048024248e-02f, -9.601512872e-03f, +3.093423812e-02f, -3.204282641e-02f, +4.710020632e-03f, +3.320597165e-02f, -4.989971822e-02f, +2.848957505e-02f, +1.538761359e-02f, -4.631921247e-02f, +4.084744609e-02f, -7.297179773e-03f, -2.459142638e-02f, +3.180011415e-02f, -1.572425817e-02f, -4.821020969e-03f, +1.374880181e-02f, -9.724152168e-03f, +1.729126347e-03f, +2.495390619e-03f, -2.190575117e-03f, +6.281974144e-04f,\n    +2.333597420e-05f, +2.365150215e-05f, -2.637295487e-04f, +5.246219214e-04f, -4.001257885e-04f, -3.698772374e-04f, +1.387547919e-03f, -1.655676099e-03f, +4.588811080e-04f, +1.668167263e-03f, -3.035013953e-03f, +2.199414847e-03f, +5.335171447e-04f, -3.106454162e-03f, +3.427863615e-03f, -1.251527446e-03f, -1.612578952e-03f, +2.953534189e-03f, -2.046929674e-03f, +2.525383672e-05f, +1.398993480e-03f, -1.434484554e-03f, +5.691622630e-04f, +2.351538494e-04f, -4.700529895e-04f, +2.847069707e-04f, -5.819635425e-05f, -9.910848994e-06f,\n    /* 12,15 (28) */\n    -5.853133184e-04f, +1.766611645e-03f, -1.229120530e-03f, -3.244096564e-03f, +8.928135903e-03f, -7.204969040e-03f, -7.870419028e-03f, +2.725311000e-02f, -2.674396583e-02f, -1.203141952e-02f, +7.306516277e-02f, -9.703745187e-02f, -6.149168775e-03f, +5.741024804e-01f, +5.441235361e-01f, -3.293519897e-02f, -8.439516450e-02f, +7.437570839e-02f, -1.866773560e-02f, -2.224470489e-02f, +2.705682863e-02f, -9.969209342e-03f, -5.482211627e-03f, +8.588011566e-03f, -3.725346416e-03f, -7.685077437e-04f, +1.626456793e-03f, -6.182865654e-04f,\n    -1.872781532e-05f, -6.719464614e-05f, +2.319134597e-04f, -2.527462967e-04f, -1.513884712e-04f, +8.568405247e-04f, -1.082260150e-03f, -3.555399392e-05f, +2.216154012e-03f, -3.389839611e-03f, +8.344412680e-04f, +6.202875502e-03f, -1.373454272e-02f, -1.463830204e-02f, +1.534064230e-02f, +1.305148748e-02f, -6.439411871e-03f, -4.761043494e-04f, +3.246476473e-03f, -2.283106929e-03f, +1.607273743e-04f, +1.016530165e-03f, -8.659168884e-04f, +1.887358662e-04f, +2.285035548e-04f, -2.286993269e-04f, +7.296020547e-05f, +1.424543170e-05f,\n    +5.853133184e-04f, -2.332108551e-03f, +3.332129467e-03f, +2.599806836e-04f, -8.852884355e-03f, +1.526451526e-02f, -9.092694559e-03f, -1.125718897e-02f, +3.139311923e-02f, -3.037465914e-02f, +1.675006678e-03f, +3.540538649e-02f, -4.936620107e-02f, +2.538312089e-02f, +1.881547721e-02f, -4.757073991e-02f, +3.923486713e-02f, -4.343645584e-03f, -2.663835605e-02f, +3.182536798e-02f, -1.432526469e-02f, -6.255505523e-03f, +1.431796407e-02f, -9.488998318e-03f, +1.259073357e-03f, +2.780097590e-03f, -2.248771471e-03f, +6.182865654e-04f,\n    +1.872781532e-05f, +3.590374314e-05f, -2.725225037e-04f, +5.086679019e-04f, -3.456035669e-04f, -4.400143631e-04f, +1.410778245e-03f, -1.576907531e-03f, +2.969515247e-04f, +1.804931542e-03f, -3.022946128e-03f, +2.012720185e-03f, +7.778606065e-04f, -3.230164922e-03f, +3.337478759e-03f, -1.017600555e-03f, -1.816760456e-03f, +2.995706134e-03f, -1.931371550e-03f, -1.352972326e-04f, +1.491168190e-03f, -1.426410791e-03f, +5.065368193e-04f, +2.905103963e-04f, -4.904247717e-04f, +2.795093741e-04f, -4.743333710e-05f, -1.424543170e-05f,\n    /* 12,16 (28) */\n    -6.040411337e-04f, +1.699416999e-03f, -9.972070705e-04f, -3.496842861e-03f, +8.776747432e-03f, -6.348128516e-03f, -8.952679177e-03f, +2.721755601e-02f, -2.452781182e-02f, -1.542125913e-02f, +7.389960404e-02f, -9.083457637e-02f, -1.988371149e-02f, +5.594641784e-01f, +5.594641784e-01f, -1.988371149e-02f, -9.083457637e-02f, +7.389960404e-02f, -1.542125913e-02f, -2.452781182e-02f, +2.721755601e-02f, -8.952679177e-03f, -6.348128516e-03f, +8.776747432e-03f, -3.496842861e-03f, -9.972070705e-04f, +1.699416999e-03f, -6.040411337e-04f,\n    -1.424543170e-05f, -7.296020547e-05f, +2.286993269e-04f, -2.285035548e-04f, -1.887358662e-04f, +8.659168884e-04f, -1.016530165e-03f, -1.607273743e-04f, +2.283106929e-03f, -3.246476473e-03f, +4.761043494e-04f, +6.439411871e-03f, -1.305148748e-02f, -1.534064230e-02f, +1.463830204e-02f, +1.373454272e-02f, -6.202875502e-03f, -8.344412680e-04f, +3.389839611e-03f, -2.216154012e-03f, +3.555399392e-05f, +1.082260150e-03f, -8.568405247e-04f, +1.513884712e-04f, +2.527462967e-04f, -2.319134597e-04f, +6.719464614e-05f, +1.872781532e-05f,\n    +6.040411337e-04f, -2.296204808e-03f, +3.059606964e-03f, +7.686485855e-04f, -9.198487922e-03f, +1.482450089e-02f, -7.681916313e-03f, -1.283409650e-02f, +3.169007075e-02f, -2.856972760e-02f, -1.347939449e-03f, +3.741810668e-02f, -4.858834047e-02f, +2.215295597e-02f, +2.215295597e-02f, -4.858834047e-02f, +3.741810668e-02f, -1.347939449e-03f, -2.856972760e-02f, +3.169007075e-02f, -1.283409650e-02f, -7.681916313e-03f, +1.482450089e-02f, -9.198487922e-03f, +7.686485855e-04f, +3.059606964e-03f, -2.296204808e-03f, +6.040411337e-04f,\n    +1.424543170e-05f, +4.743333710e-05f, -2.795093741e-04f, +4.904247717e-04f, -2.905103963e-04f, -5.065368193e-04f, +1.426410791e-03f, -1.491168190e-03f, +1.352972326e-04f, +1.931371550e-03f, -2.995706134e-03f, +1.816760456e-03f, +1.017600555e-03f, -3.337478759e-03f, +3.230164922e-03f, -7.778606065e-04f, -2.012720185e-03f, +3.022946128e-03f, -1.804931542e-03f, -2.969515247e-04f, +1.576907531e-03f, -1.410778245e-03f, +4.400143631e-04f, +3.456035669e-04f, -5.086679019e-04f, +2.725225037e-04f, -3.590374314e-05f, -1.872781532e-05f,\n    /* 12,17 (28) */\n    -6.182865654e-04f, +1.626456793e-03f, -7.685077437e-04f, -3.725346416e-03f, +8.588011566e-03f, -5.482211627e-03f, -9.969209342e-03f, +2.705682863e-02f, -2.224470489e-02f, -1.866773560e-02f, +7.437570839e-02f, -8.439516450e-02f, -3.293519897e-02f, +5.441235361e-01f, +5.741024804e-01f, -6.149168775e-03f, -9.703745187e-02f, +7.306516277e-02f, -1.203141952e-02f, -2.674396583e-02f, +2.725311000e-02f, -7.870419028e-03f, -7.204969040e-03f, +8.928135903e-03f, -3.244096564e-03f, -1.229120530e-03f, +1.766611645e-03f, -5.853133184e-04f,\n    -9.910848994e-06f, -7.810200457e-05f, +2.244426840e-04f, -2.038574445e-04f, -2.242003990e-04f, +8.706774845e-04f, -9.474902263e-04f, -2.825131478e-04f, +2.338148458e-03f, -3.091360370e-03f, +1.240060706e-04f, +6.641412367e-03f, -1.234874197e-02f, -1.600074300e-02f, +1.389550624e-02f, +1.439542430e-02f, -5.931821479e-03f, -1.197562299e-03f, +3.520537505e-03f, -2.137355562e-03f, -9.248256318e-05f, +1.144288835e-03f, -8.433893668e-04f, +1.122952956e-04f, +2.764494391e-04f, -2.340327803e-04f, +6.081349163e-05f, +2.333597420e-05f,\n    +6.182865654e-04f, -2.248771471e-03f, +2.780097590e-03f, +1.259073357e-03f, -9.488998318e-03f, +1.431796407e-02f, -6.255505523e-03f, -1.432526469e-02f, +3.182536798e-02f, -2.663835605e-02f, -4.343645584e-03f, +3.923486713e-02f, -4.757073991e-02f, +1.881547721e-02f, +2.538312089e-02f, -4.936620107e-02f, +3.540538649e-02f, +1.675006678e-03f, -3.037465914e-02f, +3.139311923e-02f, -1.125718897e-02f, -9.092694559e-03f, +1.526451526e-02f, -8.852884355e-03f, +2.599806836e-04f, +3.332129467e-03f, -2.332108551e-03f, +5.853133184e-04f,\n    +9.910848994e-06f, +5.819635425e-05f, -2.847069707e-04f, +4.700529895e-04f, -2.351538494e-04f, -5.691622630e-04f, +1.434484554e-03f, -1.398993480e-03f, -2.525383672e-05f, +2.046929674e-03f, -2.953534189e-03f, +1.612578952e-03f, +1.251527446e-03f, -3.427863615e-03f, +3.106454162e-03f, -5.335171447e-04f, -2.199414847e-03f, +3.035013953e-03f, -1.668167263e-03f, -4.588811080e-04f, +1.655676099e-03f, -1.387547919e-03f, +3.698772374e-04f, +4.001257885e-04f, -5.246219214e-04f, +2.637295487e-04f, -2.365150215e-05f, -2.333597420e-05f,\n    /* 12,18 (28) */\n    -6.281974144e-04f, +1.548354789e-03f, -5.440650596e-04f, -3.929203860e-03f, +8.363811167e-03f, -4.611534143e-03f, -1.091669957e-02f, +2.677431549e-02f, -1.990655643e-02f, -2.175909597e-02f, +7.449971446e-02f, -7.775375213e-02f, -4.528394094e-02f, +5.281227931e-01f, +5.879979867e-01f, +8.246255527e-03f, -1.029692733e-01f, +7.186760047e-02f, -8.510882012e-03f, -2.888132139e-02f, +2.716062744e-02f, -6.726130192e-03f, -8.048358407e-03f, +9.040431199e-03f, -2.967647125e-03f, -1.463153310e-03f, +1.827425137e-03f, -5.619773442e-04f,\n    -5.744274138e-06f, -8.261567046e-05f, +2.191996958e-04f, -1.789424619e-04f, -2.576577157e-04f, +8.712008671e-04f, -8.755390372e-04f, -4.004134605e-04f, +2.381268781e-03f, -2.925437697e-03f, -2.204564815e-04f, +6.808987577e-03f, -1.162882552e-02f, -1.661696301e-02f, +1.311417610e-02f, +1.503169408e-02f, -5.626398709e-03f, -1.563960519e-03f, +3.637696777e-03f, -2.046834271e-03f, -2.228332636e-04f, +1.202234304e-03f, -8.255246579e-04f, +7.160576514e-05f, +2.994756875e-04f, -2.350092550e-04f, +5.382878091e-05f, +2.804613760e-05f,\n    +6.281974144e-04f, -2.190575117e-03f, +2.495390619e-03f, +1.729126347e-03f, -9.724152168e-03f, +1.374880181e-02f, -4.821020969e-03f, -1.572425817e-02f, +3.180011415e-02f, -2.459142638e-02f, -7.297179773e-03f, +4.084744609e-02f, -4.631921247e-02f, +1.538761359e-02f, +2.848957505e-02f, -4.989971822e-02f, +3.320597165e-02f, +4.710020632e-03f, -3.204282641e-02f, +3.093423812e-02f, -9.601512872e-03f, -1.048024248e-02f, +1.563439249e-02f, -8.452758567e-03f, -2.646412378e-04f, +3.595859016e-03f, -2.355760054e-03f, +5.619773442e-04f,\n    +5.744274138e-06f, +6.815523746e-05f, -2.881421043e-04f, +4.477208986e-04f, -1.798362973e-04f, -6.276344208e-04f, +1.435077914e-03f, -1.300945557e-03f, -1.838884019e-04f, +2.151109553e-03f, -2.896746143e-03f, +1.401256537e-03f, +1.478465097e-03f, -3.500875260e-03f, +2.966963659e-03f, -2.858068374e-04f, -2.375844364e-03f, +3.031746785e-03f, -1.521695141e-03f, -6.202476605e-04f, +1.726968476e-03f, -1.356721015e-03f, +2.964327627e-04f, +4.537659197e-04f, -5.381353907e-04f, +2.531240887e-04f, -1.072683668e-05f, -2.804613760e-05f,\n    /* 12,19 (28) */\n    -6.339416885e-04f, +1.465739118e-03f, -3.248653639e-04f, -4.108146322e-03f, +8.106153451e-03f, -3.740333276e-03f, -1.179223861e-02f, +2.637390203e-02f, -1.752528765e-02f, -2.468453367e-02f, +7.427925798e-02f, -7.094476455e-02f, -5.691276645e-02f, +5.115058301e-01f, +6.011121628e-01f, +2.327794960e-02f, -1.085956721e-01f, +7.030363995e-02f, -4.873185235e-03f, -3.092815566e-02f, +2.693779418e-02f, -5.523895888e-03f, -8.873883065e-03f, +9.112036964e-03f, -2.668171438e-03f, -1.698162565e-03f, +1.881253918e-03f, -5.339312066e-04f,\n    -1.764035475e-06f, -8.650052123e-05f, +2.130299734e-04f, -1.538907230e-04f, -2.889965021e-04f, +8.675842964e-04f, -8.010805940e-04f, -5.139588436e-04f, +2.412513083e-03f, -2.749684116e-03f, -5.559483860e-04f, +6.942374530e-03f, -1.089428401e-02f, -1.718780930e-02f, +1.229636377e-02f, +1.564096834e-02f, -5.286888184e-03f, -1.932081960e-03f, +3.740487645e-03f, -1.944770211e-03f, -3.549265999e-04f, +1.255726135e-03f, -8.032285666e-04f, +2.948119133e-05f, +3.216873788e-04f, -2.347995131e-04f, +4.625648846e-05f, +3.283287688e-05f,\n    +6.339416885e-04f, -2.122419880e-03f, +2.207248515e-03f, +2.176847245e-03f, -9.903988465e-03f, +1.312116739e-02f, -3.385943055e-03f, -1.702520373e-02f, +3.161622574e-02f, -2.244031683e-02f, -1.019392592e-02f, +4.224870262e-02f, -4.484074737e-02f, +1.188673833e-02f, +3.145653871e-02f, -5.018552506e-02f, +3.083012728e-02f, +7.741767417e-03f, -3.356452155e-02f, +3.031399046e-02f, -7.874544396e-03f, -1.183696349e-02f, +1.593082526e-02f, -7.998992647e-03f, -8.027766284e-04f, +3.848983105e-03f, -2.366486890e-03f, +5.339312066e-04f,\n    +1.764035475e-06f, +7.727883873e-05f, -2.898511448e-04f, +4.236035727e-04f, -1.248533379e-04f, -6.817240173e-04f, +1.428307611e-03f, -1.197610003e-03f, -3.398119693e-04f, +2.243478158e-03f, -2.825731336e-03f, +1.183905825e-03f, +1.697276728e-03f, -3.556159520e-03f, +2.812392575e-03f, -3.598708343e-05f, -2.541057314e-03f, +3.013060547e-03f, -1.366187658e-03f, -7.802068301e-04f, +1.790312330e-03f, -1.318339542e-03f, +2.200119860e-04f, +5.062109379e-04f, -5.490669975e-04f, +2.407104306e-04f, +2.813861650e-06f, -3.283287688e-05f,\n    /* 12,20 (28) */\n    -6.357057240e-04f, +1.379238597e-03f, -1.118353905e-04f, -4.262037045e-03f, +7.817156949e-03f, -2.872748979e-03f, -1.259331920e-02f, +2.585994318e-02f, -1.511277457e-02f, -2.743421778e-02f, +7.372330959e-02f, -6.400239002e-02f, -6.780705047e-02f, +4.943180208e-01f, +6.134085265e-01f, +3.891891795e-02f, -1.138825602e-01f, +6.837155799e-02f, -1.132697590e-03f, -3.287292587e-02f, +2.658286758e-02f, -4.268169753e-03f, -9.677111632e-03f, +9.141518155e-03f, -2.346484059e-03f, -1.932962079e-03f, +1.927510406e-03f, -5.010983297e-04f,\n    +2.013463527e-06f, -8.975944697e-05f, +2.059961522e-04f, -1.288313475e-04f, -3.181187218e-04f, +8.599428424e-04f, -7.245221393e-04f, -6.227098544e-04f, +2.431980281e-03f, -2.565099662e-03f, -8.812012801e-04f, +7.041933861e-03f, -1.014768050e-02f, -1.771194149e-02f, +1.144424563e-02f, +1.622092695e-02f, -4.913703855e-03f, -2.300331234e-03f, +3.828128510e-03f, -1.831401118e-03f, -4.881708689e-04f, +1.304407456e-03f, -7.765047531e-04f, -1.390575777e-05f, +3.429471964e-04f, -2.333652264e-04f, +3.811656467e-05f, +3.766920629e-05f,\n    +6.357057240e-04f, -2.045141041e-03f, +1.917397370e-03f, +2.600450818e-03f, -1.002884180e-02f, +1.243944337e-02f, -1.957635444e-03f, -1.822281373e-02f, +3.127641377e-02f, -2.019683867e-02f, -1.301965725e-02f, +4.343260845e-02f, -4.314347064e-02f, +8.330578811e-03f, +3.426893128e-02f, -5.022151214e-02f, +2.828906997e-02f, +1.075482796e-02f, -3.493070921e-02f, +2.953378363e-02f, -6.084232066e-03f, -1.315530303e-02f, +1.615083724e-02f, -7.492781709e-03f, -1.351843626e-03f, +4.089693535e-03f, -2.363673029e-03f, +5.010983297e-04f,\n    -2.013463527e-06f, +8.554241336e-05f, -2.898795343e-04f, +3.978816489e-04f, -7.049229540e-05f, -7.312295386e-04f, +1.414327532e-03f, -1.089592404e-03f, -4.922528271e-04f, +2.323667529e-03f, -2.740950072e-03f, +9.616652248e-04f, +1.906870778e-03f, -3.593454033e-03f, +2.643518461e-03f, +2.146705087e-04f, -2.694156138e-03f, +2.978950855e-03f, -1.202370254e-03f, -9.379126719e-04f, +1.845271380e-03f, -1.272486715e-03f, +1.409682746e-04f, +5.571476709e-04f, -5.572866306e-04f, +2.265038872e-04f, +1.690820033e-05f, -3.766920629e-05f,\n    /* 12,21 (28) */\n    -6.336922605e-04f, +1.289479150e-03f, +9.416076170e-05f, -4.390868393e-03f, +7.499038227e-03f, -2.012806137e-03f, -1.331784134e-02f, +2.523723333e-02f, -1.268079429e-02f, -2.999931745e-02f, +7.284210831e-02f, -5.696045616e-02f, -7.795473097e-02f, +4.766060793e-01f, +6.248527722e-01f, +5.513984490e-02f, -1.187962641e-01f, +6.607122676e-02f, +2.695430920e-03f, -3.470432699e-02f, +2.609469671e-02f, -2.963762297e-03f, -1.045361638e-02f, +9.127612398e-03f, -2.003536863e-03f, -2.166327305e-03f, +1.965626971e-03f, -4.634291234e-04f,\n    +5.573777025e-06f, -9.239877388e-05f, +1.981634645e-04f, -1.038898739e-04f, -3.449397811e-04f, +8.484084206e-04f, -6.462721396e-04f, -7.262585434e-04f, +2.439821533e-03f, -2.372703831e-03f, -1.195017402e-03f, +7.108146529e-03f, -9.391585822e-03f, -1.818817593e-02f, +1.056011508e-02f, +1.676932219e-02f, -4.507393009e-03f, -2.667077432e-03f, +3.899890411e-03f, -1.707022422e-03f, -6.219565921e-04f, +1.347936973e-03f, -7.453788393e-04f, -5.837165877e-05f, +3.631189019e-04f, -2.306734722e-04f, +2.943295419e-05f, +4.252669699e-05f,\n    +6.336922605e-04f, -1.959598627e-03f, +1.627517835e-03f, +2.998332467e-03f, -1.009933410e-02f, +1.170821383e-02f, -5.433079116e-04f, -1.931240614e-02f, +3.078416095e-02f, -1.787317114e-02f, -1.576060732e-02f, +4.439427367e-02f, -4.123659986e-02f, +4.737124778e-03f, +3.691244974e-02f, -5.000684163e-02f, +2.559491383e-02f, +1.373377882e-02f, -3.613307946e-02f, +2.859587095e-02f, -4.238960687e-03f, -1.442778975e-02f, +1.629180552e-02f, -6.935634038e-03f, -1.909130257e-03f, +4.316197423e-03f, -2.346764828e-03f, +4.634291234e-04f,\n    -5.573777025e-06f, +9.292757299e-05f, -2.882812579e-04f, +3.707401563e-04f, -1.703079537e-05f, -7.759778291e-04f, +1.393327309e-03f, -9.775148784e-04f, -6.404658755e-04f, +2.391376140e-03f, -2.642930742e-03f, +7.356928729e-04f, +2.106206468e-03f, -3.612589519e-03f, +2.461193263e-03f, +4.648867336e-04f, -2.834302082e-03f, +2.929493549e-03f, -1.031017933e-03f, -1.092522140e-03f, +1.891448198e-03f, -1.219287120e-03f, +5.967576009e-05f, +6.062645651e-04f, -5.626764120e-04f, +2.105309957e-04f, +3.148799859e-05f, -4.252669699e-05f,\n    /* 12,22 (28) */\n    -6.281184835e-04f, +1.197080376e-03f, +2.923242262e-04f, -4.494758267e-03f, +7.154098446e-03f, -1.164397716e-03f, -1.396411348e-02f, +2.451097478e-02f, -1.024097275e-02f, -3.237202128e-02f, +7.164709091e-02f, -4.985230963e-02f, -8.734631679e-02f, +4.584179034e-01f, +6.354128872e-01f, +7.190916708e-02f, -1.233036571e-01f, +6.340414933e-02f, +6.595321331e-03f, -3.641134941e-02f, +2.547274011e-02f, -1.615825324e-03f, -1.119899522e-02f, +9.069240739e-03f, -1.640417961e-03f, -2.397000777e-03f, +1.995059925e-03f, -4.209024264e-04f,\n    +8.904436267e-06f, -9.442811283e-05f, +1.895993105e-04f, -7.918770840e-05f, -3.693886228e-04f, +8.331287663e-04f, -5.667383000e-04f, -8.242297451e-04f, +2.436238526e-03f, -2.173530669e-03f, -1.496273273e-03f, +7.141610102e-03f, -8.628569271e-03f, -1.861548917e-02f, +9.646374929e-03f, +1.728398750e-02f, -4.068636115e-03f, -3.030660260e-03f, +3.955101323e-03f, -1.571987000e-03f, -7.556590677e-04f, +1.385990967e-03f, -7.098987788e-04f, -1.037230035e-04f, +3.820680803e-04f, -2.266970762e-04f, +2.023359148e-05f, +4.737560409e-05f,\n    +6.281184835e-04f, -1.866671054e-03f, +1.339236578e-03f, +3.369072623e-03f, -1.011636489e-02f, +1.093223601e-02f, +8.500193977e-04f, -2.028992102e-02f, +3.014369507e-02f, -1.548179500e-02f, -1.840353806e-02f, +4.512996655e-02f, -3.913039340e-02f, +1.124535258e-03f, +3.937364301e-02f, -4.954195490e-02f, +2.276061175e-02f, +1.666327237e-02f, -3.716409739e-02f, +2.750334881e-02f, -2.347512488e-03f, -1.564707687e-02f, +1.635148128e-02f, -6.329369473e-03f, -2.471806669e-03f, +4.526728418e-03f, -2.315276830e-03f, +4.209024264e-04f,\n    -8.904436267e-06f, +9.942219887e-05f, -2.851182762e-04f, +3.423673458e-04f, +3.526457500e-05f, -8.158245201e-04f, +1.365530751e-03f, -8.620125415e-04f, -7.837362753e-04f, +2.446369913e-03f, -2.532266599e-03f, +5.071604885e-04f, +2.294299080e-03f, -3.613490558e-03f, +2.266338921e-03f, +7.133814587e-04f, -2.960719855e-03f, +2.864844789e-03f, -8.529515726e-04f, -1.243199610e-03f, +1.928486842e-03f, -1.158906659e-03f, -2.347236056e-05f, +6.532534799e-04f, -5.651316816e-04f, +1.928296731e-04f, +4.647954436e-05f, -4.737560409e-05f,\n    /* 12,23 (28) */\n    -6.192140472e-04f, +1.102652264e-03f, +4.819235367e-04f, -4.573945975e-03f, +6.784709823e-03f, -3.312689499e-04f, -1.453085178e-02f, +2.368674504e-02f, -7.804734227e-03f, -3.454555195e-02f, +7.015081764e-02f, -4.271069953e-02f, -9.597488606e-02f, +4.398024142e-01f, +6.450592622e-01f, +8.919315458e-02f, -1.273722932e-01f, +6.037348907e-02f, +1.055042265e-02f, -3.798333641e-02f, +2.471708105e-02f, -2.298343566e-04f, -1.190889400e-02f, +8.965517735e-03f, -1.258349880e-03f, -2.623697853e-03f, +2.015293516e-03f, -3.735268223e-04f,\n    +1.199495602e-05f, -9.586019359e-05f, +1.803728297e-04f, -5.484161054e-05f, -3.914077491e-04f, +8.142663520e-04f, -4.863256222e-04f, -9.162821881e-04f, +2.421481573e-03f, -1.968623882e-03f, -1.783923012e-03f, +7.143034629e-03f, -7.861189361e-03f, -1.899302076e-02f, +8.705529283e-03f, +1.776284596e-02f, -3.598246142e-03f, -3.389396395e-03f, +3.993150278e-03f, -1.426704663e-03f, -8.886410456e-04f, +1.418265244e-03f, -6.701351241e-04f, -1.497569375e-04f, +3.996628950e-04f, -2.214149336e-04f, +1.055037285e-05f, +5.218500633e-05f,\n    +6.192140472e-04f, -1.767248856e-03f, +1.054118301e-03f, +3.711439969e-03f, -1.008110032e-02f, +1.011641149e-02f, +2.215550148e-03f, -2.115193356e-02f, +2.935995880e-02f, -1.303542509e-02f, -2.093580466e-02f, +4.563712703e-02f, -3.683609432e-02f, -2.488955300e-03f, +4.163998193e-02f, -4.882857344e-02f, +1.979989189e-02f, +1.952811716e-02f, -3.801704897e-02f, +2.626014920e-02f, -4.190256462e-04f, -1.680598353e-02f, +1.632800892e-02f, -5.676115993e-03f, -3.036938350e-03f, +4.719558091e-03f, -2.268797285e-03f, +3.735268223e-04f,\n    -1.199495602e-05f, +1.050203171e-04f, -2.804599254e-04f, +3.129535284e-04f, +8.613951762e-05f, -8.506542926e-04f, +1.331194103e-03f, -7.437299621e-04f, -9.213828945e-04f, +2.488482851e-03f, -2.409612213e-03f, +2.772471895e-04f, +2.470224928e-03f, -3.596175871e-03f, +2.059942603e-03f, +9.588803138e-04f, -3.072701960e-03f, +2.785240741e-03f, -6.690339518e-04f, -1.389121404e-03f, +1.956075280e-03f, -1.091552273e-03f, -1.080656606e-04f, +6.978114977e-04f, -5.645619254e-04f, +1.734493045e-04f, +6.180389510e-05f, -5.218500633e-05f,\n    /* 12,24 (28) */\n    -6.072190912e-04f, +1.006792070e-03f, +6.622963664e-04f, -4.628787586e-03f, +6.393302074e-03f, +4.829974021e-04f, -1.501717740e-02f, +2.277046285e-02f, -5.383252654e-03f, -3.651417583e-02f, +6.836689462e-02f, -3.556766490e-02f, -1.038360754e-01f, +4.208093934e-01f, +6.537647915e-01f, +1.069560005e-01f, -1.309705394e-01f, +5.698409267e-02f, +1.454357293e-02f, -3.941004108e-02f, +2.382844000e-02f, +1.188430887e-03f, -1.257902913e-02f, +8.815760798e-03f, -8.586869854e-04f, -2.845112787e-03f, +2.025843889e-03f, -3.213418160e-04f,\n    +1.483682833e-05f, -9.671068632e-05f, +1.705544752e-04f, -3.096321530e-05f, -4.109531747e-04f, +7.919972572e-04f, -4.054345159e-04f, -1.002109424e-03f, +2.395847519e-03f, -1.759031996e-03f, -2.057001262e-03f, +7.113238123e-03f, -7.091984704e-03f, -1.932007553e-02f, +7.740175145e-03f, +1.820391845e-02f, -3.097167353e-03f, -3.741586035e-03f, +4.013491294e-03f, -1.271641366e-03f, -1.020255514e-03f, +1.444477025e-03f, -6.261811852e-04f, -1.962620639e-04f, +4.157748484e-04f, -2.148123063e-04f, +4.191045679e-07f, +5.692295785e-05f,\n    +6.072190912e-04f, -1.662228538e-03f, +7.736583760e-04f, +4.024393497e-03f, -9.994960801e-03f, +9.265757193e-03f, +3.546744251e-03f, -2.189566352e-02f, +2.843857590e-02f, -1.054694224e-02f, -2.334541688e-02f, +4.591437422e-02f, -3.436586939e-02f, -6.085131171e-03f, +4.369992453e-02f, -4.786969313e-02f, +1.672718993e-02f, +2.231335790e-02f, -3.868608292e-02f, +2.487102780e-02f, +1.537049634e-03f, -1.789753580e-02f, +1.621994326e-02f, -4.978304495e-03f, -3.601500275e-03f, +4.893007396e-03f, -2.206993390e-03f, +3.213418160e-04f,\n    -1.483682833e-05f, +1.097219377e-04f, -2.743822870e-04f, +2.826899302e-04f, +1.353531788e-04f, -8.803809735e-04f, +1.290604166e-03f, -6.233176040e-04f, -1.052761539e-03f, +2.517617312e-03f, -2.275679629e-03f, +4.713329735e-05f, +2.633125982e-03f, -3.560758106e-03f, +1.843051590e-03f, +1.200121368e-03f, -3.169612698e-03f, +2.690996815e-03f, -4.801655327e-04f, -1.529480302e-03f, +1.973947623e-03f, -1.017471423e-03f, -1.936784465e-04f, +7.396427412e-04f, -5.608916427e-04f, +1.524507642e-04f, +7.737722171e-05f, -5.692295785e-05f,\n    /* 12,25 (28) */\n    -5.923822628e-04f, +9.100813836e-04f, +8.328508416e-04f, -4.659750801e-03f, +5.982348900e-03f, +1.274994659e-03f, -1.542261192e-02f, +2.176835343e-02f, -2.987405136e-03f, -3.827320782e-02f, +6.630989336e-02f, -2.845442678e-02f, -1.109280601e-01f, +4.014893179e-01f, +6.615049666e-01f, +1.251599190e-01f, -1.340677067e-01f, +5.324250664e-02f, +1.855706423e-02f, -4.068168244e-02f, +2.280818449e-02f, +2.632907913e-03f, -1.320521031e-02f, +8.619498734e-03f, -4.429121370e-04f, -3.059925093e-03f, +2.026262994e-03f, -2.644188582e-04f,\n    +1.742350407e-05f, -9.699801152e-05f, +1.602155927e-04f, -7.658595322e-06f, -4.279943131e-04f, +7.665099949e-04f, -3.244589710e-04f, -1.081440572e-03f, +2.359677465e-03f, -1.545803574e-03f, -2.314625740e-03f, +7.053141674e-03f, -6.323465047e-03f, -1.959612522e-02f, +6.752993596e-03f, +1.860533153e-02f, -2.566473571e-03f, -4.085519624e-03f, +4.015647081e-03f, -1.107318143e-03f, -1.149848588e-03f, +1.464366781e-03f, -5.781530785e-04f, -2.430193108e-04f, +4.302795444e-04f, -2.068810931e-04f, -1.012057341e-05f, +6.155665152e-05f,\n    +5.923822628e-04f, -1.552506601e-03f, +4.992760890e-04f, +4.307083428e-03f, -9.859607622e-03f, +8.385376219e-03f, +4.837348417e-03f, -2.251898112e-02f, +2.738581436e-02f, -8.029324923e-03f, -2.562109651e-02f, +4.596150752e-02f, -3.173274341e-02f, -9.645889277e-03f, +4.554297612e-02f, -4.666957176e-02f, +1.355757724e-02f, +2.500435471e-02f, -3.916624845e-02f, +2.334154750e-02f, +3.510997257e-03f, -1.891500722e-02f, +1.602626481e-02f, -4.238661754e-03f, -4.162391918e-03f, +5.045458160e-03f, -2.129616169e-03f, +2.644188582e-04f,\n    -1.742350407e-05f, +1.135328592e-04f, -2.669675349e-04f, +2.517675669e-04f, +1.826792043e-04f, -9.049474690e-04f, +1.244076270e-03f, -5.014282841e-04f, -1.177267952e-03f, +2.533743915e-03f, -2.131234238e-03f, -1.820058337e-04f, +2.782214148e-03f, -3.507443127e-03f, +1.616767842e-03f, +1.435861754e-03f, -3.250891791e-03f, +2.582506499e-03f, -2.872800010e-04f, -1.663490005e-03f, +1.981886117e-03f, -9.369513494e-04f, -2.798718401e-04f, +7.784601854e-04f, -5.540611438e-04f, +1.299063660e-04f, +9.311119447e-05f, -6.155665152e-05f,\n    /* 12,26 (28) */\n    -5.749587588e-04f, +8.130833721e-04f, +9.930664343e-04f, -4.667409396e-03f, +5.554354587e-03f, +2.041504654e-03f, -1.574707089e-02f, +2.068691286e-02f, -6.277276711e-04f, -3.981901140e-02f, +6.399526762e-02f, -2.140128510e-02f, -1.172515252e-01f, +3.818931927e-01f, +6.682579602e-01f, +1.437652505e-01f, -1.366341803e-01f, +4.915698701e-02f, +2.257271131e-02f, -4.178900058e-02f, +2.165833590e-02f, +4.097274693e-03f, -1.378336339e-02f, +8.376479423e-03f, -1.263259257e-05f, -3.266806186e-03f, +2.016142420e-03f, -2.028622066e-04f,\n    +1.975036269e-05f, -9.674314000e-05f, +1.494280070e-04f, +1.497213655e-05f, -4.425137977e-04f, +7.380043028e-04f, -2.437847990e-04f, -1.154040886e-03f, +2.313354339e-03f, -1.329982526e-03f, -2.555999392e-03f, +6.963764219e-03f, -5.558102500e-03f, -1.982080948e-02f, +5.746740681e-03f, +1.896532500e-02f, -2.007365906e-03f, -4.419484716e-03f, +3.999212509e-03f, -9.343097736e-04f, -1.276762484e-03f, +1.477699978e-03f, -5.261896628e-04f, -2.898028574e-04f, +4.430574496e-04f, -1.976200705e-04f, -2.102528838e-05f, +6.605259312e-05f,\n    +5.749587588e-04f, -1.438973742e-03f, +2.323085540e-04f, +4.558850994e-03f, -9.676928418e-03f, +7.480428750e-03f, +6.081424687e-03f, -2.302040941e-02f, +2.620854641e-02f, -5.495581009e-03f, -2.775233074e-02f, +4.577950169e-02f, -2.895052926e-02f, -1.315333240e-02f, +4.715974396e-02f, -4.523371000e-02f, +1.030668545e-02f, +2.758686121e-02f, -3.945352845e-02f, +2.167805749e-02f, +5.492883374e-03f, -1.985195857e-02f, +1.574639297e-02f, -3.460201569e-03f, -4.716453062e-03f, +5.175364526e-03f, -2.036504974e-03f, +2.028622066e-04f,\n    -1.975036269e-05f, +1.164644421e-04f, -2.583032615e-04f, +2.203761488e-04f, +2.279066910e-04f, -9.243255382e-04f, +1.191952126e-03f, -3.787136644e-04f, -1.294340562e-03f, +2.536901083e-03f, -1.977090400e-03f, -4.090059313e-04f, +2.916775147e-03f, -3.436528816e-03f, +1.382242268e-03f, +1.664884210e-03f, -3.316057636e-03f, +2.460239749e-03f, -9.133959482e-05f, -1.790389534e-03f, +1.979722913e-03f, -8.503180963e-04f, -3.661959696e-04f, +8.139874555e-04f, -5.440272734e-04f, +1.058997420e-04f, +1.089134097e-04f, -6.605259312e-05f,\n    /* 12,27 (28) */\n    -5.552083961e-04f, +7.163402321e-04f, +1.142494441e-03f, -4.652437260e-03f, +5.111840789e-03f, +2.779508957e-03f, -1.599085569e-02f, +1.953287197e-02f, +1.685626668e-03f, -4.114899392e-02f, +6.143926823e-02f, -1.443752088e-02f, -1.228096277e-01f, +3.620723832e-01f, +6.740047009e-01f, +1.627305755e-01f, -1.386415462e-01f, +4.473750230e-02f, +2.657192382e-02f, -4.272331036e-02f, +2.038157341e-02f, +5.574974672e-03f, -1.430955305e-02f, +8.086676566e-03f, +4.304248570e-04f, -3.464426257e-03f, +1.995117132e-03f, -1.368096135e-04f,\n    +2.181467077e-05f, -9.596938431e-05f, +1.382636177e-04f, +3.683518294e-05f, -4.545072392e-04f, +7.066899060e-04f, -1.637879495e-04f, -1.219712128e-03f, +2.257300314e-03f, -1.112603523e-03f, -2.780412143e-03f, +6.846216993e-03f, -4.798322993e-03f, -1.999393623e-02f, +4.724238005e-03f, +1.928225905e-02f, -1.421169971e-03f, -4.741772964e-03f, +3.963857823e-03f, -7.532431649e-04f, -1.400338575e-03f, +1.484268751e-03f, -4.704523592e-04f, -3.363811173e-04f, +4.539946472e-04f, -1.870351037e-04f, -3.224806064e-05f, +7.037678577e-05f,\n    +5.552083961e-04f, -1.322509300e-03f, -2.599470746e-05f, +4.779227143e-03f, -9.449021727e-03f, +6.556103212e-03f, +7.273376813e-03f, -2.339912307e-02f, +2.491420585e-02f, -2.958679925e-03f, -2.972942114e-02f, +4.537049576e-02f, -2.603375411e-02f, -1.658986122e-02f, +4.854198623e-02f, -4.356882579e-02f, +6.990627809e-03f, +3.004710096e-02f, -3.954486805e-02f, +1.988766796e-02f, +7.472606287e-03f, -2.070227667e-02f, +1.538019700e-02f, -2.646214113e-03f, -5.260480335e-03f, +5.281264268e-03f, -1.927591564e-03f, +1.368096135e-04f,\n    -2.181467077e-05f, +1.185333513e-04f, -2.484817892e-04f, +1.887030176e-04f, +2.708410303e-04f, -9.385154098e-04f, +1.134597567e-03f, -2.558207948e-04f, -1.403462982e-03f, +2.527194232e-03f, -1.814106837e-03f, -6.327198303e-04f, +3.036172011e-03f, -3.348403385e-03f, +1.140668745e-03f, +1.886003496e-03f, -3.364710146e-03f, +2.324740980e-03f, +1.066697545e-04f, -1.909447527e-03f, +1.967341574e-03f, -7.579353121e-04f, -4.521922591e-04f, +8.459605991e-04f, -5.307640527e-04f, +8.052564960e-05f, +1.246878551e-04f, -7.037678577e-05f,\n    /* 12,28 (28) */\n    -5.333937253e-04f, +6.203708478e-04f, +1.280758059e-03f, -4.615602077e-03f, +4.657333550e-03f, +3.486198863e-03f, -1.615464364e-02f, +1.831315984e-02f, +3.942926982e-03f, -4.226159745e-02f, +5.865885609e-02f, -7.591303891e-03f, -1.276079507e-01f, +3.420784470e-01f, +6.787289389e-01f, +1.820128346e-01f, -1.400627162e-01f, +3.999572933e-02f, +3.053578164e-02f, -4.347655352e-02f, +1.898123484e-02f, +7.059243422e-03f, -1.478000541e-02f, +7.750295448e-03f, +8.844195042e-04f, -3.651461360e-03f, +1.962869071e-03f, -6.643282774e-05f,\n    +2.361553000e-05f, -9.470218299e-05f, +1.267940064e-04f, +5.784337511e-05f, -4.639829239e-04f, +6.727852572e-04f, -8.483291066e-05f, -1.278292778e-03f, +2.191974093e-03f, -8.946875297e-04f, -2.987242269e-03f, +6.701697695e-03f, -4.046497979e-03f, -2.011548148e-02f, +3.688363072e-03f, +1.955462103e-02f, -8.093325730e-04f, -5.050687187e-03f, +3.909331578e-03f, -5.647954722e-04f, -1.519920503e-03f, +1.483893463e-03f, -4.111248556e-04f, -3.825177745e-04f, +4.629835816e-04f, -1.751393235e-04f, -4.373845388e-05f, +7.449492353e-05f,\n    +5.333937253e-04f, -1.203975948e-03f, -2.744764966e-04f, +4.967930161e-03f, -9.178180697e-03f, +5.617587802e-03f, +8.407974380e-03f, -2.365494387e-02f, +2.351074287e-02f, -4.314856932e-04f, -3.154352798e-02f, +4.473777593e-02f, -2.299758210e-02f, -1.993826460e-02f, +4.968265498e-02f, -4.168282230e-02f, +3.625917663e-03f, +3.237184194e-02f, -3.943819829e-02f, +1.797822043e-02f, +9.439947860e-03f, -2.146021198e-02f, +1.492800474e-02f, -1.800253514e-03f, -5.791244388e-03f, +5.361789918e-03f, -1.802903709e-03f, +6.643282774e-05f,\n    -2.361553000e-05f, +1.197612733e-04f, -2.375994722e-04f, +1.569321239e-04f, +3.113046415e-04f, -9.475452486e-04f, +1.072400192e-03f, -1.333887276e-04f, -1.504166230e-03f, +2.504794604e-03f, -1.643181823e-03f, -8.520233772e-04f, +3.139848145e-03f, -3.243543226e-03f, +8.932778993e-04f, +2.098072660e-03f, -3.396533172e-03f, +2.176626640e-03f, +3.057434476e-04f, -2.019966433e-03f, +1.944678327e-03f, -6.602028232e-04f, -5.373958055e-04f, +8.741298214e-04f, -5.142632352e-04f, +5.388970461e-05f, +1.403354128e-04f, -7.449492353e-05f,\n    /* 12,29 (28) */\n    -5.097781953e-04f, +5.256686648e-04f, +1.407552065e-03f, -4.557758702e-03f, +4.193350626e-03f, +4.158984120e-03f, -1.623947655e-02f, +1.703486706e-02f, +6.134901075e-03f, -4.315628498e-02f, +5.567161382e-02f, -8.896061963e-04f, -1.316544486e-01f, +3.219629655e-01f, +6.824173020e-01f, +2.015674556e-01f, -1.408720487e-01f, +3.494504214e-02f, +3.444511322e-02f, -4.404134900e-02f, +1.746131434e-02f, +8.543136885e-03f, -1.519113027e-02f, +7.367777674e-03f, +1.347403086e-03f, -3.826600684e-03f, +1.919130618e-03f, +8.062095791e-06f,\n    +2.515381512e-05f, -9.296887939e-05f, +1.150900565e-04f, +7.791644304e-05f, -4.709614541e-04f, +6.365162621e-04f, -7.271196806e-06f, -1.329658048e-03f, +2.117868078e-03f, -6.772374843e-04f, -3.175957353e-03f, +6.531484372e-03f, -3.304936433e-03f, -2.018558845e-02f, +2.642039421e-03f, +1.978103177e-02f, -1.734178923e-04f, -5.344548510e-03f, +3.835463284e-03f, -3.696919477e-04f, -1.634857349e-03f, +1.476424179e-03f, -3.484126929e-04f, -4.279728673e-04f, +4.699237877e-04f, -1.619532692e-04f, -5.544275033e-05f, +7.837259355e-05f,\n    +5.097781953e-04f, -1.084214675e-03f, -5.120759688e-04f, +5.124862285e-03f, -8.866876055e-03f, +4.670042554e-03f, +9.480374572e-03f, -2.378833259e-02f, +2.200657664e-02f, +2.073308911e-03f, -3.318670980e-02f, +4.388575255e-02f, -1.985773396e-02f, -2.318180783e-02f, +5.057593288e-02f, -3.958474964e-02f, +2.293844911e-04f, +3.454846858e-02f, -3.913245484e-02f, +1.595825400e-02f, +1.138462619e-02f, -2.212041481e-02f, +1.439060894e-02f, -9.261236930e-04f, -6.305507623e-03f, +5.415679622e-03f, -1.662568296e-03f, -8.062095791e-06f,\n    -2.515381512e-05f, +1.201746071e-04f, -2.257559918e-04f, +1.252430481e-04f, +3.491375938e-04f, -9.514704756e-04f, +1.005766924e-03f, -1.204521806e-05f, -1.596030675e-03f, +2.469937770e-03f, -1.465248192e-03f, -1.065821184e-03f, +3.227329962e-03f, -3.122510283e-03f, +6.413306954e-04f, +2.299989110e-03f, -3.411296493e-03f, +2.016582388e-03f, +5.048633795e-04f, -2.121286551e-03f, +1.911723046e-03f, -5.575549909e-04f, -6.213378295e-04f, +8.982611748e-04f, -4.945347714e-04f, +2.610804149e-05f, +1.557543963e-04f, -7.837259355e-05f,\n    /* 12,30 (28) */\n    -4.846243802e-04f, +4.326997854e-04f, +1.522642122e-03f, -4.479842259e-03f, +3.722389172e-03f, +4.795500382e-03f, -1.624674774e-02f, +1.570520902e-02f, +8.252769153e-03f, -4.383352246e-02f, +5.249565646e-02f, +5.641878176e-03f, -1.349593851e-01f, +3.017773770e-01f, +6.850593414e-01f, +2.213484874e-01f, -1.410454666e-01f, +2.960049363e-02f, +3.828057650e-02f, -4.441104094e-02f, +1.582645699e-02f, +1.001956106e-02f, -1.553954296e-02f, +6.939804807e-03f, +1.817326873e-03f, -3.988553953e-03f, +1.863687867e-03f, +8.643468934e-05f,\n    +2.643210268e-05f, -9.079849612e-05f, +1.032215887e-04f, +9.698124191e-05f, -4.754753349e-04f, +5.981149961e-04f, +6.856006816e-05f, -1.373719731e-03f, +2.035505433e-03f, -4.612341352e-04f, -3.346114859e-03f, +6.336929088e-03f, -2.575877161e-03f, -2.020456610e-02f, +1.588226575e-03f, +1.996025146e-02f, +4.848968310e-04f, -5.621703527e-03f, +3.742165744e-03f, -1.687035297e-04f, -1.744506828e-03f, +1.461742008e-03f, -2.825427336e-04f, -4.725039166e-04f, +4.747226022e-04f, -1.475049942e-04f, -6.730415010e-05f, +8.197548550e-05f,\n    +4.846243802e-04f, -9.640400678e-04f, -7.378319605e-04f, +5.250105333e-03f, -8.517738462e-03f, +3.718572078e-03f, +1.048614150e-02f, -2.380037781e-02f, +2.041054596e-02f, +4.543246681e-03f, -3.465195799e-02f, +4.281993136e-02f, -1.663040399e-02f, -2.630431811e-02f, +5.121726357e-02f, -3.728476053e-02f, -3.181912001e-03f, +3.656505097e-02f, -3.862759146e-02f, +1.383696745e-02f, +1.329634923e-02f, -2.267796980e-02f, +1.376927111e-02f, -2.786251825e-05f, -6.800042395e-03f, +5.441787664e-03f, -1.506813900e-03f, -8.643468934e-05f,\n    -2.643210268e-05f, +1.198041350e-04f, -2.130536507e-04f, +9.381007205e-05f, +3.841981137e-04f, -9.503729501e-04f, +9.351215115e-04f, +1.075964685e-04f, -1.678687701e-03f, +2.422921794e-03f, -1.281268207e-03f, -1.273052197e-03f, +3.298229076e-03f, -2.985948991e-03f, +3.861118649e-04f, +2.490700469e-03f, -3.408857351e-03f, +1.845359890e-03f, +7.030032145e-04f, -2.212789912e-03f, +1.868519948e-03f, -4.504588533e-04f, -7.035481900e-04f, +9.181381898e-04f, -4.716071764e-04f, -2.693099346e-06f, +1.708411199e-04f, -8.197548550e-05f,\n    /* 12,31 (28) */\n    -4.581922775e-04f, +3.419012893e-04f, +1.625863710e-03f, -4.382861017e-03f, +3.246913837e-03f, +5.393615378e-03f, -1.617818768e-02f, +1.433148928e-02f, +1.028827459e-02f, -4.429475660e-02f, +4.914954161e-02f, +1.197880726e-02f, -1.375352622e-01f, +2.815728109e-01f, +6.866475680e-01f, +2.413087388e-01f, -1.405605698e-01f, +2.397879011e-02f, +4.202274224e-02f, -4.457974447e-02f, +1.408195016e-02f, +1.148130307e-02f, -1.582208569e-02f, +6.467300890e-03f, +2.292049476e-03f, -4.136058947e-03f, +1.796383717e-03f, +1.684101748e-04f,\n    +2.745459118e-05f, -8.822150698e-05f, +9.125701215e-05f, +1.149719352e-04f, -4.775685101e-04f, +5.578184186e-04f, +1.423394688e-04f, -1.410425884e-03f, +1.945437062e-03f, -2.476320516e-04f, -3.497362304e-03f, +6.119451369e-03f, -1.861481453e-03f, -2.017288707e-02f, +5.299098635e-04f, +2.009118504e-02f, +1.163826103e-03f, -5.880531475e-03f, +3.629437058e-03f, +3.735582438e-05f, -1.848238513e-03f, +1.439760328e-03f, -2.137625121e-04f, -5.158670931e-04f, +4.772958510e-04f, -1.318301341e-04f, -7.926299444e-05f, +8.526960746e-05f,\n    +4.581922775e-04f, -8.442359327e-04f, -9.508856112e-04f, +5.343915405e-03f, -8.133540348e-03f, +2.768199128e-03f, +1.142126301e-02f, -2.369278134e-02f, +1.873185826e-02f, +6.966168475e-03f, -3.593322620e-02f, +4.154687917e-02f, -1.333217492e-02f, -2.929026710e-02f, +5.160337544e-02f, -3.479406006e-02f, -6.590769352e-03f, +3.841041086e-02f, -3.792458825e-02f, +1.162417754e-02f, +1.516486918e-02f, -2.312842865e-02f, +1.306572292e-02f, +8.902756715e-04f, -7.271649571e-03f, +5.439094564e-03f, -1.335972780e-03f, -1.684101748e-04f,\n    -2.745459118e-05f, +1.186846730e-04f, -1.995966708e-04f, +6.280130302e-05f, +4.163629789e-04f, -9.443600182e-04f, +8.609019613e-04f, +2.249406299e-04f, -1.751821072e-03f, +2.364105091e-03f, -1.092228303e-03f, -1.472695063e-03f, +3.352244024e-03f, -2.834582782e-03f, +1.289232061e-04f, +2.669210172e-03f, -3.389161541e-03f, +1.663773246e-03f, +8.991337447e-04f, -2.293903971e-03f, +1.815168006e-03f, -3.394120637e-04f, -7.835579473e-04f, +9.335634383e-04f, -4.455277979e-04f, -3.237785643e-05f, +1.854904982e-04f, -8.526960746e-05f,\n    /* 13, 0 (28) */\n    +0.000000000e+00f, +5.666384406e-04f, +1.138827626e-03f, -4.947832042e-03f, +7.775272907e-03f, -3.753683238e-03f, -1.054677731e-02f, +2.921374884e-02f, -3.521211508e-02f, +8.626724797e-03f, +5.817244274e-02f, -1.493766746e-01f, +2.292750740e-01f, +7.389097765e-01f, +2.292750740e-01f, -1.493766746e-01f, +5.817244274e-02f, +8.626724797e-03f, -3.521211508e-02f, +2.921374884e-02f, -1.054677731e-02f, -3.753683238e-03f, +7.775272907e-03f, -4.947832042e-03f, +1.138827626e-03f, +5.666384406e-04f, -4.718714774e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.062275038e-04f, +1.642079905e-04f, -3.176805304e-05f, -4.176963452e-04f, +9.973204594e-04f, -1.100348265e-03f, +3.307050691e-05f, +2.256548147e-03f, -4.528570802e-03f, +4.216758229e-03f, +2.225335438e-03f, -2.276039521e-02f, -6.588330695e-04f, +2.300746985e-02f, -1.490762572e-03f, -4.646756306e-03f, +4.589590608e-03f, -2.116473039e-03f, -1.936159896e-04f, +1.185485254e-03f, -1.003241430e-03f, +3.865415996e-04f, +6.120553119e-05f, -1.777732382e-04f, +1.083396587e-04f, -3.046316603e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.666384406e-04f, +1.805043397e-04f, +3.931653329e-03f, -1.009328495e-02f, +1.316547915e-02f, -6.922639574e-03f, -9.865401789e-03f, +2.934697745e-02f, -3.767009023e-02f, +2.481811038e-02f, +6.027636000e-03f, -3.812597854e-02f, +5.173229864e-02f, -3.812597854e-02f, +6.027636000e-03f, +2.481811038e-02f, -3.767009023e-02f, +2.934697745e-02f, -9.865401789e-03f, -6.922639574e-03f, +1.316547915e-02f, -1.009328495e-02f, +3.931653329e-03f, +1.805043397e-04f, -1.107043555e-03f, +4.718714774e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.062275038e-04f, -2.751890125e-04f, +3.110093128e-04f, +1.456841193e-06f, -7.291662721e-04f, +1.537349632e-03f, -1.761654064e-03f, +8.667499304e-04f, +1.005892713e-03f, -2.900749650e-03f, +3.574934381e-03f, -2.385474553e-03f, -1.485956862e-04f, +2.610021763e-03f, -3.625468615e-03f, +2.776824637e-03f, -7.966397787e-04f, -1.047919596e-03f, +1.845275877e-03f, -1.523971638e-03f, +6.663274538e-04f, +5.985853526e-05f, -3.457286673e-04f, +2.854839571e-04f, -1.291115539e-04f, +3.046316603e-05f, +0.000000000e+00f,\n    /* 13, 1 (28) */\n    +0.000000000e+00f, +4.604109368e-04f, +1.303035617e-03f, -4.979600095e-03f, +7.357576562e-03f, -2.756362779e-03f, -1.164712558e-02f, +2.924681934e-02f, -3.295556694e-02f, +4.098153994e-03f, +6.238920097e-02f, -1.471513392e-01f, +2.065146788e-01f, +7.382509434e-01f, +2.522825438e-01f, -1.508674372e-01f, +5.352568643e-02f, +1.321631540e-02f, -3.732858812e-02f, +2.902013285e-02f, -9.361292059e-03f, -4.756924668e-03f, +8.161814506e-03f, -4.886626511e-03f, +9.610543883e-04f, +6.749780993e-04f, -5.023346435e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.035369698e-04f, +1.501980935e-04f, -3.115425745e-06f, -4.456342732e-04f, +9.860909236e-04f, -1.011283154e-03f, -1.240131204e-04f, +2.381493442e-03f, -4.445168958e-03f, +3.776343637e-03f, +2.923960520e-03f, -2.245095193e-02f, -1.974338440e-03f, +2.319051509e-02f, -7.223519144e-04f, -5.063876891e-03f, +4.627383065e-03f, -1.961687659e-03f, -3.568177317e-04f, +1.266123263e-03f, -1.003681580e-03f, +3.522579540e-04f, +9.127722124e-05f, -1.907913140e-04f, +1.098320620e-04f, -2.900563891e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.604109368e-04f, -9.468467279e-05f, +4.242662642e-03f, -1.009182811e-02f, +1.243631287e-02f, -5.385289943e-03f, -1.162705585e-02f, +3.021372738e-02f, -3.666419751e-02f, +2.191736073e-02f, +9.602570382e-03f, -4.051145310e-02f, +5.158370296e-02f, -3.551595678e-02f, +2.402167386e-03f, +2.759493502e-02f, -3.846673000e-02f, +2.829905785e-02f, -8.020125912e-03f, -8.446611213e-03f, +1.383180660e-02f, -1.003342641e-02f, +3.585924662e-03f, +4.659882969e-04f, -1.236155109e-03f, +5.023346435e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.035369698e-04f, -2.634750820e-04f, +2.754144351e-04f, +6.121449438e-05f, -7.863339812e-04f, +1.541411923e-03f, -1.668892457e-03f, +6.826111404e-04f, +1.207398695e-03f, -3.006986120e-03f, +3.503856533e-03f, -2.147565162e-03f, -4.449132663e-04f, +2.819855678e-03f, -3.655071878e-03f, +2.635828651e-03f, -5.808159810e-04f, -1.225000850e-03f, +1.919122492e-03f, -1.501198175e-03f, +5.980893329e-04f, +1.223808529e-04f, -3.793169380e-04f, +2.942351695e-04f, -1.273206692e-04f, +2.900563891e-05f, +0.000000000e+00f,\n    /* 13, 2 (28) */\n    +0.000000000e+00f, +3.568739670e-04f, +1.453233711e-03f, -4.982715521e-03f, +6.911942288e-03f, -1.770271855e-03f, -1.265840873e-02f, +2.912280622e-02f, -3.057407349e-02f, -3.470149638e-04f, +6.616554460e-02f, -1.442273786e-01f, +1.840637268e-01f, +7.362766049e-01f, +2.754730589e-01f, -1.515897891e-01f, +4.846180954e-02f, +1.784369847e-02f, -3.929027578e-02f, +2.866331511e-02f, -8.095168796e-03f, -5.760606248e-03f, +8.514072460e-03f, -4.795349290e-03f, +7.702630743e-04f, +7.848101613e-04f, -5.313402824e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.003116459e-04f, +1.358452277e-04f, +2.461098367e-05f, -4.702883075e-04f, +9.697505223e-04f, -9.188691881e-04f, -2.768656977e-04f, +2.490978499e-03f, -4.340326664e-03f, +3.327966122e-03f, +3.584714385e-03f, -2.208102088e-02f, -3.283370116e-03f, +2.330809873e-02f, +7.760647110e-05f, -5.465663188e-03f, +4.641205545e-03f, -1.792700286e-03f, -5.218374028e-04f, +1.341703266e-03f, -9.984957275e-04f, +3.149542135e-04f, +1.218238603e-04f, -2.031594912e-04f, +1.106659353e-04f, -2.720572775e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.568739670e-04f, -3.581597548e-04f, +4.518077077e-03f, -1.003061361e-02f, +1.164997889e-02f, -3.843878019e-03f, -1.329594831e-02f, +3.089633852e-02f, -3.545679882e-02f, +1.891037461e-02f, +1.310642691e-02f, -4.265901826e-02f, +5.113878969e-02f, -3.269610110e-02f, -1.252904492e-03f, +3.023076367e-02f, -3.904754599e-02f, +2.707405700e-02f, -6.101003420e-03f, -9.947809388e-03f, +1.442989593e-02f, -9.911045560e-03f, +3.206607724e-03f, +7.602234664e-04f, -1.363475778e-03f, +5.313402824e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.003116459e-04f, -2.504725758e-04f, +2.391981328e-04f, +1.190818207e-04f, -8.375993150e-04f, +1.536293796e-03f, -1.567672895e-03f, +4.966277806e-04f, +1.400038251e-03f, -3.095025844e-03f, +3.412742929e-03f, -1.897721222e-03f, -7.386147236e-04f, +3.013710000e-03f, -3.663480167e-03f, +2.478485587e-03f, -3.596473381e-04f, -1.396886603e-03f, +1.982609517e-03f, -1.469006405e-03f, +5.247633121e-04f, +1.857430367e-04f, -4.115188110e-04f, +3.013246526e-04f, -1.244593717e-04f, +2.720572775e-05f, +0.000000000e+00f,\n    /* 13, 3 (28) */\n    +0.000000000e+00f, +2.565623210e-04f, +1.589078938e-03f, -4.958104537e-03f, +6.441653981e-03f, -8.005213327e-04f, -1.357727792e-02f, +2.884594052e-02f, -2.808309500e-02f, -4.687341628e-03f, +6.949351073e-02f, -1.406426642e-01f, +1.619827059e-01f, +7.329932348e-01f, +2.987811577e-01f, -1.515121826e-01f, +4.299614635e-02f, +2.248490402e-02f, -4.108297607e-02f, +2.814147771e-02f, -6.753465530e-03f, -6.759101975e-03f, +8.829026674e-03f, -4.673525430e-03f, +5.671035832e-04f, +8.954760966e-04f, -5.585460101e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.659695896e-05f, +1.212496189e-04f, +5.127965363e-05f, -4.916120469e-04f, +9.485206610e-04f, -8.236906398e-04f, -4.247578241e-04f, +2.584761905e-03f, -4.215075025e-03f, +2.874060547e-03f, +4.205865745e-03f, -2.165269369e-02f, -4.581640972e-03f, +2.335902471e-02f, +9.066498346e-04f, -5.849674317e-03f, +4.630424092e-03f, -1.610107075e-03f, -6.878078633e-04f, +1.411681506e-03f, -9.875672809e-04f, +2.747599914e-04f, +1.526782824e-04f, -2.147754990e-04f, +1.108054658e-04f, -2.505909028e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.565623210e-04f, -6.086323306e-04f, +4.757275210e-03f, -9.911531792e-03f, +1.081237958e-02f, -2.307584223e-03f, -1.486362120e-02f, +3.139296630e-02f, -3.405676057e-02f, +1.581534877e-02f, +1.651916984e-02f, -4.455673948e-02f, +5.040017497e-02f, -2.968239110e-02f, -4.916384659e-03f, +3.270924926e-02f, -3.940719332e-02f, +2.567717040e-02f, -4.118393903e-03f, -1.141681579e-02f, +1.495465924e-02f, -9.725302524e-03f, +2.795088913e-03f, +1.061548119e-03f, -1.487935150e-03f, +5.585460101e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.659695896e-05f, -2.363164738e-04f, +2.026113880e-04f, +1.747461205e-04f, -8.827722149e-04f, +1.522184299e-03f, -1.458718841e-03f, +3.099227758e-04f, +1.582754796e-03f, -3.164472353e-03f, +3.302218369e-03f, -1.637438139e-03f, -1.027973458e-03f, +3.190411044e-03f, -3.650554938e-03f, +2.305621944e-03f, -1.344027528e-04f, -1.562488909e-03f, +2.035207894e-03f, -1.427431506e-03f, +4.466991721e-04f, +2.495637551e-04f, -4.420809697e-04f, +3.066422271e-04f, -1.205020512e-04f, +2.505909028e-05f, +0.000000000e+00f,\n    /* 13, 4 (28) */\n    +0.000000000e+00f, +1.599653621e-04f, +1.710328557e-03f, -4.906824884e-03f, +5.950041934e-03f, +1.479993283e-04f, -1.440096856e-02f, +2.842118270e-02f, -2.549833309e-02f, -8.902416653e-03f, +7.236757127e-02f, -1.364367985e-01f, +1.403300123e-01f, +7.284115939e-01f, +3.221401824e-01f, -1.506055328e-01f, +3.714647203e-02f, +2.711532811e-02f, -4.269308314e-02f, +2.745366985e-02f, -5.341784024e-03f, -7.746669256e-03f, +9.103786665e-03f, -4.520847147e-03f, +3.523280842e-04f, +1.006281562e-03f, -5.836051004e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.243979450e-05f, +1.065094541e-04f, +7.676940549e-05f, -5.095794818e-04f, +9.226446183e-04f, -7.263334385e-04f, -5.670029988e-04f, +2.662690692e-03f, -4.070527577e-03f, +2.417031984e-03f, +4.785880117e-03f, -2.116826255e-02f, -5.864906750e-03f, +2.334233961e-02f, +1.762150982e-03f, -6.213497163e-03f, +4.594518981e-03f, -1.414590709e-03f, -8.538373316e-04f, +1.475532923e-03f, -9.708096177e-04f, +2.318255039e-04f, +1.836662090e-04f, -2.255382006e-04f, +1.102181715e-04f, -2.256396701e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.599653621e-04f, -8.449488044e-04f, +4.959886598e-03f, -9.736785672e-03f, +9.929607362e-03f, -7.853999246e-04f, -1.632234004e-02f, +3.170288907e-02f, -3.247400577e-02f, +1.265087641e-02f, +1.982138821e-02f, -4.619417762e-02f, +4.937220151e-02f, -2.649198006e-02f, -8.566939598e-03f, +3.501487120e-02f, -3.954159608e-02f, +2.411468149e-02f, -2.083186010e-03f, -1.284424730e-02f, +1.540135842e-02f, -9.475738768e-03f, +2.353007943e-03f, +1.368190346e-03f, -1.608437201e-03f, +5.836051004e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.243979450e-05f, -2.211452307e-04f, +1.659004742e-04f, +2.279161552e-04f, -9.217042209e-04f, +1.499324190e-03f, -1.342790380e-03f, +1.236106114e-04f, +1.754560479e-03f, -3.215042567e-03f, +3.173020325e-03f, -1.368269953e-03f, -1.311288979e-03f, +3.348884988e-03f, -3.616284452e-03f, +2.118162462e-03f, +9.361335813e-05f, -1.720745848e-03f, +2.076447930e-03f, -1.376567395e-03f, +3.642835795e-04f, +3.134495968e-04f, -4.707538773e-04f, +3.100865742e-04f, -1.154306656e-04f, +2.256396701e-05f, +0.000000000e+00f,\n    /* 13, 5 (28) */\n    +0.000000000e+00f, +6.752556758e-05f, +1.816838011e-03f, -4.830055478e-03f, +5.440462452e-03f, +1.070643947e-03f, -1.512730200e-02f, +2.785417970e-02f, -2.283564240e-02f, -1.297294423e-02f, +7.478460326e-02f, -1.316509184e-01f, +1.191617497e-01f, +7.225466871e-01f, +3.454825220e-01f, -1.488433818e-01f, +3.093297487e-02f, +3.170984709e-02f, -4.410767385e-02f, +2.659983252e-02f, -3.866251101e-03f, -8.717478874e-03f, +9.335612169e-03f, -4.337180938e-03f, +1.267898836e-04f, +1.116499734e-03f, -6.061690674e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.788812129e-05f, +9.172032850e-05f, +1.009698238e-04f, -5.241845982e-04f, +8.923856324e-04f, -6.273818821e-04f, -7.029604286e-04f, +2.724699307e-03f, -3.907872914e-03f, +1.959244968e-03f, +5.323423542e-03f, -2.063020921e-02f, -7.128982949e-03f, +2.325733829e-02f, +2.641327353e-03f, -6.554758287e-03f, +4.533089791e-03f, -1.206918557e-03f, -1.019013777e-03f, +1.532754550e-03f, -9.481673272e-04f, +1.863212354e-04f, +2.146071067e-04f, -2.353482853e-04f, +1.088752545e-04f, -1.972130207e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.752556758e-05f, -1.066094035e-03f, +5.125787072e-03f, -9.508869516e-03f, +9.007903141e-03f, +7.139242659e-04f, -1.766513042e-02f, +3.182649968e-02f, -3.071944529e-02f, +9.435833847e-03f, +2.299440854e-02f, -4.756244757e-02f, +4.806091253e-02f, -2.314309507e-02f, -1.218322405e-02f, +3.713303366e-02f, -3.944798272e-02f, +2.239393564e-02f, -6.738080122e-06f, -1.422081469e-02f, +1.576564200e-02f, -9.162289172e-03f, +1.882254066e-03f, +1.678276920e-03f, -1.723867867e-03f, +6.061690674e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.788812129e-05f, -2.050996884e-04f, +1.293054374e-04f, +2.783235296e-04f, -9.542885906e-04f, +1.468003595e-03f, -1.220679060e-03f, -6.120935012e-05f, +1.914541550e-03f, -3.246567767e-03f, +3.025994011e-03f, -1.091819867e-03f, -1.586897125e-03f, +3.488164527e-03f, -3.560784353e-03f, +1.917125117e-03f, +3.230687144e-04f, -1.870628335e-03f, +2.105923006e-03f, -1.316567093e-03f, +2.779383284e-04f, +3.769973760e-04f, -4.972935788e-04f, +3.115662449e-04f, -1.092351538e-04f, +1.972130207e-05f, +0.000000000e+00f,\n    /* 13, 6 (28) */\n    +0.000000000e+00f, -2.036255371e-05f, +1.908558340e-03f, -4.729085655e-03f, +4.916277854e-03f, +1.963029579e-03f, -1.575468388e-02f, +2.715121927e-02f, -2.011094309e-02f, -1.688081714e-02f, +7.674384822e-02f, -1.263274948e-01f, +9.853154051e-02f, +7.154177042e-01f, +3.687398603e-01f, -1.462020544e-01f, +2.437821658e-02f, +3.624293688e-02f, -4.531459241e-02f, +2.558081874e-02f, -2.333496551e-03f, -9.665646201e-03f, +9.521933405e-03f, -4.122573832e-03f, -1.085584017e-04f, +1.225374988e-03f, -6.258903695e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.299062107e-05f, +7.697472709e-05f, +1.237815994e-04f, -5.354408745e-04f, +8.580249187e-04f, -5.274154314e-04f, -8.320375289e-04f, +2.770808149e-03f, -3.728367080e-03f, +1.503013125e-03f, +5.817365362e-03f, -2.004119328e-02f, -8.369761437e-03f, +2.310356835e-02f, +3.541250899e-03f, -6.871135840e-03f, +4.445859978e-03f, -9.879403409e-04f, -1.182409513e-03f, +1.582868856e-03f, -9.196172989e-04f, +1.384374741e-04f, +2.453151088e-04f, -2.441089716e-04f, +1.067519422e-04f, -1.653484773e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.036255371e-05f, -1.271193724e-03f, +5.255092509e-03f, -9.230545987e-03f, +8.053614551e-03f, +2.181927861e-03f, -1.888580949e-02f, +3.176529033e-02f, -2.880490374e-02f, +6.189266080e-03f, +2.602040255e-02f, -4.865426744e-02f, +4.647401540e-02f, -1.965493054e-02f, -1.574400840e-02f, +3.905015878e-02f, -3.912491400e-02f, +2.052330731e-02f, +2.099184926e-03f, -1.553738179e-02f, +1.604358032e-02f, -8.785291796e-03f, +1.384960487e-03f, +1.989843165e-03f, -1.833103021e-03f, +6.258903695e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.299062107e-05f, -1.883220027e-04f, +9.305865870e-05f, +3.257238936e-04f, -9.804601475e-04f, +1.428559377e-03f, -1.093202598e-03f, -2.434593859e-04f, +2.061863229e-03f, -3.258993846e-03f, +2.862086821e-03f, -8.097304951e-04f, -1.853180061e-03f, +3.607394893e-03f, -3.484297476e-03f, +1.703615528e-03f, +5.526110575e-04f, -2.011146789e-03f, +2.123292941e-03f, -1.247642724e-03f, +1.881183206e-04f, +4.397965535e-04f, -5.214635108e-04f, +3.110006277e-04f, -1.019138003e-04f, +1.653484773e-05f, +0.000000000e+00f,\n    /* 13, 7 (28) */\n    +0.000000000e+00f, -1.033531748e-04f, +1.985533067e-03f, -4.605304055e-03f, +4.380836980e-03f, +2.821054498e-03f, -1.628209931e-02f, +2.631918174e-02f, -1.734013494e-02f, -2.060918422e-02f, +7.824686135e-02f, -1.205101295e-01f, +7.849034723e-02f, +7.070479427e-01f, +3.918434286e-01f, -1.426608035e-01f, +1.750708074e-02f, +4.068879686e-02f, -4.630253275e-02f, +2.439840923e-02f, -7.506276950e-04f, -1.058526350e-02f, +9.660370879e-03f, -3.877258723e-03f, -3.526673733e-04f, +1.332126931e-03f, -6.424252172e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.779632627e-05f, +6.236154208e-05f, +1.451167943e-04f, -5.433806772e-04f, +8.198596317e-04f, -4.270056022e-04f, -9.536921084e-04f, +2.801121667e-03f, -3.533325761e-03f, +1.050589220e-03f, +6.266780051e-03f, -1.940403981e-02f, -9.583226735e-03f, +2.288083364e-02f, +4.458858722e-03f, -7.160371421e-03f, +4.332680891e-03f, -7.585853157e-04f, -1.343085979e-03f, +1.625427028e-03f, -8.851696499e-04f, +8.838371623e-05f, +2.755999959e-04f, -2.517267148e-04f, +1.038278118e-04f, -1.301125136e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.033531748e-04f, -1.459515726e-03f, +5.348151168e-03f, -8.904822093e-03f, +7.073154403e-03f, +3.610487237e-03f, -1.997901208e-02f, +3.152183095e-02f, -2.674304051e-02f, +2.930272234e-03f, +2.888248937e-02f, -4.946399793e-02f, +4.462083534e-02f, -1.604753565e-02f, -1.922830588e-02f, +4.075377431e-02f, -3.857230295e-02f, +1.851216052e-02f, +4.222477867e-03f, -1.678502451e-02f, +1.623169864e-02f, -8.345495242e-03f, +8.634969759e-04f, +2.300843793e-03f, -1.935016821e-03f, +6.424252172e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.779632627e-05f, -1.709545933e-04f, +5.738350604e-05f, +3.698979596e-04f, -1.000194868e-03f, +1.381372273e-03f, -9.611995013e-04f, -4.220897246e-04f, +2.195774053e-03f, -3.252380873e-03f, +2.682342166e-03f, -5.236738917e-04f, -2.108575985e-03f, +3.705839200e-03f, -3.387192871e-03f, +1.478820780e-03f, +7.808762236e-04f, -2.141357629e-03f, +2.128286983e-03f, -1.170065125e-03f, +9.530929370e-05f, +5.014317596e-04f, -5.430363062e-04f, +3.083208650e-04f, -9.347354665e-05f, +1.301125136e-05f, +0.000000000e+00f,\n    /* 13, 8 (28) */\n    +0.000000000e+00f, -1.811495010e-04f, +2.047894609e-03f, -4.460187261e-03f, +3.837456302e-03f, +3.640914129e-03f, -1.670910491e-02f, +2.536548964e-02f, -1.453901327e-02f, -2.414250999e-02f, +7.929745057e-02f, -1.142433494e-01f, +5.908630741e-02f, +6.974647160e-01f, +4.147242623e-01f, -1.382019448e-01f, +1.034670932e-02f, +4.502147775e-02f, -4.706111806e-02f, +2.305532325e-02f, +8.747993327e-04f, -1.147043315e-02f, +9.748754595e-03f, -3.601658727e-03f, -6.043940881e-04f, +1.435954742e-03f, -6.554364686e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.235426794e-05f, +4.796562905e-05f, +1.648990303e-04f, -5.480545602e-04f, +7.782007847e-04f, -3.267129711e-04f, -1.067434235e-03f, +2.815826067e-03f, -3.324116326e-03f, +6.041556545e-04f, +6.670948102e-03f, -1.872172627e-02f, -1.076547189e-02f, +2.258919663e-02f, +5.390964434e-03f, -7.420281819e-03f, +4.193535225e-03f, -5.198589686e-04f, -1.500098679e-03f, +1.660012150e-03f, -8.448684804e-04f, +3.638794055e-05f, +3.052682314e-04f, -2.581119179e-04f, +1.000870956e-04f, -9.160123521e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.811495010e-04f, -1.630470320e-03f, +5.405534674e-03f, -8.534924134e-03f, +6.072959535e-03f, +4.991859510e-03f, -2.094021158e-02f, +3.109974122e-02f, -2.454726646e-02f, -3.221086391e-04f, +3.156483154e-02f, -4.998767183e-02f, +4.251225936e-02f, -1.234169645e-02f, -2.261549875e-02f, +4.223259509e-02f, -3.779142672e-02f, +1.637080289e-02f, +6.350764850e-03f, -1.795508964e-02f, +1.632700794e-02f, -7.844063483e-03f, +3.204606698e-04f, +2.609164658e-03f, -2.028490368e-03f, +6.554364686e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.235426794e-05f, -1.531391213e-04f, +2.249308205e-05f, +4.106523320e-04f, -1.013509211e-03f, +1.326863789e-03f, -8.255236372e-04f, -5.960846152e-04f, +2.315609666e-03f, -3.226901958e-03f, +2.487892755e-03f, -2.353414328e-04f, -2.351588503e-03f, +3.782883076e-03f, -3.269964059e-03f, +1.244002728e-03f, +1.006496356e-03f, -2.260369555e-03f, +2.120706396e-03f, -1.084163094e-03f, +2.530729057e-08f, +5.614854043e-04f, -5.617955815e-04f, +3.034707119e-04f, -8.393024523e-05f, +9.160123521e-06f, +0.000000000e+00f,\n    /* 13, 9 (28) */\n    +0.000000000e+00f, -2.535037690e-04f, +2.095860238e-03f, -4.295288231e-03f, +3.289401742e-03f, +4.419114914e-03f, -1.703581789e-02f, +2.429805540e-02f, -1.172318721e-02f, -2.746662631e-02f, +7.990160622e-02f, -1.075724013e-01f, +4.036458114e-02f, +6.866992441e-01f, +4.373134589e-01f, -1.328109804e-01f, +2.926427504e-03f, +4.921501297e-02f, -4.758097703e-02f, +2.155522457e-02f, +2.534811483e-03f, -1.231530163e-02f, +9.785142535e-03f, -3.296390495e-03f, -8.625060060e-04f, +1.536041838e-03f, -6.645965921e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.671313584e-05f, +3.386740310e-05f, +1.830636012e-04f, -5.495304764e-04f, +7.333711394e-04f, -2.270843085e-04f, -1.172827774e-03f, +2.815186610e-03f, -3.102149750e-03f, +1.658154710e-04f, +7.029355970e-03f, -1.799736896e-02f, -1.191271385e-02f, +2.222897973e-02f, +6.334270191e-03f, -7.648770591e-03f, +4.028539872e-03f, -2.728392444e-04f, -1.652502250e-03f, +1.686242287e-03f, -7.987924505e-04f, -1.730424620e-05f, +3.341240478e-04f, -2.631796374e-04f, +9.551896573e-05f, -4.994086038e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.535037690e-04f, -1.783609441e-03f, +5.428027756e-03f, -8.124271802e-03f, +5.059450324e-03f, +6.318723299e-03f, -2.176573522e-02f, +3.050365661e-02f, -2.223165679e-02f, -3.549010597e-03f, +3.405272429e-02f, -5.022301326e-02f, +4.016067085e-02f, -8.558813371e-03f, -2.588546281e-02f, +4.347659782e-02f, -3.678493037e-02f, +1.411043333e-02f, +8.471471246e-03f, -1.903925273e-02f, +1.632703325e-02f, -7.282578078e-03f, -2.413349117e-04f, +2.912635370e-03f, -2.112420613e-03f, +6.645965921e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.671313584e-05f, -1.350155042e-04f, -1.141092508e-05f, +4.478201486e-04f, -1.020459203e-03f, +1.265492895e-03f, -6.870387704e-04f, -7.644681184e-04f, +2.420796052e-03f, -3.182841430e-03f, +2.279953364e-03f, +5.356640114e-05f, -2.580795591e-03f, +3.838038569e-03f, -3.133226515e-03f, +1.000490782e-03f, +1.228108205e-03f, -2.367349560e-03f, +2.100426641e-03f, -9.903222390e-04f, -9.719400026e-05f, +6.195403585e-04f, -5.775376941e-04f, +2.964073290e-04f, -7.330885302e-05f, +4.994086038e-06f, +0.000000000e+00f,\n    /* 13,10 (28) */\n    +0.000000000e+00f, -3.202169048e-04f, +2.129727641e-03f, -4.112224629e-03f, +2.739871266e-03f, +5.152486053e-03f, -1.726290219e-02f, +2.312522763e-02f, -8.908000598e-03f, -3.056877606e-02f, +8.006742169e-02f, -1.005430454e-01f, +2.236721218e-02f, +6.747865303e-01f, +4.595424386e-01f, -1.264767102e-01f, -4.722343086e-03f, +5.324355284e-02f, -4.785381628e-02f, +1.990272232e-02f, +4.221053770e-03f, -1.311409408e-02f, +9.767838289e-03f, -2.962266448e-03f, -1.125685643e-03f, +1.631560804e-03f, -6.695906781e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.092095278e-05f, +2.014247655e-05f, +1.995575102e-04f, -5.478929063e-04f, +6.857030792e-04f, -1.286498533e-04f, -1.269491606e-03f, +2.799544562e-03f, -2.868872478e-03f, -2.624161167e-04f, +7.341695092e-03f, -1.723420892e-02f, -1.302130835e-02f, +2.180076545e-02f, +7.285379355e-03f, -7.843839402e-03f, +3.837948144e-03f, -1.867230928e-05f, -1.799355657e-03f, +1.703773422e-03f, -7.470551697e-04f, -7.243059156e-05f, +3.619705764e-04f, -2.668502825e-04f, +9.011779337e-05f, -5.287991014e-07f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.202169048e-04f, -1.918624945e-03f, +5.416616831e-03f, -7.676451653e-03f, +4.038991121e-03f, +7.584216193e-03f, -2.245277399e-02f, +2.973918849e-02f, -1.981086074e-02f, -6.731852026e-03f, +3.633267766e-02f, -5.016944686e-02f, +3.757987526e-02f, -4.720774802e-03f, -2.901868932e-02f, +4.447708860e-02f, -3.555682216e-02f, +1.174308377e-02f, +1.057189789e-02f, -2.002957497e-02f, +1.622983925e-02f, -6.663037720e-03f, -8.188726058e-04f, +3.209042699e-03f, -2.185729466e-03f, +6.695906781e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.092095278e-05f, -1.167209713e-04f, -4.413928298e-05f, +4.812615323e-04f, -1.021139287e-03f, +1.197752534e-03f, -5.466131227e-04f, -9.263095869e-04f, +2.510852177e-03f, -3.120592361e-03f, +2.059813144e-03f, +3.413502696e-04f, -2.794858104e-03f, +3.870947275e-03f, -2.977714405e-03f, +7.496742596e-04f, +1.444361468e-03f, -2.461528657e-03f, +2.067399110e-03f, -8.889834667e-04f, -1.957863712e-04f, +6.751826899e-04f, -5.900734556e-04f, +2.871020006e-04f, -6.164356066e-05f, +5.287991014e-07f, +0.000000000e+00f,\n    /* 13,11 (28) */\n    +0.000000000e+00f, -3.811378576e-04f, +2.149870118e-03f, -3.912667119e-03f, +2.191978359e-03f, +5.838189133e-03f, -1.739155205e-02f, +2.185573602e-02f, -6.108456036e-03f, -3.343764854e-02f, +7.980500558e-02f, -9.320135027e-02f, +5.133003264e-03f, +6.617652219e-01f, +4.813432041e-01f, -1.191913308e-01f, -1.256618249e-02f, +5.708150099e-02f, -4.787248859e-02f, +1.810336666e-02f, +5.924827191e-03f, -1.386114925e-02f, +9.695407698e-03f, -2.600295871e-03f, -1.392535926e-03f, +1.721678597e-03f, -6.701194772e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.502476499e-05f, +6.861339264e-06f, +2.143394342e-04f, -5.432419131e-04f, +6.355364786e-04f, -3.192074028e-05f, -1.357100511e-03f, +2.769313790e-03f, -2.625758256e-03f, -6.786196215e-04f, +7.607859993e-03f, -1.643559746e-02f, -1.408776409e-02f, +2.130539552e-02f, +8.240809724e-03f, -8.003599086e-03f, +3.622151352e-03f, +2.414321334e-04f, -1.939727454e-03f, +1.712302259e-03f, -6.898053928e-04f, -1.287133037e-04f, +3.886110172e-04f, -2.690503014e-04f, +8.388338212e-05f, +4.217033608e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.811378576e-04f, -2.035345916e-03f, +5.372477548e-03f, -7.195190121e-03f, +3.017851834e-03f, +8.781968727e-03f, -2.299938711e-02f, +2.881287890e-02f, -1.730000856e-02f, -9.852444387e-03f, +3.839249080e-02f, -4.982809659e-02f, +3.478501716e-02f, -8.498275266e-04f, -3.199640373e-02f, +4.522676286e-02f, -3.411246069e-02f, +9.281555115e-03f, +1.263929700e-02f, -2.091855844e-02f, +1.603405287e-02f, -5.987855030e-03f, -1.408946061e-03f, +3.496144699e-03f, -2.247373027e-03f, +6.701194772e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.502476499e-05f, -9.838916744e-05f, -7.551614377e-05f, +5.108638555e-04f, -1.015680944e-03f, +1.124165980e-03f, -4.051139781e-04f, -1.080728805e-03f, +2.585392041e-03f, -3.040653435e-03f, +1.828827500e-03f, +6.263221827e-04f, -2.992527783e-03f, +3.881382693e-03f, -2.804276585e-03f, +4.929943112e-04f, +1.653927111e-03f, -2.542207253e-03f, +2.021652407e-03f, -7.806410820e-04f, -2.951700879e-04f, +7.280044372e-04f, -5.992297896e-04f, +2.755407731e-04f, -4.897785481e-05f, -4.217033608e-06f, +0.000000000e+00f,\n    /* 13,12 (28) */\n    +0.000000000e+00f, -4.361626226e-04f, +2.156731457e-03f, -3.698327685e-03f, +1.648736446e-03f, +6.473725611e-03f, -1.742347279e-02f, +2.049863551e-02f, -3.339142246e-03f, -3.606340680e-02f, +7.912638596e-02f, -8.559349027e-02f, -1.130259419e-02f, +6.476774578e-01f, +5.026485996e-01f, -1.109505211e-01f, -2.056978157e-02f, +6.070365234e-02f, -4.763105645e-02f, +1.616363921e-02f, +7.637129450e-03f, -1.455095464e-02f, +9.566694394e-03f, -2.211684854e-03f, -1.661586227e-03f, +1.805561979e-03f, -6.659024436e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.907035011e-05f, -5.910917565e-06f, +2.273796187e-04f, -5.356921292e-04f, +5.832165806e-04f, +6.261340719e-05f, -1.435385730e-03f, +2.724977041e-03f, -2.374299987e-03f, -1.080978587e-03f, +7.827945498e-03f, -1.560498126e-02f, -1.510875634e-02f, +2.074396882e-02f, +9.197007285e-03f, -8.126280355e-03f, +3.381679722e-03f, +5.062059580e-04f, -2.072701113e-03f, +1.711568846e-03f, -6.272270173e-04f, -1.858602791e-04f, +4.138498401e-04f, -2.697128497e-04f, +7.682117141e-05f, +9.221682500e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.361626226e-04f, -2.133735084e-03f, +5.296961404e-03f, -6.684326265e-03f, +2.002170890e-03f, +9.906134708e-03f, -2.340450109e-02f, +2.773215010e-02f, -1.471461652e-02f, -1.289309782e-02f, +4.022131830e-02f, -4.920177441e-02f, +3.179248938e-02f, +3.031555166e-03f, -3.480068031e-02f, +4.571975717e-02f, -3.245853358e-02f, +6.739347862e-03f, +1.466094940e-02f, -2.169919952e-02f, +1.573888279e-02f, -5.259850593e-03f, -2.008175851e-03f, +3.771685472e-03f, -2.296350881e-03f, +6.659024436e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.907035011e-05f, -8.014930969e-05f, -1.053798567e-04f, +5.365418178e-04f, -1.004251109e-03f, +1.045283064e-03f, -2.634023677e-04f, -1.226900757e-03f, +2.644126133e-03f, -2.943625195e-03f, +1.588409622e-03f, +9.068156165e-04f, -3.172654692e-03f, +3.869251777e-03f, -2.613871884e-03f, +2.319354898e-04f, +1.855505632e-03f, -2.608760156e-03f, +1.963293167e-03f, -6.658405276e-04f, -3.947473151e-04f, +7.776064029e-04f, -6.048513199e-04f, +2.617250043e-04f, -3.536451091e-05f, -9.221682500e-06f, +0.000000000e+00f,\n    /* 13,13 (28) */\n    +0.000000000e+00f, -4.852329727e-04f, +2.150820539e-03f, -3.470948066e-03f, +1.113044317e-03f, +7.056942192e-03f, -1.736085938e-02f, +1.906324978e-02f, -6.141652052e-04f, -3.843770678e-02f, +7.804540737e-02f, -7.776554478e-02f, -2.690757545e-02f, +6.325687015e-01f, +5.233925684e-01f, -1.017535138e-01f, -2.869606193e-02f, +6.408533206e-02f, -4.712485049e-02f, +1.409093809e-02f, +9.348698296e-03f, -1.517818166e-02f, +9.380834115e-03f, -1.797835014e-03f, -1.931299077e-03f, +1.882383151e-03f, -6.566807611e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.310194423e-05f, -1.811483376e-05f, +2.386597032e-04f, -5.253716848e-04f, +5.290918952e-04f, +1.544867102e-04f, -1.504135213e-03f, +2.667081932e-03f, -2.116001636e-03f, -1.467786266e-03f, +8.002243073e-03f, -1.474588724e-02f, -1.608113976e-02f, +2.011783827e-02f, +1.015036042e-02f, -8.210244114e-03f, +3.117202625e-03f, +7.743281446e-04f, -2.197380379e-03f, +1.701359018e-03f, -5.595388767e-04f, -2.435664463e-04f, +4.374940129e-04f, -2.687784368e-04f, +6.894240855e-05f, +1.446043300e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.852329727e-04f, -2.213884393e-03f, +5.191581547e-03f, -6.147784448e-03f, +9.979197807e-04f, +1.095141777e-02f, -2.366790346e-02f, +2.650524934e-02f, -1.207049039e-02f, -1.583672302e-02f, +4.180972792e-02f, -4.829495879e-02f, +2.861983468e-02f, +6.900806943e-03f, -3.741455220e-02f, +4.595169266e-02f, -3.060302795e-02f, +4.130587706e-03f, +1.662424257e-02f, -2.236504005e-02f, +1.534413547e-02f, -4.482244190e-03f, -2.613027171e-03f, +4.033410477e-03f, -2.331715392e-03f, +6.566807611e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.310194423e-05f, -6.212540086e-05f, -1.335836619e-04f, +5.582373432e-04f, -9.870503886e-04f, +9.616762905e-04f, -1.223278700e-04f, -1.364060002e-03f, +2.686862273e-03f, -2.830205698e-03f, +1.340021692e-03f, +1.181195470e-03f, -3.334194069e-03f, +3.834595678e-03f, -2.407563701e-03f, -3.198299301e-05f, +2.047835198e-03f, -2.660641164e-03f, +1.892506392e-03f, -5.451757631e-04f, -4.939076073e-04f, +8.236009485e-04f, -6.068018773e-04f, +2.456718199e-04f, -2.086551444e-05f, -1.446043300e-05f, +0.000000000e+00f,\n    /* 13,14 (28) */\n    +0.000000000e+00f, -5.283349169e-04f, +2.132705706e-03f, -3.232288363e-03f, +5.876726322e-04f, +7.586034087e-03f, -1.720637267e-02f, +1.755911457e-02f, +2.052916726e-03f, -4.055370842e-02f, +7.657762110e-02f, -6.976330170e-02f, -4.165346269e-02f, +6.164875617e-01f, +5.435104067e-01f, -9.160315340e-02f, -3.690630604e-02f, +6.720253469e-02f, -4.635052235e-02f, +1.189355772e-02f, +1.105005731e-02f, -1.573772054e-02f, +9.137267669e-03f, -1.360341001e-03f, -2.200077514e-03f, +1.951325559e-03f, -6.422203281e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.716198948e-05f, -2.969676839e-05f, +2.481724823e-04f, -5.124210841e-04f, +4.735121294e-04f, +2.432590839e-04f, -1.563193536e-03f, +2.596236670e-03f, -1.852370242e-03f, -1.837451654e-03f, +8.131236325e-03f, -1.386190716e-02f, -1.700196040e-02f, +1.942860661e-02f, +1.109721452e-02f, -8.253991319e-03f, +2.829528118e-03f, +1.044430696e-03f, -2.312894621e-03f, +1.681506628e-03f, -4.869943274e-04f, -3.015152215e-04f, +4.593542484e-04f, -2.661955450e-04f, +6.026428672e-05f, +1.990565033e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.283349169e-04f, -2.276009794e-03f, +5.057997886e-03f, -5.589547104e-03f, +1.086939211e-05f, +1.191309406e-02f, -2.379023133e-02f, +2.514118934e-02f, -9.383628118e-03f, -1.866692872e-02f, +4.314974961e-02f, -4.711376332e-02f, +2.528564062e-02f, +1.073540262e-02f, -3.982211590e-02f, +4.591970966e-02f, -2.855519275e-02f, +1.469946542e-03f, +1.851674896e-02f, -2.291021581e-02f, +1.485022786e-02f, -3.658643241e-03f, -3.219829048e-03f, +4.279082297e-03f, -2.352580907e-03f, +6.422203281e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.716198948e-05f, -4.443550510e-05f, -1.599962633e-04f, +5.759192987e-04f, -9.643110950e-04f, +8.739368830e-04f, +1.727644546e-05f, -1.491504628e-03f, +2.713505857e-03f, -2.701185600e-03f, +1.085165839e-03f, +1.447867802e-03f, -3.476212519e-03f, +3.777589673e-03f, -2.186513949e-03f, -2.972162719e-04f, +2.229699619e-03f, -2.697387220e-03f, +1.809555298e-03f, -4.192862961e-04f, -5.920315597e-04f, +8.656147719e-04f, -6.049659126e-04f, +2.274144693e-04f, -5.551909276e-06f, -1.990565033e-05f, +0.000000000e+00f,\n    /* 13,15 (28) */\n    +0.000000000e+00f, -5.654969064e-04f, +2.103008937e-03f, -2.984115881e-03f, +7.525154808e-05f, +8.059546216e-03f, -1.696311359e-02f, +1.599592103e-02f, +4.649153396e-03f, -4.240607866e-02f, +7.474016945e-02f, -6.163206538e-02f, -5.551536985e-02f, +5.994856013e-01f, +5.629390133e-01f, -8.050593888e-02f, -4.516029736e-02f, +7.003206280e-02f, -4.530609165e-02f, +9.580663094e-03f, +1.273156394e-02f, -1.622471486e-02f, +8.835752447e-03f, -9.009867525e-04f, -2.466273059e-03f, +2.011589846e-03f, -6.223146778e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.129090300e-05f, -4.060904399e-05f, +2.559216052e-04f, -4.969920381e-04f, +4.168261616e-04f, +3.285180955e-04f, -1.612461525e-03f, +2.513105536e-03f, -1.584908069e-03f, -2.188504860e-03f, +8.215595687e-03f, -1.295668211e-02f, -1.786846696e-02f, +1.867812106e-02f, +1.203388692e-02f, -8.256172327e-03f, +2.519601785e-03f, +1.315104923e-03f, -2.418404162e-03f, +1.651895564e-03f, -4.098806258e-04f, -3.593800691e-04f, +4.792462625e-04f, -2.619212169e-04f, +5.081004726e-05f, +2.552686838e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.654969064e-04f, -2.320445299e-03f, +4.898001622e-03f, -5.013627806e-03f, -9.534417029e-04f, +1.278703095e-02f, -2.377295488e-02f, +2.364968471e-02f, -6.670122261e-03f, -2.136811432e-02f, +4.423491545e-02f, -4.566589552e-02f, +2.180942810e-02f, +1.451299229e-02f, -4.200862985e-02f, +4.562249339e-02f, -2.632549313e-02f, -1.227440678e-03f, +2.032630426e-02f, -2.332950210e-02f, +1.425819630e-02f, -2.793028469e-03f, -3.824794961e-03f, +4.506496766e-03f, -2.358132816e-03f, +6.223146778e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.129090300e-05f, -2.719108854e-05f, -1.845022801e-04f, +5.895830417e-04f, -9.362951180e-04f, +7.826707763e-04f, +1.545988993e-04f, -1.608599772e-03f, +2.724059500e-03f, -2.557442720e-03f, +8.253749009e-04f, +1.705289295e-03f, -3.597893528e-03f, +3.698542274e-03f, -1.951976374e-03f, -5.622030383e-04f, +2.399936099e-03f, -2.718622083e-03f, +1.714780679e-03f, -2.888538808e-04f, -6.884945826e-04f, +9.032916486e-04f, -5.992498030e-04f, +2.070025762e-04f, +1.049642806e-05f, -2.552686838e-05f, +0.000000000e+00f,\n    /* 13,16 (28) */\n    +0.000000000e+00f, -5.967878094e-04f, +2.062399893e-03f, -2.728194276e-03f, -4.217404900e-04f, +8.476372378e-03f, -1.663459549e-02f, +1.438345951e-02f, +7.162258932e-03f, -4.399098673e-02f, +7.255166459e-02f, -5.341646969e-02f, -6.847205196e-02f, +5.816171343e-01f, +5.816171343e-01f, -6.847205196e-02f, -5.341646969e-02f, +7.255166459e-02f, -4.399098673e-02f, +7.162258932e-03f, +1.438345951e-02f, -1.663459549e-02f, +8.476372378e-03f, -4.217404900e-04f, -2.728194276e-03f, +2.062399893e-03f, -5.967878094e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.552686838e-05f, -5.081004726e-05f, +2.619212169e-04f, -4.792462625e-04f, +3.593800691e-04f, +4.098806258e-04f, -1.651895564e-03f, +2.418404162e-03f, -1.315104923e-03f, -2.519601785e-03f, +8.256172327e-03f, -1.203388692e-02f, -1.867812106e-02f, +1.786846696e-02f, +1.295668211e-02f, -8.215595687e-03f, +2.188504860e-03f, +1.584908069e-03f, -2.513105536e-03f, +1.612461525e-03f, -3.285180955e-04f, -4.168261616e-04f, +4.969920381e-04f, -2.559216052e-04f, +4.060904399e-05f, +3.129090300e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.967878094e-04f, -2.347636388e-03f, +4.713499342e-03f, -4.424044764e-03f, -1.889736821e-03f, +1.356970172e-02f, -2.361835599e-02f, +2.204108494e-02f, -3.946062761e-03f, -2.392555703e-02f, +4.506029035e-02f, -4.396060622e-02f, +1.821153457e-02f, +1.821153457e-02f, -4.396060622e-02f, +4.506029035e-02f, -2.392555703e-02f, -3.946062761e-03f, +2.204108494e-02f, -2.361835599e-02f, +1.356970172e-02f, -1.889736821e-03f, -4.424044764e-03f, +4.713499342e-03f, -2.347636388e-03f, +5.967878094e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.552686838e-05f, -1.049642806e-05f, -2.070025762e-04f, +5.992498030e-04f, -9.032916486e-04f, +6.884945826e-04f, +2.888538808e-04f, -1.714780679e-03f, +2.718622083e-03f, -2.399936099e-03f, +5.622030383e-04f, +1.951976374e-03f, -3.698542274e-03f, +3.597893528e-03f, -1.705289295e-03f, -8.253749009e-04f, +2.557442720e-03f, -2.724059500e-03f, +1.608599772e-03f, -1.545988993e-04f, -7.826707763e-04f, +9.362951180e-04f, -5.895830417e-04f, +1.845022801e-04f, +2.719108854e-05f, -3.129090300e-05f, +0.000000000e+00f,\n    /* 13,17 (28) */\n    +0.000000000e+00f, -6.223146778e-04f, +2.011589846e-03f, -2.466273059e-03f, -9.009867525e-04f, +8.835752447e-03f, -1.622471486e-02f, +1.273156394e-02f, +9.580663094e-03f, -4.530609165e-02f, +7.003206280e-02f, -4.516029736e-02f, -8.050593888e-02f, +5.629390133e-01f, +5.994856013e-01f, -5.551536985e-02f, -6.163206538e-02f, +7.474016945e-02f, -4.240607866e-02f, +4.649153396e-03f, +1.599592103e-02f, -1.696311359e-02f, +8.059546216e-03f, +7.525154808e-05f, -2.984115881e-03f, +2.103008937e-03f, -5.654969064e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.990565033e-05f, -6.026428672e-05f, +2.661955450e-04f, -4.593542484e-04f, +3.015152215e-04f, +4.869943274e-04f, -1.681506628e-03f, +2.312894621e-03f, -1.044430696e-03f, -2.829528118e-03f, +8.253991319e-03f, -1.109721452e-02f, -1.942860661e-02f, +1.700196040e-02f, +1.386190716e-02f, -8.131236325e-03f, +1.837451654e-03f, +1.852370242e-03f, -2.596236670e-03f, +1.563193536e-03f, -2.432590839e-04f, -4.735121294e-04f, +5.124210841e-04f, -2.481724823e-04f, +2.969676839e-05f, +3.716198948e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.223146778e-04f, -2.358132816e-03f, +4.506496766e-03f, -3.824794961e-03f, -2.793028469e-03f, +1.425819630e-02f, -2.332950210e-02f, +2.032630426e-02f, -1.227440678e-03f, -2.632549313e-02f, +4.562249339e-02f, -4.200862985e-02f, +1.451299229e-02f, +2.180942810e-02f, -4.566589552e-02f, +4.423491545e-02f, -2.136811432e-02f, -6.670122261e-03f, +2.364968471e-02f, -2.377295488e-02f, +1.278703095e-02f, -9.534417029e-04f, -5.013627806e-03f, +4.898001622e-03f, -2.320445299e-03f, +5.654969064e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.990565033e-05f, +5.551909276e-06f, -2.274144693e-04f, +6.049659126e-04f, -8.656147719e-04f, +5.920315597e-04f, +4.192862961e-04f, -1.809555298e-03f, +2.697387220e-03f, -2.229699619e-03f, +2.972162719e-04f, +2.186513949e-03f, -3.777589673e-03f, +3.476212519e-03f, -1.447867802e-03f, -1.085165839e-03f, +2.701185600e-03f, -2.713505857e-03f, +1.491504628e-03f, -1.727644546e-05f, -8.739368830e-04f, +9.643110950e-04f, -5.759192987e-04f, +1.599962633e-04f, +4.443550510e-05f, -3.716198948e-05f, +0.000000000e+00f,\n    /* 13,18 (28) */\n    +0.000000000e+00f, -6.422203281e-04f, +1.951325559e-03f, -2.200077514e-03f, -1.360341001e-03f, +9.137267669e-03f, -1.573772054e-02f, +1.105005731e-02f, +1.189355772e-02f, -4.635052235e-02f, +6.720253469e-02f, -3.690630604e-02f, -9.160315340e-02f, +5.435104067e-01f, +6.164875617e-01f, -4.165346269e-02f, -6.976330170e-02f, +7.657762110e-02f, -4.055370842e-02f, +2.052916726e-03f, +1.755911457e-02f, -1.720637267e-02f, +7.586034087e-03f, +5.876726322e-04f, -3.232288363e-03f, +2.132705706e-03f, -5.283349169e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.446043300e-05f, -6.894240855e-05f, +2.687784368e-04f, -4.374940129e-04f, +2.435664463e-04f, +5.595388767e-04f, -1.701359018e-03f, +2.197380379e-03f, -7.743281446e-04f, -3.117202625e-03f, +8.210244114e-03f, -1.015036042e-02f, -2.011783827e-02f, +1.608113976e-02f, +1.474588724e-02f, -8.002243073e-03f, +1.467786266e-03f, +2.116001636e-03f, -2.667081932e-03f, +1.504135213e-03f, -1.544867102e-04f, -5.290918952e-04f, +5.253716848e-04f, -2.386597032e-04f, +1.811483376e-05f, +4.310194423e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.422203281e-04f, -2.352580907e-03f, +4.279082297e-03f, -3.219829048e-03f, -3.658643241e-03f, +1.485022786e-02f, -2.291021581e-02f, +1.851674896e-02f, +1.469946542e-03f, -2.855519275e-02f, +4.591970966e-02f, -3.982211590e-02f, +1.073540262e-02f, +2.528564062e-02f, -4.711376332e-02f, +4.314974961e-02f, -1.866692872e-02f, -9.383628118e-03f, +2.514118934e-02f, -2.379023133e-02f, +1.191309406e-02f, +1.086939211e-05f, -5.589547104e-03f, +5.057997886e-03f, -2.276009794e-03f, +5.283349169e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.446043300e-05f, +2.086551444e-05f, -2.456718199e-04f, +6.068018773e-04f, -8.236009485e-04f, +4.939076073e-04f, +5.451757631e-04f, -1.892506392e-03f, +2.660641164e-03f, -2.047835198e-03f, +3.198299301e-05f, +2.407563701e-03f, -3.834595678e-03f, +3.334194069e-03f, -1.181195470e-03f, -1.340021692e-03f, +2.830205698e-03f, -2.686862273e-03f, +1.364060002e-03f, +1.223278700e-04f, -9.616762905e-04f, +9.870503886e-04f, -5.582373432e-04f, +1.335836619e-04f, +6.212540086e-05f, -4.310194423e-05f, +0.000000000e+00f,\n    /* 13,19 (28) */\n    +0.000000000e+00f, -6.566807611e-04f, +1.882383151e-03f, -1.931299077e-03f, -1.797835014e-03f, +9.380834115e-03f, -1.517818166e-02f, +9.348698296e-03f, +1.409093809e-02f, -4.712485049e-02f, +6.408533206e-02f, -2.869606193e-02f, -1.017535138e-01f, +5.233925684e-01f, +6.325687015e-01f, -2.690757545e-02f, -7.776554478e-02f, +7.804540737e-02f, -3.843770678e-02f, -6.141652052e-04f, +1.906324978e-02f, -1.736085938e-02f, +7.056942192e-03f, +1.113044317e-03f, -3.470948066e-03f, +2.150820539e-03f, -4.852329727e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.221682500e-06f, -7.682117141e-05f, +2.697128497e-04f, -4.138498401e-04f, +1.858602791e-04f, +6.272270173e-04f, -1.711568846e-03f, +2.072701113e-03f, -5.062059580e-04f, -3.381679722e-03f, +8.126280355e-03f, -9.197007285e-03f, -2.074396882e-02f, +1.510875634e-02f, +1.560498126e-02f, -7.827945498e-03f, +1.080978587e-03f, +2.374299987e-03f, -2.724977041e-03f, +1.435385730e-03f, -6.261340719e-05f, -5.832165806e-04f, +5.356921292e-04f, -2.273796187e-04f, +5.910917565e-06f, +4.907035011e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.566807611e-04f, -2.331715392e-03f, +4.033410477e-03f, -2.613027171e-03f, -4.482244190e-03f, +1.534413547e-02f, -2.236504005e-02f, +1.662424257e-02f, +4.130587706e-03f, -3.060302795e-02f, +4.595169266e-02f, -3.741455220e-02f, +6.900806943e-03f, +2.861983468e-02f, -4.829495879e-02f, +4.180972792e-02f, -1.583672302e-02f, -1.207049039e-02f, +2.650524934e-02f, -2.366790346e-02f, +1.095141777e-02f, +9.979197807e-04f, -6.147784448e-03f, +5.191581547e-03f, -2.213884393e-03f, +4.852329727e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.221682500e-06f, +3.536451091e-05f, -2.617250043e-04f, +6.048513199e-04f, -7.776064029e-04f, +3.947473151e-04f, +6.658405276e-04f, -1.963293167e-03f, +2.608760156e-03f, -1.855505632e-03f, -2.319354898e-04f, +2.613871884e-03f, -3.869251777e-03f, +3.172654692e-03f, -9.068156165e-04f, -1.588409622e-03f, +2.943625195e-03f, -2.644126133e-03f, +1.226900757e-03f, +2.634023677e-04f, -1.045283064e-03f, +1.004251109e-03f, -5.365418178e-04f, +1.053798567e-04f, +8.014930969e-05f, -4.907035011e-05f, +0.000000000e+00f,\n    /* 13,20 (28) */\n    +0.000000000e+00f, -6.659024436e-04f, +1.805561979e-03f, -1.661586227e-03f, -2.211684854e-03f, +9.566694394e-03f, -1.455095464e-02f, +7.637129450e-03f, +1.616363921e-02f, -4.763105645e-02f, +6.070365234e-02f, -2.056978157e-02f, -1.109505211e-01f, +5.026485996e-01f, +6.476774578e-01f, -1.130259419e-02f, -8.559349027e-02f, +7.912638596e-02f, -3.606340680e-02f, -3.339142246e-03f, +2.049863551e-02f, -1.742347279e-02f, +6.473725611e-03f, +1.648736446e-03f, -3.698327685e-03f, +2.156731457e-03f, -4.361626226e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.217033608e-06f, -8.388338212e-05f, +2.690503014e-04f, -3.886110172e-04f, +1.287133037e-04f, +6.898053928e-04f, -1.712302259e-03f, +1.939727454e-03f, -2.414321334e-04f, -3.622151352e-03f, +8.003599086e-03f, -8.240809724e-03f, -2.130539552e-02f, +1.408776409e-02f, +1.643559746e-02f, -7.607859993e-03f, +6.786196215e-04f, +2.625758256e-03f, -2.769313790e-03f, +1.357100511e-03f, +3.192074028e-05f, -6.355364786e-04f, +5.432419131e-04f, -2.143394342e-04f, -6.861339264e-06f, +5.502476499e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.659024436e-04f, -2.296350881e-03f, +3.771685472e-03f, -2.008175851e-03f, -5.259850593e-03f, +1.573888279e-02f, -2.169919952e-02f, +1.466094940e-02f, +6.739347862e-03f, -3.245853358e-02f, +4.571975717e-02f, -3.480068031e-02f, +3.031555166e-03f, +3.179248938e-02f, -4.920177441e-02f, +4.022131830e-02f, -1.289309782e-02f, -1.471461652e-02f, +2.773215010e-02f, -2.340450109e-02f, +9.906134708e-03f, +2.002170890e-03f, -6.684326265e-03f, +5.296961404e-03f, -2.133735084e-03f, +4.361626226e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.217033608e-06f, +4.897785481e-05f, -2.755407731e-04f, +5.992297896e-04f, -7.280044372e-04f, +2.951700879e-04f, +7.806410820e-04f, -2.021652407e-03f, +2.542207253e-03f, -1.653927111e-03f, -4.929943112e-04f, +2.804276585e-03f, -3.881382693e-03f, +2.992527783e-03f, -6.263221827e-04f, -1.828827500e-03f, +3.040653435e-03f, -2.585392041e-03f, +1.080728805e-03f, +4.051139781e-04f, -1.124165980e-03f, +1.015680944e-03f, -5.108638555e-04f, +7.551614377e-05f, +9.838916744e-05f, -5.502476499e-05f, +0.000000000e+00f,\n    /* 13,21 (28) */\n    +0.000000000e+00f, -6.701194772e-04f, +1.721678597e-03f, -1.392535926e-03f, -2.600295871e-03f, +9.695407698e-03f, -1.386114925e-02f, +5.924827191e-03f, +1.810336666e-02f, -4.787248859e-02f, +5.708150099e-02f, -1.256618249e-02f, -1.191913308e-01f, +4.813432041e-01f, +6.617652219e-01f, +5.133003264e-03f, -9.320135027e-02f, +7.980500558e-02f, -3.343764854e-02f, -6.108456036e-03f, +2.185573602e-02f, -1.739155205e-02f, +5.838189133e-03f, +2.191978359e-03f, -3.912667119e-03f, +2.149870118e-03f, -3.811378576e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.287991014e-07f, -9.011779337e-05f, +2.668502825e-04f, -3.619705764e-04f, +7.243059156e-05f, +7.470551697e-04f, -1.703773422e-03f, +1.799355657e-03f, +1.867230928e-05f, -3.837948144e-03f, +7.843839402e-03f, -7.285379355e-03f, -2.180076545e-02f, +1.302130835e-02f, +1.723420892e-02f, -7.341695092e-03f, +2.624161167e-04f, +2.868872478e-03f, -2.799544562e-03f, +1.269491606e-03f, +1.286498533e-04f, -6.857030792e-04f, +5.478929063e-04f, -1.995575102e-04f, -2.014247655e-05f, +6.092095278e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.701194772e-04f, -2.247373027e-03f, +3.496144699e-03f, -1.408946061e-03f, -5.987855030e-03f, +1.603405287e-02f, -2.091855844e-02f, +1.263929700e-02f, +9.281555115e-03f, -3.411246069e-02f, +4.522676286e-02f, -3.199640373e-02f, -8.498275266e-04f, +3.478501716e-02f, -4.982809659e-02f, +3.839249080e-02f, -9.852444387e-03f, -1.730000856e-02f, +2.881287890e-02f, -2.299938711e-02f, +8.781968727e-03f, +3.017851834e-03f, -7.195190121e-03f, +5.372477548e-03f, -2.035345916e-03f, +3.811378576e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.287991014e-07f, +6.164356066e-05f, -2.871020006e-04f, +5.900734556e-04f, -6.751826899e-04f, +1.957863712e-04f, +8.889834667e-04f, -2.067399110e-03f, +2.461528657e-03f, -1.444361468e-03f, -7.496742596e-04f, +2.977714405e-03f, -3.870947275e-03f, +2.794858104e-03f, -3.413502696e-04f, -2.059813144e-03f, +3.120592361e-03f, -2.510852177e-03f, +9.263095869e-04f, +5.466131227e-04f, -1.197752534e-03f, +1.021139287e-03f, -4.812615323e-04f, +4.413928298e-05f, +1.167209713e-04f, -6.092095278e-05f, +0.000000000e+00f,\n    /* 13,22 (28) */\n    +0.000000000e+00f, -6.695906781e-04f, +1.631560804e-03f, -1.125685643e-03f, -2.962266448e-03f, +9.767838289e-03f, -1.311409408e-02f, +4.221053770e-03f, +1.990272232e-02f, -4.785381628e-02f, +5.324355284e-02f, -4.722343086e-03f, -1.264767102e-01f, +4.595424386e-01f, +6.747865303e-01f, +2.236721218e-02f, -1.005430454e-01f, +8.006742169e-02f, -3.056877606e-02f, -8.908000598e-03f, +2.312522763e-02f, -1.726290219e-02f, +5.152486053e-03f, +2.739871266e-03f, -4.112224629e-03f, +2.129727641e-03f, -3.202169048e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.994086038e-06f, -9.551896573e-05f, +2.631796374e-04f, -3.341240478e-04f, +1.730424620e-05f, +7.987924505e-04f, -1.686242287e-03f, +1.652502250e-03f, +2.728392444e-04f, -4.028539872e-03f, +7.648770591e-03f, -6.334270191e-03f, -2.222897973e-02f, +1.191271385e-02f, +1.799736896e-02f, -7.029355970e-03f, -1.658154710e-04f, +3.102149750e-03f, -2.815186610e-03f, +1.172827774e-03f, +2.270843085e-04f, -7.333711394e-04f, +5.495304764e-04f, -1.830636012e-04f, -3.386740310e-05f, +6.671313584e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.695906781e-04f, -2.185729466e-03f, +3.209042699e-03f, -8.188726058e-04f, -6.663037720e-03f, +1.622983925e-02f, -2.002957497e-02f, +1.057189789e-02f, +1.174308377e-02f, -3.555682216e-02f, +4.447708860e-02f, -2.901868932e-02f, -4.720774802e-03f, +3.757987526e-02f, -5.016944686e-02f, +3.633267766e-02f, -6.731852026e-03f, -1.981086074e-02f, +2.973918849e-02f, -2.245277399e-02f, +7.584216193e-03f, +4.038991121e-03f, -7.676451653e-03f, +5.416616831e-03f, -1.918624945e-03f, +3.202169048e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.994086038e-06f, +7.330885302e-05f, -2.964073290e-04f, +5.775376941e-04f, -6.195403585e-04f, +9.719400026e-05f, +9.903222390e-04f, -2.100426641e-03f, +2.367349560e-03f, -1.228108205e-03f, -1.000490782e-03f, +3.133226515e-03f, -3.838038569e-03f, +2.580795591e-03f, -5.356640114e-05f, -2.279953364e-03f, +3.182841430e-03f, -2.420796052e-03f, +7.644681184e-04f, +6.870387704e-04f, -1.265492895e-03f, +1.020459203e-03f, -4.478201486e-04f, +1.141092508e-05f, +1.350155042e-04f, -6.671313584e-05f, +0.000000000e+00f,\n    /* 13,23 (28) */\n    +0.000000000e+00f, -6.645965921e-04f, +1.536041838e-03f, -8.625060060e-04f, -3.296390495e-03f, +9.785142535e-03f, -1.231530163e-02f, +2.534811483e-03f, +2.155522457e-02f, -4.758097703e-02f, +4.921501297e-02f, +2.926427504e-03f, -1.328109804e-01f, +4.373134589e-01f, +6.866992441e-01f, +4.036458114e-02f, -1.075724013e-01f, +7.990160622e-02f, -2.746662631e-02f, -1.172318721e-02f, +2.429805540e-02f, -1.703581789e-02f, +4.419114914e-03f, +3.289401742e-03f, -4.295288231e-03f, +2.095860238e-03f, -2.535037690e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.160123521e-06f, -1.000870956e-04f, +2.581119179e-04f, -3.052682314e-04f, -3.638794055e-05f, +8.448684804e-04f, -1.660012150e-03f, +1.500098679e-03f, +5.198589686e-04f, -4.193535225e-03f, +7.420281819e-03f, -5.390964434e-03f, -2.258919663e-02f, +1.076547189e-02f, +1.872172627e-02f, -6.670948102e-03f, -6.041556545e-04f, +3.324116326e-03f, -2.815826067e-03f, +1.067434235e-03f, +3.267129711e-04f, -7.782007847e-04f, +5.480545602e-04f, -1.648990303e-04f, -4.796562905e-05f, +7.235426794e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.645965921e-04f, -2.112420613e-03f, +2.912635370e-03f, -2.413349117e-04f, -7.282578078e-03f, +1.632703325e-02f, -1.903925273e-02f, +8.471471246e-03f, +1.411043333e-02f, -3.678493037e-02f, +4.347659782e-02f, -2.588546281e-02f, -8.558813371e-03f, +4.016067085e-02f, -5.022301326e-02f, +3.405272429e-02f, -3.549010597e-03f, -2.223165679e-02f, +3.050365661e-02f, -2.176573522e-02f, +6.318723299e-03f, +5.059450324e-03f, -8.124271802e-03f, +5.428027756e-03f, -1.783609441e-03f, +2.535037690e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.160123521e-06f, +8.393024523e-05f, -3.034707119e-04f, +5.617955815e-04f, -5.614854043e-04f, -2.530729057e-08f, +1.084163094e-03f, -2.120706396e-03f, +2.260369555e-03f, -1.006496356e-03f, -1.244002728e-03f, +3.269964059e-03f, -3.782883076e-03f, +2.351588503e-03f, +2.353414328e-04f, -2.487892755e-03f, +3.226901958e-03f, -2.315609666e-03f, +5.960846152e-04f, +8.255236372e-04f, -1.326863789e-03f, +1.013509211e-03f, -4.106523320e-04f, -2.249308205e-05f, +1.531391213e-04f, -7.235426794e-05f, +0.000000000e+00f,\n    /* 13,24 (28) */\n    +0.000000000e+00f, -6.554364686e-04f, +1.435954742e-03f, -6.043940881e-04f, -3.601658727e-03f, +9.748754595e-03f, -1.147043315e-02f, +8.747993327e-04f, +2.305532325e-02f, -4.706111806e-02f, +4.502147775e-02f, +1.034670932e-02f, -1.382019448e-01f, +4.147242623e-01f, +6.974647160e-01f, +5.908630741e-02f, -1.142433494e-01f, +7.929745057e-02f, -2.414250999e-02f, -1.453901327e-02f, +2.536548964e-02f, -1.670910491e-02f, +3.640914129e-03f, +3.837456302e-03f, -4.460187261e-03f, +2.047894609e-03f, -1.811495010e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.301125136e-05f, -1.038278118e-04f, +2.517267148e-04f, -2.755999959e-04f, -8.838371623e-05f, +8.851696499e-04f, -1.625427028e-03f, +1.343085979e-03f, +7.585853157e-04f, -4.332680891e-03f, +7.160371421e-03f, -4.458858722e-03f, -2.288083364e-02f, +9.583226735e-03f, +1.940403981e-02f, -6.266780051e-03f, -1.050589220e-03f, +3.533325761e-03f, -2.801121667e-03f, +9.536921084e-04f, +4.270056022e-04f, -8.198596317e-04f, +5.433806772e-04f, -1.451167943e-04f, -6.236154208e-05f, +7.779632627e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.554364686e-04f, -2.028490368e-03f, +2.609164658e-03f, +3.204606698e-04f, -7.844063483e-03f, +1.632700794e-02f, -1.795508964e-02f, +6.350764850e-03f, +1.637080289e-02f, -3.779142672e-02f, +4.223259509e-02f, -2.261549875e-02f, -1.234169645e-02f, +4.251225936e-02f, -4.998767183e-02f, +3.156483154e-02f, -3.221086391e-04f, -2.454726646e-02f, +3.109974122e-02f, -2.094021158e-02f, +4.991859510e-03f, +6.072959535e-03f, -8.534924134e-03f, +5.405534674e-03f, -1.630470320e-03f, +1.811495010e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.301125136e-05f, +9.347354665e-05f, -3.083208650e-04f, +5.430363062e-04f, -5.014317596e-04f, -9.530929370e-05f, +1.170065125e-03f, -2.128286983e-03f, +2.141357629e-03f, -7.808762236e-04f, -1.478820780e-03f, +3.387192871e-03f, -3.705839200e-03f, +2.108575985e-03f, +5.236738917e-04f, -2.682342166e-03f, +3.252380873e-03f, -2.195774053e-03f, +4.220897246e-04f, +9.611995013e-04f, -1.381372273e-03f, +1.000194868e-03f, -3.698979596e-04f, -5.738350604e-05f, +1.709545933e-04f, -7.779632627e-05f, +0.000000000e+00f,\n    /* 13,25 (28) */\n    +0.000000000e+00f, -6.424252172e-04f, +1.332126931e-03f, -3.526673733e-04f, -3.877258723e-03f, +9.660370879e-03f, -1.058526350e-02f, -7.506276950e-04f, +2.439840923e-02f, -4.630253275e-02f, +4.068879686e-02f, +1.750708074e-02f, -1.426608035e-01f, +3.918434286e-01f, +7.070479427e-01f, +7.849034723e-02f, -1.205101295e-01f, +7.824686135e-02f, -2.060918422e-02f, -1.734013494e-02f, +2.631918174e-02f, -1.628209931e-02f, +2.821054498e-03f, +4.380836980e-03f, -4.605304055e-03f, +1.985533067e-03f, -1.033531748e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.653484773e-05f, -1.067519422e-04f, +2.441089716e-04f, -2.453151088e-04f, -1.384374741e-04f, +9.196172989e-04f, -1.582868856e-03f, +1.182409513e-03f, +9.879403409e-04f, -4.445859978e-03f, +6.871135840e-03f, -3.541250899e-03f, -2.310356835e-02f, +8.369761437e-03f, +2.004119328e-02f, -5.817365362e-03f, -1.503013125e-03f, +3.728367080e-03f, -2.770808149e-03f, +8.320375289e-04f, +5.274154314e-04f, -8.580249187e-04f, +5.354408745e-04f, -1.237815994e-04f, -7.697472709e-05f, +8.299062107e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.424252172e-04f, -1.935016821e-03f, +2.300843793e-03f, +8.634969759e-04f, -8.345495242e-03f, +1.623169864e-02f, -1.678502451e-02f, +4.222477867e-03f, +1.851216052e-02f, -3.857230295e-02f, +4.075377431e-02f, -1.922830588e-02f, -1.604753565e-02f, +4.462083534e-02f, -4.946399793e-02f, +2.888248937e-02f, +2.930272234e-03f, -2.674304051e-02f, +3.152183095e-02f, -1.997901208e-02f, +3.610487237e-03f, +7.073154403e-03f, -8.904822093e-03f, +5.348151168e-03f, -1.459515726e-03f, +1.033531748e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.653484773e-05f, +1.019138003e-04f, -3.110006277e-04f, +5.214635108e-04f, -4.397965535e-04f, -1.881183206e-04f, +1.247642724e-03f, -2.123292941e-03f, +2.011146789e-03f, -5.526110575e-04f, -1.703615528e-03f, +3.484297476e-03f, -3.607394893e-03f, +1.853180061e-03f, +8.097304951e-04f, -2.862086821e-03f, +3.258993846e-03f, -2.061863229e-03f, +2.434593859e-04f, +1.093202598e-03f, -1.428559377e-03f, +9.804601475e-04f, -3.257238936e-04f, -9.305865870e-05f, +1.883220027e-04f, -8.299062107e-05f, +0.000000000e+00f,\n    /* 13,26 (28) */\n    +0.000000000e+00f, -6.258903695e-04f, +1.225374988e-03f, -1.085584017e-04f, -4.122573832e-03f, +9.521933405e-03f, -9.665646201e-03f, -2.333496551e-03f, +2.558081874e-02f, -4.531459241e-02f, +3.624293688e-02f, +2.437821658e-02f, -1.462020544e-01f, +3.687398603e-01f, +7.154177042e-01f, +9.853154051e-02f, -1.263274948e-01f, +7.674384822e-02f, -1.688081714e-02f, -2.011094309e-02f, +2.715121927e-02f, -1.575468388e-02f, +1.963029579e-03f, +4.916277854e-03f, -4.729085655e-03f, +1.908558340e-03f, -2.036255371e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.972130207e-05f, -1.088752545e-04f, +2.353482853e-04f, -2.146071067e-04f, -1.863212354e-04f, +9.481673272e-04f, -1.532754550e-03f, +1.019013777e-03f, +1.206918557e-03f, -4.533089791e-03f, +6.554758287e-03f, -2.641327353e-03f, -2.325733829e-02f, +7.128982949e-03f, +2.063020921e-02f, -5.323423542e-03f, -1.959244968e-03f, +3.907872914e-03f, -2.724699307e-03f, +7.029604286e-04f, +6.273818821e-04f, -8.923856324e-04f, +5.241845982e-04f, -1.009698238e-04f, -9.172032850e-05f, +8.788812129e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.258903695e-04f, -1.833103021e-03f, +1.989843165e-03f, +1.384960487e-03f, -8.785291796e-03f, +1.604358032e-02f, -1.553738179e-02f, +2.099184926e-03f, +2.052330731e-02f, -3.912491400e-02f, +3.905015878e-02f, -1.574400840e-02f, -1.965493054e-02f, +4.647401540e-02f, -4.865426744e-02f, +2.602040255e-02f, +6.189266080e-03f, -2.880490374e-02f, +3.176529033e-02f, -1.888580949e-02f, +2.181927861e-03f, +8.053614551e-03f, -9.230545987e-03f, +5.255092509e-03f, -1.271193724e-03f, +2.036255371e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.972130207e-05f, +1.092351538e-04f, -3.115662449e-04f, +4.972935788e-04f, -3.769973760e-04f, -2.779383284e-04f, +1.316567093e-03f, -2.105923006e-03f, +1.870628335e-03f, -3.230687144e-04f, -1.917125117e-03f, +3.560784353e-03f, -3.488164527e-03f, +1.586897125e-03f, +1.091819867e-03f, -3.025994011e-03f, +3.246567767e-03f, -1.914541550e-03f, +6.120935012e-05f, +1.220679060e-03f, -1.468003595e-03f, +9.542885906e-04f, -2.783235296e-04f, -1.293054374e-04f, +2.050996884e-04f, -8.788812129e-05f, +0.000000000e+00f,\n    /* 13,27 (28) */\n    +0.000000000e+00f, -6.061690674e-04f, +1.116499734e-03f, +1.267898836e-04f, -4.337180938e-03f, +9.335612169e-03f, -8.717478874e-03f, -3.866251101e-03f, +2.659983252e-02f, -4.410767385e-02f, +3.170984709e-02f, +3.093297487e-02f, -1.488433818e-01f, +3.454825220e-01f, +7.225466871e-01f, +1.191617497e-01f, -1.316509184e-01f, +7.478460326e-02f, -1.297294423e-02f, -2.283564240e-02f, +2.785417970e-02f, -1.512730200e-02f, +1.070643947e-03f, +5.440462452e-03f, -4.830055478e-03f, +1.816838011e-03f, +6.752556758e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.256396701e-05f, -1.102181715e-04f, +2.255382006e-04f, -1.836662090e-04f, -2.318255039e-04f, +9.708096177e-04f, -1.475532923e-03f, +8.538373316e-04f, +1.414590709e-03f, -4.594518981e-03f, +6.213497163e-03f, -1.762150982e-03f, -2.334233961e-02f, +5.864906750e-03f, +2.116826255e-02f, -4.785880117e-03f, -2.417031984e-03f, +4.070527577e-03f, -2.662690692e-03f, +5.670029988e-04f, +7.263334385e-04f, -9.226446183e-04f, +5.095794818e-04f, -7.676940549e-05f, -1.065094541e-04f, +9.243979450e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.061690674e-04f, -1.723867867e-03f, +1.678276920e-03f, +1.882254066e-03f, -9.162289172e-03f, +1.576564200e-02f, -1.422081469e-02f, -6.738080122e-06f, +2.239393564e-02f, -3.944798272e-02f, +3.713303366e-02f, -1.218322405e-02f, -2.314309507e-02f, +4.806091253e-02f, -4.756244757e-02f, +2.299440854e-02f, +9.435833847e-03f, -3.071944529e-02f, +3.182649968e-02f, -1.766513042e-02f, +7.139242659e-04f, +9.007903141e-03f, -9.508869516e-03f, +5.125787072e-03f, -1.066094035e-03f, -6.752556758e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.256396701e-05f, +1.154306656e-04f, -3.100865742e-04f, +4.707538773e-04f, -3.134495968e-04f, -3.642835795e-04f, +1.376567395e-03f, -2.076447930e-03f, +1.720745848e-03f, -9.361335813e-05f, -2.118162462e-03f, +3.616284452e-03f, -3.348884988e-03f, +1.311288979e-03f, +1.368269953e-03f, -3.173020325e-03f, +3.215042567e-03f, -1.754560479e-03f, -1.236106114e-04f, +1.342790380e-03f, -1.499324190e-03f, +9.217042209e-04f, -2.279161552e-04f, -1.659004742e-04f, +2.211452307e-04f, -9.243979450e-05f, +0.000000000e+00f,\n    /* 13,28 (28) */\n    +0.000000000e+00f, -5.836051004e-04f, +1.006281562e-03f, +3.523280842e-04f, -4.520847147e-03f, +9.103786665e-03f, -7.746669256e-03f, -5.341784024e-03f, +2.745366985e-02f, -4.269308314e-02f, +2.711532811e-02f, +3.714647203e-02f, -1.506055328e-01f, +3.221401824e-01f, +7.284115939e-01f, +1.403300123e-01f, -1.364367985e-01f, +7.236757127e-02f, -8.902416653e-03f, -2.549833309e-02f, +2.842118270e-02f, -1.440096856e-02f, +1.479993283e-04f, +5.950041934e-03f, -4.906824884e-03f, +1.710328557e-03f, +1.599653621e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.505909028e-05f, -1.108054658e-04f, +2.147754990e-04f, -1.526782824e-04f, -2.747599914e-04f, +9.875672809e-04f, -1.411681506e-03f, +6.878078633e-04f, +1.610107075e-03f, -4.630424092e-03f, +5.849674317e-03f, -9.066498346e-04f, -2.335902471e-02f, +4.581640972e-03f, +2.165269369e-02f, -4.205865745e-03f, -2.874060547e-03f, +4.215075025e-03f, -2.584761905e-03f, +4.247578241e-04f, +8.236906398e-04f, -9.485206610e-04f, +4.916120469e-04f, -5.127965363e-05f, -1.212496189e-04f, +9.659695896e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.836051004e-04f, -1.608437201e-03f, +1.368190346e-03f, +2.353007943e-03f, -9.475738768e-03f, +1.540135842e-02f, -1.284424730e-02f, -2.083186010e-03f, +2.411468149e-02f, -3.954159608e-02f, +3.501487120e-02f, -8.566939598e-03f, -2.649198006e-02f, +4.937220151e-02f, -4.619417762e-02f, +1.982138821e-02f, +1.265087641e-02f, -3.247400577e-02f, +3.170288907e-02f, -1.632234004e-02f, -7.853999246e-04f, +9.929607362e-03f, -9.736785672e-03f, +4.959886598e-03f, -8.449488044e-04f, -1.599653621e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.505909028e-05f, +1.205020512e-04f, -3.066422271e-04f, +4.420809697e-04f, -2.495637551e-04f, -4.466991721e-04f, +1.427431506e-03f, -2.035207894e-03f, +1.562488909e-03f, +1.344027528e-04f, -2.305621944e-03f, +3.650554938e-03f, -3.190411044e-03f, +1.027973458e-03f, +1.637438139e-03f, -3.302218369e-03f, +3.164472353e-03f, -1.582754796e-03f, -3.099227758e-04f, +1.458718841e-03f, -1.522184299e-03f, +8.827722149e-04f, -1.747461205e-04f, -2.026113880e-04f, +2.363164738e-04f, -9.659695896e-05f, +0.000000000e+00f,\n    /* 13,29 (28) */\n    +0.000000000e+00f, -5.585460101e-04f, +8.954760966e-04f, +5.671035832e-04f, -4.673525430e-03f, +8.829026674e-03f, -6.759101975e-03f, -6.753465530e-03f, +2.814147771e-02f, -4.108297607e-02f, +2.248490402e-02f, +4.299614635e-02f, -1.515121826e-01f, +2.987811577e-01f, +7.329932348e-01f, +1.619827059e-01f, -1.406426642e-01f, +6.949351073e-02f, -4.687341628e-03f, -2.808309500e-02f, +2.884594052e-02f, -1.357727792e-02f, -8.005213327e-04f, +6.441653981e-03f, -4.958104537e-03f, +1.589078938e-03f, +2.565623210e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.720572775e-05f, -1.106659353e-04f, +2.031594912e-04f, -1.218238603e-04f, -3.149542135e-04f, +9.984957275e-04f, -1.341703266e-03f, +5.218374028e-04f, +1.792700286e-03f, -4.641205545e-03f, +5.465663188e-03f, -7.760647110e-05f, -2.330809873e-02f, +3.283370116e-03f, +2.208102088e-02f, -3.584714385e-03f, -3.327966122e-03f, +4.340326664e-03f, -2.490978499e-03f, +2.768656977e-04f, +9.188691881e-04f, -9.697505223e-04f, +4.702883075e-04f, -2.461098367e-05f, -1.358452277e-04f, +1.003116459e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.585460101e-04f, -1.487935150e-03f, +1.061548119e-03f, +2.795088913e-03f, -9.725302524e-03f, +1.495465924e-02f, -1.141681579e-02f, -4.118393903e-03f, +2.567717040e-02f, -3.940719332e-02f, +3.270924926e-02f, -4.916384659e-03f, -2.968239110e-02f, +5.040017497e-02f, -4.455673948e-02f, +1.651916984e-02f, +1.581534877e-02f, -3.405676057e-02f, +3.139296630e-02f, -1.486362120e-02f, -2.307584223e-03f, +1.081237958e-02f, -9.911531792e-03f, +4.757275210e-03f, -6.086323306e-04f, -2.565623210e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.720572775e-05f, +1.244593717e-04f, -3.013246526e-04f, +4.115188110e-04f, -1.857430367e-04f, -5.247633121e-04f, +1.469006405e-03f, -1.982609517e-03f, +1.396886603e-03f, +3.596473381e-04f, -2.478485587e-03f, +3.663480167e-03f, -3.013710000e-03f, +7.386147236e-04f, +1.897721222e-03f, -3.412742929e-03f, +3.095025844e-03f, -1.400038251e-03f, -4.966277806e-04f, +1.567672895e-03f, -1.536293796e-03f, +8.375993150e-04f, -1.190818207e-04f, -2.391981328e-04f, +2.504725758e-04f, -1.003116459e-04f, +0.000000000e+00f,\n    /* 13,30 (28) */\n    +0.000000000e+00f, -5.313402824e-04f, +7.848101613e-04f, +7.702630743e-04f, -4.795349290e-03f, +8.514072460e-03f, -5.760606248e-03f, -8.095168796e-03f, +2.866331511e-02f, -3.929027578e-02f, +1.784369847e-02f, +4.846180954e-02f, -1.515897891e-01f, +2.754730589e-01f, +7.362766049e-01f, +1.840637268e-01f, -1.442273786e-01f, +6.616554460e-02f, -3.470149638e-04f, -3.057407349e-02f, +2.912280622e-02f, -1.265840873e-02f, -1.770271855e-03f, +6.911942288e-03f, -4.982715521e-03f, +1.453233711e-03f, +3.568739670e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.900563891e-05f, -1.098320620e-04f, +1.907913140e-04f, -9.127722124e-05f, -3.522579540e-04f, +1.003681580e-03f, -1.266123263e-03f, +3.568177317e-04f, +1.961687659e-03f, -4.627383065e-03f, +5.063876891e-03f, +7.223519144e-04f, -2.319051509e-02f, +1.974338440e-03f, +2.245095193e-02f, -2.923960520e-03f, -3.776343637e-03f, +4.445168958e-03f, -2.381493442e-03f, +1.240131204e-04f, +1.011283154e-03f, -9.860909236e-04f, +4.456342732e-04f, +3.115425745e-06f, -1.501980935e-04f, +1.035369698e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.313402824e-04f, -1.363475778e-03f, +7.602234664e-04f, +3.206607724e-03f, -9.911045560e-03f, +1.442989593e-02f, -9.947809388e-03f, -6.101003420e-03f, +2.707405700e-02f, -3.904754599e-02f, +3.023076367e-02f, -1.252904492e-03f, -3.269610110e-02f, +5.113878969e-02f, -4.265901826e-02f, +1.310642691e-02f, +1.891037461e-02f, -3.545679882e-02f, +3.089633852e-02f, -1.329594831e-02f, -3.843878019e-03f, +1.164997889e-02f, -1.003061361e-02f, +4.518077077e-03f, -3.581597548e-04f, -3.568739670e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.900563891e-05f, +1.273206692e-04f, -2.942351695e-04f, +3.793169380e-04f, -1.223808529e-04f, -5.980893329e-04f, +1.501198175e-03f, -1.919122492e-03f, +1.225000850e-03f, +5.808159810e-04f, -2.635828651e-03f, +3.655071878e-03f, -2.819855678e-03f, +4.449132663e-04f, +2.147565162e-03f, -3.503856533e-03f, +3.006986120e-03f, -1.207398695e-03f, -6.826111404e-04f, +1.668892457e-03f, -1.541411923e-03f, +7.863339812e-04f, -6.121449438e-05f, -2.754144351e-04f, +2.634750820e-04f, -1.035369698e-04f, +0.000000000e+00f,\n    /* 13,31 (28) */\n    +0.000000000e+00f, -5.023346435e-04f, +6.749780993e-04f, +9.610543883e-04f, -4.886626511e-03f, +8.161814506e-03f, -4.756924668e-03f, -9.361292059e-03f, +2.902013285e-02f, -3.732858812e-02f, +1.321631540e-02f, +5.352568643e-02f, -1.508674372e-01f, +2.522825438e-01f, +7.382509434e-01f, +2.065146788e-01f, -1.471513392e-01f, +6.238920097e-02f, +4.098153994e-03f, -3.295556694e-02f, +2.924681934e-02f, -1.164712558e-02f, -2.756362779e-03f, +7.357576562e-03f, -4.979600095e-03f, +1.303035617e-03f, +4.604109368e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.046316603e-05f, -1.083396587e-04f, +1.777732382e-04f, -6.120553119e-05f, -3.865415996e-04f, +1.003241430e-03f, -1.185485254e-03f, +1.936159896e-04f, +2.116473039e-03f, -4.589590608e-03f, +4.646756306e-03f, +1.490762572e-03f, -2.300746985e-02f, +6.588330695e-04f, +2.276039521e-02f, -2.225335438e-03f, -4.216758229e-03f, +4.528570802e-03f, -2.256548147e-03f, -3.307050691e-05f, +1.100348265e-03f, -9.973204594e-04f, +4.176963452e-04f, +3.176805304e-05f, -1.642079905e-04f, +1.062275038e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.023346435e-04f, -1.236155109e-03f, +4.659882969e-04f, +3.585924662e-03f, -1.003342641e-02f, +1.383180660e-02f, -8.446611213e-03f, -8.020125912e-03f, +2.829905785e-02f, -3.846673000e-02f, +2.759493502e-02f, +2.402167386e-03f, -3.551595678e-02f, +5.158370296e-02f, -4.051145310e-02f, +9.602570382e-03f, +2.191736073e-02f, -3.666419751e-02f, +3.021372738e-02f, -1.162705585e-02f, -5.385289943e-03f, +1.243631287e-02f, -1.009182811e-02f, +4.242662642e-03f, -9.468467279e-05f, -4.604109368e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.046316603e-05f, +1.291115539e-04f, -2.854839571e-04f, +3.457286673e-04f, -5.985853526e-05f, -6.663274538e-04f, +1.523971638e-03f, -1.845275877e-03f, +1.047919596e-03f, +7.966397787e-04f, -2.776824637e-03f, +3.625468615e-03f, -2.610021763e-03f, +1.485956862e-04f, +2.385474553e-03f, -3.574934381e-03f, +2.900749650e-03f, -1.005892713e-03f, -8.667499304e-04f, +1.761654064e-03f, -1.537349632e-03f, +7.291662721e-04f, -1.456841193e-06f, -3.110093128e-04f, +2.751890125e-04f, -1.062275038e-04f, +0.000000000e+00f,\n    /* 14, 0 (24) */\n    +1.319331966e-03f, -1.016178713e-03f, -2.318012042e-03f, +9.411795907e-03f, -1.746941689e-02f, +1.934834705e-02f, -5.865137636e-03f, -2.904336543e-02f, +8.299055312e-02f, -1.433490386e-01f, +1.911490954e-01f, +7.906420751e-01f, +1.911490954e-01f, -1.433490386e-01f, +8.299055312e-02f, -2.904336543e-02f, -5.865137636e-03f, +1.934834705e-02f, -1.746941689e-02f, +9.411795907e-03f, -2.318012042e-03f, -1.016178713e-03f, +1.319331966e-03f, -5.404051147e-04f,\n    -1.109810220e-04f, +2.792412597e-04f, -4.162395040e-04f, +2.681541873e-04f, +4.370013667e-04f, -1.728583557e-03f, +3.123298077e-03f, -3.522678090e-03f, +1.316008579e-03f, +5.800269820e-03f, -2.514586977e-02f, -8.074287558e-04f, +2.561749162e-02f, -5.116231187e-03f, -1.869931669e-03f, +3.792950829e-03f, -3.164392635e-03f, +1.651659887e-03f, -3.384863843e-04f, -3.369139762e-04f, +4.464001348e-04f, -2.845231361e-04f, +1.077107189e-04f, -2.077189525e-05f,\n    -2.521351164e-03f, +4.422857262e-03f, -3.985881589e-03f, -1.343441160e-03f, +1.186209570e-02f, -2.390185965e-02f, +3.059439799e-02f, -2.544922973e-02f, +6.875499987e-03f, +1.945720767e-02f, -4.255924117e-02f, +5.173229864e-02f, -4.255924117e-02f, +1.945720767e-02f, +6.875499987e-03f, -2.544922973e-02f, +3.059439799e-02f, -2.390185965e-02f, +1.186209570e-02f, -1.343441160e-03f, -3.985881589e-03f, +4.422857262e-03f, -2.521351164e-03f, +7.211855688e-04f,\n    +6.072659436e-05f, -2.953826578e-04f, +6.820156149e-04f, -1.031097358e-03f, +1.015681388e-03f, -3.561531937e-04f, -9.391669774e-04f, +2.450877999e-03f, -3.477318114e-03f, +3.391189819e-03f, -2.025202753e-03f, -1.670709024e-04f, +2.305298307e-03f, -3.533554494e-03f, +3.458047368e-03f, -2.309355224e-03f, +7.508119949e-04f, +5.194413529e-04f, -1.114678443e-03f, +1.065259737e-03f, -6.753204994e-04f, +2.755057020e-04f, -4.485014415e-05f, -1.577677262e-05f,\n    /* 14, 1 (24) */\n    +1.208350944e-03f, -7.369374536e-04f, -2.734251546e-03f, +9.679950095e-03f, -1.703241552e-02f, +1.761976349e-02f, -2.741839559e-03f, -3.256604352e-02f, +8.430656170e-02f, -1.375487688e-01f, +1.660032257e-01f, +7.898346463e-01f, +2.167665871e-01f, -1.484652698e-01f, +8.112062145e-02f, -2.525041460e-02f, -9.029530272e-03f, +2.100000693e-02f, -1.780790327e-02f, +9.074881931e-03f, -1.871611907e-03f, -1.300701849e-03f, +1.427042685e-03f, -5.611770099e-04f,\n    -1.132769885e-04f, +2.722990093e-04f, -3.844197788e-04f, +1.997569424e-04f, +5.301287691e-04f, -1.792905577e-03f, +3.064104582e-03f, -3.237770263e-03f, +7.693575179e-04f, +6.427817053e-03f, -2.459851709e-02f, -2.419251706e-03f, +2.601037077e-02f, -4.377423792e-03f, -2.428048240e-03f, +4.046567084e-03f, -3.186688509e-03f, +1.562304760e-03f, -2.350749122e-04f, -4.055922468e-04f, +4.746388069e-04f, -2.880397168e-04f, +1.034438555e-04f, -1.748860713e-05f,\n    -2.460624570e-03f, +4.127474604e-03f, -3.303865974e-03f, -2.374538518e-03f, +1.287777709e-02f, -2.425801284e-02f, +2.965523102e-02f, -2.299835173e-02f, +3.398181873e-03f, +2.284839749e-02f, -4.458444392e-02f, +5.156522774e-02f, -4.025394286e-02f, +1.592365318e-02f, +1.033354735e-02f, -2.775858495e-02f, +3.134520999e-02f, -2.338241830e-02f, +1.074741726e-02f, -2.781814231e-04f, -4.661202089e-03f, +4.698362964e-03f, -2.566201308e-03f, +7.054087962e-04f,\n    +7.538821808e-05f, -3.124533545e-04f, +6.838558830e-04f, -9.908186807e-04f, +9.118528457e-04f, -1.930888630e-04f, -1.118978483e-03f, +2.574973750e-03f, -3.473737270e-03f, +3.227370804e-03f, -1.732556364e-03f, -5.001090489e-04f, +2.570960486e-03f, -3.653419413e-03f, +3.415889335e-03f, -2.151181767e-03f, +5.550744497e-04f, +6.818471861e-04f, -1.208069693e-03f, +1.092922874e-03f, -6.636794493e-04f, +2.528726818e-04f, -2.783507069e-05f, -2.381418972e-05f,\n    /* 14, 2 (24) */\n    +1.095073956e-03f, -4.646384443e-04f, -3.118671324e-03f, +9.879707037e-03f, -1.650228675e-02f, +1.582685791e-02f, +3.222650227e-04f, -3.580381378e-02f, +8.507591921e-02f, -1.311209517e-01f, +1.414047086e-01f, +7.874153946e-01f, +2.427769578e-01f, -1.528426936e-01f, +7.869257321e-02f, -2.120384752e-02f, -1.221621878e-02f, +2.256231169e-02f, -1.804297818e-02f, +8.669289684e-03f, -1.396973100e-03f, -1.588741566e-03f, +1.530486541e-03f, -5.786656170e-04f,\n    -1.146273481e-04f, +2.638091165e-04f, -3.512064868e-04f, +1.321512073e-04f, +6.174246080e-04f, -1.844538592e-03f, +2.987606279e-03f, -2.940288413e-03f, +2.329402775e-04f, +6.997457314e-03f, -2.397874210e-02f, -4.021984840e-03f, +2.632180873e-02f, -3.585873696e-03f, -2.987177601e-03f, +4.281558207e-03f, -3.189586889e-03f, +1.460772114e-03f, -1.273031399e-04f, -4.737324154e-04f, +5.006972502e-04f, -2.896949507e-04f, +9.816516147e-05f, -1.379343640e-05f,\n    -2.385236352e-03f, +3.815021250e-03f, -2.620010092e-03f, -3.365357199e-03f, +1.378962994e-02f, -2.445110171e-02f, +2.853625253e-02f, -2.042337798e-02f, -7.555539715e-05f, +2.607576830e-02f, -4.631700029e-02f, +5.106511869e-02f, -3.768298238e-02f, +1.227023377e-02f, +1.374943669e-02f, -2.990976672e-02f, +3.190028444e-02f, -2.270057111e-02f, +9.539347567e-03f, +8.147414509e-04f, -5.324881538e-03f, +4.951235646e-03f, -2.594036379e-03f, +6.815946065e-04f,\n    +8.877170376e-05f, -3.266902341e-04f, +6.809646889e-04f, -9.448407337e-04f, +8.039859160e-04f, -3.133612787e-05f, -1.289157457e-03f, +2.680990491e-03f, -3.447493111e-03f, +3.043281239e-03f, -1.429321052e-03f, -8.298436705e-04f, +2.820399027e-03f, -3.749885259e-03f, +3.350962203e-03f, -1.977254177e-03f, +3.531799680e-04f, +8.422536019e-04f, -1.295105441e-03f, +1.113741447e-03f, -6.470352143e-04f, +2.275567523e-04f, -9.770303819e-06f, -3.218395171e-05f,\n    /* 14, 3 (24) */\n    +9.804466076e-04f, -2.008293278e-04f, -3.469877811e-03f, +1.001185824e-02f, -1.588486214e-02f, +1.398231932e-02f, +3.309871302e-03f, -3.874410219e-02f, +8.530885949e-02f, -1.241234944e-01f, +1.174259665e-01f, +7.833934098e-01f, +2.690987666e-01f, -1.564285673e-01f, +7.570539561e-02f, -1.692228931e-02f, -1.540580567e-02f, +2.402308381e-02f, -1.817028132e-02f, +8.195557269e-03f, -8.962758497e-04f, -1.878436517e-03f, +1.628651702e-03f, -5.924590534e-04f,\n    -1.150668549e-04f, +2.538910417e-04f, -3.168659264e-04f, +6.574844617e-05f, +6.984936588e-04f, -1.883476665e-03f, +2.894684681e-03f, -2.632320229e-03f, -2.904118058e-04f, +7.508084114e-03f, -2.329013183e-02f, -5.609614430e-03f, +2.654943575e-02f, -2.743905104e-03f, -3.544052373e-03f, +4.496021339e-03f, -3.172595983e-03f, +1.347400030e-03f, -1.575000056e-05f, -5.408681089e-04f, +5.243237464e-04f, -2.894026873e-04f, +9.186672811e-05f, -9.696585427e-06f,\n    -2.296464648e-03f, +3.488331016e-03f, -1.939045403e-03f, -4.310197933e-03f, +1.459361585e-02f, -2.448243784e-02f, +2.724709508e-02f, -1.774238748e-02f, -3.523048508e-03f, +2.911904954e-02f, -4.774632134e-02f, +5.023527502e-02f, -3.486258335e-02f, +8.520348508e-03f, +1.710039889e-02f, -3.188702089e-02f, +3.225346441e-02f, -2.185831751e-02f, +8.244242126e-03f, +1.928482897e-03f, -5.971916752e-03f, +5.178792398e-03f, -2.603806683e-03f, +6.494106547e-04f,\n    +1.008266842e-04f, -3.380878856e-04f, +6.734959762e-04f, -8.936109333e-04f, +6.928866110e-04f, +1.280428443e-04f, -1.448693266e-03f, +2.768403831e-03f, -3.398924148e-03f, +2.840234656e-03f, -1.117524677e-03f, -1.154097198e-03f, +3.051928256e-03f, -3.822205572e-03f, +3.263538301e-03f, -1.788584202e-03f, +1.464112060e-04f, +9.995402078e-04f, -1.375066372e-03f, +1.127411078e-03f, -6.253657010e-04f, +1.996541794e-04f, +9.242779774e-06f, -4.082166865e-05f,\n    /* 14, 4 (24) */\n    +8.653797527e-04f, +5.306171384e-05f, -3.786743738e-03f, +1.007760669e-02f, -1.518636848e-02f, +1.209884266e-02f, +6.204555983e-03f, -4.137642242e-02f, +8.501844769e-02f, -1.166154103e-01f, +9.413583464e-02f, +7.777837954e-01f, +2.956482023e-01f, -1.591724724e-01f, +7.216134324e-02f, -1.242626797e-02f, -1.857840165e-02f, +2.537048384e-02f, -1.818603132e-02f, +7.654689160e-03f, -3.719521032e-04f, -2.167839204e-03f, +1.720518430e-03f, -6.021556389e-04f,\n    -1.146357766e-04f, +2.426698797e-04f, -2.816633266e-04f, +9.403973572e-07f, +7.729907520e-04f, -1.909793379e-03f, +2.786301303e-03f, -2.315967098e-03f, -7.980105833e-04f, +7.958900442e-03f, -2.253653250e-02f, -7.176195729e-03f, +2.669122460e-02f, -1.854133470e-03f, -4.095334701e-03f, +4.688132339e-03f, -3.135336557e-03f, +1.222610598e-03f, +9.896552842e-05f, -6.065260382e-04f, +5.452751006e-04f, -2.870876684e-04f, +8.454837357e-05f, -5.212494168e-06f,\n    -2.195637964e-03f, +3.150243130e-03f, -1.265549426e-03f, -5.203808866e-03f, +1.528650246e-02f, -2.435439499e-02f, +2.579840181e-02f, -1.497398365e-02f, -6.921972656e-03f, +3.195928419e-02f, -4.886384601e-02f, +4.908117782e-02f, -3.181065509e-02f, +4.698142935e-03f, +2.036393719e-02f, -3.367560509e-02f, +3.239987561e-02f, -2.085877730e-02f, +6.869175755e-03f, +3.055893975e-03f, -6.597282453e-03f, +5.378446577e-03f, -2.594563903e-03f, +6.085889861e-04f,\n    +1.115156796e-04f, -3.466623980e-04f, +6.616323241e-04f, -8.376032387e-04f, +5.793680015e-04f, +2.840184150e-04f, -1.596659646e-03f, +2.836819321e-03f, -3.328515775e-03f, +2.619664849e-03f, -7.992472087e-04f, -1.470729056e-03f, +3.263978705e-03f, -3.869792487e-03f, +3.154043298e-03f, -1.586292933e-03f, -6.390032318e-05f, +1.152591083e-03f, -1.447269204e-03f, +1.133671437e-03f, -5.986850604e-04f, +1.692843111e-04f, +2.909075206e-05f, -4.965723057e-05f,\n    /* 14, 5 (24) */\n    +7.507439760e-04f, +2.957315935e-04f, -4.068407064e-03f, +1.007854709e-02f, -1.441337773e-02f, +1.018904928e-02f, +8.990857287e-03f, -4.369238952e-02f, +8.422043710e-02f, -1.086565098e-01f, +7.159930214e-02f, +7.706075996e-01f, +3.223394269e-01f, -1.610266058e-01f, +6.806600853e-02f, -7.738135630e-03f, -2.171373821e-02f, +2.659309444e-02f, -1.808706580e-02f, +7.048163122e-03f, +1.733229974e-04f, -2.454926873e-03f, +1.805066804e-03f, -6.073681330e-04f,\n    -1.133793599e-04f, +2.302752612e-04f, -2.458610686e-04f, -6.190295822e-05f, +8.406217126e-04f, -1.923639489e-03f, +2.663489957e-03f, -1.993331364e-03f, -1.287322799e-03f, +8.349417553e-03f, -2.172202907e-02f, -8.715880075e-03f, +2.674550282e-02f, -9.194569997e-04f, -4.637633170e-03f, +4.856158506e-03f, -3.077546892e-03f, +1.086909229e-03f, +2.161874566e-04f, -6.702289988e-04f, +5.633186114e-04f, -2.826864722e-04f, +7.621795958e-05f, -3.598993315e-07f,\n    -2.084122284e-03f, +2.803580732e-03f, -6.039171023e-04f, -6.041412105e-03f, +1.586587046e-02f, -2.407037658e-02f, +2.420174217e-02f, -1.213716433e-02f, -1.025048843e-02f, +3.457894904e-02f, -4.966309322e-02f, +4.761044877e-02f, -2.854667639e-02f, +8.283504485e-04f, +2.351798049e-02f, -3.526189803e-02f, +3.233597529e-02f, -1.970618622e-02f, +5.421906550e-03f, +4.189565412e-03f, -7.195967514e-03f, +5.547730888e-03f, -2.565473151e-03f, +5.589317555e-04f,\n    +1.208139352e-04f, -3.524505644e-04f, +6.455828591e-04f, -7.773141998e-04f, +4.642444154e-04f, +4.356000735e-04f, -1.732219990e-03f, +2.885973877e-03f, -3.236895933e-03f, +2.383115619e-03f, -4.766065657e-04f, -1.777650099e-03f, +3.455107960e-03f, -3.892221410e-03f, +3.023054335e-03f, -1.371604137e-03f, -2.763828580e-04f, +1.300302629e-03f, -1.511072182e-03f, +1.132309081e-03f, -5.670445273e-04f, +1.365893649e-04f, +4.964864533e-05f, -5.861523986e-05f,\n    /* 14, 6 (24) */\n    +6.373646162e-04f, +5.260068547e-04f, -4.314268133e-03f, +1.001664413e-02f, -1.357275602e-02f, +8.265409788e-03f, +1.165434724e-02f, -4.568572089e-02f, +8.293311430e-02f, -1.003070923e-01f, +4.987727307e-02f, +7.618917196e-01f, +3.490849297e-01f, -1.619460628e-01f, +6.342837536e-02f, -2.881977125e-03f, -2.479128510e-02f, +2.768000367e-02f, -1.787087834e-02f, +6.377934123e-03f, +7.366416088e-04f, -2.737613345e-03f, +1.881284763e-03f, -6.077280324e-04f,\n    -1.113472756e-04f, +2.168402581e-04f, -2.097169809e-04f, -1.224352289e-04f, +9.011439452e-04f, -1.925240126e-03f, +2.527348763e-03f, -1.666503851e-03f, -1.755980721e-03f, +8.679452183e-03f, -2.085092377e-02f, -1.022294150e-02f, +2.671096324e-02f, +5.695342327e-05f, -5.167520313e-03f, +4.998471035e-03f, -2.999087130e-03f, +9.408834287e-04f, +3.352261326e-04f, -7.314989783e-04f, +5.782340276e-04f, -2.761484020e-04f, +6.689165615e-05f, +4.838141895e-06f,\n    -1.963308349e-03f, +2.451130168e-03f, +4.166575678e-05f, -6.818726304e-03f, +1.633011488e-02f, -2.363477650e-02f, +2.246952217e-02f, -9.251190455e-03f, -1.348738436e-02f, +3.696206466e-02f, -5.013969979e-02f, +4.583279867e-02f, -2.509156843e-02f, -3.063870962e-03f, +2.654103483e-02f, -3.663350216e-02f, +3.205959243e-02f, -1.840588359e-02f, +3.910834368e-03f, +5.321874493e-03f, -7.763012041e-03f, +5.684320253e-03f, -2.515824506e-03f, +5.003165157e-04f,\n    +1.287091577e-04f, -3.555089494e-04f, +6.255810230e-04f, -7.132589257e-04f, +3.483257320e-04f, +5.818426652e-04f, -1.854631957e-03f, +2.915736295e-03f, -3.124829834e-03f, +2.132229819e-03f, -1.517442280e-04f, -2.072836700e-03f, +3.624010666e-03f, -3.889234602e-03f, +2.871297113e-03f, -1.145836820e-03f, -4.896333793e-04f, +1.441591452e-03f, -1.565880356e-03f, +1.123160010e-03f, -5.305330013e-04f, +1.017340271e-04f, +7.078057912e-05f, -6.761550920e-05f,\n    /* 14, 7 (24) */\n    +5.260173405e-04f, +7.428471128e-04f, -4.523985114e-03f, +9.894208901e-03f, -1.267161207e-02f, +6.340169661e-03f, +1.418169601e-02f, -4.735222474e-02f, +8.117713358e-02f, -9.162764011e-02f, +2.902634929e-02f, +7.516687781e-01f, +3.757958930e-01f, -1.618891094e-01f, +5.826085505e-02f, +2.116493911e-03f, -2.779037223e-02f, +2.862088709e-02f, -1.753565221e-02f, +5.646435145e-03f, +1.314875636e-03f, -3.013761747e-03f, +1.948176420e-03f, -6.028898905e-04f,\n    -1.085930512e-04f, +2.025003003e-04f, -1.734827176e-04f, -1.803352363e-04f, +9.543666704e-04f, -1.914891610e-03f, +2.379031943e-03f, -1.337551709e-03f, -2.201791654e-03f, +8.949122217e-03f, -1.992771371e-02f, -1.169180272e-02f, +2.658667284e-02f, +1.071665851e-03f, -5.681550640e-03f, +5.113557114e-03f, -2.899942945e-03f, +7.852010034e-04f, +4.553619025e-04f, -7.898603562e-04f, +5.898154758e-04f, -2.674363103e-04f, +5.659415013e-05f, +1.035426515e-05f,\n    -1.834599191e-03f, +2.095621218e-03f, +6.672467798e-04f, -7.531985230e-03f, +1.667844061e-02f, -2.305293384e-02f, +2.061489022e-02f, -6.335454160e-03f, -1.661221420e-02f, +3.909429448e-02f, -5.029144402e-02f, +4.375996197e-02f, -2.146755776e-02f, -6.953105564e-03f, +2.941233194e-02f, -3.777933898e-02f, +3.156995905e-02f, -1.696429214e-02f, +2.344954013e-03f, +6.445034503e-03f, -8.293545042e-03f, +5.786054280e-03f, -2.445043927e-03f, +4.327010065e-04f,\n    +1.352011563e-04f, -3.559128289e-04f, +6.018822153e-04f, -6.459670054e-04f, +2.324118098e-04f, +7.218522101e-04f, -1.963251366e-03f, +2.926106845e-03f, -2.993213777e-03f, +1.868737768e-03f, +1.731892704e-04f, -2.354344383e-03f, +3.769527611e-03f, -3.860743623e-03f, +2.699641926e-03f, -9.103970605e-04f, -7.022269222e-04f, +1.575402208e-03f, -1.611150635e-03f, +1.106111916e-03f, -4.892773558e-04f, +6.490486429e-05f, +9.234050077e-05f, -7.657362257e-05f,\n    /* 14, 8 (24) */\n    +4.174242894e-04f, +9.453474131e-04f, -4.697467831e-03f, +9.713873664e-03f, -1.171724540e-02f, +4.425278052e-03f, +1.656072795e-02f, -4.868977645e-02f, +7.897534193e-02f, -8.267851789e-02f, +9.098635588e-03f, +7.399769753e-01f, +4.023825658e-01f, -1.608174436e-01f, +5.257930441e-02f, +7.230051025e-03f, -3.069031518e-02f, +2.940608810e-02f, -1.708029030e-02f, +4.856574789e-03f, +1.904691112e-03f, -3.281198057e-03f, +2.004770570e-03f, -5.925356253e-04f,\n    -1.051734923e-04f, +1.873921124e-04f, -1.374022283e-04f, -2.353084264e-04f, +1.000150818e-03f, -1.892957872e-03f, +2.219741452e-03f, -1.008506660e-03f, -2.622746303e-03f, +9.158840857e-03f, -1.895706771e-02f, -1.311706039e-02f, +2.637207971e-02f, +2.121000375e-03f, -6.176279091e-03f, +5.200031581e-03f, -2.780228523e-03f, +6.206077173e-04f, +5.758490567e-04f, -8.448431731e-04f, +5.978733449e-04f, -2.565273500e-04f, +4.535879398e-05f, +1.615685041e-05f,\n    -1.699398035e-03f, +1.739708389e-03f, +1.269128995e-03f, -8.177952236e-03f, +1.691085242e-02f, -2.233108163e-02f, +1.865163885e-02f, -3.409347315e-03f, -1.960542797e-02f, +4.096303225e-02f, -5.011825475e-02f, +4.140561758e-02f, -1.769803015e-02f, -1.081384919e-02f, +3.211197387e-02f, -3.868973605e-02f, +3.086773213e-02f, -1.538888993e-02f, +7.338033779e-04f, +7.551146419e-03f, -8.782822398e-03f, +5.850959145e-03f, -2.352703426e-03f, +3.561273839e-04f,\n    +1.403013936e-04f, -3.537550158e-04f, +5.747613325e-04f, -5.759784120e-04f, +1.172870872e-04f, +8.547912761e-04f, -2.057535372e-03f, +2.917215977e-03f, -2.843068118e-03f, +1.594445136e-03f, +4.960488752e-04f, -2.620320914e-03f, +3.890653830e-03f, -3.806830639e-03f, +2.509098689e-03f, -6.667691739e-04f, -9.127261488e-04f, +1.700715370e-03f, -1.646396540e-03f, +1.081106097e-03f, -4.434424702e-04f, +2.630954309e-05f, +1.141730368e-04f, -8.540155631e-05f,\n    /* 14, 9 (24) */\n    +3.122507971e-04f, +1.132739526e-03f, -4.834870060e-03f, +9.478565238e-03f, -1.071709459e-02f, +2.532320180e-03f, +1.878046940e-02f, -4.969828311e-02f, +7.635259563e-02f, -7.351967704e-02f, -9.858432118e-03f, +7.268599150e-01f, +4.287546455e-01f, -1.586964432e-01f, +4.640302532e-02f, +1.243008261e-02f, -3.347054370e-02f, +3.002669581e-02f, -1.650444125e-02f, +4.011731615e-03f, +2.502564457e-03f, -3.537725407e-03f, +2.050129364e-03f, -5.763787749e-04f,\n    -1.011481011e-04f, +1.716526762e-04f, -1.017103278e-04f, -2.870880641e-04f, +1.038408586e-03f, -1.859866545e-03f, +2.050718492e-03f, -6.813536977e-04f, -3.017025959e-03f, +9.309309334e-03f, -1.794380256e-02f, -1.449350944e-02f, +2.606701830e-02f, +3.201043676e-03f, -6.648279809e-03f, +5.256648077e-03f, -2.640188805e-03f, +4.479243906e-04f, +6.959200476e-04f, -8.959864508e-04f, +6.022361123e-04f, -2.434136463e-04f, +3.322769159e-05f, +2.221011272e-05f,\n    -1.559096642e-03f, +1.385953374e-03f, +1.843890328e-03f, -8.753930648e-03f, +1.702813951e-02f, -2.147629035e-02f, +1.659410348e-02f, -4.921313377e-04f, -2.244849609e-02f, +4.255747738e-02f, -4.962220587e-02f, +3.878529667e-02f, -1.380737632e-02f, -1.462067983e-02f, +3.462107255e-02f, -3.935650522e-02f, +2.995500598e-02f, -1.368817456e-02f, -9.125931621e-04f, +8.632252516e-03f, -9.226264868e-03f, +5.877268688e-03f, -2.238530389e-03f, +2.707258276e-04f,\n    +1.440324538e-04f, -3.491445827e-04f, +5.445102245e-04f, -5.038394200e-04f, +3.715389702e-06f, +9.798838764e-04f, -2.137044893e-03f, +2.889322133e-03f, -2.675529434e-03f, +1.311220361e-03f, +8.147094686e-04f, -2.869018752e-03f, +3.986545674e-03f, -3.727748556e-03f, +2.300810958e-03f, -4.165062520e-04f, -1.119691115e-03f, +1.816554846e-03f, -1.671192645e-03f, +1.048139023e-03f, -3.932309743e-04f, -1.382413722e-05f, +1.361144515e-04f, -9.400835658e-05f,\n    /* 14,10 (24) */\n    +2.111026960e-04f, +1.304392202e-03f, -4.936580387e-03f, +9.191477174e-03f, -9.678686000e-03f, +6.724536350e-04f, +2.083118789e-02f, -5.037963680e-02f, +7.333556967e-02f, -6.421036770e-02f, -2.780223467e-02f, +7.123664055e-01f, +4.548216638e-01f, -1.554953995e-01f, +3.975474551e-02f, +1.768673068e-02f, -3.611073250e-02f, +3.047462021e-02f, -1.580852120e-02f, +3.115745165e-03f, +3.104800569e-03f, -3.781139053e-03f, +2.083357055e-03f, -5.541686622e-04f,\n    -9.657849472e-05f, +1.554182272e-04f, -6.663137401e-05f, -3.354362079e-04f, +1.069102680e-03f, -1.816104729e-03f, +1.873234975e-03f, -3.580203010e-04f, -3.383008478e-03f, +9.401508235e-03f, -1.689285865e-02f, -1.581616645e-02f, +2.567171273e-02f, +4.307664950e-03f, -7.094165142e-03f, +5.282309611e-03f, -2.480200967e-03f, +2.680434521e-04f, +8.147899551e-04f, -9.428415409e-04f, +6.027520984e-04f, -2.281028792e-04f, +2.025171812e-05f, +2.847423271e-05f,\n    -1.415064188e-03f, +1.036808791e-03f, +2.388400552e-03f, -9.257770068e-03f, +1.703185490e-02f, -2.049640647e-02f, +1.445705859e-02f, +2.397190796e-03f, -2.512402553e-02f, +4.386869774e-02f, -4.880749640e-02f, +3.591627792e-02f, -9.820830647e-03f, -1.834842838e-02f, +3.692188351e-02f, -3.977301147e-02f, +2.883531487e-02f, -1.187161971e-02f, -2.583785807e-03f, +9.680391539e-03f, -9.619495843e-03f, +5.863444550e-03f, -2.102415937e-03f, +1.767174710e-04f,\n    +1.464274351e-04f, -3.422054965e-04f, +5.114350897e-04f, -4.300985664e-04f, -1.075650209e-04f, +1.096419862e-03f, -2.201446298e-03f, +2.842808709e-03f, -2.491841960e-03f, +1.020981714e-03f, +1.127080149e-03f, -3.098806785e-03f, +4.056526781e-03f, -3.623919993e-03f, +2.076049007e-03f, -1.612201476e-04f, -1.321689166e-03f, +1.921995399e-03f, -1.685178648e-03f, +1.007263527e-03f, -3.388827038e-04f, -5.524939917e-05f, +1.579937073e-04f, -1.023008687e-04f,\n    /* 14,11 (24) */\n    +1.145242013e-04f, +1.459810429e-03f, -5.003211761e-03f, +8.856040966e-03f, -8.609583320e-03f, -1.143651094e-03f, +2.270442287e-02f, -5.073765710e-02f, +6.995256119e-02f, -5.480885947e-02f, -4.469509332e-02f, +6.965502391e-01f, +4.804933765e-01f, -1.511877346e-01f, +3.266058037e-02f, +2.296904029e-02f, -3.859093347e-02f, +3.074266366e-02f, -1.499373124e-02f, +2.172903624e-03f, +3.707552668e-03f, -4.009241933e-03f, +2.103608773e-03f, -5.256944295e-04f,\n    -9.152782818e-05f, +1.388232904e-04f, -3.237805763e-05f, -3.801444652e-04f, +1.092245240e-03f, -1.762214489e-03f, +1.688584985e-03f, -4.036621525e-05f, -3.719273057e-03f, +9.436687493e-03f, -1.580927528e-02f, -1.708029187e-02f, +2.518677821e-02f, +5.436533139e-03f, -7.510604775e-03f, +5.276078463e-03f, -2.300775120e-03f, +8.192495242e-05f, +9.316611769e-04f, -9.849754807e-04f, +5.992911335e-04f, -2.106187724e-04f, +6.490471674e-06f, +3.490552730e-05f,\n    -1.268636753e-03f, +6.946032943e-04f, +2.899835642e-03f, -9.687868634e-03f, +1.692428988e-02f, -1.939998661e-02f, +1.225561229e-02f, +5.239999505e-03f, -2.761586749e-02f, +4.488967946e-02f, -4.768041625e-02f, +3.281747113e-02f, -5.764303866e-03f, -2.197234838e-02f, +3.899793252e-02f, -3.993423162e-02f, +2.751362570e-02f, -9.949624316e-03f, -4.268964456e-03f, +1.068765507e-02f, -9.958378547e-03f, +5.808195151e-03f, -1.944422230e-03f, +7.441660232e-05f,\n    +1.475292730e-04f, -3.330751757e-04f, +4.758538301e-04f, -3.553026834e-04f, -2.158461251e-04f, +1.203758788e-03f, -2.250512333e-03f, +2.778180183e-03f, -2.293348343e-03f, +7.256840816e-04f, +1.431118242e-03f, -3.308181264e-03f, +4.100092922e-03f, -3.495935082e-03f, +1.836201983e-03f, +9.742903542e-05f, -1.517304894e-03f, +2.016169816e-03f, -1.688063052e-03f, +9.585896065e-04f, -2.806738620e-04f, -9.770182332e-05f, +1.796336222e-04f, -1.101845135e-04f,\n    /* 14,12 (24) */\n    +2.299637308e-05f, +1.598633719e-03f, -5.035589819e-03f, +8.475896501e-03f, -7.517338080e-03f, -2.905865583e-03f, +2.439300785e-02f, -5.077802332e-02f, +6.623328813e-02f, -4.537217197e-02f, -6.050436860e-02f, +6.794699472e-01f, +5.056801548e-01f, -1.457512014e-01f, +2.514997559e-02f, +2.824511876e-02f, -4.089170859e-02f, +3.082458861e-02f, -1.406207007e-02f, +1.187928143e-03f, +4.306843801e-03f, -4.219860705e-03f, +2.110099245e-03f, -4.907889022e-04f,\n    -8.606022726e-05f, +1.219997620e-04f, +8.496885806e-07f, -4.210345284e-04f, +1.107896472e-03f, -1.698788098e-03f, +1.498076284e-03f, +2.698261458e-04f, -4.024603782e-03f, +9.416355120e-03f, -1.469816564e-02f, -1.828141104e-02f, +2.461322060e-02f, +6.583135401e-03f, -7.894344865e-03f, +5.237185354e-03f, -2.102554198e-03f, -1.094079461e-04f, +1.045728319e-03f, -1.021974332e-03f, +5.917461238e-04f, -1.910014798e-04f, -7.987845379e-06f, +4.145666050e-05f,\n    -1.121107480e-03f, +3.615281186e-04f, +3.375689472e-03f, -1.004317132e-02f, +1.670844375e-02f, -1.819622782e-02f, +1.000509996e-02f, +8.018179688e-03f, -2.990921583e-02f, +4.561536354e-02f, -4.624929801e-02f, +2.950928987e-02f, -1.664210943e-03f, -2.546828346e-02f, +4.083413450e-02f, -3.983680258e-02f, +2.599632081e-02f, -7.933454500e-03f, -5.957027508e-03f, +1.164624467e-02f, -1.023905241e-02f, +5.710493328e-03f, -1.764788608e-03f, -3.576791121e-05f,\n    +1.473900032e-04f, -3.219029865e-04f, +4.380933868e-04f, -2.799930313e-04f, -3.204545227e-04f, +1.301333230e-03f, -2.284122307e-03f, +2.696057453e-03f, -2.081479798e-03f, +4.273055697e-04f, +1.724842931e-03f, -3.495775858e-03f, +4.116915678e-03f, -3.344548116e-03f, +1.582769199e-03f, +3.577438748e-04f, -1.705150082e-03f, +2.098275761e-03f, -1.679626412e-03f, +9.022848323e-04f, -2.189158879e-04f, -1.409008609e-04f, +2.008521162e-04f, -1.175641055e-04f,\n    /* 14,13 (24) */\n    -6.306385418e-05f, +1.720633481e-03f, -5.034740130e-03f, +8.054861973e-03f, -6.409441608e-03f, -4.604653681e-03f, +2.589108414e-02f, -5.050819717e-02f, +6.220868435e-02f, -3.595581685e-02f, -7.520253424e-02f, +6.611885362e-01f, +5.302933753e-01f, -1.391680660e-01f, +1.725563073e-02f, +3.348230411e-02f, -4.299426279e-02f, +3.071518066e-02f, -1.301634175e-02f, +1.659538106e-04f, +4.898589925e-03f, -4.410862185e-03f, +2.102111400e-03f, -4.493322417e-04f,\n    -8.024023462e-05f, +1.050760413e-04f, +3.286565838e-05f, -4.579584934e-04f, +1.116163001e-03f, -1.626463083e-03f, +1.303021930e-03f, +5.708606370e-04f, -4.297991963e-03f, +9.342264766e-03f, -1.356469177e-02f, -1.941533383e-02f, +2.395243395e-02f, +7.742796720e-03f, -8.242227107e-03f, +5.165037823e-03f, -1.886313019e-03f, -3.048739871e-04f, +1.156183255e-03f, -1.053446484e-03f, +5.800345022e-04f, -1.693078644e-04f, -2.310661682e-05f, +4.807689410e-05f,\n    -9.737174764e-04f, +3.962513207e-05f, +3.813782859e-03f, -1.032316435e-02f, +1.638798923e-02f, -1.689489459e-02f, +7.720977648e-03f, +1.071423714e-02f, -3.199069563e-02f, +4.604266911e-02f, -4.452445508e-02f, +2.601351401e-02f, +2.452704734e-03f, -2.881283157e-02f, +4.241690370e-02f, -3.947905871e-02f, +2.429117072e-02f, -5.835178738e-03f, -7.636653920e-03f, +1.254852950e-02f, -1.045796830e-02f, +5.569592467e-03f, -1.563936492e-03f, -1.533320167e-04f,\n    +1.460699732e-04f, -3.088486900e-04f, +3.984870780e-04f, -2.047015564e-04f, -4.207554827e-04f, +1.388651543e-03f, -2.302261536e-03f, +2.597172415e-03f, -1.857745728e-03f, +1.278340169e-04f, +2.006348441e-03f, -3.660370767e-03f, +4.106844915e-03f, -3.170673062e-03f, +1.317350612e-03f, +6.180009141e-04f, -1.883873571e-03f, +2.167582275e-03f, -1.659724122e-03f, +8.385743370e-04f, -1.539540334e-04f, -1.845515153e-04f, +2.214635405e-04f, -1.243447058e-04f,\n    /* 14,14 (24) */\n    -1.433040888e-04f, +1.825709523e-03f, -5.001874472e-03f, +7.596903479e-03f, -5.293278608e-03f, -6.231116763e-03f, +2.719410607e-02f, -4.993733654e-02f, +5.791069239e-02f, -2.661355209e-02f, -8.876722601e-02f, +6.417732023e-01f, +5.542458093e-01f, -1.314252693e-01f, +9.013403621e-03f, +3.864734193e-02f, -4.488057581e-02f, +3.041030668e-02f, -1.186015849e-02f, -8.874926734e-04f, +5.478624427e-03f, -4.580170049e-03f, +2.079004783e-03f, -4.012553476e-04f,\n    -7.413227349e-05f, +8.817621892e-05f, +6.349821460e-05f, -4.907989656e-04f, +1.117195967e-03f, -1.545917090e-03f, +1.104732041e-03f, +8.611356149e-04f, -4.538637254e-03f, +9.216402165e-03f, -1.241403936e-02f, -2.047817292e-02f, +2.320619628e-02f, +8.910700572e-03f, -8.551207591e-03f, +5.059227737e-03f, -1.652956524e-03f, -5.033393235e-04f, +1.262220332e-03f, -1.079025887e-03f, +5.640995504e-04f, -1.456116643e-04f, -3.878107569e-05f, +5.471237745e-05f,\n    -8.276475031e-04f, -2.692235579e-04f, +4.212269937e-03f, -1.052786591e-02f, +1.596723375e-02f, -1.550624305e-02f, +5.418716112e-03f, +1.331140956e-02f, -3.384844136e-02f, +4.617050312e-02f, -4.251810664e-02f, +2.235314324e-02f, +6.559549650e-03f, -3.198350464e-02f, +4.373425431e-02f, -3.886105779e-02f, +2.240729715e-02f, -3.667596463e-03f, -9.296378042e-03f, +1.338710384e-02f, -1.061192233e-02f, +5.385040952e-03f, -1.342472951e-03f, -2.776767224e-04f,\n    +1.436370082e-04f, -2.940808542e-04f, +3.573719583e-04f, -1.299473008e-04f, -5.161566428e-04f, +1.465300038e-03f, -2.305020054e-03f, +2.482361840e-03f, -1.623722889e-03f, -1.707464846e-04f, +2.273816657e-03f, -3.800900831e-03f, +4.069910059e-03f, -2.975377965e-03f, +1.041636557e-03f, +8.764622216e-04f, -2.052170979e-03f, +2.223435850e-03f, -1.628288718e-03f, +7.677403885e-04f, -8.616565247e-05f, -2.283461846e-04f, +2.412800790e-04f, -1.304325046e-04f,\n    /* 14,15 (24) */\n    -2.174363623e-04f, +1.913885742e-03f, -4.938376257e-03f, +7.106104514e-03f, -4.176082641e-03f, -7.777033854e-03f, +2.829883811e-02f, -4.907620092e-02f, +5.337205513e-02f, -1.739714992e-02f, -1.011812654e-01f, +6.212950294e-01f, +5.774520056e-01f, -1.225145687e-01f, +4.621960300e-04f, +4.370656967e-02f, -4.653353233e-02f, +2.990696735e-02f, -1.059793816e-02f, -1.966518561e-03f, +6.042723978e-03f, -4.725781713e-03f, +2.040223707e-03f, -3.465429701e-04f,\n    -6.780013253e-05f, +7.141932505e-05f, +9.259100364e-05f, -5.194689564e-04f, +1.111188872e-03f, -1.457862625e-03f, +9.045057638e-04f, +1.139151431e-03f, -4.745947579e-03f, +9.040970588e-03f, -1.125139282e-02f, -2.146636049e-02f, +2.237666333e-02f, +1.008191055e-02f, -8.818375365e-03f, +4.919537884e-03f, -1.403517159e-03f, -7.036234824e-04f, +1.363041684e-03f, -1.098375208e-03f, +5.439115795e-04f, -1.200035405e-04f, -5.491864062e-05f, +6.130647532e-05f,\n    -6.840104950e-04f, -5.633044121e-04f, +4.569641895e-03f, -1.065781321e-02f, +1.545107710e-02f, -1.404094301e-02f, +3.113696059e-03f, +1.579377140e-02f, -3.547216424e-02f, +4.599975664e-02f, -4.024428998e-02f, +1.855224241e-02f, +1.062945971e-02f, -3.495888260e-02f, +4.477589087e-02f, -3.798459557e-02f, +2.035512617e-02f, -1.444160614e-03f, -1.092466676e-02f, +1.415484423e-02f, -1.069808798e-02f, +5.156694767e-03f, -1.101192872e-03f, -4.081092270e-04f,\n    +1.401655427e-04f, -2.777752460e-04f, +3.150862197e-04f, -5.623298575e-05f, -6.061113373e-04f, +1.530944592e-03f, -2.292590622e-03f, +2.352560583e-03f, -1.381044183e-03f, -4.664689709e-04f, +2.525529115e-03f, -3.916462572e-03f, +4.006320132e-03f, -2.759878268e-03f, +7.573967986e-04f, +1.131387145e-03f, -2.208794194e-03f, +2.265266050e-03f, -1.585331660e-03f, +6.901215371e-04f, -1.595820921e-05f, -2.719666525e-04f, +2.601132140e-04f, -1.357357253e-04f,\n    /* 14,16 (24) */\n    -2.852364948e-04f, +1.985305067e-03f, -4.845785254e-03f, +6.586635557e-03f, -3.064893769e-03f, -9.234896479e-03f, +2.920334387e-02f, -4.793704949e-02f, +4.862610755e-02f, -8.356179335e-03f, -1.124326582e-01f, +5.998286689e-01f, +5.998286689e-01f, -1.124326582e-01f, -8.356179335e-03f, +4.862610755e-02f, -4.793704949e-02f, +2.920334387e-02f, -9.234896479e-03f, -3.064893769e-03f, +6.586635557e-03f, -4.845785254e-03f, +1.985305067e-03f, -2.852364948e-04f,\n    -6.130647532e-05f, +5.491864062e-05f, +1.200035405e-04f, -5.439115795e-04f, +1.098375208e-03f, -1.363041684e-03f, +7.036234824e-04f, +1.403517159e-03f, -4.919537884e-03f, +8.818375365e-03f, -1.008191055e-02f, -2.237666333e-02f, +2.146636049e-02f, +1.125139282e-02f, -9.040970588e-03f, +4.745947579e-03f, -1.139151431e-03f, -9.045057638e-04f, +1.457862625e-03f, -1.111188872e-03f, +5.194689564e-04f, -9.259100364e-05f, -7.141932505e-05f, +6.780013253e-05f,\n    -5.438449523e-04f, -8.410796581e-04f, +4.884728115e-03f, -1.071404619e-02f, +1.484496577e-02f, -1.250999842e-02f, +8.211054363e-04f, +1.814633198e-02f, -3.685320843e-02f, +4.553328767e-02f, -3.771876087e-02f, +1.463577984e-02f, +1.463577984e-02f, -3.771876087e-02f, +4.553328767e-02f, -3.685320843e-02f, +1.814633198e-02f, +8.211054363e-04f, -1.250999842e-02f, +1.484496577e-02f, -1.071404619e-02f, +4.884728115e-03f, -8.410796581e-04f, -5.438449523e-04f,\n    +1.357357253e-04f, -2.601132140e-04f, +2.719666525e-04f, +1.595820921e-05f, -6.901215371e-04f, +1.585331660e-03f, -2.265266050e-03f, +2.208794194e-03f, -1.131387145e-03f, -7.573967986e-04f, +2.759878268e-03f, -4.006320132e-03f, +3.916462572e-03f, -2.525529115e-03f, +4.664689709e-04f, +1.381044183e-03f, -2.352560583e-03f, +2.292590622e-03f, -1.530944592e-03f, +6.061113373e-04f, +5.623298575e-05f, -3.150862197e-04f, +2.777752460e-04f, -1.401655427e-04f,\n    /* 14,17 (24) */\n    -3.465429701e-04f, +2.040223707e-03f, -4.725781713e-03f, +6.042723978e-03f, -1.966518561e-03f, -1.059793816e-02f, +2.990696735e-02f, -4.653353233e-02f, +4.370656967e-02f, +4.621960300e-04f, -1.225145687e-01f, +5.774520056e-01f, +6.212950294e-01f, -1.011812654e-01f, -1.739714992e-02f, +5.337205513e-02f, -4.907620092e-02f, +2.829883811e-02f, -7.777033854e-03f, -4.176082641e-03f, +7.106104514e-03f, -4.938376257e-03f, +1.913885742e-03f, -2.174363623e-04f,\n    -5.471237745e-05f, +3.878107569e-05f, +1.456116643e-04f, -5.640995504e-04f, +1.079025887e-03f, -1.262220332e-03f, +5.033393235e-04f, +1.652956524e-03f, -5.059227737e-03f, +8.551207591e-03f, -8.910700572e-03f, -2.320619628e-02f, +2.047817292e-02f, +1.241403936e-02f, -9.216402165e-03f, +4.538637254e-03f, -8.611356149e-04f, -1.104732041e-03f, +1.545917090e-03f, -1.117195967e-03f, +4.907989656e-04f, -6.349821460e-05f, -8.817621892e-05f, +7.413227349e-05f,\n    -4.081092270e-04f, -1.101192872e-03f, +5.156694767e-03f, -1.069808798e-02f, +1.415484423e-02f, -1.092466676e-02f, -1.444160614e-03f, +2.035512617e-02f, -3.798459557e-02f, +4.477589087e-02f, -3.495888260e-02f, +1.062945971e-02f, +1.855224241e-02f, -4.024428998e-02f, +4.599975664e-02f, -3.547216424e-02f, +1.579377140e-02f, +3.113696059e-03f, -1.404094301e-02f, +1.545107710e-02f, -1.065781321e-02f, +4.569641895e-03f, -5.633044121e-04f, -6.840104950e-04f,\n    +1.304325046e-04f, -2.412800790e-04f, +2.283461846e-04f, +8.616565247e-05f, -7.677403885e-04f, +1.628288718e-03f, -2.223435850e-03f, +2.052170979e-03f, -8.764622216e-04f, -1.041636557e-03f, +2.975377965e-03f, -4.069910059e-03f, +3.800900831e-03f, -2.273816657e-03f, +1.707464846e-04f, +1.623722889e-03f, -2.482361840e-03f, +2.305020054e-03f, -1.465300038e-03f, +5.161566428e-04f, +1.299473008e-04f, -3.573719583e-04f, +2.940808542e-04f, -1.436370082e-04f,\n    /* 14,18 (24) */\n    -4.012553476e-04f, +2.079004783e-03f, -4.580170049e-03f, +5.478624427e-03f, -8.874926734e-04f, -1.186015849e-02f, +3.041030668e-02f, -4.488057581e-02f, +3.864734193e-02f, +9.013403621e-03f, -1.314252693e-01f, +5.542458093e-01f, +6.417732023e-01f, -8.876722601e-02f, -2.661355209e-02f, +5.791069239e-02f, -4.993733654e-02f, +2.719410607e-02f, -6.231116763e-03f, -5.293278608e-03f, +7.596903479e-03f, -5.001874472e-03f, +1.825709523e-03f, -1.433040888e-04f,\n    -4.807689410e-05f, +2.310661682e-05f, +1.693078644e-04f, -5.800345022e-04f, +1.053446484e-03f, -1.156183255e-03f, +3.048739871e-04f, +1.886313019e-03f, -5.165037823e-03f, +8.242227107e-03f, -7.742796720e-03f, -2.395243395e-02f, +1.941533383e-02f, +1.356469177e-02f, -9.342264766e-03f, +4.297991963e-03f, -5.708606370e-04f, -1.303021930e-03f, +1.626463083e-03f, -1.116163001e-03f, +4.579584934e-04f, -3.286565838e-05f, -1.050760413e-04f, +8.024023462e-05f,\n    -2.776767224e-04f, -1.342472951e-03f, +5.385040952e-03f, -1.061192233e-02f, +1.338710384e-02f, -9.296378042e-03f, -3.667596463e-03f, +2.240729715e-02f, -3.886105779e-02f, +4.373425431e-02f, -3.198350464e-02f, +6.559549650e-03f, +2.235314324e-02f, -4.251810664e-02f, +4.617050312e-02f, -3.384844136e-02f, +1.331140956e-02f, +5.418716112e-03f, -1.550624305e-02f, +1.596723375e-02f, -1.052786591e-02f, +4.212269937e-03f, -2.692235579e-04f, -8.276475031e-04f,\n    +1.243447058e-04f, -2.214635405e-04f, +1.845515153e-04f, +1.539540334e-04f, -8.385743370e-04f, +1.659724122e-03f, -2.167582275e-03f, +1.883873571e-03f, -6.180009141e-04f, -1.317350612e-03f, +3.170673062e-03f, -4.106844915e-03f, +3.660370767e-03f, -2.006348441e-03f, -1.278340169e-04f, +1.857745728e-03f, -2.597172415e-03f, +2.302261536e-03f, -1.388651543e-03f, +4.207554827e-04f, +2.047015564e-04f, -3.984870780e-04f, +3.088486900e-04f, -1.460699732e-04f,\n    /* 14,19 (24) */\n    -4.493322417e-04f, +2.102111400e-03f, -4.410862185e-03f, +4.898589925e-03f, +1.659538106e-04f, -1.301634175e-02f, +3.071518066e-02f, -4.299426279e-02f, +3.348230411e-02f, +1.725563073e-02f, -1.391680660e-01f, +5.302933753e-01f, +6.611885362e-01f, -7.520253424e-02f, -3.595581685e-02f, +6.220868435e-02f, -5.050819717e-02f, +2.589108414e-02f, -4.604653681e-03f, -6.409441608e-03f, +8.054861973e-03f, -5.034740130e-03f, +1.720633481e-03f, -6.306385418e-05f,\n    -4.145666050e-05f, +7.987845379e-06f, +1.910014798e-04f, -5.917461238e-04f, +1.021974332e-03f, -1.045728319e-03f, +1.094079461e-04f, +2.102554198e-03f, -5.237185354e-03f, +7.894344865e-03f, -6.583135401e-03f, -2.461322060e-02f, +1.828141104e-02f, +1.469816564e-02f, -9.416355120e-03f, +4.024603782e-03f, -2.698261458e-04f, -1.498076284e-03f, +1.698788098e-03f, -1.107896472e-03f, +4.210345284e-04f, -8.496885806e-07f, -1.219997620e-04f, +8.606022726e-05f,\n    -1.533320167e-04f, -1.563936492e-03f, +5.569592467e-03f, -1.045796830e-02f, +1.254852950e-02f, -7.636653920e-03f, -5.835178738e-03f, +2.429117072e-02f, -3.947905871e-02f, +4.241690370e-02f, -2.881283157e-02f, +2.452704734e-03f, +2.601351401e-02f, -4.452445508e-02f, +4.604266911e-02f, -3.199069563e-02f, +1.071423714e-02f, +7.720977648e-03f, -1.689489459e-02f, +1.638798923e-02f, -1.032316435e-02f, +3.813782859e-03f, +3.962513207e-05f, -9.737174764e-04f,\n    +1.175641055e-04f, -2.008521162e-04f, +1.409008609e-04f, +2.189158879e-04f, -9.022848323e-04f, +1.679626412e-03f, -2.098275761e-03f, +1.705150082e-03f, -3.577438748e-04f, -1.582769199e-03f, +3.344548116e-03f, -4.116915678e-03f, +3.495775858e-03f, -1.724842931e-03f, -4.273055697e-04f, +2.081479798e-03f, -2.696057453e-03f, +2.284122307e-03f, -1.301333230e-03f, +3.204545227e-04f, +2.799930313e-04f, -4.380933868e-04f, +3.219029865e-04f, -1.473900032e-04f,\n    /* 14,20 (24) */\n    -4.907889022e-04f, +2.110099245e-03f, -4.219860705e-03f, +4.306843801e-03f, +1.187928143e-03f, -1.406207007e-02f, +3.082458861e-02f, -4.089170859e-02f, +2.824511876e-02f, +2.514997559e-02f, -1.457512014e-01f, +5.056801548e-01f, +6.794699472e-01f, -6.050436860e-02f, -4.537217197e-02f, +6.623328813e-02f, -5.077802332e-02f, +2.439300785e-02f, -2.905865583e-03f, -7.517338080e-03f, +8.475896501e-03f, -5.035589819e-03f, +1.598633719e-03f, +2.299637308e-05f,\n    -3.490552730e-05f, -6.490471674e-06f, +2.106187724e-04f, -5.992911335e-04f, +9.849754807e-04f, -9.316611769e-04f, -8.192495242e-05f, +2.300775120e-03f, -5.276078463e-03f, +7.510604775e-03f, -5.436533139e-03f, -2.518677821e-02f, +1.708029187e-02f, +1.580927528e-02f, -9.436687493e-03f, +3.719273057e-03f, +4.036621525e-05f, -1.688584985e-03f, +1.762214489e-03f, -1.092245240e-03f, +3.801444652e-04f, +3.237805763e-05f, -1.388232904e-04f, +9.152782818e-05f,\n    -3.576791121e-05f, -1.764788608e-03f, +5.710493328e-03f, -1.023905241e-02f, +1.164624467e-02f, -5.957027508e-03f, -7.933454500e-03f, +2.599632081e-02f, -3.983680258e-02f, +4.083413450e-02f, -2.546828346e-02f, -1.664210943e-03f, +2.950928987e-02f, -4.624929801e-02f, +4.561536354e-02f, -2.990921583e-02f, +8.018179688e-03f, +1.000509996e-02f, -1.819622782e-02f, +1.670844375e-02f, -1.004317132e-02f, +3.375689472e-03f, +3.615281186e-04f, -1.121107480e-03f,\n    +1.101845135e-04f, -1.796336222e-04f, +9.770182332e-05f, +2.806738620e-04f, -9.585896065e-04f, +1.688063052e-03f, -2.016169816e-03f, +1.517304894e-03f, -9.742903542e-05f, -1.836201983e-03f, +3.495935082e-03f, -4.100092922e-03f, +3.308181264e-03f, -1.431118242e-03f, -7.256840816e-04f, +2.293348343e-03f, -2.778180183e-03f, +2.250512333e-03f, -1.203758788e-03f, +2.158461251e-04f, +3.553026834e-04f, -4.758538301e-04f, +3.330751757e-04f, -1.475292730e-04f,\n    /* 14,21 (24) */\n    -5.256944295e-04f, +2.103608773e-03f, -4.009241933e-03f, +3.707552668e-03f, +2.172903624e-03f, -1.499373124e-02f, +3.074266366e-02f, -3.859093347e-02f, +2.296904029e-02f, +3.266058037e-02f, -1.511877346e-01f, +4.804933765e-01f, +6.965502391e-01f, -4.469509332e-02f, -5.480885947e-02f, +6.995256119e-02f, -5.073765710e-02f, +2.270442287e-02f, -1.143651094e-03f, -8.609583320e-03f, +8.856040966e-03f, -5.003211761e-03f, +1.459810429e-03f, +1.145242013e-04f,\n    -2.847423271e-05f, -2.025171812e-05f, +2.281028792e-04f, -6.027520984e-04f, +9.428415409e-04f, -8.147899551e-04f, -2.680434521e-04f, +2.480200967e-03f, -5.282309611e-03f, +7.094165142e-03f, -4.307664950e-03f, -2.567171273e-02f, +1.581616645e-02f, +1.689285865e-02f, -9.401508235e-03f, +3.383008478e-03f, +3.580203010e-04f, -1.873234975e-03f, +1.816104729e-03f, -1.069102680e-03f, +3.354362079e-04f, +6.663137401e-05f, -1.554182272e-04f, +9.657849472e-05f,\n    +7.441660232e-05f, -1.944422230e-03f, +5.808195151e-03f, -9.958378547e-03f, +1.068765507e-02f, -4.268964456e-03f, -9.949624316e-03f, +2.751362570e-02f, -3.993423162e-02f, +3.899793252e-02f, -2.197234838e-02f, -5.764303866e-03f, +3.281747113e-02f, -4.768041625e-02f, +4.488967946e-02f, -2.761586749e-02f, +5.239999505e-03f, +1.225561229e-02f, -1.939998661e-02f, +1.692428988e-02f, -9.687868634e-03f, +2.899835642e-03f, +6.946032943e-04f, -1.268636753e-03f,\n    +1.023008687e-04f, -1.579937073e-04f, +5.524939917e-05f, +3.388827038e-04f, -1.007263527e-03f, +1.685178648e-03f, -1.921995399e-03f, +1.321689166e-03f, +1.612201476e-04f, -2.076049007e-03f, +3.623919993e-03f, -4.056526781e-03f, +3.098806785e-03f, -1.127080149e-03f, -1.020981714e-03f, +2.491841960e-03f, -2.842808709e-03f, +2.201446298e-03f, -1.096419862e-03f, +1.075650209e-04f, +4.300985664e-04f, -5.114350897e-04f, +3.422054965e-04f, -1.464274351e-04f,\n    /* 14,22 (24) */\n    -5.541686622e-04f, +2.083357055e-03f, -3.781139053e-03f, +3.104800569e-03f, +3.115745165e-03f, -1.580852120e-02f, +3.047462021e-02f, -3.611073250e-02f, +1.768673068e-02f, +3.975474551e-02f, -1.554953995e-01f, +4.548216638e-01f, +7.123664055e-01f, -2.780223467e-02f, -6.421036770e-02f, +7.333556967e-02f, -5.037963680e-02f, +2.083118789e-02f, +6.724536350e-04f, -9.678686000e-03f, +9.191477174e-03f, -4.936580387e-03f, +1.304392202e-03f, +2.111026960e-04f,\n    -2.221011272e-05f, -3.322769159e-05f, +2.434136463e-04f, -6.022361123e-04f, +8.959864508e-04f, -6.959200476e-04f, -4.479243906e-04f, +2.640188805e-03f, -5.256648077e-03f, +6.648279809e-03f, -3.201043676e-03f, -2.606701830e-02f, +1.449350944e-02f, +1.794380256e-02f, -9.309309334e-03f, +3.017025959e-03f, +6.813536977e-04f, -2.050718492e-03f, +1.859866545e-03f, -1.038408586e-03f, +2.870880641e-04f, +1.017103278e-04f, -1.716526762e-04f, +1.011481011e-04f,\n    +1.767174710e-04f, -2.102415937e-03f, +5.863444550e-03f, -9.619495843e-03f, +9.680391539e-03f, -2.583785807e-03f, -1.187161971e-02f, +2.883531487e-02f, -3.977301147e-02f, +3.692188351e-02f, -1.834842838e-02f, -9.820830647e-03f, +3.591627792e-02f, -4.880749640e-02f, +4.386869774e-02f, -2.512402553e-02f, +2.397190796e-03f, +1.445705859e-02f, -2.049640647e-02f, +1.703185490e-02f, -9.257770068e-03f, +2.388400552e-03f, +1.036808791e-03f, -1.415064188e-03f,\n    +9.400835658e-05f, -1.361144515e-04f, +1.382413722e-05f, +3.932309743e-04f, -1.048139023e-03f, +1.671192645e-03f, -1.816554846e-03f, +1.119691115e-03f, +4.165062520e-04f, -2.300810958e-03f, +3.727748556e-03f, -3.986545674e-03f, +2.869018752e-03f, -8.147094686e-04f, -1.311220361e-03f, +2.675529434e-03f, -2.889322133e-03f, +2.137044893e-03f, -9.798838764e-04f, -3.715389702e-06f, +5.038394200e-04f, -5.445102245e-04f, +3.491445827e-04f, -1.440324538e-04f,\n    /* 14,23 (24) */\n    -5.763787749e-04f, +2.050129364e-03f, -3.537725407e-03f, +2.502564457e-03f, +4.011731615e-03f, -1.650444125e-02f, +3.002669581e-02f, -3.347054370e-02f, +1.243008261e-02f, +4.640302532e-02f, -1.586964432e-01f, +4.287546455e-01f, +7.268599150e-01f, -9.858432118e-03f, -7.351967704e-02f, +7.635259563e-02f, -4.969828311e-02f, +1.878046940e-02f, +2.532320180e-03f, -1.071709459e-02f, +9.478565238e-03f, -4.834870060e-03f, +1.132739526e-03f, +3.122507971e-04f,\n    -1.615685041e-05f, -4.535879398e-05f, +2.565273500e-04f, -5.978733449e-04f, +8.448431731e-04f, -5.758490567e-04f, -6.206077173e-04f, +2.780228523e-03f, -5.200031581e-03f, +6.176279091e-03f, -2.121000375e-03f, -2.637207971e-02f, +1.311706039e-02f, +1.895706771e-02f, -9.158840857e-03f, +2.622746303e-03f, +1.008506660e-03f, -2.219741452e-03f, +1.892957872e-03f, -1.000150818e-03f, +2.353084264e-04f, +1.374022283e-04f, -1.873921124e-04f, +1.051734923e-04f,\n    +2.707258276e-04f, -2.238530389e-03f, +5.877268688e-03f, -9.226264868e-03f, +8.632252516e-03f, -9.125931621e-04f, -1.368817456e-02f, +2.995500598e-02f, -3.935650522e-02f, +3.462107255e-02f, -1.462067983e-02f, -1.380737632e-02f, +3.878529667e-02f, -4.962220587e-02f, +4.255747738e-02f, -2.244849609e-02f, -4.921313377e-04f, +1.659410348e-02f, -2.147629035e-02f, +1.702813951e-02f, -8.753930648e-03f, +1.843890328e-03f, +1.385953374e-03f, -1.559096642e-03f,\n    +8.540155631e-05f, -1.141730368e-04f, -2.630954309e-05f, +4.434424702e-04f, -1.081106097e-03f, +1.646396540e-03f, -1.700715370e-03f, +9.127261488e-04f, +6.667691739e-04f, -2.509098689e-03f, +3.806830639e-03f, -3.890653830e-03f, +2.620320914e-03f, -4.960488752e-04f, -1.594445136e-03f, +2.843068118e-03f, -2.917215977e-03f, +2.057535372e-03f, -8.547912761e-04f, -1.172870872e-04f, +5.759784120e-04f, -5.747613325e-04f, +3.537550158e-04f, -1.403013936e-04f,\n    /* 14,24 (24) */\n    -5.925356253e-04f, +2.004770570e-03f, -3.281198057e-03f, +1.904691112e-03f, +4.856574789e-03f, -1.708029030e-02f, +2.940608810e-02f, -3.069031518e-02f, +7.230051025e-03f, +5.257930441e-02f, -1.608174436e-01f, +4.023825658e-01f, +7.399769753e-01f, +9.098635588e-03f, -8.267851789e-02f, +7.897534193e-02f, -4.868977645e-02f, +1.656072795e-02f, +4.425278052e-03f, -1.171724540e-02f, +9.713873664e-03f, -4.697467831e-03f, +9.453474131e-04f, +4.174242894e-04f,\n    -1.035426515e-05f, -5.659415013e-05f, +2.674363103e-04f, -5.898154758e-04f, +7.898603562e-04f, -4.553619025e-04f, -7.852010034e-04f, +2.899942945e-03f, -5.113557114e-03f, +5.681550640e-03f, -1.071665851e-03f, -2.658667284e-02f, +1.169180272e-02f, +1.992771371e-02f, -8.949122217e-03f, +2.201791654e-03f, +1.337551709e-03f, -2.379031943e-03f, +1.914891610e-03f, -9.543666704e-04f, +1.803352363e-04f, +1.734827176e-04f, -2.025003003e-04f, +1.085930512e-04f,\n    +3.561273839e-04f, -2.352703426e-03f, +5.850959145e-03f, -8.782822398e-03f, +7.551146419e-03f, +7.338033779e-04f, -1.538888993e-02f, +3.086773213e-02f, -3.868973605e-02f, +3.211197387e-02f, -1.081384919e-02f, -1.769803015e-02f, +4.140561758e-02f, -5.011825475e-02f, +4.096303225e-02f, -1.960542797e-02f, -3.409347315e-03f, +1.865163885e-02f, -2.233108163e-02f, +1.691085242e-02f, -8.177952236e-03f, +1.269128995e-03f, +1.739708389e-03f, -1.699398035e-03f,\n    +7.657362257e-05f, -9.234050077e-05f, -6.490486429e-05f, +4.892773558e-04f, -1.106111916e-03f, +1.611150635e-03f, -1.575402208e-03f, +7.022269222e-04f, +9.103970605e-04f, -2.699641926e-03f, +3.860743623e-03f, -3.769527611e-03f, +2.354344383e-03f, -1.731892704e-04f, -1.868737768e-03f, +2.993213777e-03f, -2.926106845e-03f, +1.963251366e-03f, -7.218522101e-04f, -2.324118098e-04f, +6.459670054e-04f, -6.018822153e-04f, +3.559128289e-04f, -1.352011563e-04f,\n    /* 14,25 (24) */\n    -6.028898905e-04f, +1.948176420e-03f, -3.013761747e-03f, +1.314875636e-03f, +5.646435145e-03f, -1.753565221e-02f, +2.862088709e-02f, -2.779037223e-02f, +2.116493911e-03f, +5.826085505e-02f, -1.618891094e-01f, +3.757958930e-01f, +7.516687781e-01f, +2.902634929e-02f, -9.162764011e-02f, +8.117713358e-02f, -4.735222474e-02f, +1.418169601e-02f, +6.340169661e-03f, -1.267161207e-02f, +9.894208901e-03f, -4.523985114e-03f, +7.428471128e-04f, +5.260173405e-04f,\n    -4.838141895e-06f, -6.689165615e-05f, +2.761484020e-04f, -5.782340276e-04f, +7.314989783e-04f, -3.352261326e-04f, -9.408834287e-04f, +2.999087130e-03f, -4.998471035e-03f, +5.167520313e-03f, -5.695342327e-05f, -2.671096324e-02f, +1.022294150e-02f, +2.085092377e-02f, -8.679452183e-03f, +1.755980721e-03f, +1.666503851e-03f, -2.527348763e-03f, +1.925240126e-03f, -9.011439452e-04f, +1.224352289e-04f, +2.097169809e-04f, -2.168402581e-04f, +1.113472756e-04f,\n    +4.327010065e-04f, -2.445043927e-03f, +5.786054280e-03f, -8.293545042e-03f, +6.445034503e-03f, +2.344954013e-03f, -1.696429214e-02f, +3.156995905e-02f, -3.777933898e-02f, +2.941233194e-02f, -6.953105564e-03f, -2.146755776e-02f, +4.375996197e-02f, -5.029144402e-02f, +3.909429448e-02f, -1.661221420e-02f, -6.335454160e-03f, +2.061489022e-02f, -2.305293384e-02f, +1.667844061e-02f, -7.531985230e-03f, +6.672467798e-04f, +2.095621218e-03f, -1.834599191e-03f,\n    +6.761550920e-05f, -7.078057912e-05f, -1.017340271e-04f, +5.305330013e-04f, -1.123160010e-03f, +1.565880356e-03f, -1.441591452e-03f, +4.896333793e-04f, +1.145836820e-03f, -2.871297113e-03f, +3.889234602e-03f, -3.624010666e-03f, +2.072836700e-03f, +1.517442280e-04f, -2.132229819e-03f, +3.124829834e-03f, -2.915736295e-03f, +1.854631957e-03f, -5.818426652e-04f, -3.483257320e-04f, +7.132589257e-04f, -6.255810230e-04f, +3.555089494e-04f, -1.287091577e-04f,\n    /* 14,26 (24) */\n    -6.077280324e-04f, +1.881284763e-03f, -2.737613345e-03f, +7.366416088e-04f, +6.377934123e-03f, -1.787087834e-02f, +2.768000367e-02f, -2.479128510e-02f, -2.881977125e-03f, +6.342837536e-02f, -1.619460628e-01f, +3.490849297e-01f, +7.618917196e-01f, +4.987727307e-02f, -1.003070923e-01f, +8.293311430e-02f, -4.568572089e-02f, +1.165434724e-02f, +8.265409788e-03f, -1.357275602e-02f, +1.001664413e-02f, -4.314268133e-03f, +5.260068547e-04f, +6.373646162e-04f,\n    +3.598993315e-07f, -7.621795958e-05f, +2.826864722e-04f, -5.633186114e-04f, +6.702289988e-04f, -2.161874566e-04f, -1.086909229e-03f, +3.077546892e-03f, -4.856158506e-03f, +4.637633170e-03f, +9.194569997e-04f, -2.674550282e-02f, +8.715880075e-03f, +2.172202907e-02f, -8.349417553e-03f, +1.287322799e-03f, +1.993331364e-03f, -2.663489957e-03f, +1.923639489e-03f, -8.406217126e-04f, +6.190295822e-05f, +2.458610686e-04f, -2.302752612e-04f, +1.133793599e-04f,\n    +5.003165157e-04f, -2.515824506e-03f, +5.684320253e-03f, -7.763012041e-03f, +5.321874493e-03f, +3.910834368e-03f, -1.840588359e-02f, +3.205959243e-02f, -3.663350216e-02f, +2.654103483e-02f, -3.063870962e-03f, -2.509156843e-02f, +4.583279867e-02f, -5.013969979e-02f, +3.696206466e-02f, -1.348738436e-02f, -9.251190455e-03f, +2.246952217e-02f, -2.363477650e-02f, +1.633011488e-02f, -6.818726304e-03f, +4.166575678e-05f, +2.451130168e-03f, -1.963308349e-03f,\n    +5.861523986e-05f, -4.964864533e-05f, -1.365893649e-04f, +5.670445273e-04f, -1.132309081e-03f, +1.511072182e-03f, -1.300302629e-03f, +2.763828580e-04f, +1.371604137e-03f, -3.023054335e-03f, +3.892221410e-03f, -3.455107960e-03f, +1.777650099e-03f, +4.766065657e-04f, -2.383115619e-03f, +3.236895933e-03f, -2.885973877e-03f, +1.732219990e-03f, -4.356000735e-04f, -4.642444154e-04f, +7.773141998e-04f, -6.455828591e-04f, +3.524505644e-04f, -1.208139352e-04f,\n    /* 14,27 (24) */\n    -6.073681330e-04f, +1.805066804e-03f, -2.454926873e-03f, +1.733229974e-04f, +7.048163122e-03f, -1.808706580e-02f, +2.659309444e-02f, -2.171373821e-02f, -7.738135630e-03f, +6.806600853e-02f, -1.610266058e-01f, +3.223394269e-01f, +7.706075996e-01f, +7.159930214e-02f, -1.086565098e-01f, +8.422043710e-02f, -4.369238952e-02f, +8.990857287e-03f, +1.018904928e-02f, -1.441337773e-02f, +1.007854709e-02f, -4.068407064e-03f, +2.957315935e-04f, +7.507439760e-04f,\n    +5.212494168e-06f, -8.454837357e-05f, +2.870876684e-04f, -5.452751006e-04f, +6.065260382e-04f, -9.896552842e-05f, -1.222610598e-03f, +3.135336557e-03f, -4.688132339e-03f, +4.095334701e-03f, +1.854133470e-03f, -2.669122460e-02f, +7.176195729e-03f, +2.253653250e-02f, -7.958900442e-03f, +7.980105833e-04f, +2.315967098e-03f, -2.786301303e-03f, +1.909793379e-03f, -7.729907520e-04f, -9.403973572e-07f, +2.816633266e-04f, -2.426698797e-04f, +1.146357766e-04f,\n    +5.589317555e-04f, -2.565473151e-03f, +5.547730888e-03f, -7.195967514e-03f, +4.189565412e-03f, +5.421906550e-03f, -1.970618622e-02f, +3.233597529e-02f, -3.526189803e-02f, +2.351798049e-02f, +8.283504485e-04f, -2.854667639e-02f, +4.761044877e-02f, -4.966309322e-02f, +3.457894904e-02f, -1.025048843e-02f, -1.213716433e-02f, +2.420174217e-02f, -2.407037658e-02f, +1.586587046e-02f, -6.041412105e-03f, -6.039171023e-04f, +2.803580732e-03f, -2.084122284e-03f,\n    +4.965723057e-05f, -2.909075206e-05f, -1.692843111e-04f, +5.986850604e-04f, -1.133671437e-03f, +1.447269204e-03f, -1.152591083e-03f, +6.390032318e-05f, +1.586292933e-03f, -3.154043298e-03f, +3.869792487e-03f, -3.263978705e-03f, +1.470729056e-03f, +7.992472087e-04f, -2.619664849e-03f, +3.328515775e-03f, -2.836819321e-03f, +1.596659646e-03f, -2.840184150e-04f, -5.793680015e-04f, +8.376032387e-04f, -6.616323241e-04f, +3.466623980e-04f, -1.115156796e-04f,\n    /* 14,28 (24) */\n    -6.021556389e-04f, +1.720518430e-03f, -2.167839204e-03f, -3.719521032e-04f, +7.654689160e-03f, -1.818603132e-02f, +2.537048384e-02f, -1.857840165e-02f, -1.242626797e-02f, +7.216134324e-02f, -1.591724724e-01f, +2.956482023e-01f, +7.777837954e-01f, +9.413583464e-02f, -1.166154103e-01f, +8.501844769e-02f, -4.137642242e-02f, +6.204555983e-03f, +1.209884266e-02f, -1.518636848e-02f, +1.007760669e-02f, -3.786743738e-03f, +5.306171384e-05f, +8.653797527e-04f,\n    +9.696585427e-06f, -9.186672811e-05f, +2.894026873e-04f, -5.243237464e-04f, +5.408681089e-04f, +1.575000056e-05f, -1.347400030e-03f, +3.172595983e-03f, -4.496021339e-03f, +3.544052373e-03f, +2.743905104e-03f, -2.654943575e-02f, +5.609614430e-03f, +2.329013183e-02f, -7.508084114e-03f, +2.904118058e-04f, +2.632320229e-03f, -2.894684681e-03f, +1.883476665e-03f, -6.984936588e-04f, -6.574844617e-05f, +3.168659264e-04f, -2.538910417e-04f, +1.150668549e-04f,\n    +6.085889861e-04f, -2.594563903e-03f, +5.378446577e-03f, -6.597282453e-03f, +3.055893975e-03f, +6.869175755e-03f, -2.085877730e-02f, +3.239987561e-02f, -3.367560509e-02f, +2.036393719e-02f, +4.698142935e-03f, -3.181065509e-02f, +4.908117782e-02f, -4.886384601e-02f, +3.195928419e-02f, -6.921972656e-03f, -1.497398365e-02f, +2.579840181e-02f, -2.435439499e-02f, +1.528650246e-02f, -5.203808866e-03f, -1.265549426e-03f, +3.150243130e-03f, -2.195637964e-03f,\n    +4.082166865e-05f, -9.242779774e-06f, -1.996541794e-04f, +6.253657010e-04f, -1.127411078e-03f, +1.375066372e-03f, -9.995402078e-04f, -1.464112060e-04f, +1.788584202e-03f, -3.263538301e-03f, +3.822205572e-03f, -3.051928256e-03f, +1.154097198e-03f, +1.117524677e-03f, -2.840234656e-03f, +3.398924148e-03f, -2.768403831e-03f, +1.448693266e-03f, -1.280428443e-04f, -6.928866110e-04f, +8.936109333e-04f, -6.734959762e-04f, +3.380878856e-04f, -1.008266842e-04f,\n    /* 14,29 (24) */\n    -5.924590534e-04f, +1.628651702e-03f, -1.878436517e-03f, -8.962758497e-04f, +8.195557269e-03f, -1.817028132e-02f, +2.402308381e-02f, -1.540580567e-02f, -1.692228931e-02f, +7.570539561e-02f, -1.564285673e-01f, +2.690987666e-01f, +7.833934098e-01f, +1.174259665e-01f, -1.241234944e-01f, +8.530885949e-02f, -3.874410219e-02f, +3.309871302e-03f, +1.398231932e-02f, -1.588486214e-02f, +1.001185824e-02f, -3.469877811e-03f, -2.008293278e-04f, +9.804466076e-04f,\n    +1.379343640e-05f, -9.816516147e-05f, +2.896949507e-04f, -5.006972502e-04f, +4.737324154e-04f, +1.273031399e-04f, -1.460772114e-03f, +3.189586889e-03f, -4.281558207e-03f, +2.987177601e-03f, +3.585873696e-03f, -2.632180873e-02f, +4.021984840e-03f, +2.397874210e-02f, -6.997457314e-03f, -2.329402775e-04f, +2.940288413e-03f, -2.987606279e-03f, +1.844538592e-03f, -6.174246080e-04f, -1.321512073e-04f, +3.512064868e-04f, -2.638091165e-04f, +1.146273481e-04f,\n    +6.494106547e-04f, -2.603806683e-03f, +5.178792398e-03f, -5.971916752e-03f, +1.928482897e-03f, +8.244242126e-03f, -2.185831751e-02f, +3.225346441e-02f, -3.188702089e-02f, +1.710039889e-02f, +8.520348508e-03f, -3.486258335e-02f, +5.023527502e-02f, -4.774632134e-02f, +2.911904954e-02f, -3.523048508e-03f, -1.774238748e-02f, +2.724709508e-02f, -2.448243784e-02f, +1.459361585e-02f, -4.310197933e-03f, -1.939045403e-03f, +3.488331016e-03f, -2.296464648e-03f,\n    +3.218395171e-05f, +9.770303819e-06f, -2.275567523e-04f, +6.470352143e-04f, -1.113741447e-03f, +1.295105441e-03f, -8.422536019e-04f, -3.531799680e-04f, +1.977254177e-03f, -3.350962203e-03f, +3.749885259e-03f, -2.820399027e-03f, +8.298436705e-04f, +1.429321052e-03f, -3.043281239e-03f, +3.447493111e-03f, -2.680990491e-03f, +1.289157457e-03f, +3.133612787e-05f, -8.039859160e-04f, +9.448407337e-04f, -6.809646889e-04f, +3.266902341e-04f, -8.877170376e-05f,\n    /* 14,30 (24) */\n    -5.786656170e-04f, +1.530486541e-03f, -1.588741566e-03f, -1.396973100e-03f, +8.669289684e-03f, -1.804297818e-02f, +2.256231169e-02f, -1.221621878e-02f, -2.120384752e-02f, +7.869257321e-02f, -1.528426936e-01f, +2.427769578e-01f, +7.874153946e-01f, +1.414047086e-01f, -1.311209517e-01f, +8.507591921e-02f, -3.580381378e-02f, +3.222650227e-04f, +1.582685791e-02f, -1.650228675e-02f, +9.879707037e-03f, -3.118671324e-03f, -4.646384443e-04f, +1.095073956e-03f,\n    +1.748860713e-05f, -1.034438555e-04f, +2.880397168e-04f, -4.746388069e-04f, +4.055922468e-04f, +2.350749122e-04f, -1.562304760e-03f, +3.186688509e-03f, -4.046567084e-03f, +2.428048240e-03f, +4.377423792e-03f, -2.601037077e-02f, +2.419251706e-03f, +2.459851709e-02f, -6.427817053e-03f, -7.693575179e-04f, +3.237770263e-03f, -3.064104582e-03f, +1.792905577e-03f, -5.301287691e-04f, -1.997569424e-04f, +3.844197788e-04f, -2.722990093e-04f, +1.132769885e-04f,\n    +6.815946065e-04f, -2.594036379e-03f, +4.951235646e-03f, -5.324881538e-03f, +8.147414509e-04f, +9.539347567e-03f, -2.270057111e-02f, +3.190028444e-02f, -2.990976672e-02f, +1.374943669e-02f, +1.227023377e-02f, -3.768298238e-02f, +5.106511869e-02f, -4.631700029e-02f, +2.607576830e-02f, -7.555539715e-05f, -2.042337798e-02f, +2.853625253e-02f, -2.445110171e-02f, +1.378962994e-02f, -3.365357199e-03f, -2.620010092e-03f, +3.815021250e-03f, -2.385236352e-03f,\n    +2.381418972e-05f, +2.783507069e-05f, -2.528726818e-04f, +6.636794493e-04f, -1.092922874e-03f, +1.208069693e-03f, -6.818471861e-04f, -5.550744497e-04f, +2.151181767e-03f, -3.415889335e-03f, +3.653419413e-03f, -2.570960486e-03f, +5.001090489e-04f, +1.732556364e-03f, -3.227370804e-03f, +3.473737270e-03f, -2.574973750e-03f, +1.118978483e-03f, +1.930888630e-04f, -9.118528457e-04f, +9.908186807e-04f, -6.838558830e-04f, +3.124533545e-04f, -7.538821808e-05f,\n    /* 14,31 (24) */\n    -5.611770099e-04f, +1.427042685e-03f, -1.300701849e-03f, -1.871611907e-03f, +9.074881931e-03f, -1.780790327e-02f, +2.100000693e-02f, -9.029530272e-03f, -2.525041460e-02f, +8.112062145e-02f, -1.484652698e-01f, +2.167665871e-01f, +7.898346463e-01f, +1.660032257e-01f, -1.375487688e-01f, +8.430656170e-02f, -3.256604352e-02f, -2.741839559e-03f, +1.761976349e-02f, -1.703241552e-02f, +9.679950095e-03f, -2.734251546e-03f, -7.369374536e-04f, +1.208350944e-03f,\n    +2.077189525e-05f, -1.077107189e-04f, +2.845231361e-04f, -4.464001348e-04f, +3.369139762e-04f, +3.384863843e-04f, -1.651659887e-03f, +3.164392635e-03f, -3.792950829e-03f, +1.869931669e-03f, +5.116231187e-03f, -2.561749162e-02f, +8.074287558e-04f, +2.514586977e-02f, -5.800269820e-03f, -1.316008579e-03f, +3.522678090e-03f, -3.123298077e-03f, +1.728583557e-03f, -4.370013667e-04f, -2.681541873e-04f, +4.162395040e-04f, -2.792412597e-04f, +1.109810220e-04f,\n    +7.054087962e-04f, -2.566201308e-03f, +4.698362964e-03f, -4.661202089e-03f, -2.781814231e-04f, +1.074741726e-02f, -2.338241830e-02f, +3.134520999e-02f, -2.775858495e-02f, +1.033354735e-02f, +1.592365318e-02f, -4.025394286e-02f, +5.156522774e-02f, -4.458444392e-02f, +2.284839749e-02f, +3.398181873e-03f, -2.299835173e-02f, +2.965523102e-02f, -2.425801284e-02f, +1.287777709e-02f, -2.374538518e-03f, -3.303865974e-03f, +4.127474604e-03f, -2.460624570e-03f,\n    +1.577677262e-05f, +4.485014415e-05f, -2.755057020e-04f, +6.753204994e-04f, -1.065259737e-03f, +1.114678443e-03f, -5.194413529e-04f, -7.508119949e-04f, +2.309355224e-03f, -3.458047368e-03f, +3.533554494e-03f, -2.305298307e-03f, +1.670709024e-04f, +2.025202753e-03f, -3.391189819e-03f, +3.477318114e-03f, -2.450877999e-03f, +9.391669774e-04f, +3.561531937e-04f, -1.015681388e-03f, +1.031097358e-03f, -6.820156149e-04f, +2.953826578e-04f, -6.072659436e-05f,\n    /* 15, 0 (24) */\n    -1.202019198e-03f, +3.406678548e-03f, -6.303893631e-03f, +8.068354747e-03f, -5.607321184e-03f, -4.553512604e-03f, +2.472926036e-02f, -5.449259515e-02f, +8.986605310e-02f, -1.238918309e-01f, +1.485898543e-01f, +8.423743737e-01f, +1.485898543e-01f, -1.238918309e-01f, +8.986605310e-02f, -5.449259515e-02f, +2.472926036e-02f, -4.553512604e-03f, -5.607321184e-03f, +8.068354747e-03f, -6.303893631e-03f, +3.406678548e-03f, -1.202019198e-03f, +1.807804541e-04f,\n    -5.025442764e-05f, -1.614139800e-05f, +2.657761109e-04f, -7.629431710e-04f, +1.452682754e-03f, -2.084736750e-03f, +2.184131100e-03f, -1.071800091e-03f, -2.161309535e-03f, +9.191459639e-03f, -2.717107252e-02f, -9.744996581e-04f, +2.792278992e-02f, -8.649785680e-03f, +1.588115699e-03f, +1.483595605e-03f, -2.413580640e-03f, +2.171101240e-03f, -1.453164827e-03f, +7.283457605e-04f, -2.289203645e-04f, -9.017434138e-06f, +6.286057477e-05f, -3.654866787e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 1 (24) */\n    -1.252273626e-03f, +3.390537150e-03f, -6.038117520e-03f, +7.305411576e-03f, -4.154638430e-03f, -6.638249354e-03f, +2.691339146e-02f, -5.556439525e-02f, +8.770474357e-02f, -1.147003713e-01f, +1.214187817e-01f, +8.413998741e-01f, +1.765126442e-01f, -1.325416166e-01f, +9.145416880e-02f, -5.300899955e-02f, +2.231567972e-02f, -2.382411364e-03f, -7.060486011e-03f, +8.796700508e-03f, -6.532813995e-03f, +3.397661114e-03f, -1.139158623e-03f, +1.442317863e-04f,\n    -3.788877044e-05f, -4.015434516e-05f, +2.994361041e-04f, -7.910617383e-04f, +1.441981615e-03f, -1.985994440e-03f, +1.945126099e-03f, -6.627965124e-04f, -2.704379752e-03f, +9.655187857e-03f, -2.633107346e-02f, -2.919360755e-03f, +2.858133125e-02f, -8.030843205e-03f, +9.878410953e-04f, +1.895385317e-03f, -2.631614059e-03f, +2.244151946e-03f, -1.443144605e-03f, +6.873306272e-04f, -1.890406424e-04f, -3.516703503e-05f, +7.560878485e-05f, -4.130279685e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 2 (24) */\n    -1.290162396e-03f, +3.350382805e-03f, -5.738681416e-03f, +6.514349838e-03f, -2.712656815e-03f, -8.624243794e-03f, +2.885851756e-02f, -5.622719176e-02f, +8.500036382e-02f, -1.050451834e-01f, +9.508770829e-02f, +8.384805133e-01f, +2.050939754e-01f, -1.405724598e-01f, +9.244200990e-02f, -5.111361423e-02f, +1.968406566e-02f, -1.382594172e-04f, -8.503630616e-03f, +9.484031135e-03f, -6.721854638e-03f, +3.362494079e-03f, -1.063549838e-03f, +1.029289894e-04f,\n    -2.585564436e-05f, -6.288111760e-05f, +3.297582021e-04f, -8.126895264e-04f, +1.421410524e-03f, -1.875874720e-03f, +1.698448823e-03f, -2.592979215e-04f, -3.214552834e-03f, +1.004073855e-02f, -2.540806315e-02f, -4.851828510e-03f, +2.914220776e-02f, -7.335758955e-03f, +3.637846014e-04f, +2.304304030e-03f, -2.836406921e-03f, +2.303025716e-03f, -1.422408581e-03f, +6.400090311e-04f, -1.463379642e-04f, -6.213819845e-05f, +8.839485766e-05f, -4.597738811e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 3 (24) */\n    -1.316018040e-03f, +3.287501688e-03f, -5.408923214e-03f, +5.701660312e-03f, -1.291246291e-03f, -1.050011851e-02f, +3.055696638e-02f, -5.648648968e-02f, +8.178581098e-02f, -9.500444487e-02f, +6.967964513e-02f, +8.336286848e-01f, +2.342361832e-01f, -1.479082188e-01f, +9.280579450e-02f, -4.880931020e-02f, +1.684765874e-02f, +2.164766298e-03f, -9.926039197e-03f, +1.012404017e-02f, -6.868192602e-03f, +3.300355881e-03f, -9.751549807e-04f, +5.695160131e-05f,\n    -1.424017073e-05f, -8.419684397e-05f, +3.566300498e-04f, -8.278624872e-04f, +1.391380270e-03f, -1.755433820e-03f, +1.445991415e-03f, +1.360836023e-04f, -3.689335954e-03f, +1.034831877e-02f, -2.440765651e-02f, -6.763711628e-03f, +2.960136401e-02f, -6.566110676e-03f, -2.805140717e-04f, +2.707437138e-03f, -3.026184777e-03f, +2.346940238e-03f, -1.390816372e-03f, +5.865429688e-04f, -1.010419546e-04f, -8.974850794e-05f, +1.011095079e-04f, -5.051825408e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 4 (24) */\n    -1.330258211e-03f, +3.203304844e-03f, -5.052293164e-03f, +4.873797825e-03f, +1.001339790e-04f, -1.225555233e-02f, +3.200295779e-02f, -5.635040608e-02f, +7.809647503e-02f, -8.465612610e-02f, +4.527198863e-02f, +8.268649732e-01f, +2.638375472e-01f, -1.544743294e-01f, +9.252528043e-02f, -4.610187306e-02f, +1.382147396e-02f, +4.511706537e-03f, -1.131685557e-02f, +1.071058314e-02f, -6.969234557e-03f, +3.210607373e-03f, -8.740454728e-04f, +6.433347233e-06f,\n    -3.120097083e-06f, -1.039925183e-04f, +3.799689975e-04f, -8.366628414e-04f, +1.352358753e-03f, -1.625774964e-03f, +1.189641658e-03f, +5.208522228e-04f, -4.126526358e-03f, +1.057856529e-02f, -2.333577971e-02f, -8.646924785e-03f, +2.995520331e-02f, -5.723925957e-03f, -9.412914033e-04f, +3.101839406e-03f, -3.199236880e-03f, +2.375201681e-03f, -1.348303676e-03f, +5.271453987e-04f, -5.340995977e-05f, -1.178033572e-04f, +1.136391256e-04f, -5.486972474e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 5 (24) */\n    -1.333378308e-03f, +3.099312325e-03f, -4.672324167e-03f, +4.037134983e-03f, +1.452492732e-03f, -1.388132730e-02f, +3.319259945e-02f, -5.582955385e-02f, +7.396994867e-02f, -7.407756081e-02f, +2.193620892e-02f, +8.182180484e-01f, +2.937927505e-01f, -1.601982554e-01f, +9.158398903e-02f, -4.300003366e-02f, +1.062223708e-02f, +6.886908217e-03f, -1.266515925e-02f, +1.123772853e-02f, -7.022644516e-03f, +3.092804016e-03f, -7.604063471e-04f, -4.843637750e-05f,\n    +7.434575292e-06f, -1.221753032e-04f, +3.997217905e-04f, -8.392171580e-04f, +1.304866128e-03f, -1.488039415e-03f, +9.312699668e-04f, +8.926425127e-04f, -4.524218732e-03f, +1.073253317e-02f, -2.219863564e-02f, -1.049353017e-02f, +3.020061078e-02f, -4.811678410e-03f, -1.614578835e-03f, +3.484554368e-03f, -3.353929750e-03f, +2.387211858e-03f, -1.294884725e-03f, +4.620800823e-04f, -3.725915954e-06f, -1.460971073e-04f, +1.258666049e-04f, -5.897513919e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 6 (24) */\n    -1.325943733e-03f, +2.977137022e-03f, -4.272602376e-03f, +3.197917825e-03f, +2.757358860e-03f, -1.536936671e-02f, +3.412386942e-02f, -5.493691134e-02f, +6.944572994e-02f, -6.334502763e-02f, -2.624267216e-04f, +8.077245182e-01f, +3.239933613e-01f, -1.650099338e-01f, +8.996941019e-02f, -3.951547929e-02f, +7.268307330e-03f, +9.274120075e-03f, -1.396004397e-02f, +1.169980862e-02f, -7.026370432e-03f, +2.946706908e-03f, -6.345397422e-04f, -1.074115167e-04f,\n    +1.736188206e-05f, -1.386686913e-04f, +4.158640421e-04f, -8.356941546e-04f, +1.249469677e-03f, -1.343397461e-03f, +6.727168057e-04f, +1.249232444e-03f, -4.880810555e-03f, +1.081168200e-02f, -2.100266800e-02f, -1.229577820e-02f, +3.033497391e-02f, -3.832281179e-03f, -2.296223200e-03f, +3.852634216e-03f, -3.488720509e-03f, +2.382474880e-03f, -1.230654223e-03f, +3.916610318e-04f, +4.770102634e-05f, -1.744143749e-04f, +1.376722353e-04f, -6.277736731e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 7 (24) */\n    -1.308581851e-03f, +2.838468331e-03f, -3.856738334e-03f, +2.362223671e-03f, +4.006828538e-03f, -1.671276418e-02f, +3.479658622e-02f, -5.368767890e-02f, +6.456491939e-02f, -5.253334563e-02f, -2.126509472e-02f, +7.954287400e-01f, +3.543283352e-01f, -1.688422150e-01f, +8.767318699e-02f, -3.566284507e-02f, +3.779586821e-03f, +1.165659496e-02f, -1.519069819e-02f, +1.209146965e-02f, -6.978669406e-03f, +2.772292533e-03f, -4.968675070e-04f, -1.701888840e-04f,\n    +2.660810510e-05f, -1.534125286e-04f, +4.283994976e-04f, -8.263022417e-04f, +1.186778480e-03f, -1.193039400e-03f, +4.157805768e-04f, +1.588555137e-03f, -5.195005431e-03f, +1.081785999e-02f, -1.975452443e-02f, -1.404614710e-02f, +3.035620045e-02f, -2.789077773e-03f, -2.981908714e-03f, +4.203160054e-03f, -3.602169867e-03f, +2.360603211e-03f, -1.155788732e-03f, +3.162515595e-04f, +1.005381200e-04f, -2.025314460e-04f, +1.489346509e-04f, -6.621935742e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 8 (24) */\n    -1.281973746e-03f, +2.685055802e-03f, -3.428338836e-03f, +1.535921429e-03f, +5.193607018e-03f, -1.790580358e-02f, +3.521236680e-02f, -5.209912376e-02f, +5.936991395e-02f, -4.171548565e-02f, -4.101961916e-02f, +7.813825929e-01f, +3.846845357e-01f, -1.716312928e-01f, +8.469127828e-02f, -3.145968502e-02f, +1.774169543e-04f, +1.401719817e-02f, -1.634648693e-02f, +1.240772121e-02f, -6.878131286e-03f, +2.569761087e-03f, -3.479328561e-04f, -2.364082414e-04f,\n    +3.512790129e-05f, -1.663629034e-04f, +4.373591042e-04f, -8.112868384e-04f, +1.117437905e-03f, -1.038166596e-03f, +1.622060800e-04f, +1.908709318e-03f, -5.465814421e-03f, +1.075328599e-02f, -1.846101883e-02f, -1.573738130e-02f, +3.026273354e-02f, -1.685830264e-03f, -3.667180403e-03f, +4.533262407e-03f, -3.692954672e-03f, +2.321323088e-03f, -1.070547483e-03f, +2.362629239e-04f, +1.544308747e-04f, -2.302178069e-04f, +1.595318308e-04f, -6.924470590e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 9 (24) */\n    -1.246845844e-03f, +2.518692899e-03f, -2.990979732e-03f, +7.246345905e-04f, +6.311044923e-03f, -1.894397017e-02f, +3.537457288e-02f, -5.019041444e-02f, +5.390409953e-02f, -3.096219965e-02f, -5.948063799e-02f, +7.656452116e-01f, +4.149472692e-01f, -1.733171230e-01f, +8.102409787e-02f, -2.692642261e-02f, -3.515537718e-03f, +1.633852125e-02f, -1.741703441e-02f, +1.264398413e-02f, -6.723700411e-03f, +2.339543281e-03f, -1.884010252e-04f, -3.056529473e-04f,\n    +4.288435272e-05f, -1.774919066e-04f, +4.427998967e-04f, -7.909274841e-04f, +1.042123976e-03f, -8.799826682e-04f, -8.632640165e-05f, +2.207968436e-03f, -5.692555393e-03f, +1.062052969e-02f, -1.712909309e-02f, -1.736252819e-02f, +3.005356397e-02f, -5.267048802e-04f, -4.347468851e-03f, +4.840141825e-03f, -3.759879919e-03f, +2.264479237e-03f, -9.752725974e-04f, +1.521525726e-04f, +2.090051380e-04f, -2.572377835e-04f, +1.693421431e-04f, -7.179824386e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,10 (24) */\n    -1.203961492e-03f, +2.341200992e-03f, -2.548179835e-03f, -6.629289359e-05f, +7.353168899e-03f, -1.982395284e-02f, +3.528824648e-02f, -4.798244601e-02f, +4.821154414e-02f, -2.034166996e-02f, -7.660973108e-02f, +7.482826834e-01f, +4.450008332e-01f, -1.738438279e-01f, +7.667662902e-02f, -2.208628079e-02f, -7.275417637e-03f, +1.860300049e-02f, -1.839230701e-02f, +1.279613670e-02f, -6.514695273e-03f, +2.082305497e-03f, -1.905888210e-05f, -3.774511912e-04f,\n    +4.984894042e-05f, -1.867872693e-04f, +4.448037157e-04f, -7.655347742e-04f, +9.615376594e-04f, -7.196848669e-04f, -3.282113230e-04f, +2.484788408e-03f, -5.874850438e-03f, +1.042248995e-02f, -1.576577850e-02f, -1.891497324e-02f, +2.972823951e-02f, +6.837449566e-04f, -5.018116136e-03f, +5.121089464e-03f, -3.801890133e-03f, +2.190038851e-03f, -8.703886933e-04f, +6.442198589e-05f, +2.638693945e-04f, -2.833522783e-04f, +1.782454255e-04f, -7.382663597e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,11 (24) */\n    -1.154112551e-03f, +2.154413723e-03f, -2.103376120e-03f, -8.318276678e-04f, +8.314706558e-03f, -2.054363771e-02f, +3.496003516e-02f, -4.549765760e-02f, +4.233669370e-02f, -9.919180010e-03f, -9.237550958e-02f, +7.293677102e-01f, +4.747290727e-01f, -1.731600829e-01f, +7.165851289e-02f, -1.696519132e-02f, -1.107730777e-02f, +2.079303934e-02f, -1.926269570e-02f, +1.286055869e-02f, -6.250825879e-03f, +1.798953219e-03f, +1.591865434e-04f, -4.512778272e-04f,\n    +5.600144477e-05f, -1.942518852e-04f, +4.434757725e-04f, -7.354471486e-04f, +8.763991151e-04f, -5.584557005e-04f, -5.619273484e-04f, +2.737813968e-03f, -6.012621400e-03f, +1.016237157e-02f, -1.437815703e-02f, -2.038847314e-02f, +2.928687114e-02f, +1.940598057e-03f, -5.674402791e-03f, +5.373507498e-03f, -3.818080014e-03f, +2.098094768e-03f, -7.564018756e-04f, -2.638587422e-05f, +3.186172715e-04f, -3.083205957e-04f, +1.861240939e-04f, -7.527898623e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,12 (24) */\n    -1.098111107e-03f, +1.960161838e-03f, -1.659900347e-03f, -1.567274816e-03f, +9.191105673e-03f, -2.110209341e-02f, +3.439810781e-02f, -4.275984363e-02f, +3.632407230e-02f, +2.431915639e-04f, -1.067536666e-01f, +7.089792371e-01f, +5.040159438e-01f, -1.712194849e-01f, +6.598411010e-02f, -1.159168383e-02f, -1.489538778e-02f, +2.289113411e-02f, -2.001909758e-02f, +1.283417282e-02f, -5.932208607e-03f, +1.490632623e-03f, +3.453106372e-04f, -5.265568134e-04f,\n    +6.132977598e-05f, -1.999032245e-04f, +4.389430753e-04f, -7.010275597e-04f, +7.874419488e-04f, -3.974548674e-04f, -7.860460238e-04f, +2.965883599e-03f, -6.106083580e-03f, +9.843660690e-03f, -1.297332271e-02f, -2.177718689e-02f, +2.873013627e-02f, +3.238587285e-03f, -6.311575666e-03f, +5.594929228e-03f, -3.807704280e-03f, +1.988867815e-03f, -6.338980935e-04f, -1.196895001e-04f, +3.728302359e-04f, -3.319023407e-04f, +1.928642709e-04f, -7.610744498e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,13 (24) */\n    -1.036781331e-03f, +1.760258613e-03f, -1.220957272e-03f, -2.268302376e-03f, +9.978547622e-03f, -2.149954827e-02f, +3.361206178e-02f, -3.979396003e-02f, +3.021798872e-02f, +1.008685225e-02f, -1.197269893e-01f, +6.872020502e-01f, +5.327460801e-01f, -1.679808976e-01f, +5.967253443e-02f, -5.996754598e-03f, -1.870309206e-02f, +2.488000193e-02f, -2.065299567e-02f, +1.271448332e-02f, -5.559378371e-03f, +1.158730282e-03f, +5.381749081e-04f, -6.026642584e-04f,\n    +6.582973861e-05f, -2.037726487e-04f, +4.313527363e-04f, -6.626600498e-04f, +6.954075180e-04f, -2.378115399e-04f, -9.992396061e-04f, +3.168033052e-03f, -6.155737691e-03f, +9.470098782e-03f, -1.155834333e-02f, -2.307570460e-02f, +2.805927887e-02f, +4.572123658e-03f, -6.924876495e-03f, +5.783038737e-03f, -3.770186591e-03f, +1.862708288e-03f, -5.035408677e-04f, -2.148721470e-04f, +4.260804688e-04f, -3.538593798e-04f, +1.983569237e-04f, -7.626781165e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,14 (24) */\n    -9.709515919e-04f, +1.556485965e-03f, -7.896045356e-04f, -2.930962426e-03f, +1.067395514e-02f, -2.173735981e-02f, +3.261282218e-02f, -3.662592698e-02f, +2.406225103e-02f, +1.955695104e-02f, -1.312853327e-01f, +6.641263456e-01f, +5.608053590e-01f, -1.634087739e-01f, +5.274765793e-02f, -2.137158612e-04f, -2.247327865e-02f, +2.674271021e-02f, -2.115653654e-02f, +1.249961117e-02f, -5.133297903e-03f, +8.048709026e-04f, +7.365318318e-04f, -6.789320700e-04f,\n    +6.950473468e-05f, -2.059046353e-04f, +4.208701729e-04f, -6.207462663e-04f, +6.010393240e-04f, -8.061705216e-05f, -1.200288012e-03f, +3.343497455e-03f, -6.162360143e-03f, +9.045655680e-03f, -1.014022270e-02f, -2.427907375e-02f, +2.727610634e-02f, +5.935322607e-03f, -7.509571034e-03f, +5.935689959e-03f, -3.705127503e-03f, +1.720096526e-03f, -3.660683860e-04f, -3.112854986e-04f, +4.779338980e-04f, -3.739578488e-04f, +2.024990033e-04f, -7.572012713e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,15 (24) */\n    -9.014468573e-04f, +1.350581329e-03f, -3.687343626e-04f, -3.551708692e-03f, +1.127499446e-02f, -2.181797687e-02f, +3.141253417e-02f, -3.328242953e-02f, +1.789989089e-02f, +2.860260672e-02f, -1.414255554e-01f, +6.398472718e-01f, +5.880814653e-01f, -1.574734513e-01f, +4.523808690e-02f, +5.721974098e-03f, -2.617840616e-02f, +2.846280674e-02f, -2.152260492e-02f, +1.218832567e-02f, -4.655364005e-03f, +4.309130538e-04f, +9.390308351e-04f, -7.546521972e-04f,\n    +7.236541015e-05f, -2.063559209e-04f, +4.076772234e-04f, -5.757019422e-04f, +5.050775346e-04f, +7.308196697e-05f, -1.388084859e-03f, +3.491712014e-03f, -6.126991762e-03f, +8.574501617e-03f, -8.725863701e-03f, -2.538282306e-02f, +2.638298346e-02f, +7.322032278e-03f, -8.060978567e-03f, +6.050925029e-03f, -3.612311354e-03f, +1.561642568e-03f, -2.222899766e-04f, -4.082536713e-04f, +5.279533703e-04f, -3.919701930e-04f, +2.051945734e-04f, -7.442924996e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,16 (24) */\n    -8.290814471e-04f, +1.144225408e-03f, +3.894286075e-05f, -4.127410634e-03f, +1.178007200e-02f, -2.174489490e-02f, +3.002444931e-02f, -2.979071751e-02f, +1.177289913e-02f, +3.717710833e-02f, -1.501514191e-01f, +6.144644488e-01f, +6.144644488e-01f, -1.501514191e-01f, +3.717710833e-02f, +1.177289913e-02f, -2.979071751e-02f, +3.002444931e-02f, -2.174489490e-02f, +1.178007200e-02f, -4.127410634e-03f, +3.894286075e-05f, +1.144225408e-03f, -8.290814471e-04f,\n    +7.442924996e-05f, -2.051945734e-04f, +3.919701930e-04f, -5.279533703e-04f, +4.082536713e-04f, +2.222899766e-04f, -1.561642568e-03f, +3.612311354e-03f, -6.050925029e-03f, +8.060978567e-03f, -7.322032278e-03f, -2.638298346e-02f, +2.538282306e-02f, +8.725863701e-03f, -8.574501617e-03f, +6.126991762e-03f, -3.491712014e-03f, +1.388084859e-03f, -7.308196697e-05f, -5.050775346e-04f, +5.757019422e-04f, -4.076772234e-04f, +2.063559209e-04f, -7.236541015e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,17 (24) */\n    -7.546521972e-04f, +9.390308351e-04f, +4.309130538e-04f, -4.655364005e-03f, +1.218832567e-02f, -2.152260492e-02f, +2.846280674e-02f, -2.617840616e-02f, +5.721974098e-03f, +4.523808690e-02f, -1.574734513e-01f, +5.880814653e-01f, +6.398472718e-01f, -1.414255554e-01f, +2.860260672e-02f, +1.789989089e-02f, -3.328242953e-02f, +3.141253417e-02f, -2.181797687e-02f, +1.127499446e-02f, -3.551708692e-03f, -3.687343626e-04f, +1.350581329e-03f, -9.014468573e-04f,\n    +7.572012713e-05f, -2.024990033e-04f, +3.739578488e-04f, -4.779338980e-04f, +3.112854986e-04f, +3.660683860e-04f, -1.720096526e-03f, +3.705127503e-03f, -5.935689959e-03f, +7.509571034e-03f, -5.935322607e-03f, -2.727610634e-02f, +2.427907375e-02f, +1.014022270e-02f, -9.045655680e-03f, +6.162360143e-03f, -3.343497455e-03f, +1.200288012e-03f, +8.061705216e-05f, -6.010393240e-04f, +6.207462663e-04f, -4.208701729e-04f, +2.059046353e-04f, -6.950473468e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,18 (24) */\n    -6.789320700e-04f, +7.365318318e-04f, +8.048709026e-04f, -5.133297903e-03f, +1.249961117e-02f, -2.115653654e-02f, +2.674271021e-02f, -2.247327865e-02f, -2.137158612e-04f, +5.274765793e-02f, -1.634087739e-01f, +5.608053590e-01f, +6.641263456e-01f, -1.312853327e-01f, +1.955695104e-02f, +2.406225103e-02f, -3.662592698e-02f, +3.261282218e-02f, -2.173735981e-02f, +1.067395514e-02f, -2.930962426e-03f, -7.896045356e-04f, +1.556485965e-03f, -9.709515919e-04f,\n    +7.626781165e-05f, -1.983569237e-04f, +3.538593798e-04f, -4.260804688e-04f, +2.148721470e-04f, +5.035408677e-04f, -1.862708288e-03f, +3.770186591e-03f, -5.783038737e-03f, +6.924876495e-03f, -4.572123658e-03f, -2.805927887e-02f, +2.307570460e-02f, +1.155834333e-02f, -9.470098782e-03f, +6.155737691e-03f, -3.168033052e-03f, +9.992396061e-04f, +2.378115399e-04f, -6.954075180e-04f, +6.626600498e-04f, -4.313527363e-04f, +2.037726487e-04f, -6.582973861e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,19 (24) */\n    -6.026642584e-04f, +5.381749081e-04f, +1.158730282e-03f, -5.559378371e-03f, +1.271448332e-02f, -2.065299567e-02f, +2.488000193e-02f, -1.870309206e-02f, -5.996754598e-03f, +5.967253443e-02f, -1.679808976e-01f, +5.327460801e-01f, +6.872020502e-01f, -1.197269893e-01f, +1.008685225e-02f, +3.021798872e-02f, -3.979396003e-02f, +3.361206178e-02f, -2.149954827e-02f, +9.978547622e-03f, -2.268302376e-03f, -1.220957272e-03f, +1.760258613e-03f, -1.036781331e-03f,\n    +7.610744498e-05f, -1.928642709e-04f, +3.319023407e-04f, -3.728302359e-04f, +1.196895001e-04f, +6.338980935e-04f, -1.988867815e-03f, +3.807704280e-03f, -5.594929228e-03f, +6.311575666e-03f, -3.238587285e-03f, -2.873013627e-02f, +2.177718689e-02f, +1.297332271e-02f, -9.843660690e-03f, +6.106083580e-03f, -2.965883599e-03f, +7.860460238e-04f, +3.974548674e-04f, -7.874419488e-04f, +7.010275597e-04f, -4.389430753e-04f, +1.999032245e-04f, -6.132977598e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,20 (24) */\n    -5.265568134e-04f, +3.453106372e-04f, +1.490632623e-03f, -5.932208607e-03f, +1.283417282e-02f, -2.001909758e-02f, +2.289113411e-02f, -1.489538778e-02f, -1.159168383e-02f, +6.598411010e-02f, -1.712194849e-01f, +5.040159438e-01f, +7.089792371e-01f, -1.067536666e-01f, +2.431915639e-04f, +3.632407230e-02f, -4.275984363e-02f, +3.439810781e-02f, -2.110209341e-02f, +9.191105673e-03f, -1.567274816e-03f, -1.659900347e-03f, +1.960161838e-03f, -1.098111107e-03f,\n    +7.527898623e-05f, -1.861240939e-04f, +3.083205957e-04f, -3.186172715e-04f, +2.638587422e-05f, +7.564018756e-04f, -2.098094768e-03f, +3.818080014e-03f, -5.373507498e-03f, +5.674402791e-03f, -1.940598057e-03f, -2.928687114e-02f, +2.038847314e-02f, +1.437815703e-02f, -1.016237157e-02f, +6.012621400e-03f, -2.737813968e-03f, +5.619273484e-04f, +5.584557005e-04f, -8.763991151e-04f, +7.354471486e-04f, -4.434757725e-04f, +1.942518852e-04f, -5.600144477e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,21 (24) */\n    -4.512778272e-04f, +1.591865434e-04f, +1.798953219e-03f, -6.250825879e-03f, +1.286055869e-02f, -1.926269570e-02f, +2.079303934e-02f, -1.107730777e-02f, -1.696519132e-02f, +7.165851289e-02f, -1.731600829e-01f, +4.747290727e-01f, +7.293677102e-01f, -9.237550958e-02f, -9.919180010e-03f, +4.233669370e-02f, -4.549765760e-02f, +3.496003516e-02f, -2.054363771e-02f, +8.314706558e-03f, -8.318276678e-04f, -2.103376120e-03f, +2.154413723e-03f, -1.154112551e-03f,\n    +7.382663597e-05f, -1.782454255e-04f, +2.833522783e-04f, -2.638693945e-04f, -6.442198589e-05f, +8.703886933e-04f, -2.190038851e-03f, +3.801890133e-03f, -5.121089464e-03f, +5.018116136e-03f, -6.837449566e-04f, -2.972823951e-02f, +1.891497324e-02f, +1.576577850e-02f, -1.042248995e-02f, +5.874850438e-03f, -2.484788408e-03f, +3.282113230e-04f, +7.196848669e-04f, -9.615376594e-04f, +7.655347742e-04f, -4.448037157e-04f, +1.867872693e-04f, -4.984894042e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,22 (24) */\n    -3.774511912e-04f, -1.905888210e-05f, +2.082305497e-03f, -6.514695273e-03f, +1.279613670e-02f, -1.839230701e-02f, +1.860300049e-02f, -7.275417637e-03f, -2.208628079e-02f, +7.667662902e-02f, -1.738438279e-01f, +4.450008332e-01f, +7.482826834e-01f, -7.660973108e-02f, -2.034166996e-02f, +4.821154414e-02f, -4.798244601e-02f, +3.528824648e-02f, -1.982395284e-02f, +7.353168899e-03f, -6.629289359e-05f, -2.548179835e-03f, +2.341200992e-03f, -1.203961492e-03f,\n    +7.179824386e-05f, -1.693421431e-04f, +2.572377835e-04f, -2.090051380e-04f, -1.521525726e-04f, +9.752725974e-04f, -2.264479237e-03f, +3.759879919e-03f, -4.840141825e-03f, +4.347468851e-03f, +5.267048802e-04f, -3.005356397e-02f, +1.736252819e-02f, +1.712909309e-02f, -1.062052969e-02f, +5.692555393e-03f, -2.207968436e-03f, +8.632640165e-05f, +8.799826682e-04f, -1.042123976e-03f, +7.909274841e-04f, -4.427998967e-04f, +1.774919066e-04f, -4.288435272e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,23 (24) */\n    -3.056529473e-04f, -1.884010252e-04f, +2.339543281e-03f, -6.723700411e-03f, +1.264398413e-02f, -1.741703441e-02f, +1.633852125e-02f, -3.515537718e-03f, -2.692642261e-02f, +8.102409787e-02f, -1.733171230e-01f, +4.149472692e-01f, +7.656452116e-01f, -5.948063799e-02f, -3.096219965e-02f, +5.390409953e-02f, -5.019041444e-02f, +3.537457288e-02f, -1.894397017e-02f, +6.311044923e-03f, +7.246345905e-04f, -2.990979732e-03f, +2.518692899e-03f, -1.246845844e-03f,\n    +6.924470590e-05f, -1.595318308e-04f, +2.302178069e-04f, -1.544308747e-04f, -2.362629239e-04f, +1.070547483e-03f, -2.321323088e-03f, +3.692954672e-03f, -4.533262407e-03f, +3.667180403e-03f, +1.685830264e-03f, -3.026273354e-02f, +1.573738130e-02f, +1.846101883e-02f, -1.075328599e-02f, +5.465814421e-03f, -1.908709318e-03f, -1.622060800e-04f, +1.038166596e-03f, -1.117437905e-03f, +8.112868384e-04f, -4.373591042e-04f, +1.663629034e-04f, -3.512790129e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,24 (24) */\n    -2.364082414e-04f, -3.479328561e-04f, +2.569761087e-03f, -6.878131286e-03f, +1.240772121e-02f, -1.634648693e-02f, +1.401719817e-02f, +1.774169543e-04f, -3.145968502e-02f, +8.469127828e-02f, -1.716312928e-01f, +3.846845357e-01f, +7.813825929e-01f, -4.101961916e-02f, -4.171548565e-02f, +5.936991395e-02f, -5.209912376e-02f, +3.521236680e-02f, -1.790580358e-02f, +5.193607018e-03f, +1.535921429e-03f, -3.428338836e-03f, +2.685055802e-03f, -1.281973746e-03f,\n    +6.621935742e-05f, -1.489346509e-04f, +2.025314460e-04f, -1.005381200e-04f, -3.162515595e-04f, +1.155788732e-03f, -2.360603211e-03f, +3.602169867e-03f, -4.203160054e-03f, +2.981908714e-03f, +2.789077773e-03f, -3.035620045e-02f, +1.404614710e-02f, +1.975452443e-02f, -1.081785999e-02f, +5.195005431e-03f, -1.588555137e-03f, -4.157805768e-04f, +1.193039400e-03f, -1.186778480e-03f, +8.263022417e-04f, -4.283994976e-04f, +1.534125286e-04f, -2.660810510e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,25 (24) */\n    -1.701888840e-04f, -4.968675070e-04f, +2.772292533e-03f, -6.978669406e-03f, +1.209146965e-02f, -1.519069819e-02f, +1.165659496e-02f, +3.779586821e-03f, -3.566284507e-02f, +8.767318699e-02f, -1.688422150e-01f, +3.543283352e-01f, +7.954287400e-01f, -2.126509472e-02f, -5.253334563e-02f, +6.456491939e-02f, -5.368767890e-02f, +3.479658622e-02f, -1.671276418e-02f, +4.006828538e-03f, +2.362223671e-03f, -3.856738334e-03f, +2.838468331e-03f, -1.308581851e-03f,\n    +6.277736731e-05f, -1.376722353e-04f, +1.744143749e-04f, -4.770102634e-05f, -3.916610318e-04f, +1.230654223e-03f, -2.382474880e-03f, +3.488720509e-03f, -3.852634216e-03f, +2.296223200e-03f, +3.832281179e-03f, -3.033497391e-02f, +1.229577820e-02f, +2.100266800e-02f, -1.081168200e-02f, +4.880810555e-03f, -1.249232444e-03f, -6.727168057e-04f, +1.343397461e-03f, -1.249469677e-03f, +8.356941546e-04f, -4.158640421e-04f, +1.386686913e-04f, -1.736188206e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,26 (24) */\n    -1.074115167e-04f, -6.345397422e-04f, +2.946706908e-03f, -7.026370432e-03f, +1.169980862e-02f, -1.396004397e-02f, +9.274120075e-03f, +7.268307330e-03f, -3.951547929e-02f, +8.996941019e-02f, -1.650099338e-01f, +3.239933613e-01f, +8.077245182e-01f, -2.624267216e-04f, -6.334502763e-02f, +6.944572994e-02f, -5.493691134e-02f, +3.412386942e-02f, -1.536936671e-02f, +2.757358860e-03f, +3.197917825e-03f, -4.272602376e-03f, +2.977137022e-03f, -1.325943733e-03f,\n    +5.897513919e-05f, -1.258666049e-04f, +1.460971073e-04f, +3.725915954e-06f, -4.620800823e-04f, +1.294884725e-03f, -2.387211858e-03f, +3.353929750e-03f, -3.484554368e-03f, +1.614578835e-03f, +4.811678410e-03f, -3.020061078e-02f, +1.049353017e-02f, +2.219863564e-02f, -1.073253317e-02f, +4.524218732e-03f, -8.926425127e-04f, -9.312699668e-04f, +1.488039415e-03f, -1.304866128e-03f, +8.392171580e-04f, -3.997217905e-04f, +1.221753032e-04f, -7.434575292e-06f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,27 (24) */\n    -4.843637750e-05f, -7.604063471e-04f, +3.092804016e-03f, -7.022644516e-03f, +1.123772853e-02f, -1.266515925e-02f, +6.886908217e-03f, +1.062223708e-02f, -4.300003366e-02f, +9.158398903e-02f, -1.601982554e-01f, +2.937927505e-01f, +8.182180484e-01f, +2.193620892e-02f, -7.407756081e-02f, +7.396994867e-02f, -5.582955385e-02f, +3.319259945e-02f, -1.388132730e-02f, +1.452492732e-03f, +4.037134983e-03f, -4.672324167e-03f, +3.099312325e-03f, -1.333378308e-03f,\n    +5.486972474e-05f, -1.136391256e-04f, +1.178033572e-04f, +5.340995977e-05f, -5.271453987e-04f, +1.348303676e-03f, -2.375201681e-03f, +3.199236880e-03f, -3.101839406e-03f, +9.412914033e-04f, +5.723925957e-03f, -2.995520331e-02f, +8.646924785e-03f, +2.333577971e-02f, -1.057856529e-02f, +4.126526358e-03f, -5.208522228e-04f, -1.189641658e-03f, +1.625774964e-03f, -1.352358753e-03f, +8.366628414e-04f, -3.799689975e-04f, +1.039925183e-04f, +3.120097083e-06f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,28 (24) */\n    +6.433347233e-06f, -8.740454728e-04f, +3.210607373e-03f, -6.969234557e-03f, +1.071058314e-02f, -1.131685557e-02f, +4.511706537e-03f, +1.382147396e-02f, -4.610187306e-02f, +9.252528043e-02f, -1.544743294e-01f, +2.638375472e-01f, +8.268649732e-01f, +4.527198863e-02f, -8.465612610e-02f, +7.809647503e-02f, -5.635040608e-02f, +3.200295779e-02f, -1.225555233e-02f, +1.001339790e-04f, +4.873797825e-03f, -5.052293164e-03f, +3.203304844e-03f, -1.330258211e-03f,\n    +5.051825408e-05f, -1.011095079e-04f, +8.974850794e-05f, +1.010419546e-04f, -5.865429688e-04f, +1.390816372e-03f, -2.346940238e-03f, +3.026184777e-03f, -2.707437138e-03f, +2.805140717e-04f, +6.566110676e-03f, -2.960136401e-02f, +6.763711628e-03f, +2.440765651e-02f, -1.034831877e-02f, +3.689335954e-03f, -1.360836023e-04f, -1.445991415e-03f, +1.755433820e-03f, -1.391380270e-03f, +8.278624872e-04f, -3.566300498e-04f, +8.419684397e-05f, +1.424017073e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,29 (24) */\n    +5.695160131e-05f, -9.751549807e-04f, +3.300355881e-03f, -6.868192602e-03f, +1.012404017e-02f, -9.926039197e-03f, +2.164766298e-03f, +1.684765874e-02f, -4.880931020e-02f, +9.280579450e-02f, -1.479082188e-01f, +2.342361832e-01f, +8.336286848e-01f, +6.967964513e-02f, -9.500444487e-02f, +8.178581098e-02f, -5.648648968e-02f, +3.055696638e-02f, -1.050011851e-02f, -1.291246291e-03f, +5.701660312e-03f, -5.408923214e-03f, +3.287501688e-03f, -1.316018040e-03f,\n    +4.597738811e-05f, -8.839485766e-05f, +6.213819845e-05f, +1.463379642e-04f, -6.400090311e-04f, +1.422408581e-03f, -2.303025716e-03f, +2.836406921e-03f, -2.304304030e-03f, -3.637846014e-04f, +7.335758955e-03f, -2.914220776e-02f, +4.851828510e-03f, +2.540806315e-02f, -1.004073855e-02f, +3.214552834e-03f, +2.592979215e-04f, -1.698448823e-03f, +1.875874720e-03f, -1.421410524e-03f, +8.126895264e-04f, -3.297582021e-04f, +6.288111760e-05f, +2.585564436e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,30 (24) */\n    +1.029289894e-04f, -1.063549838e-03f, +3.362494079e-03f, -6.721854638e-03f, +9.484031135e-03f, -8.503630616e-03f, -1.382594172e-04f, +1.968406566e-02f, -5.111361423e-02f, +9.244200990e-02f, -1.405724598e-01f, +2.050939754e-01f, +8.384805133e-01f, +9.508770829e-02f, -1.050451834e-01f, +8.500036382e-02f, -5.622719176e-02f, +2.885851756e-02f, -8.624243794e-03f, -2.712656815e-03f, +6.514349838e-03f, -5.738681416e-03f, +3.350382805e-03f, -1.290162396e-03f,\n    +4.130279685e-05f, -7.560878485e-05f, +3.516703503e-05f, +1.890406424e-04f, -6.873306272e-04f, +1.443144605e-03f, -2.244151946e-03f, +2.631614059e-03f, -1.895385317e-03f, -9.878410953e-04f, +8.030843205e-03f, -2.858133125e-02f, +2.919360755e-03f, +2.633107346e-02f, -9.655187857e-03f, +2.704379752e-03f, +6.627965124e-04f, -1.945126099e-03f, +1.985994440e-03f, -1.441981615e-03f, +7.910617383e-04f, -2.994361041e-04f, +4.015434516e-05f, +3.788877044e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,31 (24) */\n    +1.442317863e-04f, -1.139158623e-03f, +3.397661114e-03f, -6.532813995e-03f, +8.796700508e-03f, -7.060486011e-03f, -2.382411364e-03f, +2.231567972e-02f, -5.300899955e-02f, +9.145416880e-02f, -1.325416166e-01f, +1.765126442e-01f, +8.413998741e-01f, +1.214187817e-01f, -1.147003713e-01f, +8.770474357e-02f, -5.556439525e-02f, +2.691339146e-02f, -6.638249354e-03f, -4.154638430e-03f, +7.305411576e-03f, -6.038117520e-03f, +3.390537150e-03f, -1.252273626e-03f,\n    +3.654866787e-05f, -6.286057477e-05f, +9.017434138e-06f, +2.289203645e-04f, -7.283457605e-04f, +1.453164827e-03f, -2.171101240e-03f, +2.413580640e-03f, -1.483595605e-03f, -1.588115699e-03f, +8.649785680e-03f, -2.792278992e-02f, +9.744996581e-04f, +2.717107252e-02f, -9.191459639e-03f, +2.161309535e-03f, +1.071800091e-03f, -2.184131100e-03f, +2.084736750e-03f, -1.452682754e-03f, +7.629431710e-04f, -2.657761109e-04f, +1.614139800e-05f, +5.025442764e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n};\nconstexpr BSincTable bsinc24 = {\n    /* scaleBase */ 7.881281313e-02f, /* scaleRange */ 1.085555698e+00f,\n    /* m */ { 48u, 48u, 48u, 48u, 48u, 48u, 48u, 48u, 44u, 40u, 36u, 32u, 28u, 28u, 24u, 24u },\n    /* filterOffset */ { 0u, 6144u, 12288u, 18432u, 24576u, 30720u, 36864u, 43008u, 49152u, 54784u, 59904u, 64512u, 68608u, 72192u, 75776u, 78848u },\n    bsinc24_tab\n};\n\n/* This 11th order filter has a rejection of -60dB, yielding a transition width\n * of ~0.330 (normalized frequency). Order increases when downsampling to a\n * limit of one octave, after which the quality of the filter (transition\n * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound\n * after downsampling by ~2.60 octaves.\n */\nalignas(16) constexpr float bsinc12_tab[39936] = {\n    /*  0, 0 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.519885812e-03f, +3.451133814e-03f, +6.515582343e-03f, +1.087383005e-02f, +1.652921626e-02f, +2.328367055e-02f, +3.072645296e-02f, +3.826378940e-02f, +4.518869460e-02f, +5.078083067e-02f, +5.441847120e-02f, +5.568063817e-02f, +5.441847120e-02f, +5.078083067e-02f, +4.518869460e-02f, +3.826378940e-02f, +3.072645296e-02f, +2.328367055e-02f, +1.652921626e-02f, +1.087383005e-02f, +6.515582343e-03f, +3.451133814e-03f, +1.519885812e-03f, +4.670736076e-04f,\n    -4.473156016e-05f, -7.634926120e-05f, -1.148555588e-04f, -1.562964586e-04f, -1.949507756e-04f, -2.241543973e-04f, -2.374890420e-04f, -2.300991725e-04f, -1.998415601e-04f, -1.479851488e-04f, -7.926606770e-05f, -1.244974771e-06f, +7.692363257e-05f, +1.460597965e-04f, +1.985319023e-04f, +2.295023193e-04f, +2.375909238e-04f, +2.248419263e-04f, +1.960418335e-04f, +1.575799374e-04f, +1.161320286e-04f, +7.746358669e-05f, +4.559156282e-05f, +2.243424753e-05f,\n    /*  0, 1 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.475154251e-03f, +3.374784553e-03f, +6.400726784e-03f, +1.071753360e-02f, +1.633426549e-02f, +2.305951615e-02f, +3.048896392e-02f, +3.803369023e-02f, +4.498885304e-02f, +5.063284553e-02f, +5.433920513e-02f, +5.567939320e-02f, +5.449539483e-02f, +5.092689047e-02f, +4.538722650e-02f, +3.849329172e-02f, +3.096404388e-02f, +2.350851248e-02f, +1.672525810e-02f, +1.103140999e-02f, +6.631714371e-03f, +3.528597401e-03f, +1.565477374e-03f, +4.895078551e-04f,\n    -4.388025644e-05f, -7.524183918e-05f, -1.135821039e-04f, -1.550103394e-04f, -1.938504700e-04f, -2.234512424e-04f, -2.373666959e-04f, -2.306734093e-04f, -2.011298355e-04f, -1.498937974e-04f, -8.159928545e-05f, -3.734778125e-06f, +7.457224711e-05f, +1.441179370e-04f, +1.972009578e-04f, +2.288828348e-04f, +2.376722283e-04f, +2.255136482e-04f, +1.971234341e-04f, +1.588605782e-04f, +1.174113605e-04f, +7.858472543e-05f, +4.646023953e-05f, +2.302203695e-05f,\n    /*  0, 2 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.431273995e-03f, +3.299542714e-03f, +6.287144680e-03f, +1.056252326e-02f, +1.614041502e-02f, +2.283606491e-02f, +3.025159722e-02f, +3.780301682e-02f, +4.478772320e-02f, +5.048295173e-02f, +5.425760585e-02f, +5.567565842e-02f, +5.456996708e-02f, +5.107100841e-02f, +4.558442746e-02f, +3.872217455e-02f, +3.120171611e-02f, +2.373402612e-02f, +1.692238153e-02f, +1.119027057e-02f, +6.749125732e-03f, +3.607182126e-03f, +1.611937614e-03f, +5.125298920e-04f,\n    -4.303767463e-05f, -7.414140875e-05f, -1.123118154e-04f, -1.537217763e-04f, -1.927411265e-04f, -2.227326442e-04f, -2.372240010e-04f, -2.312250478e-04f, -2.023966364e-04f, -1.517855485e-04f, -8.392302033e-05f, -6.224142940e-06f, +7.221217990e-05f, +1.421597696e-04f, +1.958488257e-04f, +2.282407078e-04f, +2.377328453e-04f, +2.261693833e-04f, +1.981953682e-04f, +1.601381827e-04f, +1.186933996e-04f, +7.971258511e-05f, +4.733756345e-05f, +2.361844294e-05f,\n    /*  0, 3 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.388236320e-03f, +3.225401305e-03f, +6.174832865e-03f, +1.040880148e-02f, +1.594767389e-02f, +2.261333227e-02f, +3.001437322e-02f, +3.757179177e-02f, +4.458532657e-02f, +5.033116618e-02f, +5.417368283e-02f, +5.566943427e-02f, +5.464217926e-02f, +5.121316818e-02f, +4.578027628e-02f, +3.895041526e-02f, +3.143944896e-02f, +2.396019551e-02f, +1.712057690e-02f, +1.135040875e-02f, +6.867819132e-03f, +3.686894711e-03f, +1.659275177e-03f, +5.361483350e-04f,\n    -4.220383580e-05f, -7.304805597e-05f, -1.110448427e-04f, -1.524309647e-04f, -1.916229551e-04f, -2.219987871e-04f, -2.370610757e-04f, -2.317541095e-04f, -2.036418741e-04f, -1.536602113e-04f, -8.623700849e-05f, -8.712776940e-06f, +6.984370103e-05f, +1.401854962e-04f, +1.944756084e-04f, +2.275759301e-04f, +2.377726671e-04f, +2.268089534e-04f, +1.992574267e-04f, +1.614125515e-04f, +1.199779894e-04f, +8.084707136e-05f, +4.822350583e-05f, +2.422349177e-05f,\n    /*  0, 4 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.346032485e-03f, +3.152353249e-03f, +6.063788022e-03f, +1.025637051e-02f, +1.575605093e-02f, +2.239133348e-02f, +2.977731215e-02f, +3.734003766e-02f, +4.438168469e-02f, +5.017750597e-02f, +5.408744582e-02f, +5.566072150e-02f, +5.471202296e-02f, +5.135335367e-02f, +4.597475189e-02f, +3.917799119e-02f, +3.167722163e-02f, +2.418700446e-02f, +1.731983432e-02f, +1.151182130e-02f, +6.987797121e-03f, +3.767741783e-03f, +1.707498683e-03f, +5.603718267e-04f,\n    -4.137875911e-05f, -7.196186479e-05f, -1.097813335e-04f, -1.511380992e-04f, -1.904961658e-04f, -2.212498566e-04f, -2.368780408e-04f, -2.322606191e-04f, -2.048654630e-04f, -1.555175978e-04f, -8.854098772e-05f, -1.120038797e-05f, +6.746708201e-05f, +1.381953216e-04f, +1.930814118e-04f, +2.268884971e-04f, +2.377915891e-04f, +2.274321824e-04f, +2.003094010e-04f, +1.626834846e-04f, +1.212649717e-04f, +8.198808773e-05f, +4.911803594e-05f, +2.483720823e-05f,\n    /*  0, 5 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.304653725e-03f, +3.080391384e-03f, +5.954006688e-03f, +1.010523242e-02f, +1.556555477e-02f, +2.217008362e-02f, +2.954043411e-02f, +3.710777704e-02f, +4.417681923e-02f, +5.002198837e-02f, +5.399890483e-02f, +5.564952111e-02f, +5.477949004e-02f, +5.149154900e-02f, +4.616783330e-02f, +3.940487969e-02f, +3.191501321e-02f, +2.441443664e-02f, +1.752014373e-02f, +1.167450479e-02f, +7.109062093e-03f, +3.849729871e-03f, +1.756616719e-03f, +5.852090350e-04f,\n    -4.056246185e-05f, -7.088291709e-05f, -1.085214336e-04f, -1.498433732e-04f, -1.893609687e-04f, -2.204860398e-04f, -2.366750198e-04f, -2.327446049e-04f, -2.060673215e-04f, -1.573575226e-04f, -9.083469754e-05f, -1.368668407e-05f, +6.508259574e-05f, +1.361894531e-04f, +1.916663450e-04f, +2.261784077e-04f, +2.377895090e-04f, +2.280388952e-04f, +2.013510827e-04f, +1.639507809e-04f, +1.225541865e-04f, +8.313553567e-05f, +5.002112110e-05f, +2.545961565e-05f,\n    /*  0, 6 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.264091264e-03f, +3.009508467e-03f, +5.845485255e-03f, +9.955389042e-03f, +1.537619380e-02f, +2.194959758e-02f, +2.930375909e-02f, +3.687503244e-02f, +4.397075191e-02f, +4.986463085e-02f, +5.390807013e-02f, +5.563583443e-02f, +5.484457264e-02f, +5.162773845e-02f, +4.635949965e-02f, +3.963105810e-02f, +3.215280272e-02f, +2.464247554e-02f, +1.772149481e-02f, +1.183845557e-02f, +7.231616279e-03f, +3.932865406e-03f, +1.806637840e-03f, +6.106686506e-04f,\n    -3.975495944e-05f, -6.981129264e-05f, -1.072652872e-04f, -1.485469791e-04f, -1.882175742e-04f, -2.197075250e-04f, -2.364521385e-04f, -2.332060983e-04f, -2.072473709e-04f, -1.591798037e-04f, -9.311787923e-05f, -1.617137348e-05f, +6.269051648e-05f, +1.341681007e-04f, +1.902305206e-04f, +2.254456640e-04f, +2.377663278e-04f, +2.286289191e-04f, +2.023822639e-04f, +1.652142386e-04f, +1.238454723e-04f, +8.428931461e-05f, +5.093272665e-05f, +2.609073586e-05f,\n    /*  0, 7 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.224336304e-03f, +2.939697175e-03f, +5.738219968e-03f, +9.806842063e-03f, +1.518797623e-02f, +2.172989006e-02f, +2.906730695e-02f, +3.664182634e-02f, +4.376350454e-02f, +4.970545104e-02f, +5.381495225e-02f, +5.561966305e-02f, +5.490726315e-02f, +5.176190655e-02f, +4.654973017e-02f, +3.985650376e-02f, +3.239056905e-02f, +2.487110446e-02f, +1.792387707e-02f, +1.200366981e-02f, +7.355461751e-03f, +4.017154721e-03f, +1.857570567e-03f, +6.367593865e-04f,\n    -3.895626544e-05f, -6.874706913e-05f, -1.060130363e-04f, -1.472491081e-04f, -1.870661925e-04f, -2.189145021e-04f, -2.362095255e-04f, -2.336451340e-04f, -2.084055364e-04f, -1.609842617e-04f, -9.539027583e-05f, -1.865416474e-05f, +6.029111978e-05f, +1.321314770e-04f, +1.887740547e-04f, +2.246902716e-04f, +2.377219491e-04f, +2.292020825e-04f, +2.034027372e-04f, +1.664736552e-04f, +1.251386658e-04f, +8.544932188e-05f, +5.185281596e-05f, +2.673058920e-05f,\n    /*  0, 8 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.185380039e-03f, +2.870950105e-03f, +5.632206931e-03f, +9.659592955e-03f, +1.500091003e-02f, +2.151097556e-02f, +2.883109742e-02f, +3.640818120e-02f, +4.355509900e-02f, +4.954446678e-02f, +5.371956198e-02f, +5.560100889e-02f, +5.496755427e-02f, +5.189403803e-02f, +4.673850422e-02f, +4.008119403e-02f, +3.262829100e-02f, +2.510030654e-02f, +1.812727981e-02f, +1.217014346e-02f, +7.480600417e-03f, +4.102604043e-03f, +1.909423383e-03f, +6.634899757e-04f,\n    -3.816639157e-05f, -6.769032218e-05f, -1.047648212e-04f, -1.459499503e-04f, -1.859070338e-04f, -2.181071619e-04f, -2.359473116e-04f, -2.340617500e-04f, -2.095417464e-04f, -1.627707202e-04f, -9.765163225e-05f, -2.113476669e-05f, +5.788468247e-05f, +1.300797972e-04f, +1.872970664e-04f, +2.239122397e-04f, +2.376562792e-04f, +2.297582162e-04f, +2.044122956e-04f, +1.677288274e-04f, +1.264336021e-04f, +8.661545276e-05f, +5.278135038e-05f, +2.737919445e-05f,\n    /*  0, 9 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.147213647e-03f, +2.803259783e-03f, +5.527442110e-03f, +9.513643005e-03f, +1.481500300e-02f, +2.129286839e-02f, +2.859515011e-02f, +3.617411945e-02f, +4.334555725e-02f, +4.938169606e-02f, +5.362191034e-02f, +5.557987412e-02f, +5.502543896e-02f, +5.202411782e-02f, +4.692580129e-02f, +4.030510627e-02f, +3.286594728e-02f, +2.533006476e-02f, +1.833169210e-02f, +1.233787229e-02f, +7.607034019e-03f, +4.189219495e-03f, +1.962204733e-03f, +6.908691701e-04f,\n    -3.738534770e-05f, -6.664112530e-05f, -1.035207805e-04f, -1.446496947e-04f, -1.847403082e-04f, -2.172856968e-04f, -2.356656303e-04f, -2.344559875e-04f, -2.106559329e-04f, -1.645390058e-04f, -9.990169528e-05f, -2.361288858e-05f, +5.547148255e-05f, +1.280132790e-04f, +1.857996784e-04f, +2.231115807e-04f, +2.375692277e-04f, +2.302971523e-04f, +2.054107328e-04f, +1.689795512e-04f, +1.277301149e-04f, +8.778760047e-05f, +5.371828929e-05f, +2.803656886e-05f,\n    /*  0,10 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.109828299e-03f, +2.736618658e-03f, +5.423921330e-03f, +9.368993310e-03f, +1.463026269e-02f, +2.107558270e-02f, +2.835948448e-02f, +3.593966347e-02f, +4.313490132e-02f, +4.921715706e-02f, +5.352200865e-02f, +5.555626123e-02f, +5.508091044e-02f, +5.215213110e-02f, +4.711160097e-02f, +4.052821785e-02f, +3.310351651e-02f, +2.556036191e-02f, +1.853710284e-02f, +1.250685184e-02f, +7.734764134e-03f, +4.277007096e-03f, +2.015923023e-03f, +7.189057390e-04f,\n    -3.661314192e-05f, -6.559954993e-05f, -1.022810507e-04f, -1.433485289e-04f, -1.835662257e-04f, -2.164503001e-04f, -2.353646174e-04f, -2.348278912e-04f, -2.117480312e-04f, -1.662889481e-04f, -1.021402136e-04f, -2.608824006e-05f, +5.305179922e-05f, +1.259321426e-04f, +1.842820166e-04f, +2.222883106e-04f, +2.374607067e-04f, +2.308187252e-04f, +2.063978428e-04f, +1.702256220e-04f, +1.290280359e-04f, +8.896565621e-05f, +5.466359004e-05f, +2.870272812e-05f,\n    /*  0,11 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.073215158e-03f, +2.671019108e-03f, +5.321640279e-03f, +9.225644781e-03f, +1.444669647e-02f, +2.085913240e-02f, +2.812411986e-02f, +3.570483557e-02f, +4.292315329e-02f, +4.905086811e-02f, +5.341986844e-02f, +5.553017299e-02f, +5.513396224e-02f, +5.227806324e-02f, +4.729588299e-02f, +4.075050616e-02f, +3.334097721e-02f, +2.579118063e-02f, +1.874350068e-02f, +1.267707746e-02f, +7.863792170e-03f, +4.365972752e-03f, +2.070586613e-03f, +7.476084671e-04f,\n    -3.584978049e-05f, -6.456566540e-05f, -1.010457663e-04f, -1.420466395e-04f, -1.823849963e-04f, -2.156011663e-04f, -2.350444110e-04f, -2.351775086e-04f, -2.128179804e-04f, -1.680203798e-04f, -1.043669379e-04f, -2.856053128e-05f, +5.062591276e-05f, +1.238366106e-04f, +1.827442103e-04f, +2.214424487e-04f, +2.373306314e-04f, +2.313227709e-04f, +2.073734206e-04f, +1.714668346e-04f, +1.303271956e-04f, +9.014950911e-05f, +5.561720797e-05f, +2.937768631e-05f,\n    /*  0,12 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.037365377e-03f, +2.606453443e-03f, +5.220594513e-03f, +9.083598142e-03f, +1.426431147e-02f, +2.064353123e-02f, +2.788907545e-02f, +3.546965807e-02f, +4.271033531e-02f, +4.888284773e-02f, +5.331550150e-02f, +5.550161246e-02f, +5.518458815e-02f, +5.240189986e-02f, +4.747862720e-02f, +4.097194861e-02f, +3.357830785e-02f, +2.602250340e-02f, +1.895087410e-02f, +1.284854430e-02f, +7.994119366e-03f, +4.456122261e-03f, +2.126203821e-03f, +7.769861534e-04f,\n    -3.509526789e-05f, -6.353953899e-05f, -9.981506022e-05f, -1.407442116e-04f, -1.811968298e-04f, -2.147384913e-04f, -2.347051515e-04f, -2.355048907e-04f, -2.138657227e-04f, -1.697331367e-04f, -1.065816209e-04f, -3.102947289e-05f, +4.819410453e-05f, +1.217269082e-04f, +1.811863919e-04f, +2.205740179e-04f, +2.371789201e-04f, +2.318091276e-04f, +2.083372615e-04f, +1.727029831e-04f, +1.316274228e-04f, +9.133904628e-05f, +5.657909639e-05f, +3.006145594e-05f,\n    /*  0,13 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +1.002270109e-03f, +2.542913904e-03f, +5.120779452e-03f, +8.942853930e-03f, +1.408311464e-02f, +2.042879274e-02f, +2.765437030e-02f, +3.523415318e-02f, +4.249646959e-02f, +4.871311459e-02f, +5.320891988e-02f, +5.547058299e-02f, +5.523278225e-02f, +5.252362676e-02f, +4.765981359e-02f, +4.119252263e-02f, +3.381548677e-02f, +2.625431253e-02f, +1.915921136e-02f, +1.302124728e-02f, +8.125746789e-03f, +4.547461308e-03f, +2.182782917e-03f, +8.070476094e-04f,\n    -3.434960685e-05f, -6.252123589e-05f, -9.858906309e-05f, -1.394414293e-04f, -1.800019355e-04f, -2.138624717e-04f, -2.343469818e-04f, -2.358100918e-04f, -2.148912040e-04f, -1.714270575e-04f, -1.087840172e-04f, -3.349477614e-05f, +4.575665691e-05f, +1.196032629e-04f, +1.796086972e-04f, +2.196830446e-04f, +2.370054938e-04f, +2.322776351e-04f, +2.092891617e-04f, +1.739338611e-04f, +1.329285447e-04f, +9.253415281e-05f, +5.754920659e-05f, +3.075404787e-05f,\n    /*  0,14 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +9.679205023e-04f, +2.480392668e-03f, +5.022190389e-03f, +8.803412501e-03f, +1.390311270e-02f, +2.021493027e-02f, +2.742002332e-02f, +3.499834308e-02f, +4.228157838e-02f, +4.854168753e-02f, +5.310013586e-02f, +5.543708821e-02f, +5.527853891e-02f, +5.264323003e-02f, +4.783942229e-02f, +4.141220567e-02f, +3.405249226e-02f, +2.648659017e-02f, +1.936850052e-02f, +1.319518114e-02f, +8.258675333e-03f, +4.639995460e-03f, +2.240332124e-03f, +8.378016572e-04f,\n    -3.361279831e-05f, -6.151081921e-05f, -9.736790378e-05f, -1.381384751e-04f, -1.788005228e-04f, -2.129733054e-04f, -2.339700470e-04f, -2.360931689e-04f, -2.158943737e-04f, -1.731019841e-04f, -1.109738837e-04f, -3.595615288e-05f, +4.331385324e-05f, +1.174659045e-04f, +1.780112652e-04f, +2.187695585e-04f, +2.368102768e-04f, +2.327281357e-04f, +2.102289181e-04f, +1.751592616e-04f, +1.342303873e-04f, +9.373471177e-05f, +5.852748780e-05f, +3.145547134e-05f,\n    /*  0,15 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +9.343077040e-04f, +2.418881849e-03f, +4.924822486e-03f, +8.665274026e-03f, +1.372431218e-02f, +2.000195696e-02f, +2.718605327e-02f, +3.476224991e-02f, +4.206568401e-02f, +4.836858555e-02f, +5.298916198e-02f, +5.540113206e-02f, +5.532185276e-02f, +5.276069593e-02f, +4.801743355e-02f, +4.163097523e-02f, +3.428930254e-02f, +2.671931830e-02f, +1.957872944e-02f, +1.337034040e-02f, +8.392905721e-03f, +4.733730172e-03f, +2.298859611e-03f, +8.692571286e-04f,\n    -3.288484150e-05f, -6.050835000e-05f, -9.615170919e-05f, -1.368355303e-04f, -1.775928005e-04f, -2.120711910e-04f, -2.335744944e-04f, -2.363541826e-04f, -2.168751846e-04f, -1.747577616e-04f, -1.131509793e-04f, -3.841331568e-05f, +4.086597778e-05f, +1.153150651e-04f, +1.763942382e-04f, +2.178335929e-04f, +2.365931963e-04f, +2.331604734e-04f, +2.111563284e-04f, +1.763789774e-04f, +1.355327749e-04f, +9.494060420e-05f, +5.951388722e-05f, +3.216573391e-05f,\n    /*  0,16 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +9.014228625e-04f, +2.358373499e-03f, +4.828670776e-03f, +8.528438495e-03f, +1.354671938e-02f, +1.978988577e-02f, +2.695247878e-02f, +3.452589573e-02f, +4.184880882e-02f, +4.819382779e-02f, +5.287601100e-02f, +5.536271874e-02f, +5.536271874e-02f, +5.287601100e-02f, +4.819382779e-02f, +4.184880882e-02f, +3.452589573e-02f, +2.695247878e-02f, +1.978988577e-02f, +1.354671938e-02f, +8.528438495e-03f, +4.828670776e-03f, +2.358373499e-03f, +9.014228625e-04f,\n    -3.216573391e-05f, -5.951388722e-05f, -9.494060420e-05f, -1.355327749e-04f, -1.763789774e-04f, -2.111563284e-04f, -2.331604734e-04f, -2.365931963e-04f, -2.178335929e-04f, -1.763942382e-04f, -1.153150651e-04f, -4.086597778e-05f, +3.841331568e-05f, +1.131509793e-04f, +1.747577616e-04f, +2.168751846e-04f, +2.363541826e-04f, +2.335744944e-04f, +2.120711910e-04f, +1.775928005e-04f, +1.368355303e-04f, +9.615170919e-05f, +6.050835000e-05f, +3.288484150e-05f,\n    /*  0,17 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +8.692571286e-04f, +2.298859611e-03f, +4.733730172e-03f, +8.392905721e-03f, +1.337034040e-02f, +1.957872944e-02f, +2.671931830e-02f, +3.428930254e-02f, +4.163097523e-02f, +4.801743355e-02f, +5.276069593e-02f, +5.532185276e-02f, +5.540113206e-02f, +5.298916198e-02f, +4.836858555e-02f, +4.206568401e-02f, +3.476224991e-02f, +2.718605327e-02f, +2.000195696e-02f, +1.372431218e-02f, +8.665274026e-03f, +4.924822486e-03f, +2.418881849e-03f, +9.343077040e-04f,\n    -3.145547134e-05f, -5.852748780e-05f, -9.373471177e-05f, -1.342303873e-04f, -1.751592616e-04f, -2.102289181e-04f, -2.327281357e-04f, -2.368102768e-04f, -2.187695585e-04f, -1.780112652e-04f, -1.174659045e-04f, -4.331385324e-05f, +3.595615288e-05f, +1.109738837e-04f, +1.731019841e-04f, +2.158943737e-04f, +2.360931689e-04f, +2.339700470e-04f, +2.129733054e-04f, +1.788005228e-04f, +1.381384751e-04f, +9.736790378e-05f, +6.151081921e-05f, +3.361279831e-05f,\n    /*  0,18 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +8.378016572e-04f, +2.240332124e-03f, +4.639995460e-03f, +8.258675333e-03f, +1.319518114e-02f, +1.936850052e-02f, +2.648659017e-02f, +3.405249226e-02f, +4.141220567e-02f, +4.783942229e-02f, +5.264323003e-02f, +5.527853891e-02f, +5.543708821e-02f, +5.310013586e-02f, +4.854168753e-02f, +4.228157838e-02f, +3.499834308e-02f, +2.742002332e-02f, +2.021493027e-02f, +1.390311270e-02f, +8.803412501e-03f, +5.022190389e-03f, +2.480392668e-03f, +9.679205023e-04f,\n    -3.075404787e-05f, -5.754920659e-05f, -9.253415281e-05f, -1.329285447e-04f, -1.739338611e-04f, -2.092891617e-04f, -2.322776351e-04f, -2.370054938e-04f, -2.196830446e-04f, -1.796086972e-04f, -1.196032629e-04f, -4.575665691e-05f, +3.349477614e-05f, +1.087840172e-04f, +1.714270575e-04f, +2.148912040e-04f, +2.358100918e-04f, +2.343469818e-04f, +2.138624717e-04f, +1.800019355e-04f, +1.394414293e-04f, +9.858906309e-05f, +6.252123589e-05f, +3.434960685e-05f,\n    /*  0,19 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +8.070476094e-04f, +2.182782917e-03f, +4.547461308e-03f, +8.125746789e-03f, +1.302124728e-02f, +1.915921136e-02f, +2.625431253e-02f, +3.381548677e-02f, +4.119252263e-02f, +4.765981359e-02f, +5.252362676e-02f, +5.523278225e-02f, +5.547058299e-02f, +5.320891988e-02f, +4.871311459e-02f, +4.249646959e-02f, +3.523415318e-02f, +2.765437030e-02f, +2.042879274e-02f, +1.408311464e-02f, +8.942853930e-03f, +5.120779452e-03f, +2.542913904e-03f, +1.002270109e-03f,\n    -3.006145594e-05f, -5.657909639e-05f, -9.133904628e-05f, -1.316274228e-04f, -1.727029831e-04f, -2.083372615e-04f, -2.318091276e-04f, -2.371789201e-04f, -2.205740179e-04f, -1.811863919e-04f, -1.217269082e-04f, -4.819410453e-05f, +3.102947289e-05f, +1.065816209e-04f, +1.697331367e-04f, +2.138657227e-04f, +2.355048907e-04f, +2.347051515e-04f, +2.147384913e-04f, +1.811968298e-04f, +1.407442116e-04f, +9.981506022e-05f, +6.353953899e-05f, +3.509526789e-05f,\n    /*  0,20 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +7.769861534e-04f, +2.126203821e-03f, +4.456122261e-03f, +7.994119366e-03f, +1.284854430e-02f, +1.895087410e-02f, +2.602250340e-02f, +3.357830785e-02f, +4.097194861e-02f, +4.747862720e-02f, +5.240189986e-02f, +5.518458815e-02f, +5.550161246e-02f, +5.331550150e-02f, +4.888284773e-02f, +4.271033531e-02f, +3.546965807e-02f, +2.788907545e-02f, +2.064353123e-02f, +1.426431147e-02f, +9.083598142e-03f, +5.220594513e-03f, +2.606453443e-03f, +1.037365377e-03f,\n    -2.937768631e-05f, -5.561720797e-05f, -9.014950911e-05f, -1.303271956e-04f, -1.714668346e-04f, -2.073734206e-04f, -2.313227709e-04f, -2.373306314e-04f, -2.214424487e-04f, -1.827442103e-04f, -1.238366106e-04f, -5.062591276e-05f, +2.856053128e-05f, +1.043669379e-04f, +1.680203798e-04f, +2.128179804e-04f, +2.351775086e-04f, +2.350444110e-04f, +2.156011663e-04f, +1.823849963e-04f, +1.420466395e-04f, +1.010457663e-04f, +6.456566540e-05f, +3.584978049e-05f,\n    /*  0,21 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +7.476084671e-04f, +2.070586613e-03f, +4.365972752e-03f, +7.863792170e-03f, +1.267707746e-02f, +1.874350068e-02f, +2.579118063e-02f, +3.334097721e-02f, +4.075050616e-02f, +4.729588299e-02f, +5.227806324e-02f, +5.513396224e-02f, +5.553017299e-02f, +5.341986844e-02f, +4.905086811e-02f, +4.292315329e-02f, +3.570483557e-02f, +2.812411986e-02f, +2.085913240e-02f, +1.444669647e-02f, +9.225644781e-03f, +5.321640279e-03f, +2.671019108e-03f, +1.073215158e-03f,\n    -2.870272812e-05f, -5.466359004e-05f, -8.896565621e-05f, -1.290280359e-04f, -1.702256220e-04f, -2.063978428e-04f, -2.308187252e-04f, -2.374607067e-04f, -2.222883106e-04f, -1.842820166e-04f, -1.259321426e-04f, -5.305179922e-05f, +2.608824006e-05f, +1.021402136e-04f, +1.662889481e-04f, +2.117480312e-04f, +2.348278912e-04f, +2.353646174e-04f, +2.164503001e-04f, +1.835662257e-04f, +1.433485289e-04f, +1.022810507e-04f, +6.559954993e-05f, +3.661314192e-05f,\n    /*  0,22 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +7.189057390e-04f, +2.015923023e-03f, +4.277007096e-03f, +7.734764134e-03f, +1.250685184e-02f, +1.853710284e-02f, +2.556036191e-02f, +3.310351651e-02f, +4.052821785e-02f, +4.711160097e-02f, +5.215213110e-02f, +5.508091044e-02f, +5.555626123e-02f, +5.352200865e-02f, +4.921715706e-02f, +4.313490132e-02f, +3.593966347e-02f, +2.835948448e-02f, +2.107558270e-02f, +1.463026269e-02f, +9.368993310e-03f, +5.423921330e-03f, +2.736618658e-03f, +1.109828299e-03f,\n    -2.803656886e-05f, -5.371828929e-05f, -8.778760047e-05f, -1.277301149e-04f, -1.689795512e-04f, -2.054107328e-04f, -2.302971523e-04f, -2.375692277e-04f, -2.231115807e-04f, -1.857996784e-04f, -1.280132790e-04f, -5.547148255e-05f, +2.361288858e-05f, +9.990169528e-05f, +1.645390058e-04f, +2.106559329e-04f, +2.344559875e-04f, +2.356656303e-04f, +2.172856968e-04f, +1.847403082e-04f, +1.446496947e-04f, +1.035207805e-04f, +6.664112530e-05f, +3.738534770e-05f,\n    /*  0,23 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +6.908691701e-04f, +1.962204733e-03f, +4.189219495e-03f, +7.607034019e-03f, +1.233787229e-02f, +1.833169210e-02f, +2.533006476e-02f, +3.286594728e-02f, +4.030510627e-02f, +4.692580129e-02f, +5.202411782e-02f, +5.502543896e-02f, +5.557987412e-02f, +5.362191034e-02f, +4.938169606e-02f, +4.334555725e-02f, +3.617411945e-02f, +2.859515011e-02f, +2.129286839e-02f, +1.481500300e-02f, +9.513643005e-03f, +5.527442110e-03f, +2.803259783e-03f, +1.147213647e-03f,\n    -2.737919445e-05f, -5.278135038e-05f, -8.661545276e-05f, -1.264336021e-04f, -1.677288274e-04f, -2.044122956e-04f, -2.297582162e-04f, -2.376562792e-04f, -2.239122397e-04f, -1.872970664e-04f, -1.300797972e-04f, -5.788468247e-05f, +2.113476669e-05f, +9.765163225e-05f, +1.627707202e-04f, +2.095417464e-04f, +2.340617500e-04f, +2.359473116e-04f, +2.181071619e-04f, +1.859070338e-04f, +1.459499503e-04f, +1.047648212e-04f, +6.769032218e-05f, +3.816639157e-05f,\n    /*  0,24 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +6.634899757e-04f, +1.909423383e-03f, +4.102604043e-03f, +7.480600417e-03f, +1.217014346e-02f, +1.812727981e-02f, +2.510030654e-02f, +3.262829100e-02f, +4.008119403e-02f, +4.673850422e-02f, +5.189403803e-02f, +5.496755427e-02f, +5.560100889e-02f, +5.371956198e-02f, +4.954446678e-02f, +4.355509900e-02f, +3.640818120e-02f, +2.883109742e-02f, +2.151097556e-02f, +1.500091003e-02f, +9.659592955e-03f, +5.632206931e-03f, +2.870950105e-03f, +1.185380039e-03f,\n    -2.673058920e-05f, -5.185281596e-05f, -8.544932188e-05f, -1.251386658e-04f, -1.664736552e-04f, -2.034027372e-04f, -2.292020825e-04f, -2.377219491e-04f, -2.246902716e-04f, -1.887740547e-04f, -1.321314770e-04f, -6.029111978e-05f, +1.865416474e-05f, +9.539027583e-05f, +1.609842617e-04f, +2.084055364e-04f, +2.336451340e-04f, +2.362095255e-04f, +2.189145021e-04f, +1.870661925e-04f, +1.472491081e-04f, +1.060130363e-04f, +6.874706913e-05f, +3.895626544e-05f,\n    /*  0,25 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +6.367593865e-04f, +1.857570567e-03f, +4.017154721e-03f, +7.355461751e-03f, +1.200366981e-02f, +1.792387707e-02f, +2.487110446e-02f, +3.239056905e-02f, +3.985650376e-02f, +4.654973017e-02f, +5.176190655e-02f, +5.490726315e-02f, +5.561966305e-02f, +5.381495225e-02f, +4.970545104e-02f, +4.376350454e-02f, +3.664182634e-02f, +2.906730695e-02f, +2.172989006e-02f, +1.518797623e-02f, +9.806842063e-03f, +5.738219968e-03f, +2.939697175e-03f, +1.224336304e-03f,\n    -2.609073586e-05f, -5.093272665e-05f, -8.428931461e-05f, -1.238454723e-04f, -1.652142386e-04f, -2.023822639e-04f, -2.286289191e-04f, -2.377663278e-04f, -2.254456640e-04f, -1.902305206e-04f, -1.341681007e-04f, -6.269051648e-05f, +1.617137348e-05f, +9.311787923e-05f, +1.591798037e-04f, +2.072473709e-04f, +2.332060983e-04f, +2.364521385e-04f, +2.197075250e-04f, +1.882175742e-04f, +1.485469791e-04f, +1.072652872e-04f, +6.981129264e-05f, +3.975495944e-05f,\n    /*  0,26 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +6.106686506e-04f, +1.806637840e-03f, +3.932865406e-03f, +7.231616279e-03f, +1.183845557e-02f, +1.772149481e-02f, +2.464247554e-02f, +3.215280272e-02f, +3.963105810e-02f, +4.635949965e-02f, +5.162773845e-02f, +5.484457264e-02f, +5.563583443e-02f, +5.390807013e-02f, +4.986463085e-02f, +4.397075191e-02f, +3.687503244e-02f, +2.930375909e-02f, +2.194959758e-02f, +1.537619380e-02f, +9.955389042e-03f, +5.845485255e-03f, +3.009508467e-03f, +1.264091264e-03f,\n    -2.545961565e-05f, -5.002112110e-05f, -8.313553567e-05f, -1.225541865e-04f, -1.639507809e-04f, -2.013510827e-04f, -2.280388952e-04f, -2.377895090e-04f, -2.261784077e-04f, -1.916663450e-04f, -1.361894531e-04f, -6.508259574e-05f, +1.368668407e-05f, +9.083469754e-05f, +1.573575226e-04f, +2.060673215e-04f, +2.327446049e-04f, +2.366750198e-04f, +2.204860398e-04f, +1.893609687e-04f, +1.498433732e-04f, +1.085214336e-04f, +7.088291709e-05f, +4.056246185e-05f,\n    /*  0,27 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +5.852090350e-04f, +1.756616719e-03f, +3.849729871e-03f, +7.109062093e-03f, +1.167450479e-02f, +1.752014373e-02f, +2.441443664e-02f, +3.191501321e-02f, +3.940487969e-02f, +4.616783330e-02f, +5.149154900e-02f, +5.477949004e-02f, +5.564952111e-02f, +5.399890483e-02f, +5.002198837e-02f, +4.417681923e-02f, +3.710777704e-02f, +2.954043411e-02f, +2.217008362e-02f, +1.556555477e-02f, +1.010523242e-02f, +5.954006688e-03f, +3.080391384e-03f, +1.304653725e-03f,\n    -2.483720823e-05f, -4.911803594e-05f, -8.198808773e-05f, -1.212649717e-04f, -1.626834846e-04f, -2.003094010e-04f, -2.274321824e-04f, -2.377915891e-04f, -2.268884971e-04f, -1.930814118e-04f, -1.381953216e-04f, -6.746708201e-05f, +1.120038797e-05f, +8.854098772e-05f, +1.555175978e-04f, +2.048654630e-04f, +2.322606191e-04f, +2.368780408e-04f, +2.212498566e-04f, +1.904961658e-04f, +1.511380992e-04f, +1.097813335e-04f, +7.196186479e-05f, +4.137875911e-05f,\n    /*  0,28 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +5.603718267e-04f, +1.707498683e-03f, +3.767741783e-03f, +6.987797121e-03f, +1.151182130e-02f, +1.731983432e-02f, +2.418700446e-02f, +3.167722163e-02f, +3.917799119e-02f, +4.597475189e-02f, +5.135335367e-02f, +5.471202296e-02f, +5.566072150e-02f, +5.408744582e-02f, +5.017750597e-02f, +4.438168469e-02f, +3.734003766e-02f, +2.977731215e-02f, +2.239133348e-02f, +1.575605093e-02f, +1.025637051e-02f, +6.063788022e-03f, +3.152353249e-03f, +1.346032485e-03f,\n    -2.422349177e-05f, -4.822350583e-05f, -8.084707136e-05f, -1.199779894e-04f, -1.614125515e-04f, -1.992574267e-04f, -2.268089534e-04f, -2.377726671e-04f, -2.275759301e-04f, -1.944756084e-04f, -1.401854962e-04f, -6.984370103e-05f, +8.712776940e-06f, +8.623700849e-05f, +1.536602113e-04f, +2.036418741e-04f, +2.317541095e-04f, +2.370610757e-04f, +2.219987871e-04f, +1.916229551e-04f, +1.524309647e-04f, +1.110448427e-04f, +7.304805597e-05f, +4.220383580e-05f,\n    /*  0,29 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +5.361483350e-04f, +1.659275177e-03f, +3.686894711e-03f, +6.867819132e-03f, +1.135040875e-02f, +1.712057690e-02f, +2.396019551e-02f, +3.143944896e-02f, +3.895041526e-02f, +4.578027628e-02f, +5.121316818e-02f, +5.464217926e-02f, +5.566943427e-02f, +5.417368283e-02f, +5.033116618e-02f, +4.458532657e-02f, +3.757179177e-02f, +3.001437322e-02f, +2.261333227e-02f, +1.594767389e-02f, +1.040880148e-02f, +6.174832865e-03f, +3.225401305e-03f, +1.388236320e-03f,\n    -2.361844294e-05f, -4.733756345e-05f, -7.971258511e-05f, -1.186933996e-04f, -1.601381827e-04f, -1.981953682e-04f, -2.261693833e-04f, -2.377328453e-04f, -2.282407078e-04f, -1.958488257e-04f, -1.421597696e-04f, -7.221217990e-05f, +6.224142940e-06f, +8.392302033e-05f, +1.517855485e-04f, +2.023966364e-04f, +2.312250478e-04f, +2.372240010e-04f, +2.227326442e-04f, +1.927411265e-04f, +1.537217763e-04f, +1.123118154e-04f, +7.414140875e-05f, +4.303767463e-05f,\n    /*  0,30 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +5.125298920e-04f, +1.611937614e-03f, +3.607182126e-03f, +6.749125732e-03f, +1.119027057e-02f, +1.692238153e-02f, +2.373402612e-02f, +3.120171611e-02f, +3.872217455e-02f, +4.558442746e-02f, +5.107100841e-02f, +5.456996708e-02f, +5.567565842e-02f, +5.425760585e-02f, +5.048295173e-02f, +4.478772320e-02f, +3.780301682e-02f, +3.025159722e-02f, +2.283606491e-02f, +1.614041502e-02f, +1.056252326e-02f, +6.287144680e-03f, +3.299542714e-03f, +1.431273995e-03f,\n    -2.302203695e-05f, -4.646023953e-05f, -7.858472543e-05f, -1.174113605e-04f, -1.588605782e-04f, -1.971234341e-04f, -2.255136482e-04f, -2.376722283e-04f, -2.288828348e-04f, -1.972009578e-04f, -1.441179370e-04f, -7.457224711e-05f, +3.734778125e-06f, +8.159928545e-05f, +1.498937974e-04f, +2.011298355e-04f, +2.306734093e-04f, +2.373666959e-04f, +2.234512424e-04f, +1.938504700e-04f, +1.550103394e-04f, +1.135821039e-04f, +7.524183918e-05f, +4.388025644e-05f,\n    /*  0,31 (24) */\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +4.895078551e-04f, +1.565477374e-03f, +3.528597401e-03f, +6.631714371e-03f, +1.103140999e-02f, +1.672525810e-02f, +2.350851248e-02f, +3.096404388e-02f, +3.849329172e-02f, +4.538722650e-02f, +5.092689047e-02f, +5.449539483e-02f, +5.567939320e-02f, +5.433920513e-02f, +5.063284553e-02f, +4.498885304e-02f, +3.803369023e-02f, +3.048896392e-02f, +2.305951615e-02f, +1.633426549e-02f, +1.071753360e-02f, +6.400726784e-03f, +3.374784553e-03f, +1.475154251e-03f,\n    -2.243424753e-05f, -4.559156282e-05f, -7.746358669e-05f, -1.161320286e-04f, -1.575799374e-04f, -1.960418335e-04f, -2.248419263e-04f, -2.375909238e-04f, -2.295023193e-04f, -1.985319023e-04f, -1.460597965e-04f, -7.692363257e-05f, +1.244974771e-06f, +7.926606770e-05f, +1.479851488e-04f, +1.998415601e-04f, +2.300991725e-04f, +2.374890420e-04f, +2.241543973e-04f, +1.949507756e-04f, +1.562964586e-04f, +1.148555588e-04f, +7.634926120e-05f, +4.473156016e-05f,\n    /*  1, 0 (24) */\n    +1.519885812e-03f, +3.451133814e-03f, +6.515582343e-03f, +1.087383005e-02f, +1.652921626e-02f, +2.328367055e-02f, +3.072645296e-02f, +3.826378940e-02f, +4.518869460e-02f, +5.078083067e-02f, +5.441847120e-02f, +5.568063817e-02f, +5.441847120e-02f, +5.078083067e-02f, +4.518869460e-02f, +3.826378940e-02f, +3.072645296e-02f, +2.328367055e-02f, +1.652921626e-02f, +1.087383005e-02f, +6.515582343e-03f, +3.451133814e-03f, +1.519885812e-03f, +4.670736076e-04f,\n    -4.473156016e-05f, -7.634926120e-05f, -1.148555588e-04f, -1.562964586e-04f, -1.949507756e-04f, -2.241543973e-04f, -2.374890420e-04f, -2.300991725e-04f, -1.998415601e-04f, -1.479851488e-04f, -7.926606770e-05f, -1.244974771e-06f, +7.692363257e-05f, +1.460597965e-04f, +1.985319023e-04f, +2.295023193e-04f, +2.375909238e-04f, +2.248419263e-04f, +1.960418335e-04f, +1.575799374e-04f, +1.161320286e-04f, +7.746358669e-05f, +4.559156282e-05f, +2.243424753e-05f,\n    -2.571886324e-03f, -4.676401683e-03f, -6.561668623e-03f, -7.164735847e-03f, -5.308059271e-03f, -9.514922051e-05f, +8.682143432e-03f, +2.028234462e-02f, +3.302709414e-02f, +4.462858385e-02f, +5.275755856e-02f, +5.568063817e-02f, +5.275755856e-02f, +4.462858385e-02f, +3.302709414e-02f, +2.028234462e-02f, +8.682143432e-03f, -9.514922051e-05f, -5.308059271e-03f, -7.164735847e-03f, -6.561668623e-03f, -4.676401683e-03f, -2.571886324e-03f, -9.379568278e-04f,\n    +6.057711558e-05f, +6.716380176e-05f, +4.569112297e-05f, -1.252739563e-05f, -1.055379432e-04f, -2.180533719e-04f, -3.234559409e-04f, -3.906185166e-04f, -3.936511404e-04f, -3.212149006e-04f, -1.818366243e-04f, -2.908776646e-06f, +1.766603177e-04f, +3.177737361e-04f, +3.925388696e-04f, +3.917885782e-04f, +3.262924828e-04f, +2.216145512e-04f, +1.088731127e-04f, +1.495214967e-05f, -4.444991597e-05f, -6.698223140e-05f, -6.107446643e-05f, -4.042206620e-05f,\n    /*  1, 1 (24) */\n    +1.475154251e-03f, +3.374784553e-03f, +6.400726784e-03f, +1.071753360e-02f, +1.633426549e-02f, +2.305951615e-02f, +3.048896392e-02f, +3.803369023e-02f, +4.498885304e-02f, +5.063284553e-02f, +5.433920513e-02f, +5.567939320e-02f, +5.449539483e-02f, +5.092689047e-02f, +4.538722650e-02f, +3.849329172e-02f, +3.096404388e-02f, +2.350851248e-02f, +1.672525810e-02f, +1.103140999e-02f, +6.631714371e-03f, +3.528597401e-03f, +1.565477374e-03f, +4.895078551e-04f,\n    -4.388025644e-05f, -7.524183918e-05f, -1.135821039e-04f, -1.550103394e-04f, -1.938504700e-04f, -2.234512424e-04f, -2.373666959e-04f, -2.306734093e-04f, -2.011298355e-04f, -1.498937974e-04f, -8.159928545e-05f, -3.734778125e-06f, +7.457224711e-05f, +1.441179370e-04f, +1.972009578e-04f, +2.288828348e-04f, +2.376722283e-04f, +2.255136482e-04f, +1.971234341e-04f, +1.588605782e-04f, +1.174113605e-04f, +7.858472543e-05f, +4.646023953e-05f, +2.302203695e-05f,\n    -2.511309208e-03f, -4.609237881e-03f, -6.515977501e-03f, -7.177263242e-03f, -5.413597214e-03f, -3.132025924e-04f, +8.358687491e-03f, +1.989172610e-02f, +3.263344300e-02f, +4.430736895e-02f, +5.257572193e-02f, +5.567772939e-02f, +5.293421887e-02f, +4.494635759e-02f, +3.341963301e-02f, +2.067413320e-02f, +9.008435915e-03f, +1.264653307e-04f, -5.199186158e-03f, -7.149783697e-03f, -6.606118539e-03f, -4.743383914e-03f, -2.632960791e-03f, -9.783788940e-04f,\n    +6.006588847e-05f, +6.731755534e-05f, +4.689554782e-05f, -1.013775625e-05f, -1.022227988e-04f, -2.144856476e-04f, -3.205816252e-04f, -3.893845993e-04f, -3.946880233e-04f, -3.245890848e-04f, -1.869733261e-04f, -8.725687627e-06f, +1.714455010e-04f, +3.142661832e-04f, +3.913511592e-04f, +3.928941620e-04f, +3.290903040e-04f, +2.251682337e-04f, +1.122276266e-04f, +1.741175321e-05f, -4.317179353e-05f, -6.677245590e-05f, -6.155749209e-05f, -4.115169237e-05f,\n    /*  1, 2 (24) */\n    +1.431273995e-03f, +3.299542714e-03f, +6.287144680e-03f, +1.056252326e-02f, +1.614041502e-02f, +2.283606491e-02f, +3.025159722e-02f, +3.780301682e-02f, +4.478772320e-02f, +5.048295173e-02f, +5.425760585e-02f, +5.567565842e-02f, +5.456996708e-02f, +5.107100841e-02f, +4.558442746e-02f, +3.872217455e-02f, +3.120171611e-02f, +2.373402612e-02f, +1.692238153e-02f, +1.119027057e-02f, +6.749125732e-03f, +3.607182126e-03f, +1.611937614e-03f, +5.125298920e-04f,\n    -4.303767463e-05f, -7.414140875e-05f, -1.123118154e-04f, -1.537217763e-04f, -1.927411265e-04f, -2.227326442e-04f, -2.372240010e-04f, -2.312250478e-04f, -2.023966364e-04f, -1.517855485e-04f, -8.392302033e-05f, -6.224142940e-06f, +7.221217990e-05f, +1.421597696e-04f, +1.958488257e-04f, +2.282407078e-04f, +2.377328453e-04f, +2.261693833e-04f, +1.981953682e-04f, +1.601381827e-04f, +1.186933996e-04f, +7.971258511e-05f, +4.733756345e-05f, +2.361844294e-05f,\n    -2.451243320e-03f, -4.541920326e-03f, -6.469081953e-03f, -7.187400998e-03f, -5.515820013e-03f, -5.276882399e-04f, +8.038105866e-03f, +1.950234150e-02f, +3.223875497e-02f, +4.398277987e-02f, +5.238874861e-02f, +5.566900371e-02f, +5.310566437e-02f, +4.526062377e-02f, +3.381098417e-02f, +2.106702736e-02f, +9.337526219e-03f, +3.516335643e-04f, -5.086958531e-03f, -7.132371944e-03f, -6.649290333e-03f, -4.810156370e-03f, -2.694518283e-03f, -1.019530586e-03f,\n    +5.954123292e-05f, +6.744388532e-05f, +4.806333441e-05f, -7.783483193e-06f, -9.892834806e-05f, -2.109123251e-04f, -3.176704877e-04f, -3.880874633e-04f, -3.956495901e-04f, -3.278957162e-04f, -1.920693398e-04f, -1.454067187e-05f, +1.661932803e-04f, +3.106928523e-04f, +3.900879776e-04f, +3.939346603e-04f, +3.318484630e-04f, +2.287134631e-04f, +1.156007930e-04f, +1.990592754e-05f, -4.185663315e-05f, -6.653409200e-05f, -6.202574269e-05f, -4.187973832e-05f,\n    /*  1, 3 (24) */\n    +1.388236320e-03f, +3.225401305e-03f, +6.174832865e-03f, +1.040880148e-02f, +1.594767389e-02f, +2.261333227e-02f, +3.001437322e-02f, +3.757179177e-02f, +4.458532657e-02f, +5.033116618e-02f, +5.417368283e-02f, +5.566943427e-02f, +5.464217926e-02f, +5.121316818e-02f, +4.578027628e-02f, +3.895041526e-02f, +3.143944896e-02f, +2.396019551e-02f, +1.712057690e-02f, +1.135040875e-02f, +6.867819132e-03f, +3.686894711e-03f, +1.659275177e-03f, +5.361483350e-04f,\n    -4.220383580e-05f, -7.304805597e-05f, -1.110448427e-04f, -1.524309647e-04f, -1.916229551e-04f, -2.219987871e-04f, -2.370610757e-04f, -2.317541095e-04f, -2.036418741e-04f, -1.536602113e-04f, -8.623700849e-05f, -8.712776940e-06f, +6.984370103e-05f, +1.401854962e-04f, +1.944756084e-04f, +2.275759301e-04f, +2.377726671e-04f, +2.268089534e-04f, +1.992574267e-04f, +1.614125515e-04f, +1.199779894e-04f, +8.084707136e-05f, +4.822350583e-05f, +2.422349177e-05f,\n    -2.391702087e-03f, -4.474476440e-03f, -6.421018618e-03f, -7.195184482e-03f, -5.614748361e-03f, -7.386005651e-04f, +7.720435378e-03f, +1.911425404e-02f, +3.184310538e-02f, +4.365488415e-02f, +5.219667927e-02f, +5.565446303e-02f, +5.327185765e-02f, +4.557131662e-02f, +3.420107214e-02f, +2.146096202e-02f, +9.669374682e-03f, +5.803470275e-04f, -4.971357738e-03f, -7.112466016e-03f, -6.691146966e-03f, -4.876690462e-03f, -2.756544025e-03f, -1.061410325e-03f,\n    +5.900359551e-05f, +6.754318962e-05f, +4.919463712e-05f, -5.464814636e-06f, -9.565524824e-05f, -2.073343464e-04f, -3.147234851e-04f, -3.867277599e-04f, -3.965359323e-04f, -3.311342413e-04f, -1.971235943e-04f, -2.035244551e-05f, +1.609047730e-04f, +3.070543729e-04f, +3.887493134e-04f, +3.949094806e-04f, +3.345660239e-04f, +2.322492790e-04f, +1.189919086e-04f, +2.243438042e-05f, -4.050432324e-05f, -6.626676172e-05f, -6.247876761e-05f, -4.260584945e-05f,\n    /*  1, 4 (24) */\n    +1.346032485e-03f, +3.152353249e-03f, +6.063788022e-03f, +1.025637051e-02f, +1.575605093e-02f, +2.239133348e-02f, +2.977731215e-02f, +3.734003766e-02f, +4.438168469e-02f, +5.017750597e-02f, +5.408744582e-02f, +5.566072150e-02f, +5.471202296e-02f, +5.135335367e-02f, +4.597475189e-02f, +3.917799119e-02f, +3.167722163e-02f, +2.418700446e-02f, +1.731983432e-02f, +1.151182130e-02f, +6.987797121e-03f, +3.767741783e-03f, +1.707498683e-03f, +5.603718267e-04f,\n    -4.137875911e-05f, -7.196186479e-05f, -1.097813335e-04f, -1.511380992e-04f, -1.904961658e-04f, -2.212498566e-04f, -2.368780408e-04f, -2.322606191e-04f, -2.048654630e-04f, -1.555175978e-04f, -8.854098772e-05f, -1.120038797e-05f, +6.746708201e-05f, +1.381953216e-04f, +1.930814118e-04f, +2.268884971e-04f, +2.377915891e-04f, +2.274321824e-04f, +2.003094010e-04f, +1.626834846e-04f, +1.212649717e-04f, +8.198808773e-05f, +4.911803594e-05f, +2.483720823e-05f,\n    -2.332698492e-03f, -4.406933251e-03f, -6.371823981e-03f, -7.200649296e-03f, -5.710403609e-03f, -9.459349115e-04f, +7.405711893e-03f, +1.872752628e-02f, +3.144656945e-02f, +4.332374991e-02f, +5.199955567e-02f, +5.563411059e-02f, +5.343276243e-02f, +4.587837100e-02f, +3.458982146e-02f, +2.185587150e-02f, +1.000394071e-02f, +8.125963065e-04f, -4.852365830e-03f, -7.090031636e-03f, -6.731651289e-03f, -4.942957224e-03f, -2.819022793e-03f, -1.104016174e-03f,\n    +5.845342137e-05f, +6.761587059e-05f, +5.028962066e-05f, -3.181975286e-06f, -9.240414446e-05f, -2.037526479e-04f, -3.117415784e-04f, -3.853061542e-04f, -3.973471616e-04f, -3.343041262e-04f, -2.021350307e-04f, -2.615972566e-05f, +1.555811067e-04f, +3.033513931e-04f, +3.873351753e-04f, +3.958180458e-04f, +3.372420571e-04f, +2.357747169e-04f, +1.224002588e-04f, +2.499680603e-05f, -3.911476326e-05f, -6.597009251e-05f, -6.291611563e-05f, -4.332966631e-05f,\n    /*  1, 5 (24) */\n    +1.304653725e-03f, +3.080391384e-03f, +5.954006688e-03f, +1.010523242e-02f, +1.556555477e-02f, +2.217008362e-02f, +2.954043411e-02f, +3.710777704e-02f, +4.417681923e-02f, +5.002198837e-02f, +5.399890483e-02f, +5.564952111e-02f, +5.477949004e-02f, +5.149154900e-02f, +4.616783330e-02f, +3.940487969e-02f, +3.191501321e-02f, +2.441443664e-02f, +1.752014373e-02f, +1.167450479e-02f, +7.109062093e-03f, +3.849729871e-03f, +1.756616719e-03f, +5.852090350e-04f,\n    -4.056246185e-05f, -7.088291709e-05f, -1.085214336e-04f, -1.498433732e-04f, -1.893609687e-04f, -2.204860398e-04f, -2.366750198e-04f, -2.327446049e-04f, -2.060673215e-04f, -1.573575226e-04f, -9.083469754e-05f, -1.368668407e-05f, +6.508259574e-05f, +1.361894531e-04f, +1.916663450e-04f, +2.261784077e-04f, +2.377895090e-04f, +2.280388952e-04f, +2.013510827e-04f, +1.639507809e-04f, +1.225541865e-04f, +8.313553567e-05f, +5.002112110e-05f, +2.545961565e-05f,\n    -2.274245070e-03f, -4.339317380e-03f, -6.321534361e-03f, -7.203831272e-03f, -5.802807753e-03f, -1.149687559e-03f, +7.093970315e-03f, +1.834222013e-02f, +3.104922229e-02f, +4.298944578e-02f, +5.179742064e-02f, +5.560795086e-02f, +5.358834353e-02f, +4.618172239e-02f, +3.497715663e-02f, +2.225168955e-02f, +1.034118276e-02f, +1.048371023e-03f, -4.729965571e-03f, -7.065034830e-03f, -6.770766053e-03f, -5.008927316e-03f, -2.881938909e-03f, -1.147345840e-03f,\n    +5.789115407e-05f, +6.766233489e-05f, +5.134845990e-05f, -9.351764323e-07f, -8.917566987e-05f, -2.001681605e-04f, -3.087257329e-04f, -3.838233252e-04f, -3.980834092e-04f, -3.374048561e-04f, -2.071026027e-04f, -3.196123075e-05f, +1.502234199e-04f, +2.995845792e-04f, +3.858455924e-04f, +3.966597940e-04f, +3.398756389e-04f, +2.392888085e-04f, +1.258251183e-04f, +2.759288502e-05f, -3.768786388e-05f, -6.564371751e-05f, -6.333733508e-05f, -4.405082471e-05f,\n    /*  1, 6 (24) */\n    +1.264091264e-03f, +3.009508467e-03f, +5.845485255e-03f, +9.955389042e-03f, +1.537619380e-02f, +2.194959758e-02f, +2.930375909e-02f, +3.687503244e-02f, +4.397075191e-02f, +4.986463085e-02f, +5.390807013e-02f, +5.563583443e-02f, +5.484457264e-02f, +5.162773845e-02f, +4.635949965e-02f, +3.963105810e-02f, +3.215280272e-02f, +2.464247554e-02f, +1.772149481e-02f, +1.183845557e-02f, +7.231616279e-03f, +3.932865406e-03f, +1.806637840e-03f, +6.106686506e-04f,\n    -3.975495944e-05f, -6.981129264e-05f, -1.072652872e-04f, -1.485469791e-04f, -1.882175742e-04f, -2.197075250e-04f, -2.364521385e-04f, -2.332060983e-04f, -2.072473709e-04f, -1.591798037e-04f, -9.311787923e-05f, -1.617137348e-05f, +6.269051648e-05f, +1.341681007e-04f, +1.902305206e-04f, +2.254456640e-04f, +2.377663278e-04f, +2.286289191e-04f, +2.023822639e-04f, +1.652142386e-04f, +1.238454723e-04f, +8.428931461e-05f, +5.093272665e-05f, +2.609073586e-05f,\n    -2.216353916e-03f, -4.271655045e-03f, -6.270185901e-03f, -7.204766448e-03f, -5.891983423e-03f, -1.349855720e-03f, +6.785244582e-03f, +1.795839680e-02f, +3.065113888e-02f, +4.265204093e-02f, +5.159031804e-02f, +5.557598963e-02f, +5.373856695e-02f, +4.648130697e-02f, +3.536300222e-02f, +2.264834934e-02f, +1.068105840e-02f, +1.287659832e-03f, -4.604140453e-03f, -7.037441945e-03f, -6.808453917e-03f, -5.074571034e-03f, -2.945276244e-03f, -1.191396665e-03f,\n    +5.731723542e-05f, +6.768299327e-05f, +5.237133972e-05f, +1.275384025e-06f, -8.597044546e-05f, -1.965818092e-04f, -3.056769175e-04f, -3.822799655e-04f, -3.987448259e-04f, -3.404359360e-04f, -2.120252768e-04f, -3.775568092e-05f, +1.448328608e-04f, +2.957546163e-04f, +3.842806141e-04f, +3.974341794e-04f, +3.424658527e-04f, +2.427905823e-04f, +1.292657505e-04f, +3.022228446e-05f, -3.622354707e-05f, -6.528727571e-05f, -6.374197407e-05f, -4.476895583e-05f,\n    /*  1, 7 (24) */\n    +1.224336304e-03f, +2.939697175e-03f, +5.738219968e-03f, +9.806842063e-03f, +1.518797623e-02f, +2.172989006e-02f, +2.906730695e-02f, +3.664182634e-02f, +4.376350454e-02f, +4.970545104e-02f, +5.381495225e-02f, +5.561966305e-02f, +5.490726315e-02f, +5.176190655e-02f, +4.654973017e-02f, +3.985650376e-02f, +3.239056905e-02f, +2.487110446e-02f, +1.792387707e-02f, +1.200366981e-02f, +7.355461751e-03f, +4.017154721e-03f, +1.857570567e-03f, +6.367593865e-04f,\n    -3.895626544e-05f, -6.874706913e-05f, -1.060130363e-04f, -1.472491081e-04f, -1.870661925e-04f, -2.189145021e-04f, -2.362095255e-04f, -2.336451340e-04f, -2.084055364e-04f, -1.609842617e-04f, -9.539027583e-05f, -1.865416474e-05f, +6.029111978e-05f, +1.321314770e-04f, +1.887740547e-04f, +2.246902716e-04f, +2.377219491e-04f, +2.292020825e-04f, +2.034027372e-04f, +1.664736552e-04f, +1.251386658e-04f, +8.544932188e-05f, +5.185281596e-05f, +2.673058920e-05f,\n    -2.159036681e-03f, -4.203972052e-03f, -6.217814561e-03f, -7.203491064e-03f, -5.977953869e-03f, -1.546437529e-03f, +6.479567664e-03f, +1.757611683e-02f, +3.025239405e-02f, +4.231160499e-02f, +5.137829276e-02f, +5.553823395e-02f, +5.388339982e-02f, +4.677706159e-02f, +3.574728284e-02f, +2.304578352e-02f, +1.102352425e-02f, +1.530450414e-03f, -4.474874702e-03f, -7.007219660e-03f, -6.844677464e-03f, -5.139858309e-03f, -3.009018218e-03f, -1.236165621e-03f,\n    +5.673210536e-05f, +6.767826036e-05f, +5.335845485e-05f, +3.449521528e-06f, -8.278907995e-05f, -1.929945127e-04f, -3.025961045e-04f, -3.806767808e-04f, -3.993315822e-04f, -3.433968906e-04f, -2.169020328e-04f, -4.354179844e-05f, +1.394105874e-04f, +2.918622071e-04f, +3.826403100e-04f, +3.981406720e-04f, +3.450117886e-04f, +2.462790636e-04f, +1.327214084e-04f, +3.288465786e-05f, -3.472174628e-05f, -6.490041214e-05f, -6.412958061e-05f, -4.548368629e-05f,\n    /*  1, 8 (24) */\n    +1.185380039e-03f, +2.870950105e-03f, +5.632206931e-03f, +9.659592955e-03f, +1.500091003e-02f, +2.151097556e-02f, +2.883109742e-02f, +3.640818120e-02f, +4.355509900e-02f, +4.954446678e-02f, +5.371956198e-02f, +5.560100889e-02f, +5.496755427e-02f, +5.189403803e-02f, +4.673850422e-02f, +4.008119403e-02f, +3.262829100e-02f, +2.510030654e-02f, +1.812727981e-02f, +1.217014346e-02f, +7.480600417e-03f, +4.102604043e-03f, +1.909423383e-03f, +6.634899757e-04f,\n    -3.816639157e-05f, -6.769032218e-05f, -1.047648212e-04f, -1.459499503e-04f, -1.859070338e-04f, -2.181071619e-04f, -2.359473116e-04f, -2.340617500e-04f, -2.095417464e-04f, -1.627707202e-04f, -9.765163225e-05f, -2.113476669e-05f, +5.788468247e-05f, +1.300797972e-04f, +1.872970664e-04f, +2.239122397e-04f, +2.376562792e-04f, +2.297582162e-04f, +2.044122956e-04f, +1.677288274e-04f, +1.264336021e-04f, +8.661545276e-05f, +5.278135038e-05f, +2.737919445e-05f,\n    -2.102304575e-03f, -4.136293792e-03f, -6.164456106e-03f, -7.200041542e-03f, -6.060742949e-03f, -1.739432042e-03f, +6.176971560e-03f, +1.719544005e-02f, +2.985306247e-02f, +4.196820810e-02f, +5.116139073e-02f, +5.549469215e-02f, +5.402281040e-02f, +4.706892379e-02f, +3.612992315e-02f, +2.344392419e-02f, +1.136853604e-02f, +1.776729478e-03f, -4.342153294e-03f, -6.974335002e-03f, -6.879399210e-03f, -5.204758722e-03f, -3.073147798e-03f, -1.281649307e-03f,\n    +5.613620176e-05f, +6.764855447e-05f, +5.431000971e-05f, +5.587064814e-06f, -7.963216967e-05f, -1.894071836e-04f, -2.994842696e-04f, -3.790144899e-04f, -3.998438681e-04f, -3.462872642e-04f, -2.217318639e-04f, -4.931830803e-05f, +1.339577671e-04f, +2.879080727e-04f, +3.809247703e-04f, +3.987787580e-04f, +3.475125441e-04f, +2.497532750e-04f, +1.361913343e-04f, +3.557964519e-05f, -3.318240655e-05f, -6.448277808e-05f, -6.449970283e-05f, -4.619463825e-05f,\n    /*  1, 9 (24) */\n    +1.147213647e-03f, +2.803259783e-03f, +5.527442110e-03f, +9.513643005e-03f, +1.481500300e-02f, +2.129286839e-02f, +2.859515011e-02f, +3.617411945e-02f, +4.334555725e-02f, +4.938169606e-02f, +5.362191034e-02f, +5.557987412e-02f, +5.502543896e-02f, +5.202411782e-02f, +4.692580129e-02f, +4.030510627e-02f, +3.286594728e-02f, +2.533006476e-02f, +1.833169210e-02f, +1.233787229e-02f, +7.607034019e-03f, +4.189219495e-03f, +1.962204733e-03f, +6.908691701e-04f,\n    -3.738534770e-05f, -6.664112530e-05f, -1.035207805e-04f, -1.446496947e-04f, -1.847403082e-04f, -2.172856968e-04f, -2.356656303e-04f, -2.344559875e-04f, -2.106559329e-04f, -1.645390058e-04f, -9.990169528e-05f, -2.361288858e-05f, +5.547148255e-05f, +1.280132790e-04f, +1.857996784e-04f, +2.231115807e-04f, +2.375692277e-04f, +2.302971523e-04f, +2.054107328e-04f, +1.689795512e-04f, +1.277301149e-04f, +8.778760047e-05f, +5.371828929e-05f, +2.803656886e-05f,\n    -2.046168374e-03f, -4.068645237e-03f, -6.110146096e-03f, -7.194454478e-03f, -6.140375118e-03f, -1.928839225e-03f, +5.877487290e-03f, +1.681642556e-02f, +2.945321860e-02f, +4.162192084e-02f, +5.093965886e-02f, +5.544537384e-02f, +5.415676817e-02f, +4.735683186e-02f, +3.651084792e-02f, +2.384270295e-02f, +1.171604859e-02f, +2.026482753e-03f, -4.205961960e-03f, -6.938755357e-03f, -6.912581616e-03f, -5.269241500e-03f, -3.137647501e-03f, -1.327843946e-03f,\n    +5.552996031e-05f, +6.759429744e-05f, +5.522621826e-05f, +7.687855865e-06f, -7.650029847e-05f, -1.858207276e-04f, -2.963423910e-04f, -3.772938242e-04f, -4.002818927e-04f, -3.491066211e-04f, -2.265137770e-04f, -5.508393727e-05f, +1.284755764e-04f, +2.838929516e-04f, +3.791341056e-04f, +3.993479400e-04f, +3.499672243e-04f, +2.532122364e-04f, +1.396747604e-04f, +3.830687289e-05f, -3.160548461e-05f, -6.403403126e-05f, -6.485188912e-05f, -4.690142952e-05f,\n    /*  1,10 (24) */\n    +1.109828299e-03f, +2.736618658e-03f, +5.423921330e-03f, +9.368993310e-03f, +1.463026269e-02f, +2.107558270e-02f, +2.835948448e-02f, +3.593966347e-02f, +4.313490132e-02f, +4.921715706e-02f, +5.352200865e-02f, +5.555626123e-02f, +5.508091044e-02f, +5.215213110e-02f, +4.711160097e-02f, +4.052821785e-02f, +3.310351651e-02f, +2.556036191e-02f, +1.853710284e-02f, +1.250685184e-02f, +7.734764134e-03f, +4.277007096e-03f, +2.015923023e-03f, +7.189057390e-04f,\n    -3.661314192e-05f, -6.559954993e-05f, -1.022810507e-04f, -1.433485289e-04f, -1.835662257e-04f, -2.164503001e-04f, -2.353646174e-04f, -2.348278912e-04f, -2.117480312e-04f, -1.662889481e-04f, -1.021402136e-04f, -2.608824006e-05f, +5.305179922e-05f, +1.259321426e-04f, +1.842820166e-04f, +2.222883106e-04f, +2.374607067e-04f, +2.308187252e-04f, +2.063978428e-04f, +1.702256220e-04f, +1.290280359e-04f, +8.896565621e-05f, +5.466359004e-05f, +2.870272812e-05f,\n    -1.990638413e-03f, -4.001050940e-03f, -6.054919878e-03f, -7.186766622e-03f, -6.216875417e-03f, -2.114659953e-03f, +5.581144899e-03f, +1.643913174e-02f, +2.905293671e-02f, +4.127281421e-02f, +5.071314509e-02f, +5.539028991e-02f, +5.428524375e-02f, +4.764072482e-02f, +3.688998202e-02f, +2.424205089e-02f, +1.206601581e-02f, +2.279694989e-03f, -4.066287199e-03f, -6.900448484e-03f, -6.944187101e-03f, -5.333275531e-03f, -3.202499390e-03f, -1.374745375e-03f,\n    +5.491381433e-05f, +6.751591438e-05f, +5.610730378e-05f, +9.751749846e-06f, -7.339403759e-05f, -1.822360436e-04f, -2.931714495e-04f, -3.755155275e-04f, -4.006458844e-04f, -3.518545456e-04f, -2.312467930e-04f, -6.083741698e-05f, +1.229652003e-04f, +2.798176001e-04f, +3.772684468e-04f, +3.998477374e-04f, +3.523749422e-04f, +2.566549656e-04f, +1.431709084e-04f, +4.106595391e-05f, -2.999094905e-05f, -6.355383603e-05f, -6.518568834e-05f, -4.760367367e-05f,\n    /*  1,11 (24) */\n    +1.073215158e-03f, +2.671019108e-03f, +5.321640279e-03f, +9.225644781e-03f, +1.444669647e-02f, +2.085913240e-02f, +2.812411986e-02f, +3.570483557e-02f, +4.292315329e-02f, +4.905086811e-02f, +5.341986844e-02f, +5.553017299e-02f, +5.513396224e-02f, +5.227806324e-02f, +4.729588299e-02f, +4.075050616e-02f, +3.334097721e-02f, +2.579118063e-02f, +1.874350068e-02f, +1.267707746e-02f, +7.863792170e-03f, +4.365972752e-03f, +2.070586613e-03f, +7.476084671e-04f,\n    -3.584978049e-05f, -6.456566540e-05f, -1.010457663e-04f, -1.420466395e-04f, -1.823849963e-04f, -2.156011663e-04f, -2.350444110e-04f, -2.351775086e-04f, -2.128179804e-04f, -1.680203798e-04f, -1.043669379e-04f, -2.856053128e-05f, +5.062591276e-05f, +1.238366106e-04f, +1.827442103e-04f, +2.214424487e-04f, +2.373306314e-04f, +2.313227709e-04f, +2.073734206e-04f, +1.714668346e-04f, +1.303271956e-04f, +9.014950911e-05f, +5.561720797e-05f, +2.937768631e-05f,\n    -1.935724599e-03f, -3.933535025e-03f, -5.998812574e-03f, -7.177014872e-03f, -6.290269454e-03f, -2.296895997e-03f, +5.287973450e-03f, +1.606361621e-02f, +2.865229083e-02f, +4.092095967e-02f, +5.048189829e-02f, +5.532945249e-02f, +5.440820895e-02f, +4.792054242e-02f, +3.726725047e-02f, +2.464189863e-02f, +1.241839075e-02f, +2.536349955e-03f, -3.923116291e-03f, -6.859382530e-03f, -6.974178050e-03f, -5.396829367e-03f, -3.267685079e-03f, -1.422349049e-03f,\n    +5.428819468e-05f, +6.741383353e-05f, +5.695349877e-05f, +1.177861505e-05f, -7.031394560e-05f, -1.786540232e-04f, -2.899724281e-04f, -3.736803560e-04f, -4.009360908e-04f, -3.545306419e-04f, -2.359299473e-04f, -6.657748159e-05f, +1.174278323e-04f, +2.756827919e-04f, +3.753279455e-04f, +4.002776863e-04f, +3.547348191e-04f, +2.600804786e-04f, +1.466789902e-04f, +4.385648766e-05f, -2.833878040e-05f, -6.304186356e-05f, -6.550064997e-05f, -4.830098012e-05f,\n    /*  1,12 (24) */\n    +1.037365377e-03f, +2.606453443e-03f, +5.220594513e-03f, +9.083598142e-03f, +1.426431147e-02f, +2.064353123e-02f, +2.788907545e-02f, +3.546965807e-02f, +4.271033531e-02f, +4.888284773e-02f, +5.331550150e-02f, +5.550161246e-02f, +5.518458815e-02f, +5.240189986e-02f, +4.747862720e-02f, +4.097194861e-02f, +3.357830785e-02f, +2.602250340e-02f, +1.895087410e-02f, +1.284854430e-02f, +7.994119366e-03f, +4.456122261e-03f, +2.126203821e-03f, +7.769861534e-04f,\n    -3.509526789e-05f, -6.353953899e-05f, -9.981506022e-05f, -1.407442116e-04f, -1.811968298e-04f, -2.147384913e-04f, -2.347051515e-04f, -2.355048907e-04f, -2.138657227e-04f, -1.697331367e-04f, -1.065816209e-04f, -3.102947289e-05f, +4.819410453e-05f, +1.217269082e-04f, +1.811863919e-04f, +2.205740179e-04f, +2.371789201e-04f, +2.318091276e-04f, +2.083372615e-04f, +1.727029831e-04f, +1.316274228e-04f, +9.133904628e-05f, +5.657909639e-05f, +3.006145594e-05f,\n    -1.881436404e-03f, -3.866121192e-03f, -5.941859076e-03f, -7.165236257e-03f, -6.360583400e-03f, -2.475550020e-03f, +4.998001022e-03f, +1.568993586e-02f, +2.825135474e-02f, +4.056642903e-02f, +5.024596835e-02f, +5.526287501e-02f, +5.452563678e-02f, +4.819622521e-02f, +3.764257842e-02f, +2.504217631e-02f, +1.277312557e-02f, +2.796430433e-03f, -3.776437301e-03f, -6.815526043e-03f, -7.002516830e-03f, -5.459871231e-03f, -3.333185729e-03f, -1.470650029e-03f,\n    +5.365352956e-05f, +6.728848602e-05f, +5.776504473e-05f, +1.376833283e-05f, -6.726056827e-05f, -1.750755508e-04f, -2.867463115e-04f, -3.717890774e-04f, -4.011527782e-04f, -3.571345343e-04f, -2.405622897e-04f, -7.230286952e-05f, +1.118646739e-04f, +2.714893178e-04f, +3.733127737e-04f, +4.006373398e-04f, +3.570459849e-04f, +2.634877895e-04f, +1.501982080e-04f, +4.667806016e-05f, -2.664897123e-05f, -6.249779202e-05f, -6.579632434e-05f, -4.899295427e-05f,\n    /*  1,13 (24) */\n    +1.002270109e-03f, +2.542913904e-03f, +5.120779452e-03f, +8.942853930e-03f, +1.408311464e-02f, +2.042879274e-02f, +2.765437030e-02f, +3.523415318e-02f, +4.249646959e-02f, +4.871311459e-02f, +5.320891988e-02f, +5.547058299e-02f, +5.523278225e-02f, +5.252362676e-02f, +4.765981359e-02f, +4.119252263e-02f, +3.381548677e-02f, +2.625431253e-02f, +1.915921136e-02f, +1.302124728e-02f, +8.125746789e-03f, +4.547461308e-03f, +2.182782917e-03f, +8.070476094e-04f,\n    -3.434960685e-05f, -6.252123589e-05f, -9.858906309e-05f, -1.394414293e-04f, -1.800019355e-04f, -2.138624717e-04f, -2.343469818e-04f, -2.358100918e-04f, -2.148912040e-04f, -1.714270575e-04f, -1.087840172e-04f, -3.349477614e-05f, +4.575665691e-05f, +1.196032629e-04f, +1.796086972e-04f, +2.196830446e-04f, +2.370054938e-04f, +2.322776351e-04f, +2.092891617e-04f, +1.739338611e-04f, +1.329285447e-04f, +9.253415281e-05f, +5.754920659e-05f, +3.075404787e-05f,\n    -1.827782875e-03f, -3.798832706e-03f, -5.884094031e-03f, -7.151467924e-03f, -6.427843968e-03f, -2.650625571e-03f, +4.711254710e-03f, +1.531814678e-02f, +2.785020196e-02f, +4.020929449e-02f, +5.000540606e-02f, +5.519057214e-02f, +5.463750145e-02f, +4.846771453e-02f, +3.801589119e-02f, +2.544281365e-02f, +1.313017156e-02f, +3.059918223e-03f, -3.626239093e-03f, -6.768847983e-03f, -7.029165802e-03f, -5.522369023e-03f, -3.398982053e-03f, -1.519642983e-03f,\n    +5.301024443e-05f, +6.714030571e-05f, +5.854219200e-05f, +1.572079753e-05f, -6.423443851e-05f, -1.715015031e-04f, -2.834940860e-04f, -3.698424711e-04f, -4.012962317e-04f, -3.596658675e-04f, -2.451428848e-04f, -7.801232354e-05f, +1.062769342e-04f, +2.672379855e-04f, +3.712231236e-04f, +4.009262684e-04f, +3.593075781e-04f, +2.668759114e-04f, +1.537277542e-04f, +4.953024396e-05f, -2.492152632e-05f, -6.192130682e-05f, -6.607226275e-05f, -4.967919760e-05f,\n    /*  1,14 (24) */\n    +9.679205023e-04f, +2.480392668e-03f, +5.022190389e-03f, +8.803412501e-03f, +1.390311270e-02f, +2.021493027e-02f, +2.742002332e-02f, +3.499834308e-02f, +4.228157838e-02f, +4.854168753e-02f, +5.310013586e-02f, +5.543708821e-02f, +5.527853891e-02f, +5.264323003e-02f, +4.783942229e-02f, +4.141220567e-02f, +3.405249226e-02f, +2.648659017e-02f, +1.936850052e-02f, +1.319518114e-02f, +8.258675333e-03f, +4.639995460e-03f, +2.240332124e-03f, +8.378016572e-04f,\n    -3.361279831e-05f, -6.151081921e-05f, -9.736790378e-05f, -1.381384751e-04f, -1.788005228e-04f, -2.129733054e-04f, -2.339700470e-04f, -2.360931689e-04f, -2.158943737e-04f, -1.731019841e-04f, -1.109738837e-04f, -3.595615288e-05f, +4.331385324e-05f, +1.174659045e-04f, +1.780112652e-04f, +2.187695585e-04f, +2.368102768e-04f, +2.327281357e-04f, +2.102289181e-04f, +1.751592616e-04f, +1.342303873e-04f, +9.373471177e-05f, +5.852748780e-05f, +3.145547134e-05f,\n    -1.774772630e-03f, -3.731692400e-03f, -5.825551839e-03f, -7.135747127e-03f, -6.492078407e-03f, -2.822127074e-03f, +4.427760624e-03f, +1.494830431e-02f, +2.744890573e-02f, +3.984962863e-02f, +4.976026317e-02f, +5.511255982e-02f, +5.474377839e-02f, +4.873495251e-02f, +3.838711431e-02f, +2.584373992e-02f, +1.348947914e-02f, +3.326794134e-03f, -3.472511338e-03f, -6.719317739e-03f, -7.054087328e-03f, -5.584290329e-03f, -3.465054316e-03f, -1.569322181e-03f,\n    +5.235876180e-05f, +6.696972897e-05f, +5.928519960e-05f, +1.763591641e-05f, -6.123607625e-05f, -1.679327488e-04f, -2.802167391e-04f, -3.678413279e-04f, -4.013667552e-04f, -3.621243063e-04f, -2.496708124e-04f, -8.370459117e-05f, +1.006658295e-04f, +2.629296196e-04f, +3.690592083e-04f, +4.011440598e-04f, +3.615187468e-04f, +2.702438562e-04f, +1.572668119e-04f, +5.241259825e-05f, -2.315646270e-05f, -6.131210073e-05f, -6.632801773e-05f, -5.035930779e-05f,\n    /*  1,15 (24) */\n    +9.343077040e-04f, +2.418881849e-03f, +4.924822486e-03f, +8.665274026e-03f, +1.372431218e-02f, +2.000195696e-02f, +2.718605327e-02f, +3.476224991e-02f, +4.206568401e-02f, +4.836858555e-02f, +5.298916198e-02f, +5.540113206e-02f, +5.532185276e-02f, +5.276069593e-02f, +4.801743355e-02f, +4.163097523e-02f, +3.428930254e-02f, +2.671931830e-02f, +1.957872944e-02f, +1.337034040e-02f, +8.392905721e-03f, +4.733730172e-03f, +2.298859611e-03f, +8.692571286e-04f,\n    -3.288484150e-05f, -6.050835000e-05f, -9.615170919e-05f, -1.368355303e-04f, -1.775928005e-04f, -2.120711910e-04f, -2.335744944e-04f, -2.363541826e-04f, -2.168751846e-04f, -1.747577616e-04f, -1.131509793e-04f, -3.841331568e-05f, +4.086597778e-05f, +1.153150651e-04f, +1.763942382e-04f, +2.178335929e-04f, +2.365931963e-04f, +2.331604734e-04f, +2.111563284e-04f, +1.763789774e-04f, +1.355327749e-04f, +9.494060420e-05f, +5.951388722e-05f, +3.216573391e-05f,\n    -1.722413869e-03f, -3.664722671e-03f, -5.766266639e-03f, -7.118111210e-03f, -6.553314483e-03f, -2.990059823e-03f, +4.147543885e-03f, +1.458046298e-02f, +2.704753897e-02f, +3.948750432e-02f, +4.951059236e-02f, +5.502885522e-02f, +5.484444422e-02f, +4.899788213e-02f, +3.875617352e-02f, +2.624488398e-02f, +1.385099788e-02f, +3.597037991e-03f, -3.315244526e-03f, -6.666905140e-03f, -7.077243791e-03f, -5.645602430e-03f, -3.531382333e-03f, -1.619681489e-03f,\n    +5.169950117e-05f, +6.677719450e-05f, +5.999433503e-05f, +1.951360955e-05f, -5.826598844e-05f, -1.643701487e-04f, -2.769152592e-04f, -3.657864495e-04f, -4.013646710e-04f, -3.645095356e-04f, -2.541451677e-04f, -8.937842500e-05f, +9.503258313e-05f, +2.585650612e-04f, +3.668212610e-04f, +4.012903196e-04f, +3.636786482e-04f, +2.735906352e-04f, +1.608145551e-04f, +5.532466888e-05f, -2.135380981e-05f, -6.066987409e-05f, -6.656314316e-05f, -5.103287883e-05f,\n    /*  1,16 (24) */\n    +9.014228625e-04f, +2.358373499e-03f, +4.828670776e-03f, +8.528438495e-03f, +1.354671938e-02f, +1.978988577e-02f, +2.695247878e-02f, +3.452589573e-02f, +4.184880882e-02f, +4.819382779e-02f, +5.287601100e-02f, +5.536271874e-02f, +5.536271874e-02f, +5.287601100e-02f, +4.819382779e-02f, +4.184880882e-02f, +3.452589573e-02f, +2.695247878e-02f, +1.978988577e-02f, +1.354671938e-02f, +8.528438495e-03f, +4.828670776e-03f, +2.358373499e-03f, +9.014228625e-04f,\n    -3.216573391e-05f, -5.951388722e-05f, -9.494060420e-05f, -1.355327749e-04f, -1.763789774e-04f, -2.111563284e-04f, -2.331604734e-04f, -2.365931963e-04f, -2.178335929e-04f, -1.763942382e-04f, -1.153150651e-04f, -4.086597778e-05f, +3.841331568e-05f, +1.131509793e-04f, +1.747577616e-04f, +2.168751846e-04f, +2.363541826e-04f, +2.335744944e-04f, +2.120711910e-04f, +1.775928005e-04f, +1.368355303e-04f, +9.615170919e-05f, +6.050835000e-05f, +3.288484150e-05f,\n    -1.670714367e-03f, -3.597945477e-03f, -5.706272304e-03f, -7.098597601e-03f, -6.611580471e-03f, -3.154429971e-03f, +3.870628626e-03f, +1.421467653e-02f, +2.664617430e-02f, +3.912299478e-02f, +4.925644719e-02f, +5.493947680e-02f, +5.493947680e-02f, +4.925644719e-02f, +3.912299478e-02f, +2.664617430e-02f, +1.421467653e-02f, +3.870628626e-03f, -3.154429971e-03f, -6.611580471e-03f, -7.098597601e-03f, -5.706272304e-03f, -3.597945477e-03f, -1.670714367e-03f,\n    +5.103287883e-05f, +6.656314316e-05f, +6.066987409e-05f, +2.135380981e-05f, -5.532466888e-05f, -1.608145551e-04f, -2.735906352e-04f, -3.636786482e-04f, -4.012903196e-04f, -3.668212610e-04f, -2.585650612e-04f, -9.503258313e-05f, +8.937842500e-05f, +2.541451677e-04f, +3.645095356e-04f, +4.013646710e-04f, +3.657864495e-04f, +2.769152592e-04f, +1.643701487e-04f, +5.826598844e-05f, -1.951360955e-05f, -5.999433503e-05f, -6.677719450e-05f, -5.169950117e-05f,\n    /*  1,17 (24) */\n    +8.692571286e-04f, +2.298859611e-03f, +4.733730172e-03f, +8.392905721e-03f, +1.337034040e-02f, +1.957872944e-02f, +2.671931830e-02f, +3.428930254e-02f, +4.163097523e-02f, +4.801743355e-02f, +5.276069593e-02f, +5.532185276e-02f, +5.540113206e-02f, +5.298916198e-02f, +4.836858555e-02f, +4.206568401e-02f, +3.476224991e-02f, +2.718605327e-02f, +2.000195696e-02f, +1.372431218e-02f, +8.665274026e-03f, +4.924822486e-03f, +2.418881849e-03f, +9.343077040e-04f,\n    -3.145547134e-05f, -5.852748780e-05f, -9.373471177e-05f, -1.342303873e-04f, -1.751592616e-04f, -2.102289181e-04f, -2.327281357e-04f, -2.368102768e-04f, -2.187695585e-04f, -1.780112652e-04f, -1.174659045e-04f, -4.331385324e-05f, +3.595615288e-05f, +1.109738837e-04f, +1.731019841e-04f, +2.158943737e-04f, +2.360931689e-04f, +2.339700470e-04f, +2.129733054e-04f, +1.788005228e-04f, +1.381384751e-04f, +9.736790378e-05f, +6.151081921e-05f, +3.361279831e-05f,\n    -1.619681489e-03f, -3.531382333e-03f, -5.645602430e-03f, -7.077243791e-03f, -6.666905140e-03f, -3.315244526e-03f, +3.597037991e-03f, +1.385099788e-02f, +2.624488398e-02f, +3.875617352e-02f, +4.899788213e-02f, +5.484444422e-02f, +5.502885522e-02f, +4.951059236e-02f, +3.948750432e-02f, +2.704753897e-02f, +1.458046298e-02f, +4.147543885e-03f, -2.990059823e-03f, -6.553314483e-03f, -7.118111210e-03f, -5.766266639e-03f, -3.664722671e-03f, -1.722413869e-03f,\n    +5.035930779e-05f, +6.632801773e-05f, +6.131210073e-05f, +2.315646270e-05f, -5.241259825e-05f, -1.572668119e-04f, -2.702438562e-04f, -3.615187468e-04f, -4.011440598e-04f, -3.690592083e-04f, -2.629296196e-04f, -1.006658295e-04f, +8.370459117e-05f, +2.496708124e-04f, +3.621243063e-04f, +4.013667552e-04f, +3.678413279e-04f, +2.802167391e-04f, +1.679327488e-04f, +6.123607625e-05f, -1.763591641e-05f, -5.928519960e-05f, -6.696972897e-05f, -5.235876180e-05f,\n    /*  1,18 (24) */\n    +8.378016572e-04f, +2.240332124e-03f, +4.639995460e-03f, +8.258675333e-03f, +1.319518114e-02f, +1.936850052e-02f, +2.648659017e-02f, +3.405249226e-02f, +4.141220567e-02f, +4.783942229e-02f, +5.264323003e-02f, +5.527853891e-02f, +5.543708821e-02f, +5.310013586e-02f, +4.854168753e-02f, +4.228157838e-02f, +3.499834308e-02f, +2.742002332e-02f, +2.021493027e-02f, +1.390311270e-02f, +8.803412501e-03f, +5.022190389e-03f, +2.480392668e-03f, +9.679205023e-04f,\n    -3.075404787e-05f, -5.754920659e-05f, -9.253415281e-05f, -1.329285447e-04f, -1.739338611e-04f, -2.092891617e-04f, -2.322776351e-04f, -2.370054938e-04f, -2.196830446e-04f, -1.796086972e-04f, -1.196032629e-04f, -4.575665691e-05f, +3.349477614e-05f, +1.087840172e-04f, +1.714270575e-04f, +2.148912040e-04f, +2.358100918e-04f, +2.343469818e-04f, +2.138624717e-04f, +1.800019355e-04f, +1.394414293e-04f, +9.858906309e-05f, +6.252123589e-05f, +3.434960685e-05f,\n    -1.569322181e-03f, -3.465054316e-03f, -5.584290329e-03f, -7.054087328e-03f, -6.719317739e-03f, -3.472511338e-03f, +3.326794134e-03f, +1.348947914e-02f, +2.584373992e-02f, +3.838711431e-02f, +4.873495251e-02f, +5.474377839e-02f, +5.511255982e-02f, +4.976026317e-02f, +3.984962863e-02f, +2.744890573e-02f, +1.494830431e-02f, +4.427760624e-03f, -2.822127074e-03f, -6.492078407e-03f, -7.135747127e-03f, -5.825551839e-03f, -3.731692400e-03f, -1.774772630e-03f,\n    +4.967919760e-05f, +6.607226275e-05f, +6.192130682e-05f, +2.492152632e-05f, -4.953024396e-05f, -1.537277542e-04f, -2.668759114e-04f, -3.593075781e-04f, -4.009262684e-04f, -3.712231236e-04f, -2.672379855e-04f, -1.062769342e-04f, +7.801232354e-05f, +2.451428848e-04f, +3.596658675e-04f, +4.012962317e-04f, +3.698424711e-04f, +2.834940860e-04f, +1.715015031e-04f, +6.423443851e-05f, -1.572079753e-05f, -5.854219200e-05f, -6.714030571e-05f, -5.301024443e-05f,\n    /*  1,19 (24) */\n    +8.070476094e-04f, +2.182782917e-03f, +4.547461308e-03f, +8.125746789e-03f, +1.302124728e-02f, +1.915921136e-02f, +2.625431253e-02f, +3.381548677e-02f, +4.119252263e-02f, +4.765981359e-02f, +5.252362676e-02f, +5.523278225e-02f, +5.547058299e-02f, +5.320891988e-02f, +4.871311459e-02f, +4.249646959e-02f, +3.523415318e-02f, +2.765437030e-02f, +2.042879274e-02f, +1.408311464e-02f, +8.942853930e-03f, +5.120779452e-03f, +2.542913904e-03f, +1.002270109e-03f,\n    -3.006145594e-05f, -5.657909639e-05f, -9.133904628e-05f, -1.316274228e-04f, -1.727029831e-04f, -2.083372615e-04f, -2.318091276e-04f, -2.371789201e-04f, -2.205740179e-04f, -1.811863919e-04f, -1.217269082e-04f, -4.819410453e-05f, +3.102947289e-05f, +1.065816209e-04f, +1.697331367e-04f, +2.138657227e-04f, +2.355048907e-04f, +2.347051515e-04f, +2.147384913e-04f, +1.811968298e-04f, +1.407442116e-04f, +9.981506022e-05f, +6.353953899e-05f, +3.509526789e-05f,\n    -1.519642983e-03f, -3.398982053e-03f, -5.522369023e-03f, -7.029165802e-03f, -6.768847983e-03f, -3.626239093e-03f, +3.059918223e-03f, +1.313017156e-02f, +2.544281365e-02f, +3.801589119e-02f, +4.846771453e-02f, +5.463750145e-02f, +5.519057214e-02f, +5.000540606e-02f, +4.020929449e-02f, +2.785020196e-02f, +1.531814678e-02f, +4.711254710e-03f, -2.650625571e-03f, -6.427843968e-03f, -7.151467924e-03f, -5.884094031e-03f, -3.798832706e-03f, -1.827782875e-03f,\n    +4.899295427e-05f, +6.579632434e-05f, +6.249779202e-05f, +2.664897123e-05f, -4.667806016e-05f, -1.501982080e-04f, -2.634877895e-04f, -3.570459849e-04f, -4.006373398e-04f, -3.733127737e-04f, -2.714893178e-04f, -1.118646739e-04f, +7.230286952e-05f, +2.405622897e-04f, +3.571345343e-04f, +4.011527782e-04f, +3.717890774e-04f, +2.867463115e-04f, +1.750755508e-04f, +6.726056827e-05f, -1.376833283e-05f, -5.776504473e-05f, -6.728848602e-05f, -5.365352956e-05f,\n    /*  1,20 (24) */\n    +7.769861534e-04f, +2.126203821e-03f, +4.456122261e-03f, +7.994119366e-03f, +1.284854430e-02f, +1.895087410e-02f, +2.602250340e-02f, +3.357830785e-02f, +4.097194861e-02f, +4.747862720e-02f, +5.240189986e-02f, +5.518458815e-02f, +5.550161246e-02f, +5.331550150e-02f, +4.888284773e-02f, +4.271033531e-02f, +3.546965807e-02f, +2.788907545e-02f, +2.064353123e-02f, +1.426431147e-02f, +9.083598142e-03f, +5.220594513e-03f, +2.606453443e-03f, +1.037365377e-03f,\n    -2.937768631e-05f, -5.561720797e-05f, -9.014950911e-05f, -1.303271956e-04f, -1.714668346e-04f, -2.073734206e-04f, -2.313227709e-04f, -2.373306314e-04f, -2.214424487e-04f, -1.827442103e-04f, -1.238366106e-04f, -5.062591276e-05f, +2.856053128e-05f, +1.043669379e-04f, +1.680203798e-04f, +2.128179804e-04f, +2.351775086e-04f, +2.350444110e-04f, +2.156011663e-04f, +1.823849963e-04f, +1.420466395e-04f, +1.010457663e-04f, +6.456566540e-05f, +3.584978049e-05f,\n    -1.470650029e-03f, -3.333185729e-03f, -5.459871231e-03f, -7.002516830e-03f, -6.815526043e-03f, -3.776437301e-03f, +2.796430433e-03f, +1.277312557e-02f, +2.504217631e-02f, +3.764257842e-02f, +4.819622521e-02f, +5.452563678e-02f, +5.526287501e-02f, +5.024596835e-02f, +4.056642903e-02f, +2.825135474e-02f, +1.568993586e-02f, +4.998001022e-03f, -2.475550020e-03f, -6.360583400e-03f, -7.165236257e-03f, -5.941859076e-03f, -3.866121192e-03f, -1.881436404e-03f,\n    +4.830098012e-05f, +6.550064997e-05f, +6.304186356e-05f, +2.833878040e-05f, -4.385648766e-05f, -1.466789902e-04f, -2.600804786e-04f, -3.547348191e-04f, -4.002776863e-04f, -3.753279455e-04f, -2.756827919e-04f, -1.174278323e-04f, +6.657748159e-05f, +2.359299473e-04f, +3.545306419e-04f, +4.009360908e-04f, +3.736803560e-04f, +2.899724281e-04f, +1.786540232e-04f, +7.031394560e-05f, -1.177861505e-05f, -5.695349877e-05f, -6.741383353e-05f, -5.428819468e-05f,\n    /*  1,21 (24) */\n    +7.476084671e-04f, +2.070586613e-03f, +4.365972752e-03f, +7.863792170e-03f, +1.267707746e-02f, +1.874350068e-02f, +2.579118063e-02f, +3.334097721e-02f, +4.075050616e-02f, +4.729588299e-02f, +5.227806324e-02f, +5.513396224e-02f, +5.553017299e-02f, +5.341986844e-02f, +4.905086811e-02f, +4.292315329e-02f, +3.570483557e-02f, +2.812411986e-02f, +2.085913240e-02f, +1.444669647e-02f, +9.225644781e-03f, +5.321640279e-03f, +2.671019108e-03f, +1.073215158e-03f,\n    -2.870272812e-05f, -5.466359004e-05f, -8.896565621e-05f, -1.290280359e-04f, -1.702256220e-04f, -2.063978428e-04f, -2.308187252e-04f, -2.374607067e-04f, -2.222883106e-04f, -1.842820166e-04f, -1.259321426e-04f, -5.305179922e-05f, +2.608824006e-05f, +1.021402136e-04f, +1.662889481e-04f, +2.117480312e-04f, +2.348278912e-04f, +2.353646174e-04f, +2.164503001e-04f, +1.835662257e-04f, +1.433485289e-04f, +1.022810507e-04f, +6.559954993e-05f, +3.661314192e-05f,\n    -1.422349049e-03f, -3.267685079e-03f, -5.396829367e-03f, -6.974178050e-03f, -6.859382530e-03f, -3.923116291e-03f, +2.536349955e-03f, +1.241839075e-02f, +2.464189863e-02f, +3.726725047e-02f, +4.792054242e-02f, +5.440820895e-02f, +5.532945249e-02f, +5.048189829e-02f, +4.092095967e-02f, +2.865229083e-02f, +1.606361621e-02f, +5.287973450e-03f, -2.296895997e-03f, -6.290269454e-03f, -7.177014872e-03f, -5.998812574e-03f, -3.933535025e-03f, -1.935724599e-03f,\n    +4.760367367e-05f, +6.518568834e-05f, +6.355383603e-05f, +2.999094905e-05f, -4.106595391e-05f, -1.431709084e-04f, -2.566549656e-04f, -3.523749422e-04f, -3.998477374e-04f, -3.772684468e-04f, -2.798176001e-04f, -1.229652003e-04f, +6.083741698e-05f, +2.312467930e-04f, +3.518545456e-04f, +4.006458844e-04f, +3.755155275e-04f, +2.931714495e-04f, +1.822360436e-04f, +7.339403759e-05f, -9.751749846e-06f, -5.610730378e-05f, -6.751591438e-05f, -5.491381433e-05f,\n    /*  1,22 (24) */\n    +7.189057390e-04f, +2.015923023e-03f, +4.277007096e-03f, +7.734764134e-03f, +1.250685184e-02f, +1.853710284e-02f, +2.556036191e-02f, +3.310351651e-02f, +4.052821785e-02f, +4.711160097e-02f, +5.215213110e-02f, +5.508091044e-02f, +5.555626123e-02f, +5.352200865e-02f, +4.921715706e-02f, +4.313490132e-02f, +3.593966347e-02f, +2.835948448e-02f, +2.107558270e-02f, +1.463026269e-02f, +9.368993310e-03f, +5.423921330e-03f, +2.736618658e-03f, +1.109828299e-03f,\n    -2.803656886e-05f, -5.371828929e-05f, -8.778760047e-05f, -1.277301149e-04f, -1.689795512e-04f, -2.054107328e-04f, -2.302971523e-04f, -2.375692277e-04f, -2.231115807e-04f, -1.857996784e-04f, -1.280132790e-04f, -5.547148255e-05f, +2.361288858e-05f, +9.990169528e-05f, +1.645390058e-04f, +2.106559329e-04f, +2.344559875e-04f, +2.356656303e-04f, +2.172856968e-04f, +1.847403082e-04f, +1.446496947e-04f, +1.035207805e-04f, +6.664112530e-05f, +3.738534770e-05f,\n    -1.374745375e-03f, -3.202499390e-03f, -5.333275531e-03f, -6.944187101e-03f, -6.900448484e-03f, -4.066287199e-03f, +2.279694989e-03f, +1.206601581e-02f, +2.424205089e-02f, +3.688998202e-02f, +4.764072482e-02f, +5.428524375e-02f, +5.539028991e-02f, +5.071314509e-02f, +4.127281421e-02f, +2.905293671e-02f, +1.643913174e-02f, +5.581144899e-03f, -2.114659953e-03f, -6.216875417e-03f, -7.186766622e-03f, -6.054919878e-03f, -4.001050940e-03f, -1.990638413e-03f,\n    +4.690142952e-05f, +6.485188912e-05f, +6.403403126e-05f, +3.160548461e-05f, -3.830687289e-05f, -1.396747604e-04f, -2.532122364e-04f, -3.499672243e-04f, -3.993479400e-04f, -3.791341056e-04f, -2.838929516e-04f, -1.284755764e-04f, +5.508393727e-05f, +2.265137770e-04f, +3.491066211e-04f, +4.002818927e-04f, +3.772938242e-04f, +2.963423910e-04f, +1.858207276e-04f, +7.650029847e-05f, -7.687855865e-06f, -5.522621826e-05f, -6.759429744e-05f, -5.552996031e-05f,\n    /*  1,23 (24) */\n    +6.908691701e-04f, +1.962204733e-03f, +4.189219495e-03f, +7.607034019e-03f, +1.233787229e-02f, +1.833169210e-02f, +2.533006476e-02f, +3.286594728e-02f, +4.030510627e-02f, +4.692580129e-02f, +5.202411782e-02f, +5.502543896e-02f, +5.557987412e-02f, +5.362191034e-02f, +4.938169606e-02f, +4.334555725e-02f, +3.617411945e-02f, +2.859515011e-02f, +2.129286839e-02f, +1.481500300e-02f, +9.513643005e-03f, +5.527442110e-03f, +2.803259783e-03f, +1.147213647e-03f,\n    -2.737919445e-05f, -5.278135038e-05f, -8.661545276e-05f, -1.264336021e-04f, -1.677288274e-04f, -2.044122956e-04f, -2.297582162e-04f, -2.376562792e-04f, -2.239122397e-04f, -1.872970664e-04f, -1.300797972e-04f, -5.788468247e-05f, +2.113476669e-05f, +9.765163225e-05f, +1.627707202e-04f, +2.095417464e-04f, +2.340617500e-04f, +2.359473116e-04f, +2.181071619e-04f, +1.859070338e-04f, +1.459499503e-04f, +1.047648212e-04f, +6.769032218e-05f, +3.816639157e-05f,\n    -1.327843946e-03f, -3.137647501e-03f, -5.269241500e-03f, -6.912581616e-03f, -6.938755357e-03f, -4.205961960e-03f, +2.026482753e-03f, +1.171604859e-02f, +2.384270295e-02f, +3.651084792e-02f, +4.735683186e-02f, +5.415676817e-02f, +5.544537384e-02f, +5.093965886e-02f, +4.162192084e-02f, +2.945321860e-02f, +1.681642556e-02f, +5.877487290e-03f, -1.928839225e-03f, -6.140375118e-03f, -7.194454478e-03f, -6.110146096e-03f, -4.068645237e-03f, -2.046168374e-03f,\n    +4.619463825e-05f, +6.449970283e-05f, +6.448277808e-05f, +3.318240655e-05f, -3.557964519e-05f, -1.361913343e-04f, -2.497532750e-04f, -3.475125441e-04f, -3.987787580e-04f, -3.809247703e-04f, -2.879080727e-04f, -1.339577671e-04f, +4.931830803e-05f, +2.217318639e-04f, +3.462872642e-04f, +3.998438681e-04f, +3.790144899e-04f, +2.994842696e-04f, +1.894071836e-04f, +7.963216967e-05f, -5.587064814e-06f, -5.431000971e-05f, -6.764855447e-05f, -5.613620176e-05f,\n    /*  1,24 (24) */\n    +6.634899757e-04f, +1.909423383e-03f, +4.102604043e-03f, +7.480600417e-03f, +1.217014346e-02f, +1.812727981e-02f, +2.510030654e-02f, +3.262829100e-02f, +4.008119403e-02f, +4.673850422e-02f, +5.189403803e-02f, +5.496755427e-02f, +5.560100889e-02f, +5.371956198e-02f, +4.954446678e-02f, +4.355509900e-02f, +3.640818120e-02f, +2.883109742e-02f, +2.151097556e-02f, +1.500091003e-02f, +9.659592955e-03f, +5.632206931e-03f, +2.870950105e-03f, +1.185380039e-03f,\n    -2.673058920e-05f, -5.185281596e-05f, -8.544932188e-05f, -1.251386658e-04f, -1.664736552e-04f, -2.034027372e-04f, -2.292020825e-04f, -2.377219491e-04f, -2.246902716e-04f, -1.887740547e-04f, -1.321314770e-04f, -6.029111978e-05f, +1.865416474e-05f, +9.539027583e-05f, +1.609842617e-04f, +2.084055364e-04f, +2.336451340e-04f, +2.362095255e-04f, +2.189145021e-04f, +1.870661925e-04f, +1.472491081e-04f, +1.060130363e-04f, +6.874706913e-05f, +3.895626544e-05f,\n    -1.281649307e-03f, -3.073147798e-03f, -5.204758722e-03f, -6.879399210e-03f, -6.974335002e-03f, -4.342153294e-03f, +1.776729478e-03f, +1.136853604e-02f, +2.344392419e-02f, +3.612992315e-02f, +4.706892379e-02f, +5.402281040e-02f, +5.549469215e-02f, +5.116139073e-02f, +4.196820810e-02f, +2.985306247e-02f, +1.719544005e-02f, +6.176971560e-03f, -1.739432042e-03f, -6.060742949e-03f, -7.200041542e-03f, -6.164456106e-03f, -4.136293792e-03f, -2.102304575e-03f,\n    +4.548368629e-05f, +6.412958061e-05f, +6.490041214e-05f, +3.472174628e-05f, -3.288465786e-05f, -1.327214084e-04f, -2.462790636e-04f, -3.450117886e-04f, -3.981406720e-04f, -3.826403100e-04f, -2.918622071e-04f, -1.394105874e-04f, +4.354179844e-05f, +2.169020328e-04f, +3.433968906e-04f, +3.993315822e-04f, +3.806767808e-04f, +3.025961045e-04f, +1.929945127e-04f, +8.278907995e-05f, -3.449521528e-06f, -5.335845485e-05f, -6.767826036e-05f, -5.673210536e-05f,\n    /*  1,25 (24) */\n    +6.367593865e-04f, +1.857570567e-03f, +4.017154721e-03f, +7.355461751e-03f, +1.200366981e-02f, +1.792387707e-02f, +2.487110446e-02f, +3.239056905e-02f, +3.985650376e-02f, +4.654973017e-02f, +5.176190655e-02f, +5.490726315e-02f, +5.561966305e-02f, +5.381495225e-02f, +4.970545104e-02f, +4.376350454e-02f, +3.664182634e-02f, +2.906730695e-02f, +2.172989006e-02f, +1.518797623e-02f, +9.806842063e-03f, +5.738219968e-03f, +2.939697175e-03f, +1.224336304e-03f,\n    -2.609073586e-05f, -5.093272665e-05f, -8.428931461e-05f, -1.238454723e-04f, -1.652142386e-04f, -2.023822639e-04f, -2.286289191e-04f, -2.377663278e-04f, -2.254456640e-04f, -1.902305206e-04f, -1.341681007e-04f, -6.269051648e-05f, +1.617137348e-05f, +9.311787923e-05f, +1.591798037e-04f, +2.072473709e-04f, +2.332060983e-04f, +2.364521385e-04f, +2.197075250e-04f, +1.882175742e-04f, +1.485469791e-04f, +1.072652872e-04f, +6.981129264e-05f, +3.975495944e-05f,\n    -1.236165621e-03f, -3.009018218e-03f, -5.139858309e-03f, -6.844677464e-03f, -7.007219660e-03f, -4.474874702e-03f, +1.530450414e-03f, +1.102352425e-02f, +2.304578352e-02f, +3.574728284e-02f, +4.677706159e-02f, +5.388339982e-02f, +5.553823395e-02f, +5.137829276e-02f, +4.231160499e-02f, +3.025239405e-02f, +1.757611683e-02f, +6.479567664e-03f, -1.546437529e-03f, -5.977953869e-03f, -7.203491064e-03f, -6.217814561e-03f, -4.203972052e-03f, -2.159036681e-03f,\n    +4.476895583e-05f, +6.374197407e-05f, +6.528727571e-05f, +3.622354707e-05f, -3.022228446e-05f, -1.292657505e-04f, -2.427905823e-04f, -3.424658527e-04f, -3.974341794e-04f, -3.842806141e-04f, -2.957546163e-04f, -1.448328608e-04f, +3.775568092e-05f, +2.120252768e-04f, +3.404359360e-04f, +3.987448259e-04f, +3.822799655e-04f, +3.056769175e-04f, +1.965818092e-04f, +8.597044546e-05f, -1.275384025e-06f, -5.237133972e-05f, -6.768299327e-05f, -5.731723542e-05f,\n    /*  1,26 (24) */\n    +6.106686506e-04f, +1.806637840e-03f, +3.932865406e-03f, +7.231616279e-03f, +1.183845557e-02f, +1.772149481e-02f, +2.464247554e-02f, +3.215280272e-02f, +3.963105810e-02f, +4.635949965e-02f, +5.162773845e-02f, +5.484457264e-02f, +5.563583443e-02f, +5.390807013e-02f, +4.986463085e-02f, +4.397075191e-02f, +3.687503244e-02f, +2.930375909e-02f, +2.194959758e-02f, +1.537619380e-02f, +9.955389042e-03f, +5.845485255e-03f, +3.009508467e-03f, +1.264091264e-03f,\n    -2.545961565e-05f, -5.002112110e-05f, -8.313553567e-05f, -1.225541865e-04f, -1.639507809e-04f, -2.013510827e-04f, -2.280388952e-04f, -2.377895090e-04f, -2.261784077e-04f, -1.916663450e-04f, -1.361894531e-04f, -6.508259574e-05f, +1.368668407e-05f, +9.083469754e-05f, +1.573575226e-04f, +2.060673215e-04f, +2.327446049e-04f, +2.366750198e-04f, +2.204860398e-04f, +1.893609687e-04f, +1.498433732e-04f, +1.085214336e-04f, +7.088291709e-05f, +4.056246185e-05f,\n    -1.191396665e-03f, -2.945276244e-03f, -5.074571034e-03f, -6.808453917e-03f, -7.037441945e-03f, -4.604140453e-03f, +1.287659832e-03f, +1.068105840e-02f, +2.264834934e-02f, +3.536300222e-02f, +4.648130697e-02f, +5.373856695e-02f, +5.557598963e-02f, +5.159031804e-02f, +4.265204093e-02f, +3.065113888e-02f, +1.795839680e-02f, +6.785244582e-03f, -1.349855720e-03f, -5.891983423e-03f, -7.204766448e-03f, -6.270185901e-03f, -4.271655045e-03f, -2.216353916e-03f,\n    +4.405082471e-05f, +6.333733508e-05f, +6.564371751e-05f, +3.768786388e-05f, -2.759288502e-05f, -1.258251183e-04f, -2.392888085e-04f, -3.398756389e-04f, -3.966597940e-04f, -3.858455924e-04f, -2.995845792e-04f, -1.502234199e-04f, +3.196123075e-05f, +2.071026027e-04f, +3.374048561e-04f, +3.980834092e-04f, +3.838233252e-04f, +3.087257329e-04f, +2.001681605e-04f, +8.917566987e-05f, +9.351764323e-07f, -5.134845990e-05f, -6.766233489e-05f, -5.789115407e-05f,\n    /*  1,27 (24) */\n    +5.852090350e-04f, +1.756616719e-03f, +3.849729871e-03f, +7.109062093e-03f, +1.167450479e-02f, +1.752014373e-02f, +2.441443664e-02f, +3.191501321e-02f, +3.940487969e-02f, +4.616783330e-02f, +5.149154900e-02f, +5.477949004e-02f, +5.564952111e-02f, +5.399890483e-02f, +5.002198837e-02f, +4.417681923e-02f, +3.710777704e-02f, +2.954043411e-02f, +2.217008362e-02f, +1.556555477e-02f, +1.010523242e-02f, +5.954006688e-03f, +3.080391384e-03f, +1.304653725e-03f,\n    -2.483720823e-05f, -4.911803594e-05f, -8.198808773e-05f, -1.212649717e-04f, -1.626834846e-04f, -2.003094010e-04f, -2.274321824e-04f, -2.377915891e-04f, -2.268884971e-04f, -1.930814118e-04f, -1.381953216e-04f, -6.746708201e-05f, +1.120038797e-05f, +8.854098772e-05f, +1.555175978e-04f, +2.048654630e-04f, +2.322606191e-04f, +2.368780408e-04f, +2.212498566e-04f, +1.904961658e-04f, +1.511380992e-04f, +1.097813335e-04f, +7.196186479e-05f, +4.137875911e-05f,\n    -1.147345840e-03f, -2.881938909e-03f, -5.008927316e-03f, -6.770766053e-03f, -7.065034830e-03f, -4.729965571e-03f, +1.048371023e-03f, +1.034118276e-02f, +2.225168955e-02f, +3.497715663e-02f, +4.618172239e-02f, +5.358834353e-02f, +5.560795086e-02f, +5.179742064e-02f, +4.298944578e-02f, +3.104922229e-02f, +1.834222013e-02f, +7.093970315e-03f, -1.149687559e-03f, -5.802807753e-03f, -7.203831272e-03f, -6.321534361e-03f, -4.339317380e-03f, -2.274245070e-03f,\n    +4.332966631e-05f, +6.291611563e-05f, +6.597009251e-05f, +3.911476326e-05f, -2.499680603e-05f, -1.224002588e-04f, -2.357747169e-04f, -3.372420571e-04f, -3.958180458e-04f, -3.873351753e-04f, -3.033513931e-04f, -1.555811067e-04f, +2.615972566e-05f, +2.021350307e-04f, +3.343041262e-04f, +3.973471616e-04f, +3.853061542e-04f, +3.117415784e-04f, +2.037526479e-04f, +9.240414446e-05f, +3.181975286e-06f, -5.028962066e-05f, -6.761587059e-05f, -5.845342137e-05f,\n    /*  1,28 (24) */\n    +5.603718267e-04f, +1.707498683e-03f, +3.767741783e-03f, +6.987797121e-03f, +1.151182130e-02f, +1.731983432e-02f, +2.418700446e-02f, +3.167722163e-02f, +3.917799119e-02f, +4.597475189e-02f, +5.135335367e-02f, +5.471202296e-02f, +5.566072150e-02f, +5.408744582e-02f, +5.017750597e-02f, +4.438168469e-02f, +3.734003766e-02f, +2.977731215e-02f, +2.239133348e-02f, +1.575605093e-02f, +1.025637051e-02f, +6.063788022e-03f, +3.152353249e-03f, +1.346032485e-03f,\n    -2.422349177e-05f, -4.822350583e-05f, -8.084707136e-05f, -1.199779894e-04f, -1.614125515e-04f, -1.992574267e-04f, -2.268089534e-04f, -2.377726671e-04f, -2.275759301e-04f, -1.944756084e-04f, -1.401854962e-04f, -6.984370103e-05f, +8.712776940e-06f, +8.623700849e-05f, +1.536602113e-04f, +2.036418741e-04f, +2.317541095e-04f, +2.370610757e-04f, +2.219987871e-04f, +1.916229551e-04f, +1.524309647e-04f, +1.110448427e-04f, +7.304805597e-05f, +4.220383580e-05f,\n    -1.104016174e-03f, -2.819022793e-03f, -4.942957224e-03f, -6.731651289e-03f, -7.090031636e-03f, -4.852365830e-03f, +8.125963065e-04f, +1.000394071e-02f, +2.185587150e-02f, +3.458982146e-02f, +4.587837100e-02f, +5.343276243e-02f, +5.563411059e-02f, +5.199955567e-02f, +4.332374991e-02f, +3.144656945e-02f, +1.872752628e-02f, +7.405711893e-03f, -9.459349115e-04f, -5.710403609e-03f, -7.200649296e-03f, -6.371823981e-03f, -4.406933251e-03f, -2.332698492e-03f,\n    +4.260584945e-05f, +6.247876761e-05f, +6.626676172e-05f, +4.050432324e-05f, -2.243438042e-05f, -1.189919086e-04f, -2.322492790e-04f, -3.345660239e-04f, -3.949094806e-04f, -3.887493134e-04f, -3.070543729e-04f, -1.609047730e-04f, +2.035244551e-05f, +1.971235943e-04f, +3.311342413e-04f, +3.965359323e-04f, +3.867277599e-04f, +3.147234851e-04f, +2.073343464e-04f, +9.565524824e-05f, +5.464814636e-06f, -4.919463712e-05f, -6.754318962e-05f, -5.900359551e-05f,\n    /*  1,29 (24) */\n    +5.361483350e-04f, +1.659275177e-03f, +3.686894711e-03f, +6.867819132e-03f, +1.135040875e-02f, +1.712057690e-02f, +2.396019551e-02f, +3.143944896e-02f, +3.895041526e-02f, +4.578027628e-02f, +5.121316818e-02f, +5.464217926e-02f, +5.566943427e-02f, +5.417368283e-02f, +5.033116618e-02f, +4.458532657e-02f, +3.757179177e-02f, +3.001437322e-02f, +2.261333227e-02f, +1.594767389e-02f, +1.040880148e-02f, +6.174832865e-03f, +3.225401305e-03f, +1.388236320e-03f,\n    -2.361844294e-05f, -4.733756345e-05f, -7.971258511e-05f, -1.186933996e-04f, -1.601381827e-04f, -1.981953682e-04f, -2.261693833e-04f, -2.377328453e-04f, -2.282407078e-04f, -1.958488257e-04f, -1.421597696e-04f, -7.221217990e-05f, +6.224142940e-06f, +8.392302033e-05f, +1.517855485e-04f, +2.023966364e-04f, +2.312250478e-04f, +2.372240010e-04f, +2.227326442e-04f, +1.927411265e-04f, +1.537217763e-04f, +1.123118154e-04f, +7.414140875e-05f, +4.303767463e-05f,\n    -1.061410325e-03f, -2.756544025e-03f, -4.876690462e-03f, -6.691146966e-03f, -7.112466016e-03f, -4.971357738e-03f, +5.803470275e-04f, +9.669374682e-03f, +2.146096202e-02f, +3.420107214e-02f, +4.557131662e-02f, +5.327185765e-02f, +5.565446303e-02f, +5.219667927e-02f, +4.365488415e-02f, +3.184310538e-02f, +1.911425404e-02f, +7.720435378e-03f, -7.386005651e-04f, -5.614748361e-03f, -7.195184482e-03f, -6.421018618e-03f, -4.474476440e-03f, -2.391702087e-03f,\n    +4.187973832e-05f, +6.202574269e-05f, +6.653409200e-05f, +4.185663315e-05f, -1.990592754e-05f, -1.156007930e-04f, -2.287134631e-04f, -3.318484630e-04f, -3.939346603e-04f, -3.900879776e-04f, -3.106928523e-04f, -1.661932803e-04f, +1.454067187e-05f, +1.920693398e-04f, +3.278957162e-04f, +3.956495901e-04f, +3.880874633e-04f, +3.176704877e-04f, +2.109123251e-04f, +9.892834806e-05f, +7.783483193e-06f, -4.806333441e-05f, -6.744388532e-05f, -5.954123292e-05f,\n    /*  1,30 (24) */\n    +5.125298920e-04f, +1.611937614e-03f, +3.607182126e-03f, +6.749125732e-03f, +1.119027057e-02f, +1.692238153e-02f, +2.373402612e-02f, +3.120171611e-02f, +3.872217455e-02f, +4.558442746e-02f, +5.107100841e-02f, +5.456996708e-02f, +5.567565842e-02f, +5.425760585e-02f, +5.048295173e-02f, +4.478772320e-02f, +3.780301682e-02f, +3.025159722e-02f, +2.283606491e-02f, +1.614041502e-02f, +1.056252326e-02f, +6.287144680e-03f, +3.299542714e-03f, +1.431273995e-03f,\n    -2.302203695e-05f, -4.646023953e-05f, -7.858472543e-05f, -1.174113605e-04f, -1.588605782e-04f, -1.971234341e-04f, -2.255136482e-04f, -2.376722283e-04f, -2.288828348e-04f, -1.972009578e-04f, -1.441179370e-04f, -7.457224711e-05f, +3.734778125e-06f, +8.159928545e-05f, +1.498937974e-04f, +2.011298355e-04f, +2.306734093e-04f, +2.373666959e-04f, +2.234512424e-04f, +1.938504700e-04f, +1.550103394e-04f, +1.135821039e-04f, +7.524183918e-05f, +4.388025644e-05f,\n    -1.019530586e-03f, -2.694518283e-03f, -4.810156370e-03f, -6.649290333e-03f, -7.132371944e-03f, -5.086958531e-03f, +3.516335643e-04f, +9.337526219e-03f, +2.106702736e-02f, +3.381098417e-02f, +4.526062377e-02f, +5.310566437e-02f, +5.566900371e-02f, +5.238874861e-02f, +4.398277987e-02f, +3.223875497e-02f, +1.950234150e-02f, +8.038105866e-03f, -5.276882399e-04f, -5.515820013e-03f, -7.187400998e-03f, -6.469081953e-03f, -4.541920326e-03f, -2.451243320e-03f,\n    +4.115169237e-05f, +6.155749209e-05f, +6.677245590e-05f, +4.317179353e-05f, -1.741175321e-05f, -1.122276266e-04f, -2.251682337e-04f, -3.290903040e-04f, -3.928941620e-04f, -3.913511592e-04f, -3.142661832e-04f, -1.714455010e-04f, +8.725687627e-06f, +1.869733261e-04f, +3.245890848e-04f, +3.946880233e-04f, +3.893845993e-04f, +3.205816252e-04f, +2.144856476e-04f, +1.022227988e-04f, +1.013775625e-05f, -4.689554782e-05f, -6.731755534e-05f, -6.006588847e-05f,\n    /*  1,31 (24) */\n    +4.895078551e-04f, +1.565477374e-03f, +3.528597401e-03f, +6.631714371e-03f, +1.103140999e-02f, +1.672525810e-02f, +2.350851248e-02f, +3.096404388e-02f, +3.849329172e-02f, +4.538722650e-02f, +5.092689047e-02f, +5.449539483e-02f, +5.567939320e-02f, +5.433920513e-02f, +5.063284553e-02f, +4.498885304e-02f, +3.803369023e-02f, +3.048896392e-02f, +2.305951615e-02f, +1.633426549e-02f, +1.071753360e-02f, +6.400726784e-03f, +3.374784553e-03f, +1.475154251e-03f,\n    -2.243424753e-05f, -4.559156282e-05f, -7.746358669e-05f, -1.161320286e-04f, -1.575799374e-04f, -1.960418335e-04f, -2.248419263e-04f, -2.375909238e-04f, -2.295023193e-04f, -1.985319023e-04f, -1.460597965e-04f, -7.692363257e-05f, +1.244974771e-06f, +7.926606770e-05f, +1.479851488e-04f, +1.998415601e-04f, +2.300991725e-04f, +2.374890420e-04f, +2.241543973e-04f, +1.949507756e-04f, +1.562964586e-04f, +1.148555588e-04f, +7.634926120e-05f, +4.473156016e-05f,\n    -9.783788940e-04f, -2.632960791e-03f, -4.743383914e-03f, -6.606118539e-03f, -7.149783697e-03f, -5.199186158e-03f, +1.264653307e-04f, +9.008435915e-03f, +2.067413320e-02f, +3.341963301e-02f, +4.494635759e-02f, +5.293421887e-02f, +5.567772939e-02f, +5.257572193e-02f, +4.430736895e-02f, +3.263344300e-02f, +1.989172610e-02f, +8.358687491e-03f, -3.132025924e-04f, -5.413597214e-03f, -7.177263242e-03f, -6.515977501e-03f, -4.609237881e-03f, -2.511309208e-03f,\n    +4.042206620e-05f, +6.107446643e-05f, +6.698223140e-05f, +4.444991597e-05f, -1.495214967e-05f, -1.088731127e-04f, -2.216145512e-04f, -3.262924828e-04f, -3.917885782e-04f, -3.925388696e-04f, -3.177737361e-04f, -1.766603177e-04f, +2.908776646e-06f, +1.818366243e-04f, +3.212149006e-04f, +3.936511404e-04f, +3.906185166e-04f, +3.234559409e-04f, +2.180533719e-04f, +1.055379432e-04f, +1.252739563e-05f, -4.569112297e-05f, -6.716380176e-05f, -6.057711558e-05f,\n    /*  2, 0 (24) */\n    -1.052000512e-03f, -1.225267868e-03f, -4.608628065e-05f, +3.709094207e-03f, +1.122115699e-02f, +2.318852133e-02f, +3.940859639e-02f, +5.854613402e-02f, +7.821578874e-02f, +9.540941453e-02f, +1.071760298e-01f, +1.113612763e-01f, +1.071760298e-01f, +9.540941453e-02f, +7.821578874e-02f, +5.854613402e-02f, +3.940859639e-02f, +2.318852133e-02f, +1.122115699e-02f, +3.709094207e-03f, -4.608628065e-05f, -1.225267868e-03f, -1.052000512e-03f, -4.708832203e-04f,\n    +1.584555542e-05f, -9.185459440e-06f, -6.916443580e-05f, -1.688238542e-04f, -3.004887188e-04f, -4.422077692e-04f, -5.609449829e-04f, -6.207176891e-04f, -5.934927004e-04f, -4.692000494e-04f, -2.611026920e-04f, -4.153751417e-06f, +2.535839502e-04f, +4.638335327e-04f, +5.910707719e-04f, +6.212908975e-04f, +5.638834066e-04f, +4.464564775e-04f, +3.049149461e-04f, +1.725320870e-04f, +7.168211267e-05f, +1.048135530e-05f, -1.548290361e-05f, -1.798781866e-05f,\n    +2.602648486e-04f, -1.790854894e-03f, -6.469170083e-03f, -1.331774173e-02f, -2.013268817e-02f, -2.337843094e-02f, -1.959106136e-02f, -7.230457758e-03f, +1.197693589e-02f, +3.306945298e-02f, +4.948642618e-02f, +5.568063817e-02f, +4.948642618e-02f, +3.306945298e-02f, +1.197693589e-02f, -7.230457758e-03f, -1.959106136e-02f, -2.337843094e-02f, -2.013268817e-02f, -1.331774173e-02f, -6.469170083e-03f, -1.790854894e-03f, +2.602648486e-04f, +4.785335182e-04f,\n    +2.853574234e-05f, +1.020710182e-04f, +1.857692058e-04f, +2.293779382e-04f, +1.790313220e-04f, +9.966225700e-06f, -2.476430534e-04f, -5.080781166e-04f, -6.611133931e-04f, -6.228059886e-04f, -3.804399088e-04f, -6.236330677e-06f, +3.701651116e-04f, +6.181549083e-04f, +6.630960758e-04f, +5.150465232e-04f, +2.562970312e-04f, -2.935877331e-06f, -1.755456498e-04f, -2.294652832e-04f, -1.880413307e-04f, -1.047427193e-04f, -3.035250677e-05f, +9.064716865e-06f,\n    /*  2, 1 (24) */\n    -1.036154957e-03f, -1.234453328e-03f, -1.152507165e-04f, +3.540270353e-03f, +1.092066827e-02f, +2.274631356e-02f, +3.884765141e-02f, +5.792541633e-02f, +7.762229604e-02f, +9.494021448e-02f, +1.069149271e-01f, +1.113571226e-01f, +1.074296137e-01f, +9.587324806e-02f, +7.880685951e-02f, +5.916742492e-02f, +3.997247980e-02f, +2.363497781e-02f, +1.152607194e-02f, +3.881626294e-03f, +2.559583202e-05f, -1.214786513e-03f, -1.067483416e-03f, -4.888710389e-04f,\n    +1.618563203e-05f, -7.924283845e-06f, -6.668655613e-05f, -1.651480956e-04f, -2.960732688e-04f, -4.379368899e-04f, -5.579483211e-04f, -6.200580086e-04f, -5.958178588e-04f, -4.744828822e-04f, -2.685726115e-04f, -1.246046575e-05f, +2.460177481e-04f, +4.583841202e-04f, +5.885521170e-04f, +6.217769968e-04f, +5.667625323e-04f, +4.506818819e-04f, +3.093510607e-04f, +1.762723314e-04f, +7.423956698e-05f, +1.181226953e-05f, -1.509725256e-05f, -1.812965542e-05f,\n    +2.888005909e-04f, -1.688783876e-03f, -6.283400877e-03f, -1.308836379e-02f, -1.995365684e-02f, -2.336846472e-02f, -1.983870441e-02f, -7.738535875e-03f, +1.131582250e-02f, +3.244664700e-02f, +4.910598627e-02f, +5.567440184e-02f, +4.985659129e-02f, +3.368760789e-02f, +1.264003196e-02f, -6.715411235e-03f, -1.933476432e-02f, -2.338136682e-02f, -2.030823382e-02f, -1.354720701e-02f, -6.657211414e-03f, -1.895597614e-03f, +2.299123418e-04f, +4.875982351e-04f,\n    +2.675586256e-05f, +9.941151491e-05f, +1.834583669e-04f, +2.291964006e-04f, +1.823962955e-04f, +1.690521069e-05f, -2.389940689e-04f, -5.010026274e-04f, -6.589376933e-04f, -6.272503973e-04f, -3.905809452e-04f, -1.870676093e-05f, +3.597600253e-04f, +6.132981627e-04f, +6.648840429e-04f, +5.219044802e-04f, +2.649526494e-04f, +4.183916502e-06f, -1.719392626e-04f, -2.294569894e-04f, -1.902729177e-04f, -1.074253608e-04f, -3.220584870e-05f, +8.403713181e-06f,\n    /*  2, 2 (24) */\n    -1.019969325e-03f, -1.242377612e-03f, -1.819372726e-04f, +3.375122257e-03f, +1.062459500e-02f, +2.230837667e-02f, +3.828970309e-02f, +5.730535832e-02f, +7.702647818e-02f, +9.446573159e-02f, +1.066463545e-01f, +1.113446621e-01f, +1.076756315e-01f, +9.633163218e-02f, +7.939541162e-02f, +5.978920191e-02f, +4.053924233e-02f, +2.408565969e-02f, +1.183542300e-02f, +4.057898625e-03f, +9.983539900e-05f, -1.202974244e-03f, -1.082580669e-03f, -5.070006944e-04f,\n    +1.650355829e-05f, -6.697523430e-06f, -6.424848103e-05f, -1.615052594e-04f, -2.916694746e-04f, -4.336449694e-04f, -5.548944887e-04f, -6.193125111e-04f, -5.980462265e-04f, -4.796812647e-04f, -2.759923601e-04f, -2.076481481e-05f, +2.384054602e-04f, +4.528526219e-04f, +5.859368034e-04f, +6.221753681e-04f, +5.695813083e-04f, +4.548828464e-04f, +3.137961612e-04f, +1.800441102e-04f, +7.683676646e-05f, +1.317849311e-05f, -1.468817924e-05f, -1.826129538e-05f,\n    +3.155564535e-04f, -1.589372361e-03f, -6.099942510e-03f, -1.285916739e-02f, -1.977126055e-02f, -2.335155950e-02f, -2.007769848e-02f, -8.239538502e-03f, +1.065688480e-02f, +3.181939660e-02f, +4.871540533e-02f, +5.565569508e-02f, +5.021635132e-02f, +3.430090605e-02f, +1.330491601e-02f, -6.193506755e-03f, -1.906981168e-02f, -2.337718290e-02f, -2.048017308e-02f, -1.377666400e-02f, -6.847484331e-03f, -2.003022974e-03f, +1.977064931e-04f, +4.960019483e-04f,\n    +2.501314587e-05f, +9.676543903e-05f, +1.811106325e-04f, +2.289221454e-04f, +1.856406436e-04f, +2.375097296e-05f, -2.303534036e-04f, -4.938234485e-04f, -6.565707484e-04f, -6.314872159e-04f, -4.005848091e-04f, -3.117049891e-05f, +3.492281796e-04f, +6.082368464e-04f, +6.664756702e-04f, +5.286486484e-04f, +2.736065296e-04f, +1.139117981e-05f, -1.682122012e-04f, -2.293516403e-04f, -1.924621382e-04f, -1.101176588e-04f, -3.409543201e-05f, +7.708395271e-06f,\n    /*  2, 3 (24) */\n    -1.003465767e-03f, -1.249075135e-03f, -2.461857536e-04f, +3.213616998e-03f, +1.033292553e-02f, +2.187473170e-02f, +3.773480860e-02f, +5.668604581e-02f, +7.642843195e-02f, +9.398605033e-02f, +1.063703621e-01f, +1.113238973e-01f, +1.079140369e-01f, +9.678448480e-02f, +7.998134843e-02f, +6.041137728e-02f, +4.110882364e-02f, +2.454054253e-02f, +1.214921916e-02f, +4.237942736e-03f, +1.766721655e-04f, -1.189795751e-03f, -1.097268848e-03f, -5.252619897e-04f,\n    +1.679975971e-05f, -5.504866354e-06f, -6.185020561e-05f, -1.578957793e-04f, -2.872782033e-04f, -4.293331335e-04f, -5.517845608e-04f, -6.184818694e-04f, -6.001778064e-04f, -4.847944527e-04f, -2.833606028e-04f, -2.906522245e-05f, +2.307484740e-04f, +4.472398691e-04f, +5.832249218e-04f, +6.224854107e-04f, +5.723386911e-04f, +4.590582325e-04f, +3.182493353e-04f, +1.838469319e-04f, +7.947366616e-05f, +1.458030965e-05f, -1.425526179e-05f, -1.838235768e-05f,\n    +3.405695994e-04f, -1.492606922e-03f, -5.918831878e-03f, -1.263024524e-02f, -1.958561990e-02f, -2.332780853e-02f, -2.030805188e-02f, -8.733361951e-03f, +1.000031405e-02f, +3.118790938e-02f, +4.831482052e-02f, +5.562452458e-02f, +5.056557950e-02f, +3.490914290e-02f, +1.397139168e-02f, -5.664858107e-03f, -1.879620515e-02f, -2.336579172e-02f, -2.064838528e-02f, -1.400601564e-02f, -7.039946469e-03f, -2.113140633e-03f, +1.636110611e-04f, +5.037103435e-04f,\n    +2.330784222e-05f, +9.413399264e-05f, +1.787278146e-04f, +2.285566754e-04f, +1.887644956e-04f, +3.050171218e-05f, -2.217243550e-04f, -4.865439971e-04f, -6.540144025e-04f, -6.355156147e-04f, -4.104481502e-04f, -4.362308645e-05f, +3.385731614e-04f, +6.029721417e-04f, +6.678694090e-04f, +5.352757180e-04f, +2.822552695e-04f, +1.868387906e-05f, -1.643645643e-04f, -2.291478507e-04f, -1.946071598e-04f, -1.128183026e-04f, -3.602089138e-05f, +6.978371850e-06f,\n    /*  2, 4 (24) */\n    -9.866660070e-04f, -1.254580002e-03f, -3.080359592e-04f, +3.055721218e-03f, +1.004564733e-02f, +2.144539857e-02f, +3.718302404e-02f, +5.606756394e-02f, +7.582825414e-02f, +9.350125588e-02f, +1.060870015e-01f, +1.112948321e-01f, +1.081447854e-01f, +9.723172467e-02f, +8.056457335e-02f, +6.103386269e-02f, +4.168116233e-02f, +2.499960077e-02f, +1.246746849e-02f, +4.421789668e-03f, +2.561458316e-04f, -1.175215441e-03f, -1.111524110e-03f, -5.436443474e-04f,\n    +1.707466226e-05f, -4.345994203e-06f, -5.949171285e-05f, -1.543200745e-04f, -2.829003102e-04f, -4.250025045e-04f, -5.486196193e-04f, -6.175667733e-04f, -6.022126246e-04f, -4.898217239e-04f, -2.906760184e-04f, -3.736011364e-05f, +2.230481888e-04f, +4.415467146e-04f, +5.804165871e-04f, +6.227065429e-04f, +5.750336461e-04f, +4.632068992e-04f, +3.227096598e-04f, +1.876802906e-04f, +8.215020841e-05f, +1.601799522e-05f, -1.379807969e-05f, -1.849245808e-05f,\n    +3.638774416e-04f, -1.398472929e-03f, -5.740104063e-03f, -1.240168857e-02f, -1.939685541e-02f, -2.329730682e-02f, -2.052977624e-02f, -9.219905948e-03f, +9.346299651e-03f, +3.055239377e-02f, +4.790437237e-02f, +5.558090149e-02f, +5.090415266e-02f, +3.551211504e-02f, +1.463926109e-02f, -5.129582389e-03f, -1.851394988e-02f, -2.334710784e-02f, -2.081274984e-02f, -1.423516349e-02f, -7.234553629e-03f, -2.225958936e-03f, +1.275901697e-04f, +5.106887154e-04f,\n    +2.164017338e-05f, +9.151834969e-05f, +1.763117176e-04f, +2.281015201e-04f, +1.917680365e-04f, +3.715568749e-05f, -2.131101909e-04f, -4.791677130e-04f, -6.512705711e-04f, -6.393348523e-04f, -4.201676808e-04f, -5.606007047e-05f, +3.277986126e-04f, +5.975053183e-04f, +6.690637871e-04f, +5.417824102e-04f, +2.908954441e-04f, +2.605992372e-05f, -1.603965089e-04f, -2.288442673e-04f, -1.967061477e-04f, -1.155259551e-04f, -3.798183208e-05f, +6.213268125e-06f,\n    /*  2, 5 (24) */\n    -9.695913448e-04f, -1.258925996e-03f, -3.675276721e-04f, +2.901401144e-03f, +9.762747015e-03f, +2.102039606e-02f, +3.663440442e-02f, +5.544999717e-02f, +7.522604152e-02f, +9.301143415e-02f, +1.057963255e-01f, +1.112574720e-01f, +1.083678336e-01f, +9.767327138e-02f, +8.114498994e-02f, +6.165656923e-02f, +4.225619598e-02f, +2.546280767e-02f, +1.279017815e-02f, +4.609469958e-03f, +3.382960400e-04f, -1.159197446e-03f, -1.125322189e-03f, -5.621368055e-04f,\n    +1.732869222e-05f, -3.220582194e-06f, -5.717297374e-05f, -1.507785496e-04f, -2.785366386e-04f, -4.206542003e-04f, -5.454007527e-04f, -6.165679301e-04f, -6.041507306e-04f, -4.947623787e-04f, -2.979373002e-04f, -4.564791482e-05f, +2.153060157e-04f, +4.357740323e-04f, +5.775119374e-04f, +6.228382017e-04f, +5.776651480e-04f, +4.673277037e-04f, +3.271762009e-04f, +1.915436659e-04f, +8.486632263e-05f, +1.749181816e-05f, -1.331621398e-05f, -1.859120906e-05f,\n    +3.855176150e-04f, -1.306954580e-03f, -5.563792346e-03f, -1.217358705e-02f, -1.920508737e-02f, -2.326015113e-02f, -2.074288643e-02f, -9.699073661e-03f, +8.695029080e-03f, +2.991305892e-02f, +4.748420469e-02f, +5.552484142e-02f, +5.123195127e-02f, +3.610962036e-02f, +1.530832487e-02f, -4.587799978e-03f, -1.822305443e-02f, -2.332104792e-02f, -2.097314635e-02f, -1.446400776e-02f, -7.431259777e-03f, -2.341484891e-03f, +8.960833763e-05f, +5.169019835e-04f,\n    +2.001033321e-05f, +8.891965578e-05f, +1.738641378e-04f, +2.275582344e-04f, +1.946515064e-04f, +4.371121788e-05f, -2.045141480e-04f, -4.716980567e-04f, -6.483412393e-04f, -6.429442762e-04f, -4.297401776e-04f, -6.847700495e-05f, +3.169082289e-04f, +5.918377328e-04f, +6.700574097e-04f, +5.481654794e-04f, +2.995236074e-04f, +3.351716690e-05f, -1.563082506e-04f, -2.284395699e-04f, -1.987572655e-04f, -1.182392537e-04f, -3.997782979e-05f, +5.412726337e-06f,\n    /*  2, 6 (24) */\n    -9.522626525e-04f, -1.262146578e-03f, -4.247006458e-04f, +2.750622594e-03f, +9.484210377e-03f, +2.059974186e-02f, +3.608900367e-02f, +5.483342924e-02f, +7.462189079e-02f, +9.251667177e-02f, +1.054983882e-01f, +1.112118241e-01f, +1.085831396e-01f, +9.810904542e-02f, +8.172250187e-02f, +6.227940744e-02f, +4.283386113e-02f, +2.593013537e-02f, +1.311735436e-02f, +4.801013624e-03f, +4.231623627e-04f, -1.141705627e-03f, -1.138638403e-03f, -5.807280146e-04f,\n    +1.756227598e-05f, -2.128299365e-06f, -5.489394744e-05f, -1.472715951e-04f, -2.741880197e-04f, -4.162893342e-04f, -5.421290560e-04f, -6.154860638e-04f, -6.059921968e-04f, -4.996157398e-04f, -3.051431560e-04f, -5.392705441e-05f, +2.075233773e-04f, +4.299227169e-04f, +5.745111347e-04f, +6.228798434e-04f, +5.802321806e-04f, +4.714195013e-04f, +3.316480143e-04f, +1.954365230e-04f, +8.762192522e-05f, +1.900203890e-05f, -1.280924741e-05f, -1.867821997e-05f,\n    +4.055279482e-04f, -1.218034924e-03f, -5.389928208e-03f, -1.194602881e-02f, -1.901043587e-02f, -2.321643991e-02f, -2.094740058e-02f, -1.017077172e-02f, +8.046687841e-03f, +2.927011464e-02f, +4.705446451e-02f, +5.545636442e-02f, +5.154885950e-02f, +3.670145809e-02f, +1.597838228e-02f, -4.039634499e-03f, -1.792353082e-02f, -2.328753075e-02f, -2.112945460e-02f, -1.469244733e-02f, -7.630017042e-03f, -2.459724145e-03f, +4.963050784e-05f, +5.223147098e-04f,\n    +1.841848797e-05f, +8.633902784e-05f, +1.713868621e-04f, +2.269283978e-04f, +1.974151997e-04f, +5.016668252e-05f, -1.959394305e-04f, -4.641385077e-04f, -6.452284613e-04f, -6.463433227e-04f, -4.391624825e-04f, -8.086945297e-05f, +3.059057580e-04f, +5.859708285e-04f, +6.708489603e-04f, +5.544217142e-04f, +3.081362939e-04f, +4.105340592e-05f, -1.521000643e-04f, -2.279324725e-04f, -2.007586760e-04f, -1.209568106e-04f, -4.200843041e-05f, +4.576406290e-06f,\n    /*  2, 7 (24) */\n    -9.347003766e-04f, -1.264274877e-03f, -4.795945933e-04f, +2.603350999e-03f, +9.210022357e-03f, +2.018345253e-02f, +3.554687461e-02f, +5.421794317e-02f, +7.401589859e-02f, +9.201705604e-02f, +1.051932450e-01f, +1.111578970e-01f, +1.087906630e-01f, +9.853896813e-02f, +8.229701301e-02f, +6.290228728e-02f, +4.341409331e-02f, +2.640155487e-02f, +1.344900237e-02f, +4.996450147e-03f, +5.107842879e-04f, -1.122703589e-03f, -1.151447651e-03f, -5.994062345e-04f,\n    +1.777583992e-05f, -1.068808779e-06f, -5.265458140e-05f, -1.437995866e-04f, -2.698552725e-04f, -4.119090148e-04f, -5.388056300e-04f, -6.143219148e-04f, -6.077371186e-04f, -5.043811523e-04f, -3.122923087e-04f, -6.219596318e-05f, +1.997017072e-04f, +4.239936841e-04f, +5.714143646e-04f, +6.228309436e-04f, +5.827337377e-04f, +4.754811461e-04f, +3.361241455e-04f, +1.993583130e-04f, +9.041691952e-05f, +2.054890974e-05f, -1.227676465e-05f, -1.875309709e-05f,\n    +4.239464361e-04f, -1.131695896e-03f, -5.218541346e-03f, -1.171910042e-02f, -1.881302067e-02f, -2.316627323e-02f, -2.114334001e-02f, -1.063491023e-02f, +7.401459380e-03f, +2.862377132e-02f, +4.661530203e-02f, +5.537549496e-02f, +5.185476526e-02f, +3.728742892e-02f, +1.664923124e-02f, -3.485212785e-03f, -1.761539453e-02f, -2.324647735e-02f, -2.128155467e-02f, -1.492037980e-02f, -7.830775718e-03f, -2.580680955e-03f, +7.622077426e-06f, +5.268911161e-04f,\n    +1.686477662e-05f, +8.377755386e-05f, +1.688816670e-04f, +2.262136130e-04f, +2.000594643e-04f, +5.652052112e-05f, -1.873892085e-04f, -4.564925630e-04f, -6.419343587e-04f, -6.495315166e-04f, -4.484315048e-04f, -9.323298872e-05f, +2.947949980e-04f, +5.799061350e-04f, +6.714372019e-04f, +5.605479395e-04f, +3.167300202e-04f, +4.866638302e-05f, -1.477722844e-04f, -2.273217245e-04f, -2.027085424e-04f, -1.236772130e-04f, -4.407314990e-05f, +3.703985872e-06f,\n    /*  2, 8 (24) */\n    -9.169245366e-04f, -1.265343686e-03f, -5.322491747e-04f, +2.459551413e-03f, +8.940167085e-03f, +1.977154351e-02f, +3.500806898e-02f, +5.360362126e-02f, +7.340816147e-02f, +9.151267488e-02f, +1.048809527e-01f, +1.110957010e-01f, +1.089903647e-01f, +9.896296182e-02f, +8.286842737e-02f, +6.352511822e-02f, +4.399682704e-02f, +2.687703602e-02f, +1.378512652e-02f, +5.195808460e-03f, +6.012012074e-04f, -1.102154679e-03f, -1.163724415e-03f, -6.181593316e-04f,\n    +1.796981020e-05f, -4.176771401e-08f, -5.045481151e-05f, -1.403628855e-04f, -2.655392034e-04f, -4.075143456e-04f, -5.354315812e-04f, -6.130762398e-04f, -6.093856145e-04f, -5.090579844e-04f, -3.193834961e-04f, -7.045307472e-05f, +1.918424496e-04f, +4.179878698e-04f, +5.682218367e-04f, +6.226909977e-04f, +5.851688234e-04f, +4.795114912e-04f, +3.406036299e-04f, +2.033084726e-04f, +9.325119560e-05f, +2.213267467e-05f, -1.171835245e-05f, -1.881544380e-05f,\n    +4.408112127e-04f, -1.047918342e-03f, -5.049659679e-03f, -1.149288680e-02f, -1.861296120e-02f, -2.310975271e-02f, -2.133072921e-02f, -1.109140279e-02f, +6.759525021e-03f, +2.797423980e-02f, +4.616687052e-02f, +5.528226198e-02f, +5.214956026e-02f, +3.786733506e-02f, +1.732066845e-02f, -2.924664845e-03f, -1.729866451e-02f, -2.319781096e-02f, -2.142932695e-02f, -1.514770153e-02f, -8.033484261e-03f, -2.704358168e-03f, -3.645107247e-05f, +5.305951020e-04f,\n    +1.534931117e-05f, +8.123629262e-05f, +1.663503184e-04f, +2.254155049e-04f, +2.025847015e-04f, +6.277123418e-05f, -1.788666174e-04f, -4.487637350e-04f, -6.384611192e-04f, -6.525084716e-04f, -4.575442216e-04f, -1.055631995e-04f, +2.835797956e-04f, +5.736452673e-04f, +6.718209774e-04f, +5.665410181e-04f, +3.253012863e-04f, +5.635378605e-05f, -1.433253052e-04f, -2.266061112e-04f, -2.046050295e-04f, -1.263990239e-04f, -4.617147413e-05f, +2.795161580e-06f,\n    /*  2, 9 (24) */\n    -8.989547265e-04f, -1.265385454e-03f, -5.827039862e-04f, +2.319188527e-03f, +8.674627881e-03f, +1.936402917e-02f, +3.447263740e-02f, +5.299054502e-02f, +7.279877586e-02f, +9.100361690e-02f, +1.045615692e-01f, +1.110252480e-01f, +1.091822071e-01f, +9.938094969e-02f, +8.343664921e-02f, +6.414780922e-02f, +4.458199587e-02f, +2.735654751e-02f, +1.412573014e-02f, +5.399116933e-03f, +6.944524030e-04f, -1.080022004e-03f, -1.175442768e-03f, -6.369747754e-04f,\n    +1.814461260e-05f, +9.531721336e-07f, -4.829456226e-05f, -1.369618388e-04f, -2.612406066e-04f, -4.031064244e-04f, -5.320080214e-04f, -6.117498117e-04f, -6.109378255e-04f, -5.136456269e-04f, -3.264154723e-04f, -7.869682585e-05f, +1.839470589e-04f, +4.119062305e-04f, +5.649337840e-04f, +6.224595207e-04f, +5.875364520e-04f, +4.835093887e-04f, +3.450854932e-04f, +2.072864241e-04f, +9.612463026e-05f, +2.375356921e-05f, -1.113359983e-05f, -1.886486066e-05f,\n    +4.561605239e-04f, -9.666820497e-04f, -4.883309360e-03f, -1.126747130e-02f, -1.841037650e-02f, -2.304698148e-02f, -2.150959583e-02f, -1.154016652e-02f, +6.121063902e-03f, +2.732173133e-02f, +4.570932630e-02f, +5.517669878e-02f, +5.243314005e-02f, +3.844098032e-02f, +1.799248942e-02f, -2.358123827e-03f, -1.697336322e-02f, -2.314145718e-02f, -2.157265226e-02f, -1.537430764e-02f, -8.238089290e-03f, -2.830757192e-03f, -8.262254660e-05f, +5.333902636e-04f,\n    +1.387217702e-05f, +7.871627351e-05f, +1.637945700e-04f, +2.245357194e-04f, +2.049913645e-04f, +6.891738327e-05f, -1.703747559e-04f, -4.409555500e-04f, -6.348109959e-04f, -6.552738902e-04f, -4.664976795e-04f, -1.178556876e-04f, +2.722640448e-04f, +5.671899256e-04f, +6.719992106e-04f, +5.723978525e-04f, +3.338465777e-04f, +6.411324919e-05f, -1.387595813e-04f, -2.257844555e-04f, -2.064463045e-04f, -1.291207824e-04f, -4.830285877e-05f, +1.849649032e-06f,\n    /*  2,10 (24) */\n    -8.808101138e-04f, -1.264432282e-03f, -6.309985484e-04f, +2.182226688e-03f, +8.413387275e-03f, +1.896092274e-02f, +3.394062938e-02f, +5.237879521e-02f, +7.218783803e-02f, +9.048997127e-02f, +1.042351537e-01f, +1.109465511e-01f, +1.093661542e-01f, +9.979285592e-02f, +8.400158299e-02f, +6.477026874e-02f, +4.516953232e-02f, +2.784005690e-02f, +1.447081564e-02f, +5.606403357e-03f, +7.905770333e-04f, -1.056268435e-03f, -1.186576368e-03f, -6.558396361e-04f,\n    +1.830067241e-05f, +1.916364455e-06f, -4.617374690e-05f, -1.335967791e-04f, -2.569602633e-04f, -3.986863436e-04f, -5.285360669e-04f, -6.103434187e-04f, -6.123939157e-04f, -5.181434937e-04f, -3.333870066e-04f, -8.692565704e-05f, +1.760169995e-04f, +4.057497427e-04f, +5.615504634e-04f, +6.221360480e-04f, +5.898356489e-04f, +4.874736909e-04f, +3.495687512e-04f, +2.112915759e-04f, +9.903708683e-05f, +2.541182018e-05f, -1.052209830e-05f, -1.890094555e-05f,\n    +4.700327009e-04f, -8.879657762e-04f, -4.719514790e-03f, -1.104293558e-02f, -1.820538514e-02f, -2.297806409e-02f, -2.167997059e-02f, -1.198112207e-02f, +5.486252906e-03f, +2.666645744e-02f, +4.524282862e-02f, +5.505884309e-02f, +5.270540410e-02f, +3.900817025e-02f, +1.866448863e-02f, -1.785725975e-03f, -1.663951665e-02f, -2.307734393e-02f, -2.171141184e-02f, -1.560009209e-02f, -8.444535595e-03f, -2.959877975e-03f, -1.309254054e-04f, +5.352399126e-04f,\n    +1.243343331e-05f, +7.621849629e-05f, +1.612161629e-04f, +2.235759227e-04f, +2.072799585e-04f, +7.495759125e-05f, -1.619166851e-04f, -4.330715464e-04f, -6.309863052e-04f, -6.578275632e-04f, -4.752889960e-04f, -1.301060727e-04f, +2.608516846e-04f, +5.605418947e-04f, +6.719709070e-04f, +5.781153860e-04f, +3.423623664e-04f, +7.194235371e-05f, -1.340756278e-04f, -2.248556185e-04f, -2.082305379e-04f, -1.318410047e-04f, -5.046672918e-05f, +8.671834766e-07f,\n    /*  2,11 (24) */\n    -8.625094414e-04f, -1.262515917e-03f, -6.771722953e-04f, +2.048629909e-03f, +8.156427011e-03f, +1.856223640e-02f, +3.341209331e-02f, +5.176845179e-02f, +7.157544412e-02f, +8.997182778e-02f, +1.039017667e-01f, +1.108596255e-01f, +1.095421712e-01f, +1.001986057e-01f, +8.456313346e-02f, +6.539240479e-02f, +4.575936797e-02f, +2.832753059e-02f, +1.482038439e-02f, +5.817694933e-03f, +8.896141201e-04f, -1.030856615e-03f, -1.197098466e-03f, -6.747405816e-04f,\n    +1.843841419e-05f, +2.848168129e-06f, -4.409226758e-05f, -1.302680244e-04f, -2.526989419e-04f, -3.942551895e-04f, -5.250168391e-04f, -6.088578646e-04f, -6.137540712e-04f, -5.225510217e-04f, -3.402968852e-04f, -9.513801287e-05f, +1.680537451e-04f, +3.995194025e-04f, +5.580721558e-04f, +6.217201350e-04f, +5.920654505e-04f, +4.914032495e-04f, +3.540524109e-04f, +2.153233223e-04f, +1.019884152e-04f, +2.710764555e-05f, -9.883441999e-06f, -1.892329380e-05f,\n    +4.824661342e-04f, -8.117472799e-04f, -4.558298627e-03f, -1.081935966e-02f, -1.799810518e-02f, -2.290310650e-02f, -2.184188727e-02f, -1.241419362e-02f, +4.855266601e-03f, +2.600862987e-02f, +4.476753963e-02f, +5.492873702e-02f, +5.296625578e-02f, +3.956871215e-02f, +1.933645954e-02f, -1.207610589e-03f, -1.629715428e-02f, -2.300540157e-02f, -2.184548747e-02f, -1.582494771e-02f, -8.652766133e-03f, -3.091718979e-03f, -1.813921345e-04f, +5.361070961e-04f,\n    +1.103311328e-05f, +7.374393090e-05f, +1.586168246e-04f, +2.225377996e-04f, +2.094510392e-04f, +8.089054244e-05f, -1.534954273e-04f, -4.251152730e-04f, -6.269894260e-04f, -6.601693699e-04f, -4.839153604e-04f, -1.423099933e-04f, +2.493466977e-04f, +5.537030433e-04f, +6.717351548e-04f, +5.836906051e-04f, +3.508451129e-04f, +7.983862880e-05f, -1.292740206e-04f, -2.238185004e-04f, -2.099559051e-04f, -1.345581839e-04f, -5.266248031e-05f, -1.524797041e-07f,\n    /*  2,12 (24) */\n    -8.440710273e-04f, -1.259667749e-03f, -7.212645629e-04f, +1.918361885e-03f, +7.903728069e-03f, +1.816798121e-02f, +3.288707647e-02f, +5.115959392e-02f, +7.096169005e-02f, +8.944927676e-02f, +1.035614698e-01f, +1.107644875e-01f, +1.097102249e-01f, +1.005981251e-01f, +8.512120561e-02f, +6.601412492e-02f, +4.635143342e-02f, +2.881893384e-02f, +1.517443680e-02f, +6.033018255e-03f, +9.916025353e-04f, -1.003748969e-03f, -1.206981908e-03f, -6.936638754e-04f,\n    +1.855826167e-05f, +3.748947027e-06f, -4.205001549e-05f, -1.269758788e-04f, -2.484573980e-04f, -3.898140421e-04f, -5.214514630e-04f, -6.072939681e-04f, -6.150185008e-04f, -5.268676710e-04f, -3.471439106e-04f, -1.033323424e-04f, +1.600587785e-04f, +3.932162260e-04f, +5.544991655e-04f, +6.212113577e-04f, +5.942249049e-04f, +4.952969171e-04f, +3.585354695e-04f, +2.193810432e-04f, +1.049784515e-04f, +2.884125426e-05f, -9.217227941e-06f, -1.893149833e-05f,\n    +4.934992475e-04f, -7.380033490e-04f, -4.399681803e-03f, -1.059682186e-02f, -1.778865414e-02f, -2.282221596e-02f, -2.199538270e-02f, -1.283930889e-02f, +4.228277175e-03f, +2.534846050e-02f, +4.428362427e-02f, +5.478642702e-02f, +5.321560248e-02f, +4.012241519e-02f, +2.000819470e-02f, -6.239199835e-04f, -1.594630917e-02f, -2.292556295e-02f, -2.197476149e-02f, -1.604876621e-02f, -8.862722038e-03f, -3.226277163e-03f, -2.340546149e-04f, +5.359546164e-04f,\n    +9.671224678e-06f, +7.129351731e-05f, +1.559982682e-04f, +2.214230526e-04f, +2.115052124e-04f, +8.671498277e-05f, -1.451139647e-04f, -4.170902870e-04f, -6.228227982e-04f, -6.622992779e-04f, -4.923740349e-04f, -1.544631089e-04f, +2.377531086e-04f, +5.466753230e-04f, +6.712911252e-04f, +5.891205406e-04f, +3.592912675e-04f, +8.779955236e-05f, -1.243553968e-04f, -2.226720419e-04f, -2.116205870e-04f, -1.372707913e-04f, -5.488947664e-05f, -1.209564500e-06f,\n    /*  2,13 (24) */\n    -8.255127656e-04f, -1.255918802e-03f, -7.633145784e-04f, +1.791386006e-03f, +7.655270671e-03f, +1.777816717e-02f, +3.236562501e-02f, +5.055229995e-02f, +7.034667155e-02f, +8.892240909e-02f, +1.032143259e-01f, +1.106611551e-01f, +1.098702837e-01f, +1.009913413e-01f, +8.567570478e-02f, +6.663533628e-02f, +4.694565832e-02f, +2.931423076e-02f, +1.553297227e-02f, +6.252399298e-03f, +1.096580987e-03f, -9.749077150e-04f, -1.216199136e-03f, -7.125953738e-04f,\n    +1.866063758e-05f, +4.619069815e-06f, -4.004687109e-05f, -1.237206317e-04f, -2.442363740e-04f, -3.853639748e-04f, -5.178410678e-04f, -6.056525629e-04f, -6.161874357e-04f, -5.310929250e-04f, -3.539269020e-04f, -1.115070997e-04f, +1.520335911e-04f, +3.868412484e-04f, +5.508318208e-04f, +6.206093129e-04f, +5.963130719e-04f, +4.991535465e-04f, +3.630169159e-04f, +2.234641050e-04f, +1.080070184e-04f, +3.061284599e-05f, -8.523056161e-06f, -1.892514973e-05f,\n    +5.031704722e-04f, -6.667098317e-04f, -4.243683534e-03f, -1.037539880e-02f, -1.757714893e-02f, -2.273550098e-02f, -2.214049667e-02f, -1.325639918e-02f, +3.605454377e-03f, +2.468616123e-02f, +4.379125023e-02f, +5.463196391e-02f, +5.345335559e-02f, +4.066909051e-02f, +2.067948582e-02f, -3.479944287e-05f, -1.558701790e-02f, -2.283776339e-02f, -2.209911688e-02f, -1.627143825e-02f, -9.074342625e-03f, -3.363547954e-03f, -2.889440915e-04f, +5.347450519e-04f,\n    +8.347750126e-06f, +6.886816537e-05f, +1.533621916e-04f, +2.202334011e-04f, +2.134431333e-04f, +9.242971990e-05f, -1.367752381e-04f, -4.090001528e-04f, -6.184889212e-04f, -6.642173426e-04f, -5.006623563e-04f, -1.665611023e-04f, +2.260749816e-04f, +5.394607684e-04f, +6.706380730e-04f, +5.944022694e-04f, +3.676972726e-04f, +9.582255189e-05f, -1.193204547e-04f, -2.214152249e-04f, -2.132227712e-04f, -1.399772766e-04f, -5.714705212e-05f, -2.304273786e-06f,\n    /*  2,14 (24) */\n    -8.068521280e-04f, -1.251299732e-03f, -8.033614495e-04f, +1.667665374e-03f, +7.411034297e-03f, +1.739280319e-02f, +3.184778394e-02f, +4.994664739e-02f, +6.973048411e-02f, +8.839131616e-02f, +1.028603990e-01f, +1.105496480e-01f, +1.100223173e-01f, +1.013781825e-01f, +8.622653660e-02f, +6.725594559e-02f, +4.754197139e-02f, +2.981338430e-02f, +1.589598919e-02f, +6.475863403e-03f, +1.204588005e-03f, -9.442948690e-04f, -1.224722192e-03f, -7.315205235e-04f,\n    +1.874596349e-05f, +5.458909754e-06f, -3.808270418e-05f, -1.205025587e-04f, -2.400365990e-04f, -3.809060541e-04f, -5.141867861e-04f, -6.039344968e-04f, -6.172611289e-04f, -5.352262904e-04f, -3.606446961e-04f, -1.196607440e-04f, +1.439796827e-04f, +3.803955241e-04f, +5.470704735e-04f, +6.199136183e-04f, +5.983290236e-04f, +5.029719919e-04f, +3.674957301e-04f, +2.275718599e-04f, +1.110739246e-04f, +3.242261104e-05f, -7.800529930e-06f, -1.890383645e-05f,\n    +5.115182223e-04f, -5.978416663e-04f, -4.090321343e-03f, -1.015516540e-02f, -1.736370579e-02f, -2.264307126e-02f, -2.227727190e-02f, -1.366539933e-02f, +2.986965455e-03f, +2.402194388e-02f, +4.329058788e-02f, +5.446540281e-02f, +5.367943057e-02f, +4.120855128e-02f, +2.135012389e-02f, +5.596028265e-04f, -1.521932063e-02f, -2.274194084e-02f, -2.221843734e-02f, -1.649285348e-02f, -9.287565396e-03f, -3.503525231e-03f, -3.460911436e-04f, +5.324407781e-04f,\n    +7.062647538e-06f, +6.646875466e-05f, +1.507102769e-04f, +2.189705797e-04f, +2.152655055e-04f, +9.803362332e-05f, -1.284821462e-04f, -4.008484398e-04f, -6.139903527e-04f, -6.659237071e-04f, -5.087777361e-04f, -1.785996809e-04f, +2.143164194e-04f, +5.320614954e-04f, +6.697753378e-04f, +5.995329158e-04f, +3.760595635e-04f, +1.039050054e-04f, -1.141699541e-04f, -2.200470734e-04f, -2.147606532e-04f, -1.426760689e-04f, -5.943451013e-05f, -3.436788838e-06f,\n    /*  2,15 (24) */\n    -7.881061645e-04f, -1.245840822e-03f, -8.414441537e-04f, +1.547162816e-03f, +7.170997698e-03f, +1.701189714e-02f, +3.133359716e-02f, +4.934271290e-02f, +6.911322298e-02f, +8.785608987e-02f, +1.024997543e-01f, +1.104299873e-01f, +1.101662970e-01f, +1.017585781e-01f, +8.677360707e-02f, +6.787585921e-02f, +4.814030042e-02f, +3.031635629e-02f, +1.626348492e-02f, +6.703435263e-03f, +1.315661930e-03f, -9.118722579e-04f, -1.232522722e-03f, -7.504243599e-04f,\n    +1.881465967e-05f, +6.268844507e-06f, -3.615737416e-05f, -1.173219208e-04f, -2.358587890e-04f, -3.764413397e-04f, -5.104897536e-04f, -6.021406320e-04f, -6.182398555e-04f, -5.392672972e-04f, -3.672961470e-04f, -1.277917407e-04f, +1.358985609e-04f, +3.738801264e-04f, +5.432154992e-04f, +6.191239125e-04f, +6.002718445e-04f, +5.067511085e-04f, +3.719708835e-04f, +2.317036463e-04f, +1.141789651e-04f, +3.427073012e-05f, -7.049255941e-06f, -1.886714492e-05f,\n    +5.185808699e-04f, -5.313729117e-04f, -3.939611066e-03f, -9.936194824e-03f, -1.714844029e-02f, -2.254503763e-02f, -2.240575405e-02f, -1.406624777e-02f, +2.372975103e-03f, +2.335602018e-02f, +4.278181014e-02f, +5.428680313e-02f, +5.389374699e-02f, +4.174061278e-02f, +2.201989923e-02f, +1.159135742e-03f, -1.484326106e-02f, -2.263803584e-02f, -2.233260729e-02f, -1.671290055e-02f, -9.502326049e-03f, -3.646201300e-03f, -4.055256537e-04f, +5.290039893e-04f,\n    +5.815850534e-06f, +6.409613443e-05f, +1.480441893e-04f, +2.176363376e-04f, +2.169730800e-04f, +1.035256244e-04f, -1.202375441e-04f, -3.926387209e-04f, -6.093297069e-04f, -6.674186018e-04f, -5.167176626e-04f, -1.905745794e-04f, +2.024815608e-04f, +5.244797011e-04f, +6.687023441e-04f, +6.045096535e-04f, +3.843745706e-04f, +1.120442422e-04f, -1.089047163e-04f, -2.185666547e-04f, -2.162324372e-04f, -1.453655767e-04f, -6.175112348e-05f, -4.607268862e-06f,\n    /*  2,16 (24) */\n    -7.692915048e-04f, -1.239571978e-03f, -8.776015278e-04f, +1.429840895e-03f, +6.935138909e-03f, +1.663545580e-02f, +3.082310740e-02f, +4.874057226e-02f, +6.849498313e-02f, +8.731682257e-02f, +1.021324582e-01f, +1.103021955e-01f, +1.103021955e-01f, +1.021324582e-01f, +8.731682257e-02f, +6.849498313e-02f, +4.874057226e-02f, +3.082310740e-02f, +1.663545580e-02f, +6.935138909e-03f, +1.429840895e-03f, -8.776015278e-04f, -1.239571978e-03f, -7.692915048e-04f,\n    +1.886714492e-05f, +7.049255941e-06f, -3.427073012e-05f, -1.141789651e-04f, -2.317036463e-04f, -3.719708835e-04f, -5.067511085e-04f, -6.002718445e-04f, -6.191239125e-04f, -5.432154992e-04f, -3.738801264e-04f, -1.358985609e-04f, +1.277917407e-04f, +3.672961470e-04f, +5.392672972e-04f, +6.182398555e-04f, +6.021406320e-04f, +5.104897536e-04f, +3.764413397e-04f, +2.358587890e-04f, +1.173219208e-04f, +3.615737416e-05f, -6.268844507e-06f, -1.881465967e-05f,\n    +5.243967204e-04f, -4.672767772e-04f, -3.791566877e-03f, -9.718558487e-03f, -1.693146721e-02f, -2.244151201e-02f, -2.252599159e-02f, -1.445888649e-02f, +1.763645396e-03f, +2.268860158e-02f, +4.226509248e-02f, +5.409622855e-02f, +5.409622855e-02f, +4.226509248e-02f, +2.268860158e-02f, +1.763645396e-03f, -1.445888649e-02f, -2.252599159e-02f, -2.244151201e-02f, -1.693146721e-02f, -9.718558487e-03f, -3.791566877e-03f, -4.672767772e-04f, +5.243967204e-04f,\n    +4.607268862e-06f, +6.175112348e-05f, +1.453655767e-04f, +2.162324372e-04f, +2.185666547e-04f, +1.089047163e-04f, -1.120442422e-04f, -3.843745706e-04f, -6.045096535e-04f, -6.687023441e-04f, -5.244797011e-04f, -2.024815608e-04f, +1.905745794e-04f, +5.167176626e-04f, +6.674186018e-04f, +6.093297069e-04f, +3.926387209e-04f, +1.202375441e-04f, -1.035256244e-04f, -2.169730800e-04f, -2.176363376e-04f, -1.480441893e-04f, -6.409613443e-05f, -5.815850534e-06f,\n    /*  2,17 (24) */\n    -7.504243599e-04f, -1.232522722e-03f, -9.118722579e-04f, +1.315661930e-03f, +6.703435263e-03f, +1.626348492e-02f, +3.031635629e-02f, +4.814030042e-02f, +6.787585921e-02f, +8.677360707e-02f, +1.017585781e-01f, +1.101662970e-01f, +1.104299873e-01f, +1.024997543e-01f, +8.785608987e-02f, +6.911322298e-02f, +4.934271290e-02f, +3.133359716e-02f, +1.701189714e-02f, +7.170997698e-03f, +1.547162816e-03f, -8.414441537e-04f, -1.245840822e-03f, -7.881061645e-04f,\n    +1.890383645e-05f, +7.800529930e-06f, -3.242261104e-05f, -1.110739246e-04f, -2.275718599e-04f, -3.674957301e-04f, -5.029719919e-04f, -5.983290236e-04f, -6.199136183e-04f, -5.470704735e-04f, -3.803955241e-04f, -1.439796827e-04f, +1.196607440e-04f, +3.606446961e-04f, +5.352262904e-04f, +6.172611289e-04f, +6.039344968e-04f, +5.141867861e-04f, +3.809060541e-04f, +2.400365990e-04f, +1.205025587e-04f, +3.808270418e-05f, -5.458909754e-06f, -1.874596349e-05f,\n    +5.290039893e-04f, -4.055256537e-04f, -3.646201300e-03f, -9.502326049e-03f, -1.671290055e-02f, -2.233260729e-02f, -2.263803584e-02f, -1.484326106e-02f, +1.159135742e-03f, +2.201989923e-02f, +4.174061278e-02f, +5.389374699e-02f, +5.428680313e-02f, +4.278181014e-02f, +2.335602018e-02f, +2.372975103e-03f, -1.406624777e-02f, -2.240575405e-02f, -2.254503763e-02f, -1.714844029e-02f, -9.936194824e-03f, -3.939611066e-03f, -5.313729117e-04f, +5.185808699e-04f,\n    +3.436788838e-06f, +5.943451013e-05f, +1.426760689e-04f, +2.147606532e-04f, +2.200470734e-04f, +1.141699541e-04f, -1.039050054e-04f, -3.760595635e-04f, -5.995329158e-04f, -6.697753378e-04f, -5.320614954e-04f, -2.143164194e-04f, +1.785996809e-04f, +5.087777361e-04f, +6.659237071e-04f, +6.139903527e-04f, +4.008484398e-04f, +1.284821462e-04f, -9.803362332e-05f, -2.152655055e-04f, -2.189705797e-04f, -1.507102769e-04f, -6.646875466e-05f, -7.062647538e-06f,\n    /*  2,18 (24) */\n    -7.315205235e-04f, -1.224722192e-03f, -9.442948690e-04f, +1.204588005e-03f, +6.475863403e-03f, +1.589598919e-02f, +2.981338430e-02f, +4.754197139e-02f, +6.725594559e-02f, +8.622653660e-02f, +1.013781825e-01f, +1.100223173e-01f, +1.105496480e-01f, +1.028603990e-01f, +8.839131616e-02f, +6.973048411e-02f, +4.994664739e-02f, +3.184778394e-02f, +1.739280319e-02f, +7.411034297e-03f, +1.667665374e-03f, -8.033614495e-04f, -1.251299732e-03f, -8.068521280e-04f,\n    +1.892514973e-05f, +8.523056161e-06f, -3.061284599e-05f, -1.080070184e-04f, -2.234641050e-04f, -3.630169159e-04f, -4.991535465e-04f, -5.963130719e-04f, -6.206093129e-04f, -5.508318208e-04f, -3.868412484e-04f, -1.520335911e-04f, +1.115070997e-04f, +3.539269020e-04f, +5.310929250e-04f, +6.161874357e-04f, +6.056525629e-04f, +5.178410678e-04f, +3.853639748e-04f, +2.442363740e-04f, +1.237206317e-04f, +4.004687109e-05f, -4.619069815e-06f, -1.866063758e-05f,\n    +5.324407781e-04f, -3.460911436e-04f, -3.503525231e-03f, -9.287565396e-03f, -1.649285348e-02f, -2.221843734e-02f, -2.274194084e-02f, -1.521932063e-02f, +5.596028265e-04f, +2.135012389e-02f, +4.120855128e-02f, +5.367943057e-02f, +5.446540281e-02f, +4.329058788e-02f, +2.402194388e-02f, +2.986965455e-03f, -1.366539933e-02f, -2.227727190e-02f, -2.264307126e-02f, -1.736370579e-02f, -1.015516540e-02f, -4.090321343e-03f, -5.978416663e-04f, +5.115182223e-04f,\n    +2.304273786e-06f, +5.714705212e-05f, +1.399772766e-04f, +2.132227712e-04f, +2.214152249e-04f, +1.193204547e-04f, -9.582255189e-05f, -3.676972726e-04f, -5.944022694e-04f, -6.706380730e-04f, -5.394607684e-04f, -2.260749816e-04f, +1.665611023e-04f, +5.006623563e-04f, +6.642173426e-04f, +6.184889212e-04f, +4.090001528e-04f, +1.367752381e-04f, -9.242971990e-05f, -2.134431333e-04f, -2.202334011e-04f, -1.533621916e-04f, -6.886816537e-05f, -8.347750126e-06f,\n    /*  2,19 (24) */\n    -7.125953738e-04f, -1.216199136e-03f, -9.749077150e-04f, +1.096580987e-03f, +6.252399298e-03f, +1.553297227e-02f, +2.931423076e-02f, +4.694565832e-02f, +6.663533628e-02f, +8.567570478e-02f, +1.009913413e-01f, +1.098702837e-01f, +1.106611551e-01f, +1.032143259e-01f, +8.892240909e-02f, +7.034667155e-02f, +5.055229995e-02f, +3.236562501e-02f, +1.777816717e-02f, +7.655270671e-03f, +1.791386006e-03f, -7.633145784e-04f, -1.255918802e-03f, -8.255127656e-04f,\n    +1.893149833e-05f, +9.217227941e-06f, -2.884125426e-05f, -1.049784515e-04f, -2.193810432e-04f, -3.585354695e-04f, -4.952969171e-04f, -5.942249049e-04f, -6.212113577e-04f, -5.544991655e-04f, -3.932162260e-04f, -1.600587785e-04f, +1.033323424e-04f, +3.471439106e-04f, +5.268676710e-04f, +6.150185008e-04f, +6.072939681e-04f, +5.214514630e-04f, +3.898140421e-04f, +2.484573980e-04f, +1.269758788e-04f, +4.205001549e-05f, -3.748947027e-06f, -1.855826167e-05f,\n    +5.347450519e-04f, -2.889440915e-04f, -3.363547954e-03f, -9.074342625e-03f, -1.627143825e-02f, -2.209911688e-02f, -2.283776339e-02f, -1.558701790e-02f, -3.479944287e-05f, +2.067948582e-02f, +4.066909051e-02f, +5.345335559e-02f, +5.463196391e-02f, +4.379125023e-02f, +2.468616123e-02f, +3.605454377e-03f, -1.325639918e-02f, -2.214049667e-02f, -2.273550098e-02f, -1.757714893e-02f, -1.037539880e-02f, -4.243683534e-03f, -6.667098317e-04f, +5.031704722e-04f,\n    +1.209564500e-06f, +5.488947664e-05f, +1.372707913e-04f, +2.116205870e-04f, +2.226720419e-04f, +1.243553968e-04f, -8.779955236e-05f, -3.592912675e-04f, -5.891205406e-04f, -6.712911252e-04f, -5.466753230e-04f, -2.377531086e-04f, +1.544631089e-04f, +4.923740349e-04f, +6.622992779e-04f, +6.228227982e-04f, +4.170902870e-04f, +1.451139647e-04f, -8.671498277e-05f, -2.115052124e-04f, -2.214230526e-04f, -1.559982682e-04f, -7.129351731e-05f, -9.671224678e-06f,\n    /*  2,20 (24) */\n    -6.936638754e-04f, -1.206981908e-03f, -1.003748969e-03f, +9.916025353e-04f, +6.033018255e-03f, +1.517443680e-02f, +2.881893384e-02f, +4.635143342e-02f, +6.601412492e-02f, +8.512120561e-02f, +1.005981251e-01f, +1.097102249e-01f, +1.107644875e-01f, +1.035614698e-01f, +8.944927676e-02f, +7.096169005e-02f, +5.115959392e-02f, +3.288707647e-02f, +1.816798121e-02f, +7.903728069e-03f, +1.918361885e-03f, -7.212645629e-04f, -1.259667749e-03f, -8.440710273e-04f,\n    +1.892329380e-05f, +9.883441999e-06f, -2.710764555e-05f, -1.019884152e-04f, -2.153233223e-04f, -3.540524109e-04f, -4.914032495e-04f, -5.920654505e-04f, -6.217201350e-04f, -5.580721558e-04f, -3.995194025e-04f, -1.680537451e-04f, +9.513801287e-05f, +3.402968852e-04f, +5.225510217e-04f, +6.137540712e-04f, +6.088578646e-04f, +5.250168391e-04f, +3.942551895e-04f, +2.526989419e-04f, +1.302680244e-04f, +4.409226758e-05f, -2.848168129e-06f, -1.843841419e-05f,\n    +5.359546164e-04f, -2.340546149e-04f, -3.226277163e-03f, -8.862722038e-03f, -1.604876621e-02f, -2.197476149e-02f, -2.292556295e-02f, -1.594630917e-02f, -6.239199835e-04f, +2.000819470e-02f, +4.012241519e-02f, +5.321560248e-02f, +5.478642702e-02f, +4.428362427e-02f, +2.534846050e-02f, +4.228277175e-03f, -1.283930889e-02f, -2.199538270e-02f, -2.282221596e-02f, -1.778865414e-02f, -1.059682186e-02f, -4.399681803e-03f, -7.380033490e-04f, +4.934992475e-04f,\n    +1.524797041e-07f, +5.266248031e-05f, +1.345581839e-04f, +2.099559051e-04f, +2.238185004e-04f, +1.292740206e-04f, -7.983862880e-05f, -3.508451129e-04f, -5.836906051e-04f, -6.717351548e-04f, -5.537030433e-04f, -2.493466977e-04f, +1.423099933e-04f, +4.839153604e-04f, +6.601693699e-04f, +6.269894260e-04f, +4.251152730e-04f, +1.534954273e-04f, -8.089054244e-05f, -2.094510392e-04f, -2.225377996e-04f, -1.586168246e-04f, -7.374393090e-05f, -1.103311328e-05f,\n    /*  2,21 (24) */\n    -6.747405816e-04f, -1.197098466e-03f, -1.030856615e-03f, +8.896141201e-04f, +5.817694933e-03f, +1.482038439e-02f, +2.832753059e-02f, +4.575936797e-02f, +6.539240479e-02f, +8.456313346e-02f, +1.001986057e-01f, +1.095421712e-01f, +1.108596255e-01f, +1.039017667e-01f, +8.997182778e-02f, +7.157544412e-02f, +5.176845179e-02f, +3.341209331e-02f, +1.856223640e-02f, +8.156427011e-03f, +2.048629909e-03f, -6.771722953e-04f, -1.262515917e-03f, -8.625094414e-04f,\n    +1.890094555e-05f, +1.052209830e-05f, -2.541182018e-05f, -9.903708683e-05f, -2.112915759e-04f, -3.495687512e-04f, -4.874736909e-04f, -5.898356489e-04f, -6.221360480e-04f, -5.615504634e-04f, -4.057497427e-04f, -1.760169995e-04f, +8.692565704e-05f, +3.333870066e-04f, +5.181434937e-04f, +6.123939157e-04f, +6.103434187e-04f, +5.285360669e-04f, +3.986863436e-04f, +2.569602633e-04f, +1.335967791e-04f, +4.617374690e-05f, -1.916364455e-06f, -1.830067241e-05f,\n    +5.361070961e-04f, -1.813921345e-04f, -3.091718979e-03f, -8.652766133e-03f, -1.582494771e-02f, -2.184548747e-02f, -2.300540157e-02f, -1.629715428e-02f, -1.207610589e-03f, +1.933645954e-02f, +3.956871215e-02f, +5.296625578e-02f, +5.492873702e-02f, +4.476753963e-02f, +2.600862987e-02f, +4.855266601e-03f, -1.241419362e-02f, -2.184188727e-02f, -2.290310650e-02f, -1.799810518e-02f, -1.081935966e-02f, -4.558298627e-03f, -8.117472799e-04f, +4.824661342e-04f,\n    -8.671834766e-07f, +5.046672918e-05f, +1.318410047e-04f, +2.082305379e-04f, +2.248556185e-04f, +1.340756278e-04f, -7.194235371e-05f, -3.423623664e-04f, -5.781153860e-04f, -6.719709070e-04f, -5.605418947e-04f, -2.608516846e-04f, +1.301060727e-04f, +4.752889960e-04f, +6.578275632e-04f, +6.309863052e-04f, +4.330715464e-04f, +1.619166851e-04f, -7.495759125e-05f, -2.072799585e-04f, -2.235759227e-04f, -1.612161629e-04f, -7.621849629e-05f, -1.243343331e-05f,\n    /*  2,22 (24) */\n    -6.558396361e-04f, -1.186576368e-03f, -1.056268435e-03f, +7.905770333e-04f, +5.606403357e-03f, +1.447081564e-02f, +2.784005690e-02f, +4.516953232e-02f, +6.477026874e-02f, +8.400158299e-02f, +9.979285592e-02f, +1.093661542e-01f, +1.109465511e-01f, +1.042351537e-01f, +9.048997127e-02f, +7.218783803e-02f, +5.237879521e-02f, +3.394062938e-02f, +1.896092274e-02f, +8.413387275e-03f, +2.182226688e-03f, -6.309985484e-04f, -1.264432282e-03f, -8.808101138e-04f,\n    +1.886486066e-05f, +1.113359983e-05f, -2.375356921e-05f, -9.612463026e-05f, -2.072864241e-04f, -3.450854932e-04f, -4.835093887e-04f, -5.875364520e-04f, -6.224595207e-04f, -5.649337840e-04f, -4.119062305e-04f, -1.839470589e-04f, +7.869682585e-05f, +3.264154723e-04f, +5.136456269e-04f, +6.109378255e-04f, +6.117498117e-04f, +5.320080214e-04f, +4.031064244e-04f, +2.612406066e-04f, +1.369618388e-04f, +4.829456226e-05f, -9.531721336e-07f, -1.814461260e-05f,\n    +5.352399126e-04f, -1.309254054e-04f, -2.959877975e-03f, -8.444535595e-03f, -1.560009209e-02f, -2.171141184e-02f, -2.307734393e-02f, -1.663951665e-02f, -1.785725975e-03f, +1.866448863e-02f, +3.900817025e-02f, +5.270540410e-02f, +5.505884309e-02f, +4.524282862e-02f, +2.666645744e-02f, +5.486252906e-03f, -1.198112207e-02f, -2.167997059e-02f, -2.297806409e-02f, -1.820538514e-02f, -1.104293558e-02f, -4.719514790e-03f, -8.879657762e-04f, +4.700327009e-04f,\n    -1.849649032e-06f, +4.830285877e-05f, +1.291207824e-04f, +2.064463045e-04f, +2.257844555e-04f, +1.387595813e-04f, -6.411324919e-05f, -3.338465777e-04f, -5.723978525e-04f, -6.719992106e-04f, -5.671899256e-04f, -2.722640448e-04f, +1.178556876e-04f, +4.664976795e-04f, +6.552738902e-04f, +6.348109959e-04f, +4.409555500e-04f, +1.703747559e-04f, -6.891738327e-05f, -2.049913645e-04f, -2.245357194e-04f, -1.637945700e-04f, -7.871627351e-05f, -1.387217702e-05f,\n    /*  2,23 (24) */\n    -6.369747754e-04f, -1.175442768e-03f, -1.080022004e-03f, +6.944524030e-04f, +5.399116933e-03f, +1.412573014e-02f, +2.735654751e-02f, +4.458199587e-02f, +6.414780922e-02f, +8.343664921e-02f, +9.938094969e-02f, +1.091822071e-01f, +1.110252480e-01f, +1.045615692e-01f, +9.100361690e-02f, +7.279877586e-02f, +5.299054502e-02f, +3.447263740e-02f, +1.936402917e-02f, +8.674627881e-03f, +2.319188527e-03f, -5.827039862e-04f, -1.265385454e-03f, -8.989547265e-04f,\n    +1.881544380e-05f, +1.171835245e-05f, -2.213267467e-05f, -9.325119560e-05f, -2.033084726e-04f, -3.406036299e-04f, -4.795114912e-04f, -5.851688234e-04f, -6.226909977e-04f, -5.682218367e-04f, -4.179878698e-04f, -1.918424496e-04f, +7.045307472e-05f, +3.193834961e-04f, +5.090579844e-04f, +6.093856145e-04f, +6.130762398e-04f, +5.354315812e-04f, +4.075143456e-04f, +2.655392034e-04f, +1.403628855e-04f, +5.045481151e-05f, +4.176771401e-08f, -1.796981020e-05f,\n    +5.333902636e-04f, -8.262254660e-05f, -2.830757192e-03f, -8.238089290e-03f, -1.537430764e-02f, -2.157265226e-02f, -2.314145718e-02f, -1.697336322e-02f, -2.358123827e-03f, +1.799248942e-02f, +3.844098032e-02f, +5.243314005e-02f, +5.517669878e-02f, +4.570932630e-02f, +2.732173133e-02f, +6.121063902e-03f, -1.154016652e-02f, -2.150959583e-02f, -2.304698148e-02f, -1.841037650e-02f, -1.126747130e-02f, -4.883309360e-03f, -9.666820497e-04f, +4.561605239e-04f,\n    -2.795161580e-06f, +4.617147413e-05f, +1.263990239e-04f, +2.046050295e-04f, +2.266061112e-04f, +1.433253052e-04f, -5.635378605e-05f, -3.253012863e-04f, -5.665410181e-04f, -6.718209774e-04f, -5.736452673e-04f, -2.835797956e-04f, +1.055631995e-04f, +4.575442216e-04f, +6.525084716e-04f, +6.384611192e-04f, +4.487637350e-04f, +1.788666174e-04f, -6.277123418e-05f, -2.025847015e-04f, -2.254155049e-04f, -1.663503184e-04f, -8.123629262e-05f, -1.534931117e-05f,\n    /*  2,24 (24) */\n    -6.181593316e-04f, -1.163724415e-03f, -1.102154679e-03f, +6.012012074e-04f, +5.195808460e-03f, +1.378512652e-02f, +2.687703602e-02f, +4.399682704e-02f, +6.352511822e-02f, +8.286842737e-02f, +9.896296182e-02f, +1.089903647e-01f, +1.110957010e-01f, +1.048809527e-01f, +9.151267488e-02f, +7.340816147e-02f, +5.360362126e-02f, +3.500806898e-02f, +1.977154351e-02f, +8.940167085e-03f, +2.459551413e-03f, -5.322491747e-04f, -1.265343686e-03f, -9.169245366e-04f,\n    +1.875309709e-05f, +1.227676465e-05f, -2.054890974e-05f, -9.041691952e-05f, -1.993583130e-04f, -3.361241455e-04f, -4.754811461e-04f, -5.827337377e-04f, -6.228309436e-04f, -5.714143646e-04f, -4.239936841e-04f, -1.997017072e-04f, +6.219596318e-05f, +3.122923087e-04f, +5.043811523e-04f, +6.077371186e-04f, +6.143219148e-04f, +5.388056300e-04f, +4.119090148e-04f, +2.698552725e-04f, +1.437995866e-04f, +5.265458140e-05f, +1.068808779e-06f, -1.777583992e-05f,\n    +5.305951020e-04f, -3.645107247e-05f, -2.704358168e-03f, -8.033484261e-03f, -1.514770153e-02f, -2.142932695e-02f, -2.319781096e-02f, -1.729866451e-02f, -2.924664845e-03f, +1.732066845e-02f, +3.786733506e-02f, +5.214956026e-02f, +5.528226198e-02f, +4.616687052e-02f, +2.797423980e-02f, +6.759525021e-03f, -1.109140279e-02f, -2.133072921e-02f, -2.310975271e-02f, -1.861296120e-02f, -1.149288680e-02f, -5.049659679e-03f, -1.047918342e-03f, +4.408112127e-04f,\n    -3.703985872e-06f, +4.407314990e-05f, +1.236772130e-04f, +2.027085424e-04f, +2.273217245e-04f, +1.477722844e-04f, -4.866638302e-05f, -3.167300202e-04f, -5.605479395e-04f, -6.714372019e-04f, -5.799061350e-04f, -2.947949980e-04f, +9.323298872e-05f, +4.484315048e-04f, +6.495315166e-04f, +6.419343587e-04f, +4.564925630e-04f, +1.873892085e-04f, -5.652052112e-05f, -2.000594643e-04f, -2.262136130e-04f, -1.688816670e-04f, -8.377755386e-05f, -1.686477662e-05f,\n    /*  2,25 (24) */\n    -5.994062345e-04f, -1.151447651e-03f, -1.122703589e-03f, +5.107842879e-04f, +4.996450147e-03f, +1.344900237e-02f, +2.640155487e-02f, +4.341409331e-02f, +6.290228728e-02f, +8.229701301e-02f, +9.853896813e-02f, +1.087906630e-01f, +1.111578970e-01f, +1.051932450e-01f, +9.201705604e-02f, +7.401589859e-02f, +5.421794317e-02f, +3.554687461e-02f, +2.018345253e-02f, +9.210022357e-03f, +2.603350999e-03f, -4.795945933e-04f, -1.264274877e-03f, -9.347003766e-04f,\n    +1.867821997e-05f, +1.280924741e-05f, -1.900203890e-05f, -8.762192522e-05f, -1.954365230e-04f, -3.316480143e-04f, -4.714195013e-04f, -5.802321806e-04f, -6.228798434e-04f, -5.745111347e-04f, -4.299227169e-04f, -2.075233773e-04f, +5.392705441e-05f, +3.051431560e-04f, +4.996157398e-04f, +6.059921968e-04f, +6.154860638e-04f, +5.421290560e-04f, +4.162893342e-04f, +2.741880197e-04f, +1.472715951e-04f, +5.489394744e-05f, +2.128299365e-06f, -1.756227598e-05f,\n    +5.268911161e-04f, +7.622077426e-06f, -2.580680955e-03f, -7.830775718e-03f, -1.492037980e-02f, -2.128155467e-02f, -2.324647735e-02f, -1.761539453e-02f, -3.485212785e-03f, +1.664923124e-02f, +3.728742892e-02f, +5.185476526e-02f, +5.537549496e-02f, +4.661530203e-02f, +2.862377132e-02f, +7.401459380e-03f, -1.063491023e-02f, -2.114334001e-02f, -2.316627323e-02f, -1.881302067e-02f, -1.171910042e-02f, -5.218541346e-03f, -1.131695896e-03f, +4.239464361e-04f,\n    -4.576406290e-06f, +4.200843041e-05f, +1.209568106e-04f, +2.007586760e-04f, +2.279324725e-04f, +1.521000643e-04f, -4.105340592e-05f, -3.081362939e-04f, -5.544217142e-04f, -6.708489603e-04f, -5.859708285e-04f, -3.059057580e-04f, +8.086945297e-05f, +4.391624825e-04f, +6.463433227e-04f, +6.452284613e-04f, +4.641385077e-04f, +1.959394305e-04f, -5.016668252e-05f, -1.974151997e-04f, -2.269283978e-04f, -1.713868621e-04f, -8.633902784e-05f, -1.841848797e-05f,\n    /*  2,26 (24) */\n    -5.807280146e-04f, -1.138638403e-03f, -1.141705627e-03f, +4.231623627e-04f, +4.801013624e-03f, +1.311735436e-02f, +2.593013537e-02f, +4.283386113e-02f, +6.227940744e-02f, +8.172250187e-02f, +9.810904542e-02f, +1.085831396e-01f, +1.112118241e-01f, +1.054983882e-01f, +9.251667177e-02f, +7.462189079e-02f, +5.483342924e-02f, +3.608900367e-02f, +2.059974186e-02f, +9.484210377e-03f, +2.750622594e-03f, -4.247006458e-04f, -1.262146578e-03f, -9.522626525e-04f,\n    +1.859120906e-05f, +1.331621398e-05f, -1.749181816e-05f, -8.486632263e-05f, -1.915436659e-04f, -3.271762009e-04f, -4.673277037e-04f, -5.776651480e-04f, -6.228382017e-04f, -5.775119374e-04f, -4.357740323e-04f, -2.153060157e-04f, +4.564791482e-05f, +2.979373002e-04f, +4.947623787e-04f, +6.041507306e-04f, +6.165679301e-04f, +5.454007527e-04f, +4.206542003e-04f, +2.785366386e-04f, +1.507785496e-04f, +5.717297374e-05f, +3.220582194e-06f, -1.732869222e-05f,\n    +5.223147098e-04f, +4.963050784e-05f, -2.459724145e-03f, -7.630017042e-03f, -1.469244733e-02f, -2.112945460e-02f, -2.328753075e-02f, -1.792353082e-02f, -4.039634499e-03f, +1.597838228e-02f, +3.670145809e-02f, +5.154885950e-02f, +5.545636442e-02f, +4.705446451e-02f, +2.927011464e-02f, +8.046687841e-03f, -1.017077172e-02f, -2.094740058e-02f, -2.321643991e-02f, -1.901043587e-02f, -1.194602881e-02f, -5.389928208e-03f, -1.218034924e-03f, +4.055279482e-04f,\n    -5.412726337e-06f, +3.997782979e-05f, +1.182392537e-04f, +1.987572655e-04f, +2.284395699e-04f, +1.563082506e-04f, -3.351716690e-05f, -2.995236074e-04f, -5.481654794e-04f, -6.700574097e-04f, -5.918377328e-04f, -3.169082289e-04f, +6.847700495e-05f, +4.297401776e-04f, +6.429442762e-04f, +6.483412393e-04f, +4.716980567e-04f, +2.045141480e-04f, -4.371121788e-05f, -1.946515064e-04f, -2.275582344e-04f, -1.738641378e-04f, -8.891965578e-05f, -2.001033321e-05f,\n    /*  2,27 (24) */\n    -5.621368055e-04f, -1.125322189e-03f, -1.159197446e-03f, +3.382960400e-04f, +4.609469958e-03f, +1.279017815e-02f, +2.546280767e-02f, +4.225619598e-02f, +6.165656923e-02f, +8.114498994e-02f, +9.767327138e-02f, +1.083678336e-01f, +1.112574720e-01f, +1.057963255e-01f, +9.301143415e-02f, +7.522604152e-02f, +5.544999717e-02f, +3.663440442e-02f, +2.102039606e-02f, +9.762747015e-03f, +2.901401144e-03f, -3.675276721e-04f, -1.258925996e-03f, -9.695913448e-04f,\n    +1.849245808e-05f, +1.379807969e-05f, -1.601799522e-05f, -8.215020841e-05f, -1.876802906e-04f, -3.227096598e-04f, -4.632068992e-04f, -5.750336461e-04f, -6.227065429e-04f, -5.804165871e-04f, -4.415467146e-04f, -2.230481888e-04f, +3.736011364e-05f, +2.906760184e-04f, +4.898217239e-04f, +6.022126246e-04f, +6.175667733e-04f, +5.486196193e-04f, +4.250025045e-04f, +2.829003102e-04f, +1.543200745e-04f, +5.949171285e-05f, +4.345994203e-06f, -1.707466226e-05f,\n    +5.169019835e-04f, +8.960833763e-05f, -2.341484891e-03f, -7.431259777e-03f, -1.446400776e-02f, -2.097314635e-02f, -2.332104792e-02f, -1.822305443e-02f, -4.587799978e-03f, +1.530832487e-02f, +3.610962036e-02f, +5.123195127e-02f, +5.552484142e-02f, +4.748420469e-02f, +2.991305892e-02f, +8.695029080e-03f, -9.699073661e-03f, -2.074288643e-02f, -2.326015113e-02f, -1.920508737e-02f, -1.217358705e-02f, -5.563792346e-03f, -1.306954580e-03f, +3.855176150e-04f,\n    -6.213268125e-06f, +3.798183208e-05f, +1.155259551e-04f, +1.967061477e-04f, +2.288442673e-04f, +1.603965089e-04f, -2.605992372e-05f, -2.908954441e-04f, -5.417824102e-04f, -6.690637871e-04f, -5.975053183e-04f, -3.277986126e-04f, +5.606007047e-05f, +4.201676808e-04f, +6.393348523e-04f, +6.512705711e-04f, +4.791677130e-04f, +2.131101909e-04f, -3.715568749e-05f, -1.917680365e-04f, -2.281015201e-04f, -1.763117176e-04f, -9.151834969e-05f, -2.164017338e-05f,\n    /*  2,28 (24) */\n    -5.436443474e-04f, -1.111524110e-03f, -1.175215441e-03f, +2.561458316e-04f, +4.421789668e-03f, +1.246746849e-02f, +2.499960077e-02f, +4.168116233e-02f, +6.103386269e-02f, +8.056457335e-02f, +9.723172467e-02f, +1.081447854e-01f, +1.112948321e-01f, +1.060870015e-01f, +9.350125588e-02f, +7.582825414e-02f, +5.606756394e-02f, +3.718302404e-02f, +2.144539857e-02f, +1.004564733e-02f, +3.055721218e-03f, -3.080359592e-04f, -1.254580002e-03f, -9.866660070e-04f,\n    +1.838235768e-05f, +1.425526179e-05f, -1.458030965e-05f, -7.947366616e-05f, -1.838469319e-04f, -3.182493353e-04f, -4.590582325e-04f, -5.723386911e-04f, -6.224854107e-04f, -5.832249218e-04f, -4.472398691e-04f, -2.307484740e-04f, +2.906522245e-05f, +2.833606028e-04f, +4.847944527e-04f, +6.001778064e-04f, +6.184818694e-04f, +5.517845608e-04f, +4.293331335e-04f, +2.872782033e-04f, +1.578957793e-04f, +6.185020561e-05f, +5.504866354e-06f, -1.679975971e-05f,\n    +5.106887154e-04f, +1.275901697e-04f, -2.225958936e-03f, -7.234553629e-03f, -1.423516349e-02f, -2.081274984e-02f, -2.334710784e-02f, -1.851394988e-02f, -5.129582389e-03f, +1.463926109e-02f, +3.551211504e-02f, +5.090415266e-02f, +5.558090149e-02f, +4.790437237e-02f, +3.055239377e-02f, +9.346299651e-03f, -9.219905948e-03f, -2.052977624e-02f, -2.329730682e-02f, -1.939685541e-02f, -1.240168857e-02f, -5.740104063e-03f, -1.398472929e-03f, +3.638774416e-04f,\n    -6.978371850e-06f, +3.602089138e-05f, +1.128183026e-04f, +1.946071598e-04f, +2.291478507e-04f, +1.643645643e-04f, -1.868387906e-05f, -2.822552695e-04f, -5.352757180e-04f, -6.678694090e-04f, -6.029721417e-04f, -3.385731614e-04f, +4.362308645e-05f, +4.104481502e-04f, +6.355156147e-04f, +6.540144025e-04f, +4.865439971e-04f, +2.217243550e-04f, -3.050171218e-05f, -1.887644956e-04f, -2.285566754e-04f, -1.787278146e-04f, -9.413399264e-05f, -2.330784222e-05f,\n    /*  2,29 (24) */\n    -5.252619897e-04f, -1.097268848e-03f, -1.189795751e-03f, +1.766721655e-04f, +4.237942736e-03f, +1.214921916e-02f, +2.454054253e-02f, +4.110882364e-02f, +6.041137728e-02f, +7.998134843e-02f, +9.678448480e-02f, +1.079140369e-01f, +1.113238973e-01f, +1.063703621e-01f, +9.398605033e-02f, +7.642843195e-02f, +5.668604581e-02f, +3.773480860e-02f, +2.187473170e-02f, +1.033292553e-02f, +3.213616998e-03f, -2.461857536e-04f, -1.249075135e-03f, -1.003465767e-03f,\n    +1.826129538e-05f, +1.468817924e-05f, -1.317849311e-05f, -7.683676646e-05f, -1.800441102e-04f, -3.137961612e-04f, -4.548828464e-04f, -5.695813083e-04f, -6.221753681e-04f, -5.859368034e-04f, -4.528526219e-04f, -2.384054602e-04f, +2.076481481e-05f, +2.759923601e-04f, +4.796812647e-04f, +5.980462265e-04f, +6.193125111e-04f, +5.548944887e-04f, +4.336449694e-04f, +2.916694746e-04f, +1.615052594e-04f, +6.424848103e-05f, +6.697523430e-06f, -1.650355829e-05f,\n    +5.037103435e-04f, +1.636110611e-04f, -2.113140633e-03f, -7.039946469e-03f, -1.400601564e-02f, -2.064838528e-02f, -2.336579172e-02f, -1.879620515e-02f, -5.664858107e-03f, +1.397139168e-02f, +3.490914290e-02f, +5.056557950e-02f, +5.562452458e-02f, +4.831482052e-02f, +3.118790938e-02f, +1.000031405e-02f, -8.733361951e-03f, -2.030805188e-02f, -2.332780853e-02f, -1.958561990e-02f, -1.263024524e-02f, -5.918831878e-03f, -1.492606922e-03f, +3.405695994e-04f,\n    -7.708395271e-06f, +3.409543201e-05f, +1.101176588e-04f, +1.924621382e-04f, +2.293516403e-04f, +1.682122012e-04f, -1.139117981e-05f, -2.736065296e-04f, -5.286486484e-04f, -6.664756702e-04f, -6.082368464e-04f, -3.492281796e-04f, +3.117049891e-05f, +4.005848091e-04f, +6.314872159e-04f, +6.565707484e-04f, +4.938234485e-04f, +2.303534036e-04f, -2.375097296e-05f, -1.856406436e-04f, -2.289221454e-04f, -1.811106325e-04f, -9.676543903e-05f, -2.501314587e-05f,\n    /*  2,30 (24) */\n    -5.070006944e-04f, -1.082580669e-03f, -1.202974244e-03f, +9.983539900e-05f, +4.057898625e-03f, +1.183542300e-02f, +2.408565969e-02f, +4.053924233e-02f, +5.978920191e-02f, +7.939541162e-02f, +9.633163218e-02f, +1.076756315e-01f, +1.113446621e-01f, +1.066463545e-01f, +9.446573159e-02f, +7.702647818e-02f, +5.730535832e-02f, +3.828970309e-02f, +2.230837667e-02f, +1.062459500e-02f, +3.375122257e-03f, -1.819372726e-04f, -1.242377612e-03f, -1.019969325e-03f,\n    +1.812965542e-05f, +1.509725256e-05f, -1.181226953e-05f, -7.423956698e-05f, -1.762723314e-04f, -3.093510607e-04f, -4.506818819e-04f, -5.667625323e-04f, -6.217769968e-04f, -5.885521170e-04f, -4.583841202e-04f, -2.460177481e-04f, +1.246046575e-05f, +2.685726115e-04f, +4.744828822e-04f, +5.958178588e-04f, +6.200580086e-04f, +5.579483211e-04f, +4.379368899e-04f, +2.960732688e-04f, +1.651480956e-04f, +6.668655613e-05f, +7.924283845e-06f, -1.618563203e-05f,\n    +4.960019483e-04f, +1.977064931e-04f, -2.003022974e-03f, -6.847484331e-03f, -1.377666400e-02f, -2.048017308e-02f, -2.337718290e-02f, -1.906981168e-02f, -6.193506755e-03f, +1.330491601e-02f, +3.430090605e-02f, +5.021635132e-02f, +5.565569508e-02f, +4.871540533e-02f, +3.181939660e-02f, +1.065688480e-02f, -8.239538502e-03f, -2.007769848e-02f, -2.335155950e-02f, -1.977126055e-02f, -1.285916739e-02f, -6.099942510e-03f, -1.589372361e-03f, +3.155564535e-04f,\n    -8.403713181e-06f, +3.220584870e-05f, +1.074253608e-04f, +1.902729177e-04f, +2.294569894e-04f, +1.719392626e-04f, -4.183916502e-06f, -2.649526494e-04f, -5.219044802e-04f, -6.648840429e-04f, -6.132981627e-04f, -3.597600253e-04f, +1.870676093e-05f, +3.905809452e-04f, +6.272503973e-04f, +6.589376933e-04f, +5.010026274e-04f, +2.389940689e-04f, -1.690521069e-05f, -1.823962955e-04f, -2.291964006e-04f, -1.834583669e-04f, -9.941151491e-05f, -2.675586256e-05f,\n    /*  2,31 (24) */\n    -4.888710389e-04f, -1.067483416e-03f, -1.214786513e-03f, +2.559583202e-05f, +3.881626294e-03f, +1.152607194e-02f, +2.363497781e-02f, +3.997247980e-02f, +5.916742492e-02f, +7.880685951e-02f, +9.587324806e-02f, +1.074296137e-01f, +1.113571226e-01f, +1.069149271e-01f, +9.494021448e-02f, +7.762229604e-02f, +5.792541633e-02f, +3.884765141e-02f, +2.274631356e-02f, +1.092066827e-02f, +3.540270353e-03f, -1.152507165e-04f, -1.234453328e-03f, -1.036154957e-03f,\n    +1.798781866e-05f, +1.548290361e-05f, -1.048135530e-05f, -7.168211267e-05f, -1.725320870e-04f, -3.049149461e-04f, -4.464564775e-04f, -5.638834066e-04f, -6.212908975e-04f, -5.910707719e-04f, -4.638335327e-04f, -2.535839502e-04f, +4.153751417e-06f, +2.611026920e-04f, +4.692000494e-04f, +5.934927004e-04f, +6.207176891e-04f, +5.609449829e-04f, +4.422077692e-04f, +3.004887188e-04f, +1.688238542e-04f, +6.916443580e-05f, +9.185459440e-06f, -1.584555542e-05f,\n    +4.875982351e-04f, +2.299123418e-04f, -1.895597614e-03f, -6.657211414e-03f, -1.354720701e-02f, -2.030823382e-02f, -2.338136682e-02f, -1.933476432e-02f, -6.715411235e-03f, +1.264003196e-02f, +3.368760789e-02f, +4.985659129e-02f, +5.567440184e-02f, +4.910598627e-02f, +3.244664700e-02f, +1.131582250e-02f, -7.738535875e-03f, -1.983870441e-02f, -2.336846472e-02f, -1.995365684e-02f, -1.308836379e-02f, -6.283400877e-03f, -1.688783876e-03f, +2.888005909e-04f,\n    -9.064716865e-06f, +3.035250677e-05f, +1.047427193e-04f, +1.880413307e-04f, +2.294652832e-04f, +1.755456498e-04f, +2.935877331e-06f, -2.562970312e-04f, -5.150465232e-04f, -6.630960758e-04f, -6.181549083e-04f, -3.701651116e-04f, +6.236330677e-06f, +3.804399088e-04f, +6.228059886e-04f, +6.611133931e-04f, +5.080781166e-04f, +2.476430534e-04f, -9.966225700e-06f, -1.790313220e-04f, -2.293779382e-04f, -1.857692058e-04f, -1.020710182e-04f, -2.853574234e-05f,\n    /*  3, 0 (24) */\n    -7.917356639e-04f, -3.016122763e-03f, -6.515256363e-03f, -9.608647522e-03f, -8.911531175e-03f, -1.899096117e-04f, +1.981753504e-02f, +5.131567626e-02f, +9.019272462e-02f, +1.284788675e-01f, +1.566624559e-01f, +1.670419145e-01f, +1.566624559e-01f, +1.284788675e-01f, +9.019272462e-02f, +5.131567626e-02f, +1.981753504e-02f, -1.899096117e-04f, -8.911531175e-03f, -9.608647522e-03f, -6.515256363e-03f, -3.016122763e-03f, -7.917356639e-04f, +7.650297944e-06f,\n    +4.438129776e-05f, +9.288555880e-05f, +1.166047700e-04f, +6.055408398e-05f, -1.214573968e-04f, -4.322415435e-04f, -8.085880363e-04f, -1.128795806e-03f, -1.254606094e-03f, -1.092006038e-03f, -6.415426008e-04f, -1.039008209e-05f, +6.237490619e-04f, +1.081988441e-03f, +1.254166848e-03f, +1.136337421e-03f, +8.201804378e-04f, +4.435206002e-04f, +1.293692963e-04f, -5.693319620e-05f, -1.163592181e-04f, -9.426136396e-05f, -4.583541038e-05f, -8.923101798e-06f,\n    +2.391742032e-03f, +5.312215035e-03f, +6.607426619e-03f, +2.622016450e-03f, -8.359379704e-03f, -2.318774526e-02f, -3.380890411e-02f, -3.134542425e-02f, -1.229656639e-02f, +1.750386073e-02f, +4.470491270e-02f, +5.568063817e-02f, +4.470491270e-02f, +1.750386073e-02f, -1.229656639e-02f, -3.134542425e-02f, -3.380890411e-02f, -2.318774526e-02f, -8.359379704e-03f, +2.622016450e-03f, +6.607426619e-03f, +5.312215035e-03f, +2.391742032e-03f, +4.555202259e-04f,\n    -8.328765248e-05f, -8.524146050e-05f, +2.168904174e-05f, +2.318317186e-04f, +4.324770105e-04f, +4.498819789e-04f, +1.726415751e-04f, -3.321135850e-04f, -8.129264642e-04f, -9.714409511e-04f, -6.623103823e-04f, -1.122753743e-05f, +6.457668103e-04f, +9.689372183e-04f, +8.241044281e-04f, +3.491395175e-04f, -1.594007232e-04f, -4.458682330e-04f, -4.366838699e-04f, -2.390934712e-04f, -2.700232027e-05f, +8.376427446e-05f, +8.444382486e-05f, +3.589476488e-05f,\n    /*  3, 1 (24) */\n    -7.473543661e-04f, -2.923237204e-03f, -6.398651594e-03f, -9.548093438e-03f, -9.032988571e-03f, -6.221511552e-04f, +1.900894700e-02f, +5.018688045e-02f, +8.893811853e-02f, +1.273868615e-01f, +1.560209133e-01f, +1.670315244e-01f, +1.572862050e-01f, +1.295608560e-01f, +9.144689147e-02f, +5.245201368e-02f, +2.063771547e-02f, +2.536109885e-04f, -8.782161878e-03f, -9.665580718e-03f, -6.631615582e-03f, -3.110384127e-03f, -8.375710743e-04f, -1.272803854e-06f,\n    +4.294149459e-05f, +9.148723106e-05f, +1.167718107e-04f, +6.404830492e-05f, -1.136769732e-04f, -4.210316793e-04f, -7.969423900e-04f, -1.121060636e-03f, -1.254755552e-03f, -1.101733279e-03f, -6.591535567e-04f, -3.116722669e-05f, +6.057777733e-04f, +1.071682283e-03f, +1.253436160e-03f, +1.143681477e-03f, +8.317151817e-04f, +4.548657984e-04f, +1.374117981e-04f, -5.318465797e-05f, -1.160333507e-04f, -9.561309131e-05f, -4.730310127e-05f, -9.725942243e-06f,\n    +2.308454379e-03f, +5.226973574e-03f, +6.629115661e-03f, +2.853848169e-03f, -7.926902694e-03f, -2.273786328e-02f, -3.363626253e-02f, -3.167753783e-02f, -1.310949286e-02f, +1.653241978e-02f, +4.404260232e-02f, +5.566941063e-02f, +4.535067951e-02f, +1.847279795e-02f, -1.147246196e-02f, -3.099628473e-02f, -3.396830483e-02f, -2.363361349e-02f, -8.796063574e-03f, +2.382922979e-03f, +6.580424299e-03f, +5.395979309e-03f, +2.476185857e-03f, +4.914149908e-04f,\n    -8.208617321e-05f, -8.660649126e-05f, +1.648631167e-05f, +2.245666512e-04f, +4.280861048e-04f, +4.535921347e-04f, +1.856434745e-04f, -3.150688955e-04f, -8.014203357e-04f, -9.734637637e-04f, -6.785011074e-04f, -3.367650675e-05f, +6.288787583e-04f, +9.659521188e-04f, +8.349460613e-04f, +3.661367488e-04f, -1.459264257e-04f, -4.415496956e-04f, -4.407012446e-04f, -2.463467642e-04f, -3.242431918e-05f, +8.217356412e-05f, +8.555233233e-05f, +3.746454073e-05f,\n    /*  3, 2 (24) */\n    -7.044128715e-04f, -2.831749973e-03f, -6.281879783e-03f, -9.484045133e-03f, -9.146665545e-03f, -1.043182834e-03f, +1.821200461e-02f, +4.906581982e-02f, +8.768336298e-02f, +1.262851282e-01f, +1.553617598e-01f, +1.670003572e-01f, +1.578919828e-01f, +1.306325382e-01f, +9.270032763e-02f, +5.359569516e-02f, +2.146943066e-02f, +7.084767869e-04f, -8.644750080e-03f, -9.718765376e-03f, -6.747648932e-03f, -3.205997218e-03f, -8.848741755e-04f, -1.099874610e-05f,\n    +4.151670416e-05f, +9.006791560e-05f, +1.168621514e-04f, +6.741688592e-05f, -1.060288310e-04f, -4.098939964e-04f, -7.852478923e-04f, -1.113135960e-03f, -1.254616975e-03f, -1.111168481e-03f, -6.765771692e-04f, -5.193531372e-05f, +5.876336398e-04f, +1.061089468e-03f, +1.252412474e-03f, +1.150824016e-03f, +8.431878379e-04f, +4.662740262e-04f, +1.455839599e-04f, -4.930753009e-05f, -1.156253717e-04f, -9.693916574e-05f, -4.878361126e-05f, -1.055290011e-05f,\n    +2.226368206e-03f, +5.140367083e-03f, +6.645601972e-03f, +3.078414820e-03f, -7.498816589e-03f, -2.228427115e-02f, -3.345061906e-02f, -3.199260673e-02f, -1.391091319e-02f, +1.555895602e-02f, +4.336410121e-02f, +5.563573413e-02f, +4.597955827e-02f, +1.943875007e-02f, -1.063751590e-02f, -3.063014798e-02f, -3.411423125e-02f, -2.407516319e-02f, -9.236764819e-03f, +2.136576215e-03f, +6.547999980e-03f, +5.478152873e-03f, +2.561738189e-03f, +5.288795315e-04f,\n    -8.084173690e-05f, -8.786080506e-05f, +1.139584045e-05f, +2.173033413e-04f, +4.235166508e-04f, +4.570000917e-04f, +1.984011167e-04f, -2.980153362e-04f, -7.895943690e-04f, -9.750063939e-04f, -6.943308460e-04f, -5.610716341e-05f, +6.116548155e-04f, +9.624854981e-04f, +8.454433646e-04f, +3.830952845e-04f, -1.322243893e-04f, -4.369253578e-04f, -4.445237610e-04f, -2.535863825e-04f, -3.795309249e-05f, +8.046803207e-05f, +8.661081072e-05f, +3.904815034e-05f,\n    /*  3, 3 (24) */\n    -6.628961674e-04f, -2.741682057e-03f, -6.165017631e-03f, -9.416628247e-03f, -9.252694376e-03f, -1.453076831e-03f, +1.742675672e-02f, +4.795268386e-02f, +8.642874600e-02f, +1.251739597e-01f, +1.546851826e-01f, +1.669484219e-01f, +1.584796164e-01f, +1.316936277e-01f, +9.395274011e-02f, +5.474651917e-02f, +2.231261849e-02f, +1.174750813e-03f, -8.499166120e-03f, -9.768072906e-03f, -6.863274304e-03f, -3.302936384e-03f, -9.336577868e-04f, -2.155164621e-05f,\n    +4.010760193e-05f, +8.862912628e-05f, +1.168776089e-04f, +7.066089609e-05f, -9.851370773e-05f, -3.988314213e-04f, -7.735089158e-04f, -1.105025867e-03f, -1.254192209e-03f, -1.120310067e-03f, -6.938087530e-04f, -7.268830890e-05f, +5.693216354e-04f, +1.050212011e-03f, +1.251094331e-03f, +1.157761129e-03f, +8.545939606e-04f, +4.777421116e-04f, +1.538847709e-04f, -4.530091876e-05f, -1.151334936e-04f, -9.823799292e-05f, -5.027615317e-05f, -1.140398583e-05f,\n    +2.145526469e-03f, +5.052506278e-03f, +6.656997813e-03f, +3.295718161e-03f, -7.075299938e-03f, -2.182727105e-02f, -3.325221794e-02f, -3.229062206e-02f, -1.470050756e-02f, +1.458394963e-02f, +4.266977036e-02f, +5.557962696e-02f, +4.659121308e-02f, +2.040123557e-02f, -9.792072538e-03f, -3.024705269e-02f, -3.424645564e-02f, -2.451208855e-02f, -9.681288580e-03f, +1.882989832e-03f, +6.510046887e-03f, +5.558620905e-03f, +2.648349000e-03f, +5.679276819e-04f,\n    -7.955668309e-05f, -8.900590706e-05f, +6.419221105e-06f, +2.100467847e-04f, +4.187742019e-04f, +4.601074287e-04f, +2.109094015e-04f, -2.809627312e-04f, -7.774570446e-04f, -9.760698691e-04f, -7.097916912e-04f, -7.850731232e-05f, +5.941037881e-04f, +9.585374951e-04f, +8.555885112e-04f, +4.000050864e-04f, -1.183005185e-04f, -4.319944063e-04f, -4.481461147e-04f, -2.608070442e-04f, -4.358657619e-05f, +7.864645488e-05f, +8.761689193e-05f, +4.064418164e-05f,\n    /*  3, 4 (24) */\n    -6.227885655e-04f, -2.653052931e-03f, -6.048140022e-03f, -9.345967351e-03f, -9.351208083e-03f, -1.851908252e-03f, +1.665324780e-02f, +4.684765799e-02f, +8.517455379e-02f, +1.240536496e-01f, +1.539913739e-01f, +1.668757336e-01f, +1.590489380e-01f, +1.327438397e-01f, +9.520383444e-02f, +5.590428030e-02f, +2.316721245e-02f, +1.652492925e-03f, -8.345281349e-03f, -9.813373825e-03f, -6.978407798e-03f, -3.401174377e-03f, -9.839339400e-04f, -3.295563204e-05f,\n    +3.871483564e-05f, +8.717235549e-05f, +1.168200048e-04f, +7.378144564e-05f, -9.113227368e-05f, -3.878468170e-04f, -7.617298102e-04f, -1.096734486e-03f, -1.253483196e-03f, -1.129156576e-03f, -7.108436992e-04f, -9.342018411e-05f, +5.508468014e-04f, +1.039052033e-03f, +1.249480374e-03f, +1.164488953e-03f, +8.659290902e-04f, +4.892668230e-04f, +1.623131509e-04f, -4.116397666e-05f, -1.145559393e-04f, -9.950795986e-05f, -5.177991177e-05f, -1.227918995e-05f,\n    +2.065969786e-03f, +4.963500371e-03f, +6.663417034e-03f, +3.505764946e-03f, -6.656525736e-03f, -2.136716363e-02f, -3.304130854e-02f, -3.257158479e-02f, -1.547796461e-02f, +1.360787976e-02f, +4.195997867e-02f, +5.550111965e-02f, +4.718531687e-02f, +2.135977306e-02f, -8.936484026e-03f, -2.984704761e-02f, -3.436475616e-02f, -2.494408295e-02f, -1.012943469e-02f, +1.622182788e-03f, +6.466460311e-03f, +5.637267360e-03f, +2.735965892e-03f, +6.085718635e-04f,\n    -7.823333901e-05f, -9.004336690e-05f, +1.557929709e-06f, +2.028018984e-04f, +4.138643616e-04f, +4.629159086e-04f, +2.231634351e-04f, -2.639208351e-04f, -7.650169907e-04f, -9.766555049e-04f, -7.248759729e-04f, -1.008647784e-04f, +5.762346935e-04f, +9.541085427e-04f, +8.653738534e-04f, +4.168560789e-04f, -1.041609125e-04f, -4.267562251e-04f, -4.515630755e-04f, -2.680034041e-04f, -4.932258818e-05f, +7.670768539e-05f, +8.856820608e-05f, +4.225117502e-05f,\n    /*  3, 5 (24) */\n    -5.840737298e-04f, -2.565880576e-03f, -5.931320018e-03f, -9.272185905e-03f, -9.442340357e-03f, -2.239755069e-03f, +1.589151799e-02f, +4.575092351e-02f, +8.392107060e-02f, +1.229244931e-01f, +1.532805302e-01f, +1.667823134e-01f, +1.595997848e-01f, +1.337828917e-01f, +9.645331481e-02f, +5.706876926e-02f, +2.403314154e-02f, +2.141759748e-03f, -8.182968199e-03f, -9.854537802e-03f, -7.092963737e-03f, -3.500682337e-03f, -1.035713852e-03f, -4.523482199e-05f,\n    +3.733902543e-05f, +8.569907359e-05f, +1.166911641e-04f, +7.677968482e-05f, -8.388513217e-05f, -3.769429824e-04f, -7.499149007e-04f, -1.088265987e-03f, -1.252491970e-03f, -1.137706655e-03f, -7.276774778e-04f, -1.141249198e-04f, +5.322142446e-04f, +1.027611765e-03f, +1.247569347e-03f, +1.171003681e-03f, +8.771887553e-04f, +5.008448706e-04f, +1.708679503e-04f, -3.689590400e-05f, -1.138909429e-04f, -1.007474356e-04f, -5.329404377e-05f, -1.317848272e-05f,\n    +1.987736447e-03f, +4.873457004e-03f, +6.664974964e-03f, +3.708566844e-03f, -6.242661375e-03f, -2.090424772e-02f, -3.281814510e-02f, -3.283550563e-02f, -1.624298160e-02f, +1.263122425e-02f, +4.123510270e-02f, +5.540025487e-02f, +4.776155157e-02f, +2.231388161e-02f, -8.071110173e-03f, -2.943019153e-02f, -3.446891707e-02f, -2.537083918e-02f, -1.058099777e-02f, +1.354179384e-03f, +6.417137723e-03f, +5.713975046e-03f, +2.824534098e-03f, +6.508230385e-04f,\n    -7.687401763e-05f, -9.097481622e-05f, -3.186674108e-06f, +1.955735175e-04f, +4.087927792e-04f, +4.654274759e-04f, +2.351585315e-04f, -2.468993268e-04f, -7.522829769e-04f, -9.767649031e-04f, -7.395762632e-04f, -1.231674144e-04f, +5.580567552e-04f, +9.491993685e-04f, +8.747919281e-04f, +4.336381561e-04f, -8.981186280e-05f, -4.212103984e-04f, -4.547694920e-04f, -2.751700567e-04f, -5.515882843e-05f, +7.465065498e-05f, +8.946238374e-05f, +4.386762395e-05f,\n    /*  3, 6 (24) */\n    -5.467347044e-04f, -2.480181502e-03f, -5.814628854e-03f, -9.195406221e-03f, -9.526225489e-03f, -2.616698052e-03f, +1.514160309e-02f, +4.466265752e-02f, +8.266857863e-02f, +1.217867864e-01f, +1.525528527e-01f, +1.666681885e-01f, +1.601319991e-01f, +1.348105035e-01f, +9.770088416e-02f, +5.823977294e-02f, +2.491033030e-02f, +2.642604618e-03f, -8.012100248e-03f, -9.891433706e-03f, -7.206854680e-03f, -3.601429772e-03f, -1.089007895e-03f, -5.841330471e-05f,\n    +3.598076395e-05f, +8.421072848e-05f, +1.164929146e-04f, +7.965680278e-05f, -7.677282003e-05f, -3.661226517e-04f, -7.380684864e-04f, -1.079624571e-03f, -1.251220658e-03f, -1.145959062e-03f, -7.443056386e-04f, -1.347965074e-04f, +5.134291353e-04f, +1.015893545e-03f, +1.245360095e-03f, +1.177301558e-03f, +8.883684744e-04f, +5.124729073e-04f, +1.795479501e-04f, -3.249594950e-05f, -1.131367508e-04f, -1.019547717e-04f, -5.481767783e-05f, -1.410181368e-05f,\n    +1.910862429e-03f, +4.782482188e-03f, +6.661788290e-03f, +3.904140362e-03f, -5.833868595e-03f, -2.043882024e-02f, -3.258298657e-02f, -3.308240496e-02f, -1.699526457e-02f, +1.165445935e-02f, +4.049552644e-02f, +5.527708746e-02f, +4.831960832e-02f, +2.326308098e-02f, -7.196318245e-03f, -2.899655337e-02f, -3.455872894e-02f, -2.579204958e-02f, -1.103576726e-02f, +1.079009327e-03f, +6.361978894e-03f, +5.788625701e-03f, +2.913996481e-03f, +6.946906625e-04f,\n    -7.548101566e-05f, -9.180194618e-05f, -7.813346558e-06f, +1.883663929e-04f, +4.035651448e-04f, +4.676442529e-04f, +2.468902149e-04f, -2.299078035e-04f, -7.392639072e-04f, -9.763999499e-04f, -7.538853802e-04f, -1.454031092e-04f, +5.395793965e-04f, +9.438109947e-04f, +8.838354626e-04f, +4.503411878e-04f, -7.525985006e-05f, -4.153567124e-04f, -4.577602963e-04f, -2.823015400e-04f, -6.109287905e-05f, +7.247437578e-05f, +9.029705817e-05f, +4.549197558e-05f,\n    /*  3, 7 (24) */\n    -5.107539404e-04f, -2.395970773e-03f, -5.698135939e-03f, -9.115749418e-03f, -9.602998309e-03f, -2.982820703e-03f, +1.440353461e-02f, +4.358303295e-02f, +8.141735797e-02f, +1.206408274e-01f, +1.518085470e-01f, +1.665333920e-01f, +1.606454282e-01f, +1.358263971e-01f, +9.894624425e-02f, +5.941707449e-02f, +2.579869877e-02f, +3.155077526e-03f, -7.832552298e-03f, -9.923929655e-03f, -7.319991431e-03f, -3.703384544e-03f, -1.143825573e-03f, -7.251511839e-05f,\n    +3.464061654e-05f, +8.270874508e-05f, +1.162270856e-04f, +8.241402644e-05f, -6.979580815e-05f, -3.553884937e-04f, -7.261948385e-04f, -1.070814478e-03f, -1.249671477e-03f, -1.153912669e-03f, -7.607238135e-04f, -1.554289519e-04f, +4.944967052e-04f, +1.003899819e-03f, +1.242851567e-03f, +1.183378883e-03f, +8.994637579e-04f, +5.241475292e-04f, +1.883518612e-04f, -2.796341146e-05f, -1.122916229e-04f, -1.031283033e-04f, -5.634991455e-05f, -1.504911122e-05f,\n    +1.835381414e-03f, +4.690680242e-03f, +6.653974943e-03f, +4.092506755e-03f, -5.430303451e-03f, -1.997117599e-02f, -3.233609636e-02f, -3.331231276e-02f, -1.773452848e-02f, +1.067805940e-02f, +3.974164106e-02f, +5.513168435e-02f, +4.885918772e-02f, +2.420689197e-02f, -6.312482782e-03f, -2.854621219e-02f, -3.463398879e-02f, -2.620740629e-02f, -1.149352756e-02f, +7.967077873e-04f, +6.300886015e-03f, +5.861100077e-03f, +3.004293539e-03f, +7.401826381e-04f,\n    -7.405661171e-05f, -9.252650505e-05f, -1.232095899e-05f, +1.811851882e-04f, +3.981871848e-04f, +4.695685371e-04f, +2.583542202e-04f, -2.129557746e-04f, -7.259688140e-04f, -9.755628138e-04f, -7.677963930e-04f, -1.675597955e-04f, +5.208122351e-04f, +9.379447391e-04f, +8.924973807e-04f, +4.669550271e-04f, -6.051154104e-05f, -4.091951571e-04f, -4.605305087e-04f, -2.893923386e-04f, -6.712220468e-05f, +7.017794291e-05f, +9.106986765e-05f, +4.712263144e-05f,\n    /*  3, 8 (24) */\n    -4.761133239e-04f, -2.313262028e-03f, -5.581908853e-03f, -9.033335391e-03f, -9.672794117e-03f, -3.338209197e-03f, +1.367733977e-02f, +4.251221847e-02f, +8.016768649e-02f, +1.194869147e-01f, +1.510478232e-01f, +1.663779630e-01f, +1.611399249e-01f, +1.368302969e-01f, +1.001890958e-01f, +6.060045338e-02f, +2.669816253e-02f, +3.679225055e-03f, -7.644200437e-03f, -9.951893067e-03f, -7.432283053e-03f, -3.806512847e-03f, -1.200175488e-03f, -8.756422961e-05f,\n    +3.331912137e-05f, +8.119452490e-05f, +1.158955069e-04f, +8.505261935e-05f, -6.295450197e-05f, -3.447431114e-04f, -7.142981987e-04f, -1.061839975e-03f, -1.247846734e-03f, -1.161566456e-03f, -7.769277177e-04f, -1.760162742e-04f, +4.754222452e-04f, +9.916331371e-04f, +1.240042814e-03f, +1.189232016e-03f, +9.104701097e-04f, +5.358652772e-04f, +1.972783248e-04f, -2.329763868e-05f, -1.113538339e-04f, -1.042663492e-04f, -5.788982657e-05f, -1.602028222e-05f,\n    +1.761324802e-03f, +4.598153737e-03f, +6.641653984e-03f, +4.273691943e-03f, -5.032116266e-03f, -1.950160745e-02f, -3.207774214e-02f, -3.352526853e-02f, -1.846049729e-02f, +9.702496584e-03f, +3.897384466e-02f, +5.496412455e-02f, +4.937999995e-02f, +2.514483671e-02f, -5.419985402e-03f, -2.807925716e-02f, -3.469450033e-02f, -2.661660145e-02f, -1.195405807e-02f, +5.073154486e-04f, +6.233763811e-03f, +5.931278019e-03f, +3.095363407e-03f, +7.873052695e-04f,\n    -7.260306441e-05f, -9.315029562e-05f, -1.670849714e-05f, +1.740344774e-04f, +3.926646570e-04f, +4.712027976e-04f, +2.695464950e-04f, -1.960526557e-04f, -7.124068508e-04f, -9.742559428e-04f, -7.813026251e-04f, -1.896254575e-04f, +5.017650765e-04f, +9.316022141e-04f, +9.007708077e-04f, +4.834695166e-04f, -4.557378534e-05f, -4.027259288e-04f, -4.630752424e-04f, -2.964368879e-04f, -7.324415279e-05f, +6.776053655e-05f, +9.177845775e-05f, +4.875794816e-05f,\n    /*  3, 9 (24) */\n    -4.427942025e-04f, -2.232067503e-03f, -5.466013346e-03f, -8.948282772e-03f, -9.735748619e-03f, -3.682952308e-03f, +1.296304157e-02f, +4.145037849e-02f, +7.891983976e-02f, +1.183253482e-01f, +1.502708955e-01f, +1.662019467e-01f, +1.616153472e-01f, +1.378219300e-01f, +1.014291386e-01f, +6.178968539e-02f, +2.760863264e-02f, +4.215090332e-03f, -7.446922112e-03f, -9.975190705e-03f, -7.543636887e-03f, -3.910779196e-03f, -1.258065314e-03f, -1.035845118e-04f,\n    +3.201678962e-05f, +7.966944564e-05f, +1.155000078e-04f, +8.757388061e-05f, -5.624924209e-05f, -3.341890411e-04f, -7.023827773e-04f, -1.052705362e-03f, -1.245748821e-03f, -1.168919517e-03f, -7.929131518e-04f, -1.965525135e-04f, +4.562111037e-04f, +9.790961562e-04f, +1.236932995e-03f, +1.194857373e-03f, +9.213830297e-04f, +5.476226379e-04f, +2.063259119e-04f, -1.849803145e-05f, -1.103216742e-04f, -1.053672132e-04f, -5.943645860e-05f, -1.701521163e-05f,\n    +1.688721738e-03f, +4.505003441e-03f, +6.624945487e-03f, +4.447726420e-03f, -4.639451609e-03f, -1.903040465e-02f, -3.180819564e-02f, -3.372132119e-02f, -1.917290414e-02f, +8.728240641e-03f, +3.819254204e-02f, +5.477449910e-02f, +4.988176503e-02f, +2.607643892e-02f, -4.519214594e-03f, -2.759578764e-02f, -3.474007411e-02f, -2.701932737e-02f, -1.241713331e-02f, +2.108785608e-04f, +6.160519658e-03f, +5.999038556e-03f, +3.187141865e-03f, +8.360632177e-04f,\n    -7.112261064e-05f, -9.367517274e-05f, -2.097506020e-05f, +1.669187426e-04f, +3.870033460e-04f, +4.725496714e-04f, +2.804632006e-04f, -1.792077627e-04f, -6.985872860e-04f, -9.724820624e-04f, -7.943976588e-04f, -2.115881394e-04f, +4.824479080e-04f, +9.247853271e-04f, +9.086490765e-04f, +4.998744954e-04f, -3.045361205e-05f, -3.959494315e-04f, -4.653897081e-04f, -3.034295771e-04f, -7.945595420e-05f, +6.522142408e-05f, +9.242048371e-05f, +5.039623831e-05f,\n    /*  3,10 (24) */\n    -4.107774129e-04f, -2.152398058e-03f, -5.350513339e-03f, -8.860708891e-03f, -9.791997861e-03f, -4.017141350e-03f, +1.226065879e-02f, +4.039767313e-02f, +7.767409094e-02f, +1.171564287e-01f, +1.494779824e-01f, +1.660053942e-01f, +1.620715583e-01f, +1.388010262e-01f, +1.026660716e-01f, +6.298454277e-02f, +2.853001567e-02f, +4.762712970e-03f, -7.240596200e-03f, -9.993688737e-03f, -7.653958562e-03f, -4.016146410e-03f, -1.317501773e-03f, -1.205997235e-04f,\n    +3.073410572e-05f, +7.813486075e-05f, +1.150424160e-04f, +8.997914366e-05f, -4.968030480e-05f, -3.237287524e-04f, -6.904527520e-04f, -1.043414965e-03f, -1.243380221e-03f, -1.175971057e-03f, -8.086760026e-04f, -2.170317298e-04f, +4.368686841e-04f, +9.662916374e-04f, +1.233521370e-03f, +1.200251434e-03f, +9.321980153e-04f, +5.594160446e-04f, +2.154931235e-04f, -1.356404255e-05f, -1.091934511e-04f, -1.064291845e-04f, -6.098882748e-05f, -1.803376207e-05f,\n    +1.617599127e-03f, +4.411328268e-03f, +6.603970427e-03f, +4.614645163e-03f, -4.252448263e-03f, -1.855785498e-02f, -3.152773244e-02f, -3.390052895e-02f, -1.987149143e-02f, +7.755758579e-03f, +3.739814438e-02f, +5.456291096e-02f, +5.036421294e-02f, +2.700122425e-02f, -3.610565517e-03f, -2.709591315e-02f, -3.477052773e-02f, -2.741527681e-02f, -1.288252302e-02f, -9.255101630e-05f, +6.081063704e-03f, +6.064259980e-03f, +3.279562349e-03f, +8.864594560e-04f,\n    -6.961746379e-05f, -9.410304080e-05f, -2.511985993e-05f, +1.598423714e-04f, +3.812090587e-04f, +4.736119604e-04f, +2.911007126e-04f, -1.624303064e-04f, -6.845194958e-04f, -9.702441724e-04f, -8.070753387e-04f, -2.334359524e-04f, +4.628708924e-04f, +9.174962798e-04f, +9.161257322e-04f, +5.161598063e-04f, -1.515822609e-05f, -3.888662781e-04f, -4.674692186e-04f, -3.103647537e-04f, -8.575472369e-05f, +6.255996215e-05f, +9.299361279e-05f, +5.203577121e-05f,\n    /*  3,11 (24) */\n    -3.800433072e-04f, -2.074263197e-03f, -5.235470923e-03f, -8.770729748e-03f, -9.841678166e-03f, -4.340870102e-03f, +1.157020604e-02f, +3.935425817e-02f, +7.643071072e-02f, +1.159804577e-01f, +1.486693064e-01f, +1.657883625e-01f, +1.625084270e-01f, +1.397673178e-01f, +1.038995930e-01f, +6.418479420e-02f, +2.946221369e-02f, +5.322129014e-03f, -7.025103077e-03f, -1.000725278e-02f, -7.763152013e-03f, -4.122575594e-03f, -1.378490601e-03f, -1.386334855e-04f,\n    +2.947152747e-05f, +7.659209903e-05f, +1.145245570e-04f, +9.226977516e-05f, -4.324790277e-05f, -3.133646471e-04f, -6.785122664e-04f, -1.033973138e-03f, -1.240743497e-03f, -1.182720392e-03f, -8.242122456e-04f, -2.374480061e-04f, +4.174004428e-04f, +9.532224458e-04f, +1.229807311e-03f, +1.205410740e-03f, +9.429105634e-04f, +5.712418783e-04f, +2.247783902e-04f, -8.495178141e-06f, -1.079674899e-04f, -1.074505383e-04f, -6.254592231e-05f, -1.907577351e-05f,\n    +1.547981663e-03f, +4.317225227e-03f, +6.578850567e-03f, +4.774487534e-03f, -3.871239204e-03f, -1.808424302e-02f, -3.123663173e-02f, -3.406295926e-02f, -2.055601093e-02f, +6.785514407e-03f, +3.659106904e-02f, +5.432947500e-02f, +5.082708383e-02f, +2.791872053e-02f, -2.694439785e-03f, -2.657975334e-02f, -3.478568595e-02f, -2.780414308e-02f, -1.334999224e-02f, -4.029157700e-04f, +5.995308980e-03f, +6.126819942e-03f, +3.372555961e-03f, +9.384952272e-04f,\n    -6.808981202e-05f, -9.443585119e-05f, -2.914221957e-05f, +1.528096552e-04f, +3.752876194e-04f, +4.743926272e-04f, +3.014556219e-04f, -1.457293867e-04f, -6.702129574e-04f, -9.675455443e-04f, -8.193297752e-04f, -2.551570831e-04f, +4.430443616e-04f, +9.097375674e-04f, +9.231945381e-04f, +5.323153022e-04f, +3.049954096e-07f, -3.814772927e-04f, -4.693091933e-04f, -3.172367269e-04f, -9.213746067e-05f, +5.977559862e-05f, +9.349552672e-05f, +5.367477390e-05f,\n    /*  3,12 (24) */\n    -3.505717797e-04f, -1.997671098e-03f, -5.120946366e-03f, -8.678459973e-03f, -9.884926069e-03f, -4.654234749e-03f, +1.089169377e-02f, +3.832028503e-02f, +7.518996722e-02f, +1.147977373e-01f, +1.478450941e-01f, +1.655509145e-01f, +1.629258274e-01f, +1.407205403e-01f, +1.051294003e-01f, +6.539020494e-02f, +3.040512425e-02f, +5.893370893e-03f, -6.800324687e-03f, -1.001574796e-02f, -7.871119503e-03f, -4.230026132e-03f, -1.441036523e-03f, -1.577092590e-04f,\n    +2.822948635e-05f, +7.504246434e-05f, +1.139482527e-04f, +9.444717383e-05f, -3.695218563e-05f, -3.030990593e-04f, -6.665654277e-04f, -1.024384255e-03f, -1.237841299e-03f, -1.189166949e-03f, -8.395179455e-04f, -2.577954513e-04f, +3.978118871e-04f, +9.398915490e-04f, +1.225790291e-03f, +1.210331898e-03f, +9.535161724e-04f, +5.830964695e-04f, +2.341800727e-04f, -3.290998695e-06f, -1.066421355e-04f, -1.084295370e-04f, -6.410670458e-05f, -2.014106283e-05f,\n    +1.479891851e-03f, +4.222789376e-03f, +6.549708347e-03f, +4.927297190e-03f, -3.495951585e-03f, -1.760985039e-02f, -3.093517611e-02f, -3.420868864e-02f, -2.122622388e-02f, +5.817968862e-03f, +3.577173927e-02f, +5.407431792e-02f, +5.127012819e-02f, +2.882845810e-02f, -1.771245247e-03f, -2.604743804e-02f, -3.478538096e-02f, -2.818562038e-02f, -1.381930143e-02f, -7.201524968e-04f, +5.903171519e-03f, +6.186595541e-03f, +3.466051488e-03f, +9.921700011e-04f,\n    -6.654181667e-05f, -9.467559976e-05f, -3.304157275e-05f, +1.458247867e-04f, +3.692448657e-04f, +4.748947917e-04f, +3.115247356e-04f, -1.291139872e-04f, -6.556772422e-04f, -9.643897178e-04f, -8.311553482e-04f, -2.767398011e-04f, +4.229788096e-04f, +9.015119779e-04f, +9.298494802e-04f, +5.483308534e-04f, +1.592850708e-05f, -3.737835110e-04f, -4.709051630e-04f, -3.240397715e-04f, -9.860105002e-05f, +5.686787454e-05f, +9.392392406e-05f, +5.531143209e-05f,\n    /*  3,13 (24) */\n    -3.223422934e-04f, -1.922628634e-03f, -5.006998113e-03f, -8.584012799e-03f, -9.921878255e-03f, -4.957333808e-03f, +1.022512834e-02f, +3.729590077e-02f, +7.395212592e-02f, +1.136085703e-01f, +1.470055762e-01f, +1.652931190e-01f, +1.633236393e-01f, +1.416604318e-01f, +1.063551906e-01f, +6.660053684e-02f, +3.135864042e-02f, +6.476467362e-03f, -6.566144614e-03f, -1.001903896e-02f, -7.977761638e-03f, -4.338455669e-03f, -1.505143227e-03f, -1.778503219e-04f,\n    +2.700838771e-05f, +7.348723518e-05f, +1.133153205e-04f, +9.651276932e-05f, -3.079324068e-05f, -2.929342549e-04f, -6.546163060e-04f, -1.014652716e-03f, -1.234676357e-03f, -1.195310268e-03f, -8.545892583e-04f, -2.780682019e-04f, +3.781085727e-04f, +9.263020168e-04f, +1.221469894e-03f, +1.215011582e-03f, +9.640103445e-04f, +5.949760984e-04f, +2.436964612e-04f, +2.048880094e-06f, -1.052157528e-04f, -1.093644307e-04f, -6.567010828e-05f, -2.122942351e-05f,\n    +1.413350034e-03f, +4.128113776e-03f, +6.516666774e-03f, +5.073121976e-03f, -3.126706719e-03f, -1.713495560e-02f, -3.062365137e-02f, -3.433780263e-02f, -2.188190113e-02f, +4.853579145e-03f, +3.494058392e-02f, +5.379757812e-02f, +5.169310700e-02f, +2.972997008e-02f, -8.413957668e-04f, -2.549910718e-02f, -3.476945245e-02f, -2.855940389e-02f, -1.429020659e-02f, -1.044192268e-03f, +5.804570469e-03f, +6.243463415e-03f, +3.559975412e-03f, +1.047481433e-03f,\n    -6.497561062e-05f, -9.482432426e-05f, -3.681746224e-05f, +1.388918578e-04f, +3.630866432e-04f, +4.751217272e-04f, +3.213050770e-04f, -1.125929696e-04f, -6.409220088e-04f, -9.607804978e-04f, -8.425467097e-04f, -2.981724664e-04f, +4.026848863e-04f, +8.928225909e-04f, +9.360847722e-04f, +5.641963547e-04f, +3.170459927e-05f, -3.657861821e-04f, -4.722527742e-04f, -3.307681324e-04f, -1.051422630e-04f, +5.383642604e-05f, +9.427652269e-05f, +5.694389116e-05f,\n    /*  3,14 (24) */\n    -2.953339057e-04f, -1.849141399e-03f, -4.893682792e-03f, -8.487500029e-03f, -9.952671495e-03f, -5.250268063e-03f, +9.570512039e-03f, +3.628124806e-02f, +7.271744956e-02f, +1.124132600e-01f, +1.461509869e-01f, +1.650150508e-01f, +1.637017479e-01f, +1.425867338e-01f, +1.075766605e-01f, +6.781554842e-02f, +3.232265077e-02f, +7.071443461e-03f, -6.322448153e-03f, -1.001699008e-02f, -8.082977391e-03f, -4.447820100e-03f, -1.570813336e-03f, -1.990797454e-04f,\n    +2.580861103e-05f, +7.192766441e-05f, +1.126275727e-04f, +9.846802098e-05f, -2.477109356e-05f, -2.828724308e-04f, -6.426689324e-04f, -1.004782937e-03f, -1.231251482e-03f, -1.201149997e-03f, -8.694224322e-04f, -2.982604250e-04f, +3.582961021e-04f, +9.124570196e-04f, +1.216845811e-03f, +1.219446534e-03f, +9.743885871e-04f, +6.068769973e-04f, +2.533257760e-04f, +7.524786438e-06f, -1.036867286e-04f, -1.102534579e-04f, -6.723504006e-05f, -2.234062528e-05f,\n    +1.348374424e-03f, +4.033289452e-03f, +6.479849312e-03f, +5.212013834e-03f, -2.763620076e-03f, -1.665983388e-02f, -3.030234629e-02f, -3.445039560e-02f, -2.252282313e-02f, +3.892798647e-03f, +3.409803721e-02f, +5.349940565e-02f, +5.209579189e-02f, +3.062279267e-02f, +9.468900538e-05f, -2.493491083e-02f, -3.473774785e-02f, -2.892519007e-02f, -1.476245937e-02f, -1.374960401e-03f, +5.699428206e-03f, +6.297299841e-03f, +3.654251935e-03f, +1.104425324e-03f,\n    -6.339329680e-05f, -9.488410187e-05f, -4.046953872e-05f, +1.320148582e-04f, +3.568188019e-04f, +4.750768565e-04f, +3.307938859e-04f, -9.617506873e-05f, -6.259569963e-04f, -9.567219509e-04f, -8.534987871e-04f, -3.194435369e-04f, +3.821733903e-04f, +8.836727763e-04f, +9.418948604e-04f, +5.799017319e-04f, +4.762540224e-05f, -3.574867691e-04f, -4.733477932e-04f, -3.374160279e-04f, -1.117577581e-04f, +5.068098615e-05f, +9.455106226e-05f, +5.857025732e-05f,\n    /*  3,15 (24) */\n    -2.695252946e-04f, -1.777213734e-03f, -4.781055220e-03f, -8.389032008e-03f, -9.977442589e-03f, -5.533140494e-03f, +8.927843106e-03f, +3.527646512e-02f, +7.148619808e-02f, +1.112121100e-01f, +1.452815645e-01f, +1.647167904e-01f, +1.640600440e-01f, +1.434991908e-01f, +1.087935063e-01f, +6.903499495e-02f, +3.329703935e-02f, +7.678320458e-03f, -6.069122377e-03f, -1.000946529e-02f, -8.186664119e-03f, -4.558073558e-03f, -1.638048376e-03f, -2.214203707e-04f,\n    +2.463051020e-05f, +7.036497893e-05f, +1.118868151e-04f, +1.003144168e-04f, -1.888570902e-05f, -2.729157153e-04f, -6.307272977e-04f, -9.947793529e-04f, -1.227569562e-03f, -1.206685899e-03f, -8.840138096e-04f, -3.183663200e-04f, +3.383801218e-04f, +8.983598275e-04f, +1.211917843e-03f, +1.223633566e-03f, +9.846464151e-04f, +6.187953507e-04f, +2.630661673e-04f, +1.313699159e-05f, -1.020534721e-04f, -1.110948466e-04f, -6.880037942e-05f, -2.347441378e-05f,\n    +1.284981127e-03f, +3.938405350e-03f, +6.439379774e-03f, +5.344028692e-03f, -2.406801274e-03f, -1.618475702e-02f, -2.997155241e-02f, -3.454657067e-02f, -2.314878013e-02f, +2.936076696e-03f, +3.324453842e-02f, +5.317996212e-02f, +5.247796528e-02f, +3.150646544e-02f, +1.036583866e-03f, -2.435500910e-02f, -3.469012245e-02f, -2.928267684e-02f, -1.523580716e-02f, -1.712376429e-03f, +5.587670448e-03f, +6.347980828e-03f, +3.748802997e-03f, +1.162995582e-03f,\n    -6.179694664e-05f, -9.485704656e-05f, -4.399755940e-05f, +1.251976733e-04f, +3.504471909e-04f, +4.747637479e-04f, +3.399886191e-04f, -7.986888717e-05f, -6.107920170e-04f, -9.522184016e-04f, -8.640067861e-04f, -3.405415765e-04f, +3.614552619e-04f, +8.740661928e-04f, +9.472744285e-04f, +5.954369495e-04f, +6.368289049e-05f, -3.488869502e-04f, -4.741861112e-04f, -3.439776545e-04f, -1.184440826e-04f, +4.740138658e-05f, +9.474530667e-05f, +6.018859872e-05f,\n    /*  3,16 (24) */\n    -2.448947844e-04f, -1.706848755e-03f, -4.669168405e-03f, -8.288717592e-03f, -9.996328298e-03f, -5.806056209e-03f, +8.297115809e-03f, +3.428168577e-02f, +7.025862852e-02f, +1.100054241e-01f, +1.443975507e-01f, +1.643984241e-01f, +1.643984241e-01f, +1.443975507e-01f, +1.100054241e-01f, +7.025862852e-02f, +3.428168577e-02f, +8.297115809e-03f, -5.806056209e-03f, -9.996328298e-03f, -8.288717592e-03f, -4.669168405e-03f, -1.706848755e-03f, -2.448947844e-04f,\n    +2.347441378e-05f, +6.880037942e-05f, +1.110948466e-04f, +1.020534721e-04f, -1.313699159e-05f, -2.630661673e-04f, -6.187953507e-04f, -9.846464151e-04f, -1.223633566e-03f, -1.211917843e-03f, -8.983598275e-04f, -3.383801218e-04f, +3.183663200e-04f, +8.840138096e-04f, +1.206685899e-03f, +1.227569562e-03f, +9.947793529e-04f, +6.307272977e-04f, +2.729157153e-04f, +1.888570902e-05f, -1.003144168e-04f, -1.118868151e-04f, -7.036497893e-05f, -2.463051020e-05f,\n    +1.223184180e-03f, +3.843548304e-03f, +6.395382214e-03f, +5.469226366e-03f, -2.056354083e-03f, -1.570999327e-02f, -2.963156379e-02f, -3.462643956e-02f, -2.375957215e-02f, +1.983858294e-03f, +3.238053164e-02f, +5.283942054e-02f, +5.283942054e-02f, +3.238053164e-02f, +1.983858294e-03f, -2.375957215e-02f, -3.462643956e-02f, -2.963156379e-02f, -1.570999327e-02f, -2.056354083e-03f, +5.469226366e-03f, +6.395382214e-03f, +3.843548304e-03f, +1.223184180e-03f,\n    -6.018859872e-05f, -9.474530667e-05f, -4.740138658e-05f, +1.184440826e-04f, +3.439776545e-04f, +4.741861112e-04f, +3.488869502e-04f, -6.368289049e-05f, -5.954369495e-04f, -9.472744285e-04f, -8.740661928e-04f, -3.614552619e-04f, +3.405415765e-04f, +8.640067861e-04f, +9.522184016e-04f, +6.107920170e-04f, +7.986888717e-05f, -3.399886191e-04f, -4.747637479e-04f, -3.504471909e-04f, -1.251976733e-04f, +4.399755940e-05f, +9.485704656e-05f, +6.179694664e-05f,\n    /*  3,17 (24) */\n    -2.214203707e-04f, -1.638048376e-03f, -4.558073558e-03f, -8.186664119e-03f, -1.000946529e-02f, -6.069122377e-03f, +7.678320458e-03f, +3.329703935e-02f, +6.903499495e-02f, +1.087935063e-01f, +1.434991908e-01f, +1.640600440e-01f, +1.647167904e-01f, +1.452815645e-01f, +1.112121100e-01f, +7.148619808e-02f, +3.527646512e-02f, +8.927843106e-03f, -5.533140494e-03f, -9.977442589e-03f, -8.389032008e-03f, -4.781055220e-03f, -1.777213734e-03f, -2.695252946e-04f,\n    +2.234062528e-05f, +6.723504006e-05f, +1.102534579e-04f, +1.036867286e-04f, -7.524786438e-06f, -2.533257760e-04f, -6.068769973e-04f, -9.743885871e-04f, -1.219446534e-03f, -1.216845811e-03f, -9.124570196e-04f, -3.582961021e-04f, +2.982604250e-04f, +8.694224322e-04f, +1.201149997e-03f, +1.231251482e-03f, +1.004782937e-03f, +6.426689324e-04f, +2.828724308e-04f, +2.477109356e-05f, -9.846802098e-05f, -1.126275727e-04f, -7.192766441e-05f, -2.580861103e-05f,\n    +1.162995582e-03f, +3.748802997e-03f, +6.347980828e-03f, +5.587670448e-03f, -1.712376429e-03f, -1.523580716e-02f, -2.928267684e-02f, -3.469012245e-02f, -2.435500910e-02f, +1.036583866e-03f, +3.150646544e-02f, +5.247796528e-02f, +5.317996212e-02f, +3.324453842e-02f, +2.936076696e-03f, -2.314878013e-02f, -3.454657067e-02f, -2.997155241e-02f, -1.618475702e-02f, -2.406801274e-03f, +5.344028692e-03f, +6.439379774e-03f, +3.938405350e-03f, +1.284981127e-03f,\n    -5.857025732e-05f, -9.455106226e-05f, -5.068098615e-05f, +1.117577581e-04f, +3.374160279e-04f, +4.733477932e-04f, +3.574867691e-04f, -4.762540224e-05f, -5.799017319e-04f, -9.418948604e-04f, -8.836727763e-04f, -3.821733903e-04f, +3.194435369e-04f, +8.534987871e-04f, +9.567219509e-04f, +6.259569963e-04f, +9.617506873e-05f, -3.307938859e-04f, -4.750768565e-04f, -3.568188019e-04f, -1.320148582e-04f, +4.046953872e-05f, +9.488410187e-05f, +6.339329680e-05f,\n    /*  3,18 (24) */\n    -1.990797454e-04f, -1.570813336e-03f, -4.447820100e-03f, -8.082977391e-03f, -1.001699008e-02f, -6.322448153e-03f, +7.071443461e-03f, +3.232265077e-02f, +6.781554842e-02f, +1.075766605e-01f, +1.425867338e-01f, +1.637017479e-01f, +1.650150508e-01f, +1.461509869e-01f, +1.124132600e-01f, +7.271744956e-02f, +3.628124806e-02f, +9.570512039e-03f, -5.250268063e-03f, -9.952671495e-03f, -8.487500029e-03f, -4.893682792e-03f, -1.849141399e-03f, -2.953339057e-04f,\n    +2.122942351e-05f, +6.567010828e-05f, +1.093644307e-04f, +1.052157528e-04f, -2.048880094e-06f, -2.436964612e-04f, -5.949760984e-04f, -9.640103445e-04f, -1.215011582e-03f, -1.221469894e-03f, -9.263020168e-04f, -3.781085727e-04f, +2.780682019e-04f, +8.545892583e-04f, +1.195310268e-03f, +1.234676357e-03f, +1.014652716e-03f, +6.546163060e-04f, +2.929342549e-04f, +3.079324068e-05f, -9.651276932e-05f, -1.133153205e-04f, -7.348723518e-05f, -2.700838771e-05f,\n    +1.104425324e-03f, +3.654251935e-03f, +6.297299841e-03f, +5.699428206e-03f, -1.374960401e-03f, -1.476245937e-02f, -2.892519007e-02f, -3.473774785e-02f, -2.493491083e-02f, +9.468900538e-05f, +3.062279267e-02f, +5.209579189e-02f, +5.349940565e-02f, +3.409803721e-02f, +3.892798647e-03f, -2.252282313e-02f, -3.445039560e-02f, -3.030234629e-02f, -1.665983388e-02f, -2.763620076e-03f, +5.212013834e-03f, +6.479849312e-03f, +4.033289452e-03f, +1.348374424e-03f,\n    -5.694389116e-05f, -9.427652269e-05f, -5.383642604e-05f, +1.051422630e-04f, +3.307681324e-04f, +4.722527742e-04f, +3.657861821e-04f, -3.170459927e-05f, -5.641963547e-04f, -9.360847722e-04f, -8.928225909e-04f, -4.026848863e-04f, +2.981724664e-04f, +8.425467097e-04f, +9.607804978e-04f, +6.409220088e-04f, +1.125929696e-04f, -3.213050770e-04f, -4.751217272e-04f, -3.630866432e-04f, -1.388918578e-04f, +3.681746224e-05f, +9.482432426e-05f, +6.497561062e-05f,\n    /*  3,19 (24) */\n    -1.778503219e-04f, -1.505143227e-03f, -4.338455669e-03f, -7.977761638e-03f, -1.001903896e-02f, -6.566144614e-03f, +6.476467362e-03f, +3.135864042e-02f, +6.660053684e-02f, +1.063551906e-01f, +1.416604318e-01f, +1.633236393e-01f, +1.652931190e-01f, +1.470055762e-01f, +1.136085703e-01f, +7.395212592e-02f, +3.729590077e-02f, +1.022512834e-02f, -4.957333808e-03f, -9.921878255e-03f, -8.584012799e-03f, -5.006998113e-03f, -1.922628634e-03f, -3.223422934e-04f,\n    +2.014106283e-05f, +6.410670458e-05f, +1.084295370e-04f, +1.066421355e-04f, +3.290998695e-06f, -2.341800727e-04f, -5.830964695e-04f, -9.535161724e-04f, -1.210331898e-03f, -1.225790291e-03f, -9.398915490e-04f, -3.978118871e-04f, +2.577954513e-04f, +8.395179455e-04f, +1.189166949e-03f, +1.237841299e-03f, +1.024384255e-03f, +6.665654277e-04f, +3.030990593e-04f, +3.695218563e-05f, -9.444717383e-05f, -1.139482527e-04f, -7.504246434e-05f, -2.822948635e-05f,\n    +1.047481433e-03f, +3.559975412e-03f, +6.243463415e-03f, +5.804570469e-03f, -1.044192268e-03f, -1.429020659e-02f, -2.855940389e-02f, -3.476945245e-02f, -2.549910718e-02f, -8.413957668e-04f, +2.972997008e-02f, +5.169310700e-02f, +5.379757812e-02f, +3.494058392e-02f, +4.853579145e-03f, -2.188190113e-02f, -3.433780263e-02f, -3.062365137e-02f, -1.713495560e-02f, -3.126706719e-03f, +5.073121976e-03f, +6.516666774e-03f, +4.128113776e-03f, +1.413350034e-03f,\n    -5.531143209e-05f, -9.392392406e-05f, -5.686787454e-05f, +9.860105002e-05f, +3.240397715e-04f, +4.709051630e-04f, +3.737835110e-04f, -1.592850708e-05f, -5.483308534e-04f, -9.298494802e-04f, -9.015119779e-04f, -4.229788096e-04f, +2.767398011e-04f, +8.311553482e-04f, +9.643897178e-04f, +6.556772422e-04f, +1.291139872e-04f, -3.115247356e-04f, -4.748947917e-04f, -3.692448657e-04f, -1.458247867e-04f, +3.304157275e-05f, +9.467559976e-05f, +6.654181667e-05f,\n    /*  3,20 (24) */\n    -1.577092590e-04f, -1.441036523e-03f, -4.230026132e-03f, -7.871119503e-03f, -1.001574796e-02f, -6.800324687e-03f, +5.893370893e-03f, +3.040512425e-02f, +6.539020494e-02f, +1.051294003e-01f, +1.407205403e-01f, +1.629258274e-01f, +1.655509145e-01f, +1.478450941e-01f, +1.147977373e-01f, +7.518996722e-02f, +3.832028503e-02f, +1.089169377e-02f, -4.654234749e-03f, -9.884926069e-03f, -8.678459973e-03f, -5.120946366e-03f, -1.997671098e-03f, -3.505717797e-04f,\n    +1.907577351e-05f, +6.254592231e-05f, +1.074505383e-04f, +1.079674899e-04f, +8.495178141e-06f, -2.247783902e-04f, -5.712418783e-04f, -9.429105634e-04f, -1.205410740e-03f, -1.229807311e-03f, -9.532224458e-04f, -4.174004428e-04f, +2.374480061e-04f, +8.242122456e-04f, +1.182720392e-03f, +1.240743497e-03f, +1.033973138e-03f, +6.785122664e-04f, +3.133646471e-04f, +4.324790277e-05f, -9.226977516e-05f, -1.145245570e-04f, -7.659209903e-05f, -2.947152747e-05f,\n    +9.921700011e-04f, +3.466051488e-03f, +6.186595541e-03f, +5.903171519e-03f, -7.201524968e-04f, -1.381930143e-02f, -2.818562038e-02f, -3.478538096e-02f, -2.604743804e-02f, -1.771245247e-03f, +2.882845810e-02f, +5.127012819e-02f, +5.407431792e-02f, +3.577173927e-02f, +5.817968862e-03f, -2.122622388e-02f, -3.420868864e-02f, -3.093517611e-02f, -1.760985039e-02f, -3.495951585e-03f, +4.927297190e-03f, +6.549708347e-03f, +4.222789376e-03f, +1.479891851e-03f,\n    -5.367477390e-05f, -9.349552672e-05f, -5.977559862e-05f, +9.213746067e-05f, +3.172367269e-04f, +4.693091933e-04f, +3.814772927e-04f, -3.049954096e-07f, -5.323153022e-04f, -9.231945381e-04f, -9.097375674e-04f, -4.430443616e-04f, +2.551570831e-04f, +8.193297752e-04f, +9.675455443e-04f, +6.702129574e-04f, +1.457293867e-04f, -3.014556219e-04f, -4.743926272e-04f, -3.752876194e-04f, -1.528096552e-04f, +2.914221957e-05f, +9.443585119e-05f, +6.808981202e-05f,\n    /*  3,21 (24) */\n    -1.386334855e-04f, -1.378490601e-03f, -4.122575594e-03f, -7.763152013e-03f, -1.000725278e-02f, -7.025103077e-03f, +5.322129014e-03f, +2.946221369e-02f, +6.418479420e-02f, +1.038995930e-01f, +1.397673178e-01f, +1.625084270e-01f, +1.657883625e-01f, +1.486693064e-01f, +1.159804577e-01f, +7.643071072e-02f, +3.935425817e-02f, +1.157020604e-02f, -4.340870102e-03f, -9.841678166e-03f, -8.770729748e-03f, -5.235470923e-03f, -2.074263197e-03f, -3.800433072e-04f,\n    +1.803376207e-05f, +6.098882748e-05f, +1.064291845e-04f, +1.091934511e-04f, +1.356404255e-05f, -2.154931235e-04f, -5.594160446e-04f, -9.321980153e-04f, -1.200251434e-03f, -1.233521370e-03f, -9.662916374e-04f, -4.368686841e-04f, +2.170317298e-04f, +8.086760026e-04f, +1.175971057e-03f, +1.243380221e-03f, +1.043414965e-03f, +6.904527520e-04f, +3.237287524e-04f, +4.968030480e-05f, -8.997914366e-05f, -1.150424160e-04f, -7.813486075e-05f, -3.073410572e-05f,\n    +9.384952272e-04f, +3.372555961e-03f, +6.126819942e-03f, +5.995308980e-03f, -4.029157700e-04f, -1.334999224e-02f, -2.780414308e-02f, -3.478568595e-02f, -2.657975334e-02f, -2.694439785e-03f, +2.791872053e-02f, +5.082708383e-02f, +5.432947500e-02f, +3.659106904e-02f, +6.785514407e-03f, -2.055601093e-02f, -3.406295926e-02f, -3.123663173e-02f, -1.808424302e-02f, -3.871239204e-03f, +4.774487534e-03f, +6.578850567e-03f, +4.317225227e-03f, +1.547981663e-03f,\n    -5.203577121e-05f, -9.299361279e-05f, -6.255996215e-05f, +8.575472369e-05f, +3.103647537e-04f, +4.674692186e-04f, +3.888662781e-04f, +1.515822609e-05f, -5.161598063e-04f, -9.161257322e-04f, -9.174962798e-04f, -4.628708924e-04f, +2.334359524e-04f, +8.070753387e-04f, +9.702441724e-04f, +6.845194958e-04f, +1.624303064e-04f, -2.911007126e-04f, -4.736119604e-04f, -3.812090587e-04f, -1.598423714e-04f, +2.511985993e-05f, +9.410304080e-05f, +6.961746379e-05f,\n    /*  3,22 (24) */\n    -1.205997235e-04f, -1.317501773e-03f, -4.016146410e-03f, -7.653958562e-03f, -9.993688737e-03f, -7.240596200e-03f, +4.762712970e-03f, +2.853001567e-02f, +6.298454277e-02f, +1.026660716e-01f, +1.388010262e-01f, +1.620715583e-01f, +1.660053942e-01f, +1.494779824e-01f, +1.171564287e-01f, +7.767409094e-02f, +4.039767313e-02f, +1.226065879e-02f, -4.017141350e-03f, -9.791997861e-03f, -8.860708891e-03f, -5.350513339e-03f, -2.152398058e-03f, -4.107774129e-04f,\n    +1.701521163e-05f, +5.943645860e-05f, +1.053672132e-04f, +1.103216742e-04f, +1.849803145e-05f, -2.063259119e-04f, -5.476226379e-04f, -9.213830297e-04f, -1.194857373e-03f, -1.236932995e-03f, -9.790961562e-04f, -4.562111037e-04f, +1.965525135e-04f, +7.929131518e-04f, +1.168919517e-03f, +1.245748821e-03f, +1.052705362e-03f, +7.023827773e-04f, +3.341890411e-04f, +5.624924209e-05f, -8.757388061e-05f, -1.155000078e-04f, -7.966944564e-05f, -3.201678962e-05f,\n    +8.864594560e-04f, +3.279562349e-03f, +6.064259980e-03f, +6.081063704e-03f, -9.255101630e-05f, -1.288252302e-02f, -2.741527681e-02f, -3.477052773e-02f, -2.709591315e-02f, -3.610565517e-03f, +2.700122425e-02f, +5.036421294e-02f, +5.456291096e-02f, +3.739814438e-02f, +7.755758579e-03f, -1.987149143e-02f, -3.390052895e-02f, -3.152773244e-02f, -1.855785498e-02f, -4.252448263e-03f, +4.614645163e-03f, +6.603970427e-03f, +4.411328268e-03f, +1.617599127e-03f,\n    -5.039623831e-05f, -9.242048371e-05f, -6.522142408e-05f, +7.945595420e-05f, +3.034295771e-04f, +4.653897081e-04f, +3.959494315e-04f, +3.045361205e-05f, -4.998744954e-04f, -9.086490765e-04f, -9.247853271e-04f, -4.824479080e-04f, +2.115881394e-04f, +7.943976588e-04f, +9.724820624e-04f, +6.985872860e-04f, +1.792077627e-04f, -2.804632006e-04f, -4.725496714e-04f, -3.870033460e-04f, -1.669187426e-04f, +2.097506020e-05f, +9.367517274e-05f, +7.112261064e-05f,\n    /*  3,23 (24) */\n    -1.035845118e-04f, -1.258065314e-03f, -3.910779196e-03f, -7.543636887e-03f, -9.975190705e-03f, -7.446922112e-03f, +4.215090332e-03f, +2.760863264e-02f, +6.178968539e-02f, +1.014291386e-01f, +1.378219300e-01f, +1.616153472e-01f, +1.662019467e-01f, +1.502708955e-01f, +1.183253482e-01f, +7.891983976e-02f, +4.145037849e-02f, +1.296304157e-02f, -3.682952308e-03f, -9.735748619e-03f, -8.948282772e-03f, -5.466013346e-03f, -2.232067503e-03f, -4.427942025e-04f,\n    +1.602028222e-05f, +5.788982657e-05f, +1.042663492e-04f, +1.113538339e-04f, +2.329763868e-05f, -1.972783248e-04f, -5.358652772e-04f, -9.104701097e-04f, -1.189232016e-03f, -1.240042814e-03f, -9.916331371e-04f, -4.754222452e-04f, +1.760162742e-04f, +7.769277177e-04f, +1.161566456e-03f, +1.247846734e-03f, +1.061839975e-03f, +7.142981987e-04f, +3.447431114e-04f, +6.295450197e-05f, -8.505261935e-05f, -1.158955069e-04f, -8.119452490e-05f, -3.331912137e-05f,\n    +8.360632177e-04f, +3.187141865e-03f, +5.999038556e-03f, +6.160519658e-03f, +2.108785608e-04f, -1.241713331e-02f, -2.701932737e-02f, -3.474007411e-02f, -2.759578764e-02f, -4.519214594e-03f, +2.607643892e-02f, +4.988176503e-02f, +5.477449910e-02f, +3.819254204e-02f, +8.728240641e-03f, -1.917290414e-02f, -3.372132119e-02f, -3.180819564e-02f, -1.903040465e-02f, -4.639451609e-03f, +4.447726420e-03f, +6.624945487e-03f, +4.505003441e-03f, +1.688721738e-03f,\n    -4.875794816e-05f, -9.177845775e-05f, -6.776053655e-05f, +7.324415279e-05f, +2.964368879e-04f, +4.630752424e-04f, +4.027259288e-04f, +4.557378534e-05f, -4.834695166e-04f, -9.007708077e-04f, -9.316022141e-04f, -5.017650765e-04f, +1.896254575e-04f, +7.813026251e-04f, +9.742559428e-04f, +7.124068508e-04f, +1.960526557e-04f, -2.695464950e-04f, -4.712027976e-04f, -3.926646570e-04f, -1.740344774e-04f, +1.670849714e-05f, +9.315029562e-05f, +7.260306441e-05f,\n    /*  3,24 (24) */\n    -8.756422961e-05f, -1.200175488e-03f, -3.806512847e-03f, -7.432283053e-03f, -9.951893067e-03f, -7.644200437e-03f, +3.679225055e-03f, +2.669816253e-02f, +6.060045338e-02f, +1.001890958e-01f, +1.368302969e-01f, +1.611399249e-01f, +1.663779630e-01f, +1.510478232e-01f, +1.194869147e-01f, +8.016768649e-02f, +4.251221847e-02f, +1.367733977e-02f, -3.338209197e-03f, -9.672794117e-03f, -9.033335391e-03f, -5.581908853e-03f, -2.313262028e-03f, -4.761133239e-04f,\n    +1.504911122e-05f, +5.634991455e-05f, +1.031283033e-04f, +1.122916229e-04f, +2.796341146e-05f, -1.883518612e-04f, -5.241475292e-04f, -8.994637579e-04f, -1.183378883e-03f, -1.242851567e-03f, -1.003899819e-03f, -4.944967052e-04f, +1.554289519e-04f, +7.607238135e-04f, +1.153912669e-03f, +1.249671477e-03f, +1.070814478e-03f, +7.261948385e-04f, +3.553884937e-04f, +6.979580815e-05f, -8.241402644e-05f, -1.162270856e-04f, -8.270874508e-05f, -3.464061654e-05f,\n    +7.873052695e-04f, +3.095363407e-03f, +5.931278019e-03f, +6.233763811e-03f, +5.073154486e-04f, -1.195405807e-02f, -2.661660145e-02f, -3.469450033e-02f, -2.807925716e-02f, -5.419985402e-03f, +2.514483671e-02f, +4.937999995e-02f, +5.496412455e-02f, +3.897384466e-02f, +9.702496584e-03f, -1.846049729e-02f, -3.352526853e-02f, -3.207774214e-02f, -1.950160745e-02f, -5.032116266e-03f, +4.273691943e-03f, +6.641653984e-03f, +4.598153737e-03f, +1.761324802e-03f,\n    -4.712263144e-05f, -9.106986765e-05f, -7.017794291e-05f, +6.712220468e-05f, +2.893923386e-04f, +4.605305087e-04f, +4.091951571e-04f, +6.051154104e-05f, -4.669550271e-04f, -8.924973807e-04f, -9.379447391e-04f, -5.208122351e-04f, +1.675597955e-04f, +7.677963930e-04f, +9.755628138e-04f, +7.259688140e-04f, +2.129557746e-04f, -2.583542202e-04f, -4.695685371e-04f, -3.981871848e-04f, -1.811851882e-04f, +1.232095899e-05f, +9.252650505e-05f, +7.405661171e-05f,\n    /*  3,25 (24) */\n    -7.251511839e-05f, -1.143825573e-03f, -3.703384544e-03f, -7.319991431e-03f, -9.923929655e-03f, -7.832552298e-03f, +3.155077526e-03f, +2.579869877e-02f, +5.941707449e-02f, +9.894624425e-02f, +1.358263971e-01f, +1.606454282e-01f, +1.665333920e-01f, +1.518085470e-01f, +1.206408274e-01f, +8.141735797e-02f, +4.358303295e-02f, +1.440353461e-02f, -2.982820703e-03f, -9.602998309e-03f, -9.115749418e-03f, -5.698135939e-03f, -2.395970773e-03f, -5.107539404e-04f,\n    +1.410181368e-05f, +5.481767783e-05f, +1.019547717e-04f, +1.131367508e-04f, +3.249594950e-05f, -1.795479501e-04f, -5.124729073e-04f, -8.883684744e-04f, -1.177301558e-03f, -1.245360095e-03f, -1.015893545e-03f, -5.134291353e-04f, +1.347965074e-04f, +7.443056386e-04f, +1.145959062e-03f, +1.251220658e-03f, +1.079624571e-03f, +7.380684864e-04f, +3.661226517e-04f, +7.677282003e-05f, -7.965680278e-05f, -1.164929146e-04f, -8.421072848e-05f, -3.598076395e-05f,\n    +7.401826381e-04f, +3.004293539e-03f, +5.861100077e-03f, +6.300886015e-03f, +7.967077873e-04f, -1.149352756e-02f, -2.620740629e-02f, -3.463398879e-02f, -2.854621219e-02f, -6.312482782e-03f, +2.420689197e-02f, +4.885918772e-02f, +5.513168435e-02f, +3.974164106e-02f, +1.067805940e-02f, -1.773452848e-02f, -3.331231276e-02f, -3.233609636e-02f, -1.997117599e-02f, -5.430303451e-03f, +4.092506755e-03f, +6.653974943e-03f, +4.690680242e-03f, +1.835381414e-03f,\n    -4.549197558e-05f, -9.029705817e-05f, -7.247437578e-05f, +6.109287905e-05f, +2.823015400e-04f, +4.577602963e-04f, +4.153567124e-04f, +7.525985006e-05f, -4.503411878e-04f, -8.838354626e-04f, -9.438109947e-04f, -5.395793965e-04f, +1.454031092e-04f, +7.538853802e-04f, +9.763999499e-04f, +7.392639072e-04f, +2.299078035e-04f, -2.468902149e-04f, -4.676442529e-04f, -4.035651448e-04f, -1.883663929e-04f, +7.813346558e-06f, +9.180194618e-05f, +7.548101566e-05f,\n    /*  3,26 (24) */\n    -5.841330471e-05f, -1.089007895e-03f, -3.601429772e-03f, -7.206854680e-03f, -9.891433706e-03f, -8.012100248e-03f, +2.642604618e-03f, +2.491033030e-02f, +5.823977294e-02f, +9.770088416e-02f, +1.348105035e-01f, +1.601319991e-01f, +1.666681885e-01f, +1.525528527e-01f, +1.217867864e-01f, +8.266857863e-02f, +4.466265752e-02f, +1.514160309e-02f, -2.616698052e-03f, -9.526225489e-03f, -9.195406221e-03f, -5.814628854e-03f, -2.480181502e-03f, -5.467347044e-04f,\n    +1.317848272e-05f, +5.329404377e-05f, +1.007474356e-04f, +1.138909429e-04f, +3.689590400e-05f, -1.708679503e-04f, -5.008448706e-04f, -8.771887553e-04f, -1.171003681e-03f, -1.247569347e-03f, -1.027611765e-03f, -5.322142446e-04f, +1.141249198e-04f, +7.276774778e-04f, +1.137706655e-03f, +1.252491970e-03f, +1.088265987e-03f, +7.499149007e-04f, +3.769429824e-04f, +8.388513217e-05f, -7.677968482e-05f, -1.166911641e-04f, -8.569907359e-05f, -3.733902543e-05f,\n    +6.946906625e-04f, +2.913996481e-03f, +5.788625701e-03f, +6.361978894e-03f, +1.079009327e-03f, -1.103576726e-02f, -2.579204958e-02f, -3.455872894e-02f, -2.899655337e-02f, -7.196318245e-03f, +2.326308098e-02f, +4.831960832e-02f, +5.527708746e-02f, +4.049552644e-02f, +1.165445935e-02f, -1.699526457e-02f, -3.308240496e-02f, -3.258298657e-02f, -2.043882024e-02f, -5.833868595e-03f, +3.904140362e-03f, +6.661788290e-03f, +4.782482188e-03f, +1.910862429e-03f,\n    -4.386762395e-05f, -8.946238374e-05f, -7.465065498e-05f, +5.515882843e-05f, +2.751700567e-04f, +4.547694920e-04f, +4.212103984e-04f, +8.981186280e-05f, -4.336381561e-04f, -8.747919281e-04f, -9.491993685e-04f, -5.580567552e-04f, +1.231674144e-04f, +7.395762632e-04f, +9.767649031e-04f, +7.522829769e-04f, +2.468993268e-04f, -2.351585315e-04f, -4.654274759e-04f, -4.087927792e-04f, -1.955735175e-04f, +3.186674108e-06f, +9.097481622e-05f, +7.687401763e-05f,\n    /*  3,27 (24) */\n    -4.523482199e-05f, -1.035713852e-03f, -3.500682337e-03f, -7.092963737e-03f, -9.854537802e-03f, -8.182968199e-03f, +2.141759748e-03f, +2.403314154e-02f, +5.706876926e-02f, +9.645331481e-02f, +1.337828917e-01f, +1.595997848e-01f, +1.667823134e-01f, +1.532805302e-01f, +1.229244931e-01f, +8.392107060e-02f, +4.575092351e-02f, +1.589151799e-02f, -2.239755069e-03f, -9.442340357e-03f, -9.272185905e-03f, -5.931320018e-03f, -2.565880576e-03f, -5.840737298e-04f,\n    +1.227918995e-05f, +5.177991177e-05f, +9.950795986e-05f, +1.145559393e-04f, +4.116397666e-05f, -1.623131509e-04f, -4.892668230e-04f, -8.659290902e-04f, -1.164488953e-03f, -1.249480374e-03f, -1.039052033e-03f, -5.508468014e-04f, +9.342018411e-05f, +7.108436992e-04f, +1.129156576e-03f, +1.253483196e-03f, +1.096734486e-03f, +7.617298102e-04f, +3.878468170e-04f, +9.113227368e-05f, -7.378144564e-05f, -1.168200048e-04f, -8.717235549e-05f, -3.871483564e-05f,\n    +6.508230385e-04f, +2.824534098e-03f, +5.713975046e-03f, +6.417137723e-03f, +1.354179384e-03f, -1.058099777e-02f, -2.537083918e-02f, -3.446891707e-02f, -2.943019153e-02f, -8.071110173e-03f, +2.231388161e-02f, +4.776155157e-02f, +5.540025487e-02f, +4.123510270e-02f, +1.263122425e-02f, -1.624298160e-02f, -3.283550563e-02f, -3.281814510e-02f, -2.090424772e-02f, -6.242661375e-03f, +3.708566844e-03f, +6.664974964e-03f, +4.873457004e-03f, +1.987736447e-03f,\n    -4.225117502e-05f, -8.856820608e-05f, -7.670768539e-05f, +4.932258818e-05f, +2.680034041e-04f, +4.515630755e-04f, +4.267562251e-04f, +1.041609125e-04f, -4.168560789e-04f, -8.653738534e-04f, -9.541085427e-04f, -5.762346935e-04f, +1.008647784e-04f, +7.248759729e-04f, +9.766555049e-04f, +7.650169907e-04f, +2.639208351e-04f, -2.231634351e-04f, -4.629159086e-04f, -4.138643616e-04f, -2.028018984e-04f, -1.557929709e-06f, +9.004336690e-05f, +7.823333901e-05f,\n    /*  3,28 (24) */\n    -3.295563204e-05f, -9.839339400e-04f, -3.401174377e-03f, -6.978407798e-03f, -9.813373825e-03f, -8.345281349e-03f, +1.652492925e-03f, +2.316721245e-02f, +5.590428030e-02f, +9.520383444e-02f, +1.327438397e-01f, +1.590489380e-01f, +1.668757336e-01f, +1.539913739e-01f, +1.240536496e-01f, +8.517455379e-02f, +4.684765799e-02f, +1.665324780e-02f, -1.851908252e-03f, -9.351208083e-03f, -9.345967351e-03f, -6.048140022e-03f, -2.653052931e-03f, -6.227885655e-04f,\n    +1.140398583e-05f, +5.027615317e-05f, +9.823799292e-05f, +1.151334936e-04f, +4.530091876e-05f, -1.538847709e-04f, -4.777421116e-04f, -8.545939606e-04f, -1.157761129e-03f, -1.251094331e-03f, -1.050212011e-03f, -5.693216354e-04f, +7.268830890e-05f, +6.938087530e-04f, +1.120310067e-03f, +1.254192209e-03f, +1.105025867e-03f, +7.735089158e-04f, +3.988314213e-04f, +9.851370773e-05f, -7.066089609e-05f, -1.168776089e-04f, -8.862912628e-05f, -4.010760193e-05f,\n    +6.085718635e-04f, +2.735965892e-03f, +5.637267360e-03f, +6.466460311e-03f, +1.622182788e-03f, -1.012943469e-02f, -2.494408295e-02f, -3.436475616e-02f, -2.984704761e-02f, -8.936484026e-03f, +2.135977306e-02f, +4.718531687e-02f, +5.550111965e-02f, +4.195997867e-02f, +1.360787976e-02f, -1.547796461e-02f, -3.257158479e-02f, -3.304130854e-02f, -2.136716363e-02f, -6.656525736e-03f, +3.505764946e-03f, +6.663417034e-03f, +4.963500371e-03f, +2.065969786e-03f,\n    -4.064418164e-05f, -8.761689193e-05f, -7.864645488e-05f, +4.358657619e-05f, +2.608070442e-04f, +4.481461147e-04f, +4.319944063e-04f, +1.183005185e-04f, -4.000050864e-04f, -8.555885112e-04f, -9.585374951e-04f, -5.941037881e-04f, +7.850731232e-05f, +7.097916912e-04f, +9.760698691e-04f, +7.774570446e-04f, +2.809627312e-04f, -2.109094015e-04f, -4.601074287e-04f, -4.187742019e-04f, -2.100467847e-04f, -6.419221105e-06f, +8.900590706e-05f, +7.955668309e-05f,\n    /*  3,29 (24) */\n    -2.155164621e-05f, -9.336577868e-04f, -3.302936384e-03f, -6.863274304e-03f, -9.768072906e-03f, -8.499166120e-03f, +1.174750813e-03f, +2.231261849e-02f, +5.474651917e-02f, +9.395274011e-02f, +1.316936277e-01f, +1.584796164e-01f, +1.669484219e-01f, +1.546851826e-01f, +1.251739597e-01f, +8.642874600e-02f, +4.795268386e-02f, +1.742675672e-02f, -1.453076831e-03f, -9.252694376e-03f, -9.416628247e-03f, -6.165017631e-03f, -2.741682057e-03f, -6.628961674e-04f,\n    +1.055290011e-05f, +4.878361126e-05f, +9.693916574e-05f, +1.156253717e-04f, +4.930753009e-05f, -1.455839599e-04f, -4.662740262e-04f, -8.431878379e-04f, -1.150824016e-03f, -1.252412474e-03f, -1.061089468e-03f, -5.876336398e-04f, +5.193531372e-05f, +6.765771692e-04f, +1.111168481e-03f, +1.254616975e-03f, +1.113135960e-03f, +7.852478923e-04f, +4.098939964e-04f, +1.060288310e-04f, -6.741688592e-05f, -1.168621514e-04f, -9.006791560e-05f, -4.151670416e-05f,\n    +5.679276819e-04f, +2.648349000e-03f, +5.558620905e-03f, +6.510046887e-03f, +1.882989832e-03f, -9.681288580e-03f, -2.451208855e-02f, -3.424645564e-02f, -3.024705269e-02f, -9.792072538e-03f, +2.040123557e-02f, +4.659121308e-02f, +5.557962696e-02f, +4.266977036e-02f, +1.458394963e-02f, -1.470050756e-02f, -3.229062206e-02f, -3.325221794e-02f, -2.182727105e-02f, -7.075299938e-03f, +3.295718161e-03f, +6.656997813e-03f, +5.052506278e-03f, +2.145526469e-03f,\n    -3.904815034e-05f, -8.661081072e-05f, -8.046803207e-05f, +3.795309249e-05f, +2.535863825e-04f, +4.445237610e-04f, +4.369253578e-04f, +1.322243893e-04f, -3.830952845e-04f, -8.454433646e-04f, -9.624854981e-04f, -6.116548155e-04f, +5.610716341e-05f, +6.943308460e-04f, +9.750063939e-04f, +7.895943690e-04f, +2.980153362e-04f, -1.984011167e-04f, -4.570000917e-04f, -4.235166508e-04f, -2.173033413e-04f, -1.139584045e-05f, +8.786080506e-05f, +8.084173690e-05f,\n    /*  3,30 (24) */\n    -1.099874610e-05f, -8.848741755e-04f, -3.205997218e-03f, -6.747648932e-03f, -9.718765376e-03f, -8.644750080e-03f, +7.084767869e-04f, +2.146943066e-02f, +5.359569516e-02f, +9.270032763e-02f, +1.306325382e-01f, +1.578919828e-01f, +1.670003572e-01f, +1.553617598e-01f, +1.262851282e-01f, +8.768336298e-02f, +4.906581982e-02f, +1.821200461e-02f, -1.043182834e-03f, -9.146665545e-03f, -9.484045133e-03f, -6.281879783e-03f, -2.831749973e-03f, -7.044128715e-04f,\n    +9.725942243e-06f, +4.730310127e-05f, +9.561309131e-05f, +1.160333507e-04f, +5.318465797e-05f, -1.374117981e-04f, -4.548657984e-04f, -8.317151817e-04f, -1.143681477e-03f, -1.253436160e-03f, -1.071682283e-03f, -6.057777733e-04f, +3.116722669e-05f, +6.591535567e-04f, +1.101733279e-03f, +1.254755552e-03f, +1.121060636e-03f, +7.969423900e-04f, +4.210316793e-04f, +1.136769732e-04f, -6.404830492e-05f, -1.167718107e-04f, -9.148723106e-05f, -4.294149459e-05f,\n    +5.288795315e-04f, +2.561738189e-03f, +5.478152873e-03f, +6.547999980e-03f, +2.136576215e-03f, -9.236764819e-03f, -2.407516319e-02f, -3.411423125e-02f, -3.063014798e-02f, -1.063751590e-02f, +1.943875007e-02f, +4.597955827e-02f, +5.563573413e-02f, +4.336410121e-02f, +1.555895602e-02f, -1.391091319e-02f, -3.199260673e-02f, -3.345061906e-02f, -2.228427115e-02f, -7.498816589e-03f, +3.078414820e-03f, +6.645601972e-03f, +5.140367083e-03f, +2.226368206e-03f,\n    -3.746454073e-05f, -8.555233233e-05f, -8.217356412e-05f, +3.242431918e-05f, +2.463467642e-04f, +4.407012446e-04f, +4.415496956e-04f, +1.459264257e-04f, -3.661367488e-04f, -8.349460613e-04f, -9.659521188e-04f, -6.288787583e-04f, +3.367650675e-05f, +6.785011074e-04f, +9.734637637e-04f, +8.014203357e-04f, +3.150688955e-04f, -1.856434745e-04f, -4.535921347e-04f, -4.280861048e-04f, -2.245666512e-04f, -1.648631167e-05f, +8.660649126e-05f, +8.208617321e-05f,\n    /*  3,31 (24) */\n    -1.272803854e-06f, -8.375710743e-04f, -3.110384127e-03f, -6.631615582e-03f, -9.665580718e-03f, -8.782161878e-03f, +2.536109885e-04f, +2.063771547e-02f, +5.245201368e-02f, +9.144689147e-02f, +1.295608560e-01f, +1.572862050e-01f, +1.670315244e-01f, +1.560209133e-01f, +1.273868615e-01f, +8.893811853e-02f, +5.018688045e-02f, +1.900894700e-02f, -6.221511552e-04f, -9.032988571e-03f, -9.548093438e-03f, -6.398651594e-03f, -2.923237204e-03f, -7.473543661e-04f,\n    +8.923101798e-06f, +4.583541038e-05f, +9.426136396e-05f, +1.163592181e-04f, +5.693319620e-05f, -1.293692963e-04f, -4.435206002e-04f, -8.201804378e-04f, -1.136337421e-03f, -1.254166848e-03f, -1.081988441e-03f, -6.237490619e-04f, +1.039008209e-05f, +6.415426008e-04f, +1.092006038e-03f, +1.254606094e-03f, +1.128795806e-03f, +8.085880363e-04f, +4.322415435e-04f, +1.214573968e-04f, -6.055408398e-05f, -1.166047700e-04f, -9.288555880e-05f, -4.438129776e-05f,\n    +4.914149908e-04f, +2.476185857e-03f, +5.395979309e-03f, +6.580424299e-03f, +2.382922979e-03f, -8.796063574e-03f, -2.363361349e-02f, -3.396830483e-02f, -3.099628473e-02f, -1.147246196e-02f, +1.847279795e-02f, +4.535067951e-02f, +5.566941063e-02f, +4.404260232e-02f, +1.653241978e-02f, -1.310949286e-02f, -3.167753783e-02f, -3.363626253e-02f, -2.273786328e-02f, -7.926902694e-03f, +2.853848169e-03f, +6.629115661e-03f, +5.226973574e-03f, +2.308454379e-03f,\n    -3.589476488e-05f, -8.444382486e-05f, -8.376427446e-05f, +2.700232027e-05f, +2.390934712e-04f, +4.366838699e-04f, +4.458682330e-04f, +1.594007232e-04f, -3.491395175e-04f, -8.241044281e-04f, -9.689372183e-04f, -6.457668103e-04f, +1.122753743e-05f, +6.623103823e-04f, +9.714409511e-04f, +8.129264642e-04f, +3.321135850e-04f, -1.726415751e-04f, -4.498819789e-04f, -4.324770105e-04f, -2.318317186e-04f, -2.168904174e-05f, +8.524146050e-05f, +8.328765248e-05f,\n    /*  4, 0 (24) */\n    +1.600006368e-03f, +2.296092272e-03f, +9.217025557e-05f, -6.986631072e-03f, -1.727091088e-02f, -2.337765487e-02f, -1.399136907e-02f, +1.997025201e-02f, +7.789615823e-02f, +1.459827282e-01f, +2.013673686e-01f, +2.227225527e-01f, +2.013673686e-01f, +1.459827282e-01f, +7.789615823e-02f, +1.997025201e-02f, -1.399136907e-02f, -2.337765487e-02f, -1.727091088e-02f, -6.986631072e-03f, +9.217025557e-05f, +2.296092272e-03f, +1.600006368e-03f, +4.631705239e-04f,\n    -3.890635472e-05f, +7.644098300e-06f, +1.382938117e-04f, +2.923858025e-04f, +3.110196137e-04f, +1.764043540e-05f, -6.359464612e-04f, -1.460909391e-03f, -2.067532558e-03f, -2.063446989e-03f, -1.303852983e-03f, -2.161761953e-05f, +1.269515872e-03f, +2.050925659e-03f, +2.078271276e-03f, +1.485476938e-03f, +6.607797145e-04f, -2.347632839e-06f, -3.073145736e-04f, -2.960266674e-04f, -1.433615383e-04f, -1.049708950e-05f, +3.860841448e-05f, +2.697166309e-05f,\n    -1.915727268e-03f, -9.515901960e-05f, +6.422434166e-03f, +1.421211896e-02f, +1.445777228e-02f, +2.854429011e-04f, -2.377097129e-02f, -4.073011900e-02f, -3.326070272e-02f, -1.823756678e-04f, +3.855895525e-02f, +5.568063817e-02f, +3.855895525e-02f, -1.823756678e-04f, -3.326070272e-02f, -4.073011900e-02f, -2.377097129e-02f, +2.854429011e-04f, +1.445777228e-02f, +1.421211896e-02f, +6.422434166e-03f, -9.515901960e-05f, -1.915727268e-03f, -9.377691235e-04f,\n    +5.457975959e-06f, -1.280176524e-04f, -2.583963475e-04f, -1.810574896e-04f, +1.961620417e-04f, +6.539923216e-04f, +7.518795146e-04f, +2.236763837e-04f, -6.738101129e-04f, -1.264799271e-03f, -1.009061979e-03f, -1.788224777e-05f, +9.866129608e-04f, +1.271034774e-03f, +7.007776918e-04f, -1.983647722e-04f, -7.450412298e-04f, -6.648278939e-04f, -2.112722132e-04f, +1.735680368e-04f, +2.601751204e-04f, +1.330885160e-04f, -2.671525331e-06f, -4.060480517e-05f,\n    /*  4, 1 (24) */\n    +1.561100013e-03f, +2.303736370e-03f, +2.304640673e-04f, -6.694245269e-03f, -1.695989127e-02f, -2.336001444e-02f, -1.462731553e-02f, +1.850934262e-02f, +7.582862567e-02f, +1.439192813e-01f, +2.000635157e-01f, +2.227009351e-01f, +2.026368845e-01f, +1.480336539e-01f, +7.997442951e-02f, +2.145572895e-02f, -1.333058935e-02f, -2.338000250e-02f, -1.757822545e-02f, -7.282657739e-03f, -5.119128274e-05f, +2.285595183e-03f, +1.638614782e-03f, +4.901421870e-04f,\n    -3.914467862e-05f, +4.880739804e-06f, +1.332581224e-04f, +2.886149562e-04f, +3.144091316e-04f, +3.256045541e-05f, -6.112989155e-04f, -1.436129532e-03f, -2.056175888e-03f, -2.075197043e-03f, -1.337654664e-03f, -6.484373343e-05f, +1.234656532e-03f, +2.037634402e-03f, +2.088382221e-03f, +1.509818226e-03f, +6.857887560e-04f, +1.331610283e-05f, -3.032894465e-04f, -2.995314222e-04f, -1.484576699e-04f, -1.343952718e-05f, +3.824923106e-05f, +2.773859848e-05f,\n    -1.910269292e-03f, -2.231766720e-04f, +6.164037818e-03f, +1.403106147e-02f, +1.465393432e-02f, +9.394352227e-04f, -2.301909178e-02f, -4.050644262e-02f, -3.393451283e-02f, -1.447174939e-03f, +3.754989327e-02f, +5.566275592e-02f, +3.954556821e-02f, +1.088659106e-03f, -3.255992502e-02f, -4.092848378e-02f, -2.451601252e-02f, -3.793849927e-04f, +1.424650006e-02f, +1.438568700e-02f, +6.682609286e-03f, +3.792949637e-05f, -1.918398793e-03f, -9.783739287e-04f,\n    +8.135227175e-06f, -1.229546211e-04f, -2.564056106e-04f, -1.882251109e-04f, +1.811527070e-04f, +6.427907079e-04f, +7.580581083e-04f, +2.485873599e-04f, -6.465318711e-04f, -1.257676790e-03f, -1.030735887e-03f, -5.363268835e-05f, +9.634049570e-04f, +1.276374679e-03f, +7.274108696e-04f, -1.726700408e-04f, -7.375419549e-04f, -6.752830043e-04f, -2.264708226e-04f, +1.657580629e-04f, +2.617353228e-04f, +1.381613802e-04f, +2.235815352e-07f, -4.080197272e-05f,\n    /*  4, 2 (24) */\n    +1.521955334e-03f, +2.308617110e-03f, +3.637221897e-04f, -6.405630313e-03f, -1.664548213e-02f, -2.332745398e-02f, -1.523861445e-02f, +1.707321309e-02f, +7.377244979e-02f, +1.418440842e-01f, +1.987258610e-01f, +2.226360913e-01f, +2.038715410e-01f, +1.500712883e-01f, +8.206281173e-02f, +2.296554718e-02f, -1.264480060e-02f, -2.336668640e-02f, -1.788151490e-02f, -7.582189161e-03f, -1.996489527e-04f, +2.272155655e-03f, +1.676864013e-03f, +5.178807854e-04f,\n    -3.932503274e-05f, +2.207110546e-06f, +1.282579919e-04f, +2.847202272e-04f, +3.174878198e-04f, +4.710609530e-05f, -5.868467756e-04f, -1.411151296e-03f, -2.044211344e-03f, -2.086174875e-03f, -1.370908015e-03f, -1.080424771e-04f, +1.199288455e-03f, +2.023574966e-03f, +2.097855838e-03f, +1.533919301e-03f, +7.109634486e-04f, +2.934866841e-05f, -2.989398010e-04f, -3.028939125e-04f, -1.535784642e-04f, -1.647113367e-05f, +3.782719946e-05f, +2.849525023e-05f,\n    -1.902134065e-03f, -3.461312931e-04f, +5.907632207e-03f, +1.384283636e-02f, +1.483508702e-02f, +1.582225931e-03f, -2.226103367e-02f, -4.025785526e-02f, -3.458104470e-02f, -2.704851729e-03f, +3.651915739e-02f, +5.560912323e-02f, +4.050897317e-02f, +2.365033785e-03f, -3.183251415e-02f, -4.110115382e-02f, -2.525355447e-02f, -1.054667997e-03f, +1.402002924e-02f, +1.455144506e-02f, +6.944344609e-03f, +1.760908766e-04f, -1.918175212e-03f, -1.019175901e-03f,\n    +1.070289269e-05f, -1.179051185e-04f, -2.542096223e-04f, -1.950699416e-04f, +1.662563353e-04f, +6.312376447e-04f, +7.635788941e-04f, +2.730806734e-04f, -6.189668383e-04f, -1.249676678e-03f, -1.051619252e-03f, -8.934097687e-05f, +9.394547681e-04f, +1.280811105e-03f, +7.536860648e-04f, -1.466101804e-04f, -7.293809816e-04f, -6.853434200e-04f, -2.417452079e-04f, +1.576292334e-04f, +2.630704645e-04f, +1.432302827e-04f, +3.226641988e-06f, -4.093050783e-05f,\n    /*  4, 3 (24) */\n    +1.482630302e-03f, +2.310824221e-03f, +4.919801815e-04f, -6.120910086e-03f, -1.632799431e-02f, -2.328034788e-02f, -1.582546122e-02f, +1.566206180e-02f, +7.172823844e-02f, +1.397579093e-01f, +1.973549530e-01f, +2.225280488e-01f, +2.050708295e-01f, +1.520948633e-01f, +8.416066757e-02f, +2.449946648e-02f, -1.193383715e-02f, -2.333733773e-02f, -1.818045470e-02f, -7.885083074e-03f, -3.532274169e-04f, +2.255684522e-03f, +1.714691213e-03f, +5.463760357e-04f,\n    -3.944908116e-05f, -3.767807771e-07f, +1.232968301e-04f, +2.807076808e-04f, +3.202604942e-04f, +6.127600737e-05f, -5.625995143e-04f, -1.385988598e-03f, -2.031649253e-03f, -2.096379936e-03f, -1.403600444e-03f, -1.511956212e-04f, +1.163425423e-03f, +2.008749506e-03f, +2.106682842e-03f, +1.557766215e-03f, +7.362934421e-04f, +4.574770527e-05f, -2.942613438e-04f, -3.061079629e-04f, -1.587200698e-04f, -1.959153804e-05f, +3.734073876e-05f, +2.924019581e-05f,\n    -1.891431172e-03f, -4.640364116e-04f, +5.653422585e-03f, +1.364776642e-02f, +1.500134336e-02f, +2.213463575e-03f, -2.149745477e-02f, -3.998477459e-02f, -3.520001154e-02f, -3.954528407e-03f, +3.546753813e-02f, +5.551978226e-02f, +4.144842794e-02f, +3.645844890e-03f, -3.107882809e-02f, -4.124776400e-02f, -2.598293546e-02f, -1.740011417e-03f, +1.377828403e-02f, +1.470907429e-02f, +7.207415073e-03f, +3.193211593e-04f, -1.914948570e-03f, -1.060106409e-03f,\n    +1.316074035e-05f, -1.128747009e-04f, -2.518151926e-04f, -2.015913700e-04f, +1.514847712e-04f, +6.193478786e-04f, +7.684443329e-04f, +2.971397975e-04f, -5.911389977e-04f, -1.240808997e-03f, -1.071697343e-03f, -1.249790545e-04f, +9.147798576e-04f, +1.284336918e-03f, +7.795798755e-04f, -1.202036428e-04f, -7.205581984e-04f, -6.949951116e-04f, -2.570824535e-04f, +1.491835725e-04f, +2.641741805e-04f, +1.482891349e-04f, +6.336791463e-06f, -4.098788653e-05f,\n    /*  4, 4 (24) */\n    +1.443181221e-03f, +2.310447440e-03f, +6.152770116e-04f, -5.840202405e-03f, -1.600773382e-02f, -2.321907188e-02f, -1.638806074e-02f, +1.427607320e-02f, +6.969658919e-02f, +1.376615294e-01f, +1.959513525e-01f, +2.223768532e-01f, +2.062342549e-01f, +1.541036128e-01f, +8.626735041e-02f, +2.605723269e-02f, -1.119754371e-02f, -2.329159003e-02f, -1.847471604e-02f, -8.191191037e-03f, -5.119474867e-04f, +2.236092984e-03f, +1.752031952e-03f, +5.756162315e-04f,\n    -3.951850337e-05f, -2.871011414e-06f, +1.183779345e-04f, +2.765833440e-04f, +3.227320879e-04f, +7.506909163e-05f, -5.385663751e-04f, -1.360655321e-03f, -2.018500186e-03f, -2.105812081e-03f, -1.435719672e-03f, -1.942849625e-04f, +1.127081495e-03f, +1.993160576e-03f, +2.114854228e-03f, +1.581345032e-03f, +7.617681777e-04f, +6.251059783e-05f, -2.892499246e-04f, -3.091673808e-04f, -1.638785275e-04f, -2.280027447e-05f, +3.678829431e-05f, +2.997198507e-05f,\n    -1.878270432e-03f, -5.769111124e-04f, +5.401607392e-03f, +1.344617505e-02f, +1.515282813e-02f, +2.832811454e-03f, -2.072901044e-02f, -3.968763479e-02f, -3.579115054e-02f, -5.195337404e-03f, +3.439584079e-02f, +5.539480320e-02f, +4.236320779e-02f, +4.930181808e-03f, -3.029924821e-02f, -4.136796764e-02f, -2.670349365e-02f, -2.435006529e-03f, +1.352120158e-02f, +1.485825787e-02f, +7.471589254e-03f, +4.676102941e-04f, -1.908611778e-03f, -1.101094296e-03f,\n    +1.550868921e-05f, -1.078687810e-04f, -2.492292190e-04f, -2.077891270e-04f, +1.368495688e-04f, +6.071362952e-04f, +7.726574551e-04f, +3.207487185e-04f, -5.630724209e-04f, -1.231084514e-03f, -1.090956146e-03f, -1.605189261e-04f, +8.893983368e-04f, +1.286945741e-03f, +8.050691020e-04f, -9.346932708e-05f, -7.110740955e-04f, -7.042242699e-04f, -2.724694003e-04f, +1.404234661e-04f, +2.650402404e-04f, +1.533317275e-04f, +9.553001232e-06f, -4.097162398e-05f,\n    /*  4, 5 (24) */\n    +1.403662717e-03f, +2.307576429e-03f, +7.336549461e-04f, -5.563619061e-03f, -1.568500173e-02f, -2.314400279e-02f, -1.692662711e-02f, +1.291541788e-02f, +6.767808900e-02f, +1.355557173e-01f, +1.945156329e-01f, +2.221825683e-01f, +2.073613364e-01f, +1.560967734e-01f, +8.838220464e-02f, +2.763857773e-02f, -1.043577553e-02f, -2.322907943e-02f, -1.876396597e-02f, -8.500358418e-03f, -6.758260142e-04f, +2.213292709e-03f, +1.788820246e-03f, +6.055882166e-04f,\n    -3.953499220e-05f, -5.275742626e-06f, +1.135044900e-04f, +2.723532024e-04f, +3.249076470e-04f, +8.848449348e-05f, -5.147563692e-04f, -1.335165314e-03f, -2.004774947e-03f, -2.114471558e-03f, -1.467253741e-03f, -2.372923342e-04f, +1.090271000e-03f, +1.976811134e-03f, +2.122361275e-03f, +1.604641837e-03f, +7.873768925e-04f, +7.963447218e-05f, -2.839015417e-04f, -3.120659607e-04f, -1.690497713e-04f, -2.609678061e-05f, +3.616833997e-05f, +3.068914123e-05f,\n    -1.862761743e-03f, -6.847798935e-04f, +5.152378173e-03f, +1.323838592e-02f, +1.528967770e-02f, +3.439947749e-03f, -1.995635298e-02f, -3.936688607e-02f, -3.635422296e-02f, -6.426421918e-03f, +3.330488464e-02f, +5.523428428e-02f, +4.325260613e-02f, +6.217127549e-03f, -2.949417911e-02f, -4.146143697e-02f, -2.741456775e-02f, -3.139230798e-03f, +1.324873218e-02f, +1.499868133e-02f, +7.736629494e-03f, +6.209420216e-04f, -1.899058777e-03f, -1.142065920e-03f,\n    +1.774680651e-05f, -1.028926238e-04f, -2.464586776e-04f, -2.136632816e-04f, +1.223619839e-04f, +5.946179023e-04f, +7.762218530e-04f, +3.438919470e-04f, -5.347912450e-04f, -1.220514691e-03f, -1.109382373e-03f, -1.959326858e-04f, +8.633289495e-04f, +1.288631960e-03f, +8.301307690e-04f, -6.642656459e-05f, -7.009297703e-04f, -7.130173215e-04f, -2.878926567e-04f, +1.313516642e-04f, +2.656625581e-04f, +1.583517357e-04f, +1.287407632e-05f, -4.087927890e-05f,\n    /*  4, 6 (24) */\n    +1.364127725e-03f, +2.302300686e-03f, +8.471594361e-04f, -5.291265859e-03f, -1.536009408e-02f, -2.305551829e-02f, -1.744138348e-02f, +1.158025256e-02f, +6.567331406e-02f, +1.334412458e-01f, +1.930483791e-01f, +2.219452759e-01f, +2.084516074e-01f, +1.580735845e-01f, +9.050456591e-02f, +2.924321956e-02f, -9.648398637e-03f, -2.314944496e-02f, -1.904786751e-02f, -8.812424378e-03f, -8.448757855e-04f, +2.187195929e-03f, +1.824988586e-03f, +6.362773578e-04f,\n    -3.950025171e-05f, -7.591217706e-06f, +1.086795681e-04f, +2.680231957e-04f, +3.267923248e-04f, +1.015216012e-04f, -4.911782716e-04f, -1.309532375e-03f, -1.990484565e-03f, -2.122359012e-03f, -1.498191019e-03f, -2.801996166e-04f, +1.053008532e-03f, +1.959704540e-03f, +2.129195558e-03f, +1.627642745e-03f, +8.131086244e-04f, +9.711619491e-05f, -2.782123463e-04f, -3.147974895e-04f, -1.742296298e-04f, -2.948039595e-05f, +3.547938035e-05f, +3.139016191e-05f,\n    -1.845014936e-03f, -7.876725172e-04f, +4.905919496e-03f, +1.302472264e-02f, +1.541203968e-02f, +4.034565651e-03f, -1.918013113e-02f, -3.902299412e-02f, -3.688901420e-02f, -7.646936609e-03f, +3.219550227e-02f, +5.503835159e-02f, +4.411593508e-02f, +7.505759509e-03f, -2.866404834e-02f, -4.152786353e-02f, -2.811549752e-02f, -3.852248120e-03f, +1.296083952e-02f, +1.513003300e-02f, +8.002292052e-03f, +7.792937573e-04f, -1.886184701e-03f, -1.182945199e-03f,\n    +1.987530445e-05f, -9.795134253e-05f, -2.435106135e-04f, -2.192142359e-04f, +1.080329663e-04f, +5.818078140e-04f, +7.791416723e-04f, +3.665545286e-04f, -5.063196498e-04f, -1.209111664e-03f, -1.126963471e-03f, -2.311925422e-04f, +8.365910557e-04f, +1.289390737e-03f, +8.547421485e-04f, -3.909510354e-05f, -6.901269306e-04f, -7.213609453e-04f, -3.033386091e-04f, +1.219712837e-04f, +2.660352008e-04f, +1.633427247e-04f, +1.629865360e-05f, -4.070845819e-05f,\n    /*  4, 7 (24) */\n    +1.324627473e-03f, +2.294709468e-03f, +9.558390041e-04f, -5.023242663e-03f, -1.503330176e-02f, -2.295399669e-02f, -1.793256175e-02f, +1.027072019e-02f, +6.368282949e-02f, +1.313188867e-01f, +1.915501881e-01f, +2.216650763e-01f, +2.095046159e-01f, +1.600332890e-01f, +9.263376147e-02f, +3.087086231e-02f, -8.835290013e-03f, -2.305232876e-02f, -1.932607986e-02f, -9.127221868e-03f, -1.019105415e-03f, +2.157715533e-03f, +1.860467966e-03f, +6.676675197e-04f,\n    -3.941599517e-05f, -9.817759973e-06f, +1.039061266e-04f, +2.635992146e-04f, +3.283913767e-04f, +1.141800434e-04f, -4.678406184e-04f, -1.283770252e-03f, -1.975640291e-03f, -2.129475483e-03f, -1.528520206e-03f, -3.229887474e-04f, +1.015308940e-03f, +1.941844558e-03f, +2.135348947e-03f, +1.650333910e-03f, +8.389522168e-04f, +1.149523721e-04f, -2.721786476e-04f, -3.173557501e-04f, -1.794138276e-04f, -3.295036037e-05f, +3.471995310e-05f, +3.207352022e-05f,\n    -1.825139632e-03f, -8.856238598e-04f, +4.662408882e-03f, +1.280550840e-02f, +1.552007265e-02f, +4.616373465e-03f, -1.840098946e-02f, -3.865643960e-02f, -3.739533385e-02f, -8.856048273e-03f, +3.106853880e-02f, +5.480715905e-02f, +4.495252614e-02f, +8.795150246e-03f, -2.780930619e-02f, -4.156695864e-02f, -2.880562445e-02f, -4.573609065e-03f, +1.265750091e-02f, +1.525200428e-02f, +8.268327253e-03f, +9.426364820e-04f, -1.869886047e-03f, -1.223653657e-03f,\n    +2.189453686e-05f, -9.304989612e-05f, -2.403921319e-04f, -2.244427192e-04f, +9.387315197e-05f, +5.687212344e-04f, +7.814216028e-04f, +3.887220543e-04f, -4.776818356e-04f, -1.196888238e-03f, -1.143687639e-03f, -2.662708436e-04f, +8.092046148e-04f, +1.289218010e-03f, +8.788807818e-04f, -1.149509324e-05f, -6.786678989e-04f, -7.292420878e-04f, -3.187934335e-04f, +1.122858102e-04f, +2.661523987e-04f, +1.682981552e-04f, +1.982520010e-05f, -4.045682146e-05f,\n    /*  4, 8 (24) */\n    +1.285211478e-03f, +2.284891708e-03f, +1.059745131e-03f, -4.759643448e-03f, -1.470491038e-02f, -2.283981665e-02f, -1.840040237e-02f, +8.986949936e-03f, +6.170718920e-02f, +1.291894113e-01f, +1.900216679e-01f, +2.213420876e-01f, +2.105199249e-01f, +1.619751336e-01f, +9.476911042e-02f, +3.252119622e-02f, -7.996337796e-03f, -2.293737639e-02f, -1.959825850e-02f, -9.444577618e-03f, -1.198519243e-03f, +2.124765172e-03f, +1.895187919e-03f, +6.997410399e-04f,\n    -3.928394304e-05f, -1.195577071e-05f, +9.918700977e-05f, +2.590870968e-04f, +3.297101550e-04f, +1.264596862e-04f, -4.447517036e-04f, -1.257892630e-03f, -1.960253585e-03f, -2.135822399e-03f, -1.558230343e-03f, -3.656417317e-04f, +9.771873217e-04f, +1.923235351e-03f, +2.140813622e-03f, +1.672701532e-03f, +8.648963243e-04f, +1.331393484e-04f, -2.657969177e-04f, -3.197345265e-04f, -1.845979867e-04f, -3.650581267e-05f, +3.388863118e-05f, +3.273766594e-05f,\n    -1.803245095e-03f, -9.786737559e-04f, +4.422016750e-03f, +1.258106569e-02f, +1.561394580e-02f, +5.185094700e-03f, -1.761956786e-02f, -3.826771754e-02f, -3.787301569e-02f, -1.005293651e-02f, +2.992485116e-02f, +5.454088820e-02f, +4.576173075e-02f, +1.008436826e-02f, -2.693042541e-02f, -4.157845373e-02f, -2.948429235e-02f, -5.302851153e-03f, +1.233870748e-02f, +1.536429009e-02f, +8.534479652e-03f, +1.110934637e-03f, -1.850060847e-03f, -1.264110478e-03f,\n    +2.380499576e-05f, -8.819308537e-05f, -2.371103885e-04f, -2.293497828e-04f, +7.989285652e-05f, +5.553734415e-04f, +7.830668693e-04f, +4.103806698e-04f, -4.489019999e-04f, -1.183857869e-03f, -1.159543829e-03f, -3.011401031e-04f, +7.811901687e-04f, +1.288110505e-03f, +9.025245021e-04f, +1.635293224e-05f, -6.665556153e-04f, -7.366479792e-04f, -3.342431068e-04f, +1.022990993e-04f, +2.660085539e-04f, +1.732113900e-04f, +2.345201148e-05f, -4.012208559e-05f,\n    /*  4, 9 (24) */\n    +1.245927535e-03f, +2.272935938e-03f, +1.158932141e-03f, -4.500556352e-03f, -1.437520023e-02f, -2.271335696e-02f, -1.884515407e-02f, +7.729057306e-03f, +5.974693562e-02f, +1.270535889e-01f, +1.884634375e-01f, +2.209764458e-01f, +2.114971122e-01f, +1.638983689e-01f, +9.690992404e-02f, +3.419389775e-02f, -7.131441472e-03f, -2.280423704e-02f, -1.986405542e-02f, -9.764312144e-03f, -1.383117230e-03f, +2.088259360e-03f, +1.929076550e-03f, +7.324787058e-04f,\n    -3.910582102e-05f, -1.400572709e-05f, +9.452494757e-05f, +2.544926232e-04f, +3.307541039e-04f, +1.383606303e-04f, -4.219195767e-04f, -1.231913124e-03f, -1.944336107e-03f, -2.141401579e-03f, -1.587310811e-03f, -4.081406529e-04f, +9.386590117e-04f, +1.903881483e-03f, +2.145582071e-03f, +1.694731869e-03f, +8.909294177e-04f, +1.516732064e-04f, -2.590637962e-04f, -3.219276085e-04f, -1.897776284e-04f, -4.014578915e-05f, +3.298402511e-05f, +3.338102668e-05f,\n    -1.779440099e-03f, -1.066866841e-03f, +4.184906362e-03f, +1.235171590e-02f, +1.569383866e-02f, +5.740468141e-03f, -1.683650099e-02f, -3.785733687e-02f, -3.832191769e-02f, -1.123679438e-02f, +2.876530733e-02f, +5.423974810e-02f, +4.654292092e-02f, +1.137247876e-02f, -2.602790091e-02f, -4.156210080e-02f, -3.015084797e-02f, -6.039499132e-03f, +1.200446437e-02f, +1.546658919e-02f, +8.800488206e-03f, +1.284146027e-03f, -1.826608836e-03f, -1.304232564e-03f,\n    +2.560730777e-05f, -8.338555042e-05f, -2.336725808e-04f, -2.339367939e-04f, +6.610206861e-05f, +5.417797710e-04f, +7.840832211e-04f, +4.315170851e-04f, -4.200043158e-04f, -1.170034648e-03f, -1.174521759e-03f, -3.357730234e-04f, +7.525688233e-04f, +1.286065738e-03f, +9.256514557e-04f, +4.442807088e-05f, -6.537936395e-04f, -7.435661491e-04f, -3.496734189e-04f, +9.201537813e-05f, +2.655982496e-04f, +1.780756998e-04f, +2.717721072e-05f, -3.970202937e-05f,\n    /*  4,10 (24) */\n    +1.206821714e-03f, +2.258930210e-03f, +1.253457088e-03f, -4.246063728e-03f, -1.404444612e-02f, -2.257499633e-02f, -1.926707365e-02f, +6.497144181e-03f, +5.780259951e-02f, +1.249121873e-01f, +1.868761267e-01f, +2.205683052e-01f, +2.124357712e-01f, +1.658022504e-01f, +9.905550611e-02f, +3.588862962e-02f, -6.240512054e-03f, -2.265256384e-02f, -2.012311922e-02f, -1.008623975e-02f, -1.572894858e-03f, +2.048113570e-03f, +1.962060576e-03f, +7.658597325e-04f,\n    -3.888335807e-05f, -1.596818006e-05f, +8.992255611e-05f, +2.498215151e-04f, +3.315287539e-04f, +1.498832080e-04f, -3.993520395e-04f, -1.205845271e-03f, -1.927899717e-03f, -2.146215229e-03f, -1.615751341e-03f, -4.504676821e-04f, +8.997395766e-04f, +1.883787917e-03f, +2.149647103e-03f, +1.716411240e-03f, +9.170397892e-04f, +1.705497664e-04f, -2.519760951e-04f, -3.239287962e-04f, -1.949481748e-04f, -4.386922233e-05f, +3.200478532e-05f, +3.400200914e-05f,\n    -1.753832791e-03f, -1.150252392e-03f, +3.951233781e-03f, +1.211777911e-02f, +1.575994073e-02f, +6.282247912e-03f, -1.605241777e-02f, -3.742581979e-02f, -3.874192200e-02f, -1.240682903e-02f, +2.759078557e-02f, +5.390397508e-02f, +4.729548974e-02f, +1.265854450e-02f, -2.510224946e-02f, -4.151767273e-02f, -3.080464160e-02f, -6.783065281e-03f, +1.165479095e-02f, +1.555860457e-02f, +9.066086455e-03f, +1.462221727e-03f, -1.799431625e-03f, -1.343934593e-03f,\n    +2.730223042e-05f, -7.863176802e-05f, -2.300859391e-04f, -2.382054290e-04f, +5.251044389e-05f, +5.279556008e-04f, +7.844769221e-04f, +4.521185823e-04f, -3.910129090e-04f, -1.155433287e-03f, -1.188611921e-03f, -3.701425216e-04f, +7.233622306e-04f, +1.283082020e-03f, +9.482401246e-04f, +7.270907003e-05f, -6.403861531e-04f, -7.499844418e-04f, -3.650699852e-04f, +8.143924587e-05f, +2.649162596e-04f, +1.828842697e-04f, +3.099874700e-05f, -3.919449805e-05f,\n    /*  4,11 (24) */\n    +1.167938356e-03f, +2.242962030e-03f, +1.343379644e-03f, -3.996242213e-03f, -1.371291737e-02f, -2.242511312e-02f, -1.966642569e-02f, +5.291298910e-03f, +5.587469979e-02f, +1.227659721e-01f, +1.852603754e-01f, +2.201178375e-01f, +2.133355108e-01f, +1.676860383e-01f, +1.012051532e-01f, +3.760504086e-02f, -5.323472265e-03f, -2.248201407e-02f, -2.037509531e-02f, -1.041016855e-02f, -1.767843033e-03f, +2.004244348e-03f, +1.994065361e-03f, +7.998617417e-04f,\n    -3.861828455e-05f, -1.784375216e-05f, +8.538233747e-05f, +2.450794304e-04f, +3.320397166e-04f, +1.610279801e-04f, -3.770566444e-04f, -1.179702524e-03f, -1.910956455e-03f, -2.150265936e-03f, -1.643542021e-03f, -4.926050893e-04f, +8.604448044e-04f, +1.862960013e-03f, +2.153001849e-03f, +1.737726042e-03f, +9.432155588e-04f, +1.897645857e-04f, -2.445308031e-04f, -3.257319050e-04f, -2.001049506e-04f, -4.767493968e-05f, +3.094960441e-05f, +3.459900040e-05f,\n    -1.726530561e-03f, -1.228884160e-03f, +3.721147842e-03f, +1.187957368e-02f, +1.581245117e-02f, +6.810203513e-03f, -1.526794084e-02f, -3.697370120e-02f, -3.913293491e-02f, -1.356226232e-02f, +2.640217365e-02f, +5.353383256e-02f, +4.801885197e-02f, +1.394162652e-02f, -2.415400933e-02f, -4.144496366e-02f, -3.144502776e-02f, -7.533049723e-03f, +1.128972097e-02f, +1.564004381e-02f, +9.331002715e-03f, +1.645105997e-03f, -1.768432878e-03f, -1.383129091e-03f,\n    +2.889064834e-05f, -7.393604918e-05f, -2.263577172e-04f, -2.421576681e-04f, +3.912729931e-05f, +5.139163346e-04f, +7.842547396e-04f, +4.721730237e-04f, -3.619518359e-04f, -1.140069105e-03f, -1.201805585e-03f, -4.042217537e-04f, +6.935925692e-04f, +1.279158464e-03f, +9.702693474e-04f, +1.011743441e-04f, -6.263379604e-04f, -7.558910313e-04f, -3.804182591e-04f, +7.057567423e-05f, +2.639575569e-04f, +1.876302057e-04f, +3.491439479e-05f, -3.859740791e-05f,\n    /*  4,12 (24) */\n    +1.129320071e-03f, +2.225118278e-03f, +1.428761982e-03f, -3.751162783e-03f, -1.338087765e-02f, -2.226408514e-02f, -2.004348233e-02f, +4.111596385e-03f, +5.396374334e-02f, +1.206157061e-01f, +1.836168334e-01f, +2.196252324e-01f, +2.141959556e-01f, +1.695489983e-01f, +1.033581551e-01f, +3.934276690e-02f, -4.380256706e-03f, -2.229224948e-02f, -2.061962612e-02f, -1.073590045e-02f, -1.967947983e-03f, +1.956569408e-03f, +2.025014965e-03f, +8.344607421e-04f,\n    -3.831233032e-05f, -1.963313541e-05f, +8.090667996e-05f, +2.402719605e-04f, +3.322926800e-04f, +1.717957323e-04f, -3.550406920e-04f, -1.153498242e-03f, -1.893518541e-03f, -2.153556667e-03f, -1.670673294e-03f, -5.345352524e-04f, +8.207906967e-04f, +1.841403527e-03f, +2.155639771e-03f, +1.758662752e-03f, +9.694446795e-04f, +2.093129585e-04f, -2.367250903e-04f, -3.273307702e-04f, -2.052431855e-04f, -5.156166247e-05f, +2.981721948e-05f, +3.517036926e-05f,\n    -1.697639913e-03f, -1.302820209e-03f, +3.494790125e-03f, +1.163741601e-02f, +1.585157847e-02f, +7.324119848e-03f, -1.448368610e-02f, -3.650152818e-02f, -3.949488675e-02f, -1.470233142e-02f, +2.520036807e-02f, +5.312961080e-02f, +4.871244454e-02f, +1.522078498e-02f, -2.318373998e-02f, -4.134378931e-02f, -3.207136572e-02f, -8.288940755e-03f, +1.090930271e-02f, +1.571061949e-02f, +9.594960272e-03f, +1.832736202e-03f, -1.733518483e-03f, -1.421726499e-03f,\n    +3.037356937e-05f, -6.930253702e-05f, -2.224951841e-04f, -2.457957871e-04f, +2.596160801e-05f, +4.996773867e-04f, +7.834239334e-04f, +4.916688586e-04f, -3.328450618e-04f, -1.123958007e-03f, -1.214094808e-03f, -4.379841389e-04f, +6.632825249e-04f, +1.274294983e-03f, +9.917183406e-04f, +1.298019927e-04f, -6.116544888e-04f, -7.612744370e-04f, -3.957035450e-04f, +5.943000741e-05f, +2.627173228e-04f, +1.923065421e-04f, +3.892175321e-05f, -3.790875087e-05f,\n    /*  4,13 (24) */\n    +1.091007741e-03f, +2.205485143e-03f, +1.509668662e-03f, -3.510890822e-03f, -1.304858497e-02f, -2.209228941e-02f, -2.039852303e-02f, +2.958098143e-03f, +5.207022480e-02f, +1.184621495e-01f, +1.819461601e-01f, +2.190906972e-01f, +2.150167463e-01f, +1.713904019e-01f, +1.055137948e-01f, +4.110142965e-02f, -3.410812026e-03f, -2.208293652e-02f, -2.085635121e-02f, -1.106323122e-02f, -2.173191169e-03f, +1.905007746e-03f, +2.054832185e-03f, +8.696311113e-04f,\n    -3.796722292e-05f, -2.133708908e-05f, +7.649785829e-05f, +2.354046271e-04f, +3.322934025e-04f, +1.821874723e-04f, -3.333112290e-04f, -1.127245685e-03f, -1.875598366e-03f, -2.156090765e-03f, -1.697135968e-03f, -5.762406683e-04f, +7.807934590e-04f, +1.819124608e-03f, +2.157554666e-03f, +1.779207937e-03f, +9.957149438e-04f, +2.291899164e-04f, -2.285563129e-04f, -3.287192523e-04f, -2.103580158e-04f, -5.552800462e-05f, +2.860641441e-05f, +3.571446765e-05f,\n    -1.667266343e-03f, -1.372122746e-03f, +3.272294941e-03f, +1.139162022e-02f, +1.587754008e-02f, +7.823797235e-03f, -1.370026217e-02f, -3.600985932e-02f, -3.982773181e-02f, -1.582628943e-02f, +2.398627326e-02f, +5.269162666e-02f, +4.937572707e-02f, +1.649507997e-02f, -2.219202164e-02f, -4.121398732e-02f, -3.268302021e-02f, -9.050215191e-03f, +1.051359916e-02f, +1.577004950e-02f, +9.857677594e-03f, +2.025042745e-03f, -1.694596730e-03f, -1.459635250e-03f,\n    +3.175212055e-05f, -6.473520493e-05f, -2.185056152e-04f, -2.491223514e-04f, +1.302199447e-05f, +4.852541662e-04f, +7.819922437e-04f, +5.105951303e-04f, -3.037164389e-04f, -1.107116472e-03f, -1.225472438e-03f, -4.714033835e-04f, +6.324552708e-04f, +1.268492295e-03f, +1.012566720e-03f, +1.585698194e-04f, -5.963417892e-04f, -7.661235378e-04f, -4.109110111e-04f, +4.800796156e-05f, +2.611909559e-04f, +1.969062480e-04f, +4.301824547e-05f, -3.712659903e-05f,\n    /*  4,14 (24) */\n    +1.053040518e-03f, +2.184148054e-03f, +1.586166520e-03f, -3.275486195e-03f, -1.271629157e-02f, -2.191010194e-02f, -2.073183425e-02f, +1.830852458e-03f, +5.019462643e-02f, +1.163060587e-01f, +1.802490241e-01f, +2.185144565e-01f, +2.157975398e-01f, +1.732095265e-01f, +1.076713495e-01f, +4.288063759e-02f, -2.415097083e-03f, -2.185374661e-02f, -2.108490752e-02f, -1.139195048e-02f, -2.383549185e-03f, +1.849479741e-03f, +2.083438599e-03f, +9.053455790e-04f,\n    -3.758468577e-05f, -2.295643745e-05f, +7.215803397e-05f, +2.304828792e-04f, +3.320477083e-04f, +1.922044257e-04f, -3.118750465e-04f, -1.100958005e-03f, -1.857208478e-03f, -2.157871948e-03f, -1.722921219e-03f, -6.177039619e-04f, +7.404694924e-04f, +1.796129796e-03f, +2.158740672e-03f, +1.799348266e-03f, +1.022013989e-03f, +2.493902282e-04f, -2.200220172e-04f, -3.298912414e-04f, -2.154444867e-04f, -5.957247171e-05f, +2.731602220e-05f, +3.622963204e-05f,\n    -1.635514223e-03f, -1.436857951e-03f, +3.053789325e-03f, +1.114249787e-02f, +1.589056207e-02f, +8.309051401e-03f, -1.291826993e-02f, -3.549926419e-02f, -4.013144825e-02f, -1.693340590e-02f, +2.276080082e-02f, +5.222022328e-02f, +5.000818234e-02f, +1.776357226e-02f, -2.117945492e-02f, -4.105541750e-02f, -3.327936200e-02f, -9.816338729e-03f, +1.010268815e-02f, +1.581805746e-02f, +1.011886855e-02f, +2.221948993e-03f, -1.651578484e-03f, -1.496761849e-03f,\n    +3.302754405e-05f, -6.023785490e-05f, -2.143962835e-04f, -2.521402083e-04f, +3.167302584e-07f, +4.706620616e-04f, +7.799678790e-04f, +5.289414813e-04f, -2.745896849e-04f, -1.089561530e-03f, -1.235932120e-03f, -5.044535044e-04f, +6.011344466e-04f, +1.261751929e-03f, +1.032794521e-03f, +1.874553504e-04f, -5.804065349e-04f, -7.704275872e-04f, -4.260257039e-04f, +3.631562396e-05f, +2.593740802e-04f, +2.014222347e-04f, +4.720111872e-05f, -3.624910917e-05f,\n    /*  4,15 (24) */\n    +1.015455832e-03f, +2.161191616e-03f, +1.658324554e-03f, -3.045003316e-03f, -1.238424386e-02f, -2.171789751e-02f, -2.104370930e-02f, +7.298944523e-04f, +4.833741795e-02f, +1.141481867e-01f, +1.785261029e-01f, +2.178967525e-01f, +2.165380092e-01f, +1.750056563e-01f, +1.098300902e-01f, +4.467998586e-02f, -1.393083093e-03f, -2.160435638e-02f, -2.130492954e-02f, -1.172184172e-02f, -2.598993671e-03f, +1.789907270e-03f, +2.110754621e-03f, +9.415752110e-04f,\n    -3.716643644e-05f, -2.449206763e-05f, +6.788925573e-05f, +2.255120901e-04f, +3.315614818e-04f, +2.018480326e-04f, -2.907386786e-04f, -1.074648240e-03f, -1.838361579e-03f, -2.158904301e-03f, -1.748020596e-03f, -6.589078965e-04f, +6.998353837e-04f, +1.772426020e-03f, +2.159192272e-03f, +1.819070515e-03f, +1.048329306e-03f, +2.699084005e-04f, -2.111199439e-04f, -3.308406629e-04f, -2.204975547e-04f, -6.369346004e-05f, +2.594492724e-05f, +3.671418494e-05f,\n    -1.602486679e-03f, -1.497095806e-03f, +2.839393042e-03f, +1.089035766e-02f, +1.589087880e-02f, +8.779713462e-03f, -1.213830205e-02f, -3.497032271e-02f, -4.040603793e-02f, -1.802296743e-02f, +2.152486870e-02f, +5.171576978e-02f, +5.060931679e-02f, +1.902532419e-02f, -2.014666040e-02f, -4.086796215e-02f, -3.385976853e-02f, -1.058676632e-02f, +9.676662449e-03f, +1.585437308e-02f, +1.037824263e-02f, +2.423371227e-03f, -1.604377366e-03f, -1.533010958e-03f,\n    +3.420119301e-05f, -5.581411613e-05f, -2.101744516e-04f, -2.548524797e-04f, -1.214626993e-05f, +4.559164258e-04f, +7.773595044e-04f, +5.466981591e-04f, -2.454883617e-04f, -1.071310751e-03f, -1.245468296e-03f, -5.371088529e-04f, +5.693441375e-04f, +1.254076215e-03f, +1.052382220e-03f, +2.164358544e-04f, -5.638560203e-04f, -7.741762277e-04f, -4.410325610e-04f, +2.435945170e-05f, +2.572625544e-04f, +2.058473631e-04f, +5.146744392e-05f, -3.527452729e-05f,\n    /*  4,16 (24) */\n    +9.782893959e-04f, +2.136699549e-03f, +1.726213810e-03f, -2.819491226e-03f, -1.205268238e-02f, -2.151604948e-02f, -2.133444798e-02f, -3.447537878e-04f, +4.649905637e-02f, +1.119892824e-01f, +1.767780823e-01f, +2.172378446e-01f, +2.172378446e-01f, +1.767780823e-01f, +1.119892824e-01f, +4.649905637e-02f, -3.447537878e-04f, -2.133444798e-02f, -2.151604948e-02f, -1.205268238e-02f, -2.819491226e-03f, +1.726213810e-03f, +2.136699549e-03f, +9.782893959e-04f,\n    -3.671418494e-05f, -2.594492724e-05f, +6.369346004e-05f, +2.204975547e-04f, +3.308406629e-04f, +2.111199439e-04f, -2.699084005e-04f, -1.048329306e-03f, -1.819070515e-03f, -2.159192272e-03f, -1.772426020e-03f, -6.998353837e-04f, +6.589078965e-04f, +1.748020596e-03f, +2.158904301e-03f, +1.838361579e-03f, +1.074648240e-03f, +2.907386786e-04f, -2.018480326e-04f, -3.315614818e-04f, -2.255120901e-04f, -6.788925573e-05f, +2.449206763e-05f, +3.716643644e-05f,\n    -1.568285486e-03f, -1.552909922e-03f, +2.629218590e-03f, +1.063550518e-02f, +1.587873253e-02f, +9.235629888e-03f, -1.136094254e-02f, -3.442362455e-02f, -4.065152629e-02f, -1.909427818e-02f, +2.027940040e-02f, +5.117866092e-02f, +5.117866092e-02f, +2.027940040e-02f, -1.909427818e-02f, -4.065152629e-02f, -3.442362455e-02f, -1.136094254e-02f, +9.235629888e-03f, +1.587873253e-02f, +1.063550518e-02f, +2.629218590e-03f, -1.552909922e-03f, -1.568285486e-03f,\n    +3.527452729e-05f, -5.146744392e-05f, -2.058473631e-04f, -2.572625544e-04f, -2.435945170e-05f, +4.410325610e-04f, +7.741762277e-04f, +5.638560203e-04f, -2.164358544e-04f, -1.052382220e-03f, -1.254076215e-03f, -5.693441375e-04f, +5.371088529e-04f, +1.245468296e-03f, +1.071310751e-03f, +2.454883617e-04f, -5.466981591e-04f, -7.773595044e-04f, -4.559164258e-04f, +1.214626993e-05f, +2.548524797e-04f, +2.101744516e-04f, +5.581411613e-05f, -3.420119301e-05f,\n    /*  4,17 (24) */\n    +9.415752110e-04f, +2.110754621e-03f, +1.789907270e-03f, -2.598993671e-03f, -1.172184172e-02f, -2.130492954e-02f, -2.160435638e-02f, -1.393083093e-03f, +4.467998586e-02f, +1.098300902e-01f, +1.750056563e-01f, +2.165380092e-01f, +2.178967525e-01f, +1.785261029e-01f, +1.141481867e-01f, +4.833741795e-02f, +7.298944523e-04f, -2.104370930e-02f, -2.171789751e-02f, -1.238424386e-02f, -3.045003316e-03f, +1.658324554e-03f, +2.161191616e-03f, +1.015455832e-03f,\n    -3.622963204e-05f, -2.731602220e-05f, +5.957247171e-05f, +2.154444867e-04f, +3.298912414e-04f, +2.200220172e-04f, -2.493902282e-04f, -1.022013989e-03f, -1.799348266e-03f, -2.158740672e-03f, -1.796129796e-03f, -7.404694924e-04f, +6.177039619e-04f, +1.722921219e-03f, +2.157871948e-03f, +1.857208478e-03f, +1.100958005e-03f, +3.118750465e-04f, -1.922044257e-04f, -3.320477083e-04f, -2.304828792e-04f, -7.215803397e-05f, +2.295643745e-05f, +3.758468577e-05f,\n    -1.533010958e-03f, -1.604377366e-03f, +2.423371227e-03f, +1.037824263e-02f, +1.585437308e-02f, +9.676662449e-03f, -1.058676632e-02f, -3.385976853e-02f, -4.086796215e-02f, -2.014666040e-02f, +1.902532419e-02f, +5.060931679e-02f, +5.171576978e-02f, +2.152486870e-02f, -1.802296743e-02f, -4.040603793e-02f, -3.497032271e-02f, -1.213830205e-02f, +8.779713462e-03f, +1.589087880e-02f, +1.089035766e-02f, +2.839393042e-03f, -1.497095806e-03f, -1.602486679e-03f,\n    +3.624910917e-05f, -4.720111872e-05f, -2.014222347e-04f, -2.593740802e-04f, -3.631562396e-05f, +4.260257039e-04f, +7.704275872e-04f, +5.804065349e-04f, -1.874553504e-04f, -1.032794521e-03f, -1.261751929e-03f, -6.011344466e-04f, +5.044535044e-04f, +1.235932120e-03f, +1.089561530e-03f, +2.745896849e-04f, -5.289414813e-04f, -7.799678790e-04f, -4.706620616e-04f, -3.167302584e-07f, +2.521402083e-04f, +2.143962835e-04f, +6.023785490e-05f, -3.302754405e-05f,\n    /*  4,18 (24) */\n    +9.053455790e-04f, +2.083438599e-03f, +1.849479741e-03f, -2.383549185e-03f, -1.139195048e-02f, -2.108490752e-02f, -2.185374661e-02f, -2.415097083e-03f, +4.288063759e-02f, +1.076713495e-01f, +1.732095265e-01f, +2.157975398e-01f, +2.185144565e-01f, +1.802490241e-01f, +1.163060587e-01f, +5.019462643e-02f, +1.830852458e-03f, -2.073183425e-02f, -2.191010194e-02f, -1.271629157e-02f, -3.275486195e-03f, +1.586166520e-03f, +2.184148054e-03f, +1.053040518e-03f,\n    -3.571446765e-05f, -2.860641441e-05f, +5.552800462e-05f, +2.103580158e-04f, +3.287192523e-04f, +2.285563129e-04f, -2.291899164e-04f, -9.957149438e-04f, -1.779207937e-03f, -2.157554666e-03f, -1.819124608e-03f, -7.807934590e-04f, +5.762406683e-04f, +1.697135968e-03f, +2.156090765e-03f, +1.875598366e-03f, +1.127245685e-03f, +3.333112290e-04f, -1.821874723e-04f, -3.322934025e-04f, -2.354046271e-04f, -7.649785829e-05f, +2.133708908e-05f, +3.796722292e-05f,\n    -1.496761849e-03f, -1.651578484e-03f, +2.221948993e-03f, +1.011886855e-02f, +1.581805746e-02f, +1.010268815e-02f, -9.816338729e-03f, -3.327936200e-02f, -4.105541750e-02f, -2.117945492e-02f, +1.776357226e-02f, +5.000818234e-02f, +5.222022328e-02f, +2.276080082e-02f, -1.693340590e-02f, -4.013144825e-02f, -3.549926419e-02f, -1.291826993e-02f, +8.309051401e-03f, +1.589056207e-02f, +1.114249787e-02f, +3.053789325e-03f, -1.436857951e-03f, -1.635514223e-03f,\n    +3.712659903e-05f, -4.301824547e-05f, -1.969062480e-04f, -2.611909559e-04f, -4.800796156e-05f, +4.109110111e-04f, +7.661235378e-04f, +5.963417892e-04f, -1.585698194e-04f, -1.012566720e-03f, -1.268492295e-03f, -6.324552708e-04f, +4.714033835e-04f, +1.225472438e-03f, +1.107116472e-03f, +3.037164389e-04f, -5.105951303e-04f, -7.819922437e-04f, -4.852541662e-04f, -1.302199447e-05f, +2.491223514e-04f, +2.185056152e-04f, +6.473520493e-05f, -3.175212055e-05f,\n    /*  4,19 (24) */\n    +8.696311113e-04f, +2.054832185e-03f, +1.905007746e-03f, -2.173191169e-03f, -1.106323122e-02f, -2.085635121e-02f, -2.208293652e-02f, -3.410812026e-03f, +4.110142965e-02f, +1.055137948e-01f, +1.713904019e-01f, +2.150167463e-01f, +2.190906972e-01f, +1.819461601e-01f, +1.184621495e-01f, +5.207022480e-02f, +2.958098143e-03f, -2.039852303e-02f, -2.209228941e-02f, -1.304858497e-02f, -3.510890822e-03f, +1.509668662e-03f, +2.205485143e-03f, +1.091007741e-03f,\n    -3.517036926e-05f, -2.981721948e-05f, +5.156166247e-05f, +2.052431855e-04f, +3.273307702e-04f, +2.367250903e-04f, -2.093129585e-04f, -9.694446795e-04f, -1.758662752e-03f, -2.155639771e-03f, -1.841403527e-03f, -8.207906967e-04f, +5.345352524e-04f, +1.670673294e-03f, +2.153556667e-03f, +1.893518541e-03f, +1.153498242e-03f, +3.550406920e-04f, -1.717957323e-04f, -3.322926800e-04f, -2.402719605e-04f, -8.090667996e-05f, +1.963313541e-05f, +3.831233032e-05f,\n    -1.459635250e-03f, -1.694596730e-03f, +2.025042745e-03f, +9.857677594e-03f, +1.577004950e-02f, +1.051359916e-02f, -9.050215191e-03f, -3.268302021e-02f, -4.121398732e-02f, -2.219202164e-02f, +1.649507997e-02f, +4.937572707e-02f, +5.269162666e-02f, +2.398627326e-02f, -1.582628943e-02f, -3.982773181e-02f, -3.600985932e-02f, -1.370026217e-02f, +7.823797235e-03f, +1.587754008e-02f, +1.139162022e-02f, +3.272294941e-03f, -1.372122746e-03f, -1.667266343e-03f,\n    +3.790875087e-05f, -3.892175321e-05f, -1.923065421e-04f, -2.627173228e-04f, -5.943000741e-05f, +3.957035450e-04f, +7.612744370e-04f, +6.116544888e-04f, -1.298019927e-04f, -9.917183406e-04f, -1.274294983e-03f, -6.632825249e-04f, +4.379841389e-04f, +1.214094808e-03f, +1.123958007e-03f, +3.328450618e-04f, -4.916688586e-04f, -7.834239334e-04f, -4.996773867e-04f, -2.596160801e-05f, +2.457957871e-04f, +2.224951841e-04f, +6.930253702e-05f, -3.037356937e-05f,\n    /*  4,20 (24) */\n    +8.344607421e-04f, +2.025014965e-03f, +1.956569408e-03f, -1.967947983e-03f, -1.073590045e-02f, -2.061962612e-02f, -2.229224948e-02f, -4.380256706e-03f, +3.934276690e-02f, +1.033581551e-01f, +1.695489983e-01f, +2.141959556e-01f, +2.196252324e-01f, +1.836168334e-01f, +1.206157061e-01f, +5.396374334e-02f, +4.111596385e-03f, -2.004348233e-02f, -2.226408514e-02f, -1.338087765e-02f, -3.751162783e-03f, +1.428761982e-03f, +2.225118278e-03f, +1.129320071e-03f,\n    -3.459900040e-05f, -3.094960441e-05f, +4.767493968e-05f, +2.001049506e-04f, +3.257319050e-04f, +2.445308031e-04f, -1.897645857e-04f, -9.432155588e-04f, -1.737726042e-03f, -2.153001849e-03f, -1.862960013e-03f, -8.604448044e-04f, +4.926050893e-04f, +1.643542021e-03f, +2.150265936e-03f, +1.910956455e-03f, +1.179702524e-03f, +3.770566444e-04f, -1.610279801e-04f, -3.320397166e-04f, -2.450794304e-04f, -8.538233747e-05f, +1.784375216e-05f, +3.861828455e-05f,\n    -1.421726499e-03f, -1.733518483e-03f, +1.832736202e-03f, +9.594960272e-03f, +1.571061949e-02f, +1.090930271e-02f, -8.288940755e-03f, -3.207136572e-02f, -4.134378931e-02f, -2.318373998e-02f, +1.522078498e-02f, +4.871244454e-02f, +5.312961080e-02f, +2.520036807e-02f, -1.470233142e-02f, -3.949488675e-02f, -3.650152818e-02f, -1.448368610e-02f, +7.324119848e-03f, +1.585157847e-02f, +1.163741601e-02f, +3.494790125e-03f, -1.302820209e-03f, -1.697639913e-03f,\n    +3.859740791e-05f, -3.491439479e-05f, -1.876302057e-04f, -2.639575569e-04f, -7.057567423e-05f, +3.804182591e-04f, +7.558910313e-04f, +6.263379604e-04f, -1.011743441e-04f, -9.702693474e-04f, -1.279158464e-03f, -6.935925692e-04f, +4.042217537e-04f, +1.201805585e-03f, +1.140069105e-03f, +3.619518359e-04f, -4.721730237e-04f, -7.842547396e-04f, -5.139163346e-04f, -3.912729931e-05f, +2.421576681e-04f, +2.263577172e-04f, +7.393604918e-05f, -2.889064834e-05f,\n    /*  4,21 (24) */\n    +7.998617417e-04f, +1.994065361e-03f, +2.004244348e-03f, -1.767843033e-03f, -1.041016855e-02f, -2.037509531e-02f, -2.248201407e-02f, -5.323472265e-03f, +3.760504086e-02f, +1.012051532e-01f, +1.676860383e-01f, +2.133355108e-01f, +2.201178375e-01f, +1.852603754e-01f, +1.227659721e-01f, +5.587469979e-02f, +5.291298910e-03f, -1.966642569e-02f, -2.242511312e-02f, -1.371291737e-02f, -3.996242213e-03f, +1.343379644e-03f, +2.242962030e-03f, +1.167938356e-03f,\n    -3.400200914e-05f, -3.200478532e-05f, +4.386922233e-05f, +1.949481748e-04f, +3.239287962e-04f, +2.519760951e-04f, -1.705497664e-04f, -9.170397892e-04f, -1.716411240e-03f, -2.149647103e-03f, -1.883787917e-03f, -8.997395766e-04f, +4.504676821e-04f, +1.615751341e-03f, +2.146215229e-03f, +1.927899717e-03f, +1.205845271e-03f, +3.993520395e-04f, -1.498832080e-04f, -3.315287539e-04f, -2.498215151e-04f, -8.992255611e-05f, +1.596818006e-05f, +3.888335807e-05f,\n    -1.383129091e-03f, -1.768432878e-03f, +1.645105997e-03f, +9.331002715e-03f, +1.564004381e-02f, +1.128972097e-02f, -7.533049723e-03f, -3.144502776e-02f, -4.144496366e-02f, -2.415400933e-02f, +1.394162652e-02f, +4.801885197e-02f, +5.353383256e-02f, +2.640217365e-02f, -1.356226232e-02f, -3.913293491e-02f, -3.697370120e-02f, -1.526794084e-02f, +6.810203513e-03f, +1.581245117e-02f, +1.187957368e-02f, +3.721147842e-03f, -1.228884160e-03f, -1.726530561e-03f,\n    +3.919449805e-05f, -3.099874700e-05f, -1.828842697e-04f, -2.649162596e-04f, -8.143924587e-05f, +3.650699852e-04f, +7.499844418e-04f, +6.403861531e-04f, -7.270907003e-05f, -9.482401246e-04f, -1.283082020e-03f, -7.233622306e-04f, +3.701425216e-04f, +1.188611921e-03f, +1.155433287e-03f, +3.910129090e-04f, -4.521185823e-04f, -7.844769221e-04f, -5.279556008e-04f, -5.251044389e-05f, +2.382054290e-04f, +2.300859391e-04f, +7.863176802e-05f, -2.730223042e-05f,\n    /*  4,22 (24) */\n    +7.658597325e-04f, +1.962060576e-03f, +2.048113570e-03f, -1.572894858e-03f, -1.008623975e-02f, -2.012311922e-02f, -2.265256384e-02f, -6.240512054e-03f, +3.588862962e-02f, +9.905550611e-02f, +1.658022504e-01f, +2.124357712e-01f, +2.205683052e-01f, +1.868761267e-01f, +1.249121873e-01f, +5.780259951e-02f, +6.497144181e-03f, -1.926707365e-02f, -2.257499633e-02f, -1.404444612e-02f, -4.246063728e-03f, +1.253457088e-03f, +2.258930210e-03f, +1.206821714e-03f,\n    -3.338102668e-05f, -3.298402511e-05f, +4.014578915e-05f, +1.897776284e-04f, +3.219276085e-04f, +2.590637962e-04f, -1.516732064e-04f, -8.909294177e-04f, -1.694731869e-03f, -2.145582071e-03f, -1.903881483e-03f, -9.386590117e-04f, +4.081406529e-04f, +1.587310811e-03f, +2.141401579e-03f, +1.944336107e-03f, +1.231913124e-03f, +4.219195767e-04f, -1.383606303e-04f, -3.307541039e-04f, -2.544926232e-04f, -9.452494757e-05f, +1.400572709e-05f, +3.910582102e-05f,\n    -1.343934593e-03f, -1.799431625e-03f, +1.462221727e-03f, +9.066086455e-03f, +1.555860457e-02f, +1.165479095e-02f, -6.783065281e-03f, -3.080464160e-02f, -4.151767273e-02f, -2.510224946e-02f, +1.265854450e-02f, +4.729548974e-02f, +5.390397508e-02f, +2.759078557e-02f, -1.240682903e-02f, -3.874192200e-02f, -3.742581979e-02f, -1.605241777e-02f, +6.282247912e-03f, +1.575994073e-02f, +1.211777911e-02f, +3.951233781e-03f, -1.150252392e-03f, -1.753832791e-03f,\n    +3.970202937e-05f, -2.717721072e-05f, -1.780756998e-04f, -2.655982496e-04f, -9.201537813e-05f, +3.496734189e-04f, +7.435661491e-04f, +6.537936395e-04f, -4.442807088e-05f, -9.256514557e-04f, -1.286065738e-03f, -7.525688233e-04f, +3.357730234e-04f, +1.174521759e-03f, +1.170034648e-03f, +4.200043158e-04f, -4.315170851e-04f, -7.840832211e-04f, -5.417797710e-04f, -6.610206861e-05f, +2.339367939e-04f, +2.336725808e-04f, +8.338555042e-05f, -2.560730777e-05f,\n    /*  4,23 (24) */\n    +7.324787058e-04f, +1.929076550e-03f, +2.088259360e-03f, -1.383117230e-03f, -9.764312144e-03f, -1.986405542e-02f, -2.280423704e-02f, -7.131441472e-03f, +3.419389775e-02f, +9.690992404e-02f, +1.638983689e-01f, +2.114971122e-01f, +2.209764458e-01f, +1.884634375e-01f, +1.270535889e-01f, +5.974693562e-02f, +7.729057306e-03f, -1.884515407e-02f, -2.271335696e-02f, -1.437520023e-02f, -4.500556352e-03f, +1.158932141e-03f, +2.272935938e-03f, +1.245927535e-03f,\n    -3.273766594e-05f, -3.388863118e-05f, +3.650581267e-05f, +1.845979867e-04f, +3.197345265e-04f, +2.657969177e-04f, -1.331393484e-04f, -8.648963243e-04f, -1.672701532e-03f, -2.140813622e-03f, -1.923235351e-03f, -9.771873217e-04f, +3.656417317e-04f, +1.558230343e-03f, +2.135822399e-03f, +1.960253585e-03f, +1.257892630e-03f, +4.447517036e-04f, -1.264596862e-04f, -3.297101550e-04f, -2.590870968e-04f, -9.918700977e-05f, +1.195577071e-05f, +3.928394304e-05f,\n    -1.304232564e-03f, -1.826608836e-03f, +1.284146027e-03f, +8.800488206e-03f, +1.546658919e-02f, +1.200446437e-02f, -6.039499132e-03f, -3.015084797e-02f, -4.156210080e-02f, -2.602790091e-02f, +1.137247876e-02f, +4.654292092e-02f, +5.423974810e-02f, +2.876530733e-02f, -1.123679438e-02f, -3.832191769e-02f, -3.785733687e-02f, -1.683650099e-02f, +5.740468141e-03f, +1.569383866e-02f, +1.235171590e-02f, +4.184906362e-03f, -1.066866841e-03f, -1.779440099e-03f,\n    +4.012208559e-05f, -2.345201148e-05f, -1.732113900e-04f, -2.660085539e-04f, -1.022990993e-04f, +3.342431068e-04f, +7.366479792e-04f, +6.665556153e-04f, -1.635293224e-05f, -9.025245021e-04f, -1.288110505e-03f, -7.811901687e-04f, +3.011401031e-04f, +1.159543829e-03f, +1.183857869e-03f, +4.489019999e-04f, -4.103806698e-04f, -7.830668693e-04f, -5.553734415e-04f, -7.989285652e-05f, +2.293497828e-04f, +2.371103885e-04f, +8.819308537e-05f, -2.380499576e-05f,\n    /*  4,24 (24) */\n    +6.997410399e-04f, +1.895187919e-03f, +2.124765172e-03f, -1.198519243e-03f, -9.444577618e-03f, -1.959825850e-02f, -2.293737639e-02f, -7.996337796e-03f, +3.252119622e-02f, +9.476911042e-02f, +1.619751336e-01f, +2.105199249e-01f, +2.213420876e-01f, +1.900216679e-01f, +1.291894113e-01f, +6.170718920e-02f, +8.986949936e-03f, -1.840040237e-02f, -2.283981665e-02f, -1.470491038e-02f, -4.759643448e-03f, +1.059745131e-03f, +2.284891708e-03f, +1.285211478e-03f,\n    -3.207352022e-05f, -3.471995310e-05f, +3.295036037e-05f, +1.794138276e-04f, +3.173557501e-04f, +2.721786476e-04f, -1.149523721e-04f, -8.389522168e-04f, -1.650333910e-03f, -2.135348947e-03f, -1.941844558e-03f, -1.015308940e-03f, +3.229887474e-04f, +1.528520206e-03f, +2.129475483e-03f, +1.975640291e-03f, +1.283770252e-03f, +4.678406184e-04f, -1.141800434e-04f, -3.283913767e-04f, -2.635992146e-04f, -1.039061266e-04f, +9.817759973e-06f, +3.941599517e-05f,\n    -1.264110478e-03f, -1.850060847e-03f, +1.110934637e-03f, +8.534479652e-03f, +1.536429009e-02f, +1.233870748e-02f, -5.302851153e-03f, -2.948429235e-02f, -4.157845373e-02f, -2.693042541e-02f, +1.008436826e-02f, +4.576173075e-02f, +5.454088820e-02f, +2.992485116e-02f, -1.005293651e-02f, -3.787301569e-02f, -3.826771754e-02f, -1.761956786e-02f, +5.185094700e-03f, +1.561394580e-02f, +1.258106569e-02f, +4.422016750e-03f, -9.786737559e-04f, -1.803245095e-03f,\n    +4.045682146e-05f, -1.982520010e-05f, -1.682981552e-04f, -2.661523987e-04f, -1.122858102e-04f, +3.187934335e-04f, +7.292420878e-04f, +6.786678989e-04f, +1.149509324e-05f, -8.788807818e-04f, -1.289218010e-03f, -8.092046148e-04f, +2.662708436e-04f, +1.143687639e-03f, +1.196888238e-03f, +4.776818356e-04f, -3.887220543e-04f, -7.814216028e-04f, -5.687212344e-04f, -9.387315197e-05f, +2.244427192e-04f, +2.403921319e-04f, +9.304989612e-05f, -2.189453686e-05f,\n    /*  4,25 (24) */\n    +6.676675197e-04f, +1.860467966e-03f, +2.157715533e-03f, -1.019105415e-03f, -9.127221868e-03f, -1.932607986e-02f, -2.305232876e-02f, -8.835290013e-03f, +3.087086231e-02f, +9.263376147e-02f, +1.600332890e-01f, +2.095046159e-01f, +2.216650763e-01f, +1.915501881e-01f, +1.313188867e-01f, +6.368282949e-02f, +1.027072019e-02f, -1.793256175e-02f, -2.295399669e-02f, -1.503330176e-02f, -5.023242663e-03f, +9.558390041e-04f, +2.294709468e-03f, +1.324627473e-03f,\n    -3.139016191e-05f, -3.547938035e-05f, +2.948039595e-05f, +1.742296298e-04f, +3.147974895e-04f, +2.782123463e-04f, -9.711619491e-05f, -8.131086244e-04f, -1.627642745e-03f, -2.129195558e-03f, -1.959704540e-03f, -1.053008532e-03f, +2.801996166e-04f, +1.498191019e-03f, +2.122359012e-03f, +1.990484565e-03f, +1.309532375e-03f, +4.911782716e-04f, -1.015216012e-04f, -3.267923248e-04f, -2.680231957e-04f, -1.086795681e-04f, +7.591217706e-06f, +3.950025171e-05f,\n    -1.223653657e-03f, -1.869886047e-03f, +9.426364820e-04f, +8.268327253e-03f, +1.525200428e-02f, +1.265750091e-02f, -4.573609065e-03f, -2.880562445e-02f, -4.156695864e-02f, -2.780930619e-02f, +8.795150246e-03f, +4.495252614e-02f, +5.480715905e-02f, +3.106853880e-02f, -8.856048273e-03f, -3.739533385e-02f, -3.865643960e-02f, -1.840098946e-02f, +4.616373465e-03f, +1.552007265e-02f, +1.280550840e-02f, +4.662408882e-03f, -8.856238598e-04f, -1.825139632e-03f,\n    +4.070845819e-05f, -1.629865360e-05f, -1.633427247e-04f, -2.660352008e-04f, -1.219712837e-04f, +3.033386091e-04f, +7.213609453e-04f, +6.901269306e-04f, +3.909510354e-05f, -8.547421485e-04f, -1.289390737e-03f, -8.365910557e-04f, +2.311925422e-04f, +1.126963471e-03f, +1.209111664e-03f, +5.063196498e-04f, -3.665545286e-04f, -7.791416723e-04f, -5.818078140e-04f, -1.080329663e-04f, +2.192142359e-04f, +2.435106135e-04f, +9.795134253e-05f, -1.987530445e-05f,\n    /*  4,26 (24) */\n    +6.362773578e-04f, +1.824988586e-03f, +2.187195929e-03f, -8.448757855e-04f, -8.812424378e-03f, -1.904786751e-02f, -2.314944496e-02f, -9.648398637e-03f, +2.924321956e-02f, +9.050456591e-02f, +1.580735845e-01f, +2.084516074e-01f, +2.219452759e-01f, +1.930483791e-01f, +1.334412458e-01f, +6.567331406e-02f, +1.158025256e-02f, -1.744138348e-02f, -2.305551829e-02f, -1.536009408e-02f, -5.291265859e-03f, +8.471594361e-04f, +2.302300686e-03f, +1.364127725e-03f,\n    -3.068914123e-05f, -3.616833997e-05f, +2.609678061e-05f, +1.690497713e-04f, +3.120659607e-04f, +2.839015417e-04f, -7.963447218e-05f, -7.873768925e-04f, -1.604641837e-03f, -2.122361275e-03f, -1.976811134e-03f, -1.090271000e-03f, +2.372923342e-04f, +1.467253741e-03f, +2.114471558e-03f, +2.004774947e-03f, +1.335165314e-03f, +5.147563692e-04f, -8.848449348e-05f, -3.249076470e-04f, -2.723532024e-04f, -1.135044900e-04f, +5.275742626e-06f, +3.953499220e-05f,\n    -1.182945199e-03f, -1.886184701e-03f, +7.792937573e-04f, +8.002292052e-03f, +1.513003300e-02f, +1.296083952e-02f, -3.852248120e-03f, -2.811549752e-02f, -4.152786353e-02f, -2.866404834e-02f, +7.505759509e-03f, +4.411593508e-02f, +5.503835159e-02f, +3.219550227e-02f, -7.646936609e-03f, -3.688901420e-02f, -3.902299412e-02f, -1.918013113e-02f, +4.034565651e-03f, +1.541203968e-02f, +1.302472264e-02f, +4.905919496e-03f, -7.876725172e-04f, -1.845014936e-03f,\n    +4.087927890e-05f, -1.287407632e-05f, -1.583517357e-04f, -2.656625581e-04f, -1.313516642e-04f, +2.878926567e-04f, +7.130173215e-04f, +7.009297703e-04f, +6.642656459e-05f, -8.301307690e-04f, -1.288631960e-03f, -8.633289495e-04f, +1.959326858e-04f, +1.109382373e-03f, +1.220514691e-03f, +5.347912450e-04f, -3.438919470e-04f, -7.762218530e-04f, -5.946179023e-04f, -1.223619839e-04f, +2.136632816e-04f, +2.464586776e-04f, +1.028926238e-04f, -1.774680651e-05f,\n    /*  4,27 (24) */\n    +6.055882166e-04f, +1.788820246e-03f, +2.213292709e-03f, -6.758260142e-04f, -8.500358418e-03f, -1.876396597e-02f, -2.322907943e-02f, -1.043577553e-02f, +2.763857773e-02f, +8.838220464e-02f, +1.560967734e-01f, +2.073613364e-01f, +2.221825683e-01f, +1.945156329e-01f, +1.355557173e-01f, +6.767808900e-02f, +1.291541788e-02f, -1.692662711e-02f, -2.314400279e-02f, -1.568500173e-02f, -5.563619061e-03f, +7.336549461e-04f, +2.307576429e-03f, +1.403662717e-03f,\n    -2.997198507e-05f, -3.678829431e-05f, +2.280027447e-05f, +1.638785275e-04f, +3.091673808e-04f, +2.892499246e-04f, -6.251059783e-05f, -7.617681777e-04f, -1.581345032e-03f, -2.114854228e-03f, -1.993160576e-03f, -1.127081495e-03f, +1.942849625e-04f, +1.435719672e-03f, +2.105812081e-03f, +2.018500186e-03f, +1.360655321e-03f, +5.385663751e-04f, -7.506909163e-05f, -3.227320879e-04f, -2.765833440e-04f, -1.183779345e-04f, +2.871011414e-06f, +3.951850337e-05f,\n    -1.142065920e-03f, -1.899058777e-03f, +6.209420216e-04f, +7.736629494e-03f, +1.499868133e-02f, +1.324873218e-02f, -3.139230798e-03f, -2.741456775e-02f, -4.146143697e-02f, -2.949417911e-02f, +6.217127549e-03f, +4.325260613e-02f, +5.523428428e-02f, +3.330488464e-02f, -6.426421918e-03f, -3.635422296e-02f, -3.936688607e-02f, -1.995635298e-02f, +3.439947749e-03f, +1.528967770e-02f, +1.323838592e-02f, +5.152378173e-03f, -6.847798935e-04f, -1.862761743e-03f,\n    +4.097162398e-05f, -9.553001232e-06f, -1.533317275e-04f, -2.650402404e-04f, -1.404234661e-04f, +2.724694003e-04f, +7.042242699e-04f, +7.110740955e-04f, +9.346932708e-05f, -8.050691020e-04f, -1.286945741e-03f, -8.893983368e-04f, +1.605189261e-04f, +1.090956146e-03f, +1.231084514e-03f, +5.630724209e-04f, -3.207487185e-04f, -7.726574551e-04f, -6.071362952e-04f, -1.368495688e-04f, +2.077891270e-04f, +2.492292190e-04f, +1.078687810e-04f, -1.550868921e-05f,\n    /*  4,28 (24) */\n    +5.756162315e-04f, +1.752031952e-03f, +2.236092984e-03f, -5.119474867e-04f, -8.191191037e-03f, -1.847471604e-02f, -2.329159003e-02f, -1.119754371e-02f, +2.605723269e-02f, +8.626735041e-02f, +1.541036128e-01f, +2.062342549e-01f, +2.223768532e-01f, +1.959513525e-01f, +1.376615294e-01f, +6.969658919e-02f, +1.427607320e-02f, -1.638806074e-02f, -2.321907188e-02f, -1.600773382e-02f, -5.840202405e-03f, +6.152770116e-04f, +2.310447440e-03f, +1.443181221e-03f,\n    -2.924019581e-05f, -3.734073876e-05f, +1.959153804e-05f, +1.587200698e-04f, +3.061079629e-04f, +2.942613438e-04f, -4.574770527e-05f, -7.362934421e-04f, -1.557766215e-03f, -2.106682842e-03f, -2.008749506e-03f, -1.163425423e-03f, +1.511956212e-04f, +1.403600444e-03f, +2.096379936e-03f, +2.031649253e-03f, +1.385988598e-03f, +5.625995143e-04f, -6.127600737e-05f, -3.202604942e-04f, -2.807076808e-04f, -1.232968301e-04f, +3.767807771e-07f, +3.944908116e-05f,\n    -1.101094296e-03f, -1.908611778e-03f, +4.676102941e-04f, +7.471589254e-03f, +1.485825787e-02f, +1.352120158e-02f, -2.435006529e-03f, -2.670349365e-02f, -4.136796764e-02f, -3.029924821e-02f, +4.930181808e-03f, +4.236320779e-02f, +5.539480320e-02f, +3.439584079e-02f, -5.195337404e-03f, -3.579115054e-02f, -3.968763479e-02f, -2.072901044e-02f, +2.832811454e-03f, +1.515282813e-02f, +1.344617505e-02f, +5.401607392e-03f, -5.769111124e-04f, -1.878270432e-03f,\n    +4.098788653e-05f, -6.336791463e-06f, -1.482891349e-04f, -2.641741805e-04f, -1.491835725e-04f, +2.570824535e-04f, +6.949951116e-04f, +7.205581984e-04f, +1.202036428e-04f, -7.795798755e-04f, -1.284336918e-03f, -9.147798576e-04f, +1.249790545e-04f, +1.071697343e-03f, +1.240808997e-03f, +5.911389977e-04f, -2.971397975e-04f, -7.684443329e-04f, -6.193478786e-04f, -1.514847712e-04f, +2.015913700e-04f, +2.518151926e-04f, +1.128747009e-04f, -1.316074035e-05f,\n    /*  4,29 (24) */\n    +5.463760357e-04f, +1.714691213e-03f, +2.255684522e-03f, -3.532274169e-04f, -7.885083074e-03f, -1.818045470e-02f, -2.333733773e-02f, -1.193383715e-02f, +2.449946648e-02f, +8.416066757e-02f, +1.520948633e-01f, +2.050708295e-01f, +2.225280488e-01f, +1.973549530e-01f, +1.397579093e-01f, +7.172823844e-02f, +1.566206180e-02f, -1.582546122e-02f, -2.328034788e-02f, -1.632799431e-02f, -6.120910086e-03f, +4.919801815e-04f, +2.310824221e-03f, +1.482630302e-03f,\n    -2.849525023e-05f, -3.782719946e-05f, +1.647113367e-05f, +1.535784642e-04f, +3.028939125e-04f, +2.989398010e-04f, -2.934866841e-05f, -7.109634486e-04f, -1.533919301e-03f, -2.097855838e-03f, -2.023574966e-03f, -1.199288455e-03f, +1.080424771e-04f, +1.370908015e-03f, +2.086174875e-03f, +2.044211344e-03f, +1.411151296e-03f, +5.868467756e-04f, -4.710609530e-05f, -3.174878198e-04f, -2.847202272e-04f, -1.282579919e-04f, -2.207110546e-06f, +3.932503274e-05f,\n    -1.060106409e-03f, -1.914948570e-03f, +3.193211593e-04f, +7.207415073e-03f, +1.470907429e-02f, +1.377828403e-02f, -1.740011417e-03f, -2.598293546e-02f, -4.124776400e-02f, -3.107882809e-02f, +3.645844890e-03f, +4.144842794e-02f, +5.551978226e-02f, +3.546753813e-02f, -3.954528407e-03f, -3.520001154e-02f, -3.998477459e-02f, -2.149745477e-02f, +2.213463575e-03f, +1.500134336e-02f, +1.364776642e-02f, +5.653422585e-03f, -4.640364116e-04f, -1.891431172e-03f,\n    +4.093050783e-05f, -3.226641988e-06f, -1.432302827e-04f, -2.630704645e-04f, -1.576292334e-04f, +2.417452079e-04f, +6.853434200e-04f, +7.293809816e-04f, +1.466101804e-04f, -7.536860648e-04f, -1.280811105e-03f, -9.394547681e-04f, +8.934097687e-05f, +1.051619252e-03f, +1.249676678e-03f, +6.189668383e-04f, -2.730806734e-04f, -7.635788941e-04f, -6.312376447e-04f, -1.662563353e-04f, +1.950699416e-04f, +2.542096223e-04f, +1.179051185e-04f, -1.070289269e-05f,\n    /*  4,30 (24) */\n    +5.178807854e-04f, +1.676864013e-03f, +2.272155655e-03f, -1.996489527e-04f, -7.582189161e-03f, -1.788151490e-02f, -2.336668640e-02f, -1.264480060e-02f, +2.296554718e-02f, +8.206281173e-02f, +1.500712883e-01f, +2.038715410e-01f, +2.226360913e-01f, +1.987258610e-01f, +1.418440842e-01f, +7.377244979e-02f, +1.707321309e-02f, -1.523861445e-02f, -2.332745398e-02f, -1.664548213e-02f, -6.405630313e-03f, +3.637221897e-04f, +2.308617110e-03f, +1.521955334e-03f,\n    -2.773859848e-05f, -3.824923106e-05f, +1.343952718e-05f, +1.484576699e-04f, +2.995314222e-04f, +3.032894465e-04f, -1.331610283e-05f, -6.857887560e-04f, -1.509818226e-03f, -2.088382221e-03f, -2.037634402e-03f, -1.234656532e-03f, +6.484373343e-05f, +1.337654664e-03f, +2.075197043e-03f, +2.056175888e-03f, +1.436129532e-03f, +6.112989155e-04f, -3.256045541e-05f, -3.144091316e-04f, -2.886149562e-04f, -1.332581224e-04f, -4.880739804e-06f, +3.914467862e-05f,\n    -1.019175901e-03f, -1.918175212e-03f, +1.760908766e-04f, +6.944344609e-03f, +1.455144506e-02f, +1.402002924e-02f, -1.054667997e-03f, -2.525355447e-02f, -4.110115382e-02f, -3.183251415e-02f, +2.365033785e-03f, +4.050897317e-02f, +5.560912323e-02f, +3.651915739e-02f, -2.704851729e-03f, -3.458104470e-02f, -4.025785526e-02f, -2.226103367e-02f, +1.582225931e-03f, +1.483508702e-02f, +1.384283636e-02f, +5.907632207e-03f, -3.461312931e-04f, -1.902134065e-03f,\n    +4.080197272e-05f, -2.235815352e-07f, -1.381613802e-04f, -2.617353228e-04f, -1.657580629e-04f, +2.264708226e-04f, +6.752830043e-04f, +7.375419549e-04f, +1.726700408e-04f, -7.274108696e-04f, -1.276374679e-03f, -9.634049570e-04f, +5.363268835e-05f, +1.030735887e-03f, +1.257676790e-03f, +6.465318711e-04f, -2.485873599e-04f, -7.580581083e-04f, -6.427907079e-04f, -1.811527070e-04f, +1.882251109e-04f, +2.564056106e-04f, +1.229546211e-04f, -8.135227175e-06f,\n    /*  4,31 (24) */\n    +4.901421870e-04f, +1.638614782e-03f, +2.285595183e-03f, -5.119128274e-05f, -7.282657739e-03f, -1.757822545e-02f, -2.338000250e-02f, -1.333058935e-02f, +2.145572895e-02f, +7.997442951e-02f, +1.480336539e-01f, +2.026368845e-01f, +2.227009351e-01f, +2.000635157e-01f, +1.439192813e-01f, +7.582862567e-02f, +1.850934262e-02f, -1.462731553e-02f, -2.336001444e-02f, -1.695989127e-02f, -6.694245269e-03f, +2.304640673e-04f, +2.303736370e-03f, +1.561100013e-03f,\n    -2.697166309e-05f, -3.860841448e-05f, +1.049708950e-05f, +1.433615383e-04f, +2.960266674e-04f, +3.073145736e-04f, +2.347632839e-06f, -6.607797145e-04f, -1.485476938e-03f, -2.078271276e-03f, -2.050925659e-03f, -1.269515872e-03f, +2.161761953e-05f, +1.303852983e-03f, +2.063446989e-03f, +2.067532558e-03f, +1.460909391e-03f, +6.359464612e-04f, -1.764043540e-05f, -3.110196137e-04f, -2.923858025e-04f, -1.382938117e-04f, -7.644098300e-06f, +3.890635472e-05f,\n    -9.783739287e-04f, -1.918398793e-03f, +3.792949637e-05f, +6.682609286e-03f, +1.438568700e-02f, +1.424650006e-02f, -3.793849927e-04f, -2.451601252e-02f, -4.092848378e-02f, -3.255992502e-02f, +1.088659106e-03f, +3.954556821e-02f, +5.566275592e-02f, +3.754989327e-02f, -1.447174939e-03f, -3.393451283e-02f, -4.050644262e-02f, -2.301909178e-02f, +9.394352227e-04f, +1.465393432e-02f, +1.403106147e-02f, +6.164037818e-03f, -2.231766720e-04f, -1.910269292e-03f,\n    +4.060480517e-05f, +2.671525331e-06f, -1.330885160e-04f, -2.601751204e-04f, -1.735680368e-04f, +2.112722132e-04f, +6.648278939e-04f, +7.450412298e-04f, +1.983647722e-04f, -7.007776918e-04f, -1.271034774e-03f, -9.866129608e-04f, +1.788224777e-05f, +1.009061979e-03f, +1.264799271e-03f, +6.738101129e-04f, -2.236763837e-04f, -7.518795146e-04f, -6.539923216e-04f, -1.961620417e-04f, +1.810574896e-04f, +2.583963475e-04f, +1.280176524e-04f, -5.457975959e-06f,\n    /*  5, 0 (24) */\n    -3.157209003e-04f, +2.200933252e-03f, +6.514604421e-03f, +7.225487889e-03f, -2.813138603e-03f, -2.309221197e-02f, -3.776234036e-02f, -2.075986699e-02f, +4.463545552e-02f, +1.458003526e-01f, +2.399263239e-01f, +2.784031908e-01f, +2.399263239e-01f, +1.458003526e-01f, +4.463545552e-02f, -2.075986699e-02f, -3.776234036e-02f, -2.309221197e-02f, -2.813138603e-03f, +7.225487889e-03f, +6.514604421e-03f, +2.200933252e-03f, -3.157209003e-04f, -4.745985996e-04f,\n    -3.344837876e-05f, -1.203735541e-04f, -1.201025358e-04f, +1.113283129e-04f, +5.071816554e-04f, +6.716327570e-04f, +1.159330534e-04f, -1.237233007e-03f, -2.741342671e-03f, -3.328246260e-03f, -2.312914962e-03f, -3.949986729e-05f, +2.256128833e-03f, +3.321960433e-03f, +2.779048968e-03f, +1.287112166e-03f, -8.426151525e-05f, -6.671755267e-04f, -5.185867868e-04f, -1.224586306e-04f, +1.168135820e-04f, +1.225914265e-04f, +3.593688915e-05f, -1.363314209e-05f,\n    -1.065756848e-03f, -5.278430402e-03f, -6.652854040e-03f, +2.225777551e-03f, +1.817429953e-02f, +2.347202169e-02f, +3.321147688e-03f, -3.097435754e-02f, -4.527341035e-02f, -1.784651672e-02f, +3.123613533e-02f, +5.568063817e-02f, +3.123613533e-02f, -1.784651672e-02f, -4.527341035e-02f, -3.097435754e-02f, +3.321147688e-03f, +2.347202169e-02f, +1.817429953e-02f, +2.225777551e-03f, -6.652854040e-03f, -5.278430402e-03f, -1.065756848e-03f, +4.898976646e-04f,\n    +9.908417991e-05f, +1.330920197e-04f, -8.725054394e-05f, -4.448139414e-04f, -4.501546129e-04f, +1.925170661e-04f, +9.852348420e-04f, +9.604702507e-04f, -1.665956790e-04f, -1.399459798e-03f, -1.397566761e-03f, -2.620026282e-05f, +1.371426028e-03f, +1.423191721e-03f, +2.113441000e-04f, -9.398775262e-04f, -1.001351655e-03f, -2.198341146e-04f, +4.396205809e-04f, +4.531964488e-04f, +9.822200801e-05f, -1.306068552e-04f, -1.022919954e-04f, -4.211524069e-06f,\n    /*  5, 1 (24) */\n    -3.491692790e-04f, +2.080559698e-03f, +6.394501885e-03f, +7.336816202e-03f, -2.305956948e-03f, -2.242057921e-02f, -3.764640731e-02f, -2.199710000e-02f, +4.189411285e-02f, +1.424721063e-01f, +2.376134089e-01f, +2.783636910e-01f, +2.421824527e-01f, +1.491223130e-01f, +4.741450448e-02f, -1.947275482e-02f, -3.784660187e-02f, -2.375938750e-02f, -3.331725390e-03f, +7.103029259e-03f, +6.631418003e-03f, +2.323524679e-03f, -2.797840111e-04f, -4.882317417e-04f,\n    -3.100945145e-05f, -1.180738813e-04f, -1.231474882e-04f, +1.003898453e-04f, +4.955618386e-04f, +6.753511633e-04f, +1.467591928e-04f, -1.187542172e-03f, -2.702707759e-03f, -3.332873833e-03f, -2.368390551e-03f, -1.184764218e-04f, +2.198061489e-03f, +3.314009081e-03f, +2.815793091e-03f, +1.337148185e-03f, -5.175319886e-05f, -6.619669015e-04f, -5.297602692e-04f, -1.337733593e-04f, +1.132776529e-04f, +1.247218530e-04f, +3.847281259e-05f, -1.306337424e-05f,\n    -9.666726676e-04f, -5.145338382e-03f, -6.740104584e-03f, +1.780963610e-03f, +1.772414492e-02f, +2.366453876e-02f, +4.306382530e-03f, -3.001388729e-02f, -4.544000602e-02f, -1.924597652e-02f, +2.983856857e-02f, +5.565443791e-02f, +3.260756136e-02f, -1.642332500e-02f, -4.506206625e-02f, -3.191423507e-02f, +2.319796034e-03f, +2.325218758e-02f, +1.861392011e-02f, +2.678974000e-03f, -6.554632032e-03f, -5.409037257e-03f, -1.168048843e-03f, +4.856861405e-04f,\n    +9.582297529e-05f, +1.353001982e-04f, -7.645233616e-05f, -4.360731296e-04f, -4.599789698e-04f, +1.653967645e-04f, +9.682574761e-04f, +9.798613549e-04f, -1.219875182e-04f, -1.374406946e-03f, -1.422226433e-03f, -7.857232390e-05f, +1.343829552e-03f, +1.445570939e-03f, +2.561839252e-04f, -9.180958213e-04f, -1.016579433e-03f, -2.473179135e-04f, +4.283780575e-04f, +4.612023484e-04f, +1.093551967e-04f, -1.278408987e-04f, -1.054388668e-04f, -6.384690347e-06f,\n    /*  5, 2 (24) */\n    -3.801787305e-04f, +1.962485817e-03f, +6.271354397e-03f, +7.437206048e-03f, -1.810395109e-03f, -2.174522805e-02f, -3.749964811e-02f, -2.318464217e-02f, +3.919140509e-02f, +1.391392325e-01f, +2.352450184e-01f, +2.782452146e-01f, +2.443805142e-01f, +1.524363221e-01f, +5.023029758e-02f, -1.813560664e-02f, -3.789835507e-02f, -2.442135440e-02f, -3.861485659e-03f, +6.969255899e-03f, +6.744695656e-03f, +2.448246532e-03f, -2.413111985e-04f, -5.012951160e-04f,\n    -2.862214005e-05f, -1.156980079e-04f, -1.259516305e-04f, +8.965028562e-05f, +4.837441552e-04f, +6.783437400e-04f, +1.767321185e-04f, -1.138070623e-03f, -2.663178182e-03f, -3.335851552e-03f, -2.422527267e-03f, -1.973834540e-04f, +2.138743223e-03f, +3.304386071e-03f, +2.851541903e-03f, +1.387309121e-03f, -1.841753301e-05f, -6.559947516e-04f, -5.406850090e-04f, -1.452646791e-04f, +1.094920003e-04f, +1.267591490e-04f, +4.105384145e-05f, -1.243525760e-05f,\n    -8.708496923e-04f, -5.010038184e-03f, -6.816556920e-03f, +1.344890481e-03f, +1.726416595e-02f, +2.382993552e-02f, +5.274640006e-03f, -2.903402594e-02f, -4.556199354e-02f, -2.062038347e-02f, +2.841634214e-02f, +5.557586558e-02f, +3.395139091e-02f, -1.497775406e-02f, -4.480588232e-02f, -3.283233089e-02f, +1.303216601e-03f, +2.300486966e-02f, +1.904229817e-02f, +3.140176349e-03f, -6.445276836e-03f, -5.536878156e-03f, -1.273487710e-03f, +4.793014501e-04f,\n    +9.251582846e-05f, +1.372355424e-04f, -6.583842639e-05f, -4.269924794e-04f, -4.690934086e-04f, +1.385025771e-04f, +9.504487886e-04f, +9.980397348e-04f, -7.756801037e-05f, -1.348066343e-03f, -1.445381490e-03f, -1.308590259e-04f, +1.314804383e-03f, +1.466567125e-03f, +3.010658936e-04f, -8.951393075e-04f, -1.030890490e-03f, -2.749378696e-04f, +4.164291790e-04f, +4.688135280e-04f, +1.206380968e-04f, -1.247907041e-04f, -1.085171417e-04f, -8.647893339e-06f,\n    /*  5, 3 (24) */\n    -4.088008705e-04f, +1.846787809e-03f, +6.145402767e-03f, +7.526856333e-03f, -1.326650954e-03f, -2.106688431e-02f, -3.732291599e-02f, -2.432271279e-02f, +3.652822691e-02f, +1.358033809e-01f, +2.328224911e-01f, +2.780478311e-01f, +2.465192574e-01f, +1.557407082e-01f, +5.308183948e-02f, -1.674829752e-02f, -3.791677261e-02f, -2.507734915e-02f, -4.402170668e-03f, +6.823991220e-03f, +6.854187656e-03f, +2.575005681e-03f, -2.002573571e-04f, -5.137303736e-04f,\n    -2.628834081e-05f, -1.132514817e-04f, -1.285183626e-04f, +7.911631081e-05f, +4.717452654e-04f, +6.806238860e-04f, +2.058448186e-04f, -1.088848800e-03f, -2.622788251e-03f, -3.337188933e-03f, -2.475297788e-03f, -2.761746757e-04f, +2.078205281e-03f, +3.293086424e-03f, +2.886262718e-03f, +1.437562572e-03f, +1.573524375e-05f, -6.492474063e-04f, -5.513437972e-04f, -1.569243904e-04f, +1.054541107e-04f, +1.286975968e-04f, +4.367753023e-05f, -1.174769073e-05f,\n    -7.783338639e-04f, -4.872802642e-03f, -6.882395347e-03f, +9.178980012e-04f, +1.679507254e-02f, +2.396843810e-02f, +6.225088795e-03f, -2.803598620e-02f, -4.563956155e-02f, -2.196844981e-02f, +2.697096065e-02f, +5.544500656e-02f, +3.526619530e-02f, -1.351118694e-02f, -4.450481643e-02f, -3.372747020e-02f, +2.723261116e-04f, +2.272993179e-02f, +1.945872735e-02f, +3.608989877e-03f, -6.324638739e-03f, -5.661668860e-03f, -1.382004851e-03f, +4.706535568e-04f,\n    +8.917006763e-05f, +1.389025366e-04f, -5.541935889e-05f, -4.175905900e-04f, -4.774986143e-04f, +1.118632115e-04f, +9.318387172e-04f, +1.014995825e-03f, -3.338502793e-05f, -1.320472530e-03f, -1.467010163e-03f, -1.830035781e-04f, +1.284379276e-03f, +1.486151448e-03f, +3.459403981e-04f, -8.710236820e-04f, -1.044257977e-03f, -3.026628272e-04f, +4.037770445e-04f, +4.760120962e-04f, +1.320582228e-04f, -1.214531979e-04f, -1.115190818e-04f, -1.099953653e-05f,\n    /*  5, 4 (24) */\n    -4.350892113e-04f, +1.733536327e-03f, +6.016884404e-03f, +7.605972644e-03f, -8.549056885e-04f, -2.038626042e-02f, -3.711707118e-02f, -2.541156159e-02f, +3.390543865e-02f, +1.324661920e-01f, +2.303471933e-01f, +2.777716564e-01f, +2.485974627e-01f, +1.590337946e-01f, +5.596810220e-02f, -1.531073495e-02f, -3.790103736e-02f, -2.572659656e-02f, -4.953514465e-03f, +6.667066830e-03f, +6.959641767e-03f, +2.703703278e-03f, -1.565798269e-04f, -5.254780643e-04f,\n    -2.400981416e-05f, -1.107397924e-04f, -1.308512845e-04f, +6.879421704e-05f, +4.595816567e-04f, +6.822053868e-04f, +2.340910800e-04f, -1.039906603e-03f, -2.581572607e-03f, -3.336896596e-03f, -2.526675818e-03f, -3.548038886e-04f, +2.016479832e-03f, +3.280106316e-03f, +2.919923330e-03f, +1.487875705e-03f, +5.069408217e-05f, -6.417136720e-04f, -5.617193249e-04f, -1.687439147e-04f, +1.011617129e-04f, +1.305314530e-04f, +4.634129554e-05f, -1.099963891e-05f,\n    -6.891637963e-04f, -4.733900105e-03f, -6.937814706e-03f, +5.003074112e-04f, +1.631757393e-02f, +2.408030131e-02f, +7.156927512e-03f, -2.702099038e-02f, -4.567294658e-02f, -2.328892234e-02f, +2.550395049e-02f, +5.526200298e-02f, +3.655057457e-02f, -1.202503549e-02f, -4.415887603e-02f, -3.459849388e-02f, -7.719318653e-04f, +2.242726897e-02f, +1.986250440e-02f, +4.085001973e-03f, -6.192580516e-03f, -5.783122058e-03f, -1.493523933e-03f, +4.596540203e-04f,\n    +8.579289225e-05f, +1.403059826e-04f, -4.520517385e-05f, -4.078861655e-04f, -4.851961862e-04f, +8.550668452e-05f, +9.124578601e-04f, +1.030721596e-03f, +1.051413320e-05f, -1.291661356e-03f, -1.487092493e-03f, -2.349493624e-04f, +1.252584658e-03f, +1.504296605e-03f, +3.907575452e-04f, -8.457661589e-04f, -1.056655927e-03f, -3.304611022e-04f, +3.904257248e-04f, +4.827804113e-04f, +1.436026274e-04f, -1.178256924e-04f, -1.144368746e-04f, -1.343779690e-05f,\n    /*  5, 5 (24) */\n    -4.590990255e-04f, +1.622796535e-03f, +5.886033120e-03f, +7.674766861e-03f, -3.953240318e-04f, -1.970405504e-02f, -3.688298010e-02f, -2.645146819e-02f, +3.132386605e-02f, +1.291292954e-01f, +2.278205175e-01f, +2.774168525e-01f, +2.506139425e-01f, +1.623139009e-01f, +5.888802553e-02f, -1.382285924e-02f, -3.785034328e-02f, -2.636831023e-02f, -5.515233790e-03f, +6.498322915e-03f, +7.060803480e-03f, +2.834234731e-03f, -1.102385313e-04f, -5.364777032e-04f,\n    -2.178818569e-05f, -1.081683664e-04f, -1.329541876e-04f, +5.868992073e-05f, +4.472696310e-04f, +6.831023958e-04f, +2.614654838e-04f, -9.912733666e-04f, -2.539566192e-03f, -3.334986249e-03f, -2.576636113e-03f, -4.332250200e-04f, +1.953599949e-03f, +3.265443094e-03f, +2.952492044e-03f, +1.538215273e-03f, +8.644712225e-05f, -6.333828494e-04f, -5.717941984e-04f, -1.807142965e-04f, +9.661278677e-05f, +1.322549551e-04f, +4.904241628e-05f, -1.019013767e-05f,\n    -6.033709040e-04f, -4.593594122e-03f, -6.983019879e-03f, +9.242124568e-05f, +1.583237774e-02f, +2.416580800e-02f, +8.069385372e-03f, -2.599026878e-02f, -4.566243245e-02f, -2.458058369e-02f, +2.401685799e-02f, +5.502705362e-02f, +3.780315923e-02f, -1.052073888e-02f, -4.376811848e-02f, -3.544426004e-02f, -1.828587792e-03f, +2.209680786e-02f, +2.025293012e-02f, +4.567782384e-03f, -6.048977889e-03f, -5.900947750e-03f, -1.607960808e-03f, +4.462162234e-04f,\n    +8.239136339e-05f, +1.414509860e-04f, -3.520540164e-05f, -3.978979866e-04f, -4.921886228e-04f, +5.946029444e-05f, +8.923374305e-04f, +1.045210559e-03f, +5.408280882e-05f, -1.261669934e-03f, -1.505610351e-03f, -2.866400026e-04f, +1.219452595e-03f, +1.520976867e-03f, +4.354672150e-04f, -8.193854588e-04f, -1.068059295e-03f, -3.583005186e-04f, +3.763802705e-04f, +4.891011109e-04f, +1.552579119e-04f, -1.139058979e-04f, -1.172626453e-04f, -1.596062272e-05f,\n    /*  5, 6 (24) */\n    -4.808872112e-04f, +1.514628169e-03f, +5.753078932e-03f, +7.733456782e-03f, +5.194559915e-05f, -1.902095264e-02f, -3.662151461e-02f, -2.744274156e-02f, +2.878429985e-02f, +1.257943092e-01f, +2.252438814e-01f, +2.769836275e-01f, +2.525675425e-01f, +1.655793440e-01f, +6.184051757e-02f, -1.228464397e-02f, -3.776389616e-02f, -2.700169308e-02f, -6.087027988e-03f, +6.317608619e-03f, +7.157416267e-03f, +2.966489686e-03f, -6.119611503e-05f, -5.466678409e-04f,\n    -1.962494726e-05f, -1.055425602e-04f, -1.348310455e-04f, +4.880895984e-05f, +4.348252911e-04f, +6.833294152e-04f, +2.879634007e-04f, -9.429778464e-04f, -2.496804215e-03f, -3.331470676e-03f, -2.625154490e-03f, -5.113921588e-04f, +1.889599587e-03f, +3.249095277e-03f, +2.983937706e-03f, +1.588547642e-03f, +1.229816938e-04f, -6.242447504e-04f, -5.815509554e-04f, -1.928262058e-04f, +9.180557103e-05f, +1.338623287e-04f, +5.177803395e-05f, -9.318296287e-06f,\n    -5.209795406e-04f, -4.452143136e-03f, -7.018225281e-03f, -3.054767409e-04f, +1.534018912e-02f, +2.422526829e-02f, +8.961722803e-03f, -2.494505822e-02f, -4.560834964e-02f, -2.584225363e-02f, +2.251124764e-02f, +5.474041361e-02f, +3.902261183e-02f, -8.999762017e-03f, -4.333265127e-02f, -3.626364550e-02f, -2.896647087e-03f, +2.173850735e-02f, +2.062931039e-02f, +5.056883495e-03f, -5.893719977e-03f, -6.014853648e-03f, -1.725223453e-03f, +4.302556006e-04f,\n    +7.897239447e-05f, +1.423429413e-04f, -2.542905799e-05f, -3.876448820e-04f, -4.984793055e-04f, +3.375059295e-05f, +8.715092103e-04f, +1.058457753e-03f, +9.727502049e-05f, -1.230536590e-03f, -1.522547459e-03f, -3.380194324e-04f, +1.185016751e-03f, +1.536168113e-03f, +4.800191230e-04f, -7.919017969e-04f, -1.078443999e-03f, -3.861484449e-04f, +3.616467182e-04f, +4.949571413e-04f, +1.670102390e-04f, -1.096919351e-04f, -1.199884694e-04f, -1.856573183e-05f,\n    /*  5, 7 (24) */\n    -5.005121585e-04f, +1.409085608e-03f, +5.618247886e-03f, +7.782265742e-03f, +4.867708903e-04f, -1.833762323e-02f, -3.633355121e-02f, -2.838571941e-02f, +2.628749564e-02f, +1.224628385e-01f, +2.226187269e-01f, +2.764722354e-01f, +2.544571421e-01f, +1.688284393e-01f, +6.482445528e-02f, -1.069609633e-02f, -3.764091446e-02f, -2.762593783e-02f, -6.668578944e-03f, +6.124782413e-03f, +7.249221838e-03f, +3.100352015e-03f, -9.418081089e-06f, -5.559861372e-04f,\n    -1.752145831e-05f, -1.028676561e-04f, -1.364860053e-04f, +3.915649547e-05f, +4.222645286e-04f, +6.829012778e-04f, +3.135809844e-04f, -8.950481981e-04f, -2.453322127e-03f, -3.326363721e-03f, -2.672207845e-03f, -5.892595910e-04f, +1.824513555e-03f, +3.231062568e-03f, +3.014229729e-03f, +1.638838817e-03f, +1.602843179e-04f, -6.142897157e-04f, -5.909720811e-04f, -2.050699399e-04f, +8.673857115e-05f, +1.353477948e-04f, +5.454515320e-05f, -8.383301236e-06f,\n    -4.420071462e-04f, -4.309800195e-03f, -7.043654339e-03f, -6.931216229e-04f, +1.484170981e-02f, +2.425901888e-02f, +9.833232013e-03f, -2.388660047e-02f, -4.551107462e-02f, -2.707279022e-02f, +2.098870018e-02f, +5.440239418e-02f, +4.020762858e-02f, -7.463593904e-03f, -4.285263215e-02f, -3.705554730e-02f, -3.975091086e-03f, +2.135235890e-02f, +2.099095711e-02f, +5.551840636e-03f, -5.726709738e-03f, -6.124545583e-03f, -1.845211923e-03f, +4.116898688e-04f,\n    +7.554274255e-05f, +1.429875171e-04f, -1.588464000e-05f, -3.771457014e-04f, -5.040724819e-04f, +8.403359275e-06f, +8.500055040e-04f, +1.070459747e-03f, +1.400455284e-04f, -1.198300808e-03f, -1.537889400e-03f, -3.890319635e-04f, +1.149312357e-03f, +1.549847868e-03f, +5.243628805e-04f, -7.633368679e-04f, -1.087786960e-03f, -4.139718323e-04f, +3.462320965e-04f, +5.003317867e-04f, +1.788453450e-04f, -1.051823464e-04f, -1.226063853e-04f, -2.125061018e-05f,\n    /*  5, 8 (24) */\n    -5.180336168e-04f, +1.306217952e-03f, +5.481761881e-03f, +7.821422237e-03f, +9.090354189e-04f, -1.765472195e-02f, -3.601997023e-02f, -2.928076761e-02f, +2.383417351e-02f, +1.191364748e-01f, +2.199465191e-01f, +2.758829758e-01f, +2.562816556e-01f, +1.720595018e-01f, +6.783868500e-02f, -9.057257510e-03f, -3.748063015e-02f, -2.824022754e-02f, -7.259551025e-03f, +5.919712473e-03f, +7.335960409e-03f, +3.235699809e-03f, +4.512707211e-05f, -5.643694384e-04f,\n    -1.547894728e-05f, -1.001488561e-04f, -1.379233787e-04f, +2.973731395e-05f, +4.096030115e-04f, +6.818331277e-04f, +3.383151656e-04f, -8.475119607e-04f, -2.409155584e-03f, -3.319680268e-03f, -2.717774172e-03f, -6.667818348e-04f, +1.758377490e-03f, +3.211345856e-03f, +3.043338124e-03f, +1.689054465e-03f, +1.983407091e-04f, -6.035086308e-04f, -6.000400244e-04f, -2.174354272e-04f, +8.141056717e-05f, +1.367055774e-04f, +5.734064266e-05f, -7.384419649e-06f,\n    -3.664644036e-04f, -4.166812678e-03f, -7.059538979e-03f, -1.070267324e-03f, +1.433763733e-02f, +2.426742224e-02f, +1.068323752e-02f, -2.281614072e-02f, -4.537102909e-02f, -2.827109103e-02f, +1.945081078e-02f, +5.401336222e-02f, +4.135694093e-02f, -5.913746036e-03f, -4.232826927e-02f, -3.781888416e-02f, -5.062878046e-03f, +2.093838707e-02f, +2.133718921e-02f, +6.052172423e-03f, -5.547864393e-03f, -6.229727930e-03f, -1.967818308e-03f, +3.904392586e-04f,\n    +7.210900003e-05f, +1.433906409e-04f, -6.580123046e-06f, -3.664192875e-04f, -5.089732471e-04f, -1.655642461e-05f, +8.278590914e-04f, +1.081214627e-03f, +1.823498829e-04f, -1.165003181e-03f, -1.551623638e-03f, -4.396223536e-04f, +1.112376164e-03f, +1.561995332e-03f, +5.684480574e-04f, -7.337138299e-04f, -1.096066144e-03f, -4.417372537e-04f, +3.301444287e-04f, +5.052086988e-04f, +1.907485539e-04f, -1.003761070e-04f, -1.251084075e-04f, -2.401251095e-05f,\n    /*  5, 9 (24) */\n    -5.335125640e-04f, +1.206069096e-03f, +5.343838502e-03f, +7.851159551e-03f, +1.318638430e-03f, -1.697288882e-02f, -3.568165506e-02f, -3.012827957e-02f, +2.142501793e-02f, +1.158167945e-01f, +2.172287449e-01f, +2.752161939e-01f, +2.580400331e-01f, +1.752708477e-01f, +7.088202313e-02f, -7.368203045e-03f, -3.728228944e-02f, -2.884373617e-02f, -7.859591049e-03f, +5.702277046e-03f, +7.417370976e-03f, +3.372405387e-03f, +1.024677148e-04f, -5.717538580e-04f,\n    -1.349851325e-05f, -9.739127752e-05f, -1.391476333e-04f, +2.055582931e-05f, +3.968561725e-04f, +6.801404013e-04f, +3.621636444e-04f, -8.003960392e-04f, -2.364340423e-03f, -3.311436227e-03f, -2.761832570e-03f, -7.439136762e-04f, +1.691227835e-03f, +3.189947221e-03f, +3.071233527e-03f, +1.739159940e-03f, +2.371357781e-04f, -5.918929427e-04f, -6.087372151e-04f, -2.299122304e-04f, +7.582062120e-05f, +1.379299107e-04f, +6.016123583e-05f, -6.321002691e-06f,\n    -2.943554036e-04f, -4.023422037e-03f, -7.066119102e-03f, -1.436686612e-03f, +1.382866408e-02f, +2.425086582e-02f, +1.151109661e-02f, -2.173492610e-02f, -4.518867921e-02f, -2.943609421e-02f, +1.789918715e-02f, +5.357373986e-02f, +4.246931710e-02f, -4.351750704e-03f, -4.175982121e-02f, -3.855259799e-02f, -6.158944190e-03f, +2.049664982e-02f, +2.166733363e-02f, +6.557381122e-03f, -5.357115839e-03f, -6.330104037e-03f, -2.092926715e-03f, +3.664267477e-04f,\n    +6.867758676e-05f, +1.435584841e-04f, +2.477041435e-06f, -3.554844497e-04f, -5.131875248e-04f, -4.110459735e-05f, +8.051031809e-04f, +1.090721988e-03f, +2.241444749e-04f, -1.130685353e-03f, -1.563739524e-03f, -4.897358727e-04f, +1.074246403e-03f, +1.572591413e-03f, +6.122242440e-04f, -7.030572853e-04f, -1.103260595e-03f, -4.694109435e-04f, +3.133927363e-04f, +5.095719253e-04f, +2.027047918e-04f, -9.527263564e-05f, -1.274865400e-04f, -2.684845389e-05f,\n    /*  5,10 (24) */\n    -5.470110773e-04f, +1.108677819e-03f, +5.204690869e-03f, +7.871715380e-03f, +1.715494603e-03f, -1.629274842e-02f, -3.531949142e-02f, -3.092867561e-02f, +1.906067751e-02f, +1.125053583e-01f, +2.144669123e-01f, +2.744722803e-01f, +2.597312610e-01f, +1.784607949e-01f, +7.395325666e-02f, -5.629043106e-03f, -3.704515366e-02f, -2.943562912e-02f, -8.468328264e-03f, +5.472364815e-03f, +7.493191597e-03f, +3.510335297e-03f, +1.626289506e-04f, -5.780748607e-04f,\n    -1.158112765e-05f, -9.459994808e-05f, -1.401633830e-04f, +1.161608603e-05f, +3.840391977e-04f, +6.778388088e-04f, +3.851248826e-04f, -7.537266892e-04f, -2.318912626e-03f, -3.301648517e-03f, -2.804363262e-03f, -8.206102037e-04f, +1.623101807e-03f, +3.166869938e-03f, +3.097887227e-03f, +1.789120310e-03f, +2.766536360e-04f, -5.794346753e-04f, -6.170460803e-04f, -2.424895504e-04f, +6.996808483e-05f, +1.390150473e-04f, +6.300353231e-05f, -5.192488908e-06f,\n    -2.256778168e-04f, -3.879863553e-03f, -7.063642061e-03f, -1.792171061e-03f, +1.331547656e-02f, +2.420976122e-02f, +1.231619979e-02f, -2.064420411e-02f, -4.496453473e-02f, -3.056677956e-02f, +1.633544762e-02f, +5.308400399e-02f, +4.354356350e-02f, -2.779159291e-03f, -4.114759696e-02f, -3.925565528e-02f, -7.262204785e-03f, +2.002723887e-02f, +2.198072637e-02f, +7.066953047e-03f, -5.154411047e-03f, -6.425376672e-03f, -2.220413255e-03f, +3.395782938e-04f,\n    +6.525474269e-05f, +1.434974467e-04f, +1.127992733e-05f, -3.443599368e-04f, -5.167220476e-04f, -6.521784023e-05f, +7.817713627e-04f, +1.098982923e-03f, +2.653865847e-04f, -1.095389966e-03f, -1.574228306e-03f, -5.393183701e-04f, +1.034962741e-03f, +1.581618759e-03f, +6.556411139e-04f, -6.713932608e-04f, -1.109350476e-03f, -4.969588382e-04f, +2.959870397e-04f, +5.134059396e-04f, +2.146986025e-04f, -8.987180462e-05f, -1.297327897e-04f, -2.975522529e-05f,\n    /*  5,11 (24) */\n    -5.585922049e-04f, +1.014077871e-03f, +5.064527486e-03f, +7.883331466e-03f, +2.099533801e-03f, -1.561490961e-02f, -3.493436653e-02f, -3.168240229e-02f, +1.674176488e-02f, +1.092037097e-01f, +2.116625490e-01f, +2.736516701e-01f, +2.613543628e-01f, +1.816276649e-01f, +7.705114388e-02f, -3.839922796e-03f, -3.676850002e-02f, -3.001506379e-02f, -9.085374345e-03f, +5.229875265e-03f, +7.563159682e-03f, +3.649350345e-03f, +2.256324829e-04f, -5.832673496e-04f,\n    -9.727636212e-06f, -9.177980134e-05f, -1.409753797e-04f, +2.921762272e-06f, +3.711670160e-04f, +6.749443147e-04f, +4.071980952e-04f, -7.075295006e-04f, -2.272908290e-03f, -3.290335041e-03f, -2.845347606e-03f, -8.968268430e-04f, +1.554037374e-03f, +3.142118477e-03f, +3.123271196e-03f, +1.838900386e-03f, +3.168775984e-04f, -5.661264457e-04f, -6.249490622e-04f, -2.551562308e-04f, +6.385260626e-05f, +1.399552660e-04f, +6.586399920e-05f, -3.998407513e-06f,\n    -1.604230741e-04f, -3.736366106e-03f, -7.052362133e-03f, -2.136530998e-03f, +1.279875451e-02f, +2.414454338e-02f, +1.309797115e-02f, -1.954522119e-02f, -4.469914815e-02f, -3.166216953e-02f, +1.476121932e-02f, +5.254468562e-02f, +4.457852624e-02f, -1.197540532e-03f, -4.049195585e-02f, -3.992704854e-02f, -8.371555262e-03f, +1.953028003e-02f, +2.227671341e-02f, +7.580358987e-03f, -4.939712445e-03f, -6.515248477e-03f, -2.350146045e-03f, +3.098230685e-04f,\n    +6.184652097e-05f, +1.432141418e-04f, +1.982213440e-05f, -3.330644120e-04f, -5.195843353e-04f, -8.887369771e-05f, +7.578975610e-04f, +1.106000008e-03f, +3.060344296e-04f, -1.059160601e-03f, -1.583083137e-03f, -5.883163394e-04f, +9.945662332e-04f, +1.589061778e-03f, +6.986484862e-04f, -6.387491843e-04f, -1.114317103e-03f, -5.243466183e-04f, +2.779383579e-04f, +5.166956692e-04f, +2.267141634e-04f, -8.417394930e-05f, -1.318391809e-04f, -3.272937824e-05f,\n    /*  5,12 (24) */\n    -5.683198412e-04f, +9.222980693e-04f, +4.923552106e-03f, +7.886253229e-03f, +2.470700817e-03f, -1.493996530e-02f, -3.452716844e-02f, -3.238993180e-02f, +1.446885659e-02f, +1.059133747e-01f, +2.088172014e-01f, +2.727548432e-01f, +2.629084001e-01f, +1.847697833e-01f, +8.017441508e-02f, -2.001022409e-03f, -3.645162242e-02f, -3.058119024e-02f, -9.710323407e-03f, +4.974719034e-03f, +7.627012288e-03f, +3.789305611e-03f, +2.914964821e-04f, -5.872657572e-04f,\n    -7.938760954e-06f, -8.893567243e-05f, -1.415885041e-04f, -5.523826643e-06f, +3.582542880e-04f, +6.714731191e-04f, +4.283832414e-04f, -6.618293838e-04f, -2.226363603e-03f, -3.277514674e-03f, -2.884768102e-03f, -9.725193914e-04f, +1.484073222e-03f, +3.115698509e-03f, +3.147358112e-03f, +1.888464744e-03f, +3.577901908e-04f, -5.519614785e-04f, -6.324286353e-04f, -2.679007628e-04f, +5.747413731e-05f, +1.407448797e-04f, +6.873897269e-05f, -2.738381617e-06f,\n    -9.857655316e-05f, -3.593151964e-03f, -7.032539999e-03f, -2.469595410e-03f, +1.227917018e-02f, +2.405566968e-02f, +1.385586871e-02f, -1.843922118e-02f, -4.439311372e-02f, -3.272133013e-02f, +1.317813618e-02f, +5.195636928e-02f, +4.557309248e-02f, +3.915212458e-04f, -3.979330736e-02f, -4.056579772e-02f, -9.485872365e-03f, +1.900593342e-02f, +2.255465177e-02f, +8.097054656e-03f, -4.712998281e-03f, -6.599422426e-03f, -2.481985226e-03f, +2.770936903e-04f,\n    +5.845878150e-05f, +1.427153804e-04f, +2.809778795e-05f, -3.216164267e-04f, -5.217826740e-04f, -1.120505966e-04f, +7.335159874e-04f, +1.111777288e-03f, +3.460472098e-04f, -1.022041725e-03f, -1.590299077e-03f, -6.366769833e-04f, +9.530992759e-04f, +1.594906671e-03f, +7.411963889e-04f, -6.051538604e-04f, -1.118142977e-03f, -5.515397501e-04f, +2.592587068e-04f, +5.194265241e-04f, +2.387353031e-04f, -7.817987704e-05f, -1.337977690e-04f, -3.576723343e-05f,\n    /*  5,13 (24) */\n    -5.762586021e-04f, +8.333623969e-04f, +4.781963602e-03f, +7.880729402e-03f, +2.828955105e-03f, -1.426849218e-02f, -3.409878520e-02f, -3.305176118e-02f, +1.224249299e-02f, +1.026358600e-01f, +2.059324333e-01f, +2.717823238e-01f, +2.643924734e-01f, +1.878854818e-01f, +8.332177319e-02f, -1.125576648e-04f, -3.609383223e-02f, -3.113315172e-02f, -1.034275204e-02f, +4.706818272e-03f, +7.684486426e-03f, +3.930050491e-03f, +3.602354548e-04f, -5.900041388e-04f,\n    -6.215102370e-06f, -8.607229401e-05f, -1.420077569e-04f, -1.371772433e-05f, +3.453153970e-04f, +6.674416385e-04f, +4.486810147e-04f, -6.166505551e-04f, -2.179314805e-03f, -3.263207237e-03f, -2.922608406e-03f, -1.047644052e-03f, +1.413248730e-03f, +3.087616903e-03f, +3.170121386e-03f, +1.937777756e-03f, +3.993731546e-04f, -5.369336214e-04f, -6.394673241e-04f, -2.807112907e-04f, +5.083294009e-05f, +1.413782434e-04f, +7.162465989e-05f, -1.412131386e-06f,\n    -4.011777165e-05f, -3.450436584e-03f, -7.004442211e-03f, -2.791211837e-03f, +1.175738750e-02f, +2.394361909e-02f, +1.458938470e-02f, -1.732744389e-02f, -4.404706651e-02f, -3.374337185e-02f, +1.158783710e-02f, +5.131969230e-02f, +4.652619175e-02f, +1.986427917e-03f, -3.905211097e-02f, -4.117095158e-02f, -1.060401534e-02f, +1.845439367e-02f, +2.281391047e-02f, +8.616481180e-03f, -4.474262978e-03f, -6.677602303e-03f, -2.615782995e-03f, +2.413264568e-04f,\n    +5.509718502e-05f, +1.420081557e-04f, +3.610153773e-05f, -3.100343958e-04f, -5.233260925e-04f, -1.347278638e-04f, +7.086610936e-04f, +1.116320258e-03f, +3.853851526e-04f, -9.840786261e-04f, -1.595873094e-03f, -6.843482775e-04f, +9.106055562e-04f, +1.599141448e-03f, +7.832351216e-04f, -5.706374440e-04f, -1.120811823e-03f, -5.785035294e-04f, +2.399610962e-04f, +5.215844253e-04f, +2.507455190e-04f, -7.189087556e-05f, -1.356006551e-04f, -3.886488029e-05f,\n    /*  5,14 (24) */\n    -5.824737045e-04f, +7.472901029e-04f, +4.639955845e-03f, +7.867011678e-03f, +3.174270502e-03f, -1.360105054e-02f, -3.365010418e-02f, -3.366841173e-02f, +1.006317818e-02f, +9.937265279e-02f, +2.030098249e-01f, +2.707346798e-01f, +2.658057221e-01f, +1.909730987e-01f, +8.649189458e-02f, +1.825220092e-03f, -3.569445908e-02f, -3.167008534e-02f, -1.098221937e-02f, +4.426106981e-03f, +7.735319366e-03f, +4.071428734e-03f, +4.318601147e-04f, -5.914162702e-04f,\n    -4.557141719e-06f, -8.319429235e-05f, -1.422382495e-04f, -2.165732913e-05f, +3.323644386e-04f, +6.628664873e-04f, +4.680928325e-04f, -5.720165241e-04f, -2.131798163e-03f, -3.247433479e-03f, -2.958853339e-03f, -1.122157466e-03f, +1.341603939e-03f, +3.057881724e-03f, +3.191535193e-03f, +1.986803616e-03f, +4.416074545e-04f, -5.210373591e-04f, -6.460477211e-04f, -2.935756175e-04f, +4.392959355e-05f, +1.418497630e-04f, +7.451714092e-05f, -1.947713690e-08f,\n    +1.497941336e-05f, -3.308428428e-03f, -6.968340673e-03f, -3.101246233e-03f, +1.123406141e-02f, +2.380889122e-02f, +1.529804579e-02f, -1.621112363e-02f, -4.366168136e-02f, -3.472745048e-02f, +9.991964010e-03f, +5.063534402e-02f, +4.743679731e-02f, +3.585569365e-03f, -3.826887585e-02f, -4.174158903e-02f, -1.172482717e-02f, +1.787589014e-02f, +2.305387157e-02f, +9.138065605e-03f, -4.223517459e-03f, -6.749493179e-03f, -2.751383650e-03f, +2.024615766e-04f,\n    +5.176718757e-05f, +1.410996276e-04f, +4.382855603e-05f, -2.983365736e-04f, -5.242243400e-04f, -1.568857425e-04f, +6.833675242e-04f, +1.119635845e-03f, +4.240095559e-04f, -9.453173597e-04f, -1.599804062e-03f, -7.312790333e-04f, +8.671300005e-04f, +1.601755950e-03f, +8.247153181e-04f, -5.352314117e-04f, -1.122308617e-03f, -6.052031248e-04f, +2.200595253e-04f, +5.231558325e-04f, +2.627279961e-04f, -6.530872059e-05f, -1.372400007e-04f, -4.201817875e-05f,\n    /*  5,15 (24) */\n    -5.870308462e-04f, +6.640958105e-04f, +4.497717596e-03f, +7.845354349e-03f, +3.506634940e-03f, -1.293818405e-02f, -3.318201135e-02f, -3.424042826e-02f, +7.931380019e-03f, +9.612521931e-02f, +2.000509716e-01f, +2.696125223e-01f, +2.671473260e-01f, +1.940309805e-01f, +8.968342977e-02f, +3.812023708e-03f, -3.525285162e-02f, -3.219112270e-02f, -1.162826709e-02f, +4.132531363e-03f, +7.779248959e-03f, +4.213278497e-03f, +5.063772556e-04f, -5.914357473e-04f,\n    -2.965243435e-06f, -8.030618376e-05f, -1.422851959e-04f, -2.934038961e-05f, +3.194152119e-04f, +6.577644584e-04f, +4.866208258e-04f, -5.279500810e-04f, -2.083849941e-03f, -3.230215052e-03f, -2.993488892e-03f, -1.196016749e-03f, +1.269179521e-03f, +3.026502235e-03f, +3.211574492e-03f, +2.035506370e-03f, +4.844732852e-04f, -5.042678272e-04f, -6.521525049e-04f, -3.064812112e-04f, +3.676499970e-05f, +1.421539031e-04f, +7.741237116e-05f, +1.439657656e-06f,\n    +6.674660094e-05f, -3.167328801e-03f, -6.924512117e-03f, -3.399582806e-03f, +1.070983707e-02f, +2.365200548e-02f, +1.598141332e-02f, -1.509148779e-02f, -4.323767180e-02f, -3.567276784e-02f, +8.392159948e-03f, +4.990406499e-02f, +4.830392731e-02f, +5.187325315e-03f, -3.744416054e-02f, -4.227682044e-02f, -1.284713578e-02f, +1.727068701e-02f, +2.327393110e-02f, +9.661221438e-03f, -3.960789463e-03f, -6.814801899e-03f, -2.888623651e-03f, +1.604433978e-04f,\n    +4.847403558e-05f, +1.399971074e-04f, +5.127453495e-05f, -2.865410298e-04f, -5.244878610e-04f, -1.785054070e-04f, +6.576700703e-04f, +1.121732389e-03f, +4.618828287e-04f, -9.058046859e-04f, -1.602092762e-03f, -7.774189589e-04f, +8.227187204e-04f, +1.602741870e-03f, +8.655880094e-04f, -4.989685310e-04f, -1.122619615e-03f, -6.316036224e-04f, +1.995689762e-04f, +5.241277714e-04f, +2.746656266e-04f, -5.843568295e-05f, -1.387080425e-04f, -4.522276128e-05f,\n    /*  5,16 (24) */\n    -5.899960896e-04f, +5.837896268e-04f, +4.355432400e-03f, +7.816013959e-03f, +3.826050152e-03f, -1.228041959e-02f, -3.269539052e-02f, -3.476837834e-02f, +5.847530078e-03f, +9.289500426e-02f, +1.970574827e-01f, +2.684165056e-01f, +2.684165056e-01f, +1.970574827e-01f, +9.289500426e-02f, +5.847530078e-03f, -3.476837834e-02f, -3.269539052e-02f, -1.228041959e-02f, +3.826050152e-03f, +7.816013959e-03f, +4.355432400e-03f, +5.837896268e-04f, -5.899960896e-04f,\n    -1.439657656e-06f, -7.741237116e-05f, -1.421539031e-04f, -3.676499970e-05f, +3.064812112e-04f, +6.521525049e-04f, +5.042678272e-04f, -4.844732852e-04f, -2.035506370e-03f, -3.211574492e-03f, -3.026502235e-03f, -1.269179521e-03f, +1.196016749e-03f, +2.993488892e-03f, +3.230215052e-03f, +2.083849941e-03f, +5.279500810e-04f, -4.866208258e-04f, -6.577644584e-04f, -3.194152119e-04f, +2.934038961e-05f, +1.422851959e-04f, +8.030618376e-05f, +2.965243435e-06f,\n    +1.152206365e-04f, -3.027331693e-03f, -6.873237582e-03f, -3.686123836e-03f, +1.018534921e-02f, +2.347350007e-02f, +1.663908339e-02f, -1.396975540e-02f, -4.277578897e-02f, -3.657857253e-02f, +6.790067185e-03f, +4.912664603e-02f, +4.912664603e-02f, +6.790067185e-03f, -3.657857253e-02f, -4.277578897e-02f, -1.396975540e-02f, +1.663908339e-02f, +2.347350007e-02f, +1.018534921e-02f, -3.686123836e-03f, -6.873237582e-03f, -3.027331693e-03f, +1.152206365e-04f,\n    +4.522276128e-05f, +1.387080425e-04f, +5.843568295e-05f, -2.746656266e-04f, -5.241277714e-04f, -1.995689762e-04f, +6.316036224e-04f, +1.122619615e-03f, +4.989685310e-04f, -8.655880094e-04f, -1.602741870e-03f, -8.227187204e-04f, +7.774189589e-04f, +1.602092762e-03f, +9.058046859e-04f, -4.618828287e-04f, -1.121732389e-03f, -6.576700703e-04f, +1.785054070e-04f, +5.244878610e-04f, +2.865410298e-04f, -5.127453495e-05f, -1.399971074e-04f, -4.847403558e-05f,\n    /*  5,17 (24) */\n    -5.914357473e-04f, +5.063772556e-04f, +4.213278497e-03f, +7.779248959e-03f, +4.132531363e-03f, -1.162826709e-02f, -3.219112270e-02f, -3.525285162e-02f, +3.812023708e-03f, +8.968342977e-02f, +1.940309805e-01f, +2.671473260e-01f, +2.696125223e-01f, +2.000509716e-01f, +9.612521931e-02f, +7.931380019e-03f, -3.424042826e-02f, -3.318201135e-02f, -1.293818405e-02f, +3.506634940e-03f, +7.845354349e-03f, +4.497717596e-03f, +6.640958105e-04f, -5.870308462e-04f,\n    +1.947713690e-08f, -7.451714092e-05f, -1.418497630e-04f, -4.392959355e-05f, +2.935756175e-04f, +6.460477211e-04f, +5.210373591e-04f, -4.416074545e-04f, -1.986803616e-03f, -3.191535193e-03f, -3.057881724e-03f, -1.341603939e-03f, +1.122157466e-03f, +2.958853339e-03f, +3.247433479e-03f, +2.131798163e-03f, +5.720165241e-04f, -4.680928325e-04f, -6.628664873e-04f, -3.323644386e-04f, +2.165732913e-05f, +1.422382495e-04f, +8.319429235e-05f, +4.557141719e-06f,\n    +1.604433978e-04f, -2.888623651e-03f, -6.814801899e-03f, -3.960789463e-03f, +9.661221438e-03f, +2.327393110e-02f, +1.727068701e-02f, -1.284713578e-02f, -4.227682044e-02f, -3.744416054e-02f, +5.187325315e-03f, +4.830392731e-02f, +4.990406499e-02f, +8.392159948e-03f, -3.567276784e-02f, -4.323767180e-02f, -1.509148779e-02f, +1.598141332e-02f, +2.365200548e-02f, +1.070983707e-02f, -3.399582806e-03f, -6.924512117e-03f, -3.167328801e-03f, +6.674660094e-05f,\n    +4.201817875e-05f, +1.372400007e-04f, +6.530872059e-05f, -2.627279961e-04f, -5.231558325e-04f, -2.200595253e-04f, +6.052031248e-04f, +1.122308617e-03f, +5.352314117e-04f, -8.247153181e-04f, -1.601755950e-03f, -8.671300005e-04f, +7.312790333e-04f, +1.599804062e-03f, +9.453173597e-04f, -4.240095559e-04f, -1.119635845e-03f, -6.833675242e-04f, +1.568857425e-04f, +5.242243400e-04f, +2.983365736e-04f, -4.382855603e-05f, -1.410996276e-04f, -5.176718757e-05f,\n    /*  5,18 (24) */\n    -5.914162702e-04f, +4.318601147e-04f, +4.071428734e-03f, +7.735319366e-03f, +4.426106981e-03f, -1.098221937e-02f, -3.167008534e-02f, -3.569445908e-02f, +1.825220092e-03f, +8.649189458e-02f, +1.909730987e-01f, +2.658057221e-01f, +2.707346798e-01f, +2.030098249e-01f, +9.937265279e-02f, +1.006317818e-02f, -3.366841173e-02f, -3.365010418e-02f, -1.360105054e-02f, +3.174270502e-03f, +7.867011678e-03f, +4.639955845e-03f, +7.472901029e-04f, -5.824737045e-04f,\n    +1.412131386e-06f, -7.162465989e-05f, -1.413782434e-04f, -5.083294009e-05f, +2.807112907e-04f, +6.394673241e-04f, +5.369336214e-04f, -3.993731546e-04f, -1.937777756e-03f, -3.170121386e-03f, -3.087616903e-03f, -1.413248730e-03f, +1.047644052e-03f, +2.922608406e-03f, +3.263207237e-03f, +2.179314805e-03f, +6.166505551e-04f, -4.486810147e-04f, -6.674416385e-04f, -3.453153970e-04f, +1.371772433e-05f, +1.420077569e-04f, +8.607229401e-05f, +6.215102370e-06f,\n    +2.024615766e-04f, -2.751383650e-03f, -6.749493179e-03f, -4.223517459e-03f, +9.138065605e-03f, +2.305387157e-02f, +1.787589014e-02f, -1.172482717e-02f, -4.174158903e-02f, -3.826887585e-02f, +3.585569365e-03f, +4.743679731e-02f, +5.063534402e-02f, +9.991964010e-03f, -3.472745048e-02f, -4.366168136e-02f, -1.621112363e-02f, +1.529804579e-02f, +2.380889122e-02f, +1.123406141e-02f, -3.101246233e-03f, -6.968340673e-03f, -3.308428428e-03f, +1.497941336e-05f,\n    +3.886488029e-05f, +1.356006551e-04f, +7.189087556e-05f, -2.507455190e-04f, -5.215844253e-04f, -2.399610962e-04f, +5.785035294e-04f, +1.120811823e-03f, +5.706374440e-04f, -7.832351216e-04f, -1.599141448e-03f, -9.106055562e-04f, +6.843482775e-04f, +1.595873094e-03f, +9.840786261e-04f, -3.853851526e-04f, -1.116320258e-03f, -7.086610936e-04f, +1.347278638e-04f, +5.233260925e-04f, +3.100343958e-04f, -3.610153773e-05f, -1.420081557e-04f, -5.509718502e-05f,\n    /*  5,19 (24) */\n    -5.900041388e-04f, +3.602354548e-04f, +3.930050491e-03f, +7.684486426e-03f, +4.706818272e-03f, -1.034275204e-02f, -3.113315172e-02f, -3.609383223e-02f, -1.125576648e-04f, +8.332177319e-02f, +1.878854818e-01f, +2.643924734e-01f, +2.717823238e-01f, +2.059324333e-01f, +1.026358600e-01f, +1.224249299e-02f, -3.305176118e-02f, -3.409878520e-02f, -1.426849218e-02f, +2.828955105e-03f, +7.880729402e-03f, +4.781963602e-03f, +8.333623969e-04f, -5.762586021e-04f,\n    +2.738381617e-06f, -6.873897269e-05f, -1.407448797e-04f, -5.747413731e-05f, +2.679007628e-04f, +6.324286353e-04f, +5.519614785e-04f, -3.577901908e-04f, -1.888464744e-03f, -3.147358112e-03f, -3.115698509e-03f, -1.484073222e-03f, +9.725193914e-04f, +2.884768102e-03f, +3.277514674e-03f, +2.226363603e-03f, +6.618293838e-04f, -4.283832414e-04f, -6.714731191e-04f, -3.582542880e-04f, +5.523826643e-06f, +1.415885041e-04f, +8.893567243e-05f, +7.938760954e-06f,\n    +2.413264568e-04f, -2.615782995e-03f, -6.677602303e-03f, -4.474262978e-03f, +8.616481180e-03f, +2.281391047e-02f, +1.845439367e-02f, -1.060401534e-02f, -4.117095158e-02f, -3.905211097e-02f, +1.986427917e-03f, +4.652619175e-02f, +5.131969230e-02f, +1.158783710e-02f, -3.374337185e-02f, -4.404706651e-02f, -1.732744389e-02f, +1.458938470e-02f, +2.394361909e-02f, +1.175738750e-02f, -2.791211837e-03f, -7.004442211e-03f, -3.450436584e-03f, -4.011777165e-05f,\n    +3.576723343e-05f, +1.337977690e-04f, +7.817987704e-05f, -2.387353031e-04f, -5.194265241e-04f, -2.592587068e-04f, +5.515397501e-04f, +1.118142977e-03f, +6.051538604e-04f, -7.411963889e-04f, -1.594906671e-03f, -9.530992759e-04f, +6.366769833e-04f, +1.590299077e-03f, +1.022041725e-03f, -3.460472098e-04f, -1.111777288e-03f, -7.335159874e-04f, +1.120505966e-04f, +5.217826740e-04f, +3.216164267e-04f, -2.809778795e-05f, -1.427153804e-04f, -5.845878150e-05f,\n    /*  5,20 (24) */\n    -5.872657572e-04f, +2.914964821e-04f, +3.789305611e-03f, +7.627012288e-03f, +4.974719034e-03f, -9.710323407e-03f, -3.058119024e-02f, -3.645162242e-02f, -2.001022409e-03f, +8.017441508e-02f, +1.847697833e-01f, +2.629084001e-01f, +2.727548432e-01f, +2.088172014e-01f, +1.059133747e-01f, +1.446885659e-02f, -3.238993180e-02f, -3.452716844e-02f, -1.493996530e-02f, +2.470700817e-03f, +7.886253229e-03f, +4.923552106e-03f, +9.222980693e-04f, -5.683198412e-04f,\n    +3.998407513e-06f, -6.586399920e-05f, -1.399552660e-04f, -6.385260626e-05f, +2.551562308e-04f, +6.249490622e-04f, +5.661264457e-04f, -3.168775984e-04f, -1.838900386e-03f, -3.123271196e-03f, -3.142118477e-03f, -1.554037374e-03f, +8.968268430e-04f, +2.845347606e-03f, +3.290335041e-03f, +2.272908290e-03f, +7.075295006e-04f, -4.071980952e-04f, -6.749443147e-04f, -3.711670160e-04f, -2.921762272e-06f, +1.409753797e-04f, +9.177980134e-05f, +9.727636212e-06f,\n    +2.770936903e-04f, -2.481985226e-03f, -6.599422426e-03f, -4.712998281e-03f, +8.097054656e-03f, +2.255465177e-02f, +1.900593342e-02f, -9.485872365e-03f, -4.056579772e-02f, -3.979330736e-02f, +3.915212458e-04f, +4.557309248e-02f, +5.195636928e-02f, +1.317813618e-02f, -3.272133013e-02f, -4.439311372e-02f, -1.843922118e-02f, +1.385586871e-02f, +2.405566968e-02f, +1.227917018e-02f, -2.469595410e-03f, -7.032539999e-03f, -3.593151964e-03f, -9.857655316e-05f,\n    +3.272937824e-05f, +1.318391809e-04f, +8.417394930e-05f, -2.267141634e-04f, -5.166956692e-04f, -2.779383579e-04f, +5.243466183e-04f, +1.114317103e-03f, +6.387491843e-04f, -6.986484862e-04f, -1.589061778e-03f, -9.945662332e-04f, +5.883163394e-04f, +1.583083137e-03f, +1.059160601e-03f, -3.060344296e-04f, -1.106000008e-03f, -7.578975610e-04f, +8.887369771e-05f, +5.195843353e-04f, +3.330644120e-04f, -1.982213440e-05f, -1.432141418e-04f, -6.184652097e-05f,\n    /*  5,21 (24) */\n    -5.832673496e-04f, +2.256324829e-04f, +3.649350345e-03f, +7.563159682e-03f, +5.229875265e-03f, -9.085374345e-03f, -3.001506379e-02f, -3.676850002e-02f, -3.839922796e-03f, +7.705114388e-02f, +1.816276649e-01f, +2.613543628e-01f, +2.736516701e-01f, +2.116625490e-01f, +1.092037097e-01f, +1.674176488e-02f, -3.168240229e-02f, -3.493436653e-02f, -1.561490961e-02f, +2.099533801e-03f, +7.883331466e-03f, +5.064527486e-03f, +1.014077871e-03f, -5.585922049e-04f,\n    +5.192488908e-06f, -6.300353231e-05f, -1.390150473e-04f, -6.996808483e-05f, +2.424895504e-04f, +6.170460803e-04f, +5.794346753e-04f, -2.766536360e-04f, -1.789120310e-03f, -3.097887227e-03f, -3.166869938e-03f, -1.623101807e-03f, +8.206102037e-04f, +2.804363262e-03f, +3.301648517e-03f, +2.318912626e-03f, +7.537266892e-04f, -3.851248826e-04f, -6.778388088e-04f, -3.840391977e-04f, -1.161608603e-05f, +1.401633830e-04f, +9.459994808e-05f, +1.158112765e-05f,\n    +3.098230685e-04f, -2.350146045e-03f, -6.515248477e-03f, -4.939712445e-03f, +7.580358987e-03f, +2.227671341e-02f, +1.953028003e-02f, -8.371555262e-03f, -3.992704854e-02f, -4.049195585e-02f, -1.197540532e-03f, +4.457852624e-02f, +5.254468562e-02f, +1.476121932e-02f, -3.166216953e-02f, -4.469914815e-02f, -1.954522119e-02f, +1.309797115e-02f, +2.414454338e-02f, +1.279875451e-02f, -2.136530998e-03f, -7.052362133e-03f, -3.736366106e-03f, -1.604230741e-04f,\n    +2.975522529e-05f, +1.297327897e-04f, +8.987180462e-05f, -2.146986025e-04f, -5.134059396e-04f, -2.959870397e-04f, +4.969588382e-04f, +1.109350476e-03f, +6.713932608e-04f, -6.556411139e-04f, -1.581618759e-03f, -1.034962741e-03f, +5.393183701e-04f, +1.574228306e-03f, +1.095389966e-03f, -2.653865847e-04f, -1.098982923e-03f, -7.817713627e-04f, +6.521784023e-05f, +5.167220476e-04f, +3.443599368e-04f, -1.127992733e-05f, -1.434974467e-04f, -6.525474269e-05f,\n    /*  5,22 (24) */\n    -5.780748607e-04f, +1.626289506e-04f, +3.510335297e-03f, +7.493191597e-03f, +5.472364815e-03f, -8.468328264e-03f, -2.943562912e-02f, -3.704515366e-02f, -5.629043106e-03f, +7.395325666e-02f, +1.784607949e-01f, +2.597312610e-01f, +2.744722803e-01f, +2.144669123e-01f, +1.125053583e-01f, +1.906067751e-02f, -3.092867561e-02f, -3.531949142e-02f, -1.629274842e-02f, +1.715494603e-03f, +7.871715380e-03f, +5.204690869e-03f, +1.108677819e-03f, -5.470110773e-04f,\n    +6.321002691e-06f, -6.016123583e-05f, -1.379299107e-04f, -7.582062120e-05f, +2.299122304e-04f, +6.087372151e-04f, +5.918929427e-04f, -2.371357781e-04f, -1.739159940e-03f, -3.071233527e-03f, -3.189947221e-03f, -1.691227835e-03f, +7.439136762e-04f, +2.761832570e-03f, +3.311436227e-03f, +2.364340423e-03f, +8.003960392e-04f, -3.621636444e-04f, -6.801404013e-04f, -3.968561725e-04f, -2.055582931e-05f, +1.391476333e-04f, +9.739127752e-05f, +1.349851325e-05f,\n    +3.395782938e-04f, -2.220413255e-03f, -6.425376672e-03f, -5.154411047e-03f, +7.066953047e-03f, +2.198072637e-02f, +2.002723887e-02f, -7.262204785e-03f, -3.925565528e-02f, -4.114759696e-02f, -2.779159291e-03f, +4.354356350e-02f, +5.308400399e-02f, +1.633544762e-02f, -3.056677956e-02f, -4.496453473e-02f, -2.064420411e-02f, +1.231619979e-02f, +2.420976122e-02f, +1.331547656e-02f, -1.792171061e-03f, -7.063642061e-03f, -3.879863553e-03f, -2.256778168e-04f,\n    +2.684845389e-05f, +1.274865400e-04f, +9.527263564e-05f, -2.027047918e-04f, -5.095719253e-04f, -3.133927363e-04f, +4.694109435e-04f, +1.103260595e-03f, +7.030572853e-04f, -6.122242440e-04f, -1.572591413e-03f, -1.074246403e-03f, +4.897358727e-04f, +1.563739524e-03f, +1.130685353e-03f, -2.241444749e-04f, -1.090721988e-03f, -8.051031809e-04f, +4.110459735e-05f, +5.131875248e-04f, +3.554844497e-04f, -2.477041435e-06f, -1.435584841e-04f, -6.867758676e-05f,\n    /*  5,23 (24) */\n    -5.717538580e-04f, +1.024677148e-04f, +3.372405387e-03f, +7.417370976e-03f, +5.702277046e-03f, -7.859591049e-03f, -2.884373617e-02f, -3.728228944e-02f, -7.368203045e-03f, +7.088202313e-02f, +1.752708477e-01f, +2.580400331e-01f, +2.752161939e-01f, +2.172287449e-01f, +1.158167945e-01f, +2.142501793e-02f, -3.012827957e-02f, -3.568165506e-02f, -1.697288882e-02f, +1.318638430e-03f, +7.851159551e-03f, +5.343838502e-03f, +1.206069096e-03f, -5.335125640e-04f,\n    +7.384419649e-06f, -5.734064266e-05f, -1.367055774e-04f, -8.141056717e-05f, +2.174354272e-04f, +6.000400244e-04f, +6.035086308e-04f, -1.983407091e-04f, -1.689054465e-03f, -3.043338124e-03f, -3.211345856e-03f, -1.758377490e-03f, +6.667818348e-04f, +2.717774172e-03f, +3.319680268e-03f, +2.409155584e-03f, +8.475119607e-04f, -3.383151656e-04f, -6.818331277e-04f, -4.096030115e-04f, -2.973731395e-05f, +1.379233787e-04f, +1.001488561e-04f, +1.547894728e-05f,\n    +3.664267477e-04f, -2.092926715e-03f, -6.330104037e-03f, -5.357115839e-03f, +6.557381122e-03f, +2.166733363e-02f, +2.049664982e-02f, -6.158944190e-03f, -3.855259799e-02f, -4.175982121e-02f, -4.351750704e-03f, +4.246931710e-02f, +5.357373986e-02f, +1.789918715e-02f, -2.943609421e-02f, -4.518867921e-02f, -2.173492610e-02f, +1.151109661e-02f, +2.425086582e-02f, +1.382866408e-02f, -1.436686612e-03f, -7.066119102e-03f, -4.023422037e-03f, -2.943554036e-04f,\n    +2.401251095e-05f, +1.251084075e-04f, +1.003761070e-04f, -1.907485539e-04f, -5.052086988e-04f, -3.301444287e-04f, +4.417372537e-04f, +1.096066144e-03f, +7.337138299e-04f, -5.684480574e-04f, -1.561995332e-03f, -1.112376164e-03f, +4.396223536e-04f, +1.551623638e-03f, +1.165003181e-03f, -1.823498829e-04f, -1.081214627e-03f, -8.278590914e-04f, +1.655642461e-05f, +5.089732471e-04f, +3.664192875e-04f, +6.580123046e-06f, -1.433906409e-04f, -7.210900003e-05f,\n    /*  5,24 (24) */\n    -5.643694384e-04f, +4.512707211e-05f, +3.235699809e-03f, +7.335960409e-03f, +5.919712473e-03f, -7.259551025e-03f, -2.824022754e-02f, -3.748063015e-02f, -9.057257510e-03f, +6.783868500e-02f, +1.720595018e-01f, +2.562816556e-01f, +2.758829758e-01f, +2.199465191e-01f, +1.191364748e-01f, +2.383417351e-02f, -2.928076761e-02f, -3.601997023e-02f, -1.765472195e-02f, +9.090354189e-04f, +7.821422237e-03f, +5.481761881e-03f, +1.306217952e-03f, -5.180336168e-04f,\n    +8.383301236e-06f, -5.454515320e-05f, -1.353477948e-04f, -8.673857115e-05f, +2.050699399e-04f, +5.909720811e-04f, +6.142897157e-04f, -1.602843179e-04f, -1.638838817e-03f, -3.014229729e-03f, -3.231062568e-03f, -1.824513555e-03f, +5.892595910e-04f, +2.672207845e-03f, +3.326363721e-03f, +2.453322127e-03f, +8.950481981e-04f, -3.135809844e-04f, -6.829012778e-04f, -4.222645286e-04f, -3.915649547e-05f, +1.364860053e-04f, +1.028676561e-04f, +1.752145831e-05f,\n    +3.904392586e-04f, -1.967818308e-03f, -6.229727930e-03f, -5.547864393e-03f, +6.052172423e-03f, +2.133718921e-02f, +2.093838707e-02f, -5.062878046e-03f, -3.781888416e-02f, -4.232826927e-02f, -5.913746036e-03f, +4.135694093e-02f, +5.401336222e-02f, +1.945081078e-02f, -2.827109103e-02f, -4.537102909e-02f, -2.281614072e-02f, +1.068323752e-02f, +2.426742224e-02f, +1.433763733e-02f, -1.070267324e-03f, -7.059538979e-03f, -4.166812678e-03f, -3.664644036e-04f,\n    +2.125061018e-05f, +1.226063853e-04f, +1.051823464e-04f, -1.788453450e-04f, -5.003317867e-04f, -3.462320965e-04f, +4.139718323e-04f, +1.087786960e-03f, +7.633368679e-04f, -5.243628805e-04f, -1.549847868e-03f, -1.149312357e-03f, +3.890319635e-04f, +1.537889400e-03f, +1.198300808e-03f, -1.400455284e-04f, -1.070459747e-03f, -8.500055040e-04f, -8.403359275e-06f, +5.040724819e-04f, +3.771457014e-04f, +1.588464000e-05f, -1.429875171e-04f, -7.554274255e-05f,\n    /*  5,25 (24) */\n    -5.559861372e-04f, -9.418081089e-06f, +3.100352015e-03f, +7.249221838e-03f, +6.124782413e-03f, -6.668578944e-03f, -2.762593783e-02f, -3.764091446e-02f, -1.069609633e-02f, +6.482445528e-02f, +1.688284393e-01f, +2.544571421e-01f, +2.764722354e-01f, +2.226187269e-01f, +1.224628385e-01f, +2.628749564e-02f, -2.838571941e-02f, -3.633355121e-02f, -1.833762323e-02f, +4.867708903e-04f, +7.782265742e-03f, +5.618247886e-03f, +1.409085608e-03f, -5.005121585e-04f,\n    +9.318296287e-06f, -5.177803395e-05f, -1.338623287e-04f, -9.180557103e-05f, +1.928262058e-04f, +5.815509554e-04f, +6.242447504e-04f, -1.229816938e-04f, -1.588547642e-03f, -2.983937706e-03f, -3.249095277e-03f, -1.889599587e-03f, +5.113921588e-04f, +2.625154490e-03f, +3.331470676e-03f, +2.496804215e-03f, +9.429778464e-04f, -2.879634007e-04f, -6.833294152e-04f, -4.348252911e-04f, -4.880895984e-05f, +1.348310455e-04f, +1.055425602e-04f, +1.962494726e-05f,\n    +4.116898688e-04f, -1.845211923e-03f, -6.124545583e-03f, -5.726709738e-03f, +5.551840636e-03f, +2.099095711e-02f, +2.135235890e-02f, -3.975091086e-03f, -3.705554730e-02f, -4.285263215e-02f, -7.463593904e-03f, +4.020762858e-02f, +5.440239418e-02f, +2.098870018e-02f, -2.707279022e-02f, -4.551107462e-02f, -2.388660047e-02f, +9.833232013e-03f, +2.425901888e-02f, +1.484170981e-02f, -6.931216229e-04f, -7.043654339e-03f, -4.309800195e-03f, -4.420071462e-04f,\n    +1.856573183e-05f, +1.199884694e-04f, +1.096919351e-04f, -1.670102390e-04f, -4.949571413e-04f, -3.616467182e-04f, +3.861484449e-04f, +1.078443999e-03f, +7.919017969e-04f, -4.800191230e-04f, -1.536168113e-03f, -1.185016751e-03f, +3.380194324e-04f, +1.522547459e-03f, +1.230536590e-03f, -9.727502049e-05f, -1.058457753e-03f, -8.715092103e-04f, -3.375059295e-05f, +4.984793055e-04f, +3.876448820e-04f, +2.542905799e-05f, -1.423429413e-04f, -7.897239447e-05f,\n    /*  5,26 (24) */\n    -5.466678409e-04f, -6.119611503e-05f, +2.966489686e-03f, +7.157416267e-03f, +6.317608619e-03f, -6.087027988e-03f, -2.700169308e-02f, -3.776389616e-02f, -1.228464397e-02f, +6.184051757e-02f, +1.655793440e-01f, +2.525675425e-01f, +2.769836275e-01f, +2.252438814e-01f, +1.257943092e-01f, +2.878429985e-02f, -2.744274156e-02f, -3.662151461e-02f, -1.902095264e-02f, +5.194559915e-05f, +7.733456782e-03f, +5.753078932e-03f, +1.514628169e-03f, -4.808872112e-04f,\n    +1.019013767e-05f, -4.904241628e-05f, -1.322549551e-04f, -9.661278677e-05f, +1.807142965e-04f, +5.717941984e-04f, +6.333828494e-04f, -8.644712225e-05f, -1.538215273e-03f, -2.952492044e-03f, -3.265443094e-03f, -1.953599949e-03f, +4.332250200e-04f, +2.576636113e-03f, +3.334986249e-03f, +2.539566192e-03f, +9.912733666e-04f, -2.614654838e-04f, -6.831023958e-04f, -4.472696310e-04f, -5.868992073e-05f, +1.329541876e-04f, +1.081683664e-04f, +2.178818569e-05f,\n    +4.302556006e-04f, -1.725223453e-03f, -6.014853648e-03f, -5.893719977e-03f, +5.056883495e-03f, +2.062931039e-02f, +2.173850735e-02f, -2.896647087e-03f, -3.626364550e-02f, -4.333265127e-02f, -8.999762017e-03f, +3.902261183e-02f, +5.474041361e-02f, +2.251124764e-02f, -2.584225363e-02f, -4.560834964e-02f, -2.494505822e-02f, +8.961722803e-03f, +2.422526829e-02f, +1.534018912e-02f, -3.054767409e-04f, -7.018225281e-03f, -4.452143136e-03f, -5.209795406e-04f,\n    +1.596062272e-05f, +1.172626453e-04f, +1.139058979e-04f, -1.552579119e-04f, -4.891011109e-04f, -3.763802705e-04f, +3.583005186e-04f, +1.068059295e-03f, +8.193854588e-04f, -4.354672150e-04f, -1.520976867e-03f, -1.219452595e-03f, +2.866400026e-04f, +1.505610351e-03f, +1.261669934e-03f, -5.408280882e-05f, -1.045210559e-03f, -8.923374305e-04f, -5.946029444e-05f, +4.921886228e-04f, +3.978979866e-04f, +3.520540164e-05f, -1.414509860e-04f, -8.239136339e-05f,\n    /*  5,27 (24) */\n    -5.364777032e-04f, -1.102385313e-04f, +2.834234731e-03f, +7.060803480e-03f, +6.498322915e-03f, -5.515233790e-03f, -2.636831023e-02f, -3.785034328e-02f, -1.382285924e-02f, +5.888802553e-02f, +1.623139009e-01f, +2.506139425e-01f, +2.774168525e-01f, +2.278205175e-01f, +1.291292954e-01f, +3.132386605e-02f, -2.645146819e-02f, -3.688298010e-02f, -1.970405504e-02f, -3.953240318e-04f, +7.674766861e-03f, +5.886033120e-03f, +1.622796535e-03f, -4.590990255e-04f,\n    +1.099963891e-05f, -4.634129554e-05f, -1.305314530e-04f, -1.011617129e-04f, +1.687439147e-04f, +5.617193249e-04f, +6.417136720e-04f, -5.069408217e-05f, -1.487875705e-03f, -2.919923330e-03f, -3.280106316e-03f, -2.016479832e-03f, +3.548038886e-04f, +2.526675818e-03f, +3.336896596e-03f, +2.581572607e-03f, +1.039906603e-03f, -2.340910800e-04f, -6.822053868e-04f, -4.595816567e-04f, -6.879421704e-05f, +1.308512845e-04f, +1.107397924e-04f, +2.400981416e-05f,\n    +4.462162234e-04f, -1.607960808e-03f, -5.900947750e-03f, -6.048977889e-03f, +4.567782384e-03f, +2.025293012e-02f, +2.209680786e-02f, -1.828587792e-03f, -3.544426004e-02f, -4.376811848e-02f, -1.052073888e-02f, +3.780315923e-02f, +5.502705362e-02f, +2.401685799e-02f, -2.458058369e-02f, -4.566243245e-02f, -2.599026878e-02f, +8.069385372e-03f, +2.416580800e-02f, +1.583237774e-02f, +9.242124568e-05f, -6.983019879e-03f, -4.593594122e-03f, -6.033709040e-04f,\n    +1.343779690e-05f, +1.144368746e-04f, +1.178256924e-04f, -1.436026274e-04f, -4.827804113e-04f, -3.904257248e-04f, +3.304611022e-04f, +1.056655927e-03f, +8.457661589e-04f, -3.907575452e-04f, -1.504296605e-03f, -1.252584658e-03f, +2.349493624e-04f, +1.487092493e-03f, +1.291661356e-03f, -1.051413320e-05f, -1.030721596e-03f, -9.124578601e-04f, -8.550668452e-05f, +4.851961862e-04f, +4.078861655e-04f, +4.520517385e-05f, -1.403059826e-04f, -8.579289225e-05f,\n    /*  5,28 (24) */\n    -5.254780643e-04f, -1.565798269e-04f, +2.703703278e-03f, +6.959641767e-03f, +6.667066830e-03f, -4.953514465e-03f, -2.572659656e-02f, -3.790103736e-02f, -1.531073495e-02f, +5.596810220e-02f, +1.590337946e-01f, +2.485974627e-01f, +2.777716564e-01f, +2.303471933e-01f, +1.324661920e-01f, +3.390543865e-02f, -2.541156159e-02f, -3.711707118e-02f, -2.038626042e-02f, -8.549056885e-04f, +7.605972644e-03f, +6.016884404e-03f, +1.733536327e-03f, -4.350892113e-04f,\n    +1.174769073e-05f, -4.367753023e-05f, -1.286975968e-04f, -1.054541107e-04f, +1.569243904e-04f, +5.513437972e-04f, +6.492474063e-04f, -1.573524375e-05f, -1.437562572e-03f, -2.886262718e-03f, -3.293086424e-03f, -2.078205281e-03f, +2.761746757e-04f, +2.475297788e-03f, +3.337188933e-03f, +2.622788251e-03f, +1.088848800e-03f, -2.058448186e-04f, -6.806238860e-04f, -4.717452654e-04f, -7.911631081e-05f, +1.285183626e-04f, +1.132514817e-04f, +2.628834081e-05f,\n    +4.596540203e-04f, -1.493523933e-03f, -5.783122058e-03f, -6.192580516e-03f, +4.085001973e-03f, +1.986250440e-02f, +2.242726897e-02f, -7.719318653e-04f, -3.459849388e-02f, -4.415887603e-02f, -1.202503549e-02f, +3.655057457e-02f, +5.526200298e-02f, +2.550395049e-02f, -2.328892234e-02f, -4.567294658e-02f, -2.702099038e-02f, +7.156927512e-03f, +2.408030131e-02f, +1.631757393e-02f, +5.003074112e-04f, -6.937814706e-03f, -4.733900105e-03f, -6.891637963e-04f,\n    +1.099953653e-05f, +1.115190818e-04f, +1.214531979e-04f, -1.320582228e-04f, -4.760120962e-04f, -4.037770445e-04f, +3.026628272e-04f, +1.044257977e-03f, +8.710236820e-04f, -3.459403981e-04f, -1.486151448e-03f, -1.284379276e-03f, +1.830035781e-04f, +1.467010163e-03f, +1.320472530e-03f, +3.338502793e-05f, -1.014995825e-03f, -9.318387172e-04f, -1.118632115e-04f, +4.774986143e-04f, +4.175905900e-04f, +5.541935889e-05f, -1.389025366e-04f, -8.917006763e-05f,\n    /*  5,29 (24) */\n    -5.137303736e-04f, -2.002573571e-04f, +2.575005681e-03f, +6.854187656e-03f, +6.823991220e-03f, -4.402170668e-03f, -2.507734915e-02f, -3.791677261e-02f, -1.674829752e-02f, +5.308183948e-02f, +1.557407082e-01f, +2.465192574e-01f, +2.780478311e-01f, +2.328224911e-01f, +1.358033809e-01f, +3.652822691e-02f, -2.432271279e-02f, -3.732291599e-02f, -2.106688431e-02f, -1.326650954e-03f, +7.526856333e-03f, +6.145402767e-03f, +1.846787809e-03f, -4.088008705e-04f,\n    +1.243525760e-05f, -4.105384145e-05f, -1.267591490e-04f, -1.094920003e-04f, +1.452646791e-04f, +5.406850090e-04f, +6.559947516e-04f, +1.841753301e-05f, -1.387309121e-03f, -2.851541903e-03f, -3.304386071e-03f, -2.138743223e-03f, +1.973834540e-04f, +2.422527267e-03f, +3.335851552e-03f, +2.663178182e-03f, +1.138070623e-03f, -1.767321185e-04f, -6.783437400e-04f, -4.837441552e-04f, -8.965028562e-05f, +1.259516305e-04f, +1.156980079e-04f, +2.862214005e-05f,\n    +4.706535568e-04f, -1.382004851e-03f, -5.661668860e-03f, -6.324638739e-03f, +3.608989877e-03f, +1.945872735e-02f, +2.272993179e-02f, +2.723261116e-04f, -3.372747020e-02f, -4.450481643e-02f, -1.351118694e-02f, +3.526619530e-02f, +5.544500656e-02f, +2.697096065e-02f, -2.196844981e-02f, -4.563956155e-02f, -2.803598620e-02f, +6.225088795e-03f, +2.396843810e-02f, +1.679507254e-02f, +9.178980012e-04f, -6.882395347e-03f, -4.872802642e-03f, -7.783338639e-04f,\n    +8.647893339e-06f, +1.085171417e-04f, +1.247907041e-04f, -1.206380968e-04f, -4.688135280e-04f, -4.164291790e-04f, +2.749378696e-04f, +1.030890490e-03f, +8.951393075e-04f, -3.010658936e-04f, -1.466567125e-03f, -1.314804383e-03f, +1.308590259e-04f, +1.445381490e-03f, +1.348066343e-03f, +7.756801037e-05f, -9.980397348e-04f, -9.504487886e-04f, -1.385025771e-04f, +4.690934086e-04f, +4.269924794e-04f, +6.583842639e-05f, -1.372355424e-04f, -9.251582846e-05f,\n    /*  5,30 (24) */\n    -5.012951160e-04f, -2.413111985e-04f, +2.448246532e-03f, +6.744695656e-03f, +6.969255899e-03f, -3.861485659e-03f, -2.442135440e-02f, -3.789835507e-02f, -1.813560664e-02f, +5.023029758e-02f, +1.524363221e-01f, +2.443805142e-01f, +2.782452146e-01f, +2.352450184e-01f, +1.391392325e-01f, +3.919140509e-02f, -2.318464217e-02f, -3.749964811e-02f, -2.174522805e-02f, -1.810395109e-03f, +7.437206048e-03f, +6.271354397e-03f, +1.962485817e-03f, -3.801787305e-04f,\n    +1.306337424e-05f, -3.847281259e-05f, -1.247218530e-04f, -1.132776529e-04f, +1.337733593e-04f, +5.297602692e-04f, +6.619669015e-04f, +5.175319886e-05f, -1.337148185e-03f, -2.815793091e-03f, -3.314009081e-03f, -2.198061489e-03f, +1.184764218e-04f, +2.368390551e-03f, +3.332873833e-03f, +2.702707759e-03f, +1.187542172e-03f, -1.467591928e-04f, -6.753511633e-04f, -4.955618386e-04f, -1.003898453e-04f, +1.231474882e-04f, +1.180738813e-04f, +3.100945145e-05f,\n    +4.793014501e-04f, -1.273487710e-03f, -5.536878156e-03f, -6.445276836e-03f, +3.140176349e-03f, +1.904229817e-02f, +2.300486966e-02f, +1.303216601e-03f, -3.283233089e-02f, -4.480588232e-02f, -1.497775406e-02f, +3.395139091e-02f, +5.557586558e-02f, +2.841634214e-02f, -2.062038347e-02f, -4.556199354e-02f, -2.903402594e-02f, +5.274640006e-03f, +2.382993552e-02f, +1.726416595e-02f, +1.344890481e-03f, -6.816556920e-03f, -5.010038184e-03f, -8.708496923e-04f,\n    +6.384690347e-06f, +1.054388668e-04f, +1.278408987e-04f, -1.093551967e-04f, -4.612023484e-04f, -4.283780575e-04f, +2.473179135e-04f, +1.016579433e-03f, +9.180958213e-04f, -2.561839252e-04f, -1.445570939e-03f, -1.343829552e-03f, +7.857232390e-05f, +1.422226433e-03f, +1.374406946e-03f, +1.219875182e-04f, -9.798613549e-04f, -9.682574761e-04f, -1.653967645e-04f, +4.599789698e-04f, +4.360731296e-04f, +7.645233616e-05f, -1.353001982e-04f, -9.582297529e-05f,\n    /*  5,31 (24) */\n    -4.882317417e-04f, -2.797840111e-04f, +2.323524679e-03f, +6.631418003e-03f, +7.103029259e-03f, -3.331725390e-03f, -2.375938750e-02f, -3.784660187e-02f, -1.947275482e-02f, +4.741450448e-02f, +1.491223130e-01f, +2.421824527e-01f, +2.783636910e-01f, +2.376134089e-01f, +1.424721063e-01f, +4.189411285e-02f, -2.199710000e-02f, -3.764640731e-02f, -2.242057921e-02f, -2.305956948e-03f, +7.336816202e-03f, +6.394501885e-03f, +2.080559698e-03f, -3.491692790e-04f,\n    +1.363314209e-05f, -3.593688915e-05f, -1.225914265e-04f, -1.168135820e-04f, +1.224586306e-04f, +5.185867868e-04f, +6.671755267e-04f, +8.426151525e-05f, -1.287112166e-03f, -2.779048968e-03f, -3.321960433e-03f, -2.256128833e-03f, +3.949986729e-05f, +2.312914962e-03f, +3.328246260e-03f, +2.741342671e-03f, +1.237233007e-03f, -1.159330534e-04f, -6.716327570e-04f, -5.071816554e-04f, -1.113283129e-04f, +1.201025358e-04f, +1.203735541e-04f, +3.344837876e-05f,\n    +4.856861405e-04f, -1.168048843e-03f, -5.409037257e-03f, -6.554632032e-03f, +2.678974000e-03f, +1.861392011e-02f, +2.325218758e-02f, +2.319796034e-03f, -3.191423507e-02f, -4.506206625e-02f, -1.642332500e-02f, +3.260756136e-02f, +5.565443791e-02f, +2.983856857e-02f, -1.924597652e-02f, -4.544000602e-02f, -3.001388729e-02f, +4.306382530e-03f, +2.366453876e-02f, +1.772414492e-02f, +1.780963610e-03f, -6.740104584e-03f, -5.145338382e-03f, -9.666726676e-04f,\n    +4.211524069e-06f, +1.022919954e-04f, +1.306068552e-04f, -9.822200801e-05f, -4.531964488e-04f, -4.396205809e-04f, +2.198341146e-04f, +1.001351655e-03f, +9.398775262e-04f, -2.113441000e-04f, -1.423191721e-03f, -1.371426028e-03f, +2.620026282e-05f, +1.397566761e-03f, +1.399459798e-03f, +1.665956790e-04f, -9.604702507e-04f, -9.852348420e-04f, -1.925170661e-04f, +4.501546129e-04f, +4.448139414e-04f, +8.725054394e-05f, -1.330920197e-04f, -9.908417991e-05f,\n    /*  6, 0 (24) */\n    -1.381477748e-03f, -3.077497149e-03f, -1.382496192e-04f, +9.451265441e-03f, +1.536116093e-02f, +3.798097220e-04f, -3.444119267e-02f, -5.173422453e-02f, -6.379548291e-04f, +1.279538359e-01f, +2.711624592e-01f, +3.340838290e-01f, +2.711624592e-01f, +1.279538359e-01f, -6.379548291e-04f, -5.173422453e-02f, -3.444119267e-02f, +3.798097220e-04f, +1.536116093e-02f, +9.451265441e-03f, -1.382496192e-04f, -3.077497149e-03f, -1.381477748e-03f, +1.529906491e-05f,\n    +6.563580115e-05f, +1.271846563e-05f, -2.073530798e-04f, -3.334856284e-04f, +5.702704247e-05f, +8.641498231e-04f, +1.101167895e-03f, -2.767627563e-04f, -2.907938350e-03f, -4.727706059e-03f, -3.710481723e-03f, -6.570013011e-05f, +3.627554861e-03f, +4.745152154e-03f, +2.990393068e-03f, +3.472346398e-04f, -1.085613170e-03f, -8.870096413e-04f, -7.896620590e-05f, +3.307378182e-04f, +2.150355900e-04f, -8.015428714e-06f, -6.635510628e-05f, -1.784466616e-05f,\n    +1.381477748e-03f, +3.077497149e-03f, -1.905329511e-03f, -9.009890737e-03f, -5.096548909e-03f, +1.240770844e-02f, +2.062426252e-02f, -2.077574300e-04f, -2.908566530e-02f, -2.444344784e-02f, +1.424658180e-02f, +3.770038936e-02f, +1.424658180e-02f, -2.444344784e-02f, -2.908566530e-02f, -2.077574300e-04f, +2.062426252e-02f, +1.240770844e-02f, -5.096548909e-03f, -9.009890737e-03f, -1.905329511e-03f, +2.574664269e-03f, +1.381477748e-03f, -1.529906491e-05f,\n    -6.563580115e-05f, -1.271846563e-05f, +2.339013135e-04f, +1.286753269e-04f, -3.844162184e-04f, -5.688768839e-04f, +1.643669824e-04f, +9.949917205e-04f, +5.645336545e-04f, -8.271109120e-04f, -1.277873593e-03f, -2.614726878e-05f, +1.261262345e-03f, +8.655401410e-04f, -5.277248058e-04f, -1.005173835e-03f, -1.968738343e-04f, +5.597509504e-04f, +4.003935711e-04f, -1.169654343e-04f, -2.376998145e-04f, -3.444877766e-05f, +6.635510628e-05f, +1.784466616e-05f,\n    /*  6, 1 (24) */\n    -1.315841947e-03f, -3.064778684e-03f, -3.456026989e-04f, +9.117779812e-03f, +1.541818797e-02f, +1.243959545e-03f, -3.334002477e-02f, -5.201098729e-02f, -3.545893179e-03f, +1.232261298e-01f, +2.674519775e-01f, +3.340181289e-01f, +2.747900141e-01f, +1.326989880e-01f, +2.352438239e-03f, -5.138698989e-02f, -3.552680584e-02f, -5.071999193e-04f, +1.528219472e-02f, +9.782003259e-03f, +7.678597090e-05f, -3.085512578e-03f, -1.447832854e-03f, -2.545601248e-06f,\n    +6.481352384e-05f, +1.722631685e-05f, -1.995998244e-04f, -3.356832843e-04f, +3.558286875e-05f, +8.407479278e-04f, +1.115016669e-03f, -2.076808167e-04f, -2.824695277e-03f, -4.707280779e-03f, -3.790616984e-03f, -1.970487457e-04f, +3.541891040e-03f, +4.759580019e-03f, +3.071977016e-03f, +4.190523637e-04f, -1.068332631e-03f, -9.092848150e-04f, -1.013822117e-04f, +3.274289891e-04f, +2.226328496e-04f, -3.119045703e-06f, -6.696605421e-05f, -1.944806459e-05f,\n    +1.315841947e-03f, +3.064778684e-03f, -1.671428198e-03f, -8.881215410e-03f, -5.480965128e-03f, +1.183883156e-02f, +2.078862950e-02f, +7.872342904e-04f, -2.852113165e-02f, -2.527055875e-02f, +1.296870820e-02f, +3.767424209e-02f, +1.550784414e-02f, -2.357790770e-02f, -2.961339011e-02f, -1.212931265e-03f, +2.042738868e-02f, +1.296745939e-02f, -4.696155338e-03f, -9.126856171e-03f, -2.143029326e-03f, +2.540215492e-03f, +1.447832854e-03f, +2.545601248e-06f,\n    -6.481352384e-05f, -1.722631685e-05f, +2.297724939e-04f, +1.398967235e-04f, -3.681127511e-04f, -5.769611755e-04f, +1.320208631e-04f, +9.834114395e-04f, +6.002327499e-04f, -7.876498834e-04f, -1.292570593e-03f, -7.840153916e-05f, +1.242758144e-03f, +9.028730329e-04f, -4.898564049e-04f, -1.013928274e-03f, -2.294901511e-04f, +5.495832833e-04f, +4.160109560e-04f, -1.047782799e-04f, -2.411522223e-04f, -4.092376319e-05f, +6.696605421e-05f, +1.944806459e-05f,\n    /*  6, 2 (24) */\n    -1.251028423e-03f, -3.047552367e-03f, -5.452025233e-04f, +8.782096528e-03f, +1.545377084e-02f, +2.084707473e-03f, -3.222500811e-02f, -5.221866811e-02f, -6.370588456e-03f, +1.185188490e-01f, +2.636613605e-01f, +3.338210801e-01f, +2.783319051e-01f, +1.374585680e-01f, +5.424415255e-03f, -5.096793753e-02f, -3.659513847e-02f, -1.416484734e-03f, +1.518081251e-02f, +1.010943225e-02f, +2.994188205e-04f, -3.088631624e-03f, -1.514798908e-03f, -2.199366583e-05f,\n    +6.389368841e-05f, +2.153753453e-05f, -1.917900568e-04f, -3.373421937e-04f, +1.465074660e-05f, +8.168463171e-04f, +1.127180907e-03f, -1.400308877e-04f, -2.740746193e-03f, -4.683917896e-03f, -3.867908757e-03f, -3.282424799e-04f, +3.453547606e-03f, +4.770953197e-03f, +3.152607797e-03f, +4.921698130e-04f, -1.049308023e-03f, -9.309326212e-04f, -1.242558299e-04f, +3.235488489e-04f, +2.301300971e-04f, +1.968444869e-06f, -6.746330023e-05f, -2.108315094e-05f,\n    +1.251028423e-03f, +3.047552367e-03f, -1.441655704e-03f, -8.741318686e-03f, -5.849077879e-03f, +1.126187038e-02f, +2.092065036e-02f, +1.770645730e-03f, -2.792089890e-02f, -2.605820864e-02f, +1.167613761e-02f, +3.759584055e-02f, +1.675060228e-02f, -2.267503467e-02f, -3.010324651e-02f, -2.226859539e-03f, +2.019789853e-02f, +1.351704268e-02f, -4.280144382e-03f, -9.231634451e-03f, -2.384181548e-03f, +2.499291729e-03f, +1.514798908e-03f, +2.199366583e-05f,\n    -6.389368841e-05f, -2.153753453e-05f, +2.253294414e-04f, +1.506195234e-04f, -3.515170566e-04f, -5.840057251e-04f, +9.988589785e-05f, +9.704645605e-04f, +6.347740361e-04f, -7.472229839e-04f, -1.305335186e-03f, -1.305350756e-04f, +1.222385389e-03f, +9.390465563e-04f, -4.509807251e-04f, -1.021227655e-03f, -2.621639014e-04f, +5.383756226e-04f, +4.312346192e-04f, -9.212622896e-05f, -2.442431118e-04f, -4.752681547e-05f, +6.746330023e-05f, +2.108315094e-05f,\n    /*  6, 3 (24) */\n    -1.187134734e-03f, -3.026014832e-03f, -7.369925802e-04f, +8.444754334e-03f, +1.546842159e-02f, +2.901553790e-03f, -3.109782720e-02f, -5.235869900e-02f, -9.111334648e-03f, +1.138349311e-01f, +2.597934518e-01f, +3.334928377e-01f, +2.817854527e-01f, +1.422295212e-01f, +8.577023051e-03f, -5.047576772e-02f, -3.764444649e-02f, -2.347417355e-03f, +1.505655668e-02f, +1.043298110e-02f, +5.295489175e-04f, -3.086663179e-03f, -1.582262209e-03f, -4.307681677e-05f,\n    +6.288172682e-05f, +2.565105489e-05f, -1.839377214e-04f, -3.384742792e-04f, -5.753348927e-06f, +7.924870975e-04f, +1.137683536e-03f, -7.385297568e-05f, -2.656173279e-03f, -4.657661463e-03f, -3.942307950e-03f, -4.591782538e-04f, +3.362584557e-03f, +4.779237872e-03f, +3.232203116e-03f, +5.665388902e-04f, -1.028522733e-03f, -9.519102335e-04f, -1.475667527e-04f, +3.190877058e-04f, +2.375123335e-04f, +7.244398905e-06f, -6.784155157e-05f, -2.274722726e-05f,\n    +1.187134734e-03f, +3.026014832e-03f, -1.216326262e-03f, -8.590699163e-03f, -6.200594936e-03f, +1.067786466e-02f, +2.102053626e-02f, +2.741110290e-03f, -2.728612486e-02f, -2.680543162e-02f, +1.037080242e-02f, +3.746530547e-02f, +1.797298767e-02f, -2.173598811e-02f, -3.055422724e-02f, -3.248087194e-03f, +1.993573463e-02f, +1.405541830e-02f, -3.848909763e-03f, -9.323760680e-03f, -2.628424660e-03f, +2.451764913e-03f, +1.582262209e-03f, +4.307681677e-05f,\n    -6.288172682e-05f, -2.565105489e-05f, +2.205885129e-04f, +1.608347588e-04f, -3.346629931e-04f, -5.900142142e-04f, +6.801158183e-05f, +9.561846390e-04f, +6.681116709e-04f, -7.058974164e-04f, -1.316152368e-03f, -1.824676140e-04f, +1.200171545e-03f, +9.739992989e-04f, -4.111520349e-04f, -1.027046790e-03f, -2.948423740e-04f, +5.261315604e-04f, +4.460309708e-04f, -7.902277375e-05f, -2.469574470e-04f, -5.424738949e-05f, +6.784155157e-05f, +2.274722726e-05f,\n    /*  6, 4 (24) */\n    -1.124253008e-03f, -3.000363778e-03f, -9.209303016e-04f, +8.106280055e-03f, +1.546266824e-02f, +3.694040888e-03f, -2.996014366e-02f, -5.243255197e-02f, -1.176750793e-02f, +1.091772697e-01f, +2.558511438e-01f, +3.330336594e-01f, +2.851480373e-01f, +1.470087591e-01f, +1.180922617e-02f, -4.990922883e-02f, -3.867296923e-02f, -3.299327589e-03f, +1.490898993e-02f, +1.075206880e-02f, +7.670612510e-04f, -3.079418780e-03f, -1.650103760e-03f, -6.582404402e-05f,\n    +6.178307809e-05f, +2.956619010e-05f, -1.760564584e-04f, -3.390919485e-04f, -2.561452950e-05f, +7.677120714e-04f, +1.146548940e-03f, -9.185006537e-06f, -2.571058474e-03f, -4.628557951e-03f, -4.013768311e-03f, -5.897532510e-04f, +3.269064490e-03f, +4.784402921e-03f, +3.310680875e-03f, +6.421095461e-04f, -1.005961845e-03f, -9.721747743e-04f, -1.712936001e-04f, +3.140364966e-04f, +2.447643402e-04f, +1.270576066e-05f, -6.809557905e-05f, -2.443743580e-05f,\n    +1.124253008e-03f, +3.000363778e-03f, -9.957377493e-04f, -8.429864404e-03f, -6.535257929e-03f, +1.008785045e-02f, +2.108854784e-02f, +3.697294929e-03f, -2.661801319e-02f, -2.751132904e-02f, +9.054650055e-03f, +3.728283786e-02f, +1.917315922e-02f, -2.076198881e-02f, -3.096537927e-02f, -4.275133985e-03f, +1.964089226e-02f, +1.458154986e-02f, -3.402878792e-03f, -9.402783454e-03f, -2.875382107e-03f, +2.397517524e-03f, +1.650103760e-03f, +6.582404402e-05f,\n    -6.178307809e-05f, -2.956619010e-05f, +2.155662977e-04f, +1.705345927e-04f, -3.175843266e-04f, -5.949920767e-04f, +3.644640680e-05f, +9.406071432e-04f, +7.002020898e-04f, -6.637415389e-04f, -1.325010312e-03f, -2.341192274e-04f, +1.176147110e-03f, +1.007671578e-03f, -3.704265174e-04f, -1.031362745e-03f, -3.274722649e-04f, +5.128565571e-04f, +4.603666510e-04f, -6.548252658e-05f, -2.492806200e-04f, -6.107441404e-05f, +6.809557905e-05f, +2.443743580e-05f,\n    /*  6, 5 (24) */\n    -1.062469930e-03f, -2.970797587e-03f, -1.096986760e-03f, +7.767188107e-03f, +1.543705371e-02f, +4.461752959e-03f, -2.881359472e-02f, -5.244173698e-02f, -1.433856640e-02f, +1.045487117e-01f, +2.518373755e-01f, +3.324439062e-01f, +2.884171018e-01f, +1.517931620e-01f, +1.511990704e-02f, -4.926711928e-02f, -3.967893107e-02f, -4.271502363e-03f, +1.473769633e-02f, +1.106610530e-02f, +1.011825591e-03f, -3.066713019e-03f, -1.718199339e-03f, -9.026147983e-05f,\n    +6.060317770e-05f, +3.328261961e-05f, -1.681595893e-04f, -3.392080658e-04f, -4.491899181e-05f, +7.425626902e-04f, +1.153802914e-03f, +5.393719231e-05f, -2.485483383e-03f, -4.596656183e-03f, -4.082246465e-03f, -7.198650226e-04f, +3.173052544e-03f, +4.786419960e-03f, +3.387959259e-03f, +7.188298137e-04f, -9.816121727e-04f, -9.916833680e-04f, -1.954139279e-04f, +3.083868143e-04f, +2.518706986e-04f, +1.834905721e-05f, -6.822022903e-05f, -2.615076039e-05f,\n    +1.062469930e-03f, +2.970797587e-03f, -7.801714517e-04f, -8.259329812e-03f, -6.852842255e-03f, +9.492858368e-03f, +2.112499425e-02f, +4.637902073e-03f, -2.591781110e-02f, -2.817507058e-02f, +7.729639742e-03f, +3.704871863e-02f, +2.034930633e-02f, -1.975431723e-02f, -3.133580579e-02f, -5.306496729e-03f, +1.931341999e-02f, +1.509440642e-02f, -2.942512141e-03f, -9.468265980e-03f, -3.124662727e-03f, +2.336443110e-03f, +1.718199339e-03f, +9.026147983e-05f,\n    -6.060317770e-05f, -3.328261961e-05f, +2.102795790e-04f, +1.797123137e-04f, -3.003146694e-04f, -5.989464665e-04f, +5.237786086e-06f, +9.237693767e-04f, +7.310040664e-04f, -6.208247442e-04f, -1.331900379e-03f, -2.854104603e-04f, +1.150345561e-03f, +1.040005548e-03f, -3.288621856e-04f, -1.034154896e-03f, -3.599997655e-04f, +4.985579560e-04f, +4.742085965e-04f, -5.152121081e-05f, -2.511984901e-04f, -6.799630432e-05f, +6.822022903e-05f, +2.615076039e-05f,\n    /*  6, 6 (24) */\n    -1.001866752e-03f, -2.937514968e-03f, -1.265146349e-03f, +7.427980041e-03f, +1.539213472e-02f, +5.204315649e-03f, -2.765979181e-02f, -5.238779979e-02f, -1.682404978e-02f, +9.995205552e-02f, +2.477551290e-01f, +3.317240411e-01f, +2.915901543e-01f, +1.565795820e-01f, +1.850786630e-02f, -4.854828947e-02f, -4.066054324e-02f, -5.263185731e-03f, +1.454228240e-02f, +1.137449211e-02f, +1.263696290e-03f, -3.048363962e-03f, -1.786419568e-03f, -1.164122402e-04f,\n    +5.934744720e-05f, +3.680038110e-05f, -1.602601035e-04f, -3.388359222e-04f, -6.365401444e-05f, +7.170800082e-04f, +1.159472611e-03f, +1.154799069e-04f, -2.399529195e-03f, -4.562007266e-03f, -4.147701949e-03f, -8.494115912e-04f, +3.074616339e-03f, +4.785263390e-03f, +3.463956829e-03f, +7.966458449e-04f, -9.554623048e-04f, -1.010393195e-03f, -2.199042372e-04f, +3.021309355e-04f, +2.588158100e-04f, +2.417039358e-05f, -6.821043546e-05f, -2.788402811e-05f,\n    +1.001866752e-03f, +2.937514968e-03f, -5.698918727e-04f, -8.079617498e-03f, -7.153156925e-03f, +8.893911902e-03f, +2.113023204e-02f, +5.561671449e-03f, -2.518680704e-02f, -2.879589532e-02f, +6.397739363e-03f, +3.676330817e-02f, +2.149965189e-02f, -1.871431169e-02f, -3.166466798e-02f, -6.340651625e-03f, +1.895342023e-02f, +1.559296437e-02f, -2.468303545e-03f, -9.519787191e-03f, -3.375861217e-03f, +2.268446805e-03f, +1.786419568e-03f, +1.164122402e-04f,\n    -5.934744720e-05f, -3.680038110e-05f, +2.047452951e-04f, +1.883623296e-04f, -2.828874197e-04f, -6.018862218e-04f, -2.556801747e-05f, +9.057103977e-04f, +7.604787672e-04f, -5.772173382e-04f, -1.336817126e-03f, -3.362624619e-04f, +1.122803310e-03f, +1.070945305e-03f, -2.865187936e-04f, -1.035404989e-03f, -3.923706530e-04f, +4.832449927e-04f, +4.875241071e-04f, -3.715564929e-05f, -2.526974221e-04f, -7.500097594e-05f, +6.821043546e-05f, +2.788402811e-05f,\n    /*  6, 7 (24) */\n    -9.425193046e-04f, -2.900714587e-03f, -1.425406453e-03f, +7.089144119e-03f, +1.532848070e-02f, +5.921395657e-03f, -2.650031920e-02f, -5.227231988e-02f, -1.922357898e-02f, +9.539004826e-02f, +2.436074271e-01f, +3.308746295e-01f, +2.946647707e-01f, +1.613648454e-01f, +2.197182313e-02f, -4.775164362e-02f, -4.161600555e-02f, -6.273578926e-03f, +1.432237817e-02f, +1.167662305e-02f, +1.522512100e-03f, -3.024193569e-03f, -1.854630004e-03f, -1.442962683e-04f,\n    +5.802128424e-05f, +4.011986105e-05f, -1.523706453e-04f, -3.379892059e-04f, -8.180795328e-05f, +6.913046371e-04f, +1.163586488e-03f, +1.754115491e-04f, -2.313276598e-03f, -4.524664529e-03f, -4.210097246e-03f, -9.782915545e-04f, +2.973825913e-03f, +4.780910436e-03f, +3.538592610e-03f, +8.755019491e-04f, -9.275026422e-04f, -1.028261548e-03f, -2.447399846e-04f, +2.952618468e-04f, +2.655839161e-04f, +3.016544842e-05f, -6.806123211e-05f, -2.963391142e-05f,\n    +9.425193046e-04f, +2.900714587e-03f, -3.651465776e-04f, -7.891255168e-03f, -7.436044344e-03f, +8.292025680e-03f, +2.110466402e-02f, +6.467381847e-03f, -2.442632827e-02f, -2.937311266e-02f, +5.060922236e-03f, +3.642704571e-02f, +2.262245520e-02f, -1.764336638e-02f, -3.195118677e-02f, -7.376056614e-03f, +1.856104957e-02f, +1.607620937e-02f, -1.980779438e-03f, -9.556942840e-03f, -3.628558639e-03f, +2.193445829e-03f, +1.854630004e-03f, +1.442962683e-04f,\n    -5.802128424e-05f, -4.011986105e-05f, +1.989805015e-04f, +1.964801581e-04f, -2.653357019e-04f, -6.038218276e-04f, -5.592596085e-05f, +8.864709371e-04f, +7.885898027e-04f, -5.329904173e-04f, -1.339758308e-03f, -3.865971177e-04f, +1.093559642e-03f, +1.100436991e-03f, -2.434577447e-04f, -1.035097187e-03f, -4.245303820e-04f, +4.669288026e-04f, +5.002809122e-04f, -2.240375052e-05f, -2.537643245e-04f, -8.207586033e-05f, +6.806123211e-05f, +2.963391142e-05f,\n    /*  6, 8 (24) */\n    -8.844980204e-04f, -2.860594726e-03f, -1.577777098e-03f, +6.751154913e-03f, +1.524667275e-02f, +6.612700294e-03f, -2.533673271e-02f, -5.209690833e-02f, -2.153685558e-02f, +9.086538373e-02f, +2.393973298e-01f, +3.298963380e-01f, +2.976385966e-01f, +1.661457558e-01f, +2.551041574e-02f, -4.687614167e-02f, -4.254350819e-02f, -7.301840474e-03f, +1.407763818e-02f, +1.197188490e-02f, +1.788096016e-03f, -2.994028120e-03f, -1.922691236e-03f, -1.739301798e-04f,\n    +5.663005275e-05f, +4.324178486e-05f, -1.445035018e-04f, -3.366819736e-04f, -9.937023555e-05f, +6.652767031e-04f, +1.166174257e-03f, +2.337026664e-04f, -2.226805702e-03f, -4.484683449e-03f, -4.269397810e-03f, -1.106404188e-03f, +2.870753655e-03f, +4.773341188e-03f, +3.611786181e-03f, +9.553406348e-04f, -8.977254349e-04f, -1.045245885e-03f, -2.698955957e-04f, +2.877732716e-04f, +2.721591211e-04f, +3.632947036e-05f, -6.776776486e-05f, -3.139693059e-05f,\n    +8.844980204e-04f, +2.860594726e-03f, -1.661660761e-04f, -7.694775010e-03f, -7.701380046e-03f, +7.688203853e-03f, +2.104873806e-02f, +7.353852784e-03f, -2.363773847e-02f, -2.990610308e-02f, +3.721163928e-03f, +3.604044859e-02f, +2.371601484e-02f, -1.654292939e-02f, -3.219464451e-02f, -8.411153801e-03f, +1.813651919e-02f, +1.654313817e-02f, -1.480498526e-03f, -9.579346591e-03f, -3.882322963e-03f, +2.111369969e-03f, +1.922691236e-03f, +1.739301798e-04f,\n    -5.663005275e-05f, -4.324178486e-05f, +1.930023331e-04f, +2.040624157e-04f, -2.476923088e-04f, -6.047653749e-04f, -8.579228719e-05f, +8.660933128e-04f, +8.153032736e-04f, -4.882157442e-04f, -1.340724874e-03f, -4.363371811e-04f, +1.062656658e-03f, +1.128428889e-03f, -1.997419964e-04f, -1.033218118e-03f, -4.564241782e-04f, +4.496224237e-04f, +5.124472386e-04f, -7.284492294e-06f, -2.543866878e-04f, -8.920792150e-05f, +6.776776486e-05f, +3.139693059e-05f,\n    /*  6, 9 (24) */\n    -8.278679676e-04f, -2.817352941e-03f, -1.722280600e-03f, +6.414472939e-03f, +1.514730251e-02f, +7.277976997e-03f, -2.417055845e-02f, -5.186320566e-02f, -2.376366128e-02f, +8.638070028e-02f, +2.351279320e-01f, +3.287899338e-01f, +3.005093502e-01f, +1.709190970e-01f, +2.912220192e-02f, -4.592080104e-02f, -4.344123363e-02f, -8.347086359e-03f, +1.380774258e-02f, +1.225965817e-02f, +2.060255137e-03f, -2.957698650e-03f, -1.990459001e-03f, -2.053271103e-04f,\n    +5.517907351e-05f, +4.616720663e-05f, -1.366705918e-04f, -3.349286204e-04f, -1.163313523e-04f, +6.390358040e-04f, +1.167266825e-03f, +2.903259489e-04f, -2.140195948e-03f, -4.442121581e-03f, -4.325572093e-03f, -1.233649549e-03f, +2.765474238e-03f, +4.762538634e-03f, +3.683457771e-03f, +1.036102654e-03f, -8.661248172e-04f, -1.061303886e-03f, -2.953444788e-04f, +2.796596949e-04f, +2.785254130e-04f, +4.265727503e-05f, -6.732530413e-05f, -3.316945658e-05f,\n    +8.278679676e-04f, +2.817352941e-03f, +2.683625699e-05f, -7.490712594e-03f, -7.949072355e-03f, +7.083438478e-03f, +2.096294577e-02f, +8.219946097e-03f, -2.282243519e-02f, -3.039431882e-02f, +2.380439054e-03f, +3.560411141e-02f, +2.477867150e-02f, -1.541450050e-02f, -3.239438651e-02f, -9.444371919e-03f, +1.768009501e-02f, +1.699276059e-02f, -9.680512870e-04f, -9.586631083e-03f, -4.136709651e-03f, +2.022162048e-03f, +1.990459001e-03f, +2.053271103e-04f,\n    -5.517907351e-05f, -4.616720663e-05f, +1.868279672e-04f, +2.111068049e-04f, -2.299896455e-04f, -6.047305176e-04f, -1.151245892e-04f, +8.446213427e-04f, +8.405878122e-04f, -4.429656241e-04f, -1.339720954e-03f, -4.854064019e-04f, +1.030139207e-03f, +1.154871522e-03f, -1.554359608e-04f, -1.029756914e-03f, -4.879971326e-04f, +4.313407968e-04f, +5.239918765e-04f, +8.182096944e-06f, -2.545526212e-04f, -9.638367424e-05f, +6.732530413e-05f, +3.316945658e-05f,\n    /*  6,10 (24) */\n    -7.726888941e-04f, -2.771185734e-03f, -1.858951192e-03f, +6.079544319e-03f, +1.503097116e-02f, +7.917012801e-03f, -2.300329163e-02f, -5.157287971e-02f, -2.590385723e-02f, +8.193857870e-02f, +2.308023599e-01f, +3.275562843e-01f, +3.032748245e-01f, +1.756816356e-01f, +3.280565969e-02f, -4.488469839e-02f, -4.430735844e-02f, -9.408390245e-03f, +1.351239811e-02f, +1.253931786e-02f, +2.338780550e-03f, -2.915041375e-03f, -2.057784305e-03f, -2.384965669e-04f,\n    +5.367361504e-05f, +4.889749865e-05f, -1.288834556e-04f, -3.327438508e-04f, -1.326828498e-04f, +6.126209686e-04f, +1.166896245e-03f, +3.452562339e-04f, -2.053526041e-03f, -4.397038482e-03f, -4.378591568e-03f, -1.359928574e-03f, +2.658064548e-03f, +4.748488696e-03f, +3.753528341e-03f, +1.117727050e-03f, -8.326968404e-04f, -1.076393514e-03f, -3.210590406e-04f, +2.709163893e-04f, +2.846666873e-04f, +4.914324270e-05f, -6.672925739e-05f, -3.494771420e-05f,\n    +7.726888941e-04f, +2.771185734e-03f, +2.136642242e-04f, -7.279605790e-03f, -8.179062001e-03f, +6.478707960e-03f, +2.084782118e-02f, +9.064567440e-03f, -2.198184738e-02f, -3.083728444e-02f, +1.040718100e-03f, +3.511870501e-02f, +2.580881071e-02f, -1.425962898e-02f, -3.254982247e-02f, -1.047412883e-02f, +1.719209788e-02f, +1.742410139e-02f, -4.440594105e-04f, -9.578448986e-03f, -4.391262272e-03f, +1.925778373e-03f, +2.057784305e-03f, +2.384965669e-04f,\n    -5.367361504e-05f, -4.889749865e-05f, +1.804745870e-04f, +2.176120983e-04f, -2.122596742e-04f, -6.037324270e-04f, -1.438818692e-04f, +8.221002559e-04f, +8.644146191e-04f, -3.973127796e-04f, -1.336753852e-03f, -5.337296543e-04f, +9.960548144e-04f, +1.179717742e-03f, -1.106054035e-04f, -1.024705255e-03f, -5.191942975e-04f, +4.121007614e-04f, +5.348842467e-04f, +2.397495925e-05f, -2.542508895e-04f, -1.035892036e-04f, +6.672925739e-05f, +3.494771420e-05f,\n    /*  6,11 (24) */\n    -7.190152791e-04f, -2.722288236e-03f, -1.987834647e-03f, +5.746800468e-03f, +1.489828831e-02f, +8.529633770e-03f, -2.183639538e-02f, -5.122762348e-02f, -2.795738327e-02f, +7.754154022e-02f, +2.264237684e-01f, +3.261963557e-01f, +3.059328890e-01f, +1.804301243e-01f, +3.655918803e-02f, -4.376697134e-02f, -4.514005528e-02f, -1.048478376e-02f, +1.319133907e-02f, +1.281023425e-02f, +2.623447237e-03f, -2.865898132e-03f, -2.124513562e-03f, -2.734442811e-04f,\n    +5.211888475e-05f, +5.143434051e-05f, -1.211532453e-04f, -3.301426497e-04f, -1.484173194e-04f, +5.860706170e-04f, +1.165095656e-03f, +3.984705076e-04f, -1.966873861e-03f, -4.349495642e-03f, -4.428430743e-03f, -1.485143182e-03f, +2.548603607e-03f, +4.731180255e-03f, +3.821919682e-03f, +1.200151202e-03f, -7.974395044e-04f, -1.090473064e-03f, -3.470107043e-04f, +2.615394385e-04f, +2.905667697e-04f, +5.578131674e-05f, -6.597518170e-05f, -3.672778576e-05f,\n    +7.190152791e-04f, +2.722288236e-03f, +3.941388112e-04f, -7.061993691e-03f, -8.391321675e-03f, +5.874975533e-03f, +2.070393931e-02f, +9.886667696e-03f, -2.111743276e-02f, -3.123459722e-02f, -2.960357521e-04f, +3.458497535e-02f, +2.680486552e-02f, -1.307991124e-02f, -3.266042788e-02f, -1.149883409e-02f, +1.667290358e-02f, +1.783620215e-02f, +9.082483626e-05f, -9.554474027e-03f, -4.645513162e-03f, +1.822189170e-03f, +2.124513562e-03f, +2.734442811e-04f,\n    -5.211888475e-05f, -5.143434051e-05f, +1.739593458e-04f, +2.235781227e-04f, -1.945338611e-04f, -6.017877439e-04f, -1.720245964e-04f, +7.985766012e-04f, +8.867574951e-04f, -3.513302258e-04f, -1.331834017e-03f, -5.812330620e-04f, +9.604536064e-04f, +1.202922818e-03f, -6.531733867e-05f, -1.018057400e-03f, -5.499607829e-04f, +3.919210484e-04f, +5.450944670e-04f, +4.007203065e-05f, -2.534709491e-04f, -1.108101859e-04f, +6.597518170e-05f, +3.672778576e-05f,\n    /*  6,12 (24) */\n    -6.668963943e-04f, -2.670853895e-03f, -2.108987893e-03f, +5.416657818e-03f, +1.474987099e-02f, +9.115704387e-03f, -2.067129973e-02f, -5.082915297e-02f, -2.992425713e-02f, +7.319204457e-02f, +2.219953376e-01f, +3.247112125e-01f, +3.084814926e-01f, +1.851613046e-01f, +4.038110771e-02f, -4.256682013e-02f, -4.593749479e-02f, -1.157525682e-02f, +1.284432836e-02f, +1.307177369e-02f, +2.914014007e-03f, -2.810116815e-03f, -2.190488744e-03f, -3.101720669e-04f,\n    +5.052002055e-05f, +5.377970800e-05f, -1.134907162e-04f, -3.271402533e-04f, -1.635283859e-04f, +5.594225224e-04f, +1.161899229e-03f, +4.499479043e-04f, -1.880316393e-03f, -4.299556399e-03f, -4.475067179e-03f, -1.609196375e-03f, +2.437172497e-03f, +4.710605181e-03f, +3.888554500e-03f, +1.283310884e-03f, -7.603527866e-04f, -1.103501229e-03f, -3.731699285e-04f, +2.515257613e-04f, +2.962094404e-04f, +6.256500263e-05f, -6.505879630e-05f, -3.850561505e-05f,\n    +6.668963943e-04f, +2.670853895e-03f, +5.680981570e-04f, -6.838415569e-03f, -8.585855536e-03f, +5.273187789e-03f, +2.053191472e-02f, +1.068524430e-02f, -2.023067527e-02f, -3.158592745e-02f, -1.627869769e-03f, +3.400374229e-02f, +2.776531913e-02f, -1.187698842e-02f, -3.272574521e-02f, -1.251689149e-02f, +1.612294280e-02f, +1.822812320e-02f, +6.359193033e-04f, -9.514401996e-03f, -4.898984111e-03f, +1.711378984e-03f, +2.190488744e-03f, +3.101720669e-04f,\n    -5.052002055e-05f, -5.377970800e-05f, +1.672993318e-04f, +2.290057391e-04f, -1.768431249e-04f, -5.989145286e-04f, -1.995147604e-04f, +7.740981547e-04f, +9.075928686e-04f, -3.050911452e-04f, -1.324975022e-03f, -6.278441214e-04f, +9.233882296e-04f, +1.224444521e-03f, -1.963992123e-05f, -1.009810214e-03f, -5.802418545e-04f, +3.708222693e-04f, +5.545934181e-04f, +5.645026705e-05f, -2.522029828e-04f, -1.180319106e-04f, +6.505879630e-05f, +3.850561505e-05f,\n    /*  6,13 (24) */\n    -6.163763738e-04f, -2.617074187e-03f, -2.222478609e-03f, +5.089517565e-03f, +1.458634261e-02f, +9.675126909e-03f, -1.950940050e-02f, -5.037920507e-02f, -3.180457352e-02f, +6.889248817e-02f, +2.175202704e-01f, +3.231020161e-01f, +3.109186651e-01f, +1.898719098e-01f, +4.426966222e-02f, -4.128350925e-02f, -4.669784758e-02f, -1.267875805e-02f, +1.247115843e-02f, +1.332329945e-02f, +3.210223448e-03f, -2.747551813e-03f, -2.255547540e-03f, -3.486776819e-04f,\n    +4.888208265e-05f, +5.593586166e-05f, -1.059062192e-04f, -3.237521202e-04f, -1.780106955e-04f, +5.327137747e-04f, +1.157342108e-03f, +4.996697028e-04f, -1.793929652e-03f, -4.247285863e-03f, -4.518481500e-03f, -1.731992329e-03f, +2.323854286e-03f, +4.686758351e-03f, +3.953356508e-03f, +1.367140312e-03f, -7.214386688e-04f, -1.115437151e-03f, -3.995062278e-04f, +2.408731346e-04f, +3.015784591e-04f, +6.948736784e-05f, -6.397599520e-05f, -4.027701168e-05f,\n    +6.163763738e-04f, +2.617074187e-03f, +7.353974888e-04f, -6.609409829e-03f, -8.762698661e-03f, +4.674273261e-03f, +2.033239995e-02f, +1.145934245e-02f, -1.932308240e-02f, -3.189101859e-02f, -2.952844791e-03f, +3.337589817e-02f, +2.868870736e-02f, -1.065254390e-02f, -3.274538514e-02f, -1.352670170e-02f, +1.554270095e-02f, +1.859894547e-02f, +1.190512721e-03f, -9.457951729e-03f, -5.151187094e-03f, +1.593347073e-03f, +2.255547540e-03f, +3.486776819e-04f,\n    -4.888208265e-05f, -5.593586166e-05f, +1.605115338e-04f, +2.338968232e-04f, -1.592177872e-04f, -5.951322091e-04f, -2.263159219e-04f, +7.487138261e-04f, +9.268998177e-04f, -2.586687636e-04f, -1.316193531e-03f, -6.734918225e-04f, +8.849137654e-04f, +1.244243205e-03f, +2.635766287e-05f, -9.999631993e-04f, -6.099830312e-04f, +3.488269012e-04f, +5.633528087e-04f, +7.308567245e-05f, -2.504379341e-04f, -1.252393043e-04f, +6.397599520e-05f, +4.027701168e-05f,\n    /*  6,14 (24) */\n    -5.674942911e-04f, -2.561138325e-03f, -2.328384828e-03f, +4.765765445e-03f, +1.440833191e-02f, +1.020784068e-02f, -1.835205839e-02f, -4.987953537e-02f, -3.359850317e-02f, +6.464520231e-02f, +2.130017889e-01f, +3.213700238e-01f, +3.132425194e-01f, +1.945586681e-01f, +4.822301872e-02f, -3.991636894e-02f, -4.741928624e-02f, -1.379419520e-02f, +1.207165220e-02f, +1.356417259e-02f, +3.511801907e-03f, -2.678064445e-03f, -2.319523535e-03f, -3.889546936e-04f,\n    +4.721004585e-05f, +5.790533520e-05f, -9.840969351e-05f, -3.199939028e-04f, -1.918599014e-04f, +5.059807448e-04f, +1.151460357e-03f, +5.476193212e-04f, -1.707788607e-03f, -4.192750838e-03f, -4.558657401e-03f, -1.853436500e-03f, +2.208733939e-03f, +4.659637675e-03f, +4.016250511e-03f, +1.451572205e-03f, -6.807011622e-04f, -1.126240484e-03f, -4.259881958e-04f, +2.295802150e-04f, +3.066575897e-04f, +7.654104238e-05f, -6.272285979e-05f, -4.203765589e-05f,\n    +5.674942911e-04f, +2.561138325e-03f, +8.959090226e-04f, -6.375513006e-03f, -8.921916448e-03f, +4.079141051e-03f, +2.010608403e-02f, +1.220805628e-02f, -1.839618258e-02f, -3.214968736e-02f, -4.269038322e-03f, +3.270240635e-02f, +2.957362112e-02f, -9.408300692e-03f, -3.271902747e-02f, -1.452666490e-02f, +1.493271791e-02f, +1.894777237e-02f, +1.753865530e-03f, -9.384866057e-03f, -5.401625028e-03f, +1.468107769e-03f, +2.319523535e-03f, +3.889546936e-04f,\n    -4.721004585e-05f, -5.790533520e-05f, +1.536128079e-04f, +2.382542419e-04f, -1.416875244e-04f, -5.904615270e-04f, -2.523932593e-04f, +7.224735630e-04f, +9.446600874e-04f, -2.121362253e-04f, -1.305509262e-03f, -7.181067668e-04f, +8.450876411e-04f, +1.262281880e-03f, +7.260530933e-05f, -9.885185114e-04f, -6.391301841e-04f, +3.259592689e-04f, +5.713452407e-04f, +8.995332953e-05f, -2.481675405e-04f, -1.324169550e-04f, +6.272285979e-05f, +4.203765589e-05f,\n    /*  6,15 (24) */\n    -5.202842453e-04f, -2.503232990e-03f, -2.426794521e-03f, +4.445771542e-03f, +1.421647201e-02f, +1.071382143e-02f, -1.720059803e-02f, -4.933191604e-02f, -3.530629178e-02f, +6.045245147e-02f, +2.084431315e-01f, +3.195165873e-01f, +3.154512533e-01f, +1.992183058e-01f, +5.223926923e-02f, -3.846479673e-02f, -4.809998741e-02f, -1.492043569e-02f, +1.164566401e-02f, +1.379375280e-02f, +3.818459496e-03f, -2.601523403e-03f, -2.382246395e-03f, -4.309923495e-04f,\n    +4.550879214e-05f, +5.969092366e-05f, -9.101066092e-05f, -3.158814194e-04f, -2.050726491e-04f, +4.792590514e-04f, +1.144290896e-03f, +5.937823076e-04f, -1.621967112e-03f, -4.136019738e-03f, -4.595581654e-03f, -1.973435708e-03f, +2.091898242e-03f, +4.629244105e-03f, +4.077162501e-03f, +1.536537839e-03f, -6.381463300e-04f, -1.135871450e-03f, -4.525835287e-04f, +2.176465602e-04f, +3.114306263e-04f, +8.371822012e-05f, -6.129567137e-05f, -4.378310363e-05f,\n    +5.202842453e-04f, +2.503232990e-03f, +1.049521831e-03f, -6.137258764e-03f, -9.063603972e-03f, +3.488679524e-03f, +1.985369077e-02f, +1.293052984e-02f, -1.745152249e-02f, -3.236182358e-02f, -5.574547584e-03f, +3.198429958e-02f, +3.041870876e-02f, -8.146018813e-03f, -3.264642216e-02f, -1.551518341e-02f, +1.429358773e-02f, +1.927373164e-02f, +2.325210771e-03f, -9.294912727e-03f, -5.649792568e-03f, +1.335690814e-03f, +2.382246395e-03f, +4.309923495e-04f,\n    -4.550879214e-05f, -5.969092366e-05f, +1.466198448e-04f, +2.420818303e-04f, -1.242813225e-04f, -5.849244815e-04f, -2.777136124e-04f, +6.954282546e-04f, +9.608581028e-04f, -1.655664700e-04f, -1.292944947e-03f, -7.616212822e-04f, +8.039695356e-04f, +1.278526282e-03f, +1.190321101e-04f, -9.754809765e-04f, -6.676296348e-04f, +3.022455226e-04f, +5.785442723e-04f, +1.070274325e-04f, -2.453843657e-04f, -1.395491384e-04f, +6.129567137e-05f, +4.378310363e-05f,\n    /*  6,16 (24) */\n    -4.747754531e-04f, -2.443542066e-03f, -2.517805182e-03f, +4.129890123e-03f, +1.401139936e-02f, +1.119308048e-02f, -1.605630714e-02f, -4.873813374e-02f, -3.692825889e-02f, +5.631643174e-02f, +2.038475499e-01f, +3.175431516e-01f, +3.175431516e-01f, +2.038475499e-01f, +5.631643174e-02f, -3.692825889e-02f, -4.873813374e-02f, -1.605630714e-02f, +1.119308048e-02f, +1.401139936e-02f, +4.129890123e-03f, -2.517805182e-03f, -2.443542066e-03f, -4.747754531e-04f,\n    +4.378310363e-05f, +6.129567137e-05f, -8.371822012e-05f, -3.114306263e-04f, -2.176465602e-04f, +4.525835287e-04f, +1.135871450e-03f, +6.381463300e-04f, -1.536537839e-03f, -4.077162501e-03f, -4.629244105e-03f, -2.091898242e-03f, +1.973435708e-03f, +4.595581654e-03f, +4.136019738e-03f, +1.621967112e-03f, -5.937823076e-04f, -1.144290896e-03f, -4.792590514e-04f, +2.050726491e-04f, +3.158814194e-04f, +9.101066092e-05f, -5.969092366e-05f, -4.550879214e-05f,\n    +4.747754531e-04f, +2.443542066e-03f, +1.196141675e-03f, -5.895176934e-03f, -9.187885295e-03f, +2.903755043e-03f, +1.957597716e-02f, +1.362595810e-02f, -1.649066439e-02f, -3.252739005e-02f, -6.867492530e-03f, +3.122267830e-02f, +3.122267830e-02f, -6.867492530e-03f, -3.252739005e-02f, -1.649066439e-02f, +1.362595810e-02f, +1.957597716e-02f, +2.903755043e-03f, -9.187885295e-03f, -5.895176934e-03f, +1.196141675e-03f, +2.443542066e-03f, +4.747754531e-04f,\n    -4.378310363e-05f, -6.129567137e-05f, +1.395491384e-04f, +2.453843657e-04f, -1.070274325e-04f, -5.785442723e-04f, -3.022455226e-04f, +6.676296348e-04f, +9.754809765e-04f, -1.190321101e-04f, -1.278526282e-03f, -8.039695356e-04f, +7.616212822e-04f, +1.292944947e-03f, +1.655664700e-04f, -9.608581028e-04f, -6.954282546e-04f, +2.777136124e-04f, +5.849244815e-04f, +1.242813225e-04f, -2.420818303e-04f, -1.466198448e-04f, +5.969092366e-05f, +4.550879214e-05f,\n    /*  6,17 (24) */\n    -4.309923495e-04f, -2.382246395e-03f, -2.601523403e-03f, +3.818459496e-03f, +1.379375280e-02f, +1.164566401e-02f, -1.492043569e-02f, -4.809998741e-02f, -3.846479673e-02f, +5.223926923e-02f, +1.992183058e-01f, +3.154512533e-01f, +3.195165873e-01f, +2.084431315e-01f, +6.045245147e-02f, -3.530629178e-02f, -4.933191604e-02f, -1.720059803e-02f, +1.071382143e-02f, +1.421647201e-02f, +4.445771542e-03f, -2.426794521e-03f, -2.503232990e-03f, -5.202842453e-04f,\n    +4.203765589e-05f, +6.272285979e-05f, -7.654104238e-05f, -3.066575897e-04f, -2.295802150e-04f, +4.259881958e-04f, +1.126240484e-03f, +6.807011622e-04f, -1.451572205e-03f, -4.016250511e-03f, -4.659637675e-03f, -2.208733939e-03f, +1.853436500e-03f, +4.558657401e-03f, +4.192750838e-03f, +1.707788607e-03f, -5.476193212e-04f, -1.151460357e-03f, -5.059807448e-04f, +1.918599014e-04f, +3.199939028e-04f, +9.840969351e-05f, -5.790533520e-05f, -4.721004585e-05f,\n    +4.309923495e-04f, +2.382246395e-03f, +1.335690814e-03f, -5.649792568e-03f, -9.294912727e-03f, +2.325210771e-03f, +1.927373164e-02f, +1.429358773e-02f, -1.551518341e-02f, -3.264642216e-02f, -8.146018813e-03f, +3.041870876e-02f, +3.198429958e-02f, -5.574547584e-03f, -3.236182358e-02f, -1.745152249e-02f, +1.293052984e-02f, +1.985369077e-02f, +3.488679524e-03f, -9.063603972e-03f, -6.137258764e-03f, +1.049521831e-03f, +2.503232990e-03f, +5.202842453e-04f,\n    -4.203765589e-05f, -6.272285979e-05f, +1.324169550e-04f, +2.481675405e-04f, -8.995332953e-05f, -5.713452407e-04f, -3.259592689e-04f, +6.391301841e-04f, +9.885185114e-04f, -7.260530933e-05f, -1.262281880e-03f, -8.450876411e-04f, +7.181067668e-04f, +1.305509262e-03f, +2.121362253e-04f, -9.446600874e-04f, -7.224735630e-04f, +2.523932593e-04f, +5.904615270e-04f, +1.416875244e-04f, -2.382542419e-04f, -1.536128079e-04f, +5.790533520e-05f, +4.721004585e-05f,\n    /*  6,18 (24) */\n    -3.889546936e-04f, -2.319523535e-03f, -2.678064445e-03f, +3.511801907e-03f, +1.356417259e-02f, +1.207165220e-02f, -1.379419520e-02f, -4.741928624e-02f, -3.991636894e-02f, +4.822301872e-02f, +1.945586681e-01f, +3.132425194e-01f, +3.213700238e-01f, +2.130017889e-01f, +6.464520231e-02f, -3.359850317e-02f, -4.987953537e-02f, -1.835205839e-02f, +1.020784068e-02f, +1.440833191e-02f, +4.765765445e-03f, -2.328384828e-03f, -2.561138325e-03f, -5.674942911e-04f,\n    +4.027701168e-05f, +6.397599520e-05f, -6.948736784e-05f, -3.015784591e-04f, -2.408731346e-04f, +3.995062278e-04f, +1.115437151e-03f, +7.214386688e-04f, -1.367140312e-03f, -3.953356508e-03f, -4.686758351e-03f, -2.323854286e-03f, +1.731992329e-03f, +4.518481500e-03f, +4.247285863e-03f, +1.793929652e-03f, -4.996697028e-04f, -1.157342108e-03f, -5.327137747e-04f, +1.780106955e-04f, +3.237521202e-04f, +1.059062192e-04f, -5.593586166e-05f, -4.888208265e-05f,\n    +3.889546936e-04f, +2.319523535e-03f, +1.468107769e-03f, -5.401625028e-03f, -9.384866057e-03f, +1.753865530e-03f, +1.894777237e-02f, +1.493271791e-02f, -1.452666490e-02f, -3.271902747e-02f, -9.408300692e-03f, +2.957362112e-02f, +3.270240635e-02f, -4.269038322e-03f, -3.214968736e-02f, -1.839618258e-02f, +1.220805628e-02f, +2.010608403e-02f, +4.079141051e-03f, -8.921916448e-03f, -6.375513006e-03f, +8.959090226e-04f, +2.561138325e-03f, +5.674942911e-04f,\n    -4.027701168e-05f, -6.397599520e-05f, +1.252393043e-04f, +2.504379341e-04f, -7.308567245e-05f, -5.633528087e-04f, -3.488269012e-04f, +6.099830312e-04f, +9.999631993e-04f, -2.635766287e-05f, -1.244243205e-03f, -8.849137654e-04f, +6.734918225e-04f, +1.316193531e-03f, +2.586687636e-04f, -9.268998177e-04f, -7.487138261e-04f, +2.263159219e-04f, +5.951322091e-04f, +1.592177872e-04f, -2.338968232e-04f, -1.605115338e-04f, +5.593586166e-05f, +4.888208265e-05f,\n    /*  6,19 (24) */\n    -3.486776819e-04f, -2.255547540e-03f, -2.747551813e-03f, +3.210223448e-03f, +1.332329945e-02f, +1.247115843e-02f, -1.267875805e-02f, -4.669784758e-02f, -4.128350925e-02f, +4.426966222e-02f, +1.898719098e-01f, +3.109186651e-01f, +3.231020161e-01f, +2.175202704e-01f, +6.889248817e-02f, -3.180457352e-02f, -5.037920507e-02f, -1.950940050e-02f, +9.675126909e-03f, +1.458634261e-02f, +5.089517565e-03f, -2.222478609e-03f, -2.617074187e-03f, -6.163763738e-04f,\n    +3.850561505e-05f, +6.505879630e-05f, -6.256500263e-05f, -2.962094404e-04f, -2.515257613e-04f, +3.731699285e-04f, +1.103501229e-03f, +7.603527866e-04f, -1.283310884e-03f, -3.888554500e-03f, -4.710605181e-03f, -2.437172497e-03f, +1.609196375e-03f, +4.475067179e-03f, +4.299556399e-03f, +1.880316393e-03f, -4.499479043e-04f, -1.161899229e-03f, -5.594225224e-04f, +1.635283859e-04f, +3.271402533e-04f, +1.134907162e-04f, -5.377970800e-05f, -5.052002055e-05f,\n    +3.486776819e-04f, +2.255547540e-03f, +1.593347073e-03f, -5.151187094e-03f, -9.457951729e-03f, +1.190512721e-03f, +1.859894547e-02f, +1.554270095e-02f, -1.352670170e-02f, -3.274538514e-02f, -1.065254390e-02f, +2.868870736e-02f, +3.337589817e-02f, -2.952844791e-03f, -3.189101859e-02f, -1.932308240e-02f, +1.145934245e-02f, +2.033239995e-02f, +4.674273261e-03f, -8.762698661e-03f, -6.609409829e-03f, +7.353974888e-04f, +2.617074187e-03f, +6.163763738e-04f,\n    -3.850561505e-05f, -6.505879630e-05f, +1.180319106e-04f, +2.522029828e-04f, -5.645026705e-05f, -5.545934181e-04f, -3.708222693e-04f, +5.802418545e-04f, +1.009810214e-03f, +1.963992123e-05f, -1.224444521e-03f, -9.233882296e-04f, +6.278441214e-04f, +1.324975022e-03f, +3.050911452e-04f, -9.075928686e-04f, -7.740981547e-04f, +1.995147604e-04f, +5.989145286e-04f, +1.768431249e-04f, -2.290057391e-04f, -1.672993318e-04f, +5.377970800e-05f, +5.052002055e-05f,\n    /*  6,20 (24) */\n    -3.101720669e-04f, -2.190488744e-03f, -2.810116815e-03f, +2.914014007e-03f, +1.307177369e-02f, +1.284432836e-02f, -1.157525682e-02f, -4.593749479e-02f, -4.256682013e-02f, +4.038110771e-02f, +1.851613046e-01f, +3.084814926e-01f, +3.247112125e-01f, +2.219953376e-01f, +7.319204457e-02f, -2.992425713e-02f, -5.082915297e-02f, -2.067129973e-02f, +9.115704387e-03f, +1.474987099e-02f, +5.416657818e-03f, -2.108987893e-03f, -2.670853895e-03f, -6.668963943e-04f,\n    +3.672778576e-05f, +6.597518170e-05f, -5.578131674e-05f, -2.905667697e-04f, -2.615394385e-04f, +3.470107043e-04f, +1.090473064e-03f, +7.974395044e-04f, -1.200151202e-03f, -3.821919682e-03f, -4.731180255e-03f, -2.548603607e-03f, +1.485143182e-03f, +4.428430743e-03f, +4.349495642e-03f, +1.966873861e-03f, -3.984705076e-04f, -1.165095656e-03f, -5.860706170e-04f, +1.484173194e-04f, +3.301426497e-04f, +1.211532453e-04f, -5.143434051e-05f, -5.211888475e-05f,\n    +3.101720669e-04f, +2.190488744e-03f, +1.711378984e-03f, -4.898984111e-03f, -9.514401996e-03f, +6.359193033e-04f, +1.822812320e-02f, +1.612294280e-02f, -1.251689149e-02f, -3.272574521e-02f, -1.187698842e-02f, +2.776531913e-02f, +3.400374229e-02f, -1.627869769e-03f, -3.158592745e-02f, -2.023067527e-02f, +1.068524430e-02f, +2.053191472e-02f, +5.273187789e-03f, -8.585855536e-03f, -6.838415569e-03f, +5.680981570e-04f, +2.670853895e-03f, +6.668963943e-04f,\n    -3.672778576e-05f, -6.597518170e-05f, +1.108101859e-04f, +2.534709491e-04f, -4.007203065e-05f, -5.450944670e-04f, -3.919210484e-04f, +5.499607829e-04f, +1.018057400e-03f, +6.531733867e-05f, -1.202922818e-03f, -9.604536064e-04f, +5.812330620e-04f, +1.331834017e-03f, +3.513302258e-04f, -8.867574951e-04f, -7.985766012e-04f, +1.720245964e-04f, +6.017877439e-04f, +1.945338611e-04f, -2.235781227e-04f, -1.739593458e-04f, +5.143434051e-05f, +5.211888475e-05f,\n    /*  6,21 (24) */\n    -2.734442811e-04f, -2.124513562e-03f, -2.865898132e-03f, +2.623447237e-03f, +1.281023425e-02f, +1.319133907e-02f, -1.048478376e-02f, -4.514005528e-02f, -4.376697134e-02f, +3.655918803e-02f, +1.804301243e-01f, +3.059328890e-01f, +3.261963557e-01f, +2.264237684e-01f, +7.754154022e-02f, -2.795738327e-02f, -5.122762348e-02f, -2.183639538e-02f, +8.529633770e-03f, +1.489828831e-02f, +5.746800468e-03f, -1.987834647e-03f, -2.722288236e-03f, -7.190152791e-04f,\n    +3.494771420e-05f, +6.672925739e-05f, -4.914324270e-05f, -2.846666873e-04f, -2.709163893e-04f, +3.210590406e-04f, +1.076393514e-03f, +8.326968404e-04f, -1.117727050e-03f, -3.753528341e-03f, -4.748488696e-03f, -2.658064548e-03f, +1.359928574e-03f, +4.378591568e-03f, +4.397038482e-03f, +2.053526041e-03f, -3.452562339e-04f, -1.166896245e-03f, -6.126209686e-04f, +1.326828498e-04f, +3.327438508e-04f, +1.288834556e-04f, -4.889749865e-05f, -5.367361504e-05f,\n    +2.734442811e-04f, +2.124513562e-03f, +1.822189170e-03f, -4.645513162e-03f, -9.554474027e-03f, +9.082483626e-05f, +1.783620215e-02f, +1.667290358e-02f, -1.149883409e-02f, -3.266042788e-02f, -1.307991124e-02f, +2.680486552e-02f, +3.458497535e-02f, -2.960357521e-04f, -3.123459722e-02f, -2.111743276e-02f, +9.886667696e-03f, +2.070393931e-02f, +5.874975533e-03f, -8.391321675e-03f, -7.061993691e-03f, +3.941388112e-04f, +2.722288236e-03f, +7.190152791e-04f,\n    -3.494771420e-05f, -6.672925739e-05f, +1.035892036e-04f, +2.542508895e-04f, -2.397495925e-05f, -5.348842467e-04f, -4.121007614e-04f, +5.191942975e-04f, +1.024705255e-03f, +1.106054035e-04f, -1.179717742e-03f, -9.960548144e-04f, +5.337296543e-04f, +1.336753852e-03f, +3.973127796e-04f, -8.644146191e-04f, -8.221002559e-04f, +1.438818692e-04f, +6.037324270e-04f, +2.122596742e-04f, -2.176120983e-04f, -1.804745870e-04f, +4.889749865e-05f, +5.367361504e-05f,\n    /*  6,22 (24) */\n    -2.384965669e-04f, -2.057784305e-03f, -2.915041375e-03f, +2.338780550e-03f, +1.253931786e-02f, +1.351239811e-02f, -9.408390245e-03f, -4.430735844e-02f, -4.488469839e-02f, +3.280565969e-02f, +1.756816356e-01f, +3.032748245e-01f, +3.275562843e-01f, +2.308023599e-01f, +8.193857870e-02f, -2.590385723e-02f, -5.157287971e-02f, -2.300329163e-02f, +7.917012801e-03f, +1.503097116e-02f, +6.079544319e-03f, -1.858951192e-03f, -2.771185734e-03f, -7.726888941e-04f,\n    +3.316945658e-05f, +6.732530413e-05f, -4.265727503e-05f, -2.785254130e-04f, -2.796596949e-04f, +2.953444788e-04f, +1.061303886e-03f, +8.661248172e-04f, -1.036102654e-03f, -3.683457771e-03f, -4.762538634e-03f, -2.765474238e-03f, +1.233649549e-03f, +4.325572093e-03f, +4.442121581e-03f, +2.140195948e-03f, -2.903259489e-04f, -1.167266825e-03f, -6.390358040e-04f, +1.163313523e-04f, +3.349286204e-04f, +1.366705918e-04f, -4.616720663e-05f, -5.517907351e-05f,\n    +2.384965669e-04f, +2.057784305e-03f, +1.925778373e-03f, -4.391262272e-03f, -9.578448986e-03f, -4.440594105e-04f, +1.742410139e-02f, +1.719209788e-02f, -1.047412883e-02f, -3.254982247e-02f, -1.425962898e-02f, +2.580881071e-02f, +3.511870501e-02f, +1.040718100e-03f, -3.083728444e-02f, -2.198184738e-02f, +9.064567440e-03f, +2.084782118e-02f, +6.478707960e-03f, -8.179062001e-03f, -7.279605790e-03f, +2.136642242e-04f, +2.771185734e-03f, +7.726888941e-04f,\n    -3.316945658e-05f, -6.732530413e-05f, +9.638367424e-05f, +2.545526212e-04f, -8.182096944e-06f, -5.239918765e-04f, -4.313407968e-04f, +4.879971326e-04f, +1.029756914e-03f, +1.554359608e-04f, -1.154871522e-03f, -1.030139207e-03f, +4.854064019e-04f, +1.339720954e-03f, +4.429656241e-04f, -8.405878122e-04f, -8.446213427e-04f, +1.151245892e-04f, +6.047305176e-04f, +2.299896455e-04f, -2.111068049e-04f, -1.868279672e-04f, +4.616720663e-05f, +5.517907351e-05f,\n    /*  6,23 (24) */\n    -2.053271103e-04f, -1.990459001e-03f, -2.957698650e-03f, +2.060255137e-03f, +1.225965817e-02f, +1.380774258e-02f, -8.347086359e-03f, -4.344123363e-02f, -4.592080104e-02f, +2.912220192e-02f, +1.709190970e-01f, +3.005093502e-01f, +3.287899338e-01f, +2.351279320e-01f, +8.638070028e-02f, -2.376366128e-02f, -5.186320566e-02f, -2.417055845e-02f, +7.277976997e-03f, +1.514730251e-02f, +6.414472939e-03f, -1.722280600e-03f, -2.817352941e-03f, -8.278679676e-04f,\n    +3.139693059e-05f, +6.776776486e-05f, -3.632947036e-05f, -2.721591211e-04f, -2.877732716e-04f, +2.698955957e-04f, +1.045245885e-03f, +8.977254349e-04f, -9.553406348e-04f, -3.611786181e-03f, -4.773341188e-03f, -2.870753655e-03f, +1.106404188e-03f, +4.269397810e-03f, +4.484683449e-03f, +2.226805702e-03f, -2.337026664e-04f, -1.166174257e-03f, -6.652767031e-04f, +9.937023555e-05f, +3.366819736e-04f, +1.445035018e-04f, -4.324178486e-05f, -5.663005275e-05f,\n    +2.053271103e-04f, +1.990459001e-03f, +2.022162048e-03f, -4.136709651e-03f, -9.586631083e-03f, -9.680512870e-04f, +1.699276059e-02f, +1.768009501e-02f, -9.444371919e-03f, -3.239438651e-02f, -1.541450050e-02f, +2.477867150e-02f, +3.560411141e-02f, +2.380439054e-03f, -3.039431882e-02f, -2.282243519e-02f, +8.219946097e-03f, +2.096294577e-02f, +7.083438478e-03f, -7.949072355e-03f, -7.490712594e-03f, +2.683625699e-05f, +2.817352941e-03f, +8.278679676e-04f,\n    -3.139693059e-05f, -6.776776486e-05f, +8.920792150e-05f, +2.543866878e-04f, +7.284492294e-06f, -5.124472386e-04f, -4.496224237e-04f, +4.564241782e-04f, +1.033218118e-03f, +1.997419964e-04f, -1.128428889e-03f, -1.062656658e-03f, +4.363371811e-04f, +1.340724874e-03f, +4.882157442e-04f, -8.153032736e-04f, -8.660933128e-04f, +8.579228719e-05f, +6.047653749e-04f, +2.476923088e-04f, -2.040624157e-04f, -1.930023331e-04f, +4.324178486e-05f, +5.663005275e-05f,\n    /*  6,24 (24) */\n    -1.739301798e-04f, -1.922691236e-03f, -2.994028120e-03f, +1.788096016e-03f, +1.197188490e-02f, +1.407763818e-02f, -7.301840474e-03f, -4.254350819e-02f, -4.687614167e-02f, +2.551041574e-02f, +1.661457558e-01f, +2.976385966e-01f, +3.298963380e-01f, +2.393973298e-01f, +9.086538373e-02f, -2.153685558e-02f, -5.209690833e-02f, -2.533673271e-02f, +6.612700294e-03f, +1.524667275e-02f, +6.751154913e-03f, -1.577777098e-03f, -2.860594726e-03f, -8.844980204e-04f,\n    +2.963391142e-05f, +6.806123211e-05f, -3.016544842e-05f, -2.655839161e-04f, -2.952618468e-04f, +2.447399846e-04f, +1.028261548e-03f, +9.275026422e-04f, -8.755019491e-04f, -3.538592610e-03f, -4.780910436e-03f, -2.973825913e-03f, +9.782915545e-04f, +4.210097246e-03f, +4.524664529e-03f, +2.313276598e-03f, -1.754115491e-04f, -1.163586488e-03f, -6.913046371e-04f, +8.180795328e-05f, +3.379892059e-04f, +1.523706453e-04f, -4.011986105e-05f, -5.802128424e-05f,\n    +1.739301798e-04f, +1.922691236e-03f, +2.111369969e-03f, -3.882322963e-03f, -9.579346591e-03f, -1.480498526e-03f, +1.654313817e-02f, +1.813651919e-02f, -8.411153801e-03f, -3.219464451e-02f, -1.654292939e-02f, +2.371601484e-02f, +3.604044859e-02f, +3.721163928e-03f, -2.990610308e-02f, -2.363773847e-02f, +7.353852784e-03f, +2.104873806e-02f, +7.688203853e-03f, -7.701380046e-03f, -7.694775010e-03f, -1.661660761e-04f, +2.860594726e-03f, +8.844980204e-04f,\n    -2.963391142e-05f, -6.806123211e-05f, +8.207586033e-05f, +2.537643245e-04f, +2.240375052e-05f, -5.002809122e-04f, -4.669288026e-04f, +4.245303820e-04f, +1.035097187e-03f, +2.434577447e-04f, -1.100436991e-03f, -1.093559642e-03f, +3.865971177e-04f, +1.339758308e-03f, +5.329904173e-04f, -7.885898027e-04f, -8.864709371e-04f, +5.592596085e-05f, +6.038218276e-04f, +2.653357019e-04f, -1.964801581e-04f, -1.989805015e-04f, +4.011986105e-05f, +5.802128424e-05f,\n    /*  6,25 (24) */\n    -1.442962683e-04f, -1.854630004e-03f, -3.024193569e-03f, +1.522512100e-03f, +1.167662305e-02f, +1.432237817e-02f, -6.273578926e-03f, -4.161600555e-02f, -4.775164362e-02f, +2.197182313e-02f, +1.613648454e-01f, +2.946647707e-01f, +3.308746295e-01f, +2.436074271e-01f, +9.539004826e-02f, -1.922357898e-02f, -5.227231988e-02f, -2.650031920e-02f, +5.921395657e-03f, +1.532848070e-02f, +7.089144119e-03f, -1.425406453e-03f, -2.900714587e-03f, -9.425193046e-04f,\n    +2.788402811e-05f, +6.821043546e-05f, -2.417039358e-05f, -2.588158100e-04f, -3.021309355e-04f, +2.199042372e-04f, +1.010393195e-03f, +9.554623048e-04f, -7.966458449e-04f, -3.463956829e-03f, -4.785263390e-03f, -3.074616339e-03f, +8.494115912e-04f, +4.147701949e-03f, +4.562007266e-03f, +2.399529195e-03f, -1.154799069e-04f, -1.159472611e-03f, -7.170800082e-04f, +6.365401444e-05f, +3.388359222e-04f, +1.602601035e-04f, -3.680038110e-05f, -5.934744720e-05f,\n    +1.442962683e-04f, +1.854630004e-03f, +2.193445829e-03f, -3.628558639e-03f, -9.556942840e-03f, -1.980779438e-03f, +1.607620937e-02f, +1.856104957e-02f, -7.376056614e-03f, -3.195118677e-02f, -1.764336638e-02f, +2.262245520e-02f, +3.642704571e-02f, +5.060922236e-03f, -2.937311266e-02f, -2.442632827e-02f, +6.467381847e-03f, +2.110466402e-02f, +8.292025680e-03f, -7.436044344e-03f, -7.891255168e-03f, -3.651465776e-04f, +2.900714587e-03f, +9.425193046e-04f,\n    -2.788402811e-05f, -6.821043546e-05f, +7.500097594e-05f, +2.526974221e-04f, +3.715564929e-05f, -4.875241071e-04f, -4.832449927e-04f, +3.923706530e-04f, +1.035404989e-03f, +2.865187936e-04f, -1.070945305e-03f, -1.122803310e-03f, +3.362624619e-04f, +1.336817126e-03f, +5.772173382e-04f, -7.604787672e-04f, -9.057103977e-04f, +2.556801747e-05f, +6.018862218e-04f, +2.828874197e-04f, -1.883623296e-04f, -2.047452951e-04f, +3.680038110e-05f, +5.934744720e-05f,\n    /*  6,26 (24) */\n    -1.164122402e-04f, -1.786419568e-03f, -3.048363962e-03f, +1.263696290e-03f, +1.137449211e-02f, +1.454228240e-02f, -5.263185731e-03f, -4.066054324e-02f, -4.854828947e-02f, +1.850786630e-02f, +1.565795820e-01f, +2.915901543e-01f, +3.317240411e-01f, +2.477551290e-01f, +9.995205552e-02f, -1.682404978e-02f, -5.238779979e-02f, -2.765979181e-02f, +5.204315649e-03f, +1.539213472e-02f, +7.427980041e-03f, -1.265146349e-03f, -2.937514968e-03f, -1.001866752e-03f,\n    +2.615076039e-05f, +6.822022903e-05f, -1.834905721e-05f, -2.518706986e-04f, -3.083868143e-04f, +1.954139279e-04f, +9.916833680e-04f, +9.816121727e-04f, -7.188298137e-04f, -3.387959259e-03f, -4.786419960e-03f, -3.173052544e-03f, +7.198650226e-04f, +4.082246465e-03f, +4.596656183e-03f, +2.485483383e-03f, -5.393719231e-05f, -1.153802914e-03f, -7.425626902e-04f, +4.491899181e-05f, +3.392080658e-04f, +1.681595893e-04f, -3.328261961e-05f, -6.060317770e-05f,\n    +1.164122402e-04f, +1.786419568e-03f, +2.268446805e-03f, -3.375861217e-03f, -9.519787191e-03f, -2.468303545e-03f, +1.559296437e-02f, +1.895342023e-02f, -6.340651625e-03f, -3.166466798e-02f, -1.871431169e-02f, +2.149965189e-02f, +3.676330817e-02f, +6.397739363e-03f, -2.879589532e-02f, -2.518680704e-02f, +5.561671449e-03f, +2.113023204e-02f, +8.893911902e-03f, -7.153156925e-03f, -8.079617498e-03f, -5.698918727e-04f, +2.937514968e-03f, +1.001866752e-03f,\n    -2.615076039e-05f, -6.822022903e-05f, +6.799630432e-05f, +2.511984901e-04f, +5.152121081e-05f, -4.742085965e-04f, -4.985579560e-04f, +3.599997655e-04f, +1.034154896e-03f, +3.288621856e-04f, -1.040005548e-03f, -1.150345561e-03f, +2.854104603e-04f, +1.331900379e-03f, +6.208247442e-04f, -7.310040664e-04f, -9.237693767e-04f, -5.237786086e-06f, +5.989464665e-04f, +3.003146694e-04f, -1.797123137e-04f, -2.102795790e-04f, +3.328261961e-05f, +6.060317770e-05f,\n    /*  6,27 (24) */\n    -9.026147983e-05f, -1.718199339e-03f, -3.066713019e-03f, +1.011825591e-03f, +1.106610530e-02f, +1.473769633e-02f, -4.271502363e-03f, -3.967893107e-02f, -4.926711928e-02f, +1.511990704e-02f, +1.517931620e-01f, +2.884171018e-01f, +3.324439062e-01f, +2.518373755e-01f, +1.045487117e-01f, -1.433856640e-02f, -5.244173698e-02f, -2.881359472e-02f, +4.461752959e-03f, +1.543705371e-02f, +7.767188107e-03f, -1.096986760e-03f, -2.970797587e-03f, -1.062469930e-03f,\n    +2.443743580e-05f, +6.809557905e-05f, -1.270576066e-05f, -2.447643402e-04f, -3.140364966e-04f, +1.712936001e-04f, +9.721747743e-04f, +1.005961845e-03f, -6.421095461e-04f, -3.310680875e-03f, -4.784402921e-03f, -3.269064490e-03f, +5.897532510e-04f, +4.013768311e-03f, +4.628557951e-03f, +2.571058474e-03f, +9.185006537e-06f, -1.146548940e-03f, -7.677120714e-04f, +2.561452950e-05f, +3.390919485e-04f, +1.760564584e-04f, -2.956619010e-05f, -6.178307809e-05f,\n    +9.026147983e-05f, +1.718199339e-03f, +2.336443110e-03f, -3.124662727e-03f, -9.468265980e-03f, -2.942512141e-03f, +1.509440642e-02f, +1.931341999e-02f, -5.306496729e-03f, -3.133580579e-02f, -1.975431723e-02f, +2.034930633e-02f, +3.704871863e-02f, +7.729639742e-03f, -2.817507058e-02f, -2.591781110e-02f, +4.637902073e-03f, +2.112499425e-02f, +9.492858368e-03f, -6.852842255e-03f, -8.259329812e-03f, -7.801714517e-04f, +2.970797587e-03f, +1.062469930e-03f,\n    -2.443743580e-05f, -6.809557905e-05f, +6.107441404e-05f, +2.492806200e-04f, +6.548252658e-05f, -4.603666510e-04f, -5.128565571e-04f, +3.274722649e-04f, +1.031362745e-03f, +3.704265174e-04f, -1.007671578e-03f, -1.176147110e-03f, +2.341192274e-04f, +1.325010312e-03f, +6.637415389e-04f, -7.002020898e-04f, -9.406071432e-04f, -3.644640680e-05f, +5.949920767e-04f, +3.175843266e-04f, -1.705345927e-04f, -2.155662977e-04f, +2.956619010e-05f, +6.178307809e-05f,\n    /*  6,28 (24) */\n    -6.582404402e-05f, -1.650103760e-03f, -3.079418780e-03f, +7.670612510e-04f, +1.075206880e-02f, +1.490898993e-02f, -3.299327589e-03f, -3.867296923e-02f, -4.990922883e-02f, +1.180922617e-02f, +1.470087591e-01f, +2.851480373e-01f, +3.330336594e-01f, +2.558511438e-01f, +1.091772697e-01f, -1.176750793e-02f, -5.243255197e-02f, -2.996014366e-02f, +3.694040888e-03f, +1.546266824e-02f, +8.106280055e-03f, -9.209303016e-04f, -3.000363778e-03f, -1.124253008e-03f,\n    +2.274722726e-05f, +6.784155157e-05f, -7.244398905e-06f, -2.375123335e-04f, -3.190877058e-04f, +1.475667527e-04f, +9.519102335e-04f, +1.028522733e-03f, -5.665388902e-04f, -3.232203116e-03f, -4.779237872e-03f, -3.362584557e-03f, +4.591782538e-04f, +3.942307950e-03f, +4.657661463e-03f, +2.656173279e-03f, +7.385297568e-05f, -1.137683536e-03f, -7.924870975e-04f, +5.753348927e-06f, +3.384742792e-04f, +1.839377214e-04f, -2.565105489e-05f, -6.288172682e-05f,\n    +6.582404402e-05f, +1.650103760e-03f, +2.397517524e-03f, -2.875382107e-03f, -9.402783454e-03f, -3.402878792e-03f, +1.458154986e-02f, +1.964089226e-02f, -4.275133985e-03f, -3.096537927e-02f, -2.076198881e-02f, +1.917315922e-02f, +3.728283786e-02f, +9.054650055e-03f, -2.751132904e-02f, -2.661801319e-02f, +3.697294929e-03f, +2.108854784e-02f, +1.008785045e-02f, -6.535257929e-03f, -8.429864404e-03f, -9.957377493e-04f, +3.000363778e-03f, +1.124253008e-03f,\n    -2.274722726e-05f, -6.784155157e-05f, +5.424738949e-05f, +2.469574470e-04f, +7.902277375e-05f, -4.460309708e-04f, -5.261315604e-04f, +2.948423740e-04f, +1.027046790e-03f, +4.111520349e-04f, -9.739992989e-04f, -1.200171545e-03f, +1.824676140e-04f, +1.316152368e-03f, +7.058974164e-04f, -6.681116709e-04f, -9.561846390e-04f, -6.801158183e-05f, +5.900142142e-04f, +3.346629931e-04f, -1.608347588e-04f, -2.205885129e-04f, +2.565105489e-05f, +6.288172682e-05f,\n    /*  6,29 (24) */\n    -4.307681677e-05f, -1.582262209e-03f, -3.086663179e-03f, +5.295489175e-04f, +1.043298110e-02f, +1.505655668e-02f, -2.347417355e-03f, -3.764444649e-02f, -5.047576772e-02f, +8.577023051e-03f, +1.422295212e-01f, +2.817854527e-01f, +3.334928377e-01f, +2.597934518e-01f, +1.138349311e-01f, -9.111334648e-03f, -5.235869900e-02f, -3.109782720e-02f, +2.901553790e-03f, +1.546842159e-02f, +8.444754334e-03f, -7.369925802e-04f, -3.026014832e-03f, -1.187134734e-03f,\n    +2.108315094e-05f, +6.746330023e-05f, -1.968444869e-06f, -2.301300971e-04f, -3.235488489e-04f, +1.242558299e-04f, +9.309326212e-04f, +1.049308023e-03f, -4.921698130e-04f, -3.152607797e-03f, -4.770953197e-03f, -3.453547606e-03f, +3.282424799e-04f, +3.867908757e-03f, +4.683917896e-03f, +2.740746193e-03f, +1.400308877e-04f, -1.127180907e-03f, -8.168463171e-04f, -1.465074660e-05f, +3.373421937e-04f, +1.917900568e-04f, -2.153753453e-05f, -6.389368841e-05f,\n    +4.307681677e-05f, +1.582262209e-03f, +2.451764913e-03f, -2.628424660e-03f, -9.323760680e-03f, -3.848909763e-03f, +1.405541830e-02f, +1.993573463e-02f, -3.248087194e-03f, -3.055422724e-02f, -2.173598811e-02f, +1.797298767e-02f, +3.746530547e-02f, +1.037080242e-02f, -2.680543162e-02f, -2.728612486e-02f, +2.741110290e-03f, +2.102053626e-02f, +1.067786466e-02f, -6.200594936e-03f, -8.590699163e-03f, -1.216326262e-03f, +3.026014832e-03f, +1.187134734e-03f,\n    -2.108315094e-05f, -6.746330023e-05f, +4.752681547e-05f, +2.442431118e-04f, +9.212622896e-05f, -4.312346192e-04f, -5.383756226e-04f, +2.621639014e-04f, +1.021227655e-03f, +4.509807251e-04f, -9.390465563e-04f, -1.222385389e-03f, +1.305350756e-04f, +1.305335186e-03f, +7.472229839e-04f, -6.347740361e-04f, -9.704645605e-04f, -9.988589785e-05f, +5.840057251e-04f, +3.515170566e-04f, -1.506195234e-04f, -2.253294414e-04f, +2.153753453e-05f, +6.389368841e-05f,\n    /*  6,30 (24) */\n    -2.199366583e-05f, -1.514798908e-03f, -3.088631624e-03f, +2.994188205e-04f, +1.010943225e-02f, +1.518081251e-02f, -1.416484734e-03f, -3.659513847e-02f, -5.096793753e-02f, +5.424415255e-03f, +1.374585680e-01f, +2.783319051e-01f, +3.338210801e-01f, +2.636613605e-01f, +1.185188490e-01f, -6.370588456e-03f, -5.221866811e-02f, -3.222500811e-02f, +2.084707473e-03f, +1.545377084e-02f, +8.782096528e-03f, -5.452025233e-04f, -3.047552367e-03f, -1.251028423e-03f,\n    +1.944806459e-05f, +6.696605421e-05f, +3.119045703e-06f, -2.226328496e-04f, -3.274289891e-04f, +1.013822117e-04f, +9.092848150e-04f, +1.068332631e-03f, -4.190523637e-04f, -3.071977016e-03f, -4.759580019e-03f, -3.541891040e-03f, +1.970487457e-04f, +3.790616984e-03f, +4.707280779e-03f, +2.824695277e-03f, +2.076808167e-04f, -1.115016669e-03f, -8.407479278e-04f, -3.558286875e-05f, +3.356832843e-04f, +1.995998244e-04f, -1.722631685e-05f, -6.481352384e-05f,\n    +2.199366583e-05f, +1.514798908e-03f, +2.499291729e-03f, -2.384181548e-03f, -9.231634451e-03f, -4.280144382e-03f, +1.351704268e-02f, +2.019789853e-02f, -2.226859539e-03f, -3.010324651e-02f, -2.267503467e-02f, +1.675060228e-02f, +3.759584055e-02f, +1.167613761e-02f, -2.605820864e-02f, -2.792089890e-02f, +1.770645730e-03f, +2.092065036e-02f, +1.126187038e-02f, -5.849077879e-03f, -8.741318686e-03f, -1.441655704e-03f, +3.047552367e-03f, +1.251028423e-03f,\n    -1.944806459e-05f, -6.696605421e-05f, +4.092376319e-05f, +2.411522223e-04f, +1.047782799e-04f, -4.160109560e-04f, -5.495832833e-04f, +2.294901511e-04f, +1.013928274e-03f, +4.898564049e-04f, -9.028730329e-04f, -1.242758144e-03f, +7.840153916e-05f, +1.292570593e-03f, +7.876498834e-04f, -6.002327499e-04f, -9.834114395e-04f, -1.320208631e-04f, +5.769611755e-04f, +3.681127511e-04f, -1.398967235e-04f, -2.297724939e-04f, +1.722631685e-05f, +6.481352384e-05f,\n    /*  6,31 (24) */\n    -2.545601248e-06f, -1.447832854e-03f, -3.085512578e-03f, +7.678597090e-05f, +9.782003259e-03f, +1.528219472e-02f, -5.071999193e-04f, -3.552680584e-02f, -5.138698989e-02f, +2.352438239e-03f, +1.326989880e-01f, +2.747900141e-01f, +3.340181289e-01f, +2.674519775e-01f, +1.232261298e-01f, -3.545893179e-03f, -5.201098729e-02f, -3.334002477e-02f, +1.243959545e-03f, +1.541818797e-02f, +9.117779812e-03f, -3.456026989e-04f, -3.064778684e-03f, -1.315841947e-03f,\n    +1.784466616e-05f, +6.635510628e-05f, +8.015428714e-06f, -2.150355900e-04f, -3.307378182e-04f, +7.896620590e-05f, +8.870096413e-04f, +1.085613170e-03f, -3.472346398e-04f, -2.990393068e-03f, -4.745152154e-03f, -3.627554861e-03f, +6.570013011e-05f, +3.710481723e-03f, +4.727706059e-03f, +2.907938350e-03f, +2.767627563e-04f, -1.101167895e-03f, -8.641498231e-04f, -5.702704247e-05f, +3.334856284e-04f, +2.073530798e-04f, -1.271846563e-05f, -6.563580115e-05f,\n    +2.545601248e-06f, +1.447832854e-03f, +2.540215492e-03f, -2.143029326e-03f, -9.126856171e-03f, -4.696155338e-03f, +1.296745939e-02f, +2.042738868e-02f, -1.212931265e-03f, -2.961339011e-02f, -2.357790770e-02f, +1.550784414e-02f, +3.767424209e-02f, +1.296870820e-02f, -2.527055875e-02f, -2.852113165e-02f, +7.872342904e-04f, +2.078862950e-02f, +1.183883156e-02f, -5.480965128e-03f, -8.881215410e-03f, -1.671428198e-03f, +3.064778684e-03f, +1.315841947e-03f,\n    -1.784466616e-05f, -6.635510628e-05f, +3.444877766e-05f, +2.376998145e-04f, +1.169654343e-04f, -4.003935711e-04f, -5.597509504e-04f, +1.968738343e-04f, +1.005173835e-03f, +5.277248058e-04f, -8.655401410e-04f, -1.261262345e-03f, +2.614726878e-05f, +1.277873593e-03f, +8.271109120e-04f, -5.645336545e-04f, -9.949917205e-04f, -1.643669824e-04f, +5.688768839e-04f, +3.844162184e-04f, -1.286753269e-04f, -2.339013135e-04f, +1.271846563e-05f, +6.563580115e-05f,\n    /*  7, 0 (20) */\n    -2.043579130e-03f, +4.413747039e-04f, +1.026461202e-02f, +1.278751817e-02f, -1.381693015e-02f, -5.194198196e-02f, -2.972362013e-02f, +1.035103880e-01f, +2.854090410e-01f, +3.717842184e-01f, +2.854090410e-01f, +1.035103880e-01f, -2.972362013e-02f, -5.194198196e-02f, -1.381693015e-02f, +1.278751817e-02f, +1.026461202e-02f, +4.413747039e-04f, -2.043579130e-03f, -5.028328800e-04f,\n    +2.654823367e-05f, -2.048103015e-04f, -3.273891760e-04f, +2.952729392e-04f, +1.265534878e-03f, +7.182289642e-04f, -2.343404695e-03f, -5.554816971e-03f, -4.988355315e-03f, -9.184739889e-05f, +4.888817206e-03f, +5.610692295e-03f, +2.462668262e-03f, -6.579391952e-04f, -1.282487004e-03f, -3.272586910e-04f, +3.214273652e-04f, +2.137723839e-04f, -2.266422450e-05f, -4.246420638e-05f,\n    +2.043579130e-03f, -2.603852842e-03f, -7.295781969e-03f, +1.777626449e-03f, +1.768131754e-02f, +9.370481930e-03f, -2.216869121e-02f, -2.781756318e-02f, +1.047598502e-02f, +3.732936584e-02f, +1.047598502e-02f, -2.781756318e-02f, -2.216869121e-02f, +9.370481930e-03f, +1.768131754e-02f, +1.777626449e-03f, -7.295781969e-03f, -2.603852842e-03f, +1.437219775e-03f, +5.028328800e-04f,\n    -2.654823367e-05f, +2.052721633e-04f, -3.310665577e-06f, -5.210311924e-04f, -2.797446115e-04f, +7.822523602e-04f, +8.773782963e-04f, -6.119124701e-04f, -1.412578692e-03f, -3.077706798e-05f, +1.400145616e-03f, +6.628304558e-04f, -8.490965277e-04f, -8.103982468e-04f, +2.529848066e-04f, +5.306655498e-04f, +1.884155900e-05f, -2.073002217e-04f, -2.970926703e-05f, +4.246420638e-05f,\n    /*  7, 1 (20) */\n    -2.017030896e-03f, +2.365644024e-04f, +9.937222845e-03f, +1.308279111e-02f, -1.255139528e-02f, -5.122375300e-02f, -3.206702483e-02f, +9.795557104e-02f, +2.804206857e-01f, +3.716923710e-01f, +2.902978582e-01f, +1.091210803e-01f, -2.726095187e-02f, -5.259992116e-02f, -1.509941716e-02f, +1.246025947e-02f, +1.058603939e-02f, +6.551470878e-04f, -2.066243355e-03f, -5.452970863e-04f,\n    +3.017266954e-05f, -1.957865608e-04f, -3.325298824e-04f, +2.637867523e-04f, +1.247037532e-03f, +7.757306228e-04f, -2.224462527e-03f, -5.494930663e-03f, -5.083187578e-03f, -2.754502848e-04f, +4.784649184e-03f, +5.662453052e-03f, +2.582120611e-03f, -5.948759102e-04f, -1.297822783e-03f, -3.597015317e-04f, +3.146287443e-04f, +2.226507092e-04f, -1.851937276e-05f, -4.404280889e-05f,\n    +2.017030896e-03f, -2.398580678e-03f, -7.299092635e-03f, +1.256595257e-03f, +1.740157293e-02f, +1.015273429e-02f, -2.129131292e-02f, -2.842947565e-02f, +9.063406332e-03f, +3.729858877e-02f, +1.187613064e-02f, -2.715473272e-02f, -2.301778774e-02f, +8.560083684e-03f, +1.793430235e-02f, +2.308291999e-03f, -7.276940410e-03f, -2.811153063e-03f, +1.407510508e-03f, +5.452970863e-04f,\n    -3.017266954e-05f, +2.028102973e-04f, +1.179701523e-05f, -5.105611064e-04f, -3.054888055e-04f, +7.530520433e-04f, +9.037910865e-04f, -5.602491446e-04f, -1.422484159e-03f, -9.227396912e-05f, +1.385200332e-03f, +7.129021976e-04f, -8.189824236e-04f, -8.374202502e-04f, +2.252474774e-04f, +5.394258599e-04f, +3.477010676e-05f, -2.088760710e-04f, -3.568439400e-05f, +4.404280889e-05f,\n    /*  7, 2 (20) */\n    -1.986858227e-03f, +4.077784161e-05f, +9.604692963e-03f, +1.334657786e-02f, -1.130435774e-02f, -5.044802238e-02f, -3.429148735e-02f, +9.246064038e-02f, +2.753374981e-01f, +3.714169207e-01f, +2.950825074e-01f, +1.147835334e-01f, -2.467883126e-02f, -5.319479707e-02f, -1.639723994e-02f, +1.210055794e-02f, +1.090066813e-02f, +8.777977970e-04f, -2.084762727e-03f, -5.893398952e-04f,\n    +3.353938457e-05f, -1.867226703e-04f, -3.368663100e-04f, +2.328405920e-04f, +1.227066805e-03f, +8.304336728e-04f, -2.105972156e-03f, -5.431140880e-03f, -5.173243944e-03f, -4.587775555e-04f, +4.675932995e-03f, +5.709999753e-03f, +2.701627071e-03f, -5.290578424e-04f, -1.311471924e-03f, -3.925569985e-04f, +3.069787893e-04f, +2.314226199e-04f, -1.411301470e-05f, -4.555837060e-05f,\n    +1.986858227e-03f, -2.195770381e-03f, -7.287295620e-03f, +7.460341506e-04f, +1.709608413e-02f, +1.090578633e-02f, -2.038752183e-02f, -2.898972479e-02f, +7.640922173e-03f, +3.720631480e-02f, +1.326133097e-02f, -2.644183052e-02f, -2.383677016e-02f, +7.722663433e-03f, +1.815954983e-02f, +2.847717859e-03f, -7.242170304e-03f, -3.020029134e-03f, +1.371826114e-03f, +5.893398952e-04f,\n    -3.353938457e-05f, +1.999336602e-04f, +2.645749345e-05f, -4.992947547e-04f, -3.301820368e-04f, +7.228680859e-04f, +9.283023291e-04f, -5.079422657e-04f, -1.429851616e-03f, -1.535992829e-04f, +1.367763221e-03f, +7.620278883e-04f, -7.870766570e-04f, -8.632504201e-04f, +1.965733985e-04f, +5.472750577e-04f, +5.106921368e-05f, -2.099820088e-04f, -4.180480123e-05f, +4.555837060e-05f,\n    /*  7, 3 (20) */\n    -1.953318842e-03f, -1.459448287e-04f, +9.267826653e-03f, +1.357941845e-02f, -1.007729094e-02f, -4.961758870e-02f, -3.639745951e-02f, +8.702949950e-02f, +2.701642542e-01f, +3.709581431e-01f, +2.997584404e-01f, +1.204935331e-01f, -2.197720419e-02f, -5.372385491e-02f, -1.770871186e-02f, +1.170800094e-02f, +1.120764692e-02f, +1.109220417e-03f, -2.098875742e-03f, -6.348982658e-04f,\n    +3.665079142e-05f, -1.776395203e-04f, -3.404163420e-04f, +2.024728833e-04f, +1.205695118e-03f, +8.823316633e-04f, -1.988061608e-03f, -5.363558879e-03f, -5.258460319e-03f, -6.416458677e-04f, +4.562756102e-03f, +5.753237171e-03f, +2.821051081e-03f, -4.605079003e-04f, -1.323365107e-03f, -4.257786731e-04f, +2.984642181e-04f, +2.400649321e-04f, -9.445113488e-06f, -4.700299059e-05f,\n    +1.953318842e-03f, -1.995836721e-03f, -7.260838126e-03f, +2.467393959e-04f, +1.676590209e-02f, +1.162865442e-02f, -1.945921950e-02f, -2.949766706e-02f, +6.211070557e-03f, +3.705271552e-02f, +1.462909419e-02f, -2.567980264e-02f, -2.462384682e-02f, +6.859413013e-03f, +1.835612323e-02f, +3.394992917e-03f, -7.191101090e-03f, -3.230011143e-03f, +1.330021313e-03f, +6.348982658e-04f,\n    -3.665079142e-05f, +1.966618593e-04f, +4.064837437e-05f, -4.872726340e-04f, -3.537917286e-04f, +6.917724485e-04f, +9.508835635e-04f, -4.550942873e-04f, -1.434675664e-03f, -2.146390078e-04f, +1.347859614e-03f, +8.101090303e-04f, -7.534238774e-04f, -8.878224722e-04f, +1.670059789e-04f, +5.541774399e-04f, +6.771028362e-05f, -2.106010952e-04f, -4.805757752e-05f, +4.700299059e-05f,\n    /*  7, 4 (20) */\n    -1.916668051e-03f, -3.235843490e-04f, +8.927410311e-03f, +1.378189133e-02f, -8.871595821e-03f, -4.873525704e-02f, -3.838552112e-02f, +8.166594062e-02f, +2.649057939e-01f, +3.703164973e-01f, +3.043211965e-01f, +1.262467703e-01f, -1.915615311e-02f, -5.418436281e-02f, -1.903207697e-02f, +1.128222227e-02f, +1.150611114e-02f, +1.349285349e-03f, -2.108320856e-03f, -6.819012564e-04f,\n    +3.950983931e-05f, -1.685573558e-04f, -3.431988561e-04f, +1.727199946e-04f, +1.182995347e-03f, +9.314221367e-04f, -1.870856384e-03f, -5.292299490e-03f, -5.338778624e-03f, -8.238724784e-04f, +4.445211600e-03f, +5.792074499e-03f, +2.940254357e-03f, -3.892531985e-04f, -1.333434110e-03f, -4.593182172e-04f, +2.890730509e-04f, +2.485539700e-04f, -4.516279813e-06f, -4.836865338e-05f,\n    +1.916668051e-03f, -1.799174861e-03f, -7.220189752e-03f, -2.405332382e-04f, +1.641211036e-02f, +1.232042687e-02f, -1.850833594e-02f, -2.995276134e-02f, +4.776394893e-03f, +3.683807651e-02f, +1.597695381e-02f, -2.486969360e-02f, -2.537727070e-02f, +5.971590541e-03f, +1.852312920e-02f, +3.949170357e-03f, -7.123390806e-03f, -3.440612238e-03f, +1.281963735e-03f, +6.819012564e-04f,\n    -3.950983931e-05f, +1.930150079e-04f, +5.434888104e-05f, -4.745361639e-04f, -3.762881120e-04f, +6.598380943e-04f, +9.715104632e-04f, -4.018081145e-04f, -1.436955911e-03f, -2.752797265e-04f, +1.325519754e-03f, +8.570486475e-04f, -7.180726487e-04f, -9.110719496e-04f, +1.365912017e-04f, +5.600987715e-04f, +8.466325981e-05f, -2.107172154e-04f, -5.442903877e-05f, +4.836865338e-05f,\n    /*  7, 5 (20) */\n    -1.877158212e-03f, -4.921417048e-04f, +8.584211455e-03f, +1.395461133e-02f, -7.688600474e-03f, -4.780383490e-02f, -4.025637750e-02f, +7.637364113e-02f, +2.595670152e-01f, +3.694926248e-01f, +3.087664081e-01f, +1.320388448e-01f, -1.621589875e-02f, -5.457361601e-02f, -2.036551108e-02f, +1.082290405e-02f, +1.179518419e-02f, +1.597839319e-03f, -2.112837135e-03f, -7.302699098e-04f,\n    +4.211998972e-05f, -1.594957521e-04f, -3.452336613e-04f, +1.436162238e-04f, +1.159040700e-03f, +9.777065690e-04f, -1.754479317e-03f, -5.217480927e-03f, -5.414146844e-03f, -1.005275483e-03f, +4.323398105e-03f, +5.826425508e-03f, +3.059097074e-03f, -3.153250819e-04f, -1.341611938e-03f, -4.931254120e-04f, +2.787946686e-04f, +2.568656035e-04f, +6.722085081e-07f, -4.964724711e-05f,\n    +1.877158212e-03f, -1.606159853e-03f, -7.165840871e-03f, -7.150694020e-04f, +1.603582225e-02f, +1.298026496e-02f, -1.753682547e-02f, -3.035456946e-02f, +3.339438982e-03f, +3.656279679e-02f, +1.730247356e-02f, -2.401264496e-02f, -2.609534335e-02f, +5.060518591e-03f, +1.865972041e-02f, +4.509269128e-03f, -7.038727546e-03f, -3.651329454e-03f, +1.227534696e-03f, +7.302699098e-04f,\n    -4.211998972e-05f, +1.890136608e-04f, +6.753987228e-05f, -4.611275748e-04f, -3.976442523e-04f, +6.271388219e-04f, +9.901628520e-04f, -3.481868894e-04f, -1.436696948e-03f, -3.354088381e-04f, +1.300778745e-03f, +9.027514936e-04f, -6.810753783e-04f, -9.329363822e-04f, +1.053775565e-04f, +5.650063904e-04f, +1.018966696e-04f, -2.103151419e-04f, -6.090474729e-05f, +4.964724711e-05f,\n    /*  7, 6 (20) */\n    -1.835038222e-03f, -6.516374570e-04f, +8.238977793e-03f, +1.409822755e-02f, -6.529559773e-03f, -4.682612834e-02f, -4.201085682e-02f, +7.115616020e-02f, +2.541528684e-01f, +3.684873493e-01f, +3.130898062e-01f, +1.378652703e-01f, -1.315680168e-02f, -5.488894109e-02f, -2.170712302e-02f, +1.032977864e-02f, +1.207397886e-02f, +1.854704923e-03f, -2.112164927e-03f, -7.799171569e-04f,\n    +4.448519162e-05f, -1.504735926e-04f, -3.465414342e-04f, +1.151937864e-04f, +1.133904594e-03f, +1.021190305e-03f, -1.639050427e-03f, -5.139224605e-03f, -5.484519075e-03f, -1.185674053e-03f, +4.197419649e-03f, +5.856208695e-03f, +3.177438036e-03f, -2.387591440e-04f, -1.347832958e-03f, -5.271482026e-04f, +2.676198699e-04f, +2.649752862e-04f, +6.118387923e-06f, -5.083058236e-05f,\n    +1.835038222e-03f, -1.417146193e-03f, -7.098300999e-03f, -1.176196977e-03f, +1.563817800e-02f, +1.360740378e-02f, -1.654666262e-02f, -3.070275635e-02f, +1.902742034e-03f, +3.622738795e-02f, +1.860325231e-02f, -2.310989346e-02f, -2.677641873e-02f, +4.127582209e-03f, +1.876509796e-02f, +5.074275519e-03f, -6.936830877e-03f, -3.861644596e-03f, +1.166629949e-03f, +7.799171569e-04f,\n    -4.448519162e-05f, +1.846787500e-04f, +8.020385627e-05f, -4.470897965e-04f, -4.178360684e-04f, +5.937490967e-04f, +1.006824711e-03f, -2.943337751e-04f, -1.433908334e-03f, -3.949147877e-04f, +1.273676493e-03f, +9.471242589e-04f, -6.424882360e-04f, -9.533554423e-04f, +7.341596628e-05f, +5.688693095e-04f, +1.193776738e-04f, -2.093805949e-04f, -6.746953387e-05f, +5.083058236e-05f,\n    /*  7, 7 (20) */\n    -1.790553030e-03f, -8.021110495e-04f, +7.892436359e-03f, +1.421342134e-02f, -5.395655180e-03f, -4.580493803e-02f, -4.364990725e-02f, +6.601693560e-02f, +2.486683493e-01f, +3.673016753e-01f, +3.172872259e-01f, +1.437214790e-01f, -9.979363640e-03f, -5.512770024e-02f, -2.305495598e-02f, +9.802630440e-03f, +1.234159873e-02f, +2.119680209e-03f, -2.106046539e-03f, -8.307477393e-04f,\n    +4.660985620e-05f, -1.415090478e-04f, -3.471436552e-04f, +8.748280951e-05f, +1.107660528e-03f, +1.061882486e-03f, -1.524686796e-03f, -5.057654947e-03f, -5.549855554e-03f, -1.364888672e-03f, +4.067385554e-03f, +5.881347427e-03f, +3.295134865e-03f, -1.595952382e-04f, -1.352033024e-03f, -5.613327454e-04f, +2.555409276e-04f, +2.728580963e-04f, +1.181959165e-05f, -5.191041191e-05f,\n    +1.790553030e-03f, -1.232467443e-03f, -7.018097142e-03f, -1.623286773e-03f, +1.522034193e-02f, +1.420115288e-02f, -1.553983791e-02f, -3.099709012e-02f, +4.688337005e-04f, +3.583247316e-02f, +1.987692880e-02f, -2.216276920e-02f, -2.741890696e-02f, +3.174226767e-03f, +1.883851393e-02f, +5.643144828e-03f, -6.817453203e-03f, -4.071025190e-03f, +1.099160415e-03f, +8.307477393e-04f,\n    -4.660985620e-05f, +1.800315206e-04f, +9.232499980e-05f, -4.324663462e-04f, -4.368423451e-04f, +5.597438829e-04f, +1.021484178e-03f, -2.403517431e-04f, -1.428604554e-03f, -4.536872945e-04f, +1.244257631e-03f, +9.900757732e-04f, -6.023710661e-04f, -9.722710983e-04f, +4.075970651e-05f, +5.716583171e-04f, +1.370721197e-04f, -2.079003019e-04f, -7.410752232e-05f, +5.191041191e-05f,\n    /*  7, 8 (20) */\n    -1.743943174e-03f, -9.436200974e-04f, +7.545292704e-03f, +1.430090415e-02f, -4.287994652e-03f, -4.474305555e-02f, -4.517459404e-02f, +6.095928065e-02f, +2.431184938e-01f, +3.659367866e-01f, +3.213546114e-01f, +1.496028264e-01f, -6.684228775e-03f, -5.528729548e-02f, -2.440698900e-02f, +9.241297694e-03f, +1.259713966e-02f, +2.392538305e-03f, -2.094226947e-03f, -8.826581512e-04f,\n    +4.849883127e-05f, -1.326195579e-04f, -3.470625443e-04f, +6.051132815e-05f, +1.080381970e-03f, +1.099795979e-03f, -1.411502428e-03f, -4.972899193e-03f, -5.610122683e-03f, -1.542741369e-03f, +3.933410313e-03f, +5.901770077e-03f, +3.412044185e-03f, -7.787748289e-05f, -1.354149613e-03f, -5.956234609e-04f, +2.425516429e-04f, +2.804887793e-04f, +1.777243331e-05f, -5.287845114e-05f,\n    +1.743943174e-03f, -1.052435922e-03f, -6.925772142e-03f, -2.055753119e-03f, +1.478349958e-02f, +1.476089676e-02f, -1.451835373e-02f, -3.123744187e-02f, -9.597708539e-04f, +3.537878587e-02f, +2.112118643e-02f, -2.117269343e-02f, -2.802127803e-02f, +2.201955669e-03f, +1.887927364e-02f, +6.214803145e-03f, -6.680381083e-03f, -4.278925492e-03f, +1.025052893e-03f, +8.826581512e-04f,\n    -4.849883127e-05f, +1.750934673e-04f, +1.038891331e-04f, -4.173012173e-04f, -4.546447394e-04f, +5.251984770e-04f, +1.034133532e-03f, -1.863433608e-04f, -1.420804980e-03f, -5.116175765e-04f, +1.212571443e-03f, +1.031517205e-03f, -5.607872884e-04f, -9.896277631e-04f, +7.464318658e-06f, +5.733460737e-04f, +1.549445993e-04f, -2.058620556e-04f, -8.080215677e-05f, +5.287845114e-05f,\n    /*  7, 9 (20) */\n    -1.695444343e-03f, -1.076239655e-03f, +7.198230160e-03f, +1.436141548e-02f, -3.207612682e-03f, -4.364325957e-02f, -4.658609647e-02f, +5.598638146e-02f, +2.375083711e-01f, +3.643940452e-01f, +3.252880217e-01f, +1.555045965e-01f, -3.272184590e-03f, -5.536517296e-02f, -2.576113861e-02f, +8.645674233e-03f, +1.283969130e-02f, +2.673027084e-03f, -2.076454514e-03f, -9.355366023e-04f,\n    +5.015737533e-05f, -1.238218155e-04f, -3.463209978e-04f, +3.430528633e-05f, +1.052142236e-03f, +1.134947292e-03f, -1.299608136e-03f, -4.885087205e-03f, -5.665293048e-03f, -1.719055951e-03f, +3.795613445e-03f, +5.917410157e-03f, +3.528021810e-03f, +6.345740225e-06f, -1.354121950e-03f, -6.299630894e-04f, +2.286473977e-04f, +2.878417919e-04f, +2.397279188e-05f, -5.372639922e-05f,\n    +1.695444343e-03f, -8.773424549e-04f, -6.821883009e-03f, -2.473054337e-03f, +1.432885484e-02f, +1.528609524e-02f, -1.348422020e-02f, -3.142378523e-02f, -2.380575833e-03f, +3.486716829e-02f, +2.233375787e-02f, -2.014117623e-02f, -2.858206532e-02f, +1.212327906e-03f, +1.888673795e-02f, +6.788149219e-03f, -6.525436484e-03f, -4.484787548e-03f, +9.442507362e-04f, +9.355366023e-04f,\n    -5.015737533e-05f, +1.698862713e-04f, +1.148837505e-04f, -4.016387687e-04f, -4.712277792e-04f, +4.901883411e-04f, +1.044769181e-03f, -1.324105813e-04f, -1.410533806e-03f, -5.685985728e-04f, +1.178671770e-03f, +1.071362258e-03f, -5.178037930e-04f, -1.005372440e-03f, -2.641248286e-05f, +5.739072067e-04f, +1.729585111e-04f, -2.032547702e-04f, -8.753623134e-05f, +5.372639922e-05f,\n    /*  7,10 (20) */\n    -1.645286968e-03f, -1.200061471e-03f, +6.851909162e-03f, +1.439572076e-02f, -2.155470446e-03f, -4.250831227e-02f, -4.788570461e-02f, +5.110129425e-02f, +2.318430780e-01f, +3.626749893e-01f, +3.290836352e-01f, +1.614220066e-01f, +2.558372196e-04f, -5.535882722e-02f, -2.711526056e-02f, +8.015711144e-03f, +1.306833870e-02f, +2.960868876e-03f, -2.052481722e-03f, -9.892630015e-04f,\n    +5.159113137e-05f, -1.151317525e-04f, -3.449425240e-04f, +8.888541570e-06f, +1.023014376e-03f, +1.167356490e-03f, -1.189111422e-03f, -4.794351262e-03f, -5.715345420e-03f, -1.893658228e-03f, +3.654119363e-03f, +5.928206438e-03f, +3.642922938e-03f, +9.302179430e-05f, -1.351891138e-03f, -6.642927522e-04f, +2.138252061e-04f, +2.948913485e-04f, +3.041579779e-05f, -5.444596092e-05f,\n    +1.645286968e-03f, -7.074561836e-04f, -6.706999259e-03f, -2.874693105e-03f, +1.385762706e-02f, +1.577628358e-02f, -1.243945102e-02f, -3.155619581e-02f, -3.791109640e-03f, +3.429856972e-02f, +2.351242964e-02f, -1.906981397e-02f, -2.909986911e-02f, +2.069554655e-04f, +1.886032547e-02f, +7.362056426e-03f, -6.352477973e-03f, -4.688042318e-03f, +8.567145049e-04f, +9.892630015e-04f,\n    -5.159113137e-05f, +1.644317385e-04f, +1.252980066e-04f, -3.855236147e-04f, -4.865788560e-04f, +4.547889381e-04f, +1.053391624e-03f, -7.865453639e-05f, -1.397819994e-03f, -6.245251606e-04f, +1.142616908e-03f, +1.109527359e-03f, -4.734908251e-04f, -1.019454864e-03f, -6.081090988e-05f, +5.733184009e-04f, +1.910761257e-04f, -2.000685362e-04f, -9.429192253e-05f, +5.444596092e-05f,\n    /*  7,11 (20) */\n    -1.593695836e-03f, -1.315193223e-03f, +6.506966638e-03f, +1.440460930e-02f, -1.132456070e-03f, -4.134095578e-02f, -4.907481603e-02f, +4.630694299e-02f, +2.261277326e-01f, +3.607813310e-01f, +3.327377545e-01f, +1.673502131e-01f, +3.898760157e-03f, -5.526580542e-02f, -2.846715170e-02f, +7.351418392e-03f, +1.328216390e-02f, +3.255760225e-03f, -2.022065924e-03f, -1.043708962e-03f,\n    +5.280610052e-05f, -1.065645271e-04f, -3.429511805e-04f, -1.571712687e-05f, +9.930710598e-04f, +1.197047109e-03f, -1.080116366e-03f, -4.700825868e-03f, -5.760264760e-03f, -2.066376244e-03f, +3.509057213e-03f, +5.934103073e-03f, +3.756602344e-03f, +1.820938026e-04f, -1.347400287e-03f, -6.985520155e-04f, +1.980837627e-04f, +3.016114691e-04f, +3.709582054e-05f, -5.502886915e-05f,\n    +1.593695836e-03f, -5.430244451e-04f, -6.581701252e-03f, -3.260216720e-03f, +1.337104821e-02f, +1.623107252e-02f, -1.138605940e-02f, -3.163485035e-02f, -5.188929633e-03f, +3.367404456e-02f, +2.465504655e-02f, -1.796028661e-02f, -2.957335993e-02f, -8.124993983e-04f, +1.879951456e-02f, +7.935374826e-03f, -6.161401847e-03f, -4.888110854e-03f, +7.624225823e-04f, +1.043708962e-03f,\n    -5.280610052e-05f, +1.587517383e-04f, +1.351227089e-04f, -3.690005166e-04f, -5.006882110e-04f, +4.190755693e-04f, +1.060005420e-03f, -2.517533160e-05f, -1.382697186e-03f, -6.792943695e-04f, +1.104469498e-03f, +1.145931847e-03f, -4.279218625e-04f, -1.031827635e-03f, -9.566920556e-05f, +5.715584861e-04f, +2.092586564e-04f, -1.962946724e-04f, -1.010508240e-04f, +5.502886915e-05f,\n    /*  7,12 (20) */\n    -1.540889736e-03f, -1.421757750e-03f, +6.164015457e-03f, +1.438889218e-02f, -1.393850104e-04f, -4.014390868e-02f, -5.015493239e-02f, +4.160611712e-02f, +2.203674679e-01f, +3.587149548e-01f, +3.362468117e-01f, +1.732843162e-01f, +7.655362501e-03f, -5.508371162e-02f, -2.981455199e-02f, +6.652866376e-03f, +1.348024766e-02f, +3.557371694e-03f, -1.984970104e-03f, -1.098737832e-03f,\n    +5.380861561e-05f, -9.813451419e-05f, -3.403715108e-04f, -3.949200614e-05f, +9.623844684e-04f, +1.224046059e-03f, -9.727235245e-04f, -4.604647544e-03f, -5.800042201e-03f, -2.237040496e-03f, +3.360560727e-03f, +5.935049702e-03f, +3.868914579e-03f, +2.735006702e-04f, -1.340594641e-03f, -7.326789593e-04f, +1.814234896e-04f, +3.079760284e-04f, +4.400645762e-05f, -5.546690801e-05f,\n    +1.540889736e-03f, -3.842727068e-04f, -6.446578543e-03f, -3.629217237e-03f, +1.287036000e-02f, +1.665014809e-02f, -1.032605398e-02f, -3.166002568e-02f, -6.571626820e-03f, +3.299475019e-02f, +2.575951605e-02f, -1.681435476e-02f, -3.000128180e-02f, -1.844327034e-03f, +1.870384536e-02f, +8.506933313e-03f, -5.952143191e-03f, -5.084405527e-03f, +6.613717584e-04f, +1.098737832e-03f,\n    -5.380861561e-05f, +1.528681437e-04f, +1.443503056e-04f, -3.521142755e-04f, -5.135489144e-04f, +3.831232131e-04f, +1.064619140e-03f, +2.792815481e-05f, -1.365203629e-03f, -7.328055899e-04f, +1.064296405e-03f, +1.180498150e-03f, -3.811734851e-04f, -1.042446355e-03f, -1.309237554e-04f, +5.686085208e-04f, +2.274663326e-04f, -1.919257767e-04f, -1.077939837e-04f, +5.546690801e-05f,\n    /*  7,13 (20) */\n    -1.487081120e-03f, -1.519892264e-03f, +5.823643947e-03f, +1.434940017e-02f, +8.229994580e-04f, -3.891986262e-02f, -5.112765592e-02f, +3.700146958e-02f, +2.145674257e-01f, +3.564779143e-01f, +3.396073725e-01f, +1.792193659e-01f, +1.152427708e-02f, -5.481021095e-02f, -3.115514663e-02f, +5.920187417e-03f, +1.366167115e-02f, +3.865347722e-03f, -1.940963646e-03f, -1.154204740e-03f,\n    +5.460531467e-05f, -8.985529698e-05f, -3.372284827e-04f, -6.241843442e-05f, +9.310261863e-04f, +1.248383529e-03f, -8.670298343e-04f, -4.505954627e-03f, -5.834675030e-03f, -2.405484152e-03f, +3.208768052e-03f, +5.931001556e-03f, +3.979714171e-03f, +3.671771130e-04f, -1.331421700e-03f, -7.666102496e-04f, +1.638465809e-04f, +3.139588071e-04f, +5.114052502e-05f, -5.575193650e-05f,\n    +1.487081120e-03f, -2.314045631e-04f, -6.302228238e-03f, -3.981331512e-03f, +1.235681108e-02f, +1.703327130e-02f, -9.261434836e-03f, -3.163209752e-02f, -7.936830448e-03f, +3.226194460e-02f, +2.682381246e-02f, -1.563385661e-02f, -3.038245528e-02f, -2.886773388e-03f, +1.857292160e-02f, +9.075541833e-03f, -5.724676858e-03f, -5.276331304e-03f, +5.535777746e-04f, +1.154204740e-03f,\n    -5.460531467e-05f, +1.468027723e-04f, +1.529748702e-04f, -3.349096262e-04f, -5.251568388e-04f, +3.470063668e-04f, +1.067245309e-03f, +8.055846923e-05f, -1.345382071e-03f, -7.849607770e-04f, +1.022168591e-03f, +1.213151962e-03f, -3.333252362e-04f, -1.051269745e-03f, -1.665092036e-04f, +5.644518714e-04f, +2.456584776e-04f, -1.869557736e-04f, -1.145019438e-04f, +5.575193650e-05f,\n    /*  7,14 (20) */\n    -1.432475805e-03f, -1.609747561e-03f, +5.486415464e-03f, +1.428698174e-02f, +1.754025644e-03f, -3.767147909e-02f, -5.199468575e-02f, +3.249551495e-02f, +2.087327506e-01f, +3.540724301e-01f, +3.428161405e-01f, +1.851503674e-01f, +1.550399125e-02f, -5.444303384e-02f, -3.248656833e-02f, +5.153577167e-03f, +1.382551773e-02f, +4.179306529e-03f, -1.889823121e-03f, -1.209956676e-03f,\n    +5.520311442e-05f, -8.173966085e-05f, -3.335474258e-04f, -8.448078218e-05f, +8.990670975e-04f, +1.270092884e-03f, -7.631285195e-04f, -4.404887064e-03f, -5.864166663e-03f, -2.571543266e-03f, +3.053821581e-03f, +5.921919554e-03f, +4.088855821e-03f, +4.630536933e-04f, -1.319831346e-03f, -8.002812150e-04f, +1.453570448e-04f, +3.195335445e-04f, +5.849004917e-05f, -5.587591266e-05f,\n    +1.432475805e-03f, -8.460179078e-05f, -6.149253368e-03f, -4.316241138e-03f, +1.183165424e-02f, +1.738027767e-02f, -8.194189527e-03f, -3.155153905e-02f, -9.282212520e-03f, +3.147698382e-02f, +2.784598105e-02f, -1.442070465e-02f, -3.071578052e-02f, -3.938043134e-03f, +1.840641240e-02f, +9.639993705e-03f, -5.479018381e-03f, -5.463287077e-03f, +4.390758309e-04f, +1.209956676e-03f,\n    -5.520311442e-05f, +1.405773297e-04f, +1.609920818e-04f, -3.174311340e-04f, -5.355106268e-04f, +3.107988913e-04f, +1.067900350e-03f, +1.326197758e-04f, -1.323279664e-03f, -8.356646486e-04f, +9.781609726e-04f, +1.243822410e-03f, -2.844594777e-04f, -1.058259774e-03f, -2.023585751e-04f, +5.590742877e-04f, +2.637935894e-04f, -1.813799598e-04f, -1.211547821e-04f, +5.587591266e-05f,\n    /*  7,15 (20) */\n    -1.377272691e-03f, -1.691487222e-03f, +5.152868038e-03f, +1.420250095e-02f, +2.653092742e-03f, -3.640138620e-02f, -5.275781427e-02f, +2.809062789e-02f, +2.028685840e-01f, +3.515008869e-01f, +3.458699621e-01f, +1.910722870e-01f, +1.959284707e-02f, -5.397998014e-02f, -3.380639968e-02f, +4.353295952e-03f, +1.397087478e-02f, +4.498840074e-03f, -1.831333072e-03f, -1.265832589e-03f,\n    +5.560918391e-05f, -7.379958910e-05f, -3.293539716e-04f, -1.056654301e-04f, +8.665772837e-04f, +1.289210562e-03f, -6.611090096e-04f, -4.301586208e-03f, -5.888526601e-03f, -2.735056991e-03f, +2.895867777e-03f, +5.907770388e-03f, +4.196194611e-03f, +5.610568623e-04f, -1.305775965e-03f, -8.336259270e-04f, +1.259607436e-04f, +3.246739927e-04f, +6.604626058e-05f, -5.583091827e-05f,\n    +1.377272691e-03f, +5.597553889e-05f, -5.988261286e-03f, -4.633672272e-03f, +1.129614362e-02f, +1.769107656e-02f, -7.126289177e-03f, -3.141891928e-02f, -1.060549218e-02f, +3.064131917e-02f, +2.882414202e-02f, -1.317688224e-02f, -3.100024000e-02f, -4.996302908e-03f, +1.820405382e-02f, +1.019906799e-02f, -5.215224791e-03f, -5.644667037e-03f, +3.179210487e-04f, +1.265832589e-03f,\n    -5.560918391e-05f, +1.342133529e-04f, +1.683992018e-04f, -2.997230928e-04f, -5.446116517e-04f, +2.745738586e-04f, +1.066604505e-03f, +1.840180448e-04f, -1.298947844e-03f, -8.848248770e-04f, +9.323522747e-04f, +1.272442214e-03f, -2.346612363e-04f, -1.063381764e-03f, -2.384034027e-04f, +5.524639733e-04f, +2.818294260e-04f, -1.751950471e-04f, -1.277321569e-04f, +5.583091827e-05f,\n    /*  7,16 (20) */\n    -1.321663507e-03f, -1.765286811e-03f, +4.823514067e-03f, +1.409683552e-02f, +3.519670025e-03f, -3.511217564e-02f, -5.341892328e-02f, +2.378904168e-02f, +1.969800574e-01f, +3.487658299e-01f, +3.487658299e-01f, +1.969800574e-01f, +2.378904168e-02f, -5.341892328e-02f, -3.511217564e-02f, +3.519670025e-03f, +1.409683552e-02f, +4.823514067e-03f, -1.765286811e-03f, -1.321663507e-03f,\n    +5.583091827e-05f, -6.604626058e-05f, -3.246739927e-04f, -1.259607436e-04f, +8.336259270e-04f, +1.305775965e-03f, -5.610568623e-04f, -4.196194611e-03f, -5.907770388e-03f, -2.895867777e-03f, +2.735056991e-03f, +5.888526601e-03f, +4.301586208e-03f, +6.611090096e-04f, -1.289210562e-03f, -8.665772837e-04f, +1.056654301e-04f, +3.293539716e-04f, +7.379958910e-05f, -5.560918391e-05f,\n    +1.321663507e-03f, +1.901888918e-04f, -5.819862084e-03f, -4.933395365e-03f, +1.075153197e-02f, +1.796565042e-02f, -6.059684672e-03f, -3.123490123e-02f, -1.190444003e-02f, +2.975649429e-02f, +2.975649429e-02f, -1.190444003e-02f, -3.123490123e-02f, -6.059684672e-03f, +1.796565042e-02f, +1.075153197e-02f, -4.933395365e-03f, -5.819862084e-03f, +1.901888918e-04f, +1.321663507e-03f,\n    -5.583091827e-05f, +1.277321569e-04f, +1.751950471e-04f, -2.818294260e-04f, -5.524639733e-04f, +2.384034027e-04f, +1.063381764e-03f, +2.346612363e-04f, -1.272442214e-03f, -9.323522747e-04f, +8.848248770e-04f, +1.298947844e-03f, -1.840180448e-04f, -1.066604505e-03f, -2.745738586e-04f, +5.446116517e-04f, +2.997230928e-04f, -1.683992018e-04f, -1.342133529e-04f, +5.560918391e-05f,\n    /*  7,17 (20) */\n    -1.265832589e-03f, -1.831333072e-03f, +4.498840074e-03f, +1.397087478e-02f, +4.353295952e-03f, -3.380639968e-02f, -5.397998014e-02f, +1.959284707e-02f, +1.910722870e-01f, +3.458699621e-01f, +3.515008869e-01f, +2.028685840e-01f, +2.809062789e-02f, -5.275781427e-02f, -3.640138620e-02f, +2.653092742e-03f, +1.420250095e-02f, +5.152868038e-03f, -1.691487222e-03f, -1.377272691e-03f,\n    +5.587591266e-05f, -5.849004917e-05f, -3.195335445e-04f, -1.453570448e-04f, +8.002812150e-04f, +1.319831346e-03f, -4.630536933e-04f, -4.088855821e-03f, -5.921919554e-03f, -3.053821581e-03f, +2.571543266e-03f, +5.864166663e-03f, +4.404887064e-03f, +7.631285195e-04f, -1.270092884e-03f, -8.990670975e-04f, +8.448078218e-05f, +3.335474258e-04f, +8.173966085e-05f, -5.520311442e-05f,\n    +1.265832589e-03f, +3.179210487e-04f, -5.644667037e-03f, -5.215224791e-03f, +1.019906799e-02f, +1.820405382e-02f, -4.996302908e-03f, -3.100024000e-02f, -1.317688224e-02f, +2.882414202e-02f, +3.064131917e-02f, -1.060549218e-02f, -3.141891928e-02f, -7.126289177e-03f, +1.769107656e-02f, +1.129614362e-02f, -4.633672272e-03f, -5.988261286e-03f, +5.597553889e-05f, +1.377272691e-03f,\n    -5.587591266e-05f, +1.211547821e-04f, +1.813799598e-04f, -2.637935894e-04f, -5.590742877e-04f, +2.023585751e-04f, +1.058259774e-03f, +2.844594777e-04f, -1.243822410e-03f, -9.781609726e-04f, +8.356646486e-04f, +1.323279664e-03f, -1.326197758e-04f, -1.067900350e-03f, -3.107988913e-04f, +5.355106268e-04f, +3.174311340e-04f, -1.609920818e-04f, -1.405773297e-04f, +5.520311442e-05f,\n    /*  7,18 (20) */\n    -1.209956676e-03f, -1.889823121e-03f, +4.179306529e-03f, +1.382551773e-02f, +5.153577167e-03f, -3.248656833e-02f, -5.444303384e-02f, +1.550399125e-02f, +1.851503674e-01f, +3.428161405e-01f, +3.540724301e-01f, +2.087327506e-01f, +3.249551495e-02f, -5.199468575e-02f, -3.767147909e-02f, +1.754025644e-03f, +1.428698174e-02f, +5.486415464e-03f, -1.609747561e-03f, -1.432475805e-03f,\n    +5.575193650e-05f, -5.114052502e-05f, -3.139588071e-04f, -1.638465809e-04f, +7.666102496e-04f, +1.331421700e-03f, -3.671771130e-04f, -3.979714171e-03f, -5.931001556e-03f, -3.208768052e-03f, +2.405484152e-03f, +5.834675030e-03f, +4.505954627e-03f, +8.670298343e-04f, -1.248383529e-03f, -9.310261863e-04f, +6.241843442e-05f, +3.372284827e-04f, +8.985529698e-05f, -5.460531467e-05f,\n    +1.209956676e-03f, +4.390758309e-04f, -5.463287077e-03f, -5.479018381e-03f, +9.639993705e-03f, +1.840641240e-02f, -3.938043134e-03f, -3.071578052e-02f, -1.442070465e-02f, +2.784598105e-02f, +3.147698382e-02f, -9.282212520e-03f, -3.155153905e-02f, -8.194189527e-03f, +1.738027767e-02f, +1.183165424e-02f, -4.316241138e-03f, -6.149253368e-03f, -8.460179078e-05f, +1.432475805e-03f,\n    -5.575193650e-05f, +1.145019438e-04f, +1.869557736e-04f, -2.456584776e-04f, -5.644518714e-04f, +1.665092036e-04f, +1.051269745e-03f, +3.333252362e-04f, -1.213151962e-03f, -1.022168591e-03f, +7.849607770e-04f, +1.345382071e-03f, -8.055846923e-05f, -1.067245309e-03f, -3.470063668e-04f, +5.251568388e-04f, +3.349096262e-04f, -1.529748702e-04f, -1.468027723e-04f, +5.460531467e-05f,\n    /*  7,19 (20) */\n    -1.154204740e-03f, -1.940963646e-03f, +3.865347722e-03f, +1.366167115e-02f, +5.920187417e-03f, -3.115514663e-02f, -5.481021095e-02f, +1.152427708e-02f, +1.792193659e-01f, +3.396073725e-01f, +3.564779143e-01f, +2.145674257e-01f, +3.700146958e-02f, -5.112765592e-02f, -3.891986262e-02f, +8.229994580e-04f, +1.434940017e-02f, +5.823643947e-03f, -1.519892264e-03f, -1.487081120e-03f,\n    +5.546690801e-05f, -4.400645762e-05f, -3.079760284e-04f, -1.814234896e-04f, +7.326789593e-04f, +1.340594641e-03f, -2.735006702e-04f, -3.868914579e-03f, -5.935049702e-03f, -3.360560727e-03f, +2.237040496e-03f, +5.800042201e-03f, +4.604647544e-03f, +9.727235245e-04f, -1.224046059e-03f, -9.623844684e-04f, +3.949200614e-05f, +3.403715108e-04f, +9.813451419e-05f, -5.380861561e-05f,\n    +1.154204740e-03f, +5.535777746e-04f, -5.276331304e-03f, -5.724676858e-03f, +9.075541833e-03f, +1.857292160e-02f, -2.886773388e-03f, -3.038245528e-02f, -1.563385661e-02f, +2.682381246e-02f, +3.226194460e-02f, -7.936830448e-03f, -3.163209752e-02f, -9.261434836e-03f, +1.703327130e-02f, +1.235681108e-02f, -3.981331512e-03f, -6.302228238e-03f, -2.314045631e-04f, +1.487081120e-03f,\n    -5.546690801e-05f, +1.077939837e-04f, +1.919257767e-04f, -2.274663326e-04f, -5.686085208e-04f, +1.309237554e-04f, +1.042446355e-03f, +3.811734851e-04f, -1.180498150e-03f, -1.064296405e-03f, +7.328055899e-04f, +1.365203629e-03f, -2.792815481e-05f, -1.064619140e-03f, -3.831232131e-04f, +5.135489144e-04f, +3.521142755e-04f, -1.443503056e-04f, -1.528681437e-04f, +5.380861561e-05f,\n    /*  7,20 (20) */\n    -1.098737832e-03f, -1.984970104e-03f, +3.557371694e-03f, +1.348024766e-02f, +6.652866376e-03f, -2.981455199e-02f, -5.508371162e-02f, +7.655362501e-03f, +1.732843162e-01f, +3.362468117e-01f, +3.587149548e-01f, +2.203674679e-01f, +4.160611712e-02f, -5.015493239e-02f, -4.014390868e-02f, -1.393850104e-04f, +1.438889218e-02f, +6.164015457e-03f, -1.421757750e-03f, -1.540889736e-03f,\n    +5.502886915e-05f, -3.709582054e-05f, -3.016114691e-04f, -1.980837627e-04f, +6.985520155e-04f, +1.347400287e-03f, -1.820938026e-04f, -3.756602344e-03f, -5.934103073e-03f, -3.509057213e-03f, +2.066376244e-03f, +5.760264760e-03f, +4.700825868e-03f, +1.080116366e-03f, -1.197047109e-03f, -9.930710598e-04f, +1.571712687e-05f, +3.429511805e-04f, +1.065645271e-04f, -5.280610052e-05f,\n    +1.098737832e-03f, +6.613717584e-04f, -5.084405527e-03f, -5.952143191e-03f, +8.506933313e-03f, +1.870384536e-02f, -1.844327034e-03f, -3.000128180e-02f, -1.681435476e-02f, +2.575951605e-02f, +3.299475019e-02f, -6.571626820e-03f, -3.166002568e-02f, -1.032605398e-02f, +1.665014809e-02f, +1.287036000e-02f, -3.629217237e-03f, -6.446578543e-03f, -3.842727068e-04f, +1.540889736e-03f,\n    -5.502886915e-05f, +1.010508240e-04f, +1.962946724e-04f, -2.092586564e-04f, -5.715584861e-04f, +9.566920556e-05f, +1.031827635e-03f, +4.279218625e-04f, -1.145931847e-03f, -1.104469498e-03f, +6.792943695e-04f, +1.382697186e-03f, +2.517533160e-05f, -1.060005420e-03f, -4.190755693e-04f, +5.006882110e-04f, +3.690005166e-04f, -1.351227089e-04f, -1.587517383e-04f, +5.280610052e-05f,\n    /*  7,21 (20) */\n    -1.043708962e-03f, -2.022065924e-03f, +3.255760225e-03f, +1.328216390e-02f, +7.351418392e-03f, -2.846715170e-02f, -5.526580542e-02f, +3.898760157e-03f, +1.673502131e-01f, +3.327377545e-01f, +3.607813310e-01f, +2.261277326e-01f, +4.630694299e-02f, -4.907481603e-02f, -4.134095578e-02f, -1.132456070e-03f, +1.440460930e-02f, +6.506966638e-03f, -1.315193223e-03f, -1.593695836e-03f,\n    +5.444596092e-05f, -3.041579779e-05f, -2.948913485e-04f, -2.138252061e-04f, +6.642927522e-04f, +1.351891138e-03f, -9.302179430e-05f, -3.642922938e-03f, -5.928206438e-03f, -3.654119363e-03f, +1.893658228e-03f, +5.715345420e-03f, +4.794351262e-03f, +1.189111422e-03f, -1.167356490e-03f, -1.023014376e-03f, -8.888541570e-06f, +3.449425240e-04f, +1.151317525e-04f, -5.159113137e-05f,\n    +1.043708962e-03f, +7.624225823e-04f, -4.888110854e-03f, -6.161401847e-03f, +7.935374826e-03f, +1.879951456e-02f, -8.124993983e-04f, -2.957335993e-02f, -1.796028661e-02f, +2.465504655e-02f, +3.367404456e-02f, -5.188929633e-03f, -3.163485035e-02f, -1.138605940e-02f, +1.623107252e-02f, +1.337104821e-02f, -3.260216720e-03f, -6.581701252e-03f, -5.430244451e-04f, +1.593695836e-03f,\n    -5.444596092e-05f, +9.429192253e-05f, +2.000685362e-04f, -1.910761257e-04f, -5.733184009e-04f, +6.081090988e-05f, +1.019454864e-03f, +4.734908251e-04f, -1.109527359e-03f, -1.142616908e-03f, +6.245251606e-04f, +1.397819994e-03f, +7.865453639e-05f, -1.053391624e-03f, -4.547889381e-04f, +4.865788560e-04f, +3.855236147e-04f, -1.252980066e-04f, -1.644317385e-04f, +5.159113137e-05f,\n    /*  7,22 (20) */\n    -9.892630015e-04f, -2.052481722e-03f, +2.960868876e-03f, +1.306833870e-02f, +8.015711144e-03f, -2.711526056e-02f, -5.535882722e-02f, +2.558372196e-04f, +1.614220066e-01f, +3.290836352e-01f, +3.626749893e-01f, +2.318430780e-01f, +5.110129425e-02f, -4.788570461e-02f, -4.250831227e-02f, -2.155470446e-03f, +1.439572076e-02f, +6.851909162e-03f, -1.200061471e-03f, -1.645286968e-03f,\n    +5.372639922e-05f, -2.397279188e-05f, -2.878417919e-04f, -2.286473977e-04f, +6.299630894e-04f, +1.354121950e-03f, -6.345740225e-06f, -3.528021810e-03f, -5.917410157e-03f, -3.795613445e-03f, +1.719055951e-03f, +5.665293048e-03f, +4.885087205e-03f, +1.299608136e-03f, -1.134947292e-03f, -1.052142236e-03f, -3.430528633e-05f, +3.463209978e-04f, +1.238218155e-04f, -5.015737533e-05f,\n    +9.892630015e-04f, +8.567145049e-04f, -4.688042318e-03f, -6.352477973e-03f, +7.362056426e-03f, +1.886032547e-02f, +2.069554655e-04f, -2.909986911e-02f, -1.906981397e-02f, +2.351242964e-02f, +3.429856972e-02f, -3.791109640e-03f, -3.155619581e-02f, -1.243945102e-02f, +1.577628358e-02f, +1.385762706e-02f, -2.874693105e-03f, -6.706999259e-03f, -7.074561836e-04f, +1.645286968e-03f,\n    -5.372639922e-05f, +8.753623134e-05f, +2.032547702e-04f, -1.729585111e-04f, -5.739072067e-04f, +2.641248286e-05f, +1.005372440e-03f, +5.178037930e-04f, -1.071362258e-03f, -1.178671770e-03f, +5.685985728e-04f, +1.410533806e-03f, +1.324105813e-04f, -1.044769181e-03f, -4.901883411e-04f, +4.712277792e-04f, +4.016387687e-04f, -1.148837505e-04f, -1.698862713e-04f, +5.015737533e-05f,\n    /*  7,23 (20) */\n    -9.355366023e-04f, -2.076454514e-03f, +2.673027084e-03f, +1.283969130e-02f, +8.645674233e-03f, -2.576113861e-02f, -5.536517296e-02f, -3.272184590e-03f, +1.555045965e-01f, +3.252880217e-01f, +3.643940452e-01f, +2.375083711e-01f, +5.598638146e-02f, -4.658609647e-02f, -4.364325957e-02f, -3.207612682e-03f, +1.436141548e-02f, +7.198230160e-03f, -1.076239655e-03f, -1.695444343e-03f,\n    +5.287845114e-05f, -1.777243331e-05f, -2.804887793e-04f, -2.425516429e-04f, +5.956234609e-04f, +1.354149613e-03f, +7.787748289e-05f, -3.412044185e-03f, -5.901770077e-03f, -3.933410313e-03f, +1.542741369e-03f, +5.610122683e-03f, +4.972899193e-03f, +1.411502428e-03f, -1.099795979e-03f, -1.080381970e-03f, -6.051132815e-05f, +3.470625443e-04f, +1.326195579e-04f, -4.849883127e-05f,\n    +9.355366023e-04f, +9.442507362e-04f, -4.484787548e-03f, -6.525436484e-03f, +6.788149219e-03f, +1.888673795e-02f, +1.212327906e-03f, -2.858206532e-02f, -2.014117623e-02f, +2.233375787e-02f, +3.486716829e-02f, -2.380575833e-03f, -3.142378523e-02f, -1.348422020e-02f, +1.528609524e-02f, +1.432885484e-02f, -2.473054337e-03f, -6.821883009e-03f, -8.773424549e-04f, +1.695444343e-03f,\n    -5.287845114e-05f, +8.080215677e-05f, +2.058620556e-04f, -1.549445993e-04f, -5.733460737e-04f, -7.464318658e-06f, +9.896277631e-04f, +5.607872884e-04f, -1.031517205e-03f, -1.212571443e-03f, +5.116175765e-04f, +1.420804980e-03f, +1.863433608e-04f, -1.034133532e-03f, -5.251984770e-04f, +4.546447394e-04f, +4.173012173e-04f, -1.038891331e-04f, -1.750934673e-04f, +4.849883127e-05f,\n    /*  7,24 (20) */\n    -8.826581512e-04f, -2.094226947e-03f, +2.392538305e-03f, +1.259713966e-02f, +9.241297694e-03f, -2.440698900e-02f, -5.528729548e-02f, -6.684228775e-03f, +1.496028264e-01f, +3.213546114e-01f, +3.659367866e-01f, +2.431184938e-01f, +6.095928065e-02f, -4.517459404e-02f, -4.474305555e-02f, -4.287994652e-03f, +1.430090415e-02f, +7.545292704e-03f, -9.436200974e-04f, -1.743943174e-03f,\n    +5.191041191e-05f, -1.181959165e-05f, -2.728580963e-04f, -2.555409276e-04f, +5.613327454e-04f, +1.352033024e-03f, +1.595952382e-04f, -3.295134865e-03f, -5.881347427e-03f, -4.067385554e-03f, +1.364888672e-03f, +5.549855554e-03f, +5.057654947e-03f, +1.524686796e-03f, -1.061882486e-03f, -1.107660528e-03f, -8.748280951e-05f, +3.471436552e-04f, +1.415090478e-04f, -4.660985620e-05f,\n    +8.826581512e-04f, +1.025052893e-03f, -4.278925492e-03f, -6.680381083e-03f, +6.214803145e-03f, +1.887927364e-02f, +2.201955669e-03f, -2.802127803e-02f, -2.117269343e-02f, +2.112118643e-02f, +3.537878587e-02f, -9.597708539e-04f, -3.123744187e-02f, -1.451835373e-02f, +1.476089676e-02f, +1.478349958e-02f, -2.055753119e-03f, -6.925772142e-03f, -1.052435922e-03f, +1.743943174e-03f,\n    -5.191041191e-05f, +7.410752232e-05f, +2.079003019e-04f, -1.370721197e-04f, -5.716583171e-04f, -4.075970651e-05f, +9.722710983e-04f, +6.023710661e-04f, -9.900757732e-04f, -1.244257631e-03f, +4.536872945e-04f, +1.428604554e-03f, +2.403517431e-04f, -1.021484178e-03f, -5.597438829e-04f, +4.368423451e-04f, +4.324663462e-04f, -9.232499980e-05f, -1.800315206e-04f, +4.660985620e-05f,\n    /*  7,25 (20) */\n    -8.307477393e-04f, -2.106046539e-03f, +2.119680209e-03f, +1.234159873e-02f, +9.802630440e-03f, -2.305495598e-02f, -5.512770024e-02f, -9.979363640e-03f, +1.437214790e-01f, +3.172872259e-01f, +3.673016753e-01f, +2.486683493e-01f, +6.601693560e-02f, -4.364990725e-02f, -4.580493803e-02f, -5.395655180e-03f, +1.421342134e-02f, +7.892436359e-03f, -8.021110495e-04f, -1.790553030e-03f,\n    +5.083058236e-05f, -6.118387923e-06f, -2.649752862e-04f, -2.676198699e-04f, +5.271482026e-04f, +1.347832958e-03f, +2.387591440e-04f, -3.177438036e-03f, -5.856208695e-03f, -4.197419649e-03f, +1.185674053e-03f, +5.484519075e-03f, +5.139224605e-03f, +1.639050427e-03f, -1.021190305e-03f, -1.133904594e-03f, -1.151937864e-04f, +3.465414342e-04f, +1.504735926e-04f, -4.448519162e-05f,\n    +8.307477393e-04f, +1.099160415e-03f, -4.071025190e-03f, -6.817453203e-03f, +5.643144828e-03f, +1.883851393e-02f, +3.174226767e-03f, -2.741890696e-02f, -2.216276920e-02f, +1.987692880e-02f, +3.583247316e-02f, +4.688337005e-04f, -3.099709012e-02f, -1.553983791e-02f, +1.420115288e-02f, +1.522034193e-02f, -1.623286773e-03f, -7.018097142e-03f, -1.232467443e-03f, +1.790553030e-03f,\n    -5.083058236e-05f, +6.746953387e-05f, +2.093805949e-04f, -1.193776738e-04f, -5.688693095e-04f, -7.341596628e-05f, +9.533554423e-04f, +6.424882360e-04f, -9.471242589e-04f, -1.273676493e-03f, +3.949147877e-04f, +1.433908334e-03f, +2.943337751e-04f, -1.006824711e-03f, -5.937490967e-04f, +4.178360684e-04f, +4.470897965e-04f, -8.020385627e-05f, -1.846787500e-04f, +4.448519162e-05f,\n    /*  7,26 (20) */\n    -7.799171569e-04f, -2.112164927e-03f, +1.854704923e-03f, +1.207397886e-02f, +1.032977864e-02f, -2.170712302e-02f, -5.488894109e-02f, -1.315680168e-02f, +1.378652703e-01f, +3.130898062e-01f, +3.684873493e-01f, +2.541528684e-01f, +7.115616020e-02f, -4.201085682e-02f, -4.682612834e-02f, -6.529559773e-03f, +1.409822755e-02f, +8.238977793e-03f, -6.516374570e-04f, -1.835038222e-03f,\n    +4.964724711e-05f, -6.722085081e-07f, -2.568656035e-04f, -2.787946686e-04f, +4.931254120e-04f, +1.341611938e-03f, +3.153250819e-04f, -3.059097074e-03f, -5.826425508e-03f, -4.323398105e-03f, +1.005275483e-03f, +5.414146844e-03f, +5.217480927e-03f, +1.754479317e-03f, -9.777065690e-04f, -1.159040700e-03f, -1.436162238e-04f, +3.452336613e-04f, +1.594957521e-04f, -4.211998972e-05f,\n    +7.799171569e-04f, +1.166629949e-03f, -3.861644596e-03f, -6.936830877e-03f, +5.074275519e-03f, +1.876509796e-02f, +4.127582209e-03f, -2.677641873e-02f, -2.310989346e-02f, +1.860325231e-02f, +3.622738795e-02f, +1.902742034e-03f, -3.070275635e-02f, -1.654666262e-02f, +1.360740378e-02f, +1.563817800e-02f, -1.176196977e-03f, -7.098300999e-03f, -1.417146193e-03f, +1.835038222e-03f,\n    -4.964724711e-05f, +6.090474729e-05f, +2.103151419e-04f, -1.018966696e-04f, -5.650063904e-04f, -1.053775565e-04f, +9.329363822e-04f, +6.810753783e-04f, -9.027514936e-04f, -1.300778745e-03f, +3.354088381e-04f, +1.436696948e-03f, +3.481868894e-04f, -9.901628520e-04f, -6.271388219e-04f, +3.976442523e-04f, +4.611275748e-04f, -6.753987228e-05f, -1.890136608e-04f, +4.211998972e-05f,\n    /*  7,27 (20) */\n    -7.302699098e-04f, -2.112837135e-03f, +1.597839319e-03f, +1.179518419e-02f, +1.082290405e-02f, -2.036551108e-02f, -5.457361601e-02f, -1.621589875e-02f, +1.320388448e-01f, +3.087664081e-01f, +3.694926248e-01f, +2.595670152e-01f, +7.637364113e-02f, -4.025637750e-02f, -4.780383490e-02f, -7.688600474e-03f, +1.395461133e-02f, +8.584211455e-03f, -4.921417048e-04f, -1.877158212e-03f,\n    +4.836865338e-05f, +4.516279813e-06f, -2.485539700e-04f, -2.890730509e-04f, +4.593182172e-04f, +1.333434110e-03f, +3.892531985e-04f, -2.940254357e-03f, -5.792074499e-03f, -4.445211600e-03f, +8.238724784e-04f, +5.338778624e-03f, +5.292299490e-03f, +1.870856384e-03f, -9.314221367e-04f, -1.182995347e-03f, -1.727199946e-04f, +3.431988561e-04f, +1.685573558e-04f, -3.950983931e-05f,\n    +7.302699098e-04f, +1.227534696e-03f, -3.651329454e-03f, -7.038727546e-03f, +4.509269128e-03f, +1.865972041e-02f, +5.060518591e-03f, -2.609534335e-02f, -2.401264496e-02f, +1.730247356e-02f, +3.656279679e-02f, +3.339438982e-03f, -3.035456946e-02f, -1.753682547e-02f, +1.298026496e-02f, +1.603582225e-02f, -7.150694020e-04f, -7.165840871e-03f, -1.606159853e-03f, +1.877158212e-03f,\n    -4.836865338e-05f, +5.442903877e-05f, +2.107172154e-04f, -8.466325981e-05f, -5.600987715e-04f, -1.365912017e-04f, +9.110719496e-04f, +7.180726487e-04f, -8.570486475e-04f, -1.325519754e-03f, +2.752797265e-04f, +1.436955911e-03f, +4.018081145e-04f, -9.715104632e-04f, -6.598380943e-04f, +3.762881120e-04f, +4.745361639e-04f, -5.434888104e-05f, -1.930150079e-04f, +3.950983931e-05f,\n    /*  7,28 (20) */\n    -6.819012564e-04f, -2.108320856e-03f, +1.349285349e-03f, +1.150611114e-02f, +1.128222227e-02f, -1.903207697e-02f, -5.418436281e-02f, -1.915615311e-02f, +1.262467703e-01f, +3.043211965e-01f, +3.703164973e-01f, +2.649057939e-01f, +8.166594062e-02f, -3.838552112e-02f, -4.873525704e-02f, -8.871595821e-03f, +1.378189133e-02f, +8.927410311e-03f, -3.235843490e-04f, -1.916668051e-03f,\n    +4.700299059e-05f, +9.445113488e-06f, -2.400649321e-04f, -2.984642181e-04f, +4.257786731e-04f, +1.323365107e-03f, +4.605079003e-04f, -2.821051081e-03f, -5.753237171e-03f, -4.562756102e-03f, +6.416458677e-04f, +5.258460319e-03f, +5.363558879e-03f, +1.988061608e-03f, -8.823316633e-04f, -1.205695118e-03f, -2.024728833e-04f, +3.404163420e-04f, +1.776395203e-04f, -3.665079142e-05f,\n    +6.819012564e-04f, +1.281963735e-03f, -3.440612238e-03f, -7.123390806e-03f, +3.949170357e-03f, +1.852312920e-02f, +5.971590541e-03f, -2.537727070e-02f, -2.486969360e-02f, +1.597695381e-02f, +3.683807651e-02f, +4.776394893e-03f, -2.995276134e-02f, -1.850833594e-02f, +1.232042687e-02f, +1.641211036e-02f, -2.405332382e-04f, -7.220189752e-03f, -1.799174861e-03f, +1.916668051e-03f,\n    -4.700299059e-05f, +4.805757752e-05f, +2.106010952e-04f, -6.771028362e-05f, -5.541774399e-04f, -1.670059789e-04f, +8.878224722e-04f, +7.534238774e-04f, -8.101090303e-04f, -1.347859614e-03f, +2.146390078e-04f, +1.434675664e-03f, +4.550942873e-04f, -9.508835635e-04f, -6.917724485e-04f, +3.537917286e-04f, +4.872726340e-04f, -4.064837437e-05f, -1.966618593e-04f, +3.665079142e-05f,\n    /*  7,29 (20) */\n    -6.348982658e-04f, -2.098875742e-03f, +1.109220417e-03f, +1.120764692e-02f, +1.170800094e-02f, -1.770871186e-02f, -5.372385491e-02f, -2.197720419e-02f, +1.204935331e-01f, +2.997584404e-01f, +3.709581431e-01f, +2.701642542e-01f, +8.702949950e-02f, -3.639745951e-02f, -4.961758870e-02f, -1.007729094e-02f, +1.357941845e-02f, +9.267826653e-03f, -1.459448287e-04f, -1.953318842e-03f,\n    +4.555837060e-05f, +1.411301470e-05f, -2.314226199e-04f, -3.069787893e-04f, +3.925569985e-04f, +1.311471924e-03f, +5.290578424e-04f, -2.701627071e-03f, -5.709999753e-03f, -4.675932995e-03f, +4.587775555e-04f, +5.173243944e-03f, +5.431140880e-03f, +2.105972156e-03f, -8.304336728e-04f, -1.227066805e-03f, -2.328405920e-04f, +3.368663100e-04f, +1.867226703e-04f, -3.353938457e-05f,\n    +6.348982658e-04f, +1.330021313e-03f, -3.230011143e-03f, -7.191101090e-03f, +3.394992917e-03f, +1.835612323e-02f, +6.859413013e-03f, -2.462384682e-02f, -2.567980264e-02f, +1.462909419e-02f, +3.705271552e-02f, +6.211070557e-03f, -2.949766706e-02f, -1.945921950e-02f, +1.162865442e-02f, +1.676590209e-02f, +2.467393959e-04f, -7.260838126e-03f, -1.995836721e-03f, +1.953318842e-03f,\n    -4.555837060e-05f, +4.180480123e-05f, +2.099820088e-04f, -5.106921368e-05f, -5.472750577e-04f, -1.965733985e-04f, +8.632504201e-04f, +7.870766570e-04f, -7.620278883e-04f, -1.367763221e-03f, +1.535992829e-04f, +1.429851616e-03f, +5.079422657e-04f, -9.283023291e-04f, -7.228680859e-04f, +3.301820368e-04f, +4.992947547e-04f, -2.645749345e-05f, -1.999336602e-04f, +3.353938457e-05f,\n    /*  7,30 (20) */\n    -5.893398952e-04f, -2.084762727e-03f, +8.777977970e-04f, +1.090066813e-02f, +1.210055794e-02f, -1.639723994e-02f, -5.319479707e-02f, -2.467883126e-02f, +1.147835334e-01f, +2.950825074e-01f, +3.714169207e-01f, +2.753374981e-01f, +9.246064038e-02f, -3.429148735e-02f, -5.044802238e-02f, -1.130435774e-02f, +1.334657786e-02f, +9.604692963e-03f, +4.077784161e-05f, -1.986858227e-03f,\n    +4.404280889e-05f, +1.851937276e-05f, -2.226507092e-04f, -3.146287443e-04f, +3.597015317e-04f, +1.297822783e-03f, +5.948759102e-04f, -2.582120611e-03f, -5.662453052e-03f, -4.784649184e-03f, +2.754502848e-04f, +5.083187578e-03f, +5.494930663e-03f, +2.224462527e-03f, -7.757306228e-04f, -1.247037532e-03f, -2.637867523e-04f, +3.325298824e-04f, +1.957865608e-04f, -3.017266954e-05f,\n    +5.893398952e-04f, +1.371826114e-03f, -3.020029134e-03f, -7.242170304e-03f, +2.847717859e-03f, +1.815954983e-02f, +7.722663433e-03f, -2.383677016e-02f, -2.644183052e-02f, +1.326133097e-02f, +3.720631480e-02f, +7.640922173e-03f, -2.898972479e-02f, -2.038752183e-02f, +1.090578633e-02f, +1.709608413e-02f, +7.460341506e-04f, -7.287295620e-03f, -2.195770381e-03f, +1.986858227e-03f,\n    -4.404280889e-05f, +3.568439400e-05f, +2.088760710e-04f, -3.477010676e-05f, -5.394258599e-04f, -2.252474774e-04f, +8.374202502e-04f, +8.189824236e-04f, -7.129021976e-04f, -1.385200332e-03f, +9.227396912e-05f, +1.422484159e-03f, +5.602491446e-04f, -9.037910865e-04f, -7.530520433e-04f, +3.054888055e-04f, +5.105611064e-04f, -1.179701523e-05f, -2.028102973e-04f, +3.017266954e-05f,\n    /*  7,31 (20) */\n    -5.452970863e-04f, -2.066243355e-03f, +6.551470878e-04f, +1.058603939e-02f, +1.246025947e-02f, -1.509941716e-02f, -5.259992116e-02f, -2.726095187e-02f, +1.091210803e-01f, +2.902978582e-01f, +3.716923710e-01f, +2.804206857e-01f, +9.795557104e-02f, -3.206702483e-02f, -5.122375300e-02f, -1.255139528e-02f, +1.308279111e-02f, +9.937222845e-03f, +2.365644024e-04f, -2.017030896e-03f,\n    +4.246420638e-05f, +2.266422450e-05f, -2.137723839e-04f, -3.214273652e-04f, +3.272586910e-04f, +1.282487004e-03f, +6.579391952e-04f, -2.462668262e-03f, -5.610692295e-03f, -4.888817206e-03f, +9.184739889e-05f, +4.988355315e-03f, +5.554816971e-03f, +2.343404695e-03f, -7.182289642e-04f, -1.265534878e-03f, -2.952729392e-04f, +3.273891760e-04f, +2.048103015e-04f, -2.654823367e-05f,\n    +5.452970863e-04f, +1.407510508e-03f, -2.811153063e-03f, -7.276940410e-03f, +2.308291999e-03f, +1.793430235e-02f, +8.560083684e-03f, -2.301778774e-02f, -2.715473272e-02f, +1.187613064e-02f, +3.729858877e-02f, +9.063406332e-03f, -2.842947565e-02f, -2.129131292e-02f, +1.015273429e-02f, +1.740157293e-02f, +1.256595257e-03f, -7.299092635e-03f, -2.398580678e-03f, +2.017030896e-03f,\n    -4.246420638e-05f, +2.970926703e-05f, +2.073002217e-04f, -1.884155900e-05f, -5.306655498e-04f, -2.529848066e-04f, +8.103982468e-04f, +8.490965277e-04f, -6.628304558e-04f, -1.400145616e-03f, +3.077706798e-05f, +1.412578692e-03f, +6.119124701e-04f, -8.773782963e-04f, -7.822523602e-04f, +2.797446115e-04f, +5.210311924e-04f, +3.310665577e-06f, -2.052721633e-04f, +2.654823367e-05f,\n    /*  8, 0 (20) */\n    +0.000000000e+00f, -2.162478138e-03f, +2.968830052e-03f, +1.456514462e-02f, +3.864387390e-03f, -4.257150003e-02f, -5.189231134e-02f, +7.569282484e-02f, +2.958850260e-01f, +4.091135842e-01f, +2.958850260e-01f, +7.569282484e-02f, -5.189231134e-02f, -4.257150003e-02f, +3.864387390e-03f, +1.456514462e-02f, +2.968830052e-03f, -2.162478138e-03f, -6.063593551e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.618617492e-07f, -3.306998416e-04f, -2.257582532e-04f, +9.857902663e-04f, +1.500481324e-03f, -1.466026399e-03f, -6.166729441e-03f, -6.400934007e-03f, -1.226244669e-04f, +6.288962822e-03f, +6.273522751e-03f, +1.613571734e-03f, -1.468337442e-03f, -1.029502197e-03f, +2.034068588e-04f, +3.402689242e-04f, +6.472162169e-06f, -5.237349152e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.255434474e-04f, -5.708818371e-03f, -2.108551328e-03f, +1.418929790e-02f, +1.339449588e-02f, -1.745001859e-02f, -2.945354373e-02f, +8.130342331e-03f, +3.732936584e-02f, +8.130342331e-03f, -2.945354373e-02f, -1.745001859e-02f, +1.339449588e-02f, +1.418929790e-02f, -2.108551328e-03f, -5.708818371e-03f, -6.255434474e-04f, +6.470832082e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.212460831e-04f, +1.186460577e-04f, -3.756000324e-04f, -4.540503574e-04f, +5.830089752e-04f, +1.025476853e-03f, -4.527856805e-04f, -1.499376150e-03f, -3.408818562e-05f, +1.490537654e-03f, +5.111716778e-04f, -1.005631891e-03f, -6.194541872e-04f, +4.361168879e-04f, +3.920153858e-04f, -1.097030990e-04f, -1.267209228e-04f, +2.133747723e-05f, +0.000000000e+00f,\n    /*  8, 1 (20) */\n    +0.000000000e+00f, -2.162016276e-03f, +2.638130210e-03f, +1.433938636e-02f, +4.850177656e-03f, -4.107101871e-02f, -5.335833774e-02f, +6.952609540e-02f, +2.894840920e-01f, +4.089909597e-01f, +3.021739889e-01f, +8.196634759e-02f, -5.027873961e-02f, -4.403983748e-02f, +2.834885193e-03f, +1.476855147e-02f, +3.309098976e-03f, -2.156005975e-03f, -6.587328467e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.023736503e-06f, -3.207328672e-04f, -2.467743542e-04f, +9.415487266e-04f, +1.528782666e-03f, -1.320671441e-03f, -6.055179807e-03f, -6.505671737e-03f, -3.677242540e-04f, +6.169849517e-03f, +6.375355250e-03f, +1.763138187e-03f, -1.432296160e-03f, -1.072575305e-03f, +1.797243282e-04f, +3.493988511e-04f, +1.377463820e-05f, -5.420376676e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.042973643e-04f, -5.590172313e-03f, -2.484151361e-03f, +1.373524754e-02f, +1.397750486e-02f, -1.642454174e-02f, -2.990632942e-02f, +6.630966181e-03f, +3.729527765e-02f, +9.620879985e-03f, -2.894237206e-02f, -1.845565048e-02f, +1.277504170e-02f, +1.462541478e-02f, -1.716535943e-03f, -5.818521470e-03f, -7.522643702e-04f, +6.684206855e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.156522294e-04f, +1.269625761e-04f, -3.587843512e-04f, -4.706157560e-04f, +5.459703823e-04f, +1.043026549e-03f, -3.939675859e-04f, -1.505248756e-03f, -1.021939107e-04f, +1.478740802e-03f, +5.689991241e-04f, -9.835082565e-04f, -6.552154762e-04f, +4.168291511e-04f, +4.079788706e-04f, -1.001380708e-04f, -1.320541391e-04f, +1.932808259e-05f, +0.000000000e+00f,\n    /*  8, 2 (20) */\n    +0.000000000e+00f, -2.154992539e-03f, +2.317397343e-03f, +1.409261201e-02f, +5.791726383e-03f, -3.954223604e-02f, -5.467900918e-02f, +6.347091559e-02f, +2.829784203e-01f, +4.086232355e-01f, +3.083438384e-01f, +8.834170284e-02f, -4.851560142e-02f, -4.547213364e-02f, +1.762309887e-03f, +1.494827580e-02f, +3.658497827e-03f, -2.142231337e-03f, -7.129366134e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.321098992e-05f, -3.104088166e-04f, -2.664541626e-04f, +8.968847683e-04f, +1.553301759e-03f, -1.177669827e-03f, -5.939083145e-03f, -6.603095559e-03f, -6.123768384e-04f, +6.043696216e-03f, +6.472027641e-03f, +1.914550414e-03f, -1.392308263e-03f, -1.114898525e-03f, +1.547180591e-04f, +3.580480029e-04f, +2.144061112e-05f, -5.591781592e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.886451349e-04f, -5.463209737e-03f, -2.842935712e-03f, +1.326463178e-02f, +1.452347524e-02f, -1.538151519e-02f, -3.030029700e-02f, +5.125717425e-03f, +3.719308374e-02f, +1.109962079e-02f, -2.837337293e-02f, -1.943915874e-02f, +1.211982622e-02f, +1.504224393e-02f, -1.308557072e-03f, -5.918659541e-03f, -8.843185093e-04f, +6.877487681e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.099615968e-04f, +1.346501531e-04f, -3.416197214e-04f, -4.858028393e-04f, +5.084290207e-04f, +1.058269733e-03f, -3.348439216e-04f, -1.508154461e-03f, -1.700878596e-04f, +1.463999657e-03f, +6.261419350e-04f, -9.591278986e-04f, -6.902025932e-04f, +3.962045354e-04f, +4.234389215e-04f, -8.995724925e-05f, -1.372228099e-04f, +1.710004392e-05f, +0.000000000e+00f,\n    /*  8, 3 (20) */\n    +0.000000000e+00f, -2.141781549e-03f, +2.006988527e-03f, +1.382615785e-02f, +6.688611151e-03f, -3.798893429e-02f, -5.585667901e-02f, +5.753183244e-02f, +2.763753247e-01f, +4.080108587e-01f, +3.143875346e-01f, +9.481373048e-02f, -4.660105101e-02f, -4.686444190e-02f, +6.474113621e-04f, +1.510299386e-02f, +4.016545830e-03f, -2.120790726e-03f, -7.688544293e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.902233903e-05f, -2.997679676e-04f, -2.847997507e-04f, +8.519033891e-04f, +1.574104112e-03f, -1.037178045e-03f, -5.818653167e-03f, -6.693135983e-03f, -8.562848755e-04f, +5.910615717e-03f, +6.563346201e-03f, +2.067627203e-03f, -1.348330372e-03f, -1.156359128e-03f, +1.283987668e-04f, +3.661745017e-04f, +2.946383688e-05f, -5.750269101e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.786835381e-04f, -5.328559584e-03f, -3.184555433e-03f, +1.277882894e-02f, +1.503190426e-02f, -1.432324546e-02f, -3.063514092e-02f, +3.617562964e-03f, +3.702299588e-02f, +1.256362044e-02f, -2.774723100e-02f, -2.039828664e-02f, +1.142962363e-02f, +1.543844847e-02f, -8.851181504e-04f, -6.008616790e-03f, -1.021541319e-03f, +7.048488120e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.041959854e-04f, +1.417081185e-04f, -3.241572278e-04f, -4.996048872e-04f, +4.704753514e-04f, +1.071200476e-03f, -2.755409949e-04f, -1.508098759e-03f, -2.376293875e-04f, +1.446334796e-03f, +6.824746924e-04f, -9.325181251e-04f, -7.243258077e-04f, +3.742640308e-04f, +4.383440878e-04f, -7.916884454e-05f, -1.422037663e-04f, +1.465200696e-05f, +0.000000000e+00f,\n    /*  8, 4 (20) */\n    +0.000000000e+00f, -2.122759210e-03f, +1.707220559e-03f, +1.354135809e-02f, +7.540514540e-03f, -3.641483017e-02f, -5.689385706e-02f, +5.171317928e-02f, +2.696821888e-01f, +4.071545738e-01f, +3.202981503e-01f, +1.013770767e-01f, -4.453342381e-02f, -4.821277227e-02f, -5.089477662e-04f, +1.523139263e-02f, +4.382720332e-03f, -2.091326889e-03f, -8.263571204e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.445765210e-05f, -2.888499750e-04f, -3.018161692e-04f, +8.067072348e-04f, +1.591260231e-03f, -8.993459211e-04f, -5.694107605e-03f, -6.775734534e-03f, -1.099152205e-03f, +5.770731354e-03f, +6.649123146e-03f, +2.222181709e-03f, -1.300325148e-03f, -1.196842908e-03f, +1.007805544e-04f, +3.737363107e-04f, +3.783675462e-05f, -5.894531858e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.744875527e-04f, -5.186851466e-03f, -3.508712661e-03f, +1.227922406e-02f, +1.550237961e-02f, -1.325204498e-02f, -3.091068192e-02f, +2.109464205e-03f, +3.678536650e-02f, +1.400995524e-02f, -2.706475631e-02f, -2.133080476e-02f, +1.070529782e-02f, +1.581271250e-02f, -4.467740626e-04f, -6.087785635e-03f, -1.163745085e-03f, +7.195008189e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.837670411e-05f, +1.481375893e-04f, -3.064475298e-04f, -5.120186609e-04f, +4.321994666e-04f, +1.081818129e-03f, -2.161846012e-04f, -1.505093613e-03f, -3.046786581e-04f, +1.425773284e-03f, +7.378729408e-04f, -9.037115885e-04f, -7.574961350e-04f, +3.510322360e-04f, +4.526431748e-04f, -6.778302618e-05f, -1.469736598e-04f, +1.198340192e-05f, +0.000000000e+00f,\n    /*  8, 5 (20) */\n    +0.000000000e+00f, -2.098301558e-03f, +1.418370584e-03f, +1.323954193e-02f, +8.347221775e-03f, -3.482356994e-02f, -5.779320298e-02f, +4.601907167e-02f, +2.629064542e-01f, +4.060554216e-01f, +3.260688817e-01f, +1.080261998e-01f, -4.231124210e-02f, -4.951309742e-02f, -1.705790674e-03f, +1.533217318e-02f, +4.756456642e-03f, -2.053490135e-03f, -8.853024389e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.951790863e-05f, -2.776937890e-04f, -3.175113510e-04f, +7.613964480e-04f, +1.604845391e-03f, -7.643164645e-04f, -5.565667816e-03f, -6.850843792e-03f, -1.340684321e-03f, +5.624176851e-03f, +6.729177001e-03f, +2.378021695e-03f, -1.248261464e-03f, -1.236234382e-03f, +7.188097839e-05f, +3.806913382e-04f, +4.655046160e-05f, -6.023253879e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.611084864e-05f, -5.038713876e-03f, -3.815160191e-03f, +1.176720539e-02f, +1.593457908e-02f, -1.217022685e-02f, -3.112686652e-02f, +6.043705926e-04f, +3.648068784e-02f, +1.543572852e-02f, -2.632688336e-02f, -2.223451635e-02f, +9.947801685e-03f, +1.616374474e-02f, +5.869112213e-06f, -6.155568661e-03f, -1.310718745e-03f, +7.314842209e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.252451654e-05f, +1.539414209e-04f, -2.885407354e-04f, -5.230443508e-04f, +3.936908756e-04f, +1.090127269e-03f, -1.568997351e-04f, -1.499157406e-03f, -3.710969634e-04f, +1.402348631e-03f, +7.922134833e-04f, -8.727462592e-04f, -7.896255635e-04f, +3.265373564e-04f, +4.662853874e-04f, -5.581194207e-05f, -1.515090324e-04f, +9.094470904e-06f, +0.000000000e+00f,\n    /*  8, 6 (20) */\n    +0.000000000e+00f, -2.068783650e-03f, +1.140676795e-03f, +1.292203057e-02f, +9.108618223e-03f, -3.321872455e-02f, -5.855751944e-02f, +4.045340386e-02f, +2.560556104e-01f, +4.047147373e-01f, +3.316930585e-01f, +1.147553768e-01f, -3.993322040e-02f, -5.076135888e-02f, -2.942025056e-03f, +1.540405416e-02f, +5.137147981e-03f, -2.006939673e-03f, -9.455349777e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.420515739e-05f, -2.663375779e-04f, -3.318960101e-04f, +7.160685252e-04f, +1.614939401e-03f, -6.322257162e-04f, -5.433558380e-03f, -6.918427409e-03f, -1.580588841e-03f, +5.471096141e-03f, +6.803332954e-03f, +2.534949799e-03f, -1.192114586e-03f, -1.274416991e-03f, +4.172110693e-05f, +3.869975437e-04f, +5.559469128e-05f, -6.135114594e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.641366791e-05f, -4.884772455e-03f, -4.103700926e-03f, +1.124416104e-02f, +1.632826996e-02f, -1.108009958e-02f, -3.128376625e-02f, -8.947868130e-04f, +3.610959088e-02f, +1.683807716e-02f, -2.553466988e-02f, -2.310726261e-02f, +9.158176121e-03f, +1.649028209e-02f, +4.721544996e-04f, -6.211380603e-03f, -1.462227778e-03f, +7.405786918e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.665959027e-05f, +1.591241558e-04f, -2.704862783e-04f, -5.326855166e-04f, +3.550382947e-04f, +1.096137638e-03f, -9.781030550e-05f, -1.490314875e-03f, -4.367470415e-04f, +1.376100729e-03f, +8.453746769e-04f, -8.396653856e-04f, -8.206272825e-04f, +3.008111924e-04f, +4.792204753e-04f, -4.326973245e-05f, -1.557863887e-04f, +5.986293400e-06f, +0.000000000e+00f,\n    /*  8, 7 (20) */\n    +0.000000000e+00f, -2.034578492e-03f, +8.743392170e-04f, +1.259013456e-02f, +9.824686748e-03f, -3.160378515e-02f, -5.918974516e-02f, +3.501984548e-02f, +2.491371830e-01f, +4.031341484e-01f, +3.371641547e-01f, +1.215587098e-01f, -3.739827060e-02f, -5.195347347e-02f, -4.216442048e-03f, +1.544577527e-02f, +5.524145524e-03f, -1.951344982e-03f, -1.006886124e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.852247275e-05f, -2.548186554e-04f, -3.449835367e-04f, +6.708181825e-04f, +1.621626369e-03f, -5.032026181e-04f, -5.298006690e-03f, -6.978460109e-03f, -1.818575967e-03f, +5.311643185e-03f, +6.871423201e-03f, +2.692763799e-03f, -1.131866336e-03f, -1.311273318e-03f, +1.032557166e-05f, +3.926130473e-04f, +6.495779442e-05f, -6.228793068e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.030732582e-04f, -4.725648300e-03f, -4.374187205e-03f, +1.071147553e-02f, +1.668330825e-02f, -9.983961945e-03f, -3.138157656e-02f, -2.385101688e-03f, +3.567284383e-02f, +1.821417788e-02f, -2.468929520e-02f, -2.394692800e-02f, +8.337548839e-03f, +1.679109329e-02f, +9.513749750e-04f, -6.254650335e-03f, -1.618014166e-03f, +7.465649852e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.080144936e-05f, +1.636919669e-04f, -2.523327995e-04f, -5.409490196e-04f, +3.163294421e-04f, +1.099864065e-03f, -3.903885532e-05f, -1.478597032e-03f, -5.014933909e-04f, +1.347075783e-03f, +8.972367241e-04f, -8.045174409e-04f, -8.504159104e-04f, +2.738891182e-04f, +4.913988792e-04f, -3.017253819e-05f, -1.597822697e-04f, +2.660809337e-06f, +0.000000000e+00f,\n    /*  8, 8 (20) */\n    +0.000000000e+00f, -1.996056020e-03f, +6.195205617e-04f, +1.224515103e-02f, +1.049550493e-02f, -2.998215878e-02f, -5.969294778e-02f, +2.972183879e-02f, +2.421587229e-01f, +4.013155724e-01f, +3.424757978e-01f, +1.284301330e-01f, -3.470550680e-02f, -5.308533981e-02f, -5.527715365e-03f, +1.545610084e-02f, +5.916758572e-03f, -1.886387187e-03f, -1.069174054e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.247390942e-05f, -2.431734112e-04f, -3.567898892e-04f, +6.257372305e-04f, +1.624994456e-03f, -3.773688956e-04f, -5.159242554e-03f, -7.030927663e-03f, -2.054358946e-03f, +5.145981756e-03f, +6.933287283e-03f, +2.851256896e-03f, -1.067505246e-03f, -1.346685295e-03f, -2.227738715e-05f, +3.974962422e-04f, +7.462672369e-05f, -6.302972345e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.838747075e-04f, -4.561956333e-03f, -4.626520004e-03f, +1.017052651e-02f, +1.699963769e-02f, -8.884097880e-03f, -3.142061541e-02f, -3.863698720e-03f, +3.517135044e-02f, +1.956125367e-02f, -2.379205848e-02f, -2.475144544e-02f, +7.487132928e-03f, +1.706498240e-02f, +1.442773854e-03f, -6.284822874e-03f, -1.777796436e-03f, +7.492257945e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.496893016e-05f, +1.676525981e-04f, -2.341280336e-04f, -5.478449469e-04f, +2.776508377e-04f, +1.101326377e-03f, +1.929371400e-05f, -1.464041066e-03f, -5.652025795e-04f, +1.315326220e-03f, +9.476819635e-04f, -7.673560558e-04f, -8.789077206e-04f, +2.458100504e-04f, +5.027718777e-04f, -1.653850333e-05f, -1.634733292e-04f, -8.791601960e-07f, +0.000000000e+00f,\n    /*  8, 9 (20) */\n    +0.000000000e+00f, -1.953582110e-03f, +3.763471504e-04f, +1.188836114e-02f, +1.112124216e-02f, -2.835716432e-02f, -6.007031667e-02f, +2.456259623e-02f, +2.351277952e-01f, +3.992612135e-01f, +3.476217796e-01f, +1.353634203e-01f, -3.185424991e-02f, -5.415284505e-02f, -6.874400660e-03f, +1.543382345e-02f, +6.314254814e-03f, -1.811760464e-03f, -1.132203778e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.606445578e-05f, -2.314372474e-04f, -3.673334824e-04f, +5.809144570e-04f, +1.625135633e-03f, -2.548389554e-04f, -5.017497786e-03f, -7.075826854e-03f, -2.287654524e-03f, +4.974285215e-03f, +6.988772415e-03f, +3.010218017e-03f, -9.990266999e-04f, -1.380534433e-03f, -5.605588272e-05f, +4.016059088e-04f, +8.458702163e-05f, -6.356343946e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.588436377e-04f, -4.394303735e-03f, -4.860648038e-03f, +9.622681561e-03f, +1.727728853e-02f, -7.782771502e-03f, -3.140132170e-02f, -5.327739786e-03f, +3.460614786e-02f, +2.087657989e-02f, -2.284437652e-02f, -2.551880149e-02f, +6.608225208e-03f, +1.731079245e-02f, +1.945545732e-03f, -6.301361377e-03f, -1.941269765e-03f, +7.483466343e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.918014043e-05f, +1.710153017e-04f, -2.159186992e-04f, -5.533865287e-04f, +2.390876085e-04f, +1.100549303e-03f, +7.706841200e-05f, -1.446690235e-03f, -6.277435499e-04f, +1.280910578e-03f, +9.965951551e-04f, -7.282399390e-04f, -9.060208672e-04f, +2.166164074e-04f, +5.132917351e-04f, -2.387771828e-06f, -1.668364102e-04f, -4.629894786e-06f, +0.000000000e+00f,\n    /*  8,10 (20) */\n    +0.000000000e+00f, -1.907517654e-03f, +1.449099031e-04f, +1.152102766e-02f, +1.170215662e-02f, -2.673202869e-02f, -6.032515563e-02f, +1.954509845e-02f, +2.280519684e-01f, +3.969735590e-01f, +3.525960648e-01f, +1.423521927e-01f, -2.884403189e-02f, -5.515187175e-02f, -8.254935092e-03f, +1.537776757e-02f, +6.715860723e-03f, -1.727173442e-03f, -1.195767217e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.929998603e-05f, -2.196445174e-04f, -3.766350731e-04f, +5.364355200e-04f, +1.622145428e-03f, -1.357197978e-04f, -4.873005799e-03f, -7.113165414e-03f, -2.518183389e-03f, +4.796736271e-03f, +7.037733797e-03f, +3.169432113e-03f, -9.264330694e-04f, -1.412702048e-03f, -9.097435133e-05f, +4.049013318e-04f, +9.482281232e-05f, -6.387612474e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.280237781e-04f, -4.223288433e-03f, -5.076566737e-03f, +9.069295032e-03f, +1.751637614e-02f, -6.682222200e-03f, -3.132425329e-02f, -6.774430021e-03f, +3.397840431e-02f, +2.215749047e-02f, -2.184778136e-02f, -2.624704143e-02f, +5.702204340e-03f, +1.752740886e-02f, +2.458837467e-03f, -6.303749149e-03f, -2.108106175e-03f, +7.437167395e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.345242192e-05f, +1.737907723e-04f, -1.977503951e-04f, -5.575900484e-04f, +2.007232999e-04f, +1.097562356e-03f, +1.341684222e-04f, -1.426593742e-03f, -6.889879173e-04f, +1.243893395e-03f, +1.043863763e-03f, -6.872327832e-04f, -9.316756075e-04f, +1.863540588e-04f, +5.229118486e-04f, +1.225752168e-05f, -1.698486244e-04f, -8.586759214e-06f, +0.000000000e+00f,\n    /*  8,11 (20) */\n    +0.000000000e+00f, -1.858217668e-03f, -7.473461437e-05f, +1.114439258e-02f, +1.223859214e-02f, -2.510988326e-02f, -6.046087543e-02f, +1.467209265e-02f, +2.209388030e-01f, +3.944553756e-01f, +3.573928011e-01f, +1.493899265e-01f, -2.567459978e-02f, -5.607830482e-02f, -9.667637140e-03f, +1.528679322e-02f, +7.120762054e-03f, -1.632350630e-03f, -1.259643342e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.218721123e-05f, -2.078284716e-04f, -3.847176435e-04f, +4.923828488e-04f, +1.616122678e-03f, -2.011094541e-05f, -4.726001200e-03f, -7.142961946e-03f, -2.745670614e-03f, +4.613526711e-03f, +7.080034920e-03f, +3.328680481e-03f, -8.497338328e-04f, -1.443069493e-03f, -1.269935294e-04f, +4.073424191e-04f, +1.053167967e-04f, -6.395500345e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.914762000e-04f, -4.049497661e-03f, -5.274317132e-03f, +8.511704983e-03f, +1.771709944e-02f, -5.584659843e-03f, -3.119008487e-02f, -8.201023763e-03f, +3.328941640e-02f, +2.340138386e-02f, -2.080391760e-02f, -2.693427421e-02f, +4.770528733e-03f, +1.771376292e-02f, +2.981749316e-03f, -6.291491627e-03f, -2.277954800e-03f, +7.351299803e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.780231643e-05f, +1.759910779e-04f, -1.796675011e-04f, -5.604747465e-04f, +1.626396944e-04f, +1.092399722e-03f, +1.904793584e-04f, -1.403806598e-03f, -7.488102621e-04f, +1.204345068e-03f, +1.089378230e-03f, -6.444031594e-04f, -9.557945223e-04f, +1.550722645e-04f, +5.315868954e-04f, +2.737326717e-05f, -1.724874317e-04f, -1.274419075e-05f, +0.000000000e+00f,\n    /*  8,12 (20) */\n    +0.000000000e+00f, -1.806030457e-03f, -2.825630860e-04f, +1.075967494e-02f, +1.273097499e-02f, -2.349376059e-02f, -6.048098637e-02f, +9.946091448e-03f, +2.137958410e-01f, +3.917097050e-01f, +3.620063278e-01f, +1.564699614e-01f, -2.234591930e-02f, -5.692803865e-02f, -1.111070663e-02f, +1.515979969e-02f, +7.528104474e-03f, -1.527033833e-03f, -1.323598345e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.473362948e-05f, -1.960212053e-04f, -3.916062816e-04f, +4.488355540e-04f, +1.607169272e-03f, +9.189561518e-05f, -4.576719389e-03f, -7.165245829e-03f, -2.969846086e-03f, +4.424857132e-03f, +7.115547851e-03f, +3.487741094e-03f, -7.689456846e-04f, -1.471518397e-03f, -1.640704385e-04f, +4.088898222e-04f, +1.160502517e-04f, -6.378752610e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.492785165e-04f, -3.873506583e-03f, -5.453984633e-03f, +7.951230237e-03f, +1.787973913e-02f, -4.492260122e-03f, -3.099960551e-02f, -9.604830361e-03f, +3.254060613e-02f, +2.460572893e-02f, -1.971453937e-02f, -2.757867737e-02f, +3.814734211e-03f, +1.786883518e-02f, +3.513336211e-03f, -6.264118360e-03f, -2.450442232e-03f, +7.223857896e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.224553531e-05f, +1.776295889e-04f, -1.617130840e-04f, -5.620627177e-04f, +1.249166356e-04f, +1.085100116e-03f, +2.458895125e-04f, -1.378389468e-03f, -8.070884138e-04f, +1.162341705e-03f, +1.133032251e-03f, -5.998243967e-04f, -9.783027328e-04f, +1.228236045e-04f, +5.392729787e-04f, +4.293340064e-05f, -1.747307205e-04f, -1.709568934e-05f, +0.000000000e+00f,\n    /*  8,13 (20) */\n    +0.000000000e+00f, -1.751296828e-03f, -4.785842912e-04f, +1.036806866e-02f, +1.317981054e-02f, -2.188659131e-02f, -6.038909076e-02f, +5.369372059e-03f, +2.066305952e-01f, +3.887398589e-01f, +3.664311849e-01f, +1.635855092e-01f, -1.885817820e-02f, -5.769698434e-02f, -1.258222503e-02f, +1.499572925e-02f, +7.936994296e-03f, -1.410983581e-03f, -1.387385872e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.694747535e-05f, -1.842536125e-04f, -3.973280606e-04f, +4.058693476e-04f, +1.595389896e-03f, +2.002154750e-04f, -4.425396158e-03f, -7.180057102e-03f, -3.190444929e-03f, +4.230936643e-03f, +7.144153518e-03f, +3.646388934e-03f, -6.840926323e-04f, -1.497930904e-03f, -2.021583781e-04f, +4.095050584e-04f, +1.270030335e-04f, -6.336141875e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.015240518e-04f, -3.695876994e-03f, -5.615697717e-03f, +7.389167519e-03f, +1.800465577e-02f, -3.407160005e-03f, -3.075371600e-02f, -1.098321983e-02f, +3.173351772e-02f, +2.576807063e-02f, -1.858150712e-02f, -2.817850177e-02f, +2.836431478e-03f, +1.799165879e-02f, +4.052609190e-03f, -6.221184959e-03f, -2.625172952e-03f, +7.052901002e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.679693256e-05f, +1.787209045e-04f, -1.439288099e-04f, -5.623788026e-04f, +8.763186081e-05f, +1.075706652e-03f, +3.002900951e-04f, -1.350408511e-03f, -8.637037285e-04f, +1.117964965e-03f, +1.174723035e-03f, -5.535744514e-04f, -9.991281130e-04f, +8.966389948e-05f, +5.459277726e-04f, +5.890993161e-05f, -1.765568897e-04f, -2.163381083e-05f, +0.000000000e+00f,\n    /*  8,14 (20) */\n    +0.000000000e+00f, -1.694349352e-03f, -6.628379037e-04f, +9.970740597e-03f, +1.358567989e-02f, -2.029120142e-02f, -6.018887528e-02f, +9.439759012e-04f, +1.994505381e-01f, +3.855494140e-01f, +3.706621216e-01f, +1.707296628e-01f, -1.521178927e-02f, -5.838107697e-02f, -1.408015593e-02f, +1.479357087e-02f, +8.346499354e-03f, -1.283980548e-03f, -1.450747290e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.883766883e-05f, -1.725553440e-04f, -4.019119162e-04f, +3.635564707e-04f, +1.580891775e-03f, +3.047718303e-04f, -4.272267288e-03f, -7.187446327e-03f, -3.407207915e-03f, +4.031982553e-03f, +7.165741964e-03f, +3.804396343e-03f, -5.952060805e-04f, -1.522189921e-03f, -2.412069273e-04f, +4.091506342e-04f, +1.381535847e-04f, -6.266473295e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.483209843e-04f, -3.517156089e-03f, -5.759626527e-03f, +6.826788717e-03f, +1.809228763e-02f, -2.331453353e-03f, -3.045342590e-02f, -1.233362834e-02f, +3.086981399e-02f, +2.688603560e-02f, -1.740678408e-02f, -2.873207622e-02f, +1.837303365e-03f, +1.808132269e-02f, +4.598536962e-03f, -6.162275028e-03f, -2.801729842e-03f, +6.836562894e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.147048134e-05f, +1.792807772e-04f, -1.263548615e-04f, -5.614504733e-04f, +5.086084095e-05f, +1.064266684e-03f, +3.535754669e-04f, -1.319935200e-03f, -9.185413560e-04f, +1.071301879e-03f, +1.214351565e-03f, -5.057357615e-04f, -1.018201499e-03f, +5.565212027e-05f, +5.515106656e-04f, +7.527297698e-05f, -1.779449298e-04f, -2.635016326e-05f, +0.000000000e+00f,\n    /*  8,15 (20) */\n    +0.000000000e+00f, -1.635511683e-03f, -8.353932478e-04f, +9.568828681e-03f, +1.394923636e-02f, -1.871030964e-02f, -5.988410345e-02f, -3.328291387e-03f, +1.922630918e-01f, +3.821422060e-01f, +3.746941041e-01f, +1.778954047e-01f, -1.140739292e-02f, -5.897628305e-02f, -1.560234585e-02f, +1.455236395e-02f, +8.755649988e-03f, -1.145826963e-03f, -1.513412023e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.041376381e-05f, -1.609547698e-04f, -4.053885229e-04f, +3.219656320e-04f, +1.563784421e-03f, +4.054954957e-04f, -4.117568163e-03f, -7.187474445e-03f, -3.619881868e-03f, +3.828220052e-03f, +7.180212602e-03f, +3.961533375e-03f, -5.023249021e-04f, -1.544179367e-03f, -2.811619537e-04f, +4.077901696e-04f, +1.494789456e-04f, -6.168589636e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.897914657e-04f, -3.337875312e-03f, -5.885981388e-03f, +6.265338243e-03f, +1.814314847e-02f, -1.267186669e-03f, -3.009985043e-02f, -1.365356354e-02f, +2.995127264e-02f, +2.795733748e-02f, -1.619243252e-02f, -2.923781198e-02f, +8.191018661e-04f, +1.813697481e-02f, +5.150047628e-03f, -6.087002051e-03f, -2.979674772e-03f, +6.573061261e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.627925413e-05f, +1.793260355e-04f, -1.090298612e-04f, -5.593077148e-04f, +1.467662789e-05f, +1.050831646e-03f, +4.056433600e-04f, -1.287046136e-03f, -9.714904984e-04f, +1.022444659e-03f, +1.251822843e-03f, -4.563950908e-04f, -1.035456889e-03f, +2.085028936e-05f, +5.559829007e-04f, +9.199080094e-05f, -1.788745052e-04f, -3.123540632e-05f, +0.000000000e+00f,\n    /*  8,16 (20) */\n    +0.000000000e+00f, -1.575097920e-03f, -9.963480176e-04f, +9.163440158e-03f, +1.427120199e-02f, -1.714652522e-02f, -5.947860795e-02f, -7.445859550e-03f, +1.850756173e-01f, +3.785223242e-01f, +3.785223242e-01f, +1.850756173e-01f, -7.445859550e-03f, -5.947860795e-02f, -1.714652522e-02f, +1.427120199e-02f, +9.163440158e-03f, -9.963480176e-04f, -1.575097920e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.168589636e-05f, -1.494789456e-04f, -4.077901696e-04f, +2.811619537e-04f, +1.544179367e-03f, +5.023249021e-04f, -3.961533375e-03f, -7.180212602e-03f, -3.828220052e-03f, +3.619881868e-03f, +7.187474445e-03f, +4.117568163e-03f, -4.054954957e-04f, -1.563784421e-03f, -3.219656320e-04f, +4.053885229e-04f, +1.609547698e-04f, -6.041376381e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.260707198e-04f, -3.158549277e-03f, -5.995011250e-03f, +5.706030529e-03f, +1.815782510e-02f, -2.163550230e-04f, -2.969420707e-02f, -1.494060968e-02f, +2.897978214e-02f, +2.897978214e-02f, -1.494060968e-02f, -2.969420707e-02f, -2.163550230e-04f, +1.815782510e-02f, +5.706030529e-03f, -5.995011250e-03f, -3.158549277e-03f, +6.260707198e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.123540632e-05f, +1.788745052e-04f, -9.199080094e-05f, -5.559829007e-04f, -2.085028936e-05f, +1.035456889e-03f, +4.563950908e-04f, -1.251822843e-03f, -1.022444659e-03f, +9.714904984e-04f, +1.287046136e-03f, -4.056433600e-04f, -1.050831646e-03f, -1.467662789e-05f, +5.593077148e-04f, +1.090298612e-04f, -1.793260355e-04f, -3.627925413e-05f, +0.000000000e+00f,\n    /*  8,17 (20) */\n    +0.000000000e+00f, -1.513412023e-03f, -1.145826963e-03f, +8.755649988e-03f, +1.455236395e-02f, -1.560234585e-02f, -5.897628305e-02f, -1.140739292e-02f, +1.778954047e-01f, +3.746941041e-01f, +3.821422060e-01f, +1.922630918e-01f, -3.328291387e-03f, -5.988410345e-02f, -1.871030964e-02f, +1.394923636e-02f, +9.568828681e-03f, -8.353932478e-04f, -1.635511683e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.266473295e-05f, -1.381535847e-04f, -4.091506342e-04f, +2.412069273e-04f, +1.522189921e-03f, +5.952060805e-04f, -3.804396343e-03f, -7.165741964e-03f, -4.031982553e-03f, +3.407207915e-03f, +7.187446327e-03f, +4.272267288e-03f, -3.047718303e-04f, -1.580891775e-03f, -3.635564707e-04f, +4.019119162e-04f, +1.725553440e-04f, -5.883766883e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.573061261e-04f, -2.979674772e-03f, -6.087002051e-03f, +5.150047628e-03f, +1.813697481e-02f, +8.191018661e-04f, -2.923781198e-02f, -1.619243252e-02f, +2.795733748e-02f, +2.995127264e-02f, -1.365356354e-02f, -3.009985043e-02f, -1.267186669e-03f, +1.814314847e-02f, +6.265338243e-03f, -5.885981388e-03f, -3.337875312e-03f, +5.897914657e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.635016326e-05f, +1.779449298e-04f, -7.527297698e-05f, -5.515106656e-04f, -5.565212027e-05f, +1.018201499e-03f, +5.057357615e-04f, -1.214351565e-03f, -1.071301879e-03f, +9.185413560e-04f, +1.319935200e-03f, -3.535754669e-04f, -1.064266684e-03f, -5.086084095e-05f, +5.614504733e-04f, +1.263548615e-04f, -1.792807772e-04f, -4.147048134e-05f, +0.000000000e+00f,\n    /*  8,18 (20) */\n    +0.000000000e+00f, -1.450747290e-03f, -1.283980548e-03f, +8.346499354e-03f, +1.479357087e-02f, -1.408015593e-02f, -5.838107697e-02f, -1.521178927e-02f, +1.707296628e-01f, +3.706621216e-01f, +3.855494140e-01f, +1.994505381e-01f, +9.439759012e-04f, -6.018887528e-02f, -2.029120142e-02f, +1.358567989e-02f, +9.970740597e-03f, -6.628379037e-04f, -1.694349352e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.336141875e-05f, -1.270030335e-04f, -4.095050584e-04f, +2.021583781e-04f, +1.497930904e-03f, +6.840926323e-04f, -3.646388934e-03f, -7.144153518e-03f, -4.230936643e-03f, +3.190444929e-03f, +7.180057102e-03f, +4.425396158e-03f, -2.002154750e-04f, -1.595389896e-03f, -4.058693476e-04f, +3.973280606e-04f, +1.842536125e-04f, -5.694747535e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.836562894e-04f, -2.801729842e-03f, -6.162275028e-03f, +4.598536962e-03f, +1.808132269e-02f, +1.837303365e-03f, -2.873207622e-02f, -1.740678408e-02f, +2.688603560e-02f, +3.086981399e-02f, -1.233362834e-02f, -3.045342590e-02f, -2.331453353e-03f, +1.809228763e-02f, +6.826788717e-03f, -5.759626527e-03f, -3.517156089e-03f, +5.483209843e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.163381083e-05f, +1.765568897e-04f, -5.890993161e-05f, -5.459277726e-04f, -8.966389948e-05f, +9.991281130e-04f, +5.535744514e-04f, -1.174723035e-03f, -1.117964965e-03f, +8.637037285e-04f, +1.350408511e-03f, -3.002900951e-04f, -1.075706652e-03f, -8.763186081e-05f, +5.623788026e-04f, +1.439288099e-04f, -1.787209045e-04f, -4.679693256e-05f, +0.000000000e+00f,\n    /*  8,19 (20) */\n    +0.000000000e+00f, -1.387385872e-03f, -1.410983581e-03f, +7.936994296e-03f, +1.499572925e-02f, -1.258222503e-02f, -5.769698434e-02f, -1.885817820e-02f, +1.635855092e-01f, +3.664311849e-01f, +3.887398589e-01f, +2.066305952e-01f, +5.369372059e-03f, -6.038909076e-02f, -2.188659131e-02f, +1.317981054e-02f, +1.036806866e-02f, -4.785842912e-04f, -1.751296828e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.378752610e-05f, -1.160502517e-04f, -4.088898222e-04f, +1.640704385e-04f, +1.471518397e-03f, +7.689456846e-04f, -3.487741094e-03f, -7.115547851e-03f, -4.424857132e-03f, +2.969846086e-03f, +7.165245829e-03f, +4.576719389e-03f, -9.189561518e-05f, -1.607169272e-03f, -4.488355540e-04f, +3.916062816e-04f, +1.960212053e-04f, -5.473362948e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.052901002e-04f, -2.625172952e-03f, -6.221184959e-03f, +4.052609190e-03f, +1.799165879e-02f, +2.836431478e-03f, -2.817850177e-02f, -1.858150712e-02f, +2.576807063e-02f, +3.173351772e-02f, -1.098321983e-02f, -3.075371600e-02f, -3.407160005e-03f, +1.800465577e-02f, +7.389167519e-03f, -5.615697717e-03f, -3.695876994e-03f, +5.015240518e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.709568934e-05f, +1.747307205e-04f, -4.293340064e-05f, -5.392729787e-04f, -1.228236045e-04f, +9.783027328e-04f, +5.998243967e-04f, -1.133032251e-03f, -1.162341705e-03f, +8.070884138e-04f, +1.378389468e-03f, -2.458895125e-04f, -1.085100116e-03f, -1.249166356e-04f, +5.620627177e-04f, +1.617130840e-04f, -1.776295889e-04f, -5.224553531e-05f, +0.000000000e+00f,\n    /*  8,20 (20) */\n    +0.000000000e+00f, -1.323598345e-03f, -1.527033833e-03f, +7.528104474e-03f, +1.515979969e-02f, -1.111070663e-02f, -5.692803865e-02f, -2.234591930e-02f, +1.564699614e-01f, +3.620063278e-01f, +3.917097050e-01f, +2.137958410e-01f, +9.946091448e-03f, -6.048098637e-02f, -2.349376059e-02f, +1.273097499e-02f, +1.075967494e-02f, -2.825630860e-04f, -1.806030457e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.395500345e-05f, -1.053167967e-04f, -4.073424191e-04f, +1.269935294e-04f, +1.443069493e-03f, +8.497338328e-04f, -3.328680481e-03f, -7.080034920e-03f, -4.613526711e-03f, +2.745670614e-03f, +7.142961946e-03f, +4.726001200e-03f, +2.011094541e-05f, -1.616122678e-03f, -4.923828488e-04f, +3.847176435e-04f, +2.078284716e-04f, -5.218721123e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.223857896e-04f, -2.450442232e-03f, -6.264118360e-03f, +3.513336211e-03f, +1.786883518e-02f, +3.814734211e-03f, -2.757867737e-02f, -1.971453937e-02f, +2.460572893e-02f, +3.254060613e-02f, -9.604830361e-03f, -3.099960551e-02f, -4.492260122e-03f, +1.787973913e-02f, +7.951230237e-03f, -5.453984633e-03f, -3.873506583e-03f, +4.492785165e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.274419075e-05f, +1.724874317e-04f, -2.737326717e-05f, -5.315868954e-04f, -1.550722645e-04f, +9.557945223e-04f, +6.444031594e-04f, -1.089378230e-03f, -1.204345068e-03f, +7.488102621e-04f, +1.403806598e-03f, -1.904793584e-04f, -1.092399722e-03f, -1.626396944e-04f, +5.604747465e-04f, +1.796675011e-04f, -1.759910779e-04f, -5.780231643e-05f, +0.000000000e+00f,\n    /*  8,21 (20) */\n    +0.000000000e+00f, -1.259643342e-03f, -1.632350630e-03f, +7.120762054e-03f, +1.528679322e-02f, -9.667637140e-03f, -5.607830482e-02f, -2.567459978e-02f, +1.493899265e-01f, +3.573928011e-01f, +3.944553756e-01f, +2.209388030e-01f, +1.467209265e-02f, -6.046087543e-02f, -2.510988326e-02f, +1.223859214e-02f, +1.114439258e-02f, -7.473461437e-05f, -1.858217668e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.387612474e-05f, -9.482281232e-05f, -4.049013318e-04f, +9.097435133e-05f, +1.412702048e-03f, +9.264330694e-04f, -3.169432113e-03f, -7.037733797e-03f, -4.796736271e-03f, +2.518183389e-03f, +7.113165414e-03f, +4.873005799e-03f, +1.357197978e-04f, -1.622145428e-03f, -5.364355200e-04f, +3.766350731e-04f, +2.196445174e-04f, -4.929998603e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.351299803e-04f, -2.277954800e-03f, -6.291491627e-03f, +2.981749316e-03f, +1.771376292e-02f, +4.770528733e-03f, -2.693427421e-02f, -2.080391760e-02f, +2.340138386e-02f, +3.328941640e-02f, -8.201023763e-03f, -3.119008487e-02f, -5.584659843e-03f, +1.771709944e-02f, +8.511704983e-03f, -5.274317132e-03f, -4.049497661e-03f, +3.914762000e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.586759214e-06f, +1.698486244e-04f, -1.225752168e-05f, -5.229118486e-04f, -1.863540588e-04f, +9.316756075e-04f, +6.872327832e-04f, -1.043863763e-03f, -1.243893395e-03f, +6.889879173e-04f, +1.426593742e-03f, -1.341684222e-04f, -1.097562356e-03f, -2.007232999e-04f, +5.575900484e-04f, +1.977503951e-04f, -1.737907723e-04f, -6.345242192e-05f, +0.000000000e+00f,\n    /*  8,22 (20) */\n    +0.000000000e+00f, -1.195767217e-03f, -1.727173442e-03f, +6.715860723e-03f, +1.537776757e-02f, -8.254935092e-03f, -5.515187175e-02f, -2.884403189e-02f, +1.423521927e-01f, +3.525960648e-01f, +3.969735590e-01f, +2.280519684e-01f, +1.954509845e-02f, -6.032515563e-02f, -2.673202869e-02f, +1.170215662e-02f, +1.152102766e-02f, +1.449099031e-04f, -1.907517654e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.356343946e-05f, -8.458702163e-05f, -4.016059088e-04f, +5.605588272e-05f, +1.380534433e-03f, +9.990266999e-04f, -3.010218017e-03f, -6.988772415e-03f, -4.974285215e-03f, +2.287654524e-03f, +7.075826854e-03f, +5.017497786e-03f, +2.548389554e-04f, -1.625135633e-03f, -5.809144570e-04f, +3.673334824e-04f, +2.314372474e-04f, -4.606445578e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.437167395e-04f, -2.108106175e-03f, -6.303749149e-03f, +2.458837467e-03f, +1.752740886e-02f, +5.702204340e-03f, -2.624704143e-02f, -2.184778136e-02f, +2.215749047e-02f, +3.397840431e-02f, -6.774430021e-03f, -3.132425329e-02f, -6.682222200e-03f, +1.751637614e-02f, +9.069295032e-03f, -5.076566737e-03f, -4.223288433e-03f, +3.280237781e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.629894786e-06f, +1.668364102e-04f, +2.387771828e-06f, -5.132917351e-04f, -2.166164074e-04f, +9.060208672e-04f, +7.282399390e-04f, -9.965951551e-04f, -1.280910578e-03f, +6.277435499e-04f, +1.446690235e-03f, -7.706841200e-05f, -1.100549303e-03f, -2.390876085e-04f, +5.533865287e-04f, +2.159186992e-04f, -1.710153017e-04f, -6.918014043e-05f, +0.000000000e+00f,\n    /*  8,23 (20) */\n    +0.000000000e+00f, -1.132203778e-03f, -1.811760464e-03f, +6.314254814e-03f, +1.543382345e-02f, -6.874400660e-03f, -5.415284505e-02f, -3.185424991e-02f, +1.353634203e-01f, +3.476217796e-01f, +3.992612135e-01f, +2.351277952e-01f, +2.456259623e-02f, -6.007031667e-02f, -2.835716432e-02f, +1.112124216e-02f, +1.188836114e-02f, +3.763471504e-04f, -1.953582110e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.302972345e-05f, -7.462672369e-05f, -3.974962422e-04f, +2.227738715e-05f, +1.346685295e-03f, +1.067505246e-03f, -2.851256896e-03f, -6.933287283e-03f, -5.145981756e-03f, +2.054358946e-03f, +7.030927663e-03f, +5.159242554e-03f, +3.773688956e-04f, -1.624994456e-03f, -6.257372305e-04f, +3.567898892e-04f, +2.431734112e-04f, -4.247390942e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.483466343e-04f, -1.941269765e-03f, -6.301361377e-03f, +1.945545732e-03f, +1.731079245e-02f, +6.608225208e-03f, -2.551880149e-02f, -2.284437652e-02f, +2.087657989e-02f, +3.460614786e-02f, -5.327739786e-03f, -3.140132170e-02f, -7.782771502e-03f, +1.727728853e-02f, +9.622681561e-03f, -4.860648038e-03f, -4.394303735e-03f, +2.588436377e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.791601960e-07f, +1.634733292e-04f, +1.653850333e-05f, -5.027718777e-04f, -2.458100504e-04f, +8.789077206e-04f, +7.673560558e-04f, -9.476819635e-04f, -1.315326220e-03f, +5.652025795e-04f, +1.464041066e-03f, -1.929371400e-05f, -1.101326377e-03f, -2.776508377e-04f, +5.478449469e-04f, +2.341280336e-04f, -1.676525981e-04f, -7.496893016e-05f, +0.000000000e+00f,\n    /*  8,24 (20) */\n    +0.000000000e+00f, -1.069174054e-03f, -1.886387187e-03f, +5.916758572e-03f, +1.545610084e-02f, -5.527715365e-03f, -5.308533981e-02f, -3.470550680e-02f, +1.284301330e-01f, +3.424757978e-01f, +4.013155724e-01f, +2.421587229e-01f, +2.972183879e-02f, -5.969294778e-02f, -2.998215878e-02f, +1.049550493e-02f, +1.224515103e-02f, +6.195205617e-04f, -1.996056020e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.228793068e-05f, -6.495779442e-05f, -3.926130473e-04f, -1.032557166e-05f, +1.311273318e-03f, +1.131866336e-03f, -2.692763799e-03f, -6.871423201e-03f, -5.311643185e-03f, +1.818575967e-03f, +6.978460109e-03f, +5.298006690e-03f, +5.032026181e-04f, -1.621626369e-03f, -6.708181825e-04f, +3.449835367e-04f, +2.548186554e-04f, -3.852247275e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.492257945e-04f, -1.777796436e-03f, -6.284822874e-03f, +1.442773854e-03f, +1.706498240e-02f, +7.487132928e-03f, -2.475144544e-02f, -2.379205848e-02f, +1.956125367e-02f, +3.517135044e-02f, -3.863698720e-03f, -3.142061541e-02f, -8.884097880e-03f, +1.699963769e-02f, +1.017052651e-02f, -4.626520004e-03f, -4.561956333e-03f, +1.838747075e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.660809337e-06f, +1.597822697e-04f, +3.017253819e-05f, -4.913988792e-04f, -2.738891182e-04f, +8.504159104e-04f, +8.045174409e-04f, -8.972367241e-04f, -1.347075783e-03f, +5.014933909e-04f, +1.478597032e-03f, +3.903885532e-05f, -1.099864065e-03f, -3.163294421e-04f, +5.409490196e-04f, +2.523327995e-04f, -1.636919669e-04f, -8.080144936e-05f, +0.000000000e+00f,\n    /*  8,25 (20) */\n    +0.000000000e+00f, -1.006886124e-03f, -1.951344982e-03f, +5.524145524e-03f, +1.544577527e-02f, -4.216442048e-03f, -5.195347347e-02f, -3.739827060e-02f, +1.215587098e-01f, +3.371641547e-01f, +4.031341484e-01f, +2.491371830e-01f, +3.501984548e-02f, -5.918974516e-02f, -3.160378515e-02f, +9.824686748e-03f, +1.259013456e-02f, +8.743392170e-04f, -2.034578492e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.135114594e-05f, -5.559469128e-05f, -3.869975437e-04f, -4.172110693e-05f, +1.274416991e-03f, +1.192114586e-03f, -2.534949799e-03f, -6.803332954e-03f, -5.471096141e-03f, +1.580588841e-03f, +6.918427409e-03f, +5.433558380e-03f, +6.322257162e-04f, -1.614939401e-03f, -7.160685252e-04f, +3.318960101e-04f, +2.663375779e-04f, -3.420515739e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.465649852e-04f, -1.618014166e-03f, -6.254650335e-03f, +9.513749750e-04f, +1.679109329e-02f, +8.337548839e-03f, -2.394692800e-02f, -2.468929520e-02f, +1.821417788e-02f, +3.567284383e-02f, -2.385101688e-03f, -3.138157656e-02f, -9.983961945e-03f, +1.668330825e-02f, +1.071147553e-02f, -4.374187205e-03f, -4.725648300e-03f, +1.030732582e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.986293400e-06f, +1.557863887e-04f, +4.326973245e-05f, -4.792204753e-04f, -3.008111924e-04f, +8.206272825e-04f, +8.396653856e-04f, -8.453746769e-04f, -1.376100729e-03f, +4.367470415e-04f, +1.490314875e-03f, +9.781030550e-05f, -1.096137638e-03f, -3.550382947e-04f, +5.326855166e-04f, +2.704862783e-04f, -1.591241558e-04f, -8.665959027e-05f, +0.000000000e+00f,\n    /*  8,26 (20) */\n    +0.000000000e+00f, -9.455349777e-04f, -2.006939673e-03f, +5.137147981e-03f, +1.540405416e-02f, -2.942025056e-03f, -5.076135888e-02f, -3.993322040e-02f, +1.147553768e-01f, +3.316930585e-01f, +4.047147373e-01f, +2.560556104e-01f, +4.045340386e-02f, -5.855751944e-02f, -3.321872455e-02f, +9.108618223e-03f, +1.292203057e-02f, +1.140676795e-03f, -2.068783650e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.023253879e-05f, -4.655046160e-05f, -3.806913382e-04f, -7.188097839e-05f, +1.236234382e-03f, +1.248261464e-03f, -2.378021695e-03f, -6.729177001e-03f, -5.624176851e-03f, +1.340684321e-03f, +6.850843792e-03f, +5.565667816e-03f, +7.643164645e-04f, -1.604845391e-03f, -7.613964480e-04f, +3.175113510e-04f, +2.776937890e-04f, -2.951790863e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.405786918e-04f, -1.462227778e-03f, -6.211380603e-03f, +4.721544996e-04f, +1.649028209e-02f, +9.158176121e-03f, -2.310726261e-02f, -2.553466988e-02f, +1.683807716e-02f, +3.610959088e-02f, -8.947868130e-04f, -3.128376625e-02f, -1.108009958e-02f, +1.632826996e-02f, +1.124416104e-02f, -4.103700926e-03f, -4.884772455e-03f, +1.641366791e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.094470904e-06f, +1.515090324e-04f, +5.581194207e-05f, -4.662853874e-04f, -3.265373564e-04f, +7.896255635e-04f, +8.727462592e-04f, -7.922134833e-04f, -1.402348631e-03f, +3.710969634e-04f, +1.499157406e-03f, +1.568997351e-04f, -1.090127269e-03f, -3.936908756e-04f, +5.230443508e-04f, +2.885407354e-04f, -1.539414209e-04f, -9.252451654e-05f, +0.000000000e+00f,\n    /*  8,27 (20) */\n    +0.000000000e+00f, -8.853024389e-04f, -2.053490135e-03f, +4.756456642e-03f, +1.533217318e-02f, -1.705790674e-03f, -4.951309742e-02f, -4.231124210e-02f, +1.080261998e-01f, +3.260688817e-01f, +4.060554216e-01f, +2.629064542e-01f, +4.601907167e-02f, -5.779320298e-02f, -3.482356994e-02f, +8.347221775e-03f, +1.323954193e-02f, +1.418370584e-03f, -2.098301558e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.894531858e-05f, -3.783675462e-05f, -3.737363107e-04f, -1.007805544e-04f, +1.196842908e-03f, +1.300325148e-03f, -2.222181709e-03f, -6.649123146e-03f, -5.770731354e-03f, +1.099152205e-03f, +6.775734534e-03f, +5.694107605e-03f, +8.993459211e-04f, -1.591260231e-03f, -8.067072348e-04f, +3.018161692e-04f, +2.888499750e-04f, -2.445765210e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.314842209e-04f, -1.310718745e-03f, -6.155568661e-03f, +5.869112213e-06f, +1.616374474e-02f, +9.947801685e-03f, -2.223451635e-02f, -2.632688336e-02f, +1.543572852e-02f, +3.648068784e-02f, +6.043705926e-04f, -3.112686652e-02f, -1.217022685e-02f, +1.593457908e-02f, +1.176720539e-02f, -3.815160191e-03f, -5.038713876e-03f, -7.611084864e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.198340192e-05f, +1.469736598e-04f, +6.778302618e-05f, -4.526431748e-04f, -3.510322360e-04f, +7.574961350e-04f, +9.037115885e-04f, -7.378729408e-04f, -1.425773284e-03f, +3.046786581e-04f, +1.505093613e-03f, +2.161846012e-04f, -1.081818129e-03f, -4.321994666e-04f, +5.120186609e-04f, +3.064475298e-04f, -1.481375893e-04f, -9.837670411e-05f, +0.000000000e+00f,\n    /*  8,28 (20) */\n    +0.000000000e+00f, -8.263571204e-04f, -2.091326889e-03f, +4.382720332e-03f, +1.523139263e-02f, -5.089477662e-04f, -4.821277227e-02f, -4.453342381e-02f, +1.013770767e-01f, +3.202981503e-01f, +4.071545738e-01f, +2.696821888e-01f, +5.171317928e-02f, -5.689385706e-02f, -3.641483017e-02f, +7.540514540e-03f, +1.354135809e-02f, +1.707220559e-03f, -2.122759210e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.750269101e-05f, -2.946383688e-05f, -3.661745017e-04f, -1.283987668e-04f, +1.156359128e-03f, +1.348330372e-03f, -2.067627203e-03f, -6.563346201e-03f, -5.910615717e-03f, +8.562848755e-04f, +6.693135983e-03f, +5.818653167e-03f, +1.037178045e-03f, -1.574104112e-03f, -8.519033891e-04f, +2.847997507e-04f, +2.997679676e-04f, -1.902233903e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.195008189e-04f, -1.163745085e-03f, -6.087785635e-03f, -4.467740626e-04f, +1.581271250e-02f, +1.070529782e-02f, -2.133080476e-02f, -2.706475631e-02f, +1.400995524e-02f, +3.678536650e-02f, +2.109464205e-03f, -3.091068192e-02f, -1.325204498e-02f, +1.550237961e-02f, +1.227922406e-02f, -3.508712661e-03f, -5.186851466e-03f, -1.744875527e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.465200696e-05f, +1.422037663e-04f, +7.916884454e-05f, -4.383440878e-04f, -3.742640308e-04f, +7.243258077e-04f, +9.325181251e-04f, -6.824746924e-04f, -1.446334796e-03f, +2.376293875e-04f, +1.508098759e-03f, +2.755409949e-04f, -1.071200476e-03f, -4.704753514e-04f, +4.996048872e-04f, +3.241572278e-04f, -1.417081185e-04f, -1.041959854e-04f, +0.000000000e+00f,\n    /*  8,29 (20) */\n    +0.000000000e+00f, -7.688544293e-04f, -2.120790726e-03f, +4.016545830e-03f, +1.510299386e-02f, +6.474113621e-04f, -4.686444190e-02f, -4.660105101e-02f, +9.481373048e-02f, +3.143875346e-01f, +4.080108587e-01f, +2.763753247e-01f, +5.753183244e-02f, -5.585667901e-02f, -3.798893429e-02f, +6.688611151e-03f, +1.382615785e-02f, +2.006988527e-03f, -2.141781549e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.591781592e-05f, -2.144061112e-05f, -3.580480029e-04f, -1.547180591e-04f, +1.114898525e-03f, +1.392308263e-03f, -1.914550414e-03f, -6.472027641e-03f, -6.043696216e-03f, +6.123768384e-04f, +6.603095559e-03f, +5.939083145e-03f, +1.177669827e-03f, -1.553301759e-03f, -8.968847683e-04f, +2.664541626e-04f, +3.104088166e-04f, -1.321098992e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.048488120e-04f, -1.021541319e-03f, -6.008616790e-03f, -8.851181504e-04f, +1.543844847e-02f, +1.142962363e-02f, -2.039828664e-02f, -2.774723100e-02f, +1.256362044e-02f, +3.702299588e-02f, +3.617562964e-03f, -3.063514092e-02f, -1.432324546e-02f, +1.503190426e-02f, +1.277882894e-02f, -3.184555433e-03f, -5.328559584e-03f, -2.786835381e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.710004392e-05f, +1.372228099e-04f, +8.995724925e-05f, -4.234389215e-04f, -3.962045354e-04f, +6.902025932e-04f, +9.591278986e-04f, -6.261419350e-04f, -1.463999657e-03f, +1.700878596e-04f, +1.508154461e-03f, +3.348439216e-04f, -1.058269733e-03f, -5.084290207e-04f, +4.858028393e-04f, +3.416197214e-04f, -1.346501531e-04f, -1.099615968e-04f, +0.000000000e+00f,\n    /*  8,30 (20) */\n    +0.000000000e+00f, -7.129366134e-04f, -2.142231337e-03f, +3.658497827e-03f, +1.494827580e-02f, +1.762309887e-03f, -4.547213364e-02f, -4.851560142e-02f, +8.834170284e-02f, +3.083438384e-01f, +4.086232355e-01f, +2.829784203e-01f, +6.347091559e-02f, -5.467900918e-02f, -3.954223604e-02f, +5.791726383e-03f, +1.409261201e-02f, +2.317397343e-03f, -2.154992539e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.420376676e-05f, -1.377463820e-05f, -3.493988511e-04f, -1.797243282e-04f, +1.072575305e-03f, +1.432296160e-03f, -1.763138187e-03f, -6.375355250e-03f, -6.169849517e-03f, +3.677242540e-04f, +6.505671737e-03f, +6.055179807e-03f, +1.320671441e-03f, -1.528782666e-03f, -9.415487266e-04f, +2.467743542e-04f, +3.207328672e-04f, -7.023736503e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.877487681e-04f, -8.843185093e-04f, -5.918659541e-03f, -1.308557072e-03f, +1.504224393e-02f, +1.211982622e-02f, -1.943915874e-02f, -2.837337293e-02f, +1.109962079e-02f, +3.719308374e-02f, +5.125717425e-03f, -3.030029700e-02f, -1.538151519e-02f, +1.452347524e-02f, +1.326463178e-02f, -2.842935712e-03f, -5.463209737e-03f, -3.886451349e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.932808259e-05f, +1.320541391e-04f, +1.001380708e-04f, -4.079788706e-04f, -4.168291511e-04f, +6.552154762e-04f, +9.835082565e-04f, -5.689991241e-04f, -1.478740802e-03f, +1.021939107e-04f, +1.505248756e-03f, +3.939675859e-04f, -1.043026549e-03f, -5.459703823e-04f, +4.706157560e-04f, +3.587843512e-04f, -1.269625761e-04f, -1.156522294e-04f, +0.000000000e+00f,\n    /*  8,31 (20) */\n    +0.000000000e+00f, -6.587328467e-04f, -2.156005975e-03f, +3.309098976e-03f, +1.476855147e-02f, +2.834885193e-03f, -4.403983748e-02f, -5.027873961e-02f, +8.196634759e-02f, +3.021739889e-01f, +4.089909597e-01f, +2.894840920e-01f, +6.952609540e-02f, -5.335833774e-02f, -4.107101871e-02f, +4.850177656e-03f, +1.433938636e-02f, +2.638130210e-03f, -2.162016276e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.237349152e-05f, -6.472162169e-06f, -3.402689242e-04f, -2.034068588e-04f, +1.029502197e-03f, +1.468337442e-03f, -1.613571734e-03f, -6.273522751e-03f, -6.288962822e-03f, +1.226244669e-04f, +6.400934007e-03f, +6.166729441e-03f, +1.466026399e-03f, -1.500481324e-03f, -9.857902663e-04f, +2.257582532e-04f, +3.306998416e-04f, -4.618617492e-07f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.684206855e-04f, -7.522643702e-04f, -5.818521470e-03f, -1.716535943e-03f, +1.462541478e-02f, +1.277504170e-02f, -1.845565048e-02f, -2.894237206e-02f, +9.620879985e-03f, +3.729527765e-02f, +6.630966181e-03f, -2.990632942e-02f, -1.642454174e-02f, +1.397750486e-02f, +1.373524754e-02f, -2.484151361e-03f, -5.590172313e-03f, -5.042973643e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.133747723e-05f, +1.267209228e-04f, +1.097030990e-04f, -3.920153858e-04f, -4.361168879e-04f, +6.194541872e-04f, +1.005631891e-03f, -5.111716778e-04f, -1.490537654e-03f, +3.408818562e-05f, +1.499376150e-03f, +4.527856805e-04f, -1.025476853e-03f, -5.830089752e-04f, +4.540503574e-04f, +3.756000324e-04f, -1.186460577e-04f, -1.212460831e-04f, +0.000000000e+00f,\n    /*  9, 0 (20) */\n    +0.000000000e+00f, -2.788021585e-03f, -2.739988319e-03f, +1.245659329e-02f, +1.805368529e-02f, -2.917700415e-02f, -6.934232994e-02f, +4.623928110e-02f, +3.040153684e-01f, +4.464429501e-01f, +3.040153684e-01f, +4.623928110e-02f, -6.934232994e-02f, -2.917700415e-02f, +1.805368529e-02f, +1.245659329e-02f, -2.739988319e-03f, -2.788021585e-03f, +4.072385311e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.217079448e-04f, -2.120537838e-04f, -6.013582856e-04f, +5.317399089e-04f, +2.083490300e-03f, -4.405495465e-04f, -6.619515121e-03f, -7.900310157e-03f, -1.567126525e-04f, +7.779500476e-03f, +6.784694429e-03f, +6.079398431e-04f, -2.087791629e-03f, -5.933853095e-04f, +5.954222446e-04f, +2.305658252e-04f, -1.202487606e-04f, -3.103601429e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.788021585e-03f, -6.954497747e-04f, -9.513451793e-03f, +2.287479789e-03f, +2.102105089e-02f, -2.915564891e-03f, -3.246879931e-02f, +1.360596461e-03f, +3.732936584e-02f, +1.360596461e-03f, -3.246879931e-02f, -2.915564891e-03f, +2.102105089e-02f, +2.287479789e-03f, -9.513451793e-03f, -6.954497747e-04f, +2.466267758e-03f, -4.072385311e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.217079448e-04f, +2.791298664e-04f, +8.987193298e-05f, -7.470938414e-04f, -8.255078474e-05f, +1.321526365e-03f, +6.339450830e-05f, -1.728195928e-03f, -4.405076371e-05f, +1.732279086e-03f, +1.405178167e-05f, -1.331931790e-03f, +3.088857861e-05f, +7.592913089e-04f, -6.557991726e-05f, -2.884591603e-04f, +6.119626725e-05f, +3.103601429e-05f, +0.000000000e+00f,\n    /*  9, 1 (20) */\n    +0.000000000e+00f, -2.666313640e-03f, -2.952042103e-03f, +1.185523500e-02f, +1.858542519e-02f, -2.709351385e-02f, -6.978287948e-02f, +3.961976598e-02f, +2.961150582e-01f, +4.462862374e-01f, +3.117948688e-01f, +5.302397553e-02f, -6.873439009e-02f, -3.126479578e-02f, +1.746029998e-02f, +1.305201553e-02f, -2.509422494e-03f, -2.908270346e-03f, +9.687838816e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.226759659e-04f, -1.937702911e-04f, -6.055587053e-04f, +4.709329705e-04f, +2.074753048e-03f, -2.776448918e-04f, -6.449147393e-03f, -8.010920493e-03f, -4.699181647e-04f, +7.648590319e-03f, +6.944354374e-03f, +7.796299310e-04f, -2.087511637e-03f, -6.557461540e-04f, +5.877031988e-04f, +2.492607803e-04f, -1.182795009e-04f, -3.487568417e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.666313640e-03f, -4.163199083e-04f, -9.423579860e-03f, +1.540385947e-03f, +2.093850011e-02f, -1.594038526e-03f, -3.240540481e-02f, -3.675994675e-04f, +3.728531508e-02f, +3.092875547e-03f, -3.245474753e-02f, -4.247496681e-03f, +2.105193947e-02f, +3.046771098e-03f, -9.579031710e-03f, -9.839089351e-04f, +2.527464025e-03f, -9.687838816e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.226759659e-04f, +2.692234406e-04f, +1.132138829e-04f, -7.331134341e-04f, -1.331115381e-04f, +1.307865322e-03f, +1.400484287e-04f, -1.719817145e-03f, -1.320370426e-04f, +1.732039536e-03f, +9.209013332e-05f, -1.339014882e-03f, -2.174754707e-05f, +7.696325503e-04f, -4.038933415e-05f, -2.971603546e-04f, +5.453398286e-05f, +3.487568417e-05f, +0.000000000e+00f,\n    /*  9, 2 (20) */\n    +0.000000000e+00f, -2.543637674e-03f, -3.145812394e-03f, +1.124967630e-02f, +1.905635816e-02f, -2.501876080e-02f, -7.006052437e-02f, +3.317061859e-02f, +2.881041377e-01f, +4.458163192e-01f, +3.194434592e-01f, +5.996832990e-02f, -6.795476016e-02f, -3.335230742e-02f, +1.680455382e-02f, +1.363971873e-02f, -2.260161714e-03f, -3.026549847e-03f, -2.518784535e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.231725867e-04f, -1.757586635e-04f, -6.080738841e-04f, +4.110819289e-04f, +2.061730780e-03f, -1.194000942e-04f, -6.273927067e-03f, -8.111250020e-03f, -7.824646979e-04f, +7.507695873e-03f, +7.098169576e-03f, +9.554225158e-04f, -2.082510856e-03f, -7.186939899e-04f, +5.781569807e-04f, +2.680907537e-04f, -1.157821988e-04f, -3.881777201e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.543637674e-03f, -1.470964677e-04f, -9.310365977e-03f, +8.072725131e-04f, +2.080538857e-02f, -2.861732041e-04f, -3.226535638e-02f, -2.087416613e-03f, +3.715327803e-02f, +4.824915084e-03f, -3.236265740e-02f, -5.586511563e-03f, +2.103019192e-02f, +3.816403648e-03f, -9.619421045e-03f, -1.281069290e-03f, +2.581998008e-03f, +2.518784535e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.231725867e-04f, +2.587914125e-04f, +1.355584979e-04f, -7.174273497e-04f, -1.824483844e-04f, +1.291023805e-03f, +2.157133115e-04f, -1.707181490e-03f, -2.196779041e-04f, +1.727461982e-03f, +1.705171546e-04f, -1.342717643e-03f, -7.522529786e-05f, +7.780485578e-04f, -1.435583036e-05f, -3.051832409e-04f, +4.735383549e-05f, +3.881777201e-05f, +0.000000000e+00f,\n    /*  9, 3 (20) */\n    +0.000000000e+00f, -2.420465088e-03f, -3.321571058e-03f, +1.064160241e-02f, +1.946744009e-02f, -2.295703002e-02f, -7.017992447e-02f, +2.689669152e-02f, +2.799928877e-01f, +4.450338545e-01f, +3.269511550e-01f, +6.706649948e-02f, -6.699933765e-02f, -3.543481827e-02f, +1.608585983e-02f, +1.421787571e-02f, -1.992070960e-03f, -3.142332045e-03f, -6.400561736e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.232183244e-04f, -1.580598491e-04f, -6.089569785e-04f, +3.522985019e-04f, +2.044579463e-03f, +3.402243142e-05f, -6.094194162e-03f, -8.201234742e-03f, -1.093914263e-03f, +7.356950513e-03f, +7.245820893e-03f, +1.135109078e-03f, -2.072656180e-03f, -7.820950974e-04f, +5.667428546e-04f, +2.870056572e-04f, -1.127399294e-04f, -4.285068405e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.420465088e-03f, +1.116949448e-04f, -9.174807479e-03f, +8.984516335e-05f, +2.062294019e-02f, +1.004850601e-03f, -3.204964307e-02f, -3.794598103e-03f, +3.693360013e-02f, +6.552377066e-03f, -3.219214025e-02f, -6.929229206e-03f, +2.095496663e-02f, +4.594452206e-03f, -9.633776875e-03f, -1.586252531e-03f, +2.629351844e-03f, +6.400561736e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.232183244e-04f, +2.478856778e-04f, +1.568628027e-04f, -7.001165165e-04f, -2.304442459e-04f, +1.271085084e-03f, +2.901966692e-04f, -1.690339236e-03f, -3.067441618e-04f, +1.718542995e-03f, +2.491269374e-04f, -1.342991048e-03f, -1.294079547e-04f, +7.844748965e-04f, +1.246089578e-05f, -3.124785706e-04f, +3.966422846e-05f, +4.285068405e-05f, +0.000000000e+00f,\n    /*  9, 4 (20) */\n    +0.000000000e+00f, -2.297246763e-03f, -3.479630907e-03f, +1.003264543e-02f, +1.981973860e-02f, -2.091245056e-02f, -7.014590204e-02f, +2.080249736e-02f, +2.717916530e-01f, +4.439399403e-01f, +3.343081056e-01f, +7.431232037e-02f, -6.586422857e-02f, -3.750747445e-02f, +1.530376473e-02f, +1.478461857e-02f, -1.705065303e-03f, -3.255071975e-03f, -1.068563014e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.228343562e-04f, -1.407123858e-04f, -6.082636990e-04f, +2.946885739e-04f, +2.023459698e-03f, +1.824722076e-04f, -5.910292206e-03f, -8.280828147e-03f, -1.403830863e-03f, +7.196504639e-03f, +7.386996087e-03f, +1.318470120e-03f, -2.057821283e-03f, -8.458106722e-04f, +5.534237292e-04f, +3.059532845e-04f, -1.091369052e-04f, -4.696191667e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.297246763e-03f, +3.595806226e-04f, -9.017944677e-03f, -6.102713531e-04f, +2.039249594e-02f, +2.275935685e-03f, -3.175944640e-02f, -5.484937339e-03f, +3.662685597e-02f, +8.270920061e-03f, -3.194301331e-02f, -8.272220254e-03f, +2.082555867e-02f, +5.378927102e-03f, -9.621315979e-03f, -1.898731101e-03f, +2.669016072e-03f, +1.068563014e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.228343562e-04f, +2.365583057e-04f, +1.770881657e-04f, -6.812652106e-04f, -2.769876987e-04f, +1.248140225e-03f, +3.633107207e-04f, -1.669351991e-03f, -3.930082645e-04f, +1.705291065e-03f, +3.277116368e-04f, -1.339795282e-03f, -1.841547287e-04f, +7.888519877e-04f, +3.999720662e-05f, -3.189982554e-04f, +3.147584400e-05f, +4.696191667e-05f, +0.000000000e+00f,\n    /*  9, 5 (20) */\n    +0.000000000e+00f, -2.174412407e-03f, -3.620343293e-03f, +9.424381734e-03f, +2.011442717e-02f, -1.888899086e-02f, -6.996342983e-02f, +1.489220515e-02f, +2.635108248e-01f, +4.425361094e-01f, +3.415046102e-01f, +8.169931646e-02f, -6.454575845e-02f, -3.956529574e-02f, +1.445795406e-02f, +1.533804229e-02f, -1.399112018e-03f, -3.364208880e-03f, -1.538182181e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.220424252e-04f, -1.237523680e-04f, -6.060520864e-04f, +2.383520973e-04f, +1.998536266e-03f, +3.258108042e-04f, -5.722567552e-03f, -8.350001198e-03f, -1.711781284e-03f, +7.026525481e-03f, +7.521390485e-03f, +1.505275436e-03f, -2.037887028e-03f, -9.096970252e-04f, +5.381663658e-04f, +3.248793961e-04f, -1.049585708e-04f, -5.113806788e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.174412407e-03f, +5.961389283e-04f, -8.840856511e-03f, -1.291536564e-03f, +2.011550824e-02f, +3.524075909e-03f, -3.139613568e-02f, -7.154289331e-03f, +3.623384770e-02f, +9.976211126e-03f, -3.161530167e-02f, -9.612015537e-03f, +2.064140394e-02f, +6.167779090e-03f, -9.581318772e-03f, -2.217729357e-03f, +2.700491916e-03f, +1.538182181e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.220424252e-04f, +2.248613507e-04f, +1.962003325e-04f, -6.609607334e-04f, -3.219732290e-04f, +1.222287742e-03f, +4.348728983e-04f, -1.644292481e-03f, -4.782449426e-04f, +1.687726605e-03f, +4.060620597e-04f, -1.333099948e-03f, -2.393211330e-04f, +7.911253806e-04f, +6.818565330e-05f, -3.246955684e-04f, +2.280166760e-05f, +5.113806788e-05f, +0.000000000e+00f,\n    /*  9, 6 (20) */\n    +0.000000000e+00f, -2.052369982e-03f, -3.744095661e-03f, +8.818329648e-03f, +2.035277927e-02f, -1.689045460e-02f, -6.963761902e-02f, +9.169637602e-03f, +2.551608236e-01f, +4.408243281e-01f, +3.485311357e-01f, +8.922070695e-02f, -6.304048301e-02f, -4.160318276e-02f, +1.354825704e-02f, +1.587620866e-02f, -1.074232622e-03f, -3.469167451e-03f, -2.049562860e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.208647477e-04f, -1.072134221e-04f, -6.023822883e-04f, +1.833830086e-04f, +1.969977696e-03f, +4.639119216e-04f, -5.531368685e-03f, -8.408742284e-03f, -2.017335882e-03f, +6.847196870e-03f, +7.648707631e-03f, +1.695284414e-03f, -2.012741869e-03f, -9.736057991e-04f, +5.209415823e-04f, +3.437278112e-04f, -1.001916974e-04f, -5.536485254e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.052369982e-03f, +8.210002790e-04f, -8.644656178e-03f, -1.952497297e-03f, +1.979353501e-02f, +4.746363651e-03f, -3.096126278e-02f, -8.798581812e-03f, +3.575560276e-02f, +1.166393773e-02f, -3.120923961e-02f, -1.094511548e-02f, +2.040208281e-02f, +6.958904470e-03f, -9.513133119e-03f, -2.542424925e-03f, +2.723293584e-03f, +2.049562860e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.208647477e-04f, +2.128466679e-04f, +2.141694439e-04f, -6.392930840e-04f, -3.653014671e-04f, +1.193633229e-03f, +5.047063370e-04f, -1.615244300e-03f, -5.622318479e-04f, +1.665881937e-03f, +4.839682608e-04f, -1.322884248e-03f, -2.947593716e-04f, +7.912460132e-04f, +9.695511913e-05f, -3.295253456e-04f, +1.365700397e-05f, +5.536485254e-05f, +0.000000000e+00f,\n    /*  9, 7 (20) */\n    +0.000000000e+00f, -1.931505234e-03f, -3.851309083e-03f, +8.215947360e-03f, +2.053616228e-02f, -1.492047690e-02f, -6.917370710e-02f, +3.638268917e-03f, +2.467520813e-01f, +4.388069922e-01f, +3.553783325e-01f, +9.686941458e-02f, -6.134519860e-02f, -4.361592463e-02f, +1.257465124e-02f, +1.639715024e-02f, -7.305048110e-04f, -3.569359148e-03f, -2.603211385e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.193239221e-04f, -9.112668851e-05f, -5.973163362e-04f, +1.298691629e-04f, +1.937955811e-03f, +5.966614467e-04f, -5.337045545e-03f, -8.457057141e-03f, -2.320069358e-03f, +6.658718969e-03f, +7.768659925e-03f, +1.888246358e-03f, -1.982282247e-03f, -1.037384200e-03f, +5.017244508e-04f, +3.624405091e-04f, -9.482447532e-05f, -5.962712134e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.931505234e-03f, +1.033846947e-03f, -8.430486735e-03f, -2.591790381e-03f, +1.942823355e-02f, +5.939996881e-03f, -3.045655644e-02f, -1.041382611e-02f, +3.519337091e-02f, +1.332981967e-02f, -3.072527135e-02f, -1.226799973e-02f, +2.010732344e-02f, +7.750150484e-03f, -9.416178000e-03f, -2.871950271e-03f, +2.736950588e-03f, +2.603211385e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.193239221e-04f, +2.005657339e-04f, +2.309700388e-04f, -6.163546279e-04f, -4.068794000e-04f, +1.162288975e-03f, +5.726403428e-04f, -1.582301631e-03f, -6.447501854e-04f, +1.639801227e-03f, +5.612201445e-04f, -1.309137140e-03f, -3.503187417e-04f, +7.891704580e-04f, +1.262309784e-04f, -3.334441850e-04f, +4.059484342e-06f, +5.962712134e-05f, +0.000000000e+00f,\n    /*  9, 8 (20) */\n    +0.000000000e+00f, -1.812181312e-03f, -3.942435771e-03f, +7.618631023e-03f, +2.066603144e-02f, -1.298252109e-02f, -6.857704566e-02f, -1.698776629e-03f, +2.382950242e-01f, +4.364869229e-01f, +3.620370515e-01f, +1.046380745e-01f, -5.945695224e-02f, -4.559820688e-02f, +1.153726704e-02f, +1.689887469e-02f, -3.680643019e-04f, -3.664183623e-03f, -3.199482598e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.174428396e-04f, -7.552081317e-05f, -5.909179227e-04f, +7.789228352e-05f, +1.902645294e-03f, +7.239574817e-04f, -5.139948840e-03f, -8.494968729e-03f, -2.619561526e-03f, +6.461307976e-03f, +7.880969246e-03f, +2.083900841e-03f, -1.946412967e-03f, -1.100875244e-03f, +4.804944906e-04f, +3.809577389e-04f, -8.884660549e-05f, -6.390888365e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.812181312e-03f, +1.234412681e-03f, -8.199516696e-03f, -3.208145009e-03f, +1.902135415e-02f, +7.102285855e-03f, -2.988391610e-02f, -1.199612774e-02f, +3.454862073e-02f, +1.496962089e-02f, -3.016405121e-02f, -1.357713687e-02f, +1.975700470e-02f, +8.539320942e-03f, -9.289947022e-03f, -3.205394456e-03f, +2.741010072e-03f, +3.199482598e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.174428396e-04f, +1.880694730e-04f, +2.465810426e-04f, -5.922397644e-04f, -4.466205602e-04f, +1.128373559e-03f, +6.385108396e-04f, -1.545568935e-03f, -7.255853330e-04f, +1.609540390e-03f, +6.376080704e-04f, -1.291857461e-03f, -4.058460523e-04f, +7.848611546e-04f, +1.559352700e-04f, -3.364106453e-04f, -5.970935089e-06f, +6.390888365e-05f, +0.000000000e+00f,\n    /*  9, 9 (20) */\n    +0.000000000e+00f, -1.694738472e-03f, -4.017956584e-03f, +7.027713101e-03f, +2.074392372e-02f, -1.107987579e-02f, -6.785308817e-02f, -6.838725469e-03f, +2.298000555e-01f, +4.338673614e-01f, +3.684983595e-01f, +1.125190437e-01f, -5.737305140e-02f, -4.754461985e-02f, +1.043639179e-02f, +1.737936918e-02f, +1.289343693e-05f, -3.753030229e-03f, -3.838571435e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.152445962e-04f, -6.042194565e-05f, -5.832521816e-04f, +2.752792830e-05f, +1.864223241e-03f, +8.457103473e-04f, -4.940429374e-03f, -8.522517089e-03f, -2.915398074e-03f, +6.255195794e-03f, +7.985367570e-03f, +2.281978078e-03f, -1.905047567e-03f, -1.163918025e-03f, +4.572358524e-04f, +3.992181370e-04f, -8.224938858e-05f, -6.819333424e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.694738472e-03f, +1.422482154e-03f, -7.952935653e-03f, -3.800384773e-03f, +1.857473359e-02f, +8.230659415e-03f, -2.924540526e-02f, -1.354169668e-02f, +3.382303539e-02f, +1.657916129e-02f, -2.952644314e-02f, -1.486899433e-02f, +1.935115864e-02f, +9.324182096e-03f, -9.134011752e-03f, -3.541805101e-03f, +2.735039137e-03f, +3.838571435e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.152445962e-04f, +1.754080893e-04f, +2.609857401e-04f, -5.670445928e-04f, -4.844451928e-04f, +1.092011438e-03f, +7.021607935e-04f, -1.505160608e-03f, -8.045274491e-04f, +1.575166969e-03f, +7.129234617e-04f, -1.271054027e-03f, -4.611860537e-04f, +7.782866263e-04f, +1.859868858e-04f, -3.383854403e-04f, -1.641198385e-05f, +6.819333424e-05f, +0.000000000e+00f,\n    /*  9,10 (20) */\n    +0.000000000e+00f, -1.579493876e-03f, -4.078378530e-03f, +6.444460919e-03f, +2.077145165e-02f, -9.215652553e-03f, -6.700737783e-02f, -1.177915484e-02f, +2.212775384e-01f, +4.309519633e-01f, +3.747535553e-01f, +1.205044113e-01f, -5.509107332e-02f, -4.944966741e-02f, +9.272473769e-03f, +1.783660504e-02f, +4.121115739e-04f, -3.835279617e-03f, -4.520504777e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.127524080e-04f, -4.585374517e-05f, -5.743854683e-04f, -2.115452835e-05f, +1.822868728e-03f, +9.618425585e-04f, -4.738837376e-03f, -8.539759156e-03f, -3.207171306e-03f, +6.040629666e-03f, +8.081597560e-03f, +2.482199329e-03f, -1.858108677e-03f, -1.226347989e-03f, +4.319374973e-04f, +4.171588535e-04f, -7.502581213e-05f, -7.246288396e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.579493876e-03f, +1.597890243e-03f, -7.691949913e-03f, -4.367429366e-03f, +1.809028839e-02f, +9.322670852e-03f, -2.854324447e-02f, -1.504685729e-02f, +3.301850795e-02f, +1.815432825e-02f, -2.881351967e-02f, -1.614004836e-02f, +1.888997259e-02f, +1.010246872e-02f, -8.948024866e-03f, -3.880190541e-03f, +2.718627153e-03f, +4.520504777e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.127524080e-04f, +1.626309055e-04f, +2.741717344e-04f, -5.408665778e-04f, -5.202803985e-04f, +1.053332509e-03f, +7.634406120e-04f, -1.461200618e-03f, -8.813720660e-04f, +1.536759961e-03f, +7.869594125e-04f, -1.246745698e-03f, -5.161818798e-04f, +7.694216806e-04f, +2.163017729e-04f, -3.393316318e-04f, -2.723909709e-05f, +7.246288396e-05f, +0.000000000e+00f,\n    /*  9,11 (20) */\n    +0.000000000e+00f, -1.466741468e-03f, -4.124232275e-03f, +5.870075451e-03f, +2.075029712e-02f, -7.392783826e-03f, -6.604553527e-02f, -1.651799222e-02f, +2.127377792e-01f, +4.277447920e-01f, +3.807941849e-01f, +1.285860089e-01f, -5.260887399e-02f, -5.130777609e-02f, +8.046125780e-03f, +1.826854253e-02f, +8.292704274e-04f, -3.910305430e-03f, -5.245133617e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.099895277e-04f, -3.183739373e-05f, -5.643851446e-04f, -6.809189769e-05f, +1.778762372e-03f, +1.072288776e-03f, -4.535521841e-03f, -8.546768544e-03f, -3.494480876e-03f, +5.817871779e-03f, +8.169413149e-03f, +2.684277322e-03f, -1.805528355e-03f, -1.287997228e-03f, +4.045933660e-04f, +4.347156863e-04f, -6.717063500e-05f, -7.669919420e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.466741468e-03f, +1.760521149e-03f, -7.417778179e-03f, -4.908295944e-03f, +1.757000799e-02f, +1.037600336e-02f, -2.777980385e-02f, -1.650805790e-02f, +3.213713588e-02f, +1.969108821e-02f, -2.802656026e-02f, -1.738679406e-02f, +1.837379071e-02f, +1.087189040e-02f, -8.731723093e-03f, -4.219522173e-03f, +2.691388056e-03f, +5.245133617e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.099895277e-04f, +1.497862086e-04f, +2.861308923e-04f, -5.138042171e-04f, -5.540602536e-04f, +1.012471674e-03f, +8.222085199e-04f, -1.413822106e-03f, -9.559206659e-04f, +1.494409627e-03f, +8.595112945e-04f, -1.218961417e-03f, -5.706755001e-04f, +7.582475927e-04f, +2.467931502e-04f, -3.392148164e-04f, -3.842544483e-05f, +7.669919420e-05f, +0.000000000e+00f,\n    /*  9,12 (20) */\n    +0.000000000e+00f, -1.356751941e-03f, -4.156069669e-03f, +5.305690306e-03f, +2.068220522e-02f, -5.614021453e-03f, -6.497324649e-02f, -2.105351406e-02f, +2.041910107e-01f, +4.242503111e-01f, +3.866120567e-01f, +1.367554220e-01f, -4.992459667e-02f, -5.311330444e-02f, +6.758128552e-03f, +1.867313590e-02f, +1.263986114e-03f, -3.977476065e-03f, -6.012125559e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.069791648e-04f, -1.839161634e-05f, -5.533193656e-04f, -1.132271637e-04f, +1.732085908e-03f, +1.176995732e-03f, -4.330829877e-03f, -8.543635297e-03f, -3.776934500e-03f, +5.587198838e-03f, +8.248580102e-03f, +2.887916697e-03f, -1.747248417e-03f, -1.348694792e-03f, +3.752025402e-04f, +4.518232228e-04f, -5.868046884e-05f, -8.088321544e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.356751941e-03f, +1.910307357e-03f, -7.131647286e-03f, -5.422100161e-03f, +1.701594774e-02f, +1.138847504e-02f, -2.695759533e-02f, -1.792188001e-02f, +3.118121521e-02f, +2.118549784e-02f, -2.716704897e-02f, -1.860575548e-02f, +1.780311521e-02f, +1.163013800e-02f, -8.484929943e-03f, -4.558736989e-03f, +2.652962611e-03f, +6.012125559e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.069791648e-04f, +1.369211034e-04f, +2.968592758e-04f, -4.859567114e-04f, -5.857259060e-04f, +9.695683799e-04f, +8.783309074e-04f, -1.363166966e-03f, -1.027981240e-03f, +1.448217257e-03f, +9.303773597e-04f, -1.187740218e-03f, -6.245081812e-04f, +7.447522702e-04f, +2.773717379e-04f, -3.380033093e-04f, -4.994197077e-05f, +8.088321544e-05f, +0.000000000e+00f,\n    /*  9,13 (20) */\n    +0.000000000e+00f, -1.249772776e-03f, -4.174461285e-03f, +4.752370941e-03f, +2.056897806e-02f, -3.881935545e-03f, -6.379625076e-02f, -2.538434394e-02f, +1.956473754e-01f, +4.204733766e-01f, +3.921992556e-01f, +1.450040021e-01f, -4.703667997e-02f, -5.486055286e-02f, +5.409433760e-03f, +1.904833844e-02f, +1.715809337e-03f, -4.036156533e-03f, -6.820957713e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.037444079e-04f, -5.532707939e-06f, -5.412568705e-04f, -1.565094550e-04f, +1.683021757e-03f, +1.275922127e-03f, -4.125106062e-03f, -8.530465613e-03f, -4.054148657e-03f, +5.348901608e-03f, +8.318876553e-03f, +3.092814483e-03f, -1.683220745e-03f, -1.408267004e-03f, +3.437693945e-04f, +4.684149900e-04f, -4.955385621e-05f, -8.499522959e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.249772776e-03f, +2.047228461e-03f, -6.834788011e-03f, -5.908056872e-03f, +1.643022183e-02f, +1.235804342e-02f, -2.607926443e-02f, -1.928504698e-02f, +3.015323397e-02f, +2.263371510e-02f, -2.623667161e-02f, -1.979349569e-02f, +1.717860703e-02f, +1.237489027e-02f, -8.207558205e-03f, -4.896740299e-03f, +2.603020640e-03f, +6.820957713e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.037444079e-04f, +1.240813725e-04f, +3.063570604e-04f, -4.574236364e-04f, -6.152256489e-04f, +9.247661581e-04f, +9.316826521e-04f, -1.309385403e-03f, -1.097368829e-03f, +1.398294905e-03f, +9.993593378e-04f, -1.153131200e-03f, -6.775209553e-04f, +7.289304000e-04f, +3.079459993e-04f, -3.356683205e-04f, -6.175744052e-05f, +8.499522959e-05f, +0.000000000e+00f,\n    /*  9,14 (20) */\n    +0.000000000e+00f, -1.146028368e-03f, -4.179993993e-03f, +4.211114070e-03f, +2.041246861e-02f, -2.198913789e-03f, -6.252032863e-02f, -2.950945000e-02f, +1.871169098e-01f, +4.164192280e-01f, +3.975481572e-01f, +1.533228787e-01f, -4.394386549e-02f, -5.654377361e-02f, +4.001166755e-03f, +1.939210783e-02f, +2.184224327e-03f, -4.085710390e-03f, -7.670910009e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.003081502e-04f, +6.725433176e-06f, -5.282667776e-04f, -1.978940026e-04f, +1.631752616e-03f, +1.369038514e-03f, -3.918691821e-03f, -8.507381527e-03f, -4.325749271e-03f, +5.103284432e-03f, +8.380093529e-03f, +3.298660581e-03f, -1.613407579e-03f, -1.466537801e-03f, +3.103037383e-04f, +4.844236112e-04f, -3.979134513e-05f, -8.901489621e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.146028368e-03f, +2.171309833e-03f, -6.528430950e-03f, -6.365480509e-03f, +1.581499619e-02f, +1.328280957e-02f, -2.514758177e-02f, -2.059443238e-02f, +2.905586514e-02f, +2.403201000e-02f, -2.523731227e-02f, -2.094662689e-02f, +1.650108607e-02f, +1.310382067e-02f, -7.899612206e-03f, -5.232408619e-03f, +2.541263200e-03f, +7.670910009e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.003081502e-04f, +1.113113465e-04f, +3.146284418e-04f, -4.283046210e-04f, -6.425149696e-04f, +8.782121549e-04f, +9.821474132e-04f, -1.252635460e-03f, -1.163906035e-03f, +1.344765095e-03f, +1.066263026e-03f, -1.115193478e-03f, -7.295550957e-04f, +7.107835746e-04f, +3.384223955e-04f, -3.321841264e-04f, -7.383849955e-05f, +8.901489621e-05f, +0.000000000e+00f,\n    /*  9,15 (20) */\n    +0.000000000e+00f, -1.045720218e-03f, -4.173268560e-03f, +3.682847292e-03f, +2.021457460e-02f, -5.671611725e-04f, -6.115129012e-02f, -3.342814182e-02f, +1.786095282e-01f, +4.120934787e-01f, +4.026514416e-01f, +1.617029722e-01f, -4.064520491e-02f, -5.815718119e-02f, +2.534628954e-03f, +1.970241157e-02f, +2.668647938e-03f, -4.125501735e-03f, -8.561058971e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.669301793e-05f, +1.837126566e-05f, -5.144183841e-04f, -2.373420828e-04f, +1.578461049e-03f, +1.456327142e-03f, -3.711924803e-03f, -8.474520581e-03f, -4.591372366e-03f, +4.850664711e-03f, +8.432035445e-03f, +3.505138284e-03f, -1.537781791e-03f, -1.523329078e-03f, +2.748209470e-04f, +4.997809705e-04f, -2.939555957e-05f, -9.292130267e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.045720218e-03f, +2.282621180e-03f, -6.213802508e-03f, -6.793785130e-03f, +1.517248122e-02f, +1.416102173e-02f, -2.416543436e-02f, -2.184706784e-02f, +2.789195911e-02f, +2.537677510e-02f, -2.417104924e-02f, -2.206182037e-02f, +1.577153098e-02f, +1.381460424e-02f, -7.561189810e-03f, -5.564592746e-03f, +2.467424700e-03f, +8.561058971e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.669301793e-05f, +9.865378036e-05f, +3.216815302e-04f, -3.986990295e-04f, -6.675565758e-04f, +8.300566539e-04f, +1.029617897e-03f, -1.193082535e-03f, -1.227423523e-03f, +1.287760488e-03f, +1.130898870e-03f, -1.073996092e-03f, -7.804525961e-04f, +6.903203990e-04f, +3.687056509e-04f, -3.275282327e-04f, -8.614974053e-05f, +9.292130267e-05f, +0.000000000e+00f,\n    /*  9,16 (20) */\n    +0.000000000e+00f, -9.490271998e-04f, -4.154897294e-03f, +3.168428908e-03f, +1.997723252e-02f, +1.011299876e-03f, -5.969496298e-02f, -3.714006662e-02f, +1.701350077e-01f, +4.075021063e-01f, +4.075021063e-01f, +1.701350077e-01f, -3.714006662e-02f, -5.969496298e-02f, +1.011299876e-03f, +1.997723252e-02f, +3.168428908e-03f, -4.154897294e-03f, -9.490271998e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.292130267e-05f, +2.939555957e-05f, -4.997809705e-04f, -2.748209470e-04f, +1.523329078e-03f, +1.537781791e-03f, -3.505138284e-03f, -8.432035445e-03f, -4.850664711e-03f, +4.591372366e-03f, +8.474520581e-03f, +3.711924803e-03f, -1.456327142e-03f, -1.578461049e-03f, +2.373420828e-04f, +5.144183841e-04f, -1.837126566e-05f, -9.669301793e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.490271998e-04f, +2.381274960e-03f, -5.892120978e-03f, -7.192484159e-03f, +1.450492464e-02f, +1.499107838e-02f, -2.313581646e-02f, -2.304015037e-02f, +2.666453559e-02f, +2.666453559e-02f, -2.304015037e-02f, -2.313581646e-02f, +1.499107838e-02f, +1.450492464e-02f, -7.192484159e-03f, -5.892120978e-03f, +2.381274960e-03f, +9.490271998e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.292130267e-05f, +8.614974053e-05f, +3.275282327e-04f, -3.687056509e-04f, -6.903203990e-04f, +7.804525961e-04f, +1.073996092e-03f, -1.130898870e-03f, -1.287760488e-03f, +1.227423523e-03f, +1.193082535e-03f, -1.029617897e-03f, -8.300566539e-04f, +6.675565758e-04f, +3.986990295e-04f, -3.216815302e-04f, -9.865378036e-05f, +9.669301793e-05f, +0.000000000e+00f,\n    /*  9,17 (20) */\n    +0.000000000e+00f, -8.561058971e-04f, -4.125501735e-03f, +2.668647938e-03f, +1.970241157e-02f, +2.534628954e-03f, -5.815718119e-02f, -4.064520491e-02f, +1.617029722e-01f, +4.026514416e-01f, +4.120934787e-01f, +1.786095282e-01f, -3.342814182e-02f, -6.115129012e-02f, -5.671611725e-04f, +2.021457460e-02f, +3.682847292e-03f, -4.173268560e-03f, -1.045720218e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.901489621e-05f, +3.979134513e-05f, -4.844236112e-04f, -3.103037383e-04f, +1.466537801e-03f, +1.613407579e-03f, -3.298660581e-03f, -8.380093529e-03f, -5.103284432e-03f, +4.325749271e-03f, +8.507381527e-03f, +3.918691821e-03f, -1.369038514e-03f, -1.631752616e-03f, +1.978940026e-04f, +5.282667776e-04f, -6.725433176e-06f, -1.003081502e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.561058971e-04f, +2.467424700e-03f, -5.564592746e-03f, -7.561189810e-03f, +1.381460424e-02f, +1.577153098e-02f, -2.206182037e-02f, -2.417104924e-02f, +2.537677510e-02f, +2.789195911e-02f, -2.184706784e-02f, -2.416543436e-02f, +1.416102173e-02f, +1.517248122e-02f, -6.793785130e-03f, -6.213802508e-03f, +2.282621180e-03f, +1.045720218e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.901489621e-05f, +7.383849955e-05f, +3.321841264e-04f, -3.384223955e-04f, -7.107835746e-04f, +7.295550957e-04f, +1.115193478e-03f, -1.066263026e-03f, -1.344765095e-03f, +1.163906035e-03f, +1.252635460e-03f, -9.821474132e-04f, -8.782121549e-04f, +6.425149696e-04f, +4.283046210e-04f, -3.146284418e-04f, -1.113113465e-04f, +1.003081502e-04f, +0.000000000e+00f,\n    /*  9,18 (20) */\n    +0.000000000e+00f, -7.670910009e-04f, -4.085710390e-03f, +2.184224327e-03f, +1.939210783e-02f, +4.001166755e-03f, -5.654377361e-02f, -4.394386549e-02f, +1.533228787e-01f, +3.975481572e-01f, +4.164192280e-01f, +1.871169098e-01f, -2.950945000e-02f, -6.252032863e-02f, -2.198913789e-03f, +2.041246861e-02f, +4.211114070e-03f, -4.179993993e-03f, -1.146028368e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.499522959e-05f, +4.955385621e-05f, -4.684149900e-04f, -3.437693945e-04f, +1.408267004e-03f, +1.683220745e-03f, -3.092814483e-03f, -8.318876553e-03f, -5.348901608e-03f, +4.054148657e-03f, +8.530465613e-03f, +4.125106062e-03f, -1.275922127e-03f, -1.683021757e-03f, +1.565094550e-04f, +5.412568705e-04f, +5.532707939e-06f, -1.037444079e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.670910009e-04f, +2.541263200e-03f, -5.232408619e-03f, -7.899612206e-03f, +1.310382067e-02f, +1.650108607e-02f, -2.094662689e-02f, -2.523731227e-02f, +2.403201000e-02f, +2.905586514e-02f, -2.059443238e-02f, -2.514758177e-02f, +1.328280957e-02f, +1.581499619e-02f, -6.365480509e-03f, -6.528430950e-03f, +2.171309833e-03f, +1.146028368e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.499522959e-05f, +6.175744052e-05f, +3.356683205e-04f, -3.079459993e-04f, -7.289304000e-04f, +6.775209553e-04f, +1.153131200e-03f, -9.993593378e-04f, -1.398294905e-03f, +1.097368829e-03f, +1.309385403e-03f, -9.316826521e-04f, -9.247661581e-04f, +6.152256489e-04f, +4.574236364e-04f, -3.063570604e-04f, -1.240813725e-04f, +1.037444079e-04f, +0.000000000e+00f,\n    /*  9,19 (20) */\n    +0.000000000e+00f, -6.820957713e-04f, -4.036156533e-03f, +1.715809337e-03f, +1.904833844e-02f, +5.409433760e-03f, -5.486055286e-02f, -4.703667997e-02f, +1.450040021e-01f, +3.921992556e-01f, +4.204733766e-01f, +1.956473754e-01f, -2.538434394e-02f, -6.379625076e-02f, -3.881935545e-03f, +2.056897806e-02f, +4.752370941e-03f, -4.174461285e-03f, -1.249772776e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.088321544e-05f, +5.868046884e-05f, -4.518232228e-04f, -3.752025402e-04f, +1.348694792e-03f, +1.747248417e-03f, -2.887916697e-03f, -8.248580102e-03f, -5.587198838e-03f, +3.776934500e-03f, +8.543635297e-03f, +4.330829877e-03f, -1.176995732e-03f, -1.732085908e-03f, +1.132271637e-04f, +5.533193656e-04f, +1.839161634e-05f, -1.069791648e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.820957713e-04f, +2.603020640e-03f, -4.896740299e-03f, -8.207558205e-03f, +1.237489027e-02f, +1.717860703e-02f, -1.979349569e-02f, -2.623667161e-02f, +2.263371510e-02f, +3.015323397e-02f, -1.928504698e-02f, -2.607926443e-02f, +1.235804342e-02f, +1.643022183e-02f, -5.908056872e-03f, -6.834788011e-03f, +2.047228461e-03f, +1.249772776e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.088321544e-05f, +4.994197077e-05f, +3.380033093e-04f, -2.773717379e-04f, -7.447522702e-04f, +6.245081812e-04f, +1.187740218e-03f, -9.303773597e-04f, -1.448217257e-03f, +1.027981240e-03f, +1.363166966e-03f, -8.783309074e-04f, -9.695683799e-04f, +5.857259060e-04f, +4.859567114e-04f, -2.968592758e-04f, -1.369211034e-04f, +1.069791648e-04f, +0.000000000e+00f,\n    /*  9,20 (20) */\n    +0.000000000e+00f, -6.012125559e-04f, -3.977476065e-03f, +1.263986114e-03f, +1.867313590e-02f, +6.758128552e-03f, -5.311330444e-02f, -4.992459667e-02f, +1.367554220e-01f, +3.866120567e-01f, +4.242503111e-01f, +2.041910107e-01f, -2.105351406e-02f, -6.497324649e-02f, -5.614021453e-03f, +2.068220522e-02f, +5.305690306e-03f, -4.156069669e-03f, -1.356751941e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.669919420e-05f, +6.717063500e-05f, -4.347156863e-04f, -4.045933660e-04f, +1.287997228e-03f, +1.805528355e-03f, -2.684277322e-03f, -8.169413149e-03f, -5.817871779e-03f, +3.494480876e-03f, +8.546768544e-03f, +4.535521841e-03f, -1.072288776e-03f, -1.778762372e-03f, +6.809189769e-05f, +5.643851446e-04f, +3.183739373e-05f, -1.099895277e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.012125559e-04f, +2.652962611e-03f, -4.558736989e-03f, -8.484929943e-03f, +1.163013800e-02f, +1.780311521e-02f, -1.860575548e-02f, -2.716704897e-02f, +2.118549784e-02f, +3.118121521e-02f, -1.792188001e-02f, -2.695759533e-02f, +1.138847504e-02f, +1.701594774e-02f, -5.422100161e-03f, -7.131647286e-03f, +1.910307357e-03f, +1.356751941e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.669919420e-05f, +3.842544483e-05f, +3.392148164e-04f, -2.467931502e-04f, -7.582475927e-04f, +5.706755001e-04f, +1.218961417e-03f, -8.595112945e-04f, -1.494409627e-03f, +9.559206659e-04f, +1.413822106e-03f, -8.222085199e-04f, -1.012471674e-03f, +5.540602536e-04f, +5.138042171e-04f, -2.861308923e-04f, -1.497862086e-04f, +1.099895277e-04f, +0.000000000e+00f,\n    /*  9,21 (20) */\n    +0.000000000e+00f, -5.245133617e-04f, -3.910305430e-03f, +8.292704274e-04f, +1.826854253e-02f, +8.046125780e-03f, -5.130777609e-02f, -5.260887399e-02f, +1.285860089e-01f, +3.807941849e-01f, +4.277447920e-01f, +2.127377792e-01f, -1.651799222e-02f, -6.604553527e-02f, -7.392783826e-03f, +2.075029712e-02f, +5.870075451e-03f, -4.124232275e-03f, -1.466741468e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.246288396e-05f, +7.502581213e-05f, -4.171588535e-04f, -4.319374973e-04f, +1.226347989e-03f, +1.858108677e-03f, -2.482199329e-03f, -8.081597560e-03f, -6.040629666e-03f, +3.207171306e-03f, +8.539759156e-03f, +4.738837376e-03f, -9.618425585e-04f, -1.822868728e-03f, +2.115452835e-05f, +5.743854683e-04f, +4.585374517e-05f, -1.127524080e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.245133617e-04f, +2.691388056e-03f, -4.219522173e-03f, -8.731723093e-03f, +1.087189040e-02f, +1.837379071e-02f, -1.738679406e-02f, -2.802656026e-02f, +1.969108821e-02f, +3.213713588e-02f, -1.650805790e-02f, -2.777980385e-02f, +1.037600336e-02f, +1.757000799e-02f, -4.908295944e-03f, -7.417778179e-03f, +1.760521149e-03f, +1.466741468e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.246288396e-05f, +2.723909709e-05f, +3.393316318e-04f, -2.163017729e-04f, -7.694216806e-04f, +5.161818798e-04f, +1.246745698e-03f, -7.869594125e-04f, -1.536759961e-03f, +8.813720660e-04f, +1.461200618e-03f, -7.634406120e-04f, -1.053332509e-03f, +5.202803985e-04f, +5.408665778e-04f, -2.741717344e-04f, -1.626309055e-04f, +1.127524080e-04f, +0.000000000e+00f,\n    /*  9,22 (20) */\n    +0.000000000e+00f, -4.520504777e-04f, -3.835279617e-03f, +4.121115739e-04f, +1.783660504e-02f, +9.272473769e-03f, -4.944966741e-02f, -5.509107332e-02f, +1.205044113e-01f, +3.747535553e-01f, +4.309519633e-01f, +2.212775384e-01f, -1.177915484e-02f, -6.700737783e-02f, -9.215652553e-03f, +2.077145165e-02f, +6.444460919e-03f, -4.078378530e-03f, -1.579493876e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.819333424e-05f, +8.224938858e-05f, -3.992181370e-04f, -4.572358524e-04f, +1.163918025e-03f, +1.905047567e-03f, -2.281978078e-03f, -7.985367570e-03f, -6.255195794e-03f, +2.915398074e-03f, +8.522517089e-03f, +4.940429374e-03f, -8.457103473e-04f, -1.864223241e-03f, -2.752792830e-05f, +5.832521816e-04f, +6.042194565e-05f, -1.152445962e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.520504777e-04f, +2.718627153e-03f, -3.880190541e-03f, -8.948024866e-03f, +1.010246872e-02f, +1.888997259e-02f, -1.614004836e-02f, -2.881351967e-02f, +1.815432825e-02f, +3.301850795e-02f, -1.504685729e-02f, -2.854324447e-02f, +9.322670852e-03f, +1.809028839e-02f, -4.367429366e-03f, -7.691949913e-03f, +1.597890243e-03f, +1.579493876e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.819333424e-05f, +1.641198385e-05f, +3.383854403e-04f, -1.859868858e-04f, -7.782866263e-04f, +4.611860537e-04f, +1.271054027e-03f, -7.129234617e-04f, -1.575166969e-03f, +8.045274491e-04f, +1.505160608e-03f, -7.021607935e-04f, -1.092011438e-03f, +4.844451928e-04f, +5.670445928e-04f, -2.609857401e-04f, -1.754080893e-04f, +1.152445962e-04f, +0.000000000e+00f,\n    /*  9,23 (20) */\n    +0.000000000e+00f, -3.838571435e-04f, -3.753030229e-03f, +1.289343693e-05f, +1.737936918e-02f, +1.043639179e-02f, -4.754461985e-02f, -5.737305140e-02f, +1.125190437e-01f, +3.684983595e-01f, +4.338673614e-01f, +2.298000555e-01f, -6.838725469e-03f, -6.785308817e-02f, -1.107987579e-02f, +2.074392372e-02f, +7.027713101e-03f, -4.017956584e-03f, -1.694738472e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.390888365e-05f, +8.884660549e-05f, -3.809577389e-04f, -4.804944906e-04f, +1.100875244e-03f, +1.946412967e-03f, -2.083900841e-03f, -7.880969246e-03f, -6.461307976e-03f, +2.619561526e-03f, +8.494968729e-03f, +5.139948840e-03f, -7.239574817e-04f, -1.902645294e-03f, -7.789228352e-05f, +5.909179227e-04f, +7.552081317e-05f, -1.174428396e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.838571435e-04f, +2.735039137e-03f, -3.541805101e-03f, -9.134011752e-03f, +9.324182096e-03f, +1.935115864e-02f, -1.486899433e-02f, -2.952644314e-02f, +1.657916129e-02f, +3.382303539e-02f, -1.354169668e-02f, -2.924540526e-02f, +8.230659415e-03f, +1.857473359e-02f, -3.800384773e-03f, -7.952935653e-03f, +1.422482154e-03f, +1.694738472e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.390888365e-05f, +5.970935089e-06f, +3.364106453e-04f, -1.559352700e-04f, -7.848611546e-04f, +4.058460523e-04f, +1.291857461e-03f, -6.376080704e-04f, -1.609540390e-03f, +7.255853330e-04f, +1.545568935e-03f, -6.385108396e-04f, -1.128373559e-03f, +4.466205602e-04f, +5.922397644e-04f, -2.465810426e-04f, -1.880694730e-04f, +1.174428396e-04f, +0.000000000e+00f,\n    /*  9,24 (20) */\n    +0.000000000e+00f, -3.199482598e-04f, -3.664183623e-03f, -3.680643019e-04f, +1.689887469e-02f, +1.153726704e-02f, -4.559820688e-02f, -5.945695224e-02f, +1.046380745e-01f, +3.620370515e-01f, +4.364869229e-01f, +2.382950242e-01f, -1.698776629e-03f, -6.857704566e-02f, -1.298252109e-02f, +2.066603144e-02f, +7.618631023e-03f, -3.942435771e-03f, -1.812181312e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.962712134e-05f, +9.482447532e-05f, -3.624405091e-04f, -5.017244508e-04f, +1.037384200e-03f, +1.982282247e-03f, -1.888246358e-03f, -7.768659925e-03f, -6.658718969e-03f, +2.320069358e-03f, +8.457057141e-03f, +5.337045545e-03f, -5.966614467e-04f, -1.937955811e-03f, -1.298691629e-04f, +5.973163362e-04f, +9.112668851e-05f, -1.193239221e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.199482598e-04f, +2.741010072e-03f, -3.205394456e-03f, -9.289947022e-03f, +8.539320942e-03f, +1.975700470e-02f, -1.357713687e-02f, -3.016405121e-02f, +1.496962089e-02f, +3.454862073e-02f, -1.199612774e-02f, -2.988391610e-02f, +7.102285855e-03f, +1.902135415e-02f, -3.208145009e-03f, -8.199516696e-03f, +1.234412681e-03f, +1.812181312e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.962712134e-05f, -4.059484342e-06f, +3.334441850e-04f, -1.262309784e-04f, -7.891704580e-04f, +3.503187417e-04f, +1.309137140e-03f, -5.612201445e-04f, -1.639801227e-03f, +6.447501854e-04f, +1.582301631e-03f, -5.726403428e-04f, -1.162288975e-03f, +4.068794000e-04f, +6.163546279e-04f, -2.309700388e-04f, -2.005657339e-04f, +1.193239221e-04f, +0.000000000e+00f,\n    /*  9,25 (20) */\n    +0.000000000e+00f, -2.603211385e-04f, -3.569359148e-03f, -7.305048110e-04f, +1.639715024e-02f, +1.257465124e-02f, -4.361592463e-02f, -6.134519860e-02f, +9.686941458e-02f, +3.553783325e-01f, +4.388069922e-01f, +2.467520813e-01f, +3.638268917e-03f, -6.917370710e-02f, -1.492047690e-02f, +2.053616228e-02f, +8.215947360e-03f, -3.851309083e-03f, -1.931505234e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.536485254e-05f, +1.001916974e-04f, -3.437278112e-04f, -5.209415823e-04f, +9.736057991e-04f, +2.012741869e-03f, -1.695284414e-03f, -7.648707631e-03f, -6.847196870e-03f, +2.017335882e-03f, +8.408742284e-03f, +5.531368685e-03f, -4.639119216e-04f, -1.969977696e-03f, -1.833830086e-04f, +6.023822883e-04f, +1.072134221e-04f, -1.208647477e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.603211385e-04f, +2.736950588e-03f, -2.871950271e-03f, -9.416178000e-03f, +7.750150484e-03f, +2.010732344e-02f, -1.226799973e-02f, -3.072527135e-02f, +1.332981967e-02f, +3.519337091e-02f, -1.041382611e-02f, -3.045655644e-02f, +5.939996881e-03f, +1.942823355e-02f, -2.591790381e-03f, -8.430486735e-03f, +1.033846947e-03f, +1.931505234e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.536485254e-05f, -1.365700397e-05f, +3.295253456e-04f, -9.695511913e-05f, -7.912460132e-04f, +2.947593716e-04f, +1.322884248e-03f, -4.839682608e-04f, -1.665881937e-03f, +5.622318479e-04f, +1.615244300e-03f, -5.047063370e-04f, -1.193633229e-03f, +3.653014671e-04f, +6.392930840e-04f, -2.141694439e-04f, -2.128466679e-04f, +1.208647477e-04f, +0.000000000e+00f,\n    /*  9,26 (20) */\n    +0.000000000e+00f, -2.049562860e-04f, -3.469167451e-03f, -1.074232622e-03f, +1.587620866e-02f, +1.354825704e-02f, -4.160318276e-02f, -6.304048301e-02f, +8.922070695e-02f, +3.485311357e-01f, +4.408243281e-01f, +2.551608236e-01f, +9.169637602e-03f, -6.963761902e-02f, -1.689045460e-02f, +2.035277927e-02f, +8.818329648e-03f, -3.744095661e-03f, -2.052369982e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.113806788e-05f, +1.049585708e-04f, -3.248793961e-04f, -5.381663658e-04f, +9.096970252e-04f, +2.037887028e-03f, -1.505275436e-03f, -7.521390485e-03f, -7.026525481e-03f, +1.711781284e-03f, +8.350001198e-03f, +5.722567552e-03f, -3.258108042e-04f, -1.998536266e-03f, -2.383520973e-04f, +6.060520864e-04f, +1.237523680e-04f, -1.220424252e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.049562860e-04f, +2.723293584e-03f, -2.542424925e-03f, -9.513133119e-03f, +6.958904470e-03f, +2.040208281e-02f, -1.094511548e-02f, -3.120923961e-02f, +1.166393773e-02f, +3.575560276e-02f, -8.798581812e-03f, -3.096126278e-02f, +4.746363651e-03f, +1.979353501e-02f, -1.952497297e-03f, -8.644656178e-03f, +8.210002790e-04f, +2.052369982e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.113806788e-05f, -2.280166760e-05f, +3.246955684e-04f, -6.818565330e-05f, -7.911253806e-04f, +2.393211330e-04f, +1.333099948e-03f, -4.060620597e-04f, -1.687726605e-03f, +4.782449426e-04f, +1.644292481e-03f, -4.348728983e-04f, -1.222287742e-03f, +3.219732290e-04f, +6.609607334e-04f, -1.962003325e-04f, -2.248613507e-04f, +1.220424252e-04f, +0.000000000e+00f,\n    /*  9,27 (20) */\n    +0.000000000e+00f, -1.538182181e-04f, -3.364208880e-03f, -1.399112018e-03f, +1.533804229e-02f, +1.445795406e-02f, -3.956529574e-02f, -6.454575845e-02f, +8.169931646e-02f, +3.415046102e-01f, +4.425361094e-01f, +2.635108248e-01f, +1.489220515e-02f, -6.996342983e-02f, -1.888899086e-02f, +2.011442717e-02f, +9.424381734e-03f, -3.620343293e-03f, -2.174412407e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.696191667e-05f, +1.091369052e-04f, -3.059532845e-04f, -5.534237292e-04f, +8.458106722e-04f, +2.057821283e-03f, -1.318470120e-03f, -7.386996087e-03f, -7.196504639e-03f, +1.403830863e-03f, +8.280828147e-03f, +5.910292206e-03f, -1.824722076e-04f, -2.023459698e-03f, -2.946885739e-04f, +6.082636990e-04f, +1.407123858e-04f, -1.228343562e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.538182181e-04f, +2.700491916e-03f, -2.217729357e-03f, -9.581318772e-03f, +6.167779090e-03f, +2.064140394e-02f, -9.612015537e-03f, -3.161530167e-02f, +9.976211126e-03f, +3.623384770e-02f, -7.154289331e-03f, -3.139613568e-02f, +3.524075909e-03f, +2.011550824e-02f, -1.291536564e-03f, -8.840856511e-03f, +5.961389283e-04f, +2.174412407e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.696191667e-05f, -3.147584400e-05f, +3.189982554e-04f, -3.999720662e-05f, -7.888519877e-04f, +1.841547287e-04f, +1.339795282e-03f, -3.277116368e-04f, -1.705291065e-03f, +3.930082645e-04f, +1.669351991e-03f, -3.633107207e-04f, -1.248140225e-03f, +2.769876987e-04f, +6.812652106e-04f, -1.770881657e-04f, -2.365583057e-04f, +1.228343562e-04f, +0.000000000e+00f,\n    /*  9,28 (20) */\n    +0.000000000e+00f, -1.068563014e-04f, -3.255071975e-03f, -1.705065303e-03f, +1.478461857e-02f, +1.530376473e-02f, -3.750747445e-02f, -6.586422857e-02f, +7.431232037e-02f, +3.343081056e-01f, +4.439399403e-01f, +2.717916530e-01f, +2.080249736e-02f, -7.014590204e-02f, -2.091245056e-02f, +1.981973860e-02f, +1.003264543e-02f, -3.479630907e-03f, -2.297246763e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.285068405e-05f, +1.127399294e-04f, -2.870056572e-04f, -5.667428546e-04f, +7.820950974e-04f, +2.072656180e-03f, -1.135109078e-03f, -7.245820893e-03f, -7.356950513e-03f, +1.093914263e-03f, +8.201234742e-03f, +6.094194162e-03f, -3.402243142e-05f, -2.044579463e-03f, -3.522985019e-04f, +6.089569785e-04f, +1.580598491e-04f, -1.232183244e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.068563014e-04f, +2.669016072e-03f, -1.898731101e-03f, -9.621315979e-03f, +5.378927102e-03f, +2.082555867e-02f, -8.272220254e-03f, -3.194301331e-02f, +8.270920061e-03f, +3.662685597e-02f, -5.484937339e-03f, -3.175944640e-02f, +2.275935685e-03f, +2.039249594e-02f, -6.102713531e-04f, -9.017944677e-03f, +3.595806226e-04f, +2.297246763e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.285068405e-05f, -3.966422846e-05f, +3.124785706e-04f, -1.246089578e-05f, -7.844748965e-04f, +1.294079547e-04f, +1.342991048e-03f, -2.491269374e-04f, -1.718542995e-03f, +3.067441618e-04f, +1.690339236e-03f, -2.901966692e-04f, -1.271085084e-03f, +2.304442459e-04f, +7.001165165e-04f, -1.568628027e-04f, -2.478856778e-04f, +1.232183244e-04f, +0.000000000e+00f,\n    /*  9,29 (20) */\n    +0.000000000e+00f, -6.400561736e-05f, -3.142332045e-03f, -1.992070960e-03f, +1.421787571e-02f, +1.608585983e-02f, -3.543481827e-02f, -6.699933765e-02f, +6.706649948e-02f, +3.269511550e-01f, +4.450338545e-01f, +2.799928877e-01f, +2.689669152e-02f, -7.017992447e-02f, -2.295703002e-02f, +1.946744009e-02f, +1.064160241e-02f, -3.321571058e-03f, -2.420465088e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.881777201e-05f, +1.157821988e-04f, -2.680907537e-04f, -5.781569807e-04f, +7.186939899e-04f, +2.082510856e-03f, -9.554225158e-04f, -7.098169576e-03f, -7.507695873e-03f, +7.824646979e-04f, +8.111250020e-03f, +6.273927067e-03f, +1.194000942e-04f, -2.061730780e-03f, -4.110819289e-04f, +6.080738841e-04f, +1.757586635e-04f, -1.231725867e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.400561736e-05f, +2.629351844e-03f, -1.586252531e-03f, -9.633776875e-03f, +4.594452206e-03f, +2.095496663e-02f, -6.929229206e-03f, -3.219214025e-02f, +6.552377066e-03f, +3.693360013e-02f, -3.794598103e-03f, -3.204964307e-02f, +1.004850601e-03f, +2.062294019e-02f, +8.984516335e-05f, -9.174807479e-03f, +1.116949448e-04f, +2.420465088e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.881777201e-05f, -4.735383549e-05f, +3.051832409e-04f, +1.435583036e-05f, -7.780485578e-04f, +7.522529786e-05f, +1.342717643e-03f, -1.705171546e-04f, -1.727461982e-03f, +2.196779041e-04f, +1.707181490e-03f, -2.157133115e-04f, -1.291023805e-03f, +1.824483844e-04f, +7.174273497e-04f, -1.355584979e-04f, -2.587914125e-04f, +1.231725867e-04f, +0.000000000e+00f,\n    /*  9,30 (20) */\n    +0.000000000e+00f, -2.518784535e-05f, -3.026549847e-03f, -2.260161714e-03f, +1.363971873e-02f, +1.680455382e-02f, -3.335230742e-02f, -6.795476016e-02f, +5.996832990e-02f, +3.194434592e-01f, +4.458163192e-01f, +2.881041377e-01f, +3.317061859e-02f, -7.006052437e-02f, -2.501876080e-02f, +1.905635816e-02f, +1.124967630e-02f, -3.145812394e-03f, -2.543637674e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.487568417e-05f, +1.182795009e-04f, -2.492607803e-04f, -5.877031988e-04f, +6.557461540e-04f, +2.087511637e-03f, -7.796299310e-04f, -6.944354374e-03f, -7.648590319e-03f, +4.699181647e-04f, +8.010920493e-03f, +6.449147393e-03f, +2.776448918e-04f, -2.074753048e-03f, -4.709329705e-04f, +6.055587053e-04f, +1.937702911e-04f, -1.226759659e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.518784535e-05f, +2.581998008e-03f, -1.281069290e-03f, -9.619421045e-03f, +3.816403648e-03f, +2.103019192e-02f, -5.586511563e-03f, -3.236265740e-02f, +4.824915084e-03f, +3.715327803e-02f, -2.087416613e-03f, -3.226535638e-02f, -2.861732041e-04f, +2.080538857e-02f, +8.072725131e-04f, -9.310365977e-03f, -1.470964677e-04f, +2.543637674e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.487568417e-05f, -5.453398286e-05f, +2.971603546e-04f, +4.038933415e-05f, -7.696325503e-04f, +2.174754707e-05f, +1.339014882e-03f, -9.209013332e-05f, -1.732039536e-03f, +1.320370426e-04f, +1.719817145e-03f, -1.400484287e-04f, -1.307865322e-03f, +1.331115381e-04f, +7.331134341e-04f, -1.132138829e-04f, -2.692234406e-04f, +1.226759659e-04f, +0.000000000e+00f,\n    /*  9,31 (20) */\n    +0.000000000e+00f, +9.687838816e-06f, -2.908270346e-03f, -2.509422494e-03f, +1.305201553e-02f, +1.746029998e-02f, -3.126479578e-02f, -6.873439009e-02f, +5.302397553e-02f, +3.117948688e-01f, +4.462862374e-01f, +2.961150582e-01f, +3.961976598e-02f, -6.978287948e-02f, -2.709351385e-02f, +1.858542519e-02f, +1.185523500e-02f, -2.952042103e-03f, -2.666313640e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.103601429e-05f, +1.202487606e-04f, -2.305658252e-04f, -5.954222446e-04f, +5.933853095e-04f, +2.087791629e-03f, -6.079398431e-04f, -6.784694429e-03f, -7.779500476e-03f, +1.567126525e-04f, +7.900310157e-03f, +6.619515121e-03f, +4.405495465e-04f, -2.083490300e-03f, -5.317399089e-04f, +6.013582856e-04f, +2.120537838e-04f, -1.217079448e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.687838816e-06f, +2.527464025e-03f, -9.839089351e-04f, -9.579031710e-03f, +3.046771098e-03f, +2.105193947e-02f, -4.247496681e-03f, -3.245474753e-02f, +3.092875547e-03f, +3.728531508e-02f, -3.675994675e-04f, -3.240540481e-02f, -1.594038526e-03f, +2.093850011e-02f, +1.540385947e-03f, -9.423579860e-03f, -4.163199083e-04f, +2.666313640e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.103601429e-05f, -6.119626725e-05f, +2.884591603e-04f, +6.557991726e-05f, -7.592913089e-04f, -3.088857861e-05f, +1.331931790e-03f, -1.405178167e-05f, -1.732279086e-03f, +4.405076371e-05f, +1.728195928e-03f, -6.339450830e-05f, -1.321526365e-03f, +8.255078474e-05f, +7.470938414e-04f, -8.987193298e-05f, -2.791298664e-04f, +1.217079448e-04f, +0.000000000e+00f,\n    /* 10, 0 (16) */\n    -3.435438094e-03f, +2.943141494e-03f, +2.034116507e-02f, -8.155953257e-03f, -7.225789483e-02f, +1.377048179e-02f, +3.053759648e-01f, +4.837723159e-01f, +3.053759648e-01f, +1.377048179e-02f, -7.225789483e-02f, -8.155953257e-03f, +2.034116507e-02f, +2.943141494e-03f, -3.435438094e-03f, -3.217538268e-04f,\n    +6.707608258e-05f, -5.114863527e-04f, -2.153539325e-04f, +2.000939515e-03f, +8.809768187e-04f, -6.556120613e-03f, -9.628506085e-03f, -2.007634162e-04f, +9.511779562e-03f, +6.798746210e-03f, -7.239919468e-04f, -2.056903051e-03f, +1.659059994e-04f, +5.298423273e-04f, -5.789333512e-05f, -5.905249340e-05f,\n    +3.435438094e-03f, -4.847709799e-03f, -6.981797302e-03f, +1.656141375e-02f, +8.646918829e-03f, -3.077159020e-02f, -4.021341136e-03f, +3.732936584e-02f, -4.021341136e-03f, -3.077159020e-02f, +8.646918829e-03f, +1.656141375e-02f, -6.981797302e-03f, -4.847709799e-03f, +2.606381379e-03f, +3.217538268e-04f,\n    -6.707608258e-05f, +3.641911522e-04f, -4.062610643e-04f, -6.600034460e-04f, +1.173864442e-03f, +5.790625007e-04f, -1.850959514e-03f, -5.311769911e-05f, +1.872042266e-03f, -4.956591564e-04f, -1.218918145e-03f, +6.236938338e-04f, +4.420194799e-04f, -3.614489713e-04f, -2.785323460e-05f, +5.905249340e-05f,\n    /* 10, 1 (16) */\n    -3.368362011e-03f, +2.431655141e-03f, +2.012581114e-02f, -6.155013742e-03f, -7.137691801e-02f, +7.214361174e-03f, +2.957474587e-01f, +4.835715525e-01f, +3.148877444e-01f, +2.056922800e-02f, -7.298188677e-02f, -1.021285631e-02f, +2.050707107e-02f, +3.472983821e-03f, -3.493331429e-03f, -3.808063202e-04f,\n    +7.545314953e-05f, -4.923448224e-04f, -2.621804636e-04f, +1.941641510e-03f, +1.030220430e-03f, -6.309098964e-03f, -9.730737638e-03f, -6.019552073e-04f, +9.380629856e-03f, +7.036444507e-03f, -5.593849512e-04f, -2.109259184e-03f, +1.138863962e-04f, +5.473138646e-04f, -4.789957434e-05f, -6.374551801e-05f,\n    +3.368362011e-03f, -4.483518646e-03f, -7.388058366e-03f, +1.590141031e-02f, +9.820783271e-03f, -3.019252770e-02f, -5.872300650e-03f, +3.727624814e-02f, -2.149298869e-03f, -3.126724936e-02f, +7.428000684e-03f, +1.718510759e-02f, -6.539777822e-03f, -5.209158770e-03f, +2.578528144e-03f, +3.808063202e-04f,\n    -7.545314953e-05f, +3.654664619e-04f, -3.701104367e-04f, -6.934136248e-04f, +1.125845779e-03f, +6.598697561e-04f, -1.824406662e-03f, -1.591853495e-04f, +1.887562529e-03f, -4.099047792e-04f, -1.260814382e-03f, +5.845525278e-04f, +4.772438143e-04f, -3.572022469e-04f, -4.096700691e-05f, +6.374551801e-05f,\n    /* 10, 2 (16) */\n    -3.292908862e-03f, +1.939310319e-03f, +1.986363068e-02f, -4.213372232e-03f, -7.034669758e-02f, +9.052622097e-04f, +2.860167211e-01f, +4.829695973e-01f, +3.242683743e-01f, +2.760567250e-02f, -7.354127172e-02f, -1.232211549e-02f, +2.062095747e-02f, +4.020297686e-03f, -3.541231003e-03f, -4.445518383e-04f,\n    +8.303274900e-05f, -4.725153862e-04f, -3.063454208e-04f, +1.879282395e-03f, +1.171623711e-03f, -6.058213755e-03f, -9.818431511e-03f, -1.002142602e-03f, +9.235157855e-03f, +7.268686731e-03f, -3.872951273e-04f, -2.157736154e-03f, +5.935456784e-05f, +5.638011503e-04f, -3.709248724e-05f, -6.842836328e-05f,\n    +3.292908862e-03f, -4.118052185e-03f, -7.758168803e-03f, +1.520799668e-02f, +1.094662905e-02f, -2.953265794e-02f, -7.696707312e-03f, +3.711706279e-02f, -2.617363403e-04f, -3.167715414e-02f, +6.167186302e-03f, +1.776966011e-02f, -6.062534007e-03f, -5.566361017e-03f, +2.537561137e-03f, +4.445518383e-04f,\n    -8.303274900e-05f, +3.653173998e-04f, -3.337076127e-04f, -7.238681425e-04f, +1.075062234e-03f, +7.378467177e-04f, -1.792493798e-03f, -2.647503330e-04f, +1.897446001e-03f, -3.220545052e-04f, -1.299369010e-03f, +5.426587225e-04f, +5.117908634e-04f, -3.514184228e-04f, -5.451931058e-05f, +6.842836328e-05f,\n    /* 10, 3 (16) */\n    -3.209876113e-03f, +1.466794933e-03f, +1.955728526e-02f, -2.334089837e-03f, -6.917507387e-02f, -5.152951546e-03f, +2.761982896e-01f, +4.819674547e-01f, +3.335035321e-01f, +3.487435924e-02f, -7.392856685e-02f, -1.447985165e-02f, +2.068031204e-02f, +4.584098836e-03f, -3.578323491e-03f, -5.129802015e-04f,\n    +8.982582867e-05f, -4.520941759e-04f, -3.478180146e-04f, +1.814135217e-03f, +1.305107515e-03f, -5.803997492e-03f, -9.891573978e-03f, -1.400658425e-03f, +9.075493508e-03f, +7.494947831e-03f, -2.078819698e-04f, -2.202064135e-03f, +2.379799119e-06f, +5.792037504e-04f, -2.547291348e-05f, -7.307570094e-05f,\n    +3.209876113e-03f, -3.752734785e-03f, -8.091876415e-03f, +1.448412854e-02f, +1.202169128e-02f, -2.879481123e-02f, -9.489201110e-03f, +3.685231246e-02f, +1.635709661e-03f, -3.199920864e-02f, +4.867817292e-03f, +1.831231884e-02f, -5.550743144e-03f, -5.917779440e-03f, +2.483041827e-03f, +5.129802015e-04f,\n    -8.982582867e-05f, +3.637909909e-04f, -2.971902528e-04f, -7.513222962e-04f, +1.021720648e-03f, +8.127707584e-04f, -1.755348252e-03f, -3.694794580e-04f, +1.901636797e-03f, -2.323727364e-04f, -1.334407010e-03f, +4.981029650e-04f, +5.455166228e-04f, -3.440703317e-04f, -6.846569569e-05f, +7.307570094e-05f,\n    /* 10, 4 (16) */\n    -3.120050284e-03f, +1.014700757e-03f, +1.920946724e-02f, -5.199546196e-04f, -6.786996635e-02f, -1.095694904e-02f, +2.663067156e-01f, +4.805667962e-01f, +3.425790256e-01f, +4.236930707e-02f, -7.413644882e-02f, -1.668191578e-02f, +2.068269184e-02f, +5.163302586e-03f, -3.603796404e-03f, -5.860559025e-04f,\n    +9.584591995e-05f, -4.311755333e-04f, -3.865766366e-04f, +1.746471999e-03f, +1.430612432e-03f, -5.546981485e-03f, -9.950180138e-03f, -1.796839128e-03f, +8.901795703e-03f, +7.714707724e-03f, -2.132516203e-05f, -2.241976012e-03f, -5.695868450e-05f, +5.934209358e-04f, -1.304497082e-05f, -7.766106117e-05f,\n    +3.120050284e-03f, -3.388943794e-03f, -8.389066668e-03f, +1.373280624e-02f, +1.304341193e-02f, -2.798204047e-02f, -1.124454936e-02f, +3.648283300e-02f, +3.537346458e-03f, -3.223158138e-02f, +3.533410282e-03f, +1.881042180e-02f, -5.005226521e-03f, -6.261849771e-03f, +2.414576131e-03f, +5.860559025e-04f,\n    -9.584591995e-05f, +3.609384715e-04f, -2.606931803e-04f, -7.757428758e-04f, +9.660338085e-04f, +8.844315071e-04f, -1.713114085e-03f, -4.730424052e-04f, +1.900097714e-03f, -1.411322875e-04f, -1.365763233e-03f, +4.509870073e-04f, +5.782768362e-04f, -3.351364524e-04f, -8.275832759e-05f, +7.766106117e-05f,\n    /* 10, 5 (16) */\n    -3.024204364e-03f, +5.835252234e-04f, +1.882289061e-02f, +1.226517379e-03f, -6.643935392e-02f, -1.650393052e-02f, +2.563565355e-01f, +4.787699571e-01f, +3.514808213e-01f, +5.008401479e-02f, -7.415777398e-02f, -1.892389179e-02f, +2.062573315e-02f, +5.756723522e-03f, -3.616841375e-03f, -6.637169637e-04f,\n    +1.011089827e-04f, -4.098517539e-04f, -4.226086362e-04f, +1.676563037e-03f, +1.548098546e-03f, -5.287694653e-03f, -9.994293679e-03f, -2.190026227e-03f, +8.714252086e-03f, +7.927452544e-03f, +1.721754883e-04f, -2.277208161e-03f, -1.185716446e-04f, +6.063520191e-04f, +1.838277482e-07f, -8.215690319e-05f,\n    +3.024204364e-03f, -3.028005322e-03f, -8.649759848e-03f, +1.295706337e-02f, +1.400944574e-02f, -2.709760896e-02f, -1.295766345e-02f, +3.600979060e-02f, +5.437444172e-03f, -3.237271367e-02f, +2.167647048e-03f, +1.926140881e-02f, -4.426949685e-03f, -6.596986224e-03f, +2.331817803e-03f, +6.637169637e-04f,\n    -1.011089827e-04f, +3.568149648e-04f, -2.243479199e-04f, -7.971080899e-04f, +9.082196071e-04f, +9.526314781e-04f, -1.665951517e-03f, -5.751128615e-04f, +1.892810425e-03f, -4.861349538e-05f, -1.393283111e-03f, +4.014236137e-04f, +6.099275555e-04f, -3.246011477e-04f, -9.734610367e-05f, +8.215690319e-05f,\n    /* 10, 6 (16) */\n    -2.923095382e-03f, +1.736734695e-04f, +1.840028197e-02f, +2.903080417e-03f, -6.489125537e-02f, -2.179162518e-02f, +2.463622418e-01f, +4.765799309e-01f, +3.601950734e-01f, +5.801146733e-02f, -7.398559850e-02f, -2.120109995e-02f, +2.050716151e-02f, +6.363075541e-03f, -3.616657547e-03f, -7.458738668e-04f,\n    +1.056332458e-04f, -3.882128445e-04f, -4.559100754e-04f, +1.604676229e-03f, +1.657545151e-03f, -5.026662348e-03f, -1.002398658e-02f, -2.579567730e-03f, +8.513078807e-03f, +8.132675892e-03f, +3.724001658e-04f, -2.307501240e-03f, -1.823597859e-04f, +6.178967014e-04f, +1.420246565e-05f, -8.653469341e-05f,\n    +2.923095382e-03f, -2.671190358e-03f, -8.874107768e-03f, +1.215995528e-02f, +1.491766535e-02f, -2.614497748e-02f, -1.462361496e-02f, +3.543467773e-02f, +7.330254596e-03f, -3.242132716e-02f, +7.743639368e-04f, +1.966283242e-02f, -3.817022129e-03f, -6.921587371e-03f, +2.234471700e-03f, +7.458738668e-04f,\n    -1.056332458e-04f, +3.514791479e-04f, -1.882822589e-04f, -8.154074480e-04f, +8.485002010e-04f, +1.017186649e-03f, -1.614036301e-03f, -6.753696396e-04f, +1.879775612e-03f, +4.489670547e-05f, -1.416823338e-03f, +3.495363225e-04f, +6.403257102e-04f, -3.124548839e-04f, -1.121747884e-04f, +8.653469341e-05f,\n    /* 10, 7 (16) */\n    -2.817462136e-03f, -2.145393750e-04f, +1.794437189e-02f, +4.507756646e-03f, -6.323371022e-02f, -2.681828752e-02f, +2.363382552e-01f, +4.740003632e-01f, +3.687081522e-01f, +6.614414323e-02f, -7.361319833e-02f, -2.350860119e-02f, +2.032480172e-02f, +6.980972243e-03f, -3.602455082e-03f, -8.324085603e-04f,\n    +1.094390454e-04f, -3.663462974e-04f, -4.864854650e-04f, +1.531076411e-03f, +1.758950422e-03f, -4.764405202e-03f, -1.003935877e-02f, -2.964819543e-03f, +8.298520195e-03f, +8.329880069e-03f, +5.791092179e-04f, -2.332600989e-03f, -2.482137416e-04f, +6.279554292e-04f, +2.899632408e-05f, -9.076499098e-05f,\n    +2.817462136e-03f, -2.319711210e-03f, -9.062390027e-03f, +1.134454783e-02f, +1.576616555e-02f, -2.512779083e-02f, -1.623765126e-02f, +3.475930809e-02f, +9.210030208e-03f, -3.237643046e-02f, -6.424594009e-04f, +2.001236875e-02f, -3.176696419e-03f, -7.234042255e-03f, +2.122296911e-03f, +8.324085603e-04f,\n    -1.094390454e-04f, +3.449929113e-04f, -1.526198322e-04f, -8.306416028e-04f, +7.871011619e-04f, +1.077926982e-03f, -1.557559045e-03f, -7.734977779e-04f, +1.861013029e-03f, +1.391057373e-04f, -1.436252516e-03f, +2.954591628e-04f, +6.693296845e-04f, -2.986944284e-04f, -1.271871667e-04f, +9.076499098e-05f,\n    /* 10, 8 (16) */\n    -2.708023090e-03f, -5.808856724e-04f, +1.745788643e-02f, +6.038833057e-03f, -6.147475980e-02f, -3.158269273e-02f, +2.262988964e-01f, +4.710355436e-01f, +3.770066724e-01f, +7.447402330e-02f, -7.303408911e-02f, -2.584120218e-02f, +2.007658798e-02f, +7.608927672e-03f, -3.573458757e-03f, -9.231735512e-04f,\n    +1.125486598e-04f, -3.443368801e-04f, -5.143474809e-04f, +1.456024734e-03f, +1.852331041e-03f, -4.501438001e-03f, -1.004053766e-02f, -3.345146859e-03f, +8.070848366e-03f, +8.518577317e-03f, +7.920433793e-04f, -2.352259019e-03f, -3.160140896e-04f, +6.364297606e-04f, +4.454709359e-05f, -9.481754058e-05f,\n    +2.708023090e-03f, -1.974718299e-03f, -9.215009859e-03f, +1.051390623e-02f, +1.655326671e-02f, -2.404986385e-02f, -1.779521031e-02f, +3.398581032e-02f, +1.107104324e-02f, -3.223732472e-02f, -2.078711917e-03f, +2.030782791e-02f, -2.507366735e-03f, -7.532736684e-03f, +1.995109745e-03f, +9.231735512e-04f,\n    -1.125486598e-04f, +3.374210131e-04f, -1.174797317e-04f, -8.428221511e-04f, +7.242506242e-04f, +1.134696899e-03f, -1.496724481e-03f, -8.691896187e-04f, +1.836561498e-03f, +2.337163610e-04f, -1.451451769e-03f, +2.393363273e-04f, +6.967999002e-04f, -2.833230255e-04f, -1.423232151e-04f, +9.481754058e-05f,\n    /* 10, 9 (16) */\n    -2.595474431e-03f, -9.252225525e-04f, +1.694353895e-02f, +7.494857790e-03f, -5.962242876e-02f, -3.608413073e-02f, +2.162583588e-01f, +4.676903968e-01f, +3.850775208e-01f, +8.299260061e-02f, -7.224204573e-02f, -2.819346120e-02f, +1.976057389e-02f, +8.245357433e-03f, -3.528911664e-03f, -1.017991092e-03f,\n    +1.149861436e-04f, -3.222664415e-04f, -5.395166645e-04f, +1.379778048e-03f, +1.937721785e-03f, -4.238268581e-03f, -1.002767770e-02f, -3.719925523e-03f, +7.830362763e-03f, +8.698291032e-03f, +1.010924051e-03f, -2.366233621e-03f, -3.856313990e-04f, +6.432227382e-04f, +6.083269664e-05f, -9.866137243e-05f,\n    +2.595474431e-03f, -1.637297285e-03f, -9.332489591e-03f, +9.671084076e-03f, +1.727751733e-02f, -2.291516695e-02f, -1.929193479e-02f, +3.311662070e-02f, +1.290760473e-02f, -3.200360836e-02f, -3.530163685e-03f, +2.054716424e-02f, -1.810566834e-03f, -7.816059709e-03f, +1.852786530e-03f, +1.017991092e-03f,\n    -1.149861436e-04f, +3.288307295e-04f, -8.297614255e-05f, -8.519713973e-04f, +6.601784345e-04f, +1.187355687e-03f, -1.431750689e-03f, -9.621458585e-04f, +1.806478830e-03f, +3.284276817e-04f, -1.462315310e-03f, +1.813218010e-04f, +7.225994014e-04f, -2.663505488e-04f, -1.575202906e-04f, +9.866137243e-05f,\n    /* 10,10 (16) */\n    -2.480488287e-03f, -1.247488994e-03f, +1.640402228e-02f, +8.874635839e-03f, -5.768470697e-02f, -4.032239931e-02f, +2.062306811e-01f, +4.639704712e-01f, +3.929078835e-01f, +9.169089164e-02f, -7.123112168e-02f, -3.055969482e-02f, +1.937494249e-02f, +8.888580171e-03f, -3.468078967e-03f, -1.116652464e-03f,\n    +1.167771603e-04f, -3.002137339e-04f, -5.620211061e-04f, +1.302588329e-03f, +2.015175068e-03f, -3.975396764e-03f, -1.000095977e-02f, -4.088543372e-03f, +7.577389627e-03f, +8.868556972e-03f, +1.235453631e-03f, -2.374290557e-03f, -4.569263083e-04f, +6.482392702e-04f, +7.782722175e-05f, -1.022649092e-04f,\n    +2.480488287e-03f, -1.308466556e-03f, -9.415465734e-03f, +8.819112678e-03f, +1.793769577e-02f, -2.172781127e-02f, -2.072368548e-02f, +3.215447484e-02f, +1.471408356e-02f, -3.167518068e-02f, -4.992478995e-03f, +2.072848604e-02f, -1.087967433e-03f, -8.082410258e-03f, +1.695266239e-03f, +1.116652464e-03f,\n    -1.167771603e-04f, +3.192915029e-04f, -4.921800614e-05f, -8.581220787e-04f, +5.951153051e-04f, +1.235777858e-03f, -1.362868279e-03f, -1.052076568e-03f, +1.770841690e-03f, +4.229361746e-04f, -1.468750971e-03f, +1.215789467e-04f, +7.465944404e-04f, -2.477936289e-04f, -1.727133364e-04f, +1.022649092e-04f,\n    /* 10,11 (16) */\n    -2.363711127e-03f, -1.547702728e-03f, +1.584200118e-02f, +1.017722417e-02f, -5.566953191e-02f, -4.429779607e-02f, +1.962297213e-01f, +4.598819279e-01f, +4.004852732e-01f, +1.005594486e-01f, -6.999566805e-02f, -3.293398538e-02f, +1.891801618e-02f, +9.536819441e-03f, -3.390251745e-03f, -1.218917373e-03f,\n    +1.179488149e-04f, -2.782542523e-04f, -5.818961148e-04f, +1.224702119e-03f, +2.084760450e-03f, -3.713313321e-03f, -9.960590650e-03f, -4.450401542e-03f, +7.312281406e-03f, +9.028924444e-03f, +1.465315904e-03f, -2.376203855e-03f, -5.297496357e-04f, +6.513865162e-04f, +9.550086989e-05f, -1.055960798e-04f,\n    +2.363711127e-03f, -9.891750530e-04f, -9.464683740e-03f, +7.960990600e-03f, +1.853281107e-02f, -2.049203341e-02f, -2.208655376e-02f, +3.110239827e-02f, +1.648492525e-02f, -3.125224450e-02f, -6.461229966e-03f, +2.085006498e-02f, -3.413729927e-04f, -8.330203887e-03f, +1.522552903e-03f, +1.218917373e-03f,\n    -1.179488149e-04f, +3.088745889e-04f, -1.630871143e-05f, -8.613170562e-04f, +5.292919751e-04f, +1.279853446e-03f, -1.290319525e-03f, -1.138702179e-03f, +1.729745387e-03f, +5.169367262e-04f, -1.470680684e-03f, +6.028004957e-05f, +7.686550620e-04f, -2.276757550e-04f, -1.878351046e-04f, +1.055960798e-04f,\n    /* 10,12 (16) */\n    -2.245762312e-03f, -1.825956980e-03f, +1.526010506e-02f, +1.140192629e-02f, -5.358477146e-02f, -4.801110939e-02f, +1.862691307e-01f, +4.554315263e-01f, +4.077975546e-01f, +1.095883731e-01f, -6.853035215e-02f, -3.531018923e-02f, +1.838826655e-02f, +1.018820596e-02f, -3.294750876e-03f, -1.324513453e-03f,\n    +1.185294870e-04f, -2.564600899e-04f, -5.991838751e-04f, +1.146360002e-03f, +2.146564111e-03f, -3.452498969e-03f, -9.906802264e-03f, -4.804915740e-03f, +7.035416094e-03f, +9.178957462e-03f, +1.700176480e-03f, -2.371756599e-03f, -6.039425217e-04f, +6.525742781e-04f, +1.138199136e-04f, -1.086224396e-04f,\n    +2.245762312e-03f, -6.803004640e-04f, -9.480992451e-03f, +7.099673544e-03f, +1.906210305e-02f, -1.921217996e-02f, -2.337687328e-02f, +2.996369609e-02f, +1.821467064e-02f, -3.073530777e-02f, -7.931910651e-03f, +2.091034503e-02f, +4.272820693e-04f, -8.557879642e-03f, +1.334717798e-03f, +1.324513453e-03f,\n    -1.185294870e-04f, +2.976527050e-04f, +1.565418526e-05f, -8.616089703e-04f, +4.629383813e-04f, +1.319488243e-03f, -1.214357471e-03f, -1.221754428e-03f, +1.683303591e-03f, +6.101236891e-04f, -1.468040921e-03f, -2.394179827e-06f, +7.886556833e-04f, -2.060273506e-04f, -2.028163947e-04f, +1.086224396e-04f,\n    /* 10,13 (16) */\n    -2.127232825e-03f, -2.082417070e-03f, +1.466092119e-02f, +1.254828629e-02f, -5.143820735e-02f, -5.146360836e-02f, +1.763623284e-01f, +4.506266106e-01f, +4.148329707e-01f, +1.187673305e-01f, -6.683017567e-02f, -3.768194583e-02f, +1.778432403e-02f, +1.084078024e-02f, -3.180930962e-03f, -1.433135893e-03f,\n    +1.185486646e-04f, -2.348998102e-04f, -6.139330914e-04f, +1.067796108e-03f, +2.200688286e-03f, -3.193423410e-03f, -9.839851015e-03f, -5.151517486e-03f, +6.747196514e-03f, +9.318235891e-03f, +1.939683283e-03f, -2.360741701e-03f, -6.793366042e-04f, +6.517153938e-04f, +1.327466695e-04f, -1.113112967e-04f,\n    +2.127232825e-03f, -3.826477591e-04f, -9.465338266e-03f, +6.238064573e-03f, +1.952504143e-02f, -1.789269172e-02f, -2.459123075e-02f, +2.874194167e-02f, +1.989797423e-02f, -3.012518409e-02f, -9.399951571e-03f, +2.090795085e-02f, +1.215937753e-03f, -8.763906993e-03f, +1.131901403e-03f, +1.433135893e-03f,\n    -1.185486646e-04f, +2.856996806e-04f, +4.657921086e-05f, -8.590598665e-04f, +3.962828439e-04f, +1.354603980e-03f, -1.135244995e-03f, -1.300977268e-03f, +1.631647999e-03f, +7.021919452e-04f, -1.460783075e-03f, -6.625514129e-05f, +8.064756664e-04f, -1.828858210e-04f, -2.175863071e-04f, +1.113112967e-04f,\n    /* 10,14 (16) */\n    -2.008684160e-03f, -2.317316880e-03f, +1.404698810e-02f, +1.361608240e-02f, -4.923751906e-02f, -5.465703177e-02f, +1.665224774e-01f, +4.454750931e-01f, +4.215801672e-01f, +1.280855664e-01f, -6.489049238e-02f, -4.004268753e-02f, +1.710498742e-02f, +1.149249563e-02f, -3.048184293e-03f, -1.544447190e-03f,\n    +1.180367796e-04f, -2.136383358e-04f, -6.261986236e-04f, +9.892376468e-04f, +2.247250669e-03f, -2.936544408e-03f, -9.760016987e-03f, -5.489655306e-03f, +6.448049527e-03f, +9.446356555e-03f, +2.183467104e-03f, -2.342962675e-03f, -7.557542266e-04f, +6.487261338e-04f, +1.522394848e-04f, -1.136298447e-04f,\n    +2.008684160e-03f, -9.694807848e-05f, -9.418759055e-03f, +5.379004707e-03f, +1.992132427e-02f, -1.653808774e-02f, -2.572647575e-02f, +2.744096440e-02f, +2.152962223e-02f, -2.942299214e-02f, -1.086073465e-02f, +2.084169571e-02f, +2.022413419e-03f, -8.946792814e-03f, +9.143150961e-04f, +1.544447190e-03f,\n    -1.180367796e-04f, +2.730901122e-04f, +7.638119638e-05f, -8.537407893e-04f, +3.295512676e-04f, +1.385138445e-03f, -1.053253846e-03f, -1.376127726e-03f, +1.574927919e-03f, +7.928379732e-04f, -1.448873803e-03f, -1.311069184e-04f, +8.219998828e-04f, -1.582955729e-04f, -2.320725114e-04f, +1.136298447e-04f,\n    /* 10,15 (16) */\n    -1.890647380e-03f, -2.530955216e-03f, +1.342078947e-02f, +1.460532004e-02f, -4.699026839e-02f, -5.759357618e-02f, +1.567624604e-01f, +4.399854378e-01f, +4.280282167e-01f, +1.375319230e-01f, -6.270702528e-02f, -4.238565021e-02f, +1.634923319e-02f, +1.214122176e-02f, -2.895944808e-03f, -1.658077034e-03f,\n    +1.170250460e-04f, -1.927368539e-04f, -6.360411123e-04f, +9.109044728e-04f, +2.286383796e-03f, -2.682306906e-03f, -9.667603116e-03f, -5.818795889e-03f, +6.138425198e-03f, +9.562934316e-03f, +2.431142192e-03f, -2.318234387e-03f, -8.330086791e-04f, +6.435265979e-04f, +1.722527379e-04f, -1.155453001e-04f,\n    +1.890647380e-03f, +1.761420338e-04f, -9.342377859e-03f, +4.525263917e-03f, +2.025087554e-02f, -1.515294930e-02f, -2.677972960e-02f, +2.606483667e-02f, +2.310455015e-02f, -2.863015417e-02f, -1.230960845e-02f, +2.071058879e-02f, +2.844413302e-03f, -9.105088387e-03f, +6.822425847e-04f, +1.658077034e-03f,\n    -1.170250460e-04f, +2.598990228e-04f, +1.049814675e-04f, -8.457313496e-04f, +2.629663626e-04f, +1.411045545e-03f, -9.686636535e-04f, -1.446976716e-03f, +1.513309805e-03f, +8.817609175e-04f, -1.432295302e-03f, -1.967468878e-04f, +8.351192661e-04f, -1.323080046e-04f, -2.462015281e-04f, +1.155453001e-04f,\n    /* 10,16 (16) */\n    -1.773622334e-03f, -2.723692070e-03f, +1.278474836e-02f, +1.551622452e-02f, -4.470388459e-02f, -6.027588309e-02f, +1.470948573e-01f, +4.341666419e-01f, +4.341666419e-01f, +1.470948573e-01f, -6.027588309e-02f, -4.470388459e-02f, +1.551622452e-02f, +1.278474836e-02f, -2.723692070e-03f, -1.773622334e-03f,\n    +1.155453001e-04f, -1.722527379e-04f, -6.435265979e-04f, +8.330086791e-04f, +2.318234387e-03f, -2.431142192e-03f, -9.562934316e-03f, -6.138425198e-03f, +5.818795889e-03f, +9.667603116e-03f, +2.682306906e-03f, -2.286383796e-03f, -9.109044728e-04f, +6.360411123e-04f, +1.927368539e-04f, -1.170250460e-04f,\n    +1.773622334e-03f, +4.360410565e-04f, -9.237396391e-03f, +3.679532568e-03f, +2.051384191e-02f, -1.374190375e-02f, -2.774839325e-02f, +2.461785996e-02f, +2.461785996e-02f, -2.774839325e-02f, -1.374190375e-02f, +2.051384191e-02f, +3.679532568e-03f, -9.237396391e-03f, +4.360410565e-04f, +1.773622334e-03f,\n    -1.155453001e-04f, +2.462015281e-04f, +1.323080046e-04f, -8.351192661e-04f, +1.967468878e-04f, +1.432295302e-03f, -8.817609175e-04f, -1.513309805e-03f, +1.446976716e-03f, +9.686636535e-04f, -1.411045545e-03f, -2.629663626e-04f, +8.457313496e-04f, -1.049814675e-04f, -2.598990228e-04f, +1.170250460e-04f,\n    /* 10,17 (16) */\n    -1.658077034e-03f, -2.895944808e-03f, +1.214122176e-02f, +1.634923319e-02f, -4.238565021e-02f, -6.270702528e-02f, +1.375319230e-01f, +4.280282167e-01f, +4.399854378e-01f, +1.567624604e-01f, -5.759357618e-02f, -4.699026839e-02f, +1.460532004e-02f, +1.342078947e-02f, -2.530955216e-03f, -1.890647380e-03f,\n    +1.136298447e-04f, -1.522394848e-04f, -6.487261338e-04f, +7.557542266e-04f, +2.342962675e-03f, -2.183467104e-03f, -9.446356555e-03f, -6.448049527e-03f, +5.489655306e-03f, +9.760016987e-03f, +2.936544408e-03f, -2.247250669e-03f, -9.892376468e-04f, +6.261986236e-04f, +2.136383358e-04f, -1.180367796e-04f,\n    +1.658077034e-03f, +6.822425847e-04f, -9.105088387e-03f, +2.844413302e-03f, +2.071058879e-02f, -1.230960845e-02f, -2.863015417e-02f, +2.310455015e-02f, +2.606483667e-02f, -2.677972960e-02f, -1.515294930e-02f, +2.025087554e-02f, +4.525263917e-03f, -9.342377859e-03f, +1.761420338e-04f, +1.890647380e-03f,\n    -1.136298447e-04f, +2.320725114e-04f, +1.582955729e-04f, -8.219998828e-04f, +1.311069184e-04f, +1.448873803e-03f, -7.928379732e-04f, -1.574927919e-03f, +1.376127726e-03f, +1.053253846e-03f, -1.385138445e-03f, -3.295512676e-04f, +8.537407893e-04f, -7.638119638e-05f, -2.730901122e-04f, +1.180367796e-04f,\n    /* 10,18 (16) */\n    -1.544447190e-03f, -3.048184293e-03f, +1.149249563e-02f, +1.710498742e-02f, -4.004268753e-02f, -6.489049238e-02f, +1.280855664e-01f, +4.215801672e-01f, +4.454750931e-01f, +1.665224774e-01f, -5.465703177e-02f, -4.923751906e-02f, +1.361608240e-02f, +1.404698810e-02f, -2.317316880e-03f, -2.008684160e-03f,\n    +1.113112967e-04f, -1.327466695e-04f, -6.517153938e-04f, +6.793366042e-04f, +2.360741701e-03f, -1.939683283e-03f, -9.318235891e-03f, -6.747196514e-03f, +5.151517486e-03f, +9.839851015e-03f, +3.193423410e-03f, -2.200688286e-03f, -1.067796108e-03f, +6.139330914e-04f, +2.348998102e-04f, -1.185486646e-04f,\n    +1.544447190e-03f, +9.143150961e-04f, -8.946792814e-03f, +2.022413419e-03f, +2.084169571e-02f, -1.086073465e-02f, -2.942299214e-02f, +2.152962223e-02f, +2.744096440e-02f, -2.572647575e-02f, -1.653808774e-02f, +1.992132427e-02f, +5.379004707e-03f, -9.418759055e-03f, -9.694807848e-05f, +2.008684160e-03f,\n    -1.113112967e-04f, +2.175863071e-04f, +1.828858210e-04f, -8.064756664e-04f, +6.625514129e-05f, +1.460783075e-03f, -7.021919452e-04f, -1.631647999e-03f, +1.300977268e-03f, +1.135244995e-03f, -1.354603980e-03f, -3.962828439e-04f, +8.590598665e-04f, -4.657921086e-05f, -2.856996806e-04f, +1.185486646e-04f,\n    /* 10,19 (16) */\n    -1.433135893e-03f, -3.180930962e-03f, +1.084078024e-02f, +1.778432403e-02f, -3.768194583e-02f, -6.683017567e-02f, +1.187673305e-01f, +4.148329707e-01f, +4.506266106e-01f, +1.763623284e-01f, -5.146360836e-02f, -5.143820735e-02f, +1.254828629e-02f, +1.466092119e-02f, -2.082417070e-03f, -2.127232825e-03f,\n    +1.086224396e-04f, -1.138199136e-04f, -6.525742781e-04f, +6.039425217e-04f, +2.371756599e-03f, -1.700176480e-03f, -9.178957462e-03f, -7.035416094e-03f, +4.804915740e-03f, +9.906802264e-03f, +3.452498969e-03f, -2.146564111e-03f, -1.146360002e-03f, +5.991838751e-04f, +2.564600899e-04f, -1.185294870e-04f,\n    +1.433135893e-03f, +1.131901403e-03f, -8.763906993e-03f, +1.215937753e-03f, +2.090795085e-02f, -9.399951571e-03f, -3.012518409e-02f, +1.989797423e-02f, +2.874194167e-02f, -2.459123075e-02f, -1.789269172e-02f, +1.952504143e-02f, +6.238064573e-03f, -9.465338266e-03f, -3.826477591e-04f, +2.127232825e-03f,\n    -1.086224396e-04f, +2.028163947e-04f, +2.060273506e-04f, -7.886556833e-04f, +2.394179827e-06f, +1.468040921e-03f, -6.101236891e-04f, -1.683303591e-03f, +1.221754428e-03f, +1.214357471e-03f, -1.319488243e-03f, -4.629383813e-04f, +8.616089703e-04f, -1.565418526e-05f, -2.976527050e-04f, +1.185294870e-04f,\n    /* 10,20 (16) */\n    -1.324513453e-03f, -3.294750876e-03f, +1.018820596e-02f, +1.838826655e-02f, -3.531018923e-02f, -6.853035215e-02f, +1.095883731e-01f, +4.077975546e-01f, +4.554315263e-01f, +1.862691307e-01f, -4.801110939e-02f, -5.358477146e-02f, +1.140192629e-02f, +1.526010506e-02f, -1.825956980e-03f, -2.245762312e-03f,\n    +1.055960798e-04f, -9.550086989e-05f, -6.513865162e-04f, +5.297496357e-04f, +2.376203855e-03f, -1.465315904e-03f, -9.028924444e-03f, -7.312281406e-03f, +4.450401542e-03f, +9.960590650e-03f, +3.713313321e-03f, -2.084760450e-03f, -1.224702119e-03f, +5.818961148e-04f, +2.782542523e-04f, -1.179488149e-04f,\n    +1.324513453e-03f, +1.334717798e-03f, -8.557879642e-03f, +4.272820693e-04f, +2.091034503e-02f, -7.931910651e-03f, -3.073530777e-02f, +1.821467064e-02f, +2.996369609e-02f, -2.337687328e-02f, -1.921217996e-02f, +1.906210305e-02f, +7.099673544e-03f, -9.480992451e-03f, -6.803004640e-04f, +2.245762312e-03f,\n    -1.055960798e-04f, +1.878351046e-04f, +2.276757550e-04f, -7.686550620e-04f, -6.028004957e-05f, +1.470680684e-03f, -5.169367262e-04f, -1.729745387e-03f, +1.138702179e-03f, +1.290319525e-03f, -1.279853446e-03f, -5.292919751e-04f, +8.613170562e-04f, +1.630871143e-05f, -3.088745889e-04f, +1.179488149e-04f,\n    /* 10,21 (16) */\n    -1.218917373e-03f, -3.390251745e-03f, +9.536819441e-03f, +1.891801618e-02f, -3.293398538e-02f, -6.999566805e-02f, +1.005594486e-01f, +4.004852732e-01f, +4.598819279e-01f, +1.962297213e-01f, -4.429779607e-02f, -5.566953191e-02f, +1.017722417e-02f, +1.584200118e-02f, -1.547702728e-03f, -2.363711127e-03f,\n    +1.022649092e-04f, -7.782722175e-05f, -6.482392702e-04f, +4.569263083e-04f, +2.374290557e-03f, -1.235453631e-03f, -8.868556972e-03f, -7.577389627e-03f, +4.088543372e-03f, +1.000095977e-02f, +3.975396764e-03f, -2.015175068e-03f, -1.302588329e-03f, +5.620211061e-04f, +3.002137339e-04f, -1.167771603e-04f,\n    +1.218917373e-03f, +1.522552903e-03f, -8.330203887e-03f, -3.413729927e-04f, +2.085006498e-02f, -6.461229966e-03f, -3.125224450e-02f, +1.648492525e-02f, +3.110239827e-02f, -2.208655376e-02f, -2.049203341e-02f, +1.853281107e-02f, +7.960990600e-03f, -9.464683740e-03f, -9.891750530e-04f, +2.363711127e-03f,\n    -1.022649092e-04f, +1.727133364e-04f, +2.477936289e-04f, -7.465944404e-04f, -1.215789467e-04f, +1.468750971e-03f, -4.229361746e-04f, -1.770841690e-03f, +1.052076568e-03f, +1.362868279e-03f, -1.235777858e-03f, -5.951153051e-04f, +8.581220787e-04f, +4.921800614e-05f, -3.192915029e-04f, +1.167771603e-04f,\n    /* 10,22 (16) */\n    -1.116652464e-03f, -3.468078967e-03f, +8.888580171e-03f, +1.937494249e-02f, -3.055969482e-02f, -7.123112168e-02f, +9.169089164e-02f, +3.929078835e-01f, +4.639704712e-01f, +2.062306811e-01f, -4.032239931e-02f, -5.768470697e-02f, +8.874635839e-03f, +1.640402228e-02f, -1.247488994e-03f, -2.480488287e-03f,\n    +9.866137243e-05f, -6.083269664e-05f, -6.432227382e-04f, +3.856313990e-04f, +2.366233621e-03f, -1.010924051e-03f, -8.698291032e-03f, -7.830362763e-03f, +3.719925523e-03f, +1.002767770e-02f, +4.238268581e-03f, -1.937721785e-03f, -1.379778048e-03f, +5.395166645e-04f, +3.222664415e-04f, -1.149861436e-04f,\n    +1.116652464e-03f, +1.695266239e-03f, -8.082410258e-03f, -1.087967433e-03f, +2.072848604e-02f, -4.992478995e-03f, -3.167518068e-02f, +1.471408356e-02f, +3.215447484e-02f, -2.072368548e-02f, -2.172781127e-02f, +1.793769577e-02f, +8.819112678e-03f, -9.415465734e-03f, -1.308466556e-03f, +2.480488287e-03f,\n    -9.866137243e-05f, +1.575202906e-04f, +2.663505488e-04f, -7.225994014e-04f, -1.813218010e-04f, +1.462315310e-03f, -3.284276817e-04f, -1.806478830e-03f, +9.621458585e-04f, +1.431750689e-03f, -1.187355687e-03f, -6.601784345e-04f, +8.519713973e-04f, +8.297614255e-05f, -3.288307295e-04f, +1.149861436e-04f,\n    /* 10,23 (16) */\n    -1.017991092e-03f, -3.528911664e-03f, +8.245357433e-03f, +1.976057389e-02f, -2.819346120e-02f, -7.224204573e-02f, +8.299260061e-02f, +3.850775208e-01f, +4.676903968e-01f, +2.162583588e-01f, -3.608413073e-02f, -5.962242876e-02f, +7.494857790e-03f, +1.694353895e-02f, -9.252225525e-04f, -2.595474431e-03f,\n    +9.481754058e-05f, -4.454709359e-05f, -6.364297606e-04f, +3.160140896e-04f, +2.352259019e-03f, -7.920433793e-04f, -8.518577317e-03f, -8.070848366e-03f, +3.345146859e-03f, +1.004053766e-02f, +4.501438001e-03f, -1.852331041e-03f, -1.456024734e-03f, +5.143474809e-04f, +3.443368801e-04f, -1.125486598e-04f,\n    +1.017991092e-03f, +1.852786530e-03f, -7.816059709e-03f, -1.810566834e-03f, +2.054716424e-02f, -3.530163685e-03f, -3.200360836e-02f, +1.290760473e-02f, +3.311662070e-02f, -1.929193479e-02f, -2.291516695e-02f, +1.727751733e-02f, +9.671084076e-03f, -9.332489591e-03f, -1.637297285e-03f, +2.595474431e-03f,\n    -9.481754058e-05f, +1.423232151e-04f, +2.833230255e-04f, -6.967999002e-04f, -2.393363273e-04f, +1.451451769e-03f, -2.337163610e-04f, -1.836561498e-03f, +8.691896187e-04f, +1.496724481e-03f, -1.134696899e-03f, -7.242506242e-04f, +8.428221511e-04f, +1.174797317e-04f, -3.374210131e-04f, +1.125486598e-04f,\n    /* 10,24 (16) */\n    -9.231735512e-04f, -3.573458757e-03f, +7.608927672e-03f, +2.007658798e-02f, -2.584120218e-02f, -7.303408911e-02f, +7.447402330e-02f, +3.770066724e-01f, +4.710355436e-01f, +2.262988964e-01f, -3.158269273e-02f, -6.147475980e-02f, +6.038833057e-03f, +1.745788643e-02f, -5.808856724e-04f, -2.708023090e-03f,\n    +9.076499098e-05f, -2.899632408e-05f, -6.279554292e-04f, +2.482137416e-04f, +2.332600989e-03f, -5.791092179e-04f, -8.329880069e-03f, -8.298520195e-03f, +2.964819543e-03f, +1.003935877e-02f, +4.764405202e-03f, -1.758950422e-03f, -1.531076411e-03f, +4.864854650e-04f, +3.663462974e-04f, -1.094390454e-04f,\n    +9.231735512e-04f, +1.995109745e-03f, -7.532736684e-03f, -2.507366735e-03f, +2.030782791e-02f, -2.078711917e-03f, -3.223732472e-02f, +1.107104324e-02f, +3.398581032e-02f, -1.779521031e-02f, -2.404986385e-02f, +1.655326671e-02f, +1.051390623e-02f, -9.215009859e-03f, -1.974718299e-03f, +2.708023090e-03f,\n    -9.076499098e-05f, +1.271871667e-04f, +2.986944284e-04f, -6.693296845e-04f, -2.954591628e-04f, +1.436252516e-03f, -1.391057373e-04f, -1.861013029e-03f, +7.734977779e-04f, +1.557559045e-03f, -1.077926982e-03f, -7.871011619e-04f, +8.306416028e-04f, +1.526198322e-04f, -3.449929113e-04f, +1.094390454e-04f,\n    /* 10,25 (16) */\n    -8.324085603e-04f, -3.602455082e-03f, +6.980972243e-03f, +2.032480172e-02f, -2.350860119e-02f, -7.361319833e-02f, +6.614414323e-02f, +3.687081522e-01f, +4.740003632e-01f, +2.363382552e-01f, -2.681828752e-02f, -6.323371022e-02f, +4.507756646e-03f, +1.794437189e-02f, -2.145393750e-04f, -2.817462136e-03f,\n    +8.653469341e-05f, -1.420246565e-05f, -6.178967014e-04f, +1.823597859e-04f, +2.307501240e-03f, -3.724001658e-04f, -8.132675892e-03f, -8.513078807e-03f, +2.579567730e-03f, +1.002398658e-02f, +5.026662348e-03f, -1.657545151e-03f, -1.604676229e-03f, +4.559100754e-04f, +3.882128445e-04f, -1.056332458e-04f,\n    +8.324085603e-04f, +2.122296911e-03f, -7.234042255e-03f, -3.176696419e-03f, +2.001236875e-02f, -6.424594009e-04f, -3.237643046e-02f, +9.210030208e-03f, +3.475930809e-02f, -1.623765126e-02f, -2.512779083e-02f, +1.576616555e-02f, +1.134454783e-02f, -9.062390027e-03f, -2.319711210e-03f, +2.817462136e-03f,\n    -8.653469341e-05f, +1.121747884e-04f, +3.124548839e-04f, -6.403257102e-04f, -3.495363225e-04f, +1.416823338e-03f, -4.489670547e-05f, -1.879775612e-03f, +6.753696396e-04f, +1.614036301e-03f, -1.017186649e-03f, -8.485002010e-04f, +8.154074480e-04f, +1.882822589e-04f, -3.514791479e-04f, +1.056332458e-04f,\n    /* 10,26 (16) */\n    -7.458738668e-04f, -3.616657547e-03f, +6.363075541e-03f, +2.050716151e-02f, -2.120109995e-02f, -7.398559850e-02f, +5.801146733e-02f, +3.601950734e-01f, +4.765799309e-01f, +2.463622418e-01f, -2.179162518e-02f, -6.489125537e-02f, +2.903080417e-03f, +1.840028197e-02f, +1.736734695e-04f, -2.923095382e-03f,\n    +8.215690319e-05f, -1.838277482e-07f, -6.063520191e-04f, +1.185716446e-04f, +2.277208161e-03f, -1.721754883e-04f, -7.927452544e-03f, -8.714252086e-03f, +2.190026227e-03f, +9.994293679e-03f, +5.287694653e-03f, -1.548098546e-03f, -1.676563037e-03f, +4.226086362e-04f, +4.098517539e-04f, -1.011089827e-04f,\n    +7.458738668e-04f, +2.234471700e-03f, -6.921587371e-03f, -3.817022129e-03f, +1.966283242e-02f, +7.743639368e-04f, -3.242132716e-02f, +7.330254596e-03f, +3.543467773e-02f, -1.462361496e-02f, -2.614497748e-02f, +1.491766535e-02f, +1.215995528e-02f, -8.874107768e-03f, -2.671190358e-03f, +2.923095382e-03f,\n    -8.215690319e-05f, +9.734610367e-05f, +3.246011477e-04f, -6.099275555e-04f, -4.014236137e-04f, +1.393283111e-03f, +4.861349538e-05f, -1.892810425e-03f, +5.751128615e-04f, +1.665951517e-03f, -9.526314781e-04f, -9.082196071e-04f, +7.971080899e-04f, +2.243479199e-04f, -3.568149648e-04f, +1.011089827e-04f,\n    /* 10,27 (16) */\n    -6.637169637e-04f, -3.616841375e-03f, +5.756723522e-03f, +2.062573315e-02f, -1.892389179e-02f, -7.415777398e-02f, +5.008401479e-02f, +3.514808213e-01f, +4.787699571e-01f, +2.563565355e-01f, -1.650393052e-02f, -6.643935392e-02f, +1.226517379e-03f, +1.882289061e-02f, +5.835252234e-04f, -3.024204364e-03f,\n    +7.766106117e-05f, +1.304497082e-05f, -5.934209358e-04f, +5.695868450e-05f, +2.241976012e-03f, +2.132516203e-05f, -7.714707724e-03f, -8.901795703e-03f, +1.796839128e-03f, +9.950180138e-03f, +5.546981485e-03f, -1.430612432e-03f, -1.746471999e-03f, +3.865766366e-04f, +4.311755333e-04f, -9.584591995e-05f,\n    +6.637169637e-04f, +2.331817803e-03f, -6.596986224e-03f, -4.426949685e-03f, +1.926140881e-02f, +2.167647048e-03f, -3.237271367e-02f, +5.437444172e-03f, +3.600979060e-02f, -1.295766345e-02f, -2.709760896e-02f, +1.400944574e-02f, +1.295706337e-02f, -8.649759848e-03f, -3.028005322e-03f, +3.024204364e-03f,\n    -7.766106117e-05f, +8.275832759e-05f, +3.351364524e-04f, -5.782768362e-04f, -4.509870073e-04f, +1.365763233e-03f, +1.411322875e-04f, -1.900097714e-03f, +4.730424052e-04f, +1.713114085e-03f, -8.844315071e-04f, -9.660338085e-04f, +7.757428758e-04f, +2.606931803e-04f, -3.609384715e-04f, +9.584591995e-05f,\n    /* 10,28 (16) */\n    -5.860559025e-04f, -3.603796404e-03f, +5.163302586e-03f, +2.068269184e-02f, -1.668191578e-02f, -7.413644882e-02f, +4.236930707e-02f, +3.425790256e-01f, +4.805667962e-01f, +2.663067156e-01f, -1.095694904e-02f, -6.786996635e-02f, -5.199546196e-04f, +1.920946724e-02f, +1.014700757e-03f, -3.120050284e-03f,\n    +7.307570094e-05f, +2.547291348e-05f, -5.792037504e-04f, -2.379799119e-06f, +2.202064135e-03f, +2.078819698e-04f, -7.494947831e-03f, -9.075493508e-03f, +1.400658425e-03f, +9.891573978e-03f, +5.803997492e-03f, -1.305107515e-03f, -1.814135217e-03f, +3.478180146e-04f, +4.520941759e-04f, -8.982582867e-05f,\n    +5.860559025e-04f, +2.414576131e-03f, -6.261849771e-03f, -5.005226521e-03f, +1.881042180e-02f, +3.533410282e-03f, -3.223158138e-02f, +3.537346458e-03f, +3.648283300e-02f, -1.124454936e-02f, -2.798204047e-02f, +1.304341193e-02f, +1.373280624e-02f, -8.389066668e-03f, -3.388943794e-03f, +3.120050284e-03f,\n    -7.307570094e-05f, +6.846569569e-05f, +3.440703317e-04f, -5.455166228e-04f, -4.981029650e-04f, +1.334407010e-03f, +2.323727364e-04f, -1.901636797e-03f, +3.694794580e-04f, +1.755348252e-03f, -8.127707584e-04f, -1.021720648e-03f, +7.513222962e-04f, +2.971902528e-04f, -3.637909909e-04f, +8.982582867e-05f,\n    /* 10,29 (16) */\n    -5.129802015e-04f, -3.578323491e-03f, +4.584098836e-03f, +2.068031204e-02f, -1.447985165e-02f, -7.392856685e-02f, +3.487435924e-02f, +3.335035321e-01f, +4.819674547e-01f, +2.761982896e-01f, -5.152951546e-03f, -6.917507387e-02f, -2.334089837e-03f, +1.955728526e-02f, +1.466794933e-03f, -3.209876113e-03f,\n    +6.842836328e-05f, +3.709248724e-05f, -5.638011503e-04f, -5.935456784e-05f, +2.157736154e-03f, +3.872951273e-04f, -7.268686731e-03f, -9.235157855e-03f, +1.002142602e-03f, +9.818431511e-03f, +6.058213755e-03f, -1.171623711e-03f, -1.879282395e-03f, +3.063454208e-04f, +4.725153862e-04f, -8.303274900e-05f,\n    +5.129802015e-04f, +2.483041827e-03f, -5.917779440e-03f, -5.550743144e-03f, +1.831231884e-02f, +4.867817292e-03f, -3.199920864e-02f, +1.635709661e-03f, +3.685231246e-02f, -9.489201110e-03f, -2.879481123e-02f, +1.202169128e-02f, +1.448412854e-02f, -8.091876415e-03f, -3.752734785e-03f, +3.209876113e-03f,\n    -6.842836328e-05f, +5.451931058e-05f, +3.514184228e-04f, -5.117908634e-04f, -5.426587225e-04f, +1.299369010e-03f, +3.220545052e-04f, -1.897446001e-03f, +2.647503330e-04f, +1.792493798e-03f, -7.378467177e-04f, -1.075062234e-03f, +7.238681425e-04f, +3.337076127e-04f, -3.653173998e-04f, +8.303274900e-05f,\n    /* 10,30 (16) */\n    -4.445518383e-04f, -3.541231003e-03f, +4.020297686e-03f, +2.062095747e-02f, -1.232211549e-02f, -7.354127172e-02f, +2.760567250e-02f, +3.242683743e-01f, +4.829695973e-01f, +2.860167211e-01f, +9.052622097e-04f, -7.034669758e-02f, -4.213372232e-03f, +1.986363068e-02f, +1.939310319e-03f, -3.292908862e-03f,\n    +6.374551801e-05f, +4.789957434e-05f, -5.473138646e-04f, -1.138863962e-04f, +2.109259184e-03f, +5.593849512e-04f, -7.036444507e-03f, -9.380629856e-03f, +6.019552073e-04f, +9.730737638e-03f, +6.309098964e-03f, -1.030220430e-03f, -1.941641510e-03f, +2.621804636e-04f, +4.923448224e-04f, -7.545314953e-05f,\n    +4.445518383e-04f, +2.537561137e-03f, -5.566361017e-03f, -6.062534007e-03f, +1.776966011e-02f, +6.167186302e-03f, -3.167715414e-02f, -2.617363403e-04f, +3.711706279e-02f, -7.696707312e-03f, -2.953265794e-02f, +1.094662905e-02f, +1.520799668e-02f, -7.758168803e-03f, -4.118052185e-03f, +3.292908862e-03f,\n    -6.374551801e-05f, +4.096700691e-05f, +3.572022469e-04f, -4.772438143e-04f, -5.845525278e-04f, +1.260814382e-03f, +4.099047792e-04f, -1.887562529e-03f, +1.591853495e-04f, +1.824406662e-03f, -6.598697561e-04f, -1.125845779e-03f, +6.934136248e-04f, +3.701104367e-04f, -3.654664619e-04f, +7.545314953e-05f,\n    /* 10,31 (16) */\n    -3.808063202e-04f, -3.493331429e-03f, +3.472983821e-03f, +2.050707107e-02f, -1.021285631e-02f, -7.298188677e-02f, +2.056922800e-02f, +3.148877444e-01f, +4.835715525e-01f, +2.957474587e-01f, +7.214361174e-03f, -7.137691801e-02f, -6.155013742e-03f, +2.012581114e-02f, +2.431655141e-03f, -3.368362011e-03f,\n    +5.905249340e-05f, +5.789333512e-05f, -5.298423273e-04f, -1.659059994e-04f, +2.056903051e-03f, +7.239919468e-04f, -6.798746210e-03f, -9.511779562e-03f, +2.007634162e-04f, +9.628506085e-03f, +6.556120613e-03f, -8.809768187e-04f, -2.000939515e-03f, +2.153539325e-04f, +5.114863527e-04f, -6.707608258e-05f,\n    +3.808063202e-04f, +2.578528144e-03f, -5.209158770e-03f, -6.539777822e-03f, +1.718510759e-02f, +7.428000684e-03f, -3.126724936e-02f, -2.149298869e-03f, +3.727624814e-02f, -5.872300650e-03f, -3.019252770e-02f, +9.820783271e-03f, +1.590141031e-02f, -7.388058366e-03f, -4.483518646e-03f, +3.368362011e-03f,\n    -5.905249340e-05f, +2.785323460e-05f, +3.614489713e-04f, -4.420194799e-04f, -6.236938338e-04f, +1.218918145e-03f, +4.956591564e-04f, -1.872042266e-03f, +5.311769911e-05f, +1.850959514e-03f, -5.790625007e-04f, -1.173864442e-03f, +6.600034460e-04f, +4.062610643e-04f, -3.641911522e-04f, +6.707608258e-05f,\n    /* 11, 0 (16) */\n    +0.000000000e+00f, -1.904568305e-03f, +1.335936777e-02f, +8.405460496e-03f, -6.361097600e-02f, -1.700110841e-02f, +3.013546237e-01f, +5.211016817e-01f, +3.013546237e-01f, -1.700110841e-02f, -6.361097600e-02f, +8.405460496e-03f, +1.335936777e-02f, -1.904568305e-03f, -8.290567151e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.472952004e-04f, -6.216149968e-04f, +1.340936069e-03f, +2.054841261e-03f, -5.977058112e-03f, -1.147946560e-02f, -2.538811153e-04f, +1.138382183e-02f, +6.303087054e-03f, -1.942910092e-03f, -1.433209217e-03f, +6.079254793e-04f, +1.683933560e-04f, -8.574656972e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.480522463e-03f, -4.775743118e-03f, +1.308464897e-02f, +8.314368759e-03f, -2.916003915e-02f, -4.410825970e-03f, +3.732936584e-02f, -4.410825970e-03f, -2.916003915e-02f, +8.314368759e-03f, +1.308464897e-02f, -4.775743118e-03f, -2.480522463e-03f, +5.676567717e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.049849662e-04f, -2.302028513e-04f, -5.952533556e-04f, +1.005669730e-03f, +6.331246402e-04f, -1.832946003e-03f, -5.432457122e-05f, +1.858153918e-03f, -5.546741618e-04f, -1.053408101e-03f, +5.713413495e-04f, +2.581574779e-04f, -2.078822347e-04f, +1.346620625e-05f, +0.000000000e+00f,\n    /* 11, 1 (16) */\n    +0.000000000e+00f, -2.051863505e-03f, +1.273775278e-02f, +9.746396564e-03f, -6.155613474e-02f, -2.297816653e-02f, +2.898751581e-01f, +5.208478006e-01f, +3.127384455e-01f, -1.069802136e-02f, -6.555388609e-02f, +6.972251279e-03f, +1.396729325e-02f, -1.736174949e-03f, -9.148032848e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.268783605e-04f, -6.322909003e-04f, +1.248227886e-03f, +2.156066209e-03f, -5.649229208e-03f, -1.155514430e-02f, -7.611405568e-04f, +1.126819238e-02f, +6.626539728e-03f, -1.820199333e-03f, -1.524706656e-03f, +5.911302105e-04f, +1.901116177e-04f, -8.886658125e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.275537496e-03f, -5.005945970e-03f, +1.248939562e-02f, +9.320038489e-03f, -2.852691451e-02f, -6.243771973e-03f, +3.727504127e-02f, -2.552672051e-03f, -2.971471331e-02f, +7.260960658e-03f, +1.365599032e-02f, -4.517585640e-03f, -2.688404697e-03f, +5.811229779e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.012967661e-04f, -2.024810993e-04f, -6.164173868e-04f, +9.556137271e-04f, +7.085417387e-04f, -1.802172594e-03f, -1.627936759e-04f, +1.877678504e-03f, -4.734211408e-04f, -1.098614544e-03f, +5.446973254e-04f, +2.862363067e-04f, -2.099357034e-04f, +9.129372137e-06f, +0.000000000e+00f,\n    /* 11, 2 (16) */\n    +0.000000000e+00f, -2.178741866e-03f, +1.210546188e-02f, +1.099462445e-02f, -5.940006853e-02f, -2.862739573e-02f, +2.783200138e-01f, +5.200866601e-01f, +3.240066379e-01f, -4.071481631e-03f, -6.737408542e-02f, +5.447544623e-03f, +1.455842346e-02f, -1.546063331e-03f, -1.003669866e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.071979865e-04f, -6.400530335e-04f, +1.155414253e-03f, +2.246685944e-03f, -5.320367038e-03f, -1.161092531e-02f, -1.266892935e-03f, +1.113260386e-02f, +6.946632226e-03f, -1.686664137e-03f, -1.615077431e-03f, +5.711454312e-04f, +2.123827275e-04f, -9.161179782e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.074240730e-03f, -5.208427069e-03f, +1.187297823e-02f, +1.027565222e-02f, -2.781837277e-02f, -8.045944567e-03f, +3.711224759e-02f, -6.749935475e-04f, -3.018813445e-02f, +6.162346114e-03f, +1.420068765e-02f, -4.231349334e-03f, -2.898340401e-03f, +5.902523501e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.968722212e-04f, -1.750964586e-04f, -6.348285654e-04f, +9.034591676e-04f, +7.807080980e-04f, -1.765970402e-03f, -2.707233287e-04f, +1.891421339e-03f, -3.896091618e-04f, -1.141080469e-03f, +5.153485024e-04f, +3.143265902e-04f, -2.110945529e-04f, +4.369440610e-06f, +0.000000000e+00f,\n    /* 11, 3 (16) */\n    +0.000000000e+00f, -2.285939852e-03f, +1.146540884e-02f, +1.215003870e-02f, -5.715338258e-02f, -3.394776277e-02f, +2.667090885e-01f, +5.188197671e-01f, +3.351392418e-01f, +2.875150595e-03f, -6.906074956e-02f, +3.832467192e-03f, +1.512956889e-02f, -1.333680604e-03f, -1.095281664e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.830318502e-05f, -6.450082674e-04f, +1.062812921e-03f, +2.326828164e-03f, -4.991226734e-03f, -1.164692223e-02f, -1.770137883e-03f, +1.097713031e-02f, +7.262575094e-03f, -1.542288980e-03f, -1.703961170e-03f, +5.478964219e-04f, +2.351334187e-04f, -9.393860917e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.877368509e-03f, -5.383523527e-03f, +1.123814966e-02f, +1.117911138e-02f, -2.703766467e-02f, -9.811914969e-03f, +3.684152426e-02f, +1.216427791e-03f, -3.057774361e-02f, +5.021265645e-03f, +1.471603615e-02f, -3.917022743e-03f, -3.109434954e-03f, +5.946217907e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.917673084e-04f, -1.481483990e-04f, -6.504928668e-04f, +8.494289867e-04f, +8.494205068e-04f, -1.724494415e-03f, -3.777560982e-04f, +1.899303879e-03f, -3.034937685e-04f, -1.180603899e-03f, +4.833335002e-04f, +3.423118946e-04f, -2.113103429e-04f, -8.081390693e-07f, +0.000000000e+00f,\n    /* 11, 4 (16) */\n    +0.000000000e+00f, -2.374243037e-03f, +1.082040057e-02f, +1.321285162e-02f, -5.482655442e-02f, -3.893898951e-02f, +2.550621663e-01f, +5.170496292e-01f, +3.461163721e-01f, +1.013772569e-02f, -7.060303854e-02f, +2.128506022e-03f, +1.567746532e-02f, -1.098547185e-03f, -1.189220273e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.023706188e-05f, -6.472698169e-04f, +9.707291231e-04f, +2.396646241e-03f, -4.662549978e-03f, -1.166329422e-02f, -2.269881533e-03f, +1.080189342e-02f, +7.573575436e-03f, -1.387088395e-03f, -1.790989004e-03f, +5.213181517e-04f, +2.582844834e-04f, -9.580329841e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.685601201e-03f, -5.531671926e-03f, +1.058765680e-02f, +1.202854037e-02f, -2.618824416e-02f, -1.153640938e-02f, +3.646376817e-02f, +3.115731670e-03f, -3.088123738e-02f, +3.840661746e-03f, +1.519936965e-02f, -3.574710849e-03f, -3.320745296e-03f, +5.938136516e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.860390689e-04f, -1.217313216e-04f, -6.634268523e-04f, +7.937490495e-04f, +9.144905107e-04f, -1.677917215e-03f, -4.835378479e-04f, +1.901267847e-03f, -2.153416212e-04f, -1.216990366e-03f, +4.487024310e-04f, +3.700725160e-04f, -2.105373403e-04f, -6.395100902e-06f, +0.000000000e+00f,\n    /* 11, 5 (16) */\n    +0.000000000e+00f, -2.444480099e-03f, +1.017313076e-02f, +1.418358075e-02f, -5.242990818e-02f, -4.360153948e-02f, +2.433988720e-01f, +5.147797477e-01f, +3.569182655e-01f, +1.771130113e-02f, -7.199012694e-02f, +3.375170173e-04f, +1.619878347e-02f, -8.402627015e-04f, -1.285023571e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.303678911e-05f, -6.469565560e-04f, +8.794549476e-04f, +2.456318153e-03f, -4.335063175e-03f, -1.166024520e-02f, -2.765139089e-03f, +1.060706251e-02f, +7.878839049e-03f, -1.221107623e-03f, -1.875784547e-03f, +4.913559109e-04f, +2.817508714e-04f, -9.716227592e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.499562132e-03f, -5.653403248e-03f, +9.924229945e-03f, +1.282228942e-02f, -2.527375365e-02f, -1.321432660e-02f, +3.598023032e-02f, +5.016999518e-03f, -3.109657900e-02f, +2.623671381e-03f, +1.564807208e-02f, -3.204638333e-03f, -3.531282637e-03f, +5.874185507e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.797452882e-04f, -9.593428836e-05f, -6.736573625e-04f, +7.366472271e-04f, +9.757449570e-04f, -1.626428246e-03f, -5.877190360e-04f, +1.897275544e-03f, -1.254296023e-04f, -1.250053791e-03f, +4.115169448e-04f, +3.974859214e-04f, -2.087328446e-04f, -1.238029514e-05f, +0.000000000e+00f,\n    /* 11, 6 (16) */\n    +0.000000000e+00f, -2.497516888e-03f, +9.526174202e-03f, +1.506303569e-02f, -4.997359003e-02f, -4.793660266e-02f, +2.317386268e-01f, +5.120146086e-01f, +3.675253280e-01f, +2.559014017e-02f, -7.321123456e-02f, -1.538267530e-03f, +1.669013938e-02f, -5.585118301e-04f, -1.382185847e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.673369658e-05f, -6.441923343e-04f, +7.892687808e-04f, +2.506045352e-03f, -4.009475700e-03f, -1.163802289e-02f, -3.254937370e-03f, +1.039285442e-02f, +8.177572597e-03f, -1.044423172e-03f, -1.957964918e-03f, +4.579659243e-04f, +3.054418175e-04f, -9.797232276e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.319816844e-03f, -5.749337536e-03f, +9.250572582e-03f, +1.355893665e-02f, -2.429800870e-02f, -1.484075485e-02f, +3.539251128e-02f, +6.914275062e-03f, -3.122200860e-02f, +1.373617589e-03f, +1.605958902e-02f, -2.807152411e-03f, -3.740015481e-03f, +5.750382556e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.729441808e-04f, -7.084078296e-05f, -6.812211733e-04f, +6.783524775e-04f, +1.033026473e-03f, -1.570233017e-03f, -6.899559970e-04f, +1.887310081e-03f, -3.404387314e-05f, -1.279617346e-03f, +3.718502256e-04f, +4.244272151e-04f, -2.058575066e-04f, -1.874963546e-05f, +0.000000000e+00f,\n    /* 11, 7 (16) */\n    +0.000000000e+00f, -2.534250585e-03f, +8.881981867e-03f, +1.585230448e-02f, -4.746754467e-02f, -5.194607836e-02f, +2.201006040e-01f, +5.087596713e-01f, +3.779181824e-01f, +3.376771277e-02f, -7.425565773e-02f, -3.496232448e-03f, +1.714810530e-02f, -2.530700126e-04f, -1.480158170e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.135338610e-05f, -6.391052972e-04f, +7.004348084e-04f, +2.546051583e-03f, -3.686478220e-03f, -1.159691782e-02f, -3.738317321e-03f, +1.015953322e-02f, +8.468985806e-03f, -8.571432978e-04f, -2.037141826e-03f, +4.211159430e-04f, +3.292610009e-04f, -9.819084264e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.146872663e-03f, -5.820178319e-03f, +8.569351409e-03f, +1.423728912e-02f, -2.326498222e-02f, -1.641098786e-02f, +3.470255529e-02f, +8.801585143e-03f, -3.125605248e-02f, +9.400024357e-05f, +1.643143925e-02f, -2.382725196e-03f, -3.945872988e-03f, +5.562886201e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.656940839e-04f, -4.652850306e-05f, -6.861646173e-04f, +6.190939368e-04f, +1.086193879e-03f, -1.509552241e-03f, -7.899121992e-04f, +1.871375538e-03f, +5.852111391e-05f, -1.305514278e-03f, +3.297869390e-04f, +4.507696264e-04f, -2.018756421e-04f, -2.548606104e-05f, +0.000000000e+00f,\n    /* 11, 8 (16) */\n    +0.000000000e+00f, -2.555603971e-03f, +8.242876570e-03f, +1.655273928e-02f, -4.492149309e-02f, -5.563255658e-02f, +2.085036861e-01f, +5.050213539e-01f, +3.880777156e-01f, +4.223669858e-02f, -7.511280103e-02f, -5.533374273e-03f, +1.756922125e-02f, +7.619098826e-05f, -1.578349013e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.915867024e-06f, -6.318272127e-04f, +6.132025826e-04f, +2.576581665e-03f, -3.366741102e-03f, -1.153726214e-02f, -4.214336477e-03f, +9.907409864e-03f, +8.752293678e-03f, -6.594083894e-04f, -2.112922692e-03f, +3.807858107e-04f, +3.531067351e-04f, -9.777612154e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.811785789e-04f, -5.866706822e-03f, +7.883186792e-03f, +1.485638306e-02f, -2.217878834e-02f, -1.792054010e-02f, +3.391264309e-02f, +1.067296068e-02f, -3.119753136e-02f, -1.211514035e-03f, +1.676122619e-02f, -1.931955570e-03f, -4.147748630e-03f, +5.308025591e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.580531598e-04f, -2.306918468e-05f, -6.885431715e-04f, +5.591000242e-04f, +1.135122532e-03f, -1.444620927e-03f, -8.872594744e-04f, +1.849497036e-03f, +1.519636454e-04f, -1.327588722e-03f, +2.854231292e-04f, +4.763850190e-04f, -1.967555349e-04f, -3.256951419e-05f, +0.000000000e+00f,\n    /* 11, 9 (16) */\n    +0.000000000e+00f, -2.562519838e-03f, +7.611049357e-03f, +1.716594187e-02f, -4.234491142e-02f, -5.899929768e-02f, +1.969664240e-01f, +5.008070175e-01f, +3.979851255e-01f, +5.098899226e-02f, -7.577220942e-02f, -7.646296965e-03f, +1.795000706e-02f, +4.292977234e-04f, -1.676125134e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.564288080e-06f, -6.224928071e-04f, +5.278066510e-04f, +2.597900219e-03f, -3.050912894e-03f, -1.145942839e-02f, -4.682071381e-03f, +9.636841592e-03f, +9.026718713e-03f, -4.513912593e-04f, -2.184911820e-03f, +3.369680024e-04f, +3.768721893e-04f, -9.668759395e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.231254191e-04f, -5.889776007e-03f, +7.194643620e-03f, +1.541548309e-02f, -2.104366581e-02f, -1.936516103e-02f, +3.302538361e-02f, +1.252245772e-02f, -3.104556772e-02f, -2.539102756e-03f, +1.704664932e-02f, -1.455570551e-03f, -4.344504165e-03f, +4.982330449e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.500791075e-04f, -5.284584951e-07f, -6.884210159e-04f, +4.985975632e-04f, +1.179704599e-03f, -1.375687421e-03f, -9.816792142e-04f, +1.821720727e-03f, +2.459758139e-04f, -1.345696463e-03f, +2.388660659e-04f, +5.011444191e-04f, -1.904697302e-04f, -3.997693428e-05f, +0.000000000e+00f,\n    /* 11,10 (16) */\n    +0.000000000e+00f, -2.555955550e-03f, +6.988556550e-03f, +1.769374852e-02f, -3.974701121e-02f, -6.205021057e-02f, +1.855069956e-01f, +4.961249461e-01f, +4.076219671e-01f, +6.001571097e-02f, -7.622360068e-02f, -9.831208785e-03f, +1.828697506e-02f, +8.061699127e-04f, -1.772812728e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.907776907e-05f, -6.112391122e-04f, +4.444662506e-04f, +2.610290373e-03f, -2.739618907e-03f, -1.136382805e-02f, -5.140619940e-03f, +9.348231317e-03f, +9.291493147e-03f, -2.332973398e-04f, -2.252711610e-03f, +2.896681321e-04f, +4.004456412e-04f, -9.488611462e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -6.730463116e-04f, -5.890304466e-03f, +6.506222604e-03f, +1.591408065e-02f, -1.986396121e-02f, -2.074084845e-02f, +3.204370440e-02f, +1.434417844e-02f, -3.079959190e-02f, -3.884799219e-03f, +1.728551538e-02f, -9.544261318e-04f, -4.534973895e-03f, +4.582561106e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.418288877e-04f, +2.103426197e-05f, -6.858705636e-04f, +4.378109246e-04f, +1.219849269e-03f, -1.303012400e-03f, -1.072863528e-03f, +1.788113712e-03f, +3.402446188e-04f, -1.359705677e-03f, +1.902340416e-04f, +5.249185599e-04f, -1.829953158e-04f, -4.768226821e-05f, +0.000000000e+00f,\n    /* 11,11 (16) */\n    +0.000000000e+00f, -2.536877781e-03f, +6.377317438e-03f, +1.813821477e-02f, -3.713672083e-02f, -6.478982948e-02f, +1.741431676e-01f, +4.909843261e-01f, +4.169701984e-01f, +6.930720412e-02f, -7.645689802e-02f, -1.208392040e-02f, +1.857664319e-02f, +1.206615554e-03f, -1.867698843e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.062033667e-05f, -5.982048263e-04f, +3.633850627e-04f, +2.614052425e-03f, -2.433459876e-03f, -1.125091018e-02f, -5.589103720e-03f, +9.042026792e-03f, +9.545861170e-03f, -5.364779826e-06f, -2.315923806e-03f, +2.389054263e-04f, +4.237107612e-04f, -9.233423472e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.312174239e-04f, -5.869270204e-03f, +5.820352041e-03f, +1.635189157e-02f, -1.864411194e-02f, -2.204386085e-02f, +3.097084087e-02f, +1.613229216e-02f, -3.045934729e-02f, -5.244504897e-03f, +1.747574943e-02f, -4.295075719e-04f, -4.717969211e-03f, +4.105738424e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.333584586e-04f, +4.156586045e-05f, -6.809719658e-04f, +3.769611920e-04f, +1.255482883e-03f, -1.226867825e-03f, -1.160516358e-03f, +1.748763870e-03f, +4.344530968e-04f, -1.369497622e-03f, +1.396561165e-04f, +5.475784417e-04f, -1.743141886e-04f, -5.565649824e-05f, +0.000000000e+00f,\n    /* 11,12 (16) */\n    +0.000000000e+00f, -2.506257444e-03f, +5.779112612e-03f, +1.850159983e-02f, -3.452266841e-02f, -6.722328936e-02f, +1.628922574e-01f, +4.853952224e-01f, +4.260122252e-01f, +7.885306529e-02f, -7.646226280e-02f, -1.439984420e-02f, +1.881554862e-02f, +1.630326315e-03f, -1.960033078e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.119261508e-05f, -5.835296898e-04f, +2.847510312e-04f, +2.609502493e-03f, -2.133010727e-03f, -1.112115974e-02f, -6.026670168e-03f, +8.718719686e-03f, +9.789081151e-03f, +2.321355588e-04f, -2.374150778e-03f, +1.847131615e-04f, +4.465469274e-04f, -8.899648114e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -3.978589652e-04f, -5.827704343e-03f, +5.139380075e-03f, +1.672885277e-02f, -1.738862906e-02f, -2.327072868e-02f, +2.981032451e-02f, +1.788105603e-02f, -3.002489419e-02f, -6.614002519e-03f, +1.761540554e-02f, +1.180708697e-04f, -4.892283400e-03f, +3.549173442e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.247225261e-04f, +6.101956685e-05f, -6.738125947e-04f, +3.162653554e-04f, +1.286549006e-03f, -1.147535856e-03f, -1.244354548e-03f, +1.703779605e-03f, +5.282814765e-04f, -1.374967286e-03f, +8.727181486e-05f, +5.689959034e-04f, -1.644133056e-04f, -6.386768716e-05f, +0.000000000e+00f,\n    /* 11,13 (16) */\n    +0.000000000e+00f, -2.465064829e-03f, +5.195582922e-03f, +1.878635086e-02f, -3.191316591e-02f, -6.935630008e-02f, +1.517710976e-01f, +4.793685522e-01f, +4.347309449e-01f, +8.864214644e-02f, -7.623012724e-02f, -1.677399498e-02f, +1.900026178e-02f, +2.076873243e-03f, -2.049029559e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.079987044e-05f, -5.673538806e-04f, +2.087362411e-04f, +2.596971129e-03f, -1.838819431e-03f, -1.097509601e-02f, -6.452494754e-03f, +8.378844513e-03f, +1.002042784e-02f, +4.789002077e-04f, -2.426996842e-03f, +1.271390622e-04f, +4.688295727e-04f, -8.483963763e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -2.731364391e-04f, -5.766684776e-03f, +4.465567480e-03f, +1.704511812e-02f, -1.610208006e-02f, -2.441826453e-02f, +2.856596996e-02f, +1.958483563e-02f, -2.949661271e-02f, -7.988969805e-03f, +1.770267736e-02f, +6.870667731e-04f, -5.056696705e-03f, +2.910496570e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.159743082e-04f, +7.935497537e-05f, -6.644865060e-04f, +2.559355344e-04f, +1.313008429e-03f, -1.065307738e-03f, -1.324108863e-03f, +1.653289520e-03f, +6.214083546e-04f, -1.376023996e-03f, +3.323077078e-05f, +5.890442050e-04f, -1.532849178e-04f, -7.228104141e-05f, +0.000000000e+00f,\n    /* 11,14 (16) */\n    +0.000000000e+00f, -2.414264959e-03f, +4.628229041e-03f, +1.899508710e-02f, -2.931619478e-02f, -7.119511951e-02f, +1.407960016e-01f, +4.729160575e-01f, +4.431097894e-01f, +9.866257427e-02f, -7.575122703e-02f, -1.920099182e-02f, +1.912740084e-02f, +2.545702815e-03f, -2.133869196e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.945177645e-05f, -5.498174272e-04f, +1.354968576e-04f, +2.576801937e-03f, -1.551405963e-03f, -1.081327083e-02f, -6.865783031e-03f, +8.022977447e-03f, +1.023919453e-02f, +7.345933011e-04f, -2.474069593e-03f, +6.624565629e-05f, +4.904305609e-04f, -7.983302664e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.571621309e-04f, -5.687329801e-03f, +3.801080974e-03f, +1.730105366e-02f, -1.478907163e-02f, -2.548357227e-02f, +2.724186110e-02f, +2.123812515e-02f, -2.887520436e-02f, -9.364993801e-03f, +1.773590813e-02f, +1.276110978e-03f, -5.209981623e-03f, +2.187686156e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.071653152e-04f, +9.653803256e-05f, -6.530938851e-04f, +1.961782338e-04f, +1.334839093e-03f, -9.804826529e-04f, -1.399524947e-03f, +1.597442008e-03f, +7.135118869e-04f, -1.372591967e-03f, -2.230767534e-05f, +6.075986170e-04f, -1.409267840e-04f, -8.085899218e-05f, +0.000000000e+00f,\n    /* 11,15 (16) */\n    +0.000000000e+00f, -2.354813182e-03f, +4.078411614e-03f, +1.913058396e-02f, -2.673939285e-02f, -7.274652548e-02f, +1.299827308e-01f, +4.660502745e-01f, +4.511327669e-01f, +1.089017688e-01f, -7.501663373e-02f, -2.167506141e-02f, +1.919364650e-02f, +3.036133376e-03f, -2.213702223e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.716216885e-05f, -5.310596448e-04f, +6.517312326e-05f, +2.549350159e-03f, -1.271261362e-03f, -1.063626677e-02f, -7.265772605e-03f, +7.651735003e-03f, +1.044469523e-02f, +9.988468901e-04f, -2.514981275e-03f, +2.110586983e-06f, +5.112185933e-04f, -7.394879023e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.999681573e-05f, -5.590791768e-03f, +3.147987089e-03f, +1.749723189e-02f, -1.345423253e-02f, -2.646405492e-02f, +2.584233615e-02f, +2.283556716e-02f, -2.816169247e-02f, -1.073758577e-02f, +1.771360045e-02f, +1.883709595e-03f, -5.350908407e-03f, +1.379096234e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.834514462e-05f, +1.125409961e-04f, -6.397404787e-04f, +1.371936357e-04f, +1.352035959e-03f, -8.933665568e-04f, -1.470364230e-03f, +1.536404765e-03f, +8.042709914e-04f, -1.364610807e-03f, -7.917492811e-05f, +6.245370154e-04f, -1.273423653e-04f, -8.956129451e-05f, +0.000000000e+00f,\n    /* 11,16 (16) */\n    +0.000000000e+00f, -2.287651013e-03f, +3.547351969e-03f, +1.919575708e-02f, -2.419004269e-02f, -7.401778684e-02f, +1.193464640e-01f, +4.587845019e-01f, +4.587845019e-01f, +1.193464640e-01f, -7.401778684e-02f, -2.419004269e-02f, +1.919575708e-02f, +3.547351969e-03f, -2.287651013e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.394879023e-05f, -5.112185933e-04f, -2.110586983e-06f, +2.514981275e-03f, -9.988468901e-04f, -1.044469523e-02f, -7.651735003e-03f, +7.265772605e-03f, +1.063626677e-02f, +1.271261362e-03f, -2.549350159e-03f, -6.517312326e-05f, +5.310596448e-04f, -6.716216885e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.834832889e-05f, -5.478250772e-03f, +2.508246610e-03f, +1.763442552e-02f, -1.210219657e-02f, -2.735742148e-02f, +2.437197192e-02f, +2.437197192e-02f, -2.735742148e-02f, -1.210219657e-02f, +1.763442552e-02f, +2.508246610e-03f, -5.478250772e-03f, +4.834832889e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.956129451e-05f, +1.273423653e-04f, -6.245370154e-04f, +7.917492811e-05f, +1.364610807e-03f, -8.042709914e-04f, -1.536404765e-03f, +1.470364230e-03f, +8.933665568e-04f, -1.352035959e-03f, -1.371936357e-04f, +6.397404787e-04f, -1.125409961e-04f, -9.834514462e-05f, +0.000000000e+00f,\n    /* 11,17 (16) */\n    +0.000000000e+00f, -2.213702223e-03f, +3.036133376e-03f, +1.919364650e-02f, -2.167506141e-02f, -7.501663373e-02f, +1.089017688e-01f, +4.511327669e-01f, +4.660502745e-01f, +1.299827308e-01f, -7.274652548e-02f, -2.673939285e-02f, +1.913058396e-02f, +4.078411614e-03f, -2.354813182e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.983302664e-05f, -4.904305609e-04f, -6.624565629e-05f, +2.474069593e-03f, -7.345933011e-04f, -1.023919453e-02f, -8.022977447e-03f, +6.865783031e-03f, +1.081327083e-02f, +1.551405963e-03f, -2.576801937e-03f, -1.354968576e-04f, +5.498174272e-04f, -5.945177645e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.379096234e-04f, -5.350908407e-03f, +1.883709595e-03f, +1.771360045e-02f, -1.073758577e-02f, -2.816169247e-02f, +2.283556716e-02f, +2.584233615e-02f, -2.646405492e-02f, -1.345423253e-02f, +1.749723189e-02f, +3.147987089e-03f, -5.590791768e-03f, -4.999681573e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.085899218e-05f, +1.409267840e-04f, -6.075986170e-04f, +2.230767534e-05f, +1.372591967e-03f, -7.135118869e-04f, -1.597442008e-03f, +1.399524947e-03f, +9.804826529e-04f, -1.334839093e-03f, -1.961782338e-04f, +6.530938851e-04f, -9.653803256e-05f, -1.071653152e-04f, +0.000000000e+00f,\n    /* 11,18 (16) */\n    +0.000000000e+00f, -2.133869196e-03f, +2.545702815e-03f, +1.912740084e-02f, -1.920099182e-02f, -7.575122703e-02f, +9.866257427e-02f, +4.431097894e-01f, +4.729160575e-01f, +1.407960016e-01f, -7.119511951e-02f, -2.931619478e-02f, +1.899508710e-02f, +4.628229041e-03f, -2.414264959e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.483963763e-05f, -4.688295727e-04f, -1.271390622e-04f, +2.426996842e-03f, -4.789002077e-04f, -1.002042784e-02f, -8.378844513e-03f, +6.452494754e-03f, +1.097509601e-02f, +1.838819431e-03f, -2.596971129e-03f, -2.087362411e-04f, +5.673538806e-04f, -5.079987044e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.187686156e-04f, -5.209981623e-03f, +1.276110978e-03f, +1.773590813e-02f, -9.364993801e-03f, -2.887520436e-02f, +2.123812515e-02f, +2.724186110e-02f, -2.548357227e-02f, -1.478907163e-02f, +1.730105366e-02f, +3.801080974e-03f, -5.687329801e-03f, -1.571621309e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.228104141e-05f, +1.532849178e-04f, -5.890442050e-04f, -3.323077078e-05f, +1.376023996e-03f, -6.214083546e-04f, -1.653289520e-03f, +1.324108863e-03f, +1.065307738e-03f, -1.313008429e-03f, -2.559355344e-04f, +6.644865060e-04f, -7.935497537e-05f, -1.159743082e-04f, +0.000000000e+00f,\n    /* 11,19 (16) */\n    +0.000000000e+00f, -2.049029559e-03f, +2.076873243e-03f, +1.900026178e-02f, -1.677399498e-02f, -7.623012724e-02f, +8.864214644e-02f, +4.347309449e-01f, +4.793685522e-01f, +1.517710976e-01f, -6.935630008e-02f, -3.191316591e-02f, +1.878635086e-02f, +5.195582922e-03f, -2.465064829e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.899648114e-05f, -4.465469274e-04f, -1.847131615e-04f, +2.374150778e-03f, -2.321355588e-04f, -9.789081151e-03f, -8.718719686e-03f, +6.026670168e-03f, +1.112115974e-02f, +2.133010727e-03f, -2.609502493e-03f, -2.847510312e-04f, +5.835296898e-04f, -4.119261508e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.910496570e-04f, -5.056696705e-03f, +6.870667731e-04f, +1.770267736e-02f, -7.988969805e-03f, -2.949661271e-02f, +1.958483563e-02f, +2.856596996e-02f, -2.441826453e-02f, -1.610208006e-02f, +1.704511812e-02f, +4.465567480e-03f, -5.766684776e-03f, -2.731364391e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.386768716e-05f, +1.644133056e-04f, -5.689959034e-04f, -8.727181486e-05f, +1.374967286e-03f, -5.282814765e-04f, -1.703779605e-03f, +1.244354548e-03f, +1.147535856e-03f, -1.286549006e-03f, -3.162653554e-04f, +6.738125947e-04f, -6.101956685e-05f, -1.247225261e-04f, +0.000000000e+00f,\n    /* 11,20 (16) */\n    +0.000000000e+00f, -1.960033078e-03f, +1.630326315e-03f, +1.881554862e-02f, -1.439984420e-02f, -7.646226280e-02f, +7.885306529e-02f, +4.260122252e-01f, +4.853952224e-01f, +1.628922574e-01f, -6.722328936e-02f, -3.452266841e-02f, +1.850159983e-02f, +5.779112612e-03f, -2.506257444e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.233423472e-05f, -4.237107612e-04f, -2.389054263e-04f, +2.315923806e-03f, +5.364779826e-06f, -9.545861170e-03f, -9.042026792e-03f, +5.589103720e-03f, +1.125091018e-02f, +2.433459876e-03f, -2.614052425e-03f, -3.633850627e-04f, +5.982048263e-04f, -3.062033667e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.549173442e-04f, -4.892283400e-03f, +1.180708697e-04f, +1.761540554e-02f, -6.614002519e-03f, -3.002489419e-02f, +1.788105603e-02f, +2.981032451e-02f, -2.327072868e-02f, -1.738862906e-02f, +1.672885277e-02f, +5.139380075e-03f, -5.827704343e-03f, -3.978589652e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.565649824e-05f, +1.743141886e-04f, -5.475784417e-04f, -1.396561165e-04f, +1.369497622e-03f, -4.344530968e-04f, -1.748763870e-03f, +1.160516358e-03f, +1.226867825e-03f, -1.255482883e-03f, -3.769611920e-04f, +6.809719658e-04f, -4.156586045e-05f, -1.333584586e-04f, +0.000000000e+00f,\n    /* 11,21 (16) */\n    +0.000000000e+00f, -1.867698843e-03f, +1.206615554e-03f, +1.857664319e-02f, -1.208392040e-02f, -7.645689802e-02f, +6.930720412e-02f, +4.169701984e-01f, +4.909843261e-01f, +1.741431676e-01f, -6.478982948e-02f, -3.713672083e-02f, +1.813821477e-02f, +6.377317438e-03f, -2.536877781e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.488611462e-05f, -4.004456412e-04f, -2.896681321e-04f, +2.252711610e-03f, +2.332973398e-04f, -9.291493147e-03f, -9.348231317e-03f, +5.140619940e-03f, +1.136382805e-02f, +2.739618907e-03f, -2.610290373e-03f, -4.444662506e-04f, +6.112391122e-04f, -1.907776907e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.105738424e-04f, -4.717969211e-03f, -4.295075719e-04f, +1.747574943e-02f, -5.244504897e-03f, -3.045934729e-02f, +1.613229216e-02f, +3.097084087e-02f, -2.204386085e-02f, -1.864411194e-02f, +1.635189157e-02f, +5.820352041e-03f, -5.869270204e-03f, -5.312174239e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.768226821e-05f, +1.829953158e-04f, -5.249185599e-04f, -1.902340416e-04f, +1.359705677e-03f, -3.402446188e-04f, -1.788113712e-03f, +1.072863528e-03f, +1.303012400e-03f, -1.219849269e-03f, -4.378109246e-04f, +6.858705636e-04f, -2.103426197e-05f, -1.418288877e-04f, +0.000000000e+00f,\n    /* 11,22 (16) */\n    +0.000000000e+00f, -1.772812728e-03f, +8.061699127e-04f, +1.828697506e-02f, -9.831208785e-03f, -7.622360068e-02f, +6.001571097e-02f, +4.076219671e-01f, +4.961249461e-01f, +1.855069956e-01f, -6.205021057e-02f, -3.974701121e-02f, +1.769374852e-02f, +6.988556550e-03f, -2.555955550e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.668759395e-05f, -3.768721893e-04f, -3.369680024e-04f, +2.184911820e-03f, +4.513912593e-04f, -9.026718713e-03f, -9.636841592e-03f, +4.682071381e-03f, +1.145942839e-02f, +3.050912894e-03f, -2.597900219e-03f, -5.278066510e-04f, +6.224928071e-04f, -6.564288080e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.582561106e-04f, -4.534973895e-03f, -9.544261318e-04f, +1.728551538e-02f, -3.884799219e-03f, -3.079959190e-02f, +1.434417844e-02f, +3.204370440e-02f, -2.074084845e-02f, -1.986396121e-02f, +1.591408065e-02f, +6.506222604e-03f, -5.890304466e-03f, -6.730463116e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.997693428e-05f, +1.904697302e-04f, -5.011444191e-04f, -2.388660659e-04f, +1.345696463e-03f, -2.459758139e-04f, -1.821720727e-03f, +9.816792142e-04f, +1.375687421e-03f, -1.179704599e-03f, -4.985975632e-04f, +6.884210159e-04f, +5.284584951e-07f, -1.500791075e-04f, +0.000000000e+00f,\n    /* 11,23 (16) */\n    +0.000000000e+00f, -1.676125134e-03f, +4.292977234e-04f, +1.795000706e-02f, -7.646296965e-03f, -7.577220942e-02f, +5.098899226e-02f, +3.979851255e-01f, +5.008070175e-01f, +1.969664240e-01f, -5.899929768e-02f, -4.234491142e-02f, +1.716594187e-02f, +7.611049357e-03f, -2.562519838e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.777612154e-05f, -3.531067351e-04f, -3.807858107e-04f, +2.112922692e-03f, +6.594083894e-04f, -8.752293678e-03f, -9.907409864e-03f, +4.214336477e-03f, +1.153726214e-02f, +3.366741102e-03f, -2.576581665e-03f, -6.132025826e-04f, +6.318272127e-04f, +6.915867024e-06f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.982330449e-04f, -4.344504165e-03f, -1.455570551e-03f, +1.704664932e-02f, -2.539102756e-03f, -3.104556772e-02f, +1.252245772e-02f, +3.302538361e-02f, -1.936516103e-02f, -2.104366581e-02f, +1.541548309e-02f, +7.194643620e-03f, -5.889776007e-03f, -8.231254191e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.256951419e-05f, +1.967555349e-04f, -4.763850190e-04f, -2.854231292e-04f, +1.327588722e-03f, -1.519636454e-04f, -1.849497036e-03f, +8.872594744e-04f, +1.444620927e-03f, -1.135122532e-03f, -5.591000242e-04f, +6.885431715e-04f, +2.306918468e-05f, -1.580531598e-04f, +0.000000000e+00f,\n    /* 11,24 (16) */\n    +0.000000000e+00f, -1.578349013e-03f, +7.619098826e-05f, +1.756922125e-02f, -5.533374273e-03f, -7.511280103e-02f, +4.223669858e-02f, +3.880777156e-01f, +5.050213539e-01f, +2.085036861e-01f, -5.563255658e-02f, -4.492149309e-02f, +1.655273928e-02f, +8.242876570e-03f, -2.555603971e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.819084264e-05f, -3.292610009e-04f, -4.211159430e-04f, +2.037141826e-03f, +8.571432978e-04f, -8.468985806e-03f, -1.015953322e-02f, +3.738317321e-03f, +1.159691782e-02f, +3.686478220e-03f, -2.546051583e-03f, -7.004348084e-04f, +6.391052972e-04f, +2.135338610e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.308025591e-04f, -4.147748630e-03f, -1.931955570e-03f, +1.676122619e-02f, -1.211514035e-03f, -3.119753136e-02f, +1.067296068e-02f, +3.391264309e-02f, -1.792054010e-02f, -2.217878834e-02f, +1.485638306e-02f, +7.883186792e-03f, -5.866706822e-03f, -9.811785789e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.548606104e-05f, +2.018756421e-04f, -4.507696264e-04f, -3.297869390e-04f, +1.305514278e-03f, -5.852111391e-05f, -1.871375538e-03f, +7.899121992e-04f, +1.509552241e-03f, -1.086193879e-03f, -6.190939368e-04f, +6.861646173e-04f, +4.652850306e-05f, -1.656940839e-04f, +0.000000000e+00f,\n    /* 11,25 (16) */\n    +0.000000000e+00f, -1.480158170e-03f, -2.530700126e-04f, +1.714810530e-02f, -3.496232448e-03f, -7.425565773e-02f, +3.376771277e-02f, +3.779181824e-01f, +5.087596713e-01f, +2.201006040e-01f, -5.194607836e-02f, -4.746754467e-02f, +1.585230448e-02f, +8.881981867e-03f, -2.534250585e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.797232276e-05f, -3.054418175e-04f, -4.579659243e-04f, +1.957964918e-03f, +1.044423172e-03f, -8.177572597e-03f, -1.039285442e-02f, +3.254937370e-03f, +1.163802289e-02f, +4.009475700e-03f, -2.506045352e-03f, -7.892687808e-04f, +6.441923343e-04f, +3.673369658e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.562886201e-04f, -3.945872988e-03f, -2.382725196e-03f, +1.643143925e-02f, +9.400024357e-05f, -3.125605248e-02f, +8.801585143e-03f, +3.470255529e-02f, -1.641098786e-02f, -2.326498222e-02f, +1.423728912e-02f, +8.569351409e-03f, -5.820178319e-03f, -1.146872663e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.874963546e-05f, +2.058575066e-04f, -4.244272151e-04f, -3.718502256e-04f, +1.279617346e-03f, +3.404387314e-05f, -1.887310081e-03f, +6.899559970e-04f, +1.570233017e-03f, -1.033026473e-03f, -6.783524775e-04f, +6.812211733e-04f, +7.084078296e-05f, -1.729441808e-04f, +0.000000000e+00f,\n    /* 11,26 (16) */\n    +0.000000000e+00f, -1.382185847e-03f, -5.585118301e-04f, +1.669013938e-02f, -1.538267530e-03f, -7.321123456e-02f, +2.559014017e-02f, +3.675253280e-01f, +5.120146086e-01f, +2.317386268e-01f, -4.793660266e-02f, -4.997359003e-02f, +1.506303569e-02f, +9.526174202e-03f, -2.497516888e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.716227592e-05f, -2.817508714e-04f, -4.913559109e-04f, +1.875784547e-03f, +1.221107623e-03f, -7.878839049e-03f, -1.060706251e-02f, +2.765139089e-03f, +1.166024520e-02f, +4.335063175e-03f, -2.456318153e-03f, -8.794549476e-04f, +6.469565560e-04f, +5.303678911e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.750382556e-04f, -3.740015481e-03f, -2.807152411e-03f, +1.605958902e-02f, +1.373617589e-03f, -3.122200860e-02f, +6.914275062e-03f, +3.539251128e-02f, -1.484075485e-02f, -2.429800870e-02f, +1.355893665e-02f, +9.250572582e-03f, -5.749337536e-03f, -1.319816844e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.238029514e-05f, +2.087328446e-04f, -3.974859214e-04f, -4.115169448e-04f, +1.250053791e-03f, +1.254296023e-04f, -1.897275544e-03f, +5.877190360e-04f, +1.626428246e-03f, -9.757449570e-04f, -7.366472271e-04f, +6.736573625e-04f, +9.593428836e-05f, -1.797452882e-04f, +0.000000000e+00f,\n    /* 11,27 (16) */\n    +0.000000000e+00f, -1.285023571e-03f, -8.402627015e-04f, +1.619878347e-02f, +3.375170173e-04f, -7.199012694e-02f, +1.771130113e-02f, +3.569182655e-01f, +5.147797477e-01f, +2.433988720e-01f, -4.360153948e-02f, -5.242990818e-02f, +1.418358075e-02f, +1.017313076e-02f, -2.444480099e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.580329841e-05f, -2.582844834e-04f, -5.213181517e-04f, +1.790989004e-03f, +1.387088395e-03f, -7.573575436e-03f, -1.080189342e-02f, +2.269881533e-03f, +1.166329422e-02f, +4.662549978e-03f, -2.396646241e-03f, -9.707291231e-04f, +6.472698169e-04f, +7.023706188e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.874185507e-04f, -3.531282637e-03f, -3.204638333e-03f, +1.564807208e-02f, +2.623671381e-03f, -3.109657900e-02f, +5.016999518e-03f, +3.598023032e-02f, -1.321432660e-02f, -2.527375365e-02f, +1.282228942e-02f, +9.924229945e-03f, -5.653403248e-03f, -1.499562132e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.395100902e-06f, +2.105373403e-04f, -3.700725160e-04f, -4.487024310e-04f, +1.216990366e-03f, +2.153416212e-04f, -1.901267847e-03f, +4.835378479e-04f, +1.677917215e-03f, -9.144905107e-04f, -7.937490495e-04f, +6.634268523e-04f, +1.217313216e-04f, -1.860390689e-04f, +0.000000000e+00f,\n    /* 11,28 (16) */\n    +0.000000000e+00f, -1.189220273e-03f, -1.098547185e-03f, +1.567746532e-02f, +2.128506022e-03f, -7.060303854e-02f, +1.013772569e-02f, +3.461163721e-01f, +5.170496292e-01f, +2.550621663e-01f, -3.893898951e-02f, -5.482655442e-02f, +1.321285162e-02f, +1.082040057e-02f, -2.374243037e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.393860917e-05f, -2.351334187e-04f, -5.478964219e-04f, +1.703961170e-03f, +1.542288980e-03f, -7.262575094e-03f, -1.097713031e-02f, +1.770137883e-03f, +1.164692223e-02f, +4.991226734e-03f, -2.326828164e-03f, -1.062812921e-03f, +6.450082674e-04f, +8.830318502e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.938136516e-04f, -3.320745296e-03f, -3.574710849e-03f, +1.519936965e-02f, +3.840661746e-03f, -3.088123738e-02f, +3.115731670e-03f, +3.646376817e-02f, -1.153640938e-02f, -2.618824416e-02f, +1.202854037e-02f, +1.058765680e-02f, -5.531671926e-03f, -1.685601201e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.081390693e-07f, +2.113103429e-04f, -3.423118946e-04f, -4.833335002e-04f, +1.180603899e-03f, +3.034937685e-04f, -1.899303879e-03f, +3.777560982e-04f, +1.724494415e-03f, -8.494205068e-04f, -8.494289867e-04f, +6.504928668e-04f, +1.481483990e-04f, -1.917673084e-04f, +0.000000000e+00f,\n    /* 11,29 (16) */\n    +0.000000000e+00f, -1.095281664e-03f, -1.333680604e-03f, +1.512956889e-02f, +3.832467192e-03f, -6.906074956e-02f, +2.875150595e-03f, +3.351392418e-01f, +5.188197671e-01f, +2.667090885e-01f, -3.394776277e-02f, -5.715338258e-02f, +1.215003870e-02f, +1.146540884e-02f, -2.285939852e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.161179782e-05f, -2.123827275e-04f, -5.711454312e-04f, +1.615077431e-03f, +1.686664137e-03f, -6.946632226e-03f, -1.113260386e-02f, +1.266892935e-03f, +1.161092531e-02f, +5.320367038e-03f, -2.246685944e-03f, -1.155414253e-03f, +6.400530335e-04f, +1.071979865e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.946217907e-04f, -3.109434954e-03f, -3.917022743e-03f, +1.471603615e-02f, +5.021265645e-03f, -3.057774361e-02f, +1.216427791e-03f, +3.684152426e-02f, -9.811914969e-03f, -2.703766467e-02f, +1.117911138e-02f, +1.123814966e-02f, -5.383523527e-03f, -1.877368509e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -4.369440610e-06f, +2.110945529e-04f, -3.143265902e-04f, -5.153485024e-04f, +1.141080469e-03f, +3.896091618e-04f, -1.891421339e-03f, +2.707233287e-04f, +1.765970402e-03f, -7.807080980e-04f, -9.034591676e-04f, +6.348285654e-04f, +1.750964586e-04f, -1.968722212e-04f, +0.000000000e+00f,\n    /* 11,30 (16) */\n    +0.000000000e+00f, -1.003669866e-03f, -1.546063331e-03f, +1.455842346e-02f, +5.447544623e-03f, -6.737408542e-02f, -4.071481631e-03f, +3.240066379e-01f, +5.200866601e-01f, +2.783200138e-01f, -2.862739573e-02f, -5.940006853e-02f, +1.099462445e-02f, +1.210546188e-02f, -2.178741866e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.886658125e-05f, -1.901116177e-04f, -5.911302105e-04f, +1.524706656e-03f, +1.820199333e-03f, -6.626539728e-03f, -1.126819238e-02f, +7.611405568e-04f, +1.155514430e-02f, +5.649229208e-03f, -2.156066209e-03f, -1.248227886e-03f, +6.322909003e-04f, +1.268783605e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.902523501e-04f, -2.898340401e-03f, -4.231349334e-03f, +1.420068765e-02f, +6.162346114e-03f, -3.018813445e-02f, -6.749935475e-04f, +3.711224759e-02f, -8.045944567e-03f, -2.781837277e-02f, +1.027565222e-02f, +1.187297823e-02f, -5.208427069e-03f, -2.074240730e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.129372137e-06f, +2.099357034e-04f, -2.862363067e-04f, -5.446973254e-04f, +1.098614544e-03f, +4.734211408e-04f, -1.877678504e-03f, +1.627936759e-04f, +1.802172594e-03f, -7.085417387e-04f, -9.556137271e-04f, +6.164173868e-04f, +2.024810993e-04f, -2.012967661e-04f, +0.000000000e+00f,\n    /* 11,31 (16) */\n    +0.000000000e+00f, -9.148032848e-04f, -1.736174949e-03f, +1.396729325e-02f, +6.972251279e-03f, -6.555388609e-02f, -1.069802136e-02f, +3.127384455e-01f, +5.208478006e-01f, +2.898751581e-01f, -2.297816653e-02f, -6.155613474e-02f, +9.746396564e-03f, +1.273775278e-02f, -2.051863505e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.574656972e-05f, -1.683933560e-04f, -6.079254793e-04f, +1.433209217e-03f, +1.942910092e-03f, -6.303087054e-03f, -1.138382183e-02f, +2.538811153e-04f, +1.147946560e-02f, +5.977058112e-03f, -2.054841261e-03f, -1.340936069e-03f, +6.216149968e-04f, +1.472952004e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.811229779e-04f, -2.688404697e-03f, -4.517585640e-03f, +1.365599032e-02f, +7.260960658e-03f, -2.971471331e-02f, -2.552672051e-03f, +3.727504127e-02f, -6.243771973e-03f, -2.852691451e-02f, +9.320038489e-03f, +1.248939562e-02f, -5.005945970e-03f, -2.275537496e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.346620625e-05f, +2.078822347e-04f, -2.581574779e-04f, -5.713413495e-04f, +1.053408101e-03f, +5.546741618e-04f, -1.858153918e-03f, +5.432457122e-05f, +1.832946003e-03f, -6.331246402e-04f, -1.005669730e-03f, +5.952533556e-04f, +2.302028513e-04f, -2.049849662e-04f, +0.000000000e+00f,\n    /* 12, 0 (16) */\n    +0.000000000e+00f, -4.385090767e-03f, +8.583624654e-03f, +2.149010947e-02f, -5.529660724e-02f, -4.616114756e-02f, +2.969437977e-01f, +5.584310476e-01f, +2.969437977e-01f, -4.616114756e-02f, -5.529660724e-02f, +2.149010947e-02f, +8.583624654e-03f, -4.385090767e-03f, -2.613999434e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.768976579e-05f, -8.518178481e-04f, +7.456827132e-04f, +3.060510991e-03f, -5.343933472e-03f, -1.331241160e-02f, -3.082056865e-04f, +1.324197575e-02f, +5.748412892e-03f, -2.996318192e-03f, -8.618678673e-04f, +8.660829573e-04f, -3.948887869e-05f, -7.228036347e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.385090767e-03f, -8.116893231e-03f, -8.922865569e-04f, +2.202328737e-02f, -2.110190956e-02f, -1.394485664e-02f, +3.732936584e-02f, -1.394485664e-02f, -2.110190956e-02f, +2.202328737e-02f, -8.922865569e-04f, -8.116893231e-03f, +3.333012858e-03f, +2.613999434e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -5.768976579e-05f, +4.395561877e-04f, -9.567603037e-04f, +2.376959244e-04f, +1.528844573e-03f, -1.937939192e-03f, -7.280146223e-05f, +2.004762733e-03f, -1.464361568e-03f, -3.326174256e-04f, +9.885505371e-04f, -4.199849082e-04f, -6.968989714e-05f, +7.228036347e-05f, +0.000000000e+00f,\n    /* 12, 1 (16) */\n    +0.000000000e+00f, -4.327401002e-03f, +7.731806806e-03f, +2.223579218e-02f, -5.223609625e-02f, -5.150508103e-02f, +2.836313861e-01f, +5.581228419e-01f, +3.101857735e-01f, -4.041273467e-02f, -5.829292543e-02f, +2.062824160e-02f, +9.449707611e-03f, -4.424579646e-03f, -3.336803069e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.441840558e-05f, -8.347719996e-04f, +6.318104988e-04f, +3.111679936e-03f, -4.940687470e-03f, -1.335731689e-02f, -9.239342327e-04f, +1.314587089e-02f, +6.153118587e-03f, -2.918813877e-03f, -9.800093305e-04f, +8.773665173e-04f, -1.982408569e-05f, -7.973720911e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.327401002e-03f, -7.677337043e-03f, -1.849046861e-03f, +2.226098329e-02f, -1.957306499e-02f, -1.588279583e-02f, +3.725656438e-02f, -1.194009391e-02f, -2.256627113e-02f, +2.169066994e-02f, +9.626398011e-05f, -8.536878139e-03f, +3.263322961e-03f, +3.336803069e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.441840558e-05f, +4.563134437e-04f, -9.215951689e-04f, +1.435751254e-04f, +1.586203207e-03f, -1.863578082e-03f, -2.180929495e-04f, +2.063717530e-03f, -1.392953765e-03f, -4.279244817e-04f, +1.016728084e-03f, -3.976041819e-04f, -9.173925168e-05f, +7.973720911e-05f, +0.000000000e+00f,\n    /* 12, 2 (16) */\n    +0.000000000e+00f, -4.252982596e-03f, +6.897034807e-03f, +2.286760268e-02f, -4.912441631e-02f, -5.644576850e-02f, +2.702740692e-01f, +5.571989077e-01f, +3.233316444e-01f, -3.425961608e-02f, -6.121173931e-02f, +1.964823227e-02f, +1.032707413e-02f, -4.444403732e-03f, -4.134175160e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.967423475e-05f, -8.151494921e-04f, +5.205856872e-04f, +3.150145112e-03f, -4.539658940e-03f, -1.337689571e-02f, -1.537616264e-03f, +1.302402520e-02f, +6.557023064e-03f, -2.827744606e-03f, -1.099728929e-03f, +8.854720214e-04f, +1.288174649e-06f, -8.724235721e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.252982596e-03f, -7.221023599e-03f, -2.770642030e-03f, +2.240455842e-02f, -1.798686178e-02f, -1.774637391e-02f, +3.703847143e-02f, -9.876376375e-03f, -2.395922489e-02f, +2.126274546e-02f, +1.112992064e-03f, -8.934482321e-03f, +3.171583709e-03f, +4.134175160e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.967423475e-05f, +4.702668609e-04f, -8.833037439e-04f, +5.065945679e-05f, +1.636272318e-03f, -1.782042421e-03f, -3.624515650e-04f, +2.114505956e-03f, -1.314854568e-03f, -5.231930854e-04f, +1.041067443e-03f, -3.724337367e-04f, -1.143898470e-04f, +8.724235721e-05f, +0.000000000e+00f,\n    /* 12, 3 (16) */\n    +0.000000000e+00f, -4.163308361e-03f, +6.081885314e-03f, +2.338818837e-02f, -4.597427120e-02f, -6.098542744e-02f, +2.568971735e-01f, +5.556612914e-01f, +3.363556696e-01f, -2.770259302e-02f, -6.403948391e-02f, +1.854850334e-02f, +1.121254615e-02f, -4.443115557e-03f, -5.006598732e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.034641234e-04f, -7.931566664e-04f, +4.123200544e-04f, +3.176257150e-03f, -4.141806227e-03f, -1.337141665e-02f, -2.147893981e-03f, +1.287643418e-02f, +6.959081326e-03f, -2.722892879e-03f, -1.220627670e-03f, +8.902083165e-04f, +2.382307579e-05f, -9.474674824e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.163308361e-03f, -6.750756739e-03f, -3.653945773e-03f, +2.245521787e-02f, -1.635058946e-02f, -1.952841633e-02f, +3.667601986e-02f, -7.761870419e-03f, -2.527407946e-02f, +2.073955237e-02f, +2.154059507e-03f, -9.306916058e-03f, +3.057193862e-03f, +5.006598732e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.034641234e-04f, +4.814409226e-04f, -8.421439845e-04f, -4.065915088e-05f, +1.678921589e-03f, -1.693725217e-03f, -5.052601862e-04f, +2.156865482e-03f, -1.230330450e-03f, -6.179923005e-04f, +1.061356810e-03f, -3.445087681e-04f, -1.375350439e-04f, +9.474674824e-05f, +0.000000000e+00f,\n    /* 12, 4 (16) */\n    +0.000000000e+00f, -4.059844238e-03f, +5.288728648e-03f, +2.380050842e-02f, -4.279801405e-02f, -6.512723367e-02f, +2.435257569e-01f, +5.535133974e-01f, +3.492321037e-01f, -2.074351169e-02f, -6.676237679e-02f, +1.732787567e-02f, +1.210275447e-02f, -4.419292481e-03f, -5.954066215e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.158020071e-04f, -7.690011385e-04f, +3.073022708e-04f, +3.190395290e-03f, -3.748059468e-03f, -1.334121144e-02f, -2.753419381e-03f, +1.270316126e-02f, +7.358233815e-03f, -2.604078761e-03f, -1.342286574e-03f, +8.913906677e-04f, +4.774714309e-05f, -1.021983993e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.059844238e-03f, -6.269315816e-03f, -4.496089758e-03f, +2.241455872e-02f, -1.467166787e-02f, -2.122214155e-02f, +3.617075968e-02f, -5.605004937e-03f, -2.650440991e-02f, +2.012156007e-02f, +3.215416316e-03f, -9.651424826e-03f, +2.919658818e-03f, +5.954066215e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.158020071e-04f, +4.898738829e-04f, -7.983816905e-04f, -1.300029546e-04f, +1.714055781e-03f, -1.599047487e-03f, -6.459088539e-04f, +2.190570068e-03f, -1.139680024e-03f, -7.118862561e-04f, +1.077399460e-03f, -3.138801756e-04f, -1.610611489e-04f, +1.021983993e-04f, +0.000000000e+00f,\n    /* 12, 5 (16) */\n    +0.000000000e+00f, -3.944042231e-03f, +4.519727509e-03f, +2.410781069e-02f, -3.960761876e-02f, -6.887529314e-02f, +2.301845454e-01f, +5.507599780e-01f, +3.619352650e-01f, -1.338527788e-02f, -6.936645555e-02f, +1.598558910e-02f, +1.299414513e-02f, -4.371545338e-03f, -6.976050208e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.267084991e-04f, -7.428908444e-04f, +2.057975852e-04f, +3.192965380e-03f, -3.359318218e-03f, -1.328667344e-02f, -3.352858125e-03f, +1.250433805e-02f, +7.753409447e-03f, -2.471161414e-03f, -1.464267602e-03f, +8.888418324e-04f, +7.301802684e-05f, -1.095425711e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.944042231e-03f, -5.779441933e-03f, -5.294471448e-03f, +2.228455577e-02f, -1.295761209e-02f, -2.282118904e-02f, +3.552485082e-02f, -3.414434869e-03f, -2.764408994e-02f, +1.940967382e-02f, +4.292815776e-03f, -9.965305001e-03f, +2.758597669e-03f, +6.976050208e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.267084991e-04f, +4.956171750e-04f, -7.522889935e-04f, -2.170099927e-04f, +1.741614807e-03f, -1.498456150e-03f, -7.837975882e-04f, +2.215431384e-03f, -1.043232948e-03f, -8.044361941e-04f, +1.089015067e-03f, -2.806147185e-04f, -1.848478580e-04f, +1.095425711e-04f, +0.000000000e+00f,\n    /* 12, 6 (16) */\n    +0.000000000e+00f, -3.817333732e-03f, +3.776836665e-03f, +2.431360828e-02f, -3.641465338e-02f, -7.223461136e-02f, +2.168978720e-01f, +5.474071199e-01f, +3.744396031e-01f, -5.631868430e-03f, -7.183761697e-02f, +1.452132150e-02f, +1.388298697e-02f, -4.298527311e-03f, -8.071475918e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.362104842e-04f, -7.150331173e-04f, +1.080476075e-04f, +3.184397829e-03f, -2.976449226e-03f, -1.320825590e-02f, -3.944893367e-03f, +1.228016450e-02f, +8.143528724e-03f, -2.324040518e-03f, -1.586114692e-03f, +8.823931394e-04f, +9.958431085e-05f, -1.167219582e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.817333732e-03f, -5.283824758e-03f, -6.046760442e-03f, +2.206754578e-02f, -1.121599729e-02f, -2.431964519e-02f, +3.474105324e-02f, -1.199003486e-03f, -2.868732288e-02f, +1.860523762e-02f, +5.381830843e-03f, -1.024591972e-02f, +2.573749811e-03f, +8.071475918e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.362104842e-04f, +4.987347624e-04f, -7.041428442e-04f, -3.013355759e-04f, +1.761573627e-03f, -1.392421801e-03f, -9.183391548e-04f, +2.231299853e-03f, -9.413486665e-04f, -8.952025607e-04f, +1.096040968e-03f, -2.447950865e-04f, -2.087687550e-04f, +1.167219582e-04f, +0.000000000e+00f,\n    /* 12, 7 (16) */\n    +0.000000000e+00f, -3.681123248e-03f, +3.061803548e-03f, +2.442165588e-02f, -3.323025555e-02f, -7.521106058e-02f, +2.036896161e-01f, +5.434622265e-01f, +3.867197676e-01f, +2.511660294e-03f, -7.416165749e-02f, +1.293520680e-02f, +1.476538011e-02f, -4.198943001e-03f, -9.238695501e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.443406978e-04f, -6.856338003e-04f, +1.427019117e-05f, +3.165145520e-03f, -2.600284341e-03f, -1.310647006e-02f, -4.528229520e-03f, +1.203090876e-02f, +8.527506920e-03f, -2.162657576e-03f, -1.707354887e-03f, +8.718855694e-04f, +1.273853588e-04f, -1.236769037e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.681123248e-03f, -4.785089996e-03f, -6.750903286e-03f, +2.176621020e-02f, -9.454423659e-03f, -2.571206699e-02f, +3.382271408e-02f, +1.032296367e-03f, -2.962867155e-02f, +1.771003506e-02f, +6.477871811e-03f, -1.049071481e-02f, +2.364981056e-03f, +9.238695501e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.443406978e-04f, +4.993024377e-04f, -6.542235037e-04f, -3.826536696e-04f, +1.773941977e-03f, -1.281436392e-03f, -1.048961769e-03f, +2.238065516e-03f, -8.344149967e-04f, -9.837471310e-04f, +1.098333359e-03f, -2.065198836e-04f, -2.326918614e-04f, +1.236769037e-04f, +0.000000000e+00f,\n    /* 12, 8 (16) */\n    +0.000000000e+00f, -3.536782550e-03f, +2.376169748e-03f, +2.443592608e-02f, -3.006511003e-02f, -7.781134492e-02f, +1.905831460e-01f, +5.389339970e-01f, +3.987506763e-01f, +1.103916721e-02f, -7.632431506e-02f, +1.122785192e-02f, +1.563726568e-02f, -4.071557642e-03f, -1.047546454e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.511372927e-04f, -6.548963973e-04f, -7.534058889e-05f, +3.135681689e-03f, -2.231618570e-03f, -1.298188307e-02f, -5.101595952e-03f, +1.175690690e-02f, +8.904257323e-03f, -1.986997111e-03f, -1.827499563e-03f, +8.571708297e-04f, +1.563512002e-04f, -1.303456357e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.536782550e-03f, -4.285787558e-03f, -7.405126790e-03f, +2.138355653e-02f, -7.680481682e-03f, -2.699350338e-02f, +3.277375231e-02f, +3.270361883e-03f, -3.046308655e-02f, +1.672628793e-02f, +7.576205170e-03f, -1.069723469e-02f, +2.132289195e-03f, +1.047546454e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.511372927e-04f, +4.974070735e-04f, -6.028130504e-04f, -4.606581604e-04f, +1.778763934e-03f, -1.166010816e-03f, -1.175111724e-03f, +2.235658703e-03f, -7.228465633e-04f, -1.069635157e-03f, +1.095768412e-03f, -1.659035242e-04f, -2.564802355e-04f, +1.303456357e-04f, +0.000000000e+00f,\n    /* 12, 9 (16) */\n    +0.000000000e+00f, -3.385645257e-03f, +1.721273350e-03f, +2.436058549e-02f, -2.692942834e-02f, -8.004296349e-02f, +1.776012630e-01f, +5.338324011e-01f, +4.105075832e-01f, +1.994342454e-02f, -7.831131217e-02f, +9.400352354e-03f, +1.649443651e-02f, -3.915206442e-03f, -1.177892089e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.566433956e-04f, -6.230212655e-04f, -1.606143648e-04f, +3.096497783e-03f, -1.871208295e-03f, -1.283511581e-02f, -5.663750595e-03f, +1.145856232e-02f, +9.272694527e-03f, -1.797087722e-03f, -1.946045754e-03f, +8.381124214e-04f, +1.864024591e-04f, -1.366645282e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.385645257e-03f, -3.788380484e-03f, -8.007939840e-03f, +2.092289837e-02f, -5.901717748e-03f, -2.815951420e-02f, +3.159864059e-02f, +5.506020586e-03f, -3.118593311e-02f, +1.565665278e-02f, +8.671973582e-03f, -1.086313821e-02f, +1.875808959e-03f, +1.177892089e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.566433956e-04f, +4.931458313e-04f, -5.501939069e-04f, -5.350640050e-04f, +1.776117314e-03f, -1.046672423e-03f, -1.296255929e-03f, +2.224050523e-03f, -6.070830886e-04f, -1.152437526e-03f, +1.088243314e-03f, -1.230760375e-04f, -2.799926206e-04f, +1.366645282e-04f, +0.000000000e+00f,\n    /* 12,10 (16) */\n    +0.000000000e+00f, -3.229001861e-03f, +1.098252085e-03f, +2.419997112e-02f, -2.383293056e-02f, -8.191417179e-02f, +1.647661472e-01f, +5.281686505e-01f, +4.219661455e-01f, +2.921611906e-02f, -8.010839990e-02f, +7.454306600e-03f, +1.733254893e-02f, -3.728803982e-03f, -1.314556618e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.609066568e-04f, -5.902048503e-04f, -2.414043130e-04f, +3.048101298e-03f, -1.519769638e-03f, -1.266684045e-02f, -6.213483468e-03f, +1.113634503e-02f, +9.631737766e-03f, -1.593003017e-03f, -2.062477569e-03f, +8.145866919e-04f, +2.174503254e-04f, -1.425683828e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.229001861e-03f, -3.295234653e-03f, -8.558133747e-03f, +2.038783436e-02f, -4.125600433e-03f, -2.920618662e-02f, +3.030238466e-02f, +7.730071109e-03f, -3.179301620e-02f, +1.450421525e-02f, +9.760216896e-03f, -1.098621425e-02f, +1.595816339e-03f, +1.314556618e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.609066568e-04f, +4.866253339e-04f, -4.966473970e-04f, -6.056082532e-04f, +1.766112914e-03f, -9.239624617e-04f, -1.411884346e-03f, +2.203253147e-03f, -4.875875456e-04f, -1.231732925e-03f, +1.075677213e-03f, -7.818278249e-05f, -3.030841367e-04f, +1.425683828e-04f, +0.000000000e+00f,\n    /* 12,11 (16) */\n    +0.000000000e+00f, -3.068095205e-03f, +5.080472344e-04f, +2.395856681e-02f, -2.078482926e-02f, -8.343394143e-02f, +1.520993067e-01f, +5.219551670e-01f, +4.331024906e-01f, +3.884785683e-02f, -8.170140291e-02f, +5.391829031e-03f, +1.814713562e-02f, -3.511353657e-03f, -1.457125001e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.639787953e-04f, -5.566389658e-04f, -3.175869031e-04f, +2.991013617e-03f, -1.177976993e-03f, -1.247777800e-02f, -6.749620078e-03f, +1.079079066e-02f, +9.980314267e-03f, -1.374862402e-03f, -2.176267689e-03f, +7.864838679e-04f, +2.493965726e-04f, -1.479907330e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.068095205e-03f, -2.808609319e-03f, -9.054781144e-03f, +1.978222611e-02f, -2.359487519e-03f, -3.013014908e-02f, +2.889050031e-02f, +9.933324256e-03f, -3.228060375e-02f, +1.327248232e-02f, +1.083589411e-02f, -1.106439703e-02f, +1.292732202e-03f, +1.457125001e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.639787953e-04f, +4.779608069e-04f, -4.424523385e-04f, -6.720509461e-04f, +1.748893602e-03f, -7.984334752e-04f, -1.521512318e-03f, +2.173319910e-03f, -3.648441826e-04f, -1.307109985e-03f, +1.058012069e-03f, -3.138407093e-05f, -3.256070155e-04f, +1.479907330e-04f, +0.000000000e+00f,\n    /* 12,12 (16) */\n    +0.000000000e+00f, -2.904116409e-03f, -4.859173137e-05f, +2.364097991e-02f, -1.779381564e-02f, -8.461191842e-02f, +1.396215287e-01f, +5.152055469e-01f, +4.438932812e-01f, +4.882817110e-02f, -8.307626532e-02f, +3.215561342e-03f, +1.893361949e-02f, -3.261957084e-03f, -1.605115733e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.659151412e-04f, -5.225101230e-04f, -3.890615635e-04f, +2.925767848e-03f, -8.464617203e-04f, -1.226869559e-02f, -7.271024717e-03f, +1.042249929e-02f, +1.031736263e-02f, -1.142831727e-03f, -2.286878964e-03f, +7.537090649e-04f, +2.821336218e-04f, -1.528641683e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.904116409e-03f, -2.330648512e-03f, -9.497233483e-03f, +1.911017517e-02f, -6.105939172e-04f, -3.092858256e-02f, +2.736898799e-02f, +1.210664417e-02f, -3.264544793e-02f, +1.196537234e-02f, +1.189390618e-02f, -1.109578111e-02f, +9.671251867e-04f, +1.605115733e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.659151412e-04f, +4.672751941e-04f, -3.878836788e-04f, -7.341758823e-04f, +1.724633258e-03f, -6.706466594e-04f, -1.624682761e-03f, +2.134345200e-03f, -2.393564281e-04f, -1.378169419e-03f, +1.035213400e-03f, +1.714530120e-05f, -3.474113734e-04f, +1.528641683e-04f, +0.000000000e+00f,\n    /* 12,13 (16) */\n    +0.000000000e+00f, -2.738201268e-03f, -5.711018543e-04f, +2.325191834e-02f, -1.486804779e-02f, -8.545838014e-02f, +1.273528331e-01f, +5.079345222e-01f, +4.543157805e-01f, +5.914553372e-02f, -8.421909704e-02f, +9.286823783e-04f, +1.968732855e-02f, -2.979823463e-03f, -1.757979902e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.667741787e-04f, -4.879989052e-04f, -4.557502649e-04f, +2.852906664e-03f, -5.258110017e-04f, -1.204040375e-02f, -7.776603617e-03f, +1.003213403e-02f, +1.064183619e-02f, -8.971237883e-04f, -2.393766071e-03f, +7.161832671e-04f, +3.155446549e-04f, -1.571206790e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.738201268e-03f, -1.863373318e-03f, -9.885117161e-03f, +1.837599928e-02f, +1.114039340e-03f, -3.159922922e-02f, +2.574430523e-02f, +1.424098937e-02f, -3.288480436e-02f, +1.058720292e-02f, +1.292911958e-02f, -1.107863580e-02f, +6.197138133e-04f, +1.757979902e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.667741787e-04f, +4.546982540e-04f, -3.332111809e-04f, -7.917912538e-04f, +1.693535578e-03f, -5.411691939e-04f, -1.720968237e-03f, +2.086464164e-03f, -1.116446844e-04f, -1.444526114e-03f, +1.007270919e-03f, +6.721661228e-05f, -3.683460194e-04f, +1.571206790e-04f, +0.000000000e+00f,\n    /* 12,14 (16) */\n    +0.000000000e+00f, -2.571427089e-03f, -1.059100760e-03f, +2.279616808e-02f, -1.201514113e-02f, -8.598419114e-02f, +1.153124294e-01f, +5.001579186e-01f, +4.643479146e-01f, +6.978736991e-02f, -8.511622083e-02f, -1.465083693e-03f, +2.040351182e-02f, -2.664278808e-03f, -1.915100581e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.666170916e-04f, -4.532793947e-04f, -5.175970275e-04f, +2.772980170e-03f, -2.165668702e-04f, -1.179375349e-02f, -8.265307979e-03f, +9.620419455e-03f, +1.095270642e-02f, -6.379986660e-04f, -2.496377269e-03f, +6.738442733e-04f, +3.495037769e-04f, -1.606920188e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.571427089e-03f, -1.408675064e-03f, -1.021832834e-02f, +1.758420803e-02f, +2.807574919e-03f, -3.214039841e-02f, +2.402333700e-02f, +1.632745353e-02f, -3.299644904e-02f, +9.142676806e-03f, +1.393639050e-02f, -1.101141919e-02f, +2.513677939e-04f, +1.915100581e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.666170916e-04f, +4.403656415e-04f, -2.786981641e-04f, -8.447301477e-04f, +1.655832748e-03f, -4.105715627e-04f, -1.809972867e-03f, +2.029852206e-03f, +1.775597749e-05f, -1.505811183e-03f, +9.741990656e-04f, +1.186278635e-04f, -3.882592950e-04f, +1.606920188e-04f, +0.000000000e+00f,\n    /* 12,15 (16) */\n    +0.000000000e+00f, -2.404809998e-03f, -1.512380154e-03f, +2.227857105e-02f, -9.242160959e-03f, -8.620075801e-02f, +1.035186759e-01f, +4.918926106e-01f, +4.739683340e-01f, +8.074007633e-02f, -8.575421950e-02f, -3.961460961e-03f, +2.107735609e-02f, -2.314775031e-03f, -2.075792600e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.655073135e-04f, -4.185186487e-04f, -5.745673555e-04f, +2.686543794e-03f, +8.077459724e-05f, -1.152963333e-02f, -8.736136835e-03f, +9.188139768e-03f, +1.124896622e-02f, -3.657639165e-04f, -2.594156203e-03f, +6.266476024e-04f, +3.838762280e-04f, -1.635100847e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.404809998e-03f, -9.683094227e-04f, -1.049702651e-02f, +1.673947788e-02f, +4.463407667e-03f, -3.255096997e-02f, +2.221336413e-02f, +1.835730573e-02f, -3.297869306e-02f, +7.636865623e-03f, +1.491058956e-02f, -1.089279133e-02f, -1.368915011e-04f, +2.075792600e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.655073135e-04f, +4.244179817e-04f, -2.246003067e-04f, -8.928509148e-04f, +1.611783985e-03f, -2.794248771e-04f, -1.891334096e-03f, +1.964724298e-03f, +1.482982130e-04f, -1.561673971e-03f, +9.360374043e-04f, +1.711645148e-04f, -4.069999399e-04f, +1.635100847e-04f, +0.000000000e+00f,\n    /* 12,16 (16) */\n    +0.000000000e+00f, -2.239302684e-03f, -1.930898803e-03f, +2.170400369e-02f, -6.555617165e-03f, -8.611998341e-02f, +9.198904255e-02f, +4.831564738e-01f, +4.831564738e-01f, +9.198904255e-02f, -8.611998341e-02f, -6.555617165e-03f, +2.170400369e-02f, -1.930898803e-03f, -2.239302684e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.635100847e-04f, -3.838762280e-04f, -6.266476024e-04f, +2.594156203e-03f, +3.657639165e-04f, -1.124896622e-02f, -9.188139768e-03f, +8.736136835e-03f, +1.152963333e-02f, -8.077459724e-05f, -2.686543794e-03f, +5.745673555e-04f, +4.185186487e-04f, -1.655073135e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.239302684e-03f, -5.438914410e-04f, -1.072162681e-02f, +1.584662697e-02f, +6.075191651e-03f, -3.283039485e-02f, +2.032203003e-02f, +2.032203003e-02f, -3.283039485e-02f, +6.075191651e-03f, +1.584662697e-02f, -1.072162681e-02f, -5.438914410e-04f, +2.239302684e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.635100847e-04f, +4.069999399e-04f, -1.711645148e-04f, -9.360374043e-04f, +1.561673971e-03f, -1.482982130e-04f, -1.964724298e-03f, +1.891334096e-03f, +2.794248771e-04f, -1.611783985e-03f, +8.928509148e-04f, +2.246003067e-04f, -4.244179817e-04f, +1.655073135e-04f, +0.000000000e+00f,\n    /* 12,17 (16) */\n    +0.000000000e+00f, -2.075792600e-03f, -2.314775031e-03f, +2.107735609e-02f, -3.961460961e-03f, -8.575421950e-02f, +8.074007633e-02f, +4.739683340e-01f, +4.918926106e-01f, +1.035186759e-01f, -8.620075801e-02f, -9.242160959e-03f, +2.227857105e-02f, -1.512380154e-03f, -2.404809998e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.606920188e-04f, -3.495037769e-04f, -6.738442733e-04f, +2.496377269e-03f, +6.379986660e-04f, -1.095270642e-02f, -9.620419455e-03f, +8.265307979e-03f, +1.179375349e-02f, +2.165668702e-04f, -2.772980170e-03f, +5.175970275e-04f, +4.532793947e-04f, -1.666170916e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +2.075792600e-03f, -1.368915011e-04f, -1.089279133e-02f, +1.491058956e-02f, +7.636865623e-03f, -3.297869306e-02f, +1.835730573e-02f, +2.221336413e-02f, -3.255096997e-02f, +4.463407667e-03f, +1.673947788e-02f, -1.049702651e-02f, -9.683094227e-04f, +2.404809998e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.606920188e-04f, +3.882592950e-04f, -1.186278635e-04f, -9.741990656e-04f, +1.505811183e-03f, -1.775597749e-05f, -2.029852206e-03f, +1.809972867e-03f, +4.105715627e-04f, -1.655832748e-03f, +8.447301477e-04f, +2.786981641e-04f, -4.403656415e-04f, +1.666170916e-04f, +0.000000000e+00f,\n    /* 12,18 (16) */\n    +0.000000000e+00f, -1.915100581e-03f, -2.664278808e-03f, +2.040351182e-02f, -1.465083693e-03f, -8.511622083e-02f, +6.978736991e-02f, +4.643479146e-01f, +5.001579186e-01f, +1.153124294e-01f, -8.598419114e-02f, -1.201514113e-02f, +2.279616808e-02f, -1.059100760e-03f, -2.571427089e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.571206790e-04f, -3.155446549e-04f, -7.161832671e-04f, +2.393766071e-03f, +8.971237883e-04f, -1.064183619e-02f, -1.003213403e-02f, +7.776603617e-03f, +1.204040375e-02f, +5.258110017e-04f, -2.852906664e-03f, +4.557502649e-04f, +4.879989052e-04f, -1.667741787e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.915100581e-03f, +2.513677939e-04f, -1.101141919e-02f, +1.393639050e-02f, +9.142676806e-03f, -3.299644904e-02f, +1.632745353e-02f, +2.402333700e-02f, -3.214039841e-02f, +2.807574919e-03f, +1.758420803e-02f, -1.021832834e-02f, -1.408675064e-03f, +2.571427089e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.571206790e-04f, +3.683460194e-04f, -6.721661228e-05f, -1.007270919e-03f, +1.444526114e-03f, +1.116446844e-04f, -2.086464164e-03f, +1.720968237e-03f, +5.411691939e-04f, -1.693535578e-03f, +7.917912538e-04f, +3.332111809e-04f, -4.546982540e-04f, +1.667741787e-04f, +0.000000000e+00f,\n    /* 12,19 (16) */\n    +0.000000000e+00f, -1.757979902e-03f, -2.979823463e-03f, +1.968732855e-02f, +9.286823783e-04f, -8.421909704e-02f, +5.914553372e-02f, +4.543157805e-01f, +5.079345222e-01f, +1.273528331e-01f, -8.545838014e-02f, -1.486804779e-02f, +2.325191834e-02f, -5.711018543e-04f, -2.738201268e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.528641683e-04f, -2.821336218e-04f, -7.537090649e-04f, +2.286878964e-03f, +1.142831727e-03f, -1.031736263e-02f, -1.042249929e-02f, +7.271024717e-03f, +1.226869559e-02f, +8.464617203e-04f, -2.925767848e-03f, +3.890615635e-04f, +5.225101230e-04f, -1.659151412e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.757979902e-03f, +6.197138133e-04f, -1.107863580e-02f, +1.292911958e-02f, +1.058720292e-02f, -3.288480436e-02f, +1.424098937e-02f, +2.574430523e-02f, -3.159922922e-02f, +1.114039340e-03f, +1.837599928e-02f, -9.885117161e-03f, -1.863373318e-03f, +2.738201268e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.528641683e-04f, +3.474113734e-04f, -1.714530120e-05f, -1.035213400e-03f, +1.378169419e-03f, +2.393564281e-04f, -2.134345200e-03f, +1.624682761e-03f, +6.706466594e-04f, -1.724633258e-03f, +7.341758823e-04f, +3.878836788e-04f, -4.672751941e-04f, +1.659151412e-04f, +0.000000000e+00f,\n    /* 12,20 (16) */\n    +0.000000000e+00f, -1.605115733e-03f, -3.261957084e-03f, +1.893361949e-02f, +3.215561342e-03f, -8.307626532e-02f, +4.882817110e-02f, +4.438932812e-01f, +5.152055469e-01f, +1.396215287e-01f, -8.461191842e-02f, -1.779381564e-02f, +2.364097991e-02f, -4.859173137e-05f, -2.904116409e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.479907330e-04f, -2.493965726e-04f, -7.864838679e-04f, +2.176267689e-03f, +1.374862402e-03f, -9.980314267e-03f, -1.079079066e-02f, +6.749620078e-03f, +1.247777800e-02f, +1.177976993e-03f, -2.991013617e-03f, +3.175869031e-04f, +5.566389658e-04f, -1.639787953e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.605115733e-03f, +9.671251867e-04f, -1.109578111e-02f, +1.189390618e-02f, +1.196537234e-02f, -3.264544793e-02f, +1.210664417e-02f, +2.736898799e-02f, -3.092858256e-02f, -6.105939172e-04f, +1.911017517e-02f, -9.497233483e-03f, -2.330648512e-03f, +2.904116409e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.479907330e-04f, +3.256070155e-04f, +3.138407093e-05f, -1.058012069e-03f, +1.307109985e-03f, +3.648441826e-04f, -2.173319910e-03f, +1.521512318e-03f, +7.984334752e-04f, -1.748893602e-03f, +6.720509461e-04f, +4.424523385e-04f, -4.779608069e-04f, +1.639787953e-04f, +0.000000000e+00f,\n    /* 12,21 (16) */\n    +0.000000000e+00f, -1.457125001e-03f, -3.511353657e-03f, +1.814713562e-02f, +5.391829031e-03f, -8.170140291e-02f, +3.884785683e-02f, +4.331024906e-01f, +5.219551670e-01f, +1.520993067e-01f, -8.343394143e-02f, -2.078482926e-02f, +2.395856681e-02f, +5.080472344e-04f, -3.068095205e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.425683828e-04f, -2.174503254e-04f, -8.145866919e-04f, +2.062477569e-03f, +1.593003017e-03f, -9.631737766e-03f, -1.113634503e-02f, +6.213483468e-03f, +1.266684045e-02f, +1.519769638e-03f, -3.048101298e-03f, +2.414043130e-04f, +5.902048503e-04f, -1.609066568e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.457125001e-03f, +1.292732202e-03f, -1.106439703e-02f, +1.083589411e-02f, +1.327248232e-02f, -3.228060375e-02f, +9.933324256e-03f, +2.889050031e-02f, -3.013014908e-02f, -2.359487519e-03f, +1.978222611e-02f, -9.054781144e-03f, -2.808609319e-03f, +3.068095205e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.425683828e-04f, +3.030841367e-04f, +7.818278249e-05f, -1.075677213e-03f, +1.231732925e-03f, +4.875875456e-04f, -2.203253147e-03f, +1.411884346e-03f, +9.239624617e-04f, -1.766112914e-03f, +6.056082532e-04f, +4.966473970e-04f, -4.866253339e-04f, +1.609066568e-04f, +0.000000000e+00f,\n    /* 12,22 (16) */\n    +0.000000000e+00f, -1.314556618e-03f, -3.728803982e-03f, +1.733254893e-02f, +7.454306600e-03f, -8.010839990e-02f, +2.921611906e-02f, +4.219661455e-01f, +5.281686505e-01f, +1.647661472e-01f, -8.191417179e-02f, -2.383293056e-02f, +2.419997112e-02f, +1.098252085e-03f, -3.229001861e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.366645282e-04f, -1.864024591e-04f, -8.381124214e-04f, +1.946045754e-03f, +1.797087722e-03f, -9.272694527e-03f, -1.145856232e-02f, +5.663750595e-03f, +1.283511581e-02f, +1.871208295e-03f, -3.096497783e-03f, +1.606143648e-04f, +6.230212655e-04f, -1.566433956e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.314556618e-03f, +1.595816339e-03f, -1.098621425e-02f, +9.760216896e-03f, +1.450421525e-02f, -3.179301620e-02f, +7.730071109e-03f, +3.030238466e-02f, -2.920618662e-02f, -4.125600433e-03f, +2.038783436e-02f, -8.558133747e-03f, -3.295234653e-03f, +3.229001861e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.366645282e-04f, +2.799926206e-04f, +1.230760375e-04f, -1.088243314e-03f, +1.152437526e-03f, +6.070830886e-04f, -2.224050523e-03f, +1.296255929e-03f, +1.046672423e-03f, -1.776117314e-03f, +5.350640050e-04f, +5.501939069e-04f, -4.931458313e-04f, +1.566433956e-04f, +0.000000000e+00f,\n    /* 12,23 (16) */\n    +0.000000000e+00f, -1.177892089e-03f, -3.915206442e-03f, +1.649443651e-02f, +9.400352354e-03f, -7.831131217e-02f, +1.994342454e-02f, +4.105075832e-01f, +5.338324011e-01f, +1.776012630e-01f, -8.004296349e-02f, -2.692942834e-02f, +2.436058549e-02f, +1.721273350e-03f, -3.385645257e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.303456357e-04f, -1.563512002e-04f, -8.571708297e-04f, +1.827499563e-03f, +1.986997111e-03f, -8.904257323e-03f, -1.175690690e-02f, +5.101595952e-03f, +1.298188307e-02f, +2.231618570e-03f, -3.135681689e-03f, +7.534058889e-05f, +6.548963973e-04f, -1.511372927e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.177892089e-03f, +1.875808959e-03f, -1.086313821e-02f, +8.671973582e-03f, +1.565665278e-02f, -3.118593311e-02f, +5.506020586e-03f, +3.159864059e-02f, -2.815951420e-02f, -5.901717748e-03f, +2.092289837e-02f, -8.007939840e-03f, -3.788380484e-03f, +3.385645257e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.303456357e-04f, +2.564802355e-04f, +1.659035242e-04f, -1.095768412e-03f, +1.069635157e-03f, +7.228465633e-04f, -2.235658703e-03f, +1.175111724e-03f, +1.166010816e-03f, -1.778763934e-03f, +4.606581604e-04f, +6.028130504e-04f, -4.974070735e-04f, +1.511372927e-04f, +0.000000000e+00f,\n    /* 12,24 (16) */\n    +0.000000000e+00f, -1.047546454e-03f, -4.071557642e-03f, +1.563726568e-02f, +1.122785192e-02f, -7.632431506e-02f, +1.103916721e-02f, +3.987506763e-01f, +5.389339970e-01f, +1.905831460e-01f, -7.781134492e-02f, -3.006511003e-02f, +2.443592608e-02f, +2.376169748e-03f, -3.536782550e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.236769037e-04f, -1.273853588e-04f, -8.718855694e-04f, +1.707354887e-03f, +2.162657576e-03f, -8.527506920e-03f, -1.203090876e-02f, +4.528229520e-03f, +1.310647006e-02f, +2.600284341e-03f, -3.165145520e-03f, -1.427019117e-05f, +6.856338003e-04f, -1.443406978e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.047546454e-03f, +2.132289195e-03f, -1.069723469e-02f, +7.576205170e-03f, +1.672628793e-02f, -3.046308655e-02f, +3.270361883e-03f, +3.277375231e-02f, -2.699350338e-02f, -7.680481682e-03f, +2.138355653e-02f, -7.405126790e-03f, -4.285787558e-03f, +3.536782550e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.236769037e-04f, +2.326918614e-04f, +2.065198836e-04f, -1.098333359e-03f, +9.837471310e-04f, +8.344149967e-04f, -2.238065516e-03f, +1.048961769e-03f, +1.281436392e-03f, -1.773941977e-03f, +3.826536696e-04f, +6.542235037e-04f, -4.993024377e-04f, +1.443406978e-04f, +0.000000000e+00f,\n    /* 12,25 (16) */\n    +0.000000000e+00f, -9.238695501e-04f, -4.198943001e-03f, +1.476538011e-02f, +1.293520680e-02f, -7.416165749e-02f, +2.511660294e-03f, +3.867197676e-01f, +5.434622265e-01f, +2.036896161e-01f, -7.521106058e-02f, -3.323025555e-02f, +2.442165588e-02f, +3.061803548e-03f, -3.681123248e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.167219582e-04f, -9.958431085e-05f, -8.823931394e-04f, +1.586114692e-03f, +2.324040518e-03f, -8.143528724e-03f, -1.228016450e-02f, +3.944893367e-03f, +1.320825590e-02f, +2.976449226e-03f, -3.184397829e-03f, -1.080476075e-04f, +7.150331173e-04f, -1.362104842e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.238695501e-04f, +2.364981056e-03f, -1.049071481e-02f, +6.477871811e-03f, +1.771003506e-02f, -2.962867155e-02f, +1.032296367e-03f, +3.382271408e-02f, -2.571206699e-02f, -9.454423659e-03f, +2.176621020e-02f, -6.750903286e-03f, -4.785089996e-03f, +3.681123248e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.167219582e-04f, +2.087687550e-04f, +2.447950865e-04f, -1.096040968e-03f, +8.952025607e-04f, +9.413486665e-04f, -2.231299853e-03f, +9.183391548e-04f, +1.392421801e-03f, -1.761573627e-03f, +3.013355759e-04f, +7.041428442e-04f, -4.987347624e-04f, +1.362104842e-04f, +0.000000000e+00f,\n    /* 12,26 (16) */\n    +0.000000000e+00f, -8.071475918e-04f, -4.298527311e-03f, +1.388298697e-02f, +1.452132150e-02f, -7.183761697e-02f, -5.631868430e-03f, +3.744396031e-01f, +5.474071199e-01f, +2.168978720e-01f, -7.223461136e-02f, -3.641465338e-02f, +2.431360828e-02f, +3.776836665e-03f, -3.817333732e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.095425711e-04f, -7.301802684e-05f, -8.888418324e-04f, +1.464267602e-03f, +2.471161414e-03f, -7.753409447e-03f, -1.250433805e-02f, +3.352858125e-03f, +1.328667344e-02f, +3.359318218e-03f, -3.192965380e-03f, -2.057975852e-04f, +7.428908444e-04f, -1.267084991e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.071475918e-04f, +2.573749811e-03f, -1.024591972e-02f, +5.381830843e-03f, +1.860523762e-02f, -2.868732288e-02f, -1.199003486e-03f, +3.474105324e-02f, -2.431964519e-02f, -1.121599729e-02f, +2.206754578e-02f, -6.046760442e-03f, -5.283824758e-03f, +3.817333732e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.095425711e-04f, +1.848478580e-04f, +2.806147185e-04f, -1.089015067e-03f, +8.044361941e-04f, +1.043232948e-03f, -2.215431384e-03f, +7.837975882e-04f, +1.498456150e-03f, -1.741614807e-03f, +2.170099927e-04f, +7.522889935e-04f, -4.956171750e-04f, +1.267084991e-04f, +0.000000000e+00f,\n    /* 12,27 (16) */\n    +0.000000000e+00f, -6.976050208e-04f, -4.371545338e-03f, +1.299414513e-02f, +1.598558910e-02f, -6.936645555e-02f, -1.338527788e-02f, +3.619352650e-01f, +5.507599780e-01f, +2.301845454e-01f, -6.887529314e-02f, -3.960761876e-02f, +2.410781069e-02f, +4.519727509e-03f, -3.944042231e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +1.021983993e-04f, -4.774714309e-05f, -8.913906677e-04f, +1.342286574e-03f, +2.604078761e-03f, -7.358233815e-03f, -1.270316126e-02f, +2.753419381e-03f, +1.334121144e-02f, +3.748059468e-03f, -3.190395290e-03f, -3.073022708e-04f, +7.690011385e-04f, -1.158020071e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +6.976050208e-04f, +2.758597669e-03f, -9.965305001e-03f, +4.292815776e-03f, +1.940967382e-02f, -2.764408994e-02f, -3.414434869e-03f, +3.552485082e-02f, -2.282118904e-02f, -1.295761209e-02f, +2.228455577e-02f, -5.294471448e-03f, -5.779441933e-03f, +3.944042231e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -1.021983993e-04f, +1.610611489e-04f, +3.138801756e-04f, -1.077399460e-03f, +7.118862561e-04f, +1.139680024e-03f, -2.190570068e-03f, +6.459088539e-04f, +1.599047487e-03f, -1.714055781e-03f, +1.300029546e-04f, +7.983816905e-04f, -4.898738829e-04f, +1.158020071e-04f, +0.000000000e+00f,\n    /* 12,28 (16) */\n    +0.000000000e+00f, -5.954066215e-04f, -4.419292481e-03f, +1.210275447e-02f, +1.732787567e-02f, -6.676237679e-02f, -2.074351169e-02f, +3.492321037e-01f, +5.535133974e-01f, +2.435257569e-01f, -6.512723367e-02f, -4.279801405e-02f, +2.380050842e-02f, +5.288728648e-03f, -4.059844238e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +9.474674824e-05f, -2.382307579e-05f, -8.902083165e-04f, +1.220627670e-03f, +2.722892879e-03f, -6.959081326e-03f, -1.287643418e-02f, +2.147893981e-03f, +1.337141665e-02f, +4.141806227e-03f, -3.176257150e-03f, -4.123200544e-04f, +7.931566664e-04f, -1.034641234e-04f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.954066215e-04f, +2.919658818e-03f, -9.651424826e-03f, +3.215416316e-03f, +2.012156007e-02f, -2.650440991e-02f, -5.605004937e-03f, +3.617075968e-02f, -2.122214155e-02f, -1.467166787e-02f, +2.241455872e-02f, -4.496089758e-03f, -6.269315816e-03f, +4.059844238e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -9.474674824e-05f, +1.375350439e-04f, +3.445087681e-04f, -1.061356810e-03f, +6.179923005e-04f, +1.230330450e-03f, -2.156865482e-03f, +5.052601862e-04f, +1.693725217e-03f, -1.678921589e-03f, +4.065915088e-05f, +8.421439845e-04f, -4.814409226e-04f, +1.034641234e-04f, +0.000000000e+00f,\n    /* 12,29 (16) */\n    +0.000000000e+00f, -5.006598732e-04f, -4.443115557e-03f, +1.121254615e-02f, +1.854850334e-02f, -6.403948391e-02f, -2.770259302e-02f, +3.363556696e-01f, +5.556612914e-01f, +2.568971735e-01f, -6.098542744e-02f, -4.597427120e-02f, +2.338818837e-02f, +6.081885314e-03f, -4.163308361e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +8.724235721e-05f, -1.288174649e-06f, -8.854720214e-04f, +1.099728929e-03f, +2.827744606e-03f, -6.557023064e-03f, -1.302402520e-02f, +1.537616264e-03f, +1.337689571e-02f, +4.539658940e-03f, -3.150145112e-03f, -5.205856872e-04f, +8.151494921e-04f, -8.967423475e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +5.006598732e-04f, +3.057193862e-03f, -9.306916058e-03f, +2.154059507e-03f, +2.073955237e-02f, -2.527407946e-02f, -7.761870419e-03f, +3.667601986e-02f, -1.952841633e-02f, -1.635058946e-02f, +2.245521787e-02f, -3.653945773e-03f, -6.750756739e-03f, +4.163308361e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -8.724235721e-05f, +1.143898470e-04f, +3.724337367e-04f, -1.041067443e-03f, +5.231930854e-04f, +1.314854568e-03f, -2.114505956e-03f, +3.624515650e-04f, +1.782042421e-03f, -1.636272318e-03f, -5.065945679e-05f, +8.833037439e-04f, -4.702668609e-04f, +8.967423475e-05f, +0.000000000e+00f,\n    /* 12,30 (16) */\n    +0.000000000e+00f, -4.134175160e-04f, -4.444403732e-03f, +1.032707413e-02f, +1.964823227e-02f, -6.121173931e-02f, -3.425961608e-02f, +3.233316444e-01f, +5.571989077e-01f, +2.702740692e-01f, -5.644576850e-02f, -4.912441631e-02f, +2.286760268e-02f, +6.897034807e-03f, -4.252982596e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.973720911e-05f, +1.982408569e-05f, -8.773665173e-04f, +9.800093305e-04f, +2.918813877e-03f, -6.153118587e-03f, -1.314587089e-02f, +9.239342327e-04f, +1.335731689e-02f, +4.940687470e-03f, -3.111679936e-03f, -6.318104988e-04f, +8.347719996e-04f, -7.441840558e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +4.134175160e-04f, +3.171583709e-03f, -8.934482321e-03f, +1.112992064e-03f, +2.126274546e-02f, -2.395922489e-02f, -9.876376375e-03f, +3.703847143e-02f, -1.774637391e-02f, -1.798686178e-02f, +2.240455842e-02f, -2.770642030e-03f, -7.221023599e-03f, +4.252982596e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.973720911e-05f, +9.173925168e-05f, +3.976041819e-04f, -1.016728084e-03f, +4.279244817e-04f, +1.392953765e-03f, -2.063717530e-03f, +2.180929495e-04f, +1.863578082e-03f, -1.586203207e-03f, -1.435751254e-04f, +9.215951689e-04f, -4.563134437e-04f, +7.441840558e-05f, +0.000000000e+00f,\n    /* 12,31 (16) */\n    +0.000000000e+00f, -3.336803069e-04f, -4.424579646e-03f, +9.449707611e-03f, +2.062824160e-02f, -5.829292543e-02f, -4.041273467e-02f, +3.101857735e-01f, +5.581228419e-01f, +2.836313861e-01f, -5.150508103e-02f, -5.223609625e-02f, +2.223579218e-02f, +7.731806806e-03f, -4.327401002e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, +7.228036347e-05f, +3.948887869e-05f, -8.660829573e-04f, +8.618678673e-04f, +2.996318192e-03f, -5.748412892e-03f, -1.324197575e-02f, +3.082056865e-04f, +1.331241160e-02f, +5.343933472e-03f, -3.060510991e-03f, -7.456827132e-04f, +8.518178481e-04f, -5.768976579e-05f, +0.000000000e+00f,\n    +0.000000000e+00f, +3.336803069e-04f, +3.263322961e-03f, -8.536878139e-03f, +9.626398011e-05f, +2.169066994e-02f, -2.256627113e-02f, -1.194009391e-02f, +3.725656438e-02f, -1.588279583e-02f, -1.957306499e-02f, +2.226098329e-02f, -1.849046861e-03f, -7.677337043e-03f, +4.327401002e-03f, +0.000000000e+00f,\n    +0.000000000e+00f, -7.228036347e-05f, +6.968989714e-05f, +4.199849082e-04f, -9.885505371e-04f, +3.326174256e-04f, +1.464361568e-03f, -2.004762733e-03f, +7.280146223e-05f, +1.937939192e-03f, -1.528844573e-03f, -2.376959244e-04f, +9.567603037e-04f, -4.395561877e-04f, +5.768976579e-05f, +0.000000000e+00f,\n    /* 13, 0 (12) */\n    +4.667314234e-04f, +2.059782291e-02f, -3.327331987e-02f, -6.726305712e-02f, +2.829989411e-01f, +5.957604134e-01f, +2.829989411e-01f, -6.726305712e-02f, -3.327331987e-02f, +2.059782291e-02f, +4.667314234e-04f, -1.052077910e-03f,\n    -4.122616604e-04f, -2.110775905e-04f, +3.298206916e-03f, -3.815088899e-03f, -1.525035079e-02f, -3.810071488e-04f, +1.524673848e-02f, +4.284051325e-03f, -3.328935618e-03f, +1.266826698e-04f, +4.460980491e-04f, -1.091787758e-04f,\n    -3.950298292e-03f, +1.359255440e-03f, +1.656242101e-02f, -2.092552594e-02f, -1.221715500e-02f, +3.732936584e-02f, -1.221715500e-02f, -2.092552594e-02f, +1.656242101e-02f, +1.359255440e-03f, -3.950298292e-03f, +4.123088596e-04f,\n    +2.027049756e-04f, -6.325482595e-04f, +2.453987339e-04f, +1.329735890e-03f, -1.872425123e-03f, -7.050431205e-05f, +1.936185460e-03f, -1.272919965e-03f, -3.215169699e-04f, +6.562259075e-04f, -1.951957310e-04f, -6.396508586e-06f,\n    /* 13, 1 (12) */\n    +5.446976298e-05f, +2.038674532e-02f, -2.997511296e-02f, -7.107814602e-02f, +2.677485903e-01f, +5.953794063e-01f, +2.982456796e-01f, -6.297900580e-02f, -3.660225549e-02f, +2.072450558e-02f, +9.128294725e-04f, -1.161256685e-03f,\n    -3.784585558e-04f, -2.897846701e-04f, +3.255255062e-03f, -3.354484262e-03f, -1.522089498e-02f, -1.142027182e-03f, +1.520958842e-02f, +4.760164822e-03f, -3.346738359e-03f, +3.671875380e-05f, +4.797623354e-04f, -1.115633374e-04f,\n    -3.747593316e-03f, +7.267071801e-04f, +1.680781975e-02f, -1.959579005e-02f, -1.408958012e-02f, +3.725886153e-02f, -1.028096954e-02f, -2.219844591e-02f, +1.624090404e-02f, +2.015481347e-03f, -4.145494023e-03f, +4.059123510e-04f,\n    +2.085845515e-04f, -6.068231235e-04f, +1.703636618e-04f, +1.380000724e-03f, -1.801595605e-03f, -2.112080461e-04f, +1.992539666e-03f, -1.209699291e-03f, -3.983827397e-04f, +6.776518272e-04f, -1.860167439e-04f, -1.343995169e-05f,\n    /* 13, 2 (12) */\n    -3.239887928e-04f, +2.009696065e-02f, -2.671985789e-02f, -7.443263029e-02f, +2.525276953e-01f, +5.942373791e-01f, +3.134552680e-01f, -5.821884098e-02f, -3.994899385e-02f, +2.076122433e-02f, +1.392591808e-03f, -1.272820023e-03f,\n    -3.448826313e-04f, -3.627180567e-04f, +3.200804569e-03f, -2.903386621e-03f, -1.515893813e-02f, -1.900067829e-03f, +1.513853115e-02f, +5.242168496e-03f, -3.350937692e-03f, -5.866148612e-05f, +5.130382847e-04f, -1.131016723e-04f,\n    -3.539008765e-03f, +1.198840566e-04f, +1.697818341e-02f, -1.821578933e-02f, -1.589117572e-02f, +3.704765348e-02f, -8.288429870e-03f, -2.340814520e-02f, +1.584252131e-02f, +2.693133174e-03f, -4.331510767e-03f, +3.924723993e-04f,\n    +2.128828168e-04f, -5.792588735e-04f, +9.673397891e-05f, +1.423601243e-03f, -1.724063779e-03f, -3.509985769e-04f, +2.041182561e-03f, -1.140253075e-03f, -4.756484828e-04f, +6.966272125e-04f, -1.751368193e-04f, -2.101743717e-05f,\n    /* 13, 3 (12) */\n    -6.688714241e-04f, +1.973424259e-02f, -2.351905333e-02f, -7.733601691e-02f, +2.373687572e-01f, +5.923373113e-01f, +3.285937991e-01f, -5.297667248e-02f, -4.329993154e-02f, +2.070256285e-02f, +1.905630093e-03f, -1.385921695e-03f,\n    -3.117157438e-04f, -4.298239302e-04f, +3.135597999e-03f, -2.462884638e-03f, -1.506514186e-02f, -2.653154167e-03f, +1.503329967e-02f, +5.728750876e-03f, -3.340885179e-03f, -1.592708602e-04f, +5.456995484e-04f, -1.137119681e-04f,\n    -3.326125948e-03f, -4.593748169e-04f, +1.707491739e-02f, -1.679218809e-02f, -1.761523950e-02f, +3.669665491e-02f, -6.247247309e-03f, -2.454839827e-02f, +1.536687282e-02f, +3.389760387e-03f, -4.506647586e-03f, +3.714549621e-04f,\n    +2.156557882e-04f, -5.500667276e-04f, +2.481713253e-05f, +1.460457427e-03f, -1.640224450e-03f, -4.892719846e-04f, +2.081842445e-03f, -1.064792956e-03f, -5.529562791e-04f, +7.129599965e-04f, -1.625341969e-04f, -2.910137426e-05f,\n    /* 13, 4 (12) */\n    -9.805871679e-04f, +1.930441866e-02f, -2.038345533e-02f, -7.979890154e-02f, +2.223036153e-01f, +5.896841571e-01f, +3.436270988e-01f, -4.724792160e-02f, -4.664081672e-02f, +2.054329199e-02f, +2.451329641e-03f, -1.499633663e-03f,\n    -2.791272556e-04f, -4.910794196e-04f, +3.060392336e-03f, -2.034003686e-03f, -1.494025893e-02f, -3.399328234e-03f, +1.489373133e-02f, +6.218553791e-03f, -3.315965017e-03f, -2.648871138e-04f, +5.775104921e-04f, -1.133140058e-04f,\n    -3.110470160e-03f, -1.009441545e-03f, +1.709973452e-02f, -1.533173066e-02f, -1.925546395e-02f, +3.620738292e-02f, -4.165404864e-03f, -2.561319123e-02f, +1.481391654e-02f, +4.102720383e-03f, -4.669181783e-03f, +3.423535879e-04f,\n    +2.169664862e-04f, -5.194594773e-04f, -4.509547366e-05f, +1.490522365e-03f, -1.550498232e-03f, -6.254316455e-04f, +2.114282635e-03f, -9.835624004e-04f, -6.299395067e-04f, +7.264661526e-04f, -1.481970653e-04f, -3.765856183e-05f,\n    /* 13, 5 (12) */\n    -1.259714424e-03f, +1.881333924e-02f, -1.732306299e-02f, -8.183290523e-02f, +2.073633564e-01f, +5.862848289e-01f, +3.585208301e-01f, -4.102936781e-02f, -4.995678174e-02f, +2.027840487e-02f, +3.028840133e-03f, -1.612947669e-03f,\n    -2.472736694e-04f, -5.464914084e-04f, +2.975955388e-03f, -1.617703411e-03f, -1.478512959e-02f, -4.136655713e-03f, +1.471976944e-02f, +6.710176499e-03f, -3.275597609e-03f, -3.752525352e-04f, +6.082271138e-04f, -1.118298311e-04f,\n    -2.893503673e-03f, -1.528901022e-03f, +1.705463905e-02f, -1.384120829e-02f, -2.080596219e-02f, +3.558195128e-02f, -2.051122229e-03f, -2.659675363e-02f, +1.418397704e-02f, +4.829186536e-03f, -4.817378848e-03f, +3.046950260e-04f,\n    +2.168842588e-04f, -4.876502430e-04f, -1.127296324e-04f, +1.513781996e-03f, -1.455329316e-03f, -7.588910977e-04f, +2.138302843e-03f, -8.968359192e-04f, -7.062245809e-04f, +7.369709832e-04f, -1.321240280e-04f, -4.665017954e-05f,\n    /* 13, 6 (12) */\n    -1.506988093e-03f, +1.826684783e-02f, -1.434710760e-02f, -8.345060864e-02f, +1.925782268e-01f, +5.821481731e-01f, +3.732405996e-01f, -3.431919132e-02f, -5.323237935e-02f, +1.990315234e-02f, +3.637067247e-03f, -1.724777500e-03f,\n    -2.162983549e-04f, -5.960952367e-04f, +2.883062253e-03f, -1.214875599e-03f, -1.460067770e-02f, -4.863232522e-03f, +1.451146435e-02f, +7.202180058e-03f, -3.219243078e-03f, -4.900737240e-04f, +6.375980530e-04f, -1.091844442e-04f,\n    -2.676619415e-03f, -2.016551265e-03f, +1.694190942e-02f, -1.232742630e-02f, -2.226129150e-02f, +3.482306018e-02f, +8.718061384e-05f, -2.749358955e-02f, +1.347775246e-02f, +5.566157519e-03f, -4.949502876e-03f, +2.580448465e-04f,\n    +2.154840876e-04f, -4.548512623e-04f, -1.778293686e-04f, +1.530254679e-03f, -1.355183132e-03f, -8.890768524e-04f, +2.153740373e-03f, -8.049181191e-04f, -7.814327649e-04f, +7.443103889e-04f, -1.143245190e-04f, -5.603182102e-05f,\n    /* 13, 7 (12) */\n    -1.723286448e-03f, +1.767075260e-02f, -1.146404535e-02f, -8.466548424e-02f, +1.779775491e-01f, +5.772849406e-01f, +3.877520639e-01f, -2.711701126e-02f, -5.645162242e-02f, +1.941307861e-02f, +4.274665300e-03f, -1.833961944e-03f,\n    -1.863313626e-04f, -6.399533126e-04f, +2.782491851e-03f, -8.263423637e-04f, -1.438790645e-02f, -5.577191289e-03f, +1.426897428e-02f, +7.693091924e-03f, -3.146404707e-03f, -6.090215279e-04f, +6.653656857e-04f, -1.053065026e-04f,\n    -2.461135327e-03f, -2.471402527e-03f, +1.676408005e-02f, -1.079717162e-02f, -2.361647463e-02f, +3.393398333e-02f, +2.240920987e-03f, -2.829850767e-02f, +1.269631969e-02f, +6.310467908e-03f, -5.063827395e-03f, +2.020130255e-04f,\n    +2.128458812e-04f, -4.212727168e-04f, -2.401578552e-04f, +1.539990607e-03f, -1.250543921e-03f, -1.015431139e-03f, +2.160471134e-03f, -7.081425809e-04f, -8.551820431e-04f, +7.483321095e-04f, -9.481916130e-05f, -6.575357007e-05f,\n    /* 13, 8 (12) */\n    -1.909617810e-03f, +1.703079929e-02f, -8.681553498e-03f, -8.549182660e-02f, +1.635896427e-01f, +5.717077493e-01f, +4.020210382e-01f, -1.942391933e-02f, -5.959802713e-02f, +1.880405709e-02f, +4.940030986e-03f, -1.939268447e-03f,\n    -1.574893238e-04f, -6.781536393e-04f, +2.675023529e-03f, -4.528546356e-04f, -1.414789389e-02f, -6.276707676e-03f, +1.399256560e-02f, +8.181410760e-03f, -3.056632268e-03f, -7.317311509e-04f, +6.912673055e-04f, -1.001290353e-04f,\n    -2.248289446e-03f, -2.892675244e-03f, +1.652392219e-02f, -9.257181012e-03f, -2.486701855e-02f, +3.291855219e-02f, +4.401392120e-03f, -2.900665025e-02f, +1.184113765e-02f, +7.058800017e-03f, -5.158646556e-03f, +1.362594554e-04f,\n    +2.090537622e-04f, -3.871216046e-04f, -2.994982043e-04f, +1.543071053e-03f, -1.141912228e-03f, -1.137414565e-03f, +2.158410463e-03f, -6.068705757e-04f, -9.270890492e-04f, +7.488969293e-04f, -7.364006599e-05f, -7.576012094e-05f,\n    /* 13, 9 (12) */\n    -2.067107134e-03f, +1.635264565e-02f, -6.006529970e-03f, -8.594468124e-02f, +1.494417488e-01f, +5.654310417e-01f, +4.160136038e-01f, -1.124250857e-02f, -6.265465940e-02f, +1.807232594e-02f, +5.631298291e-03f, -2.039397482e-03f,\n    -1.298754343e-04f, -7.108082717e-04f, +2.561433778e-03f, -9.509098033e-05f, -1.388178823e-02f, -6.960006524e-03f, +1.368261284e-02f, +8.665611439e-03f, -2.949525249e-03f, -8.578024405e-04f, +7.150363840e-04f, -9.359016142e-05f,\n    -2.039235684e-03f, -3.279796849e-03f, +1.622442399e-02f, -7.714109959e-03f, -2.600893078e-02f, +3.178113762e-02f, +6.559802583e-03f, -2.961352082e-02f, +1.091404860e-02f, +7.807696947e-03f, -5.232286622e-03f, +6.049933448e-05f,\n    +2.041953504e-04f, -3.526006638e-04f, -3.556541343e-04f, +1.539607480e-03f, -1.029802339e-03f, -1.254508685e-03f, +2.147513754e-03f, -5.014896212e-04f, -9.967710368e-04f, +7.458798377e-04f, -5.083106712e-05f, -8.599094342e-05f,\n    /* 13,10 (12) */\n    -2.196982568e-03f, +1.564183737e-02f, -3.445096192e-03f, -8.603977222e-02f, +1.355599605e-01f, +5.584710351e-01f, +4.296962167e-01f, -2.576897136e-03f, -6.560418465e-02f, +1.721452350e-02f, +6.346334675e-03f, -2.132987644e-03f,\n    -1.035795163e-04f, -7.380517100e-04f, +2.442493044e-03f, +2.463432767e-04f, -1.359080291e-02f, -7.625367814e-03f, +1.333959818e-02f, +9.144150220e-03f, -2.824735942e-03f, -9.868003555e-04f, +7.364039095e-04f, -8.563381123e-05f,\n    -1.835040333e-03f, -3.632397512e-03f, +1.586876985e-02f, -6.174502479e-03f, -2.703873312e-02f, +3.052662894e-02f, +8.707316338e-03f, -3.011501045e-02f, +9.917277561e-03f, +8.553576784e-03f, -5.283117689e-03f, -2.549160894e-05f,\n    +1.983610502e-04f, -3.179073510e-04f, -4.084505094e-04f, +1.529740495e-03f, -9.147396575e-04f, -1.366218456e-03f, +2.127776888e-03f, -3.924118856e-04f, -1.063847884e-03f, +7.391711375e-04f, -2.644788973e-05f, -9.638049292e-05f,\n    /* 13,11 (12) */\n    -2.300562085e-03f, +1.490378566e-02f, -1.002603147e-03f, -8.579342894e-02f, +1.219691576e-01f, +5.508456673e-01f, +4.430358148e-01f, +6.567253084e-03f, -6.842892059e-02f, +1.622772314e-02f, +7.082738584e-03f, -2.218621455e-03f,\n    -7.867815891e-05f, -7.600392416e-04f, +2.318962671e-03f, +5.709166087e-04f, -1.327621148e-02f, -8.271132396e-03f, +1.296411057e-02f, +9.615470084e-03f, -2.681972387e-03f, -1.118255620e-03f, +7.550997970e-04f, -7.621044297e-05f,\n    -1.636679283e-03f, -3.950304863e-03f, +1.546031934e-02f, -4.644761985e-03f, -2.795347278e-02f, +2.916041048e-02f, +1.083509323e-02f, -3.050742233e-02f, +8.853429677e-03f, +9.292747922e-03f, -5.309565579e-03f, -1.218721019e-04f,\n    +1.916433438e-04f, -2.832328815e-04f, -4.577337520e-04f, +1.513638670e-03f, -7.972580578e-04f, -1.472074572e-03f, +2.099236453e-03f, -2.800724448e-04f, -1.127944121e-03f, +7.286774941e-04f, -5.582472163e-07f, -1.068584657e-04f,\n    /* 13,12 (12) */\n    -2.379240244e-03f, +1.414374642e-02f, +1.316359524e-03f, -8.522251234e-02f, +1.086929461e-01f, +5.425745349e-01f, +4.559999254e-01f, +1.618272317e-02f, -7.111089298e-02f, +1.510946752e-02f, +7.837838381e-03f, -2.294831898e-03f,\n    -5.523492886e-05f, -7.769452423e-04f, +2.191591966e-03f, +8.781715374e-04f, -1.293934225e-02f, -8.895707478e-03f, +1.255684449e-02f, +1.007800620e-02f, -2.521001147e-03f, -1.251665564e-03f, +7.708543661e-04f, -6.527775164e-05f,\n    -1.445035939e-03f, -4.233537745e-03f, +1.500258559e-02f, -3.131123314e-03f, -2.875073084e-02f, +2.768833591e-02f, +1.293432968e-02f, -3.078749478e-02f, +7.725485557e-03f, +1.002142542e-02f, -5.310123826e-03f, -2.287305676e-04f,\n    +1.841360964e-04f, -2.487613335e-04f, -5.033721282e-04f, +1.491497241e-03f, -6.778972102e-04f, -1.571635666e-03f, +2.061969768e-03f, -1.649274018e-04f, -1.188690968e-03f, +7.143229162e-04f, +2.675813412e-05f, -1.173500990e-04f,\n    /* 13,13 (12) */\n    -2.434475173e-03f, +1.336680118e-02f, +3.507951490e-03f, -8.434434080e-02f, +9.575360390e-02f, +5.336788274e-01f, +4.685567699e-01f, +2.626072937e-02f, -7.363189412e-02f, +1.385780196e-02f, +8.608692748e-03f, -2.360109649e-03f,\n    -3.330065123e-05f, -7.889614458e-04f, +2.061115410e-03f, +1.167724577e-03f, -1.258157294e-02f, -9.497571855e-03f, +1.211859820e-02f, +1.053019151e-02f, -2.341649902e-03f, -1.386495152e-03f, +7.833998794e-04f, -5.280136448e-05f,\n    -1.260899843e-03f, -4.482299078e-03f, +1.449921346e-02f, -1.639626073e-03f, -2.942862805e-02f, +2.611670024e-02f, +1.499629945e-02f, -3.095242218e-02f, +6.536794588e-03f, +1.073574833e-02f, -5.283365692e-03f, -3.460806666e-04f,\n    +1.759338775e-04f, -2.146688219e-04f, -5.452559065e-04f, +1.463536678e-03f, -5.571999031e-04f, -1.664490364e-03f, +2.016094696e-03f, -4.745187593e-05f, -1.245728378e-03f, +6.960496621e-04f, +5.540956598e-05f, -1.277765152e-04f,\n    /* 13,14 (12) */\n    -2.467775824e-03f, +1.257783973e-02f, +5.569066900e-03f, -8.317661622e-02f, +8.317203096e-02f, +5.241812556e-01f, +4.806753681e-01f, +3.679092087e-02f, -7.597354403e-02f, +1.247130680e-02f, +9.392092627e-03f, -2.412911014e-03f,\n    -1.291375314e-05f, -7.962951917e-04f, +1.928250023e-03f, +1.439265878e-03f, -1.220432505e-02f, -1.007528085e-02f, +1.165027166e-02f, +1.097046239e-02f, -2.143809849e-03f, -1.522178203e-03f, +7.924721368e-04f, -3.875551810e-05f,\n    -1.084965965e-03f, -4.696967900e-03f, +1.395395756e-02f, -1.760893956e-04f, -2.998582795e-02f, +2.445220988e-02f, +1.701239414e-02f, -3.099987405e-02f, +5.291066210e-03f, +1.143179799e-02f, -5.227956126e-03f, -4.738571818e-04f,\n    +1.671313016e-04f, -1.811227425e-04f, -5.832973933e-04f, +1.430001151e-03f, -4.357093718e-04f, -1.750259188e-03f, +1.961769251e-03f, +7.186212692e-05f, -1.298707061e-03f, +6.738190635e-04f, +8.529252613e-05f, -1.380551095e-04f,\n    /* 13,15 (12) */\n    -2.480689577e-03f, +1.178154454e-02f, +7.497316922e-03f, -8.173735034e-02f, +7.096770591e-02f, +5.141059747e-01f, +4.923256397e-01f, +4.776138327e-02f, -7.811735387e-02f, +1.094912860e-02f, +1.018456476e-02f, -2.451666532e-03f,\n    +5.899333034e-06f, -7.991676621e-04f, +1.793692879e-03f, +1.692558582e-03f, -1.180905820e-02f, -1.062747093e-02f, +1.115286407e-02f, +1.139726444e-02f, -1.927437888e-03f, -1.658118799e-03f, +7.978121172e-04f, -2.312371193e-05f,\n    -9.178346638e-04f, -4.878090643e-03f, +1.337066016e-02f, +1.253911755e-03f, -3.042153732e-02f, +2.270195069e-02f, +1.897416339e-02f, -3.092801193e-02f, +3.992359149e-03f, +1.210561706e-02f, -5.142663600e-03f, -6.119122913e-04f,\n    +1.578223934e-04f, -1.482810923e-04f, -6.174308449e-04f, +1.391156898e-03f, -3.139666497e-04f, -1.828596289e-03f, +1.899191006e-03f, +1.925079550e-04f, -1.347290496e-03f, +6.476122611e-04f, +1.162918651e-04f, -1.480999791e-04f,\n    /* 13,16 (12) */\n    -2.474790244e-03f, +1.098237688e-02f, +9.291009802e-03f, -8.004479176e-02f, +5.915864770e-02f, +5.034785038e-01f, +5.034785038e-01f, +5.915864770e-02f, -8.004479176e-02f, +9.291009802e-03f, +1.098237688e-02f, -2.474790244e-03f,\n    +2.312371193e-05f, -7.978121172e-04f, +1.658118799e-03f, +1.927437888e-03f, -1.139726444e-02f, -1.115286407e-02f, +1.062747093e-02f, +1.180905820e-02f, -1.692558582e-03f, -1.793692879e-03f, +7.991676621e-04f, -5.899333034e-06f,\n    -7.600122705e-04f, -5.026371735e-03f, +1.275322932e-02f, +2.645068653e-03f, -3.073550397e-02f, +2.087335440e-02f, +2.087335440e-02f, -3.073550397e-02f, +2.645068653e-03f, +1.275322932e-02f, -5.026371735e-03f, -7.600122705e-04f,\n    +1.480999791e-04f, -1.162918651e-04f, -6.476122611e-04f, +1.347290496e-03f, -1.925079550e-04f, -1.899191006e-03f, +1.828596289e-03f, +3.139666497e-04f, -1.391156898e-03f, +6.174308449e-04f, +1.482810923e-04f, -1.578223934e-04f,\n    /* 13,17 (12) */\n    -2.451666532e-03f, +1.018456476e-02f, +1.094912860e-02f, -7.811735387e-02f, +4.776138327e-02f, +4.923256397e-01f, +5.141059747e-01f, +7.096770591e-02f, -8.173735034e-02f, +7.497316922e-03f, +1.178154454e-02f, -2.480689577e-03f,\n    +3.875551810e-05f, -7.924721368e-04f, +1.522178203e-03f, +2.143809849e-03f, -1.097046239e-02f, -1.165027166e-02f, +1.007528085e-02f, +1.220432505e-02f, -1.439265878e-03f, -1.928250023e-03f, +7.962951917e-04f, +1.291375314e-05f,\n    -6.119122913e-04f, -5.142663600e-03f, +1.210561706e-02f, +3.992359149e-03f, -3.092801193e-02f, +1.897416339e-02f, +2.270195069e-02f, -3.042153732e-02f, +1.253911755e-03f, +1.337066016e-02f, -4.878090643e-03f, -9.178346638e-04f,\n    +1.380551095e-04f, -8.529252613e-05f, -6.738190635e-04f, +1.298707061e-03f, -7.186212692e-05f, -1.961769251e-03f, +1.750259188e-03f, +4.357093718e-04f, -1.430001151e-03f, +5.832973933e-04f, +1.811227425e-04f, -1.671313016e-04f,\n    /* 13,18 (12) */\n    -2.412911014e-03f, +9.392092627e-03f, +1.247130680e-02f, -7.597354403e-02f, +3.679092087e-02f, +4.806753681e-01f, +5.241812556e-01f, +8.317203096e-02f, -8.317661622e-02f, +5.569066900e-03f, +1.257783973e-02f, -2.467775824e-03f,\n    +5.280136448e-05f, -7.833998794e-04f, +1.386495152e-03f, +2.341649902e-03f, -1.053019151e-02f, -1.211859820e-02f, +9.497571855e-03f, +1.258157294e-02f, -1.167724577e-03f, -2.061115410e-03f, +7.889614458e-04f, +3.330065123e-05f,\n    -4.738571818e-04f, -5.227956126e-03f, +1.143179799e-02f, +5.291066210e-03f, -3.099987405e-02f, +1.701239414e-02f, +2.445220988e-02f, -2.998582795e-02f, -1.760893956e-04f, +1.395395756e-02f, -4.696967900e-03f, -1.084965965e-03f,\n    +1.277765152e-04f, -5.540956598e-05f, -6.960496621e-04f, +1.245728378e-03f, +4.745187593e-05f, -2.016094696e-03f, +1.664490364e-03f, +5.571999031e-04f, -1.463536678e-03f, +5.452559065e-04f, +2.146688219e-04f, -1.759338775e-04f,\n    /* 13,19 (12) */\n    -2.360109649e-03f, +8.608692748e-03f, +1.385780196e-02f, -7.363189412e-02f, +2.626072937e-02f, +4.685567699e-01f, +5.336788274e-01f, +9.575360390e-02f, -8.434434080e-02f, +3.507951490e-03f, +1.336680118e-02f, -2.434475173e-03f,\n    +6.527775164e-05f, -7.708543661e-04f, +1.251665564e-03f, +2.521001147e-03f, -1.007800620e-02f, -1.255684449e-02f, +8.895707478e-03f, +1.293934225e-02f, -8.781715374e-04f, -2.191591966e-03f, +7.769452423e-04f, +5.523492886e-05f,\n    -3.460806666e-04f, -5.283365692e-03f, +1.073574833e-02f, +6.536794588e-03f, -3.095242218e-02f, +1.499629945e-02f, +2.611670024e-02f, -2.942862805e-02f, -1.639626073e-03f, +1.449921346e-02f, -4.482299078e-03f, -1.260899843e-03f,\n    +1.173500990e-04f, -2.675813412e-05f, -7.143229162e-04f, +1.188690968e-03f, +1.649274018e-04f, -2.061969768e-03f, +1.571635666e-03f, +6.778972102e-04f, -1.491497241e-03f, +5.033721282e-04f, +2.487613335e-04f, -1.841360964e-04f,\n    /* 13,20 (12) */\n    -2.294831898e-03f, +7.837838381e-03f, +1.510946752e-02f, -7.111089298e-02f, +1.618272317e-02f, +4.559999254e-01f, +5.425745349e-01f, +1.086929461e-01f, -8.522251234e-02f, +1.316359524e-03f, +1.414374642e-02f, -2.379240244e-03f,\n    +7.621044297e-05f, -7.550997970e-04f, +1.118255620e-03f, +2.681972387e-03f, -9.615470084e-03f, -1.296411057e-02f, +8.271132396e-03f, +1.327621148e-02f, -5.709166087e-04f, -2.318962671e-03f, +7.600392416e-04f, +7.867815891e-05f,\n    -2.287305676e-04f, -5.310123826e-03f, +1.002142542e-02f, +7.725485557e-03f, -3.078749478e-02f, +1.293432968e-02f, +2.768833591e-02f, -2.875073084e-02f, -3.131123314e-03f, +1.500258559e-02f, -4.233537745e-03f, -1.445035939e-03f,\n    +1.068584657e-04f, +5.582472163e-07f, -7.286774941e-04f, +1.127944121e-03f, +2.800724448e-04f, -2.099236453e-03f, +1.472074572e-03f, +7.972580578e-04f, -1.513638670e-03f, +4.577337520e-04f, +2.832328815e-04f, -1.916433438e-04f,\n    /* 13,21 (12) */\n    -2.218621455e-03f, +7.082738584e-03f, +1.622772314e-02f, -6.842892059e-02f, +6.567253084e-03f, +4.430358148e-01f, +5.508456673e-01f, +1.219691576e-01f, -8.579342894e-02f, -1.002603147e-03f, +1.490378566e-02f, -2.300562085e-03f,\n    +8.563381123e-05f, -7.364039095e-04f, +9.868003555e-04f, +2.824735942e-03f, -9.144150220e-03f, -1.333959818e-02f, +7.625367814e-03f, +1.359080291e-02f, -2.463432767e-04f, -2.442493044e-03f, +7.380517100e-04f, +1.035795163e-04f,\n    -1.218721019e-04f, -5.309565579e-03f, +9.292747922e-03f, +8.853429677e-03f, -3.050742233e-02f, +1.083509323e-02f, +2.916041048e-02f, -2.795347278e-02f, -4.644761985e-03f, +1.546031934e-02f, -3.950304863e-03f, -1.636679283e-03f,\n    +9.638049292e-05f, +2.644788973e-05f, -7.391711375e-04f, +1.063847884e-03f, +3.924118856e-04f, -2.127776888e-03f, +1.366218456e-03f, +9.147396575e-04f, -1.529740495e-03f, +4.084505094e-04f, +3.179073510e-04f, -1.983610502e-04f,\n    /* 13,22 (12) */\n    -2.132987644e-03f, +6.346334675e-03f, +1.721452350e-02f, -6.560418465e-02f, -2.576897136e-03f, +4.296962167e-01f, +5.584710351e-01f, +1.355599605e-01f, -8.603977222e-02f, -3.445096192e-03f, +1.564183737e-02f, -2.196982568e-03f,\n    +9.359016142e-05f, -7.150363840e-04f, +8.578024405e-04f, +2.949525249e-03f, -8.665611439e-03f, -1.368261284e-02f, +6.960006524e-03f, +1.388178823e-02f, +9.509098033e-05f, -2.561433778e-03f, +7.108082717e-04f, +1.298754343e-04f,\n    -2.549160894e-05f, -5.283117689e-03f, +8.553576784e-03f, +9.917277561e-03f, -3.011501045e-02f, +8.707316338e-03f, +3.052662894e-02f, -2.703873312e-02f, -6.174502479e-03f, +1.586876985e-02f, -3.632397512e-03f, -1.835040333e-03f,\n    +8.599094342e-05f, +5.083106712e-05f, -7.458798377e-04f, +9.967710368e-04f, +5.014896212e-04f, -2.147513754e-03f, +1.254508685e-03f, +1.029802339e-03f, -1.539607480e-03f, +3.556541343e-04f, +3.526006638e-04f, -2.041953504e-04f,\n    /* 13,23 (12) */\n    -2.039397482e-03f, +5.631298291e-03f, +1.807232594e-02f, -6.265465940e-02f, -1.124250857e-02f, +4.160136038e-01f, +5.654310417e-01f, +1.494417488e-01f, -8.594468124e-02f, -6.006529970e-03f, +1.635264565e-02f, -2.067107134e-03f,\n    +1.001290353e-04f, -6.912673055e-04f, +7.317311509e-04f, +3.056632268e-03f, -8.181410760e-03f, -1.399256560e-02f, +6.276707676e-03f, +1.414789389e-02f, +4.528546356e-04f, -2.675023529e-03f, +6.781536393e-04f, +1.574893238e-04f,\n    +6.049933448e-05f, -5.232286622e-03f, +7.807696947e-03f, +1.091404860e-02f, -2.961352082e-02f, +6.559802583e-03f, +3.178113762e-02f, -2.600893078e-02f, -7.714109959e-03f, +1.622442399e-02f, -3.279796849e-03f, -2.039235684e-03f,\n    +7.576012094e-05f, +7.364006599e-05f, -7.488969293e-04f, +9.270890492e-04f, +6.068705757e-04f, -2.158410463e-03f, +1.137414565e-03f, +1.141912228e-03f, -1.543071053e-03f, +2.994982043e-04f, +3.871216046e-04f, -2.090537622e-04f,\n    /* 13,24 (12) */\n    -1.939268447e-03f, +4.940030986e-03f, +1.880405709e-02f, -5.959802713e-02f, -1.942391933e-02f, +4.020210382e-01f, +5.717077493e-01f, +1.635896427e-01f, -8.549182660e-02f, -8.681553498e-03f, +1.703079929e-02f, -1.909617810e-03f,\n    +1.053065026e-04f, -6.653656857e-04f, +6.090215279e-04f, +3.146404707e-03f, -7.693091924e-03f, -1.426897428e-02f, +5.577191289e-03f, +1.438790645e-02f, +8.263423637e-04f, -2.782491851e-03f, +6.399533126e-04f, +1.863313626e-04f,\n    +1.362594554e-04f, -5.158646556e-03f, +7.058800017e-03f, +1.184113765e-02f, -2.900665025e-02f, +4.401392120e-03f, +3.291855219e-02f, -2.486701855e-02f, -9.257181012e-03f, +1.652392219e-02f, -2.892675244e-03f, -2.248289446e-03f,\n    +6.575357007e-05f, +9.481916130e-05f, -7.483321095e-04f, +8.551820431e-04f, +7.081425809e-04f, -2.160471134e-03f, +1.015431139e-03f, +1.250543921e-03f, -1.539990607e-03f, +2.401578552e-04f, +4.212727168e-04f, -2.128458812e-04f,\n    /* 13,25 (12) */\n    -1.833961944e-03f, +4.274665300e-03f, +1.941307861e-02f, -5.645162242e-02f, -2.711701126e-02f, +3.877520639e-01f, +5.772849406e-01f, +1.779775491e-01f, -8.466548424e-02f, -1.146404535e-02f, +1.767075260e-02f, -1.723286448e-03f,\n    +1.091844442e-04f, -6.375980530e-04f, +4.900737240e-04f, +3.219243078e-03f, -7.202180058e-03f, -1.451146435e-02f, +4.863232522e-03f, +1.460067770e-02f, +1.214875599e-03f, -2.883062253e-03f, +5.960952367e-04f, +2.162983549e-04f,\n    +2.020130255e-04f, -5.063827395e-03f, +6.310467908e-03f, +1.269631969e-02f, -2.829850767e-02f, +2.240920987e-03f, +3.393398333e-02f, -2.361647463e-02f, -1.079717162e-02f, +1.676408005e-02f, -2.471402527e-03f, -2.461135327e-03f,\n    +5.603182102e-05f, +1.143245190e-04f, -7.443103889e-04f, +7.814327649e-04f, +8.049181191e-04f, -2.153740373e-03f, +8.890768524e-04f, +1.355183132e-03f, -1.530254679e-03f, +1.778293686e-04f, +4.548512623e-04f, -2.154840876e-04f,\n    /* 13,26 (12) */\n    -1.724777500e-03f, +3.637067247e-03f, +1.990315234e-02f, -5.323237935e-02f, -3.431919132e-02f, +3.732405996e-01f, +5.821481731e-01f, +1.925782268e-01f, -8.345060864e-02f, -1.434710760e-02f, +1.826684783e-02f, -1.506988093e-03f,\n    +1.118298311e-04f, -6.082271138e-04f, +3.752525352e-04f, +3.275597609e-03f, -6.710176499e-03f, -1.471976944e-02f, +4.136655713e-03f, +1.478512959e-02f, +1.617703411e-03f, -2.975955388e-03f, +5.464914084e-04f, +2.472736694e-04f,\n    +2.580448465e-04f, -4.949502876e-03f, +5.566157519e-03f, +1.347775246e-02f, -2.749358955e-02f, +8.718061384e-05f, +3.482306018e-02f, -2.226129150e-02f, -1.232742630e-02f, +1.694190942e-02f, -2.016551265e-03f, -2.676619415e-03f,\n    +4.665017954e-05f, +1.321240280e-04f, -7.369709832e-04f, +7.062245809e-04f, +8.968359192e-04f, -2.138302843e-03f, +7.588910977e-04f, +1.455329316e-03f, -1.513781996e-03f, +1.127296324e-04f, +4.876502430e-04f, -2.168842588e-04f,\n    /* 13,27 (12) */\n    -1.612947669e-03f, +3.028840133e-03f, +2.027840487e-02f, -4.995678174e-02f, -4.102936781e-02f, +3.585208301e-01f, +5.862848289e-01f, +2.073633564e-01f, -8.183290523e-02f, -1.732306299e-02f, +1.881333924e-02f, -1.259714424e-03f,\n    +1.133140058e-04f, -5.775104921e-04f, +2.648871138e-04f, +3.315965017e-03f, -6.218553791e-03f, -1.489373133e-02f, +3.399328234e-03f, +1.494025893e-02f, +2.034003686e-03f, -3.060392336e-03f, +4.910794196e-04f, +2.791272556e-04f,\n    +3.046950260e-04f, -4.817378848e-03f, +4.829186536e-03f, +1.418397704e-02f, -2.659675363e-02f, -2.051122229e-03f, +3.558195128e-02f, -2.080596219e-02f, -1.384120829e-02f, +1.705463905e-02f, -1.528901022e-03f, -2.893503673e-03f,\n    +3.765856183e-05f, +1.481970653e-04f, -7.264661526e-04f, +6.299395067e-04f, +9.835624004e-04f, -2.114282635e-03f, +6.254316455e-04f, +1.550498232e-03f, -1.490522365e-03f, +4.509547366e-05f, +5.194594773e-04f, -2.169664862e-04f,\n    /* 13,28 (12) */\n    -1.499633663e-03f, +2.451329641e-03f, +2.054329199e-02f, -4.664081672e-02f, -4.724792160e-02f, +3.436270988e-01f, +5.896841571e-01f, +2.223036153e-01f, -7.979890154e-02f, -2.038345533e-02f, +1.930441866e-02f, -9.805871679e-04f,\n    +1.137119681e-04f, -5.456995484e-04f, +1.592708602e-04f, +3.340885179e-03f, -5.728750876e-03f, -1.503329967e-02f, +2.653154167e-03f, +1.506514186e-02f, +2.462884638e-03f, -3.135597999e-03f, +4.298239302e-04f, +3.117157438e-04f,\n    +3.423535879e-04f, -4.669181783e-03f, +4.102720383e-03f, +1.481391654e-02f, -2.561319123e-02f, -4.165404864e-03f, +3.620738292e-02f, -1.925546395e-02f, -1.533173066e-02f, +1.709973452e-02f, -1.009441545e-03f, -3.110470160e-03f,\n    +2.910137426e-05f, +1.625341969e-04f, -7.129599965e-04f, +5.529562791e-04f, +1.064792956e-03f, -2.081842445e-03f, +4.892719846e-04f, +1.640224450e-03f, -1.460457427e-03f, -2.481713253e-05f, +5.500667276e-04f, -2.156557882e-04f,\n    /* 13,29 (12) */\n    -1.385921695e-03f, +1.905630093e-03f, +2.070256285e-02f, -4.329993154e-02f, -5.297667248e-02f, +3.285937991e-01f, +5.923373113e-01f, +2.373687572e-01f, -7.733601691e-02f, -2.351905333e-02f, +1.973424259e-02f, -6.688714241e-04f,\n    +1.131016723e-04f, -5.130382847e-04f, +5.866148612e-05f, +3.350937692e-03f, -5.242168496e-03f, -1.513853115e-02f, +1.900067829e-03f, +1.515893813e-02f, +2.903386621e-03f, -3.200804569e-03f, +3.627180567e-04f, +3.448826313e-04f,\n    +3.714549621e-04f, -4.506647586e-03f, +3.389760387e-03f, +1.536687282e-02f, -2.454839827e-02f, -6.247247309e-03f, +3.669665491e-02f, -1.761523950e-02f, -1.679218809e-02f, +1.707491739e-02f, -4.593748169e-04f, -3.326125948e-03f,\n    +2.101743717e-05f, +1.751368193e-04f, -6.966272125e-04f, +4.756484828e-04f, +1.140253075e-03f, -2.041182561e-03f, +3.509985769e-04f, +1.724063779e-03f, -1.423601243e-03f, -9.673397891e-05f, +5.792588735e-04f, -2.128828168e-04f,\n    /* 13,30 (12) */\n    -1.272820023e-03f, +1.392591808e-03f, +2.076122433e-02f, -3.994899385e-02f, -5.821884098e-02f, +3.134552680e-01f, +5.942373791e-01f, +2.525276953e-01f, -7.443263029e-02f, -2.671985789e-02f, +2.009696065e-02f, -3.239887928e-04f,\n    +1.115633374e-04f, -4.797623354e-04f, -3.671875380e-05f, +3.346738359e-03f, -4.760164822e-03f, -1.520958842e-02f, +1.142027182e-03f, +1.522089498e-02f, +3.354484262e-03f, -3.255255062e-03f, +2.897846701e-04f, +3.784585558e-04f,\n    +3.924723993e-04f, -4.331510767e-03f, +2.693133174e-03f, +1.584252131e-02f, -2.340814520e-02f, -8.288429870e-03f, +3.704765348e-02f, -1.589117572e-02f, -1.821578933e-02f, +1.697818341e-02f, +1.198840566e-04f, -3.539008765e-03f,\n    +1.343995169e-05f, +1.860167439e-04f, -6.776518272e-04f, +3.983827397e-04f, +1.209699291e-03f, -1.992539666e-03f, +2.112080461e-04f, +1.801595605e-03f, -1.380000724e-03f, -1.703636618e-04f, +6.068231235e-04f, -2.085845515e-04f,\n    /* 13,31 (12) */\n    -1.161256685e-03f, +9.128294725e-04f, +2.072450558e-02f, -3.660225549e-02f, -6.297900580e-02f, +2.982456796e-01f, +5.953794063e-01f, +2.677485903e-01f, -7.107814602e-02f, -2.997511296e-02f, +2.038674532e-02f, +5.446976298e-05f,\n    +1.091787758e-04f, -4.460980491e-04f, -1.266826698e-04f, +3.328935618e-03f, -4.284051325e-03f, -1.524673848e-02f, +3.810071488e-04f, +1.525035079e-02f, +3.815088899e-03f, -3.298206916e-03f, +2.110775905e-04f, +4.122616604e-04f,\n    +4.059123510e-04f, -4.145494023e-03f, +2.015481347e-03f, +1.624090404e-02f, -2.219844591e-02f, -1.028096954e-02f, +3.725886153e-02f, -1.408958012e-02f, -1.959579005e-02f, +1.680781975e-02f, +7.267071801e-04f, -3.747593316e-03f,\n    +6.396508586e-06f, +1.951957310e-04f, -6.562259075e-04f, +3.215169699e-04f, +1.272919965e-03f, -1.936185460e-03f, +7.050431205e-05f, +1.872425123e-03f, -1.329735890e-03f, -2.453987339e-04f, +6.325482595e-04f, -2.027049756e-04f,\n    /* 14, 0 (12) */\n    -3.483566868e-03f, +2.195707835e-02f, -1.671089886e-02f, -8.818858307e-02f, +2.707817861e-01f, +6.330897793e-01f, +2.707817861e-01f, -8.818858307e-02f, -1.671089886e-02f, +2.195707835e-02f, -3.483566868e-03f, -6.397690500e-04f,\n    -2.095566848e-04f, -8.436258499e-04f, +3.543605650e-03f, -2.485353009e-03f, -1.712277592e-02f, -4.515114608e-04f, +1.718292394e-02f, +3.011131360e-03f, -3.650452588e-03f, +7.829085773e-04f, +2.509023181e-04f, -1.155752844e-04f,\n    -2.786478503e-03f, -3.384442003e-03f, +1.860961494e-02f, -1.609625641e-02f, -1.593698094e-02f, +3.732936584e-02f, -1.593698094e-02f, -1.609625641e-02f, +1.860961494e-02f, -3.384442003e-03f, -2.786478503e-03f, +7.162108030e-04f,\n    +2.877351700e-04f, -5.205013231e-04f, -1.552916331e-04f, +1.621475507e-03f, -1.858124495e-03f, -7.900112358e-05f, +1.943254627e-03f, -1.581791628e-03f, +7.451458378e-05f, +5.621608250e-04f, -2.920940404e-04f, +4.492956993e-05f,\n    /* 14, 1 (12) */\n    -3.693123553e-03f, +2.111345250e-02f, -1.316729321e-02f, -9.067393607e-02f, +2.536590102e-01f, +6.326382678e-01f, +2.879647100e-01f, -8.517745171e-02f, -2.036135145e-02f, +2.273998693e-02f, -3.232664550e-03f, -7.553443344e-04f,\n    -1.698740044e-04f, -8.966077936e-04f, +3.425618724e-03f, -1.974483539e-03f, -1.702249058e-02f, -1.353235228e-03f, +1.720212808e-02f, +3.550465531e-03f, -3.745121099e-03f, +7.143705810e-04f, +2.937455915e-04f, -1.250032891e-04f,\n    -2.498743333e-03f, -3.904943326e-03f, +1.845432331e-02f, -1.447478090e-02f, -1.779510544e-02f, +3.725036472e-02f, -1.399372632e-02f, -1.767804803e-02f, +1.868412953e-02f, -2.822281178e-03f, -3.078572543e-03f, +7.611403730e-04f,\n    +2.818251726e-04f, -4.778498449e-04f, -2.330186866e-04f, +1.652961485e-03f, -1.765331581e-03f, -2.366256669e-04f, +2.020246759e-03f, -1.533967754e-03f, -8.969655050e-06f, +6.025480632e-04f, -2.947864381e-04f, +4.119965783e-05f,\n    /* 14, 2 (12) */\n    -3.862997557e-03f, +2.021684471e-02f, -9.741674484e-03f, -9.264841961e-02f, +2.366365196e-01f, +6.312850326e-01f, +3.051668381e-01f, -8.162698617e-02f, -2.410647254e-02f, +2.345435751e-02f, -2.938918959e-03f, -8.803476234e-04f,\n    -1.319998145e-04f, -9.419769302e-04f, +3.297538548e-03f, -1.479785379e-03f, -1.688300191e-02f, -2.251066406e-03f, +1.717971371e-02f, +4.101915421e-03f, -3.826586174e-03f, +6.379657263e-04f, +3.379014654e-04f, -1.341191095e-04f,\n    -2.216918160e-03f, -4.382793171e-03f, +1.822130462e-02f, -1.282181941e-02f, -1.956043702e-02f, +3.701373905e-02f, -1.197347956e-02f, -1.921201579e-02f, +1.867515987e-02f, -2.219733115e-03f, -3.373358981e-03f, +8.023400308e-04f,\n    +2.744845839e-04f, -4.344828754e-04f, -3.073778285e-04f, +1.676234961e-03f, -1.665386148e-03f, -3.931190910e-04f, +2.088663505e-03f, -1.478105414e-03f, -9.479479793e-05f, +6.413805850e-04f, -2.957032450e-04f, +3.666633283e-05f,\n    /* 14, 3 (12) */\n    -3.994997372e-03f, +1.927486778e-02f, -6.444135936e-03f, -9.412820499e-02f, +2.197535177e-01f, +6.290339662e-01f, +3.223465518e-01f, -7.752507075e-02f, -2.793305872e-02f, +2.409232323e-02f, -2.601017493e-03f, -1.014466733e-03f,\n    -9.605995565e-05f, -9.798906578e-04f, +3.160415132e-03f, -1.002427212e-03f, -1.670536631e-02f, -3.142426152e-03f, +1.711514211e-02f, +4.663957920e-03f, -3.893841458e-03f, +5.536891363e-04f, +3.831653515e-04f, -1.428133424e-04f,\n    -1.942433576e-03f, -4.817276046e-03f, +1.791392679e-02f, -1.114558445e-02f, -2.122582317e-02f, +3.662061996e-02f, -9.884816051e-03f, -2.069012120e-02f, +1.858036507e-02f, -1.578352530e-03f, -3.669062226e-03f, +8.390063636e-04f,\n    +2.658380941e-04f, -3.906715309e-04f, -3.780772691e-04f, +1.691324078e-03f, -1.558830532e-03f, -5.477339459e-04f, +2.148107906e-03f, -1.414349844e-03f, -1.825726615e-04f, +6.783754690e-04f, -2.947425992e-04f, +3.131430453e-05f,\n    /* 14, 4 (12) */\n    -4.091057328e-03f, +1.829497712e-02f, -3.283720804e-03f, -9.513063220e-02f, +2.030481514e-01f, +6.258915400e-01f, +3.394616939e-01f, -7.286111283e-02f, -3.182690018e-02f, +2.464601237e-02f, -2.217852142e-03f, -1.157280075e-03f,\n    -6.216076941e-05f, -1.010538897e-03f, +3.015296862e-03f, -5.434813215e-04f, -1.649075716e-02f, -4.024759880e-03f, +1.700801397e-02f, +5.234991390e-03f, -3.945904524e-03f, +4.615790388e-04f, +4.293134268e-04f, -1.509725676e-04f,\n    -1.676595482e-03f, -5.207947577e-03f, +1.753584952e-02f, -9.454260375e-03f, -2.278465370e-02f, +3.607288601e-02f, -7.736708145e-03f, -2.210447105e-02f, +1.839779241e-02f, -8.999770607e-04f, -3.963804825e-03f, +8.703206682e-04f,\n    +2.560135196e-04f, -3.466800695e-04f, -4.448524013e-04f, +1.698298923e-03f, -1.446236031e-03f, -6.997326862e-04f, +2.198225824e-03f, -1.342889811e-03f, -2.718949091e-04f, +7.132510745e-04f, -2.918109105e-04f, +2.513456335e-05f,\n    /* 14, 5 (12) */\n    -4.153218097e-03f, +1.728443822e-02f, -2.684239422e-04f, -9.567411352e-02f, +1.865573942e-01f, +6.218667801e-01f, +3.564697079e-01f, -6.762612144e-02f, -3.577280470e-02f, +2.510759141e-02f, -1.788538715e-03f, -1.308252643e-03f,\n    -3.038941061e-05f, -1.034141651e-03f, +2.863225755e-03f, -1.039214152e-04f, -1.624045891e-02f, -4.895546810e-03f, +1.685807228e-02f, +5.813340580e-03f, -3.981822189e-03f, +3.617184481e-04f, +4.761030859e-04f, -1.584800107e-04f,\n    -1.420581962e-03f, -5.554627647e-03f, +1.709099712e-02f, -7.755961452e-03f, -2.423088973e-02f, +3.537315333e-02f, -5.538482321e-03f, -2.344736086e-02f, +1.812589750e-02f, -1.867259862e-04f, -4.255615736e-03f, +8.954552315e-04f,\n    +2.451407895e-04f, -3.027644889e-04f, -5.074666744e-04f, +1.697270512e-03f, -1.328199640e-03f, -8.483915534e-04f, +2.238708105e-03f, -1.263957192e-03f, -3.623349518e-04f, +7.457288302e-04f, -2.868238523e-04f, +1.812476249e-05f,\n    /* 14, 6 (12) */\n    -4.183607508e-03f, +1.625029657e-02f, +2.594801813e-03f, -9.577803494e-02f, +1.703169353e-01f, +6.169712333e-01f, +3.733277802e-01f, -6.181278086e-02f, -3.975462689e-02f, +2.546930986e-02f, -1.312435629e-03f, -1.466732654e-03f,\n    -8.142673220e-07f, -1.050946499e-03f, +2.705232885e-03f, +3.153790798e-04f, -1.595586084e-02f, -5.752309374e-03f, +1.666520473e-02f, +6.397261939e-03f, -4.000675843e-03f, +2.542366648e-04f, +5.232735340e-04f, -1.652162652e-04f,\n    -1.175441173e-03f, -5.857392136e-03f, +1.658353045e-02f, -6.058690940e-03f, -2.555908937e-02f, +3.452476177e-02f, -3.299774216e-03f, -2.471131805e-02f, +1.776356255e-02f, +5.590028440e-04f, -4.542439588e-03f, +9.135799940e-04f,\n    +2.333509534e-04f, -2.591712155e-04f, -5.657122833e-04f, +1.688389547e-03f, -1.205340678e-03f, -9.930043805e-04f, +2.269292511e-03f, -1.177826303e-03f, -4.534499955e-04f, +7.755350544e-04f, -2.797073241e-04f, +1.028956101e-05f,\n    /* 14, 7 (12) */\n    -4.184421775e-03f, +1.519935007e-02f, +5.300034698e-03f, -9.546265586e-02f, +1.543610745e-01f, +6.112189239e-01f, +3.899929849e-01f, -5.541551893e-02f, -4.375530273e-02f, +2.572354652e-02f, -7.891620951e-04f, -1.631948919e-03f,\n    +2.651451868e-05f, -1.061226029e-03f, +2.542333996e-03f, +7.136482429e-04f, -1.563845037e-02f, -6.592622428e-03f, +1.642944541e-02f, +6.984949343e-03f, -4.001586750e-03f, +1.393105816e-04f, +5.705465244e-04f, -1.710600727e-04f,\n    -9.420902195e-04f, -6.116563351e-03f, +1.601781816e-02f, -4.370301393e-03f, -2.676443005e-02f, +3.353175739e-02f, -1.030481705e-03f, -2.588914435e-02f, +1.731011255e-02f, +1.334537898e-03f, -4.822146912e-03f, +9.238695550e-04f,\n    +2.207752179e-04f, -2.161358931e-04f, -6.194106731e-04f, +1.671844972e-03f, -1.078297313e-03f, -1.132886295e-03f, +2.289765401e-03f, -1.084812977e-03f, -5.447832259e-04f, +8.024027933e-04f, -2.703983748e-04f, +1.640924043e-06f,\n    /* 14, 8 (12) */\n    -4.157907256e-03f, +1.413812404e-02f, +7.842368693e-03f, -9.474900762e-02f, +1.387226241e-01f, +6.046263015e-01f, +4.064224303e-01f, -4.843056958e-02f, -4.775688948e-02f, +2.586285710e-02f, -2.186155707e-04f, -1.803008991e-03f,\n    +5.156443831e-05f, -1.065275244e-03f, +2.375525325e-03f, +1.090216417e-03f, -1.528980612e-02f, -7.414122240e-03f, +1.615097606e-02f, +7.574540184e-03f, -3.983721317e-03f, +1.716577841e-05f, +6.176272395e-04f, -1.758891562e-04f,\n    -7.213150016e-04f, -6.332699244e-03f, +1.539840749e-02f, -2.698456421e-03f, -2.784272736e-02f, +3.239887110e-02f, +1.259283696e-03f, -2.697395733e-02f, +1.676532933e-02f, +2.136940692e-03f, -5.092545287e-03f, +9.255104791e-04f,\n    +2.075440164e-04f, -1.738822750e-04f, -6.684128596e-04f, +1.647862332e-03f, -9.477230128e-04f, -1.267377302e-03f, +2.299963153e-03f, -9.852733917e-04f, -6.358661197e-04f, +8.260736675e-04f, -2.588460809e-04f, -7.801624059e-06f,\n    /* 14, 9 (12) */\n    -4.106342818e-03f, +1.307284880e-02f, +1.021789402e-02f, -9.365879120e-02f, +1.234328180e-01f, +5.972121793e-01f, +4.225734064e-01f, -4.085602940e-02f, -5.174061080e-02f, +2.588002288e-02f, +3.990116688e-04f, -1.978898148e-03f,\n    +7.431991612e-05f, -1.063408936e-03f, +2.205779643e-03f, +1.444516500e-03f, -1.491159057e-02f, -8.214515209e-03f, +1.583012660e-02f, +8.164121817e-03f, -3.946296285e-03f, -1.119226028e-04f, +6.642053169e-04f, -1.795811048e-04f,\n    -5.137709852e-04f, -6.506581519e-03f, +1.472999463e-02f, -1.050594090e-03f, -2.879045037e-02f, +3.113149380e-02f, +3.559246850e-03f, -2.795923072e-02f, +1.612946321e-02f, +2.963014359e-03f, -5.351391368e-03f, +9.177088550e-04f,\n    +1.937861184e-04f, -1.326212247e-04f, -7.125995664e-04f, +1.616701951e-03f, -8.142829350e-04f, -1.395845724e-03f, +2.299773314e-03f, -8.796026607e-04f, -7.262208694e-04f, +8.462997143e-04f, -2.450123702e-04f, -1.801079715e-05f,\n    /* 14,10 (12) */\n    -4.032022902e-03f, +1.200943986e-02f, +1.242367366e-02f, -9.221427470e-02f, +1.085212274e-01f, +5.889976641e-01f, +4.384035330e-01f, -3.269190758e-02f, -5.568690709e-02f, +2.576810028e-02f, +1.063216986e-03f, -2.158479252e-03f,\n    +9.478153387e-05f, -1.055959061e-03f, +2.034042535e-03f, +1.776083771e-03f, -1.450554257e-02f, -8.991586271e-03f, +1.546737506e-02f, +8.751738335e-03f, -3.888583826e-03f, -2.476292181e-04f, +7.099560197e-04f, -1.820143042e-04f,\n    -3.199848669e-04f, -6.639202744e-03f, +1.401739507e-02f, +5.661078616e-04f, -2.960473331e-02f, +2.973564807e-02f, +5.859020164e-03f, -2.883883338e-02f, +1.540324234e-02f, +3.809314073e-03f, -5.596403738e-03f, +8.996980578e-04f,\n    +1.796277841e-04f, -9.254982940e-05f, -7.518811835e-04f, +1.578656937e-03f, -6.786502876e-04f, -1.517691483e-03f, +2.289135474e-03f, -7.682331800e-04f, -8.153629108e-04f, +8.628452127e-04f, -2.288727852e-04f, -2.895139895e-05f,\n    /* 14,11 (12) */\n    -3.937241368e-03f, +1.095348080e-02f, +1.445771620e-02f, -9.043819093e-02f, +9.401568484e-02f, +5.800060778e-01f, +4.538709081e-01f, -2.394016925e-02f, -5.957549091e-02f, +2.552047106e-02f, +1.773173005e-03f, -2.340493557e-03f,\n    +1.129651849e-04f, -1.043272123e-03f, +1.861228919e-03f, +2.084555279e-03f, -1.407346953e-02f, -9.743206968e-03f, +1.506334703e-02f, +9.335397639e-03f, -3.809916508e-03f, -3.895781260e-04f, +7.545415498e-04f, -1.830689087e-04f,\n    -1.403570827e-04f, -6.731752573e-03f, +1.326551388e-02f, +2.144764798e-03f, -3.028338360e-02f, +2.821795659e-02f, +8.148155638e-03f, -2.960706656e-02f, +1.458787943e-02f, +4.672159286e-03f, -5.825276523e-03f, +8.707466589e-04f,\n    +1.651919677e-04f, -5.385062770e-05f, -7.861975489e-04f, +1.534051030e-03f, -5.415026718e-04f, -1.632349197e-03f, +2.268041857e-03f, -6.516327482e-04f, -9.028035375e-04f, +8.754884812e-04f, -2.104171770e-04f, -4.058023191e-05f,\n    /* 14,12 (12) */\n    -3.824276183e-03f, +9.910208678e-03f, +1.631894512e-02f, -8.835363565e-02f, +7.994221531e-02f, +5.702628708e-01f, +4.689342551e-01f, -1.460477161e-02f, -6.338540742e-02f, +2.513089294e-02f, +2.527714555e-03f, -2.523562465e-03f,\n    +1.289011675e-04f, -1.025706576e-03f, +1.688219838e-03f, +2.369668778e-03f, -1.361723946e-02f, -1.046734314e-02f, +1.461881426e-02f, +9.913078798e-03f, -3.709692115e-03f, -5.373426477e-04f, +7.976125002e-04f, -1.826278507e-04f,\n    +2.483488496e-05f, -6.785603201e-03f, +1.247931633e-02f, +3.678815829e-03f, -3.082488627e-02f, +2.658560739e-02f, +1.041619749e-02f, -3.025869931e-02f, +1.368507589e-02f, +5.547647767e-03f, -6.035693700e-03f, +8.301664270e-04f,\n    +1.505975742e-04f, -1.669095444e-05f, -8.155175604e-04f, +1.483236316e-03f, -4.035184337e-04f, -1.739291087e-03f, +2.236537626e-03f, -5.303024628e-04f, -9.880525889e-04f, +8.840236334e-04f, -1.896503245e-04f, -5.284606617e-05f,\n    /* 14,13 (12) */\n    -3.695375015e-03f, +8.884502102e-03f, +1.800716495e-02f, -8.598396687e-02f, +6.632497585e-02f, +5.597955277e-01f, +4.835530693e-01f, -4.691692810e-03f, -6.709509954e-02f, +2.459355029e-02f, +3.325327055e-03f, -2.706190316e-03f,\n    +1.426332262e-04f, -1.003630268e-03f, +1.515859504e-03f, +2.631261254e-03f, -1.313877285e-02f, -1.116206222e-02f, +1.413469289e-02f, +1.048273963e-02f, -3.587378280e-03f, -6.904454897e-04f, +8.388094454e-04f, -1.805778797e-04f,\n    +1.754324591e-04f, -6.802294155e-03f, +1.166379877e-02f, +5.162052144e-03f, -3.122840470e-02f, +2.484631631e-02f, +1.265273512e-02f, -3.078900177e-02f, +1.269702330e-02f, +6.431671401e-03f, -6.225344025e-03f, +7.773203608e-04f,\n    +1.359587736e-04f, +1.877759626e-05f, -8.398386216e-04f, +1.426590804e-03f, -2.653730447e-04f, -1.838029668e-03f, +2.194720887e-03f, -4.047744056e-04f, -1.070621198e-03f, +8.882622810e-04f, -1.665924708e-04f, -6.568967103e-05f,\n    /* 14,14 (12) */\n    -3.552741789e-03f, +7.880871834e-03f, +1.952302446e-02f, -8.335270562e-02f, +5.318620301e-02f, +5.486334655e-01f, +4.976877622e-01f, +5.791046820e-03f, -7.068247782e-02f, +2.390310480e-02f, +4.164136501e-03f, -2.886768196e-03f,\n    +1.542175485e-04f, -9.774179342e-04f, +1.344952629e-03f, +2.869267029e-03f, -1.264003442e-02f, -1.182554003e-02f, +1.361204091e-02f, +1.104232452e-02f, -3.442516910e-03f, -8.483591395e-04f, +8.777646629e-04f, -1.768106276e-04f,\n    +3.113912327e-04f, -6.783516559e-03f, +1.082396015e-02f, +6.588642948e-03f, -3.149377775e-02f, +2.300828664e-02f, +1.484745601e-02f, -3.119377618e-02f, +1.162640210e-02f, +7.319933682e-03f, -6.391936496e-03f, +7.116306898e-04f,\n    +1.213843752e-04f, +5.241958966e-05f, -8.591859308e-04f, +1.364515909e-03f, -1.277355294e-04f, -1.928120205e-03f, +2.142742413e-03f, -2.756091257e-04f, -1.150024578e-03f, +8.880351716e-04f, -1.412797720e-04f, -7.904391072e-05f,\n    /* 14,15 (12) */\n    -3.398524241e-03f, +6.903453900e-03f, +2.086797709e-02f, -8.048343859e-02f, +4.054616859e-02f, +5.368079254e-01f, +5.112998031e-01f, +1.683337134e-02f, -7.412499473e-02f, +2.305474566e-02f, +5.041901164e-03f, -3.063578823e-03f,\n    +1.637217264e-04f, -9.474487544e-04f, +1.176262034e-03f, +3.083715479e-03f, -1.212302485e-02f, -1.245606722e-02f, +1.305205507e-02f, +1.158977239e-02f, -3.274728383e-03f, -1.010506538e-03f, +9.141039823e-04f, -1.712236910e-04f,\n    +4.327756079e-04f, -6.731096969e-03f, +9.964774221e-03f, +7.953158857e-03f, -3.162151328e-02f, +2.108016643e-02f, +1.699019842e-02f, -3.146938530e-02f, +1.047637753e-02f, +8.207968853e-03f, -6.533216268e-03f, +6.325867791e-04f,\n    +1.069772648e-04f, +8.411605119e-05f, -8.736116193e-04f, +1.297433827e-03f, +8.735035650e-06f, -2.009162944e-03f, +2.080805069e-03f, -1.433929362e-04f, -1.225784842e-03f, +8.831937479e-04f, -1.137646507e-04f, -9.283390635e-05f,\n    /* 14,16 (12) */\n    -3.234802514e-03f, +5.956005146e-03f, +2.204423912e-02f, -7.739972311e-02f, +2.842314373e-02f, +5.243518582e-01f, +5.243518582e-01f, +2.842314373e-02f, -7.739972311e-02f, +2.204423912e-02f, +5.956005146e-03f, -3.234802514e-03f,\n    +1.712236910e-04f, -9.141039823e-04f, +1.010506538e-03f, +3.274728383e-03f, -1.158977239e-02f, -1.305205507e-02f, +1.245606722e-02f, +1.212302485e-02f, -3.083715479e-03f, -1.176262034e-03f, +9.474487544e-04f, -1.637217264e-04f,\n    +5.397528727e-04f, -6.646980918e-03f, +9.091162601e-03f, +9.250592684e-03f, -3.161277824e-02f, +1.907100349e-02f, +1.907100349e-02f, -3.161277824e-02f, +9.250592684e-03f, +9.091162601e-03f, -6.646980918e-03f, +5.397528727e-04f,\n    +9.283390635e-05f, +1.137646507e-04f, -8.831937479e-04f, +1.225784842e-03f, +1.433929362e-04f, -2.080805069e-03f, +2.009162944e-03f, -8.735035650e-06f, -1.297433827e-03f, +8.736116193e-04f, -8.411605119e-05f, -1.069772648e-04f,\n    /* 14,17 (12) */\n    -3.063578823e-03f, +5.041901164e-03f, +2.305474566e-02f, -7.412499473e-02f, +1.683337134e-02f, +5.112998031e-01f, +5.368079254e-01f, +4.054616859e-02f, -8.048343859e-02f, +2.086797709e-02f, +6.903453900e-03f, -3.398524241e-03f,\n    +1.768106276e-04f, -8.777646629e-04f, +8.483591395e-04f, +3.442516910e-03f, -1.104232452e-02f, -1.361204091e-02f, +1.182554003e-02f, +1.264003442e-02f, -2.869267029e-03f, -1.344952629e-03f, +9.774179342e-04f, -1.542175485e-04f,\n    +6.325867791e-04f, -6.533216268e-03f, +8.207968853e-03f, +1.047637753e-02f, -3.146938530e-02f, +1.699019842e-02f, +2.108016643e-02f, -3.162151328e-02f, +7.953158857e-03f, +9.964774221e-03f, -6.731096969e-03f, +4.327756079e-04f,\n    +7.904391072e-05f, +1.412797720e-04f, -8.880351716e-04f, +1.150024578e-03f, +2.756091257e-04f, -2.142742413e-03f, +1.928120205e-03f, +1.277355294e-04f, -1.364515909e-03f, +8.591859308e-04f, -5.241958966e-05f, -1.213843752e-04f,\n    /* 14,18 (12) */\n    -2.886768196e-03f, +4.164136501e-03f, +2.390310480e-02f, -7.068247782e-02f, +5.791046820e-03f, +4.976877622e-01f, +5.486334655e-01f, +5.318620301e-02f, -8.335270562e-02f, +1.952302446e-02f, +7.880871834e-03f, -3.552741789e-03f,\n    +1.805778797e-04f, -8.388094454e-04f, +6.904454897e-04f, +3.587378280e-03f, -1.048273963e-02f, -1.413469289e-02f, +1.116206222e-02f, +1.313877285e-02f, -2.631261254e-03f, -1.515859504e-03f, +1.003630268e-03f, -1.426332262e-04f,\n    +7.116306898e-04f, -6.391936496e-03f, +7.319933682e-03f, +1.162640210e-02f, -3.119377618e-02f, +1.484745601e-02f, +2.300828664e-02f, -3.149377775e-02f, +6.588642948e-03f, +1.082396015e-02f, -6.783516559e-03f, +3.113912327e-04f,\n    +6.568967103e-05f, +1.665924708e-04f, -8.882622810e-04f, +1.070621198e-03f, +4.047744056e-04f, -2.194720887e-03f, +1.838029668e-03f, +2.653730447e-04f, -1.426590804e-03f, +8.398386216e-04f, -1.877759626e-05f, -1.359587736e-04f,\n    /* 14,19 (12) */\n    -2.706190316e-03f, +3.325327055e-03f, +2.459355029e-02f, -6.709509954e-02f, -4.691692810e-03f, +4.835530693e-01f, +5.597955277e-01f, +6.632497585e-02f, -8.598396687e-02f, +1.800716495e-02f, +8.884502102e-03f, -3.695375015e-03f,\n    +1.826278507e-04f, -7.976125002e-04f, +5.373426477e-04f, +3.709692115e-03f, -9.913078798e-03f, -1.461881426e-02f, +1.046734314e-02f, +1.361723946e-02f, -2.369668778e-03f, -1.688219838e-03f, +1.025706576e-03f, -1.289011675e-04f,\n    +7.773203608e-04f, -6.225344025e-03f, +6.431671401e-03f, +1.269702330e-02f, -3.078900177e-02f, +1.265273512e-02f, +2.484631631e-02f, -3.122840470e-02f, +5.162052144e-03f, +1.166379877e-02f, -6.802294155e-03f, +1.754324591e-04f,\n    +5.284606617e-05f, +1.896503245e-04f, -8.840236334e-04f, +9.880525889e-04f, +5.303024628e-04f, -2.236537626e-03f, +1.739291087e-03f, +4.035184337e-04f, -1.483236316e-03f, +8.155175604e-04f, +1.669095444e-05f, -1.505975742e-04f,\n    /* 14,20 (12) */\n    -2.523562465e-03f, +2.527714555e-03f, +2.513089294e-02f, -6.338540742e-02f, -1.460477161e-02f, +4.689342551e-01f, +5.702628708e-01f, +7.994221531e-02f, -8.835363565e-02f, +1.631894512e-02f, +9.910208678e-03f, -3.824276183e-03f,\n    +1.830689087e-04f, -7.545415498e-04f, +3.895781260e-04f, +3.809916508e-03f, -9.335397639e-03f, -1.506334703e-02f, +9.743206968e-03f, +1.407346953e-02f, -2.084555279e-03f, -1.861228919e-03f, +1.043272123e-03f, -1.129651849e-04f,\n    +8.301664270e-04f, -6.035693700e-03f, +5.547647767e-03f, +1.368507589e-02f, -3.025869931e-02f, +1.041619749e-02f, +2.658560739e-02f, -3.082488627e-02f, +3.678815829e-03f, +1.247931633e-02f, -6.785603201e-03f, +2.483488496e-05f,\n    +4.058023191e-05f, +2.104171770e-04f, -8.754884812e-04f, +9.028035375e-04f, +6.516327482e-04f, -2.268041857e-03f, +1.632349197e-03f, +5.415026718e-04f, -1.534051030e-03f, +7.861975489e-04f, +5.385062770e-05f, -1.651919677e-04f,\n    /* 14,21 (12) */\n    -2.340493557e-03f, +1.773173005e-03f, +2.552047106e-02f, -5.957549091e-02f, -2.394016925e-02f, +4.538709081e-01f, +5.800060778e-01f, +9.401568484e-02f, -9.043819093e-02f, +1.445771620e-02f, +1.095348080e-02f, -3.937241368e-03f,\n    +1.820143042e-04f, -7.099560197e-04f, +2.476292181e-04f, +3.888583826e-03f, -8.751738335e-03f, -1.546737506e-02f, +8.991586271e-03f, +1.450554257e-02f, -1.776083771e-03f, -2.034042535e-03f, +1.055959061e-03f, -9.478153387e-05f,\n    +8.707466589e-04f, -5.825276523e-03f, +4.672159286e-03f, +1.458787943e-02f, -2.960706656e-02f, +8.148155638e-03f, +2.821795659e-02f, -3.028338360e-02f, +2.144764798e-03f, +1.326551388e-02f, -6.731752573e-03f, -1.403570827e-04f,\n    +2.895139895e-05f, +2.288727852e-04f, -8.628452127e-04f, +8.153629108e-04f, +7.682331800e-04f, -2.289135474e-03f, +1.517691483e-03f, +6.786502876e-04f, -1.578656937e-03f, +7.518811835e-04f, +9.254982940e-05f, -1.796277841e-04f,\n    /* 14,22 (12) */\n    -2.158479252e-03f, +1.063216986e-03f, +2.576810028e-02f, -5.568690709e-02f, -3.269190758e-02f, +4.384035330e-01f, +5.889976641e-01f, +1.085212274e-01f, -9.221427470e-02f, +1.242367366e-02f, +1.200943986e-02f, -4.032022902e-03f,\n    +1.795811048e-04f, -6.642053169e-04f, +1.119226028e-04f, +3.946296285e-03f, -8.164121817e-03f, -1.583012660e-02f, +8.214515209e-03f, +1.491159057e-02f, -1.444516500e-03f, -2.205779643e-03f, +1.063408936e-03f, -7.431991612e-05f,\n    +8.996980578e-04f, -5.596403738e-03f, +3.809314073e-03f, +1.540324234e-02f, -2.883883338e-02f, +5.859020164e-03f, +2.973564807e-02f, -2.960473331e-02f, +5.661078616e-04f, +1.401739507e-02f, -6.639202744e-03f, -3.199848669e-04f,\n    +1.801079715e-05f, +2.450123702e-04f, -8.462997143e-04f, +7.262208694e-04f, +8.796026607e-04f, -2.299773314e-03f, +1.395845724e-03f, +8.142829350e-04f, -1.616701951e-03f, +7.125995664e-04f, +1.326212247e-04f, -1.937861184e-04f,\n    /* 14,23 (12) */\n    -1.978898148e-03f, +3.990116688e-04f, +2.588002288e-02f, -5.174061080e-02f, -4.085602940e-02f, +4.225734064e-01f, +5.972121793e-01f, +1.234328180e-01f, -9.365879120e-02f, +1.021789402e-02f, +1.307284880e-02f, -4.106342818e-03f,\n    +1.758891562e-04f, -6.176272395e-04f, -1.716577841e-05f, +3.983721317e-03f, -7.574540184e-03f, -1.615097606e-02f, +7.414122240e-03f, +1.528980612e-02f, -1.090216417e-03f, -2.375525325e-03f, +1.065275244e-03f, -5.156443831e-05f,\n    +9.177088550e-04f, -5.351391368e-03f, +2.963014359e-03f, +1.612946321e-02f, -2.795923072e-02f, +3.559246850e-03f, +3.113149380e-02f, -2.879045037e-02f, -1.050594090e-03f, +1.472999463e-02f, -6.506581519e-03f, -5.137709852e-04f,\n    +7.801624059e-06f, +2.588460809e-04f, -8.260736675e-04f, +6.358661197e-04f, +9.852733917e-04f, -2.299963153e-03f, +1.267377302e-03f, +9.477230128e-04f, -1.647862332e-03f, +6.684128596e-04f, +1.738822750e-04f, -2.075440164e-04f,\n    /* 14,24 (12) */\n    -1.803008991e-03f, -2.186155707e-04f, +2.586285710e-02f, -4.775688948e-02f, -4.843056958e-02f, +4.064224303e-01f, +6.046263015e-01f, +1.387226241e-01f, -9.474900762e-02f, +7.842368693e-03f, +1.413812404e-02f, -4.157907256e-03f,\n    +1.710600727e-04f, -5.705465244e-04f, -1.393105816e-04f, +4.001586750e-03f, -6.984949343e-03f, -1.642944541e-02f, +6.592622428e-03f, +1.563845037e-02f, -7.136482429e-04f, -2.542333996e-03f, +1.061226029e-03f, -2.651451868e-05f,\n    +9.255104791e-04f, -5.092545287e-03f, +2.136940692e-03f, +1.676532933e-02f, -2.697395733e-02f, +1.259283696e-03f, +3.239887110e-02f, -2.784272736e-02f, -2.698456421e-03f, +1.539840749e-02f, -6.332699244e-03f, -7.213150016e-04f,\n    -1.640924043e-06f, +2.703983748e-04f, -8.024027933e-04f, +5.447832259e-04f, +1.084812977e-03f, -2.289765401e-03f, +1.132886295e-03f, +1.078297313e-03f, -1.671844972e-03f, +6.194106731e-04f, +2.161358931e-04f, -2.207752179e-04f,\n    /* 14,25 (12) */\n    -1.631948919e-03f, -7.891620951e-04f, +2.572354652e-02f, -4.375530273e-02f, -5.541551893e-02f, +3.899929849e-01f, +6.112189239e-01f, +1.543610745e-01f, -9.546265586e-02f, +5.300034698e-03f, +1.519935007e-02f, -4.184421775e-03f,\n    +1.652162652e-04f, -5.232735340e-04f, -2.542366648e-04f, +4.000675843e-03f, -6.397261939e-03f, -1.666520473e-02f, +5.752309374e-03f, +1.595586084e-02f, -3.153790798e-04f, -2.705232885e-03f, +1.050946499e-03f, +8.142673220e-07f,\n    +9.238695550e-04f, -4.822146912e-03f, +1.334537898e-03f, +1.731011255e-02f, -2.588914435e-02f, -1.030481705e-03f, +3.353175739e-02f, -2.676443005e-02f, -4.370301393e-03f, +1.601781816e-02f, -6.116563351e-03f, -9.420902195e-04f,\n    -1.028956101e-05f, +2.797073241e-04f, -7.755350544e-04f, +4.534499955e-04f, +1.177826303e-03f, -2.269292511e-03f, +9.930043805e-04f, +1.205340678e-03f, -1.688389547e-03f, +5.657122833e-04f, +2.591712155e-04f, -2.333509534e-04f,\n    /* 14,26 (12) */\n    -1.466732654e-03f, -1.312435629e-03f, +2.546930986e-02f, -3.975462689e-02f, -6.181278086e-02f, +3.733277802e-01f, +6.169712333e-01f, +1.703169353e-01f, -9.577803494e-02f, +2.594801813e-03f, +1.625029657e-02f, -4.183607508e-03f,\n    +1.584800107e-04f, -4.761030859e-04f, -3.617184481e-04f, +3.981822189e-03f, -5.813340580e-03f, -1.685807228e-02f, +4.895546810e-03f, +1.624045891e-02f, +1.039214152e-04f, -2.863225755e-03f, +1.034141651e-03f, +3.038941061e-05f,\n    +9.135799940e-04f, -4.542439588e-03f, +5.590028440e-04f, +1.776356255e-02f, -2.471131805e-02f, -3.299774216e-03f, +3.452476177e-02f, -2.555908937e-02f, -6.058690940e-03f, +1.658353045e-02f, -5.857392136e-03f, -1.175441173e-03f,\n    -1.812476249e-05f, +2.868238523e-04f, -7.457288302e-04f, +3.623349518e-04f, +1.263957192e-03f, -2.238708105e-03f, +8.483915534e-04f, +1.328199640e-03f, -1.697270512e-03f, +5.074666744e-04f, +3.027644889e-04f, -2.451407895e-04f,\n    /* 14,27 (12) */\n    -1.308252643e-03f, -1.788538715e-03f, +2.510759141e-02f, -3.577280470e-02f, -6.762612144e-02f, +3.564697079e-01f, +6.218667801e-01f, +1.865573942e-01f, -9.567411352e-02f, -2.684239422e-04f, +1.728443822e-02f, -4.153218097e-03f,\n    +1.509725676e-04f, -4.293134268e-04f, -4.615790388e-04f, +3.945904524e-03f, -5.234991390e-03f, -1.700801397e-02f, +4.024759880e-03f, +1.649075716e-02f, +5.434813215e-04f, -3.015296862e-03f, +1.010538897e-03f, +6.216076941e-05f,\n    +8.954552315e-04f, -4.255615736e-03f, -1.867259862e-04f, +1.812589750e-02f, -2.344736086e-02f, -5.538482321e-03f, +3.537315333e-02f, -2.423088973e-02f, -7.755961452e-03f, +1.709099712e-02f, -5.554627647e-03f, -1.420581962e-03f,\n    -2.513456335e-05f, +2.918109105e-04f, -7.132510745e-04f, +2.718949091e-04f, +1.342889811e-03f, -2.198225824e-03f, +6.997326862e-04f, +1.446236031e-03f, -1.698298923e-03f, +4.448524013e-04f, +3.466800695e-04f, -2.560135196e-04f,\n    /* 14,28 (12) */\n    -1.157280075e-03f, -2.217852142e-03f, +2.464601237e-02f, -3.182690018e-02f, -7.286111283e-02f, +3.394616939e-01f, +6.258915400e-01f, +2.030481514e-01f, -9.513063220e-02f, -3.283720804e-03f, +1.829497712e-02f, -4.091057328e-03f,\n    +1.428133424e-04f, -3.831653515e-04f, -5.536891363e-04f, +3.893841458e-03f, -4.663957920e-03f, -1.711514211e-02f, +3.142426152e-03f, +1.670536631e-02f, +1.002427212e-03f, -3.160415132e-03f, +9.798906578e-04f, +9.605995565e-05f,\n    +8.703206682e-04f, -3.963804825e-03f, -8.999770607e-04f, +1.839779241e-02f, -2.210447105e-02f, -7.736708145e-03f, +3.607288601e-02f, -2.278465370e-02f, -9.454260375e-03f, +1.753584952e-02f, -5.207947577e-03f, -1.676595482e-03f,\n    -3.131430453e-05f, +2.947425992e-04f, -6.783754690e-04f, +1.825726615e-04f, +1.414349844e-03f, -2.148107906e-03f, +5.477339459e-04f, +1.558830532e-03f, -1.691324078e-03f, +3.780772691e-04f, +3.906715309e-04f, -2.658380941e-04f,\n    /* 14,29 (12) */\n    -1.014466733e-03f, -2.601017493e-03f, +2.409232323e-02f, -2.793305872e-02f, -7.752507075e-02f, +3.223465518e-01f, +6.290339662e-01f, +2.197535177e-01f, -9.412820499e-02f, -6.444135936e-03f, +1.927486778e-02f, -3.994997372e-03f,\n    +1.341191095e-04f, -3.379014654e-04f, -6.379657263e-04f, +3.826586174e-03f, -4.101915421e-03f, -1.717971371e-02f, +2.251066406e-03f, +1.688300191e-02f, +1.479785379e-03f, -3.297538548e-03f, +9.419769302e-04f, +1.319998145e-04f,\n    +8.390063636e-04f, -3.669062226e-03f, -1.578352530e-03f, +1.858036507e-02f, -2.069012120e-02f, -9.884816051e-03f, +3.662061996e-02f, -2.122582317e-02f, -1.114558445e-02f, +1.791392679e-02f, -4.817276046e-03f, -1.942433576e-03f,\n    -3.666633283e-05f, +2.957032450e-04f, -6.413805850e-04f, +9.479479793e-05f, +1.478105414e-03f, -2.088663505e-03f, +3.931190910e-04f, +1.665386148e-03f, -1.676234961e-03f, +3.073778285e-04f, +4.344828754e-04f, -2.744845839e-04f,\n    /* 14,30 (12) */\n    -8.803476234e-04f, -2.938918959e-03f, +2.345435751e-02f, -2.410647254e-02f, -8.162698617e-02f, +3.051668381e-01f, +6.312850326e-01f, +2.366365196e-01f, -9.264841961e-02f, -9.741674484e-03f, +2.021684471e-02f, -3.862997557e-03f,\n    +1.250032891e-04f, -2.937455915e-04f, -7.143705810e-04f, +3.745121099e-03f, -3.550465531e-03f, -1.720212808e-02f, +1.353235228e-03f, +1.702249058e-02f, +1.974483539e-03f, -3.425618724e-03f, +8.966077936e-04f, +1.698740044e-04f,\n    +8.023400308e-04f, -3.373358981e-03f, -2.219733115e-03f, +1.867515987e-02f, -1.921201579e-02f, -1.197347956e-02f, +3.701373905e-02f, -1.956043702e-02f, -1.282181941e-02f, +1.822130462e-02f, -4.382793171e-03f, -2.216918160e-03f,\n    -4.119965783e-05f, +2.947864381e-04f, -6.025480632e-04f, +8.969655050e-06f, +1.533967754e-03f, -2.020246759e-03f, +2.366256669e-04f, +1.765331581e-03f, -1.652961485e-03f, +2.330186866e-04f, +4.778498449e-04f, -2.818251726e-04f,\n    /* 14,31 (12) */\n    -7.553443344e-04f, -3.232664550e-03f, +2.273998693e-02f, -2.036135145e-02f, -8.517745171e-02f, +2.879647100e-01f, +6.326382678e-01f, +2.536590102e-01f, -9.067393607e-02f, -1.316729321e-02f, +2.111345250e-02f, -3.693123553e-03f,\n    +1.155752844e-04f, -2.509023181e-04f, -7.829085773e-04f, +3.650452588e-03f, -3.011131360e-03f, -1.718292394e-02f, +4.515114608e-04f, +1.712277592e-02f, +2.485353009e-03f, -3.543605650e-03f, +8.436258499e-04f, +2.095566848e-04f,\n    +7.611403730e-04f, -3.078572543e-03f, -2.822281178e-03f, +1.868412953e-02f, -1.767804803e-02f, -1.399372632e-02f, +3.725036472e-02f, -1.779510544e-02f, -1.447478090e-02f, +1.845432331e-02f, -3.904943326e-03f, -2.498743333e-03f,\n    -4.492956993e-05f, +2.920940404e-04f, -5.621608250e-04f, -7.451458378e-05f, +1.581791628e-03f, -1.943254627e-03f, +7.900112358e-05f, +1.858124495e-03f, -1.621475507e-03f, +1.552916331e-04f, +5.205013231e-04f, -2.877351700e-04f,\n    /* 15, 0 (12) */\n    -6.270045371e-03f, +1.857263635e-02f, +1.898716084e-03f, -1.042848395e-01f, +2.548448052e-01f, +6.704191451e-01f, +2.548448052e-01f, -1.042848395e-01f, +1.898716084e-03f, +1.857263635e-02f, -6.270045371e-03f, +7.644175308e-05f,\n    +7.817848527e-05f, -1.364127173e-03f, +3.388314016e-03f, -8.638775022e-04f, -1.898090041e-02f, -5.305125844e-04f, +1.912617857e-02f, +1.429339731e-03f, -3.575938004e-03f, +1.345069402e-03f, -4.119172230e-05f, -7.064571447e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 1 (12) */\n    -6.191866886e-03f, +1.720850917e-02f, +5.287030100e-03f, -1.051487170e-01f, +2.358639047e-01f, +6.698886325e-01f, +2.739709837e-01f, -1.028554997e-01f, -1.677221920e-03f, +1.991770575e-02f, -6.311237093e-03f, +5.796038602e-06f,\n    +1.119511682e-04f, -1.374457639e-03f, +3.192600037e-03f, -3.215220538e-04f, -1.878782216e-02f, -1.589860895e-03f, +1.922237484e-02f, +2.016497777e-03f, -3.754090754e-03f, +1.316918644e-03f, -1.040846606e-06f, -8.380363123e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 2 (12) */\n    -6.079915717e-03f, +1.583405154e-02f, +8.479630137e-03f, -1.054702390e-01f, +2.170760826e-01f, +6.682987716e-01f, +2.931933586e-01f, -1.008390020e-01f, -5.431312674e-03f, +2.123462439e-02f, -6.312277940e-03f, -7.800759263e-05f,\n    +1.424847694e-04f, -1.376459806e-03f, +2.990160719e-03f, +1.964495825e-04f, -1.854838806e-02f, -2.644185497e-03f, +1.926837722e-02f, +2.623810007e-03f, -3.921380972e-03f, +1.279346311e-03f, +4.219822040e-05f, -9.745277665e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 3 (12) */\n    -5.937430948e-03f, +1.445759173e-02f, +1.146979086e-02f, -1.052737894e-01f, +1.985276945e-01f, +6.656545861e-01f, +3.124617358e-01f, -9.821519196e-02f, -9.352693646e-03f, +2.251397070e-02f, -6.270079719e-03f, -1.754603693e-04f,\n    +1.697781384e-04f, -1.370562189e-03f, +2.782337863e-03f, +6.888968659e-04f, -1.826419684e-02f, -3.690160098e-03f, +1.926325002e-02f, +3.249608075e-03f, -4.076414120e-03f, +1.232064605e-03f, +8.842275228e-05f, -1.114990379e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 4 (12) */\n    -5.767652810e-03f, +1.308702954e-02f, +1.425212872e-02f, -1.045848926e-01f, +1.802634977e-01f, +6.619644260e-01f, +3.317249858e-01f, -9.496558388e-02f, -1.342910777e-02f, +2.374603531e-02f, -6.181656967e-03f, -2.869594071e-04f,\n    +1.938527502e-04f, -1.357218966e-03f, +2.570444461e-03f, +1.154817602e-03f, -1.793699319e-02f, -4.724492566e-03f, +1.920623979e-02f, +3.892101579e-03f, -4.217799433e-03f, +1.174830113e-03f, +1.375025163e-04f, -1.258380042e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 5 (12) */\n    -5.573800059e-03f, +1.172981057e-02f, +1.682257318e-02f, -1.034300750e-01f, +1.623265045e-01f, +6.572399335e-01f, +3.509312256e-01f, -9.107348230e-02f, -1.764690720e-02f, +2.492086542e-02f, -6.044154451e-03f, -4.127974114e-04f,\n    +2.147513789e-04f, -1.336906140e-03f, +2.355759081e-03f, +1.593349097e-03f, -1.756865855e-02f, -5.743938364e-03f, +1.909678039e-02f, +4.549383387e-03f, -4.344157141e-03f, +1.107447278e-03f, +1.892792335e-04f, -1.403552482e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 6 (12) */\n    -5.359048680e-03f, +1.039290443e-02f, +1.917833226e-02f, -1.018367259e-01f, +1.447578459e-01f, +6.514959951e-01f, +3.700280060e-01f, -8.652409891e-02f, -2.199106434e-02f, +2.602831270e-02f, -5.854875217e-03f, -5.531526595e-04f,\n    +2.325366861e-04f, -1.310117715e-03f, +2.139520601e-03f, +2.003768627e-03f, -1.716120151e-02f, -6.745313754e-03f, +1.893449724e-02f, +5.219435635e-03f, -4.454125839e-03f, +1.029771719e-03f, +2.435662099e-04f, -1.549267042e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 7 (12) */\n    -5.126511994e-03f, +9.082786720e-03f, +2.131785286e-02f, -9.983295725e-02f, +1.275966444e-01f, +6.447506813e-01f, +3.889625032e-01f, -8.130466328e-02f, -2.644519018e-02f, +2.705808442e-02f, -5.611309007e-03f, -7.080793637e-04f,\n    +2.472897366e-04f, -1.277361922e-03f, +1.922923322e-03f, +2.385493214e-03f, -1.671674768e-02f, -7.725508723e-03f, +1.871921081e-02f, +5.900136366e-03f, -4.546369976e-03f, +9.417133749e-04f, +3.001481496e-04f, -1.694191487e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 8 (12) */\n    -4.879222258e-03f, +7.805424797e-03f, +2.324077619e-02f, -9.744746404e-02f, +1.108798967e-01f, +6.370251726e-01f, +4.076817140e-01f, -7.540452691e-02f, -3.099156015e-02f, +2.799979780e-02f, -5.311160858e-03f, -8.774985124e-04f,\n    +2.591084547e-04f, -1.239157519e-03f, +1.707112465e-03f, +2.738078749e-03f, -1.623752913e-02f, -8.681499542e-03f, +1.845093922e-02f, +6.589266792e-03f, -4.619587437e-03f, +8.432394459e-04f, +3.587811586e-04f, -1.836907803e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15, 9 (12) */\n    -4.620113803e-03f, +6.566267278e-03f, +2.494788865e-02f, -9.470938529e-02f, +9.464236761e-02f, +6.283436731e-01f, +4.261326532e-01f, -6.881526012e-02f, -3.561114759e-02f, +2.884303724e-02f, -4.952379699e-03f, -1.061189293e-03f,\n    +2.681060345e-04f, -1.196030160e-03f, +1.493180077e-03f, +3.061218451e-03f, -1.572587350e-02f, -9.610360933e-03f, +1.812989991e-02f, +7.284519157e-03f, -4.672517155e-03f, +7.343771115e-04f, +4.191929467e-04f, -1.975919020e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,10 (12) */\n    -4.352007769e-03f, +5.370237118e-03f, +2.644106873e-02f, -9.164816684e-02f, +7.891649411e-02f, +6.187333121e-01f, +4.442625532e-01f, -6.153074096e-02f, -4.028366475e-02f, +2.957741435e-02f, -4.533186752e-03f, -1.258781195e-03f,\n    +2.744093180e-04f, -1.148508890e-03f, +1.282161351e-03f, +3.354740708e-03f, -1.518419286e-02f, -1.050927775e-02f, +1.775651054e-02f, +7.983505155e-03f, -4.703946737e-03f, +6.152159946e-04f, +4.810832345e-04f, -2.109657031e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,11 (12) */\n    -4.077598451e-03f, +4.221728228e-03f, +2.772323008e-02f, -8.829342613e-02f, +6.373230125e-02f, +6.082240344e-01f, +4.620190637e-01f, -5.354723581e-02f, -4.498761148e-02f, +3.019263035e-02f, -4.052103518e-03f, -1.469746898e-03f,\n    +2.781571526e-04f, -1.097122751e-03f, +1.075031370e-03f, +3.618606309e-03f, -1.461497220e-02f, -1.137555617e-02f, +1.733138888e-02f, +8.683764891e-03f, -4.712720046e-03f, +4.859103552e-04f, +5.441243728e-04f, -2.236491406e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,12 (12) */\n    -3.799441298e-03f, +3.124605477e-03f, +2.879826145e-02f, -8.467481982e-02f, +4.911732904e-02f, +5.968484782e-01f, +4.793504526e-01f, -4.486347092e-02f, -4.970033153e-02f, +3.067854070e-02f, -3.507979145e-03f, -1.693396038e-03f,\n    +2.794987417e-04f, -1.042397530e-03f, +8.727022773e-04f, +3.852905094e-03f, -1.402075789e-02f, -1.220663423e-02f, +1.685535188e-02f, +9.382776335e-03f, -4.697744704e-03f, +3.466809857e-04f, +6.079621757e-04f, -2.354739168e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,13 (12) */\n    -3.519942556e-03f, +2.082207947e-03f, +2.967096373e-02f, -8.082191473e-02f, +3.509657115e-02f, +5.846418440e-01f, +4.962058045e-01f, -3.548069458e-02f, -5.439807623e-02f, +3.102522169e-02f, -2.900016969e-03f, -1.928869955e-03f,\n    +2.785919998e-04f, -9.848526714e-04f, +6.760208820e-04f, +4.057852059e-03f, -1.340414589e-02f, -1.300009189e-02f, +1.632941378e-02f, +1.007796522e-02f, -4.657999478e-03f, +1.978167914e-04f, +6.722169746e-04f, -2.462675508e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,14 (12) */\n    -3.241350556e-03f, +1.097355275e-03f, +3.034698461e-02f, -7.676406267e-02f, +2.169242526e-02f, +5.716417521e-01f, +5.125352182e-01f, -2.540272936e-02f, -5.905607571e-02f, +3.122303848e-02f, -2.227799995e-03f, -2.175137506e-03f,\n    +2.756019237e-04f, -9.249983445e-04f, +4.857666985e-04f, +4.233782938e-03f, -1.276776995e-02f, -1.375366024e-02f, +1.575478333e-02f, +1.076671539e-02f, -4.592541488e-03f, +3.967603208e-05f, +7.364848909e-04f, -2.558545383e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,15 (12) */\n    -2.965748633e-03f, +1.723569308e-04f, +3.083275131e-02f, -7.253027973e-02f, +8.924655309e-03f, +5.578880919e-01f, +5.282900016e-01f, -1.463601396e-02f, -6.364861720e-02f, +3.126271451e-02f, -1.491315104e-03f, -2.430992044e-03f,\n    +2.706989912e-04f, -8.633327032e-04f, +3.026504151e-04f, +4.381149306e-03f, -1.211428982e-02f, -1.446523016e-02f, +1.513286014e-02f, +1.144637946e-02f, -4.500513226e-03f, -1.273127899e-04f, +8.003393316e-04f, -2.640575974e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,16 (12) */\n    -2.695049642e-03f, -6.909757724e-04f, +3.113540172e-02f, -6.814913042e-02f, -3.189634508e-03f, +5.434228617e-01f, +5.434228617e-01f, -3.189634508e-03f, -6.814913042e-02f, +3.113540172e-02f, -6.909757724e-04f, -2.695049642e-03f,\n    +2.640575974e-04f, -8.003393316e-04f, +1.273127899e-04f, +4.500513226e-03f, -1.144637946e-02f, -1.513286014e-02f, +1.446523016e-02f, +1.211428982e-02f, -4.381149306e-03f, -3.026504151e-04f, +8.633327032e-04f, -2.706989912e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,17 (12) */\n    -2.430992044e-03f, -1.491315104e-03f, +3.126271451e-02f, -6.364861720e-02f, -1.463601396e-02f, +5.282900016e-01f, +5.578880919e-01f, +8.924655309e-03f, -7.253027973e-02f, +3.083275131e-02f, +1.723569308e-04f, -2.965748633e-03f,\n    +2.558545383e-04f, -7.364848909e-04f, -3.967603208e-05f, +4.592541488e-03f, -1.076671539e-02f, -1.575478333e-02f, +1.375366024e-02f, +1.276776995e-02f, -4.233782938e-03f, -4.857666985e-04f, +9.249983445e-04f, -2.756019237e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,18 (12) */\n    -2.175137506e-03f, -2.227799995e-03f, +3.122303848e-02f, -5.905607571e-02f, -2.540272936e-02f, +5.125352182e-01f, +5.716417521e-01f, +2.169242526e-02f, -7.676406267e-02f, +3.034698461e-02f, +1.097355275e-03f, -3.241350556e-03f,\n    +2.462675508e-04f, -6.722169746e-04f, -1.978167914e-04f, +4.657999478e-03f, -1.007796522e-02f, -1.632941378e-02f, +1.300009189e-02f, +1.340414589e-02f, -4.057852059e-03f, -6.760208820e-04f, +9.848526714e-04f, -2.785919998e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,19 (12) */\n    -1.928869955e-03f, -2.900016969e-03f, +3.102522169e-02f, -5.439807623e-02f, -3.548069458e-02f, +4.962058045e-01f, +5.846418440e-01f, +3.509657115e-02f, -8.082191473e-02f, +2.967096373e-02f, +2.082207947e-03f, -3.519942556e-03f,\n    +2.354739168e-04f, -6.079621757e-04f, -3.466809857e-04f, +4.697744704e-03f, -9.382776335e-03f, -1.685535188e-02f, +1.220663423e-02f, +1.402075789e-02f, -3.852905094e-03f, -8.727022773e-04f, +1.042397530e-03f, -2.794987417e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,20 (12) */\n    -1.693396038e-03f, -3.507979145e-03f, +3.067854070e-02f, -4.970033153e-02f, -4.486347092e-02f, +4.793504526e-01f, +5.968484782e-01f, +4.911732904e-02f, -8.467481982e-02f, +2.879826145e-02f, +3.124605477e-03f, -3.799441298e-03f,\n    +2.236491406e-04f, -5.441243728e-04f, -4.859103552e-04f, +4.712720046e-03f, -8.683764891e-03f, -1.733138888e-02f, +1.137555617e-02f, +1.461497220e-02f, -3.618606309e-03f, -1.075031370e-03f, +1.097122751e-03f, -2.781571526e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,21 (12) */\n    -1.469746898e-03f, -4.052103518e-03f, +3.019263035e-02f, -4.498761148e-02f, -5.354723581e-02f, +4.620190637e-01f, +6.082240344e-01f, +6.373230125e-02f, -8.829342613e-02f, +2.772323008e-02f, +4.221728228e-03f, -4.077598451e-03f,\n    +2.109657031e-04f, -4.810832345e-04f, -6.152159946e-04f, +4.703946737e-03f, -7.983505155e-03f, -1.775651054e-02f, +1.050927775e-02f, +1.518419286e-02f, -3.354740708e-03f, -1.282161351e-03f, +1.148508890e-03f, -2.744093180e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,22 (12) */\n    -1.258781195e-03f, -4.533186752e-03f, +2.957741435e-02f, -4.028366475e-02f, -6.153074096e-02f, +4.442625532e-01f, +6.187333121e-01f, +7.891649411e-02f, -9.164816684e-02f, +2.644106873e-02f, +5.370237118e-03f, -4.352007769e-03f,\n    +1.975919020e-04f, -4.191929467e-04f, -7.343771115e-04f, +4.672517155e-03f, -7.284519157e-03f, -1.812989991e-02f, +9.610360933e-03f, +1.572587350e-02f, -3.061218451e-03f, -1.493180077e-03f, +1.196030160e-03f, -2.681060345e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,23 (12) */\n    -1.061189293e-03f, -4.952379699e-03f, +2.884303724e-02f, -3.561114759e-02f, -6.881526012e-02f, +4.261326532e-01f, +6.283436731e-01f, +9.464236761e-02f, -9.470938529e-02f, +2.494788865e-02f, +6.566267278e-03f, -4.620113803e-03f,\n    +1.836907803e-04f, -3.587811586e-04f, -8.432394459e-04f, +4.619587437e-03f, -6.589266792e-03f, -1.845093922e-02f, +8.681499542e-03f, +1.623752913e-02f, -2.738078749e-03f, -1.707112465e-03f, +1.239157519e-03f, -2.591084547e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,24 (12) */\n    -8.774985124e-04f, -5.311160858e-03f, +2.799979780e-02f, -3.099156015e-02f, -7.540452691e-02f, +4.076817140e-01f, +6.370251726e-01f, +1.108798967e-01f, -9.744746404e-02f, +2.324077619e-02f, +7.805424797e-03f, -4.879222258e-03f,\n    +1.694191487e-04f, -3.001481496e-04f, -9.417133749e-04f, +4.546369976e-03f, -5.900136366e-03f, -1.871921081e-02f, +7.725508723e-03f, +1.671674768e-02f, -2.385493214e-03f, -1.922923322e-03f, +1.277361922e-03f, -2.472897366e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,25 (12) */\n    -7.080793637e-04f, -5.611309007e-03f, +2.705808442e-02f, -2.644519018e-02f, -8.130466328e-02f, +3.889625032e-01f, +6.447506813e-01f, +1.275966444e-01f, -9.983295725e-02f, +2.131785286e-02f, +9.082786720e-03f, -5.126511994e-03f,\n    +1.549267042e-04f, -2.435662099e-04f, -1.029771719e-03f, +4.454125839e-03f, -5.219435635e-03f, -1.893449724e-02f, +6.745313754e-03f, +1.716120151e-02f, -2.003768627e-03f, -2.139520601e-03f, +1.310117715e-03f, -2.325366861e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,26 (12) */\n    -5.531526595e-04f, -5.854875217e-03f, +2.602831270e-02f, -2.199106434e-02f, -8.652409891e-02f, +3.700280060e-01f, +6.514959951e-01f, +1.447578459e-01f, -1.018367259e-01f, +1.917833226e-02f, +1.039290443e-02f, -5.359048680e-03f,\n    +1.403552482e-04f, -1.892792335e-04f, -1.107447278e-03f, +4.344157141e-03f, -4.549383387e-03f, -1.909678039e-02f, +5.743938364e-03f, +1.756865855e-02f, -1.593349097e-03f, -2.355759081e-03f, +1.336906140e-03f, -2.147513789e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,27 (12) */\n    -4.127974114e-04f, -6.044154451e-03f, +2.492086542e-02f, -1.764690720e-02f, -9.107348230e-02f, +3.509312256e-01f, +6.572399335e-01f, +1.623265045e-01f, -1.034300750e-01f, +1.682257318e-02f, +1.172981057e-02f, -5.573800059e-03f,\n    +1.258380042e-04f, -1.375025163e-04f, -1.174830113e-03f, +4.217799433e-03f, -3.892101579e-03f, -1.920623979e-02f, +4.724492566e-03f, +1.793699319e-02f, -1.154817602e-03f, -2.570444461e-03f, +1.357218966e-03f, -1.938527502e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,28 (12) */\n    -2.869594071e-04f, -6.181656967e-03f, +2.374603531e-02f, -1.342910777e-02f, -9.496558388e-02f, +3.317249858e-01f, +6.619644260e-01f, +1.802634977e-01f, -1.045848926e-01f, +1.425212872e-02f, +1.308702954e-02f, -5.767652810e-03f,\n    +1.114990379e-04f, -8.842275228e-05f, -1.232064605e-03f, +4.076414120e-03f, -3.249608075e-03f, -1.926325002e-02f, +3.690160098e-03f, +1.826419684e-02f, -6.888968659e-04f, -2.782337863e-03f, +1.370562189e-03f, -1.697781384e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,29 (12) */\n    -1.754603693e-04f, -6.270079719e-03f, +2.251397070e-02f, -9.352693646e-03f, -9.821519196e-02f, +3.124617358e-01f, +6.656545861e-01f, +1.985276945e-01f, -1.052737894e-01f, +1.146979086e-02f, +1.445759173e-02f, -5.937430948e-03f,\n    +9.745277665e-05f, -4.219822040e-05f, -1.279346311e-03f, +3.921380972e-03f, -2.623810007e-03f, -1.926837722e-02f, +2.644185497e-03f, +1.854838806e-02f, -1.964495825e-04f, -2.990160719e-03f, +1.376459806e-03f, -1.424847694e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,30 (12) */\n    -7.800759263e-05f, -6.312277940e-03f, +2.123462439e-02f, -5.431312674e-03f, -1.008390020e-01f, +2.931933586e-01f, +6.682987716e-01f, +2.170760826e-01f, -1.054702390e-01f, +8.479630137e-03f, +1.583405154e-02f, -6.079915717e-03f,\n    +8.380363123e-05f, +1.040846606e-06f, -1.316918644e-03f, +3.754090754e-03f, -2.016497777e-03f, -1.922237484e-02f, +1.589860895e-03f, +1.878782216e-02f, +3.215220538e-04f, -3.192600037e-03f, +1.374457639e-03f, -1.119511682e-04f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    /* 15,31 (12) */\n    +5.796038602e-06f, -6.311237093e-03f, +1.991770575e-02f, -1.677221920e-03f, -1.028554997e-01f, +2.739709837e-01f, +6.698886325e-01f, +2.358639047e-01f, -1.051487170e-01f, +5.287030100e-03f, +1.720850917e-02f, -6.191866886e-03f,\n    +7.064571447e-05f, +4.119172230e-05f, -1.345069402e-03f, +3.575938004e-03f, -1.429339731e-03f, -1.912617857e-02f, +5.305125844e-04f, +1.898090041e-02f, +8.638775022e-04f, -3.388314016e-03f, +1.364127173e-03f, -7.817848527e-05f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n    +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f,\n};\nconstexpr BSincTable bsinc12 = {\n    /* scaleBase */ 1.647904275e-01f, /* scaleRange */ 1.197304285e+00f,\n    /* m */ { 24u, 24u, 24u, 24u, 24u, 24u, 24u, 20u, 20u, 20u, 16u, 16u, 16u, 12u, 12u, 12u },\n    /* filterOffset */ { 0u, 3072u, 6144u, 9216u, 12288u, 15360u, 18432u, 21504u, 24064u, 26624u, 29184u, 31232u, 33280u, 35328u, 36864u, 38400u },\n    bsinc12_tab\n};\n\n} // namespace\n"
  },
  {
    "path": "project/lib/custom/openal/build/default-44100.mhr.h",
    "content": "static const unsigned char hrtf_default_44100[] = {\n  0x4d, 0x69, 0x6e, 0x50, 0x48, 0x52, 0x30, 0x32, 0x44, 0xac, 0x00, 0x00, 0x01, 0x00, 0x20, 0x01, \n  0x78, 0x05, 0x13, 0x01, 0x0c, 0x18, 0x24, 0x2d, 0x38, 0x3c, 0x48, 0x48, 0x48, 0x48, 0x48, 0x3c, \n  0x38, 0x2d, 0x24, 0x18, 0x0c, 0x01, 0x5b, 0xe6, 0x17, 0xd7, 0xad, 0x20, 0xbe, 0xd2, 0x0d, 0xd1, \n  0x55, 0x0b, 0x3a, 0x62, 0x04, 0xd1, 0x55, 0x01, 0xd6, 0x67, 0x03, 0x30, 0xcd, 0xfc, 0x5c, 0x6d, \n  0xf6, 0x6d, 0xdf, 0xfa, 0xd3, 0x44, 0x02, 0xec, 0x7a, 0xff, 0x6a, 0x95, 0xfd, 0xd7, 0xba, 0xfb, \n  0x9a, 0x17, 0xfc, 0x96, 0x5f, 0xfe, 0xe1, 0x0b, 0xff, 0x4e, 0x34, 0xff, 0xa6, 0xab, 0xff, 0x45, \n  0x7b, 0xff, 0xfd, 0x87, 0xfe, 0x0f, 0x38, 0xff, 0xb4, 0x60, 0xfe, 0xa0, 0xb3, 0xfe, 0x3e, 0x67, \n  0xfe, 0x24, 0x9a, 0xfd, 0xd9, 0x15, 0xfe, 0x78, 0xb4, 0xfe, 0x30, 0x31, 0xff, 0x19, 0x9e, 0xff, \n  0xd4, 0xf9, 0xff, 0x2c, 0x6e, 0xff, 0x60, 0x2e, 0x1b, 0x45, 0xf3, 0x21, 0x05, 0xcd, 0x0b, 0x0d, \n  0xc7, 0x0c, 0x77, 0x7e, 0x04, 0xe2, 0x17, 0x00, 0x0b, 0x4c, 0x03, 0x99, 0x01, 0xfd, 0xb6, 0x37, \n  0xf6, 0x84, 0x7a, 0xf9, 0x16, 0x16, 0x02, 0xe4, 0x55, 0x00, 0x62, 0xa9, 0xfd, 0x92, 0x6b, 0xfc, \n  0x07, 0x37, 0xfc, 0xd2, 0x6a, 0xfc, 0x71, 0x91, 0xfe, 0x3b, 0xaf, 0xff, 0x9b, 0x39, 0xff, 0x1d, \n  0x29, 0xff, 0x01, 0x24, 0xfe, 0xd6, 0xc8, 0xfe, 0x52, 0x45, 0xfe, 0xc9, 0x8a, 0xfe, 0x80, 0x71, \n  0xfe, 0xff, 0xd4, 0xfd, 0xd5, 0xfa, 0xfd, 0x52, 0x07, 0xff, 0x06, 0x9a, 0xff, 0x0a, 0xb4, 0xff, \n  0x1b, 0xfc, 0xff, 0x1e, 0x50, 0xff, 0x97, 0xce, 0x18, 0xe2, 0x9e, 0x1f, 0x93, 0x7d, 0x0b, 0xce, \n  0x23, 0x0b, 0xe2, 0x59, 0x04, 0x03, 0x57, 0x01, 0x12, 0x52, 0x03, 0x3a, 0x88, 0xfc, 0x96, 0xcc, \n  0xf6, 0x93, 0x18, 0xfb, 0xda, 0xfa, 0x01, 0x30, 0x40, 0xff, 0x2c, 0xd0, 0xfd, 0x0d, 0xa4, 0xfc, \n  0x5d, 0x15, 0xfd, 0xc9, 0x1a, 0xfe, 0xd9, 0xb9, 0xfe, 0xe5, 0xb1, 0xff, 0xd0, 0xee, 0xff, 0xc5, \n  0x54, 0xff, 0xdd, 0x69, 0xfe, 0xb4, 0x43, 0xff, 0x86, 0x6e, 0xfe, 0x45, 0xa0, 0xfe, 0xc6, 0x34, \n  0xfe, 0xfb, 0xa8, 0xfd, 0x21, 0x3e, 0xfe, 0x64, 0xc5, 0xfe, 0x85, 0x48, 0xff, 0x84, 0xb2, 0xff, \n  0x43, 0x0d, 0x00, 0xed, 0x79, 0xff, 0x9c, 0x17, 0x17, 0xe4, 0x50, 0x1d, 0x62, 0x91, 0x0a, 0x13, \n  0x3f, 0x0a, 0x89, 0xe5, 0x03, 0xb9, 0x75, 0x01, 0x14, 0x73, 0x03, 0xf8, 0xcb, 0xfc, 0x26, 0x69, \n  0xf7, 0xff, 0x3a, 0xfc, 0x7e, 0xbc, 0x02, 0x7b, 0x81, 0xff, 0x44, 0x57, 0xfe, 0x1a, 0x0a, 0xfd, \n  0xa0, 0x47, 0xfd, 0x3a, 0xe2, 0xfe, 0xf7, 0x2c, 0xff, 0x43, 0x54, 0xff, 0x3f, 0xc1, 0xff, 0x4f, \n  0x82, 0xff, 0x78, 0xb0, 0xfe, 0x5f, 0x7f, 0xff, 0x9f, 0x9e, 0xfe, 0xb9, 0xf0, 0xfe, 0xd1, 0x90, \n  0xfe, 0xba, 0xd7, 0xfd, 0x24, 0x54, 0xfe, 0x2c, 0xd7, 0xfe, 0xe9, 0x4e, 0xff, 0xf6, 0xb5, 0xff, \n  0xe7, 0x05, 0x00, 0xd7, 0x77, 0xff, 0xd1, 0xb1, 0x16, 0x77, 0xdf, 0x1c, 0xc7, 0x6a, 0x0a, 0xf9, \n  0x16, 0x0a, 0x4f, 0xed, 0x03, 0x95, 0xc3, 0x01, 0xbd, 0xe4, 0x03, 0x80, 0x48, 0xfd, 0x21, 0xdf, \n  0xf7, 0x1f, 0xa7, 0xfc, 0x55, 0x05, 0x03, 0x8e, 0x9c, 0xff, 0xa4, 0x27, 0xfe, 0xe6, 0xa7, 0xfc, \n  0x3d, 0x25, 0xfd, 0x48, 0x0f, 0xff, 0x35, 0x47, 0xff, 0xf7, 0x4a, 0xff, 0xad, 0xc0, 0xff, 0x84, \n  0x8e, 0xff, 0x9a, 0xb9, 0xfe, 0x5b, 0x90, 0xff, 0x54, 0xbf, 0xfe, 0x50, 0x23, 0xff, 0xc0, 0xd2, \n  0xfe, 0xf1, 0x04, 0xfe, 0xc4, 0x6a, 0xfe, 0xbb, 0xd6, 0xfe, 0xf8, 0x28, 0xff, 0xe7, 0x86, 0xff, \n  0x01, 0xdd, 0xff, 0xe8, 0x57, 0xff, 0xfa, 0x46, 0x17, 0x44, 0xb5, 0x1d, 0x86, 0x89, 0x0a, 0x66, \n  0xc4, 0x09, 0xd3, 0x66, 0x03, 0x3d, 0x4f, 0x01, 0x95, 0x8d, 0x03, 0xbb, 0xd0, 0xfc, 0x7f, 0x16, \n  0xf7, 0x2c, 0xe1, 0xfb, 0x21, 0x07, 0x03, 0x53, 0xef, 0xff, 0x66, 0x32, 0xfe, 0xf1, 0x7a, 0xfc, \n  0xc1, 0xef, 0xfc, 0x20, 0x10, 0xff, 0x88, 0x8f, 0xff, 0x03, 0x9a, 0xff, 0x3e, 0xf4, 0xff, 0x97, \n  0xc6, 0xff, 0xe8, 0xe2, 0xfe, 0xe2, 0x98, 0xff, 0xbf, 0xb3, 0xfe, 0x16, 0x01, 0xff, 0xad, 0xaa, \n  0xfe, 0xcd, 0xeb, 0xfd, 0x00, 0x70, 0xfe, 0x82, 0x07, 0xff, 0x4e, 0x83, 0xff, 0xe5, 0xee, 0xff, \n  0x89, 0x20, 0x00, 0x89, 0x62, 0xff, 0x3f, 0x74, 0x19, 0xb5, 0x1c, 0x20, 0x26, 0xc8, 0x0a, 0x9d, \n  0x4c, 0x0a, 0x73, 0x81, 0x03, 0xa5, 0x45, 0x01, 0x2a, 0x7e, 0x03, 0x02, 0xd2, 0xfb, 0x49, 0x82, \n  0xf5, 0xf3, 0xdb, 0xfa, 0x77, 0x56, 0x03, 0x5a, 0xcc, 0xff, 0x52, 0x55, 0xfd, 0xa1, 0x91, 0xfb, \n  0x0e, 0x53, 0xfc, 0x94, 0xc3, 0xfe, 0x1d, 0x67, 0xff, 0xab, 0x66, 0xff, 0x8b, 0xdf, 0xff, 0xc7, \n  0xc2, 0xff, 0x81, 0xa5, 0xfe, 0xcd, 0x84, 0xff, 0x9d, 0xae, 0xfe, 0x82, 0x05, 0xff, 0x15, 0xa8, \n  0xfe, 0x52, 0xe0, 0xfd, 0x5a, 0x70, 0xfe, 0xcf, 0x19, 0xff, 0x83, 0x80, 0xff, 0x4b, 0xd8, 0xff, \n  0xfe, 0x26, 0x00, 0x4e, 0x88, 0xff, 0x42, 0xe7, 0x1a, 0x79, 0xc5, 0x22, 0xf8, 0xfb, 0x0b, 0xf5, \n  0xce, 0x0a, 0x16, 0xa2, 0x03, 0xdc, 0x90, 0x00, 0x63, 0x3e, 0x03, 0xcb, 0x25, 0xfb, 0xe6, 0x0b, \n  0xf5, 0x33, 0xd7, 0xfa, 0xdb, 0x48, 0x02, 0xdb, 0x18, 0xff, 0x94, 0x93, 0xfd, 0xf9, 0xa0, 0xfb, \n  0x48, 0x27, 0xfc, 0x56, 0x62, 0xfe, 0x4f, 0x0c, 0xff, 0xa8, 0xb7, 0xff, 0xd6, 0xf6, 0xff, 0xb5, \n  0x71, 0xff, 0x0e, 0x6a, 0xfe, 0xbf, 0x49, 0xff, 0xd2, 0x71, 0xfe, 0x6c, 0xcb, 0xfe, 0x74, 0x5c, \n  0xfe, 0xe2, 0xab, 0xfd, 0x2d, 0x48, 0xfe, 0xca, 0xd2, 0xfe, 0x9e, 0x66, 0xff, 0x19, 0xc9, 0xff, \n  0x68, 0x22, 0x00, 0x67, 0x7e, 0xff, 0xa5, 0xac, 0x1c, 0xd9, 0x8e, 0x23, 0x2f, 0x9c, 0x0b, 0x50, \n  0x37, 0x0c, 0xef, 0x8e, 0x04, 0x77, 0x71, 0x00, 0xa6, 0x61, 0x02, 0xf2, 0xd9, 0xf9, 0xde, 0x6c, \n  0xf5, 0x6e, 0x48, 0xfd, 0x9b, 0xcb, 0x01, 0x37, 0x03, 0xfc, 0x02, 0x9c, 0xfc, 0x93, 0x52, 0xfc, \n  0x6b, 0xb2, 0xfd, 0x89, 0x41, 0xff, 0xc8, 0x4e, 0xfe, 0xd8, 0x1a, 0xff, 0x4d, 0x29, 0x00, 0xfa, \n  0x5e, 0xff, 0x33, 0x70, 0xfe, 0x42, 0x70, 0xff, 0xc4, 0x31, 0xfe, 0xfc, 0x9c, 0xfe, 0x9f, 0xea, \n  0xfd, 0x0e, 0x3c, 0xfd, 0x49, 0x2e, 0xfe, 0x93, 0x8a, 0xfe, 0x2b, 0xf2, 0xfe, 0x96, 0x97, 0xff, \n  0xaf, 0x03, 0x00, 0x33, 0x44, 0xff, 0x01, 0x9c, 0x20, 0xb1, 0x98, 0x26, 0x2e, 0xc2, 0x08, 0x2c, \n  0xc2, 0x09, 0xf0, 0x57, 0x02, 0x2e, 0x98, 0x00, 0x7e, 0xfa, 0x04, 0x8a, 0x3f, 0xfa, 0xbd, 0x40, \n  0xf4, 0xd9, 0x4b, 0xfe, 0xfa, 0x02, 0x05, 0x5b, 0x20, 0xfc, 0xbc, 0x91, 0xfa, 0x67, 0x97, 0xfa, \n  0x64, 0x7a, 0xfd, 0xfa, 0x12, 0x00, 0x34, 0x00, 0xfe, 0x42, 0x0a, 0xfe, 0xde, 0xef, 0xff, 0xb5, \n  0x6b, 0xff, 0x15, 0xdd, 0xfd, 0xe6, 0x6e, 0xff, 0xc8, 0x1b, 0xfe, 0x60, 0xb4, 0xfe, 0xa7, 0xe5, \n  0xfd, 0x9c, 0xb1, 0xfc, 0x57, 0x00, 0xfe, 0x9c, 0xbb, 0xfe, 0x7b, 0x06, 0xff, 0x58, 0x90, 0xff, \n  0x63, 0x0a, 0x00, 0xa6, 0x2c, 0xff, 0xe6, 0xdc, 0x21, 0x58, 0x10, 0x28, 0x95, 0x97, 0x09, 0xd7, \n  0x19, 0x09, 0x7c, 0xa5, 0x00, 0x2d, 0x83, 0x00, 0x2e, 0x7d, 0x05, 0x9d, 0x29, 0xfb, 0x5b, 0xaf, \n  0xf2, 0x6d, 0x7b, 0xfc, 0x3c, 0xd1, 0x06, 0x77, 0xf3, 0xfe, 0x54, 0xc0, 0xfa, 0xdd, 0xb4, 0xf7, \n  0x4d, 0xb1, 0xfb, 0x64, 0xce, 0x00, 0xaa, 0xa3, 0xff, 0x17, 0xc2, 0xfd, 0xf1, 0x11, 0xff, 0xb6, \n  0x3b, 0xff, 0x87, 0x9e, 0xfd, 0x4a, 0x2d, 0xff, 0x6a, 0xbc, 0xfd, 0x8d, 0xb7, 0xfe, 0xfb, 0x13, \n  0xfe, 0xa0, 0xe7, 0xfc, 0x8c, 0xe3, 0xfd, 0x25, 0xdc, 0xfe, 0x73, 0x35, 0xff, 0xc4, 0x87, 0xff, \n  0x71, 0xe5, 0xff, 0xf2, 0xf5, 0xfe, 0x4c, 0x45, 0x20, 0x02, 0x54, 0x27, 0x7d, 0xc5, 0x0c, 0xad, \n  0xd3, 0x0a, 0xa6, 0x5d, 0x01, 0xce, 0x3d, 0x00, 0x6a, 0xe6, 0x03, 0x7a, 0x92, 0xfb, 0xad, 0xae, \n  0xf1, 0x44, 0xab, 0xf9, 0xb1, 0x3a, 0x05, 0x15, 0x7f, 0x00, 0xdb, 0xdb, 0xfe, 0xe3, 0x4e, 0xf8, \n  0xcf, 0x91, 0xf8, 0x9e, 0xc7, 0xff, 0x9e, 0x91, 0x00, 0x81, 0x33, 0xff, 0x85, 0x50, 0xff, 0xa6, \n  0x08, 0xff, 0x37, 0x13, 0xfe, 0x3e, 0x31, 0xff, 0x73, 0xb1, 0xfd, 0x31, 0xe2, 0xfe, 0x9c, 0x10, \n  0xfe, 0x4d, 0x7a, 0xfc, 0x58, 0xbc, 0xfd, 0xa6, 0x67, 0xfe, 0x19, 0x3b, 0xff, 0xb7, 0xcc, 0xff, \n  0x8a, 0x26, 0x00, 0x9d, 0x68, 0xff, 0x8d, 0x46, 0x1e, 0xda, 0xa9, 0x25, 0xff, 0x14, 0x0c, 0xbb, \n  0xe5, 0x0b, 0xb1, 0x6a, 0x03, 0x3c, 0x0f, 0x00, 0x74, 0xd4, 0x02, 0x19, 0x7d, 0xfb, 0xac, 0xba, \n  0xf4, 0x24, 0xe1, 0xf8, 0xeb, 0xc9, 0x03, 0xf8, 0x51, 0x00, 0xf3, 0x31, 0xfd, 0xd5, 0xf8, 0xfb, \n  0x25, 0x1f, 0xf9, 0xfd, 0xde, 0xfb, 0x19, 0xd9, 0xff, 0xf2, 0xf6, 0xff, 0x60, 0xe5, 0xff, 0x12, \n  0xe2, 0xff, 0xf8, 0x83, 0xfe, 0xb9, 0xbb, 0xfe, 0x05, 0x7a, 0xfd, 0xd4, 0x1f, 0xfe, 0x88, 0xa7, \n  0xfe, 0x77, 0x75, 0xfd, 0x7f, 0x9e, 0xfd, 0x7a, 0xab, 0xfe, 0x3f, 0x3c, 0xff, 0x4c, 0xcf, 0xff, \n  0x8b, 0x17, 0x00, 0xcb, 0x5f, 0xff, 0xcc, 0xc0, 0x1e, 0x50, 0xc7, 0x22, 0x81, 0x7e, 0x09, 0xf4, \n  0x02, 0x0f, 0x32, 0x61, 0x04, 0x35, 0x68, 0xfe, 0x08, 0x63, 0x03, 0x2f, 0x88, 0xfd, 0xc1, 0xf9, \n  0xf5, 0x9a, 0x7d, 0xf7, 0xe7, 0x16, 0x02, 0xe8, 0xb6, 0x01, 0xeb, 0x8c, 0xfd, 0x5f, 0x4d, 0xfd, \n  0x6e, 0x22, 0xfc, 0xc3, 0xc5, 0xf9, 0x39, 0x84, 0xfe, 0x93, 0x7a, 0x00, 0x36, 0x82, 0xfe, 0x9a, \n  0xe0, 0xfe, 0x8e, 0xc1, 0xfd, 0x44, 0x4d, 0xfe, 0x05, 0x4b, 0xfe, 0xbf, 0x59, 0xfe, 0xcf, 0x8d, \n  0xfe, 0xcf, 0x23, 0xfe, 0x32, 0xc0, 0xfd, 0x92, 0x76, 0xff, 0xe2, 0x09, 0x00, 0xc7, 0xb0, 0xff, \n  0xbb, 0xf6, 0xff, 0xce, 0x2d, 0xff, 0x0b, 0x61, 0x1b, 0x60, 0x70, 0x20, 0x12, 0x8b, 0x0a, 0xfd, \n  0xae, 0x0d, 0x32, 0x12, 0x04, 0x4f, 0x81, 0xff, 0x92, 0x44, 0x03, 0xa7, 0x97, 0xfc, 0x8e, 0x22, \n  0xf7, 0x6d, 0xbf, 0xf9, 0x38, 0xe2, 0x00, 0x18, 0xcf, 0xff, 0x5f, 0x00, 0xfe, 0xbb, 0xbb, 0xfd, \n  0x0a, 0xc1, 0xfd, 0x4f, 0x25, 0xfc, 0x55, 0x5b, 0xfd, 0xf6, 0x1d, 0x00, 0x17, 0x2a, 0x00, 0xb3, \n  0x14, 0xff, 0x4c, 0xe7, 0xfd, 0xf0, 0xe7, 0xfe, 0x19, 0x8a, 0xfe, 0xb7, 0xa2, 0xfe, 0xe6, 0x4e, \n  0xfe, 0x3e, 0xf5, 0xfd, 0x5e, 0x66, 0xfe, 0x1b, 0x00, 0xff, 0x3a, 0x4a, 0xff, 0x06, 0x7a, 0xff, \n  0xcb, 0x10, 0x00, 0xa6, 0x7a, 0xff, 0xb8, 0x4c, 0x19, 0xce, 0x19, 0x1e, 0x27, 0x79, 0x09, 0x7c, \n  0x5e, 0x0b, 0x41, 0x85, 0x04, 0x23, 0x55, 0x01, 0xf3, 0x16, 0x03, 0x7d, 0x6b, 0xfc, 0xfc, 0x71, \n  0xf7, 0x0f, 0x0c, 0xfb, 0xff, 0x60, 0x01, 0x44, 0x3b, 0xff, 0x08, 0x35, 0xfe, 0xc8, 0xc7, 0xfd, \n  0xb0, 0x10, 0xfe, 0x26, 0x66, 0xfd, 0x95, 0x63, 0xfe, 0x85, 0x6f, 0x00, 0x0b, 0x21, 0x00, 0x75, \n  0x11, 0xff, 0x43, 0x53, 0xfe, 0x0d, 0x53, 0xff, 0xe3, 0x85, 0xfe, 0xc9, 0x7d, 0xfe, 0xa9, 0xfb, \n  0xfd, 0xa5, 0xcf, 0xfd, 0x0e, 0x68, 0xfe, 0xa4, 0xcc, 0xfe, 0x7b, 0x60, 0xff, 0x40, 0xc5, 0xff, \n  0xac, 0x1f, 0x00, 0x04, 0x89, 0xff, 0x74, 0x62, 0x17, 0x56, 0xca, 0x1b, 0xe8, 0x79, 0x08, 0x76, \n  0x82, 0x0a, 0xaa, 0x71, 0x04, 0x4c, 0x5b, 0x01, 0x80, 0xfc, 0x02, 0xe2, 0x97, 0xfc, 0x50, 0x0d, \n  0xf8, 0x61, 0x40, 0xfc, 0x7d, 0xa5, 0x01, 0xe3, 0xd9, 0xfe, 0xa0, 0xc0, 0xfe, 0xce, 0x49, 0xfe, \n  0x0b, 0x2c, 0xfe, 0xeb, 0x5e, 0xfe, 0x8a, 0xe8, 0xfe, 0xe2, 0xd7, 0xff, 0x1d, 0xe4, 0xff, 0xa5, \n  0x3f, 0xff, 0xc7, 0x84, 0xfe, 0x1f, 0x65, 0xff, 0xf9, 0xa6, 0xfe, 0xaa, 0xec, 0xfe, 0x08, 0x80, \n  0xfe, 0xf3, 0x0d, 0xfe, 0xe9, 0x46, 0xfe, 0x3f, 0xa9, 0xfe, 0x45, 0x63, 0xff, 0x47, 0xcc, 0xff, \n  0x6d, 0x15, 0x00, 0x35, 0x79, 0xff, 0x63, 0x5c, 0x15, 0x1a, 0x4b, 0x19, 0xba, 0x07, 0x08, 0xf4, \n  0x9b, 0x09, 0x1f, 0xbe, 0x03, 0xb5, 0xbf, 0x01, 0xa2, 0x5b, 0x03, 0x5a, 0xfd, 0xfc, 0xef, 0xc5, \n  0xf8, 0xdc, 0x79, 0xfd, 0x55, 0xc9, 0x02, 0x78, 0x96, 0xff, 0x34, 0x56, 0xff, 0xfc, 0x8a, 0xfe, \n  0x68, 0x65, 0xfe, 0xa6, 0x20, 0xff, 0xc3, 0x32, 0xff, 0x2a, 0x75, 0xff, 0x60, 0xd1, 0xff, 0x2f, \n  0x88, 0xff, 0x28, 0xe9, 0xfe, 0x7d, 0xc7, 0xff, 0x80, 0xe2, 0xfe, 0x21, 0x28, 0xff, 0x9c, 0xb7, \n  0xfe, 0xd8, 0x1f, 0xfe, 0x20, 0x8c, 0xfe, 0x9e, 0xee, 0xfe, 0xd3, 0x69, 0xff, 0x1c, 0xcb, 0xff, \n  0xb3, 0x0d, 0x00, 0x43, 0x86, 0xff, 0xde, 0x80, 0x14, 0x4a, 0xd2, 0x17, 0xe5, 0xe4, 0x06, 0x6e, \n  0x89, 0x08, 0xa6, 0x4d, 0x03, 0x9d, 0xfa, 0x01, 0x70, 0x1d, 0x04, 0x05, 0x52, 0xfe, 0x84, 0x3e, \n  0xfa, 0xb1, 0xd2, 0xfe, 0xbe, 0xc5, 0x03, 0x16, 0x1e, 0x00, 0x25, 0x41, 0xff, 0xa2, 0x0f, 0xfe, \n  0x9c, 0x22, 0xfe, 0xd7, 0x5c, 0xff, 0xa8, 0x81, 0xff, 0xbb, 0x93, 0xff, 0x7d, 0xe8, 0xff, 0xb0, \n  0xa2, 0xff, 0xbe, 0xe3, 0xfe, 0xb1, 0xb8, 0xff, 0x25, 0x09, 0xff, 0xcb, 0x6f, 0xff, 0xc4, 0xf4, \n  0xfe, 0x0c, 0x4e, 0xfe, 0xf1, 0xd0, 0xfe, 0xe2, 0x3c, 0xff, 0x07, 0x92, 0xff, 0xa3, 0xbd, 0xff, \n  0x78, 0xcb, 0xff, 0xd5, 0x28, 0xff, 0x90, 0x72, 0x14, 0x71, 0x63, 0x18, 0x91, 0xd0, 0x07, 0x4f, \n  0x4c, 0x09, 0xe5, 0xdb, 0x03, 0xe1, 0x70, 0x02, 0x8a, 0x4a, 0x04, 0x21, 0xfa, 0xfd, 0x1a, 0xb0, \n  0xf9, 0x19, 0x4f, 0xfe, 0x68, 0x50, 0x03, 0x8c, 0xbe, 0xff, 0x29, 0xe0, 0xfe, 0x8e, 0xb6, 0xfd, \n  0xe3, 0x32, 0xfe, 0x32, 0x93, 0xff, 0xbb, 0x62, 0xff, 0xc9, 0x57, 0xff, 0x57, 0xd2, 0xff, 0x82, \n  0xa4, 0xff, 0xb1, 0xfa, 0xfe, 0xc2, 0xeb, 0xff, 0xb2, 0x28, 0xff, 0xd7, 0x92, 0xff, 0x48, 0x40, \n  0xff, 0x53, 0x74, 0xfe, 0x65, 0xb2, 0xfe, 0x93, 0xe6, 0xfe, 0x7e, 0x12, 0xff, 0xc9, 0x69, 0xff, \n  0x99, 0xbd, 0xff, 0x23, 0x49, 0xff, 0x54, 0xcc, 0x14, 0x4b, 0xa6, 0x18, 0x5a, 0x70, 0x07, 0xde, \n  0xad, 0x08, 0x2c, 0x68, 0x03, 0xb1, 0x46, 0x02, 0xef, 0x59, 0x04, 0x7d, 0xff, 0xfd, 0xd8, 0x58, \n  0xf9, 0x9f, 0x03, 0xfe, 0x03, 0x77, 0x03, 0xbf, 0xc9, 0xff, 0xed, 0x94, 0xfe, 0xa6, 0x4b, 0xfd, \n  0x9e, 0xdc, 0xfd, 0xe6, 0xd4, 0xff, 0xbf, 0x2a, 0x00, 0xbe, 0xfb, 0xff, 0x60, 0x18, 0x00, 0x6b, \n  0xa9, 0xff, 0x50, 0xdc, 0xfe, 0xea, 0xa6, 0xff, 0x1d, 0xd2, 0xfe, 0xa5, 0x41, 0xff, 0x56, 0x10, \n  0xff, 0xcd, 0xab, 0xfe, 0xd3, 0x35, 0xff, 0xe8, 0x53, 0xff, 0x93, 0x46, 0xff, 0x40, 0x5c, 0xff, \n  0x52, 0x8e, 0xff, 0xb7, 0x22, 0xff, 0x2e, 0xc9, 0x15, 0x3c, 0x24, 0x1a, 0x96, 0xd8, 0x07, 0x12, \n  0x83, 0x08, 0xf0, 0xbd, 0x02, 0xde, 0x8c, 0x01, 0x21, 0xa5, 0x03, 0x4a, 0x01, 0xfd, 0x69, 0x06, \n  0xf8, 0xe6, 0xc2, 0xfc, 0x55, 0x8f, 0x03, 0xd0, 0x7e, 0x00, 0x6b, 0xe1, 0xfe, 0x22, 0x4b, 0xfd, \n  0xa2, 0xc4, 0xfd, 0xe0, 0xa4, 0xff, 0x55, 0x09, 0x00, 0xd7, 0xf8, 0xff, 0x6c, 0x31, 0x00, 0xa1, \n  0x15, 0x00, 0xf5, 0x48, 0xff, 0xe3, 0xf2, 0xff, 0x1c, 0x0b, 0xff, 0x62, 0x47, 0xff, 0x16, 0xee, \n  0xfe, 0x64, 0x46, 0xfe, 0x15, 0xc6, 0xfe, 0x77, 0x55, 0xff, 0x19, 0xd4, 0xff, 0x65, 0x3e, 0x00, \n  0x06, 0x3a, 0x00, 0x01, 0x4d, 0xff, 0xc8, 0x9c, 0x17, 0x89, 0x3a, 0x1c, 0x4b, 0x42, 0x08, 0xea, \n  0x1b, 0x09, 0x2a, 0xd8, 0x02, 0xb3, 0x89, 0x01, 0x86, 0x90, 0x03, 0x39, 0x12, 0xfc, 0x90, 0x45, \n  0xf6, 0x41, 0x4a, 0xfb, 0x1c, 0xae, 0x03, 0x54, 0x62, 0x00, 0x41, 0xea, 0xfd, 0x29, 0x5f, 0xfc, \n  0x23, 0x31, 0xfd, 0xa8, 0x8e, 0xff, 0x88, 0x45, 0x00, 0xab, 0x0f, 0x00, 0x2b, 0x6c, 0x00, 0x42, \n  0x61, 0x00, 0xcb, 0x32, 0xff, 0x71, 0xe0, 0xff, 0x31, 0xfa, 0xfe, 0x0d, 0x4f, 0xff, 0x59, 0x1a, \n  0xff, 0x41, 0x72, 0xfe, 0xd8, 0x01, 0xff, 0x61, 0x97, 0xff, 0x86, 0xb7, 0xff, 0x9a, 0xe9, 0xff, \n  0xc7, 0x12, 0x00, 0x7b, 0x8f, 0xff, 0x3a, 0xc9, 0x1a, 0xd7, 0x0b, 0x1f, 0x90, 0xb2, 0x07, 0xf5, \n  0xa1, 0x09, 0x80, 0xd3, 0x02, 0x81, 0x6d, 0x01, 0x11, 0x84, 0x03, 0xb4, 0xbc, 0xfa, 0x63, 0xae, \n  0xf4, 0xe0, 0xe0, 0xfa, 0x0a, 0x95, 0x04, 0x80, 0x1b, 0x00, 0x86, 0xee, 0xfc, 0x59, 0x72, 0xfb, \n  0xc9, 0xa1, 0xfc, 0xa0, 0x24, 0xff, 0x52, 0xc4, 0xff, 0x67, 0x8f, 0xff, 0xfd, 0x10, 0x00, 0x6c, \n  0x13, 0x00, 0x4a, 0xbd, 0xfe, 0x38, 0xd6, 0xff, 0xd5, 0x05, 0xff, 0x47, 0x53, 0xff, 0xf4, 0xe6, \n  0xfe, 0xb5, 0x2c, 0xfe, 0x2f, 0xca, 0xfe, 0x8e, 0x7f, 0xff, 0x7f, 0xc8, 0xff, 0x04, 0x0b, 0x00, \n  0x4c, 0x4f, 0x00, 0x3c, 0xa2, 0xff, 0x51, 0x5d, 0x1d, 0x5e, 0x61, 0x22, 0x39, 0xc5, 0x07, 0x96, \n  0xaf, 0x09, 0x6d, 0xcc, 0x02, 0x4a, 0x06, 0x01, 0x85, 0x88, 0x03, 0x53, 0x64, 0xf9, 0x84, 0x84, \n  0xf3, 0xc3, 0xcf, 0xfa, 0xde, 0x82, 0x04, 0x7e, 0xe9, 0xff, 0x7f, 0xd7, 0xfc, 0x43, 0xcb, 0xfa, \n  0x6d, 0x2f, 0xfc, 0xfb, 0xe7, 0xfe, 0x15, 0x8f, 0xff, 0xc0, 0xc2, 0xff, 0xc0, 0xdd, 0xff, 0x0b, \n  0xd6, 0xff, 0xc5, 0x8a, 0xfe, 0xf9, 0x7d, 0xff, 0xf5, 0x77, 0xfe, 0xf3, 0xec, 0xfe, 0x08, 0x81, \n  0xfe, 0x95, 0xe1, 0xfd, 0x2d, 0xb1, 0xfe, 0xbd, 0x6b, 0xff, 0x4b, 0xda, 0xff, 0x80, 0x03, 0x00, \n  0xef, 0x5d, 0x00, 0x62, 0x97, 0xff, 0x6f, 0x1d, 0x1e, 0x50, 0xbe, 0x24, 0xa6, 0xaf, 0x09, 0x01, \n  0x6d, 0x0a, 0x49, 0xf5, 0x02, 0x3b, 0xc3, 0xff, 0x65, 0x24, 0x03, 0x9a, 0x45, 0xf9, 0x30, 0xd0, \n  0xf3, 0xce, 0xf9, 0xfa, 0xb2, 0x2c, 0x02, 0xc4, 0xcb, 0xfe, 0xfb, 0xb3, 0xfd, 0x5d, 0x86, 0xfb, \n  0x18, 0x38, 0xfc, 0x74, 0x51, 0xfe, 0xe4, 0x0f, 0xff, 0x7a, 0x64, 0x00, 0xba, 0x30, 0x00, 0x8d, \n  0x51, 0xff, 0x67, 0x4b, 0xfe, 0x7f, 0x60, 0xff, 0xbf, 0x8b, 0xfe, 0xe4, 0xdf, 0xfe, 0x85, 0x4a, \n  0xfe, 0x7c, 0xca, 0xfd, 0xc8, 0x7d, 0xfe, 0x89, 0xe8, 0xfe, 0xb3, 0xa1, 0xff, 0x66, 0xf0, 0xff, \n  0x6e, 0x49, 0x00, 0xfd, 0x8c, 0xff, 0x77, 0x1a, 0x1f, 0x45, 0x8a, 0x25, 0xbf, 0x96, 0x0a, 0x74, \n  0x62, 0x0c, 0x34, 0x49, 0x04, 0x8f, 0x38, 0xff, 0xa7, 0x88, 0x01, 0x77, 0x06, 0xf8, 0xf3, 0x55, \n  0xf4, 0xd0, 0x10, 0xfd, 0x34, 0x7b, 0x00, 0x19, 0xd3, 0xfb, 0x38, 0xbe, 0xfd, 0x13, 0xf0, 0xfc, \n  0xb8, 0xe0, 0xfd, 0x70, 0x63, 0xfe, 0x9c, 0xa7, 0xfd, 0xea, 0xd9, 0xff, 0x74, 0x92, 0x00, 0x4b, \n  0x6c, 0xff, 0x53, 0xae, 0xfe, 0x7e, 0x92, 0xff, 0xce, 0x60, 0xfe, 0xf7, 0xb9, 0xfe, 0x63, 0xd8, \n  0xfd, 0xbb, 0x6c, 0xfd, 0x8c, 0x56, 0xfe, 0x99, 0x67, 0xfe, 0x5a, 0x1d, 0xff, 0x3c, 0xc6, 0xff, \n  0xeb, 0x39, 0x00, 0xed, 0x75, 0xff, 0xda, 0x2e, 0x22, 0x49, 0x0c, 0x26, 0x91, 0x94, 0x08, 0x23, \n  0xc1, 0x0d, 0x54, 0xb0, 0x04, 0x3c, 0x33, 0xff, 0x0f, 0x2f, 0x01, 0x4f, 0x8a, 0xf6, 0xf7, 0x0f, \n  0xf5, 0xdf, 0x7e, 0x00, 0x74, 0x5a, 0x00, 0x3e, 0xd1, 0xf7, 0xc3, 0x5c, 0xfc, 0xf5, 0x6e, 0xfd, \n  0xd3, 0x94, 0xff, 0xc3, 0xdf, 0xff, 0xff, 0x17, 0xfd, 0x01, 0x2f, 0xff, 0x92, 0xd3, 0x00, 0x56, \n  0x1a, 0xff, 0x30, 0x5e, 0xfe, 0x71, 0xb7, 0xff, 0x9b, 0xed, 0xfd, 0xe1, 0x86, 0xfe, 0x0c, 0x53, \n  0xfd, 0x87, 0xea, 0xfc, 0x89, 0x63, 0xfe, 0x7d, 0x4b, 0xfe, 0x0e, 0xab, 0xfe, 0xa8, 0xa0, 0xff, \n  0x73, 0x12, 0x00, 0xb0, 0x10, 0xff, 0xd6, 0x9f, 0x26, 0x90, 0xfa, 0x29, 0x1f, 0x85, 0x04, 0x47, \n  0x90, 0x0a, 0xa4, 0x32, 0x03, 0x93, 0x5f, 0xff, 0xc0, 0x8f, 0x04, 0x2d, 0xbe, 0xf6, 0xb8, 0x52, \n  0xf3, 0x8b, 0x38, 0x02, 0x4e, 0x8a, 0x03, 0xbf, 0xe0, 0xf6, 0x8b, 0xe3, 0xf9, 0xc1, 0x90, 0xfc, \n  0xbc, 0x06, 0x00, 0x0f, 0x1a, 0x01, 0x91, 0xc9, 0xfc, 0xe8, 0x18, 0xfe, 0xf6, 0xe6, 0x00, 0x82, \n  0x4f, 0xff, 0xc5, 0xc6, 0xfd, 0xfc, 0xb6, 0xff, 0x27, 0xc8, 0xfd, 0xdb, 0x73, 0xfe, 0xa3, 0x23, \n  0xfd, 0x6f, 0x3d, 0xfc, 0xf6, 0x62, 0xfe, 0xd2, 0x81, 0xfe, 0xfd, 0x76, 0xfe, 0xc8, 0x5d, 0xff, \n  0x69, 0x48, 0x00, 0x80, 0x3a, 0xff, 0xc0, 0x38, 0x2b, 0x43, 0xe9, 0x2b, 0xe8, 0x1d, 0x01, 0x91, \n  0xe0, 0x08, 0xd1, 0x55, 0x00, 0x7c, 0x35, 0x00, 0xcc, 0x22, 0x07, 0xba, 0xb6, 0xf6, 0xfd, 0x38, \n  0xf2, 0x5e, 0x26, 0x03, 0x1c, 0x78, 0x07, 0x52, 0x27, 0xf7, 0xef, 0x99, 0xf7, 0x8c, 0x08, 0xfa, \n  0xb5, 0x98, 0xff, 0xb9, 0xd6, 0x01, 0xee, 0x28, 0xfc, 0x67, 0xd0, 0xfc, 0xee, 0x9d, 0x00, 0x7b, \n  0x4b, 0xff, 0x7d, 0x09, 0xfd, 0xe1, 0xdd, 0xff, 0x69, 0xbd, 0xfd, 0xe5, 0xc2, 0xfe, 0x4a, 0x41, \n  0xfd, 0xa1, 0xad, 0xfb, 0x52, 0x21, 0xfe, 0xfb, 0xca, 0xfe, 0x75, 0xcc, 0xfe, 0x9e, 0x89, 0xff, \n  0x9e, 0x23, 0x00, 0xcb, 0xd8, 0xfe, 0x1f, 0x9b, 0x2d, 0x7b, 0xc6, 0x2d, 0xb7, 0xd8, 0x00, 0xe7, \n  0x38, 0x07, 0x1f, 0xdf, 0xfd, 0x36, 0xee, 0x00, 0x97, 0xb8, 0x08, 0x54, 0xcd, 0xf7, 0xe2, 0x1f, \n  0xf0, 0x86, 0xc2, 0x01, 0x86, 0xdd, 0x0a, 0x71, 0x98, 0xf9, 0x0c, 0xb0, 0xf6, 0xcb, 0x43, 0xf6, \n  0xa5, 0xed, 0xfd, 0x6e, 0x75, 0x03, 0x84, 0x47, 0xfd, 0x55, 0xf1, 0xfb, 0xaf, 0xb5, 0xff, 0x8f, \n  0xf4, 0xfe, 0xea, 0xfc, 0xfc, 0x65, 0xe2, 0xff, 0x26, 0x27, 0xfd, 0x34, 0xad, 0xfe, 0xd2, 0x7c, \n  0xfd, 0x7b, 0xd1, 0xfb, 0x65, 0x49, 0xfe, 0x84, 0x33, 0xff, 0x09, 0xf9, 0xfe, 0x28, 0xa8, 0xff, \n  0xd8, 0xf4, 0xff, 0x1d, 0x86, 0xfe, 0xd9, 0x19, 0x2e, 0x1a, 0xed, 0x2e, 0x53, 0x99, 0x02, 0x5d, \n  0x1c, 0x07, 0xbb, 0x9c, 0xfc, 0xa0, 0x82, 0x00, 0xb7, 0x5a, 0x08, 0xb5, 0xab, 0xf8, 0xe4, 0x5a, \n  0xee, 0x53, 0x6a, 0xff, 0xd6, 0x26, 0x0c, 0x68, 0x27, 0xfd, 0xe7, 0x31, 0xf7, 0x42, 0x51, 0xf3, \n  0x75, 0x4f, 0xfc, 0x91, 0x10, 0x04, 0x7a, 0xbd, 0xff, 0x4e, 0xb1, 0xfb, 0x0d, 0xaf, 0xfe, 0x03, \n  0x1d, 0xff, 0x5e, 0x8a, 0xfc, 0x9c, 0x59, 0xff, 0xcd, 0xf5, 0xfc, 0x1f, 0xe6, 0xfe, 0x0e, 0xac, \n  0xfd, 0x8b, 0x1c, 0xfc, 0x40, 0xcf, 0xfd, 0x26, 0x1d, 0xff, 0x78, 0x2f, 0xff, 0x2d, 0x68, 0xff, \n  0x90, 0xd0, 0xff, 0xb7, 0x65, 0xfe, 0x61, 0xb2, 0x2c, 0x1f, 0x1d, 0x2f, 0x50, 0x68, 0x06, 0x80, \n  0xe2, 0x08, 0x16, 0x4a, 0xfc, 0xbf, 0xd4, 0xff, 0x84, 0x15, 0x07, 0x34, 0xd6, 0xf8, 0x4a, 0xe8, \n  0xec, 0xaf, 0x63, 0xfc, 0x2f, 0x44, 0x0b, 0xb8, 0x79, 0x00, 0x32, 0x82, 0xfb, 0xeb, 0xc1, 0xf1, \n  0x46, 0x4a, 0xf9, 0x46, 0x1b, 0x04, 0x62, 0xba, 0x01, 0xa9, 0x12, 0xfd, 0xc3, 0xa4, 0xfd, 0x0f, \n  0xfb, 0xfe, 0x04, 0xf6, 0xfc, 0xc8, 0x2f, 0xff, 0x64, 0x45, 0xfd, 0xb2, 0x64, 0xff, 0xde, 0xa0, \n  0xfd, 0x81, 0xc9, 0xfb, 0x5d, 0x8b, 0xfd, 0xa4, 0x70, 0xfe, 0x48, 0x3e, 0xff, 0xc1, 0x35, 0xff, \n  0xaa, 0xf7, 0xff, 0x37, 0xfa, 0xfe, 0x97, 0x71, 0x2a, 0x1c, 0xb0, 0x2d, 0xa3, 0x21, 0x0a, 0xfc, \n  0x2e, 0x0a, 0xc9, 0xbb, 0xfd, 0x07, 0xa9, 0xff, 0x89, 0xc5, 0x04, 0xd6, 0x10, 0xfa, 0xed, 0xf4, \n  0xeb, 0xa7, 0x3b, 0xf9, 0x99, 0x50, 0x09, 0xf9, 0x30, 0x01, 0x91, 0x36, 0x00, 0xb2, 0x83, 0xf3, \n  0x6a, 0xe9, 0xf4, 0x73, 0x95, 0x02, 0x19, 0x35, 0x02, 0x08, 0xc2, 0xfe, 0xee, 0xd2, 0xfe, 0x0c, \n  0x91, 0xfe, 0xf5, 0xa3, 0xfd, 0x45, 0x42, 0xff, 0xf9, 0xd9, 0xfc, 0x18, 0x4b, 0xff, 0x5f, 0x98, \n  0xfd, 0xd4, 0x21, 0xfb, 0x3d, 0x94, 0xfd, 0x1f, 0x1e, 0xfe, 0x09, 0x5e, 0xff, 0x7d, 0x06, 0x00, \n  0x7a, 0x52, 0x00, 0xbc, 0x59, 0xff, 0xc7, 0xcf, 0x27, 0xf2, 0xe4, 0x2b, 0xc9, 0xc9, 0x0a, 0x51, \n  0x93, 0x0c, 0xad, 0x80, 0xff, 0x3b, 0xc1, 0xfe, 0x45, 0x70, 0x04, 0x7e, 0x30, 0xfa, 0xa8, 0x73, \n  0xed, 0x9c, 0xac, 0xf6, 0x5c, 0x49, 0x08, 0xf2, 0xcb, 0x00, 0x67, 0x50, 0x00, 0xd0, 0x47, 0xf8, \n  0x8c, 0xc8, 0xf1, 0xe8, 0xb3, 0xfe, 0xbd, 0xf9, 0x02, 0xcf, 0x31, 0x00, 0x2c, 0xe7, 0xff, 0x08, \n  0xae, 0xfe, 0x5c, 0xda, 0xfd, 0xab, 0xba, 0xff, 0x38, 0x92, 0xfc, 0xa9, 0x7b, 0xfd, 0x14, 0x47, \n  0xfe, 0x80, 0x99, 0xfb, 0xb4, 0x7c, 0xfd, 0x1c, 0xb8, 0xfe, 0x1b, 0x56, 0xff, 0xde, 0x4c, 0x00, \n  0x41, 0x44, 0x00, 0x7e, 0x50, 0xff, 0x69, 0xdc, 0x25, 0x1b, 0x6e, 0x2a, 0xcf, 0x0b, 0x09, 0x49, \n  0xdc, 0x0c, 0x7c, 0x26, 0x02, 0x8d, 0xa5, 0xfe, 0x7b, 0x56, 0x02, 0xea, 0x2d, 0xfa, 0x44, 0xfe, \n  0xf2, 0x80, 0x8e, 0xf6, 0x9f, 0x30, 0x06, 0x63, 0x34, 0x01, 0xfd, 0x75, 0xfc, 0xa1, 0x67, 0xfc, \n  0xa1, 0x29, 0xf5, 0xb6, 0x66, 0xf9, 0xef, 0xa6, 0x01, 0x70, 0xc4, 0x00, 0x20, 0xf4, 0xff, 0xb1, \n  0x57, 0x00, 0x43, 0x67, 0xfe, 0x73, 0x11, 0xfe, 0x73, 0x7a, 0xfc, 0xe1, 0x9d, 0xfd, 0xef, 0x2a, \n  0xff, 0x83, 0x3a, 0xfd, 0x80, 0x06, 0xfd, 0x09, 0xbf, 0xfe, 0xc2, 0x4d, 0xff, 0x38, 0x0b, 0x00, \n  0x47, 0x2f, 0x00, 0xb0, 0x49, 0xff, 0x5b, 0xf9, 0x22, 0x8d, 0xc4, 0x26, 0x1c, 0xb3, 0x08, 0x23, \n  0x11, 0x0e, 0xb4, 0x9e, 0x03, 0x8f, 0x89, 0xfe, 0x2d, 0x53, 0x02, 0x95, 0x56, 0xfb, 0x34, 0xa4, \n  0xf4, 0xa4, 0xef, 0xf6, 0xf9, 0xec, 0x04, 0x4a, 0x9a, 0x02, 0x2d, 0xb5, 0xfb, 0x51, 0xcc, 0xfc, \n  0xb0, 0xd3, 0xf9, 0xf9, 0x1f, 0xf8, 0xbd, 0x55, 0xff, 0xdd, 0xba, 0x00, 0x3a, 0xba, 0xfe, 0xa5, \n  0x9d, 0xff, 0xa4, 0xa8, 0xfe, 0x3a, 0xb1, 0xfe, 0x15, 0x85, 0xfd, 0x5d, 0xc2, 0xfd, 0x27, 0xef, \n  0xfe, 0xe7, 0x16, 0xfe, 0x2b, 0xfc, 0xfc, 0xb8, 0xdf, 0xfe, 0xcf, 0x96, 0xff, 0x5c, 0xc4, 0xff, \n  0xd1, 0x61, 0x00, 0x99, 0x38, 0xff, 0x32, 0xa0, 0x22, 0xb5, 0x12, 0x23, 0x27, 0xff, 0x06, 0xd1, \n  0x2c, 0x12, 0x58, 0xd3, 0x03, 0x0e, 0x40, 0xfc, 0x93, 0xd1, 0x03, 0xf1, 0x66, 0xfe, 0x17, 0x9a, \n  0xf5, 0x69, 0xcd, 0xf4, 0x75, 0x78, 0x02, 0x87, 0xad, 0x03, 0x00, 0x12, 0xfd, 0xdc, 0x73, 0xfe, \n  0x3c, 0xc4, 0xfb, 0x24, 0x61, 0xf6, 0xa0, 0x24, 0xff, 0xc3, 0x87, 0x01, 0xd1, 0x64, 0xfd, 0x1c, \n  0xb5, 0xfe, 0xce, 0x5e, 0xfd, 0xf8, 0xc1, 0xfd, 0x68, 0x7b, 0xfe, 0xdc, 0x15, 0xfe, 0x9f, 0xc1, \n  0xfe, 0x3f, 0x85, 0xfe, 0xf4, 0x5a, 0xfd, 0x31, 0x0f, 0x00, 0xe4, 0x7a, 0x00, 0x56, 0x8e, 0xff, \n  0xe9, 0xee, 0xff, 0xf0, 0x08, 0xff, 0x4a, 0x4d, 0x1e, 0x24, 0x24, 0x21, 0x67, 0x86, 0x09, 0xa1, \n  0xcb, 0x10, 0x14, 0x47, 0x03, 0x2c, 0xbb, 0xfc, 0x61, 0x60, 0x03, 0x2e, 0x10, 0xfd, 0x01, 0x5b, \n  0xf7, 0xb9, 0xc5, 0xf7, 0x10, 0xf5, 0xff, 0xd8, 0x40, 0x01, 0xbd, 0x2e, 0xfe, 0x7f, 0x50, 0xff, \n  0xf9, 0xf6, 0xfd, 0x5a, 0xd3, 0xf8, 0x5e, 0x97, 0xfc, 0xa3, 0xfe, 0x00, 0x27, 0x18, 0x00, 0x85, \n  0x05, 0xff, 0x06, 0x5b, 0xfd, 0x1b, 0x58, 0xfe, 0x51, 0xb9, 0xfe, 0x5a, 0xab, 0xfe, 0xa7, 0xb6, \n  0xfe, 0x8d, 0x62, 0xfe, 0x5b, 0x15, 0xfe, 0x9e, 0x3c, 0xff, 0xaa, 0xb6, 0xff, 0xb4, 0x5d, 0xff, \n  0x5f, 0xfe, 0xff, 0x3b, 0x68, 0xff, 0xd2, 0x96, 0x1b, 0x65, 0x59, 0x1e, 0x32, 0x00, 0x09, 0x80, \n  0x48, 0x0e, 0xae, 0xd2, 0x03, 0x3d, 0xcc, 0xff, 0x28, 0x2e, 0x03, 0x74, 0x9c, 0xfc, 0x6b, 0x14, \n  0xf8, 0xe6, 0x1b, 0xf9, 0x60, 0x1d, 0x00, 0x47, 0x27, 0x00, 0x30, 0x5c, 0xfe, 0xb8, 0xf2, 0xfe, \n  0xcc, 0xba, 0xfe, 0x84, 0x10, 0xfb, 0xf7, 0x1c, 0xfd, 0x43, 0x58, 0x01, 0xa1, 0x4a, 0x00, 0xf5, \n  0xac, 0xfe, 0x32, 0xe8, 0xfd, 0xe7, 0x17, 0xff, 0x61, 0xc2, 0xfe, 0x8d, 0x58, 0xfe, 0x57, 0xed, \n  0xfd, 0x47, 0x18, 0xfe, 0x74, 0xa1, 0xfe, 0x09, 0xea, 0xfe, 0x0c, 0x23, 0xff, 0x77, 0x8b, 0xff, \n  0xc7, 0x44, 0x00, 0xec, 0x9f, 0xff, 0x3a, 0x46, 0x19, 0xd9, 0x34, 0x1c, 0x1a, 0xf8, 0x07, 0x9b, \n  0xf2, 0x0b, 0x5c, 0xd6, 0x04, 0xab, 0x3f, 0x01, 0x3b, 0xb0, 0x02, 0x68, 0x8c, 0xfc, 0xea, 0x5b, \n  0xf8, 0xeb, 0x97, 0xfa, 0x76, 0x7e, 0x00, 0x28, 0x8f, 0xff, 0xa8, 0xb9, 0xfe, 0x3b, 0x24, 0xff, \n  0x2d, 0xf9, 0xfe, 0x16, 0x30, 0xfc, 0x7e, 0x26, 0xfe, 0xc7, 0x78, 0x01, 0xd0, 0x2e, 0x00, 0x1b, \n  0xb1, 0xfe, 0xf7, 0x4c, 0xfe, 0xf1, 0x63, 0xff, 0x76, 0xa8, 0xfe, 0x5e, 0x46, 0xfe, 0x3f, 0xbf, \n  0xfd, 0xc6, 0x13, 0xfe, 0x1b, 0x8d, 0xfe, 0x81, 0xc8, 0xfe, 0xd3, 0x7b, 0xff, 0xe6, 0xd5, 0xff, \n  0x4e, 0x31, 0x00, 0x90, 0x9c, 0xff, 0xc7, 0x25, 0x17, 0xe8, 0xc5, 0x19, 0x72, 0x02, 0x07, 0xfc, \n  0x15, 0x0b, 0x52, 0x1e, 0x05, 0xb1, 0x44, 0x01, 0x54, 0x73, 0x02, 0xa8, 0xc2, 0xfc, 0x77, 0x00, \n  0xf9, 0xb4, 0xff, 0xfb, 0xb5, 0xa8, 0x00, 0xf9, 0x04, 0xff, 0xd7, 0x56, 0xff, 0x36, 0x9f, 0xff, \n  0x19, 0x04, 0xff, 0x40, 0x50, 0xfd, 0x11, 0xde, 0xfe, 0xd0, 0xc8, 0x00, 0xdd, 0xdb, 0xff, 0xca, \n  0xe7, 0xfe, 0x05, 0x96, 0xfe, 0xdb, 0x7d, 0xff, 0x09, 0xa3, 0xfe, 0x13, 0x95, 0xfe, 0xb3, 0x3f, \n  0xfe, 0xc7, 0x70, 0xfe, 0xd3, 0x7c, 0xfe, 0x77, 0x97, 0xfe, 0xdb, 0x79, 0xff, 0x1b, 0xf0, 0xff, \n  0xde, 0x31, 0x00, 0x63, 0x7e, 0xff, 0x46, 0xa3, 0x14, 0xc2, 0x81, 0x17, 0x9f, 0xbc, 0x06, 0x52, \n  0xf1, 0x09, 0xba, 0x72, 0x04, 0x32, 0xc1, 0x01, 0x51, 0xd4, 0x02, 0x51, 0xf5, 0xfc, 0x40, 0x91, \n  0xf9, 0x7f, 0x10, 0xfd, 0xce, 0x35, 0x01, 0xe4, 0x45, 0xff, 0xa1, 0x29, 0x00, 0xa9, 0xef, 0xff, \n  0xfb, 0x19, 0xff, 0x18, 0x59, 0xfe, 0xa2, 0xfd, 0xfe, 0xee, 0x1a, 0x00, 0xc4, 0xde, 0xff, 0x7f, \n  0x2a, 0xff, 0xb1, 0xc4, 0xfe, 0xf5, 0xd5, 0xff, 0x1e, 0x35, 0xff, 0x14, 0x21, 0xff, 0xbf, 0x7b, \n  0xfe, 0x14, 0x4a, 0xfe, 0x1d, 0x7d, 0xfe, 0xa8, 0xc2, 0xfe, 0x78, 0x8d, 0xff, 0xa9, 0xd3, 0xff, \n  0x55, 0x0c, 0x00, 0x17, 0xa3, 0xff, 0x2a, 0x85, 0x12, 0xf9, 0xcb, 0x14, 0x82, 0x86, 0x06, 0x15, \n  0x40, 0x09, 0x3a, 0xe1, 0x03, 0xf3, 0x21, 0x02, 0xfc, 0x0f, 0x03, 0x94, 0x77, 0xfd, 0xc5, 0x83, \n  0xfa, 0xba, 0x79, 0xfe, 0x9d, 0x63, 0x02, 0x49, 0xdd, 0xff, 0x29, 0x95, 0x00, 0x86, 0x35, 0x00, \n  0x34, 0x60, 0xff, 0x5c, 0x14, 0xff, 0xd3, 0x2b, 0xff, 0x30, 0x9e, 0xff, 0xa1, 0xda, 0xff, 0x70, \n  0x8e, 0xff, 0x14, 0x35, 0xff, 0x76, 0x0b, 0x00, 0x29, 0x2e, 0xff, 0x84, 0x56, 0xff, 0x30, 0xdd, \n  0xfe, 0xf5, 0x74, 0xfe, 0x63, 0xb9, 0xfe, 0xe9, 0xfa, 0xfe, 0x8f, 0x84, 0xff, 0xdd, 0xdd, 0xff, \n  0x3a, 0x11, 0x00, 0xa0, 0x9b, 0xff, 0x85, 0x7b, 0x11, 0x86, 0x38, 0x13, 0x3d, 0x8a, 0x05, 0x33, \n  0xe3, 0x07, 0x60, 0x23, 0x03, 0x6f, 0x48, 0x02, 0x3a, 0xd5, 0x03, 0x40, 0xc8, 0xfe, 0x47, 0xce, \n  0xfb, 0x9e, 0xf4, 0xff, 0x3f, 0xc6, 0x03, 0x2a, 0xc3, 0x00, 0xf2, 0xb8, 0x00, 0xe5, 0xd8, 0xff, \n  0xa0, 0x17, 0xff, 0xbe, 0x35, 0xff, 0x27, 0x60, 0xff, 0xb7, 0xba, 0xff, 0x29, 0x2a, 0x00, 0x22, \n  0xcb, 0xff, 0x42, 0x26, 0xff, 0xf1, 0xf9, 0xff, 0x16, 0x65, 0xff, 0x5c, 0x9c, 0xff, 0x15, 0x04, \n  0xff, 0xc6, 0x94, 0xfe, 0xac, 0x0e, 0xff, 0x13, 0x62, 0xff, 0x97, 0xbb, 0xff, 0x1e, 0xf0, 0xff, \n  0xad, 0xdd, 0xff, 0xdc, 0x2a, 0xff, 0x7b, 0xc1, 0x10, 0x0b, 0x37, 0x12, 0x25, 0xcb, 0x04, 0xad, \n  0xe7, 0x07, 0x99, 0xef, 0x03, 0xf8, 0x04, 0x03, 0x4a, 0x80, 0x04, 0x9f, 0xb8, 0xff, 0x7e, 0xff, \n  0xfc, 0x73, 0xac, 0x00, 0x36, 0xc1, 0x03, 0x70, 0x45, 0x00, 0x64, 0xc6, 0xff, 0x0e, 0xf7, 0xfe, \n  0xe0, 0x23, 0xff, 0xcd, 0xe7, 0xff, 0xd9, 0xc8, 0xff, 0x02, 0xa7, 0xff, 0xce, 0xbf, 0xff, 0xe3, \n  0x99, 0xff, 0x89, 0x3a, 0xff, 0x35, 0x0e, 0x00, 0x08, 0x87, 0xff, 0x57, 0xf3, 0xff, 0x73, 0x78, \n  0xff, 0x96, 0xcc, 0xfe, 0xe1, 0x1c, 0xff, 0xa0, 0x56, 0xff, 0x4b, 0x86, 0xff, 0x99, 0x88, 0xff, \n  0x3c, 0x7f, 0xff, 0xd5, 0x0f, 0xff, 0x35, 0xf4, 0x10, 0x3d, 0x70, 0x13, 0xbc, 0x59, 0x06, 0xe7, \n  0xc3, 0x08, 0x43, 0x25, 0x04, 0xb3, 0x4b, 0x03, 0x07, 0x84, 0x04, 0xe0, 0xf5, 0xfe, 0x0b, 0xdf, \n  0xfb, 0x06, 0xb5, 0xff, 0x61, 0x1d, 0x03, 0xc5, 0x04, 0x00, 0xdd, 0xc1, 0xff, 0x25, 0xe2, 0xfe, \n  0xf2, 0x36, 0xff, 0x26, 0xe4, 0xff, 0xf4, 0x65, 0xff, 0x41, 0x61, 0xff, 0x5d, 0xe2, 0xff, 0xe9, \n  0xbe, 0xff, 0x24, 0x4d, 0xff, 0xd6, 0x45, 0x00, 0xca, 0x9e, 0xff, 0x85, 0xfe, 0xff, 0xbc, 0xb0, \n  0xff, 0x8d, 0xe8, 0xfe, 0xb4, 0xe8, 0xfe, 0xc5, 0xe4, 0xfe, 0x67, 0xf0, 0xfe, 0x7f, 0x49, 0xff, \n  0xc4, 0x9c, 0xff, 0x13, 0x44, 0xff, 0xb3, 0x5c, 0x11, 0xbe, 0xab, 0x13, 0x57, 0xfd, 0x05, 0x23, \n  0x42, 0x08, 0x9c, 0xeb, 0x03, 0x3e, 0x5b, 0x03, 0x2f, 0xb4, 0x04, 0xea, 0xfb, 0xfe, 0x62, 0x6c, \n  0xfb, 0x99, 0x2a, 0xff, 0xf8, 0xfc, 0x02, 0x37, 0xf4, 0xff, 0x1a, 0x6a, 0xff, 0x16, 0x95, 0xfe, \n  0xc1, 0x20, 0xff, 0x1b, 0x57, 0x00, 0x10, 0x4d, 0x00, 0xff, 0xec, 0xff, 0x30, 0xdb, 0xff, 0x83, \n  0x95, 0xff, 0xaf, 0x31, 0xff, 0xa0, 0xe9, 0xff, 0x9b, 0x2d, 0xff, 0xf2, 0xc3, 0xff, 0xde, 0xba, \n  0xff, 0x38, 0x69, 0xff, 0x19, 0x7a, 0xff, 0x7b, 0x09, 0xff, 0x80, 0xdb, 0xfe, 0x85, 0x0f, 0xff, \n  0xbf, 0x68, 0xff, 0x47, 0x3e, 0xff, 0xbd, 0xff, 0x11, 0x1e, 0x51, 0x14, 0x53, 0x91, 0x05, 0xee, \n  0x4f, 0x07, 0x7f, 0xc5, 0x02, 0x51, 0x94, 0x02, 0x3b, 0x6a, 0x04, 0x90, 0xe1, 0xfe, 0x04, 0x03, \n  0xfb, 0x6e, 0x01, 0xff, 0x8c, 0xc5, 0x03, 0x33, 0xa7, 0x00, 0x96, 0x92, 0xff, 0x53, 0xe8, 0xfd, \n  0x7b, 0x25, 0xfe, 0x69, 0x29, 0x00, 0xf1, 0xae, 0x00, 0xcc, 0xa8, 0x00, 0xe4, 0xcb, 0x00, 0x51, \n  0xff, 0xff, 0xb1, 0x25, 0xff, 0x05, 0xf8, 0xff, 0x7d, 0x10, 0xff, 0xb0, 0x40, 0xff, 0x07, 0x3e, \n  0xff, 0x6b, 0xff, 0xfe, 0x18, 0x8a, 0xff, 0xbf, 0xf5, 0xff, 0x60, 0xe4, 0xff, 0xaa, 0x9b, 0xff, \n  0x11, 0x52, 0xff, 0x7f, 0xc5, 0xfe, 0xb9, 0x3f, 0x13, 0x45, 0x29, 0x16, 0x58, 0x07, 0x06, 0xbb, \n  0x67, 0x07, 0x98, 0x65, 0x02, 0xec, 0x01, 0x02, 0x91, 0x99, 0x03, 0xe1, 0x6e, 0xfd, 0x40, 0x3a, \n  0xf9, 0x8b, 0x68, 0xfd, 0x83, 0xde, 0x03, 0x59, 0x42, 0x01, 0x02, 0x9b, 0xff, 0x0e, 0x29, 0xfe, \n  0xa8, 0x90, 0xfe, 0x2c, 0x1a, 0x00, 0x3c, 0x80, 0x00, 0x14, 0x52, 0x00, 0xc4, 0x62, 0x00, 0x43, \n  0x6c, 0x00, 0x21, 0xbb, 0xff, 0x27, 0x41, 0x00, 0x53, 0x6a, 0xff, 0x64, 0x83, 0xff, 0xdd, 0x33, \n  0xff, 0x70, 0xab, 0xfe, 0x73, 0x14, 0xff, 0xe1, 0x9e, 0xff, 0xd4, 0x24, 0x00, 0xb8, 0x8c, 0x00, \n  0x81, 0x44, 0x00, 0xb6, 0x2f, 0xff, 0x42, 0x31, 0x15, 0x81, 0x55, 0x18, 0x67, 0x51, 0x06, 0xce, \n  0xf3, 0x07, 0x58, 0x6b, 0x02, 0x13, 0xe0, 0x01, 0x77, 0x5f, 0x03, 0xc3, 0x4e, 0xfc, 0xee, 0x5b, \n  0xf7, 0xf0, 0xd7, 0xfb, 0x35, 0x05, 0x04, 0xb5, 0x19, 0x01, 0x60, 0x97, 0xfe, 0xf6, 0x5a, 0xfd, \n  0x8a, 0x2f, 0xfe, 0xef, 0x58, 0x00, 0x4f, 0xf9, 0x00, 0xd3, 0x73, 0x00, 0x78, 0xa5, 0x00, 0xb6, \n  0x7e, 0x00, 0xd3, 0x73, 0xff, 0xfb, 0x51, 0x00, 0x20, 0x5b, 0xff, 0x45, 0x9c, 0xff, 0x65, 0x7d, \n  0xff, 0xcd, 0xdb, 0xfe, 0x02, 0x3b, 0xff, 0x33, 0xe1, 0xff, 0x3c, 0x03, 0x00, 0x83, 0x00, 0x00, \n  0xe7, 0x47, 0x00, 0xd4, 0xd7, 0xff, 0x18, 0x31, 0x18, 0x7e, 0xaf, 0x1a, 0xfb, 0xe4, 0x05, 0x50, \n  0xb5, 0x08, 0x4f, 0x5c, 0x02, 0x14, 0x06, 0x02, 0xa7, 0x78, 0x03, 0x5b, 0x28, 0xfb, 0x80, 0x72, \n  0xf5, 0x34, 0xdb, 0xfa, 0xb6, 0xf5, 0x04, 0xb5, 0xdc, 0x00, 0xd6, 0x59, 0xfd, 0x0b, 0x44, 0xfc, \n  0x29, 0x63, 0xfd, 0x65, 0xc8, 0xff, 0x11, 0x99, 0x00, 0xba, 0x19, 0x00, 0x5d, 0xa8, 0x00, 0x23, \n  0xb9, 0x00, 0xb4, 0x5e, 0xff, 0x52, 0x50, 0x00, 0xc4, 0x69, 0xff, 0xb3, 0x80, 0xff, 0x25, 0x63, \n  0xff, 0xc5, 0xf5, 0xfe, 0x7a, 0x4e, 0xff, 0x18, 0x03, 0x00, 0x7f, 0xf5, 0xff, 0xfd, 0xf2, 0xff, \n  0x6d, 0x23, 0x00, 0x3e, 0x90, 0xff, 0xb8, 0xd2, 0x1b, 0x52, 0x83, 0x1d, 0x17, 0xb8, 0x04, 0xe1, \n  0x57, 0x09, 0x3d, 0x4e, 0x02, 0xab, 0xc6, 0x01, 0x7e, 0x67, 0x03, 0x6c, 0x92, 0xf9, 0x65, 0xf9, \n  0xf3, 0x1f, 0xe5, 0xfa, 0x07, 0x08, 0x06, 0x05, 0x62, 0x00, 0x92, 0x57, 0xfc, 0x53, 0x68, 0xfb, \n  0xa7, 0x03, 0xfd, 0x47, 0x7d, 0xff, 0xe3, 0x25, 0x00, 0x39, 0xac, 0xff, 0xa9, 0x41, 0x00, 0xad, \n  0x6f, 0x00, 0x2b, 0xcc, 0xfe, 0x91, 0x2d, 0x00, 0xcb, 0x67, 0xff, 0xf6, 0x98, 0xff, 0x1f, 0x25, \n  0xff, 0xdc, 0x80, 0xfe, 0xf0, 0x20, 0xff, 0x46, 0xe6, 0xff, 0x01, 0x08, 0x00, 0xf2, 0x36, 0x00, \n  0xe5, 0x73, 0x00, 0x86, 0xbd, 0xff, 0x04, 0x13, 0x1f, 0x74, 0xe6, 0x20, 0x01, 0xdd, 0x03, 0x31, \n  0x81, 0x09, 0xc0, 0x7e, 0x02, 0x4c, 0x65, 0x01, 0x09, 0x66, 0x03, 0x57, 0xf5, 0xf7, 0x0f, 0xa7, \n  0xf2, 0xcf, 0x1e, 0xfb, 0x95, 0x8e, 0x06, 0x18, 0x1f, 0x00, 0xb0, 0xe6, 0xfb, 0x5c, 0xad, 0xfa, \n  0xe0, 0xbd, 0xfc, 0xd0, 0x69, 0xff, 0x6e, 0xd1, 0xff, 0x78, 0x86, 0xff, 0x81, 0x0e, 0x00, 0x50, \n  0x5f, 0x00, 0x15, 0x93, 0xfe, 0x3d, 0xc5, 0xff, 0x75, 0xd7, 0xfe, 0xbc, 0x54, 0xff, 0xe8, 0xc5, \n  0xfe, 0x9d, 0x37, 0xfe, 0x18, 0x0a, 0xff, 0x0f, 0xc9, 0xff, 0xca, 0x0f, 0x00, 0x12, 0x46, 0x00, \n  0x1a, 0xb1, 0x00, 0xf4, 0xca, 0xff, 0x43, 0xee, 0x20, 0x5b, 0x49, 0x24, 0x4c, 0xce, 0x04, 0xd2, \n  0x77, 0x09, 0x3d, 0x1a, 0x02, 0xb4, 0x83, 0x00, 0x81, 0xac, 0x03, 0x41, 0xf8, 0xf6, 0xa0, 0x2b, \n  0xf2, 0xa9, 0xf0, 0xfa, 0x01, 0xdf, 0x04, 0x6c, 0xd3, 0xff, 0xef, 0xcc, 0xfc, 0x09, 0x57, 0xfa, \n  0x5a, 0xf9, 0xfb, 0x35, 0xfb, 0xfe, 0xe0, 0xcd, 0xff, 0x10, 0x84, 0x00, 0x48, 0xe1, 0xff, 0x88, \n  0xc7, 0xff, 0xbd, 0x6c, 0xfe, 0x3c, 0x78, 0xff, 0x80, 0x6c, 0xfe, 0x5c, 0xe4, 0xfe, 0x84, 0x69, \n  0xfe, 0xfd, 0x07, 0xfe, 0xb0, 0xf3, 0xfe, 0x15, 0x8f, 0xff, 0xa4, 0x2d, 0x00, 0x8d, 0x29, 0x00, \n  0x09, 0x89, 0x00, 0x23, 0x92, 0xff, 0x11, 0x88, 0x21, 0xd5, 0x93, 0x26, 0x76, 0xe9, 0x06, 0xab, \n  0x43, 0x0a, 0xd5, 0x5b, 0x02, 0x06, 0xe4, 0xfe, 0xa7, 0x1d, 0x03, 0xdc, 0x24, 0xf7, 0x07, 0xcc, \n  0xf2, 0x1f, 0x40, 0xfb, 0x80, 0xe2, 0x01, 0xab, 0xa4, 0xfe, 0x47, 0xf3, 0xfd, 0xd1, 0x61, 0xfb, \n  0x72, 0x49, 0xfc, 0x80, 0x29, 0xfe, 0x90, 0x1d, 0xff, 0x79, 0x40, 0x01, 0x85, 0x4b, 0x00, 0xc5, \n  0x1b, 0xff, 0xdf, 0x31, 0xfe, 0x75, 0x7c, 0xff, 0xb3, 0xaf, 0xfe, 0x52, 0xed, 0xfe, 0xae, 0x31, \n  0xfe, 0xe8, 0xf9, 0xfd, 0x37, 0xb3, 0xfe, 0xc5, 0xf3, 0xfe, 0xaf, 0xe5, 0xff, 0xfd, 0x11, 0x00, \n  0x94, 0x6f, 0x00, 0x67, 0x9a, 0xff, 0x8d, 0x54, 0x22, 0x4d, 0x9b, 0x27, 0xd4, 0x66, 0x08, 0xb2, \n  0x4c, 0x0c, 0x7e, 0x91, 0x03, 0xcd, 0xe2, 0xfd, 0x56, 0x59, 0x01, 0x73, 0x0c, 0xf6, 0x73, 0x80, \n  0xf3, 0x64, 0x6f, 0xfd, 0xbb, 0x7c, 0xff, 0xcb, 0x83, 0xfb, 0x66, 0xa1, 0xfe, 0x29, 0x40, 0xfd, \n  0x09, 0xca, 0xfd, 0x10, 0xd0, 0xfd, 0xcc, 0x78, 0xfd, 0x7a, 0xd1, 0x00, 0xd0, 0xbf, 0x00, 0xfe, \n  0x55, 0xff, 0x3b, 0xca, 0xfe, 0x67, 0x84, 0xff, 0x48, 0x63, 0xfe, 0x0f, 0xd9, 0xfe, 0x49, 0xda, \n  0xfd, 0x90, 0xad, 0xfd, 0x7c, 0x8f, 0xfe, 0x0a, 0x48, 0xfe, 0xf9, 0x5d, 0xff, 0x79, 0xfc, 0xff, \n  0x41, 0x70, 0x00, 0xc0, 0x8d, 0xff, 0xf2, 0x99, 0x24, 0x03, 0xad, 0x27, 0x38, 0xa1, 0x07, 0x71, \n  0xae, 0x0e, 0xe3, 0xb6, 0x04, 0x2c, 0x7c, 0xfd, 0x6e, 0xa6, 0xff, 0xa2, 0xad, 0xf4, 0x61, 0x73, \n  0xf4, 0x7c, 0x4e, 0x00, 0xe5, 0xc2, 0xfd, 0x91, 0xba, 0xf7, 0x77, 0x8e, 0xfe, 0x01, 0x40, 0xfe, \n  0xde, 0xfc, 0xff, 0xe4, 0x56, 0xfe, 0x00, 0xf5, 0xfb, 0x6b, 0x75, 0x00, 0xf5, 0x4c, 0x01, 0xb4, \n  0xf1, 0xfe, 0xee, 0xd5, 0xfe, 0xce, 0xe6, 0xff, 0x72, 0x23, 0xfe, 0x90, 0xac, 0xfe, 0xc8, 0x0b, \n  0xfd, 0x16, 0x28, 0xfd, 0x8b, 0x84, 0xfe, 0x4c, 0xf8, 0xfd, 0x2f, 0xe5, 0xfe, 0x5e, 0xd5, 0xff, \n  0x62, 0x2e, 0x00, 0x9b, 0x29, 0xff, 0xde, 0x81, 0x28, 0x01, 0xf4, 0x27, 0xeb, 0xb9, 0x04, 0xf3, \n  0x33, 0x10, 0x23, 0xa0, 0x04, 0x78, 0x8c, 0xfd, 0x2d, 0xdf, 0xff, 0x77, 0xe0, 0xf2, 0x13, 0x86, \n  0xf5, 0xb0, 0x75, 0x04, 0x9a, 0x96, 0xfd, 0x54, 0x0b, 0xf3, 0xd2, 0x22, 0xfd, 0x19, 0xf6, 0xfe, \n  0xb6, 0xa6, 0x01, 0x8d, 0x1c, 0x00, 0x6d, 0x66, 0xfb, 0x63, 0x97, 0xff, 0x08, 0xa6, 0x01, 0x88, \n  0x9b, 0xfe, 0x2b, 0x5d, 0xfe, 0xc6, 0x0d, 0x00, 0x0d, 0x8e, 0xfd, 0xe0, 0x75, 0xfe, 0xb3, 0x9c, \n  0xfc, 0x88, 0xae, 0xfc, 0x69, 0xb6, 0xfe, 0xb4, 0xec, 0xfd, 0x08, 0x60, 0xfe, 0xfa, 0xbd, 0xff, \n  0xf3, 0x22, 0x00, 0x1b, 0xd1, 0xfe, 0x97, 0x73, 0x2d, 0x76, 0x57, 0x2b, 0x12, 0xe7, 0xff, 0xfb, \n  0xbf, 0x0d, 0x07, 0xc3, 0x03, 0xb1, 0xd5, 0xfd, 0xf4, 0xcd, 0x02, 0x62, 0x93, 0xf2, 0xfb, 0x1c, \n  0xf4, 0x85, 0xfc, 0x06, 0x7a, 0x89, 0x00, 0x4d, 0xef, 0xf0, 0xa3, 0x78, 0xfa, 0x19, 0x92, 0xfe, \n  0x79, 0xab, 0x02, 0x3f, 0x88, 0x01, 0xca, 0xd6, 0xfa, 0x9a, 0xad, 0xfe, 0x6f, 0xf9, 0x01, 0x7f, \n  0x7a, 0xfe, 0x2a, 0xa5, 0xfd, 0xd1, 0x61, 0x00, 0x1a, 0x59, 0xfd, 0x0d, 0x32, 0xfe, 0xeb, 0x4b, \n  0xfc, 0x03, 0x15, 0xfc, 0xde, 0xca, 0xfe, 0x62, 0x23, 0xfe, 0x69, 0x29, 0xfe, 0xdb, 0x76, 0xff, \n  0x74, 0x48, 0x00, 0x84, 0xdf, 0xfe, 0xb9, 0x97, 0x33, 0x0c, 0x98, 0x2e, 0xd8, 0xfa, 0xf9, 0x1f, \n  0xc7, 0x0a, 0x5a, 0x38, 0x01, 0xd1, 0xe8, 0xfe, 0x58, 0x4c, 0x07, 0xf4, 0x03, 0xf2, 0xed, 0x10, \n  0xf2, 0x81, 0xe9, 0x08, 0xde, 0xda, 0x04, 0xed, 0x73, 0xf0, 0x6f, 0x6d, 0xf7, 0x84, 0xc1, 0xfc, \n  0xe5, 0x23, 0x03, 0xdb, 0xa0, 0x02, 0x84, 0xa3, 0xf9, 0xb6, 0xf6, 0xfc, 0x15, 0x5c, 0x02, 0xa0, \n  0x11, 0xff, 0x94, 0xac, 0xfc, 0x38, 0x53, 0x00, 0x97, 0x5f, 0xfd, 0xb0, 0x84, 0xfe, 0x3c, 0x55, \n  0xfc, 0x40, 0x47, 0xfb, 0xac, 0xa5, 0xfe, 0x65, 0x43, 0xfe, 0x0b, 0x25, 0xfe, 0x3b, 0x98, 0xff, \n  0xff, 0x88, 0x00, 0x00, 0xc0, 0xfe, 0xaf, 0x01, 0x38, 0xe8, 0x17, 0x30, 0x29, 0xa8, 0xf6, 0x0f, \n  0x67, 0x09, 0xfc, 0x37, 0xfe, 0x0a, 0x37, 0x00, 0xb6, 0xe0, 0x09, 0xe4, 0xe8, 0xf1, 0x19, 0x99, \n  0xf0, 0xf8, 0x9c, 0x09, 0xe2, 0x3c, 0x09, 0xe0, 0x63, 0xf0, 0xf2, 0x16, 0xf5, 0x8c, 0x24, 0xfa, \n  0xaa, 0x69, 0x02, 0xca, 0x7c, 0x03, 0xc6, 0x61, 0xf9, 0x24, 0xb8, 0xfb, 0x62, 0xcb, 0x01, 0x1d, \n  0xfd, 0xfe, 0x95, 0x0a, 0xfc, 0xa4, 0x97, 0x00, 0x64, 0x34, 0xfd, 0xce, 0xe6, 0xfe, 0xb2, 0x71, \n  0xfc, 0xad, 0x92, 0xfa, 0x0a, 0x88, 0xfe, 0x62, 0xd6, 0xfe, 0x76, 0x7e, 0xfe, 0xf5, 0x8e, 0xff, \n  0x2e, 0x45, 0x00, 0xb6, 0x6d, 0xfe, 0xc1, 0xee, 0x3a, 0xb3, 0x2d, 0x32, 0x79, 0x4c, 0xf5, 0x58, \n  0x65, 0x07, 0x62, 0x6a, 0xfb, 0x72, 0xa0, 0x01, 0xa4, 0x2b, 0x0c, 0xc9, 0x90, 0xf2, 0x80, 0x1e, \n  0xee, 0x0d, 0x85, 0x08, 0x78, 0x93, 0x0d, 0x30, 0x5a, 0xf2, 0x57, 0x91, 0xf3, 0x6e, 0xe4, 0xf5, \n  0x1e, 0x03, 0x01, 0x4d, 0xa7, 0x05, 0xf0, 0x06, 0xfa, 0x19, 0x91, 0xfa, 0x45, 0xbf, 0x00, 0x6a, \n  0xba, 0xfe, 0x9b, 0x01, 0xfc, 0xbf, 0xc1, 0x00, 0xb0, 0xb2, 0xfc, 0x8f, 0xcc, 0xfe, 0xbc, 0x89, \n  0xfc, 0xa9, 0xa7, 0xfa, 0x43, 0xd3, 0xfe, 0x24, 0x52, 0xff, 0xc2, 0xae, 0xfe, 0x34, 0x8b, 0xff, \n  0xe8, 0x15, 0x00, 0xea, 0x23, 0xfe, 0x01, 0xdd, 0x3c, 0x54, 0x5f, 0x33, 0xe4, 0x83, 0xf6, 0x9b, \n  0x27, 0x06, 0xf6, 0x7e, 0xf9, 0xaf, 0x00, 0x02, 0xc9, 0x78, 0x0c, 0xef, 0x2d, 0xf4, 0x07, 0x87, \n  0xeb, 0xdd, 0xb6, 0x06, 0x97, 0xa4, 0x10, 0x6f, 0x9c, 0xf5, 0x61, 0xab, 0xf2, 0x85, 0x0c, 0xf2, \n  0xcc, 0xc0, 0xff, 0xcb, 0x46, 0x07, 0x3b, 0x2b, 0xfc, 0xe0, 0x85, 0xf9, 0xde, 0x03, 0x00, 0x50, \n  0x9f, 0xfe, 0x82, 0xea, 0xfb, 0x1c, 0x5c, 0x00, 0x6e, 0xe5, 0xfb, 0xa7, 0x0b, 0xff, 0xc1, 0x03, \n  0xfd, 0x06, 0xf8, 0xfa, 0xe3, 0x91, 0xfe, 0x58, 0x89, 0xff, 0x32, 0xd7, 0xfe, 0x02, 0xc4, 0xff, \n  0x20, 0xc2, 0xff, 0x37, 0xc5, 0xfd, 0xa4, 0xf1, 0x3c, 0x5e, 0xa7, 0x34, 0xf4, 0x8c, 0xf8, 0xea, \n  0x0c, 0x06, 0x56, 0x34, 0xf8, 0xb2, 0x86, 0x01, 0x48, 0xea, 0x0b, 0x75, 0x01, 0xf5, 0x31, 0x8c, \n  0xe9, 0xa4, 0x05, 0x04, 0x36, 0x12, 0x12, 0x0a, 0xb3, 0xf9, 0x2c, 0x1b, 0xf3, 0x94, 0xb1, 0xee, \n  0xd5, 0x33, 0xfe, 0xb7, 0x05, 0x08, 0x2f, 0x0f, 0xff, 0xaf, 0x07, 0xf9, 0xa8, 0xb4, 0xfe, 0x58, \n  0x17, 0xff, 0x06, 0x3c, 0xfb, 0xcb, 0xcf, 0xff, 0x7f, 0xfa, 0xfb, 0xe2, 0x4d, 0xff, 0xf2, 0x21, \n  0xfd, 0x17, 0x3a, 0xfb, 0x78, 0xe3, 0xfd, 0x52, 0x74, 0xff, 0x25, 0x17, 0xff, 0x5d, 0x40, 0xff, \n  0x88, 0xbd, 0xff, 0x18, 0xba, 0xfd, 0x14, 0x63, 0x3b, 0xa4, 0x94, 0x35, 0xf9, 0x9f, 0xfc, 0x82, \n  0x96, 0x07, 0x13, 0x46, 0xf7, 0xa6, 0xbb, 0x00, 0x98, 0xce, 0x0a, 0xf3, 0x10, 0xf5, 0xeb, 0x08, \n  0xe8, 0xc1, 0xa4, 0x00, 0x83, 0xf3, 0x11, 0x8f, 0x19, 0xfe, 0x3a, 0x19, 0xf7, 0x75, 0xc1, 0xeb, \n  0x77, 0x2d, 0xfb, 0x3f, 0xb3, 0x08, 0x3c, 0xc4, 0x01, 0x82, 0x28, 0xfa, 0x20, 0xe7, 0xfc, 0x7b, \n  0x53, 0xff, 0x15, 0x68, 0xfb, 0x4d, 0x95, 0xff, 0x7f, 0x91, 0xfc, 0x9f, 0xdc, 0xff, 0x34, 0xec, \n  0xfc, 0x73, 0xe1, 0xfa, 0xe7, 0xb0, 0xfd, 0x9d, 0xc2, 0xfe, 0x35, 0x45, 0xff, 0x3b, 0xc3, 0xfe, \n  0x1a, 0xf5, 0xff, 0x6d, 0x44, 0xfe, 0xe6, 0x38, 0x39, 0xb5, 0x33, 0x35, 0xd8, 0xa0, 0x01, 0xd3, \n  0xbc, 0x08, 0xb5, 0xb1, 0xf7, 0x32, 0xe7, 0xff, 0x74, 0xdd, 0x08, 0x1b, 0x89, 0xf6, 0xdc, 0xe3, \n  0xe5, 0xda, 0x5e, 0xfd, 0xfd, 0x4e, 0x10, 0x6c, 0xbd, 0x00, 0xe1, 0xfd, 0xfc, 0x27, 0xe7, 0xea, \n  0xaa, 0xe8, 0xf6, 0x4c, 0xb6, 0x08, 0x13, 0xec, 0x02, 0x1c, 0xf7, 0xfb, 0xd3, 0xd1, 0xfc, 0xd7, \n  0xac, 0xfe, 0xb9, 0xb3, 0xfc, 0x97, 0x5c, 0xff, 0xf9, 0x2e, 0xfc, 0xb7, 0x68, 0x00, 0x0d, 0x1a, \n  0xfd, 0x43, 0x3d, 0xfa, 0x8e, 0x7a, 0xfd, 0x7b, 0xe0, 0xfd, 0x57, 0x65, 0xff, 0x89, 0x5f, 0xff, \n  0xc9, 0x31, 0x00, 0x19, 0x07, 0xff, 0x2c, 0xac, 0x36, 0x0b, 0x4e, 0x33, 0xc3, 0xbd, 0x05, 0x57, \n  0xba, 0x09, 0x9e, 0x73, 0xf9, 0x98, 0xd2, 0xff, 0xdd, 0xf2, 0x05, 0xdb, 0x28, 0xf8, 0xba, 0x26, \n  0xe5, 0x58, 0xec, 0xf9, 0x0c, 0x86, 0x0e, 0x33, 0x3e, 0x01, 0x35, 0xb9, 0x01, 0xaa, 0x1b, 0xed, \n  0xee, 0x71, 0xf1, 0xfb, 0x0c, 0x07, 0xce, 0xa0, 0x03, 0x72, 0xc4, 0xfd, 0xd4, 0x49, 0xfe, 0x4a, \n  0x1d, 0xfe, 0x93, 0x3c, 0xfd, 0x9f, 0x6c, 0xff, 0xc9, 0xce, 0xfb, 0x0b, 0x01, 0x00, 0xe9, 0xea, \n  0xfc, 0x04, 0x90, 0xf9, 0x73, 0xb3, 0xfd, 0x53, 0xcc, 0xfd, 0x22, 0x9d, 0xff, 0xcb, 0x46, 0x00, \n  0x95, 0x7a, 0x00, 0x83, 0x40, 0xff, 0xb4, 0x6c, 0x33, 0x60, 0x0d, 0x31, 0xe7, 0xbf, 0x07, 0x59, \n  0x1c, 0x0d, 0xaa, 0x47, 0xfa, 0x62, 0xbc, 0xfe, 0x82, 0x63, 0x05, 0x88, 0x5d, 0xf8, 0x88, 0xa2, \n  0xe6, 0xc1, 0x1d, 0xf6, 0x72, 0x49, 0x0d, 0x87, 0x6c, 0x01, 0x05, 0x3c, 0x03, 0x62, 0xa4, 0xf1, \n  0x2b, 0x54, 0xec, 0x1d, 0xa4, 0x03, 0xd1, 0x47, 0x05, 0x0b, 0x3c, 0xff, 0x0a, 0x11, 0xff, 0x0b, \n  0x3f, 0xfe, 0x56, 0xa7, 0xfd, 0xac, 0xc5, 0xff, 0xf1, 0x61, 0xfb, 0x3b, 0x00, 0xfe, 0xfe, 0xba, \n  0xfd, 0xdd, 0xf3, 0xf9, 0x4d, 0x7a, 0xfd, 0xd9, 0x21, 0xfe, 0xae, 0xbb, 0xff, 0x8b, 0xf3, 0x00, \n  0xac, 0x41, 0x00, 0xfb, 0x23, 0xff, 0x6a, 0x53, 0x31, 0x03, 0xf0, 0x2f, 0xd5, 0x52, 0x06, 0x9d, \n  0x61, 0x0e, 0x9a, 0x61, 0xfd, 0x39, 0x4d, 0xfc, 0xfc, 0xdd, 0x04, 0x0c, 0xb3, 0xf9, 0x45, 0x39, \n  0xea, 0xa3, 0x77, 0xf4, 0xec, 0xdd, 0x0b, 0xa7, 0xb3, 0x00, 0xc1, 0x14, 0x00, 0x40, 0x76, 0xf8, \n  0x39, 0xd8, 0xeb, 0x5a, 0x5e, 0xfd, 0x8a, 0xc3, 0x05, 0x44, 0xa2, 0x00, 0xa3, 0x68, 0x00, 0xeb, \n  0xee, 0xfe, 0xe0, 0x65, 0xfd, 0x15, 0x4c, 0xff, 0x49, 0x21, 0xfb, 0x14, 0x02, 0xfd, 0xff, 0xd7, \n  0xfe, 0x6d, 0xde, 0xfa, 0xbe, 0x83, 0xfd, 0x47, 0x1a, 0xff, 0x5b, 0x16, 0xff, 0x51, 0xb1, 0x00, \n  0xf2, 0x43, 0x00, 0xd1, 0x04, 0xff, 0x6f, 0xd0, 0x2e, 0x52, 0xb0, 0x2e, 0xc8, 0x95, 0x04, 0xca, \n  0x8e, 0x0e, 0x21, 0x76, 0x00, 0xe8, 0x23, 0xfd, 0xd8, 0xf9, 0x01, 0xbb, 0xdf, 0xf8, 0x7d, 0x33, \n  0xf1, 0xd1, 0xd7, 0xf3, 0x6e, 0xb5, 0x09, 0x0d, 0xf0, 0x01, 0xd4, 0x4b, 0xfb, 0x98, 0x25, 0xfd, \n  0x3e, 0x01, 0xf0, 0xc4, 0x38, 0xf7, 0x02, 0x9f, 0x04, 0x64, 0x5c, 0x01, 0xce, 0xcc, 0xff, 0xe5, \n  0xe9, 0x00, 0x5e, 0x2a, 0xfe, 0x2a, 0x37, 0xfd, 0xfb, 0x6a, 0xfb, 0x50, 0x36, 0xfd, 0x59, 0xf8, \n  0xff, 0x70, 0xd4, 0xfc, 0x5d, 0x4d, 0xfc, 0x93, 0xfc, 0xfe, 0xbc, 0x5f, 0xff, 0xd1, 0x51, 0x00, \n  0x4e, 0x3d, 0x00, 0x70, 0x2c, 0xff, 0x83, 0xef, 0x2b, 0xed, 0x16, 0x2b, 0x81, 0x67, 0x04, 0x76, \n  0x0a, 0x10, 0x0d, 0x48, 0x02, 0x0f, 0xfe, 0xfc, 0xda, 0x7d, 0x01, 0xe8, 0x6e, 0xf9, 0xc3, 0x3e, \n  0xf3, 0xf5, 0xfc, 0xf4, 0xab, 0x50, 0x08, 0xa8, 0x39, 0x03, 0xcf, 0xf5, 0xf9, 0x40, 0x02, 0xfe, \n  0x75, 0x5d, 0xf5, 0x97, 0x51, 0xf4, 0xfc, 0xd0, 0x01, 0x4a, 0xbe, 0x01, 0x2d, 0xa1, 0xfe, 0x6a, \n  0xbd, 0x00, 0x24, 0xec, 0xfe, 0x81, 0xc4, 0xfd, 0x4b, 0xd4, 0xfb, 0x39, 0x42, 0xfd, 0x55, 0x83, \n  0x00, 0x54, 0x00, 0xfe, 0x7a, 0x7a, 0xfb, 0x03, 0xe5, 0xfe, 0x5d, 0xdf, 0xff, 0x62, 0xf4, 0xff, \n  0x66, 0x7b, 0x00, 0x33, 0x32, 0xff, 0x59, 0x84, 0x27, 0x41, 0xee, 0x26, 0x4e, 0x82, 0x05, 0xad, \n  0x6d, 0x11, 0x77, 0x02, 0x03, 0xff, 0x4f, 0xfc, 0x17, 0x92, 0x02, 0x1d, 0x4c, 0xfc, 0x85, 0x6a, \n  0xf4, 0x63, 0xb9, 0xf3, 0x5b, 0xd7, 0x05, 0xe9, 0x2d, 0x05, 0xd7, 0x9f, 0xfa, 0xa9, 0xed, 0xfd, \n  0x61, 0x99, 0xf9, 0xfc, 0x74, 0xf4, 0x4c, 0x39, 0x00, 0x7f, 0xc9, 0x01, 0x93, 0x2c, 0xfd, 0x86, \n  0x42, 0xff, 0x38, 0x5a, 0xfe, 0x26, 0x54, 0xfe, 0x22, 0x16, 0xfe, 0x1c, 0x75, 0xfd, 0x6c, 0xb8, \n  0xfe, 0xba, 0x7a, 0xfe, 0xbb, 0xb9, 0xfc, 0x1a, 0x87, 0xff, 0x57, 0xf5, 0xff, 0xe6, 0xa9, 0xff, \n  0xf2, 0x7f, 0x00, 0x5d, 0xfa, 0xfe, 0xf6, 0xce, 0x26, 0xe7, 0xbc, 0x22, 0x54, 0x6e, 0x04, 0x5c, \n  0x63, 0x16, 0xff, 0x90, 0x02, 0x3b, 0xa6, 0xf9, 0x2f, 0xc2, 0x04, 0xb3, 0x9a, 0xff, 0x59, 0xfa, \n  0xf4, 0x2e, 0x53, 0xf1, 0x00, 0x79, 0x03, 0x35, 0x3d, 0x06, 0xf3, 0x00, 0xfc, 0x7c, 0x01, 0x00, \n  0x34, 0xff, 0xfa, 0x6f, 0x32, 0xf2, 0xcb, 0xbd, 0x00, 0xe7, 0xb4, 0x02, 0x9d, 0xc1, 0xfb, 0xd6, \n  0xc4, 0xfe, 0x5e, 0xf4, 0xfc, 0xc0, 0x23, 0xfd, 0x1b, 0xe2, 0xfe, 0x93, 0xb0, 0xfd, 0xf5, 0x15, \n  0xff, 0x34, 0xf6, 0xfe, 0x5a, 0xbf, 0xfc, 0x85, 0xe2, 0x00, 0xfe, 0xe2, 0x00, 0xbd, 0x47, 0xff, \n  0x05, 0xec, 0xff, 0x01, 0xe2, 0xfe, 0xd6, 0x36, 0x21, 0xb0, 0x44, 0x21, 0xac, 0xa2, 0x08, 0x84, \n  0x57, 0x14, 0x78, 0xb8, 0x01, 0x40, 0xb7, 0xf9, 0xfc, 0xff, 0x03, 0xaf, 0xd5, 0xfd, 0x7b, 0x8e, \n  0xf7, 0x9c, 0x26, 0xf5, 0xee, 0x47, 0xff, 0xdd, 0x68, 0x03, 0xfa, 0x11, 0xfe, 0xae, 0x3f, 0x01, \n  0xdd, 0xc5, 0xfd, 0x57, 0xa8, 0xf4, 0xd1, 0xae, 0xfc, 0x1c, 0x4a, 0x02, 0x5f, 0xb7, 0xff, 0x6c, \n  0x15, 0xff, 0xea, 0xc3, 0xfc, 0x27, 0xc5, 0xfd, 0x9f, 0x1d, 0xff, 0xb7, 0x9b, 0xfe, 0x8f, 0x33, \n  0xff, 0x1a, 0xc9, 0xfe, 0x0d, 0x7f, 0xfd, 0x13, 0x8d, 0xff, 0x07, 0x3a, 0x00, 0xf0, 0x33, 0xff, \n  0xec, 0xed, 0xff, 0x64, 0x5e, 0xff, 0x38, 0xa3, 0x1d, 0xbf, 0x69, 0x1e, 0x9e, 0x80, 0x08, 0x80, \n  0xbe, 0x11, 0xf1, 0xc6, 0x02, 0xee, 0x28, 0xfd, 0xf1, 0x9b, 0x03, 0xc5, 0x38, 0xfd, 0xef, 0xb3, \n  0xf8, 0x94, 0x9c, 0xf6, 0x88, 0xf6, 0xfe, 0x9b, 0xf9, 0x01, 0x09, 0x69, 0xfe, 0x72, 0xb4, 0x00, \n  0xea, 0x0b, 0xff, 0xb7, 0xa6, 0xf7, 0x2e, 0x5e, 0xfc, 0xb7, 0xa6, 0x02, 0xb5, 0x3d, 0x00, 0x44, \n  0x35, 0xfe, 0xf9, 0x60, 0xfd, 0x1c, 0xba, 0xfe, 0x5e, 0x20, 0xff, 0xf4, 0x3c, 0xfe, 0xf6, 0x2a, \n  0xfe, 0xd5, 0x9e, 0xfe, 0xb9, 0x99, 0xfe, 0x33, 0x2d, 0xff, 0x55, 0x34, 0xff, 0x13, 0x42, 0xff, \n  0xde, 0x54, 0x00, 0xe5, 0x9d, 0xff, 0x30, 0xdc, 0x1a, 0xcf, 0xc9, 0x1b, 0x69, 0xf0, 0x07, 0x3d, \n  0x8a, 0x0e, 0xa1, 0xff, 0x03, 0x9e, 0x22, 0x00, 0x1d, 0xa2, 0x02, 0x02, 0xeb, 0xfc, 0xea, 0x28, \n  0xf9, 0x69, 0x2a, 0xf8, 0x0e, 0x3b, 0xff, 0xc8, 0xf2, 0x00, 0xf9, 0xc1, 0xfe, 0xdc, 0x6d, 0x00, \n  0x3f, 0xa8, 0xff, 0x76, 0x61, 0xf9, 0x10, 0x39, 0xfd, 0x39, 0xec, 0x02, 0xc8, 0x16, 0x00, 0x94, \n  0x34, 0xfe, 0xf0, 0x19, 0xfe, 0xed, 0x1d, 0xff, 0xb1, 0xf1, 0xfe, 0xfc, 0xff, 0xfd, 0xe0, 0x8a, \n  0xfd, 0x79, 0x53, 0xfe, 0x41, 0x9e, 0xfe, 0xe5, 0xda, 0xfe, 0x3a, 0x58, 0xff, 0xc8, 0x9e, 0xff, \n  0x85, 0x4a, 0x00, 0xc1, 0xc3, 0xff, 0xa2, 0xd2, 0x17, 0x97, 0x7c, 0x19, 0xc2, 0xe2, 0x06, 0x4c, \n  0x33, 0x0c, 0x44, 0xb9, 0x05, 0xd5, 0x38, 0x01, 0x21, 0xf6, 0x01, 0x60, 0x15, 0xfd, 0xf2, 0xa6, \n  0xf9, 0x1d, 0x1a, 0xfa, 0x07, 0x72, 0xff, 0x2f, 0x30, 0x00, 0xba, 0x7f, 0xff, 0x5d, 0xe2, 0x00, \n  0xdf, 0xb9, 0xff, 0x1e, 0xc5, 0xfa, 0x36, 0x81, 0xfe, 0xd1, 0xc0, 0x02, 0x94, 0xf9, 0xff, 0x6b, \n  0x39, 0xfe, 0x51, 0x71, 0xfe, 0x0a, 0x96, 0xff, 0xf3, 0xd2, 0xfe, 0xd9, 0xee, 0xfd, 0x4c, 0x8e, \n  0xfd, 0x46, 0x94, 0xfe, 0xb7, 0xae, 0xfe, 0xc5, 0xab, 0xfe, 0x49, 0xb0, 0xff, 0xa6, 0xfd, 0xff, \n  0xf1, 0x45, 0x00, 0xaf, 0xac, 0xff, 0x70, 0x63, 0x15, 0x52, 0xc6, 0x16, 0xfd, 0x28, 0x06, 0x09, \n  0x99, 0x0b, 0xfb, 0xda, 0x05, 0x98, 0x00, 0x01, 0x83, 0xbe, 0x01, 0x41, 0x62, 0xfd, 0x43, 0x71, \n  0xfa, 0xc3, 0x9a, 0xfb, 0x61, 0x62, 0xff, 0xb4, 0x87, 0xff, 0xf2, 0x50, 0x00, 0x6d, 0x57, 0x01, \n  0x0f, 0xb7, 0xff, 0x86, 0x1d, 0xfc, 0x85, 0x08, 0xff, 0x9f, 0xa5, 0x01, 0x39, 0xa3, 0xff, 0xf1, \n  0x9a, 0xfe, 0xf7, 0xc4, 0xfe, 0x5d, 0x8b, 0xff, 0xfa, 0xcb, 0xfe, 0x8e, 0x6b, 0xfe, 0x21, 0x39, \n  0xfe, 0xdf, 0xef, 0xfe, 0xc4, 0x7a, 0xfe, 0xe3, 0x71, 0xfe, 0x25, 0xa4, 0xff, 0x3f, 0x0b, 0x00, \n  0x83, 0x3e, 0x00, 0xef, 0x87, 0xff, 0x8a, 0x66, 0x12, 0xf8, 0x65, 0x14, 0x29, 0x17, 0x06, 0xa9, \n  0x5c, 0x0a, 0x8a, 0x43, 0x05, 0x44, 0x8f, 0x01, 0x4f, 0x10, 0x02, 0x46, 0x95, 0xfd, 0xb4, 0x25, \n  0xfb, 0x93, 0xce, 0xfc, 0x17, 0xc0, 0xff, 0x04, 0x98, 0xff, 0x83, 0x4b, 0x01, 0x51, 0xac, 0x01, \n  0xf8, 0xc1, 0xff, 0x24, 0x5c, 0xfd, 0x94, 0xf8, 0xfe, 0x5c, 0xc0, 0x00, 0x2a, 0xc8, 0xff, 0x34, \n  0xed, 0xfe, 0x7a, 0xe6, 0xfe, 0xf2, 0xd2, 0xff, 0xeb, 0x6a, 0xff, 0xc6, 0x15, 0xff, 0x12, 0x86, \n  0xfe, 0xce, 0xb7, 0xfe, 0xce, 0x5f, 0xfe, 0x3f, 0x9a, 0xfe, 0x2c, 0xba, 0xff, 0x3e, 0xe5, 0xff, \n  0xc1, 0x14, 0x00, 0x28, 0xb2, 0xff, 0x29, 0x80, 0x0f, 0x5d, 0x77, 0x11, 0x59, 0x6f, 0x06, 0xaa, \n  0x5d, 0x09, 0xce, 0xa2, 0x04, 0x93, 0x5d, 0x02, 0xd4, 0x4e, 0x02, 0x9f, 0x00, 0xfe, 0x9d, 0xf8, \n  0xfb, 0x6f, 0x2c, 0xfe, 0xd8, 0xdb, 0x00, 0x6b, 0x22, 0x00, 0xf3, 0xed, 0x01, 0xcc, 0xe0, 0x01, \n  0x83, 0x00, 0x00, 0x48, 0x6c, 0xfe, 0x6d, 0x2e, 0xff, 0xba, 0x1a, 0x00, 0xb5, 0xb6, 0xff, 0x3d, \n  0x4f, 0xff, 0x5c, 0x7c, 0xff, 0x45, 0x49, 0x00, 0x0d, 0x7e, 0xff, 0x67, 0x4b, 0xff, 0x4d, 0xd0, \n  0xfe, 0xb1, 0xc7, 0xfe, 0xae, 0xb6, 0xfe, 0x6f, 0xe1, 0xfe, 0x52, 0xa1, 0xff, 0xaa, 0xde, 0xff, \n  0x86, 0x0e, 0x00, 0x2a, 0xce, 0xff, 0xee, 0x60, 0x0d, 0x04, 0xf9, 0x0e, 0x78, 0x02, 0x06, 0x95, \n  0x28, 0x08, 0x02, 0xec, 0x03, 0x89, 0xa6, 0x02, 0x8a, 0xe7, 0x02, 0x47, 0xb4, 0xfe, 0x29, 0x53, \n  0xfd, 0xb5, 0x24, 0x00, 0xe3, 0x5a, 0x02, 0x24, 0x0c, 0x01, 0x67, 0x16, 0x02, 0x73, 0x11, 0x02, \n  0x71, 0x4b, 0x00, 0x97, 0xe6, 0xfe, 0xc6, 0x0b, 0xff, 0x6d, 0x97, 0xff, 0x43, 0x28, 0x00, 0x9c, \n  0xea, 0xff, 0x8a, 0x77, 0xff, 0xc5, 0x28, 0x00, 0xf8, 0xbf, 0xff, 0xd9, 0xb4, 0xff, 0x0c, 0x1e, \n  0xff, 0x88, 0xdc, 0xfe, 0xfd, 0xfc, 0xfe, 0x74, 0x1c, 0xff, 0x76, 0xb5, 0xff, 0xe1, 0x03, 0x00, \n  0xf3, 0x0b, 0x00, 0xce, 0x9a, 0xff, 0x6b, 0x8c, 0x0c, 0xe2, 0x7a, 0x0d, 0xa9, 0xd0, 0x04, 0x3d, \n  0xd5, 0x06, 0x3d, 0x84, 0x03, 0x54, 0x11, 0x03, 0x68, 0xe8, 0x03, 0x04, 0xaa, 0x00, 0xdc, 0xca, \n  0xfe, 0x0e, 0x59, 0x01, 0x6e, 0x71, 0x03, 0x5c, 0x8e, 0x01, 0x31, 0xee, 0x01, 0x03, 0x31, 0x01, \n  0xb9, 0xbe, 0xff, 0x99, 0x23, 0xff, 0x8c, 0x97, 0xff, 0x8d, 0xfc, 0xff, 0x50, 0x3a, 0x00, 0xe8, \n  0xdc, 0xff, 0x7e, 0x76, 0xff, 0xcc, 0x2a, 0x00, 0xb6, 0xe4, 0xff, 0x66, 0xed, 0xff, 0x98, 0x48, \n  0xff, 0x91, 0x12, 0xff, 0xa9, 0x61, 0xff, 0xc8, 0x99, 0xff, 0xfa, 0xe3, 0xff, 0x68, 0xe8, 0xff, \n  0x13, 0xa0, 0xff, 0xe4, 0x01, 0xff, 0x1a, 0xb0, 0x0b, 0x81, 0x80, 0x0c, 0xe3, 0x31, 0x04, 0x9d, \n  0x29, 0x07, 0x28, 0xa6, 0x04, 0x31, 0xdf, 0x03, 0x32, 0x86, 0x04, 0x70, 0x7f, 0x01, 0x6d, 0xf5, \n  0xff, 0x97, 0xf5, 0x01, 0xf4, 0x37, 0x03, 0x33, 0xdd, 0x00, 0xb1, 0xc0, 0x00, 0x63, 0x44, 0x00, \n  0x2f, 0x07, 0x00, 0x22, 0x06, 0x00, 0x8c, 0xf0, 0xff, 0xb7, 0xc3, 0xff, 0xbf, 0xaf, 0xff, 0xb2, \n  0xad, 0xff, 0x23, 0x9d, 0xff, 0x1f, 0x48, 0x00, 0x73, 0x0b, 0x00, 0xdf, 0x54, 0x00, 0xd2, 0xd2, \n  0xff, 0xa6, 0x41, 0xff, 0x6f, 0x5d, 0xff, 0x54, 0x76, 0xff, 0xad, 0x93, 0xff, 0x69, 0x6c, 0xff, \n  0xdf, 0x42, 0xff, 0x55, 0x01, 0xff, 0x30, 0xd6, 0x0b, 0x60, 0xd2, 0x0d, 0x72, 0xc4, 0x05, 0xf0, \n  0x08, 0x08, 0x20, 0x00, 0x05, 0xae, 0x3d, 0x04, 0x9e, 0x79, 0x04, 0xf2, 0x94, 0x00, 0x61, 0xc9, \n  0xfe, 0x59, 0x19, 0x01, 0x68, 0xac, 0x02, 0xdf, 0x95, 0x00, 0x0e, 0x92, 0x00, 0xdc, 0x11, 0x00, \n  0x97, 0x33, 0x00, 0xf3, 0x1b, 0x00, 0xf5, 0x87, 0xff, 0x43, 0x78, 0xff, 0x25, 0xca, 0xff, 0xf5, \n  0xc6, 0xff, 0x4f, 0xb9, 0xff, 0x92, 0x90, 0x00, 0xbc, 0x22, 0x00, 0x0e, 0x69, 0x00, 0x24, 0x23, \n  0x00, 0x46, 0x58, 0xff, 0x59, 0x19, 0xff, 0xf4, 0xf4, 0xfe, 0x50, 0xec, 0xfe, 0x34, 0x30, 0xff, \n  0x78, 0x66, 0xff, 0xd8, 0x3e, 0xff, 0xdb, 0x8f, 0x0c, 0xa5, 0xac, 0x0e, 0x02, 0x45, 0x06, 0x6f, \n  0xe7, 0x07, 0xbc, 0xa8, 0x04, 0xe6, 0x5e, 0x04, 0x38, 0xae, 0x04, 0x1e, 0x59, 0x00, 0xfe, 0xd9, \n  0xfd, 0xe8, 0xa7, 0xff, 0xe5, 0xdd, 0x01, 0x79, 0xda, 0x00, 0xde, 0xd5, 0x00, 0x85, 0x06, 0x00, \n  0x11, 0x36, 0x00, 0x4a, 0x54, 0x00, 0x9b, 0xf7, 0xff, 0x58, 0xc1, 0xff, 0xdf, 0xbc, 0xff, 0x52, \n  0xa1, 0xff, 0x60, 0xbe, 0xff, 0x9a, 0x51, 0x00, 0xb3, 0xa8, 0xff, 0x0a, 0x49, 0x00, 0x71, 0x96, \n  0x00, 0x95, 0xf8, 0xff, 0xd4, 0x23, 0xff, 0xa1, 0x90, 0xfe, 0x74, 0xa9, 0xfe, 0xec, 0x03, 0xff, \n  0xf0, 0x58, 0xff, 0xe7, 0x5e, 0xff, 0x2f, 0xc4, 0x0c, 0x9f, 0xa7, 0x0e, 0xe7, 0x40, 0x05, 0x19, \n  0xfa, 0x06, 0x74, 0x3d, 0x04, 0x97, 0x3b, 0x04, 0xf7, 0xc7, 0x04, 0x18, 0x58, 0x00, 0xcf, 0x8d, \n  0xfd, 0x83, 0x35, 0x00, 0xc8, 0xdf, 0x02, 0x1e, 0x6f, 0x00, 0x02, 0xe6, 0xff, 0xc6, 0x62, 0xff, \n  0x56, 0xbd, 0xff, 0x5b, 0xe6, 0x00, 0x55, 0x2e, 0x01, 0xcf, 0x78, 0x00, 0x87, 0x14, 0x00, 0x00, \n  0xb7, 0xff, 0xfe, 0x66, 0xff, 0x74, 0xef, 0xff, 0xdb, 0x73, 0xff, 0xc8, 0xdd, 0xff, 0x9f, 0xe6, \n  0xff, 0x21, 0x23, 0x00, 0xfd, 0x45, 0x00, 0x33, 0x72, 0xff, 0x1e, 0xd6, 0xfe, 0x32, 0xce, 0xfe, \n  0x9f, 0x13, 0xff, 0x22, 0x1e, 0xff, 0xaf, 0xd7, 0x0d, 0x4a, 0xeb, 0x0f, 0x01, 0x0c, 0x05, 0x07, \n  0x0a, 0x06, 0x9a, 0xce, 0x02, 0xe8, 0x3c, 0x03, 0x4e, 0x39, 0x04, 0x86, 0xd8, 0xff, 0x03, 0xbc, \n  0xfc, 0x42, 0x75, 0xff, 0x0e, 0xae, 0x03, 0x74, 0xbe, 0x01, 0xf3, 0x6f, 0x00, 0x10, 0xcd, 0xfe, \n  0x51, 0xde, 0xfe, 0x37, 0x65, 0x00, 0x69, 0x02, 0x01, 0x67, 0x16, 0x01, 0xa3, 0x10, 0x01, 0xf7, \n  0x48, 0x00, 0xae, 0xaf, 0xff, 0xcf, 0x37, 0x00, 0xe5, 0x61, 0xff, 0x63, 0x7a, 0xff, 0xd1, 0x80, \n  0xff, 0x4e, 0x57, 0xff, 0x68, 0xda, 0xff, 0x79, 0x47, 0x00, 0xd9, 0x38, 0x00, 0x6d, 0xd4, 0xff, \n  0x3c, 0x38, 0xff, 0xd4, 0x9b, 0xfe, 0xbc, 0x78, 0x0f, 0x16, 0x06, 0x12, 0x4c, 0x56, 0x05, 0x38, \n  0x2f, 0x06, 0x45, 0x69, 0x02, 0x93, 0x9f, 0x02, 0x6d, 0x57, 0x03, 0xe8, 0x30, 0xfe, 0x92, 0xa9, \n  0xfa, 0x1e, 0xb4, 0xfd, 0x2d, 0xfe, 0x03, 0xf0, 0x54, 0x02, 0x66, 0x4f, 0x00, 0x9c, 0x14, 0xff, \n  0x48, 0x4e, 0xff, 0x92, 0x6d, 0x00, 0xf6, 0xfc, 0x00, 0x17, 0xa5, 0x00, 0x8b, 0x87, 0x00, 0xf6, \n  0xce, 0x00, 0x62, 0x39, 0x00, 0xf8, 0x7d, 0x00, 0xbf, 0xd6, 0xff, 0x84, 0xb0, 0xff, 0xa4, 0x7f, \n  0xff, 0xdd, 0x1b, 0xff, 0xa2, 0x56, 0xff, 0x77, 0xe5, 0xff, 0xb8, 0x76, 0x00, 0xb0, 0xd9, 0x00, \n  0xfb, 0x3d, 0x00, 0x87, 0x0d, 0xff, 0x5c, 0xbd, 0x11, 0x3a, 0x68, 0x14, 0x5f, 0x70, 0x05, 0xfb, \n  0xc1, 0x06, 0x39, 0x5b, 0x02, 0x71, 0x64, 0x02, 0xf7, 0xff, 0x02, 0x50, 0xd1, 0xfc, 0xb4, 0x8e, \n  0xf8, 0xaf, 0xfd, 0xfb, 0xde, 0x4a, 0x04, 0x50, 0x1f, 0x02, 0x64, 0x2a, 0xff, 0xf2, 0x56, 0xfe, \n  0xc4, 0x0e, 0xff, 0x2f, 0xef, 0x00, 0x03, 0xa0, 0x01, 0x51, 0xbd, 0x00, 0xfc, 0xcc, 0x00, 0x5d, \n  0xb9, 0x00, 0x55, 0xd2, 0xff, 0xa8, 0xb5, 0x00, 0x0f, 0xc5, 0xff, 0x2e, 0xd8, 0xff, 0x75, 0xe2, \n  0xff, 0x30, 0x4e, 0xff, 0xec, 0x6b, 0xff, 0x99, 0x2c, 0x00, 0xcd, 0x48, 0x00, 0xff, 0x1f, 0x00, \n  0xf9, 0x75, 0x00, 0x4b, 0x09, 0x00, 0x58, 0xc6, 0x14, 0x2e, 0x9e, 0x16, 0x60, 0xf9, 0x04, 0x87, \n  0xaf, 0x07, 0x99, 0x45, 0x02, 0x31, 0x92, 0x02, 0xe9, 0x24, 0x03, 0x1c, 0x9a, 0xfb, 0x6d, 0x6d, \n  0xf6, 0xc2, 0xe0, 0xfa, 0x33, 0x5e, 0x05, 0xe9, 0xd3, 0x01, 0x07, 0xb1, 0xfd, 0xe5, 0x29, 0xfd, \n  0x01, 0x43, 0xfe, 0xb4, 0x75, 0x00, 0x58, 0x8b, 0x01, 0xcc, 0xa2, 0x00, 0x46, 0x0f, 0x01, 0xa9, \n  0x63, 0x01, 0x53, 0xc7, 0xff, 0x82, 0x6d, 0x00, 0x8d, 0xbb, 0xff, 0xc9, 0xc7, 0xff, 0xc0, 0xe5, \n  0xff, 0x72, 0x75, 0xff, 0xc2, 0xcc, 0xff, 0xab, 0x6d, 0x00, 0x2a, 0x09, 0x00, 0x26, 0x0d, 0x00, \n  0xb0, 0x12, 0x00, 0xd9, 0xc7, 0xff, 0xd6, 0x27, 0x19, 0x26, 0x4c, 0x19, 0xff, 0x73, 0x03, 0x45, \n  0xb4, 0x08, 0xb6, 0xf9, 0x01, 0x60, 0x9b, 0x02, 0x2e, 0x1e, 0x03, 0xb0, 0xdc, 0xf9, 0xef, 0x82, \n  0xf4, 0x1a, 0x8b, 0xfa, 0x7c, 0xce, 0x06, 0x49, 0x1d, 0x01, 0x2f, 0x53, 0xfc, 0x9d, 0x31, 0xfc, \n  0xc5, 0xa3, 0xfd, 0xae, 0xed, 0xff, 0x76, 0xf5, 0x00, 0xcd, 0xfd, 0xff, 0x87, 0xca, 0x00, 0x03, \n  0x1a, 0x01, 0x8f, 0x48, 0xff, 0xf3, 0xaa, 0x00, 0x92, 0xe3, 0xff, 0x42, 0xc6, 0xff, 0xe9, 0xa5, \n  0xff, 0x92, 0x46, 0xff, 0x41, 0x8f, 0xff, 0xe1, 0x6f, 0x00, 0xdb, 0x2a, 0x00, 0x38, 0x1b, 0x00, \n  0x7f, 0x44, 0x00, 0x68, 0xa0, 0xff, 0x8b, 0xa2, 0x1d, 0x5c, 0x81, 0x1c, 0x4f, 0x7c, 0x01, 0x69, \n  0x97, 0x09, 0x91, 0xf4, 0x01, 0x75, 0x1e, 0x02, 0x80, 0x18, 0x03, 0xac, 0xcf, 0xf7, 0x49, 0x06, \n  0xf3, 0xc1, 0xf8, 0xfa, 0xfe, 0xfe, 0x07, 0x68, 0x81, 0x00, 0x17, 0x51, 0xfb, 0x9f, 0x36, 0xfb, \n  0xed, 0x68, 0xfd, 0xd6, 0xcf, 0xff, 0x79, 0x57, 0x00, 0xc8, 0xb9, 0xff, 0xa4, 0x5e, 0x00, 0x23, \n  0xaf, 0x00, 0x2f, 0xc0, 0xfe, 0x79, 0x87, 0x00, 0x44, 0xbd, 0xff, 0xa9, 0xaa, 0xff, 0x7e, 0x49, \n  0xff, 0x6b, 0xd9, 0xfe, 0x92, 0x58, 0xff, 0xd1, 0x37, 0x00, 0x49, 0x44, 0x00, 0xb0, 0x61, 0x00, \n  0x90, 0xc5, 0x00, 0x5e, 0x09, 0x00, 0x22, 0x6b, 0x21, 0x14, 0x1b, 0x20, 0x8f, 0x12, 0x00, 0x47, \n  0xcf, 0x09, 0xa0, 0x29, 0x02, 0x9e, 0xae, 0x01, 0xbc, 0x26, 0x03, 0x0f, 0xeb, 0xf5, 0x87, 0xb5, \n  0xf1, 0x8a, 0x72, 0xfb, 0x13, 0x7b, 0x08, 0xf9, 0x17, 0x00, 0x9f, 0xe8, 0xfa, 0x53, 0x7c, 0xfa, \n  0x2d, 0x2e, 0xfd, 0xa5, 0xb6, 0xff, 0x34, 0x13, 0x00, 0x3e, 0x90, 0xff, 0x49, 0x2d, 0x00, 0x7a, \n  0xca, 0x00, 0x39, 0x7a, 0xfe, 0x57, 0xf9, 0xff, 0x36, 0x0e, 0xff, 0xd3, 0x84, 0xff, 0x0f, 0xe1, \n  0xfe, 0x87, 0x80, 0xfe, 0x4c, 0x5c, 0xff, 0x10, 0x27, 0x00, 0xd2, 0x4e, 0x00, 0x85, 0x72, 0x00, \n  0xfd, 0xef, 0x00, 0x92, 0xe4, 0xff, 0x4d, 0x05, 0x24, 0x7f, 0x0b, 0x24, 0x18, 0x6d, 0x00, 0x36, \n  0x8b, 0x09, 0x09, 0x9b, 0x01, 0x1d, 0xe0, 0x00, 0x6d, 0x93, 0x03, 0xa8, 0x5f, 0xf4, 0xd7, 0x19, \n  0xf1, 0x00, 0x4f, 0xfb, 0x58, 0xba, 0x06, 0x07, 0x19, 0x00, 0x92, 0xdf, 0xfb, 0x14, 0xa5, 0xf9, \n  0xb8, 0x5d, 0xfc, 0x22, 0x43, 0xff, 0x63, 0x2d, 0x00, 0xe1, 0xde, 0x00, 0xf6, 0xa4, 0xff, 0xe9, \n  0x11, 0x00, 0xd8, 0x68, 0xfe, 0xad, 0xa7, 0xff, 0x9d, 0x6f, 0xfe, 0x61, 0xec, 0xfe, 0xbc, 0x73, \n  0xfe, 0xf4, 0x48, 0xfe, 0x9f, 0x53, 0xff, 0x45, 0x0f, 0x00, 0x62, 0x8a, 0x00, 0x71, 0x2b, 0x00, \n  0x1f, 0xaf, 0x00, 0x99, 0x9f, 0xff, 0xca, 0xd1, 0x24, 0x78, 0x1d, 0x27, 0xc1, 0x6a, 0x02, 0x42, \n  0xf2, 0x09, 0x57, 0xa3, 0x01, 0x61, 0xf6, 0xfe, 0xfc, 0xb3, 0x03, 0x77, 0x7d, 0xf4, 0x23, 0x94, \n  0xf1, 0xbd, 0x57, 0xfb, 0x91, 0x5c, 0x03, 0x69, 0x57, 0xff, 0x92, 0x90, 0xfd, 0xec, 0x7e, 0xfa, \n  0x00, 0xdf, 0xfb, 0x52, 0xa4, 0xfe, 0x20, 0xbf, 0xff, 0xdd, 0xc1, 0x01, 0xda, 0xfe, 0xff, 0xe2, \n  0x5a, 0xff, 0x17, 0x39, 0xfe, 0x00, 0x72, 0xff, 0x17, 0xac, 0xfe, 0x5d, 0xf0, 0xfe, 0xb7, 0x3d, \n  0xfe, 0x65, 0x45, 0xfe, 0x5c, 0x0c, 0xff, 0xc4, 0x3b, 0xff, 0xc1, 0x64, 0x00, 0x61, 0x51, 0x00, \n  0x1a, 0xb6, 0x00, 0x60, 0x91, 0xff, 0x06, 0x83, 0x25, 0x03, 0x03, 0x29, 0xae, 0xca, 0x04, 0x4a, \n  0x7c, 0x0b, 0x0b, 0x56, 0x02, 0x62, 0x06, 0xfd, 0xcf, 0x2e, 0x02, 0x9e, 0x54, 0xf4, 0x07, 0x82, \n  0xf2, 0x66, 0xde, 0xfc, 0x15, 0xa2, 0xff, 0x14, 0xcd, 0xfc, 0x28, 0x24, 0xff, 0x5f, 0x69, 0xfc, \n  0x0c, 0xfc, 0xfc, 0x54, 0x86, 0xfd, 0x59, 0x45, 0xfe, 0x48, 0x2f, 0x02, 0xf8, 0x69, 0x00, 0x81, \n  0x09, 0xff, 0x5f, 0x9f, 0xfe, 0x1c, 0x67, 0xff, 0x74, 0x8e, 0xfe, 0x57, 0x0e, 0xff, 0xe5, 0xf6, \n  0xfd, 0x1c, 0x17, 0xfe, 0x26, 0xd4, 0xfe, 0x74, 0x6f, 0xfe, 0xb6, 0xf4, 0xff, 0xd6, 0x31, 0x00, \n  0xc7, 0x91, 0x00, 0xc3, 0x8b, 0xff, 0x0f, 0xb6, 0x26, 0x0d, 0xca, 0x29, 0x83, 0xd6, 0x05, 0x92, \n  0xd3, 0x0d, 0x1e, 0xa3, 0x03, 0x36, 0xfb, 0xfb, 0x38, 0x37, 0x00, 0x37, 0x01, 0xf3, 0xbb, 0xac, \n  0xf3, 0xc1, 0x72, 0xff, 0xff, 0x9c, 0xfc, 0x55, 0xc3, 0xf9, 0x11, 0x06, 0x00, 0x78, 0x41, 0xfe, \n  0x4d, 0xd1, 0xfe, 0xec, 0xfb, 0xfc, 0x87, 0x55, 0xfc, 0x08, 0xe1, 0x01, 0xfb, 0x39, 0x01, 0x79, \n  0x0d, 0xff, 0x5c, 0x0c, 0xff, 0x82, 0xb2, 0xff, 0x48, 0x71, 0xfe, 0x6c, 0xb9, 0xfe, 0xa3, 0x63, \n  0xfd, 0x59, 0xc6, 0xfd, 0xc0, 0xb2, 0xfe, 0xb4, 0xdd, 0xfd, 0xb0, 0x62, 0xff, 0x4f, 0x18, 0x00, \n  0x4d, 0xa1, 0x00, 0x3c, 0xa1, 0xff, 0x83, 0xce, 0x29, 0x63, 0x5a, 0x29, 0xf1, 0x88, 0x04, 0x22, \n  0xfb, 0x10, 0x9e, 0x92, 0x04, 0xca, 0x58, 0xfb, 0xe0, 0x33, 0xfe, 0xb5, 0xa1, 0xf1, 0x8c, 0x0a, \n  0xf5, 0xa3, 0xf8, 0x02, 0x28, 0x2a, 0xfa, 0x20, 0x05, 0xf5, 0xa7, 0x7c, 0x00, 0x6f, 0x62, 0xff, \n  0x82, 0x71, 0x01, 0x6f, 0x7c, 0xfd, 0x33, 0x6d, 0xfa, 0x7a, 0xb3, 0x01, 0xe9, 0xe0, 0x01, 0x72, \n  0x64, 0xfe, 0x28, 0x25, 0xff, 0xc2, 0x1e, 0x00, 0xdb, 0xf6, 0xfd, 0x6f, 0xa7, 0xfe, 0x10, 0x61, \n  0xfc, 0xc4, 0x36, 0xfd, 0x30, 0xc3, 0xfe, 0xdf, 0x7d, 0xfd, 0x4e, 0xe0, 0xfe, 0x13, 0xfe, 0xff, \n  0xc6, 0x3d, 0x00, 0xd0, 0x07, 0xff, 0xa9, 0x59, 0x2e, 0xd5, 0xee, 0x28, 0x85, 0x45, 0x01, 0xe9, \n  0x8b, 0x13, 0x7a, 0x48, 0x04, 0x28, 0x57, 0xfb, 0x98, 0x5a, 0xfe, 0x63, 0x78, 0xef, 0x52, 0x9d, \n  0xf6, 0xc7, 0xcd, 0x07, 0xa0, 0x27, 0xf9, 0xba, 0x4b, 0xef, 0xa2, 0xa3, 0xff, 0x3c, 0x99, 0x00, \n  0x3e, 0x80, 0x03, 0x75, 0x40, 0xff, 0xe1, 0x57, 0xf9, 0x37, 0xe3, 0x00, 0x25, 0x6e, 0x02, 0x2b, \n  0xe8, 0xfd, 0x52, 0xd1, 0xfe, 0x56, 0x5e, 0x00, 0x0e, 0x18, 0xfd, 0x26, 0x7c, 0xfe, 0x3d, 0x02, \n  0xfc, 0x56, 0xce, 0xfc, 0x6a, 0xfe, 0xfe, 0xb7, 0x55, 0xfd, 0x01, 0x53, 0xfe, 0x80, 0xf3, 0xff, \n  0x52, 0x25, 0x00, 0x80, 0xb3, 0xfe, 0x8d, 0x22, 0x34, 0xa8, 0x13, 0x2b, 0x23, 0xab, 0xfb, 0x0b, \n  0xbe, 0x12, 0x49, 0xc2, 0x03, 0x50, 0xc0, 0xfb, 0x91, 0x83, 0x00, 0x16, 0x19, 0xee, 0xba, 0x59, \n  0xf6, 0xfe, 0xce, 0x0b, 0x79, 0xfa, 0xfa, 0xab, 0x3f, 0xeb, 0xf6, 0x31, 0xfd, 0xc8, 0xcf, 0x00, \n  0xa9, 0xef, 0x04, 0xa1, 0x26, 0x01, 0xf8, 0x9f, 0xf8, 0xb0, 0xc8, 0xff, 0xd9, 0xfc, 0x02, 0x1e, \n  0x7f, 0xfd, 0x76, 0xd1, 0xfd, 0x12, 0xe4, 0x00, 0x9e, 0xce, 0xfc, 0x55, 0x28, 0xfe, 0x53, 0x65, \n  0xfb, 0x61, 0x19, 0xfc, 0x75, 0x51, 0xff, 0xa6, 0x8d, 0xfd, 0xdf, 0xd4, 0xfd, 0xfc, 0xbf, 0xff, \n  0x26, 0x4c, 0x00, 0x0b, 0x6e, 0xfe, 0x64, 0x7b, 0x3a, 0x0d, 0xc9, 0x2f, 0x7a, 0x2a, 0xf4, 0x72, \n  0xd8, 0x0e, 0x82, 0x61, 0x02, 0xfd, 0x9a, 0xfc, 0xe4, 0x4c, 0x06, 0x62, 0x58, 0xed, 0x93, 0xf9, \n  0xf2, 0xcc, 0x61, 0x0e, 0x6b, 0x9e, 0xff, 0x4b, 0xaa, 0xe9, 0xa7, 0xea, 0xf9, 0x1c, 0x22, 0x00, \n  0x09, 0x72, 0x05, 0x8d, 0x8e, 0x02, 0xa0, 0xc6, 0xf7, 0xa1, 0x2c, 0xfe, 0x68, 0x68, 0x03, 0xdb, \n  0x1e, 0xfe, 0x8f, 0xf1, 0xfc, 0x4c, 0xdf, 0x00, 0x9b, 0xa6, 0xfc, 0x88, 0x49, 0xfe, 0x30, 0x52, \n  0xfb, 0xb1, 0x16, 0xfb, 0x84, 0x87, 0xff, 0x34, 0xde, 0xfd, 0x77, 0x7d, 0xfd, 0x40, 0x71, 0xff, \n  0x8a, 0xcf, 0x00, 0xa3, 0xbf, 0xfe, 0x1a, 0x63, 0x42, 0xe3, 0x50, 0x31, 0x00, 0xf8, 0xec, 0x88, \n  0x60, 0x0d, 0xe7, 0x1c, 0xff, 0x98, 0xa9, 0xfe, 0xb3, 0x66, 0x0a, 0x6b, 0xd6, 0xeb, 0x53, 0xac, \n  0xf1, 0xf4, 0x0b, 0x11, 0x13, 0x90, 0x04, 0x93, 0x57, 0xe8, 0xe7, 0x24, 0xf6, 0x87, 0xd6, 0xfd, \n  0x83, 0xb8, 0x06, 0xdb, 0xa2, 0x03, 0xe8, 0xa6, 0xf5, 0xf8, 0x6f, 0xfc, 0x54, 0x48, 0x04, 0x90, \n  0x68, 0xfe, 0x76, 0x81, 0xfb, 0xf9, 0x4b, 0x01, 0xa5, 0xb7, 0xfc, 0x7e, 0xaa, 0xfe, 0x14, 0x58, \n  0xfb, 0x5e, 0x4a, 0xfa, 0x78, 0x38, 0xff, 0x6c, 0xf7, 0xfd, 0x93, 0xc8, 0xfd, 0x9f, 0xdb, 0xff, \n  0xb7, 0xc5, 0x00, 0x7f, 0x2f, 0xfe, 0xd9, 0x41, 0x47, 0xd3, 0x7d, 0x32, 0x2c, 0x41, 0xe9, 0x95, \n  0x2d, 0x0c, 0xfc, 0xa7, 0xfb, 0x64, 0xb0, 0x00, 0x7e, 0x31, 0x0d, 0x20, 0x85, 0xeb, 0x39, 0xbe, \n  0xef, 0xae, 0xcf, 0x11, 0x92, 0xd3, 0x09, 0x0c, 0xc2, 0xe7, 0x92, 0x87, 0xf3, 0xf3, 0xe7, 0xfa, \n  0x61, 0xdd, 0x05, 0xbb, 0xd4, 0x04, 0x56, 0x8f, 0xf5, 0x98, 0x01, 0xfb, 0x79, 0x82, 0x03, 0x70, \n  0x5a, 0xfe, 0x84, 0xe5, 0xfa, 0x3c, 0xb1, 0x01, 0xd9, 0x68, 0xfc, 0x02, 0x2d, 0xff, 0xa2, 0x6b, \n  0xfb, 0xfc, 0x67, 0xf9, 0x00, 0x44, 0xff, 0x54, 0xcc, 0xfe, 0xaf, 0x1a, 0xfe, 0x1a, 0xa7, 0xff, \n  0x4e, 0x6d, 0x00, 0x2b, 0xe6, 0xfd, 0xdb, 0x39, 0x4b, 0xf4, 0x56, 0x34, 0x13, 0x16, 0xe7, 0xc3, \n  0x09, 0x0a, 0x12, 0x51, 0xf8, 0x92, 0x0a, 0x03, 0xb5, 0xe3, 0x0f, 0x06, 0xd1, 0xeb, 0x53, 0xb3, \n  0xec, 0x21, 0x1c, 0x11, 0xe2, 0x38, 0x0f, 0xba, 0x5e, 0xe9, 0x19, 0x77, 0xf1, 0x51, 0xe2, 0xf5, \n  0xff, 0xd7, 0x04, 0xe0, 0x9d, 0x07, 0xe1, 0xf3, 0xf5, 0x7a, 0x85, 0xf9, 0x25, 0x6b, 0x02, 0x08, \n  0x27, 0xfe, 0x31, 0xe2, 0xfa, 0x75, 0xec, 0x01, 0xbd, 0xd2, 0xfb, 0xa2, 0x33, 0xff, 0xc6, 0x71, \n  0xfb, 0xc9, 0x71, 0xf9, 0x20, 0xae, 0xff, 0xba, 0x62, 0xff, 0x54, 0x3f, 0xfe, 0xd2, 0x97, 0xff, \n  0xc9, 0x32, 0x00, 0x83, 0x97, 0xfd, 0x9d, 0xd5, 0x4d, 0x12, 0xe9, 0x35, 0x88, 0x9e, 0xe7, 0x79, \n  0xe0, 0x07, 0xd9, 0xff, 0xf5, 0xd2, 0x3a, 0x04, 0xee, 0xcb, 0x10, 0x74, 0xa2, 0xed, 0xf6, 0x32, \n  0xe9, 0xec, 0x62, 0x0f, 0x6d, 0x07, 0x14, 0xac, 0x48, 0xec, 0xaa, 0x7f, 0xef, 0x3c, 0x30, 0xf1, \n  0xa3, 0xca, 0x03, 0x96, 0x47, 0x0a, 0x21, 0xa3, 0xf7, 0xec, 0xdd, 0xf7, 0x19, 0xb0, 0x01, 0xed, \n  0xfc, 0xfd, 0xda, 0xf6, 0xfa, 0x83, 0xb5, 0x01, 0xa5, 0xb6, 0xfa, 0x24, 0x64, 0xff, 0x13, 0x28, \n  0xfc, 0xdb, 0xa2, 0xf9, 0x08, 0x91, 0xff, 0x63, 0xd3, 0xff, 0xff, 0x4b, 0xfe, 0x38, 0xee, 0xff, \n  0xcb, 0xd2, 0xff, 0x7d, 0x1d, 0xfd, 0xd2, 0x10, 0x4f, 0xed, 0x4e, 0x37, 0x5b, 0x5b, 0xe9, 0x98, \n  0xe2, 0x06, 0xb8, 0x50, 0xf4, 0x99, 0x1b, 0x04, 0x74, 0xa8, 0x10, 0xa3, 0x32, 0xef, 0x9e, 0x2f, \n  0xe6, 0x7e, 0x33, 0x0d, 0xfb, 0xdb, 0x16, 0x92, 0x77, 0xf0, 0xb2, 0x7b, 0xee, 0x0f, 0x19, 0xed, \n  0xe1, 0xda, 0x02, 0x4d, 0xa4, 0x0b, 0x07, 0xa9, 0xfa, 0x14, 0x8a, 0xf6, 0x51, 0xa8, 0x00, 0xa3, \n  0x63, 0xfe, 0xde, 0x72, 0xfa, 0xb7, 0xf8, 0x00, 0xb6, 0x66, 0xfa, 0x18, 0xe0, 0xff, 0x2b, 0x3f, \n  0xfc, 0x42, 0x35, 0xfa, 0x96, 0xd8, 0xfe, 0x3e, 0xce, 0xff, 0x8c, 0xc4, 0xfe, 0x10, 0xbc, 0xff, \n  0xe4, 0x72, 0xff, 0x1b, 0xf1, 0xfc, 0x57, 0x2f, 0x4e, 0xfb, 0x2a, 0x39, 0x9d, 0x64, 0xec, 0xd2, \n  0x0e, 0x07, 0x35, 0xc0, 0xf2, 0xfb, 0x7e, 0x03, 0x6c, 0xd9, 0x0f, 0x8c, 0xdb, 0xef, 0x53, 0x09, \n  0xe4, 0xf8, 0x89, 0x09, 0x4f, 0x91, 0x18, 0xfd, 0xb7, 0xf5, 0xa9, 0xbc, 0xef, 0xfe, 0xb4, 0xe8, \n  0x02, 0xcc, 0x00, 0x0c, 0xe6, 0x0c, 0x56, 0x42, 0xfe, 0x0c, 0x0f, 0xf6, 0xb9, 0xa6, 0xfe, 0xa7, \n  0x50, 0xff, 0x80, 0x90, 0xf9, 0xfa, 0x9c, 0x00, 0xd6, 0xe3, 0xfa, 0x07, 0x39, 0x00, 0xaa, 0x4a, \n  0xfc, 0xeb, 0x1d, 0xfa, 0x04, 0x32, 0xfe, 0x26, 0xa3, 0xff, 0x1f, 0xfa, 0xfe, 0x72, 0xe0, 0xfe, \n  0x03, 0xcd, 0xff, 0x79, 0x03, 0xfd, 0x38, 0x63, 0x4c, 0x8f, 0x2f, 0x3a, 0x1d, 0x4b, 0xf1, 0x75, \n  0x52, 0x08, 0x75, 0x79, 0xf1, 0xc4, 0xc5, 0x02, 0x75, 0x7c, 0x0e, 0xf9, 0x22, 0xf0, 0x82, 0x28, \n  0xe2, 0x01, 0xd0, 0x05, 0x06, 0xb5, 0x18, 0x81, 0xe7, 0xfa, 0x61, 0x08, 0xf4, 0x71, 0xbc, 0xe4, \n  0xb5, 0x96, 0xfd, 0x8c, 0x0e, 0x0e, 0xd9, 0x48, 0x01, 0x5c, 0x14, 0xf7, 0x4f, 0x67, 0xfc, 0x6e, \n  0xc7, 0xff, 0x05, 0xdb, 0xf9, 0xa4, 0x47, 0x00, 0x95, 0xa1, 0xfb, 0xd3, 0xbf, 0x00, 0xfa, 0xf6, \n  0xfb, 0x41, 0xc9, 0xf9, 0x22, 0xef, 0xfd, 0xe3, 0xd6, 0xfe, 0x68, 0x4b, 0xff, 0x94, 0x4c, 0xfe, \n  0x86, 0x1a, 0x00, 0xf6, 0xb5, 0xfd, 0x17, 0xe6, 0x49, 0xa4, 0xfe, 0x39, 0x3e, 0x7f, 0xf7, 0x2b, \n  0x1e, 0x09, 0x74, 0x8b, 0xf1, 0xae, 0xb9, 0x01, 0x0c, 0x5b, 0x0c, 0x3a, 0x16, 0xf2, 0x9e, 0x50, \n  0xdf, 0xf4, 0x2f, 0x02, 0xa2, 0x3d, 0x17, 0xb4, 0x97, 0xfe, 0x8e, 0xb7, 0xfa, 0xc9, 0x88, 0xe2, \n  0x1a, 0xc6, 0xf8, 0xae, 0xca, 0x0e, 0xab, 0xc5, 0x02, 0x53, 0x0e, 0xf9, 0xdd, 0xd2, 0xfb, 0x34, \n  0x13, 0xff, 0xef, 0x8e, 0xfb, 0x1e, 0xc4, 0xff, 0x9a, 0x45, 0xfb, 0x9a, 0x81, 0x01, 0xfb, 0x19, \n  0xfc, 0xf1, 0x06, 0xf9, 0x49, 0xb2, 0xfd, 0xb4, 0xcc, 0xfd, 0x10, 0x8f, 0xff, 0xaf, 0xee, 0xfe, \n  0x44, 0x4f, 0x00, 0xc4, 0xa1, 0xfe, 0x4a, 0xba, 0x46, 0xfe, 0xa5, 0x39, 0x1a, 0x56, 0xfc, 0x6c, \n  0xa2, 0x08, 0x63, 0x24, 0xf4, 0xab, 0x22, 0x01, 0xb8, 0xfc, 0x08, 0x47, 0x6f, 0xf4, 0x52, 0x49, \n  0xdd, 0x50, 0xd1, 0xfe, 0xa9, 0x7b, 0x15, 0x1f, 0xc4, 0xff, 0x48, 0xec, 0x00, 0xde, 0x51, 0xe3, \n  0x5d, 0x84, 0xf2, 0x44, 0x52, 0x0e, 0x66, 0x9a, 0x03, 0xa1, 0x18, 0xfb, 0x09, 0xf7, 0xfc, 0xe3, \n  0x01, 0xfe, 0x50, 0x66, 0xfc, 0x01, 0xcf, 0xff, 0x61, 0xd6, 0xfa, 0x4d, 0x62, 0x01, 0x28, 0xec, \n  0xfb, 0x4b, 0x4e, 0xf8, 0xba, 0x00, 0xfe, 0xfc, 0x09, 0xfd, 0x65, 0x0d, 0x00, 0x97, 0xe6, 0xff, \n  0x41, 0x56, 0x00, 0x39, 0x51, 0xff, 0xc9, 0x65, 0x43, 0xf9, 0x0a, 0x36, 0x1d, 0xd2, 0x01, 0x2f, \n  0x9c, 0x0b, 0xa2, 0x7b, 0xf4, 0xa1, 0x8c, 0x00, 0x23, 0x6c, 0x06, 0x61, 0x59, 0xf6, 0x92, 0xa8, \n  0xdd, 0x8c, 0x87, 0xf9, 0x3c, 0x21, 0x14, 0xc1, 0xb8, 0x00, 0x18, 0x5c, 0x05, 0x41, 0xce, 0xe6, \n  0x1b, 0xd4, 0xea, 0xf1, 0x1d, 0x0c, 0x74, 0x7e, 0x05, 0x63, 0x13, 0xfd, 0xc0, 0x58, 0xfe, 0xe9, \n  0x9e, 0xfd, 0xb6, 0x39, 0xfd, 0xb1, 0xb9, 0xff, 0x6c, 0x35, 0xfa, 0x8e, 0x46, 0x00, 0x2b, 0x49, \n  0xfc, 0x2e, 0xb1, 0xf7, 0xf9, 0x28, 0xfe, 0xde, 0x91, 0xfd, 0x9a, 0x0e, 0x00, 0x33, 0x14, 0x01, \n  0x42, 0x92, 0x00, 0xb4, 0xfd, 0xfe, 0xfe, 0x88, 0x3f, 0x2c, 0xbd, 0x34, 0xa9, 0xb8, 0x02, 0x0c, \n  0xff, 0x0e, 0xbe, 0x04, 0xf6, 0x00, 0x8e, 0xfe, 0xa8, 0xd1, 0x06, 0x3f, 0x30, 0xf6, 0xa7, 0x08, \n  0xe0, 0x8a, 0x7b, 0xf5, 0x25, 0xac, 0x13, 0x56, 0x68, 0x00, 0xa4, 0x19, 0x05, 0x9d, 0xb1, 0xed, \n  0x11, 0xf3, 0xe4, 0x99, 0xb3, 0x07, 0x02, 0x05, 0x08, 0xb7, 0x94, 0xfe, 0x7a, 0x25, 0xff, 0x09, \n  0x97, 0xfd, 0xd3, 0x70, 0xfd, 0x52, 0x66, 0x00, 0x47, 0xad, 0xf9, 0xf2, 0x86, 0xfd, 0x78, 0x10, \n  0xfe, 0x5c, 0x54, 0xf8, 0xad, 0xbe, 0xfd, 0x73, 0x5c, 0xfe, 0xde, 0xe0, 0xff, 0x54, 0x6f, 0x01, \n  0x83, 0x34, 0x00, 0x88, 0x04, 0xff, 0x3d, 0x1e, 0x3d, 0xc9, 0x81, 0x33, 0x86, 0x0a, 0x01, 0xe7, \n  0xcb, 0x10, 0x5c, 0x7f, 0xf9, 0x8d, 0xec, 0xfa, 0x20, 0x52, 0x06, 0x08, 0x45, 0xf8, 0x10, 0x98, \n  0xe4, 0x6f, 0xef, 0xf2, 0x1c, 0xc3, 0x11, 0x62, 0xf5, 0xff, 0x66, 0x28, 0x01, 0xc8, 0x57, 0xf6, \n  0xb8, 0xf6, 0xe3, 0x63, 0xc5, 0xff, 0xbb, 0x6e, 0x09, 0x6e, 0x1f, 0x00, 0x2e, 0x85, 0x00, 0x96, \n  0x8b, 0xfe, 0x74, 0xf6, 0xfc, 0xde, 0x78, 0xff, 0xf2, 0x81, 0xf9, 0xfe, 0xaf, 0xfc, 0x2d, 0x69, \n  0xff, 0x52, 0x66, 0xf9, 0x74, 0xac, 0xfd, 0x78, 0x64, 0xff, 0xbe, 0xf3, 0xfe, 0x74, 0x43, 0x01, \n  0x78, 0x35, 0x00, 0x96, 0xcc, 0xfe, 0x01, 0x48, 0x3a, 0x76, 0xda, 0x32, 0x43, 0xbf, 0xfe, 0x9b, \n  0x02, 0x11, 0x8c, 0x4c, 0xfd, 0x09, 0x8c, 0xfb, 0x96, 0x23, 0x02, 0x8c, 0x25, 0xf8, 0xc9, 0xb4, \n  0xed, 0x56, 0x30, 0xf0, 0x81, 0xbb, 0x0f, 0xe9, 0x68, 0x01, 0x48, 0x9b, 0xfa, 0xdf, 0x94, 0xfd, \n  0xda, 0xab, 0xe7, 0x40, 0x80, 0xf7, 0xd2, 0x4b, 0x09, 0x67, 0x2c, 0x01, 0x9c, 0xf7, 0xff, 0xf9, \n  0x48, 0x01, 0xb9, 0x4c, 0xfd, 0x06, 0x79, 0xfc, 0xdf, 0x66, 0xfa, 0x34, 0xb0, 0xfc, 0x76, 0xc8, \n  0x00, 0x4c, 0xb0, 0xfb, 0xfd, 0xf3, 0xfb, 0x33, 0x86, 0xff, 0x06, 0x30, 0xff, 0xf3, 0xc8, 0x00, \n  0xf1, 0x2d, 0x00, 0x5a, 0xf5, 0xfe, 0x81, 0x88, 0x36, 0xf8, 0x72, 0x2f, 0x0d, 0x92, 0xfe, 0xc5, \n  0xa1, 0x12, 0x88, 0x21, 0x00, 0x7b, 0x8f, 0xfb, 0xf8, 0x0a, 0x01, 0x4f, 0xf7, 0xf6, 0xff, 0xa9, \n  0xf2, 0x26, 0xd1, 0xf1, 0x87, 0x43, 0x0c, 0x70, 0x25, 0x04, 0xaf, 0x8d, 0xf7, 0x7c, 0xfa, 0xff, \n  0x54, 0x59, 0xee, 0x81, 0x50, 0xf1, 0xbc, 0x1a, 0x07, 0xad, 0x20, 0x02, 0xb7, 0x21, 0xfe, 0xdf, \n  0x39, 0x02, 0x79, 0xca, 0xfe, 0x99, 0xef, 0xfb, 0xa6, 0x65, 0xfa, 0x35, 0x4f, 0xfd, 0xd4, 0xc6, \n  0x01, 0x23, 0x62, 0xfd, 0xb2, 0x4d, 0xfa, 0xc4, 0x57, 0xff, 0xe3, 0xf6, 0xff, 0x66, 0x3c, 0x00, \n  0x75, 0x76, 0x00, 0x49, 0x27, 0xff, 0xdd, 0x75, 0x32, 0x27, 0xf4, 0x2a, 0xda, 0xc3, 0xff, 0xac, \n  0x6c, 0x14, 0x17, 0x0f, 0x01, 0xf0, 0x8f, 0xfa, 0x31, 0xb2, 0x01, 0x28, 0x29, 0xfa, 0x53, 0xbb, \n  0xf2, 0xa7, 0xfb, 0xf0, 0xa8, 0x6c, 0x0b, 0x85, 0x31, 0x06, 0x0b, 0xe4, 0xf6, 0x94, 0xe9, 0xff, \n  0x0b, 0x76, 0xf4, 0x5b, 0x89, 0xef, 0x43, 0x11, 0x04, 0xff, 0xb9, 0x02, 0x4b, 0x80, 0xfc, 0x89, \n  0xc8, 0x00, 0xb1, 0xdd, 0xfe, 0xf4, 0x78, 0xfd, 0xad, 0x41, 0xfc, 0xf5, 0xb5, 0xfc, 0x22, 0xc6, \n  0x00, 0xc4, 0x69, 0xfe, 0x39, 0x9a, 0xfa, 0x77, 0xc2, 0xff, 0xac, 0x19, 0x00, 0xf9, 0xca, 0xff, \n  0xef, 0xe3, 0x00, 0x7a, 0xca, 0xfe, 0x45, 0xbd, 0x2c, 0x9e, 0x95, 0x26, 0xbb, 0x35, 0x02, 0x0b, \n  0xf1, 0x15, 0xa6, 0x82, 0x01, 0xf8, 0xb2, 0xf9, 0xa9, 0x40, 0x03, 0x4f, 0x74, 0xfd, 0xcf, 0xd7, \n  0xf3, 0xf9, 0xe0, 0xef, 0xd5, 0x87, 0x07, 0x9c, 0xf0, 0x07, 0x02, 0x1f, 0xf9, 0x17, 0x80, 0xff, \n  0x70, 0x6a, 0xf8, 0x88, 0x26, 0xf0, 0x97, 0x4e, 0x02, 0x2d, 0xe9, 0x02, 0x34, 0x43, 0xfb, 0x7c, \n  0x58, 0xff, 0xf6, 0x08, 0xfe, 0x2a, 0xc7, 0xfd, 0x0c, 0xa5, 0xfe, 0xcb, 0xfc, 0xfc, 0x0c, 0xc7, \n  0xfe, 0x8f, 0xeb, 0xfe, 0xbf, 0x32, 0xfc, 0x1d, 0x52, 0x00, 0xa8, 0x55, 0x00, 0x26, 0x78, 0xff, \n  0x68, 0x8d, 0x00, 0x14, 0xc3, 0xfe, 0x41, 0x4f, 0x2b, 0x2e, 0xac, 0x21, 0x55, 0xf3, 0x01, 0x62, \n  0xbe, 0x1b, 0x40, 0x4a, 0x00, 0x7a, 0xb3, 0xf6, 0x7d, 0x61, 0x06, 0xd1, 0x14, 0x01, 0x92, 0xf9, \n  0xf3, 0x89, 0xfe, 0xec, 0x47, 0x63, 0x05, 0x77, 0x58, 0x09, 0x89, 0x1b, 0xfa, 0x6f, 0x2b, 0x02, \n  0x77, 0xa9, 0xf9, 0xb2, 0x36, 0xed, 0xbc, 0xa4, 0x03, 0x5a, 0xc8, 0x03, 0x88, 0x7f, 0xf9, 0x18, \n  0x39, 0xff, 0xb5, 0x71, 0xfc, 0x66, 0x71, 0xfc, 0xc0, 0x8c, 0xff, 0x98, 0x16, 0xfd, 0xd5, 0x98, \n  0xff, 0x92, 0x70, 0xff, 0x73, 0xe1, 0xfb, 0xbe, 0x06, 0x02, 0x51, 0x32, 0x01, 0x67, 0xda, 0xfe, \n  0x68, 0xf7, 0xff, 0x92, 0xb7, 0xfe, 0xc3, 0x75, 0x24, 0x72, 0x29, 0x21, 0x7c, 0x0e, 0x08, 0xba, \n  0xaf, 0x18, 0x8d, 0x19, 0xff, 0x69, 0x1e, 0xf6, 0x4a, 0x65, 0x05, 0x72, 0xe6, 0xfe, 0xb6, 0x89, \n  0xf7, 0xd1, 0x9b, 0xf1, 0x2d, 0x0a, 0xff, 0x7b, 0x7c, 0x06, 0xa2, 0x5e, 0xfd, 0x19, 0xba, 0x03, \n  0x65, 0xed, 0xfc, 0xa9, 0x57, 0xef, 0xca, 0xe4, 0xfd, 0x71, 0xc7, 0x03, 0xbf, 0xe7, 0xfe, 0xe0, \n  0x63, 0xff, 0xa8, 0xf9, 0xfb, 0x88, 0x18, 0xfd, 0x80, 0xc6, 0xff, 0xc6, 0x70, 0xfe, 0xd9, 0xe9, \n  0xff, 0xf6, 0x28, 0xff, 0x2d, 0x8c, 0xfc, 0x1e, 0x1d, 0x00, 0xab, 0xe0, 0x00, 0xd1, 0xe0, 0xfe, \n  0xe1, 0xd8, 0xff, 0x7d, 0x58, 0xff, 0x2a, 0x0d, 0x20, 0x7e, 0xbc, 0x1e, 0x29, 0x51, 0x08, 0xcb, \n  0x46, 0x16, 0xb6, 0xab, 0x00, 0xca, 0x6b, 0xf9, 0x42, 0xf4, 0x04, 0x46, 0x1c, 0xfe, 0xd3, 0x26, \n  0xf9, 0x9f, 0x01, 0xf3, 0xe0, 0x0e, 0xfe, 0x1d, 0xe8, 0x04, 0x5a, 0xe3, 0xfd, 0xd5, 0xfd, 0x02, \n  0xa0, 0xd7, 0xfe, 0x4e, 0xf3, 0xf2, 0xe0, 0x37, 0xfc, 0x29, 0x5c, 0x04, 0x61, 0xe7, 0xff, 0x7f, \n  0xaf, 0xfd, 0xe4, 0xb3, 0xfc, 0x1a, 0x39, 0xfe, 0x17, 0xbe, 0xff, 0x7a, 0x16, 0xfe, 0x92, 0xa3, \n  0xfe, 0x10, 0x3b, 0xff, 0x1a, 0x4a, 0xfe, 0x11, 0xaa, 0xff, 0xf7, 0x55, 0xff, 0x45, 0xc1, 0xfe, \n  0x92, 0x69, 0x00, 0x56, 0x95, 0xff, 0x75, 0x7f, 0x1c, 0x39, 0x7d, 0x1b, 0xd5, 0x7d, 0x08, 0x16, \n  0x79, 0x12, 0xdd, 0x3b, 0x02, 0x06, 0xe1, 0xfd, 0x1c, 0x4a, 0x03, 0x3e, 0xc0, 0xfd, 0x26, 0x31, \n  0xfa, 0xfd, 0xa8, 0xf4, 0x64, 0x26, 0xfe, 0xc7, 0x53, 0x03, 0x8b, 0x94, 0xfe, 0x01, 0x68, 0x02, \n  0x72, 0xc6, 0xff, 0x26, 0x96, 0xf5, 0x30, 0xd8, 0xfc, 0x33, 0xac, 0x04, 0xed, 0xbe, 0xff, 0xad, \n  0x99, 0xfd, 0xbb, 0xad, 0xfd, 0x2d, 0x05, 0xff, 0x0d, 0x7e, 0xff, 0x61, 0x92, 0xfd, 0xc6, 0xbe, \n  0xfd, 0xb1, 0x01, 0xff, 0x0d, 0xd7, 0xfe, 0x33, 0xe0, 0xfe, 0x71, 0xe8, 0xfe, 0xfb, 0x76, 0xff, \n  0xfd, 0xaa, 0x00, 0xd7, 0xca, 0xff, 0x8e, 0x9b, 0x19, 0xd8, 0x57, 0x19, 0x86, 0xe0, 0x07, 0xde, \n  0x09, 0x0f, 0x74, 0x43, 0x04, 0xcf, 0x31, 0x00, 0x46, 0xde, 0x01, 0x13, 0xae, 0xfd, 0x2f, 0x69, \n  0xfa, 0xf2, 0x65, 0xf6, 0xcb, 0x3c, 0xfe, 0xbe, 0x65, 0x02, 0x47, 0x04, 0xff, 0xe5, 0x2f, 0x02, \n  0xf8, 0x5f, 0x00, 0x3c, 0xf1, 0xf6, 0x83, 0xa7, 0xfd, 0x5a, 0xcb, 0x04, 0xa4, 0x81, 0xff, 0x91, \n  0xb1, 0xfd, 0xbc, 0x64, 0xfe, 0xb0, 0x0b, 0xff, 0xb7, 0x3a, 0xff, 0xd5, 0x84, 0xfd, 0xe7, 0x36, \n  0xfd, 0x96, 0xbd, 0xfe, 0xca, 0x8d, 0xfe, 0xfb, 0xcb, 0xfe, 0xda, 0x8d, 0xff, 0x01, 0xa2, 0xff, \n  0xb1, 0x53, 0x00, 0x31, 0xf2, 0xff, 0x79, 0xfe, 0x15, 0xe6, 0x22, 0x17, 0xa1, 0xe7, 0x06, 0x26, \n  0xc1, 0x0c, 0xd5, 0x9e, 0x06, 0x64, 0xcf, 0x00, 0x3a, 0x1a, 0x01, 0x70, 0x11, 0xfe, 0x81, 0x07, \n  0xfb, 0xd2, 0xa4, 0xf8, 0xae, 0x2e, 0xfe, 0xe1, 0x86, 0x01, 0x00, 0x1c, 0x00, 0x76, 0xc4, 0x02, \n  0x65, 0x3c, 0x00, 0xc8, 0x93, 0xf8, 0x04, 0x0b, 0xff, 0x2e, 0x4c, 0x04, 0x74, 0x72, 0xff, 0xe1, \n  0xb6, 0xfd, 0x5b, 0xb0, 0xfe, 0x66, 0xa8, 0xff, 0xc1, 0x0b, 0xff, 0x2b, 0x76, 0xfd, 0xb6, 0x63, \n  0xfd, 0x53, 0x2d, 0xff, 0x12, 0xae, 0xfe, 0xc9, 0x8a, 0xfe, 0xeb, 0xe8, 0xff, 0x99, 0x0f, 0x00, \n  0xa0, 0x54, 0x00, 0x9f, 0xc7, 0xff, 0xf6, 0x55, 0x13, 0x63, 0x48, 0x14, 0xf2, 0x5a, 0x06, 0x73, \n  0x46, 0x0c, 0x10, 0xf0, 0x06, 0x45, 0x67, 0x00, 0x7d, 0xd3, 0x00, 0x8f, 0x76, 0xfe, 0xec, 0xdf, \n  0xfb, 0x80, 0x50, 0xfa, 0xb0, 0xe4, 0xfd, 0xb4, 0xbd, 0x00, 0xb2, 0x15, 0x01, 0xcc, 0x25, 0x03, \n  0xcf, 0x2a, 0x00, 0xf3, 0x22, 0xfa, 0xa8, 0x9f, 0xff, 0x25, 0xeb, 0x02, 0xcd, 0x13, 0xff, 0x8c, \n  0x39, 0xfe, 0xa9, 0x17, 0xff, 0x30, 0x8b, 0xff, 0xd8, 0xe0, 0xfe, 0x1c, 0xf1, 0xfd, 0xe1, 0x1f, \n  0xfe, 0xa5, 0xa2, 0xff, 0x24, 0x73, 0xfe, 0x03, 0x3f, 0xfe, 0x90, 0xd6, 0xff, 0x50, 0x2d, 0x00, \n  0x40, 0x51, 0x00, 0xed, 0x8f, 0xff, 0xd8, 0x22, 0x10, 0xc4, 0xf7, 0x11, 0x45, 0x58, 0x06, 0xd7, \n  0x4a, 0x0b, 0x66, 0x90, 0x06, 0x6e, 0xa5, 0x00, 0x69, 0xf0, 0x00, 0x84, 0xb9, 0xfe, 0xcf, 0xcd, \n  0xfc, 0xbf, 0x8a, 0xfb, 0xba, 0xa7, 0xfd, 0x2e, 0x45, 0x00, 0xfe, 0x4f, 0x02, 0x89, 0xa0, 0x03, \n  0x27, 0x17, 0x00, 0x50, 0x8f, 0xfb, 0xac, 0x2e, 0xff, 0xa9, 0xc0, 0x01, 0x4e, 0x7c, 0xff, 0x67, \n  0x94, 0xfe, 0xe6, 0x04, 0xff, 0x99, 0x7c, 0xff, 0x90, 0x85, 0xff, 0xa1, 0xe9, 0xfe, 0x88, 0xab, \n  0xfe, 0xa9, 0x4d, 0xff, 0xca, 0xeb, 0xfd, 0x8d, 0x55, 0xfe, 0x39, 0xfe, 0xff, 0xd9, 0xfa, 0xff, \n  0xdd, 0x25, 0x00, 0xcf, 0xaa, 0xff, 0x6b, 0x65, 0x0c, 0xfc, 0xba, 0x0f, 0x67, 0xfd, 0x06, 0xe4, \n  0x29, 0x09, 0x85, 0xda, 0x05, 0x57, 0x22, 0x02, 0x90, 0x80, 0x01, 0xb5, 0xc8, 0xfe, 0x78, 0x53, \n  0xfd, 0xe2, 0xe2, 0xfc, 0x95, 0xb9, 0xfe, 0xba, 0x21, 0x01, 0x6c, 0x38, 0x03, 0x0c, 0x78, 0x03, \n  0x8d, 0x3d, 0x00, 0xd7, 0xf4, 0xfc, 0x43, 0x43, 0xff, 0x7e, 0x05, 0x01, 0xdb, 0x93, 0xff, 0xf6, \n  0xe4, 0xfe, 0xcb, 0x6b, 0xff, 0x21, 0x63, 0x00, 0x61, 0x3b, 0x00, 0xeb, 0x15, 0xff, 0x52, 0x6f, \n  0xfe, 0x1b, 0x17, 0xff, 0xcf, 0x91, 0xfe, 0xa2, 0xb3, 0xfe, 0x6d, 0xef, 0xff, 0x03, 0xd4, 0xff, \n  0xff, 0xfd, 0xff, 0x37, 0x0d, 0x00, 0x25, 0x6c, 0x09, 0x80, 0x47, 0x0c, 0x86, 0xe1, 0x07, 0x64, \n  0xa8, 0x08, 0x8e, 0x62, 0x05, 0x64, 0xc4, 0x02, 0x7d, 0x5c, 0x01, 0x3b, 0x86, 0xff, 0xc4, 0x79, \n  0xfe, 0x44, 0x67, 0xfe, 0xed, 0xcd, 0xff, 0x39, 0x4e, 0x01, 0xe5, 0xae, 0x03, 0x88, 0xd8, 0x03, \n  0x4b, 0x92, 0x00, 0x27, 0xf8, 0xfd, 0xdc, 0x5c, 0xff, 0xa6, 0x3d, 0x00, 0xb8, 0x88, 0xff, 0x4b, \n  0x6e, 0xff, 0x04, 0x31, 0x00, 0x42, 0x7e, 0x00, 0xb6, 0xbd, 0xff, 0x2e, 0x5c, 0xff, 0x63, 0x23, \n  0xff, 0x06, 0x4e, 0xff, 0x56, 0xbf, 0xfe, 0xb8, 0xe5, 0xfe, 0x78, 0xb8, 0xff, 0xef, 0xea, 0xff, \n  0xcd, 0x10, 0x00, 0xae, 0xfc, 0xff, 0xb8, 0x2c, 0x07, 0x71, 0x03, 0x0a, 0x61, 0x6b, 0x07, 0xcf, \n  0x13, 0x07, 0x88, 0xaf, 0x04, 0x78, 0x1e, 0x03, 0x01, 0x3b, 0x02, 0x0a, 0x3c, 0x00, 0x15, 0x03, \n  0x00, 0xb2, 0x9f, 0x00, 0xfd, 0x58, 0x01, 0x73, 0x59, 0x02, 0x6d, 0x9f, 0x03, 0x05, 0xfe, 0x03, \n  0x2f, 0xdf, 0x00, 0xd2, 0x51, 0xfe, 0xf7, 0x0b, 0xff, 0xb7, 0xbe, 0xff, 0x35, 0x4c, 0x00, 0x48, \n  0x15, 0x00, 0xc8, 0xd2, 0xff, 0x09, 0x48, 0x00, 0x58, 0x4b, 0x00, 0xf8, 0xd6, 0xff, 0x80, 0x4d, \n  0xff, 0xf8, 0x4e, 0xff, 0xaa, 0x16, 0xff, 0x63, 0x21, 0xff, 0xbe, 0xdc, 0xff, 0xfe, 0x17, 0x00, \n  0xa6, 0x00, 0x00, 0x4b, 0xb6, 0xff, 0x96, 0x59, 0x06, 0x1b, 0x85, 0x08, 0x03, 0x44, 0x06, 0x2c, \n  0x78, 0x05, 0xe1, 0x2d, 0x04, 0xb8, 0x96, 0x03, 0x9d, 0x50, 0x03, 0xea, 0x6e, 0x02, 0x63, 0x3d, \n  0x01, 0xca, 0xd6, 0x01, 0xd1, 0xb9, 0x02, 0x88, 0xfd, 0x02, 0x09, 0x8b, 0x03, 0x54, 0xf8, 0x02, \n  0xbc, 0x2e, 0x00, 0x82, 0x85, 0xfe, 0x79, 0xaf, 0xff, 0xb2, 0x45, 0x00, 0xc6, 0x6b, 0x00, 0xd2, \n  0xfc, 0xff, 0xad, 0xd5, 0xff, 0x5d, 0x52, 0x00, 0x84, 0x6f, 0x00, 0x19, 0x02, 0x00, 0x5f, 0x65, \n  0xff, 0xba, 0x87, 0xff, 0x7f, 0x92, 0xff, 0xf2, 0xbc, 0xff, 0xb2, 0x0d, 0x00, 0xfe, 0x06, 0x00, \n  0xf5, 0x87, 0xff, 0xed, 0xf9, 0xfe, 0x6b, 0x17, 0x05, 0x16, 0xa4, 0x06, 0x11, 0xf2, 0x04, 0x30, \n  0x74, 0x05, 0x7e, 0x1b, 0x05, 0x64, 0x6b, 0x04, 0xba, 0x6d, 0x04, 0xc2, 0x4e, 0x04, 0xc0, 0x7b, \n  0x03, 0x26, 0x99, 0x02, 0x6e, 0x34, 0x02, 0xd6, 0x40, 0x02, 0xa9, 0x70, 0x02, 0x7d, 0xfe, 0x01, \n  0x83, 0x6d, 0x00, 0x73, 0x91, 0xff, 0x56, 0x33, 0x00, 0xd0, 0x13, 0x00, 0x8b, 0xcf, 0xff, 0x1a, \n  0xe5, 0xff, 0x5e, 0xe1, 0xff, 0x82, 0x39, 0x00, 0xb2, 0x9d, 0x00, 0xbf, 0x7f, 0x00, 0x24, 0xe2, \n  0xff, 0x9e, 0xc7, 0xff, 0x99, 0xaf, 0xff, 0xf5, 0xc7, 0xff, 0xce, 0xf0, 0xff, 0xa1, 0x6b, 0xff, \n  0x80, 0x04, 0xff, 0x40, 0xd9, 0xfe, 0xe0, 0x9c, 0x04, 0x5f, 0x3e, 0x07, 0xb9, 0xb6, 0x05, 0x69, \n  0xc2, 0x06, 0x1f, 0xe8, 0x06, 0x69, 0x0c, 0x05, 0xd2, 0x17, 0x04, 0x05, 0x5d, 0x03, 0x97, 0xd8, \n  0x02, 0xac, 0xbc, 0x02, 0x00, 0x35, 0x02, 0x03, 0x79, 0x01, 0x48, 0xf0, 0x00, 0x3d, 0x41, 0x01, \n  0x44, 0x3b, 0x01, 0xb8, 0x60, 0x00, 0xf7, 0x09, 0x00, 0x76, 0x99, 0xff, 0xe1, 0x46, 0xff, 0xbe, \n  0xae, 0xff, 0x9e, 0x57, 0x00, 0xb6, 0xb3, 0x00, 0x44, 0xbb, 0x00, 0xbf, 0xd8, 0x00, 0x39, 0x92, \n  0x00, 0x2c, 0xb6, 0xff, 0xb1, 0x5d, 0xff, 0x91, 0x45, 0xff, 0xaa, 0x32, 0xff, 0xe9, 0x16, 0xff, \n  0x53, 0xf7, 0xfe, 0xbd, 0x34, 0xff, 0x0c, 0x4e, 0x05, 0x47, 0x6f, 0x09, 0xd0, 0xfe, 0x07, 0xf6, \n  0x1d, 0x07, 0xa4, 0xf9, 0x05, 0x97, 0x38, 0x05, 0x3b, 0x2c, 0x04, 0xe7, 0x41, 0x02, 0x5f, 0x2e, \n  0x01, 0x71, 0x24, 0x01, 0xf7, 0x49, 0x01, 0x5f, 0xa8, 0x01, 0xde, 0xd6, 0x01, 0xf9, 0x7c, 0x01, \n  0xfa, 0xfc, 0x00, 0x90, 0xda, 0xff, 0x2f, 0x4f, 0xff, 0xbb, 0x7b, 0xff, 0x51, 0xfd, 0xff, 0xfd, \n  0x06, 0x00, 0x1b, 0x2c, 0x00, 0x52, 0xdf, 0x00, 0x3a, 0xc1, 0x00, 0x6d, 0xb5, 0x00, 0x91, 0xa4, \n  0x00, 0x9d, 0xde, 0xff, 0xe4, 0x0e, 0xff, 0x21, 0xb6, 0xfe, 0xcb, 0x93, 0xfe, 0x65, 0x08, 0xff, \n  0x84, 0x58, 0xff, 0xc7, 0x5f, 0xff, 0xe2, 0x2c, 0x06, 0xe4, 0xdc, 0x09, 0x00, 0xd8, 0x07, 0x57, \n  0xb6, 0x06, 0xd0, 0xcb, 0x05, 0x5d, 0x6c, 0x05, 0x4f, 0x6e, 0x04, 0xe1, 0x3b, 0x02, 0xa8, 0x5c, \n  0x00, 0xf7, 0xa7, 0xff, 0xf7, 0xa1, 0x00, 0x4a, 0x24, 0x02, 0x5e, 0xe2, 0x01, 0xc3, 0x4b, 0x01, \n  0x34, 0x18, 0x01, 0x3f, 0x5c, 0x00, 0x6a, 0x2c, 0x00, 0x28, 0xe0, 0xff, 0x9b, 0x9f, 0xff, 0x88, \n  0xb3, 0xff, 0x3b, 0x49, 0x00, 0xe8, 0x6f, 0x00, 0xd2, 0x11, 0x00, 0xed, 0xa6, 0x00, 0x78, 0x52, \n  0x01, 0xa6, 0xae, 0x00, 0x05, 0x1c, 0xff, 0x0a, 0x4d, 0xfe, 0x1a, 0x76, 0xfe, 0xaa, 0xd5, 0xfe, \n  0x52, 0x2b, 0xff, 0x44, 0x84, 0xff, 0x46, 0x30, 0x06, 0x07, 0x9a, 0x09, 0x93, 0x88, 0x06, 0xbb, \n  0xd7, 0x05, 0xc8, 0xb2, 0x05, 0x51, 0x77, 0x05, 0x45, 0x9e, 0x04, 0xa2, 0x31, 0x02, 0xb7, 0x18, \n  0x00, 0xef, 0xaa, 0x00, 0x11, 0xcd, 0x01, 0x4a, 0x18, 0x01, 0x69, 0x87, 0x00, 0x8d, 0xcc, 0x00, \n  0x41, 0xd3, 0x00, 0x87, 0x3e, 0x01, 0x46, 0xad, 0x01, 0xa3, 0x75, 0x00, 0xf6, 0xba, 0xff, 0xdf, \n  0xbb, 0xff, 0xfa, 0xd0, 0xff, 0x1c, 0xea, 0xff, 0x48, 0xed, 0xff, 0x68, 0x42, 0x00, 0xfc, 0x6e, \n  0x00, 0xc9, 0x1b, 0x01, 0x4d, 0xbd, 0x00, 0xaa, 0x18, 0xff, 0xef, 0x43, 0xfe, 0x3c, 0x67, 0xfe, \n  0xc2, 0xe8, 0xfe, 0xd4, 0x58, 0xff, 0xb2, 0x6a, 0x07, 0x78, 0x8d, 0x0a, 0xf6, 0xe3, 0x05, 0xbb, \n  0x7e, 0x04, 0x68, 0xd7, 0x03, 0xe1, 0x6b, 0x04, 0x04, 0x63, 0x04, 0x84, 0x4a, 0x02, 0x83, 0x88, \n  0xff, 0x85, 0x3c, 0x00, 0x5c, 0xf2, 0x02, 0x4b, 0x7e, 0x02, 0x2a, 0x20, 0x01, 0x4f, 0x78, 0xff, \n  0xe9, 0x20, 0xff, 0xea, 0x10, 0x01, 0x28, 0xfd, 0x01, 0x77, 0x92, 0x01, 0x66, 0x58, 0x01, 0xd8, \n  0x0a, 0x00, 0x7b, 0xa0, 0xff, 0x1c, 0x4d, 0x00, 0xf1, 0xb3, 0xff, 0xeb, 0x55, 0xff, 0x26, 0x1b, \n  0x00, 0x45, 0x63, 0x00, 0x39, 0x64, 0x00, 0x26, 0xb1, 0x00, 0x77, 0xfc, 0xff, 0x38, 0x19, 0xff, \n  0x55, 0x7e, 0xfe, 0xf2, 0x7c, 0xfe, 0x06, 0xa3, 0x08, 0x81, 0x7f, 0x0c, 0x26, 0xf2, 0x05, 0xe1, \n  0x14, 0x04, 0x47, 0x08, 0x03, 0x60, 0xb1, 0x03, 0x36, 0x5a, 0x03, 0x4f, 0xa4, 0x00, 0x74, 0x13, \n  0xfe, 0xda, 0xe2, 0xfe, 0x30, 0xb7, 0x03, 0x7c, 0xd1, 0x03, 0xb2, 0x3e, 0x01, 0x9f, 0xe5, 0xff, \n  0xd0, 0xc2, 0xff, 0xd6, 0x11, 0x00, 0x7b, 0xff, 0x00, 0x82, 0x88, 0x01, 0x4c, 0x3f, 0x01, 0x7f, \n  0xf5, 0x00, 0x2a, 0xbb, 0x00, 0xbc, 0x63, 0x00, 0xb0, 0xca, 0xff, 0xb0, 0xdd, 0xff, 0x95, 0x91, \n  0xff, 0xcb, 0x46, 0xff, 0x2a, 0xfb, 0xff, 0x2d, 0x8a, 0x00, 0xbe, 0xee, 0x00, 0xd2, 0x9f, 0x00, \n  0x83, 0x62, 0xff, 0x89, 0x69, 0xfe, 0xcd, 0x0a, 0x0b, 0xa7, 0xdb, 0x0e, 0x6a, 0xfb, 0x05, 0x9c, \n  0xb2, 0x04, 0x6a, 0xdb, 0x02, 0x9c, 0x1f, 0x03, 0xa4, 0x87, 0x02, 0x33, 0xc7, 0xfe, 0xc2, 0x5b, \n  0xfb, 0xe3, 0xd9, 0xfc, 0x70, 0x26, 0x04, 0x05, 0xd1, 0x03, 0xa1, 0xb8, 0x00, 0x50, 0x29, 0x00, \n  0x47, 0x11, 0x00, 0x29, 0xe4, 0x00, 0xe5, 0xce, 0x01, 0xcc, 0xa1, 0x00, 0x54, 0x4f, 0x00, 0x90, \n  0x69, 0x01, 0x0d, 0xc6, 0x00, 0xc7, 0xc2, 0x00, 0x93, 0x9e, 0x00, 0x37, 0xbd, 0xff, 0x7d, 0xf9, \n  0xff, 0xef, 0xbf, 0xff, 0xb4, 0x4d, 0xff, 0x7c, 0xfd, 0xff, 0x6b, 0xb8, 0x00, 0x3d, 0x67, 0x01, \n  0x4d, 0x85, 0x00, 0x7f, 0x2a, 0xff, 0x8e, 0xb0, 0x0d, 0x11, 0x44, 0x11, 0x91, 0xb0, 0x05, 0x79, \n  0x5d, 0x05, 0xea, 0xb9, 0x02, 0xf9, 0xfc, 0x02, 0xdb, 0x57, 0x02, 0x30, 0x63, 0xfd, 0xf2, 0x56, \n  0xf9, 0xfa, 0x52, 0xfb, 0x7e, 0xc4, 0x04, 0x42, 0x6b, 0x03, 0x08, 0x2d, 0xff, 0x59, 0x21, 0xff, \n  0x9c, 0xb3, 0xff, 0x5d, 0x6b, 0x01, 0x2d, 0x67, 0x02, 0xbb, 0xfd, 0x00, 0xe3, 0x0f, 0x01, 0x5c, \n  0x10, 0x01, 0x8e, 0x26, 0x00, 0x35, 0x0a, 0x01, 0xf1, 0x29, 0x00, 0xb3, 0x0a, 0x00, 0x61, 0x65, \n  0x00, 0x43, 0xcf, 0xff, 0x7b, 0xa5, 0xff, 0xf0, 0x9b, 0x00, 0x66, 0x77, 0x00, 0xeb, 0x06, 0x00, \n  0x40, 0x95, 0x00, 0x13, 0x5f, 0x00, 0xf6, 0xf9, 0x10, 0xdb, 0x45, 0x13, 0xf4, 0xfc, 0x04, 0x34, \n  0x81, 0x06, 0x38, 0x88, 0x02, 0x9f, 0x3c, 0x03, 0x61, 0x89, 0x02, 0xe6, 0x0f, 0xfc, 0x25, 0x0f, \n  0xf7, 0x9a, 0x52, 0xfa, 0x04, 0x23, 0x06, 0xce, 0xfb, 0x02, 0xe4, 0x86, 0xfd, 0x52, 0xf8, 0xfd, \n  0x01, 0xeb, 0xfe, 0xb3, 0xeb, 0x00, 0xd5, 0x6c, 0x02, 0x15, 0xee, 0x00, 0x6d, 0x64, 0x01, 0x24, \n  0x0d, 0x02, 0x41, 0x14, 0x00, 0x08, 0x8b, 0x00, 0xad, 0x2d, 0x00, 0x35, 0xf8, 0xff, 0x98, 0x6c, \n  0x00, 0x7c, 0xfe, 0xff, 0x48, 0x30, 0x00, 0xa2, 0xd5, 0x00, 0xef, 0x11, 0x00, 0xf1, 0x1e, 0x00, \n  0x4b, 0x01, 0x00, 0x31, 0x05, 0x00, 0xa8, 0xfb, 0x15, 0x42, 0xb8, 0x15, 0x45, 0x1a, 0x03, 0xa3, \n  0xe2, 0x07, 0xcd, 0x03, 0x02, 0xdb, 0x7c, 0x03, 0x16, 0x82, 0x02, 0x66, 0x26, 0xfa, 0x2f, 0xd8, \n  0xf4, 0xad, 0xd3, 0xf9, 0xe8, 0xeb, 0x07, 0xa1, 0x0f, 0x02, 0x8d, 0xf8, 0xfb, 0x75, 0xf2, 0xfc, \n  0x08, 0x29, 0xfe, 0x73, 0x56, 0x00, 0x91, 0xb3, 0x01, 0xb5, 0x3d, 0x00, 0xb1, 0x4f, 0x01, 0x7d, \n  0xaa, 0x01, 0xad, 0xc4, 0xff, 0xb6, 0x17, 0x01, 0x13, 0x52, 0x00, 0x6b, 0xb4, 0xff, 0x91, 0x30, \n  0x00, 0x38, 0x27, 0x00, 0xfe, 0xc7, 0xff, 0x13, 0xee, 0x00, 0x70, 0x3b, 0x00, 0x01, 0xed, 0xff, \n  0xab, 0x38, 0x00, 0x3b, 0xb1, 0xff, 0xdb, 0xee, 0x1a, 0x60, 0x21, 0x18, 0x81, 0x9c, 0x00, 0xf3, \n  0x4b, 0x09, 0x4e, 0x94, 0x01, 0x6b, 0x3c, 0x03, 0xf7, 0x73, 0x02, 0x04, 0x09, 0xf8, 0x2e, 0x7e, \n  0xf3, 0xb5, 0x7d, 0xfa, 0xc3, 0x5b, 0x09, 0x9c, 0xd8, 0x00, 0x88, 0xc1, 0xfa, 0xe5, 0x40, 0xfc, \n  0x07, 0xf4, 0xfd, 0x6a, 0xf0, 0xff, 0x14, 0x60, 0x01, 0x69, 0xa8, 0xff, 0x20, 0xcd, 0x00, 0xa2, \n  0x90, 0x01, 0x80, 0xca, 0xfe, 0x5a, 0xfe, 0x00, 0x98, 0x75, 0x00, 0xe5, 0x2d, 0x00, 0x95, 0xce, \n  0xff, 0x10, 0x47, 0xff, 0x7c, 0xdd, 0xff, 0x48, 0xdc, 0x00, 0x00, 0x59, 0x00, 0x9b, 0x79, 0x00, \n  0xc0, 0x6e, 0x00, 0x40, 0xc1, 0xff, 0x7d, 0x2c, 0x20, 0x32, 0xb9, 0x1b, 0x30, 0xca, 0xfd, 0xcd, \n  0x81, 0x0a, 0x94, 0xac, 0x01, 0x21, 0x6a, 0x02, 0x6b, 0x96, 0x02, 0x9a, 0x7e, 0xf5, 0xd7, 0x09, \n  0xf2, 0x45, 0x31, 0xfb, 0x6d, 0x80, 0x0a, 0x39, 0x52, 0x00, 0xb7, 0xd9, 0xf9, 0x5b, 0x02, 0xfb, \n  0xee, 0xe4, 0xfd, 0xac, 0x1a, 0x00, 0xd8, 0x59, 0x00, 0x62, 0xc8, 0xff, 0xf4, 0x69, 0x00, 0x2e, \n  0xda, 0x00, 0x39, 0xa3, 0xfe, 0xaa, 0xeb, 0x00, 0x40, 0x08, 0x00, 0x1c, 0x8a, 0xff, 0x9f, 0x65, \n  0xff, 0x7f, 0x40, 0xff, 0xb7, 0x6d, 0xff, 0x12, 0x7f, 0x00, 0xf5, 0x83, 0x00, 0x0f, 0x8a, 0x00, \n  0x67, 0x45, 0x01, 0xf9, 0x76, 0x00, 0xed, 0x1b, 0x24, 0xfa, 0x47, 0x1f, 0xd1, 0xfd, 0xfb, 0x59, \n  0xae, 0x0a, 0xfe, 0xe8, 0x01, 0x16, 0x02, 0x02, 0xd1, 0xb5, 0x02, 0x61, 0x7a, 0xf3, 0x7a, 0xe5, \n  0xf0, 0x75, 0xe9, 0xfb, 0x37, 0xb6, 0x0a, 0xa6, 0xc8, 0xff, 0xc2, 0xa5, 0xf9, 0x5c, 0x6c, 0xfa, \n  0x0c, 0xb1, 0xfd, 0x7d, 0xeb, 0xff, 0x5d, 0x5a, 0x00, 0x99, 0x86, 0xff, 0x80, 0x4a, 0x00, 0x17, \n  0x58, 0x01, 0x96, 0x3d, 0xfe, 0x97, 0x1e, 0x00, 0x41, 0x38, 0xff, 0x7b, 0xb0, 0xff, 0x00, 0xef, \n  0xfe, 0xa9, 0xc9, 0xfe, 0xe9, 0xb0, 0xff, 0x21, 0x88, 0x00, 0xea, 0x86, 0x00, 0x17, 0x9c, 0x00, \n  0xf4, 0x2f, 0x01, 0x6d, 0xeb, 0xff, 0x84, 0x3a, 0x27, 0xcf, 0x82, 0x23, 0xcc, 0xd0, 0xfb, 0x2f, \n  0x42, 0x0a, 0xa0, 0x29, 0x01, 0xe2, 0x47, 0x01, 0x28, 0x4e, 0x03, 0xc1, 0x73, 0xf1, 0x6c, 0x65, \n  0xf0, 0x32, 0xc3, 0xfb, 0xac, 0xb0, 0x08, 0x3d, 0x2e, 0x00, 0x9e, 0xbd, 0xfa, 0xe1, 0x10, 0xf9, \n  0x0e, 0xe6, 0xfc, 0xb3, 0x73, 0xff, 0xfc, 0x97, 0x00, 0x1e, 0x43, 0x01, 0x14, 0x4a, 0xff, 0xad, \n  0x76, 0x00, 0x26, 0x54, 0xfe, 0xb5, 0xd3, 0xff, 0x4a, 0x74, 0xfe, 0x24, 0xef, 0xfe, 0xed, 0x80, \n  0xfe, 0x1b, 0x99, 0xfe, 0x35, 0xb0, 0xff, 0xc6, 0x89, 0x00, 0xbb, 0xdc, 0x00, 0x50, 0x1d, 0x00, \n  0x40, 0xdf, 0x00, 0x8d, 0xaa, 0xff, 0x71, 0x35, 0x28, 0x9c, 0x45, 0x27, 0x65, 0x61, 0xfd, 0x86, \n  0x3a, 0x0a, 0xb8, 0x04, 0x01, 0x49, 0x37, 0xff, 0x09, 0x47, 0x04, 0x5d, 0x4e, 0xf1, 0xa1, 0xb0, \n  0xf0, 0x1e, 0x83, 0xfb, 0x07, 0x32, 0x05, 0x12, 0xfd, 0xff, 0xe6, 0xd9, 0xfc, 0xf2, 0x88, 0xf9, \n  0xc5, 0x85, 0xfb, 0x10, 0x56, 0xff, 0xdc, 0x6a, 0x00, 0x60, 0x2f, 0x02, 0x22, 0x89, 0xff, 0x11, \n  0xc6, 0xff, 0x7e, 0x30, 0xfe, 0x1d, 0x58, 0xff, 0x28, 0xb4, 0xfe, 0x3e, 0xf0, 0xfe, 0xfc, 0x51, \n  0xfe, 0x0c, 0xa0, 0xfe, 0xc7, 0x63, 0xff, 0x29, 0x81, 0xff, 0x66, 0xee, 0x00, 0x14, 0x82, 0x00, \n  0xf4, 0xfd, 0x00, 0x12, 0x79, 0xff, 0xd2, 0xf4, 0x28, 0x4e, 0xca, 0x29, 0x70, 0xda, 0xff, 0x57, \n  0xf3, 0x0a, 0x5d, 0x53, 0x01, 0x1e, 0xc5, 0xfc, 0x27, 0x69, 0x03, 0x5c, 0xfa, 0xf1, 0xf0, 0xc1, \n  0xf1, 0xe1, 0xfe, 0xfb, 0x85, 0x94, 0x00, 0xe6, 0x26, 0xff, 0xcb, 0xa1, 0xfe, 0x4d, 0xda, 0xfa, \n  0x1c, 0x77, 0xfc, 0x84, 0x85, 0xfd, 0x8b, 0x7b, 0xff, 0x7e, 0x94, 0x03, 0x41, 0xde, 0xff, 0xfc, \n  0x87, 0xfe, 0xc3, 0x25, 0xfe, 0x77, 0xbc, 0xff, 0x66, 0x1c, 0xff, 0x86, 0xdf, 0xfe, 0x84, 0xf2, \n  0xfd, 0xdd, 0x9b, 0xfe, 0x4c, 0x08, 0xff, 0xd2, 0xe7, 0xfe, 0x2a, 0x99, 0x00, 0x22, 0x36, 0x00, \n  0x70, 0xbf, 0x00, 0xd6, 0xb2, 0xff, 0x15, 0xc9, 0x29, 0x89, 0x65, 0x2b, 0xa7, 0x43, 0x02, 0x34, \n  0x17, 0x0d, 0xae, 0x34, 0x02, 0x6d, 0xa0, 0xfa, 0x70, 0x5e, 0x01, 0x47, 0x58, 0xf1, 0xf2, 0xd4, \n  0xf2, 0x79, 0xb9, 0xfe, 0x8b, 0x49, 0xfc, 0x71, 0x45, 0xfb, 0x5f, 0x1b, 0x01, 0x2f, 0x6c, 0xfd, \n  0x6f, 0x8a, 0xfd, 0xde, 0x80, 0xfc, 0x85, 0x62, 0xfd, 0x00, 0x8f, 0x03, 0x79, 0x59, 0x00, 0x21, \n  0xf0, 0xfe, 0xac, 0x31, 0xff, 0x76, 0x21, 0xff, 0x15, 0x75, 0xfe, 0xaa, 0x3c, 0xff, 0xe3, 0xa7, \n  0xfd, 0xf1, 0x4a, 0xfe, 0xdd, 0xef, 0xfe, 0x15, 0xbf, 0xfd, 0xf7, 0x27, 0x00, 0x1b, 0x57, 0x00, \n  0xaf, 0xb2, 0x00, 0x1e, 0x76, 0xff, 0x91, 0x62, 0x2b, 0xb9, 0xb9, 0x2b, 0x34, 0xc7, 0x02, 0xf7, \n  0xc7, 0x0f, 0x88, 0x7c, 0x03, 0x11, 0x9d, 0xf9, 0xd5, 0x43, 0xff, 0x1a, 0xd7, 0xef, 0x54, 0x85, \n  0xf4, 0x4b, 0x81, 0x01, 0x15, 0xb6, 0xf8, 0x0c, 0xa1, 0xf8, 0x3c, 0x0e, 0x02, 0x94, 0x1c, 0xff, \n  0x9e, 0xb4, 0xff, 0xcf, 0xb5, 0xfb, 0x29, 0x42, 0xfb, 0x2c, 0x74, 0x03, 0x10, 0x83, 0x01, 0x97, \n  0x9e, 0xfe, 0x3f, 0x70, 0xff, 0x4d, 0xca, 0xff, 0x1e, 0x80, 0xfe, 0xcc, 0x8f, 0xfe, 0x80, 0xe8, \n  0xfc, 0x1e, 0x07, 0xfe, 0xd9, 0xd2, 0xfe, 0x25, 0x58, 0xfd, 0xad, 0x87, 0xff, 0x1e, 0x3b, 0x00, \n  0x70, 0xd5, 0x00, 0x5a, 0xb0, 0xff, 0xa0, 0x08, 0x2f, 0xe4, 0xae, 0x2a, 0xc0, 0x49, 0x01, 0xec, \n  0xad, 0x13, 0x2a, 0x27, 0x04, 0x8d, 0xbb, 0xf8, 0xf4, 0xd0, 0xfc, 0x26, 0xb3, 0xee, 0x9f, 0x39, \n  0xf6, 0x76, 0x4d, 0x05, 0xf9, 0x5b, 0xf5, 0x53, 0x6f, 0xf3, 0x17, 0x5e, 0x03, 0x13, 0x2c, 0x00, \n  0xb9, 0xab, 0x02, 0x92, 0xec, 0xfb, 0xb4, 0xf7, 0xf8, 0x57, 0x98, 0x03, 0x3f, 0x38, 0x02, 0xee, \n  0xaf, 0xfd, 0xc9, 0xa5, 0xff, 0x29, 0x40, 0x00, 0x7e, 0xe4, 0xfd, 0x57, 0xa4, 0xfe, 0x27, 0x99, \n  0xfb, 0xd7, 0x77, 0xfd, 0xa7, 0x01, 0xff, 0x24, 0xe4, 0xfc, 0x33, 0x01, 0xff, 0x02, 0x30, 0x00, \n  0xbd, 0x4d, 0x00, 0xd4, 0xe4, 0xfe, 0x33, 0xc1, 0x33, 0x59, 0x3b, 0x29, 0x7a, 0x60, 0xfe, 0xe6, \n  0x9c, 0x17, 0x9c, 0x7c, 0x03, 0x37, 0x8b, 0xf8, 0xe4, 0xc4, 0xfc, 0x67, 0x61, 0xec, 0xb0, 0x4d, \n  0xf8, 0x02, 0x78, 0x0a, 0xfb, 0x24, 0xf3, 0xa5, 0xf9, 0xec, 0x76, 0x9d, 0x03, 0xb2, 0xec, 0x01, \n  0x15, 0x23, 0x05, 0xaa, 0x4c, 0xfd, 0x6b, 0x35, 0xf7, 0x77, 0x37, 0x03, 0x3f, 0xe9, 0x02, 0x9d, \n  0x00, 0xfd, 0x84, 0xcb, 0xff, 0xba, 0x81, 0x00, 0x16, 0x8e, 0xfc, 0x28, 0x9e, 0xfe, 0x79, 0x7a, \n  0xfb, 0xa7, 0x41, 0xfd, 0x2d, 0x20, 0xff, 0x7d, 0x89, 0xfc, 0x6a, 0x95, 0xfe, 0x4e, 0x2d, 0x00, \n  0xf8, 0x13, 0x00, 0xff, 0xbc, 0xfe, 0x64, 0x0f, 0x3a, 0x29, 0xf3, 0x28, 0x98, 0xf5, 0xf8, 0x20, \n  0x99, 0x19, 0x51, 0xa9, 0x02, 0x62, 0x31, 0xf9, 0x25, 0x7c, 0xfd, 0x7d, 0x7d, 0xe9, 0xeb, 0x71, \n  0xfa, 0x54, 0xfd, 0x0f, 0xbe, 0x50, 0xf2, 0xd8, 0xea, 0xe6, 0xc9, 0x68, 0x02, 0x5c, 0xab, 0x02, \n  0xba, 0x8e, 0x06, 0xe2, 0xe9, 0xff, 0x4c, 0x77, 0xf6, 0x26, 0x7e, 0x01, 0x98, 0xc1, 0x03, 0x7c, \n  0x7d, 0xfc, 0x8a, 0x5f, 0xfe, 0x8f, 0x01, 0x01, 0x05, 0x4d, 0xfc, 0x3b, 0x70, 0xfe, 0x78, 0x5d, \n  0xfa, 0xb6, 0x56, 0xfc, 0x22, 0xf1, 0xff, 0x9a, 0xac, 0xfc, 0xe2, 0x84, 0xfd, 0x81, 0x4e, 0x00, \n  0xf3, 0x44, 0x00, 0x6e, 0xdc, 0xfd, 0x1c, 0xf3, 0x40, 0xfe, 0xa0, 0x2c, 0x87, 0xff, 0xf0, 0x5c, \n  0x3a, 0x17, 0xdb, 0x77, 0x02, 0x03, 0x9c, 0xf9, 0xde, 0xb0, 0x01, 0xb9, 0xba, 0xe8, 0x55, 0xf3, \n  0xf7, 0x6a, 0x93, 0x13, 0x78, 0x57, 0xf6, 0x55, 0x63, 0xe3, 0xd0, 0x22, 0xff, 0xbe, 0x07, 0x03, \n  0xd2, 0x53, 0x08, 0x10, 0x2d, 0x01, 0x51, 0x08, 0xf5, 0x02, 0xf9, 0x00, 0x06, 0x7a, 0x04, 0xd9, \n  0xe4, 0xfb, 0xd8, 0xaa, 0xfd, 0x41, 0xfd, 0x01, 0x09, 0xbb, 0xfb, 0xe6, 0xf2, 0xfd, 0x69, 0x34, \n  0xfa, 0x54, 0xd4, 0xfb, 0x7f, 0x07, 0x00, 0x5f, 0xf0, 0xfc, 0x93, 0x70, 0xfd, 0xb4, 0xd6, 0xff, \n  0x58, 0x79, 0x00, 0x9b, 0x1d, 0xfe, 0x43, 0x56, 0x48, 0xed, 0x78, 0x31, 0xbd, 0x43, 0xe7, 0xf3, \n  0x68, 0x13, 0x57, 0xfb, 0x00, 0x5d, 0x18, 0xfb, 0x1e, 0x38, 0x09, 0xd6, 0xa2, 0xe6, 0xd1, 0xad, \n  0xf3, 0xf9, 0xe2, 0x16, 0xed, 0xa7, 0xfb, 0x67, 0x77, 0xe1, 0x96, 0x8e, 0xfb, 0x55, 0x62, 0x02, \n  0xfd, 0x73, 0x08, 0x6f, 0xd3, 0x02, 0x23, 0x00, 0xf4, 0x11, 0xb5, 0xfe, 0x60, 0x2a, 0x05, 0x01, \n  0x1f, 0xfd, 0xbc, 0x68, 0xfc, 0xed, 0xad, 0x01, 0xdb, 0xbb, 0xfb, 0x46, 0x6e, 0xfe, 0x7a, 0x20, \n  0xfa, 0x49, 0x64, 0xfa, 0x09, 0x8d, 0x00, 0xc4, 0x49, 0xfd, 0x64, 0xd7, 0xfc, 0x35, 0x9e, 0xff, \n  0x79, 0x4c, 0x01, 0xaf, 0x6b, 0xfe, 0x1c, 0xee, 0x51, 0x94, 0x6d, 0x31, 0xfe, 0xc9, 0xde, 0x7d, \n  0x3e, 0x13, 0x49, 0x16, 0xfd, 0xed, 0x24, 0xfe, 0xa0, 0x3a, 0x0d, 0xa6, 0x2f, 0xe4, 0x41, 0xf4, \n  0xf2, 0x55, 0x40, 0x1a, 0x8e, 0xd6, 0x00, 0xea, 0x3b, 0xdf, 0x23, 0x51, 0xf7, 0x94, 0x0c, 0x00, \n  0x1f, 0xad, 0x0a, 0x60, 0xc7, 0x03, 0xe4, 0xff, 0xf0, 0xaf, 0x1e, 0xfd, 0x56, 0xa2, 0x06, 0x6d, \n  0x28, 0xfd, 0xa8, 0x9b, 0xfa, 0xea, 0x87, 0x02, 0xd7, 0xc6, 0xfb, 0xb0, 0xd2, 0xfe, 0x30, 0x16, \n  0xfa, 0x3c, 0x9a, 0xf9, 0x88, 0x2d, 0x00, 0x41, 0x55, 0xfd, 0xd0, 0x4c, 0xfd, 0x12, 0x38, 0x00, \n  0xa6, 0x14, 0x01, 0x88, 0x9c, 0xfd, 0x8f, 0x19, 0x57, 0x3a, 0x4a, 0x32, 0x42, 0x25, 0xda, 0xbc, \n  0xac, 0x12, 0x80, 0xa3, 0xf9, 0x0c, 0x59, 0x00, 0x2a, 0xf9, 0x0f, 0x75, 0x7f, 0xe3, 0x51, 0x2b, \n  0xf1, 0x6d, 0x80, 0x1b, 0x7c, 0xb1, 0x06, 0xa6, 0x21, 0xdd, 0x01, 0x31, 0xf4, 0x9f, 0x27, 0xfe, \n  0xfb, 0xf3, 0x09, 0x58, 0xaa, 0x04, 0x0d, 0xb4, 0xf0, 0x9b, 0x87, 0xfb, 0x21, 0x13, 0x06, 0x75, \n  0x4f, 0xfd, 0x77, 0xaa, 0xf9, 0xb5, 0x1d, 0x03, 0xd6, 0x61, 0xfb, 0xe2, 0x83, 0xff, 0x3a, 0x4d, \n  0xfa, 0x47, 0x43, 0xf8, 0xb0, 0x1c, 0x00, 0x88, 0x52, 0xfe, 0xda, 0xa4, 0xfd, 0x4d, 0xe6, 0xff, \n  0xeb, 0xaf, 0x00, 0x6d, 0x51, 0xfd, 0x34, 0xac, 0x5d, 0xfd, 0x5f, 0x32, 0xba, 0x8c, 0xd6, 0x0f, \n  0x1c, 0x11, 0x6a, 0xe8, 0xf4, 0x19, 0xba, 0x04, 0xe3, 0x31, 0x13, 0x50, 0x9d, 0xe2, 0x92, 0x13, \n  0xee, 0x97, 0x56, 0x1c, 0x10, 0x9e, 0x0c, 0xeb, 0xa6, 0xdd, 0xc8, 0x0d, 0xf2, 0x6c, 0x39, 0xf8, \n  0x49, 0xc4, 0x09, 0x63, 0xb3, 0x07, 0xa8, 0x79, 0xf0, 0xbb, 0xde, 0xf9, 0x0b, 0x11, 0x05, 0xaa, \n  0x07, 0xfd, 0x91, 0xa9, 0xf9, 0x5f, 0x84, 0x03, 0xfc, 0xed, 0xfa, 0x48, 0xf6, 0xff, 0x73, 0xc3, \n  0xf9, 0x42, 0x23, 0xf8, 0x00, 0xf3, 0x00, 0xc5, 0x1b, 0xff, 0xe3, 0xa1, 0xfd, 0x9a, 0xc0, 0xff, \n  0xe1, 0x68, 0x00, 0x0f, 0x14, 0xfd, 0x87, 0xd2, 0x5f, 0x91, 0x9b, 0x35, 0x6e, 0xe0, 0xd4, 0x42, \n  0x59, 0x0e, 0x13, 0xcb, 0xf2, 0xda, 0x6c, 0x06, 0xe3, 0x54, 0x15, 0x0e, 0x94, 0xe3, 0x58, 0x21, \n  0xea, 0xe0, 0x93, 0x1a, 0x5c, 0x2f, 0x13, 0xa9, 0x5c, 0xdf, 0x83, 0x0b, 0xef, 0x83, 0x65, 0xf3, \n  0x11, 0xf8, 0x08, 0x1b, 0x45, 0x0b, 0x5c, 0xd8, 0xf0, 0x53, 0x10, 0xf8, 0x17, 0x02, 0x04, 0xa8, \n  0x2b, 0xfd, 0x37, 0xae, 0xf9, 0x86, 0x9f, 0x03, 0x8e, 0xf1, 0xf9, 0xd3, 0xb0, 0xff, 0x5a, 0x6d, \n  0xfa, 0x85, 0x5e, 0xf8, 0x1d, 0xfd, 0x00, 0x6d, 0x84, 0xff, 0x22, 0xd3, 0xfd, 0x9b, 0xbd, 0xff, \n  0x6c, 0x30, 0x00, 0x79, 0xab, 0xfc, 0xc1, 0x36, 0x63, 0x83, 0x19, 0x36, 0x8a, 0x58, 0xd6, 0x73, \n  0xf1, 0x0b, 0xb4, 0x59, 0xf0, 0xb7, 0x12, 0x08, 0xbb, 0x85, 0x15, 0x2e, 0x09, 0xe6, 0x79, 0xbe, \n  0xe5, 0x3b, 0x46, 0x19, 0xb4, 0x6d, 0x18, 0x6d, 0x77, 0xe2, 0xe7, 0xa0, 0xec, 0xb3, 0x3a, 0xee, \n  0x6c, 0x8b, 0x08, 0x5a, 0x34, 0x0e, 0x78, 0xfb, 0xf2, 0xcd, 0xce, 0xf5, 0x1d, 0xa9, 0x03, 0x27, \n  0xf4, 0xfc, 0xa2, 0xd6, 0xf9, 0x1c, 0x2e, 0x03, 0x78, 0x95, 0xf8, 0x00, 0x64, 0x00, 0x2e, 0x43, \n  0xfb, 0x67, 0x6e, 0xf8, 0x1f, 0xbd, 0x00, 0x7c, 0x17, 0x00, 0x68, 0xb7, 0xfd, 0x78, 0x52, 0x00, \n  0xb2, 0x95, 0xff, 0x28, 0x24, 0xfc, 0x3b, 0x63, 0x64, 0x81, 0xa7, 0x37, 0xb7, 0x21, 0xd8, 0xaf, \n  0xb5, 0x0a, 0x0c, 0xb3, 0xee, 0x30, 0xe9, 0x07, 0x73, 0x5c, 0x15, 0xd0, 0xc3, 0xe7, 0x67, 0x29, \n  0xe2, 0x5e, 0x2f, 0x17, 0x2c, 0xb1, 0x1b, 0x3c, 0xf8, 0xe6, 0xa6, 0xec, 0xea, 0x8e, 0xe2, 0xe9, \n  0xda, 0x15, 0x08, 0x88, 0xa5, 0x0f, 0x2a, 0x62, 0xf6, 0xfa, 0xe8, 0xf3, 0x5a, 0xa4, 0x02, 0xd2, \n  0xa4, 0xfd, 0xa7, 0x17, 0xf9, 0x23, 0x54, 0x02, 0x97, 0x79, 0xf8, 0xa8, 0xfd, 0x00, 0x60, 0x24, \n  0xfb, 0xd1, 0x36, 0xf9, 0x62, 0xbb, 0xff, 0x03, 0x14, 0x00, 0x95, 0x63, 0xfe, 0x43, 0xed, 0xff, \n  0xe2, 0x2a, 0xff, 0xc0, 0x0e, 0xfc, 0xb1, 0xe8, 0x63, 0xe9, 0x80, 0x39, 0x1d, 0xd7, 0xda, 0x0d, \n  0x27, 0x0a, 0xf4, 0xfd, 0xec, 0x2b, 0xa7, 0x07, 0x82, 0x71, 0x14, 0x28, 0xdb, 0xe8, 0xc9, 0x6d, \n  0xdf, 0x29, 0xa6, 0x13, 0x02, 0x48, 0x1e, 0x88, 0x5f, 0xec, 0xee, 0xb6, 0xea, 0x8a, 0x0c, 0xe5, \n  0x09, 0xcd, 0x06, 0x6b, 0x1b, 0x11, 0x98, 0x3e, 0xfa, 0xab, 0x68, 0xf2, 0x56, 0xcb, 0x00, 0x23, \n  0xef, 0xfe, 0x8d, 0xba, 0xf7, 0xb5, 0x02, 0x02, 0x12, 0xf8, 0xf8, 0xfe, 0x24, 0x01, 0x8e, 0x54, \n  0xfb, 0xbc, 0x48, 0xf9, 0xc0, 0xb1, 0xfe, 0x8d, 0x48, 0x00, 0xe9, 0x8f, 0xfe, 0xbc, 0xe7, 0xfe, \n  0x71, 0xa5, 0xff, 0x90, 0xfe, 0xfb, 0x54, 0x55, 0x61, 0xd5, 0xeb, 0x3c, 0x8f, 0x79, 0xdf, 0xc3, \n  0xf3, 0x0a, 0x23, 0xf8, 0xea, 0xd9, 0x85, 0x06, 0xfc, 0xd0, 0x13, 0x0c, 0x07, 0xe9, 0xdf, 0x71, \n  0xdd, 0x94, 0xcd, 0x0e, 0x4d, 0x4c, 0x20, 0x0d, 0x07, 0xf3, 0xca, 0x25, 0xee, 0xfb, 0xfc, 0xde, \n  0x92, 0xc7, 0x03, 0x1e, 0x7e, 0x13, 0x92, 0x4b, 0xfe, 0xb8, 0xbb, 0xf2, 0x19, 0x90, 0xfd, 0xe4, \n  0x64, 0x00, 0x2e, 0x38, 0xf7, 0xea, 0xda, 0x01, 0x24, 0xe4, 0xf9, 0x64, 0xfb, 0x01, 0xa4, 0xc9, \n  0xfa, 0x78, 0xa4, 0xf8, 0x5c, 0xe5, 0xfe, 0xb7, 0x43, 0xff, 0xdb, 0x12, 0xff, 0xd8, 0xf0, 0xfd, \n  0x2d, 0x4d, 0x00, 0x58, 0x4a, 0xfc, 0x4f, 0xf1, 0x5f, 0x7f, 0xd8, 0x3b, 0x66, 0xe1, 0xe5, 0x41, \n  0xa8, 0x0b, 0x15, 0xe5, 0xe9, 0x75, 0x7f, 0x06, 0x69, 0x53, 0x11, 0x1d, 0xf2, 0xe9, 0xc3, 0x01, \n  0xdb, 0x3e, 0xe7, 0x0b, 0x9c, 0x4c, 0x1f, 0xb9, 0xe7, 0xf7, 0xb9, 0x37, 0xf3, 0x05, 0x19, 0xdb, \n  0x9c, 0xa7, 0x00, 0xa5, 0x70, 0x14, 0x33, 0x94, 0x00, 0xe0, 0xff, 0xf3, 0x16, 0x8f, 0xfb, 0x38, \n  0x7d, 0x00, 0x0a, 0x6a, 0xf8, 0x0a, 0x1d, 0x01, 0x50, 0xbf, 0xfa, 0x54, 0x0c, 0x02, 0xc8, 0x78, \n  0xfa, 0x77, 0xb4, 0xf8, 0x2e, 0x14, 0xfe, 0xff, 0x91, 0xfe, 0x31, 0x7f, 0xff, 0x44, 0x8d, 0xfd, \n  0xb8, 0x72, 0x00, 0x0d, 0x99, 0xfd, 0x8d, 0x4e, 0x5c, 0x29, 0xa6, 0x3c, 0xad, 0x53, 0xed, 0x18, \n  0x51, 0x0b, 0x4c, 0x81, 0xea, 0xef, 0xa5, 0x04, 0x53, 0x2a, 0x0f, 0x6b, 0x58, 0xed, 0x82, 0xe0, \n  0xd6, 0x2b, 0xbc, 0x07, 0x3e, 0x05, 0x1e, 0x57, 0x03, 0xfc, 0x86, 0x6b, 0xfb, 0x4b, 0xef, 0xd7, \n  0x23, 0x69, 0xfa, 0xaf, 0x3e, 0x16, 0x70, 0xbc, 0x01, 0xe0, 0x7a, 0xf6, 0x4f, 0x3a, 0xfb, 0xf9, \n  0x55, 0xff, 0x0e, 0xea, 0xfa, 0x6b, 0x3c, 0x00, 0xd8, 0xc3, 0xf9, 0xdb, 0x6c, 0x03, 0x6b, 0xb8, \n  0xfa, 0xba, 0x4d, 0xf7, 0x6b, 0x47, 0xfe, 0x93, 0x28, 0xfd, 0x7d, 0xf4, 0xff, 0x3d, 0xd2, 0xfe, \n  0x90, 0x98, 0x00, 0xe0, 0x76, 0xfe, 0x17, 0xb1, 0x58, 0x59, 0xbd, 0x3c, 0x86, 0x61, 0xf2, 0xc4, \n  0xc4, 0x09, 0x9d, 0x2c, 0xee, 0x83, 0xbd, 0x03, 0x4a, 0x1e, 0x0b, 0x69, 0x6c, 0xf0, 0xef, 0x6a, \n  0xd4, 0x5f, 0x6f, 0x04, 0x0f, 0x66, 0x1c, 0xde, 0x12, 0xfd, 0x51, 0x18, 0x02, 0x8c, 0x7c, 0xd8, \n  0xb5, 0x1e, 0xf3, 0xd4, 0x5c, 0x16, 0xdc, 0x9f, 0x02, 0x13, 0xa0, 0xf8, 0x80, 0x7c, 0xfc, 0x9d, \n  0xe9, 0xfd, 0x2c, 0xc0, 0xfb, 0x5e, 0x55, 0x00, 0x69, 0x60, 0xf9, 0xa6, 0x13, 0x03, 0x59, 0x6e, \n  0xfa, 0x19, 0xa5, 0xf6, 0x9a, 0xc5, 0xfe, 0xbf, 0x45, 0xfc, 0x4c, 0xb5, 0x00, 0x52, 0xc8, 0xff, \n  0x7a, 0x6b, 0x00, 0x02, 0x4a, 0xff, 0x72, 0x49, 0x55, 0xb9, 0x87, 0x38, 0xb8, 0x3b, 0xfa, 0x54, \n  0x9e, 0x0b, 0xb4, 0x78, 0xee, 0xff, 0x59, 0x03, 0x26, 0x4c, 0x07, 0xd1, 0xde, 0xf3, 0x07, 0xce, \n  0xd3, 0x87, 0x6e, 0xfe, 0x6b, 0x7d, 0x1b, 0xc1, 0x73, 0xfe, 0xe1, 0xef, 0x07, 0x17, 0x23, 0xdb, \n  0x5b, 0xce, 0xe9, 0xee, 0x58, 0x15, 0x9f, 0xa1, 0x04, 0xec, 0xe8, 0xfa, 0xe2, 0x2a, 0xfe, 0x44, \n  0xf6, 0xfc, 0xe0, 0xe8, 0xfc, 0x15, 0xef, 0xff, 0x76, 0xac, 0xf8, 0x90, 0x89, 0x02, 0x7a, 0x84, \n  0xfa, 0x46, 0x75, 0xf5, 0xbc, 0x5b, 0xff, 0x2f, 0xf9, 0xfc, 0xfc, 0x7c, 0x00, 0x1a, 0x3c, 0x01, \n  0x65, 0xde, 0x00, 0x9b, 0xc0, 0xfe, 0xeb, 0x36, 0x50, 0x00, 0xc9, 0x36, 0x9a, 0x40, 0xfd, 0xba, \n  0xac, 0x10, 0x7e, 0x83, 0xed, 0xec, 0xa2, 0x01, 0xce, 0xb7, 0x07, 0x85, 0x65, 0xf3, 0x18, 0x6d, \n  0xd6, 0xf6, 0x2d, 0xf8, 0xfb, 0x11, 0x1b, 0x4c, 0x40, 0xff, 0x33, 0xc3, 0x09, 0x11, 0xcf, 0xe0, \n  0xaf, 0xe9, 0xe0, 0x02, 0xa5, 0x12, 0xbd, 0x62, 0x08, 0x42, 0xdc, 0xfb, 0x4e, 0x3d, 0xfe, 0x62, \n  0x6d, 0xfd, 0xfa, 0x65, 0xfd, 0xd6, 0x55, 0x00, 0x13, 0xfd, 0xf7, 0x41, 0x43, 0xff, 0xdc, 0xaa, \n  0xfc, 0x62, 0x1f, 0xf6, 0x76, 0x92, 0xfe, 0x58, 0x25, 0xfd, 0x13, 0xec, 0x00, 0xda, 0x38, 0x02, \n  0xdf, 0xd1, 0xff, 0x8e, 0xd1, 0xfe, 0x20, 0xb7, 0x4c, 0x23, 0xea, 0x36, 0x25, 0xfd, 0xfb, 0xa9, \n  0x9d, 0x12, 0x1c, 0xc6, 0xf1, 0xc5, 0x2b, 0xfe, 0x3a, 0xe3, 0x08, 0xc5, 0x70, 0xf3, 0x29, 0x4d, \n  0xd9, 0x43, 0xfb, 0xf4, 0x45, 0xc7, 0x1b, 0x65, 0x70, 0xfd, 0x7a, 0xbc, 0x06, 0xda, 0xa0, 0xeb, \n  0xf3, 0xe2, 0xda, 0xe3, 0x8c, 0x0c, 0x88, 0x72, 0x0b, 0xcd, 0xb2, 0xfd, 0x71, 0xd0, 0xff, 0x1f, \n  0x7c, 0xfc, 0x2e, 0x57, 0xfd, 0x3d, 0x85, 0x01, 0x64, 0x45, 0xf7, 0xd0, 0x82, 0xfc, 0x73, 0x6b, \n  0xff, 0x1c, 0x4e, 0xf6, 0x02, 0x56, 0xfe, 0xec, 0x29, 0xff, 0x53, 0x9a, 0xff, 0x16, 0xec, 0x01, \n  0x2a, 0x20, 0x00, 0x3f, 0xed, 0xfe, 0x4a, 0x69, 0x4a, 0xd9, 0x22, 0x35, 0x0f, 0xf0, 0xf9, 0xbe, \n  0x18, 0x15, 0x46, 0x22, 0xf5, 0x38, 0xdf, 0xf8, 0x7e, 0x21, 0x08, 0x87, 0x47, 0xf7, 0x74, 0x69, \n  0xdf, 0x5a, 0x41, 0xf1, 0x45, 0x7e, 0x18, 0x46, 0x1c, 0xfe, 0x79, 0x73, 0x01, 0xf2, 0xc6, 0xf5, \n  0x38, 0xb8, 0xda, 0x28, 0x12, 0x02, 0xea, 0xf4, 0x0d, 0x23, 0x01, 0xff, 0xba, 0x0a, 0x01, 0x56, \n  0x7f, 0xfe, 0xae, 0x4d, 0xfc, 0x95, 0x3c, 0xff, 0xc1, 0x98, 0xf7, 0x29, 0xa9, 0xfc, 0xae, 0x68, \n  0x00, 0x6d, 0xd5, 0xf7, 0x15, 0x1f, 0xfe, 0xe0, 0xdb, 0xff, 0x4d, 0x79, 0xfe, 0x50, 0x02, 0x02, \n  0x46, 0xfa, 0xff, 0x15, 0x76, 0xfe, 0x86, 0x00, 0x47, 0xdb, 0x2a, 0x35, 0xb0, 0x3c, 0xf7, 0xa8, \n  0x34, 0x15, 0x74, 0xa3, 0xf9, 0xa9, 0x45, 0xfa, 0xcf, 0x54, 0x02, 0xfd, 0x0a, 0xf7, 0x50, 0xc8, \n  0xea, 0x64, 0x91, 0xec, 0xd6, 0x04, 0x17, 0x4c, 0x40, 0x00, 0xe7, 0x2d, 0xf9, 0xe6, 0xd8, 0xfe, \n  0xf6, 0x86, 0xde, 0x27, 0x4c, 0xf8, 0xa5, 0xb3, 0x0e, 0x33, 0x21, 0x00, 0x65, 0xdb, 0xff, 0x21, \n  0xfe, 0x01, 0x82, 0x7c, 0xfc, 0x2d, 0x7e, 0xfb, 0x38, 0x52, 0xf9, 0x08, 0x6c, 0xfc, 0x2e, 0x1d, \n  0x02, 0xe2, 0x73, 0xfa, 0x74, 0x65, 0xfb, 0x35, 0x36, 0x00, 0x92, 0xff, 0xfe, 0xf6, 0x49, 0x01, \n  0xe4, 0x0b, 0x00, 0xcd, 0xc8, 0xfe, 0xae, 0x8f, 0x42, 0x48, 0x34, 0x32, 0xff, 0x1b, 0xf7, 0xd5, \n  0xf6, 0x16, 0x14, 0x3a, 0xfd, 0xc8, 0x24, 0xfa, 0xce, 0xb2, 0x00, 0x41, 0x94, 0xf4, 0x5c, 0x7f, \n  0xf2, 0x62, 0xdd, 0xed, 0xb8, 0xbc, 0x11, 0xc7, 0xa8, 0x04, 0x30, 0x5d, 0xf4, 0x88, 0xea, 0x02, \n  0xd2, 0xe0, 0xe5, 0xd0, 0x09, 0xef, 0xdf, 0xcc, 0x0d, 0x7a, 0x76, 0x01, 0x77, 0x60, 0xfd, 0x80, \n  0x06, 0x04, 0xcd, 0x54, 0xfe, 0x98, 0xe3, 0xf9, 0xb8, 0x34, 0xf9, 0xa6, 0x95, 0xfd, 0x1f, 0x56, \n  0x03, 0x4b, 0x76, 0xfc, 0xd5, 0xee, 0xf8, 0xd8, 0x27, 0x00, 0x5d, 0x05, 0x00, 0xb1, 0x84, 0x00, \n  0x9f, 0x68, 0x00, 0xc5, 0x1b, 0xff, 0x6b, 0xed, 0x3e, 0x4a, 0x70, 0x2d, 0x51, 0xc2, 0xf8, 0x1d, \n  0x26, 0x19, 0x08, 0x0d, 0xfe, 0x90, 0xe0, 0xf8, 0xd7, 0xef, 0x00, 0xa9, 0x0e, 0xf8, 0xc7, 0x4b, \n  0xf1, 0x2a, 0x79, 0xee, 0x21, 0xc1, 0x11, 0x11, 0x5c, 0x05, 0xe9, 0xe4, 0xf3, 0x96, 0xd2, 0x02, \n  0xd4, 0xbd, 0xec, 0xa1, 0xce, 0xeb, 0x38, 0xb8, 0x09, 0x25, 0xe4, 0x02, 0x3d, 0x07, 0xfc, 0xaa, \n  0xce, 0x02, 0x27, 0xd1, 0xfe, 0xf0, 0xf7, 0xfb, 0x00, 0x00, 0xfa, 0xb2, 0x9b, 0xfc, 0x15, 0xba, \n  0x03, 0x69, 0x77, 0xfd, 0x11, 0x1e, 0xf8, 0xe0, 0x87, 0x00, 0x89, 0x77, 0x00, 0x87, 0xe9, 0xff, \n  0x3c, 0xf8, 0x00, 0xeb, 0xc0, 0xfe, 0x76, 0xd9, 0x38, 0x0a, 0x35, 0x29, 0xa7, 0x2d, 0xfb, 0x5f, \n  0x81, 0x1a, 0x1b, 0xd9, 0xfe, 0x1a, 0xa3, 0xf7, 0xfa, 0xc2, 0x02, 0x32, 0xaf, 0xfb, 0xde, 0x1f, \n  0xf2, 0xba, 0x50, 0xeb, 0x30, 0xb0, 0x0f, 0x02, 0x4e, 0x0a, 0x67, 0x04, 0xf2, 0x86, 0x08, 0x03, \n  0xf4, 0xd9, 0xf3, 0xb0, 0x6b, 0xe9, 0x2e, 0xdc, 0x07, 0x04, 0x83, 0x03, 0x9d, 0x30, 0xf9, 0xb2, \n  0x1f, 0x01, 0xca, 0xcb, 0xfe, 0x65, 0x32, 0xfd, 0xdd, 0x7d, 0xfd, 0xb9, 0xbc, 0xfb, 0xdb, 0x9e, \n  0x00, 0xb3, 0x36, 0xff, 0x7e, 0xbf, 0xf9, 0xfa, 0x0f, 0x01, 0xc3, 0x10, 0x00, 0x74, 0x83, 0xff, \n  0x0d, 0x81, 0x01, 0xac, 0x1a, 0xfe, 0x6b, 0x0d, 0x32, 0x58, 0x13, 0x25, 0x0f, 0x26, 0xff, 0x72, \n  0xdc, 0x1b, 0xcf, 0xda, 0xfe, 0x5b, 0xbb, 0xf6, 0x5e, 0xb4, 0x04, 0x08, 0x25, 0xff, 0x3f, 0xed, \n  0xf2, 0xbe, 0x10, 0xeb, 0x3a, 0xfd, 0x09, 0x23, 0x45, 0x0b, 0xfe, 0xf7, 0xf6, 0x8f, 0xa0, 0x01, \n  0x6a, 0xc9, 0xf6, 0x12, 0x32, 0xeb, 0x75, 0xa9, 0x05, 0x87, 0xde, 0x03, 0x4c, 0xa4, 0xf8, 0x52, \n  0xce, 0xff, 0x1c, 0x92, 0xfd, 0xfe, 0x26, 0xfd, 0xcb, 0xa1, 0xff, 0x25, 0x45, 0xfc, 0x03, 0xd9, \n  0xfe, 0xb2, 0x7f, 0xff, 0x09, 0x8c, 0xfb, 0x36, 0x68, 0x01, 0xd9, 0xa6, 0x00, 0xb7, 0x1d, 0xff, \n  0x07, 0x9a, 0x00, 0x82, 0x8b, 0xfe, 0xb5, 0x0a, 0x33, 0x27, 0xc7, 0x20, 0x44, 0x70, 0xff, 0x39, \n  0x14, 0x22, 0x0c, 0xae, 0xf6, 0xef, 0x6b, 0xf2, 0xb7, 0xa5, 0x05, 0x68, 0x2b, 0xfa, 0x51, 0x1e, \n  0xeb, 0xf5, 0x42, 0xef, 0xc7, 0x4a, 0x19, 0x94, 0xb8, 0x06, 0x92, 0x8f, 0xf8, 0x39, 0x7b, 0x0e, \n  0x4f, 0x97, 0xf8, 0x1e, 0x95, 0xed, 0x6a, 0x78, 0x07, 0x84, 0x7e, 0x00, 0xa1, 0x04, 0xf6, 0x6e, \n  0xb7, 0xfb, 0xbb, 0xc8, 0xf8, 0x24, 0x8e, 0xfd, 0x52, 0x2b, 0xfd, 0xb5, 0xc1, 0xf9, 0x07, 0x69, \n  0xff, 0xf5, 0x19, 0xfd, 0xef, 0x91, 0xfc, 0x1d, 0x1a, 0x02, 0x83, 0x6a, 0xff, 0xd6, 0x01, 0xfe, \n  0x6c, 0x3d, 0x01, 0x7d, 0xe5, 0xff, 0xbf, 0x97, 0x2a, 0x40, 0x44, 0x20, 0x75, 0x63, 0x03, 0xb5, \n  0x3c, 0x1e, 0xde, 0x95, 0xfc, 0x9f, 0x0a, 0xf0, 0x10, 0x7a, 0x00, 0x3c, 0xc2, 0xfa, 0x83, 0xa3, \n  0xf0, 0x8f, 0xae, 0xf4, 0xfa, 0x4d, 0x11, 0x2d, 0x47, 0x08, 0x13, 0x89, 0xfc, 0x5b, 0x43, 0x09, \n  0xc1, 0xf0, 0xfa, 0x90, 0x02, 0xef, 0x0b, 0x94, 0x00, 0xee, 0x4f, 0x00, 0x15, 0x83, 0xf9, 0x84, \n  0xbf, 0xfe, 0x69, 0xcd, 0xf9, 0x33, 0x9e, 0xfd, 0x9d, 0x34, 0x00, 0x7b, 0xdf, 0xf8, 0xd2, 0xa6, \n  0xff, 0x13, 0xb2, 0xfe, 0x2f, 0x07, 0xfa, 0xe1, 0xf1, 0xff, 0x27, 0xd8, 0xff, 0xdc, 0xee, 0xfe, \n  0xe6, 0x38, 0x00, 0x89, 0xb6, 0xff, 0x7d, 0x39, 0x24, 0xd8, 0x32, 0x1d, 0x80, 0xef, 0x05, 0xd7, \n  0x93, 0x1b, 0xd1, 0x7d, 0xfe, 0xec, 0xe9, 0xf3, 0xf4, 0xac, 0x00, 0x63, 0x9d, 0xfa, 0x6d, 0x8b, \n  0xf4, 0x3d, 0xdd, 0xf6, 0x9f, 0x32, 0x0c, 0x0b, 0x6f, 0x07, 0x4a, 0xf7, 0xfc, 0xaa, 0xf2, 0x06, \n  0x9f, 0x67, 0xfc, 0xcb, 0x74, 0xf1, 0xe4, 0x93, 0xff, 0x5a, 0x8c, 0xff, 0x5e, 0x2c, 0xfb, 0x95, \n  0xab, 0xff, 0xbd, 0x52, 0xfb, 0x4e, 0xda, 0xfe, 0x2e, 0x03, 0x00, 0xd3, 0xf1, 0xf9, 0xe2, 0xc9, \n  0xff, 0xf6, 0x87, 0xfe, 0x6e, 0x69, 0xfa, 0xbc, 0xf4, 0xfe, 0x33, 0x0d, 0xff, 0xcd, 0xef, 0xfe, \n  0xb5, 0x09, 0x00, 0xd0, 0x5f, 0xff, 0x6b, 0xf3, 0x1d, 0x34, 0x46, 0x1a, 0x2a, 0x73, 0x08, 0x6d, \n  0x79, 0x18, 0x51, 0x42, 0x00, 0x49, 0xaa, 0xf7, 0xe8, 0x81, 0x00, 0x00, 0xaf, 0xfb, 0x38, 0xf8, \n  0xf7, 0xcc, 0x08, 0xf8, 0x5f, 0x8c, 0x08, 0x2a, 0xb6, 0x05, 0xd1, 0x45, 0xfd, 0xe3, 0x38, 0x05, \n  0x4c, 0x51, 0xfd, 0x30, 0x3a, 0xf4, 0x0e, 0x0a, 0xfe, 0xc6, 0x89, 0xff, 0xf7, 0x34, 0xfc, 0xf5, \n  0x6f, 0xff, 0xe5, 0x0f, 0xfe, 0x7d, 0xb8, 0x00, 0x81, 0x24, 0x00, 0x17, 0xf4, 0xfa, 0x82, 0x45, \n  0xff, 0x31, 0xf3, 0xfd, 0x58, 0x0c, 0xfb, 0x73, 0x07, 0xfe, 0x98, 0xde, 0xfd, 0x9a, 0x49, 0xfe, \n  0xc4, 0x09, 0x00, 0x03, 0xf7, 0xff, 0x7a, 0xdb, 0x18, 0xf6, 0xff, 0x17, 0x9d, 0xc2, 0x09, 0x19, \n  0x42, 0x15, 0xc6, 0x7a, 0x02, 0x76, 0x0d, 0xfa, 0x1f, 0x46, 0x00, 0x05, 0x44, 0xfe, 0xe4, 0x1b, \n  0xfa, 0x1c, 0xc4, 0xf8, 0xb1, 0x05, 0x06, 0x71, 0x14, 0x04, 0xfb, 0x7e, 0xfd, 0x9a, 0xba, 0x03, \n  0xd8, 0xa4, 0xfe, 0x57, 0xfa, 0xf5, 0x98, 0x1c, 0xfd, 0xbd, 0xfb, 0xff, 0x47, 0xec, 0xfc, 0xb6, \n  0x8f, 0x00, 0x0d, 0xb1, 0x00, 0x63, 0x7d, 0x01, 0x3f, 0xc1, 0xff, 0x86, 0xd2, 0xfb, 0xc9, 0x8f, \n  0xfe, 0x57, 0x84, 0xfd, 0x7b, 0xa0, 0xfb, 0xd1, 0x33, 0xfd, 0xbd, 0x96, 0xfd, 0x75, 0x45, 0xfe, \n  0x5c, 0xd4, 0xff, 0x10, 0x01, 0x00, 0x81, 0xbd, 0x14, 0xf8, 0x42, 0x16, 0xd1, 0xa4, 0x09, 0xed, \n  0x5b, 0x12, 0x66, 0x74, 0x04, 0xd5, 0x56, 0xfb, 0x6e, 0x29, 0x01, 0x0c, 0x3f, 0x00, 0x0a, 0x54, \n  0xfb, 0xde, 0xdf, 0xf9, 0x7f, 0x84, 0x03, 0x21, 0x8f, 0x02, 0xaa, 0xd0, 0xfd, 0xc7, 0xcf, 0x02, \n  0x74, 0x3b, 0xff, 0xf4, 0x86, 0xf7, 0xc3, 0xfe, 0xfc, 0xd2, 0x5d, 0x00, 0x1a, 0x08, 0xff, 0x95, \n  0xee, 0x01, 0xf3, 0x07, 0x01, 0x32, 0xc2, 0x00, 0x50, 0xca, 0xff, 0x41, 0x78, 0xfc, 0xc9, 0xec, \n  0xfd, 0xa1, 0x4b, 0xfd, 0x00, 0xf2, 0xfb, 0x85, 0xb5, 0xfd, 0xeb, 0xbf, 0xfd, 0xa7, 0x30, 0xfe, \n  0x52, 0x81, 0xff, 0xc4, 0x9d, 0xff, 0xe6, 0x3d, 0x12, 0x4c, 0x7e, 0x14, 0x15, 0xe1, 0x08, 0x2c, \n  0xf3, 0x0f, 0x13, 0xca, 0x04, 0x7b, 0xc2, 0xfc, 0x7e, 0x4e, 0x02, 0xbf, 0xb3, 0x00, 0x1e, 0x71, \n  0xfc, 0xda, 0xc2, 0xfa, 0x53, 0x1b, 0x01, 0x92, 0x57, 0x01, 0x38, 0x5e, 0xfe, 0xf3, 0x78, 0x02, \n  0x8a, 0x3d, 0xff, 0x53, 0xd1, 0xf8, 0x5e, 0x00, 0xfe, 0xd7, 0x2d, 0x01, 0xc3, 0x8b, 0x00, 0x22, \n  0x2c, 0x02, 0x8e, 0x2a, 0x00, 0x4e, 0x04, 0x00, 0x97, 0x6d, 0xff, 0x6f, 0x7f, 0xfc, 0x54, 0xb6, \n  0xfd, 0x2b, 0x27, 0xfe, 0x1c, 0x0c, 0xfd, 0xa9, 0x68, 0xfd, 0x7b, 0x87, 0xfd, 0xb6, 0x5f, 0xfe, \n  0xd0, 0x82, 0xff, 0x4d, 0xb5, 0xff, 0x9b, 0xd1, 0x10, 0x8f, 0x0b, 0x12, 0x9c, 0x64, 0x08, 0x67, \n  0x2c, 0x0e, 0x98, 0x7b, 0x04, 0x46, 0x13, 0xff, 0x33, 0x1d, 0x03, 0x73, 0xfa, 0x00, 0x55, 0x9c, \n  0xfd, 0x05, 0x61, 0xfb, 0xf8, 0x96, 0xff, 0xe7, 0xe8, 0x00, 0x1b, 0x68, 0xff, 0xe7, 0x79, 0x02, \n  0x3e, 0x1f, 0x00, 0x4e, 0x88, 0xfa, 0x2c, 0xb9, 0xfe, 0xbb, 0x0b, 0x02, 0x16, 0x86, 0x01, 0x91, \n  0x6f, 0x01, 0xed, 0x73, 0xff, 0xa4, 0xd6, 0xff, 0x22, 0xfe, 0xfe, 0x64, 0x77, 0xfd, 0x12, 0x37, \n  0xff, 0x9f, 0xc6, 0xfe, 0x7d, 0x04, 0xfd, 0xe0, 0x6b, 0xfd, 0x40, 0x1f, 0xfe, 0xce, 0xe4, 0xfe, \n  0x33, 0xdc, 0xff, 0x5c, 0x27, 0x00, 0x90, 0x31, 0x0f, 0xde, 0x1e, 0x10, 0x3e, 0xd2, 0x07, 0xd1, \n  0x0b, 0x0c, 0x43, 0xc3, 0x04, 0x82, 0xf8, 0x00, 0x7c, 0x2a, 0x03, 0x0c, 0x37, 0x01, 0x62, 0x71, \n  0xfe, 0xde, 0x9f, 0xfb, 0x38, 0xcb, 0xfe, 0xac, 0xa8, 0x00, 0x01, 0x22, 0x01, 0x66, 0x91, 0x03, \n  0x81, 0x2d, 0x00, 0x1d, 0x52, 0xfb, 0x59, 0x20, 0xff, 0x30, 0xca, 0x02, 0x1d, 0xba, 0x01, 0xac, \n  0x35, 0x00, 0xfe, 0xd5, 0xfe, 0xb0, 0x35, 0x00, 0x38, 0x0e, 0x00, 0xf7, 0x6d, 0xfe, 0x73, 0x41, \n  0xff, 0x44, 0xe4, 0xfe, 0x81, 0x5f, 0xfd, 0xc0, 0xb1, 0xfd, 0xe2, 0xeb, 0xfe, 0xf7, 0xb6, 0xff, \n  0xdd, 0x71, 0x00, 0x4c, 0x4d, 0x00, 0xc4, 0xbd, 0x0c, 0x57, 0x34, 0x0f, 0xdf, 0x19, 0x07, 0x5a, \n  0x60, 0x09, 0xfc, 0xcb, 0x05, 0x4d, 0x9b, 0x02, 0x74, 0xf7, 0x02, 0xec, 0x13, 0x01, 0xb4, 0xe2, \n  0xfe, 0xff, 0xec, 0xfb, 0xeb, 0x4b, 0xff, 0x6a, 0xb9, 0x02, 0x75, 0xe8, 0x01, 0xf6, 0x9f, 0x02, \n  0x96, 0x46, 0x00, 0xd1, 0x48, 0xfc, 0x6e, 0x62, 0xff, 0x31, 0xe9, 0x02, 0x80, 0x2a, 0x01, 0x5a, \n  0x85, 0xff, 0x23, 0xd1, 0xff, 0xea, 0x9a, 0x00, 0x1f, 0x5a, 0x00, 0xe4, 0xf3, 0xfe, 0x93, 0xc4, \n  0xfe, 0x2e, 0xf3, 0xfe, 0x70, 0x59, 0xfe, 0xe4, 0xb6, 0xfe, 0xdc, 0xc2, 0xff, 0x0a, 0x64, 0x00, \n  0xdf, 0xc1, 0xff, 0x87, 0xc9, 0xfe, 0xda, 0x51, 0x09, 0x7c, 0xf0, 0x0c, 0x11, 0x8f, 0x07, 0x72, \n  0x93, 0x08, 0xb3, 0x96, 0x06, 0xed, 0xd2, 0x02, 0xa7, 0x7c, 0x02, 0xa5, 0x79, 0x01, 0x1c, 0x89, \n  0x00, 0x67, 0xe3, 0xfe, 0xea, 0x6e, 0xff, 0xfd, 0x7b, 0x02, 0x8d, 0xad, 0x02, 0x47, 0x9d, 0x01, \n  0xd3, 0x64, 0x00, 0x4d, 0xc8, 0xfd, 0x96, 0x03, 0xff, 0x1a, 0x6a, 0x02, 0xd4, 0xa4, 0x01, 0x0e, \n  0xd8, 0xff, 0xb7, 0x1e, 0x00, 0x45, 0xb2, 0x00, 0xbd, 0x35, 0x00, 0x35, 0x18, 0xff, 0x3b, 0x79, \n  0xff, 0xf7, 0xcc, 0xff, 0xa4, 0x30, 0xff, 0x8e, 0xb8, 0xff, 0x08, 0xe3, 0xff, 0x63, 0x28, 0xff, \n  0x37, 0xbd, 0xfe, 0x9d, 0xb7, 0xfe, 0xa0, 0x51, 0x07, 0xb6, 0x06, 0x0c, 0x5e, 0x96, 0x07, 0xcc, \n  0x88, 0x05, 0x99, 0x93, 0x05, 0x99, 0x03, 0x05, 0xad, 0x76, 0x03, 0x82, 0xe9, 0x01, 0x8b, 0x8f, \n  0x01, 0x9f, 0x22, 0x01, 0x15, 0xe8, 0x00, 0xee, 0xd5, 0x01, 0x8d, 0xd5, 0x01, 0x91, 0x84, 0x00, \n  0x3a, 0x58, 0x00, 0xe5, 0x1e, 0xff, 0xcb, 0x8d, 0xff, 0xd9, 0x1b, 0x02, 0xf0, 0xa0, 0x01, 0x59, \n  0x25, 0x00, 0xa0, 0xe2, 0xff, 0x92, 0x65, 0x00, 0xd9, 0x8f, 0x00, 0xbf, 0x4a, 0x00, 0xa6, 0x13, \n  0x00, 0x7b, 0x3a, 0x00, 0x93, 0x13, 0x00, 0x4c, 0xf0, 0xfe, 0x97, 0x8f, 0xfe, 0x69, 0xc8, 0xfe, \n  0x5b, 0x08, 0xff, 0x5e, 0x34, 0xff, 0x7c, 0x38, 0x06, 0x20, 0x4d, 0x09, 0xab, 0x59, 0x06, 0xe6, \n  0x5a, 0x05, 0x28, 0x28, 0x06, 0xb1, 0x98, 0x05, 0x25, 0xd1, 0x04, 0x56, 0xf8, 0x03, 0x4b, 0x43, \n  0x02, 0x6c, 0xad, 0x01, 0xdc, 0x2e, 0x01, 0x90, 0xcc, 0x00, 0x4d, 0x24, 0x01, 0x0b, 0x93, 0x00, \n  0x5d, 0x79, 0xff, 0xdc, 0x08, 0x00, 0x82, 0x39, 0x01, 0xd6, 0x57, 0x01, 0x1f, 0xd8, 0x00, 0x7e, \n  0x0f, 0x00, 0x4d, 0x11, 0x00, 0x6a, 0x19, 0x01, 0x24, 0x7d, 0x01, 0x23, 0xd2, 0x00, 0xe2, 0x61, \n  0x00, 0x50, 0x99, 0xff, 0x2f, 0xb7, 0xfe, 0xf0, 0xb0, 0xfe, 0xc0, 0xcd, 0xfe, 0x91, 0xe4, 0xfe, \n  0x13, 0x47, 0xff, 0xfb, 0x3b, 0xff, 0xfb, 0xc1, 0x05, 0xd5, 0x03, 0x07, 0x79, 0xde, 0x05, 0x8f, \n  0xc8, 0x07, 0x0a, 0x79, 0x07, 0x15, 0x05, 0x06, 0xb1, 0x13, 0x04, 0x61, 0x70, 0x03, 0x07, 0x64, \n  0x03, 0xba, 0xac, 0x01, 0x05, 0xc2, 0x00, 0x9e, 0x5b, 0x00, 0xa1, 0x0e, 0x00, 0xcb, 0x60, 0x00, \n  0x11, 0x5c, 0x00, 0xa4, 0x66, 0x00, 0x6c, 0xf8, 0x00, 0x03, 0xaf, 0x00, 0x45, 0xc1, 0x00, 0x73, \n  0x59, 0x01, 0x7d, 0x2f, 0x01, 0x1e, 0xfc, 0x00, 0x46, 0xf6, 0x00, 0x8c, 0x81, 0x00, 0xcc, 0x93, \n  0xff, 0x3e, 0xe4, 0xfe, 0x69, 0x6b, 0xfe, 0x64, 0xaf, 0xfe, 0x02, 0x18, 0xff, 0xde, 0xfc, 0xfe, \n  0x5d, 0x0b, 0xff, 0x98, 0xfc, 0xfe, 0xe8, 0x7b, 0x07, 0x80, 0x99, 0x09, 0x89, 0x79, 0x06, 0xf5, \n  0xaa, 0x07, 0x3f, 0x3c, 0x07, 0xb9, 0xf3, 0x05, 0xd2, 0xad, 0x03, 0x4f, 0x7d, 0x01, 0x90, 0xfa, \n  0x00, 0x39, 0x01, 0x01, 0xf6, 0x47, 0x01, 0xc3, 0x89, 0x00, 0xcb, 0x14, 0x00, 0xd5, 0x7a, 0x00, \n  0x8a, 0xdb, 0x00, 0x55, 0x05, 0x00, 0xfd, 0xf6, 0xff, 0x7d, 0x2c, 0x01, 0xdb, 0xfe, 0x01, 0xf6, \n  0x50, 0x02, 0x16, 0x97, 0x01, 0x87, 0x50, 0x00, 0xd4, 0x54, 0xff, 0xd8, 0x02, 0xff, 0xf5, 0xda, \n  0xfe, 0x25, 0xc8, 0xfe, 0x49, 0xf6, 0xfe, 0x48, 0xff, 0xfe, 0x73, 0xe2, 0xfe, 0x3f, 0xea, 0xfe, \n  0xf4, 0xc0, 0xfe, 0xd8, 0xb2, 0xfe, 0x59, 0x72, 0x06, 0x08, 0x9a, 0x09, 0x35, 0xc6, 0x07, 0x9c, \n  0x22, 0x08, 0x25, 0x34, 0x07, 0x06, 0xaa, 0x05, 0xb7, 0xd6, 0x02, 0x64, 0x0d, 0x01, 0x35, 0xf3, \n  0x00, 0x4b, 0xcb, 0x00, 0x48, 0x58, 0x01, 0x74, 0x77, 0x01, 0xdc, 0x02, 0x01, 0x1e, 0x50, 0x00, \n  0x1a, 0xb1, 0xff, 0x16, 0xc2, 0xff, 0x93, 0xcd, 0x00, 0x01, 0x52, 0x01, 0x97, 0x03, 0x02, 0x43, \n  0x9c, 0x02, 0xf2, 0xcf, 0x01, 0xba, 0x8f, 0x00, 0xc9, 0x1a, 0xff, 0x52, 0x3b, 0xfe, 0x27, 0x8e, \n  0xfe, 0x53, 0xc8, 0xfe, 0xf5, 0x0e, 0xff, 0xd3, 0x29, 0xff, 0xdf, 0xe4, 0xfe, 0x56, 0x18, 0xff, \n  0x6a, 0xcb, 0xfe, 0x5b, 0x89, 0xfe, 0xc2, 0xb4, 0x07, 0x05, 0xb5, 0x0a, 0x9c, 0x5c, 0x06, 0x61, \n  0x65, 0x07, 0x38, 0xc5, 0x05, 0x4f, 0x49, 0x04, 0x9f, 0x8c, 0x03, 0x67, 0x0e, 0x01, 0xf6, 0x53, \n  0x00, 0xd7, 0xc7, 0x01, 0x24, 0x25, 0x02, 0xb8, 0x4e, 0x01, 0x35, 0x71, 0x01, 0x60, 0x8b, 0xff, \n  0x3e, 0x37, 0xff, 0x6c, 0x7f, 0x00, 0x0c, 0xd1, 0x00, 0xe2, 0x10, 0x01, 0xaa, 0xff, 0x01, 0x4a, \n  0xb6, 0x02, 0xa1, 0xad, 0x01, 0x50, 0xb3, 0x00, 0x04, 0x25, 0xff, 0x7a, 0x1c, 0xfe, 0xf2, 0x97, \n  0xfe, 0xb8, 0xaf, 0xfe, 0xe5, 0x72, 0xfe, 0xcf, 0x40, 0xff, 0x16, 0x42, 0xff, 0xcd, 0xdf, 0xfe, \n  0x7a, 0x15, 0xff, 0xf7, 0xa2, 0xfe, 0x1d, 0x98, 0x07, 0x6a, 0x0d, 0x0a, 0x3a, 0x7f, 0x05, 0x68, \n  0x45, 0x06, 0x6e, 0x1a, 0x05, 0x6a, 0x85, 0x04, 0x8c, 0x68, 0x03, 0xfa, 0x6b, 0x01, 0x75, 0xfa, \n  0x00, 0xa9, 0xcc, 0x01, 0x72, 0x08, 0x02, 0xb9, 0xc8, 0x01, 0x92, 0xda, 0x01, 0xf9, 0xf7, 0xff, \n  0xac, 0x38, 0x00, 0xca, 0xbf, 0x00, 0xde, 0x7b, 0x00, 0x1f, 0xa0, 0x00, 0x3f, 0x1b, 0x01, 0xc5, \n  0xad, 0x01, 0x38, 0x59, 0x02, 0x1f, 0xcb, 0x02, 0xb1, 0x3e, 0x00, 0x50, 0xbe, 0xfe, 0x98, 0x75, \n  0xfe, 0x43, 0xff, 0xfd, 0x49, 0xdc, 0xfe, 0x55, 0x28, 0xff, 0x94, 0x09, 0xff, 0xcf, 0x26, 0xff, \n  0xf7, 0x42, 0xff, 0xfd, 0xea, 0xfe, 0xf3, 0x9f, 0x08, 0x7e, 0x26, 0x0b, 0xc9, 0xef, 0x04, 0x40, \n  0xe1, 0x04, 0xf6, 0xec, 0x03, 0xa0, 0xd6, 0x03, 0x5b, 0x4c, 0x03, 0x62, 0x0a, 0x01, 0xd6, 0xe0, \n  0xff, 0x3f, 0xb7, 0x01, 0xd9, 0x2f, 0x03, 0x1c, 0xe5, 0x01, 0x42, 0xf5, 0x00, 0xa6, 0x06, 0x01, \n  0xab, 0xc5, 0x00, 0x41, 0x4a, 0x00, 0x1a, 0xd0, 0x01, 0x9a, 0xca, 0x00, 0x88, 0x60, 0x00, 0x05, \n  0x60, 0x01, 0xe2, 0xde, 0x00, 0x9e, 0xbc, 0x01, 0xb2, 0x6d, 0x02, 0xd0, 0x8f, 0x01, 0xd5, 0xca, \n  0xfe, 0xdf, 0xc7, 0xfd, 0x63, 0x44, 0xfe, 0x0a, 0xbc, 0xfe, 0x40, 0x41, 0xff, 0xc3, 0x58, 0xff, \n  0xae, 0x5f, 0xff, 0x4c, 0x03, 0xff, 0xff, 0x84, 0x0a, 0xed, 0x83, 0x0d, 0x74, 0xd3, 0x04, 0x66, \n  0xc0, 0x04, 0x82, 0x3a, 0x02, 0x5e, 0x01, 0x02, 0x6b, 0x56, 0x03, 0xd2, 0x6a, 0x00, 0x4f, 0x7a, \n  0xfe, 0x94, 0xbc, 0x00, 0x66, 0x9d, 0x03, 0x23, 0xed, 0x01, 0x66, 0x9e, 0x01, 0xe6, 0xfa, 0x00, \n  0xa2, 0xe2, 0xff, 0x5a, 0x4f, 0x01, 0xe3, 0xe7, 0x01, 0xe2, 0xeb, 0x00, 0x5e, 0xc5, 0x01, 0xdd, \n  0x36, 0x01, 0x28, 0xd5, 0xff, 0xba, 0x64, 0x01, 0x94, 0x96, 0x01, 0xb9, 0x5e, 0x01, 0x0c, 0x75, \n  0x01, 0x08, 0x9b, 0xff, 0x5a, 0x19, 0xfe, 0xc3, 0x85, 0xfe, 0x4d, 0x21, 0xff, 0x08, 0x2a, 0xff, \n  0x57, 0x6d, 0xff, 0x81, 0x52, 0xff, 0x06, 0x2f, 0x0c, 0xb3, 0x85, 0x0e, 0x5b, 0xd5, 0x04, 0x86, \n  0xa6, 0x05, 0x6a, 0xea, 0x02, 0x6d, 0x6f, 0x02, 0x14, 0x5b, 0x02, 0x8e, 0xd6, 0xfd, 0x9b, 0x8a, \n  0xfb, 0x1e, 0x84, 0x00, 0xcb, 0xee, 0x04, 0x68, 0xf5, 0x00, 0x2c, 0x19, 0x01, 0xde, 0xad, 0x00, \n  0x57, 0xd6, 0xff, 0x86, 0x81, 0x01, 0x9a, 0xed, 0x00, 0xb1, 0x6e, 0x01, 0x3a, 0xc5, 0x02, 0x43, \n  0x48, 0x01, 0xb4, 0x60, 0x00, 0xf8, 0xcd, 0x00, 0xb4, 0xf4, 0xff, 0x52, 0x1e, 0x01, 0x79, 0x46, \n  0x01, 0x0f, 0x3d, 0x00, 0xd6, 0xad, 0x00, 0x95, 0xe2, 0xff, 0x10, 0x60, 0xfe, 0xb9, 0x42, 0xfe, \n  0x86, 0x6a, 0xff, 0x4f, 0x53, 0xff, 0xb3, 0xcd, 0x0e, 0x52, 0xfc, 0x10, 0x72, 0x42, 0x04, 0xa9, \n  0x16, 0x06, 0x4d, 0x20, 0x03, 0x60, 0x4f, 0x02, 0x91, 0xc5, 0x01, 0x25, 0xd8, 0xfb, 0x07, 0x92, \n  0xf9, 0x50, 0x6a, 0x00, 0x80, 0xd9, 0x05, 0x53, 0x47, 0x00, 0xeb, 0x84, 0xff, 0xbf, 0x14, 0xff, \n  0xe2, 0x8e, 0xff, 0xd6, 0xca, 0x01, 0x36, 0xbb, 0x01, 0xd8, 0x6e, 0x01, 0xaa, 0x8a, 0x01, 0x40, \n  0x88, 0x01, 0xe5, 0x60, 0x00, 0x4f, 0x30, 0x01, 0xe8, 0xf5, 0x00, 0x8e, 0x27, 0x00, 0xc5, 0xe5, \n  0xff, 0x90, 0xe3, 0xff, 0xe4, 0xc2, 0x00, 0x21, 0xfd, 0x00, 0x74, 0x44, 0x00, 0xc5, 0x25, 0xff, \n  0xff, 0x82, 0xfe, 0x52, 0x8f, 0xfe, 0xe7, 0x11, 0x12, 0xfc, 0x4b, 0x14, 0xaa, 0x9d, 0x03, 0xf7, \n  0xfa, 0x05, 0x1e, 0x76, 0x02, 0xf5, 0xf4, 0x01, 0xa8, 0x42, 0x02, 0xb0, 0x2a, 0xfa, 0x34, 0x49, \n  0xf7, 0x62, 0xd1, 0x00, 0x73, 0xcc, 0x06, 0x9b, 0x45, 0xff, 0xcc, 0xca, 0xfe, 0xcd, 0x07, 0xfe, \n  0xd7, 0x60, 0xfe, 0xe0, 0x68, 0x01, 0x79, 0x85, 0x01, 0x74, 0x55, 0x01, 0xd4, 0x3f, 0x02, 0x45, \n  0x29, 0x01, 0xd3, 0xf2, 0xfe, 0xc5, 0xb0, 0x01, 0x2b, 0x0f, 0x01, 0x76, 0x5e, 0x00, 0xa4, 0x9f, \n  0x00, 0x20, 0xbe, 0xfe, 0xa4, 0xa5, 0xff, 0x1b, 0x17, 0x01, 0xe5, 0x95, 0x00, 0x31, 0xfb, 0xff, \n  0x0e, 0x82, 0x00, 0x25, 0xa1, 0xff, 0x82, 0x31, 0x16, 0x8a, 0x2e, 0x17, 0x56, 0x43, 0x02, 0x43, \n  0x2f, 0x06, 0x01, 0x65, 0x02, 0x9d, 0xe9, 0x01, 0x27, 0xdc, 0x01, 0x75, 0xeb, 0xf7, 0xb1, 0xb8, \n  0xf5, 0x84, 0x36, 0x02, 0x03, 0x5a, 0x07, 0x8f, 0x41, 0xfe, 0xed, 0x46, 0xfe, 0xd2, 0xab, 0xfc, \n  0xb1, 0xf2, 0xfd, 0x5a, 0x4b, 0x01, 0x1c, 0xab, 0x00, 0xb5, 0x24, 0x01, 0x09, 0x0c, 0x02, 0x91, \n  0x44, 0x00, 0xe8, 0x22, 0xff, 0x20, 0x7d, 0x01, 0xad, 0xda, 0xff, 0x32, 0xf9, 0x00, 0x50, 0x73, \n  0x00, 0x28, 0xb0, 0xfe, 0x2d, 0x16, 0x00, 0x81, 0x9b, 0xff, 0x13, 0xe8, 0xff, 0x68, 0xf6, 0x00, \n  0xd8, 0x78, 0x01, 0x6d, 0x49, 0x00, 0x02, 0x6f, 0x1a, 0xd8, 0x14, 0x1a, 0xbe, 0xd0, 0x00, 0x66, \n  0xa3, 0x06, 0x0d, 0x9b, 0x02, 0xee, 0xef, 0x01, 0xf3, 0x2b, 0x01, 0x46, 0xf8, 0xf4, 0x71, 0x6a, \n  0xf4, 0x9d, 0x7b, 0x04, 0x97, 0xfe, 0x07, 0x2f, 0x39, 0xfd, 0xe6, 0xe7, 0xfd, 0xae, 0x31, 0xfb, \n  0xa5, 0x79, 0xfd, 0x37, 0x79, 0x01, 0x33, 0x7c, 0x00, 0x15, 0xea, 0x00, 0x41, 0x5c, 0x01, 0x5c, \n  0xa0, 0xff, 0xcd, 0x9e, 0xfe, 0x2f, 0x84, 0x01, 0x34, 0xe3, 0xff, 0xfd, 0x01, 0x00, 0x2e, 0xc5, \n  0xff, 0x63, 0x86, 0xfe, 0x97, 0x86, 0xff, 0x70, 0x7e, 0x00, 0x41, 0x4b, 0x00, 0x28, 0xd7, 0xff, \n  0x87, 0x49, 0x01, 0x76, 0xf6, 0x00, 0x02, 0xec, 0x1e, 0xbe, 0x62, 0x1d, 0x65, 0x89, 0xff, 0x97, \n  0xd8, 0x06, 0x1a, 0xed, 0x01, 0x8b, 0xa1, 0x01, 0xd2, 0xac, 0x00, 0xd5, 0x1c, 0xf2, 0xfe, 0xd7, \n  0xf3, 0x3f, 0x65, 0x06, 0x04, 0xf2, 0x07, 0xe3, 0xbc, 0xfc, 0x18, 0xc7, 0xfd, 0x3e, 0xbc, 0xf9, \n  0x3d, 0xfd, 0xfc, 0xc8, 0x68, 0x01, 0x3d, 0x61, 0x00, 0x1c, 0x33, 0x01, 0x4a, 0xd5, 0x00, 0x21, \n  0xa1, 0xfe, 0xb5, 0x2f, 0xfe, 0x10, 0x78, 0x01, 0x43, 0x90, 0xff, 0x25, 0xe6, 0xff, 0x3c, 0xa2, \n  0xfe, 0x14, 0x86, 0xfd, 0x10, 0x7e, 0xff, 0x70, 0x81, 0x00, 0x8a, 0x08, 0x00, 0x24, 0xfa, 0xff, \n  0x67, 0xc9, 0x01, 0xc1, 0x4f, 0x00, 0x2c, 0x7e, 0x22, 0xd5, 0x3c, 0x21, 0x91, 0x0f, 0xff, 0x78, \n  0xce, 0x06, 0x7c, 0x37, 0x01, 0xe5, 0x7e, 0x00, 0xc4, 0x6d, 0x00, 0xf7, 0xd3, 0xef, 0x63, 0x99, \n  0xf3, 0x07, 0x97, 0x07, 0xd5, 0x27, 0x07, 0x70, 0xa3, 0xfc, 0x66, 0xd9, 0xfd, 0xf4, 0x10, 0xf9, \n  0x00, 0x3c, 0xfc, 0x91, 0xbf, 0x00, 0x32, 0x87, 0x00, 0x68, 0x7f, 0x01, 0x48, 0x59, 0x00, 0xdd, \n  0x20, 0xfe, 0xd3, 0x9c, 0xfd, 0x66, 0x82, 0x01, 0x1b, 0xf8, 0xfe, 0x96, 0x06, 0xff, 0x06, 0xd3, \n  0xfe, 0x6a, 0x2c, 0xfd, 0x8f, 0xe5, 0xfe, 0x7a, 0xad, 0xff, 0xfb, 0xcc, 0xff, 0xff, 0x48, 0x00, \n  0x04, 0x60, 0x01, 0x18, 0x5f, 0x00, 0x24, 0x62, 0x24, 0xf2, 0xcf, 0x25, 0xf6, 0x4b, 0x00, 0xbc, \n  0x58, 0x06, 0x45, 0x5e, 0x01, 0x38, 0x88, 0xfe, 0xbb, 0xd8, 0xff, 0xbf, 0x18, 0xef, 0xa8, 0x8c, \n  0xf3, 0x96, 0xe9, 0x07, 0xcf, 0x06, 0x06, 0xc4, 0xc9, 0xfc, 0xfa, 0xd8, 0xfd, 0xfa, 0x3c, 0xf9, \n  0xac, 0x00, 0xfc, 0x2b, 0x7a, 0xff, 0xa0, 0x42, 0x00, 0x55, 0x4b, 0x02, 0x04, 0x19, 0x00, 0x41, \n  0x06, 0xfe, 0x0b, 0x1f, 0xfd, 0x1a, 0x74, 0x00, 0x5c, 0xd7, 0xff, 0xab, 0xb5, 0xfe, 0xde, 0x10, \n  0xfe, 0x34, 0x24, 0xfd, 0x02, 0x31, 0xfe, 0x0f, 0x19, 0x00, 0x78, 0x75, 0xff, 0x0a, 0x58, 0xff, \n  0x70, 0x75, 0x01, 0x6a, 0xfa, 0xff, 0xd9, 0xce, 0x23, 0x0a, 0x1c, 0x2a, 0xeb, 0x50, 0x04, 0x75, \n  0x5e, 0x05, 0xa5, 0xd8, 0x01, 0x21, 0xe2, 0xfc, 0x5a, 0x24, 0xfe, 0x24, 0x51, 0xef, 0xde, 0x94, \n  0xf3, 0xdf, 0xe5, 0x06, 0xf0, 0xff, 0x04, 0xef, 0x26, 0xfd, 0x3b, 0x49, 0xfd, 0xa2, 0xa9, 0xf9, \n  0x4a, 0xf6, 0xfb, 0x54, 0x3b, 0xfe, 0x47, 0xdd, 0xff, 0x24, 0x73, 0x02, 0xa8, 0x54, 0x00, 0x84, \n  0x73, 0xfd, 0xf4, 0xbb, 0xfc, 0x75, 0x7f, 0x00, 0x9c, 0xd5, 0xff, 0x7e, 0xa0, 0xfe, 0xb4, 0x48, \n  0xfd, 0x01, 0x1f, 0xfd, 0x6f, 0xfb, 0xfd, 0xba, 0x58, 0xff, 0x20, 0x4a, 0xff, 0xba, 0xc4, 0xfe, \n  0x67, 0x52, 0x01, 0x4e, 0x8a, 0x00, 0x83, 0x90, 0x22, 0xff, 0x62, 0x2c, 0xb0, 0x09, 0x0a, 0x8b, \n  0x0a, 0x06, 0x0e, 0xb4, 0x01, 0x8a, 0x46, 0xfc, 0xe5, 0x95, 0xfc, 0x19, 0x6d, 0xef, 0x03, 0x81, \n  0xf3, 0x9c, 0x4d, 0x05, 0xd2, 0xeb, 0x03, 0x09, 0x21, 0xfe, 0x64, 0xb8, 0xfc, 0xf4, 0xa7, 0xf9, \n  0x0f, 0x85, 0xfc, 0x90, 0xde, 0xfc, 0xe8, 0x83, 0xff, 0x7d, 0x79, 0x02, 0x2c, 0x85, 0xff, 0x22, \n  0x1b, 0xff, 0x3a, 0xce, 0xfc, 0xf1, 0x00, 0xff, 0xb3, 0xf8, 0xff, 0xc0, 0x74, 0xfe, 0xb1, 0xd7, \n  0xfd, 0xd3, 0x05, 0xfd, 0xb2, 0x0b, 0xfd, 0xb8, 0x62, 0xfe, 0x51, 0x09, 0xff, 0xac, 0x7b, 0xff, \n  0x79, 0xbc, 0x01, 0x09, 0x4b, 0x00, 0x60, 0x05, 0x23, 0xc2, 0x38, 0x2c, 0xee, 0xd0, 0x0d, 0x91, \n  0x81, 0x09, 0x3f, 0x01, 0x01, 0x95, 0x28, 0xfc, 0x4a, 0x3a, 0xfc, 0x05, 0x7b, 0xef, 0x2d, 0xee, \n  0xf3, 0xb8, 0xf0, 0x02, 0x94, 0xbe, 0x01, 0x76, 0xb5, 0xff, 0xe2, 0x99, 0xfc, 0x64, 0x32, 0xf9, \n  0x0b, 0x40, 0xfd, 0x16, 0xf2, 0xfb, 0x1d, 0x39, 0xfe, 0x6e, 0x17, 0x03, 0xf9, 0x1b, 0x00, 0x8d, \n  0x79, 0xfe, 0x37, 0xa1, 0xfd, 0xd3, 0x0d, 0xff, 0x61, 0x06, 0x00, 0x82, 0x2f, 0xfe, 0xc1, 0x1d, \n  0xfd, 0x25, 0x02, 0xfd, 0x0b, 0x47, 0xfc, 0x24, 0xb6, 0xfe, 0x46, 0xc4, 0xff, 0x43, 0x55, 0xff, \n  0xde, 0xfb, 0x00, 0x83, 0x5e, 0x00, 0x98, 0xba, 0x24, 0x54, 0x29, 0x2b, 0xef, 0x9d, 0x0e, 0xa1, \n  0x6a, 0x0e, 0xdb, 0x39, 0x01, 0x48, 0x05, 0xfb, 0x15, 0x1a, 0xfc, 0x01, 0xbe, 0xef, 0xa7, 0x54, \n  0xf5, 0x65, 0x59, 0x00, 0x54, 0x24, 0xfd, 0x82, 0xd3, 0x00, 0x52, 0x49, 0xfd, 0x55, 0x5c, 0xf9, \n  0x64, 0x53, 0xfe, 0xcb, 0x78, 0xf9, 0x2b, 0x6a, 0xfe, 0x69, 0xd7, 0x03, 0x64, 0x1d, 0xff, 0x31, \n  0x37, 0xff, 0x4e, 0xec, 0xfd, 0xb2, 0x8b, 0xfe, 0xc9, 0x1a, 0x00, 0x68, 0x30, 0xfe, 0xcd, 0x43, \n  0xfc, 0x47, 0x54, 0xfd, 0x72, 0x75, 0xfc, 0x73, 0xf8, 0xfd, 0x62, 0xdd, 0xfe, 0x84, 0x5e, 0xff, \n  0x38, 0xf0, 0x01, 0x64, 0x66, 0x00, 0x95, 0xc7, 0x27, 0x03, 0xeb, 0x29, 0xe1, 0x44, 0x0d, 0xa7, \n  0xd2, 0x12, 0x71, 0x4b, 0x02, 0x65, 0x52, 0xfa, 0x2a, 0x28, 0xfc, 0xe4, 0x7c, 0xf0, 0x14, 0xc7, \n  0xf7, 0x2c, 0xf6, 0xfe, 0x14, 0x6b, 0xf6, 0x6d, 0xa3, 0x00, 0xa5, 0x1e, 0xff, 0x78, 0x0f, 0xf8, \n  0x66, 0x85, 0x00, 0x64, 0x8b, 0xf9, 0x1d, 0x99, 0xfc, 0x74, 0x95, 0x04, 0x57, 0x2b, 0xff, 0xa3, \n  0x62, 0xff, 0x80, 0x4c, 0xfe, 0x62, 0xb9, 0xfd, 0x80, 0x21, 0x00, 0x02, 0x78, 0xfe, 0xc8, 0xf1, \n  0xfb, 0xab, 0x02, 0xfe, 0x55, 0x4a, 0xfc, 0x33, 0x0f, 0xfd, 0x51, 0xf1, 0xfe, 0x5e, 0x5d, 0xff, \n  0xfe, 0x4f, 0x01, 0xea, 0xc0, 0xff, 0xf4, 0xcc, 0x2c, 0x02, 0x55, 0x28, 0xd2, 0xf7, 0x09, 0x7a, \n  0xf4, 0x16, 0xb7, 0xfe, 0x01, 0x63, 0x4a, 0xfa, 0x76, 0xa1, 0xfc, 0xf3, 0x00, 0xf1, 0x58, 0xa8, \n  0xfb, 0xf8, 0x03, 0xfe, 0x98, 0xd0, 0xee, 0xb1, 0xc1, 0xff, 0xe3, 0x40, 0x00, 0x12, 0xda, 0xf6, \n  0x5a, 0x04, 0x03, 0x31, 0x42, 0xf9, 0xe8, 0x5e, 0xfc, 0x42, 0x7b, 0x05, 0xd3, 0xcd, 0xfd, 0x93, \n  0xf8, 0xfe, 0xb2, 0x6e, 0xff, 0x70, 0xf1, 0xfd, 0x2a, 0xcb, 0xff, 0x13, 0x74, 0xfe, 0x77, 0x2b, \n  0xfb, 0xe7, 0x3d, 0xfe, 0x16, 0x0d, 0xfd, 0x25, 0xf2, 0xfc, 0x89, 0xe4, 0xfd, 0xeb, 0xc5, 0xfe, \n  0x18, 0x51, 0x01, 0x80, 0x95, 0xff, 0xfc, 0x0b, 0x32, 0x58, 0x23, 0x27, 0x97, 0x38, 0x05, 0x0c, \n  0x96, 0x1b, 0x67, 0x0e, 0x01, 0xaf, 0x85, 0xf9, 0xd5, 0xc6, 0xfe, 0xef, 0xa9, 0xf1, 0xd7, 0xfa, \n  0xff, 0xf0, 0x3d, 0xff, 0xf2, 0xb2, 0xe6, 0x83, 0x05, 0xfc, 0x4b, 0xe8, 0x03, 0xd8, 0x2e, 0xf5, \n  0x53, 0xdf, 0x03, 0x58, 0x54, 0xfb, 0xf0, 0x2d, 0xfb, 0x56, 0xb0, 0x05, 0xec, 0x3f, 0xfd, 0x8d, \n  0xa0, 0xfe, 0xff, 0xc0, 0x00, 0x09, 0x7d, 0xfe, 0xab, 0x0e, 0xff, 0x0f, 0x7b, 0xfe, 0xc6, 0x25, \n  0xfb, 0x82, 0x4b, 0xfe, 0x6b, 0xf8, 0xfc, 0xde, 0x3c, 0xfc, 0x38, 0x9b, 0xfd, 0x4a, 0x4a, 0xff, \n  0x1c, 0x74, 0x01, 0x48, 0x26, 0xfe, 0x33, 0xda, 0x37, 0x14, 0x41, 0x27, 0xeb, 0x30, 0xfe, 0x16, \n  0x0b, 0x20, 0xb2, 0x86, 0x00, 0x97, 0x23, 0xf6, 0xe7, 0x77, 0x01, 0xf3, 0xae, 0xf1, 0xa8, 0x53, \n  0x05, 0x9d, 0x9c, 0x02, 0x72, 0x15, 0xde, 0x5c, 0x4e, 0xf6, 0x43, 0x4b, 0x07, 0xcd, 0x01, 0xf6, \n  0xf7, 0x57, 0x03, 0x50, 0x2e, 0xfc, 0xaa, 0xa5, 0xfa, 0x02, 0xb2, 0x05, 0x91, 0x5d, 0xfd, 0x2f, \n  0xb5, 0xfd, 0x9a, 0xfa, 0x00, 0xe0, 0x98, 0xff, 0x33, 0x09, 0xff, 0x3e, 0xa3, 0xfe, 0xd5, 0x8e, \n  0xfa, 0xd0, 0x02, 0xfd, 0xca, 0x34, 0xfd, 0x54, 0xd2, 0xfc, 0x26, 0x22, 0xfd, 0x19, 0x98, 0xfe, \n  0x1f, 0x9b, 0x00, 0xe0, 0xb9, 0xfd, 0x81, 0xb2, 0x3d, 0x99, 0x51, 0x2a, 0xd9, 0x98, 0xf5, 0xaf, \n  0xe5, 0x20, 0x0a, 0x84, 0x02, 0xa2, 0x2e, 0xf3, 0xc8, 0x22, 0x04, 0xd6, 0x67, 0xf1, 0xf3, 0xb7, \n  0x09, 0x96, 0x23, 0x08, 0x9c, 0xd8, 0xd8, 0x61, 0xfd, 0xee, 0x9b, 0x02, 0x09, 0xb4, 0x9a, 0xf8, \n  0xde, 0x8b, 0x02, 0x02, 0xc6, 0xfd, 0x00, 0x38, 0xfa, 0xf3, 0x05, 0x05, 0x4d, 0x97, 0xfd, 0xb8, \n  0xf8, 0xfc, 0x22, 0x76, 0x00, 0xb7, 0x97, 0x01, 0x20, 0xc8, 0xff, 0xd9, 0x70, 0xfd, 0xa9, 0x42, \n  0xfa, 0x83, 0xc4, 0xfc, 0x46, 0xd7, 0xfd, 0x7f, 0xef, 0xfc, 0xd4, 0x28, 0xfb, 0xbe, 0x61, 0xfe, \n  0x95, 0x1e, 0x02, 0xbd, 0x6e, 0xfd, 0xa9, 0x2c, 0x46, 0x47, 0x6e, 0x2e, 0x6b, 0xac, 0xeb, 0xa0, \n  0x7b, 0x1c, 0x34, 0x01, 0x04, 0x46, 0xcf, 0xf2, 0x28, 0x6d, 0x07, 0x61, 0xe3, 0xef, 0xad, 0x50, \n  0x0a, 0x96, 0x48, 0x0e, 0x6d, 0x6e, 0xd7, 0x02, 0x70, 0xe8, 0x3b, 0x96, 0x07, 0x4b, 0xef, 0xfb, \n  0x71, 0xf9, 0x02, 0xcc, 0xe9, 0xfe, 0xc6, 0x80, 0xf9, 0x18, 0x74, 0x03, 0x3a, 0xd4, 0xfd, 0x20, \n  0x14, 0xfc, 0x2b, 0x4f, 0x00, 0x94, 0x93, 0x02, 0xb2, 0xd3, 0xff, 0xfa, 0x65, 0xfc, 0xb7, 0x79, \n  0xfa, 0x73, 0x62, 0xfc, 0xaf, 0xcf, 0xfc, 0xd5, 0x10, 0xfd, 0xe3, 0x13, 0xfb, 0x79, 0xba, 0xfe, \n  0x75, 0xa3, 0x02, 0xce, 0xd1, 0xfc, 0x44, 0x42, 0x4e, 0xeb, 0x4c, 0x31, 0xad, 0xf3, 0xe3, 0x03, \n  0xbb, 0x18, 0x9f, 0x2a, 0x04, 0xd1, 0xfb, 0xf2, 0xf6, 0x57, 0x0a, 0x4a, 0x74, 0xed, 0xce, 0xdc, \n  0x0a, 0x37, 0xe2, 0x16, 0xb1, 0x9a, 0xd5, 0xa7, 0x20, 0xe3, 0xaf, 0x13, 0x06, 0x70, 0x5f, 0xfe, \n  0xf9, 0xbd, 0x04, 0x02, 0xb4, 0xfe, 0xa5, 0x65, 0xf9, 0x89, 0x6a, 0x01, 0xa1, 0x2b, 0xfe, 0x0c, \n  0x12, 0xfc, 0x4d, 0xd7, 0xff, 0x9c, 0x56, 0x02, 0x62, 0x08, 0x00, 0xa4, 0x68, 0xfc, 0x55, 0xaa, \n  0xf9, 0x65, 0x8b, 0xfb, 0xfa, 0x3b, 0xfc, 0x4c, 0x75, 0xfe, 0x3d, 0x81, 0xfb, 0xd7, 0x9a, 0xfe, \n  0x55, 0xab, 0x02, 0xd2, 0xcb, 0xfc, 0xd4, 0xa1, 0x56, 0xfe, 0x50, 0x36, 0xf8, 0x11, 0xdb, 0x36, \n  0xf0, 0x10, 0x3e, 0x2d, 0x01, 0xac, 0xf4, 0xf7, 0xea, 0xd6, 0x0e, 0x8c, 0xf2, 0xe7, 0xbc, 0xba, \n  0x09, 0x57, 0xad, 0x1c, 0xd7, 0x2f, 0xd6, 0x8b, 0xaf, 0xe1, 0x7a, 0xe3, 0x03, 0x40, 0xaa, 0xfd, \n  0x50, 0xff, 0x05, 0x35, 0x81, 0xff, 0x4a, 0xa1, 0xf8, 0xa3, 0xb4, 0xff, 0xb9, 0x39, 0xfe, 0x98, \n  0x72, 0xfb, 0x86, 0xcf, 0xfe, 0xab, 0x5d, 0x02, 0x2c, 0xd8, 0xff, 0xcb, 0x67, 0xfb, 0x82, 0x97, \n  0xf8, 0x76, 0xe0, 0xfa, 0xb0, 0x42, 0xfc, 0x66, 0xb9, 0xff, 0x8f, 0xce, 0xfb, 0xd2, 0x33, 0xfe, \n  0x06, 0x09, 0x03, 0xdb, 0x17, 0xfd, 0x0f, 0x1a, 0x5f, 0xc6, 0x00, 0x3a, 0x1b, 0xc7, 0xd4, 0xc4, \n  0x45, 0x0b, 0x56, 0x20, 0xfd, 0xf6, 0xd9, 0xfe, 0x0d, 0x07, 0x11, 0x86, 0x48, 0xe3, 0x08, 0x43, \n  0x0b, 0xc4, 0x52, 0x20, 0xa6, 0x8b, 0xda, 0x3f, 0x6f, 0xe1, 0xc2, 0xf6, 0x00, 0x4f, 0xc4, 0xfb, \n  0x9c, 0xe9, 0x07, 0xfa, 0x4a, 0x02, 0xda, 0xad, 0xf7, 0xf5, 0xd8, 0xfd, 0xfc, 0x7d, 0xfe, 0x75, \n  0xb7, 0xfb, 0x6f, 0x04, 0xfe, 0xf4, 0x7f, 0x02, 0x7d, 0x0b, 0xff, 0xf1, 0x88, 0xfb, 0x64, 0x5a, \n  0xf8, 0xda, 0x21, 0xfa, 0xd2, 0xac, 0xfc, 0x2b, 0xc3, 0x00, 0xf7, 0x4f, 0xfc, 0xec, 0x87, 0xfe, \n  0xf5, 0x22, 0x04, 0xa7, 0xbd, 0xfc, 0xbf, 0x23, 0x66, 0xb3, 0xe9, 0x3c, 0x00, 0xf0, 0xcf, 0x09, \n  0x73, 0x06, 0x24, 0x07, 0xf9, 0x83, 0xb7, 0x03, 0xf1, 0xbb, 0x10, 0x2b, 0xf7, 0xe0, 0xf4, 0x82, \n  0x0b, 0x57, 0x5e, 0x23, 0x59, 0xf4, 0xdf, 0x3b, 0xde, 0xdf, 0xf6, 0xc3, 0xfe, 0xb3, 0xa4, 0xf8, \n  0x3d, 0x3e, 0x0a, 0xa2, 0x97, 0x04, 0xa7, 0x64, 0xf5, 0xd1, 0xda, 0xfc, 0x65, 0xf9, 0xfe, 0x5d, \n  0x87, 0xfb, 0xf1, 0xa6, 0xfc, 0x0f, 0x1b, 0x02, 0xe6, 0x3f, 0xfe, 0xda, 0x95, 0xfc, 0x4e, 0xad, \n  0xf7, 0x14, 0xbd, 0xf8, 0x48, 0x1d, 0xfd, 0x2e, 0x72, 0x01, 0xff, 0xf5, 0xfc, 0xdf, 0x0a, 0xff, \n  0xca, 0x2d, 0x04, 0x0a, 0xfc, 0xfb, 0xef, 0x0a, 0x6c, 0x60, 0x47, 0x3f, 0xd0, 0xf7, 0xcc, 0x8a, \n  0xd1, 0x02, 0x90, 0x82, 0xf5, 0xcf, 0x3f, 0x06, 0xd5, 0xd2, 0x0f, 0x4d, 0x32, 0xe1, 0x4a, 0xc3, \n  0x09, 0x48, 0xdb, 0x25, 0xe7, 0xb6, 0xe6, 0x84, 0x45, 0xde, 0x03, 0x6a, 0xfd, 0x75, 0xfc, 0xf4, \n  0x76, 0xd5, 0x0b, 0xa4, 0xc6, 0x06, 0x9f, 0x82, 0xf3, 0xee, 0xad, 0xfc, 0x7e, 0xb0, 0xff, 0xda, \n  0x53, 0xfa, 0x5c, 0x6b, 0xfb, 0x61, 0x72, 0x02, 0xcb, 0xb3, 0xfd, 0x03, 0x8f, 0xfd, 0x2c, 0xde, \n  0xf6, 0xa2, 0x98, 0xf7, 0xd7, 0x98, 0xfd, 0x8d, 0x04, 0x02, 0x8a, 0xc5, 0xfd, 0xe1, 0x31, 0xff, \n  0x99, 0x6d, 0x03, 0x11, 0x0c, 0xfc, 0x6e, 0x90, 0x6e, 0x72, 0x73, 0x43, 0x03, 0x74, 0xcb, 0xfa, \n  0x03, 0x00, 0x40, 0xa1, 0xf2, 0x1c, 0x0b, 0x06, 0xfa, 0x14, 0x0f, 0xd2, 0x53, 0xe2, 0x4c, 0x9b, \n  0x05, 0x97, 0xf5, 0x27, 0x06, 0x6a, 0xef, 0x0e, 0x6a, 0xdc, 0xd7, 0xc5, 0xfb, 0x8f, 0x57, 0xf1, \n  0xc4, 0x9b, 0x0b, 0xba, 0x90, 0x09, 0x0b, 0x6e, 0xf2, 0x95, 0x7a, 0xfc, 0xe6, 0xfd, 0xff, 0xd1, \n  0xca, 0xf8, 0xba, 0x6f, 0xfa, 0x62, 0x3e, 0x03, 0x8e, 0x93, 0xfc, 0xec, 0x20, 0xfe, 0xc2, 0xf0, \n  0xf6, 0xc7, 0x8e, 0xf6, 0x9c, 0xcb, 0xfd, 0xf7, 0x60, 0x02, 0x45, 0x24, 0xfe, 0x1c, 0xc2, 0xfe, \n  0x0c, 0xe2, 0x02, 0xb1, 0x1c, 0xfc, 0x4b, 0xfe, 0x71, 0x97, 0x2d, 0x44, 0x04, 0xc4, 0xcc, 0x58, \n  0xab, 0xfe, 0x1f, 0x87, 0xef, 0xf5, 0x9f, 0x05, 0x97, 0x7a, 0x0d, 0xe2, 0xca, 0xe2, 0x18, 0x00, \n  0x02, 0xbd, 0x16, 0x2a, 0x5f, 0xb1, 0xf6, 0x0d, 0xc6, 0xdc, 0xbd, 0x53, 0xf9, 0x3d, 0x16, 0xee, \n  0x98, 0x91, 0x0b, 0xb7, 0x0e, 0x0b, 0x37, 0x28, 0xf3, 0x9c, 0xcb, 0xfb, 0x36, 0x54, 0x00, 0x9c, \n  0x83, 0xf7, 0x2f, 0x2d, 0xfa, 0xe7, 0x6f, 0x03, 0xa8, 0x71, 0xfb, 0x8d, 0xd6, 0xfe, 0x36, 0x75, \n  0xf7, 0x45, 0x54, 0xf6, 0x11, 0xd5, 0xfd, 0xce, 0x82, 0x02, 0x09, 0x64, 0xfd, 0x10, 0xde, 0xfe, \n  0xb6, 0x47, 0x02, 0xf3, 0xe9, 0xfb, 0x25, 0x89, 0x72, 0x28, 0xd5, 0x45, 0x93, 0xc3, 0xcf, 0x64, \n  0xb0, 0xfd, 0xa1, 0x15, 0xec, 0x86, 0x1c, 0x04, 0x1f, 0x23, 0x0d, 0xdd, 0x48, 0xe1, 0x11, 0x13, \n  0xfe, 0x26, 0xf8, 0x2b, 0x2e, 0xa0, 0xfc, 0x06, 0xcf, 0xde, 0x53, 0xb4, 0xf6, 0x69, 0x5d, 0xeb, \n  0x17, 0x11, 0x0a, 0x1a, 0x00, 0x0c, 0xb9, 0x4d, 0xf5, 0xc2, 0xf0, 0xf9, 0x42, 0x74, 0x00, 0x27, \n  0xa3, 0xf7, 0x66, 0x1a, 0xf9, 0x92, 0xc2, 0x02, 0xc0, 0xf5, 0xfa, 0x1d, 0x88, 0xff, 0xe0, 0x3a, \n  0xf8, 0x59, 0xa5, 0xf6, 0x75, 0x15, 0xfd, 0x47, 0xdb, 0x01, 0x12, 0xcc, 0xfc, 0x06, 0x7c, 0xfe, \n  0x63, 0xed, 0x01, 0x82, 0x23, 0xfc, 0x0a, 0x86, 0x70, 0x37, 0xbf, 0x48, 0x5c, 0xbd, 0xd4, 0xb6, \n  0xd6, 0xfd, 0xfe, 0xa4, 0xe7, 0x4e, 0x58, 0x02, 0x14, 0x2b, 0x0f, 0x58, 0xd8, 0xdd, 0xc2, 0x5a, \n  0xfa, 0xb8, 0xbe, 0x2c, 0x5f, 0xac, 0x01, 0x29, 0x59, 0xe3, 0x8c, 0x3b, 0xf5, 0xcf, 0xb8, 0xe8, \n  0x3a, 0x07, 0x07, 0x6b, 0xb3, 0x0c, 0xfe, 0x96, 0xf8, 0x74, 0x3f, 0xf8, 0xb9, 0xd2, 0xff, 0x5e, \n  0xd3, 0xf8, 0x88, 0xce, 0xf7, 0xf6, 0x3d, 0x02, 0x8e, 0x20, 0xfb, 0xf3, 0x35, 0x00, 0x9f, 0xed, \n  0xf9, 0x3c, 0xe8, 0xf5, 0x2c, 0xde, 0xfb, 0x9a, 0x97, 0x01, 0x43, 0xdc, 0xfb, 0x60, 0xe3, 0xfe, \n  0x63, 0x6b, 0x02, 0x87, 0xdf, 0xfb, 0x31, 0x3f, 0x6c, 0x5d, 0x10, 0x4c, 0xc7, 0xc5, 0xdb, 0xba, \n  0xc9, 0xfe, 0xb2, 0x2e, 0xe3, 0xf7, 0x43, 0x00, 0x40, 0x18, 0x12, 0xab, 0x02, 0xda, 0xbd, 0x28, \n  0xf6, 0xe1, 0xea, 0x2c, 0x8f, 0xa2, 0x05, 0x20, 0xad, 0xe9, 0x67, 0x68, 0xf6, 0x06, 0x67, 0xe4, \n  0x02, 0xa5, 0x03, 0xbe, 0x78, 0x0d, 0xe5, 0x0f, 0xfb, 0xac, 0x36, 0xf8, 0x06, 0x36, 0xfe, 0xc8, \n  0x93, 0xf9, 0x58, 0xa8, 0xf7, 0xf7, 0x2a, 0x02, 0x55, 0x05, 0xfc, 0x47, 0x02, 0x01, 0xf4, 0x06, \n  0xfa, 0xbb, 0xd1, 0xf5, 0x5d, 0xa4, 0xfa, 0xa7, 0x17, 0x00, 0x17, 0x4b, 0xfd, 0xec, 0x5c, 0xff, \n  0xc2, 0x87, 0x02, 0x48, 0xfe, 0xfb, 0xf9, 0x9c, 0x67, 0xca, 0x3d, 0x4d, 0xf4, 0x70, 0xe4, 0x29, \n  0x02, 0x00, 0x0d, 0x7e, 0xdf, 0xec, 0xdf, 0xfe, 0xeb, 0x8b, 0x13, 0x43, 0x4e, 0xd8, 0x4a, 0x4d, \n  0xf0, 0xd7, 0xaa, 0x2c, 0x11, 0x9d, 0x09, 0x9d, 0xe1, 0xee, 0x58, 0xd4, 0xfa, 0x2d, 0xea, 0xde, \n  0xf4, 0x26, 0x00, 0x66, 0x94, 0x0e, 0x9f, 0x9b, 0xfb, 0x6e, 0x27, 0xf9, 0x28, 0x88, 0xfc, 0xa1, \n  0xf1, 0xf8, 0x20, 0x5a, 0xf9, 0x89, 0x7c, 0x03, 0xaf, 0x5a, 0xfb, 0x8b, 0x86, 0x01, 0x0e, 0x42, \n  0xfa, 0x4e, 0xb6, 0xf4, 0x44, 0x98, 0xfa, 0x56, 0x8d, 0xff, 0xcd, 0x72, 0xfe, 0x29, 0xc2, 0xff, \n  0xfd, 0xb6, 0x02, 0x8b, 0x77, 0xfc, 0x59, 0x9b, 0x60, 0xbb, 0x5a, 0x4f, 0x9e, 0xf1, 0xed, 0x03, \n  0xd6, 0x00, 0xb6, 0xfb, 0xdd, 0x95, 0x1d, 0xfb, 0x5a, 0xed, 0x12, 0x00, 0x2e, 0xdc, 0x65, 0x96, \n  0xe7, 0x6f, 0xea, 0x29, 0x48, 0xaf, 0x10, 0x2a, 0x08, 0xf1, 0x69, 0x9c, 0x02, 0x76, 0xc8, 0xda, \n  0xbd, 0x00, 0xfa, 0xc7, 0x0e, 0x10, 0xc6, 0x75, 0xfa, 0x8d, 0xb5, 0xfa, 0xa0, 0x55, 0xfc, 0xb0, \n  0x8a, 0xf7, 0x04, 0x69, 0xfb, 0xc8, 0x1e, 0x04, 0xbb, 0x2b, 0xfa, 0xc7, 0xf3, 0x02, 0xfa, 0x2d, \n  0xf9, 0xf7, 0x16, 0xf4, 0x0b, 0xb4, 0xfc, 0x5d, 0x2f, 0xfe, 0x7e, 0x60, 0xff, 0x0c, 0xa3, 0x00, \n  0xf7, 0x42, 0x02, 0xc9, 0x4e, 0xfc, 0xc2, 0xb7, 0x5b, 0xfb, 0x8c, 0x4d, 0x4c, 0x45, 0xf7, 0x1b, \n  0xca, 0x01, 0x64, 0xc9, 0xdc, 0x4d, 0x82, 0xf8, 0x0b, 0x22, 0x0e, 0x60, 0x25, 0xe3, 0xae, 0x21, \n  0xe1, 0x26, 0xee, 0x23, 0x77, 0xf5, 0x17, 0xff, 0x15, 0xf2, 0xfa, 0x0e, 0x0a, 0x11, 0x98, 0xda, \n  0x08, 0x41, 0xf1, 0xc6, 0x6a, 0x10, 0xc6, 0x2e, 0xf9, 0xa3, 0x43, 0xfb, 0x75, 0xc4, 0xfe, 0xff, \n  0x17, 0xf6, 0x3e, 0x79, 0xfa, 0xd0, 0x7d, 0x05, 0x04, 0xa0, 0xf9, 0x5c, 0x12, 0x02, 0xc6, 0x91, \n  0xfa, 0x3f, 0x5f, 0xf3, 0x19, 0x40, 0xfe, 0x55, 0xce, 0xfe, 0x2a, 0xf2, 0xfe, 0x8b, 0x9e, 0x00, \n  0xf2, 0xf9, 0x01, 0xf6, 0xad, 0xfc, 0x32, 0x4c, 0x58, 0xdf, 0x42, 0x4a, 0x43, 0x6d, 0xfd, 0x36, \n  0xe6, 0x04, 0xbd, 0x4a, 0xde, 0x89, 0x9d, 0xf5, 0xb8, 0x1c, 0x09, 0x60, 0xe8, 0xe7, 0x78, 0x4f, \n  0xdf, 0x59, 0x02, 0x1d, 0xf9, 0x90, 0x1e, 0x08, 0x7f, 0xf4, 0x0f, 0x79, 0x0d, 0xeb, 0xd7, 0xdf, \n  0xed, 0x85, 0xe7, 0x64, 0xc1, 0x0f, 0x0c, 0x7a, 0xf9, 0x77, 0x77, 0xfa, 0x95, 0xdf, 0x00, 0x35, \n  0x10, 0xf6, 0x57, 0x78, 0xfa, 0x27, 0xa3, 0x04, 0x03, 0x5a, 0xf9, 0xb3, 0x2c, 0x02, 0xe2, 0xd8, \n  0xfc, 0x83, 0x1d, 0xf3, 0xbc, 0x03, 0x00, 0x08, 0xe3, 0xfe, 0x5c, 0x01, 0xfe, 0xe2, 0x8c, 0x01, \n  0xac, 0x73, 0x01, 0xe3, 0x60, 0xfc, 0xe1, 0xce, 0x55, 0x4b, 0x8b, 0x48, 0x5c, 0xfd, 0xfc, 0x2c, \n  0x54, 0x09, 0x3f, 0xbf, 0xe2, 0xa5, 0x6c, 0xef, 0x6c, 0xc3, 0x06, 0x8a, 0x55, 0xeb, 0xce, 0x15, \n  0xdd, 0x97, 0xdc, 0x17, 0xd1, 0xc4, 0x24, 0x9f, 0x7e, 0xf6, 0xbf, 0xc1, 0x0d, 0x4d, 0x0f, 0xe7, \n  0xef, 0xf6, 0xde, 0x43, 0xa0, 0x0e, 0x73, 0x76, 0xfb, 0xa5, 0x0f, 0xf7, 0x08, 0x3a, 0x02, 0x25, \n  0x99, 0xf6, 0xdd, 0xf9, 0xf9, 0xe6, 0x98, 0x04, 0x3e, 0xb2, 0xf8, 0xb7, 0x96, 0x01, 0x7e, 0x16, \n  0x00, 0x80, 0x15, 0xf4, 0x99, 0x1e, 0xff, 0xf4, 0x4d, 0xff, 0xe7, 0x80, 0xfe, 0x15, 0xe0, 0x00, \n  0x56, 0xee, 0x00, 0x35, 0xe4, 0xfc, 0x2f, 0xa1, 0x56, 0x25, 0x46, 0x43, 0x58, 0x4f, 0xfa, 0x5b, \n  0x26, 0x10, 0x3d, 0x18, 0xe3, 0x08, 0x20, 0xeb, 0x63, 0x60, 0x07, 0x09, 0xd0, 0xed, 0x66, 0x97, \n  0xdb, 0xfc, 0x72, 0x12, 0x08, 0xba, 0x28, 0xcc, 0xd3, 0xf8, 0xf0, 0x93, 0x0e, 0xe1, 0x2c, 0xec, \n  0xfb, 0xec, 0xda, 0x6f, 0x74, 0x0a, 0x81, 0x40, 0xfe, 0x0e, 0xee, 0xf6, 0x46, 0xcf, 0xff, 0x37, \n  0x3d, 0xf6, 0x82, 0x3d, 0xf9, 0xef, 0x6f, 0x06, 0xbe, 0x56, 0xf9, 0x4f, 0x05, 0x00, 0xa2, 0x4f, \n  0x02, 0x1c, 0xea, 0xf4, 0xf6, 0xd0, 0xfe, 0x07, 0x85, 0xff, 0x14, 0xb8, 0xfd, 0x7e, 0x07, 0x01, \n  0xbe, 0xdf, 0x00, 0xb5, 0x9e, 0xfc, 0x60, 0x23, 0x53, 0x66, 0x6f, 0x3e, 0xa9, 0xe0, 0xfb, 0x09, \n  0xc7, 0x16, 0xc2, 0xb1, 0xdf, 0xf3, 0xda, 0xe9, 0x8d, 0x23, 0x0b, 0x08, 0xf0, 0xed, 0x1d, 0x52, \n  0xdd, 0x95, 0x2a, 0x08, 0x99, 0xa2, 0x29, 0x04, 0x83, 0xfe, 0xed, 0xbe, 0x0d, 0x4c, 0x09, 0xf5, \n  0xd1, 0x14, 0xd7, 0x69, 0x5b, 0x04, 0x03, 0x24, 0x02, 0x3c, 0xaf, 0xf7, 0x09, 0xae, 0xfd, 0xf8, \n  0x83, 0xf4, 0x3f, 0x6b, 0xf7, 0x2e, 0x07, 0x08, 0xae, 0xc7, 0xfb, 0x6c, 0x70, 0xfe, 0x64, 0xb3, \n  0x04, 0xeb, 0x31, 0xf4, 0x59, 0x8e, 0xfc, 0x3b, 0x28, 0x02, 0x07, 0x78, 0xfd, 0x0f, 0x6c, 0x00, \n  0x67, 0x43, 0x00, 0xf5, 0x7f, 0xfc, 0x55, 0xda, 0x4c, 0x15, 0x4a, 0x39, 0x63, 0x72, 0xfe, 0x27, \n  0x4d, 0x1b, 0x59, 0xac, 0xe1, 0xa2, 0x25, 0xe9, 0x23, 0x3e, 0x0b, 0xe6, 0x0d, 0xf1, 0x08, 0x8d, \n  0xdd, 0x2c, 0x9e, 0xfe, 0x9d, 0xb7, 0x27, 0x12, 0xc9, 0x03, 0xd5, 0x52, 0x0c, 0x29, 0xc7, 0xfd, \n  0x40, 0x82, 0xd8, 0x63, 0xb4, 0xfc, 0xac, 0xb4, 0x05, 0xe7, 0x14, 0xf7, 0xd1, 0x8f, 0xfc, 0x04, \n  0x45, 0xf5, 0x4f, 0x3f, 0xf4, 0x8a, 0x72, 0x06, 0x44, 0x52, 0xfd, 0x4b, 0x04, 0x01, 0x2c, 0xbb, \n  0x05, 0x34, 0xfc, 0xf0, 0xd0, 0x44, 0xfb, 0x5d, 0x6c, 0x05, 0x6e, 0x66, 0xfd, 0xc3, 0x01, 0xff, \n  0x88, 0xfa, 0xff, 0xf5, 0x42, 0xfd, 0xf1, 0x6a, 0x4a, 0x14, 0x5d, 0x32, 0xd7, 0x1c, 0xf8, 0xcf, \n  0xfe, 0x21, 0xad, 0x35, 0xeb, 0x4c, 0x3c, 0xe9, 0x21, 0xe1, 0x08, 0x22, 0xe8, 0xef, 0xbd, 0x11, \n  0xdf, 0x91, 0x47, 0xf8, 0x6c, 0xd0, 0x27, 0xe5, 0x8e, 0x07, 0x58, 0xcb, 0x04, 0x77, 0x75, 0x05, \n  0xb9, 0xa9, 0xdf, 0xa0, 0xdb, 0xf6, 0x72, 0x2f, 0x07, 0x28, 0x8b, 0xf8, 0x4e, 0x09, 0xfa, 0xaf, \n  0x8d, 0xf5, 0xd4, 0x76, 0xf3, 0x43, 0x3a, 0x03, 0x8b, 0x08, 0xff, 0x1f, 0x6d, 0x01, 0x41, 0xe0, \n  0x05, 0x87, 0x60, 0xf1, 0x5b, 0x56, 0xf9, 0x50, 0xfd, 0x06, 0x69, 0x11, 0xfe, 0xc7, 0x28, 0xfe, \n  0x0a, 0xc4, 0xff, 0xe4, 0x20, 0xfe, 0xf7, 0x6e, 0x45, 0x87, 0xfd, 0x2c, 0x8f, 0x8f, 0xf8, 0x68, \n  0x01, 0x25, 0x9a, 0xa9, 0xee, 0x81, 0x53, 0xe9, 0x6a, 0x08, 0x09, 0xb3, 0x36, 0xf4, 0x2f, 0xda, \n  0xe0, 0x42, 0x31, 0xf2, 0xae, 0xd9, 0x25, 0x67, 0x5d, 0x08, 0x13, 0x3d, 0xfc, 0xb4, 0xfc, 0x0e, \n  0xa3, 0x1d, 0xea, 0x22, 0x1b, 0xee, 0xdf, 0xf3, 0x09, 0x9f, 0x06, 0xfa, 0x19, 0x83, 0xf6, 0x22, \n  0xed, 0xf8, 0x22, 0x59, 0xf4, 0x96, 0x05, 0x00, 0xb6, 0xa0, 0xfd, 0xc3, 0x27, 0xff, 0xc1, 0xcf, \n  0x06, 0xdd, 0x36, 0xf6, 0x61, 0x55, 0xf7, 0x77, 0x91, 0x04, 0xd4, 0x19, 0x00, 0x55, 0xa3, 0xfe, \n  0x39, 0xe8, 0xff, 0xfc, 0x40, 0xfe, 0x25, 0x38, 0x3f, 0xf1, 0x73, 0x28, 0x19, 0x3d, 0xfb, 0x89, \n  0x5c, 0x24, 0xd3, 0x64, 0xf0, 0xf1, 0x81, 0xec, 0x6d, 0x7b, 0x07, 0x77, 0xfe, 0xf6, 0x81, 0x2d, \n  0xe4, 0x71, 0xa7, 0xee, 0x3e, 0xfa, 0x22, 0x54, 0x8e, 0x06, 0x25, 0xb1, 0xf8, 0x78, 0x51, 0x12, \n  0x3f, 0xcb, 0xf0, 0xad, 0x3f, 0xec, 0x39, 0xc7, 0x09, 0xb5, 0x61, 0xfb, 0xa9, 0xd5, 0xf4, 0x34, \n  0xc6, 0xfa, 0xc2, 0xd8, 0xf5, 0xc8, 0xda, 0xfe, 0x82, 0xd1, 0xfb, 0x4f, 0xac, 0xfb, 0x48, 0x86, \n  0x05, 0xf9, 0xa4, 0xfa, 0x0c, 0xeb, 0xf8, 0xec, 0x21, 0x02, 0xb2, 0x01, 0xff, 0xff, 0x4c, 0xff, \n  0xf1, 0x9e, 0x01, 0xd6, 0x6f, 0xfe, 0xf5, 0x28, 0x3a, 0xe8, 0xdb, 0x23, 0x88, 0x91, 0xfc, 0xb8, \n  0x65, 0x24, 0xa3, 0x81, 0xf2, 0x5f, 0x98, 0xef, 0xa2, 0xf3, 0x06, 0x2f, 0xc8, 0xf7, 0x9b, 0x26, \n  0xe8, 0x7a, 0x70, 0xee, 0x32, 0xfd, 0x1d, 0xf1, 0xea, 0x06, 0xd8, 0x0b, 0xf8, 0x0c, 0xbc, 0x10, \n  0x26, 0x9d, 0xf4, 0xc6, 0xda, 0xed, 0xf4, 0x32, 0x09, 0xa9, 0x93, 0xfc, 0xef, 0xd0, 0xf5, 0x59, \n  0x23, 0xfb, 0xce, 0x06, 0xf7, 0x86, 0x68, 0xfe, 0x72, 0x0c, 0xfc, 0x66, 0x1a, 0xfa, 0x37, 0x04, \n  0x02, 0xb2, 0x2a, 0xfc, 0x0f, 0xdf, 0xfb, 0xc0, 0x46, 0x02, 0xc0, 0xbb, 0xfd, 0x56, 0xbb, 0xfe, \n  0x2b, 0x96, 0x02, 0xbd, 0xfa, 0xfe, 0x54, 0x2e, 0x3b, 0xc0, 0xce, 0x23, 0x1c, 0xd1, 0xec, 0x36, \n  0xa0, 0x25, 0x13, 0xd7, 0x02, 0xed, 0x2e, 0xea, 0x84, 0x93, 0xff, 0xbb, 0xaf, 0xfc, 0xb5, 0xf0, \n  0xeb, 0x3b, 0x23, 0xf0, 0x31, 0xa0, 0x1e, 0x66, 0x36, 0xfe, 0xb2, 0xbc, 0xf1, 0x38, 0xb3, 0x0d, \n  0x42, 0x3d, 0xfc, 0xa4, 0x70, 0xf6, 0x92, 0x41, 0x0d, 0xc7, 0x2d, 0x03, 0x62, 0x6f, 0xfa, 0x2f, \n  0x1e, 0x00, 0xd2, 0x8b, 0xf9, 0x59, 0xb9, 0xfd, 0x1a, 0xc8, 0xf6, 0x87, 0x58, 0xf4, 0x8f, 0xb6, \n  0xfd, 0x18, 0xcf, 0xfb, 0xda, 0x67, 0xf9, 0x0a, 0x3d, 0xff, 0x77, 0x00, 0xff, 0xb1, 0x12, 0x00, \n  0x21, 0x35, 0x02, 0x8c, 0x55, 0xfe, 0x4d, 0x83, 0x31, 0xc3, 0x69, 0x23, 0x9e, 0x11, 0xf6, 0xbc, \n  0xa8, 0x20, 0x22, 0x6e, 0x01, 0x08, 0x69, 0xec, 0xb6, 0x3d, 0x00, 0x0a, 0xd4, 0xfb, 0x5a, 0x44, \n  0xef, 0x21, 0xa2, 0xf1, 0xa4, 0x10, 0x17, 0x3a, 0xc1, 0x01, 0x6d, 0xe4, 0xf6, 0xaf, 0x4c, 0x0b, \n  0x8c, 0xda, 0xfb, 0x85, 0xdc, 0xf6, 0xb7, 0xae, 0x09, 0x86, 0x9e, 0x02, 0xff, 0x47, 0xfc, 0x63, \n  0xad, 0xff, 0x1e, 0x87, 0xf9, 0x22, 0x33, 0xfe, 0x00, 0xff, 0xf8, 0x03, 0x69, 0xf6, 0x46, 0x36, \n  0xfe, 0x0c, 0x75, 0xfb, 0x79, 0x24, 0xfa, 0x5f, 0x31, 0xff, 0x67, 0x8e, 0xfe, 0x56, 0x0c, 0xff, \n  0xa1, 0x96, 0x01, 0x98, 0x5e, 0xff, 0xab, 0x8a, 0x29, 0x18, 0x91, 0x20, 0x8b, 0xfa, 0xfb, 0x18, \n  0x3f, 0x1d, 0xa8, 0x0b, 0x02, 0x11, 0xe1, 0xf0, 0x68, 0xc7, 0x01, 0x79, 0xe7, 0xfb, 0xbc, 0x70, \n  0xf0, 0x52, 0x60, 0xf3, 0x30, 0x54, 0x12, 0x69, 0x63, 0x02, 0xb9, 0xd5, 0xf9, 0x9a, 0x14, 0x09, \n  0x09, 0xcd, 0xfc, 0x91, 0xb7, 0xf7, 0x10, 0xf1, 0x06, 0x4a, 0xf7, 0x02, 0xfe, 0x7a, 0xfc, 0x30, \n  0x3f, 0xff, 0x18, 0xc2, 0xfa, 0x20, 0x90, 0xfd, 0x4a, 0xe6, 0xfa, 0x31, 0x09, 0xf9, 0xf1, 0x67, \n  0xfe, 0x12, 0xa8, 0xfc, 0xed, 0xb8, 0xfa, 0x34, 0xa7, 0xfe, 0x3a, 0x07, 0xff, 0x8d, 0x5c, 0xfe, \n  0x3f, 0x2b, 0x00, 0x86, 0x14, 0xff, 0xd7, 0x8c, 0x22, 0x7a, 0x39, 0x1d, 0x2b, 0x13, 0x01, 0xfe, \n  0x94, 0x1a, 0x52, 0x1b, 0x02, 0x0f, 0x06, 0xf5, 0xb5, 0xea, 0x03, 0x43, 0xe0, 0xfb, 0x59, 0x38, \n  0xf1, 0x27, 0x5a, 0xf5, 0x73, 0xaa, 0x0e, 0xe7, 0x3a, 0x03, 0xf3, 0x16, 0xfb, 0xa2, 0x0d, 0x07, \n  0x0d, 0x8c, 0xfe, 0xc3, 0x9a, 0xf7, 0xd7, 0xc5, 0x04, 0xb7, 0x8d, 0x03, 0x2f, 0xcd, 0xfc, 0xc2, \n  0xf4, 0xfe, 0x45, 0x7c, 0xfb, 0x17, 0xb4, 0xfd, 0x17, 0xf4, 0xfb, 0x20, 0x67, 0xfb, 0xa5, 0xe8, \n  0xff, 0x5b, 0x08, 0xfd, 0x03, 0x14, 0xfb, 0x8e, 0xc6, 0xfe, 0xa3, 0x18, 0xff, 0x07, 0x00, 0xfe, \n  0x02, 0x34, 0xff, 0xb3, 0x73, 0xfe, 0x14, 0x9f, 0x1d, 0x07, 0x75, 0x1a, 0x4c, 0x15, 0x03, 0x00, \n  0xcb, 0x17, 0xb7, 0xb9, 0x03, 0xd4, 0x73, 0xf8, 0xb5, 0xb9, 0x03, 0xe0, 0x61, 0xfc, 0x0a, 0x78, \n  0xf3, 0xb2, 0x18, 0xf6, 0x9b, 0x2d, 0x0c, 0xc1, 0x6f, 0x04, 0xe8, 0xaa, 0xfa, 0xf2, 0x65, 0x05, \n  0xf7, 0x9a, 0xff, 0xf1, 0x04, 0xf8, 0x66, 0x8b, 0x03, 0xf8, 0x14, 0x03, 0xcf, 0x4d, 0xfd, 0x0d, \n  0xaf, 0xfe, 0x89, 0x05, 0xfc, 0x6e, 0x1e, 0xfe, 0xfb, 0xd4, 0xfd, 0x55, 0x3b, 0xfd, 0xd2, 0xd3, \n  0xff, 0xbd, 0x7f, 0xfd, 0x76, 0xe8, 0xfb, 0xed, 0xff, 0xfe, 0x71, 0x7e, 0xfe, 0xe9, 0x52, 0xfd, \n  0xc0, 0xc1, 0xfe, 0x19, 0x43, 0xfe, 0x92, 0x65, 0x1a, 0xf3, 0x49, 0x18, 0x1a, 0x35, 0x03, 0xb0, \n  0xdb, 0x14, 0xe6, 0x69, 0x06, 0x38, 0x92, 0xfb, 0x39, 0xaa, 0x01, 0x96, 0x39, 0xfd, 0xcd, 0xf5, \n  0xf6, 0xbf, 0xeb, 0xf6, 0x23, 0xf1, 0x09, 0x1e, 0xe6, 0x04, 0xb3, 0xec, 0xfa, 0x45, 0x78, 0x03, \n  0xf5, 0xc0, 0xff, 0x49, 0xe2, 0xf9, 0xd7, 0x98, 0x02, 0xfe, 0x28, 0x02, 0x95, 0xbb, 0xfd, 0xfb, \n  0xaa, 0xfe, 0xb7, 0x55, 0xfd, 0x28, 0xb3, 0xff, 0x7e, 0x4f, 0xff, 0x18, 0x6e, 0xfd, 0xbb, 0x44, \n  0xff, 0x96, 0x65, 0xfe, 0xc5, 0xe0, 0xfc, 0xd9, 0x62, 0xfe, 0xee, 0xc3, 0xfd, 0x70, 0x59, 0xfd, \n  0x80, 0x25, 0xff, 0x79, 0x04, 0xfe, 0x6c, 0x37, 0x16, 0xa4, 0xf4, 0x15, 0x27, 0xc1, 0x04, 0xf6, \n  0xa0, 0x12, 0x8d, 0x3e, 0x07, 0x42, 0xce, 0xfd, 0x0a, 0x56, 0x01, 0x4b, 0xd5, 0xfd, 0x74, 0x1d, \n  0xf9, 0xbd, 0x4c, 0xf8, 0x84, 0xa5, 0x07, 0x74, 0xe9, 0x03, 0x9f, 0xb6, 0xfb, 0x0d, 0x0f, 0x02, \n  0x80, 0xcc, 0xff, 0xce, 0x47, 0xfb, 0xe5, 0x59, 0x01, 0x23, 0x70, 0x01, 0x9d, 0x4d, 0xfe, 0x41, \n  0xfb, 0xff, 0xf8, 0xc1, 0xfe, 0xa1, 0xe7, 0xff, 0xb3, 0x9d, 0xff, 0x58, 0x6e, 0xfd, 0x4b, 0xe2, \n  0xfe, 0x12, 0x8d, 0xfe, 0x8c, 0x1b, 0xfd, 0xa7, 0xca, 0xfd, 0xca, 0xcb, 0xfd, 0xac, 0xe9, 0xfd, \n  0xc1, 0xfb, 0xfe, 0x25, 0x00, 0xfe, 0x55, 0xe8, 0x12, 0xb5, 0xb6, 0x13, 0x63, 0x26, 0x06, 0x61, \n  0x9a, 0x10, 0x4b, 0xba, 0x07, 0x90, 0x96, 0xff, 0x72, 0x07, 0x01, 0xec, 0xcb, 0xfe, 0xd7, 0x31, \n  0xfb, 0xea, 0xd8, 0xf9, 0xbd, 0xf2, 0x04, 0x22, 0x16, 0x03, 0xdf, 0xdf, 0xfc, 0x62, 0xcc, 0x00, \n  0xd2, 0x0c, 0x00, 0xa8, 0x4e, 0xfc, 0x38, 0x92, 0x00, 0x40, 0xfb, 0x01, 0xd4, 0xf6, 0xff, 0x21, \n  0x08, 0x00, 0xd6, 0x21, 0xff, 0xd0, 0x94, 0x00, 0xcd, 0x7f, 0xff, 0xdb, 0x18, 0xfd, 0xcc, 0x77, \n  0xfe, 0xff, 0x86, 0xfe, 0x08, 0x72, 0xfd, 0x2e, 0x40, 0xfe, 0xd6, 0x29, 0xfe, 0x4c, 0x2a, 0xfe, \n  0xfd, 0x35, 0xff, 0x2f, 0x6b, 0xfe, 0x38, 0x85, 0x0f, 0x47, 0xa5, 0x11, 0x35, 0x92, 0x07, 0x65, \n  0x69, 0x0f, 0xab, 0x2f, 0x07, 0x54, 0x5b, 0x00, 0x8a, 0x43, 0x02, 0xd6, 0xc2, 0xff, 0xac, 0x50, \n  0xfc, 0x25, 0xb2, 0xfa, 0xd6, 0x2a, 0x03, 0x5e, 0x41, 0x02, 0xa2, 0xe6, 0xfc, 0x86, 0xc8, 0x00, \n  0xa7, 0xb4, 0x00, 0x2f, 0xf3, 0xfc, 0x89, 0x45, 0x01, 0x0b, 0x6f, 0x02, 0xe6, 0xa4, 0xff, 0xfb, \n  0x0c, 0x00, 0x99, 0xff, 0xff, 0xe5, 0x92, 0x00, 0xc9, 0x9d, 0xfe, 0xe2, 0x8d, 0xfc, 0x93, 0x99, \n  0xfe, 0x47, 0x40, 0xff, 0x71, 0x06, 0xfe, 0x83, 0x42, 0xfe, 0x40, 0x62, 0xfe, 0x87, 0xe5, 0xfe, \n  0xc1, 0xa6, 0xff, 0x6c, 0xe3, 0xfe, 0x38, 0x9d, 0x0d, 0x0b, 0x37, 0x10, 0x76, 0x88, 0x07, 0xe3, \n  0x04, 0x0e, 0x19, 0xf6, 0x06, 0x6e, 0xc1, 0x00, 0x16, 0xc9, 0x02, 0x2c, 0xc6, 0x00, 0xf6, 0x84, \n  0xfd, 0x7b, 0xf7, 0xfa, 0xd9, 0x82, 0x01, 0x87, 0x89, 0x01, 0x54, 0x51, 0xfd, 0x2c, 0x67, 0x01, \n  0x14, 0x39, 0x02, 0xfc, 0xe9, 0xfd, 0xb7, 0x5f, 0x00, 0x80, 0xf7, 0x01, 0x90, 0xff, 0xff, 0x65, \n  0x62, 0x00, 0xf9, 0x1f, 0x00, 0x3e, 0x6a, 0xff, 0x6d, 0x9c, 0xfd, 0xa4, 0xae, 0xfd, 0x94, 0x90, \n  0xff, 0xe3, 0x41, 0xff, 0x70, 0x37, 0xfe, 0x78, 0x80, 0xfe, 0x54, 0x28, 0xff, 0x31, 0xae, 0xff, \n  0x50, 0x4b, 0xff, 0xf4, 0xd6, 0xfd, 0x59, 0xea, 0x0c, 0x15, 0x98, 0x0e, 0x40, 0x00, 0x07, 0xa8, \n  0x2f, 0x0d, 0x45, 0xfe, 0x05, 0xc9, 0x4b, 0x01, 0x4d, 0xb7, 0x03, 0xd3, 0x90, 0x01, 0x9d, 0xe2, \n  0xfd, 0xac, 0x15, 0xfb, 0x14, 0xbb, 0x00, 0xad, 0xef, 0x00, 0x6b, 0x82, 0xff, 0x6f, 0x6b, 0x03, \n  0xf0, 0x5c, 0x01, 0x05, 0x76, 0xfd, 0x17, 0x75, 0x00, 0x9e, 0xbb, 0x01, 0xa2, 0x80, 0x00, 0xfc, \n  0x27, 0x00, 0xd0, 0x28, 0xff, 0x05, 0x0f, 0xff, 0x9c, 0xa7, 0xfe, 0xe7, 0xdc, 0xfe, 0x5e, 0xc3, \n  0xff, 0xc1, 0x6a, 0xff, 0x7c, 0x93, 0xfe, 0x56, 0x4b, 0xff, 0x72, 0x5e, 0xff, 0x83, 0xb8, 0xfe, \n  0x3f, 0x56, 0xfe, 0x40, 0x85, 0xfd, 0x3a, 0x59, 0x0c, 0x5f, 0x67, 0x0d, 0xd3, 0x28, 0x06, 0xa1, \n  0xfc, 0x0b, 0xe8, 0x8b, 0x05, 0x2a, 0x00, 0x02, 0x20, 0xaa, 0x04, 0x97, 0xae, 0x01, 0x39, 0x0e, \n  0xfe, 0xe6, 0xa9, 0xfb, 0xba, 0xdd, 0x00, 0x08, 0xd0, 0x02, 0x47, 0xa9, 0x00, 0x44, 0xa8, 0x02, \n  0xdf, 0x11, 0x01, 0x53, 0x80, 0xfd, 0xf1, 0x4e, 0x00, 0xa8, 0xdd, 0x01, 0x0d, 0x14, 0x00, 0x8c, \n  0xbc, 0xff, 0x8c, 0xda, 0xff, 0x57, 0xaa, 0xff, 0x0e, 0x85, 0xff, 0x05, 0x5f, 0xff, 0x8c, 0x2b, \n  0x00, 0x61, 0xfa, 0xff, 0xb5, 0x96, 0xfe, 0x0b, 0x9c, 0xfe, 0x11, 0x82, 0xfe, 0x23, 0x5c, 0xfe, \n  0x14, 0x66, 0xfe, 0x32, 0x54, 0xfe, 0xd8, 0x6b, 0x0b, 0xaa, 0xfe, 0x0b, 0x74, 0x47, 0x05, 0x34, \n  0x04, 0x0b, 0x33, 0x8b, 0x05, 0x97, 0xc9, 0x02, 0xfe, 0x12, 0x05, 0x84, 0xbd, 0x01, 0xba, 0xf2, \n  0xfe, 0x9d, 0x24, 0xfe, 0xf7, 0x1a, 0x01, 0x0f, 0xfc, 0x01, 0x66, 0x8f, 0x01, 0x88, 0x3a, 0x02, \n  0x00, 0x75, 0x00, 0xa7, 0x93, 0xfd, 0x09, 0x8e, 0xff, 0x72, 0xbd, 0x01, 0xfa, 0xf0, 0x00, 0x17, \n  0xa2, 0x00, 0x90, 0xdc, 0xff, 0x80, 0xb9, 0xff, 0x22, 0x4c, 0x00, 0x61, 0x6d, 0x00, 0x57, 0x5e, \n  0x00, 0x56, 0xb3, 0xfe, 0x25, 0x5b, 0xfd, 0x82, 0x4d, 0xfe, 0x07, 0xcf, 0xfe, 0x07, 0xee, 0xfe, \n  0xe7, 0xcc, 0xfe, 0x74, 0x0e, 0xfe, 0xbe, 0xce, 0x0a, 0xc0, 0xaa, 0x0b, 0xe4, 0x3d, 0x04, 0xe9, \n  0x1f, 0x08, 0xf0, 0xd9, 0x05, 0x49, 0x02, 0x05, 0x9f, 0x89, 0x05, 0x7f, 0xc4, 0x02, 0x28, 0x88, \n  0x00, 0x84, 0x1d, 0xfe, 0x19, 0x26, 0x01, 0xc7, 0xc7, 0x02, 0xf7, 0x04, 0x01, 0x08, 0x0b, 0x01, \n  0x20, 0x86, 0xff, 0x21, 0x9a, 0xfd, 0x4e, 0xef, 0x00, 0xa5, 0xe4, 0x02, 0xc6, 0xda, 0x00, 0x9e, \n  0x2d, 0x00, 0x2c, 0x4f, 0x00, 0xb3, 0x41, 0x01, 0x9d, 0x1e, 0x01, 0x8f, 0x3d, 0xff, 0x7f, 0x65, \n  0xfe, 0xce, 0x0a, 0xfe, 0x4b, 0x05, 0xfe, 0x7d, 0xe7, 0xfe, 0x38, 0x46, 0xff, 0x32, 0xb5, 0xfe, \n  0x31, 0x5a, 0xfe, 0x77, 0x36, 0xfe, 0xae, 0x61, 0x08, 0xb3, 0xa8, 0x0a, 0x60, 0x94, 0x04, 0x20, \n  0x53, 0x07, 0xf4, 0x5e, 0x06, 0x46, 0x49, 0x05, 0x14, 0xe2, 0x07, 0x43, 0xa4, 0x04, 0xf4, 0xf5, \n  0x00, 0x09, 0xd7, 0xfe, 0xfb, 0xab, 0xff, 0x95, 0xea, 0x01, 0xc0, 0x1d, 0x01, 0x1a, 0x48, 0x00, \n  0x99, 0x8d, 0xff, 0x30, 0x4f, 0xff, 0xc1, 0x92, 0x01, 0x4b, 0xf1, 0x02, 0x19, 0x63, 0x01, 0xf6, \n  0x77, 0x00, 0x8c, 0x06, 0x01, 0x70, 0x3d, 0x01, 0x56, 0xe5, 0xff, 0xc1, 0x29, 0xfe, 0xa3, 0x5b, \n  0xfe, 0xab, 0x83, 0xfe, 0xb2, 0x7a, 0xfe, 0x05, 0x29, 0xff, 0x50, 0xf4, 0xfe, 0x02, 0x97, 0xfe, \n  0xf4, 0x65, 0xfe, 0x5c, 0x5a, 0xfe, 0xdf, 0x34, 0x07, 0xee, 0x7f, 0x0a, 0xc1, 0xe8, 0x05, 0x63, \n  0x3c, 0x07, 0x41, 0x41, 0x08, 0xaf, 0x40, 0x06, 0xea, 0x40, 0x05, 0xb2, 0x96, 0x04, 0x48, 0xf9, \n  0x01, 0x52, 0x5a, 0xff, 0xbb, 0x0f, 0xff, 0x54, 0x4f, 0xff, 0xff, 0xfc, 0xff, 0x9d, 0xe7, 0x01, \n  0x37, 0xd4, 0x01, 0xf7, 0x7b, 0x00, 0x18, 0x79, 0x01, 0xbf, 0x60, 0x02, 0x7d, 0xa6, 0x01, 0xe7, \n  0xa1, 0x00, 0xe2, 0x54, 0x00, 0x00, 0xd7, 0xff, 0x22, 0xd4, 0xfe, 0xa0, 0x7a, 0xfe, 0x38, 0xaa, \n  0xfe, 0x32, 0x7c, 0xfe, 0xdc, 0x6b, 0xfe, 0x5f, 0xed, 0xfe, 0x50, 0x31, 0xff, 0xcf, 0xc4, 0xfe, \n  0xf9, 0x50, 0xfe, 0xc7, 0xa5, 0xfe, 0x0f, 0xda, 0x05, 0x57, 0x7f, 0x0a, 0x21, 0x16, 0x08, 0xfb, \n  0x49, 0x07, 0x5d, 0x48, 0x08, 0x20, 0xfb, 0x07, 0x0c, 0xb9, 0x05, 0xc7, 0x86, 0x02, 0x36, 0x0e, \n  0x00, 0x4f, 0x02, 0xff, 0xb2, 0x6c, 0xff, 0x9d, 0x72, 0x00, 0xf1, 0xb2, 0x00, 0xee, 0x25, 0x01, \n  0xa1, 0x2f, 0x02, 0xfb, 0x64, 0x02, 0x93, 0xef, 0x01, 0x5d, 0xbc, 0x01, 0xef, 0xf0, 0x00, 0x4a, \n  0xf3, 0xff, 0xf0, 0x6d, 0xff, 0xc8, 0x49, 0xff, 0xfd, 0x04, 0xff, 0x6e, 0xac, 0xfe, 0x2c, 0xd1, \n  0xfe, 0x80, 0xb1, 0xfe, 0xcd, 0x47, 0xfe, 0x59, 0x85, 0xfe, 0xbf, 0x1b, 0xff, 0x55, 0x0d, 0xff, \n  0x4d, 0x11, 0xff, 0x67, 0xef, 0xfe, 0xad, 0x81, 0x07, 0x06, 0x08, 0x0b, 0x41, 0xab, 0x06, 0xed, \n  0xc8, 0x08, 0x6d, 0x79, 0x08, 0xa6, 0xff, 0x05, 0x52, 0x25, 0x06, 0x0d, 0xa0, 0x02, 0x22, 0x4f, \n  0xfe, 0x3d, 0x92, 0xfe, 0x2d, 0xd3, 0x00, 0x25, 0xd4, 0x00, 0x62, 0x08, 0x01, 0x75, 0xec, 0x01, \n  0x51, 0xd7, 0x01, 0x9e, 0xbc, 0x02, 0x5f, 0x2d, 0x03, 0x25, 0x01, 0x01, 0xcf, 0x23, 0xff, 0xa1, \n  0x28, 0xff, 0x86, 0x6d, 0xff, 0xd3, 0x62, 0xff, 0x90, 0x50, 0xff, 0x12, 0xce, 0xfe, 0x67, 0x80, \n  0xfe, 0xb3, 0x7c, 0xfe, 0xa7, 0x95, 0xfe, 0x09, 0x33, 0xff, 0x0c, 0xe7, 0xfe, 0xc1, 0xbc, 0xfe, \n  0x5d, 0x43, 0xff, 0xae, 0x37, 0xff, 0xe4, 0x66, 0x07, 0xe1, 0xf3, 0x0a, 0x3e, 0x92, 0x07, 0x14, \n  0xf7, 0x07, 0x52, 0x35, 0x07, 0x1a, 0x4f, 0x05, 0x4a, 0xac, 0x04, 0x04, 0x24, 0x03, 0xb9, 0x44, \n  0x00, 0x3f, 0xf6, 0xff, 0x1f, 0xf1, 0x00, 0x93, 0xa4, 0x00, 0x37, 0xc0, 0x00, 0x64, 0x9b, 0x01, \n  0x56, 0x94, 0x02, 0xb6, 0x40, 0x03, 0x30, 0xb1, 0x02, 0x8e, 0x3f, 0x00, 0x7e, 0x11, 0xff, 0x93, \n  0x21, 0xff, 0x58, 0x03, 0xff, 0x14, 0x5d, 0xff, 0x9a, 0x70, 0xff, 0x25, 0x3f, 0xff, 0x46, 0x9b, \n  0xfe, 0x6a, 0x31, 0xfe, 0x3c, 0x92, 0xfe, 0xb7, 0x18, 0xff, 0xf4, 0x0e, 0xff, 0x1f, 0x22, 0xff, \n  0xc3, 0x23, 0xff, 0x80, 0xfe, 0xfe, 0x74, 0x16, 0x08, 0x3d, 0x13, 0x0c, 0xa9, 0xf4, 0x05, 0x99, \n  0x2f, 0x05, 0xe7, 0xfc, 0x05, 0xa2, 0xc5, 0x04, 0x75, 0x1a, 0x04, 0xe6, 0xb2, 0x04, 0x8c, 0x37, \n  0x02, 0x7c, 0xfc, 0xff, 0xeb, 0x7c, 0x01, 0x86, 0xc8, 0x00, 0x26, 0x82, 0x00, 0xf1, 0x20, 0x02, \n  0xa3, 0x92, 0x02, 0x3f, 0xe3, 0x01, 0xfe, 0xd3, 0x02, 0x83, 0xcb, 0x01, 0x28, 0x9c, 0xfe, 0x7d, \n  0x38, 0xfe, 0xbb, 0x54, 0xff, 0x30, 0xad, 0xff, 0x1b, 0x05, 0xff, 0xdb, 0x1d, 0xff, 0x0e, 0x00, \n  0xff, 0xc0, 0x8c, 0xfe, 0x20, 0x65, 0xfe, 0x3f, 0x88, 0xfe, 0x6e, 0x22, 0xff, 0x09, 0x72, 0xff, \n  0xff, 0x37, 0xff, 0x29, 0xe0, 0xfe, 0xba, 0x6f, 0x08, 0xdb, 0x8e, 0x0b, 0x2d, 0x7f, 0x04, 0x01, \n  0x87, 0x03, 0x90, 0x11, 0x04, 0xb8, 0xa0, 0x04, 0x8b, 0xdb, 0x05, 0x0f, 0x6d, 0x04, 0xd2, 0xee, \n  0x01, 0x0d, 0x69, 0x02, 0x98, 0xe4, 0x01, 0x14, 0xc7, 0xff, 0x93, 0x4c, 0x01, 0xc9, 0x5e, 0x02, \n  0x67, 0x4b, 0x02, 0x05, 0x6b, 0x02, 0xe5, 0x73, 0x02, 0xb6, 0x20, 0x02, 0x4e, 0xa5, 0x00, 0x6f, \n  0xda, 0xfe, 0x28, 0x2d, 0xfe, 0x5c, 0x16, 0xff, 0x24, 0xac, 0xff, 0xfe, 0xce, 0xff, 0x32, 0xea, \n  0xfe, 0x09, 0x89, 0xfe, 0xc8, 0xcd, 0xfe, 0x4f, 0x8b, 0xfe, 0xb2, 0xb4, 0xfe, 0xed, 0x13, 0xff, \n  0x25, 0xa2, 0xff, 0x68, 0x52, 0xff, 0x0a, 0xa3, 0x08, 0x39, 0x65, 0x0b, 0xd6, 0x69, 0x04, 0xe8, \n  0xb5, 0x03, 0x73, 0xeb, 0x03, 0xd6, 0x91, 0x03, 0x99, 0xc5, 0x03, 0xed, 0x04, 0x03, 0xdf, 0xf3, \n  0x01, 0x5f, 0x09, 0x03, 0x77, 0x2d, 0x03, 0x7b, 0xc8, 0x01, 0xce, 0xb6, 0x00, 0x9d, 0x2e, 0x01, \n  0x6e, 0x38, 0x03, 0x7c, 0xb1, 0x02, 0xda, 0x07, 0x02, 0xaf, 0x29, 0x02, 0x6e, 0x4d, 0x02, 0x85, \n  0x89, 0x00, 0x2c, 0x5c, 0xff, 0x88, 0xc4, 0xfe, 0xe7, 0x02, 0xfe, 0x98, 0xdd, 0xff, 0x00, 0xff, \n  0xff, 0xb1, 0xe7, 0xfe, 0x3c, 0xd3, 0xfe, 0xa4, 0x1f, 0xff, 0x5c, 0x9c, 0xfe, 0xa0, 0xd1, 0xfe, \n  0x45, 0x65, 0xff, 0x5b, 0x4d, 0xff, 0x37, 0xba, 0x08, 0x11, 0xf6, 0x0b, 0x4e, 0x49, 0x04, 0xe0, \n  0x66, 0x03, 0xc9, 0xf0, 0x04, 0x89, 0x88, 0x04, 0x41, 0x01, 0x03, 0x88, 0x12, 0x00, 0x75, 0x9c, \n  0xfe, 0x45, 0x69, 0x03, 0x40, 0x64, 0x05, 0xe8, 0x98, 0x01, 0xe5, 0xcc, 0x00, 0x12, 0x9a, 0x01, \n  0x22, 0x08, 0x02, 0xd7, 0xa3, 0x02, 0x86, 0xe5, 0x02, 0x37, 0xe4, 0x01, 0x12, 0x11, 0x02, 0x92, \n  0xa2, 0x02, 0x6d, 0x21, 0x01, 0x43, 0x38, 0xff, 0xae, 0xe6, 0xfe, 0x71, 0xb0, 0xfe, 0x74, 0x49, \n  0xfe, 0xfa, 0xd8, 0xff, 0x5d, 0xef, 0xff, 0x39, 0xeb, 0xfe, 0xfe, 0x10, 0xff, 0x1f, 0xe7, 0xfe, \n  0xa7, 0xe0, 0xfe, 0xcc, 0x42, 0xff, 0x59, 0x39, 0x0a, 0x88, 0xed, 0x0c, 0xd2, 0xbf, 0x03, 0xb9, \n  0xb2, 0x03, 0x16, 0x09, 0x05, 0xf4, 0xd3, 0x04, 0xd6, 0xe1, 0x02, 0x89, 0x0f, 0xfe, 0x43, 0x1b, \n  0xfd, 0xf8, 0x67, 0x02, 0x9f, 0x21, 0x04, 0x8f, 0xeb, 0x01, 0x1c, 0x75, 0x01, 0x3c, 0x2a, 0x00, \n  0x9b, 0xc5, 0x01, 0x37, 0x29, 0x03, 0x3c, 0xb2, 0x01, 0x11, 0xeb, 0x01, 0x18, 0xdc, 0x02, 0x8b, \n  0xa6, 0x01, 0x9d, 0xc8, 0x01, 0xf0, 0x1a, 0x02, 0x5a, 0x4f, 0xff, 0x6f, 0x79, 0xfe, 0xe0, 0x54, \n  0xfe, 0x4a, 0x31, 0xfe, 0x06, 0x53, 0xff, 0x3b, 0xe5, 0xff, 0xac, 0x60, 0xff, 0xb7, 0xdf, 0xfe, \n  0xe8, 0xfa, 0xfe, 0x3b, 0x95, 0xfe, 0xbe, 0xff, 0x0b, 0x3d, 0x33, 0x0f, 0xe7, 0x18, 0x04, 0x9c, \n  0x85, 0x03, 0x75, 0x27, 0x04, 0x97, 0x49, 0x04, 0x0e, 0xd4, 0x02, 0xdd, 0x31, 0xfd, 0x62, 0xba, \n  0xfb, 0x94, 0xbe, 0x02, 0x50, 0x59, 0x04, 0x22, 0xd1, 0xff, 0x95, 0x65, 0x00, 0x0b, 0x7b, 0x00, \n  0x21, 0x9a, 0x01, 0x27, 0x21, 0x02, 0x2d, 0x9c, 0x01, 0xb8, 0x43, 0x02, 0xc9, 0x0a, 0x02, 0x8d, \n  0x1d, 0x02, 0xe1, 0x15, 0x02, 0x63, 0x6a, 0x01, 0x2a, 0x45, 0x01, 0xa6, 0x8d, 0x00, 0x78, 0x0d, \n  0xfe, 0xe9, 0x50, 0xfe, 0xd5, 0x0c, 0xff, 0x2a, 0x8c, 0xfe, 0x82, 0x45, 0xff, 0x45, 0xdb, 0xff, \n  0xe4, 0x58, 0xff, 0xa8, 0x9e, 0xfe, 0xdd, 0x35, 0x0e, 0x51, 0x37, 0x11, 0xeb, 0xc3, 0x03, 0x5a, \n  0xcd, 0x03, 0xe5, 0x1f, 0x04, 0xe4, 0x57, 0x04, 0xc0, 0x6e, 0x02, 0xea, 0xff, 0xfa, 0xfd, 0xc5, \n  0xfa, 0x33, 0xc1, 0x03, 0x8f, 0x85, 0x04, 0xd0, 0x33, 0xff, 0x6e, 0x48, 0xff, 0x9e, 0x80, 0xfe, \n  0xcd, 0x54, 0x01, 0x55, 0x99, 0x02, 0xdc, 0x3f, 0x01, 0x06, 0x98, 0x01, 0x73, 0xb6, 0x01, 0x2e, \n  0x77, 0x01, 0x6a, 0x87, 0x01, 0x48, 0x94, 0x02, 0x9a, 0x16, 0x01, 0xd2, 0xb3, 0x00, 0xd2, 0x85, \n  0x00, 0x8b, 0x39, 0xff, 0xd2, 0x81, 0xfe, 0x0a, 0x86, 0xfe, 0x77, 0xe4, 0xfe, 0x11, 0xe2, 0xfe, \n  0xa4, 0x8b, 0xff, 0xbd, 0x5c, 0xff, 0x05, 0xd3, 0x10, 0xb1, 0x29, 0x13, 0xb6, 0x0b, 0x03, 0xf9, \n  0x7b, 0x04, 0xa9, 0x95, 0x04, 0x78, 0x60, 0x04, 0xb7, 0xc7, 0x01, 0xbe, 0xfe, 0xf8, 0xee, 0x14, \n  0xfa, 0x2c, 0xf1, 0x04, 0x5f, 0x6f, 0x04, 0xe6, 0x71, 0xfe, 0xb6, 0x09, 0xff, 0xa0, 0xcb, 0xfd, \n  0xee, 0x5b, 0x00, 0x98, 0x78, 0x01, 0x5e, 0x79, 0x01, 0x80, 0x1a, 0x02, 0x04, 0x1e, 0x01, 0x99, \n  0x5f, 0x00, 0xff, 0x27, 0x01, 0xea, 0x1f, 0x02, 0xb2, 0xfc, 0x00, 0x6e, 0xb5, 0x01, 0x76, 0x22, \n  0x00, 0xc8, 0x7f, 0x00, 0x9c, 0xc9, 0x00, 0xe0, 0x91, 0xfe, 0x96, 0x9a, 0xfe, 0x43, 0xf7, 0xfe, \n  0xea, 0xe7, 0xfe, 0xe9, 0x9b, 0xfe, 0xc6, 0xe2, 0x13, 0xd2, 0x7c, 0x15, 0x77, 0x39, 0x02, 0x94, \n  0xe9, 0x04, 0x64, 0x90, 0x04, 0x51, 0xea, 0x03, 0x77, 0xf4, 0x00, 0xb7, 0x09, 0xf7, 0x0a, 0x72, \n  0xfa, 0xae, 0x70, 0x06, 0xc4, 0x85, 0x03, 0x33, 0x46, 0xfd, 0xee, 0x76, 0xfe, 0x8c, 0x51, 0xfd, \n  0xf9, 0x88, 0x00, 0x7d, 0xe5, 0x00, 0x74, 0x2c, 0x00, 0xfc, 0x06, 0x02, 0x7a, 0x39, 0x01, 0x28, \n  0xfc, 0xff, 0x27, 0x64, 0x00, 0x9b, 0xfb, 0x00, 0x5f, 0xc0, 0x00, 0x57, 0x16, 0x01, 0x55, 0x2a, \n  0x00, 0xce, 0x17, 0x01, 0x91, 0x95, 0x00, 0xfb, 0x58, 0x00, 0x61, 0x1c, 0x00, 0x8c, 0x99, 0xfe, \n  0xfe, 0xc8, 0xfe, 0x6e, 0x8b, 0xfe, 0x1d, 0x37, 0x17, 0xb5, 0xa4, 0x17, 0xfc, 0x49, 0x01, 0x68, \n  0xe0, 0x05, 0x7e, 0xe7, 0x04, 0xce, 0x21, 0x03, 0x16, 0x77, 0xff, 0xec, 0x01, 0xf5, 0x5b, 0x8c, \n  0xfb, 0xec, 0x69, 0x08, 0x4f, 0x89, 0x02, 0x54, 0x67, 0xfc, 0xc0, 0xaf, 0xfd, 0x52, 0x86, 0xfc, \n  0x31, 0xd7, 0x00, 0xc9, 0x6c, 0x00, 0xb5, 0x42, 0x00, 0xf4, 0xdb, 0x01, 0xb0, 0x3c, 0x00, 0x39, \n  0xcc, 0xff, 0x78, 0x45, 0x00, 0x41, 0xc8, 0x00, 0xec, 0xde, 0xff, 0x8c, 0x4f, 0x00, 0xfc, 0x7c, \n  0xff, 0xf6, 0xad, 0x00, 0x48, 0x31, 0x01, 0xb7, 0x89, 0x00, 0xfa, 0x92, 0x00, 0x19, 0xa4, 0x00, \n  0xf2, 0xb6, 0xff, 0x1a, 0xae, 0xfd, 0x3f, 0xaa, 0x1a, 0x7c, 0xfe, 0x19, 0x6d, 0x52, 0x00, 0xf0, \n  0xf4, 0x06, 0xb3, 0x2f, 0x05, 0x3f, 0x0e, 0x02, 0xb3, 0x91, 0xfd, 0xcd, 0x1e, 0xf3, 0x8e, 0x63, \n  0xfd, 0xe8, 0x01, 0x0a, 0x1b, 0x45, 0x01, 0xfe, 0xd0, 0xfb, 0x9b, 0x4a, 0xfd, 0x91, 0xda, 0xfb, \n  0x39, 0xde, 0x00, 0xfd, 0xa2, 0xff, 0x0a, 0xfb, 0xff, 0xde, 0x9e, 0x02, 0x63, 0xcf, 0xff, 0x4f, \n  0xf9, 0xfe, 0x66, 0xe1, 0xff, 0xe4, 0x8d, 0x00, 0x2f, 0xd3, 0xff, 0x48, 0xf4, 0xff, 0xd5, 0x07, \n  0xfe, 0xf6, 0x3b, 0x00, 0x19, 0xcd, 0x00, 0x31, 0x08, 0x00, 0xce, 0x8f, 0x01, 0x0f, 0x70, 0x00, \n  0xc3, 0x17, 0x00, 0x40, 0xc6, 0xff, 0xbd, 0xbf, 0x1d, 0x3f, 0x23, 0x1d, 0xc2, 0x85, 0xff, 0x29, \n  0x81, 0x07, 0xa3, 0x54, 0x05, 0x7f, 0x99, 0x00, 0xe6, 0xb1, 0xfb, 0x3c, 0x85, 0xf1, 0x97, 0x6e, \n  0xff, 0x12, 0x20, 0x0b, 0xd4, 0xb3, 0xff, 0xee, 0x71, 0xfb, 0xc8, 0xd8, 0xfc, 0x4d, 0xb3, 0xfb, \n  0x9c, 0x08, 0x01, 0xbe, 0x82, 0xfe, 0x62, 0x74, 0xff, 0x28, 0xff, 0x02, 0xc5, 0x99, 0xff, 0x6a, \n  0xf4, 0xfe, 0xe6, 0x62, 0xff, 0xa5, 0xc1, 0xff, 0x90, 0xd1, 0xff, 0xc2, 0x9a, 0xff, 0xc4, 0xa2, \n  0xfd, 0x07, 0x94, 0xff, 0xa8, 0xad, 0xff, 0xe8, 0x13, 0x00, 0x16, 0x64, 0x00, 0xd3, 0x2c, 0x00, \n  0xf5, 0x52, 0x01, 0x9c, 0xa8, 0xff, 0x66, 0x73, 0x20, 0x9e, 0x72, 0x20, 0x19, 0x51, 0xff, 0xe6, \n  0xc3, 0x07, 0xee, 0xaa, 0x05, 0x8b, 0x25, 0xff, 0xcf, 0xb6, 0xf9, 0x19, 0x03, 0xf0, 0xb0, 0xa0, \n  0x01, 0x2d, 0xe4, 0x0b, 0xfd, 0x47, 0xfe, 0x7e, 0x31, 0xfb, 0x75, 0x33, 0xfc, 0x48, 0xe5, 0xfb, \n  0x08, 0x58, 0x01, 0xdc, 0xb5, 0xfd, 0xe7, 0xc7, 0xfe, 0x9b, 0xf2, 0x02, 0x6c, 0x50, 0xff, 0xc4, \n  0x17, 0xff, 0x79, 0x67, 0xff, 0x14, 0x2d, 0xff, 0x7e, 0x68, 0xff, 0x01, 0x56, 0xff, 0xee, 0x2c, \n  0xfd, 0xaf, 0x94, 0xff, 0x4c, 0x8f, 0xff, 0xb8, 0xee, 0xfd, 0xe9, 0x22, 0x00, 0xa9, 0xfb, 0x00, \n  0xe9, 0x91, 0x00, 0xc8, 0x0c, 0x00, 0xe4, 0xc2, 0x21, 0xe6, 0x47, 0x24, 0x54, 0x75, 0x00, 0x24, \n  0x10, 0x07, 0x26, 0x89, 0x06, 0xd1, 0xb4, 0xfd, 0xfe, 0xfa, 0xf7, 0xdd, 0xc3, 0xee, 0x9f, 0xb9, \n  0x02, 0x4b, 0x9a, 0x0c, 0xac, 0x56, 0xfd, 0x60, 0x1d, 0xfb, 0x2d, 0x2f, 0xfb, 0xb2, 0x0b, 0xfc, \n  0xae, 0xa7, 0x01, 0xfd, 0x4a, 0xfd, 0x01, 0x81, 0xfe, 0x7b, 0x74, 0x02, 0x0c, 0xbf, 0xfe, 0xf8, \n  0x10, 0xff, 0xaa, 0x7c, 0xff, 0x49, 0x06, 0xff, 0x47, 0x3d, 0xff, 0xd1, 0x8a, 0xfe, 0x7e, 0x69, \n  0xfd, 0x42, 0xd7, 0xfe, 0x13, 0x1e, 0xfe, 0xf9, 0xe9, 0xfe, 0xf7, 0xfb, 0xff, 0xc9, 0xd5, 0xff, \n  0xff, 0x7a, 0x00, 0xf9, 0xba, 0xff, 0x91, 0x2c, 0x21, 0x9e, 0x37, 0x28, 0x35, 0xe2, 0x03, 0x61, \n  0x7a, 0x05, 0x95, 0x89, 0x07, 0x1d, 0x00, 0xfd, 0xde, 0x6e, 0xf6, 0xa4, 0x30, 0xee, 0xb3, 0x21, \n  0x02, 0xcc, 0x0e, 0x0d, 0x42, 0x3f, 0xfd, 0x0d, 0x28, 0xfb, 0xa9, 0x4a, 0xfa, 0xfb, 0xb3, 0xfb, \n  0x05, 0xd4, 0x01, 0x06, 0x33, 0xfd, 0x41, 0x51, 0xfe, 0x26, 0x49, 0x02, 0xc3, 0x4d, 0xfe, 0xcb, \n  0x6d, 0xfe, 0x29, 0x9b, 0xff, 0xc8, 0xb5, 0xfe, 0xdf, 0x76, 0xff, 0x1e, 0xa5, 0xfe, 0xfd, 0xcb, \n  0xfb, 0xdb, 0x57, 0xfe, 0x2d, 0xe8, 0xfe, 0x88, 0x4d, 0xfe, 0x4a, 0xaf, 0xff, 0x60, 0xe9, 0xff, \n  0xff, 0x02, 0x00, 0xa1, 0x6c, 0xff, 0xd9, 0xbd, 0x1f, 0x2b, 0xbc, 0x2a, 0x1d, 0x31, 0x09, 0xba, \n  0x78, 0x04, 0x9f, 0x6e, 0x07, 0x8e, 0x64, 0xfd, 0xad, 0xdd, 0xf4, 0x06, 0x2a, 0xee, 0x27, 0x96, \n  0x00, 0x2a, 0x9d, 0x0c, 0xf2, 0xb2, 0xfd, 0xde, 0x31, 0xfb, 0x39, 0xd9, 0xf9, 0xe3, 0xe8, 0xfa, \n  0x97, 0xcb, 0x01, 0x3a, 0x13, 0xfd, 0xc2, 0x1c, 0xfe, 0x53, 0x41, 0x02, 0x76, 0x42, 0xfe, 0x8f, \n  0xdd, 0xfd, 0x0a, 0xdf, 0xfe, 0x2c, 0x14, 0xff, 0xb2, 0x73, 0xff, 0x0a, 0xf8, 0xfc, 0x9e, 0x23, \n  0xfc, 0x1c, 0x8c, 0xfe, 0x07, 0x2d, 0xfe, 0x1f, 0x31, 0xfe, 0x65, 0x41, 0xff, 0x15, 0xed, 0xff, \n  0xbb, 0x4d, 0x00, 0x2c, 0xda, 0xff, 0xa5, 0x34, 0x1f, 0x7a, 0x43, 0x2b, 0xaf, 0xd5, 0x0d, 0x39, \n  0x3d, 0x06, 0x0f, 0x0b, 0x06, 0xac, 0xea, 0xfd, 0xf0, 0x15, 0xf4, 0xdc, 0xee, 0xed, 0x7c, 0xd4, \n  0xff, 0xcd, 0x40, 0x0b, 0xf6, 0xcf, 0xfd, 0x78, 0x5e, 0xfb, 0xfb, 0xa3, 0xf9, 0xf6, 0x67, 0xfa, \n  0x43, 0x8f, 0x01, 0x0e, 0xad, 0xfc, 0x87, 0x05, 0xfe, 0xc6, 0x44, 0x02, 0xbe, 0x6e, 0xfe, 0xd8, \n  0x9b, 0xfd, 0xc0, 0xf7, 0xfe, 0x20, 0xe3, 0xfd, 0xb7, 0x6c, 0xfe, 0x80, 0x56, 0xfe, 0x58, 0x75, \n  0xfb, 0x0a, 0xce, 0xfd, 0xb2, 0x08, 0xfe, 0xfb, 0x07, 0xfe, 0x48, 0x39, 0xff, 0x09, 0x33, 0x00, \n  0x2c, 0x8d, 0x00, 0x1a, 0x1c, 0xff, 0xd8, 0xb1, 0x1f, 0x51, 0xfa, 0x2a, 0x82, 0x2d, 0x10, 0xd0, \n  0x00, 0x0a, 0x11, 0x6a, 0x05, 0xe7, 0x16, 0xfd, 0xce, 0x5c, 0xf4, 0x34, 0xdd, 0xed, 0xa3, 0x40, \n  0xff, 0x60, 0xbb, 0x09, 0xfc, 0xad, 0xfd, 0xa3, 0x6d, 0xfb, 0x9e, 0x17, 0xf9, 0xab, 0x61, 0xfa, \n  0xa2, 0x5c, 0x01, 0x58, 0x15, 0xfc, 0x1a, 0xe3, 0xfd, 0x3e, 0x32, 0x02, 0xe9, 0xa4, 0xfe, 0xb5, \n  0xc4, 0xfe, 0xd9, 0x17, 0xfd, 0x05, 0x2d, 0xfd, 0x15, 0x65, 0xff, 0x81, 0x9d, 0xfd, 0xae, 0xa3, \n  0xfb, 0x34, 0x27, 0xfd, 0xd8, 0x69, 0xfd, 0x2c, 0x3a, 0xfe, 0xf5, 0xc6, 0xff, 0xfc, 0x27, 0x00, \n  0x80, 0xa4, 0xff, 0x2f, 0x00, 0xff, 0x36, 0x5d, 0x21, 0xb7, 0x16, 0x2a, 0x73, 0x5b, 0x10, 0x8c, \n  0xa7, 0x0d, 0x61, 0xa7, 0x06, 0xb1, 0xfa, 0xfb, 0x67, 0x54, 0xf4, 0x0e, 0x80, 0xef, 0x52, 0x9b, \n  0xfe, 0xb4, 0xab, 0x07, 0xa9, 0x68, 0xfd, 0xea, 0x30, 0xfc, 0x6f, 0xc1, 0xf7, 0xfb, 0x11, 0xfa, \n  0x2e, 0x8d, 0x01, 0xc1, 0x24, 0xfb, 0x59, 0x96, 0xfd, 0x93, 0x83, 0x02, 0x5a, 0xfc, 0xfe, 0xd2, \n  0xa2, 0xfd, 0x34, 0x23, 0xfe, 0x67, 0x48, 0xfd, 0x4a, 0x3d, 0xfe, 0xc5, 0xc3, 0xfd, 0x7e, 0xba, \n  0xfb, 0x76, 0x61, 0xfd, 0x4c, 0xae, 0xfc, 0x00, 0x79, 0xfe, 0x3c, 0x84, 0xff, 0x81, 0x57, 0xff, \n  0xf4, 0x43, 0x00, 0x72, 0xe2, 0xff, 0x5b, 0xf7, 0x24, 0x7d, 0x7b, 0x28, 0xe3, 0x1e, 0x0f, 0x3d, \n  0x06, 0x11, 0x83, 0x78, 0x07, 0x7d, 0x05, 0xfc, 0xa4, 0xcb, 0xf2, 0xb7, 0x26, 0xf2, 0x93, 0x48, \n  0xff, 0x06, 0xc9, 0x03, 0xe4, 0xed, 0xfc, 0x24, 0xfb, 0xfd, 0x10, 0xdb, 0xf6, 0x37, 0xd7, 0xf8, \n  0x95, 0xf1, 0x01, 0x75, 0x6c, 0xf9, 0x63, 0xb7, 0xfe, 0xc8, 0xf0, 0x01, 0x3d, 0x59, 0xfd, 0xe1, \n  0x22, 0x00, 0x32, 0xd1, 0xfd, 0x76, 0x98, 0xfc, 0xf4, 0x8c, 0xfe, 0x77, 0x4e, 0xfd, 0x5e, 0x8e, \n  0xfb, 0x1d, 0x1b, 0xfe, 0x25, 0x98, 0xfc, 0x77, 0x5a, 0xfd, 0x6c, 0xe2, 0xfe, 0x23, 0x08, 0x00, \n  0x85, 0xe0, 0x00, 0xc5, 0x0e, 0xff, 0xb1, 0xb2, 0x29, 0xa7, 0xa4, 0x26, 0x4f, 0x28, 0x0c, 0x2c, \n  0xee, 0x14, 0x97, 0xc9, 0x06, 0x95, 0xfd, 0xfc, 0xcf, 0xe2, 0xf1, 0xaa, 0x36, 0xf4, 0xc8, 0x19, \n  0x02, 0xc3, 0x52, 0xfe, 0x39, 0x39, 0xfb, 0x0b, 0x95, 0x00, 0x22, 0xe2, 0xf6, 0x2c, 0x5a, 0xf7, \n  0x83, 0x69, 0x01, 0x65, 0xd7, 0xf8, 0x86, 0xcf, 0xfd, 0x1e, 0xf2, 0x00, 0x41, 0x57, 0xfe, 0x40, \n  0xc1, 0x00, 0xc8, 0x87, 0xfd, 0x14, 0xdd, 0xfc, 0x07, 0x6e, 0xfe, 0xca, 0x48, 0xfd, 0x7e, 0x68, \n  0xfb, 0x5c, 0xb8, 0xfe, 0x85, 0x87, 0xfb, 0x51, 0xdb, 0xfc, 0xa7, 0xdf, 0xff, 0x93, 0x95, 0xff, \n  0x07, 0xd4, 0xff, 0x59, 0x38, 0xff, 0x7e, 0xcb, 0x2e, 0x0a, 0xa8, 0x25, 0x8a, 0x50, 0x07, 0x9c, \n  0x9b, 0x19, 0x11, 0xc3, 0x05, 0xb2, 0xb6, 0xfc, 0x7a, 0x4e, 0xf3, 0x82, 0xad, 0xf5, 0xdc, 0x43, \n  0x06, 0x88, 0x68, 0xf9, 0x5f, 0x14, 0xf7, 0xb0, 0xc8, 0x03, 0x3f, 0x2a, 0xf8, 0xc3, 0xea, 0xf5, \n  0xf3, 0xf4, 0x01, 0x64, 0xb6, 0xf5, 0xe6, 0x49, 0xfd, 0xe4, 0x9d, 0x02, 0x12, 0xda, 0xfb, 0x19, \n  0x00, 0x03, 0x00, 0x25, 0xfe, 0x1d, 0x2d, 0xfc, 0xbe, 0xbc, 0xfe, 0xce, 0xb8, 0xfd, 0xd6, 0x9f, \n  0xfb, 0xe7, 0x09, 0xfe, 0x54, 0x97, 0xfb, 0xfb, 0x39, 0xfd, 0x8f, 0xea, 0xff, 0xfb, 0xd9, 0xfe, \n  0x22, 0xd7, 0xff, 0xe5, 0xdc, 0xfe, 0xa2, 0x91, 0x33, 0x41, 0x27, 0x26, 0x42, 0x9f, 0x00, 0xc6, \n  0xc0, 0x1d, 0xf5, 0xff, 0x05, 0x24, 0xcb, 0xf9, 0x1f, 0xdf, 0xf5, 0x32, 0xc4, 0xf7, 0xfb, 0x94, \n  0x0a, 0x1a, 0x21, 0xf6, 0x1b, 0x82, 0xf0, 0x25, 0x87, 0x05, 0x92, 0x17, 0xfb, 0xc3, 0x13, 0xf6, \n  0x93, 0x8c, 0xff, 0x30, 0x17, 0xf4, 0x8e, 0x90, 0xfd, 0x03, 0x94, 0x01, 0xdf, 0x35, 0xfb, 0x17, \n  0x41, 0x04, 0x02, 0xfd, 0xfe, 0xda, 0x79, 0xfb, 0xf2, 0xa9, 0xfe, 0x12, 0x4f, 0xfe, 0x5e, 0xab, \n  0xfb, 0x55, 0x29, 0xfe, 0x10, 0x5d, 0xfb, 0xf7, 0xd1, 0xfc, 0xd5, 0x50, 0x00, 0x99, 0xd7, 0xfe, \n  0x21, 0x53, 0xff, 0x72, 0x44, 0xfe, 0x84, 0xaf, 0x39, 0xb1, 0x73, 0x27, 0x73, 0xbd, 0xf8, 0x93, \n  0x47, 0x1f, 0x45, 0xb8, 0x07, 0x74, 0x79, 0xf6, 0x20, 0xc0, 0xf7, 0xff, 0xa9, 0xfa, 0x6d, 0xe3, \n  0x0e, 0x19, 0x18, 0xf5, 0xa3, 0xab, 0xe8, 0xd9, 0xc6, 0x04, 0xea, 0xb5, 0x00, 0xed, 0x8f, 0xf4, \n  0xed, 0x51, 0xfe, 0x5a, 0xac, 0xf3, 0xb8, 0x6f, 0xfb, 0xb2, 0xed, 0x02, 0xa3, 0xb2, 0xf9, 0xed, \n  0xb2, 0x04, 0x16, 0x61, 0x00, 0x9b, 0xbd, 0xfa, 0x73, 0xc7, 0xfe, 0x01, 0x45, 0xfe, 0xb7, 0xa6, \n  0xfb, 0x66, 0xe0, 0xfe, 0x00, 0x8c, 0xfb, 0x75, 0xe1, 0xfb, 0xf7, 0x0f, 0x01, 0x2f, 0xc9, 0xfe, \n  0x59, 0xd0, 0xfe, 0xa0, 0xa8, 0xfd, 0xd6, 0x68, 0x41, 0xa5, 0xab, 0x2c, 0x26, 0xea, 0xed, 0x12, \n  0x01, 0x1a, 0x6a, 0xe0, 0x0b, 0x91, 0x6a, 0xf7, 0x40, 0xec, 0xf9, 0x38, 0xdc, 0xfa, 0xf8, 0x6c, \n  0x11, 0x85, 0x20, 0xf8, 0xe2, 0xa2, 0xe1, 0xb1, 0x63, 0x02, 0x5f, 0x4c, 0x05, 0x23, 0x72, 0xf4, \n  0xb3, 0xb5, 0xfd, 0xad, 0x7c, 0xf2, 0xf1, 0x1e, 0xfb, 0xdd, 0x80, 0x03, 0x13, 0x5a, 0xf9, 0xa8, \n  0x33, 0x04, 0x29, 0x0d, 0x01, 0x11, 0x97, 0xfb, 0x59, 0x55, 0xfe, 0xf2, 0xe0, 0xfd, 0xaa, 0x74, \n  0xfb, 0x35, 0xda, 0xff, 0x65, 0x56, 0xfc, 0xfb, 0x8c, 0xfb, 0xcb, 0xb7, 0x00, 0xd6, 0x36, 0xff, \n  0x8c, 0x95, 0xfe, 0x38, 0x0c, 0xfd, 0x2f, 0x25, 0x49, 0x24, 0x5b, 0x32, 0xf0, 0x2d, 0xe3, 0x06, \n  0xf4, 0x11, 0xca, 0xfa, 0x0f, 0x7c, 0x72, 0xfa, 0x24, 0xbe, 0xfb, 0x8f, 0xf5, 0xf9, 0x30, 0x5f, \n  0x12, 0xc5, 0xe6, 0xfb, 0xd1, 0x50, 0xdd, 0x54, 0xc7, 0xfd, 0xf0, 0xa4, 0x07, 0xdb, 0xcf, 0xf6, \n  0x8b, 0x60, 0xfc, 0x35, 0x02, 0xf2, 0xde, 0x95, 0xfa, 0x5b, 0x41, 0x03, 0xa2, 0xbd, 0xf9, 0x5c, \n  0x77, 0x03, 0xe8, 0x9c, 0x01, 0xe1, 0xcb, 0xfb, 0x2c, 0x90, 0xfd, 0x76, 0x6a, 0xfd, 0xb5, 0xcf, \n  0xfb, 0x51, 0x20, 0x00, 0xc4, 0xb9, 0xfc, 0xab, 0x6e, 0xfb, 0xfd, 0x27, 0x00, 0x96, 0xf3, 0xff, \n  0x16, 0xa8, 0xfe, 0x41, 0x02, 0xfc, 0xa8, 0x89, 0x50, 0xc7, 0xe8, 0x37, 0x29, 0x9c, 0xd9, 0x35, \n  0x94, 0x09, 0x64, 0x9b, 0x12, 0xf6, 0x49, 0xff, 0xd2, 0x85, 0xfd, 0xf6, 0xc5, 0xf8, 0x9b, 0x88, \n  0x12, 0x90, 0x1d, 0x00, 0x89, 0x32, 0xdb, 0x30, 0x8a, 0xf8, 0x04, 0x36, 0x08, 0x8d, 0x74, 0xfa, \n  0x84, 0xbe, 0xfb, 0x0d, 0x57, 0xf1, 0x12, 0x0c, 0xfb, 0x1a, 0x2f, 0x02, 0xf9, 0xff, 0xf9, 0xca, \n  0x9e, 0x03, 0x3f, 0x87, 0x01, 0x7f, 0xa9, 0xfb, 0x1a, 0x5b, 0xfd, 0x4f, 0x2c, 0xfd, 0xb6, 0x0b, \n  0xfc, 0x1d, 0xf3, 0xff, 0xe3, 0x8a, 0xfc, 0xda, 0x1b, 0xfc, 0xdb, 0x00, 0x00, 0x3f, 0x6b, 0x00, \n  0x6f, 0x5c, 0xfe, 0x0f, 0x30, 0xfb, 0x63, 0xba, 0x59, 0x6d, 0x5c, 0x39, 0xe8, 0x5c, 0xd1, 0x23, \n  0xcf, 0x03, 0x71, 0x52, 0x12, 0x85, 0x81, 0x04, 0x5c, 0x43, 0xfe, 0xdd, 0xcc, 0xf6, 0x01, 0x17, \n  0x14, 0x6b, 0x13, 0x04, 0xff, 0x44, 0xd8, 0xa2, 0xf0, 0xf3, 0x14, 0x6e, 0x08, 0x1b, 0xed, 0xfc, \n  0x19, 0xd5, 0xfc, 0xed, 0x41, 0xf0, 0xb2, 0x10, 0xfc, 0x40, 0x0a, 0x00, 0x3c, 0xb1, 0xf9, 0x25, \n  0xe2, 0x04, 0xa5, 0xa1, 0x00, 0x81, 0x35, 0xfb, 0x80, 0x68, 0xfd, 0x4e, 0x3f, 0xfd, 0xb5, 0xfe, \n  0xfa, 0xec, 0xe2, 0xff, 0x18, 0x6e, 0xfc, 0xf9, 0xdd, 0xfc, 0xf4, 0xa2, 0xff, 0x4a, 0x21, 0x00, \n  0xbf, 0x77, 0xfe, 0xfd, 0xd8, 0xfa, 0x3e, 0xb3, 0x61, 0x4a, 0xdf, 0x3a, 0x68, 0xa3, 0xca, 0xfb, \n  0xf8, 0x00, 0x68, 0x79, 0x10, 0xf1, 0xba, 0x08, 0x50, 0xd1, 0xfe, 0xeb, 0x2a, 0xf4, 0x60, 0xc9, \n  0x18, 0xbf, 0x8f, 0x08, 0x05, 0xb1, 0xd3, 0x81, 0xfd, 0xf0, 0xa3, 0xf2, 0x08, 0x07, 0xc0, 0xfd, \n  0x7f, 0x8f, 0x00, 0x4f, 0x19, 0xf0, 0x58, 0x44, 0xfb, 0x4b, 0x85, 0xfe, 0x90, 0xe5, 0xf9, 0xa9, \n  0x28, 0x06, 0xf5, 0x6b, 0xff, 0xa3, 0x42, 0xfb, 0xdd, 0x15, 0xfe, 0x2a, 0x25, 0xfd, 0x23, 0x75, \n  0xf9, 0xc2, 0x5f, 0x00, 0xb9, 0xb8, 0xfc, 0xbe, 0xd7, 0xfc, 0x99, 0x88, 0xff, 0x28, 0x21, 0x00, \n  0xd6, 0x00, 0xff, 0x88, 0x6f, 0xfa, 0xe6, 0x91, 0x68, 0x66, 0x90, 0x3b, 0x6f, 0xf2, 0xc4, 0xad, \n  0xae, 0x00, 0xb3, 0xd1, 0x0c, 0x86, 0xb5, 0x0a, 0x3e, 0xc7, 0xfe, 0xdd, 0x7b, 0xf0, 0x0d, 0x44, \n  0x20, 0x5b, 0xd0, 0x0a, 0x6e, 0xd7, 0xce, 0x8f, 0x2b, 0xf0, 0xe7, 0xdc, 0x06, 0x52, 0xb5, 0xfe, \n  0x96, 0xe9, 0x04, 0xbf, 0x15, 0xf0, 0x47, 0x21, 0xf9, 0x47, 0xb2, 0xfd, 0xec, 0x4e, 0xfa, 0xa3, \n  0xcc, 0x05, 0x93, 0x54, 0xfe, 0x6f, 0xa9, 0xfb, 0xa2, 0xe1, 0xfe, 0x21, 0x70, 0xfc, 0xdd, 0x14, \n  0xf8, 0x63, 0x2f, 0x00, 0xff, 0x0a, 0xfd, 0xaa, 0xa7, 0xfc, 0x1c, 0x4d, 0xff, 0xdb, 0x57, 0x00, \n  0x2a, 0xd1, 0xfe, 0xa2, 0x46, 0xfa, 0xa7, 0x6a, 0x6e, 0x36, 0x1e, 0x3c, 0x98, 0xb0, 0xc0, 0x21, \n  0x1e, 0x02, 0x72, 0x77, 0x08, 0xd7, 0x18, 0x0b, 0xa4, 0x30, 0xfe, 0x47, 0x21, 0xed, 0x9e, 0x80, \n  0x28, 0x05, 0x81, 0x0b, 0x73, 0x79, 0xcc, 0x3c, 0xd8, 0xef, 0xb4, 0x4b, 0x03, 0x9f, 0x5a, 0x00, \n  0xaa, 0x8a, 0x08, 0xee, 0xe5, 0xf0, 0x6e, 0xc8, 0xf6, 0x44, 0x04, 0xfe, 0x98, 0x21, 0xfa, 0x64, \n  0x07, 0x04, 0xeb, 0x52, 0xfe, 0x5e, 0x63, 0xfc, 0x30, 0x78, 0xff, 0x59, 0x94, 0xfb, 0xdf, 0x08, \n  0xf7, 0x85, 0xb9, 0xff, 0xfe, 0x9f, 0xfd, 0x45, 0x63, 0xfc, 0x3e, 0x4a, 0xff, 0x15, 0x2a, 0x00, \n  0x43, 0xb1, 0xfe, 0x2a, 0xd7, 0xfa, 0x95, 0x77, 0x74, 0xc7, 0xc6, 0x3b, 0x61, 0xf9, 0xbd, 0x69, \n  0x13, 0x04, 0x39, 0xda, 0x03, 0x76, 0x74, 0x0b, 0xa7, 0x81, 0xfc, 0xa2, 0x06, 0xeb, 0xd6, 0x3a, \n  0x2f, 0x54, 0xcf, 0x0b, 0xe5, 0x5a, 0xcd, 0x38, 0x9e, 0xee, 0x68, 0x25, 0x00, 0x18, 0x68, 0x01, \n  0xb3, 0xb7, 0x0b, 0x01, 0x71, 0xf2, 0x1e, 0xf1, 0xf4, 0xc1, 0x13, 0xff, 0x65, 0x42, 0xf9, 0x39, \n  0x91, 0x01, 0x33, 0x0e, 0xff, 0xa3, 0xc7, 0xfd, 0x86, 0x35, 0xff, 0x80, 0xe2, 0xfa, 0xf9, 0x71, \n  0xf6, 0xaf, 0x85, 0xff, 0x01, 0x3f, 0xfe, 0xb4, 0x19, 0xfc, 0xcc, 0x04, 0xff, 0xd0, 0x7c, 0x00, \n  0xff, 0xf0, 0xfe, 0xbf, 0x9b, 0xfa, 0xdf, 0xf0, 0x77, 0xae, 0xf5, 0x3d, 0xbc, 0x9f, 0xbb, 0x4a, \n  0xc8, 0x04, 0xae, 0xdc, 0xff, 0xb9, 0x8e, 0x0b, 0x1b, 0x5c, 0xfa, 0x22, 0x36, 0xe9, 0xaf, 0x41, \n  0x32, 0x78, 0x8a, 0x0d, 0x94, 0xaf, 0xd0, 0x87, 0xf8, 0xeb, 0x3d, 0x90, 0xfd, 0xff, 0x08, 0x01, \n  0x4b, 0x79, 0x0e, 0xd7, 0x58, 0xf4, 0x6c, 0x4c, 0xf3, 0xb2, 0x78, 0x00, 0x42, 0xa1, 0xf7, 0x61, \n  0xd6, 0xfe, 0x45, 0xe6, 0xff, 0x61, 0x52, 0xff, 0x64, 0x0c, 0xfe, 0xab, 0xa9, 0xfa, 0x4f, 0xca, \n  0xf5, 0x2c, 0x94, 0xff, 0x44, 0xf4, 0xfe, 0xa0, 0xe7, 0xfa, 0x5f, 0x3b, 0xff, 0x60, 0x2e, 0x01, \n  0x8a, 0x78, 0xfe, 0x3e, 0xcf, 0xf9, 0xd0, 0x81, 0x7b, 0x0f, 0x5b, 0x3f, 0x89, 0xe2, 0xba, 0x47, \n  0x48, 0x04, 0xd4, 0x59, 0xfc, 0xa5, 0x4a, 0x0c, 0xfb, 0x3b, 0xf7, 0xf2, 0x2e, 0xe8, 0xea, 0xd4, \n  0x32, 0x71, 0xb5, 0x0f, 0x40, 0x95, 0xd5, 0x7b, 0x2c, 0xe9, 0xf1, 0x9c, 0xfb, 0x27, 0x8e, 0xff, \n  0xa0, 0x4d, 0x11, 0x0d, 0x00, 0xf6, 0x47, 0x64, 0xf2, 0xeb, 0xaf, 0x01, 0x0b, 0x01, 0xf6, 0xaa, \n  0x57, 0xfc, 0x0b, 0xb1, 0x00, 0xbf, 0x49, 0x00, 0xbe, 0x1d, 0xfd, 0x8d, 0xe5, 0xfa, 0x42, 0xae, \n  0xf4, 0xc9, 0x6a, 0x00, 0x00, 0x15, 0xff, 0x0b, 0xed, 0xf9, 0x49, 0x18, 0x00, 0x36, 0x05, 0x01, \n  0x5f, 0xc4, 0xfd, 0x10, 0x79, 0xf9, 0x3e, 0x60, 0x7e, 0xc1, 0x62, 0x40, 0x06, 0xc9, 0xbb, 0xca, \n  0xeb, 0x02, 0x3d, 0x96, 0xf9, 0x07, 0xca, 0x0c, 0x16, 0x6c, 0xf4, 0xa5, 0x05, 0xe7, 0xcc, 0x07, \n  0x31, 0x70, 0xfe, 0x12, 0x34, 0xbd, 0xda, 0x6f, 0x08, 0xe7, 0x73, 0x2d, 0xfa, 0xf9, 0x68, 0xfd, \n  0x36, 0xb1, 0x13, 0x3e, 0x76, 0xf7, 0x48, 0x3b, 0xf2, 0x61, 0x1d, 0x02, 0xe3, 0xea, 0xf4, 0x7a, \n  0x6f, 0xfa, 0x8b, 0xfa, 0x00, 0xdb, 0xae, 0x00, 0x17, 0x86, 0xfc, 0xcd, 0x8a, 0xfb, 0x74, 0xde, \n  0xf3, 0x6d, 0x9b, 0x00, 0x49, 0x33, 0xff, 0x18, 0x08, 0xfa, 0x24, 0x0c, 0x00, 0xec, 0x3e, 0x00, \n  0x21, 0x7b, 0xfd, 0xcc, 0x42, 0xf9, 0x90, 0xbb, 0x7e, 0xec, 0xb4, 0x43, 0xe6, 0x92, 0xbd, 0xde, \n  0xbe, 0x00, 0xb2, 0x9d, 0xf7, 0x01, 0xc7, 0x0b, 0x5b, 0x65, 0xf4, 0x91, 0xa1, 0xe3, 0x20, 0x45, \n  0x2d, 0x21, 0x60, 0x18, 0xfa, 0x2b, 0xdf, 0x03, 0x44, 0xe6, 0x03, 0x9e, 0xf8, 0x54, 0x52, 0xfb, \n  0xaf, 0x0c, 0x15, 0xb9, 0x2e, 0xf9, 0xf9, 0xc4, 0xf2, 0x71, 0x76, 0x01, 0x1b, 0x5e, 0xf4, 0x07, \n  0x5a, 0xf9, 0xb3, 0xaf, 0x00, 0x5d, 0x8e, 0x00, 0xe6, 0x29, 0xfc, 0x03, 0xb0, 0xfc, 0x79, 0x76, \n  0xf3, 0x69, 0xa1, 0xff, 0x3c, 0x0c, 0x00, 0x40, 0x13, 0xfa, 0x01, 0x46, 0xff, 0xa6, 0xc8, 0xff, \n  0x52, 0x00, 0xfd, 0xf2, 0xda, 0xf9, 0x98, 0x94, 0x7c, 0xe1, 0x64, 0x48, 0x0f, 0x08, 0xc1, 0x61, \n  0xc3, 0xfe, 0x84, 0xbc, 0xf5, 0x80, 0x1f, 0x09, 0x14, 0x60, 0xf7, 0xe7, 0xb8, 0xdd, 0x3d, 0x45, \n  0x28, 0x15, 0x6e, 0x1f, 0xe1, 0xac, 0xe2, 0x7d, 0x39, 0xe7, 0xd6, 0xf1, 0xf6, 0x86, 0x26, 0xf9, \n  0x1b, 0x23, 0x15, 0xfb, 0x80, 0xfb, 0xf1, 0x0e, 0xf4, 0x09, 0xd3, 0xff, 0x30, 0x16, 0xf4, 0xc5, \n  0xfe, 0xf8, 0xd4, 0x8a, 0x00, 0x86, 0x6a, 0xff, 0xd1, 0x8a, 0xfc, 0xb3, 0xc2, 0xfd, 0x03, 0x35, \n  0xf3, 0xde, 0xd1, 0xfe, 0xe3, 0xcc, 0xff, 0x8e, 0x62, 0xfa, 0xae, 0x9c, 0xfe, 0xd9, 0x1b, 0xff, \n  0xff, 0x5f, 0xfd, 0x0e, 0x56, 0xfb, 0xb2, 0x45, 0x78, 0x8f, 0x78, 0x4d, 0x18, 0x59, 0xc6, 0x54, \n  0xb3, 0xfd, 0x4f, 0x9b, 0xf3, 0x98, 0xa4, 0x05, 0x3f, 0xfb, 0xfb, 0xdb, 0xd8, 0xd5, 0x8f, 0xa2, \n  0x22, 0x0f, 0x60, 0x27, 0xe7, 0xbe, 0xe5, 0x63, 0x2e, 0xe9, 0x7f, 0x45, 0xf6, 0x9f, 0x82, 0xf6, \n  0x9d, 0xfd, 0x13, 0xc0, 0xb8, 0xfe, 0x08, 0x95, 0xf5, 0x4f, 0xb8, 0xfd, 0x90, 0xaa, 0xf3, 0xcb, \n  0xc6, 0xf9, 0xf4, 0x30, 0x00, 0x3f, 0xd3, 0xfd, 0xbf, 0x36, 0xfd, 0xc2, 0x99, 0xfe, 0xd9, 0x3d, \n  0xf3, 0x56, 0x7e, 0xfd, 0xe8, 0x7b, 0xff, 0x52, 0x80, 0xfa, 0x0f, 0x08, 0xfe, 0x75, 0x94, 0xff, \n  0x23, 0x50, 0xfe, 0x47, 0x3d, 0xfc, 0x55, 0x13, 0x72, 0x52, 0xdc, 0x51, 0x8f, 0x24, 0xce, 0xc8, \n  0x52, 0xfd, 0xa3, 0xce, 0xf0, 0xff, 0x69, 0x02, 0x87, 0x7b, 0x00, 0x2a, 0xe8, 0xcd, 0xf6, 0x9a, \n  0x1b, 0x31, 0xe5, 0x2e, 0x52, 0x5b, 0xe9, 0x37, 0x83, 0xeb, 0x6c, 0x54, 0xf7, 0x66, 0xc3, 0xf2, \n  0x42, 0xa9, 0x11, 0x3e, 0xb4, 0x02, 0xc8, 0xb7, 0xf6, 0x5b, 0x92, 0xfb, 0x59, 0x0a, 0xf4, 0x06, \n  0x06, 0xfa, 0x80, 0x2d, 0x00, 0x2b, 0x50, 0xfc, 0xda, 0x0b, 0xfd, 0x9b, 0xaa, 0xff, 0x3b, 0x7c, \n  0xf2, 0x5e, 0xf4, 0xfc, 0x55, 0x66, 0xfe, 0x6d, 0x65, 0xfa, 0xab, 0x1e, 0xff, 0xd0, 0x0d, 0x00, \n  0x64, 0xf9, 0xfe, 0x36, 0x5a, 0xfd, 0x68, 0xea, 0x6a, 0x79, 0xae, 0x55, 0x56, 0xc8, 0xd7, 0x7c, \n  0x0c, 0xfd, 0x3d, 0xc4, 0xed, 0x3b, 0x77, 0x00, 0x95, 0x0f, 0x04, 0x77, 0x56, 0xc8, 0xb0, 0x3b, \n  0x12, 0x06, 0xc5, 0x34, 0x15, 0x6b, 0xef, 0x54, 0xde, 0xec, 0x70, 0x5f, 0xfb, 0xb7, 0xd7, 0xed, \n  0x7c, 0xbe, 0x0e, 0xa0, 0x02, 0x07, 0xf9, 0x16, 0xf7, 0xa0, 0x41, 0xfb, 0x0f, 0x31, 0xf4, 0x68, \n  0x01, 0xfa, 0x34, 0x40, 0x00, 0x2f, 0x06, 0xfc, 0x37, 0xaa, 0xfa, 0xb3, 0xd8, 0x00, 0xc6, 0x22, \n  0xf3, 0x61, 0xe0, 0xfa, 0xed, 0x88, 0xfe, 0x7e, 0x17, 0xfb, 0x70, 0x3a, 0x00, 0x98, 0x98, 0x00, \n  0x91, 0x4a, 0x00, 0xa5, 0xd9, 0xfd, 0x6c, 0x46, 0x64, 0x45, 0x05, 0x58, 0xca, 0x48, 0xe0, 0xfc, \n  0x21, 0xfd, 0x54, 0xd5, 0xec, 0x7a, 0xa4, 0xfd, 0x51, 0xa3, 0x04, 0xe0, 0xda, 0xc7, 0xda, 0x01, \n  0x07, 0xbd, 0x48, 0x36, 0x98, 0x3e, 0xf9, 0x10, 0x66, 0xec, 0x43, 0x48, 0x00, 0x10, 0x38, 0xea, \n  0x2b, 0x9e, 0x09, 0xa4, 0x05, 0x0c, 0x1c, 0xc8, 0xf6, 0xef, 0xe9, 0xfb, 0x26, 0xae, 0xf4, 0x39, \n  0x64, 0xf8, 0xf7, 0xce, 0x00, 0xf9, 0x9d, 0xfb, 0x5e, 0xb5, 0xf7, 0x6f, 0x6c, 0x01, 0x03, 0x68, \n  0xf3, 0x85, 0x33, 0xfa, 0xf2, 0x95, 0xff, 0x81, 0xba, 0xfa, 0x5f, 0xac, 0x01, 0x0c, 0x02, 0x02, \n  0xf0, 0x47, 0x00, 0xd9, 0x0f, 0xfd, 0x18, 0x7e, 0x5f, 0x5b, 0x6b, 0x58, 0x40, 0x09, 0xe5, 0x75, \n  0x48, 0xfe, 0xf6, 0x22, 0xf0, 0xbe, 0x7f, 0xf8, 0x28, 0x02, 0x01, 0x93, 0x50, 0xcc, 0x2b, 0x66, \n  0xfc, 0x7c, 0x92, 0x33, 0xcd, 0x51, 0x04, 0xf5, 0xbe, 0xeb, 0x8f, 0xd8, 0x03, 0x6d, 0xdc, 0xe8, \n  0xb0, 0x8a, 0x03, 0xb5, 0x23, 0x10, 0xad, 0xa2, 0xf7, 0x70, 0xeb, 0xfb, 0x83, 0x27, 0xf6, 0xab, \n  0x54, 0xf5, 0x83, 0x57, 0xff, 0xe1, 0x4e, 0xfd, 0x68, 0x6d, 0xf4, 0xf1, 0xa8, 0xff, 0x90, 0xbf, \n  0xf5, 0x06, 0x2f, 0xfa, 0x85, 0x5d, 0x00, 0x52, 0x9c, 0xfa, 0xb2, 0xc5, 0x02, 0x22, 0xa3, 0x02, \n  0x78, 0xb2, 0xff, 0xc1, 0xd7, 0xfc, 0x1b, 0xe4, 0x5d, 0xc4, 0x8f, 0x54, 0xf4, 0xcf, 0xe7, 0x47, \n  0x56, 0x02, 0x0c, 0x46, 0xf4, 0xcb, 0x20, 0xf4, 0xc9, 0xa3, 0xfa, 0x16, 0xb4, 0xd2, 0xb7, 0x64, \n  0xf4, 0x3f, 0x81, 0x30, 0xb7, 0x26, 0x0c, 0x90, 0x40, 0xec, 0x3a, 0x8c, 0x07, 0xbd, 0xba, 0xe6, \n  0x3e, 0x69, 0x00, 0xef, 0x26, 0x12, 0xfd, 0x91, 0xf9, 0x05, 0xd1, 0xfc, 0x79, 0x54, 0xf6, 0xbf, \n  0x4a, 0xf2, 0x05, 0x93, 0xfe, 0x7a, 0x5f, 0xfd, 0x10, 0xe0, 0xf1, 0xc7, 0x43, 0x00, 0x82, 0xa9, \n  0xf6, 0xf5, 0xff, 0xfa, 0x6a, 0x5e, 0x01, 0x2c, 0x45, 0xfa, 0x8c, 0x79, 0x03, 0x5f, 0xce, 0x02, \n  0x28, 0x39, 0xff, 0x50, 0xa1, 0xfc, 0x9b, 0xc2, 0x5c, 0x4b, 0x10, 0x50, 0x25, 0xc4, 0xe8, 0x37, \n  0xa4, 0x07, 0x4a, 0x81, 0xf8, 0xf2, 0x15, 0xef, 0x32, 0x4a, 0xf5, 0x7d, 0xbe, 0xda, 0x55, 0x2d, \n  0xec, 0x25, 0x08, 0x2d, 0x6a, 0x1f, 0x14, 0xb4, 0x5f, 0xe9, 0x48, 0x8a, 0x0c, 0x13, 0xf1, 0xe6, \n  0xdc, 0xc3, 0xfb, 0xca, 0xa0, 0x15, 0x2e, 0x23, 0xfb, 0xc8, 0x88, 0xfc, 0x97, 0xce, 0xf6, 0x1b, \n  0xb8, 0xf1, 0xae, 0x65, 0xfb, 0xa0, 0xc0, 0xfc, 0xba, 0x36, 0xf1, 0x62, 0x01, 0x01, 0x70, 0xd5, \n  0xf8, 0x84, 0xc3, 0xf9, 0x63, 0x2e, 0x02, 0x48, 0xfe, 0xfa, 0x04, 0xb1, 0x03, 0x2c, 0x05, 0x02, \n  0xb4, 0xd0, 0xfe, 0xf1, 0xc6, 0xfd, 0xbb, 0x98, 0x5d, 0x82, 0x0e, 0x4b, 0x87, 0xd6, 0xe6, 0x92, \n  0xfb, 0x0b, 0x1f, 0x06, 0xfc, 0xb7, 0xfc, 0xea, 0x56, 0x1a, 0xf2, 0x03, 0x3c, 0xe4, 0xe5, 0x40, \n  0xe7, 0xe1, 0x8c, 0x24, 0x82, 0xec, 0x1c, 0x04, 0x3f, 0xe5, 0xc0, 0x6d, 0x0d, 0xe6, 0x1d, 0xee, \n  0x94, 0x08, 0xf4, 0x76, 0xf3, 0x19, 0xc8, 0xc2, 0xfc, 0x02, 0x81, 0xf9, 0x5c, 0x5e, 0xfa, 0xf8, \n  0xd8, 0xf0, 0x77, 0x56, 0xf8, 0x89, 0x53, 0xfc, 0x42, 0xe2, 0xf0, 0x74, 0x2e, 0x01, 0xdf, 0x4c, \n  0xfc, 0xdf, 0x39, 0xf7, 0x23, 0x61, 0x02, 0x80, 0xac, 0xfc, 0x3a, 0x0a, 0x02, 0x8d, 0xb7, 0x02, \n  0x60, 0x99, 0xfe, 0x62, 0x24, 0xfe, 0x1b, 0x0b, 0x5c, 0xd1, 0x91, 0x47, 0xbd, 0x66, 0xe5, 0x5c, \n  0x82, 0x10, 0xa1, 0x97, 0xfe, 0x3a, 0x2c, 0xe8, 0xa1, 0x6e, 0xf0, 0xda, 0x2b, 0xea, 0xd3, 0x4a, \n  0xe5, 0xa0, 0xf2, 0x1a, 0xf4, 0x06, 0x25, 0xe3, 0x8f, 0xe5, 0xed, 0x65, 0x07, 0xc7, 0xb6, 0xf7, \n  0x91, 0xdc, 0xee, 0x67, 0x2f, 0x19, 0x07, 0x5b, 0x03, 0x83, 0x5d, 0xf5, 0xe0, 0xf9, 0xfb, 0x2c, \n  0x57, 0xf2, 0xe8, 0x56, 0xf6, 0x84, 0x20, 0xfc, 0x53, 0x01, 0xf0, 0x74, 0x74, 0x00, 0xcc, 0x98, \n  0xfe, 0x4d, 0x99, 0xf6, 0xda, 0x2a, 0x01, 0xf0, 0x94, 0xfd, 0x2b, 0x3f, 0x01, 0xce, 0x39, 0x03, \n  0x68, 0x56, 0xff, 0x01, 0xa8, 0xfd, 0xec, 0x6b, 0x5a, 0xb0, 0xf1, 0x41, 0xd1, 0x0a, 0xe5, 0x07, \n  0x3d, 0x16, 0x00, 0xfe, 0xfd, 0x52, 0x5f, 0xe7, 0x04, 0x75, 0xf2, 0x6b, 0xe7, 0xeb, 0x11, 0xd7, \n  0xe3, 0x83, 0xca, 0x14, 0x9e, 0x0f, 0x29, 0x18, 0x12, 0xe7, 0x6d, 0x75, 0x02, 0xab, 0x18, 0xfb, \n  0x46, 0xd9, 0xef, 0xac, 0x70, 0x17, 0x89, 0xe3, 0x06, 0x56, 0xc3, 0xf4, 0xb2, 0xb3, 0xfb, 0xd6, \n  0xf1, 0xf4, 0x7c, 0xe1, 0xf4, 0xdb, 0x8c, 0xfd, 0xa9, 0x59, 0xef, 0xeb, 0x7f, 0xfc, 0xb1, 0xb3, \n  0xff, 0x0f, 0xbf, 0xf7, 0x76, 0xc6, 0x00, 0xcf, 0x53, 0xfd, 0xd6, 0x90, 0x00, 0xc2, 0x41, 0x03, \n  0xe0, 0xe3, 0xff, 0x9c, 0x07, 0xfe, 0xf6, 0xb6, 0x58, 0x39, 0x89, 0x3d, 0x56, 0xda, 0xe3, 0x4a, \n  0xc3, 0x1a, 0xdd, 0xc3, 0xfb, 0x6c, 0x53, 0xe5, 0x0c, 0x89, 0xf8, 0xf9, 0xc2, 0xef, 0xe4, 0x4f, \n  0xe0, 0xee, 0x7b, 0x0d, 0xd8, 0x35, 0x2e, 0x86, 0xdf, 0xe6, 0xbf, 0xa8, 0xfc, 0xb6, 0x62, 0x02, \n  0x67, 0x2d, 0xee, 0x8b, 0xe1, 0x13, 0x7e, 0x9d, 0x0b, 0xb3, 0x54, 0xf5, 0x34, 0x7e, 0xfb, 0xf5, \n  0x6d, 0xf6, 0xd5, 0x8e, 0xf4, 0x61, 0xb4, 0xff, 0x05, 0x47, 0xf0, 0xf1, 0x23, 0xf6, 0x6c, 0xa7, \n  0xfe, 0xf7, 0xee, 0xf9, 0x58, 0x49, 0x01, 0x86, 0xc2, 0xfe, 0x23, 0xc9, 0xfd, 0x55, 0xf5, 0x01, \n  0xf2, 0x0e, 0x02, 0xd9, 0x5d, 0xff, 0xda, 0x8b, 0x55, 0xd2, 0xab, 0x3b, 0xf8, 0x18, 0xdf, 0x23, \n  0x6e, 0x1f, 0x17, 0x25, 0xff, 0x5e, 0x12, 0xe0, 0x57, 0x6c, 0xfd, 0x7b, 0xcc, 0xf4, 0xea, 0x8d, \n  0xdf, 0xec, 0x1d, 0x03, 0xde, 0x1f, 0x31, 0xc6, 0x45, 0xec, 0x40, 0x82, 0xf4, 0x01, 0x37, 0x09, \n  0x65, 0xab, 0xee, 0x74, 0xa2, 0x0b, 0x86, 0x7f, 0x12, 0x0a, 0x5f, 0xf7, 0x5f, 0x25, 0xfa, 0x3b, \n  0x9b, 0xf9, 0x6e, 0x79, 0xf2, 0xc7, 0x5d, 0x02, 0xbf, 0xa9, 0xf2, 0x6f, 0xcb, 0xef, 0xc0, 0x1b, \n  0xfd, 0x7f, 0x32, 0xfb, 0x03, 0xe8, 0x00, 0x5c, 0xb8, 0x01, 0xa8, 0x67, 0xfc, 0xdb, 0xa1, 0xfe, \n  0x1e, 0x63, 0x04, 0x9b, 0xcd, 0x00, 0xa8, 0x5b, 0x53, 0x7b, 0x13, 0x37, 0xfc, 0x48, 0xdd, 0x27, \n  0x5e, 0x22, 0xdb, 0x35, 0x03, 0x05, 0x90, 0xdf, 0x92, 0x95, 0xfb, 0x01, 0xe8, 0xfb, 0xe9, 0x17, \n  0xe2, 0x89, 0x42, 0xf7, 0x5f, 0xec, 0x32, 0xd3, 0x91, 0xf2, 0x06, 0x41, 0xef, 0xea, 0xb6, 0x0c, \n  0x4e, 0x4c, 0xf1, 0xc6, 0xca, 0x04, 0xe8, 0xc8, 0x13, 0x84, 0xe7, 0xfc, 0xee, 0x3d, 0xfa, 0xa7, \n  0xfb, 0xfa, 0x4c, 0x3d, 0xf3, 0x42, 0xc7, 0x01, 0xec, 0x79, 0xf4, 0x42, 0xb0, 0xee, 0x51, 0x8c, \n  0xfb, 0x7a, 0xf8, 0xf9, 0xe5, 0x2d, 0x00, 0x73, 0x0d, 0x04, 0xb4, 0x2e, 0xfd, 0x29, 0x86, 0xfd, \n  0xe1, 0x72, 0x03, 0xea, 0x65, 0x01, 0xc6, 0x87, 0x4f, 0x69, 0x9c, 0x31, 0x22, 0xb3, 0xdd, 0x4f, \n  0xfc, 0x25, 0x73, 0xc6, 0x03, 0x3b, 0x8a, 0xe0, 0x96, 0x63, 0xfd, 0xf5, 0x79, 0xfc, 0xd7, 0x66, \n  0xe4, 0xb0, 0x75, 0xf3, 0xd1, 0xd1, 0x2e, 0x30, 0x0e, 0xf6, 0xd9, 0x13, 0xef, 0x18, 0xc6, 0x0e, \n  0xe1, 0xaa, 0xf2, 0xcc, 0xc7, 0xff, 0xce, 0x00, 0x13, 0xea, 0xaa, 0xff, 0xe2, 0x9b, 0xfc, 0xa1, \n  0xd7, 0xfb, 0xd9, 0x94, 0xf4, 0xd4, 0x25, 0x00, 0x51, 0x5c, 0xf4, 0x81, 0xd4, 0xf0, 0xf9, 0x0c, \n  0xfb, 0x55, 0xd5, 0xf8, 0xa3, 0xa3, 0xfd, 0x64, 0x59, 0x04, 0xd3, 0x97, 0xfe, 0x15, 0xe0, 0xfe, \n  0xea, 0xdb, 0x01, 0x22, 0x7f, 0xff, 0xf2, 0x43, 0x4a, 0x89, 0x82, 0x2b, 0x85, 0x85, 0xe1, 0x4f, \n  0x2b, 0x28, 0x28, 0x41, 0x02, 0xa6, 0xd0, 0xe3, 0x0c, 0xdc, 0xfe, 0x13, 0x74, 0xfb, 0xd4, 0xa0, \n  0xe6, 0x71, 0x9a, 0xf2, 0x51, 0x94, 0x29, 0x98, 0xcf, 0xf7, 0x02, 0x24, 0xf0, 0xe1, 0x3a, 0x10, \n  0xc5, 0x2c, 0xf5, 0x25, 0x71, 0xfa, 0x45, 0x9f, 0x12, 0x0b, 0x2a, 0x01, 0xf2, 0xa3, 0xfb, 0xcc, \n  0xb9, 0xff, 0x5b, 0x17, 0xf5, 0x3f, 0x88, 0xfe, 0xad, 0x46, 0xf5, 0x1f, 0xda, 0xf0, 0xaf, 0x28, \n  0xfd, 0xd3, 0x47, 0xf9, 0x3c, 0x95, 0xfa, 0xd7, 0x8f, 0x02, 0xaf, 0x99, 0xff, 0x0b, 0x1b, 0x00, \n  0xf1, 0x15, 0x02, 0xc1, 0x61, 0xfe, 0xf3, 0x55, 0x43, 0x24, 0xb0, 0x26, 0xaf, 0x26, 0xe7, 0xee, \n  0x2c, 0x28, 0xe1, 0xa9, 0x01, 0x68, 0x43, 0xe7, 0xe8, 0x8a, 0xff, 0xd4, 0xcc, 0xfb, 0x66, 0x06, \n  0xe9, 0x85, 0x62, 0xf1, 0x36, 0x8b, 0x24, 0x31, 0xb5, 0xfa, 0x02, 0x8f, 0xf0, 0x0f, 0xce, 0x0f, \n  0x5a, 0x5e, 0xf9, 0x8a, 0x0b, 0xf7, 0xdd, 0x1e, 0x10, 0x19, 0x2a, 0x03, 0x14, 0x4e, 0xfa, 0xf2, \n  0x92, 0x00, 0xfb, 0x40, 0xf8, 0xdb, 0x31, 0xfd, 0xc8, 0xe8, 0xf5, 0xcb, 0x78, 0xf2, 0xbe, 0x7d, \n  0xfd, 0x52, 0x4f, 0xfb, 0xcd, 0xf6, 0xf8, 0x1e, 0x68, 0x00, 0xef, 0x90, 0xff, 0xf8, 0x66, 0x00, \n  0x62, 0xe0, 0x02, 0x41, 0x4f, 0xfe, 0xa2, 0xd2, 0x41, 0x80, 0x1d, 0x1e, 0xe9, 0x76, 0xe3, 0xa4, \n  0xd7, 0x30, 0x23, 0x10, 0x09, 0x96, 0xd1, 0xde, 0x78, 0xae, 0xfb, 0xc9, 0xbc, 0x01, 0x0c, 0x36, \n  0xed, 0xeb, 0xd1, 0xf8, 0xc0, 0xf5, 0x19, 0x9d, 0xda, 0xf2, 0x5f, 0xbc, 0xf6, 0xd9, 0x65, 0x0d, \n  0x3a, 0x8c, 0xf9, 0x46, 0x7a, 0xfc, 0xc0, 0x10, 0x0a, 0x41, 0xbb, 0xfe, 0x88, 0x5a, 0xff, 0xd8, \n  0x85, 0x02, 0x97, 0x67, 0xfd, 0x22, 0xae, 0x04, 0xd9, 0xed, 0xfb, 0xcf, 0xb4, 0xf9, 0x20, 0xe4, \n  0x00, 0xae, 0x31, 0xfb, 0x57, 0x65, 0xfa, 0x22, 0x93, 0xfe, 0xf7, 0x90, 0xf9, 0x84, 0xc5, 0xfa, \n  0xcb, 0x4e, 0xfe, 0x37, 0x33, 0xfd, 0xac, 0x75, 0x38, 0x39, 0x5b, 0x1c, 0x44, 0x9c, 0xea, 0x65, \n  0x80, 0x2a, 0xc7, 0xc2, 0x08, 0x35, 0xe3, 0xe5, 0xc2, 0xa1, 0xfc, 0x83, 0x23, 0x00, 0xa1, 0x5b, \n  0xf0, 0x30, 0xc3, 0xf8, 0x97, 0xae, 0x15, 0x51, 0x06, 0xf6, 0xdd, 0xfc, 0xf6, 0x8c, 0x65, 0x0b, \n  0x92, 0xc6, 0xfa, 0xbb, 0xa6, 0xfb, 0xbf, 0xdf, 0x08, 0x55, 0xbe, 0xff, 0x76, 0xeb, 0xfe, 0x9d, \n  0xc4, 0x01, 0x56, 0x4f, 0xfe, 0x6a, 0xf1, 0x03, 0xe0, 0xad, 0xfb, 0xda, 0x55, 0xfa, 0xba, 0xcf, \n  0x00, 0x01, 0x52, 0xfb, 0xa9, 0x7a, 0xfb, 0xae, 0x69, 0xff, 0x31, 0x34, 0xfb, 0x14, 0xd3, 0xfb, \n  0x1b, 0x96, 0xfd, 0x77, 0x82, 0xfd, 0x88, 0xe6, 0x2f, 0x1d, 0x90, 0x1b, 0xcb, 0x0c, 0xf1, 0x82, \n  0x5d, 0x23, 0x97, 0x14, 0x0a, 0xb0, 0xc7, 0xec, 0x91, 0x0b, 0xfc, 0x59, 0xb6, 0xff, 0x71, 0x3e, \n  0xf3, 0xa3, 0x80, 0xf8, 0x7e, 0x6d, 0x12, 0x34, 0x1f, 0xf9, 0xac, 0x22, 0xf7, 0x0e, 0x4d, 0x09, \n  0x49, 0xf9, 0xfc, 0xd6, 0x83, 0xfb, 0x12, 0x4d, 0x07, 0xee, 0xf2, 0x00, 0xf9, 0x28, 0xff, 0xbb, \n  0x2a, 0x01, 0x74, 0x95, 0xfe, 0x28, 0x48, 0x03, 0xf4, 0xaf, 0xfc, 0xec, 0x88, 0xfa, 0x22, 0x18, \n  0x00, 0x1c, 0x5b, 0xfc, 0xd5, 0x1f, 0xfc, 0xd8, 0x73, 0x00, 0x2c, 0xb9, 0xfc, 0x63, 0x65, 0xfc, \n  0x8b, 0xe4, 0xfd, 0x1a, 0x9d, 0xfd, 0x89, 0x3f, 0x28, 0x86, 0x86, 0x1a, 0xd6, 0xcf, 0xf5, 0x7c, \n  0xf4, 0x1c, 0x7f, 0xf9, 0x0b, 0x7b, 0xfe, 0xf1, 0x7f, 0x7d, 0xfb, 0xee, 0x2c, 0x00, 0xd8, 0x68, \n  0xf5, 0x8b, 0x47, 0xf8, 0xbc, 0x6f, 0x0f, 0xc8, 0x75, 0xfb, 0xb3, 0x33, 0xf7, 0x8f, 0x34, 0x07, \n  0xec, 0x88, 0xfe, 0x91, 0xf1, 0xfb, 0xbd, 0xf2, 0x05, 0xc9, 0x0c, 0x01, 0xe8, 0x97, 0xff, 0xf1, \n  0x04, 0x01, 0x2f, 0x38, 0xfe, 0xcf, 0xa5, 0x02, 0xd0, 0x4e, 0xfd, 0xd7, 0xf4, 0xfa, 0x04, 0xab, \n  0xff, 0x72, 0x99, 0xfd, 0x64, 0x0a, 0xfd, 0x5d, 0xc3, 0xff, 0x20, 0xcb, 0xfd, 0x96, 0x5e, 0xfd, \n  0xd0, 0x28, 0xfe, 0x82, 0x94, 0xfd, 0xa4, 0xcc, 0x21, 0xa7, 0x3b, 0x19, 0xeb, 0x67, 0xf9, 0x41, \n  0x40, 0x18, 0x38, 0x71, 0x0d, 0xfe, 0xe4, 0xf5, 0xae, 0x27, 0xfc, 0xc7, 0x25, 0x01, 0x72, 0xf1, \n  0xf6, 0xed, 0x59, 0xf8, 0x09, 0x2c, 0x0d, 0x8c, 0x12, 0xfd, 0x9a, 0x6f, 0xf7, 0x24, 0xd6, 0x05, \n  0xd2, 0xe7, 0xff, 0xca, 0xbf, 0xfc, 0x35, 0x7b, 0x04, 0x53, 0x79, 0x01, 0x95, 0x63, 0x00, 0xfc, \n  0x64, 0x00, 0x3f, 0x82, 0xfe, 0x18, 0x23, 0x02, 0x56, 0xba, 0xfd, 0x04, 0x11, 0xfc, 0x4d, 0x6d, \n  0x00, 0xe5, 0x45, 0xfe, 0x36, 0x2e, 0xfd, 0x81, 0xbe, 0xff, 0x02, 0x52, 0xfe, 0x1a, 0x14, 0xfe, \n  0x99, 0x58, 0xfe, 0x0d, 0x20, 0xfe, 0x3c, 0x37, 0x1c, 0x47, 0x99, 0x17, 0x71, 0xf0, 0xfb, 0x76, \n  0xdf, 0x14, 0xb2, 0x82, 0x0e, 0xa4, 0xba, 0xf8, 0x79, 0x28, 0xfd, 0xb0, 0xf0, 0x01, 0x3b, 0x1f, \n  0xf8, 0xcf, 0x6e, 0xf8, 0x46, 0x2a, 0x0b, 0xc7, 0x0a, 0xfe, 0x9d, 0xe5, 0xf7, 0xc1, 0xcf, 0x04, \n  0x3a, 0xfc, 0x00, 0x9f, 0x0f, 0xfd, 0x4e, 0x94, 0x03, 0x58, 0x4e, 0x02, 0x76, 0xe4, 0xff, 0x37, \n  0x03, 0x00, 0x8f, 0x18, 0xff, 0x50, 0xea, 0x01, 0xc7, 0x8c, 0xfe, 0xe2, 0xf8, 0xfc, 0x75, 0x91, \n  0x00, 0x7a, 0xb7, 0xfe, 0x93, 0x7e, 0xfd, 0xb0, 0x66, 0xff, 0xe8, 0x5c, 0xfe, 0x72, 0x3f, 0xfe, \n  0xde, 0xf4, 0xfe, 0x73, 0x92, 0xfe, 0x94, 0x00, 0x18, 0xde, 0xde, 0x14, 0xd7, 0xf7, 0xfd, 0x62, \n  0x1b, 0x13, 0xd9, 0x8a, 0x0e, 0x8e, 0xef, 0xfa, 0xe0, 0x5f, 0xfe, 0x01, 0x8e, 0x02, 0xfe, 0x93, \n  0xf8, 0x68, 0xe7, 0xf8, 0x7a, 0x5d, 0x09, 0xa8, 0xbc, 0xfe, 0x94, 0x70, 0xf8, 0xbb, 0xfa, 0x03, \n  0x3f, 0xc9, 0x01, 0xf2, 0x63, 0xfd, 0xc5, 0x5e, 0x03, 0x19, 0xe7, 0x01, 0xbb, 0x7f, 0xff, 0xa6, \n  0x84, 0x00, 0xe3, 0xf5, 0xff, 0x09, 0xc2, 0x01, 0xb7, 0xa2, 0xfe, 0xff, 0xcb, 0xfd, 0xef, 0xdf, \n  0x00, 0xd2, 0x9e, 0xfe, 0x62, 0x4f, 0xfd, 0x52, 0x02, 0xff, 0xd0, 0x5e, 0xfe, 0x0f, 0xb8, 0xfe, \n  0xb6, 0x87, 0xff, 0x30, 0x18, 0xff, 0xf6, 0xe2, 0x14, 0xc3, 0x08, 0x13, 0xd4, 0xf6, 0xff, 0xb2, \n  0xf6, 0x10, 0x01, 0x0d, 0x0d, 0xb4, 0xf0, 0xfc, 0x45, 0x02, 0x00, 0x5a, 0xad, 0x02, 0xf8, 0x4c, \n  0xf9, 0xa4, 0x85, 0xf9, 0x0c, 0x9f, 0x07, 0xb8, 0xcc, 0xfe, 0x59, 0x59, 0xf9, 0x76, 0x68, 0x04, \n  0xb8, 0xea, 0x01, 0x92, 0xb9, 0xfd, 0x39, 0x0a, 0x03, 0xdf, 0x29, 0x01, 0xe3, 0xa5, 0x00, 0xef, \n  0x70, 0x01, 0xf2, 0xb8, 0xff, 0xc3, 0x91, 0x01, 0x20, 0x5a, 0xff, 0xe4, 0x1d, 0xfe, 0x5a, 0xff, \n  0xff, 0x7f, 0x84, 0xfe, 0xfb, 0x7b, 0xfd, 0x63, 0x10, 0xff, 0x3c, 0x13, 0xff, 0x4b, 0x33, 0xff, \n  0xcc, 0x5e, 0xff, 0x26, 0x70, 0xfe, 0xf8, 0xa1, 0x11, 0xe2, 0x74, 0x11, 0x1f, 0x4a, 0x01, 0xe8, \n  0x10, 0x0f, 0x32, 0xe2, 0x0c, 0xa8, 0x2b, 0xff, 0x37, 0x2d, 0x00, 0x6a, 0x1d, 0x02, 0x67, 0xfb, \n  0xfa, 0xd3, 0x8a, 0xf9, 0xcc, 0x84, 0x05, 0xe5, 0xfb, 0xff, 0xe6, 0x02, 0xfb, 0x5a, 0x27, 0x03, \n  0xc7, 0xb3, 0x01, 0x13, 0x09, 0xff, 0xe9, 0xc3, 0x02, 0xe1, 0xd0, 0x01, 0x65, 0x53, 0x01, 0xf6, \n  0xef, 0x00, 0x37, 0xd0, 0xff, 0x74, 0x7b, 0x01, 0x41, 0x57, 0xff, 0x4b, 0xdc, 0xfd, 0xbd, 0x5e, \n  0xff, 0xec, 0xac, 0xfe, 0x2f, 0x1a, 0xfe, 0xd8, 0x92, 0xff, 0xff, 0x30, 0xff, 0x21, 0x58, 0xfe, \n  0xc4, 0x7e, 0xfe, 0xa8, 0x4a, 0xfe, 0x00, 0x98, 0x0e, 0xe9, 0xb1, 0x0f, 0x8d, 0x1e, 0x03, 0xe7, \n  0x48, 0x0d, 0x74, 0x82, 0x0c, 0x65, 0xa1, 0x01, 0xe4, 0xf1, 0xff, 0xf9, 0x53, 0x01, 0x2a, 0x7b, \n  0xfc, 0xd3, 0x66, 0xfa, 0xd6, 0xfe, 0x03, 0x42, 0x9e, 0x00, 0x95, 0xfc, 0xfb, 0x8e, 0x5f, 0x02, \n  0x77, 0xd9, 0x02, 0x77, 0x07, 0x01, 0x1b, 0x53, 0x02, 0x03, 0x64, 0x01, 0xfb, 0xa4, 0x01, 0xfc, \n  0xcc, 0x00, 0xf6, 0xe1, 0xff, 0x75, 0x01, 0x01, 0xad, 0xf8, 0xfe, 0x5e, 0xc8, 0xfd, 0x6b, 0xe8, \n  0xff, 0x8b, 0x78, 0xff, 0xa5, 0x44, 0xfe, 0x58, 0xee, 0xfe, 0x75, 0x17, 0xfe, 0x43, 0x2d, 0xfe, \n  0xef, 0xd7, 0xfe, 0x98, 0xd2, 0xfe, 0xfa, 0xaa, 0x0c, 0xdc, 0xbf, 0x0e, 0xb2, 0x6d, 0x04, 0x50, \n  0x58, 0x0b, 0x41, 0x43, 0x0c, 0x5b, 0xb9, 0x02, 0xec, 0xfc, 0xfe, 0xcf, 0x81, 0x01, 0x43, 0x62, \n  0xfe, 0x04, 0xca, 0xfa, 0x95, 0x08, 0x02, 0xf1, 0x91, 0x01, 0x03, 0xf1, 0xfd, 0xbf, 0x5b, 0x03, \n  0xdf, 0x2c, 0x04, 0xc1, 0xca, 0x00, 0x86, 0x75, 0x01, 0x9e, 0xca, 0x01, 0xa0, 0x53, 0x01, 0x8f, \n  0x70, 0x00, 0x55, 0xa5, 0xff, 0xff, 0x68, 0x00, 0x41, 0xb7, 0xff, 0x91, 0xf4, 0xfe, 0x7d, 0xae, \n  0xff, 0x58, 0x5c, 0xfe, 0xc0, 0x96, 0xfd, 0x8b, 0x92, 0xfe, 0xf5, 0xab, 0xfe, 0xc2, 0xbd, 0xfe, \n  0x09, 0x08, 0xff, 0x40, 0xe6, 0xfe, 0xf2, 0x0a, 0x0a, 0x9f, 0xb0, 0x0d, 0x4f, 0x07, 0x06, 0xac, \n  0x76, 0x09, 0x75, 0xc7, 0x0b, 0xf1, 0xe9, 0x03, 0xba, 0xa9, 0xff, 0x2b, 0x8f, 0x01, 0x6e, 0xee, \n  0xfd, 0x5c, 0x6d, 0xfb, 0xa6, 0x64, 0x02, 0x18, 0x9f, 0x03, 0xc7, 0x02, 0x00, 0x03, 0xd7, 0x02, \n  0xd8, 0xa6, 0x03, 0x18, 0xa6, 0x00, 0x0e, 0x6f, 0x01, 0x82, 0xad, 0x01, 0x81, 0x82, 0x00, 0x25, \n  0x1c, 0x00, 0xc0, 0x58, 0x00, 0x09, 0x0d, 0x01, 0x51, 0xdc, 0xff, 0x32, 0x31, 0xfe, 0xf1, 0x18, \n  0xfe, 0x2d, 0x20, 0xfe, 0xd0, 0x47, 0xfe, 0x57, 0xe1, 0xfe, 0x17, 0xf6, 0xfe, 0x31, 0xd4, 0xfe, \n  0xed, 0xaa, 0xfe, 0xff, 0x97, 0xfe, 0x36, 0xb4, 0x08, 0x2c, 0x7c, 0x0d, 0x88, 0xf1, 0x05, 0x57, \n  0xf0, 0x07, 0xda, 0x1e, 0x0c, 0xe0, 0x2d, 0x04, 0xf4, 0xbd, 0xfe, 0xdb, 0x4f, 0x01, 0x06, 0x6a, \n  0xff, 0x42, 0x15, 0xfe, 0x8d, 0xa8, 0x03, 0x04, 0x8d, 0x03, 0x68, 0x68, 0x00, 0xd6, 0x02, 0x03, \n  0xa6, 0x0d, 0x03, 0xd5, 0x5f, 0x00, 0x2e, 0xa4, 0x00, 0xb2, 0x28, 0x01, 0x04, 0x72, 0x01, 0x4c, \n  0xec, 0x00, 0x25, 0x35, 0x00, 0x0f, 0xc8, 0xff, 0xa1, 0x4e, 0xfe, 0x29, 0xca, 0xfd, 0x4a, 0xa2, \n  0xfe, 0xb3, 0xc6, 0xfe, 0x81, 0x8d, 0xfe, 0x89, 0xc4, 0xfe, 0xe7, 0x8e, 0xfe, 0xec, 0x82, 0xfe, \n  0xdd, 0xc9, 0xfe, 0x74, 0xbb, 0xfe, 0x41, 0x34, 0x08, 0x62, 0x2a, 0x0c, 0x80, 0x5d, 0x06, 0x99, \n  0xd0, 0x08, 0x7d, 0x20, 0x09, 0xec, 0xa0, 0x02, 0xd2, 0x60, 0x01, 0xdb, 0xe3, 0x03, 0x77, 0xe1, \n  0x00, 0x4f, 0xe0, 0xfe, 0xf8, 0xc4, 0x03, 0x7b, 0x39, 0x03, 0x58, 0xed, 0x00, 0x8a, 0x40, 0x03, \n  0x59, 0xcd, 0x01, 0xf2, 0x81, 0xff, 0x66, 0x9c, 0x01, 0x80, 0x87, 0x02, 0x09, 0x07, 0x01, 0x29, \n  0x7b, 0xff, 0x55, 0x9b, 0xfe, 0x35, 0x31, 0xff, 0x21, 0x06, 0xff, 0xd4, 0x6e, 0xfe, 0x28, 0xd8, \n  0xfe, 0xbf, 0xb5, 0xfe, 0x40, 0x37, 0xfe, 0x1f, 0x5d, 0xfe, 0x39, 0xce, 0xfe, 0x87, 0xa6, 0xfe, \n  0xbd, 0xe0, 0xfe, 0xa0, 0xf6, 0xfe, 0x39, 0x52, 0x08, 0xc6, 0xf5, 0x0a, 0x21, 0x38, 0x05, 0x63, \n  0x0e, 0x08, 0x8d, 0x91, 0x08, 0x61, 0x1a, 0x05, 0x66, 0x3c, 0x04, 0x47, 0xfc, 0x03, 0x55, 0x6a, \n  0x00, 0x1b, 0x1f, 0xff, 0x16, 0x70, 0x04, 0x0d, 0xe8, 0x03, 0xe5, 0x24, 0x00, 0x9b, 0x68, 0x01, \n  0xbb, 0x6f, 0x02, 0xea, 0x51, 0x01, 0x27, 0x5e, 0x01, 0xcc, 0xd4, 0x00, 0x6f, 0xc5, 0xfe, 0x98, \n  0x7a, 0xfe, 0x11, 0xa3, 0xff, 0x01, 0x02, 0x00, 0xe1, 0xda, 0xfe, 0x79, 0x32, 0xfe, 0x17, 0x77, \n  0xfe, 0x95, 0x43, 0xfe, 0x16, 0x2e, 0xfe, 0x00, 0x8a, 0xfe, 0x92, 0xdc, 0xfe, 0x27, 0x07, 0xff, \n  0xb0, 0xff, 0xfe, 0x86, 0xbb, 0xfe, 0xff, 0xad, 0x06, 0x94, 0xb4, 0x09, 0x3d, 0x13, 0x06, 0xba, \n  0x38, 0x09, 0xbd, 0x7b, 0x0a, 0x29, 0x61, 0x05, 0x51, 0x97, 0x03, 0xcc, 0x9b, 0x04, 0xf9, 0x7c, \n  0x01, 0xb6, 0x21, 0x00, 0x35, 0xcc, 0x03, 0x7c, 0xd2, 0x02, 0x1c, 0x78, 0x00, 0x63, 0xd6, 0x02, \n  0xe6, 0x8c, 0x02, 0x6d, 0x85, 0xff, 0x7b, 0x46, 0xff, 0x61, 0xb0, 0xff, 0x99, 0x7e, 0xff, 0xfb, \n  0xaf, 0xff, 0xbb, 0xc6, 0xff, 0x6b, 0x7a, 0xff, 0x32, 0x5a, 0xfe, 0xa3, 0xf9, 0xfd, 0x1c, 0x5b, \n  0xfe, 0x49, 0x5c, 0xfe, 0x51, 0x50, 0xfe, 0x86, 0xe3, 0xfe, 0x9d, 0x40, 0xff, 0x80, 0xe7, 0xfe, \n  0x4e, 0xdd, 0xfe, 0x2b, 0xda, 0xfe, 0xd9, 0xde, 0x07, 0xe4, 0xd4, 0x0c, 0x16, 0xd1, 0x08, 0xd0, \n  0x05, 0x08, 0xe6, 0x9b, 0x07, 0x3a, 0x60, 0x05, 0x43, 0x46, 0x04, 0x13, 0xde, 0x03, 0x06, 0xca, \n  0x01, 0x62, 0x17, 0x01, 0x4c, 0xc6, 0x02, 0xc3, 0xd2, 0x03, 0x1f, 0xdd, 0x01, 0x8a, 0x55, 0xff, \n  0xdd, 0x5e, 0xff, 0xfd, 0x63, 0xff, 0x82, 0xe7, 0xff, 0x63, 0x50, 0x00, 0xdf, 0xcf, 0xff, 0x6f, \n  0x80, 0xff, 0x80, 0xdb, 0xfe, 0xaa, 0xad, 0xfe, 0xaa, 0x5d, 0xfe, 0x64, 0x13, 0xfe, 0x0b, 0x51, \n  0xfe, 0x29, 0xb5, 0xfe, 0x10, 0xdd, 0xfe, 0xa2, 0xc9, 0xfe, 0xa3, 0x3f, 0xff, 0x5a, 0x2f, 0xff, \n  0x75, 0xe0, 0xfe, 0x40, 0xb8, 0xfe, 0xd5, 0xd7, 0x07, 0x34, 0xf3, 0x0c, 0xfd, 0xee, 0x08, 0x62, \n  0x5c, 0x07, 0xcc, 0x3b, 0x07, 0x94, 0x1d, 0x06, 0x5a, 0x39, 0x05, 0xc6, 0xb8, 0x04, 0x11, 0x09, \n  0x03, 0xd0, 0x6d, 0x01, 0x51, 0x62, 0x02, 0x73, 0x7a, 0x03, 0x98, 0x65, 0x00, 0x63, 0xe6, 0xfd, \n  0x50, 0x17, 0xff, 0xcf, 0x1b, 0x00, 0x1f, 0x8c, 0x00, 0xa0, 0x67, 0x00, 0x9f, 0x7f, 0xff, 0xee, \n  0xd9, 0xfe, 0x24, 0xe6, 0xfe, 0x1a, 0xfa, 0xfe, 0x91, 0x55, 0xfe, 0xdc, 0x30, 0xfe, 0xfa, 0x98, \n  0xfe, 0x27, 0xbe, 0xfe, 0x3b, 0xb8, 0xfe, 0xe7, 0xf5, 0xfe, 0x9e, 0x55, 0xff, 0xf2, 0x39, 0xff, \n  0x40, 0x08, 0xff, 0xfa, 0xbd, 0xfe, 0xe8, 0x87, 0x07, 0xbc, 0x3d, 0x0b, 0x0b, 0xab, 0x06, 0x6b, \n  0x8c, 0x06, 0xff, 0xc8, 0x06, 0x04, 0x47, 0x06, 0xee, 0x99, 0x06, 0x1c, 0x9d, 0x07, 0xf3, 0x49, \n  0x05, 0xda, 0x88, 0x02, 0xb0, 0xff, 0x01, 0x05, 0x9e, 0x00, 0xb7, 0x75, 0x00, 0x11, 0x91, 0xff, \n  0x89, 0xd0, 0xfe, 0xec, 0xcc, 0xff, 0x48, 0xb3, 0x00, 0x14, 0x19, 0x00, 0xfb, 0x2f, 0xff, 0x42, \n  0x45, 0xff, 0x62, 0x0a, 0xff, 0xcd, 0xdc, 0xfe, 0x8a, 0x8c, 0xfe, 0x3f, 0x64, 0xfe, 0x38, 0xb4, \n  0xfe, 0xec, 0xbb, 0xfe, 0x35, 0x83, 0xfe, 0xe0, 0xf0, 0xfe, 0x07, 0x5f, 0xff, 0x12, 0x2d, 0xff, \n  0xff, 0x1a, 0xff, 0xaa, 0xe8, 0xfe, 0x4c, 0x27, 0x08, 0xf8, 0xb6, 0x0b, 0xa3, 0xec, 0x05, 0x38, \n  0x5e, 0x05, 0x81, 0xf4, 0x04, 0x18, 0xe4, 0x04, 0x0d, 0x42, 0x07, 0x4b, 0x09, 0x08, 0x10, 0x39, \n  0x05, 0x63, 0xef, 0x02, 0x15, 0x1c, 0x02, 0x4e, 0x17, 0x02, 0x41, 0x8f, 0x02, 0x0b, 0xec, 0xff, \n  0x46, 0x08, 0xff, 0x22, 0x8b, 0xff, 0xfe, 0x58, 0xff, 0xb8, 0x02, 0x00, 0x3f, 0xc2, 0xff, 0x09, \n  0xf3, 0xfe, 0xa1, 0x74, 0xfe, 0xef, 0x01, 0xff, 0xf3, 0x06, 0xff, 0x1e, 0x8f, 0xfe, 0xe6, 0xed, \n  0xfe, 0xd4, 0x28, 0xff, 0x2e, 0xfb, 0xfe, 0x3d, 0xdc, 0xfe, 0x93, 0x09, 0xff, 0xe9, 0x2d, 0xff, \n  0x9f, 0xec, 0xfe, 0x70, 0xc6, 0xfe, 0xfe, 0x8e, 0x08, 0xfd, 0x58, 0x0b, 0x77, 0x5b, 0x04, 0x74, \n  0x9b, 0x04, 0x27, 0x2a, 0x05, 0x0e, 0xb7, 0x03, 0x67, 0xaa, 0x03, 0x82, 0xa2, 0x05, 0xee, 0x7a, \n  0x06, 0x3f, 0x43, 0x05, 0xcc, 0x49, 0x04, 0x80, 0x35, 0x03, 0xe2, 0xaa, 0x02, 0x95, 0x68, 0x03, \n  0x8b, 0xd5, 0x00, 0x3c, 0x4a, 0xfd, 0x57, 0xb2, 0xfe, 0x23, 0x85, 0xff, 0x6e, 0xc7, 0xff, 0x2b, \n  0xaf, 0xff, 0x7b, 0xc6, 0xfe, 0x38, 0xd5, 0xfe, 0xe2, 0x02, 0xff, 0x7a, 0xf9, 0xfe, 0x13, 0x12, \n  0xff, 0x3c, 0x37, 0xff, 0xa5, 0xe3, 0xfe, 0xeb, 0x3f, 0xff, 0x6b, 0xe6, 0xfe, 0x9b, 0xbf, 0xfe, \n  0x45, 0x37, 0xff, 0x36, 0xb8, 0xfe, 0xb0, 0x09, 0x08, 0xa3, 0xfe, 0x0a, 0x03, 0x58, 0x04, 0x10, \n  0x52, 0x04, 0xde, 0x66, 0x05, 0x68, 0xb7, 0x04, 0xb5, 0x21, 0x03, 0xf7, 0x7b, 0x01, 0x70, 0x65, \n  0x02, 0x7c, 0x0c, 0x05, 0x9f, 0x03, 0x06, 0x43, 0x65, 0x04, 0x4b, 0x33, 0x03, 0x60, 0x75, 0x03, \n  0xcb, 0x4e, 0x04, 0x8a, 0xcf, 0x01, 0xf2, 0x1e, 0xfe, 0x70, 0x0c, 0xfe, 0x08, 0xff, 0xfe, 0x22, \n  0x74, 0xff, 0x95, 0xcd, 0xff, 0x3d, 0x67, 0xff, 0xc9, 0x90, 0xfe, 0x0b, 0xea, 0xfe, 0xe9, 0x66, \n  0xff, 0xef, 0xde, 0xfe, 0xc2, 0xfa, 0xfe, 0x6a, 0x75, 0xff, 0x39, 0x09, 0xff, 0x9b, 0xbf, 0xfe, \n  0x21, 0xd0, 0xfe, 0x0a, 0xf5, 0xfe, 0xba, 0xb4, 0x08, 0x9e, 0x08, 0x0b, 0x6e, 0xc4, 0x02, 0x6a, \n  0x25, 0x03, 0x83, 0xfc, 0x04, 0x75, 0x7d, 0x04, 0x98, 0x58, 0x03, 0x3d, 0x1a, 0x01, 0xcd, 0x10, \n  0x00, 0x7e, 0xad, 0x02, 0xb6, 0x5f, 0x04, 0xbd, 0xa3, 0x03, 0xb3, 0xa9, 0x04, 0xbc, 0x6e, 0x05, \n  0x76, 0x6f, 0x05, 0xfe, 0xf6, 0x03, 0x80, 0x04, 0x02, 0x43, 0x7d, 0x00, 0x7d, 0x8e, 0xfe, 0x9c, \n  0xb2, 0xfd, 0x23, 0xc2, 0xfe, 0x96, 0x8c, 0xff, 0xe1, 0x2c, 0xff, 0x11, 0xe3, 0xfe, 0x57, 0xd9, \n  0xfe, 0xec, 0xe6, 0xfe, 0x00, 0x10, 0xff, 0x3f, 0xae, 0xff, 0x24, 0x3f, 0xff, 0xb3, 0xe4, 0xfe, \n  0x59, 0x1b, 0xff, 0x0d, 0xec, 0xfe, 0xf7, 0xbb, 0x09, 0x68, 0x10, 0x0c, 0x68, 0xd1, 0x02, 0xcc, \n  0xfd, 0x03, 0xc3, 0x70, 0x05, 0xdf, 0xcb, 0x03, 0x67, 0x7c, 0x02, 0xbe, 0x87, 0xff, 0x4f, 0x12, \n  0x00, 0x68, 0xdf, 0x03, 0xb4, 0x42, 0x02, 0x20, 0x52, 0x00, 0x36, 0x52, 0x02, 0xce, 0xae, 0x03, \n  0x8b, 0xcb, 0x05, 0xb5, 0xf7, 0x04, 0xb2, 0x63, 0x03, 0xad, 0xa2, 0x03, 0x77, 0xbd, 0x01, 0xae, \n  0x32, 0xff, 0x3b, 0x0f, 0xfe, 0xd4, 0xc9, 0xfd, 0x69, 0x5f, 0xfe, 0xda, 0x87, 0xff, 0x05, 0x73, \n  0xff, 0x11, 0xba, 0xfe, 0x9a, 0xc7, 0xfe, 0xf2, 0x88, 0xff, 0x26, 0x55, 0xff, 0x85, 0x0c, 0xff, \n  0x33, 0x50, 0xff, 0x8f, 0xe3, 0xfe, 0xe9, 0xd7, 0x0a, 0xff, 0x7b, 0x0c, 0xb5, 0x70, 0x02, 0xa1, \n  0x6e, 0x05, 0x11, 0x1b, 0x07, 0xca, 0xa3, 0x04, 0x1f, 0x27, 0x01, 0x54, 0x65, 0xfc, 0x71, 0x92, \n  0xff, 0xa6, 0x6a, 0x05, 0x6b, 0x1a, 0x02, 0x16, 0x33, 0xff, 0xa3, 0x3e, 0x00, 0x50, 0x79, 0x01, \n  0x54, 0xca, 0x03, 0x28, 0x89, 0x02, 0x82, 0x68, 0x03, 0xc9, 0xf1, 0x04, 0x39, 0x68, 0x03, 0xe7, \n  0x37, 0x02, 0x93, 0xac, 0x00, 0xc2, 0xe6, 0xfe, 0xb9, 0x5f, 0xfd, 0xd7, 0xd4, 0xfd, 0x78, 0xf3, \n  0xfe, 0xbd, 0x3c, 0xff, 0x65, 0x54, 0xff, 0xc5, 0x37, 0xff, 0x3e, 0xeb, 0xfe, 0xfd, 0x0d, 0xff, \n  0xb4, 0x69, 0xff, 0xa8, 0xfb, 0xfe, 0xc6, 0x17, 0x0d, 0x35, 0x7e, 0x0f, 0x13, 0x6f, 0x02, 0x8c, \n  0x7e, 0x04, 0x39, 0x5e, 0x06, 0x04, 0xb9, 0x04, 0x5b, 0x7a, 0x01, 0x32, 0x5f, 0xfb, 0x58, 0x51, \n  0xff, 0x32, 0x37, 0x05, 0xa9, 0x18, 0x01, 0x3e, 0xc7, 0xfe, 0x36, 0x44, 0x00, 0xbc, 0xc5, 0x00, \n  0x5d, 0x01, 0x02, 0xe1, 0x61, 0x01, 0x42, 0x99, 0x01, 0xd3, 0x31, 0x03, 0x4b, 0xad, 0x03, 0x2d, \n  0xf4, 0x02, 0x3c, 0xc9, 0x01, 0xe1, 0x35, 0x01, 0x8d, 0x05, 0x00, 0xb8, 0x9a, 0xfe, 0x97, 0xb4, \n  0xfd, 0x32, 0x21, 0xfe, 0xc1, 0x05, 0xff, 0xb9, 0xd4, 0xff, 0x4d, 0x96, 0xff, 0xe1, 0xab, 0xfe, \n  0xe1, 0xca, 0xfe, 0x7a, 0x29, 0xff, 0x41, 0x14, 0x0f, 0xcf, 0x1f, 0x11, 0x36, 0xfc, 0x01, 0x84, \n  0x64, 0x05, 0x7f, 0xc0, 0x07, 0xb2, 0x36, 0x04, 0xc2, 0x92, 0xff, 0xc4, 0x9e, 0xf9, 0x8f, 0xc9, \n  0x00, 0x2f, 0x88, 0x06, 0xc2, 0x57, 0xff, 0xfc, 0x9c, 0xfd, 0x67, 0x96, 0xff, 0xbd, 0xbf, 0x00, \n  0xb9, 0x7e, 0x02, 0x67, 0x27, 0x00, 0x75, 0x0b, 0x00, 0xe6, 0x08, 0x02, 0x06, 0x69, 0x01, 0x0e, \n  0x9c, 0x01, 0x4f, 0x8c, 0x02, 0x28, 0x10, 0x02, 0xfc, 0x77, 0x01, 0x34, 0xe8, 0x00, 0xec, 0x67, \n  0xff, 0xe6, 0x6c, 0xfe, 0xfa, 0xe9, 0xfd, 0xc3, 0x1f, 0xff, 0x10, 0x72, 0xff, 0xb7, 0xfc, 0xfe, \n  0x9d, 0x24, 0xff, 0xd3, 0x94, 0xfe, 0x56, 0x3e, 0x11, 0x5c, 0xc4, 0x12, 0x7c, 0x82, 0x01, 0xa4, \n  0x74, 0x06, 0xef, 0x13, 0x09, 0x11, 0x02, 0x04, 0xec, 0x4f, 0xfd, 0x15, 0x03, 0xf8, 0xde, 0x8e, \n  0x02, 0x41, 0xe5, 0x06, 0x7d, 0x25, 0xfe, 0x16, 0x9d, 0xfd, 0x91, 0xc6, 0xfe, 0x58, 0x2c, 0x00, \n  0x9c, 0x94, 0x02, 0xc7, 0xbb, 0xff, 0xc7, 0xed, 0xff, 0xbf, 0x1a, 0x01, 0x13, 0x1f, 0x00, 0xca, \n  0xaf, 0x00, 0xe7, 0x65, 0x00, 0x61, 0x60, 0x01, 0x20, 0x32, 0x02, 0xab, 0x31, 0x01, 0x7b, 0x30, \n  0x01, 0x69, 0xce, 0x00, 0xa5, 0x1f, 0xff, 0x5f, 0x10, 0xff, 0x7b, 0xab, 0xfe, 0xf9, 0x7c, 0xfe, \n  0x7b, 0xf5, 0xfe, 0xb3, 0xec, 0xfe, 0x7b, 0x4b, 0x14, 0x10, 0xdf, 0x15, 0xa8, 0x00, 0x01, 0x45, \n  0xeb, 0x05, 0xd2, 0xfb, 0x08, 0x77, 0x6d, 0x03, 0xc7, 0xed, 0xfb, 0x3c, 0xc7, 0xf7, 0x10, 0x2d, \n  0x04, 0xdc, 0x1f, 0x06, 0x85, 0x88, 0xfc, 0x94, 0xf0, 0xfd, 0x1e, 0xb9, 0xfe, 0xe9, 0xfc, 0xff, \n  0x95, 0x64, 0x02, 0xe3, 0xf7, 0xfe, 0x76, 0xc8, 0xff, 0x9a, 0x11, 0x01, 0x27, 0x6b, 0xff, 0xee, \n  0xbc, 0xff, 0x78, 0xbb, 0xff, 0xfc, 0x52, 0x00, 0x01, 0x94, 0x00, 0x1d, 0xbd, 0x00, 0x8c, 0x82, \n  0x01, 0xfb, 0x5c, 0x01, 0x05, 0xe6, 0x00, 0x5e, 0x0e, 0x01, 0xe4, 0x46, 0xff, 0x2a, 0x2a, 0xfe, \n  0x0b, 0xa5, 0xfe, 0x81, 0x32, 0xfe, 0xf9, 0x54, 0x16, 0x1a, 0x61, 0x17, 0xe9, 0xb2, 0x00, 0x14, \n  0x06, 0x08, 0x27, 0xe6, 0x0a, 0xc5, 0xb0, 0x01, 0xa9, 0x41, 0xf8, 0xb7, 0xaf, 0xf7, 0x84, 0x12, \n  0x07, 0xff, 0x78, 0x05, 0x47, 0x14, 0xfb, 0x7f, 0xff, 0xfd, 0x08, 0x40, 0xfe, 0xa0, 0x24, 0x00, \n  0xed, 0x44, 0x02, 0x8f, 0x1e, 0xfe, 0xf3, 0xd7, 0xff, 0x8d, 0x0a, 0x01, 0x7c, 0xa6, 0xfe, 0x89, \n  0xaf, 0xff, 0x8c, 0xfb, 0xfe, 0x5d, 0x71, 0xff, 0x10, 0x91, 0x00, 0x35, 0x20, 0xff, 0xae, 0x09, \n  0x00, 0xd7, 0x6f, 0x01, 0x3d, 0xeb, 0x00, 0x4d, 0xf8, 0x01, 0x4f, 0x31, 0x01, 0xc7, 0x88, 0xff, \n  0x32, 0xee, 0xfe, 0x74, 0x04, 0xfe, 0x85, 0xa5, 0x18, 0xac, 0x3e, 0x1a, 0x31, 0x93, 0x00, 0x83, \n  0x5d, 0x08, 0x52, 0xd9, 0x0b, 0x35, 0x69, 0x00, 0x1a, 0x83, 0xf5, 0x31, 0x40, 0xf8, 0x70, 0x7d, \n  0x09, 0xb8, 0xd6, 0x03, 0xec, 0xb9, 0xf9, 0x91, 0x8a, 0xfe, 0x2e, 0x07, 0xfe, 0xff, 0x6f, 0x00, \n  0x50, 0x49, 0x02, 0x29, 0x4c, 0xfd, 0x4b, 0x89, 0xff, 0x20, 0xf8, 0x00, 0x73, 0x31, 0xfe, 0x98, \n  0xa8, 0xff, 0xed, 0xbc, 0xfe, 0x18, 0x0a, 0xff, 0x28, 0x03, 0x00, 0xd5, 0x49, 0xfe, 0x0b, 0xc2, \n  0xff, 0xc8, 0x6b, 0x00, 0xb9, 0x16, 0x00, 0x67, 0xbd, 0x01, 0x1e, 0x22, 0x01, 0x89, 0x7c, 0x00, \n  0x27, 0x8b, 0x00, 0xd9, 0x01, 0xff, 0x8b, 0x54, 0x1a, 0x76, 0x52, 0x1d, 0xe1, 0x12, 0x01, 0xb4, \n  0x48, 0x08, 0xf9, 0xce, 0x0c, 0x09, 0x42, 0xff, 0xf3, 0xad, 0xf2, 0xc7, 0xc9, 0xf8, 0xd3, 0xcb, \n  0x0b, 0x67, 0x45, 0x02, 0x6b, 0x11, 0xf8, 0x46, 0x15, 0xff, 0x80, 0xdc, 0xfd, 0xa7, 0x82, 0x00, \n  0x61, 0x63, 0x02, 0x3d, 0xc7, 0xfc, 0x5c, 0x47, 0xff, 0xb7, 0xc0, 0x00, 0x36, 0xa2, 0xfd, 0xc8, \n  0x4d, 0xff, 0x84, 0x66, 0xfe, 0x34, 0xc4, 0xfe, 0x6d, 0x33, 0x00, 0x5b, 0x99, 0xfd, 0xa6, 0xcf, \n  0xfe, 0x18, 0x37, 0x00, 0x34, 0xaa, 0xff, 0x7c, 0xce, 0x00, 0x2a, 0x82, 0x00, 0x28, 0xe7, 0xff, \n  0xed, 0x93, 0x00, 0xc2, 0x64, 0x00, 0x6f, 0xda, 0x1b, 0x08, 0x15, 0x21, 0x60, 0x1b, 0x02, 0x6a, \n  0xd0, 0x06, 0xa7, 0x3b, 0x0d, 0xc3, 0xb3, 0xfe, 0x8d, 0xb1, 0xf0, 0x10, 0x45, 0xf9, 0x8a, 0xe9, \n  0x0c, 0xe0, 0x60, 0x01, 0x4a, 0xb2, 0xf6, 0xb4, 0xe5, 0xfe, 0xfb, 0x23, 0xfe, 0x77, 0x45, 0x00, \n  0xea, 0x9b, 0x02, 0x36, 0xa1, 0xfc, 0x73, 0xc7, 0xfe, 0x5f, 0xaf, 0x00, 0xdb, 0x5d, 0xfd, 0x49, \n  0xcc, 0xfe, 0x30, 0xf6, 0xfd, 0xa0, 0x5e, 0xfe, 0xec, 0xde, 0xff, 0xb6, 0x97, 0xfd, 0xf0, 0x8c, \n  0xfe, 0x2b, 0x92, 0xff, 0x89, 0x46, 0xff, 0xe5, 0xa5, 0x00, 0xdc, 0xf7, 0xff, 0xd4, 0x4a, 0xff, \n  0x49, 0xcf, 0xff, 0x21, 0x0c, 0xff, 0x41, 0x97, 0x1c, 0x85, 0x80, 0x24, 0xa9, 0xe2, 0x03, 0x8a, \n  0xff, 0x05, 0x68, 0x72, 0x0d, 0x38, 0x0e, 0xfe, 0x32, 0x2e, 0xef, 0x55, 0x7a, 0xf9, 0x8c, 0xb7, \n  0x0d, 0xf8, 0xe5, 0x00, 0x8a, 0xc6, 0xf5, 0x47, 0x27, 0xfe, 0x61, 0x50, 0xfe, 0x62, 0x32, 0x00, \n  0x06, 0xa4, 0x02, 0x41, 0xf2, 0xfc, 0xb1, 0xf8, 0xfd, 0xcf, 0x8d, 0x00, 0xcd, 0x9e, 0xfd, 0x59, \n  0x82, 0xfe, 0x5e, 0x7a, 0xfd, 0xad, 0xaa, 0xfd, 0x74, 0x87, 0xff, 0xa9, 0x63, 0xfd, 0x6b, 0x61, \n  0xfe, 0x65, 0x5d, 0xff, 0x60, 0x15, 0xff, 0xa0, 0x37, 0x00, 0x49, 0x5f, 0x00, 0x76, 0x6e, 0xfe, \n  0xd9, 0x28, 0xfe, 0x65, 0x61, 0xff, 0x3c, 0xbd, 0x1c, 0x5d, 0x82, 0x27, 0x7c, 0x61, 0x06, 0xca, \n  0x93, 0x05, 0x3e, 0x57, 0x0d, 0xfc, 0x87, 0xfd, 0xd8, 0x9f, 0xee, 0x40, 0xf8, 0xf8, 0xe4, 0xf1, \n  0x0d, 0xa9, 0x29, 0x01, 0x67, 0xd2, 0xf4, 0x1d, 0xb4, 0xfd, 0x35, 0x27, 0xfe, 0xb3, 0xcf, 0xff, \n  0xf8, 0xdb, 0x02, 0xfb, 0x34, 0xfd, 0x22, 0x48, 0xfd, 0x6d, 0x5d, 0x00, 0xa8, 0xd9, 0xfd, 0xf3, \n  0x53, 0xfe, 0x36, 0x62, 0xfd, 0x0a, 0xfa, 0xfc, 0xad, 0x27, 0xff, 0xc9, 0x03, 0xfd, 0x8b, 0xda, \n  0xfd, 0x4f, 0x13, 0xff, 0x64, 0x47, 0xff, 0x2c, 0xc9, 0x00, 0x96, 0xb1, 0xfe, 0x7f, 0x04, 0xfe, \n  0x66, 0xb9, 0xfe, 0x1e, 0x72, 0xfe, 0x32, 0xc6, 0x1d, 0x05, 0x93, 0x2a, 0xcf, 0x9d, 0x08, 0xa8, \n  0x29, 0x04, 0x0c, 0x0f, 0x0c, 0xb9, 0xdc, 0xfd, 0x64, 0xa8, 0xef, 0x82, 0x19, 0xf8, 0x3f, 0x30, \n  0x0c, 0xa8, 0xfb, 0x01, 0xe8, 0xb6, 0xf4, 0xdc, 0xdc, 0xfc, 0x64, 0x8b, 0xfe, 0x42, 0xf6, 0xfe, \n  0x0b, 0x49, 0x02, 0xe2, 0x3a, 0xfe, 0x66, 0xb0, 0xfc, 0x9d, 0x79, 0xff, 0xc6, 0x5c, 0xfe, 0x05, \n  0x30, 0xfe, 0x27, 0xf5, 0xfc, 0xf9, 0xe1, 0xfc, 0x48, 0xf6, 0xfe, 0x78, 0x9a, 0xfc, 0x9a, 0xdf, \n  0xfc, 0x58, 0x65, 0xff, 0x88, 0x29, 0xff, 0x1d, 0x15, 0xff, 0x10, 0x75, 0xff, 0xfa, 0x36, 0xfe, \n  0x87, 0xb0, 0xfd, 0x34, 0xa1, 0xfe, 0xca, 0x79, 0x1e, 0xc8, 0xe3, 0x2b, 0x95, 0x06, 0x0c, 0x95, \n  0xf9, 0x03, 0x73, 0xcf, 0x09, 0xf9, 0x93, 0x00, 0x63, 0xd1, 0xf0, 0xf5, 0xe7, 0xf5, 0x39, 0xe8, \n  0x0a, 0x75, 0xea, 0x02, 0xf6, 0x8d, 0xf5, 0x8c, 0x9d, 0xfc, 0xa3, 0xc3, 0xfd, 0x24, 0x87, 0xfe, \n  0xf1, 0x0c, 0x02, 0x7c, 0xab, 0xfe, 0xa9, 0x3b, 0xfd, 0xe2, 0x43, 0xfe, 0x24, 0xac, 0xfd, 0x17, \n  0xdf, 0xfe, 0xb0, 0xa8, 0xfd, 0xbe, 0x56, 0xfc, 0x4d, 0x3e, 0xfe, 0xe0, 0x26, 0xfd, 0x6f, 0x94, \n  0xfd, 0x60, 0xef, 0xfd, 0x7e, 0x98, 0xfd, 0x13, 0x26, 0x00, 0xa6, 0xfe, 0xfe, 0x3d, 0x08, 0xfe, \n  0x07, 0x3e, 0xfe, 0x15, 0x34, 0xfe, 0x6e, 0xac, 0x20, 0xbb, 0xa9, 0x2a, 0x37, 0xf5, 0x0c, 0xf3, \n  0xd5, 0x07, 0xa7, 0xc0, 0x08, 0x11, 0x31, 0x01, 0x5b, 0xa1, 0xf0, 0xf6, 0x44, 0xf5, 0xfe, 0xc9, \n  0x09, 0x9e, 0x6b, 0x02, 0xf8, 0x5a, 0xf7, 0x4b, 0xf6, 0xfb, 0xd6, 0xcd, 0xfc, 0x93, 0xd2, 0xfe, \n  0x5c, 0xb8, 0x01, 0x80, 0x6e, 0xfe, 0x85, 0xb5, 0xfd, 0xdc, 0x2e, 0xfd, 0xf8, 0x09, 0xfd, 0xd8, \n  0xa5, 0xff, 0xe7, 0x4a, 0xfd, 0x10, 0xfe, 0xfb, 0x92, 0x0c, 0xfe, 0x4c, 0x21, 0xfe, 0xb4, 0xfc, \n  0xfc, 0x0e, 0xd9, 0xfc, 0xdb, 0xbc, 0xfd, 0x1c, 0x01, 0xff, 0x58, 0x39, 0xff, 0x4e, 0x4c, 0xfe, \n  0x4f, 0xeb, 0xfd, 0xe7, 0x1b, 0xfe, 0xbe, 0x44, 0x23, 0x96, 0xee, 0x27, 0x46, 0xa8, 0x0c, 0x72, \n  0x0b, 0x0e, 0x52, 0x55, 0x08, 0xab, 0x42, 0x01, 0x57, 0x5f, 0xf0, 0x6a, 0x73, 0xf5, 0x04, 0xea, \n  0x08, 0x5e, 0xbc, 0xff, 0xe9, 0x1f, 0xfa, 0x55, 0x98, 0xfc, 0x04, 0x20, 0xfb, 0xc4, 0x6e, 0xff, \n  0x21, 0x39, 0x01, 0xf8, 0xaa, 0xfd, 0x78, 0xa6, 0xfe, 0x34, 0xb4, 0xfc, 0xef, 0x3b, 0xfc, 0x70, \n  0xb5, 0xff, 0xb8, 0x2c, 0xfc, 0xa4, 0x0f, 0xfd, 0x0b, 0x53, 0xfe, 0xb9, 0x58, 0xfc, 0xd3, 0x27, \n  0xfe, 0x9c, 0xfc, 0xfc, 0x81, 0x64, 0xfc, 0x8d, 0x4c, 0xff, 0xd5, 0x0f, 0xff, 0xb3, 0x08, 0xfe, \n  0x25, 0xf9, 0xfd, 0x01, 0x4c, 0xfe, 0x7c, 0xc3, 0x26, 0xbb, 0x9b, 0x23, 0x7e, 0xf2, 0x08, 0x75, \n  0x87, 0x17, 0xd3, 0x11, 0x0b, 0xfc, 0x65, 0xfd, 0x54, 0x74, 0xf0, 0xc3, 0x67, 0xf8, 0xc2, 0x5c, \n  0x06, 0x87, 0x29, 0xfb, 0xcd, 0x38, 0xfe, 0xdd, 0x0c, 0xfe, 0x96, 0xbd, 0xf8, 0xbe, 0xbc, 0xff, \n  0xc9, 0xae, 0x00, 0x2b, 0x6b, 0xfd, 0x30, 0x70, 0xff, 0xce, 0x11, 0xfc, 0x67, 0x38, 0xfb, 0xca, \n  0x77, 0xff, 0xc5, 0x3a, 0xfc, 0xc1, 0xef, 0xfc, 0x21, 0x94, 0xfc, 0x65, 0x15, 0xfd, 0x29, 0xd2, \n  0xfe, 0xfe, 0x6d, 0xfc, 0x6c, 0xc8, 0xfc, 0x7e, 0x71, 0xfe, 0x73, 0xfe, 0xfe, 0x5c, 0x87, 0xfe, \n  0x44, 0x94, 0xfe, 0x39, 0x86, 0xfd, 0x0d, 0xc8, 0x2b, 0x4a, 0xee, 0x22, 0xdd, 0xcd, 0x02, 0x61, \n  0xd4, 0x1c, 0xba, 0xbf, 0x0d, 0x36, 0x01, 0xf9, 0xaa, 0xf6, 0xf2, 0x39, 0x22, 0xfe, 0x63, 0x99, \n  0x02, 0x80, 0x92, 0xf3, 0x8d, 0xdb, 0x01, 0xda, 0x79, 0x02, 0xb9, 0xdb, 0xf6, 0x2d, 0x4c, 0xff, \n  0xe5, 0xd9, 0xff, 0x61, 0x21, 0xfd, 0x0f, 0xfc, 0x00, 0xc3, 0x48, 0xfb, 0x93, 0xe1, 0xf9, 0x1f, \n  0xeb, 0x00, 0xd9, 0x2b, 0xfa, 0x19, 0x9d, 0xfb, 0xfb, 0x89, 0xfe, 0x3f, 0x66, 0xfb, 0xdc, 0x4c, \n  0xff, 0x84, 0x1b, 0xfd, 0x04, 0xa9, 0xfc, 0x7e, 0xb8, 0xfe, 0x9c, 0xd9, 0xfe, 0xce, 0x44, 0xff, \n  0x3b, 0x68, 0xfe, 0x4d, 0x88, 0xfc, 0x56, 0xd4, 0x30, 0x49, 0xbe, 0x23, 0x86, 0x39, 0xfb, 0x66, \n  0xae, 0x1f, 0x11, 0x76, 0x12, 0x8c, 0x6f, 0xf4, 0x87, 0xdc, 0xf3, 0x94, 0x99, 0x05, 0xa2, 0xde, \n  0x00, 0x2f, 0xe5, 0xe9, 0xcb, 0x72, 0x02, 0xae, 0x21, 0x09, 0x0d, 0x55, 0xf6, 0xdc, 0xef, 0xfd, \n  0x51, 0x0b, 0xff, 0x3a, 0x02, 0xfc, 0xfe, 0x8f, 0x02, 0xc5, 0x20, 0xfb, 0x8d, 0xbd, 0xf9, 0xb9, \n  0x98, 0xff, 0xab, 0x6b, 0xf8, 0xf5, 0x48, 0xfc, 0x25, 0xe8, 0xfd, 0xa7, 0x25, 0xfb, 0xe5, 0xc4, \n  0xff, 0xaf, 0xd8, 0xfc, 0x2b, 0xe3, 0xfc, 0xa6, 0xf6, 0xff, 0xf1, 0x0b, 0xff, 0xc0, 0xfa, 0xfd, \n  0x59, 0x7b, 0xfe, 0x8f, 0xb1, 0xfd, 0x37, 0x6d, 0x35, 0x6d, 0x0b, 0x26, 0x8e, 0x6a, 0xf3, 0x16, \n  0xc4, 0x1f, 0x37, 0xb4, 0x18, 0x8b, 0x36, 0xf1, 0x27, 0x3d, 0xf3, 0xc6, 0x3d, 0x0d, 0x4f, 0xf5, \n  0x01, 0x96, 0xc9, 0xe0, 0x31, 0xe6, 0xfe, 0xfe, 0xf8, 0x0f, 0x0f, 0x00, 0xf9, 0xb7, 0xee, 0xfb, \n  0xf8, 0x49, 0xfe, 0xb7, 0x6b, 0xfa, 0xe8, 0x80, 0x03, 0xef, 0x20, 0xfd, 0x7f, 0x84, 0xf7, 0x87, \n  0xef, 0xfe, 0x0a, 0xa7, 0xf8, 0x5b, 0xe3, 0xf9, 0x7f, 0x0a, 0xff, 0xce, 0x7d, 0xfb, 0xe8, 0x1b, \n  0xff, 0x89, 0x43, 0xfd, 0x3e, 0x2a, 0xfd, 0x79, 0x45, 0x01, 0x87, 0xb1, 0xfe, 0xea, 0xf1, 0xfc, \n  0xea, 0x6b, 0xff, 0x7b, 0x51, 0xfe, 0x9f, 0x32, 0x3b, 0x31, 0xf0, 0x29, 0x05, 0x44, 0xea, 0xb5, \n  0x2c, 0x1b, 0x56, 0xe4, 0x1f, 0xe4, 0xe5, 0xf1, 0x10, 0x31, 0xf0, 0xd7, 0xe4, 0x11, 0xc4, 0xce, \n  0x04, 0xb3, 0x0b, 0xdb, 0x1b, 0xae, 0xf8, 0xfd, 0xbb, 0x13, 0xdb, 0x0b, 0xfe, 0x10, 0xe3, 0xfa, \n  0x88, 0xad, 0xfc, 0x11, 0xa0, 0xf8, 0x3a, 0x21, 0x05, 0xac, 0xe1, 0xfc, 0x46, 0x84, 0xf5, 0x33, \n  0x3d, 0x00, 0x99, 0x3f, 0xf7, 0xb6, 0x4a, 0xf8, 0x37, 0x3f, 0xff, 0x63, 0x00, 0xfc, 0xf5, 0x51, \n  0xff, 0xa0, 0x12, 0xfd, 0xaa, 0x56, 0xfd, 0x65, 0x88, 0x01, 0xf5, 0xb7, 0xfe, 0xe7, 0xe9, 0xfc, \n  0x7e, 0x8f, 0xff, 0x62, 0x3d, 0xfe, 0xf3, 0x6f, 0x41, 0x85, 0x62, 0x2d, 0x6b, 0x0d, 0xe2, 0x12, \n  0x2b, 0x16, 0x71, 0xe7, 0x24, 0xce, 0x4a, 0xf4, 0x95, 0xad, 0xed, 0xfa, 0x2d, 0x16, 0xf1, 0x9a, \n  0x07, 0xeb, 0x0e, 0xd7, 0xdf, 0x3e, 0xf2, 0x11, 0xc8, 0x14, 0xe9, 0x6a, 0x04, 0x7d, 0xb2, 0xfb, \n  0xa6, 0xe3, 0xf9, 0x3c, 0xbc, 0xf7, 0x86, 0xf8, 0x05, 0x4c, 0xd8, 0xfb, 0x3c, 0x7b, 0xf5, 0x75, \n  0xe6, 0xff, 0x2e, 0x51, 0xf7, 0x0a, 0x26, 0xf7, 0x5e, 0x66, 0xfe, 0x54, 0x33, 0xfd, 0x99, 0xa4, \n  0xff, 0xf2, 0x27, 0xfd, 0x94, 0xc1, 0xfc, 0x78, 0x9e, 0x01, 0x8e, 0x0a, 0xff, 0x80, 0x6d, 0xfd, \n  0xba, 0x2f, 0xff, 0x8a, 0x53, 0xfe, 0x76, 0x69, 0x4a, 0x00, 0xbd, 0x2e, 0xf4, 0x86, 0xd9, 0xc7, \n  0x9c, 0x11, 0xc7, 0x83, 0x27, 0x9c, 0x46, 0xf8, 0x25, 0x30, 0xec, 0x5f, 0x42, 0x19, 0x0a, 0x01, \n  0x09, 0xea, 0xe2, 0xd4, 0xc2, 0xa0, 0xed, 0xff, 0x89, 0x13, 0x28, 0x53, 0x0a, 0xd2, 0xad, 0xfd, \n  0x80, 0x68, 0xf7, 0x0b, 0x64, 0xf6, 0x2e, 0xfa, 0x06, 0x60, 0xe1, 0xfa, 0x91, 0xe6, 0xf4, 0x41, \n  0x56, 0x00, 0xa4, 0xe2, 0xf6, 0x66, 0x01, 0xf7, 0x03, 0x0e, 0xfe, 0x11, 0x93, 0xfd, 0x32, 0x1f, \n  0x00, 0xad, 0x59, 0xfd, 0x92, 0xd4, 0xfb, 0xfb, 0xca, 0x01, 0xc4, 0xcb, 0xff, 0xcd, 0x59, 0xfd, \n  0x72, 0x04, 0xff, 0xee, 0x43, 0xfe, 0x7b, 0x70, 0x54, 0x61, 0x21, 0x30, 0x9b, 0x95, 0xcf, 0xe0, \n  0x73, 0x0c, 0x9c, 0xea, 0x28, 0x38, 0x05, 0xfe, 0xfb, 0x5e, 0xeb, 0x15, 0x34, 0x19, 0xd5, 0xcd, \n  0x09, 0x6b, 0xb5, 0xd4, 0x0b, 0x80, 0xea, 0x01, 0x76, 0x10, 0xec, 0x3a, 0x0e, 0xf9, 0xc1, 0x00, \n  0x7f, 0xbf, 0xf5, 0xe3, 0xed, 0xf3, 0x1b, 0x4e, 0x08, 0xd4, 0xca, 0xf9, 0x37, 0xd5, 0xf3, 0xcc, \n  0xff, 0x00, 0x21, 0x1c, 0xf6, 0xec, 0xd9, 0xf7, 0x88, 0x2e, 0xfd, 0xbd, 0xb8, 0xfd, 0x2b, 0xa4, \n  0x00, 0x1a, 0xe0, 0xfc, 0x48, 0x30, 0xfb, 0xdf, 0x21, 0x02, 0xd9, 0x4f, 0x00, 0x12, 0xc7, 0xfc, \n  0xd7, 0xd1, 0xfe, 0xa4, 0x0a, 0xfe, 0x65, 0x06, 0x5d, 0x10, 0x64, 0x33, 0x48, 0xc9, 0xc5, 0x82, \n  0xd7, 0x08, 0x07, 0xbf, 0x28, 0x22, 0x89, 0x03, 0xeb, 0x03, 0xec, 0xd8, 0xf8, 0x17, 0xe9, 0xea, \n  0x0c, 0x98, 0x16, 0xd5, 0x60, 0xe1, 0xe7, 0xca, 0x00, 0x0d, 0x61, 0x7b, 0x10, 0xa0, 0x7d, 0x05, \n  0x53, 0xe1, 0xf4, 0x15, 0xc9, 0xf1, 0x50, 0x63, 0x09, 0x33, 0x10, 0xf9, 0x6d, 0x7b, 0xf3, 0xca, \n  0xf7, 0x01, 0x32, 0xc8, 0xf5, 0x0d, 0x42, 0xf8, 0xb1, 0x3f, 0xfd, 0x54, 0xb7, 0xfd, 0x38, 0xd2, \n  0x00, 0x30, 0x83, 0xfc, 0x73, 0x6d, 0xfb, 0xf8, 0xd2, 0x02, 0x90, 0xe2, 0xff, 0x8b, 0x5c, 0xfc, \n  0x6c, 0x2e, 0xff, 0xd2, 0x0d, 0xfe, 0xaa, 0x13, 0x67, 0x4d, 0x49, 0x32, 0xf4, 0xb1, 0xbd, 0xc8, \n  0xc0, 0x08, 0x7b, 0x07, 0x26, 0x91, 0x41, 0x05, 0x37, 0x73, 0xed, 0xa4, 0x54, 0x17, 0xcf, 0x01, \n  0x11, 0xb2, 0x5a, 0xd4, 0x0b, 0x71, 0xe4, 0xce, 0xbc, 0x0a, 0x05, 0xef, 0x10, 0xd0, 0x8c, 0x09, \n  0xca, 0x12, 0xf4, 0x75, 0x1a, 0xf1, 0x90, 0x1b, 0x09, 0x1c, 0x09, 0xf7, 0xab, 0xeb, 0xf4, 0x49, \n  0xcb, 0x02, 0x1f, 0x81, 0xf4, 0x99, 0x0a, 0xf8, 0xee, 0x2e, 0xfe, 0x2f, 0x0b, 0xfd, 0xb0, 0x75, \n  0x00, 0x0b, 0x4b, 0xfc, 0x17, 0x2f, 0xfc, 0xc4, 0x3a, 0x03, 0x48, 0x61, 0xfe, 0x9e, 0x7b, 0xfc, \n  0x88, 0x61, 0xff, 0x1d, 0x11, 0xfe, 0xf2, 0x29, 0x6d, 0x4d, 0xe4, 0x34, 0xd7, 0x91, 0xb6, 0x33, \n  0x10, 0x0a, 0x91, 0x09, 0x22, 0x8c, 0xa0, 0x04, 0x3a, 0xfc, 0xee, 0xe8, 0xf2, 0x15, 0xe8, 0x33, \n  0x19, 0x43, 0xb2, 0xd3, 0x30, 0x4d, 0xde, 0x42, 0x8a, 0x09, 0x57, 0x6a, 0x11, 0xd8, 0x60, 0x0b, \n  0xaf, 0xb0, 0xf5, 0x6d, 0x72, 0xf1, 0x8b, 0x7d, 0x06, 0x7e, 0x75, 0xf6, 0x87, 0x04, 0xf7, 0x64, \n  0xe0, 0x02, 0x10, 0x8c, 0xf3, 0x66, 0xdd, 0xf7, 0x70, 0xe3, 0xfe, 0x97, 0x10, 0xfc, 0x5f, 0x0d, \n  0x00, 0x71, 0xe0, 0xfc, 0xd4, 0xa5, 0xfc, 0x17, 0x5f, 0x03, 0x62, 0x11, 0xfd, 0x7e, 0xb2, 0xfc, \n  0x7b, 0xba, 0xff, 0x4e, 0xa6, 0xfd, 0xe4, 0xf5, 0x73, 0xc1, 0xef, 0x33, 0x98, 0x8a, 0xb2, 0x1e, \n  0x9b, 0x0d, 0x62, 0x9e, 0x1c, 0x09, 0xb2, 0x01, 0x3f, 0xe7, 0xee, 0x17, 0x5a, 0x16, 0xf7, 0x2d, \n  0x22, 0xa2, 0xa1, 0xd2, 0x52, 0xe8, 0xd7, 0xb0, 0x04, 0x09, 0x59, 0x99, 0x11, 0x46, 0x10, 0x0b, \n  0x58, 0x33, 0xf9, 0xbe, 0xd7, 0xf1, 0x86, 0x18, 0x03, 0x83, 0x35, 0xf7, 0x88, 0x78, 0xf8, 0x84, \n  0xa1, 0x02, 0xb3, 0x5b, 0xf2, 0x35, 0xc2, 0xf8, 0xf7, 0xe6, 0xfe, 0x41, 0x8c, 0xfa, 0x93, 0xf3, \n  0xff, 0x36, 0xc3, 0xfd, 0x12, 0x07, 0xfd, 0x98, 0x28, 0x03, 0x47, 0x3e, 0xfc, 0xe0, 0x90, 0xfc, \n  0x0c, 0x59, 0x00, 0x19, 0x8e, 0xfc, 0xae, 0x9c, 0x78, 0x4c, 0xe0, 0x33, 0x46, 0xef, 0xb0, 0x55, \n  0x45, 0x11, 0xff, 0x28, 0x17, 0x3f, 0x6d, 0xfe, 0x7b, 0x6d, 0xec, 0xd1, 0x9b, 0x17, 0x11, 0xbb, \n  0x2b, 0x0c, 0x35, 0xd2, 0x87, 0xb6, 0xd2, 0x80, 0xc5, 0x07, 0x84, 0x15, 0x11, 0x79, 0x05, 0x0a, \n  0x4c, 0x77, 0xfe, 0x18, 0x21, 0xf1, 0x30, 0x6b, 0x00, 0x7c, 0x95, 0xf9, 0xd5, 0x10, 0xf8, 0x7e, \n  0x9a, 0x02, 0x1a, 0xab, 0xf1, 0xb7, 0x37, 0xfa, 0x49, 0x52, 0xfe, 0x2f, 0x2b, 0xf9, 0x8d, 0xab, \n  0xff, 0x8a, 0xec, 0xfe, 0x6f, 0x8c, 0xfd, 0xcb, 0x60, 0x02, 0x93, 0x4f, 0xfc, 0x22, 0x48, 0xfc, \n  0x9f, 0x7e, 0x00, 0x3f, 0xef, 0xfa, 0xb5, 0x2e, 0x7a, 0x67, 0x39, 0x36, 0x68, 0xfd, 0xb0, 0xf4, \n  0x61, 0x13, 0x77, 0x2c, 0x13, 0xd8, 0x0a, 0xfc, 0x4f, 0xbc, 0xe7, 0x5c, 0xe7, 0x17, 0x58, 0x47, \n  0x34, 0x16, 0xca, 0xd3, 0xa9, 0x3b, 0xd0, 0x16, 0x62, 0x04, 0x76, 0x0a, 0x10, 0x2d, 0xc3, 0x08, \n  0x6a, 0xd5, 0x03, 0x1a, 0xbd, 0xf0, 0x90, 0xfb, 0xfd, 0xa1, 0xee, 0xfc, 0xbe, 0x9d, 0xf6, 0x7b, \n  0x1e, 0x02, 0xc0, 0x45, 0xf2, 0xfd, 0x93, 0xfb, 0x09, 0x21, 0xfd, 0x05, 0x40, 0xf8, 0xe0, 0x55, \n  0xff, 0xca, 0xf5, 0xff, 0x61, 0xf1, 0xfd, 0x65, 0x36, 0x01, 0x37, 0x8e, 0xfd, 0xe3, 0x4d, 0xfb, \n  0x87, 0x70, 0xff, 0xa6, 0x6e, 0xfa, 0x50, 0x14, 0x7c, 0xf1, 0x43, 0x39, 0xba, 0x02, 0xb1, 0x31, \n  0x0e, 0x13, 0xf7, 0xf5, 0x10, 0x3c, 0xbf, 0xfa, 0x2c, 0x65, 0xe1, 0x39, 0x33, 0x17, 0x99, 0xb1, \n  0x3a, 0x49, 0x17, 0xd7, 0x10, 0xde, 0xcf, 0xd3, 0x00, 0xff, 0x67, 0x41, 0x0f, 0xca, 0x62, 0x08, \n  0x4f, 0x67, 0x07, 0xa9, 0xb1, 0xf1, 0x16, 0x12, 0xfc, 0x3b, 0x26, 0xff, 0x33, 0xaf, 0xf5, 0x83, \n  0x0c, 0x01, 0x25, 0x90, 0xf3, 0x25, 0x3c, 0xfc, 0xa7, 0xe3, 0xfb, 0xdc, 0xcd, 0xf7, 0xf1, 0x07, \n  0xff, 0x47, 0x7d, 0x00, 0x78, 0x04, 0xfe, 0x51, 0x0d, 0x01, 0x5d, 0x21, 0xfe, 0x74, 0x80, 0xf9, \n  0x67, 0xd5, 0xfe, 0xb0, 0x7c, 0xfa, 0x2f, 0x3c, 0x7d, 0x96, 0x0c, 0x3b, 0x45, 0x50, 0xb3, 0x2c, \n  0x8a, 0x11, 0xa4, 0xc3, 0x0f, 0x79, 0xe6, 0xf9, 0xcc, 0x9d, 0xdb, 0x0d, 0x1b, 0x15, 0x43, 0x60, \n  0x3d, 0xd3, 0x28, 0xdd, 0xe6, 0x2c, 0xd1, 0x70, 0xd1, 0xf8, 0x45, 0x01, 0x0e, 0x8d, 0x21, 0x09, \n  0x47, 0x61, 0x08, 0x0c, 0x7f, 0xf3, 0xbc, 0xd0, 0xfb, 0x2c, 0x37, 0xff, 0x9e, 0x05, 0xf6, 0xfd, \n  0x0e, 0x00, 0x9a, 0x02, 0xf5, 0x8d, 0x39, 0xfc, 0xf5, 0xec, 0xfa, 0x1b, 0xbf, 0xf7, 0x64, 0x8a, \n  0xfe, 0xd2, 0x68, 0x00, 0xa0, 0x8d, 0xfe, 0xb8, 0xd4, 0x00, 0x45, 0x9d, 0xfc, 0x0a, 0x94, 0xf9, \n  0x12, 0xd4, 0xfd, 0x10, 0x52, 0xfa, 0x76, 0x6b, 0x7b, 0x40, 0x49, 0x3f, 0xa9, 0xe4, 0xb6, 0x99, \n  0xf5, 0x0e, 0x52, 0x96, 0x0f, 0x68, 0x49, 0xf8, 0xfd, 0xcb, 0xd8, 0xd6, 0x0f, 0x0f, 0x28, 0x87, \n  0x3e, 0x98, 0x57, 0xe6, 0xc1, 0x86, 0xd2, 0x1c, 0xcf, 0xf2, 0x63, 0x2c, 0x0c, 0x46, 0xf5, 0x0a, \n  0x15, 0x78, 0x07, 0x0e, 0xf8, 0xf5, 0x07, 0x31, 0xfd, 0xe1, 0xaf, 0xfd, 0x52, 0xd6, 0xf6, 0x7a, \n  0x6e, 0x00, 0x1d, 0xd3, 0xf5, 0x6d, 0xad, 0xfb, 0x68, 0x78, 0xfa, 0x04, 0x4f, 0xf7, 0x36, 0x71, \n  0xfe, 0xdf, 0xb8, 0x00, 0x1c, 0xd1, 0xfd, 0x2b, 0xdb, 0xff, 0xd4, 0xfc, 0xfb, 0xb0, 0xcf, 0xf9, \n  0xd4, 0xfa, 0xfc, 0x16, 0x70, 0xfb, 0x5d, 0x62, 0x77, 0x1e, 0x1a, 0x45, 0x63, 0xd2, 0xbb, 0x57, \n  0xe9, 0x0b, 0xba, 0x14, 0x0f, 0xaf, 0xf1, 0xf6, 0xf9, 0x08, 0xd9, 0x2e, 0x0a, 0x05, 0x9e, 0x9f, \n  0x3e, 0xe2, 0x37, 0xf1, 0x78, 0xe6, 0xd3, 0x81, 0xbb, 0xee, 0x8f, 0x1e, 0x09, 0x7f, 0x0a, 0x0d, \n  0x4d, 0x95, 0x05, 0x7c, 0xd0, 0xf8, 0xf2, 0xef, 0xff, 0xb0, 0xf3, 0xfa, 0x35, 0xad, 0xf8, 0x9b, \n  0x54, 0x01, 0x7a, 0x45, 0xf6, 0x9b, 0xb5, 0xfa, 0xa8, 0xe2, 0xf9, 0x4a, 0x68, 0xf7, 0x3b, 0xed, \n  0xfe, 0x7f, 0xaf, 0xff, 0xb5, 0xad, 0xfb, 0x02, 0xd7, 0x00, 0x63, 0xed, 0xfa, 0x40, 0x5f, 0xfa, \n  0xe5, 0xef, 0xfd, 0x29, 0x38, 0xfb, 0xe4, 0x8a, 0x71, 0x65, 0xd3, 0x4b, 0x6a, 0x42, 0xc2, 0xc4, \n  0x46, 0x07, 0xaf, 0x23, 0x0d, 0x52, 0x05, 0xf8, 0xcf, 0xde, 0xdb, 0x15, 0x4d, 0xf7, 0xd2, 0xcb, \n  0x3c, 0xd1, 0x9f, 0xfc, 0x17, 0xee, 0xd5, 0x1d, 0x5c, 0xed, 0xb8, 0x6f, 0x04, 0x22, 0x75, 0x0d, \n  0x40, 0xa7, 0x04, 0xe9, 0xcc, 0xfa, 0xb1, 0xb1, 0x03, 0xd5, 0x74, 0xf8, 0x5d, 0x23, 0xfa, 0x34, \n  0xcd, 0x02, 0xa0, 0x16, 0xf6, 0x67, 0x6d, 0xf9, 0x0d, 0x8e, 0xf9, 0xe5, 0x45, 0xf8, 0x4e, 0x05, \n  0xfd, 0x86, 0x5c, 0xfe, 0x84, 0xb8, 0xfa, 0x32, 0x6a, 0x01, 0xca, 0x09, 0xfb, 0xf7, 0x5e, 0xfb, \n  0x75, 0x18, 0xfe, 0xb8, 0x8d, 0xfa, 0xaf, 0xd2, 0x6b, 0xc4, 0x3e, 0x4e, 0x49, 0xf3, 0xcb, 0x81, \n  0x40, 0x05, 0x0e, 0xc7, 0x08, 0xe1, 0xe7, 0xf9, 0x9d, 0xea, 0xdc, 0xad, 0xbe, 0xea, 0x5a, 0x64, \n  0x3a, 0xcf, 0x19, 0x07, 0xfb, 0xe6, 0xd7, 0xbc, 0x1e, 0xee, 0xa7, 0x84, 0xff, 0x4a, 0x09, 0x0a, \n  0x55, 0xdd, 0x07, 0x8f, 0x87, 0xfa, 0x8f, 0x2d, 0x07, 0xa4, 0xc4, 0xf8, 0x06, 0xc3, 0xf8, 0x11, \n  0xbc, 0x05, 0x73, 0x1a, 0xf5, 0x5b, 0x98, 0xf8, 0x7e, 0x9e, 0xf9, 0xb0, 0xb5, 0xf6, 0xa6, 0x06, \n  0xfb, 0x3d, 0xfb, 0xfd, 0xd1, 0xfb, 0xf9, 0xc4, 0x94, 0x02, 0xa2, 0x4a, 0xfc, 0x9b, 0x69, 0xfa, \n  0x19, 0xfa, 0xfe, 0xb1, 0xba, 0xfa, 0x4a, 0x1d, 0x64, 0xf5, 0x6e, 0x4f, 0x79, 0xfd, 0xd7, 0x39, \n  0x08, 0x05, 0x6e, 0x6a, 0x04, 0x37, 0x9f, 0xfb, 0x4e, 0x1f, 0xdd, 0x8a, 0xd6, 0xde, 0x22, 0x16, \n  0x37, 0x34, 0x55, 0x12, 0xe7, 0x79, 0xd9, 0x02, 0x32, 0xef, 0x40, 0x15, 0xfd, 0xe3, 0x5a, 0x02, \n  0xa2, 0x75, 0x0d, 0x8d, 0xf6, 0xfa, 0xf6, 0x3f, 0x07, 0x6f, 0xcb, 0xfd, 0xfa, 0x6c, 0xf5, 0x12, \n  0x4d, 0x07, 0x58, 0xc5, 0xf6, 0x94, 0x60, 0xf6, 0xca, 0x27, 0xf9, 0xc5, 0x8b, 0xf5, 0x68, 0x7d, \n  0xf8, 0xcf, 0xa6, 0xfe, 0x04, 0x7e, 0xfa, 0x58, 0x96, 0x02, 0xbd, 0x03, 0xfe, 0xa4, 0x74, 0xf9, \n  0x44, 0xbb, 0xff, 0xd4, 0x45, 0xfa, 0x7c, 0x60, 0x5d, 0xfb, 0xf1, 0x50, 0xb1, 0x93, 0xe3, 0xa2, \n  0xdf, 0x01, 0x0a, 0x99, 0xfe, 0x2f, 0xc3, 0xff, 0xa3, 0x56, 0xe1, 0x32, 0x3a, 0xd4, 0x74, 0x72, \n  0x2e, 0xa6, 0xe7, 0x1c, 0xc8, 0x46, 0xdc, 0xcb, 0xed, 0xef, 0x4f, 0xa0, 0xff, 0x48, 0x42, 0xf8, \n  0x04, 0xc8, 0x0f, 0x48, 0xd7, 0xff, 0x77, 0x2e, 0x04, 0x4e, 0x58, 0x03, 0xce, 0xe4, 0xf4, 0x07, \n  0xcd, 0x04, 0xd7, 0xac, 0xf9, 0xae, 0x15, 0xf5, 0xd6, 0xc1, 0xf7, 0x6f, 0x8e, 0xf5, 0x4d, 0x09, \n  0xf7, 0x8a, 0xb8, 0xfe, 0xf1, 0xf3, 0xfb, 0x87, 0x81, 0x01, 0xda, 0x9d, 0xff, 0xb3, 0x0d, 0xf9, \n  0xce, 0xe7, 0xfe, 0x6e, 0x58, 0xfb, 0xd2, 0x27, 0x59, 0xd5, 0x19, 0x51, 0x9d, 0x14, 0xe7, 0xaa, \n  0xcf, 0x04, 0x78, 0x38, 0x00, 0x9c, 0x4d, 0xf9, 0xee, 0xfb, 0xe4, 0x07, 0xea, 0xd2, 0x72, 0xba, \n  0x21, 0x1d, 0xd5, 0x24, 0xf0, 0xd3, 0xe1, 0x6c, 0x6d, 0xed, 0xf6, 0x0d, 0x05, 0x10, 0x0a, 0xf1, \n  0x64, 0x0a, 0x0d, 0x43, 0x98, 0x07, 0x39, 0x2d, 0x01, 0x1a, 0xc7, 0x04, 0xe8, 0x9c, 0xf7, 0x47, \n  0x57, 0x00, 0x2b, 0x6f, 0xfc, 0x2c, 0xe6, 0xf5, 0xdd, 0x62, 0xf5, 0xad, 0x2d, 0xf8, 0x73, 0x37, \n  0xf5, 0x43, 0x12, 0xfe, 0xd3, 0x79, 0xfd, 0xd2, 0x4c, 0x00, 0x76, 0x75, 0xff, 0x16, 0xb5, 0xf9, \n  0x1b, 0x4a, 0xfe, 0x0c, 0xcb, 0xfb, 0x83, 0xfa, 0x5a, 0x1e, 0x1c, 0x4d, 0xab, 0xc0, 0xe4, 0x4d, \n  0x78, 0x0a, 0xd7, 0x13, 0x03, 0x51, 0xd7, 0xf0, 0xac, 0x57, 0xe5, 0x9a, 0x5f, 0xd9, 0x46, 0xb8, \n  0x15, 0x7a, 0x34, 0x26, 0xcb, 0x50, 0xe9, 0xd3, 0x92, 0xea, 0xfa, 0x2a, 0x0a, 0xeb, 0x7b, 0xee, \n  0xff, 0x3b, 0x09, 0xce, 0xe4, 0x0a, 0x74, 0xac, 0x00, 0xe5, 0x94, 0x03, 0x11, 0xc8, 0xf9, 0xf3, \n  0x5b, 0xff, 0x0f, 0x0c, 0xfb, 0x5f, 0x61, 0xf9, 0xb4, 0xb5, 0xf4, 0x02, 0x3e, 0xfa, 0xcd, 0x7b, \n  0xf5, 0xe7, 0xe3, 0xfa, 0xb7, 0x3b, 0xfe, 0x18, 0x36, 0xff, 0xba, 0xf5, 0xff, 0xcc, 0xac, 0xf9, \n  0xe6, 0x94, 0xfd, 0x29, 0x32, 0xfc, 0xe1, 0x54, 0x5a, 0xe1, 0x5a, 0x4b, 0x6a, 0x75, 0xe2, 0x32, \n  0x07, 0x0f, 0x34, 0x31, 0x06, 0xb9, 0x0b, 0xea, 0x62, 0xa6, 0xe7, 0xbf, 0x91, 0xde, 0x26, 0x42, \n  0x0a, 0x12, 0x89, 0x25, 0xf3, 0xe8, 0xf3, 0x65, 0x43, 0xe6, 0x8b, 0x9b, 0x0e, 0x66, 0x2f, 0xef, \n  0x25, 0x9c, 0x03, 0x0a, 0x74, 0x0e, 0x68, 0xf7, 0xfb, 0x8d, 0x25, 0x06, 0x0f, 0x09, 0xfb, 0x6e, \n  0xb5, 0xfc, 0x48, 0x17, 0xfe, 0x24, 0x34, 0xfc, 0x5d, 0x71, 0xf5, 0xb1, 0xb8, 0xfb, 0x7e, 0x1d, \n  0xf6, 0x14, 0x2d, 0xf7, 0x89, 0xf3, 0xfd, 0x80, 0xf3, 0xfd, 0x97, 0x72, 0x01, 0x60, 0x16, 0xfa, \n  0xa0, 0x17, 0xfb, 0x90, 0x1b, 0xfd, 0x02, 0x57, 0x5d, 0x39, 0x77, 0x43, 0x32, 0x0d, 0xe1, 0xa8, \n  0xc9, 0x15, 0x3f, 0x19, 0x04, 0xb9, 0x1b, 0xe7, 0xac, 0x36, 0xea, 0x1a, 0xd5, 0xe1, 0x62, 0xe6, \n  0x00, 0x3b, 0xc0, 0x25, 0xb1, 0xbe, 0xfb, 0x5d, 0x17, 0xe3, 0xf4, 0xb6, 0x0f, 0xbf, 0x6e, 0xf4, \n  0x0c, 0xfa, 0xfc, 0x6f, 0xad, 0x0d, 0x69, 0x69, 0xfd, 0x34, 0xc2, 0x00, 0x6e, 0x24, 0xff, 0x17, \n  0x6c, 0xfd, 0xe0, 0xe9, 0xff, 0x8a, 0x7c, 0xff, 0x56, 0xe6, 0xf4, 0xb2, 0x03, 0xfc, 0x63, 0x02, \n  0xf8, 0xa7, 0xc2, 0xf5, 0x48, 0x14, 0xfa, 0x9a, 0x63, 0xfe, 0x52, 0xc6, 0x00, 0x2b, 0xe2, 0xfa, \n  0x90, 0x98, 0xfa, 0x94, 0x9b, 0xfc, 0x8c, 0x16, 0x5f, 0xd0, 0x7f, 0x40, 0x02, 0xfb, 0xd8, 0xeb, \n  0xb5, 0x1b, 0xcb, 0x55, 0x09, 0xf1, 0x31, 0xdf, 0xb6, 0x17, 0xeb, 0x30, 0x49, 0xeb, 0xbc, 0x51, \n  0xfa, 0xd0, 0x28, 0x1d, 0x5e, 0x50, 0x07, 0xab, 0x2b, 0xe2, 0xd4, 0xc3, 0x0b, 0x7d, 0x6d, 0xfb, \n  0x52, 0xa3, 0xf8, 0x61, 0x6b, 0x0b, 0x5c, 0xee, 0xfd, 0x21, 0xac, 0xfc, 0x9b, 0xcf, 0x01, 0x1b, \n  0xda, 0x02, 0x14, 0xd0, 0xfe, 0xde, 0x65, 0x01, 0x06, 0x44, 0xf6, 0xd8, 0x90, 0xfa, 0x93, 0x90, \n  0xfa, 0x92, 0x86, 0xf5, 0x63, 0xe4, 0xf7, 0xf9, 0x34, 0xfc, 0xe9, 0x1f, 0xff, 0xde, 0xc5, 0xfb, \n  0x8a, 0xe5, 0xfc, 0xc5, 0x46, 0xfc, 0x59, 0x5f, 0x60, 0x51, 0x70, 0x3c, 0xf1, 0x07, 0xd0, 0x86, \n  0x28, 0x24, 0x94, 0x48, 0x0e, 0x78, 0xc2, 0xd5, 0xca, 0x7d, 0xed, 0x0d, 0x60, 0xf5, 0xc2, 0xbe, \n  0xf4, 0x49, 0x2e, 0x13, 0x21, 0x2c, 0x11, 0xb1, 0x01, 0xe3, 0x0a, 0xbe, 0x06, 0x1f, 0x3d, 0x01, \n  0x27, 0x11, 0xf5, 0xcb, 0xcd, 0x09, 0xca, 0xc7, 0xfe, 0x28, 0x51, 0xfb, 0xad, 0x10, 0x03, 0xa1, \n  0x65, 0x04, 0x79, 0xe0, 0x00, 0xde, 0x17, 0x02, 0x28, 0xd6, 0xf6, 0x0f, 0xbd, 0xfa, 0x64, 0x09, \n  0xfb, 0xee, 0x38, 0xf6, 0x8d, 0x23, 0xf8, 0xc8, 0xca, 0xf9, 0x2a, 0x17, 0xfb, 0xdd, 0x06, 0xfd, \n  0x69, 0xa2, 0xff, 0xe5, 0xaa, 0xfc, 0x61, 0xdc, 0x61, 0xaf, 0xcc, 0x34, 0x40, 0x24, 0xca, 0x06, \n  0x5d, 0x2e, 0xe8, 0xc5, 0x0e, 0x17, 0xb1, 0xcf, 0x3c, 0x37, 0xf1, 0xb0, 0x47, 0xfc, 0xdc, 0x0b, \n  0xf2, 0x9e, 0x5e, 0x09, 0x3a, 0xb3, 0x16, 0xe6, 0xa4, 0xe6, 0xcd, 0x74, 0x03, 0x64, 0x91, 0x02, \n  0x05, 0x4a, 0xf2, 0x27, 0x7a, 0x0b, 0x32, 0x8a, 0x00, 0xb5, 0xd3, 0xf8, 0x2d, 0x90, 0x05, 0x4c, \n  0x86, 0x02, 0x8a, 0x3c, 0x01, 0x3f, 0x79, 0x06, 0x8d, 0x1b, 0xf5, 0xd5, 0xb7, 0xfb, 0xed, 0xcd, \n  0xfb, 0xfe, 0xfe, 0xf4, 0xb2, 0xca, 0xfa, 0x55, 0xf7, 0xf8, 0xdf, 0xbd, 0xf6, 0xd8, 0xe9, 0xfc, \n  0xb2, 0xf3, 0x00, 0x9c, 0xc3, 0xfd, 0xb2, 0x1c, 0x62, 0xda, 0x19, 0x2b, 0x90, 0x0c, 0xc9, 0xf8, \n  0xe8, 0x37, 0xd6, 0x96, 0x0b, 0x49, 0x90, 0xcd, 0x32, 0xd1, 0xf5, 0x98, 0x41, 0x01, 0xb1, 0x13, \n  0xed, 0x91, 0x43, 0x03, 0x36, 0xc2, 0x1c, 0x0b, 0x2c, 0xe7, 0x92, 0x7a, 0xff, 0xed, 0xa7, 0x06, \n  0x65, 0x2f, 0xf1, 0x98, 0xb8, 0x08, 0xc7, 0x04, 0x06, 0xa4, 0xba, 0xf8, 0x98, 0x9c, 0x02, 0x5e, \n  0x85, 0x03, 0x4c, 0x13, 0x00, 0x3f, 0x92, 0x07, 0x9f, 0x75, 0xf8, 0x30, 0x8d, 0xf9, 0x06, 0x80, \n  0xfd, 0xea, 0x6b, 0xf5, 0xb2, 0xf8, 0xf9, 0xad, 0x01, 0xfc, 0x2f, 0x7d, 0xf4, 0x87, 0x57, 0xfa, \n  0x16, 0x0a, 0x01, 0x1e, 0x0a, 0xff, 0xc2, 0xb1, 0x5d, 0x25, 0x85, 0x23, 0x2e, 0x09, 0xce, 0x7c, \n  0xf1, 0x3b, 0xa4, 0xb9, 0x06, 0x09, 0x83, 0xd1, 0xad, 0x2c, 0xfa, 0x3f, 0xd6, 0xff, 0x04, 0xb7, \n  0xea, 0x79, 0xde, 0x01, 0x55, 0x0e, 0x1e, 0x73, 0xb9, 0xe6, 0xe6, 0x7f, 0xfd, 0xf1, 0x27, 0x0b, \n  0xed, 0x95, 0xf0, 0x96, 0xe9, 0x04, 0xc1, 0x72, 0x0a, 0x90, 0xe1, 0xf9, 0x3b, 0x16, 0x00, 0x2a, \n  0x38, 0x03, 0x41, 0x31, 0xff, 0x26, 0x83, 0x07, 0x55, 0x33, 0xfa, 0x60, 0x88, 0xf9, 0x5a, 0xd4, \n  0xfe, 0xed, 0x35, 0xf6, 0xfa, 0x0c, 0xf9, 0x6e, 0x61, 0xfd, 0x7e, 0xe8, 0xf5, 0x64, 0xa4, 0xf8, \n  0x6e, 0xc8, 0xfe, 0xd5, 0x5b, 0xff, 0x15, 0xab, 0x55, 0x76, 0x55, 0x1f, 0x8e, 0xe1, 0xd5, 0xc8, \n  0x46, 0x3a, 0xa3, 0x56, 0x05, 0x7b, 0x8e, 0xd7, 0xb7, 0x13, 0xfa, 0x9f, 0xeb, 0xff, 0xf3, 0xd1, \n  0xeb, 0x2d, 0xc5, 0xfd, 0x65, 0x99, 0x1d, 0x51, 0x7b, 0xea, 0xa4, 0x98, 0xfa, 0x3d, 0x8e, 0x0c, \n  0xbd, 0x03, 0xf4, 0xbe, 0xcc, 0x01, 0x87, 0x31, 0x0a, 0x87, 0xc2, 0xfb, 0x09, 0x12, 0x01, 0x13, \n  0x50, 0x01, 0xe7, 0xd3, 0xfd, 0xaf, 0x79, 0x08, 0xc0, 0x31, 0xf9, 0x5b, 0xa6, 0xfa, 0x80, 0x09, \n  0x01, 0x6d, 0x3b, 0xf6, 0x70, 0xa3, 0xf9, 0x23, 0xce, 0xfd, 0x8f, 0x30, 0xf7, 0xde, 0x56, 0xf9, \n  0x41, 0x53, 0xfd, 0x89, 0xde, 0xfd, 0x34, 0xe6, 0x4b, 0x26, 0x43, 0x1e, 0xb4, 0x9d, 0xdc, 0xe9, \n  0x27, 0x36, 0x93, 0x91, 0x07, 0x73, 0x9e, 0xda, 0x14, 0x25, 0xfa, 0x8a, 0x38, 0x02, 0x68, 0xf6, \n  0xeb, 0x8f, 0xea, 0xf9, 0x61, 0xff, 0x1c, 0xa0, 0x0d, 0xef, 0xf6, 0x61, 0xf7, 0xf1, 0x7f, 0x0d, \n  0xa9, 0xb5, 0xf7, 0x47, 0x78, 0xfe, 0x47, 0xd0, 0x09, 0xea, 0x84, 0xfd, 0xf3, 0x8e, 0x00, 0xbe, \n  0xe0, 0x01, 0x8f, 0x0a, 0xfd, 0xa8, 0x64, 0x06, 0x60, 0x2a, 0xfb, 0xfb, 0xc9, 0xf9, 0x6c, 0x74, \n  0x01, 0x65, 0x07, 0xf9, 0xb1, 0x68, 0xf9, 0xbc, 0xa1, 0xfe, 0xf6, 0xf1, 0xf7, 0x11, 0x07, 0xfa, \n  0x81, 0xd8, 0xfd, 0x53, 0x0e, 0xfd, 0x79, 0x81, 0x3d, 0xb0, 0x0e, 0x17, 0x6e, 0xcf, 0xea, 0x6f, \n  0xe4, 0x36, 0xc0, 0x3f, 0x04, 0x0d, 0x2c, 0xdc, 0x51, 0xf6, 0xff, 0xaf, 0x9e, 0x01, 0x72, 0x85, \n  0xf1, 0x49, 0x13, 0x00, 0x4b, 0x56, 0x09, 0xb7, 0xe9, 0xf1, 0xed, 0xa4, 0x06, 0x3e, 0x78, 0x08, \n  0x79, 0x3e, 0xf6, 0xfb, 0x7d, 0xfe, 0x59, 0x9f, 0x04, 0xe4, 0x86, 0xfd, 0x22, 0x73, 0xfc, 0x8a, \n  0xe2, 0x00, 0x38, 0x44, 0xff, 0xcd, 0x0c, 0x00, 0x81, 0x16, 0xfe, 0xc6, 0xe3, 0x02, 0xc9, 0x3b, \n  0x03, 0xa9, 0xaa, 0x00, 0xcc, 0x1a, 0x01, 0x8d, 0x43, 0xfe, 0xb4, 0xe8, 0xfb, 0x9c, 0x41, 0xfe, \n  0x92, 0x87, 0xfc, 0xe5, 0x3c, 0xfa, 0x82, 0x81, 0x34, 0x04, 0xc7, 0x16, 0x36, 0x7d, 0xf0, 0x95, \n  0x1f, 0x2f, 0x3e, 0xff, 0x05, 0x0a, 0x05, 0xe3, 0x77, 0x2b, 0xff, 0x8b, 0x4e, 0x00, 0x6a, 0x6e, \n  0xf3, 0xf3, 0x19, 0x00, 0x4e, 0xa1, 0x08, 0x21, 0x84, 0xf4, 0x0b, 0xa9, 0x04, 0x59, 0x7f, 0x07, \n  0x8d, 0x4c, 0xf8, 0x7c, 0x6f, 0xfd, 0xe4, 0x2c, 0x03, 0xf6, 0x55, 0xfe, 0xf6, 0xe5, 0xfc, 0x67, \n  0xef, 0xff, 0xc7, 0x94, 0xff, 0xc6, 0x4e, 0x01, 0x9c, 0x86, 0xfe, 0x13, 0x66, 0x01, 0x6b, 0x3d, \n  0x03, 0x15, 0xc9, 0x00, 0xc9, 0xf7, 0xff, 0xbc, 0x67, 0xfe, 0x39, 0xba, 0xfc, 0xc9, 0xd4, 0xfd, \n  0x3f, 0x26, 0xfd, 0x9d, 0x38, 0xfc, 0xe1, 0x16, 0x2d, 0xfa, 0xa5, 0x16, 0xf1, 0xca, 0xf4, 0x97, \n  0x3f, 0x28, 0xf6, 0x5e, 0x08, 0xc5, 0x43, 0xe8, 0xc5, 0x23, 0xfe, 0x48, 0x43, 0x00, 0x27, 0x67, \n  0xf5, 0xa9, 0xcf, 0xff, 0x5a, 0x26, 0x08, 0xe7, 0x31, 0xf7, 0xb1, 0x7a, 0x02, 0xe3, 0xed, 0x06, \n  0x7a, 0x92, 0xfa, 0x1a, 0x71, 0xfc, 0xd6, 0x91, 0x02, 0x8c, 0x0a, 0xff, 0x60, 0x49, 0xfd, 0x93, \n  0xe5, 0xff, 0x80, 0x20, 0x00, 0x01, 0x97, 0x01, 0x48, 0xa8, 0xfe, 0x4f, 0x67, 0x01, 0x4a, 0x41, \n  0x02, 0x9e, 0x29, 0x00, 0x25, 0xa9, 0x00, 0xc9, 0x0a, 0xff, 0xc2, 0xe3, 0xfc, 0x60, 0xdf, 0xfd, \n  0xa4, 0xec, 0xfd, 0x63, 0x67, 0xfd, 0x06, 0x04, 0x27, 0x1c, 0x19, 0x16, 0xbd, 0x66, 0xf7, 0x1b, \n  0xf9, 0x22, 0x3c, 0xea, 0x09, 0xfd, 0x47, 0xec, 0x52, 0x26, 0xfe, 0xa8, 0x6a, 0x00, 0x08, 0x34, \n  0xf7, 0x43, 0x9a, 0xff, 0x06, 0xd0, 0x07, 0x32, 0xb8, 0xf8, 0x51, 0xf2, 0x00, 0xbd, 0xa6, 0x06, \n  0x5b, 0x86, 0xfb, 0xa3, 0x38, 0xfc, 0x43, 0x3c, 0x02, 0xd0, 0xad, 0xff, 0xf4, 0xa0, 0xfd, 0x8f, \n  0x19, 0x00, 0xef, 0xda, 0x00, 0xdf, 0xea, 0x00, 0xd3, 0x0d, 0xff, 0xb0, 0x39, 0x01, 0x75, 0x32, \n  0x01, 0x7b, 0x37, 0x00, 0xdb, 0x3d, 0x01, 0xcb, 0xbc, 0xff, 0x4f, 0x2e, 0xfd, 0x74, 0x4e, 0xfe, \n  0xf6, 0x66, 0xfe, 0xc5, 0xa4, 0xfd, 0x6a, 0x4c, 0x22, 0x01, 0xa1, 0x14, 0xac, 0x69, 0xf9, 0x85, \n  0xf1, 0x1e, 0x09, 0x2e, 0x0a, 0xc0, 0x39, 0xf0, 0x53, 0x3a, 0xfe, 0xba, 0xc1, 0x00, 0x6c, 0xf7, \n  0xf8, 0x38, 0x3d, 0xff, 0xc3, 0x4f, 0x07, 0x5e, 0xb8, 0xf9, 0x3c, 0x17, 0x00, 0x1d, 0xdf, 0x05, \n  0xd2, 0x51, 0xfc, 0x68, 0x58, 0xfc, 0x94, 0x2d, 0x02, 0x8f, 0x1e, 0x00, 0x19, 0xf3, 0xfd, 0xbb, \n  0xc8, 0x00, 0x86, 0x8b, 0x00, 0x59, 0x77, 0x00, 0x47, 0x7f, 0xff, 0x85, 0x92, 0x00, 0xfb, 0x44, \n  0x01, 0xd6, 0x8e, 0x00, 0x65, 0x43, 0x01, 0xae, 0x4f, 0x00, 0x7a, 0xcf, 0xfd, 0x5f, 0x7c, 0xfe, \n  0xcb, 0xa9, 0xfe, 0x0a, 0xde, 0xfd, 0xa0, 0x31, 0x1e, 0x2c, 0x23, 0x13, 0x47, 0x65, 0xfb, 0xb4, \n  0xd1, 0x1a, 0x57, 0x6c, 0x0a, 0x75, 0x1c, 0xf4, 0x8d, 0x60, 0xfe, 0x36, 0x5b, 0x01, 0x80, 0x17, \n  0xfa, 0x03, 0x55, 0xff, 0x13, 0xa3, 0x06, 0xaa, 0x46, 0xfa, 0x14, 0xbd, 0xff, 0xd6, 0x4c, 0x05, \n  0xf3, 0xf2, 0xfc, 0x3d, 0x9c, 0xfc, 0xb9, 0x75, 0x02, 0x5b, 0x6e, 0x00, 0xa7, 0xce, 0xfe, 0xc1, \n  0x98, 0x00, 0x48, 0x16, 0x00, 0x84, 0xea, 0x00, 0x79, 0x80, 0xff, 0x15, 0xb4, 0x00, 0x7b, 0x87, \n  0x01, 0xfe, 0xd7, 0x00, 0x8b, 0x50, 0x01, 0x3c, 0x5f, 0x00, 0xed, 0x71, 0xfe, 0xf6, 0xe8, 0xfe, \n  0xe0, 0xf6, 0xfe, 0xc1, 0x2f, 0xfe, 0xd4, 0x19, 0x1a, 0x0d, 0x41, 0x11, 0xde, 0x25, 0xfd, 0xe1, \n  0xe6, 0x17, 0xc3, 0x2c, 0x0b, 0x1f, 0x03, 0xf7, 0x8d, 0x76, 0xfe, 0xcb, 0xcf, 0x01, 0xeb, 0x58, \n  0xfb, 0xeb, 0x4c, 0xff, 0xc0, 0x75, 0x05, 0x58, 0x1d, 0xfb, 0xc0, 0xb2, 0xff, 0xa0, 0x7c, 0x04, \n  0xcd, 0x6b, 0xfd, 0x1a, 0xce, 0xfd, 0x52, 0x6f, 0x02, 0xd5, 0x63, 0x00, 0xaf, 0x5d, 0xff, 0x2e, \n  0x60, 0x00, 0x7c, 0xa4, 0x00, 0x9b, 0x34, 0x01, 0x3f, 0x8c, 0xff, 0xf7, 0xdd, 0x00, 0x63, 0xc4, \n  0x01, 0xb2, 0xea, 0x00, 0xd4, 0x52, 0x01, 0x38, 0x7e, 0x00, 0x7d, 0xeb, 0xfe, 0xe9, 0xa9, 0xff, \n  0x05, 0xe4, 0xfe, 0x6d, 0x73, 0xfd, 0x56, 0x38, 0x16, 0x4d, 0x1d, 0x10, 0xf3, 0x8e, 0xfe, 0xcd, \n  0xd6, 0x14, 0xb8, 0x9c, 0x0b, 0xd5, 0xbf, 0xf9, 0x00, 0xcc, 0xfe, 0xda, 0x20, 0x02, 0x79, 0x36, \n  0xfc, 0xac, 0xeb, 0xfe, 0x00, 0xbe, 0x04, 0x47, 0x03, 0xfc, 0x2f, 0x81, 0xff, 0x14, 0xc6, 0x03, \n  0xfd, 0x7a, 0xfe, 0xf8, 0x59, 0xfe, 0x74, 0xf1, 0x01, 0xbe, 0x24, 0x01, 0x1e, 0xbb, 0xff, 0xe5, \n  0xc7, 0x00, 0x0b, 0x14, 0x01, 0x6e, 0xf2, 0x00, 0x56, 0x00, 0x00, 0x5b, 0x00, 0x01, 0x5c, 0xbe, \n  0x01, 0x85, 0xf4, 0x00, 0x32, 0x3b, 0x01, 0x33, 0xe1, 0x00, 0x2a, 0x3b, 0xff, 0x68, 0xdf, 0xfe, \n  0xd3, 0xe6, 0xfd, 0x10, 0x0e, 0xfd, 0xbb, 0x18, 0x13, 0x21, 0xd8, 0x0e, 0xcf, 0xb1, 0xff, 0x02, \n  0x78, 0x12, 0x56, 0xca, 0x0b, 0x95, 0x15, 0xfc, 0x52, 0x51, 0xff, 0x52, 0x3b, 0x02, 0x07, 0xd6, \n  0xfc, 0xc4, 0xd1, 0xfe, 0xcb, 0x33, 0x04, 0xb9, 0x26, 0xfd, 0x55, 0x66, 0xff, 0x5c, 0xfc, 0x02, \n  0x0d, 0x6f, 0xff, 0x1a, 0x0a, 0xff, 0xd1, 0x49, 0x02, 0xc0, 0xf1, 0x01, 0x64, 0x46, 0x00, 0x62, \n  0x25, 0x01, 0x68, 0x1b, 0x01, 0xab, 0x19, 0x01, 0xf7, 0x6e, 0x00, 0x16, 0x2d, 0x01, 0xa5, 0xa3, \n  0x01, 0x53, 0x2d, 0x01, 0x75, 0x3b, 0x01, 0xd7, 0xd7, 0xff, 0x84, 0x67, 0xfe, 0xf8, 0x51, 0xfe, \n  0x2f, 0xe0, 0xfd, 0xcb, 0x45, 0xfd, 0xef, 0x7f, 0x10, 0x0c, 0xb2, 0x0d, 0xad, 0xd7, 0x00, 0x34, \n  0x86, 0x10, 0x41, 0x53, 0x0b, 0x96, 0x95, 0xfd, 0x18, 0x4a, 0x00, 0xc7, 0x3c, 0x02, 0x82, 0xd7, \n  0xfc, 0x8a, 0x2c, 0xff, 0xb8, 0x4b, 0x04, 0xc8, 0x5e, 0xfd, 0xe2, 0x92, 0xfe, 0xd1, 0x68, 0x03, \n  0x87, 0xc9, 0x00, 0x91, 0xd2, 0xff, 0x46, 0xff, 0x02, 0x20, 0x08, 0x02, 0x27, 0x8d, 0x00, 0x73, \n  0xa2, 0x01, 0xe3, 0x2a, 0x01, 0x3a, 0x46, 0x01, 0xda, 0xb2, 0x00, 0xc2, 0x29, 0x01, 0x14, 0x0e, \n  0x01, 0xf8, 0x11, 0x00, 0x7c, 0x2a, 0x00, 0x4c, 0x29, 0xff, 0x2d, 0x50, 0xfe, 0x9c, 0x28, 0xfe, \n  0x38, 0x78, 0xfd, 0xae, 0xfb, 0xfc, 0x9c, 0x5f, 0x0f, 0xdb, 0xa1, 0x0d, 0x16, 0x50, 0x01, 0xc6, \n  0xfe, 0x0d, 0x51, 0x5b, 0x0a, 0xce, 0xae, 0xfe, 0x72, 0x1a, 0x01, 0x85, 0x75, 0x02, 0x11, 0xef, \n  0xfc, 0x11, 0x05, 0xff, 0xc0, 0xe2, 0x03, 0xba, 0x1a, 0xfe, 0x3d, 0x1c, 0xff, 0x92, 0xa2, 0x04, \n  0x9b, 0x03, 0x02, 0xde, 0xf7, 0xff, 0x30, 0x42, 0x03, 0x55, 0xaa, 0x02, 0x42, 0x61, 0x01, 0x40, \n  0x74, 0x01, 0x0e, 0x00, 0x01, 0xb4, 0x64, 0x01, 0x2d, 0x1a, 0x00, 0x19, 0x8d, 0xff, 0x90, 0xcb, \n  0xff, 0x92, 0xf2, 0xff, 0xdb, 0xce, 0xff, 0x24, 0xed, 0xfe, 0xb0, 0x87, 0xfd, 0xfe, 0x60, 0xfd, \n  0xd2, 0xcf, 0xfd, 0xdc, 0x58, 0xfd, 0x5e, 0x57, 0x0d, 0x2d, 0xe2, 0x0b, 0xc8, 0x3c, 0x02, 0x86, \n  0xfc, 0x0d, 0xc7, 0xca, 0x09, 0xda, 0x7b, 0xff, 0xe7, 0xfc, 0x01, 0x39, 0xc4, 0x01, 0x8c, 0xca, \n  0xfc, 0x27, 0xd2, 0xff, 0x1d, 0x48, 0x04, 0x39, 0x2a, 0xff, 0xde, 0x3c, 0x00, 0xdd, 0xb9, 0x04, \n  0xaa, 0x65, 0x02, 0x49, 0xa3, 0x01, 0x60, 0x02, 0x04, 0xac, 0x96, 0x02, 0x66, 0x0c, 0x01, 0x18, \n  0x0c, 0x01, 0x26, 0x9b, 0x00, 0x18, 0xb2, 0xff, 0xf9, 0xc3, 0xfe, 0xe6, 0x17, 0xff, 0x02, 0xce, \n  0xff, 0x07, 0xf1, 0xff, 0xde, 0xf0, 0xfe, 0x3a, 0x3d, 0xfe, 0x6b, 0x87, 0xfd, 0x2e, 0x04, 0xfe, \n  0xf9, 0x15, 0xfe, 0x5b, 0x55, 0xfd, 0x96, 0x6c, 0x0c, 0x8a, 0xb9, 0x0b, 0x89, 0xcd, 0x02, 0x18, \n  0xd0, 0x0c, 0x52, 0x30, 0x09, 0xea, 0xbc, 0xff, 0x62, 0x58, 0x01, 0x3e, 0x40, 0x02, 0x23, 0xbc, \n  0xfe, 0x50, 0x6b, 0x00, 0xbd, 0x71, 0x04, 0xb1, 0x1a, 0x00, 0xad, 0x65, 0x01, 0x91, 0x07, 0x06, \n  0x95, 0xd8, 0x03, 0xdb, 0xea, 0x01, 0x96, 0x49, 0x03, 0x30, 0x09, 0x02, 0x50, 0xea, 0xff, 0xcb, \n  0x76, 0xff, 0x8e, 0x05, 0xff, 0x7b, 0x6f, 0xff, 0xd1, 0xc5, 0xfe, 0x80, 0xe9, 0xfe, 0xac, 0xc1, \n  0xff, 0x34, 0x11, 0xff, 0x34, 0xaf, 0xfe, 0xf9, 0x83, 0xfe, 0x53, 0x02, 0xfe, 0x61, 0x37, 0xfe, \n  0x3a, 0x0f, 0xfe, 0xc9, 0x8f, 0xfd, 0x34, 0xa5, 0x0a, 0x33, 0xda, 0x0a, 0x0b, 0x31, 0x04, 0xb1, \n  0xa8, 0x0b, 0x5d, 0xd3, 0x07, 0xb2, 0x86, 0x01, 0xdf, 0x69, 0x02, 0x12, 0xbc, 0x02, 0x4b, 0x10, \n  0x00, 0x50, 0x65, 0x00, 0x14, 0xcf, 0x04, 0xd3, 0x6a, 0x02, 0x5a, 0x04, 0x03, 0xe1, 0xd2, 0x05, \n  0xcc, 0x72, 0x03, 0x05, 0x82, 0x01, 0x5d, 0xc3, 0x01, 0x27, 0xb2, 0xff, 0xbe, 0x72, 0xfe, 0xb1, \n  0x67, 0xff, 0xa3, 0x04, 0xff, 0x36, 0xdb, 0xfe, 0x1c, 0x23, 0xfe, 0x86, 0xb0, 0xfe, 0x75, 0xc5, \n  0xff, 0xa8, 0x36, 0xff, 0x3d, 0xc5, 0xfe, 0x1e, 0x56, 0xfe, 0x7c, 0x1a, 0xfe, 0x83, 0x59, 0xfe, \n  0xdb, 0xdf, 0xfd, 0x61, 0xbb, 0xfd, 0xf0, 0xbd, 0x09, 0xc9, 0xff, 0x09, 0xf0, 0x14, 0x04, 0x76, \n  0xf8, 0x0a, 0x52, 0x42, 0x09, 0x91, 0x68, 0x03, 0xfd, 0x63, 0x02, 0x68, 0x1b, 0x03, 0xcb, 0xee, \n  0x01, 0x29, 0x1d, 0x02, 0x54, 0x1c, 0x05, 0x4e, 0xc1, 0x03, 0x30, 0x8b, 0x03, 0xf0, 0x4c, 0x04, \n  0x23, 0xce, 0x01, 0xa1, 0x5f, 0xff, 0x44, 0xe8, 0xff, 0x40, 0xa0, 0xff, 0xf9, 0x09, 0xff, 0x2e, \n  0x94, 0xfe, 0x85, 0xdf, 0xfd, 0x83, 0x89, 0xfe, 0x63, 0xfa, 0xfe, 0xd7, 0x92, 0xff, 0xf7, 0x5f, \n  0xff, 0xf6, 0xa0, 0xfe, 0x97, 0xaa, 0xfe, 0x72, 0xd0, 0xfe, 0xb3, 0x4c, 0xfe, 0xf0, 0xe2, 0xfd, \n  0x55, 0x10, 0xfe, 0xcd, 0x58, 0xfe, 0x67, 0xc7, 0x08, 0x83, 0x74, 0x0b, 0x21, 0x70, 0x06, 0x5f, \n  0xcb, 0x09, 0xe1, 0xf9, 0x08, 0x5d, 0x24, 0x04, 0x45, 0xe7, 0x03, 0xfb, 0x2f, 0x05, 0xc6, 0xa9, \n  0x02, 0x71, 0xd6, 0x02, 0x69, 0x2d, 0x05, 0x22, 0x06, 0x02, 0x35, 0x59, 0x01, 0xf0, 0x7c, 0x02, \n  0x2f, 0x2e, 0x00, 0xd6, 0xbe, 0xfe, 0xa9, 0x64, 0xff, 0x43, 0xed, 0xfe, 0x1f, 0x26, 0xfe, 0x55, \n  0x54, 0xfe, 0xc9, 0x6f, 0xfe, 0xb7, 0xd8, 0xfe, 0x15, 0x3b, 0xff, 0xbd, 0x6b, 0xff, 0x23, 0x00, \n  0xff, 0x5e, 0x72, 0xfe, 0xe0, 0xa3, 0xfe, 0x41, 0x78, 0xfe, 0xfa, 0x4d, 0xfe, 0x43, 0x4d, 0xfe, \n  0x34, 0x55, 0xfe, 0x43, 0x81, 0xfe, 0x91, 0xef, 0x07, 0x84, 0xdb, 0x0b, 0xda, 0x79, 0x07, 0xcc, \n  0x12, 0x0a, 0xb0, 0xf8, 0x0b, 0x8f, 0x70, 0x07, 0xe3, 0xdd, 0x03, 0x43, 0x69, 0x04, 0x4e, 0x08, \n  0x03, 0xfa, 0x7d, 0x01, 0xca, 0x2a, 0x02, 0x17, 0x8e, 0x00, 0xb9, 0x85, 0x00, 0x37, 0xb5, 0x01, \n  0x18, 0xf4, 0xff, 0x2c, 0x42, 0xfe, 0xfc, 0x9b, 0xfe, 0xa6, 0x75, 0xfe, 0x84, 0x16, 0xfe, 0xfd, \n  0x9d, 0xfe, 0x13, 0xc0, 0xfe, 0x70, 0x0e, 0xff, 0x34, 0x19, 0xff, 0xa4, 0xd1, 0xfe, 0x5a, 0xa5, \n  0xfe, 0xf2, 0xa3, 0xfe, 0x83, 0xd3, 0xfe, 0x1b, 0x96, 0xfe, 0xec, 0x43, 0xfe, 0x7d, 0x2f, 0xfe, \n  0xa7, 0x89, 0xfe, 0x1d, 0xd2, 0xfe, 0x73, 0xd0, 0x08, 0x9c, 0x25, 0x0e, 0x97, 0xe7, 0x09, 0x2d, \n  0xba, 0x0b, 0x93, 0x1b, 0x0b, 0xe5, 0x9f, 0x06, 0x75, 0x5a, 0x05, 0x26, 0x1f, 0x04, 0x6a, 0x39, \n  0x00, 0x7a, 0xbd, 0xfe, 0x31, 0xb8, 0x01, 0x49, 0x3d, 0x01, 0x48, 0x40, 0xff, 0xb4, 0xa6, 0x00, \n  0x7c, 0xf3, 0xff, 0x54, 0x4a, 0xfd, 0x5d, 0xa6, 0xfe, 0xb5, 0x6a, 0xff, 0x4e, 0x23, 0xfe, 0x0c, \n  0x89, 0xfe, 0x1e, 0xea, 0xfe, 0xc0, 0xd6, 0xfe, 0xce, 0x1b, 0xff, 0xbc, 0xe2, 0xfe, 0x6d, 0x8d, \n  0xfe, 0x1a, 0xb5, 0xfe, 0x3b, 0x99, 0xfe, 0xfa, 0xb0, 0xfe, 0x98, 0xab, 0xfe, 0x99, 0x5b, 0xfe, \n  0x6e, 0x98, 0xfe, 0x05, 0xd5, 0xfe, 0x70, 0x7b, 0x0a, 0xe4, 0x33, 0x12, 0x20, 0x3e, 0x0c, 0x42, \n  0x6b, 0x09, 0xc9, 0x86, 0x08, 0x04, 0xbd, 0x05, 0x18, 0x39, 0x04, 0xe6, 0xf6, 0x02, 0xa2, 0xcf, \n  0x00, 0xff, 0x43, 0x00, 0x4d, 0x65, 0x00, 0x55, 0x02, 0xff, 0x28, 0xa7, 0xff, 0xd4, 0x45, 0x00, \n  0xfe, 0xf5, 0xfe, 0xbe, 0x47, 0xfe, 0x51, 0xe4, 0xfe, 0x7a, 0xbb, 0xfe, 0x47, 0x9a, 0xfe, 0x75, \n  0xf4, 0xfe, 0x59, 0x90, 0xfe, 0xbe, 0xe6, 0xfe, 0x71, 0xcd, 0xfe, 0xb9, 0xb3, 0xfe, 0x12, 0xbe, \n  0xfe, 0xc2, 0xa1, 0xfe, 0xba, 0xa1, 0xfe, 0xe1, 0x9b, 0xfe, 0x7c, 0xaf, 0xfe, 0xbb, 0x96, 0xfe, \n  0x1e, 0xe1, 0xfe, 0xde, 0xc8, 0xfe, 0x25, 0x8a, 0x0b, 0x49, 0x5b, 0x12, 0x1e, 0x17, 0x0b, 0xda, \n  0xc9, 0x07, 0xfd, 0x9f, 0x06, 0x3b, 0x81, 0x05, 0x3a, 0x97, 0x05, 0x1f, 0x65, 0x03, 0x19, 0x14, \n  0x01, 0xe3, 0x8b, 0x02, 0xf0, 0x14, 0x01, 0x9e, 0xa4, 0xfe, 0xea, 0x9f, 0xfe, 0x31, 0x47, 0xff, \n  0x97, 0x81, 0x00, 0x93, 0x3d, 0xff, 0x2d, 0xa3, 0xfd, 0xe1, 0xc9, 0xfe, 0xea, 0xc0, 0xff, 0x25, \n  0xcb, 0xfe, 0x79, 0xcc, 0xfe, 0x57, 0xe0, 0xfe, 0x7b, 0x7b, 0xfe, 0xcf, 0xda, 0xfe, 0x61, 0x9d, \n  0xfe, 0x05, 0xbd, 0xfe, 0x05, 0xd4, 0xfe, 0xe0, 0xc9, 0xfe, 0x0d, 0xcc, 0xfe, 0xfd, 0xc3, 0xfe, \n  0x78, 0xfd, 0xfe, 0xb8, 0xfa, 0xfe, 0x6c, 0x69, 0x0a, 0x23, 0x6b, 0x10, 0x9a, 0x8f, 0x09, 0xe4, \n  0x7c, 0x06, 0x60, 0x42, 0x06, 0x0f, 0xac, 0x04, 0xf0, 0x7d, 0x04, 0x54, 0x71, 0x05, 0x72, 0x43, \n  0x03, 0xc1, 0xbb, 0x02, 0xcd, 0x9a, 0x03, 0xcc, 0x4c, 0x00, 0x3d, 0xf7, 0xfe, 0x5c, 0xf2, 0xff, \n  0xb0, 0x50, 0xff, 0x37, 0x9c, 0xfe, 0x3f, 0x6c, 0xff, 0x86, 0x73, 0xff, 0x0a, 0x8d, 0xfe, 0x86, \n  0x40, 0xff, 0x71, 0x6d, 0xff, 0x66, 0x6b, 0xfe, 0x49, 0x3b, 0xfe, 0xe4, 0xc6, 0xfe, 0xe1, 0xc2, \n  0xfe, 0x2b, 0xd5, 0xfe, 0x43, 0x01, 0xff, 0x66, 0x08, 0xff, 0x28, 0x17, 0xff, 0x71, 0xe0, 0xfe, \n  0x01, 0xe8, 0xfe, 0x8f, 0xe9, 0xfe, 0x52, 0x5f, 0x09, 0xa6, 0x81, 0x0d, 0x1d, 0xd8, 0x07, 0xb2, \n  0xc1, 0x06, 0xca, 0x50, 0x05, 0xd2, 0xda, 0x03, 0x5e, 0x05, 0x04, 0xc5, 0x9d, 0x02, 0x47, 0xa8, \n  0x02, 0x4b, 0xb9, 0x05, 0xe9, 0x2d, 0x05, 0x6b, 0x3b, 0x03, 0x8a, 0x27, 0x02, 0x01, 0x41, 0x00, \n  0xdc, 0x75, 0x00, 0xbc, 0x6c, 0xff, 0x63, 0x05, 0xfe, 0xf7, 0xf9, 0xfe, 0x97, 0xd0, 0xff, 0x02, \n  0x01, 0xff, 0x48, 0x10, 0xfe, 0x3f, 0xc4, 0xfe, 0x0f, 0x0d, 0xff, 0x6a, 0x86, 0xfe, 0x39, 0xbe, \n  0xfe, 0x8d, 0x28, 0xff, 0x3d, 0x38, 0xff, 0xd7, 0x3f, 0xff, 0x6d, 0xdd, 0xfe, 0xaa, 0xb9, 0xfe, \n  0xc0, 0xa9, 0xfe, 0x93, 0xe1, 0xfe, 0x9d, 0xc8, 0x07, 0x1f, 0xd9, 0x09, 0x15, 0xe7, 0x04, 0x97, \n  0xa8, 0x06, 0xfc, 0xef, 0x06, 0x6e, 0x5b, 0x05, 0x93, 0xe2, 0x01, 0x4e, 0x62, 0xff, 0xfe, 0x9d, \n  0x02, 0x0e, 0xd7, 0x04, 0x10, 0x5e, 0x04, 0xd3, 0xa1, 0x05, 0x53, 0x82, 0x05, 0x1c, 0x73, 0x04, \n  0x7d, 0xbc, 0x03, 0x08, 0x66, 0x00, 0xd1, 0x65, 0xff, 0x71, 0x90, 0xff, 0xd1, 0x25, 0xfe, 0x19, \n  0x7c, 0xfe, 0x59, 0x7a, 0xff, 0x54, 0xdb, 0xfe, 0xa7, 0x5c, 0xfe, 0xd8, 0x19, 0xff, 0x5e, 0x6a, \n  0xff, 0x03, 0x29, 0xff, 0xe3, 0xe6, 0xfe, 0xf1, 0x70, 0xff, 0xdc, 0x4a, 0xff, 0x32, 0xcb, 0xfe, \n  0x45, 0xc5, 0xfe, 0x33, 0xc9, 0xfe, 0x25, 0xe9, 0x08, 0x24, 0x22, 0x0b, 0x5c, 0x5f, 0x03, 0xe4, \n  0x41, 0x04, 0x56, 0xf8, 0x05, 0x4b, 0xde, 0x04, 0xed, 0xbb, 0x01, 0xb3, 0x55, 0xff, 0xaf, 0xe8, \n  0x01, 0xbb, 0xbb, 0x03, 0x09, 0x76, 0x02, 0xc2, 0x12, 0x03, 0x37, 0xf7, 0x04, 0xae, 0x37, 0x06, \n  0x70, 0x21, 0x06, 0xc5, 0x27, 0x03, 0x8f, 0xa8, 0x01, 0xde, 0xda, 0x00, 0xe7, 0x68, 0xff, 0x0e, \n  0xc7, 0xfe, 0xad, 0xfc, 0xfd, 0x38, 0xbe, 0xfe, 0xee, 0x93, 0xff, 0xc7, 0xe2, 0xfe, 0xb7, 0x8c, \n  0xfe, 0xca, 0x90, 0xff, 0x58, 0xb4, 0xff, 0xeb, 0x18, 0xff, 0xec, 0xd0, 0xfe, 0x5b, 0xa2, 0xfe, \n  0xd3, 0x08, 0xff, 0x77, 0xf4, 0xfe, 0x6d, 0xb3, 0x09, 0xba, 0x14, 0x0c, 0x34, 0x1f, 0x04, 0x19, \n  0xb8, 0x04, 0x93, 0xf2, 0x05, 0xcb, 0x9c, 0x04, 0x87, 0x9d, 0x00, 0xd3, 0x5c, 0xfe, 0x8b, 0x0a, \n  0x03, 0xe1, 0x3d, 0x04, 0x33, 0x25, 0x00, 0x38, 0xee, 0x00, 0x11, 0x62, 0x02, 0xf7, 0x24, 0x03, \n  0x92, 0x2d, 0x05, 0xd0, 0x11, 0x04, 0x27, 0x88, 0x03, 0xc3, 0xc1, 0x03, 0x86, 0x6d, 0x01, 0x8a, \n  0x9c, 0xff, 0x2a, 0x37, 0xff, 0x14, 0x82, 0xfe, 0xf6, 0x4c, 0xfe, 0xcd, 0xd5, 0xfe, 0xd6, 0x48, \n  0xff, 0x64, 0x39, 0xff, 0xf6, 0xcc, 0xfe, 0x44, 0x76, 0xff, 0xa5, 0x79, 0xff, 0xd0, 0x5b, 0xfe, \n  0x2b, 0xa9, 0xfe, 0x45, 0x3e, 0xff, 0xca, 0x31, 0x0b, 0x1f, 0x75, 0x0d, 0x42, 0xbd, 0x03, 0xd1, \n  0x7e, 0x05, 0xee, 0x66, 0x07, 0x12, 0x5f, 0x04, 0x30, 0x23, 0xff, 0x0b, 0x5d, 0xfd, 0x6b, 0xea, \n  0x03, 0x2e, 0x22, 0x04, 0xfc, 0x37, 0xff, 0x4a, 0x9a, 0x00, 0x29, 0x48, 0x01, 0x4e, 0xb7, 0x01, \n  0xe6, 0x6e, 0x02, 0xcc, 0xfe, 0x00, 0xb2, 0xcf, 0x02, 0x98, 0x55, 0x04, 0x86, 0xb5, 0x02, 0x8c, \n  0x39, 0x02, 0x16, 0xfb, 0x00, 0x09, 0x0f, 0xff, 0x3c, 0x6f, 0xff, 0xf2, 0xc2, 0xfe, 0x54, 0x49, \n  0xfe, 0xb2, 0x66, 0xff, 0xae, 0x7a, 0xff, 0xe0, 0xfd, 0xfe, 0x3f, 0x8f, 0xfe, 0x50, 0xe4, 0xfe, \n  0xdf, 0x0e, 0xff, 0xd0, 0xcd, 0xfe, 0x2b, 0x98, 0x0c, 0x42, 0xcf, 0x0f, 0x45, 0x28, 0x04, 0xbc, \n  0x2d, 0x05, 0x7e, 0xb3, 0x07, 0xe6, 0x62, 0x04, 0xc7, 0x0b, 0xfe, 0xce, 0x2d, 0xfd, 0x61, 0xf1, \n  0x04, 0x1d, 0x39, 0x03, 0x46, 0x0b, 0xfe, 0x16, 0xc2, 0x00, 0xff, 0x04, 0x01, 0x41, 0x5b, 0x01, \n  0x87, 0x1c, 0x02, 0x67, 0x59, 0xff, 0xdf, 0x53, 0x00, 0x86, 0x5d, 0x02, 0x7e, 0x03, 0x02, 0x71, \n  0x5e, 0x02, 0x27, 0xfd, 0x01, 0xce, 0x77, 0x01, 0x88, 0xbe, 0x00, 0xb7, 0x78, 0xff, 0x55, 0x63, \n  0xff, 0xc4, 0x96, 0xff, 0x15, 0xda, 0xfe, 0xcc, 0x0d, 0xff, 0xe7, 0x0d, 0xff, 0x1d, 0x4a, 0xfe, \n  0x70, 0x7c, 0xfe, 0x3a, 0x13, 0xff, 0x88, 0x19, 0x0e, 0xf1, 0xaa, 0x11, 0xc0, 0x3e, 0x04, 0x34, \n  0xb7, 0x05, 0x40, 0xc3, 0x08, 0xaf, 0xcf, 0x03, 0x87, 0x0c, 0xfc, 0x02, 0x56, 0xfd, 0x3a, 0x39, \n  0x06, 0x19, 0x48, 0x02, 0xcf, 0x52, 0xfd, 0x17, 0x96, 0x00, 0x03, 0x89, 0x00, 0x32, 0x0d, 0x01, \n  0xc8, 0x20, 0x02, 0x34, 0x1a, 0xff, 0x3d, 0x92, 0xff, 0x0e, 0x32, 0x01, 0x4a, 0xfa, 0xff, 0x2c, \n  0x80, 0x00, 0x6f, 0x20, 0x01, 0x34, 0x7f, 0x01, 0x5a, 0xca, 0x01, 0x13, 0x4d, 0x01, 0x32, 0xbc, \n  0x00, 0x5b, 0x43, 0x00, 0xad, 0xf6, 0xff, 0xc1, 0x54, 0xff, 0xe2, 0x48, 0xfe, 0xeb, 0x3f, 0xfe, \n  0x8d, 0xc8, 0xfe, 0x97, 0x99, 0xfe, 0x52, 0x71, 0x10, 0x92, 0x5f, 0x14, 0x05, 0xee, 0x03, 0x3b, \n  0x30, 0x05, 0x7d, 0x42, 0x09, 0x33, 0x2a, 0x03, 0xb2, 0xdd, 0xfa, 0xa9, 0x28, 0xfe, 0x35, 0x78, \n  0x06, 0xa7, 0xde, 0x00, 0xca, 0xf6, 0xfc, 0x9e, 0xc1, 0x00, 0x0a, 0x38, 0x00, 0xac, 0xc0, 0x00, \n  0x43, 0xdb, 0x01, 0xf0, 0xcd, 0xfe, 0xea, 0x6c, 0xff, 0xe6, 0xdc, 0x00, 0x3d, 0x34, 0xff, 0x1f, \n  0xa2, 0xff, 0x94, 0x5a, 0xff, 0xa5, 0xcf, 0xff, 0x32, 0x11, 0x01, 0x4d, 0xf5, 0x00, 0xc3, 0xe5, \n  0x01, 0x84, 0x4a, 0x02, 0x6c, 0xc8, 0x00, 0xb1, 0xd6, 0xff, 0xe2, 0x4c, 0xff, 0xd8, 0x3a, 0xfe, \n  0x21, 0x29, 0xfe, 0x35, 0xc1, 0xfe, 0x10, 0x57, 0x12, 0x97, 0x96, 0x16, 0x1d, 0x16, 0x04, 0x6d, \n  0x69, 0x05, 0xd6, 0x16, 0x0a, 0x50, 0x42, 0x02, 0x26, 0xe9, 0xf8, 0x9d, 0x72, 0xff, 0x42, 0x8e, \n  0x07, 0xf5, 0x08, 0xff, 0xb0, 0x91, 0xfc, 0x86, 0x15, 0x01, 0x1f, 0x9a, 0xff, 0x8e, 0x9d, 0x00, \n  0xda, 0x11, 0x02, 0x06, 0x91, 0xfe, 0x1b, 0x17, 0xff, 0x15, 0xad, 0x00, 0x79, 0x06, 0xff, 0xe8, \n  0x50, 0xff, 0x66, 0xb2, 0xfe, 0x1b, 0x06, 0xff, 0xd5, 0x6e, 0xff, 0xc9, 0x82, 0xff, 0x42, 0x70, \n  0x01, 0x9c, 0x43, 0x02, 0x29, 0xf5, 0x01, 0xf5, 0x4e, 0x01, 0x29, 0xe9, 0xff, 0x7d, 0x18, 0xff, \n  0x12, 0x48, 0xff, 0xf3, 0x90, 0xfe, 0x25, 0xa4, 0x14, 0x65, 0xd4, 0x18, 0xdb, 0xa4, 0x03, 0x8a, \n  0xe6, 0x05, 0x17, 0x19, 0x0b, 0x6f, 0x78, 0x00, 0x84, 0x19, 0xf7, 0x78, 0x8f, 0x01, 0x86, 0xe9, \n  0x07, 0xc1, 0x03, 0xfd, 0xe1, 0x62, 0xfc, 0xa5, 0x41, 0x01, 0x9e, 0x74, 0xff, 0x36, 0x1b, 0x00, \n  0x6c, 0xd5, 0x01, 0xdf, 0x7f, 0xfe, 0x6e, 0xdb, 0xfe, 0x66, 0x97, 0x00, 0x27, 0xd5, 0xfe, 0xbe, \n  0xfe, 0xfe, 0xf5, 0x3c, 0xfe, 0xca, 0x81, 0xfe, 0x7d, 0xef, 0xfe, 0x62, 0xad, 0xfe, 0xa6, 0x32, \n  0x00, 0xca, 0x39, 0x01, 0x91, 0x2e, 0x01, 0xb7, 0x20, 0x01, 0xf0, 0x30, 0x01, 0x8e, 0x31, 0x00, \n  0xf8, 0xb8, 0xff, 0x3a, 0x3e, 0xff, 0xe1, 0x66, 0x16, 0x7e, 0xad, 0x1a, 0x89, 0x40, 0x04, 0xc9, \n  0x88, 0x06, 0xd9, 0xdb, 0x0b, 0x5b, 0x3e, 0xff, 0xcd, 0xe0, 0xf4, 0xc2, 0x92, 0x03, 0xfa, 0x19, \n  0x09, 0x94, 0xb7, 0xfa, 0x13, 0x07, 0xfc, 0x20, 0xbd, 0x01, 0xb2, 0x60, 0xff, 0x35, 0xbf, 0xff, \n  0xb5, 0x9a, 0x01, 0x6a, 0x89, 0xfe, 0x40, 0x62, 0xfe, 0xdc, 0xa3, 0x00, 0x97, 0x0e, 0xff, 0x34, \n  0xa3, 0xfe, 0x68, 0xe2, 0xfd, 0x59, 0x63, 0xfe, 0x48, 0x9b, 0xfe, 0x98, 0x3c, 0xfe, 0xe8, 0xc2, \n  0xff, 0xcc, 0x4f, 0x00, 0x19, 0x64, 0x00, 0xbc, 0x62, 0x00, 0x20, 0x72, 0x00, 0x21, 0x38, 0x00, \n  0x89, 0x99, 0x00, 0x42, 0x16, 0x00, 0x2f, 0x07, 0x18, 0x51, 0x0b, 0x1d, 0xe8, 0xe1, 0x04, 0x8b, \n  0xa2, 0x06, 0x64, 0x7e, 0x0c, 0xe4, 0xae, 0xfe, 0x72, 0xd5, 0xf2, 0x9c, 0x04, 0x05, 0x66, 0x26, \n  0x0a, 0xfb, 0xad, 0xf8, 0xec, 0x00, 0xfc, 0xeb, 0x2c, 0x02, 0x4a, 0x11, 0xff, 0xe5, 0x85, 0xff, \n  0x19, 0x3f, 0x01, 0x91, 0xdf, 0xfe, 0x6a, 0x4d, 0xfe, 0x45, 0x00, 0x00, 0x49, 0x38, 0xff, 0x54, \n  0x7d, 0xfe, 0x9c, 0xb8, 0xfd, 0x23, 0x8a, 0xfe, 0x05, 0x35, 0xfe, 0x06, 0xce, 0xfd, 0xb7, 0x60, \n  0xff, 0x92, 0x04, 0x00, 0x7d, 0x51, 0x00, 0xc9, 0xa7, 0xff, 0x5a, 0x71, 0xff, 0x6f, 0x56, 0xff, \n  0x06, 0x0b, 0x00, 0x08, 0x87, 0x00, 0x3a, 0xac, 0x1a, 0x50, 0x02, 0x20, 0x98, 0x81, 0x03, 0x2e, \n  0x33, 0x07, 0xbb, 0x27, 0x0d, 0x52, 0xdd, 0xfc, 0x56, 0xc4, 0xf2, 0xb4, 0xf5, 0x05, 0xe8, 0xbc, \n  0x09, 0xb5, 0x8b, 0xf7, 0x6e, 0x2e, 0xfc, 0x79, 0x6a, 0x02, 0x1d, 0xc5, 0xfe, 0xca, 0x07, 0xff, \n  0xdc, 0x34, 0x01, 0x46, 0x44, 0xff, 0x25, 0xda, 0xfd, 0x3f, 0x82, 0xff, 0x32, 0x4f, 0xff, 0x5c, \n  0x63, 0xfe, 0xe1, 0x7e, 0xfd, 0xb5, 0x81, 0xfe, 0xd8, 0xd0, 0xfd, 0x58, 0x86, 0xfd, 0xa6, 0x9b, \n  0xff, 0x06, 0xa3, 0xff, 0xf8, 0xf0, 0xff, 0x33, 0x4c, 0xff, 0x84, 0xc7, 0xfe, 0xcd, 0x0b, 0xff, \n  0x1d, 0x7d, 0xff, 0xf7, 0x62, 0xff, 0xbb, 0xa9, 0x1c, 0xc5, 0x37, 0x22, 0x83, 0x52, 0x03, 0x7c, \n  0x1e, 0x08, 0x11, 0x8c, 0x0d, 0x8a, 0x84, 0xfb, 0xc5, 0x44, 0xf2, 0xf3, 0x4a, 0x06, 0x5f, 0x2b, \n  0x0a, 0xa4, 0x8b, 0xf6, 0xb9, 0xab, 0xfb, 0xba, 0xca, 0x02, 0x56, 0x9e, 0xfe, 0x7f, 0xa1, 0xfe, \n  0x87, 0x34, 0x01, 0x59, 0x7b, 0xff, 0xc5, 0x55, 0xfd, 0x13, 0x10, 0xff, 0xe6, 0x7f, 0xff, 0x07, \n  0x89, 0xfe, 0x15, 0xef, 0xfc, 0x16, 0xf1, 0xfd, 0x2f, 0xf2, 0xfd, 0x47, 0x7d, 0xfd, 0x70, 0x72, \n  0xff, 0x6b, 0x8b, 0xff, 0x43, 0x4f, 0xff, 0x82, 0x20, 0xff, 0x24, 0xbc, 0xfe, 0x61, 0x92, 0xfe, \n  0xdd, 0x06, 0xff, 0xd2, 0xd3, 0xfe, 0x5e, 0x96, 0x1d, 0xb6, 0xce, 0x23, 0x94, 0x33, 0x04, 0xe0, \n  0xb3, 0x09, 0x71, 0x05, 0x0e, 0x16, 0x23, 0xfa, 0xc4, 0xe4, 0xf1, 0xad, 0x22, 0x06, 0xb0, 0x9e, \n  0x0a, 0xcd, 0x55, 0xf6, 0x7b, 0x8d, 0xfa, 0x8c, 0xe7, 0x02, 0x09, 0x0f, 0xff, 0x68, 0x55, 0xfe, \n  0x58, 0x92, 0x00, 0x15, 0xe3, 0xff, 0x8e, 0x4e, 0xfd, 0xd1, 0x63, 0xfe, 0x16, 0xce, 0xff, 0x40, \n  0x1e, 0xfe, 0xb1, 0x64, 0xfc, 0x17, 0x03, 0xfe, 0x51, 0xf1, 0xfd, 0x72, 0x6e, 0xfd, 0x3e, 0xb8, \n  0xfe, 0x41, 0x14, 0xff, 0xcb, 0xff, 0xff, 0x69, 0x0e, 0xff, 0x8a, 0x12, 0xfe, 0x21, 0x2e, 0xfe, \n  0x57, 0x06, 0xff, 0xcd, 0x94, 0xfe, 0x77, 0x5b, 0x1e, 0x94, 0x13, 0x25, 0x27, 0xfe, 0x05, 0xa9, \n  0x72, 0x0a, 0xb0, 0x7b, 0x0d, 0x83, 0xdf, 0xfa, 0x51, 0xfb, 0xf1, 0x96, 0x5c, 0x04, 0xfc, 0xdc, \n  0x0a, 0xcd, 0xcc, 0xf6, 0x0f, 0x49, 0xf9, 0xe0, 0x72, 0x03, 0x36, 0x55, 0xff, 0xcf, 0x75, 0xfd, \n  0x38, 0x62, 0x00, 0x94, 0xf1, 0xff, 0xd0, 0x41, 0xfe, 0xef, 0xe6, 0xfd, 0xc7, 0x7b, 0xfe, 0x53, \n  0x74, 0xfe, 0x20, 0x3f, 0xfc, 0x61, 0xaa, 0xfd, 0x2d, 0x0f, 0xfe, 0x01, 0x08, 0xfd, 0xca, 0x1f, \n  0xfe, 0x7a, 0x23, 0xff, 0x2b, 0x12, 0x00, 0x65, 0x23, 0xff, 0xbb, 0xfd, 0xfd, 0xfe, 0xf3, 0xfd, \n  0x84, 0x59, 0xfe, 0xd8, 0xbb, 0xfd, 0xef, 0x54, 0x1f, 0x68, 0x45, 0x25, 0x47, 0x5a, 0x08, 0x28, \n  0x5b, 0x0b, 0xec, 0xe8, 0x0b, 0x3d, 0x43, 0xfd, 0x0f, 0x67, 0xf2, 0xf0, 0xa9, 0x01, 0x99, 0x60, \n  0x0a, 0x9f, 0xf7, 0xf7, 0x9c, 0xea, 0xf8, 0x3d, 0xb6, 0x02, 0x06, 0xdc, 0xff, 0xc4, 0xfc, 0xfc, \n  0xc9, 0x9b, 0xff, 0x16, 0xb8, 0x00, 0x22, 0x09, 0xff, 0x43, 0x06, 0xfd, 0x25, 0x9e, 0xfd, 0x0e, \n  0xba, 0xfe, 0x5e, 0x18, 0xfc, 0x55, 0x55, 0xfd, 0x26, 0x16, 0xfd, 0xb6, 0x1e, 0xfd, 0xf8, 0xb2, \n  0xfe, 0xcb, 0x68, 0xfe, 0xc5, 0xdf, 0xff, 0x10, 0x81, 0xff, 0x73, 0x2c, 0xfe, 0x9b, 0x25, 0xfd, \n  0xa1, 0x9f, 0xfd, 0xcb, 0xb6, 0xfd, 0x5f, 0xd4, 0x20, 0x95, 0x96, 0x23, 0x36, 0xcc, 0x09, 0x05, \n  0xc7, 0x0e, 0xdc, 0xfe, 0x0a, 0xae, 0xbc, 0xfd, 0xba, 0x63, 0xf2, 0x37, 0x05, 0x01, 0xe5, 0xa3, \n  0x08, 0xc9, 0x59, 0xf8, 0x42, 0x09, 0xfa, 0x79, 0xad, 0x00, 0xaf, 0xc0, 0xff, 0xbb, 0x01, 0xfe, \n  0x3b, 0x77, 0xfe, 0xd7, 0x7f, 0x00, 0x90, 0x07, 0x00, 0x4e, 0x7d, 0xfc, 0xea, 0xf6, 0xfc, 0x0d, \n  0x3d, 0xff, 0xb8, 0x23, 0xfb, 0x28, 0x4c, 0xfc, 0x67, 0xbf, 0xfc, 0x3b, 0x50, 0xfd, 0x48, 0xad, \n  0xfe, 0xd0, 0xf4, 0xfd, 0xc5, 0xa1, 0xff, 0x18, 0xe6, 0xff, 0x21, 0xac, 0xfd, 0x61, 0x61, 0xfc, \n  0x15, 0xdc, 0xfd, 0xb8, 0x88, 0xfc, 0xef, 0x5f, 0x22, 0x77, 0x79, 0x20, 0xd5, 0x80, 0x09, 0x74, \n  0xa5, 0x15, 0xcb, 0xf0, 0x0c, 0x47, 0x9c, 0xfa, 0x29, 0xcf, 0xf1, 0x9d, 0xfb, 0x04, 0x4c, 0x92, \n  0x05, 0x9b, 0x35, 0xf6, 0x4d, 0xe3, 0xfd, 0x65, 0xe3, 0xfe, 0x4e, 0x3a, 0xfe, 0xc4, 0x8d, 0x00, \n  0xb1, 0x1f, 0xfd, 0x17, 0x90, 0xff, 0xf8, 0xdd, 0x01, 0xd9, 0x66, 0xfc, 0xa8, 0xdb, 0xfc, 0xf7, \n  0x7d, 0xff, 0x01, 0x12, 0xfa, 0x66, 0x00, 0xfc, 0x70, 0x95, 0xfc, 0xa7, 0xca, 0xfc, 0xbd, 0xfb, \n  0xfe, 0xc5, 0xc4, 0xfd, 0x94, 0xb2, 0xff, 0x78, 0x22, 0xff, 0xa2, 0x29, 0xfe, 0x2c, 0x98, 0xfc, \n  0x9e, 0xcf, 0xfc, 0x3d, 0xc5, 0xfc, 0x72, 0xf6, 0x25, 0x99, 0x52, 0x1e, 0xd0, 0x2d, 0x05, 0xde, \n  0x9a, 0x1c, 0x99, 0xa7, 0x0f, 0x26, 0x57, 0xf5, 0xdd, 0x8c, 0xf3, 0x03, 0x79, 0x09, 0x69, 0xef, \n  0xff, 0xa6, 0xc0, 0xf3, 0xc1, 0xd3, 0x02, 0x21, 0x31, 0xfe, 0x23, 0x21, 0xfb, 0xec, 0xdc, 0x01, \n  0xa4, 0x58, 0xfd, 0x6f, 0x5a, 0xfe, 0xab, 0x33, 0x03, 0xeb, 0x40, 0xfc, 0x48, 0x66, 0xfc, 0xc5, \n  0xa8, 0xff, 0x5b, 0xee, 0xf9, 0x4d, 0x74, 0xfb, 0x50, 0x32, 0xfb, 0x1f, 0xb8, 0xfc, 0x2f, 0xa3, \n  0xff, 0x34, 0x19, 0xfd, 0x42, 0xae, 0xfe, 0xd3, 0x66, 0xff, 0x31, 0xec, 0xfd, 0xbd, 0x80, 0xfc, \n  0x8c, 0x66, 0xfd, 0xb6, 0x0b, 0xfc, 0x46, 0x76, 0x2a, 0x99, 0x2e, 0x1e, 0xa8, 0xe9, 0xfe, 0xa4, \n  0x56, 0x20, 0x0f, 0x62, 0x14, 0xd0, 0x25, 0xf1, 0xc3, 0xbd, 0xf4, 0xd5, 0x82, 0x0e, 0x03, 0x78, \n  0xfa, 0x46, 0x44, 0xf0, 0x9b, 0x05, 0x08, 0xb4, 0x28, 0xff, 0xc1, 0x53, 0xf7, 0x6c, 0x00, 0x02, \n  0x81, 0x46, 0xff, 0xf8, 0xa3, 0xfc, 0xe7, 0xf7, 0x03, 0x98, 0x07, 0xfd, 0x96, 0x98, 0xfb, 0x9b, \n  0x18, 0x00, 0x61, 0x24, 0xfa, 0x9f, 0x97, 0xfa, 0x67, 0x5d, 0xfa, 0x9f, 0x02, 0xfd, 0x7a, 0x56, \n  0xff, 0x0e, 0x46, 0xfc, 0x9b, 0x0f, 0xfe, 0x6c, 0x9b, 0xff, 0x5d, 0xd4, 0xfd, 0xc5, 0xd8, 0xfc, \n  0xc6, 0x96, 0xfd, 0xa2, 0x78, 0xfb, 0xf5, 0x3c, 0x2e, 0x11, 0x98, 0x20, 0xf6, 0xac, 0xf7, 0xf4, \n  0x8b, 0x20, 0x6e, 0x3d, 0x1b, 0xf2, 0xcd, 0xee, 0xcb, 0x7e, 0xf4, 0x1e, 0xdc, 0x13, 0x02, 0xaa, \n  0xf6, 0x77, 0xdf, 0xea, 0xd4, 0x70, 0x0c, 0x21, 0x79, 0x02, 0x50, 0x0a, 0xf4, 0x56, 0xcc, 0xff, \n  0x3e, 0xf2, 0x01, 0x27, 0x21, 0xfc, 0x09, 0x81, 0x03, 0x9d, 0xb0, 0xfe, 0x6d, 0xa3, 0xfa, 0x00, \n  0x79, 0x00, 0xa5, 0x4c, 0xfa, 0x05, 0xa5, 0xfa, 0xfe, 0xf9, 0xf9, 0x67, 0xe6, 0xfb, 0x03, 0x24, \n  0xff, 0xb1, 0xfc, 0xfb, 0x0a, 0x7d, 0xfd, 0x57, 0x4b, 0xff, 0xb7, 0x97, 0xfe, 0xe9, 0x9c, 0xfc, \n  0x7f, 0x0a, 0xfe, 0x5f, 0xe9, 0xfb, 0x78, 0x1d, 0x32, 0x10, 0x5e, 0x23, 0x89, 0x1f, 0xf1, 0x56, \n  0xe7, 0x1d, 0x36, 0xa3, 0x21, 0x16, 0x66, 0xee, 0x85, 0x85, 0xf3, 0x4a, 0x10, 0x19, 0xdb, 0xdb, \n  0xf3, 0x9f, 0x71, 0xe4, 0x76, 0xfe, 0x0e, 0xec, 0x24, 0x07, 0x47, 0x30, 0xf2, 0xd1, 0xe9, 0xfb, \n  0x48, 0x49, 0x03, 0x97, 0x41, 0xfd, 0x67, 0x69, 0x02, 0xe6, 0x03, 0x00, 0xcf, 0x43, 0xfa, 0xbe, \n  0xcb, 0xff, 0x41, 0x22, 0xfb, 0xdb, 0x6d, 0xfa, 0x64, 0x50, 0xf9, 0xc4, 0x18, 0xfb, 0xa2, 0x29, \n  0xfe, 0x76, 0xae, 0xfb, 0x01, 0xbc, 0xfd, 0xe7, 0x9c, 0xfe, 0xcc, 0xaa, 0xfe, 0x36, 0xd8, 0xfc, \n  0xa3, 0xa1, 0xfe, 0x89, 0x85, 0xfc, 0xad, 0x71, 0x37, 0x2c, 0xc6, 0x24, 0x35, 0xb4, 0xeb, 0x21, \n  0xc8, 0x1a, 0xf6, 0x63, 0x25, 0x1c, 0x54, 0xef, 0xd5, 0xa8, 0xf3, 0x9f, 0x37, 0x1e, 0xc7, 0xd1, \n  0xf0, 0xf6, 0xf1, 0xde, 0x47, 0x9b, 0x0f, 0x2e, 0xe4, 0x0b, 0xf0, 0x84, 0xf2, 0x2c, 0xb2, 0xf7, \n  0x08, 0xd8, 0x02, 0x5a, 0x38, 0xff, 0x6a, 0x2c, 0x02, 0x3b, 0x71, 0x00, 0x5e, 0xcd, 0xfa, 0xf9, \n  0xc1, 0xfe, 0xcc, 0xee, 0xfb, 0xf1, 0xe0, 0xf9, 0xb1, 0xea, 0xf8, 0xfe, 0x98, 0xfa, 0x06, 0x12, \n  0xfd, 0x19, 0xc4, 0xfb, 0xe8, 0xa4, 0xfd, 0x3c, 0xac, 0xfe, 0x69, 0x2c, 0xfe, 0x93, 0x78, 0xfd, \n  0x6f, 0x39, 0xff, 0x3c, 0x88, 0xfc, 0xe9, 0x2d, 0x3d, 0x16, 0xd4, 0x25, 0x3c, 0xbe, 0xe6, 0x38, \n  0x47, 0x18, 0xe4, 0x2d, 0x26, 0x97, 0xe6, 0xf0, 0x7f, 0x49, 0xf5, 0xee, 0x08, 0x23, 0x81, 0xfc, \n  0xed, 0x73, 0x93, 0xda, 0x71, 0x63, 0x0e, 0x36, 0xb4, 0x0f, 0xe8, 0xf0, 0xf4, 0x2f, 0x05, 0xf4, \n  0x59, 0xda, 0x00, 0xb4, 0xb8, 0x00, 0x98, 0x6a, 0x03, 0xd5, 0x28, 0x00, 0xdf, 0xbf, 0xfb, 0x79, \n  0x24, 0xfe, 0x25, 0x41, 0xfb, 0x7e, 0x49, 0xfa, 0xe6, 0x51, 0xf8, 0xd5, 0xfa, 0xf9, 0x5a, 0x08, \n  0xfd, 0x8f, 0x55, 0xfb, 0xca, 0x44, 0xfd, 0x0e, 0x96, 0xff, 0x24, 0xfb, 0xfd, 0xd0, 0x36, 0xfd, \n  0x7e, 0xac, 0xff, 0x07, 0xb3, 0xfc, 0x1c, 0xcd, 0x44, 0x4b, 0x99, 0x24, 0xd1, 0x22, 0xe2, 0x06, \n  0xad, 0x17, 0x1a, 0x38, 0x24, 0xa1, 0x8d, 0xf0, 0x46, 0x89, 0xf9, 0xc3, 0xaa, 0x27, 0xab, 0xa7, \n  0xe9, 0x13, 0x23, 0xd8, 0xdc, 0x9d, 0x0c, 0xd2, 0x78, 0x11, 0x6c, 0xf5, 0xf7, 0x52, 0xf1, 0xf1, \n  0x83, 0x0a, 0xfe, 0x47, 0xe9, 0x00, 0xad, 0xc1, 0x05, 0x68, 0xcb, 0xff, 0x0b, 0xc4, 0xfc, 0x3a, \n  0xf2, 0xfc, 0xf4, 0x15, 0xfa, 0xeb, 0x47, 0xfb, 0x02, 0xef, 0xf6, 0xfd, 0x9a, 0xfa, 0xa4, 0x57, \n  0xfc, 0x23, 0xa2, 0xfa, 0xfd, 0xe8, 0xfd, 0x37, 0x33, 0x00, 0xa9, 0xd3, 0xfd, 0x08, 0xa0, 0xfc, \n  0x51, 0x84, 0xff, 0x73, 0x0d, 0xfd, 0xf4, 0x08, 0x4c, 0xa4, 0x24, 0x24, 0x06, 0x3d, 0xdd, 0x6c, \n  0x5f, 0x18, 0x97, 0xfa, 0x20, 0xf9, 0x47, 0xef, 0x9d, 0x81, 0xfe, 0xba, 0x7a, 0x2c, 0x72, 0x8b, \n  0xe6, 0x76, 0xc1, 0xd5, 0xf2, 0xee, 0x0a, 0x61, 0x2f, 0x12, 0x4a, 0xbc, 0xfa, 0x31, 0x9d, 0xf1, \n  0x88, 0x52, 0xfb, 0xbc, 0xd4, 0xff, 0x7a, 0x71, 0x08, 0xae, 0x8b, 0x00, 0xcd, 0xfd, 0xfc, 0xa7, \n  0xd1, 0xfb, 0x46, 0x6a, 0xf9, 0x71, 0xaf, 0xfb, 0xfa, 0xc5, 0xf6, 0xb7, 0xe9, 0xfa, 0xa0, 0x5d, \n  0xfb, 0x66, 0xd0, 0xfa, 0x31, 0x71, 0xfe, 0x16, 0xec, 0x00, 0xbd, 0xb2, 0xfd, 0x8b, 0x82, 0xfb, \n  0x22, 0x83, 0xff, 0x26, 0xd6, 0xfd, 0x39, 0x93, 0x54, 0x32, 0xd4, 0x24, 0x12, 0x50, 0xd5, 0xd7, \n  0xa8, 0x17, 0x43, 0x43, 0x20, 0x26, 0x82, 0xef, 0x14, 0xb8, 0x00, 0x71, 0x34, 0x2e, 0x67, 0x27, \n  0xe6, 0xcd, 0x8a, 0xd4, 0xf3, 0xab, 0x09, 0x1c, 0xda, 0x11, 0x6e, 0x5d, 0xfb, 0xf5, 0x95, 0xf2, \n  0x00, 0xef, 0xf9, 0x92, 0xd1, 0xfd, 0xfb, 0xe2, 0x0a, 0x38, 0xd0, 0x01, 0x72, 0x46, 0xfb, 0x08, \n  0xfe, 0xfb, 0xd5, 0x54, 0xf9, 0x3e, 0x13, 0xfb, 0xe7, 0x35, 0xf7, 0x67, 0x64, 0xfa, 0x6b, 0x85, \n  0xfb, 0xfc, 0x4a, 0xfb, 0xa8, 0x3c, 0xfe, 0x68, 0x91, 0x01, 0x9a, 0x64, 0xfd, 0x55, 0x8c, 0xfa, \n  0x64, 0xc4, 0xff, 0xeb, 0x8f, 0xfe, 0xe7, 0x42, 0x5c, 0x40, 0xb0, 0x26, 0xd2, 0x1a, 0xcd, 0x09, \n  0x58, 0x17, 0xd3, 0x8f, 0x1f, 0x29, 0x7e, 0xef, 0x60, 0x8d, 0x01, 0xc5, 0x8e, 0x2f, 0x1a, 0x36, \n  0xe8, 0x24, 0x5e, 0xd2, 0x54, 0xd3, 0x08, 0xe7, 0xd9, 0x11, 0xb9, 0x7d, 0xfa, 0x87, 0x0e, 0xf4, \n  0x5c, 0x2c, 0xfa, 0xf6, 0xbc, 0xfa, 0x1f, 0x8a, 0x0c, 0x51, 0xbd, 0x03, 0x57, 0xe0, 0xf8, 0x63, \n  0x3e, 0xfd, 0x88, 0x5d, 0xf9, 0x2b, 0x2f, 0xfa, 0xf7, 0xef, 0xf7, 0x15, 0x00, 0xfa, 0xb1, 0xf4, \n  0xfb, 0xa3, 0xa1, 0xfb, 0x8e, 0x39, 0xfe, 0x1a, 0x9e, 0x01, 0x51, 0x09, 0xfd, 0x59, 0x24, 0xfa, \n  0x12, 0x68, 0x00, 0x83, 0xa4, 0xfe, 0xc2, 0xa3, 0x63, 0x48, 0x96, 0x27, 0xc9, 0xce, 0xc6, 0x1f, \n  0x76, 0x17, 0xa0, 0x53, 0x1e, 0xd8, 0xa7, 0xee, 0x60, 0x52, 0x01, 0x33, 0x0b, 0x31, 0x2c, 0xd7, \n  0xeb, 0x80, 0xcc, 0xcf, 0xf9, 0xd7, 0x07, 0xf6, 0x20, 0x12, 0x93, 0x02, 0xf9, 0x4a, 0xc1, 0xf5, \n  0x6a, 0x40, 0xfb, 0x98, 0x4d, 0xf7, 0x99, 0x09, 0x0d, 0x05, 0xbc, 0x05, 0xa0, 0x49, 0xf7, 0xb5, \n  0x95, 0xfe, 0xef, 0x40, 0xf9, 0x7b, 0x82, 0xf9, 0x57, 0x03, 0xf9, 0xb5, 0xa4, 0xf9, 0x4a, 0xfd, \n  0xfb, 0x99, 0x3d, 0xfc, 0x8d, 0x19, 0xfe, 0x5e, 0x6b, 0x01, 0xae, 0x98, 0xfc, 0x16, 0x03, 0xfa, \n  0xa9, 0x82, 0x01, 0x28, 0xae, 0xfd, 0x25, 0x04, 0x68, 0x40, 0x9a, 0x2a, 0x9c, 0x09, 0xc2, 0x49, \n  0x37, 0x17, 0xaa, 0xa1, 0x1c, 0xdc, 0xab, 0xed, 0x61, 0x78, 0xfe, 0xf9, 0x20, 0x33, 0x53, 0x6f, \n  0xf1, 0xdb, 0xa0, 0xcc, 0x84, 0x07, 0x06, 0x56, 0x2b, 0x12, 0xb7, 0x4a, 0xf8, 0xc1, 0xdf, 0xf6, \n  0x2a, 0x5b, 0xfc, 0xb7, 0x41, 0xf4, 0x23, 0xc5, 0x0b, 0xc7, 0xb9, 0x07, 0x8f, 0x04, 0xf7, 0x42, \n  0xf5, 0xfe, 0xa3, 0xac, 0xf9, 0x2b, 0x51, 0xf9, 0x40, 0xa0, 0xf9, 0xa8, 0x47, 0xf9, 0x3b, 0xeb, \n  0xfb, 0x8a, 0xb0, 0xfc, 0xf6, 0xf2, 0xfd, 0x8a, 0xc8, 0x00, 0x29, 0x70, 0xfc, 0x16, 0x2a, 0xfa, \n  0x0a, 0xa2, 0x01, 0xde, 0xa3, 0xfc, 0x43, 0x8b, 0x6b, 0xea, 0xdd, 0x2c, 0xda, 0x24, 0xc0, 0x35, \n  0x8b, 0x16, 0xff, 0xe9, 0x1a, 0x31, 0x33, 0xec, 0x8b, 0xea, 0xf9, 0xc0, 0xed, 0x35, 0xd9, 0xe7, \n  0xf6, 0xb5, 0xbe, 0xca, 0xac, 0xf8, 0x03, 0xb9, 0x0a, 0x11, 0x5b, 0x0a, 0xf9, 0x9d, 0xbc, 0xf7, \n  0x6e, 0xba, 0xfc, 0x92, 0x77, 0xf2, 0x59, 0x89, 0x09, 0x0a, 0xca, 0x08, 0x8a, 0x8d, 0xf8, 0x17, \n  0x3c, 0xfe, 0x81, 0xc1, 0xfa, 0x18, 0x2e, 0xfa, 0xf2, 0xf0, 0xf8, 0xf3, 0x9b, 0xf9, 0x17, 0xd6, \n  0xfb, 0x6b, 0x06, 0xfd, 0x8b, 0xab, 0xfd, 0x5c, 0xd9, 0xff, 0xc0, 0xd7, 0xfc, 0xbe, 0x18, 0xfa, \n  0x3c, 0x77, 0x00, 0x8d, 0xad, 0xfc, 0x1b, 0x41, 0x6e, 0x9a, 0xe2, 0x2d, 0x81, 0x5c, 0xc1, 0xe8, \n  0x9f, 0x15, 0x1a, 0x74, 0x19, 0xa9, 0x15, 0xea, 0x10, 0x6a, 0xf4, 0x7f, 0xe8, 0x38, 0x85, 0x8d, \n  0xfb, 0x64, 0xfa, 0xca, 0x15, 0xb2, 0x01, 0x17, 0x82, 0x0e, 0x3e, 0x43, 0xfb, 0x2c, 0xd6, 0xf8, \n  0x3b, 0xc4, 0xfb, 0x02, 0xbc, 0xf1, 0xc0, 0x7a, 0x07, 0x09, 0x58, 0x08, 0xa5, 0xb8, 0xfb, 0x32, \n  0x09, 0xfd, 0x2d, 0xd0, 0xfb, 0xf8, 0x47, 0xfc, 0x78, 0x52, 0xf7, 0xb7, 0x93, 0xfa, 0xb8, 0xcd, \n  0xfb, 0x10, 0x27, 0xfd, 0xb9, 0xf6, 0xfc, 0x12, 0x70, 0xff, 0xbe, 0xb1, 0xfc, 0xcd, 0x94, 0xf9, \n  0x6c, 0xee, 0xff, 0x64, 0x89, 0xfc, 0xaa, 0x36, 0x6e, 0x94, 0x4d, 0x30, 0x65, 0xdb, 0xc4, 0xc5, \n  0xb5, 0x14, 0x17, 0xf0, 0x17, 0x3b, 0x08, 0xe7, 0x5f, 0xbb, 0xee, 0x3b, 0xe4, 0x3a, 0x03, 0xbc, \n  0x00, 0x28, 0x95, 0xcc, 0xda, 0x97, 0xfe, 0x9e, 0x3a, 0x0b, 0xa4, 0xd9, 0xfe, 0xe6, 0x2b, 0xfa, \n  0x70, 0x72, 0xf9, 0x12, 0xcb, 0xf1, 0xe8, 0x57, 0x06, 0x39, 0x23, 0x06, 0x7d, 0xbb, 0xff, 0xc4, \n  0x99, 0xfc, 0xd0, 0xc1, 0xfb, 0x17, 0x74, 0xff, 0x7d, 0xfb, 0xf5, 0x2d, 0x46, 0xfb, 0x1a, 0x13, \n  0xfc, 0xb2, 0x7a, 0xfc, 0x80, 0xcb, 0xfc, 0x0d, 0x19, 0xfe, 0xa2, 0xb6, 0xfb, 0x13, 0xd4, 0xfa, \n  0xf5, 0xf7, 0xfe, 0x06, 0xea, 0xfb, 0xf5, 0x1a, 0x6c, 0xdb, 0xbd, 0x33, 0x0a, 0x79, 0xc9, 0x3c, \n  0x98, 0x13, 0x96, 0x7d, 0x16, 0xd4, 0x8e, 0xe4, 0xca, 0x2e, 0xe9, 0x21, 0x4b, 0x39, 0x21, 0xda, \n  0x06, 0x11, 0xc7, 0xcf, 0x25, 0x1c, 0xfb, 0xb4, 0x82, 0x07, 0x1d, 0x7d, 0x02, 0x99, 0x7e, 0xfb, \n  0xa3, 0xa2, 0xf6, 0xbc, 0xcb, 0xf2, 0x02, 0x91, 0x05, 0xc4, 0x9a, 0x02, 0x16, 0x0d, 0x03, 0xb2, \n  0x69, 0xfe, 0x41, 0x2d, 0xfa, 0xb6, 0x7d, 0x02, 0x8c, 0x5a, 0xf6, 0xd7, 0x9b, 0xfa, 0x2e, 0xe1, \n  0xfc, 0xbb, 0x11, 0xfc, 0x21, 0x9a, 0xfa, 0xc6, 0x7c, 0xfc, 0x96, 0x38, 0xfc, 0x9b, 0x4c, 0xfb, \n  0xeb, 0xc1, 0xfe, 0x60, 0x8a, 0xfb, 0x7d, 0x1c, 0x68, 0x92, 0xe9, 0x36, 0x45, 0x0f, 0xd0, 0xd5, \n  0x2f, 0x14, 0xdd, 0xe1, 0x13, 0x4f, 0xf2, 0xe1, 0x83, 0x2f, 0xe4, 0xbc, 0x3d, 0x35, 0x9d, 0x5e, \n  0x0e, 0x98, 0x3f, 0xd3, 0xab, 0x39, 0xf7, 0x48, 0x76, 0x04, 0x8a, 0x4d, 0x05, 0xa0, 0x19, 0xfd, \n  0xff, 0x94, 0xf4, 0xe9, 0xca, 0xf3, 0x65, 0xf9, 0x04, 0x58, 0x2b, 0xff, 0xb6, 0x8e, 0x04, 0xf9, \n  0x45, 0x02, 0xa0, 0x78, 0xf8, 0xcb, 0xf2, 0x03, 0x62, 0xf0, 0xf8, 0x69, 0x39, 0xf9, 0x1e, 0xd5, \n  0xfd, 0xed, 0x1e, 0xfa, 0x34, 0x69, 0xf8, 0xfd, 0x8b, 0xfc, 0x49, 0x40, 0xfb, 0xaf, 0x8a, 0xfc, \n  0xc3, 0x8b, 0xff, 0xb9, 0x07, 0xfb, 0xa5, 0x83, 0x63, 0xd4, 0xa9, 0x3a, 0x65, 0x6b, 0xd6, 0xa4, \n  0x96, 0x13, 0xbc, 0x8c, 0x11, 0x7e, 0x93, 0xe3, 0x75, 0x75, 0xde, 0xf2, 0x74, 0x2c, 0x65, 0x51, \n  0x17, 0x48, 0x10, 0xd7, 0x70, 0x59, 0xf4, 0x2b, 0xbd, 0x02, 0x2a, 0xf1, 0x04, 0xfd, 0x87, 0xff, \n  0xee, 0x9b, 0xf4, 0x4a, 0x18, 0xf4, 0x72, 0xcf, 0x04, 0x1e, 0xea, 0xfb, 0x2d, 0x6a, 0x04, 0xe7, \n  0x9f, 0x06, 0xb7, 0xc8, 0xf8, 0xc7, 0x07, 0x03, 0xbd, 0x5b, 0xfc, 0x9b, 0x04, 0xf9, 0x31, 0x57, \n  0xfb, 0xd7, 0x90, 0xfa, 0x5c, 0x29, 0xf7, 0x32, 0x42, 0xfb, 0x58, 0x12, 0xfb, 0xd9, 0xec, 0xfd, \n  0xb0, 0xf6, 0x00, 0xd7, 0xc1, 0xfa, 0xfb, 0x79, 0x5f, 0x07, 0x1a, 0x3e, 0x2d, 0xfc, 0xda, 0x22, \n  0xdc, 0x13, 0x5d, 0x55, 0x0e, 0x5d, 0x4a, 0xe6, 0xd2, 0x8d, 0xdb, 0x47, 0x94, 0x1f, 0xd0, 0x06, \n  0x1f, 0x23, 0x5d, 0xdc, 0x44, 0x81, 0xf1, 0x26, 0x25, 0x02, 0xaf, 0x1d, 0x03, 0x0e, 0xe9, 0x00, \n  0x9a, 0x03, 0xf7, 0x64, 0x1a, 0xf4, 0x01, 0xd3, 0x03, 0x14, 0x85, 0xfa, 0xa1, 0x95, 0x02, 0x50, \n  0x99, 0x09, 0x07, 0x7e, 0xfa, 0x2f, 0x3e, 0x02, 0xf3, 0xae, 0xfd, 0x70, 0x79, 0xf8, 0x43, 0xd7, \n  0xf9, 0x6c, 0x60, 0xfb, 0xe0, 0xd5, 0xf6, 0x5e, 0x07, 0xfa, 0xc6, 0xf1, 0xfa, 0x52, 0xec, 0xfe, \n  0x37, 0xfd, 0x01, 0xcc, 0x96, 0xfa, 0x73, 0xf0, 0x5c, 0x52, 0x1e, 0x3f, 0x14, 0xef, 0xde, 0xd7, \n  0x19, 0x16, 0x29, 0xcd, 0x0a, 0x15, 0x31, 0xe7, 0xb7, 0xb2, 0xdb, 0x2a, 0x14, 0x13, 0xe7, 0xec, \n  0x22, 0x6f, 0x8f, 0xe3, 0x5d, 0x3a, 0xee, 0x1b, 0x49, 0x02, 0xa4, 0x4a, 0x02, 0x92, 0xf3, 0xff, \n  0x7c, 0x8a, 0xfb, 0xae, 0x18, 0xf4, 0xa6, 0x4e, 0x02, 0x0c, 0x72, 0xfb, 0x9a, 0xd4, 0xfe, 0xdc, \n  0x0b, 0x0b, 0x0a, 0x6c, 0xfd, 0x13, 0xa4, 0x00, 0x8e, 0x48, 0xfd, 0xc9, 0x9b, 0xf9, 0x09, 0x21, \n  0xf9, 0x5c, 0xa0, 0xfc, 0x3e, 0xb3, 0xf7, 0x05, 0xce, 0xf8, 0x43, 0xc2, 0xfb, 0xcf, 0xb0, 0xfd, \n  0x07, 0xd3, 0x01, 0x80, 0xd8, 0xfb, 0x56, 0x8d, 0x5a, 0x03, 0x2d, 0x40, 0x1c, 0xc7, 0xe1, 0xd6, \n  0x0f, 0x19, 0x60, 0xb7, 0x08, 0xb9, 0xa0, 0xe5, 0x82, 0xfa, 0xde, 0xa3, 0x6c, 0x07, 0x7b, 0xe6, \n  0x22, 0xa4, 0x77, 0xed, 0x75, 0x03, 0xea, 0xa0, 0x3b, 0x02, 0x66, 0x88, 0x04, 0x53, 0xae, 0xfc, \n  0x82, 0x45, 0x00, 0x7e, 0x36, 0xf6, 0x31, 0xbc, 0xff, 0x98, 0xdb, 0xfd, 0x78, 0x5a, 0xfa, 0x54, \n  0x18, 0x0a, 0xeb, 0xf7, 0x00, 0x47, 0x53, 0xfe, 0xc0, 0x91, 0xfd, 0x32, 0xc9, 0xfb, 0x48, 0xc0, \n  0xf9, 0xca, 0x88, 0xfd, 0x85, 0xfe, 0xf9, 0x85, 0xf7, 0xf8, 0xa4, 0x0a, 0xfa, 0x33, 0xa3, 0xfb, \n  0xa4, 0x49, 0x02, 0x09, 0xa1, 0xfd, 0x56, 0x0f, 0x56, 0x48, 0xd2, 0x41, 0x22, 0x6e, 0xe6, 0xe8, \n  0xc3, 0x18, 0xf5, 0x8a, 0x07, 0x3a, 0x9b, 0xe6, 0x63, 0xf9, 0xe0, 0xea, 0xe5, 0xfb, 0xaa, 0x22, \n  0x22, 0x1a, 0xc1, 0xf6, 0x65, 0x25, 0xe6, 0x8d, 0x25, 0x02, 0x03, 0x6c, 0x07, 0x41, 0x3f, 0xf9, \n  0x49, 0x13, 0x04, 0x98, 0xb0, 0xf9, 0x1b, 0xc4, 0xfb, 0xc4, 0x56, 0x00, 0x90, 0xa5, 0xf7, 0xe5, \n  0x5a, 0x04, 0x17, 0x33, 0x04, 0x06, 0xe1, 0xfe, 0xf3, 0xd9, 0xfc, 0xad, 0xe6, 0xfe, 0x47, 0xec, \n  0xfa, 0xc2, 0x25, 0xff, 0x52, 0xb9, 0xfb, 0xee, 0x79, 0xf8, 0xaa, 0xf4, 0xf8, 0x25, 0x69, 0xf9, \n  0xe3, 0x9a, 0x00, 0xe2, 0x1e, 0xff, 0x29, 0x04, 0x53, 0x5e, 0xd8, 0x40, 0x95, 0x9b, 0xeb, 0x73, \n  0xbe, 0x17, 0x16, 0x2b, 0x05, 0x23, 0x04, 0xea, 0x46, 0xd9, 0xe0, 0x15, 0x28, 0xf3, 0x3e, 0x4d, \n  0x20, 0x02, 0x1c, 0xfd, 0x61, 0x2a, 0xe5, 0xe6, 0xc5, 0x01, 0x88, 0xf0, 0x08, 0x96, 0x4e, 0xf8, \n  0x41, 0x31, 0x07, 0x66, 0x51, 0xf9, 0x0e, 0x1b, 0xfa, 0x90, 0xca, 0x02, 0x40, 0x52, 0xf4, 0xb7, \n  0x9f, 0xff, 0x3f, 0x2a, 0x04, 0x3e, 0x5f, 0x01, 0xff, 0x98, 0xfd, 0xad, 0x74, 0x01, 0xe2, 0xbb, \n  0xfc, 0x14, 0x2b, 0xff, 0x3c, 0x9d, 0xfd, 0x03, 0x7c, 0xf8, 0x19, 0xd2, 0xf8, 0xf2, 0x64, 0xf6, \n  0x41, 0x61, 0xfd, 0x21, 0xfb, 0xff, 0x8c, 0x43, 0x52, 0x5c, 0x7f, 0x3d, 0xec, 0x38, 0xef, 0x1e, \n  0x43, 0x19, 0x7e, 0xa7, 0x01, 0x16, 0x79, 0xed, 0x8c, 0x9c, 0xe2, 0xd9, 0xc2, 0xeb, 0x64, 0x63, \n  0x1d, 0x93, 0xef, 0x03, 0x52, 0x70, 0xe4, 0xdc, 0x07, 0x01, 0x12, 0x9c, 0x0d, 0xe9, 0x64, 0xf6, \n  0x51, 0x79, 0x07, 0xd6, 0x1e, 0xfa, 0x23, 0x75, 0xf8, 0x87, 0x4e, 0x04, 0xec, 0x35, 0xf3, 0x9b, \n  0x01, 0xfe, 0x09, 0x28, 0x01, 0x27, 0x6c, 0x02, 0x2a, 0xd8, 0x03, 0xec, 0x17, 0x01, 0xe7, 0xe1, \n  0xfc, 0x64, 0xeb, 0x01, 0xe2, 0x7f, 0xfe, 0x52, 0x9a, 0xf8, 0x4f, 0xd9, 0xf8, 0x66, 0x66, 0xf5, \n  0x02, 0xa6, 0xf9, 0xb7, 0xa4, 0xfe, 0x5a, 0x3c, 0x53, 0x42, 0xaa, 0x38, 0xe3, 0x6f, 0xef, 0x61, \n  0xc9, 0x1c, 0x41, 0x1d, 0xff, 0xea, 0x0a, 0xee, 0x98, 0xc8, 0xe4, 0xe5, 0x33, 0xe8, 0x81, 0x51, \n  0x18, 0xa1, 0x55, 0x09, 0x5f, 0x65, 0xe6, 0x1f, 0xeb, 0xfe, 0x5b, 0xee, 0x11, 0xbf, 0xda, 0xf4, \n  0xa4, 0x03, 0x04, 0x99, 0xb1, 0xfc, 0xa8, 0xc5, 0xf6, 0x54, 0xeb, 0x03, 0xdf, 0xd1, 0xf5, 0x70, \n  0x83, 0xfb, 0x52, 0xe3, 0x01, 0xfa, 0x7d, 0x00, 0x27, 0xd0, 0x04, 0x43, 0xc6, 0x05, 0xd1, 0x8e, \n  0xfb, 0x01, 0x80, 0x03, 0x50, 0x13, 0x00, 0x57, 0x6d, 0xf7, 0x7a, 0x70, 0xf9, 0x47, 0x0c, 0xf6, \n  0x8a, 0x9b, 0xf6, 0x40, 0x68, 0xfc, 0xb8, 0xf5, 0x54, 0x83, 0x14, 0x35, 0x54, 0x86, 0xe8, 0x51, \n  0xba, 0x24, 0xae, 0x0c, 0x01, 0x10, 0xbf, 0xe6, 0x6a, 0x2a, 0xe9, 0x60, 0xc6, 0xe9, 0x83, 0x24, \n  0x12, 0xc3, 0x08, 0x0c, 0xd4, 0x02, 0xeb, 0x9a, 0x10, 0xfc, 0x29, 0x5c, 0x14, 0x4f, 0xed, 0xf3, \n  0xc0, 0x08, 0xff, 0xd0, 0x9d, 0x00, 0xd9, 0x56, 0xf6, 0x3d, 0x90, 0x01, 0x1d, 0xed, 0xf9, 0x14, \n  0xf2, 0xfc, 0x1d, 0xf0, 0x00, 0x33, 0x01, 0xff, 0x24, 0x09, 0x01, 0x39, 0x5d, 0x0b, 0x87, 0x02, \n  0xfe, 0x14, 0x25, 0x00, 0x2d, 0x91, 0x04, 0x6c, 0xf5, 0xf5, 0xec, 0x0f, 0xf8, 0xb3, 0xd1, 0xf9, \n  0x7c, 0x38, 0xf5, 0xcb, 0xf8, 0xf8, 0x4a, 0xa8, 0x59, 0xd5, 0xbf, 0x2d, 0xb5, 0x41, 0xde, 0x83, \n  0x5a, 0x32, 0xb4, 0xc0, 0x01, 0xfb, 0xe0, 0xd9, 0xb5, 0xf1, 0xef, 0x1b, 0x61, 0xf1, 0x2c, 0x40, \n  0x09, 0x17, 0xe2, 0x0b, 0xbe, 0x10, 0xf3, 0xcb, 0xcc, 0xf5, 0xe1, 0x2f, 0x15, 0x19, 0x66, 0xf6, \n  0x1d, 0xee, 0xf7, 0x1f, 0xe5, 0x03, 0xd7, 0x4d, 0xf9, 0x00, 0x3b, 0xfe, 0x2e, 0x92, 0xfc, 0x83, \n  0x00, 0x01, 0x19, 0x3e, 0xfe, 0x7c, 0xe5, 0xfd, 0xe6, 0xad, 0xff, 0x73, 0x26, 0x09, 0x15, 0x72, \n  0x03, 0x79, 0x6c, 0x00, 0xd6, 0x7c, 0x02, 0xcf, 0xd8, 0xf8, 0x6d, 0xf8, 0xf6, 0x25, 0x66, 0xfa, \n  0xa8, 0x2a, 0xf7, 0xce, 0xb2, 0xf6, 0xc4, 0x68, 0x5d, 0xe5, 0x14, 0x24, 0x40, 0xea, 0xd9, 0x19, \n  0x0e, 0x3d, 0xb7, 0x3b, 0xfd, 0x56, 0x52, 0xd5, 0x41, 0xc1, 0xf6, 0x7b, 0x20, 0xf6, 0x9f, 0xce, \n  0x02, 0x3a, 0x58, 0x0a, 0xc9, 0xc3, 0xf8, 0xce, 0x92, 0xf2, 0xdb, 0x49, 0x14, 0x11, 0xe5, 0xf7, \n  0x2b, 0x8a, 0xf4, 0xa2, 0x37, 0x05, 0x8d, 0xa9, 0xfd, 0x48, 0xb7, 0xfc, 0x7b, 0xe0, 0xfc, 0x5b, \n  0xb3, 0x02, 0xd1, 0xef, 0xfe, 0x40, 0x27, 0xfd, 0x18, 0x08, 0xfd, 0xc5, 0xe3, 0x07, 0xc5, 0xe1, \n  0x04, 0x75, 0xa9, 0x02, 0xb1, 0x8e, 0x01, 0xf7, 0x15, 0xfb, 0x50, 0xbd, 0xf7, 0x29, 0x12, 0xf8, \n  0x45, 0xf8, 0xf9, 0x7c, 0xf1, 0xf7, 0x8a, 0x34, 0x5e, 0x09, 0x7e, 0x1c, 0xf6, 0x81, 0xd7, 0x3a, \n  0x18, 0x44, 0x97, 0x54, 0xfb, 0x1f, 0xcd, 0xd0, 0xa7, 0xa6, 0xfc, 0x0b, 0x54, 0xfe, 0x00, 0x13, \n  0xf9, 0xbe, 0x45, 0x06, 0xd3, 0x57, 0x02, 0x21, 0xc4, 0xee, 0x20, 0xb0, 0x0f, 0x14, 0x1b, 0xfd, \n  0x1d, 0xf9, 0xf3, 0x17, 0x48, 0x03, 0x06, 0xda, 0x00, 0x6f, 0xee, 0xfd, 0x01, 0xec, 0xfc, 0xd2, \n  0x3e, 0x01, 0x79, 0x40, 0xff, 0xda, 0x8a, 0xff, 0xf8, 0x01, 0xfa, 0x68, 0xa3, 0x06, 0x22, 0x02, \n  0x06, 0xcb, 0xc8, 0x00, 0xc8, 0x83, 0x04, 0x30, 0x8f, 0xfc, 0x3b, 0xad, 0xf6, 0xe0, 0xbd, 0xf9, \n  0x50, 0x05, 0xfa, 0xb7, 0xae, 0xf8, 0x57, 0x73, 0x59, 0x40, 0xa0, 0x17, 0x56, 0xf7, 0xd9, 0xbd, \n  0xd9, 0x46, 0x94, 0xc5, 0xfa, 0xdb, 0xd7, 0xcf, 0x41, 0x70, 0x01, 0x18, 0xdf, 0x00, 0xf4, 0xf6, \n  0xf2, 0xb5, 0x74, 0x05, 0xef, 0x6c, 0x06, 0xc6, 0x12, 0xec, 0x42, 0x74, 0x0d, 0x45, 0x0b, 0x02, \n  0x7c, 0x08, 0xf3, 0x9e, 0xc5, 0x02, 0x04, 0x3e, 0x02, 0xfa, 0x2f, 0xfd, 0x19, 0xcc, 0xfe, 0x05, \n  0xea, 0xff, 0x23, 0x4e, 0xfe, 0x51, 0x22, 0x01, 0x89, 0x77, 0xfa, 0x7a, 0x7c, 0x04, 0x2e, 0xf0, \n  0x04, 0x59, 0x6b, 0x01, 0x47, 0x54, 0x04, 0x44, 0x1a, 0xfe, 0xeb, 0x49, 0xf7, 0x98, 0x59, 0xfb, \n  0xff, 0xe8, 0xfa, 0xaa, 0x24, 0xf7, 0xe5, 0x54, 0x50, 0x16, 0xcd, 0x15, 0xbf, 0xd2, 0xdf, 0x58, \n  0x7e, 0x44, 0xf7, 0xf0, 0xfc, 0x2b, 0x00, 0xd3, 0x1e, 0x15, 0x01, 0x96, 0xca, 0x01, 0x8e, 0x2c, \n  0xf2, 0x90, 0xac, 0x02, 0xee, 0x94, 0x07, 0x1b, 0x6a, 0xed, 0xfa, 0x54, 0x0b, 0x6e, 0x90, 0x04, \n  0xf6, 0x56, 0xf4, 0xb5, 0xcf, 0x01, 0xe8, 0x7a, 0x02, 0x7b, 0x34, 0xfd, 0x34, 0x7b, 0xfe, 0xac, \n  0x69, 0x00, 0xe1, 0x37, 0xfe, 0xf8, 0x2a, 0x00, 0x15, 0x77, 0xfc, 0xb6, 0xb8, 0x03, 0xfe, 0x01, \n  0x03, 0xa4, 0x21, 0x02, 0xe8, 0x5a, 0x03, 0xb2, 0xde, 0xfd, 0xb7, 0x37, 0xfa, 0x6d, 0x3f, 0xfc, \n  0xda, 0x43, 0xfb, 0x14, 0xe4, 0xf7, 0x61, 0x58, 0x46, 0x12, 0xcd, 0x16, 0xa1, 0xf8, 0xe4, 0x07, \n  0x12, 0x3e, 0x01, 0xb9, 0x01, 0x17, 0x85, 0xd6, 0x78, 0x31, 0x00, 0x9d, 0xe2, 0x02, 0x17, 0x2f, \n  0xf1, 0x81, 0x53, 0x00, 0xe9, 0x2a, 0x09, 0x1a, 0xb6, 0xef, 0xa0, 0x4a, 0x08, 0xe1, 0x8e, 0x07, \n  0xb9, 0x1e, 0xf5, 0x98, 0x93, 0xff, 0x5e, 0x45, 0x04, 0x39, 0x46, 0xfd, 0x20, 0xbf, 0xfc, 0x35, \n  0x2f, 0x01, 0x7d, 0x01, 0xff, 0x12, 0x37, 0xff, 0x2a, 0x76, 0xfd, 0xe9, 0xef, 0x03, 0x3b, 0xe1, \n  0x02, 0xe7, 0xa7, 0x00, 0xe6, 0xba, 0x02, 0x33, 0x20, 0xfe, 0x6e, 0xef, 0xfa, 0xd7, 0x1f, 0xfe, \n  0xa7, 0x80, 0xfb, 0x91, 0xce, 0xf8, 0x2c, 0x53, 0x3e, 0x48, 0x8b, 0x1c, 0x63, 0xa5, 0xed, 0xe9, \n  0xec, 0x2b, 0x8c, 0x7f, 0xfe, 0x8a, 0x9e, 0xe1, 0x93, 0x02, 0x00, 0xd4, 0x34, 0xfd, 0x1f, 0x59, \n  0xfc, 0x94, 0x2b, 0x01, 0xfc, 0xfd, 0xfc, 0xf7, 0x9e, 0xfb, 0xbf, 0x0d, 0x09, 0xd2, 0x28, 0x00, \n  0x99, 0x73, 0xf9, 0xcc, 0x99, 0xfe, 0x21, 0x6f, 0x01, 0xf6, 0x1f, 0xfe, 0xd6, 0x84, 0xfa, 0xc2, \n  0x4c, 0x00, 0x22, 0xc6, 0x00, 0x45, 0xa4, 0x00, 0x6c, 0x1e, 0x00, 0xa0, 0xb5, 0x00, 0x92, 0x25, \n  0x00, 0x26, 0x69, 0x02, 0xcc, 0x92, 0x01, 0x16, 0x75, 0xff, 0x69, 0xeb, 0xff, 0xce, 0x7c, 0xff, \n  0xe7, 0xa3, 0xfe, 0xd3, 0x4c, 0xff, 0x32, 0xb9, 0x34, 0xbb, 0x4a, 0x1a, 0x58, 0xc5, 0xf4, 0x78, \n  0xfe, 0x28, 0x7e, 0xcd, 0xfe, 0xfc, 0x1e, 0xe6, 0xee, 0x0f, 0x00, 0x25, 0x24, 0xfc, 0xbe, 0x56, \n  0xfd, 0xcf, 0x96, 0x01, 0x4c, 0xf9, 0xfc, 0x67, 0xeb, 0xfb, 0xb4, 0x04, 0x09, 0xcf, 0xba, 0x00, \n  0x49, 0x92, 0xf9, 0x3b, 0x7b, 0xfe, 0xee, 0xdd, 0x00, 0xe9, 0x5f, 0xfe, 0xb0, 0x5b, 0xfb, 0xdb, \n  0x4d, 0x00, 0xb4, 0x2d, 0x00, 0x79, 0x4a, 0x00, 0x03, 0x87, 0x00, 0x2e, 0xd5, 0x00, 0x71, 0xcb, \n  0x00, 0x32, 0x6a, 0x02, 0x7d, 0x27, 0x01, 0x96, 0x4f, 0xff, 0xb5, 0x3d, 0x00, 0x2e, 0xcf, 0xff, \n  0xf6, 0x28, 0xfe, 0xd7, 0x4f, 0xff, 0xa5, 0xe4, 0x2b, 0xa2, 0xd9, 0x18, 0x6d, 0xba, 0xfb, 0xca, \n  0x87, 0x23, 0xf4, 0xd0, 0xff, 0x10, 0x7c, 0xec, 0xe4, 0xff, 0xfd, 0xbf, 0xe1, 0xfa, 0xe2, 0x3f, \n  0xff, 0x2d, 0x33, 0x02, 0xf0, 0x3e, 0xfc, 0xf9, 0xba, 0xfc, 0xb2, 0x9e, 0x08, 0x9a, 0xe8, 0x00, \n  0xcb, 0x82, 0xfa, 0x69, 0x1a, 0xfe, 0xeb, 0xd5, 0x00, 0x37, 0x6c, 0xfe, 0x7e, 0xd6, 0xfb, 0xc7, \n  0x6c, 0x00, 0x05, 0x07, 0x00, 0xf1, 0xf5, 0xff, 0x11, 0x89, 0x00, 0x4b, 0x21, 0x01, 0xd2, 0x6e, \n  0x01, 0x93, 0xfa, 0x01, 0x30, 0x52, 0x00, 0xf1, 0xdf, 0xff, 0x34, 0x54, 0x00, 0xbe, 0xa8, 0xff, \n  0x7e, 0x2e, 0xff, 0x30, 0xa1, 0xff, 0xbf, 0xd9, 0x24, 0x53, 0x60, 0x18, 0xba, 0x59, 0xff, 0x79, \n  0xc4, 0x1d, 0x8d, 0x72, 0x02, 0x3a, 0xc3, 0xf0, 0xf7, 0xaf, 0xfc, 0x1c, 0xff, 0xfa, 0xa2, 0x47, \n  0x00, 0xf6, 0x50, 0x02, 0xd2, 0x96, 0xfc, 0x6a, 0x7d, 0xfd, 0x79, 0xf5, 0x06, 0xc7, 0x77, 0x01, \n  0x94, 0x9f, 0xfb, 0x84, 0x9d, 0xfd, 0x81, 0x87, 0x00, 0x18, 0xcd, 0xfe, 0xbe, 0x69, 0xfc, 0x51, \n  0x52, 0x00, 0x14, 0x1c, 0x00, 0x02, 0xf9, 0xff, 0x14, 0x30, 0x00, 0x55, 0x91, 0x01, 0x5a, 0x07, \n  0x02, 0xc2, 0x75, 0x00, 0x51, 0x3f, 0x00, 0x08, 0x3c, 0x01, 0x5e, 0x08, 0x00, 0x57, 0x42, 0xff, \n  0xbb, 0x95, 0x00, 0x9e, 0x7f, 0x00, 0xab, 0x59, 0x20, 0x39, 0x04, 0x18, 0x66, 0xce, 0xff, 0xeb, \n  0x99, 0x19, 0x38, 0xf4, 0x04, 0xf8, 0x80, 0xf2, 0xbb, 0xe0, 0xfc, 0xf8, 0xe2, 0xfc, 0xa2, 0xfd, \n  0xff, 0x7c, 0x9a, 0x01, 0x34, 0x76, 0xfe, 0x97, 0x11, 0xfe, 0xdd, 0x91, 0x04, 0x5d, 0x4d, 0x02, \n  0xd0, 0xdb, 0xfc, 0xff, 0xcf, 0xfc, 0x9d, 0x61, 0x00, 0x76, 0xa3, 0xff, 0x11, 0x08, 0xfd, 0x17, \n  0xf8, 0xff, 0xc0, 0x7b, 0x00, 0xdf, 0x0a, 0x00, 0xd5, 0x0d, 0x00, 0x3e, 0x4e, 0x02, 0x41, 0x60, \n  0x01, 0xf8, 0x12, 0x00, 0x2e, 0x4e, 0x01, 0x70, 0x65, 0x01, 0x6c, 0xf4, 0xff, 0x66, 0x48, 0x00, \n  0x81, 0x84, 0x01, 0xa1, 0x31, 0x00, 0x76, 0xca, 0x1d, 0xd2, 0x33, 0x17, 0x70, 0x2f, 0xff, 0x9b, \n  0x5f, 0x16, 0x5c, 0xae, 0x05, 0xac, 0x5e, 0xf4, 0x00, 0x60, 0xfe, 0xe8, 0xec, 0xfd, 0x6d, 0x62, \n  0xff, 0x68, 0x91, 0x01, 0x5d, 0x39, 0x00, 0xd1, 0xec, 0xfd, 0x8e, 0x2d, 0x03, 0xc4, 0xce, 0x02, \n  0x1d, 0xf9, 0xfc, 0xe0, 0x0f, 0xfd, 0x88, 0xbc, 0x00, 0xc1, 0xe5, 0xff, 0xa8, 0x52, 0xfd, 0x33, \n  0x47, 0x00, 0x84, 0xc2, 0x00, 0x30, 0x83, 0xff, 0x68, 0x2d, 0x01, 0x88, 0x8f, 0x02, 0x28, 0x8f, \n  0x00, 0x0f, 0xb1, 0x00, 0x20, 0xef, 0x01, 0xed, 0xcc, 0x01, 0x17, 0x7b, 0x00, 0xa6, 0x15, 0x01, \n  0x58, 0x00, 0x01, 0x96, 0x31, 0xff, 0x26, 0x11, 0x1b, 0xe4, 0xb0, 0x15, 0xbc, 0x2d, 0xff, 0xa8, \n  0x1e, 0x14, 0xa4, 0xdf, 0x05, 0x33, 0x56, 0xf6, 0x7d, 0x7a, 0xff, 0xdc, 0x60, 0xfe, 0x29, 0x24, \n  0xff, 0x10, 0x00, 0x02, 0x9d, 0x0a, 0x01, 0xb1, 0x8b, 0xfd, 0xbf, 0x5b, 0x02, 0x66, 0x9d, 0x02, \n  0xaa, 0xa8, 0xfd, 0x60, 0x9d, 0xfd, 0x3a, 0x89, 0x00, 0x41, 0x00, 0x00, 0x6f, 0xc7, 0xfd, 0xa6, \n  0xaa, 0x00, 0xfa, 0x64, 0x00, 0x4e, 0x7c, 0x00, 0xf3, 0x5b, 0x02, 0x50, 0x22, 0x01, 0xd1, 0xd3, \n  0x00, 0xbb, 0x2d, 0x02, 0xe9, 0x70, 0x02, 0xac, 0x8d, 0x01, 0x17, 0x49, 0x00, 0x98, 0xbc, 0x00, \n  0x88, 0xbc, 0xff, 0x5c, 0xd3, 0xfe, 0x50, 0x2b, 0x18, 0x83, 0x7c, 0x13, 0xc1, 0x0e, 0x00, 0xac, \n  0xe9, 0x12, 0x05, 0xce, 0x05, 0x19, 0x26, 0xf8, 0xa4, 0xff, 0xff, 0xaa, 0x2b, 0xff, 0xff, 0xcc, \n  0xff, 0x5e, 0xdb, 0x01, 0xb3, 0xbd, 0x00, 0x62, 0xba, 0xfd, 0xde, 0x8b, 0x02, 0x12, 0x4a, 0x02, \n  0x37, 0xea, 0xfd, 0xf1, 0x38, 0xfe, 0xbf, 0xa4, 0x00, 0x9e, 0xd2, 0xff, 0x19, 0xa1, 0xfe, 0xf4, \n  0x43, 0x01, 0x8f, 0xb8, 0x00, 0xe3, 0xc6, 0x01, 0x1a, 0x08, 0x02, 0x14, 0x42, 0x01, 0x24, 0x2b, \n  0x02, 0x82, 0x55, 0x02, 0x19, 0x00, 0x02, 0x86, 0x96, 0x00, 0x81, 0xc4, 0xff, 0x32, 0x1b, 0x00, \n  0xd3, 0x64, 0xff, 0x94, 0xd1, 0xfe, 0x5f, 0xca, 0x15, 0x19, 0x71, 0x12, 0xad, 0x8d, 0x00, 0xbc, \n  0x3c, 0x10, 0x66, 0xf1, 0x05, 0xd6, 0x69, 0xfa, 0x71, 0xf3, 0x00, 0x37, 0x5e, 0xff, 0x01, 0x78, \n  0xff, 0xf2, 0x15, 0x02, 0xbe, 0x30, 0x01, 0x62, 0x20, 0xfe, 0xf9, 0xe2, 0x01, 0x92, 0x02, 0x02, \n  0xb5, 0x99, 0xfe, 0x16, 0x9d, 0xfe, 0x5d, 0x91, 0x00, 0x06, 0x8a, 0x00, 0x97, 0x09, 0x00, 0x84, \n  0x44, 0x01, 0x5e, 0xcb, 0x01, 0x8c, 0x07, 0x03, 0x17, 0xc7, 0x01, 0xa3, 0xc8, 0x01, 0x66, 0xcd, \n  0x01, 0xe8, 0x09, 0x01, 0x53, 0x36, 0x01, 0xd6, 0x1e, 0x00, 0x8f, 0x72, 0xff, 0xd9, 0xc7, 0xff, \n  0x3b, 0x64, 0xff, 0xf2, 0x55, 0xfe, 0xcc, 0xe4, 0x12, 0x1b, 0xac, 0x10, 0xe1, 0x78, 0x01, 0x68, \n  0x23, 0x0f, 0x35, 0x90, 0x06, 0x71, 0xcf, 0xfb, 0xcb, 0xed, 0x00, 0xdf, 0xca, 0xff, 0x7a, 0x3a, \n  0x00, 0xb0, 0x04, 0x02, 0x85, 0xc4, 0x00, 0x3a, 0x88, 0xfe, 0xda, 0xce, 0x01, 0x8d, 0xbe, 0x01, \n  0x17, 0x37, 0xff, 0x38, 0x52, 0xff, 0x41, 0x04, 0x01, 0xd7, 0x8d, 0x01, 0xcb, 0x06, 0x01, 0x33, \n  0x4b, 0x02, 0x85, 0x14, 0x03, 0xfd, 0xcd, 0x02, 0x1b, 0x11, 0x01, 0xa4, 0x8c, 0x00, 0xe5, 0x89, \n  0x00, 0x14, 0xb1, 0x00, 0xa5, 0xda, 0x00, 0x5f, 0x1f, 0x00, 0x2c, 0x2a, 0xff, 0xcc, 0x26, 0xff, \n  0x8f, 0x13, 0xff, 0x71, 0x12, 0xfe, 0x90, 0x14, 0x10, 0x14, 0x1b, 0x0f, 0x44, 0xe7, 0x02, 0x6e, \n  0xf3, 0x0d, 0x4e, 0x27, 0x06, 0xa3, 0x88, 0xfd, 0xe1, 0xc9, 0x01, 0xba, 0xa1, 0xff, 0x04, 0x60, \n  0x00, 0x05, 0x3b, 0x02, 0x5d, 0x84, 0x00, 0x07, 0x9d, 0xfe, 0x79, 0xfd, 0x01, 0xb6, 0x3c, 0x02, \n  0xdd, 0xff, 0xff, 0x0f, 0xd3, 0xff, 0xd9, 0x17, 0x02, 0xc3, 0x58, 0x03, 0x53, 0x03, 0x02, 0x39, \n  0xbe, 0x02, 0x18, 0x8c, 0x02, 0x1d, 0x80, 0x00, 0x9e, 0xbc, 0xff, 0x39, 0x5e, 0x00, 0x0d, 0x21, \n  0x00, 0xeb, 0x8c, 0x00, 0x93, 0x82, 0x00, 0x4f, 0x51, 0xff, 0x88, 0xd5, 0xfe, 0xe6, 0x26, 0xff, \n  0x22, 0x96, 0xfe, 0x50, 0x9b, 0xfd, 0x91, 0x90, 0x0e, 0xfd, 0xab, 0x0e, 0x0f, 0xf0, 0x02, 0x0f, \n  0xb5, 0x0b, 0x87, 0xd4, 0x06, 0x4e, 0xb7, 0xff, 0x2b, 0x8a, 0x01, 0x1f, 0x82, 0xff, 0x56, 0x9b, \n  0x00, 0xed, 0x33, 0x02, 0xd4, 0x45, 0x01, 0x96, 0x94, 0xff, 0x8e, 0x0c, 0x02, 0x5e, 0x8e, 0x02, \n  0xd9, 0x8d, 0x01, 0x0d, 0x19, 0x02, 0x62, 0x91, 0x03, 0x86, 0x7e, 0x03, 0xd1, 0x4b, 0x01, 0xdf, \n  0x0b, 0x01, 0xc6, 0xc5, 0x00, 0x33, 0x13, 0x00, 0x3e, 0xcd, 0xff, 0x80, 0x0a, 0x00, 0x7c, 0xd3, \n  0xff, 0x24, 0x0e, 0x00, 0xe4, 0x05, 0x00, 0x25, 0x12, 0xff, 0x3d, 0xbb, 0xfe, 0x74, 0xd2, 0xfe, \n  0xac, 0x15, 0xfe, 0x76, 0xa2, 0xfd, 0x07, 0x4e, 0x0b, 0x7e, 0x8c, 0x0c, 0x83, 0x57, 0x05, 0xfd, \n  0xf3, 0x0b, 0xde, 0x48, 0x06, 0xcd, 0xba, 0x00, 0x2b, 0xdd, 0x01, 0x1b, 0xb3, 0xff, 0xc2, 0xac, \n  0x01, 0x22, 0x99, 0x02, 0x69, 0xf5, 0x00, 0xb9, 0x9b, 0x00, 0x97, 0x0a, 0x04, 0xb1, 0x40, 0x04, \n  0x1d, 0x72, 0x02, 0x8b, 0x7c, 0x02, 0x49, 0xee, 0x02, 0x3f, 0x7e, 0x01, 0x4e, 0xf5, 0xff, 0x6e, \n  0xa2, 0x00, 0xa6, 0x54, 0x00, 0x54, 0x37, 0x00, 0xdf, 0x68, 0xff, 0xd6, 0x24, 0xff, 0x47, 0x7e, \n  0xff, 0xad, 0x9d, 0xff, 0x5a, 0xc2, 0xff, 0x91, 0x06, 0xff, 0x37, 0x7b, 0xfe, 0x6a, 0x60, 0xfe, \n  0x1e, 0xf3, 0xfd, 0xad, 0x15, 0xfe, 0xf1, 0xc7, 0x0a, 0x35, 0x6b, 0x0d, 0x3e, 0x3e, 0x05, 0x71, \n  0xfc, 0x08, 0x8e, 0xc1, 0x06, 0xdc, 0x21, 0x02, 0x64, 0xed, 0x01, 0x77, 0x13, 0x00, 0x06, 0x04, \n  0x02, 0xc8, 0x48, 0x04, 0xce, 0x3d, 0x03, 0x7f, 0xae, 0x02, 0xc0, 0x7e, 0x04, 0x58, 0x0e, 0x04, \n  0xd7, 0xc1, 0x01, 0xee, 0xe1, 0xff, 0x41, 0x94, 0x00, 0x0a, 0x71, 0x01, 0xbc, 0xc9, 0x00, 0xb9, \n  0x3a, 0x00, 0x3e, 0x2d, 0xff, 0x9b, 0x0d, 0xff, 0x3c, 0x0d, 0xff, 0x10, 0x33, 0xff, 0x08, 0x3b, \n  0xff, 0x32, 0x44, 0xff, 0x21, 0xf6, 0xfe, 0xca, 0x9a, 0xfe, 0xcc, 0xd8, 0xfe, 0x0d, 0x4f, 0xfe, \n  0x7d, 0x38, 0xfe, 0xb5, 0x35, 0xfe, 0xe2, 0xab, 0x08, 0x9b, 0xce, 0x0b, 0x40, 0xab, 0x06, 0x9a, \n  0xc0, 0x09, 0x96, 0x48, 0x07, 0xad, 0x4b, 0x02, 0x6c, 0x80, 0x02, 0x66, 0x71, 0x02, 0xf2, 0xba, \n  0x04, 0xb4, 0xca, 0x05, 0xe2, 0x1d, 0x04, 0x0f, 0xef, 0x02, 0x7c, 0x1a, 0x02, 0xce, 0x0c, 0x01, \n  0xea, 0x09, 0x00, 0x8d, 0x56, 0x00, 0x3a, 0x83, 0x01, 0xc7, 0x42, 0x01, 0x1b, 0x6c, 0xff, 0xbe, \n  0xef, 0xfe, 0x84, 0xbb, 0xff, 0x0e, 0xc8, 0xfe, 0x9d, 0x2e, 0xfe, 0x6a, 0xc1, 0xfe, 0x9e, 0x0f, \n  0xff, 0x6d, 0x22, 0xff, 0x18, 0xd2, 0xfe, 0x01, 0x12, 0xff, 0xa8, 0xca, 0xfe, 0x1b, 0x85, 0xfe, \n  0xeb, 0x62, 0xfe, 0x6f, 0x2d, 0xfe, 0x6f, 0x52, 0x09, 0x32, 0x39, 0x0e, 0xdb, 0x96, 0x07, 0x9e, \n  0x06, 0x07, 0x09, 0x0c, 0x06, 0x70, 0x81, 0x05, 0x3f, 0x8f, 0x07, 0x5f, 0x87, 0x05, 0xdf, 0x05, \n  0x04, 0x54, 0x8f, 0x03, 0x12, 0x4b, 0x01, 0x7b, 0xbc, 0xff, 0x11, 0x40, 0x00, 0x02, 0x20, 0x01, \n  0x48, 0x92, 0x01, 0xa7, 0x4d, 0x00, 0x65, 0x7a, 0xff, 0xfa, 0x5a, 0x00, 0x4b, 0x86, 0xff, 0xdc, \n  0xb2, 0xfe, 0x3c, 0x9c, 0xfe, 0x95, 0xcb, 0xfd, 0x5a, 0x3c, 0xfe, 0x38, 0x46, 0xff, 0x94, 0x17, \n  0xff, 0xd6, 0xdb, 0xfe, 0xb2, 0x38, 0xff, 0xa9, 0x5c, 0xff, 0x56, 0xa4, 0xfe, 0x2c, 0x2e, 0xfe, \n  0xf9, 0x6d, 0xfe, 0x97, 0x65, 0xfe, 0x05, 0xe5, 0x09, 0xba, 0x23, 0x0e, 0x78, 0x0d, 0x09, 0xd3, \n  0x37, 0x0b, 0x2b, 0x56, 0x09, 0xc9, 0x57, 0x07, 0x32, 0x82, 0x07, 0x95, 0xe5, 0x02, 0xf6, 0xfd, \n  0xff, 0x41, 0x75, 0x00, 0x21, 0x40, 0x00, 0x6f, 0x3b, 0x00, 0x50, 0x97, 0x00, 0xd5, 0x80, 0x00, \n  0xbb, 0x04, 0x01, 0xec, 0x8d, 0xff, 0xd6, 0x2d, 0xff, 0x44, 0xfc, 0xff, 0xc8, 0x9a, 0xfe, 0x20, \n  0x31, 0xfe, 0xfe, 0x26, 0xfe, 0x95, 0xa9, 0xfd, 0xc7, 0x87, 0xfe, 0xc8, 0x8b, 0xff, 0xe3, 0x5b, \n  0xff, 0xe1, 0xe8, 0xfe, 0xf1, 0x0d, 0xff, 0x9b, 0x34, 0xff, 0x71, 0xac, 0xfe, 0x22, 0x53, 0xfe, \n  0xf1, 0x52, 0xfe, 0x82, 0x3f, 0xfe, 0x7f, 0x80, 0x0b, 0x44, 0x11, 0x12, 0xd2, 0xc4, 0x0e, 0x32, \n  0x0a, 0x0e, 0x5a, 0xa4, 0x07, 0x30, 0xe8, 0x03, 0x13, 0x42, 0x02, 0x8a, 0xfa, 0xff, 0xdc, 0xf3, \n  0xff, 0xb5, 0xb5, 0x00, 0x7f, 0x62, 0x00, 0x28, 0x61, 0xff, 0xab, 0xb5, 0xff, 0x2f, 0x24, 0x00, \n  0x7e, 0xe1, 0x00, 0x10, 0x40, 0xff, 0xa2, 0xa9, 0xfe, 0xa6, 0x0d, 0xff, 0x33, 0xf0, 0xfd, 0xdd, \n  0xf6, 0xfd, 0x4a, 0x2b, 0xfe, 0x36, 0x97, 0xfe, 0x8b, 0xdb, 0xfe, 0x00, 0xf7, 0xfe, 0xb7, 0x09, \n  0xff, 0x87, 0x5b, 0xff, 0xb3, 0x50, 0xff, 0x8e, 0xcd, 0xfe, 0x59, 0x6d, 0xfe, 0x42, 0x41, 0xfe, \n  0xa7, 0x6b, 0xfe, 0x1e, 0x4f, 0xfe, 0xe0, 0xd0, 0x0d, 0x69, 0xda, 0x18, 0x37, 0xa0, 0x12, 0xa4, \n  0x3e, 0x08, 0x89, 0xc0, 0x00, 0x40, 0xfa, 0x01, 0xdf, 0x20, 0x04, 0x49, 0xe4, 0x02, 0xe9, 0xe8, \n  0xfe, 0xd1, 0x1e, 0xfe, 0x1b, 0xf6, 0xff, 0x39, 0x41, 0x00, 0x24, 0xfe, 0xff, 0x0e, 0x16, 0xff, \n  0xe9, 0x21, 0x00, 0xd2, 0x84, 0xff, 0x61, 0x59, 0xfe, 0x15, 0x53, 0xfe, 0x33, 0x0c, 0xfe, 0x6e, \n  0xb5, 0xfe, 0x71, 0x6b, 0xfe, 0xf4, 0x61, 0xfe, 0xf1, 0x84, 0xfe, 0x33, 0x19, 0xff, 0xdb, 0x3a, \n  0xff, 0x4e, 0x23, 0xff, 0xe1, 0x65, 0xff, 0x1e, 0xb9, 0xfe, 0xa5, 0x74, 0xfe, 0x30, 0x2b, 0xfe, \n  0xdc, 0x5b, 0xfe, 0xb8, 0xb1, 0xfe, 0x94, 0xcb, 0x0e, 0x52, 0xdd, 0x18, 0x3d, 0xe5, 0x0c, 0xf8, \n  0x9e, 0x04, 0x58, 0xf4, 0x02, 0x98, 0xfb, 0x05, 0x62, 0x14, 0x07, 0x07, 0x8f, 0x01, 0xe8, 0xee, \n  0xfd, 0x2b, 0x01, 0x00, 0x79, 0x54, 0x00, 0x6b, 0x6b, 0xfe, 0xa9, 0x27, 0x00, 0xe5, 0x77, 0xff, \n  0x9f, 0x2f, 0xff, 0x3d, 0x46, 0xff, 0x27, 0x4a, 0xfe, 0x7d, 0xe9, 0xfe, 0x18, 0xa1, 0xfe, 0x76, \n  0x47, 0xfe, 0xda, 0x9e, 0xfe, 0x80, 0x64, 0xfe, 0x4f, 0x0a, 0xfe, 0xfc, 0x03, 0xff, 0x32, 0x46, \n  0xff, 0xf7, 0xed, 0xfe, 0x8a, 0x22, 0xff, 0xe5, 0xcc, 0xfe, 0xd9, 0xa6, 0xfe, 0x0c, 0x91, 0xfe, \n  0x16, 0x58, 0xfe, 0x65, 0x7a, 0xfe, 0xa0, 0xfc, 0x08, 0xc5, 0xa2, 0x0d, 0x36, 0x97, 0x07, 0x31, \n  0xc4, 0x07, 0x3e, 0xfb, 0x08, 0x56, 0xfa, 0x08, 0x6e, 0x2b, 0x08, 0x8b, 0xdb, 0x03, 0xef, 0xfe, \n  0x01, 0xca, 0xc7, 0x02, 0x02, 0x5d, 0x01, 0x07, 0x5c, 0xff, 0x49, 0xe4, 0xfe, 0x64, 0xa6, 0xff, \n  0x3f, 0xec, 0xff, 0x94, 0x83, 0xfe, 0xcc, 0x81, 0xfe, 0x37, 0x35, 0xff, 0xfb, 0x18, 0xff, 0xe4, \n  0x3f, 0xff, 0xf4, 0x62, 0xfe, 0x61, 0x41, 0xfe, 0x2e, 0xd6, 0xfe, 0xee, 0x7d, 0xfe, 0x73, 0x6f, \n  0xfe, 0xfa, 0x00, 0xff, 0xf6, 0xd5, 0xfe, 0xdf, 0xaf, 0xfe, 0xcb, 0x4c, 0xff, 0x12, 0x0b, 0xff, \n  0x1c, 0x77, 0xfe, 0x28, 0x66, 0xfe, 0x3e, 0x17, 0x07, 0x5b, 0xd1, 0x09, 0xe3, 0x70, 0x04, 0x27, \n  0x2c, 0x05, 0x24, 0xdd, 0x07, 0xfa, 0x14, 0x08, 0x80, 0x35, 0x06, 0xc8, 0xcb, 0x04, 0xef, 0x05, \n  0x06, 0x5a, 0x02, 0x06, 0xb9, 0x3e, 0x04, 0x91, 0x54, 0x02, 0xd2, 0x3f, 0x01, 0x22, 0xe3, 0x00, \n  0x9a, 0x79, 0xff, 0x88, 0xa4, 0xfe, 0x9b, 0x22, 0xff, 0xe9, 0x9e, 0xfe, 0x7b, 0x70, 0xfe, 0x07, \n  0x9c, 0xff, 0xb2, 0xe3, 0xfe, 0x04, 0xc6, 0xfe, 0xdd, 0x4d, 0xff, 0xd6, 0xa2, 0xfe, 0x41, 0xb1, \n  0xfe, 0x19, 0xec, 0xfe, 0x94, 0x93, 0xfe, 0x32, 0x43, 0xfe, 0x07, 0xc0, 0xfe, 0x1c, 0x06, 0xff, \n  0x96, 0xe5, 0xfe, 0x83, 0x0d, 0xff, 0xf9, 0xc7, 0x07, 0xb3, 0xb3, 0x0a, 0xe6, 0xf5, 0x04, 0xcb, \n  0x52, 0x05, 0xa2, 0xa6, 0x06, 0x95, 0xf6, 0x04, 0x2f, 0xc5, 0x02, 0xb6, 0x54, 0x02, 0x63, 0xd3, \n  0x04, 0xf6, 0x50, 0x06, 0xda, 0x00, 0x05, 0xaf, 0xe5, 0x03, 0xef, 0xa5, 0x03, 0xef, 0x08, 0x03, \n  0xa7, 0x5a, 0x01, 0x05, 0x91, 0xff, 0x35, 0x28, 0xff, 0x93, 0x09, 0xff, 0xe7, 0xed, 0xfe, 0xec, \n  0xb9, 0xfe, 0x79, 0x72, 0xfe, 0x1f, 0xea, 0xfe, 0xe5, 0x73, 0xff, 0xd5, 0x01, 0xff, 0x4c, 0xc7, \n  0xfe, 0xed, 0x11, 0xff, 0x55, 0x78, 0xfe, 0x05, 0x76, 0xfe, 0x4f, 0xd3, 0xfe, 0xad, 0x6e, 0xfe, \n  0x14, 0xb2, 0xfe, 0x53, 0x2e, 0xff, 0x0c, 0xcc, 0x08, 0x79, 0xa7, 0x0b, 0x24, 0xe8, 0x03, 0x3d, \n  0xea, 0x04, 0xa7, 0x02, 0x07, 0x42, 0xa2, 0x04, 0xbe, 0x1e, 0x01, 0xce, 0x59, 0x00, 0x51, 0xbd, \n  0x03, 0xa5, 0x8c, 0x04, 0x8d, 0xcb, 0x02, 0xbc, 0xe6, 0x03, 0xa3, 0x4e, 0x05, 0x4b, 0xaf, 0x04, \n  0x28, 0x69, 0x03, 0x29, 0x5a, 0x01, 0xb1, 0xab, 0x00, 0xce, 0xdd, 0xff, 0x4a, 0xef, 0xfe, 0xfc, \n  0x4e, 0xff, 0x14, 0x7b, 0xfe, 0x2b, 0x62, 0xfe, 0x6d, 0x61, 0xff, 0x77, 0xff, 0xfe, 0xa9, 0x54, \n  0xff, 0xf2, 0xae, 0xff, 0x82, 0xa9, 0xfe, 0x28, 0x9c, 0xfe, 0x4f, 0xd7, 0xfe, 0x7c, 0x4f, 0xfe, \n  0xc1, 0xa4, 0xfe, 0xcd, 0xd8, 0xfe, 0xee, 0xb0, 0x09, 0x74, 0x98, 0x0d, 0x69, 0x92, 0x04, 0x3d, \n  0xac, 0x04, 0xc0, 0xc7, 0x06, 0xb6, 0x53, 0x03, 0x61, 0x3b, 0x00, 0x43, 0x47, 0x01, 0x15, 0xec, \n  0x03, 0x49, 0x62, 0x02, 0xc4, 0xc6, 0x00, 0xa7, 0x24, 0x02, 0x07, 0xfa, 0x02, 0xfc, 0xe7, 0x03, \n  0xb4, 0x7d, 0x04, 0xd7, 0xdc, 0x02, 0x54, 0x08, 0x02, 0xa9, 0x52, 0x01, 0xb9, 0x6d, 0x00, 0xf1, \n  0x27, 0x00, 0x6b, 0xca, 0xfe, 0x1c, 0xc5, 0xfe, 0x12, 0x23, 0xff, 0xf5, 0x78, 0xfe, 0x09, 0x42, \n  0xff, 0x39, 0xb4, 0xff, 0x8a, 0x02, 0xff, 0xf3, 0x01, 0xff, 0x6e, 0xe4, 0xfe, 0xe1, 0x63, 0xfe, \n  0xbf, 0x9d, 0xfe, 0xbb, 0xdc, 0xfe, 0xfa, 0x56, 0x0a, 0x5a, 0x85, 0x0e, 0x42, 0x2a, 0x05, 0xab, \n  0x62, 0x05, 0xaf, 0xf0, 0x07, 0x38, 0xb9, 0x02, 0xd1, 0x01, 0xfe, 0x1b, 0x45, 0x01, 0x60, 0xc0, \n  0x04, 0xe2, 0xc9, 0x01, 0x86, 0x41, 0x00, 0x95, 0x7e, 0x01, 0x4c, 0x63, 0x01, 0x77, 0xd0, 0x01, \n  0x6e, 0x3e, 0x02, 0x31, 0xd6, 0x01, 0x19, 0xd2, 0x02, 0xad, 0xf0, 0x02, 0x34, 0x9c, 0x01, 0x21, \n  0x05, 0x01, 0xc3, 0x88, 0x00, 0xf0, 0xbe, 0xff, 0xb5, 0x1a, 0xff, 0xe1, 0xf1, 0xfe, 0x09, 0x11, \n  0xff, 0x16, 0x21, 0xff, 0x5a, 0x13, 0xff, 0x23, 0x0b, 0xff, 0x3c, 0x1a, 0xff, 0xfd, 0xd5, 0xfe, \n  0x41, 0x94, 0xfe, 0xae, 0xb4, 0xfe, 0xcb, 0x93, 0x0b, 0x73, 0x2e, 0x10, 0x57, 0xce, 0x05, 0xe4, \n  0x32, 0x05, 0x8e, 0xfa, 0x07, 0x44, 0x63, 0x02, 0x71, 0xd7, 0xfc, 0x06, 0xd2, 0x01, 0x69, 0xdf, \n  0x04, 0x41, 0x32, 0x00, 0xd0, 0xe7, 0xff, 0xfc, 0xe0, 0x01, 0x7c, 0x44, 0x01, 0xb4, 0xb6, 0x00, \n  0xa7, 0x20, 0x01, 0x65, 0x3e, 0x00, 0x71, 0x26, 0x00, 0xd2, 0xc5, 0x01, 0x0e, 0x73, 0x02, 0x8b, \n  0x10, 0x02, 0xa2, 0x55, 0x01, 0xb5, 0xe3, 0x00, 0xf1, 0x46, 0x00, 0x26, 0x80, 0xff, 0x3a, 0x48, \n  0xff, 0xa5, 0x65, 0xff, 0x2b, 0xfd, 0xfe, 0x80, 0x8c, 0xfe, 0xc1, 0xc1, 0xfe, 0x8a, 0x05, 0xff, \n  0xbb, 0xe0, 0xfe, 0x0e, 0x99, 0xfe, 0x31, 0xa8, 0x0c, 0x4b, 0xf5, 0x11, 0x22, 0x87, 0x06, 0x17, \n  0x00, 0x05, 0xd2, 0x6c, 0x08, 0x6a, 0x45, 0x02, 0x8c, 0x8b, 0xfb, 0xbb, 0x40, 0x02, 0x16, 0x30, \n  0x05, 0x03, 0x1e, 0xff, 0x62, 0x81, 0xff, 0x1b, 0x2b, 0x02, 0xd1, 0x23, 0x01, 0x09, 0x61, 0x00, \n  0x8e, 0xec, 0x00, 0x5b, 0xbb, 0xff, 0x20, 0x66, 0xff, 0x8c, 0x14, 0x00, 0x00, 0x47, 0x00, 0xa1, \n  0x1d, 0x01, 0xcc, 0xaf, 0x01, 0xda, 0x2e, 0x02, 0xcf, 0x46, 0x01, 0x66, 0x60, 0x00, 0xab, 0x77, \n  0x00, 0x8f, 0xf2, 0xff, 0xdf, 0x52, 0xff, 0xae, 0xfe, 0xfe, 0x4d, 0xaf, 0xfe, 0x0c, 0x85, 0xfe, \n  0x38, 0xff, 0xfe, 0xbb, 0xc5, 0xfe, 0x0f, 0x8e, 0x0e, 0xe8, 0x53, 0x14, 0xf6, 0x6f, 0x06, 0x10, \n  0x5e, 0x04, 0x35, 0x7a, 0x08, 0xc2, 0xf9, 0x01, 0x3a, 0x01, 0xfb, 0x3a, 0xef, 0x02, 0x2a, 0xbd, \n  0x04, 0x1f, 0x8d, 0xfd, 0x69, 0x70, 0xff, 0x1d, 0x9d, 0x02, 0xdc, 0x25, 0x01, 0xb0, 0xd5, 0xff, \n  0xaa, 0x79, 0x00, 0xd3, 0xa4, 0xff, 0xbc, 0x13, 0xff, 0xd5, 0x9b, 0xff, 0x54, 0x9b, 0xff, 0xf1, \n  0xaa, 0xff, 0x70, 0x79, 0xff, 0x59, 0x1b, 0x01, 0xb0, 0xdf, 0x01, 0x02, 0x75, 0x01, 0xf7, 0x16, \n  0x01, 0xe3, 0x96, 0x00, 0xb1, 0x54, 0x00, 0xa6, 0x89, 0xff, 0x04, 0xd9, 0xfe, 0xd5, 0xa2, 0xfe, \n  0x87, 0xe5, 0xfe, 0x3d, 0x80, 0xfe, 0x94, 0x16, 0x10, 0x2c, 0x3c, 0x16, 0x70, 0xc8, 0x06, 0x68, \n  0x63, 0x04, 0x0e, 0xb8, 0x08, 0x27, 0x2d, 0x01, 0x81, 0x42, 0xfa, 0x17, 0x34, 0x04, 0x82, 0xb6, \n  0x04, 0x24, 0xda, 0xfb, 0x1b, 0xf7, 0xfe, 0x8b, 0xe6, 0x02, 0x83, 0x31, 0x01, 0x00, 0xe7, 0xff, \n  0x88, 0x24, 0x00, 0x33, 0x34, 0xff, 0x21, 0xec, 0xfe, 0xd6, 0x76, 0xff, 0x87, 0x7c, 0xff, 0x8d, \n  0x41, 0xff, 0x78, 0xad, 0xfe, 0x4f, 0x8b, 0xff, 0x52, 0x2b, 0x00, 0x7b, 0xb3, 0x00, 0xbf, 0x91, \n  0x01, 0x83, 0x5d, 0x01, 0x4b, 0xea, 0x00, 0xd8, 0x6c, 0x00, 0x4e, 0xaf, 0xff, 0xfb, 0xf3, 0xfe, \n  0x76, 0xfe, 0xfe, 0x94, 0xdd, 0xfe, 0x96, 0x0d, 0x12, 0xab, 0x34, 0x18, 0x96, 0xa2, 0x06, 0xda, \n  0xd6, 0x04, 0x00, 0x17, 0x09, 0x8f, 0xd1, 0xff, 0x18, 0xfa, 0xf9, 0xfe, 0xf0, 0x05, 0xb4, 0x66, \n  0x04, 0x12, 0x35, 0xfa, 0x24, 0xd0, 0xfe, 0xbb, 0x46, 0x03, 0xb9, 0x29, 0x01, 0x16, 0xbd, 0xff, \n  0x9b, 0x01, 0x00, 0x9e, 0x39, 0xff, 0x05, 0xca, 0xfe, 0x9b, 0x35, 0xff, 0xa6, 0x9d, 0xff, 0xf3, \n  0x23, 0xff, 0x8c, 0x7d, 0xfe, 0x24, 0x24, 0xff, 0x72, 0x6f, 0xff, 0x27, 0x9e, 0xff, 0x8e, 0x17, \n  0x00, 0xac, 0xc6, 0x00, 0x9d, 0x5b, 0x01, 0x74, 0x09, 0x01, 0xda, 0x3f, 0x00, 0xcc, 0xcd, 0xff, \n  0x9a, 0xf4, 0xff, 0x3a, 0x36, 0xff, 0xcb, 0x43, 0x14, 0xba, 0xf8, 0x19, 0x6b, 0x1e, 0x06, 0x43, \n  0xd2, 0x05, 0x3d, 0x58, 0x09, 0xff, 0xb7, 0xfd, 0x85, 0xd3, 0xf9, 0xc1, 0xdc, 0x07, 0xa2, 0xe1, \n  0x03, 0x1a, 0xb4, 0xf8, 0xda, 0x6c, 0xfe, 0xcb, 0x50, 0x03, 0xc5, 0x55, 0x01, 0xd2, 0x81, 0xff, \n  0xbd, 0xcc, 0xff, 0x02, 0xf8, 0xfe, 0x60, 0x79, 0xfe, 0xa7, 0xe6, 0xfe, 0x55, 0xe8, 0xff, 0x6e, \n  0xfd, 0xfe, 0x70, 0x40, 0xfe, 0xec, 0x13, 0xff, 0x7d, 0x8a, 0xfe, 0x80, 0x93, 0xff, 0x03, 0xdd, \n  0xff, 0x65, 0x52, 0xff, 0x01, 0xc6, 0xff, 0xd1, 0x63, 0x00, 0x92, 0xa2, 0x00, 0xa5, 0x82, 0x00, \n  0x9e, 0x36, 0x00, 0xd6, 0xc6, 0xff, 0x1a, 0xc1, 0x16, 0x25, 0xe0, 0x1b, 0x07, 0x62, 0x05, 0x8c, \n  0xa2, 0x06, 0x0f, 0x8f, 0x09, 0x81, 0xcb, 0xfb, 0x6d, 0xd3, 0xf9, 0x95, 0x79, 0x09, 0xb7, 0x29, \n  0x03, 0x0b, 0xae, 0xf7, 0xaa, 0x45, 0xfe, 0xcf, 0x02, 0x03, 0xbd, 0x42, 0x01, 0x47, 0x4f, 0xff, \n  0xbe, 0x28, 0x00, 0xf4, 0xb8, 0xfe, 0xcd, 0xa3, 0xfd, 0x26, 0xb7, 0xfe, 0x89, 0xf9, 0xff, 0x49, \n  0x2b, 0xff, 0x88, 0x17, 0xfe, 0x7e, 0xe2, 0xfe, 0x20, 0x2b, 0xfe, 0x74, 0x6f, 0xff, 0x72, 0xd1, \n  0xff, 0x2e, 0xf9, 0xfe, 0x17, 0x0c, 0xff, 0x8d, 0xfa, 0xfe, 0x1a, 0x84, 0xff, 0xa6, 0x0a, 0x00, \n  0xd3, 0x78, 0x00, 0x90, 0x20, 0x00, 0xc2, 0xbc, 0x18, 0xcf, 0xd7, 0x1d, 0xd3, 0x89, 0x05, 0x0e, \n  0x01, 0x07, 0xf9, 0xe3, 0x09, 0x9c, 0x91, 0xfa, 0x32, 0x2e, 0xf9, 0xdc, 0x4d, 0x0b, 0x4a, 0x26, \n  0x03, 0xf9, 0x3c, 0xf6, 0x6d, 0x6d, 0xfe, 0xb8, 0xe5, 0x02, 0xbe, 0x0e, 0x01, 0x54, 0x5d, 0xff, \n  0xc8, 0x0e, 0x00, 0x8a, 0x20, 0xff, 0xaa, 0x4b, 0xfd, 0x8d, 0x1b, 0xfe, 0xdc, 0x46, 0x00, 0x3c, \n  0xfd, 0xfe, 0x50, 0xc2, 0xfd, 0xb6, 0x8a, 0xff, 0xbb, 0x26, 0xfe, 0x2e, 0xe8, 0xfe, 0x7e, 0xf0, \n  0xff, 0xd1, 0xdd, 0xfe, 0xd5, 0xf8, 0xfe, 0xe9, 0xc3, 0xfe, 0xaf, 0x62, 0xfe, 0x7c, 0xd6, 0xfe, \n  0xe2, 0xc8, 0xff, 0xa5, 0x1a, 0x00, 0x15, 0x6e, 0x1a, 0x3e, 0x96, 0x1f, 0x70, 0xb3, 0x05, 0xec, \n  0x12, 0x08, 0xc4, 0x36, 0x0a, 0xe2, 0x4d, 0xf8, 0x99, 0xdd, 0xf8, 0x6c, 0x1f, 0x0d, 0xf4, 0xd6, \n  0x02, 0xba, 0x21, 0xf5, 0xe2, 0x32, 0xfe, 0x8c, 0xcc, 0x02, 0x1f, 0xd2, 0x00, 0xfe, 0x13, 0xff, \n  0xb6, 0xf0, 0xff, 0x1b, 0x6a, 0xff, 0x1a, 0x12, 0xfd, 0xa7, 0x90, 0xfd, 0xe9, 0x4c, 0x00, 0x95, \n  0xd2, 0xfe, 0x92, 0x48, 0xfd, 0xf1, 0x81, 0xff, 0x09, 0x6d, 0xfe, 0x97, 0xb9, 0xfe, 0x4a, 0x91, \n  0xff, 0x91, 0x29, 0xff, 0xa3, 0xd6, 0xfe, 0x30, 0x2c, 0xfe, 0x69, 0xfa, 0xfd, 0x94, 0x73, 0xfe, \n  0xd8, 0x52, 0xff, 0xb1, 0xdf, 0xfe, 0x2d, 0xf5, 0x1b, 0xaf, 0xab, 0x21, 0xa3, 0x34, 0x06, 0x0a, \n  0x0f, 0x08, 0x74, 0xe6, 0x0a, 0x98, 0x67, 0xf7, 0xa2, 0x00, 0xf8, 0xb3, 0x13, 0x0e, 0x75, 0x06, \n  0x03, 0x79, 0xa7, 0xf4, 0xab, 0xdf, 0xfd, 0x89, 0xc5, 0x02, 0xa6, 0x65, 0x00, 0x25, 0xfc, 0xfe, \n  0x79, 0xf7, 0xff, 0xb6, 0x7e, 0xff, 0xa9, 0x5c, 0xfd, 0x1d, 0xb3, 0xfc, 0x09, 0x3e, 0x00, 0x0f, \n  0x7f, 0xff, 0xec, 0xb6, 0xfc, 0xf7, 0x01, 0xff, 0x69, 0x84, 0xfe, 0xe0, 0xe2, 0xfe, 0x77, 0x93, \n  0xff, 0x73, 0x19, 0xff, 0xfb, 0xe4, 0xfe, 0x87, 0xcb, 0xfd, 0xfb, 0xc7, 0xfd, 0x45, 0x59, 0xfe, \n  0xec, 0xfa, 0xfe, 0xf1, 0x41, 0xfe, 0x46, 0xf8, 0x1c, 0x75, 0x77, 0x24, 0xf1, 0x2d, 0x07, 0x08, \n  0x62, 0x06, 0x6b, 0xdb, 0x0b, 0xed, 0x53, 0xf8, 0xb3, 0x53, 0xf6, 0xd9, 0x94, 0x0d, 0x28, 0x98, \n  0x03, 0x53, 0x31, 0xf5, 0xf9, 0x19, 0xfd, 0x04, 0x47, 0x02, 0xdf, 0x7a, 0x00, 0x87, 0x8a, 0xfe, \n  0x67, 0x20, 0x00, 0xeb, 0x90, 0xff, 0x18, 0x66, 0xfd, 0x7f, 0x58, 0xfc, 0x66, 0xc0, 0xff, 0x9b, \n  0xe3, 0xff, 0xd4, 0xf3, 0xfc, 0x37, 0x3c, 0xfe, 0xe5, 0x20, 0xfe, 0x1c, 0x68, 0xff, 0x77, 0x72, \n  0xff, 0x55, 0x95, 0xfe, 0xc4, 0xfd, 0xfe, 0x4f, 0xee, 0xfd, 0x3b, 0xa8, 0xfd, 0xc4, 0x0e, 0xfe, \n  0x78, 0x4c, 0xfe, 0xb1, 0x4a, 0xfe, 0x84, 0xb9, 0x1d, 0x3f, 0x2a, 0x26, 0x5f, 0x09, 0x09, 0x79, \n  0x95, 0x05, 0xf0, 0xfc, 0x0b, 0x69, 0xfe, 0xf9, 0x40, 0x7c, 0xf4, 0xff, 0x82, 0x0c, 0x4e, 0x70, \n  0x04, 0x15, 0xc3, 0xf5, 0x0b, 0xad, 0xfc, 0xce, 0x6c, 0x01, 0x97, 0x96, 0x00, 0xcd, 0x59, 0xfe, \n  0x80, 0xcf, 0xff, 0x8c, 0xca, 0xff, 0x2b, 0x9e, 0xfd, 0xfd, 0xfb, 0xfb, 0x9a, 0x51, 0xff, 0x15, \n  0x0d, 0x00, 0x41, 0xc9, 0xfc, 0x98, 0x48, 0xfe, 0x9b, 0xf1, 0xfd, 0xce, 0xf2, 0xfe, 0xa7, 0x93, \n  0xff, 0x17, 0x54, 0xfe, 0xcb, 0x96, 0xfe, 0x4f, 0x63, 0xfe, 0x4c, 0x47, 0xfd, 0x86, 0x70, 0xfd, \n  0xac, 0x9c, 0xfe, 0x7e, 0x27, 0xfe, 0x12, 0xa8, 0x1f, 0xf4, 0x30, 0x26, 0x87, 0xf9, 0x09, 0x27, \n  0x6d, 0x07, 0x61, 0xb6, 0x0b, 0x79, 0x2f, 0xfa, 0x98, 0xc3, 0xf3, 0xf9, 0x22, 0x0c, 0xbb, 0xf7, \n  0x03, 0xb3, 0xb2, 0xf6, 0x7a, 0xdd, 0xfc, 0x73, 0x57, 0x00, 0xe4, 0xde, 0x00, 0xe6, 0x32, 0xfe, \n  0x4f, 0x30, 0xff, 0x18, 0x4a, 0x00, 0x02, 0x5b, 0xfe, 0xc6, 0x7a, 0xfb, 0x0a, 0xb4, 0xfe, 0x10, \n  0x69, 0x00, 0xde, 0xe8, 0xfc, 0x3b, 0x12, 0xfe, 0x20, 0xf3, 0xfd, 0xac, 0xa5, 0xfe, 0xed, 0x70, \n  0xff, 0x80, 0x79, 0xfe, 0x83, 0x7e, 0xfe, 0x86, 0xe7, 0xfd, 0xa9, 0x17, 0xfd, 0x4c, 0x3d, 0xfd, \n  0xb2, 0x41, 0xff, 0x9a, 0x07, 0xfe, 0x17, 0xcd, 0x22, 0x64, 0xd5, 0x24, 0x24, 0x16, 0x09, 0x59, \n  0xa4, 0x0b, 0x67, 0xc8, 0x0b, 0xa4, 0x65, 0xf8, 0x07, 0x0d, 0xf4, 0x66, 0x60, 0x0c, 0x1a, 0xb0, \n  0x01, 0xe4, 0xfb, 0xf7, 0xda, 0xdf, 0xfd, 0xf6, 0xf2, 0xfe, 0x44, 0xa3, 0x00, 0x1a, 0x1f, 0xfe, \n  0xe3, 0xad, 0xfe, 0x25, 0x4d, 0x00, 0x97, 0x67, 0xff, 0x4c, 0xeb, 0xfa, 0x09, 0xd7, 0xfd, 0x03, \n  0xbb, 0x00, 0xa6, 0x7b, 0xfd, 0x7b, 0x46, 0xfd, 0x5b, 0xb8, 0xfd, 0x2f, 0xdf, 0xfe, 0xdb, 0xf9, \n  0xfe, 0xd2, 0x99, 0xfe, 0xcc, 0x68, 0xfe, 0xd1, 0x1b, 0xfd, 0xbc, 0xb4, 0xfc, 0x43, 0xeb, 0xfd, \n  0xfc, 0xf7, 0xfe, 0x8f, 0xc2, 0xfd, 0xf3, 0xd2, 0x24, 0xf4, 0x51, 0x23, 0x1a, 0x8b, 0x08, 0x64, \n  0xa5, 0x0f, 0xb0, 0x40, 0x0e, 0xd1, 0x59, 0xf6, 0xe9, 0xa6, 0xf2, 0x83, 0xc1, 0x0e, 0xcd, 0x87, \n  0xfe, 0xe2, 0xea, 0xf7, 0xd3, 0x0f, 0x01, 0x56, 0xd1, 0xfd, 0x2f, 0xd3, 0xfe, 0xfc, 0xe7, 0xfe, \n  0x4b, 0xa4, 0xfe, 0xab, 0x33, 0xff, 0x07, 0x90, 0x01, 0x7c, 0x48, 0xfa, 0x16, 0xc6, 0xfc, 0x1e, \n  0x79, 0x01, 0xd1, 0xbe, 0xfd, 0xcd, 0x0c, 0xfd, 0xa2, 0x2c, 0xfd, 0x5f, 0x38, 0xff, 0x74, 0xbd, \n  0xfe, 0xe1, 0x7d, 0xfe, 0x4f, 0x1c, 0xfe, 0x5d, 0x14, 0xfd, 0x03, 0xb2, 0xfc, 0x79, 0xb1, 0xfd, \n  0x51, 0xba, 0xfe, 0x3b, 0xc5, 0xfd, 0xa0, 0x7a, 0x27, 0x43, 0xd4, 0x20, 0xdd, 0x7d, 0x05, 0x5f, \n  0x77, 0x17, 0xd6, 0x90, 0x10, 0x94, 0xfa, 0xf0, 0x91, 0xa3, 0xf4, 0xb8, 0x1f, 0x12, 0xc1, 0x82, \n  0xf8, 0x45, 0x6b, 0xf7, 0x5b, 0x83, 0x05, 0x57, 0x51, 0xfd, 0xb9, 0x19, 0xfd, 0x9a, 0x45, 0xfe, \n  0x07, 0x61, 0xff, 0x0d, 0x0c, 0xfe, 0x0c, 0xb5, 0x02, 0xfc, 0x44, 0xfb, 0xdc, 0x14, 0xfb, 0x23, \n  0xa4, 0x01, 0x3b, 0x54, 0xfe, 0xc6, 0x14, 0xfd, 0x6c, 0x03, 0xfd, 0x3e, 0x35, 0xff, 0x51, 0x37, \n  0xfe, 0x0f, 0x67, 0xfe, 0x61, 0xcd, 0xfd, 0x25, 0xe0, 0xfd, 0x78, 0x58, 0xfc, 0x9a, 0x72, 0xfc, \n  0x04, 0x60, 0xff, 0xff, 0x1e, 0xfd, 0x0f, 0xc0, 0x2a, 0xb1, 0xc7, 0x20, 0x05, 0x32, 0x00, 0x79, \n  0xbf, 0x1b, 0xd4, 0x8d, 0x14, 0x5d, 0xa6, 0xed, 0xda, 0x4e, 0xf6, 0x3c, 0xdd, 0x14, 0x47, 0x9f, \n  0xf2, 0xa6, 0xe2, 0xf5, 0x42, 0x7d, 0x0a, 0x57, 0x68, 0xfd, 0xcb, 0x32, 0xfb, 0x83, 0x6b, 0xfd, \n  0xf6, 0x99, 0x00, 0x04, 0xe1, 0xfc, 0x86, 0x55, 0x02, 0xdc, 0x87, 0xfd, 0x27, 0x96, 0xf9, 0xca, \n  0x13, 0x01, 0xe8, 0x57, 0xff, 0xd3, 0x0f, 0xfd, 0x0b, 0xef, 0xfc, 0x5c, 0x5c, 0xff, 0xe0, 0xff, \n  0xfd, 0xc0, 0xd5, 0xfd, 0xf6, 0xcc, 0xfd, 0x81, 0xcf, 0xfd, 0x2a, 0x99, 0xfc, 0xf7, 0x0f, 0xfc, \n  0x90, 0x77, 0xfe, 0xf1, 0xc9, 0xfc, 0x11, 0x77, 0x2f, 0x5f, 0x22, 0x22, 0x3b, 0x7f, 0xf9, 0x98, \n  0xb6, 0x1b, 0x57, 0x4e, 0x1a, 0x83, 0x92, 0xec, 0x88, 0xc3, 0xf6, 0x1b, 0xd4, 0x16, 0x75, 0xd8, \n  0xed, 0x76, 0xdb, 0xf3, 0xb4, 0x8a, 0x0e, 0xd9, 0x77, 0xfe, 0x5c, 0x1d, 0xf9, 0xe2, 0x7e, 0xfc, \n  0xbd, 0xea, 0x01, 0x29, 0x6c, 0xfc, 0xd8, 0x4d, 0x00, 0x4c, 0xc4, 0xff, 0x23, 0xa5, 0xf9, 0xfb, \n  0x3b, 0xff, 0xa2, 0xa9, 0x00, 0xcb, 0x15, 0xfd, 0xa6, 0xe0, 0xfc, 0xf6, 0x1c, 0x00, 0xa4, 0x44, \n  0xfd, 0xc5, 0xa0, 0xfd, 0xf2, 0xb5, 0xfd, 0xa8, 0xb2, 0xfc, 0x13, 0x77, 0xfd, 0x7e, 0x2a, 0xfc, \n  0x0d, 0x95, 0xfc, 0x3e, 0x32, 0xfd, 0x46, 0x8a, 0x34, 0xde, 0xec, 0x23, 0xfc, 0x99, 0xf2, 0x27, \n  0x81, 0x1a, 0xb5, 0xc6, 0x1e, 0xd2, 0x3b, 0xed, 0xc4, 0xf4, 0xf7, 0xbc, 0xac, 0x17, 0x77, 0x06, \n  0xea, 0x72, 0x4f, 0xf1, 0x46, 0x26, 0x11, 0xd9, 0xf2, 0x00, 0xb0, 0x32, 0xf7, 0xf5, 0x12, 0xfb, \n  0x42, 0x15, 0x03, 0x2a, 0x8a, 0xfc, 0xcc, 0x2a, 0xfe, 0x01, 0x71, 0x00, 0xce, 0x4d, 0xfb, 0xea, \n  0x3b, 0xfd, 0x9b, 0xe7, 0x00, 0x7a, 0xfb, 0xfd, 0x13, 0xd0, 0xfc, 0xab, 0x06, 0x01, 0xb3, 0xaa, \n  0xfc, 0xac, 0x35, 0xfd, 0x3a, 0x40, 0xfd, 0xa8, 0x2a, 0xfc, 0x0b, 0x4f, 0xfd, 0x8d, 0x25, 0xfc, \n  0x2a, 0x59, 0xfc, 0xb9, 0xda, 0xfc, 0x6f, 0xdb, 0x38, 0xc2, 0x8d, 0x26, 0x02, 0xaf, 0xed, 0x74, \n  0xc6, 0x15, 0x64, 0xc2, 0x22, 0xe6, 0x84, 0xf0, 0x8e, 0x24, 0xf8, 0x8b, 0x3e, 0x19, 0xf1, 0xc2, \n  0xe6, 0xad, 0x78, 0xee, 0x09, 0x39, 0x12, 0x35, 0x32, 0x04, 0x7e, 0x56, 0xf6, 0x00, 0xf4, 0xf8, \n  0x10, 0x10, 0x04, 0xe6, 0x20, 0xfd, 0xa2, 0x86, 0xfc, 0xc6, 0x71, 0xff, 0x60, 0xb4, 0xfd, 0xcc, \n  0x39, 0xfc, 0x03, 0xcf, 0xff, 0xda, 0xa9, 0xff, 0x2f, 0xcb, 0xfc, 0x89, 0xec, 0x01, 0x97, 0x7c, \n  0xfc, 0x16, 0x5f, 0xfc, 0x04, 0x07, 0xfd, 0xad, 0x95, 0xfb, 0x3a, 0x7c, 0xfc, 0xfb, 0x5e, 0xfc, \n  0x18, 0x45, 0xfd, 0x3c, 0x24, 0xfc, 0xf4, 0x88, 0x3c, 0x67, 0xe0, 0x29, 0xf8, 0x31, 0xea, 0x81, \n  0x9b, 0x0f, 0x64, 0xb2, 0x24, 0xcd, 0x00, 0xf5, 0xca, 0xd1, 0xf8, 0xfc, 0x17, 0x1b, 0xb2, 0xc5, \n  0xe3, 0xc0, 0xce, 0xeb, 0xc7, 0x0f, 0x12, 0xa4, 0x26, 0x07, 0xe1, 0x9f, 0xf6, 0x50, 0xb8, 0xf6, \n  0xc2, 0x56, 0x04, 0x3a, 0xef, 0xfd, 0x18, 0xc8, 0xfb, 0x52, 0x4e, 0xfd, 0x0f, 0x6f, 0xff, 0x06, \n  0xa3, 0xfc, 0x7f, 0x39, 0xfe, 0xec, 0x0d, 0x01, 0x73, 0xa1, 0xfd, 0x7f, 0xf0, 0x01, 0x22, 0x6b, \n  0xfc, 0x6e, 0x2b, 0xfc, 0x9c, 0x90, 0xfc, 0xb2, 0x97, 0xfa, 0xfb, 0xef, 0xfb, 0x0b, 0x7d, 0xfc, \n  0x49, 0x17, 0xfe, 0x42, 0x60, 0xfc, 0xd6, 0x21, 0x43, 0xc2, 0x15, 0x2a, 0xff, 0x02, 0xe6, 0x8d, \n  0x6e, 0x0d, 0x14, 0x02, 0x23, 0xfd, 0x46, 0xf6, 0x4a, 0xc7, 0xfe, 0xa7, 0x39, 0x1b, 0xd2, 0x1b, \n  0xdf, 0x8c, 0xdb, 0xeb, 0x21, 0x5a, 0x11, 0x00, 0xa2, 0x08, 0x90, 0x10, 0xf7, 0x98, 0x8c, 0xf5, \n  0x8b, 0x0d, 0x04, 0xe7, 0x2d, 0xfe, 0xad, 0xdf, 0xfb, 0x03, 0x56, 0xfb, 0x40, 0x8e, 0xff, 0xf2, \n  0xd0, 0xfd, 0xce, 0x82, 0xfd, 0xdf, 0x8b, 0x01, 0x0b, 0x72, 0xff, 0x25, 0xfc, 0x00, 0xb7, 0x1a, \n  0xfc, 0x17, 0xfb, 0xfc, 0xa2, 0x63, 0xfb, 0x0a, 0xfb, 0xf9, 0x1e, 0x72, 0xfb, 0x56, 0x41, 0xfc, \n  0x8e, 0xe4, 0xfe, 0x9a, 0xb6, 0xfd, 0xfa, 0x0a, 0x48, 0xf9, 0xc5, 0x2c, 0xe0, 0x36, 0xe1, 0x3a, \n  0xf9, 0x0b, 0xd8, 0x35, 0x20, 0x44, 0xe9, 0xf6, 0xa8, 0x73, 0x04, 0x35, 0xd0, 0x1c, 0x0e, 0x61, \n  0xdb, 0x13, 0xad, 0xea, 0x77, 0x84, 0x11, 0x03, 0x04, 0x09, 0x69, 0xec, 0xf7, 0x05, 0x2f, 0xf5, \n  0xac, 0x00, 0x03, 0x80, 0x52, 0xfe, 0x34, 0x69, 0xfc, 0xbf, 0x2c, 0xfa, 0xe4, 0x61, 0xfe, 0x5d, \n  0xc4, 0xfe, 0xdf, 0x32, 0xfe, 0xbd, 0xe8, 0x01, 0x0b, 0xb7, 0x00, 0x25, 0x00, 0x00, 0x61, 0x69, \n  0xfc, 0x18, 0x67, 0xfd, 0x45, 0x9a, 0xfa, 0x56, 0xc8, 0xf9, 0x0d, 0x9b, 0xfa, 0xbc, 0x1f, 0xfc, \n  0x61, 0xbb, 0xff, 0xf3, 0x3a, 0xff, 0xbd, 0x4b, 0x4e, 0x1b, 0x57, 0x2d, 0x6a, 0x21, 0xdd, 0xf8, \n  0x56, 0x0b, 0xc4, 0x4f, 0x1d, 0x12, 0x8e, 0xf4, 0x0b, 0xee, 0x0a, 0xfe, 0xee, 0x1e, 0xc1, 0x44, \n  0xd7, 0xa2, 0xdf, 0xe9, 0xb9, 0x1f, 0x12, 0xbb, 0x7a, 0x08, 0xbe, 0xd3, 0xf7, 0x2a, 0x3f, 0xf6, \n  0x64, 0x3e, 0x01, 0x10, 0xa0, 0xfd, 0x64, 0x70, 0xfd, 0x8a, 0x79, 0xf9, 0x46, 0xe2, 0xfc, 0x3d, \n  0x60, 0xfe, 0x09, 0xfe, 0xff, 0xf7, 0x05, 0x03, 0x86, 0x20, 0x00, 0xa6, 0xa6, 0xff, 0xc5, 0x37, \n  0xfd, 0x01, 0xec, 0xfc, 0x1c, 0x6a, 0xfa, 0x9e, 0x83, 0xf9, 0x26, 0xa0, 0xf9, 0x77, 0x56, 0xfc, \n  0x44, 0xf0, 0xff, 0xda, 0x9a, 0x00, 0x56, 0x6d, 0x52, 0x6a, 0xbb, 0x30, 0x4e, 0xf8, 0xd8, 0x53, \n  0x48, 0x0a, 0x28, 0x24, 0x1b, 0x55, 0xf4, 0xf1, 0x7a, 0x26, 0x0e, 0xa8, 0xac, 0x23, 0x5c, 0xdd, \n  0xd4, 0x7e, 0x67, 0xe7, 0xa8, 0x47, 0x13, 0x6e, 0x98, 0x07, 0x4e, 0xd2, 0xf7, 0x6c, 0xb6, 0xf7, \n  0xea, 0xa1, 0xff, 0x9a, 0x0f, 0xfc, 0x80, 0x13, 0xff, 0xe4, 0x21, 0xf9, 0x98, 0xa7, 0xfb, 0xb5, \n  0x74, 0xfd, 0x7a, 0x5c, 0x01, 0x70, 0xc6, 0x05, 0x21, 0x15, 0xfe, 0x58, 0xe0, 0xff, 0x14, 0xc0, \n  0xfe, 0x40, 0xb3, 0xfb, 0x64, 0x26, 0xfb, 0xeb, 0x14, 0xf9, 0x4c, 0xf2, 0xf8, 0x9d, 0x45, 0xfc, \n  0x16, 0xf2, 0xff, 0x9f, 0x55, 0x01, 0xff, 0xcc, 0x56, 0x76, 0xfe, 0x32, 0x37, 0x44, 0xd6, 0xe9, \n  0xa1, 0x08, 0xf0, 0xf0, 0x19, 0xb9, 0x41, 0xee, 0x1f, 0x65, 0x0f, 0x67, 0xf7, 0x28, 0x90, 0x32, \n  0xd3, 0x40, 0xa7, 0xe5, 0x2d, 0x89, 0x13, 0x11, 0xa5, 0x06, 0x1d, 0xc2, 0xf7, 0x54, 0x3a, 0xf9, \n  0xcb, 0x25, 0xfe, 0x9b, 0x15, 0xfa, 0xa0, 0xaf, 0x00, 0xab, 0x99, 0xf8, 0xb9, 0x66, 0xfb, 0xe0, \n  0x13, 0xfc, 0x52, 0xb9, 0x01, 0x73, 0x3a, 0x09, 0xdd, 0x18, 0xfc, 0x80, 0xa7, 0xff, 0x50, 0xd0, \n  0x00, 0x6c, 0x5b, 0xfa, 0x84, 0xd5, 0xfb, 0xec, 0x4b, 0xf9, 0x23, 0x9c, 0xf7, 0x5c, 0x47, 0xfc, \n  0x03, 0x49, 0xff, 0xa6, 0x7a, 0x01, 0x9f, 0x78, 0x5a, 0xcd, 0xf1, 0x34, 0x80, 0x24, 0xd5, 0x80, \n  0x54, 0x06, 0x3c, 0xbb, 0x19, 0x96, 0x33, 0xea, 0x3b, 0x6f, 0x0e, 0x4a, 0x66, 0x2e, 0xe0, 0xc7, \n  0xd2, 0x4b, 0x17, 0xe5, 0xec, 0x47, 0x12, 0xd9, 0x8f, 0x05, 0x7f, 0x92, 0xf8, 0x9f, 0x0f, 0xfa, \n  0xb1, 0xbc, 0xfc, 0xd9, 0x9c, 0xf8, 0x1e, 0xab, 0x01, 0x42, 0x19, 0xf8, 0x58, 0x18, 0xfc, 0x6e, \n  0xb4, 0xfa, 0xa0, 0xf0, 0x00, 0xe5, 0x48, 0x0c, 0x18, 0xc8, 0xfb, 0x09, 0x72, 0xfe, 0xa3, 0x31, \n  0x03, 0x3e, 0xfd, 0xf9, 0xf0, 0xa8, 0xfb, 0xcf, 0x33, 0xfa, 0xd9, 0xe5, 0xf5, 0x29, 0xd4, 0xfb, \n  0xdb, 0x2e, 0xfe, 0x6b, 0x48, 0x01, 0x84, 0xb0, 0x5d, 0x2e, 0x51, 0x36, 0x74, 0x7a, 0xd4, 0x59, \n  0xc5, 0x05, 0x3c, 0x20, 0x18, 0x36, 0xc9, 0xe6, 0xdb, 0x7d, 0x0c, 0xdd, 0xce, 0x31, 0xb1, 0x00, \n  0xd4, 0xc3, 0xbe, 0xe5, 0x3d, 0x42, 0x10, 0x57, 0x76, 0x03, 0x36, 0xaa, 0xfa, 0x60, 0x1d, 0xfa, \n  0x18, 0xd1, 0xfa, 0x77, 0x4a, 0xf8, 0x4e, 0xe6, 0x01, 0x56, 0xc1, 0xf7, 0x83, 0x19, 0xfd, 0xf1, \n  0xb1, 0xf9, 0x40, 0x73, 0xff, 0x77, 0xd1, 0x0d, 0x22, 0x53, 0xfd, 0xfb, 0x31, 0xfd, 0xe4, 0xbe, \n  0x04, 0xf3, 0x47, 0xfb, 0xeb, 0x5b, 0xfa, 0x4c, 0x0c, 0xfb, 0xcd, 0x3c, 0xf4, 0xc6, 0xe9, 0xfa, \n  0x5d, 0x24, 0xfd, 0x11, 0x48, 0x00, 0xef, 0xcd, 0x60, 0x16, 0x53, 0x37, 0x3a, 0x1a, 0xd4, 0x43, \n  0x8b, 0x07, 0xc5, 0x9c, 0x14, 0xc1, 0x36, 0xe4, 0x46, 0xcd, 0x0a, 0xe7, 0x66, 0x32, 0x9e, 0x56, \n  0xd7, 0xc5, 0x03, 0xe7, 0xa3, 0x9a, 0x0d, 0x66, 0x28, 0x01, 0x79, 0x98, 0xfd, 0x08, 0xfb, 0xf9, \n  0x69, 0xa0, 0xf8, 0x1e, 0xf0, 0xf8, 0x6f, 0x80, 0x02, 0xd2, 0x1d, 0xf7, 0x6e, 0x60, 0xfe, 0xec, \n  0x6a, 0xf9, 0x63, 0x89, 0xfd, 0x5f, 0x9b, 0x0d, 0x43, 0x71, 0x00, 0x76, 0x71, 0xfd, 0x79, 0x61, \n  0x04, 0xc1, 0x22, 0xfe, 0x4e, 0xb2, 0xf8, 0xf3, 0x85, 0xfa, 0x51, 0xea, 0xf3, 0xe5, 0xe7, 0xf9, \n  0x85, 0xaa, 0xfb, 0x4a, 0x66, 0xff, 0x60, 0x9f, 0x5f, 0xdb, 0x73, 0x3b, 0x70, 0x12, 0xd7, 0x59, \n  0xd9, 0x04, 0xa7, 0x1c, 0x14, 0xd3, 0x29, 0xe2, 0x76, 0x6f, 0x05, 0x40, 0x48, 0x33, 0xd9, 0xbf, \n  0xdc, 0xa5, 0xa9, 0xe7, 0xd5, 0xb5, 0x09, 0xed, 0xda, 0xff, 0x4f, 0xf6, 0xff, 0x42, 0xa7, 0xf9, \n  0x9f, 0x38, 0xf7, 0x6a, 0x0b, 0xf9, 0x07, 0xed, 0x03, 0xc5, 0x27, 0xf6, 0x36, 0xca, 0xfe, 0xd2, \n  0xdf, 0xfa, 0x19, 0x7d, 0xfa, 0x5f, 0x5b, 0x0b, 0x42, 0x6c, 0x05, 0x23, 0xba, 0xfe, 0x3d, 0x1e, \n  0x02, 0xb5, 0x75, 0x01, 0x31, 0xb0, 0xf6, 0x0f, 0xd9, 0xf9, 0x5c, 0xbc, 0xf4, 0x69, 0xdf, 0xf7, \n  0xc9, 0x5c, 0xfb, 0xfa, 0x9e, 0xfd, 0xf5, 0x28, 0x5b, 0xbc, 0x11, 0x41, 0x68, 0x03, 0xde, 0x6d, \n  0x05, 0xff, 0xbc, 0xc3, 0x14, 0xd7, 0x74, 0xe2, 0x09, 0x1e, 0xfc, 0x1a, 0xdf, 0x33, 0xb3, 0xca, \n  0xe4, 0x52, 0x9d, 0xe6, 0x8f, 0xd4, 0x06, 0x11, 0x45, 0xfe, 0x83, 0x51, 0x01, 0xe8, 0xa8, 0xfa, \n  0xe8, 0xd6, 0xf5, 0x4c, 0x9f, 0xf9, 0xfe, 0xdd, 0x04, 0x08, 0xa4, 0xf5, 0x2c, 0xd8, 0xfe, 0x26, \n  0x85, 0xfc, 0xa4, 0x8f, 0xf8, 0xc6, 0x8a, 0x07, 0x57, 0x90, 0x09, 0x90, 0x0c, 0x02, 0x1b, 0x86, \n  0xfe, 0x8d, 0xf2, 0x02, 0x7a, 0x8a, 0xf7, 0x95, 0x66, 0xf8, 0x76, 0x98, 0xf5, 0x15, 0x17, 0xf7, \n  0xbd, 0xe6, 0xfa, 0xa8, 0x43, 0xfc, 0x50, 0xb8, 0x58, 0x6c, 0x73, 0x43, 0xee, 0xd4, 0xe3, 0xbb, \n  0x82, 0xfe, 0xad, 0x31, 0x11, 0xb1, 0x45, 0xe4, 0x80, 0xf1, 0xf4, 0xde, 0x6f, 0x30, 0xdb, 0x04, \n  0xee, 0xf8, 0x2d, 0xe5, 0xd3, 0x93, 0x05, 0x88, 0x38, 0xfc, 0xa8, 0x99, 0x01, 0xd3, 0xfe, 0xfc, \n  0x17, 0xf3, 0xf4, 0x6b, 0xfe, 0xf9, 0xce, 0x94, 0x05, 0x82, 0x51, 0xf5, 0xb9, 0xff, 0xfe, 0x25, \n  0x04, 0xfe, 0x6f, 0xe6, 0xf7, 0xf6, 0xf1, 0x04, 0x05, 0x5d, 0x09, 0x06, 0xbb, 0x05, 0xf7, 0xa1, \n  0xfc, 0xee, 0xb9, 0x02, 0xa5, 0xd0, 0xf9, 0x9e, 0x5e, 0xf7, 0x1b, 0x71, 0xf6, 0x6b, 0x37, 0xf7, \n  0xe6, 0x3f, 0xfb, 0x0e, 0x00, 0xfb, 0xab, 0x6c, 0x59, 0x34, 0xc4, 0x42, 0xb8, 0x08, 0xe5, 0x3b, \n  0xf4, 0x05, 0x74, 0xdb, 0x09, 0xdc, 0x6e, 0xe3, 0x30, 0x45, 0xf4, 0xbc, 0x9e, 0x28, 0x22, 0x44, \n  0xf5, 0x14, 0x9d, 0xe6, 0x78, 0x4f, 0x03, 0xa8, 0x4f, 0xfa, 0xdb, 0xde, 0x02, 0x73, 0xf9, 0xfd, \n  0x8c, 0x0f, 0xf6, 0xec, 0x82, 0xf9, 0xa0, 0x36, 0x05, 0x99, 0xe9, 0xf6, 0xce, 0xb3, 0xfd, 0x87, \n  0x88, 0x00, 0xfd, 0x1a, 0xf8, 0x93, 0xa9, 0x02, 0x4f, 0x53, 0x05, 0xaf, 0x26, 0x08, 0xc3, 0xfa, \n  0xfe, 0x40, 0x37, 0x00, 0x7e, 0xf9, 0xfc, 0xee, 0x67, 0xf7, 0x38, 0x87, 0xf6, 0xe1, 0x6c, 0xf9, \n  0xff, 0x00, 0xfb, 0xea, 0x61, 0xf8, 0x7b, 0xae, 0x59, 0xea, 0x6a, 0x42, 0x68, 0xb2, 0xe4, 0x27, \n  0xfc, 0x0e, 0x57, 0x3b, 0x03, 0x40, 0x58, 0xe0, 0xce, 0x76, 0xf6, 0x26, 0x29, 0x1f, 0x09, 0x14, \n  0xfb, 0xdc, 0x11, 0xea, 0xbd, 0x22, 0xff, 0xe2, 0xf6, 0xf9, 0x20, 0x17, 0x05, 0xc2, 0x4b, 0xfd, \n  0xba, 0x96, 0xf8, 0xc4, 0x65, 0xf8, 0x40, 0xa0, 0x03, 0xd4, 0xe4, 0xfa, 0x26, 0x35, 0xfb, 0xa0, \n  0x27, 0x03, 0xa2, 0xdf, 0xf8, 0x2a, 0x01, 0xfe, 0x3f, 0x44, 0x02, 0x23, 0xb7, 0x08, 0x20, 0x86, \n  0x02, 0xcc, 0x0a, 0x00, 0x68, 0x8f, 0xfd, 0x7a, 0xca, 0xf9, 0x62, 0xac, 0xf7, 0x35, 0x1d, 0xf9, \n  0xf0, 0xde, 0xfa, 0x33, 0xfa, 0xf7, 0xde, 0x0b, 0x59, 0x40, 0xd1, 0x41, 0xf0, 0xfb, 0xe5, 0x96, \n  0x0d, 0x15, 0x69, 0x32, 0xff, 0x1d, 0xf0, 0xdc, 0x55, 0xe3, 0xf7, 0xf4, 0x61, 0x16, 0xaf, 0x75, \n  0xff, 0x46, 0x5f, 0xee, 0xe9, 0x29, 0xfa, 0x60, 0x34, 0xfb, 0xcb, 0xaa, 0x07, 0xe9, 0x54, 0xfb, \n  0x90, 0x21, 0xfb, 0x57, 0x66, 0xf8, 0x78, 0x81, 0x00, 0xf4, 0x88, 0x00, 0x7f, 0x1e, 0xf9, 0xf8, \n  0x75, 0x01, 0xa2, 0x7e, 0xfb, 0x73, 0x5d, 0xfa, 0xc7, 0xd9, 0xfe, 0xe9, 0xb9, 0x08, 0xee, 0x6a, \n  0x05, 0x60, 0xe1, 0x01, 0xd0, 0x57, 0xfe, 0x9a, 0xe7, 0xfb, 0x1f, 0xdc, 0xf7, 0x82, 0xb3, 0xf8, \n  0xc2, 0x0a, 0xfc, 0x82, 0xe3, 0xf7, 0x90, 0x8d, 0x56, 0x19, 0xdb, 0x41, 0x9d, 0x9c, 0xe9, 0x70, \n  0x02, 0x17, 0xad, 0x05, 0xfe, 0xfd, 0xd2, 0xdb, 0xf5, 0xdc, 0xf5, 0x6e, 0x58, 0x0f, 0x40, 0x97, \n  0x03, 0xb8, 0xb0, 0xf1, 0xe7, 0xf1, 0xf6, 0x76, 0xaf, 0xfc, 0xbb, 0xa9, 0x09, 0x2a, 0x40, 0xfa, \n  0xad, 0xdb, 0xfb, 0x2c, 0x61, 0xfa, 0xda, 0x3a, 0xfe, 0xc9, 0x60, 0x02, 0x56, 0x68, 0xf9, 0xfa, \n  0x7d, 0xfd, 0xab, 0xf9, 0xfc, 0x90, 0xe6, 0xfb, 0x58, 0x3c, 0xfb, 0x41, 0x53, 0x06, 0x96, 0xaf, \n  0x07, 0x28, 0x47, 0x07, 0x3b, 0x41, 0xfd, 0x8d, 0x33, 0xfb, 0x3a, 0x0b, 0xfc, 0x27, 0xa6, 0xf7, \n  0x04, 0x57, 0xfb, 0x67, 0xec, 0xf8, 0xbf, 0xad, 0x53, 0xaa, 0xb5, 0x41, 0x88, 0x48, 0xed, 0x78, \n  0xf4, 0x17, 0x2c, 0x82, 0xfd, 0x51, 0xa8, 0xdc, 0xa1, 0xc0, 0xf2, 0xb7, 0x41, 0x08, 0x32, 0x49, \n  0x08, 0xa9, 0xec, 0xf4, 0x5b, 0xda, 0xf3, 0xa8, 0x73, 0xff, 0x9e, 0x52, 0x0a, 0xf7, 0xc4, 0xf9, \n  0x66, 0x78, 0xfd, 0x14, 0x22, 0xfb, 0x20, 0x66, 0xfc, 0x41, 0x57, 0x02, 0x10, 0x79, 0xf9, 0xa7, \n  0x1b, 0xfb, 0x3c, 0x69, 0xfd, 0x52, 0xce, 0xff, 0x48, 0x91, 0xf8, 0x31, 0x31, 0x05, 0x14, 0xfe, \n  0x07, 0x92, 0x10, 0x08, 0xde, 0x0f, 0x01, 0x1d, 0x35, 0xfa, 0xb3, 0xe1, 0xfd, 0x2e, 0xcf, 0xf7, \n  0x1e, 0x7b, 0xfb, 0xad, 0x90, 0xf9, 0x9c, 0x73, 0x53, 0x52, 0x35, 0x3d, 0xae, 0x59, 0xf1, 0x9e, \n  0x67, 0x19, 0x9d, 0xed, 0xfa, 0x91, 0xdf, 0xdf, 0xb5, 0x0c, 0xef, 0xea, 0xd5, 0x01, 0xdd, 0x36, \n  0x0c, 0xd7, 0xd3, 0xf8, 0xbd, 0x9a, 0xf0, 0xec, 0xa8, 0x01, 0x9b, 0x74, 0x0c, 0xbb, 0xc1, 0xf8, \n  0xde, 0xaf, 0xfd, 0xb2, 0x9c, 0xfa, 0x74, 0x29, 0xfc, 0xbc, 0x46, 0x00, 0x2f, 0xec, 0xf8, 0xda, \n  0x0b, 0xfd, 0x64, 0x80, 0xfb, 0x17, 0xea, 0x01, 0x6b, 0xf4, 0xfc, 0x2c, 0x06, 0x02, 0xca, 0x32, \n  0x04, 0xdd, 0x34, 0x08, 0xf4, 0x3e, 0x06, 0xdb, 0xc0, 0xf9, 0x6d, 0x15, 0xfc, 0x01, 0xa3, 0xfb, \n  0x6a, 0x4b, 0xfb, 0x90, 0xef, 0xf8, 0xc6, 0x68, 0x4f, 0x29, 0x2e, 0x3b, 0x59, 0x71, 0xf7, 0xa5, \n  0xe1, 0x17, 0xb8, 0x22, 0xf9, 0x84, 0x3b, 0xe7, 0x0c, 0x67, 0xe8, 0x0d, 0x9a, 0xfa, 0x75, 0x86, \n  0x13, 0x91, 0xd3, 0xfa, 0xa1, 0x5a, 0xed, 0xb4, 0xb2, 0x05, 0xa7, 0x3f, 0x0c, 0xd5, 0xfa, 0xf7, \n  0x58, 0x96, 0xfe, 0x37, 0x84, 0xf7, 0x9b, 0xa6, 0xfc, 0xa5, 0x6b, 0x01, 0x1b, 0x63, 0xf5, 0xf4, \n  0xe1, 0xff, 0xe6, 0xe3, 0xfd, 0xb5, 0xa0, 0xff, 0xf0, 0xc4, 0x01, 0xac, 0x60, 0x01, 0xde, 0xf5, \n  0xff, 0x60, 0x1d, 0x07, 0xfa, 0x15, 0x06, 0xdc, 0xee, 0xfd, 0xa7, 0x7d, 0xfc, 0x4a, 0x55, 0xfb, \n  0x90, 0x88, 0xfd, 0x17, 0xbe, 0xf8, 0xb8, 0x5f, 0x4e, 0x34, 0x97, 0x36, 0xfa, 0xd1, 0xfb, 0xd5, \n  0x00, 0x17, 0x1d, 0xad, 0xf4, 0xac, 0xbb, 0xef, 0x0c, 0xa5, 0xe6, 0x14, 0x4c, 0xf1, 0x62, 0xf3, \n  0x18, 0xed, 0xc0, 0xff, 0x06, 0x39, 0xea, 0xb3, 0xab, 0x07, 0x3a, 0x6f, 0x0c, 0x3b, 0x5c, 0xf6, \n  0x71, 0x00, 0xfe, 0xd9, 0x55, 0xf6, 0x91, 0x57, 0xfe, 0x2f, 0xb4, 0x00, 0xf2, 0x01, 0xf4, 0xba, \n  0xe5, 0x02, 0x60, 0x9a, 0x00, 0xb1, 0xca, 0xfc, 0x3b, 0x74, 0x03, 0xb9, 0x44, 0x04, 0x4f, 0x56, \n  0xfd, 0xfc, 0x95, 0x03, 0x38, 0xc7, 0x03, 0xba, 0xa4, 0x01, 0x6c, 0xb8, 0xff, 0x98, 0xfc, 0xf9, \n  0x11, 0xf8, 0xfe, 0xf2, 0x8f, 0xfa, 0x73, 0xad, 0x52, 0x95, 0x3b, 0x31, 0xbd, 0xab, 0xf5, 0x2c, \n  0x0f, 0x1c, 0x60, 0xbc, 0xf2, 0x74, 0xd6, 0xee, 0x4d, 0x22, 0xea, 0xb8, 0x9d, 0xf0, 0xfa, 0x69, \n  0x17, 0x59, 0xf9, 0x01, 0x09, 0x80, 0xec, 0x88, 0x4b, 0x06, 0x43, 0x49, 0x0c, 0xda, 0xae, 0xf4, \n  0x89, 0xaa, 0xfc, 0xc1, 0xfc, 0xf7, 0xa9, 0xc6, 0xfe, 0x31, 0x5d, 0x01, 0xec, 0x97, 0xf4, 0xe0, \n  0xcc, 0x02, 0x74, 0xcf, 0x01, 0xce, 0x73, 0xfe, 0x2f, 0x50, 0x03, 0x84, 0xb5, 0x03, 0xda, 0xae, \n  0xfd, 0xa8, 0x18, 0x01, 0xba, 0xb2, 0x02, 0x4a, 0xf7, 0x00, 0x2a, 0x06, 0x02, 0x1f, 0x3a, 0xfd, \n  0x14, 0xbd, 0xfc, 0x24, 0x6d, 0xfd, 0x3d, 0xa6, 0x56, 0x6f, 0x27, 0x2a, 0x5e, 0x74, 0xed, 0xb4, \n  0xce, 0x25, 0x2c, 0x32, 0xf1, 0xf3, 0xd4, 0xe7, 0x0d, 0x51, 0xf1, 0x1c, 0x63, 0xf3, 0xc6, 0x8d, \n  0x12, 0x01, 0xce, 0x03, 0x24, 0x4f, 0xed, 0xd5, 0x47, 0x03, 0xcf, 0xfa, 0x0d, 0x01, 0xfa, 0xf3, \n  0xec, 0x6c, 0xf9, 0x4f, 0xfc, 0xfa, 0x1a, 0x48, 0x00, 0x8b, 0x15, 0x01, 0x39, 0x90, 0xf5, 0x0e, \n  0x36, 0x01, 0xee, 0x8d, 0x02, 0xd1, 0xd3, 0x00, 0x7d, 0xac, 0x01, 0x3b, 0xa1, 0x02, 0x70, 0xf5, \n  0xfe, 0xa4, 0x34, 0xff, 0x53, 0xac, 0x01, 0x58, 0x76, 0x00, 0xf0, 0x3e, 0x01, 0xf7, 0x17, 0x01, \n  0x8c, 0x81, 0xfc, 0x15, 0x20, 0xfd, 0x0b, 0x4a, 0x55, 0xcb, 0x1e, 0x24, 0x4b, 0x82, 0xe8, 0x9c, \n  0x0b, 0x30, 0x63, 0xa5, 0xf2, 0x5e, 0x41, 0xdf, 0xf4, 0x53, 0xf7, 0x97, 0xa9, 0xfa, 0xee, 0xf4, \n  0x0b, 0x65, 0xe4, 0x00, 0xfd, 0x9f, 0xf1, 0x5a, 0xb8, 0x00, 0xce, 0xfc, 0x0d, 0x64, 0xf8, 0xf4, \n  0xea, 0x14, 0xf8, 0x7c, 0x18, 0xfe, 0xba, 0x13, 0x00, 0x3d, 0xd8, 0xff, 0xa3, 0xd7, 0xf7, 0x32, \n  0xd2, 0x01, 0x5a, 0x91, 0x00, 0xa5, 0x52, 0x01, 0x35, 0x71, 0x02, 0x63, 0x19, 0x02, 0xb0, 0x9e, \n  0xfe, 0x0e, 0x29, 0x00, 0xf7, 0xed, 0xff, 0xdb, 0xf3, 0xfe, 0xfc, 0x34, 0x03, 0x69, 0x72, 0x00, \n  0xa1, 0x76, 0xfe, 0x7a, 0x61, 0xfe, 0x4b, 0xe7, 0x52, 0x6b, 0xd2, 0x1e, 0x17, 0xdc, 0xe6, 0x85, \n  0x40, 0x36, 0x71, 0x34, 0xf3, 0xd6, 0x72, 0xd9, 0xfd, 0xbb, 0xfe, 0x7d, 0x47, 0xfd, 0x11, 0x43, \n  0x04, 0x2e, 0x5b, 0x02, 0x1a, 0x5b, 0xf4, 0x67, 0x14, 0xfd, 0xef, 0x13, 0x0e, 0x5b, 0xef, 0xf7, \n  0xa1, 0xb6, 0xf7, 0xb1, 0xe7, 0xff, 0x17, 0x26, 0x00, 0xa2, 0xca, 0xfd, 0x3d, 0x77, 0xfa, 0xd7, \n  0x25, 0x02, 0x5d, 0x8e, 0xfe, 0xa8, 0xf2, 0x00, 0x89, 0x1e, 0x03, 0xea, 0xe6, 0x01, 0x8c, 0x2b, \n  0xfe, 0x10, 0x74, 0x00, 0x52, 0x47, 0x00, 0x1c, 0xca, 0xfe, 0xda, 0x65, 0x02, 0xbd, 0x83, 0x00, \n  0xbd, 0xfc, 0xfe, 0x97, 0xfa, 0xff, 0x1f, 0xf8, 0x4d, 0x46, 0x44, 0x1d, 0xf4, 0x89, 0xe7, 0x30, \n  0x5d, 0x33, 0xb2, 0x66, 0xf5, 0xe6, 0x66, 0xde, 0xd1, 0x9c, 0x00, 0xbf, 0x0d, 0xfa, 0x7b, 0xfb, \n  0x01, 0x60, 0x1e, 0x03, 0xa8, 0x9e, 0xf6, 0xdb, 0x61, 0xfb, 0x71, 0x2e, 0x0d, 0xf7, 0xba, 0xfa, \n  0x96, 0x34, 0xf8, 0xd4, 0x86, 0x00, 0x51, 0xdf, 0xff, 0x09, 0x9f, 0xfd, 0x32, 0x0d, 0xfb, 0x16, \n  0x40, 0x01, 0xc9, 0x76, 0xff, 0x4a, 0xf5, 0x00, 0xac, 0x6c, 0x01, 0x34, 0x3a, 0x02, 0x44, 0x9d, \n  0xfe, 0x05, 0xd5, 0xff, 0xf2, 0xfa, 0x01, 0x04, 0xb9, 0xff, 0x6e, 0xf1, 0xff, 0x28, 0x4c, 0x00, \n  0x1e, 0xb0, 0xff, 0x08, 0xd5, 0xff, 0xde, 0x58, 0x47, 0x27, 0xb2, 0x1c, 0x06, 0xba, 0xe9, 0x60, \n  0x0c, 0x2f, 0x14, 0x39, 0xfa, 0xeb, 0x02, 0xe1, 0xa1, 0x59, 0xff, 0x13, 0xc7, 0xfb, 0x06, 0xdd, \n  0xfe, 0x61, 0xb9, 0x01, 0x4d, 0x45, 0xfa, 0xdf, 0x68, 0xfb, 0xe3, 0xeb, 0x0a, 0x14, 0x60, 0xfd, \n  0x31, 0x7f, 0xf9, 0x8e, 0x20, 0xff, 0x91, 0xc6, 0x00, 0x89, 0x39, 0xfe, 0xa3, 0x0e, 0xfa, 0x38, \n  0xa6, 0x00, 0xdf, 0xf0, 0x00, 0xaf, 0xc3, 0x00, 0x75, 0x03, 0x00, 0xcd, 0xa1, 0x01, 0x90, 0x5e, \n  0xff, 0xe6, 0x08, 0x01, 0x65, 0x17, 0x02, 0x8c, 0xf2, 0xff, 0xdf, 0x6f, 0xff, 0x51, 0x28, 0xff, \n  0xc8, 0x0e, 0x00, 0xc0, 0x85, 0xff, 0xda, 0xef, 0x38, 0x02, 0x81, 0x20, 0x41, 0xba, 0xfc, 0x25, \n  0x80, 0x16, 0x08, 0x75, 0xf5, 0x4f, 0x1a, 0xf6, 0x95, 0x63, 0xf9, 0xde, 0x17, 0xf9, 0xb4, 0xeb, \n  0x06, 0x75, 0xdf, 0xff, 0x25, 0x61, 0xf6, 0xb6, 0xd9, 0x03, 0xca, 0x50, 0x08, 0x95, 0xbc, 0xfa, \n  0x71, 0xd5, 0xfc, 0xf7, 0x61, 0xfb, 0x7b, 0xc1, 0x00, 0x8c, 0xba, 0xfe, 0xb0, 0x8b, 0xf9, 0x6d, \n  0x6b, 0x01, 0x8f, 0xd4, 0xfe, 0xb8, 0x74, 0xfe, 0x87, 0x32, 0x01, 0xc7, 0xa8, 0x01, 0x20, 0x70, \n  0x02, 0xa4, 0x81, 0x04, 0xd4, 0x00, 0xff, 0xe3, 0xf4, 0xfc, 0xff, 0xf9, 0xfe, 0xfc, 0x6c, 0xfd, \n  0x62, 0x2c, 0xff, 0xfa, 0x69, 0x01, 0x99, 0x60, 0x31, 0x37, 0x07, 0x20, 0x7c, 0xfe, 0xfd, 0x6e, \n  0x69, 0x14, 0x2e, 0x7c, 0xfa, 0x42, 0xe8, 0xf4, 0x33, 0xc7, 0xfa, 0x50, 0xb8, 0xfa, 0xd6, 0xc1, \n  0x03, 0x08, 0x61, 0x00, 0x6a, 0x62, 0xf8, 0xb0, 0xf1, 0x02, 0xd4, 0x4f, 0x07, 0x4a, 0x4c, 0xfc, \n  0x0f, 0xb1, 0xfc, 0xb9, 0xca, 0xfb, 0xad, 0xde, 0x00, 0x8c, 0x28, 0xfe, 0x64, 0x0c, 0xfa, 0x31, \n  0x75, 0x01, 0xd6, 0x56, 0xfe, 0x70, 0x3b, 0xfe, 0x1d, 0xe1, 0x01, 0xd0, 0x94, 0x01, 0xed, 0x12, \n  0x02, 0x69, 0x3d, 0x03, 0x94, 0xbb, 0xfe, 0xc9, 0xa6, 0xfe, 0xa5, 0x13, 0xff, 0x77, 0x08, 0xfd, \n  0x4b, 0xc7, 0xff, 0x79, 0x5c, 0x01, 0x18, 0x24, 0x2b, 0xfa, 0xdc, 0x1e, 0x25, 0x6e, 0xff, 0x55, \n  0x0d, 0x14, 0xb5, 0xc6, 0xfc, 0xd7, 0x78, 0xf4, 0xcd, 0xf7, 0xfc, 0x80, 0x36, 0xfb, 0x1f, 0x2d, \n  0x02, 0x77, 0x84, 0x00, 0x3c, 0x42, 0xfa, 0x51, 0xcf, 0x02, 0xbe, 0x13, 0x06, 0xb2, 0x86, 0xfd, \n  0x1a, 0x38, 0xfd, 0x54, 0xac, 0xfc, 0x52, 0x4c, 0x00, 0xf9, 0xfa, 0xfd, 0x09, 0x69, 0xfb, 0xba, \n  0xe3, 0x00, 0x1e, 0x20, 0xfe, 0xf5, 0xdf, 0xfe, 0x4c, 0xbb, 0x01, 0xb6, 0xb5, 0x01, 0xff, 0x2f, \n  0x02, 0x85, 0xb5, 0x01, 0x32, 0xdd, 0xfe, 0x1a, 0x40, 0x00, 0x7a, 0x6a, 0xff, 0x73, 0x39, 0xfd, \n  0x77, 0x0c, 0x00, 0xe7, 0xb6, 0x01, 0x29, 0xe8, 0x24, 0x9c, 0xa3, 0x1c, 0x2d, 0x0d, 0x03, 0x7e, \n  0xb2, 0x12, 0x46, 0x0d, 0xfd, 0x29, 0x05, 0xf7, 0xfe, 0x7c, 0xfd, 0x4f, 0x2d, 0xfb, 0x03, 0x30, \n  0x02, 0xfd, 0x50, 0x00, 0x1e, 0x62, 0xfb, 0xa1, 0x98, 0x02, 0xd9, 0x7c, 0x05, 0x44, 0x13, 0xfe, \n  0x70, 0xb2, 0xfd, 0x6f, 0xa9, 0xfd, 0x23, 0x9a, 0xff, 0x83, 0x25, 0xfe, 0xc3, 0x34, 0xfc, 0x4f, \n  0x5e, 0x00, 0xec, 0xa9, 0xfe, 0xe1, 0x1e, 0xff, 0x50, 0x47, 0x01, 0x6c, 0xe6, 0x01, 0x23, 0xe2, \n  0x01, 0x27, 0xb0, 0x00, 0xec, 0xd8, 0xff, 0xcd, 0x10, 0x01, 0x6b, 0xdc, 0xff, 0xe7, 0x29, 0xfe, \n  0xc6, 0xee, 0xff, 0xcf, 0x2a, 0x02, 0x9b, 0x68, 0x1e, 0xd9, 0xaa, 0x1a, 0x41, 0x84, 0x07, 0x6c, \n  0xd3, 0x0f, 0xbb, 0xc4, 0xfd, 0x35, 0xe7, 0xfa, 0x39, 0xd7, 0xfc, 0xae, 0xe6, 0xfa, 0xe4, 0xe0, \n  0x02, 0x83, 0xb6, 0x00, 0xf4, 0x8a, 0xfb, 0x7f, 0x63, 0x02, 0x01, 0x1f, 0x05, 0xa8, 0x6d, 0xfe, \n  0x3b, 0xbc, 0xfe, 0x44, 0xf7, 0xfd, 0x53, 0xf8, 0xfe, 0x77, 0xa5, 0xfe, 0xf8, 0x0e, 0xfd, 0xa5, \n  0xf4, 0xff, 0xa0, 0xdf, 0xfe, 0xb9, 0x7a, 0xff, 0xc5, 0xdf, 0x00, 0xe6, 0xe2, 0x01, 0x33, 0x54, \n  0x01, 0x73, 0xcd, 0x00, 0xb5, 0x1d, 0x01, 0xb0, 0xab, 0x01, 0x49, 0x8c, 0x00, 0x58, 0x86, 0xfe, \n  0xbf, 0x33, 0x00, 0x1e, 0xcf, 0x01, 0xea, 0x09, 0x18, 0x5d, 0x71, 0x18, 0xbc, 0x7d, 0x0b, 0xa5, \n  0xba, 0x0d, 0x8a, 0xfd, 0xfe, 0x22, 0xf2, 0xfd, 0x02, 0x3d, 0xfc, 0x98, 0xce, 0xfa, 0xe5, 0xb6, \n  0x03, 0x95, 0x19, 0x01, 0x41, 0x90, 0xfb, 0xbf, 0xcf, 0x01, 0x6d, 0xa2, 0x04, 0xcb, 0xe6, 0xff, \n  0x29, 0x37, 0xff, 0x13, 0x2b, 0xfd, 0x99, 0x43, 0xff, 0x9f, 0xd8, 0xff, 0x27, 0x21, 0xfd, 0x8b, \n  0x6d, 0xff, 0xde, 0x5f, 0xff, 0x88, 0x59, 0xff, 0x6e, 0x27, 0x01, 0xf3, 0xd3, 0x01, 0x43, 0xc1, \n  0x00, 0x11, 0xda, 0x01, 0xb8, 0x98, 0x02, 0xf8, 0x3f, 0x02, 0x7f, 0x32, 0x00, 0x93, 0x8e, 0xfe, \n  0xee, 0x75, 0x00, 0x43, 0xec, 0x00, 0xcb, 0x63, 0x14, 0x1a, 0xd5, 0x16, 0xf8, 0x42, 0x0c, 0x3e, \n  0xf2, 0x0b, 0x84, 0x05, 0x00, 0x4a, 0x61, 0xff, 0xf9, 0x0a, 0xfd, 0x59, 0x73, 0xfb, 0x53, 0x08, \n  0x03, 0xb5, 0x47, 0x01, 0x80, 0xb0, 0xfc, 0x40, 0x72, 0x01, 0x97, 0xa1, 0x03, 0x60, 0xb3, 0x00, \n  0x97, 0x91, 0xff, 0x17, 0xdf, 0xfc, 0xc3, 0xea, 0xff, 0x7a, 0x68, 0x00, 0x15, 0xe5, 0xfc, 0x2b, \n  0x37, 0xff, 0xb7, 0xd1, 0xff, 0x24, 0xc6, 0xff, 0xc9, 0x68, 0x01, 0x33, 0xc2, 0x01, 0xd8, 0x57, \n  0x01, 0xec, 0x2a, 0x03, 0xe9, 0x4e, 0x03, 0x08, 0x82, 0x01, 0x0f, 0x24, 0xff, 0x63, 0xc9, 0xfe, \n  0x50, 0x20, 0x00, 0x87, 0x71, 0x00, 0x6e, 0xf5, 0x11, 0xeb, 0xff, 0x14, 0xef, 0x57, 0x0c, 0x32, \n  0x23, 0x0b, 0xe2, 0x31, 0x00, 0x93, 0xb2, 0x00, 0xbb, 0x79, 0xfe, 0x4e, 0x73, 0xfb, 0x44, 0x89, \n  0x02, 0xa7, 0x0f, 0x02, 0x0b, 0xc7, 0xfd, 0x77, 0x99, 0x00, 0xae, 0xef, 0x02, 0x11, 0xd6, 0x01, \n  0x0c, 0xbd, 0xff, 0x0e, 0xf8, 0xfc, 0xa7, 0x83, 0x00, 0x42, 0x57, 0x00, 0x9d, 0x16, 0xfd, 0xdf, \n  0xec, 0xff, 0xf0, 0xed, 0xff, 0x92, 0x90, 0x00, 0x60, 0xae, 0x02, 0x73, 0x00, 0x02, 0x37, 0x05, \n  0x02, 0x66, 0x9f, 0x03, 0xc4, 0x87, 0x02, 0xb7, 0x4d, 0x00, 0x80, 0xda, 0xfe, 0x81, 0xc7, 0xfe, \n  0xd5, 0x64, 0x00, 0x19, 0xca, 0x00, 0xfd, 0x40, 0x10, 0xb1, 0xc8, 0x12, 0x8a, 0xa2, 0x0b, 0x34, \n  0x3f, 0x0b, 0x28, 0xdc, 0x00, 0xb5, 0xb6, 0x00, 0xc2, 0xa5, 0xfe, 0x8f, 0x92, 0xfc, 0x41, 0xcf, \n  0x02, 0x92, 0xb2, 0x01, 0x63, 0xbf, 0xfd, 0xb3, 0x8d, 0x00, 0x5e, 0x26, 0x03, 0x84, 0xf3, 0x01, \n  0x71, 0x67, 0xff, 0x38, 0x34, 0xfd, 0x11, 0x03, 0x01, 0xb7, 0x67, 0x00, 0x8a, 0x51, 0xfd, 0xd1, \n  0x97, 0x00, 0x80, 0xf6, 0x00, 0x3f, 0x11, 0x02, 0x90, 0xfb, 0x02, 0x84, 0x1f, 0x01, 0x77, 0xfe, \n  0x01, 0x49, 0x0e, 0x03, 0xe1, 0xe0, 0x00, 0x41, 0x64, 0xff, 0x03, 0x61, 0xff, 0x19, 0x54, 0xff, \n  0xd1, 0xe3, 0xff, 0x20, 0xd7, 0xff, 0x1b, 0xca, 0x0f, 0x6f, 0x0b, 0x12, 0xed, 0x00, 0x0a, 0x78, \n  0xdd, 0x09, 0xfd, 0x59, 0x01, 0x95, 0x35, 0x01, 0x75, 0x61, 0xff, 0x57, 0x57, 0xfd, 0xa1, 0x7c, \n  0x02, 0x36, 0x90, 0x01, 0xd2, 0x63, 0xfe, 0xb2, 0x46, 0x01, 0xf1, 0xdd, 0x02, 0xf9, 0xdc, 0x00, \n  0xc0, 0xf7, 0xff, 0x5a, 0xa2, 0xfe, 0x02, 0xbd, 0x00, 0x51, 0x8d, 0x00, 0x69, 0x33, 0xff, 0x56, \n  0x15, 0x02, 0xe8, 0x02, 0x02, 0xea, 0x1b, 0x02, 0x56, 0x69, 0x01, 0x3d, 0x9f, 0x00, 0x3c, 0xc0, \n  0x01, 0x8c, 0xbe, 0x01, 0x60, 0x88, 0x00, 0x7a, 0xad, 0xff, 0x87, 0x3c, 0xff, 0x05, 0x08, 0xff, \n  0xed, 0xdb, 0xff, 0xa7, 0xaf, 0xff, 0x04, 0x6a, 0x0e, 0xef, 0x71, 0x10, 0x85, 0x95, 0x09, 0x71, \n  0xdf, 0x09, 0x61, 0xdb, 0x01, 0xd2, 0x43, 0x01, 0x32, 0x88, 0xff, 0x94, 0x23, 0xfe, 0xb4, 0xc8, \n  0x02, 0x31, 0xc6, 0x01, 0x2d, 0x91, 0xfe, 0x10, 0x1e, 0x01, 0x74, 0xd1, 0x02, 0xec, 0x28, 0x01, \n  0xc2, 0x82, 0x00, 0xd2, 0x71, 0xff, 0xdd, 0xde, 0x01, 0x4b, 0x20, 0x02, 0x3f, 0x7b, 0x00, 0x37, \n  0xbd, 0x01, 0x91, 0x91, 0x01, 0x30, 0xf6, 0x00, 0x6f, 0x06, 0x00, 0xb1, 0xb4, 0x00, 0x96, 0x7d, \n  0x01, 0x05, 0x86, 0x01, 0x70, 0x2f, 0x00, 0xf8, 0x3b, 0xff, 0xa8, 0x43, 0xff, 0x21, 0x0c, 0xff, \n  0x97, 0xc9, 0xff, 0x6d, 0x37, 0xff, 0xda, 0x59, 0x0d, 0x50, 0x7c, 0x0f, 0x6d, 0x22, 0x09, 0xb9, \n  0x67, 0x09, 0xdd, 0x33, 0x02, 0x99, 0x14, 0x01, 0x95, 0xf0, 0xff, 0x5f, 0x6c, 0xff, 0x02, 0xfd, \n  0x02, 0x37, 0x3f, 0x01, 0xc0, 0xb4, 0xfe, 0x6a, 0x2a, 0x02, 0x5f, 0xa8, 0x02, 0x68, 0x2b, 0x01, \n  0xff, 0xc7, 0x02, 0x55, 0x89, 0x01, 0x6a, 0x29, 0x02, 0xc3, 0xfa, 0x01, 0xe3, 0xe3, 0xff, 0xeb, \n  0xbf, 0x00, 0x8e, 0xc8, 0x00, 0xa4, 0xa5, 0xff, 0xd4, 0x57, 0x00, 0x68, 0x66, 0x01, 0xea, 0xa2, \n  0x00, 0xd9, 0xc3, 0x00, 0xb7, 0xff, 0xff, 0xfd, 0x47, 0xff, 0x25, 0x21, 0xff, 0x51, 0x07, 0xff, \n  0x54, 0x6f, 0xff, 0xb7, 0xf3, 0xfe, 0xf6, 0xd5, 0x0c, 0x55, 0x34, 0x0f, 0xd3, 0xc6, 0x08, 0xad, \n  0x09, 0x08, 0x84, 0xb6, 0x01, 0xa7, 0xf1, 0x01, 0x7e, 0x4c, 0x01, 0xf5, 0x39, 0xff, 0xcf, 0x50, \n  0x02, 0x7c, 0x32, 0x02, 0xaa, 0xa2, 0xff, 0x4a, 0x2f, 0x02, 0xf5, 0x2f, 0x04, 0x0e, 0x95, 0x03, \n  0xb9, 0x92, 0x03, 0xd0, 0x00, 0x01, 0xa2, 0x9c, 0x00, 0xe4, 0xb0, 0x00, 0xc6, 0x21, 0xff, 0x78, \n  0x52, 0x00, 0xf5, 0x8f, 0x00, 0xf7, 0xa7, 0xff, 0x17, 0x39, 0x00, 0xbb, 0xb2, 0x00, 0xa8, 0xab, \n  0x00, 0x83, 0x45, 0x00, 0xcd, 0x65, 0xff, 0xa6, 0x0d, 0xff, 0x37, 0xf7, 0xfe, 0xfd, 0x1d, 0xff, \n  0x9f, 0xfe, 0xfe, 0x5c, 0x8b, 0xfe, 0x27, 0xe2, 0x0b, 0x06, 0xcf, 0x0d, 0x32, 0xfb, 0x08, 0x7f, \n  0xed, 0x08, 0xb5, 0x20, 0x02, 0x7e, 0x16, 0x01, 0xb7, 0xfc, 0x00, 0x62, 0x6e, 0x01, 0xff, 0x0b, \n  0x03, 0xf5, 0xa7, 0x01, 0x3b, 0xe3, 0x01, 0xe0, 0x05, 0x05, 0xea, 0xde, 0x04, 0x30, 0xa8, 0x02, \n  0xc7, 0x1e, 0x02, 0xdd, 0x54, 0xff, 0xc7, 0x84, 0xff, 0x15, 0x33, 0x00, 0xae, 0x7b, 0xff, 0x2b, \n  0x98, 0x00, 0xf1, 0xb1, 0xff, 0x96, 0x88, 0xff, 0xbe, 0x56, 0x00, 0x44, 0xa8, 0x00, 0xf3, 0x23, \n  0x00, 0x36, 0x81, 0xff, 0x66, 0x46, 0xff, 0x79, 0xd1, 0xfe, 0xc7, 0x25, 0xff, 0x43, 0xef, 0xfe, \n  0xe0, 0x7f, 0xfe, 0x0f, 0x64, 0xfe, 0x9d, 0x83, 0x0b, 0x60, 0x6c, 0x0e, 0xfe, 0x8f, 0x09, 0x2e, \n  0x5f, 0x07, 0x6b, 0xd4, 0x00, 0xb5, 0x79, 0x02, 0x20, 0xa5, 0x02, 0xe2, 0x22, 0x02, 0x7b, 0xe1, \n  0x04, 0x1a, 0xce, 0x04, 0x02, 0xfe, 0x02, 0x8a, 0xc3, 0x03, 0xf2, 0x21, 0x03, 0xea, 0x55, 0x00, \n  0xd5, 0x4c, 0x00, 0xbe, 0x1e, 0xff, 0x2b, 0xff, 0xff, 0xf2, 0x24, 0x00, 0x18, 0x1d, 0xff, 0x4c, \n  0x1d, 0x00, 0x87, 0xe3, 0xff, 0x44, 0xd6, 0xff, 0x1d, 0x1a, 0x00, 0x70, 0x33, 0x00, 0x11, 0x23, \n  0xff, 0x75, 0x46, 0xff, 0x5f, 0x36, 0xff, 0x2e, 0xcf, 0xfe, 0x6e, 0x27, 0xff, 0x0f, 0x6c, 0xfe, \n  0xe7, 0x65, 0xfe, 0x2c, 0x81, 0xfe, 0x1a, 0x81, 0x0b, 0xdc, 0x5b, 0x0e, 0xc4, 0x9b, 0x09, 0x99, \n  0x49, 0x07, 0x8a, 0xbf, 0x00, 0xa3, 0xfc, 0x02, 0x03, 0x2b, 0x06, 0xfa, 0xae, 0x06, 0xe0, 0xce, \n  0x04, 0x3b, 0x08, 0x03, 0x8e, 0x9e, 0x01, 0xcf, 0xfd, 0x00, 0xc1, 0x8c, 0x01, 0xe4, 0x99, 0xff, \n  0xde, 0x22, 0x00, 0xd5, 0xbc, 0xff, 0x45, 0xf6, 0xfe, 0x60, 0xaf, 0xff, 0xc4, 0xbc, 0xff, 0x15, \n  0xfe, 0xff, 0x8d, 0xe1, 0xff, 0xc3, 0x86, 0xff, 0x29, 0x5b, 0xff, 0xee, 0xbc, 0xff, 0x03, 0xe3, \n  0xfe, 0xf9, 0xd4, 0xfe, 0x9f, 0x1f, 0xff, 0x93, 0xd0, 0xfe, 0x3a, 0xeb, 0xfe, 0xfe, 0x89, 0xfe, \n  0x02, 0x4f, 0xfe, 0x61, 0xa5, 0xfe, 0x14, 0x1e, 0x0b, 0x25, 0xfb, 0x0d, 0x4a, 0x91, 0x09, 0xf8, \n  0x5e, 0x08, 0x78, 0x65, 0x04, 0xd2, 0xbf, 0x05, 0x52, 0x92, 0x06, 0xe6, 0x00, 0x07, 0x23, 0x9e, \n  0x03, 0x0e, 0x03, 0xff, 0xc8, 0xfd, 0xfe, 0x25, 0x6f, 0x01, 0x15, 0x90, 0x01, 0xa9, 0xf2, 0xfe, \n  0xe3, 0x59, 0xff, 0xab, 0x59, 0xff, 0x6c, 0x48, 0xff, 0xc5, 0x92, 0xff, 0xd9, 0xa4, 0xff, 0x20, \n  0xce, 0xff, 0x9b, 0x37, 0xff, 0x96, 0x36, 0xff, 0x60, 0x4b, 0xff, 0x2e, 0xdd, 0xfe, 0xf5, 0x60, \n  0xfe, 0x5b, 0xed, 0xfe, 0x50, 0xda, 0xfe, 0xf2, 0xfd, 0xfe, 0xeb, 0xf1, 0xfe, 0xcd, 0x45, 0xfe, \n  0x13, 0xa6, 0xfe, 0xc4, 0xdd, 0xfe, 0x64, 0x05, 0x0a, 0x92, 0x0a, 0x10, 0xda, 0x86, 0x0d, 0x38, \n  0x5a, 0x0a, 0x14, 0x85, 0x05, 0x27, 0x82, 0x05, 0x73, 0x28, 0x06, 0xe9, 0xd9, 0x03, 0xf3, 0x08, \n  0x00, 0xc5, 0x1b, 0x00, 0xdb, 0xe6, 0xff, 0x92, 0x43, 0x00, 0xd6, 0xe0, 0x00, 0xa7, 0x0d, 0xff, \n  0x32, 0x00, 0x00, 0xeb, 0x5c, 0xff, 0x59, 0xf6, 0xfe, 0x6a, 0x08, 0x00, 0x50, 0x6a, 0xff, 0x04, \n  0x57, 0xff, 0xb4, 0x9a, 0xff, 0x70, 0x47, 0xff, 0xea, 0x9d, 0xfe, 0x8b, 0x89, 0xfe, 0xee, 0x9b, \n  0xfe, 0x35, 0x2d, 0xff, 0x84, 0x3a, 0xff, 0xa5, 0x19, 0xff, 0x65, 0xfd, 0xfe, 0x0b, 0x99, 0xfe, \n  0xbf, 0xdf, 0xfe, 0xe4, 0xdd, 0xfe, 0x6f, 0xae, 0x0c, 0xf4, 0x5f, 0x17, 0x59, 0x69, 0x0f, 0xc7, \n  0xe0, 0x05, 0xff, 0x01, 0x03, 0x16, 0x63, 0x05, 0x39, 0x04, 0x03, 0x49, 0x86, 0x01, 0x96, 0x57, \n  0x02, 0xc2, 0xaa, 0xff, 0xcd, 0x8f, 0xfe, 0x01, 0xc7, 0xff, 0x27, 0xcd, 0x01, 0xe5, 0xce, 0xff, \n  0x2b, 0x8d, 0xfe, 0x40, 0xbc, 0xff, 0xcf, 0x3b, 0xff, 0x7b, 0xeb, 0xfe, 0xdf, 0x9c, 0xff, 0xf4, \n  0xc3, 0xff, 0xba, 0x3b, 0xff, 0xbc, 0xc7, 0xfe, 0x86, 0x65, 0xfe, 0x40, 0x99, 0xfe, 0x25, 0x05, \n  0xff, 0x7f, 0x34, 0xff, 0xd3, 0x4c, 0xff, 0xf5, 0x21, 0xff, 0x20, 0xd8, 0xfe, 0x19, 0xbb, 0xfe, \n  0x6d, 0xc2, 0xfe, 0x8e, 0xa1, 0xfe, 0x64, 0xc3, 0x0e, 0xec, 0xab, 0x17, 0x74, 0xd0, 0x0d, 0xaf, \n  0x01, 0x07, 0x27, 0x85, 0x01, 0xf2, 0x5e, 0x01, 0xad, 0xff, 0x04, 0xa8, 0x44, 0x04, 0x84, 0xa8, \n  0xff, 0x82, 0x3c, 0xff, 0x75, 0x01, 0x01, 0xcc, 0xc3, 0xff, 0x4f, 0x8c, 0x00, 0xf5, 0x40, 0x00, \n  0xfb, 0x5f, 0xff, 0xb5, 0x00, 0xff, 0xac, 0xb3, 0xfe, 0x57, 0xe5, 0xfe, 0x6d, 0x86, 0xff, 0xfd, \n  0xb0, 0xff, 0x14, 0x2a, 0xff, 0x1b, 0x0b, 0xff, 0x97, 0x48, 0xfe, 0xd0, 0xc5, 0xfe, 0xab, 0x25, \n  0xff, 0x8b, 0x0a, 0xff, 0x90, 0x01, 0xff, 0x5c, 0x03, 0xff, 0x68, 0xf3, 0xfe, 0xac, 0xbb, 0xfe, \n  0xd0, 0x96, 0xfe, 0xd4, 0xaf, 0xfe, 0xc9, 0x12, 0x0b, 0x1f, 0xe4, 0x13, 0xb9, 0x01, 0x0f, 0x6d, \n  0x17, 0x08, 0x82, 0xb0, 0x01, 0x3d, 0x8b, 0x02, 0x6c, 0x76, 0x05, 0x34, 0x05, 0x04, 0x95, 0xe4, \n  0x00, 0x05, 0xf9, 0xff, 0x8f, 0x5c, 0x01, 0x5a, 0x58, 0x01, 0x55, 0xac, 0x00, 0x54, 0xd8, 0xff, \n  0x34, 0x22, 0x00, 0x91, 0x2f, 0xff, 0x30, 0x9d, 0xfe, 0x84, 0xea, 0xfe, 0x07, 0xd0, 0xfe, 0x71, \n  0x36, 0xff, 0xfd, 0xde, 0xff, 0xda, 0x46, 0xff, 0x94, 0x70, 0xfe, 0x68, 0x51, 0xff, 0xbc, 0x1e, \n  0xff, 0xf0, 0xd7, 0xfe, 0x45, 0xc3, 0xfe, 0x33, 0xce, 0xfe, 0x0d, 0xcc, 0xfe, 0xbc, 0xb9, 0xfe, \n  0x14, 0xde, 0xfe, 0xb1, 0xaf, 0xfe, 0xc1, 0x8e, 0x0a, 0x4a, 0xfc, 0x12, 0xf8, 0xba, 0x0b, 0x1e, \n  0x58, 0x05, 0x6e, 0xb3, 0x03, 0x4e, 0x17, 0x04, 0x98, 0x42, 0x04, 0xee, 0xca, 0x03, 0xc8, 0x06, \n  0x03, 0x65, 0x03, 0x01, 0x78, 0xe7, 0x00, 0xa4, 0xac, 0x02, 0xd8, 0x39, 0x02, 0x05, 0x75, 0x00, \n  0xc8, 0x28, 0x00, 0xbb, 0xdc, 0xff, 0x44, 0x33, 0xff, 0x0a, 0x62, 0xfe, 0x6a, 0xf0, 0xfe, 0xe3, \n  0x46, 0xff, 0x63, 0x0f, 0xff, 0x6f, 0x7b, 0xff, 0x89, 0x7e, 0xff, 0x96, 0x77, 0xff, 0xe8, 0x56, \n  0xff, 0x7c, 0x56, 0xff, 0x30, 0xc3, 0xfe, 0x8e, 0x6e, 0xfe, 0x93, 0x81, 0xfe, 0xf9, 0xb3, 0xfe, \n  0x55, 0xe3, 0xfe, 0xf7, 0xbd, 0xfe, 0xbb, 0x0a, 0x0a, 0x9a, 0xcd, 0x11, 0xc6, 0xb6, 0x09, 0x0a, \n  0x4f, 0x04, 0x9a, 0x36, 0x05, 0x74, 0x8b, 0x03, 0x62, 0xda, 0x01, 0xe4, 0x11, 0x04, 0xd8, 0xdb, \n  0x03, 0xc6, 0xa7, 0x01, 0xf3, 0x6d, 0x02, 0x89, 0xa6, 0x02, 0x8e, 0x1d, 0x02, 0xc6, 0x67, 0x02, \n  0x66, 0xaf, 0x01, 0x5d, 0xbb, 0xff, 0xb8, 0xc4, 0xff, 0x75, 0xbd, 0xff, 0xe1, 0x75, 0xfe, 0x45, \n  0x99, 0xfe, 0x78, 0x78, 0xff, 0x74, 0x76, 0xff, 0xbe, 0xdf, 0xfe, 0xd0, 0x0a, 0x00, 0xe4, 0x35, \n  0x00, 0xae, 0x3c, 0xff, 0x53, 0x3e, 0xff, 0x9c, 0xc8, 0xfe, 0xd2, 0x4a, 0xfe, 0x86, 0x4c, 0xfe, \n  0x2c, 0x9c, 0xfe, 0xe7, 0xe4, 0xfe, 0xbb, 0x6c, 0x09, 0x13, 0x52, 0x10, 0xb6, 0x24, 0x09, 0x69, \n  0x01, 0x05, 0x4b, 0xc1, 0x05, 0xcd, 0x8d, 0x02, 0x37, 0x7c, 0x00, 0x2f, 0xeb, 0x03, 0x7a, 0x74, \n  0x03, 0xf1, 0xe1, 0x00, 0x06, 0x1f, 0x02, 0xf9, 0x8b, 0x03, 0xd7, 0x40, 0x03, 0x46, 0x2e, 0x02, \n  0xf4, 0xb2, 0x01, 0xa1, 0xa2, 0x01, 0xdd, 0xd8, 0x00, 0x03, 0xb0, 0xff, 0x92, 0x8d, 0xff, 0x09, \n  0x38, 0xff, 0x51, 0xbe, 0xfe, 0x78, 0x05, 0xff, 0x18, 0x73, 0xff, 0x0a, 0xa9, 0xff, 0xfc, 0xa2, \n  0xff, 0x89, 0x1b, 0x00, 0xc6, 0xa7, 0xff, 0x17, 0xcc, 0xfe, 0x99, 0xcd, 0xfe, 0x3f, 0x75, 0xfe, \n  0x76, 0x13, 0xfe, 0x5e, 0x81, 0xfe, 0x62, 0x98, 0x09, 0x81, 0x54, 0x10, 0x84, 0x08, 0x09, 0x0f, \n  0xe5, 0x04, 0x47, 0xce, 0x05, 0x58, 0x35, 0x02, 0x6f, 0xc8, 0xff, 0x8b, 0x0d, 0x04, 0x7b, 0x86, \n  0x03, 0x63, 0xb2, 0xff, 0x4f, 0xc9, 0x00, 0xad, 0x57, 0x03, 0xb3, 0xf7, 0x02, 0x5b, 0x71, 0x02, \n  0x37, 0xd7, 0x02, 0x39, 0x50, 0x01, 0xb7, 0xb8, 0x00, 0xe4, 0x88, 0x01, 0x1f, 0xb5, 0x00, 0x63, \n  0x20, 0xff, 0xce, 0xa5, 0xff, 0x12, 0xf1, 0xff, 0xd8, 0xcb, 0xfe, 0x3c, 0x5c, 0xff, 0x3c, 0x39, \n  0x00, 0x0e, 0xd2, 0xff, 0x9c, 0x53, 0xff, 0x91, 0x7f, 0xff, 0xfc, 0x25, 0xff, 0x26, 0xa0, 0xfe, \n  0x1f, 0xa2, 0xfe, 0x20, 0x67, 0xfe, 0xa8, 0xa8, 0x09, 0xea, 0x2a, 0x10, 0x57, 0x2f, 0x09, 0x16, \n  0x18, 0x06, 0x53, 0x4e, 0x06, 0x49, 0xc7, 0x00, 0x32, 0x02, 0xff, 0xbe, 0x13, 0x05, 0xe8, 0x94, \n  0x03, 0xf7, 0xad, 0xfe, 0x94, 0x4e, 0x00, 0xb6, 0xb3, 0x02, 0xc5, 0xfc, 0x01, 0x14, 0x86, 0x01, \n  0x07, 0x7c, 0x02, 0x0f, 0xb2, 0x01, 0x92, 0xdc, 0x00, 0xc0, 0x22, 0x01, 0x11, 0x30, 0x01, 0xea, \n  0xa4, 0x00, 0xc5, 0x06, 0x00, 0xa1, 0x14, 0x00, 0x69, 0x20, 0x00, 0x30, 0xdb, 0xff, 0xae, 0x92, \n  0xff, 0xa2, 0xbc, 0xff, 0xde, 0xaa, 0xff, 0xa3, 0x15, 0xff, 0xdb, 0xd5, 0xfe, 0xbf, 0x28, 0xff, \n  0xfd, 0xe6, 0xfe, 0x41, 0xb2, 0xfe, 0xa1, 0x3f, 0x0a, 0x13, 0x4a, 0x11, 0x0c, 0x74, 0x09, 0x1a, \n  0xb5, 0x05, 0x2d, 0x56, 0x06, 0x2b, 0xb8, 0x00, 0xbd, 0xae, 0xfe, 0x23, 0xf0, 0x04, 0x38, 0x93, \n  0x03, 0x8e, 0x65, 0xfe, 0x2e, 0xe2, 0xff, 0x42, 0x31, 0x02, 0x44, 0xb0, 0x01, 0x2e, 0x1c, 0x01, \n  0x4d, 0x67, 0x01, 0x72, 0xf0, 0x00, 0x77, 0x19, 0x00, 0xe4, 0xba, 0x00, 0x71, 0xa1, 0x01, 0x50, \n  0xa5, 0x00, 0x07, 0x0f, 0x00, 0xe3, 0x10, 0x01, 0xc1, 0xc4, 0x00, 0x27, 0x53, 0x00, 0x33, 0xa7, \n  0x00, 0xba, 0x21, 0x00, 0x02, 0x35, 0xff, 0x6c, 0xe4, 0xfe, 0xc6, 0xd2, 0xfe, 0x5e, 0xbf, 0xfe, \n  0xd7, 0xc6, 0xfe, 0xfa, 0x04, 0xff, 0x30, 0x23, 0x0b, 0x36, 0x3d, 0x12, 0x10, 0x9a, 0x09, 0x91, \n  0x3e, 0x06, 0xb6, 0x70, 0x06, 0x60, 0xd1, 0xff, 0x01, 0x8b, 0xfe, 0xa7, 0x91, 0x05, 0x35, 0x54, \n  0x03, 0xc9, 0xe1, 0xfd, 0xcf, 0xbd, 0xff, 0xb3, 0x43, 0x02, 0xd8, 0x4e, 0x01, 0xb5, 0x6a, 0x00, \n  0x78, 0xb5, 0x01, 0x32, 0xd0, 0x00, 0x9e, 0xd4, 0xfe, 0x45, 0x6b, 0xff, 0x56, 0x0b, 0x01, 0x78, \n  0xc0, 0x00, 0xd4, 0x14, 0x00, 0x21, 0xf7, 0x00, 0x39, 0x30, 0x01, 0xdd, 0x56, 0x01, 0x47, 0x2b, \n  0x01, 0x3f, 0xd4, 0x00, 0x6b, 0x61, 0x00, 0x69, 0x16, 0xff, 0x39, 0x38, 0xfe, 0xe5, 0x87, 0xfe, \n  0xf4, 0xf0, 0xfe, 0xc8, 0xb7, 0xfe, 0x9c, 0x6e, 0x0c, 0x3e, 0xd3, 0x13, 0xb8, 0x83, 0x09, 0xbc, \n  0xf2, 0x05, 0xef, 0x86, 0x06, 0x50, 0x93, 0xff, 0xd6, 0x7e, 0xfe, 0xf4, 0x8c, 0x05, 0x7c, 0xee, \n  0x02, 0x01, 0x9a, 0xfd, 0x4a, 0xe8, 0xff, 0x99, 0x03, 0x02, 0x81, 0xf4, 0x00, 0x0c, 0x25, 0x00, \n  0x37, 0x5c, 0x01, 0xac, 0x1e, 0x01, 0xf8, 0xdb, 0xfe, 0xb8, 0x72, 0xfe, 0x71, 0x8d, 0xff, 0x76, \n  0x23, 0x00, 0x60, 0xa3, 0xff, 0xf0, 0x44, 0x00, 0xe5, 0x84, 0x01, 0xe4, 0x8b, 0x01, 0xc1, 0x72, \n  0x01, 0x73, 0x98, 0x01, 0xf3, 0xf4, 0x00, 0xd0, 0xd3, 0xff, 0xff, 0xd7, 0xfe, 0x6b, 0x70, 0xfe, \n  0x63, 0x79, 0xfe, 0x16, 0xa4, 0xfe, 0xd3, 0x3f, 0x0d, 0xdf, 0x5e, 0x15, 0x0f, 0x15, 0x0a, 0xb3, \n  0x91, 0x05, 0x7d, 0xaa, 0x06, 0xee, 0x76, 0xff, 0xba, 0xfe, 0xfd, 0xc2, 0x0a, 0x06, 0x19, 0xbc, \n  0x02, 0xe4, 0xcb, 0xfc, 0x68, 0xf0, 0xff, 0x72, 0x1f, 0x02, 0xaa, 0xcc, 0x00, 0x6a, 0xaf, 0xff, \n  0x5b, 0xc4, 0x00, 0xa0, 0x6a, 0x01, 0x24, 0x55, 0xff, 0xaf, 0xf9, 0xfd, 0x2d, 0xfa, 0xfe, 0xf8, \n  0x58, 0xff, 0x82, 0xad, 0xfe, 0xf8, 0x7d, 0xff, 0x02, 0xac, 0x00, 0x43, 0x80, 0x01, 0x2b, 0xb1, \n  0x01, 0x51, 0x8f, 0x01, 0xbb, 0x75, 0x01, 0x52, 0x6b, 0x00, 0xb0, 0x69, 0xff, 0xd4, 0x10, 0xff, \n  0xb2, 0xca, 0xfe, 0x3a, 0x91, 0xfe, 0xfb, 0xbf, 0x0e, 0x10, 0x6a, 0x17, 0xba, 0xfa, 0x09, 0x02, \n  0xc7, 0x04, 0x9d, 0x01, 0x07, 0xac, 0x7c, 0xff, 0x82, 0xa8, 0xfd, 0xb6, 0x48, 0x06, 0x8b, 0x8b, \n  0x02, 0x60, 0x5c, 0xfc, 0x10, 0x01, 0x00, 0xc1, 0xe6, 0x01, 0x1e, 0x80, 0x00, 0x51, 0xbe, 0xff, \n  0x73, 0x4e, 0x00, 0xed, 0x50, 0x01, 0xc4, 0x97, 0xff, 0x76, 0x1f, 0xfe, 0x46, 0xac, 0xfe, 0x75, \n  0xec, 0xfe, 0xbb, 0x8a, 0xfe, 0xac, 0x9b, 0xfe, 0x32, 0xa7, 0xff, 0xcd, 0x17, 0x01, 0x42, 0x6c, \n  0x01, 0x9f, 0x29, 0x01, 0x47, 0x91, 0x01, 0x71, 0xb9, 0x00, 0x4b, 0xac, 0xff, 0x56, 0xa7, 0xff, \n  0x31, 0x46, 0xff, 0x97, 0xfa, 0xfe, 0x72, 0x93, 0x10, 0xd8, 0x75, 0x19, 0x56, 0xa3, 0x09, 0xa5, \n  0x38, 0x04, 0xf3, 0x44, 0x07, 0x48, 0xf1, 0xfe, 0x27, 0xa9, 0xfd, 0x7c, 0xdc, 0x06, 0xb1, 0xd1, \n  0x01, 0xa4, 0xd5, 0xfb, 0xcb, 0x47, 0x00, 0x53, 0x0b, 0x02, 0x52, 0xe4, 0xff, 0x58, 0x36, 0xff, \n  0xa1, 0x40, 0x00, 0x62, 0x29, 0x01, 0x1d, 0xb8, 0xff, 0x0c, 0x28, 0xfe, 0xe9, 0x78, 0xfe, 0xe8, \n  0xcd, 0xfe, 0x67, 0x60, 0xfe, 0x78, 0x4c, 0xfe, 0x54, 0x2a, 0xff, 0x8c, 0x58, 0x00, 0xe1, 0xfb, \n  0x00, 0xe2, 0x9a, 0x00, 0x0f, 0xe2, 0x00, 0x3b, 0x9f, 0x00, 0x91, 0xc4, 0xff, 0xfd, 0xb3, 0xff, \n  0x72, 0x81, 0xff, 0x53, 0x8b, 0xff, 0xaf, 0xb1, 0x12, 0xd7, 0xb7, 0x1b, 0xd7, 0x01, 0x09, 0x26, \n  0xc2, 0x03, 0x84, 0x90, 0x07, 0x65, 0x2e, 0xfe, 0x75, 0xe6, 0xfd, 0x1d, 0x91, 0x07, 0xd4, 0xef, \n  0x00, 0x62, 0x75, 0xfb, 0x96, 0xa4, 0x00, 0xab, 0x1a, 0x02, 0xe8, 0x89, 0xff, 0x78, 0xcc, 0xfe, \n  0xea, 0xfe, 0xff, 0xd4, 0xf0, 0x00, 0x7d, 0xab, 0xff, 0xab, 0x79, 0xfe, 0x0c, 0x9f, 0xfe, 0xe9, \n  0x68, 0xfe, 0x67, 0x32, 0xfe, 0x97, 0x6f, 0xfe, 0xd6, 0x34, 0xff, 0x2e, 0xb7, 0xff, 0x34, 0xab, \n  0x00, 0x92, 0x58, 0x00, 0xb2, 0x2d, 0x00, 0xff, 0x37, 0x00, 0x43, 0x14, 0xff, 0x39, 0x7e, 0xff, \n  0x0d, 0xeb, 0xff, 0x87, 0xc2, 0xff, 0xb3, 0xb1, 0x14, 0xd2, 0xf3, 0x1d, 0x55, 0x8f, 0x08, 0x6c, \n  0x67, 0x03, 0xb8, 0xe2, 0x07, 0xf6, 0x12, 0xfd, 0x90, 0x0c, 0xfe, 0xbd, 0xaa, 0x08, 0x54, 0xf9, \n  0xff, 0x8f, 0xda, 0xfa, 0xa1, 0x0a, 0x01, 0x77, 0x43, 0x02, 0x2a, 0x48, 0xff, 0x38, 0x48, 0xfe, \n  0xf3, 0xa0, 0xff, 0x23, 0xc5, 0x00, 0xff, 0x84, 0xff, 0xe1, 0x77, 0xfe, 0x2a, 0xd0, 0xfe, 0xad, \n  0x4d, 0xfe, 0x1b, 0xfe, 0xfd, 0x05, 0x47, 0xfe, 0x7a, 0x90, 0xff, 0x60, 0x77, 0xff, 0x55, 0xf2, \n  0xff, 0x77, 0xbd, 0x00, 0xd9, 0xbb, 0xff, 0x05, 0x62, 0xff, 0x6f, 0xb0, 0xfe, 0x2a, 0xda, 0xfe, \n  0x86, 0x7e, 0xff, 0x79, 0xc0, 0xff, 0x87, 0x8f, 0x16, 0x05, 0x68, 0x20, 0xf0, 0x4c, 0x08, 0x35, \n  0xbc, 0x02, 0x9b, 0x54, 0x08, 0xc9, 0xf0, 0xfb, 0xb4, 0xdd, 0xfd, 0x8f, 0xc9, 0x09, 0xdf, 0x27, \n  0xff, 0x06, 0x49, 0xfa, 0x74, 0x58, 0x01, 0x9b, 0x33, 0x02, 0x59, 0x32, 0xff, 0x12, 0xfc, 0xfd, \n  0x35, 0xec, 0xfe, 0xe1, 0x88, 0x00, 0xc6, 0x80, 0xff, 0xdf, 0x65, 0xfe, 0x59, 0xc1, 0xfe, 0x91, \n  0x23, 0xfe, 0x4d, 0xfd, 0xfd, 0x0f, 0x13, 0xfe, 0x78, 0xac, 0xff, 0x4b, 0xc7, 0xff, 0x63, 0x45, \n  0xff, 0xef, 0x8f, 0x00, 0xd4, 0x01, 0x00, 0x4e, 0xbc, 0xfe, 0xa8, 0x64, 0xfe, 0xb1, 0x5b, 0xfe, \n  0xc8, 0x99, 0xfe, 0xed, 0x61, 0xff, 0x68, 0x0b, 0x18, 0xd3, 0xf8, 0x22, 0x27, 0x7d, 0x08, 0x95, \n  0xcc, 0x01, 0x20, 0xe0, 0x08, 0xa6, 0x3d, 0xfb, 0x1c, 0x6b, 0xfd, 0xe6, 0xc2, 0x0a, 0xa7, 0xa8, \n  0xfe, 0x25, 0xdd, 0xf9, 0x4f, 0xb8, 0x01, 0xbe, 0x4f, 0x02, 0x51, 0xc8, 0xfe, 0x58, 0x00, 0xfe, \n  0x54, 0x91, 0xfe, 0x60, 0xe0, 0xff, 0xbc, 0x80, 0xff, 0xa7, 0x66, 0xfe, 0x32, 0xdd, 0xfe, 0x91, \n  0x1a, 0xfe, 0xe9, 0xce, 0xfd, 0x3c, 0xd0, 0xfd, 0x90, 0xb8, 0xff, 0x69, 0x8a, 0x00, 0x41, 0x32, \n  0xff, 0x93, 0x97, 0xff, 0x41, 0x45, 0x00, 0xe1, 0xfb, 0xfe, 0xba, 0x03, 0xfe, 0x9e, 0x30, 0xfe, \n  0x6a, 0xc0, 0xfd, 0x2a, 0xda, 0xfe, 0x7e, 0x52, 0x1a, 0xb6, 0x21, 0x25, 0x8f, 0xfb, 0x07, 0x66, \n  0x9f, 0x01, 0xb6, 0xf3, 0x08, 0x1f, 0x1f, 0xfa, 0x0d, 0x82, 0xfd, 0xf7, 0x2c, 0x0b, 0x6c, 0xa5, \n  0xfd, 0x6c, 0x22, 0xfa, 0x2c, 0xf4, 0x01, 0x72, 0x1f, 0x02, 0xfc, 0x63, 0xfe, 0x91, 0xd5, 0xfd, \n  0xc4, 0xac, 0xfe, 0xf2, 0xef, 0xfe, 0x39, 0x0d, 0xff, 0x04, 0x92, 0xfe, 0x67, 0x12, 0xff, 0xad, \n  0xf6, 0xfd, 0xc1, 0x82, 0xfd, 0x35, 0x97, 0xfd, 0xfe, 0xa8, 0xff, 0x4b, 0xc6, 0x00, 0x5c, 0xb2, \n  0xff, 0x64, 0x27, 0xff, 0x02, 0x7c, 0xff, 0xd9, 0x6f, 0xff, 0xec, 0xc3, 0xfd, 0x65, 0xdf, 0xfd, \n  0x5d, 0xa4, 0xfd, 0x2a, 0x11, 0xfe, 0xa0, 0x1b, 0x1d, 0x2e, 0xb3, 0x26, 0x43, 0x25, 0x07, 0x7e, \n  0x99, 0x02, 0x00, 0x7a, 0x08, 0xb1, 0x0c, 0xf9, 0x5c, 0xe9, 0xfd, 0x5b, 0x41, 0x0b, 0xa8, 0x9a, \n  0xfc, 0xea, 0x9f, 0xfa, 0x94, 0x64, 0x02, 0xa1, 0xe5, 0x01, 0xca, 0x24, 0xfe, 0xbb, 0x69, 0xfd, \n  0x48, 0x43, 0xff, 0x33, 0x0f, 0xfe, 0x69, 0x53, 0xfe, 0x7e, 0xd8, 0xfe, 0x7a, 0x2e, 0xff, 0xb5, \n  0x30, 0xfe, 0x2d, 0x36, 0xfd, 0xde, 0x5f, 0xfd, 0x31, 0xd8, 0xff, 0xf6, 0xa1, 0x00, 0x81, 0xd5, \n  0xff, 0xc9, 0xe5, 0xff, 0xdf, 0xc1, 0xfe, 0x64, 0xe2, 0xfe, 0x3d, 0x04, 0xfe, 0xbc, 0xba, 0xfd, \n  0x19, 0x96, 0xfd, 0x70, 0xae, 0xfd, 0x51, 0x57, 0x1f, 0x4f, 0xdc, 0x27, 0x74, 0x2c, 0x07, 0x0c, \n  0xab, 0x03, 0x93, 0x12, 0x08, 0x7d, 0x9a, 0xf8, 0x53, 0x90, 0xfd, 0x92, 0x1a, 0x0b, 0x28, 0x36, \n  0xfc, 0xab, 0x03, 0xfb, 0xe9, 0x5c, 0x02, 0x89, 0x02, 0x02, 0xc9, 0x5b, 0xfe, 0x47, 0x8e, 0xfc, \n  0xef, 0xaf, 0xff, 0x83, 0xd5, 0xfd, 0x61, 0x79, 0xfd, 0x60, 0xb6, 0xfe, 0xb9, 0x58, 0xff, 0x30, \n  0x7f, 0xfe, 0xf3, 0x6c, 0xfd, 0xac, 0xf4, 0xfc, 0x09, 0xb7, 0xff, 0x0f, 0xfa, 0x00, 0x7c, 0x91, \n  0xff, 0x58, 0x76, 0x00, 0xbd, 0xd6, 0xfe, 0x91, 0x25, 0xfe, 0xe8, 0x02, 0xfe, 0x93, 0xb1, 0xfd, \n  0x05, 0x6f, 0xfd, 0xd0, 0xb9, 0xfd, 0x41, 0x24, 0x21, 0xc3, 0x87, 0x28, 0x45, 0xc6, 0x07, 0x11, \n  0xe8, 0x04, 0x6b, 0xe5, 0x07, 0x19, 0xa5, 0xf8, 0x99, 0x5c, 0xfc, 0x7f, 0xe9, 0x0a, 0x1f, 0x17, \n  0xfc, 0xd1, 0x3d, 0xfb, 0x2d, 0x6b, 0x02, 0xf3, 0xb9, 0x01, 0x85, 0xf1, 0xfe, 0x2e, 0x05, 0xfc, \n  0xdf, 0x57, 0xff, 0x57, 0x18, 0xfe, 0x27, 0xf0, 0xfc, 0xcb, 0xbf, 0xfd, 0x86, 0xb0, 0xff, 0x92, \n  0xe2, 0xfe, 0x9a, 0xa1, 0xfd, 0x8f, 0xe3, 0xfc, 0x09, 0xf1, 0xfe, 0xb3, 0xcf, 0x01, 0xa6, 0x66, \n  0xff, 0xbc, 0x16, 0x00, 0x2e, 0x5c, 0xff, 0x59, 0x0b, 0xfe, 0x25, 0xa6, 0xfd, 0xc0, 0x4b, 0xfd, \n  0x0d, 0x6b, 0xfd, 0xb5, 0xcf, 0xfd, 0xbd, 0x48, 0x23, 0xc5, 0x71, 0x28, 0x7c, 0xda, 0x07, 0xe2, \n  0xdb, 0x06, 0x42, 0x94, 0x08, 0xf5, 0xee, 0xf7, 0x9d, 0xf4, 0xfa, 0x61, 0x3a, 0x0b, 0x27, 0x6f, \n  0xfb, 0x00, 0x42, 0xfb, 0xd3, 0xeb, 0x02, 0x11, 0x38, 0x01, 0xf4, 0x02, 0xff, 0x9b, 0x57, 0xfc, \n  0xb2, 0xb5, 0xfe, 0x9d, 0xea, 0xfd, 0x3c, 0x18, 0xfd, 0xbf, 0x7d, 0xfc, 0xc7, 0x82, 0xff, 0x2b, \n  0xac, 0xff, 0xdf, 0x8b, 0xfd, 0x7c, 0x1c, 0xfd, 0x74, 0x7d, 0xfe, 0x15, 0xd3, 0x01, 0xff, 0x00, \n  0x00, 0x4e, 0x44, 0xff, 0xa9, 0x80, 0xff, 0xc6, 0x97, 0xfe, 0xef, 0x27, 0xfd, 0x9a, 0xcb, 0xfc, \n  0xbb, 0xa0, 0xfd, 0x67, 0x9b, 0xfd, 0x21, 0x88, 0x26, 0xd3, 0x7a, 0x27, 0x78, 0xfa, 0x05, 0xd5, \n  0xd1, 0x0a, 0x7d, 0x1a, 0x0a, 0xe1, 0x53, 0xf5, 0x98, 0x99, 0xfa, 0x9f, 0x06, 0x0c, 0x22, 0xea, \n  0xf9, 0xfe, 0x51, 0xfb, 0xbc, 0x9b, 0x03, 0x82, 0xfd, 0x00, 0xde, 0x84, 0xfe, 0xfc, 0xee, 0xfc, \n  0x85, 0xbd, 0xfe, 0x0e, 0xfa, 0xfc, 0xc6, 0x79, 0xfd, 0x67, 0xfc, 0xfb, 0xcf, 0x81, 0xfe, 0xd8, \n  0x56, 0x00, 0x29, 0xe7, 0xfd, 0x44, 0x14, 0xfd, 0x5c, 0xee, 0xfe, 0xf5, 0x2f, 0x01, 0xf3, 0x61, \n  0x00, 0x64, 0x62, 0xff, 0xc7, 0x25, 0xff, 0x2a, 0xc3, 0xfe, 0x0f, 0x16, 0xfd, 0xce, 0xaa, 0xfc, \n  0x64, 0xae, 0xfd, 0x59, 0x56, 0xfd, 0xb2, 0x66, 0x29, 0xc4, 0xf7, 0x25, 0x34, 0xb2, 0x03, 0xfc, \n  0xac, 0x10, 0x88, 0xfd, 0x0b, 0x01, 0x08, 0xf1, 0xe0, 0x90, 0xfb, 0x79, 0xd6, 0x0d, 0x49, 0x12, \n  0xf7, 0xce, 0x03, 0xfb, 0x9b, 0x0a, 0x05, 0x95, 0x15, 0x01, 0xae, 0xc4, 0xfd, 0x54, 0x11, 0xfd, \n  0x5d, 0x77, 0xff, 0xc0, 0x64, 0xfc, 0x33, 0x6e, 0xfd, 0xd3, 0xf4, 0xfb, 0x44, 0x36, 0xfd, 0x2f, \n  0x61, 0x00, 0x5c, 0x5b, 0xff, 0x6c, 0x7c, 0xfc, 0x81, 0x66, 0xff, 0xb6, 0x2a, 0x01, 0x92, 0x0f, \n  0x00, 0xea, 0x68, 0x00, 0x1f, 0x78, 0xfe, 0x90, 0x86, 0xfe, 0x85, 0xc1, 0xfd, 0xea, 0xc0, 0xfc, \n  0x42, 0xfa, 0xfc, 0xa8, 0xbe, 0xfd, 0x57, 0x7e, 0x2a, 0xd0, 0x96, 0x24, 0x05, 0x88, 0x02, 0xf5, \n  0xa9, 0x16, 0xdd, 0xd5, 0x0d, 0xb6, 0x4b, 0xec, 0x78, 0xb3, 0xfd, 0x93, 0xc0, 0x10, 0x5f, 0x5f, \n  0xf2, 0xb0, 0xf4, 0xf9, 0x54, 0xa6, 0x07, 0x1f, 0x60, 0x01, 0xb2, 0x91, 0xfc, 0x36, 0xaa, 0xfc, \n  0x0c, 0x96, 0x00, 0xae, 0x52, 0xfc, 0x59, 0x0d, 0xfd, 0xfc, 0x0f, 0xfc, 0xf2, 0xf8, 0xfb, 0x0e, \n  0x7d, 0xff, 0xfd, 0x10, 0x01, 0xf4, 0x6d, 0xfc, 0x83, 0x15, 0xff, 0x0c, 0xc2, 0x01, 0x75, 0x79, \n  0xff, 0xa4, 0x4f, 0x01, 0xf9, 0x67, 0xfe, 0x50, 0x13, 0xfe, 0xa4, 0x39, 0xfe, 0xc0, 0xe4, 0xfc, \n  0xeb, 0x4c, 0xfc, 0xe9, 0x49, 0xfe, 0x04, 0xf7, 0x2c, 0xef, 0x9e, 0x26, 0xd6, 0xff, 0xfd, 0x79, \n  0xa8, 0x16, 0xb1, 0x0c, 0x13, 0xe0, 0x6c, 0xeb, 0x88, 0x2a, 0xfc, 0x5b, 0x5e, 0x12, 0x38, 0xd1, \n  0xef, 0xc1, 0xb2, 0xf8, 0x7e, 0x8f, 0x09, 0xe6, 0x2d, 0x01, 0x1e, 0x5f, 0xfb, 0xe6, 0x8b, 0xfc, \n  0x77, 0xaa, 0x01, 0xa6, 0xa9, 0xfb, 0x03, 0x6b, 0xfc, 0x85, 0xc4, 0xfc, 0x22, 0x69, 0xfb, 0xf9, \n  0xa3, 0xfd, 0x4f, 0x7e, 0x01, 0xf3, 0xee, 0xfd, 0x03, 0x39, 0xfe, 0x5c, 0x17, 0x02, 0x98, 0x95, \n  0xff, 0x3e, 0x58, 0x01, 0x93, 0xbd, 0xfe, 0x06, 0xcb, 0xfd, 0x99, 0x4c, 0xfe, 0x88, 0xc9, 0xfc, \n  0xff, 0xf5, 0xfb, 0x01, 0x13, 0xfe, 0x36, 0x5c, 0x31, 0xe5, 0x87, 0x28, 0x66, 0x23, 0xf9, 0xeb, \n  0xc6, 0x13, 0x23, 0x5d, 0x18, 0xda, 0xe0, 0xec, 0xab, 0x80, 0xfa, 0x55, 0x77, 0x12, 0xde, 0x4e, \n  0xee, 0xdb, 0xed, 0xf7, 0x17, 0xcb, 0x0a, 0x04, 0x70, 0x01, 0xe4, 0xbe, 0xf9, 0xbe, 0x9f, 0xfc, \n  0x89, 0xd0, 0x02, 0x01, 0x31, 0xfb, 0x07, 0x85, 0xfb, 0x55, 0x56, 0xfd, 0x1d, 0xb4, 0xfb, 0x2e, \n  0x25, 0xfc, 0x95, 0x96, 0x00, 0x2c, 0xad, 0xff, 0x87, 0x4b, 0xfe, 0x40, 0x9f, 0x01, 0x03, 0x79, \n  0x00, 0xe4, 0x2f, 0x01, 0xf0, 0xed, 0xfe, 0x33, 0x2d, 0xfe, 0x45, 0x22, 0xfe, 0x98, 0x6b, 0xfc, \n  0x38, 0xe8, 0xfb, 0xe4, 0x87, 0xfd, 0xa7, 0xab, 0x35, 0x6d, 0xcb, 0x2a, 0xff, 0x25, 0xf4, 0x0d, \n  0x78, 0x10, 0xea, 0x8c, 0x1b, 0x83, 0x6b, 0xf0, 0x99, 0x93, 0xf9, 0xf0, 0x51, 0x11, 0x7b, 0xba, \n  0xed, 0xc9, 0x27, 0xf7, 0x75, 0x8d, 0x0b, 0x1f, 0x07, 0x02, 0x54, 0x13, 0xf8, 0xd5, 0x81, 0xfc, \n  0x31, 0xa0, 0x03, 0xf4, 0xe8, 0xfa, 0xb2, 0xa7, 0xfa, 0x9e, 0x77, 0xfd, 0xdc, 0x41, 0xfc, 0x4b, \n  0x49, 0xfb, 0xae, 0xd9, 0xfe, 0x27, 0xe9, 0x00, 0x88, 0x46, 0xff, 0x15, 0x97, 0x00, 0x2f, 0x77, \n  0x01, 0xba, 0x66, 0x01, 0xa1, 0xfd, 0xfe, 0xe9, 0xf2, 0xfe, 0xdb, 0xc6, 0xfd, 0x06, 0xc5, 0xfb, \n  0x45, 0x16, 0xfc, 0xf9, 0x13, 0xfd, 0xfa, 0x98, 0x39, 0x2d, 0xcc, 0x2d, 0xec, 0x3c, 0xf0, 0x96, \n  0xea, 0x0b, 0xd5, 0x69, 0x1d, 0x09, 0xf6, 0xf4, 0x3d, 0x83, 0xf9, 0xd5, 0x98, 0x0f, 0xa1, 0x3f, \n  0xed, 0xda, 0xd6, 0xf6, 0x71, 0x77, 0x0b, 0x8e, 0x06, 0x03, 0x4d, 0xb8, 0xf6, 0xab, 0x1b, 0xfc, \n  0x9c, 0x4f, 0x04, 0x9b, 0xc5, 0xfa, 0xd0, 0x48, 0xfa, 0x1d, 0x17, 0xfd, 0x31, 0x15, 0xfd, 0x4a, \n  0x17, 0xfb, 0x52, 0x1b, 0xfd, 0x2e, 0x0e, 0x01, 0x9e, 0xdd, 0x00, 0xe9, 0xe2, 0xff, 0x49, 0xcd, \n  0x01, 0x24, 0x37, 0x02, 0xd5, 0x47, 0xff, 0x9a, 0x9e, 0xff, 0xd1, 0x5f, 0xfd, 0xe6, 0x44, 0xfb, \n  0x7c, 0x09, 0xfc, 0xea, 0xc8, 0xfc, 0xdd, 0x2e, 0x3d, 0xc1, 0x2e, 0x31, 0xf3, 0x47, 0xed, 0xf6, \n  0x9d, 0x06, 0x96, 0x13, 0x1e, 0x06, 0x02, 0xf9, 0xc6, 0xd9, 0xfa, 0xeb, 0xef, 0x0d, 0xdb, 0xfc, \n  0xeb, 0x39, 0x69, 0xf7, 0xc8, 0xca, 0x0a, 0x0f, 0xa4, 0x03, 0xef, 0x24, 0xf6, 0x84, 0x4a, 0xfb, \n  0x32, 0x8e, 0x04, 0x3f, 0xbb, 0xfa, 0x09, 0x34, 0xfa, 0x9f, 0x6b, 0xfc, 0xae, 0xbe, 0xfd, 0xed, \n  0x51, 0xfb, 0x78, 0x18, 0xfc, 0xbc, 0xf2, 0xff, 0x0c, 0x2e, 0x02, 0x5c, 0x39, 0x00, 0x11, 0x59, \n  0x01, 0x7d, 0x3f, 0x03, 0xb9, 0xf3, 0xff, 0x38, 0xdd, 0xff, 0x81, 0xf6, 0xfc, 0xaf, 0x2f, 0xfb, \n  0xeb, 0xb4, 0xfb, 0xd8, 0x43, 0xfc, 0x41, 0xed, 0x3f, 0xc3, 0x46, 0x35, 0xaa, 0xde, 0xea, 0x3b, \n  0x52, 0x01, 0x68, 0xc4, 0x1d, 0x21, 0xd0, 0xfb, 0x5c, 0x3b, 0xfd, 0xc1, 0x2b, 0x0d, 0xd2, 0xb2, \n  0xe9, 0xda, 0xb0, 0xf8, 0xa0, 0x17, 0x0a, 0x07, 0x3b, 0x03, 0x04, 0x8f, 0xf6, 0x89, 0x4d, 0xfa, \n  0xf0, 0x02, 0x04, 0x12, 0xd3, 0xfa, 0x58, 0x6e, 0xfa, 0xf0, 0x8e, 0xfb, 0xe5, 0x39, 0xfe, 0xa3, \n  0xc9, 0xfb, 0x3b, 0xd5, 0xfb, 0xd7, 0x56, 0xfe, 0xe9, 0x88, 0x02, 0x04, 0x2f, 0x01, 0xf1, 0xeb, \n  0x00, 0xb1, 0x24, 0x04, 0x0f, 0xd1, 0x00, 0x36, 0xcf, 0xff, 0xa0, 0xc0, 0xfc, 0xad, 0x59, 0xfb, \n  0x1c, 0x46, 0xfb, 0x3c, 0xa7, 0xfb, 0xbb, 0x95, 0x43, 0xa7, 0xb8, 0x38, 0xc0, 0x9d, 0xe7, 0xb7, \n  0x6c, 0xfe, 0xe5, 0x11, 0x1c, 0x95, 0x94, 0xfc, 0x0f, 0xe1, 0x00, 0xc5, 0x34, 0x0d, 0x4f, 0x9b, \n  0xe6, 0x70, 0x86, 0xfa, 0x42, 0xff, 0x09, 0xc6, 0x91, 0x01, 0x37, 0xa8, 0xf7, 0xf6, 0xcb, 0xf9, \n  0xd8, 0xb9, 0x02, 0x36, 0xb3, 0xfa, 0xe3, 0x47, 0xfb, 0x24, 0x85, 0xfa, 0x44, 0xc5, 0xfe, 0x2f, \n  0x7d, 0xfc, 0x1f, 0xc2, 0xfb, 0x9b, 0x53, 0xfd, 0x7e, 0xf9, 0x01, 0x12, 0x0a, 0x02, 0x43, 0xe8, \n  0x00, 0xf4, 0x50, 0x05, 0x81, 0x8d, 0x01, 0xeb, 0x5e, 0xff, 0x7d, 0xf7, 0xfc, 0x78, 0x63, 0xfb, \n  0x70, 0xeb, 0xfa, 0x54, 0x27, 0xfb, 0xca, 0x93, 0x4a, 0x33, 0x77, 0x38, 0x5e, 0x93, 0xe2, 0x1f, \n  0x5f, 0x00, 0xcb, 0xd8, 0x17, 0xa0, 0x63, 0xfb, 0x01, 0x12, 0x06, 0x3f, 0x33, 0x0c, 0x99, 0xcd, \n  0xe3, 0xb6, 0x08, 0xfd, 0x9f, 0xf7, 0x09, 0x72, 0xd9, 0xfe, 0x13, 0x1b, 0xf9, 0x62, 0x8d, 0xf9, \n  0x8b, 0xe4, 0x00, 0xd3, 0x6f, 0xfa, 0xa7, 0xf9, 0xfb, 0x23, 0xfb, 0xf9, 0x9c, 0x15, 0xff, 0xdd, \n  0x4d, 0xfd, 0x72, 0x91, 0xfb, 0x54, 0xf4, 0xfc, 0xe0, 0x26, 0x01, 0xbf, 0x37, 0x02, 0x75, 0x0e, \n  0x01, 0x86, 0xec, 0x06, 0x4e, 0x2f, 0x02, 0xdc, 0x38, 0xfe, 0xc0, 0x8f, 0xfd, 0x0f, 0x10, 0xfb, \n  0xd1, 0x73, 0xfa, 0xa2, 0x0b, 0xfb, 0x00, 0x46, 0x51, 0xa3, 0x24, 0x38, 0xae, 0xe2, 0xdd, 0x9e, \n  0x7d, 0x03, 0xa3, 0x73, 0x12, 0x59, 0x2b, 0xfa, 0x6c, 0x4b, 0x0a, 0xf4, 0x7b, 0x0b, 0xf9, 0x73, \n  0xe2, 0x17, 0xa5, 0xfe, 0xf8, 0xd6, 0x09, 0x70, 0x31, 0xfc, 0x5b, 0x2f, 0xfb, 0x7a, 0x9a, 0xf8, \n  0x4e, 0x2b, 0xff, 0xf6, 0xa5, 0xfa, 0x5d, 0x04, 0xfc, 0x6c, 0x74, 0xfa, 0x89, 0x07, 0xff, 0x84, \n  0xe9, 0xfd, 0xe2, 0x07, 0xfc, 0x18, 0x54, 0xfc, 0xbe, 0xb0, 0x00, 0xe6, 0x0f, 0x02, 0x82, 0xd1, \n  0x00, 0xa2, 0xf2, 0x08, 0xcf, 0x02, 0x03, 0x09, 0xb8, 0xfc, 0xbe, 0x0f, 0xfe, 0x26, 0xce, 0xfa, \n  0x22, 0xb6, 0xf9, 0x9a, 0x7f, 0xfb, 0xbe, 0x5c, 0x56, 0x06, 0xbe, 0x38, 0x4d, 0xaf, 0xda, 0x4b, \n  0x20, 0x06, 0x84, 0x63, 0x0d, 0xc5, 0xab, 0xf8, 0xcb, 0x3a, 0x0d, 0x75, 0x50, 0x0b, 0x18, 0xd1, \n  0xe2, 0x75, 0x4e, 0xff, 0x94, 0x21, 0x09, 0x63, 0x9d, 0xfa, 0x9f, 0x04, 0xfd, 0xa8, 0x79, 0xf7, \n  0x94, 0x9c, 0xfd, 0x94, 0x2d, 0xfb, 0x19, 0x39, 0xfc, 0xf1, 0xf3, 0xfa, 0x14, 0xfa, 0xfe, 0x90, \n  0x61, 0xfe, 0x11, 0xe7, 0xfc, 0xdc, 0xc1, 0xfb, 0x85, 0x52, 0x00, 0xc8, 0x4f, 0x02, 0x2e, 0xfc, \n  0xff, 0x37, 0x94, 0x0a, 0xb4, 0x49, 0x04, 0x8f, 0x71, 0xfb, 0xac, 0xe6, 0xfd, 0x4a, 0xfa, 0xfa, \n  0xff, 0x29, 0xf9, 0xdc, 0x2e, 0xfc, 0x88, 0x7d, 0x59, 0x86, 0x36, 0x3a, 0xe7, 0x5f, 0xd9, 0x81, \n  0x44, 0x07, 0x22, 0xee, 0x08, 0x54, 0x8c, 0xf6, 0xce, 0x9b, 0x0e, 0x68, 0x89, 0x0b, 0x0a, 0x23, \n  0xe4, 0x7b, 0x0a, 0xff, 0x02, 0xd3, 0x07, 0x6f, 0x9c, 0xf9, 0xeb, 0x58, 0xfe, 0x9f, 0x76, 0xf6, \n  0x7c, 0xd9, 0xfb, 0x3b, 0xf2, 0xfb, 0xfe, 0xc9, 0xfc, 0x8f, 0x5f, 0xfa, 0xeb, 0x59, 0xff, 0xd5, \n  0x96, 0xfe, 0xc6, 0x71, 0xfd, 0x9c, 0xd5, 0xfb, 0x64, 0x65, 0xff, 0x66, 0x6e, 0x03, 0x9e, 0x94, \n  0xfe, 0xe9, 0x35, 0x0a, 0x72, 0xf6, 0x05, 0x86, 0x2a, 0xfb, 0x38, 0x72, 0xfc, 0x28, 0x85, 0xfb, \n  0x90, 0x5a, 0xf9, 0xd2, 0x27, 0xfc, 0x3a, 0xce, 0x5a, 0x18, 0x2b, 0x3c, 0xf1, 0x7c, 0xda, 0x42, \n  0x23, 0x07, 0xc5, 0x40, 0x05, 0x29, 0x19, 0xf4, 0xe9, 0xb3, 0x0e, 0xe6, 0x2c, 0x0c, 0xb8, 0x10, \n  0xe6, 0x50, 0x90, 0xfe, 0xa1, 0x2e, 0x06, 0x96, 0xdf, 0xf8, 0xb8, 0x91, 0xff, 0x99, 0xcf, 0xf5, \n  0x3f, 0x59, 0xfa, 0x2a, 0xe4, 0xfc, 0xdf, 0x76, 0xfd, 0xaa, 0x1b, 0xf9, 0x59, 0x28, 0x00, 0x39, \n  0xc6, 0xfe, 0x74, 0x6b, 0xfd, 0x42, 0x17, 0xfd, 0xb1, 0x36, 0xfe, 0x21, 0xee, 0x04, 0xb0, 0x23, \n  0xfd, 0xb7, 0x74, 0x07, 0x0e, 0xd6, 0x07, 0x09, 0x66, 0xfc, 0x3c, 0xbf, 0xfa, 0x2c, 0x1b, 0xfc, \n  0xed, 0x36, 0xfa, 0xd0, 0xf8, 0xfb, 0x4a, 0x0d, 0x5a, 0xe2, 0x22, 0x3f, 0xc8, 0x9a, 0xdd, 0x67, \n  0x21, 0x06, 0x53, 0xfa, 0x01, 0xf7, 0xed, 0xf1, 0x92, 0x41, 0x0d, 0xe4, 0x35, 0x0d, 0x13, 0x90, \n  0xe8, 0x97, 0xaf, 0xfd, 0xca, 0xd7, 0x04, 0x5a, 0xbd, 0xf7, 0x1a, 0x4a, 0x01, 0x6f, 0xaf, 0xf5, \n  0x5a, 0x53, 0xf9, 0x80, 0x85, 0xfd, 0xea, 0x02, 0xfe, 0xaa, 0xed, 0xf7, 0x9a, 0xc7, 0x00, 0x2d, \n  0x67, 0xff, 0xb0, 0x95, 0xfc, 0x1e, 0xf3, 0xff, 0x8a, 0xf1, 0xfc, 0xd2, 0x0a, 0x05, 0x64, 0xed, \n  0xfc, 0x3a, 0x63, 0x03, 0xb2, 0x40, 0x08, 0x8d, 0x64, 0xff, 0x8c, 0x80, 0xfa, 0x49, 0x60, 0xfb, \n  0xd7, 0x1f, 0xfc, 0x18, 0x5e, 0xfc, 0xa9, 0x19, 0x59, 0xa8, 0x80, 0x40, 0xe0, 0xd8, 0xe2, 0x7e, \n  0xe5, 0x04, 0x7a, 0xe3, 0xfe, 0x70, 0xf9, 0xef, 0x8d, 0x76, 0x0a, 0x4a, 0xca, 0x0e, 0xde, 0x61, \n  0xea, 0xb6, 0x5f, 0xfd, 0x23, 0x66, 0x03, 0x05, 0x73, 0xf6, 0xe2, 0x8b, 0x03, 0x34, 0x1f, 0xf6, \n  0x2e, 0x63, 0xf8, 0x94, 0xaa, 0xfd, 0xcc, 0x86, 0xfe, 0xd4, 0xd8, 0xf6, 0x1e, 0x77, 0x01, 0x77, \n  0xcc, 0xff, 0x20, 0x43, 0xfc, 0xcd, 0x1d, 0x03, 0x75, 0xc3, 0xfa, 0xc7, 0x25, 0x04, 0x9d, 0x53, \n  0xfe, 0x52, 0xde, 0xfe, 0xd1, 0x00, 0x07, 0x3c, 0x89, 0x03, 0x69, 0x2d, 0xfb, 0x78, 0xca, 0xfa, \n  0x96, 0xaf, 0xfe, 0xe5, 0x6f, 0xfb, 0xcb, 0x1d, 0x57, 0xdd, 0xc5, 0x41, 0xe5, 0xb1, 0xe8, 0x0f, \n  0x9f, 0x03, 0x4b, 0x80, 0xfc, 0xaf, 0x30, 0xed, 0xa9, 0x27, 0x07, 0xb7, 0x61, 0x10, 0x9d, 0x51, \n  0xeb, 0x1b, 0x76, 0xfd, 0xef, 0xe2, 0x01, 0x00, 0x59, 0xf5, 0xc8, 0x51, 0x06, 0xc0, 0x79, 0xf6, \n  0xbb, 0x90, 0xf7, 0x2f, 0x16, 0xfd, 0xe4, 0xd5, 0xfe, 0xe5, 0xaf, 0xf6, 0x02, 0xca, 0x00, 0xac, \n  0xab, 0x01, 0xa6, 0x96, 0xfb, 0xa9, 0xcf, 0x03, 0x3a, 0x4c, 0xfa, 0x71, 0xd7, 0x01, 0x06, 0x24, \n  0x00, 0x5c, 0x94, 0xfc, 0xc9, 0xbc, 0x03, 0x3b, 0x40, 0x06, 0x5f, 0x6a, 0xfe, 0xdd, 0xb6, 0xfa, \n  0x25, 0xce, 0xfe, 0xe2, 0x2e, 0xfb, 0x94, 0xb7, 0x54, 0x6a, 0x06, 0x43, 0x52, 0xd9, 0xed, 0x31, \n  0x9b, 0x04, 0xbf, 0x14, 0xfa, 0x4a, 0x11, 0xea, 0x49, 0xc4, 0x04, 0x48, 0x8f, 0x10, 0x0c, 0xd3, \n  0xec, 0xa7, 0x86, 0xfd, 0x20, 0x59, 0x01, 0xf0, 0xf1, 0xf4, 0xa2, 0x1a, 0x09, 0xdf, 0x3d, 0xf7, \n  0x12, 0x68, 0xf6, 0xff, 0xf3, 0xfc, 0xf6, 0xad, 0xfe, 0x8c, 0xb0, 0xf7, 0x86, 0x87, 0x00, 0x31, \n  0xb9, 0x02, 0x05, 0x36, 0xfa, 0x82, 0x09, 0x04, 0x78, 0x04, 0xfb, 0x72, 0xf8, 0xfe, 0x6c, 0xd3, \n  0x02, 0xbb, 0xad, 0xfc, 0x4e, 0x33, 0xff, 0x69, 0x4a, 0x08, 0x4b, 0x33, 0x02, 0xb9, 0x2e, 0xfa, \n  0xfe, 0x15, 0xff, 0x7a, 0xb8, 0xfc, 0xb7, 0x4d, 0x51, 0x7d, 0xc6, 0x44, 0x6e, 0x4b, 0xf2, 0x70, \n  0x2f, 0x06, 0x79, 0x8a, 0xf8, 0x20, 0x57, 0xe6, 0xd1, 0x80, 0x02, 0xa9, 0x9d, 0x0f, 0x6c, 0xb4, \n  0xee, 0xba, 0xc2, 0xfd, 0x3c, 0x0e, 0x01, 0x74, 0x7a, 0xf5, 0x3a, 0x21, 0x0b, 0x79, 0xc3, 0xf7, \n  0x40, 0xcc, 0xf5, 0x6d, 0x0e, 0xfc, 0xbf, 0x11, 0xff, 0xa3, 0x93, 0xfa, 0x9b, 0x63, 0xfd, 0x8f, \n  0x06, 0x03, 0x39, 0x81, 0xfa, 0xf0, 0xe9, 0x01, 0xe4, 0x10, 0xfd, 0x2f, 0x66, 0xfe, 0x4a, 0xf7, \n  0x01, 0x39, 0x60, 0x00, 0x3e, 0x44, 0xfd, 0x9b, 0x90, 0x04, 0x1e, 0x2d, 0x05, 0x70, 0xb6, 0xfc, \n  0x1f, 0x09, 0xff, 0x2d, 0x51, 0xfc, 0x61, 0xab, 0x4e, 0x95, 0xa5, 0x44, 0xe4, 0xc5, 0xf6, 0x1b, \n  0x79, 0x07, 0x6a, 0xd9, 0xf7, 0x1d, 0xf8, 0xe2, 0x1d, 0x6b, 0xff, 0x06, 0x28, 0x0e, 0xe4, 0x1b, \n  0xf1, 0x3c, 0x55, 0xfe, 0x10, 0xc4, 0x00, 0x77, 0xad, 0xf6, 0x63, 0x57, 0x0c, 0x9a, 0x5b, 0xf8, \n  0x3c, 0x0d, 0xf4, 0x61, 0xc4, 0xfd, 0x3b, 0x22, 0xff, 0x5f, 0x7b, 0xfa, 0xe1, 0xf8, 0xfb, 0x79, \n  0xa6, 0x01, 0x58, 0xe1, 0xfa, 0x66, 0x76, 0x01, 0xc8, 0x30, 0xfe, 0x8a, 0x83, 0xfe, 0x4b, 0x7e, \n  0x01, 0xa1, 0xc0, 0x04, 0x00, 0x14, 0xfc, 0xa3, 0x64, 0xfe, 0x2b, 0xf2, 0x07, 0x9c, 0xee, 0xfe, \n  0x03, 0x52, 0xfe, 0x30, 0xe0, 0xfc, 0xba, 0x29, 0x4d, 0x86, 0xbc, 0x42, 0x5f, 0x57, 0xfa, 0x2e, \n  0xfb, 0x09, 0xb1, 0xbf, 0xf6, 0x88, 0x84, 0xe0, 0x3e, 0x2b, 0xfc, 0xb1, 0xb3, 0x0b, 0x42, 0x62, \n  0xf5, 0x1a, 0x0a, 0xff, 0x69, 0xc3, 0xfe, 0x33, 0xd2, 0xfa, 0x19, 0x5f, 0x0b, 0x80, 0x8f, 0xf7, \n  0x55, 0xfc, 0xf6, 0x4f, 0xc4, 0xfc, 0x88, 0xca, 0xfd, 0x64, 0xa8, 0xfb, 0x21, 0x50, 0xf9, 0x94, \n  0x3e, 0x00, 0xf7, 0x7f, 0xfd, 0x6d, 0x9f, 0x00, 0xaa, 0x56, 0xfd, 0xac, 0x96, 0x02, 0x4e, 0xec, \n  0x00, 0x6c, 0x61, 0x03, 0xe0, 0x42, 0x00, 0x63, 0xd7, 0xfa, 0x97, 0xfe, 0x03, 0x30, 0xff, 0x00, \n  0xa8, 0x44, 0x00, 0xd8, 0xb1, 0xfd, 0xe8, 0x78, 0x4b, 0xf3, 0xfc, 0x40, 0xfb, 0xaa, 0xfc, 0x7d, \n  0xa3, 0x0c, 0x0d, 0xe9, 0xf5, 0x3e, 0x87, 0xde, 0xc7, 0xff, 0xf7, 0xae, 0x09, 0x0b, 0xa4, 0x2c, \n  0xf9, 0xeb, 0xa4, 0xff, 0xee, 0xca, 0xfd, 0xb5, 0xb4, 0xfc, 0xce, 0x7b, 0x0b, 0x1d, 0x8b, 0xf8, \n  0x55, 0x42, 0xf7, 0xb2, 0x07, 0xfc, 0x82, 0xe3, 0xfc, 0x97, 0x95, 0xfa, 0x23, 0x86, 0xf8, 0x79, \n  0x3e, 0x01, 0xe0, 0xcf, 0xfc, 0xc2, 0x42, 0x01, 0xfc, 0xe0, 0xff, 0x12, 0xf1, 0x01, 0x48, 0xb3, \n  0x00, 0x42, 0xe4, 0x03, 0xf2, 0x17, 0x03, 0x4b, 0x3e, 0xf9, 0x33, 0xc3, 0xfe, 0x7a, 0x43, 0x01, \n  0xe3, 0xbc, 0x02, 0xa2, 0xc7, 0xfe, 0xd5, 0xe8, 0x4b, 0xa3, 0x2f, 0x3c, 0x75, 0xee, 0xfe, 0x81, \n  0xf1, 0x0f, 0x4c, 0x30, 0xf3, 0x70, 0x1a, 0xde, 0x7c, 0xcb, 0xf5, 0x7d, 0x84, 0x08, 0x31, 0x1d, \n  0xff, 0xe9, 0xdd, 0xff, 0x5d, 0x00, 0xfa, 0xbe, 0x4b, 0x02, 0x00, 0x86, 0x0a, 0x5b, 0x1d, 0xf7, \n  0xdb, 0xed, 0xf9, 0xa3, 0x6c, 0xf9, 0xf4, 0xe5, 0xfa, 0xc4, 0x72, 0xfc, 0x98, 0x87, 0xf8, 0xf3, \n  0x65, 0xff, 0x48, 0x80, 0xff, 0x51, 0xbc, 0x02, 0x01, 0x9a, 0xfe, 0x99, 0x51, 0x01, 0x93, 0x3d, \n  0x03, 0x97, 0x28, 0x04, 0x7e, 0x10, 0x01, 0xc0, 0x21, 0xfc, 0x25, 0x17, 0xfc, 0x9c, 0x4d, 0xfd, \n  0x15, 0x6b, 0x04, 0xc3, 0x8e, 0x00, 0x88, 0xda, 0x4a, 0x77, 0xdf, 0x37, 0x5a, 0xa9, 0x00, 0xd5, \n  0x1b, 0x13, 0xde, 0x58, 0xf0, 0x1e, 0x0c, 0xdf, 0x3a, 0xec, 0xf3, 0x20, 0xb9, 0x06, 0x21, 0x45, \n  0x03, 0x60, 0xab, 0x00, 0x8b, 0xd4, 0xf7, 0x83, 0x22, 0x04, 0xf4, 0xd6, 0x0a, 0x03, 0xaa, 0xf6, \n  0xf9, 0xc4, 0xf9, 0x82, 0x9c, 0xf6, 0xf3, 0xb5, 0xfc, 0x5c, 0xec, 0xfc, 0x19, 0x6a, 0xf6, 0x96, \n  0xd0, 0x02, 0x41, 0x19, 0x00, 0x7b, 0x09, 0x00, 0x96, 0x71, 0x00, 0xc5, 0xcb, 0x01, 0xcb, 0x5d, \n  0x02, 0xcd, 0x31, 0x05, 0x98, 0xea, 0xff, 0xa5, 0x82, 0xfd, 0x6d, 0xb1, 0xfc, 0xaf, 0xc6, 0xf8, \n  0x89, 0x81, 0x03, 0x2a, 0x21, 0x02, 0x02, 0xfe, 0x46, 0xf1, 0x1c, 0x34, 0x6d, 0x71, 0x05, 0xb7, \n  0xbd, 0x13, 0x97, 0xa0, 0xec, 0x3c, 0x64, 0xe6, 0xc2, 0x7e, 0xef, 0x1b, 0x02, 0x01, 0x96, 0x92, \n  0x0d, 0x16, 0x79, 0xff, 0x9a, 0xf1, 0xf1, 0xad, 0x0d, 0x09, 0x7d, 0x12, 0x0a, 0x10, 0x4a, 0xf5, \n  0xae, 0x26, 0xfa, 0x0f, 0x16, 0xf6, 0x46, 0xe7, 0xfc, 0xfb, 0xc7, 0xfd, 0x05, 0xe9, 0xf7, 0x3d, \n  0xf9, 0x02, 0xe0, 0xec, 0xfe, 0x72, 0xa9, 0xff, 0xfe, 0xc6, 0x02, 0x0d, 0x31, 0x00, 0xb4, 0x1e, \n  0x01, 0x4d, 0x3c, 0x07, 0x7b, 0x36, 0x00, 0xb7, 0x2e, 0xfc, 0xbd, 0x6d, 0xfe, 0xf7, 0x1d, 0xf8, \n  0x87, 0x8e, 0xff, 0xf4, 0xd0, 0x02, 0xa7, 0x8a, 0x47, 0x30, 0x2f, 0x31, 0x6a, 0x7b, 0x04, 0x44, \n  0x43, 0x0f, 0x0c, 0x5a, 0xed, 0x92, 0xed, 0xed, 0x60, 0x3b, 0xed, 0xc0, 0x08, 0xff, 0x54, 0x1f, \n  0x11, 0x90, 0x87, 0xfe, 0x88, 0x64, 0xf1, 0x71, 0x84, 0x09, 0xf3, 0x15, 0x08, 0xe4, 0x11, 0xf6, \n  0x14, 0x24, 0xfb, 0xa5, 0xf7, 0xf3, 0x0a, 0xa0, 0xff, 0x33, 0xc4, 0xff, 0x7e, 0x51, 0xf7, 0xdc, \n  0x9e, 0x02, 0x9b, 0xad, 0xfe, 0xfa, 0xaa, 0x00, 0x13, 0x4c, 0x02, 0x08, 0x5b, 0xff, 0xb7, 0xbc, \n  0x01, 0x4f, 0x87, 0x07, 0xbe, 0x5d, 0x00, 0xe3, 0x4f, 0xfc, 0x8c, 0xb1, 0xfd, 0xb1, 0xde, 0xf8, \n  0x71, 0xa4, 0xfe, 0x54, 0x4c, 0x02, 0x17, 0x68, 0x4a, 0x88, 0xd7, 0x2d, 0x5f, 0x46, 0xfc, 0x63, \n  0x03, 0x11, 0xd8, 0xf2, 0xec, 0x23, 0xe1, 0xf0, 0x9e, 0x39, 0xf3, 0xaa, 0x05, 0xfa, 0xd3, 0xc3, \n  0x10, 0x99, 0x8f, 0x00, 0x96, 0x55, 0xf0, 0x08, 0x35, 0x08, 0x02, 0xf9, 0x07, 0x5f, 0xb5, 0xf5, \n  0x62, 0xdc, 0xfa, 0xf8, 0x52, 0xf7, 0xa5, 0xc3, 0xff, 0xe9, 0x1e, 0xff, 0x33, 0x0d, 0xf8, 0xd0, \n  0xf9, 0x02, 0x72, 0x6d, 0xff, 0x48, 0x93, 0xfe, 0x49, 0x54, 0x01, 0x76, 0x8b, 0x01, 0x09, 0x4c, \n  0x02, 0x24, 0x83, 0x05, 0x53, 0x91, 0x00, 0x52, 0x05, 0xfd, 0xff, 0xae, 0xfc, 0x12, 0xf6, 0xf9, \n  0x10, 0x25, 0xff, 0x80, 0xc5, 0x00, 0xf6, 0x47, 0x4a, 0x4e, 0x01, 0x29, 0x4f, 0xdf, 0xf6, 0x25, \n  0x59, 0x16, 0x4d, 0x92, 0xee, 0xd4, 0xb6, 0xef, 0x1c, 0x1e, 0xf6, 0xa5, 0xb5, 0xfc, 0x83, 0xc8, \n  0x0c, 0x93, 0x2f, 0xfe, 0xbd, 0x77, 0xf3, 0x66, 0x2d, 0x07, 0x4f, 0x78, 0x07, 0xd3, 0xf8, 0xf4, \n  0x5f, 0xea, 0xfc, 0x28, 0xb0, 0xf9, 0x15, 0x46, 0xff, 0x12, 0x72, 0xfe, 0x81, 0x80, 0xf8, 0x73, \n  0x31, 0x04, 0x15, 0x89, 0xfe, 0xb0, 0x68, 0xfd, 0xa3, 0x86, 0x01, 0xd5, 0x37, 0x02, 0x26, 0xa3, \n  0x02, 0x0f, 0xfd, 0x04, 0x03, 0xe0, 0xff, 0xef, 0x42, 0xfd, 0x6d, 0xd0, 0xfc, 0x35, 0xb8, 0xfa, \n  0xc0, 0x1e, 0x00, 0x11, 0x2b, 0x00, 0x68, 0xf3, 0x46, 0xdb, 0x32, 0x25, 0x35, 0x1b, 0xf4, 0x28, \n  0xa6, 0x1b, 0x6f, 0x99, 0xf0, 0x29, 0xc3, 0xec, 0x47, 0xf2, 0xfb, 0x76, 0xb6, 0xfc, 0xda, 0xfa, \n  0x06, 0x58, 0xc2, 0xff, 0xa7, 0x24, 0xf5, 0xf1, 0x85, 0x05, 0x0c, 0x75, 0x07, 0x2e, 0xc1, 0xf6, \n  0x0b, 0x5c, 0xfd, 0x61, 0x10, 0xfb, 0xa4, 0x37, 0xff, 0xbe, 0xf8, 0xfd, 0x66, 0x08, 0xfa, 0xff, \n  0xe5, 0x02, 0xa2, 0xf7, 0xfd, 0xb8, 0x6d, 0xfe, 0xa6, 0x48, 0x01, 0xa7, 0x3a, 0x01, 0xa6, 0x84, \n  0x03, 0x18, 0x4e, 0x05, 0xac, 0xaf, 0xfe, 0x64, 0x31, 0xfd, 0x3b, 0xa5, 0xfd, 0x63, 0x90, 0xfb, \n  0x94, 0x03, 0x00, 0x77, 0x55, 0x01, 0x00, 0xd8, 0x40, 0xf7, 0xf7, 0x21, 0xa5, 0x6b, 0xf7, 0xd7, \n  0xec, 0x1a, 0xe6, 0xa4, 0xf1, 0x31, 0xad, 0xf1, 0x88, 0x29, 0xfc, 0x0e, 0x1e, 0xf9, 0xff, 0x75, \n  0x07, 0x98, 0xfb, 0xff, 0xd2, 0x31, 0xf5, 0x31, 0xa8, 0x04, 0x01, 0x37, 0x08, 0xd9, 0xa8, 0xf8, \n  0x68, 0x24, 0xfd, 0x45, 0xa6, 0xfb, 0xd4, 0x66, 0xff, 0x9d, 0xd4, 0xfe, 0x00, 0xe3, 0xf9, 0x28, \n  0x8a, 0x01, 0x09, 0x95, 0xfe, 0x6d, 0xe3, 0xfe, 0x06, 0xa9, 0x00, 0x3e, 0x47, 0x01, 0xe7, 0x98, \n  0x03, 0x62, 0xbd, 0x04, 0xd8, 0xdb, 0xfe, 0x2b, 0xb0, 0xfc, 0x9e, 0x54, 0xfe, 0x47, 0x07, 0xfd, \n  0xe0, 0x57, 0xff, 0x95, 0x68, 0x01, 0xf4, 0xed, 0x38, 0x9e, 0x1d, 0x21, 0x65, 0x01, 0x01, 0x6b, \n  0x47, 0x11, 0x97, 0x00, 0xef, 0xad, 0x88, 0xf6, 0xab, 0x65, 0x00, 0x15, 0x2a, 0xff, 0x66, 0x1a, \n  0xff, 0x89, 0xc1, 0xfc, 0xb2, 0xc4, 0xf8, 0xd7, 0x47, 0x06, 0xe5, 0xb8, 0x04, 0xd6, 0x1a, 0xf8, \n  0xd9, 0xf3, 0x00, 0xc5, 0x46, 0xfb, 0x95, 0x40, 0xfe, 0x08, 0xbd, 0xff, 0x2f, 0x55, 0xfa, 0x58, \n  0x6b, 0x01, 0xc3, 0xc8, 0xfe, 0x18, 0x2b, 0xfd, 0x3b, 0x71, 0x01, 0xe4, 0xd9, 0x00, 0x61, 0x66, \n  0xfe, 0x7d, 0x4d, 0x03, 0xbb, 0x55, 0x01, 0x0f, 0x47, 0xff, 0x87, 0x7d, 0x00, 0xb8, 0x6d, 0xfc, \n  0x0d, 0xd7, 0xfe, 0x51, 0x3b, 0xff, 0x0e, 0xf7, 0x2f, 0xe1, 0xe2, 0x1f, 0x73, 0x95, 0x05, 0x14, \n  0x9b, 0x0d, 0xbd, 0x5e, 0xf3, 0x5d, 0x14, 0xfb, 0x04, 0x14, 0xfe, 0x43, 0xd3, 0xfd, 0x7c, 0x9f, \n  0x00, 0x2f, 0xb2, 0xfd, 0x35, 0x7c, 0xf8, 0x7e, 0x29, 0x05, 0x74, 0xae, 0x05, 0x7d, 0xc5, 0xf9, \n  0x5c, 0x55, 0x00, 0xbb, 0x12, 0xfc, 0xa4, 0xe2, 0xfe, 0x78, 0x91, 0xff, 0xcc, 0x45, 0xfb, 0x67, \n  0xea, 0x00, 0x63, 0xc8, 0xfe, 0x0e, 0xb0, 0xfd, 0xfb, 0x1e, 0x01, 0xaf, 0x97, 0x00, 0x69, 0x15, \n  0xff, 0x43, 0x52, 0x03, 0x4c, 0x40, 0x01, 0xfd, 0xdb, 0xff, 0x65, 0xa9, 0xff, 0xaa, 0xb7, 0xfc, \n  0xbd, 0x11, 0x00, 0xbd, 0xfb, 0xff, 0x31, 0x5a, 0x26, 0x09, 0xd8, 0x1f, 0x21, 0xbb, 0x09, 0x1a, \n  0x86, 0x09, 0x3b, 0xe3, 0xf7, 0x5c, 0xaa, 0xfd, 0xde, 0xc9, 0xfc, 0x93, 0xc4, 0xfc, 0xbb, 0x30, \n  0x01, 0x8c, 0x51, 0xfe, 0xf5, 0x27, 0xf9, 0xfd, 0x6f, 0x04, 0xae, 0xbd, 0x04, 0x9d, 0xa2, 0xfb, \n  0x8a, 0x16, 0x00, 0x0b, 0xc5, 0xfc, 0x40, 0xd4, 0xfe, 0x7c, 0x33, 0xff, 0xcb, 0x7d, 0xfc, 0x66, \n  0x91, 0x00, 0x00, 0x62, 0xfe, 0x46, 0xd8, 0xfd, 0x9a, 0x3a, 0x01, 0x1f, 0x31, 0x00, 0xdc, 0xb3, \n  0xff, 0xf3, 0x98, 0x02, 0xe4, 0xfa, 0x00, 0xb5, 0x8b, 0x00, 0x1b, 0x60, 0xff, 0x6e, 0x6e, 0xfd, \n  0xa8, 0xcd, 0x00, 0x3b, 0xc4, 0x00, 0x5d, 0x1a, 0x20, 0xf6, 0x22, 0x1e, 0xf7, 0x51, 0x0a, 0x86, \n  0xa8, 0x09, 0xe9, 0xea, 0xfa, 0x2b, 0xfe, 0xfc, 0x80, 0xdd, 0xfd, 0x3e, 0xbd, 0xfd, 0x6d, 0xbc, \n  0x00, 0x66, 0x1c, 0xfe, 0x47, 0xb9, 0xfa, 0xca, 0xdd, 0x03, 0x2a, 0x15, 0x04, 0xb9, 0x88, 0xfc, \n  0x48, 0x04, 0x00, 0x99, 0xca, 0xfd, 0x1f, 0x8a, 0xfe, 0x54, 0x7f, 0xff, 0x9d, 0x59, 0xfd, 0xa3, \n  0xde, 0xff, 0x31, 0x9d, 0xfe, 0xfb, 0xcd, 0xfe, 0x37, 0x82, 0x00, 0xee, 0xca, 0xff, 0x78, 0x78, \n  0x00, 0xa9, 0x25, 0x02, 0xbf, 0x7e, 0x01, 0xe4, 0xfa, 0x00, 0xab, 0x7c, 0xff, 0xcd, 0xf0, 0xfe, \n  0xe2, 0x64, 0x01, 0xbc, 0x08, 0x00, 0x69, 0x5b, 0x1c, 0x39, 0x35, 0x1b, 0x9a, 0xe4, 0x09, 0x64, \n  0xa7, 0x0a, 0xe9, 0x52, 0xfc, 0x2f, 0x3e, 0xfc, 0xa8, 0x4d, 0xff, 0x88, 0x33, 0xff, 0xb0, 0x85, \n  0xff, 0xae, 0x39, 0xfe, 0xcc, 0x6d, 0xfc, 0x5c, 0xf6, 0x02, 0xf3, 0x7f, 0x03, 0x0f, 0xe2, 0xfc, \n  0xa2, 0x66, 0x00, 0x67, 0xb8, 0xfe, 0xc8, 0x0f, 0xfe, 0x5e, 0x9e, 0xff, 0xa9, 0x54, 0xfe, 0xa2, \n  0xa0, 0xff, 0x67, 0xa5, 0xfe, 0x2d, 0x35, 0xff, 0x09, 0xd3, 0xff, 0x9b, 0x17, 0x00, 0x47, 0x21, \n  0x01, 0x7c, 0x36, 0x02, 0xec, 0x78, 0x02, 0xc8, 0xfb, 0x00, 0xac, 0x9e, 0xff, 0x16, 0xd8, 0xff, \n  0xb9, 0xd1, 0x00, 0x60, 0x1b, 0xff, 0xd2, 0xa9, 0x18, 0xec, 0x77, 0x18, 0x61, 0x6e, 0x0a, 0xd9, \n  0xe8, 0x0a, 0x07, 0x90, 0xfd, 0xb4, 0x80, 0xfc, 0x4f, 0xde, 0xff, 0xa2, 0x67, 0x00, 0xd8, 0x46, \n  0xff, 0x48, 0xc4, 0xfe, 0xd7, 0x33, 0xfd, 0x01, 0xe9, 0x01, 0x70, 0x79, 0x03, 0x4b, 0xf4, 0xfd, \n  0x77, 0x6b, 0x00, 0x5f, 0xe4, 0xfe, 0x93, 0x61, 0xfe, 0xc8, 0x6f, 0x00, 0x57, 0xfb, 0xfe, 0xaf, \n  0xc2, 0xfe, 0xa5, 0x46, 0xff, 0xf9, 0xdb, 0xff, 0xc6, 0x88, 0xff, 0xa4, 0x3e, 0x01, 0x71, 0xcc, \n  0x01, 0xe8, 0x99, 0x02, 0xc5, 0xdb, 0x02, 0x8e, 0x71, 0x00, 0xa2, 0x96, 0xff, 0x25, 0xc9, 0xff, \n  0xd7, 0x34, 0x00, 0xf7, 0xbc, 0xfe, 0x3b, 0x29, 0x15, 0x3c, 0xf7, 0x15, 0x95, 0x0f, 0x0b, 0x93, \n  0x00, 0x0b, 0x44, 0xbd, 0xfe, 0xfa, 0xb6, 0xfc, 0x4a, 0x1a, 0x00, 0x62, 0xca, 0x01, 0x2b, 0x42, \n  0xff, 0xcd, 0xe0, 0xfe, 0x76, 0xb2, 0xfd, 0xc5, 0x54, 0x01, 0x3b, 0x81, 0x03, 0xa1, 0x87, 0xfe, \n  0x7e, 0x8f, 0x00, 0x6a, 0x52, 0xff, 0xce, 0xec, 0xfe, 0x8e, 0xdd, 0x00, 0x60, 0xed, 0xfe, 0xa3, \n  0xe1, 0xfe, 0x64, 0x6c, 0x00, 0xff, 0x91, 0x00, 0x79, 0x3a, 0x00, 0xd8, 0xab, 0x01, 0x68, 0xce, \n  0x01, 0x6a, 0xea, 0x02, 0x2a, 0xf1, 0x01, 0xa6, 0x53, 0xff, 0xca, 0xcc, 0xff, 0x7a, 0x0e, 0x00, \n  0x2b, 0xd5, 0xff, 0x01, 0x79, 0xfe, 0x4f, 0x81, 0x12, 0x9a, 0x8d, 0x14, 0xe5, 0xda, 0x0a, 0x1c, \n  0xf9, 0x09, 0x48, 0x20, 0x00, 0xd9, 0x6d, 0xfd, 0x97, 0x60, 0x00, 0x5d, 0x56, 0x02, 0xf2, 0x51, \n  0xff, 0x4b, 0x7f, 0xff, 0x24, 0x23, 0xfe, 0x8c, 0x86, 0x00, 0x0e, 0x8a, 0x03, 0x89, 0xdc, 0xff, \n  0xcf, 0x53, 0x00, 0x42, 0x7c, 0xff, 0x82, 0xbb, 0xff, 0x64, 0xfc, 0x00, 0x5f, 0xba, 0xff, 0x11, \n  0x4b, 0x00, 0x37, 0x9e, 0x01, 0x6b, 0x6c, 0x00, 0x98, 0x2b, 0x00, 0x8d, 0x0a, 0x02, 0xdf, 0x54, \n  0x01, 0xd5, 0x8b, 0x01, 0xd0, 0x23, 0x01, 0x0a, 0xb4, 0xff, 0xed, 0x15, 0x00, 0xe7, 0xe7, 0xff, \n  0xd5, 0x48, 0xff, 0xf4, 0xab, 0xfe, 0x40, 0x8d, 0x0f, 0xa5, 0x58, 0x12, 0x58, 0xa3, 0x0b, 0xb9, \n  0x92, 0x0a, 0x40, 0x84, 0x00, 0x76, 0x5c, 0xfd, 0x89, 0xbd, 0x00, 0xf9, 0x60, 0x03, 0x1d, 0xb5, \n  0xff, 0xb1, 0x42, 0xff, 0xbd, 0x74, 0xfe, 0x86, 0xa9, 0x00, 0x59, 0x9e, 0x03, 0x6c, 0x61, 0x00, \n  0x83, 0x64, 0x00, 0xb2, 0xf9, 0xff, 0xff, 0x01, 0x01, 0x1a, 0x36, 0x02, 0x77, 0xe9, 0x00, 0xbf, \n  0xe3, 0x00, 0x62, 0xec, 0x00, 0xa1, 0x2f, 0x00, 0xcc, 0x01, 0x00, 0xfe, 0xcb, 0x00, 0x4a, 0xe5, \n  0x00, 0xd1, 0x49, 0x01, 0x04, 0xf4, 0x00, 0xb3, 0xc1, 0xff, 0x52, 0x25, 0x00, 0xba, 0xe0, 0xff, \n  0xe3, 0xf1, 0xfe, 0x01, 0xfa, 0xfe, 0x18, 0x39, 0x0e, 0x50, 0x74, 0x11, 0x33, 0x70, 0x0b, 0xc0, \n  0x1b, 0x09, 0xbf, 0xa9, 0x00, 0xbf, 0x47, 0xfe, 0x4a, 0x82, 0x01, 0xbf, 0x39, 0x03, 0xd2, 0xe2, \n  0xff, 0x8b, 0xc7, 0xff, 0xf0, 0xc4, 0xfe, 0xdd, 0xe2, 0x00, 0x03, 0xa4, 0x03, 0x07, 0xb1, 0x00, \n  0x7c, 0x52, 0x01, 0x1b, 0x36, 0x02, 0xd7, 0x3b, 0x02, 0x0f, 0xb4, 0x01, 0xa4, 0xb7, 0x00, 0xfc, \n  0xb9, 0x00, 0xa6, 0x9f, 0xff, 0x84, 0x23, 0xff, 0x57, 0x0f, 0x00, 0xbe, 0xbb, 0x00, 0xee, 0x99, \n  0x00, 0x3f, 0xcf, 0x00, 0xfc, 0x90, 0x00, 0x43, 0x1c, 0x00, 0xe7, 0x46, 0x00, 0x04, 0x45, 0xff, \n  0x11, 0xe7, 0xfe, 0xf7, 0xd9, 0xfe, 0xa3, 0xbe, 0x0c, 0x5b, 0x54, 0x10, 0x0a, 0xa8, 0x0b, 0xc6, \n  0xcc, 0x08, 0x09, 0x48, 0x00, 0x41, 0x92, 0xfe, 0x87, 0x92, 0x02, 0xd1, 0x9c, 0x03, 0x7a, 0xb7, \n  0xff, 0x1d, 0x6e, 0x00, 0x83, 0x34, 0xff, 0x48, 0xa4, 0x00, 0x3f, 0x33, 0x05, 0x28, 0xe4, 0x02, \n  0xa0, 0xff, 0x01, 0x9c, 0xe8, 0x01, 0xd7, 0x92, 0x01, 0x4c, 0x5d, 0x01, 0xfa, 0xc2, 0xff, 0x27, \n  0xe8, 0xfe, 0x74, 0x60, 0xff, 0xee, 0x02, 0x00, 0xf0, 0x8a, 0xff, 0xd3, 0x18, 0x00, 0x70, 0x8f, \n  0x00, 0x91, 0xb9, 0x00, 0x7f, 0x95, 0x00, 0x05, 0xdc, 0xff, 0xec, 0xdc, 0xff, 0x57, 0xf5, 0xfe, \n  0xc3, 0xbd, 0xfe, 0x7f, 0xca, 0xfe, 0x88, 0x2d, 0x0c, 0x79, 0x19, 0x10, 0x86, 0x5b, 0x0b, 0x16, \n  0x9f, 0x07, 0x1d, 0xfe, 0xff, 0x0a, 0x9d, 0xff, 0xf5, 0x6f, 0x03, 0x21, 0xfe, 0x03, 0x43, 0x4f, \n  0xff, 0xf8, 0x99, 0x00, 0x9b, 0x02, 0x02, 0x05, 0xea, 0x02, 0x18, 0xec, 0x04, 0x4d, 0xde, 0x01, \n  0xc3, 0xa7, 0x01, 0xbb, 0x5a, 0x01, 0x17, 0xea, 0xff, 0x55, 0xe4, 0xff, 0x5e, 0x84, 0xff, 0x47, \n  0xf2, 0xfe, 0x55, 0x5f, 0xff, 0xb3, 0x9c, 0xff, 0x92, 0x3c, 0xff, 0xc4, 0xc6, 0x00, 0xb6, 0x62, \n  0x00, 0x82, 0x83, 0xff, 0x3c, 0x60, 0x00, 0x84, 0x0a, 0x00, 0xb7, 0x28, 0xff, 0xc8, 0xc0, 0xfe, \n  0x97, 0xd4, 0xfe, 0x99, 0x5f, 0xfe, 0x15, 0xa1, 0x0c, 0x91, 0xd3, 0x10, 0x57, 0x46, 0x0a, 0xba, \n  0x24, 0x06, 0x92, 0x4c, 0x00, 0x01, 0x1d, 0x01, 0x61, 0x72, 0x03, 0x1b, 0xa1, 0x04, 0x58, 0x24, \n  0x02, 0xa3, 0x64, 0x02, 0x20, 0x8d, 0x02, 0xd1, 0x91, 0x01, 0x6a, 0x9b, 0x03, 0x85, 0x74, 0x01, \n  0xe5, 0xd1, 0xff, 0xca, 0xf6, 0xff, 0xfc, 0x12, 0x00, 0xcd, 0xc4, 0xff, 0xc2, 0xf5, 0xfe, 0x51, \n  0x93, 0xfe, 0xb1, 0x0a, 0x00, 0x27, 0x4f, 0x00, 0xa8, 0x19, 0xff, 0x8e, 0x00, 0x00, 0x1b, 0x7e, \n  0xff, 0xf6, 0x88, 0xff, 0x10, 0x7a, 0x00, 0xd2, 0xdb, 0xff, 0xdb, 0xbd, 0xfe, 0xeb, 0x66, 0xfe, \n  0x3e, 0xf4, 0xfe, 0x0e, 0x7d, 0xfe, 0x53, 0x38, 0x0d, 0x20, 0x75, 0x12, 0x97, 0xd4, 0x08, 0x44, \n  0xb9, 0x04, 0x82, 0x31, 0x00, 0xb8, 0x8b, 0x03, 0xd0, 0xe8, 0x07, 0x97, 0x76, 0x05, 0xdc, 0x4f, \n  0x01, 0x82, 0x66, 0x01, 0xb0, 0x18, 0x02, 0x09, 0x71, 0x00, 0xc3, 0x81, 0x01, 0x3f, 0x5f, 0x00, \n  0x90, 0x28, 0x00, 0xd2, 0xda, 0xff, 0x99, 0x2e, 0xff, 0xf7, 0x96, 0xff, 0x3e, 0x4f, 0xff, 0x5c, \n  0xf8, 0xff, 0xa1, 0x40, 0x00, 0x60, 0x38, 0xff, 0xdf, 0xa6, 0xfe, 0xba, 0xa0, 0xff, 0x8e, 0x85, \n  0xff, 0x68, 0x93, 0xff, 0x75, 0x79, 0x00, 0xe6, 0x80, 0xff, 0xbf, 0x51, 0xfe, 0x83, 0xc0, 0xfe, \n  0x03, 0x3e, 0xff, 0x31, 0xd7, 0xfe, 0x75, 0x67, 0x0d, 0xe3, 0x1b, 0x13, 0x8f, 0x9d, 0x07, 0x6d, \n  0x52, 0x04, 0x53, 0xf7, 0x04, 0x62, 0xd2, 0x06, 0xcd, 0x95, 0x06, 0x30, 0xf4, 0x03, 0x5c, 0xec, \n  0x00, 0xe7, 0x50, 0x00, 0xf6, 0xa5, 0x00, 0x65, 0xad, 0xff, 0xbc, 0x1f, 0x01, 0xc8, 0x01, 0x00, \n  0x2d, 0xd7, 0xff, 0x4a, 0xb8, 0xff, 0xa5, 0xef, 0xfe, 0xd7, 0x7b, 0x00, 0xd0, 0x99, 0x00, 0x2a, \n  0x2b, 0xff, 0xf6, 0x05, 0xff, 0xad, 0x64, 0xff, 0x28, 0xd9, 0xfe, 0xe8, 0xdf, 0xfe, 0x7e, 0x5e, \n  0xff, 0x6c, 0x22, 0x00, 0x54, 0xc5, 0xff, 0x3e, 0x4f, 0xff, 0x1a, 0x06, 0xff, 0xc3, 0x02, 0xff, \n  0xfd, 0x0a, 0xff, 0xf3, 0xc1, 0xfe, 0x22, 0x22, 0x0c, 0xe1, 0x67, 0x12, 0x8e, 0x92, 0x0b, 0x7b, \n  0xb5, 0x07, 0x30, 0xaa, 0x03, 0x9f, 0x00, 0x06, 0x35, 0xe3, 0x06, 0x46, 0xf1, 0x02, 0x1e, 0xc0, \n  0xff, 0xa3, 0xc2, 0xff, 0x5e, 0xc4, 0x00, 0xd1, 0xce, 0xff, 0xc0, 0x52, 0x00, 0x24, 0xda, 0xff, \n  0x6b, 0xf9, 0xff, 0x4a, 0x32, 0x00, 0xd7, 0x69, 0x00, 0x05, 0x7c, 0x00, 0xe5, 0x81, 0xff, 0xbf, \n  0x4f, 0xff, 0xda, 0x59, 0xff, 0x5f, 0x12, 0xff, 0xfc, 0x71, 0xfe, 0xe2, 0x10, 0xff, 0x90, 0x64, \n  0xff, 0xaa, 0xbe, 0xff, 0xd2, 0x28, 0x00, 0xc1, 0xd7, 0xff, 0x79, 0x62, 0xff, 0x8c, 0xdb, 0xfe, \n  0xfa, 0x96, 0xfe, 0xff, 0xc7, 0xfe, 0xca, 0x36, 0x0f, 0xcb, 0x19, 0x17, 0xac, 0x94, 0x09, 0x9e, \n  0x7f, 0x03, 0xae, 0x89, 0x04, 0xb0, 0x26, 0x06, 0xd3, 0x1e, 0x05, 0x58, 0x55, 0x02, 0xd4, 0x51, \n  0xff, 0x67, 0xc0, 0xff, 0x2e, 0xb3, 0x00, 0xf1, 0x02, 0x00, 0x17, 0xa1, 0x00, 0x7a, 0x5a, 0xff, \n  0x5b, 0x8d, 0x00, 0xbf, 0xee, 0x01, 0xa7, 0x57, 0x00, 0x68, 0xdc, 0xfe, 0x4e, 0xe8, 0xff, 0xed, \n  0xf5, 0xff, 0x60, 0xcf, 0xfe, 0x7c, 0x96, 0xfe, 0xee, 0xa0, 0xfe, 0xb3, 0x37, 0xff, 0xc9, 0x2f, \n  0xff, 0x40, 0x2a, 0x00, 0xd8, 0xa2, 0x00, 0xa7, 0x06, 0x00, 0x3f, 0xf2, 0xfe, 0xcd, 0x80, 0xfe, \n  0x2d, 0xc8, 0xfe, 0x10, 0x87, 0xfe, 0x49, 0x10, 0x10, 0xb0, 0xf5, 0x18, 0x58, 0x0b, 0x08, 0xa8, \n  0x10, 0x01, 0xe7, 0x83, 0x04, 0xc9, 0x76, 0x05, 0xc5, 0xb8, 0x04, 0x3f, 0x3f, 0x03, 0xf2, 0x05, \n  0x00, 0xc4, 0xf9, 0xfe, 0x4a, 0x4c, 0x01, 0xf3, 0x6f, 0x00, 0x4f, 0x49, 0x00, 0xbf, 0x65, 0x00, \n  0xf8, 0x4b, 0x01, 0x1a, 0xd1, 0x01, 0x29, 0xf4, 0xff, 0x9e, 0x9d, 0xff, 0x30, 0xe6, 0xff, 0xd7, \n  0xb3, 0xff, 0xc4, 0xd8, 0xfe, 0x69, 0xe9, 0xfe, 0xa6, 0xa1, 0xfe, 0x84, 0xb3, 0xfe, 0xb2, 0x96, \n  0xff, 0x9a, 0x52, 0x00, 0x82, 0xae, 0x00, 0xb1, 0xee, 0xff, 0x03, 0x3f, 0xff, 0x35, 0x7b, 0xfe, \n  0x45, 0x98, 0xfe, 0x23, 0xa7, 0xfe, 0x60, 0x15, 0x0c, 0xd4, 0x95, 0x16, 0x3d, 0x25, 0x0d, 0x06, \n  0x3c, 0x02, 0x6a, 0x1b, 0x01, 0x9f, 0x99, 0x03, 0xd6, 0x65, 0x05, 0x30, 0xfb, 0x04, 0xd5, 0x53, \n  0x00, 0xa5, 0x1e, 0xff, 0x1a, 0xb4, 0x01, 0x53, 0x7b, 0x01, 0x91, 0xf4, 0xff, 0x87, 0x38, 0x00, \n  0xaa, 0xf6, 0x01, 0x9c, 0x03, 0x02, 0xdc, 0xd6, 0x00, 0xfe, 0xac, 0xff, 0x28, 0xcf, 0xff, 0x8f, \n  0x2a, 0x00, 0x7c, 0x5e, 0xff, 0x0d, 0x9d, 0xfe, 0x44, 0xe0, 0xfe, 0x4e, 0x06, 0xff, 0x36, 0x0b, \n  0xff, 0x6d, 0x0f, 0x00, 0xe5, 0x92, 0x00, 0xe8, 0x34, 0x00, 0x4a, 0x62, 0xff, 0xcd, 0xef, 0xfe, \n  0x73, 0xbf, 0xfe, 0x2a, 0x93, 0xfe, 0x74, 0x12, 0x0a, 0x13, 0xe2, 0x13, 0xb9, 0xab, 0x0e, 0xa3, \n  0xb9, 0x04, 0x37, 0xa4, 0x00, 0xd7, 0x2b, 0x02, 0x30, 0x1a, 0x04, 0x0e, 0xe4, 0x04, 0x97, 0x2e, \n  0x01, 0xbd, 0x2d, 0xff, 0x2c, 0x8d, 0x01, 0x9a, 0x53, 0x02, 0x8b, 0x81, 0x00, 0xdb, 0x45, 0x00, \n  0x76, 0xb1, 0x01, 0x81, 0x7c, 0x01, 0xf3, 0xbb, 0x01, 0xc5, 0xab, 0x00, 0x51, 0x20, 0x00, 0x50, \n  0x3a, 0x00, 0x0d, 0x4d, 0xff, 0x7f, 0x46, 0xff, 0x3f, 0x69, 0xff, 0x97, 0xe8, 0xfe, 0x92, 0xd7, \n  0xfe, 0x6c, 0xf7, 0xff, 0x4c, 0x7b, 0x00, 0x20, 0xf5, 0xff, 0xf4, 0x2c, 0xff, 0xa7, 0x4e, 0xff, \n  0x81, 0x2f, 0xff, 0x85, 0xae, 0xfe, 0xdc, 0xf8, 0x09, 0xa7, 0x5d, 0x13, 0xdf, 0xd1, 0x0d, 0x2a, \n  0x5e, 0x05, 0x62, 0x5a, 0x01, 0x43, 0x69, 0x01, 0x05, 0xd0, 0x03, 0x52, 0xf3, 0x04, 0xdf, 0xb8, \n  0x00, 0xf2, 0x4a, 0xfe, 0xcd, 0x38, 0x01, 0x7b, 0xa9, 0x02, 0x00, 0xd6, 0x00, 0xb4, 0x36, 0x00, \n  0xe0, 0xba, 0x01, 0x6a, 0xb1, 0x01, 0xc2, 0x4f, 0x01, 0x91, 0xdb, 0x00, 0xad, 0xd6, 0x00, 0xbb, \n  0xb0, 0x00, 0xde, 0xbf, 0xff, 0xac, 0x8a, 0xff, 0x1e, 0x83, 0xff, 0x7d, 0x5d, 0xff, 0xc6, 0x96, \n  0xff, 0x67, 0x92, 0xff, 0x95, 0x19, 0x00, 0xaf, 0x4c, 0x00, 0xe1, 0x1d, 0xff, 0xfb, 0xd2, 0xfe, \n  0x3f, 0xf1, 0xfe, 0xd4, 0x2c, 0xff, 0xb9, 0x66, 0x0a, 0x62, 0x5d, 0x13, 0x45, 0x2a, 0x0d, 0x50, \n  0xbb, 0x05, 0xe2, 0xdf, 0x01, 0x94, 0xfa, 0x00, 0x94, 0x6c, 0x03, 0xc7, 0x15, 0x05, 0x4b, 0xd7, \n  0x00, 0xb3, 0x04, 0xfe, 0x1d, 0x91, 0x00, 0xfe, 0xfd, 0x01, 0x76, 0x67, 0x00, 0x15, 0x08, 0x00, \n  0x66, 0x9e, 0x01, 0xed, 0x57, 0x01, 0xe3, 0x32, 0x01, 0xb2, 0x92, 0x01, 0xd1, 0x90, 0x00, 0xa1, \n  0x3e, 0x00, 0x89, 0x7c, 0x00, 0x4d, 0x01, 0x00, 0xb6, 0xd5, 0xff, 0xaa, 0xd5, 0xff, 0xcd, 0xf5, \n  0xff, 0xb7, 0xe6, 0xff, 0x35, 0x3b, 0x00, 0x97, 0x2a, 0x00, 0x0c, 0x57, 0xff, 0x58, 0xaa, 0xfe, \n  0x93, 0x92, 0xfe, 0xff, 0xde, 0xfe, 0x3f, 0x57, 0x0b, 0x15, 0x39, 0x14, 0x9a, 0x8c, 0x0c, 0x4b, \n  0x90, 0x05, 0x5c, 0x11, 0x02, 0x57, 0xd7, 0x00, 0x3f, 0x8b, 0x03, 0x77, 0x32, 0x05, 0x5c, 0x89, \n  0x00, 0x53, 0xdb, 0xfd, 0xfe, 0x9a, 0x00, 0x55, 0xf0, 0x01, 0x2f, 0x49, 0x00, 0x8e, 0xf4, 0xfe, \n  0xc1, 0xc4, 0x00, 0x60, 0x18, 0x01, 0xe8, 0xb2, 0x00, 0x60, 0xa7, 0x01, 0x2f, 0x0c, 0x01, 0xe3, \n  0x3e, 0x00, 0xce, 0x14, 0x00, 0x14, 0xa1, 0xff, 0x94, 0x87, 0x00, 0xd6, 0x9c, 0x00, 0xbd, 0xed, \n  0xff, 0x6e, 0xbd, 0x00, 0x7c, 0xb3, 0x00, 0xbd, 0x31, 0x00, 0xbd, 0x9c, 0xff, 0xf3, 0xe7, 0xfe, \n  0xc6, 0x92, 0xfe, 0x32, 0x82, 0xfe, 0x9d, 0x1d, 0x0c, 0x5c, 0x8b, 0x15, 0x56, 0x63, 0x0c, 0x4d, \n  0xf9, 0x04, 0x02, 0x8e, 0x02, 0xcc, 0xaf, 0x00, 0xdd, 0x3a, 0x03, 0x27, 0x6e, 0x05, 0x84, 0x6d, \n  0x00, 0x39, 0xaf, 0xfd, 0x4a, 0x64, 0x00, 0xcd, 0xd3, 0x01, 0xdc, 0xa5, 0x00, 0xe8, 0xac, 0xfe, \n  0x74, 0xed, 0xff, 0x47, 0x87, 0x00, 0x0f, 0x7f, 0xff, 0xbd, 0xdc, 0x00, 0xde, 0xce, 0x01, 0x74, \n  0x32, 0x00, 0xa6, 0x98, 0xff, 0x6f, 0x95, 0xff, 0x4b, 0x1a, 0x00, 0x90, 0xb3, 0x00, 0x3b, 0x3a, \n  0x00, 0x5e, 0x15, 0x01, 0x59, 0x31, 0x01, 0x0b, 0x92, 0x00, 0x15, 0x3a, 0x00, 0xed, 0x24, 0xff, \n  0x26, 0x7c, 0xfe, 0x41, 0xc0, 0xfe, 0x86, 0x27, 0x0d, 0x98, 0x32, 0x17, 0xa7, 0x33, 0x0c, 0xd5, \n  0x7a, 0x04, 0xa2, 0xf6, 0x02, 0xa8, 0x4e, 0x00, 0x06, 0xfc, 0x02, 0x0f, 0xbf, 0x05, 0xac, 0x25, \n  0x00, 0x2c, 0x31, 0xfd, 0x07, 0x89, 0x00, 0xda, 0xc8, 0x01, 0xa9, 0x79, 0x00, 0x0c, 0xdd, 0xfe, \n  0xd0, 0x6e, 0xff, 0x6a, 0x3f, 0x00, 0x67, 0xfe, 0xfe, 0x0a, 0x7e, 0xff, 0x03, 0x95, 0x01, 0x2d, \n  0x3f, 0x00, 0x6a, 0x33, 0xff, 0x58, 0x65, 0xff, 0xf2, 0x9b, 0xff, 0x3e, 0x99, 0x00, 0xd9, 0x3a, \n  0x00, 0xe1, 0x9b, 0x00, 0x02, 0x81, 0x01, 0x32, 0x08, 0x01, 0xfa, 0x46, 0x00, 0x63, 0xe1, 0xff, \n  0xd0, 0x39, 0xff, 0xfe, 0x87, 0xfe, 0x80, 0x9e, 0x0e, 0x73, 0x3f, 0x19, 0xef, 0xee, 0x0b, 0xa0, \n  0xb3, 0x03, 0xac, 0x75, 0x03, 0x7a, 0x1b, 0x00, 0x82, 0xaa, 0x02, 0x3a, 0x10, 0x06, 0x6f, 0xf2, \n  0xff, 0x83, 0xc8, 0xfc, 0x8d, 0x97, 0x00, 0xc8, 0xc9, 0x01, 0x59, 0x44, 0x00, 0x2f, 0x2f, 0xff, \n  0xa5, 0x3f, 0xff, 0x32, 0xd2, 0xff, 0x38, 0xf6, 0xfe, 0x21, 0xbe, 0xfe, 0x05, 0x13, 0x01, 0x37, \n  0xa8, 0x00, 0x41, 0x8b, 0xfe, 0x3d, 0xa6, 0xfe, 0x6a, 0xb7, 0xff, 0xba, 0x59, 0x00, 0x3c, 0x12, \n  0x00, 0x45, 0x24, 0x00, 0x09, 0x77, 0x01, 0x18, 0x17, 0x01, 0xc3, 0x0f, 0x00, 0x27, 0x5e, 0x00, \n  0xe6, 0xbe, 0xff, 0x37, 0x22, 0xff, 0xa4, 0x57, 0x10, 0x0d, 0xa3, 0x1b, 0x6a, 0xa3, 0x0b, 0xee, \n  0xb0, 0x02, 0x6e, 0xe5, 0x03, 0x15, 0xe1, 0xff, 0xf6, 0x76, 0x02, 0xf0, 0x75, 0x06, 0x34, 0x48, \n  0xff, 0xec, 0x85, 0xfc, 0x99, 0xeb, 0x00, 0xaf, 0xb6, 0x01, 0xf2, 0xd3, 0xff, 0x1c, 0x1d, 0xff, \n  0x24, 0x9c, 0xff, 0x9b, 0x74, 0xff, 0x31, 0x9e, 0xfe, 0xbc, 0x82, 0xfe, 0xf5, 0x5e, 0x00, 0x40, \n  0x0b, 0x01, 0xd2, 0xd0, 0xfe, 0x6a, 0xb6, 0xfd, 0x5e, 0x63, 0xff, 0xd4, 0x26, 0x00, 0x32, 0xdb, \n  0xff, 0x79, 0x07, 0x00, 0x7c, 0xcb, 0x00, 0x51, 0xdb, 0x00, 0x32, 0x3b, 0x00, 0x15, 0x06, 0x00, \n  0x66, 0xd0, 0xff, 0xd0, 0x93, 0xff, 0xce, 0x89, 0x12, 0x92, 0x36, 0x1e, 0x9d, 0xfd, 0x0a, 0x3b, \n  0xc7, 0x01, 0xdf, 0x31, 0x04, 0x0b, 0x5f, 0xff, 0x28, 0x95, 0x02, 0x59, 0xe2, 0x06, 0xb6, 0x38, \n  0xfe, 0xe9, 0x38, 0xfc, 0xf0, 0x8a, 0x01, 0xcf, 0xaf, 0x01, 0x44, 0x33, 0xff, 0x6e, 0xe2, 0xfe, \n  0x9c, 0xd4, 0xff, 0x01, 0x38, 0xff, 0xa5, 0x2e, 0xfe, 0x82, 0x55, 0xfe, 0x4a, 0xf5, 0xff, 0xa9, \n  0xc8, 0x00, 0x6d, 0x6c, 0xff, 0xaf, 0x6c, 0xfd, 0x91, 0xe5, 0xfe, 0x5f, 0x3e, 0x00, 0xe1, 0x5c, \n  0xff, 0x97, 0xcc, 0xff, 0x70, 0x6b, 0x00, 0xbb, 0x31, 0x00, 0x27, 0x05, 0x00, 0x0d, 0xea, 0xff, \n  0x02, 0xc8, 0xff, 0xde, 0x4f, 0xff, 0x93, 0xb3, 0x14, 0x45, 0xee, 0x20, 0x90, 0x89, 0x0a, 0xc4, \n  0xc4, 0x00, 0xf5, 0x33, 0x04, 0xc6, 0xa1, 0xfe, 0x58, 0xcf, 0x02, 0xbf, 0x5d, 0x07, 0x90, 0xd4, \n  0xfc, 0x37, 0xbb, 0xfb, 0x7c, 0x50, 0x02, 0x05, 0xb1, 0x01, 0xdb, 0x64, 0xfe, 0x80, 0x79, 0xfe, \n  0xc1, 0x08, 0x00, 0xeb, 0xf3, 0xfe, 0xbb, 0x87, 0xfd, 0xff, 0xf2, 0xfd, 0xa9, 0xb5, 0xff, 0x68, \n  0x6c, 0x00, 0x65, 0x97, 0xff, 0x0e, 0xac, 0xfd, 0xb6, 0x53, 0xfe, 0xfe, 0x36, 0x00, 0x28, 0x78, \n  0xff, 0x74, 0x39, 0xff, 0x65, 0x44, 0x00, 0xf0, 0x41, 0xff, 0x1b, 0x59, 0xff, 0x3d, 0x0c, 0x00, \n  0xdb, 0x71, 0xff, 0xdf, 0x1c, 0xff, 0x4f, 0xe3, 0x16, 0xa9, 0xc2, 0x23, 0x97, 0x77, 0x0a, 0x9b, \n  0x23, 0x00, 0xbf, 0x1e, 0x04, 0x19, 0xe4, 0xfd, 0x7f, 0x5e, 0x03, 0x00, 0x32, 0x08, 0x3e, 0x70, \n  0xfb, 0xda, 0x5f, 0xfb, 0x7d, 0x6e, 0x03, 0x4a, 0xf5, 0x01, 0x6d, 0xdb, 0xfd, 0x15, 0x1a, 0xfe, \n  0x1f, 0x67, 0x00, 0x40, 0xff, 0xfe, 0x87, 0x23, 0xfd, 0xb2, 0xa9, 0xfd, 0x8f, 0x66, 0xff, 0xad, \n  0x5e, 0x00, 0x64, 0xd8, 0xff, 0x78, 0x26, 0xfe, 0xde, 0x7b, 0xfe, 0x25, 0xbe, 0xff, 0x9b, 0x16, \n  0x00, 0xf8, 0x72, 0xff, 0xe6, 0xcb, 0xff, 0x62, 0x48, 0xff, 0x1c, 0x8c, 0xfe, 0x3c, 0xcd, 0xff, \n  0x1b, 0xa6, 0xff, 0x92, 0xf8, 0xfe, 0x1f, 0x79, 0x18, 0x4c, 0x70, 0x26, 0x8c, 0x4d, 0x0b, 0x7d, \n  0x5f, 0xff, 0xb0, 0xc7, 0x03, 0xaf, 0xf3, 0xfc, 0x35, 0x70, 0x03, 0xf1, 0x43, 0x09, 0x66, 0x17, \n  0xfa, 0x3a, 0x7b, 0xfa, 0xb1, 0x6d, 0x04, 0xdf, 0x62, 0x02, 0x71, 0x33, 0xfd, 0x06, 0x8d, 0xfd, \n  0x0c, 0x7c, 0x00, 0x79, 0x04, 0xff, 0xc6, 0xce, 0xfc, 0x74, 0x27, 0xfd, 0xae, 0xc0, 0xfe, 0xb1, \n  0x31, 0x00, 0x5b, 0x01, 0x00, 0xfa, 0x1e, 0xfe, 0x8f, 0x13, 0xff, 0x57, 0x73, 0xff, 0x02, 0xc1, \n  0xff, 0x4b, 0x3b, 0x00, 0x45, 0x59, 0xff, 0x92, 0xd5, 0xfe, 0xc8, 0xa2, 0xfe, 0x36, 0xe4, 0xfe, \n  0x2d, 0x62, 0xff, 0xfd, 0x30, 0xff, 0x27, 0xd6, 0x19, 0x30, 0x2f, 0x29, 0x2b, 0x71, 0x0c, 0xa8, \n  0xb6, 0xfe, 0xd8, 0x6c, 0x03, 0x79, 0x71, 0xfc, 0x36, 0x26, 0x03, 0xa5, 0xe3, 0x09, 0xe4, 0x75, \n  0xf9, 0x81, 0x8a, 0xf9, 0x84, 0x19, 0x05, 0x8d, 0x13, 0x03, 0x63, 0xcc, 0xfc, 0x4d, 0xeb, 0xfc, \n  0x99, 0x98, 0x00, 0x5d, 0x03, 0xff, 0xc4, 0x90, 0xfc, 0x74, 0x04, 0xfd, 0x12, 0xdd, 0xfd, 0xa9, \n  0xb9, 0xff, 0x62, 0xbd, 0x00, 0x30, 0xcd, 0xfd, 0x72, 0x39, 0xff, 0x5e, 0x56, 0x00, 0x0d, 0x0a, \n  0xff, 0x4d, 0x80, 0x00, 0xa2, 0xf8, 0xff, 0x8c, 0x28, 0xfe, 0x06, 0x60, 0xfe, 0x16, 0xf7, 0xfe, \n  0x0f, 0xab, 0xfe, 0xe5, 0x80, 0xff, 0x83, 0xb9, 0x1a, 0x56, 0xd7, 0x2b, 0x78, 0x31, 0x0e, 0xbe, \n  0xb8, 0xfd, 0x9d, 0x67, 0x03, 0xdc, 0x8b, 0xfc, 0xd5, 0x44, 0x02, 0x31, 0xb9, 0x09, 0xd4, 0xa3, \n  0xf9, 0xeb, 0xed, 0xf8, 0x66, 0xfa, 0x04, 0x07, 0xd1, 0x03, 0xb8, 0xb8, 0xfc, 0x0d, 0x7c, 0xfc, \n  0xcf, 0x68, 0x00, 0x90, 0x00, 0xff, 0x2d, 0x35, 0xfc, 0x78, 0x0d, 0xfd, 0xaa, 0x76, 0xfd, 0xdd, \n  0x61, 0xfe, 0xad, 0x2c, 0x01, 0xdc, 0xa6, 0xfe, 0xca, 0x75, 0xfe, 0xd5, 0x1e, 0x01, 0x4e, 0x59, \n  0xff, 0x3d, 0xbb, 0xff, 0x6a, 0xe4, 0x00, 0x14, 0x43, 0xfe, 0xc2, 0x6b, 0xfd, 0xdf, 0xfc, 0xfe, \n  0x64, 0x7a, 0xfe, 0xe6, 0x57, 0xff, 0x63, 0x8a, 0x1c, 0xef, 0x0e, 0x2e, 0xc8, 0x7a, 0x0e, 0x84, \n  0xc6, 0xfd, 0xea, 0xa2, 0x03, 0xaa, 0x36, 0xfc, 0x15, 0xa6, 0x01, 0x53, 0xed, 0x08, 0x32, 0xb8, \n  0xf9, 0xcb, 0xd8, 0xf8, 0xe9, 0x8f, 0x04, 0x34, 0x27, 0x04, 0xec, 0xbc, 0xfc, 0x72, 0x3c, 0xfc, \n  0x15, 0x30, 0x00, 0x6e, 0xed, 0xfe, 0xb0, 0x92, 0xfb, 0xbe, 0x1b, 0xfd, 0x4d, 0x63, 0xfd, 0xfd, \n  0x3d, 0xfd, 0xef, 0x80, 0x00, 0x5f, 0xeb, 0xff, 0x9c, 0x7b, 0xfe, 0xf6, 0x93, 0x00, 0xfa, 0x9a, \n  0x00, 0xf4, 0x0b, 0xff, 0x06, 0xc4, 0x00, 0x0d, 0x49, 0xff, 0x16, 0xc4, 0xfc, 0xc8, 0x39, 0xfe, \n  0x42, 0xa8, 0xfe, 0x84, 0xf2, 0xfe, 0x36, 0x2d, 0x20, 0xe3, 0x81, 0x2f, 0xd3, 0x67, 0x0c, 0x3a, \n  0x48, 0xff, 0xad, 0xe2, 0x04, 0x6f, 0x03, 0xfb, 0x61, 0xef, 0x00, 0x08, 0xca, 0x08, 0xde, 0xf8, \n  0xf8, 0x64, 0x8a, 0xf9, 0x5b, 0x0d, 0x04, 0xb4, 0x49, 0x04, 0x38, 0x03, 0xfd, 0x67, 0xbc, 0xfb, \n  0xc8, 0x7e, 0x00, 0x28, 0x8a, 0xfe, 0xb1, 0x77, 0xfb, 0xf6, 0x9b, 0xfc, 0xd4, 0x90, 0xfd, 0x21, \n  0xdf, 0xfc, 0xfc, 0x45, 0xff, 0x87, 0x79, 0x00, 0x93, 0xe2, 0xff, 0x9a, 0xd3, 0xff, 0xa7, 0xf7, \n  0x00, 0x3c, 0xe1, 0xff, 0x38, 0xd5, 0xff, 0x49, 0xf1, 0xff, 0xb7, 0x52, 0xfd, 0xa4, 0x27, 0xfd, \n  0x68, 0x6e, 0xfe, 0x15, 0x1d, 0xff, 0x4b, 0x51, 0x24, 0xe0, 0xfa, 0x2f, 0x12, 0xbe, 0x08, 0x6d, \n  0x0c, 0x03, 0xe9, 0xfe, 0x06, 0xdb, 0xc0, 0xf7, 0xbf, 0x5d, 0x00, 0xf9, 0xd2, 0x09, 0x9f, 0xa8, \n  0xf7, 0x5c, 0xab, 0xf9, 0x17, 0xe5, 0x03, 0x21, 0x1e, 0x04, 0xd2, 0x63, 0xfd, 0x3b, 0x0c, 0xfb, \n  0xed, 0xc4, 0x00, 0x20, 0x01, 0xfe, 0x89, 0x9b, 0xfb, 0xfd, 0x1d, 0xfc, 0xa5, 0x37, 0xfd, 0xfd, \n  0xf7, 0xfc, 0x7b, 0x58, 0xfe, 0x8c, 0xcf, 0xff, 0xf4, 0x55, 0x01, 0x14, 0x69, 0x00, 0xf0, 0x17, \n  0x00, 0x8e, 0xdc, 0x00, 0x81, 0x83, 0xff, 0x66, 0xbb, 0xff, 0xd2, 0x2c, 0xfe, 0x5f, 0xdd, 0xfc, \n  0xc1, 0x7f, 0xfd, 0x95, 0x25, 0xff, 0xcd, 0xa3, 0x27, 0x8e, 0x44, 0x2f, 0xee, 0x53, 0x05, 0x80, \n  0x96, 0x09, 0xd0, 0xbb, 0x08, 0x4d, 0x32, 0xf2, 0xed, 0x19, 0x01, 0x6b, 0x33, 0x0c, 0xd3, 0x5d, \n  0xf5, 0xfb, 0xad, 0xf8, 0x4e, 0xf9, 0x04, 0x70, 0xba, 0x03, 0xde, 0x1b, 0xfd, 0x84, 0xcf, 0xfa, \n  0x30, 0x00, 0x01, 0x90, 0x47, 0xfd, 0xd0, 0x95, 0xfb, 0x81, 0x1a, 0xfc, 0xb3, 0xad, 0xfc, 0x5d, \n  0xe4, 0xfc, 0x52, 0xe8, 0xfd, 0xc0, 0xd3, 0xfe, 0x05, 0xce, 0x01, 0x7f, 0xb6, 0x01, 0x89, 0x9a, \n  0xff, 0x6c, 0x2c, 0x01, 0x33, 0xb7, 0xff, 0x3d, 0x4f, 0xff, 0x35, 0x85, 0xfe, 0x7b, 0x74, 0xfd, \n  0xe9, 0xf9, 0xfc, 0xdd, 0x3d, 0xfe, 0xbd, 0x35, 0x2a, 0x86, 0x5a, 0x2d, 0x29, 0x61, 0x03, 0x10, \n  0xca, 0x11, 0xde, 0x0b, 0x09, 0xbe, 0x21, 0xec, 0xd2, 0xb7, 0x03, 0x7a, 0xd7, 0x0e, 0x96, 0xf3, \n  0xf1, 0x7b, 0x9f, 0xf7, 0x62, 0x31, 0x07, 0xf0, 0x19, 0x03, 0xe2, 0x01, 0xfc, 0x36, 0x7a, 0xfb, \n  0xa0, 0x43, 0x01, 0x1f, 0x56, 0xfc, 0x8c, 0x85, 0xfb, 0x4a, 0x98, 0xfc, 0xda, 0x4f, 0xfc, 0x37, \n  0x76, 0xfc, 0x03, 0x07, 0xfe, 0xbb, 0x34, 0xfe, 0x2d, 0x63, 0x01, 0x79, 0x8c, 0x02, 0xab, 0x28, \n  0x00, 0xfa, 0x91, 0x01, 0xfb, 0xe2, 0xff, 0x92, 0x0d, 0xff, 0x7c, 0x7a, 0xfe, 0x7b, 0x8a, 0xfe, \n  0xdb, 0x14, 0xfd, 0x0c, 0x79, 0xfd, 0x3e, 0xb5, 0x30, 0x55, 0x31, 0x2e, 0x81, 0x4c, 0xfc, 0x4b, \n  0xa2, 0x12, 0x91, 0x0f, 0x0d, 0x3d, 0x0b, 0xec, 0xbf, 0xfb, 0x01, 0x87, 0x13, 0x0e, 0x83, 0x21, \n  0xf1, 0x07, 0x22, 0xf8, 0xae, 0x0c, 0x08, 0xf0, 0xc9, 0x01, 0x0b, 0xcb, 0xfa, 0x3c, 0x52, 0xfc, \n  0x3a, 0x32, 0x01, 0x74, 0x08, 0xfb, 0x96, 0x84, 0xfb, 0x97, 0x6b, 0xfc, 0xb6, 0x9f, 0xfc, 0x20, \n  0xf5, 0xfb, 0x6f, 0x21, 0xfe, 0xbe, 0x1a, 0xfe, 0x8b, 0x56, 0x00, 0xf4, 0x4e, 0x03, 0x37, 0xcc, \n  0x00, 0x49, 0x3e, 0x01, 0x8e, 0x19, 0x00, 0x52, 0x5e, 0xff, 0x21, 0x10, 0xfe, 0x2e, 0xd3, 0xfe, \n  0xc2, 0x55, 0xfd, 0x0f, 0xd4, 0xfd, 0xab, 0x1a, 0x37, 0x77, 0xa7, 0x2f, 0x0b, 0x91, 0xf5, 0x12, \n  0x88, 0x11, 0x30, 0xea, 0x10, 0x03, 0x2c, 0xee, 0x12, 0x5a, 0xff, 0xb8, 0xf8, 0x0c, 0xb1, 0x17, \n  0xf1, 0xdc, 0x94, 0xf8, 0x5d, 0xa1, 0x08, 0x3c, 0xde, 0x00, 0x9e, 0x9a, 0xf9, 0x8e, 0xcc, 0xfc, \n  0x64, 0x60, 0x01, 0x80, 0x88, 0xf9, 0xfc, 0xd9, 0xfb, 0x5e, 0xf0, 0xfb, 0x8d, 0x4d, 0xfd, 0xc7, \n  0xcd, 0xfb, 0x7a, 0xd3, 0xfd, 0x1f, 0xed, 0xfe, 0x6f, 0xfb, 0xfe, 0x90, 0x4c, 0x03, 0x62, 0xe1, \n  0x01, 0x62, 0x33, 0x01, 0xbc, 0xe1, 0xff, 0x39, 0xe2, 0xff, 0xda, 0x32, 0xfe, 0xa5, 0xdc, 0xfe, \n  0xef, 0x9d, 0xfd, 0xd7, 0xa6, 0xfe, 0x97, 0x87, 0x3c, 0x2a, 0x7e, 0x32, 0x08, 0x5f, 0xef, 0x56, \n  0xb2, 0x0e, 0xac, 0xe9, 0x13, 0xf5, 0x36, 0xf2, 0xe2, 0x6c, 0xfc, 0xf5, 0x4d, 0x0b, 0xa0, 0xd4, \n  0xf1, 0xa7, 0xcf, 0xf8, 0x48, 0xd9, 0x08, 0x07, 0x18, 0x00, 0xd6, 0x15, 0xf9, 0xb0, 0x4b, 0xfc, \n  0x03, 0xb7, 0x01, 0x48, 0x47, 0xf8, 0x1c, 0xe7, 0xfb, 0x72, 0xa4, 0xfb, 0xd6, 0xd0, 0xfd, 0xe2, \n  0x54, 0xfc, 0xd3, 0xfb, 0xfc, 0x73, 0xff, 0xff, 0xf8, 0x44, 0xfe, 0x15, 0x52, 0x02, 0x83, 0xa7, \n  0x02, 0xae, 0xe4, 0x01, 0x9f, 0x37, 0xff, 0x22, 0x5f, 0x00, 0x05, 0xd3, 0xfe, 0x7c, 0x6a, 0xfe, \n  0x27, 0x73, 0xfe, 0x52, 0xf4, 0xfe, 0x83, 0xdf, 0x42, 0x54, 0x24, 0x34, 0xc8, 0x13, 0xea, 0xf1, \n  0xcf, 0x0b, 0xb6, 0xa1, 0x14, 0xee, 0xbc, 0xf6, 0x4c, 0xdf, 0xfa, 0x57, 0xc4, 0x08, 0x0c, 0x70, \n  0xf2, 0x27, 0xea, 0xf9, 0x5d, 0x48, 0x08, 0x27, 0x25, 0xff, 0xb3, 0x5f, 0xf9, 0xe1, 0x0c, 0xfb, \n  0x7c, 0xac, 0x01, 0xa8, 0x9d, 0xf7, 0x44, 0x7a, 0xfb, 0xf7, 0xd0, 0xfb, 0xea, 0x0f, 0xfe, 0xb0, \n  0x07, 0xfd, 0xea, 0x81, 0xfc, 0xb3, 0x43, 0x00, 0x69, 0xd9, 0xfe, 0xa1, 0xb4, 0x00, 0xac, 0xe8, \n  0x02, 0x64, 0xda, 0x02, 0xaf, 0x7d, 0xfe, 0xd2, 0xe5, 0x00, 0xbf, 0x5f, 0xff, 0x03, 0xf2, 0xfd, \n  0xc0, 0x73, 0xff, 0x5b, 0xcc, 0xfe, 0xba, 0x34, 0x48, 0xf7, 0xcc, 0x36, 0xa9, 0x37, 0xe5, 0xe0, \n  0x21, 0x09, 0xbf, 0xc5, 0x13, 0x2d, 0xd2, 0xfa, 0xa3, 0xcf, 0xfa, 0xd4, 0xd1, 0x05, 0x78, 0x67, \n  0xf3, 0x19, 0xfa, 0xfa, 0xc9, 0x67, 0x07, 0x6a, 0x18, 0xfe, 0x2b, 0x68, 0xfa, 0x71, 0x29, 0xf9, \n  0xd8, 0x53, 0x01, 0x18, 0x84, 0xf7, 0x50, 0xcc, 0xfa, 0x4b, 0x7f, 0xfc, 0x90, 0xfe, 0xfd, 0x43, \n  0xa1, 0xfd, 0xbd, 0x86, 0xfc, 0xaa, 0x06, 0x00, 0x3b, 0xc9, 0xff, 0x09, 0xc5, 0xff, 0x8d, 0x0f, \n  0x02, 0xa2, 0x27, 0x04, 0x67, 0xfe, 0xfd, 0x3f, 0xca, 0x00, 0x9b, 0x16, 0x00, 0xe8, 0xa6, 0xfd, \n  0xdf, 0xe9, 0xff, 0x29, 0xec, 0xfe, 0xd9, 0xd0, 0x4c, 0x60, 0xfa, 0x39, 0xde, 0x0a, 0xe1, 0x16, \n  0x23, 0x07, 0x25, 0x8c, 0x11, 0x7a, 0x8b, 0xfd, 0x87, 0x44, 0xfc, 0x03, 0xef, 0x02, 0xdb, 0xab, \n  0xf4, 0x2d, 0x8c, 0xfb, 0x82, 0x9a, 0x06, 0xd4, 0x34, 0xfd, 0xfa, 0x54, 0xfb, 0x32, 0x93, 0xf7, \n  0x4a, 0x9f, 0x00, 0x86, 0xc3, 0xf7, 0x43, 0x88, 0xfa, 0xcd, 0x27, 0xfd, 0xfe, 0xb7, 0xfd, 0xa1, \n  0x46, 0xfe, 0x70, 0xcc, 0xfc, 0x1a, 0xa9, 0xff, 0x9d, 0xa0, 0x00, 0x21, 0xe9, 0xff, 0x22, 0x88, \n  0x00, 0xdb, 0x7b, 0x05, 0x20, 0xc0, 0xfd, 0xc0, 0xb5, 0xff, 0xc7, 0x08, 0x01, 0xb6, 0x90, 0xfd, \n  0x6d, 0xe1, 0xff, 0x63, 0xba, 0xff, 0x57, 0x7e, 0x52, 0xcb, 0xe7, 0x3a, 0x39, 0x39, 0xde, 0xd4, \n  0x66, 0x06, 0xe4, 0xfe, 0x0d, 0xa9, 0xd0, 0xfe, 0xe4, 0x45, 0xfe, 0xd9, 0x3a, 0x01, 0xf2, 0x50, \n  0xf5, 0x8b, 0x11, 0xfc, 0xa0, 0xcd, 0x05, 0x6d, 0x7e, 0xfc, 0xf5, 0xc0, 0xfb, 0x27, 0xbf, 0xf6, \n  0x9a, 0xa3, 0xff, 0x40, 0x31, 0xf8, 0x88, 0x09, 0xfb, 0x54, 0x06, 0xfd, 0x47, 0x9d, 0xfd, 0x62, \n  0x04, 0xff, 0xa4, 0xed, 0xfc, 0xdf, 0xb7, 0xff, 0x90, 0xe8, 0x00, 0xa0, 0xf2, 0x00, 0x26, 0x81, \n  0xff, 0xf3, 0x82, 0x05, 0x85, 0xef, 0xfd, 0x84, 0x17, 0xfe, 0xb0, 0x51, 0x01, 0xbd, 0xe0, 0xfd, \n  0x39, 0x58, 0x00, 0x93, 0x45, 0x00, 0xf0, 0x8a, 0x56, 0xda, 0x8f, 0x3c, 0x62, 0x04, 0xdd, 0xb1, \n  0x5e, 0x05, 0x41, 0xf8, 0x09, 0xba, 0xa2, 0xfe, 0xf5, 0x4c, 0x00, 0x83, 0xa5, 0x00, 0xdd, 0x5b, \n  0xf5, 0x22, 0x34, 0xfc, 0x22, 0x19, 0x05, 0xdf, 0x50, 0xfb, 0xe5, 0xb5, 0xfc, 0x62, 0x1a, 0xf6, \n  0x87, 0x88, 0xfe, 0x86, 0x4d, 0xf9, 0xf2, 0x39, 0xfb, 0x06, 0x6c, 0xfc, 0x1f, 0x9e, 0xfd, 0x48, \n  0xcb, 0xff, 0xdc, 0xef, 0xfc, 0xd3, 0xdf, 0xff, 0x8c, 0x0d, 0x01, 0xfa, 0x8a, 0x02, 0x09, 0x83, \n  0xfe, 0x3a, 0x30, 0x04, 0xa0, 0xc1, 0xfe, 0x7b, 0x43, 0xfc, 0x6c, 0x57, 0x00, 0xa4, 0x40, 0xff, \n  0xd8, 0xf1, 0x00, 0x58, 0x67, 0x00, 0x52, 0x4c, 0x59, 0xeb, 0x4a, 0x3e, 0x35, 0x91, 0xdd, 0xc9, \n  0xb6, 0x04, 0x60, 0x26, 0x05, 0x5c, 0xb3, 0xfd, 0x3c, 0x75, 0x02, 0x8c, 0x69, 0x00, 0x84, 0x3f, \n  0xf5, 0xe5, 0x7c, 0xfc, 0xe3, 0xdb, 0x03, 0x36, 0x3a, 0xfa, 0x95, 0xa3, 0xfe, 0x77, 0x9c, 0xf5, \n  0x23, 0xa6, 0xfd, 0x60, 0x86, 0xfa, 0x7f, 0x31, 0xfb, 0x5a, 0xa1, 0xfb, 0x72, 0xb7, 0xfd, 0x61, \n  0xdc, 0x00, 0xe7, 0x65, 0xfc, 0x8c, 0xbe, 0x00, 0x58, 0x84, 0x01, 0xc4, 0xf9, 0x02, 0xc9, 0x0e, \n  0xfe, 0x96, 0x85, 0x02, 0x5c, 0x27, 0xff, 0xf0, 0x51, 0xfb, 0xc0, 0x5f, 0xff, 0xd7, 0xc3, 0xff, \n  0x48, 0x04, 0x02, 0x01, 0xac, 0x01, 0x5b, 0x1e, 0x5b, 0x54, 0x4a, 0x3f, 0xf9, 0xe7, 0xdf, 0x63, \n  0xb7, 0x04, 0x6d, 0x05, 0xff, 0x69, 0xb9, 0xfc, 0x16, 0x0d, 0x04, 0xb5, 0x10, 0x00, 0x19, 0x2f, \n  0xf5, 0xac, 0xaa, 0xfc, 0xf3, 0x28, 0x02, 0x91, 0x8e, 0xf9, 0xf8, 0x85, 0x01, 0xdf, 0x03, 0xf5, \n  0xaf, 0xcf, 0xfc, 0xb5, 0xa6, 0xfb, 0x8d, 0x9c, 0xfa, 0x7b, 0x29, 0xfb, 0x60, 0x20, 0xfe, 0x1b, \n  0xf7, 0x00, 0xd5, 0xde, 0xfc, 0x52, 0xbf, 0x01, 0xa2, 0x81, 0x00, 0x4a, 0x3d, 0x03, 0x01, 0x14, \n  0xfe, 0x0e, 0x6c, 0x00, 0x00, 0x70, 0xff, 0xe0, 0x0e, 0xfc, 0x37, 0xfe, 0xfd, 0x3c, 0x25, 0xff, \n  0xbb, 0x01, 0x04, 0xd1, 0x7b, 0x02, 0xa0, 0xc8, 0x5b, 0x5d, 0xef, 0x3f, 0x95, 0x94, 0xe3, 0x37, \n  0xd4, 0x04, 0xc2, 0x52, 0xf8, 0x51, 0x72, 0xfb, 0x55, 0xfc, 0x04, 0xa5, 0x84, 0xff, 0x2e, 0xc7, \n  0xf4, 0xc3, 0xc7, 0xfc, 0xb8, 0x8d, 0x00, 0x1a, 0xa9, 0xf9, 0x58, 0xa4, 0x04, 0x28, 0x30, 0xf4, \n  0x21, 0x3a, 0xfc, 0xba, 0xce, 0xfb, 0x41, 0x40, 0xfa, 0x24, 0x5f, 0xfb, 0x67, 0x81, 0xfd, 0xce, \n  0x37, 0x02, 0x78, 0xa9, 0xfc, 0x44, 0x42, 0x01, 0x41, 0xf7, 0xff, 0x4c, 0xfe, 0x02, 0x55, 0xb1, \n  0xfd, 0xbc, 0x96, 0xff, 0xf8, 0x12, 0x00, 0xf8, 0xcd, 0xfb, 0xe2, 0xbf, 0xfe, 0xff, 0x54, 0xfe, \n  0x11, 0x7f, 0x02, 0xa7, 0x21, 0x04, 0x4f, 0x3b, 0x5a, 0x72, 0x50, 0x41, 0xa2, 0xbc, 0xe8, 0x4b, \n  0x4e, 0x05, 0x73, 0x85, 0xf2, 0x10, 0x56, 0xf9, 0x49, 0x84, 0x05, 0xbf, 0x0a, 0xff, 0xef, 0x40, \n  0xf4, 0x73, 0x5d, 0xfd, 0x9b, 0x35, 0x00, 0x94, 0xbd, 0xf9, 0x37, 0xde, 0x07, 0x92, 0x10, 0xf4, \n  0xf4, 0xac, 0xfa, 0xa8, 0xba, 0xfc, 0xf4, 0xd4, 0xf9, 0xcc, 0x23, 0xfc, 0x17, 0xe3, 0xfd, 0x0a, \n  0x73, 0x01, 0xda, 0x1f, 0xfc, 0x1c, 0x95, 0x01, 0x38, 0xa3, 0xfe, 0x9f, 0xad, 0x02, 0xb8, 0x03, \n  0xff, 0x06, 0xd3, 0xfe, 0x80, 0x4b, 0x00, 0x79, 0x78, 0xfd, 0xbc, 0x2d, 0xff, 0x74, 0xc7, 0xfc, \n  0x4e, 0xb9, 0x00, 0x20, 0x4e, 0x05, 0x9e, 0x18, 0x5a, 0x42, 0x69, 0x3f, 0x17, 0x0b, 0xef, 0xf1, \n  0x68, 0x05, 0x3b, 0x6b, 0xed, 0x0b, 0x56, 0xf6, 0x6d, 0x19, 0x05, 0x3e, 0xd6, 0xfe, 0x42, 0x47, \n  0xf3, 0xc1, 0xa3, 0xff, 0x88, 0xff, 0xfe, 0xb6, 0xc6, 0xfa, 0x7a, 0x4f, 0x0a, 0x0a, 0x86, 0xf3, \n  0x21, 0x6d, 0xf9, 0x01, 0xc6, 0xfc, 0xea, 0xdc, 0xfb, 0x60, 0xe2, 0xfb, 0x45, 0x09, 0xfc, 0xeb, \n  0x48, 0x01, 0x3c, 0xca, 0xfb, 0xdd, 0x9c, 0x00, 0xd8, 0x86, 0xfe, 0x4f, 0x24, 0x03, 0x21, 0xfb, \n  0xfe, 0x78, 0x8f, 0xff, 0x84, 0x59, 0x01, 0x66, 0x33, 0xfd, 0x69, 0xb5, 0xfe, 0x8e, 0x32, 0xfe, \n  0x6f, 0xc4, 0xfe, 0xa8, 0xd9, 0x01, 0x44, 0x97, 0x56, 0xc0, 0xd9, 0x3f, 0x96, 0x63, 0xf5, 0xa5, \n  0xd7, 0x05, 0xa1, 0x8e, 0xea, 0x98, 0xde, 0xf1, 0xa9, 0x5e, 0x03, 0xa3, 0x43, 0x00, 0x75, 0x97, \n  0xf3, 0xdb, 0xb7, 0x00, 0xda, 0x01, 0xff, 0xe6, 0xa9, 0xfb, 0x13, 0x5c, 0x0c, 0x5c, 0xae, 0xf2, \n  0x5f, 0x8d, 0xf8, 0xa3, 0x14, 0x00, 0x43, 0x60, 0xfa, 0x8f, 0xe2, 0xfa, 0x06, 0xc4, 0xfb, 0x87, \n  0xce, 0xff, 0x97, 0xde, 0xfb, 0x20, 0x1b, 0x01, 0xad, 0x48, 0xfe, 0x06, 0xe2, 0x02, 0xe5, 0x2d, \n  0x01, 0xe8, 0x08, 0x00, 0x09, 0x84, 0xff, 0xd1, 0xbd, 0xfe, 0x40, 0x3b, 0x00, 0xc8, 0x51, 0xfc, \n  0x98, 0x34, 0xff, 0x49, 0xd6, 0xfe, 0xa7, 0x7a, 0x53, 0x71, 0xcd, 0x3e, 0xd5, 0x56, 0xfb, 0x4b, \n  0xf2, 0x05, 0x94, 0x22, 0xe9, 0x91, 0x74, 0xec, 0x35, 0xae, 0x00, 0x58, 0x4b, 0x04, 0x26, 0xae, \n  0xf3, 0x6a, 0x71, 0x00, 0x2a, 0x37, 0x00, 0x52, 0xf7, 0xfc, 0x0e, 0x94, 0x0a, 0x0b, 0x89, 0xf5, \n  0xf2, 0x34, 0xf9, 0x7f, 0x02, 0xfe, 0x36, 0xef, 0xfa, 0x2d, 0xc3, 0xf9, 0x10, 0x78, 0xfa, 0x93, \n  0xd3, 0xff, 0x81, 0xe9, 0xfc, 0xe5, 0xf4, 0xff, 0x2e, 0x54, 0xff, 0x05, 0xc4, 0x04, 0x24, 0x57, \n  0xff, 0xcc, 0x53, 0x00, 0x39, 0xbc, 0x00, 0x1e, 0x60, 0xfe, 0x90, 0x94, 0x00, 0x6e, 0x91, 0xfb, \n  0xb2, 0x3d, 0x00, 0x44, 0xba, 0xfd, 0x25, 0x69, 0x50, 0xe0, 0xba, 0x3d, 0x6c, 0x44, 0xfe, 0x45, \n  0xca, 0x08, 0xd3, 0x32, 0xe7, 0xc5, 0x87, 0xe6, 0x6f, 0x1d, 0x01, 0xdb, 0x3a, 0x07, 0xc0, 0x09, \n  0xf3, 0x19, 0xd3, 0x02, 0x10, 0xd1, 0xfe, 0x9f, 0xea, 0xfc, 0xff, 0x18, 0x0e, 0xfd, 0x93, 0xf4, \n  0xba, 0xce, 0xf8, 0x72, 0x2b, 0xfe, 0xcc, 0x84, 0xf8, 0xa3, 0xb2, 0xfa, 0x1e, 0xfd, 0xfa, 0x81, \n  0xac, 0xfe, 0xdf, 0x80, 0xfd, 0xce, 0xec, 0x01, 0xd5, 0xc2, 0xff, 0x77, 0x76, 0x02, 0xb2, 0x20, \n  0x00, 0xa5, 0x23, 0x02, 0xc7, 0x89, 0xff, 0x47, 0x30, 0xfd, 0xc2, 0x2d, 0x03, 0x6d, 0x6f, 0xfb, \n  0x48, 0x51, 0xfe, 0x92, 0xfe, 0xff, 0xfe, 0x25, 0x50, 0x5b, 0x32, 0x38, 0x27, 0x92, 0x01, 0x57, \n  0x42, 0x0b, 0x0a, 0x4b, 0xe3, 0xdb, 0xab, 0xe5, 0x77, 0xc2, 0x00, 0x59, 0x95, 0x08, 0x36, 0xc8, \n  0xf5, 0x75, 0x77, 0x01, 0x2f, 0x07, 0xfe, 0x30, 0x68, 0x00, 0x8e, 0x79, 0x0c, 0x91, 0xd6, 0xf4, \n  0x9e, 0x2c, 0xf9, 0xd6, 0x00, 0xfb, 0xfd, 0xe5, 0xf9, 0xcd, 0xcd, 0xfc, 0x8d, 0x84, 0xf8, 0xb0, \n  0xa6, 0xff, 0x43, 0x42, 0x01, 0x52, 0x6d, 0xff, 0xc8, 0xd1, 0xfe, 0x90, 0x3a, 0x04, 0x98, 0xbb, \n  0xff, 0x07, 0xf6, 0x00, 0xa3, 0x2f, 0x00, 0x20, 0xad, 0xfd, 0xce, 0x27, 0x03, 0x7a, 0x79, 0xfc, \n  0xfa, 0xd5, 0xfc, 0xe2, 0x89, 0x00, 0x97, 0xdc, 0x4c, 0xab, 0x44, 0x34, 0x7b, 0xf7, 0x04, 0x64, \n  0xa5, 0x0b, 0xbe, 0xc5, 0xe2, 0xab, 0x95, 0xe5, 0xa8, 0x4d, 0x00, 0x83, 0xc5, 0x08, 0x33, 0x58, \n  0xf8, 0xda, 0x40, 0x03, 0xf4, 0xc8, 0xf8, 0x68, 0xca, 0x03, 0x27, 0x3a, 0x0d, 0xb7, 0xee, 0xf1, \n  0xa0, 0xa9, 0xf9, 0x94, 0xf3, 0xfa, 0x29, 0x27, 0xfb, 0x76, 0x35, 0xfc, 0xc8, 0x28, 0xfa, 0x5e, \n  0x30, 0x01, 0x7f, 0x41, 0xff, 0xd7, 0x58, 0xff, 0x0a, 0x84, 0x00, 0x0d, 0xa6, 0x02, 0xfc, 0xcc, \n  0xfe, 0xd3, 0xd6, 0x01, 0x5f, 0x73, 0x00, 0x0e, 0x0f, 0xfe, 0x2d, 0x58, 0x02, 0xed, 0x6f, 0xfd, \n  0x24, 0x88, 0xfd, 0xed, 0xfc, 0xfd, 0xfb, 0x76, 0x47, 0x64, 0xe1, 0x32, 0xd6, 0x75, 0x06, 0x65, \n  0xa5, 0x09, 0x20, 0x91, 0xe5, 0x41, 0x14, 0xea, 0x7f, 0x52, 0xfb, 0x7c, 0x3f, 0x09, 0xdc, 0xb3, \n  0xff, 0x1e, 0x25, 0xfd, 0xf9, 0xc3, 0xf7, 0x27, 0x05, 0x08, 0x6c, 0xee, 0x08, 0x9f, 0x41, 0xf2, \n  0x9f, 0x57, 0xfc, 0xed, 0x29, 0xf9, 0xdb, 0xec, 0xfb, 0x29, 0xff, 0xff, 0x80, 0xdd, 0xf8, 0x1e, \n  0xe3, 0xff, 0x16, 0xd9, 0x00, 0x22, 0x71, 0xff, 0x67, 0x3b, 0xff, 0xb6, 0x09, 0x02, 0x1a, 0xab, \n  0xff, 0xe9, 0x98, 0x01, 0x2a, 0x95, 0x00, 0x98, 0x91, 0xfe, 0x1a, 0x20, 0x02, 0x26, 0xb9, 0xfd, \n  0xac, 0xf7, 0xfd, 0x22, 0x11, 0xfd, 0xc6, 0x7b, 0x48, 0xba, 0x7f, 0x2f, 0xdc, 0xa5, 0xfe, 0x7a, \n  0x38, 0x0b, 0xac, 0x32, 0xe7, 0x28, 0xc8, 0xed, 0xfb, 0xbf, 0xff, 0x33, 0xa6, 0x04, 0xf5, 0x55, \n  0xff, 0xe5, 0xf8, 0xfe, 0xbb, 0x9a, 0xf6, 0xe4, 0xf6, 0x07, 0xe8, 0x31, 0x07, 0x5e, 0x84, 0xf2, \n  0xc9, 0x8b, 0xfd, 0xfa, 0x10, 0xfa, 0x3a, 0x4a, 0xfe, 0x7a, 0x2d, 0xff, 0xbc, 0xcf, 0xf7, 0xe2, \n  0x2d, 0x02, 0xca, 0x08, 0x01, 0xea, 0xfb, 0xfc, 0xb0, 0xad, 0xff, 0x01, 0x7f, 0x02, 0x3e, 0xc3, \n  0xff, 0x1a, 0x6e, 0x01, 0xad, 0xd7, 0xff, 0xf8, 0xbf, 0xff, 0x66, 0xa3, 0x02, 0x5f, 0x77, 0xfc, \n  0x60, 0x9e, 0xfd, 0x33, 0x7b, 0xfe, 0x9f, 0x0b, 0x45, 0xd6, 0x1c, 0x29, 0x95, 0xcf, 0xff, 0xb6, \n  0x8e, 0x0d, 0x83, 0x95, 0xe6, 0x63, 0x38, 0xf5, 0x77, 0x04, 0xfe, 0xe2, 0xdf, 0x01, 0xd1, 0x13, \n  0x03, 0x8d, 0x35, 0xfb, 0xeb, 0xf3, 0xf5, 0xad, 0x16, 0x0a, 0xc6, 0xd0, 0x05, 0x64, 0x06, 0xf2, \n  0x0e, 0x81, 0x00, 0xbc, 0x52, 0xfb, 0x84, 0x08, 0xfe, 0x76, 0xe9, 0xfe, 0x8e, 0x7d, 0xf8, 0x7f, \n  0x17, 0x03, 0x15, 0xa9, 0xff, 0x6a, 0x85, 0xfc, 0x55, 0x7b, 0x00, 0x6f, 0x71, 0x02, 0x28, 0xfb, \n  0xfe, 0xfd, 0xcc, 0x01, 0xb3, 0xc5, 0x00, 0xe2, 0x85, 0xff, 0x17, 0x36, 0x02, 0x06, 0x7e, 0xfc, \n  0xd3, 0xc7, 0xfd, 0xfa, 0xbb, 0xfe, 0xd7, 0xb6, 0x3f, 0xe6, 0x09, 0x24, 0xa2, 0xb9, 0x00, 0xaf, \n  0xea, 0x0f, 0x72, 0x04, 0xeb, 0xa6, 0xf9, 0xf4, 0xbd, 0xe9, 0xfe, 0x77, 0xcc, 0x02, 0x01, 0xf4, \n  0xff, 0x04, 0xa3, 0xfa, 0xa0, 0x1a, 0xf8, 0x7f, 0x56, 0x09, 0x7d, 0xc0, 0x03, 0x0a, 0x2a, 0xf5, \n  0x6c, 0x0a, 0x02, 0xa0, 0xdd, 0xfa, 0x49, 0x34, 0xfe, 0x4e, 0x28, 0xff, 0x4f, 0xa7, 0xf9, 0x88, \n  0x5e, 0x02, 0xfb, 0xf4, 0xfe, 0xac, 0xb8, 0xfc, 0x5f, 0x65, 0x01, 0x6e, 0x76, 0x01, 0xa2, 0x65, \n  0xfe, 0xca, 0x18, 0x03, 0x4f, 0x0b, 0x01, 0x34, 0x1b, 0xff, 0x0c, 0xc0, 0x01, 0x75, 0xbc, 0xfc, \n  0x08, 0xb5, 0xfd, 0x1d, 0x1c, 0xff, 0xf9, 0xd4, 0x3c, 0xa5, 0x1b, 0x2c, 0xbf, 0x4d, 0x09, 0x91, \n  0xd6, 0x01, 0x54, 0x26, 0xd8, 0xdd, 0x76, 0xf2, 0xcb, 0xbb, 0x0b, 0xe2, 0xd3, 0x0c, 0x72, 0x07, \n  0xfe, 0x4a, 0x76, 0xf8, 0x00, 0xec, 0xf2, 0xde, 0x01, 0x01, 0x41, 0x7a, 0x06, 0xae, 0x42, 0xf8, \n  0x18, 0x99, 0x04, 0x9e, 0x9d, 0xfe, 0xfe, 0xb9, 0xfd, 0x75, 0x5e, 0x02, 0x43, 0x6d, 0xfd, 0xaa, \n  0xdf, 0x01, 0x0a, 0xb9, 0xff, 0x0a, 0x84, 0xfd, 0x62, 0x10, 0xff, 0xa4, 0x54, 0xfd, 0x30, 0x63, \n  0xfe, 0xcd, 0x24, 0x02, 0xa5, 0xda, 0xfd, 0x40, 0x9d, 0xff, 0x57, 0xcb, 0x03, 0xaf, 0xc8, 0xfe, \n  0x7f, 0xe3, 0x00, 0x00, 0x93, 0xff, 0x33, 0x38, 0x33, 0xdf, 0x0a, 0x2b, 0x57, 0x79, 0x0c, 0xb0, \n  0xfb, 0x04, 0x39, 0x0c, 0xde, 0x6e, 0x97, 0xed, 0x3a, 0x41, 0x08, 0x8f, 0x9a, 0x0a, 0xe2, 0x9b, \n  0x01, 0xfb, 0xc7, 0xfc, 0xab, 0xa5, 0xf3, 0x68, 0xf5, 0xfd, 0xf7, 0x8c, 0x04, 0x86, 0xd5, 0xfb, \n  0x97, 0xd8, 0x03, 0xb3, 0x6c, 0xfe, 0xef, 0x3e, 0xfe, 0x18, 0xd2, 0x02, 0x04, 0xd8, 0xfd, 0x03, \n  0x11, 0x01, 0xce, 0xfb, 0x00, 0x63, 0x4a, 0xfe, 0x86, 0x2a, 0xff, 0x3a, 0xad, 0xfd, 0x1b, 0xab, \n  0xfd, 0x08, 0x07, 0x01, 0xa3, 0x48, 0xfd, 0x5d, 0x33, 0x00, 0x61, 0x5d, 0x04, 0xcd, 0x97, 0xff, \n  0x2f, 0x9d, 0x01, 0x29, 0x9f, 0xff, 0x6e, 0x52, 0x2c, 0x6a, 0x89, 0x27, 0xf0, 0x78, 0x0d, 0x53, \n  0xe0, 0x06, 0x37, 0xba, 0xe3, 0xee, 0x11, 0xef, 0x17, 0xdf, 0x05, 0xd0, 0x71, 0x07, 0x75, 0x1a, \n  0x02, 0x59, 0x45, 0xfe, 0x6e, 0xae, 0xf5, 0x78, 0xdf, 0xfc, 0x94, 0x5c, 0x04, 0x38, 0x2d, 0xfd, \n  0x03, 0x23, 0x02, 0xfd, 0xf1, 0xfe, 0x5c, 0x6c, 0xfe, 0x8a, 0x7e, 0x02, 0xe0, 0x77, 0xfe, 0xba, \n  0x6c, 0x00, 0x7d, 0x0a, 0x01, 0x22, 0x29, 0xff, 0x68, 0xe4, 0xfe, 0x1e, 0xbc, 0xfd, 0xfd, 0x1a, \n  0xfe, 0x94, 0x33, 0x00, 0xb1, 0xb1, 0xfd, 0xc6, 0xca, 0x00, 0xaf, 0xe0, 0x03, 0xa6, 0x6a, 0x00, \n  0x5f, 0x6a, 0x01, 0x22, 0x60, 0xff, 0x43, 0x76, 0x24, 0x9c, 0xec, 0x23, 0x27, 0xc0, 0x0f, 0x48, \n  0x62, 0x07, 0x60, 0x99, 0xe9, 0x41, 0xa2, 0xf1, 0x87, 0x72, 0x02, 0x10, 0xa7, 0x05, 0xe0, 0xab, \n  0x02, 0x51, 0x4d, 0xff, 0xd3, 0xe0, 0xf7, 0x2b, 0x5e, 0xfc, 0xf9, 0xf4, 0x03, 0xdf, 0xd1, 0xfd, \n  0xb8, 0x0a, 0x01, 0xab, 0x82, 0xff, 0x9b, 0xa7, 0xfe, 0xe3, 0x1f, 0x02, 0xbc, 0x30, 0xff, 0xfd, \n  0x13, 0x00, 0xfb, 0x37, 0x01, 0xfe, 0xdf, 0xff, 0x35, 0xa0, 0xfe, 0xff, 0x02, 0xfe, 0x3c, 0x6e, \n  0xfe, 0xec, 0x0f, 0x00, 0x6d, 0xf6, 0xfe, 0x56, 0x23, 0x01, 0x50, 0x11, 0x03, 0x4b, 0xc7, 0x00, \n  0x2f, 0xe9, 0x00, 0x91, 0x3c, 0xff, 0xdc, 0x90, 0x1e, 0xbe, 0x82, 0x21, 0x3d, 0x68, 0x11, 0xde, \n  0x01, 0x07, 0x12, 0x10, 0xee, 0xe2, 0x8f, 0xf3, 0x17, 0x8b, 0x00, 0x01, 0xe7, 0x04, 0xe2, 0x9d, \n  0x02, 0x4e, 0x1e, 0x00, 0x05, 0xc8, 0xf9, 0xb0, 0x5c, 0xfc, 0xf9, 0x1d, 0x03, 0x71, 0x35, 0xfe, \n  0x43, 0xf3, 0x00, 0x1b, 0xdb, 0xff, 0x92, 0xac, 0xfe, 0x2b, 0x13, 0x02, 0x6b, 0xf6, 0xff, 0xb0, \n  0xf5, 0xff, 0x4d, 0x54, 0x01, 0xb9, 0x22, 0x00, 0xff, 0xb2, 0xfe, 0x50, 0xe5, 0xfe, 0x74, 0x48, \n  0xff, 0x34, 0x13, 0x00, 0x3d, 0x6f, 0xff, 0xb0, 0x11, 0x01, 0x36, 0x2c, 0x02, 0xd1, 0xab, 0x00, \n  0x00, 0x8b, 0x00, 0xf4, 0x0f, 0xff, 0x83, 0xc1, 0x18, 0x9b, 0xa1, 0x1e, 0x01, 0x73, 0x12, 0x3b, \n  0x75, 0x07, 0x3e, 0x20, 0xf2, 0x25, 0xa7, 0xf4, 0xd4, 0x5b, 0xff, 0x2d, 0x3b, 0x04, 0xc6, 0xbd, \n  0x02, 0x1d, 0xd3, 0x00, 0xe0, 0x1f, 0xfb, 0xa2, 0xb5, 0xfc, 0x05, 0x68, 0x02, 0xbd, 0x4d, 0xfe, \n  0x57, 0xc0, 0x00, 0x83, 0x70, 0x00, 0xca, 0xf4, 0xfe, 0x0f, 0xdd, 0x01, 0xb2, 0x88, 0x00, 0xd0, \n  0x0b, 0x00, 0x1f, 0x45, 0x01, 0x10, 0xd6, 0x00, 0x3f, 0xd0, 0xff, 0x52, 0xdd, 0xff, 0xd7, 0x4f, \n  0xff, 0x68, 0x25, 0xff, 0xd7, 0x95, 0xff, 0x38, 0xa7, 0x00, 0x8b, 0x08, 0x01, 0x35, 0x78, 0x00, \n  0xd8, 0x54, 0x00, 0x38, 0x61, 0xff, 0xf3, 0xde, 0x14, 0x8b, 0xff, 0x1b, 0x91, 0x15, 0x13, 0x60, \n  0x8f, 0x08, 0x35, 0xab, 0xf4, 0x05, 0x60, 0xf5, 0x5c, 0xf7, 0xfe, 0x04, 0x05, 0x04, 0x06, 0x24, \n  0x03, 0x2e, 0x15, 0x01, 0x00, 0x34, 0xfc, 0x20, 0x91, 0xfd, 0x45, 0xaa, 0x01, 0x5b, 0x51, 0xfe, \n  0x9c, 0x41, 0x01, 0xef, 0xe6, 0x00, 0x85, 0x4f, 0xff, 0x2e, 0x09, 0x02, 0xe3, 0x9d, 0x00, 0xf4, \n  0xeb, 0x00, 0xb0, 0x9a, 0x02, 0x7d, 0x3c, 0x01, 0x5e, 0xdb, 0xff, 0x39, 0x0b, 0x00, 0x63, 0xf3, \n  0xfe, 0x76, 0x48, 0xfe, 0x3a, 0xbb, 0xff, 0x37, 0x92, 0x00, 0xb8, 0x9a, 0x00, 0x55, 0xc5, 0x00, \n  0x3d, 0x4e, 0x00, 0x9e, 0x1d, 0xff, 0x7c, 0x9a, 0x12, 0xfd, 0x44, 0x1a, 0x14, 0x69, 0x12, 0x76, \n  0xff, 0x07, 0x80, 0x05, 0xf6, 0x1f, 0xcc, 0xf6, 0x04, 0x2a, 0xff, 0x8a, 0x64, 0x03, 0x70, 0x16, \n  0x03, 0x87, 0x61, 0x01, 0x34, 0x0d, 0xfd, 0xa7, 0xbf, 0xfd, 0x6b, 0x2d, 0x01, 0xac, 0x97, 0xfe, \n  0x50, 0x95, 0x01, 0x28, 0x03, 0x01, 0xca, 0x61, 0xff, 0xdd, 0xa6, 0x02, 0xb2, 0xdb, 0x01, 0xe6, \n  0x8e, 0x01, 0x91, 0x39, 0x02, 0x6c, 0xac, 0x00, 0xa0, 0x7a, 0xff, 0x14, 0x61, 0xff, 0xdc, 0xf3, \n  0xfd, 0xec, 0x66, 0xfe, 0x44, 0x2d, 0x00, 0x33, 0xe5, 0xff, 0xf1, 0x9e, 0x00, 0x40, 0x39, 0x00, \n  0xe5, 0x9e, 0xff, 0x0c, 0x20, 0x00, 0xd9, 0x53, 0x10, 0xa4, 0xee, 0x17, 0xaa, 0x09, 0x12, 0x72, \n  0x6a, 0x08, 0x19, 0x50, 0xf7, 0x81, 0x89, 0xf7, 0x0a, 0x49, 0xff, 0x8b, 0x84, 0x03, 0xa3, 0x50, \n  0x03, 0x7f, 0x6e, 0x01, 0xbf, 0xf8, 0xfd, 0xc5, 0x49, 0xfe, 0xfd, 0xf2, 0x00, 0x0b, 0xf4, 0xfe, \n  0x6f, 0x85, 0x01, 0x98, 0x3b, 0x02, 0x9e, 0x73, 0x01, 0x3d, 0xda, 0x02, 0x11, 0x8a, 0x01, 0x08, \n  0x0f, 0x01, 0x8e, 0x74, 0x01, 0xa5, 0xb4, 0xff, 0xd1, 0xbb, 0xfe, 0x60, 0x75, 0xff, 0xf7, 0xe7, \n  0xfd, 0xf8, 0xb8, 0xfe, 0x26, 0x5c, 0x00, 0x37, 0x23, 0xff, 0xbd, 0xf2, 0xff, 0xd6, 0xdf, 0x00, \n  0x63, 0x31, 0x00, 0x15, 0xe6, 0xff, 0xfa, 0xaa, 0x0f, 0x90, 0x64, 0x17, 0xe1, 0xb9, 0x10, 0x14, \n  0x27, 0x07, 0x91, 0x0b, 0xf8, 0xfe, 0xfa, 0xf8, 0xfd, 0x20, 0x00, 0x8c, 0xa6, 0x03, 0x21, 0x69, \n  0x03, 0x76, 0x86, 0x01, 0x2d, 0x14, 0xff, 0xae, 0xae, 0xfe, 0x9a, 0x95, 0x00, 0x50, 0x49, 0x00, \n  0x7d, 0x36, 0x03, 0xb8, 0x29, 0x03, 0xfb, 0x12, 0x01, 0xad, 0xc5, 0x01, 0x55, 0x09, 0x01, 0x34, \n  0x98, 0x00, 0x56, 0xb1, 0x00, 0xbc, 0x7d, 0xff, 0xfa, 0x17, 0xff, 0x62, 0x44, 0xff, 0x8d, 0x4d, \n  0xfe, 0x89, 0xf0, 0xfe, 0x1d, 0x68, 0xff, 0x3c, 0xf9, 0xff, 0x25, 0xca, 0x00, 0xe8, 0x1f, 0x00, \n  0xec, 0xe1, 0xff, 0x21, 0x27, 0x00, 0xbe, 0x64, 0x0f, 0x31, 0xa0, 0x16, 0xf7, 0x68, 0x0f, 0xe5, \n  0xe2, 0x05, 0xf8, 0x85, 0xf8, 0x2d, 0xc2, 0xfa, 0x18, 0x44, 0x01, 0x51, 0xa3, 0x03, 0xe5, 0xc0, \n  0x03, 0xf8, 0xf7, 0x01, 0x4d, 0xac, 0xff, 0x42, 0xc6, 0xff, 0x63, 0x5a, 0x02, 0x3d, 0x48, 0x01, \n  0x6b, 0x6f, 0x02, 0xf4, 0x0c, 0x02, 0xd5, 0x3d, 0x00, 0x85, 0xec, 0x00, 0xe9, 0x82, 0x00, 0x6e, \n  0x8b, 0x00, 0x83, 0x8b, 0x00, 0x8b, 0x94, 0xff, 0x49, 0xd7, 0xfe, 0x7a, 0x14, 0xff, 0x7b, 0x57, \n  0xfe, 0x5c, 0xa0, 0xff, 0x8d, 0x8f, 0x00, 0x3c, 0x2b, 0xff, 0x83, 0x03, 0x00, 0xcd, 0x0b, 0x00, \n  0x7d, 0x39, 0x00, 0xf3, 0x66, 0x00, 0x37, 0x40, 0x0f, 0x09, 0x7e, 0x16, 0x43, 0xe6, 0x0d, 0x72, \n  0x1a, 0x05, 0xd0, 0x8d, 0xf9, 0xad, 0xcc, 0xfb, 0x77, 0x6f, 0x02, 0xc0, 0x2c, 0x04, 0x75, 0x82, \n  0x03, 0x7d, 0xc6, 0x02, 0x38, 0x02, 0x02, 0x8f, 0x1f, 0x00, 0x42, 0x12, 0x01, 0xf6, 0xe1, 0x00, \n  0x5e, 0x62, 0x01, 0x56, 0x42, 0x01, 0x25, 0x1b, 0x00, 0xb6, 0xb3, 0x00, 0xaa, 0xaa, 0x00, 0x99, \n  0x8d, 0x00, 0xe1, 0x2e, 0x00, 0x37, 0x63, 0xff, 0x6a, 0xaa, 0xfe, 0x3d, 0x5e, 0xff, 0x1d, 0x0a, \n  0x00, 0x1f, 0x9d, 0xff, 0xee, 0x12, 0xff, 0x33, 0x44, 0xff, 0xe7, 0x0c, 0x00, 0x1d, 0x13, 0x00, \n  0x9e, 0x15, 0x00, 0x16, 0x92, 0x00, 0x04, 0x5c, 0x0e, 0x8e, 0x08, 0x16, 0xec, 0x46, 0x0d, 0xcf, \n  0xd8, 0x04, 0x54, 0x35, 0xfb, 0x81, 0x53, 0xfd, 0x71, 0x5a, 0x03, 0xbe, 0xc9, 0x04, 0xe9, 0x12, \n  0x05, 0xed, 0x90, 0x03, 0x60, 0xb0, 0x00, 0x57, 0x4c, 0xff, 0xeb, 0x02, 0x00, 0xb3, 0xe2, 0xff, \n  0xdf, 0x0c, 0x01, 0xc0, 0xec, 0x00, 0xcc, 0x5d, 0x00, 0x76, 0x89, 0x00, 0xcd, 0x61, 0x00, 0x55, \n  0x45, 0x00, 0x4f, 0x09, 0x00, 0xef, 0x90, 0xff, 0x3d, 0x89, 0xff, 0x2c, 0xc0, 0x00, 0xf0, 0x06, \n  0xff, 0xe1, 0x7f, 0xfe, 0x52, 0x4d, 0xff, 0x26, 0x7d, 0xff, 0xa7, 0x74, 0xff, 0x81, 0xb8, 0xff, \n  0x19, 0xe1, 0x00, 0x97, 0xd4, 0xff, 0xdd, 0x30, 0x0e, 0xbc, 0x00, 0x16, 0x8f, 0x5e, 0x0c, 0xd5, \n  0x84, 0x04, 0xa4, 0x63, 0xfd, 0x26, 0xcd, 0xfe, 0x0f, 0x83, 0x04, 0x9f, 0x04, 0x06, 0x17, 0xb7, \n  0x03, 0xbe, 0xd4, 0x01, 0x6d, 0x51, 0x00, 0x21, 0xec, 0xfe, 0xad, 0xc0, 0xff, 0x3a, 0x7e, 0xff, \n  0x28, 0x04, 0x01, 0xa4, 0xef, 0x00, 0xc2, 0x0f, 0x00, 0x7d, 0x3d, 0x00, 0x5e, 0x5c, 0x00, 0x0f, \n  0xc8, 0x00, 0x80, 0xa4, 0xff, 0x54, 0xb1, 0x00, 0x2c, 0xbf, 0x00, 0x23, 0xc6, 0xfe, 0x37, 0xb9, \n  0xfe, 0x84, 0x25, 0xff, 0xc5, 0x0b, 0xff, 0x9f, 0xe0, 0xfe, 0xfa, 0xa4, 0xff, 0xa2, 0xf6, 0xff, \n  0xab, 0xc2, 0xff, 0xc4, 0x20, 0x00, 0x62, 0xa4, 0x0e, 0x52, 0x46, 0x16, 0x1b, 0xaa, 0x0b, 0x65, \n  0x67, 0x04, 0x1c, 0x01, 0xff, 0xea, 0xd7, 0x00, 0xcf, 0xc4, 0x04, 0x55, 0x76, 0x04, 0x55, 0x5f, \n  0x02, 0x4a, 0x1f, 0x01, 0x5a, 0x07, 0x00, 0xac, 0x23, 0xff, 0x53, 0xd0, 0xff, 0xa4, 0x1d, 0xff, \n  0xb8, 0xe8, 0x00, 0xb1, 0xe0, 0x00, 0xa8, 0x6f, 0xff, 0xb9, 0x77, 0x00, 0x1b, 0x44, 0x01, 0xaf, \n  0x1e, 0x00, 0x6c, 0x9b, 0x00, 0x6b, 0xcb, 0x01, 0xbd, 0xe6, 0xfe, 0xe2, 0xb9, 0xfe, 0x42, 0x35, \n  0xff, 0xaa, 0xb0, 0xfe, 0x5c, 0x8b, 0xfe, 0x7d, 0x53, 0xff, 0x9f, 0xaf, 0xff, 0x62, 0xcb, 0xfe, \n  0xb2, 0x1a, 0x00, 0x2c, 0xdb, 0x00, 0xc7, 0x7c, 0x0e, 0xe5, 0x7e, 0x17, 0xf6, 0xb9, 0x0c, 0x24, \n  0x3c, 0x04, 0x63, 0x3b, 0xff, 0xf4, 0x82, 0x00, 0xe6, 0xcd, 0x03, 0x80, 0xd2, 0x03, 0x6e, 0xe6, \n  0x01, 0x83, 0x03, 0x01, 0x4e, 0x88, 0x00, 0x1c, 0x8f, 0xfe, 0x48, 0xb9, 0xff, 0x13, 0x97, 0xff, \n  0xd1, 0x2a, 0x00, 0xf8, 0xd1, 0x00, 0x36, 0xe0, 0xff, 0x7b, 0xf4, 0x00, 0xe4, 0xac, 0x00, 0xb3, \n  0x11, 0x01, 0xc3, 0x28, 0x02, 0x10, 0xac, 0xff, 0x6d, 0xdb, 0xfe, 0x94, 0xd8, 0xff, 0xbf, 0x8e, \n  0xfe, 0x19, 0xee, 0xfd, 0x5b, 0x03, 0xff, 0xe0, 0x71, 0xff, 0x22, 0xae, 0xfe, 0x52, 0x47, 0xff, \n  0x6d, 0x9c, 0x00, 0x35, 0x40, 0x01, 0x8a, 0x5c, 0x0f, 0x31, 0x0f, 0x19, 0x33, 0x32, 0x0d, 0x44, \n  0x58, 0x03, 0x9e, 0x46, 0xfe, 0x4d, 0xd1, 0xfe, 0x14, 0xe7, 0x02, 0xd8, 0x9c, 0x04, 0xc7, 0x2b, \n  0x02, 0x0f, 0xf5, 0x00, 0x8c, 0xa0, 0x00, 0x35, 0x59, 0xfe, 0x65, 0x46, 0xff, 0x76, 0xce, 0xff, \n  0x80, 0x7f, 0x00, 0x91, 0x8f, 0x00, 0xfb, 0x7f, 0x00, 0x77, 0xc2, 0x00, 0x5d, 0x51, 0x00, 0xda, \n  0xb1, 0x02, 0xef, 0x80, 0x01, 0xdd, 0xea, 0xfe, 0x91, 0x92, 0xff, 0x80, 0x99, 0xff, 0x59, 0x78, \n  0xfe, 0xff, 0xf5, 0xfd, 0xa3, 0x1d, 0xff, 0x61, 0x96, 0xfe, 0xef, 0xbb, 0xfe, 0x6f, 0x55, 0x00, \n  0xbb, 0xdd, 0x00, 0xad, 0x75, 0x00, 0x70, 0x83, 0x0f, 0x20, 0x92, 0x1a, 0x6c, 0xdd, 0x0d, 0x27, \n  0x4d, 0x02, 0x02, 0x63, 0xfd, 0x5d, 0x90, 0xfd, 0x19, 0x43, 0x02, 0x97, 0x76, 0x04, 0x2d, 0xfc, \n  0x01, 0xc9, 0x7b, 0x01, 0x63, 0xd0, 0x00, 0x3c, 0x05, 0xfe, 0xdf, 0x61, 0xff, 0x7d, 0x11, 0x00, \n  0x44, 0x4d, 0x00, 0x32, 0xc6, 0x00, 0x62, 0x16, 0x01, 0xaf, 0xdb, 0xff, 0xcf, 0x81, 0x00, 0x6c, \n  0xd3, 0x03, 0x58, 0xe1, 0x00, 0x29, 0xe7, 0xfe, 0x5a, 0xff, 0xff, 0x28, 0x62, 0xff, 0x5c, 0x47, \n  0xfe, 0x5a, 0xa3, 0xfe, 0xeb, 0xee, 0xfe, 0x9e, 0xe2, 0xfd, 0x81, 0xcc, 0xfe, 0x2e, 0xce, 0x00, \n  0xdf, 0x6a, 0x01, 0x20, 0x91, 0xff, 0x60, 0xbe, 0x0e, 0x72, 0xfc, 0x1a, 0xb6, 0x6e, 0x0f, 0x11, \n  0xf6, 0x01, 0x3e, 0x55, 0xfc, 0xe7, 0x28, 0xfd, 0xe4, 0x7b, 0x02, 0x6a, 0x90, 0x04, 0x5b, 0x56, \n  0x01, 0x38, 0x6a, 0x00, 0xc3, 0xa0, 0x00, 0x49, 0xc9, 0xfe, 0x01, 0x71, 0xff, 0x05, 0xfe, 0xff, \n  0x0c, 0xf3, 0x00, 0x59, 0xb4, 0x00, 0x2c, 0x7a, 0x00, 0x2e, 0x2d, 0x00, 0x45, 0x49, 0x00, 0xd5, \n  0x74, 0x03, 0xbc, 0xc2, 0x01, 0xb6, 0x05, 0xff, 0x8a, 0xc6, 0xff, 0x21, 0x8f, 0xff, 0x0f, 0x64, \n  0xfe, 0xc6, 0xdc, 0xfe, 0xed, 0xd9, 0xfe, 0x7c, 0xf3, 0xfd, 0x07, 0xdf, 0xfe, 0xd4, 0x7a, 0x00, \n  0x34, 0x49, 0x01, 0xfc, 0xb6, 0xff, 0x62, 0x8c, 0x0d, 0x73, 0xec, 0x1a, 0xe5, 0x95, 0x11, 0x56, \n  0xb6, 0x02, 0x67, 0x4c, 0xfb, 0x1d, 0x78, 0xfc, 0xc0, 0x90, 0x02, 0x91, 0x62, 0x05, 0x12, 0x04, \n  0x02, 0x60, 0x56, 0xff, 0xaa, 0x74, 0xff, 0x70, 0x7c, 0xfe, 0x8f, 0xe4, 0xfe, 0xe0, 0x96, 0x00, \n  0xaa, 0xeb, 0x01, 0x9d, 0xbd, 0x00, 0x7b, 0x86, 0x00, 0xf0, 0x65, 0x00, 0x0a, 0x69, 0xff, 0x70, \n  0x08, 0x03, 0xa1, 0xf5, 0x02, 0x46, 0x41, 0xff, 0x78, 0x80, 0xff, 0xb9, 0x14, 0x00, 0xad, 0xea, \n  0xfe, 0xde, 0xf8, 0xfe, 0x18, 0x0a, 0xff, 0x8f, 0x49, 0xfe, 0xd9, 0xe2, 0xfe, 0x90, 0x7f, 0x00, \n  0xd9, 0x40, 0x01, 0x88, 0xab, 0xff, 0xc5, 0x47, 0x0d, 0x85, 0x11, 0x1b, 0x85, 0xb1, 0x12, 0xcf, \n  0x24, 0x03, 0x7a, 0x9c, 0xfa, 0xa4, 0xc3, 0xfb, 0x04, 0x95, 0x02, 0xc1, 0x02, 0x06, 0x1c, 0x5d, \n  0x02, 0x1a, 0x09, 0xff, 0xfc, 0x07, 0xff, 0x40, 0x3b, 0xfe, 0x89, 0xe2, 0xfd, 0x56, 0x83, 0xff, \n  0x91, 0xec, 0x01, 0xfd, 0x95, 0x01, 0x1c, 0x7b, 0x00, 0x0f, 0x87, 0x00, 0x84, 0xb8, 0xff, 0xbb, \n  0xa9, 0x01, 0x33, 0x46, 0x03, 0xba, 0x13, 0x00, 0x25, 0xe0, 0xfe, 0xb2, 0xb5, 0xff, 0x90, 0x67, \n  0xff, 0x82, 0x90, 0xff, 0x60, 0x3f, 0xff, 0x48, 0x3c, 0xfe, 0x56, 0xd7, 0xfe, 0xd3, 0xae, 0x00, \n  0xb1, 0x0d, 0x01, 0x6e, 0xe8, 0xff, 0xd9, 0xe5, 0x0d, 0x49, 0xfa, 0x1b, 0x63, 0xfa, 0x12, 0x76, \n  0x4e, 0x03, 0xa5, 0xbd, 0xf9, 0x08, 0x20, 0xfb, 0x4e, 0x1f, 0x03, 0x3c, 0x5f, 0x06, 0x93, 0xab, \n  0x02, 0x5c, 0xb0, 0xfe, 0xfa, 0xc0, 0xfe, 0xaf, 0x8a, 0xfe, 0xd5, 0x9a, 0xfd, 0xbe, 0xd2, 0xfe, \n  0xdf, 0x11, 0x01, 0x2b, 0x3f, 0x01, 0x62, 0x60, 0x00, 0xeb, 0xb9, 0x00, 0xfd, 0x84, 0x00, 0xec, \n  0x27, 0x01, 0xbe, 0xee, 0x02, 0x7e, 0x1c, 0x01, 0x08, 0x89, 0xfe, 0x3f, 0xbc, 0xfe, 0xf9, 0x90, \n  0xff, 0xe5, 0xf1, 0xff, 0xf8, 0xd3, 0xff, 0x61, 0x9e, 0xfe, 0xd3, 0xee, 0xfe, 0xd2, 0xa8, 0x00, \n  0xed, 0xfc, 0x00, 0x14, 0x45, 0x00, 0x86, 0xc5, 0x0e, 0x7f, 0x5f, 0x1d, 0x70, 0xd3, 0x13, 0x0c, \n  0x1c, 0x03, 0xd5, 0xa0, 0xf8, 0x81, 0x6a, 0xfa, 0x63, 0x5d, 0x03, 0x0b, 0x63, 0x07, 0x63, 0xab, \n  0x02, 0x1a, 0x10, 0xfe, 0x0f, 0xbf, 0xfe, 0x19, 0x9a, 0xfe, 0x5a, 0xb7, 0xfd, 0x07, 0xa8, 0xfe, \n  0x97, 0x80, 0x00, 0x59, 0xe5, 0x00, 0x2e, 0x9c, 0xff, 0x4a, 0xad, 0xff, 0xae, 0x12, 0x01, 0x64, \n  0x2d, 0x01, 0xa4, 0x86, 0x02, 0x7c, 0x4a, 0x02, 0xcb, 0x2f, 0xff, 0xd5, 0xb0, 0xfd, 0x23, 0x9f, \n  0xfe, 0xd2, 0xdb, 0xff, 0x12, 0x5c, 0x00, 0xa7, 0x27, 0xff, 0x67, 0xeb, 0xfe, 0x13, 0x01, 0x01, \n  0xc4, 0x05, 0x01, 0xd6, 0x58, 0x00, 0x3f, 0xb0, 0x0f, 0x01, 0x55, 0x1f, 0xff, 0x9b, 0x14, 0x76, \n  0x0e, 0x02, 0x8f, 0xb1, 0xf7, 0x37, 0xfb, 0xf9, 0x30, 0x85, 0x03, 0xb0, 0x3f, 0x08, 0xc6, 0x72, \n  0x02, 0x81, 0x52, 0xfd, 0xf9, 0x90, 0xfe, 0x72, 0xae, 0xfe, 0xc4, 0xde, 0xfd, 0xf5, 0xaf, 0xfe, \n  0x3b, 0x20, 0x00, 0x17, 0x97, 0x00, 0xf3, 0xa7, 0xff, 0x8e, 0xb9, 0xfe, 0xab, 0x60, 0x00, 0x9d, \n  0x3d, 0x01, 0x59, 0xe3, 0x01, 0x0e, 0x5b, 0x02, 0x33, 0x8a, 0x00, 0xc0, 0xd9, 0xfd, 0x1c, 0x8e, \n  0xfd, 0xb7, 0x45, 0xff, 0x34, 0x58, 0x00, 0x50, 0x50, 0xff, 0x72, 0xe6, 0xfe, 0x43, 0x01, 0x01, \n  0xec, 0xe3, 0x00, 0xee, 0x76, 0x00, 0x7b, 0x54, 0x11, 0xa3, 0xe7, 0x21, 0xe1, 0x6a, 0x15, 0x45, \n  0xbf, 0x00, 0xa2, 0x83, 0xf6, 0xb2, 0x0d, 0xf9, 0xb2, 0xe9, 0x03, 0xba, 0xe9, 0x09, 0x69, 0xdb, \n  0x01, 0x5b, 0x24, 0xfc, 0x36, 0x5f, 0xfe, 0x30, 0xe7, 0xfe, 0x7f, 0xe6, 0xfd, 0x29, 0xc8, 0xfe, \n  0x12, 0x27, 0x00, 0xdd, 0x44, 0x00, 0x49, 0x8a, 0xff, 0x5c, 0x57, 0xfe, 0xa1, 0xde, 0xff, 0x30, \n  0xf0, 0x00, 0xed, 0x2c, 0x01, 0x5e, 0xbe, 0x01, 0x07, 0x45, 0x01, 0x0c, 0x8d, 0xfe, 0x40, 0x81, \n  0xfd, 0x12, 0xa3, 0xfe, 0xdd, 0xf3, 0xff, 0x89, 0x88, 0xff, 0xd3, 0xb0, 0xfe, 0x63, 0xa0, 0x00, \n  0x3f, 0x8d, 0x00, 0xd5, 0x44, 0x00, 0x0a, 0x53, 0x13, 0xb1, 0x8d, 0x24, 0x41, 0xb4, 0x15, 0x14, \n  0x50, 0xff, 0x29, 0x37, 0xf5, 0xac, 0x22, 0xf8, 0x81, 0xbd, 0x04, 0x01, 0x4c, 0x0b, 0x19, 0x1e, \n  0x01, 0xd4, 0xfd, 0xfa, 0x6e, 0x30, 0xfe, 0xcf, 0x2e, 0xff, 0xe8, 0xab, 0xfd, 0xa0, 0xd5, 0xfe, \n  0x5f, 0x64, 0x00, 0x69, 0xfc, 0xff, 0xbe, 0x58, 0xff, 0x33, 0x1c, 0xfe, 0x99, 0xb4, 0xff, 0x46, \n  0xc2, 0x00, 0xec, 0xa7, 0x00, 0xea, 0x2c, 0x01, 0xa0, 0x54, 0x01, 0xfa, 0x0d, 0xff, 0xa7, 0x4c, \n  0xfd, 0xc7, 0x73, 0xfe, 0xfc, 0xf8, 0xff, 0x17, 0x97, 0xff, 0x67, 0x99, 0xfe, 0x96, 0x6f, 0x00, \n  0x4f, 0x1b, 0x00, 0x8c, 0x32, 0xff, 0xa0, 0x6f, 0x14, 0xd1, 0x2f, 0x28, 0xeb, 0x50, 0x17, 0x10, \n  0x82, 0xfd, 0x1a, 0x81, 0xf3, 0xaa, 0x44, 0xf7, 0x89, 0x17, 0x05, 0xdc, 0xfc, 0x0c, 0x52, 0xa8, \n  0x00, 0xa2, 0x68, 0xf9, 0x5f, 0x13, 0xfe, 0xcc, 0x54, 0xff, 0xb8, 0xaa, 0xfd, 0x26, 0x88, 0xfe, \n  0x04, 0xab, 0x00, 0x74, 0xd4, 0xff, 0x6c, 0xd9, 0xfe, 0x94, 0x46, 0xfe, 0x3c, 0x51, 0xff, 0xa4, \n  0x7e, 0x00, 0x7f, 0x7e, 0x00, 0xe6, 0x4c, 0x00, 0x6c, 0x4c, 0x01, 0xc4, 0x85, 0xff, 0xb7, 0x75, \n  0xfd, 0xd1, 0x21, 0xfe, 0x47, 0x6b, 0xff, 0xef, 0xac, 0xff, 0x7a, 0x50, 0xff, 0xd6, 0x16, 0x00, \n  0xfb, 0xad, 0xff, 0xd1, 0x95, 0xfe, 0x8e, 0xd0, 0x16, 0x2b, 0x99, 0x2b, 0xde, 0x7f, 0x17, 0xf4, \n  0x9e, 0xfb, 0x5c, 0xa9, 0xf1, 0x53, 0xe6, 0xf6, 0xb1, 0x4c, 0x06, 0x54, 0x2e, 0x0e, 0x9c, 0xbd, \n  0xff, 0xaf, 0xe9, 0xf7, 0xc9, 0x51, 0xfe, 0x4a, 0x9e, 0xff, 0x95, 0x7e, 0xfd, 0x32, 0x68, 0xfe, \n  0xdc, 0xf8, 0x00, 0xbd, 0xc4, 0xff, 0x05, 0x5a, 0xfe, 0xde, 0x4b, 0xfe, 0xa7, 0x59, 0xff, 0xe0, \n  0x73, 0x00, 0x6f, 0x39, 0x00, 0xc0, 0xb2, 0xff, 0xff, 0x3e, 0x01, 0x90, 0xc4, 0xff, 0x68, 0xd0, \n  0xfd, 0x9e, 0x28, 0xfe, 0x4c, 0x37, 0xff, 0x7a, 0x54, 0xff, 0x00, 0x62, 0xff, 0x36, 0xae, 0x00, \n  0x11, 0x6e, 0xff, 0xd0, 0x69, 0xfe, 0xfc, 0x7b, 0x18, 0xd0, 0x0d, 0x2f, 0xe0, 0x7c, 0x18, 0x19, \n  0x23, 0xfa, 0xaf, 0xb4, 0xef, 0xad, 0x30, 0xf6, 0x97, 0x6e, 0x07, 0x74, 0x2b, 0x0f, 0x1a, 0x2a, \n  0xff, 0x82, 0x6f, 0xf6, 0x2e, 0x56, 0xfe, 0xb6, 0x32, 0x00, 0xf0, 0x3d, 0xfd, 0xc0, 0x11, 0xfe, \n  0xa8, 0x40, 0x01, 0x33, 0xf8, 0xff, 0x67, 0xd0, 0xfd, 0x1d, 0x16, 0xfe, 0xcf, 0x6d, 0xff, 0xba, \n  0x73, 0x00, 0x82, 0x2c, 0x00, 0x8c, 0xfc, 0xfe, 0xc4, 0xe5, 0x00, 0x4d, 0x2d, 0x00, 0x36, 0x21, \n  0xfe, 0xb5, 0x81, 0xfe, 0xba, 0xf6, 0xfe, 0x75, 0x33, 0xff, 0x5c, 0x28, 0xff, 0x77, 0xda, 0x00, \n  0x1a, 0x8f, 0xff, 0xa3, 0x54, 0xfe, 0x4f, 0xa6, 0x1a, 0xa3, 0x9d, 0x32, 0xd1, 0xae, 0x19, 0x31, \n  0x64, 0xf8, 0x22, 0x09, 0xed, 0x7a, 0x1d, 0xf5, 0x21, 0x8e, 0x08, 0x9d, 0x22, 0x10, 0xe5, 0xf4, \n  0xfd, 0x79, 0x75, 0xf4, 0xb4, 0x42, 0xfe, 0xbf, 0xce, 0x00, 0x0b, 0xd3, 0xfc, 0xa5, 0x72, 0xfd, \n  0x64, 0x11, 0x01, 0x28, 0x37, 0x00, 0x6c, 0x49, 0xfd, 0x59, 0xa7, 0xfd, 0x11, 0x0c, 0xff, 0x1a, \n  0x55, 0x00, 0xef, 0x23, 0x00, 0x38, 0x2a, 0xfe, 0x97, 0x0b, 0x00, 0x52, 0x3f, 0x00, 0xfe, 0x71, \n  0xfe, 0x9c, 0xd9, 0xfe, 0x65, 0x03, 0xff, 0x5e, 0xb7, 0xfe, 0x16, 0x02, 0xff, 0x7b, 0x61, 0x00, \n  0x1a, 0xc9, 0xff, 0x04, 0xf2, 0xfd, 0x1b, 0x22, 0x1c, 0x1c, 0x9e, 0x35, 0x35, 0x22, 0x1b, 0x72, \n  0x5a, 0xf8, 0x21, 0x36, 0xeb, 0xf2, 0xdf, 0xf3, 0x31, 0xea, 0x09, 0x23, 0xe1, 0x10, 0x66, 0xaa, \n  0xfd, 0x74, 0x0d, 0xf3, 0xe1, 0x17, 0xfe, 0x14, 0xfa, 0x01, 0x60, 0xbf, 0xfc, 0xa7, 0x23, 0xfd, \n  0x35, 0x2c, 0x01, 0x62, 0x76, 0x00, 0x8d, 0x2b, 0xfd, 0x22, 0xd1, 0xfd, 0xee, 0xe7, 0xfe, 0x8d, \n  0x47, 0x00, 0x3a, 0x61, 0x00, 0xdb, 0xfd, 0xfd, 0x63, 0x64, 0xff, 0xa0, 0x56, 0x00, 0x1d, 0x1f, \n  0xff, 0x6d, 0x12, 0xff, 0x50, 0xcb, 0xff, 0x31, 0x8c, 0xfe, 0x1c, 0x47, 0xff, 0x68, 0x32, 0x00, \n  0x61, 0xbb, 0xff, 0x3d, 0x55, 0xfe, 0xf7, 0x37, 0x1f, 0x47, 0x65, 0x38, 0xad, 0xfa, 0x1a, 0x3f, \n  0xe9, 0xf8, 0xb7, 0x38, 0xe9, 0x2a, 0x3c, 0xf2, 0x6a, 0xd0, 0x0b, 0x5a, 0x0e, 0x11, 0x27, 0x75, \n  0xfc, 0xe3, 0xd1, 0xf1, 0x9c, 0xab, 0xfd, 0x20, 0x00, 0x03, 0x6d, 0xc2, 0xfc, 0xb4, 0x64, 0xfc, \n  0xb8, 0x64, 0x01, 0x43, 0x79, 0x00, 0xe4, 0xbb, 0xfc, 0x5c, 0xe6, 0xfd, 0x30, 0xc8, 0xfe, 0x10, \n  0x2d, 0x00, 0x08, 0x3f, 0x00, 0x73, 0x1d, 0xfe, 0x1b, 0x52, 0xfe, 0x38, 0xcb, 0xff, 0x67, 0x31, \n  0x00, 0xd2, 0x1c, 0xff, 0x39, 0x57, 0x00, 0x95, 0xcd, 0xfe, 0x16, 0x25, 0xff, 0xe8, 0x70, 0x00, \n  0xad, 0x59, 0xff, 0xad, 0x57, 0xfe, 0xd7, 0xae, 0x22, 0x87, 0xec, 0x3a, 0x8d, 0x20, 0x19, 0xf6, \n  0xd9, 0xf8, 0x8c, 0xad, 0xe8, 0xb7, 0x98, 0xf1, 0x95, 0x4c, 0x0d, 0xef, 0x24, 0x10, 0x79, 0x38, \n  0xfb, 0x9a, 0xa9, 0xf1, 0x21, 0x02, 0xfd, 0x9f, 0x85, 0x03, 0x99, 0x16, 0xfd, 0x71, 0xa6, 0xfb, \n  0x1b, 0x66, 0x01, 0xa1, 0x99, 0x00, 0xcc, 0x52, 0xfc, 0x90, 0xf9, 0xfd, 0x4e, 0xb6, 0xfe, 0xcd, \n  0x12, 0x00, 0x61, 0xf0, 0xff, 0x77, 0x6d, 0xfe, 0x6d, 0xe8, 0xfd, 0xc3, 0x76, 0xfe, 0x95, 0x17, \n  0x01, 0xff, 0xa1, 0xff, 0xea, 0x4b, 0x00, 0x6d, 0x8a, 0xff, 0x0c, 0xdc, 0xfe, 0x1b, 0x8a, 0x00, \n  0xca, 0x94, 0xff, 0x60, 0xe6, 0xfd, 0xd7, 0x45, 0x29, 0xf3, 0x9b, 0x3d, 0x78, 0x3e, 0x13, 0x1c, \n  0x6b, 0xf8, 0xc7, 0xc9, 0xe9, 0xcd, 0x09, 0xf2, 0x4f, 0x50, 0x0e, 0x26, 0x3f, 0x0e, 0xee, 0x2f, \n  0xf9, 0x83, 0x7b, 0xf2, 0x8b, 0x5d, 0xfc, 0xb0, 0x4d, 0x03, 0xd5, 0xf6, 0xfd, 0x3d, 0xc7, 0xfa, \n  0x02, 0x15, 0x01, 0xeb, 0x88, 0x00, 0xab, 0x36, 0xfc, 0x6c, 0xe7, 0xfd, 0x03, 0xd8, 0xfe, 0x6d, \n  0xf9, 0xff, 0x7c, 0x55, 0xff, 0xef, 0x93, 0xfe, 0x27, 0x0f, 0xfe, 0xe7, 0x12, 0xfd, 0xc0, 0x2a, \n  0x01, 0xb2, 0xe0, 0x00, 0x69, 0xc3, 0xff, 0x68, 0x8d, 0x00, 0x39, 0x2f, 0xff, 0x18, 0xd4, 0xff, \n  0x40, 0x4a, 0x00, 0x53, 0x7d, 0xfd, 0xd9, 0xa7, 0x2e, 0x70, 0x09, 0x3e, 0xe0, 0x7b, 0x0e, 0xec, \n  0x67, 0xfb, 0xf3, 0x21, 0xeb, 0x0e, 0xc1, 0xef, 0x0d, 0x0e, 0x0f, 0x8d, 0x63, 0x0e, 0xba, 0x3f, \n  0xf7, 0xae, 0x77, 0xf2, 0x35, 0x4f, 0xfc, 0x27, 0x37, 0x03, 0x69, 0x61, 0xfe, 0xfd, 0x33, 0xfa, \n  0xaf, 0xcf, 0x00, 0x4b, 0x53, 0x00, 0x06, 0x26, 0xfc, 0x2f, 0x09, 0xfe, 0x29, 0x53, 0xff, 0xb8, \n  0x9d, 0xff, 0x02, 0xee, 0xfe, 0x50, 0x96, 0xfe, 0x16, 0x61, 0xfe, 0xb6, 0x7b, 0xfc, 0x7b, 0x46, \n  0x00, 0x98, 0x57, 0x02, 0xf2, 0x80, 0xff, 0x34, 0xed, 0x00, 0xbe, 0x0c, 0x00, 0x35, 0x33, 0xff, \n  0x12, 0xa6, 0x00, 0x48, 0x86, 0xfd, 0x0f, 0xe1, 0x33, 0x4a, 0xac, 0x3d, 0xd6, 0x9e, 0x09, 0xa1, \n  0x83, 0xff, 0x08, 0x83, 0xec, 0xa7, 0x14, 0xed, 0xf4, 0xa6, 0x0f, 0x1d, 0xba, 0x0e, 0xbb, 0x1a, \n  0xf5, 0xcc, 0x44, 0xf2, 0x7a, 0xe3, 0xfc, 0xf4, 0xb7, 0x02, 0xab, 0x62, 0xfe, 0x6c, 0xec, 0xf9, \n  0x81, 0x98, 0x00, 0x06, 0xca, 0xff, 0x0e, 0xe0, 0xfb, 0x5a, 0x71, 0xfe, 0xfd, 0x1e, 0x00, 0xc5, \n  0xed, 0xfe, 0x12, 0x84, 0xfe, 0xed, 0xcf, 0xfe, 0xd7, 0x3e, 0xfe, 0xdf, 0x63, 0xfc, 0xb3, 0x33, \n  0xff, 0x4d, 0x3f, 0x03, 0x67, 0xea, 0xff, 0x16, 0xb5, 0x00, 0xc7, 0xf2, 0x00, 0xe8, 0x0c, 0xff, \n  0x76, 0x58, 0x00, 0x8d, 0xcf, 0xfd, 0x6f, 0x64, 0x3b, 0x3d, 0x90, 0x3f, 0xce, 0x4d, 0x00, 0x99, \n  0x2e, 0x00, 0xb1, 0xac, 0xf0, 0xf8, 0xd2, 0xed, 0x44, 0x4b, 0x0e, 0xa0, 0x4e, 0x0d, 0xee, 0xab, \n  0xf3, 0xd5, 0x38, 0xf2, 0xbe, 0xbe, 0xfd, 0x8d, 0xc2, 0x01, 0x53, 0xac, 0xfe, 0x35, 0x66, 0xf9, \n  0x0c, 0x1d, 0x00, 0x5a, 0x40, 0xff, 0xbf, 0xd5, 0xfb, 0xdf, 0x9f, 0xfe, 0x6d, 0x02, 0x01, 0xc7, \n  0xda, 0xfe, 0x53, 0xbe, 0xfd, 0x8b, 0xef, 0xfe, 0xd4, 0xb0, 0xfd, 0xff, 0x05, 0xfd, 0x65, 0x6e, \n  0xfe, 0x11, 0xf5, 0x02, 0x62, 0x15, 0x01, 0xf8, 0xb6, 0x00, 0x53, 0x21, 0x01, 0x1d, 0x7c, 0xff, \n  0x28, 0xa9, 0xff, 0x62, 0xe5, 0xfd, 0x04, 0x5f, 0x43, 0x5a, 0x46, 0x40, 0x02, 0xc1, 0xf7, 0xc1, \n  0xe3, 0xff, 0x24, 0x13, 0xf4, 0xdd, 0x7f, 0xf0, 0x4a, 0x9b, 0x0c, 0xb4, 0x93, 0x0b, 0x5a, 0x0a, \n  0xf3, 0x0b, 0xf0, 0xf1, 0x34, 0x9c, 0xfe, 0xc6, 0x34, 0x01, 0xde, 0xd1, 0xfe, 0x2b, 0xc5, 0xf8, \n  0x4e, 0x0f, 0x00, 0x8c, 0x87, 0xfe, 0x90, 0x18, 0xfc, 0x0e, 0x0e, 0xff, 0x32, 0x9a, 0x01, 0x69, \n  0x01, 0xff, 0x8d, 0x02, 0xfd, 0xe7, 0x47, 0xff, 0x51, 0x1c, 0xfd, 0x2b, 0xb5, 0xfd, 0xaa, 0x69, \n  0xfe, 0x98, 0x4a, 0x02, 0x29, 0xcf, 0x01, 0xb3, 0x4c, 0x01, 0xf9, 0xbc, 0x00, 0x14, 0xc6, 0xff, \n  0xa3, 0x98, 0xff, 0x63, 0x5e, 0xfd, 0xa5, 0xae, 0x4a, 0x19, 0x4b, 0x43, 0xc4, 0x5c, 0xee, 0xe4, \n  0x97, 0xfd, 0x24, 0x14, 0xf8, 0x1c, 0x8a, 0xf4, 0x24, 0xe4, 0x09, 0xe5, 0x91, 0x09, 0x5d, 0x96, \n  0xf3, 0x4c, 0x84, 0xf0, 0xdf, 0x69, 0xff, 0xa7, 0x98, 0x00, 0x58, 0x0f, 0xff, 0xd6, 0xdf, 0xf7, \n  0x2a, 0xd7, 0xff, 0xc8, 0xe7, 0xfd, 0xa1, 0x84, 0xfc, 0x4c, 0x95, 0xff, 0x69, 0xde, 0x01, 0xef, \n  0x85, 0xff, 0x56, 0xd2, 0xfb, 0xab, 0xc3, 0xff, 0xac, 0xa3, 0xfc, 0x4d, 0x32, 0xfe, 0x82, 0xe9, \n  0xfe, 0xf2, 0x97, 0x01, 0xa3, 0x83, 0x01, 0x34, 0x4b, 0x02, 0xc0, 0x42, 0x00, 0x6e, 0x38, 0xff, \n  0xfb, 0x31, 0x00, 0xaa, 0xb3, 0xfc, 0x96, 0xf2, 0x50, 0xb0, 0x94, 0x45, 0x41, 0x6e, 0xe7, 0x2c, \n  0x8e, 0xfa, 0x3e, 0x6c, 0xfa, 0x3b, 0xc1, 0xf8, 0xdf, 0xa4, 0x07, 0xb8, 0x14, 0x08, 0xe5, 0x5b, \n  0xf4, 0xb6, 0xf1, 0xee, 0x60, 0xd7, 0xff, 0x77, 0x13, 0x00, 0x85, 0x33, 0xff, 0xe6, 0x5c, 0xf7, \n  0x89, 0x9b, 0xff, 0x11, 0x90, 0xfd, 0x1e, 0x18, 0xfd, 0xaf, 0xe7, 0xff, 0x07, 0xd1, 0x01, 0xed, \n  0x0c, 0x00, 0x70, 0xdd, 0xfa, 0x60, 0x32, 0x00, 0x8a, 0x72, 0xfc, 0xd7, 0x56, 0xfe, 0x08, 0xea, \n  0xff, 0xd5, 0x3d, 0x01, 0x25, 0x35, 0x00, 0x7a, 0x06, 0x03, 0x25, 0x28, 0x00, 0x09, 0x48, 0xfe, \n  0x20, 0xc7, 0x00, 0x89, 0xdc, 0xfc, 0x6a, 0xef, 0x57, 0x6a, 0xfe, 0x47, 0xe9, 0x3a, 0xe1, 0x3c, \n  0x19, 0xf6, 0x6e, 0x98, 0xfb, 0x90, 0x99, 0xfd, 0x55, 0xcb, 0x05, 0xe0, 0x13, 0x07, 0x96, 0xf8, \n  0xf4, 0x3c, 0x1e, 0xed, 0x1d, 0xdd, 0xff, 0x18, 0x3c, 0xff, 0x8c, 0xa1, 0xff, 0x8e, 0x2c, 0xf7, \n  0x22, 0x97, 0xff, 0x0b, 0x72, 0xfd, 0x03, 0xca, 0xfd, 0x93, 0xfc, 0xff, 0xd9, 0x97, 0x01, 0x08, \n  0xb0, 0x00, 0xd4, 0x25, 0xfa, 0x7a, 0xb9, 0x00, 0x95, 0x0d, 0xfc, 0xbe, 0xec, 0xfe, 0xc8, 0x16, \n  0x01, 0x7a, 0x89, 0x00, 0x77, 0xa8, 0xfe, 0x1e, 0xcc, 0x02, 0xa3, 0x78, 0x00, 0xd0, 0xa3, 0xfd, \n  0xbd, 0x09, 0x01, 0x1f, 0xe2, 0xfd, 0x7b, 0xd5, 0x5c, 0x44, 0xae, 0x4a, 0x2c, 0x2f, 0xdd, 0x26, \n  0x1f, 0xf2, 0x74, 0x11, 0xfb, 0x34, 0xb7, 0x00, 0x0e, 0x8f, 0x05, 0xb2, 0xa4, 0x06, 0x5c, 0x29, \n  0xf5, 0x9d, 0xa6, 0xeb, 0x8e, 0x3e, 0xff, 0xeb, 0x54, 0xfe, 0x84, 0x7c, 0x00, 0x9c, 0x74, 0xf7, \n  0x96, 0xa1, 0xff, 0x5b, 0xbb, 0xfd, 0x9c, 0xed, 0xfd, 0x20, 0xc1, 0xff, 0x4b, 0x5a, 0x01, 0x3c, \n  0x70, 0x01, 0x68, 0xe9, 0xf9, 0xf4, 0xbf, 0x00, 0x05, 0x1f, 0xfc, 0x2f, 0xa7, 0xff, 0x94, 0x0c, \n  0x01, 0x94, 0x18, 0x00, 0x18, 0x86, 0xfd, 0x57, 0xb0, 0x01, 0xa5, 0x2c, 0x01, 0xb5, 0xd4, 0xfd, \n  0x1b, 0xe9, 0x00, 0xd6, 0xa8, 0xfe, 0xa7, 0xf3, 0x60, 0xa4, 0x40, 0x4d, 0xcb, 0xcf, 0xda, 0xa2, \n  0xf8, 0xee, 0x99, 0x8f, 0xf8, 0xa3, 0xfc, 0x02, 0xc5, 0x93, 0x06, 0xba, 0x54, 0x06, 0xa4, 0x37, \n  0xf5, 0x1d, 0x66, 0xea, 0xc4, 0x00, 0xfe, 0x21, 0x7b, 0xfd, 0xde, 0x46, 0x02, 0x04, 0xf4, 0xf7, \n  0xfa, 0xc2, 0xff, 0x81, 0x4a, 0xfe, 0x66, 0x8a, 0xfd, 0xa3, 0x5a, 0xff, 0x74, 0x7c, 0x01, 0x67, \n  0x66, 0x02, 0x63, 0xad, 0xf9, 0x0d, 0xfa, 0x00, 0xfc, 0x7d, 0xfc, 0xf9, 0x84, 0xff, 0xb0, 0x99, \n  0x00, 0x73, 0xe2, 0xff, 0x67, 0x74, 0xfc, 0x5e, 0xc4, 0x00, 0xf8, 0x20, 0x02, 0x70, 0x6c, 0xfe, \n  0x4a, 0xad, 0x00, 0x53, 0x42, 0xff, 0x65, 0x5c, 0x65, 0x0f, 0x49, 0x4f, 0xac, 0xa3, 0xd9, 0x1a, \n  0x53, 0xec, 0x62, 0x03, 0xf3, 0xdf, 0xc8, 0x04, 0x0e, 0xc7, 0x08, 0xc0, 0xe0, 0x05, 0x24, 0xf7, \n  0xf4, 0x34, 0x00, 0xe9, 0x91, 0x05, 0xfc, 0xb3, 0x1f, 0xfd, 0x9e, 0x4a, 0x05, 0xc8, 0x1b, 0xf8, \n  0xcb, 0x45, 0x00, 0x6f, 0x69, 0xfe, 0x30, 0x85, 0xfc, 0xbb, 0x82, 0xff, 0x6d, 0xe1, 0x01, 0xac, \n  0xce, 0x02, 0xc5, 0x6b, 0xfa, 0x89, 0x38, 0x01, 0x62, 0x3c, 0xfb, 0x88, 0x4b, 0xff, 0xae, 0x01, \n  0x00, 0xf9, 0x26, 0xff, 0x56, 0x59, 0xfc, 0xb1, 0x5d, 0x00, 0x2c, 0x7a, 0x02, 0x2c, 0x57, 0xff, \n  0xb2, 0x06, 0x01, 0x0d, 0x3e, 0xff, 0x01, 0xb7, 0x68, 0x14, 0xc0, 0x4f, 0x4c, 0x7b, 0xda, 0xa4, \n  0xaa, 0xea, 0x51, 0xd3, 0xec, 0x58, 0xe2, 0x05, 0xa0, 0x87, 0x0a, 0xc3, 0x9e, 0x05, 0xfe, 0x30, \n  0xf4, 0x67, 0x54, 0xe8, 0x29, 0xad, 0xfa, 0x82, 0x85, 0xfd, 0x49, 0xbf, 0x07, 0x35, 0x4a, 0xf8, \n  0xd4, 0x79, 0x00, 0xd9, 0x99, 0xfd, 0x5d, 0x83, 0xfc, 0xbd, 0xf6, 0xff, 0x76, 0xae, 0x01, 0x77, \n  0xc4, 0x03, 0x91, 0x14, 0xfb, 0x5e, 0x9c, 0xff, 0xf5, 0x72, 0xfa, 0xd7, 0x23, 0xff, 0x80, 0x1a, \n  0xff, 0x5b, 0x5b, 0xff, 0x6d, 0x22, 0xfd, 0x02, 0xcb, 0xff, 0xfe, 0x4a, 0x02, 0xe1, 0xbb, 0x00, \n  0x48, 0x01, 0x01, 0xfc, 0x41, 0xfe, 0x8c, 0x4a, 0x6a, 0xb9, 0x97, 0x50, 0xfe, 0xad, 0xdd, 0xcb, \n  0x08, 0xe9, 0x60, 0x3e, 0xe5, 0x4b, 0x61, 0x05, 0x1b, 0xae, 0x0c, 0xfd, 0x38, 0x05, 0xcb, 0x15, \n  0xf3, 0x6e, 0x7d, 0xe9, 0x66, 0x52, 0xf9, 0x26, 0xc1, 0xfd, 0xc1, 0xc9, 0x0a, 0x95, 0x2f, 0xf8, \n  0x63, 0x7b, 0xff, 0x17, 0xc8, 0xfd, 0x7b, 0xd6, 0xfc, 0x0f, 0x4e, 0x00, 0x50, 0x84, 0x02, 0x89, \n  0x58, 0x03, 0x10, 0x31, 0xfa, 0x11, 0xc1, 0xfe, 0xfe, 0x41, 0xf9, 0xb5, 0xdd, 0xfe, 0x5a, 0x82, \n  0xff, 0xa6, 0xcb, 0xff, 0x0a, 0x9c, 0xfd, 0xfd, 0xb0, 0xff, 0x05, 0x56, 0x02, 0xf7, 0xbf, 0x00, \n  0x76, 0x3f, 0x01, 0x2a, 0x76, 0xfe, 0xcb, 0x0e, 0x69, 0xa8, 0xcd, 0x52, 0x56, 0x70, 0xe1, 0x6e, \n  0xc6, 0xe8, 0x0e, 0x7a, 0xde, 0x6d, 0xbd, 0x02, 0x14, 0xf9, 0x0e, 0xc1, 0x1f, 0x04, 0xc1, 0x06, \n  0xf4, 0x9d, 0x60, 0xeb, 0xb5, 0xdd, 0xf7, 0xb2, 0x48, 0xfe, 0x50, 0x8a, 0x0c, 0x4a, 0xda, 0xf7, \n  0x9d, 0xbc, 0xfe, 0x6c, 0xb3, 0xfe, 0x3c, 0x53, 0xfd, 0xe0, 0xb7, 0x01, 0x7e, 0x99, 0x00, 0x37, \n  0x43, 0x02, 0x3f, 0xac, 0xfa, 0x72, 0x5c, 0xfd, 0xef, 0x13, 0xf9, 0x95, 0xac, 0xff, 0x67, 0xb0, \n  0xff, 0x63, 0xc1, 0xff, 0x85, 0xb7, 0xfe, 0x58, 0xa3, 0xff, 0xb8, 0x1f, 0x01, 0x8a, 0xff, 0x00, \n  0x56, 0xdc, 0x02, 0xc7, 0x8b, 0xfd, 0xf2, 0x49, 0x69, 0x28, 0xd8, 0x50, 0x6e, 0xd6, 0xe7, 0x3f, \n  0x16, 0xe9, 0xe6, 0x35, 0xd6, 0xa7, 0x6c, 0xff, 0x12, 0xbd, 0x0f, 0x8e, 0x52, 0x05, 0xe1, 0x85, \n  0xf5, 0xa2, 0xcc, 0xed, 0x7c, 0xe2, 0xf6, 0x02, 0x6c, 0xfe, 0x00, 0x97, 0x0d, 0xb1, 0x29, 0xf7, \n  0xc1, 0xdc, 0xfe, 0xa3, 0x51, 0x01, 0x29, 0x83, 0xfd, 0x95, 0xb9, 0xff, 0xa4, 0x7e, 0xff, 0x91, \n  0x23, 0x01, 0x54, 0x10, 0xfb, 0x3a, 0x39, 0xfd, 0x8e, 0xb6, 0xf9, 0x20, 0x13, 0x00, 0x96, 0xc6, \n  0xff, 0xff, 0x84, 0x00, 0xa7, 0x8f, 0xfe, 0x52, 0x3f, 0xff, 0x43, 0x54, 0x01, 0xf9, 0xfd, 0x00, \n  0x91, 0x49, 0x03, 0x80, 0xa7, 0xfd, 0xaf, 0x70, 0x66, 0xad, 0x0b, 0x51, 0x6c, 0x9c, 0xed, 0xff, \n  0x2a, 0xea, 0x8b, 0xf7, 0xcf, 0xbf, 0x3f, 0xfa, 0xa6, 0x3d, 0x11, 0x2d, 0x41, 0x08, 0xdd, 0x82, \n  0xf6, 0x43, 0x09, 0xf0, 0x0f, 0x81, 0xf6, 0xe8, 0xa2, 0xfd, 0x89, 0x71, 0x0d, 0xf4, 0x14, 0xf8, \n  0xec, 0xe2, 0x00, 0x82, 0x43, 0x01, 0x5e, 0x90, 0xfb, 0xad, 0x8f, 0xff, 0x5e, 0x16, 0xfe, 0x4a, \n  0x1c, 0x01, 0xdb, 0x71, 0xfc, 0x34, 0x15, 0xfd, 0x70, 0x62, 0xfa, 0x92, 0xa9, 0x00, 0x0c, 0xb7, \n  0xff, 0x6d, 0xae, 0xff, 0xb4, 0x4e, 0xff, 0x39, 0xe2, 0xff, 0xd0, 0xaa, 0x00, 0xb7, 0xa4, 0x00, \n  0x03, 0x2a, 0x04, 0x0e, 0xc1, 0xfd, 0xd6, 0x49, 0x65, 0xfe, 0x2d, 0x4e, 0x4c, 0x6b, 0xf2, 0x75, \n  0xd4, 0xeb, 0xb0, 0x96, 0xc9, 0x92, 0xf2, 0xf5, 0x44, 0xea, 0x13, 0x10, 0xad, 0x0a, 0x31, 0xb3, \n  0xf6, 0x08, 0x41, 0xf3, 0xeb, 0x5c, 0xf5, 0x06, 0x9d, 0xfb, 0x84, 0x92, 0x0f, 0xcd, 0x61, 0xf9, \n  0xc2, 0xfc, 0xff, 0xd8, 0xc6, 0x00, 0x2f, 0xe6, 0xf9, 0x7c, 0x4a, 0xff, 0x25, 0x69, 0xfe, 0xad, \n  0xfd, 0x00, 0x7c, 0x4b, 0xfd, 0x8c, 0x78, 0xfd, 0x52, 0xa7, 0xfb, 0xce, 0xb2, 0xff, 0xfd, 0xd7, \n  0xfe, 0x17, 0x7f, 0x00, 0x89, 0xe7, 0xff, 0x11, 0x36, 0xff, 0x63, 0xad, 0x00, 0x58, 0xd4, 0x00, \n  0xf3, 0x1b, 0x04, 0x2f, 0xba, 0xfd, 0x47, 0x59, 0x62, 0x96, 0xdd, 0x4a, 0x97, 0xeb, 0xf6, 0x86, \n  0x6d, 0xee, 0xdf, 0x5b, 0xc3, 0xf9, 0xcc, 0xf3, 0xa1, 0x79, 0x15, 0xdb, 0xcd, 0x0c, 0xb8, 0x00, \n  0xf9, 0x31, 0xcf, 0xf4, 0x5a, 0xf6, 0xf2, 0xf2, 0x93, 0xfd, 0xd2, 0x02, 0x10, 0x50, 0xf8, 0xf7, \n  0x5b, 0x89, 0x00, 0xa6, 0x15, 0xfe, 0x38, 0x10, 0xfa, 0xcd, 0x2a, 0x01, 0xcd, 0x54, 0xfd, 0x83, \n  0x57, 0x01, 0x2f, 0x2a, 0xff, 0x96, 0xd5, 0xfd, 0xe2, 0xcb, 0xfa, 0x7c, 0x44, 0xff, 0xe0, 0xa8, \n  0xff, 0x48, 0x28, 0x00, 0xcd, 0xda, 0xff, 0xa5, 0x62, 0xff, 0xfd, 0xed, 0x00, 0x9c, 0xaa, 0x00, \n  0xd2, 0x9b, 0x03, 0x3b, 0xe1, 0xfd, 0x68, 0xa3, 0x5f, 0x37, 0x5e, 0x46, 0x4a, 0x9c, 0xfa, 0xf8, \n  0x27, 0xef, 0x0a, 0xcc, 0xc2, 0xd2, 0x24, 0xf2, 0x9f, 0x6f, 0x15, 0x8f, 0x1b, 0x10, 0x61, 0x71, \n  0xf8, 0x52, 0xad, 0xf6, 0xce, 0x56, 0xf3, 0xbd, 0xae, 0xfc, 0xcf, 0xf1, 0x0f, 0x09, 0x69, 0xf7, \n  0x14, 0xc0, 0xfe, 0xd4, 0x88, 0xfe, 0xd6, 0x7b, 0xfb, 0xca, 0xe0, 0x00, 0x9c, 0x9d, 0xfd, 0x15, \n  0x9c, 0x02, 0xde, 0x19, 0xff, 0x4f, 0xda, 0xfc, 0x56, 0xc1, 0xfb, 0xe2, 0x8d, 0xff, 0x42, 0xcb, \n  0xfe, 0xb6, 0x2e, 0x00, 0xf5, 0x65, 0x00, 0xea, 0x48, 0xff, 0xed, 0xfc, 0x00, 0xf9, 0x4d, 0x00, \n  0x24, 0xa7, 0x03, 0x78, 0xf5, 0xfd, 0xa5, 0xeb, 0x59, 0x5e, 0x82, 0x41, 0x31, 0xd7, 0xfd, 0x97, \n  0x43, 0xf2, 0xe3, 0xcf, 0xc4, 0xe2, 0x14, 0xf0, 0x31, 0x09, 0x15, 0x6e, 0x8e, 0x10, 0x61, 0xc5, \n  0xfb, 0x62, 0xef, 0xf7, 0xb4, 0x2e, 0xf0, 0x8d, 0xd6, 0xfe, 0x6f, 0xc3, 0x0d, 0xb8, 0x02, 0xf6, \n  0x0d, 0xc9, 0xff, 0xa2, 0xe0, 0xfe, 0x15, 0xf5, 0xfb, 0x0c, 0x07, 0x02, 0xde, 0xb2, 0xfe, 0xd8, \n  0xfd, 0x00, 0x92, 0x48, 0xff, 0x35, 0xb7, 0xfd, 0x3b, 0x58, 0xfc, 0xba, 0xb0, 0xfe, 0x67, 0x47, \n  0xfe, 0x22, 0x05, 0x01, 0x07, 0x97, 0x00, 0x57, 0x75, 0xfe, 0xee, 0x39, 0x01, 0x7f, 0x3a, 0x01, \n  0x09, 0x74, 0x02, 0x12, 0xd9, 0xfd, 0xae, 0x6d, 0x54, 0xfc, 0x41, 0x3c, 0x7b, 0xb4, 0xff, 0x3f, \n  0xd2, 0xf6, 0xb1, 0x21, 0xc8, 0xf9, 0xb4, 0xee, 0xe4, 0xc9, 0x12, 0x86, 0x3e, 0x13, 0xb3, 0x8e, \n  0xfc, 0xaf, 0xbf, 0xf6, 0xd7, 0xac, 0xf0, 0x43, 0x63, 0xfe, 0x43, 0xb1, 0x0c, 0x0f, 0xee, 0xf5, \n  0xf8, 0x8e, 0x00, 0x1c, 0xc8, 0xfe, 0xfa, 0x5d, 0xfd, 0x65, 0x6b, 0x03, 0x46, 0x7f, 0xfc, 0xe9, \n  0x1f, 0x01, 0xb5, 0xa2, 0x00, 0xff, 0x42, 0xfd, 0x92, 0x8a, 0xfc, 0x25, 0x52, 0xfe, 0x34, 0x5a, \n  0xfe, 0x22, 0xb8, 0x01, 0xad, 0x94, 0xff, 0x64, 0x30, 0xfe, 0xbf, 0xc6, 0x02, 0x7a, 0xac, 0x00, \n  0x3a, 0x4c, 0x01, 0x45, 0x8e, 0xfe, 0x5a, 0x95, 0x4d, 0x37, 0xd5, 0x34, 0x9a, 0x52, 0x02, 0x24, \n  0xf6, 0xfd, 0x71, 0xed, 0xca, 0x68, 0x3c, 0xee, 0xf7, 0xa0, 0x13, 0x58, 0xc4, 0x10, 0xcc, 0x05, \n  0xfd, 0xbc, 0x19, 0xf8, 0x6b, 0xc4, 0xee, 0xff, 0xa6, 0x00, 0xe8, 0x20, 0x0b, 0xd7, 0x5a, 0xf5, \n  0x0c, 0xe6, 0x01, 0xa5, 0xbf, 0xff, 0xd7, 0xb4, 0xfe, 0x31, 0xd2, 0x01, 0xcc, 0x44, 0xfc, 0x1a, \n  0x5d, 0x02, 0x9c, 0x94, 0x00, 0x87, 0x82, 0xfc, 0xfc, 0x7d, 0xfd, 0xc3, 0x4f, 0xfe, 0x5f, 0x58, \n  0xfe, 0xbd, 0x78, 0x01, 0xba, 0x22, 0xff, 0x37, 0xe8, 0xfe, 0x2e, 0x2a, 0x03, 0x58, 0x21, 0x00, \n  0xe1, 0xa8, 0x00, 0x6b, 0x06, 0xff, 0x8f, 0x4c, 0x45, 0x60, 0x43, 0x30, 0xa8, 0x02, 0x06, 0x6e, \n  0xd0, 0x00, 0x52, 0x80, 0xcf, 0x13, 0x8a, 0xf1, 0x38, 0xb1, 0x0f, 0x1f, 0x29, 0x0e, 0x5b, 0xd5, \n  0xfe, 0xf8, 0x0c, 0xf7, 0xd8, 0xaf, 0xf0, 0xdd, 0x40, 0x01, 0x9a, 0xd1, 0x08, 0x7a, 0x30, 0xf6, \n  0x2b, 0x72, 0x03, 0x47, 0x2d, 0x00, 0x48, 0x7c, 0xfd, 0x49, 0xf9, 0x01, 0xd2, 0x07, 0xfd, 0x77, \n  0x41, 0x02, 0x6b, 0x0a, 0x00, 0x02, 0xad, 0xfc, 0xae, 0x95, 0xfe, 0xd6, 0xe4, 0xfd, 0xcb, 0xef, \n  0xfd, 0xc0, 0xe7, 0x01, 0x1e, 0xf4, 0xfe, 0x7a, 0xb5, 0xfe, 0x14, 0xbe, 0x03, 0xaa, 0x88, 0xff, \n  0x68, 0x72, 0x00, 0x2f, 0x52, 0xff, 0xe0, 0xb5, 0x41, 0x0d, 0xb3, 0x2e, 0x64, 0xd2, 0x01, 0x71, \n  0x4d, 0xf9, 0x81, 0x8e, 0xd3, 0x73, 0x41, 0xff, 0xba, 0xca, 0x13, 0x6c, 0xfe, 0x05, 0x14, 0x23, \n  0xfa, 0x1e, 0x61, 0xfa, 0x44, 0xac, 0xf5, 0x87, 0x90, 0xfe, 0x02, 0x95, 0x08, 0x30, 0xad, 0xf6, \n  0x01, 0x71, 0x02, 0x5b, 0x83, 0x00, 0xdc, 0x7a, 0xfd, 0x8a, 0x37, 0x01, 0x4a, 0x60, 0xfe, 0x33, \n  0xd5, 0x01, 0x94, 0x52, 0xff, 0x06, 0xa1, 0xfd, 0x81, 0x7e, 0xfd, 0x27, 0x2c, 0xff, 0xa2, 0x06, \n  0xff, 0xc3, 0xf5, 0xff, 0x1a, 0xe7, 0xff, 0xd1, 0xb1, 0xff, 0x5c, 0x24, 0xff, 0xff, 0x26, 0xff, \n  0x33, 0x3f, 0x03, 0x79, 0x6b, 0xff, 0x18, 0x54, 0x35, 0x6f, 0xf8, 0x2e, 0xd6, 0xa9, 0x0c, 0x53, \n  0x8d, 0xfc, 0xe9, 0x64, 0xd4, 0xa3, 0x2f, 0xf5, 0x09, 0x10, 0x0d, 0x37, 0x3a, 0x0a, 0xc3, 0xac, \n  0x02, 0xa5, 0xef, 0xfb, 0xca, 0xb8, 0xf4, 0x67, 0xbc, 0xfb, 0x89, 0xc0, 0x04, 0x22, 0xff, 0xf9, \n  0xf8, 0x80, 0x04, 0xdf, 0xc4, 0x00, 0xb9, 0xcb, 0xfc, 0x66, 0x76, 0x02, 0x2e, 0xa2, 0xfe, 0xfc, \n  0x77, 0x00, 0x2b, 0x11, 0x01, 0x5c, 0xad, 0xfe, 0xd8, 0xf9, 0xfd, 0x91, 0x96, 0x00, 0x5f, 0x9b, \n  0xfc, 0xb9, 0x46, 0xfe, 0xea, 0xfc, 0xff, 0x28, 0xc1, 0xfe, 0x17, 0x44, 0x01, 0x4c, 0x36, 0x01, \n  0x3e, 0x11, 0x03, 0x4e, 0xd0, 0xff, 0x5c, 0xce, 0x2b, 0xea, 0xb8, 0x2a, 0x25, 0x72, 0x0f, 0xd9, \n  0xa6, 0xff, 0x41, 0x90, 0xdd, 0xc8, 0x7b, 0xf4, 0x63, 0x60, 0x09, 0xc6, 0xe7, 0x08, 0x7c, 0x50, \n  0x02, 0x16, 0x3c, 0xfd, 0x82, 0x80, 0xf7, 0x86, 0xa6, 0xfb, 0x0e, 0x37, 0x03, 0xa6, 0x22, 0xfc, \n  0x7c, 0xa5, 0x03, 0x96, 0x92, 0x00, 0x3e, 0x4a, 0xfd, 0xf3, 0x43, 0x02, 0xb7, 0x17, 0xff, 0xe7, \n  0x31, 0x00, 0xb3, 0x76, 0x01, 0x73, 0x29, 0xff, 0x51, 0xcf, 0xfe, 0x19, 0xa2, 0x00, 0x47, 0xe9, \n  0xfc, 0x58, 0x94, 0xfe, 0x00, 0x69, 0x00, 0x50, 0x07, 0xff, 0x37, 0xd3, 0x00, 0xb7, 0x7e, 0x01, \n  0x53, 0x7a, 0x02, 0xe7, 0xeb, 0xff, 0xd8, 0x1d, 0x24, 0x2a, 0xe6, 0x26, 0x39, 0x9c, 0x10, 0xfb, \n  0x8d, 0x02, 0x7b, 0xe6, 0xe4, 0x41, 0x55, 0xf4, 0xf0, 0xe0, 0x06, 0x2b, 0x06, 0x07, 0x1f, 0x40, \n  0x02, 0xa8, 0xd1, 0xfe, 0xf0, 0x8a, 0xf9, 0xa8, 0xb1, 0xfb, 0xc7, 0x84, 0x02, 0xb4, 0x73, 0xfd, \n  0x25, 0xae, 0x02, 0x07, 0xa2, 0x00, 0xf1, 0xe1, 0xfd, 0x6e, 0x0e, 0x02, 0x01, 0x81, 0xff, 0x22, \n  0x36, 0x00, 0x13, 0xad, 0x01, 0x34, 0xf6, 0xff, 0x41, 0x21, 0xff, 0x34, 0xd2, 0x00, 0xed, 0x2c, \n  0xfe, 0x21, 0xbf, 0xfe, 0x40, 0x33, 0x00, 0xd8, 0xc2, 0xfe, 0xa6, 0x6c, 0x00, 0xfb, 0x50, 0x01, \n  0x16, 0xef, 0x01, 0xa7, 0x2a, 0x00, 0x37, 0x64, 0x1e, 0x97, 0x36, 0x23, 0x98, 0x14, 0x11, 0x24, \n  0x2f, 0x04, 0x4f, 0x42, 0xea, 0x4e, 0x25, 0xf5, 0xbf, 0x08, 0x05, 0x9c, 0x50, 0x05, 0x1f, 0x76, \n  0x02, 0x68, 0xee, 0xff, 0x32, 0x0e, 0xfb, 0x07, 0x19, 0xfc, 0xd9, 0xe7, 0x01, 0xe2, 0x39, 0xfe, \n  0xaf, 0xe3, 0x01, 0xcf, 0xd7, 0x00, 0x49, 0x5f, 0xfe, 0x24, 0xc6, 0x01, 0x15, 0xfa, 0xff, 0xf4, \n  0x5a, 0x00, 0xbe, 0xce, 0x01, 0x4d, 0xc3, 0x00, 0xc8, 0xf7, 0xff, 0xc5, 0x09, 0x01, 0x8d, 0x87, \n  0xfe, 0x92, 0x48, 0xfe, 0xc2, 0xa6, 0xff, 0xac, 0x99, 0xfe, 0xb0, 0x8e, 0xff, 0xa6, 0x10, 0x01, \n  0x5d, 0x22, 0x02, 0x85, 0x1c, 0x00, 0x11, 0x5a, 0x1a, 0x07, 0x93, 0x20, 0x32, 0x92, 0x10, 0x2a, \n  0xb9, 0x04, 0x48, 0x9b, 0xee, 0xa3, 0xa9, 0xf6, 0x50, 0xbb, 0x03, 0xc5, 0x5d, 0x04, 0x2a, 0xd4, \n  0x02, 0x99, 0x8c, 0x00, 0xee, 0x82, 0xfc, 0x12, 0xce, 0xfc, 0x0a, 0xac, 0x01, 0x96, 0xac, 0xfe, \n  0xa5, 0xad, 0x01, 0x88, 0x39, 0x01, 0xe8, 0xe7, 0xfe, 0x60, 0xcc, 0x01, 0x44, 0x65, 0x00, 0x0f, \n  0x4f, 0x01, 0xfb, 0x9e, 0x02, 0xdc, 0x48, 0x01, 0x53, 0x0e, 0x00, 0x7d, 0xa9, 0x00, 0x80, 0x9a, \n  0xfe, 0x08, 0x01, 0xfe, 0x7e, 0x31, 0xff, 0x95, 0x7a, 0xfe, 0xf2, 0x64, 0xff, 0x74, 0x40, 0x01, \n  0x04, 0x47, 0x02, 0x81, 0x20, 0x00, 0x68, 0x62, 0x17, 0x85, 0xf1, 0x1d, 0x3a, 0x1c, 0x10, 0xdd, \n  0x91, 0x04, 0x96, 0x4c, 0xf1, 0x7f, 0x01, 0xf8, 0xa4, 0xe7, 0x02, 0x69, 0x96, 0x03, 0x4b, 0xe0, \n  0x02, 0x76, 0x04, 0x01, 0xf3, 0x91, 0xfd, 0x0e, 0x61, 0xfd, 0x8d, 0x1c, 0x01, 0xb4, 0xfb, 0xfe, \n  0x69, 0xb8, 0x01, 0x3d, 0x28, 0x01, 0xe5, 0x32, 0xff, 0x0d, 0x33, 0x02, 0x69, 0x58, 0x01, 0xd0, \n  0x91, 0x01, 0x5c, 0x1f, 0x02, 0xa4, 0xaa, 0x00, 0xfa, 0x95, 0xff, 0x93, 0x45, 0x00, 0x2d, 0x46, \n  0xfe, 0x34, 0xac, 0xfd, 0xde, 0x03, 0xff, 0xfa, 0x4f, 0xfe, 0x20, 0xef, 0xfe, 0x28, 0x4d, 0x01, \n  0x62, 0xf7, 0x01, 0xa8, 0xb3, 0xff, 0x59, 0x5a, 0x15, 0x4a, 0x5d, 0x1c, 0xb6, 0x0e, 0x0f, 0x48, \n  0xfc, 0x03, 0x13, 0xdb, 0xf3, 0xc2, 0x5e, 0xf9, 0x0e, 0x9c, 0x02, 0xc4, 0x69, 0x03, 0x93, 0x35, \n  0x03, 0x92, 0x72, 0x01, 0x9a, 0x93, 0xfe, 0x5f, 0x19, 0xfe, 0xde, 0xf5, 0x00, 0x87, 0x7c, 0xff, \n  0x60, 0xd8, 0x01, 0x0b, 0xdb, 0x01, 0xa3, 0x14, 0x00, 0xb2, 0x36, 0x02, 0xf9, 0x52, 0x01, 0x5a, \n  0x1f, 0x01, 0xe5, 0x70, 0x01, 0x45, 0x77, 0x00, 0x05, 0x69, 0xff, 0x58, 0x0c, 0x00, 0xe0, 0xbd, \n  0xfe, 0xbe, 0xac, 0xfd, 0x18, 0x9b, 0xfe, 0x2d, 0x62, 0xfe, 0xcb, 0x1c, 0xff, 0xba, 0x0e, 0x01, \n  0xa7, 0x5b, 0x02, 0xef, 0x8a, 0x00, 0x46, 0x02, 0x14, 0xd3, 0x45, 0x1b, 0x51, 0xde, 0x0d, 0x5a, \n  0x25, 0x03, 0xef, 0xfa, 0xf5, 0x38, 0x8e, 0xfa, 0x6a, 0xca, 0x02, 0x7d, 0xb5, 0x03, 0xf0, 0x7c, \n  0x03, 0xd2, 0xd0, 0x01, 0x26, 0x56, 0xff, 0xb8, 0xdb, 0xfe, 0x8e, 0xeb, 0x00, 0x38, 0x53, 0x00, \n  0x6f, 0x77, 0x02, 0x2a, 0xc0, 0x01, 0xa9, 0xd0, 0xff, 0x6f, 0x57, 0x01, 0x2d, 0x36, 0x01, 0xcb, \n  0xf1, 0x00, 0x70, 0xc7, 0x00, 0xfe, 0x85, 0x00, 0xf7, 0xb3, 0xff, 0xac, 0xf7, 0xff, 0xf8, 0xbb, \n  0xfe, 0x80, 0xc3, 0xfd, 0x4c, 0x9f, 0xfe, 0xd4, 0x24, 0xfe, 0xf4, 0xd1, 0xff, 0xe6, 0xee, 0x01, \n  0xae, 0x6b, 0x01, 0x1d, 0x10, 0x00, 0xbb, 0xf8, 0x12, 0x1d, 0xba, 0x1a, 0xb5, 0xb8, 0x0c, 0x32, \n  0x13, 0x02, 0x15, 0xcc, 0xf7, 0xa7, 0xaf, 0xfb, 0xae, 0x47, 0x03, 0xda, 0x46, 0x04, 0x6f, 0x74, \n  0x03, 0xae, 0x42, 0x02, 0xe4, 0xb3, 0xff, 0xe0, 0x86, 0xff, 0x6d, 0x92, 0x01, 0x67, 0x19, 0x00, \n  0xaf, 0xc5, 0x01, 0xb0, 0x42, 0x01, 0x1e, 0x68, 0xff, 0xb6, 0x80, 0x00, 0xcf, 0x16, 0x01, 0xb7, \n  0x0b, 0x01, 0x7e, 0x74, 0x00, 0xa0, 0x9a, 0x00, 0x2a, 0xc2, 0xff, 0x1b, 0x8b, 0xff, 0x88, 0x3a, \n  0xff, 0x51, 0x04, 0xfe, 0x87, 0xe3, 0xfd, 0x41, 0xad, 0xff, 0xd0, 0x4c, 0x00, 0x0b, 0x17, 0x00, \n  0x89, 0xb8, 0x00, 0xd5, 0x7e, 0x00, 0x04, 0x4e, 0x12, 0xb5, 0xa0, 0x1a, 0x2f, 0xd4, 0x0b, 0xe6, \n  0x7c, 0x01, 0x1a, 0x5f, 0xf9, 0xba, 0xe1, 0xfc, 0x96, 0xd9, 0x03, 0x7a, 0x17, 0x05, 0xad, 0x70, \n  0x03, 0xf7, 0x8e, 0x02, 0xff, 0xc2, 0x00, 0x80, 0xfc, 0xfe, 0xb8, 0x46, 0x01, 0xaa, 0xf0, 0xff, \n  0x0b, 0x26, 0x01, 0xf3, 0x39, 0x01, 0xb6, 0x27, 0xff, 0xe5, 0x04, 0x00, 0x09, 0xf5, 0x00, 0x18, \n  0xac, 0x01, 0xac, 0x59, 0x00, 0x85, 0x3c, 0x00, 0x01, 0x45, 0x00, 0x21, 0x16, 0x00, 0xa6, 0xcf, \n  0xfe, 0xdf, 0xb7, 0xfe, 0xf2, 0x9e, 0xff, 0xfd, 0x7f, 0xfe, 0x20, 0x53, 0xff, 0x81, 0x45, 0x00, \n  0xf2, 0x5b, 0x00, 0x2c, 0x9a, 0x00, 0x32, 0x15, 0x12, 0x30, 0x7c, 0x1a, 0x3f, 0x49, 0x0b, 0xf4, \n  0x67, 0x01, 0xc5, 0x9e, 0xfa, 0xb6, 0x86, 0xfd, 0x70, 0x07, 0x04, 0x43, 0x45, 0x05, 0xf1, 0xf1, \n  0x03, 0x04, 0x5a, 0x02, 0x06, 0x9d, 0x00, 0x0b, 0x60, 0xfe, 0x53, 0x34, 0x00, 0x3c, 0x5d, 0x00, \n  0x44, 0xd0, 0x00, 0xfd, 0xfd, 0x00, 0x73, 0xf7, 0xfe, 0x99, 0xa1, 0xff, 0x72, 0x2c, 0x01, 0x85, \n  0x3c, 0x01, 0x36, 0x5d, 0x00, 0x38, 0x77, 0x00, 0x29, 0x99, 0x00, 0x30, 0x91, 0xff, 0xe6, 0xc3, \n  0xff, 0x70, 0x54, 0x00, 0x75, 0xd3, 0xfd, 0x94, 0xc5, 0xfd, 0x89, 0x76, 0xff, 0xf1, 0x29, 0x00, \n  0xd4, 0x1c, 0x00, 0x03, 0x41, 0x00, 0x97, 0xb6, 0x11, 0x95, 0xb3, 0x1a, 0x24, 0xb9, 0x0b, 0xa2, \n  0xb9, 0x01, 0x80, 0x89, 0xfb, 0x47, 0x62, 0xfd, 0x22, 0x86, 0x03, 0xaf, 0x24, 0x05, 0x9d, 0x9c, \n  0x03, 0x78, 0x8f, 0x02, 0xfa, 0x68, 0x00, 0x31, 0x16, 0xfe, 0x98, 0xdd, 0xff, 0xbf, 0xbb, 0xff, \n  0x90, 0xe8, 0x00, 0x38, 0xf0, 0x00, 0xe8, 0x3e, 0xff, 0x01, 0x7d, 0xff, 0x2e, 0xdb, 0x00, 0xc7, \n  0x20, 0x01, 0x7c, 0x04, 0x00, 0x3c, 0x23, 0x01, 0x0d, 0x0b, 0x00, 0xf1, 0x56, 0x00, 0x12, 0xae, \n  0x01, 0x2c, 0x49, 0xfe, 0x6a, 0x52, 0xfd, 0x62, 0x9c, 0xfe, 0xed, 0xc4, 0xfe, 0x34, 0xd5, 0xff, \n  0x60, 0xa8, 0x00, 0xfd, 0xe8, 0xff, 0xa1, 0xd1, 0x11, 0xbd, 0x8d, 0x1b, 0xe1, 0x45, 0x0c, 0xe6, \n  0x8d, 0x01, 0xc2, 0xbd, 0xfb, 0x49, 0x89, 0xfd, 0xac, 0xb8, 0x02, 0x6e, 0x53, 0x04, 0x3c, 0x0e, \n  0x03, 0xa2, 0xf8, 0x01, 0x67, 0x2f, 0x01, 0x7a, 0x77, 0xfe, 0x3a, 0x2e, 0xff, 0xfc, 0xc7, 0xff, \n  0x1e, 0x4f, 0x00, 0x38, 0xd2, 0x00, 0xd6, 0xe5, 0xff, 0x30, 0xe4, 0xff, 0x45, 0x83, 0x00, 0x5c, \n  0x61, 0x00, 0x3c, 0xa3, 0x00, 0x55, 0x5f, 0x00, 0x9b, 0x0a, 0x00, 0x96, 0xc9, 0x02, 0x10, 0x62, \n  0x00, 0x11, 0x28, 0xfd, 0xdc, 0x47, 0xfe, 0xc1, 0x7a, 0xfe, 0xe7, 0xa9, 0xfe, 0x7f, 0x06, 0x00, \n  0x56, 0xa8, 0x00, 0x60, 0xea, 0xfe, 0x1d, 0x14, 0x12, 0x74, 0xd8, 0x1c, 0xad, 0x09, 0x0d, 0xb4, \n  0xae, 0x00, 0xe2, 0x93, 0xfb, 0x54, 0x87, 0xfd, 0xf9, 0x90, 0x02, 0xf2, 0x4a, 0x04, 0xcf, 0xd3, \n  0x01, 0xf3, 0x31, 0x01, 0xce, 0x14, 0x01, 0x7c, 0x74, 0xfe, 0x0e, 0xf4, 0xff, 0x25, 0xc1, 0xff, \n  0x3c, 0x29, 0x00, 0xd3, 0xe0, 0x00, 0xa7, 0x98, 0xff, 0xe8, 0x51, 0x00, 0x08, 0xd5, 0x00, 0x1e, \n  0x41, 0x00, 0xfa, 0x3c, 0x00, 0xf3, 0xd7, 0xff, 0x56, 0xff, 0x00, 0xa9, 0x2e, 0x03, 0x10, 0x4d, \n  0xff, 0x0f, 0x8f, 0xfd, 0xdc, 0x8d, 0xfe, 0x9f, 0x59, 0xfe, 0xfa, 0x3a, 0xff, 0x15, 0x6d, 0x00, \n  0xe5, 0xf5, 0xff, 0x91, 0x64, 0xfe, 0x7c, 0x09, 0x12, 0xe9, 0x7f, 0x1e, 0x8d, 0x0b, 0x0e, 0xaa, \n  0xc0, 0xff, 0xa0, 0xfc, 0xfa, 0x05, 0xda, 0xfc, 0x97, 0xf7, 0x02, 0xd0, 0xf4, 0x04, 0x0e, 0x57, \n  0x01, 0xf4, 0x65, 0x00, 0xd1, 0x09, 0x00, 0x64, 0xca, 0xfd, 0xc3, 0x90, 0xff, 0x2f, 0x5a, 0x00, \n  0x74, 0x20, 0x01, 0x51, 0xce, 0x00, 0xc8, 0x9a, 0xff, 0x9a, 0x23, 0x00, 0x4b, 0x67, 0x00, 0xd4, \n  0x95, 0x00, 0xd8, 0x8c, 0x00, 0x31, 0x54, 0xff, 0x5b, 0xdd, 0x00, 0x58, 0x6d, 0x03, 0xf7, 0xb8, \n  0xfe, 0x35, 0x9a, 0xfd, 0xdb, 0x0b, 0xff, 0x47, 0x42, 0xfe, 0x60, 0xd0, 0xff, 0x8e, 0xc5, 0x00, \n  0xe9, 0x5c, 0xff, 0xc8, 0x5e, 0xfe, 0xfe, 0x34, 0x12, 0xff, 0xf7, 0x1f, 0x83, 0x87, 0x0f, 0x57, \n  0xea, 0xfe, 0xf1, 0xd1, 0xf9, 0xa3, 0x48, 0xfc, 0xd0, 0x72, 0x03, 0x8b, 0xd2, 0x05, 0x13, 0x67, \n  0x01, 0xd3, 0x0f, 0x00, 0x3e, 0x79, 0xff, 0xbc, 0x18, 0xfd, 0x57, 0x64, 0xfe, 0x13, 0x07, 0x00, \n  0xe0, 0x5e, 0x01, 0x2c, 0x67, 0x01, 0x49, 0x64, 0x00, 0xce, 0x28, 0x00, 0xf6, 0x42, 0x00, 0xd5, \n  0x37, 0x00, 0xad, 0xb7, 0x00, 0x7a, 0x70, 0xff, 0x86, 0x9d, 0x00, 0x48, 0x6c, 0x03, 0x7c, 0x79, \n  0xfe, 0x17, 0x81, 0xfd, 0xd6, 0x3d, 0xff, 0xcb, 0x61, 0xfe, 0x2b, 0x59, 0x00, 0x0f, 0x11, 0x01, \n  0x0f, 0x5f, 0xff, 0xb2, 0x5b, 0xfe, 0xf6, 0x76, 0x12, 0x3f, 0xdf, 0x21, 0xb6, 0xcd, 0x10, 0xd9, \n  0x48, 0xfe, 0xbd, 0x88, 0xf8, 0x79, 0x47, 0xfb, 0x3b, 0x34, 0x04, 0xf1, 0x83, 0x06, 0xb5, 0x8c, \n  0x01, 0xe0, 0xc0, 0xff, 0xd9, 0x30, 0xff, 0x57, 0xf9, 0xfc, 0xd6, 0xbe, 0xfd, 0xb1, 0x39, 0xff, \n  0x71, 0xeb, 0x00, 0x40, 0x1f, 0x01, 0x52, 0x3d, 0x00, 0xc7, 0xbe, 0x00, 0xad, 0x03, 0x01, 0xec, \n  0x27, 0x00, 0x62, 0x68, 0x00, 0xc7, 0xd5, 0xff, 0x40, 0x96, 0xff, 0xbb, 0x1a, 0x03, 0x77, 0xb3, \n  0xff, 0x88, 0xb8, 0xfc, 0x58, 0xa6, 0xfe, 0x3c, 0xcc, 0xfe, 0xad, 0x94, 0x00, 0x30, 0x1e, 0x01, \n  0xa7, 0xa8, 0xff, 0xfb, 0xa2, 0xfe, 0xd8, 0x05, 0x13, 0x75, 0xf2, 0x23, 0x90, 0x87, 0x12, 0x5b, \n  0xfa, 0xfc, 0x9d, 0xaa, 0xf6, 0x47, 0x37, 0xfb, 0x51, 0xa9, 0x04, 0x33, 0x6e, 0x07, 0x8f, 0xb0, \n  0x01, 0x11, 0xa2, 0xfe, 0xb9, 0x6a, 0xff, 0x65, 0x1d, 0xfd, 0xe7, 0x25, 0xfd, 0xae, 0x1c, 0xff, \n  0xa3, 0x53, 0x00, 0x08, 0xa6, 0x00, 0x16, 0x8f, 0xff, 0xa4, 0x09, 0x00, 0x90, 0x7f, 0x01, 0x44, \n  0x5f, 0x00, 0x62, 0x98, 0x00, 0x55, 0xc3, 0x00, 0xa2, 0x78, 0xfe, 0xf1, 0x0f, 0x02, 0x91, 0x0f, \n  0x01, 0xf3, 0x9a, 0xfc, 0x71, 0xf7, 0xfd, 0x3d, 0xe9, 0xfe, 0x6a, 0x35, 0x00, 0xa5, 0x3a, 0x01, \n  0x16, 0xf4, 0xff, 0x23, 0x90, 0xfe, 0xb1, 0xc5, 0x13, 0xc6, 0x68, 0x26, 0xb8, 0xa7, 0x14, 0x8b, \n  0xae, 0xfb, 0xb1, 0x72, 0xf4, 0x1b, 0xdb, 0xfa, 0xc9, 0x35, 0x05, 0xb1, 0x6a, 0x08, 0x90, 0x90, \n  0x01, 0x30, 0x8e, 0xfd, 0xf7, 0x7a, 0xff, 0x7d, 0xab, 0xfd, 0x29, 0xc1, 0xfc, 0x4d, 0x0f, 0xff, \n  0x9a, 0x18, 0x00, 0xf5, 0x29, 0x00, 0xf9, 0x5d, 0xff, 0x6f, 0x36, 0xff, 0x6c, 0x29, 0x01, 0x30, \n  0xba, 0x00, 0xb3, 0xd8, 0xff, 0xa2, 0x4e, 0x01, 0x2e, 0x72, 0xff, 0x16, 0x42, 0x00, 0x8b, 0xc8, \n  0x01, 0xa4, 0x47, 0xfe, 0x47, 0xcb, 0xfc, 0x40, 0x09, 0xfe, 0x4b, 0x45, 0x00, 0x48, 0x2d, 0x01, \n  0x3c, 0xc2, 0xff, 0x1c, 0xc1, 0xfe, 0x27, 0x1e, 0x14, 0x1a, 0x1a, 0x29, 0x3c, 0xdd, 0x17, 0x9b, \n  0x36, 0xfa, 0x61, 0xf7, 0xf1, 0x30, 0x4b, 0xfa, 0x1b, 0x8f, 0x05, 0x57, 0xca, 0x09, 0x8d, 0x68, \n  0x01, 0xb5, 0x2e, 0xfc, 0x63, 0x24, 0xff, 0x8b, 0x73, 0xfe, 0x16, 0x94, 0xfc, 0x23, 0xe2, 0xfe, \n  0xfa, 0x4e, 0x00, 0xeb, 0xa3, 0xff, 0xb8, 0x0f, 0xff, 0x34, 0xbc, 0xfe, 0x2d, 0xa9, 0x00, 0x22, \n  0x2a, 0x01, 0x30, 0x5d, 0xff, 0x9e, 0x4e, 0x00, 0x04, 0x3d, 0x00, 0x4e, 0x8a, 0xff, 0x08, 0x57, \n  0x01, 0xf2, 0x90, 0x00, 0xac, 0x39, 0xfd, 0x3f, 0xfa, 0xfc, 0xed, 0x78, 0xff, 0x39, 0xa3, 0x00, \n  0x06, 0x08, 0x00, 0xc3, 0xce, 0xfe, 0x5e, 0xaa, 0x14, 0x14, 0x19, 0x2c, 0x2b, 0x5b, 0x1b, 0xa4, \n  0x91, 0xf8, 0x1c, 0x01, 0xef, 0xfa, 0xd8, 0xf9, 0xca, 0x26, 0x06, 0xc4, 0x3b, 0x0b, 0x46, 0x3c, \n  0x01, 0x2b, 0x7a, 0xfa, 0xc7, 0xbb, 0xfe, 0x78, 0x3e, 0xff, 0xef, 0x7f, 0xfc, 0xe6, 0x95, 0xfe, \n  0x1c, 0x94, 0x00, 0xd6, 0x8e, 0xff, 0xba, 0x95, 0xfe, 0x99, 0x71, 0xfe, 0xa5, 0x3b, 0x00, 0x50, \n  0x07, 0x01, 0xf3, 0x10, 0x00, 0x69, 0x40, 0xff, 0xb4, 0x8a, 0xff, 0x1d, 0xc8, 0xff, 0xd0, 0xf6, \n  0xff, 0x41, 0xa8, 0x01, 0x6a, 0xdd, 0xff, 0x00, 0x96, 0xfc, 0x1d, 0x21, 0xfe, 0xb7, 0x9f, 0x00, \n  0xfb, 0x78, 0xff, 0xbc, 0x79, 0xfe, 0x07, 0xa3, 0x17, 0xfa, 0x92, 0x30, 0x2c, 0x83, 0x1b, 0x75, \n  0x4c, 0xf5, 0x78, 0x5d, 0xec, 0xbd, 0xc2, 0xf9, 0xc3, 0x27, 0x08, 0x27, 0x41, 0x0c, 0x92, 0xbd, \n  0xff, 0xcf, 0xce, 0xf8, 0x71, 0x8c, 0xfe, 0xac, 0xb0, 0xff, 0x95, 0x85, 0xfc, 0xee, 0x4d, 0xfe, \n  0x36, 0x9f, 0x00, 0x8c, 0x82, 0xff, 0xf7, 0x07, 0xfe, 0xa4, 0x42, 0xfe, 0xa8, 0xff, 0xff, 0xfd, \n  0xb1, 0x00, 0x9b, 0x37, 0x00, 0x7f, 0x31, 0xff, 0xbb, 0x8c, 0xfe, 0x6c, 0x3e, 0xff, 0xfe, 0x8d, \n  0xff, 0x27, 0x27, 0x01, 0xed, 0x8e, 0x01, 0x9e, 0x3a, 0xfe, 0x85, 0x1b, 0xfd, 0x9f, 0xbf, 0xff, \n  0x14, 0xaa, 0xff, 0x40, 0xde, 0xfd, 0xc3, 0x84, 0x19, 0x1d, 0x70, 0x34, 0x27, 0xb6, 0x1d, 0xa0, \n  0xf3, 0xf2, 0x62, 0x13, 0xe9, 0xc6, 0xcd, 0xf9, 0x99, 0x9d, 0x09, 0x9a, 0x25, 0x0d, 0x35, 0x05, \n  0xff, 0x65, 0xe9, 0xf6, 0x7c, 0x18, 0xfe, 0x2d, 0xcd, 0x00, 0x88, 0x1e, 0xfc, 0x3b, 0x1a, 0xfe, \n  0xc4, 0xe8, 0x00, 0x38, 0x2e, 0xff, 0x75, 0xcd, 0xfd, 0xa8, 0x35, 0xfe, 0x04, 0xab, 0xff, 0xe3, \n  0xac, 0x00, 0xde, 0x12, 0x00, 0x8c, 0x39, 0xff, 0x49, 0x7f, 0xfe, 0xa5, 0xe9, 0xfd, 0xf0, 0x7d, \n  0xff, 0x70, 0xdd, 0x00, 0xf9, 0xcb, 0x01, 0xc8, 0x6d, 0x00, 0x60, 0x9c, 0xfd, 0x88, 0x34, 0xfe, \n  0xa4, 0xb6, 0xff, 0xe4, 0x03, 0xfe, 0xf2, 0x64, 0x1b, 0x3b, 0xf4, 0x37, 0x70, 0x5e, 0x20, 0xb7, \n  0x0b, 0xf1, 0x51, 0x49, 0xe5, 0xa7, 0xe2, 0xf9, 0xdd, 0x2d, 0x0b, 0xcf, 0xc6, 0x0d, 0x80, 0x3b, \n  0xfe, 0x1d, 0x06, 0xf5, 0x1a, 0x45, 0xfd, 0x95, 0x3f, 0x02, 0x50, 0xef, 0xfb, 0xbd, 0x40, 0xfd, \n  0x78, 0x45, 0x01, 0x1a, 0x2c, 0xff, 0x19, 0x4a, 0xfd, 0xef, 0x17, 0xfe, 0x94, 0xc5, 0xff, 0x20, \n  0x30, 0x00, 0xcc, 0x43, 0x00, 0xf0, 0xc1, 0xfe, 0x64, 0xc1, 0xfe, 0x1e, 0x56, 0xfd, 0x01, 0x46, \n  0xfe, 0x50, 0x43, 0x01, 0xbd, 0xa4, 0x01, 0xf9, 0x3d, 0x01, 0xc2, 0x92, 0xff, 0x0e, 0x90, 0xfd, \n  0x50, 0x30, 0xfe, 0xab, 0xab, 0xfe, 0x3d, 0x51, 0x1f, 0xb8, 0x1b, 0x3c, 0x18, 0xca, 0x1f, 0x06, \n  0xb8, 0xee, 0x58, 0x9a, 0xe2, 0x3a, 0x22, 0xfa, 0x13, 0xad, 0x0d, 0xc9, 0xe9, 0x0d, 0x8b, 0x3c, \n  0xfc, 0xc6, 0xb1, 0xf3, 0x42, 0x0c, 0xfd, 0x1e, 0x0b, 0x03, 0x32, 0x09, 0xfc, 0xed, 0x94, 0xfc, \n  0x98, 0x72, 0x01, 0x20, 0xfa, 0xfe, 0xe6, 0x44, 0xfd, 0x2d, 0xca, 0xfd, 0xe6, 0x07, 0x00, 0x7c, \n  0x26, 0x00, 0x92, 0xbf, 0xff, 0x5f, 0xd9, 0xfe, 0x6c, 0x79, 0xfe, 0x30, 0x5c, 0xfd, 0xd5, 0x9e, \n  0xfd, 0x13, 0xd0, 0x00, 0x7d, 0x2e, 0x02, 0x41, 0x37, 0x01, 0x36, 0xac, 0x00, 0x88, 0x11, 0xff, \n  0x17, 0xa0, 0xfc, 0xae, 0xe7, 0xfd, 0xbd, 0xa6, 0x22, 0x6f, 0x7f, 0x3f, 0xf2, 0x91, 0x1f, 0x01, \n  0x13, 0xee, 0x0c, 0x31, 0xe0, 0x99, 0x93, 0xf9, 0x4a, 0x15, 0x10, 0xb1, 0xa8, 0x0d, 0x78, 0xc1, \n  0xfa, 0x45, 0xbc, 0xf2, 0xd7, 0x38, 0xfc, 0xf5, 0xe1, 0x03, 0xdd, 0x66, 0xfc, 0xd1, 0x9c, 0xfb, \n  0xcd, 0x87, 0x01, 0xb2, 0x09, 0xff, 0x0a, 0x04, 0xfd, 0x8f, 0xe7, 0xfd, 0x8a, 0x21, 0x00, 0x4a, \n  0x36, 0x00, 0xe7, 0x47, 0xff, 0x56, 0xbb, 0xfe, 0x97, 0x4f, 0xfe, 0x5c, 0x6a, 0xfd, 0xb5, 0xad, \n  0xfd, 0x98, 0xd6, 0xff, 0xd4, 0x74, 0x02, 0x98, 0xac, 0x01, 0x7b, 0x85, 0x00, 0xcb, 0xd6, 0x00, \n  0x64, 0x0d, 0xfd, 0x04, 0xed, 0xfb, 0x3b, 0x0d, 0x26, 0x82, 0x8d, 0x42, 0xab, 0x0c, 0x1e, 0x63, \n  0x1c, 0xee, 0x99, 0x0b, 0xdf, 0x05, 0x29, 0xf8, 0xfa, 0x03, 0x12, 0x13, 0x49, 0x0d, 0x7b, 0x22, \n  0xf9, 0xae, 0x1a, 0xf2, 0xd0, 0x40, 0xfb, 0xb7, 0x59, 0x04, 0x49, 0xae, 0xfc, 0x68, 0x9a, 0xfa, \n  0x03, 0x2a, 0x01, 0x6e, 0x27, 0xff, 0x17, 0xc6, 0xfc, 0xf7, 0x0a, 0xfe, 0x0b, 0x2e, 0x00, 0x1f, \n  0x33, 0x00, 0xc6, 0xe4, 0xfe, 0xd2, 0x16, 0xfe, 0x30, 0x60, 0xfe, 0xb8, 0x19, 0xfd, 0xbf, 0x40, \n  0xfe, 0xb6, 0x53, 0xff, 0x25, 0x63, 0x01, 0x51, 0x81, 0x02, 0xd7, 0x4f, 0x00, 0x29, 0x0f, 0x01, \n  0xf3, 0xe4, 0xfe, 0x64, 0xb9, 0xfa, 0x3a, 0x31, 0x2c, 0x72, 0x92, 0x45, 0x5c, 0xed, 0x18, 0xc5, \n  0x3a, 0xed, 0x53, 0x0a, 0xe0, 0x24, 0xc8, 0xf7, 0x24, 0x6d, 0x13, 0x9c, 0xae, 0x0c, 0xee, 0x00, \n  0xf7, 0xec, 0xae, 0xf1, 0x20, 0x58, 0xfb, 0xa1, 0x57, 0x04, 0xdd, 0x8a, 0xfc, 0x9a, 0x33, 0xfa, \n  0xe7, 0xb6, 0x00, 0x72, 0x07, 0xff, 0xc5, 0x0c, 0xfd, 0x80, 0x3b, 0xfe, 0x22, 0x75, 0x00, 0x9c, \n  0x66, 0x00, 0x6c, 0x47, 0xfe, 0xae, 0xbc, 0xfd, 0xb5, 0x54, 0xfe, 0xf4, 0xe5, 0xfc, 0x86, 0xce, \n  0xfe, 0xf6, 0x09, 0x00, 0x9b, 0xe3, 0xff, 0x23, 0x7b, 0x02, 0xd0, 0xeb, 0x00, 0x54, 0x63, 0x00, \n  0x4d, 0x72, 0x00, 0xc5, 0x27, 0xfb, 0xc2, 0x7a, 0x33, 0x14, 0x4c, 0x48, 0x6a, 0xa4, 0x11, 0xee, \n  0xa9, 0xec, 0x51, 0x53, 0xe2, 0xe5, 0x5d, 0xf8, 0x25, 0xa8, 0x13, 0x2a, 0xf2, 0x0b, 0x8d, 0x8d, \n  0xf5, 0xb5, 0xf4, 0xf0, 0x13, 0x21, 0xfc, 0x86, 0xc6, 0x03, 0x2b, 0x9d, 0xfc, 0x73, 0xc3, 0xf9, \n  0x4d, 0x68, 0x00, 0x8f, 0xe3, 0xfe, 0xc3, 0x80, 0xfd, 0xb3, 0x95, 0xfe, 0xa8, 0xa5, 0x00, 0x45, \n  0xe8, 0x00, 0x8c, 0x5e, 0xfd, 0xbb, 0xee, 0xfd, 0x54, 0x0d, 0xfe, 0x5a, 0xfb, 0xfc, 0x92, 0x3c, \n  0xff, 0xad, 0x1f, 0x01, 0x71, 0xd5, 0xfe, 0x83, 0x84, 0x01, 0x7d, 0x98, 0x01, 0x19, 0xde, 0xff, \n  0x98, 0x1f, 0x01, 0xc9, 0x62, 0xfc, 0x13, 0xd6, 0x3a, 0x73, 0x2f, 0x4b, 0x59, 0x0c, 0x09, 0xbb, \n  0xa5, 0xeb, 0xe5, 0x54, 0xe5, 0x50, 0x59, 0xf9, 0x4e, 0xac, 0x12, 0x0b, 0x28, 0x0b, 0xac, 0xc5, \n  0xf4, 0x5a, 0xac, 0xef, 0x69, 0xf5, 0xfc, 0xe9, 0x92, 0x02, 0x7c, 0xe0, 0xfc, 0xdd, 0x55, 0xf9, \n  0x7c, 0xf7, 0xff, 0x73, 0xf5, 0xfe, 0xdb, 0xb4, 0xfd, 0xdd, 0xfe, 0xfe, 0x37, 0x79, 0x00, 0x34, \n  0x66, 0x01, 0x20, 0x5e, 0xfc, 0x48, 0x6e, 0xfe, 0x6b, 0x9a, 0xfd, 0xff, 0x12, 0xfd, 0x1c, 0xb7, \n  0xff, 0xaf, 0x9e, 0x01, 0xbe, 0x46, 0xfe, 0x63, 0xf7, 0xff, 0xf8, 0xca, 0x01, 0xe9, 0xb2, 0xff, \n  0xc6, 0x2d, 0x01, 0x75, 0xae, 0xfd, 0xbb, 0x09, 0x44, 0x21, 0xeb, 0x4c, 0xdb, 0x35, 0xff, 0x0f, \n  0x51, 0xea, 0x94, 0x74, 0xe8, 0x0e, 0xb2, 0xfb, 0xa8, 0x03, 0x11, 0xea, 0x74, 0x0a, 0x4d, 0xeb, \n  0xf3, 0x03, 0x96, 0xee, 0x3c, 0xa7, 0xfd, 0xba, 0x33, 0x01, 0x76, 0x51, 0xfd, 0xf4, 0x4a, 0xf9, \n  0x72, 0xee, 0xff, 0xce, 0xe5, 0xfe, 0xe5, 0x31, 0xfe, 0x6a, 0x0f, 0xff, 0xe4, 0x7c, 0x00, 0x67, \n  0x98, 0x01, 0x37, 0xd7, 0xfb, 0x7c, 0x0b, 0xff, 0x1e, 0x38, 0xfd, 0x11, 0x73, 0xfd, 0xe7, 0x3d, \n  0x00, 0x63, 0x70, 0x01, 0x8d, 0xc0, 0xfd, 0xe6, 0xf2, 0xfe, 0x45, 0x3c, 0x01, 0x3d, 0xe1, 0xff, \n  0xae, 0x7d, 0x01, 0x0f, 0xc0, 0xfe, 0x02, 0x9c, 0x4d, 0x6d, 0x09, 0x4e, 0x3d, 0x83, 0xf5, 0x00, \n  0xce, 0xe8, 0xa9, 0xd7, 0xea, 0xe9, 0x95, 0xfe, 0x5c, 0x64, 0x0f, 0x01, 0xec, 0x09, 0x8e, 0x0b, \n  0xf3, 0xaa, 0x56, 0xed, 0x0d, 0xeb, 0xfd, 0x5f, 0xc5, 0xff, 0x1a, 0x4e, 0xfe, 0xad, 0xd9, 0xf9, \n  0x5b, 0xdd, 0xff, 0x28, 0xf1, 0xfe, 0xa3, 0x9a, 0xfe, 0xe7, 0x99, 0xfe, 0x3d, 0xcc, 0x00, 0x3c, \n  0xc6, 0x01, 0xee, 0xbd, 0xfb, 0xea, 0x88, 0xff, 0x48, 0xf8, 0xfc, 0x31, 0x0d, 0xfe, 0xae, 0x32, \n  0x00, 0x66, 0xb9, 0x00, 0x58, 0x7e, 0xfd, 0xe4, 0x48, 0xfe, 0x55, 0x67, 0x00, 0xcb, 0x78, 0x00, \n  0xe7, 0xea, 0x01, 0x45, 0x6a, 0xff, 0x83, 0xf1, 0x55, 0x1c, 0x58, 0x4f, 0x2b, 0xcb, 0xec, 0x04, \n  0x82, 0xe7, 0x96, 0xc5, 0xeb, 0x29, 0xa0, 0x01, 0x43, 0x47, 0x0e, 0xb8, 0x5e, 0x09, 0x10, 0x2d, \n  0xf2, 0x41, 0xaf, 0xeb, 0x88, 0x0c, 0xfe, 0xea, 0x67, 0xfe, 0x01, 0x79, 0x00, 0xd5, 0x35, 0xfa, \n  0xcc, 0xd4, 0xff, 0x05, 0x31, 0xff, 0x3b, 0x18, 0xfe, 0xa4, 0x62, 0xfe, 0xae, 0x47, 0x01, 0x5f, \n  0x30, 0x02, 0x6f, 0xba, 0xfb, 0x9a, 0xf9, 0xff, 0x2a, 0xb8, 0xfc, 0x4e, 0xfe, 0xfd, 0x77, 0xc3, \n  0xff, 0x69, 0x35, 0x00, 0x91, 0x50, 0xfd, 0x14, 0xf2, 0xfd, 0xb4, 0x1a, 0x00, 0x07, 0xf7, 0x00, \n  0xe2, 0x9c, 0x01, 0x66, 0x79, 0x00, 0x5c, 0x3c, 0x5d, 0x06, 0xc0, 0x50, 0xef, 0x9e, 0xe5, 0x5b, \n  0x10, 0xe6, 0x8a, 0xcb, 0xea, 0x0d, 0xbc, 0x04, 0xad, 0xff, 0x0d, 0x1e, 0x5f, 0x08, 0x71, 0x2e, \n  0xf1, 0x49, 0xd7, 0xe9, 0x2d, 0x56, 0xfe, 0x06, 0xbd, 0xfd, 0x76, 0x4e, 0x03, 0x1b, 0xfe, 0xf9, \n  0xd8, 0x6c, 0x00, 0x78, 0xa7, 0xfe, 0x82, 0x4d, 0xfd, 0x48, 0xff, 0xfe, 0x94, 0x93, 0x01, 0xab, \n  0xe3, 0x02, 0x20, 0xc0, 0xfb, 0x43, 0x45, 0x00, 0x62, 0x4a, 0xfb, 0x66, 0xc2, 0xfd, 0xb2, 0xb5, \n  0xff, 0x5b, 0xa8, 0xff, 0x83, 0x55, 0xfd, 0xd0, 0xbf, 0xfe, 0x44, 0xad, 0xff, 0x4c, 0x8c, 0x00, \n  0xce, 0xf4, 0x01, 0x1a, 0x30, 0x01, 0x0f, 0x55, 0x63, 0xde, 0xe4, 0x51, 0x41, 0x99, 0xe0, 0x1c, \n  0x4b, 0xe4, 0xbf, 0x52, 0xe8, 0xff, 0x52, 0x07, 0x52, 0x6e, 0x0e, 0x51, 0xe5, 0x06, 0x7b, 0xcd, \n  0xef, 0x85, 0xf3, 0xe8, 0x09, 0x2d, 0xff, 0xf3, 0x59, 0xfd, 0xa3, 0x37, 0x06, 0x81, 0xc1, 0xf9, \n  0xad, 0x77, 0x00, 0xb9, 0xdd, 0xfd, 0x7b, 0x5c, 0xfd, 0x69, 0xe4, 0xff, 0xed, 0x8b, 0x01, 0x85, \n  0xd7, 0x03, 0x0e, 0x7e, 0xfb, 0x1f, 0xf6, 0xfe, 0x7e, 0x06, 0xfa, 0xc1, 0x3c, 0xfe, 0xaa, 0x33, \n  0xff, 0xb1, 0xfd, 0xff, 0x81, 0x20, 0xfe, 0xf1, 0x1e, 0xff, 0x5e, 0xdf, 0xfe, 0x7c, 0xc7, 0x00, \n  0x15, 0xe8, 0x01, 0x1b, 0xbb, 0x00, 0xd0, 0x2f, 0x68, 0xb1, 0x09, 0x52, 0xc7, 0x93, 0xdd, 0x98, \n  0x1d, 0xe3, 0x01, 0xd1, 0xe4, 0xb5, 0xe2, 0x08, 0x12, 0x7a, 0x0f, 0xd6, 0x93, 0x04, 0xca, 0xb9, \n  0xee, 0x55, 0x8e, 0xea, 0x66, 0xff, 0xfe, 0xd4, 0xaa, 0xfd, 0xbc, 0xd2, 0x08, 0xcb, 0xe3, 0xf8, \n  0xcc, 0x09, 0x00, 0x15, 0x1e, 0xfe, 0xfb, 0x14, 0xfe, 0xdc, 0x5b, 0x00, 0x32, 0xb2, 0x01, 0x70, \n  0x80, 0x03, 0x17, 0x29, 0xfa, 0x3a, 0x42, 0xfe, 0x83, 0x80, 0xf9, 0xf9, 0x38, 0xfe, 0xf1, 0x23, \n  0x00, 0x29, 0xaf, 0x00, 0x29, 0x01, 0xfe, 0xfd, 0x6c, 0xff, 0xd1, 0x1b, 0xff, 0x8f, 0xef, 0xff, \n  0x28, 0x5f, 0x01, 0x03, 0x5f, 0x01, 0xd1, 0x71, 0x6a, 0x70, 0x53, 0x52, 0x5d, 0xc9, 0xdb, 0x57, \n  0xaa, 0xe3, 0x05, 0x10, 0xe0, 0x83, 0x7f, 0x09, 0xac, 0xdf, 0x10, 0x9d, 0xbd, 0x01, 0xa5, 0xe7, \n  0xef, 0x63, 0x39, 0xec, 0x97, 0xeb, 0xfe, 0x84, 0x31, 0xfe, 0x79, 0x40, 0x0a, 0xfe, 0xaf, 0xf7, \n  0x45, 0xff, 0xff, 0xac, 0xc0, 0xff, 0x3f, 0x2c, 0xfe, 0x58, 0xa7, 0x00, 0x00, 0xd2, 0xff, 0xb6, \n  0x93, 0x02, 0x96, 0x27, 0xfa, 0x07, 0xbf, 0xfd, 0x93, 0x43, 0xf9, 0x36, 0x9d, 0xff, 0x18, 0x2c, \n  0x01, 0x2b, 0xe7, 0xff, 0x76, 0xd5, 0xfe, 0x41, 0xb8, 0xff, 0x94, 0x64, 0xfe, 0xb5, 0x51, 0xff, \n  0x39, 0xb1, 0x01, 0x85, 0x2f, 0x01, 0x81, 0xfe, 0x6c, 0x95, 0x8a, 0x4f, 0xe4, 0x3e, 0xdd, 0x4c, \n  0xd1, 0xe3, 0x1b, 0x48, 0xd9, 0x57, 0x6f, 0x09, 0x76, 0x66, 0x12, 0x4b, 0x8d, 0x01, 0x90, 0x69, \n  0xf0, 0xf7, 0xec, 0xee, 0x53, 0x11, 0xfe, 0xa8, 0x0f, 0xfe, 0x1e, 0x2a, 0x0b, 0x71, 0x2f, 0xf7, \n  0xc5, 0x6c, 0x01, 0x0c, 0xd4, 0x00, 0xdc, 0x59, 0xfd, 0xd8, 0xa7, 0xfe, 0x71, 0x24, 0xff, 0x18, \n  0x2c, 0x02, 0x21, 0x7c, 0xfa, 0xce, 0xea, 0xfd, 0xd1, 0x01, 0xfa, 0x79, 0x3e, 0x00, 0x58, 0xe8, \n  0x00, 0x7c, 0x0d, 0x00, 0xa3, 0x15, 0xff, 0xe5, 0x7b, 0xff, 0x9d, 0x6f, 0xfe, 0xe0, 0xf3, 0xfe, \n  0xef, 0x9c, 0x01, 0x70, 0x0c, 0x01, 0x11, 0xda, 0x6b, 0x90, 0x49, 0x4e, 0xd3, 0xb4, 0xdf, 0xa3, \n  0xb1, 0xe4, 0x3d, 0xb2, 0xd1, 0xd3, 0x2b, 0x08, 0x2b, 0x67, 0x16, 0xb5, 0xdb, 0x00, 0x46, 0x9e, \n  0xf1, 0xe1, 0xd4, 0xf1, 0xde, 0x4c, 0xfc, 0x7b, 0x0d, 0xfd, 0xb9, 0x2c, 0x0d, 0x5e, 0x9a, 0xf7, \n  0x9c, 0xf3, 0x01, 0x0d, 0x85, 0x00, 0x74, 0x6d, 0xfa, 0x9c, 0xfe, 0xfe, 0x18, 0xb8, 0xfe, 0xd6, \n  0xcb, 0x01, 0x85, 0xf9, 0xfb, 0x3d, 0x82, 0xfe, 0x80, 0xe1, 0xf9, 0xc9, 0x69, 0x00, 0xb3, 0xd7, \n  0x00, 0x7b, 0xa7, 0xff, 0x48, 0x95, 0xff, 0x2a, 0x4a, 0xff, 0xaa, 0x8c, 0xfe, 0xbe, 0x6e, 0xfe, \n  0xa7, 0xf7, 0x01, 0x8e, 0xb0, 0x00, 0xbb, 0xe6, 0x6b, 0x3f, 0x45, 0x48, 0xd2, 0x77, 0xe3, 0x04, \n  0x98, 0xe5, 0x46, 0x0e, 0xcb, 0x21, 0x01, 0x0a, 0x00, 0x56, 0x18, 0xa4, 0x8d, 0x00, 0x3a, 0x1d, \n  0xf3, 0x23, 0x5c, 0xf4, 0x8a, 0xa3, 0xf9, 0x24, 0x6f, 0xfe, 0xb8, 0xb4, 0x0e, 0x99, 0x64, 0xf6, \n  0x61, 0x03, 0x02, 0xc5, 0x4f, 0xfe, 0x68, 0x11, 0xfa, 0x12, 0x05, 0x00, 0x1a, 0x27, 0xfe, 0x4a, \n  0x58, 0x02, 0xa3, 0xb1, 0xfd, 0xb0, 0xd0, 0xfd, 0x8e, 0xfd, 0xf9, 0x0f, 0xa2, 0x00, 0x73, 0x6e, \n  0x00, 0x90, 0xa4, 0xff, 0xc1, 0xa4, 0xff, 0x87, 0x60, 0xff, 0x88, 0x98, 0xfe, 0xfc, 0x56, 0xfe, \n  0xcd, 0x46, 0x02, 0x50, 0xf7, 0xff, 0x9c, 0x59, 0x68, 0xa9, 0xa4, 0x43, 0xc1, 0x7c, 0xe7, 0x7c, \n  0x5b, 0xe7, 0xc3, 0xec, 0xc7, 0x08, 0x18, 0x0a, 0xb4, 0x71, 0x19, 0x72, 0xab, 0x01, 0xc0, 0xcb, \n  0xf3, 0xb7, 0x64, 0xf6, 0x67, 0x2b, 0xf9, 0xdf, 0xb2, 0xfe, 0x3d, 0xa8, 0x0e, 0x43, 0x36, 0xf5, \n  0xb3, 0xb1, 0x00, 0xda, 0x74, 0xfe, 0x56, 0xbd, 0xfa, 0x7b, 0x3b, 0x00, 0x11, 0x04, 0xff, 0xd7, \n  0xb9, 0x02, 0x72, 0x0a, 0xfe, 0xaa, 0x56, 0xfd, 0xfe, 0x97, 0xfa, 0x8d, 0xd3, 0x00, 0x69, 0x8b, \n  0xff, 0x9b, 0xce, 0xff, 0xf1, 0xea, 0xff, 0x62, 0x75, 0xff, 0xc5, 0xda, 0xfe, 0x81, 0x24, 0xfe, \n  0x46, 0x75, 0x02, 0x41, 0xe0, 0xff, 0x27, 0xc2, 0x60, 0x79, 0x90, 0x3f, 0xe8, 0x0a, 0xec, 0xa6, \n  0x61, 0xeb, 0xe9, 0xc8, 0xc7, 0x47, 0x1e, 0x08, 0xa2, 0x1a, 0x1a, 0xa8, 0xe7, 0x01, 0xf0, 0xc9, \n  0xf5, 0xf5, 0x8b, 0xf8, 0x04, 0xa1, 0xf7, 0xe9, 0x93, 0xfe, 0xcc, 0xa7, 0x0d, 0xdd, 0xb5, 0xf3, \n  0x47, 0x31, 0x01, 0x8b, 0x22, 0xff, 0xee, 0x77, 0xfa, 0x7a, 0x3f, 0x02, 0xfe, 0xd7, 0xfe, 0xf0, \n  0xf2, 0x01, 0x7c, 0x7e, 0xfe, 0x8f, 0x79, 0xfd, 0x3b, 0x7f, 0xfb, 0xb3, 0xa5, 0xff, 0xc0, 0x91, \n  0xff, 0x5d, 0x04, 0x00, 0x2b, 0xee, 0xff, 0xf1, 0xa9, 0xff, 0x21, 0xbc, 0xfe, 0xe8, 0x3e, 0xfe, \n  0x61, 0xcb, 0x02, 0xe8, 0x50, 0xff, 0x67, 0x0f, 0x58, 0xa4, 0x5d, 0x39, 0x1d, 0x08, 0xf3, 0xa0, \n  0xbb, 0xef, 0x0a, 0x1e, 0xca, 0x79, 0x95, 0x05, 0x24, 0xb2, 0x17, 0x7c, 0xa7, 0x04, 0x69, 0xb5, \n  0xf7, 0xb6, 0xa0, 0xf8, 0xb5, 0x3e, 0xf7, 0xa3, 0x07, 0xfe, 0x16, 0x57, 0x0b, 0x63, 0xfa, 0xf4, \n  0x79, 0x62, 0x01, 0xda, 0xef, 0xfe, 0x29, 0x8a, 0xfc, 0xab, 0x82, 0x02, 0x93, 0xfb, 0xfd, 0x54, \n  0x83, 0x01, 0x56, 0x9e, 0xff, 0x17, 0x67, 0xfd, 0x55, 0x62, 0xfb, 0x53, 0xbb, 0xff, 0x61, 0x6f, \n  0xff, 0x8a, 0xf3, 0xff, 0xe3, 0x16, 0x00, 0x8f, 0x86, 0xff, 0x9e, 0x16, 0xff, 0x84, 0x75, 0xfe, \n  0x82, 0x74, 0x02, 0x0b, 0x6e, 0xff, 0x6d, 0xb8, 0x4d, 0x35, 0x84, 0x33, 0xc7, 0x76, 0xfa, 0xe6, \n  0xa0, 0xf4, 0xcf, 0x60, 0xce, 0xfd, 0x9e, 0x01, 0xfc, 0x61, 0x16, 0x31, 0x9a, 0x06, 0x7f, 0xdf, \n  0xf7, 0x1e, 0x38, 0xfa, 0x35, 0x29, 0xf6, 0xc8, 0x75, 0xfd, 0x74, 0xc6, 0x0a, 0xf4, 0x90, 0xf5, \n  0x6f, 0x86, 0x01, 0xe1, 0x29, 0x00, 0x95, 0x72, 0xfd, 0xb7, 0xd8, 0x01, 0xd3, 0x9c, 0xfd, 0x9d, \n  0x20, 0x02, 0x54, 0xc7, 0xff, 0xbe, 0xc8, 0xfc, 0xb4, 0xb5, 0xfc, 0x1d, 0x87, 0xff, 0x26, 0x17, \n  0xff, 0xc9, 0x21, 0x00, 0x3e, 0xf6, 0xff, 0x7e, 0xc5, 0xff, 0x4c, 0x32, 0xff, 0x0c, 0x63, 0xfe, \n  0x2c, 0xdf, 0x02, 0x1f, 0xcd, 0xff, 0x01, 0xc5, 0x3d, 0x01, 0xcf, 0x27, 0x88, 0x16, 0xf3, 0x18, \n  0x07, 0xfb, 0x90, 0x42, 0xef, 0x3e, 0x13, 0x0d, 0x93, 0xbb, 0x07, 0xa7, 0xc3, 0xf7, 0xd2, 0x5d, \n  0xf8, 0xae, 0xc8, 0x00, 0xc2, 0xdd, 0x00, 0xac, 0xc7, 0xfe, 0x98, 0x48, 0x05, 0x06, 0x72, 0xf7, \n  0x2a, 0x37, 0x00, 0x54, 0x8e, 0xff, 0x3d, 0x99, 0xfb, 0x24, 0x94, 0x00, 0x8e, 0x4f, 0xfe, 0xb5, \n  0x39, 0x00, 0x96, 0x74, 0xff, 0x3a, 0xf9, 0xfd, 0x89, 0x66, 0xfd, 0x82, 0x22, 0x03, 0x5a, 0xae, \n  0xff, 0xd8, 0x0e, 0x00, 0xb5, 0x77, 0x00, 0xcb, 0x60, 0xfd, 0x70, 0xbc, 0xff, 0xcb, 0x1c, 0xfe, \n  0x2a, 0x03, 0xff, 0xc1, 0x18, 0x00, 0xf4, 0xe2, 0x34, 0xc1, 0x02, 0x27, 0xe2, 0x7f, 0xf8, 0xa5, \n  0xc3, 0xfa, 0xd6, 0x26, 0xf0, 0x93, 0x6a, 0x0a, 0x77, 0x39, 0x09, 0x72, 0x6e, 0xfa, 0xb5, 0x06, \n  0xf9, 0xa3, 0x02, 0x00, 0x08, 0xcd, 0xff, 0x1c, 0xce, 0xfe, 0x8d, 0xa8, 0x04, 0xb4, 0xeb, 0xf8, \n  0xcc, 0xde, 0xff, 0x3f, 0x21, 0x00, 0xa2, 0xa0, 0xfc, 0x1c, 0x3c, 0x00, 0x36, 0x03, 0xff, 0x68, \n  0x42, 0x00, 0x0d, 0x75, 0xff, 0x39, 0x1e, 0xfe, 0xcd, 0x41, 0xfd, 0xd5, 0x77, 0x02, 0xd5, 0x1f, \n  0x00, 0x2c, 0x0f, 0x00, 0x11, 0xfe, 0x00, 0x17, 0x13, 0xfe, 0x29, 0x7f, 0xff, 0x44, 0x78, 0xfe, \n  0x57, 0x04, 0xff, 0xec, 0xbc, 0xff, 0x72, 0x77, 0x2d, 0x18, 0x67, 0x25, 0xa7, 0x4a, 0xfd, 0x77, \n  0x04, 0xfb, 0xea, 0xd7, 0xf1, 0x50, 0x51, 0x08, 0xa1, 0xac, 0x09, 0x92, 0x82, 0xfc, 0xdf, 0x39, \n  0xfa, 0xa5, 0x54, 0xff, 0xd5, 0x2e, 0xff, 0x1e, 0x57, 0xff, 0x6a, 0xe9, 0x03, 0x92, 0x7b, 0xfa, \n  0x6b, 0xda, 0xff, 0x53, 0xae, 0x00, 0x5f, 0x99, 0xfd, 0xc3, 0x32, 0x00, 0x8b, 0xb5, 0xff, 0x1d, \n  0x60, 0x00, 0x7f, 0xa2, 0xff, 0x2b, 0x7a, 0xfe, 0x96, 0x89, 0xfd, 0xbb, 0xf6, 0x01, 0xb7, 0xb8, \n  0x00, 0xed, 0x3a, 0x00, 0x13, 0x08, 0x01, 0x09, 0x9b, 0xfe, 0x41, 0x69, 0xff, 0xdf, 0xd7, 0xfe, \n  0x53, 0xea, 0xfe, 0xd1, 0xa0, 0xff, 0x4e, 0x81, 0x27, 0xe3, 0x00, 0x24, 0x60, 0x59, 0x00, 0xc7, \n  0x53, 0xfb, 0x8c, 0xa3, 0xf3, 0x75, 0xd5, 0x06, 0x2e, 0x99, 0x09, 0xc8, 0x3b, 0xfe, 0xf3, 0x73, \n  0xfb, 0x56, 0xd7, 0xfe, 0x29, 0x2c, 0xff, 0xdb, 0xb4, 0xff, 0x73, 0x3a, 0x03, 0x5b, 0xd6, 0xfb, \n  0x09, 0x35, 0x00, 0x42, 0x0e, 0x01, 0xa8, 0x5f, 0xfe, 0xb8, 0x4d, 0x00, 0x86, 0x46, 0x00, 0xef, \n  0xa3, 0x00, 0x2e, 0xc1, 0xff, 0xa3, 0x15, 0xff, 0x97, 0x10, 0xfe, 0x3b, 0x8d, 0x01, 0x4c, 0xf4, \n  0x00, 0x62, 0x3e, 0x00, 0xae, 0xe3, 0x00, 0x37, 0x03, 0xff, 0xae, 0x66, 0xff, 0x91, 0x01, 0xff, \n  0xa1, 0x23, 0xff, 0x24, 0x9e, 0xff, 0x15, 0x0c, 0x23, 0x6f, 0xb2, 0x22, 0xb2, 0xff, 0x01, 0xdd, \n  0x3e, 0xfb, 0xe0, 0x5e, 0xf5, 0x63, 0xbd, 0x05, 0xb1, 0x0f, 0x09, 0x0e, 0x7a, 0xff, 0x93, 0x67, \n  0xfc, 0xdb, 0xb0, 0xfe, 0x27, 0x49, 0xff, 0xbc, 0xbd, 0xff, 0x7e, 0xa7, 0x02, 0x46, 0x03, 0xfd, \n  0xe4, 0x7e, 0x00, 0xd7, 0x1a, 0x01, 0x57, 0xf5, 0xfe, 0x97, 0x61, 0x00, 0xaa, 0x8d, 0x00, 0xe9, \n  0xe7, 0x00, 0xf3, 0xe8, 0xff, 0xc5, 0x86, 0xff, 0xbb, 0x53, 0xfe, 0x40, 0xdc, 0x00, 0x24, 0xe3, \n  0x00, 0x25, 0x2d, 0x00, 0x64, 0x69, 0x00, 0xe6, 0x35, 0xff, 0x02, 0x70, 0xff, 0xf5, 0x39, 0xff, \n  0x47, 0x25, 0xff, 0xe7, 0x1f, 0xff, 0xf6, 0xcf, 0x1f, 0x50, 0x75, 0x21, 0x3f, 0xd4, 0x02, 0xdd, \n  0x2f, 0xfb, 0x57, 0x12, 0xf7, 0x95, 0xef, 0x04, 0x8a, 0x68, 0x08, 0xf2, 0x87, 0x00, 0x4f, 0x2e, \n  0xfd, 0x46, 0xe1, 0xfe, 0xf2, 0x71, 0xff, 0x04, 0xcd, 0xff, 0x20, 0x81, 0x02, 0xa5, 0xd8, 0xfd, \n  0x19, 0xc2, 0x00, 0x7a, 0x2d, 0x01, 0xac, 0x67, 0xff, 0xcb, 0x74, 0x00, 0xd8, 0xdd, 0x00, 0x1f, \n  0x18, 0x01, 0xa2, 0xd3, 0xff, 0xf1, 0xc2, 0xff, 0xfb, 0x77, 0xfe, 0x16, 0x2a, 0x00, 0xdf, 0xb2, \n  0x00, 0xfd, 0x0f, 0x00, 0x59, 0x0f, 0x00, 0xdb, 0x91, 0xff, 0x64, 0x84, 0xff, 0x61, 0x25, 0xff, \n  0x7d, 0x19, 0xff, 0xa0, 0x3a, 0xff, 0x70, 0x5e, 0x1d, 0xec, 0xaf, 0x20, 0xaa, 0x33, 0x03, 0x00, \n  0x26, 0xfb, 0x5f, 0x88, 0xf8, 0x8f, 0x5b, 0x04, 0x2c, 0xeb, 0x07, 0xfc, 0x7b, 0x01, 0x06, 0xb3, \n  0xfd, 0xba, 0x4c, 0xff, 0xe9, 0x00, 0x00, 0xe8, 0xab, 0xff, 0x03, 0xad, 0x02, 0x18, 0x7a, 0xfe, \n  0x7a, 0xd7, 0x00, 0x23, 0x67, 0x01, 0xca, 0xc4, 0xff, 0x45, 0x7d, 0x00, 0x89, 0xd6, 0x00, 0xab, \n  0x4c, 0x01, 0xe4, 0xab, 0xff, 0x31, 0xb9, 0xff, 0xb5, 0xb7, 0xfe, 0xec, 0x87, 0xff, 0x97, 0x7d, \n  0x00, 0x0f, 0x60, 0x00, 0x67, 0xde, 0xff, 0xe2, 0xbb, 0xff, 0xae, 0x8a, 0xff, 0xd8, 0x5d, 0xff, \n  0xa9, 0x3b, 0xff, 0xb3, 0xcc, 0xfe, 0xd9, 0xe2, 0x1b, 0xf5, 0x0e, 0x20, 0xb6, 0x34, 0x03, 0xa2, \n  0xfb, 0xfa, 0x7a, 0xd9, 0xf9, 0x75, 0x27, 0x04, 0x03, 0x6f, 0x07, 0x89, 0x20, 0x02, 0x56, 0xf7, \n  0xfd, 0x70, 0xaa, 0xff, 0x91, 0xee, 0x00, 0x6b, 0x50, 0xff, 0x14, 0xa6, 0x02, 0xe4, 0x35, 0xff, \n  0x36, 0x8f, 0x00, 0x44, 0x98, 0x01, 0x73, 0xeb, 0xff, 0x28, 0x20, 0x00, 0x2a, 0xc2, 0x00, 0xfd, \n  0x5b, 0x01, 0x8e, 0x95, 0xff, 0xa6, 0x58, 0xff, 0xf2, 0xdd, 0xfe, 0xf8, 0x7a, 0xff, 0x1f, 0x29, \n  0x00, 0xcc, 0x92, 0x00, 0x86, 0xc1, 0xff, 0xb1, 0xaf, 0xff, 0x56, 0xf2, 0xff, 0x32, 0x1d, 0xff, \n  0xca, 0x76, 0xff, 0xd4, 0x37, 0x00, 0x64, 0x6c, 0x1a, 0x63, 0x0a, 0x20, 0x0a, 0x6c, 0x03, 0xb5, \n  0xee, 0xfa, 0x18, 0x04, 0xfb, 0xeb, 0x1a, 0x04, 0xd0, 0x0e, 0x07, 0x87, 0x4c, 0x02, 0x79, 0x69, \n  0xfe, 0x87, 0x83, 0xff, 0x14, 0xe8, 0x01, 0x95, 0x94, 0xff, 0x6f, 0xbf, 0x01, 0x4f, 0x1f, 0x00, \n  0xbf, 0x7d, 0x00, 0x4a, 0xe0, 0x00, 0xb4, 0x44, 0x00, 0x5f, 0x06, 0x00, 0xdc, 0x49, 0x00, 0xbd, \n  0x53, 0x01, 0x65, 0xcc, 0xff, 0x1c, 0x0d, 0xff, 0xd0, 0xc0, 0xfe, 0x56, 0xff, 0xff, 0x00, 0xbd, \n  0xff, 0x90, 0x4a, 0x00, 0x6d, 0x38, 0x00, 0x55, 0xb0, 0xff, 0x42, 0xa2, 0xff, 0x42, 0x31, 0x00, \n  0x09, 0x57, 0x00, 0x00, 0x2f, 0xff, 0xbd, 0xd8, 0x19, 0x49, 0xba, 0x1f, 0x97, 0xb7, 0x03, 0x9a, \n  0xf9, 0xfa, 0x54, 0x03, 0xfc, 0x4f, 0x5d, 0x04, 0x14, 0xb4, 0x06, 0xa4, 0x14, 0x02, 0x67, 0x4c, \n  0xfe, 0x9b, 0xbf, 0xff, 0x46, 0xe1, 0x01, 0xc6, 0x2f, 0x00, 0xb8, 0x8b, 0x01, 0x3f, 0x9f, 0xff, \n  0x6a, 0x12, 0x01, 0x9d, 0x68, 0x00, 0x6e, 0xa4, 0xff, 0xb0, 0x74, 0x00, 0x45, 0x24, 0x00, 0xb2, \n  0xbb, 0x00, 0xfe, 0xeb, 0xff, 0x22, 0x98, 0xff, 0x2d, 0x76, 0xfe, 0x12, 0xaa, 0xff, 0xc6, 0xf6, \n  0xff, 0x09, 0x38, 0x00, 0xf2, 0x01, 0x00, 0xdb, 0x80, 0xff, 0x27, 0xf8, 0x00, 0xd9, 0x9c, 0x00, \n  0x7c, 0x47, 0xff, 0xd0, 0x6d, 0xff, 0xa6, 0x6d, 0x19, 0x52, 0x0f, 0x20, 0xef, 0xea, 0x03, 0x64, \n  0xed, 0xfa, 0xf2, 0xca, 0xfc, 0xe1, 0x9b, 0x04, 0x75, 0x73, 0x06, 0x50, 0xce, 0x01, 0x4e, 0xcf, \n  0xfd, 0xb9, 0x6d, 0xff, 0xb1, 0xfe, 0x01, 0xb3, 0xd3, 0xff, 0xfd, 0xcb, 0x01, 0xbd, 0xd4, 0xff, \n  0x1d, 0x54, 0x00, 0xa0, 0xc7, 0x00, 0xe3, 0x56, 0xff, 0x2e, 0xb3, 0xff, 0x72, 0x9b, 0x00, 0x17, \n  0x91, 0x00, 0x38, 0x6c, 0xff, 0x50, 0xec, 0xff, 0x8a, 0xde, 0xfe, 0x92, 0xdc, 0xfe, 0x3a, 0xc4, \n  0xff, 0x09, 0xa6, 0x00, 0xe7, 0x2d, 0xff, 0x16, 0x5b, 0x00, 0x0a, 0xc9, 0x01, 0x83, 0x6f, 0xff, \n  0xba, 0x9d, 0xff, 0x6c, 0x52, 0xff, 0x18, 0xb8, 0x19, 0x4c, 0xc5, 0x20, 0x0d, 0xd4, 0x03, 0x4e, \n  0x8f, 0xfa, 0x75, 0x8b, 0xfd, 0x6f, 0x52, 0x05, 0xd0, 0x8e, 0x06, 0xe3, 0x76, 0x01, 0x81, 0x88, \n  0xfd, 0x2f, 0xde, 0xfe, 0xcd, 0xaf, 0x01, 0xa5, 0xe0, 0xff, 0xa8, 0x5a, 0x01, 0x28, 0x3d, 0x00, \n  0xba, 0xea, 0x00, 0xb9, 0x54, 0x00, 0xec, 0x55, 0xff, 0x42, 0x09, 0x00, 0xed, 0xed, 0xff, 0xe1, \n  0xbc, 0x00, 0x76, 0xed, 0xff, 0x9e, 0x97, 0xff, 0x77, 0xde, 0xfe, 0x8a, 0x31, 0xff, 0x6a, 0xe5, \n  0xff, 0xab, 0xad, 0xff, 0x91, 0xc5, 0xff, 0x86, 0xba, 0x01, 0xc9, 0x78, 0x00, 0xb1, 0x7a, 0xff, \n  0xad, 0x64, 0x00, 0x5f, 0xb8, 0xfe, 0x21, 0x49, 0x1a, 0xf3, 0xe1, 0x21, 0xd5, 0xad, 0x03, 0x1b, \n  0x6f, 0xf9, 0x2a, 0xee, 0xfd, 0x87, 0xfa, 0x05, 0xc1, 0xd6, 0x06, 0x2a, 0x63, 0x01, 0x3f, 0xa3, \n  0xfc, 0xc6, 0x5e, 0xfe, 0x39, 0x82, 0x01, 0x9f, 0x0c, 0xff, 0x7c, 0xd7, 0x00, 0x9c, 0x3b, 0x00, \n  0xba, 0xcc, 0x00, 0xed, 0xd1, 0x00, 0x53, 0x40, 0xff, 0xaf, 0x81, 0xff, 0xb1, 0x48, 0x00, 0x89, \n  0x41, 0x00, 0x2d, 0x69, 0xff, 0x76, 0x17, 0x00, 0xdf, 0x7b, 0xfe, 0xf3, 0x16, 0xff, 0x6b, 0x24, \n  0x00, 0x2c, 0x2c, 0xff, 0x40, 0x22, 0x00, 0xf0, 0xb1, 0x01, 0xf1, 0xb1, 0xff, 0x45, 0xbf, 0xff, \n  0xf6, 0x03, 0x00, 0x0f, 0xc8, 0xfe, 0x66, 0xed, 0x1a, 0x0c, 0x92, 0x23, 0x98, 0xbc, 0x03, 0x00, \n  0x38, 0xf8, 0xae, 0x0c, 0xfe, 0xe4, 0x93, 0x06, 0xc5, 0x3a, 0x07, 0x80, 0x78, 0x01, 0x5a, 0x27, \n  0xfc, 0xa0, 0xb4, 0xfd, 0x99, 0x8a, 0x01, 0x20, 0xcc, 0xfe, 0x82, 0xf1, 0xff, 0xcf, 0xd4, 0xff, \n  0x0a, 0xf0, 0x00, 0x77, 0xac, 0x00, 0x68, 0x51, 0xff, 0xad, 0x0d, 0x00, 0x82, 0x0e, 0x00, 0xa1, \n  0x32, 0x00, 0x47, 0x68, 0xff, 0xf3, 0x82, 0xff, 0xa9, 0x50, 0xfe, 0xad, 0x98, 0xff, 0xda, 0x2d, \n  0x00, 0xbd, 0xe8, 0xfe, 0x65, 0xa7, 0x00, 0xd9, 0x95, 0x01, 0xad, 0xe8, 0xfe, 0x7a, 0xb6, 0xff, \n  0xbc, 0x03, 0x00, 0x7b, 0xca, 0xfe, 0x09, 0xea, 0x1b, 0x3d, 0xac, 0x25, 0x9e, 0xaf, 0x03, 0xb7, \n  0xa0, 0xf6, 0x2a, 0x4f, 0xfe, 0xab, 0x37, 0x07, 0xa9, 0x94, 0x07, 0xa7, 0x95, 0x01, 0x3d, 0x72, \n  0xfb, 0x83, 0xa1, 0xfd, 0x31, 0xba, 0x01, 0x96, 0x66, 0xfe, 0xcb, 0x72, 0xff, 0xdf, 0x86, 0xff, \n  0x54, 0x8c, 0x00, 0x53, 0x7c, 0x00, 0xa2, 0x22, 0xff, 0x08, 0xea, 0xff, 0x79, 0xa2, 0x00, 0xe8, \n  0x72, 0x00, 0xc4, 0x0b, 0xff, 0x23, 0x86, 0xff, 0x2e, 0x14, 0xfe, 0xf2, 0x2d, 0xff, 0xa6, 0xab, \n  0x00, 0x02, 0x4a, 0xff, 0xf3, 0x65, 0x00, 0x45, 0xd2, 0x01, 0x6e, 0xcf, 0xfe, 0xfd, 0x43, 0xff, \n  0xa1, 0x9a, 0xff, 0xd6, 0xea, 0xfe, 0xb7, 0x97, 0x1d, 0x12, 0xb8, 0x27, 0x1b, 0x35, 0x03, 0x9b, \n  0x11, 0xf5, 0xe1, 0x85, 0xfe, 0x8d, 0x0e, 0x08, 0xe4, 0xa6, 0x07, 0xc4, 0x41, 0x01, 0x83, 0x9d, \n  0xfa, 0x7e, 0x8f, 0xfd, 0x85, 0x58, 0x02, 0x4d, 0x1c, 0xfe, 0x63, 0xd2, 0xfe, 0x87, 0x08, 0xff, \n  0x52, 0x8b, 0x00, 0x4f, 0x1e, 0x00, 0x83, 0x69, 0xfe, 0x97, 0xbd, 0xff, 0x9d, 0xa3, 0x00, 0x39, \n  0x76, 0x00, 0x07, 0x32, 0xff, 0x76, 0x8d, 0xff, 0x4f, 0xd7, 0xfd, 0x44, 0x26, 0xff, 0xdd, 0x9e, \n  0x00, 0xd0, 0x1f, 0xff, 0x11, 0x32, 0x00, 0x49, 0x4d, 0x02, 0x10, 0x10, 0xff, 0x91, 0x6f, 0xfe, \n  0x9a, 0x81, 0xff, 0xd9, 0xc9, 0xfe, 0x72, 0xa0, 0x1f, 0x85, 0x0b, 0x2a, 0x7d, 0x48, 0x02, 0xb7, \n  0x3f, 0xf3, 0xc8, 0xd5, 0xfe, 0xfa, 0xec, 0x08, 0x32, 0xa1, 0x07, 0x12, 0x93, 0x00, 0xaf, 0xa2, \n  0xf9, 0xf9, 0x5b, 0xfd, 0x6c, 0x0d, 0x03, 0xd9, 0xdf, 0xfd, 0x47, 0x12, 0xfe, 0xd1, 0xb2, 0xfe, \n  0xc6, 0x36, 0x00, 0x39, 0xb6, 0xff, 0x72, 0xfc, 0xfd, 0xab, 0x17, 0xff, 0xa1, 0x55, 0x00, 0x3f, \n  0x3e, 0x00, 0x88, 0xc1, 0xfe, 0x2c, 0xbb, 0xff, 0x16, 0x1a, 0xfe, 0x2b, 0xfb, 0xfe, 0x7e, 0x9a, \n  0x00, 0xdd, 0x5e, 0xff, 0xb9, 0xeb, 0xfe, 0x78, 0x14, 0x02, 0x27, 0x78, 0x00, 0xfe, 0xc3, 0xfd, \n  0x09, 0xd8, 0xfe, 0x8a, 0xe0, 0xfe, 0x54, 0x94, 0x22, 0xb5, 0xaa, 0x2c, 0xf9, 0xf1, 0x00, 0x26, \n  0x8d, 0xf1, 0xcb, 0x7a, 0xff, 0x1d, 0x43, 0x0a, 0xaa, 0x92, 0x07, 0x15, 0xc2, 0xff, 0xb2, 0x9f, \n  0xf8, 0x6e, 0xb3, 0xfd, 0xf0, 0x00, 0x04, 0x1b, 0xe2, 0xfd, 0x01, 0x7a, 0xfd, 0x86, 0x77, 0xfe, \n  0x41, 0x81, 0x00, 0x35, 0x61, 0xff, 0x8b, 0x79, 0xfd, 0xfe, 0x31, 0xff, 0xf3, 0x26, 0x00, 0xf0, \n  0xbc, 0xff, 0x53, 0xa1, 0xfe, 0xa0, 0x82, 0xff, 0x2a, 0xb0, 0xfe, 0xde, 0x90, 0xff, 0x44, 0x72, \n  0x00, 0x9a, 0xee, 0xff, 0xbd, 0x77, 0xfe, 0xc9, 0xf4, 0x00, 0x22, 0x7e, 0x01, 0x59, 0x7c, 0xfe, \n  0x92, 0x21, 0xfe, 0xfd, 0x1a, 0xff, 0x22, 0xe3, 0x25, 0xe2, 0x12, 0x2f, 0x22, 0x65, 0xff, 0xa9, \n  0xe8, 0xef, 0xf4, 0xf9, 0xff, 0x68, 0x98, 0x0b, 0x54, 0x3e, 0x07, 0xe7, 0xac, 0xfe, 0x69, 0x47, \n  0xf7, 0x67, 0x15, 0xfe, 0xdd, 0xea, 0x04, 0x15, 0xd0, 0xfd, 0xed, 0xc1, 0xfc, 0x8c, 0x03, 0xfe, \n  0x2f, 0x9c, 0x00, 0x54, 0x36, 0xff, 0xee, 0xd9, 0xfc, 0x76, 0xe8, 0xfe, 0xf6, 0x56, 0x00, 0xb3, \n  0xe4, 0xfe, 0xcf, 0x5b, 0xfe, 0x20, 0x35, 0xff, 0x17, 0x9e, 0xfe, 0xf4, 0x8a, 0x00, 0x28, 0x4c, \n  0x00, 0xd2, 0xf8, 0xff, 0x94, 0xa7, 0xfe, 0x2e, 0x97, 0xff, 0xc0, 0x73, 0x01, 0x00, 0xcd, 0xff, \n  0x52, 0x71, 0xfd, 0x3d, 0xda, 0xfe, 0xb8, 0x2f, 0x29, 0xb1, 0xf9, 0x31, 0xeb, 0xe9, 0xfd, 0xb4, \n  0x55, 0xee, 0xce, 0x55, 0x00, 0xaa, 0x03, 0x0d, 0x8e, 0x05, 0x07, 0x85, 0x85, 0xfd, 0x9f, 0x2f, \n  0xf6, 0xbb, 0x37, 0xfe, 0x96, 0x20, 0x06, 0x6a, 0xb0, 0xfd, 0x3a, 0x3b, 0xfc, 0x20, 0xa9, 0xfd, \n  0x8f, 0x9b, 0x00, 0x3a, 0x10, 0xff, 0x1d, 0x92, 0xfc, 0x44, 0x8f, 0xfe, 0x5d, 0x98, 0x00, 0x11, \n  0x6e, 0xfe, 0xa0, 0xd8, 0xfd, 0x2c, 0x52, 0xff, 0xef, 0x4d, 0xfe, 0xc8, 0x5e, 0x01, 0x2d, 0x96, \n  0x00, 0xff, 0xcd, 0xff, 0x43, 0xe8, 0xfe, 0x67, 0x01, 0xff, 0xe7, 0x56, 0x00, 0x24, 0x35, 0x01, \n  0xcb, 0xfd, 0xfd, 0x1b, 0xba, 0xfd, 0x1a, 0xc1, 0x2b, 0x47, 0x35, 0x35, 0xaf, 0x16, 0xfd, 0xfd, \n  0x2d, 0xed, 0xc7, 0x31, 0x00, 0x43, 0x27, 0x0e, 0xcd, 0x1a, 0x07, 0x34, 0x59, 0xfc, 0x2e, 0x93, \n  0xf5, 0xea, 0xea, 0xfd, 0x9f, 0x4c, 0x07, 0x17, 0x97, 0xfd, 0x92, 0xc6, 0xfb, 0x31, 0x6e, 0xfd, \n  0xc9, 0x97, 0x00, 0xb7, 0xdd, 0xfe, 0x3c, 0x4d, 0xfc, 0xbb, 0x63, 0xfe, 0xa8, 0x88, 0x00, 0x64, \n  0x84, 0xfe, 0x9d, 0x3b, 0xfd, 0x56, 0x99, 0xff, 0xb4, 0x00, 0xfe, 0xbf, 0xe5, 0x01, 0xcc, 0x15, \n  0x01, 0x88, 0xa6, 0xff, 0x4f, 0xfe, 0xfe, 0x77, 0xd4, 0xfe, 0xda, 0x48, 0xff, 0x66, 0x6c, 0x01, \n  0x9d, 0xc9, 0xff, 0x90, 0xd7, 0xfc, 0xe2, 0xc2, 0x2e, 0xaa, 0x16, 0x38, 0xf0, 0xf4, 0xfb, 0xcb, \n  0x7b, 0xec, 0xeb, 0xb7, 0xff, 0xeb, 0xee, 0x0e, 0x7d, 0x09, 0x07, 0xf1, 0x3a, 0xfb, 0x2f, 0xf5, \n  0xf4, 0xd0, 0xaf, 0xfd, 0xe5, 0x16, 0x08, 0xc0, 0x71, 0xfd, 0x82, 0x2f, 0xfb, 0xd1, 0x46, 0xfd, \n  0x60, 0x80, 0x00, 0x6d, 0xa9, 0xfe, 0x48, 0xf4, 0xfb, 0xb7, 0x20, 0xfe, 0x6c, 0x55, 0x00, 0xbd, \n  0x96, 0xfe, 0x37, 0xdd, 0xfc, 0xd6, 0xce, 0xff, 0x32, 0xf4, 0xfd, 0xd3, 0xdc, 0x01, 0xda, 0x94, \n  0x01, 0x32, 0x92, 0xff, 0xe7, 0xd7, 0xfe, 0x15, 0x96, 0xfe, 0xb1, 0x9f, 0xfe, 0xa4, 0xa8, 0x00, \n  0x87, 0x6f, 0x01, 0x78, 0x3f, 0xfd, 0xf0, 0x98, 0x32, 0x76, 0xde, 0x39, 0x09, 0x89, 0xfa, 0x95, \n  0x8f, 0xec, 0x73, 0x3f, 0xff, 0x10, 0x27, 0x0f, 0x94, 0xd3, 0x06, 0x19, 0x69, 0xfa, 0x59, 0x73, \n  0xf4, 0xd9, 0x95, 0xfd, 0x71, 0x7f, 0x08, 0x66, 0x35, 0xfd, 0x20, 0xba, 0xfa, 0xb3, 0x18, 0xfd, \n  0xfb, 0x71, 0x00, 0x73, 0x66, 0xfe, 0x90, 0xc1, 0xfb, 0xae, 0xc6, 0xfd, 0x6a, 0x0f, 0x00, 0x32, \n  0x9e, 0xfe, 0xe9, 0xeb, 0xfc, 0x9b, 0xc4, 0xff, 0x60, 0x55, 0xfe, 0x3a, 0xb5, 0x01, 0xc5, 0xa4, \n  0x01, 0xa8, 0xab, 0xff, 0xfe, 0xc1, 0xfe, 0xa7, 0x20, 0xfe, 0xbd, 0x46, 0xfe, 0xec, 0xf0, 0xff, \n  0x4f, 0xd8, 0x01, 0x76, 0xce, 0xfe, 0xca, 0x59, 0x36, 0xf9, 0xcb, 0x3b, 0x05, 0xa3, 0xf8, 0x37, \n  0x34, 0xed, 0x4c, 0xe1, 0xfe, 0xc4, 0x97, 0x0e, 0x87, 0xb2, 0x06, 0xc5, 0xe5, 0xf9, 0x12, 0x25, \n  0xf4, 0xe5, 0x3c, 0xfd, 0xba, 0xca, 0x08, 0xe0, 0xf1, 0xfc, 0x01, 0x89, 0xfa, 0xf0, 0xf2, 0xfc, \n  0xfb, 0x36, 0x00, 0x06, 0x50, 0xfe, 0x08, 0x9c, 0xfb, 0x8c, 0x68, 0xfd, 0xe3, 0xcd, 0xff, 0xb0, \n  0xca, 0xfe, 0x7c, 0x2d, 0xfd, 0x18, 0xa0, 0xff, 0x89, 0xd6, 0xfe, 0xe3, 0xa4, 0x01, 0xfd, 0x53, \n  0x01, 0xd3, 0xd9, 0xff, 0xf4, 0xc5, 0xfe, 0x04, 0x9d, 0xfd, 0xd9, 0xf8, 0xfd, 0xbe, 0xb7, 0xff, \n  0x80, 0x2a, 0x01, 0x4a, 0x64, 0x00, 0xbb, 0x10, 0x3a, 0xb6, 0xe1, 0x3d, 0x3e, 0x57, 0xf5, 0x66, \n  0x4b, 0xee, 0x53, 0xd3, 0xfe, 0x92, 0x40, 0x0d, 0xef, 0xb6, 0x06, 0x3e, 0x7a, 0xf9, 0x58, 0xdb, \n  0xf3, 0x4f, 0x88, 0xfc, 0xcc, 0xe7, 0x08, 0x39, 0x83, 0xfc, 0xcb, 0xce, 0xfa, 0x7c, 0x92, 0xfc, \n  0x1e, 0xe4, 0xff, 0x0b, 0x36, 0xfe, 0xce, 0x5d, 0xfb, 0x6d, 0x26, 0xfd, 0x2d, 0x5b, 0xff, 0xe4, \n  0x48, 0xff, 0xea, 0x2f, 0xfd, 0xed, 0x91, 0xff, 0x05, 0x27, 0xff, 0x0b, 0x75, 0x01, 0x04, 0xbf, \n  0x00, 0xf5, 0x22, 0x00, 0x7e, 0x8c, 0xfe, 0x7a, 0x46, 0xfd, 0x79, 0xcc, 0xfd, 0x07, 0x7c, 0xff, \n  0xb1, 0x31, 0x00, 0x0b, 0x34, 0x01, 0x99, 0xd2, 0x3f, 0xab, 0xa0, 0x3e, 0xac, 0x0a, 0xf0, 0xa9, \n  0x67, 0xf0, 0x8f, 0x4f, 0xff, 0x77, 0xc7, 0x0b, 0x28, 0x68, 0x06, 0x02, 0xf1, 0xf8, 0x54, 0x68, \n  0xf3, 0xb8, 0x3b, 0xfc, 0x2f, 0x00, 0x09, 0xd1, 0xdb, 0xfb, 0x8f, 0xdd, 0xfb, 0x36, 0xe6, 0xfb, \n  0xf6, 0xf2, 0xff, 0x02, 0xd7, 0xfd, 0x89, 0x1c, 0xfb, 0x4b, 0x35, 0xfd, 0x17, 0x2c, 0xff, 0x34, \n  0xc5, 0xff, 0x54, 0x00, 0xfd, 0xae, 0x08, 0x00, 0x11, 0xd0, 0xfe, 0x92, 0x65, 0x01, 0xbf, 0x5e, \n  0x00, 0x4a, 0x40, 0x00, 0x58, 0x40, 0xfe, 0x58, 0x5c, 0xfd, 0x33, 0xf7, 0xfd, 0x63, 0xb5, 0xfe, \n  0x8e, 0xcb, 0xff, 0xff, 0x7b, 0x01, 0x3e, 0x4b, 0x47, 0x1d, 0x9a, 0x3d, 0x08, 0x58, 0xe9, 0xd3, \n  0x77, 0xf3, 0xcf, 0x82, 0xff, 0x9b, 0xe3, 0x0a, 0xa5, 0x67, 0x05, 0x7a, 0x5d, 0xf8, 0x83, 0xa9, \n  0xf2, 0x1a, 0x76, 0xfc, 0xc8, 0x2f, 0x09, 0xa8, 0x25, 0xfb, 0xec, 0x3c, 0xfd, 0x77, 0x36, 0xfb, \n  0x41, 0x26, 0x00, 0xda, 0x2c, 0xfd, 0x9e, 0x0c, 0xfb, 0xc1, 0xaf, 0xfd, 0xc6, 0x1e, 0xff, 0xfd, \n  0xbf, 0xff, 0xd9, 0x42, 0xfd, 0x00, 0x19, 0x00, 0x7c, 0xec, 0xfd, 0x24, 0x11, 0x02, 0xf2, 0xca, \n  0xff, 0x79, 0x24, 0x00, 0x20, 0x85, 0xfe, 0xa6, 0x88, 0xfd, 0xa6, 0xbe, 0xfd, 0xc8, 0x20, 0xfe, \n  0x91, 0x0f, 0x00, 0xd4, 0xe2, 0x00, 0x2f, 0x8d, 0x4e, 0x8a, 0xa1, 0x3b, 0x80, 0xde, 0xe2, 0x47, \n  0xb0, 0xf6, 0x8d, 0x56, 0xff, 0x85, 0x74, 0x0a, 0x29, 0xdf, 0x03, 0x2c, 0xaf, 0xf7, 0xd0, 0xca, \n  0xf1, 0x6a, 0x05, 0xfd, 0x15, 0xa7, 0x09, 0xa1, 0x45, 0xfa, 0xa4, 0xe0, 0xfe, 0xa5, 0x8f, 0xfa, \n  0xff, 0x18, 0x00, 0x0e, 0x87, 0xfc, 0xc1, 0x83, 0xfb, 0x4f, 0x5d, 0xfe, 0x8e, 0x3a, 0xfe, 0x85, \n  0x46, 0x00, 0x90, 0x19, 0xfd, 0xf1, 0x22, 0xff, 0x4f, 0x1d, 0xfe, 0x0a, 0x66, 0x02, 0x9e, 0xfe, \n  0xfe, 0xb2, 0xcd, 0x00, 0x9e, 0xde, 0xfe, 0xb1, 0xd8, 0xfc, 0x42, 0xe1, 0xfd, 0xff, 0x54, 0xfe, \n  0x42, 0x6c, 0xff, 0xa2, 0x2b, 0x00, 0xaf, 0x3b, 0x55, 0xb3, 0x0a, 0x39, 0x8a, 0x2a, 0xdd, 0xce, \n  0xed, 0xf9, 0x57, 0xcc, 0xfe, 0x9c, 0x44, 0x0a, 0x69, 0x4d, 0x02, 0xbb, 0xce, 0xf6, 0x70, 0x59, \n  0xf1, 0xb4, 0x63, 0xfe, 0xa6, 0xbb, 0x09, 0x22, 0xa4, 0xf9, 0xfa, 0xfb, 0x00, 0x4a, 0x75, 0xf9, \n  0x58, 0x1e, 0x00, 0xc4, 0xbf, 0xfc, 0xe1, 0x2e, 0xfc, 0x05, 0x40, 0xfe, 0x82, 0xf1, 0xfd, 0x9b, \n  0x4c, 0x00, 0x73, 0x23, 0xfc, 0x56, 0x67, 0xff, 0xd7, 0xdd, 0xfd, 0x79, 0xb2, 0x02, 0xc4, 0x66, \n  0xff, 0xea, 0x4c, 0x01, 0x9d, 0x64, 0xfe, 0x33, 0xbb, 0xfc, 0x80, 0xb7, 0xfe, 0x63, 0xa2, 0xfd, \n  0x93, 0xb9, 0xfe, 0xd1, 0x49, 0x00, 0x23, 0x40, 0x5a, 0x9d, 0x9a, 0x36, 0x27, 0xab, 0xd8, 0xbd, \n  0xfe, 0xfc, 0xf5, 0x28, 0xfd, 0xd0, 0x5a, 0x0a, 0x94, 0x2c, 0x01, 0x79, 0x91, 0xf5, 0x97, 0xf1, \n  0xf1, 0x81, 0x98, 0xff, 0xd6, 0x61, 0x09, 0x8f, 0xb1, 0xf9, 0x46, 0xc1, 0x02, 0xb2, 0xf1, 0xf7, \n  0xb7, 0x20, 0x01, 0x8e, 0x62, 0xfd, 0xe0, 0xac, 0xfb, 0x1f, 0xe4, 0xfe, 0x0b, 0x90, 0xfc, 0x14, \n  0x1e, 0x00, 0x51, 0x71, 0xfc, 0xa6, 0xa2, 0xfe, 0xe4, 0x0d, 0xfe, 0x4d, 0x12, 0x04, 0x4c, 0x54, \n  0xff, 0xc6, 0xf9, 0x00, 0x67, 0xc3, 0xfe, 0xc0, 0xde, 0xfc, 0x9f, 0x82, 0xfe, 0x50, 0x2a, 0xfd, \n  0x11, 0x99, 0xfe, 0x7e, 0x37, 0x00, 0x55, 0x8a, 0x5d, 0xc9, 0x46, 0x33, 0xfb, 0xca, 0xd6, 0x08, \n  0x38, 0xff, 0xc4, 0x52, 0xfa, 0x17, 0x26, 0x0b, 0x4d, 0xa7, 0x00, 0x37, 0xab, 0xf4, 0x5b, 0xab, \n  0xf2, 0xfb, 0xe0, 0x00, 0x50, 0xa1, 0x08, 0x26, 0x07, 0xfa, 0x71, 0xfb, 0x03, 0x69, 0x6b, 0xf7, \n  0x14, 0x1f, 0x02, 0x83, 0x5f, 0xfd, 0x61, 0xad, 0xfb, 0x22, 0xd5, 0xfd, 0x2e, 0x1f, 0xfc, 0xdf, \n  0x9c, 0x00, 0x4d, 0xbc, 0xfb, 0xfd, 0xd1, 0xfe, 0xe8, 0xfa, 0xfe, 0x85, 0x8b, 0x04, 0x84, 0xce, \n  0xfe, 0x65, 0x9f, 0x01, 0x07, 0xcc, 0xfe, 0x33, 0x55, 0xfc, 0xbf, 0xa4, 0xfe, 0xeb, 0xef, 0xfc, \n  0x4d, 0x75, 0xfe, 0x07, 0x31, 0x00, 0xff, 0xbf, 0x5e, 0x15, 0x80, 0x2f, 0x3b, 0xf7, 0xd7, 0xe7, \n  0xd8, 0xff, 0xb3, 0x9a, 0xf6, 0x02, 0xb5, 0x0c, 0x72, 0x38, 0x01, 0x3a, 0x82, 0xf3, 0x99, 0x84, \n  0xf3, 0x25, 0x86, 0x02, 0x8d, 0xcc, 0x06, 0x93, 0xb2, 0xfa, 0xae, 0x1c, 0x06, 0x56, 0x57, 0xf6, \n  0x15, 0xd3, 0x02, 0x4b, 0xae, 0xfd, 0x54, 0xd2, 0xf9, 0xea, 0x69, 0xfe, 0x36, 0x09, 0xfc, 0x0b, \n  0x16, 0x00, 0x88, 0xaf, 0xfc, 0x50, 0x02, 0xff, 0xc8, 0x0d, 0xff, 0x5e, 0xb0, 0x04, 0x6f, 0x3e, \n  0xff, 0xf2, 0x71, 0x01, 0x35, 0xa7, 0xfe, 0x05, 0x18, 0xfc, 0x4b, 0xc4, 0xfe, 0x13, 0xf8, 0xfc, \n  0xe7, 0x2e, 0xfe, 0x02, 0x7d, 0x00, 0xe6, 0x9e, 0x5c, 0x9d, 0x27, 0x2d, 0x88, 0xc0, 0xda, 0xa2, \n  0x51, 0xff, 0x73, 0xd5, 0xf2, 0xf4, 0x01, 0x0f, 0xec, 0x2b, 0x02, 0x26, 0x6a, 0xf2, 0xa0, 0x0c, \n  0xf5, 0xff, 0xdc, 0x02, 0x08, 0xe8, 0x04, 0xed, 0xaf, 0xfc, 0x69, 0xd9, 0x06, 0xa8, 0xbc, 0xf5, \n  0xc2, 0x15, 0x03, 0x8d, 0xa8, 0xfc, 0xfc, 0xcf, 0xf9, 0x07, 0xbb, 0xfe, 0x7e, 0xc6, 0xfb, 0x03, \n  0xcc, 0x00, 0xe2, 0x6c, 0xfd, 0x67, 0x8e, 0xfe, 0x04, 0xeb, 0xfe, 0x4f, 0x47, 0x05, 0xc8, 0xf6, \n  0xfe, 0xfb, 0x28, 0x01, 0x72, 0xb2, 0xfe, 0x75, 0xfa, 0xfb, 0x07, 0x30, 0xff, 0x53, 0xa0, 0xfc, \n  0x9a, 0x50, 0xfe, 0xe7, 0xe8, 0x00, 0x2e, 0x9d, 0x57, 0xc5, 0xac, 0x2b, 0x0a, 0x27, 0xdf, 0x98, \n  0xfa, 0xfd, 0x4a, 0x47, 0xf0, 0x7c, 0x78, 0x10, 0xc1, 0x7f, 0x03, 0x1f, 0x8c, 0xf2, 0x60, 0xbb, \n  0xf5, 0x2d, 0xd9, 0x02, 0x66, 0x33, 0x04, 0xa5, 0x65, 0xfd, 0x84, 0x9b, 0x07, 0x79, 0x49, 0xf5, \n  0x67, 0xdb, 0x01, 0xbd, 0x99, 0xfd, 0x49, 0x5d, 0xf9, 0x9c, 0x4d, 0xff, 0x86, 0x85, 0xfc, 0xf3, \n  0x16, 0x01, 0xdc, 0xb7, 0xfd, 0x9a, 0x37, 0xfe, 0xb3, 0xf0, 0xfe, 0x37, 0x2a, 0x05, 0x13, 0xc9, \n  0xfe, 0x5c, 0x9c, 0x00, 0x42, 0x6c, 0xff, 0xc6, 0xea, 0xfb, 0x6e, 0x3c, 0xff, 0xd3, 0xbf, 0xfc, \n  0xfb, 0xd6, 0xfe, 0xab, 0xd5, 0x00, 0xe6, 0x19, 0x51, 0xda, 0x5f, 0x29, 0x8a, 0xbb, 0xe5, 0x10, \n  0x41, 0xfc, 0x52, 0xff, 0xee, 0xac, 0x95, 0x10, 0xe4, 0x37, 0x05, 0x0b, 0x3d, 0xf3, 0x24, 0x69, \n  0xf6, 0x1e, 0x7a, 0x03, 0xbe, 0x0c, 0x02, 0xb6, 0xfb, 0xfe, 0x42, 0x12, 0x07, 0x57, 0xe1, 0xf4, \n  0x91, 0xd5, 0x01, 0x0e, 0xd3, 0xfd, 0x33, 0x00, 0xfa, 0x55, 0xd9, 0xff, 0x04, 0x95, 0xfd, 0x17, \n  0x9a, 0x00, 0x9f, 0x33, 0xfe, 0x96, 0x3a, 0xfe, 0xd7, 0x9f, 0xfe, 0xa3, 0x95, 0x04, 0xae, 0x9f, \n  0xfe, 0xaa, 0xc9, 0x00, 0x17, 0xbc, 0xff, 0x86, 0x01, 0xfc, 0xbb, 0x6b, 0xff, 0x48, 0x76, 0xfd, \n  0x42, 0xd0, 0xfe, 0x5d, 0xc9, 0x00, 0x43, 0x33, 0x48, 0xef, 0x71, 0x28, 0x5d, 0x43, 0xec, 0x7e, \n  0x20, 0xfb, 0x9a, 0x81, 0xee, 0x54, 0x92, 0x0f, 0x86, 0xaa, 0x06, 0x2b, 0xe1, 0xf4, 0x23, 0xd0, \n  0xf7, 0x17, 0x0c, 0x02, 0x93, 0x5d, 0x01, 0x91, 0x4c, 0xff, 0x5a, 0xce, 0x05, 0x77, 0x1e, 0xf6, \n  0x65, 0xdc, 0x00, 0x71, 0xc9, 0xfe, 0xf1, 0xa9, 0xfa, 0x32, 0x6d, 0x00, 0x5c, 0x15, 0xfe, 0xd5, \n  0x08, 0x00, 0xfe, 0x08, 0xff, 0x9f, 0x28, 0xfe, 0xc4, 0xcf, 0xfd, 0xfa, 0xd8, 0x03, 0xe0, 0x29, \n  0xff, 0x6c, 0x77, 0x00, 0x26, 0x0d, 0x00, 0xba, 0x71, 0xfc, 0xc0, 0xcd, 0xff, 0xf1, 0xc3, 0xfd, \n  0x33, 0xf8, 0xfe, 0x89, 0x9c, 0x00, 0x9f, 0x2f, 0x3b, 0xa4, 0xc1, 0x28, 0xbc, 0xc1, 0xf0, 0xe9, \n  0xb6, 0xfb, 0x7b, 0xad, 0xf8, 0x76, 0x40, 0x08, 0x23, 0x71, 0x01, 0xc4, 0x79, 0xf7, 0x06, 0x59, \n  0xf8, 0x07, 0x1d, 0x02, 0x33, 0x1a, 0x03, 0x94, 0x4e, 0xff, 0xcc, 0x85, 0x04, 0xe8, 0x30, 0xfa, \n  0x96, 0x28, 0x01, 0xcc, 0x0e, 0x00, 0x47, 0x52, 0xfc, 0x8b, 0x6e, 0xff, 0xc2, 0xed, 0xfe, 0xe6, \n  0x0d, 0x00, 0x8c, 0x5c, 0xfe, 0x68, 0xd0, 0xfe, 0x97, 0x6c, 0xfe, 0x55, 0x6a, 0x02, 0xf1, 0xfe, \n  0xfe, 0xb2, 0xe3, 0xff, 0x8f, 0x7f, 0x00, 0xc8, 0x99, 0xfd, 0x30, 0xdb, 0xfe, 0xd5, 0x3c, 0xfe, \n  0x30, 0x6b, 0xfe, 0xed, 0x90, 0xff, 0xf1, 0x55, 0x32, 0x0f, 0xc0, 0x27, 0xeb, 0x75, 0xf6, 0x73, \n  0x58, 0xfa, 0x5e, 0xa8, 0xf8, 0xa2, 0xc5, 0x07, 0x81, 0x35, 0x03, 0xbb, 0xa9, 0xf9, 0x35, 0x64, \n  0xf9, 0x3d, 0x72, 0x00, 0x17, 0xa7, 0x02, 0x65, 0x89, 0xff, 0x0e, 0xb6, 0x03, 0xb6, 0xa0, 0xfb, \n  0x6a, 0x40, 0x00, 0x21, 0x9a, 0x00, 0x76, 0x71, 0xfd, 0xa9, 0x02, 0x00, 0x69, 0x9e, 0xff, 0x08, \n  0x21, 0x00, 0x7b, 0x05, 0xff, 0x10, 0xae, 0xfe, 0xbc, 0xf9, 0xfd, 0x40, 0xd1, 0x01, 0x3c, 0x69, \n  0xff, 0x11, 0xbe, 0xff, 0xb0, 0xdc, 0x00, 0xde, 0x4b, 0xfe, 0x50, 0x0e, 0xff, 0xfb, 0x87, 0xfe, \n  0xfe, 0x98, 0xfe, 0x83, 0x56, 0xff, 0x78, 0x12, 0x2b, 0xcc, 0x6a, 0x26, 0xce, 0xa8, 0xfa, 0xa7, \n  0xb1, 0xf9, 0xab, 0x40, 0xf9, 0x30, 0xbb, 0x06, 0x2b, 0x3c, 0x04, 0xb9, 0xf0, 0xfb, 0xb3, 0x2a, \n  0xfa, 0x23, 0x66, 0xff, 0x84, 0x55, 0x02, 0xd5, 0x86, 0xff, 0xcf, 0x52, 0x03, 0x81, 0xf4, 0xfc, \n  0xaf, 0xd9, 0xff, 0x19, 0x04, 0x01, 0x2f, 0xa5, 0xfe, 0x46, 0x16, 0x00, 0xb8, 0x19, 0x00, 0xae, \n  0xa3, 0x00, 0xff, 0x30, 0xff, 0x4d, 0xed, 0xfe, 0x96, 0xe9, 0xfd, 0x80, 0x1c, 0x01, 0xad, 0xc6, \n  0xff, 0x2a, 0x97, 0xff, 0x2e, 0xb4, 0x00, 0xa5, 0xd6, 0xfe, 0x82, 0x33, 0xff, 0xb8, 0xc5, 0xfe, \n  0xc2, 0xed, 0xfe, 0x1d, 0xfc, 0xfe, 0xda, 0xa1, 0x25, 0xe3, 0x1b, 0x25, 0xdc, 0x38, 0xfd, 0x88, \n  0x4f, 0xf9, 0x9d, 0x0c, 0xfa, 0xf9, 0xb2, 0x05, 0x98, 0xb6, 0x04, 0x75, 0x8f, 0xfd, 0xc0, 0xf1, \n  0xfa, 0x4f, 0xdc, 0xfe, 0xac, 0x16, 0x02, 0x00, 0x96, 0xff, 0x01, 0xd6, 0x02, 0xcf, 0x27, 0xfe, \n  0x58, 0xde, 0xff, 0x14, 0x0a, 0x01, 0xe8, 0x6d, 0xff, 0x87, 0x06, 0x00, 0x28, 0x66, 0x00, 0x48, \n  0xef, 0x00, 0x3c, 0x57, 0xff, 0x45, 0x1c, 0xff, 0xbc, 0xdb, 0xfd, 0x5a, 0x60, 0x00, 0x4f, 0xbb, \n  0xff, 0x0e, 0x4a, 0xff, 0x3c, 0x36, 0x00, 0x37, 0x60, 0xff, 0xd6, 0x59, 0xff, 0xfd, 0xec, 0xfe, \n  0xd9, 0xf5, 0xfe, 0x8d, 0xc1, 0xfe, 0x02, 0x2e, 0x22, 0xe7, 0xec, 0x23, 0xe0, 0xba, 0xfe, 0x5b, \n  0x27, 0xf9, 0x1f, 0x0f, 0xfb, 0xaf, 0x0f, 0x05, 0xdf, 0xe8, 0x04, 0x99, 0xb7, 0xfe, 0x39, 0xae, \n  0xfb, 0xaf, 0xca, 0xfe, 0xa4, 0x06, 0x02, 0x61, 0x05, 0x00, 0x21, 0x8e, 0x02, 0x1b, 0x03, 0xff, \n  0x48, 0x69, 0x00, 0xc7, 0xda, 0x00, 0x1d, 0xc8, 0xff, 0x7b, 0x41, 0x00, 0x4a, 0x8b, 0x00, 0x52, \n  0xf9, 0x00, 0xd7, 0x7a, 0xff, 0xaf, 0x5e, 0xff, 0xd6, 0xda, 0xfd, 0x39, 0xb4, 0xff, 0x7f, 0x96, \n  0xff, 0x79, 0x27, 0xff, 0x6c, 0x22, 0x00, 0xcf, 0xf3, 0xff, 0x10, 0x5c, 0xff, 0xcb, 0xe8, 0xfe, \n  0xe3, 0x82, 0xff, 0xec, 0xe4, 0xfe, 0x46, 0xcd, 0x1f, 0x47, 0x37, 0x23, 0x51, 0xb2, 0xff, 0x86, \n  0x00, 0xf9, 0xb0, 0x1d, 0xfc, 0xce, 0xb3, 0x04, 0x97, 0xdf, 0x04, 0x88, 0x7c, 0xff, 0x08, 0xce, \n  0xfb, 0x62, 0xda, 0xfe, 0x96, 0x19, 0x02, 0x56, 0x45, 0x00, 0x24, 0xac, 0x02, 0x5f, 0x36, 0xff, \n  0xff, 0xcb, 0x00, 0x36, 0x18, 0x01, 0xf6, 0x5b, 0xff, 0x25, 0x26, 0x00, 0x38, 0xc4, 0x00, 0xe3, \n  0xbb, 0x00, 0x02, 0x2c, 0xff, 0x6c, 0xb8, 0xff, 0x42, 0xef, 0xfd, 0xe9, 0xd9, 0xfe, 0x5a, 0x9a, \n  0xff, 0xf9, 0x80, 0xff, 0x6b, 0xda, 0xff, 0x52, 0xb5, 0xff, 0xf7, 0xc4, 0xff, 0x82, 0x76, 0xff, \n  0x58, 0xf1, 0xfe, 0x32, 0xa7, 0xff, 0x42, 0x8d, 0x1e, 0xce, 0xf5, 0x22, 0xde, 0x24, 0x00, 0xea, \n  0xe5, 0xf8, 0xbf, 0x36, 0xfd, 0x21, 0xf1, 0x04, 0x2d, 0x72, 0x04, 0x0d, 0xdb, 0xff, 0xba, 0xb5, \n  0xfb, 0x81, 0x5a, 0xfe, 0x68, 0x8a, 0x02, 0xbe, 0x05, 0x00, 0x31, 0x80, 0x02, 0x24, 0xf7, 0xff, \n  0xfe, 0x88, 0x00, 0x67, 0x31, 0x01, 0xca, 0x92, 0xff, 0x77, 0x46, 0xff, 0x82, 0x93, 0x00, 0x20, \n  0x1e, 0x01, 0x11, 0xb5, 0xfe, 0x35, 0x2a, 0xff, 0xcd, 0x7c, 0xfe, 0xd9, 0x06, 0xff, 0xc7, 0x06, \n  0xff, 0x4f, 0x99, 0xff, 0x88, 0x9e, 0xff, 0xb0, 0xaa, 0xff, 0x9c, 0x15, 0x00, 0x52, 0xf5, 0xfe, \n  0x99, 0x82, 0x00, 0x70, 0xbb, 0x00, 0x65, 0x80, 0x1e, 0x2e, 0x51, 0x23, 0xbe, 0xd4, 0xff, 0xea, \n  0xad, 0xf8, 0x88, 0x47, 0xfe, 0xe8, 0xab, 0x05, 0x22, 0x72, 0x04, 0xb7, 0x3f, 0xff, 0xf0, 0x9f, \n  0xfb, 0x42, 0x14, 0xfe, 0x2d, 0x07, 0x02, 0xb8, 0x01, 0x00, 0x8c, 0x03, 0x02, 0xdb, 0x25, 0x00, \n  0x77, 0x30, 0x01, 0x40, 0xfe, 0x00, 0x1a, 0x68, 0xff, 0x05, 0x98, 0xff, 0xb9, 0x06, 0x00, 0x3d, \n  0x7f, 0x00, 0x4b, 0x0a, 0xff, 0x9c, 0x0a, 0xff, 0x33, 0x0f, 0xfe, 0x5d, 0x73, 0xff, 0xc8, 0x9c, \n  0xff, 0x0a, 0xb4, 0xfe, 0x0a, 0x6e, 0xff, 0x78, 0x31, 0x00, 0x68, 0x32, 0xff, 0x2f, 0x3c, 0x00, \n  0x5c, 0x84, 0x01, 0x99, 0xf5, 0xfe, 0xef, 0xca, 0x1e, 0x96, 0x97, 0x24, 0x4b, 0xb4, 0xff, 0x8d, \n  0xed, 0xf7, 0x8a, 0x51, 0xff, 0x1a, 0x88, 0x06, 0x90, 0xa7, 0x04, 0xf8, 0xf5, 0xfe, 0x5a, 0xdd, \n  0xfa, 0xbb, 0xd2, 0xfd, 0xec, 0x1f, 0x02, 0x24, 0x34, 0xff, 0x7c, 0x5f, 0x01, 0x4f, 0x52, 0x00, \n  0x90, 0x0a, 0x01, 0xc1, 0x90, 0x01, 0xe2, 0xa2, 0xff, 0x71, 0x72, 0xff, 0xc8, 0x76, 0x00, 0x39, \n  0x2a, 0x00, 0xb5, 0x0f, 0xfe, 0xe0, 0x40, 0xff, 0xbc, 0x96, 0xfe, 0x0f, 0x27, 0xff, 0x2d, 0x65, \n  0xff, 0x67, 0x65, 0xff, 0xc8, 0xb5, 0xff, 0x08, 0xcc, 0xfe, 0xc7, 0xe2, 0xff, 0x07, 0x88, 0x01, \n  0x1e, 0xf0, 0xff, 0x5e, 0xb3, 0xfe, 0x07, 0x75, 0x20, 0x56, 0x12, 0x26, 0xa0, 0xe1, 0xfe, 0xe9, \n  0x02, 0xf7, 0xec, 0x2a, 0x00, 0x34, 0x8f, 0x07, 0x7e, 0xb3, 0x04, 0x0c, 0x97, 0xfe, 0xc9, 0x58, \n  0xfa, 0xcd, 0x65, 0xfd, 0x83, 0x3f, 0x02, 0x2f, 0xf2, 0xfe, 0xd8, 0x81, 0x00, 0xe8, 0xac, 0xff, \n  0x63, 0x28, 0x01, 0xfe, 0x86, 0x01, 0xc6, 0x5d, 0xff, 0x9c, 0x1b, 0x00, 0x92, 0xe4, 0x00, 0x27, \n  0xe5, 0xff, 0x95, 0xed, 0xfd, 0x47, 0xd1, 0xfe, 0x1e, 0xfd, 0xfd, 0x0c, 0xb1, 0xff, 0xf3, 0xb9, \n  0xff, 0xdf, 0x1f, 0xff, 0x4c, 0xbd, 0xff, 0x70, 0x15, 0xff, 0x10, 0x25, 0x00, 0x24, 0xea, 0x00, \n  0x38, 0x64, 0xff, 0xf0, 0xcd, 0xfe, 0x28, 0xce, 0x22, 0xff, 0x2f, 0x28, 0xa4, 0x71, 0xfd, 0x42, \n  0xc8, 0xf5, 0x46, 0x41, 0x01, 0xdb, 0x47, 0x08, 0x65, 0x78, 0x04, 0x3e, 0xf8, 0xfd, 0x6b, 0x96, \n  0xf9, 0x5d, 0x70, 0xfd, 0x73, 0x88, 0x02, 0x3e, 0x8e, 0xfe, 0x0a, 0x9e, 0xff, 0x7a, 0x3c, 0xff, \n  0x58, 0x02, 0x01, 0x09, 0xf8, 0x00, 0x60, 0xed, 0xfe, 0xf9, 0xfe, 0xff, 0xfd, 0x36, 0x01, 0x24, \n  0x08, 0x00, 0x36, 0xe1, 0xfd, 0xe6, 0xaa, 0xfe, 0xd0, 0xab, 0xfd, 0x18, 0x8a, 0xff, 0x85, 0x5e, \n  0xff, 0x1c, 0x93, 0xff, 0xc6, 0xd5, 0xff, 0x6e, 0xb5, 0xfe, 0x3b, 0x16, 0x00, 0x40, 0x1f, 0x01, \n  0xf0, 0x20, 0xff, 0xf7, 0xcd, 0xfd, 0x0a, 0xe9, 0x25, 0x8c, 0x94, 0x2a, 0x11, 0x81, 0xfb, 0xf4, \n  0xb7, 0xf4, 0x1c, 0x6b, 0x02, 0xc6, 0x05, 0x09, 0xd9, 0xaa, 0x03, 0x2b, 0x22, 0xfd, 0x20, 0xdb, \n  0xf8, 0xf7, 0xc2, 0xfd, 0x1e, 0x50, 0x03, 0x6d, 0xd9, 0xfd, 0xf5, 0xff, 0xfe, 0x53, 0xa4, 0xfe, \n  0xec, 0x17, 0x01, 0x15, 0xbe, 0x00, 0x1d, 0xe5, 0xfd, 0x1f, 0xc8, 0xff, 0x4c, 0x29, 0x01, 0x0b, \n  0xa8, 0xff, 0x5a, 0xe8, 0xfd, 0x54, 0x08, 0xff, 0x2a, 0x84, 0xfd, 0x1f, 0xfe, 0xff, 0x24, 0x1c, \n  0xff, 0x6a, 0xcf, 0xfe, 0x45, 0xfe, 0xff, 0x35, 0x11, 0xff, 0x72, 0x5b, 0xff, 0x01, 0xa7, 0x00, \n  0x6e, 0x1f, 0x00, 0xf4, 0x8b, 0xfd, 0xd7, 0xe6, 0x29, 0xaf, 0x2a, 0x2d, 0x2f, 0x0a, 0xf9, 0x96, \n  0x05, 0xf4, 0x60, 0xa4, 0x03, 0x7a, 0xae, 0x09, 0x25, 0xa9, 0x02, 0x72, 0xe2, 0xfb, 0xb5, 0x45, \n  0xf8, 0x63, 0x58, 0xfe, 0xb5, 0x7c, 0x04, 0xf2, 0x19, 0xfd, 0xdb, 0x32, 0xfe, 0x72, 0x72, 0xfe, \n  0xcd, 0x23, 0x01, 0x11, 0x81, 0x00, 0x29, 0x70, 0xfd, 0x5f, 0x3a, 0xff, 0xa8, 0xd6, 0x00, 0x1f, \n  0x7a, 0xff, 0x4a, 0x61, 0xfd, 0xf1, 0x7d, 0xff, 0x75, 0xc8, 0xfd, 0xde, 0x6c, 0x00, 0xe2, 0x8c, \n  0xff, 0x30, 0x50, 0xfe, 0xf9, 0x90, 0xff, 0xfe, 0xef, 0xfe, 0x62, 0xfa, 0xfe, 0x25, 0x1f, 0x00, \n  0x90, 0xe8, 0x00, 0xba, 0x1f, 0xfe, 0x69, 0x63, 0x2e, 0xea, 0xf9, 0x2f, 0x76, 0x8a, 0xf6, 0xa8, \n  0xde, 0xf3, 0x98, 0x90, 0x04, 0xc2, 0x0e, 0x0a, 0x13, 0xc3, 0x01, 0xbf, 0xb3, 0xfa, 0x19, 0xdb, \n  0xf7, 0x7c, 0x11, 0xff, 0xf5, 0xc0, 0x05, 0xe8, 0x85, 0xfc, 0x93, 0x8f, 0xfd, 0xe8, 0x4d, 0xfe, \n  0x96, 0x7b, 0x01, 0x6e, 0x20, 0x00, 0x30, 0x25, 0xfd, 0xac, 0x29, 0xff, 0xf8, 0x40, 0x00, 0x06, \n  0x62, 0xff, 0x79, 0x38, 0xfd, 0x8c, 0x9c, 0xff, 0xd4, 0x4b, 0xfe, 0x67, 0xd3, 0x00, 0x91, 0xe6, \n  0xff, 0x5f, 0x91, 0xfe, 0xba, 0x59, 0xff, 0xa9, 0x86, 0xfe, 0x41, 0x64, 0xfe, 0x6c, 0xa5, 0xff, \n  0x22, 0x26, 0x01, 0x3a, 0xc1, 0xff, 0x25, 0x4b, 0x33, 0xcc, 0x8c, 0x32, 0x24, 0xb6, 0xf3, 0x1e, \n  0x0f, 0xf4, 0xd0, 0xb3, 0x04, 0x1b, 0xbd, 0x09, 0xd4, 0xdd, 0x00, 0x2c, 0xa4, 0xf9, 0x4d, 0x5b, \n  0xf7, 0xd8, 0x90, 0xff, 0xaa, 0xa2, 0x06, 0x7f, 0xba, 0xfb, 0xc6, 0x23, 0xfd, 0xd1, 0x00, 0xfe, \n  0x57, 0x95, 0x01, 0xcf, 0xbb, 0xff, 0x6e, 0xa7, 0xfc, 0xe3, 0xcb, 0xfe, 0xe2, 0xd9, 0xff, 0xa2, \n  0x47, 0xff, 0x68, 0xf7, 0xfc, 0xbd, 0xb2, 0xff, 0xd4, 0x90, 0xfe, 0x66, 0xdd, 0x00, 0xea, 0xde, \n  0xff, 0x21, 0xfe, 0xfe, 0x9f, 0x09, 0xff, 0x8f, 0x25, 0xfe, 0x5a, 0xc1, 0xfd, 0xa0, 0xef, 0xfe, \n  0xa3, 0xa4, 0x00, 0x75, 0x04, 0x01, 0x05, 0x3e, 0x38, 0xf0, 0x24, 0x35, 0xa4, 0xc2, 0xf0, 0x95, \n  0xe3, 0xf4, 0xfe, 0x48, 0x04, 0x1a, 0xdb, 0x08, 0x2a, 0x5e, 0x00, 0xa6, 0x0a, 0xf9, 0x62, 0x0c, \n  0xf7, 0xba, 0xc8, 0xff, 0x83, 0x54, 0x07, 0xad, 0x1f, 0xfb, 0x96, 0x1a, 0xfd, 0x6e, 0xcc, 0xfd, \n  0x34, 0x8f, 0x01, 0x2f, 0x8b, 0xff, 0xfa, 0x44, 0xfc, 0xf8, 0x62, 0xfe, 0x26, 0xa4, 0xff, 0x36, \n  0x7d, 0xff, 0x4d, 0xe3, 0xfc, 0x1a, 0x04, 0x00, 0x84, 0xa6, 0xfe, 0xc2, 0xd2, 0x00, 0x08, 0xae, \n  0xff, 0xdc, 0x85, 0xff, 0xc1, 0xe3, 0xfe, 0x1a, 0xe1, 0xfd, 0x09, 0x91, 0xfd, 0xef, 0x17, 0xfe, \n  0x4b, 0x4b, 0x00, 0x8d, 0x83, 0x01, 0x28, 0xd7, 0x3d, 0x04, 0xba, 0x36, 0x32, 0xe5, 0xec, 0xc6, \n  0x43, 0xf6, 0x9e, 0x5f, 0x03, 0x5c, 0x53, 0x07, 0x99, 0xc2, 0xff, 0x61, 0x87, 0xf8, 0x1e, 0x8f, \n  0xf6, 0xb1, 0xb7, 0xff, 0x19, 0x90, 0x07, 0xef, 0x8d, 0xfa, 0xa2, 0x5a, 0xfd, 0xd1, 0x5c, 0xfd, \n  0x76, 0x63, 0x01, 0x87, 0x24, 0xff, 0xdc, 0xd9, 0xfb, 0x8f, 0xfc, 0xfd, 0x26, 0x7d, 0xff, 0xff, \n  0x6e, 0xff, 0xb0, 0xdc, 0xfc, 0x4e, 0x37, 0x00, 0xde, 0x34, 0xfe, 0x45, 0xdc, 0x00, 0x25, 0x29, \n  0xff, 0x89, 0xb1, 0xff, 0xef, 0xed, 0xfe, 0xe6, 0x91, 0xfd, 0x9f, 0x67, 0xfd, 0xd1, 0x1c, 0xfd, \n  0xb5, 0x31, 0x00, 0x26, 0x46, 0x01, 0x90, 0x3b, 0x44, 0x10, 0x20, 0x37, 0x1d, 0x05, 0xe8, 0xa2, \n  0x80, 0xf8, 0x10, 0x8c, 0x02, 0x88, 0xc9, 0x05, 0x6c, 0xe0, 0xfe, 0xbb, 0x43, 0xf8, 0x32, 0x09, \n  0xf6, 0xb1, 0xbc, 0xff, 0x84, 0x27, 0x08, 0x12, 0xd9, 0xf9, 0x53, 0x3f, 0xfe, 0xd5, 0x0d, 0xfd, \n  0xa3, 0x36, 0x01, 0x84, 0xa4, 0xfe, 0x99, 0xe4, 0xfb, 0x77, 0x21, 0xfe, 0xcb, 0xc4, 0xfe, 0x95, \n  0xde, 0xff, 0x2d, 0xe5, 0xfc, 0xe0, 0xb1, 0xff, 0xdd, 0x39, 0xfe, 0xf1, 0x03, 0x01, 0xb3, 0x85, \n  0xfe, 0x35, 0x29, 0x00, 0x72, 0x55, 0xff, 0x96, 0xed, 0xfc, 0x37, 0x73, 0xfd, 0xcb, 0x01, 0xfd, \n  0xb2, 0xa9, 0xff, 0xb9, 0xcb, 0x00, 0x35, 0x05, 0x4b, 0xca, 0x9c, 0x35, 0x1e, 0x00, 0xe3, 0x09, \n  0x88, 0xfb, 0x83, 0xe3, 0x01, 0x9d, 0x74, 0x04, 0x03, 0x82, 0xfd, 0xe0, 0x3e, 0xf8, 0xf6, 0x47, \n  0xf5, 0x2c, 0xc8, 0x00, 0x9a, 0x9b, 0x08, 0xc0, 0x04, 0xf9, 0x79, 0x13, 0x00, 0x2b, 0x70, 0xfc, \n  0xfb, 0x0d, 0x01, 0x5e, 0x9b, 0xfe, 0x72, 0xad, 0xfc, 0xf6, 0x7d, 0xfd, 0xdc, 0x72, 0xfe, 0x38, \n  0x72, 0x00, 0x16, 0xd8, 0xfb, 0x8a, 0xf2, 0xff, 0x27, 0x2d, 0xfe, 0xe6, 0xf2, 0x00, 0x20, 0xda, \n  0xfe, 0x1b, 0xd0, 0x00, 0x70, 0x22, 0xff, 0x1f, 0x74, 0xfc, 0xf7, 0x3a, 0xfe, 0x33, 0xcc, 0xfc, \n  0x47, 0x93, 0xfe, 0xf1, 0xcf, 0x00, 0x50, 0xd3, 0x4f, 0xfe, 0xc9, 0x33, 0x85, 0x9c, 0xde, 0xc8, \n  0x91, 0xfe, 0xbb, 0xc5, 0x00, 0x95, 0x36, 0x03, 0x51, 0x60, 0xfc, 0x56, 0x94, 0xf7, 0x85, 0x52, \n  0xf5, 0x0e, 0xd0, 0x01, 0x05, 0x78, 0x08, 0x6e, 0x00, 0xf9, 0xb6, 0xb8, 0x01, 0xe7, 0x2b, 0xfb, \n  0xf9, 0xab, 0x01, 0x04, 0x35, 0xff, 0xbb, 0x1a, 0xfc, 0x45, 0xbb, 0xfd, 0x30, 0x78, 0xfd, 0x43, \n  0xfb, 0xff, 0x94, 0xf8, 0xfb, 0xee, 0x62, 0xff, 0x3f, 0x1f, 0xfe, 0x52, 0x1a, 0x02, 0x6c, 0xde, \n  0xfe, 0x14, 0xb3, 0x00, 0x33, 0x56, 0xff, 0x55, 0x98, 0xfc, 0x15, 0xfc, 0xfd, 0xc7, 0x5f, 0xfc, \n  0xff, 0x46, 0xfe, 0x7d, 0x7c, 0x00, 0xa4, 0x4f, 0x52, 0x29, 0x98, 0x30, 0x77, 0x5e, 0xdd, 0xe4, \n  0xdb, 0x00, 0xbb, 0xd3, 0xfe, 0x44, 0x2f, 0x03, 0x67, 0x92, 0xfb, 0xb5, 0x41, 0xf7, 0x23, 0xac, \n  0xf5, 0xf8, 0xd0, 0x02, 0x8c, 0x3b, 0x08, 0xde, 0x68, 0xf9, 0x2a, 0xd1, 0x02, 0xc6, 0xf9, 0xfa, \n  0xef, 0x69, 0x02, 0x3e, 0xf6, 0xfe, 0x0c, 0x8e, 0xfc, 0xa1, 0xbc, 0xfc, 0x02, 0xc5, 0xfc, 0xc1, \n  0x69, 0x00, 0x33, 0x4a, 0xfb, 0x44, 0x97, 0xff, 0xc9, 0x12, 0xff, 0x98, 0x89, 0x02, 0x6d, 0x90, \n  0xfe, 0xc5, 0x70, 0x01, 0x5c, 0x71, 0xff, 0xdc, 0x08, 0xfc, 0xfb, 0xe8, 0xfd, 0x77, 0x89, 0xfc, \n  0xc5, 0x13, 0xfe, 0x39, 0x1f, 0x00, 0xd2, 0x35, 0x51, 0xb0, 0xb1, 0x2d, 0x14, 0x53, 0xdf, 0x4d, \n  0x36, 0x01, 0xab, 0x82, 0xfc, 0x6c, 0x69, 0x04, 0x0b, 0x26, 0xfc, 0x79, 0x87, 0xf6, 0x38, 0x3a, \n  0xf6, 0xcf, 0xff, 0x03, 0xe3, 0xb9, 0x06, 0xc1, 0x99, 0xfa, 0x03, 0xc9, 0x04, 0xc6, 0xd9, 0xf9, \n  0x73, 0x1b, 0x03, 0xf9, 0x59, 0xff, 0x72, 0x19, 0xfb, 0xe2, 0x7f, 0xfd, 0x18, 0x65, 0xfc, 0x71, \n  0x08, 0x00, 0xf6, 0x74, 0xfc, 0xc3, 0x84, 0xff, 0x5f, 0x30, 0xff, 0x4a, 0x0b, 0x03, 0xd0, 0x04, \n  0xff, 0x3a, 0x37, 0x01, 0x07, 0x30, 0xff, 0x47, 0x21, 0xfc, 0x71, 0x07, 0xfe, 0x01, 0xc7, 0xfc, \n  0x7d, 0xf2, 0xfd, 0x47, 0xf8, 0xff, 0xd8, 0x8d, 0x4c, 0x6c, 0x29, 0x2b, 0xf4, 0x10, 0xe4, 0xc2, \n  0xb5, 0xff, 0xc3, 0x6d, 0xfa, 0xb4, 0x84, 0x06, 0x32, 0x48, 0xfd, 0x07, 0x0a, 0xf6, 0xbc, 0x11, \n  0xf7, 0x94, 0xab, 0x03, 0xee, 0x83, 0x05, 0xa2, 0xca, 0xfc, 0x03, 0xdd, 0x04, 0x6c, 0x05, 0xfa, \n  0x8d, 0xa3, 0x02, 0x05, 0xe4, 0xfe, 0x80, 0x8a, 0xfb, 0x99, 0x75, 0xfd, 0x95, 0x09, 0xfd, 0x74, \n  0x5f, 0x00, 0x1d, 0x1b, 0xfd, 0xc4, 0x01, 0xff, 0x2d, 0x54, 0xff, 0xa5, 0x99, 0x03, 0xa4, 0x89, \n  0xfe, 0x35, 0xce, 0x00, 0xb6, 0x6e, 0xff, 0x9c, 0x6e, 0xfc, 0x3a, 0x45, 0xfe, 0x77, 0xe9, 0xfc, \n  0x97, 0x2a, 0xfe, 0x71, 0x3e, 0x00, 0x56, 0xa4, 0x44, 0xea, 0xef, 0x29, 0xaa, 0x19, 0xea, 0x5a, \n  0x5b, 0xfd, 0x53, 0x18, 0xf9, 0xd9, 0xd8, 0x07, 0x83, 0x3a, 0xff, 0x77, 0x58, 0xf6, 0x3a, 0x40, \n  0xf7, 0x02, 0x41, 0x03, 0xc0, 0x5a, 0x04, 0x2a, 0xd3, 0xfd, 0x6b, 0x84, 0x05, 0x7b, 0x68, 0xf9, \n  0xa7, 0xc5, 0x01, 0xdb, 0xbd, 0xff, 0xc4, 0x33, 0xfb, 0x17, 0xbb, 0xfe, 0x97, 0xce, 0xfd, 0x42, \n  0x3c, 0x00, 0x7c, 0xa6, 0xfd, 0x30, 0xaa, 0xfe, 0x9c, 0x42, 0xff, 0x6a, 0xd7, 0x02, 0x3a, 0x9a, \n  0xfe, 0xfa, 0x55, 0x00, 0xf0, 0xd9, 0xff, 0x59, 0xec, 0xfc, 0xa0, 0x5b, 0xfe, 0x68, 0x97, 0xfd, \n  0x36, 0x81, 0xfe, 0xc7, 0xc1, 0xff, 0x80, 0xa0, 0x36, 0x8b, 0x28, 0x28, 0x1b, 0xed, 0xee, 0x83, \n  0x6d, 0xfe, 0xbc, 0x11, 0x02, 0xde, 0x8f, 0x04, 0xfe, 0x2c, 0xfe, 0x57, 0x90, 0xf9, 0xea, 0x30, \n  0xf9, 0x81, 0x69, 0x02, 0x81, 0x18, 0x05, 0xbb, 0xa7, 0xfd, 0x57, 0x4f, 0x02, 0xe7, 0x50, 0xfd, \n  0x7c, 0xf6, 0x01, 0x7b, 0x98, 0xff, 0x89, 0x0a, 0xfd, 0xe4, 0x06, 0xfe, 0x83, 0xa8, 0xfd, 0x23, \n  0x0d, 0x00, 0xef, 0x1b, 0xfe, 0x1d, 0x7b, 0xff, 0xde, 0x5a, 0xff, 0xcf, 0x59, 0x02, 0x26, 0x59, \n  0xff, 0xce, 0x3e, 0x00, 0xff, 0xb0, 0xff, 0x03, 0x51, 0xfd, 0x54, 0x30, 0xfe, 0x29, 0xe0, 0xfd, \n  0x61, 0x61, 0xfe, 0x63, 0x18, 0xff, 0xb9, 0xd6, 0x31, 0x4c, 0x5f, 0x28, 0x5c, 0x9d, 0xf1, 0x4b, \n  0xa5, 0xfa, 0x7f, 0x14, 0x01, 0x43, 0xc6, 0x06, 0x9d, 0x61, 0x00, 0x57, 0x5f, 0xfa, 0xa9, 0x97, \n  0xf8, 0xfd, 0x16, 0x00, 0x4b, 0x97, 0x04, 0x4e, 0xb8, 0xfe, 0x49, 0xa4, 0x02, 0x17, 0xf9, 0xfd, \n  0xed, 0xbf, 0x01, 0xf9, 0xd2, 0x00, 0x6e, 0x7d, 0xfd, 0xc1, 0xe6, 0xfe, 0xe5, 0x1a, 0xff, 0x9e, \n  0xed, 0xff, 0xea, 0x66, 0xfe, 0x2a, 0x18, 0xff, 0x98, 0x87, 0xfe, 0x77, 0x35, 0x02, 0xdc, 0x67, \n  0xff, 0x5a, 0x96, 0xff, 0xa4, 0x46, 0x00, 0xa5, 0xfd, 0xfd, 0xc9, 0x6d, 0xfe, 0x4d, 0x4d, 0xfe, \n  0xb2, 0x9d, 0xfe, 0x31, 0x50, 0xff, 0xa5, 0xdb, 0x2d, 0xa4, 0xb5, 0x28, 0x5a, 0x37, 0xf4, 0xae, \n  0xf2, 0xf7, 0xe5, 0xdf, 0xff, 0x32, 0x32, 0x07, 0x98, 0x0a, 0x02, 0xee, 0xd8, 0xfb, 0x42, 0xcd, \n  0xf8, 0xbf, 0xb3, 0xfe, 0x25, 0xdd, 0x03, 0xc8, 0x2a, 0xff, 0x5b, 0xc4, 0x02, 0x65, 0xa5, 0xfe, \n  0x80, 0xa4, 0x01, 0xa9, 0x69, 0x01, 0x6f, 0x4c, 0xfe, 0x08, 0x13, 0xff, 0x3f, 0xf3, 0xff, 0x80, \n  0x26, 0x00, 0xb6, 0x51, 0xfe, 0xf7, 0x46, 0xff, 0x09, 0xc2, 0xfd, 0xce, 0x4b, 0x01, 0x51, 0xdd, \n  0xff, 0xab, 0x14, 0xff, 0xb6, 0x16, 0x00, 0x70, 0xcf, 0xfe, 0x6d, 0x8b, 0xfe, 0x55, 0x8a, 0xfe, \n  0x60, 0x23, 0xff, 0x42, 0x15, 0xff, 0xbc, 0x79, 0x2b, 0x08, 0x3a, 0x29, 0xd9, 0xa0, 0xf5, 0x21, \n  0xae, 0xf6, 0x6b, 0xb4, 0xff, 0xa4, 0x4f, 0x07, 0x13, 0xaf, 0x02, 0xe8, 0x61, 0xfc, 0xc4, 0x1e, \n  0xf9, 0xf4, 0x29, 0xfe, 0xf9, 0x67, 0x03, 0x64, 0xf8, 0xfe, 0x14, 0x9b, 0x02, 0x2c, 0xee, 0xfe, \n  0x63, 0xbb, 0x01, 0xdb, 0xd0, 0x01, 0xbb, 0x83, 0xfe, 0x9b, 0x69, 0xff, 0xef, 0x25, 0x00, 0x4d, \n  0xe5, 0xff, 0x8c, 0xfa, 0xfd, 0xed, 0x78, 0xff, 0x9b, 0x78, 0xfd, 0x7e, 0x29, 0x00, 0x93, 0x33, \n  0x00, 0xea, 0x31, 0xff, 0xab, 0xbe, 0xff, 0x73, 0xf2, 0xfe, 0x70, 0xe0, 0xfe, 0x47, 0xa5, 0xfe, \n  0x8c, 0x3d, 0xff, 0x8d, 0x5d, 0xff, 0x09, 0x44, 0x2b, 0xde, 0x9f, 0x29, 0x1c, 0x60, 0xf5, 0xde, \n  0x95, 0xf6, 0x28, 0x43, 0x01, 0x25, 0xd7, 0x07, 0x59, 0x8c, 0x02, 0x36, 0xcf, 0xfb, 0x9d, 0xf2, \n  0xf8, 0x47, 0x51, 0xfe, 0x04, 0x85, 0x03, 0xf0, 0x8c, 0xfe, 0x2f, 0x87, 0x01, 0x69, 0x58, 0xff, \n  0xfc, 0x93, 0x01, 0xa6, 0xbc, 0x01, 0x09, 0xef, 0xfe, 0x17, 0x99, 0xff, 0xc0, 0x77, 0x00, 0x69, \n  0x9f, 0xff, 0x26, 0x50, 0xfd, 0x94, 0xfc, 0xfe, 0xbf, 0xd6, 0xfd, 0x46, 0x0f, 0x00, 0xb2, 0xc3, \n  0xff, 0x90, 0x97, 0xff, 0xbb, 0xba, 0xff, 0x5c, 0xeb, 0xfe, 0x5a, 0x0f, 0xff, 0xee, 0x42, 0xfe, \n  0xd9, 0x63, 0xff, 0x4c, 0x1e, 0x00, 0x96, 0x5c, 0x2d, 0xd8, 0x4e, 0x29, 0x5d, 0xcd, 0xf3, 0x9c, \n  0xfe, 0xf7, 0xd4, 0xa2, 0x03, 0x2e, 0x59, 0x08, 0xda, 0x54, 0x01, 0x88, 0xd8, 0xfa, 0x71, 0xd2, \n  0xf8, 0x73, 0xff, 0xfe, 0x73, 0xd7, 0x03, 0xe6, 0x03, 0xfe, 0x67, 0x7c, 0x00, 0xaf, 0xaf, 0xfe, \n  0xe1, 0x09, 0x02, 0xff, 0x06, 0x01, 0x28, 0x55, 0xfe, 0x3b, 0x8e, 0x00, 0x5a, 0x72, 0x00, 0xb8, \n  0x27, 0xff, 0x6c, 0x4a, 0xfd, 0xc4, 0x6d, 0xfe, 0x76, 0x99, 0xfd, 0x40, 0x9e, 0x00, 0x85, 0xfe, \n  0xff, 0xe4, 0x54, 0xff, 0x71, 0x9c, 0xff, 0xd7, 0x3d, 0xff, 0x2f, 0xb2, 0xfe, 0x7e, 0x0b, 0xfe, \n  0x95, 0x6f, 0xff, 0x2e, 0x45, 0x00, 0x5b, 0x57, 0x30, 0xc9, 0xd0, 0x29, 0xbc, 0x2e, 0xf2, 0xe7, \n  0x18, 0xfa, 0x0a, 0x65, 0x05, 0x09, 0x57, 0x07, 0xfd, 0xbe, 0xff, 0x7a, 0x0e, 0xfa, 0x42, 0x47, \n  0xf9, 0x82, 0x60, 0x00, 0x34, 0x8f, 0x04, 0xff, 0x0b, 0xfd, 0x61, 0x5c, 0xff, 0x49, 0xb3, 0xfe, \n  0xb0, 0xb8, 0x01, 0x30, 0x15, 0x00, 0x54, 0xe1, 0xfd, 0x2e, 0xfd, 0xff, 0x8b, 0x58, 0x00, 0xda, \n  0xed, 0xfe, 0xe7, 0x48, 0xfd, 0x7e, 0xc3, 0xfe, 0x30, 0xcb, 0xfd, 0x56, 0x9d, 0x00, 0x7b, 0xac, \n  0xff, 0x14, 0xf7, 0xff, 0xff, 0x69, 0xff, 0x40, 0xb3, 0xfe, 0x1e, 0x79, 0xfe, 0x15, 0xd4, 0xfd, \n  0x0a, 0x77, 0xff, 0x74, 0x32, 0x00, 0xb8, 0x8b, 0x34, 0x79, 0x2b, 0x2b, 0xfc, 0x52, 0xf0, 0xda, \n  0xd9, 0xfb, 0x2d, 0xff, 0x04, 0x36, 0x05, 0x05, 0x92, 0x92, 0xfe, 0xa1, 0x26, 0xfa, 0x61, 0x23, \n  0xfa, 0x2e, 0x4d, 0x02, 0xac, 0x28, 0x05, 0x51, 0xa9, 0xfb, 0x33, 0xec, 0xfe, 0x81, 0xa2, 0xfe, \n  0x79, 0x24, 0x01, 0x3c, 0xed, 0xfe, 0xb7, 0x85, 0xfd, 0xec, 0xa4, 0xfe, 0x39, 0x8a, 0xff, 0xc6, \n  0x50, 0xff, 0x02, 0x1a, 0xfd, 0xfd, 0x80, 0xff, 0xcb, 0x58, 0xfe, 0x74, 0x66, 0x00, 0x4b, 0x5c, \n  0xff, 0xdb, 0x70, 0x00, 0x1e, 0x4b, 0xff, 0xec, 0xc8, 0xfd, 0xc1, 0x6f, 0xfe, 0x75, 0x8b, 0xfd, \n  0xdc, 0xf0, 0xfe, 0x00, 0x4d, 0x00, 0x61, 0x8e, 0x39, 0x45, 0x7d, 0x2d, 0x10, 0x43, 0xed, 0x82, \n  0x7f, 0xfc, 0x30, 0xc1, 0x02, 0xde, 0x75, 0x02, 0x3d, 0x77, 0xfe, 0x5a, 0xbe, 0xfa, 0x28, 0xd5, \n  0xfa, 0x32, 0xec, 0x03, 0xc9, 0x94, 0x05, 0x52, 0x21, 0xfa, 0x35, 0xb2, 0xff, 0xcb, 0x0a, 0xfe, \n  0xd1, 0xf7, 0xff, 0xa9, 0xe5, 0xfe, 0x7b, 0x51, 0xfc, 0x24, 0x34, 0xfd, 0x3c, 0x5a, 0xff, 0x3e, \n  0x85, 0xff, 0xb2, 0xe5, 0xfc, 0x9c, 0x26, 0x00, 0x39, 0x7b, 0xfe, 0x48, 0x49, 0x00, 0x15, 0xaf, \n  0xff, 0x5d, 0x75, 0x00, 0x53, 0xb8, 0xfe, 0x1c, 0x6a, 0xfd, 0xa8, 0x81, 0xfe, 0xd8, 0x9a, 0xfc, \n  0xec, 0x77, 0xfe, 0xb5, 0xa2, 0x00, 0x2e, 0x71, 0x3e, 0x19, 0x89, 0x2d, 0x9f, 0x75, 0xea, 0xf6, \n  0xd8, 0xfd, 0x6c, 0xd5, 0x00, 0x08, 0xcb, 0x00, 0x3e, 0x98, 0xfe, 0x77, 0x45, 0xfb, 0x2f, 0x54, \n  0xfb, 0x9b, 0x39, 0x05, 0xe8, 0xa7, 0x05, 0x9e, 0xac, 0xf9, 0x09, 0x07, 0x01, 0x07, 0x1c, 0xfd, \n  0xb5, 0xbb, 0xff, 0xa1, 0x01, 0xff, 0xb8, 0x62, 0xfb, 0x7e, 0x95, 0xfc, 0x61, 0xfc, 0xfe, 0x5d, \n  0xf5, 0xff, 0xc0, 0xfa, 0xfc, 0x35, 0x47, 0x00, 0xee, 0xfb, 0xfe, 0x3c, 0x96, 0x00, 0xb7, 0x19, \n  0x00, 0xf2, 0x6b, 0x00, 0xc9, 0x84, 0xfe, 0xe4, 0x97, 0xfd, 0xb3, 0xfb, 0xfd, 0x38, 0x36, 0xfc, \n  0xec, 0x7b, 0xfe, 0x40, 0x9b, 0x00, 0x3d, 0x28, 0x3f, 0x90, 0x8b, 0x2c, 0x40, 0x9b, 0xe9, 0x7a, \n  0x44, 0xff, 0x83, 0x72, 0x00, 0x16, 0x4f, 0x00, 0xf7, 0xdc, 0xfd, 0x66, 0xf0, 0xfa, 0x0f, 0x14, \n  0xfb, 0x9a, 0x4e, 0x05, 0x24, 0x0e, 0x06, 0x0d, 0xe8, 0xf9, 0x2a, 0xa1, 0x01, 0x80, 0x66, 0xfd, \n  0x74, 0x92, 0xff, 0x72, 0x07, 0xff, 0xff, 0x0a, 0xfc, 0x54, 0x75, 0xfb, 0xfe, 0x85, 0xfe, 0x83, \n  0x59, 0x00, 0x35, 0x5e, 0xfc, 0x12, 0xc5, 0x00, 0x4a, 0x96, 0xff, 0xba, 0xc6, 0x00, 0xd6, 0x0e, \n  0x00, 0x37, 0xbd, 0x00, 0xbb, 0x9b, 0xfe, 0xa3, 0xf6, 0xfc, 0xda, 0xf9, 0xfd, 0xc0, 0x62, 0xfc, \n  0xf0, 0x35, 0xfe, 0x92, 0x38, 0x00, 0x66, 0x6c, 0x3c, 0xb2, 0xc8, 0x29, 0x44, 0x82, 0xeb, 0xb0, \n  0xee, 0xff, 0xee, 0x66, 0x01, 0xc9, 0xb5, 0x01, 0xa3, 0x46, 0xfd, 0xde, 0x2f, 0xfa, 0xfb, 0x1b, \n  0xfa, 0x6c, 0xad, 0x04, 0xa6, 0xc2, 0x05, 0x9c, 0x43, 0xfb, 0x0a, 0x6e, 0x02, 0x7f, 0x1b, 0xfd, \n  0x0e, 0xd5, 0x00, 0x29, 0x63, 0xff, 0xb4, 0x3d, 0xfc, 0x6b, 0x7c, 0xfc, 0x47, 0x91, 0xfd, 0x79, \n  0x0b, 0x00, 0xb4, 0x4d, 0xfd, 0x84, 0x5c, 0x00, 0xe2, 0xd4, 0xff, 0x74, 0x4d, 0x01, 0x55, 0xfe, \n  0xff, 0x09, 0xb7, 0x00, 0x53, 0xb8, 0xfe, 0x29, 0x0b, 0xfd, 0xa1, 0x02, 0xfe, 0xdb, 0x38, 0xfd, \n  0x6b, 0x12, 0xfe, 0x63, 0x92, 0xff, 0x9c, 0x58, 0x2e, 0x21, 0x78, 0x28, 0x48, 0x00, 0xf4, 0x02, \n  0x85, 0xfd, 0x24, 0x3d, 0x05, 0xe0, 0x56, 0x02, 0x32, 0xf0, 0xfe, 0xfb, 0x8c, 0xfb, 0xc9, 0x11, \n  0xfc, 0xda, 0x32, 0x04, 0x5d, 0xe1, 0x04, 0x8e, 0x02, 0xfd, 0x97, 0xec, 0xff, 0x31, 0x41, 0xff, \n  0xfd, 0x8f, 0x00, 0x17, 0xc5, 0xff, 0x32, 0x03, 0xfe, 0xfd, 0x06, 0xfd, 0x99, 0xb3, 0xfe, 0x3c, \n  0xbb, 0xff, 0xf3, 0x2f, 0xfd, 0xf0, 0xef, 0xff, 0xee, 0xf2, 0xff, 0x06, 0x3a, 0x01, 0xe6, 0x20, \n  0x01, 0x6f, 0xfb, 0x00, 0x79, 0x9b, 0xfe, 0xee, 0x8a, 0xfc, 0x4e, 0x14, 0xfd, 0x06, 0xda, 0xfd, \n  0x86, 0xcb, 0xff, 0x42, 0xd8, 0x00, 0x12, 0x11, 0x12, 0x12, 0x14, 0x13, 0x12, 0x11, 0x10, 0x10, \n  0x0f, 0x0f, 0x10, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x13, 0x16, 0x14, 0x13, 0x12, 0x12, 0x11, 0x10, \n  0x0f, 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0f, 0x10, 0x11, 0x11, \n  0x12, 0x13, 0x13, 0x14, 0x17, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, \n  0x0c, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0c, \n  0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x15, 0x18, 0x17, 0x16, 0x15, 0x14, 0x14, \n  0x13, 0x12, 0x11, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x07, \n  0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0a, 0x0c, 0x0d, 0x0e, \n  0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x1b, 0x18, 0x17, 0x16, 0x15, 0x14, \n  0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, \n  0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, \n  0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, \n  0x17, 0x18, 0x1d, 0x1a, 0x19, 0x19, 0x18, 0x17, 0x16, 0x15, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, \n  0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, \n  0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, \n  0x09, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, \n  0x20, 0x1b, 0x1a, 0x19, 0x19, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x14, 0x13, 0x12, 0x11, 0x11, \n  0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x03, \n  0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, \n  0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, \n  0x11, 0x12, 0x13, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, \n  0x16, 0x15, 0x15, 0x14, 0x13, 0x12, 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, \n  0x08, 0x07, 0x06, 0x05, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x08, \n  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, \n  0x1b, 0x1c, 0x1e, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, \n  0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, \n  0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, \n  0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x07, 0x08, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, \n  0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x1b, 0x1a, 0x19, 0x18, \n  0x17, 0x16, 0x15, 0x14, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, \n  0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, \n  0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, \n  0x1b, 0x1c, 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, \n  0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, \n  0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, \n  0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, \n  0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x17, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, \n  0x11, 0x10, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, 0x04, 0x03, 0x02, \n  0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, \n  0x05, 0x05, 0x06, 0x07, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x16, \n  0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x15, 0x13, 0x13, 0x11, 0x10, 0x0f, 0x0e, \n  0x0d, 0x0c, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, \n  0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x06, 0x08, 0x09, 0x0a, \n  0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, \n  0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, \n  0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, \n  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x0b, 0x0c, 0x0d, \n  0x0e, 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x08, \n  0x08, 0x08, 0x09, 0x09, 0x0a, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x07, 0x07, \n  0x07, 0x05, \n};\n"
  },
  {
    "path": "project/lib/custom/openal/build/default-48000.mhr.h",
    "content": "static const unsigned char hrtf_default_48000[] = {\n  0x4d, 0x69, 0x6e, 0x50, 0x48, 0x52, 0x30, 0x32, 0x80, 0xbb, 0x00, 0x00, 0x01, 0x00, 0x20, 0x01, \n  0x78, 0x05, 0x13, 0x01, 0x0c, 0x18, 0x24, 0x2d, 0x38, 0x3c, 0x48, 0x48, 0x48, 0x48, 0x48, 0x3c, \n  0x38, 0x2d, 0x24, 0x18, 0x0c, 0x01, 0x88, 0x69, 0x16, 0x08, 0x0c, 0x22, 0x83, 0xe8, 0x10, 0x65, \n  0xc8, 0x0a, 0xa3, 0xdf, 0x07, 0x72, 0xc9, 0x00, 0x0e, 0x0c, 0x03, 0x41, 0x89, 0x01, 0xe3, 0x24, \n  0xfa, 0x13, 0x31, 0xf6, 0x24, 0x57, 0xfc, 0xe1, 0x71, 0x02, 0x72, 0x9c, 0xff, 0xfc, 0x9c, 0xfd, \n  0x66, 0x0c, 0xfc, 0x79, 0x8c, 0xfb, 0xbd, 0xc9, 0xfd, 0x97, 0xe5, 0xfe, 0x13, 0x35, 0xff, 0x76, \n  0x4a, 0xff, 0xd9, 0xdc, 0xff, 0x3a, 0x1b, 0xff, 0x6d, 0x9e, 0xfe, 0x3b, 0x2e, 0xff, 0x91, 0x63, \n  0xfe, 0x77, 0xa0, 0xfe, 0xb0, 0x92, 0xfe, 0x91, 0xa4, 0xfd, 0x9d, 0xe0, 0xfd, 0x75, 0x75, 0xfe, \n  0x2a, 0x07, 0xff, 0x53, 0x56, 0xff, 0xd2, 0xe0, 0x19, 0x80, 0xf0, 0x23, 0x6b, 0xa6, 0x0e, 0x49, \n  0x54, 0x0b, 0xee, 0x18, 0x09, 0x88, 0x86, 0xff, 0xcb, 0x6f, 0x02, 0x17, 0x92, 0x01, 0x0a, 0x52, \n  0xfa, 0xbf, 0xa5, 0xf5, 0xd8, 0x08, 0xfb, 0x1d, 0x6e, 0x02, 0x05, 0x6d, 0x00, 0xae, 0xbf, 0xfd, \n  0xe0, 0x8a, 0xfc, 0x66, 0x26, 0xfc, 0x98, 0x46, 0xfc, 0x14, 0x70, 0xfd, 0x7d, 0xa3, 0xff, 0xae, \n  0x5e, 0xff, 0x3d, 0x5c, 0xff, 0x9f, 0xce, 0xfe, 0x6f, 0x30, 0xfe, 0x41, 0xc7, 0xfe, 0xa8, 0x46, \n  0xfe, 0x53, 0x7d, 0xfe, 0x5b, 0x8b, 0xfe, 0xeb, 0xe6, 0xfd, 0x97, 0xd7, 0xfd, 0x68, 0x8d, 0xfe, \n  0x98, 0x87, 0xff, 0xbb, 0x91, 0xff, 0xb0, 0x9b, 0x17, 0x79, 0x59, 0x21, 0x6f, 0x3c, 0x0e, 0x85, \n  0x15, 0x0a, 0x1d, 0x01, 0x08, 0xfc, 0xa1, 0x00, 0x3d, 0x32, 0x03, 0x67, 0x36, 0x01, 0xd0, 0x01, \n  0xfa, 0x42, 0xa2, 0xf6, 0x82, 0x91, 0xfc, 0x17, 0x25, 0x02, 0x3d, 0x52, 0xff, 0xf5, 0xcc, 0xfd, \n  0xc7, 0xd5, 0xfc, 0xf0, 0xb1, 0xfc, 0x18, 0xf7, 0xfd, 0xac, 0x55, 0xfe, 0x62, 0x5e, 0xff, 0xbe, \n  0xce, 0xff, 0x1b, 0xf3, 0xff, 0x57, 0xe7, 0xfe, 0xbb, 0x89, 0xfe, 0x2c, 0x3d, 0xff, 0x19, 0x6f, \n  0xfe, 0xfb, 0x91, 0xfe, 0x3d, 0x5d, 0xfe, 0x9c, 0x9f, 0xfd, 0x0e, 0x0f, 0xfe, 0xcb, 0x8d, 0xfe, \n  0x40, 0x1b, 0xff, 0x61, 0x6d, 0xff, 0x33, 0xfa, 0x15, 0x34, 0xf0, 0x1e, 0xdc, 0x1b, 0x0d, 0x61, \n  0x48, 0x09, 0x99, 0x45, 0x07, 0x91, 0x9d, 0x00, 0xbd, 0x55, 0x03, 0x7f, 0x63, 0x01, 0x7e, 0x57, \n  0xfa, 0x75, 0x66, 0xf7, 0xbf, 0xb8, 0xfd, 0x6a, 0xd8, 0x02, 0x43, 0x92, 0xff, 0xa3, 0x4b, 0xfe, \n  0x1e, 0x4f, 0xfd, 0x94, 0xda, 0xfc, 0x90, 0x8d, 0xfe, 0x77, 0x19, 0xff, 0x47, 0x50, 0xff, 0x09, \n  0x68, 0xff, 0xa3, 0xec, 0xff, 0xca, 0x21, 0xff, 0xae, 0xd1, 0xfe, 0xa7, 0x76, 0xff, 0x88, 0x9f, \n  0xfe, 0x18, 0xe0, 0xfe, 0x61, 0xbc, 0xfe, 0x86, 0xd9, 0xfd, 0x25, 0x27, 0xfe, 0xf1, 0xa1, 0xfe, \n  0xfd, 0x25, 0xff, 0x55, 0x72, 0xff, 0x10, 0x9a, 0x15, 0x6b, 0x76, 0x1e, 0x46, 0xed, 0x0c, 0xf9, \n  0x22, 0x09, 0xfb, 0x33, 0x07, 0x3b, 0xd2, 0x00, 0x23, 0xb9, 0x03, 0x39, 0xde, 0x01, 0x48, 0xd2, \n  0xfa, 0xb0, 0xdb, 0xf7, 0x61, 0x20, 0xfe, 0xce, 0x1d, 0x03, 0x59, 0xac, 0xff, 0x0e, 0x22, 0xfe, \n  0x22, 0xed, 0xfc, 0x78, 0x9f, 0xfc, 0xca, 0xaa, 0xfe, 0x12, 0x46, 0xff, 0x6b, 0x53, 0xff, 0xda, \n  0x5d, 0xff, 0x5c, 0xf2, 0xff, 0x27, 0x2e, 0xff, 0xf0, 0xda, 0xfe, 0x61, 0x89, 0xff, 0xd3, 0xc0, \n  0xfe, 0xc8, 0x11, 0xff, 0x48, 0xfe, 0xfe, 0xa2, 0x0d, 0xfe, 0x74, 0x42, 0xfe, 0x9c, 0xac, 0xfe, \n  0xf6, 0x0f, 0xff, 0x4a, 0x43, 0xff, 0x21, 0x28, 0x16, 0xb5, 0x55, 0x1f, 0x63, 0x31, 0x0d, 0x75, \n  0xe0, 0x08, 0x0b, 0xba, 0x06, 0x82, 0x4a, 0x00, 0xb0, 0x5a, 0x03, 0xe7, 0x7f, 0x01, 0x89, 0x44, \n  0xfa, 0x94, 0x00, 0xf7, 0xe0, 0x71, 0xfd, 0x8c, 0x2f, 0x03, 0x1a, 0x02, 0x00, 0xe6, 0x33, 0xfe, \n  0x58, 0xc5, 0xfc, 0xa7, 0x65, 0xfc, 0x1f, 0x94, 0xfe, 0x01, 0x76, 0xff, 0x4d, 0xaa, 0xff, 0x84, \n  0x9f, 0xff, 0xa9, 0x24, 0x00, 0x30, 0x66, 0xff, 0xb8, 0xfd, 0xfe, 0x03, 0x8f, 0xff, 0x1b, 0xb4, \n  0xfe, 0x63, 0xf0, 0xfe, 0x11, 0xd5, 0xfe, 0x08, 0xf0, 0xfd, 0xff, 0x3c, 0xfe, 0xb7, 0xcc, 0xfe, \n  0x2c, 0x59, 0xff, 0x56, 0xaa, 0xff, 0xdd, 0x3a, 0x18, 0x59, 0xf3, 0x21, 0x82, 0xb0, 0x0d, 0x3d, \n  0x33, 0x09, 0x94, 0x21, 0x07, 0xa6, 0x22, 0x00, 0x0d, 0x75, 0x03, 0x9c, 0x13, 0x01, 0x4a, 0x03, \n  0xf9, 0xc5, 0x64, 0xf5, 0xca, 0xa9, 0xfc, 0x94, 0x8b, 0x03, 0x4f, 0xe3, 0xff, 0x5b, 0x5b, 0xfd, \n  0xaf, 0xd4, 0xfb, 0x7b, 0xb0, 0xfb, 0x7e, 0x34, 0xfe, 0x80, 0x44, 0xff, 0x89, 0x81, 0xff, 0xfc, \n  0x6d, 0xff, 0xeb, 0x23, 0x00, 0x09, 0x51, 0xff, 0x55, 0xc1, 0xfe, 0xda, 0x7e, 0xff, 0xfb, 0xaf, \n  0xfe, 0xe8, 0xf3, 0xfe, 0x98, 0xd5, 0xfe, 0xb7, 0xe3, 0xfd, 0xcb, 0x38, 0xfe, 0x5a, 0xd9, 0xfe, \n  0x13, 0x67, 0xff, 0x26, 0x97, 0xff, 0xfd, 0x9b, 0x19, 0xa4, 0xa1, 0x24, 0x3b, 0x3f, 0x0f, 0x58, \n  0xb2, 0x09, 0x2a, 0x88, 0x07, 0xa9, 0xa3, 0xff, 0xf2, 0xe9, 0x02, 0x75, 0xca, 0x00, 0x6d, 0x37, \n  0xf8, 0x2a, 0x28, 0xf5, 0x4e, 0x87, 0xfc, 0x33, 0x72, 0x02, 0x7a, 0x2b, 0xff, 0x76, 0x93, 0xfd, \n  0x3f, 0xf8, 0xfb, 0x06, 0x8b, 0xfb, 0x7c, 0xea, 0xfd, 0x78, 0xca, 0xfe, 0x84, 0x82, 0xff, 0x4a, \n  0xcb, 0xff, 0xe8, 0x06, 0x00, 0x67, 0xfe, 0xfe, 0x5f, 0x88, 0xfe, 0xfe, 0x42, 0xff, 0x5c, 0x73, \n  0xfe, 0x06, 0xba, 0xfe, 0xf8, 0x8b, 0xfe, 0x3d, 0xa5, 0xfd, 0xc8, 0x16, 0xfe, 0xc8, 0x97, 0xfe, \n  0xa8, 0x33, 0xff, 0x36, 0x89, 0xff, 0x48, 0x4a, 0x1b, 0xc6, 0xb1, 0x25, 0x84, 0xbf, 0x0e, 0x0c, \n  0xab, 0x0a, 0x87, 0xec, 0x08, 0xe8, 0xdc, 0xff, 0x31, 0x71, 0x02, 0x41, 0x9b, 0xff, 0x6d, 0x2b, \n  0xf7, 0x34, 0x3f, 0xf6, 0xe0, 0xe3, 0xfe, 0x7c, 0x9b, 0x01, 0x73, 0x09, 0xfc, 0xe8, 0x5e, 0xfc, \n  0x04, 0x85, 0xfc, 0x74, 0xf8, 0xfc, 0x68, 0x40, 0xff, 0x24, 0x99, 0xfe, 0xf7, 0x8f, 0xfe, 0x7d, \n  0x9b, 0xff, 0xc4, 0x3b, 0x00, 0x03, 0xdb, 0xfe, 0x69, 0xa2, 0xfe, 0x29, 0x5f, 0xff, 0x1f, 0x33, \n  0xfe, 0xd2, 0x88, 0xfe, 0x7a, 0x27, 0xfe, 0xd8, 0x23, 0xfd, 0xfb, 0xeb, 0xfd, 0x25, 0x70, 0xfe, \n  0x25, 0xc4, 0xfe, 0x56, 0x2c, 0xff, 0x98, 0x09, 0x1f, 0x46, 0x54, 0x29, 0x19, 0x99, 0x0c, 0x6e, \n  0xaa, 0x07, 0x6c, 0xc8, 0x06, 0xc8, 0x76, 0xfe, 0x06, 0x67, 0x04, 0x49, 0xad, 0x01, 0x73, 0xc0, \n  0xf6, 0x8f, 0x35, 0xf5, 0x66, 0x7e, 0x00, 0xad, 0xc6, 0x04, 0xcd, 0x2b, 0xfc, 0xb4, 0x52, 0xfa, \n  0xf9, 0xa2, 0xfa, 0xba, 0x4b, 0xfc, 0x1e, 0x04, 0x00, 0xc4, 0xe4, 0xfe, 0x93, 0xa9, 0xfd, 0x81, \n  0xbf, 0xfe, 0xa2, 0x52, 0x00, 0xf3, 0xb2, 0xfe, 0x4d, 0x1a, 0xfe, 0xea, 0x65, 0xff, 0x68, 0x1f, \n  0xfe, 0x8b, 0x98, 0xfe, 0xa9, 0x38, 0xfe, 0x0f, 0xa4, 0xfc, 0xc0, 0x92, 0xfd, 0x44, 0x8b, 0xfe, \n  0xed, 0xf3, 0xfe, 0xbe, 0x28, 0xff, 0xf2, 0x3d, 0x20, 0x13, 0xdd, 0x2a, 0x3d, 0x8d, 0x0d, 0x9f, \n  0x8c, 0x07, 0x90, 0x0c, 0x05, 0x0f, 0xa1, 0xfd, 0x53, 0xba, 0x04, 0x70, 0x7c, 0x02, 0x76, 0x2e, \n  0xf7, 0x6a, 0x0a, 0xf3, 0x7e, 0x28, 0xff, 0xc9, 0xd4, 0x06, 0xa0, 0x09, 0xff, 0x43, 0xd2, 0xfa, \n  0xcf, 0xf7, 0xf7, 0x50, 0xe4, 0xf9, 0x2c, 0x02, 0x00, 0x43, 0x8e, 0x00, 0xbd, 0x84, 0xfe, 0xd3, \n  0xd1, 0xfd, 0xdd, 0xbc, 0xff, 0x89, 0x86, 0xfe, 0x78, 0xde, 0xfd, 0x07, 0x1f, 0xff, 0xba, 0xc0, \n  0xfd, 0x1c, 0x97, 0xfe, 0x2b, 0x64, 0xfe, 0xe7, 0xe1, 0xfc, 0x81, 0x8b, 0xfd, 0x98, 0x81, 0xfe, \n  0x6e, 0x35, 0xff, 0xf7, 0x35, 0xff, 0x64, 0xb7, 0x1e, 0x53, 0xbf, 0x29, 0xc7, 0x4a, 0x10, 0x20, \n  0x18, 0x0a, 0xb3, 0xbc, 0x05, 0x9d, 0x25, 0xfe, 0x0f, 0x58, 0x03, 0x17, 0xa0, 0x01, 0xd2, 0xa4, \n  0xf7, 0xfc, 0x5c, 0xf1, 0x6f, 0x56, 0xfc, 0xd4, 0x6d, 0x05, 0xbe, 0x9c, 0x00, 0x71, 0xf2, 0xfe, \n  0xbb, 0x80, 0xf9, 0xb9, 0x0e, 0xf7, 0xd8, 0xed, 0xfd, 0xa2, 0xf5, 0x00, 0x5a, 0xe6, 0xff, 0xb2, \n  0xf1, 0xfe, 0xd2, 0x8b, 0xff, 0xe8, 0x88, 0xfe, 0x03, 0x4d, 0xfe, 0x71, 0x1a, 0xff, 0xe4, 0xb4, \n  0xfd, 0x99, 0xbf, 0xfe, 0x06, 0x73, 0xfe, 0x32, 0x79, 0xfc, 0xd4, 0x52, 0xfd, 0xb8, 0x2f, 0xfe, \n  0xca, 0xe1, 0xfe, 0x33, 0x7c, 0xff, 0x39, 0xd2, 0x1c, 0xf8, 0xe9, 0x27, 0xab, 0x7f, 0x0f, 0xe2, \n  0x81, 0x0a, 0x73, 0xfb, 0x07, 0xfd, 0xf3, 0xfe, 0x8b, 0x8c, 0x02, 0x59, 0x7f, 0x00, 0x80, 0xc8, \n  0xf8, 0xde, 0x2b, 0xf4, 0x5b, 0xda, 0xfa, 0x8f, 0x2d, 0x04, 0x86, 0x71, 0x00, 0xc9, 0x24, 0xfd, \n  0xc5, 0x66, 0xfc, 0x3d, 0x6d, 0xf9, 0xd7, 0x65, 0xfa, 0x02, 0x9a, 0xfe, 0x14, 0x66, 0x00, 0x27, \n  0xae, 0xff, 0x2e, 0x2a, 0x00, 0x36, 0x6e, 0xff, 0xbc, 0x82, 0xfe, 0x62, 0xa3, 0xfe, 0x3c, 0x78, \n  0xfd, 0x5c, 0x01, 0xfe, 0x68, 0xc2, 0xfe, 0x09, 0xad, 0xfd, 0xd3, 0x62, 0xfd, 0x6a, 0x44, 0xfe, \n  0x93, 0x13, 0xff, 0x23, 0x6e, 0xff, 0xb0, 0xb1, 0x1d, 0x55, 0x5f, 0x25, 0x5f, 0xe1, 0x0b, 0xe7, \n  0xaa, 0x0c, 0x01, 0x89, 0x0a, 0x6b, 0xa2, 0xfd, 0xec, 0xc7, 0x01, 0x08, 0xe7, 0x01, 0x9e, 0xca, \n  0xfa, 0x3d, 0xde, 0xf4, 0x21, 0x28, 0xf9, 0xaf, 0xb6, 0x02, 0x11, 0xc3, 0x01, 0xd8, 0xb5, 0xfd, \n  0xf8, 0x27, 0xfd, 0x60, 0xc6, 0xfc, 0x17, 0xfa, 0xf9, 0x79, 0xf6, 0xfb, 0x23, 0xb5, 0x00, 0xa1, \n  0x5e, 0xff, 0xda, 0xa4, 0xfe, 0x4b, 0x9a, 0xfe, 0x78, 0xb9, 0xfd, 0x39, 0x5a, 0xfe, 0xa6, 0x4b, \n  0xfe, 0xcb, 0x53, 0xfe, 0x34, 0x8e, 0xfe, 0x37, 0x4a, 0xfe, 0x6c, 0xb0, 0xfd, 0x3a, 0xaa, 0xfe, \n  0x9d, 0x28, 0x00, 0x6b, 0xb8, 0xff, 0x21, 0x6d, 0x1a, 0x46, 0x91, 0x22, 0x96, 0xd1, 0x0c, 0x65, \n  0x0e, 0x0c, 0xb7, 0x52, 0x09, 0xed, 0x92, 0xfe, 0x91, 0x6d, 0x02, 0x3d, 0x39, 0x01, 0x6b, 0x32, \n  0xfa, 0xc2, 0xb9, 0xf6, 0x48, 0x0f, 0xfb, 0x24, 0x37, 0x01, 0x23, 0xd6, 0xff, 0xf9, 0x09, 0xfe, \n  0x33, 0xb4, 0xfd, 0xf7, 0xd7, 0xfd, 0xe1, 0xb3, 0xfc, 0xa8, 0x3c, 0xfc, 0x22, 0x23, 0xff, 0xd0, \n  0x58, 0x00, 0xd4, 0xf8, 0xff, 0xd1, 0x8c, 0xfe, 0xb7, 0x02, 0xfe, 0x77, 0xf0, 0xfe, 0x5a, 0x8a, \n  0xfe, 0xc3, 0x9a, 0xfe, 0x24, 0x6a, 0xfe, 0x30, 0xec, 0xfd, 0x83, 0x41, 0xfe, 0xfe, 0xbf, 0xfe, \n  0x03, 0x47, 0xff, 0x21, 0x43, 0xff, 0x2d, 0x68, 0x18, 0x01, 0x0d, 0x20, 0x3c, 0xc3, 0x0b, 0x51, \n  0xf0, 0x09, 0xf2, 0x62, 0x08, 0x3c, 0x93, 0x00, 0x97, 0x38, 0x03, 0x39, 0xd0, 0x00, 0x47, 0x29, \n  0xfa, 0xdb, 0x44, 0xf7, 0xf6, 0x6c, 0xfc, 0xbb, 0x8d, 0x01, 0x02, 0x41, 0xff, 0x53, 0x2e, 0xfe, \n  0xc8, 0xd6, 0xfd, 0xd2, 0xf3, 0xfd, 0x89, 0xbc, 0xfd, 0x9c, 0x83, 0xfd, 0x73, 0xc5, 0xff, 0x81, \n  0x75, 0x00, 0x33, 0xe2, 0xff, 0xea, 0xa2, 0xfe, 0x4c, 0x7f, 0xfe, 0x7b, 0x50, 0xff, 0x85, 0x83, \n  0xfe, 0x5b, 0x75, 0xfe, 0xa5, 0x1b, 0xfe, 0x3f, 0xb2, 0xfd, 0xa3, 0x48, 0xfe, 0xeb, 0x9a, 0xfe, \n  0x4e, 0x2b, 0xff, 0xa5, 0x85, 0xff, 0x78, 0x90, 0x16, 0xc7, 0x9b, 0x1d, 0xa0, 0x9e, 0x0a, 0x07, \n  0x0f, 0x09, 0x6f, 0xff, 0x07, 0xbc, 0xb8, 0x00, 0xa7, 0x17, 0x03, 0xc3, 0xd5, 0x00, 0x52, 0x6a, \n  0xfa, 0x98, 0x16, 0xf8, 0xd0, 0x97, 0xfd, 0xae, 0xb4, 0x01, 0x4d, 0xdd, 0xfe, 0x7e, 0xa7, 0xfe, \n  0x9a, 0x77, 0xfe, 0xac, 0x05, 0xfe, 0x59, 0x6c, 0xfe, 0xa7, 0x7a, 0xfe, 0x46, 0x92, 0xff, 0xf0, \n  0xde, 0xff, 0xb4, 0xdb, 0xff, 0x92, 0xd9, 0xfe, 0xe1, 0xac, 0xfe, 0xc6, 0x5f, 0xff, 0x73, 0xa6, \n  0xfe, 0x81, 0xe1, 0xfe, 0x64, 0xa3, 0xfe, 0xe7, 0x05, 0xfe, 0x6d, 0x3c, 0xfe, 0xa8, 0x6b, 0xfe, \n  0xfe, 0x1e, 0xff, 0x21, 0x8f, 0xff, 0xd0, 0x9b, 0x14, 0x00, 0xf2, 0x1a, 0xec, 0xea, 0x09, 0xbf, \n  0x76, 0x08, 0x2b, 0xf3, 0x06, 0xee, 0xc6, 0x00, 0xa9, 0x8f, 0x03, 0x45, 0x2e, 0x01, 0x25, 0xe2, \n  0xfa, 0x47, 0xf2, 0xf8, 0xcc, 0xdd, 0xfe, 0xda, 0xcf, 0x02, 0x45, 0x99, 0xff, 0x6a, 0x3e, 0xff, \n  0xad, 0xc8, 0xfe, 0x7f, 0x2a, 0xfe, 0x53, 0x0c, 0xff, 0xdb, 0x1b, 0xff, 0xee, 0x64, 0xff, 0x8f, \n  0x87, 0xff, 0x72, 0xf3, 0xff, 0xb6, 0x2e, 0xff, 0xb6, 0x14, 0xff, 0xe5, 0xbe, 0xff, 0x2b, 0xe1, \n  0xfe, 0x35, 0x1b, 0xff, 0x01, 0xe0, 0xfe, 0x1c, 0x1a, 0xfe, 0x18, 0x6d, 0xfe, 0x5b, 0xc1, 0xfe, \n  0x9f, 0x3d, 0xff, 0x7e, 0x8d, 0xff, 0x50, 0xc7, 0x13, 0xc2, 0x76, 0x19, 0xbc, 0xb8, 0x08, 0x97, \n  0x5e, 0x07, 0x23, 0x38, 0x06, 0x18, 0xca, 0x00, 0x4e, 0x08, 0x04, 0xab, 0x37, 0x02, 0x7b, 0x50, \n  0xfc, 0xb6, 0x69, 0xfa, 0xc6, 0x2a, 0x00, 0xf7, 0xc1, 0x03, 0x9d, 0x1e, 0x00, 0x60, 0x33, 0xff, \n  0xbd, 0x51, 0xfe, 0x18, 0xcc, 0xfd, 0xdf, 0x25, 0xff, 0x75, 0x75, 0xff, 0x76, 0x99, 0xff, 0xff, \n  0x9c, 0xff, 0xa8, 0x0d, 0x00, 0xd9, 0x43, 0xff, 0x54, 0x08, 0xff, 0xa0, 0xb3, 0xff, 0xe9, 0x09, \n  0xff, 0x05, 0x63, 0xff, 0x76, 0x20, 0xff, 0xb7, 0x48, 0xfe, 0x9a, 0xa8, 0xfe, 0xa6, 0x12, 0xff, \n  0xf1, 0x7a, 0xff, 0x7c, 0x9d, 0xff, 0xe6, 0xbb, 0x13, 0x73, 0xf4, 0x19, 0x12, 0xa6, 0x09, 0x29, \n  0x30, 0x08, 0x9e, 0xd6, 0x06, 0xb6, 0x47, 0x01, 0xf8, 0x66, 0x04, 0x28, 0x2c, 0x02, 0x20, 0xd8, \n  0xfb, 0xea, 0xda, 0xf9, 0x82, 0xa8, 0xff, 0x24, 0x4f, 0x03, 0xa4, 0xbe, 0xff, 0x47, 0xd4, 0xfe, \n  0x0b, 0xf1, 0xfd, 0x25, 0xc0, 0xfd, 0x74, 0x64, 0xff, 0x90, 0x7b, 0xff, 0xd4, 0x5d, 0xff, 0x24, \n  0x6e, 0xff, 0xe8, 0x03, 0x00, 0xe1, 0x49, 0xff, 0x53, 0x26, 0xff, 0x6c, 0xe7, 0xff, 0xb7, 0x28, \n  0xff, 0x33, 0x84, 0xff, 0x6a, 0x69, 0xff, 0x0e, 0x7e, 0xfe, 0x55, 0x9b, 0xfe, 0xd0, 0xd0, 0xfe, \n  0x86, 0x06, 0xff, 0xa4, 0x26, 0xff, 0xf7, 0x11, 0x14, 0x77, 0x44, 0x1a, 0xc2, 0x5f, 0x09, 0x53, \n  0x92, 0x07, 0xcb, 0x4c, 0x06, 0x68, 0xfe, 0x00, 0x98, 0x5e, 0x04, 0x59, 0x44, 0x02, 0x96, 0xc2, \n  0xfb, 0xf0, 0x73, 0xf9, 0xd9, 0x6f, 0xff, 0x31, 0x7b, 0x03, 0x65, 0xca, 0xff, 0x9b, 0x8c, 0xfe, \n  0xe6, 0x87, 0xfd, 0xc1, 0x5a, 0xfd, 0x03, 0x6b, 0xff, 0xc0, 0x22, 0x00, 0x30, 0x26, 0x00, 0x5a, \n  0xe8, 0xff, 0xe0, 0x2c, 0x00, 0x84, 0x42, 0xff, 0x46, 0x00, 0xff, 0x3f, 0x9e, 0xff, 0x9c, 0xd1, \n  0xfe, 0x62, 0x32, 0xff, 0x66, 0x31, 0xff, 0x44, 0x9d, 0xfe, 0x84, 0x14, 0xff, 0x84, 0x4f, 0xff, \n  0xf9, 0x55, 0xff, 0x7e, 0x3b, 0xff, 0xc8, 0x06, 0x15, 0x0c, 0xd0, 0x1b, 0x93, 0xfc, 0x09, 0x59, \n  0x7c, 0x07, 0x49, 0xce, 0x05, 0xcd, 0x32, 0x00, 0x6f, 0xb7, 0x03, 0x39, 0x70, 0x01, 0x0f, 0xad, \n  0xfa, 0x76, 0x0a, 0xf8, 0xeb, 0x58, 0xfe, 0x97, 0xb2, 0x03, 0xa2, 0x83, 0x00, 0xc2, 0xe2, 0xfe, \n  0x6b, 0x8d, 0xfd, 0x9d, 0x45, 0xfd, 0x61, 0x42, 0xff, 0x39, 0xf3, 0xff, 0x91, 0x19, 0x00, 0x22, \n  0xeb, 0xff, 0x1b, 0x63, 0x00, 0x96, 0xbb, 0xff, 0xfb, 0x64, 0xff, 0xc1, 0xe8, 0xff, 0xc1, 0x08, \n  0xff, 0x4c, 0x3a, 0xff, 0x16, 0x14, 0xff, 0x89, 0x46, 0xfe, 0x8e, 0x98, 0xfe, 0xca, 0x1d, 0xff, \n  0x14, 0xa7, 0xff, 0x39, 0xff, 0xff, 0x6d, 0xca, 0x16, 0x17, 0x0f, 0x1e, 0xbc, 0x94, 0x0a, 0x7d, \n  0xf5, 0x07, 0xd0, 0x2f, 0x06, 0x0b, 0x14, 0x00, 0xcc, 0xce, 0x03, 0xc2, 0x06, 0x01, 0x96, 0x72, \n  0xf9, 0x04, 0x29, 0xf6, 0x02, 0x21, 0xfd, 0x8a, 0xe7, 0x03, 0x39, 0x69, 0x00, 0x7b, 0xf1, 0xfd, \n  0xac, 0x94, 0xfc, 0xff, 0x99, 0xfc, 0x77, 0x03, 0xff, 0x0a, 0x1f, 0x00, 0x45, 0x4a, 0x00, 0x68, \n  0x00, 0x00, 0x54, 0xb7, 0x00, 0xba, 0xec, 0xff, 0xf0, 0x46, 0xff, 0x41, 0xd7, 0xff, 0x80, 0xf8, \n  0xfe, 0x36, 0x3f, 0xff, 0xce, 0x3e, 0xff, 0x82, 0x73, 0xfe, 0x23, 0xcc, 0xfe, 0x75, 0x67, 0xff, \n  0xd0, 0xbd, 0xff, 0xc1, 0xb8, 0xff, 0xea, 0xda, 0x19, 0x91, 0x41, 0x21, 0xaa, 0x4a, 0x0a, 0x9a, \n  0x0a, 0x08, 0x4f, 0xa3, 0x06, 0x42, 0xb4, 0xff, 0xab, 0xff, 0x03, 0x5a, 0x6c, 0x00, 0x58, 0xe2, \n  0xf7, 0x97, 0xb1, 0xf4, 0xec, 0x0c, 0xfd, 0x2b, 0xce, 0x04, 0x64, 0x22, 0x00, 0xa4, 0xf2, 0xfc, \n  0x1f, 0xa1, 0xfb, 0x6c, 0xee, 0xfb, 0x3e, 0xa0, 0xfe, 0xcb, 0xa0, 0xff, 0xab, 0xcb, 0xff, 0x55, \n  0x85, 0xff, 0x8a, 0x71, 0x00, 0x56, 0x8b, 0xff, 0xfb, 0xde, 0xfe, 0x5b, 0xd6, 0xff, 0x2b, 0x05, \n  0xff, 0x15, 0x44, 0xff, 0x46, 0x14, 0xff, 0x9f, 0x29, 0xfe, 0x9d, 0x92, 0xfe, 0xb8, 0x3c, 0xff, \n  0x93, 0xc3, 0xff, 0xff, 0xcd, 0xff, 0x79, 0x58, 0x1c, 0xa9, 0xcf, 0x24, 0x34, 0xdb, 0x0a, 0xcb, \n  0xc5, 0x07, 0xf3, 0xe7, 0x06, 0xe4, 0x34, 0xff, 0x53, 0xfa, 0x03, 0x62, 0xf7, 0xff, 0xd9, 0x4d, \n  0xf6, 0x79, 0xd7, 0xf3, 0xb1, 0x11, 0xfd, 0x83, 0xb7, 0x04, 0xd2, 0xef, 0xff, 0x97, 0xdf, 0xfc, \n  0x9d, 0x0e, 0xfb, 0x63, 0x57, 0xfb, 0x8a, 0x6c, 0xfe, 0x6a, 0x50, 0xff, 0xeb, 0xde, 0xff, 0x20, \n  0x9a, 0xff, 0x9e, 0x27, 0x00, 0x58, 0x56, 0xff, 0x43, 0xa8, 0xfe, 0xa9, 0x76, 0xff, 0xb0, 0x76, \n  0xfe, 0x1f, 0xda, 0xfe, 0xeb, 0xb2, 0xfe, 0xec, 0xce, 0xfd, 0xbd, 0x75, 0xfe, 0xaa, 0x20, 0xff, \n  0x23, 0xcb, 0xff, 0xc2, 0xd4, 0xff, 0x5d, 0x11, 0x1d, 0x73, 0x11, 0x27, 0xe9, 0x0e, 0x0d, 0xe3, \n  0xaa, 0x08, 0xef, 0x63, 0x07, 0x46, 0x6a, 0xfe, 0xcb, 0xe1, 0x02, 0x80, 0xef, 0xff, 0xad, 0x20, \n  0xf6, 0x72, 0x65, 0xf4, 0xcf, 0xd2, 0xfc, 0xa3, 0x4a, 0x02, 0xdd, 0xce, 0xfe, 0x50, 0xb3, 0xfd, \n  0x62, 0xe5, 0xfb, 0x37, 0x8b, 0xfb, 0xff, 0xfe, 0xfd, 0x50, 0x9c, 0xfe, 0x56, 0xf5, 0xff, 0x49, \n  0x60, 0x00, 0xc8, 0x10, 0x00, 0x7b, 0xd2, 0xfe, 0x9c, 0x74, 0xfe, 0x17, 0x5e, 0xff, 0xa4, 0x8b, \n  0xfe, 0x30, 0xd1, 0xfe, 0xe4, 0x7b, 0xfe, 0x19, 0xb0, 0xfd, 0x24, 0x58, 0xfe, 0xa8, 0xaf, 0xfe, \n  0xe6, 0x60, 0xff, 0xa8, 0xbe, 0xff, 0xbe, 0x06, 0x1e, 0xbc, 0xf0, 0x27, 0x35, 0xcc, 0x0d, 0x31, \n  0x72, 0x0a, 0x9d, 0x29, 0x09, 0x6a, 0xb3, 0xfe, 0x0a, 0x90, 0x01, 0x74, 0x5b, 0xfe, 0xe5, 0x3a, \n  0xf5, 0xd5, 0xa0, 0xf5, 0x46, 0x9f, 0xfe, 0x1a, 0x3c, 0x00, 0x9b, 0xcb, 0xfb, 0x52, 0x8d, 0xfd, \n  0x12, 0x3a, 0xfd, 0x6a, 0x4a, 0xfd, 0x4a, 0xbe, 0xfe, 0x5e, 0x86, 0xfd, 0x40, 0xc0, 0xfe, 0x43, \n  0x6d, 0x00, 0xd9, 0x66, 0x00, 0xba, 0xf0, 0xfe, 0x48, 0xe2, 0xfe, 0x70, 0x80, 0xff, 0xf6, 0x5e, \n  0xfe, 0x7e, 0xac, 0xfe, 0x40, 0x12, 0xfe, 0x5d, 0x41, 0xfd, 0xae, 0x2e, 0xfe, 0x7b, 0x58, 0xfe, \n  0x3c, 0xc5, 0xfe, 0xd1, 0x66, 0xff, 0x8f, 0xfb, 0x20, 0x97, 0x04, 0x29, 0x7b, 0x89, 0x0b, 0xaa, \n  0x11, 0x0b, 0x07, 0x56, 0x0a, 0x32, 0x7c, 0xfe, 0xea, 0xb0, 0x01, 0x18, 0x52, 0xfd, 0x4a, 0x11, \n  0xf4, 0x15, 0x48, 0xf7, 0xdf, 0xff, 0x01, 0xfa, 0x94, 0xff, 0x6c, 0xbc, 0xf7, 0xe6, 0xe2, 0xfb, \n  0x9c, 0x9a, 0xfd, 0x68, 0xb7, 0xfe, 0xd1, 0xa6, 0x00, 0x8f, 0xb8, 0xfd, 0x54, 0xca, 0xfd, 0x90, \n  0x3d, 0x00, 0xb9, 0x9e, 0x00, 0x58, 0x70, 0xfe, 0x7f, 0xbb, 0xfe, 0x11, 0x98, 0xff, 0xd0, 0xec, \n  0xfd, 0x3f, 0x72, 0xfe, 0x3d, 0xa2, 0xfd, 0xfa, 0xa2, 0xfc, 0x8c, 0x1e, 0xfe, 0xd1, 0x62, 0xfe, \n  0x4c, 0x6a, 0xfe, 0xe3, 0x09, 0xff, 0x6d, 0x48, 0x25, 0x25, 0x99, 0x2d, 0x2a, 0x88, 0x08, 0x89, \n  0xcd, 0x06, 0xfd, 0xc6, 0x08, 0x12, 0x61, 0xfd, 0x46, 0xfd, 0x03, 0xb5, 0x0f, 0x00, 0x3b, 0xf7, \n  0xf2, 0x09, 0x0a, 0xf6, 0x5e, 0x5e, 0x04, 0xf8, 0x9b, 0x02, 0x3a, 0xc2, 0xf6, 0xfd, 0x4c, 0xf9, \n  0x35, 0x7c, 0xfc, 0xde, 0xdb, 0xfe, 0x33, 0xe0, 0x01, 0xa4, 0x32, 0xfe, 0xac, 0xc1, 0xfc, 0x70, \n  0x8b, 0xff, 0x18, 0x03, 0x01, 0xa4, 0x5d, 0xfe, 0xf8, 0x2c, 0xfe, 0x5a, 0xa1, 0xff, 0x62, 0xc7, \n  0xfd, 0x43, 0x58, 0xfe, 0x26, 0x89, 0xfd, 0x9f, 0xf6, 0xfb, 0xd1, 0xdf, 0xfd, 0x0a, 0xa5, 0xfe, \n  0x2b, 0x6c, 0xfe, 0x2b, 0xb4, 0xfe, 0xe3, 0xb5, 0x29, 0x85, 0x4f, 0x30, 0x1a, 0x55, 0x05, 0xc1, \n  0xb0, 0x04, 0x75, 0x52, 0x06, 0x0d, 0xf2, 0xfb, 0xb7, 0xba, 0x06, 0x4a, 0x8d, 0x01, 0x65, 0x6a, \n  0xf2, 0x4b, 0xf6, 0xf4, 0xb6, 0x10, 0x06, 0x11, 0x7a, 0x06, 0x1e, 0x08, 0xf7, 0x47, 0x06, 0xf7, \n  0x2b, 0xdb, 0xf9, 0x52, 0xc4, 0xfd, 0x84, 0xac, 0x02, 0x4a, 0x2e, 0xfe, 0x00, 0x97, 0xfb, 0x0a, \n  0x84, 0xfe, 0x78, 0x1c, 0x01, 0x70, 0x0f, 0xfe, 0xbb, 0x8a, 0xfd, 0x03, 0xd3, 0xff, 0xf1, 0xbe, \n  0xfd, 0xf9, 0x9c, 0xfe, 0xa5, 0xc5, 0xfd, 0xbd, 0x73, 0xfb, 0x72, 0x76, 0xfd, 0xeb, 0xbf, 0xfe, \n  0x8e, 0xd2, 0xfe, 0x27, 0xf2, 0xfe, 0xf4, 0x03, 0x2c, 0xb7, 0x70, 0x32, 0x20, 0x48, 0x05, 0xc2, \n  0x80, 0x03, 0x4d, 0xa0, 0x03, 0x5b, 0x33, 0xfb, 0x7b, 0x51, 0x08, 0x93, 0x11, 0x03, 0x7a, 0xbb, \n  0xf2, 0xfc, 0x3a, 0xf2, 0x8c, 0x88, 0x05, 0xa9, 0x13, 0x0a, 0x46, 0x7f, 0xf9, 0x7d, 0x5a, 0xf6, \n  0x44, 0x41, 0xf6, 0xce, 0x24, 0xfb, 0x6b, 0x9e, 0x03, 0xdf, 0xf2, 0xff, 0x6e, 0x96, 0xfb, 0x3d, \n  0x52, 0xfd, 0xd5, 0x7a, 0x00, 0xed, 0xc5, 0xfd, 0x6e, 0x96, 0xfd, 0x13, 0xc5, 0xff, 0xd6, 0x28, \n  0xfd, 0xde, 0x7b, 0xfe, 0x36, 0x03, 0xfe, 0x6a, 0x9e, 0xfb, 0xdf, 0x92, 0xfd, 0x04, 0x18, 0xff, \n  0xf4, 0x24, 0xff, 0x4d, 0x0e, 0xff, 0x12, 0x84, 0x2c, 0xda, 0x81, 0x33, 0xe7, 0x0d, 0x07, 0x9b, \n  0x18, 0x04, 0x06, 0x4e, 0x02, 0x9e, 0x8b, 0xfa, 0xad, 0xc6, 0x07, 0x38, 0x59, 0x03, 0x81, 0x28, \n  0xf3, 0x8e, 0xc3, 0xef, 0x5a, 0xa0, 0x03, 0x30, 0xb7, 0x0b, 0x2c, 0x16, 0xfd, 0x71, 0x41, 0xf7, \n  0x4c, 0x70, 0xf3, 0x92, 0xfe, 0xf8, 0x69, 0x73, 0x03, 0xe5, 0x17, 0x02, 0x79, 0x10, 0xfd, 0x18, \n  0x0f, 0xfc, 0x6e, 0x06, 0x00, 0x93, 0xda, 0xfd, 0xbe, 0x0f, 0xfd, 0x65, 0x41, 0xff, 0x8d, 0xf9, \n  0xfc, 0x67, 0xb8, 0xfe, 0xf0, 0x2c, 0xfe, 0x35, 0xf6, 0xfb, 0x83, 0x51, 0xfd, 0xaa, 0xaa, 0xfe, \n  0x3d, 0x6e, 0xff, 0x9b, 0xfc, 0xfe, 0x50, 0x2b, 0x2b, 0xe7, 0x4b, 0x33, 0x4d, 0x8e, 0x0a, 0x27, \n  0xdc, 0x06, 0xf4, 0x40, 0x02, 0xb3, 0x1e, 0xfa, 0xa9, 0x8d, 0x06, 0x1a, 0xa4, 0x02, 0x6f, 0x41, \n  0xf3, 0x04, 0x9d, 0xed, 0x46, 0xb7, 0x00, 0x93, 0x24, 0x0b, 0xc3, 0x7a, 0x00, 0x6a, 0xd3, 0xfb, \n  0x67, 0xd3, 0xf2, 0x90, 0x83, 0xf5, 0xc3, 0x87, 0x02, 0x5a, 0x84, 0x03, 0x1e, 0x3c, 0xff, 0xd3, \n  0x38, 0xfc, 0xfb, 0xe5, 0xfe, 0xe8, 0x22, 0xfe, 0xc2, 0x55, 0xfd, 0xec, 0x1e, 0xff, 0x97, 0x48, \n  0xfd, 0x62, 0x3d, 0xff, 0x9b, 0x38, 0xfe, 0xa5, 0x99, 0xfb, 0x18, 0x22, 0xfd, 0x0b, 0x08, 0xfe, \n  0x53, 0x22, 0xff, 0x05, 0x0e, 0xff, 0x6e, 0xf6, 0x28, 0x93, 0x62, 0x31, 0x77, 0xcf, 0x0d, 0x0f, \n  0x2f, 0x09, 0x56, 0x11, 0x03, 0xab, 0x7e, 0xfb, 0x15, 0x61, 0x04, 0xce, 0xc4, 0x01, 0xb5, 0x86, \n  0xf4, 0xf0, 0xb9, 0xeb, 0x39, 0x93, 0xfd, 0xe1, 0x5b, 0x09, 0xfb, 0x3c, 0x01, 0x19, 0x65, 0x00, \n  0x8f, 0xb2, 0xf5, 0xc7, 0xd8, 0xf1, 0x27, 0x78, 0xff, 0xa7, 0xba, 0x03, 0x65, 0x30, 0x00, 0x6a, \n  0x3d, 0xfe, 0x70, 0x34, 0xff, 0xc9, 0xea, 0xfd, 0x29, 0x11, 0xfe, 0x1c, 0x14, 0xff, 0xac, 0xdd, \n  0xfc, 0x73, 0x1a, 0xff, 0x0d, 0x43, 0xfe, 0x0e, 0xfd, 0xfa, 0x0b, 0xee, 0xfc, 0x5d, 0xff, 0xfd, \n  0xfc, 0xc5, 0xfe, 0xaf, 0xbb, 0xff, 0x2c, 0x69, 0x26, 0x7e, 0x4b, 0x2f, 0x56, 0x2b, 0x0e, 0xeb, \n  0x23, 0x0b, 0xb7, 0xa9, 0x05, 0x06, 0x58, 0xfb, 0x33, 0x9e, 0x03, 0xdd, 0x77, 0x01, 0x08, 0x5c, \n  0xf5, 0xc8, 0x97, 0xec, 0x6d, 0x9b, 0xfa, 0xb2, 0xa0, 0x08, 0xaa, 0xe0, 0x00, 0xf7, 0x15, 0x00, \n  0x17, 0x81, 0xfa, 0x28, 0xfd, 0xf0, 0x24, 0x31, 0xfa, 0x1b, 0x28, 0x03, 0xcb, 0x8b, 0x01, 0xc3, \n  0xbc, 0xff, 0x8f, 0xd4, 0xff, 0x51, 0x01, 0xfe, 0xf1, 0x4b, 0xfe, 0x3c, 0x94, 0xff, 0xf5, 0x84, \n  0xfc, 0xb6, 0x41, 0xfd, 0x31, 0x97, 0xfe, 0x80, 0xdc, 0xfb, 0x61, 0xa7, 0xfc, 0xd1, 0x8c, 0xfe, \n  0xac, 0xf9, 0xfe, 0xce, 0xd1, 0xff, 0x6d, 0x8c, 0x24, 0x46, 0xb5, 0x2d, 0xfb, 0x90, 0x0c, 0x8a, \n  0x6c, 0x0a, 0x38, 0x2e, 0x08, 0xc7, 0xa9, 0xfc, 0x5c, 0x3d, 0x02, 0x8a, 0x60, 0xff, 0x9e, 0x8b, \n  0xf7, 0x9e, 0xed, 0xf1, 0x74, 0x38, 0xf9, 0x75, 0xdd, 0x06, 0x55, 0x42, 0x01, 0x9e, 0x44, 0xfc, \n  0x21, 0x04, 0xfd, 0x66, 0x7c, 0xf6, 0x3b, 0x75, 0xf6, 0xe3, 0x4d, 0xff, 0xec, 0x24, 0x02, 0x40, \n  0xd6, 0xff, 0x6c, 0x68, 0x00, 0x36, 0xcc, 0xff, 0xf0, 0x43, 0xfe, 0x53, 0xea, 0xfd, 0xc4, 0x74, \n  0xfc, 0x3e, 0x74, 0xfd, 0x80, 0x38, 0xff, 0x35, 0xb4, 0xfd, 0xbe, 0xb1, 0xfc, 0xa7, 0x25, 0xfe, \n  0x1b, 0x33, 0xff, 0x05, 0x8b, 0xff, 0x84, 0xc1, 0x21, 0x75, 0xd4, 0x29, 0xef, 0xa5, 0x0b, 0x18, \n  0x74, 0x0b, 0xda, 0xc0, 0x09, 0xd8, 0x54, 0xfd, 0xa9, 0xc3, 0x01, 0xbc, 0xf3, 0xff, 0x51, 0xe8, \n  0xf8, 0xe4, 0x8f, 0xf3, 0xbc, 0x1e, 0xf9, 0x05, 0xb4, 0x05, 0xbb, 0xa7, 0x02, 0xea, 0xd1, 0xfb, \n  0x96, 0x88, 0xfc, 0x83, 0x09, 0xfb, 0x48, 0x86, 0xf7, 0x2b, 0x21, 0xfc, 0x13, 0x77, 0x01, 0xa9, \n  0x68, 0xff, 0x3c, 0x15, 0xff, 0x97, 0x6a, 0xff, 0x15, 0x9e, 0xfe, 0xcb, 0x9b, 0xfe, 0x53, 0x7e, \n  0xfd, 0x65, 0xac, 0xfd, 0x4b, 0xde, 0xfe, 0xca, 0x73, 0xfe, 0x6d, 0x05, 0xfd, 0xec, 0xf6, 0xfd, \n  0xb5, 0xa5, 0xff, 0x0e, 0x74, 0xff, 0x0f, 0xe0, 0x21, 0x60, 0x3a, 0x26, 0xeb, 0xae, 0x08, 0x1f, \n  0x02, 0x0f, 0x31, 0x02, 0x0c, 0x58, 0xf4, 0xfa, 0xfd, 0x38, 0x01, 0xaf, 0x9f, 0x02, 0xae, 0x88, \n  0xfb, 0x78, 0xb5, 0xf3, 0x4a, 0xa7, 0xf6, 0x99, 0x87, 0x03, 0x02, 0xa7, 0x03, 0x13, 0x4d, 0xfd, \n  0x92, 0xf4, 0xfd, 0xc2, 0x64, 0xfd, 0x99, 0xbd, 0xf6, 0xba, 0xb2, 0xfa, 0x46, 0x89, 0x02, 0x56, \n  0x18, 0xff, 0x75, 0xb1, 0xfd, 0x12, 0x93, 0xfe, 0xa4, 0x30, 0xfd, 0xec, 0xe7, 0xfd, 0x8b, 0x7b, \n  0xfe, 0x1e, 0x18, 0xfe, 0x37, 0x9f, 0xfe, 0xe9, 0xd1, 0xfe, 0x5c, 0x5b, 0xfd, 0x6b, 0xd5, 0xfe, \n  0x0d, 0xef, 0x00, 0xa7, 0xbd, 0xff, 0xa7, 0xa1, 0x1d, 0x85, 0xa1, 0x23, 0x3d, 0x39, 0x0b, 0x41, \n  0xa7, 0x0e, 0x4b, 0x8a, 0x0a, 0x61, 0x76, 0xfb, 0xe3, 0x4b, 0x01, 0xdb, 0xa7, 0x01, 0xd3, 0xac, \n  0xfa, 0x1f, 0x86, 0xf6, 0x0e, 0xe8, 0xf8, 0x21, 0x9e, 0x00, 0x4f, 0x3e, 0x01, 0xae, 0x4b, 0xfe, \n  0x39, 0xf9, 0xfe, 0x4f, 0xf9, 0xfe, 0xf5, 0xe9, 0xf9, 0x14, 0xf8, 0xf9, 0x32, 0xdb, 0xff, 0xaf, \n  0xcb, 0x00, 0x30, 0xd2, 0xff, 0xde, 0x6b, 0xfe, 0xe5, 0x5b, 0xfd, 0x8c, 0x78, 0xfe, 0xbd, 0xba, \n  0xfe, 0xf9, 0xa8, 0xfe, 0xf0, 0xb9, 0xfe, 0x93, 0x7b, 0xfe, 0x5a, 0x10, 0xfe, 0xbc, 0xac, 0xfe, \n  0xcc, 0xca, 0xff, 0xc1, 0x68, 0xff, 0xe6, 0xf6, 0x1a, 0x74, 0x93, 0x20, 0x6c, 0xa5, 0x0a, 0x0b, \n  0x9b, 0x0c, 0xea, 0x51, 0x09, 0x96, 0x76, 0xfe, 0xc3, 0xde, 0x02, 0xc1, 0xcc, 0x00, 0x77, 0xae, \n  0xfa, 0xf3, 0x73, 0xf7, 0x4a, 0x3e, 0xfa, 0xf3, 0x8d, 0x00, 0xe9, 0x25, 0x00, 0x55, 0x66, 0xfe, \n  0xb0, 0xc1, 0xfe, 0x77, 0x2a, 0xff, 0x7a, 0x1f, 0xfc, 0x29, 0x3f, 0xfb, 0x0b, 0x00, 0x00, 0xa0, \n  0x46, 0x01, 0x01, 0xb0, 0xff, 0x2b, 0x3b, 0xfe, 0x57, 0x13, 0xfe, 0x07, 0x28, 0xff, 0xd3, 0xbd, \n  0xfe, 0xc9, 0x57, 0xfe, 0x8b, 0xfb, 0xfd, 0x25, 0xf6, 0xfd, 0x5e, 0x89, 0xfe, 0x30, 0xc9, 0xfe, \n  0x1d, 0x19, 0xff, 0xbe, 0x32, 0xff, 0xe6, 0xb0, 0x18, 0xe4, 0x37, 0x1e, 0xf1, 0xbd, 0x09, 0xa4, \n  0x50, 0x0a, 0x80, 0xe9, 0x08, 0x21, 0x93, 0x00, 0x9d, 0x0b, 0x03, 0x30, 0x62, 0x00, 0x3c, 0xb0, \n  0xfa, 0xff, 0x07, 0xf8, 0x04, 0xc6, 0xfb, 0xef, 0xbd, 0x00, 0xe6, 0x8d, 0xff, 0xa8, 0xb5, 0xfe, \n  0x94, 0x0a, 0xff, 0xef, 0x46, 0xff, 0x62, 0xfe, 0xfc, 0xbf, 0x82, 0xfc, 0x83, 0x88, 0x00, 0x6d, \n  0x33, 0x01, 0xb2, 0x98, 0xff, 0xd0, 0x56, 0xfe, 0x16, 0x85, 0xfe, 0x90, 0x65, 0xff, 0x59, 0xa2, \n  0xfe, 0x76, 0x44, 0xfe, 0x3e, 0xd0, 0xfd, 0x90, 0xe4, 0xfd, 0xb8, 0x87, 0xfe, 0xdd, 0x97, 0xfe, \n  0xf7, 0x39, 0xff, 0xae, 0xa0, 0xff, 0x7e, 0x9c, 0x16, 0x17, 0xa2, 0x1b, 0x55, 0xa7, 0x08, 0x48, \n  0x64, 0x09, 0xf6, 0xca, 0x08, 0x69, 0xf3, 0x00, 0x35, 0xbb, 0x02, 0xb3, 0x61, 0x00, 0x1b, 0xf7, \n  0xfa, 0xb9, 0xf0, 0xf8, 0xc0, 0x1f, 0xfd, 0xfa, 0xbe, 0x00, 0x76, 0x03, 0xff, 0xd5, 0x40, 0xff, \n  0x80, 0xa9, 0xff, 0x01, 0x43, 0xff, 0x47, 0xc3, 0xfd, 0x50, 0xb6, 0xfd, 0xba, 0x5d, 0x00, 0x3d, \n  0x7a, 0x00, 0x3a, 0x8b, 0xff, 0x43, 0x9a, 0xfe, 0xa4, 0xcb, 0xfe, 0x76, 0x76, 0xff, 0x59, 0x9e, \n  0xfe, 0x27, 0x8f, 0xfe, 0x02, 0x50, 0xfe, 0x2d, 0x51, 0xfe, 0x39, 0x96, 0xfe, 0xc4, 0x62, 0xfe, \n  0x5f, 0x20, 0xff, 0x3a, 0xb2, 0xff, 0xf8, 0x2c, 0x14, 0xbb, 0x1d, 0x19, 0x07, 0x46, 0x08, 0x75, \n  0x8a, 0x08, 0xa7, 0xaf, 0x07, 0xa5, 0x1c, 0x01, 0x96, 0x43, 0x03, 0x25, 0xa6, 0x00, 0xff, 0x33, \n  0xfb, 0xca, 0xb0, 0xf9, 0x2d, 0x2c, 0xfe, 0xda, 0x3b, 0x01, 0x40, 0x43, 0xff, 0x67, 0x0e, 0x00, \n  0x03, 0x20, 0x00, 0xb9, 0x36, 0xff, 0xe4, 0x97, 0xfe, 0x11, 0x6c, 0xfe, 0xba, 0xd1, 0xff, 0x0a, \n  0x09, 0x00, 0xa9, 0xbe, 0xff, 0x07, 0xd7, 0xfe, 0xb8, 0xfc, 0xfe, 0x5c, 0xd7, 0xff, 0xaf, 0x31, \n  0xff, 0xbd, 0x1d, 0xff, 0x7d, 0x99, 0xfe, 0xca, 0x35, 0xfe, 0x2f, 0x7f, 0xfe, 0x5a, 0x89, 0xfe, \n  0xb4, 0x42, 0xff, 0x3a, 0xb1, 0xff, 0xd4, 0x17, 0x12, 0x88, 0x3c, 0x16, 0x72, 0xbe, 0x07, 0xe9, \n  0x33, 0x08, 0x44, 0xc4, 0x06, 0x19, 0x44, 0x01, 0x1d, 0x98, 0x03, 0xe8, 0xf0, 0x00, 0x13, 0xdb, \n  0xfb, 0x6e, 0xc6, 0xfa, 0x76, 0x9e, 0xff, 0xf8, 0x59, 0x02, 0xad, 0xd9, 0xff, 0x9e, 0x78, 0x00, \n  0x03, 0x6f, 0x00, 0x68, 0x6c, 0xff, 0x09, 0x38, 0xff, 0x5f, 0xf9, 0xfe, 0x40, 0x80, 0xff, 0x20, \n  0xab, 0xff, 0xb5, 0xee, 0xff, 0x8e, 0x46, 0xff, 0xdf, 0x67, 0xff, 0xed, 0x01, 0x00, 0xb1, 0x2a, \n  0xff, 0x4c, 0x4e, 0xff, 0x44, 0xfe, 0xfe, 0x84, 0x6a, 0xfe, 0x16, 0xae, 0xfe, 0xc4, 0xd1, 0xfe, \n  0xb4, 0x50, 0xff, 0xe4, 0xa9, 0xff, 0x97, 0x12, 0x11, 0x96, 0x9e, 0x14, 0x5d, 0xb5, 0x06, 0x75, \n  0xf2, 0x06, 0x31, 0xa7, 0x05, 0x0c, 0x24, 0x01, 0xdc, 0x06, 0x04, 0x67, 0x06, 0x02, 0xb8, 0x30, \n  0xfd, 0x3b, 0x18, 0xfc, 0xb7, 0x1f, 0x01, 0x1d, 0xb4, 0x03, 0x3c, 0xbd, 0x00, 0xe1, 0xa7, 0x00, \n  0x4d, 0x1a, 0x00, 0x87, 0x12, 0xff, 0x03, 0x39, 0xff, 0x55, 0x38, 0xff, 0x6d, 0x9e, 0xff, 0x3f, \n  0xdc, 0xff, 0x99, 0x44, 0x00, 0x43, 0x6e, 0xff, 0xd1, 0x4e, 0xff, 0x15, 0xf7, 0xff, 0x46, 0x64, \n  0xff, 0x7f, 0x95, 0xff, 0x21, 0x29, 0xff, 0x8a, 0x86, 0xfe, 0x0e, 0xf1, 0xfe, 0xa9, 0x3e, 0xff, \n  0x24, 0x9e, 0xff, 0xd4, 0xcf, 0xff, 0xa6, 0x5e, 0x10, 0xfc, 0x97, 0x13, 0x27, 0xe6, 0x05, 0x09, \n  0xb6, 0x06, 0x24, 0x4a, 0x06, 0x18, 0xf9, 0x01, 0x22, 0xaf, 0x04, 0x5f, 0xc6, 0x02, 0x4e, 0x41, \n  0xfe, 0x68, 0x40, 0xfd, 0x35, 0xb2, 0x01, 0xad, 0xa0, 0x03, 0x8e, 0x3b, 0x00, 0xb4, 0xba, 0xff, \n  0x18, 0x25, 0xff, 0x5f, 0xdf, 0xfe, 0xef, 0xd6, 0xff, 0xa6, 0xcf, 0xff, 0xff, 0xc4, 0xff, 0xbc, \n  0x94, 0xff, 0xe2, 0xdd, 0xff, 0xd2, 0x58, 0xff, 0xa9, 0x66, 0xff, 0xb9, 0x0b, 0x00, 0x7b, 0x87, \n  0xff, 0x26, 0xea, 0xff, 0xec, 0x9f, 0xff, 0x4b, 0xcd, 0xfe, 0xc3, 0x05, 0xff, 0x14, 0x3e, 0xff, \n  0x55, 0x7d, 0xff, 0xf9, 0x80, 0xff, 0xdf, 0x92, 0x10, 0x5f, 0xb8, 0x14, 0xea, 0x82, 0x07, 0x4e, \n  0xca, 0x07, 0x57, 0xa3, 0x06, 0xb8, 0x2a, 0x02, 0x26, 0xf0, 0x04, 0x26, 0x77, 0x02, 0x46, 0x4a, \n  0xfd, 0x2d, 0x20, 0xfc, 0x61, 0xc7, 0x00, 0xec, 0x06, 0x03, 0x28, 0xfc, 0xff, 0x15, 0xb7, 0xff, \n  0x1d, 0x11, 0xff, 0x70, 0xe6, 0xfe, 0xc6, 0xea, 0xff, 0x66, 0x8b, 0xff, 0x2f, 0x5d, 0xff, 0x43, \n  0x80, 0xff, 0x4a, 0x11, 0x00, 0xfe, 0x71, 0xff, 0x0c, 0x80, 0xff, 0x1c, 0x44, 0x00, 0x72, 0x9d, \n  0xff, 0xd2, 0xf3, 0xff, 0x2f, 0xd4, 0xff, 0xa9, 0xf7, 0xfe, 0x8f, 0xe6, 0xfe, 0x78, 0xe1, 0xfe, \n  0x3d, 0xed, 0xfe, 0x0f, 0x04, 0xff, 0x66, 0xf7, 0x10, 0xe6, 0x02, 0x15, 0xf8, 0x39, 0x07, 0xfd, \n  0x43, 0x07, 0xbb, 0x4a, 0x06, 0xa8, 0x21, 0x02, 0xf8, 0x15, 0x05, 0xe4, 0xa2, 0x02, 0x44, 0x2a, \n  0xfd, 0x39, 0x95, 0xfb, 0xe1, 0x4a, 0x00, 0xa8, 0xee, 0x02, 0x0d, 0xec, 0xff, 0xd3, 0x61, 0xff, \n  0x85, 0xbd, 0xfe, 0xee, 0xbf, 0xfe, 0x7e, 0x29, 0x00, 0x59, 0x5b, 0x00, 0x9d, 0x2b, 0x00, 0x19, \n  0xc3, 0xff, 0xed, 0xec, 0xff, 0x3a, 0x4f, 0xff, 0x49, 0x5d, 0xff, 0x73, 0xdf, 0xff, 0x17, 0x2d, \n  0xff, 0xcd, 0xb6, 0xff, 0x87, 0xd3, 0xff, 0xaf, 0x61, 0xff, 0xcb, 0x87, 0xff, 0x4b, 0x2f, 0xff, \n  0xcb, 0xe8, 0xfe, 0xeb, 0xdd, 0xfe, 0x92, 0x97, 0x11, 0x8e, 0xba, 0x15, 0x92, 0xf9, 0x06, 0x0c, \n  0x64, 0x06, 0xc5, 0x2a, 0x05, 0x6e, 0x20, 0x01, 0x97, 0x96, 0x04, 0x0a, 0x7a, 0x02, 0x38, 0x01, \n  0xfd, 0x3e, 0x1d, 0xfb, 0x74, 0x4d, 0x00, 0x50, 0xc4, 0x03, 0x23, 0x9f, 0x00, 0x27, 0x94, 0xff, \n  0x7b, 0x31, 0xfe, 0xb2, 0xb4, 0xfd, 0x61, 0xb2, 0xff, 0xf3, 0x97, 0x00, 0x7c, 0xba, 0x00, 0x1b, \n  0xa9, 0x00, 0x18, 0xc0, 0x00, 0x2d, 0x88, 0xff, 0xc6, 0x4d, 0xff, 0x3f, 0xf0, 0xff, 0x52, 0x0b, \n  0xff, 0x93, 0x35, 0xff, 0x89, 0x51, 0xff, 0x7a, 0xf3, 0xfe, 0xf1, 0x60, 0xff, 0x3f, 0xd5, 0xff, \n  0x36, 0x05, 0x00, 0xe9, 0xb4, 0xff, 0xa5, 0xd1, 0x12, 0x45, 0xa5, 0x17, 0xdb, 0xa8, 0x07, 0xfb, \n  0x7b, 0x06, 0xf3, 0x01, 0x05, 0x29, 0x88, 0x00, 0xdf, 0x00, 0x04, 0xae, 0x5a, 0x01, 0x3e, 0x6f, \n  0xfb, 0xe4, 0x3f, 0xf9, 0xfb, 0xed, 0xfe, 0xc3, 0x03, 0x04, 0x4e, 0x3c, 0x01, 0xc2, 0xa1, 0xff, \n  0xe9, 0x5f, 0xfe, 0xd9, 0x28, 0xfe, 0x99, 0xcc, 0xff, 0xad, 0x63, 0x00, 0x77, 0x87, 0x00, 0x14, \n  0x2d, 0x00, 0xc6, 0x98, 0x00, 0xdc, 0x20, 0x00, 0x03, 0xd2, 0xff, 0x61, 0x37, 0x00, 0x68, 0x65, \n  0xff, 0xef, 0x7a, 0xff, 0x59, 0x51, 0xff, 0x6c, 0xab, 0xfe, 0x02, 0xef, 0xfe, 0x04, 0x68, 0xff, \n  0x29, 0xf2, 0xff, 0x7c, 0x56, 0x00, 0x7c, 0xb8, 0x14, 0xdc, 0xfc, 0x19, 0x80, 0x23, 0x08, 0xc9, \n  0xe2, 0x06, 0xe6, 0x56, 0x05, 0xc3, 0x49, 0x00, 0x93, 0xfb, 0x03, 0x0f, 0xc0, 0x00, 0xd6, 0x09, \n  0xfa, 0xfb, 0x41, 0xf7, 0xe4, 0xa5, 0xfd, 0x03, 0x43, 0x04, 0x54, 0x12, 0x01, 0xc0, 0xa0, 0xfe, \n  0xac, 0x81, 0xfd, 0x03, 0xab, 0xfd, 0x19, 0xda, 0xff, 0xa6, 0xe0, 0x00, 0x9f, 0xd3, 0x00, 0x70, \n  0x4b, 0x00, 0xdd, 0xe5, 0x00, 0xc9, 0x07, 0x00, 0x09, 0x97, 0xff, 0x23, 0x4b, 0x00, 0x30, 0x56, \n  0xff, 0x07, 0x8f, 0xff, 0xd5, 0x9b, 0xff, 0xc8, 0xe1, 0xfe, 0x58, 0x13, 0xff, 0xd6, 0xa2, 0xff, \n  0xcf, 0x14, 0x00, 0x35, 0xe8, 0xff, 0x54, 0xa7, 0x17, 0x9f, 0xb0, 0x1c, 0x37, 0xd6, 0x07, 0x83, \n  0x53, 0x07, 0xaa, 0xbe, 0x05, 0xbc, 0x0f, 0x00, 0x68, 0x69, 0x04, 0x38, 0x49, 0x00, 0xb3, 0x93, \n  0xf8, 0xbd, 0x4d, 0xf5, 0xcb, 0x15, 0xfd, 0x76, 0x3c, 0x05, 0xcd, 0xd1, 0x00, 0x50, 0x62, 0xfd, \n  0xae, 0x5f, 0xfc, 0x86, 0xcc, 0xfc, 0xb2, 0x3a, 0xff, 0x04, 0x70, 0x00, 0x86, 0x79, 0x00, 0x5a, \n  0x09, 0x00, 0x01, 0x15, 0x01, 0x75, 0x2d, 0x00, 0xe5, 0x7c, 0xff, 0xef, 0x4d, 0x00, 0x8b, 0x64, \n  0xff, 0x3c, 0x75, 0xff, 0x59, 0x7b, 0xff, 0x14, 0xf6, 0xfe, 0xf6, 0x28, 0xff, 0xab, 0xc1, 0xff, \n  0xce, 0x21, 0x00, 0x97, 0xcf, 0xff, 0xe8, 0x34, 0x1b, 0x57, 0xf9, 0x1f, 0x50, 0xe6, 0x06, 0xb8, \n  0x5b, 0x07, 0xe4, 0x52, 0x06, 0x1f, 0x7a, 0xff, 0x1a, 0x9b, 0x04, 0xf5, 0x86, 0xff, 0x17, 0xd2, \n  0xf6, 0x52, 0x17, 0xf4, 0x11, 0x78, 0xfd, 0x09, 0x41, 0x06, 0x3a, 0x52, 0x00, 0x6d, 0x59, 0xfc, \n  0x06, 0x7d, 0xfb, 0x8f, 0x49, 0xfc, 0xdf, 0x04, 0xff, 0x89, 0xfb, 0xff, 0xeb, 0x13, 0x00, 0xb2, \n  0x8e, 0xff, 0xe0, 0xc9, 0x00, 0x0c, 0xca, 0xff, 0x6a, 0xf4, 0xfe, 0xe3, 0x36, 0x00, 0xfc, 0x63, \n  0xff, 0xcb, 0x8c, 0xff, 0x63, 0x4f, 0xff, 0x1d, 0x79, 0xfe, 0x6f, 0xeb, 0xfe, 0x41, 0x9f, 0xff, \n  0x71, 0x1c, 0x00, 0x33, 0xfa, 0xff, 0xb7, 0x63, 0x1e, 0xb5, 0xb6, 0x23, 0x1a, 0x82, 0x06, 0xe3, \n  0xe8, 0x06, 0x3f, 0xf2, 0x06, 0x35, 0xff, 0xfe, 0x66, 0xa6, 0x04, 0x2e, 0xe7, 0xfe, 0x11, 0xf9, \n  0xf4, 0x5a, 0x2b, 0xf3, 0x68, 0xe3, 0xfd, 0x13, 0xbb, 0x06, 0xbf, 0x0c, 0x00, 0xda, 0xe8, 0xfb, \n  0x36, 0xc9, 0xfa, 0x38, 0xd6, 0xfb, 0x46, 0x05, 0xff, 0x57, 0xad, 0xff, 0xd8, 0xdc, 0xff, 0x1c, \n  0x61, 0xff, 0xda, 0xa3, 0x00, 0x6a, 0xb5, 0xff, 0x93, 0xb1, 0xfe, 0x98, 0xc6, 0xff, 0x4b, 0xd4, \n  0xfe, 0x93, 0x45, 0xff, 0x09, 0xf9, 0xfe, 0xa7, 0x1d, 0xfe, 0x51, 0xd4, 0xfe, 0x02, 0x7c, 0xff, \n  0x69, 0x19, 0x00, 0xbd, 0xff, 0xff, 0xe2, 0x33, 0x20, 0xb3, 0x28, 0x27, 0xd6, 0xf6, 0x07, 0x96, \n  0xce, 0x06, 0x50, 0xe2, 0x06, 0x3d, 0xff, 0xfd, 0x18, 0x79, 0x04, 0xa5, 0xdb, 0xfe, 0x6a, 0xc5, \n  0xf3, 0x73, 0x0e, 0xf3, 0xd8, 0x6b, 0xfd, 0xda, 0x08, 0x05, 0x4a, 0xc5, 0xff, 0x9b, 0xd7, 0xfc, \n  0xa0, 0xab, 0xfa, 0x40, 0xfe, 0xfa, 0x33, 0x8b, 0xfe, 0xb6, 0x58, 0xff, 0x3e, 0x88, 0x00, 0xe2, \n  0x12, 0x00, 0x37, 0x0c, 0x00, 0x8e, 0x46, 0xff, 0xb3, 0x8a, 0xfe, 0xc0, 0x74, 0xff, 0x9c, 0x68, \n  0xfe, 0x23, 0xd3, 0xfe, 0xb1, 0x9b, 0xfe, 0xca, 0xde, 0xfd, 0xc3, 0xc6, 0xfe, 0xa6, 0x40, 0xff, \n  0x20, 0x11, 0x00, 0x25, 0x15, 0x00, 0x92, 0xc9, 0x20, 0xe7, 0x51, 0x29, 0x01, 0x56, 0x0a, 0x2d, \n  0xc7, 0x07, 0xb8, 0x79, 0x07, 0x8f, 0x0f, 0xfd, 0xe0, 0xf6, 0x02, 0x2c, 0xf2, 0xfe, 0x2c, 0xe3, \n  0xf3, 0x70, 0xfc, 0xf3, 0x9e, 0x26, 0xfd, 0xe6, 0xf0, 0x01, 0xe3, 0x9a, 0xfe, 0xe2, 0xf9, 0xfd, \n  0xc6, 0xc7, 0xfb, 0x6b, 0x8c, 0xfb, 0xb4, 0x03, 0xfe, 0x1d, 0x5d, 0xfe, 0xb9, 0x99, 0x00, 0x49, \n  0x02, 0x01, 0x76, 0xee, 0xff, 0xab, 0x9e, 0xfe, 0x3b, 0x67, 0xfe, 0x88, 0x7f, 0xff, 0x54, 0xad, \n  0xfe, 0x09, 0xe2, 0xfe, 0xf3, 0x61, 0xfe, 0x01, 0xca, 0xfd, 0xcc, 0xa2, 0xfe, 0x4b, 0xb8, 0xfe, \n  0x2c, 0x92, 0xff, 0x1e, 0xf7, 0xff, 0x01, 0x93, 0x21, 0x10, 0x59, 0x2a, 0xa0, 0xb2, 0x0b, 0x7c, \n  0xc4, 0x09, 0xe4, 0x2a, 0x09, 0x6c, 0x03, 0xfd, 0x45, 0x36, 0x01, 0xdf, 0x71, 0xfd, 0xa3, 0x1f, \n  0xf3, 0x96, 0x79, 0xf5, 0xfd, 0xe2, 0xfe, 0x34, 0x20, 0xff, 0x97, 0x77, 0xfb, 0x89, 0x7a, 0xfe, \n  0x3c, 0xa3, 0xfd, 0x9c, 0x44, 0xfd, 0x2a, 0x58, 0xfe, 0x24, 0xec, 0xfc, 0xdc, 0x5d, 0xff, 0x3f, \n  0x37, 0x01, 0x86, 0x4c, 0x00, 0x15, 0xee, 0xfe, 0xc7, 0xfb, 0xfe, 0x6b, 0x6f, 0xff, 0xc7, 0x60, \n  0xfe, 0x88, 0xce, 0xfe, 0x65, 0x13, 0xfe, 0xa0, 0x6e, 0xfd, 0xb0, 0x85, 0xfe, 0x73, 0x42, 0xfe, \n  0xc5, 0xd6, 0xfe, 0xd1, 0xb2, 0xff, 0x5d, 0xcb, 0x23, 0x45, 0xcc, 0x2a, 0x52, 0x7f, 0x0a, 0x8b, \n  0xa3, 0x0b, 0xd8, 0x14, 0x0b, 0x43, 0x21, 0xfd, 0x26, 0x1b, 0x00, 0xbf, 0x95, 0xfb, 0x57, 0x55, \n  0xf2, 0xb7, 0x3e, 0xf7, 0xe3, 0x73, 0x01, 0xce, 0xda, 0xfc, 0x24, 0xaa, 0xf7, 0x5a, 0x38, 0xfe, \n  0x97, 0x8f, 0xfe, 0x8e, 0x47, 0xff, 0xb0, 0xc8, 0xff, 0x9d, 0xce, 0xfb, 0x1d, 0x30, 0xfe, 0x8a, \n  0x88, 0x01, 0x6c, 0x99, 0x00, 0xc7, 0x6e, 0xfe, 0x15, 0x3d, 0xff, 0x15, 0xbd, 0xff, 0x3b, 0x20, \n  0xfe, 0xe4, 0xa2, 0xfe, 0x8b, 0x56, 0xfd, 0x6e, 0xc0, 0xfc, 0xd1, 0x6f, 0xfe, 0x3c, 0x17, 0xfe, \n  0x16, 0x5e, 0xfe, 0xc7, 0x5b, 0xff, 0x75, 0x96, 0x27, 0xf9, 0xca, 0x2b, 0x12, 0x39, 0x07, 0x52, \n  0x4c, 0x0c, 0xd0, 0x09, 0x0c, 0x27, 0x7c, 0xfc, 0x48, 0xde, 0x00, 0xb0, 0xae, 0xfa, 0x95, 0xec, \n  0xf0, 0x30, 0x7d, 0xf9, 0xcc, 0x79, 0x05, 0x89, 0x03, 0xfc, 0xeb, 0xee, 0xf2, 0xed, 0x7c, 0xfc, \n  0xab, 0x32, 0xff, 0x83, 0xaa, 0x00, 0x16, 0xe1, 0x01, 0xb0, 0x2f, 0xfc, 0x5c, 0x08, 0xfd, 0xa5, \n  0x48, 0x01, 0x46, 0xef, 0x00, 0x0a, 0xd3, 0xfd, 0xb3, 0xf8, 0xfe, 0x1a, 0xd4, 0xff, 0x98, 0x8b, \n  0xfd, 0xfb, 0x61, 0xfe, 0xad, 0xfe, 0xfc, 0xaa, 0x29, 0xfc, 0x67, 0x7e, 0xfe, 0x44, 0x41, 0xfe, \n  0xe2, 0xf7, 0xfd, 0xf6, 0xf6, 0xfe, 0x84, 0x6d, 0x2c, 0xcf, 0xf0, 0x2f, 0xc6, 0x36, 0x03, 0x08, \n  0x85, 0x08, 0xee, 0x54, 0x0b, 0x72, 0xaa, 0xfb, 0xa6, 0x0c, 0x03, 0xcc, 0xc6, 0xfc, 0xdd, 0x86, \n  0xef, 0xfc, 0xd1, 0xf8, 0x73, 0x9d, 0x08, 0xca, 0xa0, 0xfe, 0xa1, 0xbe, 0xf0, 0xf9, 0xa4, 0xf9, \n  0xd1, 0x8a, 0xfe, 0xa9, 0x63, 0x01, 0xc5, 0x7c, 0x03, 0x70, 0x78, 0xfc, 0xc2, 0xe5, 0xfb, 0x3e, \n  0xef, 0x00, 0x28, 0x61, 0x01, 0x31, 0x55, 0xfd, 0xea, 0x6e, 0xfe, 0x42, 0x2f, 0x00, 0x05, 0x53, \n  0xfd, 0x88, 0x15, 0xfe, 0xe0, 0xc0, 0xfc, 0x67, 0x84, 0xfb, 0xbe, 0x5f, 0xfe, 0x82, 0x86, 0xfe, \n  0x5a, 0xf8, 0xfd, 0x0d, 0x9c, 0xfe, 0x30, 0x6e, 0x32, 0x67, 0x31, 0x34, 0xbc, 0xfa, 0xfd, 0xc4, \n  0x4e, 0x04, 0x1b, 0x28, 0x09, 0x32, 0x39, 0xfa, 0x26, 0x19, 0x07, 0xb8, 0x92, 0xff, 0x1f, 0xa9, \n  0xed, 0xc4, 0x64, 0xf7, 0xb8, 0x67, 0x0b, 0x5b, 0xc5, 0x02, 0xa7, 0x31, 0xf0, 0x98, 0x8b, 0xf6, \n  0xaf, 0x74, 0xfc, 0xac, 0x4f, 0x01, 0x49, 0xd9, 0x04, 0x76, 0x39, 0xfc, 0x95, 0xfc, 0xf9, 0xba, \n  0x01, 0x00, 0xf1, 0x51, 0x02, 0x3a, 0x63, 0xfd, 0x2a, 0x7a, 0xfd, 0xaa, 0x39, 0x00, 0x89, 0x59, \n  0xfd, 0x06, 0x61, 0xfe, 0x38, 0xee, 0xfc, 0x01, 0xbf, 0xfa, 0x90, 0xfd, 0xfd, 0x74, 0xa6, 0xfe, \n  0x85, 0x05, 0xfe, 0xdc, 0x98, 0xfe, 0xab, 0xbf, 0x36, 0x58, 0x6c, 0x36, 0x4b, 0xb5, 0xfa, 0xec, \n  0xa3, 0x02, 0xdf, 0x94, 0x06, 0xc3, 0x08, 0xf9, 0x1a, 0x3a, 0x0a, 0x62, 0xdd, 0x00, 0xcf, 0x0b, \n  0xed, 0x84, 0xd4, 0xf5, 0x6f, 0x16, 0x0d, 0xe8, 0x0c, 0x07, 0x60, 0x15, 0xf0, 0x57, 0x2e, 0xf4, \n  0xd3, 0xd3, 0xf9, 0x26, 0xe9, 0xff, 0x8f, 0xa0, 0x05, 0xfa, 0x83, 0xfc, 0x32, 0x18, 0xf9, 0xde, \n  0xcc, 0xfe, 0x09, 0x33, 0x02, 0xf2, 0x0e, 0xfd, 0x4a, 0xfd, 0xfc, 0x0c, 0x82, 0x00, 0x53, 0x2f, \n  0xfd, 0x97, 0xb6, 0xfe, 0x64, 0x32, 0xfd, 0x77, 0x12, 0xfa, 0x11, 0xa1, 0xfd, 0x6f, 0x0b, 0xff, \n  0xd4, 0x97, 0xfe, 0xfa, 0xb4, 0xfe, 0x79, 0xa1, 0x39, 0xbd, 0xe1, 0x38, 0xe7, 0xa5, 0xf9, 0xbb, \n  0xdb, 0x00, 0xd7, 0x9a, 0x03, 0xd5, 0x67, 0xf8, 0x23, 0xe4, 0x0c, 0x37, 0x7c, 0x02, 0xe2, 0xd8, \n  0xec, 0x75, 0xc8, 0xf2, 0xbf, 0x1c, 0x0d, 0xc0, 0x89, 0x0b, 0x34, 0x04, 0xf2, 0xc4, 0xd7, 0xf2, \n  0xe7, 0xbd, 0xf5, 0xd7, 0x4f, 0xfd, 0xb2, 0x50, 0x07, 0x5c, 0x1a, 0xfe, 0xa4, 0x9a, 0xf8, 0x34, \n  0x6b, 0xfd, 0x5a, 0x84, 0x01, 0x3a, 0xdb, 0xfc, 0x77, 0x0e, 0xfd, 0x0b, 0x9b, 0x00, 0x0a, 0xad, \n  0xfc, 0xa5, 0x91, 0xfe, 0xc1, 0x51, 0xfd, 0x0c, 0x1f, 0xfa, 0x71, 0xdc, 0xfd, 0x8c, 0x7d, 0xff, \n  0xef, 0xf7, 0xfe, 0xde, 0xbf, 0xfe, 0x5a, 0x80, 0x3b, 0xe4, 0x33, 0x3a, 0xd0, 0xd2, 0xfa, 0x81, \n  0x92, 0x00, 0xd7, 0x17, 0x01, 0x77, 0x35, 0xf8, 0x2c, 0x14, 0x0d, 0x2c, 0x99, 0x03, 0x83, 0x8b, \n  0xed, 0x9f, 0x64, 0xef, 0x0d, 0x40, 0x0c, 0x33, 0xdf, 0x0e, 0x42, 0x47, 0xf5, 0x5e, 0x4a, 0xf2, \n  0x77, 0xdf, 0xf1, 0x96, 0x42, 0xfb, 0xe3, 0x27, 0x08, 0xc8, 0xa6, 0x00, 0x67, 0x15, 0xf9, 0x1e, \n  0xf2, 0xfb, 0x23, 0x47, 0x01, 0x1e, 0xac, 0xfc, 0x65, 0x06, 0xfd, 0xb5, 0x16, 0x00, 0xac, 0xe4, \n  0xfb, 0x2b, 0xca, 0xfe, 0xcf, 0xca, 0xfd, 0xd1, 0x8a, 0xfa, 0x2c, 0xae, 0xfd, 0xfe, 0x7c, 0xff, \n  0xbc, 0x3d, 0xff, 0x50, 0xe4, 0xfe, 0x36, 0x9f, 0x3b, 0x30, 0x52, 0x3b, 0x24, 0xf1, 0xfc, 0xb2, \n  0x31, 0x01, 0x6f, 0xbc, 0xff, 0xfb, 0x8a, 0xf7, 0x44, 0x63, 0x0c, 0xe2, 0xbe, 0x03, 0x7c, 0xe9, \n  0xed, 0xc9, 0x9e, 0xec, 0xef, 0x0f, 0x0a, 0x99, 0xbd, 0x10, 0xf5, 0x62, 0xf9, 0xc4, 0x25, 0xf3, \n  0x73, 0x9a, 0xee, 0xa6, 0x1e, 0xf9, 0xce, 0x1d, 0x08, 0xc6, 0x25, 0x03, 0xe5, 0xbc, 0xfa, 0x46, \n  0x2c, 0xfa, 0xb0, 0xe1, 0x00, 0xa3, 0xf6, 0xfc, 0xee, 0x34, 0xfc, 0xea, 0xa1, 0xff, 0xe6, 0xfa, \n  0xfb, 0xda, 0x14, 0xff, 0x24, 0xe0, 0xfd, 0xd3, 0xdc, 0xfa, 0x0b, 0x42, 0xfd, 0xa7, 0xee, 0xfe, \n  0x69, 0xab, 0xff, 0xdd, 0xa2, 0xfe, 0xa1, 0x20, 0x3a, 0x26, 0xcf, 0x3b, 0xfe, 0xe5, 0x00, 0x49, \n  0xbf, 0x03, 0x20, 0x2e, 0xff, 0x5a, 0xa9, 0xf6, 0x50, 0x5e, 0x0b, 0xf8, 0x07, 0x03, 0x82, 0xf7, \n  0xed, 0x4d, 0x42, 0xea, 0x58, 0xeb, 0x06, 0xfa, 0x0f, 0x11, 0x4c, 0xe2, 0xfd, 0xe9, 0x7b, 0xf7, \n  0x00, 0x8e, 0xec, 0xd3, 0x3f, 0xf5, 0x29, 0xdb, 0x07, 0x35, 0x41, 0x05, 0x11, 0x54, 0xfd, 0x10, \n  0x7d, 0xf9, 0x46, 0x74, 0xff, 0x83, 0x9d, 0xfd, 0x75, 0x1c, 0xfc, 0xc2, 0x86, 0xff, 0x3b, 0x8f, \n  0xfc, 0xa2, 0xae, 0xff, 0xeb, 0xc3, 0xfd, 0x2d, 0x68, 0xfa, 0x2c, 0x32, 0xfd, 0xea, 0x38, 0xfe, \n  0xe0, 0x87, 0xff, 0xf2, 0x96, 0xfe, 0xa3, 0xfe, 0x37, 0x53, 0xdf, 0x3a, 0xa8, 0x93, 0x05, 0x3f, \n  0x4b, 0x06, 0x6c, 0x15, 0xff, 0x40, 0x20, 0xf7, 0xc3, 0xf7, 0x08, 0x5e, 0xdc, 0x02, 0x81, 0xdf, \n  0xee, 0xa7, 0x34, 0xe7, 0x6a, 0xde, 0x03, 0xdc, 0xa7, 0x0f, 0x4f, 0x9e, 0x00, 0x97, 0x86, 0xfd, \n  0xa3, 0xfd, 0xec, 0xd9, 0xaa, 0xf0, 0xcc, 0x87, 0x06, 0x8d, 0x5d, 0x06, 0x1f, 0xd3, 0xfe, 0xa3, \n  0xe7, 0xfa, 0xfa, 0x86, 0xfe, 0x10, 0xa7, 0xfd, 0x38, 0x54, 0xfd, 0xe0, 0x22, 0xff, 0x82, 0x32, \n  0xfc, 0x4a, 0x36, 0x00, 0xca, 0x14, 0xfe, 0x28, 0xcd, 0xf9, 0xd9, 0xe5, 0xfc, 0xdd, 0x9d, 0xfd, \n  0xbe, 0xe9, 0xfe, 0xf4, 0x4b, 0xff, 0x18, 0x73, 0x35, 0xd8, 0x76, 0x38, 0xef, 0x2f, 0x09, 0x43, \n  0x76, 0x08, 0xaa, 0xd8, 0xff, 0xe9, 0xfe, 0xf8, 0x9a, 0x43, 0x06, 0x8e, 0xca, 0x01, 0xb9, 0xab, \n  0xf0, 0xe9, 0x4a, 0xe5, 0xc6, 0x7c, 0x00, 0x64, 0x13, 0x0e, 0xce, 0x2b, 0x01, 0xbb, 0x0f, 0x02, \n  0x54, 0x60, 0xf0, 0x37, 0x24, 0xec, 0xd9, 0xdc, 0x02, 0x94, 0xf2, 0x06, 0x34, 0xcc, 0xff, 0x64, \n  0x39, 0xfd, 0x7d, 0xef, 0xfe, 0xd7, 0x41, 0xfd, 0x4e, 0xf1, 0xfd, 0x0e, 0x17, 0xff, 0x0a, 0xd4, \n  0xfb, 0xef, 0xc5, 0xff, 0xc6, 0xef, 0xfd, 0x7a, 0x26, 0xf9, 0x5e, 0xcf, 0xfc, 0x4c, 0xdd, 0xfd, \n  0x77, 0xaf, 0xfe, 0xb2, 0x16, 0x00, 0x72, 0x47, 0x32, 0xce, 0xd0, 0x35, 0x21, 0x9f, 0x0a, 0x70, \n  0xe1, 0x0b, 0xf9, 0xe5, 0x01, 0x39, 0x22, 0xf8, 0x70, 0x87, 0x05, 0x6a, 0x31, 0x01, 0xdc, 0xd4, \n  0xf1, 0x89, 0xbc, 0xe5, 0xdf, 0x44, 0xfc, 0xbf, 0x4e, 0x0d, 0xc8, 0x5e, 0x01, 0x15, 0x2b, 0x03, \n  0xb1, 0x6f, 0xf5, 0xbb, 0x27, 0xe9, 0xfc, 0x38, 0xfd, 0x78, 0x92, 0x07, 0x90, 0x80, 0x01, 0x19, \n  0x8d, 0xfe, 0x4b, 0x44, 0xff, 0xb9, 0x83, 0xfd, 0x3a, 0x4f, 0xfe, 0xd9, 0x75, 0xff, 0x11, 0x51, \n  0xfb, 0xac, 0xb9, 0xfd, 0x9c, 0x66, 0xfe, 0x56, 0xfe, 0xf9, 0x5a, 0x63, 0xfc, 0xc9, 0x37, 0xfe, \n  0xb2, 0xba, 0xfe, 0xea, 0x9a, 0x00, 0x12, 0x31, 0x30, 0x77, 0x8e, 0x34, 0xf4, 0x60, 0x09, 0x41, \n  0xcf, 0x0b, 0x44, 0xb2, 0x05, 0xc2, 0xaa, 0xf7, 0x7a, 0x4a, 0x03, 0xcd, 0xa3, 0x01, 0xd8, 0x1a, \n  0xf4, 0x84, 0xc6, 0xe8, 0xc3, 0xb6, 0xf9, 0xea, 0x4c, 0x0c, 0x2b, 0x9e, 0x00, 0x46, 0xa1, 0xff, \n  0x70, 0x3c, 0xfb, 0x51, 0xf3, 0xeb, 0xf1, 0x74, 0xf6, 0xe9, 0x8b, 0x05, 0x5b, 0x23, 0x03, 0x88, \n  0xdd, 0xff, 0xb0, 0x7d, 0x00, 0x40, 0xeb, 0xfd, 0x57, 0xe6, 0xfd, 0x63, 0x09, 0xff, 0x65, 0x0b, \n  0xfb, 0xbd, 0xb5, 0xfc, 0x1e, 0x37, 0xff, 0xe0, 0x52, 0xfb, 0x4d, 0x46, 0xfc, 0x5d, 0x1c, 0xff, \n  0x30, 0xdb, 0xfe, 0x6c, 0xd6, 0xff, 0x2f, 0xc8, 0x2d, 0x8c, 0x1b, 0x33, 0xe5, 0xe6, 0x07, 0x7e, \n  0xeb, 0x0a, 0x26, 0x71, 0x08, 0x89, 0xd3, 0xf9, 0x45, 0x41, 0x02, 0x0f, 0x22, 0xfe, 0x8c, 0x7b, \n  0xf6, 0xab, 0x5e, 0xef, 0x71, 0x76, 0xf7, 0x9f, 0xbc, 0x0a, 0xf7, 0xce, 0x01, 0x8e, 0xe5, 0xfa, \n  0x4c, 0x0d, 0xfe, 0xed, 0x81, 0xf2, 0xa5, 0x18, 0xf2, 0x40, 0x59, 0x01, 0x8c, 0x43, 0x04, 0x9b, \n  0x8e, 0xff, 0xb2, 0xa4, 0x00, 0xb3, 0x3c, 0x00, 0x07, 0xd8, 0xfd, 0x22, 0x04, 0xfd, 0x43, 0x63, \n  0xfb, 0x34, 0x02, 0xfd, 0x0b, 0xfd, 0xff, 0x52, 0xa6, 0xfd, 0x3e, 0xc3, 0xfb, 0x38, 0x2b, 0xfe, \n  0x80, 0x64, 0xff, 0x8e, 0xa8, 0xff, 0x06, 0xf5, 0x2a, 0x57, 0x4c, 0x2f, 0x64, 0x28, 0x07, 0x2a, \n  0x2f, 0x0c, 0x79, 0x60, 0x0a, 0x66, 0xa5, 0xfa, 0xe5, 0x81, 0x01, 0x9d, 0x1b, 0xfe, 0x1e, 0x75, \n  0xf7, 0x57, 0xae, 0xf1, 0x06, 0xf9, 0xf7, 0xde, 0x6a, 0x09, 0x98, 0x1b, 0x03, 0x3a, 0xd9, 0xf9, \n  0x1e, 0xcb, 0xfd, 0xe6, 0x1f, 0xf8, 0x03, 0x03, 0xf2, 0x95, 0xda, 0xfc, 0x0f, 0xf9, 0x03, 0x05, \n  0x4b, 0xff, 0xab, 0x85, 0xff, 0xee, 0x7c, 0x00, 0xa0, 0x9d, 0xfe, 0x5b, 0x8b, 0xfd, 0x5c, 0xc9, \n  0xfb, 0x84, 0x13, 0xfd, 0xa3, 0x5c, 0x00, 0xb3, 0xf4, 0xfe, 0x84, 0x7b, 0xfb, 0x0b, 0x66, 0xfd, \n  0x33, 0x09, 0x00, 0xbc, 0x9d, 0xff, 0xe6, 0xa4, 0x26, 0x50, 0xab, 0x2a, 0xc1, 0xa4, 0x07, 0xca, \n  0xd9, 0x0d, 0x25, 0x57, 0x0b, 0x96, 0x85, 0xfa, 0x3c, 0x20, 0x01, 0x50, 0x78, 0x00, 0xcf, 0xee, \n  0xf9, 0xa0, 0x54, 0xf2, 0x9f, 0x2a, 0xf6, 0xee, 0x2c, 0x07, 0x84, 0x1c, 0x05, 0xd6, 0xd7, 0xfa, \n  0xd8, 0x2c, 0xfd, 0x34, 0xe4, 0xfb, 0xcf, 0x0a, 0xf4, 0x92, 0xec, 0xfa, 0xd5, 0x8c, 0x03, 0xc0, \n  0xda, 0xfe, 0x6b, 0xbb, 0xfd, 0xec, 0x4d, 0xff, 0xe4, 0x2e, 0xfe, 0xbb, 0x5c, 0xfe, 0xef, 0x0d, \n  0xfe, 0xdc, 0x71, 0xfd, 0x85, 0x82, 0xfe, 0xe8, 0xe2, 0xfe, 0x3d, 0xd6, 0xfc, 0xe4, 0x39, 0xfe, \n  0x3d, 0x69, 0x00, 0x9e, 0x66, 0xff, 0xa8, 0x6f, 0x26, 0x4e, 0x61, 0x26, 0x98, 0x2e, 0x05, 0xcb, \n  0x8c, 0x12, 0x5d, 0x44, 0x0d, 0xc0, 0x5c, 0xf7, 0xe0, 0xf6, 0x00, 0x6f, 0xcc, 0x03, 0xc9, 0x7d, \n  0xfc, 0x92, 0x03, 0xf2, 0xd4, 0x82, 0xf3, 0x5a, 0x28, 0x05, 0xa8, 0x0f, 0x06, 0xfb, 0x49, 0xfc, \n  0xf6, 0x12, 0xff, 0xcf, 0xf3, 0xfd, 0xd7, 0x68, 0xf2, 0x2a, 0xf1, 0xf9, 0xe9, 0x30, 0x05, 0x04, \n  0x4b, 0xfe, 0x3e, 0x8b, 0xfc, 0x8f, 0xd1, 0xfe, 0xb7, 0x85, 0xfc, 0x08, 0x74, 0xfd, 0x29, 0xe0, \n  0xfe, 0x4f, 0xba, 0xfd, 0x7b, 0xc6, 0xfe, 0x75, 0x80, 0xff, 0xd2, 0xc5, 0xfc, 0x62, 0x1e, 0xff, \n  0x4e, 0xdd, 0x01, 0xd4, 0x91, 0xff, 0x96, 0xdf, 0x20, 0xb5, 0x05, 0x24, 0xa0, 0x99, 0x09, 0xa8, \n  0xed, 0x11, 0xdd, 0x35, 0x0b, 0xf9, 0xaa, 0xf7, 0xe6, 0x8c, 0x00, 0x78, 0x85, 0x02, 0xf5, 0x62, \n  0xfb, 0xb8, 0x19, 0xf6, 0x39, 0x1b, 0xf6, 0x1b, 0x76, 0x00, 0xd0, 0x55, 0x03, 0x6a, 0x40, 0xfe, \n  0x8c, 0x87, 0x00, 0xc0, 0x04, 0x00, 0x94, 0x04, 0xf6, 0xc5, 0x09, 0xf8, 0xf5, 0x85, 0x01, 0x8d, \n  0x17, 0x01, 0x0a, 0x80, 0xff, 0x1f, 0x72, 0xfe, 0xe6, 0x9a, 0xfc, 0xc4, 0x0c, 0xfe, 0xf7, 0x1e, \n  0xff, 0x62, 0x9e, 0xfe, 0x16, 0x18, 0xff, 0xd0, 0x17, 0xff, 0x50, 0x95, 0xfd, 0xc3, 0x8e, 0xfe, \n  0xb6, 0x74, 0x00, 0xf1, 0x8a, 0xff, 0xb9, 0x53, 0x1d, 0x0d, 0xcc, 0x20, 0x83, 0x81, 0x09, 0x00, \n  0xc7, 0x0f, 0xa4, 0x52, 0x0a, 0xa3, 0x3f, 0xfb, 0x60, 0x24, 0x02, 0x30, 0x60, 0x01, 0x1b, 0x75, \n  0xfb, 0xe6, 0x7c, 0xf7, 0x7f, 0x6e, 0xf7, 0xce, 0xe0, 0xff, 0x8c, 0xec, 0x01, 0x5e, 0x85, 0xfe, \n  0xbb, 0x2c, 0x00, 0xe1, 0x70, 0x00, 0x08, 0x3d, 0xf9, 0xb3, 0xf5, 0xf8, 0xee, 0xfc, 0x00, 0x8c, \n  0x12, 0x02, 0xff, 0x46, 0xff, 0xe9, 0xca, 0xfd, 0x4c, 0x82, 0xfd, 0x8e, 0xe6, 0xfe, 0x28, 0x1a, \n  0xff, 0xdd, 0x42, 0xfe, 0xc8, 0x1c, 0xfe, 0xb2, 0x91, 0xfe, 0x00, 0x99, 0xfe, 0xfe, 0xe5, 0xfe, \n  0xd6, 0x5f, 0xff, 0xcb, 0x00, 0xff, 0x03, 0x8e, 0x1a, 0x0b, 0xe7, 0x1d, 0x61, 0x0a, 0x09, 0x21, \n  0xfc, 0x0c, 0x8e, 0x55, 0x09, 0x91, 0xde, 0xfe, 0x36, 0xd7, 0x02, 0xb7, 0x3b, 0x00, 0xff, 0x8c, \n  0xfb, 0x68, 0x2b, 0xf8, 0x65, 0x10, 0xf9, 0x1a, 0xdd, 0xff, 0x81, 0xeb, 0x00, 0xb5, 0xd0, 0xfe, \n  0x70, 0x06, 0x00, 0x9a, 0xa0, 0x00, 0x7b, 0xe6, 0xfa, 0xe3, 0x3a, 0xfa, 0x0d, 0x73, 0x01, 0xf6, \n  0x28, 0x02, 0x99, 0x0b, 0xff, 0x58, 0x05, 0xfe, 0xd3, 0x45, 0xfe, 0x3f, 0x31, 0xff, 0x13, 0xe9, \n  0xfe, 0xda, 0x06, 0xfe, 0xca, 0x85, 0xfd, 0x6b, 0x22, 0xfe, 0xca, 0xa4, 0xfe, 0xd1, 0xa8, 0xfe, \n  0x54, 0x37, 0xff, 0x4c, 0x63, 0xff, 0xf3, 0x8a, 0x17, 0x08, 0x51, 0x1b, 0x77, 0x34, 0x08, 0xa4, \n  0x7f, 0x0a, 0x61, 0x9c, 0x09, 0xf2, 0x1e, 0x01, 0xcc, 0x75, 0x02, 0x58, 0xfa, 0xff, 0xc5, 0xb7, \n  0xfb, 0xe1, 0x13, 0xf9, 0x51, 0xfa, 0xfa, 0x6e, 0xd1, 0xff, 0x36, 0x2d, 0x00, 0xa5, 0x7c, 0xff, \n  0xf8, 0xa2, 0x00, 0xef, 0x99, 0x00, 0x6f, 0xda, 0xfb, 0xd5, 0xe5, 0xfb, 0xd1, 0xdb, 0x01, 0x3c, \n  0xda, 0x01, 0xb7, 0x09, 0xff, 0x43, 0x11, 0xfe, 0x89, 0xb8, 0xfe, 0xbf, 0x98, 0xff, 0x16, 0xc7, \n  0xfe, 0x8c, 0xf2, 0xfd, 0x08, 0x88, 0xfd, 0x4a, 0x55, 0xfe, 0xc2, 0xd7, 0xfe, 0x78, 0x75, 0xfe, \n  0x00, 0x4d, 0xff, 0x73, 0xdc, 0xff, 0x48, 0x22, 0x15, 0x58, 0x6e, 0x18, 0xe3, 0x48, 0x07, 0xa6, \n  0xe3, 0x09, 0xfb, 0x7b, 0x09, 0xaf, 0x37, 0x01, 0x06, 0x08, 0x02, 0x24, 0x10, 0x00, 0x5d, 0x16, \n  0xfc, 0xed, 0x28, 0xfa, 0x29, 0x5e, 0xfc, 0x58, 0x90, 0xff, 0xac, 0x88, 0xff, 0xbe, 0x3c, 0x00, \n  0xac, 0x46, 0x01, 0xb0, 0x79, 0x00, 0x19, 0xd1, 0xfc, 0x04, 0x21, 0xfd, 0x9a, 0x42, 0x01, 0x6e, \n  0xe0, 0x00, 0x2e, 0x18, 0xff, 0xe7, 0x7b, 0xfe, 0x46, 0xfd, 0xfe, 0x82, 0x83, 0xff, 0xc7, 0xc4, \n  0xfe, 0x73, 0x6b, 0xfe, 0x75, 0x34, 0xfe, 0x7b, 0xcb, 0xfe, 0xcd, 0xc3, 0xfe, 0xcc, 0x2c, 0xfe, \n  0x55, 0x2f, 0xff, 0x79, 0xdf, 0xff, 0x48, 0x33, 0x12, 0x64, 0xc0, 0x15, 0xf9, 0x24, 0x07, 0xff, \n  0xf7, 0x08, 0xd8, 0x61, 0x08, 0x23, 0x83, 0x01, 0x85, 0x89, 0x02, 0xf6, 0x47, 0x00, 0x07, 0x5e, \n  0xfc, 0xb9, 0x16, 0xfb, 0xa4, 0x80, 0xfd, 0x10, 0xd6, 0xff, 0x76, 0x99, 0xff, 0x64, 0x30, 0x01, \n  0x98, 0xcb, 0x01, 0xb0, 0x56, 0x00, 0xfa, 0xd6, 0xfd, 0x14, 0xd7, 0xfd, 0xd0, 0x64, 0x00, 0x75, \n  0x6a, 0x00, 0xb4, 0x71, 0xff, 0x43, 0xbc, 0xfe, 0x20, 0x1e, 0xff, 0x84, 0xd6, 0xff, 0x36, 0x66, \n  0xff, 0x48, 0x18, 0xff, 0x09, 0x91, 0xfe, 0x9b, 0xa5, 0xfe, 0xa2, 0x8f, 0xfe, 0x8b, 0x47, 0xfe, \n  0xa7, 0x55, 0xff, 0x4c, 0xda, 0xff, 0x40, 0x53, 0x0f, 0x1f, 0x8a, 0x12, 0xe3, 0x35, 0x07, 0xb1, \n  0x85, 0x08, 0x03, 0x26, 0x07, 0xf7, 0x0b, 0x02, 0x95, 0x19, 0x03, 0x2c, 0x7e, 0x00, 0x37, 0xed, \n  0xfc, 0x0d, 0x0e, 0xfc, 0x3e, 0xeb, 0xfe, 0xd1, 0xdd, 0x00, 0xb9, 0x23, 0x00, 0x6f, 0xd1, 0x01, \n  0x7e, 0x17, 0x02, 0x33, 0x6f, 0x00, 0xbe, 0xbf, 0xfe, 0xa0, 0x95, 0xfe, 0x86, 0xef, 0xff, 0xde, \n  0xf0, 0xff, 0x35, 0x9a, 0xff, 0xa3, 0x30, 0xff, 0xd8, 0xb8, 0xff, 0xa4, 0x3f, 0x00, 0x8e, 0x77, \n  0xff, 0x0c, 0x4a, 0xff, 0xfe, 0xe1, 0xfe, 0xd2, 0xb8, 0xfe, 0x46, 0xcc, 0xfe, 0xe3, 0xac, 0xfe, \n  0x55, 0x5b, 0xff, 0xa9, 0xc2, 0xff, 0x21, 0x36, 0x0d, 0x94, 0xe2, 0x0f, 0xad, 0x9a, 0x06, 0x09, \n  0x9d, 0x07, 0x68, 0xff, 0x05, 0xfb, 0x11, 0x02, 0x63, 0x8f, 0x03, 0x8d, 0x29, 0x01, 0xbb, 0xbc, \n  0xfd, 0x2b, 0xad, 0xfd, 0x21, 0xdc, 0x00, 0x04, 0x4e, 0x02, 0x6b, 0x0a, 0x01, 0x1b, 0xff, 0x01, \n  0xf4, 0x3f, 0x02, 0x6b, 0xb5, 0x00, 0x5b, 0x30, 0xff, 0xa3, 0xd0, 0xfe, 0xb8, 0x62, 0xff, 0x1d, \n  0xd0, 0xff, 0x85, 0x45, 0x00, 0x33, 0xa3, 0xff, 0xd3, 0x9b, 0xff, 0xbc, 0x28, 0x00, 0x9e, 0xbd, \n  0xff, 0x42, 0xb3, 0xff, 0xa3, 0x37, 0xff, 0xb8, 0xd1, 0xfe, 0x7e, 0xff, 0xfe, 0x42, 0xfc, 0xfe, \n  0x84, 0x74, 0xff, 0xb3, 0xe2, 0xff, 0x04, 0x63, 0x0c, 0x62, 0x63, 0x0e, 0xe2, 0x60, 0x05, 0x1d, \n  0x4b, 0x06, 0x5d, 0x28, 0x05, 0xfb, 0x4b, 0x02, 0xae, 0x29, 0x04, 0xaa, 0xac, 0x02, 0xa2, 0xac, \n  0xff, 0x3c, 0xfa, 0xfe, 0x7c, 0x15, 0x02, 0x6f, 0x57, 0x03, 0xcd, 0x89, 0x01, 0xee, 0xe2, 0x01, \n  0x55, 0x6d, 0x01, 0x63, 0xfd, 0xff, 0x87, 0x38, 0xff, 0xee, 0x4f, 0xff, 0x57, 0xe5, 0xff, 0x2a, \n  0x0f, 0x00, 0x3b, 0x42, 0x00, 0x31, 0x98, 0xff, 0xb5, 0x9b, 0xff, 0xc3, 0x2c, 0x00, 0x9a, 0xe4, \n  0xff, 0x04, 0xec, 0xff, 0x7f, 0x63, 0xff, 0x80, 0x02, 0xff, 0x6d, 0x54, 0xff, 0x79, 0x7c, 0xff, \n  0xb3, 0xcd, 0xff, 0x17, 0xe9, 0xff, 0xdf, 0x8b, 0x0b, 0xd1, 0x5e, 0x0d, 0x08, 0xb1, 0x04, 0x98, \n  0x4f, 0x06, 0x5f, 0x2e, 0x06, 0x62, 0x4b, 0x03, 0x8c, 0xcf, 0x04, 0xcb, 0x56, 0x03, 0x5a, 0xa7, \n  0x00, 0xa5, 0x1c, 0x00, 0x47, 0x83, 0x02, 0xe7, 0x0f, 0x03, 0x19, 0xd4, 0x00, 0x59, 0xba, 0x00, \n  0x64, 0x63, 0x00, 0x77, 0xfc, 0xff, 0xe7, 0x15, 0x00, 0x45, 0xec, 0xff, 0xe3, 0xea, 0xff, 0x68, \n  0xa1, 0xff, 0x1f, 0xc6, 0xff, 0xba, 0x8e, 0xff, 0x49, 0xc4, 0xff, 0x76, 0x49, 0x00, 0xa7, 0x0c, \n  0x00, 0xe3, 0x50, 0x00, 0xa8, 0xf1, 0xff, 0x0b, 0x46, 0xff, 0xc0, 0x56, 0xff, 0x29, 0x67, 0xff, \n  0x44, 0x91, 0xff, 0x69, 0x81, 0xff, 0x1d, 0xb5, 0x0b, 0xda, 0x95, 0x0e, 0x5f, 0x58, 0x06, 0x42, \n  0x5d, 0x07, 0xcd, 0xa4, 0x06, 0x4b, 0xa0, 0x03, 0x00, 0x15, 0x05, 0xea, 0xe6, 0x02, 0x27, 0x8c, \n  0xff, 0x7a, 0xfe, 0xfe, 0xbd, 0xb6, 0x01, 0xf4, 0x8c, 0x02, 0x04, 0x8d, 0x00, 0xdb, 0x8d, 0x00, \n  0xec, 0x2a, 0x00, 0xf0, 0x12, 0x00, 0xef, 0x4a, 0x00, 0xee, 0xaa, 0xff, 0x20, 0x7b, 0xff, 0x0f, \n  0x89, 0xff, 0x96, 0xed, 0xff, 0xd3, 0x9f, 0xff, 0xea, 0xeb, 0xff, 0x49, 0x91, 0x00, 0x04, 0x21, \n  0x00, 0x13, 0x63, 0x00, 0xd5, 0x3e, 0x00, 0x94, 0x71, 0xff, 0x1a, 0x26, 0xff, 0x0c, 0xfd, 0xfe, \n  0x8e, 0xed, 0xfe, 0xbc, 0xfc, 0xfe, 0xd1, 0x69, 0x0c, 0xfe, 0x78, 0x0f, 0x5b, 0xe9, 0x06, 0xd8, \n  0x68, 0x07, 0x40, 0x40, 0x06, 0x7a, 0x8e, 0x03, 0x06, 0x56, 0x05, 0x38, 0xf6, 0x02, 0x95, 0x18, \n  0xff, 0x6f, 0xdb, 0xfd, 0xac, 0x49, 0x00, 0x11, 0xdc, 0x01, 0x03, 0xd7, 0x00, 0x43, 0xd8, 0x00, \n  0x80, 0x24, 0x00, 0xc9, 0x0d, 0x00, 0x7c, 0x6e, 0x00, 0xbd, 0x0d, 0x00, 0xda, 0xe1, 0xff, 0xac, \n  0xab, 0xff, 0x17, 0xc9, 0xff, 0xa3, 0x87, 0xff, 0x23, 0xee, 0xff, 0xe1, 0x44, 0x00, 0x6e, 0xa7, \n  0xff, 0xfa, 0x3d, 0x00, 0xde, 0xa2, 0x00, 0xb7, 0x1a, 0x00, 0xe4, 0x64, 0xff, 0x19, 0xab, 0xfe, \n  0xf8, 0x93, 0xfe, 0x0a, 0xca, 0xfe, 0x97, 0x9f, 0x0c, 0x4e, 0x84, 0x0f, 0x0c, 0x07, 0x06, 0x4b, \n  0x57, 0x06, 0x85, 0xb4, 0x05, 0x8b, 0x4e, 0x03, 0x5a, 0x56, 0x05, 0x11, 0x16, 0x03, 0xea, 0xf1, \n  0xfe, 0x6d, 0xa7, 0xfd, 0xca, 0x0d, 0x01, 0x59, 0xca, 0x02, 0x36, 0x63, 0x00, 0x66, 0xe3, 0xff, \n  0x3d, 0x7b, 0xff, 0x21, 0x7d, 0xff, 0xba, 0x9f, 0x00, 0x7a, 0x30, 0x01, 0xda, 0xe6, 0x00, 0x98, \n  0x27, 0x00, 0xca, 0x0f, 0x00, 0x77, 0x7b, 0xff, 0xf6, 0x89, 0xff, 0xa3, 0xe7, 0xff, 0xa4, 0x73, \n  0xff, 0x9e, 0xd6, 0xff, 0x2d, 0xef, 0xff, 0x74, 0x05, 0x00, 0xb1, 0x5e, 0x00, 0xfb, 0xc3, 0xff, \n  0x51, 0x0c, 0xff, 0xba, 0xb9, 0xfe, 0x03, 0xb1, 0x0d, 0xc0, 0xde, 0x10, 0x7d, 0x0b, 0x06, 0xd4, \n  0x86, 0x05, 0xdb, 0x61, 0x04, 0x4c, 0x03, 0x02, 0xc6, 0xa8, 0x04, 0x16, 0x8f, 0x02, 0xb8, 0x69, \n  0xfe, 0xb5, 0xb4, 0xfc, 0x40, 0x86, 0x00, 0x00, 0xbc, 0x03, 0x2f, 0xb3, 0x01, 0xab, 0x7d, 0x00, \n  0xb8, 0x08, 0xff, 0x47, 0x91, 0xfe, 0x94, 0x05, 0x00, 0x2b, 0xd9, 0x00, 0xc1, 0x1e, 0x01, 0xa7, \n  0x0f, 0x01, 0xcc, 0xf1, 0x00, 0xb0, 0xec, 0xff, 0x6e, 0xd0, 0xff, 0x5f, 0x2c, 0x00, 0xd3, 0x5a, \n  0xff, 0xe8, 0x73, 0xff, 0x47, 0x8d, 0xff, 0x13, 0x4d, 0xff, 0xd2, 0xb1, 0xff, 0xf0, 0x28, 0x00, \n  0xa4, 0x54, 0x00, 0x57, 0x08, 0x00, 0xfc, 0x4e, 0x0f, 0xb9, 0x16, 0x13, 0x5f, 0x91, 0x06, 0x1f, \n  0x9d, 0x05, 0x0a, 0x44, 0x04, 0x56, 0x58, 0x01, 0xe2, 0x0e, 0x04, 0xc3, 0x4a, 0x01, 0x9a, 0x9c, \n  0xfc, 0xaa, 0x8a, 0xfa, 0x4f, 0x14, 0xff, 0x96, 0x36, 0x04, 0x56, 0x47, 0x02, 0x31, 0x5f, 0x00, \n  0x8f, 0x3a, 0xff, 0xc8, 0x0c, 0xff, 0x05, 0x2b, 0x00, 0x1a, 0xd1, 0x00, 0xf6, 0xf6, 0x00, 0xc8, \n  0x63, 0x00, 0x77, 0xc6, 0x00, 0xfc, 0x9b, 0x00, 0x92, 0x40, 0x00, 0x19, 0x77, 0x00, 0xb7, 0xcf, \n  0xff, 0x43, 0xad, 0xff, 0xce, 0x8f, 0xff, 0xd9, 0x21, 0xff, 0x81, 0x3a, 0xff, 0x27, 0xac, 0xff, \n  0xf9, 0x3b, 0x00, 0x68, 0xb1, 0x00, 0x0a, 0x8e, 0x11, 0x0a, 0xac, 0x15, 0x18, 0xde, 0x06, 0x9c, \n  0xfe, 0x05, 0x49, 0x97, 0x04, 0xe5, 0xf6, 0x00, 0x75, 0xfa, 0x03, 0x50, 0x7c, 0x00, 0xd7, 0xf8, \n  0xfa, 0x5e, 0x4f, 0xf8, 0x0f, 0xb8, 0xfd, 0x59, 0x9e, 0x04, 0x57, 0x0b, 0x02, 0x2e, 0x3a, 0xff, \n  0x56, 0x69, 0xfe, 0x95, 0xac, 0xfe, 0xfe, 0x72, 0x00, 0x2f, 0x8c, 0x01, 0x7d, 0x49, 0x01, 0x53, \n  0x7b, 0x00, 0x68, 0x10, 0x01, 0xf6, 0x4b, 0x00, 0xe8, 0xf9, 0xff, 0x6c, 0xb1, 0x00, 0x49, 0xbc, \n  0xff, 0xf1, 0xce, 0xff, 0xe0, 0xf5, 0xff, 0x06, 0x5e, 0xff, 0x23, 0x51, 0xff, 0x6a, 0xdf, 0xff, \n  0x05, 0x67, 0x00, 0xcb, 0x17, 0x00, 0x50, 0x8f, 0x14, 0xb5, 0x38, 0x18, 0x18, 0x77, 0x06, 0x2c, \n  0xa0, 0x06, 0x1c, 0x06, 0x05, 0xd5, 0xb6, 0x00, 0x75, 0x7b, 0x04, 0xb2, 0x02, 0x00, 0x56, 0x65, \n  0xf9, 0x07, 0x1f, 0xf6, 0xaf, 0x1a, 0xfd, 0xa4, 0xba, 0x05, 0x3f, 0xb6, 0x01, 0xfa, 0xc0, 0xfd, \n  0x64, 0x2b, 0xfd, 0x93, 0xcd, 0xfd, 0xa0, 0xde, 0xff, 0x84, 0x55, 0x01, 0x5b, 0x3e, 0x01, 0x81, \n  0x6c, 0x00, 0x95, 0x97, 0x01, 0x20, 0xd4, 0x00, 0xed, 0xcc, 0xff, 0x60, 0x6f, 0x00, 0xae, 0xb4, \n  0xff, 0xac, 0xbe, 0xff, 0xaa, 0xf4, 0xff, 0xb7, 0x7e, 0xff, 0x34, 0x9f, 0xff, 0xc8, 0x46, 0x00, \n  0x3a, 0x4f, 0x00, 0x77, 0xe5, 0xff, 0x42, 0xe5, 0x18, 0x91, 0x73, 0x1b, 0xfb, 0x02, 0x05, 0xeb, \n  0x11, 0x07, 0x26, 0x80, 0x05, 0x33, 0x1f, 0x00, 0xa2, 0x01, 0x05, 0x05, 0x16, 0xff, 0xa3, 0x7b, \n  0xf7, 0x15, 0x59, 0xf4, 0x90, 0x4b, 0xfd, 0xdd, 0x18, 0x07, 0x37, 0xf5, 0x00, 0x71, 0x58, 0xfc, \n  0x94, 0x2a, 0xfc, 0x87, 0x16, 0xfd, 0x93, 0x5f, 0xff, 0x64, 0xbe, 0x00, 0x3c, 0xa2, 0x00, 0xb6, \n  0xdd, 0xff, 0xc0, 0x76, 0x01, 0x52, 0x60, 0x00, 0x36, 0x70, 0xff, 0x1a, 0xb8, 0x00, 0x3d, 0xda, \n  0xff, 0x69, 0xbe, 0xff, 0x0e, 0xba, 0xff, 0x90, 0x48, 0xff, 0xa4, 0x69, 0xff, 0xe7, 0x21, 0x00, \n  0xb6, 0x7a, 0x00, 0xb4, 0xee, 0xff, 0x38, 0x55, 0x1d, 0x71, 0x38, 0x1f, 0xc3, 0x4b, 0x03, 0x67, \n  0x17, 0x07, 0x88, 0x63, 0x06, 0xbd, 0x34, 0xff, 0xfe, 0x3b, 0x05, 0x75, 0x20, 0xfe, 0x8c, 0x4c, \n  0xf5, 0xd6, 0x4f, 0xf3, 0x99, 0x10, 0xfe, 0x19, 0x2f, 0x08, 0xac, 0x50, 0x00, 0x10, 0x51, 0xfb, \n  0x64, 0x2d, 0xfb, 0x9a, 0x9e, 0xfc, 0xef, 0x6f, 0xff, 0x2a, 0x2c, 0x00, 0x2f, 0x3b, 0x00, 0x70, \n  0x8c, 0xff, 0x46, 0x0b, 0x01, 0x6e, 0xe8, 0xff, 0xd9, 0xf4, 0xfe, 0x0b, 0x9d, 0x00, 0x3a, 0xb3, \n  0xff, 0xde, 0xa1, 0xff, 0xa8, 0x6a, 0xff, 0xf1, 0xcd, 0xfe, 0xbf, 0x2f, 0xff, 0xa4, 0xe0, 0xff, \n  0xbf, 0x6f, 0x00, 0x58, 0x1f, 0x00, 0xf3, 0x14, 0x21, 0xcf, 0x3c, 0x23, 0x14, 0x59, 0x02, 0xaa, \n  0x8c, 0x06, 0x9f, 0x27, 0x07, 0x98, 0x96, 0xfe, 0x05, 0x60, 0x05, 0x74, 0x63, 0xfd, 0xb2, 0x31, \n  0xf3, 0x13, 0x87, 0xf2, 0x4a, 0xb6, 0xfe, 0xe2, 0x93, 0x08, 0x32, 0xe4, 0xff, 0x79, 0xe8, 0xfa, \n  0x34, 0x7b, 0xfa, 0xae, 0x35, 0xfc, 0x30, 0x70, 0xff, 0xe4, 0xdf, 0xff, 0xb0, 0x15, 0x00, 0x05, \n  0x4d, 0xff, 0xf2, 0x00, 0x01, 0xe9, 0xf3, 0xff, 0xae, 0x9b, 0xfe, 0x07, 0x05, 0x00, 0x11, 0x07, \n  0xff, 0xcd, 0x78, 0xff, 0xa3, 0x12, 0xff, 0x18, 0x5a, 0xfe, 0x73, 0x2e, 0xff, 0xd9, 0xcf, 0xff, \n  0x05, 0x74, 0x00, 0x1d, 0x24, 0x00, 0x82, 0xa7, 0x23, 0x66, 0x55, 0x27, 0x09, 0x4a, 0x03, 0x93, \n  0x10, 0x06, 0xc8, 0xff, 0x06, 0xa4, 0x72, 0xfd, 0xad, 0x80, 0x05, 0x78, 0x20, 0xfd, 0x21, 0x77, \n  0xf1, 0x99, 0x70, 0xf2, 0x47, 0x3a, 0xfe, 0xdf, 0xd6, 0x06, 0x49, 0xef, 0xff, 0xf6, 0xf1, 0xfb, \n  0xdc, 0xdd, 0xf9, 0xb2, 0x30, 0xfb, 0xf5, 0x06, 0xff, 0xfa, 0x7d, 0xff, 0x80, 0x21, 0x01, 0xc1, \n  0xfc, 0xff, 0x92, 0x04, 0x00, 0x9f, 0x85, 0xff, 0x4b, 0x86, 0xfe, 0xfa, 0xa8, 0xff, 0x75, 0x66, \n  0xfe, 0x2f, 0xdc, 0xfe, 0x0f, 0xa5, 0xfe, 0x4e, 0x0e, 0xfe, 0x78, 0x2b, 0xff, 0x08, 0xab, 0xff, \n  0xb9, 0x99, 0x00, 0xc9, 0x30, 0x00, 0x4c, 0x71, 0x24, 0xe5, 0x46, 0x2a, 0x70, 0xbe, 0x05, 0x23, \n  0x87, 0x06, 0x29, 0x74, 0x07, 0x61, 0x0d, 0xfc, 0x07, 0x4b, 0x04, 0x3c, 0xc5, 0xfd, 0x54, 0x4b, \n  0xf1, 0x16, 0x50, 0xf3, 0x06, 0x8c, 0xfd, 0x23, 0x70, 0x03, 0x0a, 0x3d, 0xff, 0x4d, 0xa2, 0xfd, \n  0x14, 0xef, 0xfa, 0x9a, 0xe6, 0xfa, 0xf8, 0x5d, 0xfe, 0xa1, 0xe6, 0xfe, 0x6c, 0x59, 0x01, 0x10, \n  0x08, 0x01, 0x6f, 0xbd, 0xff, 0xa4, 0xeb, 0xfe, 0x2f, 0x5d, 0xfe, 0xc3, 0x7a, 0xff, 0xa3, 0xa6, \n  0xfe, 0x53, 0xe5, 0xfe, 0x2c, 0x6c, 0xfe, 0xb3, 0x02, 0xfe, 0x25, 0x0d, 0xff, 0x53, 0xf1, 0xfe, \n  0xe5, 0x09, 0x00, 0xeb, 0x56, 0x00, 0xe0, 0x20, 0x25, 0xde, 0x10, 0x2c, 0xde, 0x30, 0x08, 0x8d, \n  0x3f, 0x08, 0x51, 0x99, 0x08, 0xee, 0x36, 0xfb, 0x36, 0xf5, 0x01, 0x42, 0x22, 0xfd, 0x69, 0x3a, \n  0xf1, 0xb7, 0xe3, 0xf4, 0x89, 0x57, 0xfe, 0x5f, 0x5d, 0xff, 0xa4, 0xc2, 0xfc, 0x89, 0x1e, 0xff, \n  0x59, 0xe4, 0xfc, 0xaf, 0x59, 0xfc, 0xf7, 0xeb, 0xfd, 0x7f, 0x23, 0xfd, 0x09, 0xdf, 0x00, 0xdd, \n  0xd3, 0x01, 0x04, 0xb7, 0xff, 0x4e, 0xc3, 0xfe, 0x59, 0xcb, 0xfe, 0x66, 0x5b, 0xff, 0x31, 0x8d, \n  0xfe, 0x5b, 0x06, 0xff, 0x5c, 0x2d, 0xfe, 0x35, 0xc6, 0xfd, 0xa8, 0xee, 0xfe, 0x5c, 0x4f, 0xfe, \n  0x41, 0x52, 0xff, 0xa7, 0x26, 0x00, 0xdb, 0x52, 0x26, 0x63, 0xec, 0x2c, 0x90, 0x03, 0x09, 0x0c, \n  0x6d, 0x0a, 0x23, 0x82, 0x0a, 0x66, 0x20, 0xfb, 0xcc, 0x1e, 0x00, 0xf6, 0x5b, 0xfb, 0x06, 0x69, \n  0xf0, 0x13, 0x04, 0xf7, 0xa0, 0x3d, 0x00, 0x1a, 0xe3, 0xfb, 0xb0, 0xc3, 0xf9, 0x63, 0xe2, 0xff, \n  0x84, 0xa9, 0xfe, 0x6d, 0x63, 0xfe, 0xf6, 0x3b, 0xfe, 0xd0, 0x58, 0xfb, 0x71, 0x8c, 0xff, 0xa9, \n  0x5e, 0x02, 0x75, 0x44, 0x00, 0xad, 0xc2, 0xfe, 0x0e, 0x4f, 0xff, 0x8d, 0x93, 0xff, 0xe4, 0x6c, \n  0xfe, 0xf3, 0xb5, 0xfe, 0x69, 0x98, 0xfd, 0xd6, 0x63, 0xfd, 0x5a, 0xce, 0xfe, 0xf9, 0xef, 0xfd, \n  0x32, 0x9f, 0xfe, 0x70, 0xd4, 0xff, 0x56, 0x62, 0x29, 0xed, 0x00, 0x2d, 0x23, 0x08, 0x07, 0x1b, \n  0x04, 0x0d, 0xbe, 0x8b, 0x0c, 0x55, 0xe2, 0xfa, 0xce, 0xcb, 0xfe, 0x67, 0x39, 0xf9, 0xf4, 0xce, \n  0xef, 0x0c, 0x52, 0xf9, 0xfc, 0x55, 0x03, 0x59, 0xaf, 0xf8, 0x36, 0x10, 0xf5, 0xab, 0x27, 0x00, \n  0x7d, 0xc5, 0xff, 0x81, 0xb9, 0x00, 0xe4, 0xe9, 0xff, 0x02, 0xc9, 0xf9, 0x8d, 0x50, 0xfe, 0x2e, \n  0xf1, 0x02, 0x5f, 0x7d, 0x00, 0x22, 0x02, 0xfe, 0x81, 0xb5, 0xff, 0x7a, 0xd8, 0xff, 0xda, 0xf4, \n  0xfd, 0x13, 0xa4, 0xfe, 0xc3, 0xb0, 0xfc, 0x73, 0x97, 0xfc, 0xae, 0xda, 0xfe, 0x43, 0xbf, 0xfd, \n  0x42, 0x14, 0xfe, 0x84, 0x82, 0xff, 0x14, 0xd9, 0x2d, 0x3f, 0x66, 0x2d, 0x6d, 0x15, 0x03, 0x42, \n  0xb6, 0x0e, 0x2f, 0xb7, 0x0d, 0x0d, 0xe6, 0xf9, 0xdf, 0xb1, 0xff, 0x3d, 0xf6, 0xf7, 0xc6, 0x49, \n  0xee, 0x0f, 0x4a, 0xfc, 0xa1, 0xd8, 0x07, 0x3a, 0xcd, 0xf6, 0xae, 0x55, 0xef, 0xa9, 0xf9, 0xfe, \n  0xf7, 0xfa, 0x00, 0x0b, 0x7b, 0x02, 0x60, 0x3a, 0x02, 0xa4, 0xaf, 0xf9, 0x53, 0xe1, 0xfc, 0x51, \n  0xf6, 0x02, 0xd6, 0xde, 0x00, 0x54, 0x42, 0xfd, 0x4d, 0xab, 0xff, 0x39, 0xf5, 0xff, 0x15, 0x17, \n  0xfd, 0x2f, 0x6c, 0xfe, 0xeb, 0x6c, 0xfc, 0xfa, 0x0c, 0xfc, 0x55, 0xfe, 0xfe, 0x02, 0xd4, 0xfd, \n  0x67, 0x95, 0xfd, 0xc6, 0x27, 0xff, 0x3d, 0x90, 0x33, 0xf0, 0x79, 0x30, 0x95, 0xc4, 0xfd, 0xa5, \n  0x6c, 0x0c, 0xbd, 0xe6, 0x0d, 0x98, 0x17, 0xf9, 0x42, 0xd1, 0x01, 0x22, 0xba, 0xf8, 0xce, 0x79, \n  0xec, 0xce, 0x3a, 0xfd, 0x4c, 0x28, 0x0c, 0xda, 0xfb, 0xf7, 0xfb, 0x33, 0xeb, 0xa3, 0x46, 0xfc, \n  0xac, 0x02, 0x01, 0xc5, 0x96, 0x03, 0x5a, 0x5e, 0x04, 0x06, 0x10, 0xfa, 0xbe, 0x6d, 0xfb, 0x26, \n  0xaf, 0x02, 0x33, 0x74, 0x01, 0xaf, 0x53, 0xfc, 0x4c, 0x01, 0xff, 0x1d, 0x7e, 0x00, 0x0b, 0xc8, \n  0xfc, 0x60, 0x0f, 0xfe, 0xd6, 0xea, 0xfb, 0x44, 0x33, 0xfb, 0xf1, 0x14, 0xff, 0x6c, 0x3f, 0xfe, \n  0x37, 0x5b, 0xfd, 0xd0, 0xa5, 0xfe, 0x9d, 0xe0, 0x39, 0x0a, 0x22, 0x36, 0x77, 0x88, 0xf7, 0x98, \n  0x83, 0x06, 0xf3, 0xcf, 0x0c, 0xce, 0xd6, 0xf7, 0xd8, 0x48, 0x06, 0x27, 0xb8, 0xfc, 0x55, 0x7b, \n  0xe9, 0x25, 0xff, 0xfa, 0x86, 0xc4, 0x0f, 0x1b, 0x4c, 0xfc, 0x0d, 0x79, 0xe9, 0x01, 0xd9, 0xf8, \n  0xaf, 0x10, 0x00, 0xfb, 0xce, 0x03, 0x42, 0xcc, 0x05, 0x24, 0x48, 0xfa, 0x4c, 0xad, 0xf9, 0xaf, \n  0xdd, 0x01, 0x3b, 0x66, 0x02, 0xe7, 0x6c, 0xfc, 0x17, 0x26, 0xfe, 0x01, 0x90, 0x00, 0x8a, 0x9b, \n  0xfc, 0x4b, 0x28, 0xfe, 0xbc, 0xfe, 0xfb, 0xed, 0x2e, 0xfa, 0x43, 0xe9, 0xfe, 0x5e, 0xbd, 0xfe, \n  0x55, 0x47, 0xfd, 0x77, 0x2b, 0xfe, 0x51, 0xab, 0x41, 0x2d, 0xff, 0x38, 0xe9, 0x42, 0xf0, 0x95, \n  0xe4, 0x03, 0xef, 0x6f, 0x0a, 0x31, 0x74, 0xf6, 0x09, 0x49, 0x0b, 0xbc, 0x24, 0xfe, 0xea, 0x6f, \n  0xe7, 0x06, 0x5d, 0xfa, 0x99, 0x68, 0x13, 0xae, 0xe2, 0x00, 0x41, 0x0b, 0xe8, 0x80, 0x00, 0xf5, \n  0x01, 0x6f, 0xfd, 0xb3, 0x4a, 0x04, 0x12, 0xad, 0x07, 0xca, 0x22, 0xf9, 0x34, 0x43, 0xf7, 0x10, \n  0x4b, 0x01, 0x64, 0xaf, 0x03, 0xb6, 0xe3, 0xfb, 0xb5, 0xf4, 0xfc, 0xf7, 0x1a, 0x01, 0xef, 0xa6, \n  0xfc, 0x13, 0x80, 0xfe, 0x75, 0x2d, 0xfc, 0xe4, 0x64, 0xf9, 0x88, 0x73, 0xfe, 0xdb, 0xb2, 0xfe, \n  0x48, 0x89, 0xfd, 0xac, 0x80, 0xfe, 0xd7, 0x7f, 0x46, 0xa4, 0xf2, 0x3a, 0xb4, 0x71, 0xec, 0x80, \n  0x7f, 0x02, 0x82, 0x70, 0x07, 0xae, 0x7c, 0xf5, 0x9b, 0x2b, 0x0f, 0xcd, 0x3a, 0xff, 0x85, 0xa1, \n  0xe6, 0x66, 0x42, 0xf8, 0xaa, 0x7b, 0x15, 0x30, 0xf0, 0x05, 0x72, 0x5a, 0xe7, 0x5a, 0x56, 0xf2, \n  0x99, 0x8c, 0xfa, 0x8a, 0xa2, 0x02, 0x7c, 0xbd, 0x08, 0x08, 0xab, 0xf9, 0x68, 0x5d, 0xf6, 0x98, \n  0xcc, 0xff, 0x8c, 0x7e, 0x03, 0x64, 0x8e, 0xfb, 0xed, 0x8a, 0xfc, 0xc6, 0x7c, 0x01, 0x10, 0x58, \n  0xfc, 0x9f, 0xf4, 0xfe, 0x5d, 0x74, 0xfc, 0x3c, 0x81, 0xf8, 0x97, 0x2a, 0xfe, 0xaa, 0x5e, 0xff, \n  0xaa, 0x39, 0xfe, 0x2d, 0x77, 0xfe, 0x23, 0x71, 0x4a, 0x01, 0x54, 0x3d, 0xf0, 0x69, 0xea, 0x9c, \n  0x9f, 0x00, 0x30, 0xe0, 0x03, 0x8d, 0x33, 0xf5, 0xc2, 0xd6, 0x12, 0x6f, 0xb8, 0x00, 0x72, 0x02, \n  0xe6, 0x2d, 0xaf, 0xf4, 0x49, 0x43, 0x16, 0xc0, 0x5d, 0x0b, 0x18, 0xe1, 0xe8, 0xc5, 0x73, 0xf0, \n  0xce, 0xac, 0xf5, 0xe4, 0x1e, 0x00, 0x9c, 0x3e, 0x0b, 0xb9, 0x3d, 0xfb, 0xdc, 0x7d, 0xf5, 0x9a, \n  0x32, 0xfe, 0x1e, 0xe0, 0x02, 0xb4, 0x5f, 0xfb, 0xe2, 0xa9, 0xfc, 0x57, 0x9f, 0x01, 0x5c, 0xc2, \n  0xfb, 0xf3, 0xf0, 0xfe, 0x14, 0x8a, 0xfc, 0xb5, 0x76, 0xf8, 0xc8, 0x7f, 0xfe, 0x11, 0xf1, 0xff, \n  0xaf, 0x9f, 0xfe, 0xe6, 0x6e, 0xfe, 0xe4, 0x02, 0x4d, 0xb9, 0x1b, 0x3f, 0xd7, 0x08, 0xeb, 0xf8, \n  0x66, 0xff, 0xfd, 0xa6, 0x00, 0x63, 0x70, 0xf5, 0x6f, 0xde, 0x13, 0x9e, 0x47, 0x02, 0xd3, 0x92, \n  0xe6, 0x29, 0x40, 0xf0, 0xf2, 0x05, 0x16, 0x3b, 0x5e, 0x10, 0x7c, 0xba, 0xeb, 0xe8, 0xc6, 0xee, \n  0xe3, 0xee, 0xf0, 0x79, 0xf0, 0xfd, 0x75, 0x2d, 0x0d, 0x93, 0xf6, 0xfd, 0x8b, 0x1d, 0xf5, 0x1c, \n  0x7b, 0xfc, 0x4b, 0xaa, 0x02, 0x7d, 0x23, 0xfb, 0x9c, 0xdf, 0xfc, 0xf2, 0x37, 0x01, 0x92, 0xab, \n  0xfa, 0xc1, 0x14, 0xff, 0x99, 0x43, 0xfd, 0x33, 0xd0, 0xf8, 0x05, 0x51, 0xfe, 0x99, 0x42, 0x00, \n  0xca, 0xdd, 0xfe, 0x55, 0x90, 0xfe, 0xf3, 0x3f, 0x4e, 0x24, 0x7c, 0x40, 0x72, 0xd4, 0xec, 0xf6, \n  0x54, 0xff, 0x10, 0x77, 0xfe, 0x09, 0x1a, 0xf5, 0x04, 0x5f, 0x13, 0x99, 0x44, 0x03, 0xcf, 0x0b, \n  0xe7, 0xf6, 0x71, 0xec, 0x43, 0xc9, 0x14, 0x41, 0x95, 0x13, 0xeb, 0xe1, 0xef, 0xbf, 0x32, 0xee, \n  0x88, 0xa6, 0xec, 0xe4, 0x56, 0xfc, 0xa0, 0xbe, 0x0d, 0xa5, 0xfe, 0x00, 0x05, 0x1d, 0xf6, 0x9e, \n  0x4b, 0xfa, 0x41, 0xa9, 0x02, 0x14, 0x3f, 0xfb, 0x4c, 0x4e, 0xfc, 0xec, 0x73, 0x00, 0xaf, 0x66, \n  0xfa, 0xb9, 0x98, 0xff, 0x74, 0x50, 0xfd, 0xf7, 0x6a, 0xf9, 0x7e, 0xf5, 0xfd, 0xdf, 0xad, 0xff, \n  0xd4, 0x74, 0xff, 0x3d, 0x9f, 0xfe, 0x16, 0x72, 0x4d, 0xe7, 0xff, 0x41, 0x3e, 0x13, 0xf0, 0xe3, \n  0x59, 0x00, 0x74, 0xff, 0xfc, 0x6e, 0x29, 0xf4, 0x42, 0x98, 0x12, 0x94, 0x10, 0x03, 0xdc, 0x68, \n  0xe7, 0xc8, 0x32, 0xe9, 0xa7, 0xbf, 0x11, 0xf9, 0xe4, 0x15, 0xc5, 0x28, 0xf5, 0xd1, 0xe7, 0xef, \n  0x8e, 0x91, 0xe8, 0x25, 0x58, 0xf9, 0xc7, 0x1b, 0x0e, 0x3b, 0x1b, 0x04, 0x94, 0x53, 0xf8, 0x9d, \n  0xe5, 0xf7, 0xf9, 0x08, 0x02, 0x5f, 0xf8, 0xfb, 0xd8, 0x2b, 0xfb, 0xdf, 0x53, 0x00, 0x1d, 0xdb, \n  0xfa, 0xf3, 0xfc, 0xff, 0xe2, 0x5e, 0xfd, 0xb6, 0x5c, 0xf9, 0x6e, 0x80, 0xfd, 0x5b, 0x11, 0xff, \n  0xb2, 0xe3, 0xff, 0x2d, 0x18, 0xfe, 0x7b, 0xb0, 0x4b, 0x06, 0x86, 0x42, 0x43, 0xda, 0xf4, 0x97, \n  0xf0, 0x02, 0x5b, 0xdd, 0xfb, 0x2e, 0x60, 0xf3, 0x5f, 0x63, 0x11, 0xd0, 0x4f, 0x02, 0xef, 0x99, \n  0xe7, 0x8a, 0x4d, 0xe6, 0x90, 0x66, 0x0e, 0x09, 0x8d, 0x16, 0xf5, 0x75, 0xfa, 0x59, 0x98, 0xf4, \n  0x8f, 0x87, 0xe5, 0x58, 0x03, 0xf5, 0xe0, 0x51, 0x0e, 0x89, 0x97, 0x06, 0xc4, 0x11, 0xfb, 0xf3, \n  0xcb, 0xf6, 0x10, 0x64, 0x00, 0x06, 0xf6, 0xfc, 0x63, 0x11, 0xfb, 0x84, 0x29, 0x00, 0x47, 0x95, \n  0xfb, 0xc3, 0x91, 0x00, 0x15, 0x20, 0xfd, 0xaa, 0xe7, 0xf8, 0x1d, 0x6f, 0xfd, 0x85, 0x32, 0xfe, \n  0x7d, 0xd5, 0xff, 0xbb, 0x16, 0xfe, 0x4b, 0x34, 0x49, 0xd4, 0xb0, 0x41, 0x1a, 0xc3, 0xfa, 0x95, \n  0x83, 0x05, 0xaf, 0x27, 0xfb, 0x1c, 0xcc, 0xf3, 0xb6, 0x85, 0x0e, 0xc3, 0x79, 0x02, 0xef, 0xa0, \n  0xe8, 0x5d, 0x69, 0xe2, 0x13, 0x2e, 0x0b, 0x44, 0x5f, 0x15, 0x67, 0x4b, 0xfe, 0xb3, 0x86, 0xfb, \n  0x80, 0xbf, 0xe4, 0x70, 0x77, 0xef, 0xe1, 0x9f, 0x0d, 0x06, 0x34, 0x08, 0x5c, 0xd0, 0xfc, 0x2d, \n  0x1a, 0xf8, 0x7a, 0xe7, 0xfe, 0xf8, 0x44, 0xfd, 0x46, 0x8d, 0xfc, 0xa3, 0x71, 0xff, 0x80, 0x47, \n  0xfb, 0x30, 0x52, 0x01, 0x18, 0x6b, 0xfd, 0xe5, 0x29, 0xf8, 0xb4, 0x1e, 0xfd, 0x23, 0x74, 0xfd, \n  0x63, 0x33, 0xff, 0x47, 0xfa, 0xfe, 0xb4, 0x0b, 0x46, 0xe6, 0xa4, 0x40, 0x66, 0xb4, 0xff, 0xe9, \n  0x26, 0x06, 0x34, 0x0c, 0xfc, 0xf3, 0x34, 0xf6, 0x96, 0x97, 0x0a, 0xe4, 0x08, 0x02, 0x4f, 0x64, \n  0xea, 0x41, 0x3d, 0xdf, 0x7f, 0x1c, 0x08, 0xe0, 0xc8, 0x13, 0x23, 0x8b, 0xff, 0x96, 0xa9, 0x01, \n  0xe7, 0x05, 0xe7, 0xe5, 0x84, 0xe9, 0x21, 0x01, 0x0b, 0x28, 0x63, 0x09, 0x23, 0xcd, 0xfd, 0x0a, \n  0x9c, 0xfa, 0xba, 0xa6, 0xfe, 0xdd, 0xa9, 0xfc, 0x88, 0x7c, 0xfd, 0x83, 0x52, 0xff, 0x4c, 0xdd, \n  0xfa, 0x48, 0x2a, 0x01, 0xbd, 0x56, 0xfd, 0x2c, 0x62, 0xf7, 0xac, 0x3c, 0xfd, 0xaf, 0x2e, 0xfd, \n  0xfd, 0xaf, 0xfe, 0xcd, 0x41, 0x00, 0x67, 0xab, 0x42, 0xd9, 0x84, 0x3c, 0x9e, 0x0e, 0x04, 0xb1, \n  0xc5, 0x0a, 0x0d, 0x5b, 0xfc, 0x49, 0x9e, 0xf6, 0x6c, 0x49, 0x08, 0x52, 0xfd, 0x00, 0xd5, 0x1c, \n  0xed, 0x1e, 0xb4, 0xdd, 0xf5, 0xd7, 0x02, 0xa1, 0xf2, 0x12, 0x0e, 0x88, 0x00, 0xfb, 0xc3, 0x05, \n  0x04, 0xcb, 0xeb, 0x16, 0x6b, 0xe3, 0x10, 0xb8, 0x05, 0xf6, 0x19, 0x0b, 0xd4, 0x5c, 0xff, 0x62, \n  0xf3, 0xfc, 0x85, 0xef, 0xfe, 0xc2, 0x9d, 0xfc, 0x46, 0x46, 0xfe, 0x78, 0x1e, 0xff, 0x5b, 0x39, \n  0xfa, 0x78, 0xff, 0xff, 0x64, 0x9e, 0xfd, 0x34, 0x0c, 0xf7, 0x15, 0xdb, 0xfc, 0xc4, 0x05, 0xfe, \n  0x64, 0x90, 0xfe, 0xd7, 0xf6, 0x00, 0xb2, 0xdb, 0x3e, 0xd9, 0xcd, 0x3a, 0x0d, 0xd6, 0x04, 0x8c, \n  0x5e, 0x0d, 0xb9, 0xa0, 0xff, 0xcb, 0xee, 0xf4, 0xdf, 0xc8, 0x07, 0x2b, 0xe7, 0x00, 0xbe, 0x18, \n  0xee, 0xe2, 0x0d, 0xdf, 0xd7, 0x36, 0xfe, 0x9b, 0x2d, 0x13, 0x22, 0x24, 0x00, 0x6f, 0xe7, 0x04, \n  0x22, 0xf7, 0xf2, 0x00, 0x98, 0xe0, 0x21, 0x6f, 0xfe, 0x71, 0x59, 0x0c, 0x45, 0x7c, 0x01, 0x06, \n  0x3d, 0xfe, 0x90, 0x3d, 0xff, 0xb3, 0xac, 0xfc, 0x5d, 0x7e, 0xfe, 0x0b, 0xe1, 0xff, 0xd5, 0x87, \n  0xf9, 0x8a, 0x2c, 0xfd, 0xf0, 0xeb, 0xfe, 0xd1, 0x74, 0xf8, 0xbd, 0x11, 0xfc, 0xeb, 0xc9, 0xfe, \n  0xcd, 0xa7, 0xfe, 0xa9, 0x14, 0x01, 0x61, 0x6d, 0x3c, 0x21, 0x6f, 0x39, 0x82, 0x57, 0x03, 0xc7, \n  0x8b, 0x0d, 0xb9, 0x3c, 0x04, 0xd6, 0x9a, 0xf3, 0x29, 0xcc, 0x04, 0xe8, 0xd8, 0x01, 0x0d, 0x4a, \n  0xf1, 0x0d, 0xc0, 0xe2, 0x80, 0x71, 0xfa, 0x6b, 0xf5, 0x11, 0xe3, 0x98, 0xff, 0x21, 0x86, 0x00, \n  0x67, 0x68, 0xfa, 0x2c, 0xba, 0xe3, 0xd4, 0x90, 0xf5, 0x7c, 0x9a, 0x0a, 0xf2, 0xde, 0x03, 0xb6, \n  0x63, 0xff, 0xe2, 0xaf, 0x00, 0xa7, 0x3c, 0xfd, 0xfe, 0xc1, 0xfd, 0xc0, 0x0a, 0xff, 0x05, 0x5d, \n  0xf9, 0xb3, 0x50, 0xfc, 0xfd, 0xf5, 0xff, 0xd1, 0x00, 0xfa, 0x72, 0xd5, 0xfb, 0x7d, 0xc1, 0xff, \n  0x82, 0x9c, 0xfe, 0xdb, 0x25, 0x00, 0x1f, 0xb2, 0x39, 0x6a, 0x8e, 0x38, 0x95, 0x88, 0x01, 0xe1, \n  0x4b, 0x0c, 0x4c, 0xc7, 0x07, 0x3d, 0xf5, 0xf5, 0x33, 0xe7, 0x02, 0xcc, 0x54, 0xfd, 0xab, 0xa6, \n  0xf5, 0xf3, 0x78, 0xea, 0xbe, 0xbd, 0xf5, 0x50, 0x01, 0x11, 0x34, 0xe8, 0x00, 0x7a, 0xd7, 0xf9, \n  0x13, 0x7d, 0xff, 0x86, 0x01, 0xeb, 0x63, 0x8c, 0xee, 0xb3, 0x88, 0x06, 0x56, 0x04, 0x06, 0xce, \n  0xf0, 0xfe, 0x07, 0x43, 0x01, 0x5b, 0x32, 0x00, 0x39, 0xe3, 0xfc, 0xd0, 0x4d, 0xfc, 0xfb, 0x57, \n  0xfa, 0x95, 0x71, 0xfc, 0x80, 0xd4, 0x00, 0xbc, 0xde, 0xfc, 0x62, 0xcf, 0xfa, 0xb3, 0xd4, 0xfe, \n  0x49, 0x59, 0xff, 0xf7, 0xc4, 0xff, 0x12, 0xf8, 0x35, 0x95, 0xd9, 0x34, 0x0a, 0x00, 0x01, 0x6a, \n  0x60, 0x0d, 0x0e, 0xba, 0x0a, 0x67, 0x33, 0xf7, 0x2b, 0x2d, 0x02, 0xca, 0xbe, 0xfb, 0x47, 0x21, \n  0xf6, 0x98, 0x3c, 0xf0, 0x31, 0x8f, 0xf5, 0xb8, 0xf7, 0x0d, 0x5b, 0xad, 0x03, 0x2a, 0x2d, 0xf7, \n  0xe0, 0xff, 0xff, 0x6b, 0x19, 0xf3, 0xcd, 0x98, 0xeb, 0xf4, 0xd5, 0x00, 0x8f, 0x40, 0x07, 0x87, \n  0x26, 0xfe, 0x55, 0x13, 0x00, 0xae, 0xcd, 0x01, 0xf6, 0xfd, 0xfd, 0x7b, 0xa2, 0xfb, 0x11, 0x68, \n  0xfa, 0x06, 0x15, 0xfd, 0x66, 0xa4, 0x01, 0x51, 0xd1, 0xfe, 0x0a, 0x00, 0xfa, 0x7a, 0x79, 0xfd, \n  0x64, 0x64, 0x00, 0xa0, 0xae, 0xff, 0x40, 0xef, 0x31, 0x69, 0xfa, 0x2f, 0xfb, 0x6d, 0x01, 0xcc, \n  0x7a, 0x0f, 0xc2, 0xe7, 0x0b, 0xea, 0x17, 0xf7, 0x23, 0x27, 0x01, 0xb7, 0x37, 0xfe, 0x3d, 0x82, \n  0xf8, 0x2b, 0xc0, 0xef, 0x90, 0xaa, 0xf4, 0x81, 0x49, 0x0d, 0x4c, 0xc7, 0x05, 0x1c, 0xd5, 0xf6, \n  0xb6, 0xf6, 0xfe, 0x1a, 0xe7, 0xf8, 0xba, 0xe8, 0xec, 0x3a, 0x74, 0xfc, 0x82, 0xf3, 0x06, 0x98, \n  0xf8, 0xfd, 0x76, 0x10, 0xfe, 0xf0, 0xd2, 0x00, 0x22, 0x5a, 0xfe, 0x4b, 0x5c, 0xfd, 0x68, 0x32, \n  0xfc, 0x3d, 0x97, 0xfc, 0x83, 0x6a, 0x00, 0x8f, 0x9f, 0xff, 0x57, 0xa5, 0xfa, 0xdb, 0xa0, 0xfd, \n  0xd4, 0xf0, 0x00, 0x35, 0x45, 0xff, 0x04, 0x4b, 0x2c, 0x85, 0xf1, 0x2a, 0x10, 0x46, 0x03, 0x75, \n  0x98, 0x11, 0x95, 0x92, 0x0c, 0x43, 0xbb, 0xf6, 0xbc, 0xd8, 0x00, 0x4d, 0x4a, 0x01, 0x6b, 0x13, \n  0xfb, 0x49, 0x78, 0xf0, 0xa8, 0xcd, 0xf2, 0x91, 0x91, 0x09, 0xec, 0xa4, 0x07, 0x53, 0x62, 0xf9, \n  0xd7, 0x50, 0xfe, 0x12, 0x22, 0xfc, 0x91, 0x5b, 0xef, 0x0b, 0x93, 0xfa, 0x4e, 0x76, 0x06, 0x37, \n  0xc7, 0xfd, 0xa0, 0x6b, 0xfc, 0x00, 0xa1, 0xff, 0x7b, 0x99, 0xfd, 0xdc, 0xfa, 0xfd, 0x0b, 0x9a, \n  0xfe, 0x2d, 0x06, 0xfd, 0xc1, 0x62, 0xfe, 0xfd, 0x80, 0xff, 0x67, 0x58, 0xfc, 0xee, 0x84, 0xfe, \n  0x8b, 0x4a, 0x01, 0xb5, 0x3f, 0xff, 0xf3, 0x63, 0x2b, 0xc8, 0xb1, 0x25, 0xda, 0x8a, 0x01, 0x6b, \n  0x77, 0x17, 0x19, 0xfd, 0x0d, 0x92, 0xcb, 0xf2, 0xbd, 0x42, 0x01, 0x2f, 0x71, 0x05, 0x94, 0x94, \n  0xfd, 0x88, 0xa0, 0xef, 0x3e, 0xc3, 0xef, 0x50, 0xe9, 0x07, 0x0f, 0xdd, 0x08, 0x81, 0x6d, 0xfa, \n  0xfd, 0xba, 0x00, 0x78, 0x59, 0xfe, 0x1c, 0xd4, 0xec, 0x49, 0x12, 0xfa, 0x92, 0xa7, 0x08, 0xe1, \n  0xaa, 0xfc, 0x7f, 0x4f, 0xfb, 0xa1, 0x6d, 0xff, 0x87, 0x9f, 0xfb, 0xce, 0x07, 0xfd, 0x1d, 0x83, \n  0xff, 0x9b, 0x25, 0xfd, 0xf0, 0x11, 0xff, 0xd4, 0x55, 0x00, 0x8c, 0xda, 0xfb, 0xce, 0x9b, 0xff, \n  0x30, 0xf1, 0x02, 0x2e, 0x23, 0xff, 0xaa, 0x7e, 0x24, 0xc2, 0x17, 0x24, 0x39, 0x29, 0x08, 0x9f, \n  0x39, 0x16, 0x5f, 0x44, 0x0b, 0x99, 0xbb, 0xf2, 0xbe, 0x3c, 0x00, 0x02, 0x01, 0x04, 0xd6, 0x37, \n  0xfc, 0x5f, 0x38, 0xf5, 0x28, 0x6e, 0xf2, 0xaa, 0x05, 0x01, 0x60, 0x42, 0x06, 0x3f, 0x9b, 0xfd, \n  0xe6, 0x8a, 0x02, 0x31, 0xdc, 0x00, 0xbd, 0x93, 0xf0, 0x62, 0xa8, 0xf6, 0xc4, 0x22, 0x04, 0x32, \n  0xe9, 0x00, 0xa8, 0x15, 0xff, 0x1a, 0xad, 0xfe, 0xc8, 0x8d, 0xfb, 0x5d, 0xa2, 0xfd, 0x87, 0xc3, \n  0xff, 0x78, 0x76, 0xfe, 0xd2, 0xa7, 0xff, 0x00, 0xcd, 0xff, 0xb8, 0xb0, 0xfc, 0xa7, 0x81, 0xfe, \n  0x52, 0x69, 0x01, 0x43, 0x98, 0xff, 0x53, 0x17, 0x20, 0x7a, 0x34, 0x21, 0xc0, 0x9f, 0x08, 0xc7, \n  0x16, 0x14, 0xb0, 0x02, 0x0b, 0x14, 0x5f, 0xf6, 0xd5, 0xac, 0x01, 0x57, 0xbd, 0x02, 0xbc, 0x4d, \n  0xfc, 0x21, 0x1e, 0xf7, 0x57, 0x78, 0xf3, 0x69, 0xca, 0xff, 0x35, 0xbb, 0x04, 0x7d, 0x11, 0xfe, \n  0xee, 0x02, 0x02, 0xeb, 0xa2, 0x01, 0x2f, 0xd3, 0xf4, 0xc2, 0xb2, 0xf6, 0x8d, 0xc2, 0x02, 0xb6, \n  0xc5, 0x02, 0xa7, 0xa0, 0xfe, 0x23, 0x5a, 0xfd, 0x36, 0xbb, 0xfc, 0x60, 0x94, 0xfe, 0xd1, 0xb4, \n  0xff, 0x1e, 0x22, 0xfe, 0xba, 0x6f, 0xfe, 0xfb, 0x5f, 0xff, 0x83, 0x5a, 0xfe, 0x25, 0x12, 0xff, \n  0xd1, 0xe3, 0xff, 0x27, 0xa7, 0xfe, 0x49, 0x80, 0x1c, 0x5c, 0x9c, 0x1d, 0x24, 0xd5, 0x08, 0x3b, \n  0x0f, 0x11, 0xf7, 0xa6, 0x09, 0x38, 0x8d, 0xfb, 0x05, 0xb1, 0x02, 0x99, 0xc7, 0x00, 0x50, 0xdc, \n  0xfc, 0x68, 0x33, 0xf8, 0x11, 0x34, 0xf5, 0x56, 0x7d, 0xff, 0x1f, 0x36, 0x03, 0x1a, 0xb0, 0xfe, \n  0x93, 0xa8, 0x01, 0x0e, 0xd2, 0x01, 0xf2, 0x86, 0xf7, 0xb4, 0x13, 0xf8, 0x93, 0x04, 0x03, 0x5a, \n  0xff, 0x02, 0x90, 0x48, 0xfe, 0x5e, 0x97, 0xfd, 0x50, 0xd0, 0xfd, 0x52, 0x3e, 0xff, 0x50, 0x6c, \n  0xff, 0x51, 0x9e, 0xfd, 0x41, 0x95, 0xfd, 0x81, 0xe0, 0xfe, 0x98, 0xf1, 0xfe, 0xaf, 0xc9, 0xfe, \n  0x02, 0xf5, 0xfe, 0x83, 0xf5, 0xfe, 0xe0, 0x95, 0x19, 0xf3, 0x2f, 0x1b, 0x59, 0x80, 0x08, 0x6b, \n  0xcc, 0x0d, 0x1e, 0x65, 0x09, 0x70, 0x3d, 0xff, 0x91, 0x62, 0x02, 0x1c, 0xc7, 0xff, 0x86, 0xf6, \n  0xfc, 0xff, 0xbc, 0xf8, 0x0c, 0x02, 0xf7, 0x5b, 0x40, 0xff, 0x6e, 0x55, 0x02, 0x21, 0x18, 0xff, \n  0x88, 0x85, 0x01, 0x9a, 0x19, 0x02, 0x2f, 0xd7, 0xf8, 0x1b, 0x2a, 0xf9, 0x9b, 0x6d, 0x03, 0x23, \n  0xe8, 0x02, 0x76, 0x0d, 0xfe, 0xc0, 0xee, 0xfd, 0x23, 0x7d, 0xfe, 0x46, 0x27, 0xff, 0xe1, 0x2d, \n  0xff, 0xb7, 0x92, 0xfd, 0x89, 0x15, 0xfd, 0xc4, 0x86, 0xfe, 0x95, 0xba, 0xfe, 0x1f, 0x80, 0xfe, \n  0x8b, 0x5c, 0xff, 0x38, 0x89, 0xff, 0x4d, 0xf7, 0x15, 0xbd, 0xa6, 0x18, 0xb1, 0xd8, 0x07, 0xf1, \n  0x2e, 0x0b, 0x4a, 0x5a, 0x0a, 0x7d, 0x74, 0x01, 0x7d, 0x78, 0x01, 0x24, 0xc6, 0xff, 0xdd, 0x39, \n  0xfd, 0x27, 0xe3, 0xf9, 0xc5, 0x24, 0xf9, 0xa8, 0xe1, 0xfe, 0xe9, 0x82, 0x01, 0x07, 0x1d, 0x00, \n  0xc0, 0x50, 0x02, 0x3a, 0xdf, 0x01, 0xdd, 0xe3, 0xf9, 0xcb, 0x1f, 0xfb, 0xd5, 0x98, 0x03, 0xa1, \n  0x6a, 0x02, 0x45, 0x2b, 0xfe, 0xf3, 0xe7, 0xfd, 0xc9, 0xf3, 0xfe, 0xc8, 0xae, 0xff, 0xd7, 0xf9, \n  0xfe, 0xd1, 0x7f, 0xfd, 0x4c, 0x3f, 0xfd, 0x29, 0xe9, 0xfe, 0x4c, 0x0a, 0xff, 0x60, 0x3f, 0xfe, \n  0xae, 0x6a, 0xff, 0xb9, 0x0d, 0x00, 0xa0, 0x4c, 0x13, 0x61, 0x9e, 0x15, 0x60, 0x16, 0x07, 0xf2, \n  0xb0, 0x0a, 0x0e, 0x6d, 0x0a, 0xf9, 0x86, 0x01, 0x4a, 0xd2, 0x00, 0x42, 0xf2, 0xff, 0xa0, 0xa3, \n  0xfd, 0x1a, 0x15, 0xfb, 0x07, 0xa7, 0xfa, 0x2b, 0x5a, 0xfe, 0x4b, 0xc5, 0x00, 0x9f, 0x06, 0x01, \n  0xc9, 0xe6, 0x02, 0xa3, 0xa4, 0x01, 0xe1, 0x03, 0xfb, 0x84, 0x87, 0xfc, 0x89, 0xcf, 0x02, 0x0e, \n  0x3e, 0x01, 0x0a, 0x4d, 0xfe, 0x86, 0x70, 0xfe, 0x3f, 0x46, 0xff, 0xb4, 0x80, 0xff, 0xfc, 0xd5, \n  0xfe, 0x07, 0xf6, 0xfd, 0xe3, 0xfa, 0xfd, 0xab, 0x79, 0xff, 0x4f, 0xf9, 0xfe, 0xd0, 0xe4, 0xfd, \n  0x7a, 0x40, 0xff, 0xde, 0x15, 0x00, 0x5e, 0x20, 0x10, 0x97, 0xff, 0x12, 0xaa, 0x07, 0x07, 0x66, \n  0xe9, 0x09, 0xc8, 0xac, 0x09, 0x21, 0xb0, 0x01, 0xf8, 0xfa, 0x00, 0xa1, 0x18, 0x00, 0x4d, 0x0b, \n  0xfe, 0xac, 0x40, 0xfc, 0x04, 0xb1, 0xfb, 0x3d, 0xf9, 0xfd, 0x2b, 0x52, 0x00, 0x9d, 0x33, 0x02, \n  0x70, 0xa1, 0x03, 0xd0, 0x5c, 0x01, 0x9e, 0x32, 0xfc, 0xde, 0x1b, 0xfd, 0x9a, 0x72, 0x01, 0x75, \n  0xda, 0x00, 0xe7, 0xe0, 0xfe, 0x0b, 0xa3, 0xfe, 0x18, 0x27, 0xff, 0x99, 0x82, 0xff, 0xf2, 0x82, \n  0xff, 0xb0, 0xf0, 0xfe, 0x9f, 0x99, 0xfe, 0xa2, 0x4f, 0xff, 0x07, 0x5e, 0xfe, 0x76, 0xc4, 0xfd, \n  0xa4, 0x7b, 0xff, 0x06, 0x0e, 0x00, 0xd7, 0x67, 0x0c, 0xfe, 0x58, 0x10, 0x5f, 0xbd, 0x07, 0x30, \n  0x63, 0x08, 0xa2, 0xeb, 0x07, 0xce, 0xc2, 0x02, 0xf3, 0x1f, 0x02, 0x59, 0x50, 0x00, 0x30, 0x26, \n  0xfe, 0x2d, 0x0b, 0xfd, 0x14, 0x11, 0xfd, 0xe8, 0xfd, 0xfe, 0xc5, 0x2e, 0x01, 0x96, 0x24, 0x03, \n  0x4c, 0x9e, 0x03, 0x41, 0x37, 0x01, 0x5f, 0x6f, 0xfd, 0xda, 0xe6, 0xfd, 0x5a, 0xc9, 0x00, 0x66, \n  0x75, 0x00, 0x62, 0x29, 0xff, 0x32, 0xed, 0xfe, 0x3f, 0xa7, 0xff, 0x17, 0x72, 0x00, 0xd6, 0x30, \n  0x00, 0xc3, 0x20, 0xff, 0x5d, 0x69, 0xfe, 0xae, 0xfe, 0xfe, 0x17, 0xd2, 0xfe, 0x3a, 0x61, 0xfe, \n  0x9e, 0x82, 0xff, 0xf9, 0xfb, 0xff, 0xe5, 0x66, 0x09, 0x2a, 0xa4, 0x0c, 0xd9, 0x2b, 0x08, 0xe8, \n  0x91, 0x08, 0x6f, 0xdf, 0x06, 0x88, 0x5c, 0x03, 0x32, 0x3d, 0x02, 0xc4, 0x6e, 0x00, 0xd6, 0x25, \n  0xff, 0xaa, 0x3f, 0xfe, 0xbe, 0xa2, 0xfe, 0x13, 0xef, 0xff, 0x66, 0x5d, 0x01, 0x74, 0x92, 0x03, \n  0xce, 0x0f, 0x04, 0x69, 0x72, 0x01, 0x42, 0x51, 0xfe, 0xe4, 0x8f, 0xfe, 0x7c, 0x2b, 0x00, 0x70, \n  0xee, 0xff, 0xee, 0x63, 0xff, 0x86, 0x93, 0xff, 0x01, 0x60, 0x00, 0x01, 0x6a, 0x00, 0xf8, 0xb6, \n  0xff, 0xb2, 0x5d, 0xff, 0x6f, 0x23, 0xff, 0xdf, 0x4c, 0xff, 0x23, 0xf1, 0xfe, 0xb4, 0xa7, 0xfe, \n  0x35, 0x6e, 0xff, 0xb4, 0xd9, 0xff, 0xd0, 0x23, 0x07, 0xed, 0x34, 0x0a, 0x26, 0xa5, 0x07, 0x5a, \n  0x3f, 0x07, 0x26, 0xa4, 0x05, 0x21, 0x70, 0x03, 0xe2, 0xe0, 0x02, 0xfa, 0x4e, 0x01, 0x6b, 0xee, \n  0xff, 0xde, 0x28, 0x00, 0xee, 0xc0, 0x00, 0x63, 0x6e, 0x01, 0x08, 0x64, 0x02, 0xdc, 0x8a, 0x03, \n  0x3a, 0x23, 0x04, 0x1a, 0xc2, 0x01, 0x1b, 0xa8, 0xfe, 0x49, 0x9f, 0xfe, 0x45, 0x7d, 0xff, 0x13, \n  0x03, 0x00, 0x51, 0x58, 0x00, 0x37, 0xea, 0xff, 0x4a, 0xe7, 0xff, 0x12, 0x51, 0x00, 0x30, 0x49, \n  0x00, 0xb7, 0xda, 0xff, 0x24, 0x57, 0xff, 0x5d, 0x4a, 0xff, 0x66, 0x30, 0xff, 0x5a, 0xff, 0xfe, \n  0xaa, 0x8a, 0xff, 0xd4, 0x0f, 0x00, 0x2a, 0x4f, 0x06, 0x1a, 0xb5, 0x08, 0xb8, 0x7b, 0x06, 0xa6, \n  0xb6, 0x05, 0x0c, 0x94, 0x04, 0x0c, 0xbb, 0x03, 0x8b, 0x7b, 0x03, 0x04, 0x0b, 0x03, 0xde, 0xf4, \n  0x01, 0x6c, 0x2d, 0x01, 0x9a, 0x19, 0x02, 0x58, 0xbd, 0x02, 0x0c, 0x05, 0x03, 0x35, 0x84, 0x03, \n  0xa6, 0x31, 0x03, 0xa4, 0xe2, 0x00, 0x64, 0x9f, 0xfe, 0x43, 0x29, 0xff, 0x11, 0x21, 0x00, 0x62, \n  0x5d, 0x00, 0xe1, 0x56, 0x00, 0x92, 0xd5, 0xff, 0xf6, 0xee, 0xff, 0xff, 0x5b, 0x00, 0x8d, 0x6f, \n  0x00, 0x4b, 0x06, 0x00, 0x04, 0x6f, 0xff, 0xb3, 0x79, 0xff, 0xd4, 0x96, 0xff, 0x77, 0xa0, 0xff, \n  0x0a, 0xf1, 0xff, 0xbb, 0x18, 0x00, 0x53, 0x0e, 0x05, 0x34, 0xd0, 0x06, 0x0b, 0x07, 0x05, 0xcc, \n  0x53, 0x05, 0x51, 0x5c, 0x05, 0xc7, 0x9e, 0x04, 0x8f, 0x61, 0x04, 0x61, 0x71, 0x04, 0x1a, 0x1c, \n  0x04, 0x9b, 0x31, 0x03, 0xfd, 0x81, 0x02, 0x1f, 0x2d, 0x02, 0xa1, 0x45, 0x02, 0x21, 0x6f, 0x02, \n  0x0a, 0x21, 0x02, 0xdd, 0xd0, 0x00, 0x3a, 0x99, 0xff, 0x8a, 0xf3, 0xff, 0xc3, 0x42, 0x00, 0x6e, \n  0xe1, 0xff, 0xb1, 0xd9, 0xff, 0xc5, 0xe0, 0xff, 0xf2, 0xec, 0xff, 0x56, 0x47, 0x00, 0xb6, 0xa2, \n  0x00, 0xfa, 0x81, 0x00, 0xa8, 0xf1, 0xff, 0x99, 0xc3, 0xff, 0x53, 0xbc, 0xff, 0xa8, 0xae, 0xff, \n  0x80, 0xf2, 0xff, 0x3e, 0xbe, 0xff, 0x19, 0x9a, 0x04, 0x10, 0x4e, 0x07, 0x10, 0xdb, 0x05, 0xd0, \n  0x5a, 0x06, 0x08, 0x3b, 0x07, 0x0c, 0xcb, 0x05, 0x68, 0x71, 0x04, 0x79, 0xce, 0x03, 0x1a, 0x1e, \n  0x03, 0xe1, 0xcf, 0x02, 0xa8, 0xaf, 0x02, 0xb4, 0x20, 0x02, 0x85, 0x75, 0x01, 0xa9, 0xf2, 0x00, \n  0xcb, 0x2e, 0x01, 0xc5, 0x5a, 0x01, 0x18, 0x9c, 0x00, 0xbc, 0x1f, 0x00, 0x16, 0xd9, 0xff, 0x86, \n  0x5f, 0xff, 0x74, 0x5a, 0xff, 0x79, 0xe1, 0xff, 0xde, 0x74, 0x00, 0x53, 0xb7, 0x00, 0x36, 0xbc, \n  0x00, 0xdb, 0xd7, 0x00, 0x0b, 0xa6, 0x00, 0xf1, 0xdc, 0xff, 0x1f, 0x66, 0xff, 0xc9, 0x50, 0xff, \n  0x40, 0x36, 0xff, 0x85, 0x2c, 0xff, 0xa0, 0x4d, 0x05, 0x18, 0x64, 0x09, 0x61, 0x4a, 0x08, 0xb1, \n  0x45, 0x07, 0xd1, 0x69, 0x06, 0x15, 0x6c, 0x05, 0xf6, 0xde, 0x04, 0xd8, 0x56, 0x03, 0x07, 0xbe, \n  0x01, 0xf2, 0x18, 0x01, 0x5f, 0x2d, 0x01, 0x8d, 0x4f, 0x01, 0x4d, 0xab, 0x01, 0x07, 0xdb, 0x01, \n  0x27, 0x88, 0x01, 0x7a, 0x29, 0x01, 0x96, 0x32, 0x00, 0xac, 0x65, 0xff, 0xd0, 0x58, 0xff, 0xf3, \n  0xb3, 0xff, 0x68, 0x18, 0x00, 0x20, 0xf9, 0xff, 0x78, 0x55, 0x00, 0x95, 0xe7, 0x00, 0x7c, 0xbe, \n  0x00, 0xbd, 0xb3, 0x00, 0x4f, 0xb0, 0x00, 0xbb, 0x0d, 0x00, 0x58, 0x3b, 0xff, 0xee, 0xcd, 0xfe, \n  0x73, 0x96, 0xfe, 0x52, 0xba, 0xfe, 0x40, 0x27, 0x06, 0x90, 0xe9, 0x09, 0x3d, 0x2c, 0x08, 0x99, \n  0xed, 0x06, 0x39, 0x14, 0x06, 0x38, 0x85, 0x05, 0xe9, 0x20, 0x05, 0xa2, 0x88, 0x03, 0x73, 0x7f, \n  0x01, 0x5d, 0x04, 0x00, 0x71, 0xb8, 0xff, 0x00, 0xce, 0x00, 0xc3, 0x2b, 0x02, 0xcc, 0xee, 0x01, \n  0xf7, 0x51, 0x01, 0x15, 0x34, 0x01, 0x53, 0x8d, 0x00, 0x04, 0x34, 0x00, 0x48, 0x0d, 0x00, 0xc8, \n  0xb8, 0xff, 0xf3, 0x9a, 0xff, 0xf9, 0xd3, 0xff, 0xf6, 0x67, 0x00, 0x7a, 0x61, 0x00, 0xd6, 0x12, \n  0x00, 0x1c, 0x9f, 0x00, 0xe6, 0x4c, 0x01, 0x2f, 0xec, 0x00, 0x27, 0x88, 0xff, 0x7e, 0x70, 0xfe, \n  0xb2, 0x53, 0xfe, 0x2c, 0xa4, 0xfe, 0xe0, 0x2d, 0x06, 0x8d, 0xb5, 0x09, 0xe1, 0xfc, 0x06, 0x28, \n  0xcd, 0x05, 0x0e, 0xd6, 0x05, 0x5e, 0x84, 0x05, 0xd3, 0x40, 0x05, 0x7d, 0xb3, 0x03, 0xc3, 0x46, \n  0x01, 0x36, 0xf6, 0xff, 0xc0, 0xfa, 0x00, 0xe3, 0xcc, 0x01, 0xdf, 0x11, 0x01, 0x81, 0x88, 0x00, \n  0x72, 0xc1, 0x00, 0x5f, 0xd8, 0x00, 0xfa, 0x02, 0x01, 0x0b, 0xb2, 0x01, 0xd4, 0x23, 0x01, 0x0c, \n  0xf3, 0xff, 0xa9, 0xba, 0xff, 0x06, 0xba, 0xff, 0xc1, 0xdd, 0xff, 0x76, 0xe5, 0xff, 0x41, 0xf2, \n  0xff, 0x74, 0x3f, 0x00, 0xda, 0x65, 0x00, 0x8e, 0xfa, 0x00, 0x15, 0x0c, 0x01, 0xb2, 0xac, 0xff, \n  0x25, 0x78, 0xfe, 0x3d, 0x41, 0xfe, 0x7b, 0x68, 0x07, 0xfc, 0xc8, 0x0a, 0xe6, 0x88, 0x06, 0x39, \n  0x9d, 0x04, 0x7a, 0x09, 0x04, 0x12, 0x05, 0x04, 0x2e, 0xb5, 0x04, 0xcb, 0xac, 0x03, 0xf9, 0x42, \n  0x01, 0xee, 0x35, 0xff, 0xc1, 0xd4, 0x00, 0x4d, 0x0d, 0x03, 0x77, 0x76, 0x02, 0xcc, 0x34, 0x01, \n  0xeb, 0xb0, 0xff, 0x45, 0xf4, 0xfe, 0xea, 0x6b, 0x00, 0x83, 0xea, 0x01, 0x36, 0xc1, 0x01, 0x7a, \n  0x85, 0x01, 0xec, 0xf8, 0x00, 0xab, 0xb1, 0xff, 0x8b, 0xc9, 0xff, 0x75, 0x4d, 0x00, 0xfa, 0xa7, \n  0xff, 0x37, 0x53, 0xff, 0x7a, 0x03, 0x00, 0xfb, 0x67, 0x00, 0x44, 0x54, 0x00, 0xc4, 0xa5, 0x00, \n  0xa2, 0x6b, 0x00, 0x28, 0x7f, 0xff, 0xe2, 0xa3, 0x08, 0xcc, 0xcb, 0x0c, 0x15, 0xe2, 0x06, 0x52, \n  0x2f, 0x04, 0xe8, 0x6b, 0x03, 0xde, 0x20, 0x03, 0x62, 0x07, 0x04, 0x6f, 0x37, 0x02, 0xd3, 0xb5, \n  0xff, 0xa0, 0xaf, 0xfd, 0x5e, 0xbe, 0xff, 0xe3, 0x09, 0x04, 0x2e, 0xc3, 0x03, 0x40, 0x5d, 0x01, \n  0x28, 0x00, 0x00, 0x15, 0xba, 0xff, 0xc3, 0xef, 0xff, 0x23, 0x95, 0x00, 0xe4, 0x70, 0x01, 0x06, \n  0x6e, 0x01, 0xbf, 0x23, 0x01, 0x72, 0xe0, 0x00, 0x84, 0xb1, 0x00, 0x96, 0x4e, 0x00, 0x9c, 0xc6, \n  0xff, 0x12, 0xdd, 0xff, 0x2b, 0xa3, 0xff, 0x02, 0x3e, 0xff, 0x5f, 0xc1, 0xff, 0x14, 0x62, 0x00, \n  0x6a, 0xc7, 0x00, 0x70, 0xf0, 0x00, 0x6f, 0x0c, 0x0b, 0xfc, 0x5a, 0x0f, 0x85, 0x16, 0x07, 0xf0, \n  0x9f, 0x04, 0xb2, 0xaf, 0x03, 0x07, 0x80, 0x02, 0x25, 0x84, 0x03, 0xcd, 0xeb, 0x00, 0x48, 0x8a, \n  0xfd, 0x70, 0xdb, 0xfa, 0xd6, 0x2d, 0xfe, 0x75, 0x99, 0x04, 0xae, 0xb8, 0x03, 0xc9, 0xcf, 0x00, \n  0x8a, 0x31, 0x00, 0x42, 0x09, 0x00, 0xe4, 0x88, 0x00, 0xa0, 0xa2, 0x01, 0xca, 0x63, 0x01, 0x42, \n  0x1c, 0x00, 0x8f, 0xd2, 0x00, 0xe7, 0x5c, 0x01, 0x52, 0xa6, 0x00, 0x68, 0xd0, 0x00, 0x50, 0x93, \n  0x00, 0x2b, 0xc0, 0xff, 0x2f, 0xed, 0xff, 0x61, 0xe3, 0xff, 0xb0, 0x4c, 0xff, 0x57, 0xb2, 0xff, \n  0x2a, 0x65, 0x00, 0x2f, 0x21, 0x01, 0x65, 0xb3, 0x0d, 0xeb, 0x01, 0x12, 0x58, 0xf6, 0x06, 0xc5, \n  0x06, 0x05, 0xe4, 0x05, 0x04, 0x05, 0x11, 0x02, 0x7e, 0xa9, 0x03, 0xa7, 0x23, 0x00, 0xba, 0xec, \n  0xfb, 0x51, 0xb8, 0xf8, 0xf3, 0x10, 0xfd, 0xc7, 0x4b, 0x05, 0xa4, 0x44, 0x03, 0x86, 0x44, 0xff, \n  0xa7, 0x13, 0xff, 0x1a, 0x7e, 0xff, 0x3f, 0xd4, 0x00, 0x1c, 0x56, 0x02, 0x9f, 0xc3, 0x01, 0x64, \n  0xad, 0x00, 0x6d, 0x60, 0x01, 0x1b, 0xa2, 0x00, 0xf6, 0x4c, 0x00, 0xba, 0x0a, 0x01, 0xcc, 0x1c, \n  0x00, 0x77, 0x04, 0x00, 0x4f, 0x6b, 0x00, 0x53, 0xf0, 0xff, 0x58, 0x8f, 0xff, 0x18, 0x3f, 0x00, \n  0x38, 0xc2, 0x00, 0x2c, 0x15, 0x00, 0x01, 0xfe, 0x10, 0x32, 0x5f, 0x14, 0x89, 0x3d, 0x06, 0x0b, \n  0xde, 0x05, 0xe9, 0x6d, 0x04, 0xbe, 0xc3, 0x01, 0x8e, 0x4d, 0x04, 0x5f, 0x9a, 0xff, 0x87, 0x39, \n  0xfa, 0xaf, 0x67, 0xf6, 0x48, 0xa9, 0xfc, 0xa0, 0xa9, 0x06, 0x40, 0xc4, 0x02, 0x10, 0x9e, 0xfd, \n  0xca, 0xd6, 0xfd, 0x4e, 0xa6, 0xfe, 0xa8, 0x37, 0x00, 0x24, 0x2d, 0x02, 0xc6, 0xd2, 0x01, 0x3b, \n  0x9e, 0x00, 0x85, 0x19, 0x02, 0xb2, 0x71, 0x01, 0xbb, 0xfe, 0xff, 0xab, 0x9a, 0x00, 0x2b, 0x24, \n  0x00, 0x0e, 0xf2, 0xff, 0xbf, 0x6c, 0x00, 0xc4, 0x17, 0x00, 0x5a, 0xfd, 0xff, 0xee, 0xc0, 0x00, \n  0x9a, 0x76, 0x00, 0xcb, 0xf0, 0xff, 0x8a, 0x00, 0x16, 0x9a, 0x6c, 0x17, 0xe3, 0x46, 0x04, 0x18, \n  0xb3, 0x06, 0x8e, 0xcd, 0x04, 0xc9, 0x26, 0x01, 0x10, 0x14, 0x05, 0xf1, 0x7a, 0xfe, 0xd4, 0x2c, \n  0xf8, 0x98, 0x43, 0xf4, 0x6d, 0xd9, 0xfc, 0x59, 0x56, 0x08, 0xe4, 0xc6, 0x01, 0xea, 0x03, 0xfc, \n  0x52, 0xcb, 0xfc, 0xd1, 0xcc, 0xfd, 0x38, 0xa5, 0xff, 0x81, 0x80, 0x01, 0xd5, 0x0e, 0x01, 0xcb, \n  0x2e, 0x00, 0x99, 0x11, 0x02, 0x16, 0xe4, 0x00, 0x2a, 0xea, 0xff, 0x3f, 0x29, 0x01, 0x2f, 0x41, \n  0x00, 0xdd, 0xb0, 0xff, 0x15, 0x24, 0x00, 0x76, 0x40, 0x00, 0xb1, 0xba, 0xff, 0x92, 0x87, 0x00, \n  0x24, 0xd1, 0x00, 0xe6, 0xc7, 0xff, 0xad, 0xf5, 0x1a, 0xfa, 0x76, 0x1a, 0x9c, 0xc3, 0x01, 0x79, \n  0x4f, 0x07, 0xa5, 0x78, 0x05, 0x11, 0x1b, 0x00, 0x9e, 0x9d, 0x05, 0x70, 0x45, 0xfd, 0x54, 0x1b, \n  0xf6, 0x3e, 0x54, 0xf3, 0xbe, 0xf1, 0xfd, 0xc2, 0x91, 0x09, 0xf9, 0x82, 0x00, 0x7c, 0xbf, 0xfa, \n  0x98, 0x10, 0xfc, 0x25, 0x7b, 0xfd, 0x44, 0x65, 0xff, 0x66, 0x08, 0x01, 0xea, 0xc2, 0x00, 0x08, \n  0x62, 0xff, 0xc2, 0xed, 0x01, 0x8b, 0x7c, 0x00, 0x72, 0x00, 0xff, 0xa8, 0x2a, 0x01, 0x4c, 0x65, \n  0x00, 0x4c, 0x29, 0x00, 0x7e, 0xec, 0xff, 0xba, 0x44, 0xff, 0x31, 0xa0, 0xff, 0x05, 0x95, 0x00, \n  0x4b, 0xbe, 0x00, 0x89, 0x29, 0x00, 0x39, 0x36, 0x20, 0x77, 0xb0, 0x1e, 0x84, 0x3a, 0xff, 0x82, \n  0x5b, 0x07, 0x6d, 0xca, 0x06, 0x36, 0xc7, 0xfe, 0xd4, 0xe8, 0x05, 0x74, 0x2e, 0xfc, 0x5b, 0x77, \n  0xf3, 0xa0, 0x88, 0xf2, 0xde, 0xe9, 0xfe, 0x23, 0x98, 0x0a, 0x8a, 0xf2, 0xff, 0x24, 0xd9, 0xf9, \n  0x8c, 0xd7, 0xfa, 0x41, 0x04, 0xfd, 0x4f, 0xe5, 0xff, 0x6e, 0x2c, 0x00, 0x6e, 0x50, 0x00, 0x84, \n  0x88, 0xff, 0xe8, 0x36, 0x01, 0x44, 0xf1, 0xff, 0xf7, 0xe9, 0xfe, 0x44, 0x10, 0x01, 0x30, 0xf3, \n  0xff, 0xfa, 0x84, 0xff, 0xa2, 0x77, 0xff, 0xbd, 0x35, 0xff, 0x95, 0x5b, 0xff, 0xdc, 0x06, 0x00, \n  0x22, 0xca, 0x00, 0x1d, 0x3d, 0x00, 0xbc, 0x27, 0x24, 0xe6, 0xa9, 0x22, 0x87, 0xe2, 0xfd, 0x98, \n  0xb6, 0x06, 0xa1, 0x9a, 0x07, 0x3e, 0x24, 0xfe, 0x44, 0x29, 0x06, 0xc0, 0x63, 0xfb, 0x5d, 0x4a, \n  0xf1, 0x14, 0x09, 0xf2, 0x6b, 0xb7, 0xff, 0xb7, 0xab, 0x0a, 0x70, 0x69, 0xff, 0x38, 0xa5, 0xf9, \n  0xef, 0x4a, 0xfa, 0x23, 0xb0, 0xfc, 0x51, 0xc7, 0xff, 0x4a, 0x08, 0x00, 0x52, 0x52, 0x00, 0x29, \n  0x1a, 0xff, 0xc0, 0x7c, 0x01, 0x0b, 0x3d, 0x00, 0x9b, 0x60, 0xfe, 0x2f, 0x39, 0x00, 0x3c, 0x2b, \n  0xff, 0x2a, 0xa8, 0xff, 0x85, 0x1f, 0xff, 0x9f, 0x93, 0xfe, 0x15, 0x8d, 0xff, 0xb2, 0x23, 0x00, \n  0xee, 0xcf, 0x00, 0xdd, 0x3b, 0x00, 0xeb, 0x45, 0x27, 0x09, 0x1c, 0x27, 0xd2, 0x52, 0xfe, 0x38, \n  0xf8, 0x05, 0xf0, 0x56, 0x07, 0x52, 0xd8, 0xfc, 0x00, 0x9f, 0x06, 0x07, 0xea, 0xfa, 0x5a, 0x31, \n  0xef, 0x8f, 0x2f, 0xf2, 0x11, 0x14, 0xff, 0x23, 0xb8, 0x08, 0x71, 0xe0, 0xff, 0xef, 0xd8, 0xfa, \n  0x74, 0x29, 0xf9, 0x38, 0x90, 0xfb, 0x2f, 0x76, 0xff, 0x9a, 0x93, 0xff, 0xab, 0xdb, 0x01, 0xfb, \n  0xc8, 0xff, 0x5b, 0xfb, 0xff, 0x6b, 0xd8, 0xff, 0x81, 0x6b, 0xfe, 0x13, 0xdf, 0xff, 0x67, 0x63, \n  0xfe, 0x3c, 0xe1, 0xfe, 0x91, 0xaf, 0xfe, 0xf1, 0x4c, 0xfe, 0xf6, 0x93, 0xff, 0xfb, 0x0a, 0x00, \n  0xa3, 0x1f, 0x01, 0x44, 0x36, 0x00, 0xb0, 0x40, 0x28, 0x77, 0xc3, 0x2a, 0x5e, 0x8a, 0x00, 0xdb, \n  0xce, 0x05, 0x0a, 0xbc, 0x07, 0x9a, 0x07, 0xfb, 0x6b, 0xf8, 0x05, 0x82, 0x0f, 0xfc, 0xdd, 0x8b, \n  0xee, 0x07, 0x02, 0xf3, 0x4c, 0xfd, 0xfd, 0xb6, 0x4d, 0x05, 0x3c, 0xc7, 0xff, 0xb4, 0xf5, 0xfc, \n  0x86, 0x00, 0xfa, 0x2c, 0x47, 0xfa, 0xbb, 0xf1, 0xfe, 0xbb, 0x85, 0xff, 0xb7, 0x18, 0x02, 0xe8, \n  0xdc, 0x00, 0xcc, 0x88, 0xff, 0x80, 0x63, 0xff, 0xfc, 0x32, 0xfe, 0x08, 0x70, 0xff, 0x0d, 0xaa, \n  0xfe, 0xcd, 0xe5, 0xfe, 0x8f, 0x7d, 0xfe, 0xae, 0x4a, 0xfe, 0xd2, 0x7c, 0xff, 0x8b, 0x1f, 0xff, \n  0x5f, 0x8f, 0x00, 0x59, 0xb0, 0x00, 0xe4, 0xfe, 0x28, 0x08, 0x25, 0x2d, 0x3d, 0x49, 0x03, 0x62, \n  0xc2, 0x06, 0xd3, 0x60, 0x08, 0xca, 0xad, 0xf9, 0xf8, 0x98, 0x03, 0xe4, 0x73, 0xfc, 0x98, 0x05, \n  0xef, 0xc1, 0x89, 0xf4, 0xa4, 0x74, 0xfd, 0x32, 0x9b, 0x00, 0x34, 0x14, 0xff, 0xd0, 0xc9, 0xfe, \n  0x1b, 0x3f, 0xfb, 0xdf, 0xa0, 0xfb, 0x14, 0xcd, 0xfd, 0x7e, 0xbb, 0xfd, 0xb4, 0xa9, 0x02, 0xa6, \n  0x39, 0x02, 0xfc, 0xfa, 0xfe, 0xb2, 0x52, 0xfe, 0x3c, 0x65, 0xfe, 0x81, 0xd0, 0xff, 0x08, 0x12, \n  0xff, 0x20, 0xdc, 0xfe, 0x7b, 0x15, 0xfe, 0x0d, 0x41, 0xfe, 0x52, 0x43, 0xff, 0x5e, 0x8a, 0xfe, \n  0xa3, 0x16, 0x00, 0x82, 0x6d, 0x00, 0x19, 0xd5, 0x29, 0xed, 0xab, 0x2e, 0x28, 0xa2, 0x05, 0x65, \n  0x0a, 0x09, 0x88, 0xe0, 0x09, 0x95, 0xc5, 0xf8, 0x51, 0xde, 0x00, 0xc0, 0x4d, 0xfb, 0x18, 0x8e, \n  0xee, 0x93, 0xa6, 0xf6, 0xe0, 0x54, 0xff, 0x49, 0xb3, 0xfb, 0xe6, 0x57, 0xfb, 0x83, 0x15, 0x01, \n  0xd2, 0x03, 0xfe, 0xd7, 0x08, 0xfd, 0xf7, 0x7f, 0xfd, 0x94, 0x9f, 0xfb, 0x91, 0x88, 0x01, 0x2f, \n  0xd1, 0x02, 0x2b, 0x39, 0xff, 0xce, 0x0b, 0xff, 0x08, 0x3d, 0xff, 0x0f, 0x05, 0xff, 0xe3, 0x7a, \n  0xfe, 0x3a, 0x39, 0xff, 0x4b, 0xe2, 0xfd, 0x51, 0xd3, 0xfd, 0x55, 0x48, 0xff, 0x03, 0xb3, 0xfd, \n  0x16, 0x1a, 0xff, 0x82, 0x77, 0x00, 0xb0, 0x71, 0x2b, 0x87, 0x28, 0x2f, 0x41, 0xcb, 0x05, 0x42, \n  0x79, 0x0b, 0xfe, 0xe7, 0x0b, 0x1a, 0x9f, 0xf8, 0x53, 0x0f, 0xff, 0xe9, 0x46, 0xf9, 0xa4, 0xc7, \n  0xed, 0x8d, 0x68, 0xf9, 0x20, 0x2c, 0x01, 0xb5, 0xb0, 0xf7, 0xae, 0xcf, 0xf8, 0x8d, 0xf9, 0x01, \n  0x5c, 0x88, 0xff, 0x5a, 0x68, 0xff, 0xf0, 0xb6, 0xfd, 0x67, 0x88, 0xf9, 0x69, 0x3d, 0x00, 0xbd, \n  0xba, 0x03, 0x6c, 0xe5, 0xff, 0x47, 0x9c, 0xfe, 0x72, 0xba, 0xff, 0x48, 0x9d, 0xff, 0x5b, 0x7c, \n  0xfe, 0x75, 0x93, 0xfe, 0xcb, 0x13, 0xfd, 0xb2, 0x80, 0xfd, 0xf1, 0x24, 0xff, 0x44, 0x79, 0xfd, \n  0xf0, 0x74, 0xfe, 0xf0, 0x11, 0x00, 0x3b, 0x18, 0x2f, 0x83, 0xb0, 0x2e, 0x97, 0x63, 0x03, 0xf4, \n  0xe0, 0x0e, 0x3c, 0xe7, 0x0d, 0x99, 0x15, 0xf8, 0x5f, 0x5f, 0xfd, 0x53, 0xeb, 0xf6, 0x38, 0x93, \n  0xed, 0x80, 0x0a, 0xfc, 0x22, 0x67, 0x04, 0xd7, 0x6c, 0xf3, 0xd1, 0xc3, 0xf3, 0x6c, 0x20, 0x03, \n  0x9e, 0x9e, 0x00, 0x56, 0xfd, 0x01, 0x75, 0x66, 0xff, 0x05, 0x61, 0xf7, 0x44, 0x1f, 0xff, 0x2a, \n  0x97, 0x04, 0x79, 0xfa, 0xff, 0xb1, 0xa3, 0xfd, 0x54, 0x54, 0x00, 0xc2, 0xd6, 0xff, 0x4d, 0xe9, \n  0xfd, 0x05, 0xaa, 0xfe, 0xee, 0xe5, 0xfb, 0x93, 0x9c, 0xfc, 0x67, 0x5c, 0xff, 0xd2, 0x3b, 0xfd, \n  0x8a, 0xdb, 0xfd, 0xe2, 0xc9, 0xff, 0xae, 0xc7, 0x33, 0xe0, 0x0d, 0x2e, 0x4f, 0x67, 0xff, 0x50, \n  0x28, 0x12, 0xa1, 0x1c, 0x0f, 0x7c, 0xab, 0xf6, 0x10, 0x3e, 0xfe, 0xe0, 0x4d, 0xf5, 0xf9, 0x2b, \n  0xec, 0x41, 0x9f, 0xff, 0x55, 0xff, 0x08, 0x96, 0x28, 0xf0, 0x16, 0x67, 0xed, 0xa7, 0x0b, 0x03, \n  0x22, 0x73, 0x02, 0xb0, 0x25, 0x04, 0xf5, 0xad, 0x01, 0x56, 0x6b, 0xf6, 0xfc, 0xaa, 0xfd, 0xbc, \n  0x20, 0x05, 0x9c, 0x33, 0x00, 0x1c, 0xde, 0xfc, 0xb3, 0xd0, 0x00, 0x54, 0xd1, 0xff, 0x8c, 0x98, \n  0xfc, 0x3d, 0x95, 0xfe, 0x0f, 0xe3, 0xfb, 0xd7, 0x48, 0xfc, 0xd6, 0x80, 0xff, 0x23, 0x0f, 0xfd, \n  0x2f, 0x5c, 0xfd, 0x2c, 0x98, 0xff, 0x07, 0x0f, 0x3a, 0xd5, 0xd1, 0x2e, 0x85, 0x5c, 0xf9, 0x6a, \n  0xf1, 0x12, 0x3e, 0xc7, 0x0f, 0x2a, 0xa6, 0xf5, 0x38, 0x41, 0x00, 0x3e, 0xbd, 0xf3, 0xef, 0x42, \n  0xea, 0x98, 0x6c, 0x03, 0xaa, 0x0a, 0x0e, 0x74, 0x5f, 0xee, 0x12, 0x5c, 0xe7, 0xdd, 0x8a, 0x01, \n  0x17, 0x3b, 0x03, 0xbb, 0x25, 0x05, 0x63, 0x64, 0x04, 0x6b, 0x36, 0xf7, 0x2c, 0xa3, 0xfb, 0x62, \n  0xa3, 0x04, 0xd3, 0x20, 0x01, 0x8c, 0x92, 0xfb, 0x38, 0xdb, 0xff, 0xfd, 0x52, 0x00, 0xd6, 0x54, \n  0xfc, 0xdc, 0x60, 0xfe, 0xf5, 0xf0, 0xfa, 0x6b, 0x0f, 0xfb, 0xa6, 0xfe, 0xff, 0x65, 0xbb, 0xfd, \n  0x19, 0x91, 0xfc, 0xf8, 0xeb, 0xfe, 0x6e, 0xf7, 0x40, 0x13, 0x83, 0x33, 0x45, 0x42, 0xf2, 0xbe, \n  0x63, 0x0e, 0x48, 0x27, 0x10, 0x75, 0xb9, 0xf4, 0x0d, 0x6d, 0x03, 0xa7, 0x8d, 0xf6, 0xfa, 0xc5, \n  0xe7, 0x18, 0x2e, 0x02, 0xf6, 0x96, 0x12, 0x09, 0xbf, 0xf1, 0xf1, 0xab, 0xe3, 0xaa, 0x0d, 0xfe, \n  0x5a, 0x43, 0x03, 0x23, 0xab, 0x06, 0xad, 0x3c, 0x06, 0x31, 0x97, 0xf6, 0xc8, 0x43, 0xfa, 0xb1, \n  0xf8, 0x04, 0x9a, 0x97, 0x01, 0xb1, 0x8b, 0xfa, 0xdf, 0x9b, 0xff, 0x59, 0x41, 0x01, 0x2c, 0xb2, \n  0xfb, 0x17, 0xd7, 0xfd, 0xc3, 0xda, 0xfa, 0x53, 0x80, 0xfa, 0x57, 0xf1, 0xff, 0x36, 0xf8, 0xfd, \n  0x31, 0xbe, 0xfc, 0xec, 0x82, 0xfe, 0xf0, 0x68, 0x48, 0xfc, 0x72, 0x39, 0x08, 0xd3, 0xe9, 0x5e, \n  0x00, 0x08, 0x0b, 0x67, 0x0f, 0xc7, 0x37, 0xf3, 0xa8, 0xc7, 0x09, 0x6e, 0xf6, 0xfa, 0x05, 0x03, \n  0xe3, 0x11, 0xb5, 0xff, 0x4a, 0x09, 0x17, 0xd5, 0x9e, 0xf6, 0x5c, 0x8a, 0xe1, 0xcc, 0x54, 0xfa, \n  0x8f, 0x67, 0x02, 0x4d, 0x7f, 0x06, 0x92, 0xba, 0x07, 0x18, 0xef, 0xf6, 0x8f, 0xe8, 0xf7, 0xa1, \n  0xd3, 0x03, 0xb4, 0x24, 0x03, 0x80, 0xf9, 0xfa, 0xf1, 0x42, 0xfe, 0x09, 0x21, 0x01, 0x15, 0xad, \n  0xfb, 0x0b, 0x4d, 0xfe, 0xd8, 0x00, 0xfb, 0x0b, 0x06, 0xf9, 0x1e, 0xe9, 0xff, 0x1c, 0xb8, 0xfe, \n  0xee, 0x69, 0xfc, 0x08, 0xeb, 0xfd, 0xbd, 0xf4, 0x51, 0x12, 0xfb, 0x3a, 0x25, 0xab, 0xe0, 0x94, \n  0xc1, 0x06, 0x33, 0xc9, 0x0c, 0xf8, 0xfd, 0xf1, 0x89, 0xd4, 0x0f, 0xee, 0x48, 0xfb, 0xdb, 0xad, \n  0xe0, 0x2f, 0xc3, 0xff, 0x68, 0x6b, 0x1b, 0x11, 0x3f, 0xfb, 0x0e, 0x2e, 0xdf, 0x3f, 0x02, 0xf6, \n  0xc2, 0xa8, 0xff, 0xa3, 0xcc, 0x07, 0x12, 0x00, 0x0a, 0x0f, 0xdc, 0xf4, 0xea, 0x25, 0xf5, 0x94, \n  0xc6, 0x03, 0x85, 0xd0, 0x04, 0xb2, 0xeb, 0xf9, 0xb7, 0xef, 0xfc, 0x3c, 0x19, 0x02, 0xe6, 0xa9, \n  0xfb, 0x6f, 0xa9, 0xfe, 0x1e, 0x22, 0xfb, 0xe5, 0x34, 0xf8, 0xdd, 0x74, 0xff, 0x07, 0x8e, 0xfe, \n  0x4e, 0xc4, 0xfc, 0xa8, 0x72, 0xfe, 0x15, 0x29, 0x57, 0xfa, 0xa5, 0x3c, 0xa9, 0xd6, 0xdb, 0x63, \n  0xbc, 0x05, 0x85, 0x1f, 0x0a, 0xc4, 0xf6, 0xf0, 0xa0, 0x04, 0x14, 0x25, 0xec, 0xfb, 0xe8, 0xc0, \n  0xdf, 0x49, 0xd5, 0xfd, 0x55, 0x2c, 0x1e, 0xe1, 0xb1, 0x00, 0xa0, 0xe2, 0xdc, 0x60, 0xbc, 0xf2, \n  0xeb, 0xc8, 0xfd, 0x42, 0x87, 0x06, 0x77, 0xca, 0x0a, 0x15, 0x1c, 0xf5, 0xe2, 0x15, 0xf4, 0x89, \n  0x38, 0x02, 0x71, 0x02, 0x05, 0x34, 0x8b, 0xf9, 0x99, 0x45, 0xfc, 0xe7, 0xaf, 0x02, 0x32, 0x40, \n  0xfb, 0x29, 0x4a, 0xff, 0x32, 0x9d, 0xfb, 0xbb, 0xe6, 0xf6, 0xab, 0xef, 0xfe, 0x10, 0x57, 0xff, \n  0xbe, 0x90, 0xfd, 0xb9, 0x54, 0xfe, 0x9a, 0xb3, 0x5d, 0xfb, 0xaf, 0x3d, 0x71, 0xa4, 0xd7, 0x7d, \n  0xc9, 0x04, 0xe4, 0x34, 0x05, 0xb8, 0x4f, 0xf1, 0x29, 0xbf, 0x19, 0x23, 0x94, 0xfc, 0xa6, 0x4d, \n  0xde, 0x39, 0x8e, 0xfa, 0xd6, 0xc1, 0x20, 0x36, 0x44, 0x06, 0x81, 0x54, 0xdd, 0x3c, 0xc5, 0xf0, \n  0xfe, 0x05, 0xf8, 0xee, 0x77, 0x04, 0x83, 0x14, 0x0e, 0x90, 0x0d, 0xf6, 0xef, 0xda, 0xf2, 0xb2, \n  0x94, 0x00, 0x3b, 0x7e, 0x04, 0x5a, 0x35, 0xf9, 0xeb, 0x7f, 0xfc, 0x3c, 0xf3, 0x02, 0x7d, 0xd2, \n  0xfa, 0x65, 0xb8, 0xff, 0xec, 0x37, 0xfb, 0xd1, 0x7f, 0xf6, 0xab, 0xa7, 0xff, 0xb8, 0x37, 0x00, \n  0x06, 0xf3, 0xfd, 0xd4, 0x1c, 0xfe, 0xec, 0xee, 0x5f, 0x0d, 0x14, 0x41, 0x82, 0xb8, 0xd6, 0x8f, \n  0xf2, 0x01, 0x45, 0xa1, 0x02, 0xf8, 0x5b, 0xf1, 0xb6, 0x45, 0x1c, 0xef, 0x4a, 0xfe, 0x08, 0x00, \n  0xde, 0x5a, 0xb3, 0xf5, 0xfd, 0xe3, 0x20, 0x42, 0xfb, 0x0c, 0x88, 0xce, 0xde, 0xd2, 0xf1, 0xed, \n  0xb7, 0x3b, 0xf3, 0x99, 0x33, 0x02, 0xf4, 0x40, 0x11, 0xb0, 0xfd, 0xf7, 0x9f, 0xa0, 0xf1, 0x3b, \n  0xd1, 0xfe, 0x95, 0x12, 0x04, 0x9f, 0x52, 0xf9, 0x7b, 0x96, 0xfc, 0x3f, 0xf0, 0x02, 0xc5, 0xd2, \n  0xf9, 0x91, 0x62, 0xff, 0x57, 0xe1, 0xfb, 0x33, 0xd5, 0xf6, 0x8d, 0xaa, 0xff, 0x0e, 0x83, 0x00, \n  0x4e, 0x4f, 0xfe, 0x38, 0x29, 0xfe, 0x00, 0x44, 0x63, 0x84, 0xd6, 0x41, 0xa3, 0xe3, 0xd7, 0xea, \n  0x26, 0x01, 0xae, 0xa0, 0xfe, 0x4a, 0x7d, 0xf2, 0x5d, 0xad, 0x1c, 0x8a, 0xe4, 0xff, 0x20, 0xc9, \n  0xde, 0x17, 0x5a, 0xf0, 0x02, 0x73, 0x21, 0x4c, 0x41, 0x12, 0x58, 0xd7, 0xe1, 0x13, 0xde, 0xeb, \n  0x53, 0xda, 0xed, 0x67, 0xa7, 0x00, 0xdb, 0x72, 0x13, 0x52, 0x43, 0xfb, 0xe4, 0xfc, 0xf0, 0xb1, \n  0xd9, 0xfc, 0xad, 0x51, 0x04, 0x14, 0xe2, 0xf8, 0x21, 0xf6, 0xfc, 0x48, 0x30, 0x02, 0x07, 0x89, \n  0xf8, 0x21, 0x0d, 0x00, 0x0b, 0xc2, 0xfc, 0x61, 0x1a, 0xf7, 0xc9, 0x44, 0xff, 0x70, 0xf6, 0x00, \n  0x7e, 0x78, 0xfe, 0x8d, 0x4f, 0xfe, 0xa9, 0x79, 0x64, 0x4f, 0x55, 0x43, 0x12, 0xce, 0xd9, 0x08, \n  0xd6, 0x00, 0xf6, 0x5d, 0xfc, 0x45, 0x42, 0xf2, 0xab, 0xfd, 0x1b, 0xce, 0x1d, 0x01, 0x1b, 0x18, \n  0xdf, 0x42, 0x07, 0xec, 0x3e, 0x7d, 0x20, 0x80, 0xe9, 0x15, 0x79, 0x44, 0xe6, 0xf9, 0x9e, 0xea, \n  0x70, 0x25, 0xe9, 0x10, 0x99, 0xff, 0xa9, 0x18, 0x14, 0x0e, 0xab, 0xfe, 0x3c, 0xd7, 0xf1, 0x91, \n  0x1e, 0xfa, 0x09, 0xb2, 0x04, 0xde, 0x0c, 0xf9, 0x1d, 0x2a, 0xfc, 0x3c, 0x56, 0x01, 0xd5, 0x7d, \n  0xf8, 0xd9, 0xb3, 0x00, 0x55, 0x90, 0xfc, 0xc9, 0xe6, 0xf7, 0x43, 0xc4, 0xfe, 0x96, 0x28, 0x00, \n  0x60, 0x58, 0xff, 0x02, 0x4e, 0xfe, 0x91, 0x11, 0x64, 0xa0, 0xe4, 0x44, 0xe8, 0xbf, 0xdc, 0x7a, \n  0x31, 0x01, 0x16, 0x64, 0xfa, 0x64, 0xc1, 0xf1, 0x99, 0x29, 0x1b, 0x3d, 0x22, 0x01, 0xad, 0x9a, \n  0xdf, 0xa9, 0x1e, 0xe8, 0x45, 0xde, 0x1d, 0x5e, 0x1f, 0x19, 0x8c, 0x9f, 0xeb, 0xe9, 0xe2, 0xea, \n  0xd6, 0x4b, 0xe4, 0x9f, 0x72, 0xfd, 0x1e, 0xb8, 0x14, 0xf7, 0x2c, 0x02, 0xe9, 0x88, 0xf3, 0x69, \n  0xe7, 0xf6, 0x48, 0xc1, 0x04, 0xfe, 0xb8, 0xf9, 0x6d, 0x9d, 0xfa, 0xe9, 0x4e, 0x01, 0x65, 0xed, \n  0xf8, 0x15, 0xe8, 0x00, 0x5d, 0xb0, 0xfc, 0x84, 0x21, 0xf8, 0x2e, 0xee, 0xfd, 0x6f, 0xa6, 0xff, \n  0xfe, 0x1a, 0x00, 0xb1, 0x75, 0xfd, 0x94, 0x95, 0x61, 0x5a, 0xb0, 0x47, 0xf2, 0xe6, 0xe1, 0xf9, \n  0xda, 0x02, 0x9a, 0x07, 0xf9, 0xcb, 0xdf, 0xef, 0x52, 0x9b, 0x1a, 0x1d, 0x99, 0x00, 0xc5, 0xd9, \n  0xdf, 0x8d, 0xa8, 0xe4, 0xac, 0xc2, 0x19, 0xe5, 0xea, 0x1b, 0xf4, 0x56, 0xf2, 0x1b, 0xc3, 0xee, \n  0x26, 0x26, 0xdf, 0x9c, 0xad, 0xf8, 0xa2, 0x40, 0x16, 0xd0, 0xab, 0x05, 0xf7, 0xbb, 0xf6, 0x81, \n  0x3a, 0xf4, 0x77, 0x3e, 0x03, 0xda, 0x59, 0xfb, 0x40, 0x92, 0xf9, 0xec, 0x8a, 0x01, 0xab, 0xc1, \n  0xf9, 0x34, 0xd0, 0x01, 0x5f, 0x58, 0xfc, 0xc6, 0x29, 0xf7, 0x61, 0x5e, 0xfe, 0xf1, 0xa3, 0xfe, \n  0x18, 0x2f, 0x00, 0x06, 0x47, 0xfd, 0x62, 0x22, 0x60, 0xb3, 0x2e, 0x46, 0xe4, 0x9f, 0xe7, 0x63, \n  0xd3, 0x05, 0xf2, 0xfa, 0xf6, 0x84, 0x9d, 0xf0, 0x60, 0x6f, 0x18, 0x95, 0xb9, 0xff, 0xa6, 0x47, \n  0xe0, 0xf4, 0x66, 0xe1, 0x9d, 0x39, 0x17, 0x5e, 0x41, 0x1b, 0xf7, 0x66, 0xf7, 0x70, 0x3a, 0xf4, \n  0x95, 0x28, 0xdc, 0x91, 0x8d, 0xf4, 0xd4, 0x57, 0x16, 0xcc, 0x99, 0x07, 0x7a, 0xfc, 0xf8, 0xdd, \n  0xcc, 0xf3, 0x04, 0x4e, 0x01, 0x04, 0x70, 0xfc, 0x1b, 0x3a, 0xfa, 0x04, 0xe1, 0x00, 0xce, 0xa8, \n  0xfa, 0xf7, 0xee, 0x01, 0x29, 0xf3, 0xfb, 0x55, 0x47, 0xf7, 0x02, 0xce, 0xfd, 0x9d, 0xa9, 0xfd, \n  0x86, 0x3e, 0x00, 0x34, 0x7e, 0xfd, 0xef, 0x7c, 0x5c, 0x34, 0x20, 0x46, 0xbe, 0x33, 0xef, 0xcd, \n  0x5a, 0x07, 0xb9, 0x4c, 0xf6, 0xc7, 0x28, 0xf1, 0x99, 0x65, 0x14, 0xe7, 0x32, 0x01, 0xb5, 0xce, \n  0xe1, 0xe8, 0xfe, 0xdb, 0x3e, 0xd0, 0x13, 0x50, 0x3d, 0x1a, 0x0a, 0xb4, 0xfb, 0xdb, 0xab, 0xfc, \n  0x4d, 0xcc, 0xda, 0x11, 0x2e, 0xed, 0x08, 0x5f, 0x16, 0xfa, 0x83, 0x09, 0x23, 0x77, 0xfa, 0x07, \n  0xfa, 0xf5, 0xde, 0x6c, 0xff, 0x77, 0xc2, 0xfc, 0xac, 0x6d, 0xfc, 0x9b, 0x9b, 0xff, 0xed, 0xcd, \n  0xf9, 0xfb, 0x46, 0x03, 0x89, 0x82, 0xfc, 0x42, 0xd3, 0xf5, 0xb7, 0xbc, 0xfd, 0xab, 0xf0, 0xfc, \n  0x7b, 0x40, 0xff, 0xea, 0x1b, 0xff, 0x3a, 0xd9, 0x58, 0x86, 0x75, 0x45, 0x1d, 0xa6, 0xf4, 0x69, \n  0xcd, 0x06, 0x5a, 0xae, 0xf7, 0xd0, 0x44, 0xf4, 0x02, 0x48, 0x0f, 0xc3, 0x16, 0x01, 0x84, 0xe7, \n  0xe3, 0x5f, 0x53, 0xd8, 0xa4, 0xf8, 0x10, 0xd2, 0xbe, 0x18, 0xda, 0xd8, 0xfc, 0x4a, 0x46, 0x03, \n  0x25, 0xf8, 0xdc, 0x07, 0x1d, 0xe6, 0x83, 0xfb, 0x13, 0x7a, 0x29, 0x0b, 0x38, 0x46, 0xfb, 0xee, \n  0xd1, 0xf8, 0x36, 0xf7, 0xfe, 0x2f, 0xea, 0xfb, 0x32, 0x64, 0xfd, 0xb0, 0x87, 0xff, 0x1b, 0x71, \n  0xf9, 0x10, 0xe4, 0x02, 0x97, 0x4d, 0xfc, 0xca, 0x0e, 0xf5, 0x66, 0x13, 0xfe, 0xda, 0x9b, 0xfc, \n  0xb6, 0xc8, 0xfe, 0xbe, 0xae, 0x00, 0x15, 0x4c, 0x55, 0xbb, 0xa7, 0x40, 0xde, 0x37, 0xfb, 0xb0, \n  0x49, 0x0b, 0x0b, 0xc4, 0xf6, 0x9b, 0xcc, 0xf5, 0x04, 0x93, 0x0b, 0x96, 0x44, 0x00, 0xa5, 0xbe, \n  0xe7, 0xbd, 0x38, 0xd5, 0x4e, 0x75, 0x0b, 0xe5, 0x57, 0x18, 0x33, 0x41, 0xfe, 0x37, 0xd4, 0x08, \n  0x76, 0x48, 0xe1, 0x3a, 0xfd, 0xdd, 0xb3, 0x5b, 0x0f, 0xec, 0xb9, 0x0d, 0x05, 0x95, 0xfc, 0xef, \n  0xe3, 0xfb, 0xd2, 0xf3, 0xfe, 0xb4, 0x93, 0xfb, 0x05, 0x83, 0xfe, 0x5b, 0xe6, 0xfe, 0xdf, 0xcd, \n  0xf8, 0x1b, 0x47, 0x02, 0x49, 0x75, 0xfc, 0x87, 0x05, 0xf4, 0xa9, 0xe6, 0xfd, 0x99, 0xe3, 0xfd, \n  0x53, 0x6e, 0xfe, 0x97, 0x6c, 0x01, 0x9e, 0x4b, 0x50, 0xeb, 0x54, 0x3e, 0x96, 0xb7, 0xfd, 0x61, \n  0x55, 0x10, 0xdf, 0x63, 0xf8, 0x91, 0xb9, 0xf2, 0xd6, 0x21, 0x0c, 0x62, 0x59, 0xff, 0x90, 0x28, \n  0xe9, 0xe4, 0x05, 0xd6, 0x72, 0xad, 0x04, 0xe4, 0xfa, 0x18, 0xc5, 0xe1, 0xfe, 0xe8, 0x20, 0x0a, \n  0xbc, 0xf9, 0xe7, 0xad, 0x8d, 0xd7, 0xae, 0xa8, 0x08, 0x2d, 0x10, 0x11, 0x8d, 0xaf, 0xfe, 0x8f, \n  0x5e, 0xfc, 0xa1, 0xe5, 0xfe, 0x00, 0x59, 0xfc, 0x31, 0xc1, 0xfe, 0xd3, 0x72, 0xff, 0x01, 0xe6, \n  0xf7, 0x54, 0xef, 0xfe, 0x2d, 0x17, 0xfe, 0xc8, 0x8e, 0xf5, 0x75, 0xd2, 0xfc, 0xa0, 0x10, 0xfe, \n  0xe9, 0x69, 0xfe, 0x24, 0x97, 0x02, 0x16, 0xb9, 0x4c, 0xbd, 0x32, 0x3e, 0x52, 0x07, 0xfd, 0x0a, \n  0x46, 0x10, 0x05, 0x18, 0xfe, 0xfc, 0x28, 0xf1, 0xc9, 0xb4, 0x0a, 0xb0, 0x7d, 0x00, 0xbd, 0xf0, \n  0xe9, 0x23, 0x3a, 0xd8, 0x1a, 0xcf, 0x00, 0x3c, 0x72, 0x1a, 0x2a, 0xd4, 0xfc, 0x50, 0x3a, 0x06, \n  0x05, 0xa1, 0xf2, 0x52, 0xf0, 0xd5, 0xc1, 0x2a, 0xff, 0x3e, 0x8b, 0x12, 0xc4, 0x00, 0x01, 0x27, \n  0x73, 0xfe, 0xf5, 0x5c, 0xff, 0xae, 0x63, 0xfb, 0xe7, 0x00, 0xff, 0x5b, 0xae, 0x00, 0xe2, 0xf8, \n  0xf6, 0x6b, 0x11, 0xfc, 0x0b, 0x6c, 0x00, 0xe5, 0xc5, 0xf6, 0xd5, 0xa9, 0xfb, 0xcc, 0x32, 0x00, \n  0x0d, 0x64, 0xfe, 0x64, 0x54, 0x01, 0x25, 0x63, 0x4a, 0x21, 0x5b, 0x3c, 0x4b, 0xff, 0xfa, 0x1c, \n  0xfd, 0x10, 0x4e, 0x1a, 0x03, 0x63, 0x83, 0xee, 0xae, 0x71, 0x06, 0x89, 0x44, 0x02, 0x49, 0x15, \n  0xef, 0xcf, 0xef, 0xdc, 0x6a, 0x4e, 0xfb, 0x70, 0x4c, 0x18, 0xf4, 0x4f, 0xfd, 0x3c, 0x9e, 0x00, \n  0x48, 0x07, 0xfb, 0xa0, 0xc8, 0xda, 0xf1, 0xd6, 0xf3, 0xf3, 0xab, 0x10, 0x2d, 0x54, 0x04, 0x68, \n  0xb6, 0xfe, 0x7c, 0x7e, 0x01, 0xec, 0xa7, 0xfc, 0x7b, 0x60, 0xfd, 0x87, 0x96, 0xfe, 0xf3, 0x6a, \n  0xf7, 0xac, 0x3c, 0xfc, 0x1c, 0x26, 0x01, 0x47, 0xa0, 0xf8, 0x07, 0x8e, 0xfb, 0x11, 0xc7, 0x00, \n  0x96, 0x14, 0xfe, 0xec, 0x63, 0x00, 0x51, 0x17, 0x47, 0x72, 0x1b, 0x3c, 0x89, 0x01, 0xf9, 0xe3, \n  0x5b, 0x0f, 0x07, 0x34, 0x07, 0x54, 0xc0, 0xf1, 0xb5, 0x46, 0x04, 0x22, 0xda, 0xfb, 0x3f, 0x08, \n  0xf5, 0x16, 0xe1, 0xe5, 0x3b, 0x62, 0xf4, 0x04, 0x7c, 0x18, 0xa8, 0x1e, 0xff, 0x3b, 0x20, 0xf8, \n  0x3f, 0xb5, 0x01, 0x9a, 0xdf, 0xe2, 0x7d, 0x15, 0xeb, 0x68, 0xcf, 0x0c, 0xc6, 0x50, 0x07, 0x31, \n  0x98, 0xfd, 0xf4, 0xf9, 0x01, 0x58, 0x70, 0x00, 0x4e, 0xe7, 0xfb, 0x5a, 0x5d, 0xfb, 0x9a, 0x3d, \n  0xf9, 0x69, 0x24, 0xfc, 0x0a, 0x32, 0x02, 0x91, 0x1a, 0xfc, 0x9c, 0x99, 0xf9, 0x13, 0x96, 0xff, \n  0xf8, 0x56, 0xff, 0x3f, 0xe9, 0xff, 0x6e, 0x9f, 0x42, 0x67, 0xca, 0x38, 0xd3, 0xb8, 0xf8, 0x0d, \n  0x47, 0x10, 0x7d, 0x05, 0x0b, 0x60, 0x0a, 0xf3, 0xd3, 0x71, 0x03, 0x55, 0xf5, 0xf8, 0x89, 0x7b, \n  0xf5, 0x38, 0x9f, 0xee, 0x16, 0xb3, 0xf2, 0x61, 0x30, 0x14, 0xf9, 0x8e, 0x03, 0x5e, 0xb5, 0xf3, \n  0x3e, 0x4b, 0x03, 0x8f, 0xd2, 0xec, 0xcd, 0x01, 0xe5, 0x71, 0xcf, 0x06, 0x47, 0x31, 0x0a, 0xfd, \n  0x05, 0xfc, 0xa1, 0xe5, 0x00, 0x4b, 0x38, 0x03, 0x15, 0xf4, 0xfc, 0x60, 0x99, 0xf9, 0xc8, 0x4c, \n  0xf9, 0x0e, 0x51, 0xfd, 0x77, 0x39, 0x03, 0x67, 0x79, 0xfe, 0xad, 0x29, 0xf8, 0x43, 0xdf, 0xfd, \n  0x8a, 0xdf, 0x00, 0xe6, 0xac, 0xff, 0x6a, 0xfa, 0x3e, 0x71, 0xb9, 0x33, 0x3d, 0x70, 0xf9, 0xcd, \n  0xf7, 0x12, 0xbe, 0x11, 0x0c, 0x14, 0xe7, 0xf2, 0x14, 0xcc, 0x01, 0xff, 0x9c, 0xfb, 0xf9, 0x85, \n  0xf7, 0xf1, 0x23, 0xed, 0xb9, 0xc0, 0xf3, 0xab, 0xf4, 0x13, 0x58, 0x5a, 0x04, 0x8a, 0x78, 0xf3, \n  0xce, 0x40, 0x02, 0x97, 0x5e, 0xf3, 0x1f, 0x9a, 0xe5, 0xcb, 0x9c, 0x00, 0xa5, 0x48, 0x0a, 0xc6, \n  0x70, 0xfc, 0x7e, 0x19, 0xff, 0x19, 0x7c, 0x02, 0x0c, 0xd6, 0xfd, 0xdb, 0xbc, 0xfb, 0x4b, 0xf1, \n  0xf9, 0xf3, 0x5e, 0xfc, 0x90, 0x5b, 0x03, 0x9b, 0xaf, 0xff, 0xc2, 0xb3, 0xf7, 0xf7, 0x85, 0xfd, \n  0x71, 0xce, 0x01, 0xbb, 0x44, 0xff, 0x26, 0xe5, 0x38, 0x88, 0xda, 0x2e, 0xba, 0x5f, 0xfb, 0x81, \n  0xc0, 0x14, 0x8b, 0x16, 0x0d, 0x1e, 0x65, 0xf2, 0x56, 0x5a, 0x01, 0x96, 0x1e, 0xff, 0x60, 0x50, \n  0xfa, 0xe6, 0x0d, 0xed, 0xfc, 0xf6, 0xef, 0x67, 0xb5, 0x12, 0x43, 0x58, 0x09, 0xfc, 0x0a, 0xf2, \n  0x0d, 0x03, 0x01, 0xa0, 0xa1, 0xfa, 0xa0, 0x38, 0xe6, 0xca, 0xd5, 0xfc, 0x89, 0xfb, 0x0a, 0x58, \n  0x5e, 0xfb, 0x5b, 0x1a, 0xfc, 0x3c, 0x8c, 0x01, 0x03, 0xe9, 0xfd, 0xe1, 0x5a, 0xfd, 0xc2, 0x65, \n  0xfd, 0x41, 0xb5, 0xfb, 0x6f, 0xf2, 0xff, 0x84, 0xa8, 0x00, 0xd0, 0xd8, 0xf9, 0x43, 0x3a, 0xfe, \n  0xaa, 0xf5, 0x01, 0x59, 0x7e, 0xfe, 0x66, 0x21, 0x32, 0xca, 0xe4, 0x29, 0x8f, 0xd4, 0xfe, 0xe8, \n  0x13, 0x17, 0x28, 0x2e, 0x0d, 0xbe, 0xe4, 0xf1, 0xe0, 0x28, 0x01, 0x84, 0xc0, 0x02, 0x24, 0x97, \n  0xfc, 0xff, 0xdb, 0xed, 0x28, 0xbb, 0xee, 0x20, 0xf2, 0x0c, 0xd2, 0x93, 0x0a, 0xa9, 0x48, 0xf7, \n  0xed, 0xf5, 0xff, 0xd4, 0x41, 0xfc, 0xe6, 0xa1, 0xe9, 0xac, 0x21, 0xfb, 0xcb, 0x1c, 0x0a, 0xd2, \n  0xcb, 0xfb, 0xa1, 0xf7, 0xfa, 0xd2, 0x4d, 0x00, 0xee, 0xb7, 0xfc, 0x0a, 0xa9, 0xfd, 0x5f, 0x8e, \n  0xff, 0xa4, 0x5a, 0xfc, 0x22, 0x39, 0xfe, 0x36, 0x53, 0x00, 0xd8, 0xaf, 0xfb, 0x0b, 0x07, 0xff, \n  0xe6, 0x51, 0x02, 0x39, 0xe0, 0xfe, 0x14, 0x21, 0x33, 0x46, 0x04, 0x26, 0xad, 0x22, 0xfd, 0xa3, \n  0x3c, 0x1e, 0xe6, 0x81, 0x09, 0x2d, 0x30, 0xe9, 0xcb, 0xd1, 0x01, 0xb6, 0x3b, 0x01, 0xa2, 0x11, \n  0xf6, 0x45, 0x0f, 0xe7, 0x1d, 0xed, 0xf6, 0x6a, 0x11, 0x1b, 0xa1, 0xb1, 0x05, 0xd4, 0xa0, 0xf7, \n  0x83, 0x47, 0x0d, 0x03, 0x20, 0x00, 0xe8, 0xc2, 0xea, 0x36, 0x70, 0xfe, 0x30, 0x9d, 0x08, 0x69, \n  0x49, 0xf8, 0x00, 0x70, 0xf8, 0x3f, 0x4a, 0xfb, 0x7d, 0xe7, 0xf8, 0x52, 0x54, 0xfe, 0xc4, 0xcb, \n  0xfc, 0x0d, 0xb8, 0xf9, 0xf4, 0xe3, 0xfe, 0x46, 0x2c, 0xfe, 0xa0, 0x81, 0xfb, 0x5f, 0xa9, 0x00, \n  0x9a, 0x7e, 0x01, 0x97, 0xa8, 0xfd, 0x73, 0xa8, 0x2a, 0x27, 0x41, 0x24, 0x32, 0x53, 0x02, 0x02, \n  0x7b, 0x1a, 0xef, 0x8f, 0x0c, 0xcb, 0x6c, 0xec, 0xa9, 0x1b, 0xfb, 0x4f, 0x4f, 0xff, 0x5b, 0x9f, \n  0xf7, 0x13, 0x74, 0xee, 0x8b, 0xbb, 0xf9, 0x04, 0xd5, 0x12, 0x87, 0x9a, 0x07, 0xc5, 0x2f, 0xfc, \n  0xd9, 0x58, 0x08, 0x15, 0x55, 0x00, 0x0d, 0x9b, 0xee, 0xa1, 0x4c, 0xf9, 0x26, 0x23, 0x04, 0xbb, \n  0x18, 0xfb, 0xc5, 0x9d, 0xfb, 0x76, 0x2e, 0xfe, 0xa3, 0x2e, 0xf9, 0x4d, 0xd6, 0xfe, 0x85, 0xd0, \n  0xff, 0x68, 0xee, 0xf8, 0x0f, 0xaa, 0xfe, 0x13, 0x2f, 0x00, 0x6d, 0xed, 0xf9, 0x34, 0xc8, 0xfd, \n  0xa2, 0xdd, 0x00, 0x60, 0xc3, 0xfe, 0xb3, 0x46, 0x24, 0xa1, 0x66, 0x20, 0x29, 0x09, 0x05, 0x7b, \n  0xb8, 0x18, 0x77, 0x13, 0x0c, 0x2a, 0xdd, 0xf0, 0xa3, 0xf1, 0xfc, 0xb7, 0xd2, 0xfe, 0x19, 0x8d, \n  0xf8, 0x53, 0x1f, 0xf3, 0x9a, 0x4e, 0xfa, 0x4a, 0x99, 0x0d, 0xa6, 0xec, 0x06, 0xd4, 0xcf, 0xfc, \n  0xd1, 0x00, 0x06, 0x2e, 0xcc, 0x00, 0x4b, 0x81, 0xf1, 0x63, 0x96, 0xf9, 0x6a, 0x89, 0x02, 0x61, \n  0xb7, 0xfb, 0x3c, 0x3c, 0xfd, 0x82, 0xfe, 0xfe, 0x9f, 0xf1, 0xfa, 0x54, 0xc9, 0xff, 0x2e, 0xa7, \n  0xff, 0x11, 0xf8, 0xf9, 0xf8, 0x00, 0xff, 0x5b, 0xd7, 0xff, 0x53, 0x65, 0xfa, 0x37, 0x4a, 0xfd, \n  0xf0, 0xb1, 0xff, 0xdf, 0x80, 0xfe, 0xd0, 0xfd, 0x1d, 0x96, 0xb0, 0x1c, 0x6b, 0xc5, 0x07, 0xff, \n  0x96, 0x16, 0xbb, 0x42, 0x0b, 0xdc, 0x5b, 0xf5, 0x91, 0x4c, 0xfe, 0x34, 0xa5, 0xfe, 0x6f, 0x9d, \n  0xfa, 0xda, 0x98, 0xf6, 0xcf, 0x6d, 0xfa, 0x62, 0xc8, 0x09, 0x27, 0x4f, 0x05, 0x11, 0x2a, 0xfd, \n  0x8e, 0x71, 0x04, 0xf8, 0xad, 0x00, 0x84, 0xa3, 0xf4, 0xad, 0x96, 0xf9, 0x8c, 0xf4, 0x00, 0x12, \n  0x01, 0xfd, 0xb2, 0x64, 0xfd, 0x7d, 0x70, 0xff, 0x3d, 0x04, 0xfe, 0x56, 0x41, 0x01, 0x83, 0xcf, \n  0xff, 0x46, 0xf9, 0xfa, 0x12, 0xb7, 0xfe, 0x0c, 0xf8, 0xfe, 0x1e, 0xfb, 0xfa, 0x64, 0x05, 0xfd, \n  0xcf, 0x51, 0xfe, 0xac, 0xa8, 0xfd, 0xdb, 0xe2, 0x18, 0x46, 0xcb, 0x19, 0xa8, 0x70, 0x09, 0x72, \n  0xe3, 0x13, 0x55, 0x18, 0x0b, 0xda, 0x2f, 0xf9, 0x87, 0x61, 0xfe, 0x8f, 0xa4, 0xff, 0xbf, 0x66, \n  0xfd, 0x68, 0x6e, 0xf8, 0xbc, 0xa6, 0xfa, 0x43, 0x05, 0x07, 0x77, 0xc5, 0x03, 0xc2, 0x6e, 0xfd, \n  0xc1, 0x03, 0x03, 0xca, 0x25, 0x01, 0x1a, 0x06, 0xf7, 0x26, 0x4e, 0xf9, 0x77, 0x7b, 0x00, 0x0e, \n  0xeb, 0xfd, 0xdf, 0xf3, 0xfd, 0x2a, 0x23, 0x01, 0x2a, 0x8f, 0x00, 0x53, 0xaa, 0x01, 0xe9, 0x7a, \n  0xff, 0x0f, 0xd6, 0xfb, 0x57, 0x3a, 0xfe, 0xe5, 0x2c, 0xfe, 0x9f, 0xa3, 0xfb, 0x68, 0x9f, 0xfc, \n  0x83, 0x95, 0xfd, 0x2c, 0xb4, 0xfd, 0xbb, 0xc3, 0x14, 0x5b, 0x9a, 0x17, 0xf1, 0xc7, 0x09, 0x16, \n  0xf4, 0x10, 0x71, 0x62, 0x0b, 0x2f, 0xa8, 0xfb, 0x49, 0xac, 0xfe, 0xdc, 0x76, 0x01, 0x32, 0xf2, \n  0xfe, 0x8f, 0xd5, 0xf9, 0xea, 0x3b, 0xfb, 0x0c, 0x45, 0x04, 0x6a, 0x58, 0x02, 0x80, 0xc5, 0xfd, \n  0x42, 0x2d, 0x02, 0x0e, 0x37, 0x01, 0xb8, 0xaa, 0xf8, 0xbc, 0xd9, 0xf9, 0xec, 0x2b, 0x00, 0xbb, \n  0x4f, 0xff, 0xfb, 0x00, 0x00, 0x75, 0x2c, 0x02, 0x8d, 0xa9, 0x00, 0xfb, 0xe1, 0x00, 0xa5, 0x99, \n  0xff, 0xe6, 0x81, 0xfc, 0x4c, 0xaf, 0xfd, 0xa9, 0xc5, 0xfd, 0xf7, 0xe1, 0xfb, 0xf2, 0x15, 0xfd, \n  0x40, 0xf7, 0xfd, 0x75, 0xae, 0xfd, 0x72, 0x41, 0x12, 0x71, 0x9e, 0x15, 0xc6, 0x37, 0x09, 0x84, \n  0x9e, 0x0e, 0xc4, 0x9a, 0x0a, 0x0a, 0x15, 0xfd, 0xb7, 0xe7, 0xff, 0x3a, 0x66, 0x02, 0x5a, 0x54, \n  0xff, 0x5b, 0x4e, 0xfb, 0xd3, 0x86, 0xfb, 0xf2, 0xb2, 0x01, 0xe7, 0x35, 0x01, 0x30, 0x51, 0xfe, \n  0xe8, 0xf5, 0x01, 0x0d, 0xf8, 0x00, 0x9a, 0xaa, 0xf9, 0xb9, 0x27, 0xfb, 0xf4, 0xd8, 0x00, 0xee, \n  0x8c, 0x00, 0x73, 0x46, 0x01, 0xe7, 0xe9, 0x01, 0xa8, 0xc7, 0xff, 0x9a, 0x2a, 0x00, 0xa9, 0x45, \n  0xff, 0xc8, 0x88, 0xfc, 0x9a, 0x76, 0xfd, 0xc7, 0x58, 0xfe, 0x99, 0x32, 0xfd, 0x29, 0x3a, 0xfd, \n  0x17, 0x81, 0xfd, 0xfd, 0xc3, 0xfd, 0x65, 0xcd, 0x10, 0x02, 0x1b, 0x13, 0x43, 0x87, 0x08, 0x78, \n  0x4d, 0x0d, 0x24, 0x2f, 0x09, 0xe2, 0xe0, 0xfe, 0xb6, 0xac, 0x01, 0x56, 0xa9, 0x02, 0x34, 0xe7, \n  0xff, 0xf8, 0x92, 0xfc, 0x75, 0xc1, 0xfb, 0xd6, 0x12, 0x00, 0x03, 0xdb, 0x00, 0x52, 0x5c, 0xff, \n  0x88, 0x11, 0x02, 0x49, 0x7c, 0x01, 0x45, 0x63, 0xfb, 0x60, 0x49, 0xfc, 0xc2, 0x6a, 0x01, 0x35, \n  0xbb, 0x01, 0x35, 0xab, 0x01, 0x15, 0xe6, 0x00, 0xcb, 0x49, 0xff, 0x02, 0xef, 0xff, 0x60, 0xde, \n  0xfe, 0x7f, 0x73, 0xfd, 0x2d, 0x05, 0xff, 0x06, 0x25, 0xff, 0x2f, 0x4d, 0xfd, 0x36, 0x1d, 0xfd, \n  0x58, 0xde, 0xfd, 0x13, 0x6b, 0xfe, 0x1d, 0x26, 0x0f, 0x1f, 0x12, 0x11, 0x2d, 0xf5, 0x07, 0xd8, \n  0x75, 0x0b, 0xc8, 0x33, 0x08, 0x71, 0xcf, 0x00, 0x96, 0x98, 0x02, 0x1e, 0x81, 0x02, 0xd2, 0x78, \n  0x00, 0xc8, 0x57, 0xfd, 0x10, 0xd0, 0xfb, 0x0b, 0x34, 0xff, 0xad, 0xa9, 0x00, 0xe3, 0x02, 0x01, \n  0x71, 0x69, 0x03, 0x3d, 0x8a, 0x01, 0x21, 0x01, 0xfc, 0x44, 0xe8, 0xfc, 0x89, 0xdc, 0x01, 0x35, \n  0x8b, 0x02, 0x2c, 0x32, 0x01, 0x1f, 0xa8, 0xff, 0x48, 0xeb, 0xfe, 0xa6, 0x66, 0x00, 0xc3, 0xf6, \n  0xff, 0x58, 0x6e, 0xfe, 0x23, 0x25, 0xff, 0x09, 0x29, 0xff, 0x8d, 0xac, 0xfd, 0xb7, 0x5a, 0xfd, \n  0x53, 0x69, 0xfe, 0xee, 0x57, 0xff, 0x19, 0xb6, 0x0c, 0xf1, 0xe4, 0x0f, 0xa5, 0xa8, 0x07, 0x37, \n  0xbc, 0x08, 0xd1, 0xd7, 0x07, 0x0e, 0xf2, 0x02, 0x25, 0x17, 0x03, 0xc7, 0x2d, 0x02, 0x87, 0x86, \n  0x00, 0x00, 0xe0, 0xfd, 0x10, 0x02, 0xfc, 0x19, 0xdf, 0xff, 0x23, 0xbe, 0x02, 0x9e, 0xed, 0x01, \n  0xbe, 0x88, 0x02, 0x96, 0x47, 0x01, 0x25, 0xed, 0xfc, 0x57, 0x78, 0xfd, 0x6f, 0xf4, 0x01, 0x0c, \n  0x87, 0x02, 0xc3, 0x46, 0x00, 0xb6, 0x78, 0xff, 0x62, 0xfd, 0xff, 0x07, 0xaa, 0x00, 0x29, 0x4c, \n  0x00, 0x5e, 0xfb, 0xfe, 0x58, 0xb8, 0xfe, 0x1e, 0x00, 0xff, 0x37, 0x7c, 0xfe, 0x63, 0x6f, 0xfe, \n  0xb9, 0x4c, 0xff, 0xd1, 0x2d, 0x00, 0xb8, 0x4c, 0x09, 0x69, 0x46, 0x0d, 0xda, 0x17, 0x08, 0x2b, \n  0x17, 0x08, 0xfb, 0xfd, 0x07, 0x57, 0xd9, 0x03, 0x20, 0x8e, 0x02, 0xbe, 0x22, 0x02, 0x08, 0x27, \n  0x01, 0xe8, 0x24, 0x00, 0x4f, 0xb0, 0xfe, 0x09, 0xb9, 0xff, 0xce, 0x8b, 0x02, 0x7e, 0xbe, 0x02, \n  0xb4, 0xb5, 0x01, 0xc1, 0xd8, 0x00, 0x59, 0x6e, 0xfe, 0xb6, 0xe4, 0xfd, 0x1e, 0x21, 0x01, 0xbb, \n  0x99, 0x02, 0xa8, 0xc3, 0x00, 0xe1, 0xc1, 0xff, 0x6d, 0x48, 0x00, 0xc4, 0xb5, 0x00, 0x4c, 0x27, \n  0x00, 0x2b, 0x1c, 0xff, 0x0d, 0x5f, 0xff, 0xb2, 0xdd, 0xff, 0xf2, 0x4a, 0xff, 0xbc, 0x6d, 0xff, \n  0x2d, 0xfe, 0xff, 0x7c, 0x8b, 0xff, 0xb4, 0x4f, 0x07, 0xa3, 0x1e, 0x0c, 0x5c, 0x63, 0x08, 0x48, \n  0xa1, 0x05, 0xbb, 0x9f, 0x05, 0xdb, 0x51, 0x05, 0x88, 0x5f, 0x04, 0xf2, 0xa3, 0x02, 0x7b, 0xb7, \n  0x01, 0x9f, 0x7b, 0x01, 0x1e, 0x0a, 0x01, 0xc6, 0xf3, 0x00, 0x0f, 0xdd, 0x01, 0xd0, 0xe6, 0x01, \n  0xd9, 0xa1, 0x00, 0xbc, 0x64, 0x00, 0x0f, 0x94, 0xff, 0xb5, 0xe5, 0xfe, 0x6f, 0x15, 0x01, 0x50, \n  0x4e, 0x02, 0xd6, 0xf8, 0x00, 0xa9, 0xf1, 0xff, 0x40, 0xf6, 0xff, 0x91, 0x75, 0x00, 0xce, 0x8d, \n  0x00, 0xce, 0x4c, 0x00, 0x2c, 0x17, 0x00, 0xa0, 0x2b, 0x00, 0x0e, 0x3f, 0x00, 0x8e, 0x59, 0xff, \n  0xe4, 0x93, 0xfe, 0x24, 0xa9, 0xfe, 0xc2, 0x2f, 0x06, 0xf6, 0x6d, 0x09, 0xc8, 0xcf, 0x06, 0x31, \n  0x51, 0x05, 0x11, 0xf2, 0x05, 0x40, 0x03, 0x06, 0x58, 0x1a, 0x05, 0xf0, 0x96, 0x04, 0x4d, 0x62, \n  0x03, 0xc5, 0xf4, 0x01, 0x2b, 0xa7, 0x01, 0x33, 0x17, 0x01, 0xb5, 0xd0, 0x00, 0xa3, 0x20, 0x01, \n  0xbc, 0xbb, 0x00, 0x5d, 0xa1, 0xff, 0xa1, 0xaa, 0xff, 0xa8, 0xe1, 0x00, 0x33, 0x65, 0x01, 0xa0, \n  0x2e, 0x01, 0x3a, 0x8a, 0x00, 0xe0, 0xed, 0xff, 0x88, 0x3d, 0x00, 0x7e, 0x39, 0x01, 0xea, 0x79, \n  0x01, 0x24, 0xd6, 0x00, 0xcf, 0x6e, 0x00, 0xcc, 0xcc, 0xff, 0x5f, 0xe1, 0xfe, 0x22, 0xa1, 0xfe, \n  0xd7, 0xc7, 0xfe, 0x46, 0xd0, 0xfe, 0x6d, 0xb6, 0x05, 0x52, 0x3c, 0x07, 0x5c, 0xb6, 0x05, 0x61, \n  0x6e, 0x07, 0xf5, 0xd1, 0x07, 0xab, 0xaa, 0x06, 0x27, 0x0d, 0x05, 0x45, 0x81, 0x03, 0x3a, 0x9a, \n  0x03, 0x7c, 0x00, 0x03, 0x19, 0x6a, 0x01, 0xf4, 0xb2, 0x00, 0x35, 0x5d, 0x00, 0xc4, 0x0a, 0x00, \n  0xf6, 0x55, 0x00, 0x18, 0x6a, 0x00, 0x73, 0x49, 0x00, 0x69, 0xcf, 0x00, 0x53, 0xe6, 0x00, 0x5b, \n  0x93, 0x00, 0xb6, 0x03, 0x01, 0x14, 0x61, 0x01, 0x70, 0x1d, 0x01, 0x37, 0xfb, 0x00, 0xbb, 0xf5, \n  0x00, 0x92, 0x86, 0x00, 0xe6, 0xae, 0xff, 0xb1, 0xff, 0xfe, 0xa4, 0x82, 0xfe, 0x5d, 0x7d, 0xfe, \n  0xa5, 0xfe, 0xfe, 0x41, 0x0e, 0xff, 0x88, 0x72, 0x07, 0x2a, 0xe4, 0x09, 0x0b, 0xa4, 0x06, 0x59, \n  0x56, 0x07, 0x94, 0xa4, 0x07, 0x4b, 0x77, 0x06, 0xec, 0x02, 0x05, 0xb1, 0x7c, 0x02, 0xb8, 0x3a, \n  0x01, 0xab, 0xe6, 0x00, 0xf9, 0x1b, 0x01, 0x4d, 0x3b, 0x01, 0x67, 0x87, 0x00, 0x4a, 0x13, 0x00, \n  0x31, 0x64, 0x00, 0x98, 0xe0, 0x00, 0xce, 0x52, 0x00, 0x05, 0xc2, 0xff, 0xb5, 0x97, 0x00, 0x9c, \n  0x9e, 0x01, 0x75, 0x32, 0x02, 0x99, 0x38, 0x02, 0xbb, 0x55, 0x01, 0xd5, 0x25, 0x00, 0x2a, 0x4f, \n  0xff, 0x05, 0x01, 0xff, 0x89, 0xe2, 0xfe, 0x4b, 0xc3, 0xfe, 0x02, 0xe9, 0xfe, 0x25, 0x05, 0xff, \n  0x36, 0xea, 0xfe, 0x4c, 0xe7, 0xfe, 0x7e, 0x6d, 0x06, 0xdc, 0xb5, 0x09, 0xbb, 0xea, 0x07, 0xe7, \n  0x0f, 0x08, 0xe1, 0xaa, 0x07, 0x3e, 0x5c, 0x06, 0x19, 0x60, 0x04, 0x2c, 0xb6, 0x01, 0xad, 0x01, \n  0x01, 0x4f, 0xdc, 0x00, 0x35, 0xdf, 0x00, 0x1b, 0x63, 0x01, 0x2a, 0x78, 0x01, 0xf9, 0x0a, 0x01, \n  0x44, 0x69, 0x00, 0xb0, 0xce, 0xff, 0xb0, 0x98, 0xff, 0xc5, 0x65, 0x00, 0x1a, 0x29, 0x01, 0x7c, \n  0x8b, 0x01, 0xfb, 0x5d, 0x02, 0x0e, 0x81, 0x02, 0x2b, 0x8e, 0x01, 0x18, 0x62, 0x00, 0xf1, 0x08, \n  0xff, 0x80, 0x3b, 0xfe, 0x2a, 0x81, 0xfe, 0x31, 0xc2, 0xfe, 0xd4, 0xf3, 0xfe, 0x0d, 0x36, 0xff, \n  0x25, 0xf8, 0xfe, 0x9b, 0xf8, 0xfe, 0x3f, 0xb5, 0x07, 0x4b, 0xfa, 0x0a, 0x41, 0xc1, 0x06, 0x78, \n  0x06, 0x07, 0xe1, 0xc0, 0x06, 0xa2, 0x75, 0x04, 0x10, 0x3b, 0x04, 0x7d, 0x76, 0x02, 0x59, 0x81, \n  0x00, 0x5a, 0x93, 0x00, 0x60, 0x0e, 0x02, 0x45, 0x0a, 0x02, 0x07, 0x4d, 0x01, 0xd3, 0x7d, 0x01, \n  0x09, 0xd4, 0xff, 0xa8, 0x01, 0xff, 0xc0, 0x32, 0x00, 0xe6, 0xc1, 0x00, 0x5c, 0xeb, 0x00, 0x96, \n  0x5d, 0x01, 0x67, 0x77, 0x02, 0xea, 0x83, 0x02, 0x1d, 0x74, 0x01, 0x1d, 0x8a, 0x00, 0x0b, 0x11, \n  0xff, 0xf8, 0x1a, 0xfe, 0x95, 0x86, 0xfe, 0xf5, 0xbf, 0xfe, 0xde, 0x69, 0xfe, 0x31, 0xee, 0xfe, \n  0xc4, 0x6f, 0xff, 0x87, 0xf9, 0xfe, 0xbb, 0x99, 0x07, 0xe2, 0x5b, 0x0a, 0x21, 0xe8, 0x05, 0xb6, \n  0xf8, 0x05, 0x22, 0xc4, 0x05, 0xb1, 0x7b, 0x04, 0xc1, 0x4f, 0x04, 0x92, 0x63, 0x02, 0x23, 0x1f, \n  0x01, 0x2d, 0x16, 0x01, 0xc2, 0xfa, 0x01, 0x19, 0xf9, 0x01, 0xfb, 0xc9, 0x01, 0x6e, 0xed, 0x01, \n  0x1f, 0x2d, 0x00, 0x9c, 0xf8, 0xff, 0xb8, 0xc5, 0x00, 0x97, 0x86, 0x00, 0xa9, 0x8d, 0x00, 0x31, \n  0xc2, 0x00, 0xfb, 0x63, 0x01, 0x35, 0xc7, 0x01, 0x5b, 0x9a, 0x02, 0xcf, 0x9b, 0x02, 0x0a, 0x1b, \n  0x00, 0xb3, 0xbf, 0xfe, 0x4f, 0x88, 0xfe, 0xa9, 0xfa, 0xfd, 0xfc, 0x94, 0xfe, 0x68, 0x2e, 0xff, \n  0x56, 0x0d, 0xff, 0xce, 0x14, 0xff, 0x1c, 0xa2, 0x08, 0xe1, 0x8a, 0x0b, 0xf6, 0x9d, 0x05, 0x0b, \n  0xa5, 0x04, 0xfa, 0x77, 0x04, 0x71, 0x93, 0x03, 0x1e, 0xf2, 0x03, 0x60, 0x54, 0x02, 0x68, 0x66, \n  0x00, 0x52, 0x12, 0x00, 0x7e, 0x35, 0x02, 0x5d, 0x25, 0x03, 0x61, 0xd8, 0x01, 0xfe, 0xff, 0x00, \n  0xca, 0xf6, 0x00, 0x73, 0xf9, 0x00, 0xf0, 0x2e, 0x00, 0x49, 0x44, 0x01, 0x39, 0xa7, 0x01, 0x02, \n  0x24, 0x00, 0x77, 0xee, 0x00, 0x09, 0x3d, 0x01, 0xdb, 0xef, 0x00, 0x04, 0xe1, 0x01, 0xa7, 0x70, \n  0x02, 0x20, 0xa0, 0x01, 0x90, 0x16, 0xff, 0x9c, 0xc1, 0xfd, 0xad, 0x25, 0xfe, 0x4d, 0x86, 0xfe, \n  0x17, 0x17, 0xff, 0xd3, 0x4d, 0xff, 0x23, 0x89, 0x0a, 0xc4, 0x0d, 0x0e, 0xf4, 0xc8, 0x05, 0x40, \n  0x75, 0x04, 0x51, 0x83, 0x03, 0x0a, 0x3b, 0x01, 0x4b, 0x4b, 0x03, 0x0a, 0x4d, 0x02, 0x5b, 0x6c, \n  0xff, 0xb4, 0x9a, 0xfe, 0xd8, 0x85, 0x01, 0xd9, 0x9b, 0x03, 0xcf, 0xdf, 0x01, 0x1c, 0x9a, 0x01, \n  0x1a, 0x33, 0x01, 0xab, 0xe8, 0xff, 0x57, 0xc1, 0x00, 0x7d, 0x01, 0x02, 0x91, 0x4d, 0x01, 0x4b, \n  0x1a, 0x01, 0xfd, 0xfb, 0x01, 0xe1, 0x92, 0x00, 0x62, 0x01, 0x00, 0xb6, 0x92, 0x01, 0x13, 0x8d, \n  0x01, 0xcc, 0x5c, 0x01, 0xd6, 0x88, 0x01, 0x7d, 0x0e, 0x00, 0xe8, 0x4c, 0xfe, 0x9c, 0x3b, 0xfe, \n  0x5f, 0xf5, 0xfe, 0xbc, 0x27, 0xff, 0x9a, 0x30, 0x0c, 0xeb, 0x3a, 0x0f, 0x5b, 0xbd, 0x05, 0x0c, \n  0x35, 0x05, 0xeb, 0x53, 0x04, 0x74, 0xcd, 0x01, 0x7d, 0x2d, 0x03, 0xc2, 0x86, 0x00, 0xe7, 0x81, \n  0xfc, 0x12, 0x10, 0xfc, 0xda, 0xf4, 0x01, 0x0a, 0xc0, 0x04, 0x4c, 0xe0, 0x00, 0xda, 0x01, 0x01, \n  0x12, 0xf8, 0x00, 0xca, 0xa6, 0xff, 0x76, 0x27, 0x01, 0xe4, 0x4d, 0x01, 0x6c, 0xdb, 0x00, 0xad, \n  0x40, 0x02, 0x3b, 0x86, 0x02, 0x0f, 0xb7, 0x00, 0xf5, 0x86, 0x00, 0x0f, 0xb8, 0x00, 0xc3, 0xf3, \n  0xff, 0x06, 0x12, 0x01, 0xf4, 0x67, 0x01, 0xb3, 0x4d, 0x00, 0x59, 0x90, 0x00, 0xe3, 0x60, 0x00, \n  0xf1, 0xf5, 0xfe, 0x73, 0x11, 0xfe, 0xc8, 0xd1, 0x0e, 0x2a, 0xf0, 0x11, 0x93, 0x67, 0x05, 0x6c, \n  0x44, 0x05, 0x73, 0xe0, 0x04, 0xf2, 0x9d, 0x01, 0xb2, 0x0e, 0x03, 0xa1, 0x44, 0xff, 0x10, 0x4f, \n  0xfa, 0x73, 0x6f, 0xfa, 0xfa, 0x41, 0x02, 0x3e, 0x93, 0x05, 0x43, 0x27, 0x00, 0x86, 0x74, 0xff, \n  0xa8, 0x49, 0xff, 0x7e, 0x0f, 0xff, 0x64, 0x63, 0x01, 0xd2, 0xda, 0x01, 0x29, 0x97, 0x01, 0x90, \n  0x58, 0x01, 0x51, 0xbe, 0x01, 0x7d, 0x25, 0x01, 0x61, 0x65, 0x00, 0x5b, 0x4c, 0x01, 0xbc, 0xe6, \n  0x00, 0xfd, 0x2a, 0x00, 0x39, 0xef, 0xff, 0x57, 0xcd, 0xff, 0xda, 0x85, 0x00, 0xee, 0x07, 0x01, \n  0xb0, 0xaf, 0x00, 0xde, 0xb3, 0xff, 0xf9, 0x18, 0x12, 0xef, 0x88, 0x15, 0xf6, 0x25, 0x05, 0xb7, \n  0xd9, 0x04, 0xc5, 0xa4, 0x04, 0xa8, 0xb9, 0x00, 0x84, 0x83, 0x03, 0x42, 0x03, 0xff, 0x62, 0xfb, \n  0xf7, 0xa3, 0xaf, 0xf8, 0xdf, 0x1b, 0x03, 0x0f, 0x54, 0x06, 0x2d, 0x1e, 0xff, 0x56, 0xb3, 0xfe, \n  0xc4, 0x58, 0xfe, 0xb6, 0xc3, 0xfd, 0x67, 0xcd, 0x00, 0x6f, 0xa6, 0x01, 0xcf, 0x5b, 0x01, 0x82, \n  0x9b, 0x01, 0xfc, 0x67, 0x02, 0x1f, 0x23, 0x00, 0xc5, 0x46, 0xff, 0xec, 0xef, 0x01, 0x66, 0xf1, \n  0x00, 0x83, 0x57, 0x00, 0xe2, 0xc2, 0x00, 0x4d, 0xfe, 0xfe, 0x54, 0x1f, 0xff, 0xa8, 0xc9, 0x00, \n  0x36, 0xff, 0x00, 0x13, 0x1e, 0x00, 0x62, 0x39, 0x16, 0x2c, 0xda, 0x18, 0x77, 0x07, 0x04, 0xa6, \n  0x95, 0x04, 0x07, 0xee, 0x04, 0xdf, 0x6e, 0x00, 0x02, 0x9e, 0x03, 0x92, 0xc4, 0xfd, 0x37, 0x85, \n  0xf5, 0x18, 0xee, 0xf7, 0x40, 0xbd, 0x04, 0xf5, 0x9a, 0x06, 0xe2, 0x18, 0xfe, 0x19, 0x35, 0xfe, \n  0xe2, 0x0c, 0xfd, 0xf6, 0x01, 0xfd, 0x26, 0xdc, 0x00, 0x4a, 0xf0, 0x00, 0x40, 0xc5, 0x00, 0xa0, \n  0x9e, 0x01, 0x8c, 0xdb, 0x01, 0xd0, 0x62, 0xff, 0x97, 0xac, 0xff, 0xb9, 0x79, 0x01, 0xce, 0xca, \n  0xff, 0x4d, 0xe9, 0x00, 0x4c, 0xc3, 0x00, 0x13, 0xab, 0xfe, 0x79, 0xc8, 0xff, 0xb9, 0xe6, 0xff, \n  0x37, 0x90, 0xff, 0x19, 0x69, 0x00, 0x2c, 0x77, 0x1a, 0xc2, 0x34, 0x1c, 0xc3, 0xcb, 0x02, 0xa2, \n  0x7a, 0x04, 0x2c, 0x8c, 0x05, 0xde, 0x47, 0x00, 0x0d, 0xac, 0x03, 0x01, 0xf6, 0xfb, 0xb0, 0x89, \n  0xf2, 0xc7, 0xc2, 0xf7, 0xe1, 0x26, 0x07, 0x20, 0xe7, 0x06, 0xae, 0x11, 0xfd, 0x93, 0xdd, 0xfd, \n  0x8f, 0xa9, 0xfb, 0x52, 0x29, 0xfc, 0xd0, 0x15, 0x01, 0xac, 0xd0, 0x00, 0xcb, 0xa0, 0x00, 0x1f, \n  0x28, 0x01, 0x55, 0x25, 0x01, 0x0c, 0xc4, 0xfe, 0xb2, 0x3d, 0xff, 0x86, 0x91, 0x01, 0x95, 0xca, \n  0xff, 0x3a, 0xf7, 0xff, 0xb3, 0xf7, 0xff, 0xf6, 0x8c, 0xfe, 0x5c, 0x30, 0xff, 0xb4, 0x32, 0x00, \n  0x86, 0xa0, 0x00, 0x9a, 0xcc, 0xff, 0x89, 0xf4, 0x1e, 0x69, 0xf8, 0x1f, 0x6c, 0xc7, 0x01, 0xad, \n  0x44, 0x04, 0x80, 0x6d, 0x05, 0x95, 0x66, 0xff, 0x65, 0xd8, 0x03, 0xe0, 0x36, 0xfa, 0x88, 0xe4, \n  0xef, 0x5d, 0x3d, 0xf8, 0x3b, 0xef, 0x08, 0x10, 0xa4, 0x06, 0xa8, 0x98, 0xfc, 0x27, 0xcf, 0xfd, \n  0x4c, 0x46, 0xfa, 0x7d, 0x5a, 0xfb, 0x05, 0x19, 0x01, 0xf1, 0x93, 0x00, 0x64, 0xdc, 0x00, 0x78, \n  0x26, 0x01, 0xdf, 0x55, 0x00, 0x23, 0xd3, 0xfd, 0xf1, 0xfd, 0xfe, 0x8d, 0x77, 0x01, 0x27, 0x7c, \n  0xff, 0x24, 0xdc, 0xff, 0x55, 0xf5, 0xfe, 0xc3, 0x59, 0xfd, 0x3c, 0xfc, 0xfe, 0xf8, 0x41, 0x00, \n  0xf3, 0x7c, 0x00, 0x00, 0x93, 0xff, 0x8b, 0x87, 0x22, 0x54, 0x1d, 0x24, 0x12, 0xc6, 0x01, 0xe8, \n  0xdc, 0x03, 0x7c, 0x54, 0x05, 0xe3, 0xed, 0xfd, 0x7f, 0x8e, 0x03, 0x55, 0x18, 0xf9, 0x76, 0xb4, \n  0xed, 0x50, 0xe6, 0xf8, 0xab, 0xc7, 0x09, 0x62, 0xca, 0x05, 0xd9, 0x83, 0xfc, 0xe8, 0xef, 0xfd, \n  0x44, 0xa6, 0xf9, 0x59, 0x9c, 0xfa, 0xf2, 0x58, 0x00, 0x92, 0x5c, 0x00, 0x70, 0x4f, 0x01, 0x5a, \n  0x0a, 0x01, 0xc0, 0xcc, 0xff, 0x96, 0x48, 0xfd, 0xa1, 0x82, 0xfe, 0x8f, 0x88, 0x01, 0xa4, 0xd5, \n  0xfe, 0x61, 0xf3, 0xfe, 0x71, 0x1a, 0xff, 0x45, 0x27, 0xfd, 0xec, 0x63, 0xfe, 0xbb, 0x88, 0xff, \n  0xd9, 0xcd, 0xff, 0xe1, 0xd5, 0xff, 0x3a, 0x6c, 0x24, 0x10, 0xab, 0x28, 0x44, 0xca, 0x03, 0xb2, \n  0x35, 0x03, 0xa6, 0xb9, 0x05, 0x34, 0xa0, 0xfc, 0x6f, 0x02, 0x02, 0xfd, 0xd3, 0xf8, 0x23, 0xd1, \n  0xec, 0x38, 0x53, 0xf9, 0x4d, 0xbc, 0x09, 0x2c, 0xb6, 0x04, 0x91, 0xae, 0xfc, 0x77, 0xf9, 0xfd, \n  0xc2, 0xbd, 0xf9, 0x30, 0xa4, 0xfa, 0x65, 0x39, 0xff, 0x61, 0x7d, 0xff, 0xa2, 0xe0, 0x01, 0x2c, \n  0x79, 0x01, 0xb5, 0x5c, 0xff, 0xb6, 0x52, 0xfd, 0xf9, 0xb2, 0xfd, 0x7f, 0xac, 0x00, 0x17, 0xc1, \n  0xff, 0xcd, 0xb1, 0xfe, 0xd9, 0x38, 0xfe, 0x81, 0x2c, 0xfd, 0xbf, 0xb8, 0xfd, 0xdc, 0x86, 0xff, \n  0xde, 0x20, 0x00, 0xfc, 0xd9, 0xfe, 0x53, 0xd8, 0x23, 0xed, 0x86, 0x2c, 0x3d, 0xa7, 0x08, 0x4c, \n  0xce, 0x02, 0xbe, 0xa9, 0x05, 0xea, 0x4d, 0xfc, 0x43, 0x8f, 0xff, 0xea, 0x3c, 0xf8, 0xf2, 0x14, \n  0xed, 0x48, 0x2f, 0xf9, 0x14, 0x7e, 0x08, 0xa6, 0xde, 0x03, 0x3a, 0x0b, 0xfd, 0x99, 0x70, 0xfd, \n  0x1f, 0xf9, 0xf9, 0x02, 0xfc, 0xfa, 0xaa, 0x10, 0xfe, 0x5d, 0xb7, 0xfe, 0x81, 0xd5, 0x01, 0x7f, \n  0xc5, 0x01, 0x44, 0x55, 0xff, 0x67, 0xa2, 0xfc, 0xc3, 0x79, 0xfd, 0xae, 0xb3, 0x00, 0x4e, 0xc2, \n  0xff, 0x0a, 0xa1, 0xfe, 0xf0, 0x76, 0xfd, 0x96, 0xf4, 0xfc, 0xa5, 0xc6, 0xfd, 0x6f, 0xc1, 0xfe, \n  0x7f, 0xc4, 0xff, 0xc8, 0x8b, 0xfe, 0xbd, 0x95, 0x22, 0x95, 0x4d, 0x2e, 0x28, 0x86, 0x0e, 0x15, \n  0xc7, 0x04, 0x3b, 0x26, 0x05, 0x4f, 0x61, 0xfc, 0xee, 0xfe, 0xfd, 0x05, 0x66, 0xf7, 0x6e, 0x65, \n  0xed, 0x5b, 0xbe, 0xf8, 0xa4, 0xb3, 0x06, 0x9a, 0x10, 0x03, 0x45, 0x05, 0xfe, 0x92, 0xf8, 0xfc, \n  0xf3, 0xb0, 0xf9, 0x30, 0xc8, 0xfb, 0x2e, 0x22, 0xfd, 0x1a, 0xa6, 0xfd, 0xf0, 0x28, 0x02, 0xb0, \n  0x11, 0x01, 0xad, 0x51, 0xff, 0x94, 0x77, 0xfe, 0xef, 0xd0, 0xfc, 0xb2, 0x65, 0xff, 0x91, 0xec, \n  0xff, 0x73, 0x74, 0xfe, 0x01, 0xf3, 0xfd, 0xe3, 0x1f, 0xfd, 0x44, 0xed, 0xfc, 0xc4, 0xc8, 0xfd, \n  0x7a, 0x0b, 0xff, 0x4a, 0xe4, 0xfe, 0x9e, 0x06, 0x23, 0xe1, 0x0e, 0x2e, 0xf2, 0x8f, 0x11, 0x43, \n  0x30, 0x09, 0x1f, 0x52, 0x05, 0xba, 0xc6, 0xfb, 0xd2, 0xfa, 0xfd, 0x90, 0xf0, 0xf6, 0x25, 0xdf, \n  0xed, 0x73, 0xa6, 0xf8, 0x63, 0xde, 0x03, 0x89, 0x4e, 0x01, 0xff, 0x9f, 0xff, 0x97, 0x06, 0xfd, \n  0xe6, 0xf9, 0xf8, 0xcb, 0x8e, 0xfc, 0x88, 0xc1, 0xfc, 0x9c, 0x2a, 0xfc, 0x40, 0xc9, 0x01, 0x9e, \n  0x2d, 0x02, 0xf0, 0x2c, 0xff, 0x72, 0x29, 0xfe, 0x53, 0xba, 0xfd, 0x9f, 0x4a, 0xff, 0x34, 0x06, \n  0x00, 0xbc, 0x37, 0xfe, 0x5a, 0x24, 0xfd, 0x07, 0x20, 0xfd, 0x2a, 0x47, 0xfc, 0x28, 0x91, 0xfd, \n  0xc0, 0xdc, 0xff, 0x94, 0x3e, 0xff, 0x97, 0xb9, 0x24, 0x99, 0x42, 0x2d, 0xb4, 0x69, 0x11, 0xab, \n  0xf7, 0x0d, 0x39, 0x62, 0x07, 0xd0, 0x5a, 0xfa, 0xad, 0x9c, 0xfd, 0x76, 0xc6, 0xf6, 0x26, 0xbb, \n  0xee, 0xf7, 0x92, 0xf9, 0x9e, 0x40, 0x00, 0x80, 0x21, 0xfd, 0xc9, 0xd5, 0x00, 0x9a, 0xe8, 0xfd, \n  0x24, 0xd0, 0xf8, 0x9e, 0x09, 0xfe, 0x75, 0x05, 0xfb, 0x91, 0xbf, 0xfa, 0x60, 0x35, 0x03, 0x12, \n  0xa9, 0x01, 0x2a, 0xbe, 0xfe, 0x59, 0x11, 0xff, 0x3f, 0xc1, 0xfd, 0x0d, 0xc9, 0xfe, 0x14, 0x27, \n  0x00, 0x96, 0x3e, 0xfe, 0xeb, 0x4a, 0xfc, 0x39, 0x2f, 0xfd, 0xdc, 0xbb, 0xfc, 0x9d, 0x0c, 0xfd, \n  0x1f, 0xf6, 0xfe, 0xc8, 0x9a, 0xfe, 0xc6, 0xc4, 0x27, 0x12, 0x86, 0x2c, 0x5e, 0x2a, 0x0f, 0xce, \n  0xaf, 0x11, 0x7a, 0x16, 0x0a, 0x5b, 0xa7, 0xf9, 0xbd, 0x69, 0xfd, 0x81, 0xf2, 0xf6, 0xe6, 0x26, \n  0xf0, 0xba, 0xd7, 0xfb, 0x91, 0x63, 0xfd, 0xdb, 0x93, 0xf6, 0x4d, 0xd3, 0x00, 0xb9, 0xfd, 0xff, \n  0xf6, 0x70, 0xf7, 0xe6, 0x90, 0xff, 0xcb, 0x6f, 0xfc, 0x39, 0xc5, 0xf8, 0xdc, 0xe7, 0x02, 0x9f, \n  0x6a, 0x02, 0xb7, 0x89, 0xfe, 0x24, 0x82, 0xff, 0xc4, 0xe1, 0xfd, 0xcd, 0xeb, 0xfd, 0xc5, 0x42, \n  0x00, 0x68, 0x8a, 0xfe, 0xd6, 0xf1, 0xfb, 0x2e, 0xb6, 0xfd, 0x06, 0x03, 0xfd, 0x61, 0x1c, 0xfc, \n  0x3a, 0x9a, 0xfe, 0x2f, 0xd3, 0xfe, 0xe8, 0xc8, 0x2c, 0x8e, 0xc8, 0x2b, 0xa3, 0xc4, 0x0a, 0x8f, \n  0x04, 0x15, 0x76, 0xa9, 0x0b, 0x41, 0x88, 0xf8, 0x0e, 0x5d, 0xfe, 0xae, 0xc7, 0xf6, 0x4c, 0xfe, \n  0xf1, 0xe9, 0x8f, 0xff, 0xea, 0x9e, 0xfa, 0x94, 0x1b, 0xef, 0x6e, 0x21, 0x00, 0x9a, 0x5f, 0x01, \n  0xf9, 0xfa, 0xf5, 0x1a, 0x99, 0x01, 0xdb, 0x60, 0xfd, 0x81, 0xaf, 0xf7, 0x29, 0xf4, 0x03, 0x32, \n  0x30, 0x02, 0x42, 0x1e, 0xfd, 0x8f, 0xb5, 0xff, 0x20, 0x08, 0xff, 0x90, 0xef, 0xfd, 0x9a, 0xf6, \n  0xff, 0xb3, 0x88, 0xfe, 0x9b, 0x32, 0xfb, 0x49, 0xa9, 0xfd, 0xf0, 0xd1, 0xfd, 0x9f, 0x62, 0xfc, \n  0x67, 0xdd, 0xfd, 0x73, 0xcd, 0xfd, 0x04, 0x0d, 0x32, 0xfe, 0x89, 0x2b, 0x02, 0x07, 0x05, 0x38, \n  0x49, 0x18, 0x46, 0x7b, 0x0d, 0x7b, 0xec, 0xf5, 0x19, 0x3b, 0x00, 0xb5, 0xda, 0xf7, 0x30, 0xac, \n  0xf3, 0x9e, 0x43, 0x04, 0xf5, 0x02, 0xfa, 0x67, 0x91, 0xe6, 0xce, 0xaa, 0xfc, 0x8d, 0x10, 0x05, \n  0xc9, 0xf1, 0xf4, 0xd8, 0x2d, 0x01, 0x8f, 0x38, 0x00, 0x2d, 0x2b, 0xf7, 0xb6, 0x66, 0x03, 0xeb, \n  0x5c, 0x02, 0xef, 0x42, 0xfc, 0x82, 0xea, 0xff, 0x58, 0x72, 0x00, 0x4b, 0x3a, 0xfe, 0xb4, 0x3a, \n  0xff, 0x42, 0x8a, 0xfe, 0xff, 0x37, 0xfb, 0x9b, 0xa4, 0xfd, 0xaa, 0xe6, 0xfd, 0x1a, 0xd0, 0xfb, \n  0xf3, 0x46, 0xfd, 0x98, 0xee, 0xfd, 0x72, 0xe1, 0x37, 0x04, 0xbd, 0x2c, 0xf3, 0x7b, 0xfd, 0xf1, \n  0x42, 0x1a, 0x06, 0x9e, 0x10, 0x7d, 0x23, 0xf1, 0x77, 0x08, 0x01, 0xf3, 0x7b, 0xf9, 0x87, 0x91, \n  0xf4, 0xba, 0xe0, 0x0a, 0xb4, 0x1a, 0xfb, 0x38, 0x4e, 0xdd, 0x9a, 0x36, 0xf7, 0x53, 0x40, 0x08, \n  0xce, 0x72, 0xf6, 0x39, 0x54, 0x00, 0x19, 0x08, 0x01, 0x62, 0x22, 0xf7, 0x8b, 0xe9, 0x02, 0x84, \n  0xb4, 0x02, 0x9c, 0xeb, 0xfb, 0x67, 0x0f, 0xff, 0xe0, 0x11, 0x01, 0x39, 0x3a, 0xff, 0xeb, 0x2d, \n  0xff, 0xe2, 0xaf, 0xfe, 0x02, 0xcc, 0xfa, 0xed, 0x48, 0xfc, 0xef, 0xaa, 0xfd, 0xde, 0x90, 0xfc, \n  0x40, 0x3b, 0xfd, 0xfd, 0x42, 0xfd, 0x16, 0xbd, 0x3d, 0xfd, 0xcc, 0x30, 0x88, 0x99, 0xf5, 0xae, \n  0xc8, 0x17, 0xab, 0xd1, 0x14, 0x27, 0x4b, 0xee, 0xbb, 0x5d, 0x01, 0xef, 0x6f, 0xfb, 0xad, 0x8c, \n  0xf4, 0xce, 0x1d, 0x11, 0x20, 0xfa, 0xfe, 0x4b, 0x23, 0xd7, 0xa2, 0x05, 0xf0, 0x0a, 0x88, 0x09, \n  0xec, 0xa6, 0xf9, 0x6e, 0x9b, 0xff, 0x86, 0x0f, 0x02, 0xfa, 0xdc, 0xf7, 0x91, 0xc3, 0x01, 0xf3, \n  0xb5, 0x02, 0xe6, 0xe4, 0xfb, 0x05, 0x13, 0xfe, 0x0c, 0x0f, 0x01, 0x88, 0x59, 0x01, 0x38, 0xcb, \n  0xff, 0xf1, 0x75, 0xfd, 0x09, 0x71, 0xfa, 0x1e, 0x04, 0xfc, 0xf2, 0xff, 0xfd, 0x59, 0x45, 0xfd, \n  0x7e, 0xee, 0xfb, 0xc7, 0xa2, 0xfb, 0x23, 0x25, 0x46, 0x03, 0x2b, 0x36, 0x94, 0xe4, 0xec, 0xef, \n  0x9b, 0x10, 0xa7, 0x11, 0x16, 0x92, 0x05, 0xee, 0x1c, 0x1a, 0x03, 0xe3, 0x93, 0xfd, 0xab, 0xf3, \n  0xf1, 0xf4, 0x1d, 0x14, 0xdd, 0x82, 0x04, 0x41, 0xbd, 0xd4, 0x16, 0x7a, 0xe9, 0x18, 0xab, 0x07, \n  0x32, 0xec, 0xfc, 0x28, 0xa6, 0x00, 0x63, 0xb3, 0x02, 0xf2, 0x79, 0xf8, 0xaa, 0xc0, 0xff, 0x42, \n  0x4d, 0x02, 0x97, 0xd1, 0xfb, 0xf5, 0x19, 0xfd, 0x97, 0x46, 0x01, 0x1f, 0x4f, 0x02, 0xe1, 0xc8, \n  0xff, 0x1f, 0x60, 0xfc, 0x23, 0x8d, 0xfa, 0x3b, 0xef, 0xfb, 0xdc, 0xd8, 0xfc, 0xb4, 0x14, 0xfd, \n  0xe6, 0x04, 0xfc, 0xd5, 0xa0, 0xfb, 0xd4, 0x2a, 0x4e, 0x52, 0x2d, 0x3a, 0xe1, 0xdf, 0xe5, 0x70, \n  0x1f, 0x0b, 0x99, 0xd9, 0x15, 0x17, 0xcb, 0xed, 0x32, 0x07, 0x05, 0xdc, 0x17, 0xff, 0xbd, 0x4f, \n  0xee, 0xf0, 0x00, 0x18, 0xb3, 0x3d, 0x0c, 0x52, 0xc6, 0xd1, 0xc9, 0x3c, 0xe4, 0x8c, 0xf5, 0x05, \n  0xe2, 0xe0, 0xfe, 0x16, 0x2b, 0x03, 0xfc, 0x7e, 0x02, 0x19, 0xc7, 0xf8, 0xd4, 0x3d, 0xfe, 0xf1, \n  0x17, 0x01, 0x9d, 0x8e, 0xfc, 0x10, 0xac, 0xfc, 0x45, 0xf2, 0x00, 0xa8, 0x0b, 0x02, 0x9d, 0x0b, \n  0x00, 0x34, 0x69, 0xfc, 0x95, 0xc1, 0xf9, 0x63, 0x2a, 0xfb, 0x6b, 0xed, 0xfb, 0x56, 0xee, 0xfd, \n  0x96, 0x2e, 0xfd, 0xc7, 0x7e, 0xfb, 0x1f, 0x98, 0x56, 0x86, 0x43, 0x40, 0x0a, 0x73, 0xde, 0x2c, \n  0x14, 0x02, 0x0f, 0x41, 0x11, 0x2c, 0x47, 0xef, 0x64, 0xfc, 0x0b, 0xd8, 0xe2, 0xfe, 0x3e, 0x38, \n  0xe8, 0xf9, 0xdb, 0x19, 0xd3, 0x92, 0x11, 0xb1, 0xe4, 0xd1, 0x32, 0xb8, 0xe2, 0x25, 0xe0, 0x03, \n  0x37, 0xb3, 0xfd, 0xf5, 0x52, 0x04, 0xcd, 0x7e, 0x03, 0x61, 0xcb, 0xf8, 0x74, 0x8a, 0xfc, 0x84, \n  0x24, 0x00, 0x65, 0xc1, 0xfc, 0xad, 0x9d, 0xfb, 0x49, 0x2e, 0x00, 0x37, 0x1a, 0x02, 0xbc, 0xd5, \n  0xff, 0xd8, 0x6b, 0xfb, 0x30, 0xa2, 0xf8, 0x6e, 0x73, 0xfa, 0x4b, 0x9f, 0xfb, 0x1a, 0xe9, 0xfe, \n  0x1f, 0x28, 0xfe, 0x91, 0x2a, 0xfb, 0x89, 0x0c, 0x5f, 0x87, 0x0e, 0x45, 0x4d, 0xc0, 0xd8, 0xe0, \n  0x4b, 0xfc, 0x6c, 0xa3, 0x0b, 0xc5, 0xd0, 0xf1, 0x2a, 0x4b, 0x13, 0x2e, 0xfb, 0xfb, 0x3e, 0x66, \n  0xe5, 0x40, 0x64, 0x1c, 0x6b, 0x81, 0x15, 0xe1, 0x04, 0xd6, 0x92, 0x56, 0xe2, 0xfd, 0xf6, 0x00, \n  0xa1, 0x80, 0xfb, 0x72, 0x4f, 0x05, 0x29, 0xca, 0x06, 0xb6, 0x40, 0xf9, 0x12, 0x8d, 0xfa, 0x1f, \n  0x21, 0xff, 0x54, 0x84, 0xfd, 0xec, 0x54, 0xfb, 0x72, 0x96, 0xff, 0x25, 0x30, 0x02, 0x3b, 0x06, \n  0xff, 0x69, 0x81, 0xfb, 0xcf, 0x90, 0xf8, 0x85, 0x95, 0xf9, 0x96, 0xbe, 0xfb, 0xe9, 0xcd, 0xff, \n  0x34, 0x12, 0xff, 0xff, 0x4c, 0xfb, 0xb4, 0x1a, 0x66, 0xb5, 0xdd, 0x48, 0xf9, 0x4b, 0xd4, 0x26, \n  0xb8, 0xf7, 0xb0, 0x1e, 0x06, 0x36, 0x8b, 0xf3, 0x82, 0x4d, 0x17, 0x58, 0xf8, 0xf8, 0x2e, 0x90, \n  0xe4, 0x88, 0xb9, 0x1c, 0xd9, 0xb8, 0x19, 0xfc, 0xda, 0xda, 0xfe, 0xaa, 0xe0, 0x6d, 0xc2, 0xfe, \n  0x88, 0x4e, 0xf8, 0x6a, 0x21, 0x06, 0xbe, 0x77, 0x0a, 0x7a, 0xf8, 0xf7, 0x96, 0xa5, 0xf8, 0xea, \n  0xea, 0xfe, 0xea, 0x24, 0xfe, 0x90, 0x83, 0xfa, 0x73, 0x6f, 0xfe, 0x52, 0xc2, 0x01, 0x16, 0x45, \n  0xfe, 0xf9, 0x86, 0xfc, 0x60, 0x3c, 0xf8, 0xe4, 0xe9, 0xf7, 0x5a, 0xd8, 0xfb, 0xaa, 0x75, 0x00, \n  0x76, 0xcb, 0xff, 0xf0, 0xd3, 0xfb, 0xd2, 0x00, 0x6c, 0x62, 0xf3, 0x4b, 0x18, 0x80, 0xd1, 0xc2, \n  0x9d, 0xf4, 0x2c, 0x75, 0x01, 0xef, 0x47, 0xf4, 0xdf, 0xba, 0x18, 0x32, 0xa5, 0xf7, 0x8b, 0x07, \n  0xe5, 0x8b, 0x7f, 0x1a, 0x05, 0x37, 0x1e, 0xa7, 0xd7, 0xe0, 0x0c, 0x02, 0xdf, 0x73, 0x5e, 0xfd, \n  0xfa, 0xd3, 0xf4, 0x65, 0x0d, 0x06, 0x6c, 0xe5, 0x0d, 0x97, 0xdf, 0xf6, 0xe6, 0x69, 0xf7, 0x01, \n  0x7a, 0xff, 0x0f, 0x66, 0xfe, 0x60, 0xcb, 0xf8, 0x5a, 0xb6, 0xfd, 0x16, 0x05, 0x02, 0x1a, 0xbc, \n  0xfd, 0x5d, 0x7e, 0xfd, 0xcf, 0xba, 0xf7, 0xa2, 0x75, 0xf6, 0x7f, 0x15, 0xfc, 0x42, 0x00, 0x01, \n  0xab, 0x8c, 0x00, 0x46, 0x74, 0xfc, 0xe6, 0xab, 0x6e, 0xac, 0x41, 0x50, 0xa7, 0xdc, 0xd0, 0xae, \n  0xce, 0xf1, 0xe9, 0x53, 0xfe, 0xc1, 0x21, 0xf3, 0x5d, 0x4b, 0x18, 0xa0, 0xc9, 0xf7, 0x08, 0x07, \n  0xe5, 0x66, 0xe5, 0x15, 0xd6, 0xf1, 0x22, 0xe9, 0xce, 0xe8, 0x34, 0xed, 0xdc, 0x76, 0xac, 0xfb, \n  0xa5, 0x8b, 0xf1, 0x0c, 0x42, 0x04, 0xf7, 0x10, 0x11, 0x2b, 0xf1, 0xf6, 0xd1, 0x69, 0xf6, 0x90, \n  0xd3, 0xff, 0x0d, 0x30, 0xfe, 0x8f, 0xdf, 0xf6, 0xcd, 0x60, 0xfd, 0x1c, 0xa5, 0x02, 0xf7, 0x94, \n  0xfc, 0x78, 0x01, 0xfe, 0xd2, 0x0e, 0xf8, 0xc1, 0x55, 0xf5, 0xde, 0x02, 0xfc, 0x03, 0x5b, 0x01, \n  0x9e, 0xfb, 0x00, 0x2d, 0x7e, 0xfc, 0x9e, 0x07, 0x72, 0xdf, 0x4d, 0x51, 0x97, 0xcc, 0xd1, 0x55, \n  0xdc, 0xf1, 0xce, 0x98, 0xfa, 0x99, 0x4a, 0xf2, 0x47, 0xf6, 0x16, 0x02, 0x3e, 0xf7, 0xc1, 0x8f, \n  0xe4, 0x2e, 0x26, 0x12, 0x79, 0x32, 0x27, 0x12, 0x89, 0xef, 0x95, 0x36, 0xdd, 0x96, 0x43, 0xf9, \n  0xb7, 0x33, 0xee, 0x48, 0x66, 0x03, 0x22, 0x72, 0x12, 0x44, 0x32, 0xf8, 0x9e, 0x1b, 0xf6, 0xd7, \n  0x97, 0xff, 0x09, 0x34, 0xfe, 0xbd, 0x5e, 0xf5, 0x50, 0x9c, 0xfd, 0x81, 0x90, 0x02, 0x62, 0x7d, \n  0xfb, 0x11, 0xac, 0xfe, 0xbf, 0xb2, 0xf8, 0xca, 0x2b, 0xf5, 0x76, 0xe2, 0xfb, 0x35, 0xaa, 0x01, \n  0x02, 0x77, 0x00, 0x94, 0x1a, 0xfc, 0x8e, 0x91, 0x72, 0xe0, 0xce, 0x52, 0x2e, 0xda, 0xd4, 0x9c, \n  0x35, 0xf2, 0x06, 0x2e, 0xf7, 0x4a, 0xf8, 0xef, 0x39, 0x24, 0x16, 0x99, 0xf1, 0xf6, 0x5e, 0xc2, \n  0xe1, 0x58, 0xf6, 0x0e, 0xb3, 0x7c, 0x2a, 0x12, 0x53, 0xf5, 0x15, 0x21, 0xdf, 0xa9, 0xc8, 0xf6, \n  0x3e, 0x47, 0xeb, 0xa3, 0xb3, 0x01, 0x58, 0x4e, 0x12, 0xf3, 0xcf, 0xfa, 0x04, 0xe1, 0xf5, 0x22, \n  0xfa, 0xfd, 0x00, 0x0c, 0xff, 0x75, 0xd7, 0xf4, 0xb2, 0xa5, 0xfc, 0xc8, 0xdf, 0x01, 0x46, 0x0b, \n  0xfb, 0x25, 0x5c, 0xff, 0x12, 0x7a, 0xf9, 0x90, 0xa9, 0xf5, 0x2b, 0x5c, 0xfb, 0xd3, 0xdf, 0x00, \n  0xb2, 0xe7, 0xff, 0x3f, 0x8d, 0xfb, 0x0b, 0x9b, 0x70, 0xd8, 0x27, 0x55, 0xe0, 0x31, 0xda, 0x18, \n  0xb5, 0xf3, 0xf5, 0xd0, 0xf3, 0x56, 0x01, 0xec, 0xbf, 0x70, 0x17, 0x58, 0x2a, 0xf7, 0x34, 0x08, \n  0xdd, 0xae, 0x72, 0x0c, 0x9d, 0x0a, 0x2c, 0x36, 0xbe, 0xfa, 0x81, 0x87, 0xe3, 0x72, 0x8e, 0xf5, \n  0xb7, 0x9f, 0xe8, 0xe3, 0xa9, 0xfe, 0xee, 0x49, 0x11, 0x33, 0x46, 0xfe, 0x26, 0x93, 0xf6, 0xf4, \n  0xb1, 0xfb, 0x40, 0xcf, 0xff, 0xe8, 0x5a, 0xf5, 0x06, 0x2d, 0xfb, 0x70, 0x96, 0x01, 0xf5, 0x2e, \n  0xfb, 0xb4, 0x01, 0x00, 0xbd, 0x37, 0xfb, 0x0b, 0x7d, 0xf5, 0xd0, 0xd6, 0xf9, 0xc4, 0x8a, 0x00, \n  0xe8, 0x2c, 0xff, 0xc1, 0x0b, 0xfb, 0x5f, 0x66, 0x6c, 0x8d, 0x8b, 0x57, 0x14, 0xb9, 0xe1, 0x13, \n  0x36, 0xf6, 0xb0, 0xca, 0xf0, 0xb8, 0x83, 0xe7, 0xba, 0x35, 0x19, 0x49, 0xf0, 0xf7, 0x2d, 0x96, \n  0xd7, 0x90, 0x9f, 0x09, 0x5d, 0xc6, 0x2c, 0xea, 0x37, 0xff, 0x3e, 0xce, 0xe9, 0xe2, 0x22, 0xf7, \n  0xec, 0xbc, 0xe4, 0x1f, 0x87, 0xfa, 0x93, 0xed, 0x10, 0x1a, 0x8a, 0x00, 0x06, 0x2a, 0xf8, 0xa3, \n  0x3c, 0xfa, 0x29, 0x12, 0xff, 0x10, 0x39, 0xf6, 0x88, 0xbd, 0xfa, 0xf5, 0xb9, 0x01, 0x9a, 0x0e, \n  0xfc, 0xb7, 0xd8, 0x00, 0x74, 0x61, 0xfb, 0x90, 0x66, 0xf5, 0x9f, 0x26, 0xf9, 0x67, 0x87, 0xfe, \n  0xf9, 0x8a, 0xff, 0xda, 0x63, 0xfc, 0x74, 0xc4, 0x67, 0xc0, 0xc6, 0x57, 0x49, 0x47, 0xea, 0x8f, \n  0xd5, 0xf9, 0x37, 0x97, 0xed, 0x6d, 0xca, 0xe4, 0xb9, 0x9e, 0x19, 0xc5, 0xf7, 0xf8, 0xc4, 0xb5, \n  0xd3, 0x60, 0x61, 0x04, 0x21, 0xec, 0x2d, 0x0f, 0x37, 0x03, 0x85, 0x21, 0xef, 0x33, 0xe4, 0xfb, \n  0x0f, 0x62, 0xe0, 0x66, 0x60, 0xf5, 0x96, 0xae, 0x11, 0xe8, 0x0f, 0x01, 0xca, 0x44, 0xf9, 0x3a, \n  0x09, 0xfa, 0x66, 0x27, 0xfd, 0xe7, 0x7c, 0xf6, 0xcb, 0x8f, 0xfc, 0xa1, 0xd6, 0x02, 0x16, 0x4d, \n  0xfb, 0x2e, 0x59, 0x01, 0xae, 0xd5, 0xfb, 0x30, 0x3e, 0xf4, 0x5e, 0xfd, 0xf8, 0x2f, 0x02, 0xfe, \n  0x1f, 0xeb, 0xff, 0x66, 0x8c, 0xfd, 0x40, 0xd2, 0x60, 0x93, 0x92, 0x58, 0x7d, 0x2f, 0xf4, 0x4e, \n  0xbb, 0xfc, 0x62, 0x1d, 0xec, 0xd7, 0x57, 0xe2, 0xde, 0xcc, 0x15, 0x66, 0x26, 0xfc, 0x1a, 0x10, \n  0xd4, 0x4b, 0x20, 0xfa, 0x69, 0x86, 0x2e, 0xaf, 0xc6, 0x09, 0x82, 0x68, 0xf1, 0xb5, 0x92, 0x03, \n  0x00, 0x8b, 0xde, 0xa0, 0x48, 0xed, 0xae, 0x68, 0x12, 0xce, 0xb1, 0x00, 0xbf, 0x44, 0xf9, 0x43, \n  0xb5, 0xfb, 0x43, 0xa0, 0xfb, 0x40, 0x24, 0xf6, 0x8b, 0xc9, 0xfe, 0xf6, 0x14, 0x03, 0x72, 0x1b, \n  0xfa, 0xbc, 0xd0, 0x02, 0x37, 0x27, 0xfb, 0x92, 0xd5, 0xf2, 0x77, 0x35, 0xfb, 0xdb, 0xa1, 0xfd, \n  0x34, 0x54, 0xff, 0x9a, 0x2e, 0xff, 0x8d, 0xe9, 0x5b, 0xa6, 0xd1, 0x55, 0xb9, 0xce, 0xfc, 0xfb, \n  0xa8, 0x00, 0xb6, 0xc2, 0xe9, 0xab, 0x34, 0xe2, 0xf9, 0x78, 0x0f, 0x93, 0x43, 0xfd, 0x17, 0x33, \n  0xd9, 0x6f, 0xf2, 0xef, 0x1b, 0x1c, 0x2c, 0xa5, 0xd6, 0x10, 0x38, 0x73, 0xf2, 0x53, 0xa5, 0x0a, \n  0x0e, 0xb6, 0xe0, 0x52, 0x15, 0xe4, 0xf1, 0x74, 0x10, 0x24, 0xfa, 0x00, 0x33, 0xbc, 0xf7, 0x0f, \n  0x48, 0xfe, 0x4f, 0x8f, 0xfc, 0x1f, 0x4d, 0xf4, 0x0f, 0x69, 0xfe, 0x72, 0x84, 0x04, 0x8a, 0x62, \n  0xf9, 0xe2, 0xd9, 0x01, 0x93, 0x95, 0xfc, 0xce, 0x55, 0xf2, 0x0c, 0xf4, 0xfb, 0x69, 0x38, 0xff, \n  0x6e, 0xc9, 0xfe, 0xb6, 0x3b, 0xff, 0x8f, 0x68, 0x58, 0x47, 0xfb, 0x51, 0x80, 0xf6, 0x01, 0x3c, \n  0x46, 0x05, 0xd5, 0x18, 0xeb, 0x3d, 0x45, 0xe2, 0xce, 0x66, 0x09, 0xb1, 0x90, 0xfc, 0xd7, 0x2e, \n  0xde, 0xde, 0x99, 0xea, 0x95, 0x3e, 0x27, 0x16, 0x2e, 0x18, 0x23, 0x9a, 0xf4, 0x1a, 0x7f, 0x0d, \n  0xcd, 0x79, 0xe7, 0xa4, 0x2f, 0xdc, 0x4c, 0xaf, 0x0b, 0x6d, 0x47, 0x03, 0x65, 0xb5, 0xf5, 0x45, \n  0xcc, 0xff, 0x49, 0xb4, 0xfd, 0x25, 0x4f, 0xf4, 0xf1, 0x28, 0xfe, 0x31, 0xb9, 0x03, 0x2b, 0x1e, \n  0xf9, 0x26, 0xdb, 0x01, 0x3c, 0xe5, 0xfe, 0x3f, 0x74, 0xf2, 0x67, 0xe1, 0xfc, 0x6f, 0xbc, 0x00, \n  0x8e, 0x48, 0xfd, 0x43, 0xb6, 0xff, 0x86, 0xee, 0x55, 0x44, 0x12, 0x50, 0xff, 0x57, 0x01, 0x2c, \n  0x05, 0x08, 0xd8, 0x84, 0xf1, 0x51, 0xca, 0xdf, 0xb3, 0x25, 0x03, 0x35, 0x06, 0xfe, 0xeb, 0x9f, \n  0xe0, 0x42, 0x58, 0xe6, 0x36, 0x87, 0x23, 0xd5, 0x3e, 0x1f, 0x23, 0x36, 0xf6, 0x55, 0x3b, 0x0d, \n  0x2c, 0x63, 0xef, 0x92, 0x84, 0xd6, 0xac, 0xe8, 0x05, 0xd6, 0x36, 0x07, 0xb0, 0x28, 0xf3, 0x5f, \n  0x85, 0xfe, 0x8b, 0x6f, 0xff, 0xb9, 0x3e, 0xf4, 0x90, 0xc1, 0xfd, 0x62, 0xac, 0x03, 0xb9, 0x70, \n  0xf8, 0x10, 0x20, 0x01, 0xc2, 0xec, 0x01, 0x59, 0x3f, 0xf4, 0x46, 0xe9, 0xfb, 0x44, 0xc9, 0x00, \n  0xdd, 0xdb, 0xfd, 0xa9, 0xd0, 0xff, 0xd2, 0xab, 0x56, 0xab, 0x5e, 0x4b, 0x5d, 0xfe, 0xfc, 0xfb, \n  0xb0, 0x0d, 0x86, 0x46, 0xf5, 0x04, 0x96, 0xdb, 0x61, 0x47, 0x01, 0x1a, 0xeb, 0xff, 0x1b, 0xad, \n  0xe2, 0x27, 0xc0, 0xe2, 0x54, 0x47, 0x1f, 0x63, 0xdf, 0x23, 0x41, 0x68, 0xf8, 0x7a, 0xaf, 0x0d, \n  0x04, 0xc7, 0xf4, 0x48, 0xae, 0xd4, 0x18, 0xf0, 0xff, 0xc1, 0x32, 0x08, 0xe4, 0x56, 0xf5, 0xfe, \n  0x6f, 0xfc, 0x80, 0xd6, 0xfd, 0x11, 0xe7, 0xf3, 0x47, 0x40, 0xfd, 0xa1, 0xd0, 0x05, 0xc1, 0xdc, \n  0xf8, 0xe0, 0x7b, 0xff, 0x8b, 0xdb, 0x03, 0xd6, 0xb2, 0xf5, 0xe4, 0x73, 0xfb, 0x51, 0x1b, 0x01, \n  0xcf, 0x5c, 0xfd, 0x24, 0x5e, 0xff, 0x95, 0x2a, 0x53, 0x2a, 0x65, 0x46, 0x73, 0x08, 0xfd, 0x8f, \n  0x90, 0x14, 0x99, 0x8c, 0xf5, 0x6f, 0xcb, 0xd6, 0xa7, 0xca, 0x04, 0x8a, 0x34, 0x01, 0x39, 0x39, \n  0xe4, 0x18, 0xbf, 0xe1, 0x7b, 0x9a, 0x14, 0xd2, 0xc0, 0x26, 0xf7, 0xd6, 0xfd, 0x17, 0x81, 0x0c, \n  0x7c, 0x3d, 0xfd, 0x59, 0xaa, 0xd4, 0xac, 0x6b, 0xf7, 0x65, 0x96, 0x09, 0x74, 0x8b, 0xf8, 0x9a, \n  0x35, 0xfb, 0x52, 0xc4, 0xfb, 0x13, 0x2b, 0xf2, 0x95, 0xb7, 0xfb, 0x80, 0x01, 0x08, 0xab, 0x17, \n  0xfb, 0xbf, 0xe2, 0xfd, 0xa4, 0xd8, 0x05, 0x96, 0x48, 0xf6, 0x53, 0x42, 0xf8, 0x16, 0xb7, 0x02, \n  0x35, 0xcf, 0xfe, 0x14, 0x5b, 0xfe, 0x71, 0xf0, 0x4c, 0x80, 0x9f, 0x40, 0xcf, 0xa8, 0xfe, 0x9f, \n  0x27, 0x19, 0x78, 0xa0, 0xf8, 0x5d, 0xdf, 0xd6, 0xc2, 0x02, 0x04, 0xe6, 0xa2, 0x02, 0x90, 0x96, \n  0xe7, 0xb1, 0x3d, 0xdf, 0x8f, 0xa1, 0x0a, 0xef, 0x80, 0x26, 0xbb, 0xf4, 0x02, 0xab, 0x0d, 0x0b, \n  0x3f, 0x93, 0x04, 0x71, 0x09, 0xda, 0xb7, 0x41, 0xef, 0xaa, 0x68, 0x09, 0xa0, 0x8f, 0xfb, 0x2d, \n  0x9a, 0xf8, 0x72, 0x61, 0xfc, 0xb5, 0xbb, 0xf1, 0x8c, 0x57, 0xf8, 0x6a, 0xea, 0x06, 0xe6, 0xb8, \n  0xfc, 0xc8, 0x7a, 0x00, 0xe4, 0x3b, 0x07, 0x81, 0xc3, 0xf3, 0xa2, 0x7f, 0xf5, 0x9e, 0x31, 0x05, \n  0xa4, 0xb8, 0x00, 0xf8, 0xeb, 0xfc, 0x6d, 0x7d, 0x4a, 0xb2, 0x0f, 0x3a, 0xa5, 0x41, 0xf7, 0x0f, \n  0x6b, 0x1c, 0x77, 0xaf, 0x03, 0xa2, 0x70, 0xda, 0x15, 0x1e, 0x02, 0x4a, 0x3a, 0x00, 0xe1, 0x08, \n  0xe8, 0x26, 0x52, 0xdf, 0xa7, 0xa5, 0x03, 0x67, 0x16, 0x28, 0xa0, 0x77, 0x06, 0xbf, 0x7c, 0x03, \n  0x11, 0xb5, 0x09, 0x91, 0x59, 0xe4, 0xe0, 0x15, 0xeb, 0xb0, 0x49, 0x07, 0x3a, 0xd9, 0xfe, 0x64, \n  0x72, 0xf7, 0x87, 0x76, 0xfa, 0x13, 0x96, 0xf2, 0x51, 0x89, 0xf6, 0x4b, 0x1d, 0x04, 0x92, 0x96, \n  0xfe, 0x31, 0x01, 0x01, 0x92, 0x18, 0x07, 0x37, 0xab, 0xf4, 0x2a, 0x94, 0xf3, 0xb9, 0x77, 0x05, \n  0xbb, 0x7e, 0x02, 0x7f, 0x6f, 0xfc, 0x5a, 0x87, 0x45, 0x6e, 0x4e, 0x34, 0x48, 0xe6, 0xf6, 0xe7, \n  0x0d, 0x1f, 0xf6, 0x55, 0x07, 0xfe, 0x2a, 0xdc, 0x0e, 0x38, 0x01, 0x88, 0x60, 0x02, 0x23, 0x8d, \n  0xec, 0x9e, 0xf0, 0xde, 0xe5, 0x03, 0xfd, 0x2d, 0x2e, 0x27, 0x0e, 0x11, 0x07, 0xac, 0xda, 0xfa, \n  0xd8, 0xfb, 0x0f, 0x45, 0xba, 0xf2, 0x92, 0x3e, 0xe5, 0x09, 0x1d, 0x04, 0x4f, 0x36, 0x04, 0x13, \n  0x75, 0xf4, 0x56, 0x7d, 0xf9, 0xa1, 0x79, 0xf6, 0x2f, 0x0a, 0xf6, 0x10, 0xfe, 0x00, 0x4d, 0x32, \n  0xfd, 0x16, 0xce, 0xfe, 0xb8, 0x3c, 0x07, 0xc8, 0xb5, 0xf9, 0xfb, 0xb1, 0xf3, 0x86, 0xbb, 0x01, \n  0x4a, 0x36, 0x03, 0x50, 0x21, 0xfe, 0x81, 0x4d, 0x3f, 0x4f, 0x17, 0x2f, 0xb3, 0x25, 0xf9, 0xda, \n  0x6c, 0x1f, 0x05, 0x46, 0x07, 0x74, 0x2d, 0xe0, 0xdf, 0x79, 0x01, 0x33, 0xac, 0x01, 0x2d, 0xfe, \n  0xf0, 0x62, 0x61, 0xe0, 0xba, 0xec, 0xf8, 0x2b, 0xa1, 0x24, 0x13, 0x3b, 0x05, 0x74, 0x35, 0xf7, \n  0x5c, 0x01, 0x12, 0x23, 0x24, 0xfa, 0x35, 0xba, 0xe5, 0xd5, 0xe2, 0x01, 0xff, 0x39, 0x06, 0xae, \n  0xd5, 0xf3, 0x00, 0xb7, 0xf8, 0xac, 0xfd, 0xf8, 0x78, 0xd2, 0xf6, 0xe6, 0xb1, 0xff, 0x9b, 0x53, \n  0xfb, 0x42, 0x5c, 0xfb, 0x23, 0x53, 0x05, 0x87, 0x75, 0xfd, 0xcb, 0xe3, 0xf6, 0xb5, 0xf8, 0xff, \n  0x4e, 0x42, 0x01, 0xb1, 0xe9, 0xfd, 0x7e, 0x3f, 0x3a, 0x70, 0x01, 0x2a, 0x3e, 0xfc, 0xf9, 0xa1, \n  0xf6, 0x1f, 0xb3, 0x14, 0x08, 0x6e, 0xd9, 0xe3, 0xa9, 0x87, 0x02, 0xb6, 0xf8, 0x00, 0x27, 0x2e, \n  0xf3, 0x72, 0x2d, 0xe4, 0xb8, 0x3b, 0xf7, 0xb1, 0xda, 0x1f, 0xbd, 0xb8, 0x05, 0x31, 0xd2, 0xf6, \n  0x9a, 0xe4, 0x0f, 0x8d, 0x2c, 0xfd, 0x2a, 0xab, 0xe8, 0xa5, 0x71, 0x01, 0xf5, 0x87, 0x06, 0x9d, \n  0x57, 0xf5, 0x56, 0x2a, 0xf9, 0xa3, 0xb5, 0xf9, 0xce, 0xc5, 0xf7, 0xb0, 0x29, 0xff, 0x2f, 0x95, \n  0xfb, 0x15, 0xf0, 0xf9, 0x82, 0x9a, 0x01, 0x2d, 0xee, 0xfd, 0xc8, 0x2d, 0xfa, 0x7c, 0x1c, 0x01, \n  0x56, 0x5a, 0x00, 0x3b, 0xb3, 0xfc, 0xcf, 0x49, 0x3b, 0xe3, 0xdc, 0x2a, 0x26, 0xc0, 0xeb, 0x0e, \n  0xb9, 0x19, 0x76, 0xd0, 0x18, 0xd1, 0xfa, 0xe7, 0xf1, 0xf9, 0xf7, 0x01, 0x88, 0xff, 0x04, 0x60, \n  0xf9, 0xf1, 0x7b, 0xe6, 0x57, 0x76, 0xf9, 0xa5, 0x7d, 0x1f, 0x3b, 0xf9, 0xfc, 0xa6, 0x2e, 0xf0, \n  0x13, 0x41, 0x0c, 0x51, 0x25, 0x02, 0xa1, 0x10, 0xf3, 0xdc, 0xd5, 0x05, 0x4d, 0x5a, 0x0c, 0xd2, \n  0x1f, 0xfb, 0xdb, 0xcc, 0xfd, 0x2c, 0x51, 0xfe, 0x00, 0xa8, 0xf9, 0x88, 0xe1, 0xfd, 0x87, 0x30, \n  0xf6, 0xba, 0x1b, 0xf4, 0x6b, 0x09, 0xfd, 0x12, 0xec, 0xfc, 0xde, 0xfc, 0xf8, 0xbc, 0x22, 0xfd, \n  0x66, 0x0e, 0x00, 0x7b, 0x75, 0xfe, 0x44, 0x9a, 0x31, 0x2b, 0xd8, 0x28, 0xb2, 0xca, 0xf5, 0x20, \n  0xaf, 0x17, 0x57, 0x5e, 0x14, 0x5a, 0x42, 0xea, 0x6b, 0x2e, 0xf9, 0x91, 0x9c, 0xff, 0x59, 0xf4, \n  0xf8, 0xc1, 0x2c, 0xeb, 0xce, 0x9d, 0xf8, 0x93, 0x3c, 0x18, 0xc4, 0xd4, 0x00, 0x73, 0xc8, 0xf5, \n  0x22, 0x5b, 0x0a, 0x3e, 0xdf, 0x00, 0xed, 0x15, 0xf4, 0x5c, 0x84, 0x03, 0x4c, 0x67, 0x09, 0xa9, \n  0xae, 0xfc, 0xb3, 0xb3, 0xfe, 0x96, 0xce, 0xfd, 0xf1, 0xba, 0xf9, 0xb0, 0x87, 0xfe, 0xcf, 0x78, \n  0xf8, 0x0a, 0x36, 0xf6, 0xe1, 0xb8, 0xfd, 0x8e, 0x8b, 0xfc, 0xaa, 0x73, 0xf9, 0xa3, 0x9a, 0xfd, \n  0x37, 0x8a, 0xff, 0x6f, 0xf9, 0xfd, 0xa3, 0x9e, 0x29, 0xf5, 0xd4, 0x24, 0x87, 0xe2, 0xfb, 0xb2, \n  0x58, 0x16, 0x71, 0xff, 0x11, 0x65, 0xcf, 0xee, 0x27, 0xed, 0xfb, 0xd7, 0x93, 0x00, 0xe8, 0xba, \n  0xf8, 0xf7, 0x53, 0xed, 0x13, 0x2f, 0xf9, 0xdc, 0x5d, 0x13, 0xf5, 0xad, 0x01, 0x84, 0xfe, 0xf8, \n  0x4d, 0x6b, 0x08, 0x19, 0xcb, 0x00, 0xec, 0xf6, 0xf5, 0x95, 0x7d, 0x01, 0x53, 0xe4, 0x07, 0xd0, \n  0xd0, 0xfd, 0xac, 0x09, 0xfe, 0x7e, 0x1f, 0xfe, 0xa2, 0xaa, 0xfa, 0xfe, 0xe4, 0xfd, 0x98, 0x8e, \n  0xfa, 0x67, 0xeb, 0xf8, 0x08, 0x04, 0xfe, 0x35, 0x7c, 0xfd, 0xa2, 0x85, 0xfa, 0x4a, 0x20, 0xfd, \n  0xa7, 0x9b, 0xff, 0x66, 0x33, 0xfe, 0x86, 0x9c, 0x22, 0xf3, 0x81, 0x20, 0xa2, 0xea, 0x00, 0xf3, \n  0x9e, 0x15, 0xad, 0x9a, 0x0f, 0xa5, 0x94, 0xf2, 0xda, 0x0a, 0xff, 0x73, 0xee, 0x01, 0xe2, 0x2d, \n  0xf8, 0x2c, 0x2f, 0xef, 0x33, 0x29, 0xfa, 0xaa, 0x9a, 0x0f, 0xa4, 0xad, 0x02, 0xde, 0x8b, 0xfa, \n  0x01, 0x45, 0x06, 0xca, 0xd7, 0x01, 0xd6, 0x17, 0xf7, 0xa6, 0x53, 0xff, 0x68, 0x24, 0x07, 0x3f, \n  0xd0, 0xfe, 0x35, 0xc9, 0xfd, 0x40, 0x2f, 0xfe, 0x20, 0x5e, 0xfb, 0x75, 0x00, 0xfe, 0xca, 0xb5, \n  0xfb, 0xfa, 0x46, 0xfb, 0x2a, 0xb0, 0xff, 0xb7, 0xfa, 0xfd, 0xf3, 0xd9, 0xfa, 0x4b, 0x5f, 0xfd, \n  0xde, 0xa5, 0xff, 0x3f, 0x31, 0xfe, 0xa4, 0xad, 0x1d, 0xeb, 0x1c, 0x1d, 0x95, 0x0b, 0x03, 0xb2, \n  0xb7, 0x13, 0x3f, 0xd6, 0x0e, 0x8f, 0xbe, 0xf6, 0xab, 0x34, 0x00, 0x45, 0xb4, 0x01, 0xac, 0x43, \n  0xf9, 0xbd, 0xa9, 0xf1, 0xdc, 0xfb, 0xf9, 0xae, 0x47, 0x0d, 0xfd, 0xf1, 0x03, 0x9d, 0x5e, 0xfa, \n  0x93, 0x55, 0x04, 0x87, 0x84, 0x02, 0xc1, 0xfe, 0xf7, 0x3c, 0x97, 0xfe, 0xe7, 0xf2, 0x05, 0x7c, \n  0x20, 0xff, 0x16, 0xf0, 0xfd, 0x79, 0x0e, 0xfe, 0x27, 0xf7, 0xfb, 0xb1, 0x77, 0xfe, 0xbf, 0xad, \n  0xfd, 0x09, 0x2d, 0xfd, 0x4d, 0xb2, 0xff, 0x43, 0x42, 0xfe, 0xac, 0xb3, 0xfb, 0x27, 0xe3, 0xfd, \n  0xc4, 0x5b, 0xff, 0xfb, 0x72, 0xfd, 0xcd, 0x72, 0x1a, 0x05, 0x94, 0x1a, 0x7e, 0x68, 0x03, 0xa6, \n  0x0c, 0x11, 0x79, 0x10, 0x0f, 0x09, 0x66, 0xfb, 0x2b, 0xf4, 0xff, 0x7a, 0x26, 0x00, 0x0c, 0x8a, \n  0xfb, 0x78, 0xf7, 0xf4, 0x86, 0xec, 0xf9, 0x0d, 0x1f, 0x0b, 0xc0, 0x77, 0x04, 0x70, 0xca, 0xfa, \n  0xf1, 0x78, 0x02, 0xc1, 0xf3, 0x01, 0x7d, 0xdf, 0xf9, 0x4b, 0xe1, 0xfe, 0xae, 0x57, 0x04, 0xf6, \n  0x2d, 0xff, 0x2f, 0x1e, 0xfe, 0x32, 0x51, 0xfe, 0x38, 0x7b, 0xfd, 0x32, 0x07, 0x00, 0xf6, 0x22, \n  0xff, 0x8b, 0x6e, 0xfd, 0x19, 0x13, 0xff, 0x78, 0xdd, 0xfe, 0x49, 0xee, 0xfc, 0xa9, 0xcb, 0xfd, \n  0x2e, 0x72, 0xfe, 0x0e, 0x17, 0xfd, 0xf6, 0x42, 0x16, 0x0e, 0xbc, 0x17, 0x9a, 0x09, 0x05, 0x13, \n  0x8c, 0x0f, 0x8c, 0x2b, 0x0e, 0xa2, 0x1f, 0xfe, 0x0f, 0x92, 0x00, 0x34, 0xec, 0xff, 0x00, 0xbb, \n  0xfc, 0x26, 0x56, 0xf7, 0xa1, 0xa1, 0xfa, 0x9e, 0xa4, 0x08, 0x1f, 0x91, 0x03, 0x6a, 0xa2, 0xfb, \n  0xcd, 0x48, 0x01, 0x50, 0x50, 0x01, 0xc2, 0x74, 0xfb, 0xd8, 0x9a, 0xfe, 0x0c, 0xe3, 0x02, 0x9d, \n  0x40, 0xff, 0x42, 0xe6, 0xfe, 0xa2, 0xdf, 0xff, 0xb2, 0xa5, 0xfe, 0x90, 0x2a, 0x00, 0x01, 0x75, \n  0xff, 0xed, 0x73, 0xfd, 0x63, 0xae, 0xfe, 0xb5, 0xe3, 0xfe, 0x63, 0x48, 0xfd, 0xe9, 0x71, 0xfd, \n  0xb9, 0xfc, 0xfd, 0x21, 0x9d, 0xfd, 0xef, 0xf0, 0x12, 0x23, 0x16, 0x15, 0x6f, 0x6b, 0x06, 0xab, \n  0x48, 0x0e, 0x26, 0x18, 0x0d, 0xe2, 0x60, 0x00, 0x1d, 0xe4, 0x00, 0x05, 0x01, 0x00, 0x92, 0x19, \n  0xfe, 0x04, 0xad, 0xf9, 0xfa, 0x75, 0xfb, 0x6d, 0xbb, 0x05, 0x22, 0xda, 0x02, 0x3a, 0xe2, 0xfc, \n  0x37, 0x34, 0x00, 0x60, 0xfc, 0x00, 0x8c, 0xb9, 0xfc, 0x9f, 0x61, 0xfe, 0x29, 0x62, 0x02, 0x2b, \n  0xc4, 0x00, 0xfd, 0x02, 0x00, 0xee, 0xbe, 0xff, 0x52, 0x3d, 0xff, 0x1b, 0xbe, 0x00, 0xe4, 0x51, \n  0xff, 0x97, 0x1e, 0xfd, 0xdb, 0x41, 0xfe, 0xb3, 0xc3, 0xfe, 0x1b, 0x8e, 0xfd, 0x19, 0xe1, 0xfd, \n  0x49, 0x6c, 0xfe, 0x75, 0xe7, 0xfd, 0x43, 0x8c, 0x0f, 0xa1, 0x9e, 0x12, 0x30, 0xc6, 0x07, 0xd9, \n  0xc1, 0x0d, 0x74, 0xde, 0x0b, 0x9f, 0xe2, 0x00, 0xed, 0xda, 0x01, 0x55, 0x4f, 0x01, 0x33, 0xe2, \n  0xfe, 0xa7, 0x09, 0xfb, 0x8e, 0xd1, 0xfb, 0x65, 0xd8, 0x03, 0x2d, 0x12, 0x02, 0x48, 0xec, 0xfc, \n  0xe1, 0x1e, 0x00, 0xf1, 0x8a, 0x01, 0x89, 0x67, 0xfd, 0xde, 0x09, 0xff, 0x28, 0x0d, 0x03, 0x77, \n  0xda, 0x00, 0xe9, 0x9d, 0xff, 0x7e, 0x19, 0x00, 0xf8, 0x11, 0x00, 0xfb, 0x8d, 0x00, 0xd9, 0x6e, \n  0xfe, 0xf7, 0x8d, 0xfc, 0x86, 0x4f, 0xfe, 0x7a, 0x69, 0xff, 0x01, 0x43, 0xfe, 0x3b, 0x0f, 0xfe, \n  0xce, 0x6a, 0xfe, 0x12, 0x75, 0xfe, 0xc3, 0xa2, 0x0d, 0x06, 0x01, 0x11, 0x90, 0xc7, 0x07, 0xca, \n  0x97, 0x0c, 0x9d, 0x0b, 0x0b, 0x59, 0x4c, 0x01, 0x19, 0x2e, 0x02, 0xfd, 0x1b, 0x02, 0x07, 0xf6, \n  0xff, 0x0c, 0x37, 0xfc, 0xb5, 0xaa, 0xfb, 0x39, 0x23, 0x02, 0xf3, 0x64, 0x01, 0xa2, 0x53, 0xfd, \n  0xf8, 0xaa, 0x00, 0x86, 0xe1, 0x02, 0x66, 0xd1, 0xfe, 0x5b, 0xb7, 0xfe, 0xfa, 0x16, 0x02, 0xeb, \n  0xea, 0x00, 0xed, 0xfa, 0xff, 0x1c, 0x70, 0x00, 0xae, 0x00, 0x00, 0xb6, 0x3d, 0xff, 0x6b, 0x86, \n  0xfd, 0x6f, 0xa1, 0xfd, 0x95, 0x6c, 0xff, 0xdc, 0x7b, 0xff, 0x38, 0x64, 0xfe, 0xcf, 0x45, 0xfe, \n  0x6e, 0xe6, 0xfe, 0x57, 0x6b, 0xff, 0x6f, 0xed, 0x0c, 0x95, 0x61, 0x0f, 0x5e, 0x0e, 0x07, 0x22, \n  0x06, 0x0c, 0x7b, 0xd3, 0x09, 0xc6, 0x43, 0x01, 0x4d, 0x11, 0x03, 0xdd, 0x01, 0x03, 0x4a, 0x9f, \n  0x00, 0x63, 0x7f, 0xfc, 0x86, 0xb1, 0xfb, 0x1b, 0x3f, 0x01, 0x1c, 0xd8, 0x00, 0x96, 0x61, 0xff, \n  0x0f, 0x05, 0x03, 0xa2, 0x79, 0x02, 0xb1, 0xf0, 0xfd, 0x9a, 0xdf, 0xfe, 0xec, 0xd7, 0x01, 0xdc, \n  0x0b, 0x01, 0x79, 0x69, 0x00, 0x4c, 0xdd, 0xff, 0x1e, 0x10, 0xff, 0x03, 0x0c, 0xff, 0xd2, 0xa0, \n  0xfe, 0xaa, 0xd6, 0xfe, 0xe8, 0xb1, 0xff, 0x44, 0x9b, 0xff, 0x55, 0xad, 0xfe, 0x5c, 0xee, 0xfe, \n  0x64, 0x90, 0xff, 0x28, 0xfb, 0xfe, 0xa0, 0x5a, 0x0c, 0x17, 0x31, 0x0e, 0xe9, 0x2f, 0x06, 0x57, \n  0xe8, 0x0a, 0x9f, 0xf4, 0x08, 0xe5, 0x9a, 0x01, 0xa2, 0x04, 0x04, 0x20, 0xb2, 0x03, 0x73, 0x84, \n  0x00, 0x55, 0xed, 0xfc, 0xc2, 0x21, 0xfc, 0x83, 0x7b, 0x01, 0x9a, 0xc1, 0x02, 0xb8, 0xab, 0x00, \n  0x63, 0x5d, 0x02, 0x62, 0xfe, 0x01, 0x78, 0xfe, 0xfd, 0x06, 0xc1, 0xfe, 0x59, 0xd7, 0x01, 0x09, \n  0x12, 0x01, 0xba, 0xbd, 0xff, 0xd8, 0xd0, 0xff, 0x86, 0xd0, 0xff, 0x45, 0xa7, 0xff, 0x4f, 0x80, \n  0xff, 0x2b, 0x5e, 0xff, 0xbd, 0x0f, 0x00, 0xf8, 0x34, 0x00, 0x07, 0xde, 0xfe, 0x7b, 0x7e, 0xfe, \n  0x32, 0xa5, 0xfe, 0x5f, 0x5c, 0xfe, 0x6d, 0x6d, 0x0b, 0xe0, 0xc0, 0x0c, 0x41, 0x43, 0x05, 0xd8, \n  0xee, 0x09, 0xb9, 0x80, 0x08, 0x93, 0x44, 0x02, 0x67, 0xa7, 0x04, 0xd5, 0xed, 0x03, 0xfd, 0x9d, \n  0x00, 0x88, 0x63, 0xfe, 0x8a, 0x81, 0xfe, 0xfe, 0x65, 0x01, 0xdc, 0xf5, 0x01, 0x28, 0x8c, 0x01, \n  0xde, 0x30, 0x02, 0x6b, 0x28, 0x01, 0x9c, 0x16, 0xfe, 0x98, 0x45, 0xfe, 0x64, 0x39, 0x01, 0x70, \n  0x79, 0x01, 0x6c, 0xc3, 0x00, 0x4d, 0x7b, 0x00, 0x3d, 0xb5, 0xff, 0xd5, 0xcd, 0xff, 0x99, 0x4f, \n  0x00, 0xa6, 0x6c, 0x00, 0x8f, 0x6e, 0x00, 0x45, 0x22, 0xff, 0x77, 0x75, 0xfd, 0x51, 0xdc, 0xfd, \n  0x0d, 0xbd, 0xfe, 0x6c, 0xd1, 0xfe, 0x48, 0xce, 0x0a, 0x52, 0x60, 0x0c, 0x17, 0x92, 0x04, 0x3e, \n  0x24, 0x07, 0xe2, 0x5d, 0x07, 0x72, 0x6d, 0x04, 0x1b, 0xf6, 0x05, 0xcb, 0x48, 0x04, 0x6b, 0x1e, \n  0x02, 0x50, 0xa2, 0xff, 0xf2, 0x44, 0xfe, 0xd3, 0x93, 0x01, 0x2b, 0xbf, 0x02, 0x99, 0x16, 0x01, \n  0xac, 0x01, 0x01, 0xf7, 0x23, 0x00, 0x3b, 0xb5, 0xfd, 0x73, 0x3c, 0xff, 0xf7, 0xb8, 0x02, 0x4d, \n  0x0e, 0x02, 0x85, 0x60, 0x00, 0x2c, 0x2e, 0x00, 0x47, 0x70, 0x00, 0x8b, 0x60, 0x01, 0xf2, 0x0a, \n  0x01, 0x43, 0x4b, 0xff, 0x3e, 0x6e, 0xfe, 0x59, 0x1f, 0xfe, 0x3d, 0xeb, 0xfd, 0xba, 0x8c, 0xfe, \n  0xe1, 0x45, 0xff, 0xee, 0x07, 0xff, 0xe0, 0x61, 0x08, 0xde, 0x17, 0x0b, 0x98, 0x0f, 0x05, 0x58, \n  0x58, 0x06, 0xa6, 0x87, 0x07, 0xa1, 0xcb, 0x04, 0xd3, 0x08, 0x07, 0x8d, 0x1b, 0x07, 0xce, 0x18, \n  0x03, 0xc4, 0x47, 0x00, 0xb6, 0xac, 0xfe, 0x06, 0xf8, 0xff, 0x67, 0xed, 0x01, 0x9c, 0x34, 0x01, \n  0x18, 0x55, 0x00, 0x5b, 0xc7, 0xff, 0xa0, 0x1f, 0xff, 0xd4, 0x87, 0x00, 0xa9, 0xb9, 0x02, 0x68, \n  0x6d, 0x02, 0x58, 0xcd, 0x00, 0x3f, 0x8f, 0x00, 0xfc, 0x27, 0x01, 0x14, 0x2a, 0x01, 0x2f, 0xcb, \n  0xff, 0xca, 0x2f, 0xfe, 0xfc, 0x47, 0xfe, 0x30, 0x91, 0xfe, 0xe2, 0x60, 0xfe, 0xf0, 0xf3, 0xfe, \n  0x5b, 0x29, 0xff, 0xed, 0xb7, 0xfe, 0x7a, 0x36, 0x07, 0x30, 0xb9, 0x0a, 0x39, 0x70, 0x06, 0x59, \n  0x78, 0x06, 0x73, 0x7c, 0x08, 0x04, 0x13, 0x07, 0x70, 0x93, 0x05, 0x18, 0x16, 0x05, 0xd4, 0xec, \n  0x03, 0xdb, 0x17, 0x01, 0xc5, 0x22, 0xff, 0x16, 0x1b, 0xff, 0xad, 0x4d, 0xff, 0x6e, 0xea, 0xff, \n  0x2a, 0xaa, 0x01, 0x49, 0x20, 0x02, 0xaf, 0xb2, 0x00, 0x32, 0xe3, 0x00, 0x94, 0x2e, 0x02, 0xe1, \n  0x2f, 0x02, 0x03, 0x39, 0x01, 0x54, 0x78, 0x00, 0x0a, 0x4c, 0x00, 0xbe, 0xb5, 0xff, 0xf5, 0xc9, \n  0xfe, 0xa8, 0x79, 0xfe, 0x83, 0xa6, 0xfe, 0x41, 0x8c, 0xfe, 0x82, 0x5d, 0xfe, 0xe6, 0xb9, 0xfe, \n  0x8e, 0x27, 0xff, 0xc1, 0x0f, 0xff, 0xd2, 0xda, 0x05, 0x49, 0x76, 0x0a, 0xa1, 0x95, 0x08, 0x76, \n  0x24, 0x07, 0xbd, 0x0a, 0x08, 0xcb, 0x53, 0x08, 0x98, 0x10, 0x07, 0x47, 0x58, 0x04, 0x47, 0x86, \n  0x01, 0xe6, 0xa0, 0xff, 0x50, 0xf9, 0xfe, 0x10, 0x8b, 0xff, 0xa7, 0x74, 0x00, 0xec, 0xb4, 0x00, \n  0x51, 0x05, 0x01, 0xf6, 0xfd, 0x01, 0xdf, 0x75, 0x02, 0xbc, 0x17, 0x02, 0xcf, 0xd6, 0x01, 0x06, \n  0x79, 0x01, 0x66, 0x88, 0x00, 0x91, 0xbe, 0xff, 0xfc, 0x60, 0xff, 0x80, 0x45, 0xff, 0x2f, 0xff, \n  0xfe, 0xea, 0xac, 0xfe, 0x39, 0xcb, 0xfe, 0xea, 0xc3, 0xfe, 0xa0, 0x5c, 0xfe, 0xb8, 0x54, 0xfe, \n  0x42, 0xe8, 0xfe, 0x02, 0x22, 0xff, 0xe9, 0x81, 0x07, 0x0c, 0x43, 0x0b, 0x0a, 0x16, 0x07, 0xe4, \n  0xee, 0x07, 0x05, 0x5c, 0x09, 0xb5, 0x8c, 0x06, 0x1e, 0x30, 0x06, 0x47, 0x2f, 0x05, 0x33, 0xd0, \n  0x00, 0x1a, 0xe1, 0xfd, 0x54, 0x08, 0xff, 0x75, 0xf1, 0x00, 0xb5, 0xcf, 0x00, 0x9b, 0xfb, 0x00, \n  0x96, 0xdd, 0x01, 0x58, 0xda, 0x01, 0x3c, 0x56, 0x02, 0x0d, 0x52, 0x03, 0x3b, 0x39, 0x02, 0x17, \n  0xe7, 0xff, 0x10, 0xff, 0xfe, 0x77, 0x46, 0xff, 0x64, 0x6e, 0xff, 0x49, 0x61, 0xff, 0x7c, 0x4d, \n  0xff, 0x63, 0xd2, 0xfe, 0x9b, 0x80, 0xfe, 0xbd, 0x81, 0xfe, 0xa9, 0x7a, 0xfe, 0x15, 0x04, 0xff, \n  0x79, 0x27, 0xff, 0x7d, 0xad, 0xfe, 0x8b, 0x64, 0x07, 0xde, 0x1e, 0x0b, 0x4e, 0xf3, 0x07, 0x7a, \n  0xb1, 0x07, 0x56, 0xd3, 0x07, 0xba, 0xeb, 0x05, 0xbb, 0xed, 0x04, 0x7e, 0x44, 0x04, 0x32, 0x20, \n  0x02, 0xba, 0xd1, 0xff, 0x7c, 0x33, 0x00, 0x1b, 0xf5, 0x00, 0x44, 0xa1, 0x00, 0x80, 0xba, 0x00, \n  0x50, 0x75, 0x01, 0x28, 0x66, 0x02, 0x28, 0x18, 0x03, 0x5b, 0x2f, 0x03, 0x85, 0x73, 0x01, 0xee, \n  0x66, 0xff, 0x8a, 0x1a, 0xff, 0xb0, 0x11, 0xff, 0x3f, 0x11, 0xff, 0x79, 0x64, 0xff, 0x08, 0x71, \n  0xff, 0xd5, 0x40, 0xff, 0xfc, 0xb0, 0xfe, 0xe4, 0x34, 0xfe, 0xf3, 0x67, 0xfe, 0xd3, 0xf6, 0xfe, \n  0xe2, 0x1d, 0xff, 0x3f, 0x0c, 0xff, 0xd7, 0x16, 0x08, 0x5e, 0x53, 0x0c, 0x9c, 0xd9, 0x06, 0x23, \n  0xd1, 0x04, 0x24, 0x0d, 0x06, 0x84, 0x54, 0x05, 0x00, 0x3b, 0x04, 0xdd, 0x62, 0x04, 0x91, 0x56, \n  0x04, 0x35, 0x30, 0x01, 0x8d, 0x28, 0x00, 0x97, 0x90, 0x01, 0x75, 0xbe, 0x00, 0xcf, 0x74, 0x00, \n  0x68, 0xe8, 0x01, 0xf0, 0xac, 0x02, 0xf6, 0xfa, 0x01, 0x82, 0x5f, 0x02, 0x57, 0xd1, 0x02, 0x3e, \n  0x37, 0x00, 0x09, 0x17, 0xfe, 0x60, 0x84, 0xfe, 0x9e, 0x86, 0xff, 0xb0, 0x9a, 0xff, 0xa5, 0x01, \n  0xff, 0x8b, 0x19, 0xff, 0x2a, 0x0f, 0xff, 0x6b, 0x9a, 0xfe, 0xdc, 0x6c, 0xfe, 0x9d, 0x6a, 0xfe, \n  0xa1, 0xd9, 0xfe, 0xea, 0x5d, 0xff, 0x55, 0x6f, 0x08, 0xac, 0xeb, 0x0b, 0xaa, 0x75, 0x05, 0xf7, \n  0x39, 0x03, 0x06, 0x1e, 0x04, 0x26, 0x25, 0x04, 0x06, 0x75, 0x05, 0x55, 0x9d, 0x05, 0xec, 0x6b, \n  0x03, 0x8f, 0xc0, 0x01, 0x30, 0x9a, 0x02, 0x0f, 0xa0, 0x01, 0xd9, 0xc2, 0xff, 0x9a, 0x2f, 0x01, \n  0x1c, 0x59, 0x02, 0x90, 0x4a, 0x02, 0xbd, 0x65, 0x02, 0x88, 0x6e, 0x02, 0xe5, 0x69, 0x02, 0xb5, \n  0x8f, 0x01, 0x7b, 0xf5, 0xff, 0xbc, 0x71, 0xfe, 0xc5, 0x4e, 0xfe, 0x2c, 0x31, 0xff, 0x8b, 0xb3, \n  0xff, 0xe0, 0xce, 0xff, 0x8c, 0x0b, 0xff, 0xb9, 0x7c, 0xfe, 0x20, 0xcb, 0xfe, 0x2d, 0xa1, 0xfe, \n  0xac, 0x92, 0xfe, 0x3e, 0xdf, 0xfe, 0xa0, 0xa2, 0x08, 0xb5, 0xca, 0x0b, 0x20, 0x4e, 0x05, 0xef, \n  0x68, 0x03, 0xb8, 0x1d, 0x04, 0x32, 0x8f, 0x03, 0x75, 0xbd, 0x03, 0xf3, 0x98, 0x03, 0x61, 0x89, \n  0x02, 0x8f, 0x09, 0x02, 0x8a, 0x47, 0x03, 0xe3, 0x0b, 0x03, 0xf1, 0xbf, 0x01, 0x23, 0xc5, 0x00, \n  0x1e, 0xed, 0x00, 0xc6, 0xef, 0x02, 0x62, 0x0d, 0x03, 0x2e, 0x24, 0x02, 0xd2, 0x0c, 0x02, 0x49, \n  0x56, 0x02, 0x6c, 0xe0, 0x01, 0x8e, 0xf1, 0xff, 0x3d, 0x56, 0xff, 0xcf, 0x93, 0xfe, 0xff, 0x0d, \n  0xfe, 0xa7, 0xcf, 0xff, 0x95, 0x1d, 0x00, 0xc3, 0x0c, 0xff, 0xee, 0xc0, 0xfe, 0xf7, 0x12, 0xff, \n  0xf3, 0xe6, 0xfe, 0x21, 0x81, 0xfe, 0x15, 0xbc, 0x08, 0x2a, 0x57, 0x0c, 0x6c, 0x5b, 0x05, 0x95, \n  0xef, 0x02, 0xa9, 0xb8, 0x04, 0xe4, 0xd2, 0x04, 0x7e, 0xed, 0x03, 0x62, 0xe4, 0x01, 0x22, 0x06, \n  0xff, 0x9a, 0x61, 0xff, 0x1e, 0x66, 0x04, 0x55, 0x1c, 0x05, 0x4e, 0x83, 0x01, 0x7a, 0xc5, 0x00, \n  0x08, 0x83, 0x01, 0xc9, 0xf2, 0x01, 0xe3, 0x6c, 0x02, 0x50, 0xf6, 0x02, 0x47, 0x68, 0x02, 0x0c, \n  0xb5, 0x01, 0xd8, 0x74, 0x02, 0xf2, 0x63, 0x02, 0x6b, 0xab, 0x00, 0x34, 0x12, 0xff, 0x29, 0xea, \n  0xfe, 0x88, 0xb6, 0xfe, 0x7c, 0x39, 0xfe, 0x20, 0x86, 0xff, 0xff, 0x2f, 0x00, 0x58, 0x26, 0xff, \n  0x7d, 0xf2, 0xfe, 0x71, 0x0e, 0xff, 0x34, 0x39, 0x0a, 0x00, 0x7b, 0x0d, 0x16, 0xde, 0x04, 0x2c, \n  0x04, 0x03, 0xcc, 0x01, 0x05, 0xc8, 0xde, 0x04, 0x04, 0x5b, 0x04, 0xcf, 0xd8, 0x00, 0x38, 0xe8, \n  0xfc, 0xfb, 0x2b, 0xfe, 0x98, 0x4f, 0x03, 0x08, 0xeb, 0x03, 0x1c, 0xe3, 0x01, 0x14, 0x84, 0x01, \n  0x5d, 0x41, 0x00, 0x4a, 0x2b, 0x01, 0x3e, 0x2a, 0x03, 0xdf, 0x47, 0x02, 0xe4, 0x7c, 0x01, 0xcb, \n  0x89, 0x02, 0x71, 0x98, 0x02, 0xaa, 0x5c, 0x01, 0x07, 0x16, 0x02, 0x48, 0xd7, 0x01, 0x56, 0x31, \n  0xff, 0xd8, 0x76, 0xfe, 0x8a, 0x65, 0xfe, 0xb3, 0x17, 0xfe, 0xa7, 0xfd, 0xfe, 0x18, 0xd4, 0xff, \n  0x66, 0xb4, 0xff, 0x59, 0x05, 0xff, 0xb4, 0x02, 0x0c, 0x5d, 0xda, 0x0f, 0xf5, 0x78, 0x05, 0xc1, \n  0xe7, 0x02, 0xb3, 0x5d, 0x04, 0x53, 0xff, 0x03, 0x28, 0x3a, 0x04, 0xa1, 0x8f, 0x00, 0x50, 0xac, \n  0xfb, 0x27, 0x14, 0xfd, 0xdd, 0xf1, 0x03, 0x1f, 0xe2, 0x03, 0xea, 0xc0, 0xff, 0x12, 0x57, 0x00, \n  0x3e, 0x81, 0x00, 0x68, 0x35, 0x01, 0x17, 0x48, 0x02, 0x14, 0x9e, 0x01, 0x02, 0x01, 0x02, 0x14, \n  0x3b, 0x02, 0xb5, 0x01, 0x02, 0xff, 0x2a, 0x02, 0xa9, 0xfc, 0x01, 0x8c, 0x55, 0x01, 0x4d, 0x48, \n  0x01, 0x90, 0x9e, 0x00, 0x26, 0x42, 0xfe, 0x45, 0x0a, 0xfe, 0x92, 0x12, 0xff, 0x17, 0xa4, 0xfe, \n  0xa2, 0xd7, 0xfe, 0x12, 0xab, 0xff, 0x2a, 0x39, 0x0e, 0x4a, 0x12, 0x12, 0xba, 0x51, 0x05, 0x64, \n  0xf6, 0x02, 0x3a, 0x97, 0x04, 0x93, 0xd4, 0x03, 0xae, 0x64, 0x04, 0xc9, 0x41, 0xff, 0xc2, 0x7f, \n  0xf9, 0x71, 0xd3, 0xfc, 0xfd, 0xfe, 0x04, 0x36, 0xe7, 0x03, 0x8e, 0x22, 0xff, 0x2b, 0x4b, 0xff, \n  0xfe, 0x80, 0xfe, 0x5f, 0x76, 0x00, 0xa6, 0xd3, 0x02, 0x90, 0x8e, 0x01, 0xd7, 0x64, 0x01, 0xff, \n  0xa8, 0x01, 0x32, 0xba, 0x01, 0xc7, 0x4b, 0x01, 0xed, 0xd1, 0x01, 0x65, 0x85, 0x02, 0x5a, 0x02, \n  0x01, 0xd9, 0xaf, 0x00, 0xcd, 0xa3, 0x00, 0xa4, 0x71, 0xff, 0x7c, 0xa6, 0xfe, 0x28, 0x66, 0xfe, \n  0x23, 0xcf, 0xfe, 0x6e, 0xd4, 0xfe, 0x15, 0xd8, 0x10, 0x52, 0x49, 0x14, 0xa5, 0xb9, 0x04, 0xde, \n  0x3c, 0x03, 0x82, 0x62, 0x05, 0x85, 0xdf, 0x03, 0x4e, 0x4f, 0x04, 0x43, 0xdf, 0xfd, 0xe0, 0x97, \n  0xf7, 0xc3, 0xd3, 0xfc, 0xda, 0x29, 0x06, 0x69, 0xa1, 0x03, 0x86, 0x62, 0xfe, 0x5e, 0x0f, 0xff, \n  0xe9, 0xd8, 0xfd, 0x9b, 0x91, 0xff, 0x4a, 0x9d, 0x01, 0x99, 0x2c, 0x01, 0x26, 0x14, 0x02, 0x88, \n  0xad, 0x01, 0xde, 0xd0, 0x00, 0xc4, 0x51, 0x00, 0x79, 0x93, 0x01, 0xc7, 0xfc, 0x01, 0x38, 0xfd, \n  0x00, 0x0d, 0xb6, 0x01, 0xde, 0x58, 0x00, 0x09, 0x27, 0x00, 0xb2, 0x28, 0x01, 0xbd, 0x33, 0xff, \n  0x17, 0x64, 0xfe, 0x9d, 0xcd, 0xfe, 0xd5, 0xe7, 0x13, 0xd6, 0xeb, 0x16, 0xfb, 0x15, 0x04, 0xaa, \n  0x47, 0x03, 0x46, 0xcc, 0x05, 0x05, 0x56, 0x03, 0x77, 0xf0, 0x03, 0xfc, 0x54, 0xfc, 0x3f, 0x12, \n  0xf6, 0x61, 0xf2, 0xfd, 0x90, 0x50, 0x07, 0x6a, 0x89, 0x02, 0xf4, 0x39, 0xfd, 0xb8, 0x7e, 0xfe, \n  0xb3, 0x4b, 0xfd, 0x27, 0xaa, 0xff, 0x24, 0x6e, 0x01, 0x4f, 0xe6, 0xff, 0xd9, 0x58, 0x01, 0xf2, \n  0xee, 0x01, 0xcc, 0xad, 0x00, 0x35, 0xdf, 0xff, 0x68, 0xa8, 0x00, 0x53, 0xea, 0x00, 0xf7, 0xc8, \n  0x00, 0x0d, 0x1a, 0x01, 0xe8, 0x33, 0x00, 0xa0, 0xe1, 0x00, 0x3f, 0xef, 0x00, 0xee, 0x2b, 0x00, \n  0xdc, 0x8b, 0x00, 0x95, 0x39, 0xff, 0xc1, 0x3a, 0x17, 0xe5, 0x6f, 0x19, 0xe7, 0x3b, 0x03, 0xa0, \n  0xc0, 0x03, 0x16, 0xb9, 0x06, 0x7c, 0xc3, 0x02, 0x24, 0xf9, 0x02, 0x41, 0x45, 0xfa, 0xdd, 0xd0, \n  0xf4, 0xc8, 0xdc, 0xff, 0x0e, 0xcb, 0x08, 0xa8, 0x60, 0x01, 0x0f, 0x60, 0xfc, 0x8d, 0xc5, 0xfd, \n  0xe6, 0x57, 0xfc, 0x71, 0xe6, 0xff, 0x74, 0x33, 0x01, 0xa0, 0x98, 0xff, 0xf3, 0x9f, 0x01, 0x53, \n  0x27, 0x01, 0x7d, 0xf4, 0xff, 0xea, 0xc7, 0xff, 0xa1, 0x89, 0x00, 0xf2, 0xa5, 0x00, 0x70, 0xe2, \n  0xff, 0xd3, 0x4d, 0x00, 0x08, 0x8e, 0xff, 0x59, 0x4c, 0x00, 0x8a, 0x5a, 0x01, 0x1b, 0xa3, 0x00, \n  0x23, 0x98, 0x00, 0x58, 0x89, 0x00, 0x3d, 0xac, 0x1a, 0x2f, 0x29, 0x1c, 0x82, 0x5e, 0x02, 0x59, \n  0x4b, 0x04, 0xf9, 0xb4, 0x07, 0xcc, 0xf2, 0x01, 0x3b, 0xa9, 0x01, 0x55, 0xe1, 0xf7, 0xcc, 0x15, \n  0xf4, 0x0c, 0x4e, 0x02, 0x37, 0xc0, 0x09, 0x1e, 0x07, 0x00, 0x67, 0xcf, 0xfb, 0xd8, 0x6d, 0xfd, \n  0x38, 0x97, 0xfb, 0xf1, 0xe1, 0xff, 0x74, 0xb6, 0x00, 0x5d, 0xce, 0xfe, 0x60, 0x2e, 0x02, 0xc0, \n  0x7f, 0x01, 0x12, 0x2f, 0xff, 0x1f, 0x11, 0xff, 0xeb, 0x38, 0x00, 0x85, 0x6a, 0x00, 0xe2, 0xdc, \n  0xff, 0xdf, 0xf8, 0xff, 0x48, 0x25, 0xfe, 0x78, 0x90, 0xff, 0x4b, 0x34, 0x01, 0x6a, 0xd6, 0xff, \n  0xb6, 0x18, 0x01, 0x85, 0x34, 0x01, 0x53, 0xc5, 0x1d, 0x87, 0x95, 0x1f, 0xf0, 0xee, 0x01, 0x61, \n  0x42, 0x04, 0xe7, 0x82, 0x08, 0xc0, 0xd3, 0x00, 0x0a, 0x1b, 0x00, 0x5f, 0xb1, 0xf5, 0x98, 0xa5, \n  0xf3, 0x23, 0xd3, 0x04, 0xf8, 0x20, 0x0a, 0xf4, 0x7a, 0xfe, 0xcc, 0x72, 0xfb, 0xeb, 0x08, 0xfd, \n  0x2f, 0x49, 0xfb, 0x42, 0x30, 0x00, 0xdb, 0xea, 0xff, 0xd3, 0xc3, 0xfd, 0xe4, 0x63, 0x02, 0x26, \n  0x9e, 0x01, 0x69, 0xf8, 0xfe, 0xbe, 0x09, 0xff, 0xa5, 0x8d, 0xff, 0x88, 0xb2, 0xff, 0x58, 0xe1, \n  0xff, 0x48, 0xa3, 0xff, 0x99, 0xb5, 0xfd, 0xa6, 0x16, 0xff, 0xc6, 0xf8, 0xff, 0xe5, 0x94, 0xff, \n  0x42, 0xab, 0x00, 0x87, 0xe1, 0xff, 0xa0, 0x76, 0x20, 0x71, 0x1a, 0x23, 0x53, 0x28, 0x02, 0xdd, \n  0x12, 0x04, 0xa8, 0x4a, 0x09, 0xfd, 0xe8, 0xff, 0xf5, 0x66, 0xfe, 0x9f, 0x7a, 0xf3, 0x88, 0x62, \n  0xf3, 0xfe, 0x5c, 0x07, 0xd3, 0x29, 0x0a, 0x85, 0x22, 0xfd, 0xb1, 0x34, 0xfb, 0xcc, 0x66, 0xfc, \n  0x12, 0x4f, 0xfb, 0x0e, 0xad, 0x00, 0x02, 0x63, 0xff, 0x9d, 0xdd, 0xfc, 0x3d, 0x26, 0x02, 0xc2, \n  0x7d, 0x01, 0x8b, 0xbe, 0xfe, 0xf1, 0x49, 0xff, 0x99, 0x68, 0xff, 0xfc, 0x18, 0xff, 0x00, 0x7e, \n  0xff, 0x6a, 0x5c, 0xff, 0x39, 0x46, 0xfd, 0x5e, 0xea, 0xfe, 0x12, 0x32, 0x00, 0x5c, 0xfd, 0xfd, \n  0xca, 0x0e, 0xff, 0x8f, 0xd2, 0x00, 0xdd, 0xc1, 0x21, 0xbf, 0xe2, 0x26, 0xcb, 0x05, 0x04, 0x1e, \n  0x2f, 0x03, 0x03, 0x01, 0x0a, 0xf3, 0x8c, 0xff, 0xd7, 0x72, 0xfc, 0xe0, 0xed, 0xf1, 0x72, 0xbd, \n  0xf2, 0x44, 0xe9, 0x08, 0xa9, 0x5b, 0x0a, 0xa3, 0x40, 0xfc, 0xec, 0x21, 0xfb, 0x83, 0x65, 0xfb, \n  0xb8, 0x3b, 0xfb, 0x02, 0x2f, 0x01, 0xd0, 0x0a, 0xff, 0x69, 0x8f, 0xfc, 0xcf, 0xc5, 0x01, 0x02, \n  0xeb, 0x00, 0x12, 0x4e, 0xfe, 0x0e, 0x6c, 0xff, 0x51, 0x64, 0xff, 0x93, 0xf9, 0xfe, 0xf5, 0x4a, \n  0xff, 0xc4, 0x8e, 0xfe, 0xe1, 0x67, 0xfd, 0xec, 0x98, 0xfe, 0x18, 0x79, 0xfe, 0x13, 0x3b, 0xfe, \n  0xa7, 0xe1, 0xff, 0xb1, 0xbd, 0xff, 0xac, 0x2a, 0x21, 0x1f, 0x69, 0x2a, 0xf1, 0x53, 0x08, 0x37, \n  0x17, 0x02, 0xc8, 0x05, 0x0a, 0xd5, 0x3c, 0x00, 0xab, 0x91, 0xfa, 0xb7, 0x1c, 0xf1, 0xb5, 0xf8, \n  0xf1, 0x3e, 0xae, 0x08, 0x37, 0xc5, 0x0a, 0x85, 0x25, 0xfc, 0x7d, 0x2b, 0xfb, 0x5f, 0x8a, 0xfa, \n  0xbd, 0xb8, 0xfa, 0x40, 0x63, 0x01, 0x3d, 0xfc, 0xfe, 0x25, 0x6f, 0xfc, 0xc6, 0x8a, 0x01, 0xa2, \n  0xbf, 0x00, 0x5b, 0x9f, 0xfd, 0x9c, 0x08, 0xff, 0x87, 0x7f, 0xff, 0x7f, 0xa2, 0xfe, 0x00, 0x90, \n  0xff, 0xf3, 0xb5, 0xfe, 0x9a, 0xe5, 0xfb, 0xc3, 0xa7, 0xfd, 0xd6, 0x41, 0xff, 0x19, 0x22, 0xfe, \n  0x58, 0x2a, 0xff, 0xa2, 0xd8, 0xff, 0x2d, 0xbb, 0x1f, 0x68, 0x63, 0x2c, 0x93, 0x08, 0x0e, 0xe5, \n  0x7d, 0x02, 0x53, 0xb8, 0x08, 0x62, 0x65, 0x01, 0x95, 0x5a, 0xf9, 0x15, 0x52, 0xf0, 0x79, 0x9e, \n  0xf1, 0xcd, 0x05, 0x07, 0x72, 0xb7, 0x0a, 0xf6, 0x8a, 0xfc, 0x5a, 0x35, 0xfb, 0x76, 0x24, 0xfa, \n  0x2c, 0xe0, 0xf9, 0xf7, 0x39, 0x01, 0x3b, 0xf4, 0xfe, 0x61, 0x35, 0xfc, 0x9c, 0x6b, 0x01, 0xc9, \n  0xc6, 0x00, 0xf2, 0x6a, 0xfd, 0x55, 0x53, 0xfe, 0x07, 0xe6, 0xfe, 0xfb, 0x24, 0xff, 0x47, 0x70, \n  0xff, 0xf1, 0x07, 0xfd, 0xbc, 0xfa, 0xfb, 0x78, 0x31, 0xfe, 0xf8, 0x7c, 0xfe, 0x8b, 0xea, 0xfd, \n  0x46, 0xd8, 0xfe, 0xd5, 0x94, 0xff, 0x61, 0x30, 0x1f, 0x22, 0xa4, 0x2c, 0x73, 0x40, 0x12, 0x2e, \n  0xa8, 0x05, 0x5a, 0x76, 0x07, 0xbd, 0x4d, 0x01, 0x1d, 0x6d, 0xf9, 0x9b, 0x6a, 0xef, 0xc3, 0x9c, \n  0xf1, 0xbc, 0xcc, 0x05, 0x94, 0x9e, 0x09, 0x7e, 0xbb, 0xfc, 0xc9, 0x5f, 0xfb, 0x5e, 0xf7, 0xf9, \n  0x08, 0x5b, 0xf9, 0x57, 0xf8, 0x00, 0x11, 0x95, 0xfe, 0xf8, 0xf9, 0xfb, 0x08, 0x68, 0x01, 0x40, \n  0xe3, 0x00, 0xea, 0x76, 0xfd, 0x80, 0x14, 0xfe, 0xf2, 0xf7, 0xfe, 0xfa, 0xb1, 0xfd, 0x3f, 0x90, \n  0xfe, 0xf9, 0x63, 0xfe, 0xea, 0x90, 0xfb, 0x2b, 0x35, 0xfd, 0x85, 0x5c, 0xfe, 0xa4, 0xad, 0xfd, \n  0x93, 0xd1, 0xfe, 0x6a, 0x97, 0xff, 0x4a, 0xad, 0x1f, 0xa4, 0x5c, 0x2c, 0xec, 0xea, 0x13, 0xb2, \n  0xd0, 0x09, 0xfc, 0x3c, 0x08, 0xd2, 0xdf, 0xff, 0xec, 0x7c, 0xf9, 0xad, 0x83, 0xef, 0x6f, 0x7f, \n  0xf1, 0x6b, 0xdd, 0x04, 0x4f, 0x31, 0x08, 0x31, 0xc3, 0xfc, 0x10, 0x66, 0xfb, 0xf1, 0x6a, 0xf9, \n  0xe5, 0x44, 0xf9, 0xc1, 0xe0, 0x00, 0x4f, 0x0d, 0xfe, 0x5a, 0x91, 0xfb, 0xef, 0x7e, 0x01, 0x43, \n  0xa4, 0x00, 0xc8, 0x57, 0xfe, 0x92, 0x98, 0xfe, 0xfe, 0xba, 0xfc, 0x80, 0x77, 0xfd, 0x50, 0x76, \n  0xff, 0x46, 0xad, 0xfd, 0xfd, 0xaa, 0xfb, 0x64, 0xd0, 0xfc, 0xd5, 0x7f, 0xfd, 0x0e, 0xac, 0xfd, \n  0x6c, 0x3e, 0xff, 0xb0, 0x0b, 0x00, 0x9d, 0x54, 0x21, 0x86, 0xba, 0x2b, 0x5b, 0x65, 0x13, 0xf7, \n  0x27, 0x0d, 0x8a, 0xa0, 0x0a, 0x6b, 0x5a, 0xff, 0x54, 0x82, 0xf8, 0x19, 0x8b, 0xf0, 0x01, 0xb4, \n  0xf2, 0x2a, 0x7e, 0x03, 0xf1, 0x47, 0x06, 0x08, 0xbf, 0xfc, 0x38, 0x20, 0xfc, 0x31, 0x2c, 0xf8, \n  0x70, 0xa0, 0xf8, 0x83, 0x54, 0x01, 0x41, 0x34, 0xfd, 0x72, 0x05, 0xfb, 0x9b, 0x72, 0x01, 0x04, \n  0x4d, 0x01, 0x83, 0xf6, 0xfd, 0xc5, 0xcb, 0xfd, 0x3b, 0x17, 0xfe, 0x28, 0x2c, 0xfd, 0xec, 0x60, \n  0xfe, 0xc5, 0xcd, 0xfd, 0xaa, 0xbd, 0xfb, 0xe2, 0x21, 0xfd, 0xcb, 0xea, 0xfc, 0x29, 0x77, 0xfd, \n  0x81, 0x89, 0xff, 0xcf, 0x33, 0xff, 0x4c, 0xe8, 0x24, 0x56, 0xb1, 0x2a, 0x13, 0x28, 0x11, 0x19, \n  0x4b, 0x10, 0x49, 0x40, 0x0c, 0x81, 0xc2, 0xff, 0x0f, 0x68, 0xf7, 0x33, 0x52, 0xf0, 0x48, 0x0c, \n  0xf6, 0xc2, 0x50, 0x02, 0x10, 0x95, 0x02, 0xb5, 0xbc, 0xfc, 0xcb, 0xe1, 0xfd, 0x56, 0x7b, 0xf7, \n  0x69, 0x0b, 0xf7, 0x72, 0xdb, 0x01, 0x78, 0xd4, 0xfb, 0x5d, 0xc3, 0xfa, 0xb9, 0xba, 0x02, 0x84, \n  0x02, 0xff, 0xe3, 0x3b, 0xfe, 0x19, 0x08, 0x00, 0x42, 0x33, 0xfd, 0x90, 0xb5, 0xfc, 0x47, 0xb0, \n  0xfe, 0x96, 0x57, 0xfd, 0x3e, 0x7b, 0xfb, 0x68, 0xc1, 0xfd, 0x6c, 0x3b, 0xfd, 0x07, 0x8a, 0xfc, \n  0x53, 0x89, 0xfe, 0x7e, 0x2e, 0xff, 0x20, 0xa5, 0x29, 0xc0, 0xaa, 0x29, 0xd5, 0x01, 0x0d, 0x2b, \n  0xb9, 0x13, 0xb0, 0x11, 0x0d, 0x9a, 0x7d, 0xff, 0x20, 0x23, 0xf8, 0xb7, 0x4c, 0xef, 0x93, 0x16, \n  0xfa, 0xa3, 0xbf, 0x02, 0x41, 0xc4, 0xfc, 0xb0, 0xd6, 0xfb, 0xe6, 0x75, 0x00, 0xe2, 0xb6, 0xf7, \n  0x7a, 0x83, 0xf5, 0x19, 0x29, 0x01, 0x97, 0x56, 0xfb, 0x2c, 0x02, 0xfa, 0x22, 0x95, 0x01, 0x27, \n  0xc9, 0xfe, 0x98, 0x97, 0xff, 0x6e, 0x18, 0x00, 0xb0, 0x16, 0xfd, 0x16, 0xec, 0xfc, 0x9c, 0x94, \n  0xfe, 0xd5, 0x52, 0xfd, 0x41, 0x45, 0xfb, 0x6a, 0x5d, 0xfe, 0x10, 0xb6, 0xfc, 0x2d, 0x59, 0xfb, \n  0x12, 0x41, 0xff, 0xef, 0xa7, 0xff, 0x5e, 0xc4, 0x2e, 0x1d, 0x9e, 0x29, 0x5e, 0x38, 0x07, 0x2b, \n  0xfd, 0x16, 0xa7, 0xd3, 0x0e, 0x1e, 0x25, 0xfd, 0x94, 0x18, 0xfa, 0xfb, 0x9c, 0xef, 0xdf, 0x76, \n  0xfd, 0x69, 0x2b, 0x05, 0x61, 0x9d, 0xf6, 0xd3, 0x9e, 0xf8, 0x26, 0xb5, 0x03, 0x72, 0x4f, 0xf9, \n  0x64, 0xf9, 0xf3, 0xab, 0x96, 0x01, 0x93, 0x87, 0xf9, 0xc9, 0x25, 0xf7, 0x3e, 0xe5, 0x03, 0x3f, \n  0xcf, 0xfd, 0xe6, 0x68, 0xfe, 0xe0, 0xdb, 0x02, 0xf2, 0xe6, 0xfc, 0x13, 0x6e, 0xfc, 0x7c, 0xe5, \n  0xfe, 0xe2, 0xba, 0xfd, 0x61, 0xa2, 0xfb, 0xc8, 0xae, 0xfd, 0x50, 0x93, 0xfc, 0xe0, 0xa2, 0xfb, \n  0x9a, 0x9e, 0xff, 0xd5, 0x25, 0xff, 0xa1, 0x9e, 0x33, 0x60, 0x02, 0x2b, 0x9a, 0x42, 0x00, 0xcc, \n  0x8f, 0x18, 0x48, 0x65, 0x12, 0xa6, 0x39, 0xf9, 0x51, 0xb9, 0xfa, 0xe7, 0xfb, 0xf1, 0x4f, 0x66, \n  0x00, 0x8a, 0xaf, 0x08, 0xb0, 0x73, 0xf1, 0xe5, 0xc5, 0xf2, 0xda, 0x90, 0x05, 0xe9, 0x65, 0xfc, \n  0xa1, 0x80, 0xf4, 0x44, 0x9c, 0xff, 0xa3, 0x36, 0xf7, 0x80, 0x12, 0xf7, 0xa9, 0xa3, 0x03, 0x4e, \n  0x7f, 0xfc, 0x64, 0x94, 0xfe, 0xac, 0x4a, 0x04, 0xd3, 0x5d, 0xfd, 0x8f, 0xae, 0xfb, 0xa7, 0xde, \n  0xfe, 0x98, 0x59, 0xfe, 0x3c, 0xb2, 0xfb, 0x9f, 0xca, 0xfd, 0x4e, 0x84, 0xfc, 0x44, 0x1f, 0xfb, \n  0xb8, 0xb7, 0xff, 0x29, 0x7e, 0xff, 0x96, 0xb0, 0x39, 0xc7, 0x66, 0x2d, 0x15, 0x82, 0xf8, 0xba, \n  0x4c, 0x17, 0x9c, 0x32, 0x16, 0x29, 0x6f, 0xf6, 0x1c, 0xe9, 0xf9, 0x4b, 0xc6, 0xf4, 0x0b, 0xbe, \n  0x03, 0x3c, 0x96, 0x0c, 0x6e, 0xa2, 0xee, 0xb4, 0xf0, 0xea, 0x7a, 0x23, 0x05, 0xd0, 0x15, 0x02, \n  0xe7, 0xfe, 0xf3, 0xa8, 0x6a, 0xfd, 0xd9, 0x91, 0xf7, 0x6f, 0xa5, 0xf4, 0xce, 0xc3, 0x03, 0xea, \n  0xfa, 0xfc, 0x28, 0xd8, 0xfc, 0x22, 0xcf, 0x05, 0xe2, 0x22, 0xfe, 0x74, 0xf8, 0xfa, 0xc3, 0x03, \n  0xff, 0xd0, 0x4f, 0xfe, 0xa8, 0xa6, 0xfb, 0x21, 0x56, 0xfe, 0xad, 0x24, 0xfd, 0x53, 0x36, 0xfa, \n  0x6f, 0xb6, 0xff, 0xb3, 0x3b, 0x00, 0x64, 0x62, 0x41, 0x77, 0xc7, 0x33, 0x6f, 0x6a, 0xef, 0x75, \n  0xa0, 0x0e, 0x93, 0x35, 0x19, 0x25, 0xbe, 0xf8, 0xb5, 0x20, 0xfb, 0x65, 0xa1, 0xf6, 0xa6, 0xae, \n  0x03, 0x53, 0x7f, 0x10, 0x6b, 0x04, 0xf0, 0xca, 0x5a, 0xe3, 0xc2, 0x16, 0x03, 0xe4, 0xac, 0x06, \n  0x8b, 0x81, 0xf4, 0x54, 0x98, 0xfc, 0x68, 0xba, 0xf6, 0xe9, 0x9c, 0xf3, 0x7a, 0x4e, 0x04, 0xc5, \n  0x23, 0xfd, 0x5d, 0x4d, 0xfc, 0x36, 0x8a, 0x05, 0x70, 0x0e, 0xff, 0x04, 0xa8, 0xfb, 0x83, 0x88, \n  0xfe, 0x93, 0xeb, 0xfd, 0x5d, 0x63, 0xfb, 0x91, 0x16, 0xff, 0x11, 0x36, 0xfe, 0x5e, 0x33, 0xfa, \n  0x6e, 0x34, 0xff, 0x00, 0x4d, 0x00, 0x35, 0x19, 0x49, 0x79, 0x88, 0x3a, 0xf9, 0xc7, 0xe6, 0x4c, \n  0x9a, 0x03, 0xe7, 0xac, 0x1a, 0x77, 0x1a, 0xfd, 0x8d, 0x33, 0xfd, 0x52, 0xa4, 0xf7, 0x8e, 0x47, \n  0x02, 0xee, 0x15, 0x13, 0x6a, 0xcd, 0xf2, 0x31, 0x4f, 0xde, 0xa4, 0xa0, 0xfe, 0xaf, 0xc1, 0x08, \n  0xaf, 0x57, 0xf7, 0x7d, 0xc5, 0xfb, 0x3c, 0xb5, 0xf5, 0xb9, 0x73, 0xf3, 0x51, 0x85, 0x03, 0x3d, \n  0x91, 0xfd, 0x07, 0x25, 0xfc, 0xf0, 0x01, 0x05, 0xf9, 0xce, 0xff, 0x44, 0xa9, 0xfb, 0x8c, 0xc4, \n  0xfd, 0x2e, 0x6b, 0xfd, 0xce, 0xb0, 0xfb, 0x13, 0x6c, 0xff, 0xd7, 0x81, 0xfe, 0x5c, 0x77, 0xfa, \n  0x6f, 0x86, 0xfe, 0x28, 0x69, 0x00, 0xe6, 0x8b, 0x50, 0x72, 0x03, 0x41, 0x3f, 0x34, 0xdf, 0xca, \n  0xf9, 0xf8, 0xc8, 0x4a, 0x1a, 0xe9, 0x36, 0x02, 0x46, 0x93, 0x00, 0x02, 0x17, 0xf8, 0x1b, 0xa0, \n  0x00, 0x91, 0xd7, 0x14, 0x22, 0x88, 0xf6, 0x72, 0x6d, 0xdb, 0xde, 0x60, 0xf9, 0xa1, 0x06, 0x09, \n  0x23, 0x0d, 0xfb, 0xdf, 0x2f, 0xfc, 0x0f, 0x49, 0xf4, 0x37, 0x1c, 0xf4, 0xee, 0xe9, 0x02, 0xbf, \n  0xeb, 0xfc, 0x87, 0xab, 0xfc, 0xb2, 0xee, 0x04, 0xe6, 0xcb, 0xff, 0x36, 0x76, 0xfb, 0x87, 0x96, \n  0xfd, 0x58, 0x28, 0xfd, 0xc2, 0xde, 0xfb, 0xab, 0x71, 0xff, 0x82, 0x0d, 0xfe, 0x6f, 0x17, 0xfb, \n  0x40, 0xad, 0xfe, 0x55, 0x75, 0x00, 0x73, 0xa5, 0x59, 0x35, 0xce, 0x43, 0xc6, 0x4e, 0xd7, 0x1e, \n  0x5b, 0xf2, 0xab, 0xae, 0x17, 0x83, 0x37, 0x06, 0x53, 0x59, 0x04, 0x2a, 0xb2, 0xf6, 0xa0, 0x6f, \n  0xff, 0xe7, 0xa3, 0x17, 0x23, 0xd7, 0xf9, 0xbf, 0xb4, 0xd7, 0xe7, 0xe5, 0xf4, 0x0f, 0x0a, 0x09, \n  0x88, 0x52, 0xfd, 0x21, 0x11, 0xfe, 0x4f, 0x21, 0xf3, 0x69, 0xaf, 0xf4, 0xf8, 0x83, 0x02, 0x51, \n  0x96, 0xfa, 0x4d, 0xd2, 0xfd, 0x1d, 0x6b, 0x05, 0xd6, 0xe3, 0xfe, 0xd8, 0x08, 0xfb, 0xd7, 0xb6, \n  0xfd, 0x86, 0x3c, 0xfd, 0x81, 0xda, 0xfa, 0xd8, 0x31, 0xff, 0x36, 0xf5, 0xfd, 0xf8, 0x8c, 0xfb, \n  0x5b, 0x0d, 0xff, 0xd0, 0xba, 0xff, 0x42, 0x9e, 0x61, 0x0c, 0x77, 0x46, 0x14, 0xa5, 0xd0, 0xb5, \n  0xc8, 0xee, 0x3c, 0x25, 0x15, 0x85, 0x06, 0x08, 0x6e, 0x5a, 0x08, 0x30, 0x42, 0xf4, 0x34, 0xef, \n  0xfe, 0x28, 0xb5, 0x1d, 0x78, 0xba, 0xfc, 0x7d, 0x9c, 0xd2, 0x46, 0x15, 0xf2, 0x51, 0x9c, 0x09, \n  0x08, 0xb9, 0xfd, 0x7f, 0xb9, 0x01, 0x86, 0x4d, 0xf4, 0x6e, 0x9a, 0xf3, 0xd6, 0x9e, 0x01, 0x86, \n  0x24, 0xf9, 0x70, 0x3b, 0xff, 0x08, 0xca, 0x05, 0x9e, 0xbc, 0xfd, 0x40, 0x3d, 0xfb, 0x51, 0x6a, \n  0xfe, 0x58, 0x2d, 0xfd, 0x71, 0x4f, 0xf9, 0x69, 0x41, 0xff, 0x2d, 0x9c, 0xfe, 0x94, 0x63, 0xfb, \n  0x69, 0x2c, 0xff, 0xc4, 0x6b, 0xff, 0x06, 0x80, 0x68, 0x32, 0x35, 0x48, 0x9f, 0x9c, 0xca, 0x90, \n  0xd7, 0xed, 0xdf, 0x8c, 0x12, 0x0c, 0xaa, 0x06, 0x3a, 0xb4, 0x0b, 0xc9, 0x67, 0xf0, 0x64, 0xf1, \n  0xfe, 0x48, 0x07, 0x26, 0x54, 0x9e, 0xfc, 0x18, 0x02, 0xce, 0x85, 0x47, 0xf1, 0xb8, 0xa4, 0x07, \n  0x8b, 0xce, 0xfd, 0x0f, 0x29, 0x06, 0xb5, 0xd1, 0xf5, 0xc4, 0xa5, 0xf1, 0xb2, 0x0b, 0x00, 0x7b, \n  0x05, 0xf9, 0xa3, 0xa1, 0xff, 0x8b, 0xfa, 0x04, 0x9d, 0xdc, 0xfc, 0x3c, 0xd0, 0xfb, 0x67, 0x2d, \n  0xff, 0xb8, 0x83, 0xfc, 0xf1, 0xe3, 0xf7, 0x95, 0xcf, 0xfe, 0x53, 0xf1, 0xfe, 0xab, 0x67, 0xfb, \n  0x1d, 0xd6, 0xfe, 0xca, 0x71, 0xff, 0xb2, 0x5a, 0x6e, 0xd4, 0xab, 0x49, 0x03, 0xd1, 0xc5, 0xcb, \n  0xc5, 0xee, 0xa2, 0x3c, 0x10, 0x23, 0x89, 0x03, 0x73, 0x27, 0x0e, 0x38, 0x25, 0xec, 0x94, 0xea, \n  0xff, 0x3b, 0x4e, 0x2e, 0x36, 0x49, 0xfb, 0x98, 0x34, 0xcc, 0xc5, 0xd5, 0xf0, 0x17, 0x0c, 0x04, \n  0x07, 0x9e, 0xfe, 0x42, 0xf0, 0x09, 0x3e, 0xca, 0xf7, 0x5a, 0xf6, 0xef, 0x50, 0xb6, 0xfe, 0x70, \n  0xfb, 0xf9, 0xb7, 0x55, 0xfe, 0x05, 0xa6, 0x03, 0x6d, 0x1a, 0xfd, 0xb5, 0x98, 0xfc, 0xce, 0xb5, \n  0xff, 0x64, 0xaf, 0xfb, 0x07, 0xd1, 0xf6, 0x3e, 0x27, 0xfe, 0xc4, 0x60, 0xff, 0x59, 0x89, 0xfb, \n  0xc2, 0x7c, 0xfe, 0x81, 0x99, 0xff, 0x13, 0x54, 0x74, 0xc2, 0x47, 0x4a, 0x4e, 0x1b, 0xc2, 0x38, \n  0xf1, 0xf0, 0x8f, 0x60, 0x0d, 0x59, 0xba, 0x00, 0xb3, 0xa2, 0x0f, 0x26, 0xc0, 0xe7, 0xa5, 0xf0, \n  0x01, 0x50, 0x39, 0x34, 0x97, 0xd3, 0xfa, 0x4c, 0x4e, 0xcd, 0xcd, 0x81, 0xef, 0xd4, 0xb2, 0x00, \n  0x40, 0x36, 0xff, 0x69, 0xcb, 0x0c, 0x4a, 0x7e, 0xfa, 0x77, 0xb3, 0xee, 0xfc, 0x34, 0xfe, 0xe5, \n  0x17, 0xfb, 0xa5, 0x0d, 0xfc, 0x6a, 0x02, 0x02, 0xba, 0x4d, 0xfe, 0x33, 0xd2, 0xfd, 0xdf, 0x63, \n  0xff, 0xd8, 0xf6, 0xfa, 0x4b, 0x43, 0xf6, 0x0e, 0xbd, 0xfd, 0x9f, 0xf4, 0xff, 0x3b, 0xa1, 0xfb, \n  0x6c, 0xfe, 0xfd, 0x44, 0xb1, 0xff, 0x1e, 0xf0, 0x77, 0x9a, 0xe3, 0x4c, 0x71, 0xc4, 0xbf, 0xc5, \n  0x6b, 0xf1, 0x93, 0xd6, 0x0a, 0x06, 0x48, 0xfe, 0x33, 0x37, 0x10, 0x46, 0xde, 0xe3, 0x19, 0xb6, \n  0x02, 0x77, 0xdf, 0x36, 0xb0, 0xde, 0xfc, 0xa8, 0x6b, 0xd0, 0xbc, 0xa2, 0xec, 0x05, 0xff, 0xfd, \n  0xb1, 0x9a, 0xfe, 0x30, 0xb5, 0x0e, 0x22, 0xbb, 0xfd, 0x4f, 0x65, 0xed, 0x54, 0x57, 0xfe, 0x9b, \n  0xd0, 0xfb, 0x71, 0x33, 0xf9, 0x52, 0x21, 0x00, 0xc9, 0xcc, 0xff, 0xf4, 0x00, 0xff, 0xcb, 0x31, \n  0xfe, 0x65, 0xb1, 0xfa, 0xff, 0xbf, 0xf5, 0xa8, 0x60, 0xfd, 0xbb, 0xf7, 0x00, 0xfb, 0xdc, 0xfa, \n  0x65, 0x54, 0xfd, 0x38, 0x7d, 0x00, 0xdb, 0x88, 0x7b, 0x67, 0xb3, 0x4e, 0x5b, 0xce, 0xbe, 0x18, \n  0x94, 0xf1, 0x56, 0x74, 0x07, 0xce, 0x76, 0xfd, 0xae, 0xc9, 0x0f, 0xde, 0x25, 0xe0, 0x29, 0x62, \n  0x03, 0xa4, 0xeb, 0x36, 0x7b, 0x4e, 0x00, 0x73, 0xae, 0xd4, 0x0d, 0xbe, 0xe9, 0x19, 0xe6, 0xfb, \n  0x9e, 0x08, 0xfd, 0xe1, 0x67, 0x10, 0x0e, 0xdb, 0x00, 0x7f, 0x66, 0xec, 0xd3, 0xf6, 0xfe, 0xd3, \n  0x20, 0xfc, 0xea, 0x9e, 0xf6, 0xe8, 0x62, 0xfe, 0x23, 0x26, 0x01, 0x67, 0x9b, 0xff, 0x0e, 0x48, \n  0xfd, 0x3e, 0xf0, 0xfa, 0xa6, 0xb6, 0xf4, 0xf5, 0xb2, 0xfd, 0x9e, 0xda, 0x01, 0x0a, 0xa2, 0xf9, \n  0xa5, 0x9d, 0xfd, 0x43, 0x14, 0x01, 0x31, 0x5c, 0x7e, 0x97, 0x01, 0x50, 0x5b, 0x78, 0xbf, 0x7c, \n  0x67, 0xf1, 0x16, 0xfe, 0x03, 0xa2, 0x5c, 0xfd, 0xfe, 0xb5, 0x0e, 0x14, 0x6a, 0xdd, 0x10, 0x8d, \n  0x02, 0xf7, 0x4b, 0x35, 0x86, 0x2e, 0x05, 0x36, 0xf8, 0xd8, 0x97, 0x9c, 0xe7, 0x4b, 0x5e, 0xfa, \n  0x5c, 0xd4, 0xfa, 0x6f, 0xb1, 0x11, 0xeb, 0x77, 0x03, 0x38, 0x25, 0xec, 0x4e, 0x6b, 0xff, 0xee, \n  0xf7, 0xfb, 0x7f, 0xf7, 0xf4, 0xb1, 0xde, 0xfc, 0x24, 0xdb, 0x01, 0x42, 0xc0, 0xff, 0x36, 0xb9, \n  0xfc, 0xc4, 0x9d, 0xfb, 0x60, 0xff, 0xf3, 0xf2, 0x95, 0xfd, 0xa0, 0x3a, 0x02, 0x7e, 0x83, 0xf9, \n  0x7d, 0xea, 0xfd, 0x58, 0x7b, 0x00, 0x90, 0xbb, 0x7e, 0x9a, 0x23, 0x53, 0x6e, 0xf4, 0xc1, 0x6a, \n  0xd8, 0xef, 0x2d, 0xaa, 0x01, 0x68, 0xf9, 0xfb, 0xa6, 0x5a, 0x0e, 0xc0, 0x9f, 0xdc, 0xc4, 0xb7, \n  0xfd, 0x5e, 0xb1, 0x33, 0x1f, 0x98, 0x0b, 0x4d, 0xa3, 0xdc, 0x2d, 0xd6, 0xe6, 0x41, 0xd7, 0xf8, \n  0x91, 0x93, 0xf8, 0xfb, 0x49, 0x12, 0x2a, 0x85, 0x05, 0x5c, 0x19, 0xed, 0xe6, 0x40, 0xff, 0xaa, \n  0x41, 0xfb, 0x35, 0x4e, 0xf4, 0xb0, 0xcc, 0xfb, 0x18, 0xcb, 0x01, 0x27, 0x85, 0xff, 0x13, 0x65, \n  0xfc, 0x84, 0xc8, 0xfc, 0x12, 0xd6, 0xf3, 0x73, 0x65, 0xfc, 0xd4, 0xb5, 0x02, 0x36, 0x1e, 0xfa, \n  0xa1, 0x3f, 0xfd, 0xb8, 0xe2, 0xff, 0x8a, 0x99, 0x7c, 0x4d, 0x39, 0x57, 0x3a, 0xa3, 0xc6, 0x30, \n  0x41, 0xee, 0x5f, 0x29, 0x00, 0x24, 0xae, 0xf8, 0x26, 0x15, 0x0f, 0x6c, 0x8e, 0xdd, 0xbb, 0x01, \n  0xf5, 0xb2, 0xae, 0x32, 0x13, 0xfb, 0x12, 0x8e, 0x90, 0xdf, 0x54, 0xcd, 0xe7, 0xc0, 0x4d, 0xf7, \n  0x3f, 0x33, 0xf6, 0x2a, 0xe2, 0x11, 0x97, 0x37, 0x07, 0xf3, 0x82, 0xef, 0xe2, 0x6d, 0xfe, 0x8d, \n  0x17, 0xfa, 0x18, 0x26, 0xf4, 0x6f, 0x82, 0xfb, 0xb6, 0x7a, 0x01, 0x1e, 0x67, 0xfe, 0x90, 0xdb, \n  0xfc, 0x47, 0xeb, 0xfd, 0x41, 0xac, 0xf3, 0x98, 0xa6, 0xfb, 0x2a, 0x29, 0x02, 0x7d, 0x74, 0xfa, \n  0x0c, 0x08, 0xfd, 0x45, 0x0a, 0xff, 0x20, 0x50, 0x78, 0x87, 0x5d, 0x5b, 0xb7, 0x51, 0xcd, 0x64, \n  0xa9, 0xed, 0x14, 0x1a, 0xff, 0x00, 0x16, 0xf4, 0xfd, 0xb0, 0x10, 0xf7, 0xfb, 0xde, 0x9b, 0xcc, \n  0xe9, 0x55, 0x12, 0x32, 0xcb, 0xe1, 0x1a, 0x25, 0x27, 0xe2, 0x71, 0xc7, 0xe9, 0xe1, 0xd0, 0xf6, \n  0xe9, 0xa0, 0xf3, 0xa9, 0x0e, 0x10, 0xef, 0x45, 0x09, 0x98, 0xb6, 0xf2, 0xfb, 0x45, 0xfd, 0x9f, \n  0x79, 0xf8, 0xbb, 0x5d, 0xf4, 0x90, 0x49, 0xfc, 0xf2, 0x97, 0x00, 0x74, 0x04, 0xfd, 0xe8, 0x97, \n  0xfd, 0x65, 0xcd, 0xfe, 0xaa, 0xd0, 0xf3, 0x2f, 0x84, 0xfa, 0x8e, 0x53, 0x01, 0x76, 0xcc, 0xfa, \n  0x23, 0x86, 0xfc, 0x9b, 0xe8, 0xfe, 0x74, 0x25, 0x72, 0xf6, 0x84, 0x5e, 0x44, 0x41, 0xd6, 0x47, \n  0x80, 0xee, 0xfa, 0x59, 0xfd, 0x35, 0x7a, 0xef, 0x90, 0x66, 0x12, 0x3c, 0x5b, 0xe0, 0x21, 0x2c, \n  0xde, 0x81, 0xf0, 0x2f, 0x51, 0xc5, 0x22, 0x58, 0x33, 0xe5, 0x62, 0x29, 0xec, 0x88, 0x17, 0xf8, \n  0x01, 0x67, 0xf0, 0x9a, 0x90, 0x0c, 0xe2, 0xdc, 0x0b, 0x9e, 0x11, 0xf6, 0x62, 0x90, 0xfb, 0x53, \n  0x77, 0xf7, 0xe8, 0xf5, 0xf4, 0x71, 0x74, 0xfc, 0x94, 0x55, 0x00, 0xca, 0x6e, 0xfb, 0x9a, 0x8d, \n  0xfd, 0xf9, 0xeb, 0xff, 0xd8, 0x2b, 0xf3, 0xcf, 0xe6, 0xf9, 0xe1, 0x72, 0x00, 0x0b, 0x03, 0xfa, \n  0x0a, 0x6f, 0xfd, 0x64, 0xaf, 0xff, 0x81, 0x08, 0x6b, 0x97, 0xed, 0x60, 0x5b, 0xcd, 0xe0, 0xe4, \n  0x39, 0xf0, 0x54, 0xb6, 0xfa, 0x02, 0x3f, 0xec, 0x93, 0xda, 0x13, 0xd1, 0x0f, 0xe2, 0x1e, 0x74, \n  0xd4, 0x4b, 0x11, 0x2a, 0x06, 0x7b, 0x2a, 0xd0, 0x56, 0xea, 0x80, 0x98, 0xed, 0x17, 0x42, 0xfc, \n  0x24, 0xcb, 0xec, 0x4e, 0x88, 0x07, 0xba, 0x73, 0x0f, 0x71, 0x32, 0xf8, 0xaa, 0xf9, 0xfa, 0x42, \n  0x82, 0xf7, 0xc3, 0x13, 0xf5, 0x96, 0x5f, 0xfc, 0xcf, 0x84, 0x00, 0xbe, 0xd7, 0xfa, 0x67, 0x2e, \n  0xfb, 0xa1, 0xfd, 0x00, 0xd8, 0x49, 0xf4, 0x80, 0xd1, 0xf7, 0xc2, 0x01, 0x00, 0x33, 0x9c, 0xfa, \n  0xbc, 0x75, 0xfe, 0x57, 0x7e, 0x00, 0x24, 0x6c, 0x64, 0x8e, 0x05, 0x62, 0xe3, 0xea, 0xe9, 0x34, \n  0x03, 0xf2, 0x77, 0xa2, 0xf9, 0x54, 0x5c, 0xea, 0xcd, 0xb4, 0x11, 0x27, 0x59, 0xe4, 0x11, 0x92, \n  0xcf, 0xc2, 0x7b, 0x1f, 0xd5, 0xb8, 0x2f, 0x58, 0x26, 0xf3, 0x19, 0x1b, 0xed, 0x5f, 0xeb, 0x00, \n  0xae, 0x2e, 0xeb, 0xef, 0x3e, 0x00, 0xd7, 0x1b, 0x13, 0x1c, 0x5b, 0xfa, 0x4f, 0x16, 0xfa, 0xb5, \n  0x16, 0xf9, 0xcc, 0x3f, 0xf4, 0xdb, 0x38, 0xfb, 0x1f, 0x54, 0x01, 0x20, 0xfa, 0xf9, 0x9e, 0x3d, \n  0xf8, 0xb0, 0x78, 0x01, 0xde, 0xe5, 0xf4, 0x08, 0xd2, 0xf6, 0xfb, 0x01, 0x01, 0xdf, 0x92, 0xfa, \n  0xec, 0xe5, 0xfe, 0x68, 0x5d, 0x02, 0xe6, 0xa3, 0x5f, 0x60, 0xa2, 0x61, 0xe8, 0xf8, 0xee, 0x25, \n  0x79, 0xf3, 0x88, 0x9e, 0xfc, 0x54, 0xc0, 0xe9, 0x49, 0x1e, 0x0a, 0xc2, 0x8a, 0xe6, 0x1f, 0x15, \n  0xd0, 0x81, 0xf6, 0x12, 0x17, 0x7e, 0x31, 0x1d, 0x84, 0xfd, 0x63, 0x59, 0xec, 0x2d, 0x09, 0x04, \n  0x2e, 0xac, 0xeb, 0x1e, 0xff, 0xf8, 0xe2, 0xf5, 0x14, 0x8b, 0xa3, 0xfd, 0x8e, 0x20, 0xf9, 0xdc, \n  0xa9, 0xfa, 0xce, 0x20, 0xf4, 0x14, 0xb0, 0xf7, 0xfc, 0xf4, 0x00, 0xd8, 0x68, 0xfb, 0x81, 0xb3, \n  0xf4, 0xd2, 0x88, 0xff, 0x67, 0x3c, 0xf7, 0x41, 0x1f, 0xf7, 0xba, 0x83, 0x01, 0x16, 0xe0, 0xfa, \n  0x35, 0x23, 0xff, 0x13, 0xd0, 0x03, 0x30, 0x02, 0x5e, 0x2b, 0xa0, 0x5d, 0x79, 0x99, 0xf0, 0x98, \n  0xe3, 0xf7, 0xd2, 0xa4, 0x00, 0xce, 0x8d, 0xea, 0xe6, 0xfe, 0x00, 0xbb, 0x4c, 0xe7, 0xd4, 0xc1, \n  0xd3, 0x2f, 0x4c, 0x08, 0x14, 0x3a, 0x32, 0x56, 0xb7, 0x04, 0x80, 0xdf, 0xec, 0x20, 0x9d, 0x07, \n  0xd9, 0xb8, 0xea, 0xb0, 0xdd, 0xf4, 0x84, 0xe9, 0x15, 0x84, 0x0d, 0x00, 0x3e, 0x4a, 0xfa, 0x2b, \n  0x8b, 0xfb, 0xed, 0x10, 0xf3, 0xea, 0x94, 0xf4, 0x4b, 0xfd, 0x00, 0xd7, 0x09, 0xfb, 0x2c, 0x2b, \n  0xf2, 0xc2, 0x0d, 0x00, 0xe0, 0x4c, 0xf8, 0x24, 0xba, 0xf7, 0x9d, 0xcd, 0x02, 0x2a, 0xc6, 0xfa, \n  0x33, 0x4b, 0xff, 0x80, 0x92, 0x04, 0x9d, 0xe8, 0x5c, 0x79, 0x1d, 0x59, 0x60, 0x48, 0xf0, 0x13, \n  0xd9, 0xfc, 0x0f, 0xae, 0x05, 0xd8, 0x69, 0xea, 0x86, 0x19, 0xf8, 0x02, 0x95, 0xe9, 0x00, 0xa9, \n  0xd8, 0xd4, 0xf9, 0xfc, 0x8c, 0xdb, 0x32, 0xc4, 0xd3, 0x0b, 0xad, 0xe5, 0xe9, 0xc8, 0x2c, 0x0c, \n  0x5b, 0xae, 0xec, 0xfb, 0x59, 0xef, 0xc3, 0x91, 0x17, 0x32, 0x35, 0x03, 0x41, 0x46, 0xfa, 0x9f, \n  0x8b, 0xfb, 0xe8, 0x9d, 0xf3, 0xc8, 0xff, 0xf2, 0x02, 0xfc, 0xfd, 0xfc, 0xba, 0xfa, 0xe4, 0x6e, \n  0xf1, 0x1c, 0xae, 0x00, 0xee, 0xb9, 0xfa, 0xea, 0xd4, 0xf6, 0xc9, 0xd4, 0x02, 0x11, 0xfa, 0xfb, \n  0xbf, 0x84, 0xff, 0x7a, 0x86, 0x04, 0xc4, 0xb2, 0x5d, 0x09, 0x81, 0x54, 0x39, 0x0c, 0xed, 0x87, \n  0x56, 0x00, 0x3a, 0x2e, 0x0a, 0x53, 0xf7, 0xe9, 0x57, 0x9f, 0xf1, 0xea, 0xfb, 0xec, 0x7c, 0x6c, \n  0xe0, 0x74, 0x1b, 0xf3, 0x47, 0x1a, 0x2e, 0xcc, 0xaa, 0x14, 0x46, 0x63, 0xe5, 0x83, 0x03, 0x0c, \n  0xab, 0x58, 0xf5, 0x19, 0x0e, 0xe9, 0x2d, 0x31, 0x17, 0x49, 0x20, 0x09, 0xc0, 0x93, 0xf6, 0x24, \n  0x52, 0xfc, 0x83, 0x69, 0xf6, 0x30, 0xba, 0xf0, 0xe7, 0x4a, 0xfb, 0xdf, 0x9a, 0xfa, 0x71, 0x03, \n  0xf1, 0xef, 0xb5, 0x00, 0x5f, 0x54, 0xfe, 0x14, 0x67, 0xf5, 0xb9, 0x2d, 0x01, 0xdc, 0x9f, 0xfe, \n  0xbe, 0x7f, 0xfe, 0x8e, 0xff, 0x03, 0xfb, 0x36, 0x5c, 0x4a, 0x0b, 0x51, 0xff, 0xd5, 0xea, 0xf7, \n  0xbd, 0x03, 0xb5, 0x67, 0x0e, 0x65, 0xfa, 0xe8, 0x79, 0x1d, 0xee, 0x53, 0xd1, 0xee, 0x18, 0x2a, \n  0xe6, 0x29, 0xdb, 0xec, 0x15, 0xba, 0x26, 0xd2, 0xfb, 0x1d, 0x88, 0x1a, 0xe5, 0x74, 0x41, 0x05, \n  0xa3, 0x59, 0xfe, 0x87, 0xd7, 0xe7, 0xf4, 0x75, 0x11, 0xcc, 0xae, 0x10, 0x60, 0x68, 0xf6, 0x06, \n  0x5b, 0xf9, 0x54, 0xbb, 0xf9, 0x0d, 0x89, 0xf0, 0x2e, 0x89, 0xf9, 0x09, 0x83, 0xfa, 0x2c, 0x0f, \n  0xf0, 0x52, 0xe5, 0xff, 0x75, 0x7d, 0x00, 0xa4, 0xa7, 0xf5, 0x84, 0x4f, 0xff, 0x9b, 0x59, 0xff, \n  0x3d, 0x62, 0xfe, 0x63, 0x7d, 0x03, 0x19, 0x8b, 0x5a, 0x0d, 0x98, 0x4b, 0x58, 0xda, 0xe8, 0x79, \n  0x50, 0x09, 0xc8, 0x36, 0x10, 0xb2, 0xdb, 0xe6, 0x98, 0x79, 0xef, 0x9d, 0x95, 0xf0, 0x08, 0xc3, \n  0xe7, 0x14, 0x34, 0xe9, 0x62, 0xae, 0x21, 0xb7, 0xd4, 0x22, 0xdd, 0x5e, 0xe6, 0xf4, 0x17, 0x00, \n  0xaa, 0xcc, 0x00, 0x73, 0x6a, 0xea, 0xd6, 0x12, 0x0f, 0xf0, 0xbe, 0x12, 0x5b, 0xa0, 0xf8, 0x17, \n  0x5c, 0xf7, 0x0d, 0x81, 0xfb, 0xba, 0x02, 0xf2, 0xad, 0x0d, 0xf8, 0xd6, 0x51, 0xfc, 0x33, 0x12, \n  0xef, 0x1f, 0xde, 0xfb, 0xc9, 0x18, 0x01, 0x60, 0x42, 0xf7, 0x2a, 0x09, 0xff, 0xc9, 0x1f, 0xff, \n  0xf7, 0xd2, 0xfd, 0x49, 0x08, 0x03, 0x41, 0xd4, 0x58, 0x2e, 0x4f, 0x47, 0x77, 0x82, 0xe6, 0x19, \n  0x6a, 0x0d, 0x8f, 0xf0, 0x10, 0x3a, 0x7d, 0xe2, 0x63, 0x6f, 0xf2, 0x2c, 0xc5, 0xf6, 0xd5, 0x84, \n  0xe9, 0x57, 0x53, 0xe3, 0xb8, 0xf3, 0x1b, 0x7d, 0xd7, 0x28, 0x85, 0xc8, 0xe5, 0x97, 0xc0, 0xf9, \n  0x69, 0x31, 0x07, 0xe9, 0xe3, 0xeb, 0xd7, 0x6b, 0x09, 0x08, 0x9f, 0x15, 0x42, 0xe3, 0xfb, 0xac, \n  0x81, 0xf6, 0x77, 0x58, 0xfc, 0xaa, 0x0e, 0xf3, 0xce, 0xc2, 0xf7, 0x1b, 0xeb, 0xfe, 0x9a, 0xa0, \n  0xef, 0x0e, 0x90, 0xf5, 0xd2, 0x14, 0xff, 0x13, 0xbb, 0xf9, 0xac, 0x7e, 0xff, 0x25, 0xbc, 0x00, \n  0x54, 0xfe, 0xfc, 0x6a, 0xe1, 0xff, 0xb8, 0xb1, 0x55, 0x0b, 0x7a, 0x45, 0x47, 0xd6, 0xe1, 0x81, \n  0xf7, 0x0e, 0xdb, 0xd2, 0x17, 0x8b, 0x26, 0xde, 0xd6, 0xf9, 0xf1, 0x8a, 0x4c, 0xfd, 0x83, 0x17, \n  0xed, 0x1c, 0x97, 0xdf, 0x5e, 0xef, 0x11, 0x78, 0xb7, 0x2d, 0xa8, 0xc9, 0xea, 0xfc, 0x7e, 0xf1, \n  0x43, 0xfa, 0x0b, 0xc3, 0x82, 0xf0, 0x81, 0x1e, 0x00, 0xd4, 0x34, 0x17, 0x1c, 0xeb, 0x02, 0xf5, \n  0x81, 0xf4, 0x86, 0xa1, 0xfd, 0xff, 0x01, 0xf5, 0xa7, 0x8e, 0xf5, 0x22, 0x80, 0x02, 0xd5, 0x8c, \n  0xf1, 0x36, 0x4c, 0xef, 0x33, 0xa2, 0xfc, 0x0e, 0x54, 0xfb, 0x86, 0xec, 0xfe, 0x68, 0xc4, 0x02, \n  0xa1, 0x85, 0xfe, 0x41, 0x12, 0xfc, 0xed, 0x78, 0x53, 0xd0, 0xef, 0x40, 0x09, 0x3d, 0xdf, 0x99, \n  0xeb, 0x10, 0xc0, 0x2d, 0x1c, 0x71, 0xed, 0xdf, 0x24, 0x6b, 0xef, 0x18, 0xc7, 0xfe, 0xfb, 0xa5, \n  0xf5, 0x0b, 0x20, 0xdd, 0xa5, 0x7f, 0x06, 0x1f, 0x70, 0x31, 0xdd, 0xd1, 0xf0, 0xd8, 0x5a, 0xec, \n  0xec, 0xe5, 0x0d, 0x30, 0x59, 0xf5, 0x21, 0x8f, 0xfa, 0x3d, 0x0f, 0x14, 0x55, 0x8b, 0x08, 0xf1, \n  0x73, 0xf7, 0xf9, 0x63, 0xfd, 0xb9, 0xf5, 0xf6, 0x49, 0x96, 0xf5, 0x04, 0x3f, 0x02, 0x08, 0x5a, \n  0xf3, 0xfd, 0x49, 0xee, 0xff, 0xe9, 0xfa, 0x68, 0x42, 0xfa, 0x14, 0x97, 0xfd, 0x3c, 0x4c, 0x04, \n  0xb4, 0x7d, 0x00, 0x04, 0xa2, 0xfb, 0xb2, 0xa4, 0x4f, 0x20, 0x46, 0x3b, 0x3e, 0x86, 0xde, 0x62, \n  0x8f, 0x14, 0xf2, 0xcd, 0x1d, 0x2f, 0x13, 0xe0, 0x0f, 0x6e, 0xf1, 0x42, 0xb0, 0xff, 0x62, 0xf1, \n  0xf6, 0x08, 0xb2, 0xde, 0x8f, 0x68, 0x01, 0x67, 0x3d, 0x2e, 0x8b, 0x5a, 0xf4, 0xa4, 0x64, 0xec, \n  0x9a, 0x36, 0x0f, 0xca, 0x18, 0xf8, 0xd8, 0x7f, 0xf6, 0xfc, 0xed, 0x10, 0x95, 0x50, 0x0a, 0x59, \n  0x67, 0xfa, 0x03, 0x06, 0xff, 0xc0, 0xef, 0xf7, 0xe7, 0x9d, 0xf6, 0xbc, 0x4c, 0x00, 0xad, 0x7d, \n  0xf3, 0xf3, 0x78, 0xf0, 0xef, 0x9a, 0xfa, 0x02, 0x56, 0xf9, 0x8e, 0x23, 0xfb, 0x3a, 0x55, 0x03, \n  0xee, 0xd7, 0x01, 0xe8, 0x10, 0xfd, 0x9f, 0x62, 0x4a, 0x5a, 0xa1, 0x34, 0xf9, 0x06, 0xe1, 0x32, \n  0x6f, 0x18, 0x42, 0x26, 0x1c, 0x14, 0x7e, 0xe1, 0x5a, 0xce, 0xf4, 0x22, 0x51, 0xff, 0x70, 0xca, \n  0xf6, 0x32, 0x36, 0xe1, 0x3b, 0x13, 0xff, 0x6f, 0x60, 0x29, 0xd3, 0x40, 0xf6, 0x56, 0xb2, 0xed, \n  0xfc, 0x05, 0x10, 0xd2, 0x96, 0xfb, 0xb3, 0xe0, 0xf2, 0x7b, 0x53, 0x0d, 0xae, 0xbb, 0x0c, 0x6e, \n  0xc5, 0xf9, 0x90, 0xcb, 0xff, 0xe2, 0xef, 0xfb, 0x12, 0xe3, 0xf5, 0x05, 0x18, 0xff, 0x2b, 0x61, \n  0xf4, 0xfb, 0x83, 0xf0, 0xe0, 0x75, 0xfc, 0x4d, 0x9b, 0xfa, 0xa4, 0x9d, 0xf8, 0xd2, 0xa2, 0x00, \n  0xc4, 0xcc, 0x01, 0x77, 0x86, 0xfe, 0xf5, 0x73, 0x43, 0x25, 0xe7, 0x2e, 0xd0, 0xeb, 0xe5, 0xac, \n  0x89, 0x1a, 0x50, 0x22, 0x1a, 0x05, 0x3e, 0xe4, 0x83, 0x13, 0xf7, 0xcb, 0x50, 0xff, 0x87, 0xdb, \n  0xf7, 0x78, 0x90, 0xe3, 0x8d, 0x6d, 0xfc, 0x7c, 0xd6, 0x24, 0x44, 0x49, 0xf9, 0x77, 0x87, 0xee, \n  0xe0, 0xc9, 0x0e, 0x7b, 0xe1, 0xff, 0x2f, 0xfc, 0xf1, 0xd7, 0xc2, 0x08, 0xb7, 0xbd, 0x0d, 0x74, \n  0x85, 0xfa, 0xd5, 0x39, 0xfe, 0x23, 0x48, 0xfe, 0x2b, 0x47, 0xf8, 0x39, 0x7f, 0xfd, 0x8b, 0x3a, \n  0xf5, 0x86, 0x34, 0xf2, 0x47, 0xa9, 0xfc, 0x01, 0xa3, 0xfc, 0x6a, 0x39, 0xf8, 0xd3, 0xe2, 0xfd, \n  0x04, 0x18, 0x01, 0xe0, 0xb0, 0xfe, 0xe7, 0xf1, 0x41, 0x6b, 0xa8, 0x26, 0xfb, 0x66, 0xe0, 0x06, \n  0xb2, 0x20, 0x07, 0x6a, 0x24, 0xad, 0xe5, 0xe1, 0x31, 0x48, 0xed, 0x7d, 0x0d, 0x02, 0xb7, 0xa4, \n  0xfc, 0x8a, 0x58, 0xe9, 0xc3, 0xdc, 0x01, 0xe3, 0xae, 0x18, 0x95, 0xd6, 0xf1, 0x42, 0xbd, 0xf4, \n  0xc6, 0x8e, 0x0d, 0x03, 0xff, 0xfd, 0xf9, 0xc8, 0xf7, 0x32, 0x92, 0x07, 0x7c, 0x89, 0x05, 0x57, \n  0xc9, 0xfb, 0x98, 0xd1, 0x02, 0xc7, 0x09, 0x00, 0x95, 0xaf, 0xfe, 0x8c, 0xab, 0x04, 0x72, 0x54, \n  0xfb, 0xcb, 0x70, 0xf9, 0x0c, 0xb7, 0x00, 0x65, 0xae, 0xfc, 0x0a, 0x42, 0xf9, 0xd5, 0x09, 0xfe, \n  0x21, 0x2c, 0xfc, 0x17, 0xbc, 0xf8, 0xbc, 0x8f, 0x38, 0xd6, 0x74, 0x23, 0x04, 0x3e, 0xe8, 0x21, \n  0x26, 0x1d, 0x50, 0xb9, 0x1f, 0x01, 0x3b, 0xe8, 0xff, 0xb4, 0xf1, 0x46, 0xd3, 0x00, 0xc4, 0x5b, \n  0xfc, 0x2e, 0x06, 0xed, 0x58, 0x2c, 0x00, 0x03, 0xea, 0x14, 0x43, 0x24, 0xf5, 0xe3, 0x5b, 0xf5, \n  0x24, 0x39, 0x0b, 0x78, 0xe4, 0xfe, 0xba, 0xda, 0xf7, 0x1b, 0xe8, 0x05, 0xf4, 0xb5, 0x05, 0x17, \n  0x9c, 0xfc, 0xb2, 0xab, 0x01, 0x7a, 0xfc, 0xff, 0xa6, 0x68, 0xff, 0x52, 0xcb, 0x03, 0x3f, 0x28, \n  0xfb, 0x9e, 0x14, 0xfa, 0x79, 0xb5, 0x00, 0x82, 0xa2, 0xfc, 0xd3, 0x2e, 0xfa, 0xf9, 0xfd, 0xfe, \n  0xa5, 0x4d, 0xfd, 0xdc, 0x8c, 0xfa, 0x72, 0xfb, 0x2f, 0xb1, 0x49, 0x21, 0x0a, 0xad, 0xef, 0x92, \n  0x72, 0x18, 0xbe, 0x06, 0x1c, 0x37, 0xbb, 0xef, 0x30, 0x7a, 0xf4, 0x95, 0x4f, 0xff, 0x3d, 0x3a, \n  0xfd, 0xc1, 0xf9, 0xef, 0x47, 0xaf, 0xfe, 0xbf, 0x18, 0x12, 0x48, 0x5b, 0xf8, 0x7e, 0xde, 0xf5, \n  0x89, 0xbf, 0x08, 0x83, 0x81, 0x00, 0xf6, 0xf6, 0xf8, 0x51, 0x17, 0x04, 0x09, 0xaf, 0x05, 0xa1, \n  0xf6, 0xfd, 0xa6, 0x1b, 0x01, 0x0b, 0xd1, 0xff, 0xdd, 0x78, 0xff, 0xe7, 0x37, 0x03, 0xc5, 0x39, \n  0xfc, 0x29, 0x5d, 0xfa, 0xec, 0xdd, 0xff, 0x44, 0x71, 0xfd, 0x6b, 0x0e, 0xfb, 0xbc, 0xa7, 0xff, \n  0xfb, 0xdf, 0xfe, 0x26, 0x9c, 0xfb, 0xc9, 0x50, 0x28, 0x73, 0x11, 0x1f, 0x62, 0x62, 0xf5, 0xdb, \n  0xcb, 0x13, 0xb4, 0x8b, 0x19, 0xc0, 0x24, 0xf6, 0x21, 0x0a, 0xf6, 0x2c, 0xb7, 0xfe, 0xb9, 0x62, \n  0xfe, 0xc0, 0x29, 0xf2, 0x3d, 0x73, 0xfd, 0xc7, 0x70, 0x0f, 0x19, 0xca, 0xfa, 0x62, 0x41, 0xf6, \n  0x34, 0x5f, 0x06, 0xfd, 0x79, 0x01, 0x8f, 0x39, 0xfa, 0x9a, 0xfc, 0x02, 0x4d, 0xf0, 0x04, 0x65, \n  0x8b, 0xfe, 0x97, 0x3b, 0x01, 0x28, 0xa8, 0xff, 0x8f, 0xf8, 0xfe, 0xd5, 0xaf, 0x02, 0x3a, 0xe5, \n  0xfc, 0xfd, 0xd4, 0xfa, 0x3d, 0x67, 0xff, 0x35, 0x51, 0xfe, 0xb4, 0x7d, 0xfc, 0xcb, 0x27, 0xff, \n  0xa6, 0x0a, 0xff, 0x30, 0x06, 0xfd, 0x0d, 0xdb, 0x21, 0xf3, 0xd3, 0x1c, 0xac, 0xa7, 0xf9, 0x0d, \n  0x61, 0x10, 0x52, 0xd2, 0x17, 0x6c, 0xd1, 0xfa, 0x3c, 0xc0, 0xf7, 0x3a, 0x6e, 0xff, 0x48, 0x76, \n  0xff, 0x87, 0xc9, 0xf3, 0xac, 0xc3, 0xfc, 0x8a, 0x63, 0x0d, 0x59, 0x7a, 0xfc, 0xa0, 0xb5, 0xf6, \n  0xd3, 0xd3, 0x04, 0x9b, 0x53, 0x02, 0xca, 0xb1, 0xfb, 0x2c, 0x0f, 0x02, 0xd5, 0x12, 0x04, 0x7c, \n  0xca, 0xff, 0x4f, 0x37, 0x01, 0xde, 0x44, 0xff, 0x8e, 0x36, 0xff, 0x25, 0x22, 0x02, 0x41, 0x66, \n  0xfd, 0x3e, 0xf4, 0xfb, 0x07, 0x2b, 0x00, 0x78, 0x0e, 0xff, 0x46, 0xc4, 0xfc, 0x2a, 0x20, 0xff, \n  0x33, 0x40, 0xff, 0x69, 0xd0, 0xfd, 0x5b, 0x43, 0x1c, 0x87, 0x6f, 0x1a, 0x3f, 0xa3, 0xfc, 0x2a, \n  0xe6, 0x0d, 0x6e, 0xa4, 0x16, 0x5b, 0x1a, 0xfe, 0x21, 0x53, 0xf9, 0x05, 0x5d, 0x00, 0x21, 0x39, \n  0x00, 0x02, 0x16, 0xf5, 0xc9, 0x38, 0xfc, 0x52, 0x83, 0x0b, 0xd4, 0x84, 0xfd, 0x79, 0x52, 0xf7, \n  0xe4, 0xb9, 0x03, 0x7a, 0xf8, 0x02, 0x92, 0xad, 0xfc, 0xee, 0x1f, 0x01, 0x33, 0x2e, 0x04, 0xb2, \n  0x63, 0x00, 0x03, 0x42, 0x00, 0x30, 0x6e, 0xff, 0xb3, 0x9d, 0xff, 0xc8, 0xf2, 0x01, 0x31, 0x47, \n  0xfe, 0x75, 0xe2, 0xfc, 0xbc, 0x59, 0x00, 0x07, 0x65, 0xff, 0xa3, 0x43, 0xfd, 0x64, 0xe6, 0xfe, \n  0x85, 0x15, 0xff, 0xd9, 0xf1, 0xfd, 0xb0, 0x0a, 0x18, 0xb1, 0x30, 0x17, 0x24, 0x91, 0xfe, 0xf8, \n  0x16, 0x0d, 0x61, 0x42, 0x15, 0xbb, 0x2c, 0x00, 0x8a, 0xec, 0xfa, 0x9f, 0x6f, 0x01, 0x27, 0x84, \n  0x00, 0xfd, 0xd4, 0xf5, 0xe3, 0x39, 0xfc, 0x7a, 0xbc, 0x09, 0x3f, 0x49, 0xfe, 0xb1, 0x03, 0xf8, \n  0x9c, 0xcd, 0x02, 0x7a, 0x82, 0x03, 0xb2, 0x51, 0xfd, 0x3e, 0x01, 0x01, 0xb4, 0xe4, 0x03, 0x93, \n  0xe5, 0xff, 0xf6, 0x1d, 0x00, 0x1b, 0x36, 0x00, 0xcf, 0x4f, 0x00, 0x62, 0xb5, 0x01, 0x9f, 0x69, \n  0xfe, 0x4c, 0xb6, 0xfd, 0x43, 0xbc, 0x00, 0xd0, 0x53, 0xff, 0xfe, 0x1f, 0xfd, 0xff, 0x8b, 0xfe, \n  0xf8, 0xd6, 0xfe, 0x74, 0x3a, 0xfe, 0x12, 0xea, 0x14, 0xcf, 0xef, 0x14, 0x08, 0x85, 0x00, 0xa2, \n  0x18, 0x0c, 0x42, 0x9b, 0x12, 0x59, 0x35, 0x01, 0xc4, 0x13, 0xfd, 0x79, 0x61, 0x02, 0x33, 0x81, \n  0x00, 0x78, 0xed, 0xf6, 0x94, 0x54, 0xfc, 0xe3, 0xfb, 0x07, 0x0a, 0x68, 0xfe, 0x7f, 0xf4, 0xf8, \n  0x31, 0x44, 0x03, 0x29, 0xb4, 0x03, 0xc2, 0x8a, 0xfd, 0x66, 0x27, 0x01, 0xf6, 0xf8, 0x02, 0x59, \n  0xfe, 0xff, 0xa7, 0x89, 0x01, 0x50, 0xb7, 0x00, 0x03, 0xfb, 0xff, 0x91, 0x9c, 0x01, 0x45, 0x2a, \n  0xff, 0x44, 0x13, 0xfe, 0x54, 0xe6, 0xff, 0x47, 0x01, 0xff, 0x2d, 0x61, 0xfd, 0x33, 0x84, 0xfe, \n  0x9a, 0x49, 0xff, 0xd5, 0xf3, 0xfe, 0x55, 0xa8, 0x11, 0x9f, 0xf4, 0x12, 0x46, 0xee, 0x01, 0x99, \n  0xe6, 0x0a, 0x88, 0x32, 0x11, 0xc8, 0x15, 0x03, 0x5d, 0x85, 0xfe, 0xf6, 0xb8, 0x01, 0x1e, 0xae, \n  0x00, 0xb0, 0xbe, 0xf8, 0x88, 0xa1, 0xfb, 0xf9, 0x08, 0x06, 0x0e, 0xae, 0xff, 0xc7, 0xbf, 0xfa, \n  0xb9, 0x48, 0x02, 0x4c, 0xe6, 0x02, 0x09, 0xd9, 0xfe, 0xa4, 0x71, 0x01, 0xd3, 0xdc, 0x02, 0x46, \n  0x1b, 0x01, 0x37, 0x95, 0x01, 0x82, 0x50, 0x00, 0x49, 0x1e, 0x00, 0xc4, 0x7d, 0x01, 0x00, 0x2a, \n  0xff, 0x09, 0xd7, 0xfd, 0x4f, 0x40, 0xff, 0x54, 0xfa, 0xfe, 0x04, 0xf8, 0xfd, 0xfd, 0x11, 0xff, \n  0x44, 0xab, 0xff, 0x8d, 0x98, 0xfe, 0x4a, 0x9d, 0x0e, 0x1c, 0xcb, 0x10, 0x01, 0xb8, 0x03, 0xab, \n  0x14, 0x0a, 0xf4, 0x74, 0x0f, 0x1b, 0x2d, 0x05, 0xdd, 0xd7, 0xff, 0x36, 0xb0, 0x00, 0x8f, 0xa0, \n  0x00, 0xd0, 0x91, 0xfa, 0xc8, 0xe7, 0xfb, 0xe3, 0x87, 0x04, 0x2f, 0x62, 0x00, 0xf7, 0xd5, 0xfb, \n  0xe4, 0x8d, 0x01, 0x9e, 0x70, 0x03, 0x75, 0x15, 0x01, 0x75, 0xef, 0x01, 0xdc, 0xfc, 0x01, 0x81, \n  0x43, 0x01, 0x07, 0xb2, 0x01, 0x19, 0x3b, 0x00, 0x8b, 0x20, 0x00, 0xc8, 0xf6, 0x00, 0xa8, 0xd0, \n  0xfe, 0x1f, 0xc1, 0xfd, 0xb9, 0xb2, 0xff, 0x1b, 0xd4, 0xff, 0x61, 0x52, 0xfe, 0xdd, 0xc0, 0xfe, \n  0x47, 0x98, 0xfe, 0x4a, 0xdb, 0xfd, 0x47, 0xad, 0x0c, 0x0d, 0x90, 0x0f, 0x3a, 0x1e, 0x05, 0xfa, \n  0xde, 0x08, 0x22, 0xff, 0x0d, 0x67, 0x82, 0x06, 0x5e, 0xb3, 0xff, 0x92, 0xda, 0xff, 0x7e, 0x8e, \n  0x01, 0x2d, 0x81, 0xfc, 0xfc, 0xa0, 0xfb, 0x78, 0xa8, 0x02, 0x67, 0x6a, 0x01, 0x3b, 0xdd, 0xfd, \n  0x17, 0x8b, 0x02, 0x87, 0xca, 0x04, 0xa4, 0x77, 0x01, 0x95, 0xe9, 0x00, 0x35, 0xe6, 0x01, 0xcc, \n  0x8b, 0x01, 0xb0, 0x1f, 0x01, 0x17, 0x0e, 0x00, 0x5e, 0xbd, 0xff, 0xca, 0x75, 0x00, 0x4c, 0xa2, \n  0xff, 0x3e, 0xf2, 0xfe, 0x9a, 0xa8, 0xff, 0x2b, 0xbe, 0xfe, 0x66, 0x83, 0xfd, 0xd6, 0x3e, 0xfe, \n  0x27, 0xbc, 0xfe, 0xac, 0xa1, 0xfe, 0x29, 0x0a, 0x0a, 0x41, 0x23, 0x0e, 0x13, 0xd4, 0x06, 0x3a, \n  0xc2, 0x07, 0xab, 0x6f, 0x0c, 0xac, 0x8d, 0x07, 0xc7, 0x8f, 0x00, 0xb1, 0x6a, 0x00, 0x71, 0x32, \n  0x01, 0x44, 0x59, 0xfc, 0x89, 0x49, 0xfc, 0x48, 0x0f, 0x03, 0x65, 0x86, 0x03, 0x8d, 0x0f, 0x00, \n  0x69, 0x44, 0x02, 0x36, 0x1b, 0x04, 0x8e, 0x4c, 0x01, 0x6c, 0xcd, 0x00, 0xd7, 0xf1, 0x01, 0x7a, \n  0x15, 0x01, 0x9b, 0x4c, 0x00, 0x6d, 0x13, 0x00, 0x16, 0x88, 0x00, 0x1b, 0x08, 0x01, 0xe0, 0xc1, \n  0xff, 0xb0, 0x37, 0xfe, 0x8e, 0x11, 0xfe, 0xcd, 0x25, 0xfe, 0x35, 0x29, 0xfe, 0x6f, 0xb0, 0xfe, \n  0xbb, 0xfe, 0xfe, 0xe2, 0xe3, 0xfe, 0x75, 0xb5, 0x08, 0x8b, 0xc3, 0x0d, 0x01, 0x05, 0x07, 0x02, \n  0x47, 0x06, 0xc5, 0x11, 0x0c, 0xfa, 0x49, 0x08, 0x26, 0x04, 0x00, 0xb5, 0x9a, 0xff, 0x73, 0x76, \n  0x01, 0xd3, 0x56, 0xfe, 0x55, 0xdc, 0xfe, 0x3c, 0x1d, 0x04, 0x00, 0x72, 0x03, 0x1e, 0x6d, 0x00, \n  0x86, 0x90, 0x02, 0x51, 0x91, 0x03, 0x4e, 0xee, 0x00, 0x2f, 0x4f, 0x00, 0x6e, 0x03, 0x01, 0x3d, \n  0x4b, 0x01, 0x11, 0x67, 0x01, 0x34, 0xa1, 0x00, 0xeb, 0x29, 0x00, 0x74, 0xa2, 0xff, 0x69, 0x3c, \n  0xfe, 0x02, 0xc6, 0xfd, 0x10, 0x8b, 0xfe, 0xbd, 0xd4, 0xfe, 0xae, 0x8d, 0xfe, 0x07, 0xb4, 0xfe, \n  0xdf, 0xb2, 0xfe, 0x3a, 0x75, 0xfe, 0xbe, 0x36, 0x08, 0x7c, 0x70, 0x0c, 0xf1, 0x03, 0x07, 0x5a, \n  0x9b, 0x07, 0x92, 0x3c, 0x0a, 0xb8, 0x35, 0x05, 0x5a, 0xff, 0x00, 0x47, 0xa7, 0x02, 0x26, 0x98, \n  0x03, 0xac, 0x9a, 0xff, 0x87, 0x89, 0xff, 0x84, 0x25, 0x04, 0x4f, 0x1f, 0x03, 0xd2, 0xe5, 0x00, \n  0xaf, 0xfc, 0x02, 0x1a, 0x8d, 0x02, 0xb7, 0xb4, 0xff, 0xc1, 0x90, 0x00, 0x2e, 0x90, 0x02, 0x89, \n  0xf0, 0x01, 0xb1, 0x6d, 0x00, 0x6a, 0x15, 0xff, 0x32, 0xa5, 0xfe, 0x64, 0x43, 0xff, 0x55, 0xfa, \n  0xfe, 0x24, 0x6f, 0xfe, 0x35, 0xcb, 0xfe, 0x9b, 0xce, 0xfe, 0x36, 0x4f, 0xfe, 0x52, 0x38, 0xfe, \n  0x62, 0xaa, 0xfe, 0xc3, 0xc4, 0xfe, 0xe5, 0x51, 0x08, 0xa5, 0x58, 0x0b, 0x5e, 0xb5, 0x05, 0x1c, \n  0xec, 0x06, 0x0e, 0x4f, 0x09, 0xe8, 0x54, 0x06, 0x0c, 0x5c, 0x04, 0xc6, 0x4e, 0x04, 0x3e, 0x2b, \n  0x03, 0x5b, 0x51, 0xff, 0xef, 0xe3, 0xff, 0xb2, 0xd7, 0x04, 0x5e, 0xcb, 0x03, 0x58, 0x3a, 0x00, \n  0xec, 0x13, 0x01, 0xac, 0x7f, 0x02, 0xce, 0xa2, 0x01, 0x80, 0x33, 0x01, 0x65, 0x61, 0x01, 0x25, \n  0xdf, 0xff, 0x2d, 0x5d, 0xfe, 0x06, 0xc6, 0xfe, 0x82, 0xd8, 0xff, 0x27, 0xec, 0xff, 0xc3, 0xc9, \n  0xfe, 0xf0, 0x31, 0xfe, 0xf4, 0x71, 0xfe, 0x5b, 0x54, 0xfe, 0x5c, 0x24, 0xfe, 0x04, 0x64, 0xfe, \n  0xb1, 0xbe, 0xfe, 0x60, 0xf3, 0xfe, 0x73, 0xad, 0x06, 0x48, 0xe9, 0x09, 0x5b, 0x5e, 0x06, 0xbc, \n  0x00, 0x08, 0x9e, 0x12, 0x0b, 0x59, 0x95, 0x07, 0x87, 0xb3, 0x03, 0x94, 0x38, 0x04, 0x34, 0x03, \n  0x04, 0x52, 0x7c, 0x00, 0x2d, 0xae, 0x00, 0xfd, 0x0a, 0x04, 0x63, 0xb9, 0x02, 0xf3, 0x76, 0x00, \n  0xb6, 0x77, 0x02, 0x14, 0x18, 0x03, 0x5d, 0x40, 0x00, 0x5e, 0x0f, 0xff, 0xb2, 0xa1, 0xff, 0x80, \n  0x92, 0xff, 0x58, 0x8c, 0xff, 0x69, 0xb9, 0xff, 0xbe, 0xc7, 0xff, 0x05, 0x5b, 0xff, 0x29, 0x4e, \n  0xfe, 0x10, 0xf6, 0xfd, 0x3b, 0x53, 0xfe, 0x11, 0x63, 0xfe, 0xfa, 0x46, 0xfe, 0x2a, 0xa0, 0xfe, \n  0x18, 0x36, 0xff, 0xc2, 0x19, 0xff, 0x89, 0xdf, 0x07, 0xf2, 0xea, 0x0c, 0xfe, 0x76, 0x09, 0x23, \n  0xde, 0x07, 0xc2, 0x13, 0x08, 0xc7, 0x47, 0x06, 0xfe, 0x96, 0x04, 0x13, 0x36, 0x04, 0xa2, 0x4b, \n  0x03, 0x9d, 0x4a, 0x01, 0xfd, 0x4d, 0x01, 0x92, 0xfa, 0x02, 0x34, 0xcf, 0x03, 0x05, 0x0e, 0x02, \n  0xe9, 0x81, 0xff, 0xcf, 0x47, 0xff, 0x5d, 0x6c, 0xff, 0x3e, 0x95, 0xff, 0x2c, 0x4c, 0x00, 0x8e, \n  0x15, 0x00, 0xcf, 0xb5, 0xff, 0x6e, 0x52, 0xff, 0x67, 0xc5, 0xfe, 0xbb, 0xa9, 0xfe, 0x6b, 0x57, \n  0xfe, 0x80, 0x12, 0xfe, 0xc5, 0x46, 0xfe, 0x26, 0xa1, 0xfe, 0x4d, 0xe0, 0xfe, 0x62, 0xc3, 0xfe, \n  0x5d, 0x06, 0xff, 0xe5, 0x53, 0xff, 0x48, 0xd7, 0x07, 0x22, 0x04, 0x0d, 0x15, 0xa6, 0x09, 0x04, \n  0x61, 0x07, 0x65, 0x6c, 0x07, 0x0d, 0x9c, 0x06, 0x65, 0x94, 0x05, 0xbd, 0x0b, 0x05, 0x98, 0x4e, \n  0x04, 0x80, 0x75, 0x02, 0x88, 0x63, 0x01, 0xb1, 0x9b, 0x02, 0x69, 0x72, 0x03, 0x1c, 0xa5, 0x00, \n  0xcb, 0xf4, 0xfd, 0xf0, 0xbc, 0xfe, 0x09, 0xe9, 0xff, 0x6c, 0x67, 0x00, 0xc8, 0x99, 0x00, 0x61, \n  0x05, 0x00, 0xa9, 0x30, 0xff, 0x18, 0xc9, 0xfe, 0x16, 0xf8, 0xfe, 0xfe, 0xe9, 0xfe, 0xe5, 0x4e, \n  0xfe, 0x1f, 0x2d, 0xfe, 0xfd, 0x8e, 0xfe, 0x01, 0xbd, 0xfe, 0x53, 0xb7, 0xfe, 0x97, 0xd3, 0xfe, \n  0x8c, 0x35, 0xff, 0x17, 0x55, 0xff, 0x2c, 0x89, 0x07, 0xc4, 0x6f, 0x0b, 0x6c, 0x46, 0x07, 0xb8, \n  0x3c, 0x06, 0xbb, 0xf4, 0x06, 0x92, 0x67, 0x06, 0xc0, 0x4e, 0x06, 0x43, 0x22, 0x07, 0x2b, 0x50, \n  0x07, 0x19, 0x44, 0x04, 0xca, 0x65, 0x02, 0xce, 0xe2, 0x01, 0x15, 0x96, 0x00, 0x63, 0x78, 0x00, \n  0xe1, 0xc1, 0xff, 0x1b, 0xcf, 0xfe, 0x58, 0x6a, 0xff, 0xd9, 0x7c, 0x00, 0xf6, 0x92, 0x00, 0x8c, \n  0x8c, 0xff, 0x25, 0x2d, 0xff, 0xe4, 0x3e, 0xff, 0x3f, 0xfc, 0xfe, 0xbc, 0xd5, 0xfe, 0x0b, 0x88, \n  0xfe, 0x14, 0x62, 0xfe, 0x3f, 0xab, 0xfe, 0x41, 0xc5, 0xfe, 0x2d, 0x89, 0xfe, 0x86, 0xb5, 0xfe, \n  0x72, 0x46, 0xff, 0x48, 0x4d, 0xff, 0x2b, 0x28, 0x08, 0xaf, 0xfd, 0x0b, 0xc2, 0xb1, 0x06, 0x2d, \n  0x1f, 0x05, 0x07, 0x61, 0x05, 0x38, 0x81, 0x04, 0x68, 0x0b, 0x06, 0xa6, 0x05, 0x08, 0x5a, 0x5e, \n  0x07, 0x66, 0x5b, 0x04, 0xc7, 0xc2, 0x02, 0xe5, 0x08, 0x02, 0xee, 0x1b, 0x02, 0x64, 0xa1, 0x02, \n  0xae, 0x50, 0x00, 0x98, 0xed, 0xfe, 0x1a, 0x87, 0xff, 0x41, 0x54, 0xff, 0x26, 0xb3, 0xff, 0x29, \n  0x0c, 0x00, 0xce, 0x77, 0xff, 0xb6, 0xb7, 0xfe, 0x52, 0x81, 0xfe, 0xa0, 0x13, 0xff, 0xdc, 0x00, \n  0xff, 0x9e, 0x8d, 0xfe, 0x23, 0xe0, 0xfe, 0x32, 0x28, 0xff, 0xa8, 0x0a, 0xff, 0xdd, 0xdf, 0xfe, \n  0x86, 0xec, 0xfe, 0x93, 0x27, 0xff, 0xd9, 0x90, 0x08, 0x7f, 0xbe, 0x0b, 0x66, 0x34, 0x05, 0x2c, \n  0x05, 0x04, 0xde, 0x73, 0x05, 0x73, 0x38, 0x04, 0xed, 0x72, 0x03, 0x8c, 0x58, 0x04, 0x5a, 0x47, \n  0x06, 0x13, 0x3c, 0x06, 0xb9, 0x0b, 0x05, 0x4b, 0x33, 0x04, 0xdc, 0x2c, 0x03, 0x8c, 0xa8, 0x02, \n  0xb0, 0x5f, 0x03, 0x7b, 0xcf, 0x01, 0x38, 0xd8, 0xfd, 0x30, 0xda, 0xfd, 0x32, 0x70, 0xff, 0x80, \n  0x86, 0xff, 0xcd, 0xef, 0xff, 0x22, 0x60, 0xff, 0x45, 0xb7, 0xfe, 0xa2, 0xdd, 0xfe, 0x35, 0x03, \n  0xff, 0xbc, 0xfa, 0xfe, 0x23, 0x08, 0xff, 0xb5, 0x3f, 0xff, 0xc0, 0xee, 0xfe, 0xc4, 0x17, 0xff, \n  0x6b, 0x32, 0xff, 0xde, 0xa2, 0xfe, 0x15, 0x0b, 0x08, 0x95, 0x57, 0x0b, 0xed, 0x33, 0x05, 0x88, \n  0xc4, 0x03, 0xd1, 0x69, 0x05, 0x1c, 0x05, 0x05, 0xac, 0x1b, 0x04, 0xb1, 0x34, 0x02, 0xf8, 0x7d, \n  0x01, 0x4f, 0x0c, 0x03, 0xc2, 0x78, 0x05, 0xa8, 0xee, 0x05, 0xcd, 0x57, 0x04, 0x63, 0x3f, 0x03, \n  0xe7, 0x51, 0x03, 0x38, 0x4a, 0x04, 0xa3, 0xfc, 0x02, 0xd9, 0x33, 0xff, 0x53, 0xb1, 0xfd, 0x75, \n  0x8d, 0xfe, 0xd0, 0x30, 0xff, 0x7b, 0x93, 0xff, 0xb5, 0xcf, 0xff, 0xa3, 0x46, 0xff, 0xf3, 0x8c, \n  0xfe, 0x70, 0xe2, 0xfe, 0xfd, 0x68, 0xff, 0xe9, 0xfa, 0xfe, 0xca, 0xd4, 0xfe, 0x5f, 0x60, 0xff, \n  0xa6, 0x4a, 0xff, 0x0c, 0xd1, 0xfe, 0x9b, 0xb6, 0x08, 0x62, 0x84, 0x0b, 0xeb, 0xc7, 0x03, 0x73, \n  0x58, 0x02, 0x3d, 0xd9, 0x04, 0xf8, 0xb5, 0x04, 0x84, 0x18, 0x04, 0x12, 0x6c, 0x02, 0x28, 0x6c, \n  0x00, 0xd4, 0x71, 0x00, 0xa5, 0x47, 0x03, 0x9c, 0x54, 0x04, 0xfd, 0xa1, 0x03, 0x4a, 0x9a, 0x04, \n  0x0e, 0x61, 0x05, 0x87, 0x87, 0x05, 0x0b, 0x93, 0x04, 0xfe, 0xab, 0x02, 0xec, 0x3c, 0x01, 0xa1, \n  0x9b, 0xff, 0x3a, 0x01, 0xfe, 0x66, 0xda, 0xfd, 0xf3, 0x0b, 0xff, 0xc6, 0x88, 0xff, 0x59, 0x27, \n  0xff, 0x9b, 0xe4, 0xfe, 0xcf, 0xd5, 0xfe, 0x19, 0xe9, 0xfe, 0x2d, 0xf1, 0xfe, 0xa3, 0x82, 0xff, \n  0x9c, 0x92, 0xff, 0x0d, 0xf0, 0xfe, 0x21, 0xbe, 0x09, 0x7d, 0xa2, 0x0c, 0xa2, 0xe0, 0x03, 0xf5, \n  0xf2, 0x02, 0x2e, 0xb2, 0x05, 0xdb, 0x52, 0x04, 0x0d, 0x57, 0x03, 0x92, 0x3b, 0x01, 0xcd, 0x05, \n  0xff, 0x44, 0x28, 0x01, 0xab, 0x17, 0x04, 0xac, 0xde, 0x01, 0xef, 0x54, 0x00, 0xc5, 0x3b, 0x02, \n  0xb0, 0x73, 0x03, 0x16, 0x6d, 0x05, 0x29, 0x9f, 0x05, 0x4d, 0xa9, 0x03, 0xb5, 0x98, 0x03, 0x2b, \n  0x15, 0x03, 0xaa, 0xae, 0x00, 0x7d, 0xb5, 0xfe, 0xef, 0xf5, 0xfd, 0x00, 0xcb, 0xfd, 0xf4, 0x6e, \n  0xfe, 0x94, 0x81, 0xff, 0xab, 0x85, 0xff, 0x8f, 0xd6, 0xfe, 0x2b, 0xa5, 0xfe, 0x00, 0x4c, 0xff, \n  0xc9, 0x91, 0xff, 0xc0, 0x10, 0xff, 0x3c, 0xdb, 0x0a, 0x5d, 0x32, 0x0d, 0xc2, 0x65, 0x03, 0xd1, \n  0xf3, 0x03, 0x58, 0x87, 0x07, 0x6e, 0x8c, 0x05, 0x47, 0x51, 0x03, 0x87, 0xb7, 0xfe, 0xd8, 0x5a, \n  0xfc, 0x42, 0x9c, 0x01, 0x18, 0x7b, 0x05, 0xf7, 0x88, 0x01, 0x9b, 0x30, 0xff, 0x9b, 0x38, 0x00, \n  0x42, 0x25, 0x01, 0x12, 0x8a, 0x03, 0x1a, 0x14, 0x03, 0xb2, 0x8a, 0x02, 0x2d, 0xb4, 0x04, 0xbc, \n  0x5d, 0x04, 0x0e, 0xea, 0x02, 0x5c, 0xd2, 0x01, 0x80, 0x50, 0x00, 0xa7, 0xa6, 0xfe, 0xf2, 0x56, \n  0xfd, 0x87, 0xca, 0xfd, 0xb0, 0xdd, 0xfe, 0xb8, 0x37, 0xff, 0xef, 0x4e, 0xff, 0x5c, 0x4b, 0xff, \n  0x28, 0x0b, 0xff, 0xc2, 0xe2, 0xfe, 0x66, 0x1c, 0x0d, 0x4b, 0x57, 0x10, 0xb4, 0xdc, 0x03, 0x3d, \n  0xfc, 0x02, 0xcf, 0xbf, 0x06, 0x43, 0x26, 0x05, 0x2b, 0xdb, 0x03, 0x1e, 0x64, 0xfe, 0xb6, 0x5a, \n  0xfb, 0xfa, 0x9e, 0x01, 0x64, 0x0f, 0x05, 0xf2, 0x8b, 0x00, 0xf0, 0xc6, 0xfe, 0xce, 0x3f, 0x00, \n  0xac, 0x9f, 0x00, 0x86, 0xd7, 0x01, 0xea, 0xb4, 0x01, 0x54, 0x31, 0x01, 0x8b, 0x87, 0x02, 0xc7, \n  0x8e, 0x03, 0x64, 0x92, 0x03, 0xe0, 0x8c, 0x02, 0x57, 0xa9, 0x01, 0xab, 0x17, 0x01, 0x7b, 0xf4, \n  0xff, 0x9e, 0xa4, 0xfe, 0x6a, 0xbd, 0xfd, 0x14, 0xf9, 0xfd, 0xba, 0xc5, 0xfe, 0x6f, 0x97, 0xff, \n  0x0b, 0xe3, 0xff, 0xaf, 0x12, 0xff, 0x29, 0x16, 0x0f, 0xe1, 0x2b, 0x12, 0x9a, 0x8a, 0x03, 0xfb, \n  0x5f, 0x03, 0x7d, 0x60, 0x08, 0x5f, 0x70, 0x05, 0x54, 0x8c, 0x02, 0x0f, 0x2d, 0xfc, 0xe4, 0x8c, \n  0xfa, 0xed, 0xaf, 0x03, 0x8e, 0xbb, 0x05, 0x47, 0xae, 0xfe, 0x17, 0xa4, 0xfd, 0x3e, 0x93, 0xff, \n  0xf4, 0x6b, 0x00, 0xb7, 0x73, 0x02, 0xb5, 0x07, 0x01, 0x85, 0x76, 0xff, 0x44, 0x61, 0x01, 0x27, \n  0xed, 0x01, 0xe7, 0x41, 0x01, 0x6c, 0xee, 0x01, 0xf5, 0x97, 0x02, 0x56, 0xed, 0x01, 0x85, 0x78, \n  0x01, 0xf0, 0xf0, 0x00, 0xda, 0x8e, 0xff, 0xea, 0x98, 0xfe, 0xac, 0xe7, 0xfd, 0xcc, 0x94, 0xfe, \n  0xca, 0x96, 0xff, 0xbd, 0x17, 0xff, 0x4e, 0x3f, 0x11, 0x63, 0x09, 0x14, 0x21, 0x26, 0x03, 0xf0, \n  0xf3, 0x03, 0x9f, 0xf3, 0x09, 0x23, 0xed, 0x05, 0x56, 0x4a, 0x01, 0x0b, 0x8e, 0xf9, 0xf7, 0x3f, \n  0xfa, 0x36, 0xa4, 0x05, 0x47, 0x84, 0x05, 0xe4, 0x94, 0xfd, 0x13, 0xa5, 0xfd, 0xc6, 0xd3, 0xfe, \n  0x06, 0xae, 0xff, 0x86, 0x8f, 0x02, 0x35, 0xb3, 0x00, 0x7d, 0x39, 0xff, 0x0d, 0x04, 0x01, 0x29, \n  0x8d, 0x00, 0xa9, 0x46, 0x00, 0x0d, 0xac, 0x00, 0x93, 0x71, 0x00, 0xc4, 0x92, 0x01, 0x89, 0x30, \n  0x02, 0xf5, 0x35, 0x01, 0x56, 0x24, 0x01, 0x0e, 0x10, 0x01, 0x3b, 0x7c, 0xff, 0xd4, 0xf4, 0xfe, \n  0xb4, 0xfc, 0xfe, 0x41, 0x63, 0xfe, 0x8e, 0x4b, 0x14, 0x5a, 0x65, 0x17, 0x7d, 0x0e, 0x03, 0xa3, \n  0x2a, 0x03, 0x6c, 0xe1, 0x09, 0x58, 0x95, 0x05, 0xa3, 0x48, 0x00, 0x21, 0x40, 0xf8, 0x48, 0xf7, \n  0xfa, 0x12, 0xfb, 0x06, 0xf4, 0x38, 0x04, 0xa3, 0x28, 0xfc, 0xbe, 0xfd, 0xfd, 0x80, 0xd4, 0xfe, \n  0xe0, 0x6d, 0xff, 0xf1, 0x7e, 0x02, 0x13, 0x00, 0x00, 0xed, 0xc4, 0xfe, 0xd8, 0x18, 0x01, 0x3b, \n  0x37, 0x00, 0xd1, 0x66, 0xff, 0x35, 0xc7, 0xff, 0x44, 0xcd, 0xff, 0x3d, 0x64, 0x00, 0xd1, 0x97, \n  0x00, 0xa8, 0xb4, 0x00, 0x15, 0x73, 0x01, 0x45, 0x7e, 0x01, 0xa9, 0xe8, 0x00, 0xf2, 0x1d, 0x01, \n  0xb8, 0x46, 0x00, 0x4d, 0x62, 0xfe, 0x93, 0x55, 0x16, 0xfc, 0x1d, 0x19, 0x4b, 0xbd, 0x02, 0x08, \n  0x98, 0x04, 0x6e, 0x76, 0x0c, 0x33, 0x67, 0x05, 0x09, 0x05, 0xfd, 0x14, 0x77, 0xf5, 0x72, 0xa1, \n  0xfc, 0x0d, 0x55, 0x09, 0xa7, 0xf1, 0x02, 0xd5, 0xea, 0xfa, 0x71, 0x0b, 0xfe, 0xa2, 0x60, 0xfe, \n  0xb8, 0x76, 0xff, 0xe2, 0x9a, 0x02, 0x83, 0x2f, 0xff, 0x97, 0x69, 0xfe, 0x79, 0x61, 0x01, 0xad, \n  0xaf, 0xff, 0x71, 0xd8, 0xfe, 0x13, 0xbc, 0xff, 0x3b, 0xd1, 0xfe, 0xf5, 0xab, 0xff, 0x11, 0x8f, \n  0x00, 0xe1, 0x23, 0xff, 0x27, 0xcb, 0xff, 0x9d, 0x67, 0x01, 0x96, 0xf6, 0x00, 0x12, 0x8c, 0x01, \n  0x6b, 0xec, 0x01, 0xb9, 0x34, 0x00, 0xbd, 0xa7, 0x18, 0x51, 0x26, 0x1c, 0x5b, 0xfc, 0x02, 0x01, \n  0x83, 0x04, 0xf1, 0x94, 0x0d, 0x54, 0x35, 0x05, 0x20, 0x8e, 0xfa, 0xb2, 0x97, 0xf3, 0xd3, 0xa1, \n  0xfe, 0xc4, 0xe5, 0x0a, 0x86, 0xd1, 0x00, 0xe9, 0xe0, 0xf9, 0xde, 0x95, 0xfe, 0x5b, 0x2d, 0xfe, \n  0x8b, 0xa8, 0xff, 0x98, 0xd5, 0x02, 0x7b, 0x7d, 0xfe, 0xb9, 0xcd, 0xfd, 0x80, 0x5c, 0x01, 0xf7, \n  0x61, 0xff, 0x77, 0x7d, 0xfe, 0x7a, 0xc3, 0xff, 0x67, 0x76, 0xfe, 0x17, 0x4c, 0xff, 0x1e, 0xf8, \n  0xff, 0xae, 0x4a, 0xfe, 0x26, 0x80, 0xff, 0xa7, 0x8f, 0x00, 0x8a, 0xe8, 0xff, 0x84, 0x38, 0x01, \n  0xab, 0xb6, 0x01, 0x64, 0x8f, 0x00, 0x7c, 0x5a, 0x1a, 0x8f, 0x45, 0x1f, 0x8c, 0xf8, 0x03, 0x00, \n  0x2c, 0x04, 0x89, 0x75, 0x0e, 0xd6, 0x3e, 0x05, 0x02, 0x06, 0xf8, 0x28, 0xb4, 0xf1, 0x34, 0x88, \n  0x00, 0x2c, 0x6d, 0x0c, 0x1f, 0xb5, 0xfe, 0xce, 0x86, 0xf8, 0xaa, 0x21, 0xff, 0xea, 0x0e, 0xfe, \n  0xb2, 0xa0, 0xff, 0x88, 0x10, 0x03, 0x69, 0x13, 0xfe, 0x08, 0x63, 0xfd, 0x23, 0x39, 0x01, 0xdc, \n  0xfb, 0xfe, 0x40, 0xf1, 0xfd, 0xfd, 0x7b, 0xff, 0x9c, 0x12, 0xfe, 0x20, 0x1b, 0xff, 0xf3, 0x24, \n  0x00, 0xd9, 0xa3, 0xfd, 0xd5, 0x7c, 0xfe, 0x9b, 0x41, 0x00, 0x87, 0xa5, 0xff, 0x06, 0x63, 0x00, \n  0x9c, 0xe5, 0x00, 0x9e, 0x07, 0x00, 0x6b, 0xe1, 0x1b, 0xd2, 0xfe, 0x22, 0xbd, 0xb9, 0x05, 0x15, \n  0xc6, 0x02, 0x0a, 0x3d, 0x0e, 0x4f, 0x9e, 0x05, 0x32, 0x3d, 0xf6, 0x24, 0x88, 0xf0, 0x47, 0xba, \n  0x01, 0xb9, 0x0f, 0x0d, 0x1a, 0x8b, 0xfd, 0x5a, 0x3a, 0xf7, 0xbf, 0xfb, 0xfe, 0x35, 0x5a, 0xfe, \n  0x91, 0x6a, 0xff, 0xaf, 0x2a, 0x03, 0x02, 0x2d, 0xfe, 0x41, 0xdb, 0xfc, 0x69, 0xfc, 0x00, 0x77, \n  0xe6, 0xfe, 0x90, 0x8a, 0xfd, 0x93, 0xfb, 0xfe, 0x1a, 0xa6, 0xfd, 0x5e, 0xb6, 0xfe, 0xeb, 0xd1, \n  0xff, 0x65, 0xa2, 0xfd, 0xd5, 0x48, 0xfe, 0xb7, 0xa2, 0xff, 0x88, 0x26, 0xff, 0xcd, 0x33, 0x00, \n  0xb9, 0x94, 0x00, 0xf6, 0x56, 0xff, 0xd7, 0x9f, 0x1c, 0x6a, 0x47, 0x26, 0x90, 0x1d, 0x08, 0x18, \n  0x2a, 0x02, 0x34, 0x14, 0x0e, 0xaf, 0xa6, 0x05, 0xb4, 0xcc, 0xf4, 0xd6, 0x96, 0xef, 0xaf, 0x79, \n  0x02, 0xef, 0x8f, 0x0d, 0x77, 0xe6, 0xfc, 0x40, 0x4a, 0xf6, 0xeb, 0x43, 0xfe, 0x76, 0x7a, 0xfe, \n  0x7d, 0x72, 0xff, 0x88, 0x05, 0x03, 0xe5, 0xa1, 0xfe, 0x98, 0x67, 0xfc, 0x4d, 0x50, 0x00, 0x1d, \n  0x30, 0xff, 0x49, 0x8d, 0xfd, 0xd2, 0xa5, 0xfe, 0x07, 0x15, 0xfd, 0x42, 0x0a, 0xfe, 0x19, 0x7d, \n  0xff, 0xb6, 0x6e, 0xfd, 0x11, 0x1e, 0xfe, 0xde, 0x6a, 0xff, 0xc1, 0x01, 0xff, 0x83, 0xc4, 0xff, \n  0x9e, 0x98, 0x00, 0x80, 0x8d, 0xff, 0xb3, 0xc5, 0x1c, 0xc6, 0x11, 0x29, 0x53, 0x1b, 0x0b, 0x54, \n  0x25, 0x02, 0x40, 0xc4, 0x0d, 0xe5, 0x6b, 0x05, 0xca, 0x20, 0xf4, 0xd3, 0x18, 0xef, 0xbd, 0x15, \n  0x02, 0x95, 0x06, 0x0e, 0x23, 0xeb, 0xfc, 0x43, 0x4c, 0xf5, 0x68, 0xd7, 0xfd, 0x38, 0x54, 0xfe, \n  0x02, 0x0d, 0xff, 0xa9, 0x12, 0x03, 0x3c, 0x0e, 0xff, 0xa8, 0x05, 0xfc, 0x33, 0xaf, 0xff, 0xf6, \n  0x64, 0xff, 0xc5, 0x94, 0xfd, 0x9c, 0x80, 0xfe, 0x7d, 0xe6, 0xfc, 0xa9, 0x4f, 0xfd, 0xa5, 0x25, \n  0xff, 0xcf, 0x11, 0xfd, 0x4f, 0x8f, 0xfd, 0xc7, 0x1e, 0xff, 0xa8, 0xed, 0xfe, 0x25, 0x8c, 0x00, \n  0x8c, 0xe2, 0xff, 0x62, 0xe4, 0xfd, 0x74, 0xcb, 0x1d, 0xa3, 0x04, 0x2c, 0x37, 0xd2, 0x0d, 0x22, \n  0x71, 0x01, 0x0c, 0x01, 0x0c, 0x55, 0x2f, 0x05, 0x58, 0x00, 0xf5, 0x0d, 0xaa, 0xef, 0x47, 0x5f, \n  0x00, 0x75, 0xe6, 0x0c, 0x34, 0xed, 0xfd, 0xbe, 0xf3, 0xf4, 0xb8, 0x08, 0xfd, 0x2c, 0xb5, 0xfe, \n  0xe9, 0x6b, 0xfe, 0x17, 0x1f, 0x02, 0xfc, 0xe0, 0xff, 0x42, 0x45, 0xfc, 0xfe, 0x73, 0xfe, 0x2a, \n  0x49, 0xff, 0x91, 0x0b, 0xfe, 0xb8, 0x1d, 0xfe, 0x12, 0x92, 0xfc, 0x2c, 0x36, 0xfd, 0x7d, 0xf4, \n  0xfe, 0x8d, 0xac, 0xfc, 0xc1, 0x93, 0xfc, 0xeb, 0x1c, 0xff, 0xe5, 0x5d, 0xff, 0x8e, 0xf3, 0xfe, \n  0x43, 0x6a, 0xff, 0x05, 0x09, 0xff, 0x29, 0x7e, 0x1e, 0x23, 0x33, 0x2d, 0x61, 0x15, 0x11, 0xcf, \n  0xad, 0x02, 0xc8, 0x42, 0x09, 0x70, 0x06, 0x06, 0x0f, 0xef, 0xf7, 0xd1, 0xeb, 0xee, 0xa4, 0x14, \n  0xfe, 0xf4, 0x47, 0x0c, 0x22, 0x0c, 0xff, 0x06, 0xaf, 0xf5, 0xc1, 0xbf, 0xfc, 0xe6, 0xf3, 0xfd, \n  0x69, 0xe5, 0xfd, 0xee, 0xe3, 0x01, 0x43, 0xfd, 0xff, 0xb5, 0x1b, 0xfd, 0x2a, 0x01, 0xfe, 0xe2, \n  0xf1, 0xfd, 0xfc, 0xfb, 0xfd, 0xe3, 0xf2, 0xfe, 0x8a, 0x17, 0xfd, 0xf2, 0x80, 0xfc, 0x6a, 0x4c, \n  0xfe, 0xf8, 0x2d, 0xfd, 0xd5, 0x63, 0xfd, 0x38, 0x25, 0xfe, 0x9d, 0x44, 0xfd, 0x67, 0x65, 0xff, \n  0xc0, 0xf0, 0xff, 0x41, 0x2a, 0xfe, 0x73, 0xb3, 0x20, 0x8e, 0x44, 0x2c, 0x08, 0xfd, 0x10, 0xc4, \n  0xf5, 0x06, 0x76, 0x72, 0x09, 0x05, 0x7a, 0x05, 0x02, 0xc6, 0xf8, 0x6e, 0x13, 0xee, 0x34, 0x99, \n  0xfd, 0xfe, 0xde, 0x0a, 0xef, 0x25, 0xff, 0x8c, 0x6f, 0xf7, 0x88, 0x00, 0xfc, 0x1b, 0xef, 0xfc, \n  0xa1, 0x1d, 0xfe, 0x51, 0xc4, 0x01, 0x6a, 0x82, 0xff, 0x83, 0x83, 0xfd, 0x39, 0xcf, 0xfd, 0x3d, \n  0x86, 0xfc, 0x98, 0x35, 0xfe, 0xae, 0x75, 0xff, 0xd6, 0xa0, 0xfc, 0x9a, 0x2a, 0xfc, 0xbf, 0x24, \n  0xfe, 0x12, 0x26, 0xfe, 0x5b, 0x15, 0xfd, 0x14, 0xc8, 0xfc, 0x2f, 0x68, 0xfd, 0x84, 0x97, 0xfe, \n  0x3b, 0x57, 0xff, 0x79, 0xc9, 0xfe, 0x3e, 0x4e, 0x23, 0xaf, 0x08, 0x2a, 0x0d, 0x2a, 0x0f, 0xfc, \n  0x0c, 0x0d, 0xb8, 0x41, 0x0b, 0x46, 0x65, 0x04, 0x38, 0x62, 0xf9, 0x04, 0x5e, 0xed, 0x78, 0x40, \n  0xfe, 0x60, 0xcf, 0x08, 0x6b, 0x45, 0xfd, 0x09, 0x82, 0xfa, 0x9f, 0x7b, 0xfc, 0xca, 0x32, 0xfb, \n  0xeb, 0x86, 0xfe, 0x2b, 0xb9, 0x01, 0x43, 0x66, 0xfe, 0x7e, 0x00, 0xfe, 0x21, 0x55, 0xfe, 0xfc, \n  0x60, 0xfb, 0xda, 0x05, 0xfe, 0xf6, 0x1f, 0xff, 0x15, 0xb2, 0xfb, 0xf3, 0x7e, 0xfd, 0x2c, 0x3e, \n  0xfe, 0xf4, 0x53, 0xfc, 0x07, 0xf8, 0xfd, 0xb8, 0x82, 0xfd, 0x84, 0xf9, 0xfb, 0x20, 0x63, 0xfe, \n  0x03, 0x99, 0xff, 0x05, 0x5d, 0xfe, 0x14, 0xc9, 0x26, 0xde, 0x93, 0x26, 0xd8, 0x97, 0x09, 0xde, \n  0x92, 0x14, 0xd6, 0xf4, 0x11, 0x45, 0x70, 0x01, 0xb6, 0x0e, 0xf7, 0x24, 0x58, 0xef, 0x0c, 0x47, \n  0x00, 0xc9, 0x56, 0x04, 0x3c, 0x1a, 0xfa, 0x8e, 0x15, 0xff, 0xcc, 0xbc, 0xfd, 0xb0, 0xc3, 0xf8, \n  0xac, 0x95, 0xfe, 0xf3, 0x88, 0x01, 0x97, 0xb8, 0xfd, 0xca, 0xac, 0xfe, 0x9f, 0x86, 0xfe, 0xeb, \n  0x38, 0xfa, 0x1b, 0x63, 0xfd, 0x62, 0xeb, 0xfe, 0xfa, 0xe3, 0xfb, 0xde, 0x1e, 0xfd, 0xc8, 0x84, \n  0xfc, 0x90, 0xf8, 0xfc, 0x6e, 0xe7, 0xfe, 0x20, 0xd9, 0xfc, 0xb6, 0x56, 0xfc, 0x4d, 0xef, 0xfd, \n  0xfa, 0xf3, 0xfe, 0xe7, 0xb9, 0xfe, 0x54, 0xd0, 0x2b, 0x49, 0xdb, 0x26, 0xcf, 0xd5, 0x02, 0x10, \n  0x34, 0x17, 0x0f, 0xb9, 0x17, 0xbe, 0x37, 0xfe, 0x69, 0x37, 0xf5, 0x06, 0xd9, 0xf4, 0x54, 0xb3, \n  0x03, 0x3f, 0xdf, 0xfd, 0xf3, 0xfd, 0xf3, 0x24, 0xb5, 0x03, 0x91, 0xfa, 0x01, 0x75, 0x01, 0xf7, \n  0xe6, 0xdc, 0xfd, 0x24, 0x04, 0x01, 0x69, 0xd4, 0xfc, 0x45, 0xe4, 0xff, 0x8e, 0x37, 0xff, 0xf9, \n  0x66, 0xf8, 0x63, 0x50, 0xfd, 0x50, 0x00, 0x00, 0x0a, 0x11, 0xf9, 0xe9, 0x8f, 0xfc, 0x70, 0x5b, \n  0xfe, 0x8d, 0x5d, 0xfb, 0xbd, 0xf8, 0xfe, 0x0e, 0xeb, 0xfd, 0x04, 0x12, 0xfc, 0xae, 0x4e, 0xfe, \n  0x10, 0xcf, 0xfe, 0xf3, 0x06, 0xff, 0x30, 0xdd, 0x30, 0x7f, 0x9c, 0x28, 0x85, 0x5f, 0xfb, 0xa4, \n  0xc6, 0x16, 0x01, 0x63, 0x1e, 0xc8, 0x80, 0xfc, 0x6b, 0x92, 0xf1, 0x83, 0x15, 0xfa, 0xd9, 0x93, \n  0x09, 0x0a, 0x9a, 0xf8, 0xca, 0x0c, 0xeb, 0x40, 0xb1, 0x05, 0x27, 0x8f, 0x08, 0x4a, 0xd3, 0xf6, \n  0xa9, 0x2f, 0xfc, 0xc5, 0x80, 0x00, 0x10, 0x40, 0xfb, 0x3e, 0xc2, 0x00, 0xa9, 0x2e, 0x00, 0x06, \n  0xd8, 0xf7, 0x59, 0x34, 0xfd, 0x82, 0x04, 0xfe, 0x83, 0xe7, 0xf7, 0xaf, 0x41, 0xfd, 0xd9, 0xa6, \n  0xfd, 0x3e, 0x11, 0xfb, 0x01, 0x7b, 0xff, 0x26, 0xc0, 0xfd, 0x0b, 0x05, 0xfc, 0xde, 0x4c, 0xff, \n  0x7d, 0xc8, 0xff, 0xa0, 0x3d, 0xfe, 0x0c, 0x7a, 0x35, 0xf3, 0xb3, 0x2b, 0x54, 0x63, 0xf4, 0x17, \n  0x7c, 0x13, 0x05, 0x07, 0x25, 0x60, 0x32, 0xfd, 0x3c, 0x5a, 0xed, 0x19, 0x14, 0xfe, 0x1a, 0xb6, \n  0x10, 0xf2, 0x43, 0xf6, 0x08, 0x90, 0xe1, 0xaa, 0x84, 0x03, 0x27, 0x7f, 0x0f, 0x50, 0xf3, 0xf9, \n  0x54, 0x44, 0xfa, 0x34, 0x95, 0xff, 0x0c, 0xe1, 0xf9, 0x17, 0x3c, 0x00, 0xd4, 0xa1, 0x02, 0xe3, \n  0xea, 0xf7, 0xdf, 0xa4, 0xfa, 0x9a, 0x69, 0xfe, 0x38, 0x5a, 0xf7, 0xcb, 0x10, 0xfb, 0xd7, 0xe9, \n  0xfe, 0xf8, 0x85, 0xfb, 0xac, 0xab, 0xfe, 0x2c, 0x29, 0xfe, 0x5e, 0x29, 0xfc, 0xb3, 0x64, 0x00, \n  0xb6, 0x72, 0x00, 0x9a, 0x13, 0xfd, 0x68, 0x40, 0x3b, 0x85, 0x74, 0x30, 0x4c, 0xce, 0xec, 0xac, \n  0xb1, 0x0b, 0x10, 0x05, 0x2a, 0x66, 0x25, 0x02, 0xbb, 0xfa, 0xe9, 0x17, 0x3f, 0xfe, 0x71, 0x5a, \n  0x16, 0x10, 0xce, 0xf6, 0x04, 0xbd, 0xda, 0x8a, 0x12, 0xfe, 0x9d, 0x79, 0x13, 0x7e, 0x54, 0xff, \n  0x75, 0xb7, 0xf9, 0x1b, 0xf9, 0xfd, 0xe5, 0xe0, 0xf7, 0x4a, 0x72, 0x00, 0x24, 0x54, 0x04, 0x3e, \n  0xc2, 0xf5, 0xf4, 0x21, 0xfa, 0xbb, 0x6f, 0xff, 0x70, 0x65, 0xf5, 0xc6, 0xc3, 0xf9, 0x0a, 0x29, \n  0xff, 0x0c, 0x07, 0xfc, 0x51, 0xf5, 0xfe, 0x45, 0xf7, 0xfd, 0xb2, 0x3b, 0xfc, 0xed, 0xaa, 0x00, \n  0xb0, 0x9b, 0x00, 0x21, 0xfe, 0xfc, 0xbf, 0x87, 0x41, 0x23, 0xc3, 0x34, 0xad, 0xdf, 0xe5, 0x6b, \n  0x60, 0x04, 0x17, 0x89, 0x2c, 0xe2, 0x61, 0x07, 0xc1, 0x4c, 0xe8, 0x23, 0x34, 0xfe, 0x23, 0xab, \n  0x1b, 0x2d, 0xaf, 0xf7, 0x2e, 0xc6, 0xd5, 0xc8, 0xf3, 0xf7, 0x79, 0xc0, 0x14, 0x60, 0xce, 0x05, \n  0x48, 0x67, 0xfb, 0xdc, 0x79, 0xfb, 0x63, 0xfe, 0xf5, 0xfa, 0x40, 0x01, 0x7e, 0x11, 0x04, 0xbe, \n  0xeb, 0xf4, 0x59, 0x41, 0xfa, 0x4c, 0x04, 0xff, 0xf2, 0x7f, 0xf5, 0xcb, 0x5e, 0xf8, 0xa1, 0x74, \n  0xfe, 0x6a, 0x39, 0xfd, 0xa8, 0x5b, 0xff, 0x6f, 0x22, 0xfe, 0x7d, 0xbd, 0xfb, 0x6a, 0x74, 0x00, \n  0xb7, 0xe3, 0x00, 0x11, 0x76, 0xfd, 0xcd, 0x76, 0x4a, 0x80, 0x69, 0x37, 0xa8, 0xb9, 0xdd, 0x39, \n  0x5b, 0xfe, 0x56, 0xb6, 0x2c, 0x43, 0x7d, 0x0c, 0xe3, 0xbb, 0xe8, 0xfe, 0xf5, 0xfd, 0x5e, 0x79, \n  0x1f, 0x2e, 0xaf, 0xf7, 0xb9, 0x3c, 0xd3, 0xb8, 0x2e, 0xf3, 0xc0, 0xb2, 0x13, 0xb9, 0xa3, 0x0b, \n  0xf5, 0x40, 0xfe, 0x06, 0x85, 0xf9, 0xcf, 0xcb, 0xf3, 0x71, 0xd0, 0x01, 0x33, 0x4b, 0x04, 0xb4, \n  0x80, 0xf3, 0xcb, 0x78, 0xfa, 0x0e, 0x1b, 0xff, 0xf3, 0x23, 0xf5, 0x8a, 0x2b, 0xf8, 0xd5, 0x27, \n  0xfe, 0x93, 0x8f, 0xfd, 0x45, 0xda, 0xff, 0x8a, 0x79, 0xfe, 0x99, 0x05, 0xfb, 0xea, 0xfe, 0xff, \n  0x7e, 0xbc, 0x01, 0x10, 0xc1, 0xfd, 0x72, 0x76, 0x54, 0x68, 0x4a, 0x3a, 0x06, 0x25, 0xd4, 0x88, \n  0xac, 0xf7, 0xc4, 0xb2, 0x2b, 0xa0, 0xde, 0x11, 0x7b, 0x79, 0xeb, 0x4b, 0x2d, 0xfc, 0x66, 0x79, \n  0x20, 0x13, 0x0b, 0xf8, 0xe1, 0xdb, 0xd2, 0xdf, 0xa2, 0xef, 0x39, 0xba, 0x10, 0x21, 0x57, 0x0f, \n  0x74, 0xdb, 0x01, 0x28, 0xd7, 0xf8, 0x3c, 0xc0, 0xf0, 0xb7, 0xf8, 0x01, 0x15, 0x10, 0x05, 0x60, \n  0x5a, 0xf1, 0x35, 0xba, 0xfa, 0xa5, 0x1f, 0xff, 0xc2, 0xb1, 0xf4, 0xa6, 0xf0, 0xf8, 0x4d, 0x3f, \n  0xfd, 0x61, 0x9f, 0xfd, 0xbf, 0x82, 0x00, 0x0e, 0x18, 0xfe, 0x26, 0x60, 0xfa, 0x32, 0xd5, 0xff, \n  0x31, 0x8c, 0x02, 0xc6, 0x91, 0xfd, 0xe0, 0x2d, 0x5d, 0x27, 0xc9, 0x3e, 0x58, 0x16, 0xcb, 0xf3, \n  0x12, 0xf2, 0x24, 0xaa, 0x2a, 0xae, 0x32, 0x15, 0xb3, 0x1a, 0xf0, 0x28, 0x24, 0xfa, 0x2d, 0x43, \n  0x21, 0x3a, 0xf6, 0xfa, 0x8e, 0x82, 0xd2, 0x53, 0xd4, 0xec, 0xb1, 0x3d, 0x0d, 0xd5, 0x49, 0x11, \n  0x8a, 0xd4, 0x06, 0x46, 0x53, 0xf9, 0x54, 0x06, 0xee, 0xcd, 0x28, 0x02, 0x12, 0xa5, 0x05, 0x08, \n  0x0a, 0xf0, 0x6b, 0x5c, 0xfb, 0x97, 0xa8, 0xff, 0xcf, 0x66, 0xf4, 0x95, 0x6a, 0xf9, 0xf8, 0x41, \n  0xfd, 0x75, 0xa1, 0xfd, 0x89, 0xb2, 0x00, 0xab, 0xd1, 0xfd, 0x5f, 0x50, 0xfa, 0x12, 0x92, 0x00, \n  0xcd, 0xb1, 0x02, 0xf2, 0xd1, 0xfc, 0x5c, 0x1e, 0x67, 0xea, 0x50, 0x3f, 0x67, 0x14, 0xc2, 0x63, \n  0x04, 0xf1, 0x0c, 0xdc, 0x28, 0x79, 0x3b, 0x14, 0xaf, 0x56, 0xf3, 0x08, 0x5b, 0xf9, 0xa1, 0x90, \n  0x22, 0x7e, 0xaa, 0xfe, 0x43, 0xa8, 0xd0, 0x33, 0x7b, 0xe9, 0xeb, 0x05, 0x0b, 0x72, 0x6c, 0x11, \n  0x27, 0xf0, 0x0a, 0x7b, 0xb6, 0xf9, 0xc8, 0x72, 0xec, 0x96, 0x9d, 0x02, 0xf9, 0xb5, 0x03, 0x47, \n  0x7b, 0xef, 0x61, 0x41, 0xfd, 0x87, 0xaa, 0xff, 0xd6, 0x13, 0xf3, 0x28, 0x7b, 0xf9, 0x76, 0x28, \n  0xfe, 0x22, 0xfd, 0xfc, 0x58, 0x3c, 0x00, 0xd9, 0xa1, 0xfd, 0xd9, 0xa2, 0xfa, 0x47, 0x9f, 0x01, \n  0x92, 0xa3, 0x01, 0x86, 0xe7, 0xfb, 0x56, 0x55, 0x6d, 0x7c, 0xe5, 0x42, 0xd2, 0x17, 0xbb, 0x17, \n  0x80, 0xf0, 0x5e, 0xc4, 0x27, 0x1c, 0xdb, 0x0f, 0xa9, 0x62, 0xf6, 0xc1, 0xb9, 0xf7, 0xa2, 0xb8, \n  0x24, 0x7c, 0x98, 0x06, 0xc6, 0x88, 0xcd, 0x47, 0xd3, 0xe3, 0xde, 0xdb, 0x09, 0xac, 0xd9, 0x11, \n  0xd3, 0xaa, 0x0c, 0xed, 0x6b, 0xfb, 0xa8, 0x78, 0xed, 0xe4, 0xe7, 0x00, 0xd3, 0x6e, 0x01, 0xfe, \n  0xbc, 0xf0, 0x3d, 0xe0, 0xfe, 0xa5, 0x31, 0xff, 0x95, 0x25, 0xf2, 0xa6, 0x84, 0xf9, 0x96, 0xce, \n  0xfe, 0x4c, 0x14, 0xfc, 0xa1, 0x97, 0xff, 0x98, 0x3d, 0xfe, 0x1d, 0x06, 0xfb, 0x96, 0x26, 0x02, \n  0x7b, 0xbe, 0x00, 0x0a, 0x0f, 0xfb, 0xd1, 0x0b, 0x74, 0x13, 0x17, 0x43, 0xab, 0xd3, 0xb5, 0x3f, \n  0xb0, 0xf3, 0x27, 0xa6, 0x25, 0x37, 0xbc, 0x09, 0xa2, 0xd2, 0xf6, 0xf6, 0x1c, 0xf6, 0x01, 0xe6, \n  0x28, 0x07, 0xa4, 0x0e, 0x0a, 0x21, 0xca, 0x74, 0xd8, 0xdd, 0xdb, 0x7b, 0x09, 0x63, 0x1a, 0x12, \n  0x1c, 0x1c, 0x0c, 0xd4, 0x3b, 0xfe, 0x4c, 0xcc, 0xef, 0x71, 0xc7, 0xfd, 0x33, 0x0e, 0x00, 0xa8, \n  0x79, 0xf2, 0x0e, 0xbf, 0xff, 0xf4, 0x6c, 0xfe, 0x07, 0x3e, 0xf1, 0x08, 0x94, 0xfa, 0xa4, 0xb3, \n  0xfe, 0x24, 0x88, 0xfa, 0x4d, 0x52, 0xff, 0x1f, 0x0b, 0xff, 0xaa, 0xa4, 0xfb, 0x17, 0x18, 0x02, \n  0x4e, 0x32, 0x00, 0xb2, 0x46, 0xfa, 0xca, 0xb1, 0x78, 0x3c, 0xc1, 0x43, 0xbb, 0x36, 0xb3, 0xca, \n  0x7b, 0xf7, 0x11, 0x3c, 0x23, 0xd1, 0xe4, 0x03, 0x69, 0x6d, 0xf5, 0x18, 0x26, 0xf3, 0x84, 0x86, \n  0x2e, 0x7e, 0xd2, 0x16, 0x5b, 0xba, 0xc7, 0x9c, 0xe1, 0xd8, 0x49, 0x55, 0x08, 0xe2, 0xb8, 0x11, \n  0x63, 0x92, 0x0a, 0x6a, 0x91, 0x02, 0xd9, 0x1a, 0xf2, 0x06, 0xaf, 0xf9, 0xa1, 0x27, 0x01, 0x99, \n  0xb2, 0xf3, 0xbf, 0x41, 0xff, 0xc0, 0x36, 0xfe, 0x12, 0xd8, 0xf0, 0xe9, 0x1b, 0xfc, 0xcd, 0xf8, \n  0xfd, 0xda, 0x18, 0xf9, 0xb3, 0xf7, 0xfe, 0x06, 0xde, 0xff, 0x02, 0xca, 0xfc, 0x59, 0x4d, 0x01, \n  0x8b, 0x15, 0x00, 0x20, 0x0d, 0xfa, 0x1e, 0x63, 0x7a, 0x82, 0x3d, 0x46, 0x2f, 0x33, 0xb3, 0x26, \n  0xb1, 0xf9, 0xe8, 0x42, 0x21, 0xe6, 0xf8, 0xff, 0x26, 0xe9, 0xf2, 0xed, 0x3c, 0xee, 0xbb, 0x5d, \n  0x33, 0x11, 0x4d, 0x1e, 0x7a, 0x16, 0xc8, 0x24, 0x2b, 0xd6, 0x9a, 0xf6, 0x04, 0xe9, 0xad, 0x10, \n  0x7c, 0xf4, 0x08, 0x9d, 0xb5, 0x06, 0x28, 0xf9, 0xf4, 0xcf, 0x83, 0xf5, 0x5f, 0x3a, 0x03, 0x23, \n  0x12, 0xf5, 0x78, 0x6c, 0xfd, 0xfa, 0x47, 0xfe, 0x8f, 0xa4, 0xf1, 0x62, 0x58, 0xfd, 0x58, 0xa4, \n  0xfc, 0x61, 0x25, 0xf8, 0xa7, 0xa0, 0xfe, 0xa5, 0x7c, 0x00, 0x1b, 0xf8, 0xfd, 0x7d, 0xf0, 0xff, \n  0x1c, 0x96, 0x00, 0x20, 0x8e, 0xfa, 0x6e, 0x5b, 0x7c, 0x49, 0x67, 0x49, 0x46, 0x8a, 0xb3, 0xd4, \n  0x92, 0xf9, 0x0d, 0x62, 0x1f, 0x9f, 0x97, 0xfe, 0x08, 0x57, 0xef, 0x42, 0x22, 0xe8, 0xea, 0xb3, \n  0x36, 0x6a, 0x24, 0x24, 0xbf, 0xf6, 0xca, 0xd6, 0x0f, 0xd5, 0x6f, 0x9d, 0xff, 0x08, 0xa3, 0x0f, \n  0xed, 0x9c, 0x08, 0x00, 0x30, 0x09, 0xc3, 0x07, 0xf8, 0x08, 0x19, 0xf3, 0xc3, 0x1b, 0x04, 0xd3, \n  0x62, 0xf6, 0x74, 0xa5, 0xfb, 0x4c, 0x0a, 0xfe, 0xf9, 0x12, 0xf3, 0x50, 0xbd, 0xfd, 0xd6, 0x56, \n  0xfb, 0xdc, 0xb4, 0xf7, 0xcf, 0x4d, 0xfe, 0x03, 0xcf, 0x00, 0x7f, 0x71, 0xfe, 0x91, 0x6e, 0xff, \n  0xbf, 0x49, 0x01, 0xe5, 0xf4, 0xf9, 0xcc, 0x79, 0x7d, 0xaf, 0x25, 0x4b, 0x66, 0xf9, 0xb5, 0x4e, \n  0x24, 0xf9, 0x86, 0x35, 0x1d, 0x56, 0xbb, 0xfe, 0x3c, 0x89, 0xeb, 0x5f, 0xde, 0xe2, 0x7e, 0xb0, \n  0x36, 0xf8, 0xc4, 0x27, 0x0f, 0x30, 0xd1, 0x47, 0x31, 0xd5, 0xe0, 0x77, 0xf9, 0x14, 0xff, 0x0d, \n  0x90, 0x7d, 0x09, 0x62, 0xd3, 0x09, 0x5e, 0xf3, 0xf9, 0xe8, 0xac, 0xf3, 0xe1, 0x8a, 0x03, 0xfb, \n  0x16, 0xf7, 0x6e, 0x29, 0xfb, 0x29, 0x9b, 0xfd, 0x96, 0xae, 0xf4, 0xf6, 0x5c, 0xfd, 0xfd, 0x6e, \n  0xfa, 0x15, 0xa7, 0xf7, 0x40, 0xd3, 0xfd, 0x3e, 0x9f, 0x00, 0x08, 0xcf, 0xfe, 0xe5, 0xd3, 0xff, \n  0x88, 0xe9, 0xff, 0x1e, 0x3e, 0xf9, 0xd5, 0xa0, 0x7b, 0x13, 0xd8, 0x4e, 0x94, 0xae, 0xba, 0x57, \n  0x23, 0xf7, 0x99, 0x37, 0x1c, 0x9d, 0x11, 0xfe, 0x27, 0x54, 0xe9, 0x7d, 0x92, 0xde, 0x31, 0x6f, \n  0x31, 0x7a, 0x45, 0x2c, 0xac, 0xf6, 0xd9, 0xfd, 0x50, 0xd5, 0xa4, 0x79, 0xf3, 0x24, 0xb5, 0x0b, \n  0xcc, 0x77, 0x0b, 0x70, 0x30, 0x09, 0x10, 0x10, 0xfb, 0xdb, 0xa6, 0xf6, 0xb1, 0x66, 0x02, 0x3d, \n  0xb4, 0xf6, 0x06, 0xfc, 0xfb, 0x73, 0x0b, 0xfe, 0x78, 0x61, 0xf5, 0xd3, 0xa7, 0xfc, 0x2a, 0x08, \n  0xfa, 0x63, 0x37, 0xf7, 0x56, 0x9c, 0xfd, 0x19, 0x0b, 0x01, 0x18, 0x49, 0xfe, 0x53, 0xf0, 0xfe, \n  0xa7, 0xe2, 0xfe, 0x8a, 0x54, 0xf9, 0x3c, 0x92, 0x77, 0x28, 0xbf, 0x53, 0x23, 0x51, 0xc1, 0x93, \n  0x93, 0xf4, 0x8e, 0x3c, 0x1b, 0x55, 0x96, 0xfc, 0x82, 0xcf, 0xe9, 0x1a, 0xc0, 0xda, 0x88, 0x74, \n  0x27, 0x3a, 0x9d, 0x31, 0x2f, 0xcc, 0xe3, 0xb0, 0xba, 0xd5, 0xe5, 0x5f, 0xef, 0x67, 0x4a, 0x08, \n  0x3d, 0x6f, 0x0d, 0x84, 0x19, 0x08, 0xda, 0x78, 0xfb, 0x66, 0x8d, 0xfb, 0x51, 0xc5, 0x00, 0xf9, \n  0xe2, 0xf5, 0x7a, 0x28, 0xfe, 0x2f, 0x84, 0xfe, 0x33, 0xbd, 0xf5, 0x21, 0x7e, 0xfb, 0xcf, 0x8d, \n  0xf9, 0x03, 0x4b, 0xf7, 0x90, 0x0b, 0xfe, 0x02, 0x9f, 0x00, 0x74, 0xb5, 0xfb, 0xda, 0x38, 0xff, \n  0xa9, 0xec, 0xfe, 0x6d, 0x6f, 0xf8, 0x44, 0xba, 0x71, 0xe9, 0x3a, 0x59, 0xe4, 0xd9, 0xc9, 0x9f, \n  0x01, 0xf1, 0x59, 0x51, 0x18, 0xdb, 0xb4, 0xfb, 0xea, 0x0a, 0xee, 0x2a, 0xb7, 0xd6, 0xa1, 0x35, \n  0x19, 0x42, 0x50, 0x36, 0x07, 0xfc, 0xed, 0x08, 0x18, 0xd7, 0xce, 0xf0, 0xed, 0xed, 0x85, 0x03, \n  0x6b, 0x37, 0x0d, 0xc7, 0xf0, 0x07, 0xff, 0x65, 0xfb, 0xb1, 0x7f, 0x00, 0x5a, 0x5f, 0x00, 0x41, \n  0x6e, 0xf4, 0x4c, 0x9d, 0x00, 0xfd, 0x31, 0xff, 0xc9, 0x72, 0xf5, 0x6b, 0x0c, 0xfa, 0xcb, 0x65, \n  0xf9, 0x81, 0x31, 0xf8, 0xfb, 0x57, 0xfc, 0x97, 0x10, 0xff, 0xb4, 0xa2, 0xfa, 0x24, 0x40, 0xff, \n  0xea, 0x74, 0xff, 0xe8, 0xa9, 0xf8, 0x9e, 0xf4, 0x6b, 0xa5, 0x76, 0x5a, 0x1f, 0x0b, 0xd4, 0x1c, \n  0xf0, 0xf1, 0x08, 0x13, 0x13, 0x66, 0xdc, 0xfa, 0x11, 0xbb, 0xf1, 0x9b, 0xa8, 0xd1, 0x59, 0x71, \n  0x0c, 0x54, 0xa3, 0x39, 0xa4, 0xa4, 0xf7, 0x28, 0x6a, 0xd8, 0xc5, 0xb7, 0xee, 0x37, 0xf8, 0xfe, \n  0x84, 0x97, 0x08, 0x02, 0xe1, 0x0a, 0x1a, 0xe2, 0xfb, 0xac, 0x25, 0x02, 0x8e, 0x9c, 0x03, 0x55, \n  0x4b, 0xf2, 0x3d, 0x73, 0x01, 0x2b, 0x7e, 0x01, 0x36, 0xe3, 0xf3, 0x56, 0x82, 0xf9, 0x6f, 0x6d, \n  0xf9, 0x71, 0xa8, 0xf6, 0x1d, 0x43, 0xfa, 0xfa, 0x70, 0xfe, 0x28, 0x0f, 0xfa, 0x07, 0x5f, 0xff, \n  0x45, 0x78, 0x01, 0xde, 0x68, 0xf8, 0x6f, 0x3e, 0x64, 0x22, 0x2a, 0x5a, 0x40, 0x30, 0xe0, 0xc2, \n  0x39, 0xf5, 0x64, 0x18, 0x0e, 0xaa, 0x12, 0xfa, 0xdb, 0x9b, 0xf4, 0x2f, 0x81, 0xcc, 0x9e, 0xfb, \n  0xff, 0xd3, 0x12, 0x3c, 0xe4, 0x57, 0x02, 0x5e, 0x08, 0xd9, 0xe1, 0xea, 0xef, 0x26, 0x2b, 0xfd, \n  0x1a, 0x1f, 0x00, 0x0a, 0x1b, 0x0e, 0xc9, 0xb9, 0xff, 0x1f, 0x8e, 0xff, 0x00, 0x9f, 0x08, 0x53, \n  0x38, 0xf3, 0xb6, 0x76, 0xfe, 0x60, 0x9b, 0x04, 0xbf, 0x49, 0xf4, 0xf6, 0x5d, 0xf7, 0x91, 0x03, \n  0xf9, 0x1f, 0x94, 0xf5, 0x7b, 0xa3, 0xf7, 0xac, 0x69, 0xfe, 0xdf, 0x3b, 0xfb, 0xe0, 0xce, 0xfe, \n  0x99, 0x13, 0x03, 0x14, 0xc0, 0xf8, 0x33, 0x7e, 0x5d, 0xb7, 0x44, 0x5a, 0xe1, 0x15, 0xec, 0x26, \n  0x2a, 0xf6, 0x79, 0x70, 0x06, 0x31, 0x76, 0xfa, 0x2d, 0xde, 0xfa, 0x7b, 0x37, 0xcb, 0xa0, 0x0f, \n  0xf2, 0x57, 0x3b, 0x39, 0xd7, 0xad, 0x0d, 0x13, 0x6c, 0xda, 0x78, 0xe9, 0xf0, 0xf6, 0x3f, 0x00, \n  0xd2, 0xc0, 0xf6, 0xee, 0x58, 0x0c, 0x64, 0x3b, 0x07, 0x27, 0x30, 0xfd, 0x1f, 0x35, 0x0a, 0x99, \n  0x20, 0xf8, 0xc9, 0xe6, 0xfa, 0xea, 0x64, 0x04, 0x92, 0xc0, 0xf6, 0x1f, 0xad, 0xf5, 0x79, 0xb0, \n  0xf7, 0xe0, 0xa4, 0xf5, 0x1b, 0x4b, 0xf6, 0xb1, 0xd7, 0xfd, 0x00, 0x01, 0xfd, 0x6d, 0x39, 0xfe, \n  0x8f, 0x4b, 0x03, 0x95, 0x3d, 0xfa, 0x93, 0x43, 0x59, 0x44, 0xcc, 0x59, 0xec, 0xbe, 0xef, 0x26, \n  0xc0, 0xf8, 0xea, 0xd7, 0x09, 0xec, 0x22, 0xf6, 0xdb, 0xe2, 0xf7, 0x5e, 0x13, 0xd1, 0xa6, 0xa9, \n  0xe9, 0x2a, 0x49, 0x30, 0x8e, 0x50, 0x18, 0xae, 0x1f, 0xde, 0xfd, 0x98, 0xee, 0xaa, 0xbd, 0x05, \n  0x0e, 0x6d, 0xf1, 0xf2, 0x01, 0x06, 0x1f, 0xb9, 0x0e, 0x3f, 0x4b, 0xfe, 0xb7, 0x45, 0x07, 0x1a, \n  0xc5, 0xfc, 0xea, 0xe1, 0xf9, 0xac, 0x0c, 0x01, 0x23, 0x9d, 0xfa, 0x2b, 0x63, 0xf5, 0xdc, 0x97, \n  0xf5, 0x4e, 0x34, 0xf8, 0x92, 0x14, 0xf5, 0x53, 0x37, 0xfc, 0x62, 0xca, 0xfe, 0x0c, 0xc9, 0xfd, \n  0x1d, 0x3f, 0x02, 0x0d, 0xec, 0xfa, 0xb9, 0x07, 0x5b, 0x85, 0x53, 0x56, 0x33, 0x2b, 0xec, 0x3c, \n  0x04, 0xfd, 0x7a, 0x4a, 0x0f, 0x0a, 0x93, 0xf1, 0xd7, 0xa0, 0xf0, 0xf1, 0x35, 0xd8, 0x32, 0x94, \n  0xe9, 0xbf, 0x01, 0x24, 0xf6, 0xb4, 0x1d, 0x67, 0x27, 0xe4, 0x9e, 0xcc, 0xeb, 0x7a, 0xa2, 0x0a, \n  0x38, 0x86, 0xf0, 0x6c, 0xa3, 0x00, 0xc6, 0x06, 0x11, 0xf6, 0xc8, 0xff, 0x62, 0x5d, 0x05, 0x38, \n  0x55, 0xfd, 0x33, 0xc9, 0xfb, 0x3e, 0xbf, 0xfe, 0xd3, 0x97, 0xfa, 0x56, 0xae, 0xf8, 0xa1, 0xce, \n  0xf4, 0x4c, 0x1d, 0xfa, 0x93, 0x23, 0xf6, 0x91, 0xb5, 0xf8, 0xc5, 0xe8, 0xfe, 0xab, 0x7e, 0xfd, \n  0xf3, 0x96, 0x01, 0x05, 0xd7, 0xfb, 0xea, 0x64, 0x5a, 0x80, 0xb5, 0x54, 0x10, 0x87, 0xe9, 0x7c, \n  0xa4, 0xff, 0x30, 0x04, 0x15, 0x52, 0x87, 0xed, 0xf3, 0x41, 0xec, 0xb1, 0x44, 0xdf, 0x77, 0xf5, \n  0xe8, 0x4d, 0xad, 0x17, 0x4f, 0x6a, 0x21, 0x5f, 0xa2, 0xed, 0x89, 0x4c, 0xe7, 0xab, 0x61, 0x0e, \n  0x9f, 0x67, 0xf3, 0x18, 0xaf, 0xf9, 0x39, 0xa8, 0x13, 0xff, 0x1f, 0xfe, 0x8a, 0xbf, 0x02, 0x32, \n  0x13, 0x02, 0xcf, 0xc7, 0xf9, 0x01, 0xcc, 0xfd, 0xdc, 0x18, 0xfe, 0xd3, 0x37, 0xfb, 0xb3, 0x80, \n  0xf5, 0xff, 0x7a, 0xfb, 0x63, 0x5b, 0xf7, 0xc6, 0x25, 0xf5, 0x4b, 0xb1, 0xfd, 0x3d, 0xed, 0xfc, \n  0x4c, 0x22, 0x01, 0x4b, 0x3c, 0xfe, 0xa5, 0x5b, 0x5d, 0x72, 0x96, 0x4d, 0x37, 0x75, 0xe5, 0x81, \n  0xcc, 0x06, 0x6f, 0x9d, 0x15, 0xc4, 0xdc, 0xe9, 0x29, 0x84, 0xeb, 0xa0, 0x47, 0xe4, 0x19, 0xbc, \n  0xe7, 0xcb, 0x05, 0x0e, 0x78, 0xe9, 0x24, 0x4c, 0x9e, 0xf4, 0xae, 0xf4, 0xe3, 0x52, 0xe0, 0x0e, \n  0x3d, 0x6b, 0xf9, 0xaf, 0x30, 0xf5, 0x37, 0x0e, 0x0f, 0x0c, 0xd8, 0x01, 0x26, 0x67, 0xfe, 0x2b, \n  0xc4, 0x00, 0xa1, 0x51, 0xfe, 0xa2, 0x52, 0xfd, 0x85, 0x1d, 0x01, 0x4e, 0xeb, 0xfd, 0xa1, 0xe7, \n  0xf4, 0x94, 0xba, 0xfb, 0x16, 0x2a, 0xf9, 0x7a, 0xe3, 0xf4, 0xe1, 0x62, 0xf9, 0xf5, 0x2d, 0xfc, \n  0x36, 0x3d, 0x01, 0x84, 0xdd, 0xfd, 0x0e, 0x20, 0x5f, 0xc0, 0x63, 0x4b, 0x47, 0xdc, 0xdc, 0x38, \n  0xe0, 0x08, 0xfd, 0x6e, 0x1e, 0xb3, 0x9f, 0xe5, 0xef, 0x88, 0xe5, 0x90, 0x64, 0xeb, 0x09, 0xba, \n  0xed, 0xd7, 0x1e, 0x03, 0xcf, 0x40, 0x20, 0xaf, 0xaf, 0x00, 0x22, 0x85, 0xe2, 0x6d, 0x24, 0x0a, \n  0x62, 0x74, 0x00, 0x01, 0x5e, 0xf3, 0xea, 0x4f, 0x0a, 0x0d, 0x29, 0x03, 0x16, 0xaa, 0xfb, 0x02, \n  0x88, 0xfe, 0x6d, 0xcc, 0x03, 0x18, 0xce, 0x00, 0x29, 0xc0, 0xff, 0xfb, 0x6b, 0x00, 0xf6, 0xfc, \n  0xf5, 0xe5, 0x35, 0xfa, 0xbc, 0x7b, 0xfb, 0x5c, 0x8e, 0xf5, 0x17, 0x3b, 0xf7, 0x3e, 0x20, 0xfa, \n  0x73, 0x06, 0xff, 0xd4, 0x5b, 0xfd, 0x96, 0x79, 0x60, 0x22, 0x26, 0x48, 0x4c, 0x0c, 0xd3, 0x09, \n  0xe3, 0x0c, 0x16, 0x8d, 0x28, 0x99, 0x4d, 0xdf, 0x12, 0xe8, 0xdf, 0x03, 0xe8, 0xf3, 0xec, 0x45, \n  0xf4, 0xf0, 0x15, 0xf9, 0x2b, 0x8c, 0x19, 0x79, 0x80, 0x0b, 0x17, 0xd2, 0xe2, 0x48, 0x8b, 0x04, \n  0x98, 0xfc, 0x05, 0x46, 0x14, 0xf2, 0x3c, 0x69, 0x06, 0x73, 0xa4, 0x04, 0x6a, 0x8a, 0xfa, 0x9e, \n  0x66, 0xfe, 0xd8, 0x51, 0x05, 0xcd, 0x87, 0x02, 0xe0, 0xab, 0x01, 0x97, 0xf6, 0x00, 0xa1, 0x96, \n  0xf6, 0xe5, 0x62, 0xfa, 0x77, 0xde, 0xfb, 0x6f, 0x50, 0xf6, 0xc0, 0xa3, 0xf7, 0xb5, 0x14, 0xf9, \n  0xd5, 0xc3, 0xfa, 0x6f, 0x8c, 0xfb, 0x13, 0xee, 0x61, 0x41, 0x6f, 0x41, 0x19, 0xd6, 0xca, 0xa5, \n  0xc1, 0x14, 0xf7, 0x80, 0x2e, 0x5f, 0xce, 0xd8, 0x5d, 0xaf, 0xde, 0x3a, 0x4b, 0xfa, 0x8b, 0x71, \n  0xf9, 0x73, 0x80, 0xf2, 0xfc, 0x98, 0x11, 0xe9, 0x3c, 0x12, 0x2a, 0x2c, 0xe6, 0x0a, 0x14, 0x01, \n  0x18, 0x35, 0x07, 0x51, 0x16, 0xf0, 0xb3, 0xd1, 0x05, 0xae, 0x41, 0x08, 0x83, 0x98, 0xf8, 0xe5, \n  0x4a, 0xfe, 0x3c, 0x3e, 0x07, 0x26, 0xad, 0xff, 0x4c, 0xcf, 0x03, 0x68, 0xbd, 0x04, 0xc8, 0xb8, \n  0xf4, 0x6b, 0x39, 0xfb, 0x5e, 0x1b, 0xfd, 0x43, 0xc7, 0xf4, 0xec, 0x7f, 0xf9, 0xdb, 0x72, 0xfa, \n  0x50, 0xda, 0xf6, 0x34, 0xd9, 0xf8, 0x27, 0x2d, 0x62, 0xe3, 0x50, 0x38, 0xfa, 0xa2, 0xc6, 0x33, \n  0x8c, 0x1e, 0x0a, 0x87, 0x2f, 0x49, 0xfa, 0xd3, 0xa5, 0xae, 0xe0, 0xd3, 0x07, 0x00, 0xa2, 0xf5, \n  0xfb, 0x1c, 0x03, 0xeb, 0xe9, 0xc7, 0x0d, 0xbc, 0xc1, 0x18, 0xd4, 0x69, 0xe6, 0x47, 0xce, 0xfc, \n  0xd1, 0x9f, 0x0a, 0x30, 0x17, 0xf1, 0xb7, 0x7e, 0x01, 0x18, 0x87, 0x0b, 0x9f, 0x7f, 0xfc, 0x98, \n  0x3a, 0xfb, 0x73, 0x01, 0x06, 0x2b, 0x95, 0x00, 0xe4, 0x4d, 0x02, 0x9a, 0xa3, 0x06, 0x29, 0xd7, \n  0xf7, 0xed, 0x21, 0xf9, 0xa5, 0x30, 0xfe, 0xf4, 0x46, 0xf6, 0x5f, 0xc5, 0xf7, 0xc6, 0x0d, 0xfd, \n  0x4f, 0x55, 0xf7, 0x05, 0x51, 0xf5, 0x8f, 0xc4, 0x5d, 0x16, 0x52, 0x30, 0x8f, 0x7d, 0xc9, 0xb3, \n  0x2b, 0x25, 0x6f, 0x95, 0x2b, 0x07, 0x98, 0xd3, 0x58, 0xe8, 0xe6, 0xb9, 0x6e, 0x01, 0x95, 0xcf, \n  0xf9, 0xad, 0xbe, 0xe8, 0xc0, 0xd1, 0x0c, 0xc4, 0x3a, 0x1a, 0x87, 0xd4, 0xe5, 0x32, 0xa0, 0xfa, \n  0x91, 0x82, 0x0e, 0xd4, 0xad, 0xf2, 0x37, 0xaa, 0xfc, 0x02, 0x4b, 0x0d, 0x7e, 0xaa, 0x00, 0xca, \n  0x91, 0xf9, 0x3a, 0x3d, 0x04, 0x66, 0x72, 0x00, 0x46, 0x3b, 0x01, 0x58, 0xf7, 0x06, 0x78, 0x88, \n  0xf9, 0xd4, 0x28, 0xf9, 0x0b, 0x43, 0xff, 0xc2, 0x95, 0xf7, 0xf0, 0xd9, 0xf6, 0x23, 0x7f, 0xfd, \n  0x57, 0x52, 0xf9, 0x66, 0x4d, 0xf5, 0xaf, 0xbf, 0x55, 0x8e, 0xf3, 0x2a, 0xe1, 0xc7, 0xd0, 0x4a, \n  0x9b, 0x26, 0x00, 0x82, 0x27, 0x15, 0x59, 0xd8, 0x86, 0x5c, 0xea, 0x2e, 0x15, 0x00, 0x81, 0x25, \n  0xfb, 0xad, 0x92, 0xe8, 0xea, 0x62, 0x08, 0xe3, 0xad, 0x1a, 0x1f, 0x80, 0xe9, 0x09, 0xf4, 0xf7, \n  0xe7, 0xb7, 0x0e, 0xbb, 0x16, 0xf7, 0x58, 0xd6, 0xfa, 0x5d, 0x31, 0x0b, 0xbe, 0x36, 0x02, 0xb4, \n  0x3a, 0xfb, 0x94, 0x4c, 0x04, 0x36, 0x03, 0xfe, 0x05, 0x9f, 0x00, 0x40, 0xd1, 0x07, 0x41, 0x78, \n  0xf8, 0xae, 0x2d, 0xfa, 0x1a, 0xa7, 0x01, 0x31, 0xd6, 0xf7, 0xbb, 0x37, 0xf7, 0x7b, 0x08, 0xfe, \n  0x13, 0x15, 0xfa, 0xb2, 0xbc, 0xf6, 0x76, 0x02, 0x4c, 0x71, 0x60, 0x28, 0x15, 0x60, 0xd8, 0xd3, \n  0x33, 0x24, 0xc3, 0x6e, 0x26, 0x88, 0x14, 0xdd, 0xe8, 0xbb, 0xea, 0x46, 0x5b, 0x01, 0x14, 0x22, \n  0xfd, 0x09, 0xaa, 0xe7, 0xff, 0x2f, 0x04, 0x42, 0x0a, 0x1b, 0x30, 0xfc, 0xed, 0xab, 0x10, 0xf5, \n  0x13, 0x56, 0x0e, 0x73, 0xba, 0xfb, 0x01, 0xfb, 0xf8, 0x67, 0xc1, 0x08, 0x28, 0xf5, 0x03, 0x00, \n  0xde, 0xfb, 0x6f, 0xcf, 0x03, 0xf8, 0xd0, 0xfe, 0x52, 0x08, 0xff, 0xf0, 0x36, 0x06, 0xb8, 0x7c, \n  0xfa, 0x0c, 0x70, 0xf9, 0xff, 0x80, 0x01, 0xe0, 0xe0, 0xfa, 0x5c, 0x90, 0xf7, 0x50, 0x3d, 0xfe, \n  0xb7, 0x2b, 0xfb, 0x78, 0x42, 0xf7, 0xb4, 0x90, 0x3d, 0xa2, 0x12, 0x1f, 0xbd, 0x80, 0xe5, 0x8e, \n  0x56, 0x29, 0x6d, 0x0a, 0x22, 0xd4, 0xd9, 0xdc, 0x69, 0xe2, 0xee, 0x03, 0xb7, 0x05, 0xae, 0x7a, \n  0xfb, 0xd1, 0x40, 0xf1, 0x75, 0x3a, 0x05, 0x4c, 0x11, 0x07, 0xbb, 0xaf, 0xf1, 0xbd, 0x2f, 0x05, \n  0x27, 0x1a, 0x0b, 0x34, 0x0e, 0xf8, 0x5d, 0x91, 0xfa, 0x23, 0x27, 0x04, 0x8b, 0x9b, 0x01, 0x6e, \n  0x19, 0xfb, 0xc4, 0xe2, 0xfe, 0xf2, 0x6b, 0x00, 0x78, 0x7b, 0xff, 0x73, 0xc5, 0xff, 0x7e, 0x32, \n  0xfe, 0xb4, 0xab, 0x02, 0xc4, 0xad, 0x03, 0x27, 0xbe, 0x00, 0xa9, 0x2b, 0x01, 0x3d, 0xa3, 0xff, \n  0xcf, 0x54, 0xfc, 0xc1, 0xce, 0xfc, 0x48, 0x90, 0x34, 0xbd, 0x60, 0x1d, 0xc4, 0x78, 0xec, 0x4a, \n  0xa6, 0x23, 0xfb, 0xac, 0x1e, 0xd7, 0x7b, 0xe4, 0x56, 0x90, 0xf1, 0x26, 0xb6, 0x03, 0x27, 0x57, \n  0xfb, 0x93, 0x59, 0xf3, 0x79, 0x8a, 0x04, 0xe1, 0xc6, 0x06, 0x2d, 0x4c, 0xf4, 0x4f, 0x6e, 0x03, \n  0xba, 0x79, 0x09, 0x37, 0x19, 0xfa, 0x2c, 0x8c, 0xfa, 0x93, 0x44, 0x02, 0x6d, 0x69, 0x01, 0x71, \n  0x3e, 0xfc, 0x8c, 0x8a, 0xfe, 0x55, 0xaf, 0xff, 0x52, 0x12, 0x00, 0x7e, 0x15, 0x01, 0xcf, 0x80, \n  0xfe, 0x07, 0x36, 0x01, 0x9f, 0x6e, 0x03, 0x90, 0x26, 0x01, 0x4f, 0x23, 0x00, 0xde, 0x27, 0xff, \n  0xf6, 0x2c, 0xfd, 0x74, 0x0c, 0xfd, 0xa7, 0x21, 0x2d, 0x2b, 0x16, 0x1c, 0xad, 0xfa, 0xf1, 0xf8, \n  0x45, 0x1e, 0xc0, 0x8a, 0x1c, 0x1f, 0x2a, 0xeb, 0xe8, 0xe6, 0xf2, 0x8c, 0x7a, 0x02, 0xaf, 0x36, \n  0xfc, 0x61, 0x36, 0xf5, 0x86, 0xa3, 0x03, 0xee, 0xbd, 0x06, 0x67, 0xf7, 0xf6, 0xcd, 0x79, 0x01, \n  0x02, 0x29, 0x08, 0x92, 0x84, 0xfc, 0x64, 0x72, 0xfa, 0xe6, 0x0a, 0x01, 0x9c, 0xb6, 0x01, 0x8e, \n  0xf8, 0xfc, 0x93, 0xa2, 0xfe, 0x0b, 0xcc, 0xff, 0x4c, 0xa5, 0x00, 0xfb, 0x4f, 0x01, 0xf6, 0xa1, \n  0xfe, 0x76, 0x3f, 0x01, 0xc3, 0x87, 0x02, 0x26, 0x4b, 0x00, 0x35, 0x91, 0x00, 0x8e, 0xf1, 0xff, \n  0xaa, 0x87, 0xfd, 0x3c, 0x10, 0xfd, 0xb3, 0x0d, 0x27, 0xf5, 0xa7, 0x1a, 0x88, 0x80, 0xf5, 0x43, \n  0xf7, 0x19, 0x2b, 0xdc, 0x1a, 0xce, 0xe7, 0xef, 0x0d, 0x8c, 0xf4, 0x1a, 0x16, 0x02, 0xa3, 0x0b, \n  0xfd, 0x2f, 0xe7, 0xf6, 0x4c, 0xef, 0x02, 0x10, 0xb9, 0x06, 0x5d, 0x79, 0xf8, 0x28, 0x0b, 0x00, \n  0x8d, 0x7c, 0x07, 0xeb, 0x8d, 0xfd, 0x07, 0x89, 0xfa, 0xfc, 0x97, 0x00, 0x75, 0xda, 0x01, 0x41, \n  0xc3, 0xfd, 0x11, 0xa0, 0xfe, 0x60, 0x5d, 0x00, 0x48, 0x15, 0x01, 0x07, 0xa3, 0x00, 0x46, 0x14, \n  0xff, 0xad, 0x21, 0x01, 0x70, 0x6b, 0x01, 0x5a, 0x25, 0x00, 0xb2, 0x0d, 0x01, 0xe9, 0xab, 0x00, \n  0x8b, 0xfe, 0xfd, 0x10, 0x58, 0xfd, 0x00, 0x57, 0x22, 0x09, 0x8b, 0x18, 0xc9, 0xef, 0xf7, 0x2d, \n  0x06, 0x17, 0x4b, 0x91, 0x18, 0xd9, 0xbf, 0xf3, 0x2e, 0x8d, 0xf6, 0xcf, 0x97, 0x01, 0xda, 0x33, \n  0xfe, 0xe0, 0x58, 0xf8, 0xa5, 0x32, 0x02, 0xaf, 0x6f, 0x06, 0x2c, 0x7a, 0xf9, 0x6c, 0x49, 0xff, \n  0xe5, 0x7b, 0x06, 0xaf, 0x2c, 0xfe, 0xe9, 0xfc, 0xfa, 0x65, 0x65, 0x00, 0x6c, 0x26, 0x02, 0x80, \n  0x24, 0xfe, 0x7b, 0x10, 0xff, 0x69, 0xf6, 0x00, 0x7a, 0x7d, 0x00, 0x34, 0x61, 0x00, 0x08, 0x7c, \n  0xff, 0xca, 0x81, 0x00, 0x3b, 0x57, 0x01, 0x13, 0x97, 0x00, 0x2d, 0x0b, 0x01, 0x72, 0x0b, 0x01, \n  0x1c, 0xb4, 0xfe, 0x46, 0xc1, 0xfd, 0xd0, 0x3a, 0x1e, 0x35, 0x79, 0x16, 0x16, 0x48, 0xfa, 0x5b, \n  0x11, 0x14, 0xf6, 0x24, 0x16, 0x04, 0xa9, 0xf7, 0xac, 0x64, 0xf8, 0x66, 0x78, 0x01, 0x58, 0x37, \n  0xff, 0x0e, 0x4f, 0xf9, 0xe2, 0x05, 0x02, 0x0c, 0xd5, 0x05, 0x57, 0x0e, 0xfa, 0x3f, 0x06, 0xff, \n  0xae, 0xbf, 0x05, 0x20, 0xb1, 0xfe, 0xaf, 0x61, 0xfb, 0x3e, 0xa6, 0x00, 0xea, 0x63, 0x02, 0xb5, \n  0xbd, 0xfe, 0x37, 0xbe, 0xff, 0x4c, 0x6c, 0x00, 0xb7, 0x44, 0x00, 0xb1, 0xd5, 0x00, 0xa5, 0x76, \n  0xff, 0x1f, 0xa2, 0x00, 0xcb, 0x99, 0x01, 0x62, 0xde, 0x00, 0x76, 0x34, 0x01, 0x85, 0xf9, 0x00, \n  0x3e, 0x25, 0xff, 0xf4, 0x5b, 0xfe, 0xfb, 0x1f, 0x1a, 0x7f, 0x0e, 0x14, 0xc0, 0x3e, 0xfc, 0x0d, \n  0x03, 0x12, 0x7f, 0xd1, 0x14, 0xdf, 0xe1, 0xfa, 0x47, 0xa2, 0xf9, 0xb4, 0x69, 0x01, 0xde, 0x0c, \n  0x00, 0x60, 0x7f, 0xfa, 0x18, 0x8d, 0x01, 0xfe, 0xc9, 0x04, 0x9f, 0xee, 0xfa, 0xbf, 0x16, 0xff, \n  0x3b, 0xde, 0x04, 0xd3, 0xd9, 0xfe, 0x60, 0x8d, 0xfc, 0xbf, 0x37, 0x01, 0xfd, 0xfc, 0x01, 0x3f, \n  0x3d, 0xff, 0x00, 0xf1, 0xff, 0xc2, 0x53, 0x00, 0xce, 0xe8, 0x00, 0xfc, 0x09, 0x01, 0xd7, 0x83, \n  0xff, 0xde, 0xcc, 0x00, 0x9f, 0xd3, 0x01, 0xca, 0x00, 0x01, 0x88, 0x2d, 0x01, 0x66, 0x13, 0x01, \n  0x2a, 0x62, 0xff, 0xb0, 0x1a, 0xff, 0x99, 0x40, 0x16, 0x00, 0x65, 0x12, 0x53, 0x09, 0xfe, 0x96, \n  0xa6, 0x0f, 0x42, 0x5e, 0x13, 0x5f, 0xaf, 0xfd, 0xf0, 0x13, 0xfb, 0x5e, 0x6e, 0x01, 0x8c, 0xab, \n  0x00, 0x56, 0x37, 0xfb, 0xc8, 0xdf, 0x00, 0x0c, 0x3d, 0x04, 0x4d, 0xd7, 0xfb, 0x08, 0x01, 0xff, \n  0x1c, 0x04, 0x04, 0x56, 0x94, 0xff, 0x3a, 0x94, 0xfd, 0x24, 0xcb, 0x00, 0x01, 0x24, 0x02, 0x95, \n  0x0f, 0x00, 0xd3, 0x17, 0x00, 0x95, 0xed, 0x00, 0xc0, 0x20, 0x01, 0x3d, 0xd3, 0x00, 0xce, 0xfd, \n  0xff, 0xda, 0xf3, 0x00, 0x54, 0xc7, 0x01, 0x87, 0x13, 0x01, 0x2d, 0x10, 0x01, 0x18, 0x44, 0x01, \n  0x0c, 0xe4, 0xff, 0xe9, 0xeb, 0xfe, 0x44, 0x21, 0x13, 0x47, 0xb8, 0x10, 0xb8, 0x62, 0xff, 0x9d, \n  0xe9, 0x0d, 0x69, 0x0e, 0x12, 0xee, 0xe8, 0xff, 0xc0, 0x83, 0xfc, 0x99, 0x8b, 0x01, 0xf9, 0xf1, \n  0x00, 0xeb, 0xd7, 0xfb, 0x84, 0x81, 0x00, 0xde, 0xd8, 0x03, 0x46, 0xff, 0xfc, 0xaf, 0x06, 0xff, \n  0x34, 0x15, 0x03, 0xb4, 0x3c, 0x00, 0x80, 0x8b, 0xfe, 0xba, 0x14, 0x01, 0xb3, 0xc9, 0x02, 0x45, \n  0xcc, 0x00, 0x96, 0x8c, 0x00, 0x40, 0x37, 0x01, 0x37, 0x1d, 0x01, 0x8c, 0x09, 0x01, 0x01, 0x6c, \n  0x00, 0x81, 0x23, 0x01, 0xdd, 0xae, 0x01, 0x5f, 0x34, 0x01, 0x2d, 0x4a, 0x01, 0xa0, 0x82, 0x00, \n  0xc9, 0xd9, 0xfe, 0x7a, 0x46, 0xfe, 0xaf, 0x86, 0x10, 0x97, 0x3b, 0x0f, 0x6a, 0xa9, 0x00, 0x2c, \n  0x9d, 0x0c, 0x5a, 0x8b, 0x10, 0x25, 0x10, 0x01, 0x70, 0xd7, 0xfd, 0xf4, 0x20, 0x02, 0x7b, 0xbd, \n  0x00, 0x04, 0x0e, 0xfc, 0x58, 0xc7, 0x00, 0x7e, 0xf9, 0x03, 0x56, 0x33, 0xfd, 0x9a, 0x38, 0xfe, \n  0x7e, 0x38, 0x03, 0x40, 0xa0, 0x01, 0x5f, 0x70, 0xff, 0xe1, 0xdb, 0x01, 0x7e, 0x2b, 0x03, 0x90, \n  0xd4, 0x00, 0xfc, 0x03, 0x01, 0x8a, 0x95, 0x01, 0xa0, 0x24, 0x01, 0x9c, 0x3f, 0x01, 0xa4, 0xad, \n  0x00, 0xc9, 0x23, 0x01, 0xa6, 0x2c, 0x01, 0xb0, 0x27, 0x00, 0xcb, 0x2b, 0x00, 0x4b, 0xa5, 0xff, \n  0x14, 0x88, 0xfe, 0xaa, 0x3f, 0xfe, 0xb6, 0x63, 0x0f, 0x04, 0xfd, 0x0e, 0x64, 0x6b, 0x01, 0xa1, \n  0xa1, 0x0a, 0xf2, 0x8c, 0x0e, 0x48, 0xbb, 0x01, 0x78, 0xe3, 0xfe, 0x7b, 0xb4, 0x02, 0x0b, 0xd0, \n  0x00, 0x4b, 0x2f, 0xfc, 0x6e, 0x7a, 0x00, 0x44, 0xa8, 0x03, 0x45, 0xf4, 0xfd, 0xfd, 0xc4, 0xfe, \n  0xbc, 0x4a, 0x04, 0x6e, 0x11, 0x03, 0x89, 0xc9, 0xff, 0x0f, 0x03, 0x02, 0x8d, 0x97, 0x03, 0x8e, \n  0xb0, 0x01, 0x6f, 0x87, 0x01, 0x60, 0x3a, 0x01, 0xce, 0x1b, 0x01, 0xc2, 0x51, 0x01, 0xeb, 0x07, \n  0x00, 0x3e, 0x8c, 0xff, 0xc6, 0xc5, 0xff, 0x64, 0xec, 0xff, 0xdd, 0xe8, 0xff, 0xb5, 0x55, 0xff, \n  0x2d, 0x1e, 0xfe, 0x23, 0x35, 0xfd, 0x0f, 0x5a, 0x0d, 0xd7, 0x07, 0x0d, 0x79, 0x1a, 0x02, 0xb1, \n  0x11, 0x0b, 0x24, 0xd8, 0x0d, 0xb8, 0xf3, 0x01, 0x00, 0x0e, 0x00, 0xc4, 0xe6, 0x02, 0x33, 0xf9, \n  0xff, 0x8d, 0x77, 0xfc, 0x2c, 0x39, 0x01, 0x8e, 0x10, 0x04, 0xb1, 0x09, 0xff, 0xd8, 0xef, 0xff, \n  0xe5, 0x81, 0x04, 0x54, 0x30, 0x03, 0xca, 0x39, 0x01, 0x05, 0x54, 0x03, 0x9c, 0xb4, 0x03, 0x33, \n  0x8d, 0x01, 0xcc, 0x0d, 0x01, 0x8d, 0xf2, 0x00, 0xe1, 0x7a, 0x00, 0xa1, 0x86, 0xff, 0x76, 0xc1, \n  0xfe, 0x47, 0x12, 0xff, 0xcc, 0xb9, 0xff, 0x22, 0x08, 0x00, 0xdb, 0x39, 0xff, 0xe4, 0x76, 0xfe, \n  0x90, 0xcb, 0xfd, 0x01, 0x95, 0xfd, 0xf7, 0x6d, 0x0c, 0x14, 0xbc, 0x0c, 0x02, 0xc8, 0x02, 0x5d, \n  0x45, 0x0a, 0xe5, 0xbc, 0x0c, 0x05, 0x29, 0x02, 0x0e, 0xd6, 0xff, 0x52, 0x62, 0x02, 0x39, 0x3c, \n  0x01, 0xe7, 0x3d, 0xfe, 0xf0, 0x8f, 0x01, 0x2d, 0x4c, 0x04, 0x2a, 0xff, 0xff, 0xb9, 0x16, 0x01, \n  0x8e, 0xc7, 0x05, 0x98, 0xac, 0x04, 0xe9, 0xfe, 0x01, 0x50, 0xc5, 0x02, 0xf9, 0x18, 0x03, 0xa4, \n  0xce, 0x00, 0xe2, 0xb3, 0xff, 0x24, 0x47, 0xff, 0x89, 0x14, 0xff, 0x4f, 0x6d, 0xff, 0x58, 0xbb, \n  0xfe, 0x69, 0xe0, 0xfe, 0xb4, 0xbd, 0xff, 0x94, 0x3e, 0xff, 0x9d, 0xb2, 0xfe, 0x44, 0xa5, 0xfe, \n  0x52, 0x30, 0xfe, 0x20, 0x06, 0xfe, 0x56, 0xa7, 0x0a, 0x49, 0x9d, 0x0b, 0x4c, 0x1e, 0x04, 0xf2, \n  0xed, 0x09, 0xcc, 0xba, 0x0a, 0x73, 0xe2, 0x02, 0x92, 0xba, 0x01, 0x95, 0xcd, 0x02, 0x80, 0x25, \n  0x02, 0xc4, 0x5d, 0xff, 0x4f, 0x57, 0x01, 0xae, 0xe2, 0x04, 0xe6, 0x55, 0x02, 0xda, 0xd0, 0x02, \n  0xa7, 0xbf, 0x05, 0x51, 0x34, 0x04, 0xc6, 0xb6, 0x01, 0x19, 0xbe, 0x01, 0xb4, 0xf8, 0x00, 0x7c, \n  0xa6, 0xfe, 0x92, 0xd7, 0xfe, 0x19, 0x64, 0xff, 0xb4, 0xf3, 0xfe, 0xb4, 0xcc, 0xfe, 0x34, 0x1c, \n  0xfe, 0x37, 0xa4, 0xfe, 0xca, 0xbd, 0xff, 0x67, 0x5d, 0xff, 0x71, 0xd8, 0xfe, 0xa0, 0x86, 0xfe, \n  0xe6, 0x1a, 0xfe, 0x67, 0x3e, 0xfe, 0x45, 0xbe, 0x09, 0x5f, 0xad, 0x0a, 0xb2, 0x07, 0x04, 0xb5, \n  0x3d, 0x09, 0x87, 0x43, 0x0b, 0x44, 0x29, 0x05, 0xe7, 0x81, 0x02, 0xf9, 0xa6, 0x02, 0xed, 0x0b, \n  0x03, 0x41, 0x79, 0x01, 0x3d, 0xbe, 0x02, 0x32, 0x2f, 0x05, 0x1d, 0xb4, 0x03, 0x36, 0x7a, 0x03, \n  0xeb, 0x5e, 0x04, 0xc4, 0x8e, 0x02, 0x27, 0xc3, 0xff, 0x78, 0x8e, 0xff, 0x03, 0x00, 0x00, 0x8c, \n  0x37, 0xff, 0x0a, 0xfd, 0xfe, 0xe5, 0x43, 0xfe, 0xfd, 0xef, 0xfd, 0x34, 0x9f, 0xfe, 0xaf, 0xff, \n  0xfe, 0x26, 0x8f, 0xff, 0x60, 0x75, 0xff, 0x4c, 0xb9, 0xfe, 0x40, 0x97, 0xfe, 0x68, 0xd2, 0xfe, \n  0x8a, 0x97, 0xfe, 0x9d, 0x01, 0xfe, 0x68, 0xc7, 0x08, 0xae, 0xd5, 0x0b, 0xaa, 0xbe, 0x06, 0x86, \n  0xb6, 0x08, 0x62, 0x46, 0x0a, 0xb2, 0xc6, 0x05, 0xab, 0x6b, 0x03, 0x39, 0xbb, 0x04, 0x3d, 0xac, \n  0x04, 0x7a, 0x0f, 0x02, 0x82, 0x7c, 0x03, 0xe8, 0x12, 0x05, 0x50, 0xef, 0x01, 0xa7, 0x42, 0x01, \n  0xce, 0x89, 0x02, 0xef, 0xd0, 0x00, 0xc2, 0xd7, 0xfe, 0xb3, 0x21, 0xff, 0xd2, 0x59, 0xff, 0x09, \n  0x70, 0xfe, 0x26, 0x2b, 0xfe, 0xa6, 0x5e, 0xfe, 0xa7, 0x7c, 0xfe, 0xa1, 0xe9, 0xfe, 0xc0, 0x3d, \n  0xff, 0x2f, 0x6c, 0xff, 0x0c, 0x15, 0xff, 0x15, 0x7c, 0xfe, 0xf2, 0x93, 0xfe, 0xfa, 0x94, 0xfe, \n  0x5a, 0x55, 0xfe, 0xdf, 0x4c, 0xfe, 0xda, 0xef, 0x07, 0x5a, 0x11, 0x0c, 0x23, 0xed, 0x07, 0x91, \n  0xe6, 0x08, 0x96, 0x37, 0x0c, 0x7e, 0xa9, 0x09, 0xd8, 0x06, 0x05, 0x8b, 0xdf, 0x03, 0xd6, 0x5f, \n  0x04, 0xb4, 0x50, 0x02, 0xdd, 0x9b, 0x01, 0x92, 0x1e, 0x02, 0xe8, 0x80, 0x00, 0x2a, 0x72, 0x00, \n  0x24, 0xb1, 0x01, 0xf0, 0x83, 0x00, 0xce, 0x81, 0xfe, 0x4a, 0x61, 0xfe, 0xfa, 0xb1, 0xfe, 0x26, \n  0x28, 0xfe, 0xe6, 0x42, 0xfe, 0x61, 0xb2, 0xfe, 0x4c, 0xc9, 0xfe, 0xfd, 0x17, 0xff, 0x95, 0x16, \n  0xff, 0x4b, 0xd2, 0xfe, 0x11, 0xaa, 0xfe, 0xfc, 0x9b, 0xfe, 0xaa, 0xcc, 0xfe, 0x6d, 0xb7, 0xfe, \n  0x6f, 0x61, 0xfe, 0xf7, 0x2e, 0xfe, 0xcb, 0xd1, 0x08, 0x5f, 0x49, 0x0e, 0x51, 0x64, 0x0a, 0x99, \n  0xe7, 0x0a, 0x1d, 0x36, 0x0c, 0x7a, 0x35, 0x08, 0x15, 0xa5, 0x05, 0x7d, 0x1b, 0x05, 0x5f, 0xfb, \n  0x02, 0x81, 0x41, 0xff, 0x55, 0x28, 0xff, 0x39, 0xf0, 0x01, 0x57, 0x2b, 0x01, 0x80, 0x44, 0xff, \n  0x2f, 0x6a, 0x00, 0x7a, 0x83, 0x00, 0x87, 0xc8, 0xfd, 0x65, 0xc3, 0xfd, 0x82, 0x87, 0xff, 0x25, \n  0xc4, 0xfe, 0xb4, 0x18, 0xfe, 0xcd, 0xbf, 0xfe, 0xd4, 0xe2, 0xfe, 0x7f, 0xdc, 0xfe, 0x76, 0x1d, \n  0xff, 0xb7, 0xe6, 0xfe, 0xe3, 0x8d, 0xfe, 0x0f, 0xaf, 0xfe, 0x43, 0xa4, 0xfe, 0x06, 0x9d, 0xfe, \n  0xb5, 0xc1, 0xfe, 0x32, 0x7b, 0xfe, 0xcd, 0x7a, 0x0a, 0xda, 0x3f, 0x12, 0x92, 0x63, 0x0d, 0x93, \n  0x86, 0x09, 0x1f, 0x28, 0x09, 0xa9, 0xd3, 0x06, 0xbc, 0xcc, 0x04, 0x20, 0xc7, 0x03, 0x1b, 0x42, \n  0x02, 0x7a, 0x63, 0x00, 0x75, 0x64, 0x00, 0xf9, 0x46, 0x00, 0x90, 0xfc, 0xfe, 0x56, 0x93, 0xff, \n  0xa5, 0x53, 0x00, 0x8f, 0x4b, 0xff, 0xba, 0x4a, 0xfe, 0x4b, 0xa3, 0xfe, 0xe4, 0xf4, 0xfe, 0xdc, \n  0x84, 0xfe, 0x13, 0xd0, 0xfe, 0x3e, 0xd9, 0xfe, 0x12, 0x93, 0xfe, 0xbc, 0xef, 0xfe, 0xa6, 0xc9, \n  0xfe, 0x08, 0xb1, 0xfe, 0xb5, 0xc2, 0xfe, 0x16, 0xa1, 0xfe, 0x31, 0xa6, 0xfe, 0xad, 0x95, 0xfe, \n  0xf3, 0xae, 0xfe, 0xa2, 0x9c, 0xfe, 0xc8, 0x8a, 0x0b, 0xfc, 0x8b, 0x12, 0xb3, 0x58, 0x0c, 0xc9, \n  0x0a, 0x08, 0xa8, 0x2b, 0x07, 0x0f, 0xba, 0x05, 0x24, 0x9d, 0x05, 0xdc, 0x0b, 0x05, 0xde, 0x33, \n  0x02, 0x9b, 0x46, 0x01, 0x21, 0xa8, 0x02, 0xf6, 0xbc, 0x00, 0xdf, 0x9a, 0xfe, 0x91, 0xa0, 0xfe, \n  0x00, 0x18, 0xff, 0x94, 0x60, 0x00, 0xc4, 0xe2, 0xff, 0xd1, 0xf5, 0xfd, 0xaf, 0xff, 0xfd, 0x62, \n  0x80, 0xff, 0x92, 0x7e, 0xff, 0x29, 0x9b, 0xfe, 0x9e, 0xeb, 0xfe, 0x7e, 0xca, 0xfe, 0x5a, 0x7e, \n  0xfe, 0x4e, 0xd9, 0xfe, 0x0a, 0xa5, 0xfe, 0xe3, 0xac, 0xfe, 0x04, 0xda, 0xfe, 0x7c, 0xc4, 0xfe, \n  0xc4, 0xd4, 0xfe, 0x76, 0xba, 0xfe, 0xca, 0x65, 0x0a, 0x95, 0x9e, 0x10, 0xbc, 0xbf, 0x0a, 0xc1, \n  0xa4, 0x06, 0xe3, 0x7f, 0x06, 0x2e, 0x59, 0x05, 0xb0, 0x3e, 0x04, 0xce, 0x12, 0x05, 0xa6, 0x07, \n  0x05, 0x37, 0xa6, 0x02, 0xfe, 0x13, 0x03, 0x82, 0x6b, 0x03, 0x48, 0x36, 0x00, 0x35, 0xee, 0xfe, \n  0xb4, 0xdf, 0xff, 0xac, 0x92, 0xff, 0x7c, 0xa7, 0xfe, 0x3b, 0x06, 0xff, 0x26, 0xb3, 0xff, 0x6a, \n  0xef, 0xfe, 0x36, 0xa7, 0xfe, 0x37, 0x7c, 0xff, 0x4d, 0x3f, 0xff, 0xff, 0x4f, 0xfe, 0xc7, 0x41, \n  0xfe, 0x0d, 0xc3, 0xfe, 0x01, 0xc8, 0xfe, 0x00, 0xc8, 0xfe, 0x89, 0xfd, 0xfe, 0xa0, 0x00, 0xff, \n  0x76, 0x19, 0xff, 0x83, 0xfd, 0xfe, 0xd6, 0x5b, 0x09, 0xe5, 0xc8, 0x0d, 0x42, 0x9a, 0x08, 0xc1, \n  0xba, 0x06, 0xcb, 0x16, 0x06, 0x7e, 0x1b, 0x04, 0xe7, 0x03, 0x04, 0x10, 0x98, 0x03, 0xf4, 0x2d, \n  0x02, 0x4b, 0x69, 0x03, 0xae, 0x09, 0x06, 0x96, 0xe9, 0x04, 0x37, 0x35, 0x03, 0x15, 0x45, 0x02, \n  0x42, 0x66, 0x00, 0xb4, 0x5c, 0x00, 0xfc, 0xfe, 0xff, 0x3a, 0x47, 0xfe, 0x13, 0x5b, 0xfe, 0x44, \n  0x86, 0xff, 0xf9, 0xb3, 0xff, 0x1b, 0x97, 0xfe, 0x10, 0x1c, 0xfe, 0x25, 0xdf, 0xfe, 0xf9, 0x08, \n  0xff, 0x94, 0x87, 0xfe, 0x26, 0xae, 0xfe, 0x2b, 0x1f, 0xff, 0x10, 0x31, 0xff, 0xd0, 0x49, 0xff, \n  0x95, 0x0a, 0xff, 0x43, 0xc2, 0xfe, 0x43, 0xc7, 0x07, 0xbc, 0x36, 0x0a, 0xe4, 0x4e, 0x05, 0x17, \n  0xf7, 0x05, 0xcb, 0x4f, 0x07, 0xe8, 0x07, 0x06, 0xef, 0xf3, 0x03, 0x80, 0x24, 0x00, 0xa5, 0x0f, \n  0x00, 0xa6, 0xa1, 0x03, 0x42, 0xcb, 0x04, 0x7d, 0x6a, 0x04, 0x55, 0xa9, 0x05, 0x55, 0x9b, 0x05, \n  0x9c, 0x7b, 0x04, 0x13, 0x24, 0x04, 0x05, 0x6f, 0x01, 0x97, 0x4f, 0xff, 0x7d, 0xbd, 0xff, 0xee, \n  0xe7, 0xfe, 0xeb, 0xff, 0xfd, 0x2f, 0xdb, 0xfe, 0x37, 0x7e, 0xff, 0xbd, 0xb4, 0xfe, 0x72, 0x63, \n  0xfe, 0x82, 0x12, 0xff, 0x48, 0x6a, 0xff, 0xcb, 0x3e, 0xff, 0xb5, 0xe2, 0xfe, 0x2f, 0x3c, 0xff, \n  0xbd, 0x7e, 0xff, 0x15, 0xff, 0xfe, 0x9f, 0xe8, 0x08, 0x8b, 0x9f, 0x0b, 0x27, 0x41, 0x04, 0x1f, \n  0x69, 0x03, 0xcd, 0xe7, 0x05, 0xfe, 0x75, 0x05, 0xc7, 0x96, 0x03, 0x90, 0x25, 0x00, 0xe5, 0xd0, \n  0xff, 0x74, 0xc6, 0x02, 0x57, 0x9b, 0x03, 0x50, 0x61, 0x02, 0x31, 0x1d, 0x03, 0x5a, 0xe6, 0x04, \n  0x65, 0x0d, 0x06, 0xe9, 0x74, 0x06, 0x77, 0x1d, 0x04, 0x37, 0xe9, 0x01, 0xbd, 0x67, 0x01, 0x9a, \n  0x19, 0x00, 0x40, 0x29, 0xff, 0x09, 0x81, 0xfe, 0x9f, 0xfe, 0xfd, 0x12, 0xe9, 0xfe, 0xfe, 0x94, \n  0xff, 0xad, 0xe8, 0xfe, 0xde, 0x80, 0xfe, 0x49, 0x5c, 0xff, 0xc8, 0xd2, 0xff, 0xb2, 0x46, 0xff, \n  0x7a, 0xee, 0xfe, 0x7e, 0xac, 0xfe, 0xb7, 0xb2, 0x09, 0xe4, 0x97, 0x0c, 0xee, 0x04, 0x05, 0x5c, \n  0xfe, 0x03, 0xc8, 0xfe, 0x05, 0x7e, 0x56, 0x05, 0xb2, 0xf2, 0x02, 0x65, 0xca, 0xfe, 0xc6, 0x82, \n  0xff, 0x40, 0x37, 0x04, 0x2c, 0x88, 0x03, 0x1e, 0xf0, 0xff, 0x89, 0xfb, 0x00, 0xe8, 0x64, 0x02, \n  0xcf, 0xdd, 0x02, 0x86, 0xf2, 0x04, 0x09, 0xa0, 0x04, 0x6a, 0x69, 0x03, 0xd5, 0xe9, 0x03, 0x0f, \n  0xea, 0x02, 0x6a, 0x82, 0x00, 0x70, 0x6f, 0xff, 0x75, 0x1d, 0xff, 0x03, 0x68, 0xfe, 0xde, 0x53, \n  0xfe, 0x45, 0xcf, 0xfe, 0xd3, 0x3f, 0xff, 0xcd, 0x4d, 0xff, 0xa8, 0xd6, 0xfe, 0x89, 0x24, 0xff, \n  0x15, 0xb5, 0xff, 0x8c, 0xe6, 0xfe, 0xd0, 0x2e, 0x0b, 0xb8, 0x1e, 0x0e, 0x7d, 0xc4, 0x04, 0xf8, \n  0x4a, 0x04, 0xd4, 0x96, 0x07, 0xf0, 0xda, 0x05, 0xd2, 0xf0, 0x01, 0x71, 0x34, 0xfd, 0xd4, 0x3c, \n  0xff, 0xb4, 0x28, 0x05, 0x8b, 0x13, 0x03, 0x40, 0x14, 0xff, 0x77, 0xa7, 0x00, 0x14, 0x54, 0x01, \n  0xce, 0x7e, 0x01, 0x83, 0x93, 0x02, 0x82, 0x47, 0x01, 0xda, 0xb7, 0x01, 0x81, 0x23, 0x04, 0x7b, \n  0xb3, 0x03, 0x10, 0x57, 0x02, 0x63, 0x1b, 0x02, 0x9e, 0x78, 0x00, 0xe0, 0xfd, 0xfe, 0x80, 0x76, \n  0xff, 0xaf, 0xcb, 0xfe, 0xc6, 0x37, 0xfe, 0x55, 0x38, 0xff, 0xcf, 0x8f, 0xff, 0x87, 0x30, 0xff, \n  0x64, 0xad, 0xfe, 0xf1, 0xa4, 0xfe, 0x51, 0x97, 0x0c, 0x8f, 0x84, 0x10, 0x47, 0x8b, 0x05, 0xdd, \n  0xe9, 0x03, 0xcd, 0xb9, 0x07, 0x4e, 0x26, 0x06, 0x9e, 0x58, 0x01, 0x14, 0x24, 0xfc, 0x6a, 0xc4, \n  0xff, 0xb9, 0xe1, 0x05, 0x86, 0xd3, 0x01, 0xf3, 0x11, 0xfe, 0xfc, 0xcf, 0x00, 0xc0, 0x1c, 0x01, \n  0x55, 0x14, 0x01, 0x06, 0x5e, 0x02, 0xaf, 0x18, 0x00, 0x55, 0x5e, 0xff, 0x74, 0xce, 0x01, 0x9b, \n  0x41, 0x02, 0x7f, 0x16, 0x02, 0x34, 0x60, 0x02, 0x8a, 0xd9, 0x01, 0x6f, 0x68, 0x01, 0xaf, 0xb1, \n  0x00, 0x91, 0x7d, 0xff, 0x9b, 0x56, 0xff, 0xfc, 0xa4, 0xff, 0xa3, 0x08, 0xff, 0xb4, 0xdb, 0xfe, \n  0xd9, 0x3a, 0xff, 0xa7, 0xa3, 0xfe, 0xce, 0x18, 0x0e, 0x9c, 0x7b, 0x12, 0xbb, 0xd5, 0x05, 0xae, \n  0x26, 0x04, 0x2b, 0xdb, 0x08, 0xbe, 0x6e, 0x06, 0x98, 0xb9, 0xff, 0xaa, 0xab, 0xfa, 0xa1, 0xd9, \n  0x00, 0xb5, 0xa2, 0x06, 0x2f, 0xad, 0x00, 0x9e, 0x78, 0xfd, 0xfb, 0xa2, 0x00, 0x9f, 0xa1, 0x00, \n  0xf7, 0xba, 0x00, 0xcb, 0x55, 0x02, 0xe6, 0x02, 0x00, 0x19, 0xc2, 0xfe, 0xbc, 0xe3, 0x00, 0x53, \n  0xae, 0x00, 0xe3, 0xed, 0xff, 0x73, 0xc9, 0x00, 0x2c, 0x2f, 0x01, 0x20, 0x8f, 0x01, 0x5e, 0xcb, \n  0x01, 0xfa, 0x4f, 0x01, 0xd1, 0xcc, 0x00, 0x5e, 0x57, 0x00, 0xfa, 0x09, 0x00, 0x03, 0xa6, 0xff, \n  0xae, 0xb2, 0xfe, 0x9a, 0x18, 0xfe, 0xa5, 0x71, 0x10, 0x86, 0x5b, 0x15, 0x37, 0xf0, 0x05, 0xcf, \n  0x59, 0x03, 0x61, 0x35, 0x09, 0xeb, 0x75, 0x06, 0x0c, 0x69, 0xfe, 0xeb, 0x48, 0xfa, 0x58, 0xf2, \n  0x01, 0x80, 0x42, 0x06, 0xc5, 0x49, 0xff, 0x6a, 0x43, 0xfd, 0xc3, 0xc9, 0x00, 0x16, 0x57, 0x00, \n  0xa0, 0x67, 0x00, 0x6d, 0x14, 0x02, 0xb8, 0xb3, 0xff, 0xb4, 0x8b, 0xfe, 0x7c, 0xbc, 0x00, 0x8d, \n  0x16, 0x00, 0xb6, 0x26, 0xff, 0xab, 0xb8, 0xff, 0x94, 0x43, 0xff, 0xf6, 0x01, 0x00, 0x29, 0x19, \n  0x01, 0x7b, 0xf1, 0x00, 0xd2, 0xc1, 0x01, 0x67, 0x67, 0x02, 0xaa, 0x3e, 0x01, 0xc4, 0x08, 0x00, \n  0x8e, 0x9c, 0xff, 0x2a, 0xc6, 0xfe, 0x3c, 0x58, 0x12, 0x44, 0xb2, 0x17, 0x16, 0x5b, 0x06, 0x48, \n  0x59, 0x03, 0xba, 0x07, 0x0a, 0xe4, 0x87, 0x06, 0x3c, 0x6d, 0xfc, 0xc8, 0x79, 0xf9, 0x4e, 0xf4, \n  0x03, 0xb3, 0x60, 0x06, 0x2d, 0x68, 0xfd, 0x1f, 0x1a, 0xfd, 0xae, 0x16, 0x01, 0x5f, 0xbf, 0xff, \n  0xa1, 0x26, 0x00, 0xad, 0x50, 0x02, 0x16, 0x9c, 0xff, 0xb7, 0x2b, 0xfe, 0xd7, 0x81, 0x00, 0x59, \n  0xe6, 0xff, 0x9f, 0xf8, 0xfe, 0x14, 0x48, 0xff, 0x96, 0x97, 0xfe, 0x96, 0x25, 0xff, 0x2c, 0x6d, \n  0xff, 0x3c, 0x76, 0xff, 0xe4, 0x3a, 0x01, 0x63, 0x40, 0x02, 0xe6, 0x0f, 0x02, 0xd3, 0xa0, 0x01, \n  0x47, 0x92, 0x00, 0xe3, 0x53, 0xff, 0xc5, 0xa6, 0x14, 0x4e, 0x23, 0x1a, 0x45, 0x2b, 0x06, 0xa6, \n  0x5c, 0x03, 0x00, 0x4c, 0x0b, 0x38, 0x07, 0x06, 0xd4, 0xcd, 0xf9, 0x75, 0x76, 0xf9, 0x70, 0x48, \n  0x06, 0x9e, 0xa1, 0x05, 0x2f, 0x94, 0xfb, 0x0a, 0x13, 0xfd, 0xf5, 0x3f, 0x01, 0x5d, 0x9e, 0xff, \n  0xf8, 0xac, 0xff, 0x3e, 0xf6, 0x01, 0x63, 0x95, 0xff, 0x7c, 0xf3, 0xfd, 0xb0, 0x5c, 0x00, 0x81, \n  0xcb, 0xff, 0x35, 0xb8, 0xfe, 0xa6, 0xed, 0xfe, 0xc5, 0x19, 0xfe, 0x35, 0xa4, 0xfe, 0xa5, 0xea, \n  0xfe, 0x45, 0xa6, 0xfe, 0xf7, 0x00, 0x00, 0x91, 0x23, 0x01, 0x6e, 0x3e, 0x01, 0x80, 0x15, 0x01, \n  0xf4, 0x43, 0x01, 0x18, 0xc8, 0x00, 0x94, 0x68, 0x16, 0xc7, 0x17, 0x1c, 0x44, 0xe5, 0x06, 0x50, \n  0xea, 0x03, 0x31, 0x22, 0x0c, 0xf7, 0xeb, 0x05, 0x18, 0x5d, 0xf7, 0xdd, 0xd6, 0xf8, 0x16, 0x08, \n  0x09, 0x14, 0x89, 0x05, 0x9a, 0x52, 0xf9, 0x50, 0xf7, 0xfc, 0xb3, 0xb7, 0x01, 0x3c, 0x8f, 0xff, \n  0xff, 0x5a, 0xff, 0x35, 0xa0, 0x01, 0x77, 0xa8, 0xff, 0x93, 0xa1, 0xfd, 0xb7, 0x0b, 0x00, 0xcf, \n  0x18, 0x00, 0x11, 0xb7, 0xfe, 0xf9, 0x7f, 0xfe, 0x56, 0xce, 0xfd, 0xe6, 0x86, 0xfe, 0x33, 0x91, \n  0xfe, 0x11, 0x35, 0xfe, 0xfa, 0x98, 0xff, 0x33, 0x4c, 0x00, 0x27, 0x5d, 0x00, 0x72, 0x63, 0x00, \n  0xf4, 0x71, 0x00, 0x8e, 0x51, 0x00, 0xc1, 0x0c, 0x18, 0xfa, 0x84, 0x1e, 0x92, 0xcf, 0x07, 0x2c, \n  0xf7, 0x03, 0x57, 0xa0, 0x0c, 0x9e, 0x37, 0x06, 0xac, 0x89, 0xf5, 0xd3, 0xf0, 0xf7, 0x8c, 0x44, \n  0x0b, 0x8e, 0x74, 0x05, 0xdd, 0x5a, 0xf7, 0xde, 0x2e, 0xfd, 0x47, 0x1f, 0x02, 0x7d, 0x41, 0xff, \n  0xca, 0x25, 0xff, 0xee, 0x3a, 0x01, 0x08, 0xc9, 0xff, 0x52, 0xea, 0xfd, 0x77, 0x72, 0xff, 0x18, \n  0xd0, 0xff, 0xca, 0xea, 0xfe, 0x8c, 0x35, 0xfe, 0xdf, 0xc3, 0xfd, 0xa5, 0xa3, 0xfe, 0xd2, 0x23, \n  0xfe, 0x48, 0xc6, 0xfd, 0x51, 0x38, 0xff, 0xea, 0xf1, 0xff, 0x74, 0x4e, 0x00, 0xb6, 0xf0, 0xff, \n  0x01, 0x73, 0xff, 0x82, 0x62, 0xff, 0xac, 0xb7, 0x1a, 0x7a, 0xbf, 0x21, 0xcb, 0xdf, 0x06, 0xa8, \n  0xa5, 0x03, 0x76, 0x0c, 0x0e, 0x18, 0xf4, 0x04, 0x2d, 0x4e, 0xf4, 0x36, 0xab, 0xf8, 0xcd, 0xe5, \n  0x0b, 0xc9, 0xa1, 0x04, 0x46, 0x61, 0xf6, 0x6c, 0x79, 0xfd, 0x3c, 0x57, 0x02, 0xfb, 0xf9, 0xfe, \n  0xc6, 0xaa, 0xfe, 0xf5, 0x01, 0x01, 0x05, 0x35, 0x00, 0xd0, 0xd1, 0xfd, 0x10, 0xca, 0xfe, 0xdf, \n  0xa2, 0xff, 0x6a, 0x04, 0xff, 0xe7, 0x02, 0xfe, 0x93, 0x95, 0xfd, 0x72, 0x99, 0xfe, 0x9b, 0xb8, \n  0xfd, 0xd8, 0x7a, 0xfd, 0x0f, 0x72, 0xff, 0xe1, 0xb3, 0xff, 0x29, 0xd3, 0xff, 0xc8, 0xb0, 0xff, \n  0x3e, 0xd5, 0xfe, 0xec, 0xe1, 0xfe, 0xd7, 0xb4, 0x1c, 0x6d, 0x21, 0x24, 0xf7, 0xe4, 0x06, 0x50, \n  0x22, 0x04, 0xd9, 0x14, 0x0f, 0xf8, 0xfb, 0x03, 0xe2, 0x3f, 0xf3, 0x82, 0x92, 0xf8, 0x0a, 0x72, \n  0x0c, 0x22, 0xbb, 0x04, 0x63, 0x40, 0xf5, 0x34, 0x1e, 0xfd, 0x31, 0xb8, 0x02, 0xf4, 0xd9, 0xfe, \n  0xe7, 0x44, 0xfe, 0xe6, 0xde, 0x00, 0x67, 0x7c, 0x00, 0xd2, 0x96, 0xfd, 0xd1, 0x25, 0xfe, 0xfa, \n  0x82, 0xff, 0x44, 0x4c, 0xff, 0x21, 0xfb, 0xfd, 0xb5, 0xe8, 0xfc, 0xa2, 0x20, 0xfe, 0xc1, 0xdd, \n  0xfd, 0x9a, 0x75, 0xfd, 0xb8, 0x42, 0xff, 0x76, 0xa9, 0xff, 0x2b, 0x4e, 0xff, 0x71, 0x3d, 0xff, \n  0xf9, 0xea, 0xfe, 0xe0, 0x8c, 0xfe, 0xf4, 0xa0, 0x1d, 0x39, 0xc0, 0x25, 0xb7, 0xd3, 0x07, 0x50, \n  0x81, 0x05, 0x63, 0x4f, 0x10, 0xd0, 0xfb, 0x02, 0x13, 0x44, 0xf2, 0x6f, 0x6b, 0xf8, 0xd1, 0x68, \n  0x0c, 0x8a, 0x40, 0x05, 0xd6, 0xbb, 0xf4, 0xfa, 0x0e, 0xfc, 0x57, 0xde, 0x02, 0xa5, 0x4e, 0xff, \n  0x96, 0x18, 0xfe, 0x91, 0x2b, 0x00, 0x22, 0x92, 0x00, 0x43, 0x03, 0xfe, 0xef, 0x79, 0xfd, 0x8a, \n  0x53, 0xff, 0x39, 0x87, 0xff, 0xef, 0x52, 0xfd, 0xb7, 0x88, 0xfc, 0x6a, 0x36, 0xfe, 0xe1, 0xdb, \n  0xfd, 0xb0, 0x69, 0xfd, 0x54, 0x9c, 0xfe, 0x6f, 0xfc, 0xfe, 0x02, 0xcf, 0xff, 0x8f, 0x9d, 0xff, \n  0xba, 0x51, 0xfe, 0xfa, 0x04, 0xfe, 0x00, 0x64, 0x1e, 0x59, 0xfd, 0x26, 0x66, 0x92, 0x09, 0x5c, \n  0xb5, 0x06, 0xba, 0xe6, 0x0f, 0xf0, 0x15, 0x03, 0x21, 0x2d, 0xf3, 0xbf, 0x65, 0xf7, 0xb8, 0xfb, \n  0x0a, 0x42, 0x0c, 0x06, 0x16, 0xc2, 0xf4, 0xa3, 0xd7, 0xfa, 0x58, 0x74, 0x03, 0x14, 0xb1, 0xff, \n  0xd3, 0x35, 0xfd, 0x93, 0xde, 0xff, 0xd2, 0x7d, 0x00, 0x15, 0xb2, 0xfe, 0x1e, 0x02, 0xfe, 0x1f, \n  0xf8, 0xfd, 0xd1, 0xd9, 0xfe, 0x0b, 0xc1, 0xfd, 0xec, 0x33, 0xfc, 0x92, 0xf1, 0xfd, 0xd6, 0xf9, \n  0xfd, 0x14, 0x08, 0xfd, 0x3b, 0xf9, 0xfd, 0x50, 0xf0, 0xfe, 0xd6, 0xee, 0xff, 0xb0, 0xa8, 0xff, \n  0xe7, 0x5e, 0xfe, 0xca, 0xd0, 0xfd, 0xf0, 0x59, 0x1f, 0x40, 0x31, 0x27, 0x2d, 0x81, 0x0b, 0xed, \n  0xa7, 0x08, 0x59, 0x3e, 0x0e, 0x11, 0xde, 0x03, 0x2a, 0x96, 0xf5, 0x79, 0xce, 0xf5, 0x45, 0xac, \n  0x08, 0x33, 0x50, 0x06, 0x4f, 0xd0, 0xf5, 0x88, 0x4b, 0xfa, 0x04, 0xbc, 0x02, 0x38, 0x37, 0x00, \n  0x1b, 0xee, 0xfc, 0x35, 0xee, 0xfe, 0xff, 0xcf, 0x00, 0x62, 0xc8, 0xff, 0xc5, 0xe9, 0xfd, 0x44, \n  0xba, 0xfc, 0x73, 0x8b, 0xfe, 0x48, 0xfc, 0xfd, 0xe6, 0xff, 0xfb, 0x75, 0x88, 0xfd, 0xea, 0x02, \n  0xfd, 0x16, 0x0d, 0xfd, 0x18, 0xab, 0xfe, 0x6a, 0x5a, 0xfe, 0x20, 0x77, 0xff, 0x31, 0xee, 0xff, \n  0x10, 0xb9, 0xfe, 0x98, 0x93, 0xfd, 0xaa, 0xd8, 0x20, 0xb6, 0xb3, 0x25, 0x52, 0xee, 0x0b, 0x54, \n  0xad, 0x0c, 0x25, 0x4a, 0x0e, 0x23, 0x77, 0x03, 0xac, 0x36, 0xf6, 0xe3, 0x62, 0xf5, 0x51, 0xb0, \n  0x07, 0x3c, 0xaf, 0x04, 0x5a, 0xc7, 0xf6, 0x8d, 0x20, 0xfb, 0xdb, 0xa0, 0x00, 0x8a, 0xf6, 0xff, \n  0x1f, 0x16, 0xfe, 0xd2, 0x28, 0xfe, 0x1c, 0xf8, 0xff, 0x9a, 0xa8, 0x00, 0xbd, 0x44, 0xfe, 0x3f, \n  0xac, 0xfb, 0xed, 0x8f, 0xfe, 0x70, 0x35, 0xfe, 0xa7, 0xd5, 0xfa, 0x7a, 0x95, 0xfc, 0x37, 0xb7, \n  0xfc, 0x2b, 0x39, 0xfd, 0x10, 0xb8, 0xfe, 0xd5, 0xee, 0xfd, 0xaf, 0x18, 0xff, 0x83, 0x25, 0x00, \n  0x44, 0xdc, 0xfe, 0x2d, 0x87, 0xfc, 0x7a, 0x6a, 0x22, 0x9b, 0xf1, 0x22, 0x5c, 0x3d, 0x0a, 0x1d, \n  0xd7, 0x12, 0xc8, 0xa1, 0x12, 0x0f, 0xb0, 0x01, 0x87, 0x43, 0xf3, 0x18, 0xbe, 0xf7, 0x1f, 0x1e, \n  0x0a, 0x4d, 0x2b, 0x00, 0x52, 0x41, 0xf6, 0x22, 0xdb, 0xfe, 0x22, 0xa7, 0xfe, 0xf1, 0x29, 0xfe, \n  0x5e, 0x90, 0x00, 0x73, 0xd3, 0xfd, 0xef, 0x08, 0xfe, 0xda, 0x08, 0x02, 0x4c, 0x48, 0xff, 0x25, \n  0x20, 0xfb, 0x30, 0xe4, 0xfe, 0xd8, 0x0d, 0xfe, 0x37, 0xba, 0xf9, 0xbc, 0x72, 0xfc, 0x17, 0x7e, \n  0xfc, 0x42, 0xb1, 0xfc, 0x3d, 0xfe, 0xfe, 0x23, 0xd2, 0xfd, 0xe5, 0x20, 0xff, 0x53, 0xac, 0xff, \n  0xf3, 0x83, 0xfe, 0x99, 0x6f, 0xfd, 0xf6, 0x08, 0x26, 0x97, 0x8c, 0x21, 0x55, 0xdc, 0x04, 0x26, \n  0x90, 0x17, 0x1a, 0xc9, 0x18, 0x3b, 0x04, 0xfe, 0x8a, 0x45, 0xf0, 0x07, 0xd2, 0xfc, 0x58, 0x52, \n  0x0b, 0xbb, 0x6c, 0xf9, 0x57, 0xd5, 0xf5, 0x94, 0xbd, 0x03, 0xa9, 0xbe, 0xfd, 0xd0, 0xef, 0xfa, \n  0x2a, 0x63, 0x01, 0x45, 0xd2, 0xfe, 0x23, 0x8f, 0xfc, 0xe6, 0x9a, 0x02, 0x67, 0x3b, 0x00, 0xdb, \n  0x57, 0xfa, 0xa7, 0xe1, 0xfe, 0xe9, 0x16, 0xfe, 0x6f, 0x96, 0xf9, 0x18, 0xc1, 0xfb, 0xf3, 0x1a, \n  0xfb, 0xc9, 0x94, 0xfc, 0x55, 0xad, 0xff, 0xba, 0x76, 0xfd, 0x13, 0xee, 0xfd, 0x24, 0x8d, 0xff, \n  0xdc, 0xba, 0xfe, 0x2d, 0xea, 0xfc, 0xa3, 0x86, 0x2a, 0xce, 0x44, 0x22, 0xea, 0x5f, 0xfe, 0x01, \n  0x72, 0x18, 0x0e, 0x75, 0x1f, 0xfe, 0x9c, 0xfc, 0x91, 0xfc, 0xec, 0x80, 0xc6, 0x01, 0x69, 0x3a, \n  0x0d, 0xfc, 0x69, 0xf2, 0x56, 0x70, 0xf4, 0xd4, 0x14, 0x09, 0x6d, 0x88, 0xfe, 0xec, 0x24, 0xf7, \n  0x27, 0xbe, 0x00, 0x65, 0x31, 0x01, 0xea, 0x8e, 0xfb, 0xef, 0xf1, 0x01, 0x53, 0xd7, 0x01, 0x42, \n  0xf0, 0xf9, 0x1a, 0x7f, 0xfe, 0xca, 0xa7, 0xfe, 0x6e, 0x96, 0xf9, 0x0b, 0xc8, 0xfa, 0x2d, 0x54, \n  0xfa, 0xf2, 0xdc, 0xfc, 0xd0, 0x7b, 0xff, 0xd6, 0xad, 0xfc, 0x13, 0x29, 0xfd, 0x94, 0x83, 0xff, \n  0xbd, 0xdf, 0xfe, 0xf8, 0xd5, 0xfc, 0xbb, 0x53, 0x2e, 0x02, 0x59, 0x25, 0xc8, 0x07, 0xf8, 0xb6, \n  0x4d, 0x15, 0xcb, 0x80, 0x26, 0x4a, 0x2d, 0xfe, 0x77, 0x7e, 0xe9, 0x9f, 0x6d, 0x05, 0x5b, 0x88, \n  0x10, 0x3b, 0x4d, 0xec, 0x47, 0xc3, 0xf0, 0x31, 0x17, 0x0e, 0x1c, 0xaf, 0x01, 0x36, 0x14, 0xf4, \n  0x35, 0xda, 0xfd, 0x6f, 0x54, 0x03, 0x04, 0x83, 0xfc, 0xd5, 0x5a, 0x00, 0x13, 0x5b, 0x03, 0xbf, \n  0x4e, 0xfa, 0xa9, 0xa6, 0xfd, 0xa2, 0x58, 0xff, 0x81, 0x83, 0xf9, 0x3a, 0xee, 0xfa, 0xe1, 0xd6, \n  0xf9, 0xb9, 0xc1, 0xfb, 0x8f, 0x35, 0xff, 0x01, 0x73, 0xfc, 0x35, 0xb1, 0xfc, 0x90, 0xe1, 0xfe, \n  0xbf, 0x60, 0xff, 0xdb, 0x2f, 0xfd, 0xaf, 0x31, 0x32, 0x0c, 0xb7, 0x28, 0x00, 0xa0, 0xf2, 0x69, \n  0x0a, 0x10, 0x58, 0x81, 0x2b, 0x5e, 0xa1, 0x01, 0x51, 0x90, 0xe6, 0xe6, 0x1a, 0x08, 0xfe, 0x5d, \n  0x14, 0x23, 0xeb, 0xe6, 0xac, 0x92, 0xeb, 0xf0, 0x75, 0x11, 0xff, 0x42, 0x06, 0xa9, 0x96, 0xf2, \n  0xaa, 0xa3, 0xf9, 0x56, 0x8f, 0x03, 0xba, 0x97, 0xfe, 0x76, 0x63, 0xff, 0x3e, 0x9c, 0x03, 0x96, \n  0x68, 0xfb, 0x36, 0x88, 0xfc, 0x1f, 0x52, 0xff, 0xc7, 0x3f, 0xfa, 0x8a, 0x96, 0xfa, 0x0e, 0x2c, \n  0xf9, 0x41, 0xf5, 0xfa, 0xdd, 0x3b, 0xfe, 0xbe, 0xea, 0xfb, 0x74, 0x01, 0xfd, 0x04, 0x75, 0xfe, \n  0xc8, 0xf3, 0xfe, 0x94, 0x8b, 0xfd, 0x2c, 0x7b, 0x37, 0x5a, 0xdc, 0x2a, 0x08, 0xc0, 0xed, 0xca, \n  0x84, 0x0b, 0x47, 0x7d, 0x2d, 0x9e, 0xfc, 0x04, 0xa5, 0x4d, 0xe5, 0x55, 0x60, 0x0b, 0xc0, 0xc8, \n  0x17, 0x60, 0xca, 0xe1, 0xbb, 0xf9, 0xe6, 0x41, 0xbf, 0x12, 0x07, 0x00, 0x0b, 0xf1, 0x5d, 0xf3, \n  0xff, 0x72, 0xf5, 0xe5, 0x07, 0x02, 0xff, 0x78, 0x00, 0x3a, 0x13, 0x00, 0xed, 0x2f, 0x03, 0x2d, \n  0x81, 0xfc, 0x08, 0x22, 0xfc, 0xc3, 0xb5, 0xfe, 0x4f, 0x1b, 0xfb, 0x7b, 0xcc, 0xf9, 0x45, 0xdf, \n  0xf8, 0xe1, 0x7a, 0xfa, 0x4f, 0x0f, 0xfd, 0x82, 0xe2, 0xfb, 0xa7, 0xf0, 0xfc, 0xf2, 0x8e, 0xfe, \n  0x47, 0x99, 0xfe, 0x54, 0x77, 0xfd, 0x09, 0x43, 0x3d, 0xad, 0xa8, 0x2c, 0x81, 0x06, 0xe9, 0xef, \n  0x30, 0x08, 0x20, 0x2f, 0x2d, 0xb8, 0xf7, 0x06, 0xc5, 0x01, 0xe6, 0x23, 0x30, 0x0f, 0xe3, 0xb8, \n  0x1a, 0x4f, 0x65, 0xdd, 0x84, 0x1d, 0xe3, 0xac, 0x06, 0x12, 0xf6, 0xd3, 0x0e, 0xef, 0x42, 0xf6, \n  0xbd, 0x1b, 0xf2, 0x34, 0x45, 0xff, 0x31, 0x21, 0x01, 0x90, 0xf8, 0x01, 0x9c, 0x3d, 0x03, 0xb4, \n  0xbc, 0xfc, 0x07, 0xe9, 0xfc, 0xe9, 0x90, 0xfd, 0xdb, 0xde, 0xfa, 0x12, 0x17, 0xfa, 0x14, 0x44, \n  0xf8, 0x92, 0xd5, 0xf9, 0x3e, 0xf9, 0xfc, 0xcb, 0xa2, 0xfb, 0x42, 0x44, 0xfc, 0x7f, 0x39, 0xff, \n  0xfc, 0x0d, 0xff, 0x23, 0xed, 0xfc, 0xee, 0xcd, 0x44, 0x76, 0x89, 0x2c, 0xf1, 0xa7, 0xe3, 0x14, \n  0x63, 0x07, 0xd6, 0x79, 0x2b, 0x2e, 0xae, 0x05, 0x05, 0x8e, 0xe7, 0xfd, 0x49, 0x15, 0x00, 0x19, \n  0x1c, 0x2f, 0x75, 0xd8, 0xbe, 0x46, 0xe1, 0x6f, 0x49, 0x10, 0x5d, 0xb0, 0x10, 0xe4, 0x94, 0xf9, \n  0x2e, 0x75, 0xf0, 0x99, 0x5a, 0xfc, 0xaa, 0x00, 0x00, 0x0e, 0x56, 0x04, 0xae, 0x01, 0x04, 0xc7, \n  0xa0, 0xfc, 0xb7, 0xe0, 0xfd, 0x61, 0x6c, 0xfb, 0xd6, 0xa3, 0xfa, 0x96, 0xbc, 0xfa, 0x5e, 0xf0, \n  0xf6, 0xa0, 0x5f, 0xfa, 0xf7, 0x93, 0xfc, 0xf0, 0x97, 0xfa, 0x09, 0xbe, 0xfc, 0x00, 0xe6, 0xff, \n  0x09, 0x5b, 0xff, 0xdf, 0x59, 0xfc, 0x27, 0x0b, 0x4c, 0xf5, 0x23, 0x2d, 0xce, 0x10, 0xde, 0x00, \n  0x92, 0x07, 0x18, 0xb4, 0x29, 0x60, 0x75, 0x02, 0xd6, 0x99, 0xe9, 0xa0, 0xaa, 0x1b, 0x4c, 0x15, \n  0x1e, 0x0f, 0x97, 0xd4, 0xe8, 0x5a, 0xdf, 0xd1, 0xa1, 0x0e, 0x85, 0x74, 0x11, 0x04, 0x82, 0xfc, \n  0xdd, 0x82, 0xf0, 0x48, 0x0c, 0xfa, 0x03, 0xb8, 0xfd, 0x14, 0x30, 0x06, 0x8c, 0x00, 0x06, 0xc7, \n  0xc9, 0xfc, 0xea, 0xe8, 0xfd, 0x73, 0xe8, 0xf9, 0x34, 0x7d, 0xfa, 0x95, 0xfd, 0xfa, 0x58, 0xd5, \n  0xf6, 0xcf, 0xb1, 0xfa, 0x64, 0xa9, 0xfb, 0x0b, 0x78, 0xfa, 0xa6, 0x55, 0xfd, 0xcc, 0x7c, 0x00, \n  0x63, 0xe2, 0xff, 0x04, 0x71, 0xfb, 0x76, 0x91, 0x54, 0xc1, 0x23, 0x2f, 0xd9, 0xf6, 0xd5, 0xd7, \n  0x40, 0x05, 0x7a, 0xab, 0x29, 0x85, 0xa6, 0x01, 0x23, 0x36, 0xeb, 0x9a, 0xe7, 0x1d, 0x0e, 0x28, \n  0x1f, 0x3d, 0xc5, 0xd3, 0x5d, 0x1c, 0xde, 0xa2, 0x6d, 0x0d, 0x59, 0x1e, 0x11, 0x05, 0x24, 0xfd, \n  0x8f, 0x7e, 0xf1, 0x74, 0x6c, 0xf9, 0x29, 0x19, 0xfb, 0xbb, 0x07, 0x07, 0xb4, 0xce, 0x08, 0x3c, \n  0x18, 0xfc, 0x48, 0xa4, 0xfc, 0xa0, 0x68, 0xfa, 0xfa, 0x17, 0xfa, 0x9a, 0x83, 0xfa, 0xa9, 0x48, \n  0xf7, 0x43, 0x2f, 0xfa, 0x09, 0xa8, 0xfb, 0x27, 0x1a, 0xfb, 0xca, 0x1e, 0xfd, 0xdf, 0xe1, 0x00, \n  0x4e, 0x3d, 0x00, 0x86, 0x85, 0xfa, 0xc6, 0x4e, 0x5c, 0x24, 0x30, 0x32, 0x0b, 0xe8, 0xcd, 0x50, \n  0xeb, 0x02, 0xa2, 0x1d, 0x2a, 0x2b, 0x71, 0x00, 0xb4, 0x5b, 0xec, 0x76, 0x58, 0x1e, 0xd2, 0x6d, \n  0x21, 0xca, 0xc4, 0xd4, 0x02, 0x9f, 0xdb, 0x4c, 0xf0, 0x0c, 0x00, 0x08, 0x11, 0xf3, 0x42, 0xfc, \n  0xad, 0x9e, 0xf2, 0x52, 0x87, 0xfa, 0xd7, 0x59, 0xf8, 0xe6, 0x41, 0x06, 0xc8, 0x2e, 0x0c, 0xa5, \n  0x40, 0xfb, 0xa6, 0x2b, 0xfb, 0x7c, 0x23, 0xfc, 0xe3, 0x6d, 0xf9, 0xc8, 0xeb, 0xf9, 0x74, 0xfc, \n  0xf7, 0xca, 0xcf, 0xf9, 0x5e, 0xf6, 0xfb, 0x3d, 0x98, 0xfb, 0x18, 0x18, 0xfd, 0x70, 0xf5, 0x00, \n  0x30, 0x1c, 0x00, 0x14, 0xf7, 0xf9, 0x3a, 0x9f, 0x63, 0x50, 0x40, 0x34, 0x41, 0x5b, 0xc7, 0x3e, \n  0xbf, 0x01, 0xca, 0xfa, 0x29, 0x2b, 0xac, 0xfe, 0x89, 0x6f, 0xec, 0xdf, 0xf7, 0x1d, 0x3e, 0xa8, \n  0x24, 0x15, 0xf7, 0xd6, 0x8e, 0x8d, 0xd8, 0x1a, 0x64, 0x0c, 0x6c, 0x46, 0x11, 0x5d, 0xb7, 0xfa, \n  0x9d, 0xd9, 0xf3, 0xe7, 0x76, 0xfc, 0xa6, 0xbc, 0xf5, 0xdd, 0x62, 0x04, 0xb9, 0xe5, 0x0e, 0x15, \n  0x12, 0xfb, 0xbb, 0x4a, 0xfa, 0xbf, 0xcb, 0xfd, 0x5a, 0xac, 0xf8, 0xf7, 0x95, 0xf9, 0x23, 0x09, \n  0xf9, 0xb5, 0x7d, 0xf9, 0xe1, 0xdb, 0xfb, 0xf3, 0x3b, 0xfc, 0x26, 0x2e, 0xfd, 0x8a, 0xad, 0x00, \n  0xc6, 0xe9, 0xff, 0x23, 0x5a, 0xf9, 0x9b, 0x27, 0x68, 0x68, 0xd8, 0x37, 0x90, 0x0c, 0xc3, 0x78, \n  0x41, 0x00, 0x95, 0x5c, 0x29, 0xcf, 0xe5, 0xfc, 0x67, 0x02, 0xeb, 0x27, 0x95, 0x1b, 0x79, 0xcc, \n  0x29, 0xc4, 0x76, 0xda, 0xf0, 0x97, 0xd4, 0xa4, 0x21, 0x0b, 0x4d, 0x3a, 0x11, 0xe8, 0x00, 0xfa, \n  0xc4, 0xa8, 0xf4, 0xeb, 0x0b, 0xfe, 0x89, 0xdc, 0xf3, 0x81, 0x61, 0x01, 0xb1, 0x41, 0x10, 0x71, \n  0x23, 0xfc, 0x79, 0xd5, 0xf9, 0x21, 0x89, 0xfe, 0xcc, 0xc6, 0xf8, 0x5b, 0x8d, 0xf9, 0xbc, 0x94, \n  0xf9, 0x97, 0x37, 0xf9, 0x1b, 0x9e, 0xfb, 0xb3, 0xbc, 0xfc, 0xee, 0x38, 0xfd, 0xa5, 0x19, 0x00, \n  0x73, 0x85, 0xff, 0x8f, 0x54, 0xf9, 0xc3, 0xc1, 0x6b, 0x02, 0x7f, 0x3a, 0x75, 0x5b, 0xc1, 0x40, \n  0x67, 0xff, 0x8f, 0xe2, 0x27, 0x76, 0xa5, 0xfb, 0x68, 0xb2, 0xe7, 0x95, 0xb8, 0x18, 0x6a, 0x8e, \n  0x2f, 0x83, 0xea, 0xdd, 0x96, 0x1d, 0xd2, 0x32, 0x3b, 0x09, 0xf1, 0x1c, 0x10, 0x39, 0xad, 0xfa, \n  0x29, 0x9a, 0xf5, 0x27, 0x92, 0xfe, 0x70, 0xe4, 0xf2, 0x6a, 0xb0, 0xfe, 0x87, 0xb6, 0x0f, 0x75, \n  0x18, 0xfe, 0x5b, 0x5e, 0xfa, 0x42, 0xf2, 0xfd, 0xaf, 0x3f, 0xfa, 0x42, 0x1b, 0xfa, 0x92, 0xe3, \n  0xf8, 0xf3, 0x90, 0xf9, 0x58, 0x8d, 0xfb, 0x6a, 0xf9, 0xfc, 0xaa, 0x4e, 0xfd, 0x81, 0x1a, 0xff, \n  0x0d, 0x55, 0xff, 0x6a, 0xd8, 0xf9, 0x27, 0x68, 0x6e, 0x10, 0xbd, 0x3b, 0xed, 0x63, 0xc2, 0x8b, \n  0x6a, 0xff, 0x8f, 0xd8, 0x25, 0x11, 0xd9, 0xfa, 0x5f, 0xc9, 0xe2, 0xf7, 0xec, 0x15, 0x3d, 0xe0, \n  0x34, 0x86, 0x24, 0xe1, 0x47, 0xf1, 0xd1, 0xfc, 0x9d, 0x06, 0x3b, 0xb3, 0x0d, 0x5f, 0xb7, 0xfc, \n  0xd7, 0x29, 0xf7, 0x15, 0xc1, 0xfd, 0xb1, 0x1f, 0xf2, 0x3a, 0x4d, 0xfd, 0xe3, 0x9e, 0x0d, 0x94, \n  0x0e, 0x00, 0x17, 0x65, 0xfc, 0x97, 0x38, 0xfc, 0x92, 0x70, 0xfc, 0x3b, 0x88, 0xfb, 0x61, 0x54, \n  0xf7, 0x22, 0x75, 0xfa, 0x9f, 0xb8, 0xfb, 0x23, 0xf3, 0xfc, 0x6e, 0xff, 0xfc, 0x96, 0x45, 0xfe, \n  0x1f, 0x5b, 0xff, 0x7f, 0x63, 0xf9, 0xc0, 0x57, 0x6e, 0xe5, 0xe9, 0x3d, 0xe4, 0x26, 0xc6, 0xb2, \n  0x9e, 0xff, 0x08, 0xed, 0x23, 0x26, 0x48, 0xf9, 0xba, 0x5a, 0xdd, 0x75, 0xb2, 0x12, 0x5e, 0x54, \n  0x39, 0xfc, 0x83, 0xe5, 0xa4, 0xd5, 0xd2, 0xf7, 0xf9, 0x02, 0x4a, 0x9f, 0x0a, 0x19, 0x06, 0x00, \n  0xbe, 0x57, 0xf9, 0xe7, 0x94, 0xfb, 0x1e, 0x52, 0xf1, 0x26, 0x7d, 0xfd, 0xfa, 0xa3, 0x0a, 0x6d, \n  0xf3, 0x00, 0xe8, 0x08, 0x00, 0x76, 0x5d, 0xfa, 0x38, 0xc9, 0xfd, 0xd2, 0x38, 0xfe, 0xab, 0xea, \n  0xf5, 0x25, 0x11, 0xfb, 0xb7, 0x43, 0xfc, 0xd9, 0x2c, 0xfc, 0x07, 0xdd, 0xfc, 0x75, 0x6c, 0xfd, \n  0x56, 0xbc, 0xfd, 0x5d, 0xbf, 0xf9, 0x74, 0x38, 0x6c, 0x47, 0xcc, 0x40, 0x39, 0x6f, 0xcb, 0x4d, \n  0x94, 0xff, 0x21, 0x2c, 0x22, 0xac, 0xbc, 0xf7, 0x30, 0x17, 0xd9, 0x58, 0x81, 0x0d, 0x07, 0x08, \n  0x3b, 0xa6, 0xe9, 0xeb, 0x50, 0xc2, 0xd4, 0x93, 0xed, 0xfe, 0x5f, 0x1c, 0x07, 0xdf, 0x4f, 0x03, \n  0xc7, 0xaf, 0xfb, 0x17, 0xbe, 0xf8, 0xdf, 0x28, 0xf1, 0xfd, 0x76, 0xfe, 0x48, 0x2d, 0x07, 0x3f, \n  0x1e, 0x00, 0x3b, 0x7b, 0x04, 0x51, 0x30, 0xfa, 0x3d, 0x09, 0xfd, 0xc4, 0x6e, 0x01, 0x4b, 0x10, \n  0xf6, 0x17, 0x58, 0xfa, 0x67, 0x10, 0xfd, 0x83, 0x17, 0xfc, 0x4b, 0x19, 0xfb, 0xe4, 0x29, 0xfb, \n  0x6c, 0x82, 0xfd, 0xef, 0x74, 0xfa, 0xcd, 0x37, 0x68, 0x3d, 0x29, 0x43, 0xf3, 0x7d, 0xd2, 0xc4, \n  0x96, 0x01, 0x3a, 0x34, 0x20, 0x24, 0xdf, 0xf4, 0xa0, 0x05, 0xd6, 0x6b, 0x0f, 0x07, 0x1b, 0x2e, \n  0x3b, 0xd8, 0x3a, 0xf4, 0xa7, 0x5d, 0xd6, 0x7a, 0xb5, 0xfa, 0x54, 0x40, 0x04, 0x1b, 0xc7, 0x05, \n  0x65, 0x21, 0xfe, 0x7c, 0xb0, 0xf6, 0x09, 0x47, 0xf1, 0xb7, 0x46, 0xff, 0x7f, 0x57, 0x04, 0xa6, \n  0x1d, 0xfe, 0x92, 0x20, 0x08, 0xd5, 0x8e, 0xfc, 0xb0, 0x00, 0xfb, 0xdb, 0xae, 0x03, 0xa1, 0x65, \n  0xf8, 0x62, 0xf6, 0xf8, 0x42, 0xde, 0xfd, 0x86, 0xfe, 0xfa, 0x16, 0x2a, 0xf8, 0x29, 0x00, 0xfb, \n  0x2e, 0xc7, 0xfc, 0x6b, 0x60, 0xfa, 0xd6, 0xa6, 0x63, 0xff, 0x01, 0x46, 0x72, 0x9a, 0xd9, 0x75, \n  0x7c, 0x02, 0x6a, 0x92, 0x1d, 0x61, 0xfc, 0xf4, 0x08, 0x0c, 0xd6, 0xda, 0x89, 0xfc, 0xf5, 0x87, \n  0x38, 0x06, 0x9a, 0xfe, 0x46, 0xd2, 0xd7, 0x49, 0xe6, 0xf7, 0xef, 0x94, 0x02, 0xa1, 0x24, 0x05, \n  0x1c, 0x99, 0x00, 0x69, 0x38, 0xf7, 0xd0, 0x2a, 0xf1, 0x1b, 0xdf, 0xff, 0x54, 0x41, 0x02, 0xf1, \n  0x4a, 0xfb, 0x3d, 0x55, 0x0a, 0x9b, 0x83, 0x00, 0xcd, 0x3b, 0xfa, 0xa5, 0x58, 0x03, 0x75, 0xde, \n  0xfb, 0xbf, 0xef, 0xf8, 0x33, 0x2c, 0xfb, 0x1d, 0x22, 0xfb, 0x26, 0x98, 0xf7, 0x9a, 0x4f, 0xf9, \n  0x6d, 0x2c, 0xfc, 0x2c, 0xe0, 0xfa, 0x9b, 0xaa, 0x5f, 0x42, 0xb8, 0x48, 0x31, 0xd4, 0xde, 0x59, \n  0xb3, 0x03, 0x34, 0x09, 0x1b, 0xf9, 0x44, 0xf4, 0xf8, 0x83, 0xd9, 0x72, 0xcf, 0xf1, 0xd8, 0x64, \n  0x31, 0x5f, 0x55, 0x09, 0x5f, 0x5d, 0xda, 0x85, 0x3d, 0xf5, 0x48, 0x00, 0x02, 0x63, 0x3b, 0x03, \n  0x6b, 0x87, 0x01, 0xd7, 0xc4, 0xf9, 0x8e, 0x07, 0xf2, 0x66, 0xd9, 0xfe, 0x7b, 0x67, 0x01, 0x15, \n  0x19, 0xf9, 0xa7, 0x15, 0x0a, 0x71, 0x21, 0x04, 0x7f, 0xf0, 0xfa, 0xa1, 0xc4, 0x02, 0x29, 0x38, \n  0xfd, 0x3a, 0x7e, 0xf8, 0x91, 0x80, 0xf9, 0x86, 0xa5, 0xfb, 0x06, 0xe0, 0xf7, 0x60, 0x0b, 0xf8, \n  0x1d, 0x80, 0xfb, 0xb2, 0x57, 0xfb, 0x65, 0x18, 0x5d, 0x69, 0x56, 0x49, 0x52, 0xa2, 0xe2, 0x8f, \n  0xd6, 0x06, 0x26, 0x33, 0x19, 0x66, 0xa3, 0xf1, 0x2a, 0x5c, 0xdd, 0xf5, 0xa8, 0xea, 0xff, 0xe4, \n  0x27, 0x27, 0x8a, 0x11, 0x33, 0x21, 0xdf, 0x9a, 0xc8, 0xf1, 0xa8, 0x47, 0x02, 0xd7, 0x92, 0x02, \n  0x2a, 0x05, 0x00, 0x07, 0x91, 0xfd, 0x6f, 0x48, 0xf4, 0x2a, 0x53, 0xfc, 0x12, 0x56, 0x02, 0x51, \n  0xa9, 0xf7, 0x3b, 0x12, 0x07, 0xa1, 0x58, 0x07, 0x54, 0xcc, 0xfc, 0x4c, 0xfa, 0x00, 0x14, 0xf8, \n  0xfc, 0xb5, 0xa5, 0xf9, 0x8c, 0xeb, 0xf8, 0x15, 0x46, 0xfc, 0x80, 0x94, 0xf9, 0xbd, 0xda, 0xf6, \n  0xff, 0xa1, 0xfb, 0x6f, 0x7c, 0xfb, 0x01, 0xa9, 0x5a, 0x96, 0x10, 0x4a, 0x04, 0x75, 0xe5, 0x62, \n  0xdd, 0x09, 0xdd, 0x83, 0x19, 0xef, 0x84, 0xed, 0xbd, 0xc7, 0xe0, 0x39, 0xcc, 0xe7, 0x07, 0x10, \n  0x1c, 0xa1, 0x60, 0x17, 0x31, 0xe4, 0xe6, 0x22, 0xce, 0xec, 0xe1, 0x8e, 0x02, 0x33, 0x19, 0x05, \n  0x70, 0xc4, 0xfc, 0xea, 0x51, 0x00, 0xc1, 0x21, 0xf9, 0x95, 0x83, 0xf9, 0x5c, 0x3a, 0x03, 0xb1, \n  0xc9, 0xf7, 0xcd, 0xa4, 0x01, 0x60, 0x47, 0x09, 0x68, 0x27, 0xff, 0x90, 0x7b, 0xfe, 0x16, 0x77, \n  0xfd, 0x59, 0xdb, 0xfb, 0xdb, 0xb2, 0xf9, 0x32, 0xdf, 0xfc, 0x43, 0xc7, 0xfb, 0x6b, 0x0c, 0xf8, \n  0x9e, 0x78, 0xfa, 0x1e, 0x70, 0xf9, 0x74, 0x22, 0x56, 0x2d, 0xf4, 0x4a, 0xa0, 0xa7, 0xea, 0x72, \n  0x60, 0x0a, 0xed, 0x8c, 0x18, 0x95, 0xb2, 0xec, 0xfd, 0x4e, 0xe4, 0xf5, 0xf7, 0xe3, 0x65, 0x71, \n  0x10, 0x67, 0x2d, 0x1c, 0xdf, 0x4a, 0xee, 0xcb, 0x32, 0xe8, 0x50, 0xc0, 0x02, 0x7b, 0x49, 0x08, \n  0x6f, 0x94, 0xf9, 0x80, 0xf0, 0x01, 0x04, 0xe6, 0xfe, 0xa8, 0xc4, 0xf6, 0x36, 0x53, 0x02, 0xef, \n  0x10, 0xfa, 0x8b, 0x8e, 0xfb, 0x1e, 0x34, 0x06, 0xf4, 0xf5, 0x02, 0x99, 0x44, 0xfe, 0xd1, 0xfc, \n  0xfc, 0x33, 0xe9, 0xfe, 0x1c, 0x2b, 0xfb, 0x4e, 0x16, 0xfe, 0x27, 0xf3, 0xfd, 0xe3, 0x32, 0xf8, \n  0xea, 0x8e, 0xf9, 0x03, 0xea, 0xf7, 0xbd, 0x0b, 0x53, 0xeb, 0x6a, 0x49, 0x64, 0x91, 0xef, 0xc3, \n  0x6b, 0x0b, 0xfe, 0x10, 0x15, 0x47, 0x27, 0xee, 0xd8, 0x85, 0xe7, 0xde, 0x6b, 0xdf, 0x1c, 0xf5, \n  0x07, 0xed, 0xf3, 0x1d, 0x8d, 0xfc, 0xf3, 0x24, 0x96, 0xe6, 0x13, 0x83, 0x02, 0x3e, 0xf9, 0x09, \n  0x95, 0x84, 0xf8, 0xb5, 0x52, 0x04, 0xef, 0x78, 0x00, 0x2d, 0x0e, 0xf4, 0x41, 0xc2, 0x03, 0x27, \n  0xa3, 0xfa, 0xb5, 0x79, 0xf6, 0xaf, 0xa5, 0x02, 0x23, 0xe1, 0x03, 0x70, 0xa3, 0x00, 0x9c, 0xb9, \n  0xfd, 0x50, 0x5b, 0x01, 0x4a, 0x69, 0xfd, 0x39, 0xe7, 0xfd, 0x8d, 0xac, 0xff, 0xa5, 0xed, 0xf8, \n  0xe4, 0x62, 0xf9, 0xad, 0xd8, 0xf6, 0xd2, 0x3b, 0x52, 0x60, 0xfa, 0x45, 0x0c, 0xf3, 0xf1, 0xdf, \n  0xf0, 0x0e, 0x20, 0x98, 0x11, 0xc3, 0x83, 0xee, 0x83, 0x14, 0xec, 0xd7, 0xd2, 0xdc, 0xd2, 0xf6, \n  0xff, 0x25, 0x8f, 0x1e, 0x5a, 0x96, 0xfa, 0xe7, 0xeb, 0xe4, 0x85, 0xfc, 0x01, 0x71, 0xc6, 0x0e, \n  0xd2, 0x53, 0xf7, 0x8a, 0x6b, 0x03, 0x70, 0x3f, 0x02, 0x91, 0x67, 0xf2, 0xda, 0x0d, 0x04, 0x62, \n  0x7b, 0xfb, 0x2d, 0xac, 0xf4, 0xb5, 0xeb, 0x00, 0x4f, 0xd2, 0x00, 0x9e, 0xd1, 0x02, 0xd1, 0xe6, \n  0x03, 0xa0, 0x1e, 0x01, 0x77, 0x16, 0xfd, 0x45, 0xa7, 0x00, 0x61, 0x0f, 0x01, 0xcd, 0x3d, 0xf9, \n  0xc0, 0x4e, 0xf9, 0x93, 0xdd, 0xf6, 0x69, 0x2d, 0x53, 0x92, 0x78, 0x41, 0xfe, 0x8a, 0xf0, 0x48, \n  0x46, 0x13, 0x1a, 0x64, 0x10, 0xa2, 0x06, 0xed, 0x95, 0x74, 0xee, 0xec, 0x2e, 0xdd, 0x78, 0x4a, \n  0xfa, 0x4d, 0xec, 0x1b, 0x04, 0xf1, 0x00, 0xd1, 0xcb, 0xe5, 0xaf, 0xfe, 0xff, 0x96, 0xff, 0x12, \n  0x25, 0x03, 0xf7, 0x9e, 0x05, 0xff, 0x50, 0xbb, 0x03, 0x8a, 0x1a, 0xf3, 0x83, 0x56, 0x01, 0x11, \n  0xf6, 0xfd, 0x7b, 0x20, 0xf5, 0xcc, 0xbd, 0xfe, 0x98, 0xcc, 0x01, 0x43, 0x72, 0x00, 0x4f, 0x4d, \n  0x05, 0x58, 0xef, 0x05, 0x07, 0x1b, 0xfc, 0xe5, 0x54, 0x01, 0xe9, 0x76, 0x03, 0x54, 0x8d, 0xf8, \n  0xad, 0xcf, 0xf8, 0x2f, 0x2b, 0xf8, 0x0e, 0xf6, 0x54, 0x5c, 0xa3, 0x3e, 0xf8, 0x9b, 0xe8, 0x95, \n  0xe5, 0x17, 0x3c, 0x77, 0x17, 0x60, 0x47, 0xe6, 0x09, 0xb2, 0xec, 0x53, 0x2e, 0xe3, 0xb9, 0xb2, \n  0xf7, 0x8d, 0xe8, 0x16, 0x60, 0x65, 0x05, 0x1f, 0x97, 0xe9, 0xa4, 0x10, 0xfd, 0x88, 0x22, 0x15, \n  0x36, 0x6b, 0xf7, 0x05, 0x3d, 0xf9, 0x12, 0x85, 0x05, 0x64, 0xd4, 0xf5, 0x4b, 0xf0, 0xfd, 0xea, \n  0xe2, 0xfe, 0xca, 0x65, 0xf9, 0x15, 0xb3, 0xfe, 0x89, 0x1f, 0x01, 0x0a, 0x62, 0xfe, 0x48, 0xc1, \n  0x01, 0x5f, 0x41, 0x0b, 0xf6, 0xe0, 0xff, 0x10, 0x6b, 0xfd, 0xcb, 0x7c, 0x06, 0xb6, 0x5b, 0xfa, \n  0x69, 0x36, 0xf5, 0x46, 0x7e, 0xfa, 0x0e, 0xae, 0x59, 0xc1, 0xcd, 0x38, 0xd0, 0xdd, 0xdb, 0x79, \n  0x28, 0x21, 0x30, 0xc6, 0x20, 0x29, 0xdb, 0xd9, 0x59, 0xc2, 0xe8, 0x9a, 0xbd, 0xee, 0x14, 0xe8, \n  0xf8, 0xef, 0x4b, 0x0d, 0x4b, 0xb2, 0x08, 0xb6, 0x93, 0xf0, 0x5c, 0x95, 0xf6, 0x6c, 0x2f, 0x15, \n  0x12, 0x58, 0xfb, 0x73, 0x89, 0xf2, 0x25, 0x12, 0x05, 0xed, 0x5e, 0xfb, 0x6c, 0x24, 0xfc, 0x14, \n  0x57, 0xfd, 0x00, 0x27, 0xfe, 0x5b, 0xc8, 0x00, 0x32, 0xea, 0xfd, 0xe2, 0xbf, 0xfd, 0x92, 0x30, \n  0x00, 0xc6, 0xd9, 0x08, 0x49, 0xd6, 0x04, 0x45, 0x86, 0xff, 0x30, 0x64, 0x03, 0x87, 0x65, 0xfc, \n  0x6d, 0x33, 0xf6, 0x09, 0x15, 0xf9, 0x6f, 0x65, 0x5d, 0xe0, 0x4f, 0x30, 0x82, 0x24, 0xd4, 0xf4, \n  0x44, 0x2b, 0x37, 0x0a, 0x22, 0x26, 0xda, 0xd1, 0xb6, 0xf2, 0xea, 0x09, 0xa3, 0xf6, 0x11, 0xac, \n  0xf9, 0xf6, 0xda, 0x05, 0xfc, 0xb5, 0x09, 0x85, 0xb6, 0xf5, 0xd3, 0x37, 0xf3, 0x0e, 0xdd, 0x13, \n  0x96, 0x4c, 0xfd, 0x1d, 0xbf, 0xef, 0xef, 0x08, 0x04, 0xde, 0x2a, 0x00, 0x43, 0x31, 0xfd, 0x71, \n  0x9d, 0xfb, 0xa8, 0xb5, 0xff, 0xab, 0x12, 0x02, 0x0f, 0x80, 0xfe, 0xfd, 0xa7, 0xfc, 0x32, 0x85, \n  0xfd, 0x74, 0x8c, 0x07, 0x4a, 0xe7, 0x05, 0xa2, 0x25, 0x02, 0xeb, 0xf9, 0x02, 0xe3, 0x05, 0xfd, \n  0x63, 0xfe, 0xf8, 0x8d, 0x21, 0xf7, 0xac, 0x30, 0x5e, 0x3f, 0x4a, 0x29, 0x9d, 0x7a, 0xcf, 0xa5, \n  0xe3, 0x31, 0x1f, 0xbe, 0x23, 0x59, 0x6f, 0xcc, 0xb0, 0xdf, 0xea, 0x29, 0x80, 0x00, 0x95, 0x44, \n  0xfc, 0xb0, 0xde, 0xf9, 0xad, 0x9d, 0x09, 0x29, 0xdf, 0xfe, 0x7a, 0x09, 0xef, 0x1e, 0xab, 0x0e, \n  0x25, 0x02, 0x02, 0xfd, 0x17, 0xf1, 0x01, 0xf3, 0x00, 0xcc, 0x11, 0x02, 0x6d, 0xd3, 0xff, 0x64, \n  0xf6, 0xfb, 0x14, 0x61, 0xff, 0x94, 0x6f, 0x00, 0x56, 0xca, 0xff, 0xde, 0x94, 0xfe, 0x0d, 0x4f, \n  0xfa, 0x4e, 0x1c, 0x06, 0xe9, 0x4a, 0x07, 0x83, 0x54, 0x00, 0x42, 0x66, 0x04, 0xae, 0x49, 0x00, \n  0x2c, 0xdf, 0xf7, 0x45, 0xb0, 0xf7, 0x69, 0x72, 0x59, 0x46, 0xf3, 0x23, 0x9f, 0x02, 0xd1, 0xbd, \n  0x44, 0x35, 0x23, 0x30, 0x24, 0x8b, 0xe3, 0xca, 0xe4, 0x8a, 0xec, 0xd9, 0x4d, 0x06, 0x42, 0x14, \n  0xfb, 0xfb, 0xc7, 0xf3, 0x19, 0x80, 0x0a, 0x5d, 0xac, 0x02, 0xfe, 0x23, 0xec, 0x3b, 0x01, 0x0c, \n  0x29, 0xad, 0x06, 0x23, 0xcf, 0xf1, 0x96, 0xfd, 0xfe, 0xcf, 0xf0, 0x03, 0x5c, 0x5b, 0xff, 0x27, \n  0x94, 0xfc, 0x4a, 0xa2, 0x00, 0x3d, 0x60, 0xfe, 0xf8, 0x9b, 0xff, 0x44, 0x35, 0x00, 0xf7, 0xa3, \n  0xfa, 0x85, 0x05, 0x04, 0x01, 0xdc, 0x05, 0x35, 0x07, 0x01, 0xce, 0x2c, 0x04, 0x26, 0x46, 0x01, \n  0x5a, 0x27, 0xf9, 0x39, 0x49, 0xf8, 0xa6, 0x60, 0x50, 0xec, 0xca, 0x20, 0xdd, 0x5d, 0xd7, 0x19, \n  0x51, 0x34, 0xb0, 0xd6, 0x23, 0x71, 0x40, 0xcf, 0x5b, 0x30, 0xed, 0x36, 0x6c, 0x06, 0xed, 0xda, \n  0xfb, 0x30, 0x26, 0xf2, 0xde, 0xfc, 0x07, 0x4d, 0x55, 0x04, 0x22, 0x59, 0xed, 0xcd, 0xd4, 0x09, \n  0x72, 0x97, 0x08, 0xdc, 0x0a, 0xf4, 0xfb, 0x13, 0xfe, 0x17, 0xcf, 0x03, 0xce, 0x96, 0xff, 0x28, \n  0x64, 0xfc, 0x11, 0x74, 0x00, 0x64, 0x19, 0xff, 0xe9, 0x02, 0xff, 0x8d, 0x94, 0xff, 0x41, 0xaa, \n  0xfc, 0xec, 0x69, 0x03, 0x7d, 0xa8, 0x03, 0x6f, 0x85, 0x01, 0x04, 0xdc, 0x03, 0x05, 0x0f, 0x00, \n  0x2f, 0x22, 0xfb, 0xee, 0xb7, 0xfa, 0xf7, 0x6f, 0x46, 0x5d, 0x38, 0x20, 0x7b, 0x4b, 0xde, 0x12, \n  0xb9, 0x2e, 0xa6, 0x46, 0x24, 0xb2, 0xdb, 0xd5, 0xb9, 0xcd, 0xec, 0x1e, 0xc6, 0x06, 0x4b, 0x6a, \n  0xfc, 0x8b, 0x9c, 0xf0, 0xae, 0xd3, 0x05, 0x9c, 0x89, 0x06, 0x02, 0x7d, 0xef, 0x19, 0xc6, 0x06, \n  0xd3, 0xbb, 0x0a, 0x33, 0x58, 0xf6, 0x61, 0x7a, 0xfb, 0xde, 0x5c, 0x04, 0x6a, 0x1d, 0x01, 0x7e, \n  0x1a, 0xfb, 0xf0, 0x53, 0xff, 0xcf, 0x83, 0x00, 0xfa, 0x2a, 0xff, 0x9f, 0xcf, 0xfe, 0x60, 0xae, \n  0xfd, 0x75, 0xb0, 0x03, 0x9d, 0x8b, 0x03, 0x88, 0x56, 0x00, 0xf4, 0xa7, 0x02, 0x8b, 0x5b, 0x00, \n  0xbb, 0x4d, 0xfb, 0x84, 0x58, 0xfc, 0xbb, 0x53, 0x3e, 0xcf, 0x2e, 0x24, 0x4e, 0x13, 0xea, 0xf0, \n  0xe7, 0x20, 0xb8, 0x31, 0x18, 0x1c, 0x3f, 0xdf, 0x03, 0x89, 0xf3, 0x5c, 0x73, 0x01, 0x42, 0x7c, \n  0xfb, 0x2e, 0xac, 0xfd, 0x8f, 0x62, 0x01, 0x26, 0x21, 0xfc, 0xf5, 0xc3, 0xfb, 0x4f, 0xdd, 0x08, \n  0xad, 0x32, 0x02, 0xb3, 0x41, 0xf9, 0x9e, 0x18, 0xfd, 0x2a, 0xac, 0x00, 0xda, 0xd9, 0x00, 0x77, \n  0x0b, 0xfb, 0xda, 0x88, 0xfc, 0x83, 0xfe, 0x00, 0xdd, 0xba, 0x00, 0xb0, 0x80, 0x00, 0x66, 0x37, \n  0x00, 0xea, 0xa2, 0x00, 0xd7, 0x2c, 0x00, 0x28, 0xe1, 0x01, 0x18, 0x61, 0x02, 0x43, 0xc8, 0xff, \n  0x27, 0xb3, 0xff, 0x71, 0xd8, 0xff, 0x79, 0xbc, 0x34, 0xe5, 0x87, 0x20, 0x4a, 0x83, 0xf1, 0xbe, \n  0x31, 0x20, 0xf9, 0xbd, 0x15, 0x42, 0x9a, 0xe3, 0x5e, 0xea, 0xf5, 0xc4, 0x54, 0x00, 0x6d, 0x1d, \n  0xfb, 0xe1, 0xd8, 0xfe, 0xd3, 0x8b, 0x01, 0xc1, 0x2b, 0xfc, 0x2d, 0x14, 0xfc, 0x0c, 0xc7, 0x08, \n  0x10, 0xc4, 0x02, 0x60, 0x7a, 0xf9, 0x9c, 0x0d, 0xfd, 0x29, 0x3f, 0x00, 0x33, 0x82, 0x00, 0xdb, \n  0xd4, 0xfb, 0xf8, 0x13, 0xfd, 0xf3, 0xd0, 0x00, 0xfb, 0x09, 0x00, 0xc9, 0x4f, 0x00, 0x4d, 0x9a, \n  0x00, 0xcb, 0xc5, 0x00, 0x2b, 0xc6, 0x00, 0x74, 0x19, 0x02, 0xa7, 0xef, 0x01, 0x6f, 0x8b, 0xff, \n  0xa4, 0xc4, 0xff, 0xbd, 0x58, 0x00, 0xfa, 0xeb, 0x2b, 0x47, 0xb2, 0x1d, 0x9c, 0x20, 0xf9, 0xe4, \n  0x40, 0x1d, 0xbd, 0x59, 0x12, 0xd2, 0x8a, 0xea, 0x1c, 0xbf, 0xf7, 0x78, 0x5b, 0xfd, 0x59, 0x59, \n  0xfb, 0x8b, 0xd2, 0x00, 0xc9, 0xaa, 0x01, 0xbf, 0x8c, 0xfb, 0x47, 0xea, 0xfc, 0x1a, 0x73, 0x08, \n  0x7e, 0xae, 0x02, 0xbc, 0x91, 0xfa, 0x2d, 0xef, 0xfc, 0x3b, 0x04, 0x00, 0x98, 0x87, 0x00, 0x46, \n  0x15, 0xfc, 0xc8, 0x82, 0xfd, 0x3c, 0xd3, 0x00, 0x6c, 0xd3, 0xff, 0x6f, 0x03, 0x00, 0x29, 0x9c, \n  0x00, 0x02, 0x14, 0x01, 0x6b, 0x66, 0x01, 0xa3, 0xfa, 0x01, 0x8c, 0xe8, 0x00, 0x7b, 0xb0, 0xff, \n  0x5d, 0x4f, 0x00, 0x22, 0x08, 0x00, 0x79, 0xe1, 0x24, 0xaf, 0x27, 0x1c, 0xe5, 0xcc, 0xfd, 0xf8, \n  0xa3, 0x18, 0xd6, 0x12, 0x11, 0xaa, 0x7e, 0xf0, 0x6c, 0x51, 0xf8, 0x62, 0x3f, 0xfc, 0x84, 0x06, \n  0xfc, 0xb3, 0xc1, 0x01, 0xc5, 0x97, 0x01, 0x1a, 0x11, 0xfc, 0x6d, 0xa2, 0xfd, 0x13, 0xd1, 0x06, \n  0x86, 0xce, 0x02, 0x46, 0xfe, 0xfb, 0xc7, 0xbb, 0xfc, 0x32, 0x8a, 0xff, 0x5f, 0x8a, 0x00, 0xc5, \n  0xbe, 0xfc, 0x94, 0xca, 0xfd, 0xb3, 0xb6, 0x00, 0xa9, 0xf0, 0xff, 0xf5, 0xfb, 0xff, 0x72, 0x40, \n  0x00, 0xbc, 0x7b, 0x01, 0x13, 0x27, 0x02, 0x63, 0xbd, 0x00, 0xa1, 0x11, 0x00, 0x06, 0x01, 0x01, \n  0x7b, 0xd5, 0x00, 0x84, 0x49, 0xff, 0x1a, 0x61, 0x20, 0xe2, 0x33, 0x1b, 0x3b, 0x26, 0xff, 0x1b, \n  0x80, 0x14, 0x7f, 0x39, 0x11, 0x63, 0xdc, 0xf3, 0x59, 0x47, 0xf8, 0x4f, 0x89, 0xfd, 0xb9, 0x68, \n  0xfd, 0x36, 0xf3, 0x00, 0x21, 0x46, 0x01, 0xc7, 0x1a, 0xfe, 0x74, 0x1f, 0xfe, 0x35, 0x66, 0x04, \n  0x43, 0x21, 0x03, 0xbc, 0xa6, 0xfd, 0xb5, 0x47, 0xfc, 0x63, 0xf4, 0xfe, 0xf8, 0xfd, 0x00, 0xa7, \n  0xb7, 0xfd, 0xcb, 0xef, 0xfd, 0xd7, 0x71, 0x00, 0xad, 0x6c, 0x00, 0x43, 0xed, 0xff, 0xde, 0x29, \n  0x00, 0x4c, 0x3b, 0x02, 0x1a, 0xad, 0x01, 0xa0, 0x08, 0x00, 0x0b, 0xf5, 0x00, 0x02, 0x9d, 0x01, \n  0x1c, 0x9c, 0x00, 0x6f, 0xb6, 0xff, 0x70, 0xcf, 0x1d, 0xc3, 0x1d, 0x1a, 0x78, 0x04, 0xff, 0x9b, \n  0x52, 0x11, 0x38, 0x6c, 0x10, 0x4f, 0xe9, 0xf5, 0xbb, 0xbf, 0xf9, 0xc9, 0x16, 0xff, 0x4f, 0xd5, \n  0xfd, 0xff, 0x2d, 0x00, 0x5f, 0xa7, 0x01, 0x58, 0xdc, 0xff, 0xb0, 0xeb, 0xfd, 0xb3, 0xeb, 0x02, \n  0x67, 0x7b, 0x03, 0x22, 0xf2, 0xfd, 0x40, 0x57, 0xfc, 0x9d, 0x6b, 0xff, 0xb2, 0x2d, 0x01, 0x33, \n  0x19, 0xfe, 0xda, 0x1b, 0xfe, 0x99, 0xe9, 0x00, 0x8f, 0x70, 0x00, 0x30, 0x82, 0xff, 0xf9, 0x57, \n  0x01, 0x58, 0x90, 0x02, 0x65, 0xc8, 0x00, 0xe4, 0x6d, 0x00, 0x62, 0xb2, 0x01, 0xd6, 0x0e, 0x02, \n  0x5e, 0x03, 0x01, 0xa3, 0x7a, 0x00, 0x0d, 0x17, 0x1b, 0x33, 0x51, 0x18, 0x59, 0x33, 0xff, 0x3e, \n  0x5f, 0x0f, 0x1b, 0x65, 0x0f, 0x1c, 0xb5, 0xf7, 0x79, 0x49, 0xfb, 0xa6, 0xef, 0xff, 0x55, 0xf9, \n  0xfd, 0x89, 0xf8, 0xff, 0xfd, 0x48, 0x02, 0x8b, 0x97, 0x00, 0xb5, 0x85, 0xfd, 0x25, 0x13, 0x02, \n  0x6c, 0x2f, 0x03, 0xb4, 0x75, 0xfe, 0x29, 0x1b, 0xfd, 0x90, 0x68, 0xff, 0xbd, 0x0c, 0x01, 0x26, \n  0x68, 0xfe, 0xba, 0x9e, 0xfe, 0xed, 0x16, 0x01, 0x8b, 0x19, 0x00, 0x2c, 0xc3, 0x00, 0xc8, 0x64, \n  0x02, 0xfb, 0x2b, 0x01, 0x4d, 0xb9, 0x00, 0x33, 0xf8, 0x01, 0x0a, 0x7a, 0x02, 0xf0, 0x09, 0x02, \n  0x37, 0xa8, 0x00, 0x3d, 0x6c, 0x00, 0x38, 0x31, 0x18, 0x09, 0xcd, 0x15, 0xa6, 0xf4, 0xff, 0xdd, \n  0xc0, 0x0e, 0x0b, 0x5c, 0x0e, 0xc5, 0x4b, 0xf9, 0x69, 0x74, 0xfc, 0x87, 0x5f, 0x00, 0x21, 0xe8, \n  0xfe, 0x76, 0x63, 0x00, 0x6b, 0x0f, 0x02, 0x12, 0x50, 0x00, 0x4b, 0xb9, 0xfd, 0xe8, 0x49, 0x02, \n  0x1f, 0xe1, 0x02, 0x6e, 0x88, 0xfe, 0x03, 0xb8, 0xfd, 0xb0, 0xc4, 0xff, 0x70, 0xd9, 0x00, 0x15, \n  0xa0, 0xfe, 0x62, 0xa6, 0xff, 0x7e, 0x62, 0x01, 0xb6, 0xaf, 0x00, 0xd9, 0xfb, 0x01, 0x4c, 0xfc, \n  0x01, 0xe3, 0x3b, 0x01, 0x98, 0x17, 0x02, 0xf6, 0x59, 0x02, 0x46, 0x2c, 0x02, 0x5f, 0x30, 0x01, \n  0xea, 0xe0, 0xff, 0xc8, 0xf7, 0xff, 0x6a, 0xce, 0x15, 0x65, 0x75, 0x14, 0x9f, 0xb4, 0x00, 0xd0, \n  0x95, 0x0c, 0xe9, 0xfb, 0x0c, 0x29, 0x6e, 0xfb, 0x75, 0x08, 0xfe, 0x1d, 0x00, 0x01, 0x93, 0xcd, \n  0xfe, 0xea, 0x27, 0x00, 0x64, 0x5e, 0x02, 0xaf, 0xc6, 0x00, 0xc8, 0x1c, 0xfe, 0xce, 0xab, 0x01, \n  0x95, 0x6e, 0x02, 0x11, 0x20, 0xff, 0xda, 0x44, 0xfe, 0x09, 0xd1, 0xff, 0xf7, 0xf8, 0x00, 0xf7, \n  0xf7, 0xff, 0x6b, 0x8e, 0x00, 0x78, 0x5e, 0x01, 0x41, 0x1c, 0x02, 0xf8, 0xfe, 0x02, 0xd4, 0xb9, \n  0x01, 0x6d, 0xbe, 0x01, 0xce, 0xeb, 0x01, 0x07, 0x10, 0x01, 0x1a, 0x3e, 0x01, 0x8c, 0x9d, 0x00, \n  0x7f, 0x8c, 0xff, 0xfc, 0x97, 0xff, 0x71, 0xe7, 0x12, 0x76, 0x5c, 0x12, 0x02, 0x9d, 0x01, 0x3a, \n  0xe4, 0x0b, 0xbe, 0xa3, 0x0c, 0x5c, 0x19, 0xfd, 0xda, 0x8a, 0xfe, 0xd2, 0x02, 0x01, 0xc1, 0x76, \n  0xff, 0x4c, 0xca, 0x00, 0x71, 0x1e, 0x02, 0xe7, 0x6a, 0x00, 0x8b, 0x89, 0xfe, 0xe1, 0xa1, 0x01, \n  0x76, 0x19, 0x02, 0x08, 0x90, 0xff, 0x8b, 0x10, 0xff, 0x54, 0x49, 0x00, 0xf0, 0xaa, 0x01, 0xcf, \n  0x20, 0x01, 0x44, 0x67, 0x01, 0x87, 0x9d, 0x02, 0x52, 0x29, 0x03, 0xfa, 0x9c, 0x02, 0xe0, 0x01, \n  0x01, 0x5b, 0x89, 0x00, 0xc7, 0x8f, 0x00, 0xb5, 0x9c, 0x00, 0x70, 0xe5, 0x00, 0xae, 0x77, 0x00, \n  0xef, 0x85, 0xff, 0xf7, 0x06, 0xff, 0x00, 0x16, 0x10, 0xb5, 0x72, 0x10, 0x26, 0x00, 0x03, 0xd1, \n  0x65, 0x0b, 0x41, 0x60, 0x0b, 0xd8, 0x56, 0xfe, 0x33, 0x0b, 0x00, 0x67, 0x4c, 0x01, 0x5a, 0x48, \n  0xff, 0x05, 0x12, 0x01, 0xb0, 0x39, 0x02, 0xe9, 0x29, 0x00, 0xdd, 0xa2, 0xfe, 0xf0, 0xcd, 0x01, \n  0x35, 0x87, 0x02, 0xbb, 0x58, 0x00, 0x21, 0xa3, 0xff, 0x98, 0xff, 0x00, 0xbe, 0x49, 0x03, 0x87, \n  0xb0, 0x02, 0xa8, 0x10, 0x02, 0xdb, 0xf7, 0x02, 0xb3, 0x2d, 0x02, 0x43, 0x43, 0x00, 0xa2, 0xc3, \n  0xff, 0x2b, 0x5b, 0x00, 0x15, 0x29, 0x00, 0x67, 0x68, 0x00, 0xdc, 0xb3, 0x00, 0x03, 0xbd, 0xff, \n  0x3b, 0xe6, 0xfe, 0x29, 0xf8, 0xfe, 0x51, 0x93, 0x0e, 0xc3, 0xd0, 0x0f, 0x17, 0x54, 0x03, 0x41, \n  0x66, 0x09, 0x26, 0xa7, 0x0a, 0x2e, 0xb5, 0x00, 0xbb, 0xec, 0x00, 0x62, 0xc4, 0x00, 0xa9, 0x72, \n  0xff, 0x30, 0x31, 0x01, 0x29, 0x44, 0x02, 0xa2, 0x04, 0x01, 0x91, 0x95, 0xff, 0xe3, 0xe6, 0x01, \n  0x85, 0xb7, 0x02, 0x30, 0xa1, 0x01, 0x0a, 0xd5, 0x01, 0x84, 0xf2, 0x02, 0xca, 0xfe, 0x03, 0xd2, \n  0x6b, 0x02, 0x53, 0xfd, 0x00, 0xcd, 0x11, 0x01, 0xc8, 0x9f, 0x00, 0x3e, 0xff, 0xff, 0x39, 0xd0, \n  0xff, 0xbd, 0x08, 0x00, 0x31, 0xdb, 0xff, 0xb5, 0xf5, 0xff, 0xc6, 0x2a, 0x00, 0xd6, 0x68, 0xff, \n  0x0b, 0xc2, 0xfe, 0x37, 0xd0, 0xfe, 0xae, 0x50, 0x0b, 0x0e, 0x49, 0x0d, 0x0c, 0x68, 0x05, 0xc2, \n  0x7f, 0x0a, 0x40, 0xc5, 0x09, 0x4f, 0x4d, 0x01, 0xcf, 0xc1, 0x01, 0xec, 0xcd, 0x00, 0x67, 0xf8, \n  0xff, 0x20, 0x48, 0x02, 0xef, 0x67, 0x02, 0x94, 0xc4, 0x00, 0x5f, 0xa7, 0x00, 0x26, 0xe1, 0x03, \n  0xc0, 0x81, 0x04, 0x52, 0xb0, 0x02, 0x1e, 0x5a, 0x02, 0x70, 0xd8, 0x02, 0x64, 0x7b, 0x02, 0xb1, \n  0x74, 0x00, 0x7d, 0x28, 0x00, 0x41, 0xa6, 0x00, 0xe3, 0x45, 0x00, 0x92, 0x2a, 0x00, 0x30, 0x5e, \n  0xff, 0xdf, 0x1f, 0xff, 0xfc, 0x7b, 0xff, 0xd4, 0x8f, 0xff, 0x7b, 0xcb, 0xff, 0x1e, 0x5a, 0xff, \n  0x1d, 0x9d, 0xfe, 0xc8, 0x73, 0xfe, 0xcf, 0xc9, 0x0a, 0xac, 0x04, 0x0e, 0xce, 0xdc, 0x05, 0x8f, \n  0xb6, 0x07, 0x35, 0xc9, 0x08, 0x8f, 0x19, 0x03, 0xd5, 0x2f, 0x02, 0xe3, 0x07, 0x01, 0x30, 0x41, \n  0x00, 0x35, 0xe5, 0x02, 0xa4, 0x4e, 0x04, 0xa1, 0x10, 0x03, 0x51, 0xb5, 0x02, 0x96, 0x6d, 0x04, \n  0x4b, 0x4b, 0x04, 0x38, 0x4b, 0x02, 0xdc, 0x40, 0x00, 0x91, 0x04, 0x00, 0x8d, 0x51, 0x01, 0xc8, \n  0x29, 0x01, 0x86, 0x9f, 0x00, 0xcd, 0xea, 0xff, 0x43, 0x0f, 0xff, 0x8e, 0x11, 0xff, 0xdf, 0x0c, \n  0xff, 0xd8, 0x30, 0xff, 0xac, 0x3d, 0xff, 0x2b, 0x3f, 0xff, 0xef, 0x1f, 0xff, 0x88, 0x9d, 0xfe, \n  0x24, 0xca, 0xfe, 0x98, 0xa5, 0xfe, 0xee, 0xab, 0x08, 0x54, 0x29, 0x0c, 0xbc, 0x04, 0x07, 0x62, \n  0xcd, 0x08, 0xdd, 0x3b, 0x09, 0x3c, 0x8a, 0x03, 0x76, 0x3e, 0x02, 0x44, 0x6b, 0x02, 0x41, 0xf7, \n  0x02, 0x24, 0x64, 0x05, 0x3b, 0x93, 0x05, 0x28, 0xf3, 0x03, 0x14, 0xe9, 0x02, 0xae, 0x29, 0x02, \n  0x8e, 0x34, 0x01, 0x10, 0x33, 0x00, 0x18, 0x11, 0x00, 0xe8, 0x1d, 0x01, 0x5c, 0xa8, 0x01, 0x31, \n  0x79, 0x00, 0xbf, 0xf0, 0xfe, 0xfd, 0x33, 0xff, 0xb7, 0xb2, 0xff, 0x86, 0x98, 0xfe, 0xb0, 0x34, \n  0xfe, 0x11, 0xbc, 0xfe, 0x61, 0x08, 0xff, 0x87, 0x2b, 0xff, 0x80, 0xdd, 0xfe, 0x1e, 0xf7, 0xfe, \n  0xbe, 0x01, 0xff, 0x7a, 0x95, 0xfe, 0x10, 0x54, 0x09, 0xbd, 0x7b, 0x0e, 0xb6, 0x85, 0x08, 0xe3, \n  0xae, 0x06, 0x7f, 0xda, 0x06, 0x3d, 0x0d, 0x05, 0xc6, 0xde, 0x06, 0xc5, 0x16, 0x07, 0x60, 0xae, \n  0x04, 0x3c, 0xfe, 0x03, 0xcf, 0x41, 0x03, 0x5e, 0x09, 0x01, 0x81, 0xb8, 0xff, 0x4e, 0x35, 0x00, \n  0xf8, 0x00, 0x01, 0xea, 0x97, 0x01, 0x25, 0xd5, 0x00, 0xdd, 0x7c, 0xff, 0x6c, 0xfc, 0xff, 0x1f, \n  0x39, 0x00, 0xe7, 0x08, 0xff, 0x66, 0xb5, 0xfe, 0x8f, 0x77, 0xfe, 0x3e, 0xbc, 0xfd, 0xd3, 0x4c, \n  0xfe, 0xdb, 0x41, 0xff, 0x8d, 0x25, 0xff, 0x43, 0xd9, 0xfe, 0xd9, 0x17, 0xff, 0xcf, 0x68, 0xff, \n  0xfa, 0x05, 0xff, 0xc6, 0x4b, 0xfe, 0xab, 0xe5, 0x09, 0x47, 0x72, 0x0e, 0xdc, 0x77, 0x09, 0x70, \n  0x84, 0x0a, 0xf3, 0xb2, 0x0a, 0x4e, 0x69, 0x07, 0xa7, 0xe8, 0x07, 0x8e, 0xe5, 0x05, 0x5f, 0x56, \n  0x01, 0xe3, 0xf9, 0xff, 0x2a, 0x86, 0x00, 0x3d, 0x32, 0x00, 0xa3, 0x3d, 0x00, 0x46, 0x9b, 0x00, \n  0xaf, 0x72, 0x00, 0x7c, 0x03, 0x01, 0x5b, 0x24, 0x00, 0x2b, 0xee, 0xfe, 0xe4, 0xd7, 0xff, 0x6a, \n  0x7d, 0xff, 0xad, 0x38, 0xfe, 0xba, 0x45, 0xfe, 0xec, 0x03, 0xfe, 0x56, 0xaf, 0xfd, 0xc5, 0x98, \n  0xfe, 0xb1, 0x88, 0xff, 0xad, 0x6a, 0xff, 0xac, 0xf5, 0xfe, 0x34, 0xf6, 0xfe, 0xd8, 0x39, 0xff, \n  0x3c, 0xf5, 0xfe, 0xa9, 0x6b, 0xfe, 0x03, 0x81, 0x0b, 0x04, 0x2e, 0x12, 0x58, 0x1a, 0x0f, 0x1d, \n  0x8a, 0x0e, 0xc3, 0x1b, 0x0a, 0xf7, 0xa0, 0x04, 0x75, 0x5b, 0x03, 0xd6, 0x09, 0x01, 0x40, 0xc8, \n  0xff, 0x41, 0x21, 0x00, 0xb2, 0xcc, 0x00, 0xce, 0x40, 0x00, 0x15, 0x5d, 0xff, 0xc7, 0xb3, 0xff, \n  0x61, 0x05, 0x00, 0x42, 0xde, 0x00, 0x50, 0xe7, 0xff, 0xbd, 0x81, 0xfe, 0x37, 0x1b, 0xff, 0x70, \n  0x89, 0xfe, 0xb1, 0xcf, 0xfd, 0x3e, 0x0a, 0xfe, 0x89, 0x3b, 0xfe, 0x90, 0xa4, 0xfe, 0xc1, 0xdd, \n  0xfe, 0x6f, 0xf5, 0xfe, 0xbe, 0x05, 0xff, 0x82, 0x49, 0xff, 0x71, 0x68, 0xff, 0x21, 0xfa, 0xfe, \n  0xd7, 0x94, 0xfe, 0x0e, 0x49, 0xfe, 0x3e, 0xd2, 0x0d, 0xb5, 0xba, 0x18, 0xd9, 0x3d, 0x14, 0x1f, \n  0xc6, 0x0a, 0xea, 0x53, 0x02, 0x51, 0xb2, 0x00, 0xbd, 0x85, 0x03, 0xd0, 0xfe, 0x03, 0xbd, 0xa4, \n  0x01, 0xb0, 0x1f, 0xfe, 0x01, 0x7d, 0xfe, 0xed, 0x0f, 0x00, 0xf7, 0x3c, 0x00, 0xaa, 0x11, 0x00, \n  0xe3, 0x15, 0xff, 0xb3, 0xe2, 0xff, 0x7d, 0xff, 0xff, 0xd9, 0x8d, 0xfe, 0xef, 0x65, 0xfe, 0x85, \n  0x16, 0xfe, 0x09, 0x4a, 0xfe, 0x2b, 0xb8, 0xfe, 0x3b, 0x5a, 0xfe, 0xc2, 0x65, 0xfe, 0x7b, 0x89, \n  0xfe, 0x9b, 0x12, 0xff, 0x99, 0x44, 0xff, 0xb3, 0x14, 0xff, 0x90, 0x6a, 0xff, 0x53, 0xfd, 0xfe, \n  0x22, 0x82, 0xfe, 0xf1, 0x55, 0xfe, 0x3e, 0xd0, 0x0e, 0xde, 0x14, 0x19, 0x61, 0x3a, 0x0f, 0x84, \n  0xb3, 0x05, 0x06, 0x17, 0x03, 0xab, 0x43, 0x04, 0x08, 0x8c, 0x07, 0x46, 0x19, 0x05, 0x0f, 0xa6, \n  0xff, 0x75, 0x12, 0xfe, 0x67, 0x7a, 0x00, 0x7d, 0x11, 0x00, 0xc3, 0x6a, 0xfe, 0x9b, 0x15, 0x00, \n  0xdc, 0xb0, 0xff, 0x9c, 0x05, 0xff, 0x9e, 0x81, 0xff, 0xeb, 0x7c, 0xfe, 0x7c, 0x91, 0xfe, 0xb1, \n  0xf2, 0xfe, 0xdb, 0x63, 0xfe, 0x3e, 0x5a, 0xfe, 0xa9, 0xa7, 0xfe, 0xd2, 0x4d, 0xfe, 0xa0, 0x0e, \n  0xfe, 0xe8, 0xfb, 0xfe, 0x43, 0x51, 0xff, 0x6e, 0xef, 0xfe, 0x80, 0x1a, 0xff, 0x8a, 0xf5, 0xfe, \n  0x3d, 0xa8, 0xfe, 0x4b, 0xa5, 0xfe, 0x8c, 0xfd, 0x08, 0x82, 0xe0, 0x0d, 0x7d, 0x6c, 0x08, 0x22, \n  0x26, 0x07, 0x37, 0xfb, 0x08, 0x3a, 0xd4, 0x08, 0xd7, 0x0d, 0x09, 0xfa, 0x7c, 0x06, 0x43, 0xa8, \n  0x02, 0x91, 0x33, 0x02, 0x53, 0xba, 0x02, 0x51, 0x1e, 0x01, 0x1f, 0x51, 0xff, 0x49, 0xe4, 0xfe, \n  0x5d, 0x7f, 0xff, 0x0f, 0x0e, 0x00, 0x62, 0xf0, 0xfe, 0x12, 0x3d, 0xfe, 0x62, 0x05, 0xff, 0x28, \n  0x24, 0xff, 0x2b, 0x31, 0xff, 0xcb, 0x16, 0xff, 0x1a, 0x38, 0xfe, 0xcb, 0x56, 0xfe, 0x96, 0xd8, \n  0xfe, 0x31, 0x80, 0xfe, 0xac, 0x64, 0xfe, 0xed, 0xe9, 0xfe, 0xe2, 0xf7, 0xfe, 0xa7, 0x9c, 0xfe, \n  0x50, 0x0c, 0xff, 0xb3, 0x50, 0xff, 0xc7, 0x15, 0x07, 0x60, 0x1a, 0x0a, 0x8e, 0x1d, 0x05, 0x52, \n  0x69, 0x04, 0xe3, 0x48, 0x07, 0xaa, 0x3d, 0x08, 0xa1, 0x5d, 0x07, 0x49, 0x3f, 0x05, 0x63, 0x15, \n  0x05, 0x32, 0x48, 0x06, 0xc2, 0xbf, 0x05, 0x2b, 0x0b, 0x04, 0x32, 0x48, 0x02, 0xcd, 0x48, 0x01, \n  0x35, 0xf9, 0x00, 0x08, 0xd9, 0xff, 0x65, 0xae, 0xfe, 0x62, 0xf3, 0xfe, 0x2f, 0x08, 0xff, 0xd3, \n  0x44, 0xfe, 0x2b, 0xec, 0xfe, 0x13, 0x9a, 0xff, 0x22, 0xb0, 0xfe, 0xce, 0xe1, 0xfe, 0x6d, 0x4b, \n  0xff, 0x42, 0xa5, 0xfe, 0x8e, 0xa6, 0xfe, 0x62, 0xeb, 0xfe, 0xb8, 0xb6, 0xfe, 0xe7, 0x4a, 0xfe, \n  0x07, 0x78, 0xfe, 0xf1, 0xfa, 0xfe, 0x6b, 0xc5, 0x07, 0xfc, 0x03, 0x0b, 0x93, 0xad, 0x05, 0x95, \n  0xb5, 0x04, 0xc3, 0xa6, 0x06, 0x48, 0xd1, 0x05, 0xe1, 0xcf, 0x03, 0xa7, 0x2d, 0x02, 0x40, 0x01, \n  0x03, 0xb1, 0x84, 0x05, 0xf8, 0x3a, 0x06, 0x05, 0xd4, 0x04, 0x7f, 0xe3, 0x03, 0x84, 0xab, 0x03, \n  0x83, 0x2b, 0x03, 0xc0, 0xd0, 0x01, 0x93, 0xf7, 0xff, 0xd9, 0x32, 0xff, 0x61, 0x1d, 0xff, 0x2a, \n  0xf7, 0xfe, 0x31, 0xe5, 0xfe, 0x71, 0x9b, 0xfe, 0xcd, 0x79, 0xfe, 0x40, 0x03, 0xff, 0x99, 0x74, \n  0xff, 0xa0, 0x06, 0xff, 0xcf, 0xbf, 0xfe, 0x93, 0x11, 0xff, 0x61, 0xac, 0xfe, 0xf5, 0x4e, 0xfe, \n  0xe0, 0xc5, 0xfe, 0x20, 0xa5, 0xfe, 0xc7, 0xcc, 0x08, 0x29, 0x17, 0x0c, 0xa7, 0xd8, 0x04, 0xc0, \n  0xed, 0x03, 0x03, 0xfa, 0x06, 0x47, 0xdd, 0x05, 0xa2, 0xd6, 0x02, 0x44, 0x20, 0x00, 0x73, 0x5a, \n  0x01, 0x7b, 0x72, 0x04, 0xbe, 0x38, 0x04, 0x43, 0xbf, 0x02, 0xae, 0xf4, 0x03, 0x84, 0x4e, 0x05, \n  0x11, 0xcf, 0x04, 0x62, 0xcb, 0x03, 0x69, 0xea, 0x01, 0xba, 0xc2, 0x00, 0xd1, 0x6a, 0x00, 0x9b, \n  0x3f, 0xff, 0xe6, 0x0d, 0xff, 0xa8, 0x37, 0xff, 0x25, 0x46, 0xfe, 0xcc, 0x86, 0xfe, 0xb3, 0x64, \n  0xff, 0xc2, 0x02, 0xff, 0xf5, 0x3a, 0xff, 0x57, 0xc1, 0xff, 0x71, 0xf1, 0xfe, 0x8f, 0x75, 0xfe, \n  0x66, 0xde, 0xfe, 0x68, 0x92, 0xfe, 0x81, 0xb2, 0x09, 0x92, 0x06, 0x0e, 0x12, 0xd0, 0x05, 0x4f, \n  0xb6, 0x03, 0x27, 0xdb, 0x06, 0xbf, 0x03, 0x05, 0xeb, 0x66, 0x01, 0x24, 0x16, 0x00, 0xe2, 0x6f, \n  0x02, 0xa6, 0xf0, 0x03, 0xf6, 0xdb, 0x01, 0xb4, 0xd5, 0x00, 0x89, 0x2c, 0x02, 0xc9, 0xf6, 0x02, \n  0x2a, 0xb7, 0x03, 0x3d, 0x97, 0x04, 0x4f, 0x6a, 0x03, 0xb6, 0x2c, 0x02, 0xa8, 0xcb, 0x01, 0x88, \n  0xc7, 0x00, 0xa9, 0x63, 0x00, 0x83, 0xd2, 0xff, 0xe4, 0x97, 0xfe, 0x6d, 0xe1, 0xfe, 0x3c, 0x1c, \n  0xff, 0xb5, 0x79, 0xfe, 0xc8, 0x1e, 0xff, 0x38, 0xc3, 0xff, 0xa1, 0x2c, 0xff, 0xb5, 0xee, 0xfe, \n  0x8d, 0x0a, 0xff, 0x88, 0x9c, 0xfe, 0xc8, 0x57, 0x0a, 0x67, 0xf7, 0x0e, 0xd6, 0x74, 0x06, 0x89, \n  0x4f, 0x04, 0x69, 0xfd, 0x07, 0x1b, 0x72, 0x05, 0xa2, 0x86, 0xff, 0x5f, 0x83, 0xfe, 0xd8, 0x2c, \n  0x03, 0xf1, 0x65, 0x04, 0x27, 0x25, 0x01, 0xb1, 0x5c, 0x00, 0xab, 0x80, 0x01, 0x31, 0x6b, 0x01, \n  0xb0, 0xac, 0x01, 0x83, 0x4c, 0x02, 0x3c, 0xdc, 0x01, 0x32, 0x57, 0x02, 0xb7, 0x2f, 0x03, 0x0c, \n  0x56, 0x02, 0x0b, 0x4b, 0x01, 0xb8, 0xe9, 0x00, 0x94, 0x62, 0x00, 0x4a, 0xa3, 0xff, 0x28, 0x16, \n  0xff, 0xda, 0xf0, 0xfe, 0x13, 0x0d, 0xff, 0xc9, 0x20, 0xff, 0x51, 0x18, 0xff, 0xbe, 0x09, 0xff, \n  0x7f, 0x16, 0xff, 0x06, 0x06, 0xff, 0x23, 0x93, 0x0b, 0xf9, 0xac, 0x10, 0xe6, 0x47, 0x07, 0xd0, \n  0x3e, 0x04, 0x5c, 0xdf, 0x07, 0x23, 0x7f, 0x05, 0x1f, 0x85, 0xfe, 0x24, 0xe7, 0xfd, 0x55, 0x14, \n  0x04, 0xa8, 0xdd, 0x03, 0xbf, 0x9c, 0xff, 0x13, 0x2b, 0x00, 0x7c, 0xe3, 0x01, 0x60, 0x58, 0x01, \n  0x20, 0xae, 0x00, 0x46, 0x1c, 0x01, 0x2d, 0x9b, 0x00, 0x8e, 0xe2, 0xff, 0x32, 0x01, 0x01, 0xad, \n  0x43, 0x02, 0x1b, 0x65, 0x02, 0x99, 0xd8, 0x01, 0x2b, 0x38, 0x01, 0xcf, 0xd4, 0x00, 0xf1, 0x3c, \n  0x00, 0xa7, 0x84, 0xff, 0x9c, 0x45, 0xff, 0x5d, 0x66, 0xff, 0x1e, 0x27, 0xff, 0x87, 0xa2, 0xfe, \n  0xca, 0x9b, 0xfe, 0xf6, 0xea, 0xfe, 0xdd, 0xa8, 0x0c, 0xe8, 0x76, 0x12, 0x16, 0x3e, 0x08, 0xec, \n  0x1d, 0x04, 0x82, 0x0b, 0x08, 0xb0, 0xf0, 0x05, 0x89, 0x7d, 0xfd, 0xc2, 0x28, 0xfd, 0x84, 0xe6, \n  0x04, 0x6f, 0xb2, 0x03, 0xf9, 0x82, 0xfe, 0x56, 0xe5, 0xff, 0xba, 0x2b, 0x02, 0xf6, 0x41, 0x01, \n  0xfb, 0x51, 0x00, 0x07, 0xec, 0x00, 0xfe, 0x30, 0x00, 0xd2, 0x3e, 0xff, 0x13, 0xdb, 0xff, 0x3c, \n  0x1e, 0x00, 0x35, 0x91, 0x00, 0x0c, 0x4e, 0x01, 0x27, 0xd4, 0x01, 0x00, 0x29, 0x02, 0xbb, 0x35, \n  0x01, 0x2c, 0x61, 0x00, 0x65, 0x79, 0x00, 0x67, 0x17, 0x00, 0xd4, 0x75, 0xff, 0xc0, 0x16, 0xff, \n  0x98, 0xd7, 0xfe, 0x6a, 0x84, 0xfe, 0x04, 0x91, 0x0e, 0xf1, 0xf3, 0x14, 0x03, 0x86, 0x08, 0xc1, \n  0x5e, 0x03, 0x56, 0xef, 0x07, 0x44, 0xee, 0x05, 0x65, 0xd8, 0xfc, 0xa3, 0x26, 0xfd, 0x7e, 0x8e, \n  0x05, 0xee, 0xad, 0x02, 0x26, 0x1c, 0xfd, 0x92, 0xfb, 0xff, 0xb3, 0x99, 0x02, 0x02, 0x4e, 0x01, \n  0x41, 0xd4, 0xff, 0xbe, 0x60, 0x00, 0x03, 0x10, 0x00, 0xfe, 0x08, 0xff, 0x26, 0x6f, 0xff, 0xd6, \n  0x95, 0xff, 0xd4, 0xb3, 0xff, 0x04, 0x86, 0xff, 0x47, 0xaf, 0xff, 0xbb, 0x54, 0x01, 0x0d, 0xdd, \n  0x01, 0x99, 0x77, 0x01, 0x80, 0x26, 0x01, 0xa0, 0xa7, 0x00, 0x4c, 0x70, 0x00, 0xfc, 0xda, 0xff, \n  0xd0, 0x1b, 0xff, 0x13, 0xa5, 0xfe, 0x85, 0x1a, 0x10, 0x37, 0xf1, 0x16, 0x7f, 0x18, 0x09, 0xf8, \n  0x52, 0x03, 0x37, 0x34, 0x08, 0x2d, 0xac, 0x05, 0xe7, 0xa9, 0xfb, 0x5f, 0x5b, 0xfd, 0xd1, 0xd7, \n  0x06, 0xa9, 0xf1, 0x01, 0x19, 0x7b, 0xfb, 0xec, 0xab, 0xff, 0x68, 0xe1, 0x02, 0xf0, 0x5c, 0x01, \n  0xdd, 0xe5, 0xff, 0x88, 0x2a, 0x00, 0xbc, 0x8e, 0xff, 0x82, 0xcf, 0xfe, 0x9c, 0x48, 0xff, 0xbe, \n  0x79, 0xff, 0xf6, 0x7f, 0xff, 0xdf, 0x03, 0xff, 0x9f, 0xc0, 0xfe, 0xbd, 0xad, 0xff, 0x7f, 0x2f, \n  0x00, 0x75, 0xab, 0x00, 0xaa, 0x84, 0x01, 0x83, 0x77, 0x01, 0xc6, 0x05, 0x01, 0x8f, 0xa0, 0x00, \n  0xfc, 0x0b, 0x00, 0x7e, 0x42, 0xff, 0x33, 0x12, 0x12, 0xad, 0x12, 0x19, 0xeb, 0x25, 0x09, 0xd5, \n  0x78, 0x03, 0xe2, 0xed, 0x08, 0xfe, 0xea, 0x04, 0xce, 0x5d, 0xfa, 0xd6, 0x45, 0xfe, 0x91, 0x45, \n  0x08, 0xb4, 0xe9, 0x00, 0x5f, 0x03, 0xfa, 0x11, 0xaa, 0xff, 0x2b, 0x3f, 0x03, 0xf6, 0x5a, 0x01, \n  0x96, 0xbb, 0xff, 0x81, 0x04, 0x00, 0x27, 0x87, 0xff, 0x5f, 0xcd, 0xfe, 0x34, 0xfd, 0xfe, 0xb9, \n  0x6a, 0xff, 0xd5, 0x9a, 0xff, 0x41, 0xd3, 0xfe, 0x25, 0x91, 0xfe, 0x81, 0x37, 0xff, 0xd7, 0x70, \n  0xff, 0x1a, 0x9b, 0xff, 0x2f, 0x07, 0x00, 0x1e, 0xa1, 0x00, 0x7f, 0x44, 0x01, 0x2d, 0x40, 0x01, \n  0x64, 0x9b, 0x00, 0x2b, 0xec, 0xff, 0xbd, 0x48, 0x14, 0x0b, 0x10, 0x1b, 0x41, 0xbd, 0x08, 0xe2, \n  0xfe, 0x03, 0xb4, 0xee, 0x09, 0x8f, 0x72, 0x03, 0xe2, 0xb9, 0xf8, 0xd5, 0x85, 0xff, 0x9f, 0xad, \n  0x09, 0x7c, 0xbb, 0xff, 0x1b, 0xb4, 0xf8, 0x9d, 0x59, 0xff, 0x06, 0x4b, 0x03, 0xfe, 0x8a, 0x01, \n  0xe4, 0x89, 0xff, 0x45, 0xca, 0xff, 0x7a, 0x4c, 0xff, 0x5d, 0x84, 0xfe, 0x0f, 0x9d, 0xfe, 0x2f, \n  0x5f, 0xff, 0xc1, 0xe6, 0xff, 0xe1, 0x78, 0xfe, 0x54, 0x79, 0xfe, 0xd2, 0x09, 0xff, 0xc0, 0x8b, \n  0xfe, 0xbb, 0x88, 0xff, 0xea, 0xed, 0xff, 0xcb, 0x59, 0xff, 0xf5, 0x97, 0xff, 0xac, 0x2f, 0x00, \n  0x62, 0x9c, 0x00, 0x24, 0x90, 0x00, 0x8a, 0xc6, 0x16, 0x20, 0x39, 0x1d, 0x98, 0x24, 0x08, 0xcf, \n  0x50, 0x04, 0x5a, 0xda, 0x0a, 0x4d, 0x0e, 0x02, 0xf2, 0x51, 0xf7, 0x07, 0xbd, 0x00, 0x7d, 0xb1, \n  0x0a, 0xed, 0x8b, 0xfe, 0x26, 0xeb, 0xf7, 0xba, 0x32, 0xff, 0xfa, 0xfb, 0x02, 0xf8, 0x79, 0x01, \n  0x53, 0x51, 0xff, 0x5a, 0x0b, 0x00, 0xc0, 0x66, 0xff, 0x65, 0xb0, 0xfd, 0x4a, 0x20, 0xfe, 0x7b, \n  0x55, 0xff, 0xd4, 0x0d, 0x00, 0xc4, 0x91, 0xfe, 0x54, 0x47, 0xfe, 0xfc, 0xd5, 0xfe, 0x1e, 0x2b, \n  0xfe, 0x15, 0x61, 0xff, 0xd6, 0xe9, 0xff, 0x2a, 0x0b, 0xff, 0x1a, 0x09, 0xff, 0xe7, 0xf3, 0xfe, \n  0x08, 0x40, 0xff, 0xe6, 0xbf, 0xff, 0x30, 0xc1, 0x18, 0x90, 0x56, 0x1f, 0xa1, 0x79, 0x08, 0xc9, \n  0x83, 0x04, 0xb9, 0x68, 0x0b, 0xbf, 0x7c, 0x01, 0x03, 0xde, 0xf5, 0xc8, 0x5d, 0x01, 0x48, 0x69, \n  0x0c, 0x48, 0xbc, 0xfd, 0x46, 0xb6, 0xf6, 0x4a, 0x71, 0xff, 0xa5, 0xd8, 0x02, 0x74, 0x3f, 0x01, \n  0x11, 0x65, 0xff, 0x6c, 0xe7, 0xff, 0x3b, 0xb4, 0xff, 0xbe, 0xc6, 0xfd, 0x61, 0x61, 0xfd, 0x46, \n  0x2f, 0xff, 0x01, 0x5c, 0x00, 0x80, 0x27, 0xfe, 0x65, 0x29, 0xfe, 0x3f, 0x85, 0xff, 0xb0, 0x17, \n  0xfe, 0x93, 0xd5, 0xfe, 0xcb, 0xfe, 0xff, 0xaa, 0x03, 0xff, 0x78, 0xe2, 0xfe, 0x4d, 0xec, 0xfe, \n  0x94, 0x81, 0xfe, 0x47, 0x6f, 0xfe, 0x1f, 0x72, 0x1a, 0x69, 0x36, 0x21, 0x61, 0xc0, 0x08, 0x35, \n  0x42, 0x05, 0xf6, 0x72, 0x0c, 0xc8, 0xfc, 0xff, 0x11, 0xff, 0xf3, 0x90, 0x81, 0x02, 0x3a, 0xc2, \n  0x0d, 0xe0, 0xe3, 0xfc, 0x34, 0xc0, 0xf5, 0xd0, 0x46, 0xff, 0x43, 0xbc, 0x02, 0x52, 0x06, 0x01, \n  0x79, 0x1a, 0xff, 0x57, 0xb6, 0xff, 0xe8, 0xea, 0xff, 0xde, 0xda, 0xfd, 0x0b, 0xd3, 0xfc, 0x7b, \n  0xe4, 0xfe, 0xaa, 0x70, 0x00, 0xed, 0xd1, 0xfd, 0xfb, 0xbd, 0xfd, 0x73, 0x8c, 0xff, 0xbf, 0x5e, \n  0xfe, 0x06, 0xab, 0xfe, 0x54, 0x94, 0xff, 0x75, 0x38, 0xff, 0x9f, 0xfa, 0xfe, 0x9e, 0x5f, 0xfe, \n  0x97, 0x05, 0xfe, 0x56, 0x0a, 0xfe, 0x0e, 0xf8, 0x1b, 0x6b, 0x5c, 0x23, 0x37, 0x89, 0x09, 0x41, \n  0x22, 0x05, 0x9d, 0x10, 0x0d, 0x7a, 0xec, 0xff, 0xb8, 0x95, 0xf2, 0x72, 0x9c, 0x02, 0xae, 0xae, \n  0x0e, 0xb8, 0xc6, 0xfc, 0x11, 0x43, 0xf5, 0x8d, 0xfe, 0xfe, 0x82, 0xb4, 0x02, 0x67, 0x9e, 0x00, \n  0x6e, 0xeb, 0xfe, 0xe0, 0xcd, 0xff, 0x93, 0xdb, 0xff, 0x14, 0x42, 0xfe, 0x91, 0x79, 0xfc, 0xd3, \n  0x11, 0xfe, 0x0b, 0xf3, 0x00, 0x15, 0x31, 0xfe, 0xb5, 0x04, 0xfd, 0xe5, 0x27, 0xff, 0xbb, 0x77, \n  0xfe, 0xb8, 0xd5, 0xfe, 0x29, 0x9d, 0xff, 0xd3, 0x20, 0xff, 0x5e, 0x10, 0xff, 0x90, 0x23, 0xfe, \n  0x7c, 0xaa, 0xfd, 0x96, 0xf6, 0xfd, 0x93, 0xfb, 0x1c, 0x27, 0x17, 0x26, 0xef, 0x1b, 0x0b, 0x35, \n  0xa1, 0x03, 0xd1, 0xe8, 0x0c, 0x11, 0xa8, 0x01, 0xc8, 0xd4, 0xf1, 0x69, 0x1e, 0x01, 0xda, 0xba, \n  0x0e, 0x66, 0x71, 0xfd, 0xdd, 0x9e, 0xf5, 0x5e, 0x1f, 0xfe, 0x33, 0x3d, 0x02, 0x36, 0xbb, 0x00, \n  0xa8, 0x78, 0xfe, 0x16, 0xd7, 0xff, 0x59, 0x05, 0x00, 0x00, 0x45, 0xfe, 0x52, 0x66, 0xfc, 0x69, \n  0x7b, 0xfd, 0x7c, 0xc5, 0x00, 0xb4, 0xb5, 0xfe, 0x62, 0x0b, 0xfd, 0x2c, 0x50, 0xfe, 0x91, 0x25, \n  0xfe, 0xd2, 0x57, 0xff, 0x02, 0x9a, 0xff, 0x25, 0x92, 0xfe, 0x5a, 0xfd, 0xfe, 0xdc, 0x5e, 0xfe, \n  0x74, 0x99, 0xfd, 0x0c, 0xd4, 0xfd, 0x3f, 0xbd, 0x1d, 0x8c, 0xb3, 0x27, 0x5a, 0x29, 0x0d, 0x36, \n  0x78, 0x03, 0x89, 0x17, 0x0c, 0xc1, 0x73, 0x03, 0x02, 0xc1, 0xf1, 0xea, 0xe0, 0xfe, 0x41, 0xa0, \n  0x0e, 0x1a, 0x55, 0xfe, 0xa1, 0x0c, 0xf6, 0xb5, 0x95, 0xfd, 0xa1, 0x63, 0x01, 0xcd, 0xd1, 0x00, \n  0xd1, 0x5d, 0xfe, 0xad, 0x72, 0xff, 0x57, 0x1d, 0x00, 0x82, 0x90, 0xfe, 0xdb, 0x5b, 0xfc, 0xbc, \n  0xe8, 0xfc, 0x10, 0xa0, 0x00, 0xd3, 0xd3, 0xfe, 0x9d, 0xdb, 0xfc, 0xbc, 0x64, 0xfe, 0xdd, 0xed, \n  0xfd, 0xb8, 0xdf, 0xfe, 0xe2, 0xaf, 0xff, 0xaa, 0x77, 0xfe, 0xe7, 0x73, 0xfe, 0x81, 0x9a, 0xfe, \n  0xed, 0xcb, 0xfd, 0x0e, 0x01, 0xfd, 0xd5, 0xab, 0x1f, 0x35, 0xe9, 0x27, 0x01, 0x9e, 0x0d, 0xc3, \n  0xa7, 0x05, 0x67, 0x37, 0x0c, 0xe9, 0x76, 0x03, 0x7f, 0x88, 0xf1, 0x73, 0x2a, 0xfe, 0xaa, 0x43, \n  0x0e, 0x09, 0x12, 0xfe, 0x28, 0x2a, 0xf7, 0x95, 0x88, 0xfd, 0x63, 0x4d, 0x00, 0x77, 0x12, 0x01, \n  0xea, 0x59, 0xfe, 0xf3, 0xc6, 0xfe, 0x74, 0x38, 0x00, 0x99, 0x77, 0xff, 0x55, 0x75, 0xfc, 0xca, \n  0x17, 0xfc, 0x75, 0x67, 0x00, 0xc5, 0x43, 0xff, 0x3d, 0xd7, 0xfc, 0x62, 0x35, 0xfe, 0x62, 0xee, \n  0xfd, 0xa2, 0x94, 0xfe, 0xe1, 0x80, 0xff, 0x08, 0x98, 0xfe, 0x21, 0x7c, 0xfe, 0x48, 0x2d, 0xfe, \n  0xdc, 0x79, 0xfd, 0x86, 0xcb, 0xfc, 0xdc, 0xcf, 0x22, 0x9c, 0x0b, 0x27, 0x22, 0xc1, 0x0b, 0x3f, \n  0x7d, 0x09, 0x0c, 0x0b, 0x0e, 0xa9, 0xad, 0x01, 0xb9, 0xa6, 0xf0, 0xbe, 0x17, 0xff, 0x54, 0x53, \n  0x0d, 0xb9, 0x3d, 0xfc, 0xf1, 0x09, 0xf9, 0x7e, 0x29, 0xfe, 0x9d, 0xe4, 0xfe, 0x37, 0xce, 0x00, \n  0xe8, 0x49, 0xfe, 0x6a, 0x62, 0xfe, 0x14, 0xd6, 0xff, 0xad, 0x67, 0x00, 0xe0, 0xcc, 0xfc, 0x98, \n  0x09, 0xfb, 0x63, 0xf8, 0xff, 0x8c, 0xd7, 0xff, 0x56, 0x30, 0xfd, 0xdc, 0x4f, 0xfd, 0xa9, 0xc6, \n  0xfd, 0xd7, 0xd4, 0xfe, 0xc1, 0x08, 0xff, 0x5e, 0x9e, 0xfe, 0x99, 0x8f, 0xfe, 0x35, 0x9b, 0xfd, \n  0x98, 0xab, 0xfc, 0x93, 0x16, 0xfd, 0x84, 0xd5, 0x24, 0x1b, 0xdd, 0x25, 0xff, 0x67, 0x0a, 0x8e, \n  0xe3, 0x0c, 0x24, 0x8c, 0x11, 0x5e, 0x81, 0x01, 0x25, 0xa3, 0xed, 0xee, 0x3c, 0x00, 0xef, 0x3b, \n  0x0e, 0x98, 0x91, 0xf8, 0x8d, 0x4e, 0xfa, 0xb7, 0x0e, 0x01, 0x18, 0xa6, 0xfd, 0xa4, 0xed, 0xfe, \n  0x31, 0xba, 0xfe, 0xab, 0x01, 0xff, 0xc9, 0x4d, 0xfe, 0xfe, 0xa6, 0x01, 0x4a, 0x12, 0xfe, 0xa6, \n  0x4d, 0xf9, 0x8d, 0xea, 0xff, 0x80, 0x7a, 0x00, 0xe0, 0x69, 0xfd, 0xcd, 0xf2, 0xfc, 0xf1, 0x48, \n  0xfd, 0x81, 0x2a, 0xff, 0xad, 0xdd, 0xfe, 0x88, 0x73, 0xfe, 0xff, 0x58, 0xfe, 0xed, 0x65, 0xfd, \n  0xee, 0xc4, 0xfc, 0x2a, 0xeb, 0xfc, 0x0a, 0x86, 0x27, 0x9d, 0xfd, 0x23, 0x1b, 0x23, 0x06, 0xd2, \n  0xc4, 0x12, 0x91, 0x9a, 0x17, 0xb7, 0x6b, 0xfd, 0xf8, 0xed, 0xea, 0x55, 0x13, 0x05, 0x1c, 0x14, \n  0x0e, 0x9d, 0x45, 0xf2, 0x9a, 0xb8, 0xfb, 0xb1, 0x31, 0x05, 0x24, 0x05, 0xfd, 0xb8, 0x39, 0xfd, \n  0xbb, 0xc9, 0xfd, 0x80, 0xcb, 0xff, 0x2e, 0x9b, 0xfd, 0xb3, 0x6d, 0x01, 0x9d, 0x1e, 0x00, 0x8a, \n  0x88, 0xf8, 0xa2, 0xb1, 0xfe, 0xd5, 0x06, 0x01, 0xee, 0xe5, 0xfd, 0x50, 0xe7, 0xfc, 0x7d, 0x24, \n  0xfd, 0x90, 0x2a, 0xff, 0x58, 0x59, 0xfe, 0x7a, 0x4d, 0xfe, 0xab, 0x10, 0xfe, 0x49, 0xb7, 0xfd, \n  0x7a, 0x6f, 0xfd, 0x18, 0x81, 0xfb, 0xaf, 0xd6, 0x2a, 0xb9, 0x9a, 0x24, 0x50, 0xa1, 0x00, 0x84, \n  0x68, 0x14, 0x82, 0xd2, 0x1d, 0xb7, 0xec, 0xfb, 0x5a, 0x06, 0xe9, 0x29, 0x0d, 0x09, 0xfa, 0xc3, \n  0x0d, 0x20, 0xce, 0xeb, 0x04, 0x2b, 0xfc, 0x64, 0x06, 0x0a, 0x98, 0xf7, 0xfc, 0x3d, 0x53, 0xfb, \n  0x82, 0xaa, 0xfc, 0x30, 0xca, 0x00, 0xe6, 0x7d, 0xfd, 0xb4, 0xbc, 0xff, 0xf5, 0x0c, 0x02, 0x77, \n  0x3f, 0xf9, 0x75, 0xc1, 0xfc, 0x7c, 0x54, 0x01, 0x68, 0xbb, 0xfe, 0xe6, 0xd2, 0xfc, 0x35, 0x0f, \n  0xfd, 0x8d, 0x55, 0xff, 0xca, 0x32, 0xfe, 0x14, 0xb5, 0xfd, 0x20, 0xf0, 0xfd, 0xa8, 0xaf, 0xfd, \n  0xb5, 0x8a, 0xfd, 0xba, 0x9c, 0xfb, 0x2c, 0x81, 0x2f, 0xb6, 0xc3, 0x26, 0x80, 0x6c, 0xfa, 0xf9, \n  0xa7, 0x11, 0xf2, 0x7f, 0x23, 0x91, 0xc8, 0xfd, 0xf4, 0x36, 0xe7, 0xa1, 0x8f, 0x0b, 0x5b, 0x75, \n  0x0d, 0xb8, 0x66, 0xe6, 0x3c, 0xb2, 0xfb, 0x90, 0x24, 0x0e, 0x6b, 0xeb, 0xfd, 0x6a, 0x45, 0xf9, \n  0x07, 0x6f, 0xfb, 0xd1, 0xc7, 0x01, 0xd7, 0x17, 0xfe, 0x15, 0x72, 0xfd, 0xdc, 0x4e, 0x02, 0x1e, \n  0x96, 0xfb, 0xc3, 0x25, 0xfb, 0x7a, 0x72, 0x00, 0x74, 0x2a, 0x00, 0x26, 0x98, 0xfc, 0x5b, 0x18, \n  0xfd, 0x82, 0x19, 0x00, 0x5b, 0x9a, 0xfd, 0xee, 0x3b, 0xfd, 0xb8, 0x20, 0xfe, 0x47, 0xa8, 0xfc, \n  0x44, 0x5f, 0xfd, 0x45, 0xce, 0xfc, 0x39, 0x8e, 0x34, 0xc8, 0x5f, 0x29, 0xaa, 0x24, 0xf4, 0xfb, \n  0x06, 0x0e, 0x54, 0x85, 0x27, 0xbe, 0x28, 0x00, 0x81, 0x61, 0xe7, 0xff, 0x76, 0x0d, 0x98, 0x9f, \n  0x0c, 0xc7, 0x19, 0xe2, 0x8e, 0x1e, 0xfa, 0xf1, 0x1a, 0x11, 0x58, 0x4d, 0x00, 0xa6, 0x87, 0xf7, \n  0xd4, 0x9c, 0xf9, 0x7c, 0x9f, 0x02, 0xfa, 0xea, 0xfe, 0x84, 0xd1, 0xfb, 0x52, 0x14, 0x01, 0xb0, \n  0xb5, 0xfd, 0x30, 0x47, 0xfb, 0xcb, 0x76, 0xfe, 0x99, 0x10, 0x01, 0x17, 0x37, 0xfd, 0x54, 0x19, \n  0xfd, 0xca, 0x02, 0x01, 0xf5, 0x29, 0xfd, 0xde, 0xa6, 0xfc, 0xb5, 0xd2, 0xfd, 0x98, 0x01, 0xfc, \n  0x45, 0x1c, 0xfd, 0x9a, 0xb4, 0xfc, 0xe9, 0xdd, 0x38, 0x7a, 0x85, 0x2c, 0x4e, 0x44, 0xf0, 0xe4, \n  0x05, 0x08, 0xe1, 0xdf, 0x28, 0x4c, 0x4c, 0x05, 0xf4, 0xfe, 0xe7, 0x65, 0xb7, 0x0e, 0xac, 0xd7, \n  0x0c, 0xaa, 0x1d, 0xde, 0x5c, 0xf8, 0xf7, 0x2d, 0x9b, 0x12, 0x63, 0x7c, 0x03, 0x4c, 0x02, 0xf7, \n  0x55, 0x1e, 0xf7, 0x27, 0x2e, 0x03, 0x7a, 0xeb, 0xff, 0x5f, 0x11, 0xfb, 0x00, 0x03, 0xff, 0x0b, \n  0xa8, 0xfe, 0xeb, 0x21, 0xfd, 0xf8, 0x6e, 0xfc, 0xaa, 0xe5, 0x00, 0xce, 0xc1, 0xfe, 0xc8, 0x12, \n  0xfd, 0x8c, 0xde, 0x01, 0x25, 0x39, 0xfd, 0xb8, 0xb3, 0xfb, 0x31, 0x8c, 0xfd, 0xe1, 0x93, 0xfb, \n  0x38, 0x56, 0xfc, 0xe6, 0x24, 0xfc, 0xc4, 0x9b, 0x3c, 0xb2, 0x23, 0x30, 0x05, 0x01, 0xee, 0x28, \n  0x68, 0x01, 0xaa, 0xa4, 0x27, 0x6c, 0x8d, 0x0a, 0xf2, 0xcc, 0xe9, 0x46, 0x26, 0x10, 0x4c, 0x60, \n  0x0d, 0x7c, 0x73, 0xda, 0x3e, 0xc5, 0xf5, 0xec, 0xd3, 0x12, 0x05, 0x65, 0x06, 0xa3, 0xae, 0xf7, \n  0x02, 0xaf, 0xf4, 0x79, 0x0a, 0x03, 0x1e, 0xba, 0x00, 0x82, 0x41, 0xfb, 0xe1, 0xe6, 0xfc, 0x5d, \n  0x07, 0xfe, 0x1e, 0x6a, 0xff, 0xde, 0x91, 0xfb, 0x11, 0xdf, 0xff, 0xec, 0x50, 0x00, 0x90, 0xd4, \n  0xfd, 0x33, 0xe5, 0x01, 0xef, 0x2a, 0xfd, 0xd5, 0x83, 0xfb, 0xc5, 0x39, 0xfd, 0xfc, 0xae, 0xfa, \n  0x4d, 0x88, 0xfb, 0x03, 0xdb, 0xfb, 0xf6, 0x12, 0x43, 0x2e, 0x4b, 0x31, 0xf7, 0x9a, 0xe9, 0x8d, \n  0xfa, 0xfe, 0x09, 0xb3, 0x25, 0xc5, 0x18, 0x0a, 0x55, 0x00, 0xee, 0xec, 0x1c, 0x15, 0xaa, 0x5a, \n  0x0a, 0x50, 0xe1, 0xd6, 0xd9, 0x1b, 0xf6, 0x40, 0x12, 0x12, 0x6b, 0xf4, 0x07, 0x07, 0x53, 0xf8, \n  0x96, 0x69, 0xf3, 0x7d, 0xb5, 0x02, 0x90, 0xa3, 0x00, 0x60, 0xe1, 0xfb, 0xbd, 0x99, 0xfb, 0xb2, \n  0x8e, 0xfc, 0xaf, 0x7b, 0x00, 0xd5, 0x33, 0xfc, 0x19, 0x14, 0xff, 0xf7, 0x20, 0x01, 0xd4, 0x9e, \n  0xff, 0x5a, 0xf8, 0x00, 0xd6, 0x96, 0xfc, 0x40, 0x7b, 0xfc, 0xb0, 0x76, 0xfc, 0x01, 0xaf, 0xf9, \n  0xc1, 0x26, 0xfb, 0xc9, 0x56, 0xfb, 0x83, 0x1c, 0x48, 0xf5, 0x98, 0x34, 0x31, 0x49, 0xe5, 0x8e, \n  0x90, 0xfc, 0x23, 0xc8, 0x23, 0x2c, 0x1e, 0x08, 0x56, 0x26, 0xf2, 0x54, 0x14, 0x1a, 0x27, 0x5f, \n  0x09, 0x6d, 0x4c, 0xd3, 0xa2, 0x72, 0xf5, 0x9f, 0x4a, 0x12, 0x59, 0x44, 0x08, 0x64, 0x4c, 0xf9, \n  0x4b, 0x2c, 0xf3, 0xeb, 0xb0, 0x01, 0x52, 0x4a, 0x00, 0x20, 0x99, 0xfc, 0xcb, 0x4b, 0xfb, 0xc6, \n  0xf3, 0xfa, 0x2d, 0x1c, 0x00, 0x7d, 0x6b, 0xfd, 0x62, 0x7a, 0xff, 0xee, 0xae, 0x01, 0x11, 0xd4, \n  0x00, 0x1f, 0x0a, 0x00, 0x78, 0x99, 0xfc, 0xfa, 0x44, 0xfd, 0x31, 0xab, 0xfb, 0xb0, 0x6d, 0xf9, \n  0x32, 0x8d, 0xfa, 0x0a, 0xad, 0xfa, 0x64, 0x37, 0x4e, 0x5a, 0x1d, 0x36, 0x69, 0xee, 0xe0, 0xa7, \n  0x61, 0xfb, 0xcf, 0x34, 0x22, 0x47, 0xff, 0x03, 0xdd, 0xaf, 0xf4, 0xaa, 0xac, 0x20, 0xff, 0x29, \n  0x08, 0x16, 0x86, 0xcf, 0x47, 0x55, 0xf5, 0x1b, 0xc1, 0x12, 0x84, 0xc4, 0x07, 0x47, 0x0c, 0xf9, \n  0x3e, 0x5d, 0xf4, 0x0a, 0x89, 0x00, 0x6f, 0xa9, 0xfe, 0x14, 0x92, 0xfd, 0xf2, 0x6c, 0xfb, 0xfb, \n  0xbd, 0xf9, 0xde, 0xb2, 0xfe, 0x58, 0xc9, 0xfd, 0x3e, 0x66, 0x01, 0x5f, 0x8a, 0x02, 0xa2, 0x35, \n  0x00, 0x5f, 0x9e, 0xff, 0xd0, 0x6c, 0xfd, 0x08, 0x0c, 0xfd, 0x29, 0x2d, 0xfb, 0x09, 0x88, 0xf9, \n  0xaa, 0x8b, 0xf9, 0xaf, 0x56, 0xfa, 0xca, 0x79, 0x52, 0xa2, 0xfc, 0x39, 0xd9, 0x71, 0xdd, 0x78, \n  0x29, 0xf9, 0x5c, 0x47, 0x21, 0x6b, 0x80, 0x00, 0xae, 0xd4, 0xf4, 0x99, 0xd4, 0x25, 0x7f, 0xc1, \n  0x0a, 0x3e, 0xf1, 0xcb, 0x5d, 0xc2, 0xf3, 0xee, 0xf4, 0x13, 0x80, 0xc3, 0x06, 0x76, 0xf2, 0xf8, \n  0xdf, 0xe2, 0xf5, 0x59, 0xb7, 0xff, 0x58, 0x54, 0xfc, 0xb7, 0x61, 0xfe, 0x44, 0x7c, 0xfc, 0xff, \n  0x79, 0xf8, 0xac, 0xb4, 0xfd, 0x0d, 0x13, 0xfd, 0x59, 0x99, 0x03, 0x59, 0xd2, 0x04, 0x61, 0x03, \n  0xfe, 0x0d, 0xb8, 0xff, 0x4a, 0x3b, 0xff, 0x4f, 0xfa, 0xfb, 0x06, 0x5e, 0xfb, 0xcd, 0xe1, 0xf9, \n  0xfe, 0x88, 0xf8, 0x67, 0x25, 0xfa, 0x1d, 0xd4, 0x56, 0xd1, 0xc3, 0x3c, 0x66, 0x1d, 0xdb, 0x53, \n  0xf6, 0xf6, 0xce, 0x75, 0x20, 0x51, 0x92, 0xfd, 0xe3, 0x6e, 0xf2, 0x0f, 0x59, 0x2a, 0xc3, 0x13, \n  0x0e, 0x92, 0x27, 0xc9, 0x93, 0xb5, 0xf2, 0x57, 0x1f, 0x14, 0xd0, 0xcc, 0x05, 0xcb, 0xc5, 0xf8, \n  0xbf, 0x60, 0xf7, 0xa7, 0x2d, 0xff, 0x10, 0x8d, 0xf9, 0xee, 0x28, 0xff, 0x0b, 0x40, 0xfd, 0x3f, \n  0x9d, 0xf7, 0x9f, 0x7e, 0xfd, 0xa4, 0x5a, 0xfb, 0xf1, 0x27, 0x05, 0xda, 0xde, 0x07, 0x2d, 0xd3, \n  0xfb, 0x08, 0x54, 0xff, 0x40, 0x87, 0x01, 0xc4, 0xfe, 0xfa, 0xbf, 0x39, 0xfb, 0x2d, 0xef, 0xfa, \n  0xfb, 0x5b, 0xf7, 0x46, 0x7c, 0xf9, 0x37, 0x6e, 0x5a, 0xfb, 0x13, 0x3f, 0x8a, 0x5a, 0xda, 0xdd, \n  0x95, 0xf4, 0x66, 0xc4, 0x1f, 0x2e, 0xa8, 0xfb, 0xa8, 0xf6, 0xed, 0xfa, 0x9f, 0x2d, 0x19, 0x0b, \n  0x12, 0xba, 0xd6, 0xc7, 0x4d, 0x6e, 0xf2, 0xae, 0xa0, 0x12, 0xe3, 0xcc, 0x04, 0x82, 0x87, 0xf9, \n  0xff, 0x4c, 0xf8, 0xc5, 0x6c, 0xfe, 0x42, 0x60, 0xf7, 0x60, 0xbd, 0xff, 0xf9, 0x65, 0xfd, 0xd5, \n  0x7c, 0xf7, 0xed, 0xf5, 0xfd, 0x10, 0x51, 0xf9, 0x31, 0x68, 0x05, 0x30, 0xe7, 0x0a, 0x7e, 0x46, \n  0xfb, 0x80, 0x03, 0xfe, 0x05, 0xc5, 0x03, 0xda, 0x5f, 0xfb, 0x88, 0x4c, 0xfa, 0x28, 0x36, 0xfc, \n  0x24, 0x81, 0xf6, 0x3a, 0x22, 0xf8, 0xee, 0xa5, 0x5d, 0x69, 0xc6, 0x40, 0x64, 0xb3, 0xd9, 0x02, \n  0x27, 0xf4, 0xfe, 0x81, 0x1e, 0xef, 0x1d, 0xf9, 0x4d, 0x3f, 0xea, 0x2e, 0x7b, 0x2e, 0xf5, 0x56, \n  0x15, 0xc7, 0x7f, 0xc8, 0xf7, 0xfa, 0xf2, 0x90, 0x37, 0x10, 0x14, 0xcb, 0x02, 0xcf, 0x8e, 0xfb, \n  0x91, 0xd3, 0xf8, 0xea, 0x98, 0xfc, 0x8e, 0x63, 0xf6, 0xba, 0x2e, 0x00, 0xf9, 0x04, 0xfd, 0x74, \n  0xd8, 0xf7, 0x5d, 0xa2, 0xfe, 0x6c, 0x9f, 0xf7, 0x27, 0x79, 0x04, 0x90, 0xb9, 0x0c, 0x26, 0xb1, \n  0xfc, 0xaa, 0xc5, 0xfc, 0xcb, 0xdf, 0x04, 0x30, 0x64, 0xfd, 0x09, 0xfe, 0xf8, 0x89, 0x94, 0xfc, \n  0xa7, 0x32, 0xf6, 0xfb, 0x32, 0xf6, 0xa3, 0xca, 0x60, 0x2e, 0x2a, 0x42, 0x08, 0xe7, 0xd8, 0x1c, \n  0x2b, 0xf6, 0x37, 0xaa, 0x1c, 0x8a, 0x55, 0xf5, 0xb2, 0xa1, 0xe8, 0x2a, 0x17, 0x2d, 0xc7, 0x72, \n  0x17, 0xfe, 0x97, 0xcb, 0xd2, 0x9d, 0xf3, 0x5c, 0x31, 0x0d, 0x87, 0x9e, 0x00, 0x51, 0x5f, 0xfe, \n  0x4f, 0x6c, 0xf9, 0xad, 0x34, 0xfa, 0x9b, 0x32, 0xf6, 0x16, 0x59, 0x01, 0x96, 0x89, 0xfc, 0xd5, \n  0x08, 0xf8, 0xa8, 0xe0, 0xff, 0x0f, 0x87, 0xf6, 0xc8, 0xa9, 0x02, 0x93, 0xf6, 0x0c, 0xc0, 0xdf, \n  0xff, 0x71, 0x2b, 0xfd, 0x8c, 0x0d, 0x04, 0x98, 0x53, 0x00, 0x2f, 0x84, 0xf8, 0xe9, 0xfc, 0xfa, \n  0x38, 0x6e, 0xf6, 0xe3, 0x36, 0xf5, 0x6b, 0xa2, 0x5f, 0x7c, 0xd6, 0x45, 0x00, 0xe8, 0xdc, 0x08, \n  0x22, 0xf4, 0x99, 0x20, 0x1b, 0xb9, 0xec, 0xf4, 0xf6, 0x02, 0xe4, 0x99, 0x6a, 0x29, 0x46, 0x05, \n  0x1b, 0x54, 0x5b, 0xd0, 0x64, 0x19, 0xf3, 0x53, 0x2c, 0x09, 0x44, 0x7a, 0xff, 0xbf, 0xb4, 0x00, \n  0x0a, 0x92, 0xf9, 0xa2, 0xb3, 0xf8, 0xe7, 0xb2, 0xf5, 0xf2, 0xab, 0x02, 0x5c, 0xd2, 0xfc, 0x82, \n  0xf0, 0xf6, 0x3d, 0x6f, 0x01, 0x97, 0xe7, 0xf6, 0x0a, 0xf1, 0xfe, 0x93, 0x96, 0x0b, 0xd0, 0x0b, \n  0x05, 0xd4, 0xba, 0xfe, 0x5a, 0x5f, 0x01, 0x6a, 0x39, 0x03, 0xfd, 0x5d, 0xf8, 0xde, 0x77, 0xf8, \n  0x71, 0xf2, 0xf7, 0xfb, 0x0a, 0xf4, 0xf6, 0x2b, 0x5b, 0xae, 0x58, 0x4a, 0x3b, 0x92, 0xe5, 0xca, \n  0x22, 0xf0, 0x99, 0x50, 0x18, 0x22, 0x1d, 0xf8, 0x9f, 0x10, 0xde, 0x41, 0xff, 0x21, 0x7a, 0x94, \n  0x20, 0xa2, 0x8d, 0xd6, 0x89, 0xe1, 0xf0, 0x0f, 0x6c, 0x06, 0xe3, 0xfb, 0xfd, 0xae, 0xd4, 0x01, \n  0x0e, 0x12, 0xfb, 0xa9, 0x5e, 0xf7, 0x66, 0x9b, 0xf5, 0xab, 0xda, 0x03, 0xa7, 0xf3, 0xfc, 0x46, \n  0x4a, 0xf6, 0xb0, 0x4e, 0x02, 0xc2, 0x28, 0xf8, 0x70, 0xdf, 0xfb, 0xbb, 0x71, 0x08, 0x54, 0x86, \n  0x09, 0xa2, 0x54, 0x02, 0x07, 0xee, 0xfd, 0x4c, 0x80, 0x03, 0x94, 0x79, 0xfa, 0x94, 0xda, 0xf6, \n  0xcc, 0x22, 0xf8, 0xd0, 0x4d, 0xf4, 0x79, 0xba, 0x58, 0x76, 0x29, 0x4c, 0x0e, 0x87, 0xeb, 0x5b, \n  0xaf, 0xf1, 0xe2, 0x2c, 0x14, 0xf8, 0x6b, 0xf8, 0xcb, 0xda, 0xdc, 0x47, 0x72, 0x18, 0x6b, 0xd0, \n  0x23, 0x49, 0x0d, 0xde, 0x70, 0x3d, 0xee, 0xb3, 0x73, 0x05, 0x32, 0xf0, 0xfb, 0xbd, 0xb2, 0x01, \n  0xd5, 0xd5, 0xfd, 0x2f, 0xbc, 0xf6, 0x78, 0x83, 0xf5, 0xaf, 0xa4, 0x04, 0x7c, 0x31, 0xfd, 0x08, \n  0xc4, 0xf5, 0xcb, 0x3e, 0x03, 0x57, 0x51, 0xf9, 0xc4, 0xa0, 0xfa, 0x96, 0xd3, 0x05, 0x33, 0x95, \n  0x09, 0x70, 0x10, 0x06, 0xeb, 0xac, 0xfc, 0x6b, 0x13, 0x02, 0xd7, 0x38, 0xfd, 0x05, 0x76, 0xf6, \n  0x99, 0x0b, 0xf8, 0xe4, 0x20, 0xf5, 0x86, 0x7e, 0x59, 0x5b, 0xbe, 0x4b, 0x04, 0x56, 0xeb, 0x45, \n  0x9c, 0xf9, 0x65, 0xb5, 0x11, 0x0e, 0x9d, 0xf1, 0xbc, 0x78, 0xe0, 0x15, 0x56, 0x11, 0x98, 0x39, \n  0x21, 0x11, 0xf3, 0xe5, 0x86, 0xf6, 0xed, 0x48, 0x41, 0x03, 0x7c, 0x18, 0xfa, 0x54, 0xb6, 0x02, \n  0xc3, 0x34, 0xff, 0xdb, 0x6c, 0xf7, 0x36, 0x31, 0xf6, 0x5c, 0x0a, 0x03, 0x9a, 0x04, 0xff, 0xb4, \n  0x77, 0xf5, 0xed, 0x1f, 0x03, 0x0f, 0xff, 0xfb, 0xa1, 0x00, 0xfa, 0x90, 0x4e, 0x03, 0x1d, 0x93, \n  0x05, 0xd7, 0x43, 0x08, 0x79, 0xd8, 0xff, 0xe2, 0x5c, 0xff, 0xee, 0x2a, 0xff, 0x3f, 0x5c, 0xf8, \n  0x94, 0xf6, 0xf6, 0x8e, 0xe4, 0xf6, 0x89, 0xd8, 0x59, 0x36, 0xae, 0x4b, 0x10, 0xcc, 0xe9, 0xfc, \n  0xf8, 0x01, 0x92, 0x7a, 0x11, 0xcc, 0x75, 0xe8, 0xc9, 0xab, 0xe4, 0x64, 0x5e, 0x0c, 0x6b, 0x68, \n  0x1b, 0x41, 0x2b, 0xee, 0x1e, 0x0b, 0xef, 0xb0, 0x25, 0xff, 0xfa, 0xe5, 0xf9, 0x21, 0xf4, 0x04, \n  0x14, 0xca, 0xfe, 0x9a, 0xff, 0xf8, 0xb4, 0x70, 0xf7, 0x3c, 0x61, 0xff, 0xe5, 0x20, 0x02, 0xac, \n  0x73, 0xf6, 0x84, 0x32, 0x01, 0xfa, 0xde, 0xff, 0x03, 0xf3, 0xf8, 0x3d, 0xb1, 0xfe, 0x66, 0x98, \n  0x02, 0x24, 0xae, 0x08, 0x6d, 0x7b, 0x03, 0x9b, 0xdc, 0xff, 0xc9, 0xfc, 0xfe, 0x0d, 0x85, 0xfa, \n  0x70, 0xda, 0xf8, 0xa9, 0x33, 0xf7, 0x16, 0x2b, 0x59, 0xf5, 0x26, 0x4b, 0x40, 0x3c, 0xea, 0x80, \n  0xd8, 0x07, 0xf8, 0xbd, 0x11, 0x73, 0x93, 0xe1, 0xbf, 0xb9, 0xe6, 0x71, 0x5d, 0x08, 0x54, 0xfe, \n  0x14, 0xd6, 0x9b, 0xf5, 0x19, 0xd6, 0xf0, 0x21, 0x41, 0xfa, 0x35, 0x5a, 0xfb, 0x25, 0xbd, 0x07, \n  0x37, 0x0f, 0xfd, 0xc8, 0x31, 0xfa, 0xf1, 0xda, 0xf9, 0x73, 0x2b, 0xfb, 0x25, 0x8c, 0x04, 0x57, \n  0x3f, 0xfa, 0xbe, 0xca, 0xfc, 0xa6, 0xb0, 0x00, 0x13, 0x8a, 0xfa, 0x81, 0x8a, 0xfa, 0x2d, 0x5f, \n  0xff, 0xa1, 0x8b, 0x08, 0xab, 0x3a, 0x06, 0x33, 0x29, 0x02, 0x52, 0xa3, 0xff, 0xca, 0x5f, 0xfc, \n  0x69, 0x2a, 0xfa, 0x77, 0x9d, 0xf6, 0xa4, 0x99, 0x56, 0xa9, 0xd1, 0x4a, 0x0b, 0xab, 0xed, 0x41, \n  0x73, 0x0a, 0x36, 0x9e, 0x11, 0xd5, 0xa2, 0xdf, 0xc8, 0x85, 0xe6, 0x1f, 0xf3, 0x02, 0xe1, 0x9f, \n  0x10, 0xf1, 0xdc, 0xfb, 0x4d, 0x39, 0xf2, 0xeb, 0x2e, 0xf7, 0x3a, 0xfa, 0xfc, 0x93, 0xd8, 0x09, \n  0xcd, 0x4c, 0xfc, 0x58, 0xfc, 0xf9, 0xbc, 0x7c, 0xfc, 0xb6, 0xfa, 0xf9, 0xe4, 0xc7, 0x03, 0x4f, \n  0x00, 0xfd, 0x5e, 0x7d, 0xfa, 0x4d, 0xb6, 0xfd, 0xb7, 0xfd, 0xfc, 0x2e, 0x59, 0xfb, 0x8a, 0xa5, \n  0xfb, 0x94, 0x06, 0x06, 0x66, 0xe4, 0x07, 0x5a, 0xa7, 0x07, 0x45, 0xbc, 0x00, 0x61, 0xb9, 0xf9, \n  0x96, 0x85, 0xfd, 0xee, 0xa2, 0xf8, 0xd1, 0xba, 0x53, 0xa9, 0x2d, 0x4a, 0xd0, 0x45, 0xf1, 0x0e, \n  0x38, 0x0c, 0x92, 0x2b, 0x11, 0xa5, 0xe3, 0xdf, 0x8a, 0x92, 0xe6, 0x61, 0x78, 0xfc, 0x63, 0xa8, \n  0x0c, 0x5e, 0x9e, 0x02, 0x6e, 0x52, 0xf3, 0xd8, 0x80, 0xf4, 0x81, 0xca, 0xff, 0x3d, 0xc6, 0x0a, \n  0x16, 0x96, 0xfb, 0x44, 0x44, 0xfb, 0xb8, 0xf4, 0xfd, 0x4d, 0xc7, 0xf8, 0xca, 0x89, 0x02, 0x71, \n  0xa1, 0xfd, 0x72, 0x8e, 0xf9, 0x53, 0x51, 0xfb, 0xf9, 0xc5, 0xfe, 0xc4, 0xc6, 0xfe, 0x04, 0xbd, \n  0xf8, 0xef, 0xb3, 0x04, 0x56, 0x7e, 0x08, 0x10, 0x90, 0x07, 0x0e, 0xd0, 0x04, 0x74, 0x0b, 0xfa, \n  0xb1, 0x9d, 0xfd, 0x8e, 0x96, 0xfa, 0x1f, 0x62, 0x53, 0x7e, 0xac, 0x45, 0xf3, 0xc4, 0xf3, 0x58, \n  0x09, 0x10, 0xa8, 0xe1, 0x0d, 0x3d, 0x8c, 0xe1, 0x97, 0x9e, 0xe7, 0x10, 0x7d, 0xf5, 0xc6, 0x5d, \n  0x09, 0x46, 0x5b, 0x08, 0xc2, 0x8d, 0xf5, 0xce, 0x3f, 0xf1, 0xda, 0x2f, 0x02, 0x8b, 0x2d, 0x0d, \n  0x29, 0x91, 0xfa, 0xc9, 0x65, 0xfb, 0xe0, 0x93, 0xfd, 0x84, 0x89, 0xf8, 0x33, 0x76, 0x01, 0x38, \n  0x70, 0xfb, 0x64, 0xa1, 0xfa, 0x01, 0x5c, 0xfc, 0x1a, 0xbc, 0xfc, 0xde, 0xd4, 0x01, 0x55, 0xe4, \n  0xfc, 0x88, 0xa8, 0x01, 0xfd, 0x79, 0x04, 0x60, 0xa1, 0x06, 0x5f, 0x44, 0x09, 0xae, 0xaa, 0xfc, \n  0x27, 0x52, 0xfa, 0x77, 0x70, 0xfc, 0x49, 0x6d, 0x4f, 0x6b, 0xe0, 0x42, 0xed, 0x68, 0xf9, 0x42, \n  0x4c, 0x11, 0xbc, 0x67, 0x09, 0xec, 0x4c, 0xe7, 0x64, 0x88, 0xe9, 0x41, 0xa5, 0xea, 0xec, 0xd4, \n  0x07, 0x3a, 0x87, 0x10, 0xfe, 0x3d, 0xf5, 0x81, 0xb7, 0xee, 0xdb, 0x2f, 0x06, 0x82, 0x73, 0x0d, \n  0xf0, 0x21, 0xf9, 0xf6, 0xd2, 0xfc, 0xc9, 0x39, 0xfb, 0x23, 0xe6, 0xf6, 0x5c, 0xc6, 0x03, 0x1f, \n  0xc0, 0xf9, 0x98, 0x69, 0xf8, 0x9d, 0xd3, 0x00, 0x31, 0x60, 0xfd, 0x56, 0x1e, 0x00, 0x57, 0xe5, \n  0x01, 0x01, 0x4e, 0x01, 0xc6, 0xeb, 0xff, 0xb9, 0x5a, 0x05, 0x5b, 0x4b, 0x08, 0x1c, 0xd3, 0xff, \n  0x2d, 0x22, 0xfd, 0x8c, 0x52, 0xfb, 0x3b, 0x4c, 0x4e, 0x51, 0x2a, 0x3e, 0x24, 0x58, 0xfc, 0xc1, \n  0x9b, 0x13, 0x73, 0xfe, 0x02, 0x8e, 0x98, 0xeb, 0xb1, 0xe6, 0xef, 0x95, 0x30, 0xe2, 0x5e, 0xdd, \n  0x02, 0x17, 0x55, 0x18, 0xa8, 0x11, 0xf8, 0xb9, 0xa1, 0xeb, 0xd5, 0x51, 0x08, 0xe2, 0xe5, 0x0d, \n  0x59, 0x4d, 0xf7, 0x0b, 0x6b, 0xfc, 0x1f, 0xb4, 0xf9, 0xb9, 0xc4, 0xf7, 0x7e, 0xb9, 0x04, 0x67, \n  0xeb, 0xf7, 0x38, 0x6b, 0xf8, 0xaf, 0xca, 0x04, 0x74, 0xc5, 0xfe, 0x59, 0x38, 0xfd, 0xa0, 0xeb, \n  0x03, 0x98, 0x58, 0x04, 0x06, 0xb4, 0xfd, 0xdb, 0xd5, 0x01, 0x3e, 0x29, 0x05, 0x3d, 0x54, 0x01, \n  0x75, 0xf9, 0x01, 0x95, 0xbd, 0xfb, 0x72, 0x93, 0x52, 0x62, 0xe4, 0x39, 0xcc, 0x6e, 0xf4, 0x77, \n  0x71, 0x17, 0x7e, 0x1f, 0x04, 0x55, 0x3b, 0xe8, 0x71, 0x98, 0xf2, 0x68, 0x2e, 0xe4, 0xae, 0x30, \n  0x01, 0xda, 0x8a, 0x17, 0x4c, 0xe8, 0xfa, 0x43, 0x77, 0xed, 0xd6, 0xec, 0x06, 0xd3, 0xae, 0x0d, \n  0x64, 0xff, 0xf5, 0xf6, 0x6f, 0xfa, 0xa3, 0xdf, 0xfa, 0x6c, 0xdc, 0xf8, 0xe6, 0xf1, 0x04, 0x70, \n  0xe0, 0xf8, 0x60, 0x89, 0xf8, 0x12, 0xf6, 0x04, 0xb9, 0x3d, 0x00, 0x29, 0xc3, 0xfe, 0xc1, 0xac, \n  0x03, 0x10, 0xbc, 0x03, 0xbc, 0x2e, 0xfe, 0xb3, 0xc6, 0xff, 0x2d, 0x55, 0x03, 0x63, 0xe2, 0x00, \n  0x39, 0x1a, 0x02, 0x41, 0x0e, 0x00, 0x82, 0x95, 0x56, 0xd8, 0x0a, 0x34, 0x61, 0xfa, 0xe9, 0xc7, \n  0x6f, 0x1e, 0xe8, 0xea, 0x08, 0x44, 0x5b, 0xdf, 0x18, 0x5e, 0xf3, 0xfd, 0x43, 0xec, 0x8f, 0xaa, \n  0xff, 0x0e, 0xc1, 0x13, 0x6b, 0x9d, 0xfd, 0x43, 0x9e, 0xed, 0x33, 0xe5, 0x03, 0xfc, 0x3a, 0x0f, \n  0x53, 0x1a, 0xf6, 0x87, 0xba, 0xf6, 0xaf, 0x25, 0xfc, 0x12, 0x05, 0xfc, 0x75, 0x8e, 0x04, 0x94, \n  0x95, 0xf9, 0x6b, 0xa4, 0xf8, 0xf1, 0x53, 0x03, 0x40, 0xe5, 0x01, 0x6f, 0xbf, 0x00, 0xd3, 0xe5, \n  0x01, 0xc0, 0x88, 0x02, 0xd5, 0x82, 0xff, 0x59, 0x84, 0xfe, 0x9a, 0x7d, 0x01, 0x57, 0xee, 0x00, \n  0x1c, 0x8a, 0x00, 0x33, 0xd6, 0x01, 0x87, 0x53, 0x55, 0x9d, 0x6a, 0x2e, 0x19, 0x75, 0xe3, 0x99, \n  0xc4, 0x25, 0x3b, 0x5b, 0x10, 0x61, 0x4f, 0xd7, 0xf6, 0x33, 0xf1, 0x86, 0x43, 0xf6, 0x1d, 0xe3, \n  0x01, 0xbb, 0xe2, 0x0b, 0xc5, 0xf0, 0xfc, 0x1e, 0xaa, 0xf1, 0x72, 0x23, 0x01, 0x51, 0xf2, 0x0e, \n  0x42, 0x9c, 0xf7, 0xd6, 0x0e, 0xf5, 0x45, 0x48, 0xfe, 0x5e, 0xd4, 0xfd, 0xab, 0xaf, 0x02, 0xf3, \n  0x1b, 0xfa, 0x59, 0x15, 0xfb, 0xf9, 0xb3, 0x02, 0x77, 0x31, 0x00, 0x65, 0x80, 0x01, 0xda, 0x9f, \n  0x02, 0x19, 0x00, 0x02, 0xd5, 0x0f, 0xff, 0xd4, 0x62, 0xff, 0x4d, 0xd0, 0x00, 0x79, 0x4b, 0xfe, \n  0xf1, 0xb3, 0x01, 0xa9, 0xae, 0x02, 0x5f, 0xe3, 0x52, 0x51, 0x3c, 0x29, 0x0e, 0x95, 0xe0, 0xc9, \n  0xa5, 0x2a, 0xd4, 0xa5, 0x14, 0xdd, 0x74, 0xd1, 0xca, 0x9f, 0xf1, 0x88, 0x36, 0xff, 0x27, 0xe9, \n  0xfe, 0xfc, 0x71, 0x05, 0xb8, 0x07, 0x00, 0xbe, 0x99, 0xf3, 0x1c, 0x80, 0xfd, 0x3d, 0x9c, 0x0e, \n  0x43, 0xd5, 0xfa, 0xd7, 0x1d, 0xf5, 0x19, 0x21, 0xff, 0xb4, 0x98, 0xff, 0xc1, 0x69, 0x00, 0x4c, \n  0x4a, 0xfa, 0xf8, 0xc7, 0xfd, 0x19, 0xcb, 0x01, 0x1e, 0x5d, 0xfe, 0xa2, 0x5e, 0x01, 0x51, 0x4a, \n  0x03, 0x08, 0xd9, 0x01, 0x72, 0x88, 0xfe, 0xda, 0x98, 0xff, 0xc8, 0x2b, 0x01, 0x6e, 0x72, 0xfe, \n  0x34, 0xfa, 0x00, 0x2f, 0x41, 0x02, 0xff, 0xec, 0x4d, 0x13, 0x22, 0x27, 0x29, 0xba, 0xe1, 0x1f, \n  0xf9, 0x27, 0xd2, 0xb4, 0x14, 0xa7, 0x24, 0xd6, 0x62, 0x9f, 0xf5, 0x25, 0x93, 0xfe, 0xac, 0x4a, \n  0xfb, 0x4b, 0xfd, 0x03, 0x9b, 0x5c, 0x01, 0x63, 0xa0, 0xf5, 0x1a, 0xc5, 0xfb, 0xeb, 0x5b, 0x0d, \n  0xe1, 0xa0, 0xfd, 0x47, 0x12, 0xf6, 0xb4, 0x84, 0xff, 0x47, 0xf5, 0xff, 0xbf, 0xac, 0xff, 0x6b, \n  0xef, 0xfa, 0x88, 0xa2, 0xfd, 0x7e, 0x35, 0x01, 0x3e, 0x7a, 0xff, 0x52, 0x09, 0x01, 0x02, 0x99, \n  0x01, 0xab, 0x20, 0x02, 0x4a, 0x24, 0xff, 0x37, 0xeb, 0xfe, 0x4c, 0x26, 0x02, 0x40, 0x66, 0x00, \n  0xeb, 0x94, 0xff, 0xb3, 0x49, 0x00, 0x95, 0x51, 0x47, 0x38, 0xa0, 0x25, 0x10, 0xf4, 0xe4, 0x1c, \n  0xde, 0x23, 0x31, 0x2d, 0x16, 0xca, 0xdf, 0xdb, 0x12, 0x76, 0xf4, 0x07, 0x38, 0xff, 0x5a, 0xc8, \n  0xfb, 0x99, 0x2d, 0x00, 0xdf, 0x3a, 0x01, 0x62, 0x4c, 0xf9, 0x06, 0xad, 0xfb, 0xab, 0xec, 0x0a, \n  0xc8, 0xbd, 0xff, 0x27, 0x51, 0xf8, 0x60, 0x39, 0xfe, 0x56, 0xf4, 0xff, 0x57, 0xd8, 0x00, 0xff, \n  0xc1, 0xfa, 0x94, 0x5f, 0xfc, 0x06, 0x59, 0x01, 0x41, 0xe9, 0x00, 0x10, 0x8b, 0x00, 0xe4, 0x2b, \n  0x00, 0x21, 0x87, 0x01, 0x95, 0xb5, 0xff, 0x13, 0x3f, 0x00, 0x69, 0x7f, 0x02, 0x5b, 0x7d, 0x00, \n  0x82, 0xa6, 0xff, 0xa3, 0x21, 0xff, 0x09, 0xe7, 0x38, 0xb1, 0x4f, 0x26, 0x9d, 0xf8, 0xfa, 0x80, \n  0x88, 0x14, 0xfc, 0x2d, 0x02, 0xf8, 0x6c, 0xef, 0x8f, 0x2b, 0xfc, 0x0b, 0xc4, 0xf5, 0x81, 0xe7, \n  0xfe, 0xe6, 0x2a, 0x07, 0x48, 0x1b, 0xfd, 0x4a, 0xce, 0xf6, 0x3c, 0x21, 0x04, 0x42, 0x2a, 0x09, \n  0x4c, 0x8f, 0xfb, 0x7c, 0x2c, 0xfc, 0xf5, 0xf3, 0xfb, 0x4d, 0xb9, 0xfd, 0xf3, 0x2f, 0x02, 0xf1, \n  0x2f, 0xfa, 0x01, 0x92, 0xfc, 0xed, 0xa9, 0x01, 0x4a, 0x28, 0xfe, 0x13, 0xbf, 0xfe, 0xd8, 0x60, \n  0x01, 0x46, 0x99, 0x01, 0x9b, 0x33, 0x02, 0x9e, 0x8c, 0x04, 0x70, 0xf6, 0x00, 0xd7, 0x87, 0xfc, \n  0x7e, 0x92, 0xfe, 0x65, 0x37, 0xfe, 0xcc, 0x59, 0x31, 0x93, 0xe2, 0x24, 0x80, 0x58, 0xfd, 0xc4, \n  0x99, 0x11, 0xf4, 0xe5, 0x05, 0x1d, 0x67, 0xf1, 0x70, 0x8b, 0xfa, 0xc0, 0x1b, 0xf9, 0x5c, 0x18, \n  0xfe, 0xaf, 0x75, 0x04, 0xb3, 0x57, 0xfe, 0x53, 0x9c, 0xf8, 0xa1, 0x2f, 0x03, 0x42, 0xf5, 0x07, \n  0xa3, 0x13, 0xfd, 0x23, 0x69, 0xfc, 0x1c, 0xef, 0xfb, 0xa3, 0x5b, 0xfe, 0x20, 0x8b, 0x01, 0x93, \n  0x36, 0xfa, 0x33, 0x01, 0xfd, 0x6f, 0x8b, 0x01, 0xf9, 0x92, 0xfd, 0xe6, 0xb2, 0xfe, 0xa0, 0x09, \n  0x02, 0xf5, 0x8e, 0x01, 0xc8, 0xdc, 0x01, 0x67, 0x77, 0x03, 0x6e, 0x0e, 0x00, 0x42, 0xe1, 0xfd, \n  0x71, 0xa2, 0xff, 0xba, 0xa7, 0xfd, 0xf6, 0x21, 0x2b, 0x05, 0xfb, 0x22, 0x8f, 0x48, 0xff, 0x18, \n  0xdc, 0x10, 0x69, 0xf3, 0x07, 0xd9, 0xef, 0xf1, 0x6f, 0xfe, 0xfa, 0x65, 0x8f, 0xfb, 0xcd, 0x37, \n  0xfd, 0xae, 0x34, 0x03, 0x5a, 0xe0, 0xfe, 0xbd, 0x7e, 0xfa, 0xf5, 0xfd, 0x02, 0xec, 0x92, 0x06, \n  0x2a, 0x2f, 0xfe, 0xec, 0x17, 0xfd, 0xe0, 0xb3, 0xfc, 0x57, 0x92, 0xfe, 0x72, 0x90, 0x00, 0x47, \n  0x31, 0xfb, 0xd2, 0xc2, 0xfd, 0x9b, 0xbc, 0x00, 0xa2, 0xa8, 0xfd, 0x93, 0x50, 0xff, 0x76, 0xd6, \n  0x01, 0xe7, 0xac, 0x01, 0x2e, 0x1c, 0x02, 0x67, 0x1d, 0x02, 0x76, 0x69, 0xff, 0xdb, 0x65, 0xff, \n  0x36, 0x91, 0x00, 0xc1, 0xbc, 0xfd, 0xbc, 0xe9, 0x24, 0xb4, 0xee, 0x1f, 0x4c, 0xf8, 0x02, 0xdd, \n  0xa1, 0x10, 0xbb, 0xd3, 0x06, 0x4f, 0x53, 0xf4, 0x00, 0x97, 0xfc, 0xac, 0x8e, 0xfb, 0x54, 0x4e, \n  0xfd, 0x69, 0x0c, 0x03, 0xf4, 0xe2, 0xfe, 0x43, 0xa4, 0xfb, 0x4d, 0xbd, 0x02, 0x21, 0xe3, 0x05, \n  0x81, 0xb9, 0xfe, 0x06, 0x78, 0xfd, 0xe7, 0xbd, 0xfd, 0x2d, 0x8f, 0xfe, 0x5b, 0xda, 0xff, 0x69, \n  0x26, 0xfc, 0x4e, 0xe7, 0xfd, 0x38, 0x61, 0x00, 0xc1, 0x55, 0xfe, 0xd3, 0x6a, 0xff, 0x4f, 0x62, \n  0x01, 0xdb, 0xda, 0x01, 0x5c, 0xf5, 0x01, 0x6b, 0xfe, 0x00, 0x73, 0xd2, 0xff, 0xa4, 0xa5, 0x00, \n  0x8a, 0xd5, 0x00, 0x56, 0xa9, 0xfe, 0x73, 0x6b, 0x1e, 0x50, 0x06, 0x1d, 0xba, 0xaa, 0x07, 0xeb, \n  0x56, 0x0f, 0x43, 0xfd, 0x04, 0x21, 0x80, 0xf8, 0x45, 0xff, 0xfd, 0x9e, 0x79, 0xfa, 0x00, 0x9a, \n  0xfd, 0x8e, 0xb1, 0x03, 0x8d, 0x3c, 0xff, 0xc1, 0xc3, 0xfb, 0x12, 0x88, 0x02, 0xdd, 0x7e, 0x05, \n  0x2c, 0xf4, 0xfe, 0xfe, 0x70, 0xfe, 0xc2, 0x6c, 0xfe, 0x19, 0x17, 0xfe, 0xce, 0xa1, 0xff, 0xaa, \n  0x2a, 0xfd, 0x7a, 0x3b, 0xfe, 0x9f, 0xf1, 0xff, 0xaf, 0xbe, 0xfe, 0x17, 0xa8, 0xff, 0xad, 0xf9, \n  0x00, 0x94, 0xd6, 0x01, 0x9a, 0x7a, 0x01, 0x26, 0xc9, 0x00, 0x47, 0x03, 0x01, 0x5b, 0x7d, 0x01, \n  0x9f, 0x6c, 0x01, 0x39, 0x45, 0xff, 0x20, 0x0c, 0x18, 0xde, 0xec, 0x19, 0xe7, 0xcb, 0x0b, 0x9b, \n  0x7d, 0x0e, 0xb0, 0x15, 0x04, 0xa0, 0x25, 0xfc, 0x3e, 0xe2, 0xfe, 0xbe, 0xad, 0xf9, 0xbd, 0xfe, \n  0xfd, 0x1e, 0x81, 0x04, 0xab, 0x83, 0xff, 0xff, 0xbf, 0xfb, 0xcb, 0xf2, 0x01, 0x60, 0xe7, 0x04, \n  0x5d, 0x45, 0x00, 0xfa, 0x60, 0xff, 0x13, 0xb9, 0xfd, 0x4e, 0xd5, 0xfd, 0x15, 0x99, 0x00, 0x9e, \n  0x19, 0xfe, 0x4c, 0xbe, 0xfd, 0x30, 0xc5, 0xff, 0x7d, 0x35, 0xff, 0x2b, 0x7d, 0xff, 0xbd, 0x47, \n  0x01, 0x7b, 0xd3, 0x01, 0x92, 0xd2, 0x00, 0x02, 0x84, 0x01, 0x0c, 0x95, 0x02, 0x0c, 0x72, 0x02, \n  0x1e, 0x66, 0x01, 0xb7, 0xea, 0xfe, 0x41, 0x65, 0x14, 0x61, 0xe4, 0x17, 0xf8, 0xc6, 0x0c, 0x5a, \n  0xfa, 0x0c, 0xc3, 0xea, 0x03, 0xc1, 0x09, 0xfe, 0x89, 0xad, 0xff, 0xcb, 0xaa, 0xfa, 0x1c, 0x18, \n  0xfe, 0x01, 0xd1, 0x03, 0x04, 0x00, 0x00, 0xeb, 0xd1, 0xfc, 0xc2, 0x8b, 0x01, 0xde, 0xd2, 0x03, \n  0x44, 0xe4, 0x00, 0x67, 0x07, 0x00, 0x07, 0x61, 0xfd, 0x49, 0x21, 0xfe, 0xff, 0x61, 0x01, 0x83, \n  0x4a, 0xfe, 0x4b, 0x5b, 0xfd, 0x4d, 0xc7, 0xff, 0xd3, 0xb1, 0xff, 0xe6, 0xe6, 0xff, 0x42, 0x83, \n  0x01, 0xa4, 0xc3, 0x01, 0x2c, 0x48, 0x01, 0x9e, 0xcb, 0x02, 0x4e, 0x93, 0x03, 0x1c, 0x3f, 0x02, \n  0x5e, 0x28, 0x00, 0xe0, 0x86, 0xfe, 0x07, 0xf6, 0x11, 0x5f, 0xd6, 0x15, 0xfd, 0xce, 0x0c, 0xe5, \n  0x56, 0x0c, 0x93, 0x91, 0x03, 0xf5, 0x05, 0xff, 0x92, 0x37, 0x01, 0xd3, 0x9e, 0xfb, 0xbd, 0xa4, \n  0xfd, 0xad, 0x94, 0x03, 0x55, 0x02, 0x01, 0xdc, 0xc5, 0xfd, 0x8f, 0xa9, 0x00, 0x7c, 0x01, 0x03, \n  0x4f, 0xf1, 0x01, 0x45, 0x7f, 0x00, 0xb9, 0x43, 0xfd, 0x82, 0xb5, 0xfe, 0x14, 0xa3, 0x01, 0xd3, \n  0x2a, 0xfe, 0x73, 0xdb, 0xfd, 0xbb, 0x5e, 0x00, 0x45, 0xc5, 0xff, 0x55, 0xdf, 0x00, 0xa0, 0xbd, \n  0x02, 0xf0, 0x05, 0x02, 0xba, 0xe1, 0x01, 0xa7, 0x6e, 0x03, 0xc9, 0x1e, 0x03, 0xdf, 0x03, 0x01, \n  0xd6, 0x66, 0xff, 0xcf, 0x88, 0xfe, 0x93, 0x41, 0x10, 0x54, 0x8a, 0x13, 0x28, 0xe1, 0x0b, 0xb0, \n  0x48, 0x0c, 0xbb, 0x23, 0x04, 0xc4, 0x68, 0xff, 0x8e, 0x0a, 0x01, 0x0e, 0x55, 0xfc, 0xf6, 0xa6, \n  0xfe, 0xc9, 0x8a, 0x03, 0x2f, 0xb0, 0x00, 0xdb, 0xc1, 0xfd, 0xd1, 0x9e, 0x00, 0x15, 0x32, 0x03, \n  0x47, 0x22, 0x02, 0x0d, 0x2f, 0x00, 0x25, 0x44, 0xfd, 0x2e, 0x3e, 0xff, 0x09, 0xe4, 0x01, 0xb3, \n  0x35, 0xfe, 0xdc, 0x45, 0xfe, 0x2e, 0x20, 0x01, 0x53, 0xee, 0x00, 0x1b, 0x59, 0x02, 0xf0, 0xf0, \n  0x02, 0x7c, 0x24, 0x01, 0xef, 0xc4, 0x01, 0xc5, 0x20, 0x03, 0x86, 0x9d, 0x01, 0xc9, 0xa4, 0xff, \n  0xa0, 0x5e, 0xff, 0xed, 0x4e, 0xff, 0x50, 0xca, 0x0f, 0x5e, 0xd5, 0x12, 0x61, 0x6a, 0x0a, 0x59, \n  0x91, 0x0a, 0x2f, 0x22, 0x04, 0xa0, 0x15, 0x00, 0xad, 0x7e, 0x01, 0xf7, 0x4a, 0xfd, 0xb0, 0x08, \n  0xff, 0x50, 0x1a, 0x03, 0xaa, 0xb7, 0x00, 0x9f, 0x72, 0xfe, 0xe4, 0x55, 0x01, 0x23, 0xfd, 0x02, \n  0x18, 0x06, 0x01, 0x56, 0x41, 0x00, 0xf9, 0xce, 0xfe, 0x3d, 0xa3, 0xff, 0x39, 0x67, 0x01, 0x7d, \n  0x50, 0xff, 0x31, 0x38, 0x00, 0xfe, 0x65, 0x02, 0x93, 0xe9, 0x01, 0x88, 0x20, 0x02, 0x9a, 0x5a, \n  0x01, 0x59, 0x97, 0x00, 0x1c, 0xa5, 0x01, 0x35, 0xe3, 0x01, 0x9f, 0xe2, 0x00, 0x75, 0xe4, 0xff, \n  0xf5, 0x70, 0xff, 0xe6, 0x03, 0xff, 0x6f, 0x6a, 0x0e, 0x3a, 0x27, 0x11, 0x64, 0xda, 0x09, 0x0e, \n  0x7b, 0x0a, 0x90, 0x85, 0x04, 0x29, 0x6d, 0x00, 0x70, 0x63, 0x01, 0xba, 0xd5, 0xfd, 0x19, 0xbc, \n  0xff, 0x17, 0x4a, 0x03, 0x3c, 0xf7, 0x00, 0x4e, 0x95, 0xfe, 0x7f, 0x2d, 0x01, 0x20, 0xeb, 0x02, \n  0x66, 0x47, 0x01, 0x8d, 0xc0, 0x00, 0xf2, 0x85, 0xff, 0xa8, 0xa7, 0x00, 0x7d, 0xbe, 0x02, 0x9e, \n  0xfe, 0x00, 0xbb, 0xe1, 0x00, 0x9e, 0xd9, 0x01, 0x4a, 0x79, 0x01, 0x78, 0xd0, 0x00, 0x51, 0x07, \n  0x00, 0x19, 0xa8, 0x00, 0x7e, 0x74, 0x01, 0x9f, 0x97, 0x01, 0xec, 0xab, 0x00, 0xcf, 0x57, 0xff, \n  0xcd, 0x52, 0xff, 0x61, 0x0b, 0xff, 0x80, 0x5a, 0x0d, 0x88, 0x1e, 0x10, 0x2f, 0x6a, 0x09, 0x9c, \n  0xe8, 0x09, 0xf6, 0xac, 0x04, 0x34, 0x8f, 0x00, 0xa8, 0x35, 0x01, 0x1a, 0xdd, 0xfe, 0xa5, 0xc4, \n  0x00, 0x5e, 0x2f, 0x03, 0xe1, 0x72, 0x00, 0x64, 0xdc, 0xfe, 0xf6, 0x39, 0x02, 0xd7, 0xd5, 0x02, \n  0x2e, 0x0e, 0x01, 0x71, 0x9d, 0x02, 0x12, 0x03, 0x02, 0xbe, 0x8f, 0x01, 0x3f, 0xa1, 0x02, 0xc6, \n  0xc6, 0x00, 0xf7, 0xfc, 0xff, 0x03, 0xfd, 0x00, 0x03, 0x8e, 0x00, 0xc2, 0x92, 0xff, 0x55, 0x71, \n  0x00, 0x89, 0x65, 0x01, 0xea, 0xb4, 0x00, 0x1f, 0xb9, 0x00, 0xdd, 0x57, 0x00, 0x21, 0x61, 0xff, \n  0xda, 0x40, 0xff, 0xb3, 0xf5, 0xfe, 0x0d, 0xd4, 0x0c, 0x8c, 0xcb, 0x0f, 0xbe, 0x31, 0x09, 0x2a, \n  0xac, 0x08, 0x06, 0xb9, 0x03, 0x77, 0xec, 0x00, 0x5c, 0x8a, 0x02, 0x42, 0xbd, 0xff, 0xba, 0x0e, \n  0x00, 0x2d, 0xe3, 0x02, 0xd5, 0x9a, 0x01, 0x25, 0xa7, 0xff, 0x91, 0x42, 0x02, 0x19, 0x3c, 0x04, \n  0xa2, 0x8e, 0x03, 0xe8, 0xca, 0x03, 0xca, 0xd4, 0x01, 0x28, 0x51, 0x00, 0x12, 0x0c, 0x01, 0xb4, \n  0xce, 0xff, 0x97, 0x52, 0xff, 0xc1, 0xac, 0x00, 0x6e, 0x56, 0x00, 0x02, 0xa3, 0xff, 0xb5, 0x46, \n  0x00, 0xbf, 0xb0, 0x00, 0x31, 0xae, 0x00, 0x08, 0x6a, 0x00, 0xb6, 0x9b, 0xff, 0xef, 0x1d, 0xff, \n  0x5a, 0xfd, 0xfe, 0x8c, 0x00, 0xff, 0x74, 0xde, 0x0b, 0x21, 0x58, 0x0e, 0x8b, 0x1e, 0x09, 0x4b, \n  0x8e, 0x09, 0xd1, 0x5f, 0x04, 0x28, 0x9e, 0x00, 0x7b, 0x7b, 0x01, 0x53, 0xa8, 0x00, 0x63, 0x4a, \n  0x02, 0xa8, 0xda, 0x02, 0x6a, 0x6b, 0x01, 0xdf, 0x29, 0x02, 0x17, 0x12, 0x05, 0x7a, 0x0a, 0x05, \n  0xe4, 0xc5, 0x02, 0xe8, 0x6a, 0x02, 0x03, 0x2a, 0x00, 0x85, 0xed, 0xfe, 0xcf, 0x4f, 0x00, 0x0b, \n  0xa4, 0xff, 0xc6, 0xe7, 0xff, 0xfc, 0x8a, 0x00, 0x02, 0x7b, 0xff, 0x7c, 0xa2, 0xff, 0x00, 0x60, \n  0x00, 0xe3, 0xa6, 0x00, 0x35, 0x3e, 0x00, 0xa4, 0x8f, 0xff, 0xd8, 0x61, 0xff, 0x23, 0xea, 0xfe, \n  0xe0, 0xf5, 0xfe, 0x80, 0x29, 0xff, 0x3d, 0x83, 0x0b, 0x73, 0xd8, 0x0e, 0x61, 0xed, 0x09, 0x9a, \n  0x7a, 0x08, 0x3a, 0x89, 0x02, 0x21, 0xfa, 0x00, 0x40, 0x6b, 0x03, 0xdd, 0xc9, 0x01, 0x0b, 0x1e, \n  0x03, 0x54, 0x3c, 0x05, 0xd2, 0x72, 0x04, 0x08, 0xf1, 0x02, 0x06, 0xc7, 0x03, 0xfb, 0x53, 0x03, \n  0x61, 0x82, 0x00, 0x7f, 0x55, 0x00, 0x80, 0x7a, 0xff, 0x2e, 0x57, 0xff, 0x4d, 0x8d, 0x00, 0x65, \n  0x63, 0xff, 0x87, 0x76, 0xff, 0x4a, 0x2b, 0x00, 0xd8, 0xd3, 0xff, 0xd9, 0xd9, 0xff, 0x23, 0x21, \n  0x00, 0x30, 0x37, 0x00, 0xad, 0x3d, 0xff, 0x72, 0x25, 0xff, 0x51, 0x64, 0xff, 0x55, 0xc9, 0xfe, \n  0x7e, 0x1a, 0xff, 0x72, 0xd7, 0xfe, 0x80, 0x7f, 0x0b, 0x87, 0xc7, 0x0e, 0x36, 0xf7, 0x09, 0x80, \n  0x6e, 0x08, 0x5f, 0x6f, 0x02, 0x8e, 0x0c, 0x01, 0xb2, 0x34, 0x05, 0xee, 0x85, 0x06, 0x5f, 0x60, \n  0x06, 0x49, 0x1d, 0x04, 0x0f, 0xdc, 0x02, 0x2a, 0x70, 0x01, 0x91, 0xfe, 0x00, 0xe7, 0xa2, 0x01, \n  0x8f, 0xc5, 0xff, 0x7e, 0xe4, 0xff, 0x78, 0x24, 0x00, 0xeb, 0xf8, 0xfe, 0xd3, 0x64, 0xff, 0x4a, \n  0xb9, 0xff, 0x8c, 0xd7, 0xff, 0x1c, 0xfc, 0xff, 0x42, 0xd8, 0xff, 0xf4, 0x72, 0xff, 0x87, 0x62, \n  0xff, 0xd9, 0xbc, 0xff, 0x36, 0xff, 0xfe, 0x4e, 0xb9, 0xfe, 0x7f, 0x26, 0xff, 0x59, 0xe1, 0xfe, \n  0xf1, 0xe1, 0xfe, 0x33, 0xca, 0xfe, 0xf5, 0x1a, 0x0b, 0x51, 0x60, 0x0e, 0x97, 0xe0, 0x09, 0x4a, \n  0x06, 0x09, 0x6d, 0x62, 0x05, 0x3a, 0xb9, 0x04, 0x7f, 0x82, 0x06, 0x8e, 0xbd, 0x06, 0xd4, 0x87, \n  0x06, 0x8b, 0x0e, 0x02, 0x30, 0xae, 0xfe, 0x20, 0x32, 0xff, 0x3c, 0x79, 0x01, 0x68, 0xb7, 0x01, \n  0x59, 0x24, 0xff, 0x71, 0x24, 0xff, 0xbb, 0x81, 0xff, 0x36, 0x28, 0xff, 0xd3, 0x88, 0xff, 0x83, \n  0x86, 0xff, 0x6b, 0xce, 0xff, 0xef, 0xa2, 0xff, 0x43, 0x2b, 0xff, 0x84, 0x39, 0xff, 0x13, 0x4c, \n  0xff, 0xd0, 0xe1, 0xfe, 0x54, 0x5f, 0xfe, 0x47, 0xd2, 0xfe, 0xff, 0xef, 0xfe, 0xa0, 0xd8, 0xfe, \n  0x52, 0x21, 0xff, 0xb8, 0x89, 0xfe, 0xce, 0x04, 0x0a, 0x48, 0x10, 0x10, 0x7b, 0xf8, 0x0d, 0x21, \n  0x6a, 0x0b, 0x50, 0xce, 0x06, 0x39, 0xf8, 0x04, 0x32, 0x2a, 0x06, 0x78, 0x91, 0x05, 0x2b, 0x61, \n  0x02, 0x03, 0xa6, 0xff, 0x2e, 0x43, 0x00, 0xfa, 0xd0, 0xff, 0x93, 0x49, 0x00, 0x8a, 0xfa, 0x00, \n  0x6b, 0x26, 0xff, 0xec, 0xbc, 0xff, 0x24, 0xd4, 0xff, 0xec, 0xbc, 0xfe, 0xab, 0xb2, 0xff, 0x28, \n  0xda, 0xff, 0xb3, 0x43, 0xff, 0x00, 0x6e, 0xff, 0x29, 0x9d, 0xff, 0xda, 0x2b, 0xff, 0x48, 0x9b, \n  0xfe, 0xfa, 0x87, 0xfe, 0xff, 0x93, 0xfe, 0x42, 0x10, 0xff, 0x56, 0x4b, 0xff, 0x6b, 0x17, 0xff, \n  0x74, 0x1d, 0xff, 0xfa, 0xbd, 0xfe, 0x84, 0xb2, 0x0c, 0xf1, 0x4c, 0x17, 0x8e, 0x54, 0x11, 0x53, \n  0xab, 0x07, 0x7a, 0x16, 0x03, 0x5f, 0x77, 0x04, 0x62, 0xe9, 0x04, 0x52, 0x99, 0x01, 0x2f, 0x1f, \n  0x02, 0x83, 0xce, 0x01, 0xfe, 0x3d, 0xff, 0x2b, 0x96, 0xfe, 0x10, 0xd5, 0xff, 0xa8, 0xc7, 0x01, \n  0xfc, 0x3b, 0x00, 0x98, 0x73, 0xfe, 0x4e, 0x7b, 0xff, 0x25, 0x93, 0xff, 0xb3, 0xe4, 0xfe, 0x9f, \n  0x31, 0xff, 0xb5, 0xcc, 0xff, 0xed, 0xa0, 0xff, 0xb8, 0x20, 0xff, 0x68, 0xb8, 0xfe, 0x99, 0x62, \n  0xfe, 0x0f, 0x96, 0xfe, 0x74, 0xfb, 0xfe, 0xa2, 0x2d, 0xff, 0x44, 0x4a, 0xff, 0x49, 0x39, 0xff, \n  0x53, 0xf6, 0xfe, 0x5d, 0xc1, 0xfe, 0xf9, 0xc4, 0x0e, 0x9e, 0xeb, 0x17, 0xd6, 0x95, 0x0f, 0xc4, \n  0x44, 0x08, 0xda, 0x34, 0x03, 0xc2, 0x68, 0x00, 0xc2, 0x77, 0x03, 0x88, 0x62, 0x05, 0x15, 0xc8, \n  0x02, 0xe7, 0xd8, 0xfe, 0xbd, 0xbc, 0xff, 0x2d, 0xf4, 0x00, 0x84, 0xbc, 0xff, 0xe3, 0x81, 0x00, \n  0xde, 0x66, 0x00, 0x92, 0x7c, 0xff, 0xa3, 0x22, 0xff, 0xc6, 0xbe, 0xfe, 0x12, 0xc6, 0xfe, 0x06, \n  0x1c, 0xff, 0xbc, 0xc3, 0xff, 0x26, 0x7c, 0xff, 0xb7, 0x2b, 0xff, 0x35, 0xf1, 0xfe, 0xd6, 0x47, \n  0xfe, 0xe9, 0xbb, 0xfe, 0x58, 0x29, 0xff, 0xbe, 0x0a, 0xff, 0x43, 0x06, 0xff, 0x6e, 0xfe, 0xfe, \n  0xe4, 0x02, 0xff, 0xbb, 0xd7, 0xfe, 0xba, 0x12, 0x0b, 0xeb, 0xd1, 0x13, 0x15, 0x2b, 0x10, 0xc1, \n  0xd1, 0x09, 0xd7, 0x52, 0x03, 0x49, 0x3a, 0x01, 0xed, 0x8b, 0x04, 0x9c, 0x41, 0x05, 0x36, 0xf7, \n  0x02, 0x3c, 0x40, 0x00, 0xcc, 0x36, 0x00, 0x88, 0x6f, 0x01, 0x7a, 0x55, 0x01, 0x64, 0xbb, 0x00, \n  0xd5, 0xe1, 0xff, 0xbb, 0x17, 0x00, 0x12, 0x9c, 0xff, 0xd1, 0x9a, 0xfe, 0x52, 0xd6, 0xfe, 0xb8, \n  0xd9, 0xfe, 0x09, 0xe5, 0xfe, 0xb2, 0x6a, 0xff, 0x9d, 0xe8, 0xff, 0xb7, 0x16, 0xff, 0x57, 0x75, \n  0xfe, 0x6c, 0x4b, 0xff, 0x39, 0x31, 0xff, 0x6c, 0xd7, 0xfe, 0xf6, 0xce, 0xfe, 0x7b, 0xbd, 0xfe, \n  0x6c, 0xdd, 0xfe, 0x50, 0xb2, 0xfe, 0xdf, 0x90, 0x0a, 0x7b, 0xfe, 0x12, 0xd6, 0x53, 0x0d, 0xd6, \n  0x46, 0x06, 0xf1, 0xfc, 0x03, 0xef, 0xc2, 0x03, 0xd1, 0x61, 0x04, 0x04, 0x02, 0x04, 0x8c, 0xaf, \n  0x03, 0x98, 0x86, 0x02, 0x39, 0xc0, 0x00, 0xd1, 0x12, 0x01, 0x55, 0xb3, 0x02, 0xe4, 0x55, 0x02, \n  0xe6, 0x9c, 0x00, 0xee, 0x2a, 0x00, 0x50, 0xff, 0xff, 0x2f, 0x81, 0xff, 0xa8, 0xae, 0xfe, 0x99, \n  0x74, 0xfe, 0xa2, 0x3d, 0xff, 0x3d, 0x27, 0xff, 0x4e, 0x22, 0xff, 0x8a, 0x82, 0xff, 0x46, 0x7d, \n  0xff, 0xfe, 0x78, 0xff, 0x40, 0x57, 0xff, 0xb9, 0x5d, 0xff, 0x25, 0xf6, 0xfe, 0x20, 0x74, 0xfe, \n  0xd0, 0x7b, 0xfe, 0xcf, 0x8b, 0xfe, 0x37, 0x0c, 0x0a, 0xd6, 0xde, 0x11, 0x50, 0x6b, 0x0b, 0x4c, \n  0xac, 0x04, 0x02, 0xf3, 0x04, 0x4f, 0xa0, 0x04, 0x39, 0x36, 0x02, 0xc7, 0x8c, 0x02, 0x06, 0x9a, \n  0x04, 0x24, 0x1f, 0x03, 0x5d, 0x9b, 0x01, 0x9f, 0x8d, 0x02, 0x6d, 0xa1, 0x02, 0x47, 0x21, 0x02, \n  0x0b, 0x5c, 0x02, 0x4a, 0x0a, 0x02, 0x21, 0x38, 0x00, 0xee, 0x81, 0xff, 0xc0, 0x05, 0x00, 0x83, \n  0x1b, 0xff, 0x5d, 0x51, 0xfe, 0x93, 0xd9, 0xfe, 0x5b, 0x98, 0xff, 0x9e, 0x5a, 0xff, 0xd2, 0xe3, \n  0xfe, 0x78, 0xff, 0xff, 0xb5, 0x50, 0x00, 0xa6, 0x57, 0xff, 0xaf, 0x3a, 0xff, 0xb7, 0x04, 0xff, \n  0xf5, 0x71, 0xfe, 0x53, 0x3c, 0xfe, 0x86, 0x6e, 0x09, 0xc5, 0x66, 0x10, 0x9c, 0x99, 0x0a, 0xee, \n  0x29, 0x05, 0x02, 0xba, 0x05, 0x26, 0x53, 0x04, 0x40, 0xaf, 0x00, 0x13, 0xbd, 0x01, 0x84, 0x8b, \n  0x04, 0xd4, 0x89, 0x02, 0xde, 0xdb, 0x00, 0x2b, 0x59, 0x02, 0xa0, 0x8d, 0x03, 0x68, 0x51, 0x03, \n  0x69, 0x4e, 0x02, 0x60, 0xbe, 0x01, 0x90, 0xad, 0x01, 0xef, 0x46, 0x01, 0x85, 0x24, 0x00, 0xa5, \n  0x84, 0xff, 0xee, 0x88, 0xff, 0x21, 0x02, 0xff, 0x95, 0xc2, 0xfe, 0x57, 0x12, 0xff, 0x0b, 0x79, \n  0xff, 0xdd, 0xa8, 0xff, 0xfa, 0x9c, 0xff, 0xc5, 0x07, 0x00, 0x6c, 0xeb, 0xff, 0x1d, 0xff, 0xfe, \n  0x84, 0xc3, 0xfe, 0x6c, 0xb7, 0xfe, 0xdf, 0x99, 0x09, 0x5b, 0x6e, 0x10, 0xf3, 0x7e, 0x0a, 0x58, \n  0x0a, 0x05, 0x17, 0xbb, 0x05, 0x98, 0x3f, 0x04, 0x7a, 0x00, 0x00, 0x62, 0x55, 0x01, 0xc7, 0xdc, \n  0x04, 0x73, 0x4f, 0x02, 0x43, 0x7d, 0xff, 0x76, 0x1e, 0x01, 0xf4, 0x5c, 0x03, 0x62, 0x0e, 0x03, \n  0xd5, 0x60, 0x02, 0x1b, 0xe7, 0x02, 0xf6, 0xde, 0x01, 0x18, 0xa5, 0x00, 0x73, 0x36, 0x01, 0xa5, \n  0x6e, 0x01, 0x53, 0x02, 0x00, 0x80, 0x09, 0xff, 0x95, 0xe3, 0xff, 0x77, 0xcc, 0xff, 0x80, 0xc6, \n  0xfe, 0x35, 0x51, 0xff, 0x1e, 0x32, 0x00, 0xfa, 0xf4, 0xff, 0xc8, 0x62, 0xff, 0x9c, 0x6b, 0xff, \n  0x83, 0x6a, 0xff, 0x60, 0xcf, 0xfe, 0xe7, 0xa9, 0x09, 0xcf, 0x49, 0x10, 0x2a, 0x82, 0x0a, 0x74, \n  0x0b, 0x06, 0x1c, 0xbf, 0x06, 0x82, 0x7a, 0x03, 0xf9, 0x7b, 0xfe, 0x84, 0x84, 0x01, 0xca, 0xdd, \n  0x05, 0x54, 0xe4, 0x01, 0x31, 0x84, 0xfe, 0x3d, 0xad, 0x00, 0x49, 0xb5, 0x02, 0x1b, 0x15, 0x02, \n  0xdc, 0x6d, 0x01, 0x54, 0x5e, 0x02, 0x6e, 0x19, 0x02, 0x90, 0x00, 0x01, 0x6b, 0xf9, 0x00, 0x77, \n  0x38, 0x01, 0x96, 0x10, 0x01, 0x85, 0x67, 0x00, 0x0f, 0x00, 0x00, 0x6a, 0x18, 0x00, 0x45, 0x20, \n  0x00, 0x70, 0xdd, 0xff, 0x35, 0x95, 0xff, 0x58, 0xb1, 0xff, 0x19, 0xc0, 0xff, 0xe7, 0x4f, 0xff, \n  0xe9, 0xd6, 0xfe, 0x19, 0xfd, 0xfe, 0xcf, 0x40, 0x0a, 0xae, 0x6a, 0x11, 0x70, 0xf9, 0x0a, 0x1e, \n  0xae, 0x05, 0xf5, 0xa1, 0x06, 0x0f, 0x8c, 0x03, 0xba, 0x3c, 0xfe, 0x00, 0x3b, 0x01, 0x69, 0xd1, \n  0x05, 0x59, 0xd6, 0x01, 0xd8, 0x2e, 0xfe, 0x8f, 0x3f, 0x00, 0x19, 0x32, 0x02, 0xfa, 0xc3, 0x01, \n  0x87, 0x19, 0x01, 0x37, 0x5d, 0x01, 0x3e, 0x32, 0x01, 0x0f, 0x52, 0x00, 0x19, 0x3d, 0x00, 0xa4, \n  0x4b, 0x01, 0x54, 0x79, 0x01, 0x6a, 0x3f, 0x00, 0xd2, 0x3d, 0x00, 0x8f, 0x20, 0x01, 0xf5, 0xba, \n  0x00, 0x33, 0x51, 0x00, 0xb2, 0xa3, 0x00, 0xe9, 0x4f, 0x00, 0x40, 0x6a, 0xff, 0x53, 0xf0, 0xfe, \n  0x4e, 0xdc, 0xfe, 0x1a, 0xc5, 0xfe, 0x95, 0x24, 0x0b, 0xa3, 0x6e, 0x12, 0xb0, 0x2d, 0x0b, 0xf2, \n  0x16, 0x06, 0x85, 0x11, 0x07, 0x8f, 0xea, 0x02, 0xa6, 0x82, 0xfd, 0xd6, 0xa0, 0x01, 0x2a, 0x3f, \n  0x06, 0x00, 0x62, 0x01, 0x12, 0xbc, 0xfd, 0x77, 0x23, 0x00, 0x46, 0x44, 0x02, 0xbb, 0x6e, 0x01, \n  0xeb, 0x57, 0x00, 0x35, 0x7a, 0x01, 0xda, 0x69, 0x01, 0xab, 0x61, 0xff, 0x5a, 0xd2, 0xfe, 0x89, \n  0x3e, 0x00, 0x23, 0x39, 0x01, 0xaf, 0x64, 0x00, 0x22, 0x36, 0x00, 0x72, 0x0c, 0x01, 0xa4, 0x31, \n  0x01, 0xcb, 0x54, 0x01, 0xd2, 0x38, 0x01, 0x12, 0xde, 0x00, 0x3f, 0x98, 0x00, 0x1c, 0x96, 0xff, \n  0x92, 0x75, 0xfe, 0x47, 0x3d, 0xfe, 0xfb, 0x6e, 0x0c, 0x16, 0x1c, 0x14, 0xc1, 0x54, 0x0b, 0x46, \n  0xab, 0x05, 0xd7, 0x23, 0x07, 0x4d, 0xcb, 0x02, 0x6d, 0x4e, 0xfd, 0x0d, 0xac, 0x01, 0x68, 0x1a, \n  0x06, 0xb3, 0xee, 0x00, 0x3a, 0x8f, 0xfd, 0x52, 0x4d, 0x00, 0xb5, 0x00, 0x02, 0x56, 0x10, 0x01, \n  0xa6, 0x19, 0x00, 0xa3, 0x11, 0x01, 0x05, 0x8a, 0x01, 0xe5, 0xac, 0xff, 0x63, 0x52, 0xfe, 0xe5, \n  0xe3, 0xfe, 0x97, 0xef, 0xff, 0xad, 0x05, 0x00, 0x1c, 0xa0, 0xff, 0x2b, 0x73, 0x00, 0x82, 0x8f, \n  0x01, 0x22, 0x8d, 0x01, 0x51, 0x6f, 0x01, 0x45, 0x9b, 0x01, 0x68, 0x38, 0x01, 0x17, 0x3c, 0x00, \n  0xff, 0x3a, 0xff, 0x62, 0x8d, 0xfe, 0x33, 0x41, 0x0d, 0x89, 0xa7, 0x15, 0xd6, 0x23, 0x0c, 0xc0, \n  0x5d, 0x05, 0x18, 0x0f, 0x07, 0x4c, 0xfb, 0x02, 0xaa, 0xc7, 0xfc, 0x18, 0x99, 0x01, 0xf6, 0x9a, \n  0x06, 0x39, 0x64, 0x00, 0x17, 0xde, 0xfc, 0x32, 0x66, 0x00, 0xc0, 0x19, 0x02, 0x18, 0xec, 0x00, \n  0xcb, 0xb1, 0xff, 0xc7, 0x6b, 0x00, 0xdb, 0x84, 0x01, 0x6f, 0x4d, 0x00, 0xc0, 0x43, 0xfe, 0x67, \n  0x43, 0xfe, 0xb4, 0x5c, 0xff, 0xf1, 0x1a, 0xff, 0x57, 0xb8, 0xfe, 0x5f, 0xa8, 0xff, 0x52, 0xba, \n  0x00, 0x64, 0x7a, 0x01, 0x80, 0xb6, 0x01, 0x67, 0x8f, 0x01, 0x25, 0x8f, 0x01, 0x98, 0xe0, 0x00, \n  0x61, 0xc2, 0xff, 0x5a, 0x31, 0xff, 0xa1, 0xc1, 0x0e, 0x89, 0xc8, 0x17, 0xf5, 0x68, 0x0c, 0x42, \n  0x73, 0x04, 0x11, 0x16, 0x07, 0x25, 0x54, 0x03, 0x8c, 0x6e, 0xfc, 0x7b, 0x88, 0x01, 0x9b, 0xd2, \n  0x06, 0x3d, 0x07, 0x00, 0x08, 0x83, 0xfc, 0x0b, 0x7d, 0x00, 0x20, 0xdc, 0x01, 0xf7, 0x99, 0x00, \n  0xeb, 0xc2, 0xff, 0x5e, 0x0f, 0x00, 0xa9, 0x34, 0x01, 0x71, 0x86, 0x00, 0xb4, 0x7a, 0xfe, 0xfa, \n  0x42, 0xfe, 0x50, 0xe3, 0xfe, 0x0e, 0xd2, 0xfe, 0x22, 0x7f, 0xfe, 0x1a, 0xad, 0xfe, 0x87, 0xbc, \n  0xff, 0x30, 0x0d, 0x01, 0x63, 0x76, 0x01, 0xaa, 0x25, 0x01, 0x1f, 0x7e, 0x01, 0x91, 0x35, 0x01, \n  0x90, 0xf9, 0xff, 0xc3, 0x9f, 0xff, 0xd7, 0x93, 0x10, 0x3f, 0xf8, 0x19, 0x5d, 0x67, 0x0c, 0xbf, \n  0xac, 0x03, 0x2b, 0x43, 0x07, 0x3c, 0x29, 0x03, 0xfa, 0xe1, 0xfb, 0xf9, 0x10, 0x02, 0xe2, 0xfe, \n  0x06, 0xb1, 0x22, 0xff, 0xe5, 0x2d, 0xfc, 0x72, 0xcb, 0x00, 0x6a, 0xfd, 0x01, 0x9a, 0x06, 0x00, \n  0xcb, 0x25, 0xff, 0x9b, 0xf8, 0xff, 0x3a, 0x10, 0x01, 0xd4, 0x86, 0x00, 0xc4, 0xa2, 0xfe, 0x5f, \n  0x25, 0xfe, 0x13, 0xb3, 0xfe, 0xad, 0xb7, 0xfe, 0xfb, 0x4a, 0xfe, 0x55, 0x5b, 0xfe, 0x8a, 0x3a, \n  0xff, 0x6f, 0x4e, 0x00, 0x4b, 0xfb, 0x00, 0x08, 0xac, 0x00, 0xbb, 0xbe, 0x00, 0x38, 0xe5, 0x00, \n  0xb5, 0x0d, 0x00, 0xd2, 0xaf, 0xff, 0xc4, 0xb1, 0x12, 0x48, 0x68, 0x1c, 0xda, 0x23, 0x0c, 0xed, \n  0xdc, 0x02, 0x97, 0x9a, 0x07, 0x5f, 0xc6, 0x02, 0x9e, 0x55, 0xfb, 0x78, 0xe6, 0x02, 0xb2, 0x22, \n  0x07, 0x7d, 0x23, 0xfe, 0xe0, 0x08, 0xfc, 0xd9, 0x27, 0x01, 0x5b, 0x09, 0x02, 0xaa, 0xb1, 0xff, \n  0x9d, 0xb5, 0xfe, 0xcf, 0xb2, 0xff, 0xec, 0xd2, 0x00, 0x12, 0x63, 0x00, 0x25, 0xc8, 0xfe, 0x72, \n  0x82, 0xfe, 0xee, 0x98, 0xfe, 0x2c, 0x50, 0xfe, 0x01, 0x33, 0xfe, 0x95, 0x83, 0xfe, 0x33, 0x3f, \n  0xff, 0xee, 0xae, 0xff, 0xe1, 0x97, 0x00, 0x17, 0x83, 0x00, 0xc6, 0x0f, 0x00, 0x69, 0x6a, 0x00, \n  0x35, 0x82, 0xff, 0x3b, 0x15, 0xff, 0x16, 0xb1, 0x14, 0xed, 0xcc, 0x1e, 0xbe, 0x0c, 0x0c, 0xdc, \n  0x2d, 0x02, 0x01, 0x06, 0x08, 0x40, 0x32, 0x02, 0x0a, 0x70, 0xfa, 0x86, 0xf2, 0x03, 0x0e, 0x94, \n  0x07, 0x72, 0xef, 0xfc, 0x5f, 0xb6, 0xfb, 0x5f, 0x91, 0x01, 0xd4, 0x2e, 0x02, 0x20, 0x77, 0xff, \n  0xfc, 0x31, 0xfe, 0x48, 0x49, 0xff, 0x58, 0x9a, 0x00, 0x11, 0x40, 0x00, 0x48, 0xa8, 0xfe, 0x2c, \n  0xa6, 0xfe, 0xcf, 0xb4, 0xfe, 0x90, 0x24, 0xfe, 0xb1, 0xfd, 0xfd, 0x12, 0x66, 0xfe, 0x13, 0x9f, \n  0xff, 0x03, 0x79, 0xff, 0x7b, 0xcb, 0xff, 0xf8, 0xc6, 0x00, 0x80, 0xff, 0xff, 0x48, 0x7a, 0xff, \n  0x64, 0x05, 0xff, 0x42, 0x93, 0xfe, 0xfa, 0x8d, 0x16, 0xf2, 0x5f, 0x21, 0x8c, 0x3b, 0x0c, 0xff, \n  0x38, 0x01, 0x7a, 0x64, 0x08, 0x1b, 0xc8, 0x01, 0xf3, 0x41, 0xf9, 0x84, 0xc9, 0x04, 0x57, 0x22, \n  0x08, 0x95, 0xda, 0xfb, 0xf7, 0x67, 0xfb, 0x72, 0xdd, 0x01, 0x51, 0x1c, 0x02, 0xc8, 0x60, 0xff, \n  0xb6, 0xf6, 0xfd, 0x5a, 0x9b, 0xfe, 0x34, 0x2c, 0x00, 0xaf, 0x3e, 0x00, 0x8d, 0x93, 0xfe, 0x5f, \n  0x9e, 0xfe, 0x44, 0x95, 0xfe, 0x46, 0x05, 0xfe, 0xba, 0xfa, 0xfd, 0x64, 0x2d, 0xfe, 0x88, 0xc4, \n  0xff, 0x60, 0xcd, 0xff, 0xc9, 0x33, 0xff, 0x3e, 0x5e, 0x00, 0x07, 0x5f, 0x00, 0x00, 0x18, 0xff, \n  0x8e, 0x73, 0xfe, 0x64, 0x5f, 0xfe, 0xae, 0x0a, 0x18, 0x9f, 0xfb, 0x23, 0xf9, 0xeb, 0x0c, 0x1a, \n  0x23, 0x00, 0x08, 0x9b, 0x08, 0x52, 0xd7, 0x01, 0xd6, 0x27, 0xf8, 0x76, 0x46, 0x05, 0xc4, 0xbe, \n  0x08, 0x38, 0x1d, 0xfb, 0x3d, 0x2e, 0xfb, 0x58, 0x44, 0x02, 0x5c, 0x32, 0x02, 0x76, 0xf9, 0xfe, \n  0xfd, 0xe8, 0xfd, 0x09, 0x72, 0xfe, 0x91, 0x6d, 0xff, 0xb7, 0x09, 0x00, 0xbb, 0x9f, 0xfe, 0x51, \n  0xa5, 0xfe, 0xef, 0xb0, 0xfe, 0xf8, 0xe8, 0xfd, 0xe7, 0xca, 0xfd, 0x50, 0xe8, 0xfd, 0x81, 0xdb, \n  0xff, 0x43, 0x8e, 0x00, 0x7e, 0x4d, 0xff, 0xd1, 0x61, 0xff, 0x45, 0x3f, 0x00, 0x76, 0x9e, 0xff, \n  0x10, 0x2d, 0xfe, 0xaf, 0x26, 0xfe, 0xda, 0x51, 0x1a, 0xd2, 0x56, 0x26, 0x2b, 0xb4, 0x0c, 0x4a, \n  0xa9, 0xff, 0x06, 0xe4, 0x08, 0x90, 0x16, 0x01, 0xaa, 0x58, 0xf7, 0x57, 0xf9, 0x05, 0x7a, 0x81, \n  0x08, 0x55, 0x40, 0xfa, 0x66, 0xa5, 0xfb, 0x54, 0x69, 0x02, 0x01, 0x01, 0x02, 0x18, 0x9c, 0xfe, \n  0x8d, 0xa0, 0xfd, 0xc4, 0xab, 0xfe, 0x9c, 0xba, 0xfe, 0x00, 0x3b, 0xff, 0x1a, 0x9d, 0xfe, 0x77, \n  0xdf, 0xfe, 0x19, 0xcf, 0xfe, 0xc7, 0xaa, 0xfd, 0x95, 0x83, 0xfd, 0x4d, 0xb1, 0xfd, 0x84, 0xcf, \n  0xff, 0x25, 0xc7, 0x00, 0x8c, 0xcf, 0xff, 0x88, 0x36, 0xff, 0x5f, 0x47, 0xff, 0x65, 0xbe, 0xff, \n  0x8b, 0x6b, 0xfe, 0x04, 0x9e, 0xfd, 0x99, 0x1d, 0x1d, 0xbe, 0x37, 0x28, 0xa7, 0xda, 0x0b, 0xab, \n  0x4c, 0x00, 0x8d, 0x33, 0x09, 0x72, 0xca, 0xff, 0x47, 0x12, 0xf7, 0x7e, 0x90, 0x06, 0xe0, 0x03, \n  0x08, 0xd1, 0x6b, 0xf9, 0xa1, 0x60, 0xfc, 0xf8, 0xb8, 0x02, 0x5c, 0xc5, 0x01, 0x6c, 0x69, 0xfe, \n  0x4c, 0x16, 0xfd, 0x5b, 0x34, 0xff, 0x97, 0x66, 0xfe, 0xc4, 0x0c, 0xfe, 0xd5, 0xa7, 0xfe, 0xc4, \n  0x0b, 0xff, 0x4a, 0x01, 0xff, 0xe8, 0xc4, 0xfd, 0x7d, 0x27, 0xfd, 0x47, 0x89, 0xfd, 0x86, 0x00, \n  0x00, 0xd3, 0xa5, 0x00, 0x15, 0xd6, 0xff, 0x69, 0x03, 0x00, 0x46, 0xfc, 0xfe, 0xf6, 0xcf, 0xfe, \n  0x5f, 0x87, 0xfe, 0x55, 0xad, 0xfd, 0xf0, 0x5b, 0x1f, 0xa9, 0x98, 0x29, 0x45, 0xc2, 0x0b, 0xad, \n  0x58, 0x01, 0x79, 0x4d, 0x09, 0x89, 0x2b, 0xff, 0x2d, 0xbb, 0xf6, 0x57, 0x4d, 0x06, 0x7f, 0xc8, \n  0x07, 0x26, 0x25, 0xf9, 0xc9, 0xd7, 0xfc, 0x07, 0x9d, 0x02, 0x1e, 0xe5, 0x01, 0x12, 0xb7, 0xfe, \n  0x8b, 0x34, 0xfc, 0xd5, 0x5f, 0xff, 0xf2, 0x9c, 0xfe, 0xb8, 0x2a, 0xfd, 0xd7, 0x33, 0xfe, 0xcf, \n  0x15, 0xff, 0xc9, 0x3e, 0xff, 0x44, 0x14, 0xfe, 0x94, 0x47, 0xfd, 0x5a, 0x0c, 0xfd, 0x2b, 0xee, \n  0xff, 0x4c, 0x00, 0x01, 0x7c, 0x94, 0xff, 0x46, 0x66, 0x00, 0xd7, 0x6b, 0xff, 0x50, 0x24, 0xfe, \n  0xdf, 0x2a, 0xfe, 0x52, 0xcd, 0xfd, 0x9e, 0x2c, 0x21, 0x0b, 0x6b, 0x2a, 0x90, 0x1e, 0x0c, 0xd4, \n  0xc5, 0x02, 0xb5, 0x65, 0x09, 0xfe, 0x34, 0xff, 0xa4, 0x1f, 0xf6, 0xfc, 0x43, 0x05, 0xcc, 0xe0, \n  0x07, 0x90, 0xf2, 0xf8, 0x69, 0x31, 0xfd, 0x0f, 0x92, 0x02, 0xb2, 0x9b, 0x01, 0xdf, 0x55, 0xff, \n  0xbc, 0xcd, 0xfb, 0x1e, 0xd6, 0xfe, 0x82, 0xd6, 0xfe, 0x45, 0x09, 0xfd, 0xec, 0x37, 0xfd, 0x02, \n  0x9d, 0xfe, 0x52, 0xe3, 0xff, 0xb2, 0x40, 0xfe, 0xe7, 0x95, 0xfd, 0x19, 0xcb, 0xfc, 0x7a, 0x35, \n  0xff, 0x57, 0xcf, 0x01, 0x98, 0x9c, 0xff, 0xc2, 0xd1, 0xff, 0x21, 0xe2, 0xff, 0x2a, 0x48, 0xfe, \n  0x96, 0xe1, 0xfd, 0x8f, 0x5b, 0xfd, 0x3c, 0x4f, 0x23, 0x4d, 0x95, 0x2a, 0xf5, 0xc4, 0x0b, 0x77, \n  0xa6, 0x04, 0x6f, 0x8c, 0x0a, 0x1e, 0x24, 0xff, 0x75, 0xa8, 0xf4, 0xf6, 0xa5, 0x04, 0x1c, 0x20, \n  0x08, 0xcd, 0x21, 0xf8, 0x74, 0x81, 0xfd, 0xdc, 0xf8, 0x02, 0x18, 0x13, 0x01, 0x19, 0x60, 0xff, \n  0x9b, 0x2b, 0xfc, 0x5a, 0x67, 0xfe, 0xec, 0x4e, 0xfe, 0xc0, 0x61, 0xfd, 0x4c, 0x8c, 0xfc, 0xdd, \n  0x76, 0xfd, 0x92, 0x69, 0x00, 0x55, 0xc6, 0xfe, 0x7e, 0x7f, 0xfd, 0x12, 0x02, 0xfd, 0xba, 0xb8, \n  0xfe, 0xa8, 0xc6, 0x01, 0xa0, 0x4e, 0x00, 0xf1, 0x2b, 0xff, 0x91, 0x92, 0xff, 0x6c, 0xfe, 0xfe, \n  0xc4, 0xcf, 0xfd, 0x73, 0xad, 0xfc, 0xf9, 0x87, 0x26, 0xf2, 0x28, 0x2a, 0x19, 0x28, 0x09, 0x4c, \n  0xa6, 0x07, 0x1a, 0xc2, 0x0d, 0xd7, 0x8a, 0xfd, 0x12, 0x9c, 0xf2, 0xec, 0x87, 0x05, 0xb1, 0x04, \n  0x08, 0x4c, 0xa7, 0xf6, 0xdf, 0xf3, 0xfd, 0xb1, 0x8f, 0x03, 0x28, 0xd4, 0x00, 0x60, 0xdd, 0xfe, \n  0xe4, 0x99, 0xfc, 0xb5, 0xd1, 0xfe, 0x8e, 0x50, 0xfd, 0x91, 0x51, 0xfd, 0xdc, 0xc1, 0xfc, 0x14, \n  0x5d, 0xfc, 0x37, 0xfd, 0xff, 0xbe, 0xa7, 0xff, 0x03, 0x98, 0xfd, 0x01, 0x18, 0xfd, 0x72, 0x1f, \n  0xff, 0x28, 0x26, 0x01, 0xfe, 0x89, 0x00, 0xc6, 0x86, 0xff, 0x43, 0x21, 0xff, 0x53, 0x12, 0xff, \n  0x01, 0xdd, 0xfd, 0xa4, 0x8c, 0xfc, 0xe6, 0x61, 0x29, 0xa5, 0x37, 0x29, 0x7d, 0xf1, 0x05, 0x25, \n  0x0c, 0x0c, 0x61, 0x71, 0x12, 0x33, 0x62, 0xfa, 0xb3, 0x3c, 0xf0, 0xce, 0x52, 0x08, 0x4c, 0xe6, \n  0x07, 0x97, 0xcc, 0xf3, 0xa8, 0x5f, 0xfe, 0x21, 0xe4, 0x04, 0xb1, 0xe5, 0x00, 0x92, 0x20, 0xfe, \n  0xae, 0x82, 0xfc, 0x61, 0xaf, 0xff, 0x33, 0x06, 0xfd, 0x8f, 0xe5, 0xfc, 0x26, 0xfe, 0xfc, 0xec, \n  0xb5, 0xfb, 0x39, 0xbf, 0xfe, 0xda, 0x7e, 0x00, 0x21, 0xb5, 0xfe, 0x74, 0x69, 0xfc, 0x80, 0xab, \n  0xff, 0x91, 0x30, 0x01, 0x89, 0x07, 0x00, 0x6e, 0x92, 0x00, 0xa3, 0xe8, 0xfe, 0x68, 0x5f, 0xfe, \n  0x02, 0x51, 0xfe, 0x72, 0x1c, 0xfd, 0xc5, 0x7d, 0x2a, 0x46, 0x22, 0x28, 0x47, 0x00, 0x04, 0xfb, \n  0xad, 0x10, 0x07, 0x37, 0x17, 0x5c, 0xcd, 0xf6, 0xf5, 0x09, 0xee, 0x07, 0xd8, 0x0c, 0x99, 0xcb, \n  0x07, 0x48, 0xe1, 0xee, 0x82, 0x92, 0xfe, 0x04, 0x6a, 0x07, 0x40, 0x1b, 0x01, 0xd2, 0xfb, 0xfc, \n  0x0d, 0xd3, 0xfb, 0x14, 0xb6, 0x00, 0x99, 0x6d, 0xfd, 0x28, 0x5b, 0xfc, 0xaf, 0x0a, 0xfd, 0x9d, \n  0x5b, 0xfb, 0x8c, 0x26, 0xfd, 0x57, 0x74, 0x00, 0x87, 0x76, 0x00, 0x11, 0x02, 0xfc, 0xa0, 0x79, \n  0xff, 0x69, 0xcc, 0x01, 0x68, 0x70, 0xff, 0xf3, 0x39, 0x01, 0xf5, 0x57, 0xff, 0x79, 0xba, 0xfd, \n  0x10, 0x75, 0xfe, 0x5b, 0xa0, 0xfd, 0xa9, 0x02, 0x2d, 0xc0, 0x8b, 0x2a, 0xba, 0x2d, 0x00, 0xb6, \n  0x72, 0x0e, 0xe1, 0x31, 0x1c, 0xd8, 0xdc, 0xf8, 0x00, 0x5d, 0xeb, 0x23, 0x64, 0x0d, 0x16, 0x5e, \n  0x08, 0x1c, 0xbb, 0xeb, 0xe4, 0x38, 0xfe, 0xdb, 0x4d, 0x09, 0x61, 0xd0, 0x00, 0x40, 0xd0, 0xfb, \n  0x86, 0x6f, 0xfb, 0xbb, 0xc8, 0x01, 0x74, 0x68, 0xfd, 0x5e, 0x3d, 0xfb, 0x2d, 0x64, 0xfd, 0x0f, \n  0xbb, 0xfb, 0x0e, 0xe4, 0xfb, 0xb6, 0xda, 0xfe, 0x4c, 0x92, 0x01, 0x36, 0x34, 0xfd, 0x3b, 0x97, \n  0xfe, 0x2d, 0x15, 0x02, 0x65, 0xae, 0xff, 0x86, 0x19, 0x01, 0x87, 0xcb, 0xff, 0x83, 0x8b, 0xfd, \n  0x42, 0x60, 0xfe, 0x23, 0xaa, 0xfd, 0x24, 0x4e, 0x31, 0xc9, 0x16, 0x2d, 0xc6, 0x0c, 0xfc, 0xba, \n  0xea, 0x09, 0x89, 0x95, 0x1f, 0xfe, 0x33, 0xfd, 0x97, 0xf3, 0xe9, 0xd6, 0xba, 0x0c, 0x4d, 0x1d, \n  0x08, 0x62, 0xfc, 0xe9, 0xd6, 0xf1, 0xfd, 0x89, 0x91, 0x0a, 0x48, 0x0b, 0x01, 0x27, 0x2e, 0xfa, \n  0x69, 0x2c, 0xfb, 0x2d, 0x02, 0x03, 0x61, 0x7a, 0xfd, 0xf4, 0x2d, 0xfa, 0x0d, 0x43, 0xfd, 0x9c, \n  0x88, 0xfc, 0xca, 0x80, 0xfb, 0xdb, 0x1b, 0xfd, 0x63, 0x4b, 0x01, 0x52, 0x01, 0xff, 0x3f, 0x8a, \n  0xfe, 0x9a, 0x8b, 0x01, 0xc3, 0x95, 0x00, 0x03, 0x1b, 0x01, 0x2a, 0xc6, 0xff, 0x56, 0xfe, 0xfd, \n  0x82, 0x7a, 0xfe, 0x4a, 0x47, 0xfd, 0x1c, 0xa0, 0x35, 0xf9, 0xeb, 0x2f, 0x5b, 0xd8, 0xf7, 0x4e, \n  0x49, 0x05, 0x92, 0xea, 0x20, 0xd2, 0xae, 0x01, 0xc7, 0x0e, 0xeb, 0xda, 0x23, 0x0b, 0xf5, 0x5e, \n  0x07, 0xe3, 0x4c, 0xe9, 0x4a, 0x4d, 0xfd, 0x27, 0x88, 0x0b, 0x5e, 0x89, 0x01, 0x81, 0x96, 0xf8, \n  0xbe, 0xaf, 0xfa, 0x78, 0xea, 0x03, 0x84, 0x8a, 0xfd, 0x8f, 0x5d, 0xf9, 0xd4, 0xcf, 0xfc, 0xd4, \n  0x12, 0xfd, 0xf4, 0xba, 0xfb, 0x1f, 0xad, 0xfb, 0x5a, 0xf5, 0xff, 0xf2, 0x90, 0x00, 0x3a, 0x60, \n  0xff, 0xef, 0x7b, 0x00, 0xe6, 0x68, 0x01, 0xf2, 0xa6, 0x01, 0x3b, 0x91, 0xff, 0xfa, 0xbf, 0xfe, \n  0x9a, 0xb2, 0xfe, 0xf7, 0x87, 0xfc, 0x34, 0x94, 0x39, 0xca, 0x59, 0x33, 0xb4, 0xe8, 0xf4, 0xf5, \n  0xfc, 0xff, 0x77, 0x78, 0x20, 0xcd, 0x4f, 0x06, 0x58, 0x7c, 0xed, 0xee, 0xb3, 0x09, 0x5e, 0xff, \n  0x05, 0xe2, 0x14, 0xe9, 0xd7, 0xd7, 0xfc, 0xe3, 0xa8, 0x0b, 0x9c, 0x79, 0x02, 0x44, 0x5f, 0xf7, \n  0x22, 0xe7, 0xf9, 0x98, 0xb6, 0x04, 0x2a, 0x89, 0xfd, 0xdc, 0x24, 0xf9, 0xe6, 0x3b, 0xfc, 0xd7, \n  0x48, 0xfd, 0x41, 0x86, 0xfc, 0x27, 0xd7, 0xfa, 0x5f, 0x4b, 0xfe, 0x30, 0x1e, 0x01, 0x4d, 0xe4, \n  0x00, 0x6e, 0xd5, 0xff, 0x40, 0x7d, 0x01, 0x2f, 0xa7, 0x02, 0xbf, 0xc7, 0xff, 0x8a, 0x74, 0xff, \n  0xe5, 0xcd, 0xfe, 0x29, 0xe1, 0xfb, 0x4c, 0x29, 0x3d, 0x2f, 0x13, 0x37, 0xfd, 0x02, 0xf3, 0x50, \n  0x5e, 0xfa, 0xfa, 0xca, 0x1e, 0x79, 0xfa, 0x09, 0x80, 0x78, 0xf0, 0x3e, 0x96, 0x09, 0xbd, 0xe7, \n  0x03, 0xcb, 0x91, 0xe8, 0x7f, 0x42, 0xfd, 0x25, 0xfe, 0x0a, 0xe0, 0x1c, 0x03, 0x16, 0xed, 0xf6, \n  0x32, 0xdf, 0xf8, 0xce, 0xf2, 0x04, 0xfa, 0x79, 0xfd, 0x5f, 0x41, 0xf9, 0xa1, 0x9e, 0xfb, 0x9c, \n  0x2c, 0xfd, 0x13, 0x4e, 0xfd, 0xcc, 0xb2, 0xfa, 0xf3, 0x0d, 0xfd, 0x24, 0x44, 0x00, 0x7b, 0x43, \n  0x02, 0xfe, 0x44, 0x00, 0xe0, 0xe1, 0x00, 0xba, 0x8d, 0x03, 0x3d, 0x9a, 0x00, 0x1a, 0xe2, 0xff, \n  0xb5, 0x9f, 0xfe, 0x3f, 0x87, 0xfb, 0x9f, 0xf3, 0x3f, 0xa0, 0x58, 0x3b, 0xbc, 0xdb, 0xf1, 0xf6, \n  0xca, 0xf4, 0x63, 0x9b, 0x1c, 0x9e, 0x22, 0x0c, 0xe8, 0x49, 0xf3, 0xe3, 0x0a, 0x0b, 0x7e, 0xc9, \n  0x01, 0xfc, 0x3d, 0xe7, 0x2b, 0x9d, 0xfe, 0xfb, 0x0a, 0x0a, 0x8f, 0xc0, 0x02, 0xc3, 0x6c, 0xf7, \n  0x71, 0xf1, 0xf7, 0x81, 0x48, 0x04, 0x3b, 0x50, 0xfd, 0x49, 0xb8, 0xf9, 0x37, 0x0f, 0xfb, 0xf0, \n  0xc7, 0xfc, 0x32, 0x07, 0xfe, 0x8f, 0xff, 0xfa, 0x76, 0x78, 0xfc, 0xac, 0xb2, 0xfe, 0x93, 0xba, \n  0x02, 0x44, 0x51, 0x01, 0xb3, 0x6b, 0x00, 0x5f, 0x35, 0x04, 0x3a, 0xaa, 0x01, 0x2a, 0x1e, 0x00, \n  0xb1, 0x5a, 0xfe, 0x36, 0x88, 0xfb, 0x65, 0xae, 0x43, 0x43, 0x2d, 0x3f, 0x5d, 0x6a, 0xef, 0x51, \n  0x4c, 0xf1, 0x19, 0xb8, 0x1a, 0xb5, 0x76, 0x0b, 0xaa, 0x03, 0xf6, 0x93, 0x07, 0x0e, 0xd2, 0xc1, \n  0xff, 0x25, 0x2b, 0xe5, 0xb2, 0xde, 0x00, 0x38, 0x71, 0x09, 0x6d, 0x25, 0x01, 0x3f, 0x7f, 0xf8, \n  0x53, 0xb9, 0xf7, 0x51, 0xfb, 0x02, 0x71, 0xa5, 0xfc, 0x37, 0xa0, 0xfa, 0xce, 0xd0, 0xfa, 0x97, \n  0x0e, 0xfc, 0xcb, 0x18, 0xff, 0x6e, 0x5a, 0xfb, 0x2e, 0x47, 0xfc, 0xf3, 0x94, 0xfd, 0x76, 0x3c, \n  0x02, 0xc3, 0x38, 0x02, 0x49, 0x66, 0x00, 0x58, 0x1f, 0x05, 0xb5, 0xd4, 0x02, 0x69, 0xd3, 0xff, \n  0xa3, 0x45, 0xfe, 0xb9, 0xc4, 0xfb, 0xfc, 0xa2, 0x4a, 0x3f, 0x0b, 0x40, 0x04, 0x92, 0xe9, 0x6d, \n  0x8a, 0xf2, 0xaa, 0xff, 0x18, 0xa5, 0xec, 0x06, 0x3a, 0xad, 0xf9, 0xde, 0x5e, 0x11, 0xf1, 0xcf, \n  0xfc, 0xad, 0xb1, 0xe3, 0xed, 0xc4, 0x03, 0x66, 0xbc, 0x08, 0x79, 0x83, 0xfe, 0xe6, 0xcb, 0xf9, \n  0x82, 0xfb, 0xf7, 0xd1, 0x17, 0x01, 0xcf, 0xd2, 0xfb, 0x0a, 0x3f, 0xfb, 0xe3, 0xe6, 0xfa, 0x86, \n  0x85, 0xfb, 0x59, 0xf9, 0xff, 0x59, 0xcd, 0xfb, 0x59, 0x0e, 0xfc, 0x26, 0x1f, 0xfd, 0xf4, 0x6e, \n  0x01, 0xda, 0x62, 0x02, 0x45, 0x86, 0x00, 0x4d, 0x66, 0x06, 0x7b, 0x38, 0x04, 0xd0, 0xc3, 0xfe, \n  0xd4, 0x24, 0xfe, 0x06, 0x3f, 0xfc, 0x59, 0x5c, 0x51, 0x53, 0xcd, 0x40, 0xa5, 0xe4, 0xe3, 0x04, \n  0x18, 0xf5, 0x5f, 0xbf, 0x16, 0x19, 0xa0, 0x01, 0x9c, 0x3f, 0xfd, 0x33, 0x93, 0x13, 0x01, 0x37, \n  0xfb, 0x80, 0xfe, 0xe2, 0x19, 0xb4, 0x05, 0xdd, 0x09, 0x08, 0xce, 0xec, 0xfb, 0x40, 0xc0, 0xfb, \n  0x96, 0xb9, 0xf7, 0xfa, 0xda, 0xfe, 0x04, 0xda, 0xfb, 0x4a, 0x3a, 0xfb, 0x39, 0x50, 0xfb, 0x44, \n  0xb6, 0xfb, 0xdf, 0x0e, 0x00, 0xc7, 0x8e, 0xfc, 0xe5, 0x48, 0xfc, 0xea, 0x6b, 0xfc, 0xa3, 0x01, \n  0x01, 0xe0, 0x3f, 0x02, 0x46, 0x2a, 0x00, 0x2e, 0x04, 0x08, 0x0e, 0xef, 0x05, 0x9c, 0x85, 0xfd, \n  0xb0, 0xa9, 0xfd, 0xec, 0xe3, 0xfc, 0x22, 0x81, 0x56, 0xd8, 0x2c, 0x42, 0xfb, 0x0a, 0xe0, 0x2f, \n  0x5b, 0xf7, 0x33, 0x82, 0x14, 0x56, 0x96, 0xfc, 0x83, 0xc5, 0xff, 0xa9, 0xf4, 0x14, 0x3e, 0x01, \n  0xfb, 0xe8, 0x81, 0xe3, 0xa7, 0x51, 0x06, 0xe4, 0x0e, 0x07, 0x0c, 0x63, 0xfa, 0x54, 0x8a, 0xfd, \n  0x6e, 0x2e, 0xf7, 0x05, 0xc6, 0xfc, 0xbc, 0x22, 0xfc, 0x3f, 0x80, 0xfb, 0xe7, 0xbe, 0xfb, 0x98, \n  0xf7, 0xfb, 0xf6, 0x09, 0x00, 0x2f, 0x4b, 0xfd, 0x08, 0xf9, 0xfc, 0xf3, 0xad, 0xfb, 0xc6, 0xb9, \n  0x00, 0x5e, 0x86, 0x02, 0x15, 0x4e, 0xff, 0x89, 0x16, 0x09, 0x4e, 0xe6, 0x07, 0x1e, 0xce, 0xfc, \n  0x99, 0xb8, 0xfc, 0x2b, 0x48, 0xfd, 0x36, 0xa9, 0x59, 0xd1, 0x0f, 0x44, 0x65, 0x87, 0xde, 0x3f, \n  0x7f, 0xf8, 0x15, 0x0d, 0x12, 0xd6, 0x02, 0xf8, 0xf2, 0x9c, 0x00, 0x77, 0x8f, 0x15, 0x23, 0xb2, \n  0xfb, 0xfc, 0x98, 0xe4, 0xb7, 0xc3, 0x05, 0x45, 0xaf, 0x05, 0xc0, 0x6b, 0xf9, 0x0e, 0xd8, 0xfe, \n  0x72, 0xa6, 0xf6, 0xf3, 0xa7, 0xfa, 0x64, 0x4a, 0xfc, 0x5c, 0x7e, 0xfc, 0x2d, 0x83, 0xfb, 0xb5, \n  0xa4, 0xfb, 0x0c, 0xa3, 0x00, 0x23, 0x53, 0xfd, 0xba, 0xbf, 0xfd, 0x3e, 0x6b, 0xfb, 0x10, 0xea, \n  0xff, 0x45, 0xa0, 0x03, 0x69, 0x37, 0xfe, 0xe3, 0x10, 0x08, 0xab, 0x7c, 0x09, 0x1f, 0x6f, 0xfd, \n  0x58, 0x56, 0xfb, 0xe3, 0xa8, 0xfc, 0x94, 0xf3, 0x5a, 0xa1, 0x16, 0x46, 0xe5, 0xb8, 0xdf, 0x26, \n  0xf3, 0xf8, 0x1d, 0x68, 0x0f, 0xf7, 0x42, 0xf4, 0xf8, 0xfa, 0xff, 0x44, 0xb0, 0x15, 0x63, 0x0b, \n  0xfd, 0x7b, 0x20, 0xe6, 0x3c, 0xdf, 0x04, 0xf7, 0x06, 0x04, 0xa6, 0xc0, 0xf8, 0x59, 0x04, 0x00, \n  0xc3, 0x6b, 0xf6, 0x6a, 0xe4, 0xf8, 0xe9, 0x8b, 0xfc, 0xc0, 0xca, 0xfd, 0xec, 0xd3, 0xfa, 0x8f, \n  0xfa, 0xfa, 0xb2, 0xe3, 0x01, 0x4e, 0xd8, 0xfc, 0xfc, 0x57, 0xfe, 0x8a, 0x56, 0xfc, 0x3b, 0xc5, \n  0xfe, 0x62, 0x0e, 0x05, 0x03, 0x66, 0xfd, 0xd5, 0xc2, 0x04, 0xe8, 0x4d, 0x0a, 0xee, 0xa5, 0xff, \n  0x6e, 0x80, 0xfa, 0x51, 0x89, 0xfb, 0xb6, 0x34, 0x5a, 0xb2, 0xbc, 0x48, 0x03, 0x4f, 0xe3, 0xd9, \n  0xec, 0xf8, 0x9c, 0x79, 0x0c, 0xa3, 0x67, 0xf1, 0xcd, 0x5d, 0xfe, 0x23, 0xcb, 0x14, 0xa1, 0x59, \n  0xff, 0xe0, 0xc3, 0xe7, 0xa6, 0xb6, 0x03, 0x94, 0xa3, 0x02, 0xa3, 0xb0, 0xf7, 0xf7, 0x9e, 0x01, \n  0xf6, 0xcb, 0xf6, 0x83, 0x93, 0xf7, 0xfa, 0xd7, 0xfc, 0xdf, 0x96, 0xfe, 0x18, 0x73, 0xfa, 0x18, \n  0xfd, 0xf9, 0xa3, 0x6b, 0x03, 0xc6, 0x63, 0xfc, 0x48, 0x59, 0xfe, 0xbb, 0x16, 0xff, 0xcc, 0x4f, \n  0xfd, 0x51, 0x09, 0x05, 0x96, 0xbe, 0xfd, 0x4c, 0xc5, 0x00, 0x84, 0x20, 0x09, 0xba, 0x86, 0x02, \n  0x89, 0x02, 0xfc, 0xac, 0x26, 0xfa, 0x62, 0x30, 0x59, 0x15, 0xb7, 0x49, 0x38, 0x8d, 0xe8, 0xe5, \n  0xaa, 0xf9, 0x0b, 0xd1, 0x08, 0x58, 0xa2, 0xef, 0x82, 0x75, 0xfb, 0xc1, 0x91, 0x13, 0x4a, 0xe7, \n  0x01, 0x0e, 0xc7, 0xe8, 0xa3, 0x4e, 0x03, 0x62, 0xf5, 0x00, 0xfe, 0x88, 0xf6, 0x3a, 0xbc, 0x03, \n  0x02, 0xbb, 0xf7, 0x95, 0x8f, 0xf6, 0x08, 0xa5, 0xfc, 0x3b, 0x3b, 0xff, 0xef, 0x11, 0xfa, 0x53, \n  0x36, 0xf9, 0x74, 0xc6, 0x04, 0x83, 0xe8, 0xfb, 0xac, 0xea, 0xfe, 0x08, 0x0e, 0x02, 0x26, 0xdc, \n  0xfa, 0x73, 0xf3, 0x03, 0xbf, 0x89, 0xff, 0x3c, 0x0e, 0xfd, 0xd0, 0xf7, 0x05, 0x6c, 0xa4, 0x05, \n  0x71, 0xfa, 0xfe, 0xec, 0x06, 0xf9, 0x8b, 0x26, 0x57, 0xf2, 0x6e, 0x4a, 0x24, 0x82, 0xee, 0x1e, \n  0x57, 0xfa, 0x88, 0xbf, 0x05, 0xe9, 0xd2, 0xed, 0xe7, 0x67, 0xf7, 0xc8, 0x77, 0x12, 0x84, 0xf6, \n  0x03, 0x61, 0x2f, 0xe9, 0x47, 0x5d, 0x03, 0xeb, 0x27, 0xff, 0xc6, 0x92, 0xf5, 0x04, 0x6a, 0x06, \n  0x0c, 0x99, 0xf8, 0x76, 0xa5, 0xf5, 0xa9, 0x13, 0xfc, 0xdd, 0x05, 0xff, 0xcd, 0x9f, 0xfa, 0x06, \n  0x32, 0xf8, 0x53, 0x46, 0x05, 0x44, 0x6c, 0xfd, 0x18, 0xf7, 0xfd, 0x3b, 0x12, 0x03, 0x97, 0x29, \n  0xfa, 0x97, 0x88, 0x01, 0x58, 0x32, 0x01, 0xb0, 0xf0, 0xfb, 0x4d, 0xd8, 0x01, 0xed, 0x52, 0x06, \n  0x35, 0xfc, 0x02, 0x2b, 0x7f, 0xfa, 0xb0, 0xbd, 0x54, 0x78, 0x27, 0x4b, 0xea, 0xa8, 0xf3, 0x28, \n  0xa1, 0xfc, 0x75, 0x06, 0x04, 0x81, 0xcb, 0xea, 0x9c, 0x76, 0xf4, 0x72, 0xfb, 0x10, 0x7c, 0x0d, \n  0x05, 0x58, 0x5c, 0xea, 0xe4, 0x45, 0x03, 0x57, 0x89, 0xfe, 0x63, 0x39, 0xf5, 0xfc, 0x16, 0x09, \n  0xf8, 0xf4, 0xf9, 0xee, 0x5f, 0xf4, 0x41, 0xe0, 0xfb, 0xa9, 0x9b, 0xfe, 0x8e, 0x62, 0xfb, 0x4e, \n  0x8c, 0xf8, 0x02, 0x68, 0x05, 0xf7, 0x32, 0xfe, 0x4b, 0x3d, 0xfc, 0x44, 0xd2, 0x03, 0x2a, 0xaf, \n  0xfa, 0x5b, 0x93, 0xfe, 0xb9, 0x52, 0x03, 0xf0, 0x80, 0xfd, 0xb4, 0x52, 0xfd, 0x92, 0x9b, 0x05, \n  0x88, 0x55, 0x07, 0xf8, 0x2a, 0xfc, 0x99, 0x5d, 0x51, 0x89, 0x42, 0x4c, 0x2f, 0x65, 0xf8, 0xda, \n  0xce, 0xfe, 0x6b, 0xbe, 0x03, 0xf3, 0x4f, 0xe7, 0x5f, 0x79, 0xf1, 0x84, 0x14, 0x0f, 0x45, 0x36, \n  0x05, 0xca, 0x45, 0xec, 0x91, 0x12, 0x03, 0x11, 0x63, 0xfe, 0xa2, 0xbc, 0xf5, 0x43, 0x1a, 0x0b, \n  0x59, 0xdb, 0xfa, 0x33, 0xad, 0xf3, 0x64, 0x5d, 0xfb, 0x9d, 0x9d, 0xfd, 0x15, 0x4f, 0xfe, 0x52, \n  0xaf, 0xf8, 0xc7, 0x4b, 0x02, 0x12, 0xc3, 0xff, 0x81, 0x74, 0xfb, 0xfa, 0x1a, 0x02, 0xff, 0xd6, \n  0xfc, 0xb9, 0x20, 0xfe, 0xf5, 0xfb, 0x01, 0xec, 0xe4, 0x00, 0xa0, 0xa4, 0xfd, 0x8b, 0xd6, 0x00, \n  0xa9, 0xa2, 0x07, 0x51, 0xea, 0xff, 0x05, 0xab, 0x4e, 0x5b, 0xa6, 0x4b, 0x1a, 0xba, 0xfc, 0x9d, \n  0x03, 0x01, 0xcd, 0x9f, 0x03, 0xd0, 0xf1, 0xe4, 0x86, 0xe0, 0xed, 0x74, 0x7c, 0x0c, 0x89, 0x16, \n  0x05, 0x9d, 0xf1, 0xee, 0x22, 0xf8, 0x02, 0x85, 0x5b, 0xfe, 0xc5, 0xeb, 0xf6, 0x4a, 0x44, 0x0c, \n  0xd1, 0xdb, 0xfb, 0x0f, 0xde, 0xf1, 0xcf, 0x25, 0xfc, 0x59, 0xd0, 0xfe, 0x68, 0xcb, 0xfd, 0x02, \n  0x81, 0xf8, 0x1d, 0x35, 0x00, 0x37, 0x33, 0xff, 0x0b, 0xae, 0xfb, 0xd4, 0xb6, 0x01, 0x60, 0x0c, \n  0xfe, 0xde, 0x4f, 0xfe, 0x8c, 0x33, 0x01, 0x45, 0x9c, 0x04, 0x9f, 0x4d, 0xff, 0x6f, 0x5c, 0xfa, \n  0xf7, 0x56, 0x06, 0xd6, 0x12, 0x04, 0x37, 0x15, 0x4d, 0xc9, 0x85, 0x49, 0xb4, 0x88, 0xff, 0xa7, \n  0x80, 0x04, 0x6a, 0x6a, 0x03, 0x45, 0xd4, 0xe2, 0xb8, 0x25, 0xeb, 0x41, 0xd0, 0x08, 0x60, 0xdf, \n  0x04, 0x64, 0xbe, 0xf3, 0x7c, 0x28, 0x02, 0x66, 0xfd, 0xfc, 0x7f, 0x1a, 0xfb, 0x21, 0xa6, 0x0b, \n  0x47, 0x58, 0xfa, 0xe0, 0xb7, 0xf4, 0xfc, 0x90, 0xfc, 0xc5, 0xa4, 0xfc, 0xfe, 0x65, 0xfe, 0x7b, \n  0x5f, 0xf8, 0xf1, 0xcd, 0xfc, 0x7d, 0x7d, 0xff, 0xeb, 0x13, 0xfe, 0x66, 0x59, 0x00, 0x4c, 0x76, \n  0xfd, 0xc0, 0x52, 0x02, 0x1a, 0x7d, 0x01, 0x17, 0x27, 0x02, 0x46, 0x18, 0x03, 0xf5, 0x42, 0xfa, \n  0x60, 0x85, 0x00, 0x3a, 0xa7, 0x03, 0x77, 0x7b, 0x4b, 0x5d, 0x7d, 0x47, 0x65, 0x46, 0x01, 0xb3, \n  0xb5, 0x07, 0xec, 0x82, 0x03, 0x23, 0x52, 0xe1, 0xda, 0xde, 0xe7, 0x72, 0x46, 0x05, 0x83, 0x4d, \n  0x06, 0xbc, 0x78, 0xf7, 0xdd, 0xc4, 0x01, 0x18, 0x77, 0xfc, 0xa4, 0xdf, 0xfc, 0x10, 0xf2, 0x0b, \n  0x59, 0x0b, 0xfb, 0x90, 0x75, 0xf5, 0xe8, 0xe4, 0xfb, 0x2c, 0xd4, 0xfb, 0x3b, 0x6e, 0xfd, 0xa8, \n  0x2d, 0xf7, 0xea, 0xc7, 0xfc, 0x07, 0x58, 0x00, 0x91, 0x1c, 0xfd, 0x8c, 0x83, 0x01, 0x90, 0xe7, \n  0xff, 0x28, 0xbc, 0x01, 0xcc, 0x21, 0x01, 0xd9, 0x6e, 0x02, 0x9b, 0x77, 0x05, 0x05, 0x3d, 0xfb, \n  0x46, 0x7d, 0xfb, 0x4f, 0xaa, 0x00, 0x61, 0xcc, 0x4b, 0xfc, 0xe3, 0x42, 0x75, 0xd7, 0x01, 0x4d, \n  0x73, 0x0c, 0xa0, 0xce, 0x01, 0xbe, 0xa2, 0xdf, 0xb2, 0x7c, 0xe7, 0xb3, 0x84, 0x01, 0x3a, 0xbe, \n  0x06, 0xb0, 0xc9, 0xfd, 0x89, 0xdd, 0xff, 0x3b, 0x89, 0xf9, 0x37, 0x92, 0x02, 0x3f, 0x7d, 0x0b, \n  0x75, 0xb7, 0xf8, 0x0e, 0x4f, 0xf8, 0x60, 0xd2, 0xfa, 0xc3, 0xa4, 0xf8, 0x00, 0xd0, 0xfd, 0xa5, \n  0x12, 0xf9, 0x1d, 0x3c, 0xfb, 0xce, 0xa3, 0xff, 0x48, 0x3e, 0x00, 0x32, 0x77, 0x02, 0x68, 0x97, \n  0xfe, 0xde, 0x08, 0x01, 0xc6, 0x65, 0x03, 0xaa, 0xc2, 0x03, 0x42, 0xed, 0x02, 0x08, 0xe1, 0xfc, \n  0x16, 0x69, 0xfc, 0x77, 0x7c, 0xfb, 0x9e, 0xc4, 0x4a, 0x00, 0x91, 0x3e, 0xc0, 0x2d, 0x02, 0x1e, \n  0xcc, 0x10, 0x13, 0xf4, 0xff, 0xc4, 0xbf, 0xde, 0xd4, 0x22, 0xe8, 0xdf, 0x21, 0xfe, 0x84, 0x65, \n  0x07, 0x3b, 0x0d, 0x02, 0xc2, 0x7d, 0xff, 0x00, 0xaa, 0xf7, 0x11, 0x71, 0x04, 0xd0, 0x0a, 0x0c, \n  0xd0, 0xfa, 0xf7, 0x20, 0xac, 0xf8, 0x22, 0x2f, 0xf8, 0x83, 0x58, 0xf8, 0x7f, 0x55, 0x00, 0x28, \n  0x1f, 0xf7, 0x43, 0x10, 0xfb, 0x4a, 0x73, 0x03, 0xdd, 0x71, 0xff, 0xe0, 0x23, 0x00, 0x7f, 0x97, \n  0x00, 0x88, 0xa1, 0x01, 0xf3, 0x51, 0x02, 0x44, 0xc8, 0x04, 0x80, 0x49, 0x02, 0x37, 0xce, 0xfc, \n  0x8b, 0xae, 0xfe, 0x65, 0xf3, 0xf8, 0xa1, 0x07, 0x47, 0x58, 0x39, 0x3a, 0xaf, 0xed, 0x05, 0x33, \n  0x00, 0x14, 0x2f, 0x13, 0xfb, 0xe9, 0x8c, 0xe2, 0xbf, 0x34, 0xec, 0xcd, 0xad, 0xf4, 0x24, 0x58, \n  0x08, 0x63, 0x1a, 0x0c, 0x38, 0x1c, 0xfb, 0x67, 0x16, 0xf3, 0xb2, 0x51, 0x09, 0x3d, 0xca, 0x0b, \n  0x92, 0xff, 0xf5, 0xae, 0x43, 0xf9, 0x77, 0xa0, 0xf7, 0x0a, 0x57, 0xf8, 0xa3, 0xbe, 0x00, 0xf0, \n  0x81, 0xf8, 0x2b, 0x2e, 0xfc, 0x58, 0x30, 0x03, 0xd1, 0x16, 0xfe, 0xee, 0x39, 0x00, 0x3c, 0xe1, \n  0x02, 0x6b, 0x2d, 0x00, 0xd9, 0x97, 0x00, 0x08, 0x9c, 0x06, 0x49, 0x5a, 0x03, 0x57, 0x8e, 0xfb, \n  0x12, 0xdd, 0xfe, 0x82, 0xcb, 0xfa, 0x1d, 0x6d, 0x47, 0xd1, 0x85, 0x37, 0x7c, 0xa0, 0x04, 0xa5, \n  0xb1, 0x10, 0xe9, 0x35, 0xf8, 0x38, 0x8a, 0xe9, 0xf5, 0x74, 0xef, 0xbd, 0x27, 0xf0, 0x58, 0x60, \n  0x09, 0x96, 0xdd, 0x0e, 0xb1, 0xb1, 0xf9, 0xa4, 0xc1, 0xf2, 0x43, 0xd4, 0x09, 0x17, 0xc4, 0x09, \n  0x77, 0x3d, 0xf6, 0x6e, 0xfd, 0xfa, 0x09, 0xa3, 0xf5, 0xb9, 0xfb, 0xf8, 0x3c, 0x33, 0x04, 0x10, \n  0xc0, 0xf8, 0xf5, 0xb0, 0xfb, 0x92, 0xbc, 0x02, 0xa0, 0x24, 0xfe, 0x64, 0x32, 0x01, 0x8e, 0x52, \n  0x02, 0x42, 0x47, 0xff, 0xb5, 0x21, 0x01, 0x2e, 0x0f, 0x07, 0x5d, 0x5f, 0x03, 0xa2, 0xf8, 0xfb, \n  0xf6, 0x2f, 0xfe, 0x69, 0xdb, 0xfa, 0x92, 0x47, 0x4a, 0x52, 0x1a, 0x35, 0xce, 0xc5, 0xfb, 0x92, \n  0x5d, 0x10, 0x0e, 0xad, 0xf9, 0x9d, 0x06, 0xe9, 0x5a, 0xa0, 0xf6, 0x71, 0x06, 0xf1, 0xc3, 0x27, \n  0x04, 0x83, 0x6c, 0x10, 0x93, 0x0d, 0xfb, 0x00, 0x8f, 0xf1, 0x09, 0x8e, 0x08, 0xb9, 0x88, 0x09, \n  0x47, 0x28, 0xf6, 0x9a, 0x1a, 0xfa, 0xf0, 0x5c, 0xf8, 0x41, 0xeb, 0xfa, 0x0b, 0xfb, 0x02, 0x24, \n  0x2b, 0xf9, 0x05, 0x1a, 0xfc, 0xdc, 0x69, 0x03, 0x5e, 0x70, 0xfe, 0xea, 0xe1, 0xfe, 0x75, 0x8a, \n  0x01, 0xf4, 0x6e, 0x01, 0x90, 0x15, 0x02, 0xa1, 0x31, 0x05, 0x7f, 0xb3, 0x02, 0xb2, 0x26, 0xfd, \n  0xe1, 0x8d, 0xfd, 0x35, 0xa0, 0xfa, 0x60, 0x3c, 0x4a, 0xdd, 0xc1, 0x30, 0x28, 0x43, 0xf5, 0x2d, \n  0xb6, 0x13, 0xb7, 0xf3, 0xfd, 0x1a, 0x76, 0xe7, 0xbf, 0x9f, 0xf7, 0xaa, 0xb1, 0xf4, 0x45, 0xdf, \n  0x04, 0x78, 0x5c, 0x0b, 0x55, 0x43, 0xfa, 0xec, 0x85, 0xf4, 0xe4, 0x72, 0x07, 0x84, 0xf3, 0x08, \n  0x9d, 0x76, 0xf5, 0xf7, 0x42, 0xfb, 0x51, 0x74, 0xfb, 0x69, 0x2e, 0xfb, 0xff, 0x3b, 0x02, 0xad, \n  0xc9, 0xf8, 0x9a, 0x2e, 0xfd, 0x5d, 0x29, 0x04, 0x73, 0x32, 0xfd, 0x9c, 0xe5, 0xfd, 0xf9, 0xc4, \n  0x01, 0x0f, 0x21, 0x02, 0x7f, 0x78, 0x02, 0xba, 0xde, 0x04, 0xe8, 0xda, 0x01, 0x8d, 0x21, 0xfd, \n  0x9f, 0xcb, 0xfd, 0xe0, 0xe6, 0xfa, 0x9f, 0xff, 0x46, 0xcb, 0xe1, 0x2c, 0x57, 0xe9, 0xf1, 0x30, \n  0x11, 0x17, 0xa9, 0x07, 0x03, 0xb1, 0x50, 0xe4, 0x32, 0x3c, 0xf9, 0x63, 0x67, 0xfa, 0x61, 0xec, \n  0x00, 0x4e, 0x22, 0x07, 0x9a, 0xae, 0xfc, 0x80, 0xca, 0xf5, 0x4a, 0xbd, 0x05, 0xaf, 0xc7, 0x08, \n  0x4c, 0x42, 0xf7, 0x5f, 0xea, 0xfb, 0xda, 0x72, 0xfc, 0xcf, 0x25, 0xfc, 0x53, 0x2f, 0x01, 0x10, \n  0xad, 0xf9, 0x54, 0xed, 0xfd, 0x57, 0x76, 0x02, 0xd2, 0x32, 0xfd, 0x44, 0xdf, 0xfe, 0x86, 0x6e, \n  0x01, 0x83, 0x21, 0x01, 0x6f, 0x21, 0x03, 0xf3, 0xa0, 0x05, 0x2f, 0xbc, 0x00, 0xce, 0x9c, 0xfc, \n  0x8f, 0x40, 0xfe, 0x47, 0x04, 0xfc, 0x5b, 0xd9, 0x40, 0x50, 0xf2, 0x28, 0xf9, 0xfc, 0xf4, 0x34, \n  0x74, 0x17, 0x52, 0x75, 0x02, 0x8b, 0x76, 0xe8, 0x50, 0xb7, 0xfc, 0x5d, 0xc9, 0xf7, 0x47, 0x87, \n  0xfe, 0x8f, 0x10, 0x08, 0xb2, 0xba, 0xfc, 0xf3, 0xc9, 0xf5, 0x9b, 0xea, 0x04, 0x5a, 0x48, 0x09, \n  0xc3, 0x6f, 0xf9, 0xdf, 0xe1, 0xfb, 0x9d, 0xc6, 0xfc, 0x23, 0x94, 0xfc, 0x51, 0x8b, 0x01, 0x89, \n  0x92, 0xfa, 0xfb, 0xde, 0xfc, 0xec, 0x99, 0x01, 0x71, 0x07, 0xfe, 0xc3, 0x2a, 0xff, 0x3b, 0xc9, \n  0x00, 0x49, 0x27, 0x01, 0xda, 0x50, 0x03, 0x8a, 0x07, 0x05, 0x55, 0xc9, 0x00, 0x74, 0x65, 0xfc, \n  0x51, 0x09, 0xfe, 0xe0, 0x99, 0xfd, 0xba, 0xe6, 0x38, 0x4e, 0x8d, 0x26, 0xcb, 0x6e, 0xff, 0xc3, \n  0x1a, 0x12, 0xa9, 0x16, 0xfa, 0xb4, 0x7a, 0xed, 0xb0, 0x7b, 0xff, 0x6d, 0x05, 0xff, 0x80, 0xa2, \n  0xff, 0xab, 0xb4, 0xfe, 0xe0, 0xa5, 0xfb, 0xec, 0x6e, 0xf9, 0xe4, 0x66, 0x06, 0x07, 0x06, 0x06, \n  0x25, 0xd4, 0xf7, 0x49, 0xb8, 0xff, 0x43, 0xc0, 0xfd, 0x2a, 0x0d, 0xfb, 0x30, 0x94, 0x01, 0x86, \n  0xab, 0xfb, 0x13, 0xc8, 0xfc, 0xf1, 0xc9, 0x01, 0xe5, 0xd3, 0xfd, 0x2c, 0x7b, 0xfd, 0x18, 0xb5, \n  0x01, 0xd7, 0xe8, 0x00, 0xd6, 0x46, 0xfe, 0xaa, 0x68, 0x02, 0xf8, 0xc6, 0x02, 0x7d, 0xf4, 0xfe, \n  0x39, 0xbc, 0x00, 0x2c, 0x5d, 0xfe, 0x53, 0xed, 0x2f, 0x69, 0x14, 0x24, 0xa5, 0xdb, 0x04, 0xa8, \n  0x56, 0x0f, 0x7f, 0xf2, 0xfa, 0xea, 0x33, 0xf4, 0xf4, 0xc6, 0xff, 0xe8, 0x4e, 0xfc, 0x14, 0x89, \n  0xff, 0xdd, 0x5c, 0x00, 0x51, 0x5b, 0xfc, 0xc4, 0xf9, 0xf8, 0x68, 0x5a, 0x05, 0x07, 0xc0, 0x06, \n  0x6b, 0xcb, 0xf9, 0x00, 0x54, 0xff, 0x9c, 0xed, 0xfd, 0x4d, 0x3c, 0xfc, 0x3a, 0x56, 0x01, 0x32, \n  0x35, 0xfc, 0xb4, 0x4e, 0xfd, 0x44, 0x23, 0x01, 0xb3, 0x14, 0xfe, 0xe7, 0xef, 0xfd, 0x6d, 0x56, \n  0x01, 0xd3, 0xa2, 0x00, 0x67, 0xe5, 0xfe, 0xf7, 0xaa, 0x02, 0xc5, 0x73, 0x02, 0x4e, 0x95, 0xff, \n  0xbe, 0x7a, 0x00, 0x82, 0xb8, 0xfd, 0x4c, 0x53, 0x26, 0x86, 0xae, 0x22, 0x98, 0x52, 0x0a, 0xd3, \n  0xa3, 0x0b, 0x98, 0x6f, 0xfc, 0x75, 0x54, 0xf9, 0x9c, 0x66, 0xff, 0x16, 0x0d, 0xfb, 0x5d, 0xdb, \n  0xfe, 0xda, 0x42, 0x01, 0x64, 0xdb, 0xfc, 0xbb, 0xa4, 0xf9, 0xf5, 0x9b, 0x04, 0xc5, 0x94, 0x05, \n  0xac, 0xa5, 0xfb, 0x76, 0x7d, 0xff, 0x99, 0x15, 0xfe, 0xc4, 0xf8, 0xfc, 0xb9, 0x76, 0x00, 0x36, \n  0xf0, 0xfc, 0x48, 0x0b, 0xfe, 0x07, 0x95, 0x00, 0x2e, 0xc6, 0xfd, 0xa4, 0x2f, 0xfe, 0x18, 0x61, \n  0x01, 0x6d, 0x3c, 0x00, 0x3d, 0x76, 0xff, 0x33, 0x4c, 0x02, 0xcf, 0xaa, 0x01, 0xd6, 0x56, 0x00, \n  0x84, 0x73, 0x00, 0xf8, 0xd1, 0xfd, 0xe0, 0x17, 0x20, 0x0e, 0x4f, 0x20, 0x78, 0x52, 0x0b, 0x36, \n  0x0f, 0x0b, 0xca, 0x59, 0xff, 0x97, 0x18, 0xfa, 0x45, 0xff, 0xfe, 0xdd, 0xc2, 0xfc, 0xbb, 0x20, \n  0xff, 0x65, 0xb1, 0x00, 0x94, 0xfc, 0xfc, 0xee, 0x31, 0xfb, 0xba, 0x00, 0x04, 0xcf, 0xba, 0x04, \n  0x04, 0xa7, 0xfc, 0xbd, 0x64, 0xff, 0xfa, 0xe7, 0xfe, 0x27, 0x56, 0xfd, 0x4f, 0x07, 0x00, 0x41, \n  0xf4, 0xfd, 0xd4, 0x3a, 0xfe, 0xdb, 0xe6, 0xff, 0xc0, 0x52, 0xfe, 0x40, 0x0b, 0xff, 0xb0, 0x90, \n  0x00, 0xf9, 0xc9, 0xff, 0xa3, 0x43, 0x00, 0x59, 0x00, 0x02, 0xf9, 0xc5, 0x01, 0x6a, 0x1e, 0x01, \n  0x88, 0x5f, 0x00, 0xfd, 0xac, 0xfe, 0x49, 0x5a, 0x1c, 0xca, 0x19, 0x1d, 0xe4, 0xae, 0x0a, 0xe1, \n  0x96, 0x0b, 0xb9, 0x22, 0x01, 0xa1, 0xf1, 0xf9, 0x6f, 0xf5, 0xfe, 0x55, 0xf0, 0xfe, 0x1a, 0x86, \n  0xff, 0xde, 0x59, 0xff, 0xad, 0xae, 0xfd, 0xf3, 0xbb, 0xfc, 0x1f, 0x11, 0x03, 0xf5, 0x03, 0x04, \n  0xc0, 0x0c, 0xfd, 0x4a, 0x9b, 0xff, 0xa1, 0xe6, 0xff, 0xdd, 0x67, 0xfd, 0x2a, 0x80, 0xff, 0x82, \n  0xc8, 0xfe, 0x29, 0xd0, 0xfe, 0xa2, 0x81, 0xff, 0xfd, 0x91, 0xfe, 0x4a, 0x55, 0xff, 0x96, 0xdb, \n  0xff, 0xf1, 0x0a, 0x00, 0x2c, 0x05, 0x01, 0x76, 0x03, 0x02, 0xa2, 0x96, 0x02, 0x04, 0xa1, 0x01, \n  0x05, 0x15, 0x00, 0x17, 0x76, 0xff, 0xb8, 0xa9, 0x18, 0x6e, 0x03, 0x1a, 0x5a, 0x06, 0x0b, 0xcf, \n  0xdd, 0x0b, 0xe0, 0x14, 0x02, 0x0e, 0xd3, 0xfa, 0xb2, 0xf3, 0xfe, 0x78, 0x22, 0x00, 0xec, 0x38, \n  0x00, 0x3f, 0x0a, 0xff, 0xb9, 0x7f, 0xfe, 0x77, 0x52, 0xfd, 0xb4, 0x01, 0x02, 0x4c, 0xda, 0x03, \n  0x9d, 0x2c, 0xfe, 0xdc, 0xcf, 0xff, 0x31, 0xeb, 0xff, 0x2d, 0xbe, 0xfd, 0x39, 0xf3, 0xff, 0xed, \n  0xdc, 0xff, 0x0a, 0xc0, 0xfe, 0xf9, 0xcb, 0xfe, 0xdc, 0x86, 0xff, 0x5f, 0xc4, 0xff, 0x9c, 0x99, \n  0xff, 0xe7, 0x2b, 0x01, 0xb3, 0xd1, 0x01, 0xe9, 0x50, 0x02, 0xcb, 0x27, 0x03, 0x51, 0x4e, 0x01, \n  0x40, 0xb8, 0xff, 0x42, 0x98, 0xff, 0x70, 0x2a, 0x15, 0xc0, 0x2a, 0x17, 0x8b, 0x7e, 0x0b, 0xbb, \n  0x07, 0x0c, 0x57, 0xe2, 0x02, 0x5c, 0xbc, 0xfb, 0x43, 0xb1, 0xfe, 0xd4, 0x25, 0x01, 0x43, 0x41, \n  0x01, 0x8a, 0xc9, 0xfe, 0x12, 0xd1, 0xfe, 0x4a, 0xb7, 0xfd, 0xc8, 0x6c, 0x01, 0x7e, 0xcd, 0x03, \n  0x5c, 0xca, 0xfe, 0x5e, 0xfe, 0xff, 0x8c, 0x3a, 0x00, 0xb6, 0x4c, 0xfe, 0x6d, 0x71, 0x00, 0xb4, \n  0x21, 0x00, 0xe3, 0x8d, 0xfe, 0x7a, 0x47, 0xff, 0xa1, 0xaf, 0x00, 0x2c, 0x6b, 0x00, 0xea, 0x4c, \n  0x00, 0x62, 0xa1, 0x01, 0x29, 0xcc, 0x01, 0xbe, 0xa9, 0x02, 0xb7, 0xa8, 0x02, 0xf2, 0xf1, 0xff, \n  0xf2, 0x64, 0xff, 0xc9, 0x07, 0x00, 0x6a, 0x83, 0x12, 0x42, 0x7e, 0x15, 0xa2, 0x72, 0x0b, 0xdc, \n  0xd9, 0x0a, 0x52, 0x89, 0x03, 0x38, 0x22, 0xfd, 0x80, 0xd2, 0xfe, 0x12, 0xba, 0x01, 0x70, 0x90, \n  0x01, 0x85, 0xed, 0xfe, 0xf9, 0x86, 0xff, 0xe7, 0x07, 0xfe, 0x96, 0x9c, 0x00, 0x14, 0xb5, 0x03, \n  0xb9, 0x28, 0x00, 0x06, 0x1a, 0x00, 0x41, 0xfa, 0xff, 0xa6, 0x28, 0xff, 0xf7, 0xc7, 0x00, 0xba, \n  0x72, 0x00, 0xd6, 0xa4, 0xff, 0x3b, 0xc5, 0x00, 0x5c, 0x9f, 0x01, 0x3e, 0x2b, 0x00, 0xea, 0x46, \n  0x00, 0xfc, 0x03, 0x02, 0xa0, 0x71, 0x01, 0x2a, 0x65, 0x01, 0x30, 0x86, 0x01, 0x02, 0x05, 0x00, \n  0xe8, 0xd5, 0xff, 0x97, 0x1d, 0x00, 0xd3, 0x91, 0x0f, 0x69, 0xff, 0x12, 0x93, 0xfc, 0x0b, 0x29, \n  0x99, 0x0b, 0x07, 0xf8, 0x03, 0x67, 0x44, 0xfd, 0x12, 0xca, 0xfe, 0x6b, 0x83, 0x02, 0x4e, 0x82, \n  0x02, 0xdc, 0x0b, 0xff, 0x87, 0x56, 0xff, 0xfb, 0x63, 0xfe, 0x68, 0xbd, 0x00, 0x7a, 0xbf, 0x03, \n  0x4f, 0xb0, 0x00, 0x16, 0x40, 0x00, 0xc9, 0x35, 0x00, 0xe2, 0x39, 0x00, 0x84, 0x17, 0x02, 0xa8, \n  0xa1, 0x01, 0xad, 0xc0, 0x00, 0x84, 0xf6, 0x00, 0x89, 0xd5, 0x00, 0x97, 0x12, 0x00, 0x7d, 0x0b, \n  0x00, 0x46, 0xc8, 0x00, 0x77, 0xe3, 0x00, 0x08, 0x32, 0x01, 0x67, 0x3b, 0x01, 0xcc, 0x0e, 0x00, \n  0x7e, 0xdb, 0xff, 0xcb, 0x37, 0x00, 0xd7, 0x35, 0x0e, 0xdb, 0xfd, 0x11, 0x46, 0xe6, 0x0b, 0x6e, \n  0x42, 0x0a, 0x33, 0x6c, 0x03, 0x31, 0x1e, 0xfe, 0x82, 0xb0, 0xff, 0xbc, 0xeb, 0x02, 0x85, 0x43, \n  0x02, 0x1b, 0x6f, 0xff, 0xaa, 0xd0, 0xff, 0x08, 0xb0, 0xfe, 0x54, 0xfa, 0x00, 0x2b, 0xbe, 0x03, \n  0x2f, 0xfa, 0x00, 0x35, 0xef, 0x00, 0xcb, 0x28, 0x02, 0x03, 0x2f, 0x02, 0x5c, 0x28, 0x02, 0xa9, \n  0x18, 0x01, 0xd5, 0xbe, 0x00, 0x55, 0x81, 0x00, 0x7b, 0x64, 0xff, 0xf4, 0x31, 0xff, 0xa7, 0x1e, \n  0x00, 0xb2, 0xba, 0x00, 0x40, 0x9c, 0x00, 0xa2, 0xc1, 0x00, 0xee, 0xbc, 0x00, 0xa7, 0x26, 0x00, \n  0x97, 0x49, 0x00, 0xf6, 0xdf, 0xff, 0xaa, 0xba, 0x0c, 0x11, 0xbb, 0x10, 0x81, 0x0a, 0x0c, 0x74, \n  0x20, 0x0a, 0x8e, 0xf3, 0x02, 0x31, 0x11, 0xfe, 0x82, 0x79, 0x00, 0x3a, 0xe0, 0x03, 0xb0, 0x49, \n  0x02, 0xfd, 0x68, 0xff, 0xbb, 0x95, 0x00, 0x8a, 0xfe, 0xfe, 0x3b, 0xc1, 0x00, 0x19, 0x2d, 0x05, \n  0x47, 0x4b, 0x03, 0xcc, 0xf0, 0x01, 0x59, 0x14, 0x02, 0xc1, 0x90, 0x01, 0xb2, 0xa7, 0x01, 0xd7, \n  0xad, 0x00, 0x77, 0x4b, 0xff, 0x51, 0xe5, 0xfe, 0x41, 0x9a, 0xff, 0x89, 0xf8, 0xff, 0xbb, 0x8a, \n  0xff, 0xcc, 0x10, 0x00, 0x70, 0x8d, 0x00, 0xef, 0xaa, 0x00, 0x56, 0xbf, 0x00, 0x98, 0x07, 0x00, \n  0xc0, 0xe3, 0xff, 0xa7, 0x81, 0xff, 0xcd, 0x29, 0x0c, 0xc6, 0x72, 0x10, 0x35, 0xde, 0x0b, 0x55, \n  0x11, 0x09, 0xdc, 0x29, 0x02, 0x25, 0xba, 0xfe, 0x76, 0x91, 0x01, 0x00, 0x84, 0x04, 0x9e, 0x72, \n  0x02, 0xd8, 0xdb, 0xfe, 0xb2, 0x3b, 0x01, 0x2a, 0xf4, 0x01, 0xee, 0xf9, 0x02, 0x4f, 0x00, 0x05, \n  0x3b, 0x40, 0x02, 0xa9, 0x71, 0x01, 0x7f, 0xc3, 0x01, 0xc1, 0x48, 0x00, 0xf0, 0xd9, 0xff, 0x39, \n  0xcb, 0xff, 0x73, 0x47, 0xff, 0x72, 0xeb, 0xfe, 0x0e, 0x8f, 0xff, 0xdf, 0x82, 0xff, 0x4f, 0x47, \n  0xff, 0x9f, 0xbc, 0x00, 0x49, 0x8f, 0x00, 0xfa, 0x7c, 0xff, 0x06, 0x2b, 0x00, 0x78, 0x51, 0x00, \n  0x66, 0x87, 0xff, 0xbd, 0xd8, 0xfe, 0xbe, 0x9f, 0x0c, 0x4e, 0x3c, 0x11, 0xcc, 0x19, 0x0b, 0x26, \n  0x69, 0x07, 0x51, 0xca, 0x01, 0x02, 0x0e, 0x00, 0x64, 0x7a, 0x02, 0xf4, 0x39, 0x04, 0x5b, 0x17, \n  0x04, 0xb3, 0xa8, 0x01, 0xe5, 0xc1, 0x02, 0xe6, 0x54, 0x02, 0x79, 0x98, 0x01, 0xe4, 0x98, 0x03, \n  0x7a, 0xe2, 0x01, 0x75, 0xea, 0xff, 0x0b, 0xea, 0xff, 0xaa, 0x08, 0x00, 0x5f, 0x03, 0x00, 0x02, \n  0x69, 0xff, 0xd0, 0xaf, 0xfe, 0x42, 0xd0, 0xfe, 0x5c, 0x61, 0x00, 0x8f, 0x1b, 0x00, 0x71, 0x1a, \n  0xff, 0x1e, 0xfc, 0xff, 0x1e, 0x9b, 0xff, 0x10, 0x59, 0xff, 0x63, 0x5a, 0x00, 0x75, 0x34, 0x00, \n  0x7a, 0x3b, 0xff, 0x31, 0x5d, 0xfe, 0xd7, 0x3c, 0x0d, 0x2c, 0xef, 0x12, 0x51, 0x2c, 0x0a, 0x27, \n  0x8f, 0x05, 0xe1, 0x68, 0x01, 0xba, 0x03, 0x01, 0x2b, 0xb6, 0x06, 0xfd, 0x6c, 0x07, 0x68, 0xe9, \n  0x03, 0xd1, 0xc4, 0x00, 0x42, 0xcd, 0x01, 0xf9, 0xe9, 0x01, 0xe1, 0x6d, 0x00, 0x43, 0x7d, 0x01, \n  0xa7, 0x97, 0x00, 0x9d, 0x07, 0x00, 0x02, 0x2c, 0x00, 0x80, 0x35, 0xff, 0x98, 0x7a, 0xff, 0x92, \n  0x70, 0xff, 0x26, 0x73, 0xff, 0x53, 0x2f, 0x00, 0xa4, 0x1f, 0x00, 0x86, 0x0e, 0xff, 0x92, 0xac, \n  0xfe, 0x3c, 0x9b, 0xff, 0x95, 0x96, 0xff, 0xfd, 0x6c, 0xff, 0xcb, 0x57, 0x00, 0x76, 0x0d, 0x00, \n  0x7e, 0xa9, 0xfe, 0x5d, 0x5b, 0xfe, 0xd7, 0x69, 0x0d, 0x4c, 0x9f, 0x13, 0x71, 0x55, 0x09, 0x40, \n  0x46, 0x04, 0xad, 0xc4, 0x04, 0x76, 0xed, 0x05, 0x35, 0x46, 0x07, 0x20, 0x7f, 0x05, 0x77, 0xed, \n  0x02, 0xdf, 0x57, 0x00, 0x07, 0x8a, 0x00, 0x52, 0x83, 0x00, 0x9a, 0xae, 0xff, 0x4d, 0x18, 0x01, \n  0xfb, 0x3c, 0x00, 0xb8, 0xaa, 0xff, 0x6c, 0x07, 0x00, 0xdf, 0xf2, 0xfe, 0x0c, 0xad, 0xff, 0x2d, \n  0xe0, 0x00, 0x38, 0x15, 0x00, 0x6a, 0xea, 0xfe, 0x07, 0x2c, 0xff, 0x51, 0x57, 0xff, 0x23, 0xd5, \n  0xfe, 0x14, 0xdd, 0xfe, 0x57, 0x48, 0xff, 0x70, 0x0b, 0x00, 0x2c, 0xf7, 0xff, 0xec, 0x67, 0xff, \n  0xc6, 0x2b, 0xff, 0x97, 0xed, 0xfe, 0x13, 0x25, 0x0c, 0x1e, 0xa8, 0x12, 0x6a, 0x9e, 0x0c, 0x35, \n  0x98, 0x08, 0x72, 0xa8, 0x04, 0x59, 0x52, 0x04, 0x53, 0x6e, 0x07, 0x62, 0x4f, 0x05, 0xef, 0xa3, \n  0x01, 0x37, 0x58, 0xff, 0xbf, 0x15, 0x00, 0x61, 0xb5, 0x00, 0xb5, 0xc8, 0xff, 0x8b, 0x51, 0x00, \n  0x52, 0xf0, 0xff, 0x38, 0xd9, 0xff, 0x10, 0x39, 0x00, 0x3c, 0x38, 0x00, 0xcc, 0xa6, 0x00, 0xc4, \n  0x03, 0x00, 0x89, 0x5a, 0xff, 0x48, 0x4f, 0xff, 0x63, 0x5c, 0xff, 0x93, 0xf6, 0xfe, 0xbb, 0x72, \n  0xfe, 0xf5, 0x09, 0xff, 0x31, 0x63, 0xff, 0xae, 0x9f, 0xff, 0x14, 0x21, 0x00, 0xc0, 0xfd, 0xff, \n  0x75, 0x9a, 0xff, 0x2b, 0x1c, 0xff, 0x19, 0x3a, 0x0f, 0xcc, 0x90, 0x17, 0x45, 0xe2, 0x0b, 0xc3, \n  0xd1, 0x03, 0x42, 0x0e, 0x04, 0x9d, 0x98, 0x05, 0x52, 0x12, 0x06, 0xae, 0xf9, 0x03, 0x0c, 0x36, \n  0x01, 0x6c, 0xf6, 0xfe, 0xdc, 0x24, 0x00, 0x32, 0x9c, 0x00, 0x3d, 0x03, 0x00, 0xaf, 0xa8, 0x00, \n  0x5a, 0x7b, 0xff, 0x5c, 0x09, 0x00, 0x81, 0xdb, 0x01, 0x54, 0x29, 0x01, 0xe1, 0x45, 0xff, 0xce, \n  0x1d, 0xff, 0x62, 0x45, 0x00, 0xfc, 0x8c, 0xff, 0x79, 0xba, 0xfe, 0xf7, 0x8d, 0xfe, 0x35, 0xa8, \n  0xfe, 0xdc, 0x35, 0xff, 0x3b, 0x29, 0xff, 0x9d, 0xec, 0xff, 0x38, 0xaa, 0x00, 0x8b, 0x4c, 0x00, \n  0xd4, 0x74, 0xff, 0xc7, 0x8a, 0xfe, 0xfb, 0x13, 0x10, 0xcb, 0x7e, 0x19, 0x68, 0x06, 0x0b, 0xa8, \n  0xf8, 0x00, 0x91, 0x83, 0x03, 0x66, 0x5d, 0x05, 0xc9, 0x3c, 0x05, 0xc8, 0x2d, 0x04, 0x54, 0x57, \n  0x02, 0xf4, 0x32, 0xff, 0xc3, 0x65, 0xff, 0x34, 0x61, 0x01, 0x53, 0x64, 0x00, 0xb7, 0x44, 0x00, \n  0x1e, 0x67, 0x00, 0xb1, 0xf3, 0x00, 0x6b, 0x04, 0x02, 0x2f, 0xa5, 0x00, 0x63, 0x8d, 0xff, 0x41, \n  0xc3, 0xff, 0x3a, 0xef, 0xff, 0xce, 0x71, 0xff, 0x29, 0xc7, 0xfe, 0x40, 0xed, 0xfe, 0x20, 0x9b, \n  0xfe, 0x19, 0xad, 0xfe, 0xf2, 0x7f, 0xff, 0x88, 0x2c, 0x00, 0x8c, 0xb5, 0x00, 0x13, 0x3e, 0x00, \n  0x19, 0x8a, 0xff, 0x9a, 0xd8, 0xfe, 0x24, 0x17, 0x0c, 0x8f, 0x87, 0x16, 0xfd, 0x77, 0x0f, 0xee, \n  0xf6, 0x03, 0xb6, 0xaf, 0x00, 0x5c, 0x97, 0x02, 0xc1, 0xa2, 0x04, 0x04, 0xbe, 0x05, 0x42, 0xa0, \n  0x03, 0x12, 0x50, 0xff, 0xd0, 0x93, 0xff, 0xa1, 0xda, 0x01, 0x4b, 0x70, 0x01, 0xbc, 0x05, 0x00, \n  0x92, 0x05, 0x00, 0xe6, 0xa8, 0x01, 0x5d, 0x35, 0x02, 0x4f, 0x57, 0x01, 0xe0, 0x20, 0x00, 0xd9, \n  0x8c, 0xff, 0x5a, 0x0f, 0x00, 0xe0, 0x05, 0x00, 0x34, 0x27, 0xff, 0x3f, 0x96, 0xfe, 0x31, 0xe7, \n  0xfe, 0x4f, 0x07, 0xff, 0x69, 0xfc, 0xfe, 0x0b, 0xd9, 0xff, 0x43, 0x8a, 0x00, 0x40, 0x6a, 0x00, \n  0x0b, 0xc0, 0xff, 0x7b, 0x17, 0xff, 0xf0, 0x13, 0x0a, 0x63, 0xa8, 0x13, 0xf4, 0x44, 0x10, 0xf4, \n  0xd8, 0x06, 0x31, 0x1c, 0x01, 0xfa, 0x4b, 0x01, 0x00, 0x33, 0x03, 0xba, 0xd1, 0x04, 0x38, 0x0d, \n  0x04, 0xcb, 0x13, 0x00, 0xe9, 0x76, 0xff, 0x50, 0xca, 0x01, 0x9b, 0x4c, 0x02, 0xeb, 0x9e, 0x00, \n  0x52, 0x17, 0x00, 0x61, 0x87, 0x01, 0x62, 0x92, 0x01, 0xa6, 0xa5, 0x01, 0x04, 0x5d, 0x01, 0xae, \n  0x26, 0x00, 0x96, 0x4c, 0x00, 0x6c, 0xf8, 0xff, 0xae, 0x33, 0xff, 0x7f, 0x50, 0xff, 0x01, 0x67, \n  0xff, 0xc9, 0xec, 0xfe, 0x26, 0xc6, 0xfe, 0xb5, 0xbc, 0xff, 0xd5, 0x76, 0x00, 0x68, 0x3b, 0x00, \n  0xc0, 0x73, 0xff, 0xda, 0x22, 0xff, 0xe6, 0xfa, 0x09, 0x53, 0x32, 0x13, 0xbb, 0x5a, 0x0f, 0x79, \n  0x10, 0x07, 0x9c, 0x2a, 0x02, 0x90, 0xfc, 0x00, 0xf6, 0x7c, 0x02, 0x70, 0xd5, 0x04, 0x0b, 0xfa, \n  0x03, 0x29, 0x73, 0xff, 0xdc, 0x99, 0xfe, 0xed, 0x8d, 0x01, 0xf7, 0xa4, 0x02, 0x41, 0xf6, 0x00, \n  0x40, 0x16, 0x00, 0x81, 0x77, 0x01, 0xe9, 0xd9, 0x01, 0x4a, 0x6b, 0x01, 0xbc, 0x18, 0x01, 0x17, \n  0xbe, 0x00, 0x32, 0xea, 0x00, 0x2e, 0x6c, 0x00, 0xf7, 0x9f, 0xff, 0x34, 0x8e, 0xff, 0xe8, 0x7f, \n  0xff, 0xfd, 0x5c, 0xff, 0x49, 0x91, 0xff, 0xfc, 0x92, 0xff, 0xa9, 0xdf, 0xff, 0xa1, 0x6f, 0x00, \n  0x90, 0xa7, 0xff, 0xc6, 0xcf, 0xfe, 0x10, 0x6a, 0x0a, 0x5c, 0x46, 0x13, 0xd6, 0xb0, 0x0e, 0x31, \n  0x20, 0x07, 0xce, 0xdd, 0x02, 0x88, 0xe6, 0x00, 0x76, 0xec, 0x01, 0xb7, 0xb4, 0x04, 0x30, 0x2b, \n  0x04, 0xad, 0x7d, 0xff, 0xbc, 0x3b, 0xfe, 0x51, 0xe2, 0x00, 0x15, 0xf9, 0x01, 0x4a, 0x84, 0x00, \n  0xa0, 0xe0, 0xff, 0x6e, 0x5c, 0x01, 0x09, 0x99, 0x01, 0x4f, 0x0e, 0x01, 0xe6, 0x8b, 0x01, 0x0e, \n  0x36, 0x01, 0xa5, 0x42, 0x00, 0x60, 0x5e, 0x00, 0x03, 0x6b, 0x00, 0xcb, 0xf4, 0xff, 0x27, 0xd4, \n  0xff, 0x83, 0xd6, 0xff, 0x91, 0xf2, 0xff, 0x9a, 0xe8, 0xff, 0x99, 0x1a, 0x00, 0xe2, 0x51, 0x00, \n  0x8c, 0xb9, 0xff, 0xff, 0xf5, 0xfe, 0xb9, 0x5a, 0x0b, 0xff, 0x3c, 0x14, 0x75, 0x39, 0x0e, 0x3a, \n  0xb6, 0x06, 0xe3, 0x1b, 0x03, 0xa4, 0xd6, 0x00, 0xf6, 0xe1, 0x01, 0x8b, 0xe6, 0x04, 0xa0, 0x23, \n  0x04, 0x92, 0x24, 0xff, 0xb5, 0x26, 0xfe, 0x4c, 0xe8, 0x00, 0xba, 0xeb, 0x01, 0xb8, 0x6e, 0x00, \n  0xde, 0xe9, 0xfe, 0xde, 0x51, 0x00, 0xfb, 0x4c, 0x01, 0xa6, 0x9f, 0x00, 0x84, 0x40, 0x01, 0xa0, \n  0x9b, 0x01, 0xa6, 0x9d, 0x00, 0xf5, 0x36, 0x00, 0xd5, 0xf7, 0xff, 0x42, 0xa8, 0xff, 0x27, 0x96, \n  0x00, 0x63, 0xa4, 0x00, 0x0a, 0xeb, 0xff, 0x25, 0x94, 0x00, 0x72, 0xd6, 0x00, 0xd9, 0x58, 0x00, \n  0xb6, 0xeb, 0xff, 0x44, 0x3b, 0xff, 0x6b, 0x20, 0x0c, 0x55, 0x99, 0x15, 0xb5, 0x59, 0x0e, 0xad, \n  0xf5, 0x05, 0x82, 0x5b, 0x03, 0x26, 0x1a, 0x01, 0x66, 0x6b, 0x01, 0xc0, 0xe6, 0x04, 0xea, 0x50, \n  0x04, 0x51, 0xf4, 0xfe, 0x62, 0x00, 0xfe, 0x13, 0xac, 0x00, 0x5a, 0xd3, 0x01, 0x5a, 0xc9, 0x00, \n  0x4e, 0xc7, 0xfe, 0xad, 0x7b, 0xff, 0xfe, 0xb1, 0x00, 0x98, 0xbd, 0xff, 0xe0, 0xf1, 0xff, 0x73, \n  0xaa, 0x01, 0x29, 0x56, 0x01, 0x81, 0xd1, 0xff, 0xdf, 0x9e, 0xff, 0x0f, 0x94, 0xff, 0xdc, 0x28, \n  0x00, 0x3b, 0xb5, 0x00, 0x07, 0x3c, 0x00, 0xaa, 0xde, 0x00, 0x67, 0x58, 0x01, 0x18, 0xb9, 0x00, \n  0xa4, 0x70, 0x00, 0x94, 0xc4, 0xff, 0xc0, 0x2a, 0x0d, 0x5c, 0x4f, 0x17, 0x27, 0x7d, 0x0e, 0xef, \n  0x40, 0x05, 0xef, 0xa5, 0x03, 0x3b, 0x1e, 0x01, 0x49, 0xe2, 0x00, 0x68, 0x05, 0x05, 0x39, 0x83, \n  0x04, 0x93, 0x80, 0xfe, 0x32, 0x9b, 0xfd, 0xb9, 0xda, 0x00, 0xde, 0xc4, 0x01, 0x80, 0x96, 0x00, \n  0xca, 0xfb, 0xfe, 0xe0, 0x22, 0xff, 0x71, 0x3b, 0x00, 0xe2, 0x8e, 0xff, 0x37, 0xc9, 0xfe, 0x28, \n  0xa8, 0x00, 0x70, 0x77, 0x01, 0x09, 0xab, 0xff, 0xb6, 0x42, 0xff, 0x9b, 0x60, 0xff, 0xcd, 0xa7, \n  0xff, 0x55, 0x96, 0x00, 0xd4, 0x4a, 0x00, 0x3b, 0x67, 0x00, 0xe1, 0x61, 0x01, 0x65, 0x50, 0x01, \n  0xca, 0x90, 0x00, 0x94, 0x0f, 0x00, 0xb5, 0xa1, 0x0e, 0x38, 0x73, 0x19, 0x69, 0x9e, 0x0e, 0xd2, \n  0x41, 0x04, 0x1d, 0xe0, 0x03, 0x24, 0x5e, 0x01, 0xa6, 0x5e, 0x00, 0x84, 0x13, 0x05, 0xc7, 0xbd, \n  0x04, 0xf5, 0x26, 0xfe, 0xc7, 0x42, 0xfd, 0x6e, 0xf3, 0x00, 0x72, 0xc2, 0x01, 0x6e, 0x5d, 0x00, \n  0x55, 0x42, 0xff, 0x45, 0x25, 0xff, 0x74, 0xb7, 0xff, 0x44, 0x7a, 0xff, 0x71, 0x70, 0xfe, 0x27, \n  0xc2, 0xff, 0xd4, 0x6f, 0x01, 0x45, 0xf0, 0xff, 0xf1, 0x5e, 0xfe, 0x40, 0xc7, 0xfe, 0xcb, 0xc3, \n  0xff, 0x4c, 0x58, 0x00, 0x23, 0x21, 0x00, 0x81, 0xfe, 0xff, 0x03, 0x22, 0x01, 0x01, 0x83, 0x01, \n  0x00, 0x52, 0x00, 0x9e, 0x2e, 0x00, 0x15, 0x5b, 0x10, 0x6c, 0xf1, 0x1b, 0x25, 0xca, 0x0e, 0xb1, \n  0x08, 0x03, 0xcd, 0xf9, 0x03, 0x18, 0x9b, 0x01, 0xb6, 0xd9, 0xff, 0xec, 0x57, 0x05, 0x7f, 0xd1, \n  0x04, 0x86, 0x63, 0xfd, 0xf1, 0x31, 0xfd, 0x49, 0x44, 0x01, 0x3e, 0xab, 0x01, 0xeb, 0xef, 0xff, \n  0x4f, 0x15, 0xff, 0x54, 0x86, 0xff, 0x0d, 0x98, 0xff, 0x2b, 0xf8, 0xfe, 0x8d, 0x50, 0xfe, 0x63, \n  0x35, 0xff, 0x50, 0xff, 0x00, 0xf4, 0x94, 0x00, 0x5d, 0x52, 0xfe, 0xf4, 0xd3, 0xfd, 0xd3, 0x79, \n  0xff, 0x9f, 0x27, 0x00, 0xbb, 0xe0, 0xff, 0x6b, 0xf0, 0xff, 0xcd, 0x93, 0x00, 0x82, 0xfe, 0x00, \n  0x92, 0x78, 0x00, 0x41, 0x1a, 0x00, 0x24, 0x8d, 0x12, 0xe0, 0xb0, 0x1e, 0x65, 0x9c, 0x0e, 0xc6, \n  0xcc, 0x01, 0xab, 0x1d, 0x04, 0x43, 0x7a, 0x01, 0x2e, 0x62, 0xff, 0x7c, 0xef, 0x05, 0x9b, 0xb2, \n  0x04, 0x33, 0x43, 0xfc, 0x0d, 0x30, 0xfd, 0x47, 0xdf, 0x01, 0x08, 0x9f, 0x01, 0x58, 0x51, 0xff, \n  0xc4, 0xc0, 0xfe, 0xd4, 0xbb, 0xff, 0xd2, 0x87, 0xff, 0x2e, 0x85, 0xfe, 0x13, 0x06, 0xfe, 0xa3, \n  0x01, 0xff, 0x80, 0x79, 0x00, 0x24, 0xa2, 0x00, 0x26, 0xe4, 0xfe, 0x94, 0x64, 0xfd, 0xde, 0x05, \n  0xff, 0x49, 0x41, 0x00, 0x03, 0x6e, 0xff, 0x09, 0x9d, 0xff, 0x49, 0x5b, 0x00, 0x55, 0x4e, 0x00, \n  0xe8, 0x12, 0x00, 0x32, 0xf7, 0xff, 0x80, 0xb6, 0x14, 0xe9, 0x8f, 0x21, 0x32, 0xa6, 0x0e, 0x75, \n  0x8b, 0x00, 0xb4, 0x01, 0x04, 0xb5, 0x0c, 0x01, 0x16, 0xdb, 0xfe, 0xfb, 0xb2, 0x06, 0xc8, 0x7c, \n  0x04, 0x5b, 0xc6, 0xfa, 0xe6, 0x11, 0xfd, 0x0a, 0xa3, 0x02, 0x1c, 0x99, 0x01, 0x01, 0x87, 0xfe, \n  0x34, 0x3a, 0xfe, 0x67, 0xe4, 0xff, 0x42, 0x79, 0xff, 0x3d, 0xec, 0xfd, 0x23, 0x79, 0xfd, 0x64, \n  0xbf, 0xfe, 0xc8, 0x28, 0x00, 0x23, 0x5b, 0x00, 0xb5, 0x2f, 0xff, 0x91, 0x8a, 0xfd, 0xb3, 0x6f, \n  0xfe, 0x8a, 0x32, 0x00, 0x60, 0x9e, 0xff, 0x74, 0x10, 0xff, 0xf5, 0x20, 0x00, 0x19, 0xbf, 0xff, \n  0x58, 0xfd, 0xfe, 0x7c, 0xe0, 0xff, 0x6c, 0xe6, 0x16, 0xfb, 0x87, 0x24, 0x8f, 0x05, 0x0f, 0x97, \n  0xbd, 0xff, 0x15, 0xf0, 0x03, 0x0f, 0x81, 0x00, 0xf6, 0x83, 0xfe, 0x61, 0xdc, 0x07, 0xd0, 0x82, \n  0x04, 0x39, 0x40, 0xf9, 0xa6, 0x28, 0xfd, 0x52, 0xbd, 0x03, 0x5f, 0xd6, 0x01, 0xb3, 0x03, 0xfe, \n  0x06, 0xc3, 0xfd, 0x00, 0x28, 0x00, 0xf9, 0xb7, 0xff, 0x43, 0x9b, 0xfd, 0x11, 0x21, 0xfd, 0xac, \n  0x75, 0xfe, 0xce, 0xe4, 0xff, 0x2c, 0x6b, 0x00, 0x6a, 0x7b, 0xff, 0xf8, 0x09, 0xfe, 0x61, 0x8c, \n  0xfe, 0xef, 0xb6, 0xff, 0xbd, 0x1d, 0x00, 0xe7, 0x8c, 0xff, 0x1b, 0x9e, 0xff, 0x52, 0xb9, 0xff, \n  0x98, 0x91, 0xfe, 0x13, 0x1d, 0xff, 0x0c, 0x7b, 0x18, 0x64, 0x3d, 0x27, 0xd7, 0x45, 0x10, 0x2d, \n  0x1c, 0xff, 0x55, 0x76, 0x03, 0xe9, 0xe4, 0xff, 0x30, 0xb2, 0xfd, 0x64, 0xd0, 0x08, 0x68, 0xe0, \n  0x04, 0x20, 0x8e, 0xf7, 0x5c, 0xb8, 0xfc, 0x65, 0xc9, 0x04, 0xf9, 0x3b, 0x02, 0xbf, 0x64, 0xfd, \n  0xd8, 0x1f, 0xfd, 0x0e, 0x25, 0x00, 0xe9, 0xd2, 0xff, 0xbf, 0x65, 0xfd, 0xed, 0xaf, 0xfc, 0x99, \n  0xde, 0xfd, 0x9e, 0x52, 0xff, 0xff, 0x72, 0x00, 0x90, 0x92, 0xff, 0x15, 0x11, 0xfe, 0x73, 0x26, \n  0xff, 0xd4, 0x75, 0xff, 0x99, 0xa4, 0xff, 0x0e, 0x4a, 0x00, 0xdf, 0x96, 0xff, 0xe3, 0xfa, 0xfe, \n  0x3a, 0xa8, 0xfe, 0x75, 0xba, 0xfe, 0x78, 0xd7, 0x19, 0x9d, 0xfa, 0x29, 0x86, 0xd2, 0x11, 0xea, \n  0xa9, 0xfe, 0xd3, 0xed, 0x02, 0xc8, 0x91, 0xff, 0xdd, 0x14, 0xfd, 0x21, 0x0d, 0x09, 0x99, 0x4a, \n  0x05, 0x1c, 0x8b, 0xf6, 0x48, 0x0d, 0xfc, 0x95, 0x91, 0x05, 0x12, 0xe6, 0x02, 0x97, 0x0c, 0xfd, \n  0x46, 0x6d, 0xfc, 0xb7, 0x1f, 0x00, 0xec, 0xf4, 0xff, 0x6b, 0x26, 0xfd, 0xfe, 0x92, 0xfc, 0xcc, \n  0x71, 0xfd, 0xf6, 0x51, 0xfe, 0x02, 0x72, 0x00, 0x66, 0x41, 0x00, 0x48, 0x9b, 0xfd, 0xb3, 0x66, \n  0xff, 0x3e, 0x5e, 0x00, 0x09, 0x0a, 0xff, 0xb9, 0x36, 0x00, 0xb0, 0x6d, 0x00, 0x94, 0xad, 0xfe, \n  0x9b, 0xfc, 0xfd, 0x9c, 0xe1, 0xfe, 0xba, 0xb7, 0x1a, 0x5a, 0x8a, 0x2c, 0x31, 0x04, 0x14, 0x11, \n  0x12, 0xfe, 0x25, 0x57, 0x02, 0x94, 0x01, 0x00, 0x60, 0x81, 0xfc, 0x89, 0x56, 0x08, 0x9b, 0x69, \n  0x05, 0xf1, 0x8c, 0xf6, 0x3d, 0x5e, 0xfb, 0x28, 0x98, 0x05, 0x92, 0xa1, 0x03, 0x52, 0x07, 0xfd, \n  0x43, 0xfb, 0xfb, 0xa7, 0xdd, 0xff, 0xa5, 0xf5, 0xff, 0x95, 0xe7, 0xfc, 0x58, 0x58, 0xfc, 0xd9, \n  0x87, 0xfd, 0x90, 0x63, 0xfd, 0x9e, 0x5b, 0xff, 0x11, 0x1f, 0x01, 0x4b, 0x35, 0xfe, 0x6c, 0xa4, \n  0xfe, 0xad, 0x18, 0x01, 0x78, 0x96, 0xff, 0x2d, 0x58, 0xff, 0x17, 0xf3, 0x00, 0x37, 0x6a, 0xff, \n  0x61, 0x2d, 0xfd, 0xcd, 0x55, 0xfe, 0xf3, 0x88, 0x1c, 0xa9, 0xdc, 0x2e, 0x24, 0x93, 0x14, 0x06, \n  0x00, 0xfe, 0x1d, 0xa7, 0x02, 0x22, 0xe1, 0xff, 0x7c, 0x06, 0xfc, 0xe5, 0x8f, 0x07, 0xda, 0xd4, \n  0x04, 0x10, 0xcc, 0xf6, 0x61, 0x19, 0xfb, 0xc7, 0x44, 0x05, 0x3b, 0xf5, 0x03, 0x16, 0x16, 0xfd, \n  0x63, 0xbe, 0xfb, 0xd8, 0x98, 0xff, 0xf1, 0xee, 0xff, 0xa1, 0x6d, 0xfc, 0x44, 0xf5, 0xfb, 0xba, \n  0xc7, 0xfd, 0x12, 0xe1, 0xfc, 0x57, 0x1a, 0xfe, 0x92, 0xde, 0x00, 0x55, 0x8e, 0xff, 0x50, 0x8b, \n  0xfe, 0x31, 0x7e, 0x00, 0x8c, 0xd3, 0x00, 0x7f, 0x15, 0xff, 0x8c, 0x3f, 0x00, 0xc6, 0x72, 0x00, \n  0x17, 0x53, 0xfd, 0xd9, 0x46, 0xfd, 0xc3, 0x30, 0x20, 0x61, 0xc5, 0x30, 0x8e, 0x78, 0x12, 0xb3, \n  0x97, 0xfe, 0x58, 0xa4, 0x04, 0x38, 0x6e, 0xff, 0x9e, 0xb6, 0xfa, 0xc3, 0x6c, 0x07, 0x74, 0x4d, \n  0x04, 0x59, 0x67, 0xf6, 0x1d, 0xc8, 0xfb, 0x2b, 0xa6, 0x04, 0x32, 0x20, 0x04, 0xa4, 0x74, 0xfd, \n  0x99, 0x28, 0xfb, 0xe4, 0xe1, 0xff, 0xc1, 0xb4, 0xff, 0x08, 0x34, 0xfc, 0x8b, 0xa9, 0xfb, 0xaf, \n  0x74, 0xfd, 0xbb, 0x27, 0xfd, 0x2c, 0x49, 0xfd, 0xef, 0xcf, 0xff, 0xc2, 0x6b, 0x00, 0x8a, 0xdc, \n  0xff, 0xbb, 0xcc, 0xff, 0x62, 0xe5, 0x00, 0x55, 0x3a, 0x00, 0x9e, 0x82, 0xff, 0x48, 0x5d, 0x00, \n  0x9e, 0x6a, 0xfe, 0x73, 0xda, 0xfc, 0xa5, 0x58, 0x24, 0xa0, 0xea, 0x31, 0x9d, 0x73, 0x0e, 0x14, \n  0x9f, 0x00, 0xae, 0xbc, 0x08, 0x43, 0x79, 0xfd, 0xa5, 0x23, 0xf8, 0x5e, 0x57, 0x08, 0x22, 0x77, \n  0x04, 0xe9, 0x1b, 0xf5, 0xac, 0x2f, 0xfc, 0x12, 0x54, 0x04, 0xe1, 0xfe, 0x03, 0xda, 0xe6, 0xfd, \n  0x3c, 0x72, 0xfa, 0xda, 0x0e, 0x00, 0x76, 0x68, 0xff, 0x2a, 0xf9, 0xfb, 0x3e, 0xb7, 0xfb, 0x89, \n  0xb1, 0xfc, 0xf3, 0x35, 0xfd, 0xc0, 0x1c, 0xfd, 0x15, 0xc1, 0xfe, 0x8f, 0xfb, 0xff, 0x82, 0x61, \n  0x01, 0x65, 0x7a, 0x00, 0x70, 0xed, 0xff, 0xc7, 0xfd, 0x00, 0x7d, 0xbe, 0xff, 0x03, 0xae, 0xff, \n  0xab, 0x17, 0xff, 0xaf, 0x4b, 0xfd, 0xc3, 0xae, 0x27, 0x4b, 0xde, 0x31, 0x10, 0x3e, 0x0a, 0x3e, \n  0x23, 0x05, 0x20, 0x0e, 0x0e, 0x9b, 0x06, 0xf9, 0x16, 0x15, 0xf5, 0xfc, 0x2f, 0x0b, 0xf1, 0x2e, \n  0x05, 0x69, 0x65, 0xf2, 0x03, 0xec, 0xfb, 0xd2, 0x4c, 0x05, 0x67, 0x98, 0x03, 0xe2, 0x99, 0xfd, \n  0x06, 0x2c, 0xfa, 0xc4, 0x47, 0x00, 0x5a, 0xf9, 0xfe, 0xec, 0x74, 0xfb, 0x5c, 0x05, 0xfc, 0xd5, \n  0x3d, 0xfc, 0x99, 0xdd, 0xfc, 0x7f, 0x06, 0xfd, 0x4d, 0x27, 0xfe, 0x21, 0x0b, 0xff, 0x57, 0xf5, \n  0x01, 0x11, 0xd3, 0x01, 0x63, 0x8c, 0xff, 0xb1, 0x09, 0x01, 0x93, 0x3b, 0x00, 0x63, 0x43, 0xff, \n  0x5c, 0x11, 0xff, 0x5b, 0xe7, 0xfd, 0x4a, 0x42, 0x2a, 0x81, 0x88, 0x30, 0x36, 0x05, 0x07, 0x0a, \n  0xcc, 0x0b, 0x49, 0xce, 0x12, 0x75, 0x0f, 0xf3, 0x60, 0x1f, 0xf3, 0x75, 0x9c, 0x0f, 0xb4, 0x5f, \n  0x05, 0x6a, 0xac, 0xee, 0xca, 0xe4, 0xfb, 0xa4, 0x6a, 0x07, 0x94, 0xe4, 0x02, 0x85, 0x69, 0xfc, \n  0x52, 0xad, 0xfa, 0x81, 0xd6, 0x00, 0xb8, 0x38, 0xfe, 0x5e, 0xdf, 0xfa, 0xfa, 0x81, 0xfc, 0x09, \n  0x61, 0xfc, 0x10, 0x4f, 0xfc, 0x21, 0xcb, 0xfc, 0x4a, 0x3c, 0xfe, 0xe9, 0x4d, 0xfe, 0x5e, 0x9f, \n  0x01, 0x6b, 0xa2, 0x02, 0x9e, 0x2b, 0x00, 0xfa, 0x6d, 0x01, 0x25, 0x82, 0x00, 0xfc, 0x27, 0xff, \n  0xc1, 0xbd, 0xfe, 0x76, 0x7c, 0xfe, 0x18, 0xba, 0x30, 0x5a, 0x6f, 0x32, 0x5f, 0xf4, 0xff, 0xde, \n  0x49, 0x0a, 0xc5, 0x1c, 0x17, 0x97, 0xb9, 0xf4, 0x68, 0xa5, 0xf1, 0x35, 0x41, 0x0e, 0x16, 0xb3, \n  0x04, 0x86, 0xf6, 0xed, 0xdb, 0xc0, 0xfc, 0xfa, 0x10, 0x08, 0xdb, 0x8d, 0x01, 0xe6, 0x17, 0xfb, \n  0x3a, 0x52, 0xfb, 0xcc, 0x47, 0x01, 0x84, 0xde, 0xfc, 0x47, 0x77, 0xfa, 0x34, 0x75, 0xfc, 0xea, \n  0x68, 0xfc, 0x6c, 0x75, 0xfc, 0x08, 0x32, 0xfc, 0x35, 0x92, 0xfe, 0xab, 0xf6, 0xfd, 0x0e, 0xa0, \n  0x00, 0x75, 0x57, 0x03, 0x0f, 0xf4, 0x00, 0x90, 0x2b, 0x01, 0x48, 0x7d, 0x00, 0xb7, 0xa4, 0xff, \n  0x35, 0x86, 0xfe, 0x89, 0x50, 0xfe, 0x26, 0x1e, 0x37, 0x91, 0xdd, 0x34, 0xe9, 0x81, 0xf9, 0xf4, \n  0x44, 0x07, 0x8c, 0x0b, 0x1a, 0x1e, 0x67, 0xf8, 0x3c, 0xee, 0xf0, 0x48, 0x96, 0x0b, 0x31, 0x6b, \n  0x04, 0xd8, 0xdb, 0xed, 0x81, 0x6c, 0xfd, 0x3d, 0x7f, 0x08, 0x63, 0x9a, 0x00, 0x9f, 0xe0, 0xf9, \n  0x36, 0x83, 0xfb, 0xe2, 0xf5, 0x01, 0xc1, 0x63, 0xfb, 0xb4, 0x31, 0xfa, 0x75, 0x85, 0xfc, 0x7b, \n  0x22, 0xfc, 0xda, 0x5b, 0xfd, 0x0f, 0x7c, 0xfb, 0xff, 0xc2, 0xfe, 0x72, 0x8f, 0xfe, 0x44, 0x3a, \n  0xff, 0x9a, 0x41, 0x03, 0x64, 0x13, 0x02, 0xe3, 0x5a, 0x01, 0xbd, 0x21, 0x00, 0x10, 0xfb, 0xff, \n  0x8d, 0xea, 0xfe, 0x01, 0x4d, 0xfe, 0xec, 0x9d, 0x3c, 0x66, 0x70, 0x38, 0xd3, 0x14, 0xf4, 0xab, \n  0xd5, 0x02, 0x54, 0x63, 0x1b, 0x54, 0x34, 0xfd, 0x19, 0x7d, 0xf1, 0x11, 0xcf, 0x07, 0xc7, 0x51, \n  0x04, 0xf6, 0x5b, 0xee, 0xd5, 0xbc, 0xfd, 0x8f, 0x9d, 0x08, 0x20, 0xca, 0xff, 0xb2, 0x68, 0xf9, \n  0x51, 0xdb, 0xfa, 0x96, 0x5d, 0x02, 0x5b, 0x83, 0xfa, 0x9a, 0x80, 0xf9, 0x37, 0xc9, 0xfc, 0xe3, \n  0xb1, 0xfb, 0xe1, 0x7f, 0xfe, 0xbd, 0x3d, 0xfb, 0x9f, 0x4b, 0xfe, 0x77, 0xa3, 0xff, 0xc9, 0x63, \n  0xfe, 0x38, 0x3e, 0x02, 0xf9, 0xb0, 0x02, 0xfe, 0x45, 0x02, 0x70, 0xb2, 0xff, 0x9c, 0xce, 0xff, \n  0x1b, 0xf6, 0xff, 0xde, 0x19, 0xfe, 0x98, 0xf6, 0x42, 0xd5, 0xf5, 0x3a, 0x27, 0x09, 0xef, 0x06, \n  0x3c, 0xff, 0xa8, 0x86, 0x1a, 0x02, 0x25, 0x01, 0xd0, 0x98, 0xf3, 0x52, 0x70, 0x04, 0x13, 0x28, \n  0x03, 0x3d, 0x42, 0xef, 0x57, 0xbd, 0xfe, 0x73, 0xcc, 0x07, 0xbe, 0xe5, 0xfe, 0xfd, 0xba, 0xf9, \n  0x14, 0xb5, 0xf9, 0x10, 0x03, 0x02, 0x46, 0x44, 0xfa, 0x91, 0xa4, 0xf8, 0x7d, 0xee, 0xfc, 0x67, \n  0xbf, 0xfb, 0xef, 0x0c, 0xff, 0xdb, 0xb2, 0xfb, 0x53, 0xae, 0xfd, 0x5d, 0x2c, 0x00, 0x26, 0xd4, \n  0xfe, 0x4d, 0xb0, 0x00, 0xf5, 0x93, 0x02, 0x72, 0x83, 0x03, 0x4d, 0x34, 0xff, 0xa8, 0xac, 0xff, \n  0x89, 0xf8, 0x00, 0x8d, 0xd1, 0xfd, 0x8c, 0x56, 0x48, 0x96, 0x56, 0x3e, 0x5b, 0xa7, 0xea, 0x8c, \n  0xd5, 0xfb, 0x5f, 0xd8, 0x18, 0x3c, 0x6a, 0x03, 0x53, 0xf6, 0xf6, 0x41, 0xad, 0x01, 0xf3, 0xa1, \n  0x01, 0xfb, 0x9e, 0xf0, 0x03, 0x8e, 0xff, 0x7b, 0xaf, 0x06, 0xa3, 0xe9, 0xfd, 0x08, 0xcd, 0xfa, \n  0xd8, 0x26, 0xf8, 0x3c, 0xf8, 0x00, 0x5a, 0xad, 0xfa, 0x7a, 0xa7, 0xf7, 0x12, 0x42, 0xfd, 0x7e, \n  0x19, 0xfc, 0xa9, 0x17, 0xff, 0xc1, 0x61, 0xfc, 0xb3, 0x6c, 0xfd, 0x90, 0x20, 0x00, 0xd0, 0xbc, \n  0xff, 0x54, 0xd7, 0xff, 0xd6, 0x71, 0x01, 0xfa, 0xb5, 0x04, 0x8b, 0x4e, 0xff, 0x85, 0xf8, 0xfe, \n  0xd6, 0xbb, 0x01, 0x44, 0xef, 0xfd, 0xd6, 0xfa, 0x4c, 0x93, 0x23, 0x42, 0xd7, 0x01, 0xe7, 0xef, \n  0x24, 0xf9, 0xdf, 0xbf, 0x16, 0xf5, 0x7a, 0x03, 0xd5, 0xe4, 0xfa, 0xbe, 0x01, 0x00, 0xfd, 0x06, \n  0x00, 0xed, 0x40, 0xf2, 0x0b, 0xc5, 0xff, 0xcb, 0xc6, 0x05, 0x66, 0x10, 0xfd, 0x78, 0xb9, 0xfb, \n  0x06, 0xf3, 0xf6, 0x28, 0x9f, 0xff, 0xfb, 0x2b, 0xfb, 0xc2, 0x31, 0xf7, 0x8b, 0xc2, 0xfd, 0x81, \n  0x45, 0xfc, 0xb9, 0x04, 0xff, 0x46, 0x28, 0xfd, 0x41, 0x75, 0xfd, 0x65, 0xd1, 0xff, 0x7e, 0xa7, \n  0x00, 0x0b, 0x0d, 0x00, 0xb3, 0xd7, 0xff, 0xc8, 0x8b, 0x05, 0x13, 0x02, 0x00, 0x05, 0x75, 0xfd, \n  0xae, 0x14, 0x02, 0x77, 0x99, 0xfe, 0x79, 0x97, 0x52, 0x37, 0xdb, 0x43, 0x38, 0xde, 0xe3, 0xf8, \n  0x88, 0xf8, 0xfa, 0xbe, 0x13, 0xae, 0x05, 0x02, 0xd9, 0x13, 0xfe, 0x4b, 0xc5, 0xff, 0x39, 0xd6, \n  0xfe, 0xfb, 0x44, 0xf3, 0x7f, 0x02, 0x00, 0x3b, 0xe2, 0x04, 0x71, 0x63, 0xfc, 0xe9, 0x20, 0xfc, \n  0x8a, 0x5d, 0xf6, 0x6a, 0x63, 0xfe, 0x6d, 0x4a, 0xfb, 0xe0, 0xc8, 0xf7, 0x31, 0xfe, 0xfd, 0x50, \n  0xe6, 0xfb, 0x66, 0x5d, 0xff, 0xb2, 0xc5, 0xfd, 0xfe, 0x8a, 0xfd, 0x5c, 0xd7, 0xff, 0x26, 0x02, \n  0x01, 0x22, 0x17, 0x01, 0xec, 0x09, 0xff, 0x7e, 0x10, 0x05, 0xf9, 0xbb, 0x00, 0xe7, 0x03, 0xfc, \n  0xf9, 0x73, 0x01, 0x66, 0x2f, 0xff, 0x3f, 0x98, 0x56, 0xc3, 0x00, 0x46, 0x0a, 0x9a, 0xe2, 0xad, \n  0xe6, 0xf7, 0xe9, 0x5c, 0x10, 0xff, 0x75, 0xff, 0x4c, 0x2b, 0x00, 0x0d, 0x7e, 0x00, 0x0d, 0x3c, \n  0xfe, 0x03, 0x77, 0xf3, 0xd9, 0x12, 0x00, 0x2d, 0x06, 0x04, 0xc9, 0x3f, 0xfb, 0x55, 0x04, 0xfd, \n  0x80, 0x20, 0xf6, 0x61, 0xe3, 0xfc, 0x70, 0x02, 0xfc, 0xc1, 0x88, 0xf8, 0x05, 0x99, 0xfd, 0x77, \n  0x5e, 0xfb, 0x9a, 0xdd, 0xff, 0x98, 0x55, 0xfe, 0x1d, 0x8d, 0xfd, 0xae, 0xf3, 0xff, 0x05, 0x3b, \n  0x01, 0xb2, 0xa7, 0x02, 0xf0, 0x7d, 0xfe, 0x05, 0x37, 0x03, 0xc4, 0x82, 0x01, 0xa6, 0x30, 0xfb, \n  0x5a, 0x6e, 0xff, 0x45, 0xa9, 0xff, 0x8b, 0x53, 0x59, 0xe2, 0xfb, 0x47, 0x38, 0x13, 0xe3, 0xdc, \n  0x15, 0xf8, 0x63, 0x69, 0x0c, 0xda, 0x03, 0xfc, 0x13, 0xe3, 0x01, 0x6b, 0xa8, 0x01, 0x89, 0xb8, \n  0xfd, 0x74, 0x97, 0xf3, 0x5d, 0x38, 0x00, 0x89, 0x97, 0x02, 0xf2, 0x3a, 0xfa, 0x10, 0xe5, 0xfe, \n  0x32, 0x23, 0xf6, 0x25, 0x86, 0xfb, 0x4e, 0xfa, 0xfc, 0x37, 0x1c, 0xf9, 0x3e, 0x02, 0xfd, 0xb2, \n  0xb0, 0xfa, 0x37, 0xae, 0x00, 0xf8, 0xed, 0xfe, 0x75, 0x11, 0xfd, 0xb9, 0xf8, 0x00, 0x35, 0xa5, \n  0x01, 0xa2, 0x0b, 0x03, 0xc9, 0x56, 0xfe, 0x98, 0x5d, 0x01, 0x3b, 0x88, 0x01, 0x5a, 0xfb, 0xfa, \n  0xf5, 0x02, 0xfe, 0x8b, 0x83, 0xff, 0xc9, 0x25, 0x5b, 0x5e, 0x10, 0x49, 0x1c, 0x08, 0xe5, 0x61, \n  0xa5, 0xf9, 0x4d, 0x4d, 0x07, 0x11, 0x0d, 0xf8, 0x5d, 0x6f, 0x03, 0x14, 0x43, 0x02, 0x05, 0x4b, \n  0xfd, 0xaf, 0xb4, 0xf3, 0x51, 0x35, 0x00, 0xee, 0xb4, 0x00, 0x03, 0xa9, 0xf9, 0x7c, 0xc6, 0x01, \n  0x6e, 0x22, 0xf6, 0xb2, 0x1e, 0xfa, 0x65, 0xff, 0xfd, 0xa1, 0x38, 0xf9, 0x10, 0x2c, 0xfc, 0x85, \n  0xb8, 0xfa, 0x04, 0x1b, 0x01, 0xaa, 0xec, 0xfe, 0x62, 0xd6, 0xfd, 0xac, 0xc5, 0x01, 0x81, 0x97, \n  0x00, 0x81, 0x3c, 0x03, 0x1f, 0xa9, 0xfe, 0xb0, 0x51, 0xff, 0x56, 0x00, 0x01, 0xb7, 0x18, 0xfc, \n  0xd9, 0x7d, 0xfd, 0xc0, 0xf1, 0xfd, 0xc8, 0xd6, 0x5b, 0x4f, 0x96, 0x49, 0xe1, 0x43, 0xe8, 0x99, \n  0xbc, 0xfb, 0x88, 0x99, 0x01, 0xe9, 0xc9, 0xf3, 0xc6, 0x6c, 0x04, 0xc7, 0x65, 0x02, 0x39, 0xa6, \n  0xfc, 0x48, 0x86, 0xf3, 0x03, 0x24, 0x00, 0xda, 0xff, 0xfe, 0x6a, 0xd5, 0xf9, 0x15, 0x00, 0x05, \n  0x04, 0xcd, 0xf5, 0x36, 0x08, 0xf9, 0x4f, 0x64, 0xfe, 0x9b, 0xb1, 0xf8, 0x04, 0x74, 0xfc, 0x9e, \n  0x44, 0xfa, 0xc9, 0x2d, 0x01, 0x3e, 0x1a, 0x00, 0x1d, 0x4f, 0xfd, 0xac, 0x58, 0x01, 0xb2, 0x0c, \n  0x00, 0x43, 0xef, 0x02, 0x42, 0x71, 0xfe, 0x4a, 0x48, 0xfe, 0x18, 0x73, 0x01, 0x8f, 0x29, 0xfc, \n  0x7d, 0xa3, 0xfd, 0xd3, 0x86, 0xfe, 0x95, 0x5b, 0x5a, 0x4a, 0x79, 0x4a, 0x2e, 0x50, 0xed, 0xfb, \n  0x17, 0xfe, 0x8b, 0xe8, 0xfc, 0x4e, 0x5f, 0xef, 0xb3, 0x7b, 0x04, 0x00, 0x8f, 0x02, 0xec, 0xee, \n  0xfb, 0xf0, 0x55, 0xf3, 0xc5, 0xb2, 0x00, 0xa3, 0x92, 0xfe, 0xef, 0xe7, 0xf9, 0xb5, 0x43, 0x08, \n  0xd6, 0x53, 0xf6, 0x77, 0x18, 0xf7, 0x45, 0xfb, 0xfe, 0x9f, 0xc5, 0xf8, 0x72, 0x72, 0xfc, 0x1a, \n  0x3c, 0xfb, 0x89, 0x09, 0x01, 0xd2, 0x30, 0xff, 0xcd, 0x11, 0xfd, 0xf8, 0x8b, 0x01, 0x44, 0xae, \n  0xfe, 0x4f, 0x81, 0x02, 0x80, 0xd8, 0xff, 0x24, 0xdc, 0xfd, 0xb4, 0x05, 0x01, 0xb3, 0xad, 0xfd, \n  0x11, 0xcb, 0xfe, 0xe5, 0x01, 0xfe, 0xbe, 0x0f, 0x5a, 0x40, 0x5b, 0x48, 0x1a, 0x9b, 0xf2, 0xd1, \n  0x0b, 0x01, 0x13, 0xe6, 0xf7, 0x02, 0xa0, 0xeb, 0xdb, 0x89, 0x02, 0xd3, 0x0b, 0x03, 0x1d, 0xca, \n  0xfa, 0xd6, 0x64, 0xf3, 0x41, 0xc2, 0x02, 0xf0, 0x18, 0xfd, 0x01, 0x17, 0xfb, 0x76, 0xd6, 0x0a, \n  0xe2, 0x0f, 0xf6, 0xe9, 0xe3, 0xf5, 0x5b, 0x50, 0xfe, 0xe7, 0x6e, 0xfa, 0x87, 0xac, 0xfd, 0xf2, \n  0xb4, 0xf9, 0x84, 0xb9, 0xff, 0x8e, 0x40, 0xff, 0x4e, 0x85, 0xfc, 0x29, 0x97, 0x00, 0xd4, 0xa7, \n  0xfe, 0x82, 0xf3, 0x02, 0xfe, 0xd9, 0xff, 0xbb, 0x5b, 0xfe, 0x6c, 0x33, 0x02, 0x9f, 0xf3, 0xfd, \n  0x9e, 0x04, 0xfe, 0x99, 0x8f, 0xfe, 0xe8, 0x93, 0x56, 0x4c, 0x08, 0x48, 0xe2, 0xf0, 0xf8, 0xa0, \n  0x31, 0x03, 0xb2, 0x8e, 0xf5, 0xcb, 0xc5, 0xe7, 0xbd, 0x97, 0xfe, 0x70, 0x7b, 0x03, 0x7a, 0xc4, \n  0xfb, 0xe0, 0xe9, 0xf3, 0xf0, 0xb1, 0x03, 0xd0, 0x1e, 0xfd, 0xf7, 0xf2, 0xfb, 0xe6, 0xfc, 0x0c, \n  0x88, 0xb5, 0xf5, 0xd9, 0x36, 0xf4, 0xb9, 0x22, 0x01, 0xe8, 0x2c, 0xfb, 0x00, 0x57, 0xfb, 0x5c, \n  0xd9, 0xf9, 0x3a, 0xa1, 0xfe, 0x9e, 0x26, 0xfe, 0xda, 0xd3, 0xfc, 0x53, 0x08, 0x01, 0x74, 0x61, \n  0xfe, 0x15, 0x9c, 0x02, 0x9e, 0xe5, 0x01, 0x6c, 0x87, 0xff, 0xe0, 0x75, 0x00, 0x7a, 0xf2, 0xfd, \n  0xc0, 0xab, 0x00, 0x8c, 0xcf, 0xfd, 0xb9, 0x69, 0x53, 0x88, 0x58, 0x46, 0x90, 0x9e, 0xfe, 0x88, \n  0x05, 0x05, 0x9b, 0x0c, 0xf4, 0x7e, 0x9c, 0xe4, 0xe5, 0x84, 0xf8, 0xa2, 0x06, 0x05, 0xbe, 0xe3, \n  0xfe, 0x60, 0x60, 0xf3, 0x2b, 0xa3, 0x03, 0x76, 0x8c, 0xfe, 0x29, 0x26, 0xfd, 0xca, 0x37, 0x0b, \n  0x66, 0xdc, 0xf7, 0x9f, 0x47, 0xf6, 0xa0, 0xbc, 0xfe, 0x9b, 0x2c, 0xfb, 0x78, 0x2b, 0xfb, 0xf9, \n  0x57, 0xf8, 0xbc, 0xae, 0xfd, 0x14, 0xbb, 0xfe, 0x8e, 0x8c, 0xfd, 0xf1, 0xc6, 0xff, 0x34, 0xa3, \n  0xff, 0xb8, 0x96, 0x04, 0x5a, 0x42, 0x00, 0xc5, 0x1c, 0xff, 0xfa, 0x04, 0x02, 0x23, 0xd5, 0xfd, \n  0xd0, 0xc8, 0x00, 0xb2, 0xa8, 0xfd, 0x45, 0x71, 0x50, 0xb2, 0xc9, 0x44, 0x9a, 0x3c, 0x01, 0x44, \n  0x39, 0x08, 0x45, 0x2d, 0xf4, 0x31, 0x4a, 0xdf, 0x98, 0xd5, 0xf4, 0x59, 0x43, 0x08, 0x86, 0xff, \n  0xff, 0xee, 0x6b, 0xf3, 0x8e, 0xd8, 0x05, 0x67, 0xd0, 0xfc, 0x1e, 0x2b, 0xfd, 0x23, 0xe5, 0x0e, \n  0xa3, 0x6a, 0xf7, 0x2f, 0x3e, 0xf5, 0x29, 0x7c, 0xff, 0xbb, 0x2e, 0xf9, 0x24, 0x3c, 0xfa, 0x77, \n  0xf3, 0xf9, 0x2b, 0x20, 0xfd, 0x23, 0xeb, 0xfd, 0x4e, 0x88, 0xfe, 0x59, 0xcb, 0x01, 0x7d, 0xdf, \n  0xff, 0x65, 0x4d, 0x02, 0xf6, 0x90, 0x00, 0x80, 0x3f, 0x01, 0xed, 0x9e, 0x01, 0x61, 0xf3, 0xfb, \n  0x5a, 0xe8, 0x01, 0x6c, 0xf9, 0xff, 0x38, 0x0f, 0x50, 0xc6, 0x53, 0x3f, 0x08, 0xbe, 0x02, 0x67, \n  0xc4, 0x0c, 0xa9, 0xf6, 0xf0, 0x69, 0x0e, 0xdd, 0xff, 0x8d, 0xf4, 0x42, 0x3b, 0x08, 0x6f, 0x55, \n  0x02, 0x63, 0x78, 0xf5, 0xad, 0xce, 0x03, 0x10, 0xa6, 0xfc, 0x78, 0xa5, 0x00, 0x02, 0x81, 0x0d, \n  0x7a, 0xfc, 0xf6, 0xd1, 0x89, 0xf6, 0x19, 0x85, 0xfc, 0x06, 0x73, 0xf8, 0x21, 0x2b, 0xfd, 0x6d, \n  0xcd, 0xf9, 0x1c, 0xb4, 0xfa, 0xfb, 0xd2, 0x00, 0xc4, 0x37, 0x01, 0x4d, 0xd8, 0xfe, 0x7a, 0x33, \n  0xff, 0xc9, 0x11, 0x04, 0xd9, 0x72, 0x00, 0xdc, 0xf3, 0xff, 0x04, 0xba, 0x01, 0xac, 0xea, 0xfc, \n  0xb6, 0xa8, 0x01, 0x04, 0xca, 0x00, 0x6c, 0xbf, 0x4c, 0x98, 0xf6, 0x3a, 0x46, 0x65, 0x05, 0x81, \n  0x85, 0x0e, 0xc3, 0xd8, 0xef, 0xb8, 0x64, 0xdd, 0x60, 0xcc, 0xf3, 0x8e, 0x54, 0x08, 0x21, 0xb1, \n  0x02, 0x8d, 0x1a, 0xf9, 0xef, 0xd5, 0x03, 0xa0, 0xb5, 0xf7, 0xe2, 0x2f, 0x04, 0x46, 0xd2, 0x0e, \n  0xcd, 0xa9, 0xf3, 0x04, 0xd1, 0xf6, 0x9d, 0x5e, 0xfc, 0x98, 0x7f, 0xf9, 0xc4, 0x6e, 0xfd, 0xe2, \n  0xa3, 0xf9, 0x5e, 0x34, 0xfd, 0xb7, 0x21, 0x01, 0x85, 0x20, 0xff, 0x2f, 0x3e, 0xff, 0x1a, 0xd3, \n  0x00, 0x97, 0x91, 0x02, 0x6c, 0x2e, 0xff, 0x72, 0xce, 0x00, 0x0f, 0x0f, 0x02, 0x75, 0x63, 0xfd, \n  0xb3, 0x52, 0x01, 0xa7, 0x5c, 0x00, 0xe0, 0x68, 0x47, 0xa9, 0xe4, 0x38, 0x34, 0x4c, 0x07, 0x3e, \n  0xdc, 0x0c, 0x5e, 0x56, 0xf0, 0xf7, 0xf6, 0xe2, 0x36, 0x7d, 0xf3, 0x88, 0xda, 0x02, 0xa7, 0xfa, \n  0x07, 0x8f, 0x9f, 0xfd, 0xb2, 0x80, 0xfc, 0xbf, 0x2a, 0xf8, 0xf9, 0x3b, 0x08, 0xe5, 0xbb, 0x0a, \n  0x16, 0xe6, 0xf2, 0x8c, 0x06, 0xfa, 0x4b, 0xa0, 0xfb, 0x70, 0x50, 0xf8, 0xa5, 0xe7, 0x00, 0x34, \n  0x83, 0xfb, 0x2c, 0xc8, 0xfa, 0xfa, 0x07, 0x01, 0x13, 0xa6, 0x00, 0x80, 0x17, 0xff, 0x33, 0x7f, \n  0xff, 0x7b, 0xea, 0x01, 0x08, 0x01, 0x00, 0x32, 0xd2, 0x00, 0xa0, 0xda, 0x01, 0x68, 0x07, 0xfe, \n  0xde, 0x54, 0x01, 0xbc, 0x41, 0x00, 0x18, 0x83, 0x48, 0x73, 0x22, 0x36, 0xc1, 0x1c, 0xff, 0xaa, \n  0x21, 0x0c, 0x7b, 0x26, 0xf3, 0x26, 0x6e, 0xe4, 0xa1, 0x92, 0xf9, 0xbd, 0xf8, 0x02, 0x62, 0x3f, \n  0x03, 0xbe, 0x17, 0xff, 0x8a, 0x89, 0xfd, 0xc8, 0x16, 0xf7, 0xb1, 0x22, 0x08, 0xdb, 0x13, 0x09, \n  0xba, 0xad, 0xf2, 0xc0, 0x75, 0xfb, 0x46, 0x34, 0xfc, 0xcd, 0x7f, 0xfa, 0x8f, 0xed, 0x01, 0x4a, \n  0xad, 0xf9, 0x22, 0x24, 0xfb, 0x83, 0x6a, 0x03, 0xa4, 0xde, 0xff, 0x77, 0xd1, 0xfc, 0x6f, 0x0e, \n  0x00, 0xb6, 0x6e, 0x02, 0x87, 0x03, 0x00, 0x47, 0xea, 0x00, 0xfa, 0xeb, 0x00, 0x5e, 0x98, 0xfe, \n  0x9d, 0x88, 0x02, 0x29, 0xca, 0xff, 0x56, 0x1b, 0x45, 0x41, 0x95, 0x2f, 0x36, 0xc5, 0xfe, 0x82, \n  0xb6, 0x0f, 0xf8, 0xcd, 0xf1, 0xa5, 0x49, 0xe9, 0x1b, 0x59, 0xfe, 0xd6, 0x9c, 0xfd, 0x89, 0x43, \n  0x04, 0xa6, 0x4c, 0x01, 0x90, 0x39, 0xf9, 0x4e, 0x2a, 0xf7, 0xfa, 0x34, 0x0a, 0x46, 0xd4, 0x07, \n  0x53, 0xb8, 0xf1, 0x0e, 0xfa, 0xfd, 0x74, 0x63, 0xfe, 0xae, 0x69, 0xfa, 0xaa, 0xb4, 0x01, 0x2f, \n  0x96, 0xf9, 0x2b, 0x57, 0xfc, 0xcd, 0xa6, 0x03, 0x4b, 0x59, 0xfe, 0x27, 0xa4, 0xfc, 0x44, 0xd8, \n  0x00, 0x61, 0x6e, 0x02, 0x53, 0x36, 0xff, 0x3d, 0xfd, 0x00, 0x6f, 0xf0, 0x01, 0xbe, 0xcb, 0xfe, \n  0x3c, 0x01, 0x02, 0x78, 0x9d, 0xff, 0x37, 0xb6, 0x3f, 0xde, 0x14, 0x2a, 0x78, 0x0f, 0xff, 0x3d, \n  0xa5, 0x11, 0x41, 0x19, 0xf6, 0x0d, 0x3f, 0xeb, 0x61, 0x89, 0xfd, 0xca, 0xb4, 0xff, 0x27, 0x67, \n  0x03, 0x27, 0x3b, 0xfe, 0x6e, 0x7a, 0xf9, 0xf6, 0x3c, 0xf9, 0x1b, 0x65, 0x09, 0x87, 0x88, 0x05, \n  0xa7, 0x5c, 0xf4, 0x6e, 0x6e, 0x00, 0xdd, 0xe8, 0xfd, 0x96, 0x93, 0xfa, 0xb2, 0xa0, 0x01, 0x98, \n  0x8d, 0xfa, 0x52, 0xe7, 0xfc, 0x65, 0xa9, 0x02, 0xc1, 0xd2, 0xfd, 0x51, 0xfd, 0xfc, 0xd8, 0xbb, \n  0x01, 0x03, 0x81, 0x01, 0xf5, 0x5d, 0xfe, 0x83, 0x2c, 0x02, 0x78, 0x93, 0x02, 0xe9, 0x8b, 0xfe, \n  0x9f, 0x6a, 0x01, 0x79, 0x90, 0xff, 0x4b, 0xd7, 0x3c, 0x39, 0x02, 0x31, 0x64, 0xd6, 0x09, 0xa6, \n  0xec, 0x08, 0xc3, 0x78, 0xe1, 0xb4, 0x04, 0xe1, 0xd4, 0x4f, 0x04, 0xea, 0xf0, 0x0d, 0xb3, 0xce, \n  0x08, 0x9d, 0x06, 0xfb, 0x20, 0xaf, 0xf7, 0x5c, 0x1d, 0xf3, 0x39, 0x4d, 0x01, 0xbd, 0xa7, 0x07, \n  0x6b, 0x28, 0xf8, 0x0d, 0x3f, 0x02, 0xe0, 0x4d, 0x02, 0xc5, 0x3e, 0xfb, 0xf8, 0x49, 0x02, 0x32, \n  0x64, 0xff, 0xcf, 0xb0, 0xfe, 0x07, 0x29, 0x02, 0x8c, 0xd8, 0xfe, 0xd0, 0x97, 0xfd, 0x6f, 0x23, \n  0xff, 0x41, 0x5e, 0xfd, 0x37, 0xe3, 0xfd, 0xad, 0x02, 0x02, 0x8d, 0x4a, 0xff, 0x94, 0x89, 0xfd, \n  0xa5, 0x59, 0x03, 0x3d, 0x63, 0x01, 0xbf, 0x3c, 0x33, 0x99, 0xcb, 0x2e, 0x68, 0x9d, 0x0d, 0xc3, \n  0xbc, 0x0a, 0x4c, 0x71, 0xe8, 0xc2, 0x27, 0xe0, 0xdc, 0xd3, 0xfe, 0x3f, 0x6b, 0x0b, 0xd5, 0xd4, \n  0x07, 0xec, 0x00, 0x00, 0xa1, 0x35, 0xfb, 0x63, 0x85, 0xf3, 0xb1, 0x34, 0xfe, 0xcf, 0x47, 0x05, \n  0x85, 0xae, 0xfb, 0xc9, 0x7a, 0x02, 0xde, 0x4b, 0x01, 0xf4, 0x08, 0xfc, 0xbb, 0x64, 0x02, 0xf9, \n  0x48, 0x00, 0xd3, 0x4f, 0xfe, 0x91, 0xd6, 0x01, 0x04, 0x4e, 0x00, 0x6f, 0x2d, 0xfe, 0x9b, 0x41, \n  0xff, 0xa0, 0xba, 0xfd, 0x07, 0x4c, 0xfd, 0x3a, 0xdf, 0x00, 0x2c, 0x7c, 0xfe, 0x15, 0xc1, 0xfd, \n  0x5d, 0x11, 0x04, 0xab, 0xf1, 0x01, 0x74, 0x52, 0x2c, 0xaa, 0xa1, 0x2a, 0xfb, 0x89, 0x0e, 0xd0, \n  0xd4, 0x0b, 0x3b, 0x8e, 0xed, 0x0f, 0xf2, 0xe3, 0x15, 0xf1, 0xfd, 0x14, 0x21, 0x08, 0xe5, 0xc4, \n  0x05, 0x12, 0x17, 0x01, 0x68, 0xd6, 0xfc, 0xbc, 0x62, 0xf5, 0xe2, 0x19, 0xfd, 0x52, 0xcb, 0x04, \n  0x98, 0x60, 0xfd, 0xad, 0x06, 0x01, 0xf9, 0xf8, 0x00, 0x97, 0xe3, 0xfc, 0x3e, 0xcc, 0x01, 0x43, \n  0xac, 0x00, 0x89, 0x80, 0xfe, 0x1c, 0x23, 0x01, 0x4d, 0xab, 0x00, 0x99, 0xfc, 0xfe, 0xf6, 0xeb, \n  0xfe, 0x9f, 0xc1, 0xfd, 0xed, 0xd4, 0xfd, 0x01, 0x2b, 0x00, 0x26, 0x60, 0xfe, 0xcb, 0xb4, 0xfe, \n  0xe8, 0xc0, 0x03, 0xc0, 0x0e, 0x02, 0x3b, 0x77, 0x24, 0x60, 0x25, 0x26, 0x40, 0xdc, 0x10, 0x9a, \n  0x24, 0x0c, 0x0b, 0xba, 0xf1, 0x42, 0x58, 0xe9, 0x27, 0x8b, 0xfc, 0x3b, 0xb8, 0x04, 0xfd, 0x22, \n  0x05, 0x26, 0xc0, 0x01, 0xf9, 0x2a, 0xfe, 0x62, 0x75, 0xf7, 0x2f, 0x90, 0xfc, 0x8f, 0x34, 0x04, \n  0xe9, 0x38, 0xfe, 0x2b, 0x0c, 0x00, 0x60, 0xed, 0x00, 0xd2, 0xaf, 0xfd, 0xd8, 0x48, 0x01, 0x27, \n  0xf9, 0x00, 0x27, 0xf2, 0xfe, 0x36, 0xad, 0x00, 0xf6, 0x1d, 0x01, 0x3b, 0x9b, 0xff, 0x14, 0xa0, \n  0xfe, 0x84, 0x02, 0xfe, 0xa1, 0x3f, 0xfe, 0x95, 0xf2, 0xff, 0x54, 0x47, 0xff, 0x2c, 0xc7, 0xff, \n  0xbe, 0x03, 0x03, 0xca, 0xe2, 0x01, 0x30, 0x91, 0x1e, 0x0f, 0x0e, 0x23, 0x2b, 0xb4, 0x12, 0xc4, \n  0xa2, 0x0b, 0xc9, 0xa2, 0xf4, 0x67, 0x84, 0xed, 0xe8, 0xa8, 0xfb, 0x3b, 0x1e, 0x03, 0xab, 0xc0, \n  0x04, 0x12, 0xd0, 0x01, 0x69, 0x4a, 0xff, 0x8e, 0x4a, 0xf9, 0xeb, 0x85, 0xfc, 0x24, 0x46, 0x03, \n  0x33, 0x93, 0xfe, 0x91, 0x0b, 0x00, 0x7e, 0x12, 0x01, 0xe9, 0x06, 0xfe, 0x71, 0xfa, 0x00, 0xae, \n  0x79, 0x01, 0xb5, 0x75, 0xff, 0xa8, 0x75, 0x00, 0x6d, 0x59, 0x01, 0xff, 0xd1, 0xff, 0x7c, 0xb6, \n  0xfe, 0x93, 0xdf, 0xfe, 0x0b, 0x31, 0xff, 0xf6, 0x09, 0x00, 0xbb, 0x92, 0xff, 0x73, 0x25, 0x00, \n  0x2a, 0x39, 0x02, 0xc3, 0x5e, 0x01, 0x53, 0xc3, 0x18, 0xd8, 0x90, 0x1f, 0xe5, 0xca, 0x13, 0xfe, \n  0xb5, 0x0b, 0x84, 0xd4, 0xf7, 0xb0, 0x89, 0xf0, 0x1c, 0xe6, 0xfa, 0x19, 0x23, 0x02, 0x71, 0x4b, \n  0x04, 0x92, 0x27, 0x02, 0xdc, 0x1a, 0x00, 0x31, 0xa4, 0xfa, 0x0a, 0xd8, 0xfc, 0xcf, 0x83, 0x02, \n  0x1b, 0xa5, 0xfe, 0xc0, 0xdd, 0xff, 0x6d, 0x5d, 0x01, 0x22, 0xae, 0xfe, 0xea, 0xbc, 0x00, 0xdb, \n  0xac, 0x01, 0x4d, 0xf9, 0xff, 0xdc, 0x62, 0x00, 0x8b, 0x66, 0x01, 0x80, 0xa1, 0x00, 0xf0, 0xd1, \n  0xff, 0x18, 0xdc, 0xff, 0xf9, 0x61, 0xff, 0xdf, 0x1e, 0xff, 0xd3, 0x66, 0xff, 0x84, 0x3c, 0x00, \n  0xb9, 0x14, 0x01, 0x6a, 0xb7, 0x00, 0x0c, 0xe1, 0x14, 0x56, 0x91, 0x1c, 0x6e, 0x39, 0x14, 0x8b, \n  0x8f, 0x0c, 0x1a, 0x21, 0xfa, 0xd1, 0x46, 0xf2, 0x8c, 0xbb, 0xfa, 0x09, 0xc6, 0x01, 0x62, 0x49, \n  0x04, 0x4c, 0x97, 0x02, 0x93, 0x64, 0x00, 0x5e, 0xd3, 0xfb, 0x14, 0xac, 0xfd, 0xdd, 0xc8, 0x01, \n  0xb8, 0x83, 0xfe, 0x97, 0x59, 0x00, 0x07, 0xd7, 0x01, 0xea, 0x18, 0xff, 0x9b, 0xfd, 0x00, 0xc5, \n  0xc4, 0x01, 0x71, 0x38, 0x00, 0x4f, 0x92, 0x01, 0x03, 0x96, 0x02, 0x6e, 0xee, 0x00, 0x17, 0xdd, \n  0xff, 0xb0, 0x0a, 0x00, 0xd2, 0x20, 0xff, 0x15, 0x37, 0xfe, 0x4d, 0x43, 0xff, 0x08, 0x73, 0x00, \n  0x8d, 0x96, 0x00, 0xe1, 0xac, 0x00, 0x5d, 0x9d, 0x12, 0x80, 0xab, 0x1a, 0x87, 0x91, 0x13, 0xc9, \n  0xc2, 0x0b, 0x60, 0xe5, 0xfa, 0x33, 0xf7, 0xf3, 0x3c, 0x91, 0xfb, 0x31, 0x75, 0x01, 0xcd, 0xc3, \n  0x03, 0xa0, 0xad, 0x02, 0x2c, 0xc7, 0x00, 0xe0, 0xaf, 0xfc, 0x3f, 0xd5, 0xfd, 0xe4, 0x43, 0x01, \n  0x3c, 0xb6, 0xfe, 0x27, 0xb8, 0x00, 0x71, 0x01, 0x02, 0xf3, 0x24, 0xff, 0xdf, 0x42, 0x01, 0x26, \n  0xc5, 0x02, 0xc4, 0x61, 0x01, 0x64, 0xe1, 0x01, 0x43, 0x14, 0x02, 0x41, 0x67, 0x00, 0xbc, 0x7a, \n  0xff, 0xed, 0x65, 0xff, 0x48, 0x1b, 0xfe, 0x03, 0x0b, 0xfe, 0xeb, 0xe6, 0xff, 0x4a, 0x08, 0x00, \n  0x8c, 0x30, 0x00, 0xab, 0xb6, 0x00, 0xed, 0x55, 0x10, 0xe0, 0x2e, 0x18, 0x41, 0xf8, 0x12, 0x92, \n  0xfb, 0x0b, 0x6c, 0xfe, 0xfb, 0xd4, 0x14, 0xf5, 0xe4, 0xe3, 0xfb, 0x3a, 0x86, 0x01, 0x75, 0xf8, \n  0x03, 0xdc, 0xd3, 0x02, 0x3a, 0xec, 0x00, 0xa2, 0xac, 0xfd, 0x19, 0x59, 0xfe, 0x60, 0x03, 0x01, \n  0x1c, 0x0d, 0xff, 0xc8, 0xb8, 0x00, 0xa8, 0x9b, 0x02, 0x5e, 0x51, 0x01, 0xbb, 0x60, 0x02, 0x74, \n  0x80, 0x02, 0xe7, 0x12, 0x01, 0xdd, 0x41, 0x01, 0xe4, 0x49, 0x01, 0x4d, 0x67, 0xff, 0xe7, 0xc6, \n  0xfe, 0x7a, 0x77, 0xff, 0xa1, 0x13, 0xfe, 0x6d, 0x41, 0xfe, 0xf2, 0x44, 0x00, 0xf8, 0x93, 0xff, \n  0x6b, 0x44, 0xff, 0x1a, 0xa8, 0x00, 0xd5, 0xad, 0x0f, 0x8e, 0xa2, 0x17, 0x92, 0xd9, 0x11, 0xa7, \n  0x6d, 0x0a, 0x27, 0x1a, 0xfc, 0xfc, 0x73, 0xf6, 0xfc, 0x21, 0xfd, 0x68, 0xf9, 0x01, 0x8f, 0x11, \n  0x04, 0x81, 0xe0, 0x02, 0x19, 0x27, 0x01, 0x4a, 0xd7, 0xfe, 0xd8, 0xb3, 0xfe, 0x3a, 0x99, 0x00, \n  0xae, 0x2a, 0x00, 0x51, 0x7f, 0x02, 0x27, 0xd0, 0x03, 0x70, 0x7d, 0x01, 0xa8, 0x68, 0x01, 0xd2, \n  0xa3, 0x01, 0x2b, 0xb2, 0x00, 0xf9, 0xad, 0x00, 0x7d, 0x8c, 0x00, 0x1f, 0x51, 0xff, 0x11, 0x20, \n  0xff, 0x49, 0x49, 0xff, 0xb1, 0x5b, 0xfe, 0xa7, 0xba, 0xfe, 0x5f, 0x62, 0xff, 0xb4, 0x9d, 0xff, \n  0x27, 0x9d, 0x00, 0x22, 0x8c, 0x00, 0x73, 0x63, 0x0f, 0xbd, 0xeb, 0x16, 0x96, 0x9d, 0x10, 0x00, \n  0xfe, 0x08, 0x71, 0xea, 0xfb, 0x3e, 0xe9, 0xf7, 0xd9, 0xd2, 0xfe, 0x17, 0x79, 0x02, 0x01, 0x12, \n  0x04, 0x1f, 0x50, 0x03, 0x87, 0x98, 0x01, 0x1a, 0x77, 0xff, 0x2b, 0xd3, 0xff, 0x62, 0x56, 0x02, \n  0xb6, 0x67, 0x01, 0x5f, 0x04, 0x02, 0x36, 0xa8, 0x02, 0x4d, 0x93, 0x00, 0x7e, 0x95, 0x00, 0x34, \n  0xda, 0x00, 0x2a, 0x69, 0x00, 0xed, 0x9e, 0x00, 0x1a, 0x6d, 0x00, 0xd8, 0x68, 0xff, 0xcc, 0xd9, \n  0xfe, 0x60, 0x15, 0xff, 0x0d, 0x65, 0xfe, 0x1d, 0x2e, 0xff, 0x65, 0xb3, 0x00, 0x95, 0x86, 0xff, \n  0x95, 0x78, 0xff, 0x92, 0x40, 0x00, 0x36, 0x41, 0x0f, 0x72, 0xd5, 0x16, 0x91, 0x50, 0x0f, 0x24, \n  0xb7, 0x07, 0x06, 0x94, 0xfc, 0x6a, 0x05, 0xf9, 0x4e, 0xeb, 0xff, 0x9f, 0x84, 0x03, 0x1d, 0x3a, \n  0x04, 0xf3, 0x21, 0x03, 0xee, 0xc9, 0x02, 0xf7, 0xc8, 0x01, 0x86, 0x17, 0x00, 0x93, 0x0b, 0x01, \n  0x28, 0xf0, 0x00, 0x98, 0x2a, 0x01, 0xfc, 0x95, 0x01, 0xee, 0x56, 0x00, 0x72, 0x5e, 0x00, 0x96, \n  0xc8, 0x00, 0x5d, 0x9c, 0x00, 0xa2, 0x7b, 0x00, 0x4c, 0x10, 0x00, 0x29, 0x3e, 0xff, 0x76, 0xac, \n  0xfe, 0x34, 0x53, 0xff, 0x2c, 0x08, 0x00, 0xe8, 0xbc, 0xff, 0x3e, 0x2d, 0xff, 0x45, 0x15, 0xff, \n  0xf8, 0xb9, 0xff, 0xcc, 0x2e, 0x00, 0x8e, 0x5e, 0x0e, 0x4f, 0x4f, 0x16, 0x5a, 0xd0, 0x0e, 0x18, \n  0x19, 0x07, 0xed, 0xbe, 0xfd, 0xff, 0xcf, 0xfa, 0xf5, 0x18, 0x01, 0x83, 0x38, 0x04, 0x37, 0x0e, \n  0x05, 0xfd, 0xd8, 0x04, 0xea, 0x17, 0x03, 0x3b, 0x69, 0x00, 0x57, 0x48, 0xff, 0x66, 0x06, 0x00, \n  0x1d, 0xd4, 0xff, 0x44, 0xc9, 0x00, 0xaf, 0x2f, 0x01, 0x14, 0x69, 0x00, 0xe8, 0x83, 0x00, 0xec, \n  0x6f, 0x00, 0x8a, 0x64, 0x00, 0x35, 0x29, 0x00, 0xef, 0x04, 0x00, 0x17, 0x72, 0xff, 0x8f, 0x9c, \n  0xff, 0x84, 0xbe, 0x00, 0xa0, 0x48, 0xff, 0xb3, 0x59, 0xfe, 0x9e, 0x2e, 0xff, 0x6a, 0x67, 0xff, \n  0xac, 0x90, 0xff, 0xbd, 0x5c, 0xff, 0xf9, 0x31, 0x0e, 0x28, 0x4c, 0x16, 0xec, 0x13, 0x0e, 0xd5, \n  0x47, 0x06, 0xec, 0x4f, 0xff, 0xdf, 0xe8, 0xfc, 0xb2, 0x10, 0x02, 0xc4, 0xb8, 0x05, 0x86, 0x86, \n  0x05, 0x70, 0xfa, 0x02, 0xf2, 0xa7, 0x01, 0x82, 0x14, 0x00, 0xb9, 0xea, 0xfe, 0xec, 0xbf, 0xff, \n  0xa3, 0x75, 0xff, 0xd4, 0x9f, 0x00, 0x13, 0x4c, 0x01, 0x2e, 0x2a, 0x00, 0x26, 0x39, 0x00, 0xf5, \n  0x28, 0x00, 0x5e, 0xae, 0x00, 0x0e, 0x7a, 0x00, 0x6c, 0xa2, 0xff, 0x32, 0xe3, 0x00, 0x1e, 0xaa, \n  0x00, 0x9e, 0xcd, 0xfe, 0xc6, 0xa9, 0xfe, 0x93, 0x1a, 0xff, 0x18, 0x1e, 0xff, 0x45, 0xdd, 0xfe, \n  0x28, 0x37, 0xff, 0xb1, 0xf9, 0xff, 0x07, 0xa5, 0x0e, 0xd3, 0xa3, 0x16, 0x45, 0x7a, 0x0d, 0x2a, \n  0xd4, 0x05, 0x20, 0x67, 0x00, 0x1f, 0x0d, 0xff, 0xee, 0x68, 0x03, 0xcf, 0xfd, 0x04, 0xe2, 0xd8, \n  0x03, 0x03, 0xd8, 0x01, 0xe2, 0x04, 0x01, 0x81, 0xd9, 0xff, 0xac, 0x23, 0xff, 0x83, 0xd7, 0xff, \n  0xac, 0x1a, 0xff, 0xbd, 0x6b, 0x00, 0x78, 0x54, 0x01, 0xd4, 0xb5, 0xff, 0x0c, 0xd0, 0xff, 0x07, \n  0x08, 0x01, 0x77, 0x05, 0x01, 0x48, 0xd8, 0xff, 0x86, 0x1e, 0x01, 0x63, 0x8e, 0x01, 0xef, 0xca, \n  0xfe, 0x3e, 0xad, 0xfe, 0xf2, 0x42, 0xff, 0xc3, 0xbe, 0xfe, 0x89, 0x8e, 0xfe, 0xaf, 0xe4, 0xfe, \n  0xcd, 0xd5, 0xff, 0x84, 0x1d, 0xff, 0xd7, 0x7d, 0x0e, 0x2d, 0xbf, 0x17, 0x1c, 0xc4, 0x0e, 0x8f, \n  0xca, 0x05, 0xb8, 0x7a, 0x00, 0xa4, 0x1c, 0xff, 0x7f, 0x9c, 0x02, 0x61, 0x1b, 0x04, 0x45, 0x53, \n  0x03, 0xac, 0x60, 0x01, 0x0f, 0x17, 0x01, 0x18, 0x4d, 0x00, 0x02, 0x8b, 0xfe, 0xfc, 0xa7, 0xff, \n  0x3b, 0xb1, 0xff, 0x0a, 0xd4, 0xff, 0xd7, 0xf2, 0x00, 0x01, 0x10, 0x00, 0x4f, 0x5b, 0x00, 0x7f, \n  0x17, 0x01, 0x3d, 0x7c, 0x00, 0xec, 0x9b, 0x01, 0xfb, 0xe3, 0x01, 0x6a, 0x51, 0xff, 0x8e, 0xec, \n  0xfe, 0xd3, 0xd7, 0xff, 0x01, 0xbf, 0xfe, 0xb4, 0xdf, 0xfd, 0x4c, 0xa8, 0xfe, 0xeb, 0x83, 0xff, \n  0xd1, 0xf8, 0xfe, 0xfb, 0xc1, 0xfe, 0x6d, 0x5c, 0x0f, 0x65, 0x51, 0x19, 0x29, 0x84, 0x0f, 0xdf, \n  0x15, 0x05, 0xca, 0x8a, 0xff, 0xbd, 0xc2, 0xfd, 0xc4, 0xf4, 0x00, 0x1e, 0x21, 0x04, 0x5c, 0x20, \n  0x04, 0x55, 0x71, 0x01, 0x3f, 0x13, 0x01, 0x7a, 0x62, 0x00, 0x63, 0x52, 0xfe, 0x97, 0x32, 0xff, \n  0xba, 0xca, 0xff, 0xaf, 0x47, 0x00, 0xed, 0xbb, 0x00, 0xa3, 0x4e, 0x00, 0x36, 0xe2, 0x00, 0x28, \n  0x4d, 0x00, 0x15, 0x11, 0x01, 0x99, 0xf7, 0x02, 0x96, 0xbe, 0x00, 0xfc, 0xde, 0xfe, 0x1d, 0x9e, \n  0xff, 0xfd, 0x9d, 0xff, 0x8c, 0x9e, 0xfe, 0x40, 0xe0, 0xfd, 0xe1, 0xd6, 0xfe, 0x3d, 0xfa, 0xfe, \n  0x6e, 0x50, 0xfe, 0x8d, 0x92, 0xff, 0xea, 0x83, 0x0f, 0x0f, 0xbf, 0x1a, 0x27, 0x89, 0x10, 0xce, \n  0x3d, 0x04, 0x13, 0x96, 0xfe, 0x90, 0xac, 0xfc, 0xc5, 0xd6, 0xff, 0xc1, 0xdf, 0x03, 0xc0, 0xe3, \n  0x03, 0x6b, 0x6e, 0x01, 0x8c, 0xa6, 0x01, 0xcb, 0x7b, 0x00, 0x2a, 0xfe, 0xfd, 0x28, 0x47, 0xff, \n  0x03, 0x15, 0x00, 0x71, 0x2c, 0x00, 0x2c, 0xad, 0x00, 0x71, 0x02, 0x01, 0xae, 0xac, 0x00, 0xfc, \n  0x6d, 0xff, 0x65, 0x0f, 0x02, 0x61, 0x99, 0x03, 0x91, 0x05, 0x00, 0xc6, 0x02, 0xff, 0xde, 0x05, \n  0x00, 0x6f, 0x6a, 0xff, 0x1c, 0x5b, 0xfe, 0x88, 0x73, 0xfe, 0xcf, 0x0f, 0xff, 0xd1, 0x2f, 0xfe, \n  0x92, 0x16, 0xfe, 0xf5, 0xce, 0xff, 0x28, 0xbe, 0x0e, 0xb9, 0xfb, 0x1a, 0x5b, 0x2a, 0x12, 0x68, \n  0x6d, 0x04, 0x4a, 0x7f, 0xfd, 0x9e, 0xfa, 0xfb, 0xb5, 0xca, 0xff, 0x30, 0x2c, 0x04, 0xfd, 0xbf, \n  0x03, 0xe7, 0x97, 0x00, 0xd7, 0xa2, 0x00, 0x9b, 0x71, 0x00, 0xfc, 0xc3, 0xfe, 0x2b, 0x62, 0xff, \n  0x87, 0xed, 0xff, 0xc9, 0xbb, 0x00, 0x2f, 0xf8, 0x00, 0x59, 0x5e, 0x00, 0x7c, 0x90, 0x00, 0x55, \n  0xbf, 0xff, 0x7a, 0x7d, 0x01, 0x64, 0xa5, 0x03, 0xcd, 0xe9, 0x00, 0xdd, 0xfc, 0xfe, 0x80, 0xd2, \n  0xff, 0xc8, 0x97, 0xff, 0xb5, 0x75, 0xfe, 0xc4, 0xae, 0xfe, 0xdf, 0x10, 0xff, 0x5a, 0x21, 0xfe, \n  0x72, 0x43, 0xfe, 0x0c, 0xa7, 0xff, 0xb7, 0x8e, 0x0d, 0xce, 0xb0, 0x1a, 0x45, 0x2e, 0x14, 0x1b, \n  0xc4, 0x05, 0xa2, 0xcc, 0xfc, 0x5e, 0xfc, 0xfa, 0x5d, 0x84, 0xff, 0x4b, 0x93, 0x04, 0x42, 0xb9, \n  0x04, 0xb5, 0xe1, 0x00, 0xfc, 0x4e, 0xff, 0x09, 0x68, 0xff, 0x49, 0x75, 0xfe, 0xde, 0xd3, 0xfe, \n  0x6c, 0x52, 0x00, 0xd8, 0xd1, 0x01, 0x65, 0x40, 0x01, 0xf5, 0x45, 0x00, 0xf5, 0xd8, 0x00, 0xf5, \n  0x8a, 0xff, 0x0f, 0x6c, 0x00, 0x61, 0xd1, 0x03, 0xf5, 0x1d, 0x02, 0x96, 0x08, 0xff, 0x45, 0x94, \n  0xff, 0x4c, 0x19, 0x00, 0x9f, 0x06, 0xff, 0xf6, 0xda, 0xfe, 0x0a, 0x2c, 0xff, 0x3e, 0x7c, 0xfe, \n  0x2c, 0x6b, 0xfe, 0x0a, 0xa0, 0xff, 0x89, 0x4a, 0x0d, 0x98, 0xc0, 0x1a, 0x69, 0x35, 0x15, 0x52, \n  0x83, 0x06, 0xc9, 0x5d, 0xfc, 0xdc, 0x2b, 0xfa, 0xb8, 0x1e, 0xff, 0x56, 0xf2, 0x04, 0xd1, 0x57, \n  0x05, 0x05, 0x0f, 0x01, 0xb1, 0xea, 0xfe, 0x86, 0x03, 0xff, 0xda, 0x32, 0xfe, 0xd6, 0xdb, 0xfd, \n  0x88, 0x2b, 0xff, 0xf3, 0x89, 0x01, 0x97, 0x01, 0x02, 0x49, 0xaf, 0x00, 0x6c, 0x93, 0x00, 0x73, \n  0x21, 0x00, 0x72, 0xfd, 0xff, 0x79, 0x97, 0x02, 0x98, 0xdd, 0x02, 0x2e, 0xaa, 0xff, 0x34, 0xea, \n  0xfe, 0x9c, 0xb4, 0xff, 0x56, 0x6f, 0xff, 0xa0, 0x81, 0xff, 0xb9, 0x77, 0xff, 0x64, 0x87, 0xfe, \n  0xa8, 0x49, 0xfe, 0xda, 0xc2, 0xff, 0x61, 0xea, 0x0d, 0xb0, 0xb0, 0x1b, 0x4b, 0x90, 0x15, 0xb8, \n  0xbd, 0x06, 0x35, 0xe2, 0xfb, 0xc5, 0x1e, 0xf9, 0x02, 0x3c, 0xff, 0x21, 0x7e, 0x05, 0x06, 0xaa, \n  0x05, 0xbd, 0x44, 0x01, 0xe2, 0x73, 0xfe, 0x71, 0xd4, 0xfe, 0x23, 0x81, 0xfe, 0x41, 0x9e, 0xfd, \n  0x0d, 0x84, 0xfe, 0x06, 0xae, 0x00, 0xe2, 0x75, 0x01, 0xbe, 0x97, 0x00, 0x78, 0x7d, 0x00, 0xa4, \n  0xc2, 0x00, 0xce, 0x75, 0x00, 0x53, 0xca, 0x01, 0x33, 0xe8, 0x02, 0x5a, 0xad, 0x00, 0x56, 0x7a, \n  0xfe, 0x84, 0xb5, 0xfe, 0x36, 0x7f, 0xff, 0x67, 0xe3, 0xff, 0x26, 0xfb, 0xff, 0xd3, 0x0f, 0xff, \n  0x39, 0x73, 0xfe, 0xb8, 0xd1, 0xff, 0xa3, 0xca, 0x0e, 0x44, 0x18, 0x1d, 0xf8, 0x88, 0x16, 0xc3, \n  0xd8, 0x06, 0xae, 0xef, 0xfa, 0x9a, 0x20, 0xf8, 0xbb, 0xf8, 0xfe, 0x12, 0x33, 0x06, 0xcf, 0x85, \n  0x06, 0xc2, 0xe8, 0x00, 0xbd, 0xec, 0xfd, 0x13, 0xdb, 0xfe, 0x18, 0x91, 0xfe, 0x24, 0xba, 0xfd, \n  0x07, 0x6b, 0xfe, 0x00, 0x27, 0x00, 0x41, 0x04, 0x01, 0x3a, 0x25, 0x00, 0xb4, 0x4b, 0xff, 0x71, \n  0x6a, 0x00, 0x72, 0x2b, 0x01, 0x0d, 0x68, 0x01, 0x53, 0xcc, 0x02, 0x25, 0xf7, 0x01, 0xe5, 0x09, \n  0xff, 0xe7, 0xb1, 0xfd, 0x87, 0x75, 0xfe, 0x33, 0xa9, 0xff, 0x01, 0x5b, 0x00, 0x9d, 0xbd, 0xff, \n  0x49, 0x97, 0xfe, 0x56, 0xf0, 0xff, 0xaf, 0xb5, 0x0f, 0x5a, 0x09, 0x1f, 0x98, 0xa7, 0x17, 0x0c, \n  0x18, 0x06, 0x13, 0xca, 0xf9, 0xf2, 0x8f, 0xf7, 0x74, 0xb9, 0xfe, 0xf8, 0xce, 0x06, 0xf3, 0x2b, \n  0x07, 0x2a, 0x5e, 0x00, 0x75, 0x45, 0xfd, 0xf5, 0xb7, 0xfe, 0xf1, 0xa6, 0xfe, 0x54, 0xe1, 0xfd, \n  0x77, 0x7b, 0xfe, 0xc4, 0xdf, 0xff, 0xed, 0x91, 0x00, 0x5d, 0x33, 0x00, 0xd8, 0xdd, 0xfe, 0x73, \n  0x4b, 0xff, 0xca, 0xeb, 0x00, 0xc2, 0x54, 0x01, 0x3f, 0x1b, 0x02, 0x85, 0x42, 0x02, 0x5d, 0x65, \n  0x00, 0x28, 0xea, 0xfd, 0x78, 0x6d, 0xfd, 0x97, 0xed, 0xfe, 0xce, 0x38, 0x00, 0x47, 0xe4, 0xff, \n  0x4f, 0xa7, 0xfe, 0xfc, 0xe7, 0xff, 0x84, 0x59, 0x11, 0x65, 0xa4, 0x21, 0x9f, 0xe0, 0x18, 0x87, \n  0x1d, 0x05, 0x91, 0x67, 0xf8, 0xce, 0x99, 0xf6, 0x19, 0x2a, 0xfe, 0x16, 0x27, 0x08, 0xfa, 0x44, \n  0x08, 0x6f, 0x47, 0xff, 0xc1, 0x44, 0xfc, 0x48, 0x9a, 0xfe, 0x3d, 0xdf, 0xfe, 0xc6, 0xed, 0xfd, \n  0x43, 0x89, 0xfe, 0xb1, 0xfd, 0xff, 0xcc, 0x47, 0x00, 0x84, 0x03, 0x00, 0x4c, 0xab, 0xfe, 0xaf, \n  0xc5, 0xfe, 0x3c, 0x82, 0x00, 0xa8, 0xfb, 0x00, 0x0c, 0x49, 0x01, 0xad, 0xcc, 0x01, 0x67, 0x2b, \n  0x01, 0x95, 0xa4, 0xfe, 0x20, 0x72, 0xfd, 0x2d, 0x63, 0xfe, 0x27, 0xa1, 0xff, 0x01, 0x03, 0x00, \n  0x81, 0xb0, 0xfe, 0x4f, 0x89, 0xff, 0xfa, 0x55, 0x13, 0xc8, 0x63, 0x24, 0x14, 0x9b, 0x19, 0xaf, \n  0xe1, 0x03, 0xc3, 0xfd, 0xf6, 0x95, 0x74, 0xf5, 0x35, 0xf8, 0xfd, 0x57, 0xaa, 0x09, 0x30, 0xfe, \n  0x08, 0x2e, 0x29, 0xfe, 0xad, 0x44, 0xfb, 0xd9, 0x84, 0xfe, 0x7d, 0x24, 0xff, 0x95, 0xba, 0xfd, \n  0xfe, 0x7c, 0xfe, 0x36, 0x4f, 0x00, 0x29, 0x1a, 0x00, 0x92, 0xc0, 0xff, 0x44, 0x7d, 0xfe, 0x00, \n  0x87, 0xfe, 0x3b, 0x66, 0x00, 0xc1, 0xb3, 0x00, 0x02, 0xb9, 0x00, 0x42, 0x43, 0x01, 0xda, 0x47, \n  0x01, 0xc3, 0x26, 0xff, 0xf4, 0x50, 0xfd, 0x88, 0x20, 0xfe, 0x1f, 0xa4, 0xff, 0xb3, 0x0a, 0x00, \n  0xb7, 0xb7, 0xfe, 0x3c, 0x54, 0xff, 0x88, 0x77, 0x14, 0x58, 0xea, 0x27, 0x0b, 0xe2, 0x1b, 0x1a, \n  0x99, 0x02, 0x5b, 0xfb, 0xf4, 0x63, 0x50, 0xf4, 0xbf, 0x89, 0xfd, 0xee, 0xdc, 0x0a, 0x1c, 0x4a, \n  0x0a, 0x9a, 0x02, 0xfd, 0x94, 0xe9, 0xf9, 0x2e, 0x80, 0xfe, 0x30, 0x4b, 0xff, 0x23, 0xbc, 0xfd, \n  0x92, 0x30, 0xfe, 0xba, 0x71, 0x00, 0x96, 0x3e, 0x00, 0x32, 0x28, 0xff, 0xe9, 0x6d, 0xfe, 0xa6, \n  0x8c, 0xfe, 0xb0, 0xde, 0xff, 0x54, 0xa1, 0x00, 0xfc, 0x5c, 0x00, 0x1f, 0x6c, 0x00, 0x02, 0x4a, \n  0x01, 0x7a, 0xa2, 0xff, 0x6a, 0x83, 0xfd, 0x5b, 0xe8, 0xfd, 0x78, 0x15, 0xff, 0x58, 0xc9, 0xff, \n  0xf8, 0x57, 0xff, 0xc7, 0xa4, 0xff, 0xf5, 0xd8, 0x16, 0xe9, 0x72, 0x2b, 0x57, 0xa5, 0x1c, 0x8e, \n  0xf6, 0x00, 0x22, 0xf5, 0xf2, 0xac, 0x36, 0xf3, 0x2a, 0x18, 0xfe, 0x45, 0x56, 0x0c, 0xbd, 0xe6, \n  0x0a, 0x4b, 0x94, 0xfb, 0x1e, 0xb5, 0xf8, 0x1c, 0xda, 0xfe, 0x60, 0x91, 0xff, 0x26, 0x92, 0xfd, \n  0x84, 0x07, 0xfe, 0xf3, 0xab, 0x00, 0x6e, 0x68, 0x00, 0x54, 0xaf, 0xfe, 0x03, 0x30, 0xfe, 0xd9, \n  0xaa, 0xfe, 0x33, 0xd5, 0xff, 0x3d, 0x96, 0x00, 0x8c, 0xf9, 0xff, 0x4b, 0xda, 0xff, 0x09, 0x44, \n  0x01, 0x33, 0xe0, 0xff, 0x15, 0xde, 0xfd, 0x2f, 0x07, 0xfe, 0x09, 0xe5, 0xfe, 0x38, 0x84, 0xff, \n  0xa6, 0x10, 0xff, 0x58, 0x2a, 0x00, 0x4c, 0x86, 0x18, 0xab, 0xe8, 0x2e, 0xe9, 0x35, 0x1e, 0xf8, \n  0xd7, 0xff, 0x1f, 0x02, 0xf1, 0x9c, 0xc0, 0xf1, 0xd0, 0x7c, 0xfe, 0x3e, 0xaa, 0x0d, 0x1e, 0x70, \n  0x0b, 0x2e, 0x8f, 0xfa, 0xe9, 0x5d, 0xf7, 0x8f, 0x0b, 0xff, 0xce, 0x20, 0x00, 0xd9, 0x5b, 0xfd, \n  0xea, 0xa3, 0xfd, 0x57, 0xd1, 0x00, 0xca, 0xc7, 0x00, 0xba, 0x5a, 0xfe, 0x21, 0xb6, 0xfd, 0xac, \n  0xae, 0xfe, 0x60, 0xde, 0xff, 0xd9, 0x9a, 0x00, 0x33, 0xd2, 0xff, 0x91, 0x15, 0xff, 0x5a, 0xf9, \n  0x00, 0x7f, 0x47, 0x00, 0x4b, 0x2e, 0xfe, 0x6d, 0x6c, 0xfe, 0x3a, 0xc9, 0xfe, 0x24, 0x48, 0xff, \n  0x99, 0xee, 0xfe, 0xab, 0x04, 0x00, 0xa2, 0xb1, 0x1a, 0xdf, 0x81, 0x32, 0x88, 0xf2, 0x1f, 0x68, \n  0xac, 0xfe, 0x47, 0x5b, 0xee, 0x60, 0xc6, 0xef, 0x3f, 0xaf, 0xfe, 0x3f, 0x19, 0x0f, 0x1f, 0xb8, \n  0x0b, 0xe7, 0xdd, 0xf8, 0xef, 0x98, 0xf5, 0x0b, 0x30, 0xff, 0x56, 0xb5, 0x00, 0xb1, 0xfd, 0xfc, \n  0x4a, 0x00, 0xfd, 0x4a, 0x7a, 0x00, 0x83, 0x0a, 0x01, 0x3b, 0x21, 0xfe, 0x21, 0x1c, 0xfd, 0x25, \n  0x59, 0xfe, 0x29, 0x7e, 0xff, 0x26, 0xa0, 0x00, 0x62, 0xa4, 0xff, 0x19, 0x31, 0xfe, 0x59, 0x25, \n  0x00, 0x2f, 0x55, 0x00, 0x6e, 0x81, 0xfe, 0xa2, 0xbb, 0xfe, 0x55, 0x0a, 0xff, 0x2c, 0xd3, 0xfe, \n  0xec, 0xb6, 0xfe, 0x05, 0xa7, 0xff, 0x37, 0x2f, 0x1c, 0x9c, 0x81, 0x35, 0x9f, 0xbc, 0x21, 0xcf, \n  0xf2, 0xfe, 0xea, 0x21, 0xed, 0x11, 0xb9, 0xed, 0xba, 0x06, 0xff, 0x01, 0x83, 0x10, 0x24, 0x0b, \n  0x0c, 0xf9, 0x44, 0xf8, 0x3e, 0x28, 0xf4, 0xc4, 0x47, 0xff, 0x17, 0xde, 0x01, 0x80, 0xf9, 0xfc, \n  0xbd, 0xa7, 0xfc, 0x06, 0x7c, 0x00, 0x84, 0x55, 0x01, 0xea, 0x1b, 0xfe, 0x51, 0x1c, 0xfd, 0xe0, \n  0x79, 0xfe, 0x45, 0x3d, 0xff, 0xdc, 0xbd, 0x00, 0x5f, 0xd2, 0xff, 0xf5, 0xf3, 0xfd, 0x6c, 0x7b, \n  0xff, 0x66, 0x62, 0x00, 0x93, 0x3a, 0xff, 0xcb, 0xec, 0xfe, 0x5c, 0xc7, 0xff, 0x1f, 0x04, 0xff, \n  0x4e, 0x9d, 0xfe, 0xd9, 0xf7, 0xff, 0xf4, 0x44, 0x1f, 0x7a, 0x8f, 0x38, 0x85, 0xc1, 0x21, 0xca, \n  0x67, 0xff, 0x4c, 0x46, 0xec, 0x17, 0xfd, 0xea, 0x9d, 0xa2, 0xff, 0x9f, 0x2b, 0x12, 0xd2, 0x66, \n  0x0b, 0x38, 0x0e, 0xf7, 0x23, 0xef, 0xf2, 0xa8, 0x0e, 0xff, 0x40, 0xe3, 0x02, 0xa9, 0x17, 0xfd, \n  0xb0, 0xdb, 0xfb, 0xc1, 0x82, 0x00, 0xa1, 0x95, 0x01, 0x1a, 0xaa, 0xfd, 0x8b, 0xfe, 0xfc, 0xf0, \n  0x81, 0xfe, 0x6f, 0x19, 0xff, 0x4b, 0x9c, 0x00, 0x2d, 0xc3, 0xff, 0xbc, 0x01, 0xfe, 0x4f, 0x5b, \n  0xfe, 0xb9, 0xc3, 0xff, 0x87, 0x49, 0x00, 0x43, 0x25, 0xff, 0x59, 0x0e, 0x00, 0xe3, 0xa0, 0xff, \n  0x34, 0x65, 0xfe, 0xc6, 0x2a, 0x00, 0x7e, 0xbc, 0x22, 0x5f, 0x7b, 0x3b, 0xf3, 0x35, 0x20, 0x79, \n  0xb5, 0xfe, 0x9d, 0x64, 0xec, 0x77, 0xb9, 0xe9, 0x57, 0x7a, 0x00, 0x97, 0xfc, 0x12, 0x54, 0xcf, \n  0x09, 0x5a, 0x4c, 0xf6, 0xee, 0xac, 0xf2, 0xfe, 0x73, 0xfe, 0xe8, 0x6c, 0x03, 0x68, 0x82, 0xfd, \n  0xfe, 0x24, 0xfb, 0xc3, 0x4a, 0x00, 0x3b, 0xde, 0x01, 0x66, 0x53, 0xfd, 0x57, 0xd6, 0xfc, 0x08, \n  0x96, 0xfe, 0x8d, 0xfd, 0xfe, 0x30, 0x74, 0x00, 0x11, 0x81, 0xff, 0xaf, 0x61, 0xfe, 0x1f, 0xd9, \n  0xfd, 0x2c, 0x66, 0xfe, 0x49, 0xf8, 0x00, 0x75, 0xfc, 0xff, 0x8e, 0xdb, 0xff, 0x2d, 0x48, 0x00, \n  0xfc, 0x9a, 0xfe, 0x47, 0xd0, 0xff, 0x37, 0x56, 0x29, 0xe3, 0x16, 0x3f, 0x6b, 0xb0, 0x1a, 0x8c, \n  0x8a, 0xfc, 0x89, 0xf2, 0xed, 0x9a, 0xf4, 0xe9, 0x51, 0x96, 0x01, 0xab, 0xfa, 0x12, 0x8b, 0x2a, \n  0x07, 0x95, 0x25, 0xf5, 0x46, 0x89, 0xf3, 0x2d, 0xa2, 0xfd, 0x84, 0x3f, 0x03, 0x07, 0x77, 0xfe, \n  0x2f, 0x67, 0xfa, 0x7c, 0xc0, 0xff, 0x15, 0xdb, 0x01, 0x84, 0x2c, 0xfd, 0xa8, 0xc7, 0xfc, 0xe2, \n  0x8d, 0xfe, 0xad, 0x2c, 0xff, 0xbd, 0x1e, 0x00, 0xba, 0xf8, 0xfe, 0xb6, 0xa4, 0xfe, 0x48, 0xef, \n  0xfd, 0x97, 0x08, 0xfd, 0x12, 0xb8, 0x00, 0xd7, 0x67, 0x01, 0xfc, 0x9a, 0xff, 0x2d, 0x8a, 0x00, \n  0x7e, 0xcf, 0xff, 0xa0, 0x1c, 0xff, 0xd9, 0xb5, 0x2e, 0x58, 0x62, 0x40, 0xf0, 0x8d, 0x15, 0x9c, \n  0xc6, 0xfd, 0x43, 0x29, 0xf1, 0xa8, 0x17, 0xe8, 0x05, 0xb0, 0x00, 0x85, 0x34, 0x14, 0xb9, 0x37, \n  0x06, 0x48, 0x7b, 0xf3, 0x47, 0xcb, 0xf3, 0xd6, 0x77, 0xfd, 0x1a, 0x2d, 0x03, 0x9c, 0xef, 0xfe, \n  0xfe, 0xe1, 0xf9, 0x76, 0x64, 0xff, 0x25, 0xa7, 0x01, 0xe7, 0x09, 0xfd, 0x35, 0xca, 0xfc, 0xd8, \n  0xe6, 0xfe, 0x6d, 0x79, 0xff, 0x16, 0x8b, 0xff, 0x8b, 0xb8, 0xfe, 0x7c, 0xa8, 0xfe, 0xd3, 0x46, \n  0xfe, 0x30, 0x7e, 0xfc, 0xc5, 0x9e, 0xff, 0xfe, 0xa7, 0x02, 0xfc, 0xfb, 0xff, 0x63, 0x2d, 0x00, \n  0x6d, 0x09, 0x01, 0x8c, 0xff, 0xfe, 0x53, 0xee, 0x33, 0x4c, 0xeb, 0x40, 0x51, 0x0f, 0x10, 0xd8, \n  0x0a, 0x00, 0x72, 0xde, 0xf4, 0x99, 0xd1, 0xe5, 0x9e, 0x88, 0xff, 0xe7, 0x6c, 0x15, 0x76, 0x75, \n  0x05, 0xc3, 0x6f, 0xf1, 0x75, 0x13, 0xf4, 0xc1, 0xe7, 0xfd, 0x4b, 0xab, 0x02, 0xd3, 0xf1, 0xfe, \n  0xa8, 0x9f, 0xf9, 0xa1, 0x2e, 0xff, 0x6a, 0x35, 0x01, 0xb2, 0x92, 0xfc, 0x79, 0xda, 0xfc, 0xb0, \n  0xa6, 0xff, 0x2a, 0xdd, 0xff, 0x8c, 0x93, 0xfe, 0x14, 0xa1, 0xfe, 0xfc, 0xc9, 0xfe, 0xe9, 0x2b, \n  0xfe, 0xa8, 0x6d, 0xfc, 0x31, 0x85, 0xfe, 0x82, 0x26, 0x03, 0xb0, 0xe9, 0x00, 0x17, 0xc0, 0xff, \n  0xbd, 0xa5, 0x01, 0x94, 0x88, 0xff, 0xb5, 0x7a, 0x3b, 0x5e, 0x0b, 0x44, 0xb7, 0x0b, 0x07, 0xd3, \n  0x9e, 0xfd, 0x7e, 0x94, 0xf9, 0x4c, 0xc1, 0xe7, 0xc0, 0x1d, 0xff, 0x9a, 0xb5, 0x13, 0x7b, 0x37, \n  0x04, 0x9f, 0x04, 0xf0, 0x4e, 0x86, 0xf4, 0x65, 0x8f, 0xfe, 0x4a, 0xb2, 0x01, 0x6f, 0x34, 0xff, \n  0x03, 0x40, 0xf9, 0x9b, 0x95, 0xfe, 0xcc, 0xc0, 0x00, 0x31, 0x39, 0xfc, 0xf0, 0x09, 0xfd, 0x47, \n  0x09, 0x00, 0xbe, 0xca, 0x00, 0x8b, 0xeb, 0xfd, 0x01, 0x29, 0xfe, 0x37, 0xd1, 0xfe, 0xa2, 0xa5, \n  0xfd, 0xd4, 0x0c, 0xfd, 0x74, 0xf5, 0xfd, 0x70, 0x71, 0x02, 0xb5, 0x03, 0x02, 0xae, 0x33, 0x00, \n  0x42, 0x83, 0x01, 0x2e, 0x11, 0x00, 0x76, 0x6a, 0x43, 0x41, 0x12, 0x46, 0xe2, 0x71, 0xfe, 0xdd, \n  0x12, 0xfb, 0x2c, 0x9e, 0xfc, 0x7c, 0x19, 0xeb, 0x06, 0xc1, 0xff, 0xfe, 0x12, 0x11, 0xda, 0x5a, \n  0x03, 0xd1, 0x25, 0xef, 0x21, 0xb1, 0xf4, 0x07, 0x42, 0xff, 0x43, 0x2a, 0x01, 0x1d, 0x54, 0xff, \n  0xdf, 0xb2, 0xf8, 0x99, 0x67, 0xfe, 0x55, 0x47, 0x00, 0x9a, 0xdd, 0xfb, 0x74, 0xb7, 0xfd, 0x48, \n  0x49, 0x00, 0x2a, 0x97, 0x01, 0x5e, 0x83, 0xfd, 0x23, 0xb5, 0xfd, 0x8e, 0x16, 0xff, 0xf6, 0x14, \n  0xfd, 0xf4, 0xad, 0xfd, 0xb9, 0x2b, 0xfe, 0xce, 0x9f, 0x01, 0x53, 0x6b, 0x02, 0x5f, 0x12, 0x01, \n  0x30, 0x6c, 0x01, 0xf8, 0xdb, 0xff, 0x63, 0xc3, 0x4a, 0x36, 0x3e, 0x4a, 0xff, 0xd5, 0xf5, 0xf8, \n  0x18, 0xf6, 0xb4, 0x84, 0xff, 0xe4, 0xdc, 0xef, 0x4e, 0xb8, 0x00, 0xa0, 0xfc, 0x0c, 0x31, 0x45, \n  0x03, 0x7c, 0xdf, 0xee, 0xa6, 0xa2, 0xf3, 0x94, 0x0d, 0x00, 0x8e, 0x89, 0x00, 0xc4, 0x89, 0xff, \n  0x78, 0xfb, 0xf7, 0xbc, 0xe4, 0xfd, 0x60, 0xfa, 0xff, 0xb7, 0x7e, 0xfb, 0xd7, 0xc0, 0xfe, 0x3f, \n  0x36, 0x00, 0x5e, 0x6a, 0x02, 0x6d, 0x4d, 0xfd, 0xce, 0xc3, 0xfc, 0xf7, 0x9b, 0xff, 0x40, 0x94, \n  0xfc, 0xab, 0x1b, 0xfe, 0x01, 0xd6, 0xfe, 0xb6, 0x08, 0x01, 0x81, 0xda, 0x01, 0xce, 0xbb, 0x01, \n  0xd5, 0xed, 0x01, 0xd3, 0xbf, 0xfe, 0x87, 0x05, 0x51, 0xb8, 0x78, 0x4d, 0xfd, 0x7a, 0xef, 0x0f, \n  0x80, 0xf1, 0x36, 0x4f, 0x00, 0xc6, 0x48, 0xf4, 0xb3, 0x0d, 0x02, 0x10, 0x76, 0x09, 0x7f, 0x97, \n  0x03, 0xdf, 0xc2, 0xee, 0x6c, 0x52, 0xf2, 0xef, 0x83, 0x00, 0x86, 0x01, 0x00, 0x2b, 0xa3, 0xff, \n  0x58, 0x9c, 0xf7, 0xbe, 0x7b, 0xfd, 0x4c, 0xc5, 0xff, 0x15, 0x7e, 0xfb, 0x52, 0xa5, 0xff, 0x8c, \n  0xea, 0xff, 0xda, 0xeb, 0x02, 0x45, 0x4b, 0xfd, 0xc7, 0xf2, 0xfb, 0x9e, 0x1f, 0x00, 0x4d, 0x59, \n  0xfc, 0x54, 0x30, 0xfe, 0x06, 0xdf, 0xff, 0x80, 0x0b, 0x01, 0x83, 0x7b, 0x00, 0x25, 0xb1, 0x01, \n  0xd3, 0xbb, 0x02, 0xc5, 0xb6, 0xfd, 0x96, 0xf3, 0x57, 0xfa, 0xdd, 0x50, 0xd8, 0xd3, 0xe9, 0x69, \n  0x29, 0xec, 0xb9, 0x43, 0xff, 0x62, 0xef, 0xf8, 0x03, 0xed, 0x03, 0x1a, 0x61, 0x06, 0xa7, 0x40, \n  0x04, 0xdc, 0x58, 0xee, 0x12, 0xcd, 0xf0, 0x35, 0x83, 0x00, 0x82, 0x30, 0xff, 0x78, 0xfd, 0xff, \n  0x08, 0x96, 0xf7, 0x21, 0x4e, 0xfd, 0xd3, 0xc4, 0xff, 0x0c, 0xb5, 0xfb, 0x9d, 0x70, 0x00, 0x0a, \n  0x5a, 0xff, 0xf8, 0x5d, 0x03, 0xb4, 0x72, 0xfd, 0xd5, 0x61, 0xfb, 0x8e, 0xab, 0x00, 0x58, 0xef, \n  0xfb, 0xa9, 0xae, 0xfe, 0xba, 0x32, 0x01, 0xb0, 0xac, 0x00, 0xc5, 0xf7, 0xfe, 0x21, 0xd3, 0x00, \n  0x7c, 0x28, 0x03, 0x2b, 0x7f, 0xfd, 0x8d, 0xd5, 0x5c, 0x07, 0x2c, 0x54, 0xa5, 0x6a, 0xe6, 0xab, \n  0xc1, 0xe7, 0x6c, 0x44, 0xfd, 0x4c, 0x3b, 0xfb, 0x8d, 0xe0, 0x05, 0x29, 0x21, 0x05, 0xcb, 0xa1, \n  0x04, 0xb1, 0xe3, 0xed, 0x0c, 0x73, 0xef, 0x2c, 0xe2, 0xff, 0xd1, 0x4b, 0xfe, 0x54, 0xc8, 0x00, \n  0x6d, 0x0e, 0xf8, 0x0d, 0x37, 0xfd, 0x94, 0x1f, 0x00, 0xd5, 0xcf, 0xfb, 0xe3, 0x8c, 0x00, 0x97, \n  0xcc, 0xfe, 0xba, 0xb1, 0x03, 0xee, 0xf5, 0xfd, 0x64, 0x1c, 0xfb, 0x97, 0xb3, 0x00, 0xbe, 0x0c, \n  0xfc, 0x7d, 0x5f, 0xff, 0x73, 0x51, 0x01, 0xd3, 0x34, 0x00, 0xbd, 0x2a, 0xfe, 0xdb, 0x55, 0xff, \n  0x3d, 0x2f, 0x03, 0xc4, 0x3f, 0xfe, 0xf6, 0xf3, 0x60, 0x53, 0x35, 0x57, 0x37, 0x7c, 0xe4, 0x11, \n  0xbe, 0xe4, 0x14, 0x01, 0xfa, 0xb1, 0xa9, 0xfb, 0x41, 0x70, 0x08, 0x39, 0xe2, 0x04, 0xeb, 0xc1, \n  0x04, 0x05, 0x84, 0xed, 0xb5, 0x2c, 0xee, 0xd2, 0x9b, 0xfe, 0x34, 0x7c, 0xfd, 0x68, 0x83, 0x02, \n  0x3d, 0xdd, 0xf8, 0x8b, 0x1f, 0xfd, 0xb3, 0xd4, 0x00, 0x76, 0xac, 0xfb, 0x3e, 0x24, 0x00, 0xdd, \n  0x72, 0xfe, 0x18, 0x5b, 0x04, 0x19, 0xa2, 0xfe, 0xea, 0xce, 0xfa, 0x80, 0x04, 0x01, 0xef, 0x6a, \n  0xfc, 0x35, 0x3b, 0xff, 0xaa, 0xe4, 0x00, 0x9b, 0xf5, 0xff, 0xe5, 0x72, 0xfd, 0x23, 0xfd, 0xfd, \n  0x89, 0x6c, 0x03, 0x05, 0x59, 0xff, 0x7a, 0x59, 0x65, 0x39, 0xbc, 0x59, 0x48, 0x57, 0xe3, 0xdc, \n  0x0e, 0xe3, 0x9a, 0x59, 0xf4, 0x32, 0x0b, 0xfa, 0x41, 0x03, 0x0c, 0xc8, 0x42, 0x05, 0x75, 0x89, \n  0x04, 0xa8, 0xe8, 0xec, 0xfe, 0xb2, 0xec, 0x7a, 0x8e, 0xfc, 0x03, 0x41, 0xfd, 0xb7, 0x82, 0x05, \n  0x19, 0x71, 0xf9, 0x64, 0x39, 0xfd, 0x26, 0x8a, 0x01, 0x32, 0xa9, 0xfa, 0xdf, 0xc7, 0xff, 0x3d, \n  0xcd, 0xfe, 0xf9, 0xc3, 0x04, 0x9f, 0x11, 0xff, 0xa7, 0xa3, 0xfb, 0x37, 0x02, 0x01, 0x4c, 0x2b, \n  0xfb, 0x43, 0xf6, 0xfe, 0x56, 0x70, 0x00, 0xd7, 0x11, 0xff, 0xe6, 0x4f, 0xfd, 0x48, 0xa6, 0xfd, \n  0xe2, 0x4d, 0x03, 0x90, 0x28, 0x00, 0x6f, 0xaf, 0x68, 0x46, 0x87, 0x5a, 0x38, 0xbd, 0xe3, 0x5b, \n  0x16, 0xe3, 0xe1, 0x2c, 0xee, 0x63, 0xe1, 0xf7, 0xeb, 0xbb, 0x0e, 0x1d, 0xc1, 0x05, 0x00, 0x22, \n  0x04, 0x5b, 0x09, 0xec, 0x99, 0x0b, 0xec, 0x8c, 0x23, 0xfb, 0x67, 0xc3, 0xfd, 0x5a, 0x03, 0x08, \n  0x79, 0xda, 0xf9, 0xd4, 0x61, 0xfd, 0xb1, 0x14, 0x01, 0xe9, 0x08, 0xfa, 0x16, 0x62, 0x00, 0x0b, \n  0xcd, 0xfe, 0xcd, 0xd9, 0x04, 0x62, 0x4e, 0x00, 0xd5, 0xc9, 0xfb, 0x72, 0x4d, 0xff, 0x72, 0x75, \n  0xfa, 0xc9, 0xd7, 0xfe, 0x33, 0x87, 0xff, 0xfe, 0xfb, 0xfe, 0x6c, 0x2d, 0xfe, 0xb1, 0x99, 0xfd, \n  0xfe, 0x89, 0x02, 0xd2, 0xf3, 0x00, 0x5f, 0x48, 0x6a, 0xb3, 0x55, 0x5b, 0x1a, 0x9d, 0xe6, 0x9b, \n  0xb8, 0xe3, 0x13, 0xf3, 0xe6, 0xcd, 0xf0, 0xf3, 0xb9, 0xc4, 0x10, 0xcd, 0xf8, 0x06, 0x69, 0xf1, \n  0x02, 0x03, 0xa0, 0xeb, 0x5e, 0x11, 0xed, 0x3a, 0x95, 0xf9, 0x85, 0x14, 0xfe, 0x70, 0x24, 0x0b, \n  0x05, 0x2b, 0xfa, 0x65, 0x46, 0xfc, 0x20, 0xee, 0x00, 0x15, 0x76, 0xfa, 0xd0, 0x92, 0x00, 0x2c, \n  0x7b, 0xff, 0xbb, 0x63, 0x05, 0x1e, 0x87, 0xff, 0x7d, 0xfa, 0xfa, 0xfa, 0x5f, 0xfe, 0x0b, 0x47, \n  0xf9, 0xb2, 0x8a, 0xfe, 0xc8, 0xe6, 0xff, 0xb2, 0x69, 0xff, 0x9c, 0xb3, 0xfe, 0xad, 0xb1, 0xfd, \n  0xa6, 0x6f, 0x02, 0x49, 0x0b, 0x01, 0x5e, 0x29, 0x69, 0x1e, 0x19, 0x5d, 0x9d, 0x99, 0xea, 0xcd, \n  0xe7, 0xe4, 0x88, 0xc4, 0xe1, 0x86, 0x29, 0xee, 0xde, 0xfa, 0x11, 0xfb, 0x0b, 0x08, 0x5c, 0x9b, \n  0x01, 0x85, 0xaf, 0xed, 0x29, 0x26, 0xee, 0x53, 0x32, 0xf8, 0xa5, 0x92, 0xfe, 0x6c, 0x08, 0x0d, \n  0x17, 0x1b, 0xfa, 0x55, 0x41, 0xfb, 0xdc, 0x9f, 0x01, 0x83, 0xf5, 0xfa, 0xbf, 0xcf, 0x01, 0x7b, \n  0xb0, 0xff, 0xfa, 0xe6, 0x02, 0xad, 0x6b, 0xff, 0xdf, 0x14, 0xfb, 0xaa, 0xef, 0xfc, 0x42, 0x33, \n  0xf9, 0xd4, 0x58, 0xff, 0x9a, 0x2f, 0x00, 0xae, 0x3f, 0xff, 0xff, 0x97, 0xff, 0x98, 0x52, 0xfe, \n  0x31, 0x74, 0x01, 0x22, 0x35, 0x00, 0x81, 0x46, 0x69, 0x5d, 0xf9, 0x5a, 0x14, 0xc8, 0xef, 0x78, \n  0x87, 0xe8, 0xa3, 0x5f, 0xda, 0x49, 0x4a, 0xe8, 0xe9, 0x3c, 0x11, 0xa6, 0x64, 0x09, 0x17, 0x99, \n  0x02, 0x60, 0xb5, 0xef, 0x75, 0x25, 0xf0, 0xe6, 0xf8, 0xf6, 0xd8, 0xd1, 0xfe, 0x91, 0x22, 0x0e, \n  0x51, 0x95, 0xf9, 0x47, 0xe6, 0xfa, 0xf9, 0xbc, 0x03, 0x59, 0xb7, 0xfc, 0x15, 0x1b, 0x00, 0x89, \n  0x3c, 0xfe, 0xae, 0xa5, 0x01, 0xb6, 0xc0, 0xfe, 0x44, 0x81, 0xfb, 0xe6, 0xc6, 0xfc, 0x7e, 0xe1, \n  0xf9, 0x96, 0xca, 0xff, 0x56, 0x2f, 0x00, 0x36, 0x02, 0x00, 0x73, 0xbf, 0xff, 0x19, 0xd1, 0xfd, \n  0x4c, 0x77, 0x01, 0xab, 0x59, 0x00, 0xe0, 0x80, 0x66, 0x20, 0x88, 0x5a, 0x1f, 0x4a, 0xf5, 0xbd, \n  0x8a, 0xeb, 0xbd, 0xe5, 0xd5, 0x5f, 0x89, 0xe1, 0x73, 0x6a, 0x0f, 0xc9, 0xa9, 0x0c, 0xa1, 0x70, \n  0x04, 0xf7, 0x1c, 0xf1, 0x85, 0x16, 0xf2, 0x52, 0x6c, 0xf6, 0xf4, 0xf8, 0xfd, 0xeb, 0x0b, 0x0e, \n  0x7c, 0x36, 0xfa, 0x7d, 0xec, 0xfc, 0xb8, 0xa0, 0x04, 0xc6, 0xeb, 0xfa, 0x48, 0x29, 0xff, 0x87, \n  0xcf, 0xfd, 0x0b, 0x22, 0x00, 0x29, 0x9c, 0xff, 0xad, 0x8e, 0xfc, 0x6e, 0xa0, 0xfc, 0x11, 0x96, \n  0xfa, 0x2e, 0x68, 0x00, 0x57, 0x37, 0x00, 0xe4, 0x2f, 0xff, 0x89, 0xf3, 0xff, 0xc4, 0xe5, 0xfe, \n  0x7e, 0x36, 0x01, 0x4a, 0x9f, 0xff, 0x9c, 0x46, 0x65, 0x9b, 0x73, 0x57, 0x10, 0xef, 0xf8, 0xfd, \n  0x75, 0xef, 0xba, 0x25, 0xd1, 0x0f, 0x4b, 0xdb, 0x41, 0xcc, 0x0e, 0x9b, 0x8d, 0x10, 0x24, 0x4c, \n  0x05, 0x84, 0x28, 0xf2, 0xf4, 0x1d, 0xf5, 0x71, 0xb5, 0xf4, 0xb0, 0x0f, 0xfc, 0x54, 0x07, 0x10, \n  0x41, 0xe9, 0xfb, 0x9d, 0x37, 0xfc, 0x96, 0x0d, 0x04, 0x7f, 0xc4, 0xf9, 0xf1, 0xc5, 0xfd, 0x64, \n  0x60, 0xfe, 0xae, 0xf2, 0xff, 0xd1, 0xed, 0xff, 0xa8, 0x44, 0xfd, 0x73, 0x22, 0xfd, 0xf6, 0xd0, \n  0xfb, 0x38, 0x86, 0xff, 0xac, 0x1e, 0xff, 0xc1, 0xd2, 0xff, 0xed, 0xc8, 0x00, 0x0d, 0x9a, 0xfe, \n  0xe2, 0xac, 0x00, 0xd8, 0x01, 0x00, 0x5e, 0x76, 0x62, 0xae, 0xa9, 0x53, 0xe3, 0x50, 0xfc, 0xf9, \n  0x18, 0xf4, 0x67, 0xa9, 0xcc, 0x1d, 0x7f, 0xd6, 0xbe, 0x33, 0x0f, 0x6d, 0x9c, 0x12, 0x6a, 0x42, \n  0x07, 0x2d, 0xd1, 0xf4, 0xf2, 0xb1, 0xf5, 0x09, 0x80, 0xf2, 0xf3, 0x04, 0xfe, 0xdc, 0xe0, 0x10, \n  0x70, 0x19, 0xfa, 0xb7, 0xf5, 0xfc, 0xda, 0x1f, 0x02, 0xb4, 0x13, 0xf8, 0xeb, 0xe2, 0xff, 0x84, \n  0xc0, 0xfe, 0xbc, 0xdc, 0xfe, 0x85, 0x0f, 0x01, 0x47, 0xf9, 0xfe, 0xe2, 0x47, 0xfd, 0xa6, 0xe9, \n  0xfa, 0x7e, 0x12, 0xff, 0x24, 0xe3, 0xff, 0x31, 0xc2, 0xff, 0x1a, 0x72, 0x00, 0xd3, 0xde, 0xfe, \n  0x52, 0xcd, 0x00, 0x2f, 0x3a, 0x00, 0x8a, 0xa9, 0x5f, 0x04, 0xd5, 0x4e, 0xdd, 0x04, 0xff, 0x47, \n  0x5a, 0xf6, 0x02, 0xa4, 0xcb, 0xd1, 0xf3, 0xd5, 0x35, 0x0f, 0x0d, 0x25, 0x2b, 0x15, 0xba, 0x29, \n  0x09, 0x94, 0x62, 0xf4, 0xff, 0xd9, 0xf7, 0xc2, 0x84, 0xf2, 0xe2, 0x24, 0xfd, 0xed, 0xce, 0x10, \n  0x84, 0xae, 0xf9, 0xa9, 0x4b, 0xfb, 0x29, 0x90, 0x01, 0xce, 0xc6, 0xf9, 0x37, 0x39, 0x00, 0x05, \n  0x7a, 0xfe, 0x8c, 0xa2, 0xff, 0x18, 0x3a, 0x02, 0x5c, 0x74, 0xfe, 0xf2, 0x79, 0xfc, 0xa2, 0xf0, \n  0xfb, 0x37, 0x68, 0xff, 0xb4, 0x0a, 0xff, 0xe5, 0x88, 0xff, 0xa4, 0x09, 0x01, 0x38, 0xf3, 0xfe, \n  0xa2, 0xc3, 0x00, 0xdc, 0x23, 0x00, 0xf3, 0xe5, 0x59, 0xee, 0x5e, 0x49, 0x88, 0x70, 0x01, 0xfa, \n  0xcf, 0xf9, 0x35, 0x44, 0xce, 0x66, 0x70, 0xd5, 0x02, 0x17, 0x0b, 0x42, 0xa5, 0x15, 0x82, 0x00, \n  0x0a, 0xfb, 0x71, 0xf8, 0xf9, 0x93, 0xf7, 0x23, 0xc4, 0xef, 0x72, 0x57, 0xff, 0xbe, 0xeb, 0x0e, \n  0x75, 0xa0, 0xf7, 0x62, 0x60, 0xfc, 0x54, 0xe7, 0x01, 0x7b, 0x56, 0xfa, 0x22, 0xbd, 0x00, 0xed, \n  0x36, 0x00, 0x4d, 0x78, 0xff, 0x44, 0xc3, 0x00, 0x4e, 0x09, 0xff, 0xc8, 0x4d, 0xfd, 0x21, 0x7e, \n  0xfc, 0xbb, 0x96, 0xfe, 0x46, 0x53, 0xfe, 0x02, 0x49, 0x00, 0x94, 0x84, 0x01, 0xd2, 0x64, 0xfe, \n  0x4c, 0x33, 0x00, 0x1a, 0x32, 0x01, 0xef, 0x72, 0x54, 0x65, 0x9e, 0x43, 0x06, 0x55, 0x02, 0xba, \n  0x2a, 0xfe, 0x55, 0x60, 0xd2, 0x41, 0x34, 0xd6, 0x03, 0x10, 0x08, 0xb6, 0xab, 0x15, 0x48, 0xef, \n  0x0c, 0x11, 0x29, 0xf8, 0x81, 0xa7, 0xf6, 0x2c, 0x52, 0xf0, 0x57, 0xd5, 0xfe, 0x54, 0xd8, 0x0d, \n  0x1a, 0x5a, 0xf7, 0xa5, 0x21, 0xfd, 0xe7, 0x0d, 0x02, 0x05, 0xcb, 0xfa, 0x09, 0xf7, 0x02, 0x97, \n  0xb3, 0xff, 0xd5, 0x6e, 0xfd, 0xef, 0xe2, 0x01, 0x51, 0xf0, 0xff, 0x34, 0xd8, 0xfc, 0x85, 0xb1, \n  0xfc, 0xfe, 0x42, 0xfe, 0xff, 0x38, 0xfe, 0xc5, 0x1b, 0x01, 0xe7, 0xf5, 0x00, 0xb8, 0x64, 0xfd, \n  0x46, 0x57, 0x01, 0xcf, 0x0f, 0x02, 0x49, 0xa3, 0x4d, 0x6d, 0x9e, 0x3b, 0x5a, 0x5e, 0x03, 0x84, \n  0x28, 0x05, 0xe4, 0x24, 0xd7, 0x25, 0x25, 0xd6, 0xea, 0x7c, 0x08, 0x92, 0x65, 0x15, 0xd4, 0x4c, \n  0x0a, 0x66, 0x0e, 0xfa, 0x60, 0xf1, 0xf6, 0x27, 0xc1, 0xee, 0xd0, 0x18, 0x01, 0xf9, 0x8d, 0x0c, \n  0x77, 0x25, 0xf6, 0x25, 0xa3, 0xfe, 0x5d, 0xbc, 0x02, 0x60, 0x8a, 0xfc, 0xcf, 0x91, 0x02, 0x10, \n  0x2d, 0xfe, 0xb7, 0x1a, 0xfe, 0x83, 0xf6, 0x02, 0x4d, 0x7f, 0xff, 0x83, 0x47, 0xfc, 0x9c, 0xab, \n  0xfd, 0x68, 0x4d, 0xfe, 0x89, 0x1d, 0xfe, 0x5e, 0x14, 0x01, 0xb2, 0x49, 0x00, 0x16, 0xd5, 0xfd, \n  0xfa, 0xff, 0x01, 0x68, 0x0c, 0x02, 0xdc, 0x67, 0x45, 0xb7, 0x1c, 0x36, 0xac, 0x8b, 0x06, 0xb8, \n  0x48, 0x08, 0x28, 0xdc, 0xda, 0x0f, 0x0e, 0xdb, 0x44, 0xff, 0x07, 0x57, 0x72, 0x10, 0x1c, 0x0d, \n  0x0a, 0xea, 0x53, 0xfb, 0xd3, 0xe4, 0xf5, 0xce, 0x05, 0xf1, 0xba, 0x91, 0x01, 0x54, 0x2a, 0x0a, \n  0xd2, 0x9b, 0xf6, 0x4e, 0x3c, 0x00, 0x6c, 0xaf, 0x03, 0x62, 0xb5, 0xfb, 0x43, 0xca, 0x01, 0x56, \n  0xfd, 0xfe, 0x77, 0x80, 0xfe, 0xe0, 0xb7, 0x02, 0x3f, 0xec, 0xfe, 0x86, 0xae, 0xfc, 0xb0, 0xb5, \n  0xfe, 0x8f, 0xf2, 0xfd, 0x57, 0x93, 0xfd, 0x40, 0x77, 0x01, 0xed, 0x5a, 0x00, 0xda, 0x65, 0xfd, \n  0x96, 0x6d, 0x02, 0x73, 0x2a, 0x02, 0x64, 0xc4, 0x41, 0xf2, 0x61, 0x34, 0x21, 0x60, 0x03, 0x14, \n  0x5b, 0x00, 0x8d, 0x02, 0xda, 0x73, 0xc4, 0xe6, 0xf1, 0x0f, 0x13, 0x68, 0x9c, 0x0d, 0xad, 0xba, \n  0x01, 0x9e, 0xaa, 0xf8, 0x0c, 0x98, 0xfa, 0x7d, 0x2f, 0xf5, 0x62, 0xee, 0xfe, 0xa5, 0x7f, 0x09, \n  0x25, 0x95, 0xf7, 0xea, 0x0f, 0xff, 0x28, 0xbd, 0x03, 0x1c, 0x15, 0xfc, 0x05, 0x0b, 0x01, 0x33, \n  0x2a, 0xff, 0xaf, 0xc0, 0xff, 0xe5, 0x99, 0x01, 0x7f, 0xc2, 0xfe, 0x0f, 0x7e, 0xfd, 0x01, 0x90, \n  0xfd, 0xeb, 0x26, 0xff, 0xbf, 0x07, 0xff, 0x10, 0xb9, 0xff, 0x38, 0x24, 0x00, 0xec, 0x86, 0xff, \n  0xad, 0xd0, 0xff, 0x89, 0x4c, 0xfe, 0x30, 0x6c, 0x35, 0x65, 0xbf, 0x32, 0xdc, 0xba, 0x0e, 0xb2, \n  0xc7, 0x04, 0xa7, 0x6f, 0xdc, 0xde, 0xfb, 0xe0, 0x6b, 0x37, 0x08, 0xf2, 0xf6, 0x0b, 0x28, 0x9e, \n  0x08, 0xbc, 0x2e, 0x00, 0x6c, 0xd5, 0xfa, 0xad, 0x5c, 0xf4, 0x6b, 0xf9, 0xfb, 0x71, 0x5a, 0x05, \n  0x95, 0x47, 0xfa, 0xef, 0xdc, 0x01, 0xfa, 0x4b, 0x04, 0x99, 0x9e, 0xfb, 0x3b, 0x1c, 0x01, 0xe7, \n  0xc1, 0x00, 0xea, 0xc2, 0xfe, 0x04, 0x02, 0x01, 0x72, 0xd2, 0x00, 0x3b, 0x3c, 0xfe, 0xa8, 0x24, \n  0xfe, 0xdf, 0x9b, 0x00, 0x05, 0x07, 0xfd, 0xc2, 0x5c, 0xfd, 0xa7, 0x54, 0x00, 0xc0, 0x93, 0xfe, \n  0x2e, 0x65, 0x00, 0x28, 0x25, 0x01, 0x90, 0xdc, 0x2b, 0xd5, 0x78, 0x2d, 0x78, 0x80, 0x11, 0x6d, \n  0xc5, 0x06, 0x6c, 0xdc, 0xe4, 0x75, 0x65, 0xe5, 0x39, 0xf9, 0x03, 0x58, 0xc3, 0x09, 0x43, 0x72, \n  0x07, 0xea, 0x4d, 0x00, 0x78, 0x76, 0xfc, 0x36, 0x19, 0xf7, 0x72, 0xd3, 0xfb, 0x4f, 0x92, 0x03, \n  0x76, 0x53, 0xfc, 0x81, 0xc1, 0x01, 0x8e, 0x50, 0x03, 0xa1, 0x71, 0xfc, 0x5f, 0xd8, 0x00, 0x86, \n  0x17, 0x01, 0x09, 0xdc, 0xfe, 0x44, 0xe2, 0x00, 0x1e, 0x43, 0x01, 0x89, 0xc6, 0xfe, 0x7b, 0xf6, \n  0xfe, 0xba, 0xab, 0x00, 0x6c, 0x43, 0xfd, 0x1b, 0xbe, 0xfd, 0xd5, 0x9a, 0x00, 0x66, 0x24, 0xff, \n  0x2f, 0x06, 0x00, 0xa3, 0x23, 0x01, 0x4c, 0x2b, 0x24, 0x0b, 0xe3, 0x28, 0x0c, 0x9c, 0x12, 0x78, \n  0x72, 0x08, 0x5a, 0xef, 0xeb, 0xfb, 0xe0, 0xe8, 0x0e, 0x66, 0x01, 0xa0, 0xbb, 0x07, 0xc0, 0xd8, \n  0x05, 0xd2, 0xed, 0x00, 0xfe, 0x29, 0xfe, 0x27, 0x15, 0xf9, 0x24, 0xd4, 0xfb, 0x1a, 0xb5, 0x02, \n  0xbe, 0xaf, 0xfd, 0xa9, 0x3c, 0x01, 0xf4, 0xaf, 0x02, 0xfd, 0x4f, 0xfd, 0xc1, 0xbe, 0x00, 0x48, \n  0x39, 0x01, 0x87, 0x2c, 0xff, 0xe2, 0xdd, 0x00, 0xc5, 0x98, 0x01, 0x53, 0x9c, 0xff, 0x3a, 0x3a, \n  0xff, 0x3d, 0xd4, 0x00, 0x2e, 0x80, 0xfe, 0x58, 0x31, 0xfe, 0x8d, 0x53, 0x00, 0x5e, 0x04, 0xff, \n  0xd3, 0x88, 0xff, 0x7d, 0xf9, 0x00, 0xc1, 0x6c, 0x1e, 0x4b, 0xae, 0x24, 0x50, 0xeb, 0x12, 0x80, \n  0x4b, 0x09, 0x02, 0xba, 0xf0, 0x64, 0x2d, 0xec, 0x1b, 0x18, 0x00, 0x11, 0xde, 0x05, 0x7e, 0x95, \n  0x04, 0x1d, 0xa4, 0x01, 0x1b, 0x4c, 0xff, 0x20, 0x9c, 0xfa, 0xb4, 0x33, 0xfc, 0xf5, 0xfe, 0x01, \n  0xa3, 0x79, 0xfe, 0x3b, 0xc0, 0x00, 0x1c, 0x4f, 0x02, 0xc0, 0x20, 0xfe, 0x2d, 0x8c, 0x00, 0x99, \n  0x52, 0x01, 0xf4, 0x9d, 0xff, 0x80, 0xeb, 0x00, 0x7c, 0xd4, 0x01, 0x31, 0x7f, 0x00, 0x26, 0x08, \n  0x00, 0x1b, 0x0c, 0x01, 0xa2, 0xde, 0xfe, 0x5d, 0xed, 0xfd, 0x61, 0x9e, 0xff, 0x3d, 0xe3, 0xfe, \n  0x6b, 0xef, 0xfe, 0x26, 0x3c, 0x00, 0xda, 0x62, 0x1a, 0xc7, 0xb3, 0x21, 0xa9, 0x6a, 0x12, 0xa6, \n  0x13, 0x09, 0x6a, 0x49, 0xf4, 0x43, 0x84, 0xef, 0x2e, 0xa2, 0xff, 0xb4, 0x7b, 0x04, 0xf6, 0x1b, \n  0x04, 0xe0, 0x2b, 0x02, 0x5a, 0x00, 0x00, 0x37, 0x1e, 0xfc, 0x3c, 0xe1, 0xfc, 0x91, 0xb7, 0x01, \n  0x9b, 0xee, 0xfe, 0x4b, 0xa5, 0x00, 0x33, 0x66, 0x02, 0x65, 0xce, 0xfe, 0xfb, 0xb7, 0x00, 0xe5, \n  0x71, 0x01, 0x86, 0x44, 0x00, 0x7b, 0xec, 0x01, 0x6a, 0x8c, 0x02, 0x94, 0x00, 0x01, 0xc7, 0x13, \n  0x00, 0x72, 0xab, 0x00, 0x32, 0xe8, 0xfe, 0xa5, 0xc6, 0xfd, 0xc8, 0x18, 0xff, 0x8d, 0xb2, 0xfe, \n  0xcc, 0xc5, 0xfe, 0xa3, 0x37, 0x00, 0xe0, 0x65, 0x17, 0xb7, 0xd9, 0x1e, 0x1c, 0xd9, 0x11, 0x40, \n  0x99, 0x08, 0x7a, 0x29, 0xf6, 0xc0, 0x04, 0xf2, 0xd0, 0x82, 0xff, 0x8c, 0x85, 0x03, 0x9e, 0x95, \n  0x03, 0xcd, 0x63, 0x02, 0x35, 0x8d, 0x00, 0x69, 0x36, 0xfd, 0x88, 0x6f, 0xfd, 0x1b, 0x23, 0x01, \n  0x00, 0x24, 0xff, 0x5d, 0xd9, 0x00, 0x72, 0x36, 0x02, 0x6b, 0x0e, 0xff, 0x92, 0xf9, 0x00, 0x3f, \n  0x2a, 0x02, 0xd1, 0x19, 0x01, 0x9f, 0xe4, 0x01, 0xfc, 0xfa, 0x01, 0xa1, 0x65, 0x00, 0x42, 0x9d, \n  0xff, 0xb9, 0x46, 0x00, 0x95, 0x92, 0xfe, 0x4f, 0x72, 0xfd, 0x93, 0xd8, 0xfe, 0x23, 0x9d, 0xfe, \n  0xae, 0x5c, 0xfe, 0xb2, 0xf8, 0xff, 0x31, 0x5c, 0x15, 0xc0, 0x22, 0x1d, 0xa7, 0xe5, 0x10, 0xe9, \n  0x7f, 0x07, 0x8f, 0xea, 0xf7, 0xfb, 0x62, 0xf4, 0x3b, 0xb3, 0xff, 0xb5, 0x2f, 0x03, 0x71, 0x94, \n  0x03, 0x4d, 0xcb, 0x02, 0xd9, 0x06, 0x01, 0x95, 0x47, 0xfe, 0xf8, 0x21, 0xfe, 0x5c, 0xf8, 0x00, \n  0x76, 0x98, 0xff, 0x1c, 0x13, 0x01, 0x45, 0x98, 0x02, 0xb2, 0x1f, 0x00, 0xc4, 0x4f, 0x01, 0xd4, \n  0x1f, 0x02, 0xbd, 0xfc, 0x00, 0xc8, 0x4b, 0x01, 0x7d, 0x5d, 0x01, 0xd3, 0x3f, 0x00, 0xb9, 0x6c, \n  0xff, 0x0b, 0x08, 0x00, 0x09, 0x00, 0xff, 0x31, 0x9e, 0xfd, 0x08, 0x6c, 0xfe, 0xb4, 0x80, 0xfe, \n  0xe3, 0x94, 0xfe, 0xf7, 0xf3, 0xff, 0x57, 0x01, 0x14, 0xac, 0xf9, 0x1b, 0xee, 0xdb, 0x0f, 0xa7, \n  0x2d, 0x06, 0x27, 0x47, 0xf9, 0x30, 0x65, 0xf6, 0xc7, 0x0c, 0x00, 0x54, 0x76, 0x03, 0x21, 0xd6, \n  0x03, 0x21, 0x1b, 0x03, 0x57, 0x6d, 0x01, 0x5f, 0x17, 0xff, 0x52, 0xe2, 0xfe, 0xa0, 0xeb, 0x00, \n  0x66, 0x4d, 0x00, 0x5c, 0xea, 0x01, 0x44, 0x91, 0x02, 0xe0, 0x04, 0x00, 0x69, 0x9d, 0x00, 0x1b, \n  0x7d, 0x01, 0x9b, 0x0f, 0x01, 0x5d, 0xe1, 0x00, 0x6e, 0xc8, 0x00, 0x64, 0x67, 0x00, 0xbb, 0xb3, \n  0xff, 0x54, 0xf4, 0xff, 0x9d, 0xf9, 0xfe, 0x60, 0xb2, 0xfd, 0x58, 0x7e, 0xfe, 0x5a, 0x4d, 0xfe, \n  0x8d, 0xb3, 0xfe, 0x74, 0x21, 0x01, 0x86, 0xf8, 0x12, 0x14, 0x5d, 0x1b, 0xe0, 0xf5, 0x0e, 0xc9, \n  0xa7, 0x04, 0x98, 0x55, 0xfa, 0xc3, 0x36, 0xf8, 0xa3, 0x86, 0x00, 0x3a, 0x27, 0x04, 0x89, 0x1d, \n  0x04, 0x8f, 0x25, 0x03, 0xbf, 0xea, 0x01, 0x59, 0x72, 0xff, 0x6b, 0x91, 0xff, 0x76, 0x9b, 0x01, \n  0xe5, 0x30, 0x00, 0x26, 0x44, 0x01, 0x16, 0xf5, 0x01, 0xeb, 0xb1, 0xff, 0x0c, 0xe8, 0xff, 0xd7, \n  0xd9, 0x00, 0x64, 0x34, 0x01, 0x5d, 0xd0, 0x00, 0x50, 0x7d, 0x00, 0xbc, 0x89, 0x00, 0x63, 0xbb, \n  0xff, 0x1b, 0x86, 0xff, 0xd8, 0x56, 0xff, 0xd9, 0x3b, 0xfe, 0x77, 0xb1, 0xfd, 0xc8, 0xf9, 0xfe, \n  0x8c, 0x51, 0x00, 0xc7, 0x13, 0x00, 0xd2, 0x50, 0x12, 0x8c, 0x38, 0x1b, 0xf5, 0x49, 0x0e, 0x51, \n  0xa5, 0x03, 0xc9, 0x5f, 0xfb, 0x2f, 0xd8, 0xf9, 0xbe, 0x34, 0x01, 0xf3, 0xdf, 0x04, 0xbc, 0xbe, \n  0x04, 0x91, 0xf8, 0x02, 0xeb, 0x7c, 0x02, 0x84, 0x68, 0x00, 0x62, 0xff, 0xfe, 0x0d, 0x40, 0x01, \n  0xf7, 0x22, 0x00, 0xbc, 0x9a, 0x00, 0x58, 0xca, 0x01, 0x3a, 0x98, 0xff, 0xb4, 0x7c, 0xff, 0x53, \n  0x69, 0x00, 0x6a, 0x6c, 0x01, 0x2a, 0x63, 0x01, 0x90, 0x2d, 0x00, 0xcb, 0x44, 0x00, 0x7b, 0x46, \n  0x00, 0xde, 0x16, 0x00, 0x5b, 0xfe, 0xfe, 0x8b, 0x7d, 0xfe, 0x29, 0x9d, 0xff, 0x93, 0xe1, 0xfe, \n  0xa2, 0xa9, 0xfe, 0xe3, 0x00, 0x00, 0x53, 0x15, 0x12, 0xc9, 0x15, 0x1b, 0x08, 0xd4, 0x0d, 0x96, \n  0x3f, 0x03, 0xfe, 0x5c, 0xfc, 0xa5, 0xdf, 0xfa, 0xa8, 0x83, 0x01, 0x7c, 0xff, 0x04, 0xde, 0x11, \n  0x05, 0xd8, 0x60, 0x03, 0x18, 0x2d, 0x02, 0x0c, 0x4c, 0x00, 0xc8, 0x5b, 0xfe, 0x02, 0x1d, 0x00, \n  0x87, 0x73, 0x00, 0xe0, 0x87, 0x00, 0x9f, 0x51, 0x01, 0x99, 0x9d, 0xff, 0x67, 0xf6, 0xfe, 0xf8, \n  0x6f, 0x00, 0x27, 0x6b, 0x01, 0xc0, 0xf5, 0x00, 0x60, 0x4d, 0x00, 0xf6, 0x82, 0x00, 0x5e, 0x96, \n  0x00, 0x04, 0x96, 0xff, 0x27, 0xa1, 0xff, 0x2c, 0x7c, 0x00, 0x15, 0x8c, 0xfe, 0x78, 0x50, 0xfd, \n  0xc0, 0xd3, 0xfe, 0x19, 0xe4, 0xff, 0xdd, 0xb6, 0x11, 0x5f, 0x3b, 0x1b, 0x21, 0x52, 0x0e, 0xec, \n  0x7a, 0x03, 0xe7, 0x2f, 0xfd, 0xa0, 0x51, 0xfb, 0xaf, 0xe9, 0x00, 0xdb, 0xc3, 0x04, 0x9b, 0xd4, \n  0x04, 0xd6, 0x27, 0x03, 0xf8, 0x69, 0x02, 0x58, 0x04, 0x00, 0x0b, 0x17, 0xfe, 0x20, 0xcc, 0xff, \n  0xd0, 0xc7, 0xff, 0x8d, 0x81, 0x00, 0x62, 0x57, 0x01, 0x7f, 0xb7, 0xff, 0x09, 0x2e, 0xff, 0x58, \n  0x04, 0x00, 0x44, 0x4e, 0x01, 0xb1, 0xaf, 0x00, 0xdd, 0x25, 0x00, 0xe6, 0x2d, 0x01, 0x94, 0xf7, \n  0xff, 0xaf, 0x41, 0x00, 0xfc, 0xcb, 0x01, 0xad, 0x04, 0xff, 0x17, 0x16, 0xfd, 0xa7, 0x4c, 0xfe, \n  0xd9, 0xae, 0xfe, 0x2e, 0x2b, 0xff, 0x4f, 0xd4, 0x11, 0x52, 0x07, 0x1c, 0x0b, 0x07, 0x0f, 0x53, \n  0x60, 0x03, 0x6b, 0x37, 0xfd, 0xe7, 0xa6, 0xfb, 0x43, 0x93, 0x00, 0x73, 0xc9, 0x03, 0x0e, 0x30, \n  0x04, 0xed, 0x87, 0x02, 0xae, 0xfc, 0x01, 0xfd, 0xe9, 0x00, 0xde, 0x6a, 0xfe, 0x9c, 0x1b, 0xff, \n  0x94, 0xc6, 0xff, 0xed, 0x15, 0x00, 0x1f, 0xdf, 0x00, 0x33, 0x40, 0x00, 0x5a, 0xbb, 0xff, 0x22, \n  0x31, 0x00, 0xa3, 0x92, 0x00, 0xf9, 0x51, 0x00, 0x3a, 0xc4, 0x00, 0xf0, 0x2e, 0x00, 0xf0, 0x25, \n  0x00, 0x0a, 0xbd, 0x02, 0xa2, 0xf0, 0x00, 0x60, 0x54, 0xfd, 0x37, 0xe7, 0xfd, 0x2c, 0x90, 0xfe, \n  0x44, 0x70, 0xfe, 0xe8, 0x33, 0xff, 0x5c, 0x15, 0x12, 0x68, 0x41, 0x1d, 0x96, 0x10, 0x10, 0xa4, \n  0xb9, 0x02, 0xb4, 0xac, 0xfc, 0x57, 0xcc, 0xfb, 0xd5, 0x56, 0x00, 0x29, 0xd6, 0x03, 0x1f, 0xc7, \n  0x03, 0x67, 0x2e, 0x01, 0x95, 0x71, 0x01, 0x41, 0xcb, 0x00, 0xa4, 0x6c, 0xfe, 0x9f, 0xdf, 0xff, \n  0x67, 0xe5, 0xff, 0xc0, 0xd2, 0xff, 0x74, 0x01, 0x01, 0xd0, 0xf9, 0xff, 0x32, 0xc7, 0xff, 0xa5, \n  0xbe, 0x00, 0x72, 0xa9, 0x00, 0x2f, 0x26, 0x00, 0x79, 0x42, 0x00, 0x76, 0xc5, 0xff, 0xb3, 0x2b, \n  0x01, 0xa1, 0x32, 0x03, 0xe7, 0xd9, 0xff, 0xe4, 0x6d, 0xfd, 0x92, 0x71, 0xfe, 0x00, 0x5f, 0xfe, \n  0xf1, 0xb6, 0xfe, 0x19, 0xdc, 0xff, 0x50, 0x0c, 0x12, 0xff, 0xc7, 0x1e, 0x8c, 0x72, 0x11, 0x75, \n  0x05, 0x02, 0x83, 0xed, 0xfb, 0x16, 0x2a, 0xfb, 0x5c, 0x08, 0x00, 0xbb, 0xae, 0x04, 0x5b, 0x01, \n  0x04, 0x64, 0x8e, 0x00, 0x53, 0x96, 0x00, 0x5b, 0xc3, 0xff, 0x91, 0xc4, 0xfd, 0xe6, 0x76, 0xff, \n  0x4a, 0x51, 0x00, 0xd6, 0xe7, 0x00, 0xab, 0x31, 0x01, 0x3e, 0xd8, 0xff, 0xe1, 0xd1, 0xff, 0x4a, \n  0x50, 0x00, 0x80, 0x78, 0x00, 0xd4, 0xa0, 0x00, 0x80, 0x65, 0x00, 0x08, 0x36, 0xff, 0x25, 0x16, \n  0x01, 0xeb, 0x74, 0x03, 0x9d, 0x54, 0xff, 0xea, 0x3d, 0xfd, 0x49, 0x02, 0xff, 0x80, 0x66, 0xfe, \n  0x4a, 0xe7, 0xfe, 0x08, 0x9a, 0x00, 0xa1, 0x36, 0x12, 0xb5, 0x22, 0x20, 0x0a, 0x2c, 0x13, 0xef, \n  0xb0, 0x01, 0x04, 0x9d, 0xfa, 0xd8, 0x5c, 0xfa, 0x69, 0xea, 0xff, 0xc3, 0x90, 0x05, 0x7c, 0x9a, \n  0x04, 0x8e, 0x79, 0x00, 0xcf, 0x30, 0x00, 0x23, 0x31, 0xff, 0x24, 0x11, 0xfd, 0xcb, 0x48, 0xfe, \n  0x44, 0xd5, 0xff, 0x77, 0x1e, 0x01, 0x74, 0x9b, 0x01, 0xca, 0xbb, 0x00, 0x7f, 0x2a, 0x00, 0x61, \n  0x39, 0x00, 0x37, 0x39, 0x00, 0xb9, 0x57, 0x00, 0x2f, 0xa9, 0x00, 0xb0, 0x3e, 0xff, 0x10, 0xd7, \n  0x00, 0x31, 0x74, 0x03, 0x00, 0x1d, 0xff, 0x50, 0x0e, 0xfd, 0x64, 0x31, 0xff, 0xe1, 0x80, 0xfe, \n  0x0e, 0x41, 0xff, 0x2f, 0x22, 0x01, 0xe5, 0x77, 0x12, 0x3b, 0xf0, 0x21, 0xee, 0xc4, 0x14, 0xca, \n  0x63, 0x01, 0x8f, 0x7d, 0xf9, 0x07, 0xfe, 0xf8, 0xcd, 0xd8, 0xff, 0xcd, 0x8f, 0x06, 0x32, 0x0a, \n  0x05, 0x7f, 0x85, 0x00, 0xe5, 0xd0, 0xff, 0xed, 0xf2, 0xfe, 0x5e, 0xf1, 0xfc, 0x3b, 0xa8, 0xfd, \n  0x69, 0x05, 0xff, 0x8b, 0x91, 0x00, 0xa5, 0x55, 0x01, 0xe3, 0x72, 0x00, 0x20, 0x65, 0x00, 0x7a, \n  0x05, 0x01, 0xd3, 0xc0, 0x00, 0x77, 0x08, 0x00, 0xce, 0x88, 0x00, 0x88, 0x94, 0xff, 0x7d, 0xbd, \n  0xff, 0x3b, 0x0e, 0x03, 0xb2, 0x63, 0x00, 0x8a, 0xa7, 0xfc, 0xd5, 0x3d, 0xfe, 0xed, 0xbc, 0xfe, \n  0x53, 0x9e, 0xff, 0x38, 0x3e, 0x01, 0xa9, 0x06, 0x13, 0x25, 0xe8, 0x23, 0x60, 0xd0, 0x16, 0x65, \n  0xcd, 0x00, 0xb7, 0x55, 0xf7, 0xf6, 0x3e, 0xf8, 0x76, 0x31, 0x00, 0x21, 0x2d, 0x07, 0xa1, 0xf5, \n  0x05, 0xe2, 0x26, 0x00, 0xe9, 0xcb, 0xfe, 0x33, 0x4f, 0xff, 0x21, 0x0d, 0xfd, 0x4d, 0x0c, 0xfd, \n  0x31, 0xe3, 0xfe, 0x16, 0x18, 0x00, 0xab, 0xbf, 0x00, 0xbd, 0xf9, 0xff, 0x81, 0x7c, 0xff, 0x3a, \n  0xde, 0x00, 0xcb, 0x5b, 0x01, 0x70, 0x09, 0x00, 0xa0, 0xf7, 0x00, 0x4c, 0x65, 0x00, 0xa8, 0x83, \n  0xfe, 0xab, 0xee, 0x01, 0x15, 0xa6, 0x01, 0xfc, 0xfb, 0xfc, 0x80, 0x5e, 0xfd, 0xd9, 0xbd, 0xfe, \n  0x10, 0x74, 0xff, 0xd5, 0xf9, 0x00, 0xc4, 0xc8, 0x13, 0x2c, 0x3e, 0x26, 0x6a, 0x49, 0x19, 0x8f, \n  0x58, 0x00, 0xda, 0xe5, 0xf4, 0x93, 0x24, 0xf7, 0x9d, 0x67, 0x00, 0xd9, 0x01, 0x08, 0xd7, 0xbf, \n  0x06, 0x3e, 0x9b, 0xff, 0xed, 0xca, 0xfd, 0x3b, 0x88, 0xff, 0xa5, 0x94, 0xfd, 0x36, 0xb0, 0xfc, \n  0xc7, 0xbf, 0xfe, 0x26, 0x03, 0x00, 0xbc, 0x33, 0x00, 0xa1, 0xc4, 0xff, 0xde, 0xfb, 0xfe, 0x5c, \n  0x06, 0x00, 0x2f, 0x7c, 0x01, 0x1c, 0x23, 0x00, 0xc0, 0x2d, 0x00, 0xfe, 0x40, 0x01, 0x9b, 0x5b, \n  0xff, 0x2c, 0x28, 0x00, 0x19, 0xeb, 0x01, 0xd8, 0x05, 0xff, 0xf4, 0xca, 0xfc, 0xdb, 0x71, 0xfd, \n  0x2f, 0x3f, 0xff, 0x3f, 0x12, 0x01, 0xd7, 0x21, 0x14, 0x5f, 0xb3, 0x28, 0xc9, 0xdd, 0x1c, 0xb8, \n  0x0c, 0x00, 0xa3, 0x09, 0xf2, 0x48, 0xf4, 0xf5, 0x9c, 0x42, 0x00, 0xf4, 0xf6, 0x08, 0x8e, 0xdc, \n  0x07, 0x8f, 0xe9, 0xfe, 0x9f, 0x76, 0xfc, 0x42, 0x60, 0xff, 0x6e, 0x5b, 0xfe, 0xa9, 0x94, 0xfc, \n  0xd9, 0x73, 0xfe, 0xd5, 0x4b, 0x00, 0x27, 0xd8, 0xff, 0xd1, 0x4e, 0xff, 0x8d, 0xb4, 0xfe, 0x49, \n  0x5e, 0xff, 0x65, 0x59, 0x01, 0xd0, 0x92, 0x00, 0x4d, 0x56, 0xff, 0x3c, 0x77, 0x00, 0x43, 0x2c, \n  0x00, 0xe3, 0x82, 0xff, 0x60, 0x28, 0x01, 0x10, 0x14, 0x01, 0x5e, 0x07, 0xfe, 0x6a, 0x8d, 0xfc, \n  0x9a, 0x58, 0xfe, 0x09, 0x51, 0x00, 0xfb, 0xac, 0x14, 0x0b, 0x77, 0x2b, 0xdd, 0xbe, 0x20, 0x09, \n  0xbc, 0xff, 0x26, 0xaf, 0xee, 0x7d, 0x99, 0xf4, 0x85, 0x6b, 0x00, 0xdc, 0x0a, 0x0a, 0xa1, 0x0f, \n  0x09, 0x02, 0x17, 0xfe, 0xa1, 0xd1, 0xfa, 0x38, 0x2c, 0xff, 0xec, 0x25, 0xff, 0x1c, 0x91, 0xfc, \n  0xd5, 0x13, 0xfe, 0x41, 0x83, 0x00, 0x1d, 0xee, 0xff, 0xd2, 0xea, 0xfe, 0x09, 0x49, 0xfe, 0xf5, \n  0x1a, 0xff, 0xe2, 0xd6, 0x00, 0x34, 0xd0, 0x00, 0xaf, 0xda, 0xff, 0x17, 0x34, 0xff, 0xfa, 0x95, \n  0xff, 0x19, 0xc9, 0xff, 0x20, 0xd6, 0xff, 0x1e, 0x6e, 0x01, 0xdf, 0xd6, 0x00, 0xfe, 0x5d, 0xfd, \n  0x9d, 0xe0, 0xfc, 0xad, 0xb0, 0xff, 0xe3, 0xa5, 0x17, 0x21, 0x12, 0x30, 0x12, 0xc4, 0x21, 0x88, \n  0xe1, 0xfc, 0x16, 0x85, 0xeb, 0x0c, 0x5f, 0xf3, 0xe1, 0xa9, 0x01, 0xf7, 0x0c, 0x0c, 0xa7, 0x22, \n  0x09, 0x94, 0x3f, 0xfc, 0xdf, 0x62, 0xf9, 0x05, 0x21, 0xff, 0x70, 0x95, 0xff, 0x28, 0xa1, 0xfc, \n  0xd0, 0xc9, 0xfd, 0xf6, 0x78, 0x00, 0xb1, 0x04, 0x00, 0x47, 0x79, 0xfe, 0xa7, 0xe0, 0xfd, 0xf8, \n  0xff, 0xfe, 0x82, 0x7e, 0x00, 0x25, 0x97, 0x00, 0xca, 0x13, 0x00, 0x42, 0x03, 0xff, 0x71, 0x94, \n  0xfe, 0x70, 0x37, 0xff, 0xda, 0x7e, 0xff, 0xf9, 0xc0, 0x00, 0xd3, 0xe1, 0x01, 0x59, 0x91, 0xff, \n  0xf1, 0xed, 0xfc, 0x0f, 0x4a, 0xfe, 0xc6, 0x8b, 0x19, 0x3d, 0xdd, 0x33, 0x93, 0x8d, 0x24, 0xa4, \n  0x94, 0xfb, 0xc1, 0xd2, 0xe7, 0xe7, 0x02, 0xf2, 0x5f, 0xce, 0x02, 0x0c, 0x6d, 0x0d, 0x69, 0x89, \n  0x09, 0xdf, 0x14, 0xfb, 0x34, 0x82, 0xf7, 0xb8, 0xf7, 0xfe, 0x6e, 0xab, 0x00, 0xc4, 0x51, 0xfc, \n  0xc0, 0x6a, 0xfd, 0xdb, 0xd2, 0x00, 0x4d, 0xd5, 0xff, 0x31, 0x20, 0xfe, 0x04, 0xd1, 0xfd, 0x4a, \n  0xd1, 0xfe, 0x13, 0x34, 0x00, 0x28, 0xa5, 0x00, 0x63, 0xda, 0xff, 0xf0, 0x25, 0xff, 0x04, 0x72, \n  0xfe, 0x83, 0xe5, 0xfd, 0x6f, 0x44, 0xff, 0x8c, 0xab, 0x00, 0xe5, 0x9c, 0x01, 0x6b, 0x54, 0x01, \n  0xd0, 0xa2, 0xfe, 0x58, 0x63, 0xfd, 0x45, 0x6e, 0x1b, 0x97, 0x50, 0x37, 0xe8, 0x9d, 0x27, 0x9d, \n  0xf1, 0xfa, 0x3e, 0xc9, 0xe3, 0x7d, 0x62, 0xf0, 0xbc, 0x2b, 0x04, 0xb9, 0xb2, 0x0e, 0x5c, 0xb1, \n  0x09, 0xdf, 0xeb, 0xf9, 0x48, 0x93, 0xf5, 0xca, 0x6e, 0xfe, 0x58, 0x20, 0x02, 0x5b, 0x47, 0xfc, \n  0x2b, 0x6c, 0xfc, 0x8c, 0x0c, 0x01, 0x4b, 0x05, 0x00, 0x37, 0xc1, 0xfd, 0x64, 0x5c, 0xfd, 0x27, \n  0x07, 0xff, 0x7c, 0xf6, 0xff, 0xfb, 0x58, 0x00, 0x9d, 0xfd, 0xff, 0xa6, 0xaa, 0xfe, 0xac, 0xbb, \n  0xfe, 0xea, 0x64, 0xfd, 0x21, 0xe8, 0xfd, 0x3e, 0xe6, 0x00, 0xc4, 0xac, 0x01, 0x24, 0x78, 0x01, \n  0x92, 0x81, 0x00, 0x8a, 0x68, 0xfe, 0xe6, 0x59, 0x1f, 0xef, 0xc6, 0x3b, 0x5f, 0xab, 0x27, 0x10, \n  0xd7, 0xf8, 0x52, 0xff, 0xe0, 0xd7, 0x0c, 0xef, 0x26, 0x2b, 0x06, 0x6d, 0x8d, 0x10, 0x81, 0xc7, \n  0x08, 0xbb, 0xe3, 0xf7, 0x66, 0x7b, 0xf4, 0xe5, 0x51, 0xfe, 0xdb, 0xef, 0x02, 0x9a, 0x78, 0xfc, \n  0x8d, 0xb1, 0xfb, 0x4f, 0x20, 0x01, 0x59, 0xf4, 0xff, 0x2d, 0xa2, 0xfd, 0x92, 0x3a, 0xfd, 0x1c, \n  0xd6, 0xfe, 0x17, 0x60, 0x00, 0x3c, 0xfa, 0xff, 0x97, 0xa2, 0xff, 0x6c, 0xbb, 0xfe, 0xd3, 0x74, \n  0xfe, 0xdb, 0x68, 0xfd, 0xbd, 0x5c, 0xfd, 0x51, 0x3a, 0x00, 0x90, 0x1b, 0x02, 0x24, 0xa9, 0x01, \n  0x9f, 0xca, 0x00, 0xc8, 0x44, 0x00, 0x70, 0xb1, 0x22, 0xcd, 0x6e, 0x3f, 0xb8, 0xd2, 0x27, 0x78, \n  0x45, 0xf8, 0xf6, 0x33, 0xdf, 0xe2, 0xf9, 0xec, 0xaa, 0xc8, 0x07, 0x9f, 0x39, 0x12, 0xc1, 0x9d, \n  0x07, 0x33, 0x9c, 0xf6, 0x4b, 0x7c, 0xf3, 0x8a, 0xa0, 0xfd, 0x92, 0xcc, 0x03, 0xd1, 0xf3, 0xfc, \n  0xe8, 0xbc, 0xfa, 0x7f, 0xf2, 0x00, 0xd1, 0x36, 0x00, 0xaa, 0x57, 0xfd, 0xff, 0x38, 0xfd, 0xb0, \n  0xef, 0xfe, 0x5b, 0x85, 0x00, 0xef, 0xe0, 0xff, 0x1f, 0x29, 0xff, 0x77, 0xab, 0xfe, 0xfc, 0x45, \n  0xfe, 0xf3, 0x72, 0xfd, 0x1a, 0x85, 0xfd, 0xa9, 0x53, 0xff, 0x20, 0xe6, 0x01, 0x2d, 0x69, 0x02, \n  0x80, 0x9a, 0x00, 0xb8, 0xf3, 0x00, 0x94, 0x1d, 0x26, 0xab, 0xd5, 0x42, 0x67, 0xb0, 0x26, 0x7c, \n  0xb7, 0xf7, 0x60, 0x04, 0xdf, 0xd2, 0xc8, 0xea, 0x31, 0x6f, 0x08, 0xa8, 0xc9, 0x13, 0xb2, 0x35, \n  0x06, 0xae, 0x5d, 0xf5, 0xe0, 0xc7, 0xf2, 0x2c, 0xbd, 0xfc, 0x86, 0x4a, 0x04, 0xbe, 0x52, 0xfd, \n  0xa0, 0xcb, 0xf9, 0x2e, 0x57, 0x00, 0xed, 0x58, 0x00, 0x71, 0x2f, 0xfd, 0xec, 0x22, 0xfd, 0xf2, \n  0x23, 0xff, 0x25, 0x78, 0x00, 0x77, 0xe1, 0xff, 0xb5, 0x95, 0xfe, 0xa7, 0x25, 0xfe, 0x0e, 0x51, \n  0xfe, 0x10, 0x26, 0xfd, 0x23, 0xfe, 0xfd, 0x4d, 0x3d, 0xff, 0x3f, 0x8b, 0x00, 0xec, 0xba, 0x02, \n  0xce, 0x27, 0x01, 0x31, 0x5d, 0x00, 0x4f, 0x3a, 0x2c, 0x17, 0xb0, 0x46, 0x54, 0x0c, 0x22, 0x67, \n  0x43, 0xf5, 0x53, 0x60, 0xe0, 0x36, 0x7a, 0xea, 0x66, 0x0e, 0x09, 0xb3, 0xdb, 0x14, 0x11, 0x97, \n  0x04, 0xbe, 0x91, 0xf3, 0xae, 0x9b, 0xf2, 0x6f, 0xd0, 0xfc, 0x72, 0x46, 0x04, 0x7b, 0x36, 0xfd, \n  0x8e, 0x67, 0xf9, 0x16, 0xe4, 0xff, 0x4a, 0x12, 0x00, 0x36, 0x5c, 0xfd, 0x79, 0x69, 0xfd, 0x8f, \n  0x4a, 0xff, 0x8b, 0xda, 0x00, 0xd6, 0xd0, 0xff, 0xf0, 0xf0, 0xfd, 0x54, 0xd9, 0xfd, 0x44, 0x4a, \n  0xfe, 0xfe, 0xec, 0xfc, 0x73, 0x6b, 0xfe, 0x2c, 0x30, 0x00, 0xd4, 0x84, 0xff, 0x69, 0xbd, 0x01, \n  0x03, 0x1f, 0x02, 0xd1, 0xff, 0xff, 0x9a, 0x7c, 0x33, 0x3d, 0x82, 0x4a, 0x90, 0x2f, 0x1b, 0x4e, \n  0x77, 0xf2, 0x88, 0xf3, 0xe2, 0x43, 0x71, 0xeb, 0xff, 0x99, 0x09, 0xc6, 0x95, 0x14, 0xca, 0xa9, \n  0x03, 0x38, 0xfa, 0xf1, 0x96, 0x57, 0xf2, 0x27, 0x85, 0xfd, 0xdc, 0xaf, 0x03, 0x41, 0x42, 0xfd, \n  0xf5, 0x13, 0xf9, 0x9b, 0x71, 0xff, 0x13, 0xf7, 0xff, 0xab, 0x70, 0xfd, 0x26, 0x1e, 0xfe, 0xb9, \n  0x3c, 0xff, 0x0d, 0x7d, 0x01, 0x36, 0xc7, 0xff, 0x10, 0x2c, 0xfd, 0x45, 0x10, 0xfe, 0xb7, 0x06, \n  0xfe, 0x3d, 0xf3, 0xfc, 0x98, 0xd4, 0xfe, 0x66, 0x3d, 0x01, 0x14, 0x42, 0xff, 0xc9, 0x16, 0x00, \n  0x74, 0x87, 0x02, 0x49, 0x16, 0x00, 0xe2, 0xd7, 0x3a, 0x6c, 0x8b, 0x4e, 0xf4, 0x31, 0x13, 0xb1, \n  0xc9, 0xee, 0x44, 0x09, 0xe6, 0xed, 0x25, 0xed, 0xf8, 0xab, 0x09, 0x30, 0x26, 0x13, 0xb9, 0x60, \n  0x03, 0x1b, 0xa4, 0xf0, 0x4b, 0x90, 0xf1, 0x74, 0x45, 0xfe, 0xcf, 0x71, 0x02, 0xe9, 0x70, 0xfd, \n  0xec, 0xe5, 0xf8, 0x3c, 0xb6, 0xfe, 0x2d, 0x28, 0x00, 0x35, 0x50, 0xfd, 0xa4, 0xcf, 0xfe, 0xd9, \n  0x08, 0xff, 0xe7, 0xd5, 0x01, 0x7c, 0xc0, 0xff, 0xb4, 0x57, 0xfc, 0xa9, 0x9a, 0xfe, 0x91, 0x8d, \n  0xfd, 0xfa, 0xf5, 0xfc, 0x0e, 0x65, 0xff, 0x9b, 0xa4, 0x01, 0xd8, 0x49, 0xff, 0xd3, 0x6c, 0xfe, \n  0xa7, 0x03, 0x02, 0x77, 0x5d, 0x00, 0x6f, 0x05, 0x44, 0xbb, 0xbb, 0x51, 0x31, 0x96, 0x09, 0xb7, \n  0xeb, 0xea, 0x72, 0xae, 0xe8, 0x93, 0x37, 0xf0, 0xb5, 0x01, 0x0a, 0x68, 0x13, 0x11, 0x7c, 0x60, \n  0x03, 0xea, 0x1f, 0xef, 0xcf, 0x15, 0xf1, 0x0c, 0xc6, 0xfe, 0x39, 0x13, 0x01, 0x54, 0xca, 0xfd, \n  0x65, 0x07, 0xf9, 0xbc, 0x89, 0xfe, 0x90, 0x30, 0x00, 0x8e, 0x76, 0xfd, 0x03, 0x5c, 0xff, 0x9a, \n  0xbb, 0xfe, 0xe8, 0x3a, 0x02, 0x42, 0x88, 0xff, 0xda, 0x11, 0xfc, 0x9f, 0x2d, 0xff, 0x46, 0x27, \n  0xfd, 0x85, 0x47, 0xfd, 0xa9, 0x07, 0x00, 0xec, 0x84, 0x01, 0xbd, 0xe9, 0xfe, 0x4d, 0x83, 0xfd, \n  0x7c, 0x1f, 0x01, 0xe8, 0x3f, 0x00, 0x54, 0x91, 0x4d, 0xb6, 0x5b, 0x54, 0x70, 0xe9, 0xff, 0xd3, \n  0x38, 0xe7, 0x4c, 0x69, 0xea, 0x42, 0x73, 0xf3, 0x2d, 0xba, 0x0a, 0xbb, 0xfb, 0x0e, 0x30, 0x91, \n  0x03, 0xd4, 0x81, 0xed, 0xcf, 0x6b, 0xf0, 0x78, 0xd4, 0xfe, 0x02, 0xab, 0xff, 0x0e, 0xaa, 0xfe, \n  0xe3, 0xcb, 0xf9, 0x07, 0x7a, 0xfe, 0x0f, 0x2a, 0x00, 0xd1, 0xd1, 0xfd, 0x2b, 0x59, 0xff, 0x78, \n  0x59, 0xfe, 0x50, 0xd8, 0x02, 0x60, 0x5e, 0xff, 0x38, 0x37, 0xfc, 0x52, 0x90, 0xff, 0xa7, 0xeb, \n  0xfc, 0xa6, 0xdb, 0xfd, 0xbf, 0x23, 0x00, 0x0a, 0xcc, 0x00, 0x48, 0x8a, 0xfe, 0xb6, 0x23, 0xfd, \n  0xa3, 0x17, 0x00, 0x49, 0x21, 0x00, 0xc7, 0xef, 0x55, 0xd7, 0xf7, 0x56, 0x4f, 0x40, 0xf7, 0x73, \n  0x11, 0xe4, 0x7c, 0x08, 0xeb, 0xa1, 0xe0, 0xf5, 0x36, 0x3c, 0x0c, 0x4b, 0xfa, 0x0c, 0xa1, 0xd7, \n  0x03, 0x86, 0xbd, 0xeb, 0x0e, 0x60, 0xef, 0xc5, 0xc5, 0xfe, 0x62, 0x53, 0xfe, 0x87, 0xbb, 0x00, \n  0xd5, 0x96, 0xfa, 0x04, 0x25, 0xfe, 0x92, 0xaa, 0x00, 0x35, 0x65, 0xfd, 0xfc, 0x00, 0xff, 0x66, \n  0x58, 0xfe, 0x9f, 0x8f, 0x03, 0x42, 0x7c, 0xff, 0xce, 0x5a, 0xfc, 0x4c, 0xf0, 0xff, 0x0b, 0xa8, \n  0xfc, 0x65, 0xcc, 0xfd, 0x26, 0xc3, 0xff, 0x76, 0x3c, 0x00, 0xcf, 0x47, 0xfe, 0x6f, 0xf2, 0xfc, \n  0xc5, 0x95, 0xff, 0x3f, 0x58, 0x00, 0x39, 0x40, 0x5d, 0x40, 0x83, 0x59, 0x5b, 0x15, 0xf0, 0x0f, \n  0x6b, 0xe1, 0xeb, 0xf2, 0xe9, 0x98, 0x45, 0xf7, 0xdb, 0xbf, 0x0e, 0x59, 0x1c, 0x0b, 0x21, 0xb9, \n  0x03, 0x60, 0xd6, 0xe9, 0xae, 0x33, 0xee, 0x3d, 0xe1, 0xfe, 0x61, 0xbb, 0xfd, 0x05, 0x83, 0x03, \n  0xe3, 0xd7, 0xfa, 0x51, 0x36, 0xfe, 0xff, 0x09, 0x01, 0x59, 0xee, 0xfb, 0x05, 0x75, 0xff, 0x66, \n  0x95, 0xfe, 0x03, 0x39, 0x04, 0x0e, 0xdf, 0xff, 0xcb, 0x83, 0xfc, 0x15, 0x0d, 0x00, 0x0a, 0x34, \n  0xfb, 0x9f, 0x81, 0xfd, 0x9c, 0xd0, 0xff, 0xce, 0xab, 0xff, 0x81, 0x11, 0xfe, 0x39, 0x9d, 0xfd, \n  0x64, 0xde, 0xff, 0x7e, 0x8f, 0xff, 0xe2, 0x52, 0x63, 0xae, 0x96, 0x5b, 0x0d, 0xf7, 0xea, 0x55, \n  0x40, 0xdf, 0xd3, 0x58, 0xe7, 0x40, 0xa3, 0xf7, 0x8b, 0x89, 0x11, 0x84, 0xb0, 0x09, 0xc9, 0xc6, \n  0x02, 0x8c, 0xfe, 0xe7, 0x0b, 0x09, 0xee, 0xe3, 0x72, 0xff, 0xca, 0x72, 0xfd, 0xa8, 0x59, 0x06, \n  0x66, 0x1f, 0xfb, 0x57, 0xda, 0xfd, 0xac, 0xde, 0x00, 0xdd, 0x07, 0xfb, 0x1d, 0xa1, 0x00, 0xb9, \n  0xaf, 0xfe, 0xe5, 0xaf, 0x04, 0x68, 0x9b, 0x00, 0xc7, 0x02, 0xfc, 0xa9, 0x9a, 0xfe, 0x9a, 0x09, \n  0xfa, 0x9e, 0xf4, 0xfd, 0xf8, 0x6d, 0xff, 0xe8, 0xae, 0xff, 0x15, 0xf0, 0xfe, 0x85, 0x2e, 0xfe, \n  0x1d, 0x8e, 0xff, 0x13, 0xef, 0xfe, 0x25, 0x2b, 0x68, 0x25, 0x6e, 0x5c, 0x1a, 0x98, 0xe7, 0x4b, \n  0x4d, 0xde, 0xe8, 0x02, 0xe4, 0xab, 0xc5, 0xf6, 0xf4, 0x1d, 0x14, 0xaf, 0xc7, 0x08, 0x80, 0x76, \n  0x00, 0x7b, 0xba, 0xe7, 0xe7, 0xb8, 0xef, 0xca, 0xfa, 0xfe, 0x14, 0xde, 0xfd, 0xb4, 0x08, 0x09, \n  0xa6, 0xa5, 0xfa, 0xc1, 0x08, 0xfd, 0x85, 0x1c, 0x01, 0x22, 0x7b, 0xfb, 0x92, 0x6d, 0x01, 0x5b, \n  0xd8, 0xfe, 0x69, 0xda, 0x04, 0x37, 0xda, 0xff, 0x86, 0xb9, 0xfa, 0xac, 0xf9, 0xfd, 0xd1, 0x83, \n  0xf9, 0x31, 0xe9, 0xfd, 0x19, 0x4c, 0x00, 0x9f, 0x8a, 0x00, 0x68, 0xf1, 0xfe, 0x66, 0x3d, 0xfe, \n  0xe6, 0x07, 0x00, 0x5b, 0xa0, 0xfe, 0xd6, 0x87, 0x6a, 0xf5, 0x09, 0x5d, 0x79, 0x87, 0xe5, 0xad, \n  0x01, 0xdf, 0x0f, 0xbb, 0xe0, 0x66, 0xeb, 0xf3, 0x0e, 0x22, 0x17, 0x6b, 0x6a, 0x07, 0x62, 0x91, \n  0xfe, 0x7f, 0xba, 0xe9, 0x4c, 0xee, 0xf0, 0xa0, 0xea, 0xfe, 0x87, 0x5b, 0xfe, 0x15, 0x96, 0x0a, \n  0xf6, 0xbc, 0xf9, 0xa7, 0x46, 0xfc, 0x63, 0xdb, 0x02, 0xad, 0xec, 0xfb, 0xa0, 0xcc, 0x01, 0x5a, \n  0x34, 0xfe, 0xeb, 0xd9, 0x02, 0x84, 0x7c, 0xff, 0xf4, 0x9a, 0xfa, 0xb1, 0x72, 0xfd, 0xf2, 0x50, \n  0xf9, 0xb9, 0x43, 0xff, 0x48, 0x92, 0x01, 0x54, 0xd3, 0xff, 0x25, 0x4c, 0xff, 0x10, 0x0e, 0xff, \n  0x8a, 0x96, 0xff, 0x0c, 0xd1, 0xfd, 0xce, 0x0a, 0x6d, 0x07, 0x96, 0x5a, 0x66, 0xb8, 0xe5, 0x79, \n  0x3d, 0xe1, 0x46, 0x95, 0xda, 0x64, 0xa4, 0xf0, 0xde, 0x02, 0x19, 0x56, 0x11, 0x08, 0x68, 0x34, \n  0xfe, 0xde, 0x0b, 0xeb, 0x5b, 0x5b, 0xf3, 0xa1, 0xbb, 0xfd, 0x0a, 0x51, 0xfe, 0x7b, 0x9b, 0x0b, \n  0xe3, 0x29, 0xf9, 0xe8, 0x58, 0xfd, 0x78, 0x4c, 0x04, 0xa8, 0xed, 0xfb, 0x1f, 0xf8, 0xff, 0x95, \n  0xbf, 0xfc, 0x51, 0x61, 0x02, 0x4a, 0x3f, 0xff, 0xb6, 0xfc, 0xfa, 0xec, 0xa0, 0xfd, 0x3c, 0x13, \n  0xfa, 0x24, 0xf5, 0xff, 0x4f, 0x50, 0x01, 0x7f, 0xde, 0xff, 0xe2, 0xa2, 0xff, 0xae, 0xe9, 0xfe, \n  0x06, 0x85, 0xff, 0x4d, 0xb4, 0xfd, 0xc5, 0xfb, 0x6b, 0xa8, 0x1e, 0x59, 0xab, 0x90, 0xe7, 0x76, \n  0xb6, 0xe3, 0x17, 0xe9, 0xd4, 0x99, 0x13, 0xeb, 0xf2, 0x4f, 0x1c, 0x48, 0x2c, 0x0a, 0xdd, 0x1d, \n  0xfd, 0xe9, 0x83, 0xed, 0x70, 0x7f, 0xf5, 0xc1, 0xba, 0xfb, 0x75, 0x53, 0xfd, 0xdc, 0xa6, 0x0d, \n  0xf2, 0xd1, 0xf9, 0x76, 0x98, 0xfd, 0x7f, 0xdc, 0x04, 0x2f, 0x52, 0xf9, 0x86, 0xa0, 0xfe, 0x92, \n  0x6c, 0xfd, 0x23, 0x5b, 0x01, 0x7d, 0x9f, 0xff, 0x97, 0x72, 0xfc, 0xca, 0x12, 0xfe, 0x7b, 0xee, \n  0xf9, 0xff, 0x1f, 0x00, 0xbc, 0x56, 0x01, 0x1a, 0x5d, 0xff, 0xdf, 0x08, 0x00, 0xf3, 0xf2, 0xfe, \n  0xba, 0x7c, 0xff, 0x14, 0x89, 0xfd, 0x6d, 0xf5, 0x6b, 0xe6, 0x28, 0x53, 0x5c, 0x63, 0xe9, 0xfe, \n  0xa3, 0xe7, 0x20, 0x55, 0xce, 0x7a, 0x6a, 0xe9, 0xc1, 0x75, 0x1f, 0xdf, 0xbf, 0x0a, 0x64, 0xef, \n  0xfc, 0xed, 0xf1, 0xef, 0x42, 0x27, 0xf7, 0xe1, 0xf2, 0xf8, 0xf1, 0xd9, 0xfe, 0x87, 0x76, 0x0f, \n  0x51, 0x80, 0xf8, 0xc7, 0xbf, 0xfd, 0x7d, 0x30, 0x03, 0x02, 0xc7, 0xf7, 0xe2, 0x8f, 0xff, 0xff, \n  0xc2, 0xfd, 0x86, 0xb5, 0x00, 0xe3, 0xf0, 0x00, 0x40, 0xbb, 0xfd, 0xcf, 0x43, 0xfd, 0x60, 0x19, \n  0xfa, 0x5e, 0x67, 0x00, 0x60, 0xe3, 0x00, 0xbc, 0x50, 0xff, 0x80, 0x14, 0x00, 0xb4, 0x04, 0xff, \n  0x79, 0x9c, 0xff, 0xa0, 0x69, 0xfd, 0xaa, 0x71, 0x68, 0xcd, 0x12, 0x4e, 0x9e, 0x42, 0xec, 0x9b, \n  0x3b, 0xeb, 0x1b, 0x95, 0xcb, 0x20, 0x1c, 0xe8, 0x63, 0x4f, 0x20, 0x90, 0x16, 0x0c, 0xf6, 0x9a, \n  0xfd, 0x92, 0x28, 0xf1, 0xc4, 0xde, 0xf8, 0x03, 0x63, 0xf8, 0x6e, 0x16, 0xff, 0x55, 0x94, 0x0f, \n  0x78, 0x51, 0xf7, 0xd6, 0x70, 0xfc, 0xf1, 0xb2, 0x02, 0x1b, 0xa5, 0xf8, 0x0b, 0xc0, 0xff, 0x13, \n  0x5d, 0xfe, 0x57, 0x6e, 0x01, 0x30, 0x4e, 0x01, 0x3c, 0xef, 0xfd, 0x0d, 0xcb, 0xfc, 0x64, 0xc2, \n  0xfa, 0xec, 0xaa, 0x00, 0xca, 0xf5, 0xff, 0x22, 0x4c, 0xff, 0xf6, 0x6f, 0x00, 0x9f, 0x15, 0xff, \n  0x24, 0xdd, 0xff, 0x87, 0x6f, 0xfd, 0xdf, 0xf2, 0x60, 0xd9, 0x0e, 0x49, 0x14, 0x22, 0xf0, 0xd6, \n  0xe3, 0xef, 0x30, 0xef, 0xcc, 0xa0, 0x1c, 0xe6, 0x15, 0xa7, 0x1f, 0xc9, 0xfd, 0x0c, 0x96, 0xcf, \n  0xfd, 0x92, 0x00, 0xf4, 0x45, 0x23, 0xfa, 0x75, 0xde, 0xf6, 0xca, 0xef, 0xfe, 0x3f, 0xbc, 0x0e, \n  0xb8, 0xa4, 0xf5, 0x56, 0x7f, 0xfc, 0x74, 0xbb, 0x03, 0xc0, 0x4e, 0xf8, 0x45, 0xc5, 0x00, 0xfa, \n  0x02, 0x00, 0xa0, 0x4b, 0x00, 0x9f, 0x2d, 0x01, 0xef, 0x35, 0xfe, 0xb4, 0x1a, 0xfd, 0x96, 0x95, \n  0xfb, 0xeb, 0x8a, 0xff, 0xda, 0xbc, 0xff, 0x01, 0xb6, 0xff, 0x2a, 0x4c, 0x00, 0xde, 0x62, 0xff, \n  0xa8, 0xcd, 0xff, 0x23, 0x64, 0xfd, 0xdb, 0x34, 0x58, 0xe6, 0xcc, 0x41, 0x9c, 0xef, 0xf5, 0x05, \n  0x97, 0xf5, 0xd8, 0x91, 0xcf, 0x34, 0x21, 0xe6, 0x28, 0x90, 0x1b, 0x46, 0x5b, 0x0d, 0x45, 0xbe, \n  0x00, 0x86, 0x67, 0xf5, 0x2d, 0xf3, 0xf9, 0xc8, 0x8d, 0xf6, 0x4c, 0x5c, 0xfe, 0x8f, 0x57, 0x0c, \n  0x18, 0x75, 0xf6, 0x1e, 0x6b, 0xfd, 0x97, 0xe2, 0x02, 0x05, 0x05, 0xfa, 0x5d, 0x08, 0x02, 0xbf, \n  0x9d, 0xff, 0x5f, 0x4b, 0xff, 0x7a, 0x55, 0x01, 0x07, 0x43, 0xff, 0x4f, 0xe4, 0xfc, 0x34, 0x80, \n  0xfb, 0x05, 0xa4, 0xff, 0xff, 0x9a, 0xff, 0x96, 0x9d, 0xff, 0x66, 0x6c, 0x00, 0xdf, 0x5e, 0xff, \n  0x19, 0xce, 0xff, 0xa3, 0xf0, 0xfd, 0xdd, 0xcd, 0x4d, 0x8e, 0xad, 0x3a, 0x6f, 0x7a, 0xfc, 0xcc, \n  0x45, 0xfb, 0x4f, 0x6b, 0xd4, 0x63, 0xca, 0xe5, 0xe4, 0xdd, 0x16, 0xb6, 0x06, 0x0f, 0x8b, 0x8a, \n  0x01, 0x17, 0x26, 0xf6, 0x68, 0x31, 0xfb, 0xa8, 0x51, 0xf5, 0xce, 0xd7, 0xfd, 0x45, 0xbb, 0x0b, \n  0xc1, 0xee, 0xf6, 0x11, 0xb5, 0xfd, 0x11, 0x91, 0x03, 0x41, 0x90, 0xfb, 0x99, 0xcc, 0x01, 0x1a, \n  0x03, 0xff, 0x88, 0x2f, 0xff, 0x17, 0x2c, 0x02, 0x71, 0xff, 0xfe, 0x3d, 0x81, 0xfc, 0x10, 0xd9, \n  0xfc, 0x3f, 0x7e, 0xff, 0xfd, 0x22, 0xff, 0xde, 0xd7, 0xff, 0x84, 0x49, 0x00, 0x24, 0x82, 0xff, \n  0x5e, 0x06, 0x00, 0x52, 0xec, 0xfd, 0xdf, 0xd4, 0x3d, 0x20, 0xf6, 0x2d, 0xce, 0x4c, 0xf5, 0x9a, \n  0xcf, 0xfa, 0x9c, 0x96, 0xf0, 0x4f, 0xab, 0xfe, 0x14, 0xf6, 0x11, 0x8b, 0x29, 0xfd, 0x72, 0xc1, \n  0xf7, 0x51, 0x6b, 0xf9, 0x42, 0x7f, 0x02, 0x6d, 0xf7, 0xff, 0x63, 0xd2, 0xfe, 0x6b, 0xe7, 0x05, \n  0x16, 0x66, 0xf8, 0x16, 0x42, 0xfd, 0xb9, 0x4d, 0x02, 0x76, 0xc3, 0xfa, 0x5c, 0x5a, 0xff, 0x4b, \n  0x55, 0xff, 0x17, 0xfc, 0xfe, 0xa0, 0x20, 0x00, 0xef, 0x61, 0xff, 0xe0, 0x82, 0xfd, 0x4a, 0xad, \n  0xfd, 0xf2, 0x08, 0x03, 0x0c, 0x48, 0x00, 0x47, 0x4b, 0xff, 0x53, 0x57, 0x01, 0xd4, 0xaf, 0xfd, \n  0xef, 0xd7, 0xfe, 0xfb, 0x33, 0xff, 0x14, 0xf9, 0x34, 0x2f, 0xe9, 0x2b, 0x10, 0x46, 0xfb, 0x9a, \n  0x33, 0xfb, 0x48, 0x5e, 0xf1, 0x90, 0x5f, 0xfd, 0xf3, 0x68, 0x10, 0xf0, 0x68, 0x00, 0x53, 0x64, \n  0xf9, 0x4b, 0xe6, 0xf9, 0xa3, 0x58, 0x01, 0xc0, 0x18, 0xff, 0x06, 0xdb, 0xfe, 0xe3, 0x2a, 0x05, \n  0x06, 0xca, 0xf9, 0x2d, 0x63, 0xfd, 0xcb, 0x24, 0x02, 0xf3, 0x3c, 0xfc, 0x84, 0x43, 0xff, 0x4e, \n  0x83, 0xff, 0xcb, 0x8e, 0xff, 0xe1, 0x0e, 0x00, 0xcb, 0x66, 0xff, 0x3e, 0xb2, 0xfd, 0x5c, 0x76, \n  0xfd, 0x18, 0x60, 0x02, 0x36, 0x9e, 0x00, 0x1f, 0x76, 0xff, 0x52, 0x84, 0x01, 0xd1, 0xa5, 0xfe, \n  0x9f, 0xd3, 0xfe, 0x35, 0x36, 0xff, 0x47, 0x83, 0x2d, 0x29, 0x4e, 0x29, 0xdb, 0x48, 0x00, 0x63, \n  0x0f, 0xfc, 0xdb, 0xc4, 0xf2, 0x56, 0xff, 0xfc, 0xff, 0x8e, 0x0e, 0x10, 0x72, 0x02, 0x3f, 0x06, \n  0xfb, 0x81, 0xd8, 0xfa, 0xfe, 0x49, 0x00, 0x7c, 0xb6, 0xfe, 0xeb, 0x67, 0xff, 0x65, 0x50, 0x04, \n  0xc1, 0x34, 0xfb, 0x86, 0xda, 0xfd, 0x0f, 0x15, 0x02, 0xb1, 0x93, 0xfd, 0x32, 0x5b, 0xff, 0xf4, \n  0xe9, 0xff, 0xd0, 0x11, 0x00, 0x39, 0x25, 0x00, 0xec, 0x95, 0xff, 0x77, 0x1d, 0xfe, 0xda, 0xb0, \n  0xfd, 0xf9, 0xdd, 0x01, 0x13, 0x19, 0x01, 0xdd, 0xdb, 0xff, 0xcc, 0x5a, 0x01, 0xb0, 0x37, 0xff, \n  0x23, 0xea, 0xfe, 0xdf, 0x54, 0xff, 0xa6, 0x8a, 0x27, 0x71, 0x24, 0x27, 0xe4, 0x8c, 0x03, 0x14, \n  0x92, 0xfc, 0xdc, 0x5b, 0xf4, 0xbc, 0x06, 0xfd, 0x25, 0xf0, 0x0c, 0x99, 0xac, 0x03, 0xce, 0xa4, \n  0xfc, 0x7e, 0xba, 0xfb, 0xcf, 0x96, 0xff, 0xaf, 0xe0, 0xfe, 0xd4, 0xc3, 0xff, 0xc9, 0x89, 0x03, \n  0xac, 0x68, 0xfc, 0x05, 0x93, 0xfe, 0x01, 0x24, 0x02, 0x4f, 0x7e, 0xfe, 0x7d, 0x9d, 0xff, 0xc1, \n  0x3c, 0x00, 0xb5, 0x97, 0x00, 0x04, 0x52, 0x00, 0xc6, 0xbe, 0xff, 0xed, 0xce, 0xfe, 0x93, 0x29, \n  0xfe, 0x2c, 0x76, 0x01, 0x2a, 0x3f, 0x01, 0x6b, 0x05, 0x00, 0xa9, 0x16, 0x01, 0x5a, 0x8a, 0xff, \n  0xdd, 0x19, 0xff, 0x4b, 0x54, 0xff, 0x0f, 0x14, 0x23, 0xf2, 0x4b, 0x25, 0x10, 0x64, 0x05, 0x2c, \n  0x79, 0xfc, 0xe4, 0xc5, 0xf5, 0x40, 0x5c, 0xfd, 0x7a, 0x5a, 0x0b, 0xb0, 0x43, 0x04, 0x44, 0xe4, \n  0xfd, 0x01, 0x70, 0xfc, 0xd8, 0x50, 0xff, 0xf0, 0x13, 0xff, 0xb7, 0xc9, 0xff, 0xca, 0xe1, 0x02, \n  0xc1, 0x73, 0xfd, 0xe7, 0x34, 0xff, 0xdf, 0xfb, 0x01, 0x1e, 0x10, 0xff, 0xe6, 0xe2, 0xff, 0x6e, \n  0x5c, 0x00, 0xcb, 0xe8, 0x00, 0xe8, 0x8b, 0x00, 0xa8, 0xe9, 0xff, 0x86, 0x4d, 0xff, 0x01, 0x60, \n  0xfe, 0xf2, 0xc6, 0x00, 0xe3, 0x13, 0x01, 0xbd, 0x16, 0x00, 0xfe, 0x91, 0x00, 0x70, 0x88, 0xff, \n  0x65, 0x45, 0xff, 0x47, 0x62, 0xff, 0x37, 0xd6, 0x1f, 0x7e, 0xb1, 0x23, 0x7d, 0x56, 0x06, 0x5c, \n  0x47, 0xfc, 0x34, 0x29, 0xf7, 0x04, 0xe1, 0xfd, 0x3f, 0xea, 0x09, 0xdb, 0xa1, 0x04, 0xa2, 0xf4, \n  0xfe, 0xa3, 0x0f, 0xfd, 0x49, 0x6f, 0xff, 0x69, 0x41, 0xff, 0xa1, 0xd9, 0xff, 0x9b, 0xad, 0x02, \n  0xb4, 0x37, 0xfe, 0xcf, 0xaf, 0xff, 0xc4, 0xee, 0x01, 0xc5, 0x7d, 0xff, 0xb2, 0x1a, 0x00, 0x41, \n  0x80, 0x00, 0x2a, 0x41, 0x01, 0xbf, 0x9f, 0x00, 0xed, 0xd7, 0xff, 0x22, 0x98, 0xff, 0x7d, 0x79, \n  0xfe, 0x3a, 0x17, 0x00, 0x96, 0xcb, 0x00, 0xe7, 0x13, 0x00, 0xb9, 0x23, 0x00, 0xc6, 0xb0, 0xff, \n  0x95, 0x90, 0xff, 0x6a, 0x52, 0xff, 0xa9, 0x66, 0x1d, 0x2f, 0xa6, 0x22, 0xc7, 0xdb, 0x06, 0xa9, \n  0x02, 0xfc, 0x49, 0x68, 0xf8, 0xdf, 0x59, 0xfe, 0xe5, 0xd0, 0x08, 0x9c, 0xfd, 0x04, 0x0c, 0xdf, \n  0xff, 0xe3, 0x74, 0xfd, 0xf1, 0xeb, 0xff, 0x8c, 0xc3, 0xff, 0x3d, 0xb7, 0xff, 0x41, 0xca, 0x02, \n  0xfd, 0xe1, 0xfe, 0x7d, 0xdc, 0xff, 0xd5, 0x0c, 0x02, 0x2c, 0xe0, 0xff, 0x78, 0x4e, 0x00, 0x5f, \n  0x6f, 0x00, 0xe5, 0x54, 0x01, 0x23, 0xca, 0x00, 0x83, 0x9c, 0xff, 0xe6, 0xa4, 0xff, 0x62, 0xb2, \n  0xfe, 0xaa, 0x79, 0xff, 0x2d, 0x77, 0x00, 0x12, 0x6d, 0x00, 0x3c, 0x07, 0x00, 0xce, 0xb1, 0xff, \n  0x13, 0xbb, 0xff, 0x5e, 0x53, 0xff, 0xd0, 0xe8, 0x1b, 0xf3, 0xdf, 0x21, 0xfb, 0xf4, 0x06, 0xc8, \n  0xa1, 0xfb, 0x71, 0x6e, 0xf9, 0xaa, 0x05, 0xff, 0xc7, 0x05, 0x08, 0xd6, 0x1c, 0x05, 0xb4, 0x84, \n  0x00, 0x15, 0x97, 0xfd, 0xe3, 0x78, 0x00, 0x02, 0x9e, 0x00, 0xe8, 0x57, 0xff, 0x3d, 0xaa, 0x02, \n  0x15, 0xaf, 0xff, 0x0d, 0xbb, 0xff, 0x6e, 0xfd, 0x01, 0x05, 0x3e, 0x00, 0x64, 0x0f, 0x00, 0x9b, \n  0x2d, 0x00, 0x91, 0x52, 0x01, 0x92, 0xdc, 0x00, 0x0d, 0x6d, 0xff, 0x86, 0x4c, 0xff, 0x68, 0xde, \n  0xfe, 0xb2, 0x71, 0xff, 0x76, 0x1a, 0x00, 0x04, 0x8f, 0x00, 0x09, 0x0f, 0x00, 0xe4, 0x7c, 0xff, \n  0x2b, 0x09, 0x00, 0xf9, 0x81, 0xff, 0xa5, 0x74, 0x1a, 0x64, 0xad, 0x21, 0xd2, 0x5e, 0x07, 0x74, \n  0x57, 0xfb, 0x82, 0x6e, 0xfa, 0xb5, 0x97, 0xff, 0xc9, 0x93, 0x07, 0xf0, 0xf2, 0x04, 0x29, 0xe5, \n  0x00, 0xe0, 0xdf, 0xfd, 0xe6, 0x61, 0x00, 0x38, 0xb4, 0x01, 0x98, 0x8d, 0xff, 0xd5, 0xb5, 0x01, \n  0xa1, 0x6d, 0x00, 0x49, 0x17, 0x00, 0x0d, 0x21, 0x01, 0x09, 0x47, 0x00, 0xc0, 0x53, 0x00, 0xd4, \n  0xc5, 0xff, 0x09, 0xf9, 0x00, 0x66, 0xf7, 0x00, 0x3b, 0x95, 0xff, 0x1a, 0xf1, 0xfe, 0x3f, 0xcd, \n  0xfe, 0xbd, 0xf7, 0xff, 0xb7, 0xca, 0xff, 0x03, 0x1a, 0x00, 0x77, 0x6e, 0x00, 0xa4, 0xc0, 0xff, \n  0x47, 0xaf, 0xff, 0x0a, 0xba, 0xff, 0x0a, 0xde, 0x19, 0x3e, 0x4b, 0x21, 0xbf, 0xab, 0x07, 0x32, \n  0x58, 0xfb, 0xcd, 0x23, 0xfb, 0xdd, 0x65, 0x00, 0x2e, 0x4a, 0x07, 0x38, 0xb6, 0x04, 0x07, 0xa2, \n  0x00, 0x74, 0xe9, 0xfd, 0x68, 0x91, 0x00, 0xa1, 0xb4, 0x01, 0x03, 0x2c, 0x00, 0xb3, 0x95, 0x01, \n  0x44, 0xcd, 0xff, 0x37, 0x93, 0x00, 0xdc, 0x1a, 0x01, 0x56, 0x65, 0xff, 0xc3, 0x61, 0x00, 0x06, \n  0x1f, 0x00, 0xd4, 0x80, 0x00, 0x26, 0x81, 0x00, 0xf2, 0xe2, 0xff, 0xd4, 0x6d, 0xff, 0x9e, 0x78, \n  0xfe, 0x9e, 0x9b, 0xff, 0x75, 0x03, 0x00, 0xc7, 0x14, 0x00, 0x57, 0x46, 0x00, 0x86, 0x68, 0xff, \n  0xcd, 0x4f, 0x00, 0x8b, 0x25, 0x01, 0x09, 0x74, 0x19, 0xbe, 0x8d, 0x21, 0x5b, 0x01, 0x08, 0xb9, \n  0x2e, 0xfb, 0x7d, 0xbb, 0xfb, 0xf4, 0xff, 0x00, 0xf6, 0x29, 0x07, 0xec, 0x74, 0x04, 0x69, 0x4c, \n  0x00, 0xbe, 0x63, 0xfd, 0x50, 0x5d, 0x00, 0x8f, 0xcc, 0x01, 0x69, 0xcf, 0xff, 0xa3, 0xc5, 0x01, \n  0x75, 0x2c, 0x00, 0xbd, 0xd8, 0xff, 0x6e, 0x21, 0x01, 0x13, 0xa6, 0xff, 0x9f, 0x76, 0xff, 0x4d, \n  0x01, 0x00, 0x18, 0xef, 0x00, 0xcc, 0x13, 0x00, 0x76, 0x83, 0xff, 0x6d, 0xdc, 0xff, 0x83, 0xd4, \n  0xfe, 0x44, 0xd5, 0xfe, 0xfd, 0xa2, 0xff, 0x12, 0xa3, 0x00, 0xeb, 0xa3, 0xff, 0xa3, 0x64, 0xff, \n  0x83, 0xca, 0x01, 0xb8, 0xaa, 0x00, 0xe5, 0xbd, 0x19, 0xa5, 0x44, 0x22, 0x5a, 0x1a, 0x08, 0xa7, \n  0xad, 0xfa, 0xf5, 0x28, 0xfc, 0xcc, 0xe3, 0x01, 0x71, 0x90, 0x07, 0x59, 0x52, 0x04, 0x5d, 0xf1, \n  0xff, 0xf8, 0x17, 0xfd, 0xef, 0xc0, 0xff, 0x56, 0x93, 0x01, 0x54, 0xd9, 0xff, 0xbb, 0x54, 0x01, \n  0xf1, 0x6b, 0x00, 0xf8, 0x94, 0x00, 0x6b, 0xed, 0x00, 0x06, 0x47, 0xff, 0x0b, 0xe6, 0xff, 0xa6, \n  0xd5, 0xff, 0x04, 0x54, 0x00, 0x01, 0x98, 0x00, 0x22, 0xd0, 0xff, 0xe3, 0x83, 0xff, 0x70, 0xda, \n  0xfe, 0xbb, 0x28, 0xff, 0xcb, 0xdb, 0xff, 0x00, 0xca, 0xff, 0x79, 0x81, 0xff, 0x71, 0x1a, 0x01, \n  0x66, 0x88, 0x01, 0xdd, 0x70, 0xff, 0xb9, 0x4c, 0x1a, 0x85, 0x65, 0x23, 0xb7, 0x42, 0x08, 0xf7, \n  0x83, 0xf9, 0x09, 0x00, 0xfc, 0xd0, 0xb0, 0x02, 0xb5, 0xf2, 0x07, 0x7d, 0x8c, 0x04, 0x26, 0x8a, \n  0xff, 0x47, 0x2a, 0xfc, 0x82, 0x67, 0xff, 0x96, 0x58, 0x01, 0xe6, 0x02, 0xff, 0x5e, 0xc5, 0x00, \n  0x86, 0x69, 0x00, 0x9f, 0x6f, 0x00, 0xe3, 0x3d, 0x01, 0xd4, 0x9c, 0xff, 0x60, 0x4f, 0xff, 0x37, \n  0xc2, 0xff, 0x07, 0x95, 0x00, 0xf4, 0xd2, 0xff, 0xb9, 0x96, 0xff, 0x2a, 0xfb, 0xff, 0xf7, 0x6e, \n  0xfe, 0x3b, 0x04, 0xff, 0x2c, 0x2d, 0x00, 0x5d, 0x53, 0xff, 0x4b, 0x91, 0xff, 0x78, 0x82, 0x01, \n  0xc5, 0xc6, 0x00, 0x41, 0x33, 0xff, 0xef, 0xf0, 0x1a, 0xe2, 0x13, 0x25, 0x1d, 0xba, 0x08, 0xfa, \n  0x49, 0xf8, 0x33, 0xa3, 0xfb, 0x9c, 0x45, 0x03, 0xba, 0x71, 0x08, 0xff, 0xd5, 0x04, 0xa0, 0x72, \n  0xff, 0xea, 0x89, 0xfb, 0x4b, 0xd6, 0xfe, 0x15, 0x6d, 0x01, 0xe2, 0xbb, 0xfe, 0x3c, 0xe1, 0xff, \n  0x86, 0xe6, 0xff, 0xf8, 0x86, 0x00, 0xed, 0x38, 0x01, 0x92, 0x71, 0xff, 0xc3, 0xca, 0xff, 0x22, \n  0xff, 0xff, 0xaa, 0x41, 0x00, 0x0b, 0xe8, 0xff, 0xb4, 0x73, 0xff, 0x96, 0x61, 0xff, 0x12, 0x50, \n  0xfe, 0x28, 0x83, 0xff, 0xf4, 0x4f, 0x00, 0xf4, 0xfd, 0xfe, 0x18, 0xea, 0xff, 0xf3, 0xd3, 0x01, \n  0xf2, 0x0d, 0x00, 0x85, 0xbf, 0xfe, 0x7a, 0xee, 0x1b, 0xc8, 0x30, 0x27, 0x70, 0x30, 0x09, 0x0a, \n  0xa9, 0xf6, 0x55, 0x3d, 0xfb, 0x48, 0x0c, 0x04, 0x0a, 0xd3, 0x08, 0x81, 0x38, 0x05, 0x26, 0x35, \n  0xff, 0x09, 0xde, 0xfa, 0x71, 0xe9, 0xfe, 0x8b, 0x91, 0x01, 0x5e, 0x51, 0xfe, 0xde, 0x61, 0xff, \n  0x2c, 0x94, 0xff, 0xc0, 0x28, 0x00, 0x57, 0xf0, 0x00, 0x81, 0x54, 0xff, 0xbc, 0x86, 0xff, 0x0c, \n  0x2f, 0x00, 0x19, 0xe6, 0x00, 0xa6, 0xe0, 0xff, 0x3a, 0x22, 0xff, 0xc1, 0x69, 0xff, 0xf7, 0x0d, \n  0xfe, 0xbc, 0x12, 0xff, 0x36, 0xb6, 0x00, 0x23, 0x87, 0xff, 0x35, 0xb3, 0xff, 0xa5, 0xe3, 0x01, \n  0xbf, 0x38, 0x00, 0x6d, 0x66, 0xfe, 0xcf, 0x98, 0x1d, 0x85, 0x5c, 0x29, 0x19, 0x25, 0x09, 0xab, \n  0x07, 0xf5, 0x29, 0xca, 0xfa, 0x7d, 0xf1, 0x04, 0xfc, 0x42, 0x09, 0x9c, 0x19, 0x05, 0x11, 0xb1, \n  0xfe, 0xbc, 0x0e, 0xfa, 0x24, 0x1a, 0xff, 0x01, 0x20, 0x02, 0xea, 0x03, 0xfe, 0xe9, 0xbf, 0xfe, \n  0x34, 0x0b, 0xff, 0xce, 0x11, 0x00, 0x97, 0xca, 0x00, 0x7e, 0x99, 0xfe, 0xb7, 0x13, 0xff, 0x7a, \n  0x29, 0x00, 0xdd, 0xe3, 0x00, 0xf1, 0xec, 0xff, 0x4a, 0x4c, 0xff, 0x4f, 0x64, 0xff, 0x33, 0xd2, \n  0xfd, 0x50, 0x08, 0xff, 0xb4, 0xae, 0x00, 0x6e, 0x61, 0xff, 0xb9, 0x76, 0xff, 0x68, 0x12, 0x02, \n  0xfa, 0xd7, 0x00, 0x24, 0xfd, 0xfd, 0xac, 0x9d, 0x1f, 0xa7, 0xdc, 0x2b, 0x00, 0xbd, 0x08, 0x97, \n  0x01, 0xf3, 0x3c, 0x65, 0xfa, 0xec, 0xe4, 0x05, 0x4c, 0xb4, 0x09, 0xff, 0xbc, 0x04, 0xcb, 0xdb, \n  0xfd, 0xbb, 0x22, 0xf9, 0xf1, 0x2a, 0xff, 0x3e, 0xcd, 0x02, 0x85, 0xc1, 0xfd, 0x71, 0xfb, 0xfd, \n  0x4e, 0xaa, 0xfe, 0xde, 0xc5, 0xff, 0xe1, 0x60, 0x00, 0xa8, 0x37, 0xfe, 0xed, 0x81, 0xfe, 0xdf, \n  0x97, 0xff, 0xa6, 0xbb, 0x00, 0x6f, 0x94, 0xff, 0x35, 0xf3, 0xfe, 0x2e, 0xa1, 0xff, 0x1d, 0x13, \n  0xfe, 0x22, 0xdd, 0xfe, 0x23, 0x9b, 0x00, 0x3c, 0xb7, 0xff, 0x43, 0x9b, 0xfe, 0x70, 0xfd, 0x00, \n  0xba, 0x07, 0x02, 0xce, 0x8f, 0xfe, 0x9d, 0x8f, 0x22, 0x73, 0xc3, 0x2e, 0xc4, 0xe7, 0x07, 0x5e, \n  0xfd, 0xf0, 0x76, 0x43, 0xfa, 0xfa, 0x55, 0x07, 0xc1, 0x5d, 0x0a, 0x04, 0x41, 0x04, 0x6e, 0xe0, \n  0xfc, 0xa9, 0x56, 0xf8, 0x66, 0xca, 0xff, 0x93, 0xb0, 0x03, 0xaa, 0xbc, 0xfd, 0xbf, 0x67, 0xfd, \n  0xf8, 0x51, 0xfe, 0x06, 0x0e, 0x00, 0x64, 0x48, 0x00, 0xfc, 0x9e, 0xfd, 0x2f, 0x58, 0xfe, 0xea, \n  0xb5, 0xff, 0x48, 0x50, 0x00, 0x9b, 0x2e, 0xff, 0x27, 0xd5, 0xfe, 0x44, 0x6f, 0xff, 0x17, 0xb8, \n  0xfe, 0xea, 0x78, 0xff, 0x75, 0x72, 0x00, 0x52, 0x2b, 0x00, 0x91, 0xa5, 0xfe, 0x8f, 0xb5, 0xff, \n  0xb8, 0x0b, 0x02, 0x8c, 0xf9, 0xff, 0xd4, 0xdd, 0x25, 0x7b, 0x80, 0x31, 0xbf, 0xc7, 0x06, 0x12, \n  0x0d, 0xef, 0xd1, 0xfe, 0xf9, 0xed, 0xc0, 0x08, 0x3e, 0xe3, 0x0a, 0x4e, 0x7c, 0x03, 0x76, 0x96, \n  0xfb, 0x5d, 0x48, 0xf7, 0xe5, 0x7c, 0x00, 0xc0, 0x85, 0x04, 0x55, 0xa2, 0xfd, 0x47, 0xb8, 0xfc, \n  0x3f, 0xc0, 0xfd, 0x0f, 0x21, 0x00, 0x3c, 0x3b, 0x00, 0x07, 0x2a, 0xfd, 0x9f, 0xb8, 0xfd, 0x97, \n  0xd7, 0xff, 0x70, 0x24, 0x00, 0x26, 0x4c, 0xfe, 0x7b, 0xba, 0xfe, 0x44, 0x0a, 0xff, 0xf3, 0xb8, \n  0xfe, 0x89, 0x74, 0x00, 0xd3, 0x6c, 0x00, 0x19, 0x06, 0x00, 0x76, 0x0d, 0xff, 0x11, 0xce, 0xfe, \n  0xd8, 0xf7, 0x00, 0xac, 0x14, 0x01, 0x35, 0x29, 0x29, 0xa6, 0xba, 0x34, 0x62, 0xcd, 0x05, 0xb5, \n  0x23, 0xed, 0xda, 0xb4, 0xf9, 0xad, 0x0a, 0x0a, 0x6c, 0xae, 0x0b, 0x71, 0x96, 0x02, 0x54, 0x73, \n  0xfa, 0x3a, 0x50, 0xf6, 0x03, 0x00, 0x01, 0x2b, 0xa8, 0x05, 0x34, 0x7b, 0xfd, 0x76, 0x30, 0xfc, \n  0x3e, 0x5b, 0xfd, 0xff, 0x13, 0x00, 0x07, 0x28, 0x00, 0xd6, 0xed, 0xfc, 0x99, 0x57, 0xfd, 0x21, \n  0xc1, 0xff, 0x8f, 0x58, 0x00, 0xee, 0x8c, 0xfd, 0x40, 0x78, 0xfe, 0xf5, 0x12, 0xff, 0x99, 0x71, \n  0xfe, 0xff, 0x40, 0x01, 0x19, 0xdb, 0x00, 0xb1, 0xcd, 0xff, 0x72, 0x41, 0xff, 0x69, 0xb1, 0xfe, \n  0xd1, 0xb6, 0xff, 0x43, 0x0d, 0x01, 0x57, 0xbd, 0x2b, 0xd3, 0x2b, 0x38, 0x3c, 0x88, 0x05, 0x13, \n  0xb6, 0xeb, 0x73, 0x47, 0xf9, 0xea, 0xaa, 0x0a, 0xe3, 0xbc, 0x0c, 0xe1, 0xbc, 0x01, 0x5b, 0x86, \n  0xf9, 0x52, 0xab, 0xf5, 0x9d, 0xff, 0x00, 0x0c, 0xd6, 0x06, 0x8a, 0x56, 0xfd, 0x57, 0xb5, 0xfb, \n  0x41, 0x21, 0xfd, 0xd8, 0xfb, 0xff, 0xb1, 0x1d, 0x00, 0x4e, 0x8c, 0xfc, 0x6b, 0x3f, 0xfd, 0x0e, \n  0x7a, 0xff, 0x7a, 0x8a, 0x00, 0xd4, 0x52, 0xfd, 0x41, 0x01, 0xfe, 0xcf, 0x5a, 0xff, 0x4f, 0x23, \n  0xfe, 0x64, 0xba, 0x01, 0x58, 0x7d, 0x01, 0xd1, 0xa2, 0xff, 0x2a, 0x53, 0xff, 0x8d, 0xaa, 0xfe, \n  0xb9, 0x0f, 0xff, 0xec, 0x1c, 0x00, 0x6c, 0xc8, 0x2e, 0x85, 0x52, 0x3b, 0xff, 0xcf, 0x04, 0x4f, \n  0xb6, 0xea, 0x6a, 0xca, 0xf8, 0x62, 0xd7, 0x0a, 0xc4, 0x88, 0x0d, 0x4f, 0xe0, 0x00, 0xf4, 0x98, \n  0xf8, 0xbc, 0x18, 0xf5, 0x02, 0xf6, 0x00, 0x93, 0xa8, 0x07, 0x68, 0x21, 0xfd, 0xae, 0x1e, 0xfb, \n  0xa0, 0xed, 0xfc, 0x05, 0xe4, 0xff, 0xa9, 0xfc, 0xff, 0x54, 0x30, 0xfc, 0x26, 0xfe, 0xfc, 0x7f, \n  0x29, 0xff, 0x83, 0x86, 0x00, 0x12, 0x43, 0xfd, 0x10, 0xad, 0xfd, 0xb2, 0x9f, 0xff, 0x46, 0x0d, \n  0xfe, 0xbf, 0xab, 0x01, 0x8d, 0xff, 0x01, 0xc0, 0xa7, 0xff, 0xb6, 0x2a, 0xff, 0xb0, 0x75, 0xfe, \n  0x91, 0xb1, 0xfe, 0x96, 0x17, 0xff, 0x2b, 0x9a, 0x32, 0xac, 0x8e, 0x3d, 0x12, 0x67, 0x03, 0x58, \n  0x8a, 0xea, 0xfd, 0x8a, 0xf8, 0x69, 0xa3, 0x0a, 0xa2, 0xd5, 0x0d, 0x37, 0x2e, 0x00, 0xa9, 0xea, \n  0xf7, 0xd1, 0x9d, 0xf4, 0x01, 0x08, 0x01, 0xff, 0x04, 0x08, 0xec, 0xe5, 0xfc, 0xac, 0xa2, 0xfa, \n  0x90, 0xb7, 0xfc, 0x88, 0xd8, 0xff, 0x78, 0xc4, 0xff, 0x8f, 0xf8, 0xfb, 0xa5, 0xb7, 0xfc, 0xf8, \n  0xcf, 0xfe, 0x67, 0x55, 0x00, 0x7c, 0x63, 0xfd, 0x4c, 0xa4, 0xfd, 0x80, 0xaa, 0xff, 0xe8, 0x67, \n  0xfe, 0xaa, 0x8b, 0x01, 0xa1, 0xfe, 0x01, 0xea, 0xce, 0xff, 0x7f, 0x20, 0xff, 0x05, 0x22, 0xfe, \n  0xd1, 0x3f, 0xfe, 0x61, 0xa5, 0xfe, 0xa9, 0x5a, 0x36, 0xcb, 0xf4, 0x3f, 0x39, 0x8d, 0x01, 0x07, \n  0x9d, 0xea, 0x60, 0xdf, 0xf8, 0x7d, 0xb7, 0x09, 0xee, 0xc7, 0x0d, 0xa6, 0xbe, 0xff, 0xec, 0x8b, \n  0xf7, 0x4b, 0x38, 0xf4, 0x91, 0xd3, 0x00, 0x87, 0x4b, 0x08, 0x2b, 0xa2, 0xfc, 0xf6, 0x68, 0xfa, \n  0x0a, 0x9c, 0xfc, 0xed, 0x96, 0xff, 0x5c, 0xa6, 0xff, 0x3c, 0xe2, 0xfb, 0x5e, 0x6e, 0xfc, 0x6f, \n  0x74, 0xfe, 0x5b, 0x32, 0x00, 0x76, 0xb3, 0xfd, 0x32, 0xc4, 0xfd, 0x20, 0x94, 0xff, 0x8a, 0xea, \n  0xfe, 0xd8, 0x85, 0x01, 0xc3, 0x9d, 0x01, 0xba, 0xf3, 0xff, 0xe9, 0x39, 0xff, 0xad, 0xd2, 0xfd, \n  0xf0, 0xac, 0xfd, 0xe9, 0xa0, 0xfe, 0x2c, 0x18, 0x3a, 0x3e, 0x93, 0x42, 0x5d, 0x6d, 0xfe, 0x9c, \n  0x7e, 0xea, 0x5f, 0x16, 0xfa, 0x37, 0x0e, 0x08, 0xec, 0x7a, 0x0d, 0xcb, 0x7c, 0xff, 0xbc, 0x44, \n  0xf7, 0x8e, 0xbb, 0xf3, 0x46, 0x42, 0x00, 0xa6, 0x68, 0x08, 0x65, 0x30, 0xfc, 0xa6, 0xa8, 0xfa, \n  0xba, 0x61, 0xfc, 0x04, 0x17, 0xff, 0xe9, 0xa6, 0xff, 0xdd, 0x8e, 0xfb, 0xc9, 0x56, 0xfc, 0xd3, \n  0xe9, 0xfd, 0xef, 0x24, 0x00, 0xdd, 0x2d, 0xfe, 0x32, 0xab, 0xfd, 0x30, 0x92, 0xff, 0xb2, 0x3e, \n  0xff, 0xae, 0x5a, 0x01, 0xe3, 0xfd, 0x00, 0x96, 0x1f, 0x00, 0x78, 0x3b, 0xff, 0x01, 0x66, 0xfd, \n  0x8b, 0x76, 0xfd, 0xf4, 0x7f, 0xfe, 0x84, 0xd1, 0x3f, 0x71, 0x47, 0x44, 0xfe, 0xd0, 0xf8, 0xd5, \n  0xfb, 0xea, 0x91, 0x30, 0xfc, 0x16, 0x70, 0x06, 0x22, 0xeb, 0x0c, 0xcd, 0xf1, 0xfe, 0x6f, 0xed, \n  0xf6, 0x44, 0x19, 0xf3, 0x53, 0x3d, 0x00, 0x3e, 0x52, 0x08, 0x9e, 0x99, 0xfb, 0x75, 0xad, 0xfb, \n  0x25, 0xf6, 0xfb, 0x63, 0xca, 0xfe, 0x14, 0xb8, 0xff, 0xce, 0xde, 0xfa, 0xce, 0x9c, 0xfc, 0x86, \n  0x90, 0xfd, 0x55, 0x68, 0x00, 0xad, 0x69, 0xfe, 0x28, 0x99, 0xfd, 0xe3, 0xfe, 0xff, 0x9d, 0xe4, \n  0xfe, 0xb1, 0x44, 0x01, 0xc2, 0xab, 0x00, 0xf0, 0x16, 0x00, 0x2e, 0x2f, 0xff, 0x26, 0x17, 0xfd, \n  0xa5, 0xf0, 0xfd, 0x47, 0x0a, 0xfe, 0xc7, 0x45, 0x47, 0xac, 0x86, 0x44, 0xa1, 0x37, 0xf1, 0x1a, \n  0x6a, 0xec, 0x9e, 0x2d, 0xfe, 0x00, 0x2c, 0x05, 0x99, 0x55, 0x0c, 0xde, 0xc7, 0xfd, 0x72, 0x9d, \n  0xf6, 0x21, 0x38, 0xf2, 0x7c, 0xdc, 0x00, 0x0b, 0x39, 0x08, 0xd6, 0xf2, 0xfa, 0x93, 0x10, 0xfd, \n  0xdb, 0x7a, 0xfb, 0x2f, 0xb4, 0xfe, 0x2f, 0x89, 0xff, 0x89, 0x27, 0xfa, 0xd0, 0x40, 0xfd, 0x56, \n  0x9e, 0xfd, 0xa3, 0x75, 0x00, 0xb8, 0x51, 0xfe, 0x1d, 0x09, 0xfe, 0x40, 0xd3, 0xff, 0xc8, 0x0f, \n  0xfe, 0x7e, 0xeb, 0x01, 0xa6, 0x43, 0x00, 0x3d, 0xb1, 0xff, 0x8d, 0x93, 0xff, 0x8d, 0x27, 0xfd, \n  0x5b, 0x20, 0xfe, 0x3e, 0x56, 0xfd, 0x68, 0x88, 0x4e, 0xff, 0xce, 0x43, 0x2d, 0x9d, 0xe9, 0x96, \n  0x45, 0xee, 0x55, 0xac, 0xff, 0x76, 0x36, 0x04, 0xd7, 0xb9, 0x0b, 0x93, 0x1a, 0xfc, 0x8e, 0x4d, \n  0xf6, 0xaf, 0x3c, 0xf1, 0x0b, 0xe8, 0x01, 0x66, 0x59, 0x08, 0x6d, 0x1c, 0xfa, 0xb4, 0xba, 0xfe, \n  0x48, 0x15, 0xfb, 0x05, 0x62, 0xfe, 0xc6, 0x40, 0xff, 0xc6, 0xc1, 0xf9, 0x17, 0x7f, 0xfe, 0x89, \n  0x32, 0xfd, 0xed, 0x06, 0x00, 0x73, 0xec, 0xfe, 0x1f, 0x93, 0xfd, 0x82, 0xe9, 0xfe, 0x06, 0x54, \n  0xfe, 0xc6, 0x49, 0x02, 0xd8, 0x77, 0xff, 0x12, 0x08, 0x00, 0x9d, 0x54, 0x00, 0x4d, 0x93, 0xfc, \n  0x3e, 0xd8, 0xfd, 0x9d, 0xae, 0xfd, 0x8d, 0x35, 0x55, 0x78, 0x64, 0x42, 0x7f, 0xa3, 0xe2, 0xba, \n  0x7e, 0xf0, 0xb4, 0xac, 0x00, 0xe0, 0x58, 0x03, 0x18, 0x46, 0x0b, 0xe5, 0x43, 0xfa, 0x80, 0xe5, \n  0xf5, 0xb5, 0xf1, 0xf0, 0x9f, 0x94, 0x03, 0x6a, 0x09, 0x08, 0xbd, 0x8b, 0xf9, 0x19, 0xeb, 0x00, \n  0xa1, 0x47, 0xfa, 0xe8, 0xf0, 0xfd, 0xdf, 0xaa, 0xff, 0xb2, 0x11, 0xfa, 0xe6, 0x1e, 0xff, 0x24, \n  0x88, 0xfc, 0xfa, 0x3d, 0x00, 0x13, 0x72, 0xfe, 0x31, 0xda, 0xfc, 0x8e, 0x2f, 0xff, 0xdf, 0x14, \n  0xfe, 0x5e, 0x8d, 0x02, 0x0d, 0xe6, 0xff, 0x1f, 0x88, 0x00, 0xa7, 0x33, 0x00, 0x1d, 0xfa, 0xfb, \n  0x63, 0x99, 0xfe, 0x78, 0xdf, 0xfd, 0x77, 0x45, 0x5a, 0x32, 0xda, 0x40, 0x77, 0xff, 0xdc, 0x80, \n  0xe2, 0xf2, 0x19, 0xb3, 0x00, 0x86, 0xfd, 0x01, 0x50, 0x9e, 0x0b, 0x9e, 0x41, 0xf8, 0x9f, 0x8d, \n  0xf5, 0x71, 0xbb, 0xf1, 0xe2, 0xb7, 0x04, 0x50, 0x81, 0x07, 0xf1, 0x9d, 0xf9, 0x21, 0xdd, 0x02, \n  0x50, 0xf0, 0xf8, 0x4a, 0x2e, 0xfe, 0x25, 0x1b, 0x01, 0xff, 0x51, 0xf9, 0x38, 0xaa, 0xff, 0xa5, \n  0x37, 0xfc, 0x75, 0xed, 0xfe, 0x7d, 0xb7, 0xfe, 0xe4, 0xef, 0xfc, 0x83, 0x5d, 0xfe, 0x84, 0x63, \n  0xfe, 0x9a, 0xeb, 0x03, 0x0a, 0x05, 0x00, 0xb2, 0x10, 0x00, 0xbc, 0x7a, 0x00, 0x1a, 0x3f, 0xfc, \n  0x4f, 0x8c, 0xfe, 0x33, 0x7c, 0xfd, 0x39, 0x93, 0x5d, 0x0e, 0x20, 0x3e, 0xfe, 0xd1, 0xd9, 0xf4, \n  0x8a, 0xf5, 0x8a, 0xdc, 0xfe, 0x1d, 0xec, 0x00, 0xca, 0xa3, 0x0c, 0xad, 0xd2, 0xf6, 0x5d, 0x5d, \n  0xf5, 0x0a, 0xbc, 0xf2, 0xe3, 0xc8, 0x05, 0x83, 0x9f, 0x06, 0x3f, 0xfb, 0xf9, 0xce, 0x41, 0x04, \n  0x44, 0x5a, 0xf8, 0x67, 0xfc, 0xfe, 0xd0, 0x7d, 0x01, 0x76, 0x2e, 0xf9, 0xa9, 0x52, 0xff, 0x42, \n  0xea, 0xfa, 0x73, 0x45, 0xff, 0x72, 0xc7, 0xfe, 0xa5, 0x4a, 0xfc, 0xe0, 0xad, 0xfe, 0x45, 0x57, \n  0xff, 0xba, 0x6e, 0x04, 0x39, 0x7d, 0xff, 0x02, 0x7e, 0x00, 0x07, 0xeb, 0x00, 0x37, 0x9f, 0xfb, \n  0x2c, 0x7e, 0xfe, 0xac, 0x7a, 0xfd, 0xfc, 0xb8, 0x5e, 0x72, 0x95, 0x3a, 0x25, 0xbb, 0xd9, 0x71, \n  0xc3, 0xf7, 0xab, 0x2b, 0xfb, 0xc0, 0x57, 0x00, 0xac, 0xa0, 0x0e, 0x87, 0x1b, 0xf6, 0x0e, 0xa1, \n  0xf4, 0x41, 0x40, 0xf4, 0x06, 0xe4, 0x06, 0x64, 0xa8, 0x04, 0x54, 0xc2, 0xfa, 0xb4, 0x8e, 0x06, \n  0x61, 0x74, 0xf7, 0xbb, 0x1c, 0xff, 0x49, 0x8a, 0x02, 0xce, 0x9e, 0xf7, 0x3b, 0x9a, 0xfe, 0x20, \n  0xcc, 0xfb, 0x0b, 0x84, 0xfe, 0xa0, 0xcf, 0xfe, 0x3e, 0x36, 0xfd, 0x9e, 0xc5, 0xfe, 0x49, 0x6f, \n  0xff, 0x8d, 0x8e, 0x04, 0x0b, 0xf0, 0xff, 0x9e, 0x71, 0x00, 0x1d, 0xaf, 0x00, 0xe5, 0x7b, 0xfb, \n  0x5b, 0x53, 0xfe, 0x56, 0xc7, 0xfd, 0xc5, 0xa3, 0x5c, 0x13, 0xe8, 0x37, 0x58, 0xf4, 0xdb, 0xcc, \n  0xf2, 0xf8, 0xf6, 0x09, 0xf7, 0x6e, 0x40, 0x00, 0x9c, 0x5c, 0x11, 0x4b, 0x6f, 0xf5, 0x28, 0x43, \n  0xf4, 0xa6, 0x2a, 0xf6, 0x22, 0x68, 0x06, 0x9d, 0x0e, 0x03, 0xc9, 0xc1, 0xfc, 0xf2, 0x8d, 0x07, \n  0x66, 0xaa, 0xf6, 0xdc, 0x79, 0xff, 0xcc, 0xc7, 0x01, 0x01, 0x01, 0xf7, 0x10, 0x1b, 0xff, 0xe5, \n  0xad, 0xfb, 0xb4, 0x88, 0xfe, 0x49, 0xba, 0xff, 0x6b, 0xb9, 0xfd, 0x2c, 0x3b, 0xfe, 0x64, 0x5a, \n  0xff, 0x06, 0x2a, 0x05, 0x33, 0xbf, 0xff, 0x49, 0x0e, 0x00, 0xfe, 0xbe, 0x00, 0xab, 0x51, 0xfb, \n  0xa4, 0x98, 0xfe, 0xf6, 0xe6, 0xfd, 0x29, 0xb1, 0x57, 0xdf, 0xa2, 0x35, 0x56, 0x58, 0xe0, 0x93, \n  0x46, 0xf9, 0xde, 0xbc, 0xf3, 0xc5, 0x54, 0x00, 0xb3, 0x3f, 0x13, 0x26, 0x1a, 0xf6, 0x34, 0x67, \n  0xf4, 0x69, 0xfe, 0xf6, 0x25, 0xff, 0x05, 0x4e, 0x8c, 0x02, 0x50, 0x6b, 0xfd, 0xed, 0x63, 0x08, \n  0xb7, 0x73, 0xf6, 0x51, 0x0b, 0xfe, 0xca, 0x49, 0x02, 0x67, 0x41, 0xf7, 0xdc, 0xc4, 0xfe, 0x1e, \n  0xcb, 0xfc, 0xbb, 0xdd, 0xfe, 0x90, 0x2c, 0x00, 0xb6, 0xcf, 0xfd, 0x1f, 0xee, 0xfd, 0x74, 0x5e, \n  0xff, 0xd4, 0x0d, 0x05, 0x10, 0xa0, 0xff, 0x46, 0x6d, 0xff, 0x94, 0x32, 0x01, 0x29, 0xb3, 0xfb, \n  0x9e, 0x5e, 0xfe, 0x26, 0x1d, 0xfe, 0x83, 0x19, 0x51, 0xbc, 0x58, 0x32, 0x7d, 0xd5, 0xe6, 0x9c, \n  0xb0, 0xf9, 0xc3, 0x21, 0xf1, 0x75, 0x7e, 0x00, 0x86, 0xcc, 0x13, 0x15, 0x22, 0xf8, 0x6f, 0x54, \n  0xf4, 0x7f, 0x55, 0xf8, 0x98, 0xd1, 0x05, 0xaf, 0x98, 0x00, 0xed, 0x16, 0xff, 0xc3, 0xfd, 0x07, \n  0x49, 0xcb, 0xf5, 0x56, 0x33, 0xfe, 0x6b, 0x22, 0x02, 0xf7, 0x16, 0xf8, 0x24, 0x01, 0xff, 0x85, \n  0xf3, 0xfd, 0x8f, 0x3a, 0xff, 0xe1, 0xd0, 0xff, 0x81, 0x5f, 0xfe, 0x65, 0xd7, 0xfd, 0x1a, 0x0a, \n  0xff, 0x55, 0x7d, 0x04, 0xaa, 0x5e, 0xff, 0x08, 0x9b, 0xff, 0xfb, 0x71, 0x01, 0x31, 0xf5, 0xfb, \n  0x2a, 0x55, 0xfe, 0xfb, 0xb0, 0xfe, 0xcd, 0x34, 0x48, 0x4b, 0x1b, 0x30, 0xba, 0xd5, 0xed, 0x8b, \n  0xf6, 0xf9, 0x65, 0x03, 0xf0, 0x17, 0xd3, 0xff, 0xd4, 0xa7, 0x13, 0x2d, 0x3a, 0xfa, 0xd9, 0xbb, \n  0xf5, 0xe3, 0x5f, 0xf9, 0xa6, 0xe7, 0x03, 0xd2, 0x4c, 0x00, 0x4f, 0x5b, 0xff, 0xe0, 0x98, 0x06, \n  0x91, 0xff, 0xf6, 0x58, 0x9c, 0xfd, 0xce, 0x35, 0x02, 0xcc, 0x71, 0xf9, 0xe4, 0x16, 0xff, 0xc8, \n  0x08, 0xff, 0x4b, 0xec, 0xfe, 0x51, 0xb8, 0xff, 0x50, 0x26, 0xff, 0xb5, 0xa9, 0xfd, 0x99, 0x2b, \n  0xfe, 0x41, 0xbc, 0x03, 0x0b, 0xda, 0xff, 0x7e, 0x77, 0xff, 0x3f, 0x6d, 0x01, 0x8b, 0x8f, 0xfc, \n  0x0e, 0x9b, 0xfe, 0x81, 0x28, 0xff, 0xdf, 0x33, 0x3b, 0x5e, 0xb1, 0x2e, 0x7b, 0xfa, 0xf3, 0x4a, \n  0xc8, 0xf8, 0x13, 0x96, 0xf9, 0x7e, 0xa5, 0x00, 0xd6, 0x5c, 0x09, 0x6f, 0x67, 0xfa, 0xfe, 0xa8, \n  0xf7, 0xee, 0xaf, 0xf9, 0x66, 0x14, 0x04, 0x6c, 0x2c, 0x02, 0xfe, 0x4e, 0xff, 0x06, 0xfc, 0x04, \n  0x8d, 0xdd, 0xfa, 0x82, 0xea, 0xfe, 0x74, 0x5f, 0x02, 0x12, 0xfc, 0xfb, 0x34, 0xb1, 0xfe, 0xe5, \n  0xd2, 0xfe, 0x29, 0xcb, 0xff, 0xe3, 0x59, 0xff, 0x5e, 0x97, 0xfe, 0xf8, 0x8a, 0xfe, 0xc7, 0xa7, \n  0xfe, 0x18, 0x53, 0x02, 0x4c, 0x86, 0xff, 0x87, 0x19, 0xff, 0xca, 0x37, 0x01, 0xb1, 0x15, 0xfe, \n  0x89, 0x48, 0xfe, 0xa9, 0xb6, 0xfe, 0x75, 0x5e, 0x32, 0xf6, 0x6c, 0x2c, 0x22, 0x36, 0xfa, 0xe9, \n  0x93, 0xf8, 0xee, 0xc6, 0xf8, 0xe0, 0x91, 0x00, 0x5d, 0x96, 0x09, 0xf8, 0xf0, 0xfc, 0x82, 0x6d, \n  0xf9, 0xc4, 0x29, 0xfa, 0xae, 0x22, 0x02, 0xbf, 0x0b, 0x02, 0x68, 0x83, 0xff, 0xa5, 0x05, 0x04, \n  0x3f, 0x4f, 0xfc, 0xbf, 0x76, 0xfe, 0xfb, 0x12, 0x02, 0x3e, 0x6d, 0xfd, 0xe8, 0x33, 0xff, 0x34, \n  0xb6, 0xff, 0x1a, 0x0d, 0x00, 0x83, 0xac, 0xff, 0x1e, 0x1e, 0xff, 0x38, 0x5f, 0xfe, 0x53, 0x27, \n  0xfe, 0x76, 0xbb, 0x01, 0xaf, 0xdb, 0xff, 0xd9, 0x1d, 0xff, 0xff, 0x41, 0x01, 0x50, 0xe5, 0xfe, \n  0x87, 0x9c, 0xfe, 0xe1, 0xf4, 0xfe, 0xe1, 0x1c, 0x2b, 0x6f, 0x1b, 0x2a, 0x6d, 0xbf, 0xfe, 0x4d, \n  0xa5, 0xf8, 0xd6, 0xe1, 0xf8, 0xc2, 0x62, 0x00, 0x04, 0xed, 0x08, 0xa2, 0x29, 0xff, 0x4e, 0x39, \n  0xfb, 0xad, 0x73, 0xfa, 0x65, 0xf2, 0x00, 0xfc, 0xe4, 0x01, 0xa0, 0x80, 0xff, 0xa4, 0x81, 0x03, \n  0xaf, 0xa1, 0xfd, 0x86, 0x72, 0xfe, 0xa1, 0xde, 0x01, 0x18, 0xc5, 0xfe, 0x7e, 0xaa, 0xff, 0x34, \n  0xe3, 0xff, 0xd3, 0x9e, 0x00, 0x7f, 0x1d, 0x00, 0xe5, 0x37, 0xff, 0xaf, 0xad, 0xfe, 0x20, 0x04, \n  0xfe, 0xcd, 0x06, 0x01, 0x61, 0x20, 0x00, 0xc2, 0x2b, 0xff, 0xdb, 0xe3, 0x00, 0xb2, 0x53, 0xff, \n  0x4a, 0xf7, 0xfe, 0xb0, 0x0c, 0xff, 0xe7, 0xad, 0x25, 0xb8, 0x19, 0x28, 0x81, 0x8b, 0x01, 0x05, \n  0x97, 0xf8, 0xdb, 0x61, 0xf9, 0x16, 0x3b, 0x00, 0x45, 0x12, 0x08, 0x26, 0xa2, 0x00, 0x96, 0x8f, \n  0xfc, 0x49, 0xf0, 0xfa, 0xa1, 0x3e, 0x00, 0x85, 0xc6, 0x01, 0xdd, 0x8e, 0xff, 0xbd, 0xee, 0x02, \n  0xfb, 0xba, 0xfe, 0x11, 0xdb, 0xfe, 0xed, 0x8a, 0x01, 0x90, 0x8e, 0xff, 0x7a, 0xee, 0xff, 0x19, \n  0xe7, 0xff, 0xf0, 0xfe, 0x00, 0xcb, 0x5c, 0x00, 0xa1, 0x57, 0xff, 0x8c, 0xe3, 0xfe, 0x37, 0xe9, \n  0xfd, 0x26, 0x4d, 0x00, 0x81, 0xfc, 0xff, 0xf9, 0x0c, 0xff, 0x14, 0x3a, 0x00, 0x3b, 0x99, 0xff, \n  0x98, 0x64, 0xff, 0xe2, 0x15, 0xff, 0xf3, 0x35, 0x22, 0xed, 0x7f, 0x26, 0xc3, 0x23, 0x03, 0xd3, \n  0x94, 0xf8, 0x2f, 0x1b, 0xfa, 0x2f, 0x71, 0x00, 0xd7, 0x57, 0x07, 0xd1, 0x99, 0x01, 0x14, 0x90, \n  0xfd, 0x70, 0x88, 0xfb, 0x7f, 0x08, 0x00, 0x6b, 0xcc, 0x01, 0x9c, 0x01, 0x00, 0x50, 0x9e, 0x02, \n  0x1a, 0x71, 0xff, 0x69, 0xa8, 0xff, 0xdd, 0x5f, 0x01, 0x64, 0xbc, 0xff, 0x62, 0x43, 0x00, 0x2b, \n  0x17, 0x00, 0xd3, 0x14, 0x01, 0x6b, 0x6d, 0x00, 0xbd, 0x7e, 0xff, 0xc5, 0x2a, 0xff, 0x25, 0xdd, \n  0xfd, 0xa1, 0xa2, 0xff, 0x5c, 0xc3, 0xff, 0x81, 0xff, 0xfe, 0xfa, 0xfd, 0xff, 0xc4, 0x0d, 0x00, \n  0x76, 0xba, 0xff, 0xe9, 0xec, 0xfe, 0xe5, 0xd3, 0x1f, 0xba, 0x7e, 0x25, 0xb3, 0x36, 0x04, 0x0b, \n  0x75, 0xf8, 0x94, 0xde, 0xfa, 0x35, 0xe0, 0x00, 0x63, 0xaf, 0x06, 0x0d, 0x36, 0x02, 0x67, 0x18, \n  0xfe, 0x65, 0x9a, 0xfb, 0xec, 0x16, 0x00, 0xd5, 0xe2, 0x01, 0xd1, 0x43, 0x00, 0x94, 0xbb, 0x02, \n  0xd3, 0x9f, 0xff, 0xac, 0x00, 0x00, 0x92, 0xbe, 0x01, 0x04, 0x88, 0xff, 0x03, 0xdd, 0xff, 0x14, \n  0x44, 0x00, 0x91, 0x28, 0x01, 0xd6, 0x15, 0x00, 0x64, 0x4a, 0xff, 0x5e, 0x94, 0xff, 0x42, 0xe4, \n  0xfd, 0x19, 0xc7, 0xfe, 0x37, 0xa6, 0xff, 0x79, 0x6b, 0xff, 0xce, 0xd8, 0xff, 0xb0, 0xb7, 0xff, \n  0x25, 0xc9, 0xff, 0xa2, 0xa2, 0xff, 0x91, 0x93, 0x1e, 0xf2, 0x14, 0x25, 0x1b, 0xc2, 0x04, 0x79, \n  0x4b, 0xf8, 0xd9, 0x9f, 0xfb, 0x07, 0xbf, 0x01, 0xf5, 0x47, 0x06, 0xfc, 0x22, 0x02, 0xf7, 0x7d, \n  0xfe, 0xdc, 0x3d, 0xfb, 0x83, 0xbe, 0xff, 0x73, 0x59, 0x02, 0x0f, 0xff, 0xff, 0x3b, 0x7b, 0x02, \n  0xa0, 0x64, 0x00, 0x6e, 0xf4, 0xff, 0x2b, 0x8d, 0x01, 0xd2, 0xf9, 0xff, 0x1a, 0x64, 0xff, 0x4e, \n  0x7d, 0xff, 0x1a, 0x5e, 0x01, 0x68, 0x4e, 0x00, 0x3a, 0xa8, 0xfe, 0xc8, 0x26, 0xff, 0xc1, 0x79, \n  0xfe, 0x5e, 0xfe, 0xfe, 0x05, 0x10, 0xff, 0xb0, 0x66, 0xff, 0x12, 0xcd, 0xff, 0x35, 0x66, 0xff, \n  0x91, 0x32, 0x00, 0x99, 0x69, 0xff, 0x79, 0x86, 0x1e, 0x28, 0x6e, 0x25, 0x07, 0x9b, 0x04, 0x32, \n  0xd3, 0xf7, 0xf7, 0x64, 0xfc, 0xb0, 0xc3, 0x02, 0x45, 0xa2, 0x06, 0x76, 0xcc, 0x01, 0xb1, 0xf5, \n  0xfd, 0x16, 0x44, 0xfb, 0x09, 0x54, 0xff, 0xd1, 0xe5, 0x01, 0x53, 0xfb, 0xff, 0xc1, 0x00, 0x02, \n  0xb5, 0x6b, 0x00, 0x94, 0xa9, 0x00, 0xd9, 0x9c, 0x01, 0x1d, 0x9f, 0xff, 0x53, 0x9a, 0xff, 0xee, \n  0x89, 0xff, 0x45, 0x89, 0x00, 0x66, 0x03, 0x00, 0xd5, 0x02, 0xff, 0xa7, 0xed, 0xfe, 0xd3, 0x10, \n  0xfe, 0x36, 0x63, 0xff, 0x04, 0xbf, 0xff, 0xca, 0xbe, 0xfe, 0x54, 0x20, 0xff, 0x5c, 0x16, 0x00, \n  0x83, 0xbe, 0xff, 0xcc, 0x2c, 0xff, 0x31, 0xd3, 0x1e, 0x8f, 0xad, 0x26, 0x98, 0xd7, 0x04, 0xd0, \n  0xda, 0xf6, 0x43, 0xef, 0xfc, 0xbd, 0xf1, 0x03, 0xe3, 0x11, 0x07, 0xbe, 0xd9, 0x01, 0x43, 0x6c, \n  0xfd, 0x88, 0x8f, 0xfa, 0x92, 0x33, 0xff, 0x1e, 0xf5, 0x01, 0x6b, 0x25, 0xff, 0xb8, 0x4e, 0x01, \n  0x60, 0x93, 0x00, 0x84, 0x88, 0x00, 0x1a, 0xf0, 0x01, 0x22, 0x2f, 0x00, 0xd3, 0x6c, 0xff, 0x5c, \n  0xb3, 0xff, 0x6e, 0xe0, 0x00, 0x24, 0x51, 0xff, 0xf6, 0x2d, 0xfe, 0x87, 0x4b, 0xff, 0xcb, 0x8f, \n  0xfe, 0x50, 0x1b, 0xff, 0xde, 0x75, 0xff, 0xab, 0x44, 0xff, 0xbd, 0xcd, 0xff, 0x4e, 0x0d, 0xff, \n  0x1b, 0x17, 0xff, 0x17, 0xea, 0x00, 0x69, 0x78, 0x20, 0x85, 0x53, 0x28, 0x2f, 0x51, 0x04, 0x3a, \n  0xac, 0xf5, 0x48, 0x40, 0xfd, 0xb8, 0x2a, 0x05, 0xe5, 0x97, 0x07, 0x60, 0x9e, 0x01, 0x80, 0x05, \n  0xfd, 0xf6, 0xfd, 0xf9, 0xc1, 0xe3, 0xfe, 0x61, 0x17, 0x02, 0x34, 0xdf, 0xfe, 0xc4, 0x74, 0x00, \n  0xc1, 0xd7, 0xff, 0x8d, 0x83, 0x00, 0x4f, 0x12, 0x02, 0xde, 0xd5, 0xff, 0x3a, 0xa5, 0xff, 0x48, \n  0x78, 0x00, 0xb7, 0xf6, 0x00, 0x99, 0x06, 0xff, 0x3a, 0x12, 0xfe, 0xa9, 0xc2, 0xfe, 0x1c, 0x03, \n  0xfe, 0x49, 0x9b, 0xff, 0x14, 0xe8, 0xff, 0xd3, 0x02, 0xff, 0xca, 0xbc, 0xff, 0x7b, 0x41, 0xff, \n  0xa0, 0x73, 0xff, 0x01, 0xd0, 0x00, 0x43, 0xce, 0x22, 0x7d, 0xaf, 0x2a, 0x8c, 0x54, 0x03, 0x08, \n  0xf3, 0xf3, 0x36, 0xc8, 0xfd, 0x74, 0x53, 0x06, 0x12, 0xb7, 0x07, 0x95, 0x36, 0x01, 0x1b, 0x45, \n  0xfc, 0x9a, 0x60, 0xf9, 0x65, 0x13, 0xff, 0x0d, 0x54, 0x02, 0x2d, 0x76, 0xfe, 0xba, 0x92, 0xff, \n  0xb1, 0x4c, 0xff, 0x84, 0x67, 0x00, 0x57, 0x9b, 0x01, 0xc2, 0x4b, 0xff, 0x1e, 0x5e, 0xff, 0xc8, \n  0x91, 0x00, 0xc3, 0x50, 0x01, 0xd0, 0x09, 0xff, 0x9d, 0x0c, 0xfe, 0xd3, 0x8c, 0xfe, 0x74, 0xb7, \n  0xfd, 0x9c, 0x73, 0xff, 0xc7, 0x87, 0xff, 0xb0, 0x4e, 0xff, 0xef, 0x16, 0x00, 0xb7, 0xe4, 0xfe, \n  0x5f, 0x41, 0xff, 0x05, 0xe3, 0x00, 0x01, 0xe7, 0x25, 0xe0, 0x6c, 0x2d, 0x78, 0xd4, 0x01, 0xd7, \n  0x40, 0xf2, 0x61, 0x77, 0xfe, 0x5a, 0x8b, 0x07, 0xed, 0x94, 0x07, 0xeb, 0x36, 0x00, 0x2d, 0x86, \n  0xfb, 0xaa, 0xbf, 0xf8, 0x48, 0xb0, 0xff, 0xed, 0xf8, 0x02, 0x32, 0xbb, 0xfd, 0x26, 0xf1, 0xfe, \n  0x8f, 0xb0, 0xfe, 0x07, 0x4f, 0x00, 0xaa, 0xb2, 0x01, 0x12, 0x5c, 0xfe, 0xbe, 0xb6, 0xfe, 0x06, \n  0x92, 0x00, 0x6d, 0x21, 0x01, 0x78, 0xa9, 0xfe, 0x15, 0x42, 0xfe, 0x72, 0xd4, 0xfe, 0x8b, 0x95, \n  0xfd, 0x85, 0xe0, 0xff, 0x62, 0x6f, 0xff, 0x30, 0x76, 0xfe, 0x83, 0xff, 0xff, 0x78, 0x58, 0xff, \n  0xcc, 0x10, 0xff, 0xb4, 0xea, 0xff, 0xaf, 0xe0, 0x29, 0x6c, 0x7d, 0x30, 0x10, 0xbf, 0xff, 0x67, \n  0xc2, 0xf0, 0x84, 0x6a, 0xff, 0xa7, 0xa0, 0x08, 0xa2, 0x68, 0x07, 0xcf, 0xce, 0xfe, 0xf8, 0x8c, \n  0xfa, 0x94, 0x56, 0xf8, 0x5e, 0x96, 0x00, 0x39, 0xff, 0x03, 0x27, 0xf3, 0xfc, 0x3d, 0x18, 0xfe, \n  0xb4, 0x71, 0xfe, 0x31, 0x54, 0x00, 0x03, 0x99, 0x01, 0x16, 0xec, 0xfd, 0x79, 0x3c, 0xfe, 0x78, \n  0x02, 0x00, 0x68, 0x02, 0x01, 0x29, 0x49, 0xfe, 0x19, 0xe4, 0xfd, 0x03, 0x59, 0xff, 0x84, 0xd7, \n  0xfd, 0x2b, 0x46, 0x00, 0xce, 0xf9, 0xff, 0xc2, 0x14, 0xfe, 0x73, 0x79, 0xff, 0x25, 0x27, 0xff, \n  0x67, 0xde, 0xfe, 0xfe, 0x53, 0xff, 0xe6, 0x5a, 0x2e, 0xf3, 0xd5, 0x33, 0x4c, 0x8f, 0xfd, 0xa1, \n  0xc5, 0xef, 0xc1, 0x66, 0x00, 0xda, 0x38, 0x09, 0x1d, 0x41, 0x07, 0x8c, 0x79, 0xfd, 0x27, 0xaf, \n  0xf9, 0xa7, 0x18, 0xf8, 0xce, 0x9d, 0x01, 0x02, 0x1d, 0x05, 0x24, 0x57, 0xfc, 0xb2, 0x6c, 0xfd, \n  0xc6, 0x3a, 0xfe, 0x4d, 0xa2, 0x00, 0xdb, 0x82, 0x01, 0x1d, 0x61, 0xfd, 0xc3, 0x46, 0xfe, 0x0b, \n  0x9a, 0xff, 0x0b, 0x93, 0x00, 0xa9, 0x3b, 0xfe, 0x2d, 0xbb, 0xfd, 0x5e, 0x88, 0xff, 0x43, 0x5e, \n  0xfe, 0xa8, 0xac, 0x00, 0x5d, 0x52, 0x00, 0x59, 0x66, 0xfe, 0xfe, 0x5d, 0xff, 0x78, 0xce, 0xfe, \n  0x6b, 0x53, 0xfe, 0x0e, 0xc8, 0xfe, 0x30, 0x42, 0x33, 0xcd, 0x05, 0x37, 0x11, 0xea, 0xfa, 0x2f, \n  0x21, 0xef, 0x91, 0x01, 0x01, 0x71, 0xd8, 0x08, 0x20, 0xd8, 0x06, 0x09, 0x3e, 0xfc, 0x56, 0xe5, \n  0xf8, 0x0c, 0xb6, 0xf7, 0xc9, 0x66, 0x02, 0x8a, 0xd4, 0x05, 0xd1, 0x86, 0xfb, 0x4e, 0xf8, 0xfc, \n  0x12, 0xec, 0xfd, 0x5c, 0xa7, 0x00, 0x6a, 0x5e, 0x01, 0xcf, 0xc1, 0xfc, 0x25, 0xf9, 0xfd, 0x71, \n  0x1c, 0xff, 0x3e, 0x59, 0x00, 0x59, 0x12, 0xfe, 0x70, 0x85, 0xfd, 0x9f, 0xa8, 0xff, 0x59, 0xa4, \n  0xfe, 0x89, 0xb9, 0x00, 0x0a, 0x3e, 0x00, 0x88, 0xd2, 0xfe, 0x8e, 0x47, 0xff, 0xff, 0x5b, 0xfe, \n  0x2d, 0xe2, 0xfd, 0x27, 0x06, 0xfe, 0x63, 0x3c, 0x38, 0xc5, 0x3c, 0x3a, 0xc3, 0x16, 0xf8, 0x98, \n  0x0a, 0xef, 0x79, 0x93, 0x01, 0x81, 0x92, 0x07, 0x37, 0x7a, 0x06, 0x0f, 0x80, 0xfb, 0xc5, 0x81, \n  0xf8, 0x65, 0x65, 0xf7, 0x59, 0xd9, 0x02, 0x37, 0x6c, 0x06, 0xaf, 0xe3, 0xfa, 0xe6, 0xea, 0xfc, \n  0xb7, 0xc3, 0xfd, 0x26, 0x89, 0x00, 0x84, 0x57, 0x01, 0x65, 0x54, 0xfc, 0x56, 0xa9, 0xfd, 0x87, \n  0xa2, 0xfe, 0x87, 0x6e, 0x00, 0xf2, 0x27, 0xfe, 0x01, 0x84, 0xfd, 0x2d, 0xfa, 0xff, 0x0a, 0xb8, \n  0xfe, 0x41, 0xb0, 0x00, 0x75, 0x05, 0x00, 0x07, 0x3f, 0xff, 0xdc, 0x73, 0xff, 0xc1, 0xe5, 0xfd, \n  0x02, 0xe5, 0xfd, 0x3f, 0x60, 0xfd, 0x1e, 0xda, 0x3d, 0xdc, 0x9b, 0x3c, 0xdb, 0x0d, 0xf4, 0x92, \n  0x66, 0xef, 0x82, 0x0f, 0x02, 0x0d, 0x83, 0x05, 0xa3, 0xc3, 0x05, 0xcf, 0xc9, 0xfa, 0x7e, 0x25, \n  0xf8, 0x61, 0xd6, 0xf6, 0x20, 0xff, 0x02, 0x2b, 0x8c, 0x06, 0x81, 0x50, 0xfa, 0xce, 0x2b, 0xfd, \n  0x65, 0x69, 0xfd, 0xda, 0x3f, 0x00, 0x58, 0x1d, 0x01, 0xe0, 0xca, 0xfb, 0xe8, 0x58, 0xfd, 0xc6, \n  0x37, 0xfe, 0x86, 0x76, 0x00, 0x88, 0xfb, 0xfd, 0x7a, 0xa3, 0xfd, 0xd9, 0x13, 0x00, 0x2a, 0x48, \n  0xfe, 0x8a, 0xb9, 0x00, 0x92, 0x8c, 0xff, 0x16, 0x34, 0xff, 0xab, 0xbf, 0xff, 0x11, 0x7b, 0xfd, \n  0x68, 0xe4, 0xfd, 0x12, 0xac, 0xfc, 0x0b, 0x40, 0x44, 0x21, 0xff, 0x3d, 0x5f, 0xa4, 0xee, 0x69, \n  0x75, 0xf0, 0x97, 0xec, 0x02, 0x6b, 0x69, 0x03, 0x22, 0xea, 0x04, 0x3a, 0xed, 0xf9, 0xcb, 0x1e, \n  0xf8, 0x15, 0x17, 0xf6, 0xed, 0x66, 0x03, 0x39, 0xf2, 0x06, 0xea, 0x9d, 0xf9, 0x7b, 0x0b, 0xfe, \n  0x4e, 0x4b, 0xfd, 0xe7, 0xea, 0xff, 0xa3, 0xd9, 0x00, 0xa0, 0x59, 0xfb, 0xbd, 0xd8, 0xfd, 0xc9, \n  0xb1, 0xfd, 0x01, 0x24, 0x00, 0xe2, 0x7f, 0xfe, 0x5e, 0x7a, 0xfd, 0x5c, 0x91, 0xff, 0x9c, 0x57, \n  0xfe, 0x2a, 0xe7, 0x00, 0x78, 0xec, 0xfe, 0x02, 0x64, 0xff, 0xcf, 0x75, 0x00, 0xfc, 0x01, 0xfd, \n  0x56, 0x92, 0xfd, 0xbb, 0xd1, 0xfc, 0x9a, 0x03, 0x4b, 0x26, 0x9b, 0x3d, 0xb2, 0x8c, 0xe8, 0x3c, \n  0x85, 0xf2, 0x34, 0xe8, 0x03, 0x1e, 0xbc, 0x01, 0x46, 0xb4, 0x03, 0x6b, 0xf2, 0xf8, 0x55, 0x30, \n  0xf8, 0x21, 0x4d, 0xf5, 0xc0, 0xeb, 0x04, 0x4f, 0xfe, 0x06, 0xbf, 0xda, 0xf8, 0xb5, 0xe3, 0xff, \n  0xf3, 0xf6, 0xfc, 0xa6, 0x7c, 0xff, 0x84, 0xdd, 0x00, 0xff, 0xc6, 0xfb, 0xb1, 0x3c, 0xfe, 0xfa, \n  0x8a, 0xfc, 0x4d, 0xad, 0x00, 0xb1, 0x77, 0xfe, 0x4f, 0x8d, 0xfc, 0x14, 0xeb, 0xff, 0x9d, 0x42, \n  0xfe, 0xc0, 0xd0, 0x00, 0xf3, 0x38, 0xff, 0x83, 0x04, 0x00, 0x31, 0x9f, 0x00, 0xc9, 0x52, 0xfc, \n  0x23, 0xe6, 0xfd, 0x75, 0x70, 0xfd, 0x36, 0xda, 0x4f, 0xd6, 0xa1, 0x3c, 0xe4, 0x35, 0xe3, 0x7d, \n  0xa8, 0xf4, 0x93, 0x9b, 0x04, 0x3c, 0xb7, 0xff, 0x2a, 0xfa, 0x02, 0x7d, 0xa6, 0xf7, 0x34, 0xf0, \n  0xf7, 0xa5, 0x83, 0xf5, 0xdf, 0x01, 0x06, 0xf4, 0xa9, 0x06, 0x71, 0xdb, 0xf8, 0x0e, 0xac, 0x01, \n  0xc2, 0xe4, 0xfb, 0xdd, 0x75, 0xff, 0x71, 0x0a, 0x02, 0x8c, 0x2f, 0xfb, 0xe9, 0x52, 0xfe, 0xc1, \n  0x40, 0xfc, 0xda, 0xa6, 0xff, 0xc3, 0x4b, 0xfe, 0xc1, 0x9f, 0xfc, 0x63, 0x43, 0xff, 0x34, 0x4f, \n  0xfe, 0x87, 0xf5, 0x01, 0x52, 0x63, 0xff, 0x2d, 0xcd, 0xff, 0x3d, 0xce, 0x00, 0x93, 0x7f, 0xfc, \n  0xd0, 0xdf, 0xfd, 0x30, 0x02, 0xfd, 0x3a, 0x53, 0x52, 0xbc, 0xec, 0x39, 0xc4, 0xc4, 0xe0, 0x98, \n  0x51, 0xf7, 0x78, 0x93, 0x03, 0xd8, 0xa2, 0xfe, 0x14, 0xfd, 0x02, 0x92, 0x9f, 0xf6, 0xeb, 0x0a, \n  0xf8, 0x87, 0xfc, 0xf5, 0x68, 0xfc, 0x06, 0x34, 0x4a, 0x06, 0x8b, 0x4e, 0xf9, 0xe2, 0xe0, 0x02, \n  0x8d, 0xa6, 0xfb, 0xb4, 0x29, 0x00, 0x16, 0x08, 0x02, 0xac, 0x52, 0xfb, 0x9e, 0x51, 0xfe, 0x88, \n  0xca, 0xfa, 0x99, 0xc4, 0xff, 0xe6, 0x5d, 0xfe, 0x21, 0xfb, 0xfb, 0xcc, 0x9d, 0xff, 0x60, 0x46, \n  0xff, 0xfa, 0x6d, 0x02, 0xa5, 0x0e, 0xff, 0xd5, 0x5d, 0x00, 0x70, 0x49, 0x01, 0x16, 0xf4, 0xfb, \n  0x32, 0x97, 0xfd, 0x24, 0x14, 0xfd, 0xd4, 0x34, 0x51, 0xb4, 0xe7, 0x36, 0xc3, 0xf3, 0xe1, 0xe0, \n  0xf4, 0xf8, 0x80, 0x1a, 0x01, 0xe4, 0x85, 0xfe, 0x86, 0x70, 0x04, 0x1a, 0x60, 0xf6, 0x8b, 0x76, \n  0xf7, 0x01, 0x1c, 0xf7, 0xb4, 0xaf, 0x07, 0x34, 0xc3, 0x04, 0xa6, 0x93, 0xfa, 0xf3, 0x0a, 0x05, \n  0xc7, 0xab, 0xfa, 0x39, 0x4a, 0x00, 0x1b, 0x1a, 0x03, 0x62, 0x0b, 0xfa, 0xdd, 0xff, 0xfd, 0x5b, \n  0x8e, 0xfb, 0xc7, 0xcf, 0xfe, 0x81, 0xab, 0xfe, 0xf7, 0x03, 0xfd, 0x7d, 0x6d, 0xff, 0xc1, 0x71, \n  0xff, 0x7e, 0xeb, 0x02, 0xe3, 0x8d, 0xff, 0x09, 0x48, 0x00, 0x9d, 0xea, 0x00, 0xac, 0xff, 0xfb, \n  0xb5, 0xaa, 0xfd, 0x24, 0x4d, 0xfd, 0xc6, 0x84, 0x4c, 0x46, 0xaf, 0x33, 0x88, 0x62, 0xe6, 0xe3, \n  0x70, 0xf9, 0x8b, 0xc6, 0xfd, 0x93, 0x84, 0xff, 0x80, 0x78, 0x06, 0x27, 0x96, 0xf6, 0x09, 0x27, \n  0xf7, 0x9b, 0x31, 0xf8, 0x6f, 0xbf, 0x06, 0xed, 0xe6, 0x03, 0x48, 0xcb, 0xfc, 0x7f, 0x40, 0x05, \n  0x90, 0xad, 0xfa, 0x17, 0x34, 0x00, 0xd9, 0x37, 0x02, 0x00, 0x80, 0xfa, 0x67, 0xfc, 0xfd, 0xd2, \n  0xe9, 0xfb, 0xee, 0x53, 0xff, 0x17, 0x21, 0xff, 0x23, 0x82, 0xfd, 0x97, 0xd6, 0xfe, 0xf9, 0xa6, \n  0xff, 0xff, 0x81, 0x03, 0x79, 0x25, 0xff, 0x1d, 0xc6, 0xff, 0xfa, 0x00, 0x01, 0x30, 0x5b, 0xfc, \n  0xd7, 0xe6, 0xfd, 0x24, 0x86, 0xfd, 0xed, 0xa0, 0x44, 0xde, 0x43, 0x31, 0x77, 0xcf, 0xec, 0xd0, \n  0xe1, 0xf8, 0xa8, 0x0f, 0xfb, 0x91, 0x45, 0x00, 0x5b, 0x34, 0x08, 0xff, 0x21, 0xf8, 0x77, 0xf7, \n  0xf6, 0xb6, 0x9b, 0xf8, 0x57, 0xe5, 0x05, 0xb7, 0xf5, 0x02, 0x95, 0xd9, 0xfd, 0x42, 0xf6, 0x05, \n  0xd3, 0x46, 0xfa, 0x18, 0x10, 0xff, 0xc4, 0xd0, 0x02, 0x82, 0xa3, 0xfa, 0xd4, 0x25, 0xfe, 0x9c, \n  0x9d, 0xfd, 0x4f, 0x46, 0xff, 0xaa, 0x64, 0xff, 0x17, 0xd2, 0xfd, 0xe8, 0x89, 0xfe, 0x18, 0x8a, \n  0xff, 0x99, 0xc3, 0x02, 0x33, 0x22, 0xff, 0x0b, 0x70, 0xff, 0x53, 0x01, 0x01, 0x0d, 0x22, 0xfd, \n  0xbb, 0xee, 0xfd, 0xd6, 0xf4, 0xfd, 0x0f, 0xa2, 0x36, 0xb3, 0xb8, 0x2d, 0xbd, 0xc9, 0xf2, 0x02, \n  0xbb, 0xf8, 0xae, 0x4f, 0x03, 0xdf, 0xa4, 0x02, 0x3a, 0x58, 0x03, 0x53, 0x70, 0xfa, 0x9a, 0xa9, \n  0xf9, 0xde, 0x12, 0xfa, 0x74, 0xb8, 0x04, 0xfd, 0x11, 0x04, 0xb5, 0x94, 0xfd, 0xac, 0x72, 0x02, \n  0x14, 0xa7, 0xfd, 0x26, 0x9e, 0x00, 0x54, 0xa4, 0x01, 0xc9, 0x9f, 0xfc, 0x7a, 0x64, 0xfe, 0x2e, \n  0x00, 0xfd, 0x78, 0x2a, 0xff, 0x2c, 0x56, 0xff, 0x64, 0x64, 0xfe, 0xa4, 0x5d, 0xff, 0x30, 0x8c, \n  0xff, 0x7a, 0x43, 0x02, 0x62, 0xcb, 0xff, 0x63, 0x9e, 0xff, 0x03, 0x9d, 0x00, 0xc5, 0x89, 0xfd, \n  0x1a, 0xef, 0xfd, 0xab, 0xf7, 0xfd, 0x75, 0xde, 0x31, 0xe8, 0x31, 0x2d, 0x28, 0x33, 0xf6, 0x08, \n  0xf8, 0xf5, 0x5a, 0xa0, 0x00, 0x98, 0x24, 0x04, 0xae, 0xbe, 0x05, 0xf2, 0x2a, 0xfc, 0x85, 0xf3, \n  0xf9, 0xe2, 0xfe, 0xf8, 0x43, 0x5a, 0x02, 0x5e, 0xeb, 0x03, 0x95, 0xa1, 0xfe, 0xb9, 0xc1, 0x02, \n  0x7e, 0x64, 0xfe, 0x36, 0x6b, 0x00, 0x1a, 0x6f, 0x02, 0xff, 0xa8, 0xfd, 0x2c, 0x98, 0xfe, 0xf5, \n  0x9b, 0xfe, 0xdb, 0xe9, 0xff, 0x25, 0x3a, 0xff, 0x61, 0xab, 0xfe, 0x12, 0xdd, 0xfe, 0xac, 0xb7, \n  0xfe, 0xd0, 0x1c, 0x02, 0xf9, 0xe7, 0xff, 0x68, 0xfe, 0xfe, 0xc8, 0xc2, 0x00, 0xc3, 0x76, 0xfe, \n  0xc3, 0x30, 0xfe, 0x98, 0x5d, 0xfe, 0xef, 0xe5, 0x2d, 0xeb, 0xe8, 0x2c, 0xc3, 0x5c, 0xf9, 0x9f, \n  0x25, 0xf4, 0x9f, 0x6c, 0xfe, 0x68, 0x30, 0x04, 0xd2, 0xbb, 0x06, 0x2a, 0x12, 0xfe, 0x68, 0xfc, \n  0xfa, 0x55, 0xca, 0xf8, 0xcc, 0xd2, 0x00, 0xc8, 0x63, 0x03, 0x07, 0x19, 0xff, 0xfe, 0xd5, 0x02, \n  0x88, 0x16, 0xff, 0x77, 0x73, 0x00, 0xac, 0xa4, 0x02, 0xaa, 0xae, 0xfe, 0xde, 0xdd, 0xfe, 0x86, \n  0x1c, 0xff, 0xe0, 0xaa, 0x00, 0x84, 0x3e, 0xff, 0xa5, 0xa3, 0xfe, 0x7d, 0x08, 0xff, 0xcb, 0xda, \n  0xfd, 0xab, 0x2e, 0x01, 0xc5, 0x4a, 0x00, 0x5f, 0xc0, 0xfe, 0xac, 0x33, 0x00, 0xed, 0x26, 0xff, \n  0x65, 0xad, 0xfe, 0x17, 0x59, 0xfe, 0x1b, 0x87, 0x2b, 0xe9, 0x0d, 0x2d, 0x17, 0x2d, 0xfb, 0x28, \n  0x2e, 0xf3, 0xc3, 0xc7, 0xfd, 0xf5, 0x50, 0x04, 0xa8, 0x0d, 0x07, 0xae, 0xcb, 0xfe, 0x78, 0x6c, \n  0xfb, 0xc3, 0xf4, 0xf8, 0x95, 0x29, 0x00, 0xe5, 0xff, 0x02, 0xf3, 0xe7, 0xfe, 0xe4, 0xa0, 0x02, \n  0x68, 0x62, 0xff, 0x3f, 0x88, 0x00, 0x12, 0xf9, 0x02, 0x2b, 0x01, 0xff, 0xc5, 0x14, 0xff, 0x91, \n  0x7f, 0xff, 0xe3, 0xa7, 0x00, 0x5b, 0xef, 0xfe, 0xba, 0x58, 0xfe, 0xc0, 0x4c, 0xff, 0xfe, 0x7a, \n  0xfd, 0x1c, 0x0a, 0x00, 0x9c, 0x79, 0x00, 0x32, 0x12, 0xff, 0xea, 0xd1, 0xff, 0x48, 0x21, 0xff, \n  0x16, 0xf7, 0xfe, 0x5e, 0x9f, 0xfe, 0xf0, 0x50, 0x2b, 0xcb, 0x6a, 0x2d, 0x20, 0x1f, 0xfb, 0x55, \n  0xbb, 0xf2, 0xff, 0x07, 0xff, 0x1e, 0x74, 0x05, 0x5d, 0x15, 0x07, 0x74, 0x80, 0xfe, 0xab, 0xd3, \n  0xfa, 0x25, 0xfe, 0xf8, 0xf2, 0x44, 0x00, 0x95, 0x21, 0x03, 0xa0, 0x72, 0xfe, 0x27, 0x83, 0x01, \n  0xb3, 0xa5, 0xff, 0x54, 0xa3, 0x00, 0xb6, 0xa1, 0x02, 0x38, 0x6c, 0xff, 0x79, 0x4c, 0xff, 0xdb, \n  0xcc, 0xff, 0xd5, 0xce, 0x00, 0xb3, 0x7e, 0xfe, 0xff, 0xa7, 0xfd, 0x47, 0xe8, 0xfe, 0xa2, 0xe0, \n  0xfd, 0x65, 0xf6, 0xff, 0xe9, 0xfa, 0xff, 0xf0, 0x5d, 0xff, 0x91, 0xff, 0xff, 0xfc, 0xf5, 0xfe, \n  0x5a, 0x2f, 0xff, 0x73, 0x85, 0xfe, 0xe1, 0x5e, 0x2d, 0x3a, 0x74, 0x2d, 0xc9, 0x48, 0xf9, 0xc0, \n  0x71, 0xf3, 0xed, 0x76, 0x01, 0x5b, 0xeb, 0x06, 0xdd, 0x79, 0x06, 0x46, 0x32, 0xfd, 0x52, 0x2a, \n  0xfa, 0x5f, 0x17, 0xf9, 0x28, 0x06, 0x01, 0xa9, 0x54, 0x03, 0xd0, 0xe8, 0xfd, 0x95, 0x7c, 0x00, \n  0x80, 0xd2, 0xfe, 0x93, 0x03, 0x01, 0x8b, 0x66, 0x02, 0x3a, 0x5f, 0xfe, 0x58, 0xbb, 0xff, 0xc5, \n  0x8f, 0x00, 0x5b, 0x5d, 0x00, 0x1a, 0x35, 0xfe, 0x80, 0x96, 0xfd, 0x6b, 0x48, 0xfe, 0x6d, 0xb5, \n  0xfd, 0x38, 0x7e, 0x00, 0xa1, 0x4b, 0x00, 0x21, 0x29, 0xff, 0xa8, 0xbf, 0xff, 0xeb, 0x3d, 0xff, \n  0x64, 0x28, 0xff, 0x71, 0x14, 0xfe, 0x37, 0x51, 0x30, 0x1f, 0x66, 0x2e, 0x31, 0x69, 0xf7, 0x21, \n  0xb8, 0xf4, 0x88, 0xf5, 0x03, 0xa8, 0xdc, 0x06, 0xe9, 0xe8, 0x04, 0xcd, 0xd7, 0xfb, 0xa6, 0xcf, \n  0xf9, 0x7c, 0xda, 0xf9, 0xf1, 0x73, 0x02, 0xcb, 0xdb, 0x03, 0x85, 0xeb, 0xfc, 0xfa, 0x4e, 0xff, \n  0xeb, 0xb6, 0xfe, 0x9c, 0xee, 0x00, 0xe8, 0x74, 0x01, 0x78, 0xc6, 0xfd, 0x2a, 0x38, 0xff, 0x13, \n  0x27, 0x00, 0x91, 0x55, 0x00, 0x5e, 0xe9, 0xfd, 0x33, 0xbd, 0xfd, 0x98, 0x93, 0xfe, 0x14, 0xec, \n  0xfd, 0xf5, 0x7e, 0x00, 0xda, 0xee, 0xff, 0x34, 0xab, 0xff, 0x3e, 0xed, 0xff, 0x0f, 0x99, 0xfe, \n  0x22, 0xe2, 0xfe, 0xfe, 0xd0, 0xfd, 0x8d, 0x81, 0x34, 0xc7, 0x4e, 0x30, 0x39, 0x55, 0xf5, 0xc5, \n  0xd7, 0xf5, 0x3c, 0xd2, 0x04, 0xd2, 0xbf, 0x04, 0xcb, 0x11, 0x03, 0x20, 0x40, 0xfb, 0x85, 0x37, \n  0xfa, 0x38, 0xf9, 0xfa, 0x11, 0x6f, 0x04, 0x69, 0x24, 0x04, 0x7b, 0x88, 0xfb, 0x3d, 0xcf, 0xfe, \n  0xdf, 0xa7, 0xfe, 0x2b, 0x8c, 0x00, 0x71, 0x4b, 0x00, 0x5b, 0x29, 0xfd, 0xf9, 0x86, 0xfe, 0xd6, \n  0x98, 0xfe, 0x3a, 0x45, 0x00, 0x87, 0x1b, 0xfe, 0xfe, 0xa8, 0xfd, 0x33, 0x66, 0xff, 0x2b, 0x70, \n  0xfe, 0xb3, 0x4a, 0x00, 0x33, 0x94, 0xff, 0xcf, 0x02, 0x00, 0xcd, 0x2b, 0x00, 0x0f, 0xb9, 0xfd, \n  0xe4, 0x6f, 0xfe, 0x80, 0xdc, 0xfd, 0x14, 0x8e, 0x39, 0x11, 0x44, 0x33, 0xc4, 0x51, 0xf2, 0xff, \n  0xc3, 0xf5, 0x72, 0x19, 0x04, 0x46, 0x5c, 0x01, 0x8c, 0x0e, 0x02, 0xea, 0x85, 0xfb, 0x9f, 0xe4, \n  0xfa, 0xaa, 0xcd, 0xfb, 0x9c, 0x27, 0x06, 0x02, 0x3e, 0x04, 0xfa, 0xfd, 0xf9, 0xf9, 0x87, 0xff, \n  0x39, 0x68, 0xfe, 0x9d, 0x20, 0xff, 0xc7, 0x2c, 0x00, 0xe8, 0x7b, 0xfc, 0xb0, 0xf4, 0xfc, 0x59, \n  0xa0, 0xfd, 0x7c, 0x7d, 0x00, 0xc1, 0x16, 0xfe, 0x17, 0x9a, 0xfd, 0xdb, 0x14, 0x00, 0xec, 0x86, \n  0xfe, 0x88, 0x2a, 0x00, 0xda, 0xe1, 0xff, 0x4e, 0x23, 0x00, 0xf1, 0xbb, 0xff, 0x99, 0x21, 0xfd, \n  0xd7, 0x7c, 0xfe, 0x85, 0x7e, 0xfd, 0x38, 0x69, 0x3e, 0xa8, 0x0a, 0x34, 0xdf, 0xfa, 0xee, 0xa6, \n  0xbb, 0xf6, 0x60, 0x7c, 0x03, 0x07, 0xd7, 0xfe, 0xcf, 0x9c, 0x01, 0x8a, 0xd9, 0xfb, 0x91, 0x75, \n  0xfb, 0x8f, 0x65, 0xfc, 0x61, 0x88, 0x07, 0x90, 0x0b, 0x04, 0xdd, 0x98, 0xf9, 0xa9, 0xe1, 0x00, \n  0x1a, 0xc3, 0xfd, 0xc3, 0x74, 0xfe, 0x91, 0x92, 0x00, 0x70, 0xbe, 0xfb, 0xdf, 0x2e, 0xfc, 0x1e, \n  0x0d, 0xfd, 0x5d, 0x73, 0x00, 0x3a, 0x8c, 0xfe, 0xdd, 0x95, 0xfd, 0x6c, 0x49, 0x00, 0x00, 0x07, \n  0xff, 0xb1, 0x77, 0x00, 0xb7, 0x4b, 0x00, 0x71, 0x3c, 0x00, 0x17, 0x72, 0xff, 0x05, 0x47, 0xfd, \n  0xde, 0x52, 0xfe, 0x66, 0xd8, 0xfc, 0x45, 0x28, 0x3f, 0x10, 0x37, 0x33, 0xd7, 0xbd, 0xed, 0x79, \n  0xf9, 0xf7, 0x9c, 0xc8, 0x03, 0x59, 0x24, 0xfe, 0x41, 0x21, 0x01, 0xc1, 0x1f, 0xfb, 0x5c, 0x4b, \n  0xfb, 0x0f, 0x1e, 0xfc, 0x49, 0xbf, 0x07, 0x60, 0x6d, 0x04, 0xe6, 0xd0, 0xf9, 0x34, 0x80, 0x01, \n  0xc3, 0x18, 0xfe, 0x61, 0x68, 0xfe, 0x8b, 0x5c, 0x00, 0xe8, 0x65, 0xfc, 0x8a, 0xfe, 0xfb, 0x9c, \n  0xb4, 0xfb, 0x2f, 0xb7, 0x00, 0xc6, 0x8e, 0xfe, 0xe3, 0x13, 0xfd, 0xff, 0xe7, 0x00, 0x4a, 0x99, \n  0xff, 0x4d, 0xac, 0x00, 0xfb, 0x40, 0x00, 0xea, 0x75, 0x00, 0xed, 0xbf, 0xff, 0xef, 0xc3, 0xfc, \n  0x62, 0xf6, 0xfd, 0x0a, 0x10, 0xfd, 0x9f, 0x65, 0x3c, 0xa5, 0x28, 0x30, 0x52, 0x28, 0xef, 0xa2, \n  0x45, 0xf9, 0x1c, 0x1e, 0x04, 0x93, 0xed, 0xff, 0x7f, 0x5d, 0x01, 0x41, 0x58, 0xfa, 0x65, 0x79, \n  0xfa, 0x12, 0x30, 0xfb, 0x46, 0x2b, 0x07, 0x64, 0x3c, 0x04, 0x1f, 0x38, 0xfb, 0x89, 0x69, 0x02, \n  0x01, 0xbb, 0xfd, 0x16, 0x69, 0xff, 0x7e, 0x39, 0x01, 0x0a, 0x42, 0xfc, 0x45, 0xf4, 0xfc, 0xc9, \n  0xf5, 0xfb, 0xce, 0x78, 0xff, 0x5a, 0xed, 0xfe, 0x47, 0xcb, 0xfd, 0xa0, 0x6d, 0x00, 0x95, 0xe9, \n  0xff, 0x93, 0x35, 0x01, 0xf1, 0x39, 0x00, 0x70, 0x69, 0x00, 0x71, 0xcf, 0xff, 0xff, 0xee, 0xfc, \n  0x9a, 0xdf, 0xfd, 0xa0, 0x8a, 0xfd, 0xb0, 0x52, 0x2e, 0x93, 0xd3, 0x2c, 0x54, 0xc5, 0xf8, 0x09, \n  0x08, 0xf8, 0xd7, 0xba, 0x05, 0xf8, 0xec, 0x02, 0x9b, 0x50, 0x01, 0x84, 0xd1, 0xfc, 0xf4, 0x58, \n  0xfb, 0x8b, 0x69, 0xfd, 0x73, 0xbe, 0x05, 0x61, 0xf0, 0x03, 0x63, 0xe7, 0xfc, 0xa2, 0xd9, 0xff, \n  0xfd, 0x5f, 0xff, 0xce, 0x20, 0x00, 0xb2, 0x7f, 0x00, 0x74, 0x5e, 0xfe, 0x2f, 0x97, 0xfd, 0xc7, \n  0x12, 0xfd, 0x22, 0xfc, 0xff, 0xdc, 0x9f, 0xfe, 0x28, 0x97, 0xfd, 0xa0, 0x13, 0x00, 0xf9, 0x02, \n  0x00, 0x2d, 0x21, 0x01, 0x29, 0x42, 0x01, 0xbc, 0xfc, 0x00, 0xa8, 0x99, 0xff, 0x87, 0xca, 0xfc, \n  0x67, 0xd5, 0xfc, 0x9f, 0x47, 0xfd, 0x14, 0x12, 0x13, 0x14, 0x16, 0x14, 0x13, 0x13, 0x12, 0x11, \n  0x11, 0x11, 0x11, 0x10, 0x12, 0x13, 0x13, 0x14, 0x15, 0x18, 0x16, 0x15, 0x14, 0x13, 0x12, 0x12, \n  0x11, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x10, 0x0e, 0x10, 0x11, 0x12, 0x13, \n  0x14, 0x15, 0x15, 0x16, 0x1a, 0x17, 0x16, 0x15, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, \n  0x0d, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0d, \n  0x0f, 0x10, 0x11, 0x12, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, \n  0x14, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x07, \n  0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0b, 0x0d, 0x0e, 0x0f, \n  0x10, 0x11, 0x11, 0x13, 0x14, 0x15, 0x16, 0x16, 0x17, 0x18, 0x1d, 0x1a, 0x19, 0x18, 0x17, 0x16, \n  0x16, 0x15, 0x14, 0x13, 0x11, 0x10, 0x0f, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, \n  0x07, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x07, 0x07, 0x08, \n  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, \n  0x19, 0x1a, 0x20, 0x1c, 0x1b, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x11, \n  0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x05, 0x04, 0x04, 0x04, \n  0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, \n  0x0a, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, \n  0x23, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x13, 0x13, \n  0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x05, 0x04, 0x03, \n  0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, \n  0x04, 0x04, 0x05, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, \n  0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1c, 0x1b, 0x1a, 0x1a, 0x19, \n  0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x13, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, \n  0x09, 0x08, 0x07, 0x05, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x05, 0x07, 0x08, 0x09, 0x09, \n  0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1c, \n  0x1d, 0x1e, 0x21, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x11, \n  0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x04, 0x03, 0x03, 0x02, \n  0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, \n  0x03, 0x04, 0x04, 0x05, 0x07, 0x08, 0x08, 0x09, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x13, \n  0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1e, 0x20, 0x21, 0x22, 0x1d, 0x1c, 0x1b, 0x1a, \n  0x19, 0x18, 0x17, 0x16, 0x16, 0x15, 0x14, 0x13, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, \n  0x09, 0x08, 0x07, 0x07, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x07, 0x08, 0x09, 0x0a, \n  0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, \n  0x1d, 0x1e, 0x20, 0x20, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, \n  0x13, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x05, 0x05, \n  0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x05, \n  0x05, 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, \n  0x11, 0x13, 0x15, 0x16, 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, \n  0x13, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x05, 0x05, 0x04, 0x03, 0x02, \n  0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, \n  0x05, 0x05, 0x07, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x18, \n  0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x15, 0x15, 0x13, 0x11, 0x10, 0x0f, \n  0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, \n  0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0b, 0x0c, 0x07, 0x09, 0x0a, 0x0b, \n  0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x11, 0x13, 0x13, 0x13, 0x11, 0x11, 0x10, 0x0f, 0x0e, 0x0d, \n  0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, \n  0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x07, 0x04, 0x05, 0x07, 0x08, 0x09, 0x09, 0x0a, \n  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, \n  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x0c, 0x0d, 0x0e, \n  0x0f, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x09, 0x09, \n  0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x08, \n  0x08, 0x05, \n};\n"
  },
  {
    "path": "project/lib/custom/openal/build/version.h",
    "content": "/* Define to the library version */\n#define ALSOFT_VERSION \"1.20.1\"\n\n/* Define the branch being built */\n#define ALSOFT_GIT_BRANCH \"master\"\n\n/* Define the hash of the head commit */\n#define ALSOFT_GIT_COMMIT_HASH \"f5e0eef3\"\n"
  },
  {
    "path": "project/lib/custom/openal/include/config-android.h",
    "content": "/* API declaration export attribute */\n#define AL_API  __attribute__((visibility(\"protected\")))\n#define ALC_API __attribute__((visibility(\"protected\")))\n\n/* Define a restrict macro for non-aliased pointers */\n#define RESTRICT __restrict\n\n/* Define if HRTF data is embedded in the library */\n#define ALSOFT_EMBED_HRTF_DATA\n\n/* Define if we have the C11 aligned_alloc function */\n/* #undef HAVE_ALIGNED_ALLOC */\n\n/* Define if we have the posix_memalign function */\n/* #undef HAVE_POSIX_MEMALIGN */\n\n/* Define if we have the _aligned_malloc function */\n/* #undef HAVE__ALIGNED_MALLOC */\n\n/* Define if we have the proc_pidpath function */\n/* #undef HAVE_PROC_PIDPATH */\n\n/* Define if we have the getopt function */\n/* #undef HAVE_GETOPT */\n\n/* Define if we have SSE CPU extensions */\n/* #undef HAVE_SSE */\n/* #undef HAVE_SSE2 */\n/* #undef HAVE_SSE3 */\n/* #undef HAVE_SSE4_1 */\n\n/* Define if we have ARM Neon CPU extensions */\n/* #undef HAVE_NEON */\n\n/* Define if we have the ALSA backend */\n/* #undef HAVE_ALSA */\n\n/* Define if we have the OSS backend */\n/* #undef HAVE_OSS */\n\n/* Define if we have the Solaris backend */\n/* #undef HAVE_SOLARIS */\n\n/* Define if we have the SndIO backend */\n/* #undef HAVE_SNDIO */\n\n/* Define if we have the QSA backend */\n/* #undef HAVE_QSA */\n\n/* Define if we have the WASAPI backend */\n/* #undef HAVE_WASAPI */\n\n/* Define if we have the DSound backend */\n/* #undef HAVE_DSOUND */\n\n/* Define if we have the Windows Multimedia backend */\n/* #undef HAVE_WINMM */\n\n/* Define if we have the PortAudio backend */\n/* #undef HAVE_PORTAUDIO */\n\n/* Define if we have the PulseAudio backend */\n/* #undef HAVE_PULSEAUDIO */\n\n/* Define if we have the JACK backend */\n/* #undef HAVE_JACK */\n\n/* Define if we have the CoreAudio backend */\n/* #undef HAVE_COREAUDIO */\n\n/* Define if we have the OpenSL backend */\n#define HAVE_OPENSL\n\n/* Define if we have the Wave Writer backend */\n#define HAVE_WAVE\n\n/* Define if we have the SDL2 backend */\n/* #undef HAVE_SDL2 */\n\n/* Define if we have the stat function */\n#define HAVE_STAT\n\n/* Define to the size of a long int type */\n#define SIZEOF_LONG 4\n\n/* Define if we have GCC's format attribute */\n#define HAVE_GCC_FORMAT\n\n/* Define if we have dlfcn.h */\n#define HAVE_DLFCN_H\n\n/* Define if we have pthread_np.h */\n/* #undef HAVE_PTHREAD_NP_H */\n\n/* Define if we have malloc.h */\n#define HAVE_MALLOC_H\n\n/* Define if we have dirent.h */\n#define HAVE_DIRENT_H\n\n/* Define if we have cpuid.h */\n/* #undef HAVE_CPUID_H */\n\n/* Define if we have intrin.h */\n/* #undef HAVE_INTRIN_H */\n\n/* Define if we have sys/sysconf.h */\n#define HAVE_SYS_SYSCONF_H\n\n/* Define if we have guiddef.h */\n/* #undef HAVE_GUIDDEF_H */\n\n/* Define if we have initguid.h */\n/* #undef HAVE_INITGUID_H */\n\n/* Define if we have GCC's __get_cpuid() */\n/* #undef HAVE_GCC_GET_CPUID */\n\n/* Define if we have the __cpuid() intrinsic */\n/* #undef HAVE_CPUID_INTRINSIC */\n\n/* Define if we have the _BitScanForward64() intrinsic */\n/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */\n\n/* Define if we have the _BitScanForward() intrinsic */\n/* #undef HAVE_BITSCANFORWARD_INTRINSIC */\n\n/* Define if we have pthread_setschedparam() */\n#define HAVE_PTHREAD_SETSCHEDPARAM\n\n/* Define if we have pthread_setname_np() */\n/* #undef HAVE_PTHREAD_SETNAME_NP */\n\n/* Define if pthread_setname_np() only accepts one parameter */\n/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */\n\n/* Define if pthread_setname_np() accepts three parameters */\n/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */\n\n/* Define if we have pthread_set_name_np() */\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n"
  },
  {
    "path": "project/lib/custom/openal/include/config-linux-x86_64.h",
    "content": "/* API declaration export attribute */\n#define AL_API  __attribute__((visibility(\"protected\")))\n#define ALC_API __attribute__((visibility(\"protected\")))\n\n/* Define any available alignment declaration */\n#define ALIGN(x) __attribute__((aligned(x)))\n\n/* Define a restrict macro for non-aliased pointers */\n#define RESTRICT __restrict\n\n/* Define if HRTF data is embedded in the library */\n#define ALSOFT_EMBED_HRTF_DATA\n\n/* Define if we have the posix_memalign function */\n#define HAVE_POSIX_MEMALIGN\n\n/* Define if we have the _aligned_malloc function */\n/* #undef HAVE__ALIGNED_MALLOC */\n\n/* Define if we have the proc_pidpath function */\n/* #undef HAVE_PROC_PIDPATH */\n\n/* Define if we have the getopt function */\n/* #undef HAVE_GETOPT */\n\n/* Define if we have SSE CPU extensions */\n#if !defined(RASPBERRYPI) && !defined(HXCPP_ARM64)\n#define HAVE_SSE\n#define HAVE_SSE2\n#define HAVE_SSE3\n/* #undef HAVE_SSE4_1 */\n#endif\n\n/* Define if we have ARM Neon CPU extensions */\n#ifdef RASPBERRYPI\n#define HAVE_NEON\n#endif\n\n/* Define if we have the ALSA backend */\n#define HAVE_ALSA\n\n/* Define if we have the OSS backend */\n#define HAVE_OSS\n\n/* Define if we have the Solaris backend */\n/* #undef HAVE_SOLARIS */\n\n/* Define if we have the SndIO backend */\n/* #undef HAVE_SNDIO */\n\n/* Define if we have the QSA backend */\n/* #undef HAVE_QSA */\n\n/* Define if we have the WASAPI backend */\n/* #undef HAVE_WASAPI */\n\n/* Define if we have the DSound backend */\n/* #undef HAVE_DSOUND */\n\n/* Define if we have the Windows Multimedia backend */\n/* #undef HAVE_WINMM */\n\n/* Define if we have the PortAudio backend */\n/* #undef HAVE_PORTAUDIO */\n\n/* Define if we have the PulseAudio backend */\n#define HAVE_PULSEAUDIO\n\n/* Define if we have the JACK backend */\n/* #undef HAVE_JACK */\n\n/* Define if we have the CoreAudio backend */\n/* #undef HAVE_COREAUDIO */\n\n/* Define if we have the OpenSL backend */\n/* #undef HAVE_OPENSL */\n\n/* Define if we have the Wave Writer backend */\n#define HAVE_WAVE\n\n/* Define if we have the SDL2 backend */\n/* #undef HAVE_SDL2 */\n\n/* Define if we have the stat function */\n#define HAVE_STAT\n\n/* Define to the size of a long int type */\n#define SIZEOF_LONG 8\n\n/* Define if we have GCC's format attribute */\n#define HAVE_GCC_FORMAT\n\n/* Define if we have dlfcn.h */\n#define HAVE_DLFCN_H\n\n/* Define if we have pthread_np.h */\n/* #undef HAVE_PTHREAD_NP_H */\n\n/* Define if we have malloc.h */\n#define HAVE_MALLOC_H\n\n/* Define if we have dirent.h */\n#define HAVE_DIRENT_H\n\n/* Define if we have cpuid.h */\n#if !defined(RASPBERRYPI) && !defined(HXCPP_ARM64)\n#define HAVE_CPUID_H\n#endif\n\n/* Define if we have intrin.h */\n/* #undef HAVE_INTRIN_H */\n\n/* Define if we have sys/sysconf.h */\n/* #undef HAVE_SYS_SYSCONF_H */\n\n/* Define if we have guiddef.h */\n/* #undef HAVE_GUIDDEF_H */\n\n/* Define if we have initguid.h */\n/* #undef HAVE_INITGUID_H */\n\n/* Define if we have GCC's __get_cpuid() */\n#define HAVE_GCC_GET_CPUID\n\n/* Define if we have the __cpuid() intrinsic */\n/* #undef HAVE_CPUID_INTRINSIC */\n\n/* Define if we have the _BitScanForward64() intrinsic */\n/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */\n\n/* Define if we have the _BitScanForward() intrinsic */\n/* #undef HAVE_BITSCANFORWARD_INTRINSIC */\n\n/* Define if we have pthread_setschedparam() */\n#define HAVE_PTHREAD_SETSCHEDPARAM\n\n/* Define if we have pthread_setname_np() */\n/* #undef HAVE_PTHREAD_SETNAME_NP */\n\n/* Define if pthread_setname_np() only accepts one parameter */\n/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */\n\n/* Define if pthread_setname_np() accepts three parameters */\n/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */\n\n/* Define if we have pthread_set_name_np() */\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n"
  },
  {
    "path": "project/lib/custom/openal/include/config-macos-arm64.h",
    "content": "/* API declaration export attribute */\n#define AL_API  __attribute__((visibility(\"default\")))\n#define ALC_API __attribute__((visibility(\"default\")))\n\n/* Define a restrict macro for non-aliased pointers */\n#define RESTRICT __restrict\n\n/* Define if HRTF data is embedded in the library */\n#define ALSOFT_EMBED_HRTF_DATA\n\n/* Define if we have the C11 aligned_alloc function */\n/* #undef HAVE_ALIGNED_ALLOC */\n\n/* Define if we have the posix_memalign function */\n#define HAVE_POSIX_MEMALIGN\n\n/* Define if we have the _aligned_malloc function */\n/* #undef HAVE__ALIGNED_MALLOC */\n\n/* Define if we have the proc_pidpath function */\n/* #undef HAVE_PROC_PIDPATH */\n\n/* Define if we have the getopt function */\n/* #undef HAVE_GETOPT */\n\n/* Define if we have SSE CPU extensions */\n#undef HAVE_SSE\n#undef HAVE_SSE2\n#undef HAVE_SSE3\n/* #undef HAVE_SSE4_1 */\n\n/* Define if we have ARM Neon CPU extensions */\n#define HAVE_NEON\n\n/* Define if we have the ALSA backend */\n/* #undef HAVE_ALSA */\n\n/* Define if we have the OSS backend */\n/* #undef HAVE_OSS */\n\n/* Define if we have the Solaris backend */\n/* #undef HAVE_SOLARIS */\n\n/* Define if we have the SndIO backend */\n/* #undef HAVE_SNDIO */\n\n/* Define if we have the QSA backend */\n/* #undef HAVE_QSA */\n\n/* Define if we have the WASAPI backend */\n/* #undef HAVE_WASAPI */\n\n/* Define if we have the DSound backend */\n/* #undef HAVE_DSOUND */\n\n/* Define if we have the Windows Multimedia backend */\n/* #undef HAVE_WINMM */\n\n/* Define if we have the PortAudio backend */\n/* #undef HAVE_PORTAUDIO */\n\n/* Define if we have the PulseAudio backend */\n/* #undef HAVE_PULSEAUDIO */\n\n/* Define if we have the JACK backend */\n/* #undef HAVE_JACK */\n\n/* Define if we have the CoreAudio backend */\n#define HAVE_COREAUDIO\n\n/* Define if we have the OpenSL backend */\n/* #undef HAVE_OPENSL */\n\n/* Define if we have the Wave Writer backend */\n#define HAVE_WAVE\n\n/* Define if we have the SDL2 backend */\n/* #undef HAVE_SDL2 */\n\n/* Define if we have the stat function */\n#define HAVE_STAT\n\n/* Define to the size of a long int type */\n#define SIZEOF_LONG 8\n\n/* Define if we have GCC's format attribute */\n#define HAVE_GCC_FORMAT\n\n/* Define if we have dlfcn.h */\n#define HAVE_DLFCN_H\n\n/* Define if we have pthread_np.h */\n/* #undef HAVE_PTHREAD_NP_H */\n\n/* Define if we have malloc.h */\n/* #undef HAVE_MALLOC_H */\n\n/* Define if we have dirent.h */\n#define HAVE_DIRENT_H\n\n/* Define if we have cpuid.h */\n#undef HAVE_CPUID_H\n\n/* Define if we have intrin.h */\n/* #undef HAVE_INTRIN_H */\n\n/* Define if we have sys/sysconf.h */\n/* #undef HAVE_SYS_SYSCONF_H */\n\n/* Define if we have guiddef.h */\n/* #undef HAVE_GUIDDEF_H */\n\n/* Define if we have initguid.h */\n/* #undef HAVE_INITGUID_H */\n\n/* Define if we have GCC's __get_cpuid() */\n#undef HAVE_GCC_GET_CPUID\n\n/* Define if we have the __cpuid() intrinsic */\n/* #undef HAVE_CPUID_INTRINSIC */\n\n/* Define if we have the _BitScanForward64() intrinsic */\n/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */\n\n/* Define if we have the _BitScanForward() intrinsic */\n/* #undef HAVE_BITSCANFORWARD_INTRINSIC */\n\n/* Define if we have pthread_setschedparam() */\n#define HAVE_PTHREAD_SETSCHEDPARAM\n\n/* Define if we have pthread_setname_np() */\n/* #undef HAVE_PTHREAD_SETNAME_NP */\n\n/* Define if pthread_setname_np() only accepts one parameter */\n/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */\n\n/* Define if pthread_setname_np() accepts three parameters */\n/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */\n\n/* Define if we have pthread_set_name_np() */\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n"
  },
  {
    "path": "project/lib/custom/openal/include/config-macos-x86_64.h",
    "content": "/* API declaration export attribute */\n#define AL_API  __attribute__((visibility(\"default\")))\n#define ALC_API __attribute__((visibility(\"default\")))\n\n/* Define a restrict macro for non-aliased pointers */\n#define RESTRICT __restrict\n\n/* Define if HRTF data is embedded in the library */\n#define ALSOFT_EMBED_HRTF_DATA\n\n/* Define if we have the C11 aligned_alloc function */\n/* #undef HAVE_ALIGNED_ALLOC */\n\n/* Define if we have the posix_memalign function */\n#define HAVE_POSIX_MEMALIGN\n\n/* Define if we have the _aligned_malloc function */\n/* #undef HAVE__ALIGNED_MALLOC */\n\n/* Define if we have the proc_pidpath function */\n/* #undef HAVE_PROC_PIDPATH */\n\n/* Define if we have the getopt function */\n/* #undef HAVE_GETOPT */\n\n/* Define if we have SSE CPU extensions */\n#define HAVE_SSE\n#define HAVE_SSE2\n#define HAVE_SSE3\n/* #undef HAVE_SSE4_1 */\n\n/* Define if we have ARM Neon CPU extensions */\n/* #undef HAVE_NEON */\n\n/* Define if we have the ALSA backend */\n/* #undef HAVE_ALSA */\n\n/* Define if we have the OSS backend */\n/* #undef HAVE_OSS */\n\n/* Define if we have the Solaris backend */\n/* #undef HAVE_SOLARIS */\n\n/* Define if we have the SndIO backend */\n/* #undef HAVE_SNDIO */\n\n/* Define if we have the QSA backend */\n/* #undef HAVE_QSA */\n\n/* Define if we have the WASAPI backend */\n/* #undef HAVE_WASAPI */\n\n/* Define if we have the DSound backend */\n/* #undef HAVE_DSOUND */\n\n/* Define if we have the Windows Multimedia backend */\n/* #undef HAVE_WINMM */\n\n/* Define if we have the PortAudio backend */\n/* #undef HAVE_PORTAUDIO */\n\n/* Define if we have the PulseAudio backend */\n/* #undef HAVE_PULSEAUDIO */\n\n/* Define if we have the JACK backend */\n/* #undef HAVE_JACK */\n\n/* Define if we have the CoreAudio backend */\n#define HAVE_COREAUDIO\n\n/* Define if we have the OpenSL backend */\n/* #undef HAVE_OPENSL */\n\n/* Define if we have the Wave Writer backend */\n#define HAVE_WAVE\n\n/* Define if we have the SDL2 backend */\n/* #undef HAVE_SDL2 */\n\n/* Define if we have the stat function */\n#define HAVE_STAT\n\n/* Define to the size of a long int type */\n#define SIZEOF_LONG 8\n\n/* Define if we have GCC's format attribute */\n#define HAVE_GCC_FORMAT\n\n/* Define if we have dlfcn.h */\n#define HAVE_DLFCN_H\n\n/* Define if we have pthread_np.h */\n/* #undef HAVE_PTHREAD_NP_H */\n\n/* Define if we have malloc.h */\n/* #undef HAVE_MALLOC_H */\n\n/* Define if we have dirent.h */\n#define HAVE_DIRENT_H\n\n/* Define if we have cpuid.h */\n#define HAVE_CPUID_H\n\n/* Define if we have intrin.h */\n/* #undef HAVE_INTRIN_H */\n\n/* Define if we have sys/sysconf.h */\n/* #undef HAVE_SYS_SYSCONF_H */\n\n/* Define if we have guiddef.h */\n/* #undef HAVE_GUIDDEF_H */\n\n/* Define if we have initguid.h */\n/* #undef HAVE_INITGUID_H */\n\n/* Define if we have GCC's __get_cpuid() */\n#define HAVE_GCC_GET_CPUID\n\n/* Define if we have the __cpuid() intrinsic */\n/* #undef HAVE_CPUID_INTRINSIC */\n\n/* Define if we have the _BitScanForward64() intrinsic */\n/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */\n\n/* Define if we have the _BitScanForward() intrinsic */\n/* #undef HAVE_BITSCANFORWARD_INTRINSIC */\n\n/* Define if we have pthread_setschedparam() */\n#define HAVE_PTHREAD_SETSCHEDPARAM\n\n/* Define if we have pthread_setname_np() */\n/* #undef HAVE_PTHREAD_SETNAME_NP */\n\n/* Define if pthread_setname_np() only accepts one parameter */\n/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */\n\n/* Define if pthread_setname_np() accepts three parameters */\n/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */\n\n/* Define if we have pthread_set_name_np() */\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n"
  },
  {
    "path": "project/lib/custom/openal/include/config-windows-x86.h",
    "content": "/* API declaration export attribute */\n#define AL_API  __declspec(dllexport)\n#define ALC_API __declspec(dllexport)\n\n// #ifndef inline\n// #define inline __inline\n// #endif\n\n#if defined(_MSC_VER) && _MSC_VER <1900\n\t#define snprintf _snprintf\n#endif\n\n#include <math.h>\n\n/* Define a restrict macro for non-aliased pointers */\n#define RESTRICT __restrict\n\n/* Define if HRTF data is embedded in the library */\n#define ALSOFT_EMBED_HRTF_DATA\n\n/* Define if we have the posix_memalign function */\n/* #undef HAVE_POSIX_MEMALIGN */\n\n/* Define if we have the _aligned_malloc function */\n#define HAVE__ALIGNED_MALLOC\n\n/* Define if we have the proc_pidpath function */\n/* #undef HAVE_PROC_PIDPATH */\n\n/* Define if we have the getopt function */\n/* #undef HAVE_GETOPT */\n\n/* Define if we have SSE CPU extensions */\n#define HAVE_SSE\n#define HAVE_SSE2\n/* #undef HAVE_SSE3 */\n/* #undef HAVE_SSE4_1 */\n\n/* Define if we have ARM Neon CPU extensions */\n/* #undef HAVE_NEON */\n\n/* Define if we have the ALSA backend */\n/* #undef HAVE_ALSA */\n\n/* Define if we have the OSS backend */\n/* #undef HAVE_OSS */\n\n/* Define if we have the Solaris backend */\n/* #undef HAVE_SOLARIS */\n\n/* Define if we have the SndIO backend */\n/* #undef HAVE_SNDIO */\n\n/* Define if we have the QSA backend */\n/* #undef HAVE_QSA */\n\n/* Define if we have the WASAPI backend */\n#define HAVE_WASAPI\n\n/* Define if we have the DSound backend */\n#define HAVE_DSOUND\n\n/* Define if we have the Windows Multimedia backend */\n#define HAVE_WINMM\n\n/* Define if we have the PortAudio backend */\n/* #undef HAVE_PORTAUDIO */\n\n/* Define if we have the PulseAudio backend */\n/* #undef HAVE_PULSEAUDIO */\n\n/* Define if we have the JACK backend */\n/* #undef HAVE_JACK */\n\n/* Define if we have the CoreAudio backend */\n/* #undef HAVE_COREAUDIO */\n\n/* Define if we have the OpenSL backend */\n/* #undef HAVE_OPENSL */\n\n/* Define if we have the Wave Writer backend */\n#define HAVE_WAVE\n\n/* Define if we have the SDL2 backend */\n/* #undef HAVE_SDL2 */\n\n/* Define if we have the stat function */\n#define HAVE_STAT\n\n/* Define to the size of a long int type */\n#define SIZEOF_LONG 4\n\n/* Define if we have GCC's format attribute */\n/* #undef HAVE_GCC_FORMAT */\n\n/* Define if we have dlfcn.h */\n/* #undef HAVE_DLFCN_H */\n\n/* Define if we have pthread_np.h */\n/* #undef HAVE_PTHREAD_NP_H */\n\n/* Define if we have malloc.h */\n#define HAVE_MALLOC_H\n\n/* Define if we have dirent.h */\n/* #undef HAVE_DIRENT_H */\n\n/* Define if we have cpuid.h */\n/* #undef HAVE_CPUID_H */\n\n/* Define if we have intrin.h */\n#define HAVE_INTRIN_H\n\n/* Define if we have sys/sysconf.h */\n/* #undef HAVE_SYS_SYSCONF_H */\n\n/* Define if we have guiddef.h */\n#define HAVE_GUIDDEF_H\n\n/* Define if we have initguid.h */\n/* #undef HAVE_INITGUID_H */\n\n/* Define if we have GCC's __get_cpuid() */\n/* #undef HAVE_GCC_GET_CPUID */\n\n/* Define if we have the __cpuid() intrinsic */\n#define HAVE_CPUID_INTRINSIC\n\n/* Define if we have the _BitScanForward64() intrinsic */\n/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */\n\n/* Define if we have the _BitScanForward() intrinsic */\n#define HAVE_BITSCANFORWARD_INTRINSIC\n\n/* Define if we have pthread_setschedparam() */\n/* #undef HAVE_PTHREAD_SETSCHEDPARAM */\n\n/* Define if we have pthread_setname_np() */\n/* #undef HAVE_PTHREAD_SETNAME_NP */\n\n/* Define if pthread_setname_np() only accepts one parameter */\n/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */\n\n/* Define if pthread_setname_np() accepts three parameters */\n/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */\n\n/* Define if we have pthread_set_name_np() */\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n"
  },
  {
    "path": "project/lib/custom/openal/include/config-windows-x86_64.h",
    "content": "/* API declaration export attribute */\n#define AL_API  __declspec(dllexport)\n#define ALC_API __declspec(dllexport)\n\n/* Define a restrict macro for non-aliased pointers */\n#define RESTRICT __restrict\n\n/* Define if HRTF data is embedded in the library */\n#define ALSOFT_EMBED_HRTF_DATA\n\n/* Define if we have the posix_memalign function */\n/* #undef HAVE_POSIX_MEMALIGN */\n\n/* Define if we have the _aligned_malloc function */\n#define HAVE__ALIGNED_MALLOC\n\n/* Define if we have the proc_pidpath function */\n/* #undef HAVE_PROC_PIDPATH */\n\n/* Define if we have the getopt function */\n/* #undef HAVE_GETOPT */\n\n/* Define if we have SSE CPU extensions */\n#define HAVE_SSE\n#define HAVE_SSE2\n/* #undef HAVE_SSE3 */\n/* #undef HAVE_SSE4_1 */\n\n/* Define if we have ARM Neon CPU extensions */\n/* #undef HAVE_NEON */\n\n/* Define if we have the ALSA backend */\n/* #undef HAVE_ALSA */\n\n/* Define if we have the OSS backend */\n/* #undef HAVE_OSS */\n\n/* Define if we have the Solaris backend */\n/* #undef HAVE_SOLARIS */\n\n/* Define if we have the SndIO backend */\n/* #undef HAVE_SNDIO */\n\n/* Define if we have the QSA backend */\n/* #undef HAVE_QSA */\n\n/* Define if we have the WASAPI backend */\n#define HAVE_WASAPI\n\n/* Define if we have the DSound backend */\n/* #undef HAVE_DSOUND */\n\n/* Define if we have the Windows Multimedia backend */\n#define HAVE_WINMM\n\n/* Define if we have the PortAudio backend */\n/* #undef HAVE_PORTAUDIO */\n\n/* Define if we have the PulseAudio backend */\n/* #undef HAVE_PULSEAUDIO */\n\n/* Define if we have the JACK backend */\n/* #undef HAVE_JACK */\n\n/* Define if we have the CoreAudio backend */\n/* #undef HAVE_COREAUDIO */\n\n/* Define if we have the OpenSL backend */\n/* #undef HAVE_OPENSL */\n\n/* Define if we have the Wave Writer backend */\n#define HAVE_WAVE\n\n/* Define if we have the SDL2 backend */\n/* #undef HAVE_SDL2 */\n\n/* Define if we have the stat function */\n#define HAVE_STAT\n\n/* Define to the size of a long int type */\n#define SIZEOF_LONG 4\n\n/* Define if we have GCC's format attribute */\n/* #undef HAVE_GCC_FORMAT */\n\n/* Define if we have dlfcn.h */\n/* #undef HAVE_DLFCN_H */\n\n/* Define if we have pthread_np.h */\n/* #undef HAVE_PTHREAD_NP_H */\n\n/* Define if we have malloc.h */\n#define HAVE_MALLOC_H\n\n/* Define if we have dirent.h */\n/* #undef HAVE_DIRENT_H */\n\n/* Define if we have cpuid.h */\n/* #undef HAVE_CPUID_H */\n\n/* Define if we have intrin.h */\n#define HAVE_INTRIN_H\n\n/* Define if we have sys/sysconf.h */\n/* #undef HAVE_SYS_SYSCONF_H */\n\n/* Define if we have guiddef.h */\n#define HAVE_GUIDDEF_H\n\n/* Define if we have initguid.h */\n/* #undef HAVE_INITGUID_H */\n\n/* Define if we have GCC's __get_cpuid() */\n/* #undef HAVE_GCC_GET_CPUID */\n\n/* Define if we have the __cpuid() intrinsic */\n#define HAVE_CPUID_INTRINSIC\n\n/* Define if we have the _BitScanForward64() intrinsic */\n/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */\n\n/* Define if we have the _BitScanForward() intrinsic */\n#define HAVE_BITSCANFORWARD_INTRINSIC\n\n/* Define if we have pthread_setschedparam() */\n/* #undef HAVE_PTHREAD_SETSCHEDPARAM */\n\n/* Define if we have pthread_setname_np() */\n/* #undef HAVE_PTHREAD_SETNAME_NP */\n\n/* Define if pthread_setname_np() only accepts one parameter */\n/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */\n\n/* Define if pthread_setname_np() accepts three parameters */\n/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */\n\n/* Define if we have pthread_set_name_np() */\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n"
  },
  {
    "path": "project/lib/custom/openal/include/config.h",
    "content": "#if defined(HX_MACOS) && defined(HXCPP_ARM64)\n\n#include \"config-macos-arm64.h\"\n\n#elif defined(HX_MACOS)\n\n#include \"config-macos-x86_64.h\"\n\n#elif defined(HX_WINDOWS)\n\n#ifdef HXCPP_M64\n#include \"config-windows-x86_64.h\"\n#else\n#include \"config-windows-x86.h\"\n#endif\n\n#elif defined(HX_LINUX)\n\n#include \"config-linux-x86_64.h\"\n\n#elif defined (HX_ANDROID)\n\n#include \"config-android.h\"\n\n#endif\n"
  },
  {
    "path": "project/lib/custom/pixman/config.h",
    "content": "/**\n   Modified version of config.h, customized for OpenFL/Lime. The conditional\n   compilation blocks allow this same file to be used across machines.\n\n   Run autogen.sh to generate a new version of this file, but be warned that the\n   new version will lack any conditional compilation blocks, making it\n   machine-specific. (To run autogen.sh on Windows, see\n   https://docs.microsoft.com/en-us/windows/wsl/about .)\n\n   With the new version generated:\n\n   1. Compare this file to project/lib/pixman/config.h.\n   2. If you find a new `#define`, copy it to this file, placing it in a\n      conditional compilation block. Use the existing blocks as a guide.\n   3. Update the version number(s) if they've changed.\n**/\n\n/* Define if building universal (internal helper macro) */\n/* #undef AC_APPLE_UNIVERSAL_BUILD */\n\n/* Whether we have alarm() */\n#ifdef HX_LINUX\n#define HAVE_ALARM 1\n#else\n/* #undef HAVE_ALARM */\n#endif\n\n/* Whether the compiler supports __builtin_clz */\n#if defined(HX_LINUX) || defined(HX_MACOS) || defined(HX_ANDROID)\n#define HAVE_BUILTIN_CLZ /**/\n#else\n/* #undef HAVE_BUILTIN_CLZ */\n#endif\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#ifndef HX_WINDOWS\n#define HAVE_DLFCN_H 1\n#else\n/* #undef HAVE_DLFCN_H */\n#endif\n\n/* Whether we have FE_DIVBYZERO */\n#ifdef HX_LINUX\n#define HAVE_FEDIVBYZERO 1\n#else\n/* #undef HAVE_FEDIVBYZERO */\n#endif\n\n/* Whether we have feenableexcept() */\n#ifdef HX_LINUX\n#define HAVE_FEENABLEEXCEPT 1\n#else\n/* #undef HAVE_FEENABLEEXCEPT */\n#endif\n\n/* Define to 1 if we have <fenv.h> */\n#ifndef HX_WINDOWS\n#define HAVE_FENV_H 1\n#else\n/* #undef HAVE_FENV_H */\n#endif\n\n/* Whether the tool chain supports __float128 */\n#ifdef HX_LINUX\n#define HAVE_FLOAT128 /**/\n#else\n/* #undef HAVE_FLOAT128 */\n#endif\n\n/* Whether the compiler supports GCC vector extensions */\n#ifdef HX_LINUX\n#define HAVE_GCC_VECTOR_EXTENSIONS /**/\n#else\n/* #undef HAVE_GCC_VECTOR_EXTENSIONS */\n#endif\n\n/* Define to 1 if you have the `getisax' function. */\n/* #undef HAVE_GETISAX */\n\n/* Whether we have getpagesize() */\n#ifdef HX_LINUX\n#define HAVE_GETPAGESIZE 1\n#else\n/* #undef HAVE_GETPAGESIZE */\n#endif\n\n/* Whether we have gettimeofday() */\n#ifdef HX_LINUX\n#define HAVE_GETTIMEOFDAY 1\n#else\n/* #undef HAVE_GETTIMEOFDAY */\n#endif\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#ifndef HX_WINDOWS\n#define HAVE_INTTYPES_H 1\n#else\n/* #undef HAVE_INTTYPES_H */\n#endif\n\n/* Define to 1 if you have the `pixman-1' library (-lpixman-1). */\n/* #undef HAVE_LIBPIXMAN_1 */\n\n/* Whether we have libpng */\n#ifdef NATIVE_TOOLKIT_HAVE_PNG\n#define HAVE_LIBPNG 1\n#else\n/* #undef HAVE_LIBPNG */\n#endif\n\n/* Define to 1 if you have the <memory.h> header file. */\n#ifdef HX_LINUX\n#define HAVE_MEMORY_H 1\n#else\n/* #undef HAVE_MEMORY_H */\n#endif\n\n/* Whether we have mmap() */\n#ifdef HX_LINUX\n#define HAVE_MMAP 1\n#else\n/* #undef HAVE_MMAP */\n#endif\n\n/* Whether we have mprotect() */\n#ifdef HX_LINUX\n#define HAVE_MPROTECT 1\n#else\n/* #undef HAVE_MPROTECT */\n#endif\n\n/* Whether we have posix_memalign() */\n#ifdef HX_LINUX\n#define HAVE_POSIX_MEMALIGN 1\n#else\n/* #undef HAVE_POSIX_MEMALIGN */\n#endif\n\n/* Whether pthreads is supported */\n#ifndef HX_WINDOWS\n#define HAVE_PTHREADS /**/\n#else\n/* #undef HAVE_PTHREADS */\n#endif\n\n/* Whether we have sigaction() */\n#ifdef HX_LINUX\n#define HAVE_SIGACTION 1\n#else\n/* #undef HAVE_SIGACTION */\n#endif\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#ifndef HX_WINDOWS\n#define HAVE_STDINT_H 1\n#else\n/* #undef HAVE_STDINT_H */\n#endif\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#ifndef HX_WINDOWS\n#define HAVE_STRINGS_H 1\n#else\n/* #undef HAVE_STRINGS_H */\n#endif\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if we have <sys/mman.h> */\n#ifndef HX_WINDOWS\n#define HAVE_SYS_MMAN_H 1\n#else\n/* #undef HAVE_SYS_MMAN_H */\n#endif\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#ifndef HX_WINDOWS\n#define HAVE_SYS_STAT_H 1\n#else\n/* #undef HAVE_SYS_STAT_H */\n#endif\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#ifndef HX_WINDOWS\n#define HAVE_UNISTD_H 1\n#else\n/* #undef HAVE_UNISTD_H */\n#endif\n\n/* Define to the sub-directory where libtool stores uninstalled libraries. */\n/* #undef LT_OBJDIR */\n\n/* Name of package */\n#define PACKAGE \"pixman\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"pixman@lists.freedesktop.org\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"pixman\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"pixman 0.42.2\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"pixman\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"0.42.2\"\n\n/* enable output that can be piped to gnuplot */\n/* #undef PIXMAN_GNUPLOT */\n\n/* enable TIMER_BEGIN/TIMER_END macros */\n/* #undef PIXMAN_TIMERS */\n\n/* The size of `long', as computed by sizeof. */\n#if (defined(HX_LINUX) && defined(HXCPP_M64)) || defined(HX_MACOS)\n#define SIZEOF_LONG 8\n#else\n#define SIZEOF_LONG 4\n#endif\n\n/* Define to 1 if you have the ANSI C header files. */\n#ifndef HX_WINDOWS\n#define STDC_HEADERS 1\n#else\n/* #undef STDC_HEADERS */\n#endif\n\n/* The compiler supported TLS storage class */\n#if !defined(HX_WINDOWS) && !defined(IPHONE)\n#define TLS __thread\n#else\n/* #undef TLS */\n#endif\n\n/* Whether the tool chain supports __attribute__((constructor)) */\n#ifdef __GNUC__\n#define TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR /**/\n#else\n/* #undef TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR */\n#endif\n\n/* use ARM A64_NEON assembly optimizations */\n/* #undef USE_ARM_A64_NEON */\n\n/* use ARM IWMMXT compiler intrinsics */\n// #if !defined(HX_LINUX) && !defined(HX_MACOS) && !defined(HX_WINDOWS) && !defined(EMSCRIPTEN)\n// #define USE_ARM_IWMMXT 1\n// #else\n/* #undef USE_ARM_IWMMXT */\n// #endif\n\n/* use ARM NEON assembly optimizations */\n// #if defined(HXCPP_ARMV7) || defined(HXCPP_ARMV7S) || defined(HXCPP_ARM64)\n// #define USE_ARM_NEON 1\n// #else\n/* #undef USE_ARM_NEON */\n// #endif\n\n/* use ARM SIMD assembly optimizations */\n// #if defined(HXCPP_ARMV7) || defined(HXCPP_ARMV7S) || defined(HXCPP_ARM64)\n// #define USE_ARM_SIMD 1\n// #else\n/* #undef USE_ARM_SIMD */\n// #endif\n\n/* use GNU-style inline assembler */\n#ifdef __GNUC__\n#define USE_GCC_INLINE_ASM 1\n#else\n/* #undef USE_GCC_INLINE_ASM */\n#endif\n\n/* use Loongson Multimedia Instructions */\n/* #undef USE_LOONGSON_MMI */\n\n/* use MIPS DSPr2 assembly optimizations */\n/* #undef USE_MIPS_DSPR2 */\n\n/* use OpenMP in the test suite */\n/* #undef USE_OPENMP */\n\n/* use SSE2 compiler intrinsics */\n#if defined(HX_WINDOWS) || (defined(HX_MACOS) && !defined(HXCPP_ARM64)) || (defined(HX_LINUX) && !defined(RASPBERRYPI) && !defined(HXCPP_ARM64))\n#define USE_SSE2 1\n#else\n/* #undef USE_SSE2 */\n#endif\n\n/* use SSSE3 compiler intrinsics */\n#if defined(HX_WINDOWS) || (defined(HX_MACOS) && !defined(HXCPP_ARM64)) || (defined(HX_LINUX) && !defined(RASPBERRYPI) && !defined(HXCPP_ARM64))\n#define USE_SSE3 1\n#else\n/* #undef USE_SSE3 */\n#endif\n\n/* use VMX compiler intrinsics */\n/* #undef USE_VMX */\n\n/* use x86 MMX compiler intrinsics */\n#if (defined(HX_WINDOWS) || /*defined(HX_MACOS) ||*/ (defined(HX_LINUX) && !defined(RASPBERRYPI)) ) && !defined(HXCPP_M64)\n#define USE_X86_MMX 1\n#else\n/* #undef USE_X86_MMX */\n#endif\n\n/* Version number of package */\n#define VERSION \"0.42.2\"\n\n/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most\n   significant byte first (like Motorola and SPARC, unlike Intel). */\n#if defined AC_APPLE_UNIVERSAL_BUILD\n# if defined __BIG_ENDIAN__\n#  define WORDS_BIGENDIAN 1\n# endif\n#else\n# ifndef WORDS_BIGENDIAN\n/* #  undef WORDS_BIGENDIAN */\n# endif\n#endif\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n/* #undef inline */\n#endif\n\n/* Define to sqrt if you do not have the `sqrtf' function. */\n/* #undef sqrtf */\n"
  },
  {
    "path": "project/lib/custom/pixman/pixman/pixman-version.h",
    "content": "/*\n * Copyright © 2008 Red Hat, Inc.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use, copy,\n * modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * Author: Carl D. Worth <cworth@cworth.org>\n */\n\n#ifndef PIXMAN_VERSION_H__\n#define PIXMAN_VERSION_H__\n\n#ifndef PIXMAN_H__\n#  error pixman-version.h should only be included by pixman.h\n#endif\n\n#define PIXMAN_VERSION_MAJOR 0\n#define PIXMAN_VERSION_MINOR 40\n#define PIXMAN_VERSION_MICRO 1\n\n#define PIXMAN_VERSION_STRING \"0.40.1\"\n\n#define PIXMAN_VERSION_ENCODE(major, minor, micro) (\t\\\n\t  ((major) * 10000)\t\t\t\t\\\n\t+ ((minor) *   100)\t\t\t\t\\\n\t+ ((micro) *     1))\n\n#define PIXMAN_VERSION PIXMAN_VERSION_ENCODE(\t\\\n\tPIXMAN_VERSION_MAJOR,\t\t\t\\\n\tPIXMAN_VERSION_MINOR,\t\t\t\\\n\tPIXMAN_VERSION_MICRO)\n\n#ifndef PIXMAN_API\n# define PIXMAN_API\n#endif\n\n#endif /* PIXMAN_VERSION_H__ */\n"
  },
  {
    "path": "project/lib/custom/png/pnglibconf.h",
    "content": "/* pnglibconf.h - library build configuration */\n\n/* libpng version 1.6.37 */\n\n/* Copyright (c) 2018-2019 Cosmin Truta */\n/* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */\n\n/* This code is released under the libpng license. */\n/* For conditions of distribution and use, see the disclaimer */\n/* and license in png.h */\n\n/* pnglibconf.h */\n/* Machine generated file: DO NOT EDIT */\n/* Derived from: scripts/pnglibconf.dfa */\n#ifndef PNGLCONF_H\n#define PNGLCONF_H\n/* options */\n#define PNG_16BIT_SUPPORTED\n#define PNG_ALIGNED_MEMORY_SUPPORTED\n/*#undef PNG_ARM_NEON_API_SUPPORTED*/\n/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/\n#define PNG_BENIGN_ERRORS_SUPPORTED\n#define PNG_BENIGN_READ_ERRORS_SUPPORTED\n/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/\n#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED\n#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#define PNG_COLORSPACE_SUPPORTED\n#define PNG_CONSOLE_IO_SUPPORTED\n#define PNG_CONVERT_tIME_SUPPORTED\n#define PNG_EASY_ACCESS_SUPPORTED\n/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/\n#define PNG_ERROR_TEXT_SUPPORTED\n#define PNG_FIXED_POINT_SUPPORTED\n#define PNG_FLOATING_ARITHMETIC_SUPPORTED\n#define PNG_FLOATING_POINT_SUPPORTED\n#define PNG_FORMAT_AFIRST_SUPPORTED\n#define PNG_FORMAT_BGR_SUPPORTED\n#define PNG_GAMMA_SUPPORTED\n#define PNG_GET_PALETTE_MAX_SUPPORTED\n#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED\n#define PNG_INCH_CONVERSIONS_SUPPORTED\n#define PNG_INFO_IMAGE_SUPPORTED\n#define PNG_IO_STATE_SUPPORTED\n#define PNG_MNG_FEATURES_SUPPORTED\n#define PNG_POINTER_INDEXING_SUPPORTED\n/*#undef PNG_POWERPC_VSX_API_SUPPORTED*/\n/*#undef PNG_POWERPC_VSX_CHECK_SUPPORTED*/\n#define PNG_PROGRESSIVE_READ_SUPPORTED\n#define PNG_READ_16BIT_SUPPORTED\n#define PNG_READ_ALPHA_MODE_SUPPORTED\n#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED\n#define PNG_READ_BACKGROUND_SUPPORTED\n#define PNG_READ_BGR_SUPPORTED\n#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#define PNG_READ_COMPOSITE_NODIV_SUPPORTED\n#define PNG_READ_COMPRESSED_TEXT_SUPPORTED\n#define PNG_READ_EXPAND_16_SUPPORTED\n#define PNG_READ_EXPAND_SUPPORTED\n#define PNG_READ_FILLER_SUPPORTED\n#define PNG_READ_GAMMA_SUPPORTED\n#define PNG_READ_GET_PALETTE_MAX_SUPPORTED\n#define PNG_READ_GRAY_TO_RGB_SUPPORTED\n#define PNG_READ_INTERLACING_SUPPORTED\n#define PNG_READ_INT_FUNCTIONS_SUPPORTED\n#define PNG_READ_INVERT_ALPHA_SUPPORTED\n#define PNG_READ_INVERT_SUPPORTED\n#define PNG_READ_OPT_PLTE_SUPPORTED\n#define PNG_READ_PACKSWAP_SUPPORTED\n#define PNG_READ_PACK_SUPPORTED\n#define PNG_READ_QUANTIZE_SUPPORTED\n#define PNG_READ_RGB_TO_GRAY_SUPPORTED\n#define PNG_READ_SCALE_16_TO_8_SUPPORTED\n#define PNG_READ_SHIFT_SUPPORTED\n#define PNG_READ_STRIP_16_TO_8_SUPPORTED\n#define PNG_READ_STRIP_ALPHA_SUPPORTED\n#define PNG_READ_SUPPORTED\n#define PNG_READ_SWAP_ALPHA_SUPPORTED\n#define PNG_READ_SWAP_SUPPORTED\n#define PNG_READ_TEXT_SUPPORTED\n#define PNG_READ_TRANSFORMS_SUPPORTED\n#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_READ_USER_CHUNKS_SUPPORTED\n#define PNG_READ_USER_TRANSFORM_SUPPORTED\n#define PNG_READ_bKGD_SUPPORTED\n#define PNG_READ_cHRM_SUPPORTED\n#define PNG_READ_eXIf_SUPPORTED\n#define PNG_READ_gAMA_SUPPORTED\n#define PNG_READ_hIST_SUPPORTED\n#define PNG_READ_iCCP_SUPPORTED\n#define PNG_READ_iTXt_SUPPORTED\n#define PNG_READ_oFFs_SUPPORTED\n#define PNG_READ_pCAL_SUPPORTED\n#define PNG_READ_pHYs_SUPPORTED\n#define PNG_READ_sBIT_SUPPORTED\n#define PNG_READ_sCAL_SUPPORTED\n#define PNG_READ_sPLT_SUPPORTED\n#define PNG_READ_sRGB_SUPPORTED\n#define PNG_READ_tEXt_SUPPORTED\n#define PNG_READ_tIME_SUPPORTED\n#define PNG_READ_tRNS_SUPPORTED\n#define PNG_READ_zTXt_SUPPORTED\n#define PNG_SAVE_INT_32_SUPPORTED\n#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_SEQUENTIAL_READ_SUPPORTED\n#define PNG_SETJMP_SUPPORTED\n#define PNG_SET_OPTION_SUPPORTED\n#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_SET_USER_LIMITS_SUPPORTED\n#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED\n#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED\n#define PNG_SIMPLIFIED_READ_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED\n#define PNG_SIMPLIFIED_WRITE_SUPPORTED\n#define PNG_STDIO_SUPPORTED\n#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_TEXT_SUPPORTED\n#define PNG_TIME_RFC1123_SUPPORTED\n#define PNG_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_USER_CHUNKS_SUPPORTED\n#define PNG_USER_LIMITS_SUPPORTED\n#define PNG_USER_MEM_SUPPORTED\n#define PNG_USER_TRANSFORM_INFO_SUPPORTED\n#define PNG_USER_TRANSFORM_PTR_SUPPORTED\n/*#undef PNG_WARNINGS_SUPPORTED*/\n#define PNG_WRITE_16BIT_SUPPORTED\n#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED\n#define PNG_WRITE_BGR_SUPPORTED\n#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED\n#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED\n#define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED\n#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED\n#define PNG_WRITE_FILLER_SUPPORTED\n#define PNG_WRITE_FILTER_SUPPORTED\n#define PNG_WRITE_FLUSH_SUPPORTED\n#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED\n#define PNG_WRITE_INTERLACING_SUPPORTED\n#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED\n#define PNG_WRITE_INVERT_ALPHA_SUPPORTED\n#define PNG_WRITE_INVERT_SUPPORTED\n#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED\n#define PNG_WRITE_PACKSWAP_SUPPORTED\n#define PNG_WRITE_PACK_SUPPORTED\n#define PNG_WRITE_SHIFT_SUPPORTED\n#define PNG_WRITE_SUPPORTED\n#define PNG_WRITE_SWAP_ALPHA_SUPPORTED\n#define PNG_WRITE_SWAP_SUPPORTED\n#define PNG_WRITE_TEXT_SUPPORTED\n#define PNG_WRITE_TRANSFORMS_SUPPORTED\n#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED\n#define PNG_WRITE_USER_TRANSFORM_SUPPORTED\n#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED\n#define PNG_WRITE_bKGD_SUPPORTED\n#define PNG_WRITE_cHRM_SUPPORTED\n#define PNG_WRITE_eXIf_SUPPORTED\n#define PNG_WRITE_gAMA_SUPPORTED\n#define PNG_WRITE_hIST_SUPPORTED\n#define PNG_WRITE_iCCP_SUPPORTED\n#define PNG_WRITE_iTXt_SUPPORTED\n#define PNG_WRITE_oFFs_SUPPORTED\n#define PNG_WRITE_pCAL_SUPPORTED\n#define PNG_WRITE_pHYs_SUPPORTED\n#define PNG_WRITE_sBIT_SUPPORTED\n#define PNG_WRITE_sCAL_SUPPORTED\n#define PNG_WRITE_sPLT_SUPPORTED\n#define PNG_WRITE_sRGB_SUPPORTED\n#define PNG_WRITE_tEXt_SUPPORTED\n#define PNG_WRITE_tIME_SUPPORTED\n#define PNG_WRITE_tRNS_SUPPORTED\n#define PNG_WRITE_zTXt_SUPPORTED\n#define PNG_bKGD_SUPPORTED\n#define PNG_cHRM_SUPPORTED\n#define PNG_eXIf_SUPPORTED\n#define PNG_gAMA_SUPPORTED\n#define PNG_hIST_SUPPORTED\n#define PNG_iCCP_SUPPORTED\n#define PNG_iTXt_SUPPORTED\n#define PNG_oFFs_SUPPORTED\n#define PNG_pCAL_SUPPORTED\n#define PNG_pHYs_SUPPORTED\n#define PNG_sBIT_SUPPORTED\n#define PNG_sCAL_SUPPORTED\n#define PNG_sPLT_SUPPORTED\n#define PNG_sRGB_SUPPORTED\n#define PNG_tEXt_SUPPORTED\n#define PNG_tIME_SUPPORTED\n#define PNG_tRNS_SUPPORTED\n#define PNG_zTXt_SUPPORTED\n/* end of options */\n/* settings */\n#define PNG_API_RULE 0\n#define PNG_COST_SHIFT 3\n#define PNG_DEFAULT_READ_MACROS 1\n#define PNG_GAMMA_THRESHOLD_FIXED 5000\n#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE\n#define PNG_INFLATE_BUF_SIZE 1024\n#define PNG_LINKAGE_API extern\n#define PNG_LINKAGE_CALLBACK extern\n#define PNG_LINKAGE_DATA extern\n#define PNG_LINKAGE_FUNCTION extern\n#define PNG_MAX_GAMMA_8 11\n#define PNG_QUANTIZE_BLUE_BITS 5\n#define PNG_QUANTIZE_GREEN_BITS 5\n#define PNG_QUANTIZE_RED_BITS 5\n#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)\n#define PNG_TEXT_Z_DEFAULT_STRATEGY 0\n#define PNG_USER_CHUNK_CACHE_MAX 1000\n#define PNG_USER_CHUNK_MALLOC_MAX 8000000\n#define PNG_USER_HEIGHT_MAX 1000000\n#define PNG_USER_WIDTH_MAX 1000000\n#define PNG_WEIGHT_SHIFT 8\n#define PNG_ZBUF_SIZE 8192\n#define PNG_ZLIB_VERNUM 0 /* unknown */\n#define PNG_Z_DEFAULT_COMPRESSION (-1)\n#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0\n#define PNG_Z_DEFAULT_STRATEGY 1\n#define PNG_sCAL_PRECISION 5\n#define PNG_sRGB_PROFILE_CHECKS 2\n/* end of settings */\n#ifdef HX_WINRT\n/* Prevent pngpriv.h from attempting to reference EndProcess */\n#define PNG_ABORT() abort()\n#endif /* HX_WINRT */\n#endif /* PNGLCONF_H */\n"
  },
  {
    "path": "project/lib/custom/sdl/include/SDL2/SDL.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n/**\n *  \\file SDL.h\n *\n *  Main include header for the SDL library\n */\n\n\n#ifndef SDL_h_\n#define SDL_h_\n\n#include \"SDL_main.h\"\n#include \"SDL_stdinc.h\"\n#include \"SDL_assert.h\"\n#include \"SDL_atomic.h\"\n#include \"SDL_audio.h\"\n#include \"SDL_clipboard.h\"\n#include \"SDL_cpuinfo.h\"\n#include \"SDL_endian.h\"\n#include \"SDL_error.h\"\n#include \"SDL_events.h\"\n#include \"SDL_filesystem.h\"\n#include \"SDL_gamecontroller.h\"\n#include \"SDL_haptic.h\"\n#include \"SDL_hints.h\"\n#include \"SDL_joystick.h\"\n#include \"SDL_loadso.h\"\n#include \"SDL_log.h\"\n#include \"SDL_messagebox.h\"\n#include \"SDL_metal.h\"\n#include \"SDL_mutex.h\"\n#include \"SDL_power.h\"\n#include \"SDL_render.h\"\n#include \"SDL_rwops.h\"\n#include \"SDL_sensor.h\"\n#include \"SDL_shape.h\"\n#include \"SDL_system.h\"\n#include \"SDL_thread.h\"\n#include \"SDL_timer.h\"\n#include \"SDL_version.h\"\n#include \"SDL_video.h\"\n\n#include \"begin_code.h\"\n/* Set up for C function definitions, even when using C++ */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* As of version 0.5, SDL is loaded dynamically into the application */\n\n/**\n *  \\name SDL_INIT_*\n *\n *  These are the flags which may be passed to SDL_Init().  You should\n *  specify the subsystems which you will be using in your application.\n */\n/* @{ */\n#define SDL_INIT_TIMER          0x00000001u\n#define SDL_INIT_AUDIO          0x00000010u\n#define SDL_INIT_VIDEO          0x00000020u  /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */\n#define SDL_INIT_JOYSTICK       0x00000200u  /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */\n#define SDL_INIT_HAPTIC         0x00001000u\n#define SDL_INIT_GAMECONTROLLER 0x00002000u  /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */\n#define SDL_INIT_EVENTS         0x00004000u\n#define SDL_INIT_SENSOR         0x00008000u\n#define SDL_INIT_NOPARACHUTE    0x00100000u  /**< compatibility; this flag is ignored. */\n#define SDL_INIT_EVERYTHING ( \\\n                SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \\\n                SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR \\\n            )\n/* @} */\n\n/**\n *  This function initializes  the subsystems specified by \\c flags\n */\nextern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);\n\n/**\n *  This function initializes specific SDL subsystems\n *\n *  Subsystem initialization is ref-counted, you must call\n *  SDL_QuitSubSystem() for each SDL_InitSubSystem() to correctly\n *  shutdown a subsystem manually (or call SDL_Quit() to force shutdown).\n *  If a subsystem is already loaded then this call will\n *  increase the ref-count and return.\n */\nextern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags);\n\n/**\n *  This function cleans up specific SDL subsystems\n */\nextern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags);\n\n/**\n *  This function returns a mask of the specified subsystems which have\n *  previously been initialized.\n *\n *  If \\c flags is 0, it returns a mask of all initialized subsystems.\n */\nextern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags);\n\n/**\n *  This function cleans up all initialized subsystems. You should\n *  call it upon all exit conditions.\n */\nextern DECLSPEC void SDLCALL SDL_Quit(void);\n\n/* Ends C function definitions when using C++ */\n#ifdef __cplusplus\n}\n#endif\n#include \"close_code.h\"\n\n#endif /* SDL_h_ */\n\n/* vi: set ts=4 sw=4 expandtab: */\n"
  },
  {
    "path": "project/lib/custom/sdl/include/SDL_config.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDL_config_h_\n#define SDL_config_h_\n\n#include \"SDL_platform.h\"\n\n/**\n *  \\file SDL_config.h\n */\n\n/* Add any platform that doesn't build using the configure system. */\n#if defined(__WIN32__)\n#include \"SDL_config_windows.h\"\n#elif defined(__WINRT__)\n#include \"SDL_config_winrt.h\"\n#elif defined(__MACOSX__)\n#include \"SDL_config_macosx.h\"\n#elif defined(__IPHONEOS__)\n#include \"SDL_config_iphoneos.h\"\n#elif defined(__ANDROID__)\n#include \"SDL_config_android.h\"\n#elif defined(__OS2__)\n#include \"SDL_config_os2.h\"\n#elif defined(__EMSCRIPTEN__)\n#include \"SDL_config_emscripten.h\"\n#elif defined(__NGAGE__)\n#include \"SDL_config_ngage.h\"\n#elif defined(RASPBERRYPI)\n#include \"SDL_config_rpi.h\"\n#elif defined(HX_LINUX)\n#include \"SDL_config_linux.h\"\n#else\n/* This is a minimal configuration just to get SDL running on new platforms. */\n#include \"SDL_config_minimal.h\"\n#endif /* platform config */\n\n#endif /* SDL_config_h_ */\n"
  },
  {
    "path": "project/lib/custom/sdl/include/SDL_config_linux.h",
    "content": "/* include/SDL_config.h.  Generated from SDL_config.h.in by configure.  */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDL_config_linux_h_\n#define SDL_config_linux_h_\n\n#ifdef HX_LINUX\n\n\n/* General platform specific identifiers */\n#include \"SDL_platform.h\"\n\n/* Make sure that this isn't included by Visual C++ */\n#ifdef _MSC_VER\n#error You should run hg revert SDL_config.h\n#endif\n\n/* C language features */\n/* #undef const */\n/* #undef inline */\n/* #undef volatile */\n\n/* C datatypes */\n#ifdef __LP64__\n#define SIZEOF_VOIDP 8\n#else\n#define SIZEOF_VOIDP 4\n#endif\n#define HAVE_GCC_ATOMICS 1\n/* #undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET */\n#define HAVE_PTHREAD_SPINLOCK 1\n\n/* Comment this if you want to build without any C library requirements */\n#define HAVE_LIBC 1\n#if HAVE_LIBC\n\n#define HAVE_INOTIFY 1\n\n/* Useful headers */\n#define HAVE_ALLOCA_H 1\n#define HAVE_SYS_TYPES_H 1\n#define HAVE_STDIO_H 1\n#define STDC_HEADERS 1\n#define HAVE_STDLIB_H 1\n#define HAVE_STDARG_H 1\n#define HAVE_MALLOC_H 1\n#define HAVE_MEMORY_H 1\n#define HAVE_STRING_H 1\n#define HAVE_STRINGS_H 1\n#define HAVE_INTTYPES_H 1\n#define HAVE_STDINT_H 1\n#define HAVE_CTYPE_H 1\n#define HAVE_MATH_H 1\n#define HAVE_ICONV_H 1\n#define HAVE_SIGNAL_H 1\n/* #undef HAVE_ALTIVEC_H */\n/* #undef HAVE_PTHREAD_NP_H */\n/* #undef HAVE_LIBUDEV_H */\n/* #undef HAVE_DBUS_DBUS_H */\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC    1\n#define HAVE_FREE   1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_UNSETENV   1\n#define HAVE_QSORT  1\n#define HAVE_ABS    1\n#define HAVE_BCOPY  1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE    1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n/* #undef HAVE_STRLCPY */\n/* #undef HAVE_STRLCAT */\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR    1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL    1\n#define HAVE_STRTOLL    1\n#define HAVE_STRTOULL   1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI   1\n#define HAVE_ATOF   1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP    1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF  1\n#define HAVE_M_PI   1\n#define HAVE_ACOS   1\n#define HAVE_ACOSF  1\n#define HAVE_ASIN   1\n#define HAVE_ASINF  1\n#define HAVE_ATAN   1\n#define HAVE_ATANF  1\n#define HAVE_ATAN2  1\n#define HAVE_ATAN2F 1\n#define HAVE_CEIL   1\n#define HAVE_CEILF  1\n#define HAVE_COPYSIGN   1\n#define HAVE_COPYSIGNF  1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_EXP    1\n#define HAVE_EXPF   1\n#define HAVE_FABS   1\n#define HAVE_FABSF  1\n#define HAVE_FLOOR  1\n#define HAVE_FLOORF 1\n#define HAVE_FMOD   1\n#define HAVE_FMODF  1\n#define HAVE_LOG    1\n#define HAVE_LOGF   1\n#define HAVE_LOG10  1\n#define HAVE_LOG10F 1\n#define HAVE_POW    1\n#define HAVE_POWF   1\n#define HAVE_SCALBN 1\n#define HAVE_SCALBNF    1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#define HAVE_SIGACTION  1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP  1\n#define HAVE_SYSCONF    1\n/* #undef HAVE_SYSCTLBYNAME */\n\n#else\n#define HAVE_STDARG_H 1\n#define HAVE_STDDEF_H 1\n#define HAVE_STDINT_H 1\n#endif /* HAVE_LIBC */\n\n/* SDL internal assertion support */\n/* #undef SDL_DEFAULT_ASSERT_LEVEL */\n\n/* Allow disabling of core subsystems */\n/* #undef SDL_ATOMIC_DISABLED */\n/* #undef SDL_AUDIO_DISABLED */\n/* #undef SDL_CPUINFO_DISABLED */\n/* #undef SDL_EVENTS_DISABLED */\n/* #undef SDL_FILE_DISABLED */\n/* #undef SDL_JOYSTICK_DISABLED */\n/* #undef SDL_HAPTIC_DISABLED */\n/* #undef SDL_LOADSO_DISABLED */\n/* #undef SDL_RENDER_DISABLED */\n/* #undef SDL_THREADS_DISABLED */\n/* #undef SDL_TIMERS_DISABLED */\n/* #undef SDL_VIDEO_DISABLED */\n/* #undef SDL_POWER_DISABLED */\n/* #undef SDL_FILESYSTEM_DISABLED */\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_ALSA 1\n#define SDL_AUDIO_DRIVER_ALSA_DYNAMIC \"libasound.so.2\"\n/* #undef SDL_AUDIO_DRIVER_ARTS */\n/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */\n#define SDL_AUDIO_DRIVER_PULSEAUDIO 1\n#define SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC \"libpulse.so.0\"\n/* #undef SDL_AUDIO_DRIVER_HAIKU */\n/* #undef SDL_AUDIO_DRIVER_BSD */\n/* #undef SDL_AUDIO_DRIVER_COREAUDIO */\n#define SDL_AUDIO_DRIVER_DISK 1\n#define SDL_AUDIO_DRIVER_DUMMY 1\n/* #undef SDL_AUDIO_DRIVER_XAUDIO2 */\n/* #undef SDL_AUDIO_DRIVER_DSOUND */\n/* #undef SDL_AUDIO_DRIVER_ESD */\n/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_NAS */\n/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_SNDIO */\n/* #undef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC */\n#define SDL_AUDIO_DRIVER_OSS 1\n/* #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H */\n/* #undef SDL_AUDIO_DRIVER_PAUDIO */\n/* #undef SDL_AUDIO_DRIVER_QSA */\n/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */\n/* #undef SDL_AUDIO_DRIVER_WINMM */\n/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND */\n/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC */\n\n/* Enable various input drivers */\n#define SDL_INPUT_LINUXEV 1\n#define SDL_INPUT_LINUXKD 1\n/* #undef SDL_INPUT_TSLIB */\n/* #undef SDL_JOYSTICK_HAIKU */\n/* #undef SDL_JOYSTICK_DINPUT */\n/* #undef SDL_JOYSTICK_DUMMY */\n/* #undef SDL_JOYSTICK_IOKIT */\n#define SDL_JOYSTICK_LINUX 1\n/* #undef SDL_JOYSTICK_HIDAPI */\n/* #undef SDL_JOYSTICK_WINMM */\n/* #undef SDL_JOYSTICK_USBHID */\n/* #undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H */\n/* #undef SDL_HAPTIC_DUMMY */\n#define SDL_HAPTIC_LINUX 1\n/* #undef SDL_HAPTIC_IOKIT */\n/* #undef SDL_HAPTIC_DINPUT */\n\n/* Enable the dummy sensor driver */\n#define SDL_SENSOR_DUMMY  1\n\n/* Enable various shared object loading systems */\n/* #undef SDL_LOADSO_HAIKU */\n#define SDL_LOADSO_DLOPEN 1\n/* #undef SDL_LOADSO_DUMMY */\n/* #undef SDL_LOADSO_LDG */\n/* #undef SDL_LOADSO_WINDOWS */\n\n/* Enable various threading systems */\n#define SDL_THREAD_PTHREAD 1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1\n/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */\n/* #undef SDL_THREAD_WINDOWS */\n\n/* Enable various timer systems */\n/* #undef SDL_TIMER_HAIKU */\n/* #undef SDL_TIMER_DUMMY */\n#define SDL_TIMER_UNIX 1\n/* #undef SDL_TIMER_WINDOWS */\n\n/* Enable various video drivers */\n/* #undef SDL_VIDEO_DRIVER_HAIKU */\n/* #undef SDL_VIDEO_DRIVER_COCOA */\n/* #undef SDL_VIDEO_DRIVER_DIRECTFB */\n/* #undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC */\n#define SDL_VIDEO_DRIVER_DUMMY 1\n/* #undef SDL_VIDEO_DRIVER_WINDOWS */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON */\n/* #undef SDL_VIDEO_DRIVER_MIR */\n/* #undef SDL_VIDEO_DRIVER_MIR_DYNAMIC */\n/* #undef SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON */\n#define SDL_VIDEO_DRIVER_X11 1\n/* #undef SDL_VIDEO_DRIVER_RPI */\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC \"libX11.so.6\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT \"libXext.so.6\"\n/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR */\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA \"libXinerama.so.1\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 \"libXi.so.6\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR \"libxrandr.so.2\"\n/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS */\n/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE */\n/* #undef SDL_VIDEO_DRIVER_X11_XCURSOR */\n#define  SDL_VIDEO_DRIVER_X11_XINERAMA 1\n#define SDL_VIDEO_DRIVER_X11_XINPUT2 NATIVE_TOOLKIT_SDL_X11_XINPUT2\n#define SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH NATIVE_TOOLKIT_SDL_X11_XINPUT2_SUPPORTS_MULTITOUCH\n#define SDL_VIDEO_DRIVER_X11_XRANDR 1\n/* #undef SDL_VIDEO_DRIVER_X11_XSCRNSAVER */\n#define SDL_VIDEO_DRIVER_X11_XSHAPE 1\n/* #undef SDL_VIDEO_DRIVER_X11_XVIDMODE */\n#define SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1\n/* #undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XDATA32 */\n/* #undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY */\n#define SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM 1\n\n/* #undef SDL_VIDEO_RENDER_D3D */\n/* #undef SDL_VIDEO_RENDER_D3D11 */\n#define SDL_VIDEO_RENDER_OGL 1\n/* #undef SDL_VIDEO_RENDER_OGL_ES */\n/* #undef SDL_VIDEO_RENDER_OGL_ES2 */\n/* #undef SDL_VIDEO_RENDER_DIRECTFB */\n\n/* Enable OpenGL support */\n#define SDL_VIDEO_OPENGL 1\n/* #undef SDL_VIDEO_OPENGL_ES */\n/* #undef SDL_VIDEO_OPENGL_ES2 */\n/* #undef SDL_VIDEO_OPENGL_BGL */\n/* #undef SDL_VIDEO_OPENGL_CGL */\n/* #undef SDL_VIDEO_OPENGL_EGL */\n#define SDL_VIDEO_OPENGL_GLX 1\n/* #undef SDL_VIDEO_OPENGL_WGL */\n/* #undef SDL_VIDEO_OPENGL_OSMESA */\n/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */\n\n/* Enable system power support */\n#define SDL_POWER_LINUX 1\n/* #undef SDL_POWER_WINDOWS */\n/* #undef SDL_POWER_MACOSX */\n/* #undef SDL_POWER_HAIKU */\n/* #undef SDL_POWER_HARDWIRED */\n\n/* Enable system filesystem support */\n/* #undef SDL_FILESYSTEM_HAIKU */\n/* #undef SDL_FILESYSTEM_COCOA */\n/* #undef SDL_FILESYSTEM_DUMMY */\n#define SDL_FILESYSTEM_UNIX 1\n/* #undef SDL_FILESYSTEM_WINDOWS */\n\n/* Enable assembly routines */\n#define SDL_ASSEMBLY_ROUTINES 1\n/* #undef SDL_ALTIVEC_BLITTERS */\n\n#endif //HX_LINUX\n\n#endif /* SDL_config_linux_h_ */\n"
  },
  {
    "path": "project/lib/custom/sdl/include/SDL_config_macosx.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDL_config_macosx_h_\n#define SDL_config_macosx_h_\n#define SDL_config_h_\n\n#include \"SDL_platform.h\"\n\n/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */\n#include <AvailabilityMacros.h>\n\n/* This is a set of defines to configure the SDL features */\n\n#ifdef __LP64__\n    #define SIZEOF_VOIDP 8\n#else\n    #define SIZEOF_VOIDP 4\n#endif\n\n/* Useful headers */\n#define STDC_HEADERS    1\n#define HAVE_ALLOCA_H       1\n#define HAVE_CTYPE_H    1\n#define HAVE_FLOAT_H    1\n#define HAVE_INTTYPES_H 1\n#define HAVE_LIMITS_H   1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H   1\n#define HAVE_STDINT_H   1\n#define HAVE_STDIO_H    1\n#define HAVE_STRING_H   1\n#define HAVE_SYS_TYPES_H    1\n#define HAVE_LIBUNWIND_H    1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC    1\n#define HAVE_FREE   1\n#define HAVE_ALLOCA 1\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_UNSETENV   1\n#define HAVE_QSORT  1\n#define HAVE_ABS    1\n#define HAVE_BCOPY  1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE    1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE_STRLCPY    1\n#define HAVE_STRLCAT    1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR    1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOK_R 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL    1\n#define HAVE_STRTOLL    1\n#define HAVE_STRTOULL   1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI   1\n#define HAVE_ATOF   1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP    1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_VSSCANF 1\n#define HAVE_VSNPRINTF  1\n#define HAVE_M_PI   1\n#define HAVE_ACOS   1\n#define HAVE_ACOSF  1\n#define HAVE_ASIN   1\n#define HAVE_ASINF  1\n#define HAVE_ATAN   1\n#define HAVE_ATANF  1\n#define HAVE_ATAN2  1\n#define HAVE_ATAN2F 1\n#define HAVE_CEIL   1\n#define HAVE_CEILF  1\n#define HAVE_COPYSIGN   1\n#define HAVE_COPYSIGNF  1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_EXP    1\n#define HAVE_EXPF   1\n#define HAVE_FABS   1\n#define HAVE_FABSF  1\n#define HAVE_FLOOR  1\n#define HAVE_FLOORF 1\n#define HAVE_FMOD   1\n#define HAVE_FMODF  1\n#define HAVE_LOG    1\n#define HAVE_LOGF   1\n#define HAVE_LOG10  1\n#define HAVE_LOG10F 1\n#define HAVE_POW    1\n#define HAVE_POWF   1\n#define HAVE_SCALBN 1\n#define HAVE_SCALBNF    1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#define HAVE_SIGACTION  1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP  1\n#define HAVE_SYSCONF    1\n#define HAVE_SYSCTLBYNAME 1\n\n#define HAVE_GCC_ATOMICS 1\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_COREAUDIO  1\n#define SDL_AUDIO_DRIVER_DISK   1\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable various input drivers */\n#define SDL_JOYSTICK_IOKIT  1\n#define SDL_JOYSTICK_HIDAPI  1\n#define SDL_HAPTIC_IOKIT    1\n\n/* Enable the dummy sensor driver */\n#define SDL_SENSOR_DUMMY  1\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_DLOPEN   1\n\n/* Enable various threading systems */\n#define SDL_THREAD_PTHREAD  1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX  1\n\n/* Enable various timer systems */\n#define SDL_TIMER_UNIX  1\n\n/* Enable various video drivers */\n#define SDL_VIDEO_DRIVER_COCOA  1\n#define SDL_VIDEO_DRIVER_DUMMY  1\n#undef SDL_VIDEO_DRIVER_X11\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC \"/opt/X11/lib/libX11.6.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT \"/opt/X11/lib/libXext.6.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA \"/opt/X11/lib/libXinerama.1.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 \"/opt/X11/lib/libXi.6.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR \"/opt/X11/lib/libXrandr.2.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS \"/opt/X11/lib/libXss.1.dylib\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE \"/opt/X11/lib/libXxf86vm.1.dylib\"\n#define SDL_VIDEO_DRIVER_X11_XDBE 1\n#define SDL_VIDEO_DRIVER_X11_XINERAMA 1\n#define SDL_VIDEO_DRIVER_X11_XRANDR 1\n#define SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1\n#define SDL_VIDEO_DRIVER_X11_XSHAPE 1\n#define SDL_VIDEO_DRIVER_X11_XVIDMODE 1\n#define SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM 1\n\n#ifdef MAC_OS_X_VERSION_10_8\n/*\n * No matter the versions targeted, this is the 10.8 or later SDK, so you have\n *  to use the external Xquartz, which is a more modern Xlib. Previous SDKs\n *  used an older Xlib.\n */\n#define SDL_VIDEO_DRIVER_X11_XINPUT2 1\n#define SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1\n#define SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY 1\n#endif\n\n#ifndef SDL_VIDEO_RENDER_OGL\n#define SDL_VIDEO_RENDER_OGL    1\n#endif\n\n#ifndef SDL_VIDEO_RENDER_OGL_ES2\n#define SDL_VIDEO_RENDER_OGL_ES2 0\n#endif\n\n#ifndef SDL_VIDEO_RENDER_METAL\n/* Metal only supported on 64-bit architectures with 10.11+ */\n#if TARGET_CPU_X86_64 && (MAC_OS_X_VERSION_MAX_ALLOWED >= 101100)\n// #define SDL_VIDEO_RENDER_METAL    1\n#else\n#define SDL_VIDEO_RENDER_METAL    0\n#endif\n#endif\n\n/* Enable OpenGL support */\n#ifndef SDL_VIDEO_OPENGL\n#define SDL_VIDEO_OPENGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_ES2\n#define SDL_VIDEO_OPENGL_ES2    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_EGL\n#define SDL_VIDEO_OPENGL_EGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_CGL\n#define SDL_VIDEO_OPENGL_CGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_GLX\n#define SDL_VIDEO_OPENGL_GLX    1\n#endif\n\n/* Enable Vulkan support */\n/* Metal/MoltenVK/Vulkan only supported on 64-bit architectures with 10.11+ */\n#if TARGET_CPU_X86_64 && (MAC_OS_X_VERSION_MAX_ALLOWED >= 101100)\n// #define SDL_VIDEO_VULKAN 1\n#else\n#define SDL_VIDEO_VULKAN 0\n#endif\n\n/* Enable system power support */\n#define SDL_POWER_MACOSX 1\n\n/* enable filesystem support */\n#define SDL_FILESYSTEM_COCOA   1\n\n/* Enable assembly routines */\n#define SDL_ASSEMBLY_ROUTINES   1\n#ifdef __ppc__\n#define SDL_ALTIVEC_BLITTERS    1\n#endif\n\n#endif /* SDL_config_macosx_h_ */\n"
  },
  {
    "path": "project/lib/custom/sdl/include/SDL_config_rpi.h",
    "content": "/* include/SDL_config.h.  Generated from SDL_config.h.in by configure.  */\n/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDL_config_rpi_h_\n#define SDL_config_rpi_h_\n\n#ifdef RASPBERRYPI\n\n/* General platform specific identifiers */\n#include \"SDL_platform.h\"\n\n/* Make sure that this isn't included by Visual C++ */\n#ifdef _MSC_VER\n#error You should run git checkout -f include/SDL_config.h\n#endif\n\n/* C language features */\n/* #undef const */\n/* #undef inline */\n/* #undef volatile */\n\n/* C datatypes */\n#if defined(__LP64__) || defined(_LP64) || defined(_WIN64)\n#define SIZEOF_VOIDP 8\n#else\n#define SIZEOF_VOIDP 4\n#endif\n\n#define HAVE_GCC_ATOMICS 1\n/* #undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET */\n\n/* Comment this if you want to build without any C library requirements */\n#define HAVE_LIBC 1\n#if HAVE_LIBC\n\n/* Useful headers */\n#define STDC_HEADERS 1\n#define HAVE_ALLOCA_H 1\n#define HAVE_CTYPE_H 1\n#define HAVE_FLOAT_H 1\n#define HAVE_ICONV_H 1\n#define HAVE_INTTYPES_H 1\n#define HAVE_LIMITS_H 1\n#define HAVE_MALLOC_H 1\n#define HAVE_MATH_H 1\n#define HAVE_MEMORY_H 1\n#define HAVE_SIGNAL_H 1\n#define HAVE_STDARG_H 1\n#define HAVE_STDINT_H 1\n#define HAVE_STDIO_H 1\n#define HAVE_STDLIB_H 1\n#define HAVE_STRINGS_H 1\n#define HAVE_STRING_H 1\n#define HAVE_SYS_TYPES_H 1\n#define HAVE_WCHAR_H 1\n/* #undef HAVE_PTHREAD_NP_H */\n/* #undef HAVE_LIBUNWIND_H */\n\n/* C library functions */\n#define HAVE_DLOPEN 1\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC 1\n#define HAVE_FREE 1\n#define HAVE_ALLOCA 1\n#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */\n#define HAVE_GETENV 1\n#define HAVE_SETENV 1\n#define HAVE_PUTENV 1\n#define HAVE_UNSETENV 1\n#endif\n#define HAVE_QSORT 1\n#define HAVE_ABS 1\n#define HAVE_BCOPY 1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE 1\n#define HAVE_MEMCMP 1\n#define HAVE_WCSLEN 1\n/* #undef HAVE_WCSLCPY */\n/* #undef HAVE_WCSLCAT */\n/* #undef HAVE__WCSDUP */\n#define HAVE_WCSDUP 1\n#define HAVE_WCSSTR 1\n#define HAVE_WCSCMP 1\n#define HAVE_WCSNCMP 1\n#define HAVE_WCSCASECMP 1\n/* #undef HAVE__WCSICMP */\n#define HAVE_WCSNCASECMP 1\n/* #undef HAVE__WCSNICMP */\n#define HAVE_STRLEN 1\n/* #undef HAVE_STRLCPY */\n/* #undef HAVE_STRLCAT */\n/* #undef HAVE__STRREV */\n/* #undef HAVE__STRUPR */\n/* #undef HAVE__STRLWR */\n#define HAVE_INDEX 1\n#define HAVE_RINDEX 1\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR 1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOK_R 1\n/* #undef HAVE_ITOA */\n/* #undef HAVE__LTOA */\n/* #undef HAVE__UITOA */\n/* #undef HAVE__ULTOA */\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n/* #undef HAVE__I64TOA */\n/* #undef HAVE__UI64TOA */\n#define HAVE_STRTOLL 1\n#define HAVE_STRTOULL 1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI 1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP 1\n/* #undef HAVE__STRICMP */\n#define HAVE_STRCASECMP 1\n/* #undef HAVE__STRNICMP */\n#define HAVE_STRNCASECMP 1\n/* #undef HAVE_SSCANF */\n#define HAVE_VSSCANF 1\n/* #undef HAVE_SNPRINTF */\n#define HAVE_VSNPRINTF 1\n#define HAVE_M_PI /**/\n#define HAVE_ACOS 1\n#define HAVE_ACOSF 1\n#define HAVE_ASIN 1\n#define HAVE_ASINF 1\n#define HAVE_ATAN 1\n#define HAVE_ATANF 1\n#define HAVE_ATAN2 1\n#define HAVE_ATAN2F 1\n#define HAVE_CEIL 1\n#define HAVE_CEILF 1\n#define HAVE_COPYSIGN 1\n#define HAVE_COPYSIGNF 1\n#define HAVE_COS 1\n#define HAVE_COSF 1\n#define HAVE_EXP 1\n#define HAVE_EXPF 1\n#define HAVE_FABS 1\n#define HAVE_FABSF 1\n#define HAVE_FLOOR 1\n#define HAVE_FLOORF 1\n#define HAVE_FMOD 1\n#define HAVE_FMODF 1\n#define HAVE_LOG 1\n#define HAVE_LOGF 1\n#define HAVE_LOG10 1\n#define HAVE_LOG10F 1\n#define HAVE_LROUND 1\n#define HAVE_LROUNDF 1\n#define HAVE_POW 1\n#define HAVE_POWF 1\n#define HAVE_ROUND 1\n#define HAVE_ROUNDF 1\n#define HAVE_SCALBN 1\n#define HAVE_SCALBNF 1\n#define HAVE_SIN 1\n#define HAVE_SINF 1\n#define HAVE_SQRT 1\n#define HAVE_SQRTF 1\n#define HAVE_TAN 1\n#define HAVE_TANF 1\n#define HAVE_TRUNC 1\n#define HAVE_TRUNCF 1\n#define HAVE_FOPEN64 1\n#define HAVE_FSEEKO 1\n#define HAVE_FSEEKO64 1\n#define HAVE_SIGACTION 1\n#define HAVE_SA_SIGACTION 1\n#define HAVE_SETJMP 1\n#define HAVE_NANOSLEEP 1\n#define HAVE_SYSCONF 1\n/* #undef HAVE_SYSCTLBYNAME */\n#define HAVE_CLOCK_GETTIME 1\n/* #undef HAVE_GETPAGESIZE */\n#define HAVE_MPROTECT 1\n#define HAVE_ICONV 1\n#define HAVE_PTHREAD_SETNAME_NP 1\n/* #undef HAVE_PTHREAD_SET_NAME_NP */\n#define HAVE_SEM_TIMEDWAIT 1\n#define HAVE_GETAUXVAL 1\n/* #undef HAVE_ELF_AUX_INFO */\n#define HAVE_POLL 1\n#define HAVE__EXIT 1\n\n#else\n#define HAVE_STDARG_H 1\n#define HAVE_STDDEF_H 1\n#define HAVE_STDINT_H 1\n#endif /* HAVE_LIBC */\n\n#define HAVE_O_CLOEXEC 1\n/* #undef HAVE_ALTIVEC_H */\n#define HAVE_DBUS_DBUS_H 1\n#define HAVE_FCITX 1\n#define HAVE_SYS_INOTIFY_H 1\n#define HAVE_INOTIFY_INIT 1\n#define HAVE_INOTIFY_INIT1 1\n#define HAVE_INOTIFY 1\n/* #undef HAVE_IBUS_IBUS_H */\n/* #undef HAVE_IMMINTRIN_H */\n#define HAVE_LIBUDEV_H 1\n/* #undef HAVE_LIBSAMPLERATE_H */\n/* #undef HAVE_LIBDECOR_H */\n\n/* #undef HAVE_DDRAW_H */\n/* #undef HAVE_DINPUT_H */\n/* #undef HAVE_DSOUND_H */\n/* #undef HAVE_DXGI_H */\n/* #undef HAVE_WINDOWS_GAMING_INPUT_H */\n/* #undef HAVE_XINPUT_H */\n/* #undef HAVE_XINPUT_GAMEPAD_EX */\n/* #undef HAVE_XINPUT_STATE_EX */\n\n/* #undef HAVE_MMDEVICEAPI_H */\n/* #undef HAVE_AUDIOCLIENT_H */\n/* #undef HAVE_SENSORSAPI_H */\n\n/* SDL internal assertion support */\n/* #undef SDL_DEFAULT_ASSERT_LEVEL */\n\n/* Allow disabling of core subsystems */\n/* #undef SDL_ATOMIC_DISABLED */\n/* #undef SDL_AUDIO_DISABLED */\n/* #undef SDL_CPUINFO_DISABLED */\n/* #undef SDL_EVENTS_DISABLED */\n/* #undef SDL_FILE_DISABLED */\n/* #undef SDL_JOYSTICK_DISABLED */\n/* #undef SDL_HAPTIC_DISABLED */\n/* #undef SDL_HIDAPI_DISABLED */\n/* #undef SDL_SENSOR_DISABLED */\n/* #undef SDL_LOADSO_DISABLED */\n/* #undef SDL_RENDER_DISABLED */\n/* #undef SDL_THREADS_DISABLED */\n/* #undef SDL_TIMERS_DISABLED */\n/* #undef SDL_VIDEO_DISABLED */\n/* #undef SDL_POWER_DISABLED */\n/* #undef SDL_FILESYSTEM_DISABLED */\n\n/* Enable various audio drivers */\n/* #undef SDL_AUDIO_DRIVER_AAUDIO */\n#define SDL_AUDIO_DRIVER_ALSA 1\n#define SDL_AUDIO_DRIVER_ALSA_DYNAMIC \"libasound.so.2\"\n/* #undef SDL_AUDIO_DRIVER_ANDROID */\n/* #undef SDL_AUDIO_DRIVER_ARTS */\n/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_COREAUDIO */\n#define SDL_AUDIO_DRIVER_DISK 1\n/* #undef SDL_AUDIO_DRIVER_DSOUND */\n#define SDL_AUDIO_DRIVER_DUMMY 1\n/* #undef SDL_AUDIO_DRIVER_EMSCRIPTEN */\n/* #undef SDL_AUDIO_DRIVER_ESD */\n/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND */\n/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_HAIKU */\n/* #undef SDL_AUDIO_DRIVER_JACK */\n/* #undef SDL_AUDIO_DRIVER_JACK_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_NACL */\n/* #undef SDL_AUDIO_DRIVER_NAS */\n/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_NETBSD */\n/* #undef SDL_AUDIO_DRIVER_OPENSLES */\n#define SDL_AUDIO_DRIVER_OSS 1\n/* #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H */\n/* #undef SDL_AUDIO_DRIVER_PAUDIO */\n/* #undef SDL_AUDIO_DRIVER_PIPEWIRE */\n/* #undef SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO */\n/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_QSA */\n/* #undef SDL_AUDIO_DRIVER_SNDIO */\n/* #undef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC */\n/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */\n/* #undef SDL_AUDIO_DRIVER_WASAPI */\n/* #undef SDL_AUDIO_DRIVER_WINMM */\n/* #undef SDL_AUDIO_DRIVER_OS2 */\n\n/* Enable various input drivers */\n#define SDL_INPUT_LINUXEV 1\n/* #undef SDL_INPUT_FBSDKBIO */\n#define SDL_INPUT_LINUXKD 1\n/* #undef SDL_INPUT_WSCONS */\n/* #undef SDL_JOYSTICK_HAIKU */\n/* #undef SDL_JOYSTICK_DINPUT */\n/* #undef SDL_JOYSTICK_WGI */\n/* #undef SDL_JOYSTICK_XINPUT */\n/* #undef SDL_JOYSTICK_DUMMY */\n/* #undef SDL_JOYSTICK_IOKIT */\n/* #undef SDL_JOYSTICK_MFI */\n#define SDL_JOYSTICK_LINUX 1\n/* #undef SDL_JOYSTICK_ANDROID */\n/* #undef SDL_JOYSTICK_OS2 */\n/* #undef SDL_JOYSTICK_USBHID */\n/* #undef SDL_HAVE_MACHINE_JOYSTICK_H */\n#define SDL_JOYSTICK_HIDAPI 1\n/* #undef SDL_JOYSTICK_RAWINPUT */\n/* #undef SDL_JOYSTICK_EMSCRIPTEN */\n// #define SDL_JOYSTICK_VIRTUAL 1\n/* #undef SDL_HAPTIC_DUMMY */\n/* #undef SDL_HAPTIC_ANDROID */\n#define SDL_HAPTIC_LINUX 1\n/* #undef SDL_HAPTIC_IOKIT */\n/* #undef SDL_HAPTIC_DINPUT */\n/* #undef SDL_HAPTIC_XINPUT */\n\n/* Enable various sensor drivers */\n/* #undef SDL_SENSOR_ANDROID */\n/* #undef SDL_SENSOR_COREMOTION */\n/* #undef SDL_SENSOR_WINDOWS */\n#define SDL_SENSOR_DUMMY 1\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_DLOPEN 1\n/* #undef SDL_LOADSO_DUMMY */\n/* #undef SDL_LOADSO_LDG */\n/* #undef SDL_LOADSO_WINDOWS */\n/* #undef SDL_LOADSO_OS2 */\n\n/* Enable various threading systems */\n/* #undef SDL_THREAD_GENERIC_COND_SUFFIX */\n#define SDL_THREAD_PTHREAD 1\n#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1\n/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */\n/* #undef SDL_THREAD_WINDOWS */\n/* #undef SDL_THREAD_OS2 */\n\n/* Enable various timer systems */\n/* #undef SDL_TIMER_HAIKU */\n/* #undef SDL_TIMER_DUMMY */\n#define SDL_TIMER_UNIX 1\n/* #undef SDL_TIMER_WINDOWS */\n/* #undef SDL_TIMER_OS2 */\n\n/* Enable various video drivers */\n/* #undef SDL_VIDEO_DRIVER_HAIKU */\n/* #undef SDL_VIDEO_DRIVER_COCOA */\n/* #undef SDL_VIDEO_DRIVER_DIRECTFB */\n/* #undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC */\n#define SDL_VIDEO_DRIVER_DUMMY 1\n/* #undef SDL_VIDEO_DRIVER_WINDOWS */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON */\n/* #undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR */\n#define SDL_VIDEO_DRIVER_X11 1\n/* #undef SDL_VIDEO_DRIVER_RPI */\n#define SDL_VIDEO_DRIVER_KMSDRM 1\n#define SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC \"libdrm.so.2\"\n#define SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM \"libgbm.so.1\"\n/* #undef SDL_VIDEO_DRIVER_ANDROID */\n/* #undef SDL_VIDEO_DRIVER_EMSCRIPTEN */\n/* #undef SDL_VIDEO_DRIVER_OFFSCREEN */\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC \"libX11.so.6\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT \"libXext.so.6\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR \"libXcursor.so.1\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA \"libXinerama.so.1\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 \"libXi.so.6\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES \"libXfixes.so.3\"\n#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR \"libXrandr.so.2\"\n/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS */\n/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE */\n#define SDL_VIDEO_DRIVER_X11_XCURSOR 1\n#define SDL_VIDEO_DRIVER_X11_XDBE 1\n#define SDL_VIDEO_DRIVER_X11_XINERAMA 1\n#define SDL_VIDEO_DRIVER_X11_XINPUT2 1\n#define SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1\n#define SDL_VIDEO_DRIVER_X11_XFIXES 1\n#define SDL_VIDEO_DRIVER_X11_XRANDR 1\n/* #undef SDL_VIDEO_DRIVER_X11_XSCRNSAVER */\n#define SDL_VIDEO_DRIVER_X11_XSHAPE 1\n/* #undef SDL_VIDEO_DRIVER_X11_XVIDMODE */\n#define SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1\n#define SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM 1\n/* #undef SDL_VIDEO_DRIVER_NACL */\n/* #undef SDL_VIDEO_DRIVER_VIVANTE */\n/* #undef SDL_VIDEO_DRIVER_VIVANTE_VDK */\n/* #undef SDL_VIDEO_DRIVER_OS2 */\n/* #undef SDL_VIDEO_DRIVER_QNX */\n/* #undef SDL_VIDEO_DRIVER_RISCOS */\n\n/* #undef SDL_VIDEO_RENDER_D3D */\n/* #undef SDL_VIDEO_RENDER_D3D11 */\n#define SDL_VIDEO_RENDER_OGL 1\n#define SDL_VIDEO_RENDER_OGL_ES 1\n#define SDL_VIDEO_RENDER_OGL_ES2 1\n/* #undef SDL_VIDEO_RENDER_DIRECTFB */\n/* #undef SDL_VIDEO_RENDER_METAL */\n\n/* Enable OpenGL support */\n#define SDL_VIDEO_OPENGL 1\n#define SDL_VIDEO_OPENGL_ES 1\n#define SDL_VIDEO_OPENGL_ES2 1\n/* #undef SDL_VIDEO_OPENGL_BGL */\n/* #undef SDL_VIDEO_OPENGL_CGL */\n#define SDL_VIDEO_OPENGL_EGL 1\n#define SDL_VIDEO_OPENGL_GLX 1\n/* #undef SDL_VIDEO_OPENGL_WGL */\n/* #undef SDL_VIDEO_OPENGL_OSMESA */\n/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */\n\n/* Enable Vulkan support */\n/* #undef SDL_VIDEO_VULKAN */\n\n/* Enable Metal support */\n/* #undef SDL_VIDEO_METAL */\n\n/* Enable system power support */\n#define SDL_POWER_LINUX 1\n/* #undef SDL_POWER_WINDOWS */\n/* #undef SDL_POWER_MACOSX */\n/* #undef SDL_POWER_HAIKU */\n/* #undef SDL_POWER_ANDROID */\n/* #undef SDL_POWER_EMSCRIPTEN */\n/* #undef SDL_POWER_HARDWIRED */\n\n/* Enable system filesystem support */\n/* #undef SDL_FILESYSTEM_HAIKU */\n/* #undef SDL_FILESYSTEM_COCOA */\n/* #undef SDL_FILESYSTEM_DUMMY */\n#define SDL_FILESYSTEM_UNIX 1\n/* #undef SDL_FILESYSTEM_WINDOWS */\n/* #undef SDL_FILESYSTEM_NACL */\n/* #undef SDL_FILESYSTEM_ANDROID */\n/* #undef SDL_FILESYSTEM_EMSCRIPTEN */\n/* #undef SDL_FILESYSTEM_OS2 */\n/* #undef SDL_FILESYSTEM_RISCOS */\n\n/* Enable assembly routines */\n#define SDL_ASSEMBLY_ROUTINES 1\n/* #undef SDL_ALTIVEC_BLITTERS */\n/* #undef SDL_ARM_SIMD_BLITTERS */\n/* #undef SDL_ARM_NEON_BLITTERS */\n\n/* Whether SDL_DYNAMIC_API needs dlopen() */\n#define DYNAPI_NEEDS_DLOPEN 1\n\n/* Enable ime support */\n#define SDL_USE_IME 1\n\n/* Enable dynamic udev support */\n#define SDL_UDEV_DYNAMIC \"libudev.so.1\"\n\n/* Enable dynamic libusb support */\n/* #undef SDL_LIBUSB_DYNAMIC */\n\n/* Enable dynamic libsamplerate support */\n/* #undef SDL_LIBSAMPLERATE_DYNAMIC */\n\n#endif //RASPBERRYPI\n\n#endif /* SDL_config_rpi_h_ */\n"
  },
  {
    "path": "project/lib/custom/sdl/include/SDL_config_windows.h",
    "content": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided 'as-is', without any express or implied\n  warranty.  In no event will the authors be held liable for any damages\n  arising from the use of this software.\n\n  Permission is granted to anyone to use this software for any purpose,\n  including commercial applications, and to alter it and redistribute it\n  freely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n*/\n\n#ifndef SDL_config_windows_h_\n#define SDL_config_windows_h_\n#define SDL_config_h_\n#ifdef HX_WINDOWS\n\n#include \"SDL_platform.h\"\n\n/* This is a set of defines to configure the SDL features */\n\n#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H)\n#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__)\n#define HAVE_STDINT_H   1\n#elif defined(_MSC_VER)\ntypedef signed __int8 int8_t;\ntypedef unsigned __int8 uint8_t;\ntypedef signed __int16 int16_t;\ntypedef unsigned __int16 uint16_t;\ntypedef signed __int32 int32_t;\ntypedef unsigned __int32 uint32_t;\ntypedef signed __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#ifndef _UINTPTR_T_DEFINED\n#ifdef  _WIN64\ntypedef unsigned __int64 uintptr_t;\n#else\ntypedef unsigned int uintptr_t;\n#endif\n#define _UINTPTR_T_DEFINED\n#endif\n/* Older Visual C++ headers don't have the Win64-compatible typedefs... */\n#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR)))\n#define DWORD_PTR DWORD\n#endif\n#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR)))\n#define LONG_PTR LONG\n#endif\n#else /* !__GNUC__ && !_MSC_VER */\ntypedef signed char int8_t;\ntypedef unsigned char uint8_t;\ntypedef signed short int16_t;\ntypedef unsigned short uint16_t;\ntypedef signed int int32_t;\ntypedef unsigned int uint32_t;\ntypedef signed long long int64_t;\ntypedef unsigned long long uint64_t;\n#ifndef _SIZE_T_DEFINED_\n#define _SIZE_T_DEFINED_\ntypedef unsigned int size_t;\n#endif\ntypedef unsigned int uintptr_t;\n#endif /* __GNUC__ || _MSC_VER */\n#endif /* !_STDINT_H_ && !HAVE_STDINT_H */\n\n#ifdef _WIN64\n# define SIZEOF_VOIDP 8\n#else\n# define SIZEOF_VOIDP 4\n#endif\n\n#define HAVE_DDRAW_H 1\n#define HAVE_DINPUT_H 1\n#define HAVE_DSOUND_H 1\n#define HAVE_DXGI_H 1\n#define HAVE_XINPUT_H 1\n#define HAVE_MMDEVICEAPI_H 1\n#define HAVE_AUDIOCLIENT_H 1\n\n/* This is disabled by default to avoid C runtime dependencies and manifest requirements */\n#ifdef HAVE_LIBC\n/* Useful headers */\n#define STDC_HEADERS 1\n#define HAVE_CTYPE_H 1\n#define HAVE_FLOAT_H 1\n#define HAVE_LIMITS_H 1\n#define HAVE_MATH_H 1\n#define HAVE_SIGNAL_H 1\n#define HAVE_STDIO_H 1\n#define HAVE_STRING_H 1\n\n/* C library functions */\n#define HAVE_MALLOC 1\n#define HAVE_CALLOC 1\n#define HAVE_REALLOC 1\n#define HAVE_FREE 1\n#define HAVE_ALLOCA 1\n#define HAVE_QSORT 1\n#define HAVE_ABS 1\n#define HAVE_MEMSET 1\n#define HAVE_MEMCPY 1\n#define HAVE_MEMMOVE 1\n#define HAVE_MEMCMP 1\n#define HAVE_STRLEN 1\n#define HAVE__STRREV 1\n/* These functions have security warnings, so we won't use them */\n/* #undef HAVE__STRUPR */\n/* #undef HAVE__STRLWR */\n#define HAVE_STRCHR 1\n#define HAVE_STRRCHR 1\n#define HAVE_STRSTR 1\n/* #undef HAVE_STRTOK_R */\n#if defined(_MSC_VER)\n#define HAVE_STRTOK_S 1\n#endif\n/* These functions have security warnings, so we won't use them */\n/* #undef HAVE__LTOA */\n/* #undef HAVE__ULTOA */\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n#define HAVE_STRTOD 1\n#define HAVE_ATOI 1\n#define HAVE_ATOF 1\n#define HAVE_STRCMP 1\n#define HAVE_STRNCMP 1\n#define HAVE__STRICMP 1\n#define HAVE__STRNICMP 1\n#define HAVE_ACOS   1\n#define HAVE_ACOSF  1\n#define HAVE_ASIN   1\n#define HAVE_ASINF  1\n#define HAVE_ATAN   1\n#define HAVE_ATANF  1\n#define HAVE_ATAN2  1\n#define HAVE_ATAN2F 1\n#define HAVE_CEILF  1\n#define HAVE__COPYSIGN 1\n#define HAVE_COS    1\n#define HAVE_COSF   1\n#define HAVE_EXP    1\n#define HAVE_EXPF   1\n#define HAVE_FABS   1\n#define HAVE_FABSF  1\n#define HAVE_FLOOR  1\n#define HAVE_FLOORF 1\n#define HAVE_FMOD   1\n#define HAVE_FMODF  1\n#define HAVE_LOG    1\n#define HAVE_LOGF   1\n#define HAVE_LOG10  1\n#define HAVE_LOG10F 1\n#define HAVE_POW    1\n#define HAVE_POWF   1\n#define HAVE_SIN    1\n#define HAVE_SINF   1\n#define HAVE_SQRT   1\n#define HAVE_SQRTF  1\n#define HAVE_TAN    1\n#define HAVE_TANF   1\n#if defined(_MSC_VER)\n/* These functions were added with the VC++ 2013 C runtime library */\n#if _MSC_VER >= 1800\n#define HAVE_STRTOLL 1\n#define HAVE_VSSCANF 1\n#define HAVE_SCALBN 1\n#define HAVE_SCALBNF 1\n#endif\n/* This function is available with at least the VC++ 2008 C runtime library */\n#if _MSC_VER >= 1400\n#define HAVE__FSEEKI64 1\n#endif\n#endif\n#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES)\n#define HAVE_M_PI 1\n#endif\n#else\n#define HAVE_STDARG_H   1\n#define HAVE_STDDEF_H   1\n#endif\n\n/* Enable various audio drivers */\n#define SDL_AUDIO_DRIVER_WASAPI 1\n#define SDL_AUDIO_DRIVER_DSOUND 1\n#define SDL_AUDIO_DRIVER_WINMM  1\n#define SDL_AUDIO_DRIVER_DISK   1\n#define SDL_AUDIO_DRIVER_DUMMY  1\n\n/* Enable various input drivers */\n#define SDL_JOYSTICK_DINPUT 1\n#define SDL_JOYSTICK_XINPUT 1\n#define SDL_JOYSTICK_HIDAPI 1\n#define SDL_HAPTIC_DINPUT   1\n#define SDL_HAPTIC_XINPUT   1\n\n/* Enable the dummy sensor driver */\n#define SDL_SENSOR_DUMMY  1\n\n/* Enable various shared object loading systems */\n#define SDL_LOADSO_WINDOWS  1\n\n/* Enable various threading systems */\n#define SDL_THREAD_WINDOWS  1\n\n/* Enable various timer systems */\n#define SDL_TIMER_WINDOWS   1\n\n/* Enable various video drivers */\n#define SDL_VIDEO_DRIVER_DUMMY  1\n#define SDL_VIDEO_DRIVER_WINDOWS    1\n\n#ifndef SDL_VIDEO_RENDER_D3D\n#define SDL_VIDEO_RENDER_D3D    0\n#endif\n#ifndef SDL_VIDEO_RENDER_D3D11\n#define SDL_VIDEO_RENDER_D3D11  0\n#endif\n\n#ifndef NATIVE_TOOLKIT_SDL_ANGLE\n\n/* Enable OpenGL support */\n#ifndef SDL_VIDEO_OPENGL\n#define SDL_VIDEO_OPENGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_WGL\n#define SDL_VIDEO_OPENGL_WGL    1\n#endif\n#ifndef SDL_VIDEO_RENDER_OGL\n#define SDL_VIDEO_RENDER_OGL    1\n#endif\n#ifndef SDL_VIDEO_RENDER_OGL_ES2\n#define SDL_VIDEO_RENDER_OGL_ES2    0\n#endif\n#ifndef SDL_VIDEO_OPENGL_ES2\n#define SDL_VIDEO_OPENGL_ES2    0\n#endif\n#ifndef SDL_VIDEO_OPENGL_EGL\n#define SDL_VIDEO_OPENGL_EGL    0\n#endif\n\n/* Enable Vulkan support */\n#define SDL_VIDEO_VULKAN 1\n\n#else\n\n/* Enable OpenGL support (ES2/ANGLE) */\n#ifndef SDL_VIDEO_OPENGL\n#define SDL_VIDEO_OPENGL    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_WGL\n#define SDL_VIDEO_OPENGL_WGL    0\n#endif\n#ifndef SDL_VIDEO_RENDER_OGL\n#define SDL_VIDEO_RENDER_OGL    0\n#endif\n#ifndef SDL_VIDEO_RENDER_OGL_ES2\n#define SDL_VIDEO_RENDER_OGL_ES2    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_ES2\n#define SDL_VIDEO_OPENGL_ES2    1\n#endif\n#ifndef SDL_VIDEO_OPENGL_EGL\n#define SDL_VIDEO_OPENGL_EGL    1\n#endif\n\n#endif\n\n/* Enable Vulkan support */\n#define SDL_VIDEO_VULKAN 1\n\n/* Enable system power support */\n#define SDL_POWER_WINDOWS 1\n\n/* Enable filesystem support */\n#define SDL_FILESYSTEM_WINDOWS  1\n\n/* Enable assembly routines (Win64 doesn't have inline asm) */\n#ifndef _WIN64\n#define SDL_ASSEMBLY_ROUTINES   1\n#endif\n\n#endif //HX_WINDOWS\n\n#endif /* SDL_config_windows_h_ */\n"
  },
  {
    "path": "project/lib/efsw-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-efsw\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/efsw/include\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/efsw/src\" />\n\n\t\t<!-- Define for macOS <= 10.6 support -->\n\t\t<!-- <compilerflag value=\"-DEFSW_FSEVENTS_NOT_SUPPORTED\" if=\"mac\" /> -->\n\n\t\t<!-- Define if sys/inotify.h doesn't exist -->\n\t\t<!-- <compilerflag value=\"-DEFSW_INOTIFY_NOSYS\" if=\"linux\" /> -->\n\n\t\t<compilerflag value=\"-D_SCL_SECURE_NO_WARNINGS\" if=\"windows\" />\n\t\t<compilerflag value=\"-DNDEBUG\" unless=\"debug\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/Debug.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/DirectorySnapshot.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/DirectorySnapshotDiff.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/DirWatcherGeneric.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileInfo.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileSystem.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcher.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherCWrapper.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherFSEvents.cpp\" if=\"mac\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherGeneric.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherImpl.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherInotify.cpp\" if=\"linux\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherKqueue.cpp\" if=\"mac\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/FileWatcherWin32.cpp\" if=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/Log.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/Mutex.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/posix/FileSystemImpl.cpp\" unless=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/posix/MutexImpl.cpp\" unless=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/posix/SystemImpl.cpp\" unless=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/posix/ThreadImpl.cpp\" unless=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/win/FileSystemImpl.cpp\" if=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/win/MutexImpl.cpp\" if=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/win/SystemImpl.cpp\" if=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/platform/win/ThreadImpl.cpp\" if=\"windows\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/String.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/System.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/Thread.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/Watcher.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/WatcherFSEvents.cpp\" if=\"mac\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/WatcherGeneric.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/WatcherInotify.cpp\" if=\"linux\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/WatcherKqueue.cpp\" if=\"mac\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/efsw/src/efsw/WatcherWin32.cpp\" if=\"windows\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/freetype-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-freetype-depends\">\n\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/config/ftconfig.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/config/ftheader.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/config/ftmodule.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/freetype/include/freetype/config/ftoption.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/config/ftstdlib.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/freetype.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftadvanc.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftbbox.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftbdf.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftbitmap.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftbzip2.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftcache.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftchapters.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftcid.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftcolor.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftdriver.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/fterrdef.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/fterrors.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftfntfmt.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftgasp.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftglyph.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftgxval.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftgzip.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftimage.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftincrem.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftlcdfil.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftlist.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftlzw.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftmac.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftmm.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftmodapi.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftmoderr.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftotval.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftoutln.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftparams.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftpfr.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftrender.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftsizes.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftsnames.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftstroke.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftsynth.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftsystem.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/fttrigon.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/fttypes.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ftwinfnt.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/t1tables.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/ttnameid.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/tttables.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/freetype/include/freetype/tttags.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/freetype/include/ft2build.h\" />\n\n\t</files>\n\n\t<files id=\"native-toolkit-freetype\" tags=\"\">\n\n\t\t<cache value=\"1\" />\n\t\t<tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\t\t<depend files=\"native-toolkit-freetype-depends\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/freetype/include\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/freetype/include\" />\n\t\t<compilerflag value=\"-DFT2_BUILD_LIBRARY\" />\n\n\t\t<compilerflag value=\"-DNATIVE_TOOLKIT_HAVE_HARFBUZZ\" if=\"NATIVE_TOOLKIT_HAVE_HARFBUZZ\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/harfbuzz/src\" if=\"NATIVE_TOOLKIT_HAVE_HARFBUZZ\" />\n\n\t\t<compilerflag value=\"-DNATIVE_TOOLKIT_HAVE_PNG\" if=\"NATIVE_TOOLKIT_HAVE_PNG\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/png\" if=\"NATIVE_TOOLKIT_HAVE_PNG\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/png\" if=\"NATIVE_TOOLKIT_HAVE_PNG\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/zlib\" /> <!-- To go with FT_CONFIG_OPTION_SYSTEM_ZLIB -->\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/autofit/autofit.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftadvanc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftbbox.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftbitmap.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftcalc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftcid.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftcolor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftdbgmem.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftdebug.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftfntfmt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftfstype.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftgasp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftgloadr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftglyph.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftgxval.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/fthash.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftinit.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftlcdfil.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftmm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftobjs.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftotval.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftoutln.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftpatent.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftpfr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftpsprop.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftrfork.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftsnames.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftstream.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftstroke.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftsynth.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftsystem.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/fttrigon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/fttype1.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftutil.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/base/ftwinfnt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/bdf/bdf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/bzip2/ftbzip2.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/cache/ftcache.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/cff/cff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/cid/type1cid.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/gzip/ftgzip.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/lzw/ftlzw.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/pcf/pcf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/pfr/pfr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/psaux/psaux.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/pshinter/pshinter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/psnames/psmodule.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/raster/raster.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/sdf/ftbsdf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/sdf/ftsdf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/sdf/ftsdfcommon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/sdf/ftsdfrend.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/sfnt/sfnt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/smooth/smooth.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/svg/ftsvg.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/truetype/truetype.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/type1/type1.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/type42/type42.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/freetype/src/winfonts/winfnt.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/harfbuzz-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-harfbuzz\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/freetype/include\" if=\"NATIVE_TOOLKIT_HAVE_FREETYPE\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/harfbuzz/src/\" />\n\n\t\t<compilerflag value=\"-DHAVE_FREETYPE\" if=\"NATIVE_TOOLKIT_HAVE_FREETYPE\" />\n\t\t<compilerflag value=\"-DHAVE_OT\" />\n\t\t<compilerflag value=\"-DHAVE_FALLBACK\" />\n\t\t<compilerflag value=\"-DHAVE_CAIRO\" if=\"NATIVE_TOOLKIT_HAVE_CAIRO\" />\n\t\t<compilerflag value=\"-DHAVE_CAIRO_FT\" if=\"NATIVE_TOOLKIT_HAVE_CAIRO\" />\n\t\t<compilerflag value=\"-DHAVE_UCDN\" />\n\t\t<compilerflag value=\"-DHB_NO_MT\" /> <!-- TODO: Enable MT -->\n\n\t\t<compilerflag value=\"-DHAVE_UNISCRIBE\" if=\"windows\" />\n\t\t<compilerflag value=\"-DHAVE_DIRECTWRITE\" if=\"windows HXCPP_M64\" /> <!-- Windows 7+ -->\n\t\t<compilerflag value=\"-wd4244\" if=\"isMsvc\" />\n\t\t<compilerflag value=\"-wd4267\" if=\"isMsvc\" />\n\t\t<compilerflag value=\"-D_CRT_SECURE_NO_WARNINGS\" if=\"isMsvc\" />\n\t\t<compilerflag value=\"-D_CRT_NONSTDC_NO_WARNINGS\" if=\"isMsvc\" />\n\n\t\t<compilerflag value=\"-DHAVE_CORETEXT\" if=\"mac || ios\" />\n\t\t<compilerflag value=\"-Wno-undefined-bool-conversion\" if=\"mac\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-aat-layout.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-aat-map.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-blob.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-buffer-serialize.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-buffer-verify.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-buffer.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-common.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-coretext-shape.cc\" if=\"mac || ios\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-directwrite.cc\" if=\"windows HXCPP_M64\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-draw.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-face.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-face-builder.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-fallback-shape.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-font.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ft.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-number.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-cff1-table.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-cff2-table.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-color.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-face.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-font.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-layout.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-map.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-math.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-metrics.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-arabic.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-default.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-hangul.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-hebrew.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-indic-table.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-indic.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-khmer.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-myanmar.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-syllabic.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-thai.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-use.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shape-fallback.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shape-normalize.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-shape.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-tag.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ot-var.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-outline.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-paint.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-paint-extents.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-set.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-shape-plan.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-shape.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-shaper.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-static.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-ucd.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-unicode.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/harfbuzz/src/hb-uniscribe.cc\" if=\"windows\" />\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/jpeg-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-jpeg\" tags=\"\">\n\n\t\t<cache value=\"1\" />\n\n\t\t<tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/jpeg/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/jpeg/\" />\n\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/cderror.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/cdjpeg.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/jpeg/jconfig.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/jpeg/jconfigint.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdct.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jerror.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jinclude.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jmemsys.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jmorecfg.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jpegint.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jpeglib.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/jpeg/jversion.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/simd/jsimd.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/jpeg/transupp.h\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jaricom.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcapimin.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcapistd.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcarith.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jccoefct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jccolor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcdctmgr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jchuff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcinit.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcmainct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcmarker.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcmaster.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcomapi.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcparam.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcphuff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcprepct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jcsample.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jctrans.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdapimin.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdapistd.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdarith.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdatadst.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdatasrc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdcoefct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdcolor.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jddctmgr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdhuff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdinput.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdmainct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdmarker.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdmaster.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdmerge.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdphuff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdpostct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdsample.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jdtrans.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jerror.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jfdctflt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jfdctfst.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jfdctint.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jidctflt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jidctfst.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jidctint.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jidctred.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jmemmgr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jmemnobs.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jquant1.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jquant2.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jsimd_none.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/jpeg/jutils.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/lzma-files.xml",
    "content": "<xml>\n\n    <files id=\"native-toolkit-lzma\">\n\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/lzma/include/\" if=\"NATIVE_TOOLKIT_LZMA_BINDING\" />\n        <compilerflag value=\"-D_7ZIP_ST\" unless=\"windows\" />\n\n        <file name=\"${NATIVE_TOOLKIT_PATH}/lzma/src/LzFind.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/lzma/src/LzFindMt.c\" if=\"windows\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/lzma/src/LzmaBinding.cpp\" if=\"NATIVE_TOOLKIT_LZMA_BINDING\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/lzma/src/LzmaDec.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/lzma/src/LzmaEnc.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/lzma/src/Threads.c\" if=\"windows\" />\n\n    </files>\n\n</xml>"
  },
  {
    "path": "project/lib/mbedtls-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-mbedtls\">\n\n\t\t<compilerflag value=\"-std=c11\" unless=\"isMsvc\"/>\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/hl-ssl\" if=\"HASHLINK_PATH\"/>\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/mbedtls/include/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/zlib/\" />\n\t\t<compilerflag value=\"-DMBEDTLS_THREADING_C\" if=\"HASHLINK_PATH\"/>\n\t\t<compilerflag value=\"-DMBEDTLS_THREADING_PTHREAD\" unless=\"windows\" if=\"HASHLINK_PATH\"/>\n\t\t<compilerflag value=\"-DMBEDTLS_THREADING_ALT\" if=\"windows HASHLINK_PATH\"/>\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/aes.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/aesni.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/arc4.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/asn1parse.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/asn1write.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/base64.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/bignum.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/blowfish.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/camellia.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ccm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/chacha20.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/chachapoly.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/cipher.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/cipher_wrap.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/cmac.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/constant_time.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ctr_drbg.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/debug.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/des.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/dhm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ecdh.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ecdsa.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ecjpake.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ecp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ecp_curves.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/entropy.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/entropy_poll.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/error.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/gcm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/havege.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/hkdf.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/hmac_drbg.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/md.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/md2.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/md4.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/md5.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/memory_buffer_alloc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/mps_reader.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/mps_trace.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/net_sockets.c\" unless=\"HASHLINK_PATH\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/nist_kw.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/oid.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/padlock.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pem.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pk.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pk_wrap.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pkcs12.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pkcs5.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pkparse.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pkwrite.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/platform.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/platform_util.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/poly1305.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_aead.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_cipher.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_client.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_driver_wrappers.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_ecp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_hash.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_mac.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_rsa.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_se.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_slot_management.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_crypto_storage.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/psa_its_file.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ripemd160.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/rsa.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/rsa_internal.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/sha1.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/sha256.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/sha512.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_cache.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_ciphersuites.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_cli.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_cookie.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_msg.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_srv.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_ticket.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_tls.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/ssl_tls13_keys.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/threading.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/timing.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/version.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/version_features.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/xtea.c\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/certs.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/pkcs11.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509_create.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509_crl.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509_crt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509_csr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509write_crt.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mbedtls/library/x509write_csr.c\" />\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/mojoal-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-mojoal\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/default/\" unless=\"windows || mac || linux || rpi\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/linux/\" if=\"linux\" unless=\"rpi\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/windows/\" if=\"windows\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/mac/\" if=\"mac\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/rpi/\" if=\"rpi\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/mojoal/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/mojoal/AL/\" />\n\t\t<compilerflag value=\"-DAL_LIBTYPE_STATIC\" if=\"native_toolkit_mojoal_static\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/mojoal/mojoal.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/neko-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-neko\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/neko/vm/\" />\n\t\t<compilerflag value=\"-DNEKO_STANDALONE=1\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/buffer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/date.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/file.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/init.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/int32.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/math.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/misc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/process.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/random.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/serialize.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/socket.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/string.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/sys.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/libs/std/thread.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/alloc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/builtins.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/callback.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/hash.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/interp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/jit_x86.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/load.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/module.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/objtable.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/others.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/neko/vm/threads.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/ogg-files.xml",
    "content": "<xml>\n\n   <files id=\"native-toolkit-ogg-depends\">\n      <depend name=\"${NATIVE_TOOLKIT_PATH}/custom/ogg/include/ogg/config_types.h\" />\n      <depend name=\"${NATIVE_TOOLKIT_PATH}/ogg/include/ogg/ogg.h\" />\n      <depend name=\"${NATIVE_TOOLKIT_PATH}/ogg/include/ogg/os_types.h\" />\n   </files>\n\n    <files id=\"native-toolkit-ogg\" tags=\"\">\n\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/ogg/include/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/ogg/include/\" />\n        <cache value=\"1\" />\n\n        <tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\n        <depend files=\"native-toolkit-ogg-depends\" />\n\n        <file name=\"${NATIVE_TOOLKIT_PATH}/ogg/src/bitwise.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/ogg/src/framing.c\" />\n\n    </files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/openal-files.xml",
    "content": "<xml>\n\n    <section if=\"android LIME_OPENALSOFT\">\n        <error value=\"NDK version 20 or higher is required.\" unless=\"NDKV20+\" />\n    </section>\n\n    <files id=\"native-toolkit-openal\">\n\n        <compilerflag value=\"-std=c++11\" if=\"android\" />\n\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/openal/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/openal/alc/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/openal/alc/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/openal/build/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/openal/common/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/openal/include/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/openal/include/\" />\n        <compilerflag value=\"-DAL_LIBTYPE_STATIC\" if=\"native_toolkit_openal_static\" />\n\n        <compilerflag value=\"-DAL_ALEXT_PROTOTYPES\" />\n        <compilerflag value=\"-D_LARGEFILE_SOURCE\" />\n        <compilerflag value=\"-D_LARGE_FILES\" />\n        <compilerflag value=\"-DNOMINMAX\" />\n\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/auxeffectslot.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/buffer.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/effect.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/error.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/event.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/extension.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/filter.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/listener.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/source.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/al/state.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/alc.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/alconfig.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/alu.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/ambdec.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/base.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/loopback.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/null.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/wave.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/bformatdec.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/bs2b.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/converter.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/autowah.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/chorus.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/compressor.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/dedicated.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/distortion.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/echo.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/equalizer.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/fshifter.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/modulator.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/null.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/pshifter.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/reverb.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/effects/vmorpher.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/filters/biquad.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/filters/nfc.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/filters/splitter.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/helpers.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/hrtf.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/mastering.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/mixer/mixer_c.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/mixer/mixer_neon.cpp\" if=\"rpi || HXCPP_ARM64\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/mixer/mixer_sse.cpp\" unless=\"rpi || android || HXCPP_ARM64\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/mixer/mixer_sse2.cpp\" unless=\"rpi || android || HXCPP_ARM64\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/mixer/mixer_sse3.cpp\" unless=\"rpi || android || HXCPP_ARM64\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/panning.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/ringbuffer.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/uhjfilter.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/voice.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/alcomplex.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/alexcpt.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/alfstream.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/almalloc.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/alstring.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/dynload.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/polyphase_resampler.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/strutils.cpp\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/openal/common/threads.cpp\" />\n\n        <compilerflag value=\"-mmmx\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n        <compilerflag value=\"-msse\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n        <compilerflag value=\"-msse2\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n        <compilerflag value=\"-msse3\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n        <compilerflag value=\"-mssse3\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n\n        <section if=\"NATIVE_TOOLKIT_HAVE_SDL\">\n\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/sdl/include/\" />\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/\" />\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/default/\" unless=\"windows || mac || linux || rpi\" />\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/linux/\" if=\"linux\" unless=\"rpi\" />\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/mac/\" if=\"mac\" />\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/rpi/\" if=\"rpi\" />\n            <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/configs/windows/\" if=\"windows\" />\n\n            <compilerflag value=\"-DHAVE_SDL2\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/sdl2.cpp\" />\n\n        </section>\n\n        <section if=\"linux\">\n\n            <compilerflag value=\"-D_POSIX_C_SOURCE=200112L\" />\n            <compilerflag value=\"-D_XOPEN_SOURCE=500\" />\n            <compilerflag value=\"-mfpu=neon\" if=\"rpi\" unless=\"HXCPP_ARM64\" />\n            <compilerflag value=\"-fcommon\" />\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/alsa.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/oss.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/pulseaudio.cpp\" />\n\n        </section>\n\n        <section if=\"mac\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/coreaudio.cpp\" />\n\n        </section>\n\n        <section if=\"windows\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/dsound.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/wasapi.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/winmm.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/uiddefs.cpp\" />\n\n            <compilerflag value=\"-DWIN32\" />\n            <compilerflag value=\"-D_WINDOWS\" />\n            <compilerflag value=\"-D_WIN32\" />\n            <compilerflag value=\"-D_WIN32_WINNT=0x0502\" />\n            <compilerflag value=\"-Drestrict=\" />\n            <compilerflag value=\"-D_CRT_SECURE_NO_WARNINGS\" if=\"isMsvc\" />\n            <compilerflag value=\"-D_CRT_NONSTDC_NO_DEPRECATE\" if=\"isMsvc\" />\n            <compilerflag value=\"-wd4098\" if=\"isMsvc\" />\n            <compilerflag value=\"-Dstrcasecmp=_stricmp\" />\n            <compilerflag value=\"-Dstrncasecmp=_strnicmp\" />\n\n        </section>\n\n        <section unless=\"windows\">\n\n            <!--\n            <compilerflag value=\"-Winline -Wall\" />\n            <compilerflag value=\"-Wextra\" />\n            <compilerflag value=\"-Werror\" />\n            -->\n            <compilerflag value=\"-fPIC\" />\n            <compilerflag value=\"-fvisibility=hidden\" />\n            <compilerflag value=\"-pthread\" />\n\n        </section>\n\n        <section if=\"android\">\n\n            <compilerflag value=\"-fsigned-char\" />\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/openal/alc/backends/opensl.cpp\" />\n\n        </section>\n\n    </files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/pixman-files.xml",
    "content": "<xml>\n\n\t<!-- TODO: ARM64 NEON -->\n\n\t<!-- <set name=\"PIXMAN_ARM_SIMD\" value=\"1\" if=\"android || rpi\" unless=\"HXCPP_ARMV7 || HXCPP_ARMV7S || HXCPP_ARM64 || HXCPP_X86\" /> -->\n\t<set name=\"PIXMAN_ARM_NEON\" value=\"1\" if=\"HXCPP_ARMV7 || HXCPP_ARMV7S || rpi\" unless=\"ios || NDKV22+ || HXCPP_ARM64\" />\n\n\t<files id=\"native-toolkit-pixman\">\n\n\t\t<section if=\"PIXMAN_ARM_NEON HXCPP_CLANG || PIXMAN_ARM_NEON NDKV20+\">\n\t\t\t<compilerflag value=\"-fno-integrated-as\" />\n\t\t\t<compilerflag value=\"-march=armv7-a\" if=\"HXCPP_ARMV7\" />\n\t\t</section>\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/pixman\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/pixman/pixman\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/pixman/pixman\" />\n\t\t<compilerflag value=\"-DHAVE_CONFIG_H\" />\n\t\t<compilerflag value=\"-DPIXMAN_NO_TLS\" if=\"windows\" />\n\n\t\t<compilerflag value=\"-DNATIVE_TOOLKIT_HAVE_PNG\" if=\"NATIVE_TOOLKIT_HAVE_PNG\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/png\" if=\"NATIVE_TOOLKIT_HAVE_PNG\" />\n\n\t\t<compilerflag value=\"-DUSE_ARM_NEON=1\" if=\"PIXMAN_ARM_NEON\" />\n\t\t<compilerflag value=\"-DUSE_ARM_SIMD=1\" if=\"PIXMAN_ARM_SIMD\" />\n\n\t\t<compilerflag value=\"-I${ANDROID_NDK_ROOT}/sources/android/cpufeatures\" if=\"android\" />\n\n\t\t<compilerflag value=\"-mmmx\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<compilerflag value=\"-msse\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<compilerflag value=\"-msse2\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<compilerflag value=\"-msse3\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<compilerflag value=\"-mssse3\" if=\"linux || mac || mingw\" unless=\"rpi || HXCPP_ARM64\" />\n\n\t\t<compilerflag value=\"-Wno-attributes\" if=\"android\" />\n\t\t<compilerflag value=\"-Wno-tautological-constant-out-of-range-compare\" if=\"mac || ios || tvos\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-access-accessors.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-access.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm-neon-asm-bilinear.S\" if=\"PIXMAN_ARM_NEON\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm-neon-asm.S\" if=\"PIXMAN_ARM_NEON\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm-neon.c\" if=\"PIXMAN_ARM_NEON\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm-simd-asm-scaled.S\" if=\"PIXMAN_ARM_SIMD\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm-simd-asm.S\" if=\"PIXMAN_ARM_SIMD\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm-simd.c\" if=\"PIXMAN_ARM_SIMD\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-arm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-bits-image.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-combine-float.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-combine32.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-conical-gradient.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-edge-accessors.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-edge.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-fast-path.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-filter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-general.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-glyph.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-gradient-walker.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-image.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-implementation.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-linear-gradient.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-matrix.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-mips.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-mmx.c\" if=\"windows || mac || linux\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-noop.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-ppc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-radial-gradient.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-region16.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-region32.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-solid-fill.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-sse2.c\" if=\"windows || mac || linux\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-ssse3.c\" if=\"windows || mac || linux\" unless=\"rpi || HXCPP_ARM64\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-timer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-trap.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-utils.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman-x86.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/pixman/pixman/pixman.c\" />\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/png-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-png-depends\">\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/png/png.h\" />\n\t</files>\n\n\t<files id=\"native-toolkit-png\" tags=\"\">\n\n\t\t<cache value=\"1\" />\n\t\t<tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/png/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/png/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/zlib/\" />\n\n\t\t<depend files=\"native-toolkit-png-depends\" />\n\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/png/pngconf.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/png/pngdebug.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/png/pnginfo.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/png/pnglibconf.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/png/pngpriv.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/png/pngstruct.h\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/png.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngerror.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngget.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngmem.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngpread.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngread.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngrio.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngrtran.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngrutil.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngset.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngtrans.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngwio.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngwrite.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngwtran.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/pngwutil.c\" />\n\n\t\t<section if=\"HXCPP_ARMV7 || HXCPP_ARMV7S || HXCPP_ARM64\">\n\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/arm/arm_init.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/arm/filter_neon_intrinsics.c\" />\n\t\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/png/arm/palette_neon_intrinsics.c\" />\n\n\t\t</section>\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/sdl-files.xml",
    "content": "<xml>\n\n    <files id=\"native-toolkit-sdl-depends\">\n\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/begin_code.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/close_code.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_assert.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_atomic.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_audio.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_bits.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_blendmode.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_clipboard.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_config_android.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_config_iphoneos.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/custom/sdl/include/SDL_config_macosx.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_config_minimal.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_config_pandora.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/custom/sdl/include/SDL_config_windows.h\" unless=\"winrt\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_config_winrt.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_copying.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_cpuinfo.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_egl.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_endian.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_error.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_events.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_filesystem.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_gamecontroller.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_gesture.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_haptic.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_hints.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_joystick.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_keyboard.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_keycode.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_loadso.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_log.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_main.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_messagebox.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_mouse.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_mutex.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_name.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengl_glext.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengl.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengles.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengles2_gl2.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengles2_gl2ext.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengles2_gl2platform.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengles2_khrplatform.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_opengles2.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_pixels.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_platform.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_power.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_quit.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_rect.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_render.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_revision.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_rwops.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_scancode.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_shape.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_stdinc.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_surface.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_system.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_syswm.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_test_assert.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_test_common.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_test_random.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_test.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_thread.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_timer.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_touch.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_types.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_version.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL_video.h\" />\n        <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/include/SDL.h\" />\n\n        <section if=\"winrt\">\n            <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/winrt/SDL_winrtapp_common.h\" />\n            <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/winrt/SDL_winrtapp_direct3d.h\" />\n            <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/winrt/SDL_winrtapp_xaml.h\" />\n            <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/dynapi/SDL_dynapi_overrides.h\" />\n            <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/dynapi/SDL_dynapi_procs.h\" />\n            <depend name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/dynapi/SDL_dynapi.h\" />\n        </section>\n\n    </files>\n\n\n\n\n    <files id=\"native-toolkit-sdl\" tags=\"\">\n\n        <cache value=\"1\" />\n        <tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\n        <compilerflag value=\"-DUSING_GENERATED_CONFIG_H\" if=\"linux || rpi\" /> <!-- For other targets, it doesn't matter which header is included. -->\n        <depend files=\"native-toolkit-sdl-depends\" />\n\n        <compilerflag value=\"-I${ANDROID_NDK_ROOT}/sources/android/cpufeatures\" if=\"android\" />\n\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/sdl/include/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/include/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/src/hidapi/hidapi/\" />\n        <compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/sdl/src/video/khronos/\" />\n        <compilerflag value=\"-I${SDL_CONFIG_PATH}\" if=\"SDL_CONFIG_PATH\" />\n\n        <compilerflag value=\"-DGL_GLEXT_PROTOTYPES\" if=\"android || rpi\" />\n        <compilerflag value=\"-DHAVE_LIBC\" />\n\n        <compilerflag value=\"-D__IPHONEOS__\" if=\"ios || tvos\" />\n        <compilerflag value=\"-D__TVOS__\" if=\"tvos\" />\n\n        <compilerflag value=\"-DSDL_HIDAPI_DISABLED\" />\n\n        <section if=\"windows\">\n\n            <compilerflag value=\"-DNATIVE_TOOLKIT_SDL_ANGLE\" if=\"NATIVE_TOOLKIT_SDL_ANGLE\" />\n            <compilerflag value=\"-DNATIVE_TOOLKIT_STATIC_ANGLE\" if=\"NATIVE_TOOLKIT_STATIC_ANGLE\" />\n            <compilerflag value=\"-DSDL_VIDEO_STATIC_ANGLE\" if=\"NATIVE_TOOLKIT_STATIC_ANGLE\" />\n\n        </section>\n\n        <section if=\"winrt\">\n\n            <compilerflag value=\"-D__WINRT__\" />\n            <compilerflag value=\"-DUNICODE\" />\n            <compilerflag value=\"-DSDL_BUILDING_WINRT=1\" />\n\n        </section>\n\n        <section if=\"linux\">\n\n            <compilerflag value=\"-DHAVE_LINUX_INPUT_H\" />\n            <compilerflag value=\"-DHAVE_LINUX_VERSION_H\" />\n            <compilerflag value=\"-D_REENTRANT\" />\n            <compilerflag value=\"-mmmx\" unless=\"rpi || HXCPP_ARM64\" />\n            <compilerflag value=\"-msse\" unless=\"rpi || HXCPP_ARM64\" />\n            <compilerflag value=\"-msse2\" unless=\"rpi || HXCPP_ARM64\" />\n            <compilerflag value=\"-msse3\" unless=\"rpi || HXCPP_ARM64\" />\n            <compilerflag value=\"-mssse3\" unless=\"rpi || HXCPP_ARM64\" />\n\n            <set name=\"XINPUT2\" value=\"${NATIVE_TOOLKIT_SDL_X11_XINPUT2}\" />\n            <compilerflag value=\"-DNATIVE_TOOLKIT_SDL_X11_XINPUT2=${XINPUT2}\" if=\"XINPUT2\" />\n            <compilerflag value=\"-DNATIVE_TOOLKIT_SDL_X11_XINPUT2_SUPPORTS_MULTITOUCH=${XINPUT2}\" if=\"XINPUT2\" />\n            <compilerflag value=\"-DNATIVE_TOOLKIT_SDL_X11_XINPUT2=0\" unless=\"XINPUT2\" />\n            <compilerflag value=\"-DNATIVE_TOOLKIT_SDL_X11_XINPUT2_SUPPORTS_MULTITOUCH=0\" unless=\"XINPUT2\" />\n\n        </section>\n\n            <section if=\"rpi\">\n\n                <compilerflag value=\"-mfpu=neon\" unless=\"HXCPP_ARM64\" />\n                <compilerflag value=\"-mfloat-abi=hard\" unless=\"HXCPP_ARM64\" />\n                <compilerflag value=\"-I-abi=hard\" />\n\n                <compilerflag value=\"-I/opt/vc/include\" />\n                <compilerflag value=\"-I/opt/vc/include/interface/vcos/pthreads\" />\n                <compilerflag value=\"-I/opt/vc/include/interface/vmcs_host/linux\" />\n                <compilerflag value=\"-I/usr/include/dbus-1.0\" />\n                <compilerflag value=\"-I/usr/include/interface/vcos/pthreads\" />\n                <compilerflag value=\"-I/usr/include/interface/vmcs_host/linux\" />\n                <compilerflag value=\"-I/usr/include/libdrm\" />\n                <compilerflag value=\"-I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include\" unless=\"HXCPP_ARM64\" />\n                <compilerflag value=\"-I/usr/lib/aarch64-linux-gnu/dbus-1.0/include\" if=\"HXCPP_ARM64\" />\n                <compilerflag value=\"-I/usr/local/include\" />\n\n            </section>\n\n        <section if=\"mac\">\n\n            <compilerflag value=\"-DTARGET_API_MAC_CARBON\" />\n            <compilerflag value=\"-DTARGET_API_MAC_OSX\" />\n            <compilerflag value=\"-D_THREAD_SAFE\" />\n            <compilerflag value=\"-mmmx\" unless=\"HXCPP_ARM64\" />\n            <compilerflag value=\"-msse\" unless=\"HXCPP_ARM64\" />\n            <compilerflag value=\"-msse2\" unless=\"HXCPP_ARM64\" />\n            <compilerflag value=\"-msse3\" unless=\"HXCPP_ARM64\" />\n            <compilerflag value=\"-mssse3\" unless=\"HXCPP_ARM64\" />\n\n        </section>\n\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/atomic/SDL_atomic.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/atomic/SDL_spinlock.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/disk/SDL_diskaudio.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/dummy/SDL_dummyaudio.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/SDL_audio.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/SDL_audiocvt.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/SDL_audiotypecvt.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/SDL_mixer.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/SDL_wave.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/cpuinfo/SDL_cpuinfo.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/dynapi/SDL_dynapi.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_clipboardevents.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_displayevents.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_dropevents.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_events.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_gesture.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_keyboard.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_mouse.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_quit.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_touch.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_windowevents.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_scancode_tables.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/SDL_keysym_to_scancode.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/file/SDL_rwops.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/SDL_haptic.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/hidapi/SDL_hidapi.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/controller_type.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/steam/SDL_steamcontroller.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/SDL_gamecontroller.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/SDL_joystick.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/SDL_steam_virtual_gamepad.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/virtual/SDL_virtualjoystick.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_atan2.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_exp.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_fmod.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_log.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_log10.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_pow.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_rem_pio2.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/e_sqrt.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/k_cos.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/k_rem_pio2.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/k_sin.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/k_tan.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_atan.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_copysign.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_cos.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_fabs.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_floor.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_scalbn.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_sin.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/libm/s_tan.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/loadso/dlopen/SDL_sysloadso.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/SDL_locale.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/SDL_url.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/SDL_power.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/opengl/SDL_render_gl.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/opengl/SDL_shaders_gl.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/SDL_render.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/SDL_yuv_sw.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_blendfillrect.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_blendline.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_blendpoint.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_drawline.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_drawpoint.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_render_sw.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_rotate.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/software/SDL_triangle.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_assert.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_dataqueue.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_error.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_hints.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_list.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_log.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_utils.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL_guid.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/SDL.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/sensor/dummy/SDL_dummysensor.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/sensor/SDL_sensor.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_crc16.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_crc32.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_getenv.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_iconv.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_malloc.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_qsort.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_stdlib.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_string.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/stdlib/SDL_strtokr.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/SDL_thread.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/timer/SDL_timer.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/dummy/SDL_nullevents.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/dummy/SDL_nullframebuffer.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/dummy/SDL_nullvideo.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_0.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_1.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_A.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_auto.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_copy.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_N.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit_slow.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_blit.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_bmp.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_clipboard.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_fillrect.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_pixels.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_rect.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_RLEaccel.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_shape.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_stretch.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_surface.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_video.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_vulkan_utils.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_yuv.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/yuv2rgb/yuv_rgb_std.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/yuv2rgb/yuv_rgb_sse.c\" />\n        <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/yuv2rgb/yuv_rgb_lsx.c\" />\n\n        <section unless=\"windows\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/pthread/SDL_syscond.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/pthread/SDL_sysmutex.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/pthread/SDL_syssem.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/pthread/SDL_systhread.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/pthread/SDL_systls.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/timer/unix/SDL_systimer.c\" />\n\n        </section>\n\n        <section if=\"android || ios || windows || rpi || tvos || mac\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/opengles/SDL_render_gles.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/opengles2/SDL_render_gles2.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/opengles2/SDL_shaders_gles2.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/SDL_egl.c\" />\n\n        </section>\n\n        <section if=\"windows || mac || android || rpi\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_gamecube.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_luna.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_ps3.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_ps4.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_ps5.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_rumble.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_stadia.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_steam.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_switch.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_xbox360.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_xbox360w.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_xboxone.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_shield.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_combined.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_wii.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapi_steamdeck.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/hidapi/SDL_hidapijoystick.c\" />\n\n        </section>\n\n        <section if=\"LIBSDL_DIRECTFB\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_dyn.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_events.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_modes.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_mouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_opengl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_render.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_shape.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_video.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_window.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/directfb/SDL_DirectFB_WM.c\" />\n\n        </section>\n\n        <section if=\"LIBSDL_WAYLAND\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandclipboard.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylanddatamanager.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylanddyn.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandevents.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandmouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandopengles.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandtouch.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandvideo.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandvulkan.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/wayland/SDL_waylandwindow.c\" />\n\n        </section>\n\n        <section if=\"LIBSDL_PANDORA\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/pandora/SDL_pandora_events.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/pandora/SDL_pandora.c\" />\n\n        </section>\n\n        <section if=\"LIBSDL_RPI || rpi\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/raspberry/SDL_rpievents.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/raspberry/SDL_rpimouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/raspberry/SDL_rpiopengles.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/raspberry/SDL_rpivideo.c\" />\n\n        </section>\n\n        <section if=\"LIBSDL_PSP\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/psp/SDL_pspaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/psp/SDL_sysjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/main/psp/SDL_psp_main.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/psp/SDL_syspower.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/psp/SDL_render_psp.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/psp/SDL_syscond.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/psp/SDL_sysmutex.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/psp/SDL_syssem.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/psp/SDL_systhread.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/timer/psp/SDL_systimer.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/psp/SDL_pspevents.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/psp/SDL_pspgl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/psp/SDL_pspmouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/psp/SDL_pspvideo.c\" />\n\n        </section>\n\n        <section if=\"linux\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/alsa/SDL_alsa_audio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/arts/SDL_artsaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/dsp/SDL_dspaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/esd/SDL_esdaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/fusionsound/SDL_fsaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/nas/SDL_nasaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/paudio/SDL_paudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/pulseaudio/SDL_pulseaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/qsa/SDL_qsa_audio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/SDL_audiodev.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/sndio/SDL_sndioaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/sun/SDL_sunaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_dbus.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_evdev_capabilities.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_evdev_kbd.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_evdev.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_ibus.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_ime.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_sandbox.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_threadprio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_udev.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/unix/SDL_poll.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/events/imKStoUCS.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/unix/SDL_sysfilesystem.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/linux/SDL_syshaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/linux/SDL_sysjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/unix/SDL_syslocale.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/unix/SDL_sysurl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/linux/SDL_syspower.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/edid-parse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11clipboard.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11dyn.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11events.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11framebuffer.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11keyboard.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11messagebox.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11modes.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11mouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11opengl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11opengles.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11shape.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11touch.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11video.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11vulkan.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11window.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11xinput2.c\" />\n\n        </section>\n\n        <section if=\"rpi\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/kmsdrm/SDL_kmsdrmopengles.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/kmsdrm/SDL_kmsdrmevents.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/kmsdrm/SDL_kmsdrmmouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/kmsdrm/SDL_kmsdrmdyn.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/kmsdrm/SDL_kmsdrmvideo.c\" />\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/linux/SDL_fcitx.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/x11/SDL_x11xfixes.c\" />\n\n        </section>\n\n        <section if=\"windows\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/directsound/SDL_directsound.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/wasapi/SDL_wasapi.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/winmm/SDL_winmm.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/windows/SDL_windows.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/windows/SDL_xinput.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/windows/SDL_immdevice.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/windows/SDL_dinputhaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/windows/SDL_windowshaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/windows/SDL_xinputhaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/hidapi/windows/hid.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/windows/SDL_dinputjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/windows/SDL_windowsjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/windows/SDL_xinputjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/loadso/windows/SDL_sysloadso.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d11/SDL_render_d3d11.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d12/SDL_render_d3d12.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/SDL_d3dmath.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/generic/SDL_syscond.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/windows/SDL_sysmutex.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/windows/SDL_syssem.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/windows/SDL_systhread.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/thread/windows/SDL_systls.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/timer/windows/SDL_systimer.c\" />\n\n            <section unless=\"winrt\">\n\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/wasapi/SDL_wasapi_win32.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/windows/SDL_sysfilesystem.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/windows/SDL_syslocale.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/windows/SDL_sysurl.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/windows/SDL_syspower.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d/SDL_render_d3d.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsclipboard.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsevents.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsframebuffer.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowskeyboard.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsmessagebox.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsmodes.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsmouse.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsopengl.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsopengles.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsshape.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsvideo.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowsvulkan.c\" />\n                <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/windows/SDL_windowswindow.c\" />\n\n            </section>\n\n        </section>\n\n        <section if=\"winrt\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/wasapi/SDL_wasapi_winrt.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/winrt/SDL_winrtapp_common.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/winrt/SDL_winrtapp_direct3d.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/winrt/SDL_winrtapp_xaml.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/winrt/SDL_sysfilesystem.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/winrt/SDL_syslocale.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/winrt/SDL_sysurl.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/winrt/SDL_syspower.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d11/SDL_render_d3d11.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d12/SDL_render_d3d12.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d11/SDL_render_winrt.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/direct3d11/SDL_shaders_d3d11.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtevents.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtgamebar.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtkeyboard.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtmessagebox.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtmouse.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtopengles.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtpointerinput.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/winrt/SDL_winrtvideo.cpp\" />\n\n        </section>\n\n        <section if=\"mac\">\n\n            <compilerflag value=\"-fobjc-arc\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/coreaudio/SDL_coreaudio.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/file/cocoa/SDL_rwopsbundlesupport.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/cocoa/SDL_sysfilesystem.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/darwin/SDL_syshaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/hidapi/mac/hid.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/darwin/SDL_iokitjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/iphoneos/SDL_mfijoystick.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/macosx/SDL_syslocale.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/macosx/SDL_sysurl.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/macosx/SDL_syspower.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoaclipboard.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoaevents.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoakeyboard.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoamessagebox.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoametalview.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoamodes.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoamouse.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoaopengl.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoaopengles.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoashape.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoavideo.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoavulkan.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/cocoa/SDL_cocoawindow.m\" />\n\n        </section>\n\n        <section if=\"ios || tvos\">\n\n            <compilerflag value=\"-fobjc-arc\" unless=\"OBJC_ARC\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/coreaudio/SDL_coreaudio.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/file/cocoa/SDL_rwopsbundlesupport.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/cocoa/SDL_sysfilesystem.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/dummy/SDL_syshaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/hidapi/ios/hid.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/iphoneos/SDL_mfijoystick.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/dummy/SDL_syslocale.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/main/uikit/SDL_uikit_main.c\" if=\"NATIVE_TOOLKIT_SDL_STATIC\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/ios/SDL_sysurl.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/uikit/SDL_syspower.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/render/metal/SDL_render_metal.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/sensor/coremotion/SDL_coremotionsensor.m\" if=\"ios\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitappdelegate.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitclipboard.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitevents.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitmessagebox.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitmetalview.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitmodes.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitopengles.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitopenglview.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitvideo.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitview.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitviewcontroller.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitvulkan.m\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/uikit/SDL_uikitwindow.m\" />\n\n            <compilerflag value=\"-fobjc-arc\" />\n\n        </section>\n\n        <section if=\"android\">\n\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/aaudio/SDL_aaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/android/SDL_androidaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/openslES/SDL_openslES.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/core/android/SDL_android.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/android/SDL_sysfilesystem.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/haptic/android/SDL_syshaptic.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/hidapi/android/hid.cpp\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/android/SDL_sysjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/android/SDL_syslocale.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/main/android/SDL_android_main.c\" if=\"NATIVE_TOOLKIT_SDL_STATIC\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/android/SDL_sysurl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/android/SDL_syspower.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/sensor/android/SDL_androidsensor.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidclipboard.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidevents.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidgl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidkeyboard.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidmessagebox.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidmouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidtouch.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidvideo.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidvulkan.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/android/SDL_androidwindow.c\" />\n\n        </section>\n\n        <section if=\"emscripten\">\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/audio/emscripten/SDL_emscriptenaudio.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/filesystem/emscripten/SDL_sysfilesystem.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/joystick/emscripten/SDL_sysjoystick.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/locale/emscripten/SDL_syslocale.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/misc/emscripten/SDL_sysurl.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/power/emscripten/SDL_syspower.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/emscripten/SDL_emscriptenevents.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/emscripten/SDL_emscriptenframebuffer.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/emscripten/SDL_emscriptenmouse.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/emscripten/SDL_emscriptenopengles.c\" />\n            <file name=\"${NATIVE_TOOLKIT_PATH}/sdl/src/video/emscripten/SDL_emscriptenvideo.c\" />\n        </section>\n\n    </files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/tinyfiledialogs-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-tinyfiledialogs\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/tinyfiledialogs\" />\n\t\t<compilerflag value=\"-D_CRT_SECURE_NO_WARNINGS\" if=\"windows\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/tinyfiledialogs/tinyfiledialogs.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/vorbis-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-vorbis-depends\">\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/include/vorbis/codec.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/include/vorbis/vorbisenc.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/include/vorbis/vorbisfile.h\" />\n\t</files>\n\n\t<files id=\"native-toolkit-vorbis\" tags=\"\">\n\n\t\t<cache value=\"1\" />\n\t\t<tag value=\"${NATIVE_TOOLKIT_OPTIM_TAG}\" if=\"NATIVE_TOOLKIT_OPTIM_TAG\" />\n\n\t\t<depend files=\"native-toolkit-vorbis-depends\" />\n\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/custom/ogg/include/ogg/config_types.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/ogg/include/ogg/ogg.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/ogg/include/ogg/os_types.h\" />\n\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/backends.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/bitrate.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/codebook.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/codec_internal.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/envelope.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/highlevel.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/lookup_data.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/lookup.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/lpc.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/lsp.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/masking.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/mdct.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/misc.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/os.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/psy.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/registry.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/scales.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/smallft.h\" />\n\t\t<depend name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/window.h\" />\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vorbis/include/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vorbis/lib/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/custom/ogg/include/\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/ogg/include/\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/analysis.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/bitrate.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/block.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/codebook.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/envelope.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/floor0.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/floor1.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/info.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/lpc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/lsp.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/mapping0.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/mdct.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/psy.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/registry.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/res0.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/sharedbook.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/smallft.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/synthesis.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/vorbisenc.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/vorbisfile.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vorbis/lib/window.c\" />\n\n\t</files>\n\n</xml>\n"
  },
  {
    "path": "project/lib/vpx-files.xml",
    "content": "<xml>\n\n\t<!-- <set name=\"HXCPP_CPP11\" value=\"1\" /> -->\n\n\t<files id=\"native-toolkit-vpx\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/ogg/include\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vorbis/include\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vorbis/lib\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vpx\" />\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/vpx/vpx-ports\" />\n\t\t<compilerflag value=\"-I${ANDROID_NDK_ROOT}/sources/cpufeatures\" if=\"android\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/alloccommon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/blockd.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/debugmodes.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/dequantize.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/entropy.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/entropymode.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/entropymv.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/extend.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/filter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/findnearmv.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/generic/systemdependent.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/idct_blk.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/idctllm.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/loopfilter_filters.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/mbpitch.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/modecont.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/quant_common.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/reconinter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/reconintra.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/reconintra4x4.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/rtcd.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/setupintrarecon.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/swapyv12buffer.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/treecoder.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/common/vp8_loopfilter.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/decoder/dboolhuff.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/decoder/decodeframe.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/decoder/decodemv.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/decoder/detokenize.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/decoder/onyxd_if.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vp8/vp8_dx_iface.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_config.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_dsp/vpx_dsp_rtcd.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_mem/vpx_mem.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_ports/arm_cpudetect.c\" if=\"ios || android\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_scale/generic/gen_scalers.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_scale/generic/vpx_scale.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_scale/generic/yv12config.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_scale/generic/yv12extend.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx_scale/vpx_scale_rtcd.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx/src/vpx_codec.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx/src/vpx_decoder.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx/src/vpx_encoder.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/vpx/vpx/src/vpx_image.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/webm-files.xml",
    "content": "<xml>\n\n\t<!-- <set name=\"HXCPP_CPP11\" value=\"1\" /> -->\n\n\t<files id=\"native-toolkit-webm\">\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/mkvmuxer.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/mkvmuxerutil.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/mkvparser.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/mkvreader.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/mkvwriter.cpp\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/vttreader.cc\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/webm/webvttparser.cc\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/lib/zlib-files.xml",
    "content": "<xml>\n\n\t<files id=\"native-toolkit-zlib\">\n\n\t\t<compilerflag value=\"-I${NATIVE_TOOLKIT_PATH}/zlib/\" />\n\n\t\t<!-- Use unistd.h anywhere except Win32. -->\n\t\t<compilerflag value=\"-DZ_HAVE_UNISTD_H\" unless=\"windows\" />\n\t\t<compilerflag value=\"-DZ_HAVE_UNISTD_H\" if=\"windows HXCPP_X86_64\" />\n\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/adler32.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/compress.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/crc32.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/deflate.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/gzclose.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/gzlib.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/gzread.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/gzwrite.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/infback.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/inffast.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/inflate.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/inftrees.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/trees.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/uncompr.c\" />\n\t\t<file name=\"${NATIVE_TOOLKIT_PATH}/zlib/zutil.c\" />\n\n\t</files>\n\n</xml>"
  },
  {
    "path": "project/src/ExternalInterface.cpp",
    "content": "#ifndef STATIC_LINK\n#define IMPLEMENT_API\n#endif\n\n#if defined(HX_WINDOWS) || defined(HX_MACOS) || defined(HX_LINUX)\n#define NEKO_COMPATIBLE\n#endif\n\n#include <system/CFFI.h>\n\n#include <app/Application.h>\n#include <app/ApplicationEvent.h>\n#include <graphics/format/JPEG.h>\n#include <graphics/format/PNG.h>\n#include <graphics/utils/ImageDataUtil.h>\n#include <graphics/Image.h>\n#include <graphics/ImageBuffer.h>\n#include <graphics/RenderEvent.h>\n#include <media/containers/OGG.h>\n#include <media/containers/WAV.h>\n#include <media/AudioBuffer.h>\n#include <system/CFFIPointer.h>\n#include <system/Clipboard.h>\n#include <system/ClipboardEvent.h>\n#include <system/Endian.h>\n#include <system/FileWatcher.h>\n#include <system/JNI.h>\n#include <system/Locale.h>\n#include <system/OrientationEvent.h>\n#include <system/SensorEvent.h>\n#include <system/System.h>\n#include <text/Font.h>\n#include <ui/Cursor.h>\n#include <ui/DropEvent.h>\n#include <ui/FileDialog.h>\n#include <ui/Gamepad.h>\n#include <ui/GamepadEvent.h>\n#include <ui/Haptic.h>\n#include <ui/Joystick.h>\n#include <ui/JoystickEvent.h>\n#include <ui/KeyCode.h>\n#include <ui/KeyEvent.h>\n#include <ui/MouseEvent.h>\n#include <ui/TextEvent.h>\n#include <ui/TouchEvent.h>\n#include <ui/Window.h>\n#include <ui/WindowEvent.h>\n#include <utils/compress/LZMA.h>\n#include <utils/compress/Zlib.h>\n#include <vm/NekoVM.h>\n\n#ifdef HX_WINDOWS\n#include <locale>\n#include <codecvt>\n#endif\n#include <memory>\n\n#include <cstdlib>\n#include <cstring>\n\nDEFINE_KIND (k_finalizer);\n\n\nnamespace lime {\n\n\n\tvoid gc_application (value handle) {\n\n\t\tApplication* application = (Application*)val_data (handle);\n\t\tdelete application;\n\n\t}\n\n\n\tvoid hl_gc_application (HL_CFFIPointer* handle) {\n\n\t\tApplication* application = (Application*)handle->ptr;\n\t\tdelete application;\n\n\t}\n\n\n\tvoid gc_file_watcher (value handle) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)val_data (handle);\n\t\tdelete watcher;\n\t\t#endif\n\n\t}\n\n\n\tvoid hl_gc_file_watcher (HL_CFFIPointer* handle) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)handle->ptr;\n\t\tdelete watcher;\n\t\t#endif\n\n\t}\n\n\n\tvoid gc_font (value handle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (handle);\n\t\tdelete font;\n\t\t#endif\n\n\t}\n\n\n\tvoid hl_gc_font (HL_CFFIPointer* handle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont* font = (Font*)handle->ptr;\n\t\tdelete font;\n\t\t#endif\n\n\t}\n\n\n\tvoid gc_window (value handle) {\n\n\t\tWindow* window = (Window*)val_data (handle);\n\t\tdelete window;\n\n\t}\n\n\n\tvoid hl_gc_window (HL_CFFIPointer* handle) {\n\n\t\tWindow* window = (Window*)handle->ptr;\n\t\tdelete window;\n\n\t}\n\n\n\tstd::string wstring_utf8 (const std::wstring& val) {\n\n\t\tstd::string out;\n\t\tunsigned int codepoint = 0;\n\n\t\tfor (const wchar_t chr : val) {\n\n\t\t\tif (chr >= 0xd800 && chr <= 0xdbff) {\n\n\t\t\t\tcodepoint = ((chr - 0xd800) << 10) + 0x10000;\n\n\t\t\t} else {\n\n\t\t\t\tif (chr >= 0xdc00 && chr <= 0xdfff) {\n\n\t\t\t\t\tcodepoint |= chr - 0xdc00;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcodepoint = chr;\n\n\t\t\t\t}\n\n\t\t\t\tif (codepoint <= 0x7f) {\n\n\t\t\t\t\tout.append (1, static_cast<char> (codepoint));\n\n\t\t\t\t} else if (codepoint <= 0x7ff) {\n\n\t\t\t\t\tout.append (1, static_cast<char> (0xc0 | ((codepoint >> 6) & 0x1f)));\n\t\t\t\t\tout.append (1, static_cast<char> (0x80 | (codepoint & 0x3f)));\n\n\t\t\t\t} else if (codepoint <= 0xffff) {\n\n\t\t\t\t\tout.append (1, static_cast<char> (0xe0 | ((codepoint >> 12) & 0x0f)));\n\t\t\t\t\tout.append (1, static_cast<char> (0x80 | ((codepoint >> 6) & 0x3f)));\n\t\t\t\t\tout.append (1, static_cast<char> (0x80 | (codepoint & 0x3f)));\n\n\t\t\t\t} else {\n\n\t\t\t\t\tout.append (1, static_cast<char> (0xf0 | ((codepoint >> 18) & 0x07)));\n\t\t\t\t\tout.append (1, static_cast<char> (0x80 | ((codepoint >> 12) & 0x3f)));\n\t\t\t\t\tout.append (1, static_cast<char> (0x80 | ((codepoint >> 6) & 0x3f)));\n\t\t\t\t\tout.append (1, static_cast<char> (0x80 | (codepoint & 0x3f)));\n\n\t\t\t\t}\n\n\t\t\t\tcodepoint = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn out;\n\n\t}\n\n\n\tvbyte* hl_wstring_to_utf8_bytes (const std::wstring& val) {\n\n\t\tconst std::string utf8 (wstring_utf8 (val));\n\t\tvbyte* const bytes = hl_alloc_bytes (utf8.size () + 1);\n\t\tstd::memcpy(bytes, utf8.c_str (), utf8.size () + 1);\n\t\treturn bytes;\n\n\t}\n\n\n\tstd::wstring* hxstring_to_wstring (HxString val) {\n\n\t\tif (val.c_str ()) {\n\n\t\t\t#ifdef HX_WINDOWS\n\t\t\treturn new std::wstring (hxs_wchar (val, nullptr));\n\t\t\t#else\n\t\t\tconst std::string _val (hxs_utf8 (val, nullptr));\n\t\t\treturn new std::wstring (_val.begin (), _val.end ());\n\t\t\t#endif\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tstd::wstring* hxstring_to_wstring (hl_vstring* val) {\n\n\t\tif (val) {\n\n\t\t\tstd::string _val = std::string (hl_to_utf8 (val->bytes));\n\t\t\t#ifdef HX_WINDOWS\n\t\t\tstd::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;\n\t\t\treturn new std::wstring (converter.from_bytes (_val));\n\t\t\t#else\n\t\t\treturn new std::wstring (_val.begin (), _val.end ());\n\t\t\t#endif\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tvalue wstring_to_value (std::wstring* val) {\n\n\t\tif (val) {\n\n\t\t\t#ifdef HX_WINDOWS\n\t\t\treturn alloc_wstring (val->c_str ());\n\t\t\t#else\n\t\t\tstd::string _val = std::string (val->begin (), val->end ());\n\t\t\treturn alloc_string (_val.c_str ());\n\t\t\t#endif\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_application_create () {\n\n\t\tApplication* application = CreateApplication ();\n\t\treturn CFFIPointer (application, gc_application);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_application_create) () {\n\n\t\tApplication* application = CreateApplication ();\n\t\treturn HLCFFIPointer (application, (hl_finalizer)hl_gc_application);\n\n\t}\n\n\n\tvoid lime_application_event_manager_register (value callback, value eventObject) {\n\n\t\tApplicationEvent::callback = new ValuePointer (callback);\n\t\tApplicationEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_application_event_manager_register) (vclosure* callback, ApplicationEvent* eventObject) {\n\n\t\tApplicationEvent::callback = new ValuePointer (callback);\n\t\tApplicationEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tint lime_application_exec (value application) {\n\n\t\tApplication* app = (Application*)val_data (application);\n\t\treturn app->Exec ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_application_exec) (HL_CFFIPointer* application) {\n\n\t\tApplication* app = (Application*)application->ptr;\n\t\treturn app->Exec ();\n\n\t}\n\n\n\tvoid lime_application_init (value application) {\n\n\t\tApplication* app = (Application*)val_data (application);\n\t\tapp->Init ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_application_init) (HL_CFFIPointer* application) {\n\n\t\tApplication* app = (Application*)application->ptr;\n\t\tapp->Init ();\n\n\t}\n\n\n\tint lime_application_quit (value application) {\n\n\t\tApplication* app = (Application*)val_data (application);\n\t\treturn app->Quit ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_application_quit) (HL_CFFIPointer* application) {\n\n\t\tApplication* app = (Application*)application->ptr;\n\t\treturn app->Quit ();\n\n\t}\n\n\n\tvoid lime_application_set_frame_rate (value application, double frameRate) {\n\n\t\tApplication* app = (Application*)val_data (application);\n\t\tapp->SetFrameRate (frameRate);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_application_set_frame_rate) (HL_CFFIPointer* application, double frameRate) {\n\n\t\tApplication* app = (Application*)application->ptr;\n\t\tapp->SetFrameRate (frameRate);\n\n\t}\n\n\n\tbool lime_application_update (value application) {\n\n\t\tApplication* app = (Application*)val_data (application);\n\t\treturn app->Update ();\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_application_update) (HL_CFFIPointer* application) {\n\n\t\tApplication* app = (Application*)application->ptr;\n\t\treturn app->Update ();\n\n\t}\n\n\n\tvalue lime_audio_load_bytes (value data, value buffer) {\n\n\t\tResource resource;\n\t\tBytes bytes;\n\n\t\tAudioBuffer audioBuffer = AudioBuffer (buffer);\n\n\t\tbytes.Set (data);\n\t\tresource = Resource (&bytes);\n\n\t\tif (WAV::Decode (&resource, &audioBuffer)) {\n\n\t\t\treturn audioBuffer.Value (buffer);\n\n\t\t}\n\n\t\t#ifdef LIME_OGG\n\t\tif (OGG::Decode (&resource, &audioBuffer)) {\n\n\t\t\treturn audioBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM AudioBuffer* HL_NAME(hl_audio_load_bytes) (Bytes* data, AudioBuffer* buffer) {\n\n\t\tResource resource = Resource (data);\n\n\t\tif (WAV::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\t#ifdef LIME_OGG\n\t\tif (OGG::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_audio_load_file (value data, value buffer) {\n\n\t\tResource resource;\n\n\t\tAudioBuffer audioBuffer = AudioBuffer (buffer);\n\n\t\tresource = Resource (val_string (data));\n\n\t\tif (WAV::Decode (&resource, &audioBuffer)) {\n\n\t\t\treturn audioBuffer.Value (buffer);\n\n\t\t}\n\n\t\t#ifdef LIME_OGG\n\t\tif (OGG::Decode (&resource, &audioBuffer)) {\n\n\t\t\treturn audioBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM AudioBuffer* HL_NAME(hl_audio_load_file) (hl_vstring* data, AudioBuffer* buffer) {\n\n\t\tResource resource = Resource (data ? hl_to_utf8 ((const uchar*)data->bytes) : NULL);\n\n\t\tif (WAV::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\t#ifdef LIME_OGG\n\t\tif (OGG::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_audio_load (value data, value buffer) {\n\n\t\tif (val_is_string (data)) {\n\n\t\t\treturn lime_audio_load_file (data, buffer);\n\n\t\t} else {\n\n\t\t\treturn lime_audio_load_bytes (data, buffer);\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_bytes_from_data_pointer (double data, int length, value _bytes) {\n\n\t\tuintptr_t ptr = (uintptr_t)data;\n\t\tBytes bytes (_bytes);\n\t\tbytes.Resize (length);\n\n\t\tif (ptr) {\n\n\t\t\tmemcpy (bytes.b, (const void*)ptr, length);\n\n\t\t}\n\n\t\treturn bytes.Value (_bytes);\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_bytes_from_data_pointer) (double data, int length, Bytes* bytes) {\n\n\t\tuintptr_t ptr = (uintptr_t)data;\n\t\tbytes->Resize (length);\n\n\t\tif (ptr) {\n\n\t\t\tmemcpy (bytes->b, (const void*)ptr, length);\n\n\t\t}\n\n\t\treturn bytes;\n\n\t}\n\n\n\tdouble lime_bytes_get_data_pointer (value bytes) {\n\n\t\tBytes data = Bytes (bytes);\n\t\treturn (uintptr_t)data.b;\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_bytes_get_data_pointer) (Bytes* bytes) {\n\n\t\treturn bytes ? (uintptr_t)bytes->b : 0;\n\n\t}\n\n\n\tdouble lime_bytes_get_data_pointer_offset (value bytes, int offset) {\n\n\t\tif (val_is_null (bytes)) return 0;\n\n\t\tBytes data = Bytes (bytes);\n\t\treturn (uintptr_t)data.b + offset;\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_bytes_get_data_pointer_offset) (Bytes* bytes, int offset) {\n\n\t\tif (!bytes) return 0;\n\t\treturn (uintptr_t)bytes->b + offset;\n\n\t}\n\n\n\tvalue lime_bytes_read_file (HxString path, value bytes) {\n\n\t\tBytes data (bytes);\n\t\tdata.ReadFile (hxs_utf8 (path, nullptr));\n\t\treturn data.Value (bytes);\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_bytes_read_file) (hl_vstring* path, Bytes* bytes) {\n\n\t\tif (!path) return 0;\n\t\tbytes->ReadFile (hl_to_utf8 ((const uchar*)path->bytes));\n\t\treturn bytes;\n\n\t}\n\n\n\tdouble lime_cffi_get_native_pointer (value handle) {\n\n\t\treturn (uintptr_t)val_data (handle);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_cffi_get_native_pointer) (HL_CFFIPointer* handle) {\n\n\t\treturn (uintptr_t)handle->ptr;\n\n\t}\n\n\n\tvoid lime_cffi_finalizer (value abstract) {\n\n\t\tval_call0 ((value)val_data (abstract));\n\n\t}\n\n\n\tvalue lime_cffi_set_finalizer (value callback) {\n\n\t\tvalue abstract = alloc_abstract (k_finalizer, callback);\n\t\tval_gc (abstract, lime_cffi_finalizer);\n\t\treturn abstract;\n\n\t}\n\n\n\tvoid lime_clipboard_event_manager_register (value callback, value eventObject) {\n\n\t\tClipboardEvent::callback = new ValuePointer (callback);\n\t\tClipboardEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_clipboard_event_manager_register) (vclosure* callback, ClipboardEvent* eventObject) {\n\n\t\tClipboardEvent::callback = new ValuePointer (callback);\n\t\tClipboardEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvalue lime_clipboard_get_text () {\n\n\t\tif (Clipboard::HasText ()) {\n\n\t\t\tconst char* text = Clipboard::GetText ();\n\t\t\tvalue _text = alloc_string (text);\n\n\t\t\t// TODO: Should we free for all backends? (SDL requires it)\n\n\t\t\tfree ((char*)text);\n\t\t\treturn _text;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_clipboard_get_text) () {\n\n\t\tif (Clipboard::HasText ()) {\n\n\t\t\tconst char* text = Clipboard::GetText ();\n\t\t\treturn (vbyte*)text;\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_clipboard_set_text (HxString text) {\n\n\t\tClipboard::SetText (hxs_utf8 (text, nullptr));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_clipboard_set_text) (hl_vstring* text) {\n\n\t\tClipboard::SetText (text ? (const char*)hl_to_utf8 ((const uchar*)text->bytes) : NULL);\n\n\t}\n\n\n\tdouble lime_data_pointer_offset (double pointer, int offset) {\n\n\t\treturn (uintptr_t)pointer + offset;\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_data_pointer_offset) (double pointer, int offset) {\n\n\t\treturn (uintptr_t)pointer + offset;\n\n\t}\n\n\n\tvalue lime_deflate_compress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tZlib::Compress (DEFLATE, &data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_deflate_compress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tZlib::Compress (DEFLATE, buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_deflate_decompress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tZlib::Decompress (DEFLATE, &data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_deflate_decompress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tZlib::Decompress (DEFLATE, buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_drop_event_manager_register (value callback, value eventObject) {\n\n\t\tDropEvent::callback = new ValuePointer (callback);\n\t\tDropEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_drop_event_manager_register) (vclosure* callback, DropEvent* eventObject) {\n\n\t\tDropEvent::callback = new ValuePointer (callback);\n\t\tDropEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvalue lime_file_dialog_open_directory (HxString title, HxString filter, HxString defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::wstring* path = FileDialog::OpenDirectory (_title, _filter, _defaultPath);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path) {\n\n\t\t\tvalue _path = wstring_to_value (path);\n\t\t\tdelete path;\n\t\t\treturn _path;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_file_dialog_open_directory) (hl_vstring* title, hl_vstring* filter, hl_vstring* defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::wstring* path = FileDialog::OpenDirectory (_title, _filter, _defaultPath);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*path);\n\t\t\tdelete path;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_file_dialog_open_file (HxString title, HxString filter, HxString defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::wstring* path = FileDialog::OpenFile (_title, _filter, _defaultPath);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path) {\n\n\t\t\tvalue _path = wstring_to_value (path);\n\t\t\tdelete path;\n\t\t\treturn _path;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_file_dialog_open_file) (hl_vstring* title, hl_vstring* filter, hl_vstring* defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::wstring* path = FileDialog::OpenFile (_title, _filter, _defaultPath);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*path);\n\t\t\tdelete path;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_file_dialog_open_files (HxString title, HxString filter, HxString defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::vector<std::wstring*> files;\n\n\t\tFileDialog::OpenFiles (&files, _title, _filter, _defaultPath);\n\t\tvalue result = alloc_array (files.size ());\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tfor (int i = 0; i < files.size (); i++) {\n\n\t\t\tvalue _file = wstring_to_value (files[i]);\n\t\t\tval_array_set_i (result, i, _file);\n\t\t\tdelete files[i];\n\n\t\t}\n\n\t\t#else\n\t\tvalue result = alloc_array (0);\n\t\t#endif\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM hl_varray* HL_NAME(hl_file_dialog_open_files) (hl_vstring* title, hl_vstring* filter, hl_vstring* defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::vector<std::wstring*> files;\n\n\t\tFileDialog::OpenFiles (&files, _title, _filter, _defaultPath);\n\t\thl_varray* result = (hl_varray*)hl_alloc_array (&hlt_bytes, files.size ());\n\t\tvbyte** resultData = hl_aptr (result, vbyte*);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tfor (int i = 0; i < files.size (); i++) {\n\n\t\t\t*resultData++ = hl_wstring_to_utf8_bytes (*files[i]);\n\t\t\tdelete files[i];\n\n\t\t}\n\n\t\t#else\n\t\thl_varray* result = hl_alloc_array (&hlt_bytes, 0);\n\t\t#endif\n\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_file_dialog_save_file (HxString title, HxString filter, HxString defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::wstring* path = FileDialog::SaveFile (_title, _filter, _defaultPath);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path) {\n\n\t\t\tvalue _path = wstring_to_value (path);\n\t\t\tdelete path;\n\t\t\treturn _path;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_file_dialog_save_file) (hl_vstring* title, hl_vstring* filter, hl_vstring* defaultPath) {\n\n\t\t#ifdef LIME_TINYFILEDIALOGS\n\n\t\tstd::wstring* _title = hxstring_to_wstring (title);\n\t\tstd::wstring* _filter = hxstring_to_wstring (filter);\n\t\tstd::wstring* _defaultPath = hxstring_to_wstring (defaultPath);\n\n\t\tstd::wstring* path = FileDialog::SaveFile (_title, _filter, _defaultPath);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*path);\n\t\t\tdelete path;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_file_watcher_create (value callback) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = new FileWatcher (callback);\n\t\treturn CFFIPointer (watcher, gc_file_watcher);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_file_watcher_create) (vclosure* callback) {\n\n\t\t// #ifdef LIME_EFSW\n\t\t// FileWatcher* watcher = new FileWatcher (callback);\n\t\t// return HLCFFIPointer (watcher, (hl_finalizer)hl_gc_file_watcher);\n\t\t// #else\n\t\treturn 0;\n\t\t// #endif\n\n\t}\n\n\n\tvalue lime_file_watcher_add_directory (value handle, value path, bool recursive) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)val_data (handle);\n\t\treturn alloc_int (watcher->AddDirectory (val_string (path), recursive));\n\t\t#else\n\t\treturn alloc_int (0);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_file_watcher_add_directory) (HL_CFFIPointer* handle, hl_vstring* path, bool recursive) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)handle->ptr;\n\t\treturn watcher->AddDirectory ((const char*)path, recursive);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_file_watcher_remove_directory (value handle, value watchID) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)val_data (handle);\n\t\twatcher->RemoveDirectory (val_int (watchID));\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_file_watcher_remove_directory) (HL_CFFIPointer* handle, int watchID) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)handle->ptr;\n\t\twatcher->RemoveDirectory (watchID);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_file_watcher_update (value handle) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)val_data (handle);\n\t\twatcher->Update ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_file_watcher_update) (HL_CFFIPointer* handle) {\n\n\t\t#ifdef LIME_EFSW\n\t\tFileWatcher* watcher = (FileWatcher*)handle->ptr;\n\t\twatcher->Update ();\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_ascender (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetAscender ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_ascender) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetAscender ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_descender (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetDescender ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_descender) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetDescender ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_font_get_family_name (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\twchar_t *name = font->GetFamilyName ();\n\t\tvalue result = alloc_wstring (name);\n\t\tdelete name;\n\t\treturn result;\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_font_get_family_name) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\twchar_t *name = font->GetFamilyName ();\n\t\tif (!name)\n\t\t\treturn nullptr;\n\t\tvbyte* const result = hl_wstring_to_utf8_bytes (name);\n\t\tdelete name;\n\t\treturn result;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_glyph_index (value fontHandle, HxString character) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetGlyphIndex (hxs_utf8 (character, nullptr));\n\t\t#else\n\t\treturn -1;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_glyph_index) (HL_CFFIPointer* fontHandle, hl_vstring* character) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetGlyphIndex (character ? (char*)hl_to_utf8 ((const uchar*)character->bytes) : NULL);\n\t\t#else\n\t\treturn -1;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_font_get_glyph_indices (value fontHandle, HxString characters) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn (value)font->GetGlyphIndices (true, hxs_utf8 (characters, nullptr));\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM hl_varray* HL_NAME(hl_font_get_glyph_indices) (HL_CFFIPointer* fontHandle, hl_vstring* characters) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn (hl_varray*)font->GetGlyphIndices (false, characters ? (char*)hl_to_utf8 ((const uchar*)characters->bytes) : NULL);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_font_get_glyph_metrics (value fontHandle, int index) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn (value)font->GetGlyphMetrics (true, index);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_font_get_glyph_metrics) (HL_CFFIPointer* fontHandle, int index) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn (vdynamic*)font->GetGlyphMetrics (false, index);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_height (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetHeight ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_height) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetHeight ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_num_glyphs (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetNumGlyphs ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_num_glyphs) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetNumGlyphs ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_underline_position (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetUnderlinePosition ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_underline_position) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetUnderlinePosition ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_underline_thickness (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetUnderlineThickness ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_underline_thickness) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetUnderlineThickness ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_strikethrough_position (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetStrikethroughPosition ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_strikethrough_position) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetStrikethroughPosition ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_strikethrough_thickness (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetStrikethroughThickness ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_strikethrough_thickness) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetStrikethroughThickness ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_font_get_units_per_em (value fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn font->GetUnitsPerEM ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_font_get_units_per_em) (HL_CFFIPointer* fontHandle) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn font->GetUnitsPerEM ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_font_load_bytes (value data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tResource resource;\n\t\tBytes bytes;\n\n\t\tbytes.Set (data);\n\t\tresource = Resource (&bytes);\n\n\t\tFont *font = new Font (&resource, 0);\n\n\t\tif (font) {\n\n\t\t\tif (font->face) {\n\n\t\t\t\treturn CFFIPointer (font, gc_font);\n\n\t\t\t} else {\n\n\t\t\t\tdelete font;\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_font_load_bytes) (Bytes* data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tResource resource = Resource (data);\n\n\t\tFont *font = new Font (&resource, 0);\n\n\t\tif (font) {\n\n\t\t\tif (font->face) {\n\n\t\t\t\treturn HLCFFIPointer (font, (hl_finalizer)hl_gc_font);\n\n\t\t\t} else {\n\n\t\t\t\tdelete font;\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_font_load_file (value data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tResource resource = Resource (val_string (data));\n\n\t\tFont *font = new Font (&resource, 0);\n\n\t\tif (font) {\n\n\t\t\tif (font->face) {\n\n\t\t\t\treturn CFFIPointer (font, gc_font);\n\n\t\t\t} else {\n\n\t\t\t\tdelete font;\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_font_load_file) (hl_vstring* data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tResource resource = Resource (data ? hl_to_utf8 ((const uchar*)data->bytes) : NULL);\n\n\t\tFont *font = new Font (&resource, 0);\n\n\t\tif (font) {\n\n\t\t\tif (font->face) {\n\n\t\t\t\treturn HLCFFIPointer (font, (hl_finalizer)hl_gc_font);\n\n\t\t\t} else {\n\n\t\t\t\tdelete font;\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_font_load (value data) {\n\n\t\tif (val_is_string (data)) {\n\n\t\t\treturn lime_font_load_file (data);\n\n\t\t} else {\n\n\t\t\treturn lime_font_load_bytes (data);\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_font_outline_decompose (value fontHandle, int size) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\treturn (value)font->Decompose (true, size);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_font_outline_decompose) (HL_CFFIPointer* fontHandle, int size) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\treturn (vdynamic*)font->Decompose (false, size);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_font_render_glyph (value fontHandle, int index, value data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\tBytes bytes (data);\n\n\t\tif (font->RenderGlyph (index, &bytes)) {\n\n\t\t\treturn bytes.Value (data);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_font_render_glyph) (HL_CFFIPointer* fontHandle, int index, Bytes* data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\n\t\tif (font->RenderGlyph (index, data)) {\n\n\t\t\treturn data;\n\n\t\t}\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_font_render_glyphs (value fontHandle, value indices, value data) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\tBytes bytes (data);\n\n\t\tif (font->RenderGlyphs (indices, &bytes)) {\n\n\t\t\treturn bytes.Value (data);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_font_render_glyphs) (HL_CFFIPointer* fontHandle, hl_varray* indices, Bytes* data) {\n\n\t\t// #ifdef LIME_FREETYPE\n\t\t// Font *font = (Font*)fontHandle->ptr;\n\t\t// return font->RenderGlyphs (indices, &bytes);\n\t\t// #else\n\t\treturn NULL;\n\t\t// #endif\n\n\t}\n\n\n\tvoid lime_font_set_size (value fontHandle, int fontSize, int dpi) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)val_data (fontHandle);\n\t\tfont->SetSize (fontSize, dpi);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_font_set_size) (HL_CFFIPointer* fontHandle, int fontSize, int dpi) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont *font = (Font*)fontHandle->ptr;\n\t\tfont->SetSize (fontSize, dpi);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gamepad_add_mappings (value mappings) {\n\n\t\tint length = val_array_size (mappings);\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tGamepad::AddMapping (val_string (val_array_i (mappings, i)));\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gamepad_add_mappings) (hl_varray* mappings) {\n\n\t\tint length = mappings->size;\n\t\thl_vstring** mappingsData = hl_aptr (mappings, hl_vstring*);\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tGamepad::AddMapping (hl_to_utf8 ((const uchar*)((*mappingsData++)->bytes)));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_gamepad_event_manager_register (value callback, value eventObject) {\n\n\t\tGamepadEvent::callback = new ValuePointer (callback);\n\t\tGamepadEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gamepad_event_manager_register) (vclosure* callback, GamepadEvent* eventObject) {\n\n\t\tGamepadEvent::callback = new ValuePointer (callback);\n\t\tGamepadEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvalue lime_gamepad_get_device_guid (int id) {\n\n\t\tconst char* guid = Gamepad::GetDeviceGUID (id);\n\n\t\tif (guid) {\n\n\t\t\tvalue result = alloc_string (guid);\n\t\t\tdelete guid;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gamepad_get_device_guid) (int id) {\n\n\t\tconst char* guid = Gamepad::GetDeviceGUID (id);\n\n\t\tif (guid) {\n\n\t\t\treturn (vbyte*)guid;\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_gamepad_get_device_name (int id) {\n\n\t\tconst char* name = Gamepad::GetDeviceName (id);\n\t\treturn name ? alloc_string (name) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gamepad_get_device_name) (int id) {\n\n\t\treturn (vbyte*)Gamepad::GetDeviceName (id);\n\n\t}\n\n\n\tvoid lime_gamepad_rumble (int id, double lowFrequencyRumble, double highFrequencyRumble, int duration) {\n\n\t\tGamepad::Rumble (id, lowFrequencyRumble, highFrequencyRumble, duration);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gamepad_rumble) (int id, double lowFrequencyRumble, double highFrequencyRumble, int duration) {\n\n\t\tGamepad::Rumble (id, lowFrequencyRumble, highFrequencyRumble, duration);\n\n\t}\n\n\n\tvalue lime_gzip_compress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tZlib::Compress (GZIP, &data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_gzip_compress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tZlib::Compress (GZIP, buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gzip_decompress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tZlib::Decompress (GZIP, &data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_gzip_decompress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tZlib::Decompress (GZIP, buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_haptic_vibrate (int period, int duration) {\n\n\t\t#ifdef IPHONE\n\t\tHaptic::Vibrate (period, duration);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_haptic_vibrate) (int period, int duration) {\n\n\t\t#ifdef IPHONE\n\t\tHaptic::Vibrate (period, duration);\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_image_encode (value buffer, int type, int quality, value bytes) {\n\n\t\tImageBuffer imageBuffer = ImageBuffer (buffer);\n\t\tBytes data = Bytes (bytes);\n\n\t\tswitch (type) {\n\n\t\t\tcase 0:\n\n\t\t\t\t#ifdef LIME_PNG\n\t\t\t\tif (PNG::Encode (&imageBuffer, &data)) {\n\n\t\t\t\t\treturn data.Value (bytes);\n\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\n\t\t\t\t#ifdef LIME_JPEG\n\t\t\t\tif (JPEG::Encode (&imageBuffer, &data, quality)) {\n\n\t\t\t\t\treturn data.Value (bytes);\n\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\tdefault: break;\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_image_encode) (ImageBuffer* buffer, int type, int quality, Bytes* bytes) {\n\n\t\tswitch (type) {\n\n\t\t\tcase 0:\n\n\t\t\t\t#ifdef LIME_PNG\n\t\t\t\tif (PNG::Encode (buffer, bytes)) {\n\n\t\t\t\t\treturn bytes;\n\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\n\t\t\t\t#ifdef LIME_JPEG\n\t\t\t\tif (JPEG::Encode (buffer, bytes, quality)) {\n\n\t\t\t\t\treturn bytes;\n\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\tdefault: break;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_image_load_bytes (value data, value buffer) {\n\n\t\tResource resource;\n\t\tBytes bytes;\n\n\t\tImageBuffer imageBuffer = ImageBuffer (buffer);\n\n\t\tbytes.Set (data);\n\t\tresource = Resource (&bytes);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, &imageBuffer)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, &imageBuffer)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_image_load_bytes) (Bytes* data, ImageBuffer* buffer) {\n\n\t\tResource resource = Resource (data);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_image_load_file (value data, value buffer) {\n\n\t\tResource resource = Resource (val_string (data));\n\t\tImageBuffer imageBuffer = ImageBuffer (buffer);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, &imageBuffer)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, &imageBuffer)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_image_load_file) (hl_vstring* data, ImageBuffer* buffer) {\n\n\t\tResource resource = Resource (data);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, buffer)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_image_load (value data, value buffer) {\n\n\t\tif (val_is_string (data)) {\n\n\t\t\treturn lime_image_load_file (data, buffer);\n\n\t\t} else {\n\n\t\t\treturn lime_image_load_bytes (data, buffer);\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_image_data_util_color_transform (value image, value rect, value colorMatrix) {\n\n\t\tImage _image = Image (image);\n\t\tRectangle _rect = Rectangle (rect);\n\t\tColorMatrix _colorMatrix = ColorMatrix (colorMatrix);\n\t\tImageDataUtil::ColorTransform (&_image, &_rect, &_colorMatrix);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_color_transform) (Image* image, Rectangle* rect, ArrayBufferView* colorMatrix) {\n\n\t\tColorMatrix _colorMatrix = ColorMatrix (colorMatrix);\n\t\tImageDataUtil::ColorTransform (image, rect, &_colorMatrix);\n\n\t}\n\n\n\tvoid lime_image_data_util_copy_channel (value image, value sourceImage, value sourceRect, value destPoint, int srcChannel, int destChannel) {\n\n\t\tImage _image = Image (image);\n\t\tImage _sourceImage = Image (sourceImage);\n\t\tRectangle _sourceRect = Rectangle (sourceRect);\n\t\tVector2 _destPoint = Vector2 (destPoint);\n\t\tImageDataUtil::CopyChannel (&_image, &_sourceImage, &_sourceRect, &_destPoint, srcChannel, destChannel);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_copy_channel) (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int srcChannel, int destChannel) {\n\n\t\tImageDataUtil::CopyChannel (image, sourceImage, sourceRect, destPoint, srcChannel, destChannel);\n\n\t}\n\n\n\tvoid lime_image_data_util_copy_pixels (value image, value sourceImage, value sourceRect, value destPoint, value alphaImage, value alphaPoint, bool mergeAlpha) {\n\n\t\tImage _image = Image (image);\n\t\tImage _sourceImage = Image (sourceImage);\n\t\tRectangle _sourceRect = Rectangle (sourceRect);\n\t\tVector2 _destPoint = Vector2 (destPoint);\n\n\t\tif (val_is_null (alphaImage)) {\n\n\t\t\tImageDataUtil::CopyPixels (&_image, &_sourceImage, &_sourceRect, &_destPoint, 0, 0, mergeAlpha);\n\n\t\t} else {\n\n\t\t\tImage _alphaImage = Image (alphaImage);\n\t\t\tVector2 _alphaPoint = Vector2 (alphaPoint);\n\n\t\t\tImageDataUtil::CopyPixels (&_image, &_sourceImage, &_sourceRect, &_destPoint, &_alphaImage, &_alphaPoint, mergeAlpha);\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_copy_pixels) (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, Image* alphaImage, Vector2* alphaPoint, bool mergeAlpha) {\n\n\t\tif (!alphaImage) {\n\n\t\t\tImageDataUtil::CopyPixels (image, sourceImage, sourceRect, destPoint, NULL, NULL, mergeAlpha);\n\n\t\t} else {\n\n\t\t\tif (!alphaPoint) {\n\n\t\t\t\tVector2 _alphaPoint = Vector2 (0, 0);\n\n\t\t\t\tImageDataUtil::CopyPixels (image, sourceImage, sourceRect, destPoint, alphaImage, &_alphaPoint, mergeAlpha);\n\n\t\t\t} else {\n\n\t\t\t\tImageDataUtil::CopyPixels (image, sourceImage, sourceRect, destPoint, alphaImage, alphaPoint, mergeAlpha);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_image_data_util_fill_rect (value image, value rect, int rg, int ba) {\n\n\t\tImage _image = Image (image);\n\t\tRectangle _rect = Rectangle (rect);\n\t\tint32_t color = (rg << 16) | ba;\n\t\tImageDataUtil::FillRect (&_image, &_rect, color);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_fill_rect) (Image* image, Rectangle* rect, int rg, int ba) {\n\n\t\tint32_t color = (rg << 16) | ba;\n\t\tImageDataUtil::FillRect (image, rect, color);\n\n\t}\n\n\n\tvoid lime_image_data_util_flood_fill (value image, int x, int y, int rg, int ba) {\n\n\t\tImage _image = Image (image);\n\t\tint32_t color = (rg << 16) | ba;\n\t\tImageDataUtil::FloodFill (&_image, x, y, color);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_flood_fill) (Image* image, int x, int y, int rg, int ba) {\n\n\t\tint32_t color = (rg << 16) | ba;\n\t\tImageDataUtil::FloodFill (image, x, y, color);\n\n\t}\n\n\n\tvoid lime_image_data_util_get_pixels (value image, value rect, int format, value bytes) {\n\n\t\tImage _image = Image (image);\n\t\tRectangle _rect = Rectangle (rect);\n\t\tPixelFormat _format = (PixelFormat)format;\n\t\tBytes pixels = Bytes (bytes);\n\t\tImageDataUtil::GetPixels (&_image, &_rect, _format, &pixels);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_get_pixels) (Image* image, Rectangle* rect, PixelFormat format, Bytes* bytes) {\n\n\t\tImageDataUtil::GetPixels (image, rect, format, bytes);\n\n\t}\n\n\n\tvoid lime_image_data_util_merge (value image, value sourceImage, value sourceRect, value destPoint, int redMultiplier, int greenMultiplier, int blueMultiplier, int alphaMultiplier) {\n\n\t\tImage _image = Image (image);\n\t\tImage _sourceImage = Image (sourceImage);\n\t\tRectangle _sourceRect = Rectangle (sourceRect);\n\t\tVector2 _destPoint = Vector2 (destPoint);\n\t\tImageDataUtil::Merge (&_image, &_sourceImage, &_sourceRect, &_destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_merge) (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int redMultiplier, int greenMultiplier, int blueMultiplier, int alphaMultiplier) {\n\n\t\tImageDataUtil::Merge (image, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier);\n\n\t}\n\n\n\tvoid lime_image_data_util_multiply_alpha (value image) {\n\n\t\tImage _image = Image (image);\n\t\tImageDataUtil::MultiplyAlpha (&_image);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_multiply_alpha) (Image* image) {\n\n\t\tImageDataUtil::MultiplyAlpha (image);\n\n\t}\n\n\n\tvoid lime_image_data_util_resize (value image, value buffer, int width, int height) {\n\n\t\tImage _image = Image (image);\n\t\tImageBuffer _buffer = ImageBuffer (buffer);\n\t\tImageDataUtil::Resize (&_image, &_buffer, width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_resize) (Image* image, ImageBuffer* buffer, int width, int height) {\n\n\t\tImageDataUtil::Resize (image, buffer, width, height);\n\n\t}\n\n\n\tvoid lime_image_data_util_set_format (value image, int format) {\n\n\t\tImage _image = Image (image);\n\t\tPixelFormat _format = (PixelFormat)format;\n\t\tImageDataUtil::SetFormat (&_image, _format);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_set_format) (Image* image, PixelFormat format) {\n\n\t\tImageDataUtil::SetFormat (image, format);\n\n\t}\n\n\n\tvoid lime_image_data_util_set_pixels (value image, value rect, value bytes, int offset, int format, int endian) {\n\n\t\tImage _image = Image (image);\n\t\tRectangle _rect = Rectangle (rect);\n\t\tBytes _bytes (bytes);\n\t\tPixelFormat _format = (PixelFormat)format;\n\t\tEndian _endian = (Endian)endian;\n\t\tImageDataUtil::SetPixels (&_image, &_rect, &_bytes, offset, _format, _endian);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_set_pixels) (Image* image, Rectangle* rect, Bytes* bytes, int offset, PixelFormat format, Endian endian) {\n\n\t\tImageDataUtil::SetPixels (image, rect, bytes, offset, format, endian);\n\n\t}\n\n\n\tint lime_image_data_util_threshold (value image, value sourceImage, value sourceRect, value destPoint, int operation, int thresholdRG, int thresholdBA, int colorRG, int colorBA, int maskRG, int maskBA, bool copySource) {\n\n\t\tImage _image = Image (image);\n\t\tImage _sourceImage = Image (sourceImage);\n\t\tRectangle _sourceRect = Rectangle (sourceRect);\n\t\tVector2 _destPoint = Vector2 (destPoint);\n\t\tint32_t threshold = (thresholdRG << 16) | thresholdBA;\n\t\tint32_t color = (colorRG << 16) | colorBA;\n\t\tint32_t mask = (maskRG << 16) | maskBA;\n\t\treturn ImageDataUtil::Threshold (&_image, &_sourceImage, &_sourceRect, &_destPoint, operation, threshold, color, mask, copySource);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_image_data_util_threshold) (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int operation, int thresholdRG, int thresholdBA, int colorRG, int colorBA, int maskRG, int maskBA, bool copySource) {\n\n\t\tint32_t threshold = (thresholdRG << 16) | thresholdBA;\n\t\tint32_t color = (colorRG << 16) | colorBA;\n\t\tint32_t mask = (maskRG << 16) | maskBA;\n\t\treturn ImageDataUtil::Threshold (image, sourceImage, sourceRect, destPoint, operation, threshold, color, mask, copySource);\n\n\t}\n\n\n\tvoid lime_image_data_util_unmultiply_alpha (value image) {\n\n\t\tImage _image = Image (image);\n\t\tImageDataUtil::UnmultiplyAlpha (&_image);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_image_data_util_unmultiply_alpha) (Image* image) {\n\n\t\tImageDataUtil::UnmultiplyAlpha (image);\n\n\t}\n\n\n\tdouble lime_jni_getenv () {\n\n\t\t#ifdef ANDROID\n\t\treturn (uintptr_t)JNI::GetEnv ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_jni_getenv) () {\n\n\t\t#ifdef ANDROID\n\t\treturn (uintptr_t)JNI::GetEnv ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_joystick_event_manager_register (value callback, value eventObject) {\n\n\t\tJoystickEvent::callback = new ValuePointer (callback);\n\t\tJoystickEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_joystick_event_manager_register) (vclosure* callback, JoystickEvent* eventObject) {\n\n\t\tJoystickEvent::callback = new ValuePointer (callback);\n\t\tJoystickEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvalue lime_joystick_get_device_guid (int id) {\n\n\t\tconst char* guid = Joystick::GetDeviceGUID (id);\n\t\treturn guid ? alloc_string (guid) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_joystick_get_device_guid) (int id) {\n\n\t\treturn (vbyte*)Joystick::GetDeviceGUID (id);\n\n\t}\n\n\n\tvalue lime_joystick_get_device_name (int id) {\n\n\t\tconst char* name = Joystick::GetDeviceName (id);\n\t\treturn name ? alloc_string (name) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_joystick_get_device_name) (int id) {\n\n\t\treturn (vbyte*)Joystick::GetDeviceName (id);\n\n\t}\n\n\n\tint lime_joystick_get_num_axes (int id) {\n\n\t\treturn Joystick::GetNumAxes (id);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_joystick_get_num_axes) (int id) {\n\n\t\treturn Joystick::GetNumAxes (id);\n\n\t}\n\n\n\tint lime_joystick_get_num_buttons (int id) {\n\n\t\treturn Joystick::GetNumButtons (id);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_joystick_get_num_buttons) (int id) {\n\n\t\treturn Joystick::GetNumButtons (id);\n\n\t}\n\n\n\tint lime_joystick_get_num_hats (int id) {\n\n\t\treturn Joystick::GetNumHats (id);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_joystick_get_num_hats) (int id) {\n\n\t\treturn Joystick::GetNumHats (id);\n\n\t}\n\n\n\tvalue lime_jpeg_decode_bytes (value data, bool decodeData, value buffer) {\n\n\t\tImageBuffer imageBuffer (buffer);\n\n\t\tBytes bytes (data);\n\t\tResource resource = Resource (&bytes);\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, &imageBuffer, decodeData)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_jpeg_decode_bytes) (Bytes* data, bool decodeData, ImageBuffer* buffer) {\n\n\t\tResource resource = Resource (data);\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, buffer, decodeData)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_jpeg_decode_file (HxString path, bool decodeData, value buffer) {\n\n\t\tImageBuffer imageBuffer (buffer);\n\t\tResource resource = Resource (hxs_utf8 (path, nullptr));\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, &imageBuffer, decodeData)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_jpeg_decode_file) (hl_vstring* path, bool decodeData, ImageBuffer* buffer) {\n\n\t\tResource resource = Resource (path);\n\n\t\t#ifdef LIME_JPEG\n\t\tif (JPEG::Decode (&resource, buffer, decodeData)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tint lime_key_code_from_scan_code (int scanCode) {\n\n\t\treturn KeyCode::FromScanCode (scanCode);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_key_code_from_scan_code) (int scanCode) {\n\n\t\treturn KeyCode::FromScanCode (scanCode);\n\n\t}\n\n\n\tint lime_key_code_to_scan_code (int keyCode) {\n\n\t\treturn KeyCode::ToScanCode (keyCode);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_key_code_to_scan_code) (int keyCode) {\n\n\t\treturn KeyCode::ToScanCode (keyCode);\n\n\t}\n\n\n\tvoid lime_key_event_manager_register (value callback, value eventObject) {\n\n\t\tKeyEvent::callback = new ValuePointer (callback);\n\t\tKeyEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_key_event_manager_register) (vclosure* callback, KeyEvent* eventObject) {\n\n\t\tKeyEvent::callback = new ValuePointer (callback);\n\t\tKeyEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvalue lime_locale_get_system_locale () {\n\n\t\tstd::string* locale = Locale::GetSystemLocale ();\n\n\t\tif (!locale) {\n\n\t\t\treturn alloc_null ();\n\n\t\t} else {\n\n\t\t\tvalue result = alloc_string (locale->c_str ());\n\t\t\tdelete locale;\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_locale_get_system_locale) () {\n\n\t\tstd::string* locale = Locale::GetSystemLocale ();\n\n\t\tif (!locale) {\n\n\t\t\treturn 0;\n\n\t\t} else {\n\n\t\t\tint size = locale->size ();\n\t\t\tchar* _locale = (char*)malloc (size + 1);\n\t\t\tstrncpy (_locale, locale->c_str (), size);\n\t\t\t_locale[size] = '\\0';\n\t\t\tdelete locale;\n\n\t\t\treturn (vbyte*)_locale;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_lzma_compress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_LZMA\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tLZMA::Compress (&data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_lzma_compress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_LZMA\n\t\tLZMA::Compress (buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_lzma_decompress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_LZMA\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tLZMA::Decompress (&data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_lzma_decompress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_LZMA\n\t\tLZMA::Decompress (buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_mouse_event_manager_register (value callback, value eventObject) {\n\n\t\tMouseEvent::callback = new ValuePointer (callback);\n\t\tMouseEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_mouse_event_manager_register) (vclosure* callback, MouseEvent* eventObject) {\n\n\t\tMouseEvent::callback = new ValuePointer (callback);\n\t\tMouseEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvoid lime_neko_execute (HxString module) {\n\n\t\t#ifdef LIME_NEKO\n\t\tNekoVM::Execute (module.c_str ());\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_orientation_event_manager_register (value callback, value eventObject) {\n\n\t\tOrientationEvent::callback = new ValuePointer (callback);\n\t\tOrientationEvent::eventObject = new ValuePointer (eventObject);\n\t\tSystem::EnableDeviceOrientationChange(true);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_orientation_event_manager_register) (vclosure* callback, OrientationEvent* eventObject) {\n\n\t\tOrientationEvent::callback = new ValuePointer (callback);\n\t\tOrientationEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvalue lime_png_decode_bytes (value data, bool decodeData, value buffer) {\n\n\t\tImageBuffer imageBuffer (buffer);\n\t\tBytes bytes (data);\n\t\tResource resource = Resource (&bytes);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, &imageBuffer, decodeData)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_png_decode_bytes) (Bytes* data, bool decodeData, ImageBuffer* buffer) {\n\n\t\tResource resource = Resource (data);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, buffer, decodeData)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_png_decode_file (HxString path, bool decodeData, value buffer) {\n\n\t\tImageBuffer imageBuffer (buffer);\n\t\tResource resource = Resource (hxs_utf8 (path, nullptr));\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, &imageBuffer, decodeData)) {\n\n\t\t\treturn imageBuffer.Value (buffer);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_png_decode_file) (hl_vstring* path, bool decodeData, ImageBuffer* buffer) {\n\n\t\tResource resource = Resource (path);\n\n\t\t#ifdef LIME_PNG\n\t\tif (PNG::Decode (&resource, buffer, decodeData)) {\n\n\t\t\treturn buffer;\n\n\t\t}\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvoid lime_render_event_manager_register (value callback, value eventObject) {\n\n\t\tRenderEvent::callback = new ValuePointer (callback);\n\t\tRenderEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_render_event_manager_register) (vclosure* callback, RenderEvent* eventObject) {\n\n\t\tRenderEvent::callback = new ValuePointer (callback);\n\t\tRenderEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvoid lime_sensor_event_manager_register (value callback, value eventObject) {\n\n\t\tSensorEvent::callback = new ValuePointer (callback);\n\t\tSensorEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_sensor_event_manager_register) (vclosure* callback, SensorEvent* eventObject) {\n\n\t\tSensorEvent::callback = new ValuePointer (callback);\n\t\tSensorEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tbool lime_system_get_allow_screen_timeout () {\n\n\t\treturn System::GetAllowScreenTimeout ();\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_system_get_allow_screen_timeout) () {\n\n\t\treturn System::GetAllowScreenTimeout ();\n\n\t}\n\n\n\tvalue lime_system_get_device_model () {\n\n\t\tstd::wstring* model = System::GetDeviceModel ();\n\n\t\tif (model) {\n\n\t\t\tvalue result = alloc_wstring (model->c_str ());\n\t\t\tdelete model;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_system_get_device_model) () {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tstd::wstring* model = System::GetDeviceModel ();\n\n\t\tif (model) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*model);\n\t\t\tdelete model;\n\t\t\treturn result;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_system_get_device_vendor () {\n\n\t\tstd::wstring* vendor = System::GetDeviceVendor ();\n\n\t\tif (vendor) {\n\n\t\t\tvalue result = alloc_wstring (vendor->c_str ());\n\t\t\tdelete vendor;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_system_get_device_vendor) () {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tstd::wstring* vendor = System::GetDeviceVendor ();\n\n\t\tif (vendor) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*vendor);\n\t\t\tdelete vendor;\n\t\t\treturn result;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_system_get_directory (int type, HxString company, HxString title) {\n\n\t\tstd::wstring* path = System::GetDirectory ((SystemDirectory)type, hxs_utf8 (company, nullptr), hxs_utf8 (title, nullptr));\n\n\t\tif (path) {\n\n\t\t\tvalue result = alloc_wstring (path->c_str ());\n\t\t\tdelete path;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_system_get_directory) (int type, hl_vstring* company, hl_vstring* title) {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tstd::wstring* path = System::GetDirectory ((SystemDirectory)type, company ? (char*)hl_to_utf8 ((const uchar*)company->bytes) : NULL, title ? (char*)hl_to_utf8 ((const uchar*)title->bytes) : NULL);\n\n\t\tif (path) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*path);\n\t\t\tdelete path;\n\t\t\treturn result;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_system_get_display (int id) {\n\n\t\treturn (value)System::GetDisplay (true, id);\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_system_get_display) (int id) {\n\n\t\treturn (vdynamic*)System::GetDisplay (false, id);\n\n\t}\n\n\n\tbool lime_system_get_ios_tablet () {\n\n\t\t#ifdef IPHONE\n\t\treturn System::GetIOSTablet ();\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_system_get_ios_tablet) () {\n\n\t\t#ifdef IPHONE\n\t\treturn System::GetIOSTablet ();\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tint lime_system_get_num_displays () {\n\n\t\treturn System::GetNumDisplays ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_system_get_num_displays) () {\n\n\t\treturn System::GetNumDisplays ();\n\n\t}\n\n\n\tint lime_system_get_device_orientation () {\n\n\t\treturn System::GetDeviceOrientation();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_system_get_device_orientation) () {\n\n\t\treturn System::GetDeviceOrientation();\n\n\t}\n\n\n\tvalue lime_system_get_platform_label () {\n\n\t\tstd::wstring* label = System::GetPlatformLabel ();\n\n\t\tif (label) {\n\n\t\t\tvalue result = alloc_wstring (label->c_str ());\n\t\t\tdelete label;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_system_get_platform_label) () {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tstd::wstring* label = System::GetPlatformLabel ();\n\n\t\tif (label) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*label);\n\t\t\tdelete label;\n\t\t\treturn result;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_system_get_platform_name () {\n\n\t\tstd::wstring* name = System::GetPlatformName ();\n\n\t\tif (name) {\n\n\t\t\tvalue result = alloc_wstring (name->c_str ());\n\t\t\tdelete name;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_system_get_platform_name) () {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tstd::wstring* name = System::GetPlatformName ();\n\n\t\tif (name) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*name);\n\t\t\tdelete name;\n\t\t\treturn result;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvalue lime_system_get_platform_version () {\n\n\t\tstd::wstring* version = System::GetPlatformVersion ();\n\n\t\tif (version) {\n\n\t\t\tvalue result = alloc_wstring (version->c_str ());\n\t\t\tdelete version;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_system_get_platform_version) () {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tstd::wstring* version = System::GetPlatformVersion ();\n\n\t\tif (version) {\n\n\t\t\tvbyte* const result = hl_wstring_to_utf8_bytes (*version);\n\t\t\tdelete version;\n\t\t\treturn result;\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tdouble lime_system_get_timer () {\n\n\t\treturn System::GetTimer ();\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_system_get_timer) () {\n\n\t\treturn System::GetTimer ();\n\n\t}\n\n\n\tint lime_system_get_windows_console_mode (int handleType) {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn System::GetWindowsConsoleMode (handleType);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_system_get_windows_console_mode) (int handleType) {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn System::GetWindowsConsoleMode (handleType);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_system_open_file (HxString path) {\n\n\t\t#ifdef IPHONE\n\t\tSystem::OpenFile (path.c_str ());\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_system_open_file) (vbyte* path) {\n\n\t\t#ifdef IPHONE\n\t\tSystem::OpenFile ((char*)path);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_system_open_url (HxString url, HxString target) {\n\n\t\t#ifdef IPHONE\n\t\tSystem::OpenURL (url.c_str (), target.c_str ());\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_system_open_url) (vbyte* url, vbyte* target) {\n\n\t\t#ifdef IPHONE\n\t\tSystem::OpenURL ((char*)url, (char*)target);\n\t\t#endif\n\n\t}\n\n\n\tbool lime_system_set_allow_screen_timeout (bool allow) {\n\n\t\treturn System::SetAllowScreenTimeout (allow);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_system_set_allow_screen_timeout) (bool allow) {\n\n\t\treturn System::SetAllowScreenTimeout (allow);\n\n\t}\n\n\n\tbool lime_system_set_windows_console_mode (int handleType, int mode) {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn System::SetWindowsConsoleMode (handleType, mode);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_system_set_windows_console_mode) (int handleType, int mode) {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn System::SetWindowsConsoleMode (handleType, mode);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_text_event_manager_register (value callback, value eventObject) {\n\n\t\tTextEvent::callback = new ValuePointer (callback);\n\t\tTextEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_text_event_manager_register) (vclosure* callback, TextEvent* eventObject) {\n\n\t\tTextEvent::callback = new ValuePointer (callback);\n\t\tTextEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvoid lime_touch_event_manager_register (value callback, value eventObject) {\n\n\t\tTouchEvent::callback = new ValuePointer (callback);\n\t\tTouchEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_touch_event_manager_register) (vclosure* callback, TouchEvent* eventObject) {\n\n\t\tTouchEvent::callback = new ValuePointer (callback);\n\t\tTouchEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvoid lime_window_alert (value window, HxString message, HxString title) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->Alert (hxs_utf8 (message, nullptr), hxs_utf8 (title, nullptr));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_alert) (HL_CFFIPointer* window, hl_vstring* message, hl_vstring* title) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\tconst char *cmessage = message ? hl_to_utf8(message->bytes) : nullptr;\n\t\tconst char *ctitle = title ? hl_to_utf8(title->bytes) : nullptr;\n\t\ttargetWindow->Alert (cmessage, ctitle);\n\n\t}\n\n\n\tvoid lime_window_close (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->Close ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_close) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->Close ();\n\n\t}\n\n\n\tvoid lime_window_context_flip (value window) {\n\n\t\t((Window*)val_data (window))->ContextFlip ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_context_flip) (HL_CFFIPointer* window) {\n\n\t\t((Window*)window->ptr)->ContextFlip ();\n\n\t}\n\n\n\tvalue lime_window_context_lock (value window) {\n\n\t\treturn (value)((Window*)val_data (window))->ContextLock (true);\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_window_context_lock) (HL_CFFIPointer* window) {\n\n\t\treturn (vdynamic*)((Window*)window->ptr)->ContextLock (false);\n\n\t}\n\n\n\tvoid lime_window_context_make_current (value window) {\n\n\t\t((Window*)val_data (window))->ContextMakeCurrent ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_context_make_current) (HL_CFFIPointer* window) {\n\n\t\t((Window*)window->ptr)->ContextMakeCurrent ();\n\n\t}\n\n\n\tvoid lime_window_context_unlock (value window) {\n\n\t\t((Window*)val_data (window))->ContextUnlock ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_context_unlock) (HL_CFFIPointer* window) {\n\n\t\t((Window*)window->ptr)->ContextUnlock ();\n\n\t}\n\n\n\tvalue lime_window_create (value application, int width, int height, int flags, HxString title) {\n\n\t\tWindow* window = CreateWindow ((Application*)val_data (application), width, height, flags, hxs_utf8 (title, nullptr));\n\t\treturn CFFIPointer (window, gc_window);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_window_create) (HL_CFFIPointer* application, int width, int height, int flags, hl_vstring* title) {\n\n\t\tWindow* window = CreateWindow ((Application*)application->ptr, width, height, flags, (const char*)hl_to_utf8 ((const uchar*)title->bytes));\n\t\treturn HLCFFIPointer (window, (hl_finalizer)hl_gc_window);\n\n\t}\n\n\n\tvoid lime_window_event_manager_register (value callback, value eventObject) {\n\n\t\tWindowEvent::callback = new ValuePointer (callback);\n\t\tWindowEvent::eventObject = new ValuePointer (eventObject);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_event_manager_register) (vclosure* callback, WindowEvent* eventObject) {\n\n\t\tWindowEvent::callback = new ValuePointer (callback);\n\t\tWindowEvent::eventObject = new ValuePointer ((vobj*)eventObject);\n\n\t}\n\n\n\tvoid lime_window_focus (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->Focus ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_focus) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->Focus ();\n\n\t}\n\n\n\tdouble lime_window_get_context (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn (uintptr_t)targetWindow->GetContext ();\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_window_get_context) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn (uintptr_t)targetWindow->GetContext ();\n\n\t}\n\n\n\tvalue lime_window_get_context_type (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tconst char* type = targetWindow->GetContextType ();\n\t\treturn type ? alloc_string (type) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_window_get_context_type) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn (vbyte*)targetWindow->GetContextType ();\n\n\t}\n\n\n\tint lime_window_get_display (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetDisplay ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_window_get_display) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetDisplay ();\n\n\t}\n\n\n\tvalue lime_window_get_display_mode (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tDisplayMode displayMode;\n\t\ttargetWindow->GetDisplayMode (&displayMode);\n\t\treturn (value)displayMode.Value ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_get_display_mode) (HL_CFFIPointer* window, DisplayMode* result) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\tDisplayMode displayMode;\n\t\ttargetWindow->GetDisplayMode (&displayMode);\n\t\tresult->CopyFrom(&displayMode);\n\n\t}\n\n\n\tint lime_window_get_height (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetHeight ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_window_get_height) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetHeight ();\n\n\t}\n\n\n\tint32_t lime_window_get_id (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn (int32_t)targetWindow->GetID ();\n\n\t}\n\n\n\tHL_PRIM int32_t HL_NAME(hl_window_get_id) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn (int32_t)targetWindow->GetID ();\n\n\t}\n\n\n\tbool lime_window_get_mouse_lock (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetMouseLock ();\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_get_mouse_lock) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetMouseLock ();\n\n\t}\n\n\n\tdouble lime_window_get_opacity (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn (float)targetWindow->GetOpacity ();\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_window_get_opacity) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn (float)targetWindow->GetOpacity ();\n\n\t}\n\n\n\tdouble lime_window_get_scale (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetScale ();\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_window_get_scale) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetScale ();\n\n\t}\n\n\n\tbool lime_window_get_text_input_enabled (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetTextInputEnabled ();\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_get_text_input_enabled) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetTextInputEnabled ();\n\n\t}\n\n\n\tint lime_window_get_width (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetWidth ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_window_get_width) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetWidth ();\n\n\t}\n\n\n\tint lime_window_get_x (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetX ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_window_get_x) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetX ();\n\n\t}\n\n\n\tint lime_window_get_y (value window) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->GetY ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_window_get_y) (HL_CFFIPointer* window) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->GetY ();\n\n\t}\n\n\n\tvoid lime_window_move (value window, int x, int y) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->Move (x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_move) (HL_CFFIPointer* window, int x, int y) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->Move (x, y);\n\n\t}\n\n\n\tvalue lime_window_read_pixels (value window, value rect, value imageBuffer) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tImageBuffer buffer (imageBuffer);\n\n\t\tif (!val_is_null (rect)) {\n\n\t\t\tRectangle _rect = Rectangle (rect);\n\t\t\ttargetWindow->ReadPixels (&buffer, &_rect);\n\n\t\t} else {\n\n\t\t\ttargetWindow->ReadPixels (&buffer, NULL);\n\n\t\t}\n\n\t\treturn buffer.Value (imageBuffer);\n\n\t}\n\n\n\tHL_PRIM ImageBuffer* HL_NAME(hl_window_read_pixels) (HL_CFFIPointer* window, Rectangle* rect, ImageBuffer* imageBuffer) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\n\t\tif (rect) {\n\n\t\t\ttargetWindow->ReadPixels (imageBuffer, rect);\n\n\t\t} else {\n\n\t\t\ttargetWindow->ReadPixels (imageBuffer, NULL);\n\n\t\t}\n\n\t\treturn imageBuffer;\n\n\t}\n\n\n\tvoid lime_window_resize (value window, int width, int height) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->Resize (width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_resize) (HL_CFFIPointer* window, int width, int height) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->Resize (width, height);\n\n\t}\n\n\n\tvoid lime_window_set_minimum_size (value window, int width, int height) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->SetMinimumSize (width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_minimum_size) (HL_CFFIPointer* window, int width, int height) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetMinimumSize (width, height);\n\n\t}\n\n\n\tvoid lime_window_set_maximum_size (value window, int width, int height) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->SetMaximumSize (width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_maximum_size) (HL_CFFIPointer* window, int width, int height) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetMaximumSize (width, height);\n\n\t}\n\n\n\tbool lime_window_set_borderless (value window, bool borderless) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->SetBorderless (borderless);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_set_borderless) (HL_CFFIPointer* window, bool borderless) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->SetBorderless (borderless);\n\n\t}\n\n\n\tvoid lime_window_set_cursor (value window, int cursor) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->SetCursor ((Cursor)cursor);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_cursor) (HL_CFFIPointer* window, int cursor) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetCursor ((Cursor)cursor);\n\n\t}\n\n\n\tvalue lime_window_set_display_mode (value window, value displayMode) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tDisplayMode _displayMode (displayMode);\n\t\ttargetWindow->SetDisplayMode (&_displayMode);\n\t\ttargetWindow->GetDisplayMode (&_displayMode);\n\t\treturn (value)_displayMode.Value ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_display_mode) (HL_CFFIPointer* window, DisplayMode* displayMode, DisplayMode* result) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetDisplayMode (displayMode);\n\t\ttargetWindow->GetDisplayMode (displayMode);\n\t\tresult->CopyFrom(displayMode);\n\n\t}\n\n\n\tbool lime_window_set_fullscreen (value window, bool fullscreen) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->SetFullscreen (fullscreen);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_set_fullscreen) (HL_CFFIPointer* window, bool fullscreen) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->SetFullscreen (fullscreen);\n\n\t}\n\n\n\tvoid lime_window_set_icon (value window, value buffer) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tImageBuffer imageBuffer = ImageBuffer (buffer);\n\t\ttargetWindow->SetIcon (&imageBuffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_icon) (HL_CFFIPointer* window, ImageBuffer* buffer) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetIcon (buffer);\n\n\t}\n\n\n\tbool lime_window_set_maximized (value window, bool maximized) {\n\n\t\tWindow* targetWindow = (Window*)val_data(window);\n\t\treturn targetWindow->SetMaximized (maximized);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_set_maximized) (HL_CFFIPointer* window, bool maximized) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->SetMaximized (maximized);\n\n\t}\n\n\n\tbool lime_window_set_minimized (value window, bool minimized) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->SetMinimized (minimized);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_set_minimized) (HL_CFFIPointer* window, bool minimized) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->SetMinimized (minimized);\n\n\t}\n\n\n\tvoid lime_window_set_mouse_lock (value window, bool mouseLock) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->SetMouseLock (mouseLock);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_mouse_lock) (HL_CFFIPointer* window, bool mouseLock) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetMouseLock (mouseLock);\n\n\t}\n\n\n\tvoid lime_window_set_opacity (value window, double opacity) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->SetOpacity ((float)opacity);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_opacity) (HL_CFFIPointer* window, double opacity) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetOpacity ((float)opacity);\n\n\t}\n\n\n\tbool lime_window_set_resizable (value window, bool resizable) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->SetResizable (resizable);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_set_resizable) (HL_CFFIPointer* window, bool resizable) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->SetResizable (resizable);\n\n\t}\n\n\n\tvoid lime_window_set_text_input_enabled (value window, bool enabled) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->SetTextInputEnabled (enabled);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_text_input_enabled) (HL_CFFIPointer* window, bool enabled) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetTextInputEnabled (enabled);\n\n\t}\n\n\n\tvoid lime_window_set_text_input_rect (value window, value rect) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tRectangle _rect = Rectangle (rect);\n\t\ttargetWindow->SetTextInputRect (&_rect);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_set_text_input_rect) (HL_CFFIPointer* window, Rectangle* rect) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->SetTextInputRect (rect);\n\n\t}\n\n\n\tvalue lime_window_set_title (value window, HxString title) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\tconst char* titleUtf8 = hxs_utf8 (title, nullptr);\n\t\tconst char* result = targetWindow->SetTitle (titleUtf8);\n\n\t\tif (result) {\n\n\t\t\tvalue _result = alloc_string (result);\n\n\t\t\tif (result != titleUtf8) {\n\n\t\t\t\tfree ((char*) result);\n\n\t\t\t}\n\n\t\t\treturn _result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM hl_vstring* HL_NAME(hl_window_set_title) (HL_CFFIPointer* window, hl_vstring* title) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\tconst char* result = targetWindow->SetTitle ((char*)hl_to_utf8 ((const uchar*)title->bytes));\n\n\t\tif (result) {\n\n\t\t\treturn title;\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tbool lime_window_set_visible (value window, bool visible) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\treturn targetWindow->SetVisible (visible);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_window_set_visible) (HL_CFFIPointer* window, bool visible) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\treturn targetWindow->SetVisible (visible);\n\n\t}\n\n\n\tvoid lime_window_warp_mouse (value window, int x, int y) {\n\n\t\tWindow* targetWindow = (Window*)val_data (window);\n\t\ttargetWindow->WarpMouse (x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_window_warp_mouse) (HL_CFFIPointer* window, int x, int y) {\n\n\t\tWindow* targetWindow = (Window*)window->ptr;\n\t\ttargetWindow->WarpMouse (x, y);\n\n\t}\n\n\n\tvalue lime_zlib_compress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tZlib::Compress (ZLIB, &data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_zlib_compress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tZlib::Compress (ZLIB, buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_zlib_decompress (value buffer, value bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tBytes data (buffer);\n\t\tBytes result (bytes);\n\n\t\tZlib::Decompress (ZLIB, &data, &result);\n\n\t\treturn result.Value (bytes);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_zlib_decompress) (Bytes* buffer, Bytes* bytes) {\n\n\t\t#ifdef LIME_ZLIB\n\t\tZlib::Decompress (ZLIB, buffer, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tDEFINE_PRIME0 (lime_application_create);\n\tDEFINE_PRIME2v (lime_application_event_manager_register);\n\tDEFINE_PRIME1 (lime_application_exec);\n\tDEFINE_PRIME1v (lime_application_init);\n\tDEFINE_PRIME1 (lime_application_quit);\n\tDEFINE_PRIME2v (lime_application_set_frame_rate);\n\tDEFINE_PRIME1 (lime_application_update);\n\tDEFINE_PRIME2 (lime_audio_load);\n\tDEFINE_PRIME2 (lime_audio_load_bytes);\n\tDEFINE_PRIME2 (lime_audio_load_file);\n\tDEFINE_PRIME3 (lime_bytes_from_data_pointer);\n\tDEFINE_PRIME1 (lime_bytes_get_data_pointer);\n\tDEFINE_PRIME2 (lime_bytes_get_data_pointer_offset);\n\tDEFINE_PRIME2 (lime_bytes_read_file);\n\tDEFINE_PRIME1 (lime_cffi_get_native_pointer);\n\tDEFINE_PRIME1 (lime_cffi_set_finalizer);\n\tDEFINE_PRIME2v (lime_clipboard_event_manager_register);\n\tDEFINE_PRIME0 (lime_clipboard_get_text);\n\tDEFINE_PRIME1v (lime_clipboard_set_text);\n\tDEFINE_PRIME2 (lime_data_pointer_offset);\n\tDEFINE_PRIME2 (lime_deflate_compress);\n\tDEFINE_PRIME2 (lime_deflate_decompress);\n\tDEFINE_PRIME2v (lime_drop_event_manager_register);\n\tDEFINE_PRIME3 (lime_file_dialog_open_directory);\n\tDEFINE_PRIME3 (lime_file_dialog_open_file);\n\tDEFINE_PRIME3 (lime_file_dialog_open_files);\n\tDEFINE_PRIME3 (lime_file_dialog_save_file);\n\tDEFINE_PRIME1 (lime_file_watcher_create);\n\tDEFINE_PRIME3 (lime_file_watcher_add_directory);\n\tDEFINE_PRIME2v (lime_file_watcher_remove_directory);\n\tDEFINE_PRIME1v (lime_file_watcher_update);\n\tDEFINE_PRIME1 (lime_font_get_ascender);\n\tDEFINE_PRIME1 (lime_font_get_descender);\n\tDEFINE_PRIME1 (lime_font_get_family_name);\n\tDEFINE_PRIME2 (lime_font_get_glyph_index);\n\tDEFINE_PRIME2 (lime_font_get_glyph_indices);\n\tDEFINE_PRIME2 (lime_font_get_glyph_metrics);\n\tDEFINE_PRIME1 (lime_font_get_height);\n\tDEFINE_PRIME1 (lime_font_get_num_glyphs);\n\tDEFINE_PRIME1 (lime_font_get_underline_position);\n\tDEFINE_PRIME1 (lime_font_get_underline_thickness);\n\tDEFINE_PRIME1 (lime_font_get_strikethrough_position);\n\tDEFINE_PRIME1 (lime_font_get_strikethrough_thickness);\n\tDEFINE_PRIME1 (lime_font_get_units_per_em);\n\tDEFINE_PRIME1 (lime_font_load);\n\tDEFINE_PRIME1 (lime_font_load_bytes);\n\tDEFINE_PRIME1 (lime_font_load_file);\n\tDEFINE_PRIME2 (lime_font_outline_decompose);\n\tDEFINE_PRIME3 (lime_font_render_glyph);\n\tDEFINE_PRIME3 (lime_font_render_glyphs);\n\tDEFINE_PRIME3v (lime_font_set_size);\n\tDEFINE_PRIME1v (lime_gamepad_add_mappings);\n\tDEFINE_PRIME2v (lime_gamepad_event_manager_register);\n\tDEFINE_PRIME1 (lime_gamepad_get_device_guid);\n\tDEFINE_PRIME1 (lime_gamepad_get_device_name);\n\tDEFINE_PRIME4v (lime_gamepad_rumble);\n\tDEFINE_PRIME2 (lime_gzip_compress);\n\tDEFINE_PRIME2 (lime_gzip_decompress);\n\tDEFINE_PRIME2v (lime_haptic_vibrate);\n\tDEFINE_PRIME3v (lime_image_data_util_color_transform);\n\tDEFINE_PRIME6v (lime_image_data_util_copy_channel);\n\tDEFINE_PRIME7v (lime_image_data_util_copy_pixels);\n\tDEFINE_PRIME4v (lime_image_data_util_fill_rect);\n\tDEFINE_PRIME5v (lime_image_data_util_flood_fill);\n\tDEFINE_PRIME4v (lime_image_data_util_get_pixels);\n\tDEFINE_PRIME8v (lime_image_data_util_merge);\n\tDEFINE_PRIME1v (lime_image_data_util_multiply_alpha);\n\tDEFINE_PRIME4v (lime_image_data_util_resize);\n\tDEFINE_PRIME2v (lime_image_data_util_set_format);\n\tDEFINE_PRIME6v (lime_image_data_util_set_pixels);\n\tDEFINE_PRIME12 (lime_image_data_util_threshold);\n\tDEFINE_PRIME1v (lime_image_data_util_unmultiply_alpha);\n\tDEFINE_PRIME4 (lime_image_encode);\n\tDEFINE_PRIME2 (lime_image_load);\n\tDEFINE_PRIME2 (lime_image_load_bytes);\n\tDEFINE_PRIME2 (lime_image_load_file);\n\tDEFINE_PRIME0 (lime_jni_getenv);\n\tDEFINE_PRIME2v (lime_joystick_event_manager_register);\n\tDEFINE_PRIME1 (lime_joystick_get_device_guid);\n\tDEFINE_PRIME1 (lime_joystick_get_device_name);\n\tDEFINE_PRIME1 (lime_joystick_get_num_axes);\n\tDEFINE_PRIME1 (lime_joystick_get_num_buttons);\n\tDEFINE_PRIME1 (lime_joystick_get_num_hats);\n\tDEFINE_PRIME3 (lime_jpeg_decode_bytes);\n\tDEFINE_PRIME3 (lime_jpeg_decode_file);\n\tDEFINE_PRIME1 (lime_key_code_from_scan_code);\n\tDEFINE_PRIME1 (lime_key_code_to_scan_code);\n\tDEFINE_PRIME2v (lime_key_event_manager_register);\n\tDEFINE_PRIME0 (lime_locale_get_system_locale);\n\tDEFINE_PRIME2 (lime_lzma_compress);\n\tDEFINE_PRIME2 (lime_lzma_decompress);\n\tDEFINE_PRIME2v (lime_mouse_event_manager_register);\n\tDEFINE_PRIME1v (lime_neko_execute);\n\tDEFINE_PRIME2v (lime_orientation_event_manager_register);\n\tDEFINE_PRIME3 (lime_png_decode_bytes);\n\tDEFINE_PRIME3 (lime_png_decode_file);\n\tDEFINE_PRIME2v (lime_render_event_manager_register);\n\tDEFINE_PRIME2v (lime_sensor_event_manager_register);\n\tDEFINE_PRIME0 (lime_system_get_allow_screen_timeout);\n\tDEFINE_PRIME0 (lime_system_get_device_model);\n\tDEFINE_PRIME0 (lime_system_get_device_vendor);\n\tDEFINE_PRIME3 (lime_system_get_directory);\n\tDEFINE_PRIME1 (lime_system_get_display);\n\tDEFINE_PRIME0 (lime_system_get_ios_tablet);\n\tDEFINE_PRIME0 (lime_system_get_num_displays);\n\tDEFINE_PRIME0 (lime_system_get_device_orientation);\n\tDEFINE_PRIME0 (lime_system_get_platform_label);\n\tDEFINE_PRIME0 (lime_system_get_platform_name);\n\tDEFINE_PRIME0 (lime_system_get_platform_version);\n\tDEFINE_PRIME0 (lime_system_get_timer);\n\tDEFINE_PRIME1 (lime_system_get_windows_console_mode);\n\tDEFINE_PRIME1v (lime_system_open_file);\n\tDEFINE_PRIME2v (lime_system_open_url);\n\tDEFINE_PRIME1 (lime_system_set_allow_screen_timeout);\n\tDEFINE_PRIME2 (lime_system_set_windows_console_mode);\n\tDEFINE_PRIME2v (lime_text_event_manager_register);\n\tDEFINE_PRIME2v (lime_touch_event_manager_register);\n\tDEFINE_PRIME3v (lime_window_alert);\n\tDEFINE_PRIME1v (lime_window_close);\n\tDEFINE_PRIME1v (lime_window_context_flip);\n\tDEFINE_PRIME1 (lime_window_context_lock);\n\tDEFINE_PRIME1v (lime_window_context_make_current);\n\tDEFINE_PRIME1v (lime_window_context_unlock);\n\tDEFINE_PRIME5 (lime_window_create);\n\tDEFINE_PRIME2v (lime_window_event_manager_register);\n\tDEFINE_PRIME1v (lime_window_focus);\n\tDEFINE_PRIME1 (lime_window_get_context);\n\tDEFINE_PRIME1 (lime_window_get_context_type);\n\tDEFINE_PRIME1 (lime_window_get_display);\n\tDEFINE_PRIME1 (lime_window_get_display_mode);\n\tDEFINE_PRIME1 (lime_window_get_height);\n\tDEFINE_PRIME1 (lime_window_get_id);\n\tDEFINE_PRIME1 (lime_window_get_mouse_lock);\n\tDEFINE_PRIME1 (lime_window_get_scale);\n\tDEFINE_PRIME1 (lime_window_get_text_input_enabled);\n\tDEFINE_PRIME1 (lime_window_get_width);\n\tDEFINE_PRIME1 (lime_window_get_x);\n\tDEFINE_PRIME1 (lime_window_get_y);\n\tDEFINE_PRIME3v (lime_window_move);\n\tDEFINE_PRIME3 (lime_window_read_pixels);\n\tDEFINE_PRIME3v (lime_window_resize);\n\tDEFINE_PRIME3v (lime_window_set_minimum_size);\n\tDEFINE_PRIME3v (lime_window_set_maximum_size);\n\tDEFINE_PRIME2 (lime_window_set_borderless);\n\tDEFINE_PRIME2v (lime_window_set_cursor);\n\tDEFINE_PRIME2 (lime_window_set_display_mode);\n\tDEFINE_PRIME2 (lime_window_set_fullscreen);\n\tDEFINE_PRIME2v (lime_window_set_icon);\n\tDEFINE_PRIME2 (lime_window_set_maximized);\n\tDEFINE_PRIME2 (lime_window_set_minimized);\n\tDEFINE_PRIME2v (lime_window_set_mouse_lock);\n\tDEFINE_PRIME2 (lime_window_set_resizable);\n\tDEFINE_PRIME2v (lime_window_set_text_input_enabled);\n\tDEFINE_PRIME2v (lime_window_set_text_input_rect);\n\tDEFINE_PRIME2 (lime_window_set_title);\n\tDEFINE_PRIME2 (lime_window_set_visible);\n\tDEFINE_PRIME3v (lime_window_warp_mouse);\n\tDEFINE_PRIME1 (lime_window_get_opacity);\n\tDEFINE_PRIME2v (lime_window_set_opacity);\n\tDEFINE_PRIME2 (lime_zlib_compress);\n\tDEFINE_PRIME2 (lime_zlib_decompress);\n\n\n\t#define _ENUM \"?\"\n\t// #define _TCFFIPOINTER _ABSTRACT (HL_CFFIPointer)\n\t#define _TAPPLICATION_EVENT _OBJ (_I32 _I32)\n\t#define _TBYTES _OBJ (_I32 _BYTES)\n\t#define _TCFFIPOINTER _DYN\n\t#define _TCLIPBOARD_EVENT _OBJ (_I32)\n\t#define _TDISPLAYMODE _OBJ (_I32 _I32 _I32 _I32)\n\t#define _TDROP_EVENT _OBJ (_BYTES _I32)\n\t#define _TGAMEPAD_EVENT _OBJ (_I32 _I32 _I32 _I32 _F64)\n\t#define _TJOYSTICK_EVENT _OBJ (_I32 _I32 _I32 _I32 _F64 _F64)\n\t#define _TKEY_EVENT _OBJ (_F64 _I32 _I32 _I32)\n\t#define _TMOUSE_EVENT _OBJ (_I32 _F64 _F64 _I32 _I32 _F64 _F64 _I32)\n\t#define _TORIENTATION_EVENT _OBJ (_I32 _I32 _I32)\n\t#define _TRECTANGLE _OBJ (_F64 _F64 _F64 _F64)\n\t#define _TRENDER_EVENT _OBJ (_I32)\n\t#define _TSENSOR_EVENT _OBJ (_I32 _F64 _F64 _F64 _I32)\n\t#define _TTEXT_EVENT _OBJ (_I32 _I32 _I32 _BYTES _I32 _I32)\n\t#define _TTOUCH_EVENT _OBJ (_I32 _F64 _F64 _I32 _F64 _I32 _F64 _F64)\n\t#define _TVECTOR2 _OBJ (_F64 _F64)\n\t#define _TVORBISFILE _OBJ (_I32 _DYN)\n\t#define _TWINDOW_EVENT _OBJ (_I32 _I32 _I32 _I32 _I32 _I32)\n\n\t#define _TARRAYBUFFER _TBYTES\n\t#define _TARRAYBUFFERVIEW _OBJ (_I32 _TARRAYBUFFER _I32 _I32 _I32 _I32)\n\t#define _TAUDIOBUFFER _OBJ (_I32 _I32 _TARRAYBUFFERVIEW _I32 _DYN _DYN _DYN _DYN _DYN _TVORBISFILE)\n\t#define _TIMAGEBUFFER _OBJ (_I32 _TARRAYBUFFERVIEW _I32 _I32 _BOOL _BOOL _I32 _DYN _DYN _DYN _DYN _DYN _DYN)\n\t#define _TIMAGE _OBJ (_TIMAGEBUFFER _BOOL _I32 _I32 _I32 _TRECTANGLE _ENUM _I32 _I32 _F64 _F64)\n\n\t#define _TARRAY _OBJ (_BYTES _I32)\n\t#define _TARRAY2 _OBJ (_ARR)\n\n\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_application_create, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_application_event_manager_register, _FUN(_VOID, _NO_ARG) _TAPPLICATION_EVENT);\n\tDEFINE_HL_PRIM (_I32, hl_application_exec, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_application_init, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_application_quit, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_application_set_frame_rate, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_BOOL, hl_application_update, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TAUDIOBUFFER, hl_audio_load_bytes, _TBYTES _TAUDIOBUFFER);\n\tDEFINE_HL_PRIM (_TAUDIOBUFFER, hl_audio_load_file, _STRING _TAUDIOBUFFER);\n\tDEFINE_HL_PRIM (_TBYTES, hl_bytes_from_data_pointer, _F64 _I32 _TBYTES);\n\tDEFINE_HL_PRIM (_F64, hl_bytes_get_data_pointer, _TBYTES);\n\tDEFINE_HL_PRIM (_F64, hl_bytes_get_data_pointer_offset, _TBYTES _I32);\n\tDEFINE_HL_PRIM (_TBYTES, hl_bytes_read_file, _STRING _TBYTES);\n\tDEFINE_HL_PRIM (_F64, hl_cffi_get_native_pointer, _TCFFIPOINTER);\n\t// DEFINE_PRIME1 (lime_cffi_set_finalizer);\n\tDEFINE_HL_PRIM (_VOID, hl_clipboard_event_manager_register, _FUN(_VOID, _NO_ARG) _TCLIPBOARD_EVENT);\n\tDEFINE_HL_PRIM (_BYTES, hl_clipboard_get_text, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_clipboard_set_text, _STRING);\n\tDEFINE_HL_PRIM (_F64, hl_data_pointer_offset, _F64 _I32);\n\tDEFINE_HL_PRIM (_TBYTES, hl_deflate_compress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_TBYTES, hl_deflate_decompress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_VOID, hl_drop_event_manager_register, _FUN(_VOID, _NO_ARG) _TDROP_EVENT);\n\tDEFINE_HL_PRIM (_BYTES, hl_file_dialog_open_directory, _STRING _STRING _STRING);\n\tDEFINE_HL_PRIM (_BYTES, hl_file_dialog_open_file, _STRING _STRING _STRING);\n\tDEFINE_HL_PRIM (_ARR, hl_file_dialog_open_files, _STRING _STRING _STRING);\n\tDEFINE_HL_PRIM (_BYTES, hl_file_dialog_save_file, _STRING _STRING _STRING);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_file_watcher_create, _DYN);\n\tDEFINE_HL_PRIM (_I32, hl_file_watcher_add_directory, _TCFFIPOINTER _STRING _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_file_watcher_remove_directory, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_file_watcher_update, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_ascender, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_descender, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BYTES, hl_font_get_family_name, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_glyph_index, _TCFFIPOINTER _STRING);\n\tDEFINE_HL_PRIM (_ARR, hl_font_get_glyph_indices, _TCFFIPOINTER _STRING);\n\tDEFINE_HL_PRIM (_DYN, hl_font_get_glyph_metrics, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_height, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_num_glyphs, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_underline_position, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_underline_thickness, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_strikethrough_position, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_strikethrough_thickness, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_font_get_units_per_em, _TCFFIPOINTER);\n\t// DEFINE_PRIME1 (lime_font_load);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_font_load_bytes, _TBYTES);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_font_load_file, _STRING);\n\tDEFINE_HL_PRIM (_DYN, hl_font_outline_decompose, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_TBYTES, hl_font_render_glyph, _TCFFIPOINTER _I32 _TBYTES);\n\tDEFINE_HL_PRIM (_TBYTES, hl_font_render_glyphs, _TCFFIPOINTER _ARR _TBYTES);\n\tDEFINE_HL_PRIM (_VOID, hl_font_set_size, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gamepad_add_mappings, _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_gamepad_event_manager_register, _FUN(_VOID, _NO_ARG) _TGAMEPAD_EVENT);\n\tDEFINE_HL_PRIM (_BYTES, hl_gamepad_get_device_guid, _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_gamepad_get_device_name, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gamepad_rumble, _I32 _F64 _F64 _I32);\n\tDEFINE_HL_PRIM (_TBYTES, hl_gzip_compress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_TBYTES, hl_gzip_decompress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_VOID, hl_haptic_vibrate, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_color_transform, _TIMAGE _TRECTANGLE _TARRAYBUFFERVIEW);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_copy_channel, _TIMAGE _TIMAGE _TRECTANGLE _TVECTOR2 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_copy_pixels, _TIMAGE _TIMAGE _TRECTANGLE _TVECTOR2 _TIMAGE _TVECTOR2 _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_fill_rect, _TIMAGE _TRECTANGLE _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_flood_fill, _TIMAGE _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_get_pixels, _TIMAGE _TRECTANGLE _I32 _TBYTES);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_merge, _TIMAGE _TIMAGE _TRECTANGLE _TVECTOR2 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_multiply_alpha, _TIMAGE);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_resize, _TIMAGE _TIMAGEBUFFER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_set_format, _TIMAGE _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_set_pixels, _TIMAGE _TRECTANGLE _TBYTES _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_image_data_util_threshold, _TIMAGE _TIMAGE _TRECTANGLE _TVECTOR2 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_image_data_util_unmultiply_alpha, _TIMAGE);\n\tDEFINE_HL_PRIM (_TBYTES, hl_image_encode, _TIMAGEBUFFER _I32 _I32 _TBYTES);\n\t// DEFINE_PRIME2 (lime_image_load);\n\tDEFINE_HL_PRIM (_TIMAGEBUFFER, hl_image_load_bytes, _TBYTES _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_TIMAGEBUFFER, hl_image_load_file, _STRING _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_F64, hl_jni_getenv, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_joystick_event_manager_register, _FUN(_VOID, _NO_ARG) _TJOYSTICK_EVENT);\n\tDEFINE_HL_PRIM (_BYTES, hl_joystick_get_device_guid, _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_joystick_get_device_name, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_joystick_get_num_axes, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_joystick_get_num_buttons, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_joystick_get_num_hats, _I32);\n\tDEFINE_HL_PRIM (_TIMAGEBUFFER, hl_jpeg_decode_bytes, _TBYTES _BOOL _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_TIMAGEBUFFER, hl_jpeg_decode_file, _STRING _BOOL _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_I32, hl_key_code_from_scan_code, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_key_code_to_scan_code, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_key_event_manager_register, _FUN (_VOID, _NO_ARG) _TKEY_EVENT);\n\tDEFINE_HL_PRIM (_BYTES, hl_locale_get_system_locale, _NO_ARG);\n\tDEFINE_HL_PRIM (_TBYTES, hl_lzma_compress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_TBYTES, hl_lzma_decompress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_VOID, hl_mouse_event_manager_register, _FUN (_VOID, _NO_ARG) _TMOUSE_EVENT);\n\t// DEFINE_PRIME1v (lime_neko_execute);\n\tDEFINE_HL_PRIM (_VOID, hl_orientation_event_manager_register, _FUN (_VOID, _NO_ARG) _TORIENTATION_EVENT);\n\tDEFINE_HL_PRIM (_TIMAGEBUFFER, hl_png_decode_bytes, _TBYTES _BOOL _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_TIMAGEBUFFER, hl_png_decode_file, _STRING _BOOL _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_VOID, hl_render_event_manager_register, _FUN (_VOID, _NO_ARG) _TRENDER_EVENT);\n\tDEFINE_HL_PRIM (_VOID, hl_sensor_event_manager_register, _FUN (_VOID, _NO_ARG) _TSENSOR_EVENT);\n\tDEFINE_HL_PRIM (_BOOL, hl_system_get_allow_screen_timeout, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_system_get_device_model, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_system_get_device_vendor, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_system_get_directory, _I32 _STRING _STRING);\n\tDEFINE_HL_PRIM (_DYN, hl_system_get_display, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_system_get_ios_tablet, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_system_get_num_displays, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_system_get_device_orientation, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_system_get_platform_label, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_system_get_platform_name, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_system_get_platform_version, _NO_ARG);\n\tDEFINE_HL_PRIM (_F64, hl_system_get_timer, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_system_get_windows_console_mode, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_system_open_file, _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_system_open_url, _STRING _STRING);\n\tDEFINE_HL_PRIM (_BOOL, hl_system_set_allow_screen_timeout, _BOOL);\n\tDEFINE_HL_PRIM (_BOOL, hl_system_set_windows_console_mode, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_text_event_manager_register, _FUN (_VOID, _NO_ARG) _TTEXT_EVENT);\n\tDEFINE_HL_PRIM (_VOID, hl_touch_event_manager_register, _FUN (_VOID, _NO_ARG) _TTOUCH_EVENT);\n\tDEFINE_HL_PRIM (_VOID, hl_window_alert, _TCFFIPOINTER _STRING _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_window_close, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_context_flip, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_DYN, hl_window_context_lock, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_context_make_current, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_context_unlock, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_window_create, _TCFFIPOINTER _I32 _I32 _I32 _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_window_event_manager_register, _FUN (_VOID, _NO_ARG) _TWINDOW_EVENT);\n\tDEFINE_HL_PRIM (_VOID, hl_window_focus, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_F64, hl_window_get_context, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BYTES, hl_window_get_context_type, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_window_get_display, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_get_display_mode, _TCFFIPOINTER _TDISPLAYMODE);\n\tDEFINE_HL_PRIM (_I32, hl_window_get_height, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_window_get_id, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_get_mouse_lock, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_F64, hl_window_get_scale, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_get_text_input_enabled, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_window_get_width, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_window_get_x, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_window_get_y, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_move, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_DYN, hl_window_read_pixels, _TCFFIPOINTER _TRECTANGLE _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_resize, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_minimum_size, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_maximum_size, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_set_borderless, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_cursor, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_display_mode, _TCFFIPOINTER _TDISPLAYMODE _TDISPLAYMODE);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_set_fullscreen, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_icon, _TCFFIPOINTER _TIMAGEBUFFER);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_set_maximized, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_set_minimized, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_mouse_lock, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_set_resizable, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_text_input_enabled, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_text_input_rect, _TCFFIPOINTER _TRECTANGLE);\n\tDEFINE_HL_PRIM (_STRING, hl_window_set_title, _TCFFIPOINTER _STRING);\n\tDEFINE_HL_PRIM (_BOOL, hl_window_set_visible, _TCFFIPOINTER _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_window_warp_mouse, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_F64, hl_window_get_opacity, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_window_set_opacity, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_TBYTES, hl_zlib_compress, _TBYTES _TBYTES);\n\tDEFINE_HL_PRIM (_TBYTES, hl_zlib_decompress, _TBYTES _TBYTES);\n\n\n}\n\n\n#ifdef LIME_CAIRO\nextern \"C\" int lime_cairo_register_prims ();\n#else\nextern \"C\" int lime_cairo_register_prims () { return 0; }\n#endif\n\n#ifdef LIME_CURL\nextern \"C\" int lime_curl_register_prims ();\n#else\nextern \"C\" int lime_curl_register_prims () { return 0; }\n#endif\n\n#ifdef LIME_HARFBUZZ\nextern \"C\" int lime_harfbuzz_register_prims ();\n#else\nextern \"C\" int lime_harfbuzz_register_prims () { return 0; }\n#endif\n\n#ifdef LIME_OPENAL\nextern \"C\" int lime_openal_register_prims ();\n#else\nextern \"C\" int lime_openal_register_prims () { return 0; }\n#endif\n\n#ifdef LIME_OPENGL\nextern \"C\" int lime_opengl_register_prims ();\n#else\nextern \"C\" int lime_opengl_register_prims () { return 0; }\n#endif\n\n#ifdef LIME_VORBIS\nextern \"C\" int lime_vorbis_register_prims ();\n#else\nextern \"C\" int lime_vorbis_register_prims () { return 0; }\n#endif\n\n\nextern \"C\" int lime_register_prims () {\n\n\tlime_cairo_register_prims ();\n\tlime_curl_register_prims ();\n\tlime_harfbuzz_register_prims ();\n\tlime_openal_register_prims ();\n\tlime_opengl_register_prims ();\n\tlime_vorbis_register_prims ();\n\n\treturn 0;\n\n}\n"
  },
  {
    "path": "project/src/app/ApplicationEvent.cpp",
    "content": "#include <app/ApplicationEvent.h>\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* ApplicationEvent::callback = 0;\n\tValuePointer* ApplicationEvent::eventObject = 0;\n\n\tstatic int id_deltaTime;\n\tstatic int id_type;\n\tstatic bool init = false;\n\n\n\tApplicationEvent::ApplicationEvent () {\n\n\t\tdeltaTime = 0;\n\t\ttype = UPDATE;\n\n\t}\n\n\n\tvoid ApplicationEvent::Dispatch (ApplicationEvent* event) {\n\n\t\tif (ApplicationEvent::callback) {\n\n\t\t\tif (ApplicationEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_deltaTime = val_id (\"deltaTime\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)ApplicationEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_deltaTime, alloc_int (event->deltaTime));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\n\t\t\t} else {\n\n\t\t\t\tApplicationEvent* eventObject = (ApplicationEvent*)ApplicationEvent::eventObject->Get ();\n\n\t\t\t\teventObject->deltaTime = event->deltaTime;\n\t\t\t\teventObject->type = event->type;\n\n\t\t\t}\n\n\t\t\tApplicationEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/backend/sdl/SDLApplication.cpp",
    "content": "#include \"SDLApplication.h\"\n#include \"SDLGamepad.h\"\n#include \"SDLJoystick.h\"\n#include <system/System.h>\n\n#ifdef HX_MACOS\n#include <CoreFoundation/CoreFoundation.h>\n#endif\n\n#ifdef EMSCRIPTEN\n#include \"emscripten.h\"\n#endif\n\n\nnamespace lime {\n\n\n\tAutoGCRoot* Application::callback = 0;\n\tSDLApplication* SDLApplication::currentApplication = 0;\n\n\tconst int analogAxisDeadZone = 1000;\n\tstd::map<int, std::map<int, int> > gamepadsAxisMap;\n\tbool inBackground = false;\n\n\tstatic double nextFrac = 0.0;\n\tstatic double s_minSleepCostMs = 2.0;  // initial estimate\n    static bool   s_minSleepCalibrated = false;\n\n\tstatic inline bool CanUseDelay1(Uint32 remainingMs)\n\t{\n\t\treturn remainingMs > (Uint32)(s_minSleepCostMs + 1.0);\n\t}\n\n\tstatic inline void CalibrateMinSleep()\n\t{\n\t\tUint32 t0 = SDL_GetTicks();\n\t\tSDL_Delay(1);\n\t\tUint32 t1 = SDL_GetTicks();\n\n\t\tUint32 observed = t1 - t0;\n\t\tif (observed < 1) observed = 1;\n\n\t\tdouble observedD = (double)observed;\n\n\t\ts_minSleepCostMs = (s_minSleepCostMs + observedD) * 0.5;\n\t\ts_minSleepCalibrated = true;\n\t}\n\n\tstatic inline Uint32 SleepMinStep()\n\t{\n\t\tif (!s_minSleepCalibrated)\n\t\t\tCalibrateMinSleep();\n\t\telse\n\t\t\tCalibrateMinSleep();\n\n\t\treturn (Uint32)s_minSleepCostMs;\n\t}\n\n\tstatic inline Uint32 NextFrameStep(double framePeriod) {\n\t\tUint32 base = (Uint32)framePeriod;\n\t\tnextFrac += framePeriod - (double)base;\n\t\tif (nextFrac >= 1.0) { base++; nextFrac -= 1.0; }\n\t\treturn base;\n\t}\n\n\tstatic inline Sint32 GetFrameTimeRemaining(Uint32 nextUpdate)\n\t{\n\t\tUint32 now = SDL_GetTicks();\n\t\tSint32 remaining = (Sint32)(nextUpdate - now);\n\t\treturn remaining > 0 ? remaining : 0;\n\t}\n\n\t static double s_delay1CostMs = 2.0;\n    static bool s_delay1Calibrated = false;\n\n    static inline void CalibrateDelay1()\n    {\n        Uint32 t0 = SDL_GetTicks();\n        SDL_Delay(1);\n        Uint32 t1 = SDL_GetTicks();\n\n        double observed = (double)(t1 - t0);\n        if (observed < 1.0) observed = 1.0;\n\n        s_delay1CostMs = (s_delay1CostMs + observed) * 0.5;\n        s_delay1Calibrated = true;\n    }\n\n    static inline Uint32 SleepShortest(Uint32 timeRemainingMs)\n    {\n        if (!s_delay1Calibrated) {\n            CalibrateDelay1();\n            return 0;\n        }\n\n\n        // The \"+1\" is a small guard because observed delay is quantized and jittery\n        if (timeRemainingMs > (Uint32)(s_delay1CostMs + 1.0)) {\n            Uint32 t0 = SDL_GetTicks();\n            SDL_Delay(1);\n            Uint32 t1 = SDL_GetTicks();\n\n            double observed = (double)(t1 - t0);\n            if (observed < 1.0) observed = 1.0;\n\n            s_delay1CostMs = (s_delay1CostMs + observed) * 0.5;\n            return (Uint32)observed;\n        }\n\n        // Otherwise, we're too close: yield instead of risking a multi-ms overshoot\n        // Yield cost is scheduler-dependent so we don't try to model it here!\n        SDL_Delay(0);\n        return 0;\n    }\n\n\tSDLApplication::SDLApplication () {\n\n\t\tinitFlags = SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_TIMER | SDL_INIT_JOYSTICK;\n\t\t#if defined(LIME_MOJOAL) || defined(LIME_OPENALSOFT)\n\t\tinitFlags |= SDL_INIT_AUDIO;\n\t\t#endif\n\n\t\tif (SDL_Init (initFlags) != 0) {\n\n\t\t\tprintf (\"Could not initialize SDL: %s.\\n\", SDL_GetError ());\n\n\t\t}\n\n\t\tSDL_LogSetPriority (SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN);\n\n\t\tcurrentApplication = this;\n\n\t\tframePeriod = 1000.0 / 60.0;\n\t\tcurrentUpdate = 0;\n\n\t\tlastUpdate = 0;\n\t\tnextUpdate = 0;\n\n\t\tApplicationEvent applicationEvent;\n\t\tClipboardEvent clipboardEvent;\n\t\tDropEvent dropEvent;\n\t\tGamepadEvent gamepadEvent;\n\t\tJoystickEvent joystickEvent;\n\t\tKeyEvent keyEvent;\n\t\tMouseEvent mouseEvent;\n\t\tOrientationEvent orientationEvent;\n\t\tRenderEvent renderEvent;\n\t\tSensorEvent sensorEvent;\n\t\tTextEvent textEvent;\n\t\tTouchEvent touchEvent;\n\t\tWindowEvent windowEvent;\n\n\t\tSDL_EventState (SDL_DROPFILE, SDL_ENABLE);\n\t\tSDLJoystick::Init ();\n\n\t\t#ifdef HX_MACOS\n\t\tCFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL (CFBundleGetMainBundle ());\n\t\tchar path[PATH_MAX];\n\n\t\tif (CFURLGetFileSystemRepresentation (resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) {\n\n\t\t\tchdir (path);\n\n\t\t}\n\n\t\tCFRelease (resourcesURL);\n\t\t#endif\n\n\t}\n\n\n\tSDLApplication::~SDLApplication () {\n\n\n\n\t}\n\n\n\tint SDLApplication::Exec () {\n\n\t\tInit ();\n\n\t\t#ifdef EMSCRIPTEN\n\t\temscripten_cancel_main_loop ();\n\t\temscripten_set_main_loop (UpdateFrame, 0, 0);\n\t\temscripten_set_main_loop_timing (EM_TIMING_RAF, 1);\n\t\t#endif\n\n\t\t#if defined(IPHONE) || defined(EMSCRIPTEN)\n\n\t\treturn 0;\n\n\t\t#else\n\n\t\twhile (active) {\n\n\t\t\tUpdate ();\n\n\t\t}\n\n\t\treturn Quit ();\n\n\t\t#endif\n\n\t}\n\n\n\tvoid SDLApplication::HandleEvent (SDL_Event* event) {\n\n\t\t#if defined(IPHONE) || defined(EMSCRIPTEN)\n\n\t\tint top = 0;\n\t\tgc_set_top_of_stack(&top,false);\n\n\t\t#endif\n\n\t\tswitch (event->type) {\n\n\t\t\tcase SDL_USEREVENT:\n\n\t\t\t\tif (!inBackground) {\n\n\t\t\t\t\tcurrentUpdate = SDL_GetTicks ();\n\t\t\t\t\tapplicationEvent.type = UPDATE;\n\t\t\t\t\tapplicationEvent.deltaTime = currentUpdate - lastUpdate;\n\t\t\t\t\tlastUpdate = currentUpdate;\n\n\t\t\t\t\tnextUpdate += NextFrameStep(framePeriod);\n\n\t\t\t\t\twhile (nextUpdate <= currentUpdate) {\n\t\t\t\t\t\tnextUpdate += NextFrameStep(framePeriod);\n\t\t\t\t\t}\n\n\t\t\t\t\tApplicationEvent::Dispatch (&applicationEvent);\n\t\t\t\t\tRenderEvent::Dispatch (&renderEvent);\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_APP_WILLENTERBACKGROUND:\n\n\t\t\t\tinBackground = true;\n\n\t\t\t\twindowEvent.type = WINDOW_DEACTIVATE;\n\t\t\t\tWindowEvent::Dispatch (&windowEvent);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_APP_WILLENTERFOREGROUND:\n\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_APP_DIDENTERFOREGROUND:\n\n\t\t\t\twindowEvent.type = WINDOW_ACTIVATE;\n\t\t\t\tWindowEvent::Dispatch (&windowEvent);\n\n\t\t\t\tinBackground = false;\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_CLIPBOARDUPDATE:\n\n\t\t\t\tProcessClipboardEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_CONTROLLERAXISMOTION:\n\t\t\tcase SDL_CONTROLLERBUTTONDOWN:\n\t\t\tcase SDL_CONTROLLERBUTTONUP:\n\t\t\tcase SDL_CONTROLLERDEVICEADDED:\n\t\t\tcase SDL_CONTROLLERDEVICEREMOVED:\n\n\t\t\t\tProcessGamepadEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_DISPLAYEVENT:\n\n\t\t\t\tswitch (event->display.event) {\n\n\t\t\t\t\tcase SDL_DISPLAYEVENT_ORIENTATION:\n\n\t\t\t\t\t\t// this is the orientation of what is rendered, which\n\t\t\t\t\t\t// may not exactly match the orientation of the device,\n\t\t\t\t\t\t// if the app was locked to portrait or landscape.\n\t\t\t\t\t\torientationEvent.type = DISPLAY_ORIENTATION_CHANGE;\n\t\t\t\t\t\torientationEvent.orientation = event->display.data1;\n\t\t\t\t\t\torientationEvent.display = event->display.display;\n\t\t\t\t\t\tOrientationEvent::Dispatch (&orientationEvent);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_DROPFILE:\n\n\t\t\t\tProcessDropEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_FINGERMOTION:\n\t\t\tcase SDL_FINGERDOWN:\n\t\t\tcase SDL_FINGERUP:\n\n\t\t\t\tProcessTouchEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_JOYAXISMOTION:\n\n\t\t\t\tif (SDLJoystick::IsAccelerometer (event->jaxis.which)) {\n\n\t\t\t\t\tProcessSensorEvent (event);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tProcessJoystickEvent (event);\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_JOYBALLMOTION:\n\t\t\tcase SDL_JOYBUTTONDOWN:\n\t\t\tcase SDL_JOYBUTTONUP:\n\t\t\tcase SDL_JOYHATMOTION:\n\t\t\tcase SDL_JOYDEVICEADDED:\n\t\t\tcase SDL_JOYDEVICEREMOVED:\n\n\t\t\t\tProcessJoystickEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_KEYDOWN:\n\t\t\tcase SDL_KEYUP:\n\n\t\t\t\tProcessKeyEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_MOUSEMOTION:\n\t\t\tcase SDL_MOUSEBUTTONDOWN:\n\t\t\tcase SDL_MOUSEBUTTONUP:\n\t\t\tcase SDL_MOUSEWHEEL:\n\n\t\t\t\tProcessMouseEvent (event);\n\t\t\t\tbreak;\n\n\t\t\t#ifndef EMSCRIPTEN\n\t\t\tcase SDL_RENDER_DEVICE_RESET:\n\n\t\t\t\trenderEvent.type = RENDER_CONTEXT_LOST;\n\t\t\t\tRenderEvent::Dispatch (&renderEvent);\n\n\t\t\t\trenderEvent.type = RENDER_CONTEXT_RESTORED;\n\t\t\t\tRenderEvent::Dispatch (&renderEvent);\n\n\t\t\t\trenderEvent.type = RENDER;\n\t\t\t\tbreak;\n\t\t\t#endif\n\n\t\t\tcase SDL_TEXTINPUT:\n\t\t\tcase SDL_TEXTEDITING:\n\n\t\t\t\tProcessTextEvent (event);\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_WINDOWEVENT:\n\n\t\t\t\tswitch (event->window.event) {\n\n\t\t\t\t\tcase SDL_WINDOWEVENT_ENTER:\n\t\t\t\t\tcase SDL_WINDOWEVENT_LEAVE:\n\t\t\t\t\tcase SDL_WINDOWEVENT_SHOWN:\n\t\t\t\t\tcase SDL_WINDOWEVENT_HIDDEN:\n\t\t\t\t\tcase SDL_WINDOWEVENT_FOCUS_GAINED:\n\t\t\t\t\tcase SDL_WINDOWEVENT_FOCUS_LOST:\n\t\t\t\t\tcase SDL_WINDOWEVENT_MAXIMIZED:\n\t\t\t\t\tcase SDL_WINDOWEVENT_MINIMIZED:\n\t\t\t\t\tcase SDL_WINDOWEVENT_MOVED:\n\t\t\t\t\tcase SDL_WINDOWEVENT_RESTORED:\n\n\t\t\t\t\t\tProcessWindowEvent (event);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SDL_WINDOWEVENT_EXPOSED:\n\n\t\t\t\t\t\tProcessWindowEvent (event);\n\n\t\t\t\t\t\tif (!inBackground) {\n\n\t\t\t\t\t\t\tRenderEvent::Dispatch (&renderEvent);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SDL_WINDOWEVENT_SIZE_CHANGED:\n\n\t\t\t\t\t\tProcessWindowEvent (event);\n\n\t\t\t\t\t\tif (!inBackground) {\n\n\t\t\t\t\t\t\tRenderEvent::Dispatch (&renderEvent);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SDL_WINDOWEVENT_CLOSE:\n\n\t\t\t\t\t\tProcessWindowEvent (event);\n\n\t\t\t\t\t\t// Avoid handling SDL_QUIT if in response to window.close\n\t\t\t\t\t\tSDL_Event event;\n\n\t\t\t\t\t\tif (SDL_PollEvent (&event)) {\n\n\t\t\t\t\t\t\tif (event.type != SDL_QUIT) {\n\n\t\t\t\t\t\t\t\tHandleEvent (&event);\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_QUIT:\n\n\t\t\t\tactive = false;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::Init () {\n\n\t\tactive = true;\n\t\tlastUpdate = SDL_GetTicks ();\n\t\tnextUpdate = lastUpdate;\n\n\t}\n\n\n\tvoid SDLApplication::ProcessClipboardEvent (SDL_Event* event) {\n\n\t\tif (ClipboardEvent::callback) {\n\n\t\t\tclipboardEvent.type = CLIPBOARD_UPDATE;\n\n\t\t\tClipboardEvent::Dispatch (&clipboardEvent);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessDropEvent (SDL_Event* event) {\n\n\t\tif (DropEvent::callback) {\n\n\t\t\tdropEvent.type = DROP_FILE;\n\t\t\tdropEvent.file = (vbyte*)event->drop.file;\n\n\t\t\tDropEvent::Dispatch (&dropEvent);\n\t\t\tSDL_free (dropEvent.file);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessGamepadEvent (SDL_Event* event) {\n\n\t\tif (GamepadEvent::callback) {\n\n\t\t\tswitch (event->type) {\n\n\t\t\t\tcase SDL_CONTROLLERAXISMOTION:\n\n\t\t\t\t\tif (gamepadsAxisMap[event->caxis.which].empty ()) {\n\n\t\t\t\t\t\tgamepadsAxisMap[event->caxis.which][event->caxis.axis] = event->caxis.value;\n\n\t\t\t\t\t} else if (gamepadsAxisMap[event->caxis.which][event->caxis.axis] == event->caxis.value) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgamepadEvent.type = GAMEPAD_AXIS_MOVE;\n\t\t\t\t\tgamepadEvent.axis = event->caxis.axis;\n\t\t\t\t\tgamepadEvent.id = event->caxis.which;\n\n\t\t\t\t\tif (event->caxis.value > -analogAxisDeadZone && event->caxis.value < analogAxisDeadZone) {\n\n\t\t\t\t\t\tif (gamepadsAxisMap[event->caxis.which][event->caxis.axis] != 0) {\n\n\t\t\t\t\t\t\tgamepadsAxisMap[event->caxis.which][event->caxis.axis] = 0;\n\t\t\t\t\t\t\tgamepadEvent.axisValue = 0;\n\t\t\t\t\t\t\tGamepadEvent::Dispatch (&gamepadEvent);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgamepadsAxisMap[event->caxis.which][event->caxis.axis] = event->caxis.value;\n\t\t\t\t\tgamepadEvent.axisValue = event->caxis.value / (event->caxis.value > 0 ? 32767.0 : 32768.0);\n\n\t\t\t\t\tGamepadEvent::Dispatch (&gamepadEvent);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_CONTROLLERBUTTONDOWN:\n\n\t\t\t\t\tgamepadEvent.type = GAMEPAD_BUTTON_DOWN;\n\t\t\t\t\tgamepadEvent.button = event->cbutton.button;\n\t\t\t\t\tgamepadEvent.id = event->cbutton.which;\n\n\t\t\t\t\tGamepadEvent::Dispatch (&gamepadEvent);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_CONTROLLERBUTTONUP:\n\n\t\t\t\t\tgamepadEvent.type = GAMEPAD_BUTTON_UP;\n\t\t\t\t\tgamepadEvent.button = event->cbutton.button;\n\t\t\t\t\tgamepadEvent.id = event->cbutton.which;\n\n\t\t\t\t\tGamepadEvent::Dispatch (&gamepadEvent);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_CONTROLLERDEVICEADDED:\n\n\t\t\t\t\tif (SDLGamepad::Connect (event->cdevice.which)) {\n\n\t\t\t\t\t\tgamepadEvent.type = GAMEPAD_CONNECT;\n\t\t\t\t\t\tgamepadEvent.id = SDLGamepad::GetInstanceID (event->cdevice.which);\n\n\t\t\t\t\t\tGamepadEvent::Dispatch (&gamepadEvent);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_CONTROLLERDEVICEREMOVED: {\n\n\t\t\t\t\tgamepadEvent.type = GAMEPAD_DISCONNECT;\n\t\t\t\t\tgamepadEvent.id = event->cdevice.which;\n\n\t\t\t\t\tGamepadEvent::Dispatch (&gamepadEvent);\n\t\t\t\t\tSDLGamepad::Disconnect (event->cdevice.which);\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessJoystickEvent (SDL_Event* event) {\n\n\t\tif (JoystickEvent::callback) {\n\n\t\t\tswitch (event->type) {\n\n\t\t\t\tcase SDL_JOYAXISMOTION:\n\n\t\t\t\t\tif (!SDLJoystick::IsAccelerometer (event->jaxis.which)) {\n\n\t\t\t\t\t\tjoystickEvent.type = JOYSTICK_AXIS_MOVE;\n\t\t\t\t\t\tjoystickEvent.index = event->jaxis.axis;\n\t\t\t\t\t\tjoystickEvent.x = event->jaxis.value / (event->jaxis.value > 0 ? 32767.0 : 32768.0);\n\t\t\t\t\t\tjoystickEvent.id = event->jaxis.which;\n\n\t\t\t\t\t\tJoystickEvent::Dispatch (&joystickEvent);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\n\t\t\t\tcase SDL_JOYBUTTONDOWN:\n\n\t\t\t\t\tif (!SDLJoystick::IsAccelerometer (event->jbutton.which)) {\n\n\t\t\t\t\t\tjoystickEvent.type = JOYSTICK_BUTTON_DOWN;\n\t\t\t\t\t\tjoystickEvent.index = event->jbutton.button;\n\t\t\t\t\t\tjoystickEvent.id = event->jbutton.which;\n\n\t\t\t\t\t\tJoystickEvent::Dispatch (&joystickEvent);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_JOYBUTTONUP:\n\n\t\t\t\t\tif (!SDLJoystick::IsAccelerometer (event->jbutton.which)) {\n\n\t\t\t\t\t\tjoystickEvent.type = JOYSTICK_BUTTON_UP;\n\t\t\t\t\t\tjoystickEvent.index = event->jbutton.button;\n\t\t\t\t\t\tjoystickEvent.id = event->jbutton.which;\n\n\t\t\t\t\t\tJoystickEvent::Dispatch (&joystickEvent);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_JOYHATMOTION:\n\n\t\t\t\t\tif (!SDLJoystick::IsAccelerometer (event->jhat.which)) {\n\n\t\t\t\t\t\tjoystickEvent.type = JOYSTICK_HAT_MOVE;\n\t\t\t\t\t\tjoystickEvent.index = event->jhat.hat;\n\t\t\t\t\t\tjoystickEvent.eventValue = event->jhat.value;\n\t\t\t\t\t\tjoystickEvent.id = event->jhat.which;\n\n\t\t\t\t\t\tJoystickEvent::Dispatch (&joystickEvent);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_JOYDEVICEADDED:\n\n\t\t\t\t\tif (SDLJoystick::Connect (event->jdevice.which)) {\n\n\t\t\t\t\t\tjoystickEvent.type = JOYSTICK_CONNECT;\n\t\t\t\t\t\tjoystickEvent.id = SDLJoystick::GetInstanceID (event->jdevice.which);\n\n\t\t\t\t\t\tJoystickEvent::Dispatch (&joystickEvent);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_JOYDEVICEREMOVED:\n\n\t\t\t\t\tif (!SDLJoystick::IsAccelerometer (event->jdevice.which)) {\n\n\t\t\t\t\t\tjoystickEvent.type = JOYSTICK_DISCONNECT;\n\t\t\t\t\t\tjoystickEvent.id = event->jdevice.which;\n\n\t\t\t\t\t\tJoystickEvent::Dispatch (&joystickEvent);\n\t\t\t\t\t\tSDLJoystick::Disconnect (event->jdevice.which);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessKeyEvent (SDL_Event* event) {\n\n\t\tif (KeyEvent::callback) {\n\n\t\t\tswitch (event->type) {\n\n\t\t\t\tcase SDL_KEYDOWN: keyEvent.type = KEY_DOWN; break;\n\t\t\t\tcase SDL_KEYUP: keyEvent.type = KEY_UP; break;\n\n\t\t\t}\n\n\t\t\tkeyEvent.keyCode = event->key.keysym.sym;\n\t\t\tkeyEvent.modifier = event->key.keysym.mod;\n\t\t\tkeyEvent.windowID = event->key.windowID;\n\n\t\t\tif (keyEvent.type == KEY_DOWN) {\n\n\t\t\t\tif (keyEvent.keyCode == SDLK_CAPSLOCK) keyEvent.modifier |= KMOD_CAPS;\n\t\t\t\tif (keyEvent.keyCode == SDLK_LALT) keyEvent.modifier |= KMOD_LALT;\n\t\t\t\tif (keyEvent.keyCode == SDLK_LCTRL) keyEvent.modifier |= KMOD_LCTRL;\n\t\t\t\tif (keyEvent.keyCode == SDLK_LGUI) keyEvent.modifier |= KMOD_LGUI;\n\t\t\t\tif (keyEvent.keyCode == SDLK_LSHIFT) keyEvent.modifier |= KMOD_LSHIFT;\n\t\t\t\tif (keyEvent.keyCode == SDLK_MODE) keyEvent.modifier |= KMOD_MODE;\n\t\t\t\tif (keyEvent.keyCode == SDLK_NUMLOCKCLEAR) keyEvent.modifier |= KMOD_NUM;\n\t\t\t\tif (keyEvent.keyCode == SDLK_RALT) keyEvent.modifier |= KMOD_RALT;\n\t\t\t\tif (keyEvent.keyCode == SDLK_RCTRL) keyEvent.modifier |= KMOD_RCTRL;\n\t\t\t\tif (keyEvent.keyCode == SDLK_RGUI) keyEvent.modifier |= KMOD_RGUI;\n\t\t\t\tif (keyEvent.keyCode == SDLK_RSHIFT) keyEvent.modifier |= KMOD_RSHIFT;\n\n\t\t\t}\n\n\t\t\tKeyEvent::Dispatch (&keyEvent);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessMouseEvent (SDL_Event* event) {\n\n\t\tif (MouseEvent::callback) {\n\n\t\t\tswitch (event->type) {\n\n\t\t\t\tcase SDL_MOUSEMOTION:\n\n\t\t\t\t\tmouseEvent.type = MOUSE_MOVE;\n\t\t\t\t\tmouseEvent.x = event->motion.x;\n\t\t\t\t\tmouseEvent.y = event->motion.y;\n\t\t\t\t\tmouseEvent.movementX = event->motion.xrel;\n\t\t\t\t\tmouseEvent.movementY = event->motion.yrel;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_MOUSEBUTTONDOWN:\n\n\t\t\t\t\tSDL_CaptureMouse (SDL_TRUE);\n\n\t\t\t\t\tmouseEvent.type = MOUSE_DOWN;\n\t\t\t\t\tmouseEvent.button = event->button.button - 1;\n\t\t\t\t\tmouseEvent.x = event->button.x;\n\t\t\t\t\tmouseEvent.y = event->button.y;\n\t\t\t\t\tmouseEvent.clickCount = event->button.clicks;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_MOUSEBUTTONUP:\n\n\t\t\t\t\tSDL_CaptureMouse (SDL_FALSE);\n\n\t\t\t\t\tmouseEvent.type = MOUSE_UP;\n\t\t\t\t\tmouseEvent.button = event->button.button - 1;\n\t\t\t\t\tmouseEvent.x = event->button.x;\n\t\t\t\t\tmouseEvent.y = event->button.y;\n\t\t\t\t\tmouseEvent.clickCount = event->button.clicks;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_MOUSEWHEEL:\n\n\t\t\t\t\tmouseEvent.type = MOUSE_WHEEL;\n\n\t\t\t\t\tif (event->wheel.direction == SDL_MOUSEWHEEL_FLIPPED) {\n\n\t\t\t\t\t\tmouseEvent.x = -event->wheel.x;\n\t\t\t\t\t\tmouseEvent.y = -event->wheel.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmouseEvent.x = event->wheel.x;\n\t\t\t\t\t\tmouseEvent.y = event->wheel.y;\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tmouseEvent.windowID = event->button.windowID;\n\t\t\tMouseEvent::Dispatch (&mouseEvent);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessSensorEvent (SDL_Event* event) {\n\n\t\tif (SensorEvent::callback) {\n\n\t\t\tdouble value = event->jaxis.value / 32767.0f;\n\n\t\t\tswitch (event->jaxis.axis) {\n\n\t\t\t\tcase 0: sensorEvent.x = value; break;\n\t\t\t\tcase 1: sensorEvent.y = value; break;\n\t\t\t\tcase 2: sensorEvent.z = value; break;\n\t\t\t\tdefault: break;\n\n\t\t\t}\n\n\t\t\tSensorEvent::Dispatch (&sensorEvent);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessTextEvent (SDL_Event* event) {\n\n\t\tif (TextEvent::callback) {\n\n\t\t\tswitch (event->type) {\n\n\t\t\t\tcase SDL_TEXTINPUT:\n\n\t\t\t\t\ttextEvent.type = TEXT_INPUT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_TEXTEDITING:\n\n\t\t\t\t\ttextEvent.type = TEXT_EDIT;\n\t\t\t\t\ttextEvent.start = event->edit.start;\n\t\t\t\t\ttextEvent.length = event->edit.length;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif (textEvent.text) {\n\n\t\t\t\tfree (textEvent.text);\n\n\t\t\t}\n\n\t\t\ttextEvent.text = (vbyte*)malloc (strlen (event->text.text) + 1);\n\t\t\tstrcpy ((char*)textEvent.text, event->text.text);\n\n\t\t\ttextEvent.windowID = event->text.windowID;\n\t\t\tTextEvent::Dispatch (&textEvent);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessTouchEvent (SDL_Event* event) {\n\n\t\tif (TouchEvent::callback) {\n\n\t\t\tswitch (event->type) {\n\n\t\t\t\tcase SDL_FINGERMOTION:\n\n\t\t\t\t\ttouchEvent.type = TOUCH_MOVE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_FINGERDOWN:\n\n\t\t\t\t\ttouchEvent.type = TOUCH_START;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_FINGERUP:\n\n\t\t\t\t\ttouchEvent.type = TOUCH_END;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\ttouchEvent.x = event->tfinger.x;\n\t\t\ttouchEvent.y = event->tfinger.y;\n\t\t\ttouchEvent.id = event->tfinger.fingerId;\n\t\t\ttouchEvent.dx = event->tfinger.dx;\n\t\t\ttouchEvent.dy = event->tfinger.dy;\n\t\t\ttouchEvent.pressure = event->tfinger.pressure;\n\t\t\ttouchEvent.device = event->tfinger.touchId;\n\n\t\t\tTouchEvent::Dispatch (&touchEvent);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLApplication::ProcessWindowEvent (SDL_Event* event) {\n\n\t\tif (WindowEvent::callback) {\n\n\t\t\tswitch (event->window.event) {\n\n\t\t\t\tcase SDL_WINDOWEVENT_SHOWN: windowEvent.type = WINDOW_SHOW; break;\n\t\t\t\tcase SDL_WINDOWEVENT_CLOSE: windowEvent.type = WINDOW_CLOSE; break;\n\t\t\t\tcase SDL_WINDOWEVENT_HIDDEN: windowEvent.type = WINDOW_HIDE; break;\n\t\t\t\tcase SDL_WINDOWEVENT_ENTER: windowEvent.type = WINDOW_ENTER; break;\n\t\t\t\tcase SDL_WINDOWEVENT_FOCUS_GAINED: windowEvent.type = WINDOW_FOCUS_IN; break;\n\t\t\t\tcase SDL_WINDOWEVENT_FOCUS_LOST: windowEvent.type = WINDOW_FOCUS_OUT; break;\n\t\t\t\tcase SDL_WINDOWEVENT_LEAVE: windowEvent.type = WINDOW_LEAVE; break;\n\t\t\t\tcase SDL_WINDOWEVENT_MAXIMIZED: windowEvent.type = WINDOW_MAXIMIZE; break;\n\t\t\t\tcase SDL_WINDOWEVENT_MINIMIZED: windowEvent.type = WINDOW_MINIMIZE; break;\n\t\t\t\tcase SDL_WINDOWEVENT_EXPOSED: windowEvent.type = WINDOW_EXPOSE; break;\n\n\t\t\t\tcase SDL_WINDOWEVENT_MOVED:\n\n\t\t\t\t\twindowEvent.type = WINDOW_MOVE;\n\t\t\t\t\twindowEvent.x = event->window.data1;\n\t\t\t\t\twindowEvent.y = event->window.data2;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_WINDOWEVENT_SIZE_CHANGED:\n\n\t\t\t\t\twindowEvent.type = WINDOW_RESIZE;\n\t\t\t\t\twindowEvent.width = event->window.data1;\n\t\t\t\t\twindowEvent.height = event->window.data2;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_WINDOWEVENT_RESTORED: windowEvent.type = WINDOW_RESTORE; break;\n\n\t\t\t}\n\n\t\t\twindowEvent.windowID = event->window.windowID;\n\t\t\tWindowEvent::Dispatch (&windowEvent);\n\n\t\t}\n\n\t}\n\n\n\tint SDLApplication::Quit () {\n\n\t\tapplicationEvent.type = EXIT;\n\t\tApplicationEvent::Dispatch (&applicationEvent);\n\n\t\tSDL_QuitSubSystem (initFlags);\n\n\t\tSDL_Quit ();\n\n\t\treturn 0;\n\n\t}\n\n\n\tvoid SDLApplication::RegisterWindow (SDLWindow *window) {\n\n\t\t#ifdef IPHONE\n\t\tSDL_iPhoneSetAnimationCallback (window->sdlWindow, 1, UpdateFrame, NULL);\n\t\t#endif\n\n\t}\n\n\n\tvoid SDLApplication::SetFrameRate (double frameRate) {\n\n\t\tif (frameRate > 0) {\n\n\t\t\tframePeriod = 1000.0 / frameRate;\n\n\t\t} else {\n\n\t\t\tframePeriod = 1000.0;\n\n\t\t}\n\n\t}\n\n\n\tstatic SDL_TimerID timerID = 0;\n\tbool timerActive = false;\n\tbool firstTime = true;\n\n\tUint32 OnTimer (Uint32 interval, void *) {\n\n\t\tSDL_Event event;\n\t\tSDL_UserEvent userevent;\n\t\tuserevent.type = SDL_USEREVENT;\n\t\tuserevent.code = 0;\n\t\tuserevent.data1 = NULL;\n\t\tuserevent.data2 = NULL;\n\t\tevent.type = SDL_USEREVENT;\n\t\tevent.user = userevent;\n\n\t\ttimerActive = false;\n\t\ttimerID = 0;\n\n\t\tSDL_PushEvent (&event);\n\n\t\treturn 0;\n\n\t}\n\n\n\tbool SDLApplication::Update () {\n\n\t\tSDL_Event event;\n\t\tevent.type = -1;\n\n\t\t#if (!defined (IPHONE) && !defined (EMSCRIPTEN))\n\n\t\tif (active && (firstTime || WaitEvent (&event))) {\n\n\t\t\tfirstTime = false;\n\n\t\t\tHandleEvent (&event);\n\t\t\tevent.type = -1;\n\t\t\tif (!active)\n\t\t\t\treturn active;\n\n\t\t#endif\n\n\t\t\twhile (SDL_PollEvent (&event)) {\n\n\t\t\t\tHandleEvent (&event);\n\t\t\t\tevent.type = -1;\n\t\t\t\tif (!active)\n\t\t\t\t\treturn active;\n\n\t\t\t}\n\n\t\t\tcurrentUpdate = SDL_GetTicks ();\n\n\t\t#if defined (IPHONE) || defined (EMSCRIPTEN)\n\n\t\t\tif (currentUpdate >= nextUpdate) {\n\n\t\t\t\tevent.type = SDL_USEREVENT;\n\t\t\t\tHandleEvent (&event);\n\t\t\t\tevent.type = -1;\n\n\t\t\t}\n\n\t\t#else\n\n\t\t\tif (currentUpdate >= nextUpdate) {\n\n\t\t\t\tif (timerActive) SDL_RemoveTimer (timerID);\n\t\t\t\tOnTimer (0, 0);\n\n\t\t\t} else if (!timerActive) {\n\n\t\t\t\ttimerActive = true;\n\t\t\t\ttimerID = SDL_AddTimer (nextUpdate - currentUpdate, OnTimer, 0);\n\n\t\t\t}\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn active;\n\n\t}\n\n\n\tvoid SDLApplication::UpdateFrame () {\n\n\t\t#ifdef EMSCRIPTEN\n\t\tSystem::GCTryExitBlocking ();\n\t\t#endif\n\n\t\tcurrentApplication->Update ();\n\n\t\t#ifdef EMSCRIPTEN\n\t\tSystem::GCTryEnterBlocking ();\n\t\t#endif\n\n\t}\n\n\n\tvoid SDLApplication::UpdateFrame (void*) {\n\n\t\tUpdateFrame ();\n\n\t}\n\n\n\tint SDLApplication::WaitEvent (SDL_Event *event) {\n\n\t\t#if defined(HX_MACOS) || defined(ANDROID)\n\n\t\tSystem::GCEnterBlocking ();\n\t\tint result = SDL_WaitEvent (event);\n\t\tSystem::GCExitBlocking ();\n\t\treturn result;\n\n\t\t#else\n\n\t\tbool isBlocking = false;\n\n\t\tfor(;;) {\n\n\t\t\tSDL_PumpEvents ();\n\n\t\t\tswitch (SDL_PeepEvents (event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {\n\n\t\t\t\tcase -1:\n\n\t\t\t\t\tif (isBlocking) System::GCExitBlocking ();\n\t\t\t\t\treturn 0;\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tif (isBlocking) System::GCExitBlocking ();\n\t\t\t\t\treturn 1;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif (!isBlocking) System::GCEnterBlocking ();\n\t\t\t\t\tisBlocking = true;\n\n\t\t\t\t\tUint32 now = SDL_GetTicks();\n\t\t\t\t\tSint32 remaining = (Sint32)(nextUpdate - now);\n\n\t\t\t\t\tif (remaining > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (lime::CanUseDelay1((Uint32)remaining))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlime::SleepMinStep();\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSDL_Delay(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\n\t\t#endif\n\n\t}\n\n\n\tApplication* CreateApplication () {\n\n\t\treturn new SDLApplication ();\n\n\t}\n\n\n}\n\n\n#ifdef ANDROID\nint SDL_main (int argc, char *argv[]) { return 0; }\n#endif\n"
  },
  {
    "path": "project/src/backend/sdl/SDLApplication.h",
    "content": "#ifndef LIME_SDL_APPLICATION_H\n#define LIME_SDL_APPLICATION_H\n\n\n#include <SDL.h>\n#include <app/Application.h>\n#include <app/ApplicationEvent.h>\n#include <graphics/RenderEvent.h>\n#include <system/ClipboardEvent.h>\n#include <system/OrientationEvent.h>\n#include <system/SensorEvent.h>\n#include <ui/DropEvent.h>\n#include <ui/GamepadEvent.h>\n#include <ui/JoystickEvent.h>\n#include <ui/KeyEvent.h>\n#include <ui/MouseEvent.h>\n#include <ui/TextEvent.h>\n#include <ui/TouchEvent.h>\n#include <ui/WindowEvent.h>\n#include \"SDLWindow.h\"\n\n\nnamespace lime {\n\n\n\tclass SDLApplication : public Application {\n\n\t\tpublic:\n\n\t\t\tSDLApplication ();\n\t\t\t~SDLApplication ();\n\n\t\t\tvirtual int Exec ();\n\t\t\tvirtual void Init ();\n\t\t\tvirtual int Quit ();\n\t\t\tvirtual void SetFrameRate (double frameRate);\n\t\t\tvirtual bool Update ();\n\n\t\t\tvoid RegisterWindow (SDLWindow *window);\n\n\t\tprivate:\n\n\t\t\tvoid HandleEvent (SDL_Event* event);\n\t\t\tvoid ProcessClipboardEvent (SDL_Event* event);\n\t\t\tvoid ProcessDropEvent (SDL_Event* event);\n\t\t\tvoid ProcessGamepadEvent (SDL_Event* event);\n\t\t\tvoid ProcessJoystickEvent (SDL_Event* event);\n\t\t\tvoid ProcessKeyEvent (SDL_Event* event);\n\t\t\tvoid ProcessMouseEvent (SDL_Event* event);\n\t\t\tvoid ProcessSensorEvent (SDL_Event* event);\n\t\t\tvoid ProcessTextEvent (SDL_Event* event);\n\t\t\tvoid ProcessTouchEvent (SDL_Event* event);\n\t\t\tvoid ProcessWindowEvent (SDL_Event* event);\n\t\t\tint WaitEvent (SDL_Event* event);\n\n\t\t\tstatic void UpdateFrame ();\n\t\t\tstatic void UpdateFrame (void*);\n\n\t\t\tstatic SDLApplication* currentApplication;\n\n\t\t\tbool active;\n\t\t\tApplicationEvent applicationEvent;\n\t\t\tClipboardEvent clipboardEvent;\n\t\t\tUint32 currentUpdate;\n\t\t\tdouble framePeriod;\n\t\t\tUint32 initFlags;\n\t\t\tDropEvent dropEvent;\n\t\t\tGamepadEvent gamepadEvent;\n\t\t\tJoystickEvent joystickEvent;\n\t\t\tKeyEvent keyEvent;\n\t\t\tUint32 lastUpdate;\n\t\t\tMouseEvent mouseEvent;\n\t\t\tUint32 nextUpdate;\n\t\t\tOrientationEvent orientationEvent;\n\t\t\tRenderEvent renderEvent;\n\t\t\tSensorEvent sensorEvent;\n\t\t\tTextEvent textEvent;\n\t\t\tTouchEvent touchEvent;\n\t\t\tWindowEvent windowEvent;\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/src/backend/sdl/SDLCursor.h",
    "content": "#ifndef LIME_SDL_CURSOR_H\n#define LIME_SDL_CURSOR_H\n\n\n#include <SDL.h>\n\n\nnamespace lime {\n\n\n\tclass SDLCursor {\n\n\t\tpublic:\n\n\t\t\tstatic SDL_Cursor* arrowCursor;\n\t\t\tstatic SDL_Cursor* crosshairCursor;\n\t\t\tstatic SDL_Cursor* moveCursor;\n\t\t\tstatic SDL_Cursor* pointerCursor;\n\t\t\tstatic SDL_Cursor* resizeNESWCursor;\n\t\t\tstatic SDL_Cursor* resizeNSCursor;\n\t\t\tstatic SDL_Cursor* resizeNWSECursor;\n\t\t\tstatic SDL_Cursor* resizeWECursor;\n\t\t\tstatic SDL_Cursor* textCursor;\n\t\t\tstatic SDL_Cursor* waitCursor;\n\t\t\tstatic SDL_Cursor* waitArrowCursor;\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/src/backend/sdl/SDLGamepad.cpp",
    "content": "#include \"SDLGamepad.h\"\n\n\nnamespace lime {\n\n\n\tstd::map<int, SDL_GameController*> gameControllers;\n\tstd::map<int, int> gameControllerIDs;\n\n\n\tbool SDLGamepad::Connect (int deviceID) {\n\n\t\tif (!SDL_IsGameController (deviceID))\n\t\t\treturn false;\n\n\t\tSDL_GameController *gameController = SDL_GameControllerOpen (deviceID);\n\t\tif (gameController == nullptr)\n\t\t\treturn false;\n\n\t\tSDL_Joystick *joystick = SDL_GameControllerGetJoystick (gameController);\n\t\tint id = SDL_JoystickInstanceID (joystick);\n\n\t\tgameControllers[id] = gameController;\n\t\tgameControllerIDs[deviceID] = id;\n\n\t\treturn true;\n\n\t}\n\n\n\tbool SDLGamepad::Disconnect (int id) {\n\n\t\tauto it = gameControllers.find (id);\n\t\tif (it == gameControllers.end ())\n\t\t\treturn false;\n\n\t\tSDL_GameControllerClose (it->second);\n\t\tgameControllers.erase (id);\n\n\t\treturn true;\n\n\t}\n\n\n\tint SDLGamepad::GetInstanceID (int deviceID) {\n\n\t\treturn gameControllerIDs[deviceID];\n\n\t}\n\n\n\tvoid Gamepad::AddMapping (const char* content) {\n\n\t\tSDL_GameControllerAddMapping (content);\n\n\t}\n\n\n\tconst char* Gamepad::GetDeviceGUID (int id) {\n\n\t\tauto it = gameControllers.find (id);\n\t\tif (it == gameControllers.end ())\n\t\t\treturn nullptr;\n\n\t\tSDL_Joystick* joystick = SDL_GameControllerGetJoystick (it->second);\n\t\tif (joystick == nullptr)\n\t\t\treturn nullptr;\n\n\t\tchar* guid = new char[64];\n\t\tSDL_JoystickGetGUIDString (SDL_JoystickGetGUID (joystick), guid, 64);\n\t\treturn guid;\n\n\t}\n\n\n\tconst char* Gamepad::GetDeviceName (int id) {\n\n\t\tauto it = gameControllers.find (id);\n\t\tif (it == gameControllers.end ())\n\t\t\treturn nullptr;\n\n\t\treturn SDL_GameControllerName (it->second);\n\n\t}\n\n\n\tvoid Gamepad::Rumble (int id, double lowFrequencyRumble, double highFrequencyRumble, int duration) {\n\n\t\tauto it = gameControllers.find (id);\n\t\tif (it == gameControllers.end ())\n\t\t\treturn;\n\n\t\tif (highFrequencyRumble < 0.0f)\n\t\t\thighFrequencyRumble = 0.0f;\n\t\telse if (highFrequencyRumble > 1.0f)\n\t\t\thighFrequencyRumble = 1.0f;\n\n\t\tif (lowFrequencyRumble < 0.0f)\n\t\t\tlowFrequencyRumble = 0.0f;\n\t\telse if (lowFrequencyRumble > 1.0f)\n\t\t\tlowFrequencyRumble = 1.0f;\n\n\t\tSDL_GameControllerRumble (it->second, lowFrequencyRumble * 0xFFFF, highFrequencyRumble * 0xFFFF, duration);\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/backend/sdl/SDLGamepad.h",
    "content": "#ifndef LIME_SDL_GAMEPAD_H\n#define LIME_SDL_GAMEPAD_H\n\n\n#include <SDL.h>\n#include <ui/Gamepad.h>\n#include <map>\n\n\nnamespace lime {\n\n\n\tclass SDLGamepad {\n\n\t\tpublic:\n\n\t\t\tstatic bool Connect (int deviceID);\n\t\t\tstatic int GetInstanceID (int deviceID);\n\t\t\tstatic bool Disconnect (int id);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/src/backend/sdl/SDLJoystick.cpp",
    "content": "#include \"SDLJoystick.h\"\n\n\nnamespace lime {\n\n\n\tstatic SDL_Joystick* accelerometer = 0;\n\tstatic SDL_JoystickID accelerometerID = -1;\n\tstd::map<int, int> joystickIDs = std::map<int, int> ();\n\tstd::map<int, SDL_Joystick*> joysticks = std::map<int, SDL_Joystick*> ();\n\n\n\tbool SDLJoystick::Connect (int deviceID) {\n\n\t\tif (deviceID != accelerometerID) {\n\n\t\t\tSDL_Joystick* joystick = SDL_JoystickOpen (deviceID);\n\t\t\tint id = SDL_JoystickInstanceID (joystick);\n\n\t\t\tif (joystick) {\n\n\t\t\t\tjoysticks[id] = joystick;\n\t\t\t\tjoystickIDs[deviceID] = id;\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\tbool SDLJoystick::Disconnect (int id) {\n\n\t\tif (joysticks.find (id) != joysticks.end ()) {\n\n\t\t\tSDL_Joystick* joystick = joysticks[id];\n\t\t\tSDL_JoystickClose (joystick);\n\t\t\tjoysticks.erase (id);\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\tint SDLJoystick::GetInstanceID (int deviceID) {\n\n\t\treturn joystickIDs[deviceID];\n\n\t}\n\n\n\tvoid SDLJoystick::Init () {\n\n\t\t#if defined(IPHONE) || defined(ANDROID) || defined(TVOS)\n\t\tfor (int i = 0; i < SDL_NumJoysticks (); i++) {\n\n\t\t\tif (strstr (SDL_JoystickNameForIndex (i), \"Accelerometer\")) {\n\n\t\t\t\taccelerometer = SDL_JoystickOpen (i);\n\t\t\t\taccelerometerID = SDL_JoystickInstanceID (accelerometer);\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tbool SDLJoystick::IsAccelerometer (int id) {\n\n\t\treturn (id == accelerometerID);\n\n\t}\n\n\n\tconst char* Joystick::GetDeviceGUID (int id) {\n\n\t\tchar* guid = new char[64];\n\t\tSDL_JoystickGetGUIDString (SDL_JoystickGetGUID (joysticks[id]), guid, 64);\n\t\treturn guid;\n\n\t}\n\n\n\tconst char* Joystick::GetDeviceName (int id) {\n\n\t\treturn SDL_JoystickName (joysticks[id]);\n\n\t}\n\n\n\tint Joystick::GetNumAxes (int id) {\n\n\t\treturn SDL_JoystickNumAxes (joysticks[id]);\n\n\t}\n\n\n\tint Joystick::GetNumButtons (int id) {\n\n\t\treturn SDL_JoystickNumButtons (joysticks[id]);\n\n\t}\n\n\n\tint Joystick::GetNumHats (int id) {\n\n\t\treturn SDL_JoystickNumHats (joysticks[id]);\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/backend/sdl/SDLJoystick.h",
    "content": "#ifndef LIME_SDL_JOYSTICK_H\n#define LIME_SDL_JOYSTICK_H\n\n\n#include <SDL.h>\n#include <ui/Joystick.h>\n#include <map>\n\n\nnamespace lime {\n\n\n\tclass SDLJoystick {\n\n\t\tpublic:\n\n\t\t\tstatic bool Connect (int id);\n\t\t\tstatic bool Disconnect (int id);\n\t\t\tstatic int GetInstanceID (int deviceID);\n\t\t\tstatic void Init ();\n\t\t\tstatic bool IsAccelerometer (int id);\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/src/backend/sdl/SDLKeyCode.cpp",
    "content": "#include <SDL.h>\n#include <ui/KeyCode.h>\n\n\nnamespace lime {\n\n\n\tint32_t KeyCode::FromScanCode (int32_t scanCode) {\n\n\t\treturn SDL_GetKeyFromScancode ((SDL_Scancode)scanCode);\n\n\t}\n\n\n\tint32_t KeyCode::ToScanCode (int32_t keyCode) {\n\n\t\treturn SDL_GetScancodeFromKey ((SDL_Keycode)keyCode);\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/backend/sdl/SDLMutex.cpp",
    "content": "#include <system/Mutex.h>\n#include <SDL.h>\n\n\nnamespace lime {\n\n\n\tMutex::Mutex () {\n\n\t\tmutex = SDL_CreateMutex ();\n\n\t}\n\n\n\tMutex::~Mutex () {\n\n\t\tif (mutex) {\n\n\t\t\tSDL_DestroyMutex ((SDL_mutex*)mutex);\n\n\t\t}\n\n\t}\n\n\n\tbool Mutex::Lock () const {\n\n\t\tif (mutex) {\n\n\t\t\treturn SDL_LockMutex ((SDL_mutex*)mutex) == 0;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\tbool Mutex::TryLock () const {\n\n\t\tif (mutex) {\n\n\t\t\treturn SDL_TryLockMutex ((SDL_mutex*)mutex) == 0;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\tbool Mutex::Unlock () const {\n\n\t\tif (mutex) {\n\n\t\t\treturn SDL_UnlockMutex ((SDL_mutex*)mutex) == 0;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/backend/sdl/SDLSystem.cpp",
    "content": "#include <graphics/PixelFormat.h>\n#include <math/Rectangle.h>\n#include <system/Clipboard.h>\n#include <system/Display.h>\n#include <system/DisplayMode.h>\n#include <system/JNI.h>\n#include <system/System.h>\n\n#ifdef HX_MACOS\n#include <CoreFoundation/CoreFoundation.h>\n#endif\n\n#ifdef HX_WINDOWS\n#include <shlobj.h>\n#include <stdio.h>\n//#include <io.h>\n//#include <fcntl.h>\n#ifdef __MINGW32__\n#ifndef CSIDL_MYDOCUMENTS\n#define CSIDL_MYDOCUMENTS CSIDL_PERSONAL\n#endif\n#ifndef SHGFP_TYPE_CURRENT\n#define SHGFP_TYPE_CURRENT 0\n#endif\n#endif\n#if UNICODE\n#define WIN_StringToUTF8(S) SDL_iconv_string(\"UTF-8\", \"UTF-16LE\", (char *)(S), (SDL_wcslen(S)+1)*sizeof(WCHAR))\n#define WIN_UTF8ToString(S) (WCHAR *)SDL_iconv_string(\"UTF-16LE\", \"UTF-8\", (char *)(S), SDL_strlen(S)+1)\n#else\n#define WIN_StringToUTF8(S) SDL_iconv_string(\"UTF-8\", \"ASCII\", (char *)(S), (SDL_strlen(S)+1))\n#define WIN_UTF8ToString(S) SDL_iconv_string(\"ASCII\", \"UTF-8\", (char *)(S), SDL_strlen(S)+1)\n#endif\n#endif\n\n#ifdef ANDROID\n#include <android/asset_manager_jni.h>\n#endif\n\n#include <SDL.h>\n#include <string>\n\n#include <locale>\n#include <codecvt>\n\nusing wstring_convert = std::wstring_convert<std::codecvt_utf8<wchar_t>>;\n\n\nnamespace lime {\n\n\n\tstatic int id_bounds;\n\tstatic int id_currentMode;\n\tstatic int id_dpi;\n\tstatic int id_height;\n\tstatic int id_name;\n\tstatic int id_orientation;\n\tstatic int id_pixelFormat;\n\tstatic int id_refreshRate;\n\tstatic int id_supportedModes;\n\tstatic int id_width;\n\tstatic int id_safeArea;\n\tstatic bool init = false;\n\n\n\tconst char* Clipboard::GetText () {\n\n\t\treturn SDL_GetClipboardText ();\n\n\t}\n\n\n\tbool Clipboard::HasText () {\n\n\t\treturn SDL_HasClipboardText ();\n\n\t}\n\n\n\tbool Clipboard::SetText (const char* text) {\n\n\t\treturn (SDL_SetClipboardText (text) == 0);\n\n\t}\n\n\n\tvoid *JNI::GetEnv () {\n\n\t\t#ifdef ANDROID\n\t\treturn SDL_AndroidGetJNIEnv ();\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tbool System::GetAllowScreenTimeout () {\n\n\t\treturn SDL_IsScreenSaverEnabled ();\n\n\t}\n\n\n\tstd::wstring* System::GetDirectory (SystemDirectory type, const char* company, const char* title) {\n\n\t\tstd::wstring* result = 0;\n\t\tSystem::GCEnterBlocking ();\n\n\t\tswitch (type) {\n\n\t\t\tcase APPLICATION: {\n\n\t\t\t\tchar* path = SDL_GetBasePath ();\n\n\t\t\t\tif (path != nullptr) {\n\n\t\t\t\t\twstring_convert converter;\n\t\t\t\t\tresult = new std::wstring (converter.from_bytes(path));\n\t\t\t\t\tSDL_free (path);\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase APPLICATION_STORAGE: {\n\n\t\t\t\tchar* path = SDL_GetPrefPath (company, title);\n\n\t\t\t\tif (path != nullptr) {\n\n        \t\t\twstring_convert converter;\n\t\t\t\t\tresult = new std::wstring (converter.from_bytes(path));\n\t\t\t\t\tSDL_free (path);\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase DESKTOP: {\n\n\t\t\t\t#if defined (HX_WINRT)\n\n\t\t\t\tWindows::Storage::StorageFolder^ folder = Windows::Storage::KnownFolders::HomeGroup;\n\t\t\t\tresult = new std::wstring (folder->Path->Data ());\n\n\t\t\t\t#elif defined (HX_WINDOWS)\n\n\t\t\t\tWCHAR folderPath[MAX_PATH] = L\"\";\n\t\t\t\tSHGetFolderPathW (NULL, CSIDL_DESKTOPDIRECTORY, NULL, SHGFP_TYPE_CURRENT, folderPath);\n\t\t\t\tresult = new std::wstring (folderPath);\n\n\t\t\t\t#elif defined (IPHONE)\n\n\t\t\t\tresult = System::GetIOSDirectory (type);\n\n\t\t\t\t#elif !defined (ANDROID)\n\n\t\t\t\tchar const* home = getenv (\"HOME\");\n\n\t\t\t\tif (home != NULL) {\n\n\t\t\t\t\tstd::string path = std::string (home) + std::string (\"/Desktop\");\n\t\t\t\t\twstring_convert converter;\n\t\t\t\t\tresult = new std::wstring (converter.from_bytes(path));\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase DOCUMENTS: {\n\n\t\t\t\t#if defined (HX_WINRT)\n\n\t\t\t\tWindows::Storage::StorageFolder^ folder = Windows::Storage::KnownFolders::DocumentsLibrary;\n\t\t\t\tresult = new std::wstring (folder->Path->Data ());\n\n\t\t\t\t#elif defined (HX_WINDOWS)\n\n\t\t\t\tWCHAR folderPath[MAX_PATH] = L\"\";\n\t\t\t\tSHGetFolderPathW (NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, folderPath);\n\t\t\t\tresult = new std::wstring (folderPath);\n\n\t\t\t\t#elif defined (IPHONE)\n\n\t\t\t\tresult = System::GetIOSDirectory (type);\n\n\t\t\t\t#elif defined (ANDROID)\n\n\t\t\t\tresult = new std::wstring (L\"/mnt/sdcard/Documents\");\n\n\t\t\t\t#else\n\n\t\t\t\tchar const* home = getenv (\"HOME\");\n\n\t\t\t\tif (home != NULL) {\n\n\t\t\t\t\tstd::string path = std::string (home) + std::string (\"/Documents\");\n\t\t\t\t\twstring_convert converter;\n\t\t\t\t\tresult = new std::wstring (converter.from_bytes(path));\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase FONTS: {\n\n\t\t\t\t#if defined (HX_WINRT)\n\n\t\t\t\t// TODO\n\n\t\t\t\t#elif defined (HX_WINDOWS)\n\n\t\t\t\tWCHAR folderPath[MAX_PATH] = L\"\";\n\t\t\t\tSHGetFolderPathW (NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, folderPath);\n\t\t\t\tresult = new std::wstring (folderPath);\n\n\t\t\t\t#elif defined (HX_MACOS)\n\n\t\t\t\tresult = new std::wstring (L\"/Library/Fonts\");\n\n\t\t\t\t#elif defined (IPHONE)\n\n\t\t\t\tresult = new std::wstring (L\"/System/Library/Fonts\");\n\n\t\t\t\t#elif defined (ANDROID)\n\n\t\t\t\tresult = new std::wstring (L\"/system/fonts\");\n\n\t\t\t\t#elif defined (BLACKBERRY)\n\n\t\t\t\tresult = new std::wstring (L\"/usr/fonts/font_repository/monotype\");\n\n\t\t\t\t#else\n\n\t\t\t\tresult = new std::wstring (L\"/usr/share/fonts/truetype\");\n\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase USER: {\n\n\t\t\t\t#if defined (HX_WINRT)\n\n\t\t\t\tWindows::Storage::StorageFolder^ folder = Windows::Storage::ApplicationData::Current->RoamingFolder;\n\t\t\t\tresult = new std::wstring (folder->Path->Data ());\n\n\t\t\t\t#elif defined (HX_WINDOWS)\n\n\t\t\t\tWCHAR folderPath[MAX_PATH] = L\"\";\n\t\t\t\tSHGetFolderPathW (NULL, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, folderPath);\n\t\t\t\tresult = new std::wstring (folderPath);\n\n\t\t\t\t#elif defined (IPHONE)\n\n\t\t\t\tresult = System::GetIOSDirectory (type);\n\n\t\t\t\t#elif defined (ANDROID)\n\n\t\t\t\tresult = new std::wstring (L\"/mnt/sdcard\");\n\n\t\t\t\t#else\n\n\t\t\t\tchar const* home = getenv (\"HOME\");\n\n\t\t\t\tif (home != NULL) {\n\n\t\t\t\t\tstd::string path = std::string (home);\n\t\t\t\t\twstring_convert converter;\n\t\t\t\t\tresult = new std::wstring (converter.from_bytes(path));\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn result;\n\n\t}\n\n\n\tvoid* System::GetDisplay (bool useCFFIValue, int id) {\n\n\t\tif (useCFFIValue) {\n\n\t\t\tif (!init) {\n\n\t\t\t\tid_bounds = val_id (\"bounds\");\n\t\t\t\tid_currentMode = val_id (\"currentMode\");\n\t\t\t\tid_dpi = val_id (\"dpi\");\n\t\t\t\tid_height = val_id (\"height\");\n\t\t\t\tid_name = val_id (\"name\");\n\t\t\t\tid_orientation = val_id (\"orientation\");\n\t\t\t\tid_pixelFormat = val_id (\"pixelFormat\");\n\t\t\t\tid_refreshRate = val_id (\"refreshRate\");\n\t\t\t\tid_supportedModes = val_id (\"supportedModes\");\n\t\t\t\tid_width = val_id (\"width\");\n\t\t\t\tid_safeArea = val_id (\"safeArea\");\n\t\t\t\tinit = true;\n\n\t\t\t}\n\n\t\t\tint numDisplays = GetNumDisplays ();\n\n\t\t\tif (id < 0 || id >= numDisplays) {\n\n\t\t\t\treturn alloc_null ();\n\n\t\t\t}\n\n\t\t\tvalue display = alloc_empty_object ();\n\t\t\talloc_field (display, id_name, alloc_string (SDL_GetDisplayName (id)));\n\n\t\t\tSDL_Rect bounds = { 0, 0, 0, 0 };\n\t\t\tSDL_GetDisplayBounds (id, &bounds);\n\t\t\talloc_field (display, id_bounds, Rectangle (bounds.x, bounds.y, bounds.w, bounds.h).Value ());\n\n\t\t\tRectangle safeAreaInsets;\n\t\t\tDisplay::GetSafeAreaInsets(id, &safeAreaInsets);\n\t\t\talloc_field (display, id_safeArea,\n\t\t\t\tRectangle (bounds.x + safeAreaInsets.x,\n\t\t\t\t\tbounds.y + safeAreaInsets.y,\n\t\t\t\t\tbounds.w - safeAreaInsets.x - safeAreaInsets.width,\n\t\t\t\t\tbounds.h - safeAreaInsets.y - safeAreaInsets.height).Value ());\n\n\t\t\tfloat dpi = 72.0;\n\t\t\t#ifndef EMSCRIPTEN\n\t\t\tSDL_GetDisplayDPI (id, &dpi, NULL, NULL);\n\t\t\t#endif\n\t\t\talloc_field (display, id_dpi, alloc_float (dpi));\n\n\t\t\tSDL_DisplayOrientation orientation = SDL_GetDisplayOrientation(id);\n\t\t\talloc_field (display, id_orientation, alloc_int (orientation));\n\n\t\t\tSDL_DisplayMode displayMode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };\n\t\t\tDisplayMode mode;\n\n\t\t\tSDL_GetDesktopDisplayMode (id, &displayMode);\n\n\t\t\tmode.height = displayMode.h;\n\n\t\t\tswitch (displayMode.format) {\n\n\t\t\t\tcase SDL_PIXELFORMAT_ARGB8888:\n\n\t\t\t\t\tmode.pixelFormat = ARGB32;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_PIXELFORMAT_BGRA8888:\n\t\t\t\tcase SDL_PIXELFORMAT_BGRX8888:\n\n\t\t\t\t\tmode.pixelFormat = BGRA32;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tmode.pixelFormat = RGBA32;\n\n\t\t\t}\n\n\t\t\tmode.refreshRate = displayMode.refresh_rate;\n\t\t\tmode.width = displayMode.w;\n\n\t\t\talloc_field (display, id_currentMode, (value)mode.Value ());\n\n\t\t\tint numDisplayModes = SDL_GetNumDisplayModes (id);\n\t\t\tvalue supportedModes = alloc_array (numDisplayModes);\n\n\t\t\tfor (int i = 0; i < numDisplayModes; i++) {\n\n\t\t\t\tSDL_GetDisplayMode (id, i, &displayMode);\n\n\t\t\t\tmode.height = displayMode.h;\n\n\t\t\t\tswitch (displayMode.format) {\n\n\t\t\t\t\tcase SDL_PIXELFORMAT_ARGB8888:\n\n\t\t\t\t\t\tmode.pixelFormat = ARGB32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SDL_PIXELFORMAT_BGRA8888:\n\t\t\t\t\tcase SDL_PIXELFORMAT_BGRX8888:\n\n\t\t\t\t\t\tmode.pixelFormat = BGRA32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tmode.pixelFormat = RGBA32;\n\n\t\t\t\t}\n\n\t\t\t\tmode.refreshRate = displayMode.refresh_rate;\n\t\t\t\tmode.width = displayMode.w;\n\n\t\t\t\tval_array_set_i (supportedModes, i, (value)mode.Value ());\n\n\t\t\t}\n\n\t\t\talloc_field (display, id_supportedModes, supportedModes);\n\t\t\treturn display;\n\n\t\t} else {\n\n\t\t\tconst int id_bounds = hl_hash_utf8 (\"bounds\");\n\t\t\tconst int id_currentMode = hl_hash_utf8 (\"currentMode\");\n\t\t\tconst int id_dpi = hl_hash_utf8 (\"dpi\");\n\t\t\tconst int id_height = hl_hash_utf8 (\"height\");\n\t\t\tconst int id_name = hl_hash_utf8 (\"name\");\n\t\t\tconst int id_orientation = hl_hash_utf8 (\"orientation\");\n\t\t\tconst int id_pixelFormat = hl_hash_utf8 (\"pixelFormat\");\n\t\t\tconst int id_refreshRate = hl_hash_utf8 (\"refreshRate\");\n\t\t\tconst int id_supportedModes = hl_hash_utf8 (\"supportedModes\");\n\t\t\tconst int id_width = hl_hash_utf8 (\"width\");\n\t\t\tconst int id_safeArea = hl_hash_utf8 (\"safeArea\");\n\t\t\tconst int id_x = hl_hash_utf8 (\"x\");\n\t\t\tconst int id_y = hl_hash_utf8 (\"y\");\n\n\t\t\tint numDisplays = GetNumDisplays ();\n\n\t\t\tif (id < 0 || id >= numDisplays) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\tvdynamic* display = (vdynamic*)hl_alloc_dynobj ();\n\n\t\t\tconst char* displayName = SDL_GetDisplayName (id);\n\t\t\tchar* _displayName = (char*)malloc(strlen(displayName) + 1);\n\t\t\tstrcpy (_displayName, displayName);\n\t\t\thl_dyn_setp (display, id_name, &hlt_bytes, _displayName);\n\n\t\t\tSDL_Rect bounds = { 0, 0, 0, 0 };\n\t\t\tSDL_GetDisplayBounds (id, &bounds);\n\n\t\t\tvdynamic* _bounds = (vdynamic*)hl_alloc_dynobj ();\n\t\t\thl_dyn_seti (_bounds, id_x, &hlt_i32, bounds.x);\n\t\t\thl_dyn_seti (_bounds, id_y, &hlt_i32, bounds.y);\n\t\t\thl_dyn_seti (_bounds, id_width, &hlt_i32, bounds.w);\n\t\t\thl_dyn_seti (_bounds, id_height, &hlt_i32, bounds.h);\n\n\t\t\thl_dyn_setp (display, id_bounds, &hlt_dynobj, _bounds);\n\n\t\t\tRectangle safeAreaInsets;\n\t\t\tDisplay::GetSafeAreaInsets(id, &safeAreaInsets);\n\t\t\tvdynamic* _safeArea = (vdynamic*)hl_alloc_dynobj ();\n\t\t\thl_dyn_seti (_safeArea, id_x, &hlt_i32, bounds.x + safeAreaInsets.x);\n\t\t\thl_dyn_seti (_safeArea, id_y, &hlt_i32, bounds.y + safeAreaInsets.y);\n\t\t\thl_dyn_seti (_safeArea, id_width, &hlt_i32, bounds.w - safeAreaInsets.x - safeAreaInsets.width);\n\t\t\thl_dyn_seti (_safeArea, id_height, &hlt_i32, bounds.h - safeAreaInsets.y - safeAreaInsets.height);\n\n\t\t\thl_dyn_setp (display, id_safeArea, &hlt_dynobj, _safeArea);\n\n\t\t\tfloat dpi = 72.0;\n\t\t\t#ifndef EMSCRIPTEN\n\t\t\tSDL_GetDisplayDPI (id, &dpi, NULL, NULL);\n\t\t\t#endif\n\t\t\thl_dyn_setf (display, id_dpi, dpi);\n\n\t\t\tSDL_DisplayOrientation orientation = SDL_GetDisplayOrientation(id);\n\t\t\thl_dyn_seti (display, id_orientation, &hlt_i32, orientation);\n\n\t\t\tSDL_DisplayMode displayMode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };\n\t\t\tDisplayMode mode;\n\n\t\t\tSDL_GetDesktopDisplayMode (id, &displayMode);\n\n\t\t\tmode.height = displayMode.h;\n\n\t\t\tswitch (displayMode.format) {\n\n\t\t\t\tcase SDL_PIXELFORMAT_ARGB8888:\n\n\t\t\t\t\tmode.pixelFormat = ARGB32;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SDL_PIXELFORMAT_BGRA8888:\n\t\t\t\tcase SDL_PIXELFORMAT_BGRX8888:\n\n\t\t\t\t\tmode.pixelFormat = BGRA32;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tmode.pixelFormat = RGBA32;\n\n\t\t\t}\n\n\t\t\tmode.refreshRate = displayMode.refresh_rate;\n\t\t\tmode.width = displayMode.w;\n\n\t\t\tvdynamic* _displayMode = (vdynamic*)hl_alloc_dynobj ();\n\t\t\thl_dyn_seti (_displayMode, id_height, &hlt_i32, mode.height);\n\t\t\thl_dyn_seti (_displayMode, id_pixelFormat, &hlt_i32, mode.pixelFormat);\n\t\t\thl_dyn_seti (_displayMode, id_refreshRate, &hlt_i32, mode.refreshRate);\n\t\t\thl_dyn_seti (_displayMode, id_width, &hlt_i32, mode.width);\n\t\t\thl_dyn_setp (display, id_currentMode, &hlt_dynobj, _displayMode);\n\n\t\t\tint numDisplayModes = SDL_GetNumDisplayModes (id);\n\n\t\t\thl_varray* supportedModes = (hl_varray*)hl_alloc_array (&hlt_dynobj, numDisplayModes);\n\t\t\tvdynamic** supportedModesData = hl_aptr (supportedModes, vdynamic*);\n\n\t\t\tfor (int i = 0; i < numDisplayModes; i++) {\n\n\t\t\t\tSDL_GetDisplayMode (id, i, &displayMode);\n\n\t\t\t\tmode.height = displayMode.h;\n\n\t\t\t\tswitch (displayMode.format) {\n\n\t\t\t\t\tcase SDL_PIXELFORMAT_ARGB8888:\n\n\t\t\t\t\t\tmode.pixelFormat = ARGB32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SDL_PIXELFORMAT_BGRA8888:\n\t\t\t\t\tcase SDL_PIXELFORMAT_BGRX8888:\n\n\t\t\t\t\t\tmode.pixelFormat = BGRA32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tmode.pixelFormat = RGBA32;\n\n\t\t\t\t}\n\n\t\t\t\tmode.refreshRate = displayMode.refresh_rate;\n\t\t\t\tmode.width = displayMode.w;\n\n\t\t\t\tvdynamic* _displayMode = (vdynamic*)hl_alloc_dynobj ();\n\t\t\t\thl_dyn_seti (_displayMode, id_height, &hlt_i32, mode.height);\n\t\t\t\thl_dyn_seti (_displayMode, id_pixelFormat, &hlt_i32, mode.pixelFormat);\n\t\t\t\thl_dyn_seti (_displayMode, id_refreshRate, &hlt_i32, mode.refreshRate);\n\t\t\t\thl_dyn_seti (_displayMode, id_width, &hlt_i32, mode.width);\n\n\t\t\t\t*supportedModesData++ = _displayMode;\n\n\t\t\t}\n\n\t\t\thl_dyn_setp (display, id_supportedModes, &hlt_array, supportedModes);\n\t\t\treturn display;\n\n\t\t}\n\n\t}\n\n\n\tint System::GetNumDisplays () {\n\n\t\treturn SDL_GetNumVideoDisplays ();\n\n\t}\n\n\n\tdouble System::GetTimer () {\n\n\t\treturn SDL_GetTicks ();\n\n\t}\n\n\n\tbool System::SetAllowScreenTimeout (bool allow) {\n\n\t\tif (allow) {\n\n\t\t\tSDL_EnableScreenSaver ();\n\n\t\t} else {\n\n\t\t\tSDL_DisableScreenSaver ();\n\n\t\t}\n\n\t\treturn allow;\n\n\t}\n\n\n\tFILE* FILE_HANDLE::getFile () {\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tswitch (((SDL_RWops*)handle)->type) {\n\n\t\t\tcase SDL_RWOPS_STDFILE:\n\t\t\t{\n\t\t\t\t#ifdef HAVE_STDIO_H\n\t\t\t\treturn ((SDL_RWops*)handle)->hidden.stdio.fp;\n\t\t\t\t#else\n\t\t\t\t#error Lime requires HAVE_STDIO_H\n\t\t\t\t#endif\n\t\t\t}\n\t\t\tcase SDL_RWOPS_JNIFILE:\n\t\t\t{\n\t\t\t\t#ifdef ANDROID\n\t\t\t\tSystem::GCEnterBlocking ();\n\t\t\t\tint fd;\n\t\t\t\toff_t outStart;\n\t\t\t\toff_t outLength;\n\t\t\t\tfd = AAsset_openFileDescriptor ((AAsset*)(((SDL_RWops*)handle)->hidden.androidio.asset), &outStart, &outLength);\n\t\t\t\tFILE* file = ::fdopen (fd, \"rb\");\n\t\t\t\t::fseek (file, outStart, 0);\n\t\t\t\tSystem::GCExitBlocking ();\n\t\t\t\treturn file;\n\t\t\t\t#endif\n\t\t\t}\n\n\t\t}\n\n\t\treturn NULL;\n\n\t\t#else\n\n\t\treturn (FILE*)handle;\n\n\t\t#endif\n\n\t}\n\n\n\tint FILE_HANDLE::getLength () {\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tSystem::GCEnterBlocking ();\n\t\tint size = SDL_RWsize (((SDL_RWops*)handle));\n\t\tSystem::GCExitBlocking ();\n\t\treturn size;\n\n\t\t#else\n\n\t\treturn 0;\n\n\t\t#endif\n\n\t}\n\n\n\tbool FILE_HANDLE::isFile () {\n\n\t\t#ifndef HX_WINDOWS\n\n\t\treturn ((SDL_RWops*)handle)->type == SDL_RWOPS_STDFILE;\n\n\t\t#else\n\n\t\treturn true;\n\n\t\t#endif\n\n\t}\n\n\n\tint fclose (FILE_HANDLE *stream) {\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tif (stream) {\n\n\t\t\tSystem::GCEnterBlocking ();\n\t\t\tint code = SDL_RWclose ((SDL_RWops*)stream->handle);\n\t\t\tdelete stream;\n\t\t\tSystem::GCExitBlocking ();\n\t\t\treturn code;\n\n\t\t}\n\n\t\treturn 0;\n\n\t\t#else\n\n\t\tif (stream) {\n\n\t\t\tSystem::GCEnterBlocking ();\n\t\t\tint code = ::fclose ((FILE*)stream->handle);\n\t\t\tdelete stream;\n\t\t\tSystem::GCExitBlocking ();\n\t\t\treturn code;\n\n\t\t}\n\n\t\treturn 0;\n\n\t\t#endif\n\n\t}\n\n\n\tFILE_HANDLE *fdopen (int fd, const char *mode) {\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tSystem::GCEnterBlocking ();\n\t\tFILE* fp = ::fdopen (fd, mode);\n\t\tSDL_RWops *result = SDL_RWFromFP (fp, SDL_TRUE);\n\t\tSystem::GCExitBlocking ();\n\n\t\tif (result) {\n\n\t\t\treturn new FILE_HANDLE (result);\n\n\t\t}\n\n\t\treturn NULL;\n\n\t\t#else\n\n\t\tFILE* result;\n\n\t\tSystem::GCEnterBlocking ();\n\t\tresult = ::fdopen (fd, mode);\n\t\tSystem::GCExitBlocking ();\n\n\t\tif (result) {\n\n\t\t\treturn new FILE_HANDLE (result);\n\n\t\t}\n\n\t\treturn NULL;\n\n\t\t#endif\n\n\t}\n\n\n\tFILE_HANDLE *fopen (const char *filename, const char *mode) {\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tSDL_RWops *result;\n\n\t\tSystem::GCEnterBlocking ();\n\n\t\t#ifdef HX_MACOS\n\n\t\tresult = SDL_RWFromFile (filename, \"rb\");\n\n\t\tif (!result) {\n\n\t\t\tCFStringRef str = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8);\n\t\t\tCFURLRef path = CFBundleCopyResourceURL (CFBundleGetMainBundle (), str, NULL, NULL);\n\t\t\tCFRelease (str);\n\n\t\t\tif (path) {\n\n\t\t\t\tstr = CFURLCopyPath (path);\n\t\t\t\tCFIndex maxSize = CFStringGetMaximumSizeForEncoding (CFStringGetLength (str), kCFStringEncodingUTF8);\n\t\t\t\tchar *buffer = (char *)malloc (maxSize);\n\n\t\t\t\tif (CFStringGetCString (str, buffer, maxSize, kCFStringEncodingUTF8)) {\n\n\t\t\t\t\tresult = SDL_RWFromFP (::fopen (buffer, \"rb\"), SDL_TRUE);\n\t\t\t\t\tfree (buffer);\n\n\t\t\t\t}\n\n\t\t\t\tCFRelease (str);\n\t\t\t\tCFRelease (path);\n\n\t\t\t}\n\n\t\t}\n\t\t#else\n\t\tresult = SDL_RWFromFile (filename, mode);\n\t\t#endif\n\n\t\tSystem::GCExitBlocking ();\n\n\t\tif (result) {\n\n\t\t\treturn new FILE_HANDLE (result);\n\n\t\t}\n\n\t\treturn NULL;\n\n\t\t#else\n\n\t\tFILE* result;\n\t\tstd::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;\n\t\tstd::wstring* wfilename = new std::wstring (converter.from_bytes (filename));\n\t\tstd::wstring* wmode = new std::wstring (converter.from_bytes (mode));\n\n\t\tSystem::GCEnterBlocking ();\n\t\tresult = ::_wfopen (wfilename->c_str(), wmode->c_str());\n\t\tSystem::GCExitBlocking ();\n\n\t\tdelete wfilename;\n\t\tdelete wmode;\n\n\t\tif (result) {\n\n\t\t\treturn new FILE_HANDLE (result);\n\n\t\t}\n\n\t\treturn NULL;\n\n\t\t#endif\n\n\t}\n\n\n\tsize_t fread (void *ptr, size_t size, size_t count, FILE_HANDLE *stream) {\n\n\t\tsize_t nmem;\n\t\tSystem::GCEnterBlocking ();\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tnmem = SDL_RWread (stream ? (SDL_RWops*)stream->handle : NULL, ptr, size, count);\n\n\t\t#else\n\n\t\tnmem = ::fread (ptr, size, count, (FILE*)stream->handle);\n\n\t\t#endif\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn nmem;\n\n\t}\n\n\n\tint fseek (FILE_HANDLE *stream, long int offset, int origin) {\n\n\t\tint success;\n\t\tSystem::GCEnterBlocking ();\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tsuccess = SDL_RWseek (stream ? (SDL_RWops*)stream->handle : NULL, offset, origin);\n\n\t\t#else\n\n\t\tsuccess = ::fseek ((FILE*)stream->handle, offset, origin);\n\n\t\t#endif\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn success;\n\n\t}\n\n\n\tlong int ftell (FILE_HANDLE *stream) {\n\n\t\tlong int pos;\n\t\tSystem::GCEnterBlocking ();\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tpos = SDL_RWtell (stream ? (SDL_RWops*)stream->handle : NULL);\n\n\t\t#else\n\n\t\tpos = ::ftell ((FILE*)stream->handle);\n\n\t\t#endif\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn pos;\n\n\t}\n\n\n\tsize_t fwrite (const void *ptr, size_t size, size_t count, FILE_HANDLE *stream) {\n\n\t\tsize_t nmem;\n\t\tSystem::GCEnterBlocking ();\n\n\t\t#ifndef HX_WINDOWS\n\n\t\tnmem = SDL_RWwrite (stream ? (SDL_RWops*)stream->handle : NULL, ptr, size, count);\n\n\t\t#else\n\n\t\tnmem = ::fwrite (ptr, size, count, (FILE*)stream->handle);\n\n\t\t#endif\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn nmem;\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/backend/sdl/SDLWindow.cpp",
    "content": "#include \"SDLWindow.h\"\n#include \"SDLCursor.h\"\n#include \"SDLApplication.h\"\n#include \"../../graphics/opengl/OpenGL.h\"\n#include \"../../graphics/opengl/OpenGLBindings.h\"\n\n#ifdef HX_WINDOWS\n#include <SDL_syswm.h>\n#include <windows.h>\n#undef CreateWindow\n#endif\n\n\nnamespace lime {\n\n\n\tstatic Cursor currentCursor = DEFAULT;\n\n\tSDL_Cursor* SDLCursor::arrowCursor = 0;\n\tSDL_Cursor* SDLCursor::crosshairCursor = 0;\n\tSDL_Cursor* SDLCursor::moveCursor = 0;\n\tSDL_Cursor* SDLCursor::pointerCursor = 0;\n\tSDL_Cursor* SDLCursor::resizeNESWCursor = 0;\n\tSDL_Cursor* SDLCursor::resizeNSCursor = 0;\n\tSDL_Cursor* SDLCursor::resizeNWSECursor = 0;\n\tSDL_Cursor* SDLCursor::resizeWECursor = 0;\n\tSDL_Cursor* SDLCursor::textCursor = 0;\n\tSDL_Cursor* SDLCursor::waitCursor = 0;\n\tSDL_Cursor* SDLCursor::waitArrowCursor = 0;\n\n\tstatic bool displayModeSet = false;\n\n\n\tSDLWindow::SDLWindow (Application* application, int width, int height, int flags, const char* title) {\n\n\t\tsdlTexture = 0;\n\t\tsdlRenderer = 0;\n\t\tcontext = 0;\n\n\t\tcontextWidth = 0;\n\t\tcontextHeight = 0;\n\n\t\tcurrentApplication = application;\n\t\tthis->flags = flags;\n\n\t\tint sdlWindowFlags = 0;\n\n\t\tif (flags & WINDOW_FLAG_FULLSCREEN) sdlWindowFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP;\n\t\tif (flags & WINDOW_FLAG_RESIZABLE) sdlWindowFlags |= SDL_WINDOW_RESIZABLE;\n\t\tif (flags & WINDOW_FLAG_BORDERLESS) sdlWindowFlags |= SDL_WINDOW_BORDERLESS;\n\t\tif (flags & WINDOW_FLAG_HIDDEN) sdlWindowFlags |= SDL_WINDOW_HIDDEN;\n\t\tif (flags & WINDOW_FLAG_MINIMIZED) sdlWindowFlags |= SDL_WINDOW_MINIMIZED;\n\t\tif (flags & WINDOW_FLAG_MAXIMIZED) sdlWindowFlags |= SDL_WINDOW_MAXIMIZED;\n\n\t\t#ifndef EMSCRIPTEN\n\t\tif (flags & WINDOW_FLAG_ALWAYS_ON_TOP) sdlWindowFlags |= SDL_WINDOW_ALWAYS_ON_TOP;\n\t\t#endif\n\n\t\t#if defined (HX_WINDOWS) && defined (NATIVE_TOOLKIT_SDL_ANGLE) && !defined (HX_WINRT)\n\t\tOSVERSIONINFOEXW osvi = { sizeof (osvi), 0, 0, 0, 0, {0}, 0, 0 };\n\t\tDWORDLONG const dwlConditionMask = VerSetConditionMask (VerSetConditionMask (VerSetConditionMask (0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);\n\t\tosvi.dwMajorVersion = HIBYTE (_WIN32_WINNT_VISTA);\n\t\tosvi.dwMinorVersion = LOBYTE (_WIN32_WINNT_VISTA);\n\t\tosvi.wServicePackMajor = 0;\n\n\t\tif (VerifyVersionInfoW (&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) == FALSE) {\n\n\t\t\tflags &= ~WINDOW_FLAG_HARDWARE;\n\n\t\t}\n\t\t#endif\n\n\t\t#if !defined(EMSCRIPTEN) && !defined(LIME_SWITCH)\n\t\tSDL_SetHint (SDL_HINT_ANDROID_TRAP_BACK_BUTTON, \"0\");\n\t\tSDL_SetHint (SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, \"1\");\n\t\tSDL_SetHint (SDL_HINT_MOUSE_TOUCH_EVENTS, \"0\");\n\t\tSDL_SetHint (SDL_HINT_TOUCH_MOUSE_EVENTS, \"1\");\n\t\t#endif\n\n\t\tif (flags & WINDOW_FLAG_HARDWARE) {\n\n\t\t\tsdlWindowFlags |= SDL_WINDOW_OPENGL;\n\n\t\t\tif (flags & WINDOW_FLAG_ALLOW_HIGHDPI) {\n\n\t\t\t\tsdlWindowFlags |= SDL_WINDOW_ALLOW_HIGHDPI;\n\n\t\t\t}\n\n\t\t\t#if defined (HX_WINDOWS) && defined (NATIVE_TOOLKIT_SDL_ANGLE)\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 2);\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 0);\n\t\t\tSDL_SetHint (SDL_HINT_VIDEO_WIN_D3DCOMPILER, \"d3dcompiler_47.dll\");\n\t\t\t#endif\n\n\t\t\t#if defined (RASPBERRYPI)\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 2);\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 0);\n\t\t\tSDL_SetHint (SDL_HINT_RENDER_DRIVER, \"opengles2\");\n\t\t\t#endif\n\n\t\t\t#if defined (IPHONE) || defined (APPLETV)\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 3);\n\t\t\t#endif\n\n\t\t\tif (flags & WINDOW_FLAG_DEPTH_BUFFER) {\n\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 32 - (flags & WINDOW_FLAG_STENCIL_BUFFER) ? 8 : 0);\n\n\t\t\t}\n\n\t\t\tif (flags & WINDOW_FLAG_STENCIL_BUFFER) {\n\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_STENCIL_SIZE, 8);\n\n\t\t\t}\n\n\t\t\tif (flags & WINDOW_FLAG_HW_AA_HIRES) {\n\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, true);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, 4);\n\n\t\t\t} else if (flags & WINDOW_FLAG_HW_AA) {\n\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS, true);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES, 2);\n\n\t\t\t}\n\n\t\t\tif (flags & WINDOW_FLAG_COLOR_DEPTH_32_BIT) {\n\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_RED_SIZE, 8);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 8);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 8);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_ALPHA_SIZE, 8);\n\n\t\t\t} else {\n\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_RED_SIZE, 5);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 6);\n\t\t\t\tSDL_GL_SetAttribute (SDL_GL_BLUE_SIZE, 5);\n\n\t\t\t}\n\n\t\t}\n\n\t\tsdlWindow = SDL_CreateWindow (title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, sdlWindowFlags);\n\n\t\t#if defined (IPHONE) || defined (APPLETV)\n\t\tif (sdlWindow && !SDL_GL_CreateContext (sdlWindow)) {\n\n\t\t\tSDL_DestroyWindow (sdlWindow);\n\t\t\tSDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 2);\n\n\t\t\tsdlWindow = SDL_CreateWindow (title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, sdlWindowFlags);\n\n\t\t}\n\t\t#endif\n\n\t\tif (!sdlWindow) {\n\n\t\t\tprintf (\"Could not create SDL window: %s.\\n\", SDL_GetError ());\n\t\t\treturn;\n\n\t\t}\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\n\t\tHINSTANCE handle = ::GetModuleHandle (nullptr);\n\t\tHICON icon = ::LoadIcon (handle, MAKEINTRESOURCE (1));\n\n\t\tif (icon != nullptr) {\n\n\t\t\tSDL_SysWMinfo wminfo;\n\t\t\tSDL_VERSION (&wminfo.version);\n\n\t\t\tif (SDL_GetWindowWMInfo (sdlWindow, &wminfo) == 1) {\n\n\t\t\t\tHWND hwnd = wminfo.info.win.window;\n\n\t\t\t\t#ifdef _WIN64\n\t\t\t\t::SetClassLongPtr (hwnd, GCLP_HICON, reinterpret_cast<LONG_PTR>(icon));\n\t\t\t\t#else\n\t\t\t\t::SetClassLong (hwnd, GCL_HICON, reinterpret_cast<LONG>(icon));\n\t\t\t\t#endif\n\n\t\t\t}\n\n\t\t}\n\n\t\t#endif\n\n\t\tint sdlRendererFlags = 0;\n\n\t\tif (flags & WINDOW_FLAG_HARDWARE) {\n\n\t\t\tsdlRendererFlags |= SDL_RENDERER_ACCELERATED;\n\n\t\t\t// if (window->flags & WINDOW_FLAG_VSYNC) {\n\n\t\t\t#ifdef EMSCRIPTEN\n\t\t\tsdlRendererFlags |= SDL_RENDERER_PRESENTVSYNC;\n\t\t\t#endif\n\n\t\t\t// }\n\n\t\t\t// sdlRenderer = SDL_CreateRenderer (sdlWindow, -1, sdlRendererFlags);\n\n\t\t\t// if (sdlRenderer) {\n\n\t\t\t// \tcontext = SDL_GL_GetCurrentContext ();\n\n\t\t\t// }\n\n\t\t\tcontext = SDL_GL_CreateContext (sdlWindow);\n\n\t\t\tif (context && SDL_GL_MakeCurrent (sdlWindow, context) == 0) {\n\n\t\t\t\tif (flags & WINDOW_FLAG_VSYNC) {\n\n\t\t\t\t\tSDL_GL_SetSwapInterval (1);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tSDL_GL_SetSwapInterval (0);\n\n\t\t\t\t}\n\n\t\t\t\tOpenGLBindings::Init ();\n\n\t\t\t\t#ifndef LIME_GLES\n\n\t\t\t\tint version = 0;\n\t\t\t\tglGetIntegerv (GL_MAJOR_VERSION, &version);\n\n\t\t\t\tif (version == 0) {\n\n\t\t\t\t\tfloat versionScan = 0;\n\t\t\t\t\tsscanf ((const char*)glGetString (GL_VERSION), \"%f\", &versionScan);\n\t\t\t\t\tversion = versionScan;\n\n\t\t\t\t}\n\n\t\t\t\tif (version < 2 && !strstr ((const char*)glGetString (GL_VERSION), \"OpenGL ES\")) {\n\n\t\t\t\t\tSDL_GL_DeleteContext (context);\n\t\t\t\t\tcontext = 0;\n\n\t\t\t\t}\n\n\t\t\t\t#elif defined(IPHONE) || defined(APPLETV)\n\n\t\t\t\t// SDL_SysWMinfo windowInfo;\n\t\t\t\t// SDL_GetWindowWMInfo (sdlWindow, &windowInfo);\n\t\t\t\t// OpenGLBindings::defaultFramebuffer = windowInfo.info.uikit.framebuffer;\n\t\t\t\t// OpenGLBindings::defaultRenderbuffer = windowInfo.info.uikit.colorbuffer;\n\t\t\t\tglGetIntegerv (GL_FRAMEBUFFER_BINDING, &OpenGLBindings::defaultFramebuffer);\n\t\t\t\tglGetIntegerv (GL_RENDERBUFFER_BINDING, &OpenGLBindings::defaultRenderbuffer);\n\n\t\t\t\t#endif\n\n\t\t\t} else {\n\n\t\t\t\tSDL_GL_DeleteContext (context);\n\t\t\t\tcontext = NULL;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (!context) {\n\n\t\t\tsdlRendererFlags &= ~SDL_RENDERER_ACCELERATED;\n\t\t\tsdlRendererFlags &= ~SDL_RENDERER_PRESENTVSYNC;\n\n\t\t\tsdlRendererFlags |= SDL_RENDERER_SOFTWARE;\n\n\t\t\tsdlRenderer = SDL_CreateRenderer (sdlWindow, -1, sdlRendererFlags);\n\n\t\t}\n\n\t\tif (context || sdlRenderer) {\n\n\t\t\t((SDLApplication*)currentApplication)->RegisterWindow (this);\n\n\t\t} else {\n\n\t\t\tprintf (\"Could not create SDL renderer: %s.\\n\", SDL_GetError ());\n\n\t\t}\n\n\t}\n\n\n\tSDLWindow::~SDLWindow () {\n\n\t\tif (sdlWindow) {\n\n\t\t\tSDL_DestroyWindow (sdlWindow);\n\t\t\tsdlWindow = 0;\n\n\t\t}\n\n\t\tif (sdlRenderer) {\n\n\t\t\tSDL_DestroyRenderer (sdlRenderer);\n\n\t\t} else if (context) {\n\n\t\t\tSDL_GL_DeleteContext (context);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::Alert (const char* message, const char* title) {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\n\t\tint count = 0;\n\t\tint speed = 0;\n\t\tbool stopOnForeground = true;\n\n\t\tSDL_SysWMinfo info;\n\t\tSDL_VERSION (&info.version);\n\t\tSDL_GetWindowWMInfo (sdlWindow, &info);\n\n\t\tFLASHWINFO fi;\n\t\tfi.cbSize = sizeof (FLASHWINFO);\n\t\tfi.hwnd = info.info.win.window;\n\t\tfi.dwFlags = stopOnForeground ? FLASHW_ALL | FLASHW_TIMERNOFG : FLASHW_ALL | FLASHW_TIMER;\n\t\tfi.uCount = count;\n\t\tfi.dwTimeout = speed;\n\t\tFlashWindowEx (&fi);\n\n\t\t#endif\n\n\t\tif (message) {\n\n\t\t\tSDL_ShowSimpleMessageBox (SDL_MESSAGEBOX_INFORMATION, title, message, sdlWindow);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::Close () {\n\n\t\tif (sdlWindow) {\n\n\t\t\tSDL_DestroyWindow (sdlWindow);\n\t\t\tsdlWindow = 0;\n\n\t\t}\n\n\t}\n\n\n\tbool SDLWindow::SetVisible (bool visible) {\n\n\t\tif (visible) {\n\n\t\t\tSDL_ShowWindow (sdlWindow);\n\n\t\t} else {\n\n\t\t\tSDL_HideWindow (sdlWindow);\n\n\t\t}\n\n\t\treturn (SDL_GetWindowFlags (sdlWindow) & SDL_WINDOW_SHOWN);\n\n\t}\n\n\n\tvoid SDLWindow::ContextFlip () {\n\n\t\tif (context && !sdlRenderer) {\n\n\t\t\tSDL_GL_SwapWindow (sdlWindow);\n\n\t\t} else if (sdlRenderer) {\n\n\t\t\tSDL_RenderPresent (sdlRenderer);\n\n\t\t}\n\n\t}\n\n\n\tvoid* SDLWindow::ContextLock (bool useCFFIValue) {\n\n\t\tif (sdlRenderer) {\n\n\t\t\tint width;\n\t\t\tint height;\n\n\t\t\tSDL_GetRendererOutputSize (sdlRenderer, &width, &height);\n\n\t\t\tif (width != contextWidth || height != contextHeight) {\n\n\t\t\t\tif (sdlTexture) {\n\n\t\t\t\t\tSDL_DestroyTexture (sdlTexture);\n\n\t\t\t\t}\n\n\t\t\t\tsdlTexture = SDL_CreateTexture (sdlRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height);\n\n\t\t\t\tcontextWidth = width;\n\t\t\t\tcontextHeight = height;\n\n\t\t\t}\n\n\t\t\tvoid *pixels;\n\t\t\tint pitch;\n\n\t\t\tif (useCFFIValue) {\n\n\t\t\t\tif (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) {\n\n\t\t\t\t\tvalue result = alloc_empty_object ();\n\t\t\t\t\talloc_field (result, val_id (\"width\"), alloc_int (contextWidth));\n\t\t\t\t\talloc_field (result, val_id (\"height\"), alloc_int (contextHeight));\n\t\t\t\t\talloc_field (result, val_id (\"pixels\"), alloc_float ((uintptr_t)pixels));\n\t\t\t\t\talloc_field (result, val_id (\"pitch\"), alloc_int (pitch));\n\t\t\t\t\treturn result;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn alloc_null ();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst int id_width = hl_hash_utf8 (\"width\");\n\t\t\t\tconst int id_height = hl_hash_utf8 (\"height\");\n\t\t\t\tconst int id_pixels = hl_hash_utf8 (\"pixels\");\n\t\t\t\tconst int id_pitch = hl_hash_utf8 (\"pitch\");\n\n\t\t\t\tif (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) {\n\n\t\t\t\t\tvdynamic* result = (vdynamic*)hl_alloc_dynobj();\n\t\t\t\t\thl_dyn_seti (result, id_width, &hlt_i32, contextWidth);\n\t\t\t\t\thl_dyn_seti (result, id_height, &hlt_i32, contextHeight);\n\t\t\t\t\thl_dyn_setd (result, id_pixels, (uintptr_t)pixels);\n\t\t\t\t\thl_dyn_seti (result, id_pitch, &hlt_i32, pitch);\n\t\t\t\t\treturn result;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif (useCFFIValue) {\n\n\t\t\t\treturn alloc_null ();\n\n\t\t\t} else {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::ContextMakeCurrent () {\n\n\t\tif (sdlWindow && context) {\n\n\t\t\tSDL_GL_MakeCurrent (sdlWindow, context);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::ContextUnlock () {\n\n\t\tif (sdlTexture) {\n\n\t\t\tSDL_UnlockTexture (sdlTexture);\n\t\t\tSDL_RenderClear (sdlRenderer);\n\t\t\tSDL_RenderCopy (sdlRenderer, sdlTexture, NULL, NULL);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::Focus () {\n\n\t\tSDL_RaiseWindow (sdlWindow);\n\n\t}\n\n\n\tvoid* SDLWindow::GetContext () {\n\n\t\treturn context;\n\n\t}\n\n\n\tconst char* SDLWindow::GetContextType () {\n\n\t\tif (context) {\n\n\t\t\treturn \"opengl\";\n\n\t\t} else if (sdlRenderer) {\n\n\t\t\tSDL_RendererInfo info;\n\t\t\tSDL_GetRendererInfo (sdlRenderer, &info);\n\n\t\t\tif (info.flags & SDL_RENDERER_SOFTWARE) {\n\n\t\t\t\treturn \"software\";\n\n\t\t\t} else {\n\n\t\t\t\treturn \"opengl\";\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn \"none\";\n\n\t}\n\n\n\tint SDLWindow::GetDisplay () {\n\n\t\treturn SDL_GetWindowDisplayIndex (sdlWindow);\n\n\t}\n\n\n\tvoid SDLWindow::GetDisplayMode (DisplayMode* displayMode) {\n\n\t\tSDL_DisplayMode mode;\n\t\tSDL_GetWindowDisplayMode (sdlWindow, &mode);\n\n\t\tdisplayMode->width = mode.w;\n\t\tdisplayMode->height = mode.h;\n\n\t\tswitch (mode.format) {\n\n\t\t\tcase SDL_PIXELFORMAT_ARGB8888:\n\n\t\t\t\tdisplayMode->pixelFormat = ARGB32;\n\t\t\t\tbreak;\n\n\t\t\tcase SDL_PIXELFORMAT_BGRA8888:\n\t\t\tcase SDL_PIXELFORMAT_BGRX8888:\n\n\t\t\t\tdisplayMode->pixelFormat = BGRA32;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tdisplayMode->pixelFormat = RGBA32;\n\n\t\t}\n\n\t\tdisplayMode->refreshRate = mode.refresh_rate;\n\n\t}\n\n\n\tint SDLWindow::GetHeight () {\n\n\t\tint width;\n\t\tint height;\n\n\t\tSDL_GetWindowSize (sdlWindow, &width, &height);\n\n\t\treturn height;\n\n\t}\n\n\n\tuint32_t SDLWindow::GetID () {\n\n\t\treturn SDL_GetWindowID (sdlWindow);\n\n\t}\n\n\n\tbool SDLWindow::GetMouseLock () {\n\n\t\treturn SDL_GetRelativeMouseMode ();\n\n\t}\n\n\n\tfloat SDLWindow::GetOpacity () {\n\n\t\tfloat opacity = 1.0f;\n\n\t\tSDL_GetWindowOpacity (sdlWindow, &opacity);\n\n\t\treturn opacity;\n\n\t}\n\n\n\tdouble SDLWindow::GetScale () {\n\n\t\tif (sdlRenderer) {\n\n\t\t\tint outputWidth;\n\t\t\tint outputHeight;\n\n\t\t\tSDL_GetRendererOutputSize (sdlRenderer, &outputWidth, &outputHeight);\n\n\t\t\tint width;\n\t\t\tint height;\n\n\t\t\tSDL_GetWindowSize (sdlWindow, &width, &height);\n\n\t\t\tdouble scale = double (outputWidth) / width;\n\t\t\treturn scale;\n\n\t\t} else if (context) {\n\n\t\t\tint outputWidth;\n\t\t\tint outputHeight;\n\n\t\t\tSDL_GL_GetDrawableSize (sdlWindow, &outputWidth, &outputHeight);\n\n\t\t\tint width;\n\t\t\tint height;\n\n\t\t\tSDL_GetWindowSize (sdlWindow, &width, &height);\n\n\t\t\tdouble scale = double (outputWidth) / width;\n\t\t\treturn scale;\n\n\t\t}\n\n\t\treturn 1;\n\n\t}\n\n\n\tbool SDLWindow::GetTextInputEnabled () {\n\n\t\treturn SDL_IsTextInputActive ();\n\n\t}\n\n\n\tint SDLWindow::GetWidth () {\n\n\t\tint width;\n\t\tint height;\n\n\t\tSDL_GetWindowSize (sdlWindow, &width, &height);\n\n\t\treturn width;\n\n\t}\n\n\n\tint SDLWindow::GetX () {\n\n\t\tint x;\n\t\tint y;\n\n\t\tSDL_GetWindowPosition (sdlWindow, &x, &y);\n\n\t\treturn x;\n\n\t}\n\n\n\tint SDLWindow::GetY () {\n\n\t\tint x;\n\t\tint y;\n\n\t\tSDL_GetWindowPosition (sdlWindow, &x, &y);\n\n\t\treturn y;\n\n\t}\n\n\n\tvoid SDLWindow::Move (int x, int y) {\n\n\t\tSDL_SetWindowPosition (sdlWindow, x, y);\n\n\t}\n\n\n\tvoid SDLWindow::ReadPixels (ImageBuffer *buffer, Rectangle *rect) {\n\n\t\tif (sdlRenderer) {\n\n\t\t\tSDL_Rect bounds = { 0, 0, 0, 0 };\n\n\t\t\tif (rect) {\n\n\t\t\t\tbounds.x = rect->x;\n\t\t\t\tbounds.y = rect->y;\n\t\t\t\tbounds.w = rect->width;\n\t\t\t\tbounds.h = rect->height;\n\n\t\t\t} else {\n\n\t\t\t\tSDL_GetWindowSize (sdlWindow, &bounds.w, &bounds.h);\n\n\t\t\t}\n\n\t\t\tbuffer->Resize (bounds.w, bounds.h, 32);\n\n\t\t\tSDL_RenderReadPixels (sdlRenderer, &bounds, SDL_PIXELFORMAT_ABGR8888, buffer->data->buffer->b, buffer->Stride ());\n\n\t\t} else if (context) {\n\n\t\t\t// TODO\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::Resize (int width, int height) {\n\n\t\tSDL_SetWindowSize (sdlWindow, width, height);\n\n\t}\n\n\n\tvoid SDLWindow::SetMinimumSize (int width, int height) {\n\n\t\tSDL_SetWindowMinimumSize (sdlWindow, width, height);\n\n\t}\n\n\n\tvoid SDLWindow::SetMaximumSize (int width, int height) {\n\n\t\tSDL_SetWindowMaximumSize (sdlWindow, width, height);\n\n\t}\n\n\n\tbool SDLWindow::SetBorderless (bool borderless) {\n\n\t\tif (borderless) {\n\n\t\t\tSDL_SetWindowBordered (sdlWindow, SDL_FALSE);\n\n\t\t} else {\n\n\t\t\tSDL_SetWindowBordered (sdlWindow, SDL_TRUE);\n\n\t\t}\n\n\t\treturn borderless;\n\n\t}\n\n\n\tvoid SDLWindow::SetCursor (Cursor cursor) {\n\n\t\tif (cursor != currentCursor) {\n\n\t\t\tif (currentCursor == HIDDEN) {\n\n\t\t\t\tSDL_ShowCursor (SDL_ENABLE);\n\n\t\t\t}\n\n\t\t\tswitch (cursor) {\n\n\t\t\t\tcase HIDDEN:\n\n\t\t\t\t\tSDL_ShowCursor (SDL_DISABLE);\n\n\t\t\t\tcase CROSSHAIR:\n\n\t\t\t\t\tif (!SDLCursor::crosshairCursor) {\n\n\t\t\t\t\t\tSDLCursor::crosshairCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_CROSSHAIR);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::crosshairCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOVE:\n\n\t\t\t\t\tif (!SDLCursor::moveCursor) {\n\n\t\t\t\t\t\tSDLCursor::moveCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_SIZEALL);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::moveCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase POINTER:\n\n\t\t\t\t\tif (!SDLCursor::pointerCursor) {\n\n\t\t\t\t\t\tSDLCursor::pointerCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_HAND);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::pointerCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase RESIZE_NESW:\n\n\t\t\t\t\tif (!SDLCursor::resizeNESWCursor) {\n\n\t\t\t\t\t\tSDLCursor::resizeNESWCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_SIZENESW);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::resizeNESWCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase RESIZE_NS:\n\n\t\t\t\t\tif (!SDLCursor::resizeNSCursor) {\n\n\t\t\t\t\t\tSDLCursor::resizeNSCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_SIZENS);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::resizeNSCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase RESIZE_NWSE:\n\n\t\t\t\t\tif (!SDLCursor::resizeNWSECursor) {\n\n\t\t\t\t\t\tSDLCursor::resizeNWSECursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_SIZENWSE);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::resizeNWSECursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase RESIZE_WE:\n\n\t\t\t\t\tif (!SDLCursor::resizeWECursor) {\n\n\t\t\t\t\t\tSDLCursor::resizeWECursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_SIZEWE);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::resizeWECursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TEXT:\n\n\t\t\t\t\tif (!SDLCursor::textCursor) {\n\n\t\t\t\t\t\tSDLCursor::textCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_IBEAM);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::textCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WAIT:\n\n\t\t\t\t\tif (!SDLCursor::waitCursor) {\n\n\t\t\t\t\t\tSDLCursor::waitCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_WAIT);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::waitCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WAIT_ARROW:\n\n\t\t\t\t\tif (!SDLCursor::waitArrowCursor) {\n\n\t\t\t\t\t\tSDLCursor::waitArrowCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_WAITARROW);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::waitArrowCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif (!SDLCursor::arrowCursor) {\n\n\t\t\t\t\t\tSDLCursor::arrowCursor = SDL_CreateSystemCursor (SDL_SYSTEM_CURSOR_ARROW);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tSDL_SetCursor (SDLCursor::arrowCursor);\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcurrentCursor = cursor;\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::SetDisplayMode (DisplayMode* displayMode) {\n\n\t\tUint32 pixelFormat = 0;\n\n\t\tswitch (displayMode->pixelFormat) {\n\n\t\t\tcase ARGB32:\n\n\t\t\t\tpixelFormat = SDL_PIXELFORMAT_ARGB8888;\n\t\t\t\tbreak;\n\n\t\t\tcase BGRA32:\n\n\t\t\t\tpixelFormat = SDL_PIXELFORMAT_BGRA8888;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tpixelFormat = SDL_PIXELFORMAT_RGBA8888;\n\n\t\t}\n\n\t\tSDL_DisplayMode mode = { pixelFormat, displayMode->width, displayMode->height, displayMode->refreshRate, 0 };\n\n\t\tif (SDL_SetWindowDisplayMode (sdlWindow, &mode) == 0) {\n\n\t\t\tdisplayModeSet = true;\n\n\t\t\tif (SDL_GetWindowFlags (sdlWindow) & SDL_WINDOW_FULLSCREEN_DESKTOP) {\n\n\t\t\t\tSDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tbool SDLWindow::SetFullscreen (bool fullscreen) {\n\n\t\tif (fullscreen) {\n\n\t\t\tif (displayModeSet) {\n\n\t\t\t\tSDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN);\n\n\t\t\t} else {\n\n\t\t\t\tSDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN_DESKTOP);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tSDL_SetWindowFullscreen (sdlWindow, 0);\n\n\t\t}\n\n\t\treturn fullscreen;\n\n\t}\n\n\n\tvoid SDLWindow::SetIcon (ImageBuffer *imageBuffer) {\n\n\t\tSDL_Surface *surface = SDL_CreateRGBSurfaceFrom (imageBuffer->data->buffer->b, imageBuffer->width, imageBuffer->height, imageBuffer->bitsPerPixel, imageBuffer->Stride (), 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);\n\n\t\tif (surface) {\n\n\t\t\tSDL_SetWindowIcon (sdlWindow, surface);\n\t\t\tSDL_FreeSurface (surface);\n\n\t\t}\n\n\t}\n\n\n\tbool SDLWindow::SetMaximized (bool maximized) {\n\n\t\tif (maximized) {\n\n\t\t\tSDL_MaximizeWindow (sdlWindow);\n\n\t\t} else {\n\n\t\t\tSDL_RestoreWindow (sdlWindow);\n\n\t\t}\n\n\t\treturn maximized;\n\n\t}\n\n\n\tbool SDLWindow::SetMinimized (bool minimized) {\n\n\t\tif (minimized) {\n\n\t\t\tSDL_MinimizeWindow (sdlWindow);\n\n\t\t} else {\n\n\t\t\tSDL_RestoreWindow (sdlWindow);\n\n\t\t}\n\n\t\treturn minimized;\n\n\t}\n\n\n\tvoid SDLWindow::SetMouseLock (bool mouseLock) {\n\n\t\tif (mouseLock) {\n\n\t\t\tSDL_SetRelativeMouseMode (SDL_TRUE);\n\n\t\t} else {\n\n\t\t\tSDL_SetRelativeMouseMode (SDL_FALSE);\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::SetOpacity (float opacity) {\n\n\t\tSDL_SetWindowOpacity (sdlWindow, opacity);\n\n\t}\n\n\n\tbool SDLWindow::SetResizable (bool resizable) {\n\n\t\t#ifndef EMSCRIPTEN\n\n\t\tif (resizable) {\n\n\t\t\tSDL_SetWindowResizable (sdlWindow, SDL_TRUE);\n\n\t\t} else {\n\n\t\t\tSDL_SetWindowResizable (sdlWindow, SDL_FALSE);\n\n\t\t}\n\n\t\treturn (SDL_GetWindowFlags (sdlWindow) & SDL_WINDOW_RESIZABLE);\n\n\t\t#else\n\n\t\treturn resizable;\n\n\t\t#endif\n\n\t}\n\n\n\tvoid SDLWindow::SetTextInputEnabled (bool enabled) {\n\n\t\tif (enabled) {\n\n\t\t\tSDL_StartTextInput ();\n\n\t\t} else {\n\n\t\t\tSDL_StopTextInput ();\n\n\t\t}\n\n\t}\n\n\n\tvoid SDLWindow::SetTextInputRect (Rectangle * rect) {\n\n\t\tSDL_Rect bounds = { 0, 0, 0, 0 };\n\n\t\tif (rect) {\n\n\t\t\tbounds.x = rect->x;\n\t\t\tbounds.y = rect->y;\n\t\t\tbounds.w = rect->width;\n\t\t\tbounds.h = rect->height;\n\n\t\t}\n\n\t\tSDL_SetTextInputRect(&bounds);\n\t}\n\n\n\tconst char* SDLWindow::SetTitle (const char* title) {\n\n\t\tSDL_SetWindowTitle (sdlWindow, title);\n\n\t\treturn title;\n\n\t}\n\n\n\tvoid SDLWindow::WarpMouse (int x, int y) {\n\n\t\tSDL_WarpMouseInWindow (sdlWindow, x, y);\n\n\t}\n\n\n\tWindow* CreateWindow (Application* application, int width, int height, int flags, const char* title) {\n\n\t\treturn new SDLWindow (application, width, height, flags, title);\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/backend/sdl/SDLWindow.h",
    "content": "#ifndef LIME_SDL_WINDOW_H\n#define LIME_SDL_WINDOW_H\n\n\n#include <SDL.h>\n#include <graphics/ImageBuffer.h>\n#include <ui/Cursor.h>\n#include <ui/Window.h>\n\n\nnamespace lime {\n\n\n\tclass SDLWindow : public Window {\n\n\t\tpublic:\n\n\t\t\tSDLWindow (Application* application, int width, int height, int flags, const char* title);\n\t\t\t~SDLWindow ();\n\n\t\t\tvirtual void Alert (const char* message, const char* title);\n\t\t\tvirtual void Close ();\n\t\t\tvirtual void ContextFlip ();\n\t\t\tvirtual void* ContextLock (bool useCFFIValue);\n\t\t\tvirtual void ContextMakeCurrent ();\n\t\t\tvirtual void ContextUnlock ();\n\t\t\tvirtual void Focus ();\n\t\t\tvirtual void* GetContext ();\n\t\t\tvirtual const char* GetContextType ();\n\t\t\t// virtual Cursor GetCursor ();\n\t\t\tvirtual int GetDisplay ();\n\t\t\tvirtual void GetDisplayMode (DisplayMode* displayMode);\n\t\t\tvirtual int GetHeight ();\n\t\t\tvirtual uint32_t GetID ();\n\t\t\tvirtual bool GetMouseLock ();\n\t\t\tvirtual float GetOpacity ();\n\t\t\tvirtual double GetScale ();\n\t\t\tvirtual bool GetTextInputEnabled ();\n\t\t\tvirtual int GetWidth ();\n\t\t\tvirtual int GetX ();\n\t\t\tvirtual int GetY ();\n\t\t\tvirtual void Move (int x, int y);\n\t\t\tvirtual void ReadPixels (ImageBuffer *buffer, Rectangle *rect);\n\t\t\tvirtual void Resize (int width, int height);\n\t\t\tvirtual void SetMinimumSize (int width, int height);\n\t\t\tvirtual void SetMaximumSize (int width, int height);\n\t\t\tvirtual bool SetBorderless (bool borderless);\n\t\t\tvirtual void SetCursor (Cursor cursor);\n\t\t\tvirtual void SetDisplayMode (DisplayMode* displayMode);\n\t\t\tvirtual bool SetFullscreen (bool fullscreen);\n\t\t\tvirtual void SetIcon (ImageBuffer *imageBuffer);\n\t\t\tvirtual bool SetMaximized (bool maximized);\n\t\t\tvirtual bool SetMinimized (bool minimized);\n\t\t\tvirtual void SetMouseLock (bool mouseLock);\n\t\t\tvirtual void SetOpacity (float opacity);\n\t\t\tvirtual bool SetResizable (bool resizable);\n\t\t\tvirtual void SetTextInputEnabled (bool enabled);\n\t\t\tvirtual void SetTextInputRect (Rectangle *rect);\n\t\t\tvirtual const char* SetTitle (const char* title);\n\t\t\tvirtual bool SetVisible (bool visible);\n\t\t\tvirtual void WarpMouse (int x, int y);\n\t\t\tSDL_Renderer* sdlRenderer;\n\t\t\tSDL_Texture* sdlTexture;\n\t\t\tSDL_Window* sdlWindow;\n\n\t\tprivate:\n\n\t\t\tSDL_GLContext context;\n\t\t\tint contextHeight;\n\t\t\tint contextWidth;\n\n\t};\n\n\n}\n\n\n#endif\n"
  },
  {
    "path": "project/src/graphics/Image.cpp",
    "content": "#include <graphics/Image.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_buffer;\n\tstatic int id_height;\n\tstatic int id_offsetX;\n\tstatic int id_offsetY;\n\tstatic int id_width;\n\tstatic bool init = false;\n\n\n\tImage::Image (value image) {\n\n\t\tif (!init) {\n\n\t\t\tid_buffer = val_id (\"buffer\");\n\t\t\tid_height = val_id (\"height\");\n\t\t\tid_offsetX = val_id (\"offsetX\");\n\t\t\tid_offsetY = val_id (\"offsetY\");\n\t\t\tid_width = val_id (\"width\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\twidth = val_int (val_field (image, id_width));\n\t\theight = val_int (val_field (image, id_height));\n\t\tbuffer = new ImageBuffer (val_field (image, id_buffer));\n\t\toffsetX = val_int (val_field (image, id_offsetX));\n\t\toffsetY = val_int (val_field (image, id_offsetY));\n\n\t}\n\n\n\tImage::~Image () {\n\n\t\tif (buffer) {\n\n\t\t\tdelete buffer;\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/graphics/ImageBuffer.cpp",
    "content": "#include <graphics/ImageBuffer.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_bitsPerPixel;\n\tstatic int id_data;\n\tstatic int id_format;\n\tstatic int id_height;\n\tstatic int id_premultiplied;\n\tstatic int id_transparent;\n\tstatic int id_width;\n\tstatic bool init = false;\n\n\n\tImageBuffer::ImageBuffer (value imageBuffer) {\n\n\t\tif (!init) {\n\n\t\t\tid_bitsPerPixel = val_id (\"bitsPerPixel\");\n\t\t\tid_transparent = val_id (\"transparent\");\n\t\t\tid_data = val_id (\"data\");\n\t\t\tid_width = val_id (\"width\");\n\t\t\tid_height = val_id (\"height\");\n\t\t\tid_format = val_id (\"format\");\n\t\t\tid_premultiplied = val_id (\"premultiplied\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\tif (!val_is_null (imageBuffer)) {\n\n\t\t\twidth = val_int (val_field (imageBuffer, id_width));\n\t\t\theight = val_int (val_field (imageBuffer, id_height));\n\t\t\tbitsPerPixel = val_int (val_field (imageBuffer, id_bitsPerPixel));\n\t\t\tformat = (PixelFormat)val_int (val_field (imageBuffer, id_format));\n\t\t\ttransparent = val_bool (val_field (imageBuffer, id_transparent));\n\t\t\tpremultiplied = val_bool (val_field (imageBuffer, id_premultiplied));\n\t\t\tdata = new ArrayBufferView (val_field (imageBuffer, id_data));\n\n\t\t} else {\n\n\t\t\twidth = 0;\n\t\t\theight = 0;\n\t\t\tbitsPerPixel = 32;\n\t\t\tformat = RGBA32;\n\t\t\tdata = 0;\n\t\t\tpremultiplied = false;\n\t\t\ttransparent = false;\n\n\t\t}\n\n\t}\n\n\n\tImageBuffer::~ImageBuffer () {\n\n\t\tif (data) {\n\n\t\t\tdelete data;\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageBuffer::Blit (const unsigned char *data, int x, int y, int width, int height) {\n\n\t\tif (x < 0 || x + width > this->width || y < 0 || y + height > this->height) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tint stride = Stride ();\n\t\tunsigned char *bytes = this->data->buffer->b;\n\n\t\tfor (int i = 0; i < height; i++) {\n\n\t\t\tmemcpy (&bytes[(i + y) * this->width + x], &data[i * width], stride);\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageBuffer::Resize (int width, int height, int bitsPerPixel) {\n\n\t\tthis->bitsPerPixel = bitsPerPixel;\n\t\tthis->width = width;\n\t\tthis->height = height;\n\n\t\tint stride = Stride ();\n\n\t\tif (!this->data) {\n\n\t\t\t//this->data = new ArrayBufferView (height * stride);\n\n\t\t} else {\n\n\t\t\tthis->data->Resize (height * stride);\n\n\t\t}\n\n\t}\n\n\n\tint ImageBuffer::Stride () {\n\n\t\treturn width * (((bitsPerPixel + 3) & ~0x3) >> 3);\n\n\t}\n\n\n\tvalue ImageBuffer::Value () {\n\n\t\treturn Value (alloc_empty_object ());\n\n\t}\n\n\n\tvalue ImageBuffer::Value (value imageBuffer) {\n\n\t\tif (!init) {\n\n\t\t\tid_bitsPerPixel = val_id (\"bitsPerPixel\");\n\t\t\tid_transparent = val_id (\"transparent\");\n\t\t\tid_data = val_id (\"data\");\n\t\t\tid_width = val_id (\"width\");\n\t\t\tid_height = val_id (\"height\");\n\t\t\tid_format = val_id (\"format\");\n\t\t\tid_premultiplied = val_id (\"premultiplied\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\talloc_field (imageBuffer, id_width, alloc_int (width));\n\t\talloc_field (imageBuffer, id_height, alloc_int (height));\n\t\talloc_field (imageBuffer, id_bitsPerPixel, alloc_int (bitsPerPixel));\n\t\talloc_field (imageBuffer, id_data, data ? data->Value (val_field (imageBuffer, id_data)) : alloc_null ());\n\t\talloc_field (imageBuffer, id_transparent, alloc_bool (transparent));\n\t\talloc_field (imageBuffer, id_format, alloc_int (format));\n\t\talloc_field (imageBuffer, id_premultiplied, alloc_bool (premultiplied));\n\t\treturn imageBuffer;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/graphics/RenderEvent.cpp",
    "content": "#include <graphics/RenderEvent.h>\n#include <system/CFFI.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* RenderEvent::callback = 0;\n\tValuePointer* RenderEvent::eventObject = 0;\n\n\tstatic int id_type;\n\tstatic bool init = false;\n\n\n\tRenderEvent::RenderEvent () {\n\n\t\ttype = RENDER;\n\n\t}\n\n\n\tvoid RenderEvent::Dispatch (RenderEvent* event) {\n\n\t\tif (RenderEvent::callback) {\n\n\t\t\tif (RenderEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_type = val_id (\"type\");\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)RenderEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\n\t\t\t} else {\n\n\t\t\t\tRenderEvent* eventObject = (RenderEvent*)RenderEvent::eventObject->Get ();\n\n\t\t\t\teventObject->type = event->type;\n\n\t\t\t}\n\n\t\t\tRenderEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/graphics/cairo/CairoBindings.cpp",
    "content": "#include <cairo.h>\n#include <cairo-ft.h>\n#include <map>\n#include <math/Matrix3.h>\n#include <math/Vector2.h>\n#include <system/CFFI.h>\n#include <system/CFFIPointer.h>\n#include <system/Mutex.h>\n#include <system/ValuePointer.h>\n#include <text/Font.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_index;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\tcairo_user_data_key_t userData;\n\tstd::map<void*, void*> cairoObjects;\n\tMutex cairoObjects_Mutex;\n\n\n\tstruct HL_CairoGlyph {\n\n\t\thl_type* t;\n\t\tint index;\n\t\tdouble x;\n\t\tdouble y;\n\n\t};\n\n\n\tvoid gc_cairo (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcairo_t* cairo = (cairo_t*)val_data (handle);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects.erase (cairo);\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\tcairo_destroy (cairo);\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_cairo (HL_CFFIPointer* handle) {\n\n\t\tcairo_t* cairo = (cairo_t*)handle->ptr;\n\t\thandle->ptr = 0;\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects.erase (cairo);\n\t\tcairoObjects_Mutex.Unlock ();\n\t\tcairo_destroy (cairo);\n\n\t}\n\n\n\tvoid gc_cairo_font_face (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcairo_font_face_t* face = (cairo_font_face_t*)val_data (handle);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects.erase (face);\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\tcairo_font_face_destroy (face);\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_cairo_font_face (HL_CFFIPointer* handle) {\n\n\t\tcairo_font_face_t* face = (cairo_font_face_t*)handle->ptr;\n\t\thandle->ptr = 0;\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects.erase (face);\n\t\tcairoObjects_Mutex.Unlock ();\n\t\tcairo_font_face_destroy (face);\n\n\t}\n\n\n\tvoid gc_cairo_font_options (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcairo_font_options_t* options = (cairo_font_options_t*)val_data (handle);\n\t\t\tcairo_font_options_destroy (options);\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_cairo_font_options (HL_CFFIPointer* handle) {\n\n\t\tcairo_font_options_t* options = (cairo_font_options_t*)handle->ptr;\n\t\thandle->ptr = 0;\n\t\tcairo_font_options_destroy (options);\n\n\t}\n\n\n\tvoid gc_cairo_pattern (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcairo_pattern_t* pattern = (cairo_pattern_t*)val_data (handle);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects.erase (pattern);\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\tcairo_pattern_destroy (pattern);\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_cairo_pattern (HL_CFFIPointer* handle) {\n\n\t\tcairo_pattern_t* pattern = (cairo_pattern_t*)handle->ptr;\n\t\thandle->ptr = 0;\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects.erase (pattern);\n\t\tcairoObjects_Mutex.Unlock ();\n\t\tcairo_pattern_destroy (pattern);\n\n\t}\n\n\n\tvoid gc_cairo_surface (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcairo_surface_t* surface = (cairo_surface_t*)val_data (handle);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects.erase (surface);\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\tcairo_surface_destroy (surface);\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_cairo_surface (HL_CFFIPointer* handle) {\n\n\t\tcairo_surface_t* surface = (cairo_surface_t*)handle->ptr;\n\t\thandle->ptr = 0;\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects.erase (surface);\n\t\tcairoObjects_Mutex.Unlock ();\n\t\tcairo_surface_destroy (surface);\n\n\t}\n\n\n\tvoid gc_user_data (void* data) {\n\n\t\tValuePointer* reference = (ValuePointer*)data;\n\t\tdelete reference;\n\n\t}\n\n\n\tvoid lime_cairo_arc (value handle, double xc, double yc, double radius, double angle1, double angle2) {\n\n\t\tcairo_arc ((cairo_t*)val_data (handle), xc, yc, radius, angle1, angle2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_arc) (HL_CFFIPointer* handle, double xc, double yc, double radius, double angle1, double angle2) {\n\n\t\tcairo_arc ((cairo_t*)handle->ptr, xc, yc, radius, angle1, angle2);\n\n\t}\n\n\n\tvoid lime_cairo_arc_negative (value handle, double xc, double yc, double radius, double angle1, double angle2) {\n\n\t\tcairo_arc_negative ((cairo_t*)val_data (handle), xc, yc, radius, angle1, angle2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_arc_negative) (HL_CFFIPointer* handle, double xc, double yc, double radius, double angle1, double angle2) {\n\n\t\tcairo_arc_negative ((cairo_t*)handle->ptr, xc, yc, radius, angle1, angle2);\n\n\t}\n\n\n\tvoid lime_cairo_clip (value handle) {\n\n\t\tcairo_clip ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_clip) (HL_CFFIPointer* handle) {\n\n\t\tcairo_clip ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_clip_extents (value handle, double x1, double y1, double x2, double y2) {\n\n\t\tcairo_clip_extents ((cairo_t*)val_data (handle), &x1, &y1, &x2, &y2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_clip_extents) (HL_CFFIPointer* handle, double x1, double y1, double x2, double y2) {\n\n\t\tcairo_clip_extents ((cairo_t*)handle->ptr, &x1, &y1, &x2, &y2);\n\n\t}\n\n\n\tvoid lime_cairo_clip_preserve (value handle) {\n\n\t\tcairo_clip_preserve ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_clip_preserve) (HL_CFFIPointer* handle) {\n\n\t\tcairo_clip_preserve ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_close_path (value handle) {\n\n\t\tcairo_close_path ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_close_path) (HL_CFFIPointer* handle) {\n\n\t\tcairo_close_path ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_copy_page (value handle) {\n\n\t\tcairo_copy_page ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_copy_page) (HL_CFFIPointer* handle) {\n\n\t\tcairo_copy_page ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_create (value surface) {\n\n\t\tcairo_t* cairo = cairo_create ((cairo_surface_t*)val_data (surface));\n\n\t\tvalue object = CFFIPointer (cairo, gc_cairo);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[cairo] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_create) (HL_CFFIPointer* surface) {\n\n\t\tcairo_t* cairo = cairo_create ((cairo_surface_t*)surface->ptr);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (cairo, (hl_finalizer)hl_gc_cairo);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[cairo] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvoid lime_cairo_curve_to (value handle, double x1, double y1, double x2, double y2, double x3, double y3) {\n\n\t\tcairo_curve_to ((cairo_t*)val_data (handle), x1, y1, x2, y2, x3, y3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_curve_to) (HL_CFFIPointer* handle, double x1, double y1, double x2, double y2, double x3, double y3) {\n\n\t\tcairo_curve_to ((cairo_t*)handle->ptr, x1, y1, x2, y2, x3, y3);\n\n\t}\n\n\n\tvoid lime_cairo_fill (value handle) {\n\n\t\tcairo_fill ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_fill) (HL_CFFIPointer* handle) {\n\n\t\tcairo_fill ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_fill_extents (value handle, double x1, double y1, double x2, double y2) {\n\n\t\tcairo_fill_extents ((cairo_t*)val_data (handle), &x1, &y1, &x2, &y2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_fill_extents) (HL_CFFIPointer* handle, double x1, double y1, double x2, double y2) {\n\n\t\tcairo_fill_extents ((cairo_t*)handle->ptr, &x1, &y1, &x2, &y2);\n\n\t}\n\n\n\tvoid lime_cairo_fill_preserve (value handle) {\n\n\t\tcairo_fill_preserve ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_fill_preserve) (HL_CFFIPointer* handle) {\n\n\t\tcairo_fill_preserve ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_font_face_status (value handle) {\n\n\t\treturn cairo_font_face_status ((cairo_font_face_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_font_face_status) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_font_face_status ((cairo_font_face_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_font_options_create () {\n\n\t\tcairo_font_options_t* options = cairo_font_options_create ();\n\t\treturn CFFIPointer (options, gc_cairo_font_options);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_font_options_create) () {\n\n\t\tcairo_font_options_t* options = cairo_font_options_create ();\n\t\treturn HLCFFIPointer (options, (hl_finalizer)hl_gc_cairo_font_options);\n\n\t}\n\n\n\tint lime_cairo_font_options_get_antialias (value handle) {\n\n\t\treturn cairo_font_options_get_antialias ((cairo_font_options_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_font_options_get_antialias) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_font_options_get_antialias ((cairo_font_options_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_font_options_get_hint_metrics (value handle) {\n\n\t\treturn cairo_font_options_get_hint_metrics ((cairo_font_options_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_font_options_get_hint_metrics) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_font_options_get_hint_metrics ((cairo_font_options_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_font_options_get_hint_style (value handle) {\n\n\t\treturn cairo_font_options_get_hint_style ((cairo_font_options_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_font_options_get_hint_style) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_font_options_get_hint_style ((cairo_font_options_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_font_options_get_subpixel_order (value handle) {\n\n\t\treturn cairo_font_options_get_subpixel_order ((cairo_font_options_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_font_options_get_subpixel_order) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_font_options_get_subpixel_order ((cairo_font_options_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_font_options_set_antialias (value handle, int v) {\n\n\t\tcairo_font_options_set_antialias ((cairo_font_options_t*)val_data (handle), (cairo_antialias_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_font_options_set_antialias) (HL_CFFIPointer* handle, int v) {\n\n\t\tcairo_font_options_set_antialias ((cairo_font_options_t*)handle->ptr, (cairo_antialias_t)v);\n\n\t}\n\n\n\tvoid lime_cairo_font_options_set_hint_metrics (value handle, int v) {\n\n\t\tcairo_font_options_set_hint_metrics ((cairo_font_options_t*)val_data (handle), (cairo_hint_metrics_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_font_options_set_hint_metrics) (HL_CFFIPointer* handle, int v) {\n\n\t\tcairo_font_options_set_hint_metrics ((cairo_font_options_t*)handle->ptr, (cairo_hint_metrics_t)v);\n\n\t}\n\n\n\tvoid lime_cairo_font_options_set_hint_style (value handle, int v) {\n\n\t\tcairo_font_options_set_hint_style ((cairo_font_options_t*)val_data (handle), (cairo_hint_style_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_font_options_set_hint_style) (HL_CFFIPointer* handle, int v) {\n\n\t\tcairo_font_options_set_hint_style ((cairo_font_options_t*)handle->ptr, (cairo_hint_style_t)v);\n\n\t}\n\n\n\tvoid lime_cairo_font_options_set_subpixel_order (value handle, int v) {\n\n\t\tcairo_font_options_set_subpixel_order ((cairo_font_options_t*)val_data (handle), (cairo_subpixel_order_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_font_options_set_subpixel_order) (HL_CFFIPointer* handle, int v) {\n\n\t\tcairo_font_options_set_subpixel_order ((cairo_font_options_t*)handle->ptr, (cairo_subpixel_order_t)v);\n\n\t}\n\n\n\tvalue lime_cairo_ft_font_face_create (value face, int flags) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont* font = (Font*)val_data (face);\n\t\tcairo_font_face_t* cairoFont = cairo_ft_font_face_create_for_ft_face ((FT_Face)font->face, flags);\n\n\t\tValuePointer* fontReference = new ValuePointer (face);\n\t\tcairo_font_face_set_user_data (cairoFont, &userData, fontReference, gc_user_data);\n\n\t\tvalue object = CFFIPointer (cairoFont, gc_cairo_font_face);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[cairoFont] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_ft_font_face_create) (HL_CFFIPointer* face, int flags) {\n\n\t\t#ifdef LIME_FREETYPE\n\t\tFont* font = (Font*)face->ptr;\n\t\tcairo_font_face_t* cairoFont = cairo_ft_font_face_create_for_ft_face ((FT_Face)font->face, flags);\n\n\t\tValuePointer* fontReference = new ValuePointer ((vobj*)face);\n\t\tcairo_font_face_set_user_data (cairoFont, &userData, fontReference, gc_user_data);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (cairoFont, (hl_finalizer)hl_gc_cairo_font_face);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[cairoFont] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_cairo_get_antialias (value handle) {\n\n\t\treturn cairo_get_antialias ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_get_antialias) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_antialias ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_get_current_point (value handle) {\n\n\t\tdouble x, y;\n\t\tcairo_get_current_point ((cairo_t*)val_data (handle), &x, &y);\n\t\tVector2 vec2 = Vector2 (x, y);\n\t\treturn vec2.Value ();\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_cairo_get_current_point) (HL_CFFIPointer* handle, Vector2* out) {\n\n\t\tcairo_get_current_point ((cairo_t*)handle->ptr, &out->x, &out->y);\n\t\treturn out;\n\n\t}\n\n\n\tvalue lime_cairo_get_dash (value handle) {\n\n\t\tint length = cairo_get_dash_count ((cairo_t*)val_data (handle));\n\n\t\tdouble* dashes = new double[length];\n\t\tdouble offset;\n\n\t\tcairo_get_dash ((cairo_t*)val_data (handle), dashes, &offset);\n\n\t\tvalue result = alloc_array (length);\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_float (dashes[i]));\n\n\t\t}\n\n\t\tdelete[] dashes;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_cairo_get_dash) (HL_CFFIPointer* handle) {\n\n\t\tint length = cairo_get_dash_count ((cairo_t*)handle->ptr);\n\t\tvarray* result = hl_alloc_array (&hlt_f64, length);\n\t\tdouble offset;\n\n\t\tcairo_get_dash ((cairo_t*)handle->ptr, hl_aptr (result, double), &offset);\n\n\t\treturn result;\n\n\n\t}\n\n\n\tint lime_cairo_get_dash_count (value handle) {\n\n\t\treturn cairo_get_dash_count ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_get_dash_count) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_dash_count ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_get_fill_rule (value handle) {\n\n\t\treturn cairo_get_fill_rule ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_get_fill_rule) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_fill_rule ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_get_font_face (value handle) {\n\n\t\tcairo_font_face_t* face = cairo_get_font_face ((cairo_t*)val_data (handle));\n\n\t\tif (cairoObjects.find (face) != cairoObjects.end ()) {\n\n\t\t\treturn (value)cairoObjects[face];\n\n\t\t} else {\n\n\t\t\tcairo_font_face_reference (face);\n\n\t\t\tvalue object = CFFIPointer (face, gc_cairo_font_face);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[face] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_get_font_face) (HL_CFFIPointer* handle) {\n\n\t\tcairo_font_face_t* face = cairo_get_font_face ((cairo_t*)handle->ptr);\n\n\t\tif (cairoObjects.find (face) != cairoObjects.end ()) {\n\n\t\t\treturn (HL_CFFIPointer*)cairoObjects[face];\n\n\t\t} else {\n\n\t\t\tcairo_font_face_reference (face);\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (face, (hl_finalizer)hl_gc_cairo_font_face);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[face] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_cairo_get_font_options (value handle) {\n\n\t\tcairo_font_options_t* options = 0;\n\t\tcairo_get_font_options ((cairo_t*)val_data (handle), options);\n\t\treturn CFFIPointer (options, gc_cairo_font_options);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_get_font_options) (HL_CFFIPointer* handle) {\n\n\t\tcairo_font_options_t* options = 0;\n\t\tcairo_get_font_options ((cairo_t*)handle->ptr, options);\n\t\treturn HLCFFIPointer (options, (hl_finalizer)hl_gc_cairo_font_options);\n\n\t}\n\n\n\tvalue lime_cairo_get_group_target (value handle) {\n\n\t\tcairo_surface_t* surface = cairo_get_group_target ((cairo_t*)val_data (handle));\n\n\t\tif (cairoObjects.find (surface) != cairoObjects.end ()) {\n\n\t\t\treturn (value)cairoObjects[surface];\n\n\t\t} else {\n\n\t\t\tcairo_surface_reference (surface);\n\n\t\t\tvalue object = CFFIPointer (surface, gc_cairo_surface);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[surface] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_get_group_target) (HL_CFFIPointer* handle) {\n\n\t\tcairo_surface_t* surface = cairo_get_group_target ((cairo_t*)handle->ptr);\n\n\t\tif (cairoObjects.find (surface) != cairoObjects.end ()) {\n\n\t\t\treturn (HL_CFFIPointer*)cairoObjects[surface];\n\n\t\t} else {\n\n\t\t\tcairo_surface_reference (surface);\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (surface, (hl_finalizer)hl_gc_cairo_surface);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[surface] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tint lime_cairo_get_line_cap (value handle) {\n\n\t\treturn cairo_get_line_cap ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_get_line_cap) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_line_cap ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_get_line_join (value handle) {\n\n\t\treturn cairo_get_line_join ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_get_line_join) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_line_join ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tdouble lime_cairo_get_line_width (value handle) {\n\n\t\treturn cairo_get_line_width ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_cairo_get_line_width) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_line_width ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_get_matrix (value handle) {\n\n\t\tcairo_matrix_t cm;\n\t\tcairo_get_matrix ((cairo_t*)val_data (handle), &cm);\n\t\tMatrix3 mat3 = Matrix3 (cm.xx, cm.yx, cm.xy, cm.yy, cm.x0, cm.y0);\n\t\treturn mat3.Value ();\n\n\t}\n\n\n\tHL_PRIM Matrix3* HL_NAME(hl_cairo_get_matrix) (HL_CFFIPointer* handle, Matrix3* out) {\n\n\t\t// cairo_matrix_t cm;\n\t\t// cairo_get_matrix ((cairo_t*)handle->ptr, &cm);\n\t\t// out->a = cm.xx;\n\t\t// out->b = cm.yx;\n\t\t// out->c = cm.xy;\n\t\t// out->d = cm.yy;\n\t\t// out->tx = cm.x0;\n\t\t// out->ty = cm.y0;\n\t\tcairo_get_matrix ((cairo_t*)handle->ptr, (cairo_matrix_t*)&out->a);\n\t\treturn out;\n\n\t}\n\n\n\tdouble lime_cairo_get_miter_limit (value handle) {\n\n\t\treturn cairo_get_miter_limit ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_cairo_get_miter_limit) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_miter_limit ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_get_operator (value handle) {\n\n\t\treturn cairo_get_operator ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_get_operator) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_operator ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_get_source (value handle) {\n\n\t\tcairo_pattern_t* pattern = cairo_get_source ((cairo_t*)val_data (handle));\n\n\t\tif (cairoObjects.find (pattern) != cairoObjects.end ()) {\n\n\t\t\treturn (value)cairoObjects[pattern];\n\n\t\t} else {\n\n\t\t\tcairo_pattern_reference (pattern);\n\n\t\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[pattern] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_get_source) (HL_CFFIPointer* handle) {\n\n\t\tcairo_pattern_t* pattern = cairo_get_source ((cairo_t*)handle->ptr);\n\n\t\tif (cairoObjects.find (pattern) != cairoObjects.end ()) {\n\n\t\t\treturn (HL_CFFIPointer*)cairoObjects[pattern];\n\n\t\t} else {\n\n\t\t\tcairo_pattern_reference (pattern);\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[pattern] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_cairo_get_target (value handle) {\n\n\t\tcairo_surface_t* surface = cairo_get_target ((cairo_t*)val_data (handle));\n\n\t\tif (cairoObjects.find (surface) != cairoObjects.end ()) {\n\n\t\t\treturn (value)cairoObjects[surface];\n\n\t\t} else {\n\n\t\t\tcairo_surface_reference (surface);\n\n\t\t\tvalue object = CFFIPointer (surface, gc_cairo_surface);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[surface] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_get_target) (HL_CFFIPointer* handle) {\n\n\t\tcairo_surface_t* surface = cairo_get_target ((cairo_t*)handle->ptr);\n\n\t\tif (cairoObjects.find (surface) != cairoObjects.end ()) {\n\n\t\t\treturn (HL_CFFIPointer*)cairoObjects[surface];\n\n\t\t} else {\n\n\t\t\tcairo_surface_reference (surface);\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (surface, (hl_finalizer)hl_gc_cairo_surface);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[surface] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tdouble lime_cairo_get_tolerance (value handle) {\n\n\t\treturn cairo_get_tolerance ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_cairo_get_tolerance) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_get_tolerance ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tbool lime_cairo_has_current_point (value handle) {\n\n\t\treturn cairo_has_current_point ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_cairo_has_current_point) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_has_current_point ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_identity_matrix (value handle) {\n\n\t\tcairo_identity_matrix ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_identity_matrix) (HL_CFFIPointer* handle) {\n\n\t\tcairo_identity_matrix ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_image_surface_create (int format, int width, int height) {\n\n\t\tcairo_surface_t* surface = cairo_image_surface_create ((cairo_format_t)format, width, height);\n\n\t\tvalue object = CFFIPointer (surface, gc_cairo_surface);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[surface] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_image_surface_create) (int format, int width, int height) {\n\n\t\tcairo_surface_t* surface = cairo_image_surface_create ((cairo_format_t)format, width, height);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (surface, (hl_finalizer)hl_gc_cairo_surface);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[surface] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvalue lime_cairo_image_surface_create_for_data (double data, int format, int width, int height, int stride) {\n\n\t\tcairo_surface_t* surface = cairo_image_surface_create_for_data ((unsigned char*)(uintptr_t)data, (cairo_format_t)format, width, height, stride);\n\n\t\tvalue object = CFFIPointer (surface, gc_cairo_surface);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[surface] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_image_surface_create_for_data) (double data, int format, int width, int height, int stride) {\n\n\t\tcairo_surface_t* surface = cairo_image_surface_create_for_data ((unsigned char*)(uintptr_t)data, (cairo_format_t)format, width, height, stride);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (surface, (hl_finalizer)hl_gc_cairo_surface);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[surface] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tdouble lime_cairo_image_surface_get_data (value handle) {\n\n\t\treturn (uintptr_t)cairo_image_surface_get_data ((cairo_surface_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_cairo_image_surface_get_data) (HL_CFFIPointer* handle) {\n\n\t\treturn (uintptr_t)cairo_image_surface_get_data ((cairo_surface_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_image_surface_get_format (value handle) {\n\n\t\treturn (int)cairo_image_surface_get_format ((cairo_surface_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_image_surface_get_format) (HL_CFFIPointer* handle) {\n\n\t\treturn (int)cairo_image_surface_get_format ((cairo_surface_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_image_surface_get_height (value handle) {\n\n\t\treturn cairo_image_surface_get_height ((cairo_surface_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_image_surface_get_height) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_image_surface_get_height ((cairo_surface_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_image_surface_get_stride (value handle) {\n\n\t\treturn cairo_image_surface_get_stride ((cairo_surface_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_image_surface_get_stride) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_image_surface_get_stride ((cairo_surface_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_image_surface_get_width (value handle) {\n\n\t\treturn cairo_image_surface_get_width ((cairo_surface_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_image_surface_get_width) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_image_surface_get_width ((cairo_surface_t*)handle->ptr);\n\n\t}\n\n\n\tbool lime_cairo_in_clip (value handle, double x, double y) {\n\n\t\treturn cairo_in_clip ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_cairo_in_clip) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\treturn cairo_in_clip ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tbool lime_cairo_in_fill (value handle, double x, double y) {\n\n\t\treturn cairo_in_fill ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_cairo_in_fill) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\treturn cairo_in_fill ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tbool lime_cairo_in_stroke (value handle, double x, double y) {\n\n\t\treturn cairo_in_stroke ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_cairo_in_stroke) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\treturn cairo_in_stroke ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tvoid lime_cairo_line_to (value handle, double x, double y) {\n\n\t\tcairo_line_to ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_line_to) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\tcairo_line_to ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tvoid lime_cairo_mask (value handle, value pattern) {\n\n\t\tcairo_mask ((cairo_t*)val_data (handle), (cairo_pattern_t*)val_data (pattern));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_mask) (HL_CFFIPointer* handle, HL_CFFIPointer* pattern) {\n\n\t\tcairo_mask ((cairo_t*)handle->ptr, (cairo_pattern_t*)pattern->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_mask_surface (value handle, value surface, double x, double y) {\n\n\t\tcairo_mask_surface ((cairo_t*)val_data (handle), (cairo_surface_t*)val_data (surface), x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_mask_surface) (HL_CFFIPointer* handle, HL_CFFIPointer* surface, double x, double y) {\n\n\t\tcairo_mask_surface ((cairo_t*)handle->ptr, (cairo_surface_t*)surface->ptr, x, y);\n\n\t}\n\n\n\tvoid lime_cairo_move_to (value handle, double x, double y) {\n\n\t\tcairo_move_to ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_move_to) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\tcairo_move_to ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tvoid lime_cairo_new_path (value handle) {\n\n\t\tcairo_new_path ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_new_path) (HL_CFFIPointer* handle) {\n\n\t\tcairo_new_path ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_paint (value handle) {\n\n\t\tcairo_paint ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_paint) (HL_CFFIPointer* handle) {\n\n\t\tcairo_paint ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_paint_with_alpha (value handle, double alpha) {\n\n\t\tcairo_paint_with_alpha ((cairo_t*)val_data (handle), alpha);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_paint_with_alpha) (HL_CFFIPointer* handle, double alpha) {\n\n\t\tcairo_paint_with_alpha ((cairo_t*)handle->ptr, alpha);\n\n\t}\n\n\n\tvoid lime_cairo_pattern_add_color_stop_rgb (value handle, double offset, double red, double green, double blue) {\n\n\t\tcairo_pattern_add_color_stop_rgb ((cairo_pattern_t*)val_data (handle), offset, red, green, blue);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_pattern_add_color_stop_rgb) (HL_CFFIPointer* handle, double offset, double red, double green, double blue) {\n\n\t\tcairo_pattern_add_color_stop_rgb ((cairo_pattern_t*)handle->ptr, offset, red, green, blue);\n\n\t}\n\n\n\tvoid lime_cairo_pattern_add_color_stop_rgba (value handle, double offset, double red, double green, double blue, double alpha) {\n\n\t\tcairo_pattern_add_color_stop_rgba ((cairo_pattern_t*)val_data (handle), offset, red, green, blue, alpha);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_pattern_add_color_stop_rgba) (HL_CFFIPointer* handle, double offset, double red, double green, double blue, double alpha) {\n\n\t\tcairo_pattern_add_color_stop_rgba ((cairo_pattern_t*)handle->ptr, offset, red, green, blue, alpha);\n\n\t}\n\n\n\tvalue lime_cairo_pattern_create_for_surface (value surface) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_for_surface ((cairo_surface_t*)val_data (surface));\n\n\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_pattern_create_for_surface) (HL_CFFIPointer* surface) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_for_surface ((cairo_surface_t*)surface->ptr);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvalue lime_cairo_pattern_create_linear (double x0, double y0, double x1, double y1) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_linear (x0, y0, x1, y1);\n\n\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_pattern_create_linear) (double x0, double y0, double x1, double y1) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_linear (x0, y0, x1, y1);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvalue lime_cairo_pattern_create_radial (double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_radial (cx0, cy0, radius0, cx1, cy1, radius1);\n\n\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_pattern_create_radial) (double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_radial (cx0, cy0, radius0, cx1, cy1, radius1);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvalue lime_cairo_pattern_create_rgb (double r, double g, double b) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_rgb (r, g, b);\n\n\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_pattern_create_rgb) (double r, double g, double b) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_rgb (r, g, b);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvalue lime_cairo_pattern_create_rgba (double r, double g, double b, double a) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_rgba (r, g, b, a);\n\n\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_pattern_create_rgba) (double r, double g, double b, double a) {\n\n\t\tcairo_pattern_t* pattern = cairo_pattern_create_rgba (r, g, b, a);\n\n\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\tcairoObjects_Mutex.Lock ();\n\t\tcairoObjects[pattern] = object;\n\t\tcairoObjects_Mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tint lime_cairo_pattern_get_color_stop_count (value handle) {\n\n\t\tint count;\n\t\tcairo_pattern_get_color_stop_count ((cairo_pattern_t*)val_data (handle), &count);\n\t\treturn count;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_pattern_get_color_stop_count) (HL_CFFIPointer* handle) {\n\n\t\tint count;\n\t\tcairo_pattern_get_color_stop_count ((cairo_pattern_t*)handle->ptr, &count);\n\t\treturn count;\n\n\t}\n\n\n\tint lime_cairo_pattern_get_extend (value handle) {\n\n\t\treturn cairo_pattern_get_extend ((cairo_pattern_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_pattern_get_extend) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_pattern_get_extend ((cairo_pattern_t*)handle->ptr);\n\n\t}\n\n\n\tint lime_cairo_pattern_get_filter (value handle) {\n\n\t\treturn cairo_pattern_get_filter ((cairo_pattern_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_pattern_get_filter) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_pattern_get_filter ((cairo_pattern_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_cairo_pattern_get_matrix (value handle) {\n\n\t\tcairo_matrix_t cm;\n\t\tcairo_pattern_get_matrix ((cairo_pattern_t*)val_data (handle), &cm);\n\t\tMatrix3 mat3 = Matrix3 (cm.xx, cm.yx, cm.xy, cm.yy, cm.x0, cm.y0);\n\t\treturn mat3.Value ();\n\n\t}\n\n\n\tHL_PRIM Matrix3* HL_NAME(hl_cairo_pattern_get_matrix) (HL_CFFIPointer* handle, Matrix3* out) {\n\n\t\t// cairo_matrix_t cm;\n\t\t// cairo_pattern_get_matrix ((cairo_pattern_t*)handle->ptr, &cm);\n\t\t// out->a = cm.xx;\n\t\t// out->b = cm.yx;\n\t\t// out->c = cm.xy;\n\t\t// out->d = cm.yy;\n\t\t// out->tx = cm.x0;\n\t\t// out->ty = cm.y0;\n\t\tcairo_pattern_get_matrix ((cairo_pattern_t*)handle->ptr, (cairo_matrix_t*)&out->a);\n\t\treturn out;\n\n\t}\n\n\n\tvoid lime_cairo_pattern_set_extend (value handle, int extend) {\n\n\t\tcairo_pattern_set_extend ((cairo_pattern_t*)val_data (handle), (cairo_extend_t)extend);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_pattern_set_extend) (HL_CFFIPointer* handle, int extend) {\n\n\t\tcairo_pattern_set_extend ((cairo_pattern_t*)handle->ptr, (cairo_extend_t)extend);\n\n\t}\n\n\n\tvoid lime_cairo_pattern_set_filter (value handle, int filter) {\n\n\t\tcairo_pattern_set_filter ((cairo_pattern_t*)val_data (handle), (cairo_filter_t)filter);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_pattern_set_filter) (HL_CFFIPointer* handle, int filter) {\n\n\t\tcairo_pattern_set_filter ((cairo_pattern_t*)handle->ptr, (cairo_filter_t)filter);\n\n\t}\n\n\n\tvoid lime_cairo_pattern_set_matrix (value handle, value matrix) {\n\n\t\tMatrix3 mat3 = Matrix3 (matrix);\n\n\t\tcairo_matrix_t cm;\n\t\tcairo_matrix_init (&cm, mat3.a, mat3.b, mat3.c, mat3.d, mat3.tx, mat3.ty);\n\n\t\tcairo_pattern_set_matrix ((cairo_pattern_t*)val_data (handle), &cm);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_pattern_set_matrix) (HL_CFFIPointer* handle, Matrix3* matrix) {\n\n\t\t// cairo_matrix_t cm;\n\t\t// cairo_matrix_init (&cm, mat3.a, mat3.b, mat3.c, mat3.d, mat3.tx, mat3.ty);\n\n\t\t// cairo_pattern_set_matrix ((cairo_pattern_t*)handle->ptr, &cm);\n\n\t\tcairo_pattern_set_matrix ((cairo_pattern_t*)handle->ptr, (cairo_matrix_t*)&matrix->a);\n\n\t}\n\n\n\tvalue lime_cairo_pop_group (value handle) {\n\n\t\tcairo_pattern_t* pattern = cairo_pop_group ((cairo_t*)val_data (handle));\n\n\t\tif (cairoObjects.find (pattern) != cairoObjects.end ()) {\n\n\t\t\treturn (value)cairoObjects[pattern];\n\n\t\t} else {\n\n\t\t\tcairo_pattern_reference (pattern);\n\n\t\t\tvalue object = CFFIPointer (pattern, gc_cairo_pattern);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[pattern] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_cairo_pop_group) (HL_CFFIPointer* handle) {\n\n\t\tcairo_pattern_t* pattern = cairo_pop_group ((cairo_t*)handle->ptr);\n\n\t\tif (cairoObjects.find (pattern) != cairoObjects.end ()) {\n\n\t\t\treturn (HL_CFFIPointer*)cairoObjects[pattern];\n\n\t\t} else {\n\n\t\t\tcairo_pattern_reference (pattern);\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (pattern, (hl_finalizer)hl_gc_cairo_pattern);\n\t\t\tcairoObjects_Mutex.Lock ();\n\t\t\tcairoObjects[pattern] = object;\n\t\t\tcairoObjects_Mutex.Unlock ();\n\t\t\treturn object;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_cairo_pop_group_to_source (value handle) {\n\n\t\tcairo_pop_group_to_source ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_pop_group_to_source) (HL_CFFIPointer* handle) {\n\n\t\tcairo_pop_group_to_source ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_push_group (value handle) {\n\n\t\tcairo_push_group ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_push_group) (HL_CFFIPointer* handle) {\n\n\t\tcairo_push_group ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_push_group_with_content (value handle, int content) {\n\n\t\tcairo_push_group_with_content ((cairo_t*)val_data (handle), (cairo_content_t)content);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_push_group_with_content) (HL_CFFIPointer* handle, int content) {\n\n\t\tcairo_push_group_with_content ((cairo_t*)handle->ptr, (cairo_content_t)content);\n\n\t}\n\n\n\tvoid lime_cairo_rectangle (value handle, double x, double y, double width, double height) {\n\n\t\tcairo_rectangle ((cairo_t*)val_data (handle), x, y, width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_rectangle) (HL_CFFIPointer* handle, double x, double y, double width, double height) {\n\n\t\tcairo_rectangle ((cairo_t*)handle->ptr, x, y, width, height);\n\n\t}\n\n\n\tvoid lime_cairo_rel_curve_to (value handle, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) {\n\n\t\tcairo_rel_curve_to ((cairo_t*)val_data (handle), dx1, dy1, dx2, dy2, dx3, dy3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_rel_curve_to) (HL_CFFIPointer* handle, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) {\n\n\t\tcairo_rel_curve_to ((cairo_t*)handle->ptr, dx1, dy1, dx2, dy2, dx3, dy3);\n\n\t}\n\n\n\tvoid lime_cairo_rel_line_to (value handle, double dx, double dy) {\n\n\t\tcairo_rel_line_to ((cairo_t*)val_data (handle), dx, dy);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_rel_line_to) (HL_CFFIPointer* handle, double dx, double dy) {\n\n\t\tcairo_rel_line_to ((cairo_t*)handle->ptr, dx, dy);\n\n\t}\n\n\n\tvoid lime_cairo_rel_move_to (value handle, double dx, double dy) {\n\n\t\tcairo_rel_move_to ((cairo_t*)val_data (handle), dx, dy);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_rel_move_to) (HL_CFFIPointer* handle, double dx, double dy) {\n\n\t\tcairo_rel_move_to ((cairo_t*)handle->ptr, dx, dy);\n\n\t}\n\n\n\tvoid lime_cairo_reset_clip (value handle) {\n\n\t\tcairo_reset_clip ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_reset_clip) (HL_CFFIPointer* handle) {\n\n\t\tcairo_reset_clip ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_restore (value handle) {\n\n\t\tcairo_restore ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_restore) (HL_CFFIPointer* handle) {\n\n\t\tcairo_restore ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_rotate (value handle, double amount) {\n\n\t\tcairo_rotate ((cairo_t*)val_data (handle), amount);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_rotate) (HL_CFFIPointer* handle, double amount) {\n\n\t\tcairo_rotate ((cairo_t*)handle->ptr, amount);\n\n\t}\n\n\n\tvoid lime_cairo_save (value handle) {\n\n\t\tcairo_save ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_save) (HL_CFFIPointer* handle) {\n\n\t\tcairo_save ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_scale (value handle, double x, double y) {\n\n\t\tcairo_scale ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_scale) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\tcairo_scale ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tvoid lime_cairo_set_antialias (value handle, int cap) {\n\n\t\tcairo_set_antialias ((cairo_t*)val_data (handle), (cairo_antialias_t)cap);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_antialias) (HL_CFFIPointer* handle, int cap) {\n\n\t\tcairo_set_antialias ((cairo_t*)handle->ptr, (cairo_antialias_t)cap);\n\n\t}\n\n\n\tvoid lime_cairo_set_dash (value handle, value dash) {\n\n\t\tint length = val_array_size (dash);\n\n\t\tdouble* dashPattern = new double[length];\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tdashPattern[i] = val_number (val_array_i (dash, i));\n\n\t\t}\n\n\t\tcairo_set_dash ((cairo_t*)val_data (handle), dashPattern, length, 0);\n\t\tdelete[] dashPattern;\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_dash) (HL_CFFIPointer* handle, varray* dash) {\n\n\t\tcairo_set_dash ((cairo_t*)handle->ptr, hl_aptr (dash, double), dash->size, 0);\n\n\t}\n\n\n\tvoid lime_cairo_set_fill_rule (value handle, int cap) {\n\n\t\tcairo_set_fill_rule ((cairo_t*)val_data (handle), (cairo_fill_rule_t)cap);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_fill_rule) (HL_CFFIPointer* handle, int cap) {\n\n\t\tcairo_set_fill_rule ((cairo_t*)handle->ptr, (cairo_fill_rule_t)cap);\n\n\t}\n\n\n\tvoid lime_cairo_set_font_face (value handle, value face) {\n\n\t\tcairo_set_font_face ((cairo_t*)val_data (handle), (cairo_font_face_t*)val_data (face));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_font_face) (HL_CFFIPointer* handle, HL_CFFIPointer* face) {\n\n\t\tcairo_set_font_face ((cairo_t*)handle->ptr, (cairo_font_face_t*)face->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_set_font_options (value handle, value options) {\n\n\t\tcairo_set_font_options ((cairo_t*)val_data (handle), (cairo_font_options_t*)val_data (options));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_font_options) (HL_CFFIPointer* handle, HL_CFFIPointer* options) {\n\n\t\tcairo_set_font_options ((cairo_t*)handle->ptr, (cairo_font_options_t*)options->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_set_font_size (value handle, double size) {\n\n\t\tcairo_font_face_t* face = cairo_get_font_face ((cairo_t*)val_data (handle));\n\n\t\tif (face) {\n\n\t\t\tcairo_font_type_t type = cairo_font_face_get_type (face);\n\n\t\t\tif (type == CAIRO_FONT_TYPE_FT) {\n\n\t\t\t\tValuePointer* fontReference = (ValuePointer*)cairo_font_face_get_user_data (face, &userData);\n\n\t\t\t\tif (fontReference) {\n\n\t\t\t\t\tFont* font = (Font*)val_data ((value)fontReference->Get ());\n\t\t\t\t\tfont->SetSize (size, 72);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tcairo_set_font_size ((cairo_t*)val_data (handle), size);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_font_size) (HL_CFFIPointer* handle, double size) {\n\n\t\tcairo_font_face_t* face = cairo_get_font_face ((cairo_t*)handle->ptr);\n\n\t\tif (face) {\n\n\t\t\tcairo_font_type_t type = cairo_font_face_get_type (face);\n\n\t\t\tif (type == CAIRO_FONT_TYPE_FT) {\n\n\t\t\t\tValuePointer* fontReference = (ValuePointer*)cairo_font_face_get_user_data (face, &userData);\n\n\t\t\t\tif (fontReference) {\n\n\t\t\t\t\tFont* font = (Font*)((HL_CFFIPointer*)fontReference->Get ())->ptr;\n\t\t\t\t\tfont->SetSize (size, 72);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tcairo_set_font_size ((cairo_t*)handle->ptr, size);\n\n\t}\n\n\n\tvoid lime_cairo_set_line_cap (value handle, int cap) {\n\n\t\tcairo_set_line_cap ((cairo_t*)val_data (handle), (cairo_line_cap_t)cap);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_line_cap) (HL_CFFIPointer* handle, int cap) {\n\n\t\tcairo_set_line_cap ((cairo_t*)handle->ptr, (cairo_line_cap_t)cap);\n\n\t}\n\n\n\tvoid lime_cairo_set_line_join (value handle, int join) {\n\n\t\tcairo_set_line_join ((cairo_t*)val_data (handle), (cairo_line_join_t)join);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_line_join) (HL_CFFIPointer* handle, int join) {\n\n\t\tcairo_set_line_join ((cairo_t*)handle->ptr, (cairo_line_join_t)join);\n\n\t}\n\n\n\tvoid lime_cairo_set_line_width (value handle, double width) {\n\n\t\tcairo_set_line_width ((cairo_t*)val_data (handle), width);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_line_width) (HL_CFFIPointer* handle, double width) {\n\n\t\tcairo_set_line_width ((cairo_t*)handle->ptr, width);\n\n\t}\n\n\n\tvoid lime_cairo_set_matrix (value handle, double a, double b, double c, double d, double tx, double ty) {\n\n\t\tcairo_matrix_t cm;\n\t\tcairo_matrix_init (&cm, a, b, c, d, tx, ty);\n\n\t\tcairo_set_matrix ((cairo_t*)val_data (handle), &cm);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_matrix) (HL_CFFIPointer* handle, Matrix3* matrix) {\n\n\t\t// cairo_matrix_t cm;\n\t\t// cairo_matrix_init (&cm, a, b, c, d, tx, ty);\n\n\t\tcairo_set_matrix ((cairo_t*)handle->ptr, (cairo_matrix_t*)&matrix->a);\n\n\t}\n\n\n\t/*void lime_cairo_set_matrix (value handle, value matrix) {\n\n\t\tMatrix3 mat3 = Matrix3 (matrix);\n\n\t\tcairo_matrix_t cm;\n\t\tcairo_matrix_init (&cm, mat3.a, mat3.b, mat3.c, mat3.d, mat3.tx, mat3.ty);\n\n\t\tcairo_set_matrix ((cairo_t*)val_data (handle), &cm);\n\n\t}*/\n\n\n\tvoid lime_cairo_set_miter_limit (value handle, double miterLimit) {\n\n\t\tcairo_set_miter_limit ((cairo_t*)val_data (handle), miterLimit);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_miter_limit) (HL_CFFIPointer* handle, double miterLimit) {\n\n\t\tcairo_set_miter_limit ((cairo_t*)handle->ptr, miterLimit);\n\n\t}\n\n\n\tvoid lime_cairo_set_operator (value handle, int op) {\n\n\t\tcairo_set_operator ((cairo_t*)val_data (handle), (cairo_operator_t)op);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_operator) (HL_CFFIPointer* handle, int op) {\n\n\t\tcairo_set_operator ((cairo_t*)handle->ptr, (cairo_operator_t)op);\n\n\t}\n\n\n\tvoid lime_cairo_set_source (value handle, value pattern) {\n\n\t\tcairo_set_source ((cairo_t*)val_data (handle), (cairo_pattern_t*)val_data (pattern));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_source) (HL_CFFIPointer* handle, HL_CFFIPointer* pattern) {\n\n\t\tcairo_set_source ((cairo_t*)handle->ptr, (cairo_pattern_t*)pattern->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_set_source_rgb (value handle, double r, double g, double b) {\n\n\t\tcairo_set_source_rgb ((cairo_t*)val_data (handle), r, g, b);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_source_rgb) (HL_CFFIPointer* handle, double r, double g, double b) {\n\n\t\tcairo_set_source_rgb ((cairo_t*)handle->ptr, r, g, b);\n\n\t}\n\n\n\tvoid lime_cairo_set_source_rgba (value handle, double r, double g, double b, double a) {\n\n\t\tcairo_set_source_rgba ((cairo_t*)val_data (handle), r, g, b, a);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_source_rgba) (HL_CFFIPointer* handle, double r, double g, double b, double a) {\n\n\t\tcairo_set_source_rgba ((cairo_t*)handle->ptr, r, g, b, a);\n\n\t}\n\n\n\tvoid lime_cairo_set_source_surface (value handle, value surface, double x, double y) {\n\n\t\tcairo_set_source_surface ((cairo_t*)val_data (handle), (cairo_surface_t*)val_data (surface), x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_source_surface) (HL_CFFIPointer* handle, HL_CFFIPointer* surface, double x, double y) {\n\n\t\tcairo_set_source_surface ((cairo_t*)handle->ptr, (cairo_surface_t*)surface->ptr, x, y);\n\n\t}\n\n\n\tvoid lime_cairo_set_tolerance (value handle, double tolerance) {\n\n\t\tcairo_set_tolerance ((cairo_t*)val_data (handle), tolerance);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_set_tolerance) (HL_CFFIPointer* handle, double tolerance) {\n\n\t\tcairo_set_tolerance ((cairo_t*)handle->ptr, tolerance);\n\n\t}\n\n\n\tvoid lime_cairo_show_glyphs (value handle, value glyphs) {\n\n\t\tif (!init) {\n\n\t\t\tid_index = val_id (\"index\");\n\t\t\tid_x = val_id (\"x\");\n\t\t\tid_y = val_id (\"y\");\n\n\t\t}\n\n\t\tint length = val_array_size (glyphs);\n\t\tcairo_glyph_t* _glyphs = cairo_glyph_allocate (length);\n\n\t\tvalue glyph;\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tglyph = val_array_i (glyphs, i);\n\t\t\t_glyphs[i].index = val_int (val_field (glyph, id_index));\n\t\t\t_glyphs[i].x = val_number (val_field (glyph, id_x));\n\t\t\t_glyphs[i].y = val_number (val_field (glyph, id_y));\n\n\t\t}\n\n\t\tcairo_show_glyphs ((cairo_t*)val_data (handle), _glyphs, length);\n\t\tcairo_glyph_free (_glyphs);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_show_glyphs) (HL_CFFIPointer* handle, varray* glyphs) {\n\n\t\tconst int id_index = hl_hash_utf8 (\"index\");\n\t\tconst int id_x = hl_hash_utf8 (\"x\");\n\t\tconst int id_y = hl_hash_utf8 (\"y\");\n\n\t\tint length = glyphs->size;\n\t\tHL_CairoGlyph** glyphData = hl_aptr (glyphs, HL_CairoGlyph*);\n\t\tcairo_glyph_t* _glyphs = cairo_glyph_allocate (length);\n\n\t\tHL_CairoGlyph* glyph;\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tglyph = *glyphData++;\n\t\t\t_glyphs[i].index = glyph->index;\n\t\t\t_glyphs[i].x = glyph->x;\n\t\t\t_glyphs[i].y = glyph->y;\n\n\t\t}\n\n\t\tcairo_show_glyphs ((cairo_t*)handle->ptr, _glyphs, length);\n\t\tcairo_glyph_free (_glyphs);\n\n\t}\n\n\n\tvoid lime_cairo_show_page (value handle) {\n\n\t\tcairo_show_page ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_show_page) (HL_CFFIPointer* handle) {\n\n\t\tcairo_show_page ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_show_text (value handle, HxString text) {\n\n\t\tcairo_show_text ((cairo_t*)val_data (handle), (char*)text.__s);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_show_text) (HL_CFFIPointer* handle, hl_vstring* text) {\n\n\t\tcairo_show_text ((cairo_t*)handle->ptr, (char*)hl_to_utf8 ((const uchar*)text->bytes));\n\n\t}\n\n\n\tint lime_cairo_status (value handle) {\n\n\t\treturn cairo_status ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_status) (HL_CFFIPointer* handle) {\n\n\t\treturn cairo_status ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_stroke (value handle) {\n\n\t\tcairo_stroke ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_stroke) (HL_CFFIPointer* handle) {\n\n\t\tcairo_stroke ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_stroke_extents (value handle, double x1, double y1, double x2, double y2) {\n\n\t\tcairo_stroke_extents ((cairo_t*)val_data (handle), &x1, &y1, &x2, &y2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_stroke_extents) (HL_CFFIPointer* handle, double x1, double y1, double x2, double y2) {\n\n\t\tcairo_stroke_extents ((cairo_t*)handle->ptr, &x1, &y1, &x2, &y2);\n\n\t}\n\n\n\tvoid lime_cairo_stroke_preserve (value handle) {\n\n\t\tcairo_stroke_preserve ((cairo_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_stroke_preserve) (HL_CFFIPointer* handle) {\n\n\t\tcairo_stroke_preserve ((cairo_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_surface_flush (value handle) {\n\n\t\tcairo_surface_flush ((cairo_surface_t*)val_data (handle));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_surface_flush) (HL_CFFIPointer* handle) {\n\n\t\tcairo_surface_flush ((cairo_surface_t*)handle->ptr);\n\n\t}\n\n\n\tvoid lime_cairo_text_path (value handle, HxString text) {\n\n\t\tcairo_text_path ((cairo_t*)val_data (handle), (char*)text.__s);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_text_path) (HL_CFFIPointer* handle, hl_vstring* text) {\n\n\t\tcairo_text_path ((cairo_t*)handle->ptr, (char*)hl_to_utf8 ((const uchar*)text->bytes));\n\n\t}\n\n\n\tvoid lime_cairo_transform (value handle, value matrix) {\n\n\t\tMatrix3 mat3 = Matrix3 (matrix);\n\n\t\tcairo_matrix_t cm;\n\t\tcairo_matrix_init (&cm, mat3.a, mat3.b, mat3.c, mat3.d, mat3.tx, mat3.ty);\n\n\t\tcairo_transform ((cairo_t*)val_data (handle), &cm);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_transform) (HL_CFFIPointer* handle, Matrix3* matrix) {\n\n\t\t// cairo_matrix_t cm;\n\t\t// cairo_matrix_init (&cm, mat3.a, mat3.b, mat3.c, mat3.d, mat3.tx, mat3.ty);\n\n\t\t// cairo_transform ((cairo_t*)handle->ptr, &cm);\n\n\t\tcairo_transform ((cairo_t*)handle->ptr, (cairo_matrix_t*)&matrix->a);\n\n\t}\n\n\n\tvoid lime_cairo_translate (value handle, double x, double y) {\n\n\t\tcairo_translate ((cairo_t*)val_data (handle), x, y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_cairo_translate) (HL_CFFIPointer* handle, double x, double y) {\n\n\t\tcairo_translate ((cairo_t*)handle->ptr, x, y);\n\n\t}\n\n\n\tint lime_cairo_version () {\n\n\t\treturn cairo_version ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_cairo_version) () {\n\n\t\treturn cairo_version ();\n\n\t}\n\n\n\tHxString lime_cairo_version_string () {\n\n\t\tconst char* version = cairo_version_string ();\n\t\treturn version ? HxString (version) : HxString (0, 0);\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_cairo_version_string) () {\n\n\t\tconst char* version = cairo_version_string ();\n\t\tint length = strlen (version);\n\t\tchar* _version = (char*)malloc (length + 1);\n\t\tstrcpy (_version, version);\n\t\treturn (vbyte*)_version;\n\n\t}\n\n\n\tDEFINE_PRIME6v (lime_cairo_arc);\n\tDEFINE_PRIME6v (lime_cairo_arc_negative);\n\tDEFINE_PRIME1v (lime_cairo_clip);\n\tDEFINE_PRIME5v (lime_cairo_clip_extents);\n\tDEFINE_PRIME1v (lime_cairo_clip_preserve);\n\tDEFINE_PRIME1v (lime_cairo_close_path);\n\tDEFINE_PRIME1v (lime_cairo_copy_page);\n\tDEFINE_PRIME1 (lime_cairo_create);\n\tDEFINE_PRIME7v (lime_cairo_curve_to);\n\tDEFINE_PRIME1v (lime_cairo_fill);\n\tDEFINE_PRIME5v (lime_cairo_fill_extents);\n\tDEFINE_PRIME1v (lime_cairo_fill_preserve);\n\tDEFINE_PRIME2 (lime_cairo_ft_font_face_create);\n\tDEFINE_PRIME1 (lime_cairo_font_face_status);\n\tDEFINE_PRIME0 (lime_cairo_font_options_create);\n\tDEFINE_PRIME1 (lime_cairo_font_options_get_antialias);\n\tDEFINE_PRIME1 (lime_cairo_font_options_get_subpixel_order);\n\tDEFINE_PRIME1 (lime_cairo_font_options_get_hint_style);\n\tDEFINE_PRIME1 (lime_cairo_font_options_get_hint_metrics);\n\tDEFINE_PRIME2v (lime_cairo_font_options_set_antialias);\n\tDEFINE_PRIME2v (lime_cairo_font_options_set_subpixel_order);\n\tDEFINE_PRIME2v (lime_cairo_font_options_set_hint_style);\n\tDEFINE_PRIME2v (lime_cairo_font_options_set_hint_metrics);\n\tDEFINE_PRIME1 (lime_cairo_get_antialias);\n\tDEFINE_PRIME1 (lime_cairo_get_current_point);\n\tDEFINE_PRIME1 (lime_cairo_get_dash);\n\tDEFINE_PRIME1 (lime_cairo_get_dash_count);\n\tDEFINE_PRIME1 (lime_cairo_get_fill_rule);\n\tDEFINE_PRIME1 (lime_cairo_get_font_face);\n\tDEFINE_PRIME1 (lime_cairo_get_font_options);\n\tDEFINE_PRIME1 (lime_cairo_get_group_target);\n\tDEFINE_PRIME1 (lime_cairo_get_line_cap);\n\tDEFINE_PRIME1 (lime_cairo_get_line_join);\n\tDEFINE_PRIME1 (lime_cairo_get_line_width);\n\tDEFINE_PRIME1 (lime_cairo_get_matrix);\n\tDEFINE_PRIME1 (lime_cairo_get_miter_limit);\n\tDEFINE_PRIME1 (lime_cairo_get_operator);\n\tDEFINE_PRIME1 (lime_cairo_get_source);\n\tDEFINE_PRIME1 (lime_cairo_get_target);\n\tDEFINE_PRIME1 (lime_cairo_get_tolerance);\n\tDEFINE_PRIME1 (lime_cairo_has_current_point);\n\tDEFINE_PRIME1v (lime_cairo_identity_matrix);\n\tDEFINE_PRIME3 (lime_cairo_image_surface_create);\n\tDEFINE_PRIME5 (lime_cairo_image_surface_create_for_data);\n\tDEFINE_PRIME1 (lime_cairo_image_surface_get_data);\n\tDEFINE_PRIME1 (lime_cairo_image_surface_get_format);\n\tDEFINE_PRIME1 (lime_cairo_image_surface_get_height);\n\tDEFINE_PRIME1 (lime_cairo_image_surface_get_stride);\n\tDEFINE_PRIME1 (lime_cairo_image_surface_get_width);\n\tDEFINE_PRIME3 (lime_cairo_in_clip);\n\tDEFINE_PRIME3 (lime_cairo_in_fill);\n\tDEFINE_PRIME3 (lime_cairo_in_stroke);\n\tDEFINE_PRIME3v (lime_cairo_line_to);\n\tDEFINE_PRIME2v (lime_cairo_mask);\n\tDEFINE_PRIME4v (lime_cairo_mask_surface);\n\tDEFINE_PRIME3v (lime_cairo_move_to);\n\tDEFINE_PRIME1v (lime_cairo_new_path);\n\tDEFINE_PRIME1v (lime_cairo_paint);\n\tDEFINE_PRIME2v (lime_cairo_paint_with_alpha);\n\tDEFINE_PRIME5v (lime_cairo_pattern_add_color_stop_rgb);\n\tDEFINE_PRIME6v (lime_cairo_pattern_add_color_stop_rgba);\n\tDEFINE_PRIME1 (lime_cairo_pattern_create_for_surface);\n\tDEFINE_PRIME4 (lime_cairo_pattern_create_linear);\n\tDEFINE_PRIME6 (lime_cairo_pattern_create_radial);\n\tDEFINE_PRIME3 (lime_cairo_pattern_create_rgb);\n\tDEFINE_PRIME4 (lime_cairo_pattern_create_rgba);\n\tDEFINE_PRIME1 (lime_cairo_pattern_get_color_stop_count);\n\tDEFINE_PRIME1 (lime_cairo_pattern_get_extend);\n\tDEFINE_PRIME1 (lime_cairo_pattern_get_filter);\n\tDEFINE_PRIME1 (lime_cairo_pattern_get_matrix);\n\tDEFINE_PRIME2v (lime_cairo_pattern_set_extend);\n\tDEFINE_PRIME2v (lime_cairo_pattern_set_filter);\n\tDEFINE_PRIME2v (lime_cairo_pattern_set_matrix);\n\tDEFINE_PRIME1 (lime_cairo_pop_group);\n\tDEFINE_PRIME1v (lime_cairo_pop_group_to_source);\n\tDEFINE_PRIME1v (lime_cairo_push_group);\n\tDEFINE_PRIME2v (lime_cairo_push_group_with_content);\n\tDEFINE_PRIME5v (lime_cairo_rectangle);\n\tDEFINE_PRIME7v (lime_cairo_rel_curve_to);\n\tDEFINE_PRIME3v (lime_cairo_rel_line_to);\n\tDEFINE_PRIME3v (lime_cairo_rel_move_to);\n\tDEFINE_PRIME1v (lime_cairo_reset_clip);\n\tDEFINE_PRIME1v (lime_cairo_restore);\n\tDEFINE_PRIME2v (lime_cairo_rotate);\n\tDEFINE_PRIME1v (lime_cairo_save);\n\tDEFINE_PRIME3v (lime_cairo_scale);\n\tDEFINE_PRIME2v (lime_cairo_set_antialias);\n\tDEFINE_PRIME2v (lime_cairo_set_dash);\n\tDEFINE_PRIME2v (lime_cairo_set_fill_rule);\n\tDEFINE_PRIME2v (lime_cairo_set_font_face);\n\tDEFINE_PRIME2v (lime_cairo_set_font_size);\n\tDEFINE_PRIME2v (lime_cairo_set_font_options);\n\tDEFINE_PRIME2v (lime_cairo_set_line_cap);\n\tDEFINE_PRIME2v (lime_cairo_set_line_join);\n\tDEFINE_PRIME2v (lime_cairo_set_line_width);\n\tDEFINE_PRIME7v (lime_cairo_set_matrix);\n\t//DEFINE_PRIME2v (lime_cairo_set_matrix);\n\tDEFINE_PRIME2v (lime_cairo_set_miter_limit);\n\tDEFINE_PRIME2v (lime_cairo_set_operator);\n\tDEFINE_PRIME2v (lime_cairo_set_source);\n\tDEFINE_PRIME4v (lime_cairo_set_source_rgb);\n\tDEFINE_PRIME5v (lime_cairo_set_source_rgba);\n\tDEFINE_PRIME4v (lime_cairo_set_source_surface);\n\tDEFINE_PRIME2v (lime_cairo_set_tolerance);\n\tDEFINE_PRIME2v (lime_cairo_show_glyphs);\n\tDEFINE_PRIME1v (lime_cairo_show_page);\n\tDEFINE_PRIME2v (lime_cairo_show_text);\n\tDEFINE_PRIME1 (lime_cairo_status);\n\tDEFINE_PRIME1v (lime_cairo_stroke);\n\tDEFINE_PRIME5v (lime_cairo_stroke_extents);\n\tDEFINE_PRIME1v (lime_cairo_stroke_preserve);\n\tDEFINE_PRIME1v (lime_cairo_surface_flush);\n\tDEFINE_PRIME2v (lime_cairo_text_path);\n\tDEFINE_PRIME2v (lime_cairo_transform);\n\tDEFINE_PRIME3v (lime_cairo_translate);\n\tDEFINE_PRIME0 (lime_cairo_version);\n\tDEFINE_PRIME0 (lime_cairo_version_string);\n\n\n\t#define _TCFFIPOINTER _DYN\n\t#define _TMATRIX3 _OBJ (_F64 _F64 _F64 _F64 _F64 _F64)\n\t#define _TVECTOR2 _OBJ (_F64 _F64)\n\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_arc, _TCFFIPOINTER _F64 _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_arc_negative, _TCFFIPOINTER _F64 _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_clip, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_clip_extents, _TCFFIPOINTER _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_clip_preserve, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_close_path, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_copy_page, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_create, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_curve_to, _TCFFIPOINTER _F64 _F64 _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_fill, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_fill_extents, _TCFFIPOINTER _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_fill_preserve, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_ft_font_face_create, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_font_face_status, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_font_options_create, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_font_options_get_antialias, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_font_options_get_subpixel_order, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_font_options_get_hint_style, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_font_options_get_hint_metrics, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_font_options_set_antialias, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_font_options_set_subpixel_order, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_font_options_set_hint_style, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_font_options_set_hint_metrics, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_get_antialias, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_cairo_get_current_point, _TCFFIPOINTER _TVECTOR2);\n\tDEFINE_HL_PRIM (_ARR, hl_cairo_get_dash, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_get_dash_count, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_get_fill_rule, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_get_font_face, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_get_font_options, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_get_group_target, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_get_line_cap, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_get_line_join, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_F64, hl_cairo_get_line_width, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TMATRIX3, hl_cairo_get_matrix, _TCFFIPOINTER _TMATRIX3);\n\tDEFINE_HL_PRIM (_F64, hl_cairo_get_miter_limit, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_get_operator, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_get_source, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_get_target, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_F64, hl_cairo_get_tolerance, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_cairo_has_current_point, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_identity_matrix, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_image_surface_create, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_image_surface_create_for_data, _F64 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_F64, hl_cairo_image_surface_get_data, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_image_surface_get_format, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_image_surface_get_height, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_image_surface_get_stride, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_image_surface_get_width, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_cairo_in_clip, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_BOOL, hl_cairo_in_fill, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_BOOL, hl_cairo_in_stroke, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_line_to, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_mask, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_mask_surface, _TCFFIPOINTER _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_move_to, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_new_path, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_paint, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_paint_with_alpha, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_pattern_add_color_stop_rgb, _TCFFIPOINTER _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_pattern_add_color_stop_rgba, _TCFFIPOINTER _F64 _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_pattern_create_for_surface, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_pattern_create_linear, _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_pattern_create_radial, _F64 _F64 _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_pattern_create_rgb, _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_pattern_create_rgba, _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_pattern_get_color_stop_count, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_pattern_get_extend, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_pattern_get_filter, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TMATRIX3, hl_cairo_pattern_get_matrix, _TCFFIPOINTER _TMATRIX3);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_pattern_set_extend, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_pattern_set_filter, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_pattern_set_matrix, _TCFFIPOINTER _TMATRIX3);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_cairo_pop_group, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_pop_group_to_source, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_push_group, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_push_group_with_content, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_rectangle, _TCFFIPOINTER _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_rel_curve_to, _TCFFIPOINTER _F64 _F64 _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_rel_line_to, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_rel_move_to, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_reset_clip, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_restore, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_rotate, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_save, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_scale, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_antialias, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_dash, _TCFFIPOINTER _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_fill_rule, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_font_face, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_font_size, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_font_options, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_line_cap, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_line_join, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_line_width, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_matrix, _TCFFIPOINTER _TMATRIX3);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_miter_limit, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_operator, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_source, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_source_rgb, _TCFFIPOINTER _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_source_rgba, _TCFFIPOINTER _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_source_surface, _TCFFIPOINTER _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_set_tolerance, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_show_glyphs, _TCFFIPOINTER _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_show_page, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_show_text, _TCFFIPOINTER _STRING);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_status, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_stroke, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_stroke_extents, _TCFFIPOINTER _F64 _F64 _F64 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_stroke_preserve, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_surface_flush, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_text_path, _TCFFIPOINTER _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_transform, _TCFFIPOINTER _TMATRIX3);\n\tDEFINE_HL_PRIM (_VOID, hl_cairo_translate, _TCFFIPOINTER _F64 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_cairo_version, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_cairo_version_string, _NO_ARG);\n\n\n}\n\n\nextern \"C\" int lime_cairo_register_prims () {\n\n\treturn 0;\n\n}"
  },
  {
    "path": "project/src/graphics/format/JPEG.cpp",
    "content": "#include <system/System.h>\nextern \"C\" {\n\n\t#include <sys/types.h>\n\t#include <stdio.h>\n\t#include <jpeglib.h>\n\n}\n\n#include <setjmp.h>\n#include <graphics/format/JPEG.h>\n\n\nnamespace lime {\n\n\n\tstruct ErrorData {\n\n\t\tstruct jpeg_error_mgr base;\n\t\tjmp_buf on_error;\n\n\t};\n\n\n\tstatic void OnOutput (j_common_ptr cinfo) {}\n\n\n\t// #ifdef NDEBUG\n\t// char errorMessage[JMSG_LENGTH_MAX];\n\t// #endif\n\n\tstatic void OnError (j_common_ptr cinfo) {\n\n\t\tErrorData * err = (ErrorData *)cinfo->err;\n\n\t\t// #ifdef NDEBUG\n\t\t// ( *(cinfo->err->format_message) ) (cinfo, errorMessage);\n\t\t// fprintf(stderr, \"%s\\n\", errorMessage);\n\t\t// #endif\n\n\t\tlongjmp (err->on_error, 1);\n\n\t}\n\n\n\tstruct MySrcManager {\n\n\n\t\tMySrcManager (const JOCTET *inData, int inLen) : mData (inData), mLen (inLen) {\n\n\t\t\tpub.init_source = my_init_source;\n\t\t\tpub.fill_input_buffer = my_fill_input_buffer;\n\t\t\tpub.skip_input_data = my_skip_input_data;\n\t\t\tpub.resync_to_restart = my_resync_to_restart;\n\t\t\tpub.term_source = my_term_source;\n\t\t\tpub.next_input_byte = 0;\n\t\t\tpub.bytes_in_buffer = 0;\n\t\t\tmUsed = false;\n\t\t\tmEOI[0] = 0xff;\n\t\t\tmEOI[1] = JPEG_EOI;\n\n\t\t}\n\n\n\t\tstruct jpeg_source_mgr pub;   /* public fields */\n\t\tconst JOCTET * mData;\n\t\tsize_t mLen;\n\t\tbool   mUsed;\n\t\tunsigned char mEOI[2];\n\n\n\t\tstatic void my_init_source (j_decompress_ptr cinfo) {\n\n\t\t\tMySrcManager *man = (MySrcManager *)cinfo->src;\n\t\t\tman->mUsed = false;\n\n\t\t}\n\n\n\t\tstatic boolean my_fill_input_buffer (j_decompress_ptr cinfo) {\n\n\t\t\tMySrcManager *man = (MySrcManager *)cinfo->src;\n\n\t\t\tif (man->mUsed) {\n\n\t\t\t\tman->pub.next_input_byte = man->mEOI;\n\t\t\t\tman->pub.bytes_in_buffer = 2;\n\n\t\t\t} else {\n\t\t\t\tman->pub.next_input_byte = man->mData;\n\t\t\t\tman->pub.bytes_in_buffer = man->mLen;\n\t\t\t\tman->mUsed = true;\n\n\t\t\t}\n\n\t\t\treturn TRUE;\n\n\t\t}\n\n\n\t\tstatic void my_skip_input_data (j_decompress_ptr cinfo, long num_bytes) {\n\n\t\t\tMySrcManager *man = (MySrcManager *)cinfo->src;\n\t\t\tman->pub.next_input_byte += num_bytes;\n\t\t\tman->pub.bytes_in_buffer -= num_bytes;\n\n\t\t\t// was < 0 and was always false PJK 16JUN12\n\t\t\tif (man->pub.bytes_in_buffer == 0) {\n\n\t\t\t\tman->pub.next_input_byte = man->mEOI;\n\t\t\t\tman->pub.bytes_in_buffer = 2;\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tstatic boolean my_resync_to_restart (j_decompress_ptr cinfo, int desired) {\n\n\t\t\tMySrcManager *man = (MySrcManager *)cinfo->src;\n\t\t\tman->mUsed = false;\n\t\t\treturn TRUE;\n\n\t\t}\n\n\n\t\tstatic void my_term_source (j_decompress_ptr cinfo) {}\n\n\t};\n\n\n\tstruct MyDestManager {\n\n\n\t\tenum { BUF_SIZE = 4096 };\n\t\tstruct jpeg_destination_mgr pub;   /* public fields */\n\t\tQuickVec<unsigned char> mOutput;\n\t\tunsigned char   mTmpBuf[BUF_SIZE];\n\n\n\t\tMyDestManager () {\n\n\t\t\tpub.init_destination = init_buffer;\n\t\t\tpub.empty_output_buffer = copy_buffer;\n\t\t\tpub.term_destination = term_buffer;\n\t\t\tpub.next_output_byte = mTmpBuf;\n\t\t\tpub.free_in_buffer = BUF_SIZE;\n\n\t\t}\n\n\n\t\tvoid CopyBuffer () {\n\n\t\t\tmOutput.append (mTmpBuf, BUF_SIZE);\n\t\t\tpub.next_output_byte = mTmpBuf;\n\t\t\tpub.free_in_buffer = BUF_SIZE;\n\n\t\t}\n\n\n\t\tvoid TermBuffer () {\n\n\t\t\tmOutput.append (mTmpBuf, BUF_SIZE - pub.free_in_buffer);\n\n\t\t}\n\n\n\t\tstatic void init_buffer (jpeg_compress_struct* cinfo) {}\n\n\n\t\tstatic boolean copy_buffer (jpeg_compress_struct* cinfo) {\n\n\t\t\tMyDestManager *man = (MyDestManager *)cinfo->dest;\n\t\t\tman->CopyBuffer ();\n\t\t\treturn TRUE;\n\n\t\t}\n\n\n\t\tstatic void term_buffer (jpeg_compress_struct* cinfo) {\n\n\t\t\tMyDestManager *man = (MyDestManager *)cinfo->dest;\n\t\t\tman->TermBuffer ();\n\n\t\t}\n\n\n\t};\n\n\n\tbool JPEG::Decode (Resource *resource, ImageBuffer* imageBuffer, bool decodeData) {\n\n\t\tstruct jpeg_decompress_struct cinfo;\n\n\t\t//struct jpeg_error_mgr jerr;\n\t\t//cinfo.err = jpeg_std_error (&jerr);\n\n\t\tstruct ErrorData jpegError;\n\t\tcinfo.err = jpeg_std_error (&jpegError.base);\n\t\tjpegError.base.error_exit = OnError;\n\t\tjpegError.base.output_message = OnOutput;\n\n\t\tFILE_HANDLE *file = NULL;\n\t\tBytes *data = NULL;\n\t\tMySrcManager *manager = NULL;\n\n\t\tif (resource->path) {\n\n\t\t\tfile = lime::fopen (resource->path, \"rb\");\n\n\t\t\tif (!file) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (setjmp (jpegError.on_error)) {\n\n\t\t\tif (file) {\n\n\t\t\t\tlime::fclose (file);\n\n\t\t\t}\n\n\t\t\tif (manager) {\n\n\t\t\t\tdelete manager;\n\n\t\t\t}\n\n\t\t\tif (data) {\n\n\t\t\t\tdelete data;\n\n\t\t\t}\n\n\t\t\tjpeg_destroy_decompress (&cinfo);\n\t\t\treturn false;\n\n\t\t}\n\n\t\tjpeg_create_decompress (&cinfo);\n\t\tjpeg_save_markers (&cinfo, JPEG_APP0 + 14, 0xFF);\n\n\t\tif (file) {\n\n\t\t\tif (file->isFile ()) {\n\n\t\t\t\tjpeg_stdio_src (&cinfo, file->getFile ());\n\n\t\t\t} else {\n\n\t\t\t\tdata = new Bytes ();\n\t\t\t\tdata->ReadFile (resource->path);\n\t\t\t\tmanager = new MySrcManager (data->b, data->length);\n\t\t\t\tcinfo.src = &manager->pub;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmanager = new MySrcManager (resource->data->b, resource->data->length);\n\t\t\tcinfo.src = &manager->pub;\n\n\t\t}\n\n\t\tbool decoded = false;\n\n\t\tif (jpeg_read_header (&cinfo, TRUE) == JPEG_HEADER_OK) {\n\n\t\t\tswitch (cinfo.jpeg_color_space) {\n\n\t\t\t\tcase JCS_CMYK:\n\t\t\t\tcase JCS_YCCK:\n\n\t\t\t\t\tcinfo.out_color_space = JCS_CMYK;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase JCS_GRAYSCALE:\n\t\t\t\tcase JCS_RGB:\n\t\t\t\tcase JCS_YCbCr:\n\t\t\t\tdefault:\n\n\t\t\t\t\tcinfo.out_color_space = JCS_RGB;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// case JCS_BG_RGB:\n\t\t\t\t// case JCS_BG_YCC:\n\t\t\t\t// case JCS_UNKNOWN:\n\n\t\t\t}\n\n\t\t\tif (decodeData) {\n\n\t\t\t\tjpeg_start_decompress (&cinfo);\n\n\t\t\t\tint components = cinfo.output_components;\n\t\t\t\timageBuffer->Resize (cinfo.output_width, cinfo.output_height, 32);\n\n\t\t\t\tunsigned char *bytes = imageBuffer->data->buffer->b;\n\t\t\t\tunsigned char *scanline = new unsigned char [imageBuffer->width * components];\n\n\t\t\t\tif (cinfo.out_color_space == JCS_CMYK) {\n\n\t\t\t\t\tbool invert = false;\n\t\t\t\t\tjpeg_saved_marker_ptr marker;\n\t\t\t\t\tmarker = cinfo.marker_list;\n\n\t\t\t\t\twhile (marker) {\n\n\t\t\t\t\t\tif (marker->marker == JPEG_APP0 + 14 && marker->data_length >= 12 && !strncmp ((const char*)marker->data, \"Adobe\", 5)) {\n\n\t\t\t\t\t\t\t// Are there other transforms?\n\t\t\t\t\t\t\tinvert = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmarker = marker->next;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (cinfo.output_scanline < cinfo.output_height) {\n\n\t\t\t\t\t\tjpeg_read_scanlines (&cinfo, &scanline, 1);\n\n\t\t\t\t\t\tconst unsigned char *line = scanline;\n\t\t\t\t\t\tconst unsigned char *const end = line + imageBuffer->width * components;\n\t\t\t\t\t\tunsigned char c, m, y, k;\n\n\t\t\t\t\t\twhile (line < end) {\n\n\t\t\t\t\t\t\tif (invert) {\n\n\t\t\t\t\t\t\t\tc = 0xFF - *line++;\n\t\t\t\t\t\t\t\tm = 0xFF - *line++;\n\t\t\t\t\t\t\t\ty = 0xFF - *line++;\n\t\t\t\t\t\t\t\tk = 0xFF - *line++;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tc = *line++;\n\t\t\t\t\t\t\t\tm = *line++;\n\t\t\t\t\t\t\t\ty = *line++;\n\t\t\t\t\t\t\t\tk = *line++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t*bytes++ = (unsigned char)((0xFF - c) * (0xFF - k) / 0xFF);\n\t\t\t\t\t\t\t*bytes++ = (unsigned char)((0xFF - m) * (0xFF - k) / 0xFF);\n\t\t\t\t\t\t\t*bytes++ = (unsigned char)((0xFF - y) * (0xFF - k) / 0xFF);\n\t\t\t\t\t\t\t*bytes++ = 0xFF;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\twhile (cinfo.output_scanline < cinfo.output_height) {\n\n\t\t\t\t\t\tjpeg_read_scanlines (&cinfo, &scanline, 1);\n\n\t\t\t\t\t\t// convert 24-bit scanline to 32-bit\n\t\t\t\t\t\tconst unsigned char *line = scanline;\n\t\t\t\t\t\tconst unsigned char *const end = line + imageBuffer->width * components;\n\n\t\t\t\t\t\twhile (line < end) {\n\n\t\t\t\t\t\t\t*bytes++ = *line++;\n\t\t\t\t\t\t\t*bytes++ = *line++;\n\t\t\t\t\t\t\t*bytes++ = *line++;\n\t\t\t\t\t\t\t*bytes++ = 0xFF;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tdelete[] scanline;\n\n\t\t\t\tjpeg_finish_decompress (&cinfo);\n\n\t\t\t} else {\n\n\t\t\t\timageBuffer->width = cinfo.image_width;\n\t\t\t\timageBuffer->height = cinfo.image_height;\n\n\t\t\t}\n\n\t\t\tdecoded = true;\n\n\t\t}\n\n\t\tif (file) {\n\n\t\t\tlime::fclose (file);\n\n\t\t}\n\n\t\tif (manager) {\n\n\t\t\tdelete manager;\n\n\t\t}\n\n\t\tif (data) {\n\n\t\t\tdelete data;\n\n\t\t}\n\n\t\tjpeg_destroy_decompress (&cinfo);\n\t\treturn decoded;\n\n\t}\n\n\n\tbool JPEG::Encode (ImageBuffer *imageBuffer, Bytes *bytes, int quality) {\n\n\t\tstruct jpeg_compress_struct cinfo;\n\n\t\tstruct ErrorData jpegError;\n\t\tcinfo.err = jpeg_std_error (&jpegError.base);\n\t\tjpegError.base.error_exit = OnError;\n\t\tjpegError.base.output_message = OnOutput;\n\n\t\tMyDestManager dest;\n\n\t\tint w = imageBuffer->width;\n\t\tint h = imageBuffer->height;\n\t\tQuickVec<unsigned char> row_buf (w * 3);\n\n\t\tjpeg_create_compress (&cinfo);\n\n\t\tif (setjmp (jpegError.on_error)) {\n\n\t\t\tjpeg_destroy_compress (&cinfo);\n\t\t\treturn false;\n\n\t\t}\n\n\t\tcinfo.dest = (jpeg_destination_mgr *)&dest;\n\n\t\tcinfo.image_width = w;\n\t\tcinfo.image_height = h;\n\t\tcinfo.input_components = 3;\n\t\tcinfo.in_color_space = JCS_RGB;\n\n\t\tjpeg_set_defaults (&cinfo);\n\t\tjpeg_set_quality (&cinfo, quality, TRUE);\n\t\tjpeg_start_compress (&cinfo, TRUE);\n\n\t\tJSAMPROW row_pointer = &row_buf[0];\n\t\tunsigned char* imageData = imageBuffer->data->buffer->b;\n\t\tint stride = imageBuffer->Stride ();\n\n\t\twhile (cinfo.next_scanline < cinfo.image_height) {\n\n\t\t\tconst unsigned char *src = (const unsigned char *)(imageData + (stride * cinfo.next_scanline));\n\t\t\tunsigned char *dest = &row_buf[0];\n\n\t\t\tfor(int x = 0; x < w; x++) {\n\n\t\t\t\tdest[0] = src[0];\n\t\t\t\tdest[1] = src[1];\n\t\t\t\tdest[2] = src[2];\n\t\t\t\tdest += 3;\n\t\t\t\tsrc += 4;\n\n\t\t\t}\n\n\t\t\tjpeg_write_scanlines (&cinfo, &row_pointer, 1);\n\n\t\t}\n\n\t\tjpeg_finish_compress (&cinfo);\n\n\t\tint size = dest.mOutput.size ();\n\n\t\tif (size > 0) {\n\n\t\t\tbytes->Resize (size);\n\t\t\tmemcpy (bytes->b, &dest.mOutput[0], size);\n\n\t\t}\n\n\t\tjpeg_destroy_compress (&cinfo);\n\n\t\treturn true;\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/graphics/format/PNG.cpp",
    "content": "extern \"C\" {\n\n\t#include <png.h>\n\t#include <pngstruct.h>\n\t#define PNG_SIG_SIZE 8\n\n}\n\n#include <setjmp.h>\n#include <graphics/format/PNG.h>\n#include <graphics/ImageBuffer.h>\n#include <system/System.h>\n#include <utils/Bytes.h>\n#include <utils/QuickVec.h>\n\n\nnamespace lime {\n\n\n\tstruct ReadBuffer {\n\n\t\tReadBuffer (const unsigned char* data, int length) : data (data), length (length), position (0) {}\n\n\t\tbool Read (unsigned char* out, int count) {\n\n\t\t\tif (position >= length) return false;\n\n\t\t\tif (count > length - position) {\n\n\t\t\t\tmemcpy (out, data + position, length - position);\n\t\t\t\tposition = length;\n\n\t\t\t} else {\n\n\t\t\t\tmemcpy (out, data + position, count);\n\t\t\t\tposition += count;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tchar unused; // the first byte gets corrupted when passed to libpng?\n\t\tconst unsigned char* data;\n\t\tint length;\n\t\tint position;\n\n\t};\n\n\n\tstatic void user_error_fn (png_structp png_ptr, png_const_charp error_msg) {\n\n\t\tlongjmp (png_ptr->jmp_buf_local, 1);\n\n\t}\n\n\n\tstatic void user_read_data_fn (png_structp png_ptr, png_bytep data, png_size_t length) {\n\n\t\tReadBuffer* buffer = (ReadBuffer*)png_get_io_ptr (png_ptr);\n\t\tif (!buffer->Read (data, length)) {\n\t\t\tpng_error (png_ptr, \"Read Error\");\n\t\t}\n\n\t}\n\n\tstatic void user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) {}\n\n\n\tvoid user_write_data (png_structp png_ptr, png_bytep data, png_size_t length) {\n\n\t\tQuickVec<unsigned char> *buffer = (QuickVec<unsigned char> *)png_get_io_ptr (png_ptr);\n\t\tbuffer->append ((unsigned char *)data,(int)length);\n\n\t}\n\n\n\tvoid user_flush_data (png_structp png_ptr) {}\n\n\n\tbool PNG::Decode (Resource *resource, ImageBuffer *imageBuffer, bool decodeData) {\n\n\t\tpng_structp png_ptr;\n\t\tpng_infop info_ptr;\n\t\tpng_uint_32 width, height;\n\t\tint bit_depth, color_type, interlace_type;\n\n\t\tFILE_HANDLE* file = NULL;\n\t\tBytes* data = NULL;\n\n\t\tif (resource->path) {\n\n\t\t\tfile = lime::fopen (resource->path, \"rb\");\n\t\t\tif (!file) return false;\n\n\t\t\tunsigned char png_sig[PNG_SIG_SIZE];\n\t\t\tint read = lime::fread (&png_sig, PNG_SIG_SIZE, 1, file);\n\t\t\tif (png_sig_cmp (png_sig, 0, PNG_SIG_SIZE)) {\n\n\t\t\t\tlime::fclose (file);\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif (png_sig_cmp (resource->data->b, 0, PNG_SIG_SIZE)) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ((png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) {\n\n\t\t\tif (file) lime::fclose (file);\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ((info_ptr = png_create_info_struct (png_ptr)) == NULL) {\n\n\t\t\tpng_destroy_read_struct (&png_ptr, (png_infopp)NULL, (png_infopp)NULL);\n\t\t\tif (file) lime::fclose (file);\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// sets the point which libpng will jump back to in the case of an error\n\t\tif (setjmp (png_jmpbuf (png_ptr))) {\n\n\t\t\tpng_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp)NULL);\n\t\t\tif (file) lime::fclose (file);\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif (file) {\n\n\t\t\tif (file->isFile ()) {\n\n\t\t\t\tpng_init_io (png_ptr, file->getFile ());\n\t\t\t\tpng_set_sig_bytes (png_ptr, PNG_SIG_SIZE);\n\n\t\t\t} else {\n\n\t\t\t\tdata = new Bytes ();\n\t\t\t\tdata->ReadFile (resource->path);\n\t\t\t\tReadBuffer buffer (data->b, data->length);\n\t\t\t\tpng_set_read_fn (png_ptr, &buffer, user_read_data_fn);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tReadBuffer buffer (resource->data->b, resource->data->length);\n\t\t\tpng_set_read_fn (png_ptr, &buffer, user_read_data_fn);\n\n\t\t}\n\n\t\tpng_read_info (png_ptr, info_ptr);\n\t\tpng_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);\n\n\t\tif (decodeData) {\n\n\t\t\t//bool has_alpha = (color_type == PNG_COLOR_TYPE_GRAY_ALPHA || color_type == PNG_COLOR_TYPE_RGB_ALPHA || png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS));\n\n\t\t\tpng_set_expand (png_ptr);\n\n\t\t\tpng_set_filler (png_ptr, 0xff, PNG_FILLER_AFTER);\n\t\t\t//png_set_gray_1_2_4_to_8 (png_ptr);\n\t\t\tpng_set_palette_to_rgb (png_ptr);\n\t\t\tpng_set_gray_to_rgb (png_ptr);\n\n\t\t\tif (bit_depth < 8) {\n\n\t\t\t\tpng_set_packing (png_ptr);\n\n\t\t\t} else if (bit_depth == 16) {\n\n\t\t\t\tpng_set_scale_16 (png_ptr);\n\n\t\t\t}\n\n\t\t\t//png_set_bgr (png_ptr);\n\n\t\t\timageBuffer->Resize (width, height, 32);\n\n\t\t\tconst unsigned int stride = imageBuffer->Stride ();\n\t\t\tunsigned char *bytes = imageBuffer->data->buffer->b;\n\n\t\t\tint number_of_passes = png_set_interlace_handling (png_ptr);\n\n\t\t\tfor (int pass = 0; pass < number_of_passes; pass++) {\n\n\t\t\t\tfor (int i = 0; i < height; i++) {\n\n\t\t\t\t\tpng_bytep anAddr = (png_bytep)(bytes + i * stride);\n\t\t\t\t\tpng_read_rows (png_ptr, (png_bytepp) &anAddr, NULL, 1);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tpng_read_end (png_ptr, NULL);\n\n\t\t} else {\n\n\t\t\timageBuffer->width = width;\n\t\t\timageBuffer->height = height;\n\n\t\t}\n\n\t\tpng_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp)NULL);\n\n\t\tif (file) lime::fclose (file);\n\t\tif (data) delete data;\n\n\t\treturn true;\n\n\t}\n\n\n\tbool PNG::Encode (ImageBuffer *imageBuffer, Bytes* bytes) {\n\n\t\tpng_structp png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, user_error_fn, user_warning_fn);\n\n\t\tif (!png_ptr) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tpng_infop info_ptr = png_create_info_struct (png_ptr);\n\n\t\tif (!info_ptr) {\n\n\t\t\tpng_destroy_write_struct (&png_ptr, NULL);\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif (setjmp (png_jmpbuf (png_ptr))) {\n\n\t\t\tpng_destroy_write_struct (&png_ptr, &info_ptr);\n\t\t\treturn false;\n\n\t\t}\n\n\t\tQuickVec<unsigned char> out_buffer;\n\n\t\tpng_set_write_fn (png_ptr, &out_buffer, user_write_data, user_flush_data);\n\n\t\tint w = imageBuffer->width;\n\t\tint h = imageBuffer->height;\n\n\t\tint bit_depth = 8;\n\t\t//int color_type = (inSurface->Format () & pfHasAlpha) ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB;\n\t\tint color_type = PNG_COLOR_TYPE_RGB_ALPHA;\n\t\tpng_set_IHDR (png_ptr, info_ptr, w, h, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);\n\n\t\tpng_write_info (png_ptr, info_ptr);\n\n\t\tbool do_alpha = (color_type == PNG_COLOR_TYPE_RGBA);\n\t\tunsigned char* imageData = imageBuffer->data->buffer->b;\n\t\tint stride = imageBuffer->Stride ();\n\n\t\t{\n\t\t\tQuickVec<unsigned char> row_data (w * 4);\n\t\t\tpng_bytep row = &row_data[0];\n\n\t\t\tfor (int y = 0; y < h; y++) {\n\n\t\t\t\tunsigned char *buf = &row_data[0];\n\t\t\t\tconst unsigned char *src = (const unsigned char *)(imageData + (stride * y));\n\n\t\t\t\tfor (int x = 0; x < w; x++) {\n\n\t\t\t\t\tbuf[0] = src[0];\n\t\t\t\t\tbuf[1] = src[1];\n\t\t\t\t\tbuf[2] = src[2];\n\t\t\t\t\tsrc += 3;\n\t\t\t\t\tbuf += 3;\n\n\t\t\t\t\tif (do_alpha) {\n\n\t\t\t\t\t\t*buf++ = *src;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tsrc++;\n\n\t\t\t\t}\n\n\t\t\t\tpng_write_rows (png_ptr, &row, 1);\n\n\t\t\t}\n\n\t\t}\n\n\t\tpng_write_end (png_ptr, NULL);\n\n\t\tint size = out_buffer.size ();\n\n\t\tif (size > 0) {\n\n\t\t\tbytes->Resize (size);\n\t\t\tmemcpy (bytes->b, &out_buffer[0], size);\n\n\t\t}\n\n\t\tpng_destroy_write_struct (&png_ptr, &info_ptr);\n\n\t\treturn true;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/graphics/opengl/OpenGL.h",
    "content": "#ifndef LIME_GRAPHICS_OPENGL_OPENGL_H\n#define LIME_GRAPHICS_OPENGL_OPENGL_H\n\n\n#if defined (ANDROID)  || defined (RASPBERRYPI)\n\n#define LIME_GLES\n//#include <GLES3/gl3.h>\n//#define __gl2_h_\n#include <GLES2/gl2.h>\n#include <GLES2/gl2ext.h>\n\n#elif defined (EMSCRIPTEN)\n\n#define LIME_GLES\n// #define LIME_GLES3_API\n#include <GLES2/gl2.h>\n#include <GLES2/gl2ext.h>\n\n#elif defined (TIZEN)\n\n#define LIME_GLES\n#define LIME_GLES3_API\n#include <gl3.h>\n#include <gl3ext.h>\n\n#elif defined (IPHONE) || defined(APPLETV)\n\n#define LIME_GLES\n#define LIME_GLES3_API\n// #include <OpenGLES/ES1/gl.h>\n// #include <OpenGLES/ES1/glext.h>\n// #include <OpenGLES/ES2/gl.h>\n// #include <OpenGLES/ES2/glext.h>\n#include <OpenGLES/ES3/gl.h>\n#include <OpenGLES/ES3/glext.h>\n\n#elif defined (HX_LINUX)\n\n#define LIME_GLES3_API\n#define NEED_EXTENSIONS\n#define DYNAMIC_OGL\n#define GL_GLEXT_PROTOTYPES\n#include <SDL_opengl.h>\n#include <SDL_opengl_glext.h>\n#define FORCE_NON_PO2\n\n#elif defined (HX_MACOS)\n\n//#define LIME_GLES3_API\n#define NEED_EXTENSIONS\n#define DYNAMIC_OGL\n#define GL_GLEXT_PROTOTYPES\n#include <SDL_opengl.h>\n#include <SDL_opengl_glext.h>\n#define FORCE_NON_PO2\n#define glBindFramebuffer glBindFramebufferEXT\n#define glBindRenderbuffer glBindRenderbufferEXT\n#define glGenFramebuffers glGenFramebuffersEXT\n#define glDeleteFramebuffers glDeleteFramebuffersEXT\n#define glGenRenderbuffers glGenRenderbuffersEXT\n#define glDeleteRenderbuffers glDeleteRenderbuffersEXT\n#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT\n#define glFramebufferTexture2D glFramebufferTexture2DEXT\n#define glRenderbufferStorage glRenderbufferStorageEXT\n#define glCheckFramebufferStatus glCheckFramebufferStatusEXT\n#define glCheckFramebufferStatus glCheckFramebufferStatusEXT\n#define glGenerateMipmap glGenerateMipmapEXT\n#define glGetFramebufferAttachmentParameteriv glGetFramebufferAttachmentParameterivEXT\n#define glGetRenderbufferParameteriv glGetRenderbufferParameterivEXT\n#define glIsFramebuffer glIsFramebufferEXT\n#define glIsRenderbuffer glIsRenderbufferEXT\n\n#elif defined (HX_WINDOWS)\n\n//#define LIME_GLES3_API\n#include <windows.h>\n#ifndef NATIVE_TOOLKIT_SDL_ANGLE\n#include <GL/gl.h>\n#endif\n\n// typedef ptrdiff_t GLsizeiptrARB;\n#define NEED_EXTENSIONS\n#define DYNAMIC_OGL\n\n#ifdef NATIVE_TOOLKIT_SDL_ANGLE\n#define LIME_GLES\n#endif\n\n#ifdef NATIVE_TOOLKIT_SDL_ANGLE\n#include <SDL_opengles2.h>\n#else\n#define GL_GLEXT_PROTOTYPES\n#include <SDL_opengl.h>\n#include <SDL_opengl_glext.h>\n#endif\n\n#endif\n\n\n#ifdef HX_WINDOWS\ntypedef HDC WinDC;\ntypedef HGLRC GLCtx;\n#else\ntypedef void *WinDC;\ntypedef void *GLCtx;\n#endif\n\n\n#ifndef GL_BUFFER_SIZE\n\n#define GL_BUFFER_SIZE                0x8764\n#define GL_BUFFER_USAGE               0x8765\n#define GL_ARRAY_BUFFER               0x8892\n#define GL_ELEMENT_ARRAY_BUFFER       0x8893\n#define GL_ARRAY_BUFFER_BINDING       0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\n#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896\n#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897\n#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898\n#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n#define GL_READ_ONLY                  0x88B8\n#define GL_WRITE_ONLY                 0x88B9\n#define GL_READ_WRITE                 0x88BA\n#define GL_BUFFER_ACCESS              0x88BB\n#define GL_BUFFER_MAPPED              0x88BC\n#define GL_BUFFER_MAP_POINTER         0x88BD\n#define GL_STREAM_DRAW                0x88E0\n#define GL_STREAM_READ                0x88E1\n#define GL_STREAM_COPY                0x88E2\n#define GL_STATIC_DRAW                0x88E4\n#define GL_STATIC_READ                0x88E5\n#define GL_STATIC_COPY                0x88E6\n#define GL_DYNAMIC_DRAW               0x88E8\n#define GL_DYNAMIC_READ               0x88E9\n#define GL_DYNAMIC_COPY               0x88EA\n#define GL_COMPILE_STATUS             0x8B81\n#define GL_LINK_STATUS                0x8B82\n#define GL_VALIDATE_STATUS            0x8B83\n#define GL_INFO_LOG_LENGTH            0x8B84\n#define GL_ATTACHED_SHADERS           0x8B85\n#define GL_ACTIVE_UNIFORMS            0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH  0x8B87\n#define GL_SHADER_SOURCE_LENGTH       0x8B88\n#define GL_VERTEX_SHADER              0x8B31\n#define GL_FRAGMENT_SHADER            0x8B30\n#define GL_TEXTURE0                   0x84C0\n#endif\n\n#ifndef GL_CLAMP_TO_EDGE\n#define GL_CLAMP_TO_EDGE 0x812F\n#endif\n\n#ifndef GL_POINT_SMOOTH\n#define GL_POINT_SMOOTH 0x0B10\n#endif\n\n#ifndef GL_LINE_SMOOTH\n#define GL_LINE_SMOOTH  0x0B20\n#endif\n\n#ifdef NEED_EXTENSIONS\n\n#define DECLARE_EXTENSION\n#include \"OpenGLExtensions.h\"\n#undef DECLARE_EXTENSION\n#define CHECK_EXT(x) x\n\n#else\n\n#define CHECK_EXT(x) true\n\n#endif\n\n\n#endif\n"
  },
  {
    "path": "project/src/graphics/opengl/OpenGLBindings.cpp",
    "content": "#include <system/CFFI.h>\n#include <system/CFFIPointer.h>\n#include <system/Mutex.h>\n#include <utils/Bytes.h>\n#include \"OpenGL.h\"\n#include \"OpenGLBindings.h\"\n#include <map>\n#include <string>\n#include <vector>\n\n#ifdef NEED_EXTENSIONS\n#define DEFINE_EXTENSION\n#include \"OpenGLExtensions.h\"\n#undef DEFINE_EXTENSION\n#endif\n\n#ifdef HX_LINUX\n#include <dlfcn.h>\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY GLAPIENTRY\n#endif\n\n#ifdef LIME_SDL\n#include <SDL.h>\n#endif\n\n\nnamespace lime {\n\n\t// TODO(lime): `defined (LIME_GLES3_API) || !defined (LIME_GLES)` is a\n\t// stopgap for desktop-valid modern GL wrappers. Desktop proc loading already\n\t// exists, but `LIME_GLES3_API` is too narrow a gate for desktop GL. Audit the\n\t// remaining GLES3-only wrappers and replace this pattern with an explicit\n\t// desktop-GL macro/capability gate later, rather than broadening everything\n\t// mechanically.\n\n\tbool OpenGLBindings::initialized = false;\n\n\tint OpenGLBindings::defaultFramebuffer = 0;\n\tint OpenGLBindings::defaultRenderbuffer = 0;\n\tvoid* OpenGLBindings::handle = 0;\n\n\t#ifdef NATIVE_TOOLKIT_SDL_ANGLE\n\tvoid* OpenGLBindings::eglHandle = 0;\n\t#endif\n\n\t#if (defined (HX_LINUX) || defined (HX_WINDOWS) || defined (HX_MACOS)) && !defined (NATIVE_TOOLKIT_SDL_ANGLE) && !defined (RASPBERRYPI)\n\ttypedef void (APIENTRY * GL_DebugMessageCallback_Func)(GLDEBUGPROC, const void *);\n\tGL_DebugMessageCallback_Func glDebugMessageCallback_ptr = 0;\n\t#endif\n\n\tstd::map<GLObjectType, std::map <GLuint, void*> > glObjects;\n\tstd::map<void*, GLuint> glObjectIDs;\n\tstd::map<void*, void*> glObjectPtrs;\n\tstd::map<void*, GLObjectType> glObjectTypes;\n\n\tstd::vector<GLuint> gc_gl_id;\n\tstd::vector<void*> gc_gl_ptr;\n\tstd::vector<GLObjectType> gc_gl_type;\n\tMutex gc_gl_mutex;\n\n\n\tvoid gc_gl_object (value object) {\n\n\t\tgc_gl_mutex.Lock ();\n\n\t\tif (glObjectTypes.find (object) != glObjectTypes.end ()) {\n\n\t\t\tGLObjectType type = glObjectTypes[object];\n\n\t\t\tif (type != TYPE_SYNC) {\n\n\t\t\t\tGLuint id = glObjectIDs[object];\n\n\t\t\t\tgc_gl_id.push_back (id);\n\t\t\t\tgc_gl_type.push_back (type);\n\n\t\t\t\tglObjects[type].erase (id);\n\t\t\t\tglObjectIDs.erase (object);\n\t\t\t\tglObjectTypes.erase (object);\n\n\t\t\t} else {\n\n\t\t\t\tvoid* ptr = glObjectPtrs[object];\n\n\t\t\t\tgc_gl_ptr.push_back (ptr);\n\n\t\t\t\tglObjectPtrs.erase (object);\n\t\t\t\tglObjectTypes.erase (object);\n\n\t\t\t}\n\n\t\t}\n\n\t\tgc_gl_mutex.Unlock ();\n\n\t}\n\n\n\tvoid hl_gc_gl_object (HL_CFFIPointer* handle) {\n\n\t\tgc_gl_mutex.Lock ();\n\n\t\tvoid* object = handle->ptr;\n\n\t\tif (glObjectTypes.find (object) != glObjectTypes.end ()) {\n\n\t\t\tGLObjectType type = glObjectTypes[object];\n\n\t\t\tif (type != TYPE_SYNC) {\n\n\t\t\t\tGLuint id = glObjectIDs[object];\n\n\t\t\t\tgc_gl_id.push_back (id);\n\t\t\t\tgc_gl_type.push_back (type);\n\n\t\t\t\tglObjects[type].erase (id);\n\t\t\t\tglObjectIDs.erase (object);\n\t\t\t\tglObjectTypes.erase (object);\n\n\t\t\t} else {\n\n\t\t\t\tvoid* ptr = glObjectPtrs[object];\n\n\t\t\t\tgc_gl_ptr.push_back (ptr);\n\n\t\t\t\tglObjectPtrs.erase (object);\n\t\t\t\tglObjectTypes.erase (object);\n\n\t\t\t}\n\n\t\t}\n\n\t\tgc_gl_mutex.Unlock ();\n\n\t}\n\n\n\tvoid gc_gl_run () {\n\n\t\tif (gc_gl_id.size () > 0) {\n\n\t\t\tgc_gl_mutex.Lock ();\n\n\t\t\tint size = gc_gl_id.size ();\n\n\t\t\tGLuint id;\n\t\t\tGLObjectType type;\n\n\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\tid = gc_gl_id[i];\n\t\t\t\ttype = gc_gl_type[i];\n\n\t\t\t\tswitch (type) {\n\n\t\t\t\t\tcase TYPE_BUFFER:\n\n\t\t\t\t\t\tif (glIsBuffer (id)) glDeleteBuffers (1, &id);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TYPE_FRAMEBUFFER:\n\n\t\t\t\t\t\tif (glIsFramebuffer (id)) glDeleteFramebuffers (1, &id);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TYPE_PROGRAM:\n\n\t\t\t\t\t\tif (glIsProgram (id)) glDeleteProgram (id);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t#ifdef LIME_GLES3_API\n\t\t\t\t\tcase TYPE_QUERY:\n\n\t\t\t\t\t\tif (glIsQuery (id)) glDeleteQueries (1, &id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t#endif\n\n\t\t\t\t\tcase TYPE_RENDERBUFFER:\n\n\t\t\t\t\t\tif (glIsRenderbuffer (id)) glDeleteRenderbuffers (1, &id);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t#ifdef LIME_GLES3_API\n\t\t\t\t\tcase TYPE_SAMPLER:\n\n\t\t\t\t\t\tif (glIsSampler (id)) glDeleteSamplers (1, &id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t#endif\n\n\t\t\t\t\tcase TYPE_SHADER:\n\n\t\t\t\t\t\tif (glIsShader (id)) glDeleteShader (id);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TYPE_TEXTURE:\n\n\t\t\t\t\t\tif (glIsTexture (id)) glDeleteTextures (1, &id);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t#ifdef LIME_GLES3_API\n\t\t\t\t\tcase TYPE_VERTEX_ARRAY_OBJECT:\n\n\t\t\t\t\t\tif (glIsVertexArray (id)) glDeleteVertexArrays (1, &id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t#endif\n\n\t\t\t\t\tdefault: break;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tsize = gc_gl_ptr.size ();\n\t\t\tvoid* ptr;\n\n\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\tptr = gc_gl_ptr[i];\n\t\t\t\t//type = gc_gl_type[i];\n\n\t\t\t\t#ifdef LIME_GLES3_API\n\t\t\t\tif (glIsSync ((GLsync)ptr)) glDeleteSync ((GLsync)ptr);\n\t\t\t\t#endif\n\n\t\t\t}\n\n\t\t\tgc_gl_id.clear ();\n\t\t\tgc_gl_ptr.clear ();\n\t\t\tgc_gl_type.clear ();\n\n\t\t\tgc_gl_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\t#if (defined (HX_LINUX) || defined (HX_WINDOWS) || defined (HX_MACOS)) && !defined (NATIVE_TOOLKIT_SDL_ANGLE) && !defined (RASPBERRYPI)\n\tvoid APIENTRY gl_debug_callback (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam) {\n\n\t\tputs (message);\n\n\t}\n\t#endif\n\n\n\tvoid lime_gl_active_texture (int texture) {\n\n\t\tglActiveTexture (texture);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_active_texture) (int texture) {\n\n\t\tglActiveTexture (texture);\n\n\t}\n\n\n\tvoid lime_gl_attach_shader (int program, int shader) {\n\n\t\tglAttachShader (program, shader);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_attach_shader) (int program, int shader) {\n\n\t\tglAttachShader (program, shader);\n\n\t}\n\n\n\tvoid lime_gl_begin_query (int target, int query) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBeginQuery (target, query);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_begin_query) (int target, int query) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBeginQuery (target, query);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_begin_transform_feedback (int primitiveNode) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBeginTransformFeedback (primitiveNode);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_begin_transform_feedback) (int primitiveNode) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBeginTransformFeedback (primitiveNode);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_bind_attrib_location (int program, int index, HxString name) {\n\n\t\tglBindAttribLocation (program, index, name.__s);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_attrib_location) (int program, int index, hl_vstring* name) {\n\n\t\tglBindAttribLocation (program, index, name ? hl_to_utf8 (name->bytes) : NULL);\n\n\t}\n\n\n\tvoid lime_gl_bind_buffer (int target, int buffer) {\n\n\t\tglBindBuffer (target, buffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_buffer) (int target, int buffer) {\n\n\t\tglBindBuffer (target, buffer);\n\n\t}\n\n\n\tvoid lime_gl_bind_buffer_base (int target, int index, int buffer) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBindBufferBase (target, index, buffer);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_buffer_base) (int target, int index, int buffer) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBindBufferBase (target, index, buffer);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_bind_buffer_range (int target, int index, int buffer, double offset, int size) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBindBufferRange (target, index, buffer, (GLintptr)(uintptr_t)offset, size);\n\t\t#endif\n\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_buffer_range) (int target, int index, int buffer, double offset, int size) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBindBufferRange (target, index, buffer, (GLintptr)(uintptr_t)offset, size);\n\t\t#endif\n\n\n\t}\n\n\n\tvoid lime_gl_bind_framebuffer (int target, int framebuffer) {\n\n\t\tif (!framebuffer) {\n\n\t\t\tframebuffer = OpenGLBindings::defaultFramebuffer;\n\n\t\t}\n\n\t\tglBindFramebuffer (target, framebuffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_framebuffer) (int target, int framebuffer) {\n\n\t\tif (!framebuffer) {\n\n\t\t\tframebuffer = OpenGLBindings::defaultFramebuffer;\n\n\t\t}\n\n\t\tglBindFramebuffer (target, framebuffer);\n\n\t}\n\n\n\tvoid lime_gl_bind_renderbuffer (int target, int renderbuffer) {\n\n\t\tif (!renderbuffer) {\n\n\t\t\trenderbuffer = OpenGLBindings::defaultRenderbuffer;\n\n\t\t}\n\n\t\tglBindRenderbuffer (target, renderbuffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_renderbuffer) (int target, int renderbuffer) {\n\n\t\tif (!renderbuffer) {\n\n\t\t\trenderbuffer = OpenGLBindings::defaultRenderbuffer;\n\n\t\t}\n\n\t\tglBindRenderbuffer (target, renderbuffer);\n\n\t}\n\n\n\tvoid lime_gl_bind_sampler (int unit, int sampler) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glBindSampler) {\n\t\t\tglBindSampler (unit, sampler);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_sampler) (int unit, int sampler) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glBindSampler) {\n\t\t\tglBindSampler (unit, sampler);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_bind_texture (int target, int texture) {\n\n\t\tglBindTexture (target, texture);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_texture) (int target, int texture) {\n\n\t\tglBindTexture (target, texture);\n\n\t}\n\n\n\tvoid lime_gl_bind_transform_feedback (int target, int transformFeedback) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBindTransformFeedback (target, transformFeedback);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_transform_feedback) (int target, int transformFeedback) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglBindTransformFeedback (target, transformFeedback);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_bind_vertex_array (int vertexArray) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glBindVertexArray) {\n\t\t\tglBindVertexArray (vertexArray);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_bind_vertex_array) (int vertexArray) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glBindVertexArray) {\n\t\t\tglBindVertexArray (vertexArray);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_blend_color (float r, float g, float b, float a) {\n\n\t\tglBlendColor (r, g, b, a);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_blend_color) (float r, float g, float b, float a) {\n\n\t\tglBlendColor (r, g, b, a);\n\n\t}\n\n\n\tvoid lime_gl_blend_equation (int mode) {\n\n\t\tglBlendEquation (mode);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_blend_equation) (int mode) {\n\n\t\tglBlendEquation (mode);\n\n\t}\n\n\n\tvoid lime_gl_blend_equation_separate (int rgb, int a) {\n\n\t\tglBlendEquationSeparate (rgb, a);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_blend_equation_separate) (int rgb, int a) {\n\n\t\tglBlendEquationSeparate (rgb, a);\n\n\t}\n\n\n\tvoid lime_gl_blend_func (int sfactor, int dfactor) {\n\n\t\tglBlendFunc (sfactor, dfactor);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_blend_func) (int sfactor, int dfactor) {\n\n\t\tglBlendFunc (sfactor, dfactor);\n\n\t}\n\n\n\tvoid lime_gl_blend_func_separate (int srcRGB, int destRGB, int srcAlpha, int destAlpha) {\n\n\t\tglBlendFuncSeparate (srcRGB, destRGB, srcAlpha, destAlpha);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_blend_func_separate) (int srcRGB, int destRGB, int srcAlpha, int destAlpha) {\n\n\t\tglBlendFuncSeparate (srcRGB, destRGB, srcAlpha, destAlpha);\n\n\t}\n\n\n\tvoid lime_gl_blit_framebuffer (int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glBlitFramebuffer) {\n\t\t\tglBlitFramebuffer (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_blit_framebuffer) (int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glBlitFramebuffer) {\n\t\t\tglBlitFramebuffer (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_buffer_data (int target, int size, double data, int usage) {\n\n\t\tglBufferData (target, size, (void*)(uintptr_t)data, usage);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_buffer_data) (int target, int size, double data, int usage) {\n\n\t\tglBufferData (target, size, (void*)(uintptr_t)data, usage);\n\n\t}\n\n\n\tvoid lime_gl_buffer_sub_data (int target, int offset, int size, double data) {\n\n\t\tglBufferSubData (target, offset, size, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_buffer_sub_data) (int target, int offset, int size, double data) {\n\n\t\tglBufferSubData (target, offset, size, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tint lime_gl_check_framebuffer_status (int target) {\n\n\t\treturn glCheckFramebufferStatus (target);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_check_framebuffer_status) (int target) {\n\n\t\treturn glCheckFramebufferStatus (target);\n\n\t}\n\n\n\tvoid lime_gl_clear (int mask) {\n\n\t\tgc_gl_run ();\n\t\tglClear (mask);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear) (int mask) {\n\n\t\tgc_gl_run ();\n\t\tglClear (mask);\n\n\t}\n\n\n\tvoid lime_gl_clear_bufferfi (int buffer, int drawBuffer, float depth, int stencil) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferfi) {\n\t\t\tglClearBufferfi (buffer, drawBuffer, depth, stencil);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_bufferfi) (int buffer, int drawBuffer, float depth, int stencil) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferfi) {\n\t\t\tglClearBufferfi (buffer, drawBuffer, depth, stencil);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_clear_bufferfv (int buffer, int drawBuffer, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferfv) {\n\t\t\tglClearBufferfv (buffer, drawBuffer, (GLfloat*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_bufferfv) (int buffer, int drawBuffer, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferfv) {\n\t\t\tglClearBufferfv (buffer, drawBuffer, (GLfloat*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_clear_bufferiv (int buffer, int drawBuffer, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferiv) {\n\t\t\tglClearBufferiv (buffer, drawBuffer, (GLint*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_bufferiv) (int buffer, int drawBuffer, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferiv) {\n\t\t\tglClearBufferiv (buffer, drawBuffer, (GLint*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_clear_bufferuiv (int buffer, int drawBuffer, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferuiv) {\n\t\t\tglClearBufferuiv (buffer, drawBuffer, (GLuint*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_bufferuiv) (int buffer, int drawBuffer, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glClearBufferuiv) {\n\t\t\tglClearBufferuiv (buffer, drawBuffer, (GLuint*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_clear_color (float red, float green, float blue, float alpha) {\n\n\t\tglClearColor (red, green, blue, alpha);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_color) (float red, float green, float blue, float alpha) {\n\n\t\tglClearColor (red, green, blue, alpha);\n\n\t}\n\n\n\tvoid lime_gl_clear_depthf (float depth) {\n\n\t\t#ifdef LIME_GLES\n\t\tglClearDepthf (depth);\n\t\t#else\n\t\tglClearDepth (depth);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_depthf) (float depth) {\n\n\t\t#ifdef LIME_GLES\n\t\tglClearDepthf (depth);\n\t\t#else\n\t\tglClearDepth (depth);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_clear_stencil (int stencil) {\n\n\t\tglClearStencil (stencil);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_clear_stencil) (int stencil) {\n\n\t\tglClearStencil (stencil);\n\n\t}\n\n\n\tint lime_gl_client_wait_sync (value sync, int flags, int timeoutA, int timeoutB) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLuint64 timeout = (GLuint64) timeoutA << 32 | timeoutB;\n\t\treturn glClientWaitSync ((GLsync)val_data (sync), flags, timeout);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_client_wait_sync) (HL_CFFIPointer* sync, int flags, int timeoutA, int timeoutB) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLuint64 timeout = (GLuint64) timeoutA << 32 | timeoutB;\n\t\treturn glClientWaitSync ((GLsync)sync->ptr, flags, timeout);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_color_mask (bool red, bool green, bool blue, bool alpha) {\n\n\t\tglColorMask (red, green, blue, alpha);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_color_mask) (bool red, bool green, bool blue, bool alpha) {\n\n\t\tglColorMask (red, green, blue, alpha);\n\n\t}\n\n\n\tvoid lime_gl_compile_shader (int shader) {\n\n\t\tglCompileShader (shader);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_compile_shader) (int shader) {\n\n\t\tglCompileShader (shader);\n\n\t}\n\n\n\tvoid lime_gl_compressed_tex_image_2d (int target, int level, int internalformat, int width, int height, int border, int imageSize, double data) {\n\n\t\tglCompressedTexImage2D (target, level, internalformat, width, height, border, imageSize, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_compressed_tex_image_2d) (int target, int level, int internalformat, int width, int height, int border, int imageSize, double data) {\n\n\t\tglCompressedTexImage2D (target, level, internalformat, width, height, border, imageSize, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tvoid lime_gl_compressed_tex_image_3d (int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, double data) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglCompressedTexImage3D (target, level, internalformat, width, height, depth, border, imageSize, (void*)(uintptr_t)data);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_compressed_tex_image_3d) (int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, double data) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglCompressedTexImage3D (target, level, internalformat, width, height, depth, border, imageSize, (void*)(uintptr_t)data);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_compressed_tex_sub_image_2d (int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, double data) {\n\n\t\tglCompressedTexSubImage2D (target, level, xoffset, yoffset, width, height, format, imageSize, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_compressed_tex_sub_image_2d) (int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, double data) {\n\n\t\tglCompressedTexSubImage2D (target, level, xoffset, yoffset, width, height, format, imageSize, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tvoid lime_gl_compressed_tex_sub_image_3d (int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, double data) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglCompressedTexSubImage3D (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, (void*)(uintptr_t)data);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_compressed_tex_sub_image_3d) (int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, double data) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglCompressedTexSubImage3D (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, (void*)(uintptr_t)data);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_copy_buffer_sub_data (int readTarget, int writeTarget, double readOffset, double writeOffset, int size) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glCopyBufferSubData) {\n\t\t\tglCopyBufferSubData (readTarget, writeTarget, (GLintptr)(uintptr_t)readOffset, (GLintptr)(uintptr_t)writeOffset, size);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_copy_buffer_sub_data) (int readTarget, int writeTarget, double readOffset, double writeOffset, int size) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glCopyBufferSubData) {\n\t\t\tglCopyBufferSubData (readTarget, writeTarget, (GLintptr)(uintptr_t)readOffset, (GLintptr)(uintptr_t)writeOffset, size);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_copy_tex_image_2d (int target, int level, int internalformat, int x, int y, int width, int height, int border) {\n\n\t\tglCopyTexImage2D (target, level, internalformat, x, y, width, height, border);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_copy_tex_image_2d) (int target, int level, int internalformat, int x, int y, int width, int height, int border) {\n\n\t\tglCopyTexImage2D (target, level, internalformat, x, y, width, height, border);\n\n\t}\n\n\n\tvoid lime_gl_copy_tex_sub_image_2d (int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) {\n\n\t\tglCopyTexSubImage2D (target, level, xoffset, yoffset, x, y, width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_copy_tex_sub_image_2d) (int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) {\n\n\t\tglCopyTexSubImage2D (target, level, xoffset, yoffset, x, y, width, height);\n\n\t}\n\n\n\tvoid lime_gl_copy_tex_sub_image_3d (int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glCopyTexSubImage3D) {\n\t\t\tglCopyTexSubImage3D (target, level, xoffset, yoffset, zoffset, x, y, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_copy_tex_sub_image_3d) (int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glCopyTexSubImage3D) {\n\t\t\tglCopyTexSubImage3D (target, level, xoffset, yoffset, zoffset, x, y, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_create_buffer () {\n\n\t\tGLuint id = 0;\n\t\tglGenBuffers (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_buffer) () {\n\n\t\tGLuint id = 0;\n\t\tglGenBuffers (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_framebuffer () {\n\n\t\tGLuint id = 0;\n\t\tglGenFramebuffers (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_framebuffer) () {\n\n\t\tGLuint id = 0;\n\t\tglGenFramebuffers (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_program () {\n\n\t\treturn glCreateProgram ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_program) () {\n\n\t\treturn glCreateProgram ();\n\n\t}\n\n\n\tint lime_gl_create_query () {\n\n\t\tGLuint id = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGenQueries (1, &id);\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_query) () {\n\n\t\tGLuint id = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGenQueries (1, &id);\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_renderbuffer () {\n\n\t\tGLuint id = 0;\n\t\tglGenRenderbuffers (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_renderbuffer) () {\n\n\t\tGLuint id = 0;\n\t\tglGenRenderbuffers (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_sampler () {\n\n\t\tGLuint id = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGenSamplers) {\n\t\t\tglGenSamplers (1, &id);\n\t\t}\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_sampler) () {\n\n\t\tGLuint id = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGenSamplers) {\n\t\t\tglGenSamplers (1, &id);\n\t\t}\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_shader (int type) {\n\n\t\treturn glCreateShader (type);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_shader) (int type) {\n\n\t\treturn glCreateShader (type);\n\n\t}\n\n\n\tint lime_gl_create_texture () {\n\n\t\tGLuint id = 0;\n\t\tglGenTextures (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_texture) () {\n\n\t\tGLuint id = 0;\n\t\tglGenTextures (1, &id);\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_transform_feedback () {\n\n\t\tGLuint id = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGenTransformFeedbacks (1, &id);\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_transform_feedback) () {\n\n\t\tGLuint id = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGenTransformFeedbacks (1, &id);\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tint lime_gl_create_vertex_array () {\n\n\t\tGLuint id = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGenVertexArrays) {\n\t\t\tglGenVertexArrays (1, &id);\n\t\t}\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_create_vertex_array) () {\n\n\t\tGLuint id = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGenVertexArrays) {\n\t\t\tglGenVertexArrays (1, &id);\n\t\t}\n\t\t#endif\n\t\treturn id;\n\n\t}\n\n\n\tvoid lime_gl_cull_face (int mode) {\n\n\t\tglCullFace (mode);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_cull_face) (int mode) {\n\n\t\tglCullFace (mode);\n\n\t}\n\n\n\tvoid lime_gl_delete_buffer (int buffer) {\n\n\t\tglDeleteBuffers (1, (GLuint*)&buffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_buffer) (int buffer) {\n\n\t\tglDeleteBuffers (1, (GLuint*)&buffer);\n\n\t}\n\n\n\tvoid lime_gl_delete_framebuffer (int framebuffer) {\n\n\t\tglDeleteFramebuffers (1, (GLuint*)&framebuffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_framebuffer) (int framebuffer) {\n\n\t\tglDeleteFramebuffers (1, (GLuint*)&framebuffer);\n\n\t}\n\n\n\tvoid lime_gl_delete_program (int program) {\n\n\t\tglDeleteProgram (program);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_program) (int program) {\n\n\t\tglDeleteProgram (program);\n\n\t}\n\n\n\tvoid lime_gl_delete_query (int query) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglDeleteQueries (1, (GLuint*)&query);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_query) (int query) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglDeleteQueries (1, (GLuint*)&query);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_delete_renderbuffer (int renderbuffer) {\n\n\t\tglDeleteRenderbuffers (1, (GLuint*)&renderbuffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_renderbuffer) (int renderbuffer) {\n\n\t\tglDeleteRenderbuffers (1, (GLuint*)&renderbuffer);\n\n\t}\n\n\n\tvoid lime_gl_delete_sampler (int sampler) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDeleteSamplers) {\n\t\t\tglDeleteSamplers (1, (GLuint*)&sampler);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_sampler) (int sampler) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDeleteSamplers) {\n\t\t\tglDeleteSamplers (1, (GLuint*)&sampler);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_delete_shader (int shader) {\n\n\t\tglDeleteShader (shader);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_shader) (int shader) {\n\n\t\tglDeleteShader (shader);\n\n\t}\n\n\n\tvoid lime_gl_delete_sync (value sync) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tif (val_is_null (sync)) return;\n\t\tglDeleteSync ((GLsync)val_data (sync));\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_sync) (HL_CFFIPointer* sync) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tif (!sync) return;\n\t\tglDeleteSync ((GLsync)sync->ptr);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_delete_texture (int texture) {\n\n\t\tglDeleteTextures (1, (GLuint*)&texture);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_texture) (int texture) {\n\n\t\tglDeleteTextures (1, (GLuint*)&texture);\n\n\t}\n\n\n\tvoid lime_gl_delete_transform_feedback (int transformFeedback) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglDeleteTransformFeedbacks (1, (GLuint*)&transformFeedback);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_transform_feedback) (int transformFeedback) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglDeleteTransformFeedbacks (1, (GLuint*)&transformFeedback);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_delete_vertex_array (int vertexArray) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDeleteVertexArrays) {\n\t\t\tglDeleteVertexArrays (1, (GLuint*)&vertexArray);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_delete_vertex_array) (int vertexArray) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDeleteVertexArrays) {\n\t\t\tglDeleteVertexArrays (1, (GLuint*)&vertexArray);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_depth_func (int func) {\n\n\t\tglDepthFunc (func);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_depth_func) (int func) {\n\n\t\tglDepthFunc (func);\n\n\t}\n\n\n\tvoid lime_gl_depth_mask (bool flag) {\n\n\t\tglDepthMask (flag);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_depth_mask) (bool flag) {\n\n\t\tglDepthMask (flag);\n\n\t}\n\n\n\tvoid lime_gl_depth_rangef (float zNear, float zFar) {\n\n\t\t#ifdef LIME_GLES\n\t\tglDepthRangef (zNear, zFar);\n\t\t#else\n\t\tglDepthRange (zNear, zFar);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_depth_rangef) (float zNear, float zFar) {\n\n\t\t#ifdef LIME_GLES\n\t\tglDepthRangef (zNear, zFar);\n\t\t#else\n\t\tglDepthRange (zNear, zFar);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_detach_shader (int program, int shader) {\n\n\t\tglDetachShader (program, shader);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_detach_shader) (int program, int shader) {\n\n\t\tglDetachShader (program, shader);\n\n\t}\n\n\n\tvoid lime_gl_disable (int cap) {\n\n\t\tglDisable (cap);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_disable) (int cap) {\n\n\t\tglDisable (cap);\n\n\t}\n\n\n\tvoid lime_gl_disable_vertex_attrib_array (int index) {\n\n\t\tglDisableVertexAttribArray (index);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_disable_vertex_attrib_array) (int index) {\n\n\t\tglDisableVertexAttribArray (index);\n\n\t}\n\n\n\tvoid lime_gl_draw_arrays (int mode, int first, int count) {\n\n\t\tglDrawArrays (mode, first, count);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_draw_arrays) (int mode, int first, int count) {\n\n\t\tglDrawArrays (mode, first, count);\n\n\t}\n\n\n\tvoid lime_gl_draw_arrays_instanced (int mode, int first, int count, int instanceCount) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawArraysInstanced) {\n\t\t\tglDrawArraysInstanced (mode, first, count, instanceCount);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_draw_arrays_instanced) (int mode, int first, int count, int instanceCount) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawArraysInstanced) {\n\t\t\tglDrawArraysInstanced (mode, first, count, instanceCount);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_draw_buffers (value buffers) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawBuffers) {\n\t\t\tGLsizei size = val_array_size (buffers);\n\t\t\tGLenum *_buffers = (GLenum*)alloca (size * sizeof(GLenum));\n\n\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\t_buffers[i] = val_int (val_array_i (buffers, i));\n\n\t\t\t}\n\n\t\t\tglDrawBuffers (size, _buffers);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_draw_buffers) (hl_varray* buffers) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawBuffers) {\n\t\t\tGLsizei size = buffers->size;\n\t\t\tglDrawBuffers (size, (GLenum*)hl_aptr (buffers, int));\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_draw_elements (int mode, int count, int type, double offset) {\n\n\t\tglDrawElements (mode, count, type, (void*)(uintptr_t)offset);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_draw_elements) (int mode, int count, int type, double offset) {\n\n\t\tglDrawElements (mode, count, type, (void*)(uintptr_t)offset);\n\n\t}\n\n\n\tvoid lime_gl_draw_elements_instanced (int mode, int count, int type, double offset, int instanceCount) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawElementsInstanced) {\n\t\t\tglDrawElementsInstanced (mode, count, type, (void*)(uintptr_t)offset, instanceCount);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_draw_elements_instanced) (int mode, int count, int type, double offset, int instanceCount) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawElementsInstanced) {\n\t\t\tglDrawElementsInstanced (mode, count, type, (void*)(uintptr_t)offset, instanceCount);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_draw_range_elements (int mode, int start, int end, int count, int type, double offset) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawRangeElements) {\n\t\t\tglDrawRangeElements (mode, start, end, count, type, (void*)(uintptr_t)offset);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_draw_range_elements) (int mode, int start, int end, int count, int type, double offset) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glDrawRangeElements) {\n\t\t\tglDrawRangeElements (mode, start, end, count, type, (void*)(uintptr_t)offset);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_enable (int cap) {\n\n\t\tglEnable (cap);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_enable) (int cap) {\n\n\t\tglEnable (cap);\n\n\t}\n\n\n\tvoid lime_gl_enable_vertex_attrib_array (int index) {\n\n\t\tglEnableVertexAttribArray (index);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_enable_vertex_attrib_array) (int index) {\n\n\t\tglEnableVertexAttribArray (index);\n\n\t}\n\n\n\tvoid lime_gl_end_query (int target) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglEndQuery (target);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_end_query) (int target) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglEndQuery (target);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_end_transform_feedback () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglEndTransformFeedback ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_end_transform_feedback) () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglEndTransformFeedback ();\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_fence_sync (int condition, int flags) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsync result = glFenceSync (condition, flags);\n\t\tvalue handle = CFFIPointer (result, gc_gl_object);\n\t\tglObjectPtrs[handle] = result;\n\t\treturn handle;\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_gl_fence_sync) (int condition, int flags) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsync result = glFenceSync (condition, flags);\n\t\tHL_CFFIPointer* handle = HLCFFIPointer (result, (hl_finalizer)hl_gc_gl_object);\n\t\tglObjectPtrs[handle] = result;\n\t\treturn handle;\n\t\t#else\n\t\treturn NULL;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_finish () {\n\n\t\tglFinish ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_finish) () {\n\n\t\tglFinish ();\n\n\t}\n\n\n\tvoid lime_gl_flush () {\n\n\t\tglFlush ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_flush) () {\n\n\t\tglFlush ();\n\n\t}\n\n\n\tvoid lime_gl_framebuffer_renderbuffer (int target, int attachment, int renderbuffertarget, int renderbuffer) {\n\n\t\tglFramebufferRenderbuffer (target, attachment, renderbuffertarget, renderbuffer);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_framebuffer_renderbuffer) (int target, int attachment, int renderbuffertarget, int renderbuffer) {\n\n\t\tglFramebufferRenderbuffer (target, attachment, renderbuffertarget, renderbuffer);\n\n\t}\n\n\n\tvoid lime_gl_framebuffer_texture2D (int target, int attachment, int textarget, int texture, int level) {\n\n\t\tglFramebufferTexture2D (target, attachment, textarget, texture, level);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_framebuffer_texture2D) (int target, int attachment, int textarget, int texture, int level) {\n\n\t\tglFramebufferTexture2D (target, attachment, textarget, texture, level);\n\n\t}\n\n\n\tvoid lime_gl_framebuffer_texture_layer (int target, int attachment, int texture, int level, int layer) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glFramebufferTextureLayer) {\n\t\t\tglFramebufferTextureLayer (target, attachment, texture, level, layer);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_framebuffer_texture_layer) (int target, int attachment, int texture, int level, int layer) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glFramebufferTextureLayer) {\n\t\t\tglFramebufferTextureLayer (target, attachment, texture, level, layer);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_front_face (int face) {\n\n\t\tglFrontFace (face);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_front_face) (int face) {\n\n\t\tglFrontFace (face);\n\n\t}\n\n\n\tvoid lime_gl_generate_mipmap (int target) {\n\n\t\tglGenerateMipmap (target);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_generate_mipmap) (int target) {\n\n\t\tglGenerateMipmap (target);\n\n\t}\n\n\n\tvalue lime_gl_get_active_attrib (int program, int index) {\n\n\t\tvalue result = alloc_empty_object ();\n\n\t\tstd::string buffer (GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, 0);\n\t\tGLsizei outLen = 0;\n\t\tGLsizei size = 0;\n\t\tGLenum type = 0;\n\n\t\tglGetActiveAttrib (program, index, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &outLen, &size, &type, &buffer[0]);\n\n\t\tbuffer.resize (outLen);\n\n\t\talloc_field (result, val_id (\"size\"), alloc_int (size));\n\t\talloc_field (result, val_id (\"type\"), alloc_int (type));\n\t\talloc_field (result, val_id (\"name\"), alloc_string (buffer.c_str ()));\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_gl_get_active_attrib) (int program, int index) {\n\n\t\tchar buffer[GL_ACTIVE_ATTRIBUTE_MAX_LENGTH];\n\t\tGLsizei outLen = 0;\n\t\tGLsizei size = 0;\n\t\tGLenum type = 0;\n\n\t\tglGetActiveAttrib (program, index, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &outLen, &size, &type, &buffer[0]);\n\n\t\tchar* _buffer = (char*)malloc (outLen + 1);\n\t\tmemcpy (_buffer, &buffer, outLen);\n\t\t_buffer[outLen] = '\\0';\n\n\t\tconst int id_size = hl_hash_utf8 (\"size\");\n\t\tconst int id_type = hl_hash_utf8 (\"type\");\n\t\tconst int id_name = hl_hash_utf8 (\"name\");\n\n\t\tvdynamic *result = (vdynamic*)hl_alloc_dynobj();\n\t\thl_dyn_seti (result, id_size, &hlt_i32, size);\n\t\thl_dyn_seti (result, id_type, &hlt_i32, type);\n\t\thl_dyn_setp (result, id_name, &hlt_bytes, _buffer);\n\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_gl_get_active_uniform (int program, int index) {\n\n\t\tstd::string buffer (GL_ACTIVE_UNIFORM_MAX_LENGTH, 0);\n\t\tGLsizei outLen = 0;\n\t\tGLsizei size = 0;\n\t\tGLenum  type = 0;\n\n\t\tglGetActiveUniform (program, index, GL_ACTIVE_UNIFORM_MAX_LENGTH, &outLen, &size, &type, &buffer[0]);\n\n\t\tbuffer.resize (outLen);\n\n\t\tvalue result = alloc_empty_object ();\n\t\talloc_field (result, val_id (\"size\"), alloc_int (size));\n\t\talloc_field (result, val_id (\"type\"), alloc_int (type));\n\t\talloc_field (result, val_id (\"name\"), alloc_string (buffer.c_str ()));\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_gl_get_active_uniform) (int program, int index) {\n\n\t\tchar* buffer[GL_ACTIVE_UNIFORM_MAX_LENGTH];\n\t\tGLsizei outLen = 0;\n\t\tGLsizei size = 0;\n\t\tGLenum type = 0;\n\n\t\tglGetActiveUniform (program, index, GL_ACTIVE_UNIFORM_MAX_LENGTH, &outLen, &size, &type, (GLchar*)&buffer);\n\n\t\tchar* _buffer = (char*)malloc (outLen + 1);\n\t\tmemcpy (_buffer, &buffer, outLen);\n\t\t_buffer[outLen] = '\\0';\n\n\t\tconst int id_size = hl_hash_utf8 (\"size\");\n\t\tconst int id_type = hl_hash_utf8 (\"type\");\n\t\tconst int id_name = hl_hash_utf8 (\"name\");\n\n\t\tvdynamic *result = (vdynamic*)hl_alloc_dynobj();\n\t\thl_dyn_seti (result, id_size, &hlt_i32, size);\n\t\thl_dyn_seti (result, id_type, &hlt_i32, type);\n\t\thl_dyn_setp (result, id_name, &hlt_bytes, _buffer);\n\n\t\treturn result;\n\n\t}\n\n\n\tint lime_gl_get_active_uniform_blocki (int program, int uniformBlockIndex, int pname) {\n\n\t\tGLint param = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetActiveUniformBlockiv (program, uniformBlockIndex, pname, &param);\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_active_uniform_blocki) (int program, int uniformBlockIndex, int pname) {\n\n\t\tGLint param = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetActiveUniformBlockiv (program, uniformBlockIndex, pname, &param);\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_active_uniform_blockiv (int program, int uniformBlockIndex, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetActiveUniformBlockiv (program, uniformBlockIndex, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_active_uniform_blockiv) (int program, int uniformBlockIndex, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetActiveUniformBlockiv (program, uniformBlockIndex, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_get_active_uniform_block_name (int program, int uniformBlockIndex) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLint length;\n\t\tglGetActiveUniformBlockiv (program, uniformBlockIndex, GL_UNIFORM_BLOCK_NAME_LENGTH, &length);\n\n\t\tstd::string buffer (length, 0);\n\n\t\tglGetActiveUniformBlockName (program, uniformBlockIndex, length, 0, &buffer[0]);\n\n\t\treturn alloc_string (buffer.c_str ());\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gl_get_active_uniform_block_name) (int program, int uniformBlockIndex) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLint length;\n\t\tglGetActiveUniformBlockiv (program, uniformBlockIndex, GL_UNIFORM_BLOCK_NAME_LENGTH, &length);\n\n\t\tchar* buffer = (char*)malloc (length + 1);\n\n\t\tglGetActiveUniformBlockName (program, uniformBlockIndex, length, 0, buffer);\n\n\t\tbuffer[length] = '\\0';\n\t\treturn (vbyte*)buffer;\n\t\t#else\n\t\treturn NULL;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_get_active_uniformsiv (int program, value uniformIndices, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsizei size = val_array_size (uniformIndices);\n\t\tGLenum *_uniformIndices = (GLenum*)alloca (size * sizeof(GLenum));\n\n\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t_uniformIndices[i] = val_int (val_array_i (uniformIndices, i));\n\n\t\t}\n\n\t\tglGetActiveUniformsiv (program, size, _uniformIndices, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_active_uniformsiv) (int program, hl_varray* uniformIndices, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsizei size = uniformIndices->size;\n\t\tglGetActiveUniformsiv (program, size, (GLenum*)hl_aptr (uniformIndices, int), pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_get_attached_shaders (int program) {\n\n\t\tGLsizei maxCount = 0;\n\t\tglGetProgramiv (program, GL_ATTACHED_SHADERS, &maxCount);\n\n\t\tif (!maxCount) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tGLsizei count;\n\t\tGLuint* shaders = new GLuint[maxCount];\n\n\t\tglGetAttachedShaders (program, maxCount, &count, shaders);\n\n\t\tvalue data = alloc_array (maxCount);\n\n\t\tfor (int i = 0; i < maxCount; i++) {\n\n\t\t\tval_array_set_i (data, i, alloc_int (shaders[i]));\n\n\t\t}\n\n\t\tdelete[] shaders;\n\t\treturn data;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_gl_get_attached_shaders) (int program) {\n\n\t\tGLsizei maxCount = 0;\n\t\tglGetProgramiv (program, GL_ATTACHED_SHADERS, &maxCount);\n\n\t\tif (!maxCount) {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\tGLsizei count;\n\t\tvarray* data = hl_alloc_array (&hlt_i32, maxCount);\n\n\t\tglGetAttachedShaders (program, maxCount, &count, (GLuint*)hl_aptr (data, int));\n\n\t\treturn data;\n\n\t}\n\n\n\tint lime_gl_get_attrib_location (int program, HxString name) {\n\n\t\treturn glGetAttribLocation (program, name.__s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_attrib_location) (int program, hl_vstring* name) {\n\n\t\treturn glGetAttribLocation (program, name ? hl_to_utf8 (name->bytes) : NULL);\n\n\t}\n\n\n\tbool lime_gl_get_boolean (int pname) {\n\n\t\tunsigned char params;\n\t\tglGetBooleanv (pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_get_boolean) (int pname) {\n\n\t\tunsigned char params;\n\t\tglGetBooleanv (pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_booleanv (int pname, double params) {\n\n\t\tglGetBooleanv (pname, (unsigned char*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_booleanv) (int pname, double params) {\n\n\t\tglGetBooleanv (pname, (unsigned char*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_buffer_parameteri (int target, int index) {\n\n\t\tGLint params = 0;\n\t\tglGetBufferParameteriv (target, index, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_buffer_parameteri) (int target, int index) {\n\n\t\tGLint params = 0;\n\t\tglGetBufferParameteriv (target, index, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_buffer_parameteri64v (int target, int index, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetBufferParameteri64v (target, index, (GLint64*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_buffer_parameteri64v) (int target, int index, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetBufferParameteri64v (target, index, (GLint64*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_get_buffer_parameteriv (int target, int index, double params) {\n\n\t\tglGetBufferParameteriv (target, index, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_buffer_parameteriv) (int target, int index, double params) {\n\n\t\tglGetBufferParameteriv (target, index, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tdouble lime_gl_get_buffer_pointerv (int target, int pname) {\n\n\t\tuintptr_t result = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetBufferPointerv (target, pname, (void**)result);\n\t\t#endif\n\t\treturn (double)result;\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_gl_get_buffer_pointerv) (int target, int pname) {\n\n\t\tuintptr_t result = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetBufferPointerv (target, pname, (void**)result);\n\t\t#endif\n\t\treturn (double)result;\n\n\t}\n\n\n\tvoid lime_gl_get_buffer_sub_data (int target, double offset, int size, double data) {\n\n\t\t#ifndef LIME_GLES\n\t\tglGetBufferSubData (target, (GLintptr)(uintptr_t)offset, size, (void*)(uintptr_t)data);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_buffer_sub_data) (int target, double offset, int size, double data) {\n\n\t\t#ifndef LIME_GLES\n\t\tglGetBufferSubData (target, (GLintptr)(uintptr_t)offset, size, (void*)(uintptr_t)data);\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_get_context_attributes () {\n\n\t\tvalue result = alloc_empty_object ();\n\n\t\talloc_field (result, val_id (\"alpha\"), alloc_bool (true));\n\t\talloc_field (result, val_id (\"depth\"), alloc_bool (true));\n\t\talloc_field (result, val_id (\"stencil\"), alloc_bool (true));\n\t\talloc_field (result, val_id (\"antialias\"), alloc_bool (true));\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_gl_get_context_attributes) () {\n\n\t\tconst int id_alpha = hl_hash_utf8 (\"alpha\");\n\t\tconst int id_depth = hl_hash_utf8 (\"depth\");\n\t\tconst int id_stencil = hl_hash_utf8 (\"stencil\");\n\t\tconst int id_antialias = hl_hash_utf8 (\"antialias\");\n\n\t\t// TODO: Handle if depth and stencil are disabled\n\n\t\tvdynamic *result = (vdynamic*)hl_alloc_dynobj();\n\t\thl_dyn_seti (result, id_alpha, &hlt_bool, true);\n\t\thl_dyn_seti (result, id_depth, &hlt_bool, true);\n\t\thl_dyn_seti (result, id_stencil, &hlt_bool, true);\n\t\thl_dyn_seti (result, id_antialias, &hlt_bool, true);\n\n\t\treturn result;\n\n\t}\n\n\n\tint lime_gl_get_error () {\n\n\t\treturn glGetError ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_error) () {\n\n\t\treturn glGetError ();\n\n\t}\n\n\n\tvalue lime_gl_get_extension (HxString name) {\n\n\t\t#if (defined (HX_LINUX) || defined (HX_WINDOWS) || defined (HX_MACOS)) && !defined (NATIVE_TOOLKIT_SDL_ANGLE) && !defined (RASPBERRYPI)\n\t\tif (!glDebugMessageCallback_ptr && strcmp (name.__s, \"KHR_debug\") == 0) {\n\n\t\t\tglDebugMessageCallback_ptr = (GL_DebugMessageCallback_Func)SDL_GL_GetProcAddress (\"glDebugMessageCallback\");\n\n\t\t\tif (!glDebugMessageCallback_ptr) {\n\n\t\t\t\tglDebugMessageCallback_ptr = (GL_DebugMessageCallback_Func)SDL_GL_GetProcAddress (\"glDebugMessageCallbackKHR\");\n\n\t\t\t}\n\n\t\t\tif (glDebugMessageCallback_ptr) {\n\n\t\t\t\tglDebugMessageCallback_ptr ((GLDEBUGPROCARB)gl_debug_callback, NULL);\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t\t// void *result = 0;\n\n\t\t// #ifdef LIME_SDL\n\t\t// result = SDL_GL_GetProcAddress (name.__s);\n\t\t// #endif\n\n\t\t// if (result) {\n\n\t\t// \tstatic bool init = false;\n\t\t// \tstatic vkind functionKind;\n\n\t\t// \tif (!init) {\n\n\t\t// \t\tinit = true;\n\t\t// \t\tkind_share (&functionKind, \"function\");\n\n\t\t// \t}\n\n\t\t// \treturn alloc_abstract (functionKind, result);\n\n\t\t// }\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_gl_get_extension) (hl_vstring* name) {\n\n\t\tif (name == NULL) return NULL;\n\n\t\t#if (defined (HX_LINUX) || defined (HX_WINDOWS) || defined (HX_MACOS)) && !defined (NATIVE_TOOLKIT_SDL_ANGLE) && !defined (RASPBERRYPI)\n\t\tif (!glDebugMessageCallback_ptr && strcmp (hl_to_utf8 (name->bytes), \"KHR_debug\") == 0) {\n\n\t\t\tglDebugMessageCallback_ptr = (GL_DebugMessageCallback_Func)SDL_GL_GetProcAddress (\"glDebugMessageCallback\");\n\n\t\t\tif (!glDebugMessageCallback_ptr) {\n\n\t\t\t\tglDebugMessageCallback_ptr = (GL_DebugMessageCallback_Func)SDL_GL_GetProcAddress (\"glDebugMessageCallbackKHR\");\n\n\t\t\t}\n\n\t\t\tif (glDebugMessageCallback_ptr) {\n\n\t\t\t\tglDebugMessageCallback_ptr ((GLDEBUGPROCARB)gl_debug_callback, NULL);\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t\t// void *result = 0;\n\n\t\t// #ifdef LIME_SDL\n\t\t// result = SDL_GL_GetProcAddress (name.__s);\n\t\t// #endif\n\n\t\t// if (result) {\n\n\t\t// \tstatic bool init = false;\n\t\t// \tstatic vkind functionKind;\n\n\t\t// \tif (!init) {\n\n\t\t// \t\tinit = true;\n\t\t// \t\tkind_share (&functionKind, \"function\");\n\n\t\t// \t}\n\n\t\t// \treturn alloc_abstract (functionKind, result);\n\n\t\t// }\n\n\t\treturn NULL;\n\n\t}\n\n\n\tfloat lime_gl_get_float (int pname) {\n\n\t\tGLfloat params;\n\t\tglGetFloatv (pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_gl_get_float) (int pname) {\n\n\t\tGLfloat params;\n\t\tglGetFloatv (pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_floatv (int pname, double params) {\n\n\t\tglGetFloatv (pname, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_floatv) (int pname, double params) {\n\n\t\tglGetFloatv (pname, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_frag_data_location (int program, HxString name) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glGetFragDataLocation (program, name.__s);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_frag_data_location) (int program, hl_vstring* name) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glGetFragDataLocation (program, name ? hl_to_utf8 (name->bytes) : NULL);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_framebuffer_attachment_parameteri (int target, int attachment, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetFramebufferAttachmentParameteriv (target, attachment, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_framebuffer_attachment_parameteri) (int target, int attachment, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetFramebufferAttachmentParameteriv (target, attachment, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_framebuffer_attachment_parameteriv (int target, int attachment, int pname, double params) {\n\n\t\tglGetFramebufferAttachmentParameteriv (target, attachment, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_framebuffer_attachment_parameteriv) (int target, int attachment, int pname, double params) {\n\n\t\tglGetFramebufferAttachmentParameteriv (target, attachment, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_integer (int pname) {\n\n\t\tGLint params;\n\t\tglGetIntegerv (pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_integer) (int pname) {\n\n\t\tGLint params;\n\t\tglGetIntegerv (pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_integer64v (int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetInteger64v (pname, (GLint64*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_integer64v) (int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetInteger64v (pname, (GLint64*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_get_integer64i_v (int pname, int index, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetInteger64i_v (pname, index, (GLint64*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_integer64i_v) (int pname, int index, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetInteger64i_v (pname, index, (GLint64*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_get_integerv (int pname, double params) {\n\n\t\tglGetIntegerv (pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_integerv) (int pname, double params) {\n\n\t\tglGetIntegerv (pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tvoid lime_gl_get_integeri_v (int pname, int index, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetIntegeri_v (pname, index, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_integeri_v) (int pname, int index, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetIntegeri_v (pname, index, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_get_internalformativ (int target, int internalformat, int pname, int bufSize, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetInternalformativ (target, internalformat, pname, (GLsizei)bufSize, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_internalformativ) (int target, int internalformat, int pname, int bufSize, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetInternalformativ (target, internalformat, pname, (GLsizei)bufSize, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_get_program_binary (int program, int binaryFormat, value bytes) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLint size = 0;\n\t\tglGetProgramiv (program, GL_PROGRAM_BINARY_LENGTH, &size);\n\n\t\tif (size > 0) {\n\n\t\t\tBytes _bytes (bytes);\n\t\t\t_bytes.Resize (size);\n\n\t\t\tglGetProgramBinary (program, size, &size, (GLenum*)&binaryFormat, _bytes.b);\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_program_binary) (int program, int binaryFormat, Bytes* bytes) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLint size = 0;\n\t\tglGetProgramiv (program, GL_PROGRAM_BINARY_LENGTH, &size);\n\n\t\tif (size > 0) {\n\n\t\t\tbytes->Resize (size);\n\n\t\t\tglGetProgramBinary (program, size, &size, (GLenum*)&binaryFormat, bytes->b);\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_get_program_info_log (int handle) {\n\n\t\tGLuint program = handle;\n\n\t\tGLint logSize = 0;\n\t\tglGetProgramiv (program, GL_INFO_LOG_LENGTH, &logSize);\n\n\t\tif (logSize == 0) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tstd::string buffer (logSize, 0);\n\n\t\tglGetProgramInfoLog (program, logSize, 0, &buffer[0]);\n\n\t\treturn alloc_string (buffer.c_str ());\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gl_get_program_info_log) (int handle) {\n\n\t\tGLuint program = handle;\n\n\t\tGLint logSize = 0;\n\t\tglGetProgramiv (program, GL_INFO_LOG_LENGTH, &logSize);\n\n\t\tif (logSize == 0) {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\tchar* buffer = (char*)malloc (logSize + 1);\n\n\t\tglGetProgramInfoLog (program, logSize, 0, buffer);\n\n\t\tbuffer[logSize] = '\\0';\n\t\treturn (vbyte*)buffer;\n\n\t}\n\n\n\tint lime_gl_get_programi (int program, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetProgramiv (program, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_programi) (int program, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetProgramiv (program, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_programiv (int program, int pname, double params) {\n\n\t\tglGetProgramiv (program, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_programiv) (int program, int pname, double params) {\n\n\t\tglGetProgramiv (program, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_queryi (int target, int pname) {\n\n\t\tGLint param = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryiv (target, pname, &param);\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_queryi) (int target, int pname) {\n\n\t\tGLint param = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryiv (target, pname, &param);\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_queryiv (int target, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryiv (target, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_queryiv) (int target, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryiv (target, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_query_objectui (int query, int pname) {\n\n\t\tGLuint param = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryObjectuiv (query, pname, &param);\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_query_objectui) (int query, int pname) {\n\n\t\tGLuint param = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryObjectuiv (query, pname, &param);\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_query_objectuiv (int query, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryObjectuiv (query, pname, (GLuint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_query_objectuiv) (int query, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetQueryObjectuiv (query, pname, (GLuint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_renderbuffer_parameteri (int target, int pname) {\n\n\t\tGLint param = 0;\n\t\tglGetRenderbufferParameteriv (target, pname, &param);\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_renderbuffer_parameteri) (int target, int pname) {\n\n\t\tGLint param = 0;\n\t\tglGetRenderbufferParameteriv (target, pname, &param);\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_renderbuffer_parameteriv (int target, int pname, double params) {\n\n\t\tglGetRenderbufferParameteriv (target, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_renderbuffer_parameteriv) (int target, int pname, double params) {\n\n\t\tglGetRenderbufferParameteriv (target, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tfloat lime_gl_get_sampler_parameterf (int sampler, int pname) {\n\n\t\tGLfloat param = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameterfv) {\n\t\t\tglGetSamplerParameterfv (sampler, pname, &param);\n\t\t}\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_gl_get_sampler_parameterf) (int sampler, int pname) {\n\n\t\tGLfloat param = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameterfv) {\n\t\t\tglGetSamplerParameterfv (sampler, pname, &param);\n\t\t}\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_sampler_parameterfv (int sampler, int pname, double params) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameterfv) {\n\t\t\tglGetSamplerParameterfv (sampler, pname, (GLfloat*)(uintptr_t)params);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_sampler_parameterfv) (int sampler, int pname, double params) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameterfv) {\n\t\t\tglGetSamplerParameterfv (sampler, pname, (GLfloat*)(uintptr_t)params);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_sampler_parameteri (int sampler, int pname) {\n\n\t\tGLint param = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameteriv) {\n\t\t\tglGetSamplerParameteriv (sampler, pname, &param);\n\t\t}\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_sampler_parameteri) (int sampler, int pname) {\n\n\t\tGLint param = 0;\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameteriv) {\n\t\t\tglGetSamplerParameteriv (sampler, pname, &param);\n\t\t}\n\t\t#endif\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_sampler_parameteriv (int sampler, int pname, double params) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameteriv) {\n\t\t\tglGetSamplerParameteriv (sampler, pname, (GLint*)(uintptr_t)params);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_sampler_parameteriv) (int sampler, int pname, double params) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glGetSamplerParameteriv) {\n\t\t\tglGetSamplerParameteriv (sampler, pname, (GLint*)(uintptr_t)params);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_get_shader_info_log (int handle) {\n\n\t\tGLuint shader = handle;\n\n\t\tGLint logSize = 0;\n\t\tglGetShaderiv (shader, GL_INFO_LOG_LENGTH, &logSize);\n\n\t\tif (logSize == 0) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tstd::string buffer (logSize, 0);\n\t\tGLint writeSize;\n\t\tglGetShaderInfoLog (shader, logSize, &writeSize, &buffer[0]);\n\n\t\treturn alloc_string (buffer.c_str ());\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gl_get_shader_info_log) (int handle) {\n\n\t\tGLuint shader = handle;\n\n\t\tGLint logSize = 0;\n\t\tglGetShaderiv (shader, GL_INFO_LOG_LENGTH, &logSize);\n\n\t\tif (logSize == 0) {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\tchar* buffer = (char*)malloc (logSize + 1);\n\t\tGLint writeSize;\n\t\tglGetShaderInfoLog (shader, logSize, &writeSize, buffer);\n\n\t\tbuffer[logSize] = '\\0';\n\t\treturn (vbyte*)buffer;\n\n\t}\n\n\n\tint lime_gl_get_shaderi (int shader, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetShaderiv (shader, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_shaderi) (int shader, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetShaderiv (shader, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_shaderiv (int shader, int pname, double params) {\n\n\t\tglGetShaderiv (shader, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_shaderiv) (int shader, int pname, double params) {\n\n\t\tglGetShaderiv (shader, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tvalue lime_gl_get_shader_precision_format (int shadertype, int precisiontype) {\n\n\t\t#ifdef LIME_GLES\n\n\t\tGLint range[2];\n\t\tGLint precision;\n\n\t\tglGetShaderPrecisionFormat (shadertype, precisiontype, range, &precision);\n\n\t\tvalue result = alloc_empty_object ();\n\t\talloc_field (result, val_id (\"rangeMin\"), alloc_int (range[0]));\n\t\talloc_field (result, val_id (\"rangeMax\"), alloc_int (range[1]));\n\t\talloc_field (result, val_id (\"precision\"), alloc_int (precision));\n\t\treturn result;\n\n\t\t#else\n\n\t\treturn alloc_null ();\n\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_gl_get_shader_precision_format) (int shadertype, int precisiontype) {\n\n\t\t#ifdef LIME_GLES\n\n\t\tGLint range[2];\n\t\tGLint precision;\n\n\t\tglGetShaderPrecisionFormat (shadertype, precisiontype, range, &precision);\n\n\t\tconst int id_rangeMin = hl_hash_utf8 (\"rangeMin\");\n\t\tconst int id_rangeMax = hl_hash_utf8 (\"rangeMax\");\n\t\tconst int id_precision = hl_hash_utf8 (\"precision\");\n\n\t\tvdynamic *result = (vdynamic*)hl_alloc_dynobj();\n\t\thl_dyn_seti (result, id_rangeMin, &hlt_i32, range[0]);\n\t\thl_dyn_seti (result, id_rangeMax, &hlt_i32, range[1]);\n\t\thl_dyn_seti (result, id_precision, &hlt_i32, precision);\n\t\treturn result;\n\n\t\t#else\n\n\t\treturn NULL;\n\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_gl_get_shader_source (int shader) {\n\n\t\tGLint len = 0;\n\t\tglGetShaderiv (shader, GL_SHADER_SOURCE_LENGTH, &len);\n\n\t\tif (len == 0) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tchar *buf = new char[len + 1];\n\t\tglGetShaderSource (shader, len + 1, 0, buf);\n\t\tvalue result = alloc_string (buf);\n\n\t\tdelete [] buf;\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gl_get_shader_source) (int shader) {\n\n\t\tGLint len = 0;\n\t\tglGetShaderiv (shader, GL_SHADER_SOURCE_LENGTH, &len);\n\n\t\tif (len == 0) {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\tchar *result = new char[len + 1];\n\t\tglGetShaderSource (shader, len, 0, result);\n\n\t\tresult[len] = '\\0';\n\t\treturn (vbyte*)result;\n\n\t}\n\n\n\tvalue lime_gl_get_string (int pname) {\n\n\t\tconst char* val = (const char*)glGetString (pname);\n\n\t\tif (val) {\n\n\t\t\treturn alloc_string (val);\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gl_get_string) (int pname) {\n\n\t\tconst char* val = (const char*)glGetString (pname);\n\n\t\tif (val) {\n\n\t\t\tint size = strlen (val);\n\t\t\tchar* result = (char*)malloc (size + 1);\n\t\t\tmemcpy (result, val, size);\n\t\t\tresult[size] = '\\0';\n\t\t\treturn (vbyte*)result;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_gl_get_stringi (int pname, int index) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tconst char* val = (const char*)glGetStringi (pname, index);\n\n\t\tif (val) {\n\n\t\t\treturn alloc_string (val);\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_gl_get_stringi) (int pname, int index) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tconst char* val = (const char*)glGetStringi (pname, index);\n\n\t\tif (val) {\n\n\t\t\tint size = strlen (val);\n\t\t\tchar* result = (char*)malloc (size + 1);\n\t\t\tmemcpy (result, val, size);\n\t\t\tresult[size] = '\\0';\n\t\t\treturn (vbyte*)result;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\t\t#else\n\t\treturn NULL;\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_sync_parameteri (value sync, int pname) {\n\n\t\t// TODO\n\n\t\tGLint param = 0;\n\t\t//glGetSynciv ((GLsync)(uintptr_t)sync, pname, &param);\n\t\treturn param;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_sync_parameteri) (HL_CFFIPointer* sync, int pname) {\n\n\t\t// TODO\n\n\t\tGLint param = 0;\n\t\t//glGetSynciv ((GLsync)(uintptr_t)sync, pname, &param);\n\t\treturn param;\n\n\t}\n\n\n\tvoid lime_gl_get_sync_parameteriv (value sync, int pname, double params) {\n\n\t\t// TODO\n\n\t\t//glGetSynciv ((GLsync)(uintptr_t)sync, pname, (GLint*)(uintptr_t)param);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_sync_parameteriv) (HL_CFFIPointer* sync, int pname, double params) {\n\n\t\t// TODO\n\n\t\t//glGetSynciv ((GLsync)(uintptr_t)sync, pname, (GLint*)(uintptr_t)param);\n\n\t}\n\n\n\tfloat lime_gl_get_tex_parameterf (int target, int pname) {\n\n\t\tGLfloat params = 0;\n\t\tglGetTexParameterfv (target, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_gl_get_tex_parameterf) (int target, int pname) {\n\n\t\tGLfloat params = 0;\n\t\tglGetTexParameterfv (target, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_tex_parameterfv (int target, int pname, double params) {\n\n\t\tglGetTexParameterfv (target, pname, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_tex_parameterfv) (int target, int pname, double params) {\n\n\t\tglGetTexParameterfv (target, pname, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_tex_parameteri (int target, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetTexParameteriv (target, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_tex_parameteri) (int target, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetTexParameteriv (target, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_tex_parameteriv (int target, int pname, double params) {\n\n\t\tglGetTexParameteriv (target, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_tex_parameteriv) (int target, int pname, double params) {\n\n\t\tglGetTexParameteriv (target, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tvalue lime_gl_get_transform_feedback_varying (int program, int index) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tvalue result = alloc_empty_object ();\n\n\t\tGLint maxLength = 0;\n\t\tglGetProgramiv (program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, &maxLength);\n\n\t\tGLsizei outLen = 0;\n\t\tGLsizei size = 0;\n\t\tGLenum type = 0;\n\n\t\tstd::string buffer (maxLength, 0);\n\n\t\tglGetTransformFeedbackVarying (program, index, maxLength, &outLen, &size, &type, &buffer[0]);\n\n\t\tbuffer.resize (outLen);\n\n\t\talloc_field (result, val_id (\"size\"), alloc_int (size));\n\t\talloc_field (result, val_id (\"type\"), alloc_int (type));\n\t\talloc_field (result, val_id (\"name\"), alloc_string (buffer.c_str ()));\n\n\t\treturn result;\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_gl_get_transform_feedback_varying) (int program, int index) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLint maxLength = 0;\n\t\tglGetProgramiv (program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, &maxLength);\n\n\t\tGLsizei outLen = 0;\n\t\tGLsizei size = 0;\n\t\tGLenum type = 0;\n\n\t\tchar* buffer = (char*)malloc (maxLength);\n\n\t\tglGetTransformFeedbackVarying (program, index, maxLength, &outLen, &size, &type, buffer);\n\n\t\tchar* _buffer = (char*)malloc (outLen + 1);\n\t\tmemcpy (_buffer, &buffer, outLen);\n\t\t_buffer[outLen] = '\\0';\n\n\t\tconst int id_size = hl_hash_utf8 (\"size\");\n\t\tconst int id_type = hl_hash_utf8 (\"type\");\n\t\tconst int id_name = hl_hash_utf8 (\"name\");\n\n\t\tvdynamic *result = (vdynamic*)hl_alloc_dynobj();\n\t\thl_dyn_seti (result, id_size, &hlt_i32, size);\n\t\thl_dyn_seti (result, id_type, &hlt_i32, type);\n\t\thl_dyn_setp (result, id_name, &hlt_bytes, _buffer);\n\n\t\treturn result;\n\t\t#else\n\t\treturn NULL;\n\t\t#endif\n\n\t}\n\n\n\tfloat lime_gl_get_uniformf (int program, int location) {\n\n\t\tGLfloat params = 0;\n\t\tglGetUniformfv (program, location, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_gl_get_uniformf) (int program, int location) {\n\n\t\tGLfloat params = 0;\n\t\tglGetUniformfv (program, location, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_uniformfv (int program, int location, double params) {\n\n\t\tglGetUniformfv (program, location, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_uniformfv) (int program, int location, double params) {\n\n\t\tglGetUniformfv (program, location, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_uniformi (int program, int location) {\n\n\t\tGLint params = 0;\n\t\tglGetUniformiv (program, location, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_uniformi) (int program, int location) {\n\n\t\tGLint params = 0;\n\t\tglGetUniformiv (program, location, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_uniformiv (int program, int location, double params) {\n\n\t\tglGetUniformiv (program, location, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_uniformiv) (int program, int location, double params) {\n\n\t\tglGetUniformiv (program, location, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_uniformui (int program, int location) {\n\n\t\tGLuint params = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetUniformuiv (program, location, &params);\n\t\t#endif\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_uniformui) (int program, int location) {\n\n\t\tGLuint params = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetUniformuiv (program, location, &params);\n\t\t#endif\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_uniformuiv (int program, int location, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetUniformuiv (program, location, (GLuint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_uniformuiv) (int program, int location, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetUniformuiv (program, location, (GLuint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_uniform_block_index (int program, HxString uniformBlockName) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glGetUniformBlockIndex (program, uniformBlockName.__s);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_uniform_block_index) (int program, hl_vstring* uniformBlockName) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glGetUniformBlockIndex (program, uniformBlockName ? hl_to_utf8 (uniformBlockName->bytes) : NULL);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_uniform_location (int program, HxString name) {\n\n\t\treturn glGetUniformLocation (program, name.__s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_uniform_location) (int program, hl_vstring* name) {\n\n\t\treturn glGetUniformLocation (program, name ? hl_to_utf8 (name->bytes) : NULL);\n\n\t}\n\n\n\tfloat lime_gl_get_vertex_attribf (int index, int pname) {\n\n\t\tGLfloat params = 0;\n\t\tglGetVertexAttribfv (index, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_gl_get_vertex_attribf) (int index, int pname) {\n\n\t\tGLfloat params = 0;\n\t\tglGetVertexAttribfv (index, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_vertex_attribfv (int index, int pname, double params) {\n\n\t\tglGetVertexAttribfv (index, pname, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_vertex_attribfv) (int index, int pname, double params) {\n\n\t\tglGetVertexAttribfv (index, pname, (GLfloat*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_vertex_attribi (int index, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetVertexAttribiv (index, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_vertex_attribi) (int index, int pname) {\n\n\t\tGLint params = 0;\n\t\tglGetVertexAttribiv (index, pname, &params);\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_vertex_attribiv (int index, int pname, double params) {\n\n\t\tglGetVertexAttribiv (index, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_vertex_attribiv) (int index, int pname, double params) {\n\n\t\tglGetVertexAttribiv (index, pname, (GLint*)(uintptr_t)params);\n\n\t}\n\n\n\tint lime_gl_get_vertex_attribii (int index, int pname) {\n\n\t\tGLint params = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIiv (index, pname, &params);\n\t\t#endif\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_vertex_attribii) (int index, int pname) {\n\n\t\tGLint params = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIiv (index, pname, &params);\n\t\t#endif\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_vertex_attribiiv (int index, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIiv (index, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_vertex_attribiiv) (int index, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIiv (index, pname, (GLint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tint lime_gl_get_vertex_attribiui (int index, int pname) {\n\n\t\tGLuint params = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIuiv (index, pname, &params);\n\t\t#endif\n\t\treturn params;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_gl_get_vertex_attribiui) (int index, int pname) {\n\n\t\tGLuint params = 0;\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIuiv (index, pname, &params);\n\t\t#endif\n\t\treturn params;\n\n\t}\n\n\n\tvoid lime_gl_get_vertex_attribiuiv (int index, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIuiv (index, pname, (GLuint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_get_vertex_attribiuiv) (int index, int pname, double params) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglGetVertexAttribIuiv (index, pname, (GLuint*)(uintptr_t)params);\n\t\t#endif\n\n\t}\n\n\n\tdouble lime_gl_get_vertex_attrib_pointerv (int index, int pname) {\n\n\t\tuintptr_t result = 0;\n\t\tglGetVertexAttribPointerv (index, pname, (void**)result);\n\t\treturn (double)result;\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_gl_get_vertex_attrib_pointerv) (int index, int pname) {\n\n\t\tuintptr_t result = 0;\n\t\tglGetVertexAttribPointerv (index, pname, (void**)result);\n\t\treturn (double)result;\n\n\t}\n\n\n\tvoid lime_gl_hint (int target, int mode) {\n\n\t\tglHint (target, mode);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_hint) (int target, int mode) {\n\n\t\tglHint (target, mode);\n\n\t}\n\n\n\tvoid lime_gl_invalidate_framebuffer (int target, value attachments) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glInvalidateFramebuffer) {\n\t\t\tGLint size = val_array_size (attachments);\n\t\t\tGLenum *_attachments = (GLenum*)alloca (size * sizeof(GLenum));\n\n\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\t_attachments[i] = val_int (val_array_i (attachments, i));\n\n\t\t\t}\n\n\t\t\tglInvalidateFramebuffer (target, size, _attachments);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_invalidate_framebuffer) (int target, varray* attachments) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glInvalidateFramebuffer) {\n\t\t\tGLint size = attachments->size;\n\t\t\tglInvalidateFramebuffer (target, size, (GLenum*)hl_aptr (attachments, int));\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_invalidate_sub_framebuffer (int target, value attachments, int x, int y, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glInvalidateSubFramebuffer) {\n\t\t\tGLint size = val_array_size (attachments);\n\t\t\tGLenum *_attachments = (GLenum*)alloca (size * sizeof(GLenum));\n\n\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\t_attachments[i] = val_int (val_array_i (attachments, i));\n\n\t\t\t}\n\n\t\t\tglInvalidateSubFramebuffer (target, size, _attachments, x, y, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_invalidate_sub_framebuffer) (int target, varray* attachments, int x, int y, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glInvalidateSubFramebuffer) {\n\t\t\tGLint size = attachments->size;\n\t\t\tglInvalidateSubFramebuffer (target, size, (GLenum*)hl_aptr (attachments, int), x, y, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tbool lime_gl_is_buffer (int handle) {\n\n\t\treturn glIsBuffer (handle);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_buffer) (int handle) {\n\n\t\treturn glIsBuffer (handle);\n\n\t}\n\n\n\tbool lime_gl_is_enabled (int cap) {\n\n\t\treturn glIsEnabled (cap);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_enabled) (int cap) {\n\n\t\treturn glIsEnabled (cap);\n\n\t}\n\n\n\tbool lime_gl_is_framebuffer (int handle) {\n\n\t\treturn glIsFramebuffer (handle);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_framebuffer) (int handle) {\n\n\t\treturn glIsFramebuffer (handle);\n\n\t}\n\n\n\tbool lime_gl_is_program (int handle) {\n\n\t\treturn glIsProgram (handle);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_program) (int handle) {\n\n\t\treturn glIsProgram (handle);\n\n\t}\n\n\n\tbool lime_gl_is_query (int handle) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glIsQuery (handle);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_query) (int handle) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glIsQuery (handle);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_gl_is_renderbuffer (int handle) {\n\n\t\treturn glIsRenderbuffer (handle);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_renderbuffer) (int handle) {\n\n\t\treturn glIsRenderbuffer (handle);\n\n\t}\n\n\n\tbool lime_gl_is_sampler (int handle) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\treturn glIsSampler ? glIsSampler (handle) : false;\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_sampler) (int handle) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\treturn glIsSampler ? glIsSampler (handle) : false;\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_gl_is_shader (int handle) {\n\n\t\treturn glIsShader (handle);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_shader) (int handle) {\n\n\t\treturn glIsShader (handle);\n\n\t}\n\n\n\tbool lime_gl_is_sync (value handle) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tif (val_is_null (handle)) return false;\n\t\treturn glIsSync ((GLsync)val_data (handle));\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_sync) (HL_CFFIPointer* handle) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tif (!handle) return false;\n\t\treturn glIsSync ((GLsync)handle->ptr);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_gl_is_texture (int handle) {\n\n\t\treturn glIsTexture (handle);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_texture) (int handle) {\n\n\t\treturn glIsTexture (handle);\n\n\t}\n\n\n\tbool lime_gl_is_transform_feedback (int handle) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glIsTransformFeedback (handle);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_transform_feedback) (int handle) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glIsTransformFeedback (handle);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_gl_is_vertex_array (int handle) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\treturn glIsVertexArray ? glIsVertexArray (handle) : false;\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_is_vertex_array) (int handle) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\treturn glIsVertexArray ? glIsVertexArray (handle) : false;\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_line_width (float width) {\n\n\t\tglLineWidth (width);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_line_width) (float width) {\n\n\t\tglLineWidth (width);\n\n\t}\n\n\n\tvoid lime_gl_link_program (int program) {\n\n\t\tglLinkProgram (program);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_link_program) (int program) {\n\n\t\tglLinkProgram (program);\n\n\t}\n\n\n\tdouble lime_gl_map_buffer_range (int target, double offset, int length, int access) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tuintptr_t result = (uintptr_t)glMapBufferRange (target, (GLintptr)(uintptr_t)offset, length, access);\n\t\treturn (double)result;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_gl_map_buffer_range) (int target, double offset, int length, int access) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tuintptr_t result = (uintptr_t)glMapBufferRange (target, (GLintptr)(uintptr_t)offset, length, access);\n\t\treturn (double)result;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_object_deregister (value object) {\n\n\t\tif (glObjectIDs.find (object) != glObjectIDs.end ()) {\n\n\t\t\tGLuint id = glObjectIDs[object];\n\t\t\tGLObjectType type = glObjectTypes[object];\n\n\t\t\tglObjects[type].erase (id);\n\t\t\tglObjectTypes.erase (object);\n\t\t\tglObjectIDs.erase (object);\n\n\t\t}\n\n\t\tif (glObjectPtrs.find (object) != glObjectPtrs.end ()) {\n\n\t\t\tvalue handle = (value)glObjectPtrs[object];\n\t\t\tval_gc (handle, 0);\n\t\t\tglObjectPtrs.erase (object);\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_object_deregister) (void* object) {\n\n\t\tif (glObjectIDs.find (object) != glObjectIDs.end ()) {\n\n\t\t\tGLuint id = glObjectIDs[object];\n\t\t\tGLObjectType type = glObjectTypes[object];\n\n\t\t\tglObjects[type].erase (id);\n\t\t\tglObjectTypes.erase (object);\n\t\t\tglObjectIDs.erase (object);\n\n\t\t}\n\n\t\tif (glObjectPtrs.find (object) != glObjectPtrs.end ()) {\n\n\t\t\tHL_CFFIPointer* handle = (HL_CFFIPointer*)glObjectPtrs[object];\n\t\t\thandle->finalizer = NULL;\n\t\t\t//delete handle;\n\t\t\tglObjectPtrs.erase (object);\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_gl_object_from_id (int id, int type) {\n\n\t\tGLObjectType _type = (GLObjectType)type;\n\n\t\tif (glObjects[_type].find (id) != glObjects[_type].end ()) {\n\n\t\t\treturn (value)glObjects[_type][id];\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void* HL_NAME(hl_gl_object_from_id) (int id, int type) {\n\n\t\tGLObjectType _type = (GLObjectType)type;\n\n\t\tif (glObjects[_type].find (id) != glObjects[_type].end ()) {\n\n\t\t\treturn glObjects[_type][id];\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_gl_object_register (int id, int type, value object) {\n\n\t\tGLObjectType _type = (GLObjectType)type;\n\t\tvalue handle = CFFIPointer (object, gc_gl_object);\n\n\t\t//if (glObjects[_type].find (id) != glObjects[_type].end ()) {\n\t\t\t//\n\t\t\t//value otherObject = glObjects[_type][id];\n\t\t\t//if (otherObject == object) return;\n\t\t\t//\n\t\t\t//glObjectTypes.erase (otherObject);\n\t\t\t//glObjectIDs.erase (object);\n\t\t\t//\n\t\t\t//val_gc (otherObject, 0);\n\t\t\t//\n\t\t//}\n\n\t\tglObjectTypes[object] = (GLObjectType)type;\n\t\tglObjectIDs[object] = id;\n\t\tglObjects[_type][id] = object;\n\t\tglObjectPtrs[object] = handle;\n\n\t\treturn handle;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_gl_object_register) (int id, int type, void* object) {\n\n\t\tGLObjectType _type = (GLObjectType)type;\n\t\tHL_CFFIPointer* handle = HLCFFIPointer ((vobj*)object, (hl_finalizer)hl_gc_gl_object);\n\n\t\t//if (glObjects[_type].find (id) != glObjects[_type].end ()) {\n\t\t\t//\n\t\t\t//value otherObject = glObjects[_type][id];\n\t\t\t//if (otherObject == object) return;\n\t\t\t//\n\t\t\t//glObjectTypes.erase (otherObject);\n\t\t\t//glObjectIDs.erase (object);\n\t\t\t//\n\t\t\t//val_gc (otherObject, 0);\n\t\t\t//\n\t\t//}\n\n\t\tglObjectTypes[object] = (GLObjectType)type;\n\t\tglObjectIDs[object] = id;\n\t\tglObjects[_type][id] = object;\n\t\tglObjectPtrs[object] = handle;\n\n\t\treturn handle;\n\n\t}\n\n\n\tvoid lime_gl_pause_transform_feedback () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglPauseTransformFeedback ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_pause_transform_feedback) () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglPauseTransformFeedback ();\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_pixel_storei (int pname, int param) {\n\n\t\tglPixelStorei (pname, param);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_pixel_storei) (int pname, int param) {\n\n\t\tglPixelStorei (pname, param);\n\n\t}\n\n\n\tvoid lime_gl_polygon_offset (float factor, float units) {\n\n\t\tglPolygonOffset (factor, units);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_polygon_offset) (float factor, float units) {\n\n\t\tglPolygonOffset (factor, units);\n\n\t}\n\n\n\tvoid lime_gl_program_binary (int program, int binaryFormat, double binary, int length) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglProgramBinary (program, binaryFormat, (void*)(uintptr_t)binary, length);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_program_binary) (int program, int binaryFormat, double binary, int length) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglProgramBinary (program, binaryFormat, (void*)(uintptr_t)binary, length);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_program_parameteri (int program, int pname, int value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglProgramParameteri (program, pname, value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_program_parameteri) (int program, int pname, int value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglProgramParameteri (program, pname, value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_read_buffer (int src) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glReadBuffer) {\n\t\t\tglReadBuffer (src);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_read_buffer) (int src) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glReadBuffer) {\n\t\t\tglReadBuffer (src);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_read_pixels (int x, int y, int width, int height, int format, int type, double pixels) {\n\n\t\tglReadPixels (x, y, width, height, format, type, (void*)(uintptr_t)pixels);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_read_pixels) (int x, int y, int width, int height, int format, int type, double pixels) {\n\n\t\tglReadPixels (x, y, width, height, format, type, (void*)(uintptr_t)pixels);\n\n\t}\n\n\n\tvoid lime_gl_release_shader_compiler () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglReleaseShaderCompiler ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_release_shader_compiler) () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglReleaseShaderCompiler ();\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_renderbuffer_storage (int target, int internalformat, int width, int height) {\n\n\t\tglRenderbufferStorage (target, internalformat, width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_renderbuffer_storage) (int target, int internalformat, int width, int height) {\n\n\t\tglRenderbufferStorage (target, internalformat, width, height);\n\n\t}\n\n\n\tvoid lime_gl_renderbuffer_storage_multisample (int target, int samples, int internalformat, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glRenderbufferStorageMultisample) {\n\t\t\tglRenderbufferStorageMultisample (target, samples, internalformat, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_renderbuffer_storage_multisample) (int target, int samples, int internalformat, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glRenderbufferStorageMultisample) {\n\t\t\tglRenderbufferStorageMultisample (target, samples, internalformat, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_resume_transform_feedback () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglResumeTransformFeedback ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_resume_transform_feedback) () {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglResumeTransformFeedback ();\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_sample_coverage (float val, bool invert) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglSampleCoverage (val, invert);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_sample_coverage) (float val, bool invert) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglSampleCoverage (val, invert);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_sampler_parameterf (int sampler, int pname, float param) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glSamplerParameterf) {\n\t\t\tglSamplerParameterf (sampler, pname, param);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_sampler_parameterf) (int sampler, int pname, float param) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glSamplerParameterf) {\n\t\t\tglSamplerParameterf (sampler, pname, param);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_sampler_parameteri (int sampler, int pname, int param) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glSamplerParameteri) {\n\t\t\tglSamplerParameteri (sampler, pname, param);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_sampler_parameteri) (int sampler, int pname, int param) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glSamplerParameteri) {\n\t\t\tglSamplerParameteri (sampler, pname, param);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_scissor (int x, int y, int width, int height) {\n\n\t\tglScissor (x, y, width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_scissor) (int x, int y, int width, int height) {\n\n\t\tglScissor (x, y, width, height);\n\n\t}\n\n\n\tvoid lime_gl_shader_binary (value shaders, int binaryformat, double binary, int length) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsizei size = val_array_size (shaders);\n\t\tGLenum *_shaders = (GLenum*)alloca (size * sizeof(GLenum));\n\n\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t_shaders[i] = val_int (val_array_i (shaders, i));\n\n\t\t}\n\n\t\tglShaderBinary (size, _shaders, binaryformat, (void*)(uintptr_t)binary, length);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_shader_binary) (varray* shaders, int binaryformat, double binary, int length) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsizei size = shaders->size;\n\t\tglShaderBinary (size, (GLenum*)hl_aptr (shaders, int), binaryformat, (void*)(uintptr_t)binary, length);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_shader_source (int handle, HxString source) {\n\n\t\tglShaderSource (handle, 1, &source.__s, 0);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_shader_source) (int handle, hl_vstring* source) {\n\n\t\tconst char* _source = source ? hl_to_utf8 (source->bytes) : NULL;\n\t\tglShaderSource (handle, 1, (const char**)&_source, 0);\n\n\t}\n\n\n\tvoid lime_gl_stencil_func (int func, int ref, int mask) {\n\n\t\tglStencilFunc (func, ref, mask);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_stencil_func) (int func, int ref, int mask) {\n\n\t\tglStencilFunc (func, ref, mask);\n\n\t}\n\n\n\tvoid lime_gl_stencil_func_separate (int face, int func, int ref, int mask) {\n\n\t\tglStencilFuncSeparate (face, func, ref, mask);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_stencil_func_separate) (int face, int func, int ref, int mask) {\n\n\t\tglStencilFuncSeparate (face, func, ref, mask);\n\n\t}\n\n\n\tvoid lime_gl_stencil_mask (int mask) {\n\n\t\tglStencilMask (mask);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_stencil_mask) (int mask) {\n\n\t\tglStencilMask (mask);\n\n\t}\n\n\n\tvoid lime_gl_stencil_mask_separate (int face, int mask) {\n\n\t\tglStencilMaskSeparate (face, mask);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_stencil_mask_separate) (int face, int mask) {\n\n\t\tglStencilMaskSeparate (face, mask);\n\n\t}\n\n\n\tvoid lime_gl_stencil_op (int sfail, int dpfail, int dppass) {\n\n\t\tglStencilOp (sfail, dpfail, dppass);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_stencil_op) (int sfail, int dpfail, int dppass) {\n\n\t\tglStencilOp (sfail, dpfail, dppass);\n\n\t}\n\n\n\tvoid lime_gl_stencil_op_separate (int face, int sfail, int dpfail, int dppass) {\n\n\t\tglStencilOpSeparate (face, sfail, dpfail, dppass);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_stencil_op_separate) (int face, int sfail, int dpfail, int dppass) {\n\n\t\tglStencilOpSeparate (face, sfail, dpfail, dppass);\n\n\t}\n\n\n\tvoid lime_gl_tex_image_2d (int target, int level, int internalformat, int width, int height, int border, int format, int type, double data) {\n\n\t\tglTexImage2D (target, level, internalformat, width, height, border, format, type, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_image_2d) (int target, int level, int internalformat, int width, int height, int border, int format, int type, double data) {\n\n\t\tglTexImage2D (target, level, internalformat, width, height, border, format, type, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tvoid lime_gl_tex_image_3d (int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexImage3D) {\n\t\t\tglTexImage3D (target, level, internalformat, width, height, depth, border, format, type, (void*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_image_3d) (int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexImage3D) {\n\t\t\tglTexImage3D (target, level, internalformat, width, height, depth, border, format, type, (void*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_tex_parameterf (int target, int pname, float param) {\n\n\t\tglTexParameterf (target, pname, param);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_parameterf) (int target, int pname, float param) {\n\n\t\tglTexParameterf (target, pname, param);\n\n\t}\n\n\n\tvoid lime_gl_tex_parameteri (int target, int pname, int param) {\n\n\t\tglTexParameterf (target, pname, param);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_parameteri) (int target, int pname, int param) {\n\n\t\tglTexParameterf (target, pname, param);\n\n\t}\n\n\n\tvoid lime_gl_tex_storage_2d (int target, int level, int internalformat, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexStorage2D) {\n\t\t\tglTexStorage2D (target, level, internalformat, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_storage_2d) (int target, int level, int internalformat, int width, int height) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexStorage2D) {\n\t\t\tglTexStorage2D (target, level, internalformat, width, height);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_tex_storage_3d (int target, int level, int internalformat, int width, int height, int depth) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexStorage3D) {\n\t\t\tglTexStorage3D (target, level, internalformat, width, height, depth);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_storage_3d) (int target, int level, int internalformat, int width, int height, int depth) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexStorage3D) {\n\t\t\tglTexStorage3D (target, level, internalformat, width, height, depth);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_tex_sub_image_2d (int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, double data) {\n\n\t\tglTexSubImage2D (target, level, xoffset, yoffset, width, height, format, type, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_sub_image_2d) (int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, double data) {\n\n\t\tglTexSubImage2D (target, level, xoffset, yoffset, width, height, format, type, (void*)(uintptr_t)data);\n\n\t}\n\n\n\tvoid lime_gl_tex_sub_image_3d (int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexSubImage3D) {\n\t\t\tglTexSubImage3D (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (void*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_tex_sub_image_3d) (int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, double data) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glTexSubImage3D) {\n\t\t\tglTexSubImage3D (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, (void*)(uintptr_t)data);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_transform_feedback_varyings (int program, value varyings, int bufferMode) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsizei size = val_array_size (varyings);\n\t\tconst char **_varyings = (const char**)alloca (size * sizeof(GLenum));\n\n\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t_varyings[i] = val_string (val_array_i (varyings, i));\n\n\t\t}\n\n\t\tglTransformFeedbackVaryings (program, size, _varyings, bufferMode);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_transform_feedback_varyings) (int program, varray* varyings, int bufferMode) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLsizei size = varyings->size;\n\t\tglTransformFeedbackVaryings (program, size, (const char**)hl_aptr (varyings, int), bufferMode);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform1f (int location, float v0) {\n\n\t\tglUniform1f (location, v0);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform1f) (int location, float v0) {\n\n\t\tglUniform1f (location, v0);\n\n\t}\n\n\n\tvoid lime_gl_uniform1fv (int location, int count, double _value) {\n\n\t\tglUniform1fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform1fv) (int location, int count, double _value) {\n\n\t\tglUniform1fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform1i (int location, int v0) {\n\n\t\tglUniform1i (location, v0);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform1i) (int location, int v0) {\n\n\t\tglUniform1i (location, v0);\n\n\t}\n\n\n\tvoid lime_gl_uniform1iv (int location, int count, double _value) {\n\n\t\tglUniform1iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform1iv) (int location, int count, double _value) {\n\n\t\tglUniform1iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform1ui (int location, int v0) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform1ui (location, v0);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform1ui) (int location, int v0) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform1ui (location, v0);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform1uiv (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform1uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform1uiv) (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform1uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform2f (int location, float v0, float v1) {\n\n\t\tglUniform2f (location, v0, v1);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform2f) (int location, float v0, float v1) {\n\n\t\tglUniform2f (location, v0, v1);\n\n\t}\n\n\n\tvoid lime_gl_uniform2fv (int location, int count, double _value) {\n\n\t\tglUniform2fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform2fv) (int location, int count, double _value) {\n\n\t\tglUniform2fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform2i (int location, int v0, int v1) {\n\n\t\tglUniform2i (location, v0, v1);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform2i) (int location, int v0, int v1) {\n\n\t\tglUniform2i (location, v0, v1);\n\n\t}\n\n\n\tvoid lime_gl_uniform2iv (int location, int count, double _value) {\n\n\t\tglUniform2iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform2iv) (int location, int count, double _value) {\n\n\t\tglUniform2iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform2ui (int location, int v0, int v1) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform2ui (location, v0, v1);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform2ui) (int location, int v0, int v1) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform2ui (location, v0, v1);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform2uiv (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform2uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform2uiv) (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform2uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform3f (int location, float v0, float v1, float v2) {\n\n\t\tglUniform3f (location, v0, v1, v2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform3f) (int location, float v0, float v1, float v2) {\n\n\t\tglUniform3f (location, v0, v1, v2);\n\n\t}\n\n\n\tvoid lime_gl_uniform3fv (int location, int count, double _value) {\n\n\t\tglUniform3fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform3fv) (int location, int count, double _value) {\n\n\t\tglUniform3fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform3i (int location, int v0, int v1, int v2) {\n\n\t\tglUniform3i (location, v0, v1, v2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform3i) (int location, int v0, int v1, int v2) {\n\n\t\tglUniform3i (location, v0, v1, v2);\n\n\t}\n\n\n\tvoid lime_gl_uniform3iv (int location, int count, double _value) {\n\n\t\tglUniform3iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform3iv) (int location, int count, double _value) {\n\n\t\tglUniform3iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform3ui (int location, int v0, int v1, int v2) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform3ui (location, v0, v1, v2);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform3ui) (int location, int v0, int v1, int v2) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform3ui (location, v0, v1, v2);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform3uiv (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform3uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform3uiv) (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform3uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform4f (int location, float v0, float v1, float v2, float v3) {\n\n\t\tglUniform4f (location, v0, v1, v2, v3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform4f) (int location, float v0, float v1, float v2, float v3) {\n\n\t\tglUniform4f (location, v0, v1, v2, v3);\n\n\t}\n\n\n\tvoid lime_gl_uniform4fv (int location, int count, double _value) {\n\n\t\tglUniform4fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform4fv) (int location, int count, double _value) {\n\n\t\tglUniform4fv (location, count, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform4i (int location, int v0, int v1, int v2, int v3) {\n\n\t\tglUniform4i (location, v0, v1, v2, v3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform4i) (int location, int v0, int v1, int v2, int v3) {\n\n\t\tglUniform4i (location, v0, v1, v2, v3);\n\n\t}\n\n\n\tvoid lime_gl_uniform4iv (int location, int count, double _value) {\n\n\t\tglUniform4iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform4iv) (int location, int count, double _value) {\n\n\t\tglUniform4iv (location, count, (GLint*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform4ui (int location, int v0, int v1, int v2, int v3) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform4ui (location, v0, v1, v2, v3);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform4ui) (int location, int v0, int v1, int v2, int v3) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform4ui (location, v0, v1, v2, v3);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform4uiv (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform4uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform4uiv) (int location, int count, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniform4uiv (location, count, (GLuint*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_block_binding (int program, int uniformBlockIndex, int uniformBlockBinding) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformBlockBinding (program, uniformBlockIndex, uniformBlockBinding);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_block_binding) (int program, int uniformBlockIndex, int uniformBlockBinding) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformBlockBinding (program, uniformBlockIndex, uniformBlockBinding);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix2fv (int location, int count, bool transpose, double _value) {\n\n\t\tglUniformMatrix2fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix2fv) (int location, int count, bool transpose, double _value) {\n\n\t\tglUniformMatrix2fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix2x3fv (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix2x3fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix2x3fv) (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix2x3fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix2x4fv (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix2x4fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix2x4fv) (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix2x4fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix3fv (int location, int count, bool transpose, double _value) {\n\n\t\tglUniformMatrix3fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix3fv) (int location, int count, bool transpose, double _value) {\n\n\t\tglUniformMatrix3fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix3x2fv (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix3x2fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix3x2fv) (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix3x2fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix3x4fv (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix3x4fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix3x4fv) (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix3x4fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix4fv (int location, int count, bool transpose, double _value) {\n\n\t\tglUniformMatrix4fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix4fv) (int location, int count, bool transpose, double _value) {\n\n\t\tglUniformMatrix4fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix4x2fv (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix4x2fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix4x2fv) (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix4x2fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_uniform_matrix4x3fv (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix4x3fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_uniform_matrix4x3fv) (int location, int count, bool transpose, double _value) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglUniformMatrix4x3fv (location, count, transpose, (GLfloat*)(uintptr_t)_value);\n\t\t#endif\n\n\t}\n\n\n\tbool lime_gl_unmap_buffer (int target) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glUnmapBuffer (target);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_gl_unmap_buffer) (int target) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\treturn glUnmapBuffer (target);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_use_program (int handle) {\n\n\t\tglUseProgram (handle);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_use_program) (int handle) {\n\n\t\tglUseProgram (handle);\n\n\t}\n\n\n\tvoid lime_gl_validate_program (int handle) {\n\n\t\tglValidateProgram (handle);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_validate_program) (int handle) {\n\n\t\tglValidateProgram (handle);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib_divisor (int index, int divisor) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glVertexAttribDivisor) {\n\t\t\tglVertexAttribDivisor (index, divisor);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib_divisor) (int index, int divisor) {\n\n\t\t#if defined (LIME_GLES3_API) || !defined (LIME_GLES)\n\t\tif (glVertexAttribDivisor) {\n\t\t\tglVertexAttribDivisor (index, divisor);\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib_ipointer (int index, int size, int type, int stride, double offset) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribIPointer (index, size, type, stride, (void*)(uintptr_t)offset);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib_ipointer) (int index, int size, int type, int stride, double offset) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribIPointer (index, size, type, stride, (void*)(uintptr_t)offset);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib_pointer (int index, int size, int type, bool normalized, int stride, double offset) {\n\n\t\tglVertexAttribPointer (index, size, type, normalized, stride, (void*)(uintptr_t)offset);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib_pointer) (int index, int size, int type, bool normalized, int stride, double offset) {\n\n\t\tglVertexAttribPointer (index, size, type, normalized, stride, (void*)(uintptr_t)offset);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attribi4i (int index, int v0, int v1, int v2, int v3) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4i (index, v0, v1, v2, v3);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attribi4i) (int index, int v0, int v1, int v2, int v3) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4i (index, v0, v1, v2, v3);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_vertex_attribi4iv (int index, double v) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4iv (index, (GLint*)(uintptr_t)v);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attribi4iv) (int index, double v) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4iv (index, (GLint*)(uintptr_t)v);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_vertex_attribi4ui (int index, int v0, int v1, int v2, int v3) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4ui (index, v0, v1, v2, v3);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attribi4ui) (int index, int v0, int v1, int v2, int v3) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4ui (index, v0, v1, v2, v3);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_vertex_attribi4uiv (int index, double v) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4uiv (index, (GLuint*)(uintptr_t)v);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attribi4uiv) (int index, double v) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tglVertexAttribI4uiv (index, (GLuint*)(uintptr_t)v);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib1f (int index, float v0) {\n\n\t\tglVertexAttrib1f (index, v0);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib1f) (int index, float v0) {\n\n\t\tglVertexAttrib1f (index, v0);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib1fv (int index, double v) {\n\n\t\tglVertexAttrib1fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib1fv) (int index, double v) {\n\n\t\tglVertexAttrib1fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib2f (int index, float v0, float v1) {\n\n\t\tglVertexAttrib2f (index, v0, v1);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib2f) (int index, float v0, float v1) {\n\n\t\tglVertexAttrib2f (index, v0, v1);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib2fv (int index, double v) {\n\n\t\tglVertexAttrib2fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib2fv) (int index, double v) {\n\n\t\tglVertexAttrib2fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib3f (int index, float v0, float v1, float v2) {\n\n\t\tglVertexAttrib3f (index, v0, v1, v2);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib3f) (int index, float v0, float v1, float v2) {\n\n\t\tglVertexAttrib3f (index, v0, v1, v2);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib3fv (int index, double v) {\n\n\t\tglVertexAttrib3fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib3fv) (int index, double v) {\n\n\t\tglVertexAttrib3fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib4f (int index, float v0, float v1, float v2, float v3) {\n\n\t\tglVertexAttrib4f (index, v0, v1, v2, v3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib4f) (int index, float v0, float v1, float v2, float v3) {\n\n\t\tglVertexAttrib4f (index, v0, v1, v2, v3);\n\n\t}\n\n\n\tvoid lime_gl_vertex_attrib4fv (int index, double v) {\n\n\t\tglVertexAttrib4fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_vertex_attrib4fv) (int index, double v) {\n\n\t\tglVertexAttrib4fv (index, (GLfloat*)(uintptr_t)v);\n\n\t}\n\n\n\tvoid lime_gl_viewport (int x, int y, int width, int height) {\n\n\t\tglViewport (x, y, width, height);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_viewport) (int x, int y, int width, int height) {\n\n\t\tglViewport (x, y, width, height);\n\n\t}\n\n\n\tvoid lime_gl_wait_sync (value sync, int flags, int timeoutA, int timeoutB) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLuint64 timeout = (GLuint64) timeoutA << 32 | timeoutB;\n\t\tglWaitSync ((GLsync)val_data (sync), flags, timeout);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_gl_wait_sync) (HL_CFFIPointer* sync, int flags, int timeoutA, int timeoutB) {\n\n\t\t#ifdef LIME_GLES3_API\n\t\tGLuint64 timeout = (GLuint64) timeoutA << 32 | timeoutB;\n\t\tglWaitSync ((GLsync)sync->ptr, flags, timeout);\n\t\t#endif\n\n\t}\n\n\n\tbool OpenGLBindings::Init () {\n\n\t\tstatic bool result = true;\n\n\t\tif (!initialized) {\n\n\t\t\tinitialized = true;\n\n\t\t\t#ifdef HX_LINUX\n\n\t\t\tOpenGLBindings::handle = dlopen (\"libGL.so.1\", RTLD_NOW|RTLD_GLOBAL);\n\n\t\t\tif (!OpenGLBindings::handle) {\n\n\t\t\t\tOpenGLBindings::handle = dlopen (\"libGL.so\", RTLD_NOW|RTLD_GLOBAL);\n\n\t\t\t}\n\n\t\t\tif (!OpenGLBindings::handle) {\n\n\t\t\t\tresult = false;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t\t#endif\n\n\t\t\t#ifdef NATIVE_TOOLKIT_SDL_ANGLE\n\n\t\t\t#ifdef HX_WINRT\n\t\t\treturn true;\n\t\t\t#else\n\t\t\tOpenGLBindings::eglHandle = LoadLibraryW (L\"libegl.dll\");\n\n\t\t\tif (!OpenGLBindings::eglHandle) {\n\n\t\t\t\tresult = false;\n\t\t\t\treturn result;\n\n\t\t\t}\n\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\t#ifdef NEED_EXTENSIONS\n\t\t\t#define GET_EXTENSION\n\t\t\t#include \"OpenGLExtensions.h\"\n\t\t\t#undef DEFINE_EXTENSION\n\t\t\t#endif\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\n\tDEFINE_PRIME1v (lime_gl_active_texture);\n\tDEFINE_PRIME2v (lime_gl_attach_shader);\n\tDEFINE_PRIME2v (lime_gl_begin_query);\n\tDEFINE_PRIME1v (lime_gl_begin_transform_feedback);\n\tDEFINE_PRIME3v (lime_gl_bind_attrib_location);\n\tDEFINE_PRIME2v (lime_gl_bind_buffer);\n\tDEFINE_PRIME3v (lime_gl_bind_buffer_base);\n\tDEFINE_PRIME5v (lime_gl_bind_buffer_range);\n\tDEFINE_PRIME2v (lime_gl_bind_framebuffer);\n\tDEFINE_PRIME2v (lime_gl_bind_renderbuffer);\n\tDEFINE_PRIME2v (lime_gl_bind_sampler);\n\tDEFINE_PRIME2v (lime_gl_bind_texture);\n\tDEFINE_PRIME2v (lime_gl_bind_transform_feedback);\n\tDEFINE_PRIME1v (lime_gl_bind_vertex_array);\n\tDEFINE_PRIME4v (lime_gl_blend_color);\n\tDEFINE_PRIME1v (lime_gl_blend_equation);\n\tDEFINE_PRIME2v (lime_gl_blend_equation_separate);\n\tDEFINE_PRIME2v (lime_gl_blend_func);\n\tDEFINE_PRIME4v (lime_gl_blend_func_separate);\n\tDEFINE_PRIME10v (lime_gl_blit_framebuffer);\n\tDEFINE_PRIME4v (lime_gl_buffer_data);\n\tDEFINE_PRIME4v (lime_gl_buffer_sub_data);\n\tDEFINE_PRIME1 (lime_gl_check_framebuffer_status);\n\tDEFINE_PRIME1v (lime_gl_clear);\n\tDEFINE_PRIME4v (lime_gl_clear_bufferfi);\n\tDEFINE_PRIME3v (lime_gl_clear_bufferfv);\n\tDEFINE_PRIME3v (lime_gl_clear_bufferiv);\n\tDEFINE_PRIME3v (lime_gl_clear_bufferuiv);\n\tDEFINE_PRIME4v (lime_gl_clear_color);\n\tDEFINE_PRIME1v (lime_gl_clear_depthf);\n\tDEFINE_PRIME1v (lime_gl_clear_stencil);\n\tDEFINE_PRIME4 (lime_gl_client_wait_sync);\n\tDEFINE_PRIME4v (lime_gl_color_mask);\n\tDEFINE_PRIME1v (lime_gl_compile_shader);\n\tDEFINE_PRIME8v (lime_gl_compressed_tex_image_2d);\n\tDEFINE_PRIME9v (lime_gl_compressed_tex_image_3d);\n\tDEFINE_PRIME9v (lime_gl_compressed_tex_sub_image_2d);\n\tDEFINE_PRIME11v (lime_gl_compressed_tex_sub_image_3d);\n\tDEFINE_PRIME5v (lime_gl_copy_buffer_sub_data);\n\tDEFINE_PRIME8v (lime_gl_copy_tex_image_2d);\n\tDEFINE_PRIME8v (lime_gl_copy_tex_sub_image_2d);\n\tDEFINE_PRIME9v (lime_gl_copy_tex_sub_image_3d);\n\tDEFINE_PRIME0 (lime_gl_create_buffer);\n\tDEFINE_PRIME0 (lime_gl_create_framebuffer);\n\tDEFINE_PRIME0 (lime_gl_create_program);\n\tDEFINE_PRIME0 (lime_gl_create_query);\n\tDEFINE_PRIME0 (lime_gl_create_renderbuffer);\n\tDEFINE_PRIME0 (lime_gl_create_sampler);\n\tDEFINE_PRIME1 (lime_gl_create_shader);\n\tDEFINE_PRIME0 (lime_gl_create_texture);\n\tDEFINE_PRIME0 (lime_gl_create_transform_feedback);\n\tDEFINE_PRIME0 (lime_gl_create_vertex_array);\n\tDEFINE_PRIME1v (lime_gl_cull_face);\n\tDEFINE_PRIME1v (lime_gl_delete_buffer);\n\tDEFINE_PRIME1v (lime_gl_delete_framebuffer);\n\tDEFINE_PRIME1v (lime_gl_delete_program);\n\tDEFINE_PRIME1v (lime_gl_delete_query);\n\tDEFINE_PRIME1v (lime_gl_delete_renderbuffer);\n\tDEFINE_PRIME1v (lime_gl_delete_sampler);\n\tDEFINE_PRIME1v (lime_gl_delete_shader);\n\tDEFINE_PRIME1v (lime_gl_delete_sync);\n\tDEFINE_PRIME1v (lime_gl_delete_texture);\n\tDEFINE_PRIME1v (lime_gl_delete_transform_feedback);\n\tDEFINE_PRIME1v (lime_gl_delete_vertex_array);\n\tDEFINE_PRIME1v (lime_gl_depth_func);\n\tDEFINE_PRIME1v (lime_gl_depth_mask);\n\tDEFINE_PRIME2v (lime_gl_depth_rangef);\n\tDEFINE_PRIME2v (lime_gl_detach_shader);\n\tDEFINE_PRIME1v (lime_gl_disable);\n\tDEFINE_PRIME1v (lime_gl_disable_vertex_attrib_array);\n\tDEFINE_PRIME3v (lime_gl_draw_arrays);\n\tDEFINE_PRIME4v (lime_gl_draw_arrays_instanced);\n\tDEFINE_PRIME1v (lime_gl_draw_buffers);\n\tDEFINE_PRIME4v (lime_gl_draw_elements);\n\tDEFINE_PRIME5v (lime_gl_draw_elements_instanced);\n\tDEFINE_PRIME6v (lime_gl_draw_range_elements);\n\tDEFINE_PRIME1v (lime_gl_enable);\n\tDEFINE_PRIME1v (lime_gl_enable_vertex_attrib_array);\n\tDEFINE_PRIME1v (lime_gl_end_query);\n\tDEFINE_PRIME0v (lime_gl_end_transform_feedback);\n\tDEFINE_PRIME2 (lime_gl_fence_sync);\n\tDEFINE_PRIME0v (lime_gl_finish);\n\tDEFINE_PRIME0v (lime_gl_flush);\n\tDEFINE_PRIME4v (lime_gl_framebuffer_renderbuffer);\n\tDEFINE_PRIME5v (lime_gl_framebuffer_texture_layer);\n\tDEFINE_PRIME5v (lime_gl_framebuffer_texture2D);\n\tDEFINE_PRIME1v (lime_gl_front_face);\n\tDEFINE_PRIME1v (lime_gl_generate_mipmap);\n\tDEFINE_PRIME2 (lime_gl_get_active_attrib);\n\tDEFINE_PRIME2 (lime_gl_get_active_uniform);\n\tDEFINE_PRIME3 (lime_gl_get_active_uniform_blocki);\n\tDEFINE_PRIME4v (lime_gl_get_active_uniform_blockiv);\n\tDEFINE_PRIME2 (lime_gl_get_active_uniform_block_name);\n\tDEFINE_PRIME4v (lime_gl_get_active_uniformsiv);\n\tDEFINE_PRIME1 (lime_gl_get_attached_shaders);\n\tDEFINE_PRIME2 (lime_gl_get_attrib_location);\n\tDEFINE_PRIME1 (lime_gl_get_boolean);\n\tDEFINE_PRIME2v (lime_gl_get_booleanv);\n\tDEFINE_PRIME2 (lime_gl_get_buffer_parameteri);\n\tDEFINE_PRIME3v (lime_gl_get_buffer_parameteriv);\n\tDEFINE_PRIME3v (lime_gl_get_buffer_parameteri64v);\n\tDEFINE_PRIME2 (lime_gl_get_buffer_pointerv);\n\tDEFINE_PRIME4v (lime_gl_get_buffer_sub_data);\n\tDEFINE_PRIME0 (lime_gl_get_context_attributes);\n\tDEFINE_PRIME0 (lime_gl_get_error);\n\tDEFINE_PRIME1 (lime_gl_get_extension);\n\tDEFINE_PRIME1 (lime_gl_get_float);\n\tDEFINE_PRIME2v (lime_gl_get_floatv);\n\tDEFINE_PRIME2 (lime_gl_get_frag_data_location);\n\tDEFINE_PRIME3 (lime_gl_get_framebuffer_attachment_parameteri);\n\tDEFINE_PRIME4v (lime_gl_get_framebuffer_attachment_parameteriv);\n\tDEFINE_PRIME1 (lime_gl_get_integer);\n\tDEFINE_PRIME2v (lime_gl_get_integerv);\n\tDEFINE_PRIME2v (lime_gl_get_integer64v);\n\tDEFINE_PRIME3v (lime_gl_get_integer64i_v);\n\tDEFINE_PRIME3v (lime_gl_get_integeri_v);\n\tDEFINE_PRIME5v (lime_gl_get_internalformativ);\n\tDEFINE_PRIME2 (lime_gl_get_programi);\n\tDEFINE_PRIME3v (lime_gl_get_programiv);\n\tDEFINE_PRIME3v (lime_gl_get_program_binary);\n\tDEFINE_PRIME1 (lime_gl_get_program_info_log);\n\tDEFINE_PRIME2 (lime_gl_get_queryi);\n\tDEFINE_PRIME3v (lime_gl_get_queryiv);\n\tDEFINE_PRIME2 (lime_gl_get_query_objectui);\n\tDEFINE_PRIME3v (lime_gl_get_query_objectuiv);\n\tDEFINE_PRIME2 (lime_gl_get_renderbuffer_parameteri);\n\tDEFINE_PRIME3v (lime_gl_get_renderbuffer_parameteriv);\n\tDEFINE_PRIME2 (lime_gl_get_sampler_parameterf);\n\tDEFINE_PRIME3v (lime_gl_get_sampler_parameterfv);\n\tDEFINE_PRIME2 (lime_gl_get_sampler_parameteri);\n\tDEFINE_PRIME3v (lime_gl_get_sampler_parameteriv);\n\tDEFINE_PRIME1 (lime_gl_get_shader_info_log);\n\tDEFINE_PRIME2 (lime_gl_get_shaderi);\n\tDEFINE_PRIME3v (lime_gl_get_shaderiv);\n\tDEFINE_PRIME2 (lime_gl_get_shader_precision_format);\n\tDEFINE_PRIME1 (lime_gl_get_shader_source);\n\tDEFINE_PRIME1 (lime_gl_get_string);\n\tDEFINE_PRIME2 (lime_gl_get_stringi);\n\tDEFINE_PRIME2 (lime_gl_get_sync_parameteri);\n\tDEFINE_PRIME3v (lime_gl_get_sync_parameteriv);\n\tDEFINE_PRIME2 (lime_gl_get_tex_parameterf);\n\tDEFINE_PRIME3v (lime_gl_get_tex_parameterfv);\n\tDEFINE_PRIME2 (lime_gl_get_tex_parameteri);\n\tDEFINE_PRIME3v (lime_gl_get_tex_parameteriv);\n\tDEFINE_PRIME2 (lime_gl_get_transform_feedback_varying);\n\tDEFINE_PRIME2 (lime_gl_get_uniformf);\n\tDEFINE_PRIME3v (lime_gl_get_uniformfv);\n\tDEFINE_PRIME2 (lime_gl_get_uniformi);\n\tDEFINE_PRIME3v (lime_gl_get_uniformiv);\n\tDEFINE_PRIME2 (lime_gl_get_uniformui);\n\tDEFINE_PRIME3v (lime_gl_get_uniformuiv);\n\tDEFINE_PRIME2 (lime_gl_get_uniform_block_index);\n\tDEFINE_PRIME2 (lime_gl_get_uniform_location);\n\tDEFINE_PRIME2 (lime_gl_get_vertex_attribf);\n\tDEFINE_PRIME3v (lime_gl_get_vertex_attribfv);\n\tDEFINE_PRIME2 (lime_gl_get_vertex_attribi);\n\tDEFINE_PRIME3v (lime_gl_get_vertex_attribiv);\n\tDEFINE_PRIME2 (lime_gl_get_vertex_attribii);\n\tDEFINE_PRIME3v (lime_gl_get_vertex_attribiiv);\n\tDEFINE_PRIME2 (lime_gl_get_vertex_attribiui);\n\tDEFINE_PRIME3v (lime_gl_get_vertex_attribiuiv);\n\tDEFINE_PRIME2 (lime_gl_get_vertex_attrib_pointerv);\n\tDEFINE_PRIME2v (lime_gl_hint);\n\tDEFINE_PRIME2v (lime_gl_invalidate_framebuffer);\n\tDEFINE_PRIME6v (lime_gl_invalidate_sub_framebuffer);\n\tDEFINE_PRIME1 (lime_gl_is_buffer);\n\tDEFINE_PRIME1 (lime_gl_is_enabled);\n\tDEFINE_PRIME1 (lime_gl_is_framebuffer);\n\tDEFINE_PRIME1 (lime_gl_is_program);\n\tDEFINE_PRIME1 (lime_gl_is_query);\n\tDEFINE_PRIME1 (lime_gl_is_renderbuffer);\n\tDEFINE_PRIME1 (lime_gl_is_sampler);\n\tDEFINE_PRIME1 (lime_gl_is_shader);\n\tDEFINE_PRIME1 (lime_gl_is_sync);\n\tDEFINE_PRIME1 (lime_gl_is_texture);\n\tDEFINE_PRIME1 (lime_gl_is_transform_feedback);\n\tDEFINE_PRIME1 (lime_gl_is_vertex_array);\n\tDEFINE_PRIME1v (lime_gl_line_width);\n\tDEFINE_PRIME1v (lime_gl_link_program);\n\tDEFINE_PRIME4 (lime_gl_map_buffer_range);\n\tDEFINE_PRIME1v (lime_gl_object_deregister);\n\tDEFINE_PRIME2 (lime_gl_object_from_id);\n\tDEFINE_PRIME3 (lime_gl_object_register);\n\tDEFINE_PRIME0v (lime_gl_pause_transform_feedback);\n\tDEFINE_PRIME2v (lime_gl_pixel_storei);\n\tDEFINE_PRIME2v (lime_gl_polygon_offset);\n\tDEFINE_PRIME4v (lime_gl_program_binary);\n\tDEFINE_PRIME3v (lime_gl_program_parameteri);\n\tDEFINE_PRIME1v (lime_gl_read_buffer);\n\tDEFINE_PRIME7v (lime_gl_read_pixels);\n\tDEFINE_PRIME0v (lime_gl_release_shader_compiler);\n\tDEFINE_PRIME4v (lime_gl_renderbuffer_storage);\n\tDEFINE_PRIME5v (lime_gl_renderbuffer_storage_multisample);\n\tDEFINE_PRIME0v (lime_gl_resume_transform_feedback);\n\tDEFINE_PRIME2v (lime_gl_sample_coverage);\n\tDEFINE_PRIME3v (lime_gl_sampler_parameterf);\n\tDEFINE_PRIME3v (lime_gl_sampler_parameteri);\n\tDEFINE_PRIME4v (lime_gl_scissor);\n\tDEFINE_PRIME4v (lime_gl_shader_binary);\n\tDEFINE_PRIME2v (lime_gl_shader_source);\n\tDEFINE_PRIME3v (lime_gl_stencil_func);\n\tDEFINE_PRIME4v (lime_gl_stencil_func_separate);\n\tDEFINE_PRIME1v (lime_gl_stencil_mask);\n\tDEFINE_PRIME2v (lime_gl_stencil_mask_separate);\n\tDEFINE_PRIME3v (lime_gl_stencil_op);\n\tDEFINE_PRIME4v (lime_gl_stencil_op_separate);\n\tDEFINE_PRIME9v (lime_gl_tex_image_2d);\n\tDEFINE_PRIME10v (lime_gl_tex_image_3d);\n\tDEFINE_PRIME3v (lime_gl_tex_parameterf);\n\tDEFINE_PRIME3v (lime_gl_tex_parameteri);\n\tDEFINE_PRIME5v (lime_gl_tex_storage_2d);\n\tDEFINE_PRIME6v (lime_gl_tex_storage_3d);\n\tDEFINE_PRIME9v (lime_gl_tex_sub_image_2d);\n\tDEFINE_PRIME11v (lime_gl_tex_sub_image_3d);\n\tDEFINE_PRIME3v (lime_gl_transform_feedback_varyings);\n\tDEFINE_PRIME2v (lime_gl_uniform1f);\n\tDEFINE_PRIME3v (lime_gl_uniform1fv);\n\tDEFINE_PRIME2v (lime_gl_uniform1i);\n\tDEFINE_PRIME3v (lime_gl_uniform1iv);\n\tDEFINE_PRIME2v (lime_gl_uniform1ui);\n\tDEFINE_PRIME3v (lime_gl_uniform1uiv);\n\tDEFINE_PRIME3v (lime_gl_uniform2f);\n\tDEFINE_PRIME3v (lime_gl_uniform2fv);\n\tDEFINE_PRIME3v (lime_gl_uniform2i);\n\tDEFINE_PRIME3v (lime_gl_uniform2iv);\n\tDEFINE_PRIME3v (lime_gl_uniform2ui);\n\tDEFINE_PRIME3v (lime_gl_uniform2uiv);\n\tDEFINE_PRIME4v (lime_gl_uniform3f);\n\tDEFINE_PRIME3v (lime_gl_uniform3fv);\n\tDEFINE_PRIME4v (lime_gl_uniform3i);\n\tDEFINE_PRIME3v (lime_gl_uniform3iv);\n\tDEFINE_PRIME4v (lime_gl_uniform3ui);\n\tDEFINE_PRIME3v (lime_gl_uniform3uiv);\n\tDEFINE_PRIME5v (lime_gl_uniform4f);\n\tDEFINE_PRIME3v (lime_gl_uniform4fv);\n\tDEFINE_PRIME5v (lime_gl_uniform4i);\n\tDEFINE_PRIME3v (lime_gl_uniform4iv);\n\tDEFINE_PRIME5v (lime_gl_uniform4ui);\n\tDEFINE_PRIME3v (lime_gl_uniform4uiv);\n\tDEFINE_PRIME3v (lime_gl_uniform_block_binding);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix2fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix2x3fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix2x4fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix3fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix3x2fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix3x4fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix4fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix4x2fv);\n\tDEFINE_PRIME4v (lime_gl_uniform_matrix4x3fv);\n\tDEFINE_PRIME1 (lime_gl_unmap_buffer);\n\tDEFINE_PRIME1v (lime_gl_use_program);\n\tDEFINE_PRIME1v (lime_gl_validate_program);\n\tDEFINE_PRIME2v (lime_gl_vertex_attrib_divisor);\n\tDEFINE_PRIME5v (lime_gl_vertex_attrib_ipointer);\n\tDEFINE_PRIME6v (lime_gl_vertex_attrib_pointer);\n\tDEFINE_PRIME5v (lime_gl_vertex_attribi4i);\n\tDEFINE_PRIME2v (lime_gl_vertex_attribi4iv);\n\tDEFINE_PRIME5v (lime_gl_vertex_attribi4ui);\n\tDEFINE_PRIME2v (lime_gl_vertex_attribi4uiv);\n\tDEFINE_PRIME2v (lime_gl_vertex_attrib1f);\n\tDEFINE_PRIME2v (lime_gl_vertex_attrib1fv);\n\tDEFINE_PRIME3v (lime_gl_vertex_attrib2f);\n\tDEFINE_PRIME2v (lime_gl_vertex_attrib2fv);\n\tDEFINE_PRIME4v (lime_gl_vertex_attrib3f);\n\tDEFINE_PRIME2v (lime_gl_vertex_attrib3fv);\n\tDEFINE_PRIME5v (lime_gl_vertex_attrib4f);\n\tDEFINE_PRIME2v (lime_gl_vertex_attrib4fv);\n\tDEFINE_PRIME4v (lime_gl_viewport);\n\tDEFINE_PRIME4v (lime_gl_wait_sync);\n\n\n\t#define _TBYTES _OBJ (_I32 _BYTES)\n\t#define _TCFFIPOINTER _DYN\n\n\t#define _TGLOBJECT _OBJ (_I32 _TCFFIPOINTER _OBJ (_I32 _ARR))\n\n\n\tDEFINE_HL_PRIM (_VOID, hl_gl_active_texture, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_attach_shader, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_begin_query, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_begin_transform_feedback, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_attrib_location, _I32 _I32 _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_buffer, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_buffer_base, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_buffer_range, _I32 _I32 _I32 _F64 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_framebuffer, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_renderbuffer, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_sampler, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_texture, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_transform_feedback, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_bind_vertex_array, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_blend_color, _F32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_blend_equation, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_blend_equation_separate, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_blend_func, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_blend_func_separate, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_blit_framebuffer, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_buffer_data, _I32 _I32 _F64 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_buffer_sub_data, _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_check_framebuffer_status, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_bufferfi, _I32 _I32 _F32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_bufferfv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_bufferiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_bufferuiv,  _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_color, _F32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_depthf, _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_clear_stencil, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_client_wait_sync, _TCFFIPOINTER _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_color_mask, _BOOL _BOOL _BOOL _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_compile_shader, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_compressed_tex_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_compressed_tex_image_3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_compressed_tex_sub_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_compressed_tex_sub_image_3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_copy_buffer_sub_data, _I32 _I32 _F64 _F64 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_copy_tex_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_copy_tex_sub_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_copy_tex_sub_image_3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_buffer, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_framebuffer, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_program, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_query, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_renderbuffer, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_sampler, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_shader, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_texture, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_transform_feedback, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_create_vertex_array, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_cull_face, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_buffer, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_framebuffer, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_program, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_query, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_renderbuffer, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_sampler, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_shader, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_sync, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_texture, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_transform_feedback, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_delete_vertex_array, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_depth_func, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_depth_mask, _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_depth_rangef, _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_detach_shader, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_disable, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_disable_vertex_attrib_array, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_draw_arrays, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_draw_arrays_instanced, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_draw_buffers, _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_draw_elements, _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_draw_elements_instanced, _I32 _I32 _I32 _F64 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_draw_range_elements, _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_enable, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_enable_vertex_attrib_array, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_end_query, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_end_transform_feedback, _NO_ARG);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_gl_fence_sync, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_finish, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_flush, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_framebuffer_renderbuffer, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_framebuffer_texture_layer, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_framebuffer_texture2D, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_front_face, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_generate_mipmap, _I32);\n\tDEFINE_HL_PRIM (_DYN, hl_gl_get_active_attrib, _I32 _I32);\n\tDEFINE_HL_PRIM (_DYN, hl_gl_get_active_uniform, _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_active_uniform_blocki, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_active_uniform_blockiv, _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_BYTES, hl_gl_get_active_uniform_block_name, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_active_uniformsiv, _I32 _ARR _I32 _F64);\n\tDEFINE_HL_PRIM (_ARR, hl_gl_get_attached_shaders, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_attrib_location, _I32 _STRING);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_get_boolean, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_booleanv, _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_buffer_parameteri, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_buffer_parameteriv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_buffer_parameteri64v, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_F64, hl_gl_get_buffer_pointerv, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_buffer_sub_data, _I32 _F64 _I32 _F64);\n\tDEFINE_HL_PRIM (_DYN, hl_gl_get_context_attributes, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_error, _NO_ARG);\n\tDEFINE_HL_PRIM (_DYN, hl_gl_get_extension, _STRING);\n\tDEFINE_HL_PRIM (_F32, hl_gl_get_float, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_floatv, _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_frag_data_location, _I32 _STRING);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_framebuffer_attachment_parameteri, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_framebuffer_attachment_parameteriv, _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_integer, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_integerv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_integer64v, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_integer64i_v, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_integeri_v, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_internalformativ, _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_programi, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_programiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_program_binary, _I32 _I32 _TBYTES);\n\tDEFINE_HL_PRIM (_BYTES, hl_gl_get_program_info_log, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_queryi, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_queryiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_query_objectui, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_query_objectuiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_renderbuffer_parameteri, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_renderbuffer_parameteriv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_F32, hl_gl_get_sampler_parameterf, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_sampler_parameterfv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_sampler_parameteri, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_sampler_parameteriv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_BYTES, hl_gl_get_shader_info_log, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_shaderi, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_shaderiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_DYN, hl_gl_get_shader_precision_format, _I32 _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_gl_get_shader_source, _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_gl_get_string, _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_gl_get_stringi, _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_sync_parameteri, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_sync_parameteriv, _TCFFIPOINTER _I32 _F64);\n\tDEFINE_HL_PRIM (_F32, hl_gl_get_tex_parameterf, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_tex_parameterfv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_tex_parameteri, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_tex_parameteriv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_DYN, hl_gl_get_transform_feedback_varying, _I32 _I32);\n\tDEFINE_HL_PRIM (_F32, hl_gl_get_uniformf, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_uniformfv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_uniformi, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_uniformiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_uniformui, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_uniformuiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_uniform_block_index, _I32 _STRING);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_uniform_location, _I32 _STRING);\n\tDEFINE_HL_PRIM (_F32, hl_gl_get_vertex_attribf, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_vertex_attribfv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_vertex_attribi, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_vertex_attribiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_vertex_attribii, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_vertex_attribiiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_I32, hl_gl_get_vertex_attribiui, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_get_vertex_attribiuiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_F64, hl_gl_get_vertex_attrib_pointerv, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_hint, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_invalidate_framebuffer, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_invalidate_sub_framebuffer, _I32 _ARR _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_buffer, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_enabled, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_framebuffer, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_program, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_query, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_renderbuffer, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_sampler, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_shader, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_sync, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_texture, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_transform_feedback, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_is_vertex_array, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_line_width, _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_link_program, _I32);\n\tDEFINE_HL_PRIM (_F64, hl_gl_map_buffer_range, _I32 _F64 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_object_deregister, _TGLOBJECT);\n\tDEFINE_HL_PRIM (_TGLOBJECT, hl_gl_object_from_id, _I32 _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_gl_object_register, _I32 _I32 _TGLOBJECT);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_pause_transform_feedback, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_pixel_storei, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_polygon_offset, _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_program_binary, _I32 _I32 _F64 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_program_parameteri, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_read_buffer, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_read_pixels, _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_release_shader_compiler, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_renderbuffer_storage, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_renderbuffer_storage_multisample, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_resume_transform_feedback, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_sample_coverage, _F32 _BOOL);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_sampler_parameterf, _I32 _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_sampler_parameteri, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_scissor, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_shader_binary, _ARR _I32 _F64 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_shader_source, _I32 _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_stencil_func, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_stencil_func_separate, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_stencil_mask, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_stencil_mask_separate, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_stencil_op, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_stencil_op_separate, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_image_3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_parameterf, _I32 _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_parameteri, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_storage_2d, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_storage_3d, _I32 _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_sub_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_tex_sub_image_3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_transform_feedback_varyings, _I32 _ARR _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform1f, _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform1fv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform1i, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform1iv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform1ui, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform1uiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform2f, _I32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform2fv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform2i, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform2iv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform2ui, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform2uiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform3f, _I32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform3fv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform3i, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform3iv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform3ui, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform3uiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform4f, _I32 _F32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform4fv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform4i, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform4iv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform4ui, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform4uiv, _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_block_binding, _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix2fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix2x3fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix2x4fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix3fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix3x2fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix3x4fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix4fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix4x2fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_uniform_matrix4x3fv, _I32 _I32 _BOOL _F64);\n\tDEFINE_HL_PRIM (_BOOL, hl_gl_unmap_buffer, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_use_program, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_validate_program, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib_divisor, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib_ipointer, _I32 _I32 _I32 _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib_pointer, _I32 _I32 _I32 _BOOL _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attribi4i, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attribi4iv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attribi4ui, _I32 _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attribi4uiv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib1f, _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib1fv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib2f, _I32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib2fv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib3f, _I32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib3fv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib4f, _I32 _F32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_vertex_attrib4fv, _I32 _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_viewport, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_gl_wait_sync, _TCFFIPOINTER _I32 _I32 _I32);\n\n\n}\n\n\nextern \"C\" int lime_opengl_register_prims () {\n\n\treturn 0;\n\n}\n"
  },
  {
    "path": "project/src/graphics/opengl/OpenGLBindings.h",
    "content": "#ifndef LIME_GRAPHICS_OPENGL_OPENGL_BINDINGS_H\n#define LIME_GRAPHICS_OPENGL_OPENGL_BINDINGS_H\n\n\nnamespace lime {\n\n\n\tclass OpenGLBindings {\n\n\t\tpublic:\n\n\t\t\tstatic bool Init ();\n\n\t\t\tstatic int defaultFramebuffer;\n\t\t\tstatic int defaultRenderbuffer;\n\t\t\tstatic void* handle;\n\n\t\t\t#ifdef NATIVE_TOOLKIT_SDL_ANGLE\n\t\t\tstatic void* eglHandle;\n\t\t\t#endif\n\n\n\t\tprivate:\n\n\t\t\tstatic bool initialized;\n\n\n\t};\n\n\n\tenum GLObjectType {\n\n\t\tTYPE_UNKNOWN,\n\t\tTYPE_PROGRAM,\n\t\tTYPE_SHADER,\n\t\tTYPE_BUFFER,\n\t\tTYPE_TEXTURE,\n\t\tTYPE_FRAMEBUFFER,\n\t\tTYPE_RENDERBUFFER,\n\t\tTYPE_VERTEX_ARRAY_OBJECT,\n\t\tTYPE_QUERY,\n\t\tTYPE_SAMPLER,\n\t\tTYPE_SYNC,\n\t\tTYPE_TRANSFORM_FEEDBACK\n\n\t};\n\n\n}\n\n\n#endif"
  },
  {
    "path": "project/src/graphics/opengl/OpenGLExtensions.h",
    "content": "#ifndef GL_UNSIGNED_SHORT_4_4_4_4\n#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033\n#define GL_UNSIGNED_SHORT_5_6_5 0x8363\n#endif\n\n\n#ifdef HX_WINDOWS\n#define CALLING_CONVENTION APIENTRY\n#else\n#define CALLING_CONVENTION APIENTRY\n#endif\n\n#include \"OpenGLBindings.h\"\n\n#ifdef LIME_SDL\n#include <SDL.h>\n#ifdef NATIVE_TOOLKIT_SDL_ANGLE\n#include <SDL_egl.h>\n#endif\n#endif\n\n\n#ifdef DECLARE_EXTENSION\n\n//namespace lime { void *OpenGLBindings::handle = 0; }\n\n#define OGL_EXT(func,ret,args) \\\n   namespace lime { extern ret (CALLING_CONVENTION *func)args; }\n\n#define EGL_EXT(func,ret,args) \\\n   namespace lime { extern ret (CALLING_CONVENTION *func)args; }\n\n#elif defined(DEFINE_EXTENSION)\n\n#define OGL_EXT(func,ret,args) \\\n   namespace lime { ret (CALLING_CONVENTION *func)args=0; }\n\n#define EGL_EXT(func, ret, args) \\\n   namespace lime { ret (CALLING_CONVENTION *func)args=0; }\n\n#elif defined(GET_EXTENSION)\n\n#if defined (LIME_SDL) && defined (NATIVE_TOOLKIT_SDL_ANGLE)\n   #define OGL_EXT(func,ret,args) \\\n   {\\\n      *(void **)&lime::func = (void *)SDL_GL_GetProcAddress(#func);\\\n   }\n\n   #define EGL_EXT(func,ret,args) \\\n   {\\\n      *(void **)&lime::func = (void *)GetProcAddress((HMODULE)lime::OpenGLBindings::eglHandle, #func);\\\n   }\n#elif LIME_SDL\n   #define OGL_EXT(func,ret,args) \\\n   {\\\n      *(void **)&lime::func = (void *)SDL_GL_GetProcAddress(#func);\\\n      if (!func) \\\n         *(void **)&lime::func = (void *)SDL_GL_GetProcAddress(#func \"ARB\");\\\n   }\n#elif HX_WINDOWS\n   #define OGL_EXT(func,ret,args) \\\n   {\\\n      *(void **)&lime::func = (void *)wglGetProcAddress(#func);\\\n      if (!func) \\\n         *(void **)&lime::func = (void *)wglGetProcAddress(#func \"ARB\");\\\n   }\n#elif defined(HX_LINUX)\n   #define OGL_EXT(func,ret,args) \\\n   {\\\n      *(void **)&lime::func = (void *)dlsym(lime::OpenGLBindings::handle,#func);\\\n      if (!func) \\\n         *(void **)&lime::func = (void *)dlsym(lime::OpenGLBindings::handle,#func \"ARB\");\\\n   }\n#endif\n\n#endif\n\nOGL_EXT(glBindBuffer,void,(GLenum,GLuint));\nOGL_EXT(glDeleteBuffers,void,(GLsizei,const GLuint *));\nOGL_EXT(glGenBuffers,void,(GLsizei,GLuint*));\nOGL_EXT(glBufferData,void,(GLenum,GLuint,const void *, GLenum));\nOGL_EXT(glCreateShader,GLuint,(GLenum));\nOGL_EXT(glGetUniformLocation,GLint,(GLuint,const char *));\nOGL_EXT(glUniform4f,void,(GLint,float,float,float,float));\nOGL_EXT(glUniformMatrix2fv,void,(GLint,GLsizei,GLboolean,const float *));\nOGL_EXT(glUniformMatrix3fv,void,(GLint,GLsizei,GLboolean,const float *));\nOGL_EXT(glUniformMatrix4fv,void,(GLint,GLsizei,GLboolean,const float *));\nOGL_EXT(glDeleteShader,void,(GLint));\nOGL_EXT(glDeleteProgram,void,(GLint));\nOGL_EXT(glGetAttribLocation,GLint,(GLuint,const char *));\nOGL_EXT(glShaderSource,void,(GLuint,GLsizei,const char **, const GLint *));\nOGL_EXT(glDisableVertexAttribArray,void,(GLuint));\nOGL_EXT(glEnableVertexAttribArray,void,(GLuint));\nOGL_EXT(glAttachShader,void,(GLuint,GLuint));\nOGL_EXT(glCreateProgram,GLuint,());\nOGL_EXT(glCompileShader,void,(GLuint));\nOGL_EXT(glLinkProgram,void,(GLuint));\nOGL_EXT(glGetShaderiv,void,(GLuint,GLenum,GLint *));\nOGL_EXT(glValidateProgram,void,(GLuint));\nOGL_EXT(glGetShaderInfoLog,void,(GLuint,GLsizei,GLsizei *,char *));\nOGL_EXT(glGetProgramiv,void,(GLuint,GLenum,GLint *));\nOGL_EXT(glGetProgramInfoLog,void,(GLuint,GLsizei,GLsizei *,char *));\nOGL_EXT(glUseProgram,void,(GLuint));\nOGL_EXT(glUniform1i,void,(GLuint,GLint));\nOGL_EXT(glVertexAttribPointer,void,(GLuint,GLint,GLenum,GLboolean,GLsizei,const void *));\nOGL_EXT(glActiveTexture,void,(GLenum));\n\nOGL_EXT(glIsBuffer,GLboolean,(GLuint));\nOGL_EXT(glIsFramebuffer,GLboolean,(GLuint));\nOGL_EXT(glIsRenderbuffer,GLboolean,(GLuint));\nOGL_EXT(glBlendColor,void,(GLclampf, GLclampf, GLclampf, GLclampf));\nOGL_EXT(glBlendEquation,void,(GLenum));\nOGL_EXT(glBlendFuncSeparate,void,(GLenum, GLenum, GLenum, GLenum));\nOGL_EXT(glBufferSubData,void,(GLenum, GLintptr, GLsizeiptr, const GLvoid *));\nOGL_EXT(glGetBufferParameteriv,void,(GLenum, GLenum, GLint *));\nOGL_EXT(glBindFramebuffer,void,(GLenum, GLuint));\nOGL_EXT(glGenFramebuffers,void,(GLsizei, GLuint *));\nOGL_EXT(glDeleteFramebuffers,void,(GLsizei, GLuint *));\nOGL_EXT(glBindRenderbuffer,void,(GLenum, GLuint));\nOGL_EXT(glFramebufferRenderbuffer,void,(GLenum, GLenum, GLenum, GLuint));\nOGL_EXT(glFramebufferTexture2D,void,(GLenum, GLenum, GLenum, GLuint, GLint));\nOGL_EXT(glRenderbufferStorage,void,(GLenum, GLenum, GLsizei, GLsizei));\nOGL_EXT(glCheckFramebufferStatus,GLenum,(GLenum));\nOGL_EXT(glSampleCoverage,void,(GLclampf, GLboolean));\nOGL_EXT(glCompressedTexSubImage2D,void,(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *));\nOGL_EXT(glCompressedTexImage2D,void,(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *));\nOGL_EXT(glGenerateMipmap,void,(GLenum));\nOGL_EXT(glGenRenderbuffers,void,(GLsizei, GLuint *));\nOGL_EXT(glDeleteRenderbuffers,void,(GLsizei, GLuint *));\nOGL_EXT(glGetFramebufferAttachmentParameteriv,void,(GLenum, GLenum, GLenum, GLint *));\nOGL_EXT(glGetRenderbufferParameteriv,void,(GLenum, GLenum, GLint *));\n\nOGL_EXT(glBlendEquationSeparate,void,(GLenum, GLenum));\nOGL_EXT(glDrawBuffers,void,(GLsizei, const GLenum *));\nOGL_EXT(glStencilOpSeparate,void,(GLenum, GLenum, GLenum, GLenum));\nOGL_EXT(glStencilFuncSeparate,void,(GLenum, GLenum, GLint, GLuint));\nOGL_EXT(glStencilMaskSeparate,void,(GLenum, GLuint));\nOGL_EXT(glBindAttribLocation,void,(GLuint, GLuint, const GLchar *));\nOGL_EXT(glDetachShader,void,(GLuint, GLuint));\nOGL_EXT(glGetActiveAttrib,void,(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *));\nOGL_EXT(glGetActiveUniform,void,(GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *));\nOGL_EXT(glGetAttachedShaders,void,(GLuint, GLsizei, GLsizei *, GLuint *));\nOGL_EXT(glGetShaderSource,void,(GLuint, GLsizei, GLsizei *, GLchar *));\nOGL_EXT(glGetUniformfv,void,(GLuint, GLint, GLfloat *));\nOGL_EXT(glGetUniformiv,void,(GLuint, GLint, GLint *));\nOGL_EXT(glGetVertexAttribfv,void,(GLuint, GLenum, GLfloat *));\nOGL_EXT(glGetVertexAttribiv,void,(GLuint, GLenum, GLint *));\nOGL_EXT(glGetVertexAttribPointerv,void,(GLuint, GLenum, GLvoid* *));\nOGL_EXT(glIsProgram,GLboolean,(GLuint));\nOGL_EXT(glIsShader,GLboolean,(GLuint));\n\nOGL_EXT(glUniform1f,void,(GLint, GLfloat));\nOGL_EXT(glUniform2f,void,(GLint, GLfloat, GLfloat));\nOGL_EXT(glUniform3f,void,(GLint, GLfloat, GLfloat, GLfloat));\nOGL_EXT(glUniform2i,void,(GLint, GLint, GLint));\nOGL_EXT(glUniform3i,void,(GLint, GLint, GLint, GLint));\nOGL_EXT(glUniform4i,void,(GLint, GLint, GLint, GLint, GLint));\nOGL_EXT(glUniform1fv,void,(GLint, GLsizei, const GLfloat *));\nOGL_EXT(glUniform2fv,void,(GLint, GLsizei, const GLfloat *));\nOGL_EXT(glUniform3fv,void,(GLint, GLsizei, const GLfloat *));\nOGL_EXT(glUniform4fv,void,(GLint, GLsizei, const GLfloat *));\nOGL_EXT(glUniform1iv,void,(GLint, GLsizei, const GLint *));\nOGL_EXT(glUniform2iv,void,(GLint, GLsizei, const GLint *));\nOGL_EXT(glUniform3iv,void,(GLint, GLsizei, const GLint *));\nOGL_EXT(glUniform4iv,void,(GLint, GLsizei, const GLint *));\n\nOGL_EXT(glVertexAttrib1f,void,(GLuint, GLfloat));\nOGL_EXT(glVertexAttrib1fv,void,(GLuint, const GLfloat *));\nOGL_EXT(glVertexAttrib2f,void,(GLuint, GLfloat, GLfloat));\nOGL_EXT(glVertexAttrib2fv,void,(GLuint, const GLfloat *));\nOGL_EXT(glVertexAttrib3f,void,(GLuint, GLfloat, GLfloat, GLfloat));\nOGL_EXT(glVertexAttrib3fv,void,(GLuint, const GLfloat *));\nOGL_EXT(glVertexAttrib4f,void,(GLuint, GLfloat, GLfloat, GLfloat, GLfloat));\nOGL_EXT(glVertexAttrib4fv,void,(GLuint, const GLfloat *));\n\nOGL_EXT(glBeginQuery, void, (GLenum target, GLuint id));\nOGL_EXT(glBeginTransformFeedback, void, (GLenum primitiveMode));\nOGL_EXT(glEndTransformFeedback, void, (void));\nOGL_EXT(glBindBufferBase, void, (GLenum target, GLuint index, GLuint buffer));\nOGL_EXT(glBindBufferRange, void, (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size));\nOGL_EXT(glBindVertexArray, void, (GLuint array));\nOGL_EXT(glBlitFramebuffer, void, (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter));\nOGL_EXT(glClearBufferiv, void, (GLenum buffer, GLint drawbuffer, const GLint * value));\nOGL_EXT(glClearBufferuiv, void, (GLenum buffer, GLint drawbuffer, const GLuint * value));\nOGL_EXT(glClearBufferfv, void, (GLenum buffer, GLint drawbuffer, const GLfloat * value));\nOGL_EXT(glClearBufferfi, void, (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil));\nOGL_EXT(glClientWaitSync, GLenum, (GLsync sync, GLbitfield flags, GLuint64 timeout));\nOGL_EXT(glCompressedTexImage3D, void, (GLenum target,\tGLint level, GLenum internalformat,\tGLsizei width, GLsizei height, GLsizei depth, GLint border,\tGLsizei imageSize, const GLvoid * data));\nOGL_EXT(glCompressedTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data));\nOGL_EXT(glCopyTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height));\nOGL_EXT(glGenQueries, void, (GLsizei n, GLuint * ids));\nOGL_EXT(glGenSamplers, void, (GLsizei n, GLuint *samplers));\nOGL_EXT(glGenTransformFeedbacks, void, (GLsizei n, GLuint *ids));\nOGL_EXT(glGenVertexArrays, void, (GLsizei n, GLuint *arrays));\nOGL_EXT(glDeleteTransformFeedbacks, void, (GLsizei n,\tconst GLuint *ids));\nOGL_EXT(glDrawArraysInstanced, void, (GLenum mode, GLint first, GLsizei count, GLsizei primcount));\nOGL_EXT(glDrawRangeElements, void, (GLenum mode, GLuint start, GLuint end, GLsizei count,\tGLenum type, const GLvoid * indices));\nOGL_EXT(glEndQuery, void, (GLenum target));\nOGL_EXT(glGetActiveUniformBlockiv, void, (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params));\nOGL_EXT(glGetActiveUniformsiv, void, (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params));\nOGL_EXT(glGetBufferPointerv, void, (GLenum target, GLenum pname, GLvoid ** params));\n#ifndef LIME_GLES\nOGL_EXT(glGetBufferSubData, void, (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data));\n#endif\nOGL_EXT(glGetInteger64v, void, (GLenum pname, GLint64 * params));\nOGL_EXT(glGetInteger64i_v, void, (GLenum pname, GLuint index, GLint64 * data));\nOGL_EXT(glGetInternalformativ, void, (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params));\nOGL_EXT(glGetProgramBinary, void, (GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary));\nOGL_EXT(glGetQueryiv, void, (GLenum target, GLenum pname, GLint * params));\nOGL_EXT(glGetQueryObjectiv, void, (GLuint id, GLenum pname, GLint * params));\nOGL_EXT(glGetQueryObjectuiv, void, (GLuint id, GLenum pname, GLuint * params));\nOGL_EXT(glGetSamplerParameterfv, void, (GLuint sampler, GLenum pname, GLfloat * params));\nOGL_EXT(glGetSamplerParameteriv, void, (GLuint sampler, GLenum pname, GLint * params));\nOGL_EXT(glGetTransformFeedbackVarying, void, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, char *name));\nOGL_EXT(glGetUniformuiv, void, (GLuint program, GLint location, GLuint *params));\nOGL_EXT(glGetUniformBlockIndex, GLuint, (GLuint program, const GLchar *uniformBlockName));\nOGL_EXT(glGetVertexAttribIiv, void, (GLuint index, GLenum pname, GLint *params));\nOGL_EXT(glGetVertexAttribIuiv, void, (GLuint index, GLenum pname, GLuint *params));\nOGL_EXT(glMapBufferRange, void*, (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access));\nOGL_EXT(glPauseTransformFeedback, void, ());\nOGL_EXT(glProgramBinary, void, (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length));\nOGL_EXT(glProgramParameteri, void, (GLuint program, GLenum pname, GLint value));\nOGL_EXT(glReadBuffer, void, (GLenum mode));\nOGL_EXT(glReleaseShaderCompiler, void, (void));\nOGL_EXT(glRenderbufferStorageMultisample, void, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height));\nOGL_EXT(glResumeTransformFeedback, void, (void));\nOGL_EXT(glSamplerParameterf, void, (GLuint sampler, GLenum pname, GLfloat param));\nOGL_EXT(glSamplerParameteri, void, (GLuint sampler, GLenum pname, GLint param));\nOGL_EXT(glTexStorage2D, void, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height));\nOGL_EXT(glTexStorage3D, void, (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth));\nOGL_EXT(glUniform1ui, void, (GLint location, GLuint v0));\nOGL_EXT(glUniform2ui, void, (GLint location, GLuint v0, GLuint v1));\nOGL_EXT(glUniform3ui, void, (GLint location, GLuint v0, GLuint v1, GLuint v2));\nOGL_EXT(glUniform4ui, void, (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3));\nOGL_EXT(glUniform1uiv, void, (GLint location, GLsizei count, const GLuint *value));\nOGL_EXT(glUniform2uiv, void, (GLint location, GLsizei count, const GLuint *value));\nOGL_EXT(glUniform3uiv, void, (GLint location, GLsizei count, const GLuint *value));\nOGL_EXT(glUniform4uiv, void, (GLint location, GLsizei count, const GLuint *value));\nOGL_EXT(glUniformBlockBinding, void, (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding));\nOGL_EXT(glUniformMatrix2x3fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value));\nOGL_EXT(glUniformMatrix3x2fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value));\nOGL_EXT(glUniformMatrix2x4fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value));\nOGL_EXT(glUniformMatrix4x2fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value));\nOGL_EXT(glUniformMatrix3x4fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value));\nOGL_EXT(glUniformMatrix4x3fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value));\nOGL_EXT(glVertexAttribDivisor, void, (GLuint index, GLuint divisor));\nOGL_EXT(glVertexAttribIPointer, void, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer));\nOGL_EXT(glVertexAttribI4i, void, (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3));\nOGL_EXT(glVertexAttribI4iv, void, (GLuint index, const GLint *v));\nOGL_EXT(glVertexAttribI4uiv, void, (GLuint index, const GLuint *v));\nOGL_EXT(glWaitSync, void, (GLsync sync, GLbitfield flags, GLuint64 timeout));\nOGL_EXT(glDeleteSync, void, (GLsync sync));\nOGL_EXT(glDeleteQueries, void, (GLsizei n, const GLuint* ids));\nOGL_EXT(glDeleteSamplers, void, (GLsizei n, const GLuint* ids));\nOGL_EXT(glDeleteVertexArrays, void, (GLsizei n, const GLuint* ids));\nOGL_EXT(glIsQuery, GLboolean, (GLuint id));\nOGL_EXT(glIsSampler, GLboolean, (GLuint id));\nOGL_EXT(glIsVertexArray, GLboolean, (GLuint id));\nOGL_EXT(glBindSampler, void, (GLuint unit, GLuint sampler));\nOGL_EXT(glBindTransformFeedback, void, (GLenum target, GLuint id));\nOGL_EXT(glCopyBufferSubData, void, (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size));\nOGL_EXT(glDrawElementsInstanced, void, (GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount));\nOGL_EXT(glFramebufferTextureLayer, void, (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer));\nOGL_EXT(glGetActiveUniformBlockName, void, (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName));\nOGL_EXT(glGetBufferParameteri64v, void, (GLenum target, GLenum value, GLint64 * data));\nOGL_EXT(glGetIntegeri_v, void, (GLenum target, GLuint index, GLint * data));\nOGL_EXT(glIsTransformFeedback, GLboolean, (GLuint id));\nOGL_EXT(glShaderBinary, void, (GLsizei n, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length));\nOGL_EXT(glTexImage3D, void, (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data));\nOGL_EXT(glTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels));\nOGL_EXT(glTransformFeedbackVaryings, void, (GLuint program, GLsizei count, const char **varyings, GLenum bufferMode));\nOGL_EXT(glUnmapBuffer, GLboolean, (GLenum target));\nOGL_EXT(glVertexAttribI4ui, void, (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3));\nOGL_EXT(glIsSync, GLboolean, (GLsync sync));\nOGL_EXT(glGetStringi, const GLubyte *, (GLenum name, GLuint index));\nOGL_EXT(glGetFragDataLocation, GLint, ( \tGLuint program, const char * name));\nOGL_EXT(glFenceSync, GLsync, (GLenum condition, GLbitfield flags));\n\n\n#ifdef DYNAMIC_OGL\n\n//OGL_EXT(glActiveTexture,void, (GLenum texture));\nOGL_EXT(glAlphaFunc,void, (GLenum func, GLclampf ref));\n//OGL_EXT(glAlphaFuncx,void, (GLenum func, GLclampx ref));\nOGL_EXT(glBindTexture,void, (GLenum target, GLuint texture));\nOGL_EXT(glBlendFunc,void, (GLenum sfactor, GLenum dfactor));\nOGL_EXT(glClear,void, (GLbitfield mask));\nOGL_EXT(glClearColor,void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha));\n//OGL_EXT(glClearColorx,void, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha));\n#if !defined(LIME_GLES)\nOGL_EXT(glClearDepth,void, (GLclampd depth));\n#else\nOGL_EXT(glClearDepthf,void, (GLclampf depth));\n#endif\n//OGL_EXT(glClearDepthx,void, (GLclampx depth));\nOGL_EXT(glClearStencil,void, (GLint s));\nOGL_EXT(glClientActiveTexture,void, (GLenum texture));\nOGL_EXT(glColor4f,void, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha));\n//OGL_EXT(glColor4x,void, (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha));\nOGL_EXT(glColorMask,void, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha));\nOGL_EXT(glColorPointer,void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer));\n//OGL_EXT(glCompressedTexImage2D,void, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data));\n//OGL_EXT(glCompressedTexSubImage2D,void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data));\nOGL_EXT(glCopyTexImage2D,void, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border));\nOGL_EXT(glCopyTexSubImage2D,void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height));\nOGL_EXT(glCullFace,void, (GLenum mode));\nOGL_EXT(glDeleteTextures,void, (GLsizei n, const GLuint *textures));\nOGL_EXT(glDepthFunc,void, (GLenum func));\nOGL_EXT(glDepthMask,void, (GLboolean flag));\n#if !defined(LIME_GLES)\nOGL_EXT(glDepthRange,void, (GLclampd zNear, GLclampd zFar));\n#else\nOGL_EXT(glDepthRangef,void, (GLclampf nearVal,GLclampf farVal));\n#endif\n//OGL_EXT(glDepthRangex,void, (GLclampx zNear, GLclampx zFar));\nOGL_EXT(glDisable,void, (GLenum cap));\nOGL_EXT(glDisableClientState,void, (GLenum array));\nOGL_EXT(glDrawArrays,void, (GLenum mode, GLint first, GLsizei count));\nOGL_EXT(glDrawElements,void, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices));\nOGL_EXT(glEnable,void, (GLenum cap));\nOGL_EXT(glEnableClientState,void, (GLenum array));\nOGL_EXT(glFinish,void, (void));\nOGL_EXT(glFlush,void, (void));\nOGL_EXT(glFogf,void, (GLenum pname, GLfloat param));\nOGL_EXT(glFogfv,void, (GLenum pname, const GLfloat *params));\n//OGL_EXT(glFogx,void, (GLenum pname, GLfixed param));\n//OGL_EXT(glFogxv,void, (GLenum pname, const GLfixed *params));\nOGL_EXT(glFrontFace,void, (GLenum mode));\nOGL_EXT(glFrustumf,void, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar));\n//OGL_EXT(glFrustumx,void, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar));\nOGL_EXT(glGenTextures,void, (GLsizei n, GLuint *textures));\nOGL_EXT(glGetError,GLenum, (void));\nOGL_EXT(glGetBooleanv,void, (GLenum pname, GLboolean* params));\nOGL_EXT(glGetFloatv,void, (GLenum pname, GLfloat* params));\nOGL_EXT(glGetIntegerv,void, (GLenum pname, GLint *params));\n#ifdef LIME_GLES\nOGL_EXT(glGetShaderPrecisionFormat,void, (GLenum shaderType, GLenum precisionType, GLint *range, GLint *precision));\n#endif\nOGL_EXT(glGetString, const GLubyte *,(GLenum name));\nOGL_EXT(glHint,void, (GLenum target, GLenum mode));\nOGL_EXT(glInvalidateFramebuffer,void, (GLenum target, GLsizei numAttachments, const GLenum *attachments));\nOGL_EXT(glInvalidateSubFramebuffer,void, (GLenum target, GLsizei numAttachments, const GLenum *attachments, int x, int y, GLsizei width, GLsizei height));\nOGL_EXT(glLightModelf,void, (GLenum pname, GLfloat param));\nOGL_EXT(glLightModelfv,void, (GLenum pname, const GLfloat *params));\n//OGL_EXT(glLightModelx,void, (GLenum pname, GLfixed param));\n//OGL_EXT(glLightModelxv,void, (GLenum pname, const GLfixed *params));\nOGL_EXT(glLightf,void, (GLenum light, GLenum pname, GLfloat param));\nOGL_EXT(glLightfv,void, (GLenum light, GLenum pname, const GLfloat *params));\n//OGL_EXT(glLightx,void, (GLenum light, GLenum pname, GLfixed param));\n//OGL_EXT(glLightxv,void, (GLenum light, GLenum pname, const GLfixed *params));\nOGL_EXT(glLineWidth,void, (GLfloat width));\n//OGL_EXT(glLineWidthx,void, (GLfixed width));\nOGL_EXT(glLoadIdentity,void, (void));\nOGL_EXT(glLoadMatrixf,void, (const GLfloat *m));\n//OGL_EXT(glLoadMatrixx,void, (const GLfixed *m));\nOGL_EXT(glLogicOp,void, (GLenum opcode));\nOGL_EXT(glMaterialf,void, (GLenum face, GLenum pname, GLfloat param));\nOGL_EXT(glMaterialfv,void, (GLenum face, GLenum pname, const GLfloat *params));\n//OGL_EXT(glMaterialx,void, (GLenum face, GLenum pname, GLfixed param));\n//OGL_EXT(glMaterialxv,void, (GLenum face, GLenum pname, const GLfixed *params));\nOGL_EXT(glMatrixMode,void, (GLenum mode));\nOGL_EXT(glMultMatrixf,void, (const GLfloat *m));\n//OGL_EXT(glMultMatrixx,void, (const GLfixed *m));\nOGL_EXT(glMultiTexCoord4f,void, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q));\n//OGL_EXT(glMultiTexCoord4x,void, (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q));\nOGL_EXT(glNormal3f,void, (GLfloat nx, GLfloat ny, GLfloat nz));\n//OGL_EXT(glNormal3x,void, (GLfixed nx, GLfixed ny, GLfixed nz));\nOGL_EXT(glNormalPointer,void, (GLenum type, GLsizei stride, const GLvoid *pointer));\nOGL_EXT(glOrthof,void, (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar));\n//OGL_EXT(glOrthox,void, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar));\nOGL_EXT(glPixelStorei,void, (GLenum pname, GLint param));\nOGL_EXT(glPointSize,void, (GLfloat size));\n//OGL_EXT(glPointSizex,void, (GLfixed size));\nOGL_EXT(glPolygonOffset,void, (GLfloat factor, GLfloat units));\n//OGL_EXT(glPolygonOffsetx,void, (GLfixed factor, GLfixed units));\nOGL_EXT(glPopMatrix,void, (void));\nOGL_EXT(glPushMatrix,void, (void));\nOGL_EXT(glReadPixels,void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels));\nOGL_EXT(glRotatef,void, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z));\n//OGL_EXT(glRotatex,void, (GLfixed angle, GLfixed x, GLfixed y, GLfixed z));\n//OGL_EXT(glSampleCoverage,void, (GLclampf value, GLboolean invert));\n//OGL_EXT(glSampleCoveragex,void, (GLclampx value, GLboolean invert));\nOGL_EXT(glScalef,void, (GLfloat x, GLfloat y, GLfloat z));\n//OGL_EXT(glScalex,void, (GLfixed x, GLfixed y, GLfixed z));\nOGL_EXT(glScissor,void, (GLint x, GLint y, GLsizei width, GLsizei height));\nOGL_EXT(glShadeModel,void, (GLenum mode));\nOGL_EXT(glStencilFunc,void, (GLenum func, GLint ref, GLuint mask));\nOGL_EXT(glStencilMask,void, (GLuint mask));\nOGL_EXT(glStencilOp,void, (GLenum fail, GLenum zfail, GLenum zpass));\nOGL_EXT(glTexCoordPointer,void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer));\nOGL_EXT(glTexEnvf,void, (GLenum target, GLenum pname, GLfloat param));\nOGL_EXT(glTexEnvfv,void, (GLenum target, GLenum pname, const GLfloat *params));\n//OGL_EXT(glTexEnvx,void, (GLenum target, GLenum pname, GLfixed param));\n//OGL_EXT(glTexEnvxv,void, (GLenum target, GLenum pname, const GLfixed *params));\nOGL_EXT(glTexImage2D,void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels));\nOGL_EXT(glTexParameterf,void, (GLenum target, GLenum pname, GLfloat param));\nOGL_EXT(glTexParameteri,void, (GLenum target, GLenum pname, GLint param));\nOGL_EXT(glTexSubImage2D,void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels));\nOGL_EXT(glTranslatef,void, (GLfloat x, GLfloat y, GLfloat z));\n//OGL_EXT(glTranslatex,void, (GLfixed x, GLfixed y, GLfixed z));\nOGL_EXT(glVertexPointer,void, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer));\nOGL_EXT(glViewport,void, (GLint x, GLint y, GLsizei width, GLsizei height));\nOGL_EXT(glGetTexParameterfv,void,(GLenum target,  GLenum pname,  GLfloat * params));\nOGL_EXT(glGetTexParameteriv,void,(GLenum target,  GLenum pname,  GLint * params));\nOGL_EXT(glIsTexture, GLboolean, ( GLuint texture) );\nOGL_EXT(glIsEnabled, GLboolean, ( GLuint texture) );\n\n\n#ifdef NATIVE_TOOLKIT_SDL_ANGLE\nEGL_EXT(eglBindTexImage, EGLBoolean, (EGLDisplay dpy, EGLSurface surface, EGLint buffer));\nEGL_EXT(eglChooseConfig, EGLBoolean, (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config));\nEGL_EXT(eglCreatePbufferSurface, EGLSurface, (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list));\nEGL_EXT(eglDestroySurface, EGLBoolean, (EGLDisplay display, EGLSurface surface));\nEGL_EXT(eglGetDisplay, EGLDisplay, (EGLNativeDisplayType display_id));\nEGL_EXT(eglGetError, EGLint, (void));\nEGL_EXT(eglGetConfigs, EGLBoolean, (EGLDisplay dpy, EGLConfig *configs,EGLint config_size, EGLint *num_config));\nEGL_EXT(eglGetConfigAttrib, EGLBoolean, (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value));\nEGL_EXT(eglReleaseTexImage, EGLBoolean, (EGLDisplay display, EGLSurface surface, EGLint buffer));\nEGL_EXT(eglQuerySurfacePointerANGLE, EGLBoolean, (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value));\n#endif\n\n#endif\n\n\n#undef OGL_EXT\n#undef EGL_EXT\n#undef CALLING_CONVENTION\n"
  },
  {
    "path": "project/src/graphics/utils/ImageDataUtil.cpp",
    "content": "#include <graphics/utils/ImageDataUtil.h>\n#include <math/color/RGBA.h>\n#include <utils/QuickVec.h>\n#include <math.h>\n\n\nnamespace lime {\n\n\n\tunsigned char alphaTable[256];\n\tunsigned char redTable[256];\n\tunsigned char greenTable[256];\n\tunsigned char blueTable[256];\n\n\n\tvoid ImageDataUtil::ColorTransform (Image* image, Rectangle* rect, ColorMatrix* colorMatrix) {\n\n\t\tPixelFormat format = image->buffer->format;\n\t\tbool premultiplied = image->buffer->premultiplied;\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\n\t\tRectangle* _rect = (Rectangle*)(image->type);\n\t\tImageDataView dataView = ImageDataView (image, rect);\n\n\t\tcolorMatrix->GetAlphaTable (alphaTable);\n\t\tcolorMatrix->GetRedTable (redTable);\n\t\tcolorMatrix->GetGreenTable (greenTable);\n\t\tcolorMatrix->GetBlueTable (blueTable);\n\n\t\tint row, offset;\n\t\tRGBA pixel;\n\n\t\tfor (int y = 0; y < dataView.height; y++) {\n\n\t\t\trow = dataView.Row (y);\n\n\t\t\tfor (int x = 0; x < dataView.width; x++) {\n\n\t\t\t\toffset = row + (x * 4);\n\n\t\t\t\tpixel.ReadUInt8 (data, offset, format, premultiplied, LIME_BIG_ENDIAN);\n\t\t\t\tpixel.Set (redTable[pixel.r], greenTable[pixel.g], blueTable[pixel.b], alphaTable[pixel.a]);\n\t\t\t\tpixel.WriteUInt8 (data, offset, format, premultiplied);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::CopyChannel (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int srcChannel, int destChannel) {\n\n\t\tuint8_t* srcData = (uint8_t*)sourceImage->buffer->data->buffer->b;\n\t\tuint8_t* destData = (uint8_t*)image->buffer->data->buffer->b;\n\n\t\tImageDataView srcView = ImageDataView (sourceImage, sourceRect);\n\t\tRectangle destRect = Rectangle (destPoint->x, destPoint->y, srcView.width, srcView.height);\n\t\tImageDataView destView = ImageDataView (image, &destRect);\n\n\t\tPixelFormat srcFormat = sourceImage->buffer->format;\n\t\tPixelFormat destFormat = image->buffer->format;\n\t\tbool srcPremultiplied = sourceImage->buffer->premultiplied;\n\t\tbool destPremultiplied = image->buffer->premultiplied;\n\n\t\tint srcPosition, destPosition;\n\t\tRGBA srcPixel, destPixel;\n\t\tunsigned char value = 0;\n\n\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\tsrcPosition = srcView.Row (y);\n\t\t\tdestPosition = destView.Row (y);\n\n\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\tsrcPixel.ReadUInt8 (srcData, srcPosition, srcFormat, srcPremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\tdestPixel.ReadUInt8 (destData, destPosition, destFormat, destPremultiplied, LIME_BIG_ENDIAN);\n\n\t\t\t\tswitch (srcChannel) {\n\n\t\t\t\t\tcase 0: value = srcPixel.r; break;\n\t\t\t\t\tcase 1: value = srcPixel.g; break;\n\t\t\t\t\tcase 2: value = srcPixel.b; break;\n\t\t\t\t\tcase 3: value = srcPixel.a; break;\n\n\t\t\t\t}\n\n\t\t\t\tswitch (destChannel) {\n\n\t\t\t\t\tcase 0: destPixel.r = value; break;\n\t\t\t\t\tcase 1: destPixel.g = value; break;\n\t\t\t\t\tcase 2: destPixel.b = value; break;\n\t\t\t\t\tcase 3: destPixel.a = value; break;\n\n\t\t\t\t}\n\n\t\t\t\tdestPixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\tsrcPosition += 4;\n\t\t\t\tdestPosition += 4;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::CopyPixels (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, Image* alphaImage, Vector2* alphaPoint, bool mergeAlpha) {\n\n\t\tuint8_t* sourceData = (uint8_t*)sourceImage->buffer->data->buffer->b;\n\t\tuint8_t* destData = (uint8_t*)image->buffer->data->buffer->b;\n\n\t\tif (!sourceData || !destData) return;\n\n\t\tImageDataView sourceView = ImageDataView (sourceImage, sourceRect);\n\t\tRectangle destRect = Rectangle (destPoint->x, destPoint->y, sourceView.width, sourceView.height);\n\t\tImageDataView destView = ImageDataView (image, &destRect);\n\n\t\tPixelFormat sourceFormat = sourceImage->buffer->format;\n\t\tPixelFormat destFormat = image->buffer->format;\n\n\t\tint sourcePosition, destPosition;\n\t\tfloat sourceAlpha, destAlpha, oneMinusSourceAlpha, blendAlpha;\n\t\tRGBA sourcePixel, destPixel;\n\n\t\tbool sourcePremultiplied = sourceImage->buffer->premultiplied;\n\t\tbool destPremultiplied = image->buffer->premultiplied;\n\t\tint sourceBytesPerPixel = sourceImage->buffer->bitsPerPixel / 8;\n\t\tint destBytesPerPixel = image->buffer->bitsPerPixel / 8;\n\n\t\tbool useAlphaImage = (alphaImage && alphaImage->buffer->transparent);\n\t\tbool blend = (mergeAlpha || (useAlphaImage && !image->buffer->transparent) || (!mergeAlpha && !image->buffer->transparent && sourceImage->buffer->transparent));\n\n\t\tif (!useAlphaImage) {\n\n\t\t\tif (blend) {\n\n\t\t\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\t\t\tsourcePosition = sourceView.Row (y);\n\t\t\t\t\tdestPosition = destView.Row (y);\n\n\t\t\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\t\t\tsourcePixel.ReadUInt8 (sourceData, sourcePosition, sourceFormat, sourcePremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\t\t\tdestPixel.ReadUInt8 (destData, destPosition, destFormat, destPremultiplied, LIME_BIG_ENDIAN);\n\n\t\t\t\t\t\tsourceAlpha = sourcePixel.a / 255.0;\n\t\t\t\t\t\tdestAlpha = destPixel.a / 255.0;\n\t\t\t\t\t\toneMinusSourceAlpha = 1 - sourceAlpha;\n\t\t\t\t\t\tblendAlpha = sourceAlpha + (destAlpha * oneMinusSourceAlpha);\n\n\t\t\t\t\t\tif (blendAlpha == 0) {\n\n\t\t\t\t\t\t\tdestPixel.Set (0, 0, 0, 0);\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdestPixel.r = __clamp[int (0.5 + (sourcePixel.r * sourceAlpha + destPixel.r * destAlpha * oneMinusSourceAlpha) / blendAlpha)];\n\t\t\t\t\t\t\tdestPixel.g = __clamp[int (0.5 + (sourcePixel.g * sourceAlpha + destPixel.g * destAlpha * oneMinusSourceAlpha) / blendAlpha)];\n\t\t\t\t\t\t\tdestPixel.b = __clamp[int (0.5 + (sourcePixel.b * sourceAlpha + destPixel.b * destAlpha * oneMinusSourceAlpha) / blendAlpha)];\n\t\t\t\t\t\t\tdestPixel.a = __clamp[int (0.5 + blendAlpha * 255.0)];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdestPixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\tdestPosition += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if (sourceFormat == destFormat && sourcePremultiplied == destPremultiplied && sourceBytesPerPixel == destBytesPerPixel) {\n\n\t\t\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\t\t\tsourcePosition = sourceView.Row (y);\n\t\t\t\t\tdestPosition = destView.Row (y);\n\n\t\t\t\t\tmemcpy (&destData[destPosition], &sourceData[sourcePosition], destView.width * destBytesPerPixel);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\t\t\tsourcePosition = sourceView.Row (y);\n\t\t\t\t\tdestPosition = destView.Row (y);\n\n\t\t\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\t\t\tsourcePixel.ReadUInt8 (sourceData, sourcePosition, sourceFormat, sourcePremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\t\t\tsourcePixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\tdestPosition += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tuint8_t* alphaData = (uint8_t*)alphaImage->buffer->data->buffer->b;\n\t\t\tPixelFormat alphaFormat = alphaImage->buffer->format;\n\t\t\tbool alphaPremultiplied = alphaImage->buffer->premultiplied;\n\t\t\tint alphaPosition;\n\t\t\tRGBA alphaPixel;\n\n\t\t\tRectangle alphaRect = Rectangle (sourceView.x + alphaPoint->x, sourceView.y + alphaPoint->y, sourceView.width, sourceView.height);\n\t\t\tImageDataView alphaView = ImageDataView (alphaImage, &alphaRect);\n\n\t\t\tdestView.Clip (destPoint->x, destPoint->y, alphaView.width, alphaView.height);\n\n\t\t\tif (blend) {\n\n\t\t\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\t\t\tsourcePosition = sourceView.Row (y);\n\t\t\t\t\tdestPosition = destView.Row (y);\n\t\t\t\t\talphaPosition = alphaView.Row (y);\n\n\t\t\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\t\t\tsourcePixel.ReadUInt8 (sourceData, sourcePosition, sourceFormat, sourcePremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\t\t\tdestPixel.ReadUInt8 (destData, destPosition, destFormat, destPremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\t\t\talphaPixel.ReadUInt8 (alphaData, alphaPosition, alphaFormat, false, LIME_BIG_ENDIAN);\n\n\t\t\t\t\t\tsourceAlpha = (alphaPixel.a / 255.0) * (sourcePixel.a / 255.0);\n\n\t\t\t\t\t\tif (sourceAlpha > 0) {\n\n\t\t\t\t\t\t\tdestAlpha = destPixel.a / 255.0;\n\t\t\t\t\t\t\toneMinusSourceAlpha = 1 - sourceAlpha;\n\t\t\t\t\t\t\tblendAlpha = sourceAlpha + (destAlpha * oneMinusSourceAlpha);\n\n\t\t\t\t\t\t\tdestPixel.r = __clamp[int (0.5 + (sourcePixel.r * sourceAlpha + destPixel.r * destAlpha * oneMinusSourceAlpha) / blendAlpha)];\n\t\t\t\t\t\t\tdestPixel.g = __clamp[int (0.5 + (sourcePixel.g * sourceAlpha + destPixel.g * destAlpha * oneMinusSourceAlpha) / blendAlpha)];\n\t\t\t\t\t\t\tdestPixel.b = __clamp[int (0.5 + (sourcePixel.b * sourceAlpha + destPixel.b * destAlpha * oneMinusSourceAlpha) / blendAlpha)];\n\t\t\t\t\t\t\tdestPixel.a = __clamp[int (0.5 + blendAlpha * 255.0)];\n\n\t\t\t\t\t\t\tdestPixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\tdestPosition += 4;\n\t\t\t\t\t\talphaPosition += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\t\t\tsourcePosition = sourceView.Row (y);\n\t\t\t\t\tdestPosition = destView.Row (y);\n\t\t\t\t\talphaPosition = alphaView.Row (y);\n\n\t\t\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\t\t\tsourcePixel.ReadUInt8 (sourceData, sourcePosition, sourceFormat, sourcePremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\t\t\talphaPixel.ReadUInt8 (alphaData, alphaPosition, alphaFormat, false, LIME_BIG_ENDIAN);\n\n\t\t\t\t\t\tsourcePixel.a = int (0.5 + (sourcePixel.a * (alphaPixel.a / 255.0)));\n\t\t\t\t\t\tsourcePixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\tdestPosition += 4;\n\t\t\t\t\t\talphaPosition += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::FillRect (Image* image, Rectangle* rect, int32_t color) {\n\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tPixelFormat format = image->buffer->format;\n\t\tbool premultiplied = image->buffer->premultiplied;\n\t\tRGBA fillColor (color);\n\n\t\tif (rect->x == 0 && rect->y == 0 && rect->width == image->width && rect->height == image->height) {\n\n\t\t\tif (fillColor.a == fillColor.r && fillColor.r == fillColor.g && fillColor.g == fillColor.b) {\n\n\t\t\t\tmemset (data, fillColor.a, image->buffer->data->byteLength);\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tImageDataView dataView = ImageDataView (image, rect);\n\t\tint row;\n\n\t\tif (premultiplied) fillColor.MultiplyAlpha ();\n\n\t\tfor (int y = 0; y < dataView.height; y++) {\n\n\t\t\trow = dataView.Row (y);\n\n\t\t\tfor (int x = 0; x < dataView.width; x++) {\n\n\t\t\t\tfillColor.WriteUInt8 (data, row + (x * 4), format, false);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::FloodFill (Image* image, int x, int y, int32_t color) {\n\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tPixelFormat format = image->buffer->format;\n\t\tbool premultiplied = image->buffer->premultiplied;\n\n\t\tRGBA fillColor (color);\n\n\t\tif (premultiplied) fillColor.MultiplyAlpha ();\n\n\t\tRGBA hitColor;\n\t\thitColor.ReadUInt8 (data, ((y + image->offsetY) * (image->buffer->width * 4)) + ((x + image->offsetX) * 4), format, premultiplied, LIME_BIG_ENDIAN);\n\n\t\tif (!image->buffer->transparent) {\n\n\t\t\tfillColor.a = 0xFF;\n\t\t\thitColor.a = 0xFF;\n\n\t\t}\n\n\t\tif (fillColor == hitColor) return;\n\n\t\tint dx[4] = { 0, -1, 1, 0 };\n\t\tint dy[4] = { -1, 0, 0, 1 };\n\n\t\tint minX = -image->offsetX;\n\t\tint minY = -image->offsetY;\n\t\tint maxX = minX + image->width;\n\t\tint maxY = minY + image->height;\n\n\t\tQuickVec<int> queue = QuickVec<int> ();\n\t\tqueue.push_back (x);\n\t\tqueue.push_back (y);\n\n\t\tint curPointX, curPointY, i, nextPointX, nextPointY, nextPointOffset;\n\t\tRGBA readColor;\n\n\t\twhile (queue.size () > 0) {\n\n\t\t\tcurPointY = queue.qpop ();\n\t\t\tcurPointX = queue.qpop ();\n\n\t\t\tfor (i = 0; i < 4; i++) {\n\n\t\t\t\tnextPointX = curPointX + dx[i];\n\t\t\t\tnextPointY = curPointY + dy[i];\n\n\t\t\t\tif (nextPointX < minX || nextPointY < minY || nextPointX >= maxX || nextPointY >= maxY) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tnextPointOffset = (nextPointY * image->width + nextPointX) * 4;\n\t\t\t\treadColor.ReadUInt8 (data, nextPointOffset, format, premultiplied, LIME_BIG_ENDIAN);\n\n\t\t\t\tif (readColor == hitColor) {\n\n\t\t\t\t\tfillColor.WriteUInt8 (data, nextPointOffset, format, false);\n\n\t\t\t\t\tqueue.push_back (nextPointX);\n\t\t\t\t\tqueue.push_back (nextPointY);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::GetPixels (Image* image, Rectangle* rect, PixelFormat format, Bytes* pixels) {\n\n\t\tint length = int (rect->width * rect->height);\n\t\tpixels->Resize (length * 4);\n\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tuint8_t* destData = (uint8_t*)pixels->b;\n\n\t\tPixelFormat sourceFormat = image->buffer->format;\n\t\tbool premultiplied = image->buffer->premultiplied;\n\n\t\tImageDataView dataView = ImageDataView (image, rect);\n\t\tint position, destPosition = 0;\n\t\tRGBA pixel;\n\n\t\tfor (int y = 0; y < dataView.height; y++) {\n\n\t\t\tposition = dataView.Row (y);\n\n\t\t\tfor (int x = 0; x < dataView.width; x++) {\n\n\t\t\t\tpixel.ReadUInt8 (data, position, sourceFormat, premultiplied, LIME_BIG_ENDIAN);\n\t\t\t\tpixel.WriteUInt8 (destData, destPosition, format, false);\n\n\t\t\t\tposition += 4;\n\t\t\t\tdestPosition += 4;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::Merge (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int redMultiplier, int greenMultiplier, int blueMultiplier, int alphaMultiplier) {\n\n\t\tImageDataView sourceView = ImageDataView (sourceImage, sourceRect);\n\t\tRectangle destRect = Rectangle (destPoint->x, destPoint->y, sourceView.width, sourceView.height);\n\t\tImageDataView destView = ImageDataView (image, &destRect);\n\n\t\tuint8_t* sourceData = (uint8_t*)sourceImage->buffer->data->buffer->b;\n\t\tuint8_t* destData = (uint8_t*)image->buffer->data->buffer->b;\n\t\tPixelFormat sourceFormat = sourceImage->buffer->format;\n\t\tPixelFormat destFormat = image->buffer->format;\n\t\tbool sourcePremultiplied = sourceImage->buffer->premultiplied;\n\t\tbool destPremultiplied = image->buffer->premultiplied;\n\n\t\tint sourcePosition, destPosition;\n\t\tRGBA sourcePixel, destPixel;\n\n\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\tsourcePosition = sourceView.Row (y);\n\t\t\tdestPosition = destView.Row (y);\n\n\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\tsourcePixel.ReadUInt8 (sourceData, sourcePosition, sourceFormat, sourcePremultiplied, LIME_BIG_ENDIAN);\n\t\t\t\tdestPixel.ReadUInt8 (destData, destPosition, destFormat, destPremultiplied, LIME_BIG_ENDIAN);\n\n\t\t\t\tdestPixel.r = int (((sourcePixel.r * redMultiplier) + (destPixel.r * (256 - redMultiplier))) / 256);\n\t\t\t\tdestPixel.g = int (((sourcePixel.g * greenMultiplier) + (destPixel.g * (256 - greenMultiplier))) / 256);\n\t\t\t\tdestPixel.b = int (((sourcePixel.b * blueMultiplier) + (destPixel.b * (256 - blueMultiplier))) / 256);\n\t\t\t\tdestPixel.a = int (((sourcePixel.a * alphaMultiplier) + (destPixel.a * (256 - alphaMultiplier))) / 256);\n\n\t\t\t\tdestPixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\tsourcePosition += 4;\n\t\t\t\tdestPosition += 4;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::MultiplyAlpha (Image* image) {\n\n\t\tPixelFormat format = image->buffer->format;\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tint length = int (image->buffer->data->length / 4);\n\t\tRGBA pixel;\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tpixel.ReadUInt8 (data, i * 4, format, false, LIME_BIG_ENDIAN);\n\t\t\tpixel.WriteUInt8 (data, i * 4, format, true);\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::Resize (Image* image, ImageBuffer* buffer, int newWidth, int newHeight) {\n\n\t\tint imageWidth = image->width;\n\t\tint imageHeight = image->height;\n\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tuint8_t* newData = (uint8_t*)buffer->data->buffer->b;\n\n\t\tint sourceIndex, sourceIndexX, sourceIndexY, sourceIndexXY, index;\n\t\tint sourceX, sourceY;\n\t\tfloat u, v, uRatio, vRatio, uOpposite, vOpposite;\n\n\t\tfor (int y = 0; y < newHeight; y++) {\n\n\t\t\tfor (int x = 0; x < newWidth; x++) {\n\n\t\t\t\tu = ((x + 0.5) / newWidth) * imageWidth - 0.5;\n\t\t\t\tv = ((y + 0.5) / newHeight) * imageHeight - 0.5;\n\n\t\t\t\tsourceX = int (u);\n\t\t\t\tsourceY = int (v);\n\n\t\t\t\tsourceIndex = (sourceY * imageWidth + sourceX) * 4;\n\t\t\t\tsourceIndexX = (sourceX < imageWidth - 1) ? sourceIndex + 4 : sourceIndex;\n\t\t\t\tsourceIndexY = (sourceY < imageHeight - 1) ? sourceIndex + (imageWidth * 4) : sourceIndex;\n\t\t\t\tsourceIndexXY = (sourceIndexX != sourceIndex) ? sourceIndexY + 4 : sourceIndexY;\n\n\t\t\t\tindex = (y * newWidth + x) * 4;\n\n\t\t\t\tuRatio = u - sourceX;\n\t\t\t\tvRatio = v - sourceY;\n\t\t\t\tuOpposite = 1 - uRatio;\n\t\t\t\tvOpposite = 1 - vRatio;\n\n\t\t\t\tnewData[index] = int ((data[sourceIndex] * uOpposite + data[sourceIndexX] * uRatio) * vOpposite + (data[sourceIndexY] * uOpposite + data[sourceIndexXY] * uRatio) * vRatio);\n\t\t\t\tnewData[index + 1] = int ((data[sourceIndex + 1] * uOpposite + data[sourceIndexX + 1] * uRatio) * vOpposite + (data[sourceIndexY + 1] * uOpposite + data[sourceIndexXY + 1] * uRatio) * vRatio);\n\t\t\t\tnewData[index + 2] = int ((data[sourceIndex + 2] * uOpposite + data[sourceIndexX + 2] * uRatio) * vOpposite + (data[sourceIndexY + 2] * uOpposite + data[sourceIndexXY + 2] * uRatio) * vRatio);\n\n\t\t\t\t// Maybe it would be better to not weigh colors with an alpha of zero, but the below should help prevent black fringes caused by transparent pixels made visible\n\n\t\t\t\tif (data[sourceIndexX + 3] == 0 || data[sourceIndexY + 3] == 0 || data[sourceIndexXY + 3] == 0) {\n\n\t\t\t\t\tnewData[index + 3] = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewData[index + 3] = data[sourceIndex + 3];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::SetFormat (Image* image, PixelFormat format) {\n\n\t\tint index;\n\t\tint length = image->buffer->data->length / 4;\n\t\tint r1, g1, b1, a1, r2, g2, b2, a2;\n\t\tint r, g, b, a;\n\n\t\tswitch (image->buffer->format) {\n\n\t\t\tcase RGBA32:\n\n\t\t\t\tr1 = 0;\n\t\t\t\tg1 = 1;\n\t\t\t\tb1 = 2;\n\t\t\t\ta1 = 3;\n\t\t\t\tbreak;\n\n\t\t\tcase ARGB32:\n\n\t\t\t\tr1 = 1;\n\t\t\t\tg1 = 2;\n\t\t\t\tb1 = 3;\n\t\t\t\ta1 = 0;\n\t\t\t\tbreak;\n\n\t\t\tcase BGRA32:\n\n\t\t\t\tr1 = 2;\n\t\t\t\tg1 = 1;\n\t\t\t\tb1 = 0;\n\t\t\t\ta1 = 3;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch (format) {\n\n\t\t\tcase RGBA32:\n\n\t\t\t\tr2 = 0;\n\t\t\t\tg2 = 1;\n\t\t\t\tb2 = 2;\n\t\t\t\ta2 = 3;\n\t\t\t\tbreak;\n\n\t\t\tcase ARGB32:\n\n\t\t\t\tr2 = 1;\n\t\t\t\tg2 = 2;\n\t\t\t\tb2 = 3;\n\t\t\t\ta2 = 0;\n\t\t\t\tbreak;\n\n\t\t\tcase BGRA32:\n\n\t\t\t\tr2 = 2;\n\t\t\t\tg2 = 1;\n\t\t\t\tb2 = 0;\n\t\t\t\ta2 = 3;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tunsigned char* data = image->buffer->data->buffer->b;\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tindex = i * 4;\n\n\t\t\tr = data[index + r1];\n\t\t\tg = data[index + g1];\n\t\t\tb = data[index + b1];\n\t\t\ta = data[index + a1];\n\n\t\t\tdata[index + r2] = r;\n\t\t\tdata[index + g2] = g;\n\t\t\tdata[index + b2] = b;\n\t\t\tdata[index + a2] = a;\n\n\t\t}\n\n\t}\n\n\n\tvoid ImageDataUtil::SetPixels (Image* image, Rectangle* rect, Bytes* bytes, int offset, PixelFormat format, Endian endian) {\n\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tPixelFormat sourceFormat = image->buffer->format;\n\t\tbool premultiplied = image->buffer->premultiplied;\n\t\tImageDataView dataView = ImageDataView (image, rect);\n\t\tint row;\n\t\tRGBA pixel;\n\n\t\tuint8_t* byteArray = (uint8_t*)bytes->b;\n\t\tint srcPosition = offset;\n\n\t\tbool transparent = image->buffer->transparent;\n\n\t\tfor (int y = 0; y < dataView.height; y++) {\n\n\t\t\trow = dataView.Row (y);\n\n\t\t\tfor (int x = 0; x < dataView.width; x++) {\n\n\t\t\t\tpixel.ReadUInt8 (byteArray, srcPosition, format, false, endian);\n\t\t\t\tif (!transparent) pixel.a = 0xFF;\n\t\t\t\tpixel.WriteUInt8 (data, row + (x * 4), sourceFormat, premultiplied);\n\n\t\t\t\tsrcPosition += 4;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tint __pixelCompare (int32_t n1, int32_t n2) {\n\n\t\tint tmp1;\n\t\tint tmp2;\n\n\t\ttmp1 = (n1 >> 24) & 0xFF;\n\t\ttmp2 = (n2 >> 24) & 0xFF;\n\n\t\tif (tmp1 != tmp2) {\n\n\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\n\t\t} else {\n\n\t\t\ttmp1 = (n1 >> 16) & 0xFF;\n\t\t\ttmp2 = (n2 >> 16) & 0xFF;\n\n\t\t\tif (tmp1 != tmp2) {\n\n\t\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\n\t\t\t} else {\n\n\t\t\t\ttmp1 = (n1 >> 8) & 0xFF;\n\t\t\t\ttmp2 = (n2 >> 8) & 0xFF;\n\n\t\t\t\tif (tmp1 != tmp2) {\n\n\t\t\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttmp1 = n1 & 0xFF;\n\t\t\t\t\ttmp2 = n2 & 0xFF;\n\n\t\t\t\t\tif (tmp1 != tmp2) {\n\n\t\t\t\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\n\tint ImageDataUtil::Threshold (Image* image, Image* sourceImage, Rectangle* sourceRect, Vector2* destPoint, int operation, int32_t threshold, int32_t color, int32_t mask, bool copySource) {\n\n\t\tRGBA _color (color);\n\t\tint hits = 0;\n\n\t\tuint8_t* srcData = (uint8_t*)sourceImage->buffer->data->buffer->b;\n\t\tuint8_t* destData = (uint8_t*)image->buffer->data->buffer->b;\n\n\t\tImageDataView srcView = ImageDataView (sourceImage, sourceRect);\n\t\tRectangle destRect = Rectangle (destPoint->x, destPoint->y, srcView.width, srcView.height);\n\t\tImageDataView destView = ImageDataView (image, &destRect);\n\n\t\tPixelFormat srcFormat = sourceImage->buffer->format;\n\t\tPixelFormat destFormat = image->buffer->format;\n\t\tbool srcPremultiplied = sourceImage->buffer->premultiplied;\n\t\tbool destPremultiplied = image->buffer->premultiplied;\n\n\t\tint srcPosition, destPosition, value;\n\t\tRGBA srcPixel, destPixel;\n\t\tint32_t pixelMask;\n\t\tbool test;\n\n\t\tfor (int y = 0; y < destView.height; y++) {\n\n\t\t\tsrcPosition = srcView.Row (y);\n\t\t\tdestPosition = destView.Row (y);\n\n\t\t\tfor (int x = 0; x < destView.width; x++) {\n\n\t\t\t\tsrcPixel.ReadUInt8 (srcData, srcPosition, srcFormat, srcPremultiplied, LIME_BIG_ENDIAN);\n\n\t\t\t\tpixelMask = srcPixel.Get () & mask;\n\n\t\t\t\tvalue = __pixelCompare (pixelMask, threshold);\n\n\t\t\t\tswitch (operation) {\n\n\t\t\t\t\tcase 0: test = (value != 0); break;\n\t\t\t\t\tcase 1: test = (value == 0); break;\n\t\t\t\t\tcase 2: test = (value == -1); break;\n\t\t\t\t\tcase 3: test = (value == 0 || value == -1); break;\n\t\t\t\t\tcase 4: test = (value == 1); break;\n\t\t\t\t\tcase 5: test = (value == 0 || value == 1); break;\n\n\t\t\t\t}\n\n\t\t\t\tif (test) {\n\n\t\t\t\t\t_color.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\t\t\t\t\thits++;\n\n\t\t\t\t} else if (copySource) {\n\n\t\t\t\t\tsrcPixel.WriteUInt8 (destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t}\n\n\t\t\t\tsrcPosition += 4;\n\t\t\t\tdestPosition += 4;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn hits;\n\n\t}\n\n\n\tvoid ImageDataUtil::UnmultiplyAlpha (Image* image) {\n\n\t\tPixelFormat format = image->buffer->format;\n\t\tuint8_t* data = (uint8_t*)image->buffer->data->buffer->b;\n\t\tint length = int (image->buffer->data->length / 4);\n\t\tRGBA pixel;\n\n\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\tpixel.ReadUInt8 (data, i * 4, format, true, LIME_BIG_ENDIAN);\n\t\t\tpixel.WriteUInt8 (data, i * 4, format, false);\n\n\t\t}\n\n\t}\n\n\n\tImageDataView::ImageDataView (Image* image, Rectangle* rect) {\n\n\t\tthis->image = image;\n\t\tthis->rect = Rectangle(rect->x, rect->y, rect->width, rect->height);\n\n\t\tif (this->rect.x < 0) this->rect.x = 0;\n\t\tif (this->rect.y < 0) this->rect.y = 0;\n\t\tif (this->rect.x + this->rect.width > image->width) this->rect.width = image->width - this->rect.x;\n\t\tif (this->rect.y + this->rect.height > image->height) this->rect.height = image->height - this->rect.y;\n\t\tif (this->rect.width < 0) this->rect.width = 0;\n\t\tif (this->rect.height < 0) this->rect.height = 0;\n\n\t\tstride = image->buffer->Stride ();\n\n\t\t__Update ();\n\n\n\t}\n\n\n\tvoid ImageDataView::Clip (int x, int y, int width, int height) {\n\n\t\trect.Contract (x, y, width, height);\n\t\t__Update ();\n\n\t}\n\n\n\tinline bool ImageDataView::HasRow (int y) {\n\n\t\treturn (y >= 0 && y < height);\n\n\t}\n\n\n\tvoid ImageDataView::Offset (int x, int y) {\n\n\t\tif (x < 0) {\n\n\t\t\trect.x += x;\n\t\t\tif (rect.x < 0) rect.x = 0;\n\n\t\t} else {\n\n\t\t\trect.x += x;\n\t\t\trect.width -= x;\n\n\t\t}\n\n\t\tif (y < 0) {\n\n\t\t\trect.y += y;\n\t\t\tif (rect.y < 0) rect.y = 0;\n\n\t\t} else {\n\n\t\t\trect.y += y;\n\t\t\trect.height -= y;\n\n\t\t}\n\n\t\t__Update ();\n\n\t}\n\n\n\tinline int ImageDataView::Row (int y) {\n\n\t\treturn byteOffset + stride * y;\n\n\t}\n\n\n\tinline void ImageDataView::__Update () {\n\n\t\tthis->x = (int) ceil (rect.x);\n\t\tthis->y = (int) ceil (rect.y);\n\t\tthis->width = (int) floor (rect.width);\n\t\tthis->height = (int) floor (rect.height);\n\t\tbyteOffset = (stride * (this->y + image->offsetY)) + ((this->x + image->offsetX) * 4);\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/hashlink_main.c",
    "content": "#ifdef HX_WIN_MAIN\nextern int wmain(int argc, wchar_t *argv[]);\n\nint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {\n\treturn wmain(__argc, __argv);\n}\n#endif"
  },
  {
    "path": "project/src/hx/CFFIExt.cpp",
    "content": "#define IMPLEMENT_CFFI_EXT\n\n#include <hx/CFFIExt.h>\n"
  },
  {
    "path": "project/src/math/ColorMatrix.cpp",
    "content": "#include <math/ColorMatrix.h>\n#include <utils/Bytes.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_buffer;\n\tstatic bool init = false;\n\n\n\tColorMatrix::ColorMatrix () {\n\n\t\tfor (int i = 0; i < 20; i++) {\n\n\t\t\tif (i % 6 == 0) {\n\n\t\t\t\tdata[i] = 1;\n\n\t\t\t} else {\n\n\t\t\t\tdata[i] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tColorMatrix::ColorMatrix (value colorMatrix) {\n\n\t\tif (!init) {\n\n\t\t\tid_buffer = val_id (\"buffer\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\tvalue buffer_value = val_field (colorMatrix, id_buffer);\n\t\tBytes bytes;\n\t\tbytes.Set (buffer_value);\n\t\tfloat* src = (float*)bytes.b;\n\n\t\tfor (int i = 0; i < 20; i++) {\n\n\t\t\tdata[i] = src[i];\n\n\t\t}\n\n\t}\n\n\n\tColorMatrix::ColorMatrix (ArrayBufferView* colorMatrix) {\n\n\t\tfloat* src = (float*)colorMatrix->buffer->b;\n\n\t\tfor (int i = 0; i < 20; i++) {\n\n\t\t\tdata[i] = src[i];\n\n\t\t}\n\n\t}\n\n\n\tColorMatrix::~ColorMatrix () {\n\n\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetAlphaMultiplier () {\n\n\t\treturn data[18];\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetAlphaOffset () {\n\n\t\treturn data[19] * 255;\n\n\t}\n\n\n\tvoid ColorMatrix::GetAlphaTable (unsigned char* table) {\n\n\t\tGetDataTable (table, GetAlphaMultiplier (), GetAlphaOffset ());\n\t\ttable[0] = 0;\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetBlueMultiplier () {\n\n\t\treturn data[12];\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetBlueOffset () {\n\n\t\treturn data[14] * 255;\n\n\t}\n\n\n\tvoid ColorMatrix::GetBlueTable (unsigned char* table) {\n\n\t\tGetDataTable (table, GetBlueMultiplier (), GetBlueOffset ());\n\n\t}\n\n\n\tint32_t inline ColorMatrix::GetColor () {\n\n\t\treturn ((int (GetRedOffset ()) << 16) | (int (GetGreenOffset ()) << 8) | int (GetBlueOffset ()));\n\n\t}\n\n\n\tvoid inline ColorMatrix::GetDataTable (unsigned char* table, float multiplier, float offset) {\n\n\t\tint32_t value;\n\n\t\tfor (int i = 0; i < 256; i++) {\n\n\t\t\tvalue = (int)(i * multiplier + offset);\n\t\t\tif (value > 0xFF) value = 0xFF;\n\t\t\tif (value < 0) value = 0;\n\t\t\ttable[i] = value;\n\n\t\t}\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetGreenMultiplier () {\n\n\t\treturn data[6];\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetGreenOffset () {\n\n\t\treturn data[9] * 255;\n\n\t}\n\n\n\tvoid ColorMatrix::GetGreenTable (unsigned char* table) {\n\n\t\tGetDataTable (table, GetGreenMultiplier (), GetGreenOffset ());\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetRedMultiplier () {\n\n\t\treturn data[0];\n\n\t}\n\n\n\tfloat inline ColorMatrix::GetRedOffset () {\n\n\t\treturn data[4] * 255;\n\n\t}\n\n\n\tvoid ColorMatrix::GetRedTable (unsigned char* table) {\n\n\t\tGetDataTable (table, GetRedMultiplier (), GetRedOffset ());\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/math/Matrix3.cpp",
    "content": "#include <math/Matrix3.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_a;\n\tstatic int id_b;\n\tstatic int id_c;\n\tstatic int id_d;\n\tstatic int id_tx;\n\tstatic int id_ty;\n\tstatic bool init = false;\n\n\n\tMatrix3::Matrix3 (double a, double b, double c, double d, double tx, double ty) {\n\n\t\tt = 0;\n\n\t\tSetTo (a, b, c, d, tx, ty);\n\n\t}\n\n\n\tMatrix3::Matrix3 (value mat3) {\n\n\t\tif (!init) {\n\n\t\t\tid_a = val_id (\"a\");\n\t\t\tid_b = val_id (\"b\");\n\t\t\tid_c = val_id (\"c\");\n\t\t\tid_d = val_id (\"d\");\n\t\t\tid_tx = val_id (\"tx\");\n\t\t\tid_ty = val_id (\"ty\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\ta = val_number (val_field (mat3, id_a));\n\t\tb = val_number (val_field (mat3, id_b));\n\t\tc = val_number (val_field (mat3, id_c));\n\t\td = val_number (val_field (mat3, id_d));\n\t\ttx = val_number (val_field (mat3, id_tx));\n\t\tty = val_number (val_field (mat3, id_ty));\n\n\t}\n\n\n\tvoid Matrix3::SetTo (double a, double b, double c, double d, double tx, double ty) {\n\n\t\tthis->a = a;\n\t\tthis->b = b;\n\t\tthis->c = c;\n\t\tthis->d = d;\n\t\tthis->tx = tx;\n\t\tthis->ty = ty;\n\n\t}\n\n\n\tvalue Matrix3::Value () {\n\n\t\treturn Value (alloc_empty_object ());\n\n\t}\n\n\n\tvalue Matrix3::Value (value matrix3) {\n\n\t\tif (!init) {\n\n\t\t\tid_a = val_id (\"a\");\n\t\t\tid_b = val_id (\"b\");\n\t\t\tid_c = val_id (\"c\");\n\t\t\tid_d = val_id (\"d\");\n\t\t\tid_tx = val_id (\"tx\");\n\t\t\tid_ty = val_id (\"ty\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\talloc_field (matrix3, id_a, alloc_float (a));\n\t\talloc_field (matrix3, id_b, alloc_float (b));\n\t\talloc_field (matrix3, id_c, alloc_float (c));\n\t\talloc_field (matrix3, id_d, alloc_float (d));\n\t\talloc_field (matrix3, id_tx, alloc_float (tx));\n\t\talloc_field (matrix3, id_ty, alloc_float (ty));\n\t\treturn matrix3;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/math/Rectangle.cpp",
    "content": "#include <math/Rectangle.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_height;\n\tstatic int id_width;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\n\n\tRectangle::Rectangle () {\n\n\t\tt = 0;\n\n\t\tSetTo (0, 0, 0, 0);\n\n\t}\n\n\n\tRectangle::Rectangle (double x, double y, double width, double height) {\n\n\t\tt = 0;\n\n\t\tSetTo (x, y, width, height);\n\n\t}\n\n\n\tRectangle::Rectangle (value rect) {\n\n\t\tif (!init) {\n\n\t\t\tid_height = val_id (\"height\");\n\t\t\tid_width = val_id (\"width\");\n\t\t\tid_x = val_id (\"x\");\n\t\t\tid_y = val_id (\"y\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\twidth = val_number (val_field (rect, id_width));\n\t\theight = val_number (val_field (rect, id_height));\n\t\tx = val_number (val_field (rect, id_x));\n\t\ty = val_number (val_field (rect, id_y));\n\n\t}\n\n\n\tvoid Rectangle::Contract (double x, double y, double width, double height) {\n\n\t\tif (this->width == 0 && this->height == 0) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//double cacheRight = this->x + this->width;\n\t\t//double cacheBottom = this->y + this->height;\n\n\t\tif (this->x < x) this->x = x;\n\t\tif (this->y < y) this->y = y;\n\t\tif (this->x + this->width > x + width) this->width = x + width - this->x;\n\t\tif (this->y + this->height > y + height) this->height = y + height - this->y;\n\n\t}\n\n\n\tvoid Rectangle::SetTo (double x, double y, double width, double height) {\n\n\t\tthis->height = height;\n\t\tthis->width = width;\n\t\tthis->x = x;\n\t\tthis->y = y;\n\n\t}\n\n\n\tvalue Rectangle::Value () {\n\n\t\treturn Value (alloc_empty_object ());\n\n\t}\n\n\n\tvalue Rectangle::Value (value rect) {\n\n\t\tif (!init) {\n\n\t\t\tid_height = val_id (\"height\");\n\t\t\tid_width = val_id (\"width\");\n\t\t\tid_x = val_id (\"x\");\n\t\t\tid_y = val_id (\"y\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\talloc_field (rect, id_height, alloc_float (height));\n\t\talloc_field (rect, id_width, alloc_float (width));\n\t\talloc_field (rect, id_x, alloc_float (x));\n\t\talloc_field (rect, id_y, alloc_float (y));\n\t\treturn rect;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/math/Vector2.cpp",
    "content": "#include <math/Vector2.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\n\n\tVector2::Vector2 (double x, double y) {\n\n\t\tt = 0;\n\n\t\tSetTo (x, y);\n\n\t}\n\n\n\tVector2::Vector2 (value vec) {\n\n\t\tif (!init) {\n\n\t\t\tid_x = val_id (\"x\");\n\t\t\tid_y = val_id (\"y\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\tif (!val_is_null (vec)) {\n\n\t\t\tx = val_number (val_field (vec, id_x));\n\t\t\ty = val_number (val_field (vec, id_y));\n\n\t\t} else {\n\n\t\t\tx = 0;\n\t\t\ty = 0;\n\n\t\t}\n\n\t}\n\n\n\tvoid Vector2::SetTo (double x, double y) {\n\n\t\tthis->x = x;\n\t\tthis->y = y;\n\n\t}\n\n\n\tvalue Vector2::Value () {\n\n\t\treturn Value (alloc_empty_object ());\n\n\t}\n\n\n\tvalue Vector2::Value (value vec) {\n\n\t\tif (!init) {\n\n\t\t\tid_x = val_id (\"x\");\n\t\t\tid_y = val_id (\"y\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\talloc_field (vec, id_x, alloc_float (x));\n\t\talloc_field (vec, id_y, alloc_float (y));\n\t\treturn vec;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/media/AudioBuffer.cpp",
    "content": "#include <media/AudioBuffer.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_bitsPerSample;\n\tstatic int id_channels;\n\tstatic int id_data;\n\tstatic int id_sampleRate;\n\tstatic bool init = false;\n\n\n\tAudioBuffer::AudioBuffer (value audioBuffer) {\n\n\t\tif (!init) {\n\n\t\t\tid_bitsPerSample = val_id (\"bitsPerSample\");\n\t\t\tid_channels = val_id (\"channels\");\n\t\t\tid_data = val_id (\"data\");\n\t\t\tid_sampleRate = val_id (\"sampleRate\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\tif (!val_is_null (audioBuffer)) {\n\n\t\t\tbitsPerSample = val_int (val_field (audioBuffer, id_bitsPerSample));\n\t\t\tchannels = val_int (val_field (audioBuffer, id_channels));\n\t\t\tdata = new ArrayBufferView (val_field (audioBuffer, id_data));\n\t\t\tsampleRate = val_int (val_field (audioBuffer, id_sampleRate));\n\n\t\t} else {\n\n\t\t\tbitsPerSample = 0;\n\t\t\tchannels = 0;\n\t\t\t// data = new ArrayBufferView ();\n\t\t\tsampleRate = 0;\n\n\t\t}\n\n\t\t// _value = audioBuffer;\n\n\t}\n\n\n\tAudioBuffer::~AudioBuffer () {\n\n\t\tif (data) {\n\n\t\t\tdelete data;\n\n\t\t}\n\n\t}\n\n\n\tvalue AudioBuffer::Value () {\n\n\t\treturn Value (alloc_empty_object ());\n\n\t}\n\n\n\tvalue AudioBuffer::Value (value audioBuffer) {\n\n\t\tif (!init) {\n\n\t\t\tid_bitsPerSample = val_id (\"bitsPerSample\");\n\t\t\tid_channels = val_id (\"channels\");\n\t\t\tid_data = val_id (\"data\");\n\t\t\tid_sampleRate = val_id (\"sampleRate\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\talloc_field (audioBuffer, id_bitsPerSample, alloc_int (bitsPerSample));\n\t\talloc_field (audioBuffer, id_channels, alloc_int (channels));\n\t\talloc_field (audioBuffer, id_data, data ? data->Value (val_field (audioBuffer, id_data)) : alloc_null ());\n\t\talloc_field (audioBuffer, id_sampleRate, alloc_int (sampleRate));\n\t\treturn audioBuffer;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/media/codecs/vorbis/VorbisBindings.cpp",
    "content": "#include <media/codecs/vorbis/VorbisFile.h>\n#include <system/CFFI.h>\n#include <system/CFFIPointer.h>\n#include <utils/Bytes.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_bitrateUpper;\n\tstatic int id_bitrateNominal;\n\tstatic int id_bitrateLower;\n\tstatic int id_bitstream;\n\tstatic int id_channels;\n\tstatic int id_high;\n\tstatic int id_low;\n\tstatic int id_rate;\n\tstatic int id_returnValue;\n\tstatic int id_version;\n\tstatic value infoValue;\n\tstatic value int64Value;\n\tstatic value readValue;\n\tstatic vdynamic *hl_infoValue;\n\tstatic vdynamic *hl_int64Value;\n\tstatic vdynamic *hl_readValue;\n\tstatic bool init = false;\n\n\n\tinline void _initializeVorbis () {\n\n\t\tif (!init) {\n\n\t\t\tid_bitrateUpper = val_id (\"bitrateUpper\");\n\t\t\tid_bitrateNominal = val_id (\"bitrateNominal\");\n\t\t\tid_bitrateLower = val_id (\"bitrateLower\");\n\t\t\tid_bitstream = val_id (\"bitstream\");\n\t\t\tid_channels = val_id (\"channels\");\n\t\t\tid_high = val_id (\"high\");\n\t\t\tid_low = val_id (\"low\");\n\t\t\tid_rate = val_id (\"rate\");\n\t\t\tid_returnValue = val_id (\"returnValue\");\n\t\t\tid_version = val_id (\"version\");\n\n\t\t\tinfoValue = alloc_empty_object ();\n\t\t\tint64Value = alloc_empty_object ();\n\t\t\treadValue = alloc_empty_object ();\n\n\t\t\tvalue* root = alloc_root ();\n\t\t\t*root = infoValue;\n\n\t\t\tvalue* root2 = alloc_root ();\n\t\t\t*root2 = int64Value;\n\n\t\t\tvalue* root3 = alloc_root ();\n\t\t\t*root3 = readValue;\n\n\t\t\tinit = true;\n\n\t\t}\n\n\t}\n\n\n\tinline void _hl_initializeVorbis () {\n\n\t\tif (!init) {\n\n\t\t\tid_bitrateUpper = hl_hash_utf8 (\"bitrateUpper\");\n\t\t\tid_bitrateNominal = hl_hash_utf8 (\"bitrateNominal\");\n\t\t\tid_bitrateLower = hl_hash_utf8 (\"bitrateLower\");\n\t\t\tid_bitstream = hl_hash_utf8 (\"bitstream\");\n\t\t\tid_channels = hl_hash_utf8 (\"channels\");\n\t\t\tid_high = hl_hash_utf8 (\"high\");\n\t\t\tid_low = hl_hash_utf8 (\"low\");\n\t\t\tid_rate = hl_hash_utf8 (\"rate\");\n\t\t\tid_returnValue = hl_hash_utf8 (\"returnValue\");\n\t\t\tid_version = hl_hash_utf8 (\"version\");\n\n\t\t\thl_infoValue = (vdynamic*)hl_alloc_dynobj();\n\t\t\thl_int64Value = (vdynamic*)hl_alloc_dynobj();\n\t\t\thl_readValue = (vdynamic*)hl_alloc_dynobj();\n\n\t\t\thl_add_root(&hl_infoValue);\n\t\t\thl_add_root(&hl_int64Value);\n\t\t\thl_add_root(&hl_readValue);\n\n\t\t\tinit = true;\n\n\t\t}\n\n\t}\n\n\n\tvalue allocInt64 (ogg_int64_t val) {\n\n\t\togg_int32_t low = val;\n\t\togg_int32_t high = (val >> 32);\n\n\t\t_initializeVorbis ();\n\n\t\talloc_field (int64Value, id_low, alloc_int (low));\n\t\talloc_field (int64Value, id_high, alloc_int (high));\n\n\t\treturn int64Value;\n\n\t}\n\n\n\tvdynamic* hl_allocInt64 (ogg_int64_t val) {\n\n\t\togg_int32_t low = val;\n\t\togg_int32_t high = (val >> 32);\n\n\t\t_hl_initializeVorbis ();\n\n\t\thl_dyn_seti (hl_int64Value, id_low, &hlt_i32, low);\n\t\thl_dyn_seti (hl_int64Value, id_high, &hlt_i32, high);\n\n\t\treturn hl_int64Value;\n\n\t}\n\n\n\tvoid lime_vorbis_file_clear (value vorbisFile);\n\tHL_PRIM void HL_NAME(hl_vorbis_file_clear) (HL_CFFIPointer* vorbisFile);\n\n\n\tvoid gc_vorbis_file (value vorbisFile) {\n\n\t\tlime_vorbis_file_clear (vorbisFile);\n\n\t}\n\n\tvoid hl_gc_vorbis_file (HL_CFFIPointer* vorbisFile) {\n\n\t\tlime_hl_vorbis_file_clear (vorbisFile);\n\n\t}\n\n\n\tint lime_vorbis_file_bitrate (value vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_bitrate (file, bitstream);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_bitrate) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_bitrate (file, bitstream);\n\n\t}\n\n\n\tint lime_vorbis_file_bitrate_instant (value vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_bitrate_instant (file);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_bitrate_instant) (HL_CFFIPointer* vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_bitrate_instant (file);\n\n\t}\n\n\n\tvoid lime_vorbis_file_clear (value vorbisFile) {\n\n\t\tif (!val_is_null (vorbisFile)) {\n\n\t\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\t\tval_gc (vorbisFile, 0);\n\t\t\tov_clear (file);\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_vorbis_file_clear) (HL_CFFIPointer* vorbisFile) {\n\n\t\tif (vorbisFile) {\n\n\t\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\t\tvorbisFile->finalizer = 0;\n\t\t\tov_clear (file);\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_vorbis_file_comment (value vorbisFile, int bitstream) {\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_comment) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_vorbis_file_crosslap (value vorbisFile, value otherVorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\tOggVorbis_File* otherFile = (OggVorbis_File*)(uintptr_t)val_data (otherVorbisFile);\n\t\treturn alloc_int (ov_crosslap (file, otherFile));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_crosslap) (HL_CFFIPointer* vorbisFile, HL_CFFIPointer* otherVorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\tOggVorbis_File* otherFile = (OggVorbis_File*)(uintptr_t)otherVorbisFile->ptr;\n\t\treturn ov_crosslap (file, otherFile);\n\n\t}\n\n\n\tvalue lime_vorbis_file_info (value vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\tvorbis_info *info = ov_info (file, bitstream);\n\n\t\tif (info) {\n\n\t\t\t_initializeVorbis ();\n\n\t\t\talloc_field (infoValue, id_version, alloc_int (info->version));\n\t\t\talloc_field (infoValue, id_channels, alloc_int (info->channels));\n\t\t\talloc_field (infoValue, id_rate, alloc_int (info->rate));\n\t\t\talloc_field (infoValue, id_bitrateUpper, alloc_int (info->bitrate_upper));\n\t\t\talloc_field (infoValue, id_bitrateNominal, alloc_int (info->bitrate_nominal));\n\t\t\talloc_field (infoValue, id_bitrateLower, alloc_int (info->bitrate_lower));\n\n\t\t\treturn infoValue;\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_info) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\tvorbis_info *info = ov_info (file, bitstream);\n\n\t\tif (info) {\n\n\t\t\t_hl_initializeVorbis ();\n\n\t\t\thl_dyn_seti (hl_infoValue, id_version, &hlt_i32, info->version);\n\t\t\thl_dyn_seti (hl_infoValue, id_channels, &hlt_i32, info->channels);\n\t\t\thl_dyn_seti (hl_infoValue, id_rate, &hlt_i32, info->rate);\n\t\t\thl_dyn_seti (hl_infoValue, id_bitrateUpper, &hlt_i32, info->bitrate_upper);\n\t\t\thl_dyn_seti (hl_infoValue, id_bitrateNominal, &hlt_i32, info->bitrate_nominal);\n\t\t\thl_dyn_seti (hl_infoValue, id_bitrateLower, &hlt_i32, info->bitrate_lower);\n\n\t\t\treturn hl_infoValue;\n\n\t\t}\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_vorbis_file_from_bytes (value data) {\n\n\t\tBytes bytes;\n\t\tbytes.Set (data);\n\n\t\tOggVorbis_File* vorbisFile = VorbisFile::FromBytes (&bytes);\n\n\t\tif (vorbisFile) {\n\n\t\t\treturn CFFIPointer ((void*)(uintptr_t)vorbisFile, gc_vorbis_file);\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_vorbis_file_from_bytes) (Bytes* data) {\n\n\t\tOggVorbis_File* vorbisFile = VorbisFile::FromBytes (data);\n\n\t\tif (vorbisFile) {\n\n\t\t\treturn HLCFFIPointer ((void*)(uintptr_t)vorbisFile, (hl_finalizer)hl_gc_vorbis_file);\n\n\t\t}\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_vorbis_file_from_file (HxString path) {\n\n\t\tOggVorbis_File* vorbisFile = VorbisFile::FromFile (path.c_str ());\n\n\t\tif (vorbisFile) {\n\n\t\t\treturn CFFIPointer ((void*)(uintptr_t)vorbisFile, gc_vorbis_file);\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_vorbis_file_from_file) (hl_vstring* path) {\n\n\t\tOggVorbis_File* vorbisFile = VorbisFile::FromFile (path ? hl_to_utf8 (path->bytes) : NULL);\n\n\t\tif (vorbisFile) {\n\n\t\t\treturn HLCFFIPointer ((void*)(uintptr_t)vorbisFile, (hl_finalizer)hl_gc_vorbis_file);\n\n\t\t}\n\n\t\treturn NULL;\n\n\t}\n\n\n\tint lime_vorbis_file_pcm_seek (value vorbisFile, value posLow, value posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\togg_int64_t pos = ((ogg_int64_t)val_number (posHigh) << 32) | (ogg_int64_t)val_number (posLow);\n\t\treturn ov_pcm_seek (file, pos);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_pcm_seek) (HL_CFFIPointer* vorbisFile, int posLow, int posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\togg_int64_t pos = ((ogg_int64_t)posHigh << 32) | (ogg_int64_t)posLow;\n\t\treturn ov_pcm_seek (file, pos);\n\n\t}\n\n\n\tint lime_vorbis_file_pcm_seek_lap (value vorbisFile, value posLow, value posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\togg_int64_t pos = ((ogg_int64_t)val_number (posHigh) << 32) | (ogg_int64_t)val_number (posLow);\n\t\treturn ov_pcm_seek_lap (file, pos);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_pcm_seek_lap) (HL_CFFIPointer* vorbisFile, int posLow, int posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\togg_int64_t pos = ((ogg_int64_t)posHigh << 32) | (ogg_int64_t)posLow;\n\t\treturn ov_pcm_seek_lap (file, pos);\n\n\t}\n\n\n\tint lime_vorbis_file_pcm_seek_page (value vorbisFile, value posLow, value posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\togg_int64_t pos = ((ogg_int64_t)val_number (posHigh) << 32) | (ogg_int64_t)val_number (posLow);\n\t\treturn ov_pcm_seek_page (file, pos);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_pcm_seek_page) (HL_CFFIPointer* vorbisFile, int posLow, int posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\togg_int64_t pos = ((ogg_int64_t)posHigh << 32) | (ogg_int64_t)posLow;\n\t\treturn ov_pcm_seek_page (file, pos);\n\n\t}\n\n\n\tint lime_vorbis_file_pcm_seek_page_lap (value vorbisFile, value posLow, value posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\togg_int64_t pos = ((ogg_int64_t)val_number (posHigh) << 32) | (ogg_int64_t)val_number (posLow);\n\t\treturn ov_pcm_seek_page_lap (file, pos);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_pcm_seek_page_lap) (HL_CFFIPointer* vorbisFile, int posLow, int posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\togg_int64_t pos = ((ogg_int64_t)posHigh << 32) | (ogg_int64_t)posLow;\n\t\treturn ov_pcm_seek_page_lap (file, pos);\n\n\t}\n\n\n\tvalue lime_vorbis_file_pcm_tell (value vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn allocInt64 (ov_pcm_tell (file));\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_pcm_tell) (HL_CFFIPointer* vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn hl_allocInt64 (ov_pcm_tell (file));\n\n\t}\n\n\n\tvalue lime_vorbis_file_pcm_total (value vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn allocInt64 (ov_pcm_total (file, bitstream));\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_pcm_total) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn hl_allocInt64 (ov_pcm_total (file, bitstream));\n\n\t}\n\n\n\tint lime_vorbis_file_raw_seek (value vorbisFile, value posLow, value posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\togg_int64_t pos = ((ogg_int64_t)val_number (posHigh) << 32) | (ogg_int64_t)val_number (posLow);\n\t\treturn ov_raw_seek (file, pos);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_raw_seek) (HL_CFFIPointer* vorbisFile, int posLow, int posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\togg_int64_t pos = ((ogg_int64_t)posHigh << 32) | (ogg_int64_t)posLow;\n\t\treturn ov_raw_seek (file, pos);\n\n\t}\n\n\n\tint lime_vorbis_file_raw_seek_lap (value vorbisFile, value posLow, value posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\togg_int64_t pos = ((ogg_int64_t)val_number (posHigh) << 32) | (ogg_int64_t)val_number (posLow);\n\t\treturn ov_raw_seek_lap (file, pos);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_raw_seek_lap) (HL_CFFIPointer* vorbisFile, int posLow, int posHigh) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\togg_int64_t pos = ((ogg_int64_t)posHigh << 32) | (ogg_int64_t)posLow;\n\t\treturn ov_raw_seek_lap (file, pos);\n\n\t}\n\n\n\tvalue lime_vorbis_file_raw_tell (value vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn allocInt64 (ov_raw_tell (file));\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_raw_tell) (HL_CFFIPointer* vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn hl_allocInt64 (ov_raw_tell (file));\n\n\t}\n\n\n\tvalue lime_vorbis_file_raw_total (value vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn allocInt64 (ov_raw_total (file, bitstream));\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_raw_total) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn hl_allocInt64 (ov_raw_total (file, bitstream));\n\n\t}\n\n\n\tvalue lime_vorbis_file_read (value vorbisFile, value buffer, int position, int length, bool bigendianp, int word, bool sgned) {\n\n\t\tif (val_is_null (buffer)) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tBytes bytes;\n\t\tbytes.Set (buffer);\n\n\t\tint bitstream;\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\tlong result = ov_read (file, (char*)bytes.b + position, length, bigendianp, word, sgned, &bitstream);\n\n\t\t_initializeVorbis ();\n\n\t\talloc_field (readValue, id_bitstream, alloc_int (bitstream));\n\t\talloc_field (readValue, id_returnValue, alloc_int (result));\n\n\t\treturn readValue;\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_read) (HL_CFFIPointer* vorbisFile, Bytes* buffer, int position, int length, bool bigendianp, int word, bool sgned) {\n\n\t\tif (!buffer) {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\tint bitstream;\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\tlong result = ov_read (file, (char*)buffer->b + position, length, bigendianp, word, sgned, &bitstream);\n\n\t\t_hl_initializeVorbis ();\n\n\t\thl_dyn_seti (hl_readValue, id_bitstream, &hlt_i32, bitstream);\n\t\thl_dyn_seti (hl_readValue, id_returnValue, &hlt_i32, result);\n\n\t\treturn hl_readValue;\n\n\t}\n\n\n\tvalue lime_vorbis_file_read_float (value vorbisFile, value pcmChannels, int samples) {\n\n\t\t//Bytes bytes;\n\t\t//bytes.Set (pcmChannels);\n\t\t//\n\t\t//int bitstream;\n\t\t//\n\t\t//OggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\t//long result = ov_read_float (file, (char*)bytes.Data (), samples, &bitstream);\n\t\t//\n\t\t//alloc_field (readValue, id_bitstream, alloc_int (bitstream));\n\t\t//alloc_field (readValue, id_returnValue, alloc_int (result));\n\t\t//\n\t\t//return readValue;\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_vorbis_file_read_float) (HL_CFFIPointer* vorbisFile, Bytes* pcmChannels, int samples) {\n\n\t\treturn NULL;\n\n\t}\n\n\n\tbool lime_vorbis_file_seekable (value vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_seekable (file);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_vorbis_file_seekable) (HL_CFFIPointer* vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_seekable (file);\n\n\t}\n\n\n\tint lime_vorbis_file_serial_number (value vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_serialnumber (file, bitstream);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_serial_number) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_serialnumber (file, bitstream);\n\n\t}\n\n\n\tint lime_vorbis_file_streams (value vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_streams (file);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_streams) (HL_CFFIPointer* vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_streams (file);\n\n\t}\n\n\n\tint lime_vorbis_file_time_seek (value vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_time_seek (file, s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_time_seek) (HL_CFFIPointer* vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_time_seek (file, s);\n\n\t}\n\n\n\tint lime_vorbis_file_time_seek_lap (value vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_time_seek_lap (file, s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_time_seek_lap) (HL_CFFIPointer* vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_time_seek_lap (file, s);\n\n\t}\n\n\n\tint lime_vorbis_file_time_seek_page (value vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_time_seek_page (file, s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_time_seek_page) (HL_CFFIPointer* vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_time_seek_page (file, s);\n\n\t}\n\n\n\tint lime_vorbis_file_time_seek_page_lap (value vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_time_seek_page_lap (file, s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_vorbis_file_time_seek_page_lap) (HL_CFFIPointer* vorbisFile, double s) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_time_seek_page_lap (file, s);\n\n\t}\n\n\n\tdouble lime_vorbis_file_time_tell (value vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_time_tell (file);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_vorbis_file_time_tell) (HL_CFFIPointer* vorbisFile) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_time_tell (file);\n\n\t}\n\n\n\tdouble lime_vorbis_file_time_total (value vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)val_data (vorbisFile);\n\t\treturn ov_time_total (file, bitstream);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_vorbis_file_time_total) (HL_CFFIPointer* vorbisFile, int bitstream) {\n\n\t\tOggVorbis_File* file = (OggVorbis_File*)(uintptr_t)vorbisFile->ptr;\n\t\treturn ov_time_total (file, bitstream);\n\n\t}\n\n\n\tDEFINE_PRIME2 (lime_vorbis_file_bitrate);\n\tDEFINE_PRIME1 (lime_vorbis_file_bitrate_instant);\n\tDEFINE_PRIME1v (lime_vorbis_file_clear);\n\tDEFINE_PRIME2 (lime_vorbis_file_comment);\n\tDEFINE_PRIME2v (lime_vorbis_file_crosslap);\n\tDEFINE_PRIME1 (lime_vorbis_file_from_bytes);\n\tDEFINE_PRIME1 (lime_vorbis_file_from_file);\n\tDEFINE_PRIME2 (lime_vorbis_file_info);\n\tDEFINE_PRIME3 (lime_vorbis_file_pcm_seek);\n\tDEFINE_PRIME3 (lime_vorbis_file_pcm_seek_lap);\n\tDEFINE_PRIME3 (lime_vorbis_file_pcm_seek_page);\n\tDEFINE_PRIME3 (lime_vorbis_file_pcm_seek_page_lap);\n\tDEFINE_PRIME1 (lime_vorbis_file_pcm_tell);\n\tDEFINE_PRIME2 (lime_vorbis_file_pcm_total);\n\tDEFINE_PRIME3 (lime_vorbis_file_raw_seek);\n\tDEFINE_PRIME3 (lime_vorbis_file_raw_seek_lap);\n\tDEFINE_PRIME1 (lime_vorbis_file_raw_tell);\n\tDEFINE_PRIME2 (lime_vorbis_file_raw_total);\n\tDEFINE_PRIME7 (lime_vorbis_file_read);\n\tDEFINE_PRIME3 (lime_vorbis_file_read_float);\n\tDEFINE_PRIME1 (lime_vorbis_file_seekable);\n\tDEFINE_PRIME2 (lime_vorbis_file_serial_number);\n\tDEFINE_PRIME1 (lime_vorbis_file_streams);\n\tDEFINE_PRIME2 (lime_vorbis_file_time_seek);\n\tDEFINE_PRIME2 (lime_vorbis_file_time_seek_lap);\n\tDEFINE_PRIME2 (lime_vorbis_file_time_seek_page);\n\tDEFINE_PRIME2 (lime_vorbis_file_time_seek_page_lap);\n\tDEFINE_PRIME1 (lime_vorbis_file_time_tell);\n\tDEFINE_PRIME2 (lime_vorbis_file_time_total);\n\n\n\t#define _TBYTES _OBJ (_I32 _BYTES)\n\t#define _TCFFIPOINTER _DYN\n\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_bitrate,            _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_bitrate_instant,    _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID,         hl_vorbis_file_clear,              _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_comment,            _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_crosslap,           _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_info,               _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_vorbis_file_from_bytes,         _TBYTES);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_vorbis_file_from_file,          _STRING);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_pcm_seek,           _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_pcm_seek_lap,       _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_pcm_seek_page,      _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_pcm_seek_page_lap,  _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_pcm_tell,           _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_pcm_total,          _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_raw_seek,           _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_raw_seek_lap,       _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_raw_tell,           _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_raw_total,          _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_read,               _TCFFIPOINTER _TBYTES _I32 _I32 _BOOL _I32 _BOOL);\n\tDEFINE_HL_PRIM (_DYN,          hl_vorbis_file_read_float,         _TCFFIPOINTER _TBYTES _I32);\n\tDEFINE_HL_PRIM (_BOOL,         hl_vorbis_file_seekable,           _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_serial_number,      _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_streams,            _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_time_seek,          _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_time_seek_lap,      _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_time_seek_page,     _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_I32,          hl_vorbis_file_time_seek_page_lap, _TCFFIPOINTER _F64);\n\tDEFINE_HL_PRIM (_F64,          hl_vorbis_file_time_tell,          _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_F64,          hl_vorbis_file_time_total,         _TCFFIPOINTER _I32);\n\n\n}\n\n\nextern \"C\" int lime_vorbis_register_prims () {\n\n\treturn 0;\n\n}"
  },
  {
    "path": "project/src/media/codecs/vorbis/VorbisFile.cpp",
    "content": "#include <media/codecs/vorbis/VorbisFile.h>\n#include <system/System.h>\n\n\nnamespace lime {\n\n\n\ttypedef struct {\n\n\t\tunsigned char* data;\n\t\togg_int64_t size;\n\t\togg_int64_t pos;\n\n\t} VorbisFile_Buffer;\n\n\n\tstatic size_t VorbisFile_BufferRead (void* dest, size_t eltSize, size_t nelts, VorbisFile_Buffer* src) {\n\n\t\tsize_t len = eltSize * nelts;\n\n\t\tif ((src->pos + len) > src->size) {\n\n\t\t\tlen = src->size - src->pos;\n\n\t\t}\n\n\t\tif (len > 0) {\n\n\t\t\tmemcpy (dest, (src->data + src->pos), len);\n\t\t\tsrc->pos += len;\n\n\t\t}\n\n\t\treturn len;\n\n\t}\n\n\n\tstatic int VorbisFile_BufferSeek (VorbisFile_Buffer* src, ogg_int64_t pos, int whence) {\n\n\t\tswitch (whence) {\n\n\t\t\tcase SEEK_CUR:\n\n\t\t\t\tsrc->pos += pos;\n\t\t\t\tbreak;\n\n\t\t\tcase SEEK_END:\n\n\t\t\t\tsrc->pos = src->size - pos;\n\t\t\t\tbreak;\n\n\t\t\tcase SEEK_SET:\n\n\t\t\t\tsrc->pos = pos;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\treturn -1;\n\n\t\t}\n\n\t\tif (src->pos < 0) {\n\n\t\t\tsrc->pos = 0;\n\t\t\treturn -1;\n\n\t\t}\n\n\t\tif (src->pos > src->size) {\n\n\t\t\treturn -1;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\n\tstatic int VorbisFile_BufferClose (VorbisFile_Buffer* src) {\n\n\t\tdelete src;\n\t\treturn 0;\n\n\t}\n\n\n\tstatic long VorbisFile_BufferTell (VorbisFile_Buffer* src) {\n\n\t\treturn src->pos;\n\n\t}\n\n\n\tstatic ov_callbacks VORBIS_FILE_BUFFER_CALLBACKS = {\n\n\t\t(size_t (*)(void *, size_t, size_t, void *)) VorbisFile_BufferRead,\n\t\t(int (*)(void *, ogg_int64_t, int)) VorbisFile_BufferSeek,\n\t\t(int (*)(void *)) VorbisFile_BufferClose,\n\t\t(long (*)(void *)) VorbisFile_BufferTell\n\n\t};\n\n\n\tstatic size_t VorbisFile_FileRead (void* dest, size_t eltSize, size_t nelts, FILE_HANDLE* file) {\n\n\t\treturn lime::fread (dest, eltSize, nelts, file);\n\n\t}\n\n\n\tstatic int VorbisFile_FileSeek (FILE_HANDLE* file, ogg_int64_t pos, int whence) {\n\n\t\treturn lime::fseek (file, pos, whence);\n\n\t}\n\n\n\tstatic int VorbisFile_FileClose (FILE_HANDLE* file) {\n\n\t\treturn lime::fclose (file);\n\n\t}\n\n\n\tstatic long VorbisFile_FileTell (FILE_HANDLE* file) {\n\n\t\treturn lime::ftell (file);\n\n\t}\n\n\n\tstatic ov_callbacks VORBIS_FILE_FILE_CALLBACKS = {\n\n\t\t(size_t (*)(void *, size_t, size_t, void *)) VorbisFile_FileRead,\n\t\t(int (*)(void *, ogg_int64_t, int)) VorbisFile_FileSeek,\n\t\t(int (*)(void *)) VorbisFile_FileClose,\n\t\t(long (*)(void *)) VorbisFile_FileTell\n\n\t};\n\n\n\tOggVorbis_File* VorbisFile::FromBytes (Bytes* bytes) {\n\n\t\tOggVorbis_File* vorbisFile = new OggVorbis_File;\n\t\tmemset (vorbisFile, 0, sizeof (OggVorbis_File));\n\n\t\tVorbisFile_Buffer* buffer = new VorbisFile_Buffer ();\n\t\tbuffer->data = bytes->b;\n\t\tbuffer->size = bytes->length;\n\t\tbuffer->pos = 0;\n\n\t\tif (ov_open_callbacks (buffer, vorbisFile, NULL, 0, VORBIS_FILE_BUFFER_CALLBACKS) != 0) {\n\n\t\t\tdelete buffer;\n\t\t\tdelete vorbisFile;\n\t\t\treturn 0;\n\n\t\t}\n\n\t\treturn vorbisFile;\n\n\t}\n\n\n\tOggVorbis_File* VorbisFile::FromFile (const char* path) {\n\n\t\tif (path) {\n\n\t\t\tFILE_HANDLE *file = lime::fopen (path, \"rb\");\n\n\t\t\tif (file) {\n\n\t\t\t\tOggVorbis_File* vorbisFile = new OggVorbis_File;\n\t\t\t\tmemset (vorbisFile, 0, sizeof (OggVorbis_File));\n\n\t\t\t\tif (ov_open_callbacks (file, vorbisFile, NULL, 0, VORBIS_FILE_FILE_CALLBACKS) != 0) {\n\n\t\t\t\t\tdelete vorbisFile;\n\t\t\t\t\tlime::fclose (file);\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\treturn vorbisFile;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/media/containers/OGG.cpp",
    "content": "#include <media/codecs/vorbis/VorbisFile.h>\n#include <media/containers/OGG.h>\n\n\nnamespace lime {\n\n\n\tbool OGG::Decode (Resource *resource, AudioBuffer *audioBuffer) {\n\n\t\tOggVorbis_File* oggFile;\n\t\tBytes *data = NULL;\n\n\t\tif (resource->path) {\n\n\t\t\toggFile = VorbisFile::FromFile (resource->path);\n\n\t\t} else {\n\n\t\t\toggFile = VorbisFile::FromBytes (resource->data);\n\n\t\t}\n\n\t\tif (!oggFile) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// 0 for Little-Endian, 1 for Big-Endian\n\t\t#ifdef HXCPP_BIG_ENDIAN\n\t\t#define BUFFER_READ_TYPE 1\n\t\t#else\n\t\t#define BUFFER_READ_TYPE 0\n\t\t#endif\n\n\t\tint bitStream;\n\t\tlong bytes = 1;\n\t\tint totalBytes = 0;\n\n\t\t#define BUFFER_SIZE 4096\n\n\t\tvorbis_info *pInfo = ov_info (oggFile, -1);\n\n\t\tif (pInfo == NULL) {\n\n\t\t\t//LOG_SOUND(\"FAILED TO READ OGG SOUND INFO, IS THIS EVEN AN OGG FILE?\\n\");\n\t\t\tov_clear (oggFile);\n\t\t\tdelete oggFile;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\taudioBuffer->channels = pInfo->channels;\n\t\taudioBuffer->sampleRate = pInfo->rate;\n\n\t\taudioBuffer->bitsPerSample = 16;\n\n\t\tint dataLength = ov_pcm_total (oggFile, -1) * audioBuffer->channels * audioBuffer->bitsPerSample / 8;\n\t\taudioBuffer->data->Resize (dataLength);\n\n\t\twhile (bytes > 0) {\n\n\t\t\tbytes = ov_read (oggFile, (char *)audioBuffer->data->buffer->b + totalBytes, BUFFER_SIZE, BUFFER_READ_TYPE, 2, 1, &bitStream);\n\n\t\t\tif (bytes > 0) {\n\n\t\t\t\ttotalBytes += bytes;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (dataLength != totalBytes) {\n\n\t\t\taudioBuffer->data->Resize (totalBytes);\n\n\t\t}\n\n\t\tov_clear (oggFile);\n\t\tdelete oggFile;\n\n\t\t#undef BUFFER_READ_TYPE\n\n\t\treturn true;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/media/containers/WAV.cpp",
    "content": "#include <media/containers/WAV.h>\n#include <system/System.h>\n\n\nnamespace lime {\n\n\n\ttemplate<typename T>\n\tinline const char* readStruct (T& dest, const char*& ptr) {\n\n\t\tconst char* ret;\n\t\tmemcpy (&dest, ptr, sizeof (T));\n\t\tptr += sizeof (WAVE_Data);\n\t\tret = ptr;\n\t\tptr += dest.subChunkSize;\n\t\treturn ret;\n\n\t}\n\n\n\tconst char* find_chunk (const char* start, const char* end, const char* chunkID) {\n\n\t\tWAVE_Data chunk;\n\t\tconst char* ptr = start;\n\n\t\twhile (ptr < (end - sizeof(WAVE_Data))) {\n\n\t\t\tmemcpy (&chunk, ptr, sizeof (WAVE_Data));\n\n\t\t\tif (chunk.subChunkID[0] == chunkID[0] && chunk.subChunkID[1] == chunkID[1] && chunk.subChunkID[2] == chunkID[2] && chunk.subChunkID[3] == chunkID[3]) {\n\n\t\t\t\treturn ptr;\n\n\t\t\t}\n\n\t\t\tptr += sizeof (WAVE_Data) + chunk.subChunkSize;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\n\tbool WAV::Decode (Resource *resource, AudioBuffer *audioBuffer) {\n\n\t\tWAVE_Format wave_format;\n\t\tRIFF_Header riff_header;\n\t\tWAVE_Data wave_data;\n\t\tunsigned char* data;\n\n\t\tFILE_HANDLE *file = NULL;\n\n\t\tif (resource->path) {\n\n\t\t\tfile = lime::fopen (resource->path, \"rb\");\n\n\t\t\tif (!file) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tint result = lime::fread (&riff_header, sizeof (RIFF_Header), 1, file);\n\n\t\t\tif ((riff_header.chunkID[0] != 'R' || riff_header.chunkID[1] != 'I' || riff_header.chunkID[2] != 'F' || riff_header.chunkID[3] != 'F') || (riff_header.format[0] != 'W' || riff_header.format[1] != 'A' || riff_header.format[2] != 'V' || riff_header.format[3] != 'E')) {\n\n\t\t\t\tlime::fclose (file);\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tlong int currentHead = 0;\n\t\t\tbool foundFormat = false;\n\n\t\t\twhile (!foundFormat) {\n\n\t\t\t\tcurrentHead = lime::ftell (file);\n\t\t\t\tresult = lime::fread (&wave_format, sizeof (WAVE_Format), 1, file);\n\n\t\t\t\tif (result != 1) {\n\n\t\t\t\t\tLOG_SOUND (\"Invalid Wave Format!\\n\");\n\t\t\t\t\tlime::fclose (file);\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tif (wave_format.subChunkID[0] != 'f' || wave_format.subChunkID[1] != 'm' || wave_format.subChunkID[2] != 't' || wave_format.subChunkID[3] != ' ') {\n\n\t\t\t\t\tlime::fseek (file, currentHead + sizeof (WAVE_Data) + wave_format.subChunkSize, SEEK_SET);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfoundFormat = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbool foundData = false;\n\n\t\t\twhile (!foundData) {\n\n\t\t\t\tcurrentHead = lime::ftell (file);\n\t\t\t\tresult = lime::fread (&wave_data, sizeof (WAVE_Data), 1, file);\n\n\t\t\t\tif (result != 1) {\n\n\t\t\t\t\tLOG_SOUND (\"Invalid Wav Data Header!\\n\");\n\t\t\t\t\tlime::fclose (file);\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tif (wave_data.subChunkID[0] != 'd' || wave_data.subChunkID[1] != 'a' || wave_data.subChunkID[2] != 't' || wave_data.subChunkID[3] != 'a') {\n\n\t\t\t\t\tlime::fseek (file, currentHead + sizeof (WAVE_Data) + wave_data.subChunkSize, SEEK_SET);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfoundData = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\taudioBuffer->data->Resize (wave_data.subChunkSize);\n\n\t\t\tif (!lime::fread (audioBuffer->data->buffer->b, wave_data.subChunkSize, 1, file)) {\n\n\t\t\t\tLOG_SOUND (\"error loading WAVE data into struct!\\n\");\n\t\t\t\tlime::fclose (file);\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tlime::fclose (file);\n\n\t\t} else {\n\n\t\t\tconst char* start = (const char*)resource->data->b;\n\t\t\tconst char* end = start + resource->data->length;\n\t\t\tconst char* ptr = start;\n\n\t\t\tmemcpy (&riff_header, ptr, sizeof (RIFF_Header));\n\t\t\tptr += sizeof (RIFF_Header);\n\n\t\t\tif ((riff_header.chunkID[0] != 'R' || riff_header.chunkID[1] != 'I' || riff_header.chunkID[2] != 'F' || riff_header.chunkID[3] != 'F') || (riff_header.format[0] != 'W' || riff_header.format[1] != 'A' || riff_header.format[2] != 'V' || riff_header.format[3] != 'E')) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tptr = find_chunk (ptr, end, \"fmt \");\n\n\t\t\tif (!ptr) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treadStruct (wave_format, ptr);\n\n\t\t\tif (wave_format.subChunkID[0] != 'f' || wave_format.subChunkID[1] != 'm' || wave_format.subChunkID[2] != 't' || wave_format.subChunkID[3] != ' ') {\n\n\t\t\t\tLOG_SOUND (\"Invalid Wave Format!\\n\");\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tptr = find_chunk (ptr, end, \"data\");\n\n\t\t\tif (!ptr) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tconst char* base = readStruct (wave_data, ptr);\n\n\t\t\tif (wave_data.subChunkID[0] != 'd' || wave_data.subChunkID[1] != 'a' || wave_data.subChunkID[2] != 't' || wave_data.subChunkID[3] != 'a') {\n\n\t\t\t\tLOG_SOUND (\"Invalid Wav Data Header!\\n\");\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\taudioBuffer->data->Resize (wave_data.subChunkSize);\n\n\t\t\tsize_t size = wave_data.subChunkSize;\n\n\t\t\tif (size > (end - base)) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tunsigned char* bytes = audioBuffer->data->buffer->b;\n\t\t\tmemcpy (bytes, base, size);\n\n\t\t}\n\n\t\taudioBuffer->sampleRate = (int)wave_format.sampleRate;\n\t\taudioBuffer->channels = wave_format.numChannels;\n\t\taudioBuffer->bitsPerSample = wave_format.bitsPerSample;\n\n\t\treturn true;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/media/openal/OpenALBindings.cpp",
    "content": "#if defined (IPHONE) || defined (TVOS) || (defined (HX_MACOS) && !defined (LIME_OPENALSOFT))\n#include <OpenAL/al.h>\n#include <OpenAL/alc.h>\n#define LIME_OPENAL_DELETION_DELAY 600\n#include <time.h>\n#else\n#include \"AL/al.h\"\n#include \"AL/alc.h\"\n#ifdef LIME_OPENALSOFT\n// TODO: Can we support EFX on macOS?\n#include \"AL/alext.h\"\n#endif\n#endif\n\n#include <system/CFFI.h>\n#include <system/CFFIPointer.h>\n#include <system/Mutex.h>\n#include <utils/ArrayBufferView.h>\n#include <list>\n#include <map>\n\n\nnamespace lime {\n\n\n\t#ifdef LIME_OPENAL_DELETION_DELAY\n\tstd::list<ALuint> alDeletedBuffer;\n\tstd::list<time_t> alDeletedBufferTime;\n\tstd::list<ALuint> alDeletedSource;\n\tstd::list<time_t> alDeletedSourceTime;\n\t#endif\n\n\tstd::map<ALuint, void*> alObjects;\n\tstd::map<void*, void*> alcObjects;\n\tMutex al_gc_mutex;\n\n\n\t#ifdef LIME_OPENALSOFT\n\tvoid lime_al_delete_auxiliary_effect_slot (value aux);\n\tHL_PRIM void HL_NAME(hl_al_delete_auxiliary_effect_slot) (HL_CFFIPointer* aux);\n\t#endif\n\tvoid lime_al_delete_buffer (value buffer);\n\tvoid lime_al_delete_source (value source);\n\tHL_PRIM void HL_NAME(hl_al_delete_buffer) (HL_CFFIPointer* buffer);\n\tHL_PRIM void HL_NAME(hl_al_delete_source) (HL_CFFIPointer* source);\n\t#ifdef LIME_OPENALSOFT\n\tvoid lime_al_delete_effect (value effect);\n\tvoid lime_al_delete_filter (value filter);\n\tHL_PRIM void HL_NAME(hl_al_delete_effect) (HL_CFFIPointer* effect);\n\tHL_PRIM void HL_NAME(hl_al_delete_filter) (HL_CFFIPointer* filter);\n\t#endif\n\n\n\tvoid gc_al_buffer (value buffer) {\n\n\t\tlime_al_delete_buffer (buffer);\n\n\t}\n\n\n\tvoid hl_gc_al_buffer (HL_CFFIPointer* buffer) {\n\n\t\tlime_hl_al_delete_buffer (buffer);\n\n\t}\n\n\n\t#ifdef LIME_OPENALSOFT\n\tvoid gc_al_auxiliary_effect_slot (value aux) {\n\n\t\tlime_al_delete_auxiliary_effect_slot (aux);\n\n\t}\n\n\n\tvoid hl_gc_al_auxiliary_effect_slot (HL_CFFIPointer* aux) {\n\n\t\tlime_hl_al_delete_auxiliary_effect_slot (aux);\n\n\t}\n\t#endif\n\n\n\tvoid gc_al_source (value source) {\n\n\t\tlime_al_delete_source (source);\n\n\t}\n\n\n\tvoid hl_gc_al_source (HL_CFFIPointer* source) {\n\n\t\tlime_hl_al_delete_source (source);\n\n\t}\n\n\n\t#ifdef LIME_OPENALSOFT\n\tvoid gc_al_effect (value effect) {\n\n\t\tlime_al_delete_effect (effect);\n\n\t}\n\n\n\tvoid hl_gc_al_effect (HL_CFFIPointer* effect) {\n\n\t\tlime_hl_al_delete_effect (effect);\n\n\t}\n\n\n\tvoid gc_al_filter (value filter) {\n\n\t\tlime_al_delete_filter (filter);\n\n\t}\n\n\n\tvoid hl_gc_al_filter (HL_CFFIPointer* filter) {\n\n\t\tlime_hl_al_delete_filter (filter);\n\n\t}\n\t#endif\n\n\n\tvoid gc_alc_object (value object) {\n\n\t\tal_gc_mutex.Lock ();\n\t\talcObjects.erase (val_data (object));\n\t\tal_gc_mutex.Unlock ();\n\n\t}\n\n\n\tvoid hl_gc_alc_object (HL_CFFIPointer* object) {\n\n\t\tal_gc_mutex.Lock ();\n\t\talcObjects.erase (object->ptr);\n\t\tal_gc_mutex.Unlock ();\n\n\t}\n\n\t/*This has been removed after updating to openal 1.20.0+ since the cleanup functions involved\n\t* lead to deadlocking. See https://github.com/openfl/lime/issues/1803 for more info.\n\t* Developers should use lime.system.System.exit() instead of Sys.exit() to clean up any system\n\t* resources\n\t*/\n\t/*\n\tvoid lime_al_atexit () {\n\n\t\tALCcontext* alcContext = alcGetCurrentContext ();\n\n\t\tif (alcContext) {\n\n\t\t\tALCdevice* alcDevice = alcGetContextsDevice (alcContext);\n\n\t\t\talcMakeContextCurrent (0);\n\t\t\talcDestroyContext (alcContext);\n\n\t\t\tif (alcDevice) {\n\n\t\t\t\talcCloseDevice (alcDevice);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t*/\n\n\tvoid lime_al_auxf (value aux, int param, float value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (aux);\n\t\talAuxiliaryEffectSlotf (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_auxf) (HL_CFFIPointer* aux, int param, float value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)aux->ptr;\n\t\talAuxiliaryEffectSlotf (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_auxfv (value aux, int param, value values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (aux);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALfloat *data = new ALfloat[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALfloat)val_float (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talAuxiliaryEffectSlotfv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_auxfv) (HL_CFFIPointer* aux, int param, varray* values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)aux->ptr;\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talAuxiliaryEffectSlotfv (id, param, hl_aptr (values, float));\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_auxi (value aux, int param, value val) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (aux);\n\t\tALuint data;\n\n\t\tif (param == AL_EFFECTSLOT_EFFECT) {\n\n\t\t\tdata = (ALuint)(uintptr_t)val_data (val);\n\n\t\t} else {\n\n\t\t\tdata = val_int (val);\n\n\t\t}\n\n\t\talAuxiliaryEffectSloti (id, param, data);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_auxi) (HL_CFFIPointer* aux, int param, vdynamic* val) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)aux->ptr;\n\t\tALuint data;\n\n\t\tif (param == AL_EFFECTSLOT_EFFECT) {\n\n\t\t\tdata = (ALuint)(uintptr_t)((HL_CFFIPointer*)val)->ptr;\n\n\t\t} else {\n\n\t\t\tdata = val->v.i;\n\n\t\t}\n\n\t\talAuxiliaryEffectSloti (id, param, data);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_auxiv (value aux, int param, value values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (aux);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALint* data = new ALint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALint)val_int (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talAuxiliaryEffectSlotiv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_auxiv) (HL_CFFIPointer* aux, int param, varray* values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)aux->ptr;\n\n\t\tif (values) {\n\n\t\t\talAuxiliaryEffectSlotiv (id, param, hl_aptr (values, int));\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_buffer_data (value buffer, int format, value data, int size, int freq) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tArrayBufferView bufferView (data);\n\t\talBufferData (id, format, bufferView.buffer->b, size, freq);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_buffer_data) (HL_CFFIPointer* buffer, int format, ArrayBufferView* data, int size, int freq) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\talBufferData (id, format, data->buffer->b, size, freq);\n\n\t}\n\n\n\tvoid lime_al_buffer3f (value buffer, int param, float value1, float value2, float value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\talBuffer3f (id, param, value1, value2, value3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_buffer3f) (HL_CFFIPointer* buffer, int param, float value1, float value2, float value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\talBuffer3f (id, param, value1, value2, value3);\n\n\t}\n\n\n\tvoid lime_al_buffer3i (value buffer, int param, int value1, int value2, int value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\talBuffer3i (id, param, value1, value2, value3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_buffer3i) (HL_CFFIPointer* buffer, int param, int value1, int value2, int value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\talBuffer3i (id, param, value1, value2, value3);\n\n\t}\n\n\n\tvoid lime_al_bufferf (value buffer, int param, float value) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\talBufferf (id, param, value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_bufferf) (HL_CFFIPointer* buffer, int param, float value) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\talBufferf (id, param, value);\n\n\t}\n\n\n\tvoid lime_al_bufferfv (value buffer, int param, value values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALfloat *data = new ALfloat[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALfloat)val_float (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talBufferfv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_bufferfv) (HL_CFFIPointer* buffer, int param, varray* values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talBufferfv (id, param, hl_aptr (values, float));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_bufferi (value buffer, int param, int value) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\talBufferi (id, param, value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_bufferi) (HL_CFFIPointer* buffer, int param, int value) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\talBufferi (id, param, value);\n\n\t}\n\n\n\tvoid lime_al_bufferiv (value buffer, int param, value values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALint* data = new ALint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALint)val_int (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talBufferiv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_bufferiv) (HL_CFFIPointer* buffer, int param, varray* values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\n\t\tif (values) {\n\n\t\t\talBufferiv (id, param, hl_aptr (values, int));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_cleanup () {\n\n\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\ttime_t currentTime = time (0);\n\t\tALuint deletedData;\n\t\ttime_t deletedTime;\n\n\t\tstd::list<ALuint>::const_iterator itSource = alDeletedSource.begin ();\n\t\tstd::list<time_t>::const_iterator itSourceTime = alDeletedSourceTime.begin ();\n\n\t\twhile (itSource != alDeletedSource.end ()) {\n\n\t\t\tdeletedTime = *itSourceTime;\n\n\t\t\tif (difftime (currentTime, deletedTime) * 1000 > LIME_OPENAL_DELETION_DELAY) {\n\n\t\t\t\tALuint deletedData = *itSource;\n\t\t\t\talDeleteSources (1, &deletedData);\n\t\t\t\titSource = alDeletedSource.erase (itSource);\n\t\t\t\titSourceTime = alDeletedSourceTime.erase (itSourceTime);\n\n\t\t\t} else {\n\n\t\t\t\t++itSource;\n\t\t\t\t++itSourceTime;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstd::list<ALuint>::iterator itBuffer = alDeletedBuffer.begin ();\n\t\tstd::list<time_t>::iterator itBufferTime = alDeletedBufferTime.begin ();\n\n\t\twhile (itBuffer != alDeletedBuffer.end ()) {\n\n\t\t\tdeletedTime = *itBufferTime;\n\n\t\t\tif (difftime (currentTime, deletedTime) * 1000 > LIME_OPENAL_DELETION_DELAY) {\n\n\t\t\t\tALuint deletedData = *itBuffer;\n\t\t\t\talDeleteBuffers (1, &deletedData);\n\t\t\t\titBuffer = alDeletedBuffer.erase (itBuffer);\n\t\t\t\titBufferTime = alDeletedBufferTime.erase (itBufferTime);\n\n\t\t\t} else {\n\n\t\t\t\t++itBuffer;\n\t\t\t\t++itBufferTime;\n\n\t\t\t}\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_cleanup) () {\n\n\t\tlime_al_cleanup ();\n\n\t}\n\n\n\tvoid lime_al_delete_auxiliary_effect_slot (value aux) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (!val_is_null (aux)) {\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tALuint data = (ALuint)(uintptr_t)val_data (aux);\n\t\t\tval_gc (aux, 0);\n\t\t\talDeleteAuxiliaryEffectSlots ((ALuint)1, &data);\n\t\t\talObjects.erase (data);\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_auxiliary_effect_slot) (HL_CFFIPointer* aux) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (aux) {\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tALuint data = (ALuint)(uintptr_t)aux->ptr;\n\t\t\taux->finalizer = 0;\n\t\t\talDeleteAuxiliaryEffectSlots ((ALuint)1, &data);\n\t\t\talObjects.erase (data);\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_delete_buffer (value buffer) {\n\n\t\tif (!val_is_null (buffer)) {\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tALuint data = (ALuint)(uintptr_t)val_data (buffer);\n\t\t\tval_gc (buffer, 0);\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\talDeletedBuffer.push_back (data);\n\t\t\talDeletedBufferTime.push_back (time (0));\n\t\t\t#else\n\t\t\talDeleteBuffers ((ALuint)1, &data);\n\t\t\t#endif\n\t\t\talObjects.erase (data);\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_buffer) (HL_CFFIPointer* buffer) {\n\n\t\tif (buffer) {\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tALuint data = (ALuint)(uintptr_t)buffer->ptr;\n\t\t\tbuffer->finalizer = 0;\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\talDeletedBuffer.push_back (data);\n\t\t\talDeletedBufferTime.push_back (time (0));\n\t\t\t#else\n\t\t\talDeleteBuffers ((ALuint)1, &data);\n\t\t\t#endif\n\t\t\talObjects.erase (data);\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_delete_buffers (int n, value buffers) {\n\n\t\tif (!val_is_null (buffers)) {\n\n\t\t\tint size = val_array_size (buffers);\n\t\t\tvalue buffer;\n\n\t\t\tal_gc_mutex.Lock ();\n\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\tALuint data;\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tbuffer = val_array_i (buffers, i);\n\t\t\t\tdata = (ALuint)(uintptr_t)val_data (buffer);\n\t\t\t\talDeletedBuffer.push_back (data);\n\t\t\t\talDeletedBufferTime.push_back (time (0));\n\t\t\t\tval_gc (buffer, 0);\n\t\t\t\talObjects.erase (data);\n\n\t\t\t}\n\n\t\t\t#else\n\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tbuffer = val_array_i (buffers, i);\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (buffer);\n\t\t\t\tval_gc (buffer, 0);\n\t\t\t\talObjects.erase (data[i]);\n\n\t\t\t}\n\n\t\t\talDeleteBuffers (n, data);\n\t\t\tdelete[] data;\n\t\t\t#endif\n\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_buffers) (int n, varray* buffers) {\n\n\t\tif (buffers) {\n\n\t\t\tint size = buffers->size;\n\t\t\tHL_CFFIPointer** bufferData = hl_aptr (buffers, HL_CFFIPointer*);\n\t\t\tHL_CFFIPointer* buffer;\n\n\t\t\tal_gc_mutex.Lock ();\n\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\tALuint data;\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tbuffer = *bufferData++;\n\t\t\t\tdata = (ALuint)(uintptr_t)buffer->ptr;\n\t\t\t\talDeletedBuffer.push_back (data);\n\t\t\t\talDeletedBufferTime.push_back (time (0));\n\t\t\t\tbuffer->finalizer = 0;\n\t\t\t\talObjects.erase (data);\n\n\t\t\t}\n\n\t\t\t#else\n\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tbuffer = *bufferData++;\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)buffer->ptr;\n\t\t\t\tbuffer->finalizer = 0;\n\t\t\t\talObjects.erase (data[i]);\n\n\t\t\t}\n\n\t\t\talDeleteBuffers (n, data);\n\t\t\tdelete[] data;\n\t\t\t#endif\n\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_delete_effect (value effect) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (!val_is_null (effect)) {\n\n\t\t\tALuint data = (ALuint)(uintptr_t)val_data (effect);\n\t\t\talDeleteEffects (1, &data);\n\t\t\tval_gc (effect, 0);\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_effect) (HL_CFFIPointer* effect) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (effect) {\n\n\t\t\tALuint data = (ALuint)(uintptr_t)effect->ptr;\n\t\t\talDeleteEffects (1, &data);\n\t\t\teffect->finalizer = 0;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_delete_filter (value filter) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (!val_is_null (filter)) {\n\n\t\t\tALuint data = (ALuint)(uintptr_t)val_data (filter);\n\t\t\talDeleteFilters (1, &data);\n\t\t\tval_gc (filter, 0);\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_filter) (HL_CFFIPointer* filter) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (filter) {\n\n\t\t\tALuint data = (ALuint)(uintptr_t)filter->ptr;\n\t\t\talDeleteFilters (1, &data);\n\t\t\tfilter->finalizer = 0;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_delete_source (value source) {\n\n\t\tif (!val_is_null (source)) {\n\n\t\t\tALuint data = (ALuint)(uintptr_t)val_data (source);\n\t\t\tval_gc (source, 0);\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\tal_gc_mutex.Lock ();\n\t\t\talSourcei (data, AL_BUFFER, 0);\n\t\t\talDeletedSource.push_back (data);\n\t\t\talDeletedSourceTime.push_back (time (0));\n\t\t\tal_gc_mutex.Unlock ();\n\t\t\t#else\n\t\t\talDeleteSources (1, &data);\n\t\t\t#endif\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_source) (HL_CFFIPointer* source) {\n\n\t\tif (source) {\n\n\t\t\tALuint data = (ALuint)(uintptr_t)source->ptr;\n\t\t\tsource->finalizer = 0;\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\tal_gc_mutex.Lock ();\n\t\t\talSourcei (data, AL_BUFFER, 0);\n\t\t\talDeletedSource.push_back (data);\n\t\t\talDeletedSourceTime.push_back (time (0));\n\t\t\tal_gc_mutex.Unlock ();\n\t\t\t#else\n\t\t\talDeleteSources (1, &data);\n\t\t\t#endif\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_delete_sources (int n, value sources) {\n\n\t\tif (!val_is_null (sources)) {\n\n\t\t\tint size = val_array_size (sources);\n\t\t\tvalue source;\n\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tALuint data;\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tsource = val_array_i (sources, i);\n\t\t\t\tdata = (ALuint)(uintptr_t)val_data (source);\n\t\t\t\talSourcei (data, AL_BUFFER, 0);\n\t\t\t\talDeletedSource.push_back (data);\n\t\t\t\talDeletedSourceTime.push_back (time (0));\n\t\t\t\tval_gc (source, 0);\n\n\t\t\t}\n\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t\t#else\n\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tsource = val_array_i (sources, i);\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (source);\n\t\t\t\tval_gc (source, 0);\n\n\t\t\t}\n\n\t\t\talDeleteSources (n, data);\n\t\t\tdelete[] data;\n\t\t\t#endif\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_delete_sources) (int n, varray* sources) {\n\n\t\tif (sources) {\n\n\t\t\tint size = sources->size;\n\t\t\tHL_CFFIPointer** sourceData = hl_aptr (sources, HL_CFFIPointer*);\n\t\t\tHL_CFFIPointer* source;\n\n\t\t\t#ifdef LIME_OPENAL_DELETION_DELAY\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tALuint data;\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tsource = *sourceData++;\n\t\t\t\tdata = (ALuint)(uintptr_t)source->ptr;\n\t\t\t\talSourcei (data, AL_BUFFER, 0);\n\t\t\t\talDeletedSource.push_back (data);\n\t\t\t\talDeletedSourceTime.push_back (time (0));\n\t\t\t\tsource->finalizer = 0;\n\n\t\t\t}\n\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t\t#else\n\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tsource = *sourceData++;\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)source->ptr;\n\t\t\t\tsource->finalizer = 0;\n\n\t\t\t}\n\n\t\t\talDeleteSources (n, data);\n\t\t\tdelete[] data;\n\t\t\t#endif\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_disable (int capability) {\n\n\t\talDisable (capability);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_disable) (int capability) {\n\n\t\talDisable (capability);\n\n\t}\n\n\n\tvoid lime_al_distance_model (int distanceModel) {\n\n\t\talDistanceModel (distanceModel);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_distance_model) (int distanceModel) {\n\n\t\talDistanceModel (distanceModel);\n\n\t}\n\n\n\tvoid lime_al_doppler_factor (float factor) {\n\n\t\talDopplerFactor (factor);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_doppler_factor) (float factor) {\n\n\t\talDopplerFactor (factor);\n\n\t}\n\n\n\tvoid lime_al_doppler_velocity (float velocity) {\n\n\t\talDopplerVelocity (velocity);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_doppler_velocity) (float velocity) {\n\n\t\talDopplerVelocity (velocity);\n\n\t}\n\n\n\tvoid lime_al_effectf (value effect, int param, float value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (effect);\n\t\talEffectf (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_effectf) (HL_CFFIPointer* effect, int param, float value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)effect->ptr;\n\t\talEffectf (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_effectfv (value effect, int param, value values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (effect);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALfloat *data = new ALfloat[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALfloat)val_float (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talEffectfv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_effectfv) (HL_CFFIPointer* effect, int param, varray* values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)effect->ptr;\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talEffectfv (id, param, hl_aptr (values, float));\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_effecti (value effect, int param, int value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (effect);\n\t\talEffecti (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_effecti) (HL_CFFIPointer* effect, int param, int value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)effect->ptr;\n\t\talEffecti (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_effectiv (value effect, int param, value values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (effect);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALint* data = new ALint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALint)val_int (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talEffectiv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_effectiv) (HL_CFFIPointer* effect, int param, varray* values) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)effect->ptr;\n\n\t\tif (values) {\n\n\t\t\talEffectiv (id, param, hl_aptr (values, int));\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_enable (int capability) {\n\n\t\talEnable (capability);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_enable) (int capability) {\n\n\t\talEnable (capability);\n\n\t}\n\n\n\tvoid lime_al_filteri (value filter, int param, value val) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (filter);\n\t\tALuint data;\n\n\t\tdata = val_int (val);\n\n\t\talFilteri (id, param, data);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_filteri) (HL_CFFIPointer* filter, int param, int val) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)filter->ptr;\n\t\tALuint data;\n\n\t\tdata = val;\n\n\t\talFilteri (id, param, data);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_filterf (value filter, int param, float value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (filter);\n\t\talFilterf (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_filterf) (HL_CFFIPointer* filter, int param, float value) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)filter->ptr;\n\t\talFilterf (id, param, value);\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_al_gen_aux () {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint aux;\n\t\talGenAuxiliaryEffectSlots ((ALuint)1, &aux);\n\t\treturn CFFIPointer ((void*)(uintptr_t)aux, gc_al_auxiliary_effect_slot);\n\t\t#else\n\t\treturn alloc_null ();\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_al_gen_aux) () {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint aux;\n\t\talGenAuxiliaryEffectSlots ((ALuint)1, &aux);\n\t\treturn HLCFFIPointer ((void*)(uintptr_t)aux, (hl_finalizer)hl_gc_al_auxiliary_effect_slot);\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tvalue lime_al_gen_buffer () {\n\n\t\talGetError ();\n\n\t\tALuint buffer = 0;\n\t\talGenBuffers ((ALuint)1, &buffer);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tvalue ptr = CFFIPointer ((void*)(uintptr_t)buffer, gc_al_buffer);\n\t\t\talObjects[buffer] = ptr;\n\t\t\tal_gc_mutex.Unlock ();\n\t\t\treturn ptr;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_al_gen_buffer) () {\n\n\t\talGetError ();\n\n\t\tALuint buffer = 0;\n\t\talGenBuffers ((ALuint)1, &buffer);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tHL_CFFIPointer* ptr = HLCFFIPointer ((void*)(uintptr_t)buffer, (hl_finalizer)hl_gc_al_buffer);\n\t\t\talObjects[buffer] = ptr;\n\t\t\tal_gc_mutex.Unlock ();\n\t\t\treturn ptr;\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_al_gen_buffers (int n) {\n\n\t\talGetError ();\n\n\t\tALuint* buffers = new ALuint[n];\n\t\talGenBuffers (n, buffers);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\tvalue result = alloc_array (n);\n\n\t\t\tALuint buffer;\n\t\t\tvalue ptr;\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tfor (int i = 0; i < n; i++) {\n\n\t\t\t\tbuffer = buffers[i];\n\t\t\t\tptr = CFFIPointer ((void*)(uintptr_t)buffer, gc_al_buffer);\n\t\t\t\talObjects[buffer] = ptr;\n\n\t\t\t\tval_array_set_i (result, i, ptr);\n\n\t\t\t}\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t\tdelete[] buffers;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\tdelete[] buffers;\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_gen_buffers) (int n) {\n\n\t\talGetError ();\n\n\t\tALuint* buffers = new ALuint[n];\n\t\talGenBuffers (n, buffers);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\tvarray* result = hl_alloc_array (&hlt_dyn, n);\n\t\t\tHL_CFFIPointer** resultData = hl_aptr (result, HL_CFFIPointer*);\n\n\t\t\tALuint buffer;\n\t\t\tHL_CFFIPointer* ptr;\n\n\t\t\tal_gc_mutex.Lock ();\n\t\t\tfor (int i = 0; i < n; i++) {\n\n\t\t\t\tbuffer = buffers[i];\n\t\t\t\tptr = HLCFFIPointer ((void*)(uintptr_t)buffer, (hl_finalizer)hl_gc_al_buffer);\n\t\t\t\talObjects[buffer] = ptr;\n\t\t\t\t*resultData++ = ptr;\n\n\t\t\t}\n\t\t\tal_gc_mutex.Unlock ();\n\n\t\t\tdelete[] buffers;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\tdelete[] buffers;\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_al_gen_effect () {\n\n\t\talGetError ();\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint effect;\n\t\talGenEffects ((ALuint)1, &effect);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\treturn CFFIPointer ((void*)(uintptr_t)effect, gc_al_effect);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_al_gen_effect) () {\n\n\t\talGetError ();\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint effect;\n\t\talGenEffects ((ALuint)1, &effect);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\treturn HLCFFIPointer ((void*)(uintptr_t)effect, (hl_finalizer)hl_gc_al_effect);\n\n\t\t}\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_al_gen_filter () {\n\n\t\talGetError ();\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint filter;\n\t\talGenFilters ((ALuint)1, &filter);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\treturn CFFIPointer ((void*)(uintptr_t)filter, gc_al_filter);\n\n\t\t}\n\t\t#endif\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_al_gen_filter) () {\n\n\t\talGetError ();\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint filter;\n\t\talGenFilters ((ALuint)1, &filter);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\treturn HLCFFIPointer ((void*)(uintptr_t)filter, (hl_finalizer)hl_gc_al_filter);\n\n\t\t}\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_al_gen_source () {\n\n\t\talGetError ();\n\n\t\tALuint source;\n\t\talGenSources ((ALuint)1, &source);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\treturn CFFIPointer ((void*)(uintptr_t)source, gc_al_source);\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_al_gen_source) () {\n\n\t\talGetError ();\n\n\t\tALuint source;\n\t\talGenSources ((ALuint)1, &source);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\treturn HLCFFIPointer ((void*)(uintptr_t)source, (hl_finalizer)hl_gc_al_source);\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_al_gen_sources (int n) {\n\n\t\talGetError ();\n\n\t\tALuint* sources = new ALuint[n];\n\t\talGenSources (n, sources);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\tvalue result = alloc_array (n);\n\n\t\t\tfor (int i = 0; i < n; i++) {\n\n\t\t\t\tval_array_set_i (result, i, CFFIPointer ((void*)(uintptr_t)sources[i], gc_al_source));\n\n\t\t\t}\n\n\t\t\tdelete[] sources;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\tdelete[] sources;\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_gen_sources) (int n) {\n\n\t\talGetError ();\n\n\t\tALuint* sources = new ALuint[n];\n\t\talGenSources (n, sources);\n\n\t\tif (alGetError () == AL_NO_ERROR) {\n\n\t\t\tvarray* result = hl_alloc_array (&hlt_dyn, n);\n\t\t\tHL_CFFIPointer** resultData = hl_aptr (result, HL_CFFIPointer*);\n\n\t\t\tfor (int i = 0; i < n; i++) {\n\n\t\t\t\t*resultData++ = HLCFFIPointer ((void*)(uintptr_t)sources[i], (hl_finalizer)hl_gc_al_source);\n\n\t\t\t}\n\n\t\t\tdelete[] sources;\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\tdelete[] sources;\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tbool lime_al_get_boolean (int param) {\n\n\t\treturn alGetBoolean (param);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_get_boolean) (int param) {\n\n\t\treturn alGetBoolean (param);\n\n\t}\n\n\n\tvalue lime_al_get_booleanv (int param, int count) {\n\n\t\tALboolean* values = new ALboolean[count];\n\t\talGetBooleanv (param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_bool (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_booleanv) (int param, int count) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_bool, count);\n\t\talGetBooleanv (param, (ALboolean*)hl_aptr (result, bool));\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_buffer3f (value buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tALfloat val1, val2, val3;\n\n\t\talGetBuffer3f (id, param, &val1, &val2, &val3);\n\n\t\tvalue result = alloc_array (3);\n\t\tval_array_set_i (result, 0, alloc_float (val1));\n\t\tval_array_set_i (result, 1, alloc_float (val2));\n\t\tval_array_set_i (result, 2, alloc_float (val3));\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_buffer3f) (HL_CFFIPointer* buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_f32, 3);\n\t\talGetBuffer3f (id, param, &hl_aptr (result, float)[0], &hl_aptr (result, float)[1], &hl_aptr (result, float)[2]);\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_buffer3i (value buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tALint val1, val2, val3;\n\n\t\talGetBuffer3i (id, param, &val1, &val2, &val3);\n\n\t\tvalue result = alloc_array (3);\n\t\tval_array_set_i (result, 0, alloc_int (val1));\n\t\tval_array_set_i (result, 1, alloc_int (val2));\n\t\tval_array_set_i (result, 2, alloc_int (val3));\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_buffer3i) (HL_CFFIPointer* buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_i32, 3);\n\n\t\talGetBuffer3i (id, param, &hl_aptr (result, int)[0], &hl_aptr (result, int)[2], &hl_aptr (result, int)[3]);\n\t\treturn result;\n\n\t}\n\n\n\tfloat lime_al_get_bufferf (value buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tALfloat data;\n\t\talGetBufferf (id, param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_al_get_bufferf) (HL_CFFIPointer* buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\tALfloat data;\n\t\talGetBufferf (id, param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tvalue lime_al_get_bufferfv (value buffer, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tALfloat* values = new ALfloat[count];\n\t\talGetBufferfv (id, param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; ++i) {\n\n\t\t\tval_array_set_i (result, i, alloc_float (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_bufferfv) (HL_CFFIPointer* buffer, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_f32, count);\n\t\talGetBufferfv (id, param, hl_aptr (result, float));\n\t\treturn result;\n\n\t}\n\n\n\tint lime_al_get_bufferi (value buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tALint data;\n\t\talGetBufferi (id, param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_al_get_bufferi) (HL_CFFIPointer* buffer, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\tALint data;\n\t\talGetBufferi (id, param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tvalue lime_al_get_bufferiv (value buffer, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\tALint* values = new ALint[count];\n\t\talGetBufferiv (id, param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_int (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_bufferiv) (HL_CFFIPointer* buffer, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_i32, count);\n\t\talGetBufferiv (id, param, hl_aptr (result, int));\n\t\treturn result;\n\n\t}\n\n\n\tdouble lime_al_get_double (int param) {\n\n\t\treturn alGetDouble (param);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_al_get_double) (int param) {\n\n\t\treturn alGetDouble (param);\n\n\t}\n\n\n\tvalue lime_al_get_doublev (int param, int count) {\n\n\t\tALdouble* values = new ALdouble[count];\n\t\talGetDoublev (param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_float (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_doublev) (int param, int count) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_f64, count);\n\t\talGetDoublev (param, hl_aptr (result, double));\n\t\treturn result;\n\n\t}\n\n\n\tint lime_al_get_enum_value (HxString ename) {\n\n\t\treturn alGetEnumValue (ename.__s);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_al_get_enum_value) (hl_vstring* ename) {\n\n\t\treturn alGetEnumValue (ename ? hl_to_utf8 (ename->bytes) : NULL);\n\n\t}\n\n\n\tint lime_al_get_error () {\n\n\t\treturn alGetError ();\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_al_get_error) () {\n\n\t\treturn alGetError ();\n\n\t}\n\n\n\tint lime_al_get_filteri (value filter, int param) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (filter);\n\t\tALint data;\n\t\talGetFilteri (id, param, &data);\n\t\treturn data;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_al_get_filteri) (HL_CFFIPointer* filter, int param) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)filter->ptr;\n\t\tALint data;\n\t\talGetFilteri (id, param, &data);\n\t\treturn data;\n\t\t#else\n\t\treturn 0;\n\t\t#endif\n\n\t}\n\n\n\tfloat lime_al_get_float (int param) {\n\n\t\treturn alGetFloat (param);\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_al_get_float) (int param) {\n\n\t\treturn alGetFloat (param);\n\n\t}\n\n\n\tvalue lime_al_get_floatv (int param, int count) {\n\n\t\tALfloat* values = new ALfloat[count];\n\t\talGetFloatv (param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_float (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_floatv) (int param, int count) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_f32, count);\n\t\talGetFloatv (param, hl_aptr (result, float));\n\t\treturn result;\n\n\t}\n\n\n\tint lime_al_get_integer (int param) {\n\n\t\treturn alGetInteger (param);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_al_get_integer) (int param) {\n\n\t\treturn alGetInteger (param);\n\n\t}\n\n\n\tvalue lime_al_get_integerv (int param, int count) {\n\n\t\tALint* values = new ALint[count];\n\t\talGetIntegerv (param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_int (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_integerv) (int param, int count) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_i32, count);\n\t\talGetIntegerv (param, hl_aptr (result, int));\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_listener3f (int param) {\n\n\t\tALfloat val1, val2, val3;\n\n\t\talGetListener3f (param, &val1, &val2, &val3);\n\n\t\tvalue result = alloc_array (3);\n\t\tval_array_set_i (result, 0, alloc_float (val1));\n\t\tval_array_set_i (result, 1, alloc_float (val2));\n\t\tval_array_set_i (result, 2, alloc_float (val3));\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_listener3f) (int param) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_f32, 3);\n\t\talGetListener3f (param, &hl_aptr (result, float)[0], &hl_aptr (result, float)[2], &hl_aptr (result, float)[3]);\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_listener3i (int param) {\n\n\t\tALint val1, val2, val3;\n\n\t\talGetListener3i (param, &val1, &val2, &val3);\n\n\t\tvalue result = alloc_array (3);\n\t\tval_array_set_i (result, 0, alloc_int (val1));\n\t\tval_array_set_i (result, 1, alloc_int (val2));\n\t\tval_array_set_i (result, 2, alloc_int (val3));\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_listener3i) (int param) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_i32, 3);\n\t\talGetListener3i (param, &hl_aptr (result, int)[0], &hl_aptr (result, int)[2], &hl_aptr (result, int)[3]);\n\t\treturn result;\n\n\t}\n\n\n\tfloat lime_al_get_listenerf (int param) {\n\n\t\tALfloat data;\n\t\talGetListenerf (param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_al_get_listenerf) (int param) {\n\n\t\tALfloat data;\n\t\talGetListenerf (param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tvalue lime_al_get_listenerfv (int param, int count) {\n\n\t\tALfloat* values = new ALfloat[count];\n\t\talGetListenerfv (param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_float (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_listenerfv) (int param, int count) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_f32, count);\n\t\talGetListenerfv (param, hl_aptr (result, float));\n\t\treturn result;\n\n\t}\n\n\n\tint lime_al_get_listeneri (int param) {\n\n\t\tALint data;\n\t\talGetListeneri (param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_al_get_listeneri) (int param) {\n\n\t\tALint data;\n\t\talGetListeneri (param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tvalue lime_al_get_listeneriv (int param, int count) {\n\n\t\tALint* values = new ALint[count];\n\t\talGetListeneriv (param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_int (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_listeneriv) (int param, int count) {\n\n\t\tvarray* result = hl_alloc_array (&hlt_i32, count);\n\t\talGetListeneriv (param, hl_aptr (result, int));\n\t\treturn result;\n\n\t}\n\n\n\tdouble lime_al_get_proc_address (HxString fname) {\n\n\t\treturn (uintptr_t)alGetProcAddress (fname.__s);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_al_get_proc_address) (hl_vstring* fname) {\n\n\t\treturn (uintptr_t)alGetProcAddress (fname ? hl_to_utf8 (fname->bytes) : NULL);\n\n\t}\n\n\n\tvalue lime_al_get_source3f (value source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALfloat val1, val2, val3;\n\n\t\talGetSource3f (id, param, &val1, &val2, &val3);\n\n\t\tvalue result = alloc_array (3);\n\t\tval_array_set_i (result, 0, alloc_float (val1));\n\t\tval_array_set_i (result, 1, alloc_float (val2));\n\t\tval_array_set_i (result, 2, alloc_float (val3));\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_source3f) (HL_CFFIPointer* source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_f32, 3);\n\t\talGetSource3f (id, param, &hl_aptr (result, float)[0], &hl_aptr (result, float)[2], &hl_aptr (result, float)[3]);\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_source3i (value source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALint val1, val2, val3;\n\n\t\talGetSource3i (id, param, &val1, &val2, &val3);\n\n\t\tvalue result = alloc_array (3);\n\t\tval_array_set_i (result, 1, alloc_int (val1));\n\t\tval_array_set_i (result, 2, alloc_int (val2));\n\t\tval_array_set_i (result, 3, alloc_int (val3));\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_source3i) (HL_CFFIPointer* source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_i32, 3);\n\t\talGetSource3i (id, param, &hl_aptr (result, int)[0], &hl_aptr (result, int)[2], &hl_aptr (result, int)[3]);\n\t\treturn result;\n\n\t}\n\n\n\tfloat lime_al_get_sourcef (value source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALfloat data;\n\t\talGetSourcef (id, param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tHL_PRIM float HL_NAME(hl_al_get_sourcef) (HL_CFFIPointer* source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tALfloat data;\n\t\talGetSourcef (id, param, &data);\n\t\treturn data;\n\n\t}\n\n\n\tvalue lime_al_get_sourcefv (value source, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALfloat* values = new ALfloat[count];\n\t\talGetSourcefv (id, param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_float (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_sourcefv) (HL_CFFIPointer* source, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_f32, count);\n\t\talGetSourcefv (id, param, hl_aptr (result, float));\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_sourcei (value source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALint data;\n\t\talGetSourcei (id, param, &data);\n\n\t\tif (param == AL_BUFFER) {\n\n\t\t\tif (alObjects.count (data) > 0) {\n\n\t\t\t\treturn (value)alObjects[data];\n\n\t\t\t} else {\n\n\t\t\t\tal_gc_mutex.Lock ();\n\t\t\t\tvalue ptr = CFFIPointer ((void*)(uintptr_t)data, gc_al_buffer);\n\t\t\t\talObjects[data] = ptr;\n\t\t\t\tal_gc_mutex.Unlock ();\n\t\t\t\treturn ptr;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn alloc_int (data);\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_al_get_sourcei) (HL_CFFIPointer* source, int param) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tALint data;\n\t\talGetSourcei (id, param, &data);\n\n\t\tif (param == AL_BUFFER) {\n\n\t\t\tif (alObjects.count (data) > 0) {\n\n\t\t\t\treturn (vdynamic*)alObjects[data];\n\n\t\t\t} else {\n\n\t\t\t\tal_gc_mutex.Lock ();\n\t\t\t\tHL_CFFIPointer* ptr = HLCFFIPointer ((void*)(uintptr_t)data, (hl_finalizer)hl_gc_al_buffer);\n\t\t\t\talObjects[data] = ptr;\n\t\t\t\tal_gc_mutex.Unlock ();\n\t\t\t\treturn (vdynamic*)ptr;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvdynamic* result = hl_alloc_dynamic (&hlt_i32);\n\t\t\tresult->v.i = data;\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_al_get_sourceiv (value source, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALint* values = new ALint[count];\n\t\talGetSourceiv (id, param, values);\n\n\t\tvalue result = alloc_array (count);\n\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_int (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_get_sourceiv) (HL_CFFIPointer* source, int param, int count) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_i32, count);\n\t\talGetSourceiv (id, param, hl_aptr (result, int));\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_al_get_string (int param) {\n\n\t\tconst char* result = alGetString (param);\n\t\treturn result ? alloc_string (result) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_al_get_string) (int param) {\n\n\t\tconst char* result = alGetString (param);\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tbool lime_al_is_aux (value aux) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (aux);\n\t\treturn alIsAuxiliaryEffectSlot (id);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_aux) (HL_CFFIPointer* aux) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)aux->ptr;\n\t\treturn alIsAuxiliaryEffectSlot (id);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_al_is_buffer (value buffer) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (buffer);\n\t\treturn alIsBuffer (id);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_buffer) (HL_CFFIPointer* buffer) {\n\n\t\tALuint id = (ALuint)(uintptr_t)buffer->ptr;\n\t\treturn alIsBuffer (id);\n\n\t}\n\n\n\tbool lime_al_is_effect (value effect) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (effect);\n\t\treturn alIsEffect (id);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_effect) (HL_CFFIPointer* effect) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)effect->ptr;\n\t\treturn alIsEffect (id);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_al_is_enabled (int capability) {\n\n\t\treturn alIsEnabled (capability);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_enabled) (int capability) {\n\n\t\treturn alIsEnabled (capability);\n\n\t}\n\n\n\tbool lime_al_is_extension_present (HxString extname) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\treturn alIsExtensionPresent (extname.__s);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_extension_present) (hl_vstring* extname) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\treturn alIsExtensionPresent (extname ? hl_to_utf8 (extname->bytes) : NULL);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_al_is_filter (value filter) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (filter);\n\t\treturn alIsSource (id);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_filter) (HL_CFFIPointer* filter) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)filter->ptr;\n\t\treturn alIsSource (id);\n\t\t#else\n\t\treturn false;\n\t\t#endif\n\n\t}\n\n\n\tbool lime_al_is_source (value source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\treturn alIsSource (id);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_al_is_source) (HL_CFFIPointer* source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\treturn alIsSource (id);\n\n\t}\n\n\n\tvoid lime_al_listener3f (int param, float value1, float value2, float value3) {\n\n\t\talListener3f (param, value1, value2, value3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_listener3f) (int param, float value1, float value2, float value3) {\n\n\t\talListener3f (param, value1, value2, value3);\n\n\t}\n\n\n\tvoid lime_al_listener3i (int param, int value1, int value2, int value3) {\n\n\t\talListener3i (param, value1, value2, value3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_listener3i) (int param, int value1, int value2, int value3) {\n\n\t\talListener3i (param, value1, value2, value3);\n\n\t}\n\n\n\tvoid lime_al_listenerf (int param, float value1) {\n\n\t\talListenerf (param, value1);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_listenerf) (int param, float value1) {\n\n\t\talListenerf (param, value1);\n\n\t}\n\n\n\tvoid lime_al_listenerfv (int param, value values) {\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALfloat *data = new ALfloat[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALfloat)val_float (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talListenerfv (param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_listenerfv) (int param, varray* values) {\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talListenerfv (param, hl_aptr (values, float));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_listeneri (int param, int value1) {\n\n\t\talListeneri (param, value1);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_listeneri) (int param, int value1) {\n\n\t\talListeneri (param, value1);\n\n\t}\n\n\n\tvoid lime_al_listeneriv (int param, value values) {\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALint* data = new ALint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALint)val_int (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talListeneriv (param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_listeneriv) (int param, varray* values) {\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talListeneriv (param, hl_aptr (values, int));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_remove_direct_filter (value source) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSourcei (id, AL_DIRECT_FILTER, AL_FILTER_NULL);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_remove_direct_filter) (HL_CFFIPointer* source) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSourcei (id, AL_DIRECT_FILTER, AL_FILTER_NULL);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_remove_send (value source, int index) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSource3i (id, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, index, 0);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_remove_send) (HL_CFFIPointer* source, int index) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSource3i (id, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, index, 0);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_al_source_pause (value source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSourcePause (id);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_pause) (HL_CFFIPointer* source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSourcePause (id);\n\n\t}\n\n\n\tvoid lime_al_source_pausev (int n, value sources) {\n\n\t\tif (!val_is_null (sources)) {\n\n\t\t\tint size = val_array_size (sources);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (val_array_i (sources, i));\n\n\t\t\t}\n\n\t\t\talSourcePausev (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_pausev) (int n, varray* sources) {\n\n\t\tif (sources) {\n\n\t\t\tint size = sources->size;\n\t\t\tHL_CFFIPointer** sourcesData = hl_aptr (sources, HL_CFFIPointer*);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)(*sourcesData++)->ptr;\n\n\t\t\t}\n\n\t\t\talSourcePausev (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_source_play (value source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSourcePlay (id);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_play) (HL_CFFIPointer* source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSourcePlay (id);\n\n\t}\n\n\n\tvoid lime_al_source_playv (int n, value sources) {\n\n\t\tif (!val_is_null (sources)) {\n\n\t\t\tint size = val_array_size (sources);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (val_array_i (sources, i));\n\n\t\t\t}\n\n\t\t\talSourcePlayv (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_playv) (int n, varray* sources) {\n\n\t\tif (sources) {\n\n\t\t\tint size = sources->size;\n\t\t\tHL_CFFIPointer** sourcesData = hl_aptr (sources, HL_CFFIPointer*);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)(*sourcesData++)->ptr;\n\n\t\t\t}\n\n\t\t\talSourcePlayv (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_source_queue_buffers (value source, int nb, value buffers) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\n\t\tif (!val_is_null (buffers)) {\n\n\t\t\tint size = val_array_size (buffers);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (val_array_i (buffers, i));\n\n\t\t\t}\n\n\t\t\talSourceQueueBuffers (id, nb, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_queue_buffers) (HL_CFFIPointer* source, int nb, varray* buffers) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\n\t\tif (buffers) {\n\n\t\t\tint size = buffers->size;\n\t\t\tHL_CFFIPointer** buffersData = hl_aptr (buffers, HL_CFFIPointer*);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)(*buffersData++)->ptr;\n\n\t\t\t}\n\n\t\t\talSourceQueueBuffers (id, nb, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_source_rewind (value source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSourceRewind (id);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_rewind) (HL_CFFIPointer* source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSourceRewind (id);\n\n\t}\n\n\n\tvoid lime_al_source_rewindv (int n, value sources) {\n\n\t\tif (!val_is_null (sources)) {\n\n\t\t\tint size = val_array_size (sources);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (val_array_i (sources, i));\n\n\t\t\t}\n\n\t\t\talSourceRewindv (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_rewindv) (int n, varray* sources) {\n\n\t\tif (sources) {\n\n\t\t\tint size = sources->size;\n\t\t\tHL_CFFIPointer** sourcesData = hl_aptr (sources, HL_CFFIPointer*);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)(*sourcesData++)->ptr;\n\n\t\t\t}\n\n\t\t\talSourceRewindv (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_source_stop (value source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSourceStop (id);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_stop) (HL_CFFIPointer* source) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSourceStop (id);\n\n\t}\n\n\n\tvoid lime_al_source_stopv (int n, value sources) {\n\n\t\tif (!val_is_null (sources)) {\n\n\t\t\tint size = val_array_size (sources);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)val_data (val_array_i (sources, i));\n\n\t\t\t}\n\n\t\t\talSourceStopv (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source_stopv) (int n, varray* sources) {\n\n\t\tif (sources) {\n\n\t\t\tint size = sources->size;\n\t\t\tHL_CFFIPointer** sourcesData = hl_aptr (sources, HL_CFFIPointer*);\n\t\t\tALuint* data = new ALuint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALuint)(uintptr_t)(*sourcesData++)->ptr;\n\n\t\t\t}\n\n\t\t\talSourceStopv (n, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_al_source_unqueue_buffers (value source, int nb) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALuint* buffers = new ALuint[nb];\n\t\talSourceUnqueueBuffers (id, nb, buffers);\n\n\t\tvalue result = alloc_array (nb);\n\t\tALuint buffer;\n\t\tvalue ptr;\n\n\t\tfor (int i = 0; i < nb; i++) {\n\n\t\t\tbuffer = buffers[i];\n\n\t\t\tif (alObjects.count (buffer) > 0) {\n\n\t\t\t\tptr = (value)alObjects[buffer];\n\n\t\t\t} else {\n\n\t\t\t\tal_gc_mutex.Lock ();\n\t\t\t\tptr = CFFIPointer ((void*)(uintptr_t)buffer, gc_al_buffer);\n\t\t\t\talObjects[buffer] = ptr;\n\t\t\t\tal_gc_mutex.Unlock ();\n\n\t\t\t}\n\n\t\t\tval_array_set_i (result, i, ptr);\n\n\t\t}\n\n\t\tdelete[] buffers;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_al_source_unqueue_buffers) (HL_CFFIPointer* source, int nb) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tALuint* buffers = new ALuint[nb];\n\t\talSourceUnqueueBuffers (id, nb, buffers);\n\n\t\tvarray* result = hl_alloc_array (&hlt_dyn, nb);\n\t\tHL_CFFIPointer** resultData = hl_aptr (result, HL_CFFIPointer*);\n\t\tALuint buffer;\n\t\tHL_CFFIPointer* ptr;\n\n\t\tfor (int i = 0; i < nb; i++) {\n\n\t\t\tbuffer = buffers[i];\n\n\t\t\tif (alObjects.count (buffer) > 0) {\n\n\t\t\t\tptr = (HL_CFFIPointer*)alObjects[buffer];\n\n\t\t\t} else {\n\n\t\t\t\tal_gc_mutex.Lock ();\n\t\t\t\tptr = HLCFFIPointer ((void*)(uintptr_t)buffer, (hl_finalizer)hl_gc_al_buffer);\n\t\t\t\talObjects[buffer] = ptr;\n\t\t\t\tal_gc_mutex.Unlock ();\n\n\t\t\t}\n\n\t\t\t*resultData++ = ptr;\n\n\t\t}\n\n\t\tdelete[] buffers;\n\t\treturn result;\n\n\t}\n\n\n\tvoid lime_al_source3f (value source, int param, float value1, float value2, float value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSource3f (id, param, value1, value2, value3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source3f) (HL_CFFIPointer* source, int param, float value1, float value2, float value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSource3f (id, param, value1, value2, value3);\n\n\t}\n\n\n\tvoid lime_al_source3i (value source, int param, value value1, int value2, int value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALuint data1;\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (param == AL_AUXILIARY_SEND_FILTER) {\n\n\t\t\tdata1 = (ALuint)(uintptr_t)val_data (value1);\n\n\t\t} else {\n\n\t\t\tdata1 = val_int (value1);\n\n\t\t}\n\t\t#else\n\t\tdata1 = val_int (value1);\n\t\t#endif\n\n\t\talSource3i (id, param, data1, value2, value3);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_source3i) (HL_CFFIPointer* source, int param, vdynamic* value1, int value2, int value3) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tALuint data1;\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tif (param == AL_AUXILIARY_SEND_FILTER) {\n\n\t\t\tdata1 = (ALuint)(uintptr_t)((HL_CFFIPointer*)value1)->ptr;\n\n\t\t} else {\n\n\t\t\tdata1 = value1->v.i;\n\n\t\t}\n\t\t#else\n\t\tdata1 = value1->v.i;\n\t\t#endif\n\n\t\talSource3i (id, param, data1, value2, value3);\n\n\t}\n\n\n\tvoid lime_al_sourcef (value source, int param, float value) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\talSourcef (id, param, value);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_sourcef) (HL_CFFIPointer* source, int param, float value) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\talSourcef (id, param, value);\n\n\t}\n\n\n\tvoid lime_al_sourcefv (value source, int param, value values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALfloat *data = new ALfloat[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALfloat)val_float (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talSourcefv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_sourcefv) (HL_CFFIPointer* source, int param, varray* values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talSourcefv (id, param, hl_aptr (values, float));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_sourcei (value source, int param, value val) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\t\tALuint data = 0;\n\n\t\tif (!val_is_null (val)) {\n\n\t\t\t#ifdef LIME_OPENALSOFT\n\t\t\tif (param == AL_BUFFER || param == AL_DIRECT_FILTER) {\n\n\t\t\t\tdata = (ALuint)(uintptr_t)val_data (val);\n\n\t\t\t} else {\n\n\t\t\t\tdata = val_int (val);\n\n\t\t\t}\n\t\t\t#else\n\t\t\tif (param == AL_BUFFER) {\n\n\t\t\t\tdata = (ALuint)(uintptr_t)val_data (val);\n\n\t\t\t} else {\n\n\t\t\t\tdata = val_int (val);\n\n\t\t\t}\n\t\t\t#endif\n\n\t\t}\n\n\t\talSourcei (id, param, data);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_sourcei) (HL_CFFIPointer* source, int param, vdynamic* val) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\t\tALuint data = 0;\n\n\t\tif (val) {\n\n\t\t\t#ifdef LIME_OPENALSOFT\n\t\t\tif (param == AL_BUFFER || param == AL_DIRECT_FILTER) {\n\n\t\t\t\tdata = (ALuint)(uintptr_t)((HL_CFFIPointer*)val)->ptr;\n\n\t\t\t} else {\n\n\t\t\t\tdata = val->v.i;\n\n\t\t\t}\n\t\t\t#else\n\t\t\tif (param == AL_BUFFER) {\n\n\t\t\t\tdata = (ALuint)(uintptr_t)((HL_CFFIPointer*)val)->ptr;\n\n\t\t\t} else {\n\n\t\t\t\tdata = val->v.i;\n\n\t\t\t}\n\t\t\t#endif\n\n\t\t}\n\n\t\talSourcei (id, param, data);\n\n\t}\n\n\n\tvoid lime_al_sourceiv (value source, int param, value values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)val_data (source);\n\n\t\tif (!val_is_null (values)) {\n\n\t\t\tint size = val_array_size (values);\n\t\t\tALint* data = new ALint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tdata[i] = (ALint)val_int (val_array_i (values, i));\n\n\t\t\t}\n\n\t\t\talSourceiv (id, param, data);\n\t\t\tdelete[] data;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_sourceiv) (HL_CFFIPointer* source, int param, varray* values) {\n\n\t\tALuint id = (ALuint)(uintptr_t)source->ptr;\n\n\t\tif (values) {\n\n\t\t\tint size = values->size;\n\t\t\talSourceiv (id, param, hl_aptr (values, int));\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_al_speed_of_sound (float speed) {\n\n\t\talSpeedOfSound (speed);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_al_speed_of_sound) (float speed) {\n\n\t\talSpeedOfSound (speed);\n\n\t}\n\n\n\tbool lime_alc_close_device (value device) {\n\n\t\tal_gc_mutex.Lock ();\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\t\talcObjects.erase (alcDevice);\n\t\tal_gc_mutex.Unlock ();\n\n\t\treturn alcCloseDevice (alcDevice);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_alc_close_device) (HL_CFFIPointer* device) {\n\n\t\tal_gc_mutex.Lock ();\n\t\tALCdevice* alcDevice = (ALCdevice*)device->ptr;\n\t\talcObjects.erase (alcDevice);\n\t\tal_gc_mutex.Unlock ();\n\n\t\treturn alcCloseDevice (alcDevice);\n\n\t}\n\n\n\tvalue lime_alc_create_context (value device, value attrlist) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\t\tALCint* list = NULL;\n\n\t\tif (!val_is_null (attrlist)) {\n\n\t\t\tint size = val_array_size (attrlist);\n\t\t\tlist = new ALCint[size];\n\n\t\t\tfor (int i = 0; i < size; ++i) {\n\n\t\t\t\tlist[i] = (ALCint)val_int (val_array_i (attrlist, i));\n\n\t\t\t}\n\n\t\t}\n\n\t\tALCcontext* alcContext = alcCreateContext (alcDevice, list);\n\n\t\tif (list != NULL) {\n\n\t\t\tdelete[] list;\n\n\t\t}\n\n\t\tal_gc_mutex.Lock ();\n\t\tvalue object = CFFIPointer (alcContext, gc_alc_object);\n\t\talcObjects[alcContext] = object;\n\t\tal_gc_mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_alc_create_context) (HL_CFFIPointer* device, varray* attrlist) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)device->ptr;\n\t\tALCcontext* alcContext = alcCreateContext (alcDevice, attrlist ? hl_aptr (attrlist, int) : NULL);\n\n\t\tal_gc_mutex.Lock ();\n\t\tHL_CFFIPointer* object = HLCFFIPointer (alcContext, (hl_finalizer)hl_gc_alc_object);\n\t\talcObjects[alcContext] = object;\n\t\tal_gc_mutex.Unlock ();\n\t\treturn object;\n\n\t}\n\n\n\tvoid lime_alc_destroy_context (value context) {\n\n\t\tal_gc_mutex.Lock ();\n\t\tALCcontext* alcContext = (ALCcontext*)val_data (context);\n\n\t\tif (alcObjects.find (alcContext) != alcObjects.end ()) {\n\n\t\t\talcObjects.erase (alcContext);\n\n\t\t}\n\n\t\tif (alcContext == alcGetCurrentContext ()) {\n\n\t\t\talcMakeContextCurrent (0);\n\n\t\t}\n\n\t\talcDestroyContext (alcContext);\n\t\tal_gc_mutex.Unlock ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_alc_destroy_context) (HL_CFFIPointer* context) {\n\n\t\tal_gc_mutex.Lock ();\n\t\tALCcontext* alcContext = (ALCcontext*)context->ptr;\n\n\t\tif (alcObjects.find (alcContext) != alcObjects.end ()) {\n\n\t\t\talcObjects.erase (alcContext);\n\n\t\t}\n\n\t\tif (alcContext == alcGetCurrentContext ()) {\n\n\t\t\talcMakeContextCurrent (0);\n\n\t\t}\n\n\t\talcDestroyContext (alcContext);\n\t\tal_gc_mutex.Unlock ();\n\n\t}\n\n\n\tvalue lime_alc_get_contexts_device (value context) {\n\n\t\tALCcontext* alcContext = (ALCcontext*)val_data (context);\n\t\tALCdevice* alcDevice = alcGetContextsDevice (alcContext);\n\n\t\tvalue result;\n\t\tal_gc_mutex.Lock ();\n\t\tif (alcObjects.find (alcDevice) != alcObjects.end ()) {\n\n\t\t\tresult = (value)alcObjects[alcDevice];\n\n\t\t} else {\n\n\t\t\tvalue object = CFFIPointer (alcDevice, gc_alc_object);\n\t\t\talcObjects[alcDevice] = object;\n\t\t\tresult = object;\n\n\t\t}\n\t\tal_gc_mutex.Unlock ();\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_alc_get_contexts_device) (HL_CFFIPointer* context) {\n\n\t\tALCcontext* alcContext = (ALCcontext*)context->ptr;\n\t\tALCdevice* alcDevice = alcGetContextsDevice (alcContext);\n\n\t\tHL_CFFIPointer* result;\n\t\tal_gc_mutex.Lock ();\n\t\tif (alcObjects.find (alcDevice) != alcObjects.end ()) {\n\n\t\t\tresult = (HL_CFFIPointer*)alcObjects[alcDevice];\n\n\t\t} else {\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (alcDevice, (hl_finalizer)hl_gc_alc_object);\n\t\t\talcObjects[alcDevice] = object;\n\t\t\tresult = object;\n\n\t\t}\n\t\tal_gc_mutex.Unlock ();\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_alc_get_current_context () {\n\n\t\tALCcontext* alcContext = alcGetCurrentContext ();\n\n\t\tvalue result;\n\t\tal_gc_mutex.Lock ();\n\t\tif (alcObjects.find (alcContext) != alcObjects.end ()) {\n\n\t\t\tresult = (value)alcObjects[alcContext];\n\n\t\t} else {\n\n\t\t\tvalue object = CFFIPointer (alcContext, gc_alc_object);\n\t\t\talcObjects[alcContext] = object;\n\t\t\tresult = object;\n\n\t\t}\n\t\tal_gc_mutex.Unlock ();\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_alc_get_current_context) () {\n\n\t\tALCcontext* alcContext = alcGetCurrentContext ();\n\n\t\tHL_CFFIPointer* result;\n\t\tal_gc_mutex.Lock ();\n\t\tif (alcObjects.find (alcContext) != alcObjects.end ()) {\n\n\t\t\tresult = (HL_CFFIPointer*)alcObjects[alcContext];\n\n\t\t} else {\n\n\t\t\tHL_CFFIPointer* object = HLCFFIPointer (alcContext, (hl_finalizer)hl_gc_alc_object);\n\t\t\talcObjects[alcContext] = object;\n\t\t\tresult = object;\n\n\t\t}\n\t\tal_gc_mutex.Unlock ();\n\t\treturn result;\n\n\t}\n\n\n\tint lime_alc_get_error (value device) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\t\treturn alcGetError (alcDevice);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_alc_get_error) (HL_CFFIPointer* device) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)device->ptr;\n\t\treturn alcGetError (alcDevice);\n\n\t}\n\n\n\tvalue lime_alc_get_integerv (value device, int param, int size) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\n\t\tALCint* values = new ALCint[size];\n\t\talcGetIntegerv (alcDevice, param, size, values);\n\n\t\tvalue result = alloc_array (size);\n\n\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\tval_array_set_i (result, i, alloc_int (values[i]));\n\n\t\t}\n\n\t\tdelete[] values;\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_alc_get_integerv) (HL_CFFIPointer* device, int param, int size) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)device->ptr;\n\t\tvarray* result = hl_alloc_array (&hlt_i32, size);\n\t\talcGetIntegerv (alcDevice, param, size, hl_aptr (result, int));\n\t\treturn result;\n\n\t}\n\n\n\tvalue lime_alc_get_string (value device, int param) {\n\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\t\tconst char* result = alcGetString (alcDevice, param);\n\t\treturn result ? alloc_string (result) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_alc_get_string) (HL_CFFIPointer* device, int param) {\n\n\t\tALCdevice* alcDevice = device ? (ALCdevice*)device->ptr : 0;\n\t\tconst char* result = alcGetString (alcDevice, param);\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tbool lime_alc_make_context_current (value context) {\n\n\t\tALCcontext* alcContext = (ALCcontext*)val_data (context);\n\t\treturn alcMakeContextCurrent (alcContext);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_alc_make_context_current) (HL_CFFIPointer* context) {\n\n\t\tALCcontext* alcContext = context ? (ALCcontext*)context->ptr : 0;\n\t\treturn alcMakeContextCurrent (alcContext);\n\n\t}\n\n\n\tvalue lime_alc_open_device (HxString devicename) {\n\n\t\tALCdevice* alcDevice = alcOpenDevice (devicename.__s);\n\t\t//TODO: Can we work out our own cleanup for openal?\n\t\t//atexit (lime_al_atexit);\n\n\t\tvalue ptr = CFFIPointer (alcDevice, gc_alc_object);\n\t\talcObjects[alcDevice] = ptr;\n\t\treturn ptr;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_alc_open_device) (hl_vstring* devicename) {\n\n\t\tALCdevice* alcDevice = alcOpenDevice (devicename ? (char*)hl_to_utf8 ((const uchar*)devicename->bytes) : 0);\n\t\t//TODO: Can we work out our own cleanup for openal?\n\t\t//atexit (lime_al_atexit);\n\n\t\tHL_CFFIPointer* ptr = HLCFFIPointer (alcDevice, (hl_finalizer)hl_gc_alc_object);\n\t\talcObjects[alcDevice] = ptr;\n\t\treturn ptr;\n\n\t}\n\n\n\tvoid lime_alc_pause_device (value device) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\t\talcDevicePauseSOFT (alcDevice);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_alc_pause_device) (HL_CFFIPointer* device) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALCdevice* alcDevice = (ALCdevice*)device->ptr;\n\t\talcDevicePauseSOFT (alcDevice);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_alc_process_context (value context) {\n\n\t\tALCcontext* alcContext = (ALCcontext*)val_data (context);\n\t\talcProcessContext (alcContext);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_alc_process_context) (HL_CFFIPointer* context) {\n\n\t\tALCcontext* alcContext = (ALCcontext*)context->ptr;\n\t\talcProcessContext (alcContext);\n\n\t}\n\n\n\tvoid lime_alc_resume_device (value device) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALCdevice* alcDevice = (ALCdevice*)val_data (device);\n\t\talcDeviceResumeSOFT (alcDevice);\n\t\t#endif\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_alc_resume_device) (HL_CFFIPointer* device) {\n\n\t\t#ifdef LIME_OPENALSOFT\n\t\tALCdevice* alcDevice = device ? (ALCdevice*)device->ptr : NULL;\n\t\talcDeviceResumeSOFT (alcDevice);\n\t\t#endif\n\n\t}\n\n\n\tvoid lime_alc_suspend_context (value context) {\n\n\t\tALCcontext* alcContext = (ALCcontext*)val_data (context);\n\t\talcSuspendContext (alcContext);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_alc_suspend_context) (HL_CFFIPointer* context) {\n\n\t\tALCcontext* alcContext = context ? (ALCcontext*)context->ptr : NULL;\n\t\talcSuspendContext (alcContext);\n\n\t}\n\n\n\n\n\tDEFINE_PRIME3v (lime_al_auxf);\n\tDEFINE_PRIME3v (lime_al_auxfv);\n\tDEFINE_PRIME3v (lime_al_auxi);\n\tDEFINE_PRIME3v (lime_al_auxiv);\n\tDEFINE_PRIME5v (lime_al_buffer_data);\n\tDEFINE_PRIME5v (lime_al_buffer3f);\n\tDEFINE_PRIME5v (lime_al_buffer3i);\n\tDEFINE_PRIME3v (lime_al_bufferf);\n\tDEFINE_PRIME3v (lime_al_bufferfv);\n\tDEFINE_PRIME3v (lime_al_bufferi);\n\tDEFINE_PRIME3v (lime_al_bufferiv);\n\tDEFINE_PRIME0v (lime_al_cleanup);\n\tDEFINE_PRIME1v (lime_al_delete_auxiliary_effect_slot);\n\tDEFINE_PRIME1v (lime_al_delete_buffer);\n\tDEFINE_PRIME2v (lime_al_delete_buffers);\n\tDEFINE_PRIME1v (lime_al_delete_effect);\n\tDEFINE_PRIME1v (lime_al_delete_filter);\n\tDEFINE_PRIME1v (lime_al_delete_source);\n\tDEFINE_PRIME2v (lime_al_delete_sources);\n\tDEFINE_PRIME1v (lime_al_disable);\n\tDEFINE_PRIME1v (lime_al_distance_model);\n\tDEFINE_PRIME1v (lime_al_doppler_factor);\n\tDEFINE_PRIME1v (lime_al_doppler_velocity);\n\tDEFINE_PRIME3v (lime_al_effectf);\n\tDEFINE_PRIME3v (lime_al_effectfv);\n\tDEFINE_PRIME3v (lime_al_effecti);\n\tDEFINE_PRIME3v (lime_al_effectiv);\n\tDEFINE_PRIME1v (lime_al_enable);\n\tDEFINE_PRIME3v (lime_al_filteri);\n\tDEFINE_PRIME3v (lime_al_filterf);\n\tDEFINE_PRIME0 (lime_al_gen_aux);\n\tDEFINE_PRIME0 (lime_al_gen_buffer);\n\tDEFINE_PRIME1 (lime_al_gen_buffers);\n\tDEFINE_PRIME0 (lime_al_gen_effect);\n\tDEFINE_PRIME0 (lime_al_gen_filter);\n\tDEFINE_PRIME0 (lime_al_gen_source);\n\tDEFINE_PRIME1 (lime_al_gen_sources);\n\tDEFINE_PRIME1 (lime_al_get_boolean);\n\tDEFINE_PRIME2 (lime_al_get_booleanv);\n\tDEFINE_PRIME2 (lime_al_get_buffer3f);\n\tDEFINE_PRIME2 (lime_al_get_buffer3i);\n\tDEFINE_PRIME2 (lime_al_get_bufferf);\n\tDEFINE_PRIME3 (lime_al_get_bufferfv);\n\tDEFINE_PRIME2 (lime_al_get_bufferi);\n\tDEFINE_PRIME3 (lime_al_get_bufferiv);\n\tDEFINE_PRIME1 (lime_al_get_double);\n\tDEFINE_PRIME2 (lime_al_get_doublev);\n\tDEFINE_PRIME1 (lime_al_get_enum_value);\n\tDEFINE_PRIME0 (lime_al_get_error);\n\tDEFINE_PRIME2 (lime_al_get_filteri);\n\tDEFINE_PRIME1 (lime_al_get_float);\n\tDEFINE_PRIME2 (lime_al_get_floatv);\n\tDEFINE_PRIME1 (lime_al_get_integer);\n\tDEFINE_PRIME2 (lime_al_get_integerv);\n\tDEFINE_PRIME1 (lime_al_get_listener3f);\n\tDEFINE_PRIME1 (lime_al_get_listener3i);\n\tDEFINE_PRIME1 (lime_al_get_listenerf);\n\tDEFINE_PRIME2 (lime_al_get_listenerfv);\n\tDEFINE_PRIME1 (lime_al_get_listeneri);\n\tDEFINE_PRIME2 (lime_al_get_listeneriv);\n\tDEFINE_PRIME1 (lime_al_get_proc_address);\n\tDEFINE_PRIME2 (lime_al_get_source3f);\n\tDEFINE_PRIME2 (lime_al_get_source3i);\n\tDEFINE_PRIME2 (lime_al_get_sourcef);\n\tDEFINE_PRIME3 (lime_al_get_sourcefv);\n\tDEFINE_PRIME2 (lime_al_get_sourcei);\n\tDEFINE_PRIME3 (lime_al_get_sourceiv);\n\tDEFINE_PRIME1 (lime_al_get_string);\n\tDEFINE_PRIME1 (lime_al_is_aux);\n\tDEFINE_PRIME1 (lime_al_is_buffer);\n\tDEFINE_PRIME1 (lime_al_is_effect);\n\tDEFINE_PRIME1 (lime_al_is_enabled);\n\tDEFINE_PRIME1 (lime_al_is_extension_present);\n\tDEFINE_PRIME1 (lime_al_is_filter);\n\tDEFINE_PRIME1 (lime_al_is_source);\n\tDEFINE_PRIME4v (lime_al_listener3f);\n\tDEFINE_PRIME4v (lime_al_listener3i);\n\tDEFINE_PRIME2v (lime_al_listenerf);\n\tDEFINE_PRIME2v (lime_al_listenerfv);\n\tDEFINE_PRIME2v (lime_al_listeneri);\n\tDEFINE_PRIME2v (lime_al_listeneriv);\n\tDEFINE_PRIME1v (lime_al_remove_direct_filter);\n\tDEFINE_PRIME2v (lime_al_remove_send);\n\tDEFINE_PRIME1v (lime_al_source_pause);\n\tDEFINE_PRIME2v (lime_al_source_pausev);\n\tDEFINE_PRIME1v (lime_al_source_play);\n\tDEFINE_PRIME2v (lime_al_source_playv);\n\tDEFINE_PRIME3v (lime_al_source_queue_buffers);\n\tDEFINE_PRIME1v (lime_al_source_rewind);\n\tDEFINE_PRIME2v (lime_al_source_rewindv);\n\tDEFINE_PRIME1v (lime_al_source_stop);\n\tDEFINE_PRIME2v (lime_al_source_stopv);\n\tDEFINE_PRIME2 (lime_al_source_unqueue_buffers);\n\tDEFINE_PRIME5v (lime_al_source3f);\n\tDEFINE_PRIME5v (lime_al_source3i);\n\tDEFINE_PRIME3v (lime_al_sourcef);\n\tDEFINE_PRIME3v (lime_al_sourcefv);\n\tDEFINE_PRIME3v (lime_al_sourcei);\n\tDEFINE_PRIME3v (lime_al_sourceiv);\n\tDEFINE_PRIME1v (lime_al_speed_of_sound);\n\tDEFINE_PRIME2 (lime_alc_create_context);\n\tDEFINE_PRIME1 (lime_alc_close_device);\n\tDEFINE_PRIME1v (lime_alc_destroy_context);\n\tDEFINE_PRIME1 (lime_alc_get_contexts_device);\n\tDEFINE_PRIME0 (lime_alc_get_current_context);\n\tDEFINE_PRIME1 (lime_alc_get_error);\n\tDEFINE_PRIME3 (lime_alc_get_integerv);\n\tDEFINE_PRIME2 (lime_alc_get_string);\n\tDEFINE_PRIME1 (lime_alc_make_context_current);\n\tDEFINE_PRIME1 (lime_alc_open_device);\n\tDEFINE_PRIME1v (lime_alc_pause_device);\n\tDEFINE_PRIME1v (lime_alc_process_context);\n\tDEFINE_PRIME1v (lime_alc_resume_device);\n\tDEFINE_PRIME1v (lime_alc_suspend_context);\n\n\n\t#define _TBYTES _OBJ (_I32 _BYTES)\n\t#define _TCFFIPOINTER _DYN\n\t#define _TDEVICE _ABSTRACT (alc_device)\n\t#define _TCONTEXT _ABSTRACT (alc_context)\n\n\t#define _TARRAYBUFFER _TBYTES\n\t#define _TARRAYBUFFERVIEW _OBJ (_I32 _TARRAYBUFFER _I32 _I32 _I32 _I32)\n\n\tDEFINE_HL_PRIM (_VOID, hl_al_auxf, _TCFFIPOINTER _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_auxfv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_auxi, _TCFFIPOINTER _I32 _DYN);\n\tDEFINE_HL_PRIM (_VOID, hl_al_auxiv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_buffer_data, _TCFFIPOINTER _I32 _TARRAYBUFFERVIEW _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_buffer3f, _TCFFIPOINTER _I32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_buffer3i, _TCFFIPOINTER _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_bufferf, _TCFFIPOINTER _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_bufferfv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_bufferi, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_bufferiv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_cleanup, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_auxiliary_effect_slot, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_buffer, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_buffers, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_effect, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_filter, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_source, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_delete_sources, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_disable, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_distance_model, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_doppler_factor, _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_doppler_velocity, _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_effectf, _TCFFIPOINTER _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_effectfv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_effecti, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_effectiv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_enable, _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_filteri, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_filterf, _TCFFIPOINTER _I32 _F32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_al_gen_aux, _NO_ARG);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_al_gen_buffer, _NO_ARG);\n\tDEFINE_HL_PRIM (_ARR, hl_al_gen_buffers, _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_al_gen_effect, _NO_ARG);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_al_gen_filter, _NO_ARG);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_al_gen_source, _NO_ARG);\n\tDEFINE_HL_PRIM (_ARR, hl_al_gen_sources, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_get_boolean, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_booleanv, _I32 _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_buffer3f, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_buffer3i, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_F32, hl_al_get_bufferf, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_bufferfv, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_al_get_bufferi, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_bufferiv, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_F64, hl_al_get_double, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_doublev, _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_al_get_enum_value, _STRING);\n\tDEFINE_HL_PRIM (_I32, hl_al_get_error, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_al_get_filteri, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_F32, hl_al_get_float, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_floatv, _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_al_get_integer, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_integerv, _I32 _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_listener3f, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_listener3i, _I32);\n\tDEFINE_HL_PRIM (_F32, hl_al_get_listenerf, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_listenerfv, _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_al_get_listeneri, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_listeneriv, _I32 _I32);\n\tDEFINE_HL_PRIM (_F64, hl_al_get_proc_address, _STRING);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_source3f, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_source3i, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_F32, hl_al_get_sourcef, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_sourcefv, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_DYN, hl_al_get_sourcei, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_al_get_sourceiv, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_al_get_string, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_aux, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_buffer, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_effect, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_enabled, _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_extension_present, _STRING);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_filter, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_al_is_source, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_listener3f, _I32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_listener3i, _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_listenerf, _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_listenerfv, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_listeneri, _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_listeneriv, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_remove_direct_filter, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_remove_send, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_pause, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_pausev, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_play, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_playv, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_queue_buffers, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_rewind, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_rewindv, _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_stop, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source_stopv, _I32 _ARR);\n\tDEFINE_HL_PRIM (_ARR, hl_al_source_unqueue_buffers, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source3f, _TCFFIPOINTER _I32 _F32 _F32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_source3i, _TCFFIPOINTER _I32 _DYN _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_sourcef, _TCFFIPOINTER _I32 _F32);\n\tDEFINE_HL_PRIM (_VOID, hl_al_sourcefv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_sourcei, _TCFFIPOINTER _I32 _DYN);\n\tDEFINE_HL_PRIM (_VOID, hl_al_sourceiv, _TCFFIPOINTER _I32 _ARR);\n\tDEFINE_HL_PRIM (_VOID, hl_al_speed_of_sound, _F32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_alc_create_context, _TCFFIPOINTER _ARR);\n\tDEFINE_HL_PRIM (_BOOL, hl_alc_close_device, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_alc_destroy_context, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_alc_get_contexts_device, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_alc_get_current_context, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_alc_get_error, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_ARR, hl_alc_get_integerv, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_alc_get_string, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_alc_make_context_current, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_alc_open_device, _STRING);\n\tDEFINE_HL_PRIM (_VOID, hl_alc_pause_device, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_alc_process_context, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_alc_resume_device, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_alc_suspend_context, _TCFFIPOINTER);\n\n\n}\n\n\nextern \"C\" int lime_openal_register_prims () {\n\n\treturn 0;\n\n}\n"
  },
  {
    "path": "project/src/net/curl/CURLBindings.cpp",
    "content": "#include <curl/curl.h>\n#include <system/CFFI.h>\n#include <system/CFFIPointer.h>\n#include <system/Mutex.h>\n#include <system/System.h>\n#include <system/ValuePointer.h>\n#include <utils/Bytes.h>\n#include <string.h>\n#include <map>\n#include <vector>\n\n\nnamespace lime {\n\n\n\tstruct CURL_Progress {\n\n\t\tdouble dltotal;\n\t\tdouble dlnow;\n\t\tdouble ultotal;\n\t\tdouble ulnow;\n\n\t};\n\n\tstruct CURL_XferInfo {\n\n\t\tcurl_off_t dltotal;\n\t\tcurl_off_t dlnow;\n\t\tcurl_off_t ultotal;\n\t\tcurl_off_t ulnow;\n\n\t};\n\n\tstd::map<void*, std::vector<void*>* > curlMultiHandles;\n\tstd::map<void*, ValuePointer*> curlMultiObjects;\n\tstd::map<void*, void*> curlMultiReferences;\n\tstd::map<void*, int> curlMultiRunningHandles;\n\tstd::map<void*, bool> curlMultiValid;\n\tstd::map<CURL*, void*> curlObjects;\n\tstd::map<void*, bool> curlValid;\n\tstd::map<void*, ValuePointer*> headerCallbacks;\n\tstd::map<void*, curl_slist*> headerSLists;\n\tstd::map<void*, std::vector<char*>* > headerValues;\n\tstd::map<void*, ValuePointer*> progressCallbacks;\n\tstd::map<void*, CURL_Progress*> progressValues;\n\tstd::map<void*, Bytes*> readBytes;\n\tstd::map<void*, int> readBytesPosition;\n\tstd::map<void*, ValuePointer*> readBytesRoot;\n\t// TODO: Switch to structs\n\tstd::map<void*, char*> writeBuffers;\n\tstd::map<void*, int> writeBufferPosition;\n\tstd::map<void*, int> writeBufferSize;\n\tstd::map<void*, Bytes*> writeBytes;\n\tstd::map<void*, ValuePointer*> writeBytesRoot;\n\tstd::map<void*, ValuePointer*> writeCallbacks;\n\tstd::map<void*, ValuePointer*> xferInfoCallbacks;\n\tstd::map<void*, CURL_XferInfo*> xferInfoValues;\n\tMutex curl_gc_mutex;\n\n\tvoid free_header_values (const std::vector<char*>* values) {\n\n\t\tif (values) {\n\n\t\t\tfor (auto it = values->begin (); it != values->end (); ++it) {\n\n\t\t\t\tfree (*it);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tvoid gc_curl (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (curlMultiReferences.find (handle) != curlMultiReferences.end ()) {\n\n\t\t\t\tvalue multi_handle = (value)curlMultiReferences[handle];\n\t\t\t\tcurl_multi_remove_handle ((CURLM*)val_data (multi_handle), (CURL*)val_data (handle));\n\t\t\t\tcurlMultiReferences.erase (handle);\n\n\t\t\t\tstd::vector<void*>* handles = curlMultiHandles[multi_handle];\n\n\t\t\t\tif (handles->size () > 0) {\n\n\t\t\t\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\t\t\t\tif (*it == handle) {\n\n\t\t\t\t\t\t\thandles->erase (it);\n\t\t\t\t\t\t\tdelete curlMultiObjects[handle];\n\t\t\t\t\t\t\tcurlMultiObjects.erase (handle);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (curlValid.find (handle) != curlValid.end ()) {\n\n\t\t\t\tCURL* curl = (CURL*)val_data (handle);\n\n\t\t\t\tcurlValid.erase (handle);\n\t\t\t\tcurlObjects.erase (curl);\n\t\t\t\tcurl_easy_cleanup (curl);\n\n\t\t\t\tif (writeBuffers[handle]) {\n\n\t\t\t\t\tfree (writeBuffers[handle]);\n\n\t\t\t\t}\n\n\t\t\t\twriteBuffers.erase (handle);\n\t\t\t\twriteBufferPosition.erase (handle);\n\t\t\t\twriteBufferSize.erase (handle);\n\n\t\t\t}\n\n\t\t\tValuePointer* callback;\n\t\t\tBytes* bytes;\n\t\t\tValuePointer* bytesRoot;\n\n\t\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\t\tcallback = headerCallbacks[handle];\n\t\t\t\tstd::vector<char*>* values = headerValues[handle];\n\t\t\t\theaderCallbacks.erase (handle);\n\t\t\t\theaderValues.erase (handle);\n\t\t\t\tfree_header_values (values);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete values;\n\n\t\t\t}\n\n\t\t\tif (headerSLists.find (handle) != headerSLists.end ()) {\n\n\t\t\t\tcurl_slist* chunk = headerSLists[handle];\n\t\t\t\theaderSLists.erase (handle);\n\t\t\t\tcurl_slist_free_all (chunk);\n\n\t\t\t}\n\n\t\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\t\tcallback = progressCallbacks[handle];\n\t\t\t\tCURL_Progress* progress = progressValues[handle];\n\t\t\t\tprogressCallbacks.erase (handle);\n\t\t\t\tprogressValues.erase (progress);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete progress;\n\n\t\t\t}\n\n\t\t\tif (readBytes.find (handle) != readBytes.end ()) {\n\n\t\t\t\tbytes = readBytes[handle];\n\t\t\t\tbytesRoot = readBytesRoot[handle];\n\t\t\t\treadBytes.erase (handle);\n\t\t\t\treadBytesPosition.erase (handle);\n\t\t\t\treadBytesRoot.erase (handle);\n\t\t\t\tdelete bytes;\n\t\t\t\tdelete bytesRoot;\n\n\t\t\t}\n\n\t\t\tif (writeCallbacks.find (handle) != writeCallbacks.end ()) {\n\n\t\t\t\tcallback = writeCallbacks[handle];\n\t\t\t\tbytes = writeBytes[handle];\n\t\t\t\tbytesRoot = writeBytesRoot[handle];\n\t\t\t\twriteCallbacks.erase (handle);\n\t\t\t\twriteBytes.erase (handle);\n\t\t\t\twriteBytesRoot.erase (handle);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete bytes;\n\t\t\t\tdelete bytesRoot;\n\n\t\t\t}\n\n\t\t\tif (xferInfoCallbacks.find (handle) != xferInfoCallbacks.end ()) {\n\n\t\t\t\tcallback = xferInfoCallbacks[handle];\n\t\t\t\tCURL_XferInfo* info = xferInfoValues[handle];\n\t\t\t\txferInfoCallbacks.erase (handle);\n\t\t\t\txferInfoValues.erase (handle);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete info;\n\n\t\t\t}\n\n\t\t\tval_gc (handle, 0);\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_curl (HL_CFFIPointer* handle) {\n\n\t\tif (handle) {\n\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (curlMultiReferences.find (handle) != curlMultiReferences.end ()) {\n\n\t\t\t\tHL_CFFIPointer* multi_handle = (HL_CFFIPointer*)curlMultiReferences[handle];\n\t\t\t\tcurl_multi_remove_handle ((CURLM*)multi_handle->ptr, (CURL*)handle->ptr);\n\t\t\t\tcurlMultiReferences.erase (handle);\n\n\t\t\t\tstd::vector<void*>* handles = curlMultiHandles[multi_handle];\n\n\t\t\t\tif (handles->size () > 0) {\n\n\t\t\t\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\t\t\t\tif (*it == handle) {\n\n\t\t\t\t\t\t\thandles->erase (it);\n\t\t\t\t\t\t\tdelete curlMultiObjects[handle];\n\t\t\t\t\t\t\tcurlMultiObjects.erase (handle);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (curlValid.find (handle) != curlValid.end ()) {\n\n\t\t\t\tCURL* curl = (CURL*)handle->ptr;\n\n\t\t\t\tcurlValid.erase (handle);\n\t\t\t\tcurlObjects.erase (curl);\n\t\t\t\tcurl_easy_cleanup (curl);\n\n\t\t\t\tif (writeBuffers[handle]) {\n\n\t\t\t\t\tfree (writeBuffers[handle]);\n\n\t\t\t\t}\n\n\t\t\t\twriteBuffers.erase (handle);\n\t\t\t\twriteBufferPosition.erase (handle);\n\t\t\t\twriteBufferSize.erase (handle);\n\n\t\t\t}\n\n\t\t\tValuePointer* callback;\n\t\t\tBytes* bytes;\n\t\t\tValuePointer* bytesRoot;\n\n\t\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\t\tcallback = headerCallbacks[handle];\n\t\t\t\tstd::vector<char*>* values = headerValues[handle];\n\t\t\t\theaderCallbacks.erase (handle);\n\t\t\t\theaderValues.erase (handle);\n\t\t\t\tfree_header_values (values);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete values;\n\n\t\t\t}\n\n\t\t\tif (headerSLists.find (handle) != headerSLists.end ()) {\n\n\t\t\t\tcurl_slist* chunk = headerSLists[handle];\n\t\t\t\theaderSLists.erase (handle);\n\t\t\t\tcurl_slist_free_all (chunk);\n\n\t\t\t}\n\n\t\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\t\tcallback = progressCallbacks[handle];\n\t\t\t\tCURL_Progress* progress = progressValues[handle];\n\t\t\t\tprogressCallbacks.erase (handle);\n\t\t\t\tprogressValues.erase (progress);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete progress;\n\n\t\t\t}\n\n\t\t\tif (readBytes.find (handle) != readBytes.end ()) {\n\n\t\t\t\tbytes = readBytes[handle];\n\t\t\t\tbytesRoot = readBytesRoot[handle];\n\t\t\t\treadBytes.erase (handle);\n\t\t\t\treadBytesPosition.erase (handle);\n\t\t\t\treadBytesRoot.erase (handle);\n\t\t\t\tdelete bytesRoot;\n\n\t\t\t}\n\n\t\t\tif (writeCallbacks.find (handle) != writeCallbacks.end ()) {\n\n\t\t\t\tcallback = writeCallbacks[handle];\n\t\t\t\tbytes = writeBytes[handle];\n\t\t\t\tbytesRoot = writeBytesRoot[handle];\n\t\t\t\twriteCallbacks.erase (handle);\n\t\t\t\twriteBytes.erase (handle);\n\t\t\t\twriteBytesRoot.erase (handle);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete bytesRoot;\n\n\t\t\t}\n\n\t\t\tif (xferInfoCallbacks.find (handle) != xferInfoCallbacks.end ()) {\n\n\t\t\t\tcallback = xferInfoCallbacks[handle];\n\t\t\t\tCURL_XferInfo* info = xferInfoValues[handle];\n\t\t\t\txferInfoCallbacks.erase (handle);\n\t\t\t\txferInfoValues.erase (handle);\n\t\t\t\tdelete callback;\n\t\t\t\tdelete info;\n\n\t\t\t}\n\n\t\t\thandle->finalizer = NULL;\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid gc_curl_multi (value handle) {\n\n\t\tif (!val_is_null (handle)) {\n\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (curlMultiValid.find (handle) != curlMultiValid.end ()) {\n\n\t\t\t\tcurlMultiValid.erase (handle);\n\t\t\t\tcurl_multi_cleanup ((CURLM*)val_data(handle));\n\n\t\t\t}\n\n\t\t\tstd::vector<void*>* handles = curlMultiHandles[handle];\n\n\t\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\t\tdelete curlMultiObjects[*it];\n\t\t\t\tcurlMultiObjects.erase (*it);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tgc_curl ((value)*it);\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t}\n\n\t\t\tdelete curlMultiHandles[handle];\n\t\t\tcurlMultiHandles.erase (handle);\n\n\t\t\tval_gc (handle, 0);\n\t\t\t//handle = alloc_null ();\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid hl_gc_curl_multi (HL_CFFIPointer* handle) {\n\n\t\tif (handle) {\n\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (curlMultiValid.find (handle) != curlMultiValid.end ()) {\n\n\t\t\t\tcurlMultiValid.erase (handle);\n\t\t\t\tcurl_multi_cleanup ((CURLM*)handle->ptr);\n\n\t\t\t}\n\n\t\t\tstd::vector<void*>* handles = curlMultiHandles[handle];\n\n\t\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\t\tdelete curlMultiObjects[*it];\n\t\t\t\tcurlMultiObjects.erase (*it);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\thl_gc_curl ((HL_CFFIPointer*)*it);\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t}\n\n\t\t\tdelete curlMultiHandles[handle];\n\t\t\tcurlMultiHandles.erase (handle);\n\n\t\t\thandle->finalizer = NULL;\n\t\t\t//handle = alloc_null ();\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_curl_easy_cleanup (value handle) {\n\n\t\tgc_curl (handle);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_curl_easy_cleanup) (HL_CFFIPointer* handle) {\n\n\t\thl_gc_curl (handle);\n\n\t}\n\n\n\tvalue lime_curl_easy_duphandle (value handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURL* dup = curl_easy_duphandle ((CURL*)val_data(handle));\n\t\tvalue duphandle = CFFIPointer (dup, gc_curl);\n\t\tcurlValid[duphandle] = true;\n\t\tcurlObjects[dup] = duphandle;\n\n\t\tvalue callbackValue;\n\t\tBytes* bytes;\n\t\tvalue bytesValue;\n\n\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\tcallbackValue = (value)headerCallbacks[handle]->Get ();\n\t\t\theaderCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\theaderValues[duphandle] = new std::vector<char*> ();\n\n\t\t}\n\n\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\tcallbackValue = (value)progressCallbacks[handle]->Get ();\n\t\t\tprogressCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\tprogressValues[duphandle] = new CURL_Progress ();\n\n\t\t}\n\n\t\tif (readBytes.find (handle) != readBytes.end ()) {\n\n\t\t\tbytesValue = (value)readBytesRoot[handle]->Get ();\n\t\t\tbytes = new Bytes (bytesValue);\n\t\t\treadBytes[duphandle] = bytes;\n\t\t\treadBytesPosition[duphandle] = 0;\n\t\t\treadBytesRoot[duphandle] = new ValuePointer (bytesValue);\n\n\t\t}\n\n\t\tif (writeCallbacks.find (handle) != writeCallbacks.end ()) {\n\n\t\t\tcallbackValue = (value)writeCallbacks[handle]->Get ();\n\t\t\tbytesValue = (value)writeBytesRoot[handle]->Get ();\n\t\t\tbytes = new Bytes (bytesValue);\n\t\t\twriteCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\twriteBuffers[duphandle] = NULL;\n\t\t\twriteBufferPosition[duphandle] = 0;\n\t\t\twriteBufferSize[duphandle] = 0;\n\t\t\twriteBytes[duphandle] = bytes;\n\t\t\twriteBytesRoot[duphandle] = new ValuePointer (bytesValue);\n\n\t\t}\n\n\t\tif (xferInfoCallbacks.find (handle) != xferInfoCallbacks.end ()) {\n\n\t\t\tcallbackValue = (value)xferInfoCallbacks[handle]->Get ();\n\t\t\txferInfoCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\txferInfoValues[duphandle] = new CURL_XferInfo ();\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn duphandle;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_curl_easy_duphandle) (HL_CFFIPointer* handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURL* dup = curl_easy_duphandle ((CURL*)handle->ptr);\n\t\tHL_CFFIPointer* duphandle = HLCFFIPointer (dup, (hl_finalizer)hl_gc_curl);\n\t\tcurlValid[duphandle] = true;\n\t\tcurlObjects[dup] = duphandle;\n\n\t\tvclosure* callbackValue;\n\t\tBytes* bytes;\n\n\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\tcallbackValue = (vclosure*)headerCallbacks[handle]->Get ();\n\t\t\theaderCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\theaderValues[duphandle] = new std::vector<char*> ();\n\n\t\t}\n\n\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\tcallbackValue = (vclosure*)progressCallbacks[handle]->Get ();\n\t\t\tprogressCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\tprogressValues[duphandle] = new CURL_Progress ();\n\n\t\t}\n\n\t\tif (readBytes.find (handle) != readBytes.end ()) {\n\n\t\t\treadBytes[duphandle] = readBytes[handle];\n\t\t\treadBytesPosition[duphandle] = 0;\n\t\t\treadBytesRoot[duphandle] = new ValuePointer ((vobj*)readBytes[handle]);\n\n\t\t}\n\n\t\tif (writeCallbacks.find (handle) != writeCallbacks.end ()) {\n\n\t\t\tcallbackValue = (vclosure*)writeCallbacks[handle]->Get ();\n\t\t\twriteCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\twriteBuffers[duphandle] = NULL;\n\t\t\twriteBufferPosition[duphandle] = 0;\n\t\t\twriteBufferSize[duphandle] = 0;\n\t\t\twriteBytes[duphandle] = writeBytes[handle];\n\t\t\twriteBytesRoot[duphandle] = new ValuePointer ((vobj*)writeBytes[handle]);\n\n\t\t}\n\n\t\tif (xferInfoCallbacks.find (handle) != xferInfoCallbacks.end ()) {\n\n\t\t\tcallbackValue = (vclosure*)xferInfoCallbacks[handle]->Get ();\n\t\t\txferInfoCallbacks[duphandle] = new ValuePointer (callbackValue);\n\t\t\txferInfoValues[duphandle] = new CURL_XferInfo ();\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn duphandle;\n\n\t}\n\n\n\tvalue lime_curl_easy_escape (value curl, HxString url, int length) {\n\n\t\tchar* result = curl_easy_escape ((CURL*)val_data(curl), url.__s, length);\n\t\treturn result ? alloc_string (result) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_curl_easy_escape) (HL_CFFIPointer* curl, hl_vstring* url, int length) {\n\n\t\tchar* result = curl_easy_escape ((CURL*)curl->ptr, url ? hl_to_utf8 (url->bytes) : NULL, length);\n\t\treturn (vbyte*)result;\n\n\t}\n\n\n\tvoid lime_curl_easy_flush (value easy_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\t\tint code;\n\n\t\tif (headerCallbacks.find (easy_handle) != headerCallbacks.end ()) {\n\n\t\t\tValuePointer* headerCallback = headerCallbacks[easy_handle];\n\t\t\tstd::vector<char*>* values = headerValues[easy_handle];\n\n\t\t\tif (values->size () > 0) {\n\n\t\t\t\tfor (std::vector<char*>::iterator it = values->begin (); it != values->end (); ++it) {\n\n\t\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\t\theaderCallback->Call (alloc_string (*it));\n\t\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\t}\n\n\t\t\t\tfree_header_values (values);\n\t\t\t\tvalues->clear ();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (writeBuffers.find (easy_handle) != writeBuffers.end ()) {\n\n\t\t\tchar* buffer = writeBuffers[easy_handle];\n\t\t\tint position = writeBufferPosition[easy_handle];\n\t\t\tint length = writeBufferSize[easy_handle];\n\n\t\t\tif (buffer && position > 0) {\n\n\t\t\t\tif (writeCallbacks.find (easy_handle) != writeCallbacks.end ()) {\n\n\t\t\t\t\tValuePointer* writeCallback = writeCallbacks[easy_handle];\n\t\t\t\t\tValuePointer* bytesRoot = writeBytesRoot[easy_handle];\n\n\t\t\t\t\tBytes* bytes = writeBytes[easy_handle];\n\t\t\t\t\tif (bytes->length < position) bytes->Resize (position);\n\t\t\t\t\tmemcpy ((char*)bytes->b, buffer, position);\n\t\t\t\t\t// free (buffer);\n\t\t\t\t\t// writeBuffers[easy_handle] = NULL;\n\t\t\t\t\t// writeBufferSize[easy_handle] = 0;\n\t\t\t\t\twriteBufferPosition[easy_handle] = 0;\n\n\t\t\t\t\tvalue _bytes = bytes->Value ((value)bytesRoot->Get ());\n\n\t\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\t\tlength = val_int ((value)writeCallback->Call (_bytes, alloc_int (position)));\n\t\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\t\tif (length == CURL_WRITEFUNC_PAUSE) {\n\n\t\t\t\t\t\t// TODO: Handle pause\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (progressCallbacks.find (easy_handle) != progressCallbacks.end ()) {\n\n\t\t\tCURL_Progress* progress = progressValues[easy_handle];\n\t\t\tValuePointer* progressCallback = progressCallbacks[easy_handle];\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\tcode = val_int ((value)progressCallback->Call (alloc_float (progress->dltotal), alloc_float (progress->dlnow), alloc_float (progress->ultotal), alloc_float (progress->ulnow)));\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (code != 0) { // CURLE_OK\n\n\t\t\t\t// TODO: Abort\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (xferInfoCallbacks.find (easy_handle) != xferInfoCallbacks.end ()) {\n\n\t\t\tCURL_XferInfo* xferInfo = xferInfoValues[easy_handle];\n\t\t\tValuePointer* xferInfoCallback = xferInfoCallbacks[easy_handle];\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\tcode = val_int ((value)xferInfoCallback->Call (alloc_int (xferInfo->dltotal), alloc_int (xferInfo->dlnow), alloc_int (xferInfo->ultotal), alloc_int (xferInfo->ulnow)));\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (code != 0) {\n\n\t\t\t\t// TODO: Abort\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_curl_easy_flush) (HL_CFFIPointer* easy_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\t\tint code;\n\n\t\tif (headerCallbacks.find (easy_handle) != headerCallbacks.end ()) {\n\n\t\t\tValuePointer* headerCallback = headerCallbacks[easy_handle];\n\t\t\tstd::vector<char*>* values = headerValues[easy_handle];\n\n\t\t\tif (values->size () > 0) {\n\n\t\t\t\tfor (std::vector<char*>::iterator it = values->begin (); it != values->end (); ++it) {\n\n\t\t\t\t\tvdynamic* bytes = hl_alloc_dynamic (&hlt_bytes);\n\t\t\t\t\tbytes->v.bytes = (vbyte*)*it;\n\n\t\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\t\theaderCallback->Call (bytes);\n\t\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\t}\n\n\t\t\t\tfree_header_values (values);\n\t\t\t\tvalues->clear ();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (writeBuffers.find (easy_handle) != writeBuffers.end ()) {\n\n\t\t\tchar* buffer = writeBuffers[easy_handle];\n\t\t\tint position = writeBufferPosition[easy_handle];\n\t\t\tint length = writeBufferSize[easy_handle];\n\n\t\t\tif (buffer && position > 0) {\n\n\t\t\t\tif (writeCallbacks.find (easy_handle) != writeCallbacks.end ()) {\n\n\t\t\t\t\tValuePointer* writeCallback = writeCallbacks[easy_handle];\n\n\t\t\t\t\tBytes* bytes = writeBytes[easy_handle];\n\t\t\t\t\tif (bytes->length < position) bytes->Resize (position);\n\t\t\t\t\tmemcpy ((char*)bytes->b, buffer, position);\n\t\t\t\t\t// free (buffer);\n\t\t\t\t\t// writeBuffers[easy_handle] = NULL;\n\t\t\t\t\t// writeBufferSize[easy_handle] = 0;\n\t\t\t\t\twriteBufferPosition[easy_handle] = 0;\n\n\t\t\t\t\tvdynamic* pos = hl_alloc_dynamic (&hlt_i32);\n\t\t\t\t\tpos->v.i = position;\n\n\t\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\t\tvdynamic* _length = (vdynamic*)writeCallback->Call (bytes, pos);\n\t\t\t\t\tlength = (_length != NULL ? _length->v.i : 0);\n\t\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\t\tif (length == CURL_WRITEFUNC_PAUSE) {\n\n\t\t\t\t\t\t// TODO: Handle pause\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (progressCallbacks.find (easy_handle) != progressCallbacks.end ()) {\n\n\t\t\tCURL_Progress* progress = progressValues[easy_handle];\n\t\t\tValuePointer* progressCallback = progressCallbacks[easy_handle];\n\n\t\t\tvdynamic* dltotal = hl_alloc_dynamic (&hlt_f64);\n\t\t\tvdynamic* dlnow = hl_alloc_dynamic (&hlt_f64);\n\t\t\tvdynamic* ultotal = hl_alloc_dynamic (&hlt_f64);\n\t\t\tvdynamic* ulnow = hl_alloc_dynamic (&hlt_f64);\n\n\t\t\tdltotal->v.d = progress->dltotal;\n\t\t\tdlnow->v.d = progress->dlnow;\n\t\t\tultotal->v.d = progress->ultotal;\n\t\t\tulnow->v.d = progress->ulnow;\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\tvdynamic* _code = (vdynamic*)progressCallback->Call (dltotal, dlnow, ultotal, ulnow);\n\t\t\tcode = (_code != NULL ? _code->v.i : 0);\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (code != 0) { // CURLE_OK\n\n\t\t\t\t// TODO: Abort\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (xferInfoCallbacks.find (easy_handle) != xferInfoCallbacks.end ()) {\n\n\t\t\tCURL_XferInfo* xferInfo = xferInfoValues[easy_handle];\n\t\t\tValuePointer* xferInfoCallback = xferInfoCallbacks[easy_handle];\n\n\t\t\tvdynamic* dltotal = hl_alloc_dynamic (&hlt_i32);\n\t\t\tvdynamic* dlnow = hl_alloc_dynamic (&hlt_i32);\n\t\t\tvdynamic* ultotal = hl_alloc_dynamic (&hlt_i32);\n\t\t\tvdynamic* ulnow = hl_alloc_dynamic (&hlt_i32);\n\n\t\t\tdltotal->v.i = xferInfo->dltotal;\n\t\t\tdlnow->v.i = xferInfo->dlnow;\n\t\t\tultotal->v.i = xferInfo->ultotal;\n\t\t\tulnow->v.i = xferInfo->ulnow;\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\tvdynamic* _code = (vdynamic*)xferInfoCallback->Call (dltotal, dlnow, ultotal, ulnow);\n\t\t\tcode = (_code != NULL ? _code->v.i : 0);\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\tif (code != 0) {\n\n\t\t\t\t// TODO: Abort\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t}\n\n\n\tvalue lime_curl_easy_getinfo (value curl, int info) {\n\n\t\tCURLcode code = CURLE_OK;\n\t\tCURL* handle = (CURL*)val_data(curl);\n\t\tCURLINFO type = (CURLINFO)info;\n\n\t\tswitch (type) {\n\n\t\t\tcase CURLINFO_EFFECTIVE_URL:\n\t\t\tcase CURLINFO_REDIRECT_URL:\n\t\t\tcase CURLINFO_CONTENT_TYPE:\n\t\t\tcase CURLINFO_PRIVATE:\n\t\t\tcase CURLINFO_PRIMARY_IP:\n\t\t\tcase CURLINFO_LOCAL_IP:\n\t\t\tcase CURLINFO_FTP_ENTRY_PATH:\n\t\t\tcase CURLINFO_RTSP_SESSION_ID:\n\t\t\tcase CURLINFO_SCHEME:\n\n\t\t\t\tchar stringValue;\n\t\t\t\tcode = curl_easy_getinfo (handle, type, &stringValue);\n\t\t\t\treturn alloc_string (&stringValue);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLINFO_RESPONSE_CODE:\n\t\t\tcase CURLINFO_HTTP_CONNECTCODE:\n\t\t\tcase CURLINFO_FILETIME:\n\t\t\tcase CURLINFO_REDIRECT_COUNT:\n\t\t\tcase CURLINFO_HEADER_SIZE:\n\t\t\tcase CURLINFO_REQUEST_SIZE:\n\t\t\tcase CURLINFO_SSL_VERIFYRESULT:\n\t\t\tcase CURLINFO_HTTPAUTH_AVAIL:\n\t\t\tcase CURLINFO_PROXYAUTH_AVAIL:\n\t\t\tcase CURLINFO_OS_ERRNO:\n\t\t\tcase CURLINFO_NUM_CONNECTS:\n\t\t\tcase CURLINFO_PRIMARY_PORT:\n\t\t\tcase CURLINFO_LOCAL_PORT:\n\t\t\tcase CURLINFO_LASTSOCKET:\n\t\t\tcase CURLINFO_CONDITION_UNMET:\n\t\t\tcase CURLINFO_RTSP_CLIENT_CSEQ:\n\t\t\tcase CURLINFO_RTSP_SERVER_CSEQ:\n\t\t\tcase CURLINFO_RTSP_CSEQ_RECV:\n\t\t\tcase CURLINFO_HTTP_VERSION:\n\t\t\tcase CURLINFO_PROXY_SSL_VERIFYRESULT:\n\t\t\tcase CURLINFO_PROTOCOL:\n\t\t\tcase CURLINFO_SIZE_UPLOAD_T: // TODO: These should be larger\n\t\t\tcase CURLINFO_SIZE_DOWNLOAD_T:\n\t\t\tcase CURLINFO_SPEED_DOWNLOAD_T:\n\t\t\tcase CURLINFO_SPEED_UPLOAD_T:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_DOWNLOAD_T:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_UPLOAD_T:\n\n\t\t\t\tlong intValue;\n\t\t\t\tcode = curl_easy_getinfo (handle, type, &intValue);\n\t\t\t\treturn alloc_int (intValue);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLINFO_TOTAL_TIME:\n\t\t\tcase CURLINFO_NAMELOOKUP_TIME:\n\t\t\tcase CURLINFO_CONNECT_TIME:\n\t\t\tcase CURLINFO_APPCONNECT_TIME:\n\t\t\tcase CURLINFO_PRETRANSFER_TIME:\n\t\t\tcase CURLINFO_STARTTRANSFER_TIME:\n\t\t\tcase CURLINFO_REDIRECT_TIME:\n\t\t\tcase CURLINFO_SIZE_UPLOAD:\n\t\t\tcase CURLINFO_SIZE_DOWNLOAD:\n\t\t\tcase CURLINFO_SPEED_DOWNLOAD:\n\t\t\tcase CURLINFO_SPEED_UPLOAD:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_DOWNLOAD:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_UPLOAD:\n\n\t\t\t\tdouble floatValue;\n\t\t\t\tcode = curl_easy_getinfo (handle, type, &floatValue);\n\t\t\t\treturn alloc_float (floatValue);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLINFO_COOKIELIST:\n\t\t\t{\n\t\t\t\tstruct curl_slist *cookies;\n\t\t\t\tcode = curl_easy_getinfo(handle, CURLINFO_COOKIELIST, &cookies);\n\t\t\t\tstruct curl_slist *each = cookies;\n\t\t\t\tvalue result = alloc_array(0);\n\t\t\t\twhile (each) {\n\t\t\t\t\tval_array_push(result, alloc_string(each->data));\n\t\t\t\t\teach = each->next;\n\t\t\t\t}\n\t\t\t\tcurl_slist_free_all(cookies);\n\t\t\t\treturn result;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLINFO_SSL_ENGINES:\n\t\t\tcase CURLINFO_CERTINFO:\n\t\t\tcase CURLINFO_TLS_SESSION:\n\t\t\tcase CURLINFO_TLS_SSL_PTR:\n\t\t\tcase CURLINFO_ACTIVESOCKET:\n\n\t\t\t\t// TODO\n\n\t\t\t\tbreak;\n\n\t\t\tcase CURLINFO_NONE:\n\t\t\tcase CURLINFO_LASTONE:\n\n\t\t\t\t// ignore\n\n\t\t\t\tbreak;\n\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_curl_easy_getinfo) (HL_CFFIPointer* curl, int info) {\n\n\t\tCURLcode code = CURLE_OK;\n\t\tCURL* handle = (CURL*)curl->ptr;\n\t\tCURLINFO type = (CURLINFO)info;\n\n\t\tint size;\n\t\tvdynamic* result = NULL;\n\n\t\tswitch (type) {\n\n\t\t\tcase CURLINFO_EFFECTIVE_URL:\n\t\t\tcase CURLINFO_REDIRECT_URL:\n\t\t\tcase CURLINFO_CONTENT_TYPE:\n\t\t\tcase CURLINFO_PRIVATE:\n\t\t\tcase CURLINFO_PRIMARY_IP:\n\t\t\tcase CURLINFO_LOCAL_IP:\n\t\t\tcase CURLINFO_FTP_ENTRY_PATH:\n\t\t\tcase CURLINFO_RTSP_SESSION_ID:\n\t\t\tcase CURLINFO_SCHEME:\n\t\t\t{\n\t\t\t\tchar stringValue;\n\t\t\t\tcode = curl_easy_getinfo (handle, type, &stringValue);\n\n\t\t\t\tint size = strlen (&stringValue) + 1;\n\t\t\t\tchar* val = (char*)malloc (size);\n\t\t\t\tmemcpy (val, &stringValue, size);\n\n\t\t\t\tresult = hl_alloc_dynamic (&hlt_bytes);\n\t\t\t\tresult->v.b = val;\n\t\t\t\treturn result;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLINFO_RESPONSE_CODE:\n\t\t\tcase CURLINFO_HTTP_CONNECTCODE:\n\t\t\tcase CURLINFO_FILETIME:\n\t\t\tcase CURLINFO_REDIRECT_COUNT:\n\t\t\tcase CURLINFO_HEADER_SIZE:\n\t\t\tcase CURLINFO_REQUEST_SIZE:\n\t\t\tcase CURLINFO_SSL_VERIFYRESULT:\n\t\t\tcase CURLINFO_HTTPAUTH_AVAIL:\n\t\t\tcase CURLINFO_PROXYAUTH_AVAIL:\n\t\t\tcase CURLINFO_OS_ERRNO:\n\t\t\tcase CURLINFO_NUM_CONNECTS:\n\t\t\tcase CURLINFO_PRIMARY_PORT:\n\t\t\tcase CURLINFO_LOCAL_PORT:\n\t\t\tcase CURLINFO_LASTSOCKET:\n\t\t\tcase CURLINFO_CONDITION_UNMET:\n\t\t\tcase CURLINFO_RTSP_CLIENT_CSEQ:\n\t\t\tcase CURLINFO_RTSP_SERVER_CSEQ:\n\t\t\tcase CURLINFO_RTSP_CSEQ_RECV:\n\t\t\tcase CURLINFO_HTTP_VERSION:\n\t\t\tcase CURLINFO_PROXY_SSL_VERIFYRESULT:\n\t\t\tcase CURLINFO_PROTOCOL:\n\t\t\tcase CURLINFO_SIZE_UPLOAD_T: // TODO: These should be larger\n\t\t\tcase CURLINFO_SIZE_DOWNLOAD_T:\n\t\t\tcase CURLINFO_SPEED_DOWNLOAD_T:\n\t\t\tcase CURLINFO_SPEED_UPLOAD_T:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_DOWNLOAD_T:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_UPLOAD_T:\n\t\t\t{\n\t\t\t\tlong intValue;\n\t\t\t\tcode = curl_easy_getinfo (handle, type, &intValue);\n\n\t\t\t\tresult = hl_alloc_dynamic (&hlt_i32);\n\t\t\t\tresult->v.i = intValue;\n\t\t\t\treturn result;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLINFO_TOTAL_TIME:\n\t\t\tcase CURLINFO_NAMELOOKUP_TIME:\n\t\t\tcase CURLINFO_CONNECT_TIME:\n\t\t\tcase CURLINFO_APPCONNECT_TIME:\n\t\t\tcase CURLINFO_PRETRANSFER_TIME:\n\t\t\tcase CURLINFO_STARTTRANSFER_TIME:\n\t\t\tcase CURLINFO_REDIRECT_TIME:\n\t\t\tcase CURLINFO_SIZE_UPLOAD:\n\t\t\tcase CURLINFO_SIZE_DOWNLOAD:\n\t\t\tcase CURLINFO_SPEED_DOWNLOAD:\n\t\t\tcase CURLINFO_SPEED_UPLOAD:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_DOWNLOAD:\n\t\t\tcase CURLINFO_CONTENT_LENGTH_UPLOAD:\n\t\t\t{\n\t\t\t\tdouble floatValue;\n\t\t\t\tcode = curl_easy_getinfo (handle, type, &floatValue);\n\n\t\t\t\tresult = hl_alloc_dynamic (&hlt_f64);\n\t\t\t\tresult->v.d = floatValue;\n\t\t\t\treturn result;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLINFO_SSL_ENGINES:\n\t\t\tcase CURLINFO_COOKIELIST:\n\t\t\tcase CURLINFO_CERTINFO:\n\t\t\tcase CURLINFO_TLS_SESSION:\n\t\t\tcase CURLINFO_TLS_SSL_PTR:\n\t\t\tcase CURLINFO_ACTIVESOCKET:\n\n\t\t\t\t// TODO\n\n\t\t\t\tbreak;\n\n\t\t\tcase CURLINFO_NONE:\n\t\t\tcase CURLINFO_LASTONE:\n\n\t\t\t\t// ignore\n\n\t\t\t\tbreak;\n\n\n\t\t}\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_curl_easy_init () {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURL* curl = curl_easy_init ();\n\t\tvalue handle = CFFIPointer (curl, gc_curl);\n\n\t\tif (curlValid.find (handle) != curlValid.end ()) {\n\n\t\t\tprintf (\"Error: Duplicate cURL handle\\n\");\n\n\t\t}\n\n\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a header callback\\n\");\n\n\t\t}\n\n\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a progress callback\\n\");\n\n\t\t}\n\n\t\tif (readBytes.find (handle) != readBytes.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a read data value\\n\");\n\n\t\t}\n\n\t\tif (writeCallbacks.find (handle) != writeCallbacks.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a write callback\\n\");\n\n\t\t}\n\n\t\tcurlValid[handle] = true;\n\t\tcurlObjects[curl] = handle;\n\n\t\twriteBuffers[handle] = NULL;\n\t\twriteBufferPosition[handle] = 0;\n\t\twriteBufferSize[handle] = 0;\n\n\t\tCURLcode setopt_result = curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, \"\");\n\t\tif(setopt_result != CURLE_OK) {\n\t\t\tprintf(\"Failed to set CURLOPT_ACCEPT_ENCODING: %s\\n\", curl_easy_strerror(setopt_result));\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn handle;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_curl_easy_init) () {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURL* curl = curl_easy_init ();\n\t\tHL_CFFIPointer* handle = HLCFFIPointer (curl, (hl_finalizer)hl_gc_curl);\n\n\t\tif (curlValid.find (handle) != curlValid.end ()) {\n\n\t\t\tprintf (\"Error: Duplicate cURL handle\\n\");\n\n\t\t}\n\n\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a header callback\\n\");\n\n\t\t}\n\n\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a progress callback\\n\");\n\n\t\t}\n\n\t\tif (readBytes.find (handle) != readBytes.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a read data value\\n\");\n\n\t\t}\n\n\t\tif (writeCallbacks.find (handle) != writeCallbacks.end ()) {\n\n\t\t\tprintf (\"Error: cURL handle already has a write callback\\n\");\n\n\t\t}\n\n\t\tcurlValid[handle] = true;\n\t\tcurlObjects[curl] = handle;\n\n\t\twriteBuffers[handle] = NULL;\n\t\twriteBufferPosition[handle] = 0;\n\t\twriteBufferSize[handle] = 0;\n\n\t\tCURLcode setopt_result = curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, \"\");\n\t\tif(setopt_result != CURLE_OK) {\n\t\t\tprintf(\"Failed to set CURLOPT_ACCEPT_ENCODING: %s\\n\", curl_easy_strerror(setopt_result));\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn handle;\n\n\t}\n\n\n\tint lime_curl_easy_pause (value handle, int bitmask) {\n\n\t\treturn curl_easy_pause ((CURL*)val_data(handle), bitmask);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_easy_pause) (HL_CFFIPointer* handle, int bitmask) {\n\n\t\treturn curl_easy_pause ((CURL*)handle->ptr, bitmask);\n\n\t}\n\n\n\tint lime_curl_easy_perform (value easy_handle) {\n\n\t\tint code;\n\t\tSystem::GCEnterBlocking ();\n\n\t\tcode = curl_easy_perform ((CURL*)val_data(easy_handle));\n\n\t\tSystem::GCExitBlocking ();\n\n\t\tlime_curl_easy_flush (easy_handle);\n\n\t\treturn code;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_easy_perform) (HL_CFFIPointer* easy_handle) {\n\n\t\tint code;\n\t\tSystem::GCEnterBlocking ();\n\n\t\tcode = curl_easy_perform ((CURL*)easy_handle->ptr);\n\n\t\tSystem::GCExitBlocking ();\n\n\t\tlime_hl_curl_easy_flush (easy_handle);\n\n\t\treturn code;\n\n\t}\n\n\n\tint lime_curl_easy_recv (value curl, value buffer, int buflen, int n) {\n\n\t\t// TODO\n\n\t\treturn 0;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_easy_recv) (HL_CFFIPointer* curl, double buffer, int buflen, int n) {\n\n\t\t// TODO\n\n\t\treturn 0;\n\n\t}\n\n\n\tvoid lime_curl_easy_reset (value curl) {\n\n\t\tcurl_easy_reset ((CURL*)val_data(curl));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_curl_easy_reset) (HL_CFFIPointer* curl) {\n\n\t\tcurl_easy_reset ((CURL*)curl->ptr);\n\n\t}\n\n\n\tint lime_curl_easy_send (value curl, value buffer, int buflen, int n) {\n\n\t\t// TODO\n\n\t\treturn 0;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_easy_send) (HL_CFFIPointer* curl, double buffer, int buflen, int n) {\n\n\t\t// TODO\n\n\t\treturn 0;\n\n\t}\n\n\n\tstatic size_t header_callback (void *ptr, size_t size, size_t nmemb, void *userp) {\n\n\t\tstd::vector<char*>* values = headerValues[userp];\n\n\t\tif (size * nmemb > 0) {\n\n\t\t\tchar* data = (char*)malloc (size * nmemb + 1);\n\t\t\tmemcpy (data, ptr, size * nmemb);\n\t\t\tdata[size * nmemb] = '\\0';\n\t\t\tvalues->push_back (data);\n\n\t\t}\n\n\t\treturn size * nmemb;\n\n\t}\n\n\n\tstatic size_t write_callback (void *ptr, size_t size, size_t nmemb, void *userp) {\n\n\t\tif (size * nmemb < 1) {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tchar* buffer = writeBuffers[userp];\n\t\tint writeSize = (size * nmemb);\n\n\t\tif (!buffer) {\n\n\t\t\tbuffer = (char*)malloc (CURL_MAX_WRITE_SIZE);\n\t\t\tmemcpy (buffer, ptr, writeSize);\n\t\t\twriteBuffers[userp] = buffer;\n\t\t\twriteBufferPosition[userp] = writeSize;\n\t\t\twriteBufferSize[userp] = CURL_MAX_WRITE_SIZE;\n\n\t\t} else {\n\n\t\t\tint position = writeBufferPosition[userp];\n\t\t\tint currentSize = writeBufferSize[userp];\n\n\t\t\tif (position + writeSize > currentSize) {\n\n\t\t\t\tint newSize = currentSize;\n\t\t\t\twhile (newSize < position + writeSize) newSize += CURL_MAX_WRITE_SIZE;\n\n\t\t\t\tbuffer = (char*)realloc (buffer, newSize);\n\t\t\t\twriteBufferSize[userp] = newSize;\n\t\t\t\twriteBuffers[userp] = buffer;\n\n\t\t\t}\n\n\t\t\tmemcpy (buffer + position, ptr, writeSize);\n\t\t\twriteBufferPosition[userp] = position + writeSize;\n\n\t\t}\n\n\t\treturn writeSize;\n\n\t}\n\n\tstatic int seek_callback (void *userp, curl_off_t offset, int origin) {\n\t\tif (origin == SEEK_SET)  {\n\t\t\treadBytesPosition[userp] = offset;\n\t\t\treturn CURL_SEEKFUNC_OK;\n\t\t}\n\t\treturn CURL_SEEKFUNC_CANTSEEK;\n\t}\n\n\tstatic size_t read_callback (void *buffer, size_t size, size_t nmemb, void *userp) {\n\n\t\tBytes* bytes = readBytes[userp];\n\t\tint position = readBytesPosition[userp];\n\t\tint length = size * nmemb;\n\n\t\tif (bytes->length < position + length) {\n\n\t\t\tlength = bytes->length - position;\n\n\t\t}\n\n\t\tif (length <= 0) return 0;\n\n\t\tmemcpy (buffer, bytes->b + position, length);\n\t\treadBytesPosition[userp] = position + length;\n\n\t\treturn length;\n\n\t}\n\n\n\tstatic int progress_callback (void *userp, double dltotal, double dlnow, double ultotal, double ulnow) {\n\n\t\tCURL_Progress* progress = progressValues[userp];\n\n\t\tprogress->dltotal = dltotal;\n\t\tprogress->dlnow = dlnow;\n\t\tprogress->ultotal = ultotal;\n\t\tprogress->ulnow = ulnow;\n\n\t\treturn 0;\n\n\t}\n\n\n\tstatic int xferinfo_callback (void *userp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) {\n\n\t\tCURL_XferInfo* xferInfo = xferInfoValues[userp];\n\n\t\txferInfo->dltotal = dltotal;\n\t\txferInfo->dlnow = dlnow;\n\t\txferInfo->ultotal = ultotal;\n\t\txferInfo->ulnow = ulnow;\n\n\t\treturn 0;\n\n\t}\n\n\n\tint lime_curl_easy_setopt (value handle, int option, value parameter, value bytes) {\n\n\t\tCURLcode code = CURLE_OK;\n\t\tCURL* easy_handle = (CURL*)val_data(handle);\n\t\tCURLoption type = (CURLoption)option;\n\n\t\tswitch (type) {\n\n\t\t\tcase CURLOPT_VERBOSE:\n\t\t\tcase CURLOPT_HEADER:\n\t\t\tcase CURLOPT_NOPROGRESS:\n\t\t\tcase CURLOPT_NOSIGNAL:\n\t\t\tcase CURLOPT_WILDCARDMATCH:\n\t\t\tcase CURLOPT_FAILONERROR:\n\t\t\tcase CURLOPT_DNS_USE_GLOBAL_CACHE:\n\t\t\tcase CURLOPT_TCP_NODELAY:\n\t\t\tcase CURLOPT_TCP_KEEPALIVE:\n\t\t\tcase CURLOPT_SASL_IR:\n\t\t\tcase CURLOPT_AUTOREFERER:\n\t\t\tcase CURLOPT_TRANSFER_ENCODING:\n\t\t\tcase CURLOPT_FOLLOWLOCATION:\n\t\t\tcase CURLOPT_UNRESTRICTED_AUTH:\n\t\t\tcase CURLOPT_PUT:\n\t\t\tcase CURLOPT_POST:\n\t\t\tcase CURLOPT_COOKIESESSION:\n\t\t\tcase CURLOPT_HTTPGET:\n\t\t\tcase CURLOPT_IGNORE_CONTENT_LENGTH:\n\t\t\tcase CURLOPT_HTTP_CONTENT_DECODING:\n\t\t\tcase CURLOPT_HTTP_TRANSFER_DECODING:\n\t\t\tcase CURLOPT_DIRLISTONLY:\n\t\t\tcase CURLOPT_APPEND:\n\t\t\tcase CURLOPT_FTP_USE_EPRT:\n\t\t\tcase CURLOPT_FTP_USE_EPSV:\n\t\t\tcase CURLOPT_FTP_USE_PRET:\n\t\t\tcase CURLOPT_FTP_CREATE_MISSING_DIRS:\n\t\t\tcase CURLOPT_FTP_SKIP_PASV_IP:\n\t\t\tcase CURLOPT_TRANSFERTEXT:\n\t\t\tcase CURLOPT_CRLF:\n\t\t\tcase CURLOPT_NOBODY:\n\t\t\tcase CURLOPT_UPLOAD:\n\t\t\tcase CURLOPT_FRESH_CONNECT:\n\t\t\tcase CURLOPT_FORBID_REUSE:\n\t\t\tcase CURLOPT_CONNECT_ONLY:\n\t\t\tcase CURLOPT_USE_SSL:\n\t\t\t//case CURLOPT_SSL_ENABLE_ALPN:\n\t\t\t//case CURLOPT_SSL_ENABLE_NPN:\n\t\t\tcase CURLOPT_SSL_VERIFYPEER:\n\t\t\tcase CURLOPT_SSL_SESSIONID_CACHE:\n\t\t\tcase CURLOPT_TCP_FASTOPEN:\n\t\t\tcase CURLOPT_KEEP_SENDING_ON_ERROR:\n\t\t\tcase CURLOPT_PATH_AS_IS:\n\t\t\tcase CURLOPT_SSL_VERIFYSTATUS:\n\t\t\tcase CURLOPT_SSL_FALSESTART:\n\t\t\tcase CURLOPT_PIPEWAIT:\n\t\t\tcase CURLOPT_TFTP_NO_OPTIONS:\n\t\t\tcase CURLOPT_SUPPRESS_CONNECT_HEADERS:\n\t\t\tcase CURLOPT_SSH_COMPRESSION:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, val_bool (parameter));\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_SSL_VERIFYHOST:\n\t\t\tcase CURLOPT_PROTOCOLS:\n\t\t\tcase CURLOPT_REDIR_PROTOCOLS:\n\t\t\tcase CURLOPT_PROXYPORT:\n\t\t\tcase CURLOPT_PROXYTYPE:\n\t\t\tcase CURLOPT_HTTPPROXYTUNNEL:\n\t\t\tcase CURLOPT_SOCKS5_GSSAPI_NEC:\n\t\t\tcase CURLOPT_LOCALPORT:\n\t\t\tcase CURLOPT_LOCALPORTRANGE:\n\t\t\tcase CURLOPT_DNS_CACHE_TIMEOUT:\n\t\t\tcase CURLOPT_BUFFERSIZE:\n\t\t\tcase CURLOPT_PORT:\n\t\t\tcase CURLOPT_ADDRESS_SCOPE:\n\t\t\tcase CURLOPT_TCP_KEEPIDLE:\n\t\t\tcase CURLOPT_TCP_KEEPINTVL:\n\t\t\tcase CURLOPT_NETRC:\n\t\t\tcase CURLOPT_HTTPAUTH:\n\t\t\tcase CURLOPT_PROXYAUTH:\n\t\t\tcase CURLOPT_MAXREDIRS:\n\t\t\tcase CURLOPT_POSTREDIR:\n\t\t\tcase CURLOPT_POSTFIELDSIZE:\n\t\t\t//case CURLOPT_HEADEROPT:\n\t\t\tcase CURLOPT_HTTP_VERSION:\n\t\t\t//case CURLOPT_EXPECT_100_TIMEOUT_MS:\n\t\t\tcase CURLOPT_TFTP_BLKSIZE:\n\t\t\tcase CURLOPT_FTP_RESPONSE_TIMEOUT:\n\t\t\tcase CURLOPT_FTPSSLAUTH:\n\t\t\tcase CURLOPT_FTP_SSL_CCC:\n\t\t\tcase CURLOPT_FTP_FILEMETHOD:\n\t\t\tcase CURLOPT_RTSP_REQUEST:\n\t\t\tcase CURLOPT_RTSP_CLIENT_CSEQ:\n\t\t\tcase CURLOPT_RTSP_SERVER_CSEQ:\n\t\t\tcase CURLOPT_PROXY_TRANSFER_MODE:\n\t\t\tcase CURLOPT_RESUME_FROM:\n\t\t\tcase CURLOPT_FILETIME:\n\t\t\tcase CURLOPT_INFILESIZE:\n\t\t\tcase CURLOPT_MAXFILESIZE:\n\t\t\tcase CURLOPT_TIMECONDITION:\n\t\t\tcase CURLOPT_TIMEVALUE:\n\t\t\tcase CURLOPT_TIMEOUT:\n\t\t\tcase CURLOPT_TIMEOUT_MS:\n\t\t\tcase CURLOPT_LOW_SPEED_LIMIT:\n\t\t\tcase CURLOPT_LOW_SPEED_TIME:\n\t\t\tcase CURLOPT_MAXCONNECTS:\n\t\t\tcase CURLOPT_CONNECTTIMEOUT:\n\t\t\tcase CURLOPT_CONNECTTIMEOUT_MS:\n\t\t\tcase CURLOPT_IPRESOLVE:\n\t\t\tcase CURLOPT_ACCEPTTIMEOUT_MS:\n\t\t\tcase CURLOPT_SSLENGINE_DEFAULT:\n\t\t\tcase CURLOPT_SSLVERSION:\n\t\t\tcase CURLOPT_CERTINFO:\n\t\t\tcase CURLOPT_SSL_OPTIONS:\n\t\t\tcase CURLOPT_GSSAPI_DELEGATION:\n\t\t\tcase CURLOPT_SSH_AUTH_TYPES:\n\t\t\tcase CURLOPT_NEW_FILE_PERMS:\n\t\t\tcase CURLOPT_NEW_DIRECTORY_PERMS:\n\t\t\tcase CURLOPT_STREAM_WEIGHT:\n\t\t\tcase CURLOPT_PROXY_SSL_VERIFYPEER:\n\t\t\tcase CURLOPT_PROXY_SSL_VERIFYHOST:\n\t\t\tcase CURLOPT_PROXY_SSLVERSION:\n\t\t\tcase CURLOPT_PROXY_SSL_OPTIONS:\n\t\t\tcase CURLOPT_SOCKS5_AUTH:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, val_int (parameter));\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_POSTFIELDSIZE_LARGE:\n\t\t\tcase CURLOPT_RESUME_FROM_LARGE:\n\t\t\tcase CURLOPT_INFILESIZE_LARGE:\n\t\t\tcase CURLOPT_MAXFILESIZE_LARGE:\n\t\t\tcase CURLOPT_MAX_SEND_SPEED_LARGE:\n\t\t\tcase CURLOPT_MAX_RECV_SPEED_LARGE:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, val_float (parameter));\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_ERRORBUFFER:\n\t\t\tcase CURLOPT_URL:\n\t\t\tcase CURLOPT_PROXY:\n\t\t\tcase CURLOPT_NOPROXY:\n\t\t\tcase CURLOPT_SOCKS5_GSSAPI_SERVICE:\n\t\t\tcase CURLOPT_INTERFACE:\n\t\t\tcase CURLOPT_NETRC_FILE:\n\t\t\tcase CURLOPT_USERPWD:\n\t\t\tcase CURLOPT_PROXYUSERPWD:\n\t\t\tcase CURLOPT_USERNAME:\n\t\t\tcase CURLOPT_PASSWORD:\n\t\t\tcase CURLOPT_LOGIN_OPTIONS:\n\t\t\tcase CURLOPT_PROXYUSERNAME:\n\t\t\tcase CURLOPT_PROXYPASSWORD:\n\t\t\tcase CURLOPT_TLSAUTH_USERNAME:\n\t\t\tcase CURLOPT_TLSAUTH_PASSWORD:\n\t\t\tcase CURLOPT_XOAUTH2_BEARER:\n\t\t\tcase CURLOPT_ACCEPT_ENCODING:\n\t\t\tcase CURLOPT_POSTFIELDS:\n\t\t\tcase CURLOPT_COPYPOSTFIELDS:\n\t\t\tcase CURLOPT_REFERER:\n\t\t\tcase CURLOPT_USERAGENT:\n\t\t\tcase CURLOPT_COOKIE:\n\t\t\tcase CURLOPT_COOKIEFILE:\n\t\t\tcase CURLOPT_COOKIEJAR:\n\t\t\tcase CURLOPT_COOKIELIST:\n\t\t\tcase CURLOPT_MAIL_FROM:\n\t\t\tcase CURLOPT_MAIL_AUTH:\n\t\t\tcase CURLOPT_FTPPORT:\n\t\t\tcase CURLOPT_FTP_ALTERNATIVE_TO_USER:\n\t\t\tcase CURLOPT_FTP_ACCOUNT:\n\t\t\tcase CURLOPT_RTSP_SESSION_ID:\n\t\t\tcase CURLOPT_RTSP_STREAM_URI:\n\t\t\tcase CURLOPT_RTSP_TRANSPORT:\n\t\t\tcase CURLOPT_RANGE:\n\t\t\tcase CURLOPT_CUSTOMREQUEST:\n\t\t\tcase CURLOPT_DNS_INTERFACE:\n\t\t\tcase CURLOPT_DNS_LOCAL_IP4:\n\t\t\tcase CURLOPT_DNS_LOCAL_IP6:\n\t\t\tcase CURLOPT_SSLCERT:\n\t\t\tcase CURLOPT_SSLCERTTYPE:\n\t\t\tcase CURLOPT_SSLKEY:\n\t\t\tcase CURLOPT_SSLKEYTYPE:\n\t\t\tcase CURLOPT_KEYPASSWD:\n\t\t\tcase CURLOPT_SSLENGINE:\n\t\t\tcase CURLOPT_CAINFO:\n\t\t\tcase CURLOPT_ISSUERCERT:\n\t\t\tcase CURLOPT_CAPATH:\n\t\t\tcase CURLOPT_CRLFILE:\n\t\t\tcase CURLOPT_RANDOM_FILE:\n\t\t\tcase CURLOPT_EGDSOCKET:\n\t\t\tcase CURLOPT_SSL_CIPHER_LIST:\n\t\t\tcase CURLOPT_KRBLEVEL:\n\t\t\tcase CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:\n\t\t\tcase CURLOPT_SSH_PUBLIC_KEYFILE:\n\t\t\tcase CURLOPT_SSH_PRIVATE_KEYFILE:\n\t\t\tcase CURLOPT_SSH_KNOWNHOSTS:\n\t\t\tcase CURLOPT_PINNEDPUBLICKEY:\n\t\t\tcase CURLOPT_UNIX_SOCKET_PATH:\n\t\t\tcase CURLOPT_PROXY_SERVICE_NAME:\n\t\t\tcase CURLOPT_SERVICE_NAME:\n\t\t\tcase CURLOPT_DEFAULT_PROTOCOL:\n\t\t\tcase CURLOPT_PROXY_CAINFO:\n\t\t\tcase CURLOPT_PROXY_CAPATH:\n\t\t\tcase CURLOPT_PROXY_TLSAUTH_USERNAME:\n\t\t\tcase CURLOPT_PROXY_TLSAUTH_PASSWORD:\n\t\t\tcase CURLOPT_PROXY_TLSAUTH_TYPE:\n\t\t\tcase CURLOPT_PROXY_SSLCERT:\n\t\t\tcase CURLOPT_PROXY_SSLCERTTYPE:\n\t\t\tcase CURLOPT_PROXY_SSLKEY:\n\t\t\tcase CURLOPT_PROXY_SSLKEYTYPE:\n\t\t\tcase CURLOPT_PROXY_KEYPASSWD:\n\t\t\tcase CURLOPT_PROXY_SSL_CIPHER_LIST:\n\t\t\tcase CURLOPT_PROXY_CRLFILE:\n\t\t\tcase CURLOPT_PRE_PROXY:\n\t\t\tcase CURLOPT_PROXY_PINNEDPUBLICKEY:\n\t\t\tcase CURLOPT_ABSTRACT_UNIX_SOCKET:\n\t\t\tcase CURLOPT_REQUEST_TARGET:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, val_string (parameter));\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_IOCTLFUNCTION:\n\t\t\tcase CURLOPT_IOCTLDATA:\n\t\t\tcase CURLOPT_SEEKFUNCTION:\n\t\t\tcase CURLOPT_SEEKDATA:\n\t\t\tcase CURLOPT_SOCKOPTFUNCTION:\n\t\t\tcase CURLOPT_SOCKOPTDATA:\n\t\t\tcase CURLOPT_OPENSOCKETFUNCTION:\n\t\t\tcase CURLOPT_OPENSOCKETDATA:\n\t\t\tcase CURLOPT_CLOSESOCKETFUNCTION:\n\t\t\tcase CURLOPT_CLOSESOCKETDATA:\n\t\t\tcase CURLOPT_DEBUGFUNCTION:\n\t\t\tcase CURLOPT_DEBUGDATA:\n\t\t\tcase CURLOPT_SSL_CTX_FUNCTION:\n\t\t\tcase CURLOPT_SSL_CTX_DATA:\n\t\t\tcase CURLOPT_CONV_TO_NETWORK_FUNCTION:\n\t\t\tcase CURLOPT_CONV_FROM_NETWORK_FUNCTION:\n\t\t\tcase CURLOPT_CONV_FROM_UTF8_FUNCTION:\n\t\t\tcase CURLOPT_INTERLEAVEFUNCTION:\n\t\t\tcase CURLOPT_INTERLEAVEDATA:\n\t\t\tcase CURLOPT_CHUNK_BGN_FUNCTION:\n\t\t\tcase CURLOPT_CHUNK_END_FUNCTION:\n\t\t\tcase CURLOPT_CHUNK_DATA:\n\t\t\tcase CURLOPT_FNMATCH_FUNCTION:\n\t\t\tcase CURLOPT_FNMATCH_DATA:\n\t\t\tcase CURLOPT_STDERR:\n\t\t\tcase CURLOPT_HTTPPOST:\n\t\t\t//case CURLOPT_PROXYHEADER:\n\t\t\tcase CURLOPT_HTTP200ALIASES:\n\t\t\tcase CURLOPT_MAIL_RCPT:\n\t\t\tcase CURLOPT_QUOTE:\n\t\t\tcase CURLOPT_POSTQUOTE:\n\t\t\tcase CURLOPT_PREQUOTE:\n\t\t\tcase CURLOPT_RESOLVE:\n\t\t\tcase CURLOPT_SSH_KEYFUNCTION:\n\t\t\tcase CURLOPT_SSH_KEYDATA:\n\t\t\tcase CURLOPT_PRIVATE:\n\t\t\tcase CURLOPT_SHARE:\n\t\t\tcase CURLOPT_TELNETOPTIONS:\n\t\t\tcase CURLOPT_STREAM_DEPENDS:\n\t\t\tcase CURLOPT_STREAM_DEPENDS_E:\n\t\t\tcase CURLOPT_CONNECT_TO:\n\t\t\tcase CURLOPT_MIMEPOST:\n\n\t\t\t\t//todo\n\t\t\t\tbreak;\n\n\t\t\t//case CURLOPT_READDATA:\n\t\t\t//case CURLOPT_WRITEDATA:\n\t\t\t//case CURLOPT_HEADERDATA:\n\t\t\t//case CURLOPT_PROGRESSDATA:\n\n\t\t\tcase CURLOPT_READFUNCTION:\n\t\t\t{\n\t\t\t\t// curl_gc_mutex.Lock ();\n\t\t\t\t// ValuePointer* callback = new ValuePointer (parameter);\n\t\t\t\t// readCallbacks[handle] = callback;\n\t\t\t\t// code = curl_easy_setopt (easy_handle, type, read_callback);\n\t\t\t\t// curl_easy_setopt (easy_handle, CURLOPT_READDATA, handle);\n\t\t\t\t// curl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_READDATA:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (readBytes.find (handle) == readBytes.end ()) {\n\n\t\t\t\t\tdelete readBytes[handle];\n\t\t\t\t\tdelete readBytesRoot[handle];\n\n\t\t\t\t}\n\n\t\t\t\tBytes* _readBytes = new Bytes (bytes);\n\t\t\t\treadBytes[handle] = _readBytes;\n\t\t\t\treadBytesPosition[handle] = 0;\n\t\t\t\treadBytesRoot[handle] = new ValuePointer (bytes);\n\n\t\t\t\t// seek function is needed to support redirects\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_SEEKFUNCTION, seek_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_SEEKDATA, handle);\n\t\t\t\tcode = curl_easy_setopt (easy_handle, CURLOPT_READFUNCTION, read_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_READDATA, handle);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_WRITEFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (writeCallbacks.find (handle) == writeCallbacks.end ()) {\n\n\t\t\t\t\tdelete writeCallbacks[handle];\n\t\t\t\t\tdelete writeBytes[handle];\n\t\t\t\t\tdelete writeBytesRoot[handle];\n\n\t\t\t\t}\n\n\t\t\t\tValuePointer* callback = new ValuePointer (parameter);\n\t\t\t\twriteCallbacks[handle] = callback;\n\t\t\t\tBytes* _writeBytes = new Bytes (bytes);\n\t\t\t\twriteBytes[handle] = _writeBytes;\n\t\t\t\twriteBytesRoot[handle] = new ValuePointer (bytes);\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, write_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_WRITEDATA, handle);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_HEADERFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\t\t\tfree_header_values (headerValues[handle]);\n\t\t\t\t\tdelete headerCallbacks[handle];\n\t\t\t\t\tdelete headerValues[handle];\n\n\t\t\t\t}\n\n\t\t\t\tValuePointer* callback = new ValuePointer (parameter);\n\t\t\t\theaderCallbacks[handle] = callback;\n\t\t\t\theaderValues[handle] = new std::vector<char*> ();\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, header_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_HEADERDATA, handle);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_PROGRESSFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\t\t\tdelete progressCallbacks[handle];\n\t\t\t\t\tdelete progressValues[handle];\n\n\t\t\t\t}\n\n\t\t\t\tprogressCallbacks[handle] = new ValuePointer (parameter);\n\t\t\t\tprogressValues[handle] = new CURL_Progress ();\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, progress_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_PROGRESSDATA, handle);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_NOPROGRESS, false);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_XFERINFOFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (xferInfoCallbacks.find (handle) != xferInfoCallbacks.end ()) {\n\n\t\t\t\t\tdelete xferInfoCallbacks[handle];\n\t\t\t\t\tdelete xferInfoValues[handle];\n\n\t\t\t\t}\n\n\t\t\t\txferInfoCallbacks[handle] = new ValuePointer (parameter);\n\t\t\t\txferInfoValues[handle] = new CURL_XferInfo ();\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, xferinfo_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_XFERINFODATA, handle);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_NOPROGRESS, false);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLOPT_HTTPHEADER:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (headerSLists.find (handle) != headerSLists.end ()) {\n\n\t\t\t\t\tcurl_slist_free_all (headerSLists[handle]);\n\n\t\t\t\t}\n\n\t\t\t\tstruct curl_slist *chunk = NULL;\n\t\t\t\tint size = val_array_size (parameter);\n\n\t\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\t\tchunk = curl_slist_append (chunk, val_string (val_array_i (parameter, i)));\n\n\t\t\t\t}\n\n\t\t\t\theaderSLists[handle] = chunk;\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, chunk);\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn code;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_easy_setopt) (HL_CFFIPointer* handle, int option, vdynamic* parameter, Bytes* bytes) {\n\n\t\tCURLcode code = CURLE_OK;\n\t\tCURL* easy_handle = (CURL*)handle->ptr;\n\t\tCURLoption type = (CURLoption)option;\n\n\t\tswitch (type) {\n\n\t\t\tcase CURLOPT_VERBOSE:\n\t\t\tcase CURLOPT_HEADER:\n\t\t\tcase CURLOPT_NOPROGRESS:\n\t\t\tcase CURLOPT_NOSIGNAL:\n\t\t\tcase CURLOPT_WILDCARDMATCH:\n\t\t\tcase CURLOPT_FAILONERROR:\n\t\t\tcase CURLOPT_DNS_USE_GLOBAL_CACHE:\n\t\t\tcase CURLOPT_TCP_NODELAY:\n\t\t\tcase CURLOPT_TCP_KEEPALIVE:\n\t\t\tcase CURLOPT_SASL_IR:\n\t\t\tcase CURLOPT_AUTOREFERER:\n\t\t\tcase CURLOPT_TRANSFER_ENCODING:\n\t\t\tcase CURLOPT_FOLLOWLOCATION:\n\t\t\tcase CURLOPT_UNRESTRICTED_AUTH:\n\t\t\tcase CURLOPT_PUT:\n\t\t\tcase CURLOPT_POST:\n\t\t\tcase CURLOPT_COOKIESESSION:\n\t\t\tcase CURLOPT_HTTPGET:\n\t\t\tcase CURLOPT_IGNORE_CONTENT_LENGTH:\n\t\t\tcase CURLOPT_HTTP_CONTENT_DECODING:\n\t\t\tcase CURLOPT_HTTP_TRANSFER_DECODING:\n\t\t\tcase CURLOPT_DIRLISTONLY:\n\t\t\tcase CURLOPT_APPEND:\n\t\t\tcase CURLOPT_FTP_USE_EPRT:\n\t\t\tcase CURLOPT_FTP_USE_EPSV:\n\t\t\tcase CURLOPT_FTP_USE_PRET:\n\t\t\tcase CURLOPT_FTP_CREATE_MISSING_DIRS:\n\t\t\tcase CURLOPT_FTP_SKIP_PASV_IP:\n\t\t\tcase CURLOPT_TRANSFERTEXT:\n\t\t\tcase CURLOPT_CRLF:\n\t\t\tcase CURLOPT_NOBODY:\n\t\t\tcase CURLOPT_UPLOAD:\n\t\t\tcase CURLOPT_FRESH_CONNECT:\n\t\t\tcase CURLOPT_FORBID_REUSE:\n\t\t\tcase CURLOPT_CONNECT_ONLY:\n\t\t\tcase CURLOPT_USE_SSL:\n\t\t\t//case CURLOPT_SSL_ENABLE_ALPN:\n\t\t\t//case CURLOPT_SSL_ENABLE_NPN:\n\t\t\tcase CURLOPT_SSL_VERIFYPEER:\n\t\t\tcase CURLOPT_SSL_SESSIONID_CACHE:\n\t\t\tcase CURLOPT_TCP_FASTOPEN:\n\t\t\tcase CURLOPT_KEEP_SENDING_ON_ERROR:\n\t\t\tcase CURLOPT_PATH_AS_IS:\n\t\t\tcase CURLOPT_SSL_VERIFYSTATUS:\n\t\t\tcase CURLOPT_SSL_FALSESTART:\n\t\t\tcase CURLOPT_PIPEWAIT:\n\t\t\tcase CURLOPT_TFTP_NO_OPTIONS:\n\t\t\tcase CURLOPT_SUPPRESS_CONNECT_HEADERS:\n\t\t\tcase CURLOPT_SSH_COMPRESSION:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, parameter->v.b);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_SSL_VERIFYHOST:\n\t\t\tcase CURLOPT_PROTOCOLS:\n\t\t\tcase CURLOPT_REDIR_PROTOCOLS:\n\t\t\tcase CURLOPT_PROXYPORT:\n\t\t\tcase CURLOPT_PROXYTYPE:\n\t\t\tcase CURLOPT_HTTPPROXYTUNNEL:\n\t\t\tcase CURLOPT_SOCKS5_GSSAPI_NEC:\n\t\t\tcase CURLOPT_LOCALPORT:\n\t\t\tcase CURLOPT_LOCALPORTRANGE:\n\t\t\tcase CURLOPT_DNS_CACHE_TIMEOUT:\n\t\t\tcase CURLOPT_BUFFERSIZE:\n\t\t\tcase CURLOPT_PORT:\n\t\t\tcase CURLOPT_ADDRESS_SCOPE:\n\t\t\tcase CURLOPT_TCP_KEEPIDLE:\n\t\t\tcase CURLOPT_TCP_KEEPINTVL:\n\t\t\tcase CURLOPT_NETRC:\n\t\t\tcase CURLOPT_HTTPAUTH:\n\t\t\tcase CURLOPT_PROXYAUTH:\n\t\t\tcase CURLOPT_MAXREDIRS:\n\t\t\tcase CURLOPT_POSTREDIR:\n\t\t\tcase CURLOPT_POSTFIELDSIZE:\n\t\t\t//case CURLOPT_HEADEROPT:\n\t\t\tcase CURLOPT_HTTP_VERSION:\n\t\t\t//case CURLOPT_EXPECT_100_TIMEOUT_MS:\n\t\t\tcase CURLOPT_TFTP_BLKSIZE:\n\t\t\tcase CURLOPT_FTP_RESPONSE_TIMEOUT:\n\t\t\tcase CURLOPT_FTPSSLAUTH:\n\t\t\tcase CURLOPT_FTP_SSL_CCC:\n\t\t\tcase CURLOPT_FTP_FILEMETHOD:\n\t\t\tcase CURLOPT_RTSP_REQUEST:\n\t\t\tcase CURLOPT_RTSP_CLIENT_CSEQ:\n\t\t\tcase CURLOPT_RTSP_SERVER_CSEQ:\n\t\t\tcase CURLOPT_PROXY_TRANSFER_MODE:\n\t\t\tcase CURLOPT_RESUME_FROM:\n\t\t\tcase CURLOPT_FILETIME:\n\t\t\tcase CURLOPT_INFILESIZE:\n\t\t\tcase CURLOPT_MAXFILESIZE:\n\t\t\tcase CURLOPT_TIMECONDITION:\n\t\t\tcase CURLOPT_TIMEVALUE:\n\t\t\tcase CURLOPT_TIMEOUT:\n\t\t\tcase CURLOPT_TIMEOUT_MS:\n\t\t\tcase CURLOPT_LOW_SPEED_LIMIT:\n\t\t\tcase CURLOPT_LOW_SPEED_TIME:\n\t\t\tcase CURLOPT_MAXCONNECTS:\n\t\t\tcase CURLOPT_CONNECTTIMEOUT:\n\t\t\tcase CURLOPT_CONNECTTIMEOUT_MS:\n\t\t\tcase CURLOPT_IPRESOLVE:\n\t\t\tcase CURLOPT_ACCEPTTIMEOUT_MS:\n\t\t\tcase CURLOPT_SSLENGINE_DEFAULT:\n\t\t\tcase CURLOPT_SSLVERSION:\n\t\t\tcase CURLOPT_CERTINFO:\n\t\t\tcase CURLOPT_SSL_OPTIONS:\n\t\t\tcase CURLOPT_GSSAPI_DELEGATION:\n\t\t\tcase CURLOPT_SSH_AUTH_TYPES:\n\t\t\tcase CURLOPT_NEW_FILE_PERMS:\n\t\t\tcase CURLOPT_NEW_DIRECTORY_PERMS:\n\t\t\tcase CURLOPT_STREAM_WEIGHT:\n\t\t\tcase CURLOPT_PROXY_SSL_VERIFYPEER:\n\t\t\tcase CURLOPT_PROXY_SSL_VERIFYHOST:\n\t\t\tcase CURLOPT_PROXY_SSLVERSION:\n\t\t\tcase CURLOPT_PROXY_SSL_OPTIONS:\n\t\t\tcase CURLOPT_SOCKS5_AUTH:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, parameter->v.i);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_POSTFIELDSIZE_LARGE:\n\t\t\tcase CURLOPT_RESUME_FROM_LARGE:\n\t\t\tcase CURLOPT_INFILESIZE_LARGE:\n\t\t\tcase CURLOPT_MAXFILESIZE_LARGE:\n\t\t\tcase CURLOPT_MAX_SEND_SPEED_LARGE:\n\t\t\tcase CURLOPT_MAX_RECV_SPEED_LARGE:\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, parameter->v.f);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLOPT_ERRORBUFFER:\n\t\t\tcase CURLOPT_URL:\n\t\t\tcase CURLOPT_PROXY:\n\t\t\tcase CURLOPT_NOPROXY:\n\t\t\tcase CURLOPT_SOCKS5_GSSAPI_SERVICE:\n\t\t\tcase CURLOPT_INTERFACE:\n\t\t\tcase CURLOPT_NETRC_FILE:\n\t\t\tcase CURLOPT_USERPWD:\n\t\t\tcase CURLOPT_PROXYUSERPWD:\n\t\t\tcase CURLOPT_USERNAME:\n\t\t\tcase CURLOPT_PASSWORD:\n\t\t\tcase CURLOPT_LOGIN_OPTIONS:\n\t\t\tcase CURLOPT_PROXYUSERNAME:\n\t\t\tcase CURLOPT_PROXYPASSWORD:\n\t\t\tcase CURLOPT_TLSAUTH_USERNAME:\n\t\t\tcase CURLOPT_TLSAUTH_PASSWORD:\n\t\t\tcase CURLOPT_XOAUTH2_BEARER:\n\t\t\tcase CURLOPT_ACCEPT_ENCODING:\n\t\t\tcase CURLOPT_POSTFIELDS:\n\t\t\tcase CURLOPT_COPYPOSTFIELDS:\n\t\t\tcase CURLOPT_REFERER:\n\t\t\tcase CURLOPT_USERAGENT:\n\t\t\tcase CURLOPT_COOKIE:\n\t\t\tcase CURLOPT_COOKIEFILE:\n\t\t\tcase CURLOPT_COOKIEJAR:\n\t\t\tcase CURLOPT_COOKIELIST:\n\t\t\tcase CURLOPT_MAIL_FROM:\n\t\t\tcase CURLOPT_MAIL_AUTH:\n\t\t\tcase CURLOPT_FTPPORT:\n\t\t\tcase CURLOPT_FTP_ALTERNATIVE_TO_USER:\n\t\t\tcase CURLOPT_FTP_ACCOUNT:\n\t\t\tcase CURLOPT_RTSP_SESSION_ID:\n\t\t\tcase CURLOPT_RTSP_STREAM_URI:\n\t\t\tcase CURLOPT_RTSP_TRANSPORT:\n\t\t\tcase CURLOPT_RANGE:\n\t\t\tcase CURLOPT_CUSTOMREQUEST:\n\t\t\tcase CURLOPT_DNS_INTERFACE:\n\t\t\tcase CURLOPT_DNS_LOCAL_IP4:\n\t\t\tcase CURLOPT_DNS_LOCAL_IP6:\n\t\t\tcase CURLOPT_SSLCERT:\n\t\t\tcase CURLOPT_SSLCERTTYPE:\n\t\t\tcase CURLOPT_SSLKEY:\n\t\t\tcase CURLOPT_SSLKEYTYPE:\n\t\t\tcase CURLOPT_KEYPASSWD:\n\t\t\tcase CURLOPT_SSLENGINE:\n\t\t\tcase CURLOPT_CAINFO:\n\t\t\tcase CURLOPT_ISSUERCERT:\n\t\t\tcase CURLOPT_CAPATH:\n\t\t\tcase CURLOPT_CRLFILE:\n\t\t\tcase CURLOPT_RANDOM_FILE:\n\t\t\tcase CURLOPT_EGDSOCKET:\n\t\t\tcase CURLOPT_SSL_CIPHER_LIST:\n\t\t\tcase CURLOPT_KRBLEVEL:\n\t\t\tcase CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:\n\t\t\tcase CURLOPT_SSH_PUBLIC_KEYFILE:\n\t\t\tcase CURLOPT_SSH_PRIVATE_KEYFILE:\n\t\t\tcase CURLOPT_SSH_KNOWNHOSTS:\n\t\t\tcase CURLOPT_PINNEDPUBLICKEY:\n\t\t\tcase CURLOPT_UNIX_SOCKET_PATH:\n\t\t\tcase CURLOPT_PROXY_SERVICE_NAME:\n\t\t\tcase CURLOPT_SERVICE_NAME:\n\t\t\tcase CURLOPT_DEFAULT_PROTOCOL:\n\t\t\tcase CURLOPT_PROXY_CAINFO:\n\t\t\tcase CURLOPT_PROXY_CAPATH:\n\t\t\tcase CURLOPT_PROXY_TLSAUTH_USERNAME:\n\t\t\tcase CURLOPT_PROXY_TLSAUTH_PASSWORD:\n\t\t\tcase CURLOPT_PROXY_TLSAUTH_TYPE:\n\t\t\tcase CURLOPT_PROXY_SSLCERT:\n\t\t\tcase CURLOPT_PROXY_SSLCERTTYPE:\n\t\t\tcase CURLOPT_PROXY_SSLKEY:\n\t\t\tcase CURLOPT_PROXY_SSLKEYTYPE:\n\t\t\tcase CURLOPT_PROXY_KEYPASSWD:\n\t\t\tcase CURLOPT_PROXY_SSL_CIPHER_LIST:\n\t\t\tcase CURLOPT_PROXY_CRLFILE:\n\t\t\tcase CURLOPT_PRE_PROXY:\n\t\t\tcase CURLOPT_PROXY_PINNEDPUBLICKEY:\n\t\t\tcase CURLOPT_ABSTRACT_UNIX_SOCKET:\n\t\t\tcase CURLOPT_REQUEST_TARGET:\n\t\t\t{\n\t\t\t\thl_vstring* str = (hl_vstring*)parameter;\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, str ? hl_to_utf8 (str->bytes) : NULL);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLOPT_IOCTLFUNCTION:\n\t\t\tcase CURLOPT_IOCTLDATA:\n\t\t\tcase CURLOPT_SEEKFUNCTION:\n\t\t\tcase CURLOPT_SEEKDATA:\n\t\t\tcase CURLOPT_SOCKOPTFUNCTION:\n\t\t\tcase CURLOPT_SOCKOPTDATA:\n\t\t\tcase CURLOPT_OPENSOCKETFUNCTION:\n\t\t\tcase CURLOPT_OPENSOCKETDATA:\n\t\t\tcase CURLOPT_CLOSESOCKETFUNCTION:\n\t\t\tcase CURLOPT_CLOSESOCKETDATA:\n\t\t\tcase CURLOPT_DEBUGFUNCTION:\n\t\t\tcase CURLOPT_DEBUGDATA:\n\t\t\tcase CURLOPT_SSL_CTX_FUNCTION:\n\t\t\tcase CURLOPT_SSL_CTX_DATA:\n\t\t\tcase CURLOPT_CONV_TO_NETWORK_FUNCTION:\n\t\t\tcase CURLOPT_CONV_FROM_NETWORK_FUNCTION:\n\t\t\tcase CURLOPT_CONV_FROM_UTF8_FUNCTION:\n\t\t\tcase CURLOPT_INTERLEAVEFUNCTION:\n\t\t\tcase CURLOPT_INTERLEAVEDATA:\n\t\t\tcase CURLOPT_CHUNK_BGN_FUNCTION:\n\t\t\tcase CURLOPT_CHUNK_END_FUNCTION:\n\t\t\tcase CURLOPT_CHUNK_DATA:\n\t\t\tcase CURLOPT_FNMATCH_FUNCTION:\n\t\t\tcase CURLOPT_FNMATCH_DATA:\n\t\t\tcase CURLOPT_STDERR:\n\t\t\tcase CURLOPT_HTTPPOST:\n\t\t\t//case CURLOPT_PROXYHEADER:\n\t\t\tcase CURLOPT_HTTP200ALIASES:\n\t\t\tcase CURLOPT_MAIL_RCPT:\n\t\t\tcase CURLOPT_QUOTE:\n\t\t\tcase CURLOPT_POSTQUOTE:\n\t\t\tcase CURLOPT_PREQUOTE:\n\t\t\tcase CURLOPT_RESOLVE:\n\t\t\tcase CURLOPT_SSH_KEYFUNCTION:\n\t\t\tcase CURLOPT_SSH_KEYDATA:\n\t\t\tcase CURLOPT_PRIVATE:\n\t\t\tcase CURLOPT_SHARE:\n\t\t\tcase CURLOPT_TELNETOPTIONS:\n\t\t\tcase CURLOPT_STREAM_DEPENDS:\n\t\t\tcase CURLOPT_STREAM_DEPENDS_E:\n\t\t\tcase CURLOPT_CONNECT_TO:\n\t\t\tcase CURLOPT_MIMEPOST:\n\n\t\t\t\t//todo\n\t\t\t\tbreak;\n\n\t\t\t//case CURLOPT_READDATA:\n\t\t\t//case CURLOPT_WRITEDATA:\n\t\t\t//case CURLOPT_HEADERDATA:\n\t\t\t//case CURLOPT_PROGRESSDATA:\n\n\t\t\tcase CURLOPT_READFUNCTION:\n\t\t\t{\n\t\t\t\t// curl_gc_mutex.Lock ();\n\t\t\t\t// ValuePointer* callback = new ValuePointer (parameter);\n\t\t\t\t// readCallbacks[handle] = callback;\n\t\t\t\t// code = curl_easy_setopt (easy_handle, type, read_callback);\n\t\t\t\t// curl_easy_setopt (easy_handle, CURLOPT_READDATA, handle);\n\t\t\t\t// curl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_READDATA:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (readBytes.find (handle) == readBytes.end ()) {\n\n\t\t\t\t\tdelete readBytesRoot[handle];\n\n\t\t\t\t}\n\n\t\t\t\treadBytes[handle] = bytes;\n\t\t\t\treadBytesPosition[handle] = 0;\n\t\t\t\treadBytesRoot[handle] = new ValuePointer ((vobj*)bytes);\n\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_SEEKFUNCTION, seek_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_SEEKDATA, handle);\n\t\t\t\tcode = curl_easy_setopt (easy_handle, CURLOPT_READFUNCTION, read_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_READDATA, handle);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_WRITEFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (writeCallbacks.find (handle) == writeCallbacks.end ()) {\n\n\t\t\t\t\tdelete writeCallbacks[handle];\n\t\t\t\t\tdelete writeBytesRoot[handle];\n\n\t\t\t\t}\n\n\t\t\t\tValuePointer* callback = new ValuePointer (parameter);\n\t\t\t\twriteCallbacks[handle] = callback;\n\t\t\t\twriteBytes[handle] = bytes;\n\t\t\t\twriteBytesRoot[handle] = new ValuePointer ((vobj*)bytes);\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, write_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_WRITEDATA, handle);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_HEADERFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (headerCallbacks.find (handle) != headerCallbacks.end ()) {\n\n\t\t\t\t\tfree_header_values (headerValues[handle]);\n\t\t\t\t\tdelete headerCallbacks[handle];\n\t\t\t\t\tdelete headerValues[handle];\n\n\t\t\t\t}\n\n\t\t\t\tValuePointer* callback = new ValuePointer (parameter);\n\t\t\t\theaderCallbacks[handle] = callback;\n\t\t\t\theaderValues[handle] = new std::vector<char*> ();\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, header_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_HEADERDATA, handle);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_PROGRESSFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (progressCallbacks.find (handle) != progressCallbacks.end ()) {\n\n\t\t\t\t\tdelete progressCallbacks[handle];\n\t\t\t\t\tdelete progressValues[handle];\n\n\t\t\t\t}\n\n\t\t\t\tprogressCallbacks[handle] = new ValuePointer (parameter);\n\t\t\t\tprogressValues[handle] = new CURL_Progress ();\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, progress_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_PROGRESSDATA, handle);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_NOPROGRESS, false);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase CURLOPT_XFERINFOFUNCTION:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (xferInfoCallbacks.find (handle) != xferInfoCallbacks.end ()) {\n\n\t\t\t\t\tdelete xferInfoCallbacks[handle];\n\t\t\t\t\tdelete xferInfoValues[handle];\n\n\t\t\t\t}\n\n\t\t\t\txferInfoCallbacks[handle] = new ValuePointer (parameter);\n\t\t\t\txferInfoValues[handle] = new CURL_XferInfo ();\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, xferinfo_callback);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_XFERINFODATA, handle);\n\t\t\t\tcurl_easy_setopt (easy_handle, CURLOPT_NOPROGRESS, false);\n\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase CURLOPT_HTTPHEADER:\n\t\t\t{\n\t\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t\t\tif (headerSLists.find (handle) != headerSLists.end ()) {\n\n\t\t\t\t\tcurl_slist_free_all (headerSLists[handle]);\n\n\t\t\t\t}\n\n\t\t\t\tstruct curl_slist *chunk = NULL;\n\t\t\t\tvarray* stringList = (varray*)parameter;\n\t\t\t\thl_vstring** stringListData = hl_aptr (stringList, hl_vstring*);\n\t\t\t\tint size = stringList->size;\n\t\t\t\thl_vstring* data;\n\n\t\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\t\tdata = *stringListData++;\n\t\t\t\t\tchunk = curl_slist_append (chunk, data ? hl_to_utf8 (data->bytes) : NULL);\n\n\t\t\t\t}\n\n\t\t\t\theaderSLists[handle] = chunk;\n\n\t\t\t\tcode = curl_easy_setopt (easy_handle, type, chunk);\n\t\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn code;\n\n\t}\n\n\n\tvalue lime_curl_easy_strerror (int errornum) {\n\n\t\tconst char* result = curl_easy_strerror ((CURLcode)errornum);\n\t\treturn result ? alloc_string (result) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_curl_easy_strerror) (int errornum) {\n\n\t\tconst char* result = curl_easy_strerror ((CURLcode)errornum);\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tvalue lime_curl_easy_unescape (value curl, HxString url, int inlength, int outlength) {\n\n\t\tchar* result = curl_easy_unescape ((CURL*)val_data(curl), url.__s, inlength, &outlength);\n\t\treturn result ? alloc_string (result) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_curl_easy_unescape) (HL_CFFIPointer* curl, hl_vstring* url, int inlength, int outlength) {\n\n\t\tchar* result = curl_easy_unescape ((CURL*)curl->ptr, url ? hl_to_utf8 (url->bytes) : NULL, inlength, &outlength);\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\t//lime_curl_formadd;\n\t//lime_curl_formfree;\n\t//lime_curl_formget;\n\n\n\tdouble lime_curl_getdate (HxString datestring, double now) {\n\n\t\ttime_t time = (time_t)now;\n\t\treturn curl_getdate (datestring.__s, &time);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_curl_getdate) (hl_vstring* datestring, double now) {\n\n\t\ttime_t time = (time_t)now;\n\t\treturn curl_getdate (datestring ? hl_to_utf8 (datestring->bytes) : NULL, &time);\n\n\t}\n\n\n\tvoid lime_curl_global_cleanup () {\n\n\t\tcurl_global_cleanup ();\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_curl_global_cleanup) () {\n\n\t\tcurl_global_cleanup ();\n\n\t}\n\n\n\tint lime_curl_global_init (int flags) {\n\n\t\treturn curl_global_init (flags);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_global_init) (int flags) {\n\n\t\treturn curl_global_init (flags);\n\n\t}\n\n\n\tint lime_curl_multi_cleanup (value multi_handle) {\n\n\t\t// curl_gc_mutex.Lock ();\n\n\t\t// CURLMcode result = curl_multi_cleanup ((CURLM*)val_data (multi_handle));\n\t\tgc_curl_multi (multi_handle);\n\n\t\t// curl_gc_mutex.Unlock ();\n\n\t\treturn CURLM_OK;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_cleanup) (HL_CFFIPointer* multi_handle) {\n\n\t\t// curl_gc_mutex.Lock ();\n\n\t\t// CURLMcode result = curl_multi_cleanup ((CURLM*)val_data (multi_handle));\n\t\thl_gc_curl_multi (multi_handle);\n\n\t\t// curl_gc_mutex.Unlock ();\n\n\t\treturn CURLM_OK;\n\n\t}\n\n\n\tvalue lime_curl_multi_init () {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tvalue handle = CFFIPointer (curl_multi_init (), gc_curl_multi);\n\n\t\tif (curlMultiValid.find (handle) != curlMultiValid.end ()) {\n\n\t\t\tprintf (\"Error: Duplicate cURL Multi handle\\n\");\n\n\t\t}\n\n\t\tcurlMultiValid[handle] = true;\n\t\tcurlMultiRunningHandles[handle] = 0;\n\t\tcurlMultiHandles[handle] = new std::vector<void*> ();\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn handle;\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_curl_multi_init) () {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tHL_CFFIPointer* handle = HLCFFIPointer (curl_multi_init (), (hl_finalizer)hl_gc_curl_multi);\n\n\t\tif (curlMultiValid.find (handle) != curlMultiValid.end ()) {\n\n\t\t\tprintf (\"Error: Duplicate cURL Multi handle\\n\");\n\n\t\t}\n\n\t\tcurlMultiValid[handle] = true;\n\t\tcurlMultiRunningHandles[handle] = 0;\n\t\tcurlMultiHandles[handle] = new std::vector<void*> ();\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn handle;\n\n\t}\n\n\n\tint lime_curl_multi_add_handle (value multi_handle, value curl_object, value curl_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURLMcode result = curl_multi_add_handle ((CURLM*)val_data (multi_handle), (CURL*)val_data (curl_handle));\n\n\t\tif (result == CURLM_OK) {\n\n\t\t\tcurlMultiReferences[curl_handle] = multi_handle;\n\t\t\tcurlMultiHandles[multi_handle]->push_back (curl_handle);\n\t\t\tcurlMultiObjects[curl_handle] = new ValuePointer (curl_object);\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_add_handle) (HL_CFFIPointer* multi_handle, vdynamic* curl_object, HL_CFFIPointer* curl_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURLMcode result = curl_multi_add_handle ((CURLM*)multi_handle->ptr, (CURL*)curl_handle->ptr);\n\n\t\tif (result == CURLM_OK) {\n\n\t\t\tcurlMultiReferences[curl_handle] = multi_handle;\n\t\t\tcurlMultiHandles[multi_handle]->push_back (curl_handle);\n\t\t\tcurlMultiObjects[curl_handle] = new ValuePointer (curl_object);\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn result;\n\n\t}\n\n\n\tint lime_curl_multi_get_running_handles (value multi_handle) {\n\n\t\treturn curlMultiRunningHandles[multi_handle];\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_get_running_handles) (HL_CFFIPointer* multi_handle) {\n\n\t\treturn curlMultiRunningHandles[multi_handle];\n\n\t}\n\n\n\tvalue lime_curl_multi_info_read (value multi_handle) {\n\n\t\tint msgs_in_queue;\n\t\tCURLMsg* msg = curl_multi_info_read ((CURLM*)val_data (multi_handle), &msgs_in_queue);\n\n\t\tif (msg) {\n\n\t\t\t//const field val_id (\"msg\");\n\t\t\tconst field id_curl = val_id (\"curl\");\n\t\t\tconst field id_result = val_id (\"result\");\n\n\t\t\tCURL* curl = msg->easy_handle;\n\t\t\tvalue result = alloc_empty_object ();\n\n\t\t\tif (curlObjects.find (curl) != curlObjects.end ()) {\n\n\t\t\t\tvalue handle = (value)curlObjects[curl];\n\t\t\t\talloc_field (result, id_curl, (value)curlMultiObjects[handle]->Get ());\n\n\t\t\t} else {\n\n\t\t\t\t// TODO?\n\t\t\t\talloc_field (result, id_curl, alloc_null ());\n\n\t\t\t}\n\n\t\t\talloc_field (result, id_result, alloc_int (msg->data.result));\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_curl_multi_info_read) (HL_CFFIPointer* multi_handle, vdynamic* result) {\n\n\t\tint msgs_in_queue;\n\t\tCURLMsg* msg = curl_multi_info_read ((CURLM*)multi_handle->ptr, &msgs_in_queue);\n\n\t\tif (msg) {\n\n\t\t\t//const field val_id (\"msg\");\n\t\t\tconst int id_curl = hl_hash_utf8 (\"curl\");\n\t\t\tconst int id_result = hl_hash_utf8 (\"result\");\n\n\t\t\tCURL* curl = msg->easy_handle;\n\n\t\t\tif (curlObjects.find (curl) != curlObjects.end ()) {\n\n\t\t\t\tHL_CFFIPointer* handle = (HL_CFFIPointer*)curlObjects[curl];\n\t\t\t\thl_dyn_setp (result, id_curl, &hlt_dyn, (vdynamic*)curlMultiObjects[handle]->Get ());\n\n\t\t\t} else {\n\n\t\t\t\t// TODO?\n\t\t\t\thl_dyn_setp (result, id_curl, &hlt_dyn, NULL);\n\n\t\t\t}\n\n\t\t\thl_dyn_seti (result, id_result, &hlt_i32, msg->data.result);\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tint lime_curl_multi_perform (value multi_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tint runningHandles = 0;\n\t\tCURLMcode result = curl_multi_perform ((CURLM*)val_data (multi_handle), &runningHandles);\n\n\t\tstd::vector<void*>* handles = curlMultiHandles[multi_handle];\n\n\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\tlime_curl_easy_flush ((value)*it);\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t}\n\n\t\tcurlMultiRunningHandles[multi_handle] = runningHandles;\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_perform) (HL_CFFIPointer* multi_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tint runningHandles = 0;\n\t\tCURLMcode result = curl_multi_perform ((CURLM*)multi_handle->ptr, &runningHandles);\n\n\t\tstd::vector<void*>* handles = curlMultiHandles[multi_handle];\n\n\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\tcurl_gc_mutex.Unlock ();\n\t\t\tlime_hl_curl_easy_flush ((HL_CFFIPointer*)*it);\n\t\t\tcurl_gc_mutex.Lock ();\n\n\t\t}\n\n\t\tcurlMultiRunningHandles[multi_handle] = runningHandles;\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn result;\n\n\t}\n\n\n\tint lime_curl_multi_remove_handle (value multi_handle, value curl_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURLMcode result = curl_multi_remove_handle ((CURLM*)val_data (multi_handle), (CURL*)val_data (curl_handle));\n\n\t\tif (/*result == CURLM_OK &&*/ curlMultiReferences.find (curl_handle) != curlMultiReferences.end ()) {\n\n\t\t\tcurlMultiReferences.erase (curl_handle);\n\n\t\t}\n\n\t\tstd::vector<void*>* handles = curlMultiHandles[multi_handle];\n\n\t\tif (handles->size () > 0) {\n\n\t\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\t\tif (*it == curl_handle) {\n\n\t\t\t\t\thandles->erase (it);\n\t\t\t\t\tdelete curlMultiObjects[curl_handle];\n\t\t\t\t\tcurlMultiObjects.erase (curl_handle);\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_remove_handle) (HL_CFFIPointer* multi_handle, HL_CFFIPointer* curl_handle) {\n\n\t\tcurl_gc_mutex.Lock ();\n\n\t\tCURLMcode result = curl_multi_remove_handle ((CURLM*)multi_handle->ptr, (CURL*)curl_handle->ptr);\n\n\t\tif (/*result == CURLM_OK &&*/ curlMultiReferences.find (curl_handle) != curlMultiReferences.end ()) {\n\n\t\t\tcurlMultiReferences.erase (curl_handle);\n\n\t\t}\n\n\t\tstd::vector<void*>* handles = curlMultiHandles[multi_handle];\n\n\t\tif (handles->size () > 0) {\n\n\t\t\tfor (std::vector<void*>::iterator it = handles->begin (); it != handles->end (); ++it) {\n\n\t\t\t\tif (*it == curl_handle) {\n\n\t\t\t\t\thandles->erase (it);\n\t\t\t\t\tdelete curlMultiObjects[curl_handle];\n\t\t\t\t\tcurlMultiObjects.erase (curl_handle);\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurl_gc_mutex.Unlock ();\n\n\t\treturn result;\n\n\t}\n\n\n\tint lime_curl_multi_setopt (value multi_handle, int option, value parameter) {\n\n\t\tCURLMcode code = CURLM_OK;\n\t\tCURLM* multi = (CURLM*)val_data (multi_handle);\n\t\tCURLMoption type = (CURLMoption)option;\n\n\t\tswitch (type) {\n\n\t\t\tcase CURLMOPT_PIPELINING:\n\n\t\t\t\tcode = curl_multi_setopt (multi, type, val_bool (parameter));\n\t\t\t\tbreak;\n\n\t\t\tcase CURLMOPT_MAXCONNECTS:\n\t\t\tcase CURLMOPT_MAX_HOST_CONNECTIONS:\n\t\t\tcase CURLMOPT_MAX_PIPELINE_LENGTH:\n\t\t\tcase CURLMOPT_MAX_TOTAL_CONNECTIONS:\n\t\t\tcase CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:\n\t\t\tcase CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:\n\n\t\t\t\tcode = curl_multi_setopt (multi, type, val_int (parameter));\n\t\t\t\tbreak;\n\n\t\t\tcase CURLMOPT_SOCKETFUNCTION:\n\t\t\tcase CURLMOPT_SOCKETDATA:\n\t\t\tcase CURLMOPT_TIMERFUNCTION:\n\t\t\tcase CURLMOPT_TIMERDATA:\n\t\t\tcase CURLMOPT_PUSHFUNCTION:\n\t\t\tcase CURLMOPT_PUSHDATA:\n\n\t\t\t\t// TODO?\n\t\t\t\tbreak;\n\n\t\t\tcase CURLMOPT_PIPELINING_SITE_BL:\n\t\t\tcase CURLMOPT_PIPELINING_SERVER_BL:\n\n\t\t\t\t// TODO, array to slist\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn code;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_setopt) (HL_CFFIPointer* multi_handle, int option, vdynamic* parameter) {\n\n\t\tCURLMcode code = CURLM_OK;\n\t\tCURLM* multi = (CURLM*)multi_handle->ptr;\n\t\tCURLMoption type = (CURLMoption)option;\n\n\t\tswitch (type) {\n\n\t\t\tcase CURLMOPT_PIPELINING:\n\n\t\t\t\tcode = curl_multi_setopt (multi, type, parameter->v.b);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLMOPT_MAXCONNECTS:\n\t\t\tcase CURLMOPT_MAX_HOST_CONNECTIONS:\n\t\t\tcase CURLMOPT_MAX_PIPELINE_LENGTH:\n\t\t\tcase CURLMOPT_MAX_TOTAL_CONNECTIONS:\n\t\t\tcase CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:\n\t\t\tcase CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:\n\n\t\t\t\tcode = curl_multi_setopt (multi, type, parameter->v.i);\n\t\t\t\tbreak;\n\n\t\t\tcase CURLMOPT_SOCKETFUNCTION:\n\t\t\tcase CURLMOPT_SOCKETDATA:\n\t\t\tcase CURLMOPT_TIMERFUNCTION:\n\t\t\tcase CURLMOPT_TIMERDATA:\n\t\t\tcase CURLMOPT_PUSHFUNCTION:\n\t\t\tcase CURLMOPT_PUSHDATA:\n\n\t\t\t\t// TODO?\n\t\t\t\tbreak;\n\n\t\t\tcase CURLMOPT_PIPELINING_SITE_BL:\n\t\t\tcase CURLMOPT_PIPELINING_SERVER_BL:\n\n\t\t\t\t// TODO, array to slist\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn code;\n\n\t}\n\n\n\tint lime_curl_multi_wait (value multi_handle, int timeout_ms) {\n\n\t\tSystem::GCEnterBlocking ();\n\n\t\tint retcode;\n\t\tCURLMcode result = curl_multi_wait ((CURLM*)val_data (multi_handle), 0, 0, timeout_ms, &retcode);\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn result;\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_curl_multi_wait) (HL_CFFIPointer* multi_handle, int timeout_ms) {\n\n\t\tSystem::GCEnterBlocking ();\n\n\t\tint retcode;\n\t\tCURLMcode result = curl_multi_wait ((CURLM*)multi_handle->ptr, 0, 0, timeout_ms, &retcode);\n\n\t\tSystem::GCExitBlocking ();\n\t\treturn result;\n\n\t}\n\n\n\t//lime_curl_multi_add_handle\n\t//lime_curl_multi_assign\n\t//lime_curl_multi_cleanup\n\t//lime_curl_multi_fdset\n\t//lime_curl_multi_info_read\n\t//lime_curl_multi_init\n\t//lime_curl_multi_perform\n\t//lime_curl_multi_remove_handle\n\t//lime_curl_multi_setopt\n\t//lime_curl_multi_socket\n\t//lime_curl_multi_socket_action\n\t//lime_curl_multi_strerror\n\t//lime_curl_multi_timeout\n\n\t//lime_curl_share_cleanup\n\t//lime_curl_share_init\n\t//lime_curl_share_setopt\n\t//lime_curl_share_strerror\n\n\t//lime_curl_slist_append\n\t//lime_curl_slist_free_all\n\n\n\tvalue lime_curl_version () {\n\n\t\tchar* result = curl_version ();\n\t\treturn result ? alloc_string (result) : alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_curl_version) () {\n\n\t\tchar* result = curl_version ();\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tvalue lime_curl_version_info (int type) {\n\n\t\tcurl_version_info_data* data = curl_version_info ((CURLversion)type);\n\n\t\t// TODO\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vdynamic* HL_NAME(hl_curl_version_info) (int type) {\n\n\t\tcurl_version_info_data* data = curl_version_info ((CURLversion)type);\n\n\t\t// TODO\n\n\t\treturn NULL;\n\n\t}\n\n\n\tDEFINE_PRIME1v (lime_curl_easy_cleanup);\n\tDEFINE_PRIME1 (lime_curl_easy_duphandle);\n\tDEFINE_PRIME3 (lime_curl_easy_escape);\n\tDEFINE_PRIME2 (lime_curl_easy_getinfo);\n\tDEFINE_PRIME0 (lime_curl_easy_init);\n\tDEFINE_PRIME1v (lime_curl_easy_flush);\n\tDEFINE_PRIME2 (lime_curl_easy_pause);\n\tDEFINE_PRIME1 (lime_curl_easy_perform);\n\tDEFINE_PRIME4 (lime_curl_easy_recv);\n\tDEFINE_PRIME1v (lime_curl_easy_reset);\n\tDEFINE_PRIME4 (lime_curl_easy_send);\n\tDEFINE_PRIME4 (lime_curl_easy_setopt);\n\tDEFINE_PRIME1 (lime_curl_easy_strerror);\n\tDEFINE_PRIME4 (lime_curl_easy_unescape);\n\tDEFINE_PRIME2 (lime_curl_getdate);\n\tDEFINE_PRIME0v (lime_curl_global_cleanup);\n\tDEFINE_PRIME1 (lime_curl_global_init);\n\tDEFINE_PRIME1 (lime_curl_multi_cleanup);\n\tDEFINE_PRIME0 (lime_curl_multi_init);\n\tDEFINE_PRIME3 (lime_curl_multi_add_handle);\n\tDEFINE_PRIME1 (lime_curl_multi_get_running_handles);\n\tDEFINE_PRIME1 (lime_curl_multi_info_read);\n\tDEFINE_PRIME1 (lime_curl_multi_perform);\n\tDEFINE_PRIME2 (lime_curl_multi_remove_handle);\n\tDEFINE_PRIME3 (lime_curl_multi_setopt);\n\tDEFINE_PRIME2 (lime_curl_multi_wait);\n\tDEFINE_PRIME0 (lime_curl_version);\n\tDEFINE_PRIME1 (lime_curl_version_info);\n\n\n\t#define _TBYTES _OBJ (_I32 _BYTES)\n\t#define _TCFFIPOINTER _DYN\n\n\tDEFINE_HL_PRIM (_VOID, hl_curl_easy_cleanup, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_curl_easy_duphandle, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BYTES, hl_curl_easy_escape, _TCFFIPOINTER _STRING _I32);\n\tDEFINE_HL_PRIM (_DYN, hl_curl_easy_getinfo, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_curl_easy_init, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_curl_easy_flush, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_curl_easy_pause, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_I32, hl_curl_easy_perform, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_curl_easy_recv, _TCFFIPOINTER _F64 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_curl_easy_reset, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_curl_easy_send, _TCFFIPOINTER _F64 _I32 _I32);\n\tDEFINE_HL_PRIM (_I32, hl_curl_easy_setopt, _TCFFIPOINTER _I32 _DYN _TBYTES);\n\tDEFINE_HL_PRIM (_BYTES, hl_curl_easy_strerror, _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_curl_easy_unescape, _TCFFIPOINTER _STRING _I32 _I32);\n\tDEFINE_HL_PRIM (_F64, hl_curl_getdate, _STRING _F64);\n\tDEFINE_HL_PRIM (_VOID, hl_curl_global_cleanup, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_curl_global_init, _I32);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_cleanup, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_curl_multi_init, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_add_handle, _TCFFIPOINTER _DYN _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_get_running_handles, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_DYN, hl_curl_multi_info_read, _TCFFIPOINTER _DYN);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_perform, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_remove_handle, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_setopt, _TCFFIPOINTER _I32 _DYN);\n\tDEFINE_HL_PRIM (_I32, hl_curl_multi_wait, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_BYTES, hl_curl_version, _NO_ARG);\n\tDEFINE_HL_PRIM (_DYN, hl_curl_version_info, _I32);\n\n\n}\n\n\nextern \"C\" int lime_curl_register_prims () {\n\n\treturn 0;\n\n}\n"
  },
  {
    "path": "project/src/system/CFFI.cpp",
    "content": "#include <system/CFFI.h>\n\n\n#ifndef LIME_HASHLINK\n\nHL_API int hl_type_size( hl_type *t ) { return 0; }\nHL_API int hl_pad_struct( int size, hl_type *t ) { return 0; }\n\nHL_API hl_runtime_obj *hl_get_obj_rt( hl_type *ot ) { return NULL; }\nHL_API hl_runtime_obj *hl_get_obj_proto( hl_type *ot ) { return NULL; }\nHL_API void hl_flush_proto( hl_type *ot ) {}\nHL_API void hl_init_enum( hl_type *et, hl_module_context *m ) {}\n\nhl_type hlt_void = hl_type ();\nhl_type hlt_i32 = hl_type ();\nhl_type hlt_i64 = hl_type ();\nhl_type hlt_f64 = hl_type ();\nhl_type hlt_f32 = hl_type ();\nhl_type hlt_dyn = hl_type ();\nhl_type hlt_array = hl_type ();\nhl_type hlt_bytes = hl_type ();\nhl_type hlt_dynobj = hl_type ();\nhl_type hlt_bool = hl_type ();\nhl_type hlt_abstract = hl_type ();\n\nHL_API double hl_nan( void ) { return 0; }\nHL_API bool hl_is_dynamic( hl_type *t ) { return false; }\nHL_API bool hl_same_type( hl_type *a, hl_type *b ) { return false; }\nHL_API bool hl_safe_cast( hl_type *t, hl_type *to ) { return false; }\n\nHL_API varray *hl_alloc_array( hl_type *t, int size ) { return NULL; }\nHL_API vdynamic *hl_alloc_dynamic( hl_type *t ) { return NULL; }\nHL_API vdynamic *hl_alloc_dynbool( bool b ) { return NULL; }\nHL_API vdynamic *hl_alloc_obj( hl_type *t ) { return NULL; }\nHL_API venum *hl_alloc_enum( hl_type *t, int index ) { return NULL; }\nHL_API vvirtual *hl_alloc_virtual( hl_type *t ) { return NULL; }\nHL_API vdynobj *hl_alloc_dynobj( void ) { return 0; }\nHL_API vbyte *hl_alloc_bytes( int size ) { return NULL; }\nHL_API vbyte *hl_copy_bytes( const vbyte *byte, int size ) { return NULL; }\nHL_API int hl_utf8_length( const vbyte *s, int pos ) { return 0; }\nHL_API int hl_from_utf8( uchar *out, int outLen, const char *str ) { return 0; }\nHL_API char *hl_to_utf8( const uchar *bytes ) { return 0; }\nHL_API uchar *hl_to_utf16( const char *str ) { return NULL; }\nHL_API vdynamic *hl_virtual_make_value( vvirtual *v ) { return NULL; }\nHL_API hl_obj_field *hl_obj_field_fetch( hl_type *t, int fid ) { return NULL; }\n\nHL_API int hl_hash( vbyte *name ) { return 0; }\nHL_API int hl_hash_utf8 ( const char *str ) { return 0; } // no cache\nHL_API int hl_hash_gen( const uchar *name, bool cache_name ) { return 0; }\nHL_API vbyte *hl_field_name( int hash ) { return NULL; }\n\nHL_API void hl_error_msg( const uchar *msg, ... ) {}\nHL_API void hl_assert( void ) {}\nHL_API void hl_throw( vdynamic *v ) { throw \"\"; }\nHL_API void hl_rethrow( vdynamic *v ) { throw \"\"; }\nHL_API void hl_setup_longjump( void *j ) {}\nHL_API void hl_setup_exception( void *resolve_symbol, void *capture_stack ) {}\nHL_API void hl_dump_stack( void ) {}\nHL_API varray *hl_exception_stack( void ) { return NULL; }\nHL_API bool hl_detect_debugger( void ) { return false; }\n\nHL_API vvirtual *hl_to_virtual( hl_type *vt, vdynamic *obj ) { return NULL; }\nHL_API void hl_init_virtual( hl_type *vt, hl_module_context *ctx ) {}\nHL_API hl_field_lookup *hl_lookup_find( hl_field_lookup *l, int size, int hash ) { return NULL; }\nHL_API hl_field_lookup *hl_lookup_insert( hl_field_lookup *l, int size, int hash, hl_type *t, int index ) { return NULL; }\n\nHL_API int hl_dyn_geti( vdynamic *d, int hfield, hl_type *t ) { return 0; }\nHL_API void *hl_dyn_getp( vdynamic *d, int hfield, hl_type *t ) { return NULL; }\nHL_API float hl_dyn_getf( vdynamic *d, int hfield ) { return 0; }\nHL_API double hl_dyn_getd( vdynamic *d, int hfield ) { return 0; }\n\nHL_API int hl_dyn_casti( void *data, hl_type *t, hl_type *to ) { return 0; }\nHL_API void *hl_dyn_castp( void *data, hl_type *t, hl_type *to ) { return NULL; }\nHL_API float hl_dyn_castf( void *data, hl_type *t ) { return 0; }\nHL_API double hl_dyn_castd( void *data, hl_type *t ) { return 0; }\n\nHL_API int hl_dyn_compare( vdynamic *a, vdynamic *b ) { return 0; }\nHL_API vdynamic *hl_make_dyn( void *data, hl_type *t ) { return NULL; }\nHL_API void hl_write_dyn( void *data, hl_type *t, vdynamic *v, bool is_tmp ) {}\n\nHL_API void hl_dyn_seti( vdynamic *d, int hfield, hl_type *t, int value ) {}\nHL_API void hl_dyn_setp( vdynamic *d, int hfield, hl_type *t, void *ptr ) {}\nHL_API void hl_dyn_setf( vdynamic *d, int hfield, float f ) {}\nHL_API void hl_dyn_setd( vdynamic *d, int hfield, double v ) {}\n\nHL_API vdynamic *hl_dyn_op( int op, vdynamic *a, vdynamic *b ) { return NULL; }\n\nHL_API vclosure *hl_alloc_closure_void( hl_type *t, void *fvalue ) { return NULL; }\nHL_API vclosure *hl_alloc_closure_ptr( hl_type *fullt, void *fvalue, void *ptr ) { return NULL; }\nHL_API vclosure *hl_make_fun_wrapper( vclosure *c, hl_type *to ) { return NULL; }\nHL_API void *hl_wrapper_call( void *value, void **args, vdynamic *ret ) { return NULL; }\nHL_API void *hl_dyn_call_obj( vdynamic *obj, hl_type *ft, int hfield, void **args, vdynamic *ret ) { return NULL; }\nHL_API vdynamic *hl_dyn_call( vclosure *c, vdynamic **args, int nargs ) { return 0; }\nHL_API vdynamic *hl_dyn_call_safe( vclosure *c, vdynamic **args, int nargs, bool *isException ) { return NULL; }\n\nHL_API hl_thread *hl_thread_start( void *callback, void *param, bool withGC ) { return NULL; }\nHL_API hl_thread *hl_thread_current( void ) { return NULL; }\nHL_API void hl_thread_yield(void) {}\nHL_API void hl_register_thread( void *stack_top ) {}\nHL_API void hl_unregister_thread( void ) {}\n\nHL_API hl_mutex *hl_mutex_alloc( bool gc_thread ) { return NULL; }\nHL_API void hl_mutex_acquire( hl_mutex *l ) {}\nHL_API bool hl_mutex_try_acquire( hl_mutex *l ) { return false; }\nHL_API void hl_mutex_release( hl_mutex *l ) {}\nHL_API void hl_mutex_free( hl_mutex *l ) {}\n\nHL_API hl_tls *hl_tls_alloc( bool gc_value ) { return NULL; }\nHL_API void hl_tls_set( hl_tls *l, void *value ) {}\nHL_API void *hl_tls_get( hl_tls *l );\nHL_API void hl_tls_free( hl_tls *l ) {}\n\nHL_API void *hl_gc_alloc_gen( hl_type *t, int size, int flags ) { return 0; }\nHL_API void hl_add_root( void *ptr ) {}\nHL_API void hl_remove_root( void *ptr ) {}\nHL_API void hl_gc_major( void ) {}\nHL_API bool hl_is_gc_ptr( void *ptr ) { return false; }\n\nHL_API void hl_blocking( bool b ) {}\nHL_API bool hl_is_blocking( void ) { return false; }\n\nHL_API void hl_gc_set_dump_types( hl_types_dump tdump ) {}\n\nHL_API void hl_alloc_init( hl_alloc *a ) {}\nHL_API void *hl_malloc( hl_alloc *a, int size ) { return NULL; }\nHL_API void *hl_zalloc( hl_alloc *a, int size ) { return NULL; }\nHL_API void hl_free( hl_alloc *a ) {}\n\nHL_API void hl_global_init( void ) {}\nHL_API void hl_global_free( void ) {}\n\nHL_API void *hl_alloc_executable_memory( int size ) { return NULL; }\nHL_API void hl_free_executable_memory( void *ptr, int size ) {}\n\nHL_API hl_buffer *hl_alloc_buffer( void ) { return NULL; }\nHL_API void hl_buffer_val( hl_buffer *b, vdynamic *v ) {}\nHL_API void hl_buffer_char( hl_buffer *b, uchar c ) {}\nHL_API void hl_buffer_str( hl_buffer *b, const uchar *str ) {}\nHL_API void hl_buffer_cstr( hl_buffer *b, const char *str ) {}\nHL_API void hl_buffer_str_sub( hl_buffer *b, const uchar *str, int len ) {}\nHL_API int hl_buffer_length( hl_buffer *b ) { return 0; }\nHL_API uchar *hl_buffer_content( hl_buffer *b, int *len ) { return NULL; }\nHL_API uchar *hl_to_string( vdynamic *v ) { return NULL; }\nHL_API const uchar *hl_type_str( hl_type *t ) { return NULL; }\n\nHL_API void *hl_fatal_error( const char *msg, const char *file, int line ) { return NULL; }\nHL_API void hl_fatal_fmt( const char *file, int line, const char *fmt, ...) {}\nHL_API void hl_sys_init(void **args, int nargs, void *hlfile) {}\nHL_API void hl_setup_callbacks(void *sc, void *gw) {}\nHL_API void hl_setup_reload_check( void *freload, void *param ) {}\n\nHL_API hl_thread_info *hl_get_thread() { return NULL; }\n\n#endif"
  },
  {
    "path": "project/src/system/CFFIPointer.cpp",
    "content": "#include <system/CFFIPointer.h>\n\n\nnamespace lime {\n\n\n\tvalue CFFIPointer (void* ptr, hx::finalizer finalizer) {\n\n\t\tif (ptr) {\n\n\t\t\tvalue handle = cffi::alloc_pointer (ptr);\n\n\t\t\tif (finalizer) {\n\n\t\t\t\tval_gc (handle, finalizer);\n\n\t\t\t}\n\n\t\t\treturn handle;\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tvalue CFFIPointer (value handle, hx::finalizer finalizer) {\n\n\t\tif (!val_is_null (handle) && finalizer) {\n\n\t\t\tval_gc (handle, finalizer);\n\n\t\t}\n\n\t\treturn handle;\n\n\t}\n\n\n\tHL_CFFIPointer* HLCFFIPointer (void* handle, hl_finalizer finalizer) {\n\n\t\tif (handle) {\n\n\t\t\tHL_CFFIPointer* pointer = (HL_CFFIPointer*)hl_gc_alloc_finalizer (sizeof (HL_CFFIPointer));\n\t\t\tpointer->finalizer = finalizer ? (void*)finalizer : 0;\n\t\t\tpointer->ptr = handle;\n\t\t\treturn pointer;\n\n\t\t} else {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/ClipboardEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <system/ClipboardEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* ClipboardEvent::callback = 0;\n\tValuePointer* ClipboardEvent::eventObject = 0;\n\n\tstatic int id_type;\n\tstatic bool init = false;\n\n\n\tClipboardEvent::ClipboardEvent () {\n\n\t\ttype = CLIPBOARD_UPDATE;\n\n\t}\n\n\n\tvoid ClipboardEvent::Dispatch (ClipboardEvent* event) {\n\n\t\tif (ClipboardEvent::callback) {\n\n\t\t\tif (ClipboardEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)ClipboardEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\n\t\t\t} else {\n\n\t\t\t\tClipboardEvent* eventObject = (ClipboardEvent*)ClipboardEvent::eventObject->Get ();\n\n\t\t\t\teventObject->type = event->type;\n\n\t\t\t}\n\n\t\t\tClipboardEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/Display.cpp",
    "content": "#include <system/Display.h>\n#include <math/Rectangle.h>\n\n\nnamespace lime {\n\n\n\tvoid Display::GetSafeAreaInsets (int displayIndex, Rectangle * rect) {\n\n\t\trect->SetTo(0.0, 0.0, 0.0, 0.0);\n\t}\n\n}"
  },
  {
    "path": "project/src/system/Display.mm",
    "content": "#ifdef HX_MACOS\n#import <Cocoa/Cocoa.h>\n#else\n#import <UIKit/UIKit.h>\n#endif\n\n#include <system/Display.h>\n#include <math/Rectangle.h>\n\n\nnamespace lime {\n\n\n\tvoid Display::GetSafeAreaInsets (int displayIndex, Rectangle * rect) {\n\n\t\t#ifdef HX_MACOS\n\n\t\tif (@available(macOS 12, *)) {\n\n\t\t\tNSScreen * screen = [[NSScreen screens] objectAtIndex: displayIndex];\n\t\t\tNSEdgeInsets safeAreaInsets = [screen safeAreaInsets];\n\t\t\trect->SetTo(safeAreaInsets.left,\n\t\t\t\t\tsafeAreaInsets.top,\n\t\t\t\t\tsafeAreaInsets.right,\n\t\t\t\t\tsafeAreaInsets.bottom);\n\t\t\treturn;\n\n\t\t}\n\n\t\t#endif\n\n\t\t#ifdef IPHONE\n\n\t\tif (@available(iOS 11, *)) {\n\n\t\t\tUIWindow * window = [[UIApplication sharedApplication] keyWindow];\n\t\t\tUIEdgeInsets safeAreaInsets = [window safeAreaInsets];\n\t\t\trect->SetTo(safeAreaInsets.left,\n\t\t\t\t\tsafeAreaInsets.top,\n\t\t\t\t\tsafeAreaInsets.right,\n\t\t\t\t\tsafeAreaInsets.bottom);\n\t\t\treturn;\n\n\t\t}\n\n\t\t#endif\n\n\t\trect->SetTo(0.0, 0.0, 0.0, 0.0);\n\n\t}\n\n}"
  },
  {
    "path": "project/src/system/DisplayMode.cpp",
    "content": "#include <system/DisplayMode.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_height;\n\tstatic int id_pixelFormat;\n\tstatic int id_refreshRate;\n\tstatic int id_width;\n\tstatic bool init = false;\n\n\n\tDisplayMode::DisplayMode () {\n\n\t\twidth = 0;\n\t\theight = 0;\n\t\tpixelFormat = RGBA32;\n\t\trefreshRate = 0;\n\n\t}\n\n\n\tDisplayMode::DisplayMode (value displayMode) {\n\n\t\twidth = val_int (val_field (displayMode, id_width));\n\t\theight = val_int (val_field (displayMode, id_height));\n\t\tpixelFormat = (PixelFormat)val_int (val_field (displayMode, id_pixelFormat));\n\t\trefreshRate = val_int (val_field (displayMode, id_refreshRate));\n\n\t}\n\n\n\tDisplayMode::DisplayMode (int _width, int _height, PixelFormat _pixelFormat, int _refreshRate) {\n\n\t\twidth = _width;\n\t\theight = _height;\n\t\tpixelFormat = _pixelFormat;\n\t\trefreshRate = _refreshRate;\n\n\t}\n\n\n\tvoid DisplayMode::CopyFrom (DisplayMode* other) {\n\n\t\theight = other->height;\n\t\tpixelFormat = other->pixelFormat;\n\t\trefreshRate = other->refreshRate;\n\t\twidth = other->width;\n\n\t}\n\n\n\tvoid* DisplayMode::Value () {\n\n\t\t// if (_mode) {\n\n\t\t// \t_mode->height = height;\n\t\t// \t_mode->pixelFormat = pixelFormat;\n\t\t// \t_mode->refreshRate = refreshRate;\n\t\t// \t_mode->width = width;\n\t\t// \treturn _mode;\n\n\t\t// } else {\n\n\t\t\tif (!init) {\n\n\t\t\t\tid_height = val_id (\"height\");\n\t\t\t\tid_pixelFormat = val_id (\"pixelFormat\");\n\t\t\t\tid_refreshRate = val_id (\"refreshRate\");\n\t\t\t\tid_width = val_id (\"width\");\n\t\t\t\tinit = true;\n\n\t\t\t}\n\n\t\t\tvalue displayMode = alloc_empty_object ();\n\t\t\talloc_field (displayMode, id_height, alloc_int (height));\n\t\t\talloc_field (displayMode, id_pixelFormat, alloc_int (pixelFormat));\n\t\t\talloc_field (displayMode, id_refreshRate, alloc_int (refreshRate));\n\t\t\talloc_field (displayMode, id_width, alloc_int (width));\n\t\t\treturn displayMode;\n\n\t\t// }\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/FileWatcher.cpp",
    "content": "// include order is important\n#include <efsw/efsw.hpp>\n#include <system/FileWatcher.h>\n\n\nnamespace lime {\n\n\n\tclass UpdateListener : public efsw::FileWatchListener {\n\n\t\tpublic:\n\n\t\t\tUpdateListener (FileWatcher* _watcher) {\n\n\t\t\t\twatcher = _watcher;\n\n\t\t\t}\n\n\t\t\tvoid handleFileAction (efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename = \"\") {\n\n\t\t\t\tFileWatcherEvent event = { watchid, std::string (dir.begin (), dir.end ()), std::string (filename.begin (), filename.end ()), action, oldFilename };\n\t\t\t\twatcher->QueueEvent (event);\n\n\t\t\t}\n\n\t\t\tFileWatcher* watcher;\n\n\t};\n\n\n\tFileWatcher::FileWatcher (value _callback) {\n\n\t\tcallback = new AutoGCRoot (_callback);\n\t\tfileWatcher = new efsw::FileWatcher ();\n\t\tmutex = 0;\n\n\t}\n\n\n\tFileWatcher::~FileWatcher () {\n\n\t\tdelete callback;\n\t\tdelete (efsw::FileWatcher*)fileWatcher;\n\n\t\tif (mutex) {\n\n\t\t\tdelete mutex;\n\n\t\t}\n\n\t\tstd::map<long, void*>::iterator it;\n\n\t\tfor (it = listeners.begin (); it != listeners.end (); it++) {\n\n\t\t\tdelete (UpdateListener*)listeners[it->first];\n\n\t\t}\n\n\t}\n\n\n\tlong FileWatcher::AddDirectory (std::string directory, bool recursive) {\n\n\t\tUpdateListener* listener = new UpdateListener (this);\n\t\tefsw::WatchID watchID = ((efsw::FileWatcher*)fileWatcher)->addWatch (directory, listener, true);\n\n\t\tif (watchID >= 0) {\n\n\t\t\tlisteners[watchID] = listener;\n\n\t\t\tif (!mutex) {\n\n\t\t\t\tmutex = new Mutex ();\n\t\t\t\t((efsw::FileWatcher*)fileWatcher)->watch ();\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn watchID;\n\n\t}\n\n\n\tvoid FileWatcher::QueueEvent (FileWatcherEvent event) {\n\n\t\tmutex->Lock ();\n\t\tqueue.push_back (event);\n\t\tmutex->Unlock ();\n\n\t}\n\n\n\tvoid FileWatcher::RemoveDirectory (long watchID) {\n\n\t\t((efsw::FileWatcher*)fileWatcher)->removeWatch (watchID);\n\n\t\tif (listeners.find (watchID) != listeners.end ()) {\n\n\t\t\tdelete (UpdateListener*)listeners[watchID];\n\t\t\tlisteners.erase (watchID);\n\n\t\t}\n\n\t}\n\n\n\tvoid FileWatcher::Update () {\n\n\t\tif (mutex) {\n\n\t\t\tmutex->Lock ();\n\n\t\t\tint size = queue.size ();\n\n\t\t\tif (size > 0) {\n\n\t\t\t\tFileWatcherEvent event;\n\t\t\t\tvalue _callback = callback->get ();\n\n\t\t\t\tfor (int i = 0; i < size; i++) {\n\n\t\t\t\t\tevent = queue[i];\n\t\t\t\t\tvalue args[4] = { alloc_string (event.dir.c_str ()), alloc_string (event.file.c_str ()), alloc_int (event.action), alloc_string (event.oldFile.c_str ()) };\n\t\t\t\t\tval_callN (_callback, args, 4);\n\n\t\t\t\t}\n\n\t\t\t\tqueue.clear ();\n\n\t\t\t}\n\n\t\t\tmutex->Unlock ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/JNI.cpp",
    "content": "#include <system/CFFI.h>\n#include <system/JNI.h>\n#include <utils/Object.h>\n#include <jni.h>\n#include <pthread.h>\n#include <android/log.h>\n#include <SDL.h>\n#include <map>\n#include <string>\n\n#define ELOG(args...) __android_log_print (ANDROID_LOG_ERROR, \"Lime\", args)\n\n#ifdef __GNUC__\n#define JAVA_EXPORT __attribute__ ((visibility(\"default\"))) JNIEXPORT\n#else\n#define JAVA_EXPORT JNIEXPORT\n#endif\n\n\nnamespace lime {\n\n\n\tvkind gObjectKind;\n\n\n\tinline void release_object (value inValue) {\n\n\t\tif (val_is_kind (inValue, gObjectKind)) {\n\n\t\t\tObject* obj = (Object*)val_to_kind (inValue, gObjectKind);\n\n\t\t\tif (obj) {\n\n\t\t\t\tobj->DecRef ();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tinline value ObjectToAbstract (Object *inObject) {\n\n\t\tinObject->IncRef ();\n\t\tvalue result = alloc_abstract (gObjectKind, inObject);\n\t\tval_gc (result, release_object);\n\t\treturn result;\n\n\t}\n\n\n\ttemplate<typename OBJ>\n\tbool AbstractToObject (value inValue, OBJ *&outObj) {\n\n\t\toutObj = 0;\n\n\t\tif (!val_is_kind (inValue, gObjectKind)) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tObject* obj = (Object*)val_to_kind (inValue, gObjectKind);\n\t\toutObj = dynamic_cast<OBJ*> (obj);\n\t\treturn outObj;\n\n\t}\n\n\n\tvoid CheckException (JNIEnv *env, bool inThrow = true) {\n\n\t\tjthrowable exc = env->ExceptionOccurred ();\n\n\t\tif (exc) {\n\n\t\t\tenv->ExceptionDescribe ();\n\t\t\tenv->ExceptionClear ();\n\n\t\t\tif (inThrow) {\n\n\t\t\t\tval_throw (alloc_string (\"JNI Exception\"));\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tstd::map<std::string, jclass> jClassCache;\n\n\n\tjclass FindClass (const char *className, bool inQuiet = false) {\n\n\t\tstd::string cppClassName (className);\n\t\tjclass ret;\n\n\t\tif (jClassCache[cppClassName] != NULL) {\n\n\t\t\tret = jClassCache[cppClassName];\n\n\t\t} else {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tjclass tmp = env->FindClass (className);\n\n\t\t\tif (!tmp) {\n\n\t\t\t\tif (inQuiet) {\n\n\t\t\t\t\tjthrowable exc = env->ExceptionOccurred ();\n\n\t\t\t\t\tif (exc) {\n\n\t\t\t\t\t\tenv->ExceptionClear ();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tCheckException (env);\n\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\tret = (jclass)env->NewGlobalRef (tmp);\n\t\t\tjClassCache[cppClassName] = ret;\n\t\t\tenv->DeleteLocalRef (tmp);\n\n\t\t}\n\n\t\treturn ret;\n\n\t}\n\n\n\tstruct AutoHaxe {\n\n\n\t\tint base;\n\t\tconst char *message;\n\n\n\t\tAutoHaxe (const char *inMessage) {\n\n\t\t\tbase = 0;\n\t\t\tmessage = inMessage;\n\t\t\tgc_set_top_of_stack (&base, true);\n\t\t\t//__android_log_print (ANDROID_LOG_VERBOSE, \"Lime\", \"Enter %s %p\", message, pthread_self ());\n\n\t\t}\n\n\n\t\t~AutoHaxe () {\n\n\t\t\t//__android_log_print (ANDROID_LOG_VERBOSE, \"Lime\", \"Leave %s %p\", message, pthread_self ());\n\t\t\tgc_set_top_of_stack (0, true);\n\n\t\t}\n\n\n\t};\n\n\n\tstatic bool sInit = false;\n\tjclass GameActivity;\n\tjclass ObjectClass;\n\tjmethodID postUICallback;\n\tjmethodID isArrayClass;\n\tjclass HaxeObject;\n\tjclass ValueObject;\n\tjmethodID HaxeObject_create;\n\tjfieldID __haxeHandle;\n\n\n\tenum JNIElement {\n\n\t\tjniUnknown,\n\t\tjniObjectString,\n\t\tjniObjectHaxe,\n\t\tjniValueObject,\n\t\tjniObject,\n\t\tjniPODStart,\n\t\tjniBoolean = jniPODStart,\n\t\tjniByte,\n\t\tjniChar,\n\t\tjniShort,\n\t\tjniInt,\n\t\tjniLong,\n\t\tjniFloat,\n\t\tjniDouble,\n\t\tjniVoid,\n\t\tjniELEMENTS\n\n\t};\n\n\n\tstd::string ClassNameOf (JNIEnv *inEnv, jclass inObject) {\n\n\t\tif (inObject == 0) {\n\n\t\t\treturn \"NULL\";\n\n\t\t} else {\n\n\t\t\tjclass classClass = FindClass (\"java/lang/Class\");\n\t\t\tjmethodID mid_getName = inEnv->GetMethodID (classClass, \"getName\", \"()Ljava/lang/String;\");\n\t\t\tjstring name = (jstring)inEnv->CallObjectMethod (inObject, mid_getName);\n\t\t\tjthrowable exc = inEnv->ExceptionOccurred ();\n\n\t\t\tif (exc) {\n\n\t\t\t\tinEnv->ExceptionClear ();\n\n\t\t\t}\n\n\t\t\tjboolean is_copy;\n\t\t\tconst char *utf8 = inEnv->GetStringUTFChars (name, &is_copy);\n\t\t\tstd::string result = utf8;\n\t\t\tinEnv->ReleaseStringUTFChars (name, utf8);\n\t\t\tinEnv->DeleteLocalRef (name);\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\n\tstd::string ClassOf (JNIEnv *inEnv, jobject inObject) {\n\n\t\tif (inObject == 0) {\n\n\t\t\treturn \"NULL\";\n\n\t\t} else {\n\n\t\t\tjclass cls = inEnv->GetObjectClass (inObject);\n\t\t\treturn ClassNameOf (inEnv, cls);\n\n\t\t}\n\n\t}\n\n\n\tstruct JNIType {\n\n\n\t\ttypedef std::map<JNIType,jclass> ClassMap;\n\n\t\tJNIType () : element (jniUnknown), arrayDepth (0) { }\n\t\tJNIType (JNIElement inElem, int inDepth) : element (inElem), arrayDepth (inDepth) { }\n\t\tJNIType elemType () { return (arrayDepth > 0) ? JNIType (element, arrayDepth - 1) : JNIType (); }\n\n\n\t\tbool isUnknownType () const { return element == jniUnknown && arrayDepth == 0; }\n\t\tbool isUnknown () const { return element == jniUnknown; }\n\t\tbool isObject () const { return element < jniPODStart || arrayDepth > 0; }\n\n\t\tbool operator < (const JNIType &inRHS) const {\n\n\t\t\tif (arrayDepth!=inRHS.arrayDepth) {\n\n\t\t\t\treturn arrayDepth<inRHS.arrayDepth;\n\n\t\t\t}\n\n\t\t\treturn element < inRHS.element;\n\n\t\t}\n\n\n\t\tjclass getClass (JNIEnv *inEnv) {\n\n\t\t\tif (!isObject ()) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\tif (arrayDepth > 1 || (arrayDepth == 1 && element < jniPODStart)) {\n\n\t\t\t\treturn ObjectClass;\n\n\t\t\t}\n\n\t\t\tClassMap::iterator i = mClasses.find (*this);\n\n\t\t\tif (i != mClasses.end ()) {\n\n\t\t\t\treturn i->second;\n\n\t\t\t}\n\n\t\t\tstd::string name (arrayDepth ? \"[\" : \"\");\n\n\t\t\tswitch (element) {\n\n\t\t\t\tcase jniObjectString: name += \"java/lang/String\"; break;\n\t\t\t\tcase jniObjectHaxe: name += \"org/haxe/lime/HaxeObject\"; break;\n\t\t\t\tcase jniValueObject: name += \"org/haxe/lime/Value\"; break;\n\n\t\t\t\tcase jniUnknown:\n\t\t\t\tcase jniObject: name += \"java/lang/Object\"; break;\n\n\t\t\t\tcase jniBoolean: name += \"Z\"; break;\n\t\t\t\tcase jniVoid: name += \"V\"; break;\n\t\t\t\tcase jniByte: name += \"B\"; break;\n\t\t\t\tcase jniChar: name += \"C\"; break;\n\t\t\t\tcase jniShort: name += \"S\"; break;\n\t\t\t\tcase jniInt: name += \"I\"; break;\n\t\t\t\tcase jniLong: name += \"J\"; break;\n\t\t\t\tcase jniFloat: name += \"F\"; break;\n\t\t\t\tcase jniDouble: name += \"D\"; break;\n\n\t\t\t\tdefault:\n\t\t\t\t\tmClasses[*this] = 0;\n\t\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\tjclass result = inEnv->FindClass (name.c_str ());\n\n\t\t\tif (result) {\n\n\t\t\t\tmClasses[*this] = (jclass)inEnv->NewGlobalRef (result);\n\t\t\t\tinEnv->DeleteLocalRef (result);\n\n\t\t\t}\n\n\t\t\treturn mClasses[*this];\n\n\t\t}\n\n\n\t\tstatic void init (JNIEnv *inEnv) {\n\n\t\t\tfor (int i = 0; i < jniELEMENTS; i++) {\n\n\t\t\t\telementGetValue[i] = 0;\n\n\t\t\t}\n\n\t\t\telementClass[jniBoolean] = FindClass (\"java/lang/Boolean\");\n\t\t\telementGetValue[jniBoolean] = inEnv->GetMethodID (elementClass[jniBoolean], \"booleanValue\", \"()Z\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniByte] = FindClass (\"java/lang/Byte\");\n\t\t\telementGetValue[jniByte] = inEnv->GetMethodID (elementClass[jniByte], \"doubleValue\", \"()D\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniChar] = FindClass (\"java/lang/Character\");\n\t\t\telementGetValue[jniChar] = inEnv->GetMethodID (elementClass[jniChar], \"charValue\", \"()C\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniShort] = FindClass (\"java/lang/Short\");\n\t\t\telementGetValue[jniShort] = inEnv->GetMethodID (elementClass[jniShort], \"doubleValue\", \"()D\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniInt] = FindClass (\"java/lang/Integer\");\n\t\t\telementGetValue[jniInt] = inEnv->GetMethodID (elementClass[jniInt], \"doubleValue\", \"()D\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniLong] = FindClass (\"java/lang/Long\");\n\t\t\telementGetValue[jniLong] = inEnv->GetMethodID (elementClass[jniLong], \"doubleValue\", \"()D\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniFloat] = FindClass (\"java/lang/Float\");\n\t\t\telementGetValue[jniFloat] = inEnv->GetMethodID (elementClass[jniFloat], \"doubleValue\", \"()D\");\n\t\t\tCheckException (inEnv, false);\n\n\t\t\telementClass[jniDouble] = FindClass (\"java/lang/Double\");\n\t\t\telementGetValue[jniDouble] = inEnv->GetMethodID (elementClass[jniDouble], \"doubleValue\", \"()D\");\n\t\t\tCheckException (inEnv, false);\n\t\t\telementClass[jniVoid] = 0;\n\n\t\t\tfor (int i = 0; i < jniELEMENTS; i++) {\n\n\t\t\t\tJNIType type ((JNIElement)i, 1);\n\n\t\t\t\tif (i == jniVoid) {\n\n\t\t\t\t\telementArrayClass[i] = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telementArrayClass[i] = type.getClass (inEnv);\n\n\t\t\t\t}\n\n\t\t\t\tif (i < jniPODStart) {\n\n\t\t\t\t\telementClass[i] = JNIType ((JNIElement)i, 0).getClass (inEnv);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//ELOG(\"POD type %d = %p\", i, elementClass[i]);\n\n\t\t\t\t}\n\n\t\t\t\tCheckException (inEnv, false);\n\n\t\t\t}\n\n\t\t\telementGetValue[jniValueObject] = inEnv->GetMethodID (elementClass[jniValueObject], \"getDouble\", \"()D\");\n\n\t\t}\n\n\n\t\tJNIElement element;\n\t\tstatic jclass elementClass[jniELEMENTS];\n\t\tstatic jclass elementArrayClass[jniELEMENTS];\n\t\tstatic jmethodID elementGetValue[jniELEMENTS];\n\t\tint arrayDepth;\n\t\tstatic ClassMap mClasses;\n\n\n\t};\n\n\n\tJNIType::ClassMap JNIType::mClasses;\n\t//JNIType JNIType::elementClass[jniELEMENTS];\n\tjclass JNIType::elementClass[jniELEMENTS];\n\tjmethodID JNIType::elementGetValue[jniELEMENTS];\n\tjclass JNIType::elementArrayClass[jniELEMENTS];\n\n\tAutoGCRoot *gCallback = 0;\n\n\n\tvoid JNIInit (JNIEnv *env) {\n\n\t\tif (sInit) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tGameActivity = FindClass (\"org/haxe/lime/GameActivity\");\n\t\tpostUICallback = env->GetStaticMethodID (GameActivity, \"postUICallback\", \"(J)V\");\n\n\t\tObjectClass = FindClass (\"java/lang/Object\");\n\t\tValueObject = FindClass (\"org/haxe/lime/Value\");\n\n\t\tHaxeObject = JNIType (jniObjectHaxe, 0).getClass (env);\n\t\tHaxeObject_create = env->GetStaticMethodID (HaxeObject, \"create\", \"(J)Lorg/haxe/lime/HaxeObject;\");\n\t\t__haxeHandle = env->GetFieldID (HaxeObject, \"__haxeHandle\", \"J\");\n\n\t\tjclass classClass = FindClass (\"java/lang/Class\");\n\t\tisArrayClass = env->GetMethodID (classClass, \"isArray\", \"()Z\");\n\n\t\tJNIType::init (env);\n\n\t\tsInit = true;\n\n\t}\n\n\n\tvalue lime_jni_init_callback (value inCallback) {\n\n\t\tif (!gCallback) {\n\n\t\t\tgCallback = new AutoGCRoot (inCallback);\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\tDEFINE_PRIME1 (lime_jni_init_callback);\n\n\n\tstruct JavaHaxeReference {\n\n\t\tJavaHaxeReference (value inValue) : root (inValue) {\n\n\t\t\trefCount = 1;\n\n\t\t}\n\n\t\tint refCount;\n\t\tAutoGCRoot root;\n\n\t};\n\n\n\ttypedef std::map<value, JavaHaxeReference*> JavaHaxeReferenceMap;\n\tJavaHaxeReferenceMap gJavaObjects;\n\tbool gJavaObjectsMutexInit = false;\n\tpthread_mutex_t gJavaObjectsMutex;\n\n\n\tjobject CreateJavaHaxeObjectRef (JNIEnv *env, value inValue) {\n\n\t\tJNIInit (env);\n\n\t\tif (!gJavaObjectsMutexInit) {\n\n\t\t\tgJavaObjectsMutexInit = false;\n\t\t\tpthread_mutex_init (&gJavaObjectsMutex, 0);\n\n\t\t}\n\n\t\tpthread_mutex_lock (&gJavaObjectsMutex);\n\t\tJavaHaxeReferenceMap::iterator it = gJavaObjects.find (inValue);\n\n\t\tif (it != gJavaObjects.end ()) {\n\n\t\t\tit->second->refCount++;\n\n\t\t} else {\n\n\t\t\tgJavaObjects[inValue] = new JavaHaxeReference (inValue);\n\n\t\t}\n\n\t\tpthread_mutex_unlock (&gJavaObjectsMutex);\n\n\t\tjobject result = env->CallStaticObjectMethod (HaxeObject, HaxeObject_create, (jlong)inValue);\n\t\tjthrowable exc = env->ExceptionOccurred ();\n\t\tCheckException (env);\n\n\t\treturn result;\n\n\t}\n\n\n\tvoid RemoveJavaHaxeObjectRef (value inValue) {\n\n\t\tpthread_mutex_lock (&gJavaObjectsMutex);\n\n\t\tJavaHaxeReferenceMap::iterator it = gJavaObjects.find (inValue);\n\n\t\tif (it != gJavaObjects.end ()) {\n\n\t\t\tit->second->refCount--;\n\n\t\t\tif (!it->second->refCount) {\n\n\t\t\t\tdelete it->second;\n\t\t\t\tgJavaObjects.erase (it);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tELOG (\"Bad jni reference count\");\n\n\t\t}\n\n\t\tpthread_mutex_unlock (&gJavaObjectsMutex);\n\n\t}\n\n\n\tstruct JNIObject : public lime::Object {\n\n\t\tJNIObject (jobject inObject) {\n\n\t\t\tmObject = inObject;\n\n\t\t\tif (mObject) {\n\n\t\t\t\tmObject = ((JNIEnv*)JNI::GetEnv ())->NewGlobalRef (mObject);\n\n\t\t\t}\n\n\t\t}\n\n\t\t~JNIObject () {\n\n\t\t\tif (mObject) {\n\n\t\t\t\t((JNIEnv*)JNI::GetEnv ())->DeleteGlobalRef (mObject);\n\n\t\t\t}\n\n\t\t}\n\n\t\toperator jobject () { return mObject; }\n\t\tjobject GetJObject () { return mObject; }\n\t\tjobject mObject;\n\n\t};\n\n\n\tbool AbstractToJObject (value inValue, jobject &outObject) {\n\n\t\tJNIObject *jniobj = 0;\n\n\t\tif (AbstractToObject (inValue, jniobj)) {\n\n\t\t\toutObject = jniobj->GetJObject ();\n\t\t\treturn true;\n\n\t\t}\n\n\t\tstatic int id__jobject = -1;\n\n\t\tif (id__jobject < 0) {\n\n\t\t\tid__jobject = val_id (\"__jobject\");\n\n\t\t}\n\n\t\tvalue jobj = val_field (inValue, id__jobject);\n\n\t\tif (val_is_null (jobj)) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn AbstractToJObject (jobj, outObject);\n\n\t}\n\n\n\tvalue JStringToHaxe (JNIEnv *inEnv, jobject inObject) {\n\n\t\tjboolean is_copy;\n\t\tconst char *str = inEnv->GetStringUTFChars ((jstring)inObject, &is_copy);\n\t\tvalue result = alloc_string (str);\n\t\tinEnv->ReleaseStringUTFChars ((jstring)inObject, str);\n\t\treturn result;\n\n\t}\n\n\n\tvalue JObjectToHaxeObject (JNIEnv *env, jobject inObject) {\n\n\t\tif (inObject) {\n\n\t\t\tjlong val = env->GetLongField (inObject, __haxeHandle);\n\t\t\treturn (value)val;\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\t#define ARRAY_SET(PRIM,JTYPE,CREATE) \\\n\t\tcase jni##PRIM: \\\n\t\t{ \\\n\t\t\tif (len > 0) {\\\n\t\t\t\t\\\n\t\t\t\tjboolean copy; \\\n\t\t\t\tJTYPE *data = inEnv->Get##PRIM##ArrayElements ((JTYPE##Array)inObject, &copy); \\\n\t\t\t\tfor (int i = 0; i < len; i++) { \\\n\t\t\t\t\t\\\n\t\t\t\t\tval_array_set_i (result, i, CREATE (data[i])); \\\n\t\t\t\t\t\\\n\t\t\t\t} \\\n\t\t\t\t\\\n\t\t\t\tinEnv->Release##PRIM##ArrayElements ((JTYPE##Array)inObject, data, JNI_ABORT); \\\n\t\t\t\t\\\n\t\t\t} \\\n\t\t\t\\\n\t\t}\\\n\t\tbreak;\n\n\n\tvoid DebugObject (JNIEnv *inEnv, const char *inMessage, jobject inObject) {\n\n\t\tif (inObject == 0) {\n\n\t\t\tELOG (\"%s : null\", inMessage);\n\n\t\t} else {\n\n\t\t\tjclass cls = inEnv->GetObjectClass (inObject);\n\t\t\tjmethodID mid = inEnv->GetMethodID (cls, \"toString\", \"()V\");\n\t\t\tjthrowable exc = inEnv->ExceptionOccurred ();\n\n\t\t\tif (exc) {\n\n\t\t\t\tinEnv->ExceptionClear ();\n\n\t\t\t}\n\n\t\t\tCheckException (inEnv, false);\n\n\t\t\tif (mid) {\n\n\t\t\t\tjstring str = (jstring)inEnv->CallObjectMethod (cls, mid);\n\n\t\t\t\tjboolean is_copy;\n\t\t\t\tconst char *utf8 = inEnv->GetStringUTFChars (str, &is_copy);\n\t\t\t\tELOG (\"%s : '%s'\", inMessage, utf8);\n\t\t\t\tinEnv->ReleaseStringUTFChars (str, utf8);\n\t\t\t\tinEnv->DeleteLocalRef (str);\n\n\t\t\t} else {\n\n\t\t\t\tELOG (\"%s : no toString in class '%s'\", inMessage, ClassOf (inEnv, inObject).c_str ());\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tvalue JObjectToHaxe (JNIEnv *inEnv, JNIType inType, jobject inObject) {\n\n\t\tif (inObject == 0) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tif (inType.isUnknownType ()) {\n\n\t\t\tjclass cls = inEnv->GetObjectClass (inObject);\n\n\t\t\tif (cls) {\n\n\t\t\t\tfor (int i = 0; i < jniELEMENTS; i++) {\n\n\t\t\t\t\tif (JNIType::elementClass[i] == 0) continue;\n\n\t\t\t\t\tif (inEnv->IsSameObject (cls, JNIType::elementClass[i])) {\n\n\t\t\t\t\t\tinType = JNIType ((JNIElement)i, 0);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif (inType.isUnknownType ()) {\n\n\t\t\t\t\tfor (int i = 0; i < jniELEMENTS; i++) {\n\n\t\t\t\t\t\tif (JNIType::elementArrayClass[i] == 0) continue;\n\n\t\t\t\t\t\tif (inEnv->IsSameObject (cls, JNIType::elementArrayClass[i])) {\n\n\t\t\t\t\t\t\tinType = JNIType ((JNIElement)i, 1);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif (inType.isUnknownType ()) {\n\n\t\t\t\t\tif (inEnv->CallBooleanMethod (cls, isArrayClass)) {\n\n\t\t\t\t\t\tinType = JNIType (jniUnknown, 1);\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (inType.isUnknownType ()) {\n\n\t\t\t\tinType = JNIType (jniObject, 0);\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (inType.arrayDepth > 1 || (inType.arrayDepth == 1 && inType.element < jniPODStart)) {\n\n\t\t\tint len = inEnv->GetArrayLength ((jarray)inObject);\n\t\t\tvalue result = alloc_array (len);\n\t\t\tJNIType child = inType.elemType ();\n\n\t\t\tfor (int i = 0; i < len; i++) {\n\n\t\t\t\tval_array_set_i (result, i, JObjectToHaxe (inEnv, child, inEnv->GetObjectArrayElement ((jobjectArray)inObject, i)));\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t} else if (inType.arrayDepth == 1) {\n\n\t\t\tint len = inEnv->GetArrayLength ((jarray)inObject);\n\t\t\tvalue result = alloc_array (len);\n\n\t\t\tswitch (inType.element) {\n\n\t\t\t\tARRAY_SET (Boolean, jboolean, alloc_bool)\n\t\t\t\t//ARRAY_SET (Byte, jbyte, alloc_int)\n\t\t\t\tARRAY_SET (Char, jchar, alloc_int)\n\t\t\t\tARRAY_SET (Short, jshort, alloc_int)\n\t\t\t\tARRAY_SET (Int, jint, alloc_int)\n\t\t\t\tARRAY_SET (Long, jlong, alloc_int)\n\t\t\t\tARRAY_SET (Float, jfloat, alloc_float)\n\t\t\t\tARRAY_SET (Double, jdouble, alloc_float)\n\n\t\t\t\tcase jniByte:\n\t\t\t\t{\n\t\t\t\t\tif (len > 0) {\n\n\t\t\t\t\t\tjboolean copy;\n\t\t\t\t\t\tjbyte *data = inEnv->GetByteArrayElements ((jbyteArray)inObject, &copy);\n\n\t\t\t\t\t\tfor (int i = 0; i < len; i++) {\n\n\t\t\t\t\t\t\tval_array_set_i (result, i, alloc_int (data[i]));\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinEnv->ReleaseByteArrayElements ((jbyteArray)inObject, data, JNI_ABORT);\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\tswitch (inType.element) {\n\n\t\t\t\tcase jniObject:\n\t\t\t\t{\n\t\t\t\t\tJNIObject *obj = new JNIObject (inObject);\n\t\t\t\t\treturn ObjectToAbstract (obj);\n\t\t\t\t}\n\n\t\t\t\tcase jniObjectHaxe:\n\n\t\t\t\t\treturn JObjectToHaxeObject (inEnv, inObject);\n\n\t\t\t\tcase jniObjectString:\n\n\t\t\t\t\treturn JStringToHaxe (inEnv, inObject);\n\n\t\t\t\tcase jniVoid:\n\n\t\t\t\t\treturn alloc_null ();\n\n\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\treturn alloc_bool (inEnv->CallBooleanMethod (inObject, JNIType::elementGetValue[jniBoolean]));\n\n\t\t\t\tcase jniChar:\n\n\t\t\t\t\treturn alloc_int (inEnv->CallCharMethod (inObject, JNIType::elementGetValue[jniChar]));\n\n\t\t\t\tcase jniShort:\n\t\t\t\tcase jniByte:\n\t\t\t\tcase jniInt:\n\t\t\t\tcase jniLong:\n\t\t\t\tcase jniFloat:\n\t\t\t\tcase jniDouble:\n\t\t\t\tcase jniValueObject:\n\n\t\t\t\t\treturn alloc_float (inEnv->CallDoubleMethod (inObject, JNIType::elementGetValue[inType.element]));\n\n\t\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tjclass cls = inEnv->GetObjectClass (inObject);\n\n\t\t\t\t\tif (cls) {\n\n\t\t\t\t\t\tjmethodID mid = inEnv->GetMethodID (cls, \"toString\", \"()V\");\n\n\t\t\t\t\t\tif (mid) {\n\n\t\t\t\t\t\t\tjstring str = (jstring)inEnv->CallObjectMethod (cls, mid);\n\t\t\t\t\t\t\tvalue result = JStringToHaxe (inEnv, str);\n\t\t\t\t\t\t\tinEnv->DeleteLocalRef (str);\n\t\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tconst char *JNIParseType (const char *inStr, JNIType &outType, int inDepth = 0) {\n\n\t\tswitch (*inStr++) {\n\n\t\t\tcase 'B': outType = JNIType (jniByte, inDepth); return inStr;\n\t\t\tcase 'C': outType = JNIType (jniChar, inDepth); return inStr;\n\t\t\tcase 'D': outType = JNIType (jniDouble, inDepth); return inStr;\n\t\t\tcase 'F': outType = JNIType (jniFloat, inDepth); return inStr;\n\t\t\tcase 'I': outType = JNIType (jniInt, inDepth); return inStr;\n\t\t\tcase 'J': outType = JNIType (jniLong, inDepth); return inStr;\n\t\t\tcase 'S': outType = JNIType (jniShort, inDepth); return inStr;\n\t\t\tcase 'V': outType = JNIType (jniVoid, inDepth); return inStr;\n\t\t\tcase 'Z': outType = JNIType (jniBoolean, inDepth); return inStr;\n\t\t\tcase '[':\n\t\t\t{\n\t\t\t\treturn JNIParseType (inStr, outType, inDepth + 1);\n\t\t\t}\n\t\t\tcase 'L':\n\t\t\t{\n\t\t\t\tconst char *src = inStr;\n\n\t\t\t\twhile (*inStr != '\\0' && *inStr != ';' && *inStr != ')') {\n\n\t\t\t\t\tinStr++;\n\n\t\t\t\t}\n\n\t\t\t\tif (*inStr != ';') {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif (!strncmp (src, \"java/lang/String;\", 17) || !strncmp (src, \"java/lang/CharSequence;\", 23)) {\n\n\t\t\t\t\toutType = JNIType (jniObjectString, inDepth);\n\n\t\t\t\t} else if (!strncmp(src,\"org/haxe/lime/HaxeObject;\", 25)) {\n\n\t\t\t\t\toutType = JNIType (jniObjectHaxe, inDepth);\n\n\t\t\t\t} else {\n\n\t\t\t\t\toutType = JNIType (jniObject, inDepth);\n\n\t\t\t\t}\n\n\t\t\t\treturn inStr + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\toutType = JNIType ();\n\t\treturn inStr;\n\n\t}\n\n\n\t#define ARRAY_COPY(PRIM,JTYPE) \\\n\t\t\t\tcase jni##PRIM: \\\n\t\t\t\t{ \\\n\t\t\t\t\tJTYPE##Array arr = inEnv->New##PRIM##Array (len); \\\n\t\t\t\t\t\\\n\t\t\t\t\tif (len > 0) { \\\n\t\t\t\t\t\\\n\t\t\t\t\t\tjboolean copy; \\\n\t\t\t\t\t\tJTYPE *data = inEnv->Get##PRIM##ArrayElements (arr, &copy); \\\n\t\t\t\t\t\t\\\n\t\t\t\t\t\tfor (int i = 0; i < len; i++) { \\\n\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\tdata[i] = (JTYPE)val_number (val_array_i (inValue, i)); \\\n\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t} \\\n\t\t\t\t\t\t\\\n\t\t\t\t\t\tinEnv->Release##PRIM##ArrayElements (arr, data, 0); \\\n\t\t\t\t\t\t\\\n\t\t\t\t\t} \\\n\t\t\t\t\t\\\n\t\t\t\t\tout.l = arr; \\\n\t\t\t\t\treturn true; \\\n\t\t\t\t\t\\\n\t\t\t\t}\n\n\n\tbool HaxeToJNI (JNIEnv *inEnv, value inValue, JNIType inType, jvalue &out) {\n\n\t\tif (inType.isUnknown ()) {\n\n\t\t\treturn false;\n\n\t\t} else if (inType.arrayDepth > 1 || (inType.arrayDepth == 1 && inType.element < jniPODStart)) {\n\n\t\t\tint len = val_array_size (inValue);\n\t\t\tJNIType etype = inType.elemType ();\n\t\t\tjclass cls = etype.getClass (inEnv);\n\n\t\t\tif (!cls) {\n\n\t\t\t\tcls = JNIType (jniObject, inType.arrayDepth - 1).getClass (inEnv);\n\n\t\t\t}\n\n\t\t\tjobjectArray arr = (jobjectArray)inEnv->NewObjectArray (len, cls, 0);\n\n\t\t\tfor (int i = 0; i < len; i++) {\n\n\t\t\t\tjvalue elem_i;\n\t\t\t\tHaxeToJNI (inEnv, val_array_i (inValue, i), etype, elem_i);\n\t\t\t\tinEnv->SetObjectArrayElement (arr, i, elem_i.l);\n\n\t\t\t}\n\n\t\t\tout.l = arr;\n\t\t\treturn true;\n\n\t\t} else if (inType.arrayDepth == 1) {\n\n\t\t\tint len = val_array_size (inValue);\n\n\t\t\tswitch (inType.element) {\n\n\t\t\t\tARRAY_COPY (Boolean, jboolean)\n\t\t\t\t//ARRAY_COPY (Byte, jbyte)\n\t\t\t\tARRAY_COPY (Char, jchar)\n\t\t\t\tARRAY_COPY (Short, jshort)\n\t\t\t\tARRAY_COPY (Int, jint)\n\t\t\t\tARRAY_COPY (Long, jlong)\n\t\t\t\tARRAY_COPY (Float, jfloat)\n\t\t\t\tARRAY_COPY (Double, jdouble)\n\n\t\t\t\tcase jniByte:\n\t\t\t\t{\n\t\t\t\t\tjbyteArray arr = inEnv->NewByteArray (len);\n\n\t\t\t\t\tif (len > 0) {\n\n\t\t\t\t\t\tjboolean copy;\n\t\t\t\t\t\tjbyte *data = inEnv->GetByteArrayElements (arr, &copy);\n\n\t\t\t\t\t\tfor (int i = 0; i < len; i++) {\n\n\t\t\t\t\t\t\tdata[i] = (int)val_number (val_array_i (inValue, i));\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinEnv->ReleaseByteArrayElements (arr, data, 0);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tout.l = arr;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tcase jniVoid:\n\n\t\t\t\t\tout.l = 0;\n\t\t\t\t\treturn true;\n\n\t\t\t\tdefault: {}\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\n\t\t\tswitch (inType.element) {\n\n\t\t\t\tcase jniObjectString:\n\t\t\t\t{\n\t\t\t\t\tout.l = inEnv->NewStringUTF (val_string (inValue));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcase jniObjectHaxe:\n\n\t\t\t\t\tout.l = CreateJavaHaxeObjectRef(inEnv,inValue);\n\t\t\t\t\treturn true;\n\n\t\t\t\tcase jniObject:\n\t\t\t\t{\n\t\t\t\t\tjobject obj = 0;\n\n\t\t\t\t\tif (!AbstractToJObject (inValue, obj)) {\n\n\t\t\t\t\t\tif (val_is_string (inValue)) {\n\n\t\t\t\t\t\t\tout.l = inEnv->NewStringUTF (val_string (inValue));\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tELOG (\"HaxeToJNI : jniObject not an object %p\", inValue);\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tout.l = obj;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcase jniBoolean: out.z = (bool)val_number (inValue); return true;\n\t\t\t\tcase jniByte: out.b = (int)val_number (inValue); return true;\n\t\t\t\tcase jniChar: out.c = (int)val_number (inValue); return true;\n\t\t\t\tcase jniShort: out.s = (int)val_number (inValue); return true;\n\t\t\t\tcase jniInt: out.i = (int)val_number (inValue); return true;\n\t\t\t\tcase jniLong: out.j = (long)val_number (inValue); return true;\n\t\t\t\tcase jniFloat: out.f = (float)val_number (inValue); return true;\n\t\t\t\tcase jniDouble: out.d = val_number (inValue); return true;\n\t\t\t\tcase jniVoid: out.l = 0; return true;\n\t\t\t\tdefault: {}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\tstruct JNIField : public lime::Object {\n\n\n\t\tJNIField (HxString inClass, HxString inField, HxString inSignature, bool inStatic) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tJNIInit (env);\n\n\t\t\tmClass = 0;\n\t\t\tmField = 0;\n\t\t\tmFieldType = JNIType (jniVoid, 0);\n\n\t\t\tconst char *field = inField.__s;\n\n\t\t\tmClass = FindClass (inClass.__s);\n\t\t\tconst char *signature = inSignature.__s;\n\n\t\t\tif (mClass) {\n\n\t\t\t\tif (inStatic) {\n\n\t\t\t\t\tmField = env->GetStaticFieldID (mClass, field, signature);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmField = env->GetFieldID (mClass, field, signature);\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Ok ()) {\n\n\t\t\t\tbool ok = ParseSignature (signature);\n\n\t\t\t\tif (!ok) {\n\n\t\t\t\t\tELOG (\"Bad JNI signature: %s\", signature);\n\t\t\t\t\tmField = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t~JNIField () {\n\n\n\n\t\t}\n\n\n\t\tbool ParseSignature (const char *inSig) {\n\n\t\t\tJNIParseType (inSig, mFieldType);\n\t\t\treturn (!mFieldType.isUnknown ());\n\n\t\t}\n\n\n\t\tbool Ok () const {\n\n\t\t\treturn mField != 0;\n\n\t\t}\n\n\n\t\tvalue GetStatic () {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tvalue result = 0;\n\n\t\t\tif (mFieldType.isObject ()) {\n\n\t\t\t\tresult = JObjectToHaxe (env, mFieldType, env->GetStaticObjectField (mClass, mField));\n\n\t\t\t} else {\n\n\t\t\t\tswitch (mFieldType.element) {\n\n\t\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\t\tresult = alloc_bool (env->GetStaticBooleanField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniByte:\n\n\t\t\t\t\t\tresult = alloc_int (env->GetStaticByteField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniChar:\n\n\t\t\t\t\t\tresult = alloc_int (env->GetStaticCharField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniShort:\n\n\t\t\t\t\t\tresult = alloc_int (env->GetStaticShortField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniInt:\n\n\t\t\t\t\t\tresult = alloc_int (env->GetStaticIntField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniLong:\n\n\t\t\t\t\t\tresult = alloc_int (env->GetStaticLongField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniFloat:\n\n\t\t\t\t\t\tresult = alloc_float (env->GetStaticFloatField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniDouble:\n\n\t\t\t\t\t\tresult = alloc_float (env->GetStaticDoubleField (mClass, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: {}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tCheckException (env);\n\t\t\treturn result;\n\n\t\t}\n\n\n\t\tvoid SetStatic (value inValue) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tjvalue setValue;\n\n\t\t\tif (!HaxeToJNI (env, inValue, mFieldType, setValue)) {\n\n\t\t\t\tELOG (\"SetStatic - bad value\");\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif (mFieldType.isObject ()) {\n\n\t\t\t\tenv->SetStaticObjectField (mClass, mField, setValue.l);\n\n\t\t\t} else {\n\n\t\t\t\tswitch (mFieldType.element) {\n\n\t\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\t\tenv->SetStaticBooleanField (mClass, mField, setValue.z);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniByte:\n\n\t\t\t\t\t\tenv->SetStaticByteField (mClass, mField, setValue.b);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniChar:\n\n\t\t\t\t\t\tenv->SetStaticCharField (mClass, mField, setValue.c);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniShort:\n\n\t\t\t\t\t\tenv->SetStaticShortField (mClass, mField, setValue.s);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniInt:\n\n\t\t\t\t\t\tenv->SetStaticIntField (mClass, mField, setValue.i);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniLong:\n\n\t\t\t\t\t\tenv->SetStaticLongField (mClass, mField, setValue.j);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniFloat:\n\n\t\t\t\t\t\tenv->SetStaticFloatField (mClass, mField, setValue.f);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniDouble:\n\n\t\t\t\t\t\tenv->SetStaticDoubleField (mClass, mField, setValue.d);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: {}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tCheckException (env);\n\n\t\t}\n\n\n\t\tvalue GetMember (jobject inObject) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tvalue result = 0;\n\n\t\t\tif (mFieldType.isObject ()) {\n\n\t\t\t\tresult = JObjectToHaxe (env, mFieldType, env->GetObjectField (inObject, mField));\n\n\t\t\t} else {\n\n\t\t\t\tswitch (mFieldType.element) {\n\n\t\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\t\tresult = alloc_bool(env->GetBooleanField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniByte:\n\n\t\t\t\t\t\tresult = alloc_int(env->GetByteField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniChar:\n\n\t\t\t\t\t\tresult = alloc_int(env->GetCharField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniShort:\n\n\t\t\t\t\t\tresult = alloc_int(env->GetShortField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniInt:\n\n\t\t\t\t\t\tresult = alloc_int(env->GetIntField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniLong:\n\n\t\t\t\t\t\tresult = alloc_int(env->GetLongField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniFloat:\n\n\t\t\t\t\t\tresult = alloc_float(env->GetFloatField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniDouble:\n\n\t\t\t\t\t\tresult = alloc_float(env->GetDoubleField (inObject, mField));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: {}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tCheckException (env);\n\t\t\treturn result;\n\n\t\t}\n\n\n\t\tvoid SetMember (jobject inObject, value inValue) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tjvalue setValue;\n\n\t\t\tif (!HaxeToJNI (env, inValue, mFieldType, setValue)) {\n\n\t\t\t\tELOG (\"SetMember - bad value\");\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif (mFieldType.isObject ()) {\n\n\t\t\t\tenv->SetObjectField (inObject, mField, setValue.l);\n\n\t\t\t} else {\n\n\t\t\t\tswitch (mFieldType.element) {\n\n\t\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\t\tenv->SetBooleanField (inObject, mField, setValue.z);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniByte:\n\n\t\t\t\t\t\tenv->SetByteField (inObject, mField, setValue.b);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniChar:\n\n\t\t\t\t\t\tenv->SetCharField (inObject, mField, setValue.c);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniShort:\n\n\t\t\t\t\t\tenv->SetShortField (inObject, mField, setValue.s);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniInt:\n\n\t\t\t\t\t\tenv->SetIntField (inObject, mField, setValue.i);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniLong:\n\n\t\t\t\t\t\tenv->SetLongField (inObject, mField, setValue.j);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniFloat:\n\n\t\t\t\t\t\tenv->SetFloatField (inObject, mField, setValue.f);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniDouble:\n\n\t\t\t\t\t\tenv->SetDoubleField (inObject, mField, setValue.d);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: {}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tCheckException (env);\n\n\t\t}\n\n\n\t\tjclass mClass;\n\t\tjfieldID mField;\n\t\tJNIType mFieldType;\n\n\n\t};\n\n\n\tvalue lime_jni_create_field (HxString inClass, HxString inField, HxString inSig, bool inStatic) {\n\n\t\tJNIField *field = new JNIField (inClass, inField, inSig, inStatic);\n\n\t\tif (field->Ok ()) {\n\n\t\t\treturn ObjectToAbstract (field);\n\n\t\t}\n\n\t\tELOG (\"lime_jni_create_field - failed\");\n\t\tdelete field;\n\t\treturn alloc_null ();\n\n\t}\n\n\tDEFINE_PRIME4 (lime_jni_create_field);\n\n\n\tvalue lime_jni_get_static (value inField) {\n\n\t\tJNIField *field;\n\n\t\tif (!AbstractToObject (inField, field)) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tvalue result = field->GetStatic ();\n\t\treturn result;\n\n\t}\n\n\tDEFINE_PRIME1 (lime_jni_get_static);\n\n\n\tvoid lime_jni_set_static (value inField, value inValue) {\n\n\t\tJNIField *field;\n\n\t\tif (!AbstractToObject (inField, field)) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tfield->SetStatic (inValue);\n\n\t}\n\n\tDEFINE_PRIME2v (lime_jni_set_static);\n\n\n\tvalue lime_jni_get_member (value inField, value inObject) {\n\n\t\tJNIField *field;\n\t\tjobject object;\n\n\t\tif (!AbstractToObject (inField, field)) {\n\n\t\t\tELOG (\"lime_jni_get_member - not a field\");\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tif (!AbstractToJObject (inObject, object)) {\n\n\t\t\tELOG (\"lime_jni_get_member - invalid this\");\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\treturn field->GetMember (object);\n\n\t}\n\n\tDEFINE_PRIME2 (lime_jni_get_member);\n\n\n\tvoid lime_jni_set_member (value inField, value inObject, value inValue) {\n\n\t\tJNIField *field;\n\t\tjobject object;\n\n\t\tif (!AbstractToObject (inField, field)) {\n\n\t\t\tELOG (\"lime_jni_set_member - not a field\");\n\t\t\treturn;\n\n\t\t}\n\n\t\tif (!AbstractToJObject (inObject, object)) {\n\n\t\t\tELOG (\"lime_jni_set_member - invalid this\");\n\t\t\treturn;\n\n\t\t}\n\n\t\tfield->SetMember (object, inValue);\n\n\t}\n\n\tDEFINE_PRIME3v (lime_jni_set_member);\n\n\n\tstruct JNIMethod : public lime::Object {\n\n\n\t\tenum { MAX = 20 };\n\n\n\t\tJNIMethod (HxString inClass, HxString inMethod, HxString inSignature, bool inStatic, bool inQuiet) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tJNIInit (env);\n\n\t\t\tmClass = 0;\n\t\t\tmMethod = 0;\n\t\t\tmReturn = JNIType (jniVoid, 0);\n\t\t\tmArgCount = 0;\n\n\t\t\tconst char *method = inMethod.__s;\n\t\t\tmIsConstructor = !strncmp (method, \"<init>\", 6);\n\n\t\t\tmClass = FindClass (inClass.__s, inQuiet);\n\n\t\t\tif (mClass) {\n\n\t\t\t\tconst char *signature = inSignature.__s;\n\n\t\t\t\tif (inStatic && !mIsConstructor) {\n\n\t\t\t\t\tmMethod = env->GetStaticMethodID (mClass, method, signature);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmMethod = env->GetMethodID (mClass, method, signature);\n\n\t\t\t\t}\n\n\t\t\t\tif (inQuiet) {\n\n\t\t\t\t\tjthrowable exc = env->ExceptionOccurred ();\n\n\t\t\t\t\tif (exc) {\n\n\t\t\t\t\t\tenv->ExceptionClear ();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tCheckException(env);\n\n\t\t\t\t}\n\n\t\t\t\tif (Ok ()) {\n\n\t\t\t\t\tbool ok = ParseSignature (signature);\n\n\t\t\t\t\tif (!ok) {\n\n\t\t\t\t\t\tELOG (\"Bad signature %s.\", signature);\n\t\t\t\t\t\tmMethod = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t~JNIMethod () {\n\n\n\n\t\t}\n\n\n\t\tbool HaxeToJNIArgs (JNIEnv *inEnv, value inArray, jvalue *outValues) {\n\n\t\t\tif (val_array_size (inArray) != mArgCount) {\n\n\t\t\t\tELOG (\"Invalid array count: %d != %d\", val_array_size (inArray), mArgCount);\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < mArgCount; i++) {\n\n\t\t\t\tvalue arg_i = val_array_i (inArray, i);\n\n\t\t\t\tif (!HaxeToJNI (inEnv, arg_i, mArgType[i], outValues[i])) {\n\n\t\t\t\t\tELOG (\"HaxeToJNI could not convert param %d (%p) to %dx%d\", i, arg_i, mArgType[i].element, mArgType[i].arrayDepth);\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\n\t\tvoid CleanStringArgs () {\n\n\n\n\t\t}\n\n\n\t\tbool ParseSignature (const char *inSig) {\n\n\t\t\tif (*inSig++ != '(') {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tmArgCount = 0;\n\n\t\t\twhile (*inSig != ')') {\n\n\t\t\t\tif (mArgCount == MAX) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tJNIType type;\n\t\t\t\tinSig = JNIParseType (inSig, type);\n\n\t\t\t\tif (type.isUnknown ()) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tmArgType[mArgCount++] = type;\n\n\t\t\t}\n\n\t\t\tinSig++;\n\t\t\tJNIParseType (inSig, mReturn);\n\t\t\treturn !mReturn.isUnknown ();\n\n\t\t}\n\n\n\t\tbool Ok () const {\n\n\t\t\treturn mMethod != 0;\n\n\t\t}\n\n\n\t\tvalue CallStatic (value inArgs) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tenv->PushLocalFrame(128);\n\t\t\tjvalue jargs[MAX];\n\n\t\t\tif (!HaxeToJNIArgs (env, inArgs, jargs)) {\n\n\t\t\t\tCleanStringArgs ();\n\t\t\t\tELOG (\"CallStatic - bad argument list\");\n\t\t\t\treturn alloc_null ();\n\n\t\t\t}\n\n\t\t\tvalue result = 0;\n\n\t\t\tif (mIsConstructor) {\n\n\t\t\t\tjobject obj = env->NewObjectA (mClass, mMethod, jargs);\n\t\t\t\tresult = JObjectToHaxe (env, JNIType (jniObject, 0), obj);\n\n\t\t\t} else if (mReturn.isObject ()) {\n\n\t\t\t\tresult = JObjectToHaxe (env, mReturn, env->CallStaticObjectMethodA (mClass, mMethod, jargs));\n\n\t\t\t} else {\n\n\t\t\t\tswitch (mReturn.element) {\n\n\t\t\t\t\tcase jniVoid:\n\n\t\t\t\t\t\tresult = alloc_null ();\n\t\t\t\t\t\tenv->CallStaticVoidMethodA (mClass, mMethod, jargs);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\t\tresult = alloc_bool (env->CallStaticBooleanMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniByte:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallStaticByteMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniChar:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallStaticCharMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniShort:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallStaticShortMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniInt:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallStaticIntMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniLong:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallStaticLongMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniFloat:\n\n\t\t\t\t\t\tresult = alloc_float (env->CallStaticFloatMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniDouble:\n\n\t\t\t\t\t\tresult = alloc_float (env->CallStaticDoubleMethodA (mClass, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: {}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tCleanStringArgs ();\n\t\t\tCheckException (env);\n\t\t\tenv->PopLocalFrame(NULL);\n\t\t\treturn result;\n\n\t\t}\n\n\n\t\tvalue CallMember (jobject inObject, value inArgs) {\n\n\t\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\t\tjvalue jargs[MAX];\n\n\t\t\tif (!HaxeToJNIArgs (env, inArgs, jargs)) {\n\n\t\t\t\tCleanStringArgs ();\n\t\t\t\tELOG (\"CallMember - bad argument list\");\n\t\t\t\treturn alloc_null ();\n\n\t\t\t}\n\n\t\t\tvalue result = 0;\n\n\t\t\tif (mReturn.isObject ()) {\n\n\t\t\t\tresult = JObjectToHaxe (env, mReturn, env->CallObjectMethodA (inObject, mMethod, jargs));\n\n\t\t\t} else {\n\n\t\t\t\tswitch (mReturn.element) {\n\n\t\t\t\t\tcase jniVoid:\n\n\t\t\t\t\t\tresult = alloc_null ();\n\t\t\t\t\t\tenv->CallVoidMethodA (inObject, mMethod, jargs);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniBoolean:\n\n\t\t\t\t\t\tresult = alloc_bool (env->CallBooleanMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniByte:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallByteMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniChar:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallCharMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniShort:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallShortMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniInt:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallIntMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniLong:\n\n\t\t\t\t\t\tresult = alloc_int (env->CallLongMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniFloat:\n\n\t\t\t\t\t\tresult = alloc_float (env->CallFloatMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase jniDouble:\n\n\t\t\t\t\t\tresult = alloc_float (env->CallDoubleMethodA (inObject, mMethod, jargs));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: {}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tCleanStringArgs ();\n\t\t\treturn result;\n\n\t\t}\n\n\n\t\tjclass mClass;\n\t\tjmethodID mMethod;\n\t\tJNIType mReturn;\n\t\tJNIType mArgType[MAX];\n\t\tint mArgCount;\n\t\tbool mIsConstructor;\n\n\n\t};\n\n\n\tvalue lime_jni_create_method (HxString inClass, HxString inMethod, HxString inSig, bool inStatic, bool quiet) {\n\n\t\tJNIMethod *method = new JNIMethod (inClass, inMethod, inSig, inStatic, quiet);\n\n\t\tif (method->Ok ()) {\n\n\t\t\treturn ObjectToAbstract (method);\n\n\t\t}\n\n\t\tif (!quiet) {\n\n\t\t\tELOG (\"lime_jni_create_method - failed\");\n\n\t\t}\n\n\t\tdelete method;\n\t\treturn alloc_null ();\n\n\t}\n\n\tDEFINE_PRIME5 (lime_jni_create_method);\n\n\n\tvalue lime_jni_call_static (value inMethod, value inArgs) {\n\n\t\tJNIMethod *method;\n\n\t\tif (!AbstractToObject (inMethod, method)) {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tvalue result = method->CallStatic (inArgs);\n\t\treturn result;\n\n\t}\n\n\tDEFINE_PRIME2 (lime_jni_call_static);\n\n\n\tvalue lime_jni_call_member (value inMethod, value inObject, value inArgs) {\n\n\t\tJNIMethod *method;\n\t\tjobject object;\n\n\t\tif (!AbstractToObject (inMethod, method)) {\n\n\t\t\tELOG (\"lime_jni_call_member - not a method\");\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\tif (!AbstractToJObject (inObject, object)) {\n\n\t\t\tELOG (\"lime_jni_call_member - invalid this\");\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t\treturn method->CallMember (object, inArgs);\n\n\t}\n\n\tDEFINE_PRIME3 (lime_jni_call_member);\n\n\n\tdouble lime_jni_get_env () {\n\n\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\treturn (uintptr_t)env;\n\n\t}\n\n\tDEFINE_PRIME0 (lime_jni_get_env);\n\n\n\tvalue lime_jni_get_jobject (value inValue) {\n\n\t\tjobject obj = 0;\n\n\t\tif (AbstractToJObject (inValue, obj)) {\n\n\t\t\treturn alloc_float ((uintptr_t)obj);\n\n\t\t}\n\n\t\treturn alloc_null ();\n\n\t}\n\n\tDEFINE_PRIME1 (lime_jni_get_jobject);\n\n\n\tvoid lime_jni_post_ui_callback (value inCallback) {\n\n\t\tJNIEnv *env = (JNIEnv*)JNI::GetEnv ();\n\t\tJNIInit (env);\n\n\t\tAutoGCRoot *root = new AutoGCRoot (inCallback);\n\t\tELOG (\"Lime set onCallback %p\",root);\n\t\tenv->CallStaticVoidMethod (GameActivity, postUICallback, (jlong)root);\n\t\tjthrowable exc = env->ExceptionOccurred ();\n\n\t\tif (exc) {\n\n\t\t\tenv->ExceptionDescribe ();\n\t\t\tenv->ExceptionClear ();\n\t\t\tdelete root;\n\t\t\tval_throw (alloc_string (\"JNI Exception\"));\n\n\t\t}\n\n\t}\n\n\tDEFINE_PRIME1v (lime_jni_post_ui_callback);\n\n\n}\n\n\nextern \"C\" {\n\n\n\tJAVA_EXPORT void JNICALL Java_org_haxe_lime_Lime_onCallback (JNIEnv * env, jobject obj, jlong handle) {\n\n\t\tlime::AutoHaxe haxe (\"onCallback\");\n\t\tELOG (\"Lime onCallback %p\", (void *)handle);\n\t\tAutoGCRoot *root = (AutoGCRoot *)handle;\n\t\tval_call0 (root->get ());\n\t\tdelete root;\n\n\t}\n\n\n\tJAVA_EXPORT jobject JNICALL Java_org_haxe_lime_Lime_releaseReference (JNIEnv * env, jobject obj, jlong handle) {\n\n\t\tlime::AutoHaxe haxe (\"releaseReference\");\n\t\tvalue val = (value)handle;\n\t\tlime::RemoveJavaHaxeObjectRef (val);\n\t\treturn 0;\n\n\t}\n\n\n\tvalue CallHaxe (JNIEnv * env, jobject obj, jlong handle, jstring function, jobject inArgs) {\n\n\t\t//ELOG (\"CallHaxe %p\", gCallback);\n\n\t\tif (lime::gCallback) {\n\n\t\t\tvalue objValue = (value)handle;\n\t\t\tvalue funcName = lime::JStringToHaxe (env, function);\n\t\t\tvalue args = lime::JObjectToHaxe (env, lime::JNIType (lime::jniUnknown, 1), inArgs);\n\t\t\t//ELOG (\"Using %d args\", val_array_size (args));\n\t\t\treturn val_call3 (lime::gCallback->get (), objValue, funcName, args);\n\n\t\t} else {\n\n\t\t\tELOG (\"Lime CallHaxe - init not called.\");\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tJAVA_EXPORT jobject JNICALL Java_org_haxe_lime_Lime_callObjectFunction (JNIEnv * env, jobject obj, jlong handle, jstring function, jobject args) {\n\n\t\tlime::AutoHaxe haxe (\"callObject\");\n\n\t\tvalue result = CallHaxe (env, obj, handle, function, args);\n\n\t\tjobject val = 0;\n\n\t\t// TODO - other cases\n\n\t\tif (val_is_string (result)) {\n\n\t\t\tconst char *string = val_string (result);\n\t\t\tval = env->NewStringUTF (string);\n\n\t\t} else if (!val_is_null (result)) {\n\n\t\t\tELOG (\"only string return is supported\");\n\n\t\t}\n\n\t\t//jobject val = JAnonToHaxe(result);\n\n\t\treturn val;\n\n\t}\n\n\n\tJAVA_EXPORT jdouble JNICALL Java_org_haxe_lime_Lime_callNumericFunction (JNIEnv * env, jobject obj, jlong handle, jstring function, jobject args) {\n\n\t\tlime::AutoHaxe haxe (\"callNumeric\");\n\n\t\tvalue result = CallHaxe (env, obj, handle, function, args);\n\t\tdouble val = val_number (result);\n\t\treturn val;\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/system/Locale.cpp",
    "content": "#include <system/Locale.h>\n\n#if defined(HX_WINDOWS)\n#include <windows.h>\n#elif defined(HX_LINUX)\n#include <stdlib.h>\n#include <string.h>\n#include <clocale>\n#endif\n\n\nnamespace lime {\n\n\n\tstd::string* Locale::GetSystemLocale () {\n\n\t\t#if defined(HX_WINDOWS)\n\n\t\tchar language[5] = {0};\n\t\tchar country[5] = {0};\n\n\t\tGetLocaleInfoA (LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, language, sizeof (language) / sizeof (char));\n\t\tGetLocaleInfoA (LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, country, sizeof (country) / sizeof (char));\n\n\t\tstd::string* locale = new std::string (std::string (language) + \"_\" + std::string (country));\n\t\treturn locale;\n\n\t\t#elif defined(HX_LINUX)\n\n\t\tconst char* locale = getenv (\"LANG\");\n\n\t\tif (!locale) {\n\n\t\t\tlocale = setlocale (LC_ALL, \"\");\n\n\t\t}\n\n\t\tif (locale) {\n\n\t\t\tstd::string* result = new std::string (locale);\n\t\t\treturn result;\n\n\t\t}\n\n\t\treturn 0;\n\n\t\t#else\n\n\t\treturn 0;\n\n\t\t#endif\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/Locale.mm",
    "content": "#ifdef HX_MACOS\n#import <Cocoa/Cocoa.h>\n#else\n#import <UIKit/UIKit.h>\n#endif\n\n#include <system/Locale.h>\n\n\nnamespace lime {\n\n\n\tstd::string* Locale::GetSystemLocale () {\n\n\t\t#ifndef OBJC_ARC\n\t\tNSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];\n\t\t#endif\n\n\t\tNSString* localeLanguage = [[NSLocale preferredLanguages] firstObject];\n\t\tif (localeLanguage == nil) localeLanguage = @\"en\";\n\n\t\tNSString* localeRegion = nil;\n\t\tNSLocale* currentLocale = [NSLocale autoupdatingCurrentLocale];\n\t\tif (currentLocale == nil || ![currentLocale respondsToSelector:@selector(countryCode)]) {\n\t\t\tlocaleRegion = @\"\";\n\t\t} else {\n\t\t\tlocaleRegion = [currentLocale countryCode];\n\t\t}\n\n\t\tNSString* locale = localeLanguage;\n\t\tif (localeRegion != nil)\n\t\t{\n\t\t\tlocale = [[localeLanguage stringByAppendingString:@\"_\"] stringByAppendingString:localeRegion];\n\t\t}\n\n\t\tstd::string* result = 0;\n\n\t\tif (locale) {\n\n\t\t\tconst char* ptr = [locale UTF8String];\n\t\t\tresult = new std::string (ptr);\n\n\t\t}\n\n\t\t#ifndef OBJC_ARC\n\t\t[pool drain];\n\t\t#endif\n\n\t\treturn result;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/OrientationEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <system/OrientationEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* OrientationEvent::callback = 0;\n\tValuePointer* OrientationEvent::eventObject = 0;\n\n\tstatic int id_type;\n\tstatic int id_orientation;\n\tstatic int id_display;\n\tstatic bool init = false;\n\n\n\tOrientationEvent::OrientationEvent () {\n\n\t\torientation = 0; // SDL_ORIENTATION_UNKNOWN\n\t\tdisplay = 0;\n\t\ttype = DISPLAY_ORIENTATION_CHANGE;\n\n\t}\n\n\n\tvoid OrientationEvent::Dispatch (OrientationEvent* event) {\n\n\t\tif (OrientationEvent::callback) {\n\n\t\t\tif (OrientationEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_orientation = val_id (\"orientation\");\n\t\t\t\t\tid_display = val_id (\"display\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)OrientationEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_orientation, alloc_int (event->orientation));\n\t\t\t\talloc_field (object, id_display, alloc_int (event->display));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\n\t\t\t} else {\n\n\t\t\t\tOrientationEvent* eventObject = (OrientationEvent*)OrientationEvent::eventObject->Get ();\n\n\t\t\t\teventObject->orientation = event->orientation;\n\t\t\t\teventObject->display = event->display;\n\t\t\t\teventObject->type = event->type;\n\n\t\t\t}\n\n\t\t\tOrientationEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/SensorEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <system/SensorEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* SensorEvent::callback = 0;\n\tValuePointer* SensorEvent::eventObject = 0;\n\n\tstatic int id_id;\n\tstatic int id_type;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic int id_z;\n\tstatic bool init = false;\n\n\n\tSensorEvent::SensorEvent () {\n\n\t\ttype = SENSOR_ACCELEROMETER;\n\t\tid = 0;\n\t\tx = 0;\n\t\ty = 0;\n\t\tz = 0;\n\n\t}\n\n\n\tvoid SensorEvent::Dispatch (SensorEvent* event) {\n\n\t\tif (SensorEvent::callback) {\n\n\t\t\tif (SensorEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_id = val_id (\"id\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_x = val_id (\"x\");\n\t\t\t\t\tid_y = val_id (\"y\");\n\t\t\t\t\tid_z = val_id (\"z\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)SensorEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_id, alloc_int (event->id));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_x, alloc_float (event->x));\n\t\t\t\talloc_field (object, id_y, alloc_float (event->y));\n\t\t\t\talloc_field (object, id_z, alloc_float (event->z));\n\n\t\t\t} else {\n\n\t\t\t\tSensorEvent* eventObject = (SensorEvent*)SensorEvent::eventObject->Get ();\n\n\t\t\t\teventObject->id = event->id;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->x = event->x;\n\t\t\t\teventObject->y = event->y;\n\t\t\t\teventObject->z = event->z;\n\n\t\t\t}\n\n\t\t\tSensorEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/System.cpp",
    "content": "#ifdef HX_WINDOWS\n#define _WIN32_DCOM\n#include <iostream>\n#include <wbemidl.h>\n#include <comutil.h>\n#pragma comment(lib, \"wbemuuid.lib\")\n#include <windows.h>\n#endif\n\n#include <system/System.h>\n\n\nnamespace lime {\n\n\n\t#ifdef LIME_HASHLINK\n\tbool System::_isHL = (hl_nan () != 0);\n\t#else\n\tbool System::_isHL = false;\n\t#endif\n\n\n\tvoid System::GCEnterBlocking () {\n\n\t\tif (!_isHL) {\n\n\t\t\tgc_enter_blocking ();\n\n\t\t}\n\n\t}\n\n\n\tvoid System::GCExitBlocking () {\n\n\t\tif (!_isHL) {\n\n\t\t\tgc_exit_blocking ();\n\n\t\t}\n\n\t}\n\n\n\tvoid System::GCTryEnterBlocking () {\n\n\t\tif (!_isHL) {\n\n\t\t\t// TODO: Only supported in HXCPP 4.3\n\t\t\t// gc_try_blocking ();\n\n\t\t}\n\n\t}\n\n\n\tvoid System::GCTryExitBlocking () {\n\n\t\tif (!_isHL) {\n\n\t\t\t// TODO: Only supported in HXCPP 4.3\n\t\t\t//gc_try_unblocking ();\n\n\t\t}\n\n\t}\n\n\n\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\tstd::wstring* GetWMIValue (BSTR query, BSTR field) {\n\n\t\tHRESULT hres = 0;\n\t\tIWbemLocator *pLoc = NULL;\n\t\tIWbemServices *pSvc = NULL;\n\t\tIEnumWbemClassObject* pEnumerator = NULL;\n\t\tIWbemClassObject *pclsObj = NULL;\n\t\tULONG uReturn = 0;\n\t\tstd::wstring* result = NULL;\n\n\t\t// hres = CoInitializeEx (0, COINIT_MULTITHREADED);\n\n\t\t// if (FAILED (hres)) {\n\n\t\t// \treturn NULL;\n\n\t\t// }\n\n\t\t// hres = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);\n\n\t\t// if (FAILED (hres)) {\n\n\t\t// \tCoUninitialize ();\n\t\t// \tNULL;\n\n\t\t// }\n\n\t\thres = CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);\n\n\t\tif (FAILED (hres)) {\n\n\t\t\t//CoUninitialize ();\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\thres = pLoc->ConnectServer (_bstr_t (L\"ROOT\\\\CIMV2\"), NULL, NULL, 0, NULL, 0, 0, &pSvc);\n\n\t\tif (FAILED (hres)) {\n\n\t\t\tpLoc->Release ();\n\t\t\t// CoUninitialize ();\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\thres = CoSetProxyBlanket (pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);\n\n\t\tif (FAILED (hres)) {\n\n\t\t\tpSvc->Release ();\n\t\t\tpLoc->Release ();\n\t\t\t// CoUninitialize ();\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\thres = pSvc->ExecQuery (bstr_t (L\"WQL\"), query, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);\n\n\t\tif (FAILED (hres)) {\n\n\t\t\tpSvc->Release ();\n\t\t\tpLoc->Release ();\n\t\t\t// CoUninitialize ();\n\t\t\treturn NULL;\n\n\t\t}\n\n\t\twhile (pEnumerator) {\n\n\t\t\tHRESULT hr = pEnumerator->Next (WBEM_INFINITE, 1, &pclsObj, &uReturn);\n\t\t\tif (uReturn == 0) break;\n\n\t\t\tVARIANT vtProp;\n\n\t\t\thr = pclsObj->Get (field, 0, &vtProp, 0, 0);\n\t\t\tVariantClear (&vtProp);\n\t\t\tresult = new std::wstring (vtProp.bstrVal, SysStringLen (vtProp.bstrVal));\n\n\t\t\tpclsObj->Release ();\n\n\t\t}\n\n\t\tpSvc->Release ();\n\t\tpLoc->Release ();\n\t\tpEnumerator->Release ();\n\t\t// CoUninitialize ();\n\n\t\treturn result;\n\n\t}\n\t#endif\n\n\n\tstd::wstring* System::GetDeviceModel () {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn GetWMIValue (bstr_t (L\"SELECT * FROM Win32_ComputerSystemProduct\"), bstr_t (L\"Version\"));\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetDeviceVendor () {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn GetWMIValue (bstr_t (L\"SELECT * FROM Win32_ComputerSystemProduct\"), bstr_t (L\"Vendor\"));\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetPlatformLabel () {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn GetWMIValue (bstr_t (L\"SELECT * FROM Win32_OperatingSystem\"), bstr_t (L\"Caption\"));\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetPlatformName () {\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetPlatformVersion () {\n\n\t\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\t\treturn GetWMIValue (bstr_t (L\"SELECT * FROM Win32_OperatingSystem\"), bstr_t (L\"Version\"));\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\tint System::GetWindowsConsoleMode (int handleType) {\n\n\t\tHANDLE handle = GetStdHandle ((DWORD)handleType);\n\t\tDWORD mode = 0;\n\n\t\tif (handle) {\n\n\t\t\tbool result = GetConsoleMode (handle, &mode);\n\n\t\t}\n\n\t\treturn mode;\n\n\t}\n\t#endif\n\n\n\t#if defined (HX_WINDOWS) && !defined (HX_WINRT)\n\tbool System::SetWindowsConsoleMode (int handleType, int mode) {\n\n\t\tHANDLE handle = GetStdHandle ((DWORD)handleType);\n\n\t\tif (handle) {\n\n\t\t\treturn SetConsoleMode (handle, (DWORD)mode);\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\t#endif\n\n\tint System::GetDeviceOrientation () {\n\n\t\treturn 0; // SDL_ORIENTATION_UNKNOWN\n\n\t}\n\n\tvoid System::EnableDeviceOrientationChange (bool enable) {\n\n\t}\n\n}\n\n\n#ifdef HX_LINUX\n\n// Improve compatibility with old glibc\n\n#define __fdelt_chk __fdelt_chk_local\n#include <sys/select.h>\n#undef __fdelt_chk\n\nlong int __fdelt_chk (long int d) {\n\n\tif (d >= FD_SETSIZE) {\n\n\t\t//printf(\"Select - bad fd.\\n\");\n\t\treturn 0;\n\n\t}\n\n\treturn d / __NFDBITS;\n\n}\n\n#endif\n\n\n#if defined(ANDROID) && !defined(HXCPP_CLANG)\n\n#include <stdint.h>\n#include <wchar.h>\n#include <errno.h>\n\n/*\n* This code was written by Rich Felker in 2010; no copyright is claimed.\n* This code is in the public domain. Attribution is appreciated but\n* unnecessary.\n*/\n\n#define OOB(c,b) (((((b)>>3)-0x10)|(((b)>>3)+((int32_t)(c)>>26))) & ~7)\n\n#define R(a,b) ((uint32_t)((a==0x80 ? 0x40-b : -a) << 23))\n\n#define C(x) ( x<2 ? -1 : ( R(0x80,0xc0) | x ) )\n#define D(x) C((x+16))\n#define E(x) ( ( x==0 ? R(0xa0,0xc0) : \\\n\t\t\t\tx==0xd ? R(0x80,0xa0) : \\\n\t\t\t\tR(0x80,0xc0) ) \\\n\t\t\t| ( R(0x80,0xc0) >> 6 ) \\\n\t\t\t| x )\n#define F(x) ( ( x>=5 ? 0 : \\\n\t\t\t\tx==0 ? R(0x90,0xc0) : \\\n\t\t\t\tx==4 ? R(0x80,0xa0) : \\\n\t\t\t\tR(0x80,0xc0) ) \\\n\t\t\t| ( R(0x80,0xc0) >> 6 ) \\\n\t\t\t| ( R(0x80,0xc0) >> 12 ) \\\n\t\t\t| x )\n\n#define SA 0xc2u\n#define SB 0xf4u\n\nconst uint32_t bittab[] = {\n\t\t\t\tC(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7),\n\tC(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf),\n\tD(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7),\n\tD(0x8),D(0x9),D(0xa),D(0xb),D(0xc),D(0xd),D(0xe),D(0xf),\n\tE(0x0),E(0x1),E(0x2),E(0x3),E(0x4),E(0x5),E(0x6),E(0x7),\n\tE(0x8),E(0x9),E(0xa),E(0xb),E(0xc),E(0xd),E(0xe),E(0xf),\n\tF(0x0),F(0x1),F(0x2),F(0x3),F(0x4)\n};\n\n// Added minor C++ compile fixes\n\nsize_t _mbsrtowcs(wchar_t * ws, const char **src, size_t wn, mbstate_t *st)\n{\n\tconst unsigned char *s = (const unsigned char *)*src;\n\tsize_t wn0 = wn;\n\tunsigned c = 0;\n\n\tif (st && (c = *(unsigned *)st)) {\n\t\tif (ws) {\n\t\t\t*(unsigned *)st = 0;\n\t\t\tgoto resume;\n\t\t} else {\n\t\t\tgoto resume0;\n\t\t}\n\t}\n\n\tif (!ws) for (;;) {\n\t\tif (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {\n\t\t\twhile (!(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {\n\t\t\t\ts += 4;\n\t\t\t\twn -= 4;\n\t\t\t}\n\t\t}\n\t\tif (*s-1u < 0x7f) {\n\t\t\ts++;\n\t\t\twn--;\n\t\t\tcontinue;\n\t\t}\n\t\tif (*s-SA > SB-SA) break;\n\t\tc = bittab[*s++-SA];\nresume0:\n\t\tif (OOB(c,*s)) { s--; break; }\n\t\ts++;\n\t\tif (c&(1U<<25)) {\n\t\t\tif (*s-0x80u >= 0x40) { s-=2; break; }\n\t\t\ts++;\n\t\t\tif (c&(1U<<19)) {\n\t\t\t\tif (*s-0x80u >= 0x40) { s-=3; break; }\n\t\t\t\ts++;\n\t\t\t}\n\t\t}\n\t\twn--;\n\t\tc = 0;\n\t} else for (;;) {\n\t\tif (!wn) {\n\t\t\t*src = (const char *)s;\n\t\t\treturn wn0;\n\t\t}\n\t\tif (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {\n\t\t\twhile (wn>=5 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {\n\t\t\t\t*ws++ = *s++;\n\t\t\t\t*ws++ = *s++;\n\t\t\t\t*ws++ = *s++;\n\t\t\t\t*ws++ = *s++;\n\t\t\t\twn -= 4;\n\t\t\t}\n\t\t}\n\t\tif (*s-1u < 0x7f) {\n\t\t\t*ws++ = *s++;\n\t\t\twn--;\n\t\t\tcontinue;\n\t\t}\n\t\tif (*s-SA > SB-SA) break;\n\t\tc = bittab[*s++-SA];\nresume:\n\t\tif (OOB(c,*s)) { s--; break; }\n\t\tc = (c<<6) | *s++-0x80;\n\t\tif (c&(1U<<31)) {\n\t\t\tif (*s-0x80u >= 0x40) { s-=2; break; }\n\t\t\tc = (c<<6) | *s++-0x80;\n\t\t\tif (c&(1U<<31)) {\n\t\t\t\tif (*s-0x80u >= 0x40) { s-=3; break; }\n\t\t\t\tc = (c<<6) | *s++-0x80;\n\t\t\t}\n\t\t}\n\t\t*ws++ = c;\n\t\twn--;\n\t\tc = 0;\n\t}\n\n\tif (!c && !*s) {\n\t\tif (ws) {\n\t\t\t*ws = 0;\n\t\t\t*src = 0;\n\t\t}\n\t\treturn wn0-wn;\n\t}\n\terrno = EILSEQ;\n\tif (ws) *src = (const char *)s;\n\treturn -1;\n}\n\n#endif\n"
  },
  {
    "path": "project/src/system/System.mm",
    "content": "#ifdef IPHONE\n#import <UIKit/UIKit.h>\n#endif\n\n#import <sys/utsname.h>\n#include <system/System.h>\n#include <system/OrientationEvent.h>\n\n\n#ifdef IPHONE\n@interface OrientationObserver: NSObject\n- (id) init;\n- (void) dealloc;\n- (void) dispatchEventForDevice:(UIDevice *) device;\n- (void) orientationChanged:(NSNotification *) notification;\n@end\n\n@implementation OrientationObserver {\n}\n\n- (void) dealloc\n{\n\n\tUIDevice * device = [UIDevice currentDevice];\n\t// [device endGeneratingDeviceOrientationNotifications];\n\t[[NSNotificationCenter defaultCenter] removeObserver:self];\n\n\t[super dealloc];\n\n}\n\n- (id) init\n{\n\n\tself = [super init];\n\tif (!self)\n\t{\n\t\treturn nil;\n\t}\n\n\tUIDevice * device = [UIDevice currentDevice];\n\t// [device beginGeneratingDeviceOrientationNotifications];\n\t[[NSNotificationCenter defaultCenter]\n\t\taddObserver:self selector:@selector(orientationChanged:)\n\t\tname:UIDeviceOrientationDidChangeNotification\n\t\tobject:device];\n\n\treturn self;\n\n}\n\n- (void) dispatchEventForCurrentDevice\n{\n\n\tUIDevice * device = [UIDevice currentDevice];\n\t[self dispatchEventForDevice:device];\n\n}\n\n- (void) dispatchEventForDevice:(UIDevice *) device\n{\n\n\tint orientation = 0; // SDL_ORIENTATION_UNKNOWN\n\tswitch (device.orientation)\n\t{\n\n\t\tcase UIDeviceOrientationLandscapeLeft:\n\n\t\t\torientation = 1; // SDL_ORIENTATION_LANDSCAPE\n\t\t\tbreak;\n\n\t\tcase UIDeviceOrientationLandscapeRight:\n\n\t\t\torientation = 2; // SDL_ORIENTATION_LANDSCAPE_FLIPPED\n\t\t\tbreak;\n\n\t\tcase UIDeviceOrientationPortrait:\n\n\t\t\torientation = 3; // SDL_ORIENTATION_PORTRAIT\n\t\t\tbreak;\n\n\t\tcase UIDeviceOrientationPortraitUpsideDown:\n\n\t\t\torientation = 4; // SDL_ORIENTATION_PORTRAIT_FLIPPED\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tbreak;\n\t};\n\n\tlime::OrientationEvent event;\n\tevent.orientation = orientation;\n\tevent.display = -1;\n\tevent.type = lime::DEVICE_ORIENTATION_CHANGE;\n\tlime::OrientationEvent::Dispatch(&event);\n\n}\n\n- (void) orientationChanged:(NSNotification *) notification\n{\n\n\tUIDevice * device = notification.object;\n\t[self dispatchEventForDevice:device];\n\n}\n@end\n#endif\n\nnamespace lime {\n\n\tOrientationObserver* orientationObserver;\n\n\tvoid System::GCEnterBlocking () {\n\n\t\t// if (!_isHL) {\n\n\t\t\tgc_enter_blocking ();\n\n\t\t// }\n\n\t}\n\n\n\tvoid System::GCExitBlocking () {\n\n\t\t// if (!_isHL) {\n\n\t\t\tgc_exit_blocking ();\n\n\t\t// }\n\n\t}\n\n\n\tstd::wstring* System::GetIOSDirectory (SystemDirectory type) {\n\n\t\t#ifndef OBJC_ARC\n\t\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\t\t#endif\n\n\t\tNSSearchPathDirectory searchType = NSDocumentDirectory;\n\n\t\tswitch (type) {\n\n\t\t\tcase DESKTOP:\n\n\t\t\t\tsearchType = NSDesktopDirectory;\n\t\t\t\tbreak;\n\n\t\t\tcase USER:\n\n\t\t\t\t//searchType = NSUserDirectory;\n\t\t\t\tsearchType = NSDocumentDirectory;\n\t\t\t\tbreak;\n\n\t\t\tdefault: break;\n\n\t\t}\n\n\t\tstd::wstring* result = 0;\n\n\t\tNSArray* paths = NSSearchPathForDirectoriesInDomains (searchType, NSUserDomainMask, YES);\n\n\t\tif (paths && [paths count] > 0) {\n\n\t\t\tNSString* basePath = paths.firstObject;\n\t\t\tstd::string path = std::string ([basePath UTF8String]);\n\t\t\tresult = new std::wstring (path.begin (), path.end ());\n\n\t\t}\n\n\t\t#ifndef OBJC_ARC\n\t\t[pool drain];\n\t\t#endif\n\n\t\treturn result;\n\n\t}\n\n\n\tbool System::GetIOSTablet () {\n\n\t\treturn (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 1 : 0;\n\n\t}\n\n\n\tint System::GetDeviceOrientation () {\n\n\t\tUIDevice * device = [UIDevice currentDevice];\n\n\t\tint orientation = 0; // SDL_ORIENTATION_UNKNOWN\n\t\tswitch (device.orientation)\n\t\t{\n\n\t\t\tcase UIDeviceOrientationLandscapeLeft:\n\n\t\t\t\torientation = 1; // SDL_ORIENTATION_LANDSCAPE\n\t\t\t\tbreak;\n\n\t\t\tcase UIDeviceOrientationLandscapeRight:\n\n\t\t\t\torientation = 2; // SDL_ORIENTATION_LANDSCAPE_FLIPPED\n\t\t\t\tbreak;\n\n\t\t\tcase UIDeviceOrientationPortrait:\n\n\t\t\t\torientation = 3; // SDL_ORIENTATION_PORTRAIT\n\t\t\t\tbreak;\n\n\t\t\tcase UIDeviceOrientationPortraitUpsideDown:\n\n\t\t\t\torientation = 4; // SDL_ORIENTATION_PORTRAIT_FLIPPED\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tbreak;\n\t\t};\n\n\t\treturn orientation;\n\n\t}\n\n\n\tstd::wstring* System::GetDeviceModel () {\n\n\t\t#ifdef IPHONE\n\t\tstruct utsname systemInfo;\n\t\tuname (&systemInfo);\n\n\t\tstd::string model = std::string (systemInfo.machine);\n\t\treturn new std::wstring (model.begin (), model.end ());\n\t\t#else\n\t\treturn NULL;\n\t\t#endif\n\n\t}\n\n\n\tstd::wstring* System::GetDeviceVendor () {\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetPlatformLabel () {\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetPlatformName () {\n\n\t\treturn NULL;\n\n\t}\n\n\n\tstd::wstring* System::GetPlatformVersion () {\n\n\t\t#ifdef IPHONE\n\t\tNSString *versionString = [[UIDevice currentDevice] systemVersion];\n\t\tstd::string result = std::string ([versionString UTF8String]);\n\t\treturn new std::wstring (result.begin (), result.end ());\n\t\t#else\n\t\treturn NULL;\n\t\t#endif\n\n\t}\n\n\n\tvoid System::EnableDeviceOrientationChange (bool enable) {\n\n\t\t#ifdef IPHONE\n\t\tif (enable && !orientationObserver)\n\t\t{\n\n\t\t\torientationObserver = [[OrientationObserver alloc] init];\n\t\t\t// SDL forces dispatch of a display orientation event immediately.\n\t\t\t// for consistency, we should dispatch one for device orientation.\n\t\t\t[orientationObserver dispatchEventForCurrentDevice];\n\n\t\t}\n\t\telse if (!enable && orientationObserver)\n\t\t{\n\n\t\t\torientationObserver = nil;\n\n\t\t}\n\t\t#endif\n\n\t}\n\n\n\tvoid System::OpenFile (const char* path) {\n\n\t\tOpenURL (path, NULL);\n\n\t}\n\n\n\tvoid System::OpenURL (const char* url, const char* target) {\n\n\t\t#ifndef OBJC_ARC\n\t\tNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\t\t#endif\n\n\t\tUIApplication *application = [UIApplication sharedApplication];\n\t\tNSString *str = [[NSString alloc] initWithUTF8String: url];\n\t\tNSURL *_url = [NSURL URLWithString: str];\n\n\t\tif ([[UIApplication sharedApplication] canOpenURL: _url]) {\n\n\t\t\tif ([application respondsToSelector: @selector (openURL:options:completionHandler:)]) {\n\n\t\t\t\t[application openURL: _url options: @{}\n\t\t\t\t\tcompletionHandler:^(BOOL success) {\n\t\t\t\t\t\t//NSLog(@\"Open %@: %d\", _url, success);\n\t\t\t\t\t}\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tBOOL success = [application openURL: _url];\n\t\t\t\t//NSLog(@\"Open %@: %d\",scheme,success);\n\n\t\t\t}\n\n\t\t}\n\n\t\t#ifndef OBJC_ARC\n\t\t[str release];\n\t\t[pool drain];\n\t\t#endif\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/system/ValuePointer.cpp",
    "content": "#include <system/CFFI.h>\n#include <system/ValuePointer.h>\n\n\nnamespace lime {\n\n\n\tValuePointer::ValuePointer (value handle) {\n\n\t\tcffiRoot = 0;\n\t\tcffiValue = alloc_root ();\n\n\t\tif (cffiValue) {\n\n\t\t\t*cffiValue = handle;\n\n\t\t} else {\n\n\t\t\tcffiRoot = create_root (handle);\n\n\t\t}\n\n\t\thlValue = 0;\n\n\t}\n\n\n\tValuePointer::ValuePointer (vobj* handle) {\n\n\t\thlValue = handle;\n\t\thl_add_root (&hlValue);\n\n\t\tcffiRoot = 0;\n\t\tcffiValue = 0;\n\n\t}\n\n\n\tValuePointer::ValuePointer (vdynamic* handle) {\n\n\t\thlValue = (vobj*)handle;\n\t\thl_add_root (&hlValue);\n\n\t\tcffiRoot = 0;\n\t\tcffiValue = 0;\n\n\t}\n\n\n\tValuePointer::ValuePointer (vclosure* callback) {\n\n\t\thlValue = (vobj*)callback;\n\t\thl_add_root (&hlValue);\n\n\t\tcffiRoot = 0;\n\t\tcffiValue = 0;\n\n\t}\n\n\n\tValuePointer::~ValuePointer () {\n\n\t\tif (cffiValue) {\n\n\t\t\tfree_root (cffiValue);\n\n\t\t} else if (cffiRoot) {\n\n\t\t\tdestroy_root (cffiRoot);\n\n\t\t} else if (hlValue) {\n\n\t\t\thl_remove_root (&hlValue);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Call () {\n\n\t\tif (!hlValue) {\n\n\t\t\treturn val_call0 ((value)Get ());\n\n\t\t} else {\n\n\t\t\treturn hl_dyn_call ((vclosure*)hlValue, 0, 0);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Call (void* arg0) {\n\n\t\tif (!hlValue) {\n\n\t\t\treturn val_call1 ((value)Get (), (value)arg0);\n\n\t\t} else {\n\n\t\t\tvdynamic* arg = (vdynamic*) arg0;\n\t\t\treturn hl_dyn_call ((vclosure*)hlValue, &arg, 1);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Call (void* arg0, void* arg1) {\n\n\t\tif (!hlValue) {\n\n\t\t\treturn val_call2 ((value)Get (), (value)arg0, (value)arg1);\n\n\t\t} else {\n\n\t\t\tvdynamic* args[] = {\n\t\t\t\t(vdynamic*)arg0,\n\t\t\t\t(vdynamic*)arg1,\n\t\t\t};\n\n\t\t\treturn hl_dyn_call ((vclosure*)hlValue, (vdynamic**)&args, 2);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Call (void* arg0, void* arg1, void* arg2) {\n\n\t\tif (!hlValue) {\n\n\t\t\treturn val_call3 ((value)Get (), (value)arg0, (value)arg1, (value)arg2);\n\n\t\t} else {\n\n\t\t\tvdynamic* args[] = {\n\t\t\t\t(vdynamic*)arg0,\n\t\t\t\t(vdynamic*)arg1,\n\t\t\t\t(vdynamic*)arg2,\n\t\t\t};\n\n\t\t\treturn hl_dyn_call ((vclosure*)hlValue, (vdynamic**)&args, 3);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Call (void* arg0, void* arg1, void* arg2, void* arg3) {\n\n\t\tif (!hlValue) {\n\n\t\t\tvalue vals[] = {\n\t\t\t\t(value)arg0,\n\t\t\t\t(value)arg1,\n\t\t\t\t(value)arg2,\n\t\t\t\t(value)arg3,\n\t\t\t};\n\n\t\t\treturn val_callN ((value)Get (), vals, 4);\n\n\t\t} else {\n\n\t\t\tvdynamic* args[] = {\n\t\t\t\t(vdynamic*)arg0,\n\t\t\t\t(vdynamic*)arg1,\n\t\t\t\t(vdynamic*)arg2,\n\t\t\t\t(vdynamic*)arg3,\n\t\t\t};\n\n\t\t\treturn hl_dyn_call ((vclosure*)hlValue, (vdynamic**)&args, 4);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Call (void* arg0, void* arg1, void* arg2, void* arg3, void* arg4) {\n\n\t\tif (!hlValue) {\n\n\t\t\tvalue vals[] = {\n\t\t\t\t(value)arg0,\n\t\t\t\t(value)arg1,\n\t\t\t\t(value)arg2,\n\t\t\t\t(value)arg3,\n\t\t\t\t(value)arg4,\n\t\t\t};\n\n\t\t\treturn val_callN ((value)Get (), vals, 5);\n\n\t\t} else {\n\n\t\t\tvdynamic* args[] = {\n\t\t\t\t(vdynamic*)arg0,\n\t\t\t\t(vdynamic*)arg1,\n\t\t\t\t(vdynamic*)arg2,\n\t\t\t\t(vdynamic*)arg3,\n\t\t\t\t(vdynamic*)arg4,\n\t\t\t};\n\n\t\t\treturn hl_dyn_call ((vclosure*)hlValue, (vdynamic**)&args, 5);\n\n\t\t}\n\n\t}\n\n\n\tvoid* ValuePointer::Get () const {\n\n\t\tif (cffiValue) {\n\n\t\t\treturn *cffiValue;\n\n\t\t} else if (cffiRoot) {\n\n\t\t\treturn query_root (cffiRoot);\n\n\t\t} else if (hlValue) {\n\n\t\t\treturn hlValue;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\n\tbool ValuePointer::IsCFFIValue () {\n\n\t\treturn hlValue == 0;\n\n\t}\n\n\n\tbool ValuePointer::IsHLValue () {\n\n\t\treturn hlValue != 0;\n\n\t}\n\n\n\tvoid ValuePointer::Set (value handle) {\n\n\t\tif (cffiValue) {\n\n\t\t\t*cffiValue = handle;\n\n\t\t} else {\n\n\t\t\tif (cffiRoot) destroy_root (cffiRoot);\n\t\t\tcffiRoot = create_root (handle);\n\n\t\t}\n\n\t}\n\n\n\tvoid ValuePointer::Set (vobj* handle) {\n\n\t\thlValue = handle;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/text/Font.cpp",
    "content": "#include <text/Font.h>\n#include <graphics/ImageBuffer.h>\n#include <system/System.h>\n\n#include <algorithm>\n#include <list>\n#include <vector>\n\n#ifdef LIME_FREETYPE\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include FT_BITMAP_H\n#include FT_SFNT_NAMES_H\n#include FT_TRUETYPE_IDS_H\n#include FT_TRUETYPE_TABLES_H\n#include FT_GLYPH_H\n#include FT_OUTLINE_H\n#endif\n\n#ifdef GetGlyphIndices\n#undef GetGlyphIndices\n#endif\n\n\n// from http://stackoverflow.com/questions/2948308/how-do-i-read-utf-8-characters-via-a-pointer\n#define IS_IN_RANGE(c, f, l) (((c) >= (f)) && ((c) <= (l)))\n\n\nunsigned long readNextChar (const char*& p)\n{\n\t // TODO: since UTF-8 is a variable-length\n\t // encoding, you should pass in the input\n\t // buffer's actual byte length so that you\n\t // can determine if a malformed UTF-8\n\t // sequence would exceed the end of the buffer...\n\n\t const unsigned char* ptr = (const unsigned char*) p;\n\t unsigned char c1, c2;\n\t unsigned long uc = 0;\n\t int seqlen;\n\n\t c1 = ptr[0];\n\n\t if ((c1 & 0x80) == 0) {\n\n\t\t  uc = (unsigned long) (c1 & 0x7F);\n\t\t  seqlen = 1;\n\n\t } else if ((c1 & 0xE0) == 0xC0) {\n\n\t\t  uc = (unsigned long) (c1 & 0x1F);\n\t\t  seqlen = 2;\n\n\t } else if ((c1 & 0xF0) == 0xE0) {\n\n\t\t  uc = (unsigned long) (c1 & 0x0F);\n\t\t  seqlen = 3;\n\n\t } else if ((c1 & 0xF8) == 0xF0) {\n\n\t\t  uc = (unsigned long) (c1 & 0x07);\n\t\t  seqlen = 4;\n\n\t } else {\n\n\t\t  // malformed data, do something !!!\n\t\t  return (unsigned long) -1;\n\n\t }\n\n\t for (int i = 1; i < seqlen; ++i) {\n\n\t\t  c1 = ptr[i];\n\n\t\t  if ((c1 & 0xC0) != 0x80) {\n\n\t\t\t\t// malformed data, do something !!!\n\t\t\t\treturn (unsigned long) -1;\n\n\t\t  }\n\n\t }\n\n\t switch (seqlen) {\n\t\t  case 2:\n\t\t\t\tc1 = ptr[0];\n\n\t\t\t\tif (!IS_IN_RANGE(c1, 0xC2, 0xDF)) {\n\n\t\t\t\t\t // malformed data, do something !!!\n\t\t\t\t\t return (unsigned long) -1;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t  case 3:\n\t\t\t\tc1 = ptr[0];\n\t\t\t\tc2 = ptr[1];\n\n\t\t\t\tif (((c1 == 0xE0) && !IS_IN_RANGE(c2, 0xA0, 0xBF)) ||\n\t\t\t\t\t ((c1 == 0xED) && !IS_IN_RANGE(c2, 0x80, 0x9F)) ||\n\t\t\t\t\t (!IS_IN_RANGE(c1, 0xE1, 0xEC) && !IS_IN_RANGE(c1, 0xEE, 0xEF))) {\n\n\t\t\t\t\t // malformed data, do something !!!\n\t\t\t\t\t return (unsigned long) -1;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t  case 4:\n\t\t\t\tc1 = ptr[0];\n\t\t\t\tc2 = ptr[1];\n\n\t\t\t\tif (((c1 == 0xF0) && !IS_IN_RANGE(c2, 0x90, 0xBF)) ||\n\t\t\t\t\t ((c1 == 0xF4) && !IS_IN_RANGE(c2, 0x80, 0x8F)) ||\n\t\t\t\t\t !IS_IN_RANGE(c1, 0xF1, 0xF3)) {\n\n\t\t\t\t\t // malformed data, do something !!!\n\t\t\t\t\t return (unsigned long) -1;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t }\n\n\t for (int i = 1; i < seqlen; ++i) {\n\n\t\t  uc = ((uc << 6) | (unsigned long)(ptr[i] & 0x3F));\n\n\t }\n\n\t p += seqlen;\n\t return uc;\n}\n\n\nnamespace {\n\n\n\tenum {\n\n\t\tPT_MOVE = 1,\n\t\tPT_LINE = 2,\n\t\tPT_CURVE = 3,\n\t\tPT_CUBIC = 4\n\n\t};\n\n\n\tstruct point {\n\n\t\tint x, y;\n\t\tunsigned char type;\n\n\t\tpoint () { }\n\t\tpoint (int x, int y, unsigned char type) : x (x), y (y), type (type) { }\n\n\t};\n\n\n\tstruct glyph {\n\n\t\tFT_ULong char_code;\n\t\tFT_Vector advance;\n\t\tFT_Glyph_Metrics metrics;\n\t\tint index, x, y;\n\t\tstd::vector<int> pts;\n\n\t\tglyph () : x (0), y (0) { }\n\n\t};\n\n\n\tstruct kerning {\n\n\t\tint l_glyph, r_glyph;\n\t\tint x, y;\n\n\t\tkerning () { }\n\t\tkerning (int l, int r, int x, int y) : l_glyph (l), r_glyph (r), x (x), y (y) { }\n\n\t};\n\n\n\tstruct glyph_sort_predicate {\n\n\t\tbool operator () (const glyph* g1, const glyph* g2) const {\n\n\t\t\treturn g1->char_code < g2->char_code;\n\n\t\t}\n\n\t};\n\n\n\ttypedef const FT_Vector *FVecPtr;\n\n\n\tint outline_move_to (FVecPtr to, void *user) {\n\n\t\tglyph *g = static_cast<glyph*> (user);\n\n\t\tg->pts.push_back (PT_MOVE);\n\t\tg->pts.push_back (to->x);\n\t\tg->pts.push_back (to->y);\n\n\t\tg->x = to->x;\n\t\tg->y = to->y;\n\n\t\treturn 0;\n\n\t}\n\n\n\tint outline_line_to (FVecPtr to, void *user) {\n\n\t\tglyph *g = static_cast<glyph*> (user);\n\n\t\tg->pts.push_back (PT_LINE);\n\t\tg->pts.push_back (to->x - g->x);\n\t\tg->pts.push_back (to->y - g->y);\n\n\t\tg->x = to->x;\n\t\tg->y = to->y;\n\n\t\treturn 0;\n\n\t}\n\n\n\tint outline_conic_to (FVecPtr ctl, FVecPtr to, void *user) {\n\n\t\tglyph *g = static_cast<glyph*> (user);\n\n\t\tg->pts.push_back (PT_CURVE);\n\t\tg->pts.push_back (ctl->x - g->x);\n\t\tg->pts.push_back (ctl->y - g->y);\n\t\tg->pts.push_back (to->x - ctl->x);\n\t\tg->pts.push_back (to->y - ctl->y);\n\n\t\tg->x = to->x;\n\t\tg->y = to->y;\n\n\t\treturn 0;\n\n\t}\n\n\n\tint outline_cubic_to (FVecPtr control1, FVecPtr control2, FVecPtr to, void *user) {\n\n\t\tglyph *g = static_cast<glyph*> (user);\n\n\t\tg->pts.push_back (PT_CUBIC);\n\t\tg->pts.push_back (control1->x - g->x);\n\t\tg->pts.push_back (control1->y - g->y);\n\t\tg->pts.push_back (control2->x - control1->x);\n\t\tg->pts.push_back (control2->y - control1->y);\n\t\tg->pts.push_back (to->x - control2->x);\n\t\tg->pts.push_back (to->y - control2->y);\n\n\t\tg->x = to->x;\n\t\tg->y = to->y;\n\n\t\treturn 0;\n\n\t}\n\n\n}\n\n\nnamespace lime {\n\n\n\tstatic int id_buffer;\n\tstatic int id_charCode;\n\tstatic int id_codepoint;\n\tstatic int id_height;\n\tstatic int id_index;\n\tstatic int id_horizontalAdvance;\n\tstatic int id_horizontalBearingX;\n\tstatic int id_horizontalBearingY;\n\tstatic int id_image;\n\tstatic int id_offset;\n\tstatic int id_offsetX;\n\tstatic int id_offsetY;\n\tstatic int id_size;\n\tstatic int id_verticalAdvance;\n\tstatic int id_verticalBearingX;\n\tstatic int id_verticalBearingY;\n\tstatic int id_width;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\n\n\tstatic void initialize () {\n\n\t\tif (!init) {\n\n\t\t\tid_width = val_id (\"width\");\n\t\t\tid_height = val_id (\"height\");\n\t\t\tid_x = val_id (\"x\");\n\t\t\tid_y = val_id (\"y\");\n\t\t\tid_offset = val_id (\"offset\");\n\t\t\tid_size = val_id (\"size\");\n\t\t\tid_codepoint = val_id (\"codepoint\");\n\n\t\t\tid_buffer = val_id (\"buffer\");\n\t\t\tid_charCode = val_id (\"charCode\");\n\t\t\tid_horizontalAdvance = val_id (\"horizontalAdvance\");\n\t\t\tid_horizontalBearingX = val_id (\"horizontalBearingX\");\n\t\t\tid_horizontalBearingY = val_id (\"horizontalBearingY\");\n\t\t\tid_image = val_id (\"image\");\n\t\t\tid_index = val_id (\"index\");\n\t\t\tid_offsetX = val_id (\"offsetX\");\n\t\t\tid_offsetY = val_id (\"offsetY\");\n\t\t\tid_verticalAdvance = val_id (\"verticalAdvance\");\n\t\t\tid_verticalBearingX = val_id (\"verticalBearingX\");\n\t\t\tid_verticalBearingY = val_id (\"verticalBearingY\");\n\n\t\t\tinit = true;\n\n\t\t}\n\n\t}\n\n\n\tFont::Font (Resource *resource, int faceIndex) {\n\n\t\tthis->library = 0;\n\t\tthis->face = 0;\n\t\tthis->faceMemory = 0;\n\n\t\tif (resource) {\n\n\t\t\tint error;\n\t\t\tFT_Library library;\n\n\t\t\terror = FT_Init_FreeType (&library);\n\n\t\t\tif (error) {\n\n\t\t\t\tprintf (\"Could not initialize FreeType\\n\");\n\n\t\t\t} else {\n\n\t\t\t\tFT_Face face;\n\t\t\t\tFILE_HANDLE *file = NULL;\n\t\t\t\tunsigned char *faceMemory = NULL;\n\n\t\t\t\tif (resource->path) {\n\n\t\t\t\t\tfile = lime::fopen (resource->path, \"rb\");\n\n\t\t\t\t\tif (!file) {\n\n\t\t\t\t\t\tFT_Done_FreeType (library);\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif (file->isFile ()) {\n\n\t\t\t\t\t\terror = FT_New_Face (library, resource->path, faceIndex, &face);\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tBytes data;\n\t\t\t\t\t\tdata.ReadFile (resource->path);\n\t\t\t\t\t\tfaceMemory = (unsigned char*)malloc (data.length);\n\t\t\t\t\t\tmemcpy (faceMemory, data.b, data.length);\n\n\t\t\t\t\t\tlime::fclose (file);\n\t\t\t\t\t\tfile = 0;\n\n\t\t\t\t\t\terror = FT_New_Memory_Face (library, faceMemory, data.length, faceIndex, &face);\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceMemory = (unsigned char*)malloc (resource->data->length);\n\t\t\t\t\tmemcpy (faceMemory, resource->data->b, resource->data->length);\n\t\t\t\t\terror = FT_New_Memory_Face (library, faceMemory, resource->data->length, faceIndex, &face);\n\n\t\t\t\t}\n\n\t\t\t\tif (file) {\n\n\t\t\t\t\tlime::fclose (file);\n\t\t\t\t\tfile = 0;\n\n\t\t\t\t}\n\n\t\t\t\tif (!error) {\n\n\t\t\t\t\tthis->library = library;\n\t\t\t\t\tthis->face = face;\n\t\t\t\t\tthis->faceMemory = faceMemory;\n\n\t\t\t\t\t/* Set charmap\n\t\t\t\t\t *\n\t\t\t\t\t * See http://www.microsoft.com/typography/otspec/name.htm for a list of\n\t\t\t\t\t * some possible platform-encoding pairs.  We're interested in 0-3 aka 3-1\n\t\t\t\t\t * - UCS-2.  Otherwise, fail. If a font has some unicode map, but lacks\n\t\t\t\t\t * UCS-2 - it is a broken or irrelevant font. What exactly Freetype will\n\t\t\t\t\t * select on face load (it promises most wide unicode, and if that will be\n\t\t\t\t\t * slower that UCS-2 - left as an excercise to check.\n\t\t\t\t\t */\n\t\t\t\t\tfor (int i = 0; i < ((FT_Face)face)->num_charmaps; i++) {\n\n\t\t\t\t\t\tFT_UShort pid = ((FT_Face)face)->charmaps[i]->platform_id;\n\t\t\t\t\t\tFT_UShort eid = ((FT_Face)face)->charmaps[i]->encoding_id;\n\n\t\t\t\t\t\tif (((pid == 0) && (eid == 3)) || ((pid == 3) && (eid == 1))) {\n\n\t\t\t\t\t\t\tFT_Set_Charmap ((FT_Face)face, ((FT_Face)face)->charmaps[i]);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tFT_Done_FreeType (library);\n\t\t\t\t\tfree (faceMemory);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\tFont::~Font () {\n\n\t\tif (library) {\n\n\t\t\tFT_Done_FreeType ((FT_Library)library);\n\t\t\tlibrary = 0;\n\t\t\tface = 0;\n\n\t\t}\n\n\t\tfree (faceMemory);\n\t\tfaceMemory = 0;\n\n\t}\n\n\n\tvoid* Font::Decompose (bool useCFFIValue, int em) {\n\n\t\tint result, i, j;\n\n\t\tFT_Set_Char_Size ((FT_Face)face, em, em, 72, 72);\n\t\tFT_Set_Transform ((FT_Face)face, 0, NULL);\n\n\t\tstd::vector<glyph*> glyphs;\n\n\t\tFT_Outline_Funcs ofn =\n\t\t{\n\t\t\toutline_move_to,\n\t\t\toutline_line_to,\n\t\t\toutline_conic_to,\n\t\t\toutline_cubic_to,\n\t\t\t0, // shift\n\t\t\t0  // delta\n\t\t};\n\n\t\t// Import every character in face\n\t\tFT_ULong char_code;\n\t\tFT_UInt glyph_index;\n\n\t\tchar_code = FT_Get_First_Char ((FT_Face)face, &glyph_index);\n\n\t\twhile (glyph_index != 0) {\n\n\t\t\tif (FT_Load_Glyph ((FT_Face)face, glyph_index, FT_LOAD_NO_BITMAP | FT_LOAD_FORCE_AUTOHINT | FT_LOAD_DEFAULT) == 0) {\n\n\t\t\t\tglyph *g = new glyph;\n\t\t\t\tresult = FT_Outline_Decompose (&((FT_Face)face)->glyph->outline, &ofn, g);\n\n\t\t\t\tif (result == 0) {\n\n\t\t\t\t\tg->index = glyph_index;\n\t\t\t\t\tg->char_code = char_code;\n\t\t\t\t\tg->metrics = ((FT_Face)face)->glyph->metrics;\n\t\t\t\t\tglyphs.push_back (g);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdelete g;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tchar_code = FT_Get_Next_Char ((FT_Face)face, char_code, &glyph_index);\n\n\t\t}\n\n\t\t// Ascending sort by character codes\n\t\tstd::sort (glyphs.begin (), glyphs.end (), glyph_sort_predicate ());\n\n\t\tstd::vector<kerning>  kern;\n\t\tif (FT_HAS_KERNING (((FT_Face)face))) {\n\n\t\t\tint n = glyphs.size ();\n\t\t\tFT_Vector v;\n\n\t\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t\tint  l_glyph = glyphs[i]->index;\n\n\t\t\t\tfor (j = 0; j < n; j++) {\n\n\t\t\t\t\tint r_glyph = glyphs[j]->index;\n\n\t\t\t\t\tFT_Get_Kerning ((FT_Face)face, l_glyph, r_glyph, FT_KERNING_DEFAULT, &v);\n\n\t\t\t\t\tif (v.x != 0 || v.y != 0) {\n\n\t\t\t\t\t\tkern.push_back (kerning (i, j, v.x, v.y));\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tint num_glyphs = glyphs.size ();\n\n\t\twchar_t* family_name = GetFamilyName ();\n\n\t\t#ifdef LIME_FREETYPE_SWF_METRICS\n\n\t\t// this should more closely match how [Embed] works in AS3 when\n\t\t// embedding a font in a SWF\n\n\t\tint calculatedAscender = 0;\n\t\tint calculatedDescender = 0;\n\t\tint calculatedHeight = 0;\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tif (os2 && os2->version != 0xFFFFU) {\n\n\t\t\tcalculatedAscender = (FT_Short)os2->usWinAscent;\n\t\t\tcalculatedDescender = -(FT_Short)os2->usWinDescent;\n\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender;\n\n\t\t} else if (hhea) {\n\n\t\t\tcalculatedAscender = hhea->Ascender;\n\t\t\tcalculatedDescender = hhea->Descender;\n\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;\n\n\t\t} else {\n\n\t\t\t// should never happen, but let's have a fallback to be safe\n\t\t\tcalculatedAscender = ((FT_Face)face)->ascender;\n\t\t\tcalculatedDescender = ((FT_Face)face)->descender;\n\t\t\tcalculatedHeight = ((FT_Face)face)->height;\n\n\t\t}\n\n\t\t#elif defined(LIME_FREETYPE_LEGACY_METRICS)\n\n\t\t// this is FreeType's font metrics algorithm from 2.9.1\n\t\t// it behaves more like SWF than the new algorithm\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tint calculatedAscender = 0;\n\t\tint calculatedDescender = 0;\n\t\tint calculatedHeight = 0;\n\n\t\tif (hhea) {\n\n\t\t\tcalculatedAscender = hhea->Ascender;\n\t\t\tcalculatedDescender = hhea->Descender;\n\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;\n\n\t\t}\n\n        if (!( calculatedAscender || calculatedDescender ))\n        {\n\t\t\tif (os2 && os2->version != 0xFFFFU)\n\t\t\t{\n\t\t\t\tif (os2->sTypoAscender || os2->sTypoDescender)\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = os2->sTypoAscender;\n\t\t\t\t\tcalculatedDescender = os2->sTypoDescender;\n\t\t\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender + os2->sTypoLineGap;\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = (FT_Short)os2->usWinAscent;\n\t\t\t\t\tcalculatedDescender = -(FT_Short)os2->usWinDescent;\n\t\t\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender;\n\n\t\t\t\t}\n\t\t\t}\n        }\n\n\t\tif (!calculatedAscender || !calculatedDescender) {\n\n\t\t\tcalculatedAscender = ((FT_Face)face)->ascender;\n\t\t\tcalculatedDescender = ((FT_Face)face)->descender;\n\t\t\tcalculatedHeight = ((FT_Face)face)->height;\n\n\t\t}\n\n\t\t#else\n\n\t\tint calculatedAscender = ((FT_Face)face)->ascender;\n\t\tint calculatedDescender = ((FT_Face)face)->descender;\n\t\tint calculatedHeight = ((FT_Face)face)->height;\n\n\t\t#endif\n\n\t\tif (useCFFIValue) {\n\n\t\t\tvalue ret = alloc_empty_object ();\n\t\t\talloc_field (ret, val_id (\"has_kerning\"), alloc_bool (FT_HAS_KERNING (((FT_Face)face))));\n\t\t\talloc_field (ret, val_id (\"is_fixed_width\"), alloc_bool (FT_IS_FIXED_WIDTH (((FT_Face)face))));\n\t\t\talloc_field (ret, val_id (\"has_glyph_names\"), alloc_bool (FT_HAS_GLYPH_NAMES (((FT_Face)face))));\n\t\t\talloc_field (ret, val_id (\"is_italic\"), alloc_bool (((FT_Face)face)->style_flags & FT_STYLE_FLAG_ITALIC));\n\t\t\talloc_field (ret, val_id (\"is_bold\"), alloc_bool (((FT_Face)face)->style_flags & FT_STYLE_FLAG_BOLD));\n\t\t\talloc_field (ret, val_id (\"num_glyphs\"), alloc_int (num_glyphs));\n\t\t\talloc_field (ret, val_id (\"family_name\"), family_name == NULL ? alloc_string (((FT_Face)face)->family_name) : alloc_wstring (family_name));\n\t\t\talloc_field (ret, val_id (\"style_name\"), alloc_string (((FT_Face)face)->style_name));\n\t\t\talloc_field (ret, val_id (\"em_size\"), alloc_int (((FT_Face)face)->units_per_EM));\n\t\t\talloc_field (ret, val_id (\"ascend\"), alloc_int (calculatedAscender));\n\t\t\talloc_field (ret, val_id (\"descend\"), alloc_int (calculatedDescender));\n\t\t\talloc_field (ret, val_id (\"height\"), alloc_int (calculatedHeight));\n\n\t\t\tdelete family_name;\n\n\t\t\t// 'glyphs' field\n\t\t\tvalue neko_glyphs = alloc_array (num_glyphs);\n\t\t\tfor (i = 0; i < glyphs.size (); i++) {\n\n\t\t\t\tglyph *g = glyphs[i];\n\t\t\t\tint num_points = g->pts.size ();\n\n\t\t\t\tvalue points = alloc_array (num_points);\n\n\t\t\t\tfor (j = 0; j < num_points; j++) {\n\n\t\t\t\t\tval_array_set_i (points, j, alloc_int (g->pts[j]));\n\n\t\t\t\t}\n\n\t\t\t\tvalue item = alloc_empty_object ();\n\t\t\t\tval_array_set_i (neko_glyphs, i, item);\n\t\t\t\talloc_field (item, val_id (\"char_code\"), alloc_int (g->char_code));\n\t\t\t\talloc_field (item, val_id (\"advance\"), alloc_int (g->metrics.horiAdvance));\n\t\t\t\talloc_field (item, val_id (\"min_x\"), alloc_int (g->metrics.horiBearingX));\n\t\t\t\talloc_field (item, val_id (\"max_x\"), alloc_int (g->metrics.horiBearingX + g->metrics.width));\n\t\t\t\talloc_field (item, val_id (\"min_y\"), alloc_int (g->metrics.horiBearingY - g->metrics.height));\n\t\t\t\talloc_field (item, val_id (\"max_y\"), alloc_int (g->metrics.horiBearingY));\n\t\t\t\talloc_field (item, val_id (\"points\"), points);\n\n\t\t\t\tdelete g;\n\n\t\t\t}\n\n\t\t\talloc_field (ret, val_id (\"glyphs\"), neko_glyphs);\n\n\t\t\t// 'kerning' field\n\t\t\tif (FT_HAS_KERNING (((FT_Face)face))) {\n\n\t\t\t\tvalue neko_kerning = alloc_array (kern.size ());\n\n\t\t\t\tfor (i = 0; i < kern.size(); i++) {\n\n\t\t\t\t\tkerning *k = &kern[i];\n\n\t\t\t\t\tvalue item = alloc_empty_object();\n\t\t\t\t\tval_array_set_i (neko_kerning,i,item);\n\t\t\t\t\talloc_field (item, val_id (\"left_glyph\"), alloc_int (k->l_glyph));\n\t\t\t\t\talloc_field (item, val_id (\"right_glyph\"), alloc_int (k->r_glyph));\n\t\t\t\t\talloc_field (item, val_id (\"x\"), alloc_int (k->x));\n\t\t\t\t\talloc_field (item, val_id (\"y\"), alloc_int (k->y));\n\n\t\t\t\t}\n\n\t\t\t\talloc_field (ret, val_id (\"kerning\"), neko_kerning);\n\n\t\t\t} else {\n\n\t\t\t\talloc_field (ret, val_id (\"kerning\"), alloc_null ());\n\n\t\t\t}\n\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tvdynamic* ret = (vdynamic*)hl_alloc_dynobj ();\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"has_kerning\"), &hlt_bool, FT_HAS_KERNING (((FT_Face)face)));\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"is_fixed_width\"), &hlt_bool, FT_IS_FIXED_WIDTH (((FT_Face)face)));\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"has_glyph_names\"), &hlt_bool, FT_HAS_GLYPH_NAMES (((FT_Face)face)));\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"is_italic\"), &hlt_bool, ((FT_Face)face)->style_flags & FT_STYLE_FLAG_ITALIC);\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"is_bold\"), &hlt_bool, ((FT_Face)face)->style_flags & FT_STYLE_FLAG_BOLD);\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"num_glyphs\"), &hlt_i32, num_glyphs);\n\n\t\t\tchar* _family_name = NULL;\n\n\t\t\tif (family_name != NULL) {\n\n\t\t\t\tint length = std::wcslen (family_name);\n\t\t\t\tchar* result = (char*)malloc (length + 1);\n\t\t\t\tstd::wcstombs (result, family_name, length);\n\t\t\t\tresult[length] = '\\0';\n\t\t\t\tdelete family_name;\n\n\t\t\t} else {\n\n\t\t\t\tint length = strlen (((FT_Face)face)->family_name);\n\t\t\t\t_family_name = (char*)malloc (length + 1);\n\t\t\t\tstrcpy (_family_name, ((FT_Face)face)->family_name);\n\n\t\t\t}\n\n\t\t\tchar* style_name = (char*)malloc(strlen(((FT_Face)face)->style_name) + 1);\n\t\t\tstrcpy(style_name, ((FT_Face)face)->style_name);\n\n\t\t\thl_dyn_setp (ret, hl_hash_utf8 (\"family_name\"), &hlt_bytes, _family_name);\n\t\t\thl_dyn_setp (ret, hl_hash_utf8 (\"style_name\"), &hlt_bytes, style_name);\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"em_size\"), &hlt_i32, ((FT_Face)face)->units_per_EM);\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"ascend\"), &hlt_i32, calculatedAscender);\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"descend\"), &hlt_i32, calculatedDescender);\n\t\t\thl_dyn_seti (ret, hl_hash_utf8 (\"height\"), &hlt_i32, calculatedHeight);\n\n\t\t\t// 'glyphs' field\n\t\t\thl_varray* _glyphs = (hl_varray*)hl_alloc_array (&hlt_dynobj, num_glyphs);\n\t\t\tvdynamic** _glyphsData = hl_aptr (_glyphs, vdynamic*);\n\n\t\t\tfor (i = 0; i < glyphs.size (); i++) {\n\n\t\t\t\tglyph *g = glyphs[i];\n\t\t\t\tint num_points = g->pts.size ();\n\n\t\t\t\thl_varray* points = (hl_varray*)hl_alloc_array (&hlt_i32, num_points);\n\t\t\t\tint* pointsData = hl_aptr (points, int);\n\n\t\t\t\tfor (j = 0; j < num_points; j++) {\n\n\t\t\t\t\t*pointsData++ = g->pts[j];\n\n\t\t\t\t}\n\n\t\t\t\tvdynamic* item = (vdynamic*)hl_alloc_dynobj ();\n\t\t\t\t*_glyphsData++ = item;\n\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"char_code\"), &hlt_i32, g->char_code);\n\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"advance\"), &hlt_i32, g->metrics.horiAdvance);\n\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"min_x\"), &hlt_i32, g->metrics.horiBearingX);\n\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"max_x\"), &hlt_i32, g->metrics.horiBearingX + g->metrics.width);\n\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"min_y\"), &hlt_i32, g->metrics.horiBearingY - g->metrics.height);\n\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"max_y\"), &hlt_i32, g->metrics.horiBearingY);\n\t\t\t\thl_dyn_setp (item, hl_hash_utf8 (\"points\"), &hlt_array, points);\n\n\t\t\t\tdelete g;\n\n\t\t\t}\n\n\t\t\thl_dyn_setp (ret, hl_hash_utf8 (\"glyphs\"), &hlt_array, _glyphs);\n\n\t\t\t// 'kerning' field\n\t\t\tif (FT_HAS_KERNING (((FT_Face)face))) {\n\n\t\t\t\thl_varray* _kerning = (hl_varray*)hl_alloc_array (&hlt_i32, kern.size ());\n\t\t\t\tvdynamic** _kerningData = hl_aptr (_kerning, vdynamic*);\n\n\t\t\t\tfor (i = 0; i < kern.size(); i++) {\n\n\t\t\t\t\tkerning *k = &kern[i];\n\n\t\t\t\t\tvdynamic* item = (vdynamic*)hl_alloc_dynobj ();\n\t\t\t\t\t*_kerningData++ = item;\n\t\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"left_glyph\"), &hlt_i32, k->l_glyph);\n\t\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"right_glyph\"), &hlt_i32, k->r_glyph);\n\t\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"x\"), &hlt_i32, k->x);\n\t\t\t\t\thl_dyn_seti (item, hl_hash_utf8 (\"y\"), &hlt_i32, k->y);\n\n\t\t\t\t}\n\n\t\t\t\thl_dyn_setp (ret, hl_hash_utf8 (\"kerning\"), &hlt_array, _kerning);\n\n\t\t\t} else {\n\n\t\t\t\thl_dyn_setp (ret, hl_hash_utf8 (\"kerning\"), &hlt_array, 0);\n\n\t\t\t}\n\n\t\t\treturn ret;\n\n\t\t}\n\n\t}\n\n\n\tint Font::GetAscender () {\n\n\t\t#ifdef LIME_FREETYPE_SWF_METRICS\n\n\t\t// this should more closely match how [Embed] works in AS3 when\n\t\t// embedding a font in a SWF\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tif (os2 && os2->version != 0xFFFFU) {\n\n\t\t\treturn (FT_Short)os2->usWinAscent;\n\n\t\t} else if (hhea) {\n\n\t\t\treturn hhea->Ascender;\n\n\t\t}\n\n\t\t// should never happen, but let's have a fallback to be safe\n\t\treturn ((FT_Face)face)->ascender;\n\n\t\t#elif defined(LIME_FREETYPE_LEGACY_METRICS)\n\n\t\t// this is FreeType's font metrics algorithm from 2.9.1\n\t\t// it behaves more like SWF than the new algorithm\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tint calculatedAscender = 0;\n\t\tint calculatedDescender = 0;\n\n\t\tif (hhea) {\n\n\t\t\tcalculatedAscender = hhea->Ascender;\n\t\t\tcalculatedDescender = hhea->Descender;\n\t\t}\n\n        if (!( calculatedAscender || calculatedDescender ))\n        {\n\t\t\tif (os2 && os2->version != 0xFFFFU)\n\t\t\t{\n\t\t\t\tif (os2->sTypoAscender || os2->sTypoDescender)\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = os2->sTypoAscender;\n\t\t\t\t\tcalculatedDescender = os2->sTypoDescender;\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = (FT_Short)os2->usWinAscent;\n\t\t\t\t\tcalculatedDescender = -(FT_Short)os2->usWinDescent;\n\n\t\t\t\t}\n\t\t\t}\n        }\n\n\t\tif (!calculatedAscender || !calculatedDescender) {\n\n\t\t\tcalculatedAscender = ((FT_Face)face)->ascender;\n\t\t\tcalculatedDescender = ((FT_Face)face)->descender;\n\n\t\t}\n\n\t\treturn calculatedAscender;\n\n\t\t#else\n\n\t\treturn ((FT_Face)face)->ascender;\n\n\t\t#endif\n\n\t}\n\n\n\tint Font::GetDescender () {\n\n\t\t#ifdef LIME_FREETYPE_SWF_METRICS\n\n\t\t// this should more closely match how [Embed] works in AS3 when\n\t\t// embedding a font in a SWF\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tif (os2 && os2->version != 0xFFFFU) {\n\n\t\t\treturn -(FT_Short)os2->usWinDescent;\n\n\t\t}\n\t\telse if (hhea) {\n\n\t\t\treturn hhea->Descender;\n\n\t\t}\n\n\t\t// should never happen, but let's have a fallback to be safe\n\t\treturn ((FT_Face)face)->descender;\n\n\t\t#elif defined(LIME_FREETYPE_LEGACY_METRICS)\n\n\t\t// this is FreeType's font metrics algorithm from 2.9.1\n\t\t// it behaves more like SWF than the new algorithm\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tint calculatedAscender = 0;\n\t\tint calculatedDescender = 0;\n\n\t\tif (hhea) {\n\n\t\t\tcalculatedAscender = hhea->Ascender;\n\t\t\tcalculatedDescender = hhea->Descender;\n\n\t\t}\n\n        if (!( calculatedAscender || calculatedDescender ))\n        {\n\t\t\tif (os2 && os2->version != 0xFFFFU)\n\t\t\t{\n\t\t\t\tif (os2->sTypoAscender || os2->sTypoDescender)\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = os2->sTypoAscender;\n\t\t\t\t\tcalculatedDescender = os2->sTypoDescender;\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = (FT_Short)os2->usWinAscent;\n\t\t\t\t\tcalculatedDescender = -(FT_Short)os2->usWinDescent;\n\n\t\t\t\t}\n\t\t\t}\n        }\n\n\t\tif (!calculatedAscender || !calculatedDescender) {\n\n\t\t\tcalculatedAscender = ((FT_Face)face)->ascender;\n\t\t\tcalculatedDescender = ((FT_Face)face)->descender;\n\n\t\t}\n\n\t\treturn calculatedDescender;\n\n\t\t#else\n\n\t\treturn ((FT_Face)face)->descender;\n\n\t\t#endif\n\n\t}\n\n\n\twchar_t *Font::GetFamilyName () {\n\n\t\t#ifdef LIME_FREETYPE\n\n\t\twchar_t *family_name = NULL;\n\t\tFT_SfntName sfnt_name;\n\t\tFT_UInt num_sfnt_names, sfnt_name_index;\n\t\tint len, i;\n\n\t\tif (FT_IS_SFNT (((FT_Face)face))) {\n\n\t\t\tnum_sfnt_names = FT_Get_Sfnt_Name_Count ((FT_Face)face);\n\t\t\tsfnt_name_index = 0;\n\n\t\t\twhile (sfnt_name_index < num_sfnt_names) {\n\n\t\t\t\tif (!FT_Get_Sfnt_Name ((FT_Face)face, sfnt_name_index++, (FT_SfntName *)&sfnt_name) && sfnt_name.name_id == TT_NAME_ID_FULL_NAME) {\n\n\t\t\t\t\tif (sfnt_name.platform_id == TT_PLATFORM_MACINTOSH) {\n\n\t\t\t\t\t\tlen = sfnt_name.string_len;\n\t\t\t\t\t\tfamily_name = new wchar_t[len + 1];\n\t\t\t\t\t\t#if defined(ANDROID) && !defined(HXCPP_CLANG)\n\t\t\t\t\t\t// Fix some devices (Android 4.x or older) that have a bad stdc implementation\n\t\t\t\t\t\t_mbsrtowcs (family_name, (const char**)&sfnt_name.string, len, 0);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\tmbstowcs (family_name, (const char*)sfnt_name.string, len);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\tfamily_name[len] = L'\\0';\n\t\t\t\t\t\treturn family_name;\n\n\t\t\t\t\t} else if ((sfnt_name.platform_id == TT_PLATFORM_MICROSOFT) && (sfnt_name.encoding_id == TT_MS_ID_UNICODE_CS)) {\n\n\t\t\t\t\t\tlen = sfnt_name.string_len / 2;\n\t\t\t\t\t\tfamily_name = (wchar_t*)malloc ((len + 1) * sizeof (wchar_t));\n\n\t\t\t\t\t\tfor (i = 0; i < len; i++) {\n\n\t\t\t\t\t\t\tfamily_name[i] = ((wchar_t)sfnt_name.string[i * 2 + 1]) | (((wchar_t)sfnt_name.string[i * 2]) << 8);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfamily_name[len] = L'\\0';\n\t\t\t\t\t\treturn family_name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn NULL;\n\n\t}\n\n\n\tint Font::GetGlyphIndex (const char* character) {\n\n\t\tlong charCode = readNextChar (character);\n\n\t\treturn FT_Get_Char_Index ((FT_Face)face, charCode);\n\n\t}\n\n\n\tvoid* Font::GetGlyphIndices (bool useCFFIValue, const char* characters) {\n\n\t\tif (useCFFIValue) {\n\n\t\t\tvalue indices = alloc_array (0);\n\t\t\tunsigned long character;\n\t\t\tint index;\n\n\t\t\twhile (*characters != 0) {\n\n\t\t\t\tcharacter = readNextChar (characters);\n\n\t\t\t\tif (character == -1)\n\t\t\t\t\tbreak;\n\n\t\t\t\tindex = FT_Get_Char_Index ((FT_Face)face, character);\n\t\t\t\tval_array_push (indices, alloc_int (index));\n\n\t\t\t}\n\n\t\t\treturn indices;\n\n\t\t} else {\n\n\t\t\tunsigned long character;\n\t\t\tint index;\n\t\t\tint count = 0;\n\t\t\tconst char* characters_start = characters;\n\n\t\t\twhile (*characters != 0) {\n\n\t\t\t\tcharacter = readNextChar (characters);\n\n\t\t\t\tif (character == -1)\n\t\t\t\t\tbreak;\n\n\t\t\t\tcount++;\n\n\t\t\t}\n\n\t\t\thl_varray* indices = (hl_varray*)hl_alloc_array (&hlt_i32, count);\n\t\t\tint* indicesData = hl_aptr (indices, int);\n\t\t\tcharacters = characters_start;\n\n\t\t\twhile (*characters != 0) {\n\n\t\t\t\tcharacter = readNextChar (characters);\n\n\t\t\t\tif (character == -1)\n\t\t\t\t\tbreak;\n\n\t\t\t\t*indicesData++ = FT_Get_Char_Index ((FT_Face)face, character);\n\n\t\t\t}\n\n\t\t\treturn indices;\n\n\t\t}\n\n\t}\n\n\n\tvoid* Font::GetGlyphMetrics (bool useCFFIValue, int index) {\n\n\t\tif (useCFFIValue) {\n\n\t\t\tinitialize ();\n\n\t\t\tif (FT_Load_Glyph ((FT_Face)face, index, FT_LOAD_NO_BITMAP | FT_LOAD_FORCE_AUTOHINT | FT_LOAD_DEFAULT) == 0) {\n\n\t\t\t\tvalue metrics = alloc_empty_object ();\n\n\t\t\t\talloc_field (metrics, id_height, alloc_int (((FT_Face)face)->glyph->metrics.height));\n\t\t\t\talloc_field (metrics, id_horizontalBearingX, alloc_int (((FT_Face)face)->glyph->metrics.horiBearingX));\n\t\t\t\talloc_field (metrics, id_horizontalBearingY, alloc_int (((FT_Face)face)->glyph->metrics.horiBearingY));\n\t\t\t\talloc_field (metrics, id_horizontalAdvance, alloc_int (((FT_Face)face)->glyph->metrics.horiAdvance));\n\t\t\t\talloc_field (metrics, id_verticalBearingX, alloc_int (((FT_Face)face)->glyph->metrics.vertBearingX));\n\t\t\t\talloc_field (metrics, id_verticalBearingY, alloc_int (((FT_Face)face)->glyph->metrics.vertBearingY));\n\t\t\t\talloc_field (metrics, id_verticalAdvance, alloc_int (((FT_Face)face)->glyph->metrics.vertAdvance));\n\n\t\t\t\treturn metrics;\n\n\t\t\t}\n\n\t\t\treturn alloc_null ();\n\n\t\t} else {\n\n\t\t\tif (FT_Load_Glyph ((FT_Face)face, index, FT_LOAD_NO_BITMAP | FT_LOAD_FORCE_AUTOHINT | FT_LOAD_DEFAULT) == 0) {\n\n\t\t\t\tconst int id_height = hl_hash_utf8 (\"height\");\n\t\t\t\tconst int id_horizontalBearingX = hl_hash_utf8 (\"horizontalBearingX\");\n\t\t\t\tconst int id_horizontalBearingY = hl_hash_utf8 (\"horizontalBearingY\");\n\t\t\t\tconst int id_horizontalAdvance = hl_hash_utf8 (\"horizontalAdvance\");\n\t\t\t\tconst int id_verticalBearingX = hl_hash_utf8 (\"verticalBearingX\");\n\t\t\t\tconst int id_verticalBearingY = hl_hash_utf8 (\"verticalBearingY\");\n\t\t\t\tconst int id_verticalAdvance = hl_hash_utf8 (\"verticalAdvance\");\n\n\t\t\t\tvdynamic* metrics = (vdynamic*)hl_alloc_dynobj ();\n\n\t\t\t\thl_dyn_seti (metrics, id_height, &hlt_i32, ((FT_Face)face)->glyph->metrics.height);\n\t\t\t\thl_dyn_seti (metrics, id_horizontalBearingX, &hlt_i32, ((FT_Face)face)->glyph->metrics.horiBearingX);\n\t\t\t\thl_dyn_seti (metrics, id_horizontalBearingY, &hlt_i32, ((FT_Face)face)->glyph->metrics.horiBearingY);\n\t\t\t\thl_dyn_seti (metrics, id_horizontalAdvance, &hlt_i32, ((FT_Face)face)->glyph->metrics.horiAdvance);\n\t\t\t\thl_dyn_seti (metrics, id_verticalBearingX, &hlt_i32, ((FT_Face)face)->glyph->metrics.vertBearingX);\n\t\t\t\thl_dyn_seti (metrics, id_verticalBearingY, &hlt_i32, ((FT_Face)face)->glyph->metrics.vertBearingY);\n\t\t\t\thl_dyn_seti (metrics, id_verticalAdvance, &hlt_i32, ((FT_Face)face)->glyph->metrics.vertAdvance);\n\n\t\t\t\treturn metrics;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\n\tint Font::GetHeight () {\n\n\t\t#ifdef LIME_FREETYPE_SWF_METRICS\n\n\t\t// this should more closely match how [Embed] works in AS3 when\n\t\t// embedding a font in a SWF\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tif (os2 && os2->version != 0xFFFFU) {\n\n\t\t\tint calculatedAscender = (FT_Short)os2->usWinAscent;\n\t\t\tint calculatedDescender = -(FT_Short)os2->usWinDescent;\n\t\t\treturn calculatedAscender - calculatedDescender;\n\n\t\t} else if (hhea) {\n\n\t\t\tint calculatedAscender = hhea->Ascender;\n\t\t\tint calculatedDescender = hhea->Descender;\n\t\t\treturn calculatedAscender - calculatedDescender + hhea->Line_Gap;\n\n\t\t}\n\n\t\t// should never happen, but let's have a fallback to be safe\n\t\treturn ((FT_Face)face)->height;\n\n\t\t#elif defined(LIME_FREETYPE_LEGACY_METRICS)\n\n\t\t// this is FreeType's font metrics algorithm from 2.9.1\n\t\t// it behaves more like SWF than the new algorithm\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\t\tTT_HoriHeader* hhea = (TT_HoriHeader*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_hhea);\n\n\t\tint calculatedAscender = 0;\n\t\tint calculatedDescender = 0;\n\t\tint calculatedHeight = 0;\n\n\t\tif (hhea) {\n\n\t\t\tcalculatedAscender = hhea->Ascender;\n\t\t\tcalculatedDescender = hhea->Descender;\n\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender + hhea->Line_Gap;\n\n\t\t}\n\n        if (!( calculatedAscender || calculatedDescender ))\n        {\n\t\t\tif (os2 && os2->version != 0xFFFFU)\n\t\t\t{\n\t\t\t\tif (os2->sTypoAscender || os2->sTypoDescender)\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = os2->sTypoAscender;\n\t\t\t\t\tcalculatedDescender = os2->sTypoDescender;\n\t\t\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender + os2->sTypoLineGap;\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\n\t\t\t\t\tcalculatedAscender = (FT_Short)os2->usWinAscent;\n\t\t\t\t\tcalculatedDescender = -(FT_Short)os2->usWinDescent;\n\t\t\t\t\tcalculatedHeight = calculatedAscender - calculatedDescender;\n\n\t\t\t\t}\n\t\t\t}\n        }\n\n        if (!calculatedHeight) {\n\n\t\t\tcalculatedHeight = ((FT_Face)face)->height;\n\n\t\t}\n\n\t\treturn calculatedHeight;\n\n\t\t#else\n\n\t\treturn ((FT_Face)face)->height;\n\n\t\t#endif\n\n\t}\n\n\n\tint Font::GetNumGlyphs () {\n\n\t\treturn ((FT_Face)face)->num_glyphs;\n\n\t}\n\n\n\tint Font::GetUnderlinePosition () {\n\n\t\treturn ((FT_Face)face)->underline_position;\n\n\t}\n\n\n\tint Font::GetUnderlineThickness () {\n\n\t\treturn ((FT_Face)face)->underline_thickness;\n\n\t}\n\n\n\tint Font::GetStrikethroughPosition () {\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\n\t\tif (os2 && os2->version != 0xFFFFU)\n\t\t{\n\n\t\t\treturn os2->yStrikeoutPosition;\n\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\n\tint Font::GetStrikethroughThickness () {\n\n\t\tTT_OS2* os2 = (TT_OS2*)FT_Get_Sfnt_Table(((FT_Face)face), ft_sfnt_os2);\n\n\n\t\tif (os2 && os2->version != 0xFFFFU)\n\t\t{\n\n\t\t\treturn os2->yStrikeoutSize;\n\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\n\tint Font::GetUnitsPerEM () {\n\n\t\treturn ((FT_Face)face)->units_per_EM;\n\n\t}\n\n\n\tint Font::RenderGlyph(int index, Bytes *bytes, int offset)\n\t{\n\t\tif (FT_Load_Glyph((FT_Face)face, index, FT_LOAD_FORCE_AUTOHINT | FT_LOAD_DEFAULT) == 0)\n\t\t{\n\t\t\tif (FT_Render_Glyph(((FT_Face)face)->glyph, FT_RENDER_MODE_LCD) == 0)\n\t\t\t{\n\t\t\t\tFT_Bitmap bitmap = ((FT_Face)face)->glyph->bitmap;\n\n\t\t\t\tint height = bitmap.rows;\n\t\t\t\tint width = bitmap.width / 3; //Due to each pixel now has 3 components (R, G, B)\n\t\t\t\tint pitch = bitmap.pitch;\n\n\t\t\t\tif (width == 0 || height == 0)\n\t\t\t\t\treturn 0;\n\n\t\t\t\t//We calculate the size needed for the glyph image, including metadata and 24-bit RGB color data\n\t\t\t\tuint32_t size = sizeof(GlyphImage) + (width * height * 4);\n\n\t\t\t\tif (bytes->length < size + offset)\n\t\t\t\t{\n\t\t\t\t\tbytes->Resize(size + offset);\n\t\t\t\t}\n\n\t\t\t\tGlyphImage *data = (GlyphImage *)(bytes->b + offset);\n\n\t\t\t\t//We should initialize the GlyphImage struct here with zero to avoid uninitialized values\n\t\t\t\tmemset(data, 0, sizeof(GlyphImage));\n\n\t\t\t\tdata->index = index;\n\t\t\t\tdata->width = width;\n\t\t\t\tdata->height = height;\n\t\t\t\tdata->x = ((FT_Face)face)->glyph->bitmap_left;\n\t\t\t\tdata->y = ((FT_Face)face)->glyph->bitmap_top;\n\n\t\t\t\tunsigned char *position = &data->data;\n\n\t\t\t\t//Copy the bitmap data row by row, copying each RGB triplet and adding padding for 32-bit alignment\n\t\t\t\tfor (int i = 0; i < height; i++)\n\t\t\t\t{\n\t\t\t\t\tfor (int j = 0; j < width; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tunsigned char r = bitmap.buffer[i * pitch + j * 3 + 0];\n\t\t\t\t\t\tunsigned char g = bitmap.buffer[i * pitch + j * 3 + 1];\n\t\t\t\t\t\tunsigned char b = bitmap.buffer[i * pitch + j * 3 + 2];\n\t\t\t\t\t\tunsigned char a = (r + g + b) / 3;\n\n\t\t\t\t\t\t//Red\n\t\t\t\t\t\tposition[(i * width + j) * 4 + 0] = r;\n\t\t\t\t\t\t//Green\n\t\t\t\t\t\tposition[(i * width + j) * 4 + 1] = g;\n\t\t\t\t\t\t//Blue\n\t\t\t\t\t\tposition[(i * width + j) * 4 + 2] = b;\n\t\t\t\t\t\t//Alpha\n\t\t\t\t\t\tposition[(i * width + j) * 4 + 3] = a;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn size;\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\n\tint Font::RenderGlyphs (value indices, Bytes *bytes) {\n\n\t\tint offset = 0;\n\t\tint totalOffset = 4;\n\t\tuint32_t count = 0;\n\n\t\tint numIndices = val_array_size (indices);\n\n\t\tfor (int i = 0; i < numIndices; i++) {\n\n\t\t\toffset = RenderGlyph (val_int (val_array_i (indices, i)), bytes, totalOffset);\n\n\t\t\tif (offset > 0) {\n\n\t\t\t\ttotalOffset += offset;\n\t\t\t\tcount++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (count > 0) {\n\n\t\t\t*(uint32_t*)(bytes->b) = count;\n\n\t\t}\n\n\t\treturn totalOffset;\n\n\t}\n\n\tvoid Font::SetSize(size_t size, size_t dpi)\n\t{\n\t\t//We changed the function signature to include a dpi argument which changes this from\n\t\t//the default value of 72 for dpi. Any public api that uses this should probably be changed\n\t\t//to allow setting the dpi in an appropriate future release.\n\t\tsize_t hdpi = dpi;\n\t\tsize_t vdpi = dpi;\n\n\t\tFT_Set_Char_Size(\n\t\t\t(FT_Face)face,\t\t\t\t\t\t//Handle to the target face object\n\t\t\t0,\t\t\t\t\t\t\t\t\t//Char width in 1/64th of points (0 means same as height)\n\t\t\tstatic_cast<int>(size * 64), \t\t//Char height in 1/64th of points\n\t\t\thdpi,\t\t\t\t\t\t\t\t//Horizontal DPI\n\t\t\tvdpi\t\t\t\t\t\t\t\t//Vertical DPI\n\t\t);\n\t\tmSize = size;\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/text/harfbuzz/HarfbuzzBindings.cpp",
    "content": "#include <math/Vector2.h>\n#include <system/CFFI.h>\n#include <system/CFFIPointer.h>\n#include <system/Mutex.h>\n#include <text/Font.h>\n#include <ft2build.h>\n#include FT_FREETYPE_H\n#include <hb.h>\n#include <hb-ft.h>\n#include <map>\n\n\nnamespace lime {\n\n\n\tstruct HBGlyphInfo {\n\n\t\tint codepoint;\n\t\tint mask;\n\t\tint cluster;\n\n\t};\n\n\tstruct HBGlyphPosition {\n\n\t\tint xAdvance;\n\t\tint yAdvance;\n\t\tint xOffset;\n\t\tint yOffset;\n\n\t};\n\n\n\tvoid gc_hb_blob (value handle) {\n\n\t\thb_blob_destroy ((hb_blob_t*)val_data (handle));\n\t\tval_gc (handle, 0);\n\n\t}\n\n\n\tvoid hl_gc_hb_blob (HL_CFFIPointer* handle) {\n\n\t\thb_blob_destroy ((hb_blob_t*)handle->ptr);\n\n\t}\n\n\n\tvoid gc_hb_buffer (value handle) {\n\n\t\thb_buffer_destroy ((hb_buffer_t*)val_data (handle));\n\t\tval_gc (handle, 0);\n\n\t}\n\n\n\tvoid hl_gc_hb_buffer (HL_CFFIPointer* handle) {\n\n\t\thb_buffer_destroy ((hb_buffer_t*)handle->ptr);\n\n\t}\n\n\n\tvoid gc_hb_face (value handle) {\n\n\t\thb_face_destroy ((hb_face_t*)val_data (handle));\n\t\tval_gc (handle, 0);\n\n\t}\n\n\n\tvoid hl_gc_hb_face (HL_CFFIPointer* handle) {\n\n\t\thb_face_destroy ((hb_face_t*)handle->ptr);\n\n\t}\n\n\n\tvoid gc_hb_font (value handle) {\n\n\t\thb_font_destroy ((hb_font_t*)val_data (handle));\n\t\tval_gc (handle, 0);\n\n\t}\n\n\n\tvoid hl_gc_hb_font (HL_CFFIPointer* handle) {\n\n\t\thb_font_destroy ((hb_font_t*)handle->ptr);\n\n\t}\n\n\n\tvoid gc_hb_set (value handle) {\n\n\t\thb_set_destroy ((hb_set_t*)val_data (handle));\n\t\tval_gc (handle, 0);\n\n\t}\n\n\n\tvoid hl_gc_hb_set (HL_CFFIPointer* handle) {\n\n\t\thb_set_destroy ((hb_set_t*)handle->ptr);\n\n\t}\n\n\n\tvalue lime_hb_blob_create (double data, int length, int memoryMode) {\n\n\t\thb_blob_t* blob = hb_blob_create ((const char*)(uintptr_t)data, length, (hb_memory_mode_t)memoryMode, 0, 0);\n\t\treturn CFFIPointer (blob, gc_hb_blob);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_blob_create) (double data, int length, int memoryMode) {\n\n\t\thb_blob_t* blob = hb_blob_create ((const char*)(uintptr_t)data, length, (hb_memory_mode_t)memoryMode, 0, 0);\n\t\treturn HLCFFIPointer (blob, (hl_finalizer)hl_gc_hb_blob);\n\n\t}\n\n\n\tvalue lime_hb_blob_create_sub_blob (value parent, int offset, int length) {\n\n\t\thb_blob_t* blob = hb_blob_create_sub_blob ((hb_blob_t*)val_data (parent), offset, length);\n\t\treturn CFFIPointer (blob, gc_hb_blob);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_blob_create_sub_blob) (HL_CFFIPointer* parent, int offset, int length) {\n\n\t\thb_blob_t* blob = hb_blob_create_sub_blob ((hb_blob_t*)parent->ptr, offset, length);\n\t\treturn HLCFFIPointer (blob, (hl_finalizer)hl_gc_hb_blob);\n\n\t}\n\n\n\tdouble lime_hb_blob_get_data (value blob) {\n\n\t\tunsigned int length = 0;\n\t\treturn (uintptr_t)hb_blob_get_data ((hb_blob_t*)val_data (blob), &length);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_hb_blob_get_data) (HL_CFFIPointer* blob) {\n\n\t\tunsigned int length = 0;\n\t\treturn (uintptr_t)hb_blob_get_data ((hb_blob_t*)blob->ptr, &length);\n\n\t}\n\n\n\tdouble lime_hb_blob_get_data_writable (value blob) {\n\n\t\tunsigned int length = 0;\n\t\treturn (uintptr_t)hb_blob_get_data ((hb_blob_t*)val_data (blob), &length);\n\n\t}\n\n\n\tHL_PRIM double HL_NAME(hl_hb_blob_get_data_writable) (HL_CFFIPointer* blob) {\n\n\t\tunsigned int length = 0;\n\t\treturn (uintptr_t)hb_blob_get_data ((hb_blob_t*)blob->ptr, &length);\n\n\t}\n\n\n\tvalue lime_hb_blob_get_empty () {\n\n\t\thb_blob_t* blob = hb_blob_get_empty ();\n\t\treturn CFFIPointer (blob, gc_hb_blob);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_blob_get_empty) () {\n\n\t\thb_blob_t* blob = hb_blob_get_empty ();\n\t\treturn HLCFFIPointer (blob, (hl_finalizer)hl_gc_hb_blob);\n\n\t}\n\n\n\tint lime_hb_blob_get_length (value blob) {\n\n\t\treturn hb_blob_get_length ((hb_blob_t*)val_data (blob));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_blob_get_length) (HL_CFFIPointer* blob) {\n\n\t\treturn hb_blob_get_length ((hb_blob_t*)blob->ptr);\n\n\t}\n\n\n\tbool lime_hb_blob_is_immutable (value blob) {\n\n\t\treturn hb_blob_is_immutable ((hb_blob_t*)val_data (blob));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_blob_is_immutable) (HL_CFFIPointer* blob) {\n\n\t\treturn hb_blob_is_immutable ((hb_blob_t*)blob->ptr);\n\n\t}\n\n\n\tvoid lime_hb_blob_make_immutable (value blob) {\n\n\t\thb_blob_make_immutable ((hb_blob_t*)val_data (blob));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_blob_make_immutable) (HL_CFFIPointer* blob) {\n\n\t\thb_blob_make_immutable ((hb_blob_t*)blob->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_add (value buffer, int codepoint, int cluster) {\n\n\t\thb_buffer_add ((hb_buffer_t*)val_data (buffer), (hb_codepoint_t)codepoint, cluster);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_add) (HL_CFFIPointer* buffer, int codepoint, int cluster) {\n\n\t\thb_buffer_add ((hb_buffer_t*)buffer->ptr, (hb_codepoint_t)codepoint, cluster);\n\n\t}\n\n\n\tvoid lime_hb_buffer_add_hxstring(value buffer, HxString text, int itemOffset, int itemLength) {\n\n\t\tif (hxs_encoding (text) == hx::StringUtf16) {\n\n\t\t\thb_buffer_add_utf16 ((hb_buffer_t*)val_data(buffer), (const uint16_t*)text.c_str (), text.length, itemOffset, itemLength);\n\n\t\t} else {\n\n\t\t\thb_buffer_add_utf8 ((hb_buffer_t*)val_data(buffer), text.c_str (), text.length, itemOffset, itemLength);\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_add_hxstring) (HL_CFFIPointer* buffer, hl_vstring* text, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_utf16 ((hb_buffer_t*)buffer->ptr, text ? (const uint16_t*)text->bytes : NULL, text ? text->length : 0, itemOffset, itemLength);\n\n\t}\n\n\n\tvoid lime_hb_buffer_add_codepoints (value buffer, double text, int textLength, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_codepoints ((hb_buffer_t*)val_data (buffer), (const hb_codepoint_t*)(uintptr_t)text, textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_add_codepoints) (HL_CFFIPointer* buffer, double text, int textLength, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_codepoints ((hb_buffer_t*)buffer->ptr, (const hb_codepoint_t*)(uintptr_t)text, textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tvoid lime_hb_buffer_add_utf8 (value buffer, HxString text, int itemOffset, int itemLength) {\n\n\t\tint textLength = text.length;\n\t\tif (hxs_encoding (text) == hx::StringUtf16) {\n\t\t\t// hxs_utf8 doesn't give us the length, so treat it as null terminated\n\t\t\ttextLength = -1;\n\t\t}\n\n\t\thb_buffer_add_utf8 ((hb_buffer_t*)val_data (buffer), hxs_utf8 (text, nullptr), textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_add_utf8) (HL_CFFIPointer* buffer, hl_vstring* text, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_utf8 ((hb_buffer_t*)buffer->ptr, text ? hl_to_utf8 (text->bytes) : NULL, -1, itemOffset, itemLength);\n\n\t}\n\n\n\tvoid lime_hb_buffer_add_utf16 (value buffer, double text, int textLength, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_utf16 ((hb_buffer_t*)val_data (buffer), (const uint16_t*)(uintptr_t)text, textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_add_utf16) (HL_CFFIPointer* buffer, double text, int textLength, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_utf16 ((hb_buffer_t*)buffer->ptr, (const uint16_t*)(uintptr_t)text, textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tvoid lime_hb_buffer_add_utf32 (value buffer, double text, int textLength, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_utf32 ((hb_buffer_t*)val_data (buffer), (const uint32_t*)(uintptr_t)text, textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_add_utf32) (HL_CFFIPointer* buffer, double text, int textLength, int itemOffset, int itemLength) {\n\n\t\thb_buffer_add_utf32 ((hb_buffer_t*)buffer->ptr, (const uint32_t*)(uintptr_t)text, textLength, itemOffset, itemLength);\n\n\t}\n\n\n\tbool lime_hb_buffer_allocation_successful (value buffer) {\n\n\t\treturn hb_buffer_allocation_successful ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_buffer_allocation_successful) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_allocation_successful ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_clear_contents (value buffer) {\n\n\t\thb_buffer_clear_contents ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_clear_contents) (HL_CFFIPointer* buffer) {\n\n\t\thb_buffer_clear_contents ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvalue lime_hb_buffer_create () {\n\n\t\thb_buffer_t* buffer = hb_buffer_create ();\n\t\treturn CFFIPointer (buffer, gc_hb_buffer);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_buffer_create) () {\n\n\t\thb_buffer_t* buffer = hb_buffer_create ();\n\t\treturn HLCFFIPointer (buffer, (hl_finalizer)hl_gc_hb_buffer);\n\n\t}\n\n\n\tint lime_hb_buffer_get_cluster_level (value buffer) {\n\n\t\treturn hb_buffer_get_cluster_level ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_cluster_level) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_cluster_level ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tint lime_hb_buffer_get_content_type (value buffer) {\n\n\t\treturn hb_buffer_get_content_type ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_content_type) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_content_type ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tint lime_hb_buffer_get_direction (value buffer) {\n\n\t\treturn hb_buffer_get_direction ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_direction) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_direction ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvalue lime_hb_buffer_get_empty () {\n\n\t\thb_buffer_t* buffer = hb_buffer_get_empty ();\n\t\treturn CFFIPointer (buffer, gc_hb_buffer);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_buffer_get_empty) () {\n\n\t\thb_buffer_t* buffer = hb_buffer_get_empty ();\n\t\treturn HLCFFIPointer (buffer, (hl_finalizer)hl_gc_hb_buffer);\n\n\t}\n\n\n\tint lime_hb_buffer_get_flags (value buffer) {\n\n\t\treturn hb_buffer_get_flags ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_flags) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_flags ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvalue lime_hb_buffer_get_glyph_infos (value buffer, value bytes) {\n\n\t\tunsigned int length = 0;\n\t\thb_glyph_info_t* info = hb_buffer_get_glyph_infos ((hb_buffer_t*)val_data (buffer), &length);\n\n\t\tif (length > 0) {\n\n\t\t\tBytes _bytes = Bytes (bytes);\n\t\t\t_bytes.Resize (length * sizeof (HBGlyphInfo));\n\n\t\t\tHBGlyphInfo* glyphInfo = (HBGlyphInfo*)_bytes.b;\n\n\t\t\tfor (int i = 0; i < length; i++, info++, glyphInfo++) {\n\n\t\t\t\tglyphInfo->codepoint = info->codepoint;\n\t\t\t\tglyphInfo->mask = info->mask;\n\t\t\t\tglyphInfo->cluster = info->cluster;\n\n\t\t\t}\n\n\t\t\treturn _bytes.Value (bytes);\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_hb_buffer_get_glyph_infos) (HL_CFFIPointer* buffer, Bytes* bytes) {\n\n\t\tunsigned int length = 0;\n\t\thb_glyph_info_t* info = hb_buffer_get_glyph_infos ((hb_buffer_t*)buffer->ptr, &length);\n\n\t\tif (length > 0) {\n\n\t\t\tbytes->Resize (length * sizeof (HBGlyphInfo));\n\n\t\t\tHBGlyphInfo* glyphInfo = (HBGlyphInfo*)bytes->b;\n\n\t\t\tfor (int i = 0; i < length; i++, info++, glyphInfo++) {\n\n\t\t\t\tglyphInfo->codepoint = info->codepoint;\n\t\t\t\tglyphInfo->mask = info->mask;\n\t\t\t\tglyphInfo->cluster = info->cluster;\n\n\t\t\t}\n\n\t\t\treturn bytes;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_hb_buffer_get_glyph_positions (value buffer, value bytes) {\n\n\t\tunsigned int length = 0;\n\t\thb_glyph_position_t* positions = hb_buffer_get_glyph_positions ((hb_buffer_t*)val_data (buffer), &length);\n\n\t\tif (length > 0) {\n\n\t\t\tBytes _bytes = Bytes (bytes);\n\t\t\t_bytes.Resize (length * sizeof (HBGlyphPosition));\n\n\t\t\tHBGlyphPosition* glyphPosition = (HBGlyphPosition*)_bytes.b;\n\n\t\t\tfor (int i = 0; i < length; i++, positions++, glyphPosition++) {\n\n\t\t\t\tglyphPosition->xAdvance = positions->x_advance;\n\t\t\t\tglyphPosition->yAdvance = positions->y_advance;\n\t\t\t\tglyphPosition->xOffset = positions->x_offset;\n\t\t\t\tglyphPosition->yOffset = positions->y_offset;\n\n\t\t\t}\n\n\t\t\treturn _bytes.Value (bytes);\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM Bytes* HL_NAME(hl_hb_buffer_get_glyph_positions) (HL_CFFIPointer* buffer, Bytes* bytes) {\n\n\t\tunsigned int length = 0;\n\t\thb_glyph_position_t* positions = hb_buffer_get_glyph_positions ((hb_buffer_t*)buffer->ptr, &length);\n\n\t\tif (length > 0) {\n\n\t\t\tbytes->Resize (length * sizeof (HBGlyphPosition));\n\n\t\t\tHBGlyphPosition* glyphPosition = (HBGlyphPosition*)bytes->b;\n\n\t\t\tfor (int i = 0; i < length; i++, positions++, glyphPosition++) {\n\n\t\t\t\tglyphPosition->xAdvance = positions->x_advance;\n\t\t\t\tglyphPosition->yAdvance = positions->y_advance;\n\t\t\t\tglyphPosition->xOffset = positions->x_offset;\n\t\t\t\tglyphPosition->yOffset = positions->y_offset;\n\n\t\t\t}\n\n\t\t\treturn bytes;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_hb_buffer_get_language (value buffer) {\n\n\t\thb_language_t language = hb_buffer_get_language ((hb_buffer_t*)val_data (buffer));\n\t\treturn CFFIPointer ((void*)language);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_buffer_get_language) (HL_CFFIPointer* buffer) {\n\n\t\thb_language_t language = hb_buffer_get_language ((hb_buffer_t*)buffer->ptr);\n\t\treturn HLCFFIPointer ((void*)language);\n\n\t}\n\n\n\tint lime_hb_buffer_get_length (value buffer) {\n\n\t\treturn hb_buffer_get_length ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_length) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_length ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tint lime_hb_buffer_get_replacement_codepoint (value buffer) {\n\n\t\treturn hb_buffer_get_replacement_codepoint ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_replacement_codepoint) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_replacement_codepoint ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tint lime_hb_buffer_get_script (value buffer) {\n\n\t\treturn hb_buffer_get_script ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_get_script) (HL_CFFIPointer* buffer) {\n\n\t\treturn hb_buffer_get_script ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_get_segment_properties (value buffer, value props) {\n\n\t\thb_buffer_get_segment_properties ((hb_buffer_t*)val_data (buffer), (hb_segment_properties_t*)val_data (props));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_get_segment_properties) (HL_CFFIPointer* buffer, HL_CFFIPointer* props) {\n\n\t\thb_buffer_get_segment_properties ((hb_buffer_t*)buffer->ptr, (hb_segment_properties_t*)props->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_guess_segment_properties (value buffer) {\n\n\t\thb_buffer_guess_segment_properties ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_guess_segment_properties) (HL_CFFIPointer* buffer) {\n\n\t\thb_buffer_guess_segment_properties ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_normalize_glyphs (value buffer) {\n\n\t\thb_buffer_normalize_glyphs ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_normalize_glyphs) (HL_CFFIPointer* buffer) {\n\n\t\thb_buffer_normalize_glyphs ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tbool lime_hb_buffer_preallocate (value buffer, int size) {\n\n\t\treturn hb_buffer_pre_allocate ((hb_buffer_t*)val_data (buffer), size);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_buffer_preallocate) (HL_CFFIPointer* buffer, int size) {\n\n\t\treturn hb_buffer_pre_allocate ((hb_buffer_t*)buffer->ptr, size);\n\n\t}\n\n\n\tvoid lime_hb_buffer_reset (value buffer) {\n\n\t\thb_buffer_reset ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_reset) (HL_CFFIPointer* buffer) {\n\n\t\thb_buffer_reset ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_reverse (value buffer) {\n\n\t\thb_buffer_reverse ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_reverse) (HL_CFFIPointer* buffer) {\n\n\t\thb_buffer_reverse ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tvoid lime_hb_buffer_reverse_clusters (value buffer) {\n\n\t\thb_buffer_reverse_clusters ((hb_buffer_t*)val_data (buffer));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_reverse_clusters) (HL_CFFIPointer* buffer) {\n\n\t\thb_buffer_reverse_clusters ((hb_buffer_t*)buffer->ptr);\n\n\t}\n\n\n\tint lime_hb_buffer_serialize_format_from_string (HxString str) {\n\n\t\treturn hb_buffer_serialize_format_from_string (str.c_str (), str.length);\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_buffer_serialize_format_from_string) (hl_vstring* str) {\n\n\t\treturn hb_buffer_serialize_format_from_string (str ? hl_to_utf8 (str->bytes) : NULL, str ? str->length : 0);\n\n\t}\n\n\n\tvalue lime_hb_buffer_serialize_format_to_string (int format) {\n\n\t\tconst char* result = hb_buffer_serialize_format_to_string ((hb_buffer_serialize_format_t)format);\n\n\t\tif (result) return alloc_string (result);\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_hb_buffer_serialize_format_to_string) (int format) {\n\n\t\tconst char* result = hb_buffer_serialize_format_to_string ((hb_buffer_serialize_format_t)format);\n\n\t\tif (result) {\n\n\t\t\tint length = strlen (result);\n\t\t\tchar* _result = (char*)malloc (length + 1);\n\t\t\tstrcpy (_result, result);\n\t\t\treturn (vbyte*)_result;\n\n\t\t}\n\n\t\treturn NULL;\n\n\t}\n\n\n\tvalue lime_hb_buffer_serialize_list_formats () {\n\n\t\tconst char** formats = hb_buffer_serialize_list_formats ();\n\n\t\tif (formats) {\n\n\t\t\tint length = sizeof (formats) / sizeof (char);\n\t\t\tvalue result = alloc_array (length);\n\n\t\t\tfor (int i = 0; i < length; i++) {\n\n\t\t\t\tval_array_set_i (result, i, alloc_string (formats[i]));\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t} else {\n\n\t\t\treturn alloc_array (0);\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM varray* HL_NAME(hl_hb_buffer_serialize_list_formats) () {\n\n\t\tconst char** formats = hb_buffer_serialize_list_formats ();\n\n\t\tif (formats) {\n\n\t\t\t// varray* result = hl_alloc_array (&hlt_byte, )\n\t\t\t// hl_aptr (result, const char*) = formats;\n\n\t\t\t// TODO\n\n\t\t\treturn NULL;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_cluster_level (value buffer, int clusterLevel) {\n\n\t\thb_buffer_set_cluster_level ((hb_buffer_t*)val_data (buffer), (hb_buffer_cluster_level_t)clusterLevel);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_cluster_level) (HL_CFFIPointer* buffer, int clusterLevel) {\n\n\t\thb_buffer_set_cluster_level ((hb_buffer_t*)buffer->ptr, (hb_buffer_cluster_level_t)clusterLevel);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_content_type (value buffer, int contentType) {\n\n\t\thb_buffer_set_content_type ((hb_buffer_t*)val_data (buffer), (hb_buffer_content_type_t)contentType);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_content_type) (HL_CFFIPointer* buffer, int contentType) {\n\n\t\thb_buffer_set_content_type ((hb_buffer_t*)buffer->ptr, (hb_buffer_content_type_t)contentType);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_direction (value buffer, int direction) {\n\n\t\thb_buffer_set_direction ((hb_buffer_t*)val_data (buffer), (hb_direction_t)direction);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_direction) (HL_CFFIPointer* buffer, int direction) {\n\n\t\thb_buffer_set_direction ((hb_buffer_t*)buffer->ptr, (hb_direction_t)direction);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_flags (value buffer, int flags) {\n\n\t\thb_buffer_set_flags ((hb_buffer_t*)val_data (buffer), (hb_buffer_flags_t)flags);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_flags) (HL_CFFIPointer* buffer, int flags) {\n\n\t\thb_buffer_set_flags ((hb_buffer_t*)buffer->ptr, (hb_buffer_flags_t)flags);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_language (value buffer, value language) {\n\n\t\thb_buffer_set_language ((hb_buffer_t*)val_data (buffer), (hb_language_t)val_data (language));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_language) (HL_CFFIPointer* buffer, HL_CFFIPointer* language) {\n\n\t\thb_buffer_set_language ((hb_buffer_t*)buffer->ptr, (hb_language_t)language->ptr);\n\n\t}\n\n\n\tbool lime_hb_buffer_set_length (value buffer, int length) {\n\n\t\treturn hb_buffer_set_length ((hb_buffer_t*)val_data (buffer), length);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_buffer_set_length) (HL_CFFIPointer* buffer, int length) {\n\n\t\treturn hb_buffer_set_length ((hb_buffer_t*)buffer->ptr, length);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_replacement_codepoint (value buffer, int replacement) {\n\n\t\thb_buffer_set_replacement_codepoint ((hb_buffer_t*)val_data (buffer), (hb_codepoint_t)replacement);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_replacement_codepoint) (HL_CFFIPointer* buffer, int replacement) {\n\n\t\thb_buffer_set_replacement_codepoint ((hb_buffer_t*)buffer->ptr, (hb_codepoint_t)replacement);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_script (value buffer, int script) {\n\n\t\tif (script == -1) script = HB_SCRIPT_COMMON; // Workaround for Neko\n\t\t// TODO: COMMON is an int32 and doesn't translate properly on Neko\n\n\t\thb_buffer_set_script ((hb_buffer_t*)val_data (buffer), (hb_script_t)script);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_script) (HL_CFFIPointer* buffer, int script) {\n\n\t\thb_buffer_set_script ((hb_buffer_t*)buffer->ptr, (hb_script_t)script);\n\n\t}\n\n\n\tvoid lime_hb_buffer_set_segment_properties (value buffer, value props) {\n\n\t\thb_buffer_set_segment_properties ((hb_buffer_t*)val_data (buffer), (const hb_segment_properties_t*)val_data (props));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_buffer_set_segment_properties) (HL_CFFIPointer* buffer, HL_CFFIPointer* props) {\n\n\t\thb_buffer_set_segment_properties ((hb_buffer_t*)buffer->ptr, (const hb_segment_properties_t*)props->ptr);\n\n\t}\n\n\n\tvalue lime_hb_face_create (value blob, int index) {\n\n\t\thb_face_t* face = hb_face_create ((hb_blob_t*)val_data (blob), index);\n\t\treturn CFFIPointer (face, gc_hb_face);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_face_create) (HL_CFFIPointer* blob, int index) {\n\n\t\thb_face_t* face = hb_face_create ((hb_blob_t*)blob->ptr, index);\n\t\treturn HLCFFIPointer (face, (hl_finalizer)hl_gc_hb_face);\n\n\t}\n\n\n\tvalue lime_hb_face_get_empty () {\n\n\t\thb_face_t* face = hb_face_get_empty ();\n\t\treturn CFFIPointer (face, gc_hb_face);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_face_get_empty) () {\n\n\t\thb_face_t* face = hb_face_get_empty ();\n\t\treturn HLCFFIPointer (face, (hl_finalizer)hl_gc_hb_face);\n\n\t}\n\n\n\tint lime_hb_face_get_glyph_count (value face) {\n\n\t\treturn hb_face_get_glyph_count ((hb_face_t*)val_data (face));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_face_get_glyph_count) (HL_CFFIPointer* face) {\n\n\t\treturn hb_face_get_glyph_count ((hb_face_t*)face->ptr);\n\n\t}\n\n\n\tint lime_hb_face_get_index (value face) {\n\n\t\treturn hb_face_get_index ((hb_face_t*)val_data (face));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_face_get_index) (HL_CFFIPointer* face) {\n\n\t\treturn hb_face_get_index ((hb_face_t*)face->ptr);\n\n\t}\n\n\n\tint lime_hb_face_get_upem (value face) {\n\n\t\treturn hb_face_get_upem ((hb_face_t*)val_data (face));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_face_get_upem) (HL_CFFIPointer* face) {\n\n\t\treturn hb_face_get_upem ((hb_face_t*)face->ptr);\n\n\t}\n\n\n\tbool lime_hb_face_is_immutable (value face) {\n\n\t\treturn hb_face_is_immutable ((hb_face_t*)val_data (face));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_face_is_immutable) (HL_CFFIPointer* face) {\n\n\t\treturn hb_face_is_immutable ((hb_face_t*)face->ptr);\n\n\t}\n\n\n\tvoid lime_hb_face_make_immutable (value face) {\n\n\t\thb_face_make_immutable ((hb_face_t*)val_data (face));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_face_make_immutable) (HL_CFFIPointer* face) {\n\n\t\thb_face_make_immutable ((hb_face_t*)face->ptr);\n\n\t}\n\n\n\tvalue lime_hb_face_reference_blob (value face) {\n\n\t\thb_blob_t* blob = hb_face_reference_blob ((hb_face_t*)val_data (face));\n\n\t\t// TODO: Should this be managed differently?\n\t\treturn CFFIPointer (blob, gc_hb_blob);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_face_reference_blob) (HL_CFFIPointer* face) {\n\n\t\thb_blob_t* blob = hb_face_reference_blob ((hb_face_t*)face->ptr);\n\n\t\t// TODO: Should this be managed differently?\n\t\treturn HLCFFIPointer (blob, (hl_finalizer)hl_gc_hb_blob);\n\n\t}\n\n\n\tvalue lime_hb_face_reference_table (value face, int tag) {\n\n\t\thb_blob_t* blob = hb_face_reference_table ((hb_face_t*)val_data (face), (hb_tag_t)tag);\n\t\treturn CFFIPointer (blob, gc_hb_blob);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_face_reference_table) (HL_CFFIPointer* face, int tag) {\n\n\t\thb_blob_t* blob = hb_face_reference_table ((hb_face_t*)face->ptr, (hb_tag_t)tag);\n\t\treturn HLCFFIPointer (blob, (hl_finalizer)hl_gc_hb_blob);\n\n\t}\n\n\n\tvoid lime_hb_face_set_glyph_count (value face, int glyphCount) {\n\n\t\thb_face_set_glyph_count ((hb_face_t*)val_data (face), glyphCount);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_face_set_glyph_count) (HL_CFFIPointer* face, int glyphCount) {\n\n\t\thb_face_set_glyph_count ((hb_face_t*)face->ptr, glyphCount);\n\n\t}\n\n\n\tvoid lime_hb_face_set_index (value face, int index) {\n\n\t\thb_face_set_index ((hb_face_t*)val_data (face), index);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_face_set_index) (HL_CFFIPointer* face, int index) {\n\n\t\thb_face_set_index ((hb_face_t*)face->ptr, index);\n\n\t}\n\n\n\tvoid lime_hb_face_set_upem (value face, int upem) {\n\n\t\thb_face_set_upem ((hb_face_t*)val_data (face), upem);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_face_set_upem) (HL_CFFIPointer* face, int upem) {\n\n\t\thb_face_set_upem ((hb_face_t*)face->ptr, upem);\n\n\t}\n\n\n\tvalue lime_hb_feature_from_string (HxString str) {\n\n\t\thb_feature_t feature;\n\n\t\tif (hb_feature_from_string (str.c_str (), str.length, &feature)) {\n\n\t\t\t// TODO;\n\t\t\treturn alloc_null ();\n\t\t\t//return CFFIPointer (feature);\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_feature_from_string) (hl_vstring* str) {\n\n\t\thb_feature_t feature;\n\n\t\tif (hb_feature_from_string (str ? hl_to_utf8 (str->bytes) : NULL, str ? str->length : 0, &feature)) {\n\n\t\t\t// TODO;\n\t\t\treturn NULL;\n\t\t\t//return CFFIPointer (feature);\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_hb_feature_to_string (value feature) {\n\n\t\tchar result[128];\n\t\thb_feature_to_string ((hb_feature_t*)val_data (feature), result, 128);\n\t\treturn alloc_string (result);\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_hb_feature_to_string) (HL_CFFIPointer* feature) {\n\n\t\tchar* result = (char*)malloc (128);\n\t\thb_feature_to_string ((hb_feature_t*)feature->ptr, result, 128);\n\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tvoid lime_hb_font_add_glyph_origin_for_direction (value font, int glyph, int direction, int x, int y) {\n\n\t\thb_font_add_glyph_origin_for_direction ((hb_font_t*)val_data (font), (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_font_add_glyph_origin_for_direction) (HL_CFFIPointer* font, int glyph, int direction, int x, int y) {\n\n\t\thb_font_add_glyph_origin_for_direction ((hb_font_t*)font->ptr, (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\n\t}\n\n\n\tvalue lime_hb_font_create (value face) {\n\n\t\thb_font_t* font = hb_font_create ((hb_face_t*)val_data (face));\n\t\treturn CFFIPointer (font, gc_hb_font);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_font_create) (HL_CFFIPointer* face) {\n\n\t\thb_font_t* font = hb_font_create ((hb_face_t*)face->ptr);\n\t\treturn HLCFFIPointer (font, (hl_finalizer)hl_gc_hb_font);\n\n\t}\n\n\n\tvalue lime_hb_font_create_sub_font (value parent) {\n\n\t\thb_font_t* font = hb_font_create_sub_font ((hb_font_t*)val_data (parent));\n\t\treturn CFFIPointer (font, gc_hb_font);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_font_create_sub_font) (HL_CFFIPointer* parent) {\n\n\t\thb_font_t* font = hb_font_create_sub_font ((hb_font_t*)parent->ptr);\n\t\treturn HLCFFIPointer (font, (hl_finalizer)hl_gc_hb_font);\n\n\t}\n\n\n\tvalue lime_hb_font_get_empty () {\n\n\t\thb_font_t* font = hb_font_get_empty ();\n\t\treturn CFFIPointer (font, gc_hb_font);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_font_get_empty) () {\n\n\t\thb_font_t* font = hb_font_get_empty ();\n\t\treturn HLCFFIPointer (font, (hl_finalizer)hl_gc_hb_font);\n\n\t}\n\n\n\tvalue lime_hb_font_get_face (value font) {\n\n\t\thb_face_t* face = hb_font_get_face ((hb_font_t*)val_data (font));\n\t\treturn CFFIPointer (face, gc_hb_face);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_font_get_face) (HL_CFFIPointer* font) {\n\n\t\t// TODO: Manage memory differently here?\n\n\t\thb_face_t* face = hb_font_get_face ((hb_font_t*)font->ptr);\n\t\treturn HLCFFIPointer (face, (hl_finalizer)hl_gc_hb_face);\n\n\t}\n\n\n\tvalue lime_hb_font_get_glyph_advance_for_direction (value font, int glyph, int direction) {\n\n\t\thb_position_t x;\n\t\thb_position_t y;\n\t\thb_font_get_glyph_advance_for_direction ((hb_font_t*)val_data (font), (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\t\tVector2 result = Vector2 (x, y);\n\t\treturn result.Value ();\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_hb_font_get_glyph_advance_for_direction) (HL_CFFIPointer* font, int glyph, int direction, Vector2* out) {\n\n\t\thb_position_t x;\n\t\thb_position_t y;\n\t\thb_font_get_glyph_advance_for_direction ((hb_font_t*)font->ptr, (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\t\tout->x = x;\n\t\tout->y = y;\n\t\treturn out;\n\n\t}\n\n\n\tvalue lime_hb_font_get_glyph_kerning_for_direction (value font, int firstGlyph, int secondGlyph, int direction) {\n\n\t\thb_position_t x;\n\t\thb_position_t y;\n\t\thb_font_get_glyph_kerning_for_direction ((hb_font_t*)val_data (font), (hb_codepoint_t)firstGlyph, (hb_codepoint_t)secondGlyph, (hb_direction_t)direction, &x, &y);\n\t\tVector2 result = Vector2 (x, y);\n\t\treturn result.Value ();\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_hb_font_get_glyph_kerning_for_direction) (HL_CFFIPointer* font, int firstGlyph, int secondGlyph, int direction, Vector2* out) {\n\n\t\thb_position_t x;\n\t\thb_position_t y;\n\t\thb_font_get_glyph_kerning_for_direction ((hb_font_t*)font->ptr, (hb_codepoint_t)firstGlyph, (hb_codepoint_t)secondGlyph, (hb_direction_t)direction, &x, &y);\n\t\tout->x = x;\n\t\tout->y = y;\n\t\treturn out;\n\n\t}\n\n\n\tvalue lime_hb_font_get_glyph_origin_for_direction (value font, int glyph, int direction) {\n\n\t\thb_position_t x;\n\t\thb_position_t y;\n\t\thb_font_get_glyph_origin_for_direction ((hb_font_t*)val_data (font), (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\t\tVector2 result = Vector2 (x, y);\n\t\treturn result.Value ();\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_hb_font_get_glyph_origin_for_direction) (HL_CFFIPointer* font, int glyph, int direction, Vector2* out) {\n\n\t\thb_position_t x;\n\t\thb_position_t y;\n\t\thb_font_get_glyph_origin_for_direction ((hb_font_t*)font->ptr, (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\t\tout->x = x;\n\t\tout->y = y;\n\t\treturn out;\n\n\t}\n\n\n\tvalue lime_hb_font_get_parent (value font) {\n\n\t\thb_font_t* parent = hb_font_get_parent ((hb_font_t*)val_data (font));\n\t\treturn CFFIPointer (parent, gc_hb_font);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_font_get_parent) (HL_CFFIPointer* font) {\n\n\t\t// Manage memory differently here?\n\n\t\thb_font_t* parent = hb_font_get_parent ((hb_font_t*)font->ptr);\n\t\treturn HLCFFIPointer (parent, (hl_finalizer)hl_gc_hb_font);\n\n\t}\n\n\n\tvalue lime_hb_font_get_ppem (value font) {\n\n\t\tint xppem = 0;\n\t\tint yppem = 0;\n\t\thb_font_get_scale ((hb_font_t*)val_data (font), &xppem, &yppem);\n\t\tVector2 result = Vector2 (xppem, yppem);\n\t\treturn result.Value ();\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_hb_font_get_ppem) (HL_CFFIPointer* font, Vector2* out) {\n\n\t\tint xppem = 0;\n\t\tint yppem = 0;\n\t\thb_font_get_scale ((hb_font_t*)font->ptr, &xppem, &yppem);\n\t\tout->x = xppem;\n\t\tout->y = yppem;\n\t\treturn out;\n\n\t}\n\n\n\tvalue lime_hb_font_get_scale (value font) {\n\n\t\tint xScale = 0;\n\t\tint yScale = 0;\n\t\thb_font_get_scale ((hb_font_t*)val_data (font), &xScale, &yScale);\n\t\tVector2 result = Vector2 (xScale, yScale);\n\t\treturn result.Value ();\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_hb_font_get_scale) (HL_CFFIPointer* font, Vector2* out) {\n\n\t\tint xScale = 0;\n\t\tint yScale = 0;\n\t\thb_font_get_scale ((hb_font_t*)font->ptr, &xScale, &yScale);\n\t\tout->x = xScale;\n\t\tout->y = yScale;\n\t\treturn out;\n\n\t}\n\n\n\tint lime_hb_font_glyph_from_string (value font, HxString s) {\n\n\t\thb_codepoint_t glyph = 0;\n\n\t\tif (hb_font_glyph_from_string ((hb_font_t*)val_data (font), s.c_str (), s.length, &glyph)) {\n\n\t\t\treturn glyph;\n\n\t\t} else {\n\n\t\t\treturn -1;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_font_glyph_from_string) (HL_CFFIPointer* font, hl_vstring* s) {\n\n\t\thb_codepoint_t glyph = 0;\n\n\t\tif (hb_font_glyph_from_string ((hb_font_t*)font->ptr, s ? hl_to_utf8 (s->bytes) : NULL, s ? s->length : 0, &glyph)) {\n\n\t\t\treturn glyph;\n\n\t\t} else {\n\n\t\t\treturn -1;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_hb_font_glyph_to_string (value font, int codepoint) {\n\n\t\tchar result[1024];\n\t\thb_font_glyph_to_string ((hb_font_t*)val_data (font), (hb_codepoint_t)codepoint, result, 1024);\n\t\treturn alloc_string (result);\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_hb_font_glyph_to_string) (HL_CFFIPointer* font, int codepoint) {\n\n\t\tchar* result = (char*)malloc (1024);\n\t\thb_font_glyph_to_string ((hb_font_t*)font->ptr, (hb_codepoint_t)codepoint, result, 1024);\n\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tbool lime_hb_font_is_immutable (value font) {\n\n\t\treturn hb_font_is_immutable ((hb_font_t*)val_data (font));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_font_is_immutable) (HL_CFFIPointer* font) {\n\n\t\treturn hb_font_is_immutable ((hb_font_t*)font->ptr);\n\n\t}\n\n\n\tvoid lime_hb_font_make_immutable (value font) {\n\n\t\thb_font_make_immutable ((hb_font_t*)val_data (font));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_font_make_immutable) (HL_CFFIPointer* font) {\n\n\t\thb_font_make_immutable ((hb_font_t*)font->ptr);\n\n\t}\n\n\n\tvoid lime_hb_font_set_ppem (value font, int xppem, int yppem) {\n\n\t\thb_font_set_ppem ((hb_font_t*)val_data (font), xppem, yppem);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_font_set_ppem) (HL_CFFIPointer* font, int xppem, int yppem) {\n\n\t\thb_font_set_ppem ((hb_font_t*)font->ptr, xppem, yppem);\n\n\t}\n\n\n\tvoid lime_hb_font_set_scale (value font, int xScale, int yScale) {\n\n\t\thb_font_set_scale ((hb_font_t*)val_data (font), xScale, yScale);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_font_set_scale) (HL_CFFIPointer* font, int xScale, int yScale) {\n\n\t\thb_font_set_scale ((hb_font_t*)font->ptr, xScale, yScale);\n\n\t}\n\n\n\tvoid lime_hb_font_subtract_glyph_origin_for_direction (value font, int glyph, int direction, int x, int y) {\n\n\t\thb_font_subtract_glyph_origin_for_direction ((hb_font_t*)val_data (font), (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_font_subtract_glyph_origin_for_direction) (HL_CFFIPointer* font, int glyph, int direction, int x, int y) {\n\n\t\thb_font_subtract_glyph_origin_for_direction ((hb_font_t*)font->ptr, (hb_codepoint_t)glyph, (hb_direction_t)direction, &x, &y);\n\n\t}\n\n\n\tvalue lime_hb_ft_font_create (value font) {\n\n\t\tFont* _font = (Font*)val_data (font);\n\t\thb_font_t* __font = hb_ft_font_create ((FT_Face)_font->face, NULL);\n\t\treturn CFFIPointer (__font, gc_hb_font);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_ft_font_create) (HL_CFFIPointer* font) {\n\n\t\tFont* _font = (Font*)font->ptr;\n\t\thb_font_t* __font = hb_ft_font_create ((FT_Face)_font->face, NULL);\n\t\treturn HLCFFIPointer (__font, (hl_finalizer)hl_gc_hb_font);\n\n\t}\n\n\n\tvalue lime_hb_ft_font_create_referenced (value font) {\n\n\t\tFont* _font = (Font*)val_data (font);\n\t\thb_font_t* __font = hb_ft_font_create_referenced ((FT_Face)_font->face);\n\t\treturn CFFIPointer (__font, gc_hb_font);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_ft_font_create_referenced) (HL_CFFIPointer* font) {\n\n\t\tFont* _font = (Font*)font->ptr;\n\t\thb_font_t* __font = hb_ft_font_create_referenced ((FT_Face)_font->face);\n\t\treturn HLCFFIPointer (__font, (hl_finalizer)hl_gc_hb_font);\n\n\t}\n\n\n\tint lime_hb_ft_font_get_load_flags (value font) {\n\n\t\treturn hb_ft_font_get_load_flags ((hb_font_t*)val_data (font));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_ft_font_get_load_flags) (HL_CFFIPointer* font) {\n\n\t\treturn hb_ft_font_get_load_flags ((hb_font_t*)font->ptr);\n\n\t}\n\n\n\tvoid lime_hb_ft_font_set_load_flags (value font, int loadFlags) {\n\n\t\thb_ft_font_set_load_flags ((hb_font_t*)val_data (font), loadFlags);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_ft_font_set_load_flags) (HL_CFFIPointer* font, int loadFlags) {\n\n\t\thb_ft_font_set_load_flags ((hb_font_t*)font->ptr, loadFlags);\n\n\t}\n\n\n\tvalue lime_hb_language_from_string (HxString str) {\n\n\t\thb_language_t language = hb_language_from_string (str.c_str (), str.length);\n\t\treturn CFFIPointer ((void*)language);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_language_from_string) (hl_vstring* str) {\n\n\t\thb_language_t language = hb_language_from_string (str ? hl_to_utf8 (str->bytes) : NULL, str ? str->length : 0);\n\t\treturn HLCFFIPointer ((void*)language);\n\n\t}\n\n\n\tvalue lime_hb_language_get_default () {\n\n\t\thb_language_t language = hb_language_get_default ();\n\t\treturn CFFIPointer ((void*)language);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_language_get_default) () {\n\n\t\thb_language_t language = hb_language_get_default ();\n\t\treturn HLCFFIPointer ((void*)language);\n\n\t}\n\n\n\tvalue lime_hb_language_to_string (value language) {\n\n\t\thb_language_t _language = (hb_language_t)val_data (language);\n\t\tconst char* result = hb_language_to_string (_language);\n\t\treturn alloc_string (result);\n\n\t}\n\n\n\tHL_PRIM vbyte* HL_NAME(hl_hb_language_to_string) (HL_CFFIPointer* language) {\n\n\t\thb_language_t _language = (hb_language_t)language->ptr;\n\t\tconst char* result = hb_language_to_string (_language);\n\n\t\tint length = strlen (result);\n\t\tchar* _result = (char*)malloc (length + 1);\n\t\tstrcpy (_result, result);\n\t\treturn (vbyte*)_result;\n\n\t}\n\n\n\tbool lime_hb_segment_properties_equal (value a, value b) {\n\n\t\treturn hb_segment_properties_equal ((hb_segment_properties_t*)val_data (a), (hb_segment_properties_t*)val_data (b));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_segment_properties_equal) (HL_CFFIPointer* a, HL_CFFIPointer* b) {\n\n\t\treturn hb_segment_properties_equal ((hb_segment_properties_t*)a->ptr, (hb_segment_properties_t*)b->ptr);\n\n\t}\n\n\n\tint lime_hb_segment_properties_hash (value p) {\n\n\t\treturn hb_segment_properties_hash ((hb_segment_properties_t*)val_data (p));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_segment_properties_hash) (HL_CFFIPointer* p) {\n\n\t\treturn hb_segment_properties_hash ((hb_segment_properties_t*)p->ptr);\n\n\t}\n\n\n\tvoid lime_hb_set_add (value set, int codepoint) {\n\n\t\thb_set_add ((hb_set_t*)val_data (set), (hb_codepoint_t)codepoint);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_add) (HL_CFFIPointer* set, int codepoint) {\n\n\t\thb_set_add ((hb_set_t*)set->ptr, (hb_codepoint_t)codepoint);\n\n\t}\n\n\n\tvoid lime_hb_set_add_range (value set, int first, int last) {\n\n\t\thb_set_add_range ((hb_set_t*)val_data (set), (hb_codepoint_t)first, (hb_codepoint_t)last);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_add_range) (HL_CFFIPointer* set, int first, int last) {\n\n\t\thb_set_add_range ((hb_set_t*)set->ptr, (hb_codepoint_t)first, (hb_codepoint_t)last);\n\n\t}\n\n\n\tbool lime_hb_set_allocation_successful (value set) {\n\n\t\treturn hb_set_allocation_successful ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_set_allocation_successful) (HL_CFFIPointer* set) {\n\n\t\treturn hb_set_allocation_successful ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tvoid lime_hb_set_clear (value set) {\n\n\t\thb_set_clear ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_clear) (HL_CFFIPointer* set) {\n\n\t\thb_set_clear ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tvalue lime_hb_set_create () {\n\n\t\thb_set_t* set = hb_set_create ();\n\t\treturn CFFIPointer (set, gc_hb_set);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_set_create) () {\n\n\t\thb_set_t* set = hb_set_create ();\n\t\treturn HLCFFIPointer (set, (hl_finalizer)hl_gc_hb_set);\n\n\t}\n\n\n\tvoid lime_hb_set_del (value set, int codepoint) {\n\n\t\thb_set_del ((hb_set_t*)val_data (set), (hb_codepoint_t)codepoint);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_del) (HL_CFFIPointer* set, int codepoint) {\n\n\t\thb_set_del ((hb_set_t*)set->ptr, (hb_codepoint_t)codepoint);\n\n\t}\n\n\n\tvoid lime_hb_set_del_range (value set, int first, int last) {\n\n\t\thb_set_del_range ((hb_set_t*)val_data (set), (hb_codepoint_t)first, (hb_codepoint_t)last);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_del_range) (HL_CFFIPointer* set, int first, int last) {\n\n\t\thb_set_del_range ((hb_set_t*)set->ptr, (hb_codepoint_t)first, (hb_codepoint_t)last);\n\n\t}\n\n\n\tvalue lime_hb_set_get_empty () {\n\n\t\thb_set_t* set = hb_set_get_empty ();\n\t\treturn CFFIPointer (set, gc_hb_set);\n\n\t}\n\n\n\tHL_PRIM HL_CFFIPointer* HL_NAME(hl_hb_set_get_empty) () {\n\n\t\thb_set_t* set = hb_set_get_empty ();\n\t\treturn HLCFFIPointer (set, (hl_finalizer)hl_gc_hb_set);\n\n\t}\n\n\n\tint lime_hb_set_get_max (value set) {\n\n\t\treturn hb_set_get_max ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_set_get_max) (HL_CFFIPointer* set) {\n\n\t\treturn hb_set_get_max ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tint lime_hb_set_get_min (value set) {\n\n\t\treturn hb_set_get_min ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_set_get_min) (HL_CFFIPointer* set) {\n\n\t\treturn hb_set_get_min ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tint lime_hb_set_get_population (value set) {\n\n\t\treturn hb_set_get_population ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_set_get_population) (HL_CFFIPointer* set) {\n\n\t\treturn hb_set_get_population ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tbool lime_hb_set_has (value set, int codepoint) {\n\n\t\treturn hb_set_has ((hb_set_t*)val_data (set), (hb_codepoint_t)codepoint);\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_set_has) (HL_CFFIPointer* set, int codepoint) {\n\n\t\treturn hb_set_has ((hb_set_t*)set->ptr, (hb_codepoint_t)codepoint);\n\n\t}\n\n\n\tvoid lime_hb_set_intersect (value set, value other) {\n\n\t\treturn hb_set_intersect ((hb_set_t*)val_data (set), (hb_set_t*)val_data (other));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_intersect) (HL_CFFIPointer* set, HL_CFFIPointer* other) {\n\n\t\treturn hb_set_intersect ((hb_set_t*)set->ptr, (hb_set_t*)other->ptr);\n\n\t}\n\n\n\tvoid lime_hb_set_invert (value set) {\n\n\t\thb_set_invert ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_invert) (HL_CFFIPointer* set) {\n\n\t\thb_set_invert ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tbool lime_hb_set_is_empty (value set) {\n\n\t\treturn hb_set_is_empty ((hb_set_t*)val_data (set));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_set_is_empty) (HL_CFFIPointer* set) {\n\n\t\treturn hb_set_is_empty ((hb_set_t*)set->ptr);\n\n\t}\n\n\n\tbool lime_hb_set_is_equal (value set, value other) {\n\n\t\treturn hb_set_is_equal ((hb_set_t*)val_data (set), (hb_set_t*)val_data (other));\n\n\t}\n\n\n\tHL_PRIM bool HL_NAME(hl_hb_set_is_equal) (HL_CFFIPointer* set, HL_CFFIPointer* other) {\n\n\t\treturn hb_set_is_equal ((hb_set_t*)set->ptr, (hb_set_t*)other->ptr);\n\n\t}\n\n\n\tint lime_hb_set_next (value set) {\n\n\t\thb_codepoint_t codepoint = 0;\n\n\t\tif (hb_set_next ((hb_set_t*)val_data (set), &codepoint)) {\n\n\t\t\treturn codepoint;\n\n\t\t} else {\n\n\t\t\treturn -1;\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM int HL_NAME(hl_hb_set_next) (HL_CFFIPointer* set) {\n\n\t\thb_codepoint_t codepoint = 0;\n\n\t\tif (hb_set_next ((hb_set_t*)set->ptr, &codepoint)) {\n\n\t\t\treturn codepoint;\n\n\t\t} else {\n\n\t\t\treturn -1;\n\n\t\t}\n\n\t}\n\n\n\tvalue lime_hb_set_next_range (value set) {\n\n\t\thb_codepoint_t first = 0;\n\t\thb_codepoint_t last = 0;\n\n\t\tif (hb_set_next_range ((hb_set_t*)val_data (set), &first, &last)) {\n\n\t\t\tVector2 result = Vector2 (first, last);\n\t\t\treturn result.Value ();\n\n\t\t} else {\n\n\t\t\treturn alloc_null ();\n\n\t\t}\n\n\t}\n\n\n\tHL_PRIM Vector2* HL_NAME(hl_hb_set_next_range) (HL_CFFIPointer* set, Vector2* out) {\n\n\t\thb_codepoint_t first = 0;\n\t\thb_codepoint_t last = 0;\n\n\t\tif (hb_set_next_range ((hb_set_t*)set->ptr, &first, &last)) {\n\n\t\t\tout->x = first;\n\t\t\tout->y = last;\n\t\t\treturn out;\n\n\t\t} else {\n\n\t\t\treturn NULL;\n\n\t\t}\n\n\t}\n\n\n\tvoid lime_hb_set_set (value set, value other) {\n\n\t\treturn hb_set_set ((hb_set_t*)val_data (set), (hb_set_t*)val_data (other));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_set) (HL_CFFIPointer* set, HL_CFFIPointer* other) {\n\n\t\treturn hb_set_set ((hb_set_t*)set->ptr, (hb_set_t*)other->ptr);\n\n\t}\n\n\n\tvoid lime_hb_set_subtract (value set, value other) {\n\n\t\treturn hb_set_subtract ((hb_set_t*)val_data (set), (hb_set_t*)val_data (other));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_subtract) (HL_CFFIPointer* set, HL_CFFIPointer* other) {\n\n\t\treturn hb_set_subtract ((hb_set_t*)set->ptr, (hb_set_t*)other->ptr);\n\n\t}\n\n\n\tvoid lime_hb_set_symmetric_difference (value set, value other) {\n\n\t\treturn hb_set_symmetric_difference ((hb_set_t*)val_data (set), (hb_set_t*)val_data (other));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_symmetric_difference) (HL_CFFIPointer* set, HL_CFFIPointer* other) {\n\n\t\treturn hb_set_symmetric_difference ((hb_set_t*)set->ptr, (hb_set_t*)other->ptr);\n\n\t}\n\n\n\tvoid lime_hb_set_union (value set, value other) {\n\n\t\treturn hb_set_union ((hb_set_t*)val_data (set), (hb_set_t*)val_data (other));\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_set_union) (HL_CFFIPointer* set, HL_CFFIPointer* other) {\n\n\t\treturn hb_set_union ((hb_set_t*)set->ptr, (hb_set_t*)other->ptr);\n\n\t}\n\n\n\tvoid lime_hb_shape (value font, value buffer, value features) {\n\n\t\tint length = !val_is_null (features) ? val_array_size (features) : 0;\n\t\tdouble* _features = !val_is_null (features) ? val_array_double (features) : NULL;\n\t\thb_shape ((hb_font_t*)val_data (font), (hb_buffer_t*)val_data (buffer), (const hb_feature_t*)(uintptr_t*)_features, length);\n\n\t}\n\n\n\tHL_PRIM void HL_NAME(hl_hb_shape) (HL_CFFIPointer* font, HL_CFFIPointer* buffer, hl_varray* features) {\n\n\t\tint length = features ? features->size : 0;\n\t\tdouble* _features = features ? hl_aptr (features, double) : NULL;\n\t\thb_shape ((hb_font_t*)font->ptr, (hb_buffer_t*)buffer->ptr, (const hb_feature_t*)(uintptr_t*)_features, length);\n\n\t}\n\n\n\t//hb_blob_destroy\n\t//hb_blob_get_user_data\n\t//hb_blob_reference\n\t//hb_blob_set_user_data\n\t//hb_buffer_deserialize_glyphs\n\t//hb_buffer_destroy\n\t//hb_buffer_get_unicode_funcs\n\t//hb_buffer_get_user_data\n\t//hb_buffer_reference\n\t//hb_buffer_serialize_glyphs\n\t//hb_buffer_set_unicode_funcs\n\t//hb_buffer_set_user_data\n\t//hb_face_create_for_tables\n\t//hb_face_destroy\n\t//hb_face_get_user_data\n\t//hb_face_reference\n\t//hb_face_set_user_data\n\t//hb_font_destroy\n\t//hb_font_get_glyph_contour_point_for_origin\n\t//hb_font_get_glyph_extents_for_origin\n\t//hb_font_get_user_data\n\t//hb_font_reference\n\t//hb_font_set_user_data\n\t//hb_ft_face_create\n\t//hb_ft_face_create_cached\n\t//hb_ft_face_create_referenced\n\t//hb_ft_font_create\n\t//hb_ft_font_get_face\n\t//hb_ft_font_set_funcs\n\t//hb_set_destroy\n\t//hb_set_get_user_data\n\t//hb_set_reference\n\t//hb_set_set_user_data\n\t//hb_shape_full\n\n\n\tDEFINE_PRIME3 (lime_hb_blob_create);\n\tDEFINE_PRIME3 (lime_hb_blob_create_sub_blob);\n\tDEFINE_PRIME1 (lime_hb_blob_get_data);\n\tDEFINE_PRIME1 (lime_hb_blob_get_data_writable);\n\tDEFINE_PRIME0 (lime_hb_blob_get_empty);\n\tDEFINE_PRIME1 (lime_hb_blob_get_length);\n\tDEFINE_PRIME1 (lime_hb_blob_is_immutable);\n\tDEFINE_PRIME1v (lime_hb_blob_make_immutable);\n\tDEFINE_PRIME3v (lime_hb_buffer_add);\n\tDEFINE_PRIME4v (lime_hb_buffer_add_hxstring);\n\tDEFINE_PRIME5v (lime_hb_buffer_add_codepoints);\n\tDEFINE_PRIME4v (lime_hb_buffer_add_utf8);\n\tDEFINE_PRIME5v (lime_hb_buffer_add_utf16);\n\tDEFINE_PRIME5v (lime_hb_buffer_add_utf32);\n\tDEFINE_PRIME1 (lime_hb_buffer_allocation_successful);\n\tDEFINE_PRIME1v (lime_hb_buffer_clear_contents);\n\tDEFINE_PRIME0 (lime_hb_buffer_create);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_cluster_level);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_content_type);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_direction);\n\tDEFINE_PRIME0 (lime_hb_buffer_get_empty);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_flags);\n\tDEFINE_PRIME2 (lime_hb_buffer_get_glyph_infos);\n\tDEFINE_PRIME2 (lime_hb_buffer_get_glyph_positions);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_language);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_length);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_replacement_codepoint);\n\tDEFINE_PRIME1 (lime_hb_buffer_get_script);\n\tDEFINE_PRIME2v (lime_hb_buffer_get_segment_properties);\n\tDEFINE_PRIME1v (lime_hb_buffer_guess_segment_properties);\n\tDEFINE_PRIME1v (lime_hb_buffer_normalize_glyphs);\n\tDEFINE_PRIME2 (lime_hb_buffer_preallocate);\n\tDEFINE_PRIME1v (lime_hb_buffer_reset);\n\tDEFINE_PRIME1v (lime_hb_buffer_reverse);\n\tDEFINE_PRIME1v (lime_hb_buffer_reverse_clusters);\n\tDEFINE_PRIME1 (lime_hb_buffer_serialize_format_from_string);\n\tDEFINE_PRIME1 (lime_hb_buffer_serialize_format_to_string);\n\tDEFINE_PRIME0 (lime_hb_buffer_serialize_list_formats);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_cluster_level);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_content_type);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_direction);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_flags);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_language);\n\tDEFINE_PRIME2 (lime_hb_buffer_set_length);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_replacement_codepoint);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_script);\n\tDEFINE_PRIME2v (lime_hb_buffer_set_segment_properties);\n\tDEFINE_PRIME2 (lime_hb_face_create);\n\tDEFINE_PRIME0 (lime_hb_face_get_empty);\n\tDEFINE_PRIME1 (lime_hb_face_get_glyph_count);\n\tDEFINE_PRIME1 (lime_hb_face_get_index);\n\tDEFINE_PRIME1 (lime_hb_face_get_upem);\n\tDEFINE_PRIME1 (lime_hb_face_is_immutable);\n\tDEFINE_PRIME1v (lime_hb_face_make_immutable);\n\tDEFINE_PRIME1 (lime_hb_face_reference_blob);\n\tDEFINE_PRIME2 (lime_hb_face_reference_table);\n\tDEFINE_PRIME2v (lime_hb_face_set_index);\n\tDEFINE_PRIME2v (lime_hb_face_set_glyph_count);\n\tDEFINE_PRIME2v (lime_hb_face_set_upem);\n\tDEFINE_PRIME1 (lime_hb_feature_from_string);\n\tDEFINE_PRIME1 (lime_hb_feature_to_string);\n\tDEFINE_PRIME5v (lime_hb_font_add_glyph_origin_for_direction);\n\tDEFINE_PRIME1 (lime_hb_font_create);\n\tDEFINE_PRIME1 (lime_hb_font_create_sub_font);\n\tDEFINE_PRIME0 (lime_hb_font_get_empty);\n\tDEFINE_PRIME1 (lime_hb_font_get_face);\n\tDEFINE_PRIME3 (lime_hb_font_get_glyph_advance_for_direction);\n\tDEFINE_PRIME4 (lime_hb_font_get_glyph_kerning_for_direction);\n\tDEFINE_PRIME3 (lime_hb_font_get_glyph_origin_for_direction);\n\tDEFINE_PRIME1 (lime_hb_font_get_parent);\n\tDEFINE_PRIME1 (lime_hb_font_get_ppem);\n\tDEFINE_PRIME1 (lime_hb_font_get_scale);\n\tDEFINE_PRIME2 (lime_hb_font_glyph_from_string);\n\tDEFINE_PRIME2 (lime_hb_font_glyph_to_string);\n\tDEFINE_PRIME1 (lime_hb_font_is_immutable);\n\tDEFINE_PRIME1v (lime_hb_font_make_immutable);\n\tDEFINE_PRIME3v (lime_hb_font_set_ppem);\n\tDEFINE_PRIME3v (lime_hb_font_set_scale);\n\tDEFINE_PRIME5v (lime_hb_font_subtract_glyph_origin_for_direction);\n\tDEFINE_PRIME1 (lime_hb_ft_font_create);\n\tDEFINE_PRIME1 (lime_hb_ft_font_create_referenced);\n\tDEFINE_PRIME1 (lime_hb_ft_font_get_load_flags);\n\tDEFINE_PRIME2v (lime_hb_ft_font_set_load_flags);\n\tDEFINE_PRIME1 (lime_hb_language_from_string);\n\tDEFINE_PRIME0 (lime_hb_language_get_default);\n\tDEFINE_PRIME1 (lime_hb_language_to_string);\n\tDEFINE_PRIME2 (lime_hb_segment_properties_equal);\n\tDEFINE_PRIME1 (lime_hb_segment_properties_hash);\n\tDEFINE_PRIME2v (lime_hb_set_add);\n\tDEFINE_PRIME3v (lime_hb_set_add_range);\n\tDEFINE_PRIME1 (lime_hb_set_allocation_successful);\n\tDEFINE_PRIME1v (lime_hb_set_clear);\n\tDEFINE_PRIME0 (lime_hb_set_create);\n\tDEFINE_PRIME2v (lime_hb_set_del);\n\tDEFINE_PRIME3v (lime_hb_set_del_range);\n\tDEFINE_PRIME0 (lime_hb_set_get_empty);\n\tDEFINE_PRIME1 (lime_hb_set_get_max);\n\tDEFINE_PRIME1 (lime_hb_set_get_min);\n\tDEFINE_PRIME1 (lime_hb_set_get_population);\n\tDEFINE_PRIME2 (lime_hb_set_has);\n\tDEFINE_PRIME2v (lime_hb_set_intersect);\n\tDEFINE_PRIME1v (lime_hb_set_invert);\n\tDEFINE_PRIME1 (lime_hb_set_is_empty);\n\tDEFINE_PRIME2 (lime_hb_set_is_equal);\n\tDEFINE_PRIME1 (lime_hb_set_next);\n\tDEFINE_PRIME1 (lime_hb_set_next_range);\n\tDEFINE_PRIME2v (lime_hb_set_set);\n\tDEFINE_PRIME2v (lime_hb_set_subtract);\n\tDEFINE_PRIME2v (lime_hb_set_symmetric_difference);\n\tDEFINE_PRIME2v (lime_hb_set_union);\n\tDEFINE_PRIME3v (lime_hb_shape);\n\n\n\t#define _TBYTES _OBJ (_I32 _BYTES)\n\t#define _TCFFIPOINTER _DYN\n\t#define _TVECTOR2 _OBJ (_F64 _F64)\n\n\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_blob_create, _F64 _I32 _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_blob_create_sub_blob, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_F64, hl_hb_blob_get_data, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_F64, hl_hb_blob_get_data_writable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_blob_get_empty, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_hb_blob_get_length, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_blob_is_immutable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_blob_make_immutable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_add, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_add_hxstring, _TCFFIPOINTER _STRING _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_add_codepoints, _TCFFIPOINTER _F64 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_add_utf8, _TCFFIPOINTER _STRING _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_add_utf16, _TCFFIPOINTER _F64 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_add_utf32, _TCFFIPOINTER _F64 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_buffer_allocation_successful, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_clear_contents, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_buffer_create, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_cluster_level, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_content_type, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_direction, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_buffer_get_empty, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_flags, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TBYTES, hl_hb_buffer_get_glyph_infos, _TCFFIPOINTER _TBYTES);\n\tDEFINE_HL_PRIM (_TBYTES, hl_hb_buffer_get_glyph_positions, _TCFFIPOINTER _TBYTES);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_buffer_get_language, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_length, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_replacement_codepoint, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_get_script, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_get_segment_properties, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_guess_segment_properties, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_normalize_glyphs, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_buffer_preallocate, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_reset, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_reverse, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_reverse_clusters, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_buffer_serialize_format_from_string, _STRING);\n\tDEFINE_HL_PRIM (_BYTES, hl_hb_buffer_serialize_format_to_string, _I32);\n\tDEFINE_HL_PRIM (_ARR, hl_hb_buffer_serialize_list_formats, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_cluster_level, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_content_type, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_direction, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_flags, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_language, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_buffer_set_length, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_replacement_codepoint, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_script, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_buffer_set_segment_properties, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_face_create, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_face_get_empty, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_hb_face_get_glyph_count, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_face_get_index, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_face_get_upem, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_face_is_immutable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_face_make_immutable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_face_reference_blob, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_face_reference_table, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_face_set_glyph_count, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_face_set_index, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_face_set_upem, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_feature_from_string, _STRING);\n\tDEFINE_HL_PRIM (_BYTES, hl_hb_feature_to_string, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_font_add_glyph_origin_for_direction, _TCFFIPOINTER _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_font_create, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_font_create_sub_font, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_font_get_empty, _NO_ARG);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_font_get_face, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_hb_font_get_glyph_advance_for_direction, _TCFFIPOINTER _I32 _I32 _TVECTOR2);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_hb_font_get_glyph_kerning_for_direction, _TCFFIPOINTER _I32 _I32 _I32 _TVECTOR2);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_hb_font_get_glyph_origin_for_direction, _TCFFIPOINTER _I32 _I32 _TVECTOR2);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_font_get_parent, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_hb_font_get_ppem, _TCFFIPOINTER _TVECTOR2);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_hb_font_get_scale, _TCFFIPOINTER _TVECTOR2);\n\tDEFINE_HL_PRIM (_I32, hl_hb_font_glyph_from_string, _TCFFIPOINTER _STRING);\n\tDEFINE_HL_PRIM (_BYTES, hl_hb_font_glyph_to_string, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_font_is_immutable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_font_make_immutable, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_font_set_ppem, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_font_set_scale, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_font_subtract_glyph_origin_for_direction, _TCFFIPOINTER _I32 _I32 _I32 _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_ft_font_create, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_ft_font_create_referenced, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_ft_font_get_load_flags, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_ft_font_set_load_flags, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_language_from_string, _STRING);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_language_get_default, _NO_ARG);\n\tDEFINE_HL_PRIM (_BYTES, hl_hb_language_to_string, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_segment_properties_equal, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_segment_properties_hash, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_add, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_add_range, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_set_allocation_successful, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_clear, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_set_create, _NO_ARG);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_del, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_del_range, _TCFFIPOINTER _I32 _I32);\n\tDEFINE_HL_PRIM (_TCFFIPOINTER, hl_hb_set_get_empty, _NO_ARG);\n\tDEFINE_HL_PRIM (_I32, hl_hb_set_get_max, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_set_get_min, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_set_get_population, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_set_has, _TCFFIPOINTER _I32);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_intersect, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_invert, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_set_is_empty, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_BOOL, hl_hb_set_is_equal, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_I32, hl_hb_set_next, _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_TVECTOR2, hl_hb_set_next_range, _TCFFIPOINTER _TVECTOR2);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_set, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_subtract, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_symmetric_difference, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_set_union, _TCFFIPOINTER _TCFFIPOINTER);\n\tDEFINE_HL_PRIM (_VOID, hl_hb_shape, _TCFFIPOINTER _TCFFIPOINTER _ARR);\n\n\n}\n\n\nextern \"C\" int lime_harfbuzz_register_prims () {\n\n\treturn 0;\n\n}\n"
  },
  {
    "path": "project/src/ui/DropEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/DropEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* DropEvent::callback = 0;\n\tValuePointer* DropEvent::eventObject = 0;\n\n\tstatic int id_file;\n\tstatic int id_type;\n\tstatic bool init = false;\n\n\n\tDropEvent::DropEvent () {\n\n\t\tfile = 0;\n\t\ttype = DROP_FILE;\n\n\t}\n\n\n\tvoid DropEvent::Dispatch (DropEvent* event) {\n\n\t\tif (DropEvent::callback) {\n\n\t\t\tif (DropEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_file = val_id (\"file\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)DropEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_file, alloc_string ((const char*)event->file));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\n\t\t\t} else {\n\n\t\t\t\tDropEvent* eventObject = (DropEvent*)DropEvent::eventObject->Get ();\n\n\t\t\t\tint length = strlen ((const char*)event->file);\n\t\t\t\tchar* file = (char*)malloc (length + 1);\n\t\t\t\tstrcpy (file, (const char*)event->file);\n\t\t\t\teventObject->file = (vbyte*)file;\n\t\t\t\teventObject->type = event->type;\n\n\t\t\t}\n\n\t\t\tDropEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/ui/FileDialog.cpp",
    "content": "#include <ui/FileDialog.h>\n#include <stdio.h>\n#include <cstdlib>\n#include <cstring>\n#include <sstream>\n\n#include <tinyfiledialogs.h>\n\n\nnamespace lime {\n\n\n\tstd::string* wstring_to_string (std::wstring* source) {\n\n\t\tif (!source) return NULL;\n\n\t\tint size = std::wcslen (source->c_str ());\n\t\tchar* temp = (char*)malloc (size + 1);\n\t\tstd::wcstombs (temp, source->c_str (), size);\n\t\ttemp[size] = '\\0';\n\n\t\tstd::string* data = new std::string (temp);\n\t\tfree (temp);\n\t\treturn data;\n\n\t}\n\n\n\tstd::wstring* FileDialog::OpenDirectory (std::wstring* title, std::wstring* filter, std::wstring* defaultPath) {\n\n\t\t// TODO: Filter?\n\n\t\t#ifdef HX_WINDOWS\n\n\t\tconst wchar_t* path = tinyfd_selectFolderDialogW (title ? title->c_str () : 0, defaultPath ? defaultPath->c_str () : 0);\n\n\t\tif (path && std::wcslen(path) > 0) {\n\n\t\t\tstd::wstring* _path = new std::wstring (path);\n\t\t\treturn _path;\n\n\t\t}\n\n\t\t#else\n\n\t\tstd::string* _title = wstring_to_string (title);\n\t\t//std::string* _filter = wstring_to_string (filter);\n\t\tstd::string* _defaultPath = wstring_to_string (defaultPath);\n\n\t\tconst char* path = tinyfd_selectFolderDialog (_title ? _title->c_str () : NULL, _defaultPath ? _defaultPath->c_str () : NULL);\n\n\t\tif (_title) delete _title;\n\t\t//if (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path && std::strlen(path) > 0) {\n\n\t\t\tstd::string _path = std::string (path);\n\t\t\tstd::wstring* __path = new std::wstring (_path.begin (), _path.end ());\n\t\t\treturn __path;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tstd::wstring* FileDialog::OpenFile (std::wstring* title, std::wstring* filter, std::wstring* defaultPath) {\n\n\t\t#ifdef HX_WINDOWS\n\n\t\tstd::vector<std::wstring> filters_vec;\n\t\tif (filter) {\n\t\t\tstd::wstring temp (L\"*.\");\n\t\t\tstd::wstring line;\n\t\t\tstd::wstringstream ss(*filter);\n\t\t\twhile(std::getline(ss, line, L',')) {\n\t\t\t\tfilters_vec.push_back(temp + line);\n\t\t\t}\n\t\t}\n\n\t\tconst int numFilters = filter ? filters_vec.size() : 1;\n\t\tconst wchar_t **filters = new const wchar_t*[numFilters];\n\t\tif (filter && numFilters > 0) {\n\t\t\tfor (int index = 0; index < numFilters; index++) {\n\t\t\t\tfilters[index] = const_cast<wchar_t*>(filters_vec[index].c_str());\n\t\t\t}\n\t\t} else {\n\t\t\tfilters[0] = NULL;\n\t\t}\n\n\t\tconst wchar_t* path = tinyfd_openFileDialogW (title ? title->c_str () : 0, defaultPath ? defaultPath->c_str () : 0, filter ? numFilters : 0, filter ? filters : NULL, NULL, 0);\n\n\t\tdelete[] filters;\n\n\t\tif (path && std::wcslen(path) > 0) {\n\n\t\t\tstd::wstring* _path = new std::wstring (path);\n\t\t\treturn _path;\n\n\t\t}\n\n\t\t#else\n\n\t\tstd::string* _title = wstring_to_string (title);\n\t\tstd::string* _filter = wstring_to_string (filter);\n\t\tstd::string* _defaultPath = wstring_to_string (defaultPath);\n\n\t\tstd::vector<std::string> filters_vec;\n\t\tif (_filter) {\n\t\t\tstd::string line;\n\t\t\tstd::stringstream ss(*_filter);\n\t\t\twhile(std::getline(ss, line, ',')) {\n\t\t\t\tline.insert (0, \"*.\");\n\t\t\t\tfilters_vec.push_back(line);\n\t\t\t}\n\t\t}\n\n\t\tconst int numFilters = _filter ? filters_vec.size() : 1;\n\t\tconst char **filters = new const char*[numFilters];\n\t\tif (_filter && numFilters > 0) {\n\t\t\tfor (int index = 0; index < numFilters; index++) {\n\t\t\t\tfilters[index] = const_cast<char*>(filters_vec[index].c_str());\n\t\t\t}\n\t\t} else {\n\t\t\tfilters[0] = NULL;\n\t\t}\n\n\t\tconst char* path = tinyfd_openFileDialog (_title ? _title->c_str () : NULL, _defaultPath ? _defaultPath->c_str () : NULL, _filter ? numFilters : 0, _filter ? filters : NULL, NULL, 0);\n\n\t\tdelete[] filters;\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path && std::strlen(path) > 0) {\n\n\t\t\tstd::string _path = std::string (path);\n\t\t\tstd::wstring* __path = new std::wstring (_path.begin (), _path.end ());\n\t\t\treturn __path;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n\tvoid FileDialog::OpenFiles (std::vector<std::wstring*>* files, std::wstring* title, std::wstring* filter, std::wstring* defaultPath) {\n\n\t\tstd::wstring* __paths = 0;\n\n\t\t#ifdef HX_WINDOWS\n\n\t\tstd::vector<std::wstring> filters_vec;\n\t\tif (filter) {\n\t\t\tstd::wstring temp (L\"*.\");\n\t\t\tstd::wstring line;\n\t\t\tstd::wstringstream ss(*filter);\n\t\t\twhile(std::getline(ss, line, L',')) {\n\t\t\t\tfilters_vec.push_back(temp + line);\n\t\t\t}\n\t\t}\n\n\t\tconst int numFilters = filter ? filters_vec.size() : 1;\n\t\tconst wchar_t **filters = new const wchar_t*[numFilters];\n\t\tif (filter && numFilters > 0) {\n\t\t\tfor (int index = 0; index < numFilters; index++) {\n\t\t\t\tfilters[index] = const_cast<wchar_t*>(filters_vec[index].c_str());\n\t\t\t}\n\t\t} else {\n\t\t\tfilters[0] = NULL;\n\t\t}\n\n\t\tconst wchar_t* paths = tinyfd_openFileDialogW (title ? title->c_str () : 0, defaultPath ? defaultPath->c_str () : 0, filter ? numFilters : 0, filter ? filters : NULL, NULL, 1);\n\n\t\tdelete[] filters;\n\n\t\tif (paths) {\n\n\t\t\t__paths = new std::wstring (paths);\n\n\t\t}\n\n\t\t#else\n\n\t\tstd::string* _title = wstring_to_string (title);\n\t\tstd::string* _filter = wstring_to_string (filter);\n\t\tstd::string* _defaultPath = wstring_to_string (defaultPath);\n\n\t\tstd::vector<std::string> filters_vec;\n\t\tif (_filter) {\n\t\t\tstd::string line;\n\t\t\tstd::stringstream ss(*_filter);\n\t\t\twhile(std::getline(ss, line, ',')) {\n\t\t\t\tline.insert (0, \"*.\");\n\t\t\t\tfilters_vec.push_back(line);\n\t\t\t}\n\t\t}\n\n\t\tconst int numFilters = _filter ? filters_vec.size() : 1;\n\t\tconst char **filters = new const char*[numFilters];\n\t\tif (_filter && numFilters > 0) {\n\t\t\tfor (int index = 0; index < numFilters; index++) {\n\t\t\t\tfilters[index] = const_cast<char*>(filters_vec[index].c_str());\n\t\t\t}\n\t\t} else {\n\t\t\tfilters[0] = NULL;\n\t\t}\n\n\t\tconst char* paths = tinyfd_openFileDialog (_title ? _title->c_str () : NULL, _defaultPath ? _defaultPath->c_str () : NULL, _filter ? numFilters : 0, _filter ? filters : NULL, NULL, 1);\n\n\t\tdelete[] filters;\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (paths) {\n\n\t\t\tstd::string _paths = std::string (paths);\n\t\t\t__paths = new std::wstring (_paths.begin (), _paths.end ());\n\n\t\t}\n\n\t\t#endif\n\n\t\tif (__paths) {\n\n\t\t\tstd::wstring sep = L\"|\";\n\n\t\t\tstd::size_t start = 0, end = 0;\n\n\t\t\twhile ((end = __paths->find (sep, start)) != std::wstring::npos) {\n\n\t\t\t\tfiles->push_back (new std::wstring (__paths->substr (start, end - start).c_str ()));\n\t\t\t\tstart = end + 1;\n\n\t\t\t}\n\n\t\t\tfiles->push_back (new std::wstring (__paths->substr (start).c_str ()));\n\n\t\t}\n\n\t}\n\n\n\tstd::wstring* FileDialog::SaveFile (std::wstring* title, std::wstring* filter, std::wstring* defaultPath) {\n\n\t\t#ifdef HX_WINDOWS\n\n\t\tstd::wstring temp (L\"*.\");\n\t\tconst wchar_t* filters[] = { filter ? (temp + *filter).c_str () : NULL };\n\n\t\tconst wchar_t* path = tinyfd_saveFileDialogW (title ? title->c_str () : 0, defaultPath ? defaultPath->c_str () : 0, filter ? 1 : 0, filter ? filters : NULL, NULL);\n\n\t\tif (path && std::wcslen(path) > 0) {\n\n\t\t\tstd::wstring* _path = new std::wstring (path);\n\t\t\treturn _path;\n\n\t\t}\n\n\t\t#else\n\n\t\tstd::string* _title = wstring_to_string (title);\n\t\tstd::string* _filter = wstring_to_string (filter);\n\t\tstd::string* _defaultPath = wstring_to_string (defaultPath);\n\n\t\tconst char* filters[] = { NULL };\n\n\t\tif (_filter) {\n\n\t\t\t_filter->insert (0, \"*.\");\n\t\t\tfilters[0] = _filter->c_str ();\n\n\t\t}\n\n\t\tconst char* path = tinyfd_saveFileDialog (_title ? _title->c_str () : NULL, _defaultPath ? _defaultPath->c_str () : NULL, _filter ? 1 : 0, _filter ? filters : NULL, NULL);\n\n\t\tif (_title) delete _title;\n\t\tif (_filter) delete _filter;\n\t\tif (_defaultPath) delete _defaultPath;\n\n\t\tif (path && std::strlen(path) > 0) {\n\n\t\t\tstd::string _path = std::string (path);\n\t\t\tstd::wstring* __path = new std::wstring (_path.begin (), _path.end ());\n\t\t\treturn __path;\n\n\t\t}\n\n\t\t#endif\n\n\t\treturn 0;\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/ui/GamepadEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/GamepadEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* GamepadEvent::callback = 0;\n\tValuePointer* GamepadEvent::eventObject = 0;\n\n\tstatic double id_axis;\n\tstatic int id_button;\n\tstatic int id_id;\n\tstatic int id_type;\n\tstatic int id_value;\n\tstatic bool init = false;\n\n\n\tGamepadEvent::GamepadEvent () {\n\n\t\taxis = 0;\n\t\taxisValue = 0;\n\t\tbutton = 0;\n\t\tid = 0;\n\t\ttype = GAMEPAD_AXIS_MOVE;\n\n\t}\n\n\n\tvoid GamepadEvent::Dispatch (GamepadEvent* event) {\n\n\t\tif (GamepadEvent::callback) {\n\n\t\t\tif (GamepadEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_axis = val_id (\"axis\");\n\t\t\t\t\tid_button = val_id (\"button\");\n\t\t\t\t\tid_id = val_id (\"id\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_value = val_id (\"axisValue\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)GamepadEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_axis, alloc_int (event->axis));\n\t\t\t\talloc_field (object, id_button, alloc_int (event->button));\n\t\t\t\talloc_field (object, id_id, alloc_int (event->id));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_value, alloc_float (event->axisValue));\n\n\t\t\t} else {\n\n\t\t\t\tGamepadEvent* eventObject = (GamepadEvent*)GamepadEvent::eventObject->Get ();\n\n\t\t\t\teventObject->axis = event->axis;\n\t\t\t\teventObject->button = event->button;\n\t\t\t\teventObject->id = event->id;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->axisValue = event->axisValue;\n\n\t\t\t}\n\n\t\t\tGamepadEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/ui/Haptic.mm",
    "content": "#include <ui/Haptic.h>\n\n#import <AudioToolbox/AudioToolbox.h>\n\n\nnamespace lime {\n\n\n\tvoid Haptic::Vibrate (int period, int duration) {\n\n\t\tAudioServicesPlayAlertSound (kSystemSoundID_Vibrate);\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/ui/JoystickEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/JoystickEvent.h>\n\n\nnamespace lime {\n\t\n\t\n\tValuePointer* JoystickEvent::callback = 0;\n\tValuePointer* JoystickEvent::eventObject = 0;\n\t\n\tstatic int id_id;\n\tstatic int id_index;\n\tstatic int id_type;\n\tstatic int id_value;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\t\n\t\n\tJoystickEvent::JoystickEvent () {\n\t\t\n\t\tid = 0;\n\t\tindex = 0;\n\t\teventValue = 0;\n\t\tx = 0;\n\t\ty = 0;\n\t\ttype = JOYSTICK_AXIS_MOVE;\n\t\t\n\t}\n\t\n\t\n\tvoid JoystickEvent::Dispatch (JoystickEvent* event) {\n\t\t\n\t\tif (JoystickEvent::callback) {\n\t\t\t\n\t\t\tif (JoystickEvent::eventObject->IsCFFIValue ()) {\n\t\t\t\t\n\t\t\t\tif (!init) {\n\t\t\t\t\t\n\t\t\t\t\tid_id = val_id (\"id\");\n\t\t\t\t\tid_index = val_id (\"index\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_value = val_id (\"eventValue\");\n\t\t\t\t\tid_x = val_id (\"x\");\n\t\t\t\t\tid_y = val_id (\"y\");\n\t\t\t\t\tinit = true;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvalue object = (value)JoystickEvent::eventObject->Get ();\n\t\t\t\t\n\t\t\t\talloc_field (object, id_id, alloc_int (event->id));\n\t\t\t\talloc_field (object, id_index, alloc_int (event->index));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_value, alloc_int (event->eventValue));\n\t\t\t\talloc_field (object, id_x, alloc_float (event->x));\n\t\t\t\talloc_field (object, id_y, alloc_float (event->y));\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tJoystickEvent* eventObject = (JoystickEvent*)JoystickEvent::eventObject->Get ();\n\t\t\t\t\n\t\t\t\teventObject->id = event->id;\n\t\t\t\teventObject->index = event->index;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->eventValue = event->eventValue;\n\t\t\t\teventObject->x = event->x;\n\t\t\t\teventObject->y = event->y;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tJoystickEvent::callback->Call ();\n\t\t\t\n\t\t}\n\t\t\n\t}\n\t\n\t\n}"
  },
  {
    "path": "project/src/ui/KeyEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/KeyEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* KeyEvent::callback = 0;\n\tValuePointer* KeyEvent::eventObject = 0;\n\n\tstatic double id_keyCode;\n\tstatic int id_modifier;\n\tstatic int id_type;\n\tstatic int id_windowID;\n\tstatic bool init = false;\n\n\n\tKeyEvent::KeyEvent () {\n\n\t\tkeyCode = 0;\n\t\tmodifier = 0;\n\t\ttype = KEY_DOWN;\n\t\twindowID = 0;\n\n\t}\n\n\n\tvoid KeyEvent::Dispatch (KeyEvent* event) {\n\n\t\tif (KeyEvent::callback) {\n\n\t\t\tif (KeyEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_keyCode = val_id (\"keyCode\");\n\t\t\t\t\tid_modifier = val_id (\"modifier\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_windowID = val_id (\"windowID\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)KeyEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_keyCode, alloc_float (event->keyCode));\n\t\t\t\talloc_field (object, id_modifier, alloc_int (event->modifier));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_windowID, alloc_int (event->windowID));\n\n\t\t\t} else {\n\n\t\t\t\tKeyEvent* eventObject = (KeyEvent*)KeyEvent::eventObject->Get ();\n\n\t\t\t\teventObject->keyCode = event->keyCode;\n\t\t\t\teventObject->modifier = event->modifier;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->windowID = event->windowID;\n\n\t\t\t}\n\n\t\t\tKeyEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/ui/MouseEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/MouseEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* MouseEvent::callback = 0;\n\tValuePointer* MouseEvent::eventObject = 0;\n\n\tstatic int id_button;\n\tstatic int id_movementX;\n\tstatic int id_movementY;\n\tstatic int id_type;\n\tstatic int id_windowID;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic int id_clickCount;\n\tstatic bool init = false;\n\n\n\tMouseEvent::MouseEvent () {\n\n\t\tbutton = 0;\n\t\ttype = MOUSE_DOWN;\n\t\twindowID = 0;\n\t\tx = 0.0;\n\t\ty = 0.0;\n\t\tmovementX = 0.0;\n\t\tmovementY = 0.0;\n\t\tclickCount = 0;\n\n\t}\n\n\n\tvoid MouseEvent::Dispatch (MouseEvent* event) {\n\n\t\tif (MouseEvent::callback) {\n\n\t\t\tif (MouseEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_button = val_id (\"button\");\n\t\t\t\t\tid_movementX = val_id (\"movementX\");\n\t\t\t\t\tid_movementY = val_id (\"movementY\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_windowID = val_id (\"windowID\");\n\t\t\t\t\tid_x = val_id (\"x\");\n\t\t\t\t\tid_y = val_id (\"y\");\n\t\t\t\t\tid_clickCount = val_id (\"clickCount\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)MouseEvent::eventObject->Get ();\n\n\t\t\t\tif (event->type != MOUSE_WHEEL) {\n\n\t\t\t\t\talloc_field (object, id_button, alloc_int (event->button));\n\t\t\t\t}\n\n\t\t\t\tif (event->type != MOUSE_WHEEL && event->type != MOUSE_MOVE) {\n\n\t\t\t\t\talloc_field (object, id_clickCount, alloc_int (event->clickCount));\n\t\t\t\t}\n\n\t\t\t\talloc_field (object, id_movementX, alloc_float (event->movementX));\n\t\t\t\talloc_field (object, id_movementY, alloc_float (event->movementY));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_windowID, alloc_int (event->windowID));\n\t\t\t\talloc_field (object, id_x, alloc_float (event->x));\n\t\t\t\talloc_field (object, id_y, alloc_float (event->y));\n\n\t\t\t} else {\n\n\t\t\t\tMouseEvent* eventObject = (MouseEvent*)MouseEvent::eventObject->Get ();\n\n\t\t\t\teventObject->button = event->button;\n\t\t\t\teventObject->movementX = event->movementX;\n\t\t\t\teventObject->movementY = event->movementY;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->windowID = event->windowID;\n\t\t\t\teventObject->x = event->x;\n\t\t\t\teventObject->y = event->y;\n\t\t\t\teventObject->clickCount = event->clickCount;\n\n\t\t\t}\n\n\t\t\tMouseEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/ui/TextEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/TextEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* TextEvent::callback = 0;\n\tValuePointer* TextEvent::eventObject = 0;\n\n\tstatic int id_length;\n\tstatic int id_start;\n\tstatic int id_text;\n\tstatic int id_type;\n\tstatic int id_windowID;\n\tstatic bool init = false;\n\n\n\tTextEvent::TextEvent () {\n\n\t\tlength = 0;\n\t\tstart = 0;\n\t\ttext = 0;\n\t\twindowID = 0;\n\n\t}\n\n\n\tvoid TextEvent::Dispatch (TextEvent* event) {\n\n\t\tif (TextEvent::callback) {\n\n\t\t\tif (TextEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_length = val_id (\"length\");\n\t\t\t\t\tid_start = val_id (\"start\");\n\t\t\t\t\tid_text = val_id (\"text\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_windowID = val_id (\"windowID\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)TextEvent::eventObject->Get ();\n\n\t\t\t\tif (event->type != TEXT_INPUT) {\n\n\t\t\t\t\talloc_field (object, id_length, alloc_int (event->length));\n\t\t\t\t\talloc_field (object, id_start, alloc_int (event->start));\n\n\t\t\t\t}\n\n\t\t\t\talloc_field (object, id_text, alloc_string ((const char*)event->text));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_windowID, alloc_int (event->windowID));\n\n\t\t\t} else {\n\n\t\t\t\tTextEvent* eventObject = (TextEvent*)TextEvent::eventObject->Get ();\n\n\t\t\t\tif (event->type != TEXT_INPUT) {\n\n\t\t\t\t\teventObject->length = event->length;\n\t\t\t\t\teventObject->start = event->start;\n\n\t\t\t\t}\n\n\t\t\t\tint length = strlen ((const char*)event->text);\n\t\t\t\tchar* text = (char*)malloc (length + 1);\n\t\t\t\tstrcpy (text, (const char*)event->text);\n\t\t\t\teventObject->text = (vbyte*)text;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->windowID = event->windowID;\n\n\t\t\t}\n\n\t\t\tTextEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/ui/TouchEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/TouchEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* TouchEvent::callback = 0;\n\tValuePointer* TouchEvent::eventObject = 0;\n\n\tstatic int id_device;\n\tstatic int id_dx;\n\tstatic int id_dy;\n\tstatic int id_id;\n\tstatic int id_pressure;\n\tstatic int id_type;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\n\n\tTouchEvent::TouchEvent () {\n\n\t\ttype = TOUCH_START;\n\t\tx = 0;\n\t\ty = 0;\n\t\tid = 0;\n\t\tdx = 0;\n\t\tdy = 0;\n\t\tpressure = 0;\n\t\tdevice = 0;\n\n\t}\n\n\n\tvoid TouchEvent::Dispatch (TouchEvent* event) {\n\n\t\tif (TouchEvent::callback) {\n\n\t\t\tif (TouchEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_device = val_id (\"device\");\n\t\t\t\t\tid_dx = val_id (\"dx\");\n\t\t\t\t\tid_dy = val_id (\"dy\");\n\t\t\t\t\tid_id = val_id (\"id\");\n\t\t\t\t\tid_pressure = val_id (\"pressure\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_x = val_id (\"x\");\n\t\t\t\t\tid_y = val_id (\"y\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)TouchEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_device, alloc_int (event->device));\n\t\t\t\talloc_field (object, id_dx, alloc_float (event->dx));\n\t\t\t\talloc_field (object, id_dy, alloc_float (event->dy));\n\t\t\t\talloc_field (object, id_id, alloc_int (event->id));\n\t\t\t\talloc_field (object, id_pressure, alloc_float (event->pressure));\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_x, alloc_float (event->x));\n\t\t\t\talloc_field (object, id_y, alloc_float (event->y));\n\n\t\t\t} else {\n\n\t\t\t\tTouchEvent* eventObject = (TouchEvent*)TouchEvent::eventObject->Get ();\n\n\t\t\t\teventObject->device = event->device;\n\t\t\t\teventObject->dx = event->dx;\n\t\t\t\teventObject->dy = event->dy;\n\t\t\t\teventObject->id = event->id;\n\t\t\t\teventObject->pressure = event->pressure;\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->x = event->x;\n\t\t\t\teventObject->y = event->y;\n\n\t\t\t}\n\n\t\t\tTouchEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/ui/WindowEvent.cpp",
    "content": "#include <system/CFFI.h>\n#include <ui/WindowEvent.h>\n\n\nnamespace lime {\n\n\n\tValuePointer* WindowEvent::callback = 0;\n\tValuePointer* WindowEvent::eventObject = 0;\n\n\tstatic int id_height;\n\tstatic int id_type;\n\tstatic int id_width;\n\tstatic int id_windowID;\n\tstatic int id_x;\n\tstatic int id_y;\n\tstatic bool init = false;\n\n\n\tWindowEvent::WindowEvent () {\n\n\t\ttype = WINDOW_ACTIVATE;\n\n\t\twidth = 0;\n\t\theight = 0;\n\t\twindowID = 0;\n\t\tx = 0;\n\t\ty = 0;\n\n\t}\n\n\n\tvoid WindowEvent::Dispatch (WindowEvent* event) {\n\n\t\tif (WindowEvent::callback) {\n\n\t\t\tif (WindowEvent::eventObject->IsCFFIValue ()) {\n\n\t\t\t\tif (!init) {\n\n\t\t\t\t\tid_height = val_id (\"height\");\n\t\t\t\t\tid_type = val_id (\"type\");\n\t\t\t\t\tid_width = val_id (\"width\");\n\t\t\t\t\tid_windowID = val_id (\"windowID\");\n\t\t\t\t\tid_x = val_id (\"x\");\n\t\t\t\t\tid_y = val_id (\"y\");\n\t\t\t\t\tinit = true;\n\n\t\t\t\t}\n\n\t\t\t\tvalue object = (value)WindowEvent::eventObject->Get ();\n\n\t\t\t\talloc_field (object, id_type, alloc_int (event->type));\n\t\t\t\talloc_field (object, id_windowID, alloc_int (event->windowID));\n\n\t\t\t\tswitch (event->type) {\n\n\t\t\t\t\tcase WINDOW_MOVE:\n\n\t\t\t\t\t\talloc_field (object, id_x, alloc_int (event->x));\n\t\t\t\t\t\talloc_field (object, id_y, alloc_int (event->y));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WINDOW_RESIZE:\n\n\t\t\t\t\t\talloc_field (object, id_width, alloc_int (event->width));\n\t\t\t\t\t\talloc_field (object, id_height, alloc_int (event->height));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: break;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tWindowEvent* eventObject = (WindowEvent*)WindowEvent::eventObject->Get ();\n\n\t\t\t\teventObject->type = event->type;\n\t\t\t\teventObject->windowID = event->windowID;\n\n\t\t\t\tswitch (event->type) {\n\n\t\t\t\t\tcase WINDOW_MOVE:\n\n\t\t\t\t\t\teventObject->x = event->x;\n\t\t\t\t\t\teventObject->y = event->y;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WINDOW_RESIZE:\n\n\t\t\t\t\t\teventObject->width = event->width;\n\t\t\t\t\t\teventObject->height = event->height;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: break;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tWindowEvent::callback->Call ();\n\n\t\t}\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/utils/ArrayBufferView.cpp",
    "content": "#include <utils/ArrayBufferView.h>\n\n\nnamespace lime {\n\n\n\tstatic int id_buffer;\n\tstatic int id_byteLength;\n\tstatic int id_length;\n\tstatic bool init = false;\n\n\n\tArrayBufferView::ArrayBufferView (value arrayBufferView) {\n\n\t\tif (!init) {\n\n\t\t\tid_buffer = val_id (\"buffer\");\n\t\t\tid_byteLength = val_id (\"byteLength\");\n\t\t\tid_length = val_id (\"length\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\tif (!val_is_null (arrayBufferView)) {\n\n\t\t\tbuffer = new Bytes (val_field (arrayBufferView, id_buffer));\n\t\t\tbyteLength = val_int (val_field (arrayBufferView, id_byteLength));\n\t\t\tlength = val_int (val_field (arrayBufferView, id_length));\n\n\t\t} else {\n\n\t\t\tbuffer = new Bytes ();\n\t\t\tbyteLength = 0;\n\t\t\tlength = 0;\n\n\t\t}\n\n\t}\n\n\n\tArrayBufferView::~ArrayBufferView () {\n\n\t\tif (buffer) {\n\n\t\t\tdelete buffer;\n\n\t\t}\n\n\t}\n\n\n\tvoid ArrayBufferView::Resize (int size) {\n\n\t\tbuffer->Resize (size);\n\n\t\tbyteLength = size;\n\t\tlength = size;\n\n\t}\n\n\n\tvoid ArrayBufferView::Set (value bytes) {\n\n\t\tbuffer->Set (bytes);\n\t\tbyteLength = buffer->length;\n\t\tlength = byteLength;\n\n\t}\n\n\n\tvoid ArrayBufferView::Set (const QuickVec<unsigned char> data) {\n\n\t\tbuffer->Set (data);\n\t\tbyteLength = buffer->length;\n\t\tlength = byteLength;\n\n\t}\n\n\n\tvalue ArrayBufferView::Value () {\n\n\t\treturn Value (alloc_empty_object ());\n\n\t}\n\n\n\tvalue ArrayBufferView::Value (value arrayBufferView) {\n\n\t\tif (!init) {\n\n\t\t\tid_buffer = val_id (\"buffer\");\n\t\t\tid_byteLength = val_id (\"byteLength\");\n\t\t\tid_length = val_id (\"length\");\n\t\t\tinit = true;\n\n\t\t}\n\n\t\talloc_field (arrayBufferView, id_buffer, buffer ? buffer->Value (val_field (arrayBufferView, id_buffer)) : alloc_null ());\n\t\talloc_field (arrayBufferView, id_byteLength, alloc_int (byteLength));\n\t\talloc_field (arrayBufferView, id_length, alloc_int (length));\n\t\treturn arrayBufferView;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/utils/Bytes.cpp",
    "content": "#include <system/Mutex.h>\n#include <system/System.h>\n#include <utils/Bytes.h>\n#include <map>\n\n\nnamespace lime {\n\n\n\tstatic int id_b;\n\tstatic int id_length;\n\tstatic bool init = false;\n\tstatic bool useBuffer = false;\n\tstatic std::map<Bytes*, bool> hadValue;\n\tstatic std::map<Bytes*, bool> usingValue;\n\tstatic Mutex mutex;\n\n\n\tinline void _initializeBytes () {\n\n\t\tif (!init) {\n\n\t\t\tid_b = val_id (\"b\");\n\t\t\tid_length = val_id (\"length\");\n\n\t\t\tbuffer _buffer = alloc_buffer_len (1);\n\n\t\t\tif (buffer_data (_buffer)) {\n\n\t\t\t\tuseBuffer = true;\n\n\t\t\t}\n\n\t\t\tinit = true;\n\n\t\t}\n\n\t}\n\n\n\tBytes::Bytes () {\n\n\t\t_initializeBytes ();\n\n\t\tb = 0;\n\t\tlength = 0;\n\n\t}\n\n\n\tBytes::Bytes (value bytes) {\n\n\t\t_initializeBytes ();\n\n\t\tb = 0;\n\t\tlength = 0;\n\n\t\tSet (bytes);\n\n\t}\n\n\n\tBytes::~Bytes () {\n\n\t\tmutex.Lock ();\n\n\t\tif (hadValue.find (this) != hadValue.end ()) {\n\n\t\t\thadValue.erase (this);\n\n\t\t\tif (usingValue.find (this) == usingValue.end () && b) {\n\n\t\t\t\tfree (b);\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (usingValue.find (this) != usingValue.end ()) {\n\n\t\t\tusingValue.erase (this);\n\n\t\t}\n\n\t\tmutex.Unlock ();\n\n\t}\n\n\n\tvoid Bytes::ReadFile (const char* path) {\n\n\t\tFILE_HANDLE *file = lime::fopen (path, \"rb\");\n\n\t\tif (!file) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tlime::fseek (file, 0, SEEK_END);\n\t\tint size = lime::ftell (file);\n\t\tlime::fseek (file, 0, SEEK_SET);\n\n\t\tif (size > 0) {\n\n\t\t\tResize (size);\n\t\t\tint status = lime::fread (b, 1, size, file);\n\n\t\t}\n\n\t\tlime::fclose (file);\n\n\t}\n\n\n\tvoid Bytes::Resize (int size) {\n\n\t\tif (size != length || (length > 0 && !b)) {\n\n\t\t\tmutex.Lock ();\n\n\t\t\tif (size <= 0) {\n\n\t\t\t\tif (b) {\n\n\t\t\t\t\tif (usingValue.find (this) != usingValue.end ()) {\n\n\t\t\t\t\t\tusingValue.erase (this);\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfree (b);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tb = 0;\n\t\t\t\t\tlength = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tunsigned char* data = (unsigned char*)malloc (sizeof (char) * size);\n\n\t\t\t\tif (b) {\n\n\t\t\t\t\tif (length) {\n\n\t\t\t\t\t\tmemcpy (data, b, length < size ? length : size);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif (usingValue.find (this) != usingValue.end ()) {\n\n\t\t\t\t\t\tusingValue.erase (this);\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfree (b);\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if (usingValue.find (this) != usingValue.end ()) {\n\n\t\t\t\t\tusingValue.erase (this);\n\n\t\t\t\t}\n\n\t\t\t\tb = data;\n\t\t\t\tlength = size;\n\n\t\t\t}\n\n\t\t\tmutex.Unlock ();\n\n\t\t}\n\n\t}\n\n\n\tvoid Bytes::Set(value bytes) {\t\n\t\t\n\t    int newLength = 0;\n\t    unsigned char* newB = 0;\n\t    bool isNull = val_is_null(bytes);\n\t\n\t    if (!isNull) {\n\t\n\t        //here we can extract the values before calling our mutex to avoid potential deadlock or contention\n\t        value lengthVal = val_field(bytes, id_length);\n\t        value bVal = val_field(bytes, id_b);\n\t\n\t        newLength = val_int(lengthVal);\n\t\n\t        if (newLength > 0) {\n\t\n\t            if (val_is_string(bVal)) {\n\t                newB = (unsigned char*)val_string(bVal);\n\t            } else {\n\t                newB = (unsigned char*)buffer_data(val_to_buffer(bVal));\n\t            }\n\t        }\n\t    }\n\t\n\t    //and now it should be save to lock\n\t    mutex.Lock();\n\t\n\t    if (isNull) {\n\t        usingValue.erase(this);\n\t        length = 0;\n\t        b = 0;\n\t    } else {\n\t        hadValue[this] = true;\n\t        usingValue[this] = true;\n\t        length = newLength;\n\t        b = newB;\n\t    }\n\t\n\t    mutex.Unlock();\n\t}\n\n\n\tvoid Bytes::Set (const QuickVec<unsigned char> data) {\n\n\t\tint size = data.size ();\n\n\t\tif (size > 0) {\n\n\t\t\tResize (size);\n\t\t\tmemcpy (b, &data[0], length);\n\n\t\t} else {\n\n\t\t\tmutex.Lock ();\n\n\t\t\tif (usingValue.find (this) != usingValue.end ()) {\n\n\t\t\t\tusingValue.erase (this);\n\n\t\t\t}\n\n\t\t\tmutex.Unlock ();\n\n\t\t\tb = 0;\n\t\t\tlength = 0;\n\n\t\t}\n\n\t}\n\n\n\tvalue Bytes::Value () {\n\n\t\treturn alloc_null ();\n\n\t}\n\n\n\tvalue Bytes::Value (value bytes) {\n\n\t\tif (val_is_null (bytes) || !b) {\n\n\t\t\treturn alloc_null ();\n\n\t\t} else {\n\n\t\t\talloc_field (bytes, id_length, alloc_int (length));\n\n\t\t\tif (useBuffer) {\n\n\t\t\t\tvalue _buffer = val_field (bytes, id_b);\n\n\t\t\t\tif (val_is_null (_buffer) || (char*)b != buffer_data (val_to_buffer (_buffer))) {\n\n\t\t\t\t\tbuffer bufferValue = alloc_buffer_len (length);\n\t\t\t\t\t_buffer = buffer_val (bufferValue);\n\t\t\t\t\tmemcpy ((unsigned char*)buffer_data (bufferValue), b, length);\n\t\t\t\t\talloc_field (bytes, id_b, _buffer);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvalue _string = val_field (bytes, id_b);\n\n\t\t\t\tif (val_is_null (_string) || (const char*)b != val_string (_string)) {\n\n\t\t\t\t\tvalue data = alloc_raw_string (length);\n\t\t\t\t\tmemcpy ((void*)val_string (data), b, length);\n\t\t\t\t\talloc_field (bytes, id_b, data);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmutex.Lock ();\n\t\t\thadValue[this] = true;\n\t\t\tmutex.Unlock ();\n\n\t\t\treturn bytes;\n\n\t\t}\n\n\t}\n\n\n}\n"
  },
  {
    "path": "project/src/utils/compress/LZMA.cpp",
    "content": "#include <utils/compress/LZMA.h>\n#include \"LzmaEnc.h\"\n#include \"LzmaDec.h\"\n\n\nnamespace lime {\n\n\n\tinline void WRITE_LE8 (unsigned char *ptr, char value) { *ptr = value; }\n\tinline void WRITE_LE16 (unsigned char *ptr, short value) { WRITE_LE8 ((ptr) + 0, ((value) >> 0)); WRITE_LE8 ((ptr) + 1, ((value) >>  8)); }\n\tinline void WRITE_LE32 (unsigned char *ptr, int value) { WRITE_LE16 ((ptr) + 0, ((value) >> 0)); WRITE_LE16 ((ptr) + 2, ((value) >> 16)); }\n\tinline void WRITE_LE64 (unsigned char *ptr, Int64 value) { WRITE_LE32 ((ptr) + 0, ((value) >> 0)); WRITE_LE32 ((ptr) + 4, ((value) >> 32)); }\n\n\tinline unsigned char READ_LE8 (unsigned char *ptr) { return *ptr; }\n\tinline unsigned short READ_LE16 (unsigned char *ptr) { return ((unsigned short)READ_LE8 (ptr + 0) << 0) | ((unsigned short)READ_LE8 (ptr + 1) <<  8); }\n\tinline unsigned int READ_LE32 (unsigned char *ptr) { return ((unsigned int)READ_LE16 (ptr + 0) << 0) | ((unsigned int)READ_LE16 (ptr + 2) << 16); }\n\tinline UInt64 READ_LE64 (unsigned char *ptr) { return ((UInt64)READ_LE32 (ptr + 0) << 0) | ((UInt64)READ_LE32 (ptr + 4) << 32); }\n\n\n\textern \"C\" {\n\n\t\tSRes LZMA_progress (void *p, UInt64 inSize, UInt64 outSize) { return SZ_OK; }\n\t\tvoid *LZMA_alloc (void *p, size_t size) { return malloc (size); }\n\n\t\tvoid LZMA_free (void *p, void *address) {\n\n\t\t\tif (address == NULL) return;\n\t\t\tfree (address);\n\n\t\t}\n\n\t}\n\n\n\tvoid LZMA::Compress (Bytes* data, Bytes* result) {\n\n\t\tSizeT inputBufferSize = data->length;\n\t\tByte* inputBufferData = data->b;\n\n\t\tSizeT outputBufferSize = inputBufferSize + inputBufferSize / 5 + (1 << 16);\n\t\tByte* outputBufferData = (Byte *)malloc (outputBufferSize);\n\t\tSizeT propsSize = 100;\n\t\tByte* propsData = (Byte *)malloc (propsSize);\n\t\tInt64 uncompressedLength = inputBufferSize;\n\n\t\tCLzmaEncProps props = { 0 };\n\t\tLzmaEncProps_Init (&props);\n\t\tprops.dictSize = (1 << 20);\n\t\tprops.writeEndMark = 0;\n\t\tprops.numThreads = 1;\n\n\t\tICompressProgress progress = { LZMA_progress };\n\t\tISzAlloc allocSmall = { LZMA_alloc, LZMA_free };\n\t\tISzAlloc allocBig = { LZMA_alloc, LZMA_free };\n\n\t\tLzmaEncode (outputBufferData, &outputBufferSize, inputBufferData, inputBufferSize, &props, propsData, &propsSize, props.writeEndMark, &progress, &allocSmall, &allocBig);\n\n\t\tresult->Resize (outputBufferSize + propsSize + 8);\n\t\tByte* resultData = result->b;\n\n\t\tmemcpy (resultData, propsData, propsSize);\n\t\tWRITE_LE64 (resultData + propsSize, uncompressedLength);\n\t\tmemcpy (resultData + propsSize + 8, outputBufferData, outputBufferSize);\n\n\t\tfree (outputBufferData);\n\t\tfree (propsData);\n\n\t}\n\n\n\tvoid LZMA::Decompress (Bytes* data, Bytes* result) {\n\n\t\tSizeT inputBufferSize = data->length;\n\t\tByte* inputBufferData = data->b;\n\t\tInt64 uncompressedLength = -1;\n\n\t\tELzmaStatus status = LZMA_STATUS_NOT_SPECIFIED;\n\t\tISzAlloc alloc = { LZMA_alloc, LZMA_free };\n\t\tCLzmaProps props = { 0 };\n\n\t\tLzmaProps_Decode (&props, inputBufferData, LZMA_PROPS_SIZE);\n\t\tuncompressedLength = READ_LE64 (inputBufferData + LZMA_PROPS_SIZE);\n\n\t\tresult->Resize ((int)uncompressedLength);\n\n\t\tSizeT outputBufferSize = result->length;\n\t\tByte* outputBufferData = result->b;\n\n\t\tByte* _inputBufferData = inputBufferData + LZMA_PROPS_SIZE + sizeof (uncompressedLength);\n\t\tSizeT _inputBufferSize = inputBufferSize - LZMA_PROPS_SIZE - sizeof (uncompressedLength);\n\n\t\tLzmaDecode (outputBufferData, &outputBufferSize, _inputBufferData, &_inputBufferSize, inputBufferData, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &alloc);\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/utils/compress/Zlib.cpp",
    "content": "#include <utils/compress/Zlib.h>\n#include <zlib.h>\n\n\n#ifdef STATIC_LINK\nextern \"C\" int zlib_register_prims()\n{\n   static bool init = false;\n   if (init) return 0;\n   init = true;\n\n   return 0;\n}\n#endif\n\nnamespace lime {\n\n\n\tvoid Zlib::Compress (ZlibType type, Bytes* data, Bytes* result) {\n\n\t\tint windowBits = 15;\n\n\t\tswitch (type) {\n\n\t\t\tcase DEFLATE: windowBits = -15; break;\n\t\t\tcase GZIP: windowBits = 31; break;\n\t\t\tdefault: break;\n\n\t\t}\n\n\t\tz_stream* stream = (z_stream*)malloc (sizeof (z_stream));\n\t\tstream->zalloc = Z_NULL;\n\t\tstream->zfree = Z_NULL;\n\t\tstream->opaque = Z_NULL;\n\n\t\tint ret = 0;\n\n\t\tif ((ret = deflateInit2 (stream, Z_BEST_COMPRESSION, Z_DEFLATED, windowBits, 8, Z_DEFAULT_STRATEGY) != Z_OK)) {\n\n\t\t\t//val_throw (stream->msg);\n\t\t\tfree (stream);\n\t\t\treturn;\n\n\t\t}\n\n\t\tint bufferSize = deflateBound (stream, data->length);\n\t\tchar* buffer = (char*)malloc (bufferSize);\n\n\t\tstream->next_in = (Bytef*)data->b;\n\t\tstream->next_out = (Bytef*)buffer;\n\t\tstream->avail_in = data->length;\n\t\tstream->avail_out = bufferSize;\n\n\t\tif ((ret = deflate (stream, Z_FINISH)) < 0) {\n\n\t\t\t//if (stream && stream->msg) printf (\"%s\\n\", stream->msg);\n\t\t\t//val_throw (stream->msg);\n\t\t\tdeflateEnd (stream);\n\t\t\tfree (stream);\n\t\t\tfree (buffer);\n\t\t\treturn;\n\n\t\t}\n\n\t\tint size = bufferSize - stream->avail_out;\n\t\tresult->Resize (size);\n\t\tmemcpy (result->b, buffer, size);\n\t\tdeflateEnd (stream);\n\t\tfree (stream);\n\t\tfree (buffer);\n\n\t\treturn;\n\n\t}\n\n\n\tvoid Zlib::Decompress (ZlibType type, Bytes* data, Bytes* result) {\n\n\t\tint windowBits = 15;\n\n\t\tswitch (type) {\n\n\t\t\tcase DEFLATE: windowBits = -15; break;\n\t\t\tcase GZIP: windowBits = 31; break;\n\t\t\tdefault: break;\n\n\t\t}\n\n\t\tz_stream* stream = (z_stream*)malloc (sizeof (z_stream));\n\t\tstream->zalloc = Z_NULL;\n\t\tstream->zfree = Z_NULL;\n\t\tstream->opaque = Z_NULL;\n\n\t\tint ret = 0;\n\n\t\tif ((ret = inflateInit2 (stream, windowBits) != Z_OK)) {\n\n\t\t\t//val_throw (stream->msg);\n\t\t\tinflateEnd (stream);\n\t\t\tfree (stream);\n\t\t\treturn;\n\n\t\t}\n\n\t\tint chunkSize = 1 << 16;\n\t\tint readSize = 0;\n\t\tBytef* sourcePosition = data->b;\n\t\tint destSize = 0;\n\t\tint readTotal = 0;\n\n\t\tBytef* buffer = (Bytef*)malloc (chunkSize);\n\n\t\tstream->avail_in = data->length;\n\t\tstream->next_in = data->b;\n\n\t\tif (stream->avail_in > 0) {\n\n\t\t\tdo {\n\n\t\t\t\tstream->avail_out = chunkSize;\n\t\t\t\tstream->next_out = buffer;\n\n\t\t\t\tret = inflate (stream, Z_NO_FLUSH);\n\n\t\t\t\tif (ret == Z_STREAM_ERROR) {\n\n\t\t\t\t\tinflateEnd (stream);\n\t\t\t\t\tfree (stream);\n\t\t\t\t\tfree (buffer);\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tswitch (ret) {\n\n\t\t\t\t\tcase Z_NEED_DICT:\n\t\t\t\t\t\tret = Z_DATA_ERROR;\n\t\t\t\t\tcase Z_DATA_ERROR:\n\t\t\t\t\tcase Z_MEM_ERROR:\n\t\t\t\t\t\tinflateEnd (stream);\n\t\t\t\t\t\tfree (stream);\n\t\t\t\t\t\tfree (buffer);\n\t\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\treadSize = chunkSize - stream->avail_out;\n\t\t\t\treadTotal += readSize;\n\n\t\t\t\tresult->Resize (readTotal);\n\t\t\t\tmemcpy (result->b + readTotal - readSize, buffer, readSize);\n\n\t\t\t\tsourcePosition += readSize;\n\n\t\t\t} while (stream->avail_out == 0);\n\n\t\t}\n\n\t\tinflateEnd (stream);\n\t\tfree (stream);\n\t\tfree (buffer);\n\n\t\treturn;\n\n\t}\n\n\n}"
  },
  {
    "path": "project/src/vm/NekoVM.cpp",
    "content": "#include <vm/NekoVM.h>\n#include <stdio.h>\n#include <neko_vm.h>\n\n\nextern \"C\" { void std_main (); }\n\n\nnamespace lime {\n\n\n\tstatic void report( neko_vm *vm, value exc, int isexc ) {\n\t\tint i;\n\t\tbuffer b = alloc_buffer(NULL);\n\t\tvalue st = neko_exc_stack(vm);\n\t\tfor(i=0;i<val_array_size(st);i++) {\n\t\t\tvalue s = val_array_ptr(st)[i];\n\t\t\tbuffer_append(b,\"Called from \");\n\t\t\tif( val_is_null(s) )\n\t\t\t\tbuffer_append(b,\"a C function\");\n\t\t\telse if( val_is_string(s) ) {\n\t\t\t\tbuffer_append(b,val_string(s));\n\t\t\t\tbuffer_append(b,\" (no debug available)\");\n\t\t\t} else if( val_is_array(s) && val_array_size(s) == 2 && val_is_string(val_array_ptr(s)[0]) && val_is_int(val_array_ptr(s)[1]) ) {\n\t\t\t\tval_buffer(b,val_array_ptr(s)[0]);\n\t\t\t\tbuffer_append(b,\" line \");\n\t\t\t\tval_buffer(b,val_array_ptr(s)[1]);\n\t\t\t} else\n\t\t\t\tval_buffer(b,s);\n\t\t\tbuffer_append_char(b,'\\n');\n\t\t}\n\t\tif( isexc )\n\t\t\tbuffer_append(b,\"Uncaught exception - \");\n\t\tval_buffer(b,exc);\n\t#\tifdef NEKO_STANDALONE\n\t\tneko_standalone_error(val_string(buffer_to_string(b)));\n\t#\telse\n\t\tfprintf(stderr,\"%s\\n\",val_string(buffer_to_string(b)));\n\t#\tendif\n\t}\n\n\n\tvoid NekoVM::Execute (const char *modulePath) {\n\n\t\tneko_vm *vm;\n\n\t\tneko_global_init ();\n\t\tvm = neko_vm_alloc (NULL);\n\t\tneko_vm_select (vm);\n\n\t\tstd_main ();\n\n\t\tvalue mload = neko_default_loader(NULL, 0);\n\n\t\tvalue args2[] = { alloc_string(modulePath), mload };\n\t\tvalue exc = NULL;\n\n\t\tval_callEx(mload,val_field(mload,val_id(\"loadmodule\")),args2,2,&exc);\n\n\t\tif( exc != NULL ) {\n\n\t\t\treport(vm,exc,1);\n\t\t\t//return 1;\n\t\t}\n\t\t//return 0;\n\n\t}\n\n\n}"
  },
  {
    "path": "release-checklist.md",
    "content": "# Lime Release Checklist\n\n- Add release notes to _CHANGELOG.md_\n\t- Compare to previous tag on GitHub:\n\t\t`https://github.com/openfl/lime/compare/a.b.c...develop`\n\t- Compare to previous tag in terminal:\n\t\t```sh\n\t\tgit log a.b.c...develop --oneline\n\t\t```\n\t- Sometimes, commits from previous releases show up, but most should be correct\n- Update release note in _haxelib.json_\n- Update version in _haxelib.json_ (may be updated already)\n- Update release date in _CHANGELOG.md_\n- Tag release and push\n\t```sh\n\tgit tag -s x.y.z -m \"version x.y.z\"\n\tgit push origin x.y.z\n\t```\n- Download _lime-haxelib_ and _lime-docs_ artifacts for tag from GitHub Actions\n- Submit _.zip_ file to Haxelib with following command:\n\t```sh\n\thaxelib submit lime-haxelib.zip\n\t```\n\t- Lime releases are sometimes too large for Haxelib. If required, unzip and rezip with higher compresssion\n\t\t- First, unzip _lime-haxelib.zip_\n\t\t- Then, zip with highest compresssion (command for macOS terminal below):\n\t\t\t```sh\n\t\t\tcd lime-haxelib/\n\t\t\tzip -r path/to/new/lime-haxelib.zip . -9\n\t\t\t```\n- Create new release for tag on GitHub\n\t- Upload _lime-haxelib.zip_ and _lime-docs.zip_\n\t- Link to _CHANGELOG.md_ from tag and to _https://community.openfl.org_ announcement thread)\n\t\t- _CHANGELOG.md_ tag URL format: `https://github.com/openfl/lime/blob/x.y.z/CHANGELOG.md`\n\t\t- It's okay to skip link to announcement at first, and edit the release to add it later\n- Deploy API reference by updating Git ref in _.github/workflows/deploy.yml_ in _openfl/lime.openfl.org_ repo\n\t```yaml\n    - uses: actions/checkout@v4\n      with:\n        repository: openfl/lime\n        path: _lime-git\n        ref: x.y.z\n\t```\n- Make announcement on _https://community.openfl.org_ in _Announcements_ category\n\t- For feature releases, it's good to write a summary of noteworthy new features\n\t- For bugfix releases, intro can be short\n\t- Include full list of changes from _CHANGELOG.md_\n\t- If also releasing OpenFL at the same time, announcement thread should be combined\n\t- After posting, go back and add link to thread GitHub release description, if needed"
  },
  {
    "path": "src/cs/ndll/NDLLFunction.hx",
    "content": "package cs.ndll;\n\nextern class NDLLFunction\n{\n\tstatic var Initialized(get, never):Bool;\n\tstatic function Initialize(arrayType:Class<Dynamic>, reflectType:Class<Dynamic>, functionType:Class<Dynamic>, hxObjectype:Class<Dynamic>):Void;\n\tstatic function Load(name:String, func:String, numArgs:Int):Dynamic;\n\tfunction CallMult(args:Dynamic):Dynamic;\n\tfunction Call0():Dynamic;\n\tfunction Call1(arg1:Dynamic):Dynamic;\n\tfunction Call2(arg1:Dynamic, arg2:Dynamic):Dynamic;\n\tfunction Call3(arg1:Dynamic, arg2:Dynamic, arg3:Dynamic):Dynamic;\n\tfunction Call4(arg1:Dynamic, arg2:Dynamic, arg3:Dynamic, arg4:Dynamic):Dynamic;\n\tfunction Call5(arg1:Dynamic, arg2:Dynamic, arg3:Dynamic, arg4:Dynamic, arg5:Dynamic):Dynamic;\n}\n"
  },
  {
    "path": "src/haxe/Timer.hx",
    "content": "package haxe;\n\n#if (!lime_cffi || macro)\n// Original haxe.Timer class\n\n/*\n * Copyright (C)2005-2018 Haxe Foundation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n/**\n\tThe Timer class allows you to create asynchronous timers on platforms that\n\tsupport events.\n\n\tThe intended usage is to create an instance of the Timer class with a given\n\tinterval, set its run() method to a custom function to be invoked and\n\teventually call stop() to stop the Timer.\n\n\tNote that a running Timer may or may not prevent the program to exit\n\tautomatically when main() returns.\n\n\tIt is also possible to extend this class and override its run() method in\n\tthe child class.\n**/\nclass Timer\n{\n\t#if (flash || js)\n\tprivate var id:Null<Int>;\n\t#elseif java\n\tprivate var timer:java.util.Timer;\n\tprivate var task:java.util.TimerTask;\n\t#elseif (haxe_ver >= \"3.4.0\")\n\tprivate var event:MainLoop.MainEvent;\n\t#end\n\n\t/**\n\t\tCreates a new timer that will run every `time_ms` milliseconds.\n\n\t\tAfter creating the Timer instance, it calls `this.run` repeatedly,\n\t\twith delays of `time_ms` milliseconds, until `this.stop` is called.\n\n\t\tThe first invocation occurs after `time_ms` milliseconds, not\n\t\timmediately.\n\n\t\tThe accuracy of this may be platform-dependent.\n\t**/\n\tpublic function new(time_ms:Int)\n\t{\n\t\t#if flash\n\t\tvar me = this;\n\t\tid = untyped __global__[\"flash.utils.setInterval\"](function()\n\t\t{\n\t\t\tme.run();\n\t\t}, time_ms);\n\t\t#elseif js\n\t\tvar me = this;\n\t\tid = untyped setInterval(function() me.run(), time_ms);\n\t\t#elseif java\n\t\ttimer = new java.util.Timer();\n\t\ttimer.scheduleAtFixedRate(task = new TimerTask(this), haxe.Int64.ofInt(time_ms), haxe.Int64.ofInt(time_ms));\n\t\t#elseif (haxe_ver >= \"3.4.0\")\n\t\tvar dt = time_ms / 1000;\n\t\tevent = MainLoop.add(function()\n\t\t{\n\t\t\t@:privateAccess event.nextRun += dt;\n\t\t\trun();\n\t\t});\n\t\tevent.delay(dt);\n\t\t#end\n\t}\n\n\t/**\n\t\tStops `this` Timer.\n\n\t\tAfter calling this method, no additional invocations of `this.run`\n\t\twill occur.\n\n\t\tIt is not possible to restart `this` Timer once stopped.\n\t**/\n\tpublic function stop()\n\t{\n\t\t#if (flash || js)\n\t\tif (id == null) return;\n\t\t#if flash\n\t\tuntyped __global__[\"flash.utils.clearInterval\"](id);\n\t\t#elseif js\n\t\tuntyped clearInterval(id);\n\t\t#end\n\t\tid = null;\n\t\t#elseif java\n\t\tif (timer != null)\n\t\t{\n\t\t\ttimer.cancel();\n\t\t\ttimer = null;\n\t\t}\n\t\ttask = null;\n\t\t#elseif (haxe_ver >= \"3.4.0\")\n\t\tif (event != null)\n\t\t{\n\t\t\tevent.stop();\n\t\t\tevent = null;\n\t\t}\n\t\t#end\n\t}\n\n\t/**\n\t\tThis method is invoked repeatedly on `this` Timer.\n\n\t\tIt can be overridden in a subclass, or rebound directly to a custom\n\t\tfunction:\n\t\t\tvar timer = new haxe.Timer(1000); // 1000ms delay\n\t\t\ttimer.run = function() { ... }\n\n\t\tOnce bound, it can still be rebound to different functions until `this`\n\t\tTimer is stopped through a call to `this.stop`.\n\t**/\n\tpublic dynamic function run() {}\n\n\t/**\n\t\tInvokes `f` after `time_ms` milliseconds.\n\n\t\tThis is a convenience function for creating a new Timer instance with\n\t\t`time_ms` as argument, binding its run() method to `f` and then stopping\n\t\t`this` Timer upon the first invocation.\n\n\t\tIf `f` is null, the result is unspecified.\n\t**/\n\tpublic static function delay(f:Void->Void, time_ms:Int)\n\t{\n\t\tvar t = new haxe.Timer(time_ms);\n\t\tt.run = function()\n\t\t{\n\t\t\tt.stop();\n\t\t\tf();\n\t\t};\n\t\treturn t;\n\t}\n\n\t/**\n\t\tMeasures the time it takes to execute `f`, in seconds with fractions.\n\n\t\tThis is a convenience function for calculating the difference between\n\t\tTimer.stamp() before and after the invocation of `f`.\n\n\t\tThe difference is passed as argument to Log.trace(), with \"s\" appended\n\t\tto denote the unit. The optional `pos` argument is passed through.\n\n\t\tIf `f` is null, the result is unspecified.\n\t**/\n\tpublic static function measure<T>(f:Void->T, ?pos:PosInfos):T\n\t{\n\t\tvar t0 = stamp();\n\t\tvar r = f();\n\t\tLog.trace((stamp() - t0) + \"s\", pos);\n\t\treturn r;\n\t}\n\n\t/**\n\t\tReturns a timestamp, in seconds with fractions.\n\n\t\tThe value itself might differ depending on platforms, only differences\n\t\tbetween two values make sense.\n\t**/\n\tpublic static inline function stamp():Float\n\t{\n\t\t#if flash\n\t\treturn flash.Lib.getTimer() / 1000;\n\t\t#elseif (neko || php)\n\t\treturn Sys.time();\n\t\t#elseif js\n\t\treturn Date.now().getTime() / 1000;\n\t\t#elseif cpp\n\t\treturn untyped __global__.__time_stamp();\n\t\t#elseif python\n\t\treturn Sys.cpuTime();\n\t\t#elseif sys\n\t\treturn Sys.time();\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n\n#if java\n@:nativeGen\nprivate class TimerTask extends java.util.TimerTask\n{\n\tvar timer:Timer;\n\n\tpublic function new(timer:Timer):Void\n\t{\n\t\tsuper();\n\t\tthis.timer = timer;\n\t}\n\n\t@:overload override public function run():Void\n\t{\n\t\ttimer.run();\n\t}\n}\n#end\n#else\nimport lime.system.System;\n\nclass Timer\n{\n\tprivate static var sRunningTimers:Array<Timer> = [];\n\n\tprivate var mTime:Float;\n\tprivate var mFireAt:Float;\n\tprivate var mRunning:Bool;\n\n\tpublic function new(time:Float)\n\t{\n\t\tmTime = time;\n\t\tsRunningTimers.push(this);\n\t\tmFireAt = getMS() + mTime;\n\t\tmRunning = true;\n\t}\n\n\tpublic static function delay(f:Void->Void, time:Int)\n\t{\n\t\tvar t = new Timer(time);\n\n\t\tt.run = function()\n\t\t{\n\t\t\tt.stop();\n\t\t\tf();\n\t\t};\n\n\t\treturn t;\n\t}\n\n\tprivate static function getMS():Float\n\t{\n\t\treturn System.getTimer();\n\t}\n\n\tpublic static function measure<T>(f:Void->T, ?pos:PosInfos):T\n\t{\n\t\tvar t0 = stamp();\n\t\tvar r = f();\n\t\tLog.trace((stamp() - t0) + \"s\", pos);\n\t\treturn r;\n\t}\n\n\tdynamic public function run() {}\n\n\tpublic static inline function stamp():Float\n\t{\n\t\tvar timer = System.getTimer();\n\t\treturn (timer > 0 ? timer / 1000 : 0);\n\t}\n\n\tpublic function stop():Void\n\t{\n\t\tmRunning = false;\n\t}\n\n\t@:noCompletion private function __check(inTime:Float)\n\t{\n\t\tif (inTime >= mFireAt)\n\t\t{\n\t\t\tmFireAt += mTime;\n\t\t\trun();\n\t\t}\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/backend/air/AIRApplication.hx",
    "content": "package lime._internal.backend.air;\n\nimport flash.desktop.NativeApplication;\nimport flash.desktop.SystemIdleMode;\nimport flash.events.Event;\nimport lime._internal.backend.flash.FlashApplication;\nimport lime.app.Application;\nimport lime.system.Orientation;\nimport lime.system.System;\n\nclass AIRApplication extends FlashApplication\n{\n\tpublic function new(parent:Application):Void\n\t{\n\t\tsuper(parent);\n\n\t\tNativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;\n\t\tNativeApplication.nativeApplication.addEventListener(Event.EXITING, handleExitEvent);\n\t}\n\n\tprivate function handleExitEvent(event:Event):Void\n\t{\n\t\tSystem.exit(0);\n\n\t\tif (Application.current != null && Application.current.onExit.canceled)\n\t\t{\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\t}\n\n\tpublic override function exit():Void\n\t{\n\t\t// TODO: Remove event handlers?\n\t}\n\n\toverride public function getDeviceOrientation():Orientation\n\t{\n\t\tswitch (parent.window.stage.deviceOrientation)\n\t\t{\n\t\t\tcase DEFAULT:\n\t\t\t\treturn PORTRAIT;\n\t\t\tcase UPSIDE_DOWN:\n\t\t\t\treturn PORTRAIT_FLIPPED;\n\t\t\tcase ROTATED_LEFT:\n\t\t\t\treturn LANDSCAPE;\n\t\t\tcase ROTATED_RIGHT:\n\t\t\t\treturn LANDSCAPE_FLIPPED;\n\t\t\tdefault:\n\t\t\t\treturn UNKNOWN;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/air/AIRWindow.hx",
    "content": "package lime._internal.backend.air;\n\nimport flash.desktop.NotificationType;\nimport flash.display.NativeWindow;\nimport flash.display.NativeWindowInitOptions;\nimport flash.display.NativeWindowRenderMode;\nimport flash.display.NativeWindowSystemChrome;\nimport flash.geom.Point;\nimport flash.events.Event;\nimport flash.events.NativeWindowBoundsEvent;\nimport flash.events.StageOrientationEvent;\nimport flash.html.HTMLLoader;\nimport flash.Lib;\nimport lime._internal.backend.flash.FlashApplication;\nimport lime._internal.backend.flash.FlashWindow;\nimport lime.app.Application;\nimport lime.system.Orientation;\nimport lime.ui.Window;\n\n@:access(lime._internal.backend.flash.FlashApplication)\n@:access(lime.ui.Window)\nclass AIRWindow extends FlashWindow\n{\n\tprivate var closing:Bool;\n\tprivate var nativeWindow:NativeWindow;\n\n\tpublic function new(parent:Window)\n\t{\n\t\tsuper(parent);\n\t}\n\n\tpublic override function alert(message:String, title:String):Void\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tnativeWindow.notifyUser(NotificationType.INFORMATIONAL);\n\n\t\t\tif (message != null)\n\t\t\t{\n\t\t\t\tvar htmlLoader = new HTMLLoader();\n\t\t\t\thtmlLoader.loadString(\"<!DOCTYPE html><html lang='en'><head><meta charset='utf-8'><title></title><script></script></head><body></body></html>\");\n\t\t\t\thtmlLoader.window.alert(message);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function close():Void\n\t{\n\t\tif (!closing)\n\t\t{\n\t\t\tclosing = true;\n\t\t\tparent.onClose.dispatch();\n\n\t\t\tif (!parent.onClose.canceled)\n\t\t\t{\n\t\t\t\tnativeWindow.close();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tclosing = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate override function create():Void\n\t{\n\t\tvar title = (parent.__title != null && parent.__title != \"\") ? parent.__title : \"Lime Application\";\n\t\tvar attributes = parent.__attributes;\n\n\t\tvar alwaysOnTop = false;\n\t\tvar borderless = false;\n\t\tvar fullscreen = false;\n\t\tvar hardware = false;\n\t\tvar hidden = false;\n\t\tvar maximized = false;\n\t\tvar minimized = false;\n\t\tvar resizable = false;\n\n\t\tvar frameRate = 60.0;\n\t\tvar width = 0;\n\t\tvar height = 0;\n\n\t\tif (Reflect.hasField(attributes, \"alwaysOnTop\") && attributes.alwaysOnTop) alwaysOnTop = true;\n\t\tif (Reflect.hasField(attributes, \"borderless\") && attributes.borderless) borderless = true;\n\t\tif (Reflect.hasField(attributes, \"fullscreen\") && attributes.fullscreen) fullscreen = true;\n\t\tif (Reflect.hasField(attributes, \"context\")\n\t\t\t&& Reflect.hasField(attributes.context, \"hardware\")\n\t\t\t&& attributes.context.hardware) hardware = true;\n\t\tif (Reflect.hasField(attributes, \"hidden\") && attributes.hidden) hidden = true;\n\t\tif (Reflect.hasField(attributes, \"maximized\") && attributes.maximized) maximized = true;\n\t\tif (Reflect.hasField(attributes, \"minimized\") && attributes.minimized) minimized = true;\n\t\tif (Reflect.hasField(attributes, \"resizable\") && attributes.resizable) resizable = true;\n\n\t\tif (Reflect.hasField(attributes, \"frameRate\")) frameRate = attributes.frameRate;\n\t\tif (Reflect.hasField(attributes, \"width\")) width = attributes.width;\n\t\tif (Reflect.hasField(attributes, \"height\")) height = attributes.height;\n\n\t\tif (FlashApplication.createFirstWindow)\n\t\t{\n\t\t\tnativeWindow = Lib.current.stage.nativeWindow;\n\n\t\t\t#if munit\n\t\t\thidden = true;\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar options = new NativeWindowInitOptions();\n\t\t\toptions.systemChrome = borderless ? NativeWindowSystemChrome.NONE : NativeWindowSystemChrome.STANDARD;\n\t\t\toptions.renderMode = hardware ? NativeWindowRenderMode.DIRECT : NativeWindowRenderMode.CPU;\n\t\t\toptions.transparent = false;\n\t\t\toptions.maximizable = maximized;\n\t\t\toptions.minimizable = minimized;\n\t\t\toptions.resizable = resizable;\n\n\t\t\tnativeWindow = new NativeWindow(options);\n\t\t\tnativeWindow.stage.frameRate = frameRate;\n\n\t\t\tif (width > 0) nativeWindow.width = width;\n\t\t\tif (height > 0) nativeWindow.height = height;\n\t\t}\n\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tparent.stage = nativeWindow.stage;\n\n\t\t\tnativeWindow.addEventListener(Event.CLOSING, handleNativeWindowEvent);\n\t\t\tnativeWindow.addEventListener(Event.CLOSE, handleNativeWindowEvent);\n\t\t\t// nativeWindow.addEventListener (Event.RESIZE, handleWindowEvent);\n\t\t\tnativeWindow.addEventListener(NativeWindowBoundsEvent.MOVE, handleNativeWindowEvent);\n\n\t\t\tif (hidden)\n\t\t\t{\n\t\t\t\tnativeWindow.visible = false;\n\t\t\t}\n\n\t\t\t// nativeWindow.activate ();\n\t\t\tnativeWindow.alwaysInFront = alwaysOnTop;\n\t\t\tnativeWindow.title = title;\n\n\t\t\tif (maximized)\n\t\t\t{\n\t\t\t\tnativeWindow.maximize();\n\t\t\t}\n\t\t\telse if (minimized)\n\t\t\t{\n\t\t\t\tnativeWindow.minimize();\n\t\t\t}\n\t\t}\n\n\t\tif (fullscreen)\n\t\t{\n\t\t\tsetFullscreen(true);\n\t\t}\n\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tparent.__width = Std.int(nativeWindow.width);\n\t\t\tparent.__height = Std.int(nativeWindow.height);\n\t\t\tparent.__x = Math.round(nativeWindow.x);\n\t\t\tparent.__y = Math.round(nativeWindow.y);\n\t\t\tparent.stage = nativeWindow.stage;\n\t\t}\n\n\t\tsuper.create();\n\n\t\tif (hardware)\n\t\t{\n\t\t\tparent.context.attributes.hardware = true;\n\t\t\tparent.context.attributes.depth = true;\n\t\t\tparent.context.attributes.stencil = true;\n\t\t}\n\n\t\tparent.stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, handleStageOrientationChangeEvent);\n\t}\n\n\tpublic override function focus():Void\n\t{\n\t\tif (nativeWindow != null && nativeWindow.visible)\n\t\t{\n\t\t\tnativeWindow.activate();\n\t\t}\n\t}\n\n\tprivate function handleStageOrientationChangeEvent(event:StageOrientationEvent):Void\n\t{\n\t\tif (parent.application.window == parent)\n\t\t{\n\t\t\tvar newDeviceOrientation:Orientation = UNKNOWN;\n\t\t\tswitch (parent.stage.deviceOrientation) {\n\t\t\t\tcase DEFAULT:\n\t\t\t\t\tnewDeviceOrientation = PORTRAIT;\n\t\t\t\tcase UPSIDE_DOWN:\n\t\t\t\t\tnewDeviceOrientation = PORTRAIT_FLIPPED;\n\t\t\t\tcase ROTATED_LEFT:\n\t\t\t\t\tnewDeviceOrientation = LANDSCAPE;\n\t\t\t\tcase ROTATED_RIGHT:\n\t\t\t\t\tnewDeviceOrientation = LANDSCAPE_FLIPPED;\n\t\t\t\tdefault:\n\t\t\t\t\tnewDeviceOrientation = UNKNOWN;\n\t\t\t}\n\t\t\tparent.application.onDeviceOrientationChange.dispatch(newDeviceOrientation);\n\t\t}\n\t\tvar newDisplayOrientation:Orientation = UNKNOWN;\n\t\tswitch (event.afterOrientation) {\n\t\t\tcase DEFAULT:\n\t\t\t\tnewDisplayOrientation = PORTRAIT;\n\t\t\tcase UPSIDE_DOWN:\n\t\t\t\tnewDisplayOrientation = PORTRAIT_FLIPPED;\n\t\t\tcase ROTATED_LEFT:\n\t\t\t\tnewDisplayOrientation = LANDSCAPE_FLIPPED;\n\t\t\tcase ROTATED_RIGHT:\n\t\t\t\tnewDisplayOrientation = LANDSCAPE;\n\t\t\tdefault:\n\t\t\t\tnewDisplayOrientation = UNKNOWN;\n\t\t}\n\t\tparent.application.onDisplayOrientationChange.dispatch(parent.display.id, newDisplayOrientation);\n\t}\n\n\tprivate function handleNativeWindowEvent(event:Event):Void\n\t{\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase Event.CLOSING:\n\t\t\t\tparent.close();\n\n\t\t\t\tif (parent.onClose.canceled)\n\t\t\t\t{\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t}\n\n\t\t\tcase Event.CLOSE:\n\t\t\t\tclosing = true;\n\t\t\t\tparent.onClose.dispatch();\n\n\t\t\t// case Event.RESIZE:\n\n\t\t\t// \t// TODO: Should this be the inner (stageWidth) or outer (nativeWindow width) size?\n\n\t\t\t// \tparent.__width = parent.stage.stageWidth;\n\t\t\t// \tparent.__height = parent.stage.stageHeight;\n\n\t\t\t// \t// parent.__width = nativeWindow.width;\n\t\t\t// \t// parent.__height = nativeWindow.height;\n\n\t\t\t// \tparent.onResize.dispatch (parent.__width, parent.__height);\n\n\t\t\tcase NativeWindowBoundsEvent.MOVE:\n\t\t\t\tparent.onMove.dispatch(nativeWindow.x, nativeWindow.y);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tpublic override function move(x:Int, y:Int):Void\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tnativeWindow.x = x;\n\t\t\tnativeWindow.y = y;\n\t\t}\n\t}\n\n\tpublic override function resize(width:Int, height:Int):Void\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tnativeWindow.width = width;\n\t\t\tnativeWindow.height = height;\n\t\t}\n\t}\n\n\tpublic override function setMinSize(width:Int, height:Int):Void\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tnativeWindow.minSize = new Point(width, height);\n\t\t}\n\t}\n\n\tpublic override function setMaxSize(width:Int, height:Int):Void\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tnativeWindow.maxSize = new Point(width, height);\n\t\t}\n\t}\n\n\tpublic override function setMaximized(value:Bool):Bool\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\tnativeWindow.maximize();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnativeWindow.restore();\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic override function setMinimized(value:Bool):Bool\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\tnativeWindow.minimize();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnativeWindow.restore();\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic override function setTitle(value:String):String\n\t{\n\t\tif (nativeWindow != null)\n\t\t{\n\t\t\tnativeWindow.title = value;\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/flash/FlashApplication.hx",
    "content": "package lime._internal.backend.flash;\n\nimport flash.ui.MultitouchInputMode;\nimport flash.ui.Multitouch;\nimport lime.app.Application;\nimport lime.media.AudioManager;\nimport lime.system.Orientation;\nimport lime.ui.Window;\n\n@:access(lime.app.Application)\nclass FlashApplication\n{\n\tprivate static var createFirstWindow:Bool;\n\n\tprivate var parent:Application;\n\tprivate var requestedWindow:Bool;\n\n\tpublic function new(parent:Application):Void\n\t{\n\t\tthis.parent = parent;\n\n\t\tAudioManager.init();\n\n\t\tcreateFirstWindow = true;\n\t\t// Initial window is already created\n\t\tparent.createWindow({});\n\t\tcreateFirstWindow = false;\n\t}\n\n\tpublic function exec():Int\n\t{\n\t\tMultitouch.inputMode = MultitouchInputMode.TOUCH_POINT;\n\n\t\treturn 0;\n\t}\n\n\tpublic function exit():Void {}\n\n\tpublic function getDeviceOrientation():Orientation\n\t{\n\t\treturn UNKNOWN;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/flash/FlashAudioSource.hx",
    "content": "package lime._internal.backend.flash;\n\nimport flash.media.SoundChannel;\nimport lime.math.Vector4;\nimport lime.media.AudioSource;\n\n@:access(lime.media.AudioBuffer)\nclass FlashAudioSource\n{\n\tprivate var channel:SoundChannel;\n\tprivate var completed:Bool;\n\tprivate var length:Null<Int>;\n\tprivate var loops:Int;\n\tprivate var parent:AudioSource;\n\tprivate var pauseTime:Int;\n\tprivate var playing:Bool;\n\tprivate var position:Vector4;\n\n\tpublic function new(parent:AudioSource)\n\t{\n\t\tthis.parent = parent;\n\n\t\tposition = new Vector4();\n\t}\n\n\tpublic function dispose():Void {}\n\n\tpublic function init():Void {}\n\n\tpublic function play():Void\n\t{\n\t\tif (channel != null) channel.stop();\n\t\tchannel = parent.buffer.__srcSound.play(pauseTime / 1000 + parent.offset, loops + 1);\n\t}\n\n\tpublic function pause():Void\n\t{\n\t\tif (channel != null)\n\t\t{\n\t\t\tpauseTime = Std.int(channel.position * 1000);\n\t\t\tchannel.stop();\n\t\t}\n\t}\n\n\tpublic function stop():Void\n\t{\n\t\tpauseTime = 0;\n\n\t\tif (channel != null)\n\t\t{\n\t\t\tchannel.stop();\n\t\t}\n\t}\n\n\t// Get & Set Methods\n\tpublic function getCurrentTime():Int\n\t{\n\t\tif (channel != null)\n\t\t{\n\t\t\treturn Std.int(channel.position) - parent.offset;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tpublic function setCurrentTime(value:Int):Int\n\t{\n\t\tpauseTime = value;\n\n\t\tif (channel != null && value != getCurrentTime())\n\t\t{\n\t\t\tpauseTime = value;\n\t\t\tchannel.stop();\n\t\t\tplay();\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function getGain():Float\n\t{\n\t\treturn channel.soundTransform.volume;\n\t}\n\n\tpublic function setGain(value:Float):Float\n\t{\n\t\tvar soundTransform = channel.soundTransform;\n\t\tsoundTransform.volume = value;\n\t\tchannel.soundTransform = soundTransform;\n\t\treturn value;\n\t}\n\n\tpublic function getLength():Int\n\t{\n\t\tif (length != null)\n\t\t{\n\t\t\treturn length;\n\t\t}\n\n\t\treturn Std.int(parent.buffer.__srcSound.length) - parent.offset;\n\t}\n\n\tpublic function setLength(value:Int):Int\n\t{\n\t\treturn length = value;\n\t}\n\n\tpublic function getLoops():Int\n\t{\n\t\treturn loops;\n\t}\n\n\tpublic function setLoops(value:Int):Int\n\t{\n\t\treturn loops = value;\n\t}\n\n\tpublic function getPitch():Float\n\t{\n\t\tlime.utils.Log.verbose(\"Pitch is not supported in Flash.\");\n\t\treturn 1;\n\t}\n\n\tpublic function setPitch(value:Float):Float\n\t{\n\t\treturn getPitch();\n\t}\n\n\tpublic function getPosition():Vector4\n\t{\n\t\tposition.x = channel.soundTransform.pan;\n\n\t\treturn position;\n\t}\n\n\tpublic function setPosition(value:Vector4):Vector4\n\t{\n\t\tposition.x = value.x;\n\t\tposition.y = value.y;\n\t\tposition.z = value.z;\n\t\tposition.w = value.w;\n\n\t\tvar soundTransform = channel.soundTransform;\n\t\tsoundTransform.pan = position.x;\n\t\tchannel.soundTransform = soundTransform;\n\n\t\treturn position;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/flash/FlashHTTPRequest.hx",
    "content": "package lime._internal.backend.flash;\n\nimport flash.events.Event;\nimport flash.events.HTTPStatusEvent;\nimport flash.events.IOErrorEvent;\nimport flash.events.ProgressEvent;\nimport flash.events.SecurityErrorEvent;\nimport flash.net.URLLoader;\nimport flash.net.URLLoaderDataFormat;\nimport flash.net.URLRequest;\nimport flash.net.URLRequestHeader;\nimport flash.net.URLRequestMethod;\nimport flash.utils.ByteArray;\nimport haxe.io.Bytes;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.net.HTTPRequest;\n\nclass FlashHTTPRequest\n{\n\tprivate var parent:_IHTTPRequest;\n\tprivate var urlLoader:URLLoader;\n\tprivate var urlRequest:URLRequest;\n\n\tpublic function new() {}\n\n\tpublic function cancel():Void\n\t{\n\t\tif (urlLoader != null)\n\t\t{\n\t\t\turlLoader.close();\n\t\t}\n\t}\n\n\tprivate function construct(binary:Bool):Void\n\t{\n\t\turlLoader = new URLLoader();\n\t\turlRequest = new URLRequest();\n\n\t\tvar query = \"\";\n\t\tvar uri = parent.uri;\n\n\t\tif (parent.data != null)\n\t\t{\n\t\t\turlRequest.data = parent.data.getData();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (key in parent.formData.keys())\n\t\t\t{\n\t\t\t\tif (query.length > 0) query += \"&\";\n\t\t\t\tquery += StringTools.urlEncode(key) + \"=\" + StringTools.urlEncode(Std.string(parent.formData.get(key)));\n\t\t\t}\n\n\t\t\tif (query != \"\" && parent.method == GET)\n\t\t\t{\n\t\t\t\tif (uri.indexOf(\"?\") > -1)\n\t\t\t\t{\n\t\t\t\t\turi += \"&\" + query;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\turi += \"?\" + query;\n\t\t\t\t}\n\n\t\t\t\tquery = \"\";\n\t\t\t}\n\t\t}\n\n\t\tif (binary)\n\t\t{\n\t\t\turlLoader.dataFormat = URLLoaderDataFormat.BINARY;\n\t\t}\n\n\t\turlRequest.url = uri;\n\t\turlRequest.contentType = parent.contentType;\n\n\t\t// urlRequest.userAgent = parent.userAgent;\n\t\t// urlRequest.followRedirects = parent.followRedirects;\n\n\t\turlRequest.method = switch (parent.method)\n\t\t{\n\t\t\tcase POST: URLRequestMethod.POST;\n\t\t\tdefault: URLRequestMethod.GET;\n\t\t}\n\n\t\tfor (header in parent.headers)\n\t\t{\n\t\t\turlRequest.requestHeaders.push(new URLRequestHeader(header.name, header.value));\n\t\t}\n\t}\n\n\tpublic function init(parent:_IHTTPRequest):Void\n\t{\n\t\tthis.parent = parent;\n\t}\n\n\tpublic function loadData(uri:String):Future<Bytes>\n\t{\n\t\tvar promise = new Promise<Bytes>();\n\t\tconstruct(true);\n\n\t\turlLoader.addEventListener(ProgressEvent.PROGRESS, function(event)\n\t\t{\n\t\t\tpromise.progress(Std.int(event.bytesLoaded), Std.int(event.bytesTotal));\n\t\t});\n\n\t\turlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, function(event)\n\t\t{\n\t\t\tparent.responseStatus = event.status;\n\n\t\t\tif (parent.enableResponseHeaders)\n\t\t\t{\n\t\t\t\tparent.responseHeaders = cast event.responseHeaders;\n\t\t\t}\n\t\t});\n\n\t\turlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(event)\n\t\t{\n\t\t\tvar bytes = Bytes.ofData(cast(urlLoader.data, ByteArray));\n\t\t\tpromise.error(new _HTTPRequestErrorResponse(event.errorID, bytes));\n\t\t});\n\n\t\turlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event)\n\t\t{\n\t\t\tpromise.error(new _HTTPRequestErrorResponse(403, null));\n\t\t});\n\n\t\turlLoader.addEventListener(Event.COMPLETE, function(event)\n\t\t{\n\t\t\tpromise.complete(Bytes.ofData(cast(urlLoader.data, ByteArray)));\n\t\t});\n\n\t\turlLoader.load(urlRequest);\n\t\treturn promise.future;\n\t}\n\n\tpublic function loadText(uri:String):Future<String>\n\t{\n\t\tvar promise = new Promise<String>();\n\t\tconstruct(false);\n\n\t\turlLoader.addEventListener(ProgressEvent.PROGRESS, function(event)\n\t\t{\n\t\t\tpromise.progress(Std.int(event.bytesLoaded), Std.int(event.bytesTotal));\n\t\t});\n\n\t\turlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, function(event)\n\t\t{\n\t\t\tparent.responseStatus = event.status;\n\n\t\t\tif (parent.enableResponseHeaders)\n\t\t\t{\n\t\t\t\tparent.responseHeaders = cast event.responseHeaders;\n\t\t\t}\n\t\t});\n\n\t\turlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(event)\n\t\t{\n\t\t\tvar responseData = cast(urlLoader.data, String);\n\t\t\tpromise.error(new _HTTPRequestErrorResponse(event.errorID, responseData));\n\t\t});\n\n\t\turlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event)\n\t\t{\n\t\t\tpromise.error(new _HTTPRequestErrorResponse(403, null));\n\t\t});\n\n\t\turlLoader.addEventListener(Event.COMPLETE, function(event)\n\t\t{\n\t\t\tpromise.complete(cast(urlLoader.data, String));\n\t\t});\n\n\t\turlLoader.load(urlRequest);\n\t\treturn promise.future;\n\t}\n}"
  },
  {
    "path": "src/lime/_internal/backend/flash/FlashWindow.hx",
    "content": "package lime._internal.backend.flash;\n\nimport flash.display.BitmapData;\nimport flash.display.Stage;\nimport flash.display.StageAlign;\nimport flash.display.StageScaleMode;\nimport flash.events.Event;\nimport flash.events.FocusEvent;\nimport flash.events.KeyboardEvent;\nimport flash.events.MouseEvent;\nimport flash.events.TouchEvent;\nimport flash.geom.Matrix;\nimport flash.system.Capabilities;\nimport flash.ui.Mouse;\nimport flash.ui.MouseCursor as FlashMouseCursor;\nimport flash.Lib;\nimport lime.app.Application;\nimport lime.graphics.Image;\nimport lime.graphics.RenderContext;\nimport lime.graphics.RenderContextAttributes;\nimport lime.math.Rectangle;\nimport lime.ui.KeyCode;\nimport lime.ui.KeyModifier;\nimport lime.ui.MouseButton;\nimport lime.ui.MouseCursor;\nimport lime.ui.MouseWheelMode;\nimport lime.ui.Touch;\nimport lime.system.Display;\nimport lime.system.DisplayMode;\nimport lime.system.System;\nimport lime.ui.Window;\n\n@:access(lime._internal.backend.flash.FlashApplication)\n@:access(lime.app.Application)\n@:access(lime.graphics.RenderContext)\n@:access(lime.ui.Window)\nclass FlashWindow\n{\n\tprivate static var windowID = 0;\n\n\tprivate var cacheMouseX:Float;\n\tprivate var cacheMouseY:Float;\n\tprivate var cacheTime:Int;\n\tprivate var currentTouches = new Map<Int, Touch>();\n\tprivate var cursor:MouseCursor;\n\tprivate var frameRate:Float;\n\tprivate var mouseLeft:Bool;\n\tprivate var parent:Window;\n\tprivate var textInputEnabled:Bool;\n\tprivate var textInputRect:Rectangle;\n\tprivate var unusedTouchesPool = new List<Touch>();\n\n\tpublic function new(parent:Window)\n\t{\n\t\tthis.parent = parent;\n\n\t\tcacheMouseX = 0;\n\t\tcacheMouseY = 0;\n\t\tcursor = DEFAULT;\n\n\t\tcreate();\n\t}\n\n\tpublic function alert(message:String, title:String):Void {}\n\n\tpublic function close():Void\n\t{\n\t\tparent.application.__removeWindow(parent);\n\t}\n\n\tprivate function convertKeyCode(keyCode:Int):KeyCode\n\t{\n\t\tif (keyCode >= 65 && keyCode <= 90)\n\t\t{\n\t\t\treturn keyCode + 32;\n\t\t}\n\n\t\tswitch (keyCode)\n\t\t{\n\t\t\tcase 16:\n\t\t\t\treturn KeyCode.LEFT_SHIFT;\n\t\t\tcase 17:\n\t\t\t\treturn KeyCode.LEFT_CTRL;\n\t\t\tcase 18:\n\t\t\t\treturn KeyCode.LEFT_ALT;\n\t\t\tcase 20:\n\t\t\t\treturn KeyCode.CAPS_LOCK;\n\t\t\tcase 33:\n\t\t\t\treturn KeyCode.PAGE_UP;\n\t\t\tcase 34:\n\t\t\t\treturn KeyCode.PAGE_DOWN;\n\t\t\tcase 35:\n\t\t\t\treturn KeyCode.END;\n\t\t\tcase 36:\n\t\t\t\treturn KeyCode.HOME;\n\t\t\tcase 37:\n\t\t\t\treturn KeyCode.LEFT;\n\t\t\tcase 38:\n\t\t\t\treturn KeyCode.UP;\n\t\t\tcase 39:\n\t\t\t\treturn KeyCode.RIGHT;\n\t\t\tcase 40:\n\t\t\t\treturn KeyCode.DOWN;\n\t\t\tcase 45:\n\t\t\t\treturn KeyCode.INSERT;\n\t\t\tcase 46:\n\t\t\t\treturn KeyCode.DELETE;\n\t\t\tcase 96:\n\t\t\t\treturn KeyCode.NUMPAD_0;\n\t\t\tcase 97:\n\t\t\t\treturn KeyCode.NUMPAD_1;\n\t\t\tcase 98:\n\t\t\t\treturn KeyCode.NUMPAD_2;\n\t\t\tcase 99:\n\t\t\t\treturn KeyCode.NUMPAD_3;\n\t\t\tcase 100:\n\t\t\t\treturn KeyCode.NUMPAD_4;\n\t\t\tcase 101:\n\t\t\t\treturn KeyCode.NUMPAD_5;\n\t\t\tcase 102:\n\t\t\t\treturn KeyCode.NUMPAD_6;\n\t\t\tcase 103:\n\t\t\t\treturn KeyCode.NUMPAD_7;\n\t\t\tcase 104:\n\t\t\t\treturn KeyCode.NUMPAD_8;\n\t\t\tcase 105:\n\t\t\t\treturn KeyCode.NUMPAD_9;\n\t\t\tcase 106:\n\t\t\t\treturn KeyCode.NUMPAD_MULTIPLY;\n\t\t\tcase 107:\n\t\t\t\treturn KeyCode.NUMPAD_PLUS;\n\t\t\tcase 108:\n\t\t\t\treturn KeyCode.NUMPAD_ENTER;\n\t\t\tcase 109:\n\t\t\t\treturn KeyCode.NUMPAD_MINUS;\n\t\t\tcase 110:\n\t\t\t\treturn KeyCode.NUMPAD_PERIOD;\n\t\t\tcase 111:\n\t\t\t\treturn KeyCode.NUMPAD_DIVIDE;\n\t\t\tcase 112:\n\t\t\t\treturn KeyCode.F1;\n\t\t\tcase 113:\n\t\t\t\treturn KeyCode.F2;\n\t\t\tcase 114:\n\t\t\t\treturn KeyCode.F3;\n\t\t\tcase 115:\n\t\t\t\treturn KeyCode.F4;\n\t\t\tcase 116:\n\t\t\t\treturn KeyCode.F5;\n\t\t\tcase 117:\n\t\t\t\treturn KeyCode.F6;\n\t\t\tcase 118:\n\t\t\t\treturn KeyCode.F7;\n\t\t\tcase 119:\n\t\t\t\treturn KeyCode.F8;\n\t\t\tcase 120:\n\t\t\t\treturn KeyCode.F9;\n\t\t\tcase 121:\n\t\t\t\treturn KeyCode.F10;\n\t\t\tcase 122:\n\t\t\t\treturn KeyCode.F11;\n\t\t\tcase 123:\n\t\t\t\treturn KeyCode.F12;\n\t\t\tcase 124:\n\t\t\t\treturn KeyCode.F13;\n\t\t\tcase 125:\n\t\t\t\treturn KeyCode.F14;\n\t\t\tcase 126:\n\t\t\t\treturn KeyCode.F15;\n\t\t\tcase 144:\n\t\t\t\treturn KeyCode.NUM_LOCK;\n\t\t\tcase 186:\n\t\t\t\treturn KeyCode.SEMICOLON;\n\t\t\tcase 187:\n\t\t\t\treturn KeyCode.EQUALS;\n\t\t\tcase 188:\n\t\t\t\treturn KeyCode.COMMA;\n\t\t\tcase 189:\n\t\t\t\treturn KeyCode.MINUS;\n\t\t\tcase 190:\n\t\t\t\treturn KeyCode.PERIOD;\n\t\t\tcase 191:\n\t\t\t\treturn KeyCode.SLASH;\n\t\t\tcase 192:\n\t\t\t\treturn KeyCode.GRAVE;\n\t\t\tcase 219:\n\t\t\t\treturn KeyCode.LEFT_BRACKET;\n\t\t\tcase 220:\n\t\t\t\treturn KeyCode.BACKSLASH;\n\t\t\tcase 221:\n\t\t\t\treturn KeyCode.RIGHT_BRACKET;\n\t\t\tcase 222:\n\t\t\t\treturn KeyCode.SINGLE_QUOTE;\n\t\t}\n\n\t\treturn keyCode;\n\t}\n\n\tprivate function create():Void\n\t{\n\t\tif (#if air true #else FlashApplication.createFirstWindow #end)\n\t\t{\n\t\t\tvar attributes = parent.__attributes;\n\n\t\t\tparent.id = windowID++;\n\n\t\t\tif (parent.stage == null) parent.stage = Lib.current.stage;\n\t\t\tvar stage = parent.stage;\n\n\t\t\tparent.__width = stage.stageWidth;\n\t\t\tparent.__height = stage.stageHeight;\n\n\t\t\tstage.align = StageAlign.TOP_LEFT;\n\t\t\tstage.scaleMode = StageScaleMode.NO_SCALE;\n\n\t\t\tstage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyEvent);\n\t\t\tstage.addEventListener(KeyboardEvent.KEY_UP, handleKeyEvent);\n\n\t\t\tvar events = [\n\t\t\t\t\"mouseDown\",\n\t\t\t\t\"mouseMove\",\n\t\t\t\t\"mouseUp\",\n\t\t\t\t\"mouseWheel\",\n\t\t\t\t\"middleMouseDown\",\n\t\t\t\t\"middleMouseMove\",\n\t\t\t\t\"middleMouseUp\"\n\t\t\t\t#if ((!openfl && !disable_flash_right_click)\n\t\t\t\t\t|| enable_flash_right_click), \"rightMouseDown\", \"rightMouseMove\", \"rightMouseUp\"\n\t\t\t\t#end\n\t\t\t];\n\n\t\t\tfor (event in events)\n\t\t\t{\n\t\t\t\tstage.addEventListener(event, handleMouseEvent);\n\t\t\t}\n\n\t\t\tstage.addEventListener(TouchEvent.TOUCH_BEGIN, handleTouchEvent);\n\t\t\tstage.addEventListener(TouchEvent.TOUCH_MOVE, handleTouchEvent);\n\t\t\tstage.addEventListener(TouchEvent.TOUCH_END, handleTouchEvent);\n\t\t\tstage.addEventListener(Event.ACTIVATE, handleWindowEvent);\n\t\t\tstage.addEventListener(Event.DEACTIVATE, handleWindowEvent);\n\t\t\tstage.addEventListener(FocusEvent.FOCUS_IN, handleWindowEvent);\n\t\t\tstage.addEventListener(FocusEvent.FOCUS_OUT, handleWindowEvent);\n\t\t\tstage.addEventListener(Event.MOUSE_LEAVE, handleWindowEvent);\n\n\t\t\t// #if !air\n\t\t\tstage.addEventListener(Event.RESIZE, handleWindowEvent);\n\t\t\t// #end\n\n\t\t\tvar context = new RenderContext();\n\t\t\tcontext.flash = Lib.current;\n\t\t\tcontext.type = FLASH;\n\t\t\tcontext.version = Capabilities.version;\n\t\t\tcontext.window = parent;\n\n\t\t\tvar contextAttributes:RenderContextAttributes =\n\t\t\t\t{\n\t\t\t\t\tantialiasing: 0,\n\t\t\t\t\tbackground: null,\n\t\t\t\t\tcolorDepth: 32,\n\t\t\t\t\tdepth: false,\n\t\t\t\t\thardware: false,\n\t\t\t\t\tstencil: false,\n\t\t\t\t\ttype: FLASH,\n\t\t\t\t\tversion: Capabilities.version,\n\t\t\t\t\tvsync: false,\n\t\t\t\t};\n\n\t\t\tif (Reflect.hasField(attributes, \"context\")\n\t\t\t\t&& Reflect.hasField(attributes.context, \"background\")\n\t\t\t\t&& attributes.context.background != null)\n\t\t\t{\n\t\t\t\tstage.color = attributes.context.background;\n\t\t\t\tcontextAttributes.background = stage.color;\n\t\t\t}\n\n\t\t\tsetFrameRate(Reflect.hasField(attributes, \"frameRate\") ? attributes.frameRate : 60);\n\n\t\t\tcontext.attributes = contextAttributes;\n\t\t\tparent.context = context;\n\n\t\t\t// TODO: Wait for application.exec?\n\n\t\t\tcacheTime = Lib.getTimer();\n\t\t\t// handleApplicationEvent (null);\n\n\t\t\tstage.addEventListener(Event.ENTER_FRAME, handleApplicationEvent);\n\t\t}\n\t}\n\n\tpublic function focus():Void {}\n\n\tpublic function getCursor():MouseCursor\n\t{\n\t\treturn cursor;\n\t}\n\n\tpublic function getDisplay():Display\n\t{\n\t\treturn System.getDisplay(0);\n\t}\n\n\tpublic function getDisplayMode():DisplayMode\n\t{\n\t\treturn System.getDisplay(0).currentMode;\n\t}\n\n\tprivate function handleApplicationEvent(event:Event):Void\n\t{\n\t\tvar currentTime = Lib.getTimer();\n\t\tvar deltaTime = currentTime - cacheTime;\n\t\tcacheTime = currentTime;\n\n\t\tparent.application.onUpdate.dispatch(deltaTime);\n\t\tparent.onRender.dispatch(parent.context);\n\t}\n\n\tprivate function handleKeyEvent(event:KeyboardEvent):Void\n\t{\n\t\tvar keyCode = convertKeyCode(event.keyCode);\n\t\tvar modifier = (event.shiftKey ? (KeyModifier.SHIFT) : 0) | (event.ctrlKey ? (KeyModifier.CTRL) : 0) | (event.altKey ? (KeyModifier.ALT) : 0);\n\n\t\tif (event.type == KeyboardEvent.KEY_DOWN)\n\t\t{\n\t\t\tparent.onKeyDown.dispatch(keyCode, modifier);\n\n\t\t\tif (parent.textInputEnabled)\n\t\t\t{\n\t\t\t\tparent.onTextInput.dispatch(String.fromCharCode(event.charCode));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tparent.onKeyUp.dispatch(keyCode, modifier);\n\t\t}\n\t}\n\n\tprivate function handleMouseEvent(event:MouseEvent):Void\n\t{\n\t\tvar button:MouseButton = switch (event.type)\n\t\t{\n\t\t\tcase \"middleMouseDown\", \"middleMouseUp\": MIDDLE;\n\t\t\tcase \"rightMouseDown\", \"rightMouseUp\": RIGHT;\n\t\t\tdefault: LEFT;\n\t\t}\n\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase \"mouseDown\", \"middleMouseDown\", \"rightMouseDown\":\n\t\t\t\tparent.onMouseDown.dispatch(event.stageX, event.stageY, button);\n\n\t\t\tcase \"mouseMove\":\n\t\t\t\tif (mouseLeft)\n\t\t\t\t{\n\t\t\t\t\tmouseLeft = false;\n\t\t\t\t\tparent.onEnter.dispatch();\n\t\t\t\t}\n\n\t\t\t\tvar mouseX = event.stageX;\n\t\t\t\tvar mouseY = event.stageY;\n\n\t\t\t\tparent.onMouseMove.dispatch(mouseX, mouseY);\n\t\t\t\tparent.onMouseMoveRelative.dispatch(mouseX - cacheMouseX, mouseY - cacheMouseY);\n\n\t\t\t\tcacheMouseX = mouseX;\n\t\t\t\tcacheMouseY = mouseY;\n\n\t\t\tcase \"mouseUp\", \"middleMouseUp\", \"rightMouseUp\":\n\t\t\t\tparent.onMouseUp.dispatch(event.stageX, event.stageY, button);\n\n\t\t\tcase \"mouseWheel\":\n\t\t\t\tparent.onMouseWheel.dispatch(0, event.delta, MouseWheelMode.LINES);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprivate function handleTouchEvent(event:TouchEvent):Void\n\t{\n\t\tvar x = event.stageX;\n\t\tvar y = event.stageY;\n\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase TouchEvent.TOUCH_BEGIN:\n\t\t\t\tvar touch = unusedTouchesPool.pop();\n\n\t\t\t\tif (touch == null)\n\t\t\t\t{\n\t\t\t\t\ttouch = new Touch(x / parent.__width, y / parent.__height, event.touchPointID, 0, 0, event.pressure, parent.id);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttouch.x = x / parent.__width;\n\t\t\t\t\ttouch.y = y / parent.__height;\n\t\t\t\t\ttouch.id = event.touchPointID;\n\t\t\t\t\ttouch.dx = 0;\n\t\t\t\t\ttouch.dy = 0;\n\t\t\t\t\ttouch.pressure = event.pressure;\n\t\t\t\t\ttouch.device = parent.id;\n\t\t\t\t}\n\n\t\t\t\tcurrentTouches.set(event.touchPointID, touch);\n\n\t\t\t\tTouch.onStart.dispatch(touch);\n\n\t\t\t\tif (event.isPrimaryTouchPoint)\n\t\t\t\t{\n\t\t\t\t\tparent.onMouseDown.dispatch(x, y, LEFT);\n\t\t\t\t}\n\n\t\t\tcase TouchEvent.TOUCH_END:\n\t\t\t\tvar touch = currentTouches.get(event.touchPointID);\n\n\t\t\t\tif (touch != null)\n\t\t\t\t{\n\t\t\t\t\tvar cacheX = touch.x;\n\t\t\t\t\tvar cacheY = touch.y;\n\n\t\t\t\t\ttouch.x = x / parent.__width;\n\t\t\t\t\ttouch.y = y / parent.__height;\n\t\t\t\t\ttouch.dx = touch.x - cacheX;\n\t\t\t\t\ttouch.dy = touch.y - cacheY;\n\t\t\t\t\ttouch.pressure = event.pressure;\n\n\t\t\t\t\tTouch.onEnd.dispatch(touch);\n\n\t\t\t\t\tcurrentTouches.remove(event.touchPointID);\n\t\t\t\t\tunusedTouchesPool.add(touch);\n\n\t\t\t\t\tif (event.isPrimaryTouchPoint)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.onMouseUp.dispatch(x, y, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tcase TouchEvent.TOUCH_MOVE:\n\t\t\t\tvar touch = currentTouches.get(event.touchPointID);\n\n\t\t\t\tif (touch != null)\n\t\t\t\t{\n\t\t\t\t\tvar cacheX = touch.x;\n\t\t\t\t\tvar cacheY = touch.y;\n\n\t\t\t\t\ttouch.x = x / parent.__width;\n\t\t\t\t\ttouch.y = y / parent.__height;\n\t\t\t\t\ttouch.dx = touch.x - cacheX;\n\t\t\t\t\ttouch.dy = touch.y - cacheY;\n\t\t\t\t\ttouch.pressure = event.pressure;\n\n\t\t\t\t\tTouch.onMove.dispatch(touch);\n\n\t\t\t\t\tif (event.isPrimaryTouchPoint)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.onMouseMove.dispatch(x, y);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleWindowEvent(event:Event):Void\n\t{\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase Event.ACTIVATE:\n\t\t\t\tparent.onActivate.dispatch();\n\n\t\t\tcase Event.DEACTIVATE:\n\t\t\t\tparent.onDeactivate.dispatch();\n\n\t\t\tcase FocusEvent.FOCUS_IN:\n\t\t\t\tparent.onFocusIn.dispatch();\n\n\t\t\tcase FocusEvent.FOCUS_OUT:\n\t\t\t\tparent.onFocusOut.dispatch();\n\n\t\t\tcase Event.MOUSE_LEAVE:\n\t\t\t\tmouseLeft = true;\n\t\t\t\tparent.onLeave.dispatch();\n\n\t\t\tcase Event.RESIZE:\n\t\t\t\tparent.__width = parent.stage.stageWidth;\n\t\t\t\tparent.__height = parent.stage.stageHeight;\n\n\t\t\t\tparent.onResize.dispatch(parent.__width, parent.__height);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tpublic function readPixels(rect:Rectangle):Image\n\t{\n\t\tvar stageRect = new Rectangle(0, 0, parent.stage.stageWidth, parent.stage.stageHeight);\n\n\t\tif (rect == null)\n\t\t{\n\t\t\trect = stageRect;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar rect = rect.intersection(stageRect);\n\t\t}\n\n\t\tif (rect.width > 0 && rect.height > 0)\n\t\t{\n\t\t\tvar bitmapData = new BitmapData(Std.int(rect.width), Std.int(rect.height));\n\n\t\t\tvar matrix = new Matrix();\n\t\t\tmatrix.tx = -rect.x;\n\t\t\tmatrix.ty = -rect.y;\n\n\t\t\tbitmapData.draw(parent.stage, matrix);\n\n\t\t\treturn Image.fromBitmapData(bitmapData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function setCursor(value:MouseCursor):MouseCursor\n\t{\n\t\tif (cursor != value)\n\t\t{\n\t\t\tif (value == null)\n\t\t\t{\n\t\t\t\tMouse.hide();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (cursor == null)\n\t\t\t\t{\n\t\t\t\t\tMouse.show();\n\t\t\t\t}\n\n\t\t\t\tMouse.cursor = switch (value)\n\t\t\t\t{\n\t\t\t\t\tcase ARROW: FlashMouseCursor.ARROW;\n\t\t\t\t\tcase CROSSHAIR: FlashMouseCursor.ARROW;\n\t\t\t\t\tcase MOVE: FlashMouseCursor.HAND;\n\t\t\t\t\tcase POINTER: FlashMouseCursor.BUTTON;\n\t\t\t\t\tcase RESIZE_NESW: FlashMouseCursor.HAND;\n\t\t\t\t\tcase RESIZE_NS: FlashMouseCursor.HAND;\n\t\t\t\t\tcase RESIZE_NWSE: FlashMouseCursor.HAND;\n\t\t\t\t\tcase RESIZE_WE: FlashMouseCursor.HAND;\n\t\t\t\t\tcase TEXT: FlashMouseCursor.IBEAM;\n\t\t\t\t\tcase WAIT: FlashMouseCursor.ARROW;\n\t\t\t\t\tcase WAIT_ARROW: FlashMouseCursor.ARROW;\n\t\t\t\t\tdefault: FlashMouseCursor.AUTO;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcursor = value;\n\t\t}\n\n\t\treturn cursor;\n\t}\n\n\tpublic function setDisplayMode(value:DisplayMode):DisplayMode\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function getFrameRate():Float\n\t{\n\t\treturn frameRate;\n\t}\n\n\tpublic function getMouseLock():Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function getOpacity():Float\n\t{\n\t\treturn 1.0;\n\t}\n\n\tpublic function getTextInputEnabled():Bool\n\t{\n\t\treturn textInputEnabled;\n\t}\n\n\tpublic function move(x:Int, y:Int):Void {}\n\n\tpublic function resize(width:Int, height:Int):Void {}\n\n\tpublic function setMinSize(width:Int, height:Int):Void {}\n\n\tpublic function setMaxSize(width:Int, height:Int):Void {}\n\n\tpublic function setBorderless(value:Bool):Bool\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function setFrameRate(value:Float):Float\n\t{\n\t\tframeRate = value;\n\t\tif (parent.stage != null) parent.stage.frameRate = value;\n\t\treturn value;\n\t}\n\n\tpublic function setFullscreen(value:Bool):Bool\n\t{\n\t\tparent.stage.displayState = (value ? FULL_SCREEN_INTERACTIVE : NORMAL);\n\t\treturn value;\n\t}\n\n\tpublic function setIcon(image:Image):Void {}\n\n\tpublic function setMaximized(value:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function setMinimized(value:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function setMouseLock(value:Bool):Void {}\n\n\tpublic function setOpacity(value:Float):Void {}\n\n\tpublic function setResizable(value:Bool):Bool\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function setTextInputEnabled(value:Bool):Bool\n\t{\n\t\treturn textInputEnabled = value;\n\t}\n\n\tpublic function setTextInputRect(value:Rectangle):Rectangle\n\t{\n\t\treturn textInputRect = value;\n\t}\n\n\tpublic function setTitle(value:String):String\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function setVisible(value:Bool):Bool\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function warpMouse(x:Int, y:Int):Void {}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/html5/HTML5Application.hx",
    "content": "package lime._internal.backend.html5;\n\nimport js.html.DeviceMotionEvent;\nimport js.html.KeyboardEvent;\nimport js.Browser;\nimport lime.app.Application;\nimport lime.media.AudioManager;\nimport lime.system.Orientation;\nimport lime.system.Sensor;\nimport lime.system.SensorType;\nimport lime.ui.GamepadAxis;\nimport lime.ui.KeyCode;\nimport lime.ui.KeyModifier;\nimport lime.ui.Gamepad;\nimport lime.ui.GamepadButton;\nimport lime.ui.Joystick;\nimport lime.ui.Window;\n\n@:access(lime._internal.backend.html5.HTML5Window)\n@:access(lime.app.Application)\n@:access(lime.system.Sensor)\n@:access(lime.ui.Gamepad)\n@:access(lime.ui.Joystick)\n@:access(lime.ui.Window)\nclass HTML5Application\n{\n\tprivate var accelerometer:Sensor;\n\tprivate var currentUpdate:Float;\n\tprivate var deltaTime:Float;\n\tprivate var framePeriod:Float;\n\tprivate var gameDeviceCache = new Map<Int, GameDeviceData>();\n\tprivate var hidden:Bool;\n\tprivate var lastUpdate:Float;\n\tprivate var nextUpdate:Float;\n\tprivate var parent:Application;\n\t#if stats\n\tprivate var stats:Dynamic;\n\t#end\n\n\tpublic inline function new(parent:Application)\n\t{\n\t\tthis.parent = parent;\n\n\t\tcurrentUpdate = 0;\n\t\tlastUpdate = 0;\n\t\tnextUpdate = 0;\n\t\tframePeriod = -1;\n\n\t\tAudioManager.init();\n\t\taccelerometer = Sensor.registerSensor(SensorType.ACCELEROMETER, 0);\n\t}\n\n\tprivate function convertKeyCode(keyCode:Int):KeyCode\n\t{\n\t\tif (keyCode >= 65 && keyCode <= 90)\n\t\t{\n\t\t\treturn keyCode + 32;\n\t\t}\n\n\t\tswitch (keyCode)\n\t\t{\n\t\t\tcase 12:\n\t\t\t\treturn KeyCode.CLEAR;\n\t\t\tcase 16:\n\t\t\t\treturn KeyCode.LEFT_SHIFT;\n\t\t\tcase 17:\n\t\t\t\treturn KeyCode.LEFT_CTRL;\n\t\t\tcase 18:\n\t\t\t\treturn KeyCode.LEFT_ALT;\n\t\t\tcase 19:\n\t\t\t\treturn KeyCode.PAUSE;\n\t\t\tcase 20:\n\t\t\t\treturn KeyCode.CAPS_LOCK;\n\t\t\tcase 33:\n\t\t\t\treturn KeyCode.PAGE_UP;\n\t\t\tcase 34:\n\t\t\t\treturn KeyCode.PAGE_DOWN;\n\t\t\tcase 35:\n\t\t\t\treturn KeyCode.END;\n\t\t\tcase 36:\n\t\t\t\treturn KeyCode.HOME;\n\t\t\tcase 37:\n\t\t\t\treturn KeyCode.LEFT;\n\t\t\tcase 38:\n\t\t\t\treturn KeyCode.UP;\n\t\t\tcase 39:\n\t\t\t\treturn KeyCode.RIGHT;\n\t\t\tcase 40:\n\t\t\t\treturn KeyCode.DOWN;\n\t\t\tcase 41:\n\t\t\t\treturn KeyCode.SELECT;\n\t\t\tcase 43:\n\t\t\t\treturn KeyCode.EXECUTE;\n\t\t\tcase 44:\n\t\t\t\treturn KeyCode.PRINT_SCREEN;\n\t\t\tcase 45:\n\t\t\t\treturn KeyCode.INSERT;\n\t\t\tcase 46:\n\t\t\t\treturn KeyCode.DELETE;\n\t\t\tcase 91:\n\t\t\t\treturn KeyCode.LEFT_META;\n\t\t\tcase 92:\n\t\t\t\treturn KeyCode.RIGHT_META;\n\t\t\tcase 93:\n\t\t\t\treturn KeyCode.RIGHT_META; // this maybe should be APPLICATION if on Windows\n\t\t\tcase 95:\n\t\t\t\treturn KeyCode.SLEEP;\n\t\t\tcase 96:\n\t\t\t\treturn KeyCode.NUMPAD_0;\n\t\t\tcase 97:\n\t\t\t\treturn KeyCode.NUMPAD_1;\n\t\t\tcase 98:\n\t\t\t\treturn KeyCode.NUMPAD_2;\n\t\t\tcase 99:\n\t\t\t\treturn KeyCode.NUMPAD_3;\n\t\t\tcase 100:\n\t\t\t\treturn KeyCode.NUMPAD_4;\n\t\t\tcase 101:\n\t\t\t\treturn KeyCode.NUMPAD_5;\n\t\t\tcase 102:\n\t\t\t\treturn KeyCode.NUMPAD_6;\n\t\t\tcase 103:\n\t\t\t\treturn KeyCode.NUMPAD_7;\n\t\t\tcase 104:\n\t\t\t\treturn KeyCode.NUMPAD_8;\n\t\t\tcase 105:\n\t\t\t\treturn KeyCode.NUMPAD_9;\n\t\t\tcase 106:\n\t\t\t\treturn KeyCode.NUMPAD_MULTIPLY;\n\t\t\tcase 107:\n\t\t\t\treturn KeyCode.NUMPAD_PLUS;\n\t\t\tcase 108:\n\t\t\t\treturn KeyCode.NUMPAD_PERIOD;\n\t\t\tcase 109:\n\t\t\t\treturn KeyCode.NUMPAD_MINUS;\n\t\t\tcase 110:\n\t\t\t\treturn KeyCode.NUMPAD_PERIOD;\n\t\t\tcase 111:\n\t\t\t\treturn KeyCode.NUMPAD_DIVIDE;\n\t\t\tcase 112:\n\t\t\t\treturn KeyCode.F1;\n\t\t\tcase 113:\n\t\t\t\treturn KeyCode.F2;\n\t\t\tcase 114:\n\t\t\t\treturn KeyCode.F3;\n\t\t\tcase 115:\n\t\t\t\treturn KeyCode.F4;\n\t\t\tcase 116:\n\t\t\t\treturn KeyCode.F5;\n\t\t\tcase 117:\n\t\t\t\treturn KeyCode.F6;\n\t\t\tcase 118:\n\t\t\t\treturn KeyCode.F7;\n\t\t\tcase 119:\n\t\t\t\treturn KeyCode.F8;\n\t\t\tcase 120:\n\t\t\t\treturn KeyCode.F9;\n\t\t\tcase 121:\n\t\t\t\treturn KeyCode.F10;\n\t\t\tcase 122:\n\t\t\t\treturn KeyCode.F11;\n\t\t\tcase 123:\n\t\t\t\treturn KeyCode.F12;\n\t\t\tcase 124:\n\t\t\t\treturn KeyCode.F13;\n\t\t\tcase 125:\n\t\t\t\treturn KeyCode.F14;\n\t\t\tcase 126:\n\t\t\t\treturn KeyCode.F15;\n\t\t\tcase 127:\n\t\t\t\treturn KeyCode.F16;\n\t\t\tcase 128:\n\t\t\t\treturn KeyCode.F17;\n\t\t\tcase 129:\n\t\t\t\treturn KeyCode.F18;\n\t\t\tcase 130:\n\t\t\t\treturn KeyCode.F19;\n\t\t\tcase 131:\n\t\t\t\treturn KeyCode.F20;\n\t\t\tcase 132:\n\t\t\t\treturn KeyCode.F21;\n\t\t\tcase 133:\n\t\t\t\treturn KeyCode.F22;\n\t\t\tcase 134:\n\t\t\t\treturn KeyCode.F23;\n\t\t\tcase 135:\n\t\t\t\treturn KeyCode.F24;\n\t\t\tcase 144:\n\t\t\t\treturn KeyCode.NUM_LOCK;\n\t\t\tcase 145:\n\t\t\t\treturn KeyCode.SCROLL_LOCK;\n\t\t\tcase 160:\n\t\t\t\treturn KeyCode.CARET;\n\t\t\tcase 161:\n\t\t\t\treturn KeyCode.EXCLAMATION;\n\t\t\tcase 163:\n\t\t\t\treturn KeyCode.HASH;\n\t\t\tcase 164:\n\t\t\t\treturn KeyCode.DOLLAR;\n\t\t\tcase 166:\n\t\t\t\treturn KeyCode.APP_CONTROL_BACK;\n\t\t\tcase 167:\n\t\t\t\treturn KeyCode.APP_CONTROL_FORWARD;\n\t\t\tcase 168:\n\t\t\t\treturn KeyCode.APP_CONTROL_REFRESH;\n\t\t\tcase 169:\n\t\t\t\treturn KeyCode.RIGHT_PARENTHESIS; // is this correct?\n\t\t\tcase 170:\n\t\t\t\treturn KeyCode.ASTERISK;\n\t\t\tcase 171:\n\t\t\t\treturn KeyCode.GRAVE;\n\t\t\tcase 172:\n\t\t\t\treturn KeyCode.HOME;\n\t\t\tcase 173:\n\t\t\t\treturn KeyCode.MINUS; // or mute/unmute?\n\t\t\tcase 174:\n\t\t\t\treturn KeyCode.VOLUME_DOWN;\n\t\t\tcase 175:\n\t\t\t\treturn KeyCode.VOLUME_UP;\n\t\t\tcase 176:\n\t\t\t\treturn KeyCode.AUDIO_NEXT;\n\t\t\tcase 177:\n\t\t\t\treturn KeyCode.AUDIO_PREVIOUS;\n\t\t\tcase 178:\n\t\t\t\treturn KeyCode.AUDIO_STOP;\n\t\t\tcase 179:\n\t\t\t\treturn KeyCode.AUDIO_PLAY;\n\t\t\tcase 180:\n\t\t\t\treturn KeyCode.MAIL;\n\t\t\tcase 181:\n\t\t\t\treturn KeyCode.AUDIO_MUTE;\n\t\t\tcase 182:\n\t\t\t\treturn KeyCode.VOLUME_DOWN;\n\t\t\tcase 183:\n\t\t\t\treturn KeyCode.VOLUME_UP;\n\t\t\tcase 186:\n\t\t\t\treturn KeyCode.SEMICOLON; // or ñ?\n\t\t\tcase 187:\n\t\t\t\treturn KeyCode.EQUALS;\n\t\t\tcase 188:\n\t\t\t\treturn KeyCode.COMMA;\n\t\t\tcase 189:\n\t\t\t\treturn KeyCode.MINUS;\n\t\t\tcase 190:\n\t\t\t\treturn KeyCode.PERIOD;\n\t\t\tcase 191:\n\t\t\t\treturn KeyCode.SLASH;\n\t\t\tcase 192:\n\t\t\t\treturn KeyCode.GRAVE;\n\t\t\tcase 193:\n\t\t\t\treturn KeyCode.QUESTION;\n\t\t\tcase 194:\n\t\t\t\treturn KeyCode.NUMPAD_PERIOD;\n\t\t\tcase 219:\n\t\t\t\treturn KeyCode.LEFT_BRACKET;\n\t\t\tcase 220:\n\t\t\t\treturn KeyCode.BACKSLASH;\n\t\t\tcase 221:\n\t\t\t\treturn KeyCode.RIGHT_BRACKET;\n\t\t\tcase 222:\n\t\t\t\treturn KeyCode.SINGLE_QUOTE;\n\t\t\tcase 223:\n\t\t\t\treturn KeyCode.GRAVE;\n\t\t\tcase 224:\n\t\t\t\treturn KeyCode.LEFT_META;\n\t\t\tcase 226:\n\t\t\t\treturn KeyCode.BACKSLASH;\n\t\t}\n\n\t\treturn keyCode;\n\t}\n\n\tpublic function exec():Int\n\t{\n\t\tBrowser.window.addEventListener(\"keydown\", handleKeyEvent, false);\n\t\tBrowser.window.addEventListener(\"keyup\", handleKeyEvent, false);\n\t\tBrowser.window.addEventListener(\"focus\", handleWindowEvent, false);\n\t\tBrowser.window.addEventListener(\"blur\", handleWindowEvent, false);\n\t\tBrowser.window.addEventListener(\"resize\", handleWindowEvent, false);\n\t\tBrowser.window.addEventListener(\"beforeunload\", handleWindowEvent, false);\n\n\t\tif (Reflect.hasField(Browser.window, \"Accelerometer\"))\n\t\t{\n\t\t\tBrowser.window.addEventListener(\"devicemotion\", handleSensorEvent, false);\n\t\t}\n\n\t\t#if stats\n\t\tstats = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"new Stats ()\");\n\t\tstats.domElement.style.position = \"absolute\";\n\t\tstats.domElement.style.top = \"0px\";\n\t\tBrowser.document.body.appendChild(stats.domElement);\n\t\t#end\n\n\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"\n\t\t\tif (!CanvasRenderingContext2D.prototype.isPointInStroke) {\n\t\t\t\tCanvasRenderingContext2D.prototype.isPointInStroke = function (path, x, y) {\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!CanvasRenderingContext2D.prototype.isPointInPath) {\n\t\t\t\tCanvasRenderingContext2D.prototype.isPointInPath = function (path, x, y) {\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif ('performance' in window == false) {\n\t\t\t\twindow.performance = {};\n\t\t\t}\n\n\t\t\tif ('now' in window.performance == false) {\n\t\t\t\tvar offset = Date.now();\n\t\t\t\tif (performance.timing && performance.timing.navigationStart) {\n\t\t\t\t\toffset = performance.timing.navigationStart\n\t\t\t\t}\n\t\t\t\twindow.performance.now = function now() {\n\t\t\t\t\treturn Date.now() - offset;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar lastTime = 0;\n\t\t\tvar vendors = ['ms', 'moz', 'webkit', 'o'];\n\t\t\tfor (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n\t\t\t\twindow.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n\t\t\t\twindow.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];\n\t\t\t}\n\n\t\t\tif (!window.requestAnimationFrame)\n\t\t\t\twindow.requestAnimationFrame = function(callback, element) {\n\t\t\t\t\tvar currTime = window.performance.now();\n\t\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\t\tvar id = window.setTimeout(function() { callback(currTime + timeToCall); },\n\t\t\t\t\t  timeToCall);\n\t\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\t\treturn id;\n\t\t\t\t};\n\n\t\t\tif (!window.cancelAnimationFrame)\n\t\t\t\twindow.cancelAnimationFrame = function(id) {\n\t\t\t\t\tclearTimeout(id);\n\t\t\t\t};\n\n\t\t\twindow.requestAnimFrame = window.requestAnimationFrame;\n\t\t\");\n\n\t\tlastUpdate = Browser.window.performance.now();\n\n\t\thandleApplicationEvent();\n\n\t\treturn 0;\n\t}\n\n\tpublic function exit():Void {}\n\n\tpublic function getDeviceOrientation():Orientation\n\t{\n\t\tif (Browser.window.screen.orientation != null)\n\t\t{\n\t\t\tswitch (Browser.window.screen.orientation.type)\n\t\t\t{\n\t\t\t\tcase PORTRAIT_PRIMARY:\n\t\t\t\t\treturn PORTRAIT;\n\t\t\t\tcase PORTRAIT_SECONDARY:\n\t\t\t\t\treturn PORTRAIT_FLIPPED;\n\t\t\t\tcase LANDSCAPE_PRIMARY:\n\t\t\t\t\treturn LANDSCAPE;\n\t\t\t\tcase LANDSCAPE_SECONDARY:\n\t\t\t\t\treturn LANDSCAPE_FLIPPED;\n\t\t\t\tdefault:\n\t\t\t\t\t// fall through to unknown\n\t\t\t}\n\t\t}\n\t\treturn UNKNOWN;\n\t}\n\n\tprivate function handleApplicationEvent(?__):Void\n\t{\n\t\t// TODO: Support independent window frame rates\n\n\t\tfor (window in parent.__windows)\n\t\t{\n\t\t\twindow.__backend.updateSize();\n\t\t}\n\n\t\tupdateGameDevices();\n\n\t\tcurrentUpdate = Browser.window.performance.now();\n\n\t\tif (currentUpdate >= nextUpdate)\n\t\t{\n\t\t\t#if stats\n\t\t\tstats.begin();\n\t\t\t#end\n\n\t\t\tdeltaTime = currentUpdate - lastUpdate;\n\n\t\t\tfor (window in parent.__windows)\n\t\t\t{\n\t\t\t\tparent.onUpdate.dispatch(Std.int(deltaTime));\n\t\t\t\tif (window.context != null) window.onRender.dispatch(window.context);\n\t\t\t}\n\n\t\t\t#if stats\n\t\t\tstats.end();\n\t\t\t#end\n\n\t\t\tif (framePeriod < 0)\n\t\t\t{\n\t\t\t\tnextUpdate = currentUpdate;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnextUpdate = currentUpdate - (currentUpdate % framePeriod) + framePeriod;\n\t\t\t}\n\n\t\t\tlastUpdate = currentUpdate;\n\t\t}\n\n\t\tBrowser.window.requestAnimationFrame(cast handleApplicationEvent);\n\t}\n\n\tprivate function handleKeyEvent(event:KeyboardEvent):Void\n\t{\n\t\tif (parent.window != null)\n\t\t{\n\t\t\t// space and arrow keys\n\n\t\t\t// switch (event.keyCode) {\n\n\t\t\t// \tcase 32, 37, 38, 39, 40: event.preventDefault ();\n\n\t\t\t// }\n\n\t\t\t// TODO: Use event.key instead where supported\n\n\t\t\tvar keyCode = cast convertKeyCode(event.keyCode != null ? event.keyCode : event.which);\n\t\t\tvar modifier = (event.shiftKey ? (KeyModifier.SHIFT) : 0) | (event.ctrlKey ? (KeyModifier.CTRL) : 0) | (event.altKey ? (KeyModifier.ALT) : 0) | (event.metaKey ? (KeyModifier.META) : 0);\n\n\t\t\tif (event.type == \"keydown\")\n\t\t\t{\n\t\t\t\tparent.window.onKeyDown.dispatch(keyCode, modifier);\n\n\t\t\t\tif (parent.window.onKeyDown.canceled && event.cancelable)\n\t\t\t\t{\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparent.window.onKeyUp.dispatch(keyCode, modifier);\n\n\t\t\t\tif (parent.window.onKeyUp.canceled && event.cancelable)\n\t\t\t\t{\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleSensorEvent(event:DeviceMotionEvent):Void\n\t{\n\t\taccelerometer.onUpdate.dispatch(event.accelerationIncludingGravity.x, event.accelerationIncludingGravity.y, event.accelerationIncludingGravity.z);\n\t}\n\n\tprivate function handleWindowEvent(event:js.html.Event):Void\n\t{\n\t\tif (parent.window != null)\n\t\t{\n\t\t\tswitch (event.type)\n\t\t\t{\n\t\t\t\tcase \"focus\":\n\t\t\t\t\tif (hidden)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.window.onFocusIn.dispatch();\n\t\t\t\t\t\tparent.window.onActivate.dispatch();\n\t\t\t\t\t\thidden = false;\n\t\t\t\t\t}\n\n\t\t\t\tcase \"blur\":\n\t\t\t\t\tif (!hidden)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.window.onFocusOut.dispatch();\n\t\t\t\t\t\tparent.window.onDeactivate.dispatch();\n\t\t\t\t\t\thidden = true;\n\t\t\t\t\t}\n\n\t\t\t\tcase \"visibilitychange\":\n\t\t\t\t\tif (Browser.document.hidden)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!hidden)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparent.window.onFocusOut.dispatch();\n\t\t\t\t\t\t\tparent.window.onDeactivate.dispatch();\n\t\t\t\t\t\t\thidden = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (hidden)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparent.window.onFocusIn.dispatch();\n\t\t\t\t\t\t\tparent.window.onActivate.dispatch();\n\t\t\t\t\t\t\thidden = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"resize\":\n\t\t\t\t\tparent.window.__backend.handleResizeEvent(event);\n\n\t\t\t\tcase \"beforeunload\":\n\t\t\t\t\t// Mobile Chrome dispatches 'beforeunload' after device sleep,\n\t\t\t\t\t// but returns later without reloading the page. This triggers\n\t\t\t\t\t// a window.onClose(), without us creating the window again.\n\t\t\t\t\t//\n\t\t\t\t\t// For now, let focus in/out and activate/deactivate trigger\n\t\t\t\t\t// on blur and focus, and do not dispatch a closed window event\n\t\t\t\t\t// since it may actually never close.\n\n\t\t\t\t\t// if (!event.defaultPrevented) {\n\n\t\t\t\t\t// \t\tparent.window.onClose.dispatch ();\n\n\t\t\t\t\t// \t\tif (parent.window != null && parent.window.onClose.canceled && event.cancelable) {\n\n\t\t\t\t\t// \t\t\tevent.preventDefault ();\n\n\t\t\t\t\t// \t\t}\n\n\t\t\t\t\t// \t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function updateGameDevices():Void\n\t{\n\t\tvar devices = Joystick.__getDeviceData();\n\t\tif (devices == null) return;\n\n\t\tvar id, gamepad, joystick, data:Dynamic, cache;\n\n\t\tfor (i in 0...devices.length)\n\t\t{\n\t\t\tid = i;\n\t\t\tdata = devices[id];\n\n\t\t\tif (data == null) continue;\n\n\t\t\tif (!gameDeviceCache.exists(id))\n\t\t\t{\n\t\t\t\tcache = new GameDeviceData();\n\t\t\t\tcache.id = id;\n\t\t\t\tcache.connected = data.connected;\n\n\t\t\t\tfor (i in 0...data.buttons.length)\n\t\t\t\t{\n\t\t\t\t\tcache.buttons.push(data.buttons[i].value);\n\t\t\t\t}\n\n\t\t\t\tfor (i in 0...data.axes.length)\n\t\t\t\t{\n\t\t\t\t\tcache.axes.push(data.axes[i]);\n\t\t\t\t}\n\n\t\t\t\tif (data.mapping == \"standard\")\n\t\t\t\t{\n\t\t\t\t\tcache.isGamepad = true;\n\t\t\t\t}\n\n\t\t\t\tgameDeviceCache.set(id, cache);\n\n\t\t\t\tif (data.connected)\n\t\t\t\t{\n\t\t\t\t\tJoystick.__connect(id);\n\n\t\t\t\t\tif (cache.isGamepad)\n\t\t\t\t\t{\n\t\t\t\t\t\tGamepad.__connect(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcache = gameDeviceCache.get(id);\n\n\t\t\tjoystick = Joystick.devices.get(id);\n\t\t\tgamepad = Gamepad.devices.get(id);\n\n\t\t\tif (data.connected)\n\t\t\t{\n\t\t\t\tvar button:GamepadButton;\n\t\t\t\tvar value:Float;\n\n\t\t\t\tfor (i in 0...data.buttons.length)\n\t\t\t\t{\n\t\t\t\t\tvalue = data.buttons[i].value;\n\n\t\t\t\t\tif (value != cache.buttons[i])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (i == 6)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjoystick.onAxisMove.dispatch(data.axes.length, value);\n\t\t\t\t\t\t\tif (gamepad != null) gamepad.onAxisMove.dispatch(GamepadAxis.TRIGGER_LEFT, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (i == 7)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjoystick.onAxisMove.dispatch(data.axes.length + 1, value);\n\t\t\t\t\t\t\tif (gamepad != null) gamepad.onAxisMove.dispatch(GamepadAxis.TRIGGER_RIGHT, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (value > 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjoystick.onButtonDown.dispatch(i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjoystick.onButtonUp.dispatch(i);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (gamepad != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbutton = switch (i)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase 0: GamepadButton.A;\n\t\t\t\t\t\t\t\t\tcase 1: GamepadButton.B;\n\t\t\t\t\t\t\t\t\tcase 2: GamepadButton.X;\n\t\t\t\t\t\t\t\t\tcase 3: GamepadButton.Y;\n\t\t\t\t\t\t\t\t\tcase 4: GamepadButton.LEFT_SHOULDER;\n\t\t\t\t\t\t\t\t\tcase 5: GamepadButton.RIGHT_SHOULDER;\n\t\t\t\t\t\t\t\t\tcase 8: GamepadButton.BACK;\n\t\t\t\t\t\t\t\t\tcase 9: GamepadButton.START;\n\t\t\t\t\t\t\t\t\tcase 10: GamepadButton.LEFT_STICK;\n\t\t\t\t\t\t\t\t\tcase 11: GamepadButton.RIGHT_STICK;\n\t\t\t\t\t\t\t\t\tcase 12: GamepadButton.DPAD_UP;\n\t\t\t\t\t\t\t\t\tcase 13: GamepadButton.DPAD_DOWN;\n\t\t\t\t\t\t\t\t\tcase 14: GamepadButton.DPAD_LEFT;\n\t\t\t\t\t\t\t\t\tcase 15: GamepadButton.DPAD_RIGHT;\n\t\t\t\t\t\t\t\t\tcase 16: GamepadButton.GUIDE;\n\t\t\t\t\t\t\t\t\tdefault: continue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (value > 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tgamepad.onButtonDown.dispatch(button);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tgamepad.onButtonUp.dispatch(button);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcache.buttons[i] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (i in 0...data.axes.length)\n\t\t\t\t{\n\t\t\t\t\tif (data.axes[i] != cache.axes[i])\n\t\t\t\t\t{\n\t\t\t\t\t\tjoystick.onAxisMove.dispatch(i, data.axes[i]);\n\t\t\t\t\t\tif (gamepad != null) gamepad.onAxisMove.dispatch(i, data.axes[i]);\n\t\t\t\t\t\tcache.axes[i] = data.axes[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (cache.connected)\n\t\t\t{\n\t\t\t\tcache.connected = false;\n\n\t\t\t\tJoystick.__disconnect(id);\n\t\t\t\tGamepad.__disconnect(id);\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass GameDeviceData\n{\n\tpublic var connected:Bool;\n\tpublic var id:Int;\n\tpublic var isGamepad:Bool;\n\tpublic var buttons:Array<Float>;\n\tpublic var axes:Array<Float>;\n\n\tpublic function new()\n\t{\n\t\tconnected = true;\n\t\tbuttons = [];\n\t\taxes = [];\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/html5/HTML5AudioSource.hx",
    "content": "package lime._internal.backend.html5;\n\nimport lime.math.Vector4;\nimport lime.media.AudioSource;\n\n@:access(lime.media.AudioBuffer)\nclass HTML5AudioSource\n{\n\tprivate var completed:Bool;\n\tprivate var gain:Float;\n\tprivate var id:Int;\n\tprivate var length:Int;\n\tprivate var loops:Int;\n\tprivate var parent:AudioSource;\n\tprivate var playing:Bool;\n\tprivate var position:Vector4;\n\n\tpublic function new(parent:AudioSource)\n\t{\n\t\tthis.parent = parent;\n\n\t\tid = -1;\n\t\tgain = 1;\n\t\tposition = new Vector4();\n\t}\n\n\tpublic function dispose():Void {}\n\n\tpublic function init():Void\n\t{\n\t\t#if lime_howlerjs\n\t\t// Initialize the panner with default values\n\t\tparent.buffer.src.pannerAttr(\n\t\t\t{\n\t\t\t\tconeInnerAngle: 360,\n\t\t\t\tconeOuterAngle: 360,\n\t\t\t\tconeOuterGain: 0,\n\t\t\t\tdistanceModel: \"inverse\",\n\t\t\t\tmaxDistance: 10000,\n\t\t\t\trefDistance: 1,\n\t\t\t\trolloffFactor: 1,\n\t\t\t\tpanningModel: \"equalpower\" // Default to equalpower for better performance\n\t\t\t});\n\t\t#end\n\t}\n\n\tpublic function play():Void\n\t{\n\t\t#if lime_howlerjs\n\t\tif (playing || parent.buffer == null || parent.buffer.__srcHowl == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tplaying = true;\n\n\t\tvar time = getCurrentTime();\n\n\t\tcompleted = false;\n\n\t\tvar cacheVolume = untyped parent.buffer.__srcHowl._volume;\n\t\tuntyped parent.buffer.__srcHowl._volume = parent.gain;\n\n\t\tid = parent.buffer.__srcHowl.play();\n\n\t\tuntyped parent.buffer.__srcHowl._volume = cacheVolume;\n\t\t// setGain (parent.gain);\n\n\t\tsetPosition(parent.position);\n\n\t\tparent.buffer.__srcHowl.on(\"end\", howl_onEnd, id);\n\n\t\t// Calling setCurrentTime causes html5 audio to replay from this position on next frame\n\t\t#if force_html5_audio\n\t\tif (time == 0) setCurrentTime(time);\n\t\t#else\n\t\tsetCurrentTime(time);\n\t\t#end\n\t\t#end\n\t}\n\n\tpublic function pause():Void\n\t{\n\t\t#if lime_howlerjs\n\t\tplaying = false;\n\n\t\tif (parent.buffer != null && parent.buffer.__srcHowl != null)\n\t\t{\n\t\t\tparent.buffer.__srcHowl.pause(id);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function stop():Void\n\t{\n\t\t#if lime_howlerjs\n\t\tplaying = false;\n\n\t\tif (parent.buffer != null && parent.buffer.__srcHowl != null)\n\t\t{\n\t\t\tparent.buffer.__srcHowl.stop(id);\n\t\t\tparent.buffer.__srcHowl.off(\"end\", howl_onEnd, id);\n\t\t}\n\t\t#end\n\t}\n\n\t// Event Handlers\n\tprivate function howl_onEnd()\n\t{\n\t\t#if lime_howlerjs\n\t\tplaying = false;\n\n\t\tif (loops > 0)\n\t\t{\n\t\t\tloops--;\n\t\t\tstop();\n\t\t\t// currentTime = 0;\n\t\t\tplay();\n\t\t\treturn;\n\t\t}\n\t\telse if (parent.buffer != null && parent.buffer.__srcHowl != null)\n\t\t{\n\t\t\tparent.buffer.__srcHowl.stop(id);\n\t\t\tparent.buffer.__srcHowl.off(\"end\", howl_onEnd, id);\n\t\t}\n\n\t\tcompleted = true;\n\t\tparent.onComplete.dispatch();\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\tpublic function getCurrentTime():Int\n\t{\n\t\tif (id == -1)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t#if lime_howlerjs\n\t\tif (completed)\n\t\t{\n\t\t\treturn getLength();\n\t\t}\n\t\telse if (parent.buffer != null && parent.buffer.__srcHowl != null)\n\t\t{\n\t\t\tvar time = Std.int(parent.buffer.__srcHowl.seek(id) * 1000) - parent.offset;\n\t\t\tif (time < 0) return 0;\n\t\t\treturn time;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function setCurrentTime(value:Int):Int\n\t{\n\t\t#if lime_howlerjs\n\t\tif (parent.buffer != null && parent.buffer.__srcHowl != null)\n\t\t{\n\t\t\t// if (playing) buffer.__srcHowl.play (id);\n\t\t\tvar pos = (value + parent.offset) / 1000;\n\t\t\tif (pos < 0) pos = 0;\n\t\t\tparent.buffer.__srcHowl.seek(pos, id);\n\t\t}\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\tpublic function getGain():Float\n\t{\n\t\treturn gain;\n\t}\n\n\tpublic function setGain(value:Float):Float\n\t{\n\t\t#if lime_howlerjs\n\t\t// set howler volume only if we have an active id.\n\t\t// Passing -1 might create issues in future play()'s.\n\n\t\tif (parent.buffer != null && parent.buffer.__srcHowl != null && id != -1)\n\t\t{\n\t\t\tparent.buffer.__srcHowl.volume(value, id);\n\t\t}\n\t\t#end\n\n\t\treturn gain = value;\n\t}\n\n\tpublic function getLength():Int\n\t{\n\t\tif (length != 0)\n\t\t{\n\t\t\treturn length;\n\t\t}\n\n\t\t#if lime_howlerjs\n\t\tif (parent.buffer != null && parent.buffer.__srcHowl != null)\n\t\t{\n\t\t\treturn Std.int(parent.buffer.__srcHowl.duration() * 1000);\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function setLength(value:Int):Int\n\t{\n\t\treturn length = value;\n\t}\n\n\tpublic function getLoops():Int\n\t{\n\t\treturn loops;\n\t}\n\n\tpublic function setLoops(value:Int):Int\n\t{\n\t\treturn loops = value;\n\t}\n\n\tpublic function getPitch():Float\n\t{\n\t\t#if lime_howlerjs\n\t\treturn parent.buffer.__srcHowl.rate();\n\t\t#else\n\t\treturn 1;\n\t\t#end\n\t}\n\n\tpublic function setPitch(value:Float):Float\n\t{\n\t\t#if lime_howlerjs\n\t\tparent.buffer.__srcHowl.rate(value);\n\t\t#end\n\n\t\treturn getPitch();\n\t}\n\n\tpublic function getPosition():Vector4\n\t{\n\t\t#if lime_howlerjs\n\t\t// This should work, but it returns null (But checking the inside of the howl, the _pos is actually null... so ¯\\_(ツ)_/¯)\n\t\t/*\n\t\t\tvar arr = parent.buffer.__srcHowl.pos())\n\t\t\tposition.x = arr[0];\n\t\t\tposition.y = arr[1];\n\t\t\tposition.z = arr[2];\n\t\t */\n\t\t#end\n\n\t\treturn position;\n\t}\n\n\tpublic function setPosition(value:Vector4):Vector4\n\t{\n\t\tposition.x = value.x;\n\t\tposition.y = value.y;\n\t\tposition.z = value.z;\n\t\tposition.w = value.w;\n\n\t\t#if lime_howlerjs\n\t\tif (parent.buffer != null && parent.buffer.__srcHowl != null && parent.buffer.__srcHowl.pos != null) parent.buffer.__srcHowl.pos(position.x, position.y, position.z, id);\n\t\t// There are more settings to the position of the sound on the \"pannerAttr()\" function of howler. Maybe somebody who understands sound should look into it?\n\t\t#end\n\n\t\treturn position;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/html5/HTML5HTTPRequest.hx",
    "content": "package lime._internal.backend.html5;\n\nimport haxe.io.Bytes;\nimport js.html.AnchorElement;\nimport js.html.Blob;\nimport js.html.ErrorEvent;\nimport js.html.Event;\nimport js.html.Image as JSImage;\nimport js.html.ProgressEvent;\nimport js.html.URL;\nimport js.html.XMLHttpRequest;\nimport js.html.XMLHttpRequestResponseType;\nimport js.Browser;\nimport lime._internal.format.Base64;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.net.HTTPRequest;\nimport lime.net.HTTPRequestHeader;\nimport lime.utils.AssetType;\n\n@:access(lime.graphics.ImageBuffer)\n@:access(lime.graphics.Image)\nclass HTML5HTTPRequest\n{\n\tprivate static inline var OPTION_REVOKE_URL:Int = 1 << 0;\n\n\tprivate static var activeRequests = 0;\n\tprivate static var originElement:AnchorElement;\n\tprivate static var originHostname:String;\n\tprivate static var originPort:String;\n\tprivate static var originProtocol:String;\n\tprivate static var requestLimit = 17;\n\tprivate static var requestQueue = new List<QueueItem>();\n\tprivate static var supportsImageProgress:Null<Bool>;\n\n\tprivate var binary:Bool;\n\tprivate var parent:_IHTTPRequest;\n\tprivate var request:XMLHttpRequest;\n\tprivate var validStatus0:Bool;\n\n\tpublic function new()\n\t{\n\t\tvalidStatus0 = #if allow_status_0 true #else ~/Tizen/gi.match(Browser.window.navigator.userAgent) #end;\n\t}\n\n\tpublic function cancel():Void\n\t{\n\t\tif (request != null)\n\t\t{\n\t\t\trequest.abort();\n\t\t}\n\t}\n\n\tpublic function init(parent:_IHTTPRequest):Void\n\t{\n\t\tthis.parent = parent;\n\t}\n\n\tprivate function load(uri:String, progress:Dynamic, readyStateChange:Dynamic):Void\n\t{\n\t\trequest = new XMLHttpRequest();\n\n\t\tif (parent.method == POST)\n\t\t{\n\t\t\tif(request.upload != null)\n\t\t\t\trequest.upload.addEventListener(\"progress\", progress, false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequest.addEventListener(\"progress\", progress, false);\n\t\t}\n\n\t\trequest.onreadystatechange = readyStateChange;\n\n\t\tvar query = \"\";\n\n\t\tif (parent.data == null)\n\t\t{\n\t\t\tfor (key in parent.formData.keys())\n\t\t\t{\n\t\t\t\tif (query.length > 0) query += \"&\";\n\t\t\t\tvar value:Dynamic = parent.formData.get(key);\n\t\t\t\tif (key.indexOf(\"[]\") > -1 && (value is Array))\n\t\t\t\t{\n\t\t\t\t\tvar arrayValue:String = Lambda.map(value, function(v:String)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn StringTools.urlEncode(v);\n\t\t\t\t\t}).join('&amp;${key}=');\n\t\t\t\t\tquery += StringTools.urlEncode(key) + \"=\" + arrayValue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tquery += StringTools.urlEncode(key) + \"=\" + StringTools.urlEncode(Std.string(value));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (parent.method == GET && query != \"\")\n\t\t\t{\n\t\t\t\tif (uri.indexOf(\"?\") > -1)\n\t\t\t\t{\n\t\t\t\t\turi += \"&\" + query;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\turi += \"?\" + query;\n\t\t\t\t}\n\n\t\t\t\tquery = \"\";\n\t\t\t}\n\t\t}\n\n\t\trequest.open(Std.string(parent.method), uri, true);\n\n\t\tif (parent.timeout > 0)\n\t\t{\n\t\t\trequest.timeout = parent.timeout;\n\t\t}\n\n\t\tif (binary)\n\t\t{\n\t\t\trequest.responseType = ARRAYBUFFER;\n\t\t}\n\n\t\tvar contentType = null;\n\n\t\tfor (header in parent.headers)\n\t\t{\n\t\t\tif (header.name == \"Content-Type\")\n\t\t\t{\n\t\t\t\tcontentType = header.value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trequest.setRequestHeader(header.name, header.value);\n\t\t\t}\n\t\t}\n\n\t\tif (parent.contentType != null)\n\t\t{\n\t\t\tcontentType = parent.contentType;\n\t\t}\n\n\t\tif (contentType == null)\n\t\t{\n\t\t\tif (parent.data != null)\n\t\t\t{\n\t\t\t\tcontentType = \"application/octet-stream\";\n\t\t\t}\n\t\t\telse if (query != \"\")\n\t\t\t{\n\t\t\t\tcontentType = \"application/x-www-form-urlencoded\";\n\t\t\t}\n\t\t}\n\n\t\tif (contentType != null)\n\t\t{\n\t\t\trequest.setRequestHeader(\"Content-Type\", contentType);\n\t\t}\n\n\t\tif (parent.withCredentials)\n\t\t{\n\t\t\trequest.withCredentials = true;\n\t\t}\n\n\t\tif (parent.data != null)\n\t\t{\n\t\t\trequest.send(parent.data.getData());\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequest.send(query);\n\t\t}\n\t}\n\n\tpublic function loadData(uri:String):Future<Bytes>\n\t{\n\t\tvar promise = new Promise<Bytes>();\n\n\t\tif (activeRequests < requestLimit)\n\t\t{\n\t\t\tactiveRequests++;\n\t\t\t__loadData(uri, promise);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequestQueue.add(\n\t\t\t\t{\n\t\t\t\t\tinstance: this,\n\t\t\t\t\turi: uri,\n\t\t\t\t\tpromise: promise,\n\t\t\t\t\ttype: AssetType.BINARY,\n\t\t\t\t\toptions: 0\n\t\t\t\t});\n\t\t}\n\n\t\treturn promise.future;\n\t}\n\n\tprivate static function loadImage(uri:String):Future<Image>\n\t{\n\t\tvar promise = new Promise<Image>();\n\n\t\tif (activeRequests < requestLimit)\n\t\t{\n\t\t\tactiveRequests++;\n\t\t\t__loadImage(uri, promise, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequestQueue.add(\n\t\t\t\t{\n\t\t\t\t\tinstance: null,\n\t\t\t\t\turi: uri,\n\t\t\t\t\tpromise: promise,\n\t\t\t\t\ttype: AssetType.IMAGE,\n\t\t\t\t\toptions: 0\n\t\t\t\t});\n\t\t}\n\n\t\treturn promise.future;\n\t}\n\n\tprivate static function loadImageFromBytes(bytes:Bytes, type:String):Future<Image>\n\t{\n\t\tvar uri = __createBlobURIFromBytes(bytes, type);\n\t\tif (uri != null)\n\t\t{\n\t\t\tvar promise = new Promise<Image>();\n\n\t\t\tif (activeRequests < requestLimit)\n\t\t\t{\n\t\t\t\tactiveRequests++;\n\t\t\t\t__loadImage(uri, promise, OPTION_REVOKE_URL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trequestQueue.add(\n\t\t\t\t\t{\n\t\t\t\t\t\tinstance: null,\n\t\t\t\t\t\turi: uri,\n\t\t\t\t\t\tpromise: promise,\n\t\t\t\t\t\ttype: AssetType.IMAGE,\n\t\t\t\t\t\toptions: OPTION_REVOKE_URL\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn promise.future;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn loadImage(\"data:\" + type + \";base64,\" + Base64.encode(bytes));\n\t\t}\n\t}\n\n\tpublic function loadText(uri:String):Future<String>\n\t{\n\t\tvar promise = new Promise<String>();\n\n\t\tif (activeRequests < requestLimit)\n\t\t{\n\t\t\tactiveRequests++;\n\t\t\t__loadText(uri, promise);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequestQueue.add(\n\t\t\t\t{\n\t\t\t\t\tinstance: this,\n\t\t\t\t\turi: uri,\n\t\t\t\t\tpromise: promise,\n\t\t\t\t\ttype: AssetType.TEXT,\n\t\t\t\t\toptions: 0\n\t\t\t\t});\n\t\t}\n\n\t\treturn promise.future;\n\t}\n\n\tprivate static function processQueue():Void\n\t{\n\t\tif (activeRequests < requestLimit && requestQueue.length > 0)\n\t\t{\n\t\t\tactiveRequests++;\n\n\t\t\tvar queueItem = requestQueue.pop();\n\n\t\t\tswitch (queueItem.type)\n\t\t\t{\n\t\t\t\tcase IMAGE:\n\t\t\t\t\t__loadImage(queueItem.uri, queueItem.promise, queueItem.options);\n\n\t\t\t\tcase TEXT:\n\t\t\t\t\tqueueItem.instance.__loadText(queueItem.uri, queueItem.promise);\n\n\t\t\t\tcase BINARY:\n\t\t\t\t\tqueueItem.instance.__loadData(queueItem.uri, queueItem.promise);\n\n\t\t\t\tdefault:\n\t\t\t\t\tactiveRequests--;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function processResponse():Void\n\t{\n\t\tif (parent.enableResponseHeaders)\n\t\t{\n\t\t\tparent.responseHeaders = [];\n\t\t\tvar name:String;\n\t\t\tvar value:String;\n\n\t\t\tfor (line in request.getAllResponseHeaders().split(\"\\n\"))\n\t\t\t{\n\t\t\t\tname = StringTools.trim(line.substr(0, line.indexOf(\":\")));\n\t\t\t\tvalue = StringTools.trim(line.substr(line.indexOf(\":\") + 1));\n\n\t\t\t\tif (name != \"\")\n\t\t\t\t{\n\t\t\t\t\tparent.responseHeaders.push(new HTTPRequestHeader(name, value));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tparent.responseStatus = request.status;\n\t}\n\n\tprivate static inline function __createBlobURIFromBytes(bytes:Bytes, type:String):String\n\t{\n\t\treturn URL.createObjectURL(new Blob([bytes.getData()], {type: type}));\n\t}\n\n\tprivate static function __fixHostname(hostname:String):String\n\t{\n\t\treturn hostname == null ? \"\" : hostname;\n\t}\n\n\tprivate static function __fixPort(port:String, protocol:String):String\n\t{\n\t\tif (port == null || port == \"\")\n\t\t{\n\t\t\treturn switch (protocol)\n\t\t\t{\n\t\t\t\tcase \"ftp:\": \"21\";\n\t\t\t\tcase \"gopher:\": \"70\";\n\t\t\t\tcase \"http:\": \"80\";\n\t\t\t\tcase \"https:\": \"443\";\n\t\t\t\tcase \"ws:\": \"80\";\n\t\t\t\tcase \"wss:\": \"443\";\n\t\t\t\tdefault: \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn port;\n\t}\n\n\tprivate static function __fixProtocol(protocol:String):String\n\t{\n\t\treturn (protocol == null || protocol == \"\") ? \"http:\" : protocol;\n\t}\n\n\tprivate static function __isInMemoryURI(uri:String):Bool\n\t{\n\t\treturn StringTools.startsWith(uri, \"data:\") || StringTools.startsWith(uri, \"blob:\");\n\t}\n\n\tprivate static function __isSameOrigin(path:String):Bool\n\t{\n\t\tif (path == null || path == \"\") return true;\n\t\tif (__isInMemoryURI(path)) return true;\n\n\t\tif (originElement == null)\n\t\t{\n\t\t\toriginElement = Browser.document.createAnchorElement();\n\n\t\t\toriginHostname = __fixHostname(Browser.location.hostname);\n\t\t\toriginProtocol = __fixProtocol(Browser.location.protocol);\n\t\t\toriginPort = __fixPort(Browser.location.port, originProtocol);\n\t\t}\n\n\t\tvar a = originElement;\n\t\ta.href = path;\n\n\t\tif (a.hostname == \"\")\n\t\t{\n\t\t\t// Workaround for IE, updates other properties\n\t\t\ta.href = a.href;\n\t\t}\n\n\t\tvar hostname = __fixHostname(a.hostname);\n\t\tvar protocol = __fixProtocol(a.protocol);\n\t\tvar port = __fixPort(a.port, protocol);\n\n\t\tvar sameHost = (hostname == \"\" || (hostname == originHostname));\n\t\tvar samePort = (port == \"\" || (port == originPort));\n\n\t\treturn (protocol != \"file:\" && sameHost && samePort);\n\t}\n\n\tpublic function __loadData(uri:String, promise:Promise<Bytes>):Void\n\t{\n\t\tvar progress = function(event)\n\t\t{\n\t\t\tpromise.progress(event.loaded, event.total);\n\t\t}\n\n\t\tvar readyStateChange = function(event)\n\t\t{\n\t\t\tif (request.readyState != 4) return;\n\n\t\t\tvar bytes = null;\n\t\t\tif (request.responseType == NONE)\n\t\t\t{\n\t\t\t\tif (request.responseText != null)\n\t\t\t\t{\n\t\t\t\t\tbytes = Bytes.ofString(request.responseText);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (request.response != null)\n\t\t\t{\n\t\t\t\tbytes = Bytes.ofData(request.response);\n\t\t\t}\n\n\t\t\tif (request.status != null && ((request.status >= 200 && request.status < 400) || (validStatus0 && request.status == 0)))\n\t\t\t{\n\t\t\t\tprocessResponse();\n\t\t\t\tpromise.complete(bytes);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprocessResponse();\n\t\t\t\tpromise.error(new _HTTPRequestErrorResponse(request.status, bytes));\n\t\t\t}\n\n\t\t\trequest = null;\n\n\t\t\tactiveRequests--;\n\t\t\tprocessQueue();\n\t\t}\n\n\t\tbinary = true;\n\t\tload(uri, progress, readyStateChange);\n\t}\n\n\tprivate static function __loadImage(uri:String, promise:Promise<Image>, options:Int):Void\n\t{\n\t\tvar image:JSImage = untyped #if haxe4 js.Syntax.code #else __js__ #end ('new window.Image ()');\n\n\t\tif (!__isSameOrigin(uri))\n\t\t{\n\t\t\timage.crossOrigin = \"Anonymous\";\n\t\t}\n\n\t\tif (supportsImageProgress == null)\n\t\t{\n\t\t\tsupportsImageProgress = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"'onprogress' in image\");\n\t\t}\n\n\t\tif (supportsImageProgress || __isInMemoryURI(uri))\n\t\t{\n\t\t\timage.addEventListener(\"load\", function(event)\n\t\t\t{\n\t\t\t\t__revokeBlobURI(uri, options);\n\t\t\t\tvar buffer = new ImageBuffer(null, image.width, image.height);\n\t\t\t\tbuffer.__srcImage = cast image;\n\n\t\t\t\tactiveRequests--;\n\t\t\t\tprocessQueue();\n\n\t\t\t\tpromise.complete(new Image(buffer));\n\t\t\t}, false);\n\n\t\t\timage.addEventListener(\"progress\", function(event)\n\t\t\t{\n\t\t\t\tpromise.progress(event.loaded, event.total);\n\t\t\t}, false);\n\n\t\t\timage.addEventListener(\"error\", function(event)\n\t\t\t{\n\t\t\t\t__revokeBlobURI(uri, options);\n\n\t\t\t\tactiveRequests--;\n\t\t\t\tprocessQueue();\n\n\t\t\t\tpromise.error(new _HTTPRequestErrorResponse(event.detail, null));\n\t\t\t}, false);\n\n\t\t\timage.src = uri;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar request = new XMLHttpRequest();\n\n\t\t\trequest.onload = function(_)\n\t\t\t{\n\t\t\t\tactiveRequests--;\n\t\t\t\tprocessQueue();\n\n\t\t\t\tvar img = new Image();\n\t\t\t\timg.__fromBytes(Bytes.ofData(request.response), function(img)\n\t\t\t\t{\n\t\t\t\t\tpromise.complete(img);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\trequest.onerror = function(event:ErrorEvent)\n\t\t\t{\n\t\t\t\tpromise.error(new _HTTPRequestErrorResponse(event.message, null));\n\t\t\t}\n\n\t\t\trequest.onprogress = function(event:ProgressEvent)\n\t\t\t{\n\t\t\t\tif (event.lengthComputable)\n\t\t\t\t{\n\t\t\t\t\tpromise.progress(event.loaded, event.total);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trequest.open(\"GET\", uri, true);\n\t\t\trequest.responseType = XMLHttpRequestResponseType.ARRAYBUFFER;\n\t\t\trequest.overrideMimeType('text/plain; charset=x-user-defined');\n\t\t\trequest.send(null);\n\t\t}\n\t}\n\n\tprivate function __loadText(uri:String, promise:Promise<String>):Void\n\t{\n\t\tvar progress = function(event)\n\t\t{\n\t\t\tpromise.progress(event.loaded, event.total);\n\t\t}\n\n\t\tvar readyStateChange = function(event)\n\t\t{\n\t\t\tif (request.readyState != 4) return;\n\n\t\t\tif (request.status != null && ((request.status >= 200 && request.status < 400) || (validStatus0 && request.status == 0)))\n\t\t\t{\n\t\t\t\tprocessResponse();\n\t\t\t\tpromise.complete(request.responseText);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprocessResponse();\n\t\t\t\tpromise.error(new _HTTPRequestErrorResponse(request.status, request.responseText));\n\t\t\t}\n\n\t\t\trequest = null;\n\n\t\t\tactiveRequests--;\n\t\t\tprocessQueue();\n\t\t}\n\n\t\tbinary = false;\n\t\tload(uri, progress, readyStateChange);\n\t}\n\n\tprivate static function __revokeBlobURI(uri:String, options:Int):Void\n\t{\n\t\tif ((options & OPTION_REVOKE_URL) != 0)\n\t\t{\n\t\t\tURL.revokeObjectURL(uri);\n\t\t}\n\t}\n}\n\n@:dox(hide) typedef QueueItem =\n{\n\tvar instance:HTML5HTTPRequest;\n\tvar type:AssetType;\n\tvar promise:Dynamic;\n\tvar uri:String;\n\tvar options:Int;\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/html5/HTML5Thread.hx",
    "content": "package lime._internal.backend.html5;\n\nimport lime.app.Event;\n\n#if macro\nimport haxe.macro.Context;\nimport haxe.macro.Expr;\nimport haxe.macro.Type;\n\nusing haxe.macro.Context;\nusing haxe.macro.TypeTools;\nusing haxe.macro.TypedExprTools;\n#else\n// Not safe to import js package during macros.\nimport js.Browser;\nimport js.html.*;\nimport js.Lib;\n#if haxe4\nimport js.lib.Function;\nimport js.lib.Object;\nimport js.lib.Promise;\nimport js.Syntax;\n#else\nimport js.Promise;\n#end\n// Same with classes that import lots of other things.\nimport lime.app.Application;\n#end\n\n/**\n\tEmulates much of the `sys.thread.Thread` API using web workers.\n**/\nclass HTML5Thread {\n\tprivate static var __current:HTML5Thread = new HTML5Thread(Lib.global.location.href);\n\tprivate static var __isWorker:Bool #if !macro = #if !haxe4 untyped __js__ #else Syntax.code #end ('typeof window == \"undefined\"') #end;\n\tprivate static var __messages:List<Dynamic> = new List();\n\tprivate static var __resolveMethods:List<Dynamic->Void> = new List();\n\tprivate static var __workerCount:Int = 0;\n\n\t/**\n\t\tThe entry point into a worker script.\n\n\t\tLime's output JS file normally does not begin on its own. Instead it\n\t\tregisters a `lime.embed()` callback for index.html to use.\n\n\t\tWhen this JS file is run as a web worker, it isn't running within\n\t\tindex.html, so `embed()` never gets called. Instead, `__init__()`\n\t\tregisters a message listener.\n\t**/\n\tprivate static function __init__():Void\n\t{\n\t\t#if !macro\n\t\tif (#if !haxe4 untyped __js__ #else Syntax.code #end ('typeof window == \"undefined\"'))\n\t\t{\n\t\t\tLib.global.onmessage = function(event:MessageEvent):Void\n\t\t\t{\n\t\t\t\tvar job:WorkFunction<Void->Void> = event.data;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tLib.global.onmessage = __current.dispatchMessage;\n\t\t\t\t\tjob.dispatch();\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\t__current.destroy();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\t#end\n\t}\n\n\tpublic static inline function current():HTML5Thread\n\t{\n\t\treturn __current;\n\t}\n\n\tpublic static function create(job:WorkFunction<Void->Void>):HTML5Thread\n\t{\n\t\t#if !macro\n\t\t// Find the URL of the primary JS file.\n\t\tvar url:URL = new URL(__current.__href);\n\t\turl.pathname = url.pathname.substr(0, url.pathname.lastIndexOf(\"/\") + 1)\n\t\t\t+ Application.current.meta[\"file\"] + \".js\";\n\n\t\t// Use the hash to distinguish workers.\n\t\tif (url.hash.length > 0) url.hash += \"_\";\n\t\turl.hash += __workerCount;\n\t\t__workerCount++;\n\n\t\t// Prepare to send the job.\n\t\tjob.makePortable();\n\n\t\t// Create the worker. Because the worker's scope will not include a\n\t\t// `window`, `HTML5Thread.__init__()` will add a listener.\n\t\tvar thread:HTML5Thread = new HTML5Thread(url.href, new Worker(url.href));\n\n\t\t// Run `job` on the new thread.\n\t\tthread.sendMessage(#if !haxe4 cast #end job);\n\n\t\treturn thread;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t#if !macro\n\tprivate static inline function zeroDelay():Promise<Dynamic>\n\t{\n\t\treturn new Promise<Dynamic>(function(resolve, _):Void\n\t\t\t{\n\t\t\t\tjs.Lib.global.setTimeout(resolve);\n\t\t\t});\n\t}\n\t#end\n\n\t/**\n\t\tReads a message from the thread queue. Returns `null` if no message is\n\t\tavailable. This may only be called inside an `async` function.\n\t\t@param block If true, waits for the next message before returning.\n\t\t@see `lime.system.WorkOutput.JSAsync.async()`\n\t**/\n\tpublic static macro function readMessage(block:ExprOf<Bool>):Dynamic\n\t{\n\t\tvar jsCode:Expr = macro #if haxe4 js.Syntax.code #else untyped __js__ #end;\n\n\t\t// `onmessage` events are only received when the main function is\n\t\t// suspended, so we must insert `await` even if `block` is false.\n\t\t// TODO: find a more efficient way to read messages.\n\t\tvar zeroDelayExpr:Expr = macro @:privateAccess\n\t\t\t$jsCode(\"await {0}\", lime._internal.backend.html5.HTML5Thread.zeroDelay())\n\t\t\t.then(function(_) return lime._internal.backend.html5.HTML5Thread.__messages.pop());\n\n\t\tswitch (block.expr)\n\t\t{\n\t\t\tcase EConst(CIdent(\"false\")):\n\t\t\t\treturn zeroDelayExpr;\n\t\t\tdefault:\n\t\t\t\treturn macro if ($block && @:privateAccess lime._internal.backend.html5.HTML5Thread.__messages.isEmpty())\n\t\t\t\t{\n\t\t\t\t\t$jsCode(\"await {0}\", new #if haxe4 js.lib.Promise #else js.Promise #end\n\t\t\t\t\t\t(function(resolve, _):Void\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t@:privateAccess lime._internal.backend.html5.HTML5Thread.__resolveMethods.add(resolve);\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t$zeroDelayExpr;\n\t\t}\n\t}\n\n\t/**\n\t\tSends a message back to the thread that spawned this worker. Has no\n\t\teffect if called from the main thread.\n\n\t\t@param preserveClasses Whether to call `preserveClasses()` first.\n\t**/\n\tpublic static function returnMessage(message:Message, transferList:Array<Transferable> = null, preserveClasses:Bool = true):Void\n\t{\n\t\tif (__isWorker)\n\t\t{\n\t\t\tif (preserveClasses)\n\t\t\t{\n\t\t\t\tmessage.preserveClasses();\n\t\t\t}\n\n\t\t\tLib.global.postMessage(message, transferList);\n\t\t}\n\t}\n\n\t@:op(A == B) private static inline function equals(a:HTML5Thread, b:HTML5Thread):Bool\n\t{\n\t\treturn a.__href == b.__href;\n\t}\n\n\t/**\n\t\tDispatches only messages coming from this `HTML5Thread`. Only available\n\t\tin the case of `HTML5Thread.create()`; never available via `current()`.\n\t**/\n\tpublic var onMessage(default, null):Null<Event<Dynamic->Void>>;\n\n\tprivate var __href:String;\n\tprivate var __worker:Null<Worker>;\n\n\tprivate function new(href:String, worker:Worker = null)\n\t{\n\t\t#if !macro\n\t\t__href = href;\n\n\t\tif (worker != null)\n\t\t{\n\t\t\t__worker = worker;\n\t\t\t__worker.onmessage = dispatchMessage;\n\t\t\tonMessage = new Event<Dynamic->Void>();\n\t\t}\n\n\t\t// If an `HTML5Thread` instance is passed to a different thread than\n\t\t// where it was created, all of its instance methods will behave\n\t\t// incorrectly. You can still check equality, but that's it. Therefore,\n\t\t// it's best to make `preserveClasses()` skip this class.\n\t\tMessage.disablePreserveClasses(this);\n\t\t#end\n\t}\n\n\t/**\n\t\tSend a message to the thread queue. This message can be read using\n\t\t`readMessage()` or by listening for the `onMessage` event.\n\n\t\t@param preserveClasses Whether to call `preserveClasses()` first.\n\t**/\n\tpublic function sendMessage(message:Message, transferList:Array<Transferable> = null, preserveClasses:Bool = true):Void\n\t{\n\t\t#if !macro\n\t\tif (__worker != null)\n\t\t{\n\t\t\tif (preserveClasses)\n\t\t\t{\n\t\t\t\tmessage.preserveClasses();\n\t\t\t}\n\n\t\t\t__worker.postMessage(message, transferList);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// No need for `restoreClasses()` because it came from this thread.\n\t\t\t__messages.add(message);\n\t\t}\n\t\t#end\n\t}\n\n\t#if !macro\n\tprivate function dispatchMessage(event:MessageEvent):Void\n\t{\n\t\tvar message:Message = event.data;\n\t\tmessage.restoreClasses();\n\n\t\tif (onMessage != null)\n\t\t{\n\t\t\tonMessage.dispatch(message);\n\t\t}\n\n\t\tif (__resolveMethods.isEmpty())\n\t\t{\n\t\t\t__messages.add(message);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t__resolveMethods.pop()(message);\n\t\t}\n\t}\n\t#end\n\n\t/**\n\t\tCloses this thread unless it's the main thread.\n\t**/\n\tpublic function destroy():Void\n\t{\n\t\t#if !macro\n\t\tif (__worker != null)\n\t\t{\n\t\t\t__worker.terminate();\n\t\t}\n\t\telse if (__isWorker)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tLib.global.close();\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\t#end\n\t}\n\n\tpublic inline function isWorker():Bool\n\t{\n\t\treturn __worker != null || __isWorker;\n\t}\n}\n\nabstract WorkFunction<T:haxe.Constraints.Function>(WorkFunctionData<T>) from WorkFunctionData<T>\n{\n\t/**\n\t\tWhether this function is ready to copy across threads. If not, call\n\t\t`makePortable()` before sending it.\n\t**/\n\tpublic var portable(get, never):Bool;\n\n\t#if macro\n\t/**\n\t\tParses a chain of nested `EField` expressions.\n\t\t@return An array of all identifiers in the chain, as strings. If the\n\t\tchain began with something other than an identifier, it will be returned\n\t\tas the `initialExpr`. For instance, `array[i].foo.bar` will result in\n\t\t`chain == [\"foo\", \"bar\"]` and `initialExpr == array[i]`.\n\t**/\n\tprivate static function parseFieldChain(chain:Expr):{ chain:Array<String>, ?initialExpr:Expr }\n\t{\n\t\tswitch(chain.expr)\n\t\t{\n\t\t\tcase EConst(CIdent(ident)):\n\t\t\t\treturn { chain: [ident] };\n\t\t\tcase EField(e, field):\n\t\t\t\tvar out = parseFieldChain(e);\n\t\t\t\tout.chain.push(field);\n\t\t\t\treturn out;\n\t\t\tdefault:\n\t\t\t\treturn { chain: [], initialExpr: chain };\n\t\t}\n\t}\n\t#end\n\n\t// `@:from` would cause errors during the macro phase.\n\t@:noCompletion @:dox(hide) #if !macro @:from #end\n\tpublic static #if !macro macro #end function fromFunction(func:ExprOf<haxe.Constraints.Function>)\n\t{\n\t\tvar defaultOutput:Expr = macro {\n\t\t\tfunc: $func\n\t\t};\n\n\t\tif (!Context.defined(\"lime-threads\"))\n\t\t{\n\t\t\treturn defaultOutput;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Haxe likes to pass `@:this this` instead of the actual\n\t\t\t// expression, so use a roundabout method to convert back. As a\n\t\t\t// happy side-effect, it fully qualifies the expression.\n\t\t\tvar qualifiedFunc:String = func.typeExpr().toString(true);\n\n\t\t\t// Match the package, class name, and field name.\n\t\t\tvar matcher:EReg = ~/^((?:_?\\w+\\.)*[A-Z]\\w*)\\.(_*[a-z]\\w*)$/;\n\t\t\tif (!matcher.match(qualifiedFunc))\n\t\t\t{\n\t\t\t\tif (Context.defined(\"lime-warn-portability\"))\n\t\t\t\t{\n\t\t\t\t\tContext.warning(\"Value doesn't appear to be a static function.\", func.pos);\n\t\t\t\t}\n\t\t\t\treturn defaultOutput;\n\t\t\t}\n\n\t\t\tvar classPath:String = matcher.matched(1);\n\t\t\tvar functionName:String = matcher.matched(2);\n\n\t\t\treturn macro {\n\t\t\t\tfunc: $func,\n\t\t\t\tclassPath: $v{classPath},\n\t\t\t\tfunctionName: $v{functionName}\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t\tExecutes this function on the current thread.\n\t**/\n\tpublic macro function dispatch(self:ExprOf<WorkFunction<Dynamic>>, args:Array<Expr>):Expr\n\t{\n\t\treturn macro $self.toFunction()($a{args});\n\t}\n\n\t#if haxe4 @:to #end\n\tpublic function toFunction():T\n\t{\n\t\tif (this.func != null)\n\t\t{\n\t\t\treturn this.func;\n\t\t}\n\t\telse if (this.classPath != null && this.functionName != null)\n\t\t{\n\t\t\t#if !macro\n\t\t\tthis.func = #if !haxe4 untyped __js__ #else Syntax.code #end\n\t\t\t\t(\"$hxClasses[{0}][{1}]\", this.classPath, this.functionName);\n\t\t\t#end\n\t\t\treturn this.func;\n\t\t}\n\t\telse if (this.sourceCode != null)\n\t\t{\n\t\t\t#if !macro\n\t\t\tthis.func = #if !haxe4 untyped __js__ #else Syntax.code #end\n\t\t\t\t('new Function(\"return \" + {0})()', this.sourceCode);\n\t\t\t#end\n\t\t\treturn this.func;\n\t\t}\n\n\t\tthrow 'Object is not a valid WorkFunction: $this';\n\t}\n\n\t/**\n\t\tAttempts to make this function safe for passing across threads.\n\t\t@return Whether this function is now portable. If false, try a static\n\t\tfunction instead, and make sure you aren't using `bind()`.\n\t**/\n\tpublic function makePortable(throwError:Bool = true):Bool\n\t{\n\t\tif (this.func != null)\n\t\t{\n\t\t\t// Make sure `classPath.functionName` points to the actual function.\n\t\t\tif (this.classPath != null || this.functionName != null)\n\t\t\t{\n\t\t\t\t#if !macro\n\t\t\t\tvar func = #if !haxe4 untyped __js__ #else Syntax.code #end\n\t\t\t\t\t(\"$hxClasses[{0}] && $hxClasses[{0}][{1}]\", this.classPath, this.functionName);\n\t\t\t\tif (func != this.func)\n\t\t\t\t{\n\t\t\t\t\tthrow 'Could not make ${this.functionName} portable. Either ${this.functionName} isn\\'t static, or ${this.classPath} is something other than a class.';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// All set.\n\t\t\t\t\tthis.func = null;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t#end\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t#if !macro\n\t\t\t\tthis.sourceCode = (cast this.func #if haxe4 :Function #end).toString();\n\t\t\t\tif (this.sourceCode.indexOf(\"[native code]\") < 0)\n\t\t\t\t{\n\t\t\t\t\t// All set.\n\t\t\t\t\tthis.func = null;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.sourceCode = null;\n\t\t\t\t}\n\t\t\t\t#end\n\n\t\t\t\t// If you aren't sure why you got this message, make sure your\n\t\t\t\t// variables are of type `WorkFunction`.\n\t\t\t\t// This won't work:\n\t\t\t\t//     var f = MyClass.staticFunction;\n\t\t\t\t//     bgWorker.run(f);\n\t\t\t\t// ...but this will:\n\t\t\t\t//     var f:WorkFunction<Dynamic->Void> = MyClass.staticFunction;\n\t\t\t\t//     bgWorker.run(f);\n\t\t\t\tthrow \"Only static class functions can be made portable. Set -Dlime-warn-portability to see which line caused this.\";\n\t\t\t}\n\t\t}\n\n\t\treturn portable;\n\t}\n\n\t// Getters & Setters\n\n\tprivate inline function get_portable():Bool\n\t{\n\t\treturn this.func == null;\n\t}\n}\n\n/**\n\tStores the class path and function name of a function, so that it can be\n\tfound again in the background thread.\n**/\ntypedef WorkFunctionData<T:haxe.Constraints.Function> = {\n\t@:optional var classPath:String;\n\t@:optional var functionName:String;\n\t@:optional var sourceCode:String;\n\t@:optional var func:T;\n};\n\n@:forward\n@:allow(lime._internal.backend.html5.HTML5Thread)\nabstract Message(Dynamic) from Dynamic to Dynamic\n{\n\tprivate static inline var PROTOTYPE_FIELD:String = \"__prototype__\";\n\tprivate static inline var SKIP_FIELD:String = \"__skipPrototype__\";\n\tprivate static inline var RESTORE_FIELD:String = \"__restoreFlag__\";\n\n\t#if !macro\n\tprivate static inline function skip(object:Dynamic):Bool\n\t{\n\t\t// Skip `null` for obvious reasons.\n\t\treturn object == null\n\t\t\t// No need to preserve a primitive type.\n\t\t\t|| !#if (haxe_ver >= 4.2) Std.isOfType #else Std.is #end (object, Object)\n\t\t\t// Objects with this field have been deliberately excluded.\n\t\t\t|| Reflect.field(object, SKIP_FIELD) == true\n\t\t\t// A `Uint8Array` (the type used by `haxe.io.Bytes`) can have\n\t\t\t// thousands or millions of fields, which can take entire seconds to\n\t\t\t// enumerate. This also applies to `Int8Array`, `Float64Array`, etc.\n\t\t\t|| object.byteLength != null && object.byteOffset != null\n\t\t\t\t&& object.buffer != null\n\t\t\t\t&& #if (haxe_ver >= 4.2) Std.isOfType #else Std.is #end (object.buffer, #if haxe4 js.lib.ArrayBuffer #else js.html.ArrayBuffer #end);\n\t}\n\t#end\n\n\t/**\n\t\tPrevents `preserveClasses()` from working on the given object.\n\n\t\tNote: if its class isn't preserved, `cast(object, Foo)` will fail with\n\t\tthe unhelpful message \"uncaught exception: Object\" and no line number.\n\t**/\n\tpublic static function disablePreserveClasses(object:Dynamic):Void\n\t{\n\t\t#if !macro\n\t\tif (skip(object))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tReflect.setField(object, Message.SKIP_FIELD, true);\n\t\t#end\n\t}\n\n\t/**\n\t\tAdds class information to this message and all children, so that it will\n\t\tsurvive being passed across threads. \"Children\" are the values returned\n\t\tby `Object.values()`.\n\t**/\n\tpublic function preserveClasses():Void\n\t{\n\t\t#if !macro\n\t\tif (skip(this) || Reflect.hasField(this, PROTOTYPE_FIELD))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Preserve this object's class.\n\t\tif (!#if (haxe_ver >= 4.2) Std.isOfType #else Std.is #end (this, Array))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (this.__class__ != null)\n\t\t\t\t{\n\t\t\t\t\t#if haxe4\n\t\t\t\t\tReflect.setField(this, PROTOTYPE_FIELD, this.__class__.__name__);\n\t\t\t\t\t#else\n\t\t\t\t\tReflect.setField(this, PROTOTYPE_FIELD, this.__class__.__name__.join(\".\"));\n\t\t\t\t\t#end\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tReflect.setField(this, PROTOTYPE_FIELD, null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\t// Probably a frozen object; no need to recurse.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// While usually it's the user's job not to include any functions,\n\t\t\t// enums come with a built-in `toString` function that needs to be\n\t\t\t// removed, and it isn't fair to ask the user to know that.\n\t\t\tif (#if haxe4 Syntax.code #else untyped __js__ #end ('typeof {0}.toString == \"function\"', this))\n\t\t\t{\n\t\t\t\tReflect.deleteField(this, \"toString\");\n\t\t\t}\n\t\t}\n\n\t\t// Recurse.\n\t\tfor (child in Object.values(this))\n\t\t{\n\t\t\t(child:Message).preserveClasses();\n\t\t}\n\t\t#end\n\t}\n\n\t/**\n\t\tRestores the class information preserved by `preserveClasses()`.\n\n\t\t@param flag Leave this `null`.\n\t**/\n\tprivate function restoreClasses(flag:Int = null):Void\n\t{\n\t\t#if !macro\n\t\t// Attempt to choose a unique flag.\n\t\tif (flag == null)\n\t\t{\n\t\t\t// JavaScript's limit is 2^53; Haxe 3's limit is much lower.\n\t\t\tflag = Std.int(Math.random() * 0x7FFFFFFF);\n\t\t\tif (Reflect.field(this, RESTORE_FIELD) == flag)\n\t\t\t{\n\t\t\t\tflag++;\n\t\t\t}\n\t\t}\n\n\t\tif (skip(this) || Reflect.field(this, RESTORE_FIELD) == flag)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tReflect.setField(this, RESTORE_FIELD, flag);\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\t// Probably a frozen object; no need to continue.\n\t\t\treturn;\n\t\t}\n\n\t\t// Restore this object's class.\n\t\tif (Reflect.field(this, PROTOTYPE_FIELD) != null)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tObject.setPrototypeOf(this,\n\t\t\t\t\t#if haxe4 Syntax.code #else untyped __js__ #end\n\t\t\t\t\t\t(\"$hxClasses[{0}].prototype\", Reflect.field(this, PROTOTYPE_FIELD)));\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\t// Recurse.\n\t\tfor (child in Object.values(this))\n\t\t{\n\t\t\t(child:Message).restoreClasses(flag);\n\t\t}\n\t\t#end\n\t}\n}\n\n#if macro\ntypedef Worker = Dynamic;\ntypedef URL = Dynamic;\nclass Object {}\nclass Browser\n{\n\tpublic static var window:Dynamic;\n}\nclass Lib\n{\n\tpublic static var global:Dynamic = { location: {} };\n}\n#end\n\n/**\n\tAn object to transfer, rather than copy.\n\n\tAbstract types like `lime.utils.Int32Array` and `openfl.utils.ByteArray`\n\tcan be automatically converted. However, extern classes like\n\t`js.lib.Int32Array` typically can't.\n\n\t@see https://developer.mozilla.org/en-US/docs/Glossary/Transferable_objects\n**/\n// Mozilla uses \"transferable\" and \"transferrable\" interchangeably, but the HTML\n// specification only uses the former.\n@:forward\nabstract Transferable(Dynamic) #if macro from Dynamic\n\t#else from lime.utils.ArrayBuffer from js.html.MessagePort from js.html.ImageBitmap #end\n{\n}\n\n#if (!haxe4 && !macro)\n@:native(\"Object\")\nextern class Object {\n\tstatic function setPrototypeOf<T:{}>(obj:T, prototype:Null<{}>):T;\n\t@:pure static function values(obj:{}):Array<Dynamic>;\n\tstatic var prototype(default, never):Dynamic;\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/backend/html5/HTML5WebGL2RenderContext.hx",
    "content": "package lime._internal.backend.html5;\n\nimport js.html.webgl.RenderingContext in WebGLRenderingContext;\nimport lime.graphics.opengl.*;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.ArrayBufferView;\nimport lime.utils.DataPointer;\nimport lime.utils.Float32Array;\nimport lime.utils.Int32Array;\nimport lime.utils.UInt32Array;\n\n@:native(\"WebGL2RenderingContext\")\nextern class HTML5WebGL2RenderContext extends WebGLRenderingContext\n{\n\tpublic var DEPTH_BUFFER_BIT:Int;\n\tpublic var STENCIL_BUFFER_BIT:Int;\n\tpublic var COLOR_BUFFER_BIT:Int;\n\tpublic var POINTS:Int;\n\tpublic var LINES:Int;\n\tpublic var LINE_LOOP:Int;\n\tpublic var LINE_STRIP:Int;\n\tpublic var TRIANGLES:Int;\n\tpublic var TRIANGLE_STRIP:Int;\n\tpublic var TRIANGLE_FAN:Int;\n\tpublic var ZERO:Int;\n\tpublic var ONE:Int;\n\tpublic var SRC_COLOR:Int;\n\tpublic var ONE_MINUS_SRC_COLOR:Int;\n\tpublic var SRC_ALPHA:Int;\n\tpublic var ONE_MINUS_SRC_ALPHA:Int;\n\tpublic var DST_ALPHA:Int;\n\tpublic var ONE_MINUS_DST_ALPHA:Int;\n\tpublic var DST_COLOR:Int;\n\tpublic var ONE_MINUS_DST_COLOR:Int;\n\tpublic var SRC_ALPHA_SATURATE:Int;\n\tpublic var FUNC_ADD:Int;\n\tpublic var BLEND_EQUATION:Int;\n\tpublic var BLEND_EQUATION_RGB:Int;\n\tpublic var BLEND_EQUATION_ALPHA:Int;\n\tpublic var FUNC_SUBTRACT:Int;\n\tpublic var FUNC_REVERSE_SUBTRACT:Int;\n\tpublic var BLEND_DST_RGB:Int;\n\tpublic var BLEND_SRC_RGB:Int;\n\tpublic var BLEND_DST_ALPHA:Int;\n\tpublic var BLEND_SRC_ALPHA:Int;\n\tpublic var CONSTANT_COLOR:Int;\n\tpublic var ONE_MINUS_CONSTANT_COLOR:Int;\n\tpublic var CONSTANT_ALPHA:Int;\n\tpublic var ONE_MINUS_CONSTANT_ALPHA:Int;\n\tpublic var BLEND_COLOR:Int;\n\tpublic var ARRAY_BUFFER:Int;\n\tpublic var ELEMENT_ARRAY_BUFFER:Int;\n\tpublic var ARRAY_BUFFER_BINDING:Int;\n\tpublic var ELEMENT_ARRAY_BUFFER_BINDING:Int;\n\tpublic var STREAM_DRAW:Int;\n\tpublic var STATIC_DRAW:Int;\n\tpublic var DYNAMIC_DRAW:Int;\n\tpublic var BUFFER_SIZE:Int;\n\tpublic var BUFFER_USAGE:Int;\n\tpublic var CURRENT_VERTEX_ATTRIB:Int;\n\tpublic var FRONT:Int;\n\tpublic var BACK:Int;\n\tpublic var FRONT_AND_BACK:Int;\n\tpublic var CULL_FACE:Int;\n\tpublic var BLEND:Int;\n\tpublic var DITHER:Int;\n\tpublic var STENCIL_TEST:Int;\n\tpublic var DEPTH_TEST:Int;\n\tpublic var SCISSOR_TEST:Int;\n\tpublic var POLYGON_OFFSET_FILL:Int;\n\tpublic var SAMPLE_ALPHA_TO_COVERAGE:Int;\n\tpublic var SAMPLE_COVERAGE:Int;\n\tpublic var NO_ERROR:Int;\n\tpublic var INVALID_ENUM:Int;\n\tpublic var INVALID_VALUE:Int;\n\tpublic var INVALID_OPERATION:Int;\n\tpublic var OUT_OF_MEMORY:Int;\n\tpublic var CW:Int;\n\tpublic var CCW:Int;\n\tpublic var LINE_WIDTH:Int;\n\tpublic var ALIASED_POINT_SIZE_RANGE:Int;\n\tpublic var ALIASED_LINE_WIDTH_RANGE:Int;\n\tpublic var CULL_FACE_MODE:Int;\n\tpublic var FRONT_FACE:Int;\n\tpublic var DEPTH_RANGE:Int;\n\tpublic var DEPTH_WRITEMASK:Int;\n\tpublic var DEPTH_CLEAR_VALUE:Int;\n\tpublic var DEPTH_FUNC:Int;\n\tpublic var STENCIL_CLEAR_VALUE:Int;\n\tpublic var STENCIL_FUNC:Int;\n\tpublic var STENCIL_FAIL:Int;\n\tpublic var STENCIL_PASS_DEPTH_FAIL:Int;\n\tpublic var STENCIL_PASS_DEPTH_PASS:Int;\n\tpublic var STENCIL_REF:Int;\n\tpublic var STENCIL_VALUE_MASK:Int;\n\tpublic var STENCIL_WRITEMASK:Int;\n\tpublic var STENCIL_BACK_FUNC:Int;\n\tpublic var STENCIL_BACK_FAIL:Int;\n\tpublic var STENCIL_BACK_PASS_DEPTH_FAIL:Int;\n\tpublic var STENCIL_BACK_PASS_DEPTH_PASS:Int;\n\tpublic var STENCIL_BACK_REF:Int;\n\tpublic var STENCIL_BACK_VALUE_MASK:Int;\n\tpublic var STENCIL_BACK_WRITEMASK:Int;\n\tpublic var VIEWPORT:Int;\n\tpublic var SCISSOR_BOX:Int;\n\tpublic var COLOR_CLEAR_VALUE:Int;\n\tpublic var COLOR_WRITEMASK:Int;\n\tpublic var UNPACK_ALIGNMENT:Int;\n\tpublic var PACK_ALIGNMENT:Int;\n\tpublic var MAX_TEXTURE_SIZE:Int;\n\tpublic var MAX_VIEWPORT_DIMS:Int;\n\tpublic var SUBPIXEL_BITS:Int;\n\tpublic var RED_BITS:Int;\n\tpublic var GREEN_BITS:Int;\n\tpublic var BLUE_BITS:Int;\n\tpublic var ALPHA_BITS:Int;\n\tpublic var DEPTH_BITS:Int;\n\tpublic var STENCIL_BITS:Int;\n\tpublic var POLYGON_OFFSET_UNITS:Int;\n\tpublic var POLYGON_OFFSET_FACTOR:Int;\n\tpublic var TEXTURE_BINDING_2D:Int;\n\tpublic var SAMPLE_BUFFERS:Int;\n\tpublic var SAMPLES:Int;\n\tpublic var SAMPLE_COVERAGE_VALUE:Int;\n\tpublic var SAMPLE_COVERAGE_INVERT:Int;\n\tpublic var COMPRESSED_TEXTURE_FORMATS:Int;\n\tpublic var DONT_CARE:Int;\n\tpublic var FASTEST:Int;\n\tpublic var NICEST:Int;\n\tpublic var GENERATE_MIPMAP_HINT:Int;\n\tpublic var BYTE:Int;\n\tpublic var UNSIGNED_BYTE:Int;\n\tpublic var SHORT:Int;\n\tpublic var UNSIGNED_SHORT:Int;\n\tpublic var INT:Int;\n\tpublic var UNSIGNED_INT:Int;\n\tpublic var FLOAT:Int;\n\tpublic var DEPTH_COMPONENT:Int;\n\tpublic var ALPHA:Int;\n\tpublic var RGB:Int;\n\tpublic var RGBA:Int;\n\tpublic var LUMINANCE:Int;\n\tpublic var LUMINANCE_ALPHA:Int;\n\tpublic var UNSIGNED_SHORT_4_4_4_4:Int;\n\tpublic var UNSIGNED_SHORT_5_5_5_1:Int;\n\tpublic var UNSIGNED_SHORT_5_6_5:Int;\n\tpublic var FRAGMENT_SHADER:Int;\n\tpublic var VERTEX_SHADER:Int;\n\tpublic var MAX_VERTEX_ATTRIBS:Int;\n\tpublic var MAX_VERTEX_UNIFORM_VECTORS:Int;\n\tpublic var MAX_VARYING_VECTORS:Int;\n\tpublic var MAX_COMBINED_TEXTURE_IMAGE_UNITS:Int;\n\tpublic var MAX_VERTEX_TEXTURE_IMAGE_UNITS:Int;\n\tpublic var MAX_TEXTURE_IMAGE_UNITS:Int;\n\tpublic var MAX_FRAGMENT_UNIFORM_VECTORS:Int;\n\tpublic var SHADER_TYPE:Int;\n\tpublic var DELETE_STATUS:Int;\n\tpublic var LINK_STATUS:Int;\n\tpublic var VALIDATE_STATUS:Int;\n\tpublic var ATTACHED_SHADERS:Int;\n\tpublic var ACTIVE_UNIFORMS:Int;\n\tpublic var ACTIVE_ATTRIBUTES:Int;\n\tpublic var SHADING_LANGUAGE_VERSION:Int;\n\tpublic var CURRENT_PROGRAM:Int;\n\tpublic var NEVER:Int;\n\tpublic var LESS:Int;\n\tpublic var EQUAL:Int;\n\tpublic var LEQUAL:Int;\n\tpublic var GREATER:Int;\n\tpublic var NOTEQUAL:Int;\n\tpublic var GEQUAL:Int;\n\tpublic var ALWAYS:Int;\n\tpublic var KEEP:Int;\n\tpublic var REPLACE:Int;\n\tpublic var INCR:Int;\n\tpublic var DECR:Int;\n\tpublic var INVERT:Int;\n\tpublic var INCR_WRAP:Int;\n\tpublic var DECR_WRAP:Int;\n\tpublic var VENDOR:Int;\n\tpublic var RENDERER:Int;\n\tpublic var VERSION:Int;\n\tpublic var NEAREST:Int;\n\tpublic var LINEAR:Int;\n\tpublic var NEAREST_MIPMAP_NEAREST:Int;\n\tpublic var LINEAR_MIPMAP_NEAREST:Int;\n\tpublic var NEAREST_MIPMAP_LINEAR:Int;\n\tpublic var LINEAR_MIPMAP_LINEAR:Int;\n\tpublic var TEXTURE_MAG_FILTER:Int;\n\tpublic var TEXTURE_MIN_FILTER:Int;\n\tpublic var TEXTURE_WRAP_S:Int;\n\tpublic var TEXTURE_WRAP_T:Int;\n\tpublic var TEXTURE_2D:Int;\n\tpublic var TEXTURE:Int;\n\tpublic var TEXTURE_CUBE_MAP:Int;\n\tpublic var TEXTURE_BINDING_CUBE_MAP:Int;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_X:Int;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_X:Int;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_Y:Int;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_Y:Int;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_Z:Int;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_Z:Int;\n\tpublic var MAX_CUBE_MAP_TEXTURE_SIZE:Int;\n\tpublic var TEXTURE0:Int;\n\tpublic var TEXTURE1:Int;\n\tpublic var TEXTURE2:Int;\n\tpublic var TEXTURE3:Int;\n\tpublic var TEXTURE4:Int;\n\tpublic var TEXTURE5:Int;\n\tpublic var TEXTURE6:Int;\n\tpublic var TEXTURE7:Int;\n\tpublic var TEXTURE8:Int;\n\tpublic var TEXTURE9:Int;\n\tpublic var TEXTURE10:Int;\n\tpublic var TEXTURE11:Int;\n\tpublic var TEXTURE12:Int;\n\tpublic var TEXTURE13:Int;\n\tpublic var TEXTURE14:Int;\n\tpublic var TEXTURE15:Int;\n\tpublic var TEXTURE16:Int;\n\tpublic var TEXTURE17:Int;\n\tpublic var TEXTURE18:Int;\n\tpublic var TEXTURE19:Int;\n\tpublic var TEXTURE20:Int;\n\tpublic var TEXTURE21:Int;\n\tpublic var TEXTURE22:Int;\n\tpublic var TEXTURE23:Int;\n\tpublic var TEXTURE24:Int;\n\tpublic var TEXTURE25:Int;\n\tpublic var TEXTURE26:Int;\n\tpublic var TEXTURE27:Int;\n\tpublic var TEXTURE28:Int;\n\tpublic var TEXTURE29:Int;\n\tpublic var TEXTURE30:Int;\n\tpublic var TEXTURE31:Int;\n\tpublic var ACTIVE_TEXTURE:Int;\n\tpublic var REPEAT:Int;\n\tpublic var CLAMP_TO_EDGE:Int;\n\tpublic var MIRRORED_REPEAT:Int;\n\tpublic var FLOAT_VEC2:Int;\n\tpublic var FLOAT_VEC3:Int;\n\tpublic var FLOAT_VEC4:Int;\n\tpublic var INT_VEC2:Int;\n\tpublic var INT_VEC3:Int;\n\tpublic var INT_VEC4:Int;\n\tpublic var BOOL:Int;\n\tpublic var BOOL_VEC2:Int;\n\tpublic var BOOL_VEC3:Int;\n\tpublic var BOOL_VEC4:Int;\n\tpublic var FLOAT_MAT2:Int;\n\tpublic var FLOAT_MAT3:Int;\n\tpublic var FLOAT_MAT4:Int;\n\tpublic var SAMPLER_2D:Int;\n\tpublic var SAMPLER_CUBE:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_ENABLED:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_SIZE:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_STRIDE:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_TYPE:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_NORMALIZED:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_POINTER:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:Int;\n\tpublic var COMPILE_STATUS:Int;\n\tpublic var LOW_FLOAT:Int;\n\tpublic var MEDIUM_FLOAT:Int;\n\tpublic var HIGH_FLOAT:Int;\n\tpublic var LOW_INT:Int;\n\tpublic var MEDIUM_INT:Int;\n\tpublic var HIGH_INT:Int;\n\tpublic var FRAMEBUFFER:Int;\n\tpublic var RENDERBUFFER:Int;\n\tpublic var RGBA4:Int;\n\tpublic var RGB5_A1:Int;\n\tpublic var RGB565:Int;\n\tpublic var DEPTH_COMPONENT16:Int;\n\tpublic var STENCIL_INDEX:Int;\n\tpublic var STENCIL_INDEX8:Int;\n\tpublic var DEPTH_STENCIL:Int;\n\tpublic var RENDERBUFFER_WIDTH:Int;\n\tpublic var RENDERBUFFER_HEIGHT:Int;\n\tpublic var RENDERBUFFER_INTERNAL_FORMAT:Int;\n\tpublic var RENDERBUFFER_RED_SIZE:Int;\n\tpublic var RENDERBUFFER_GREEN_SIZE:Int;\n\tpublic var RENDERBUFFER_BLUE_SIZE:Int;\n\tpublic var RENDERBUFFER_ALPHA_SIZE:Int;\n\tpublic var RENDERBUFFER_DEPTH_SIZE:Int;\n\tpublic var RENDERBUFFER_STENCIL_SIZE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:Int;\n\tpublic var COLOR_ATTACHMENT0:Int;\n\tpublic var DEPTH_ATTACHMENT:Int;\n\tpublic var STENCIL_ATTACHMENT:Int;\n\tpublic var DEPTH_STENCIL_ATTACHMENT:Int;\n\tpublic var NONE:Int;\n\tpublic var FRAMEBUFFER_COMPLETE:Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_ATTACHMENT:Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_DIMENSIONS:Int;\n\tpublic var FRAMEBUFFER_UNSUPPORTED:Int;\n\tpublic var FRAMEBUFFER_BINDING:Int;\n\tpublic var RENDERBUFFER_BINDING:Int;\n\tpublic var MAX_RENDERBUFFER_SIZE:Int;\n\tpublic var INVALID_FRAMEBUFFER_OPERATION:Int;\n\tpublic var UNPACK_FLIP_Y_WEBGL:Int;\n\tpublic var UNPACK_PREMULTIPLY_ALPHA_WEBGL:Int;\n\tpublic var CONTEXT_LOST_WEBGL:Int;\n\tpublic var UNPACK_COLORSPACE_CONVERSION_WEBGL:Int;\n\tpublic var BROWSER_DEFAULT_WEBGL:Int;\n\tpublic var READ_BUFFER:Int;\n\tpublic var UNPACK_ROW_LENGTH:Int;\n\tpublic var UNPACK_SKIP_ROWS:Int;\n\tpublic var UNPACK_SKIP_PIXELS:Int;\n\tpublic var PACK_ROW_LENGTH:Int;\n\tpublic var PACK_SKIP_ROWS:Int;\n\tpublic var PACK_SKIP_PIXELS:Int;\n\tpublic var TEXTURE_BINDING_3D:Int;\n\tpublic var UNPACK_SKIP_IMAGES:Int;\n\tpublic var UNPACK_IMAGE_HEIGHT:Int;\n\tpublic var MAX_3D_TEXTURE_SIZE:Int;\n\tpublic var MAX_ELEMENTS_VERTICES:Int;\n\tpublic var MAX_ELEMENTS_INDICES:Int;\n\tpublic var MAX_TEXTURE_LOD_BIAS:Int;\n\tpublic var MAX_FRAGMENT_UNIFORM_COMPONENTS:Int;\n\tpublic var MAX_VERTEX_UNIFORM_COMPONENTS:Int;\n\tpublic var MAX_ARRAY_TEXTURE_LAYERS:Int;\n\tpublic var MIN_PROGRAM_TEXEL_OFFSET:Int;\n\tpublic var MAX_PROGRAM_TEXEL_OFFSET:Int;\n\tpublic var MAX_VARYING_COMPONENTS:Int;\n\tpublic var FRAGMENT_SHADER_DERIVATIVE_HINT:Int;\n\tpublic var RASTERIZER_DISCARD:Int;\n\tpublic var VERTEX_ARRAY_BINDING:Int;\n\tpublic var MAX_VERTEX_OUTPUT_COMPONENTS:Int;\n\tpublic var MAX_FRAGMENT_INPUT_COMPONENTS:Int;\n\tpublic var MAX_SERVER_WAIT_TIMEOUT:Int;\n\tpublic var MAX_ELEMENT_INDEX:Int;\n\tpublic var RED:Int;\n\tpublic var RGB8:Int;\n\tpublic var RGBA8:Int;\n\tpublic var RGB10_A2:Int;\n\tpublic var TEXTURE_3D:Int;\n\tpublic var TEXTURE_WRAP_R:Int;\n\tpublic var TEXTURE_MIN_LOD:Int;\n\tpublic var TEXTURE_MAX_LOD:Int;\n\tpublic var TEXTURE_BASE_LEVEL:Int;\n\tpublic var TEXTURE_MAX_LEVEL:Int;\n\tpublic var TEXTURE_COMPARE_MODE:Int;\n\tpublic var TEXTURE_COMPARE_FUNC:Int;\n\tpublic var SRGB:Int;\n\tpublic var SRGB8:Int;\n\tpublic var SRGB8_ALPHA8:Int;\n\tpublic var COMPARE_REF_TO_TEXTURE:Int;\n\tpublic var RGBA32F:Int;\n\tpublic var RGB32F:Int;\n\tpublic var RGBA16F:Int;\n\tpublic var RGB16F:Int;\n\tpublic var TEXTURE_2D_ARRAY:Int;\n\tpublic var TEXTURE_BINDING_2D_ARRAY:Int;\n\tpublic var R11F_G11F_B10F:Int;\n\tpublic var RGB9_E5:Int;\n\tpublic var RGBA32UI:Int;\n\tpublic var RGB32UI:Int;\n\tpublic var RGBA16UI:Int;\n\tpublic var RGB16UI:Int;\n\tpublic var RGBA8UI:Int;\n\tpublic var RGB8UI:Int;\n\tpublic var RGBA32I:Int;\n\tpublic var RGB32I:Int;\n\tpublic var RGBA16I:Int;\n\tpublic var RGB16I:Int;\n\tpublic var RGBA8I:Int;\n\tpublic var RGB8I:Int;\n\tpublic var RED_INTEGER:Int;\n\tpublic var RGB_INTEGER:Int;\n\tpublic var RGBA_INTEGER:Int;\n\tpublic var R8:Int;\n\tpublic var RG8:Int;\n\tpublic var R16F:Int;\n\tpublic var R32F:Int;\n\tpublic var RG16F:Int;\n\tpublic var RG32F:Int;\n\tpublic var R8I:Int;\n\tpublic var R8UI:Int;\n\tpublic var R16I:Int;\n\tpublic var R16UI:Int;\n\tpublic var R32I:Int;\n\tpublic var R32UI:Int;\n\tpublic var RG8I:Int;\n\tpublic var RG8UI:Int;\n\tpublic var RG16I:Int;\n\tpublic var RG16UI:Int;\n\tpublic var RG32I:Int;\n\tpublic var RG32UI:Int;\n\tpublic var R8_SNORM:Int;\n\tpublic var RG8_SNORM:Int;\n\tpublic var RGB8_SNORM:Int;\n\tpublic var RGBA8_SNORM:Int;\n\tpublic var RGB10_A2UI:Int;\n\tpublic var TEXTURE_IMMUTABLE_FORMAT:Int;\n\tpublic var TEXTURE_IMMUTABLE_LEVELS:Int;\n\tpublic var UNSIGNED_INT_2_10_10_10_REV:Int;\n\tpublic var UNSIGNED_INT_10F_11F_11F_REV:Int;\n\tpublic var UNSIGNED_INT_5_9_9_9_REV:Int;\n\tpublic var FLOAT_32_UNSIGNED_INT_24_8_REV:Int;\n\tpublic var UNSIGNED_INT_24_8:Int;\n\tpublic var HALF_FLOAT:Int;\n\tpublic var RG:Int;\n\tpublic var RG_INTEGER:Int;\n\tpublic var INT_2_10_10_10_REV:Int;\n\tpublic var CURRENT_QUERY:Int;\n\tpublic var QUERY_RESULT:Int;\n\tpublic var QUERY_RESULT_AVAILABLE:Int;\n\tpublic var ANY_SAMPLES_PASSED:Int;\n\tpublic var ANY_SAMPLES_PASSED_CONSERVATIVE:Int;\n\tpublic var MAX_DRAW_BUFFERS:Int;\n\tpublic var DRAW_BUFFER0:Int;\n\tpublic var DRAW_BUFFER1:Int;\n\tpublic var DRAW_BUFFER2:Int;\n\tpublic var DRAW_BUFFER3:Int;\n\tpublic var DRAW_BUFFER4:Int;\n\tpublic var DRAW_BUFFER5:Int;\n\tpublic var DRAW_BUFFER6:Int;\n\tpublic var DRAW_BUFFER7:Int;\n\tpublic var DRAW_BUFFER8:Int;\n\tpublic var DRAW_BUFFER9:Int;\n\tpublic var DRAW_BUFFER10:Int;\n\tpublic var DRAW_BUFFER11:Int;\n\tpublic var DRAW_BUFFER12:Int;\n\tpublic var DRAW_BUFFER13:Int;\n\tpublic var DRAW_BUFFER14:Int;\n\tpublic var DRAW_BUFFER15:Int;\n\tpublic var MAX_COLOR_ATTACHMENTS:Int;\n\tpublic var COLOR_ATTACHMENT1:Int;\n\tpublic var COLOR_ATTACHMENT2:Int;\n\tpublic var COLOR_ATTACHMENT3:Int;\n\tpublic var COLOR_ATTACHMENT4:Int;\n\tpublic var COLOR_ATTACHMENT5:Int;\n\tpublic var COLOR_ATTACHMENT6:Int;\n\tpublic var COLOR_ATTACHMENT7:Int;\n\tpublic var COLOR_ATTACHMENT8:Int;\n\tpublic var COLOR_ATTACHMENT9:Int;\n\tpublic var COLOR_ATTACHMENT10:Int;\n\tpublic var COLOR_ATTACHMENT11:Int;\n\tpublic var COLOR_ATTACHMENT12:Int;\n\tpublic var COLOR_ATTACHMENT13:Int;\n\tpublic var COLOR_ATTACHMENT14:Int;\n\tpublic var COLOR_ATTACHMENT15:Int;\n\tpublic var SAMPLER_3D:Int;\n\tpublic var SAMPLER_2D_SHADOW:Int;\n\tpublic var SAMPLER_2D_ARRAY:Int;\n\tpublic var SAMPLER_2D_ARRAY_SHADOW:Int;\n\tpublic var SAMPLER_CUBE_SHADOW:Int;\n\tpublic var INT_SAMPLER_2D:Int;\n\tpublic var INT_SAMPLER_3D:Int;\n\tpublic var INT_SAMPLER_CUBE:Int;\n\tpublic var INT_SAMPLER_2D_ARRAY:Int;\n\tpublic var UNSIGNED_INT_SAMPLER_2D:Int;\n\tpublic var UNSIGNED_INT_SAMPLER_3D:Int;\n\tpublic var UNSIGNED_INT_SAMPLER_CUBE:Int;\n\tpublic var UNSIGNED_INT_SAMPLER_2D_ARRAY:Int;\n\tpublic var MAX_SAMPLES:Int;\n\tpublic var SAMPLER_BINDING:Int;\n\tpublic var PIXEL_PACK_BUFFER:Int;\n\tpublic var PIXEL_UNPACK_BUFFER:Int;\n\tpublic var PIXEL_PACK_BUFFER_BINDING:Int;\n\tpublic var PIXEL_UNPACK_BUFFER_BINDING:Int;\n\tpublic var COPY_READ_BUFFER:Int;\n\tpublic var COPY_WRITE_BUFFER:Int;\n\tpublic var COPY_READ_BUFFER_BINDING:Int;\n\tpublic var COPY_WRITE_BUFFER_BINDING:Int;\n\tpublic var FLOAT_MAT2x3:Int;\n\tpublic var FLOAT_MAT2x4:Int;\n\tpublic var FLOAT_MAT3x2:Int;\n\tpublic var FLOAT_MAT3x4:Int;\n\tpublic var FLOAT_MAT4x2:Int;\n\tpublic var FLOAT_MAT4x3:Int;\n\tpublic var UNSIGNED_INT_VEC2:Int;\n\tpublic var UNSIGNED_INT_VEC3:Int;\n\tpublic var UNSIGNED_INT_VEC4:Int;\n\tpublic var UNSIGNED_NORMALIZED:Int;\n\tpublic var SIGNED_NORMALIZED:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_INTEGER:Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_DIVISOR:Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_MODE:Int;\n\tpublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:Int;\n\tpublic var TRANSFORM_FEEDBACK_VARYINGS:Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_START:Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_SIZE:Int;\n\tpublic var TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:Int;\n\tpublic var MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:Int;\n\tpublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:Int;\n\tpublic var INTERLEAVED_ATTRIBS:Int;\n\tpublic var SEPARATE_ATTRIBS:Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER:Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_BINDING:Int;\n\tpublic var TRANSFORM_FEEDBACK:Int;\n\tpublic var TRANSFORM_FEEDBACK_PAUSED:Int;\n\tpublic var TRANSFORM_FEEDBACK_ACTIVE:Int;\n\tpublic var TRANSFORM_FEEDBACK_BINDING:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_RED_SIZE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:Int;\n\tpublic var FRAMEBUFFER_DEFAULT:Int;\n\tpublic var DEPTH24_STENCIL8:Int;\n\tpublic var DRAW_FRAMEBUFFER_BINDING:Int;\n\tpublic var READ_FRAMEBUFFER:Int;\n\tpublic var DRAW_FRAMEBUFFER:Int;\n\tpublic var READ_FRAMEBUFFER_BINDING:Int;\n\tpublic var RENDERBUFFER_SAMPLES:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:Int;\n\tpublic var UNIFORM_BUFFER:Int;\n\tpublic var UNIFORM_BUFFER_BINDING:Int;\n\tpublic var UNIFORM_BUFFER_START:Int;\n\tpublic var UNIFORM_BUFFER_SIZE:Int;\n\tpublic var MAX_VERTEX_UNIFORM_BLOCKS:Int;\n\tpublic var MAX_FRAGMENT_UNIFORM_BLOCKS:Int;\n\tpublic var MAX_COMBINED_UNIFORM_BLOCKS:Int;\n\tpublic var MAX_UNIFORM_BUFFER_BINDINGS:Int;\n\tpublic var MAX_UNIFORM_BLOCK_SIZE:Int;\n\tpublic var MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:Int;\n\tpublic var MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:Int;\n\tpublic var UNIFORM_BUFFER_OFFSET_ALIGNMENT:Int;\n\tpublic var ACTIVE_UNIFORM_BLOCKS:Int;\n\tpublic var UNIFORM_TYPE:Int;\n\tpublic var UNIFORM_SIZE:Int;\n\tpublic var UNIFORM_BLOCK_INDEX:Int;\n\tpublic var UNIFORM_OFFSET:Int;\n\tpublic var UNIFORM_ARRAY_STRIDE:Int;\n\tpublic var UNIFORM_MATRIX_STRIDE:Int;\n\tpublic var UNIFORM_IS_ROW_MAJOR:Int;\n\tpublic var UNIFORM_BLOCK_BINDING:Int;\n\tpublic var UNIFORM_BLOCK_DATA_SIZE:Int;\n\tpublic var UNIFORM_BLOCK_ACTIVE_UNIFORMS:Int;\n\tpublic var UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:Int;\n\tpublic var UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:Int;\n\tpublic var UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:Int;\n\tpublic var OBJECT_TYPE:Int;\n\tpublic var SYNC_CONDITION:Int;\n\tpublic var SYNC_STATUS:Int;\n\tpublic var SYNC_FLAGS:Int;\n\tpublic var SYNC_FENCE:Int;\n\tpublic var SYNC_GPU_COMMANDS_COMPLETE:Int;\n\tpublic var UNSIGNALED:Int;\n\tpublic var SIGNALED:Int;\n\tpublic var ALREADY_SIGNALED:Int;\n\tpublic var TIMEOUT_EXPIRED:Int;\n\tpublic var CONDITION_SATISFIED:Int;\n\tpublic var WAIT_FAILED:Int;\n\tpublic var SYNC_FLUSH_COMMANDS_BIT:Int;\n\tpublic var COLOR:Int;\n\tpublic var DEPTH:Int;\n\tpublic var STENCIL:Int;\n\tpublic var MIN:Int;\n\tpublic var MAX:Int;\n\tpublic var DEPTH_COMPONENT24:Int;\n\tpublic var STREAM_READ:Int;\n\tpublic var STREAM_COPY:Int;\n\tpublic var STATIC_READ:Int;\n\tpublic var STATIC_COPY:Int;\n\tpublic var DYNAMIC_READ:Int;\n\tpublic var DYNAMIC_COPY:Int;\n\tpublic var DEPTH_COMPONENT32F:Int;\n\tpublic var DEPTH32F_STENCIL8:Int;\n\tpublic var INVALID_INDEX:Int;\n\tpublic var TIMEOUT_IGNORED:Int;\n\tpublic var MAX_CLIENT_WAIT_TIMEOUT_WEBGL:Int;\n\tpublic function beginQuery(target:Int, query:GLQuery):Void;\n\tpublic function beginTransformFeedback(primitiveNode:Int):Void;\n\tpublic function bindBufferBase(target:Int, index:Int, buffer:GLBuffer):Void;\n\tpublic function bindBufferRange(target:Int, index:Int, buffer:GLBuffer, offset:DataPointer, size:DataPointer):Void;\n\tpublic function bindSampler(unit:Int, sampler:GLSampler):Void;\n\tpublic function bindTransformFeedback(target:Int, transformFeedback:GLTransformFeedback):Void;\n\tpublic function bindVertexArray(vertexArray:GLVertexArrayObject):Void;\n\tpublic function blitFramebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int, dstY0:Int, dstX1:Int, dstY1:Int, mask:Int, filter:Int):Void;\n\t@:overload(function(target:Int, data:ArrayBufferView, usage:Int, srcOffset:Int, ?length:Int):Void {})\n\t@:overload(function(target:Int, size:Int, usage:Int):Void {})\n\t@:overload(function(target:Int, data:ArrayBufferView, usage:Int):Void {})\n\t@:overload(function(target:Int, data:ArrayBuffer, usage:Int):Void {})\n\toverride function bufferData(target:Int, data:Dynamic /*MISSING SharedArrayBuffer*/, usage:Int):Void;\n\t@:overload(function(target:Int, dstByteOffset:Int, srcData:ArrayBufferView, srcOffset:Int, ?length:Int):Void {})\n\t@:overload(function(target:Int, offset:Int, data:ArrayBufferView):Void {})\n\t@:overload(function(target:Int, offset:Int, data:ArrayBuffer):Void {})\n\toverride function bufferSubData(target:Int, offset:Int, data:Dynamic /*MISSING SharedArrayBuffer*/):Void;\n\tpublic function clearBufferfi(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void;\n\t@:overload(function(buffer:Int, drawbuffer:Int, values:Float32Array, ?srcOffset:Int):Void {})\n\t@:overload(function(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void {})\n\tpublic function clearBufferfv(buffer:Int, drawbuffer:Int, values:Array<Float>, ?srcOffset:Int):Void;\n\t@:overload(function(buffer:Int, drawbuffer:Int, values:Int32Array, ?srcOffset:Int):Void {})\n\t@:overload(function(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void {})\n\tpublic function clearBufferiv(buffer:Int, drawbuffer:Int, values:Array<Int>, ?srcOffset:Int):Void;\n\t@:overload(function(buffer:Int, drawbuffer:Int, values:UInt32Array, ?srcOffset:Int):Void {})\n\t@:overload(function(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void {})\n\tpublic function clearBufferuiv(buffer:Int, drawbuffer:Int, values:Array<Int>, ?srcOffset:Int):Void;\n\tpublic function clientWaitSync(sync:GLSync, flags:Int, timeout:Dynamic /*Int64*/):Int;\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, offset:Int):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, srcData:ArrayBufferView, ?srcOffset:Int,\n\t\t?srcLengthOverride:Int):Void {})\n\toverride function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, data:ArrayBufferView):Void;\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, offset:Int):Void {})\n\tpublic function compressedTexImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, srcData:ArrayBufferView,\n\t\t?srcOffset:Int, ?srcLengthOverride:Int):Void;\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, offset:Int):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, srcData:ArrayBufferView, ?srcOffset:Int,\n\t\t?srcLengthOverride:Int):Void {})\n\toverride function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, data:ArrayBufferView):Void;\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, offset:Int):Void {})\n\tpublic function compressedTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int,\n\t\tsrcData:ArrayBufferView, ?srcOffset:Int, ?srcLengthOverride:Int):Void;\n\tpublic function copySubBufferData(readTarget:Int, writeTarget:Int, readOffset:DataPointer, writeOffset:DataPointer, size:Int):Void;\n\tpublic function copyTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int, height:Int):Void;\n\tpublic function createQuery():GLQuery;\n\tpublic function createSampler():GLSampler;\n\tpublic function createTransformFeedback():GLTransformFeedback;\n\tpublic function createVertexArray():GLVertexArrayObject;\n\tpublic function deleteQuery(query:GLQuery):Void;\n\tpublic function deleteSampler(sampler:GLSampler):Void;\n\tpublic function deleteSync(sync:GLSync):Void;\n\tpublic function deleteTransformFeedback(transformFeedback:GLTransformFeedback):Void;\n\tpublic function deleteVertexArray(vertexArray:GLVertexArrayObject):Void;\n\tpublic function drawArraysInstanced(mode:Int, first:Int, count:Int, instanceCount:Int):Void;\n\tpublic function drawBuffers(buffers:Array<Int>):Void;\n\tpublic function drawElementsInstanced(mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void;\n\tpublic function drawRangeElements(mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void;\n\tpublic function endQuery(target:Int):Void;\n\tpublic function endTransformFeedback():Void;\n\tpublic function fenceSync(condition:Int, flags:Int):GLSync;\n\tpublic function framebufferTextureLayer(target:Int, attachment:Int, texture:GLTexture, level:Int, layer:Int):Void;\n\tpublic function getActiveUniformBlockName(program:GLProgram, uniformBlockIndex:Int):String;\n\tpublic function getActiveUniformBlockParameter(program:GLProgram, uniformBlockIndex:Int, pname:Int):Dynamic;\n\tpublic function getActiveUniforms(program:GLProgram, uniformIndices:Array<Int>, pname:Int):Dynamic;\n\t@:overload(function(target:Int, srcByteOffset:DataPointer, dstData:ArrayBuffer, ?srcOffset:Int, ?length:Int):Void {})\n\tpublic function getBufferSubData(target:Int, srcByteOffset:DataPointer, dstData:Dynamic /*SharedArrayBuffer*/, ?srcOffset:Int, ?length:Int):Void;\n\tpublic function getFragDataLocation(program:GLProgram, name:String):Int;\n\tpublic function getIndexedParameter(target:Int, index:Int):Dynamic;\n\tpublic function getInternalformatParameter(target:Int, internalformat:Int, pname:Int):Dynamic;\n\tpublic function getQuery(target:Int, pname:Int):GLQuery;\n\tpublic function getQueryParameter(query:GLQuery, pname:Int):Dynamic;\n\tpublic function getSamplerParameter(sampler:GLSampler, pname:Int):Dynamic;\n\tpublic function getSyncParameter(sync:GLSync, pname:Int):Dynamic;\n\tpublic function getTransformFeedbackVarying(program:GLProgram, index:Int):GLActiveInfo;\n\tpublic function getUniformBlockIndex(program:GLProgram, uniformBlockName:String):Int;\n\t@:overload(function(program:GLProgram, uniformNames:String):Array<Int> {})\n\tpublic function getUniformIndices(program:GLProgram, uniformNames:Array<String>):Array<Int>;\n\tpublic function invalidateFramebuffer(target:Int, attachments:Array<Int>):Void;\n\tpublic function invalidateSubFramebuffer(target:Int, attachments:Array<Int>, x:Int, y:Int, width:Int, height:Int):Void;\n\tpublic function isQuery(query:GLQuery):Bool;\n\tpublic function isSampler(sampler:GLSampler):Bool;\n\tpublic function isSync(sync:GLSync):Bool;\n\tpublic function isTransformFeedback(transformFeedback:GLTransformFeedback):Bool;\n\tpublic function isVertexArray(vertexArray:GLVertexArrayObject):Bool;\n\tpublic function pauseTransformFeedback():Void;\n\tpublic function readBuffer(src:Int):Void;\n\t@:overload(function(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:ArrayBufferView):Void {})\n\t@:overload(function(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, offset:Int):Void {})\n\t@:overload(function(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:ArrayBufferView, dstOffset:Int):Void {})\n\toverride function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:ArrayBufferView):Void;\n\tpublic function renderbufferStorageMultisample(target:Int, samples:Int, internalFormat:Int, width:Int, height:Int):Void;\n\tpublic function resumeTransformFeedback():Void;\n\tpublic function samplerParameterf(sampler:GLSampler, pname:Int, param:Float):Void;\n\tpublic function samplerParameteri(sampler:GLSampler, pname:Int, param:Int):Void;\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, offset:DataPointer):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, srcData:ArrayBufferView,\n\t\tsrcOffset:Int):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\tsource:Dynamic /*js.html.ImageBitmap*/):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, source:js.html.ImageData):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.ImageElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.CanvasElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.VideoElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, pixels:ArrayBufferView):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, format:Int, type:Int, pixels:js.html.ImageData):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, format:Int, type:Int, image:js.html.ImageElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, format:Int, type:Int, canvas:js.html.CanvasElement):Void {})\n\toverride function texImage2D(target:Int, level:Int, internalformat:Int, format:Int, type:Int, video:js.html.VideoElement):Void;\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.CanvasElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.ImageElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.VideoElement):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsource:Dynamic /*js.html.ImageBitmap*/):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsource:js.html.ImageData):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsource:ArrayBufferView):Void {})\n\t@:overload(function(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\toffset:DataPointer):Void {})\n\tpublic function texImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tsrcData:ArrayBufferView, ?srcOffset:Int):Void;\n\tpublic function texStorage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int):Void;\n\tpublic function texStorage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void;\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, srcData:ArrayBufferView,\n\t\tsrcOffset:Int):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, offset:DataPointer):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, source:js.html.ImageData):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, source:js.html.ImageElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, source:js.html.CanvasElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, source:js.html.VideoElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, source:Dynamic /*ImageBitmap*/):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, pixels:ArrayBufferView):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, pixels:js.html.ImageData):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, image:js.html.ImageElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, canvas:js.html.CanvasElement):Void {})\n\toverride function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, video:js.html.VideoElement):Void;\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\toffset:DataPointer):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tsource:js.html.ImageData):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tsource:js.html.ImageElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tsource:js.html.CanvasElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tsource:js.html.VideoElement):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tsource:Dynamic /*ImageBitmap*/):Void {})\n\t@:overload(function(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tpixels:ArrayBufferView, ?srcOffset:Int):Void {})\n\tpublic function texSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tvideo:js.html.VideoElement):Void;\n\tpublic function transformFeedbackVaryings(program:GLProgram, varyings:Array<String>, bufferMode:Int):Void;\n\tpublic function uniform1ui(location:GLUniformLocation, v0:Int):Void;\n\tpublic function uniform2ui(location:GLUniformLocation, v0:Int, v1:Int):Void;\n\tpublic function uniform3ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void;\n\tpublic function uniform4ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\t@:overload(function(location:GLUniformLocation, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform1fv(location:GLUniformLocation, data:Array<Float>):Void;\n\t@:overload(function(location:GLUniformLocation, data:Int32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Int>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform1iv(location:GLUniformLocation, data:Array<Int>):Void;\n\tpublic function uniform1uiv(location:GLUniformLocation, data:UInt32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\t@:overload(function(location:GLUniformLocation, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform2fv(location:GLUniformLocation, data:Array<Float>):Void;\n\t@:overload(function(location:GLUniformLocation, data:Int32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Int>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform2iv(location:GLUniformLocation, data:Array<Int>):Void;\n\tpublic function uniform2uiv(location:GLUniformLocation, data:UInt32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\t@:overload(function(location:GLUniformLocation, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform3fv(location:GLUniformLocation, data:Array<Float>):Void;\n\t@:overload(function(location:GLUniformLocation, data:Int32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Int>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform3iv(location:GLUniformLocation, data:Array<Int>):Void;\n\tpublic function uniform3uiv(location:GLUniformLocation, data:UInt32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\t@:overload(function(location:GLUniformLocation, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform4fv(location:GLUniformLocation, data:Array<Float>):Void;\n\t@:overload(function(location:GLUniformLocation, data:Int32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, data:Array<Int>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniform4iv(location:GLUniformLocation, data:Array<Int>):Void;\n\tpublic function uniform4uiv(location:GLUniformLocation, data:UInt32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\tpublic function uniformBlockBinding(program:GLProgram, uniformBlockIndex:Int, uniformBlockBinding:Int):Void;\n\t@:overload(function(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, transpose:Bool, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniformMatrix2fv(location:GLUniformLocation, transpose:Bool, data:Array<Float>):Void;\n\tpublic function uniformMatrix2x3fv(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\tpublic function uniformMatrix2x4fv(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\t@:overload(function(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, transpose:Bool, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniformMatrix3fv(location:GLUniformLocation, transpose:Bool, data:Array<Float>):Void;\n\tpublic function uniformMatrix3x2fv(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\tpublic function uniformMatrix3x4fv(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\t@:overload(function(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void {})\n\t@:overload(function(location:GLUniformLocation, transpose:Bool, data:Array<Float>, ?srcOffset:Int, ?srcLength:Int):Void {})\n\toverride function uniformMatrix4fv(location:GLUniformLocation, transpose:Bool, data:Array<Float>):Void;\n\tpublic function uniformMatrix4x2fv(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\tpublic function uniformMatrix4x3fv(location:GLUniformLocation, transpose:Bool, data:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void;\n\tpublic function vertexAttribDivisor(index:Int, divisor:Int):Void;\n\tpublic function vertexAttribI4i(index:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\tpublic function vertexAttribI4ui(index:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\t@:overload(function(index:Int, value:Int32Array):Void {})\n\tpublic function vertexAttribI4iv(index:Int, value:Array<Int>):Void;\n\t@:overload(function(index:Int, value:UInt32Array):Void {})\n\tpublic function vertexAttribI4uiv(index:Int, value:Array<Int>):Void;\n\tpublic function vertexAttribIPointer(index:Int, size:Int, type:Int, stride:Int, offset:DataPointer):Void;\n\tpublic function waitSync(sync:GLSync, flags:Int, timeout:Dynamic /*int64*/):Void;\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/html5/HTML5Window.hx",
    "content": "package lime._internal.backend.html5;\n\nimport haxe.Timer;\nimport js.html.webgl.RenderingContext;\nimport js.html.CanvasElement;\nimport js.html.DivElement;\nimport js.html.DragEvent;\nimport js.html.Element;\nimport js.html.FocusEvent;\nimport js.html.InputElement;\nimport js.html.InputEvent;\nimport js.html.LinkElement;\nimport js.html.MouseEvent;\nimport js.html.Node;\nimport js.html.TextAreaElement;\nimport js.html.TouchEvent;\nimport js.html.ClipboardEvent;\nimport js.Browser;\nimport lime._internal.graphics.ImageCanvasUtil;\nimport lime.app.Application;\nimport lime.graphics.opengl.GL;\nimport lime.graphics.Image;\nimport lime.graphics.OpenGLRenderContext;\nimport lime.graphics.RenderContext;\nimport lime.graphics.RenderContextType;\nimport lime.math.Rectangle;\nimport lime.system.Display;\nimport lime.system.DisplayMode;\nimport lime.system.System;\nimport lime.system.Clipboard;\nimport lime.ui.Gamepad;\nimport lime.ui.Joystick;\nimport lime.ui.MouseCursor;\nimport lime.ui.MouseWheelMode;\nimport lime.ui.Touch;\nimport lime.ui.Window;\n\n@:access(lime._internal.backend.html5.HTML5Application)\n@:access(lime._internal.backend.html5.HTML5WebGL2RenderContext)\n@:access(lime.app.Application)\n@:access(lime.graphics.opengl.GL)\n@:access(lime.graphics.OpenGLRenderContext)\n@:access(lime.graphics.RenderContext)\n@:access(lime.ui.Gamepad)\n@:access(lime.ui.Joystick)\n@:access(lime.ui.Window)\nclass HTML5Window\n{\n\tprivate static var dummyCharacter = String.fromCharCode(127);\n\tprivate static var textArea:TextAreaElement;\n\tprivate static var textInput:InputElement;\n\tprivate static var windowID:Int = 0;\n\n\tpublic var canvas:CanvasElement;\n\tpublic var div:DivElement;\n\t#if stats\n\tpublic var stats:Dynamic;\n\t#end\n\n\tprivate var cacheElementHeight:Float;\n\tprivate var cacheElementWidth:Float;\n\tprivate var cacheMouseX:Float;\n\tprivate var cacheMouseY:Float;\n\tprivate var cursor:MouseCursor;\n\tprivate var currentTouches = new Map<Int, Touch>();\n\tprivate var isFullscreen:Bool;\n\tprivate var parent:Window;\n\tprivate var primaryTouch:Touch;\n\tprivate var renderType:RenderContextType;\n\tprivate var requestedFullscreen:Bool;\n\tprivate var resizeElement:Bool;\n\tprivate var scale = 1.0;\n\tprivate var setHeight:Int;\n\tprivate var setWidth:Int;\n\tprivate var textInputEnabled:Bool;\n\tprivate var textInputRect:Rectangle;\n\tprivate var unusedTouchesPool = new List<Touch>();\n\n\tprivate var __focusPending:Bool;\n\n\tprivate var __stopMousePropagation = false;\n\n\tpublic function new(parent:Window)\n\t{\n\t\tthis.parent = parent;\n\n\t\tcursor = DEFAULT;\n\t\tcacheMouseX = 0;\n\t\tcacheMouseY = 0;\n\n\t\tvar attributes = parent.__attributes;\n\t\tif (!Reflect.hasField(attributes, \"context\")) attributes.context = {};\n\n\t\t#if dom\n\t\tattributes.context.type = DOM;\n\t\tattributes.context.version = \"\";\n\t\t#end\n\n\t\trenderType = attributes.context.type;\n\n\t\tif (Reflect.hasField(attributes, \"element\"))\n\t\t{\n\t\t\tparent.element = attributes.element;\n\t\t}\n\n\t\tvar element = parent.element;\n\n\t\tif (Reflect.hasField(attributes, \"allowHighDPI\") && attributes.allowHighDPI && renderType != DOM)\n\t\t{\n\t\t\tscale = Browser.window.devicePixelRatio;\n\t\t}\n\n\t\tparent.__scale = scale;\n\n\t\tsetWidth = Reflect.hasField(attributes, \"width\") ? attributes.width : 0;\n\t\tsetHeight = Reflect.hasField(attributes, \"height\") ? attributes.height : 0;\n\t\tparent.__width = setWidth;\n\t\tparent.__height = setHeight;\n\n\t\tparent.id = windowID++;\n\n\t\tif ((element is CanvasElement))\n\t\t{\n\t\t\tcanvas = cast element;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (renderType == DOM)\n\t\t\t{\n\t\t\t\tdiv = cast Browser.document.createElement(\"div\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcanvas = cast Browser.document.createElement(\"canvas\");\n\t\t\t}\n\t\t}\n\n\t\tif (canvas != null)\n\t\t{\n\t\t\tvar style = canvas.style;\n\t\t\tstyle.setProperty(\"-webkit-transform\", \"translateZ(0)\", null);\n\t\t\tstyle.setProperty(\"transform\", \"translateZ(0)\", null);\n\t\t}\n\t\telse if (div != null)\n\t\t{\n\t\t\tvar style = div.style;\n\t\t\tstyle.setProperty(\"-webkit-transform\", \"translate3D(0,0,0)\", null);\n\t\t\tstyle.setProperty(\"transform\", \"translate3D(0,0,0)\", null);\n\t\t\t// style.setProperty (\"-webkit-transform-style\", \"preserve-3d\", null);\n\t\t\t// style.setProperty (\"transform-style\", \"preserve-3d\", null);\n\t\t\tstyle.position = \"relative\";\n\t\t\tstyle.overflow = \"hidden\";\n\t\t\tstyle.setProperty(\"-webkit-user-select\", \"none\", null);\n\t\t\tstyle.setProperty(\"-moz-user-select\", \"none\", null);\n\t\t\tstyle.setProperty(\"-ms-user-select\", \"none\", null);\n\t\t\tstyle.setProperty(\"-o-user-select\", \"none\", null);\n\t\t}\n\n\t\tif (parent.__width == 0 && parent.__height == 0)\n\t\t{\n\t\t\tif (element != null)\n\t\t\t{\n\t\t\t\tparent.__width = element.clientWidth;\n\t\t\t\tparent.__height = element.clientHeight;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparent.__width = Browser.window.innerWidth;\n\t\t\t\tparent.__height = Browser.window.innerHeight;\n\t\t\t}\n\n\t\t\tcacheElementWidth = parent.__width;\n\t\t\tcacheElementHeight = parent.__height;\n\n\t\t\tresizeElement = true;\n\t\t}\n\n\t\tif (canvas != null)\n\t\t{\n\t\t\tcanvas.width = Math.round(parent.__width * scale);\n\t\t\tcanvas.height = Math.round(parent.__height * scale);\n\n\t\t\tcanvas.style.width = parent.__width + \"px\";\n\t\t\tcanvas.style.height = parent.__height + \"px\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdiv.style.width = parent.__width + \"px\";\n\t\t\tdiv.style.height = parent.__height + \"px\";\n\t\t}\n\n\t\tif ((Reflect.hasField(attributes, \"resizable\") && attributes.resizable)\n\t\t\t|| (!Reflect.hasField(attributes, \"width\") && setWidth == 0 && setHeight == 0))\n\t\t{\n\t\t\tparent.__resizable = true;\n\t\t}\n\n\t\tupdateSize();\n\n\t\tif (element != null)\n\t\t{\n\t\t\tif (canvas != null)\n\t\t\t{\n\t\t\t\tif (element != cast canvas)\n\t\t\t\t{\n\t\t\t\t\telement.appendChild(canvas);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telement.appendChild(div);\n\t\t\t}\n\n\t\t\tvar events = [\"mousedown\", \"mouseenter\", \"mouseleave\", \"mousemove\", \"mouseup\", \"wheel\"];\n\n\t\t\tfor (event in events)\n\t\t\t{\n\t\t\t\telement.addEventListener(event, handleMouseEvent, true);\n\t\t\t}\n\n\t\t\telement.addEventListener(\"contextmenu\", handleContextMenuEvent, true);\n\n\t\t\telement.addEventListener(\"dragstart\", handleDragEvent, true);\n\t\t\telement.addEventListener(\"dragover\", handleDragEvent, true);\n\t\t\telement.addEventListener(\"drop\", handleDragEvent, true);\n\n\t\t\telement.addEventListener(\"touchstart\", handleTouchEvent, true);\n\t\t\telement.addEventListener(\"touchmove\", handleTouchEvent, true);\n\t\t\telement.addEventListener(\"touchend\", handleTouchEvent, true);\n\t\t\telement.addEventListener(\"touchcancel\", handleTouchEvent, true);\n\n\t\t\telement.addEventListener(\"gamepadconnected\", handleGamepadEvent, true);\n\t\t\telement.addEventListener(\"gamepaddisconnected\", handleGamepadEvent, true);\n\t\t}\n\n\t\tcreateContext();\n\n\t\tif (parent.context.type == WEBGL)\n\t\t{\n\t\t\tcanvas.addEventListener(\"webglcontextlost\", handleContextEvent, false);\n\t\t\tcanvas.addEventListener(\"webglcontextrestored\", handleContextEvent, false);\n\t\t}\n\t}\n\n\tpublic function alert(message:String, title:String):Void\n\t{\n\t\tif (message != null)\n\t\t{\n\t\t\tBrowser.alert(message);\n\t\t}\n\t}\n\n\tpublic function close():Void\n\t{\n\t\tvar element = parent.element;\n\t\tif (element != null)\n\t\t{\n\t\t\tif (canvas != null)\n\t\t\t{\n\t\t\t\tif (element != cast canvas)\n\t\t\t\t{\n\t\t\t\t\telement.removeChild(canvas);\n\t\t\t\t}\n\t\t\t\tcanvas = null;\n\t\t\t}\n\t\t\telse if (div != null)\n\t\t\t{\n\t\t\t\telement.removeChild(div);\n\t\t\t\tdiv = null;\n\t\t\t}\n\n\t\t\tvar events = [\"mousedown\", \"mouseenter\", \"mouseleave\", \"mousemove\", \"mouseup\", \"wheel\"];\n\n\t\t\tfor (event in events)\n\t\t\t{\n\t\t\t\telement.removeEventListener(event, handleMouseEvent, true);\n\t\t\t}\n\n\t\t\telement.removeEventListener(\"contextmenu\", handleContextMenuEvent, true);\n\n\t\t\telement.removeEventListener(\"dragstart\", handleDragEvent, true);\n\t\t\telement.removeEventListener(\"dragover\", handleDragEvent, true);\n\t\t\telement.removeEventListener(\"drop\", handleDragEvent, true);\n\n\t\t\telement.removeEventListener(\"touchstart\", handleTouchEvent, true);\n\t\t\telement.removeEventListener(\"touchmove\", handleTouchEvent, true);\n\t\t\telement.removeEventListener(\"touchend\", handleTouchEvent, true);\n\t\t\telement.removeEventListener(\"touchcancel\", handleTouchEvent, true);\n\n\t\t\telement.removeEventListener(\"gamepadconnected\", handleGamepadEvent, true);\n\t\t\telement.removeEventListener(\"gamepaddisconnected\", handleGamepadEvent, true);\n\t\t}\n\n\t\tparent.application.__removeWindow(parent);\n\t}\n\n\tprivate function createContext():Void\n\t{\n\t\tvar context = new RenderContext();\n\t\tvar contextAttributes = parent.__attributes.context;\n\n\t\tcontext.window = parent;\n\t\tcontext.attributes = contextAttributes;\n\n\t\tif (div != null)\n\t\t{\n\t\t\tcontext.dom = cast div;\n\t\t\tcontext.type = DOM;\n\t\t\tcontext.version = \"\";\n\t\t}\n\t\telse if (canvas != null)\n\t\t{\n\t\t\tvar webgl:#if !doc_gen HTML5WebGL2RenderContext #else Dynamic #end = null;\n\n\t\t\tvar forceCanvas = #if (canvas || munit) true #else (renderType == CANVAS) #end;\n\t\t\tvar forceWebGL = #if webgl true #else (renderType == OPENGL || renderType == OPENGLES || renderType == WEBGL) #end;\n\t\t\tvar allowWebGL2 = #if webgl1 false #else (!Reflect.hasField(contextAttributes, \"version\")\n\t\t\t\t|| contextAttributes.version != \"1\") #end;\n\t\t\tvar isWebGL2 = false;\n\n\t\t\tif (forceWebGL || (!forceCanvas && (!Reflect.hasField(contextAttributes, \"hardware\") || contextAttributes.hardware)))\n\t\t\t{\n\t\t\t\tvar transparentBackground = Reflect.hasField(contextAttributes, \"background\") && contextAttributes.background == null;\n\t\t\t\tvar colorDepth = Reflect.hasField(contextAttributes, \"colorDepth\") ? contextAttributes.colorDepth : 16;\n\n\t\t\t\tvar options =\n\t\t\t\t\t{\n\t\t\t\t\t\talpha: (transparentBackground || colorDepth > 16) ? true : false,\n\t\t\t\t\t\tantialias: Reflect.hasField(contextAttributes, \"antialiasing\") ? contextAttributes.antialiasing > 0 : false,\n\t\t\t\t\t\tdepth: Reflect.hasField(contextAttributes, \"depth\") ? contextAttributes.depth : true,\n\t\t\t\t\t\tpremultipliedAlpha: true,\n\t\t\t\t\t\tstencil: Reflect.hasField(contextAttributes, \"stencil\") ? contextAttributes.stencil : false,\n\t\t\t\t\t\tpreserveDrawingBuffer: Reflect.hasField(contextAttributes, \"preserveDrawingBuffer\") ? contextAttributes.preserveDrawingBuffer : false,\n\t\t\t\t\t\tfailIfMajorPerformanceCaveat: false\n\t\t\t\t\t};\n\n\t\t\t\tvar glContextType = [\"webgl\", \"experimental-webgl\"];\n\n\t\t\t\tif (allowWebGL2)\n\t\t\t\t{\n\t\t\t\t\tglContextType.unshift(\"webgl2\");\n\t\t\t\t}\n\n\t\t\t\tfor (name in glContextType)\n\t\t\t\t{\n\t\t\t\t\twebgl = cast canvas.getContext(name, options);\n\t\t\t\t\tif (webgl != null && name == \"webgl2\") isWebGL2 = true;\n\t\t\t\t\tif (webgl != null) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (webgl == null)\n\t\t\t{\n\t\t\t\tcontext.canvas2D = cast canvas.getContext(\"2d\");\n\t\t\t\tcontext.type = CANVAS;\n\t\t\t\tcontext.version = \"\";\n\t\t\t\tcontext.attributes.hardware = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t#if webgl_debug\n\t\t\t\twebgl = untyped WebGLDebugUtils.makeDebugContext(webgl);\n\t\t\t\t#end\n\n\t\t\t\t#if (js && html5)\n\t\t\t\tcontext.webgl = webgl;\n\t\t\t\tif (isWebGL2) context.webgl2 = webgl;\n\n\t\t\t\tif (GL.context == null)\n\t\t\t\t{\n\t\t\t\t\tGL.context = cast webgl;\n\t\t\t\t\tGL.type = WEBGL;\n\t\t\t\t\tGL.version = isWebGL2 ? 2 : 1;\n\t\t\t\t}\n\t\t\t\t#end\n\n\t\t\t\tcontext.type = WEBGL;\n\t\t\t\tcontext.version = isWebGL2 ? \"2\" : \"1\";\n\t\t\t\tcontext.attributes.hardware = true;\n\t\t\t}\n\t\t}\n\n\t\tparent.context = context;\n\t}\n\n\tpublic function focus():Void {}\n\n\tprivate function focusTextInput():Void\n\t{\n\t\t// Avoid changing focus multiple times per frame.\n\t\tif (__focusPending) return;\n\t\t__focusPending = true;\n\n\t\tTimer.delay(function()\n\t\t{\n\t\t\t__focusPending = false;\n\t\t\tif (textInputEnabled) textInput.focus();\n\t\t}, 20);\n\t}\n\n\tpublic function getCursor():MouseCursor\n\t{\n\t\treturn cursor;\n\t}\n\n\tpublic function getDisplay():Display\n\t{\n\t\treturn System.getDisplay(0);\n\t}\n\n\tpublic function getDisplayMode():DisplayMode\n\t{\n\t\treturn System.getDisplay(0).currentMode;\n\t}\n\n\tpublic function getFrameRate():Float\n\t{\n\t\tif (parent.application == null) return 0;\n\n\t\tif (parent.application.__backend.framePeriod < 0)\n\t\t{\n\t\t\treturn 60;\n\t\t}\n\t\telse if (parent.application.__backend.framePeriod == 1000)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 1000 / parent.application.__backend.framePeriod;\n\t\t}\n\t}\n\n\tpublic function getMouseLock():Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function getOpacity():Float\n\t{\n\t\treturn 1.0;\n\t}\n\n\tpublic function getTextInputEnabled():Bool\n\t{\n\t\treturn textInputEnabled;\n\t}\n\n\tprivate function handleContextEvent(event:js.html.Event):Void\n\t{\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase \"webglcontextlost\":\n\t\t\t\tif (event.cancelable) event.preventDefault();\n\n\t\t\t\t// #if !display\n\t\t\t\tif (GL.context != null)\n\t\t\t\t{\n\t\t\t\t\t// GL.context.__contextLost = true;\n\t\t\t\t}\n\t\t\t\t// #end\n\n\t\t\t\tparent.context = null;\n\n\t\t\t\tparent.onRenderContextLost.dispatch();\n\n\t\t\tcase \"webglcontextrestored\":\n\t\t\t\tcreateContext();\n\n\t\t\t\tparent.onRenderContextRestored.dispatch(parent.context);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprivate function handleContextMenuEvent(event:MouseEvent):Void\n\t{\n\t\tif ((parent.onMouseUp.canceled || parent.onMouseDown.canceled) && event.cancelable)\n\t\t{\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tprivate function handleCutOrCopyEvent(event:ClipboardEvent):Void\n\t{\n\t\tvar text = Clipboard.text;\n\t\tif (text == null)\n\t\t{\n\t\t\ttext = \"\";\n\t\t}\n\t\tevent.clipboardData.setData(\"text/plain\", text);\n\t\tif (event.cancelable) event.preventDefault();\n\t}\n\n\tprivate function handleDragEvent(event:DragEvent):Bool\n\t{\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase \"dragstart\":\n\t\t\t\tif (cast(event.target, Element).nodeName.toLowerCase() == \"img\" && event.cancelable)\n\t\t\t\t{\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\tcase \"dragover\":\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn false;\n\n\t\t\tcase \"drop\":\n\t\t\t\t// TODO: Create a formal API that supports HTML5 file objects\n\t\t\t\tif (event.dataTransfer != null && event.dataTransfer.files.length > 0)\n\t\t\t\t{\n\t\t\t\t\tparent.onDropFile.dispatch(cast event.dataTransfer.files);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function handleFocusEvent(event:FocusEvent):Void\n\t{\n\t\tif (textInputEnabled)\n\t\t{\n\t\t\tif (event.relatedTarget == null || isDescendent(cast event.relatedTarget))\n\t\t\t{\n\t\t\t\tfocusTextInput();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleFullscreenEvent(event:Dynamic):Void\n\t{\n\t\tvar fullscreenElement = untyped (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement\n\t\t\t|| document.msFullscreenElement);\n\n\t\tif (fullscreenElement != null)\n\t\t{\n\t\t\tisFullscreen = true;\n\t\t\tparent.__fullscreen = true;\n\n\t\t\tif (requestedFullscreen)\n\t\t\t{\n\t\t\t\trequestedFullscreen = false;\n\t\t\t\tparent.onFullscreen.dispatch();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tisFullscreen = false;\n\t\t\tparent.__fullscreen = false;\n\n\t\t\t// TODO: Handle a different way?\n\t\t\tparent.onRestore.dispatch();\n\t\t\t// parent.onResize.dispatch (parent.__width, parent.__height);\n\n\t\t\tvar changeEvents = [\n\t\t\t\t\"fullscreenchange\",\n\t\t\t\t\"mozfullscreenchange\",\n\t\t\t\t\"webkitfullscreenchange\",\n\t\t\t\t\"MSFullscreenChange\"\n\t\t\t];\n\t\t\tvar errorEvents = [\n\t\t\t\t\"fullscreenerror\",\n\t\t\t\t\"mozfullscreenerror\",\n\t\t\t\t\"webkitfullscreenerror\",\n\t\t\t\t\"MSFullscreenError\"\n\t\t\t];\n\n\t\t\tfor (i in 0...changeEvents.length)\n\t\t\t{\n\t\t\t\tBrowser.document.removeEventListener(changeEvents[i], handleFullscreenEvent, false);\n\t\t\t\tBrowser.document.removeEventListener(errorEvents[i], handleFullscreenEvent, false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleGamepadEvent(event:Dynamic):Void\n\t{\n\t\tswitch (event.type)\n\t\t{\n\t\t\tcase \"gamepadconnected\":\n\t\t\t\tJoystick.__connect(event.gamepad.index);\n\n\t\t\t\tif (event.gamepad.mapping == \"standard\")\n\t\t\t\t{\n\t\t\t\t\tGamepad.__connect(event.gamepad.index);\n\t\t\t\t}\n\n\t\t\tcase \"gamepaddisconnected\":\n\t\t\t\tJoystick.__disconnect(event.gamepad.index);\n\t\t\t\tGamepad.__disconnect(event.gamepad.index);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprivate function handleInputEvent(event:InputEvent):Void\n\t{\n\t\tif (imeCompositionActive)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// In order to ensure that the browser will fire clipboard events, we always need to have something selected.\n\t\t// Therefore, `value` cannot be \"\".\n\t\tif (textInput.value != dummyCharacter)\n\t\t{\n\t\t\tvar value = StringTools.replace(textInput.value, dummyCharacter, \"\");\n\n\t\t\tif (value.length > 0)\n\t\t\t{\n\t\t\t\tparent.onTextInput.dispatch(value);\n\t\t\t}\n\n\t\t\ttextInput.value = dummyCharacter;\n\t\t}\n\t}\n\n\tprivate function handleMouseEvent(event:MouseEvent):Void\n\t{\n\t\tvar x = 0.0;\n\t\tvar y = 0.0;\n\n\t\tif (event.type != \"wheel\")\n\t\t{\n\t\t\tif (parent.element != null)\n\t\t\t{\n\t\t\t\tif (canvas != null)\n\t\t\t\t{\n\t\t\t\t\tvar rect = canvas.getBoundingClientRect();\n\t\t\t\t\tx = (event.clientX - rect.left) * (parent.__width / rect.width);\n\t\t\t\t\ty = (event.clientY - rect.top) * (parent.__height / rect.height);\n\t\t\t\t}\n\t\t\t\telse if (div != null)\n\t\t\t\t{\n\t\t\t\t\tvar rect = div.getBoundingClientRect();\n\t\t\t\t\t// x = (event.clientX - rect.left) * (window.__backend.div.style.width / rect.width);\n\t\t\t\t\tx = (event.clientX - rect.left);\n\t\t\t\t\t// y = (event.clientY - rect.top) * (window.__backend.div.style.height / rect.height);\n\t\t\t\t\ty = (event.clientY - rect.top);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar rect = parent.element.getBoundingClientRect();\n\t\t\t\t\tx = (event.clientX - rect.left) * (parent.__width / rect.width);\n\t\t\t\t\ty = (event.clientY - rect.top) * (parent.__height / rect.height);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tx = event.clientX;\n\t\t\t\ty = event.clientY;\n\t\t\t}\n\n\t\t\tswitch (event.type)\n\t\t\t{\n\t\t\t\tcase \"mousedown\":\n\t\t\t\t\tif (event.currentTarget == parent.element)\n\t\t\t\t\t{\n\t\t\t\t\t\t// while the mouse button is down, and the mouse has\n\t\t\t\t\t\t// moved outside the bounds of the parent element, we\n\t\t\t\t\t\t// want both onMouseMove and onMouseUp to continue to be\n\t\t\t\t\t\t// dispatched. otherwise, dragging objects around with\n\t\t\t\t\t\t// the mouse will appear broken.\n\t\t\t\t\t\t// however, if the mouse button isn't down, and the\n\t\t\t\t\t\t// mouse is outside the bounds of the parent element,\n\t\t\t\t\t\t// then onMouseMove and onMouseUp don't need to be\n\t\t\t\t\t\t// dispatched.\n\t\t\t\t\t\t// Flash embedded in HTML worked similarly.\n\t\t\t\t\t\tBrowser.window.addEventListener(\"mouseup\", handleMouseEvent);\n\t\t\t\t\t\tBrowser.window.addEventListener(\"mousemove\", handleMouseEvent);\n\t\t\t\t\t}\n\t\t\t\t\t// just to be safe, clear the flag on every mouse down\n\t\t\t\t\t__stopMousePropagation = false;\n\n\t\t\t\t\tparent.clickCount = event.detail;\n\t\t\t\t\tparent.onMouseDown.dispatch(x, y, event.button);\n\t\t\t\t\tparent.clickCount = 0;\n\n\t\t\t\t\tif (parent.onMouseDown.canceled && event.cancelable)\n\t\t\t\t\t{\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"mouseenter\":\n\t\t\t\t\tif (event.target == parent.element)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.onEnter.dispatch();\n\n\t\t\t\t\t\tif (parent.onEnter.canceled && event.cancelable)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"mouseleave\":\n\t\t\t\t\tif (event.target == parent.element)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.onLeave.dispatch();\n\n\t\t\t\t\t\tif (parent.onLeave.canceled && event.cancelable)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"mouseup\":\n\t\t\t\t\t// see comment below for mousemove for an explanation of\n\t\t\t\t\t// what the __stopMousePropagation flag is used for.\n\t\t\t\t\tif (__stopMousePropagation && event.currentTarget != parent.element)\n\t\t\t\t\t{\n\t\t\t\t\t\t__stopMousePropagation = false;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tBrowser.window.removeEventListener(\"mouseup\", handleMouseEvent);\n\t\t\t\t\tBrowser.window.removeEventListener(\"mousemove\", handleMouseEvent);\n\n\t\t\t\t\t__stopMousePropagation = event.currentTarget == parent.element;\n\n\t\t\t\t\tparent.clickCount = event.detail;\n\t\t\t\t\tparent.onMouseUp.dispatch(x, y, event.button);\n\t\t\t\t\tparent.clickCount = 0;\n\n\t\t\t\t\tif (parent.onMouseUp.canceled && event.cancelable)\n\t\t\t\t\t{\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"mousemove\":\n\t\t\t\t\t// this same listener is added to the parent element and to\n\t\t\t\t\t// the browser window for both the mousemove and the mouseup\n\t\t\t\t\t// event types, if mousedown happens first. this allows both\n\t\t\t\t\t// onMouseMove and onMouseUp to be dispatched if the mouse\n\t\t\t\t\t// moves outside the bounds of the parent element.\n\n\t\t\t\t\t// since browser mouse events bubble, this listener will be\n\t\t\t\t\t// called for the parent element first, as long as the mouse\n\t\t\t\t\t// is still over the parent element. in that case, when the\n\t\t\t\t\t// listener is called for the browser window, it should\n\t\t\t\t\t// return early so that onMouseMove or onMouseUp isn't\n\t\t\t\t\t// dispatched twice. this is done by checking the\n\t\t\t\t\t// __stopMousePropagation flag when the current target isn't\n\t\t\t\t\t// the parent element.\n\n\t\t\t\t\t// however, if the mouse isn't over the parent element, the\n\t\t\t\t\t// listener will be called only for the browser window, and\n\t\t\t\t\t// not the parent element. in that case, it can proceed to\n\t\t\t\t\t// dispatch either onMouseMove or onMouseUp, since this\n\t\t\t\t\t// listener was called only once.\n\n\t\t\t\t\t// again, this applies only if the mouse button is down. if\n\t\t\t\t\t// the mouse button isn't down, then the listener won't be\n\t\t\t\t\t// added to the browser window, and event won't be\n\t\t\t\t\t// dispatched outside the bounds of the parent element.\n\n\t\t\t\t\tif (__stopMousePropagation && event.currentTarget != parent.element)\n\t\t\t\t\t{\n\t\t\t\t\t\t// why not call event.stopPropagation() here? well,\n\t\t\t\t\t\t// other JS code in the page may still be interested in\n\t\t\t\t\t\t// the event. listening for the same events on both the\n\t\t\t\t\t\t// parent element and on the browser window is just an\n\t\t\t\t\t\t// implementation detail and shouldn't affect other\n\t\t\t\t\t\t// listeners.\n\t\t\t\t\t\t__stopMousePropagation = false;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t__stopMousePropagation = event.currentTarget == parent.element;\n\n\t\t\t\t\tif (x != cacheMouseX || y != cacheMouseY)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.onMouseMove.dispatch(x, y);\n\t\t\t\t\t\tparent.onMouseMoveRelative.dispatch(x - cacheMouseX, y - cacheMouseY);\n\n\t\t\t\t\t\tif ((parent.onMouseMove.canceled || parent.onMouseMoveRelative.canceled) && event.cancelable)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tcacheMouseX = x;\n\t\t\tcacheMouseY = y;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar deltaMode:MouseWheelMode = switch (untyped event.deltaMode)\n\t\t\t{\n\t\t\t\tcase 0: PIXELS;\n\t\t\t\tcase 1: LINES;\n\t\t\t\tcase 2: PAGES;\n\t\t\t\tdefault: UNKNOWN;\n\t\t\t}\n\n\t\t\tparent.onMouseWheel.dispatch(untyped event.deltaX, -untyped event.deltaY, deltaMode);\n\n\t\t\tif (parent.onMouseWheel.canceled && event.cancelable)\n\t\t\t{\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handlePasteEvent(event:ClipboardEvent):Void\n\t{\n\t\tif (untyped event.clipboardData.types.indexOf(\"text/plain\") > -1)\n\t\t{\n\t\t\tvar text = event.clipboardData.getData(\"text/plain\");\n\t\t\tClipboard.text = text;\n\n\t\t\tif (textInputEnabled)\n\t\t\t{\n\t\t\t\tparent.onTextInput.dispatch(text);\n\t\t\t}\n\n\t\t\tif (event.cancelable) event.preventDefault();\n\t\t}\n\t}\n\n\tprivate function handleResizeEvent(event:js.html.Event):Void\n\t{\n\t\tprimaryTouch = null;\n\t\tupdateSize();\n\t}\n\n\tprivate function handleTouchEvent(event:TouchEvent):Void\n\t{\n\t\tif (event.cancelable) event.preventDefault();\n\n\t\tvar rect = null;\n\n\t\tif (parent.element != null)\n\t\t{\n\t\t\tif (canvas != null)\n\t\t\t{\n\t\t\t\trect = canvas.getBoundingClientRect();\n\t\t\t}\n\t\t\telse if (div != null)\n\t\t\t{\n\t\t\t\trect = div.getBoundingClientRect();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trect = parent.element.getBoundingClientRect();\n\t\t\t}\n\t\t}\n\n\t\tvar windowWidth:Float = setWidth;\n\t\tvar windowHeight:Float = setHeight;\n\n\t\tif (windowWidth == 0 || windowHeight == 0)\n\t\t{\n\t\t\tif (rect != null)\n\t\t\t{\n\t\t\t\twindowWidth = rect.width;\n\t\t\t\twindowHeight = rect.height;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twindowWidth = 1;\n\t\t\t\twindowHeight = 1;\n\t\t\t}\n\t\t}\n\n\t\tvar touch:Touch;\n\t\tvar x:Float;\n\t\tvar y:Float;\n\t\tvar cacheX:Float;\n\t\tvar cacheY:Float;\n\n\t\tfor (data in event.changedTouches)\n\t\t{\n\t\t\tx = 0.0;\n\t\t\ty = 0.0;\n\n\t\t\tif (rect != null)\n\t\t\t{\n\t\t\t\tx = (data.clientX - rect.left) * (windowWidth / rect.width);\n\t\t\t\ty = (data.clientY - rect.top) * (windowHeight / rect.height);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tx = data.clientX;\n\t\t\t\ty = data.clientY;\n\t\t\t}\n\n\t\t\tif (event.type == \"touchstart\")\n\t\t\t{\n\t\t\t\ttouch = unusedTouchesPool.pop();\n\n\t\t\t\tif (touch == null)\n\t\t\t\t{\n\t\t\t\t\ttouch = new Touch(x / windowWidth, y / windowHeight, data.identifier, 0, 0, data.force, parent.id);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttouch.x = x / windowWidth;\n\t\t\t\t\ttouch.y = y / windowHeight;\n\t\t\t\t\ttouch.id = data.identifier;\n\t\t\t\t\ttouch.dx = 0;\n\t\t\t\t\ttouch.dy = 0;\n\t\t\t\t\ttouch.pressure = data.force;\n\t\t\t\t\ttouch.device = parent.id;\n\t\t\t\t}\n\n\t\t\t\tcurrentTouches.set(data.identifier, touch);\n\n\t\t\t\tTouch.onStart.dispatch(touch);\n\n\t\t\t\tif (primaryTouch == null)\n\t\t\t\t{\n\t\t\t\t\tprimaryTouch = touch;\n\t\t\t\t}\n\n\t\t\t\tif (touch == primaryTouch)\n\t\t\t\t{\n\t\t\t\t\tparent.onMouseDown.dispatch(x, y, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttouch = currentTouches.get(data.identifier);\n\n\t\t\t\tif (touch != null)\n\t\t\t\t{\n\t\t\t\t\tcacheX = touch.x;\n\t\t\t\t\tcacheY = touch.y;\n\n\t\t\t\t\ttouch.x = x / windowWidth;\n\t\t\t\t\ttouch.y = y / windowHeight;\n\t\t\t\t\ttouch.dx = touch.x - cacheX;\n\t\t\t\t\ttouch.dy = touch.y - cacheY;\n\t\t\t\t\ttouch.pressure = data.force;\n\n\t\t\t\t\tswitch (event.type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"touchmove\":\n\t\t\t\t\t\t\tTouch.onMove.dispatch(touch);\n\n\t\t\t\t\t\t\tif (touch == primaryTouch)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tparent.onMouseMove.dispatch(x, y);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"touchend\":\n\t\t\t\t\t\t\tTouch.onEnd.dispatch(touch);\n\n\t\t\t\t\t\t\tcurrentTouches.remove(data.identifier);\n\t\t\t\t\t\t\tunusedTouchesPool.add(touch);\n\n\t\t\t\t\t\t\tif (touch == primaryTouch)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tparent.onMouseUp.dispatch(x, y, 0);\n\t\t\t\t\t\t\t\tprimaryTouch = null;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"touchcancel\":\n\t\t\t\t\t\t\tTouch.onCancel.dispatch(touch);\n\n\t\t\t\t\t\t\tcurrentTouches.remove(data.identifier);\n\t\t\t\t\t\t\tunusedTouchesPool.add(touch);\n\n\t\t\t\t\t\t\tif (touch == primaryTouch)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// parent.onMouseUp.dispatch (x, y, 0);\n\t\t\t\t\t\t\t\tprimaryTouch = null;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function isDescendent(node:Node):Bool\n\t{\n\t\tif (node == parent.element) return true;\n\n\t\twhile (node != null)\n\t\t{\n\t\t\tif (node.parentNode == parent.element)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tnode = node.parentNode;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic function move(x:Int, y:Int):Void {}\n\n\tpublic function readPixels(rect:Rectangle):Image\n\t{\n\t\t// TODO: Handle DIV, improve 3D canvas support\n\n\t\tif (canvas != null)\n\t\t{\n\t\t\tvar stageRect = new Rectangle(0, 0, canvas.width, canvas.height);\n\n\t\t\tif (rect == null)\n\t\t\t{\n\t\t\t\trect = stageRect;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trect.intersection(stageRect, rect);\n\t\t\t}\n\n\t\t\tif (rect.width > 0 && rect.height > 0)\n\t\t\t{\n\t\t\t\tvar canvas2:CanvasElement = cast Browser.document.createElement(\"canvas\");\n\t\t\t\tcanvas2.width = Std.int(rect.width);\n\t\t\t\tcanvas2.height = Std.int(rect.height);\n\n\t\t\t\tvar context = canvas2.getContext(\"2d\");\n\t\t\t\tcontext.drawImage(canvas, -rect.x, -rect.y);\n\n\t\t\t\treturn Image.fromCanvas(canvas2);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic function resize(width:Int, height:Int):Void {}\n\n\tpublic function setMinSize(width:Int, height:Int):Void {}\n\n\tpublic function setMaxSize(width:Int, height:Int):Void {}\n\n\tpublic function setBorderless(value:Bool):Bool\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function setClipboard(value:String):Void\n\t{\n\t\tif (textArea == null)\n\t\t{\n\t\t\ttextArea = cast Browser.document.createElement(\"textarea\");\n\t\t\ttextArea.style.height = \"0px\";\n\t\t\ttextArea.style.left = \"-100px\";\n\t\t\ttextArea.style.opacity = \"0\";\n\t\t\ttextArea.style.position = \"fixed\";\n\t\t\ttextArea.style.top = \"-100px\";\n\t\t\ttextArea.style.width = \"0px\";\n\t\t\tBrowser.document.body.appendChild(textArea);\n\t\t}\n\t\ttextArea.value = value;\n\t\ttextArea.focus();\n\t\ttextArea.select();\n\n\t\tif (Browser.document.queryCommandEnabled(\"copy\"))\n\t\t{\n\t\t\tBrowser.document.execCommand(\"copy\");\n\t\t}\n\t\tif (textInputEnabled)\n\t\t{\n\t\t\tfocusTextInput();\n\t\t}\n\t}\n\n\tpublic function setCursor(value:MouseCursor):MouseCursor\n\t{\n\t\tif (cursor != value)\n\t\t{\n\t\t\tif (value == null)\n\t\t\t{\n\t\t\t\tparent.element.style.cursor = \"none\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparent.element.style.cursor = switch (value)\n\t\t\t\t{\n\t\t\t\t\tcase ARROW: \"default\";\n\t\t\t\t\tcase CROSSHAIR: \"crosshair\";\n\t\t\t\t\tcase MOVE: \"move\";\n\t\t\t\t\tcase POINTER: \"pointer\";\n\t\t\t\t\tcase RESIZE_NESW: \"nesw-resize\";\n\t\t\t\t\tcase RESIZE_NS: \"ns-resize\";\n\t\t\t\t\tcase RESIZE_NWSE: \"nwse-resize\";\n\t\t\t\t\tcase RESIZE_WE: \"ew-resize\";\n\t\t\t\t\tcase TEXT: \"text\";\n\t\t\t\t\tcase WAIT: \"wait\";\n\t\t\t\t\tcase WAIT_ARROW: \"wait\";\n\t\t\t\t\tdefault: \"auto\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcursor = value;\n\t\t}\n\n\t\treturn cursor;\n\t}\n\n\tpublic function setDisplayMode(value:DisplayMode):DisplayMode\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function setFrameRate(value:Float):Float\n\t{\n\t\tif (parent.application != null)\n\t\t{\n\t\t\tif (value >= 60)\n\t\t\t{\n\t\t\t\tif (parent == parent.application.window) parent.application.__backend.framePeriod = -1;\n\t\t\t}\n\t\t\telse if (value > 0)\n\t\t\t{\n\t\t\t\tif (parent == parent.application.window) parent.application.__backend.framePeriod = 1000 / value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (parent == parent.application.window) parent.application.__backend.framePeriod = 1000;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setFullscreen(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tif (!requestedFullscreen && !isFullscreen)\n\t\t\t{\n\t\t\t\trequestedFullscreen = true;\n\n\t\t\t\tuntyped\n\t\t\t\t{\n\t\t\t\t\tif (parent.element.requestFullscreen)\n\t\t\t\t\t{\n\t\t\t\t\t\tdocument.addEventListener(\"fullscreenchange\", handleFullscreenEvent, false);\n\t\t\t\t\t\tdocument.addEventListener(\"fullscreenerror\", handleFullscreenEvent, false);\n\t\t\t\t\t\tparent.element.requestFullscreen();\n\t\t\t\t\t}\n\t\t\t\t\telse if (parent.element.mozRequestFullScreen)\n\t\t\t\t\t{\n\t\t\t\t\t\tdocument.addEventListener(\"mozfullscreenchange\", handleFullscreenEvent, false);\n\t\t\t\t\t\tdocument.addEventListener(\"mozfullscreenerror\", handleFullscreenEvent, false);\n\t\t\t\t\t\tparent.element.mozRequestFullScreen();\n\t\t\t\t\t}\n\t\t\t\t\telse if (parent.element.webkitRequestFullscreen)\n\t\t\t\t\t{\n\t\t\t\t\t\tdocument.addEventListener(\"webkitfullscreenchange\", handleFullscreenEvent, false);\n\t\t\t\t\t\tdocument.addEventListener(\"webkitfullscreenerror\", handleFullscreenEvent, false);\n\t\t\t\t\t\tparent.element.webkitRequestFullscreen();\n\t\t\t\t\t}\n\t\t\t\t\telse if (parent.element.msRequestFullscreen)\n\t\t\t\t\t{\n\t\t\t\t\t\tdocument.addEventListener(\"MSFullscreenChange\", handleFullscreenEvent, false);\n\t\t\t\t\t\tdocument.addEventListener(\"MSFullscreenError\", handleFullscreenEvent, false);\n\t\t\t\t\t\tparent.element.msRequestFullscreen();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (isFullscreen)\n\t\t{\n\t\t\trequestedFullscreen = false;\n\n\t\t\tuntyped\n\t\t\t{\n\t\t\t\tif (document.exitFullscreen) document.exitFullscreen();\n\t\t\t\telse if (document.mozCancelFullScreen) document.mozCancelFullScreen();\n\t\t\t\telse if (document.webkitExitFullscreen) document.webkitExitFullscreen();\n\t\t\t\telse if (document.msExitFullscreen) document.msExitFullscreen();\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setIcon(image:Image):Void\n\t{\n\t\t// var iconWidth = 16;\n\t\t// var iconHeight = 16;\n\n\t\t// image = image.clone ();\n\n\t\t// if (image.width != iconWidth || image.height != iconHeight) {\n\t\t//\n\t\t// image.resize (iconWidth, iconHeight);\n\t\t//\n\t\t// }\n\n\t\tImageCanvasUtil.convertToCanvas(image);\n\n\t\tvar link:LinkElement = cast Browser.document.querySelector(\"link[rel*='icon']\");\n\n\t\tif (link == null)\n\t\t{\n\t\t\tlink = cast Browser.document.createElement(\"link\");\n\t\t}\n\n\t\tlink.type = \"image/x-icon\";\n\t\tlink.rel = \"shortcut icon\";\n\t\tlink.href = image.buffer.src.toDataURL(\"image/x-icon\");\n\n\t\tBrowser.document.getElementsByTagName(\"head\")[0].appendChild(link);\n\t}\n\n\tpublic function setMaximized(value:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function setMinimized(value:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function setMouseLock(value:Bool):Void {}\n\n\tpublic function setOpacity(value:Float):Void {}\n\n\tpublic function setResizable(value:Bool):Bool\n\t{\n\t\treturn value;\n\t}\n\n\tpublic function setTextInputEnabled(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tif (textInput == null)\n\t\t\t{\n\t\t\t\ttextInput = cast Browser.document.createElement('input');\n\t\t\t\t#if lime_enable_html5_ime\n\t\t\t\ttextInput.type = 'text';\n\t\t\t\t#else\n\t\t\t\t// use password instead of text to avoid IME issues on Android\n\t\t\t\ttextInput.type = Browser.navigator.userAgent.indexOf(\"Android\") >= 0 ? 'password' : 'text';\n\t\t\t\t#end\n\t\t\t\ttextInput.style.position = 'absolute';\n\t\t\t\ttextInput.style.opacity = \"0\";\n\t\t\t\ttextInput.style.color = \"transparent\";\n\t\t\t\ttextInput.value = dummyCharacter; // See: handleInputEvent()\n\n\t\t\t\tuntyped textInput.autocapitalize = \"off\";\n\t\t\t\tuntyped textInput.autocorrect = \"off\";\n\t\t\t\ttextInput.autocomplete = \"off\";\n\n\t\t\t\t// TODO: Position for mobile browsers better\n\n\t\t\t\ttextInput.style.left = \"0px\";\n\t\t\t\ttextInput.style.top = \"50%\";\n\n\t\t\t\tif (~/(iPad|iPhone|iPod).*OS 8_/gi.match(Browser.window.navigator.userAgent))\n\t\t\t\t{\n\t\t\t\t\ttextInput.style.fontSize = \"0px\";\n\t\t\t\t\ttextInput.style.width = '0px';\n\t\t\t\t\ttextInput.style.height = '0px';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttextInput.style.width = '1px';\n\t\t\t\t\ttextInput.style.height = '1px';\n\t\t\t\t}\n\n\t\t\t\tuntyped (textInput.style).pointerEvents = 'none';\n\t\t\t\ttextInput.style.zIndex = \"-10000000\";\n\t\t\t}\n\n\t\t\tif (textInput.parentNode == null)\n\t\t\t{\n\t\t\t\tparent.element.appendChild(textInput);\n\t\t\t}\n\n\t\t\tif (!textInputEnabled)\n\t\t\t{\n\t\t\t\ttextInput.addEventListener('input', handleInputEvent, true);\n\t\t\t\ttextInput.addEventListener('blur', handleFocusEvent, true);\n\t\t\t\ttextInput.addEventListener('cut', handleCutOrCopyEvent, true);\n\t\t\t\ttextInput.addEventListener('copy', handleCutOrCopyEvent, true);\n\t\t\t\ttextInput.addEventListener('paste', handlePasteEvent, true);\n\t\t\t\ttextInput.addEventListener('compositionstart', handleCompositionstartEvent, true);\n\t\t\t\ttextInput.addEventListener('compositionend', handleCompositionendEvent, true);\n\t\t\t}\n\n\t\t\ttextInput.focus();\n\t\t\ttextInput.select();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (textInput != null)\n\t\t\t{\n\t\t\t\t// call blur() before removing the compositionend listener\n\t\t\t\t// to ensure that incomplete IME input is committed\n\t\t\t\ttextInput.blur();\n\n\t\t\t\ttextInput.removeEventListener('input', handleInputEvent, true);\n\t\t\t\ttextInput.removeEventListener('blur', handleFocusEvent, true);\n\t\t\t\ttextInput.removeEventListener('cut', handleCutOrCopyEvent, true);\n\t\t\t\ttextInput.removeEventListener('copy', handleCutOrCopyEvent, true);\n\t\t\t\ttextInput.removeEventListener('paste', handlePasteEvent, true);\n\t\t\t\ttextInput.removeEventListener('compositionstart', handleCompositionstartEvent, true);\n\t\t\t\ttextInput.removeEventListener('compositionend', handleCompositionendEvent, true);\n\t\t\t}\n\t\t}\n\n\t\treturn textInputEnabled = value;\n\t}\n\n\tpublic function setTextInputRect(value:Rectangle):Rectangle\n\t{\n\t\treturn textInputRect = value;\n\t}\n\n\tprivate var imeCompositionActive = false;\n\n\tpublic function handleCompositionstartEvent(e):Void\n\t{\n\t\timeCompositionActive = true;\n\t}\n\n\tpublic function handleCompositionendEvent(e):Void\n\t{\n\t\timeCompositionActive = false;\n\t\thandleInputEvent(e);\n\t}\n\n\tpublic function setTitle(value:String):String\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tBrowser.document.title = value;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setVisible(value:Bool):Bool\n\t{\n\t\treturn value;\n\t}\n\n\tprivate function updateSize():Void\n\t{\n\t\tif (!parent.__resizable) return;\n\n\t\tvar elementWidth:Float;\n\t\tvar elementHeight:Float;\n\n\t\tif (parent.element != null)\n\t\t{\n\t\t\telementWidth = parent.element.clientWidth;\n\t\t\telementHeight = parent.element.clientHeight;\n\t\t}\n\t\telse\n\t\t{\n\t\t\telementWidth = Browser.window.innerWidth;\n\t\t\telementHeight = Browser.window.innerHeight;\n\t\t}\n\n\t\tif (elementWidth != cacheElementWidth || elementHeight != cacheElementHeight)\n\t\t{\n\t\t\tcacheElementWidth = elementWidth;\n\t\t\tcacheElementHeight = elementHeight;\n\n\t\t\tvar stretch = resizeElement || (setWidth == 0 && setHeight == 0);\n\n\t\t\tif (parent.element != null && (div == null || (div != null && stretch)))\n\t\t\t{\n\t\t\t\tif (stretch)\n\t\t\t\t{\n\t\t\t\t\tif (parent.__width != elementWidth || parent.__height != elementHeight)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.__width = Std.int(elementWidth);\n\t\t\t\t\t\tparent.__height = Std.int(elementHeight);\n\n\t\t\t\t\t\tif (canvas != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (parent.element != cast canvas)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcanvas.width = Math.round(elementWidth * scale);\n\t\t\t\t\t\t\t\tcanvas.height = Math.round(elementHeight * scale);\n\n\t\t\t\t\t\t\t\tcanvas.style.width = elementWidth + \"px\";\n\t\t\t\t\t\t\t\tcanvas.style.height = elementHeight + \"px\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdiv.style.width = elementWidth + \"px\";\n\t\t\t\t\t\t\tdiv.style.height = elementHeight + \"px\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent.onResize.dispatch(Std.int(elementWidth), Std.int(elementHeight));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar scaleX = (setWidth != 0) ? (elementWidth / setWidth) : 1;\n\t\t\t\t\tvar scaleY = (setHeight != 0) ? (elementHeight / setHeight) : 1;\n\n\t\t\t\t\tvar targetWidth = elementWidth;\n\t\t\t\t\tvar targetHeight = elementHeight;\n\t\t\t\t\tvar marginLeft = 0;\n\t\t\t\t\tvar marginTop = 0;\n\n\t\t\t\t\tif (scaleX < scaleY)\n\t\t\t\t\t{\n\t\t\t\t\t\ttargetHeight = Math.floor(setHeight * scaleX);\n\t\t\t\t\t\tmarginTop = Math.floor((elementHeight - targetHeight) / 2);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ttargetWidth = Math.floor(setWidth * scaleY);\n\t\t\t\t\t\tmarginLeft = Math.floor((elementWidth - targetWidth) / 2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (canvas != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (parent.element != cast canvas)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcanvas.style.width = targetWidth + \"px\";\n\t\t\t\t\t\t\tcanvas.style.height = targetHeight + \"px\";\n\t\t\t\t\t\t\tcanvas.style.marginLeft = marginLeft + \"px\";\n\t\t\t\t\t\t\tcanvas.style.marginTop = marginTop + \"px\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdiv.style.width = targetWidth + \"px\";\n\t\t\t\t\t\tdiv.style.height = targetHeight + \"px\";\n\t\t\t\t\t\tdiv.style.marginLeft = marginLeft + \"px\";\n\t\t\t\t\t\tdiv.style.marginTop = marginTop + \"px\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function warpMouse(x:Int, y:Int):Void {}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/native/NativeApplication.hx",
    "content": "package lime._internal.backend.native;\n\nimport haxe.Timer;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Application;\nimport lime.graphics.opengl.GL;\nimport lime.graphics.OpenGLRenderContext;\nimport lime.graphics.RenderContext;\nimport lime.math.Rectangle;\nimport lime.media.AudioManager;\nimport lime.system.CFFI;\nimport lime.system.Clipboard;\nimport lime.system.Display;\nimport lime.system.DisplayMode;\nimport lime.system.JNI;\nimport lime.system.Orientation;\nimport lime.system.Sensor;\nimport lime.system.SensorType;\nimport lime.system.System;\nimport lime.ui.Gamepad;\nimport lime.ui.Joystick;\nimport lime.ui.JoystickHatPosition;\nimport lime.ui.KeyCode;\nimport lime.ui.KeyModifier;\nimport lime.ui.Touch;\nimport lime.ui.Window;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(haxe.Timer)\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime._internal.backend.native.NativeOpenGLRenderContext)\n@:access(lime._internal.backend.native.NativeWindow)\n@:access(lime.app.Application)\n@:access(lime.graphics.opengl.GL)\n@:access(lime.graphics.OpenGLRenderContext)\n@:access(lime.graphics.Renderer)\n@:access(lime.system.Clipboard)\n@:access(lime.system.Sensor)\n@:access(lime.ui.Gamepad)\n@:access(lime.ui.Joystick)\n@:access(lime.ui.Window)\nclass NativeApplication\n{\n\tprivate var applicationEventInfo = new ApplicationEventInfo(UPDATE);\n\tprivate var clipboardEventInfo = new ClipboardEventInfo();\n\tprivate var currentTouches = new Map<Int, Touch>();\n\tprivate var dropEventInfo = new DropEventInfo();\n\tprivate var gamepadEventInfo = new GamepadEventInfo();\n\tprivate var joystickEventInfo = new JoystickEventInfo();\n\tprivate var keyEventInfo = new KeyEventInfo();\n\tprivate var orientationEventInfo = new OrientationEventInfo();\n\tprivate var mouseEventInfo = new MouseEventInfo();\n\tprivate var renderEventInfo = new RenderEventInfo(RENDER);\n\tprivate var sensorEventInfo = new SensorEventInfo();\n\tprivate var textEventInfo = new TextEventInfo();\n\tprivate var touchEventInfo = new TouchEventInfo();\n\tprivate var unusedTouchesPool = new List<Touch>();\n\tprivate var windowEventInfo = new WindowEventInfo();\n\n\tpublic var handle:Dynamic;\n\n\t#if android\n\tprivate var deviceOrientationListener:OrientationChangeListener;\n\t#end\n\n\tprivate var pauseTimer:Int;\n\tprivate var parent:Application;\n\tprivate var toggleFullscreen:Bool;\n\n\tprivate static function __init__()\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar init = NativeCFFI;\n\t\t#end\n\t}\n\n\tpublic function new(parent:Application):Void\n\t{\n\t\tthis.parent = parent;\n\t\tpauseTimer = -1;\n\t\ttoggleFullscreen = true;\n\n\t\tAudioManager.init();\n\n\t\t#if (ios || android || tvos)\n\t\tSensor.registerSensor(SensorType.ACCELEROMETER, 0);\n\t\t#end\n\n\t\t#if android\n\t\tvar setDeviceOrientationListener = JNI.createStaticMethod(\"org/haxe/lime/GameActivity\", \"setDeviceOrientationListener\",\n\t\t\t\"(Lorg/haxe/lime/HaxeObject;)V\");\n\t\tdeviceOrientationListener = new OrientationChangeListener(handleJNIOrientationEvent);\n\t\tsetDeviceOrientationListener(deviceOrientationListener);\n\t\t#end\n\n\t\t#if (!macro && lime_cffi)\n\t\thandle = NativeCFFI.lime_application_create();\n\t\t#end\n\t}\n\n\tprivate function advanceTimer():Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (pauseTimer > -1)\n\t\t{\n\t\t\tvar offset = System.getTimer() - pauseTimer;\n\t\t\tfor (timer in Timer.sRunningTimers)\n\t\t\t{\n\t\t\t\tif (timer.mRunning) timer.mFireAt += offset;\n\t\t\t}\n\t\t\tpauseTimer = -1;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function exec():Int\n\t{\n\t\t#if !macro\n\t\t#if lime_cffi\n\t\tNativeCFFI.lime_application_event_manager_register(handleApplicationEvent, applicationEventInfo);\n\t\tNativeCFFI.lime_clipboard_event_manager_register(handleClipboardEvent, clipboardEventInfo);\n\t\tNativeCFFI.lime_drop_event_manager_register(handleDropEvent, dropEventInfo);\n\t\tNativeCFFI.lime_gamepad_event_manager_register(handleGamepadEvent, gamepadEventInfo);\n\t\tNativeCFFI.lime_joystick_event_manager_register(handleJoystickEvent, joystickEventInfo);\n\t\tNativeCFFI.lime_key_event_manager_register(handleKeyEvent, keyEventInfo);\n\t\tNativeCFFI.lime_mouse_event_manager_register(handleMouseEvent, mouseEventInfo);\n\t\tNativeCFFI.lime_render_event_manager_register(handleRenderEvent, renderEventInfo);\n\t\tNativeCFFI.lime_text_event_manager_register(handleTextEvent, textEventInfo);\n\t\tNativeCFFI.lime_touch_event_manager_register(handleTouchEvent, touchEventInfo);\n\t\tNativeCFFI.lime_window_event_manager_register(handleWindowEvent, windowEventInfo);\n\t\t#if (ios || android)\n\t\tNativeCFFI.lime_orientation_event_manager_register(handleOrientationEvent, orientationEventInfo);\n\t\t#end\n\t\t#if (ios || android || tvos)\n\t\tNativeCFFI.lime_sensor_event_manager_register(handleSensorEvent, sensorEventInfo);\n\t\t#end\n\t\t#end\n\n\t\t#if (nodejs && lime_cffi)\n\t\tNativeCFFI.lime_application_init(handle);\n\n\t\tvar eventLoop = function()\n\t\t{\n\t\t\tvar active = NativeCFFI.lime_application_update(handle);\n\n\t\t\tif (!active)\n\t\t\t{\n\t\t\t\tuntyped process.exitCode = NativeCFFI.lime_application_quit(handle);\n\t\t\t\tparent.onExit.dispatch(untyped process.exitCode);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuntyped setImmediate(eventLoop);\n\t\t\t}\n\t\t}\n\n\t\tuntyped setImmediate(eventLoop);\n\t\treturn 0;\n\t\t#elseif lime_cffi\n\t\tvar result = NativeCFFI.lime_application_exec(handle);\n\n\t\t#if (!webassembly && !ios && !nodejs)\n\t\tparent.onExit.dispatch(result);\n\t\t#end\n\n\t\treturn result;\n\t\t#end\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function exit():Void\n\t{\n\t\tAudioManager.shutdown();\n\n\t\t#if (!macro && lime_cffi)\n\t\tNativeCFFI.lime_application_quit(handle);\n\t\t#end\n\t}\n\n\tpublic function getDeviceOrientation():Orientation\n\t{\n\t\t#if (!macro && lime_cffi)\n\t\treturn cast NativeCFFI.lime_system_get_device_orientation();\n\t\t#else\n\t\treturn UNKNOWN;\n\t\t#end\n\t}\n\n\tprivate function handleApplicationEvent():Void\n\t{\n\t\tswitch (applicationEventInfo.type)\n\t\t{\n\t\t\tcase UPDATE:\n\t\t\t\tupdateTimer();\n\n\t\t\t\tparent.onUpdate.dispatch(applicationEventInfo.deltaTime);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprivate function handleClipboardEvent():Void\n\t{\n\t\tClipboard.__update();\n\t}\n\n\tprivate function handleDropEvent():Void\n\t{\n\t\tfor (window in parent.windows)\n\t\t{\n\t\t\twindow.onDropFile.dispatch(CFFI.stringValue(dropEventInfo.file));\n\t\t}\n\t}\n\n\tprivate function handleGamepadEvent():Void\n\t{\n\t\tswitch (gamepadEventInfo.type)\n\t\t{\n\t\t\tcase AXIS_MOVE:\n\t\t\t\tvar gamepad = Gamepad.devices.get(gamepadEventInfo.id);\n\t\t\t\tif (gamepad != null) gamepad.onAxisMove.dispatch(gamepadEventInfo.axis, gamepadEventInfo.axisValue);\n\n\t\t\tcase BUTTON_DOWN:\n\t\t\t\tvar gamepad = Gamepad.devices.get(gamepadEventInfo.id);\n\t\t\t\tif (gamepad != null) gamepad.onButtonDown.dispatch(gamepadEventInfo.button);\n\n\t\t\tcase BUTTON_UP:\n\t\t\t\tvar gamepad = Gamepad.devices.get(gamepadEventInfo.id);\n\t\t\t\tif (gamepad != null) gamepad.onButtonUp.dispatch(gamepadEventInfo.button);\n\n\t\t\tcase CONNECT:\n\t\t\t\tGamepad.__connect(gamepadEventInfo.id);\n\n\t\t\tcase DISCONNECT:\n\t\t\t\tGamepad.__disconnect(gamepadEventInfo.id);\n\t\t}\n\t}\n\n\tprivate function handleJoystickEvent():Void\n\t{\n\t\tswitch (joystickEventInfo.type)\n\t\t{\n\t\t\tcase AXIS_MOVE:\n\t\t\t\tvar joystick = Joystick.devices.get(joystickEventInfo.id);\n\t\t\t\tif (joystick != null) joystick.onAxisMove.dispatch(joystickEventInfo.index, joystickEventInfo.x);\n\n\t\t\tcase HAT_MOVE:\n\t\t\t\tvar joystick = Joystick.devices.get(joystickEventInfo.id);\n\t\t\t\tif (joystick != null) joystick.onHatMove.dispatch(joystickEventInfo.index, joystickEventInfo.eventValue);\n\n\t\t\tcase BUTTON_DOWN:\n\t\t\t\tvar joystick = Joystick.devices.get(joystickEventInfo.id);\n\t\t\t\tif (joystick != null) joystick.onButtonDown.dispatch(joystickEventInfo.index);\n\n\t\t\tcase BUTTON_UP:\n\t\t\t\tvar joystick = Joystick.devices.get(joystickEventInfo.id);\n\t\t\t\tif (joystick != null) joystick.onButtonUp.dispatch(joystickEventInfo.index);\n\n\t\t\tcase CONNECT:\n\t\t\t\tJoystick.__connect(joystickEventInfo.id);\n\n\t\t\tcase DISCONNECT:\n\t\t\t\tJoystick.__disconnect(joystickEventInfo.id);\n\t\t}\n\t}\n\n\tprivate function handleKeyEvent():Void\n\t{\n\t\tvar window = parent.__windowByID.get(keyEventInfo.windowID);\n\n\t\tif (window != null)\n\t\t{\n\t\t\tvar type:KeyEventType = keyEventInfo.type;\n\t\t\tvar int32:Float = keyEventInfo.keyCode;\n\t\t\tvar keyCode:KeyCode = Std.int(int32);\n\t\t\tvar modifier:KeyModifier = keyEventInfo.modifier;\n\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase KEY_DOWN:\n\t\t\t\t\twindow.onKeyDown.dispatch(keyCode, modifier);\n\n\t\t\t\tcase KEY_UP:\n\t\t\t\t\twindow.onKeyUp.dispatch(keyCode, modifier);\n\t\t\t}\n\n\t\t\t#if (windows || linux)\n\t\t\tif (keyCode == RETURN)\n\t\t\t{\n\t\t\t\tif (type == KEY_DOWN)\n\t\t\t\t{\n\t\t\t\t\tif (toggleFullscreen && modifier.altKey && (!modifier.ctrlKey && !modifier.shiftKey && !modifier.metaKey))\n\t\t\t\t\t{\n\t\t\t\t\t\ttoggleFullscreen = false;\n\n\t\t\t\t\t\tif (!window.onKeyDown.canceled)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twindow.fullscreen = !window.fullscreen;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttoggleFullscreen = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#if rpi\n\t\t\tif (keyCode == ESCAPE && modifier.ctrlKey && type == KEY_DOWN)\n\t\t\t{\n\t\t\t\tSystem.exit(0);\n\t\t\t}\n\t\t\t#end\n\t\t\t#elseif mac\n\t\t\tif (keyCode == F)\n\t\t\t{\n\t\t\t\tif (type == KEY_DOWN)\n\t\t\t\t{\n\t\t\t\t\tif (toggleFullscreen && (modifier.ctrlKey && modifier.metaKey) && (!modifier.altKey && !modifier.shiftKey))\n\t\t\t\t\t{\n\t\t\t\t\t\ttoggleFullscreen = false;\n\n\t\t\t\t\t\tif (!window.onKeyDown.canceled)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twindow.fullscreen = !window.fullscreen;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttoggleFullscreen = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t#elseif android\n\t\t\tif (keyCode == APP_CONTROL_BACK && modifier == KeyModifier.NONE && type == KEY_UP && !window.onKeyUp.canceled)\n\t\t\t{\n\t\t\t\tvar mainActivity = JNI.createStaticField(\"org/haxe/extension/Extension\", \"mainActivity\", \"Landroid/app/Activity;\");\n\t\t\t\tvar moveTaskToBack = JNI.createMemberMethod(\"android/app/Activity\", \"moveTaskToBack\", \"(Z)Z\");\n\n\t\t\t\tmoveTaskToBack(mainActivity.get(), true);\n\t\t\t}\n\t\t\t#end\n\t\t}\n\t}\n\n\tprivate function handleMouseEvent():Void\n\t{\n\t\tvar window = parent.__windowByID.get(mouseEventInfo.windowID);\n\n\t\tif (window != null)\n\t\t{\n\t\t\tswitch (mouseEventInfo.type)\n\t\t\t{\n\t\t\t\tcase MOUSE_DOWN:\n\t\t\t\t\twindow.clickCount = mouseEventInfo.clickCount;\n\t\t\t\t\twindow.onMouseDown.dispatch(mouseEventInfo.x, mouseEventInfo.y, mouseEventInfo.button);\n\t\t\t\t\twindow.clickCount = 0;\n\n\t\t\t\tcase MOUSE_UP:\n\t\t\t\t\twindow.clickCount = mouseEventInfo.clickCount;\n\t\t\t\t\twindow.onMouseUp.dispatch(mouseEventInfo.x, mouseEventInfo.y, mouseEventInfo.button);\n\t\t\t\t\twindow.clickCount = 0;\n\n\t\t\t\tcase MOUSE_MOVE:\n\t\t\t\t\twindow.onMouseMove.dispatch(mouseEventInfo.x, mouseEventInfo.y);\n\t\t\t\t\twindow.onMouseMoveRelative.dispatch(mouseEventInfo.movementX, mouseEventInfo.movementY);\n\n\t\t\t\tcase MOUSE_WHEEL:\n\t\t\t\t\twindow.onMouseWheel.dispatch(mouseEventInfo.x, mouseEventInfo.y, UNKNOWN);\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleOrientationEvent():Void\n\t{\n\t\tvar orientation:Orientation = cast orientationEventInfo.orientation;\n\t\tvar display = orientationEventInfo.display;\n\t\tswitch (orientationEventInfo.type)\n\t\t{\n\t\t\tcase DISPLAY_ORIENTATION_CHANGE:\n\t\t\t\tparent.onDisplayOrientationChange.dispatch(display, orientation);\n\t\t\tcase DEVICE_ORIENTATION_CHANGE:\n\t\t\t\tparent.onDeviceOrientationChange.dispatch(orientation);\n\t\t}\n\t}\n\n\t#if android\n\tprivate function handleJNIOrientationEvent(newOrientation:Int):Void\n\t{\n\t\tvar orientation:Orientation = cast newOrientation;\n\t\tparent.onDeviceOrientationChange.dispatch(orientation);\n\t}\n\t#end\n\n\tprivate function handleRenderEvent():Void\n\t{\n\t\t// TODO: Allow windows to render independently\n\n\t\tfor (window in parent.__windows)\n\t\t{\n\t\t\tif (window == null) continue;\n\n\t\t\t// parent.renderer = renderer;\n\n\t\t\tswitch (renderEventInfo.type)\n\t\t\t{\n\t\t\t\tcase RENDER:\n\t\t\t\t\tif (window.context != null)\n\t\t\t\t\t{\n\t\t\t\t\t\twindow.__backend.render();\n\t\t\t\t\t\twindow.onRender.dispatch(window.context);\n\n\t\t\t\t\t\tif (!window.onRender.canceled)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twindow.__backend.contextFlip();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase RENDER_CONTEXT_LOST:\n\t\t\t\t\tif (window.__backend.useHardware && window.context != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (window.context.type)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase OPENGL, OPENGLES, WEBGL:\n\t\t\t\t\t\t\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !display)\n\t\t\t\t\t\t\t\tvar gl = window.context.gl;\n\t\t\t\t\t\t\t\t(gl : NativeOpenGLRenderContext).__contextLost();\n\t\t\t\t\t\t\t\tif (GL.context == gl) GL.context = null;\n\t\t\t\t\t\t\t\t#end\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twindow.context = null;\n\t\t\t\t\t\twindow.onRenderContextLost.dispatch();\n\t\t\t\t\t}\n\n\t\t\t\tcase RENDER_CONTEXT_RESTORED:\n\t\t\t\t\tif (window.__backend.useHardware)\n\t\t\t\t\t{\n\t\t\t\t\t\t// GL.context = new OpenGLRenderContext ();\n\t\t\t\t\t\t// window.context.gl = GL.context;\n\n\t\t\t\t\t\twindow.onRenderContextRestored.dispatch(window.context);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleSensorEvent():Void\n\t{\n\t\tvar sensor = Sensor.sensorByID.get(sensorEventInfo.id);\n\n\t\tif (sensor != null)\n\t\t{\n\t\t\tsensor.onUpdate.dispatch(sensorEventInfo.x, sensorEventInfo.y, sensorEventInfo.z);\n\t\t}\n\t}\n\n\tprivate function handleTextEvent():Void\n\t{\n\t\tvar window = parent.__windowByID.get(textEventInfo.windowID);\n\n\t\tif (window != null)\n\t\t{\n\t\t\tswitch (textEventInfo.type)\n\t\t\t{\n\t\t\t\tcase TEXT_INPUT:\n\t\t\t\t\twindow.onTextInput.dispatch(CFFI.stringValue(textEventInfo.text));\n\n\t\t\t\tcase TEXT_EDIT:\n\t\t\t\t\twindow.onTextEdit.dispatch(CFFI.stringValue(textEventInfo.text), textEventInfo.start, textEventInfo.length);\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function handleTouchEvent():Void\n\t{\n\t\tswitch (touchEventInfo.type)\n\t\t{\n\t\t\tcase TOUCH_START:\n\t\t\t\tvar touch = unusedTouchesPool.pop();\n\n\t\t\t\tif (touch == null)\n\t\t\t\t{\n\t\t\t\t\ttouch = new Touch(touchEventInfo.x, touchEventInfo.y, touchEventInfo.id, touchEventInfo.dx, touchEventInfo.dy, touchEventInfo.pressure,\n\t\t\t\t\t\ttouchEventInfo.device);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttouch.x = touchEventInfo.x;\n\t\t\t\t\ttouch.y = touchEventInfo.y;\n\t\t\t\t\ttouch.id = touchEventInfo.id;\n\t\t\t\t\ttouch.dx = touchEventInfo.dx;\n\t\t\t\t\ttouch.dy = touchEventInfo.dy;\n\t\t\t\t\ttouch.pressure = touchEventInfo.pressure;\n\t\t\t\t\ttouch.device = touchEventInfo.device;\n\t\t\t\t}\n\n\t\t\t\tcurrentTouches.set(touch.id, touch);\n\n\t\t\t\tTouch.onStart.dispatch(touch);\n\n\t\t\tcase TOUCH_END:\n\t\t\t\tvar touch = currentTouches.get(touchEventInfo.id);\n\n\t\t\t\tif (touch != null)\n\t\t\t\t{\n\t\t\t\t\ttouch.x = touchEventInfo.x;\n\t\t\t\t\ttouch.y = touchEventInfo.y;\n\t\t\t\t\ttouch.dx = touchEventInfo.dx;\n\t\t\t\t\ttouch.dy = touchEventInfo.dy;\n\t\t\t\t\ttouch.pressure = touchEventInfo.pressure;\n\n\t\t\t\t\tTouch.onEnd.dispatch(touch);\n\n\t\t\t\t\tcurrentTouches.remove(touchEventInfo.id);\n\t\t\t\t\tunusedTouchesPool.add(touch);\n\t\t\t\t}\n\n\t\t\tcase TOUCH_MOVE:\n\t\t\t\tvar touch = currentTouches.get(touchEventInfo.id);\n\n\t\t\t\tif (touch != null)\n\t\t\t\t{\n\t\t\t\t\ttouch.x = touchEventInfo.x;\n\t\t\t\t\ttouch.y = touchEventInfo.y;\n\t\t\t\t\ttouch.dx = touchEventInfo.dx;\n\t\t\t\t\ttouch.dy = touchEventInfo.dy;\n\t\t\t\t\ttouch.pressure = touchEventInfo.pressure;\n\n\t\t\t\t\tTouch.onMove.dispatch(touch);\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tprivate function handleWindowEvent():Void\n\t{\n\t\tvar window = parent.__windowByID.get(windowEventInfo.windowID);\n\n\t\tif (window != null)\n\t\t{\n\t\t\tswitch (windowEventInfo.type)\n\t\t\t{\n\t\t\t\tcase WINDOW_ACTIVATE:\n\t\t\t\t\tadvanceTimer();\n\t\t\t\t\twindow.onActivate.dispatch();\n\t\t\t\t\tAudioManager.resume();\n\n\t\t\t\tcase WINDOW_CLOSE:\n\t\t\t\t\twindow.close();\n\n\t\t\t\tcase WINDOW_DEACTIVATE:\n\t\t\t\t\twindow.onDeactivate.dispatch();\n\t\t\t\t\tAudioManager.suspend();\n\t\t\t\t\tpauseTimer = System.getTimer();\n\n\t\t\t\tcase WINDOW_ENTER:\n\t\t\t\t\twindow.onEnter.dispatch();\n\n\t\t\t\tcase WINDOW_EXPOSE:\n\t\t\t\t\twindow.onExpose.dispatch();\n\n\t\t\t\tcase WINDOW_FOCUS_IN:\n\t\t\t\t\twindow.onFocusIn.dispatch();\n\n\t\t\t\tcase WINDOW_FOCUS_OUT:\n\t\t\t\t\twindow.onFocusOut.dispatch();\n\n\t\t\t\tcase WINDOW_LEAVE:\n\t\t\t\t\twindow.onLeave.dispatch();\n\n\t\t\t\tcase WINDOW_MAXIMIZE:\n\t\t\t\t\twindow.__maximized = true;\n\t\t\t\t\twindow.__fullscreen = false;\n\t\t\t\t\twindow.__minimized = false;\n\t\t\t\t\twindow.onMaximize.dispatch();\n\n\t\t\t\tcase WINDOW_MINIMIZE:\n\t\t\t\t\twindow.__minimized = true;\n\t\t\t\t\twindow.__maximized = false;\n\t\t\t\t\twindow.__fullscreen = false;\n\t\t\t\t\twindow.onMinimize.dispatch();\n\n\t\t\t\tcase WINDOW_MOVE:\n\t\t\t\t\twindow.__x = windowEventInfo.x;\n\t\t\t\t\twindow.__y = windowEventInfo.y;\n\t\t\t\t\twindow.onMove.dispatch(windowEventInfo.x, windowEventInfo.y);\n\n\t\t\t\tcase WINDOW_RESIZE:\n\t\t\t\t\twindow.__width = windowEventInfo.width;\n\t\t\t\t\twindow.__height = windowEventInfo.height;\n\t\t\t\t\twindow.onResize.dispatch(windowEventInfo.width, windowEventInfo.height);\n\n\t\t\t\tcase WINDOW_RESTORE:\n\t\t\t\t\twindow.__fullscreen = false;\n\t\t\t\t\twindow.__minimized = false;\n\t\t\t\t\twindow.onRestore.dispatch();\n\n\t\t\t\tcase WINDOW_SHOW:\n\t\t\t\t\twindow.onShow.dispatch();\n\n\t\t\t\tcase WINDOW_HIDE:\n\t\t\t\t\twindow.onHide.dispatch();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function updateTimer():Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (Timer.sRunningTimers.length > 0)\n\t\t{\n\t\t\tvar currentTime = System.getTimer();\n\t\t\tvar foundStopped = false;\n\n\t\t\tfor (timer in Timer.sRunningTimers)\n\t\t\t{\n\t\t\t\tif (timer.mRunning)\n\t\t\t\t{\n\t\t\t\t\tif (currentTime >= timer.mFireAt)\n\t\t\t\t\t{\n\t\t\t\t\t\ttimer.mFireAt += timer.mTime;\n\t\t\t\t\t\ttimer.run();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfoundStopped = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (foundStopped)\n\t\t\t{\n\t\t\t\tTimer.sRunningTimers = Timer.sRunningTimers.filter(function(val)\n\t\t\t\t{\n\t\t\t\t\treturn val.mRunning;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t#if (haxe_ver >= 4.2)\n\t\t#if target.threaded\n\t\tsys.thread.Thread.current().events.progress();\n\t\t#else\n\t\t// Duplicate code required because Haxe 3 can't handle\n\t\t// #if (haxe_ver >= 4.2 && target.threaded)\n\t\t@:privateAccess haxe.EntryPoint.processEvents();\n\t\t#end\n\t\t#else\n\t\t@:privateAccess haxe.EntryPoint.processEvents();\n\t\t#end\n\t\t#end\n\t}\n}\n\n@:keep /*private*/ class ApplicationEventInfo\n{\n\tpublic var deltaTime:Int;\n\tpublic var type:ApplicationEventType;\n\n\tpublic function new(type:ApplicationEventType = null, deltaTime:Int = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.deltaTime = deltaTime;\n\t}\n\n\tpublic function clone():ApplicationEventInfo\n\t{\n\t\treturn new ApplicationEventInfo(type, deltaTime);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract ApplicationEventType(Int)\n{\n\tvar UPDATE = 0;\n\tvar EXIT = 1;\n}\n\n@:keep /*private*/ class ClipboardEventInfo\n{\n\tpublic var type:ClipboardEventType;\n\n\tpublic function new(type:ClipboardEventType = null)\n\t{\n\t\tthis.type = type;\n\t}\n\n\tpublic function clone():ClipboardEventInfo\n\t{\n\t\treturn new ClipboardEventInfo(type);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract ClipboardEventType(Int)\n{\n\tvar UPDATE = 0;\n}\n\n@:keep /*private*/ class DropEventInfo\n{\n\tpublic var file:#if hl hl.Bytes #else String #end;\n\tpublic var type:DropEventType;\n\n\tpublic function new(type:DropEventType = null, file = null)\n\t{\n\t\tthis.type = type;\n\t\tthis.file = file;\n\t}\n\n\tpublic function clone():DropEventInfo\n\t{\n\t\treturn new DropEventInfo(type, file);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract DropEventType(Int)\n{\n\tvar DROP_FILE = 0;\n}\n\n@:keep /*private*/ class GamepadEventInfo\n{\n\tpublic var axis:Int;\n\tpublic var button:Int;\n\tpublic var id:Int;\n\tpublic var type:GamepadEventType;\n\tpublic var axisValue:Float;\n\n\tpublic function new(type:GamepadEventType = null, id:Int = 0, button:Int = 0, axis:Int = 0, value:Float = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.id = id;\n\t\tthis.button = button;\n\t\tthis.axis = axis;\n\t\tthis.axisValue = value;\n\t}\n\n\tpublic function clone():GamepadEventInfo\n\t{\n\t\treturn new GamepadEventInfo(type, id, button, axis, axisValue);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract GamepadEventType(Int)\n{\n\tvar AXIS_MOVE = 0;\n\tvar BUTTON_DOWN = 1;\n\tvar BUTTON_UP = 2;\n\tvar CONNECT = 3;\n\tvar DISCONNECT = 4;\n}\n\n@:keep /*private*/ class JoystickEventInfo\n{\n\tpublic var id:Int;\n\tpublic var index:Int;\n\tpublic var type:JoystickEventType;\n\tpublic var eventValue:Int;\n\tpublic var x:Float;\n\tpublic var y:Float;\n\n\tpublic function new(type:JoystickEventType = null, id:Int = 0, index:Int = 0, value:Int = 0, x:Float = 0, y:Float = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.id = id;\n\t\tthis.index = index;\n\t\tthis.eventValue = value;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tpublic function clone():JoystickEventInfo\n\t{\n\t\treturn new JoystickEventInfo(type, id, index, eventValue, x, y);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract JoystickEventType(Int)\n{\n\tvar AXIS_MOVE = 0;\n\tvar HAT_MOVE = 1;\n\tvar BUTTON_DOWN = 3;\n\tvar BUTTON_UP = 4;\n\tvar CONNECT = 5;\n\tvar DISCONNECT = 6;\n}\n\n@:keep /*private*/ class KeyEventInfo\n{\n\tpublic var keyCode:Float;\n\tpublic var modifier:Int;\n\tpublic var type:KeyEventType;\n\tpublic var windowID:Int;\n\n\tpublic function new(type:KeyEventType = null, windowID:Int = 0, keyCode:Float = 0, modifier:Int = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.windowID = windowID;\n\t\tthis.keyCode = keyCode;\n\t\tthis.modifier = modifier;\n\t}\n\n\tpublic function clone():KeyEventInfo\n\t{\n\t\treturn new KeyEventInfo(type, windowID, keyCode, modifier);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract KeyEventType(Int)\n{\n\tvar KEY_DOWN = 0;\n\tvar KEY_UP = 1;\n}\n\n@:keep /*private*/ class MouseEventInfo\n{\n\tpublic var button:Int;\n\tpublic var movementX:Float;\n\tpublic var movementY:Float;\n\tpublic var type:MouseEventType;\n\tpublic var windowID:Int;\n\tpublic var x:Float;\n\tpublic var y:Float;\n\tpublic var clickCount:Int;\n\n\tpublic function new(type:MouseEventType = null, windowID:Int = 0, x:Float = 0, y:Float = 0, button:Int = 0, movementX:Float = 0, movementY:Float = 0,\n\t\t\tclickCount:Int = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.windowID = 0;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.button = button;\n\t\tthis.movementX = movementX;\n\t\tthis.movementY = movementY;\n\t\tthis.clickCount = clickCount;\n\t}\n\n\tpublic function clone():MouseEventInfo\n\t{\n\t\treturn new MouseEventInfo(type, windowID, x, y, button, movementX, movementY, clickCount);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract MouseEventType(Int)\n{\n\tvar MOUSE_DOWN = 0;\n\tvar MOUSE_UP = 1;\n\tvar MOUSE_MOVE = 2;\n\tvar MOUSE_WHEEL = 3;\n}\n\n@:keep /*private*/ class RenderEventInfo\n{\n\tpublic var type:RenderEventType;\n\n\tpublic function new(type:RenderEventType = null)\n\t{\n\t\tthis.type = type;\n\t}\n\n\tpublic function clone():RenderEventInfo\n\t{\n\t\treturn new RenderEventInfo(type);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract RenderEventType(Int)\n{\n\tvar RENDER = 0;\n\tvar RENDER_CONTEXT_LOST = 1;\n\tvar RENDER_CONTEXT_RESTORED = 2;\n}\n\n@:keep /*private*/ class SensorEventInfo\n{\n\tpublic var id:Int;\n\tpublic var x:Float;\n\tpublic var y:Float;\n\tpublic var z:Float;\n\tpublic var type:SensorEventType;\n\n\tpublic function new(type:SensorEventType = null, id:Int = 0, x:Float = 0, y:Float = 0, z:Float = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.id = id;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\tpublic function clone():SensorEventInfo\n\t{\n\t\treturn new SensorEventInfo(type, id, x, y, z);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract SensorEventType(Int)\n{\n\tvar ACCELEROMETER = 0;\n}\n\n@:keep /*private*/ class TextEventInfo\n{\n\tpublic var id:Int;\n\tpublic var length:Int;\n\tpublic var start:Int;\n\tpublic var text:#if hl hl.Bytes #else String #end;\n\tpublic var type:TextEventType;\n\tpublic var windowID:Int;\n\n\tpublic function new(type:TextEventType = null, windowID:Int = 0, text = null, start:Int = 0, length:Int = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.windowID = windowID;\n\t\tthis.text = text;\n\t\tthis.start = start;\n\t\tthis.length = length;\n\t}\n\n\tpublic function clone():TextEventInfo\n\t{\n\t\treturn new TextEventInfo(type, windowID, text, start, length);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract TextEventType(Int)\n{\n\tvar TEXT_INPUT = 0;\n\tvar TEXT_EDIT = 1;\n}\n\n@:keep /*private*/ class TouchEventInfo\n{\n\tpublic var device:Int;\n\tpublic var dx:Float;\n\tpublic var dy:Float;\n\tpublic var id:Int;\n\tpublic var pressure:Float;\n\tpublic var type:TouchEventType;\n\tpublic var x:Float;\n\tpublic var y:Float;\n\n\tpublic function new(type:TouchEventType = null, x:Float = 0, y:Float = 0, id:Int = 0, dx:Float = 0, dy:Float = 0, pressure:Float = 0, device:Int = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.id = id;\n\t\tthis.dx = dx;\n\t\tthis.dy = dy;\n\t\tthis.pressure = pressure;\n\t\tthis.device = device;\n\t}\n\n\tpublic function clone():TouchEventInfo\n\t{\n\t\treturn new TouchEventInfo(type, x, y, id, dx, dy, pressure, device);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract TouchEventType(Int)\n{\n\tvar TOUCH_START = 0;\n\tvar TOUCH_END = 1;\n\tvar TOUCH_MOVE = 2;\n}\n\n@:keep /*private*/ class WindowEventInfo\n{\n\tpublic var height:Int;\n\tpublic var type:WindowEventType;\n\tpublic var width:Int;\n\tpublic var windowID:Int;\n\tpublic var x:Int;\n\tpublic var y:Int;\n\n\tpublic function new(type:WindowEventType = null, windowID:Int = 0, width:Int = 0, height:Int = 0, x:Int = 0, y:Int = 0)\n\t{\n\t\tthis.type = type;\n\t\tthis.windowID = windowID;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tpublic function clone():WindowEventInfo\n\t{\n\t\treturn new WindowEventInfo(type, windowID, width, height, x, y);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract WindowEventType(Int)\n{\n\tvar WINDOW_ACTIVATE = 0;\n\tvar WINDOW_CLOSE = 1;\n\tvar WINDOW_DEACTIVATE = 2;\n\tvar WINDOW_ENTER = 3;\n\tvar WINDOW_EXPOSE = 4;\n\tvar WINDOW_FOCUS_IN = 5;\n\tvar WINDOW_FOCUS_OUT = 6;\n\tvar WINDOW_LEAVE = 7;\n\tvar WINDOW_MAXIMIZE = 8;\n\tvar WINDOW_MINIMIZE = 9;\n\tvar WINDOW_MOVE = 10;\n\tvar WINDOW_RESIZE = 11;\n\tvar WINDOW_RESTORE = 12;\n\tvar WINDOW_SHOW = 13;\n\tvar WINDOW_HIDE = 14;\n}\n\n@:keep /*private*/ class OrientationEventInfo\n{\n\tpublic var orientation:Int;\n\tpublic var display:Int;\n\tpublic var type:OrientationEventType;\n\n\tpublic function new(type:OrientationEventType = null, orientation:Int = 0, display:Int = -1)\n\t{\n\t\tthis.type = type;\n\t\tthis.orientation = orientation;\n\t\tthis.display = display;\n\t}\n\n\tpublic function clone():OrientationEventInfo\n\t{\n\t\treturn new OrientationEventInfo(type, orientation, display);\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract OrientationEventType(Int)\n{\n\tvar DISPLAY_ORIENTATION_CHANGE = 0;\n\tvar DEVICE_ORIENTATION_CHANGE = 1;\n}\n\n#if android\n@:keep\nprivate class OrientationChangeListener implements JNISafety\n{\n\tprivate var callback:Int->Void;\n\n\tpublic function new(callback:Int->Void)\n\t{\n\t\tthis.callback = callback;\n\t}\n\n\t@:runOnMainThread\n\tpublic function onOrientationChanged(orientation:Int):Void\n\t{\n\t\tcallback(orientation);\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/backend/native/NativeAudioSource.hx",
    "content": "package lime._internal.backend.native;\n\nimport haxe.Int64;\nimport haxe.Timer;\nimport lime.math.Vector4;\nimport lime.media.openal.AL;\nimport lime.media.openal.ALBuffer;\nimport lime.media.openal.ALSource;\nimport lime.media.vorbis.VorbisFile;\nimport lime.media.AudioManager;\nimport lime.media.AudioSource;\nimport lime.utils.UInt8Array;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime.media.AudioBuffer)\nclass NativeAudioSource\n{\n\tprivate static var STREAM_BUFFER_SIZE = 48000;\n\t#if (native_audio_buffers && !macro)\n\tprivate static var STREAM_NUM_BUFFERS = Std.parseInt(haxe.macro.Compiler.getDefine(\"native_audio_buffers\"));\n\t#else\n\tprivate static var STREAM_NUM_BUFFERS = 3;\n\t#end\n\tprivate static var STREAM_TIMER_FREQUENCY = 100;\n\n\tprivate var buffers:Array<ALBuffer>;\n\tprivate var bufferTimeBlocks:Array<Float>;\n\tprivate var completed:Bool;\n\tprivate var dataLength:Int;\n\tprivate var format:Int;\n\tprivate var handle:ALSource;\n\tprivate var length:Null<Int>;\n\tprivate var loops:Int;\n\tprivate var parent:AudioSource;\n\tprivate var playing:Bool;\n\tprivate var position:Vector4;\n\tprivate var samples:Int;\n\tprivate var stream:Bool;\n\tprivate var streamTimer:Timer;\n\tprivate var timer:Timer;\n\n\tpublic function new(parent:AudioSource)\n\t{\n\t\tthis.parent = parent;\n\n\t\tposition = new Vector4();\n\t}\n\n\tpublic function dispose():Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\tstop();\n\t\t\tAL.sourcei(handle, AL.BUFFER, null);\n\t\t\tAL.deleteSource(handle);\n\t\t\tif (buffers != null)\n\t\t\t{\n\t\t\t\tfor (buffer in buffers)\n\t\t\t\t{\n\t\t\t\t\tAL.deleteBuffer(buffer);\n\t\t\t\t}\n\t\t\t\tbuffers = null;\n\t\t\t}\n\t\t\thandle = null;\n\t\t}\n\t}\n\n\tpublic function init():Void\n\t{\n\t\tdataLength = 0;\n\t\tformat = 0;\n\n\t\tif (parent.buffer.channels == 1)\n\t\t{\n\t\t\tif (parent.buffer.bitsPerSample == 8)\n\t\t\t{\n\t\t\t\tformat = AL.FORMAT_MONO8;\n\t\t\t}\n\t\t\telse if (parent.buffer.bitsPerSample == 16)\n\t\t\t{\n\t\t\t\tformat = AL.FORMAT_MONO16;\n\t\t\t}\n\t\t}\n\t\telse if (parent.buffer.channels == 2)\n\t\t{\n\t\t\tif (parent.buffer.bitsPerSample == 8)\n\t\t\t{\n\t\t\t\tformat = AL.FORMAT_STEREO8;\n\t\t\t}\n\t\t\telse if (parent.buffer.bitsPerSample == 16)\n\t\t\t{\n\t\t\t\tformat = AL.FORMAT_STEREO16;\n\t\t\t}\n\t\t}\n\n\t\tif (parent.buffer.__srcVorbisFile != null)\n\t\t{\n\t\t\tstream = true;\n\n\t\t\tvar vorbisFile = parent.buffer.__srcVorbisFile;\n\t\t\tdataLength = Std.int(Int64.toInt(vorbisFile.pcmTotal()) * parent.buffer.channels * (parent.buffer.bitsPerSample / 8));\n\n\t\t\tbuffers = new Array();\n\t\t\tbufferTimeBlocks = new Array();\n\n\t\t\tfor (i in 0...STREAM_NUM_BUFFERS)\n\t\t\t{\n\t\t\t\tbuffers.push(AL.createBuffer());\n\t\t\t\tbufferTimeBlocks.push(0);\n\t\t\t}\n\n\t\t\thandle = AL.createSource();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (parent.buffer.__srcBuffer == null)\n\t\t\t{\n\t\t\t\tparent.buffer.__srcBuffer = AL.createBuffer();\n\n\t\t\t\tif (parent.buffer.__srcBuffer != null)\n\t\t\t\t{\n\t\t\t\t\tAL.bufferData(parent.buffer.__srcBuffer, format, parent.buffer.data, parent.buffer.data.length, parent.buffer.sampleRate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdataLength = parent.buffer.data.length;\n\n\t\t\thandle = AL.createSource();\n\n\t\t\tif (handle != null)\n\t\t\t{\n\t\t\t\tAL.sourcei(handle, AL.BUFFER, parent.buffer.__srcBuffer);\n\t\t\t}\n\t\t}\n\n\t\tsamples = Std.int((dataLength * 8.0) / (parent.buffer.channels * parent.buffer.bitsPerSample));\n\t}\n\n\tpublic function play():Void\n\t{\n\t\t/*var pitch:Float = AL.getSourcef (handle, AL.PITCH);\n\t\t\ttrace(pitch);\n\t\t\tAL.sourcef (handle, AL.PITCH, pitch*0.9);\n\t\t\tpitch = AL.getSourcef (handle, AL.PITCH);\n\t\t\ttrace(pitch); */\n\t\t/*var pos = getPosition();\n\t\t\ttrace(AL.DISTANCE_MODEL);\n\t\t\tAL.distanceModel(AL.INVERSE_DISTANCE);\n\t\t\ttrace(AL.DISTANCE_MODEL);\n\t\t\tAL.sourcef(handle, AL.ROLLOFF_FACTOR, 5);\n\t\t\tsetPosition(new Vector4(10, 10, -100));\n\t\t\tpos = getPosition();\n\t\t\ttrace(pos); */\n\t\t/*var filter = AL.createFilter();\n\t\t\ttrace(AL.getErrorString());\n\n\t\t\tAL.filteri(filter, AL.FILTER_TYPE, AL.FILTER_LOWPASS);\n\t\t\ttrace(AL.getErrorString());\n\n\t\t\tAL.filterf(filter, AL.LOWPASS_GAIN, 0.5);\n\t\t\ttrace(AL.getErrorString());\n\n\t\t\tAL.filterf(filter, AL.LOWPASS_GAINHF, 0.5);\n\t\t\ttrace(AL.getErrorString());\n\n\t\t\tAL.sourcei(handle, AL.DIRECT_FILTER, filter);\n\t\t\ttrace(AL.getErrorString()); */\n\n\t\tif (playing || handle == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tplaying = true;\n\n\t\tif (stream)\n\t\t{\n\t\t\tsetCurrentTime(getCurrentTime());\n\n\t\t\tstreamTimer = new Timer(STREAM_TIMER_FREQUENCY);\n\t\t\tstreamTimer.run = streamTimer_onRun;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar time = completed ? 0 : getCurrentTime();\n\n\t\t\tsetCurrentTime(time);\n\t\t}\n\t}\n\n\tpublic function pause():Void\n\t{\n\t\tplaying = false;\n\n\t\tif (handle == null) return;\n\t\tAL.sourcePause(handle);\n\n\t\tif (streamTimer != null)\n\t\t{\n\t\t\tstreamTimer.stop();\n\t\t}\n\n\t\tif (timer != null)\n\t\t{\n\t\t\ttimer.stop();\n\t\t}\n\t}\n\n\tprivate function readVorbisFileBuffer(vorbisFile:VorbisFile, length:Int):UInt8Array\n\t{\n\t\t#if lime_vorbis\n\t\tvar buffer = new UInt8Array(length);\n\t\tvar read = 0, total = 0, readMax;\n\n\t\tfor (i in 0...STREAM_NUM_BUFFERS-1)\n\t\t{\n\t\t\tbufferTimeBlocks[i] = bufferTimeBlocks[i + 1];\n\t\t}\n\t\tbufferTimeBlocks[STREAM_NUM_BUFFERS-1] = vorbisFile.timeTell();\n\n\t\twhile (total < length)\n\t\t{\n\t\t\treadMax = 4096;\n\n\t\t\tif (readMax > length - total)\n\t\t\t{\n\t\t\t\treadMax = length - total;\n\t\t\t}\n\n\t\t\tread = vorbisFile.read(buffer.buffer, total, readMax);\n\n\t\t\tif (read > 0)\n\t\t\t{\n\t\t\t\ttotal += read;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn buffer;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tprivate function refillBuffers(buffers:Array<ALBuffer> = null):Void\n\t{\n\t\t#if lime_vorbis\n\t\tvar vorbisFile = null;\n\t\tvar position = 0;\n\n\t\tif (buffers == null)\n\t\t{\n\t\t\tvar buffersProcessed:Int = AL.getSourcei(handle, AL.BUFFERS_PROCESSED);\n\n\t\t\tif (buffersProcessed > 0)\n\t\t\t{\n\t\t\t\tvorbisFile = parent.buffer.__srcVorbisFile;\n\t\t\t\tposition = Int64.toInt(vorbisFile.pcmTell());\n\n\t\t\t\tif (position < dataLength)\n\t\t\t\t{\n\t\t\t\t\tbuffers = AL.sourceUnqueueBuffers(handle, buffersProcessed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (buffers != null)\n\t\t{\n\t\t\tif (vorbisFile == null)\n\t\t\t{\n\t\t\t\tvorbisFile = parent.buffer.__srcVorbisFile;\n\t\t\t\tposition = Int64.toInt(vorbisFile.pcmTell());\n\t\t\t}\n\n\t\t\tvar numBuffers = 0;\n\t\t\tvar data;\n\n\t\t\tfor (buffer in buffers)\n\t\t\t{\n\t\t\t\tif (dataLength - position >= STREAM_BUFFER_SIZE)\n\t\t\t\t{\n\t\t\t\t\tdata = readVorbisFileBuffer(vorbisFile, STREAM_BUFFER_SIZE);\n\t\t\t\t\tAL.bufferData(buffer, format, data, data.length, parent.buffer.sampleRate);\n\t\t\t\t\tposition += STREAM_BUFFER_SIZE;\n\t\t\t\t\tnumBuffers++;\n\t\t\t\t}\n\t\t\t\telse if (position < dataLength)\n\t\t\t\t{\n\t\t\t\t\tdata = readVorbisFileBuffer(vorbisFile, dataLength - position);\n\t\t\t\t\tAL.bufferData(buffer, format, data, data.length, parent.buffer.sampleRate);\n\t\t\t\t\tnumBuffers++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tAL.sourceQueueBuffers(handle, numBuffers, buffers);\n\n\t\t\t// OpenAL can unexpectedly stop playback if the buffers run out\n\t\t\t// of data, which typically happens if an operation (such as\n\t\t\t// resizing a window) freezes the main thread.\n\t\t\t// If AL is supposed to be playing but isn't, restart it here.\n\t\t\tif (playing && handle != null && AL.getSourcei(handle, AL.SOURCE_STATE) == AL.STOPPED)\n\t\t\t{\n\t\t\t\tAL.sourcePlay(handle);\n\t\t\t}\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function stop():Void\n\t{\n\t\tif (playing && handle != null && AL.getSourcei(handle, AL.SOURCE_STATE) == AL.PLAYING)\n\t\t{\n\t\t\tAL.sourceStop(handle);\n\t\t}\n\n\t\tplaying = false;\n\n\t\tif (streamTimer != null)\n\t\t{\n\t\t\tstreamTimer.stop();\n\t\t}\n\n\t\tif (timer != null)\n\t\t{\n\t\t\ttimer.stop();\n\t\t}\n\n\t\tsetCurrentTime(0);\n\t}\n\n\t// Event Handlers\n\tprivate function streamTimer_onRun():Void\n\t{\n\t\trefillBuffers();\n\t}\n\n\tprivate function timer_onRun():Void\n\t{\n\t\tif (loops > 0)\n\t\t{\n\t\t\tplaying = false;\n\t\t\tloops--;\n\t\t\tsetCurrentTime(0);\n\t\t\tplay();\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstop();\n\t\t}\n\n\t\tcompleted = true;\n\t\tparent.onComplete.dispatch();\n\t}\n\n\t// Get & Set Methods\n\tpublic function getCurrentTime():Int\n\t{\n\t\tif (completed)\n\t\t{\n\t\t\treturn getLength();\n\t\t}\n\t\telse if (handle != null)\n\t\t{\n\t\t\tif (stream)\n\t\t\t{\n\t\t\t\tvar time = (Std.int(bufferTimeBlocks[0] * 1000) + Std.int(AL.getSourcef(handle, AL.SEC_OFFSET) * 1000)) - parent.offset;\n\t\t\t\tif (time < 0) return 0;\n\t\t\t\treturn time;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar offset = AL.getSourcei(handle, AL.BYTE_OFFSET);\n\t\t\t\tvar ratio = (offset / dataLength);\n\t\t\t\tvar totalSeconds = samples / parent.buffer.sampleRate;\n\n\t\t\t\tvar time = Std.int(totalSeconds * ratio * 1000) - parent.offset;\n\n\t\t\t\t// var time = Std.int (AL.getSourcef (handle, AL.SEC_OFFSET) * 1000) - parent.offset;\n\t\t\t\tif (time < 0) return 0;\n\t\t\t\treturn time;\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tpublic function setCurrentTime(value:Int):Int\n\t{\n\t\t// `setCurrentTime()` has side effects and is never safe to skip.\n\t\t/* if (value == getCurrentTime())\n\t\t{\n\t\t\treturn value;\n\t\t} */\n\n\t\tif (handle != null)\n\t\t{\n\t\t\tif (stream)\n\t\t\t{\n\t\t\t\tAL.sourceStop(handle);\n\n\t\t\t\tparent.buffer.__srcVorbisFile.timeSeek((value + parent.offset) / 1000);\n\t\t\t\tAL.sourceUnqueueBuffers(handle, STREAM_NUM_BUFFERS);\n\t\t\t\trefillBuffers(buffers);\n\n\t\t\t\tif (playing) AL.sourcePlay(handle);\n\t\t\t}\n\t\t\telse if (parent.buffer != null)\n\t\t\t{\n\t\t\t\tAL.sourceRewind(handle);\n\n\t\t\t\t// AL.sourcef (handle, AL.SEC_OFFSET, (value + parent.offset) / 1000);\n\n\t\t\t\tvar secondOffset = (value + parent.offset) / 1000;\n\t\t\t\tvar totalSeconds = samples / parent.buffer.sampleRate;\n\n\t\t\t\tif (secondOffset < 0) secondOffset = 0;\n\t\t\t\tif (secondOffset > totalSeconds) secondOffset = totalSeconds;\n\n\t\t\t\tvar ratio = (secondOffset / totalSeconds);\n\t\t\t\tvar totalOffset = Std.int(dataLength * ratio);\n\n\t\t\t\tAL.sourcei(handle, AL.BYTE_OFFSET, totalOffset);\n\t\t\t\tif (playing) AL.sourcePlay(handle);\n\t\t\t}\n\t\t}\n\n\t\tif (playing)\n\t\t{\n\t\t\tif (timer != null)\n\t\t\t{\n\t\t\t\ttimer.stop();\n\t\t\t}\n\n\t\t\tvar timeRemaining = Std.int((getLength() - value) / getPitch());\n\n\t\t\tif (timeRemaining > 0)\n\t\t\t{\n\t\t\t\tcompleted = false;\n\t\t\t\ttimer = new Timer(timeRemaining);\n\t\t\t\ttimer.run = timer_onRun;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tplaying = false;\n\t\t\t\tcompleted = true;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function getGain():Float\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn AL.getSourcef(handle, AL.GAIN);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tpublic function setGain(value:Float):Float\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\tAL.sourcef(handle, AL.GAIN, value);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function getLength():Int\n\t{\n\t\tif (length != null)\n\t\t{\n\t\t\treturn length;\n\t\t}\n\n\t\treturn Std.int(samples / parent.buffer.sampleRate * 1000) - parent.offset;\n\t}\n\n\tpublic function setLength(value:Int):Int\n\t{\n\t\tif (playing && length != value)\n\t\t{\n\t\t\tif (timer != null)\n\t\t\t{\n\t\t\t\ttimer.stop();\n\t\t\t}\n\n\t\t\tvar timeRemaining = Std.int((value - getCurrentTime()) / getPitch());\n\n\t\t\tif (timeRemaining > 0)\n\t\t\t{\n\t\t\t\ttimer = new Timer(timeRemaining);\n\t\t\t\ttimer.run = timer_onRun;\n\t\t\t}\n\t\t}\n\n\t\treturn length = value;\n\t}\n\n\tpublic function getLoops():Int\n\t{\n\t\treturn loops;\n\t}\n\n\tpublic function setLoops(value:Int):Int\n\t{\n\t\treturn loops = value;\n\t}\n\n\tpublic function getPitch():Float\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn AL.getSourcef(handle, AL.PITCH);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tpublic function setPitch(value:Float):Float\n\t{\n\t\tif (playing && value != getPitch())\n\t\t{\n\t\t\tif (timer != null)\n\t\t\t{\n\t\t\t\ttimer.stop();\n\t\t\t}\n\n\t\t\tvar timeRemaining = Std.int((getLength() - getCurrentTime()) / value);\n\n\t\t\tif (timeRemaining > 0)\n\t\t\t{\n\t\t\t\ttimer = new Timer(timeRemaining);\n\t\t\t\ttimer.run = timer_onRun;\n\t\t\t}\n\t\t}\n\n\t\tif (handle != null)\n\t\t{\n\t\t\tAL.sourcef(handle, AL.PITCH, value);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function getPosition():Vector4\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if !webassembly\n\t\t\tvar value = AL.getSource3f(handle, AL.POSITION);\n\t\t\tposition.x = value[0];\n\t\t\tposition.y = value[1];\n\t\t\tposition.z = value[2];\n\t\t\t#end\n\t\t}\n\n\t\treturn position;\n\t}\n\n\tpublic function setPosition(value:Vector4):Vector4\n\t{\n\t\tposition.x = value.x;\n\t\tposition.y = value.y;\n\t\tposition.z = value.z;\n\t\tposition.w = value.w;\n\n\t\tif (handle != null)\n\t\t{\n\t\t\tAL.distanceModel(AL.NONE);\n\t\t\tAL.source3f(handle, AL.POSITION, position.x, position.y, position.z);\n\t\t}\n\n\t\treturn position;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/native/NativeCFFI.hx",
    "content": "package lime._internal.backend.native;\n\nimport haxe.io.Bytes;\nimport lime.graphics.opengl.GLBuffer;\nimport lime.graphics.opengl.GLFramebuffer;\nimport lime.graphics.opengl.GLProgram;\nimport lime.graphics.opengl.GLRenderbuffer;\nimport lime.graphics.opengl.GLShader;\nimport lime.graphics.opengl.GLTexture;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.math.Rectangle;\nimport lime.media.openal.ALAuxiliaryEffectSlot;\nimport lime.utils.DataPointer;\n#if hl\nimport lime._internal.backend.native.NativeApplication;\nimport lime.graphics.cairo.CairoGlyph;\nimport lime.graphics.opengl.GL;\nimport lime.math.Matrix3;\nimport lime.math.Vector2;\nimport lime.media.openal.ALContext;\nimport lime.media.openal.ALDevice;\nimport lime.media.AudioBuffer;\nimport lime.system.DisplayMode;\nimport lime.utils.ArrayBufferView;\n#end\n#if (!lime_doc_gen || lime_cffi)\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\n#end\n#if (cpp && !cppia)\nimport cpp.Float32;\n#else\ntypedef Float32 = Float;\n#end\n#if (lime_doc_gen && !lime_cffi)\ntypedef CFFI = Dynamic;\ntypedef CFFIPointer = Dynamic;\n#end\n\n// #if hl\n// typedef TNative_Application = hl.Abstract<\"Application\">;\n// #end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n#if (!macro && !lime_doc_gen)\n#if (disable_cffi || haxe_ver < \"3.4.0\")\n@:build(lime.system.CFFI.build())\n#end\n#end\nclass NativeCFFI\n{\n\t#if (lime_cffi && !macro)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_application_create():Dynamic;\n\n\t@:cffi private static function lime_application_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_application_exec(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_application_init(handle:Dynamic):Void;\n\n\t@:cffi private static function lime_application_quit(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_application_set_frame_rate(handle:Dynamic, value:Float):Void;\n\n\t@:cffi private static function lime_application_update(handle:Dynamic):Bool;\n\n\t@:cffi private static function lime_audio_load(data:Dynamic, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_audio_load_bytes(data:Dynamic, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_audio_load_file(path:Dynamic, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_bytes_from_data_pointer(data:Float, length:Int, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_bytes_get_data_pointer(data:Dynamic):Float;\n\n\t@:cffi private static function lime_bytes_get_data_pointer_offset(data:Dynamic, offset:Int):Float;\n\n\t@:cffi private static function lime_bytes_read_file(path:String, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_cffi_get_native_pointer(ptr:Dynamic):Float;\n\n\t@:cffi private static function lime_clipboard_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_clipboard_get_text():Dynamic;\n\n\t@:cffi private static function lime_clipboard_set_text(text:String):Void;\n\n\t@:cffi private static function lime_data_pointer_offset(dataPointer:DataPointer, offset:Int):Float;\n\n\t@:cffi private static function lime_deflate_compress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_deflate_decompress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_drop_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_file_dialog_open_directory(title:String, filter:String, defaultPath:String):Dynamic;\n\n\t@:cffi private static function lime_file_dialog_open_file(title:String, filter:String, defaultPath:String):Dynamic;\n\n\t@:cffi private static function lime_file_dialog_open_files(title:String, filter:String, defaultPath:String):Dynamic;\n\n\t@:cffi private static function lime_file_dialog_save_file(title:String, filter:String, defaultPath:String):Dynamic;\n\n\t@:cffi private static function lime_file_watcher_create(callback:Dynamic):CFFIPointer;\n\n\t@:cffi private static function lime_file_watcher_add_directory(handle:CFFIPointer, path:Dynamic, recursive:Bool):Dynamic;\n\n\t@:cffi private static function lime_file_watcher_remove_directory(handle:CFFIPointer, watchID:Dynamic):Void;\n\n\t@:cffi private static function lime_file_watcher_update(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_font_get_ascender(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_descender(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_family_name(handle:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_font_get_glyph_index(handle:Dynamic, character:String):Int;\n\n\t@:cffi private static function lime_font_get_glyph_indices(handle:Dynamic, characters:String):Dynamic;\n\n\t@:cffi private static function lime_font_get_glyph_metrics(handle:Dynamic, index:Int):Dynamic;\n\n\t@:cffi private static function lime_font_get_height(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_num_glyphs(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_underline_position(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_underline_thickness(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_strikethrough_position(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_strikethrough_thickness(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_get_units_per_em(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_font_load(data:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_font_load_bytes(data:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_font_load_file(path:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_font_outline_decompose(handle:Dynamic, size:Int):Dynamic;\n\n\t@:cffi private static function lime_font_render_glyph(handle:Dynamic, index:Int, data:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_font_render_glyphs(handle:Dynamic, indices:Dynamic, data:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_font_set_size(handle:Dynamic, size:Int, dpi:Int):Void;\n\n\t@:cffi private static function lime_gamepad_add_mappings(mappings:Dynamic):Void;\n\n\t@:cffi private static function lime_gamepad_get_device_guid(id:Int):Dynamic;\n\n\t@:cffi private static function lime_gamepad_get_device_name(id:Int):Dynamic;\n\n\t@:cffi private static function lime_gamepad_rumble(id:Int, lowFrequencyRumble:Float, highFrequencyRumble:Float, duration:Int):Void;\n\n\t@:cffi private static function lime_gamepad_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_gzip_compress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_gzip_decompress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_haptic_vibrate(period:Int, duration:Int):Void;\n\n\t@:cffi private static function lime_image_encode(data:Dynamic, type:Int, quality:Int, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_image_load(data:Dynamic, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_image_load_bytes(data:Dynamic, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_image_load_file(path:Dynamic, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_image_data_util_color_transform(image:Dynamic, rect:Dynamic, colorMatrix:Dynamic):Void;\n\n\t@:cffi private static function lime_image_data_util_copy_channel(image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic,\n\t\tsrcChannel:Int, destChannel:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_copy_pixels(image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic,\n\t\talphaImage:Dynamic, alphaPoint:Dynamic, mergeAlpha:Bool):Void;\n\n\t@:cffi private static function lime_image_data_util_fill_rect(image:Dynamic, rect:Dynamic, rg:Int, ba:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_flood_fill(image:Dynamic, x:Int, y:Int, rg:Int, ba:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_get_pixels(image:Dynamic, rect:Dynamic, format:Int, bytes:Dynamic):Void;\n\n\t@:cffi private static function lime_image_data_util_merge(image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, redMultiplier:Int,\n\t\tgreenMultiplier:Int, blueMultiplier:Int, alphaMultiplier:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_multiply_alpha(image:Dynamic):Void;\n\n\t@:cffi private static function lime_image_data_util_resize(image:Dynamic, buffer:Dynamic, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_set_format(image:Dynamic, format:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_set_pixels(image:Dynamic, rect:Dynamic, bytes:Dynamic, offset:Int, format:Int, endian:Int):Void;\n\n\t@:cffi private static function lime_image_data_util_threshold(image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, operation:Int,\n\t\tthresholdRG:Int, thresholdBA:Int, colorRG:Int, colorBA:Int, maskRG:Int, maskBA:Int, copySource:Bool):Int;\n\n\t@:cffi private static function lime_image_data_util_unmultiply_alpha(image:Dynamic):Void;\n\n\t@:cffi private static function lime_joystick_get_device_guid(id:Int):Dynamic;\n\n\t@:cffi private static function lime_joystick_get_device_name(id:Int):Dynamic;\n\n\t@:cffi private static function lime_joystick_get_num_axes(id:Int):Int;\n\n\t@:cffi private static function lime_joystick_get_num_buttons(id:Int):Int;\n\n\t@:cffi private static function lime_joystick_get_num_hats(id:Int):Int;\n\n\t@:cffi private static function lime_joystick_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_jpeg_decode_bytes(data:Dynamic, decodeData:Bool, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jpeg_decode_file(path:String, decodeData:Bool, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_key_code_from_scan_code(scanCode:Int):Int;\n\n\t@:cffi private static function lime_key_code_to_scan_code(keyCode:Int):Int;\n\n\t@:cffi private static function lime_key_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_lzma_compress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_lzma_decompress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_mouse_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_neko_execute(module:String):Void;\n\n\t@:cffi private static function lime_orientation_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_png_decode_bytes(data:Dynamic, decodeData:Bool, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_png_decode_file(path:String, decodeData:Bool, buffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_render_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_sensor_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_system_get_allow_screen_timeout():Bool;\n\n\t@:cffi private static function lime_system_set_allow_screen_timeout(value:Bool):Bool;\n\n\t@:cffi private static function lime_system_get_device_model():Dynamic;\n\n\t@:cffi private static function lime_system_get_device_vendor():Dynamic;\n\n\t@:cffi private static function lime_system_get_directory(type:Int, company:String, title:String):Dynamic;\n\n\t@:cffi private static function lime_system_get_display(index:Int):Dynamic;\n\n\t@:cffi private static function lime_system_get_ios_tablet():Bool;\n\n\t@:cffi private static function lime_system_get_num_displays():Int;\n\n\t@:cffi private static function lime_system_get_device_orientation():Int;\n\n\t@:cffi private static function lime_system_get_platform_label():Dynamic;\n\n\t@:cffi private static function lime_system_get_platform_name():Dynamic;\n\n\t@:cffi private static function lime_system_get_platform_version():Dynamic;\n\n\t@:cffi private static function lime_system_get_timer():Float;\n\n\t@:cffi private static function lime_system_open_file(path:String):Void;\n\n\t@:cffi private static function lime_system_open_url(url:String, target:String):Void;\n\n\t@:cffi private static function lime_text_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_touch_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_window_alert(handle:Dynamic, message:String, title:String):Void;\n\n\t@:cffi private static function lime_window_close(handle:Dynamic):Void;\n\n\t@:cffi private static function lime_window_context_flip(handle:Dynamic):Void;\n\n\t@:cffi private static function lime_window_context_lock(handle:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_window_context_make_current(handle:Dynamic):Void;\n\n\t@:cffi private static function lime_window_context_unlock(handle:Dynamic):Void;\n\n\t@:cffi private static function lime_window_create(application:Dynamic, width:Int, height:Int, flags:Int, title:String):Dynamic;\n\n\t@:cffi private static function lime_window_focus(handle:Dynamic):Void;\n\n\t@:cffi private static function lime_window_get_context(handle:Dynamic):Float;\n\n\t@:cffi private static function lime_window_get_context_type(handle:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_window_get_display(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_window_get_display_mode(handle:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_window_get_height(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_window_get_id(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_window_get_mouse_lock(handle:Dynamic):Bool;\n\n\t@:cffi private static function lime_window_get_opacity(handle:Dynamic):Float;\n\n\t@:cffi private static function lime_window_get_scale(handle:Dynamic):Float;\n\n\t@:cffi private static function lime_window_get_text_input_enabled(handle:Dynamic):Bool;\n\n\t@:cffi private static function lime_window_get_width(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_window_get_x(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_window_get_y(handle:Dynamic):Int;\n\n\t@:cffi private static function lime_window_move(handle:Dynamic, x:Int, y:Int):Void;\n\n\t@:cffi private static function lime_window_read_pixels(handle:Dynamic, rect:Dynamic, imageBuffer:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_window_resize(handle:Dynamic, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_window_set_minimum_size(handle:Dynamic, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_window_set_maximum_size(handle:Dynamic, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_window_set_borderless(handle:Dynamic, borderless:Bool):Bool;\n\n\t@:cffi private static function lime_window_set_cursor(handle:Dynamic, cursor:Int):Void;\n\n\t@:cffi private static function lime_window_set_display_mode(handle:Dynamic, displayMode:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_window_set_fullscreen(handle:Dynamic, fullscreen:Bool):Bool;\n\n\t@:cffi private static function lime_window_set_icon(handle:Dynamic, buffer:Dynamic):Void;\n\n\t@:cffi private static function lime_window_set_maximized(handle:Dynamic, maximized:Bool):Bool;\n\n\t@:cffi private static function lime_window_set_minimized(handle:Dynamic, minimized:Bool):Bool;\n\n\t@:cffi private static function lime_window_set_mouse_lock(handle:Dynamic, mouseLock:Bool):Void;\n\n\t@:cffi private static function lime_window_set_opacity(handle:Dynamic, value:Float):Void;\n\n\t@:cffi private static function lime_window_set_resizable(handle:Dynamic, resizable:Bool):Bool;\n\n\t@:cffi private static function lime_window_set_text_input_enabled(handle:Dynamic, enabled:Bool):Void;\n\n\t@:cffi private static function lime_window_set_text_input_rect(handle:Dynamic, rect:Dynamic):Void;\n\n\t@:cffi private static function lime_window_set_title(handle:Dynamic, title:String):Dynamic;\n\n\t@:cffi private static function lime_window_set_visible(handle:Dynamic, visible:Bool):Bool;\n\n\t@:cffi private static function lime_window_warp_mouse(handle:Dynamic, x:Int, y:Int):Void;\n\n\t@:cffi private static function lime_window_event_manager_register(callback:Dynamic, eventObject:Dynamic):Void;\n\n\t@:cffi private static function lime_zlib_compress(data:Dynamic, bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_zlib_decompress(data:Dynamic, bytes:Dynamic):Dynamic;\n\t#else\n\tprivate static var lime_application_create = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_application_create\", \"o\", false));\n\tprivate static var lime_application_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_application_event_manager_register\", \"oov\", false));\n\tprivate static var lime_application_exec = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_application_exec\", \"oi\", false));\n\tprivate static var lime_application_init = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_application_init\", \"ov\", false));\n\tprivate static var lime_application_quit = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_application_quit\", \"oi\", false));\n\tprivate static var lime_application_set_frame_rate = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_application_set_frame_rate\", \"odv\", false));\n\tprivate static var lime_application_update = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_application_update\", \"ob\", false));\n\tprivate static var lime_audio_load = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_audio_load\", \"ooo\", false));\n\tprivate static var lime_audio_load_bytes = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_audio_load_bytes\",\n\t\t\"ooo\", false));\n\tprivate static var lime_audio_load_file = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_audio_load_file\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_bytes_from_data_pointer = new cpp.Callable<Float->Int->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_bytes_from_data_pointer\", \"dioo\", false));\n\tprivate static var lime_bytes_get_data_pointer = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_bytes_get_data_pointer\", \"od\",\n\t\tfalse));\n\tprivate static var lime_bytes_get_data_pointer_offset = new cpp.Callable<cpp.Object->Int->Float>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_bytes_get_data_pointer_offset\", \"oid\", false));\n\tprivate static var lime_bytes_read_file = new cpp.Callable<String->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_bytes_read_file\", \"soo\",\n\t\tfalse));\n\tprivate static var lime_cffi_get_native_pointer = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_cffi_get_native_pointer\", \"od\",\n\t\tfalse));\n\tprivate static var lime_clipboard_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_clipboard_event_manager_register\", \"oov\", false));\n\tprivate static var lime_clipboard_get_text = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_clipboard_get_text\", \"o\", false));\n\tprivate static var lime_clipboard_set_text = new cpp.Callable<String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_clipboard_set_text\", \"sv\", false));\n\tprivate static var lime_data_pointer_offset = new cpp.Callable<lime.utils.DataPointer->Int->Float>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_data_pointer_offset\", \"did\", false));\n\tprivate static var lime_deflate_compress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_deflate_compress\",\n\t\t\"ooo\", false));\n\tprivate static var lime_deflate_decompress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_deflate_decompress\",\n\t\t\"ooo\", false));\n\tprivate static var lime_drop_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_drop_event_manager_register\", \"oov\", false));\n\tprivate static var lime_file_dialog_open_directory = new cpp.Callable<String->String->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_file_dialog_open_directory\", \"ssso\", false));\n\tprivate static var lime_file_dialog_open_file = new cpp.Callable<String->String->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_file_dialog_open_file\", \"ssso\", false));\n\tprivate static var lime_file_dialog_open_files = new cpp.Callable<String->String->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_file_dialog_open_files\", \"ssso\", false));\n\tprivate static var lime_file_dialog_save_file = new cpp.Callable<String->String->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_file_dialog_save_file\", \"ssso\", false));\n\tprivate static var lime_file_watcher_create = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_file_watcher_create\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_file_watcher_add_directory = new cpp.Callable<cpp.Object->cpp.Object->Bool->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_file_watcher_add_directory\", \"oobo\", false));\n\tprivate static var lime_file_watcher_remove_directory = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_file_watcher_remove_directory\", \"oov\", false));\n\tprivate static var lime_file_watcher_update = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_file_watcher_update\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_font_get_ascender = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_ascender\", \"oi\", false));\n\tprivate static var lime_font_get_descender = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_descender\", \"oi\", false));\n\tprivate static var lime_font_get_family_name = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_family_name\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_font_get_glyph_index = new cpp.Callable<cpp.Object->String->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_glyph_index\", \"osi\",\n\t\tfalse));\n\tprivate static var lime_font_get_glyph_indices = new cpp.Callable<cpp.Object->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_font_get_glyph_indices\", \"oso\", false));\n\tprivate static var lime_font_get_glyph_metrics = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_glyph_metrics\",\n\t\t\"oio\", false));\n\tprivate static var lime_font_get_height = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_height\", \"oi\", false));\n\tprivate static var lime_font_get_num_glyphs = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_num_glyphs\", \"oi\", false));\n\tprivate static var lime_font_get_underline_position = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_underline_position\",\n\t\t\"oi\", false));\n\tprivate static var lime_font_get_underline_thickness = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_underline_thickness\",\n\t\t\"oi\", false));\n\tprivate static var lime_font_get_strikethrough_position = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_strikethrough_position\",\n\t\t\"oi\", false));\n\tprivate static var lime_font_get_strikethrough_thickness = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_strikethrough_thickness\",\n\t\t\"oi\", false));\n\tprivate static var lime_font_get_units_per_em = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_font_get_units_per_em\", \"oi\", false));\n\tprivate static var lime_font_load = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_font_load\", \"oo\", false));\n\tprivate static var lime_font_load_bytes = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_font_load_bytes\", \"oo\", false));\n\tprivate static var lime_font_load_file = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_font_load_file\", \"oo\", false));\n\tprivate static var lime_font_outline_decompose = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_font_outline_decompose\",\n\t\t\"oio\", false));\n\tprivate static var lime_font_render_glyph = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_font_render_glyph\", \"oioo\", false));\n\tprivate static var lime_font_render_glyphs = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_font_render_glyphs\", \"oooo\", false));\n\tprivate static var lime_font_set_size = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_font_set_size\", \"oiiv\", false));\n\tprivate static var lime_gamepad_add_mappings = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gamepad_add_mappings\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_gamepad_get_device_guid = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gamepad_get_device_guid\", \"io\",\n\t\tfalse));\n\tprivate static var lime_gamepad_get_device_name = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gamepad_get_device_name\", \"io\",\n\t\tfalse));\n\tprivate static var lime_gamepad_rumble = new cpp.Callable<Int->Float->Float->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gamepad_rumble\", \"iddiv\",\n\t\tfalse));\n\tprivate static var lime_gamepad_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gamepad_event_manager_register\", \"oov\", false));\n\tprivate static var lime_gzip_compress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gzip_compress\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_gzip_decompress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gzip_decompress\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_haptic_vibrate = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_haptic_vibrate\", \"iiv\", false));\n\tprivate static var lime_image_encode = new cpp.Callable<cpp.Object->Int->Int->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_image_encode\",\n\t\t\"oiioo\", false));\n\tprivate static var lime_image_load = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_image_load\", \"ooo\", false));\n\tprivate static var lime_image_load_bytes = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_image_load_bytes\",\n\t\t\"ooo\", false));\n\tprivate static var lime_image_load_file = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_image_load_file\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_image_data_util_color_transform = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_color_transform\", \"ooov\", false));\n\tprivate static var lime_image_data_util_copy_channel = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object->Int->Int->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_image_data_util_copy_channel\", \"ooooiiv\", false));\n\tprivate static var lime_image_data_util_copy_pixels = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object->cpp.Object->cpp.Object->Bool->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_image_data_util_copy_pixels\", \"oooooobv\", false));\n\tprivate static var lime_image_data_util_fill_rect = new cpp.Callable<cpp.Object->cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_fill_rect\", \"ooiiv\", false));\n\tprivate static var lime_image_data_util_flood_fill = new cpp.Callable<cpp.Object->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_flood_fill\", \"oiiiiv\", false));\n\tprivate static var lime_image_data_util_get_pixels = new cpp.Callable<cpp.Object->cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_get_pixels\", \"ooiov\", false));\n\tprivate static var lime_image_data_util_merge = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object->Int->Int->Int->Int->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_image_data_util_merge\", \"ooooiiiiv\", false));\n\tprivate static var lime_image_data_util_multiply_alpha = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_multiply_alpha\", \"ov\", false));\n\tprivate static var lime_image_data_util_resize = new cpp.Callable<cpp.Object->cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_resize\", \"ooiiv\", false));\n\tprivate static var lime_image_data_util_set_format = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_set_format\", \"oiv\", false));\n\tprivate static var lime_image_data_util_set_pixels = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int->Int->Int->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_image_data_util_set_pixels\", \"oooiiiv\", false));\n\tprivate static var lime_image_data_util_threshold = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object->Int->Int->Int->Int->Int->Int->Int->\n\t\tBool->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_image_data_util_threshold\", \"ooooiiiiiiibi\", false));\n\tprivate static var lime_image_data_util_unmultiply_alpha = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_image_data_util_unmultiply_alpha\", \"ov\", false));\n\tprivate static var lime_joystick_get_device_guid = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_joystick_get_device_guid\", \"io\",\n\t\tfalse));\n\tprivate static var lime_joystick_get_device_name = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_joystick_get_device_name\", \"io\",\n\t\tfalse));\n\tprivate static var lime_joystick_get_num_axes = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_joystick_get_num_axes\", \"ii\", false));\n\tprivate static var lime_joystick_get_num_buttons = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_joystick_get_num_buttons\", \"ii\", false));\n\tprivate static var lime_joystick_get_num_hats = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_joystick_get_num_hats\", \"ii\", false));\n\tprivate static var lime_joystick_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_joystick_event_manager_register\", \"oov\", false));\n\tprivate static var lime_jpeg_decode_bytes = new cpp.Callable<cpp.Object->Bool->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_jpeg_decode_bytes\", \"oboo\", false));\n\tprivate static var lime_jpeg_decode_file = new cpp.Callable<String->Bool->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_jpeg_decode_file\",\n\t\t\"sboo\", false));\n\tprivate static var lime_key_code_from_scan_code = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_key_code_from_scan_code\",\n\t\t\"ii\", false));\n\tprivate static var lime_key_code_to_scan_code = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_key_code_to_scan_code\",\n\t\t\"ii\", false));\n\tprivate static var lime_key_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_key_event_manager_register\", \"oov\", false));\n\tprivate static var lime_lzma_compress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_lzma_compress\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_lzma_decompress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_lzma_decompress\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_mouse_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_mouse_event_manager_register\", \"oov\", false));\n\tprivate static var lime_neko_execute = new cpp.Callable<String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_neko_execute\", \"sv\", false));\n\tprivate static var lime_orientation_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_orientation_event_manager_register\", \"oov\", false));\n\tprivate static var lime_png_decode_bytes = new cpp.Callable<cpp.Object->Bool->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_png_decode_bytes\", \"oboo\", false));\n\tprivate static var lime_png_decode_file = new cpp.Callable<String->Bool->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_png_decode_file\",\n\t\t\"sboo\", false));\n\tprivate static var lime_render_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_render_event_manager_register\", \"oov\", false));\n\tprivate static var lime_sensor_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_sensor_event_manager_register\", \"oov\", false));\n\tprivate static var lime_system_get_allow_screen_timeout = new cpp.Callable<Void->Bool>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_system_get_allow_screen_timeout\", \"b\", false));\n\tprivate static var lime_system_set_allow_screen_timeout = new cpp.Callable<Bool->Bool>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_system_set_allow_screen_timeout\", \"bb\", false));\n\tprivate static var lime_system_get_device_model = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_device_model\", \"o\",\n\t\tfalse));\n\tprivate static var lime_system_get_device_vendor = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_device_vendor\", \"o\",\n\t\tfalse));\n\tprivate static var lime_system_get_directory = new cpp.Callable<Int->String->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_directory\",\n\t\t\"isso\", false));\n\tprivate static var lime_system_get_display = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_display\", \"io\", false));\n\tprivate static var lime_system_get_ios_tablet = new cpp.Callable<Void->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_ios_tablet\", \"b\", false));\n\tprivate static var lime_system_get_num_displays = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_num_displays\", \"i\", false));\n\tprivate static var lime_system_get_device_orientation = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_device_orientation\", \"i\", false));\n\tprivate static var lime_system_get_platform_label = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_platform_label\", \"o\",\n\t\tfalse));\n\tprivate static var lime_system_get_platform_name = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_platform_name\", \"o\",\n\t\tfalse));\n\tprivate static var lime_system_get_platform_version = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_platform_version\",\n\t\t\"o\", false));\n\tprivate static var lime_system_get_timer = new cpp.Callable<Void->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_system_get_timer\", \"d\", false));\n\tprivate static var lime_system_open_file = new cpp.Callable<String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_system_open_file\", \"sv\", false));\n\tprivate static var lime_system_open_url = new cpp.Callable<String->String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_system_open_url\", \"ssv\", false));\n\tprivate static var lime_text_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_text_event_manager_register\", \"oov\", false));\n\tprivate static var lime_touch_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_touch_event_manager_register\", \"oov\", false));\n\tprivate static var lime_window_alert = new cpp.Callable<cpp.Object->String->String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_alert\", \"ossv\",\n\t\tfalse));\n\tprivate static var lime_window_close = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_close\", \"ov\", false));\n\tprivate static var lime_window_context_flip = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_context_flip\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_window_context_lock = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_window_context_lock\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_window_context_make_current = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_context_make_current\", \"ov\", false));\n\tprivate static var lime_window_context_unlock = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_context_unlock\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_window_create = new cpp.Callable<cpp.Object->Int->Int->Int->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_window_create\",\n\t\t\"oiiiso\", false));\n\tprivate static var lime_window_focus = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_focus\", \"ov\", false));\n\tprivate static var lime_window_get_context = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_context\", \"od\", false));\n\tprivate static var lime_window_get_context_type = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_context_type\",\n\t\t\"oo\", false));\n\tprivate static var lime_window_get_display = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_display\", \"oi\", false));\n\tprivate static var lime_window_get_display_mode = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_display_mode\",\n\t\t\"oo\", false));\n\tprivate static var lime_window_get_height = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_height\", \"oi\", false));\n\tprivate static var lime_window_get_id = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_id\", \"oi\", false));\n\tprivate static var lime_window_get_mouse_lock = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_mouse_lock\", \"ob\",\n\t\tfalse));\n\tprivate static var lime_window_get_opacity = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_opacity\", \"od\", false));\n\tprivate static var lime_window_get_scale = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_scale\", \"od\", false));\n\tprivate static var lime_window_get_text_input_enabled = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_get_text_input_enabled\", \"ob\", false));\n\tprivate static var lime_window_get_width = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_width\", \"oi\", false));\n\tprivate static var lime_window_get_x = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_x\", \"oi\", false));\n\tprivate static var lime_window_get_y = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_window_get_y\", \"oi\", false));\n\tprivate static var lime_window_move = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_move\", \"oiiv\", false));\n\tprivate static var lime_window_read_pixels = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_read_pixels\", \"oooo\", false));\n\tprivate static var lime_window_resize = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_resize\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_window_set_minimum_size = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_minimum_size\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_window_set_maximum_size = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_maximum_size\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_window_set_borderless = new cpp.Callable<cpp.Object->Bool->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_borderless\", \"obb\",\n\t\tfalse));\n\tprivate static var lime_window_set_cursor = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_cursor\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_window_set_display_mode = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_set_display_mode\", \"ooo\", false));\n\tprivate static var lime_window_set_fullscreen = new cpp.Callable<cpp.Object->Bool->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_fullscreen\", \"obb\",\n\t\tfalse));\n\tprivate static var lime_window_set_icon = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_icon\", \"oov\",\n\t\tfalse));\n\tprivate static var lime_window_set_maximized = new cpp.Callable<cpp.Object->Bool->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_maximized\", \"obb\",\n\t\tfalse));\n\tprivate static var lime_window_set_minimized = new cpp.Callable<cpp.Object->Bool->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_minimized\", \"obb\",\n\t\tfalse));\n\tprivate static var lime_window_set_mouse_lock = new cpp.Callable<cpp.Object->Bool->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_mouse_lock\",\n\t\t\"obv\", false));\n\tprivate static var lime_window_set_opacity = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_opacity\", \"odv\",\n\t\tfalse));\n\tprivate static var lime_window_set_resizable = new cpp.Callable<cpp.Object->Bool->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_resizable\", \"obb\",\n\t\tfalse));\n\tprivate static var lime_window_set_text_input_enabled = new cpp.Callable<cpp.Object->Bool->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_set_text_input_enabled\", \"obv\", false));\n\tprivate static var lime_window_set_text_input_rect = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_set_text_input_rect\", \"oov\", false));\n\tprivate static var lime_window_set_title = new cpp.Callable<cpp.Object->String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_title\", \"oso\",\n\t\tfalse));\n\tprivate static var lime_window_set_visible = new cpp.Callable<cpp.Object->Bool->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_window_set_visible\", \"obb\",\n\t\tfalse));\n\tprivate static var lime_window_warp_mouse = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_window_warp_mouse\",\n\t\t\"oiiv\", false));\n\tprivate static var lime_window_event_manager_register = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_window_event_manager_register\", \"oov\", false));\n\tprivate static var lime_zlib_compress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_zlib_compress\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_zlib_decompress = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_zlib_decompress\", \"ooo\",\n\t\tfalse));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_application_create = CFFI.load(\"lime\", \"lime_application_create\", 0);\n\tprivate static var lime_application_event_manager_register = CFFI.load(\"lime\", \"lime_application_event_manager_register\", 2);\n\tprivate static var lime_application_exec = CFFI.load(\"lime\", \"lime_application_exec\", 1);\n\tprivate static var lime_application_init = CFFI.load(\"lime\", \"lime_application_init\", 1);\n\tprivate static var lime_application_quit = CFFI.load(\"lime\", \"lime_application_quit\", 1);\n\tprivate static var lime_application_set_frame_rate = CFFI.load(\"lime\", \"lime_application_set_frame_rate\", 2);\n\tprivate static var lime_application_update = CFFI.load(\"lime\", \"lime_application_update\", 1);\n\tprivate static var lime_audio_load = CFFI.load(\"lime\", \"lime_audio_load\", 2);\n\tprivate static var lime_audio_load_bytes = CFFI.load(\"lime\", \"lime_audio_load_bytes\", 2);\n\tprivate static var lime_audio_load_file = CFFI.load(\"lime\", \"lime_audio_load_file\", 2);\n\tprivate static var lime_bytes_from_data_pointer = CFFI.load(\"lime\", \"lime_bytes_from_data_pointer\", 3);\n\tprivate static var lime_bytes_get_data_pointer = CFFI.load(\"lime\", \"lime_bytes_get_data_pointer\", 1);\n\tprivate static var lime_bytes_get_data_pointer_offset = CFFI.load(\"lime\", \"lime_bytes_get_data_pointer_offset\", 2);\n\tprivate static var lime_bytes_read_file = CFFI.load(\"lime\", \"lime_bytes_read_file\", 2);\n\tprivate static var lime_cffi_get_native_pointer = CFFI.load(\"lime\", \"lime_cffi_get_native_pointer\", 1);\n\tprivate static var lime_clipboard_event_manager_register = CFFI.load(\"lime\", \"lime_clipboard_event_manager_register\", 2);\n\tprivate static var lime_clipboard_get_text = CFFI.load(\"lime\", \"lime_clipboard_get_text\", 0);\n\tprivate static var lime_clipboard_set_text = CFFI.load(\"lime\", \"lime_clipboard_set_text\", 1);\n\tprivate static var lime_data_pointer_offset = CFFI.load(\"lime\", \"lime_data_pointer_offset\", 2);\n\tprivate static var lime_deflate_compress = CFFI.load(\"lime\", \"lime_deflate_compress\", 2);\n\tprivate static var lime_deflate_decompress = CFFI.load(\"lime\", \"lime_deflate_decompress\", 2);\n\tprivate static var lime_drop_event_manager_register = CFFI.load(\"lime\", \"lime_drop_event_manager_register\", 2);\n\tprivate static var lime_file_dialog_open_directory = CFFI.load(\"lime\", \"lime_file_dialog_open_directory\", 3);\n\tprivate static var lime_file_dialog_open_file = CFFI.load(\"lime\", \"lime_file_dialog_open_file\", 3);\n\tprivate static var lime_file_dialog_open_files = CFFI.load(\"lime\", \"lime_file_dialog_open_files\", 3);\n\tprivate static var lime_file_dialog_save_file = CFFI.load(\"lime\", \"lime_file_dialog_save_file\", 3);\n\tprivate static var lime_file_watcher_create = CFFI.load(\"lime\", \"lime_file_watcher_create\", 1);\n\tprivate static var lime_file_watcher_add_directory = CFFI.load(\"lime\", \"lime_file_watcher_add_directory\", 3);\n\tprivate static var lime_file_watcher_remove_directory = CFFI.load(\"lime\", \"lime_file_watcher_remove_directory\", 2);\n\tprivate static var lime_file_watcher_update = CFFI.load(\"lime\", \"lime_file_watcher_update\", 1);\n\tprivate static var lime_font_get_ascender = CFFI.load(\"lime\", \"lime_font_get_ascender\", 1);\n\tprivate static var lime_font_get_descender = CFFI.load(\"lime\", \"lime_font_get_descender\", 1);\n\tprivate static var lime_font_get_family_name = CFFI.load(\"lime\", \"lime_font_get_family_name\", 1);\n\tprivate static var lime_font_get_glyph_index = CFFI.load(\"lime\", \"lime_font_get_glyph_index\", 2);\n\tprivate static var lime_font_get_glyph_indices = CFFI.load(\"lime\", \"lime_font_get_glyph_indices\", 2);\n\tprivate static var lime_font_get_glyph_metrics = CFFI.load(\"lime\", \"lime_font_get_glyph_metrics\", 2);\n\tprivate static var lime_font_get_height = CFFI.load(\"lime\", \"lime_font_get_height\", 1);\n\tprivate static var lime_font_get_num_glyphs = CFFI.load(\"lime\", \"lime_font_get_num_glyphs\", 1);\n\tprivate static var lime_font_get_underline_position = CFFI.load(\"lime\", \"lime_font_get_underline_position\", 1);\n\tprivate static var lime_font_get_underline_thickness = CFFI.load(\"lime\", \"lime_font_get_underline_thickness\", 1);\n\tprivate static var lime_font_get_strikethrough_position = CFFI.load(\"lime\", \"lime_font_get_strikethrough_position\", 1);\n\tprivate static var lime_font_get_strikethrough_thickness = CFFI.load(\"lime\", \"lime_font_get_strikethrough_thickness\", 1);\n\tprivate static var lime_font_get_units_per_em = CFFI.load(\"lime\", \"lime_font_get_units_per_em\", 1);\n\tprivate static var lime_font_load = CFFI.load(\"lime\", \"lime_font_load\", 1);\n\tprivate static var lime_font_load_bytes = CFFI.load(\"lime\", \"lime_font_load_bytes\", 1);\n\tprivate static var lime_font_load_file = CFFI.load(\"lime\", \"lime_font_load_file\", 1);\n\tprivate static var lime_font_outline_decompose = CFFI.load(\"lime\", \"lime_font_outline_decompose\", 2);\n\tprivate static var lime_font_render_glyph = CFFI.load(\"lime\", \"lime_font_render_glyph\", 3);\n\tprivate static var lime_font_render_glyphs = CFFI.load(\"lime\", \"lime_font_render_glyphs\", 3);\n\tprivate static var lime_font_set_size = CFFI.load(\"lime\", \"lime_font_set_size\", 3);\n\tprivate static var lime_gamepad_add_mappings = CFFI.load(\"lime\", \"lime_gamepad_add_mappings\", 1);\n\tprivate static var lime_gamepad_get_device_guid = CFFI.load(\"lime\", \"lime_gamepad_get_device_guid\", 1);\n\tprivate static var lime_gamepad_get_device_name = CFFI.load(\"lime\", \"lime_gamepad_get_device_name\", 1);\n\tprivate static var lime_gamepad_rumble = CFFI.load(\"lime\", \"lime_gamepad_rumble\", 4);\n\tprivate static var lime_gamepad_event_manager_register = CFFI.load(\"lime\", \"lime_gamepad_event_manager_register\", 2);\n\tprivate static var lime_gzip_compress = CFFI.load(\"lime\", \"lime_gzip_compress\", 2);\n\tprivate static var lime_gzip_decompress = CFFI.load(\"lime\", \"lime_gzip_decompress\", 2);\n\tprivate static var lime_haptic_vibrate = CFFI.load(\"lime\", \"lime_haptic_vibrate\", 2);\n\tprivate static var lime_image_encode = CFFI.load(\"lime\", \"lime_image_encode\", 4);\n\tprivate static var lime_image_load = CFFI.load(\"lime\", \"lime_image_load\", 2);\n\tprivate static var lime_image_load_bytes = CFFI.load(\"lime\", \"lime_image_load_bytes\", 2);\n\tprivate static var lime_image_load_file = CFFI.load(\"lime\", \"lime_image_load_file\", 2);\n\tprivate static var lime_image_data_util_color_transform = CFFI.load(\"lime\", \"lime_image_data_util_color_transform\", 3);\n\tprivate static var lime_image_data_util_copy_channel = CFFI.load(\"lime\", \"lime_image_data_util_copy_channel\", -1);\n\tprivate static var lime_image_data_util_copy_pixels = CFFI.load(\"lime\", \"lime_image_data_util_copy_pixels\", -1);\n\tprivate static var lime_image_data_util_fill_rect = CFFI.load(\"lime\", \"lime_image_data_util_fill_rect\", 4);\n\tprivate static var lime_image_data_util_flood_fill = CFFI.load(\"lime\", \"lime_image_data_util_flood_fill\", 5);\n\tprivate static var lime_image_data_util_get_pixels = CFFI.load(\"lime\", \"lime_image_data_util_get_pixels\", 4);\n\tprivate static var lime_image_data_util_merge = CFFI.load(\"lime\", \"lime_image_data_util_merge\", -1);\n\tprivate static var lime_image_data_util_multiply_alpha = CFFI.load(\"lime\", \"lime_image_data_util_multiply_alpha\", 1);\n\tprivate static var lime_image_data_util_resize = CFFI.load(\"lime\", \"lime_image_data_util_resize\", 4);\n\tprivate static var lime_image_data_util_set_format = CFFI.load(\"lime\", \"lime_image_data_util_set_format\", 2);\n\tprivate static var lime_image_data_util_set_pixels = CFFI.load(\"lime\", \"lime_image_data_util_set_pixels\", -1);\n\tprivate static var lime_image_data_util_threshold = CFFI.load(\"lime\", \"lime_image_data_util_threshold\", -1);\n\tprivate static var lime_image_data_util_unmultiply_alpha = CFFI.load(\"lime\", \"lime_image_data_util_unmultiply_alpha\", 1);\n\tprivate static var lime_joystick_get_device_guid = CFFI.load(\"lime\", \"lime_joystick_get_device_guid\", 1);\n\tprivate static var lime_joystick_get_device_name = CFFI.load(\"lime\", \"lime_joystick_get_device_name\", 1);\n\tprivate static var lime_joystick_get_num_axes = CFFI.load(\"lime\", \"lime_joystick_get_num_axes\", 1);\n\tprivate static var lime_joystick_get_num_buttons = CFFI.load(\"lime\", \"lime_joystick_get_num_buttons\", 1);\n\tprivate static var lime_joystick_get_num_hats = CFFI.load(\"lime\", \"lime_joystick_get_num_hats\", 1);\n\tprivate static var lime_joystick_event_manager_register = CFFI.load(\"lime\", \"lime_joystick_event_manager_register\", 2);\n\tprivate static var lime_jpeg_decode_bytes = CFFI.load(\"lime\", \"lime_jpeg_decode_bytes\", 3);\n\tprivate static var lime_jpeg_decode_file = CFFI.load(\"lime\", \"lime_jpeg_decode_file\", 3);\n\tprivate static var lime_key_code_from_scan_code = CFFI.load(\"lime\", \"lime_key_code_from_scan_code\", 1);\n\tprivate static var lime_key_code_to_scan_code = CFFI.load(\"lime\", \"lime_key_code_to_scan_code\", 1);\n\tprivate static var lime_key_event_manager_register = CFFI.load(\"lime\", \"lime_key_event_manager_register\", 2);\n\tprivate static var lime_lzma_compress = CFFI.load(\"lime\", \"lime_lzma_compress\", 2);\n\tprivate static var lime_lzma_decompress = CFFI.load(\"lime\", \"lime_lzma_decompress\", 2);\n\tprivate static var lime_mouse_event_manager_register = CFFI.load(\"lime\", \"lime_mouse_event_manager_register\", 2);\n\tprivate static var lime_neko_execute = CFFI.load(\"lime\", \"lime_neko_execute\", 1);\n\tprivate static var lime_orientation_event_manager_register = CFFI.load(\"lime\", \"lime_orientation_event_manager_register\", 2);\n\tprivate static var lime_png_decode_bytes = CFFI.load(\"lime\", \"lime_png_decode_bytes\", 3);\n\tprivate static var lime_png_decode_file = CFFI.load(\"lime\", \"lime_png_decode_file\", 3);\n\tprivate static var lime_render_event_manager_register = CFFI.load(\"lime\", \"lime_render_event_manager_register\", 2);\n\tprivate static var lime_sensor_event_manager_register = CFFI.load(\"lime\", \"lime_sensor_event_manager_register\", 2);\n\tprivate static var lime_system_get_allow_screen_timeout = CFFI.load(\"lime\", \"lime_system_get_allow_screen_timeout\", 0);\n\tprivate static var lime_system_set_allow_screen_timeout = CFFI.load(\"lime\", \"lime_system_set_allow_screen_timeout\", 1);\n\tprivate static var lime_system_get_device_model = CFFI.load(\"lime\", \"lime_system_get_device_model\", 0);\n\tprivate static var lime_system_get_device_vendor = CFFI.load(\"lime\", \"lime_system_get_device_vendor\", 0);\n\tprivate static var lime_system_get_directory = CFFI.load(\"lime\", \"lime_system_get_directory\", 3);\n\tprivate static var lime_system_get_display = CFFI.load(\"lime\", \"lime_system_get_display\", 1);\n\tprivate static var lime_system_get_ios_tablet = CFFI.load(\"lime\", \"lime_system_get_ios_tablet\", 0);\n\tprivate static var lime_system_get_num_displays = CFFI.load(\"lime\", \"lime_system_get_num_displays\", 0);\n\tprivate static var lime_system_get_device_orientation = CFFI.load(\"lime\", \"lime_system_get_device_orientation\", 0);\n\tprivate static var lime_system_get_platform_label = CFFI.load(\"lime\", \"lime_system_get_platform_label\", 0);\n\tprivate static var lime_system_get_platform_name = CFFI.load(\"lime\", \"lime_system_get_platform_name\", 0);\n\tprivate static var lime_system_get_platform_version = CFFI.load(\"lime\", \"lime_system_get_platform_version\", 0);\n\tprivate static var lime_system_get_timer = CFFI.load(\"lime\", \"lime_system_get_timer\", 0);\n\tprivate static var lime_system_open_file = CFFI.load(\"lime\", \"lime_system_open_file\", 1);\n\tprivate static var lime_system_open_url = CFFI.load(\"lime\", \"lime_system_open_url\", 2);\n\tprivate static var lime_text_event_manager_register = CFFI.load(\"lime\", \"lime_text_event_manager_register\", 2);\n\tprivate static var lime_touch_event_manager_register = CFFI.load(\"lime\", \"lime_touch_event_manager_register\", 2);\n\tprivate static var lime_window_alert = CFFI.load(\"lime\", \"lime_window_alert\", 3);\n\tprivate static var lime_window_close = CFFI.load(\"lime\", \"lime_window_close\", 1);\n\tprivate static var lime_window_context_flip = CFFI.load(\"lime\", \"lime_window_context_flip\", 1);\n\tprivate static var lime_window_context_lock = CFFI.load(\"lime\", \"lime_window_context_lock\", 1);\n\tprivate static var lime_window_context_make_current = CFFI.load(\"lime\", \"lime_window_context_make_current\", 1);\n\tprivate static var lime_window_context_unlock = CFFI.load(\"lime\", \"lime_window_context_unlock\", 1);\n\tprivate static var lime_window_create = CFFI.load(\"lime\", \"lime_window_create\", 5);\n\tprivate static var lime_window_focus = CFFI.load(\"lime\", \"lime_window_focus\", 1);\n\tprivate static var lime_window_get_context = CFFI.load(\"lime\", \"lime_window_get_context\", 1);\n\tprivate static var lime_window_get_context_type = CFFI.load(\"lime\", \"lime_window_get_context_type\", 1);\n\tprivate static var lime_window_get_display = CFFI.load(\"lime\", \"lime_window_get_display\", 1);\n\tprivate static var lime_window_get_display_mode = CFFI.load(\"lime\", \"lime_window_get_display_mode\", 1);\n\tprivate static var lime_window_get_height = CFFI.load(\"lime\", \"lime_window_get_height\", 1);\n\tprivate static var lime_window_get_id = CFFI.load(\"lime\", \"lime_window_get_id\", 1);\n\tprivate static var lime_window_get_mouse_lock = CFFI.load(\"lime\", \"lime_window_get_mouse_lock\", 1);\n\tprivate static var lime_window_get_opacity = CFFI.load(\"lime\", \"lime_window_get_opacity\", 1);\n\tprivate static var lime_window_get_scale = CFFI.load(\"lime\", \"lime_window_get_scale\", 1);\n\tprivate static var lime_window_get_text_input_enabled = CFFI.load(\"lime\", \"lime_window_get_text_input_enabled\", 1);\n\tprivate static var lime_window_get_width = CFFI.load(\"lime\", \"lime_window_get_width\", 1);\n\tprivate static var lime_window_get_x = CFFI.load(\"lime\", \"lime_window_get_x\", 1);\n\tprivate static var lime_window_get_y = CFFI.load(\"lime\", \"lime_window_get_y\", 1);\n\tprivate static var lime_window_move = CFFI.load(\"lime\", \"lime_window_move\", 3);\n\tprivate static var lime_window_read_pixels = CFFI.load(\"lime\", \"lime_window_read_pixels\", 3);\n\tprivate static var lime_window_resize = CFFI.load(\"lime\", \"lime_window_resize\", 3);\n\tprivate static var lime_window_set_minimum_size = CFFI.load(\"lime\", \"lime_window_set_minimum_size\", 3);\n\tprivate static var lime_window_set_maximum_size = CFFI.load(\"lime\", \"lime_window_set_maximum_size\", 3);\n\tprivate static var lime_window_set_borderless = CFFI.load(\"lime\", \"lime_window_set_borderless\", 2);\n\tprivate static var lime_window_set_cursor = CFFI.load(\"lime\", \"lime_window_set_cursor\", 2);\n\tprivate static var lime_window_set_display_mode = CFFI.load(\"lime\", \"lime_window_set_display_mode\", 2);\n\tprivate static var lime_window_set_fullscreen = CFFI.load(\"lime\", \"lime_window_set_fullscreen\", 2);\n\tprivate static var lime_window_set_icon = CFFI.load(\"lime\", \"lime_window_set_icon\", 2);\n\tprivate static var lime_window_set_maximized = CFFI.load(\"lime\", \"lime_window_set_maximized\", 2);\n\tprivate static var lime_window_set_minimized = CFFI.load(\"lime\", \"lime_window_set_minimized\", 2);\n\tprivate static var lime_window_set_mouse_lock = CFFI.load(\"lime\", \"lime_window_set_mouse_lock\", 2);\n\tprivate static var lime_window_set_opacity = CFFI.load(\"lime\", \"lime_window_set_opacity\", 2);\n\tprivate static var lime_window_set_resizable = CFFI.load(\"lime\", \"lime_window_set_resizable\", 2);\n\tprivate static var lime_window_set_text_input_enabled = CFFI.load(\"lime\", \"lime_window_set_text_input_enabled\", 2);\n\tprivate static var lime_window_set_text_input_rect = CFFI.load(\"lime\", \"lime_window_set_text_input_rect\", 2);\n\tprivate static var lime_window_set_title = CFFI.load(\"lime\", \"lime_window_set_title\", 2);\n\tprivate static var lime_window_set_visible = CFFI.load(\"lime\", \"lime_window_set_visible\", 2);\n\tprivate static var lime_window_warp_mouse = CFFI.load(\"lime\", \"lime_window_warp_mouse\", 3);\n\tprivate static var lime_window_event_manager_register = CFFI.load(\"lime\", \"lime_window_event_manager_register\", 2);\n\tprivate static var lime_zlib_compress = CFFI.load(\"lime\", \"lime_zlib_compress\", 2);\n\tprivate static var lime_zlib_decompress = CFFI.load(\"lime\", \"lime_zlib_decompress\", 2);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_application_create\") private static function lime_application_create():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_application_event_manager_register\") private static function lime_application_event_manager_register(callback:Void->Void,\n\t\teventObject:ApplicationEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_application_exec\") private static function lime_application_exec(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_application_init\") private static function lime_application_init(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_application_quit\") private static function lime_application_quit(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_application_set_frame_rate\") private static function lime_application_set_frame_rate(handle:CFFIPointer, value:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_application_update\") private static function lime_application_update(handle:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t// @:cffi private static function lime_audio_load (data:Dynamic, buffer:Dynamic):Dynamic;\n\t@:hlNative(\"lime\", \"hl_audio_load_bytes\") private static function lime_audio_load_bytes(data:Bytes, buffer:AudioBuffer):AudioBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_audio_load_file\") private static function lime_audio_load_file(path:String, buffer:AudioBuffer):AudioBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_bytes_from_data_pointer\") private static function lime_bytes_from_data_pointer(data:Float, length:Int, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_bytes_get_data_pointer\") private static function lime_bytes_get_data_pointer(data:Bytes):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_bytes_get_data_pointer_offset\") private static function lime_bytes_get_data_pointer_offset(data:Bytes, offset:Int):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_bytes_read_file\") private static function lime_bytes_read_file(path:String, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cffi_get_native_pointer\") private static function lime_cffi_get_native_pointer(ptr:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_clipboard_event_manager_register\") private static function lime_clipboard_event_manager_register(callback:Void->Void,\n\t\teventObject:ClipboardEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_clipboard_get_text\") private static function lime_clipboard_get_text():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_clipboard_set_text\") private static function lime_clipboard_set_text(text:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_data_pointer_offset\") private static function lime_data_pointer_offset(dataPointer:DataPointer, offset:Int):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_deflate_compress\") private static function lime_deflate_compress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_deflate_decompress\") private static function lime_deflate_decompress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_drop_event_manager_register\") private static function lime_drop_event_manager_register(callback:Void->Void,\n\t\teventObject:DropEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_file_dialog_open_directory\") private static function lime_file_dialog_open_directory(title:String, filter:String,\n\t\t\tdefaultPath:String):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_file_dialog_open_file\") private static function lime_file_dialog_open_file(title:String, filter:String,\n\t\t\tdefaultPath:String):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_file_dialog_open_files\") private static function lime_file_dialog_open_files(title:String, filter:String,\n\t\t\tdefaultPath:String):hl.NativeArray<hl.Bytes>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_file_dialog_save_file\") private static function lime_file_dialog_save_file(title:String, filter:String,\n\t\t\tdefaultPath:String):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_file_watcher_create\") private static function lime_file_watcher_create(callback:Dynamic):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_file_watcher_add_directory\") private static function lime_file_watcher_add_directory(handle:CFFIPointer, path:String,\n\t\t\trecursive:Bool):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_file_watcher_remove_directory\") private static function lime_file_watcher_remove_directory(handle:CFFIPointer,\n\t\twatchID:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_file_watcher_update\") private static function lime_file_watcher_update(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_font_get_ascender\") private static function lime_font_get_ascender(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_descender\") private static function lime_font_get_descender(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_family_name\") private static function lime_font_get_family_name(handle:CFFIPointer):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_glyph_index\") private static function lime_font_get_glyph_index(handle:CFFIPointer, character:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_glyph_indices\") private static function lime_font_get_glyph_indices(handle:CFFIPointer,\n\t\t\tcharacters:String):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_glyph_metrics\") private static function lime_font_get_glyph_metrics(handle:CFFIPointer, index:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_height\") private static function lime_font_get_height(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_num_glyphs\") private static function lime_font_get_num_glyphs(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_underline_position\") private static function lime_font_get_underline_position(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_underline_thickness\") private static function lime_font_get_underline_thickness(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_strikethrough_position\") private static function lime_font_get_strikethrough_position(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_strikethrough_thickness\") private static function lime_font_get_strikethrough_thickness(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_get_units_per_em\") private static function lime_font_get_units_per_em(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t// @:hlNative(\"lime\", \"\") private static function lime_font_load (data:Dynamic):Dynamic { return null; }\n\t@:hlNative(\"lime\", \"hl_font_load_bytes\") private static function lime_font_load_bytes(data:Bytes):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_load_file\") private static function lime_font_load_file(path:String):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_outline_decompose\") private static function lime_font_outline_decompose(handle:CFFIPointer, size:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_render_glyph\") private static function lime_font_render_glyph(handle:CFFIPointer, index:Int, data:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_render_glyphs\") private static function lime_font_render_glyphs(handle:CFFIPointer, indices:hl.NativeArray<Int>,\n\t\t\tdata:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_font_set_size\") private static function lime_font_set_size(handle:CFFIPointer, size:Int, dpi:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gamepad_add_mappings\") private static function lime_gamepad_add_mappings(mappings:hl.NativeArray<String>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gamepad_get_device_guid\") private static function lime_gamepad_get_device_guid(id:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gamepad_get_device_name\") private static function lime_gamepad_get_device_name(id:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gamepad_rumble\") private static function lime_gamepad_rumble(id:Int, lowFrequencyRumble:Float, highFrequencyRumble:Float, duration:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gamepad_event_manager_register\") private static function lime_gamepad_event_manager_register(callback:Void->Void,\n\t\teventObject:GamepadEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gzip_compress\") private static function lime_gzip_compress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gzip_decompress\") private static function lime_gzip_decompress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_haptic_vibrate\") private static function lime_haptic_vibrate(period:Int, duration:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_encode\") private static function lime_image_encode(data:ImageBuffer, type:Int, quality:Int, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t// @:cffi private static function lime_image_load (data:Dynamic, buffer:Dynamic):Dynamic;\n\t@:hlNative(\"lime\", \"hl_image_load_bytes\") private static function lime_image_load_bytes(data:Bytes, buffer:ImageBuffer):ImageBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_image_load_file\") private static function lime_image_load_file(path:String, buffer:ImageBuffer):ImageBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_color_transform\") private static function lime_image_data_util_color_transform(image:Image, rect:Rectangle,\n\t\tcolorMatrix:ArrayBufferView):Void {}\n\n\t// @:cffi private static function lime_image_data_util_copy_channel (image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, srcChannel:Int, destChannel:Int):Void;\n\t@:hlNative(\"lime\", \"hl_image_data_util_copy_channel\") private static function lime_image_data_util_copy_channel(image:Image, sourceImage:Image,\n\t\tsourceRect:Rectangle, destPoint:Vector2, srcChannel:Int, destChannel:Int):Void {}\n\n\t// @:cffi private static function lime_image_data_util_copy_pixels (image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, alphaImage:Dynamic, alphaPoint:Dynamic, mergeAlpha:Bool):Void;\n\t@:hlNative(\"lime\", \"hl_image_data_util_copy_pixels\") private static function lime_image_data_util_copy_pixels(image:Image, sourceImage:Image,\n\t\tsourceRect:Rectangle, destPoint:Vector2, alphaImage:Image, alphaPoint:Vector2, mergeAlpha:Bool):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_fill_rect\") private static function lime_image_data_util_fill_rect(image:Image, rect:Rectangle, rg:Int,\n\t\tba:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_flood_fill\") private static function lime_image_data_util_flood_fill(image:Image, x:Int, y:Int, rg:Int,\n\t\tba:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_get_pixels\") private static function lime_image_data_util_get_pixels(image:Image, rect:Rectangle, format:Int,\n\t\tbytes:Bytes):Void {}\n\n\t// @:cffi private static function lime_image_data_util_merge (image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, redMultiplier:Int, greenMultiplier:Int, blueMultiplier:Int, alphaMultiplier:Int):Void;\n\t@:hlNative(\"lime\", \"hl_image_data_util_merge\") private static function lime_image_data_util_merge(image:Image, sourceImage:Image, sourceRect:Rectangle,\n\t\tdestPoint:Vector2, redMultiplier:Int, greenMultiplier:Int, blueMultiplier:Int, alphaMultiplier:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_multiply_alpha\") private static function lime_image_data_util_multiply_alpha(image:Image):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_resize\") private static function lime_image_data_util_resize(image:Image, buffer:ImageBuffer, width:Int,\n\t\theight:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_set_format\") private static function lime_image_data_util_set_format(image:Image, format:Int):Void {}\n\n\t// @:cffi private static function lime_image_data_util_set_pixels (image:Dynamic, rect:Dynamic, bytes:Dynamic, offset:Int, format:Int, endian:Int):Void;\n\t@:hlNative(\"lime\", \"hl_image_data_util_set_pixels\") private static function lime_image_data_util_set_pixels(image:Image, rect:Rectangle, bytes:Bytes,\n\t\toffset:Int, format:Int, endian:Int):Void {}\n\n\t// @:cffi private static function lime_image_data_util_threshold (image:Dynamic, sourceImage:Dynamic, sourceRect:Dynamic, destPoint:Dynamic, operation:Int, thresholdRG:Int, thresholdBA:Int, colorRG:Int, colorBA:Int, maskRG:Int, maskBA:Int, copySource:Bool):Int;\n\t@:hlNative(\"lime\", \"hl_image_data_util_threshold\") private static function lime_image_data_util_threshold(image:Image, sourceImage:Image,\n\t\t\tsourceRect:Rectangle, destPoint:Vector2, operation:Int, thresholdRG:Int, thresholdBA:Int, colorRG:Int, colorBA:Int, maskRG:Int, maskBA:Int,\n\t\t\tcopySource:Bool):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_image_data_util_unmultiply_alpha\") private static function lime_image_data_util_unmultiply_alpha(image:Image):Void {}\n\n\t@:hlNative(\"lime\", \"hl_joystick_get_device_guid\") private static function lime_joystick_get_device_guid(id:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_joystick_get_device_name\") private static function lime_joystick_get_device_name(id:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_joystick_get_num_axes\") private static function lime_joystick_get_num_axes(id:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_joystick_get_num_buttons\") private static function lime_joystick_get_num_buttons(id:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_joystick_get_num_hats\") private static function lime_joystick_get_num_hats(id:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_joystick_event_manager_register\") private static function lime_joystick_event_manager_register(callback:Void->Void,\n\t\teventObject:JoystickEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_jpeg_decode_bytes\") private static function lime_jpeg_decode_bytes(data:Bytes, decodeData:Bool, buffer:ImageBuffer):ImageBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_jpeg_decode_file\") private static function lime_jpeg_decode_file(path:String, decodeData:Bool, buffer:ImageBuffer):ImageBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_key_code_from_scan_code\") private static function lime_key_code_from_scan_code(scanCode:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_key_code_to_scan_code\") private static function lime_key_code_to_scan_code(keyCode:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_key_event_manager_register\") private static function lime_key_event_manager_register(callback:Void->Void,\n\t\teventObject:KeyEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_lzma_compress\") private static function lime_lzma_compress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_lzma_decompress\") private static function lime_lzma_decompress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_mouse_event_manager_register\") private static function lime_mouse_event_manager_register(callback:Void->Void,\n\t\teventObject:MouseEventInfo):Void {}\n\n\t// @:cffi private static function lime_neko_execute (module:String):Void;\n\n\t@:hlNative(\"lime\", \"hl_orientation_event_manager_register\") private static function lime_orientation_event_manager_register(callback:Void->Void,\n\t\teventObject:OrientationEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_png_decode_bytes\") private static function lime_png_decode_bytes(data:Bytes, decodeData:Bool, buffer:ImageBuffer):ImageBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_png_decode_file\") private static function lime_png_decode_file(path:String, decodeData:Bool, buffer:ImageBuffer):ImageBuffer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_render_event_manager_register\") private static function lime_render_event_manager_register(callback:Void->Void,\n\t\teventObject:RenderEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_sensor_event_manager_register\") private static function lime_sensor_event_manager_register(callback:Void->Void,\n\t\teventObject:SensorEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_system_get_allow_screen_timeout\") private static function lime_system_get_allow_screen_timeout():Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_set_allow_screen_timeout\") private static function lime_system_set_allow_screen_timeout(value:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_device_model\") private static function lime_system_get_device_model():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_device_vendor\") private static function lime_system_get_device_vendor():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_directory\") private static function lime_system_get_directory(type:Int, company:String, title:String):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_display\") private static function lime_system_get_display(index:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_ios_tablet\") private static function lime_system_get_ios_tablet():Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_num_displays\") private static function lime_system_get_num_displays():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_device_orientation\") private static function lime_system_get_device_orientation():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_platform_label\") private static function lime_system_get_platform_label():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_platform_name\") private static function lime_system_get_platform_name():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_platform_version\") private static function lime_system_get_platform_version():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_get_timer\") private static function lime_system_get_timer():Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_system_open_file\") private static function lime_system_open_file(path:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_system_open_url\") private static function lime_system_open_url(url:String, target:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_text_event_manager_register\") private static function lime_text_event_manager_register(callback:Void->Void,\n\t\teventObject:TextEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_touch_event_manager_register\") private static function lime_touch_event_manager_register(callback:Void->Void,\n\t\teventObject:TouchEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_alert\") private static function lime_window_alert(handle:CFFIPointer, message:String, title:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_close\") private static function lime_window_close(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_context_flip\") private static function lime_window_context_flip(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_context_lock\") private static function lime_window_context_lock(handle:CFFIPointer):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_context_make_current\") private static function lime_window_context_make_current(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_context_unlock\") private static function lime_window_context_unlock(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_create\") private static function lime_window_create(application:CFFIPointer, width:Int, height:Int, flags:Int,\n\t\t\ttitle:String):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_focus\") private static function lime_window_focus(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_get_context\") private static function lime_window_get_context(handle:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_context_type\") private static function lime_window_get_context_type(handle:CFFIPointer):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_display\") private static function lime_window_get_display(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_display_mode\") private static function lime_window_get_display_mode(handle:CFFIPointer, result:DisplayMode):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_get_height\") private static function lime_window_get_height(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_id\") private static function lime_window_get_id(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_mouse_lock\") private static function lime_window_get_mouse_lock(handle:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_scale\") private static function lime_window_get_scale(handle:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_text_input_enabled\") private static function lime_window_get_text_input_enabled(handle:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_width\") private static function lime_window_get_width(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_x\") private static function lime_window_get_x(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_get_y\") private static function lime_window_get_y(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_move\") private static function lime_window_move(handle:CFFIPointer, x:Int, y:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_read_pixels\") private static function lime_window_read_pixels(handle:CFFIPointer, rect:Rectangle,\n\t\t\timageBuffer:ImageBuffer):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_resize\") private static function lime_window_resize(handle:CFFIPointer, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_minimum_size\") private static function lime_window_set_minimum_size(handle:CFFIPointer, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_maximum_size\") private static function lime_window_set_maximum_size(handle:CFFIPointer, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_borderless\") private static function lime_window_set_borderless(handle:CFFIPointer, borderless:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_set_cursor\") private static function lime_window_set_cursor(handle:CFFIPointer, cursor:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_display_mode\") private static function lime_window_set_display_mode(handle:CFFIPointer, displayMode:DisplayMode,\n\t\tresult:DisplayMode):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_fullscreen\") private static function lime_window_set_fullscreen(handle:CFFIPointer, fullscreen:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_set_icon\") private static function lime_window_set_icon(handle:CFFIPointer, buffer:ImageBuffer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_maximized\") private static function lime_window_set_maximized(handle:CFFIPointer, maximized:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_set_minimized\") private static function lime_window_set_minimized(handle:CFFIPointer, minimized:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_set_mouse_lock\") private static function lime_window_set_mouse_lock(handle:CFFIPointer, mouseLock:Bool):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_resizable\") private static function lime_window_set_resizable(handle:CFFIPointer, resizable:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_set_text_input_enabled\") private static function lime_window_set_text_input_enabled(handle:CFFIPointer,\n\t\tenabled:Bool):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_text_input_rect\") private static function lime_window_set_text_input_rect(handle:CFFIPointer,\n\t\trect:Rectangle):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_set_title\") private static function lime_window_set_title(handle:CFFIPointer, title:String):String\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_set_visible\") private static function lime_window_set_visible(handle:CFFIPointer, visible:Bool):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_window_warp_mouse\") private static function lime_window_warp_mouse(handle:CFFIPointer, x:Int, y:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_get_opacity\") private static function lime_window_get_opacity(handle:CFFIPointer):Float { return 0.0; }\n\n\t@:hlNative(\"lime\", \"hl_window_set_opacity\") private static function lime_window_set_opacity(handle:CFFIPointer, value:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_window_event_manager_register\") private static function lime_window_event_manager_register(callback:Void->Void,\n\t\teventObject:WindowEventInfo):Void {}\n\n\t@:hlNative(\"lime\", \"hl_zlib_compress\") private static function lime_zlib_compress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_zlib_decompress\") private static function lime_zlib_decompress(data:Bytes, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && android)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_jni_call_member(jniMethod:Dynamic, jniObject:Dynamic, args:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_call_static(jniMethod:Dynamic, args:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_create_field(className:String, field:String, signature:String, isStatic:Bool):Dynamic;\n\n\t@:cffi private static function lime_jni_create_method(className:String, method:String, signature:String, isStatic:Bool, quiet:Bool):Dynamic;\n\n\t@:cffi private static function lime_jni_get_env():Float;\n\n\t@:cffi private static function lime_jni_get_member(jniField:Dynamic, jniObject:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_get_static(jniField:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_post_ui_callback(callback:Dynamic):Void;\n\n\t@:cffi private static function lime_jni_set_member(jniField:Dynamic, jniObject:Dynamic, value:Dynamic):Void;\n\n\t@:cffi private static function lime_jni_set_static(jniField:Dynamic, value:Dynamic):Void;\n\t#else\n\tprivate static var lime_jni_call_member = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_jni_call_member\", \"oooo\", false));\n\tprivate static var lime_jni_call_static = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_jni_call_static\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_jni_create_field = new cpp.Callable<String->String->String->Bool->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_jni_create_field\", \"sssbo\", false));\n\tprivate static var lime_jni_create_method = new cpp.Callable<String->String->String->Bool->Bool->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_jni_create_method\", \"sssbbo\", false));\n\tprivate static var lime_jni_get_env = new cpp.Callable<Void->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_jni_get_env\", \"d\", false));\n\tprivate static var lime_jni_get_member = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_jni_get_member\", \"ooo\",\n\t\tfalse));\n\tprivate static var lime_jni_get_static = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_jni_get_static\", \"oo\", false));\n\tprivate static var lime_jni_post_ui_callback = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_jni_post_ui_callback\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_jni_set_member = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_jni_set_member\", \"ooov\", false));\n\tprivate static var lime_jni_set_static = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_jni_set_static\", \"oov\",\n\t\tfalse));\n\t#end\n\t#end\n\t#if !cpp\n\t@:cffi private static function lime_jni_call_member(jniMethod:Dynamic, jniObject:Dynamic, args:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_call_static(jniMethod:Dynamic, args:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_create_field(className:String, field:String, signature:String, isStatic:Bool):Dynamic;\n\n\t@:cffi private static function lime_jni_create_method(className:String, method:String, signature:String, isStatic:Bool, quiet:Bool):Dynamic;\n\n\t@:cffi private static function lime_jni_get_env():Float;\n\n\t@:cffi private static function lime_jni_get_member(jniField:Dynamic, jniObject:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_get_static(jniField:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_jni_post_ui_callback(callback:Dynamic):Void;\n\n\t@:cffi private static function lime_jni_set_member(jniField:Dynamic, jniObject:Dynamic, value:Dynamic):Void;\n\n\t@:cffi private static function lime_jni_set_static(jniField:Dynamic, value:Dynamic):Void;\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && lime_openal)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_al_buffer_data(buffer:CFFIPointer, format:Int, data:Dynamic, size:Int, freq:Int):Void;\n\n\t@:cffi private static function lime_al_buffer3f(buffer:CFFIPointer, param:Int, value1:Float32, value2:Float32, value3:Float32):Void;\n\n\t@:cffi private static function lime_al_buffer3i(buffer:CFFIPointer, param:Int, value1:Int, value2:Int, value3:Int):Void;\n\n\t@:cffi private static function lime_al_bufferf(buffer:CFFIPointer, param:Int, value:Float32):Void;\n\n\t@:cffi private static function lime_al_bufferfv(buffer:CFFIPointer, param:Int, values:Dynamic):Void;\n\n\t@:cffi private static function lime_al_bufferi(buffer:CFFIPointer, param:Int, value:Int):Void;\n\n\t@:cffi private static function lime_al_bufferiv(buffer:CFFIPointer, param:Int, values:Dynamic):Void;\n\n\t@:cffi private static function lime_al_cleanup():Void;\n\n\t@:cffi private static function lime_al_delete_buffer(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_delete_buffers(n:Int, buffers:Dynamic):Void;\n\n\t@:cffi private static function lime_al_delete_source(source:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_delete_sources(n:Int, sources:Dynamic):Void;\n\n\t@:cffi private static function lime_al_disable(capability:Int):Void;\n\n\t@:cffi private static function lime_al_distance_model(distanceModel:Int):Void;\n\n\t@:cffi private static function lime_al_doppler_factor(value:Float32):Void;\n\n\t@:cffi private static function lime_al_doppler_velocity(value:Float32):Void;\n\n\t@:cffi private static function lime_al_enable(capability:Int):Void;\n\n\t@:cffi private static function lime_al_gen_source():CFFIPointer;\n\n\t@:cffi private static function lime_al_gen_sources(n:Int):Array<CFFIPointer>;\n\n\t@:cffi private static function lime_al_get_boolean(param:Int):Bool;\n\n\t@:cffi private static function lime_al_get_booleanv(param:Int, count:Int):Array<Bool>;\n\n\t@:cffi private static function lime_al_gen_buffer():CFFIPointer;\n\n\t@:cffi private static function lime_al_gen_buffers(n:Int):Array<CFFIPointer>;\n\n\t@:cffi private static function lime_al_get_buffer3f(buffer:CFFIPointer, param:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_buffer3i(buffer:CFFIPointer, param:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_bufferf(buffer:CFFIPointer, param:Int):Float32;\n\n\t@:cffi private static function lime_al_get_bufferfv(buffer:CFFIPointer, param:Int, count:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_bufferi(buffer:CFFIPointer, param:Int):Int;\n\n\t@:cffi private static function lime_al_get_bufferiv(buffer:CFFIPointer, param:Int, count:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_double(param:Int):Float;\n\n\t@:cffi private static function lime_al_get_doublev(param:Int, count:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_enum_value(ename:String):Int;\n\n\t@:cffi private static function lime_al_get_error():Int;\n\n\t@:cffi private static function lime_al_get_float(param:Int):Float32;\n\n\t@:cffi private static function lime_al_get_floatv(param:Int, count:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_integer(param:Int):Int;\n\n\t@:cffi private static function lime_al_get_integerv(param:Int, count:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_listener3f(param:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_listener3i(param:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_listenerf(param:Int):Float32;\n\n\t@:cffi private static function lime_al_get_listenerfv(param:Int, count:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_listeneri(param:Int):Int;\n\n\t@:cffi private static function lime_al_get_listeneriv(param:Int, count:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_proc_address(fname:String):Float;\n\n\t@:cffi private static function lime_al_get_source3f(source:CFFIPointer, param:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_source3i(source:CFFIPointer, param:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_sourcef(source:CFFIPointer, param:Int):Float32;\n\n\t@:cffi private static function lime_al_get_sourcefv(source:CFFIPointer, param:Int, count:Int):Array<Float>;\n\n\t@:cffi private static function lime_al_get_sourcei(source:CFFIPointer, param:Int):Dynamic;\n\n\t@:cffi private static function lime_al_get_sourceiv(source:CFFIPointer, param:Int, count:Int):Array<Int>;\n\n\t@:cffi private static function lime_al_get_string(param:Int):Dynamic;\n\n\t@:cffi private static function lime_al_is_buffer(buffer:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_al_is_enabled(capability:Int):Bool;\n\n\t@:cffi private static function lime_al_is_extension_present(extname:String):Bool;\n\n\t@:cffi private static function lime_al_is_source(source:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_al_listener3f(param:Int, value1:Float32, value2:Float32, value3:Float32):Void;\n\n\t@:cffi private static function lime_al_listener3i(param:Int, value1:Int, value2:Int, value3:Int):Void;\n\n\t@:cffi private static function lime_al_listenerf(param:Int, value1:Float32):Void;\n\n\t@:cffi private static function lime_al_listenerfv(param:Int, values:Dynamic):Void;\n\n\t@:cffi private static function lime_al_listeneri(param:Int, value1:Int):Void;\n\n\t@:cffi private static function lime_al_listeneriv(param:Int, values:Dynamic):Void;\n\n\t@:cffi private static function lime_al_source_pause(source:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_source_pausev(n:Int, sources:Dynamic):Void;\n\n\t@:cffi private static function lime_al_source_play(source:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_source_playv(n:Int, sources:Dynamic):Void;\n\n\t@:cffi private static function lime_al_source_queue_buffers(source:CFFIPointer, nb:Int, buffers:Dynamic):Void;\n\n\t@:cffi private static function lime_al_source_rewind(source:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_source_rewindv(n:Int, sources:Dynamic):Void;\n\n\t@:cffi private static function lime_al_source_stop(source:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_source_stopv(n:Int, sources:Dynamic):Void;\n\n\t@:cffi private static function lime_al_source_unqueue_buffers(source:CFFIPointer, nb:Int):Dynamic;\n\n\t@:cffi private static function lime_al_source3f(source:CFFIPointer, param:Int, value1:Float32, value2:Float32, value3:Float32):Void;\n\n\t@:cffi private static function lime_al_source3i(source:CFFIPointer, param:Int, value1:Dynamic, value2:Int, value3:Int):Void;\n\n\t@:cffi private static function lime_al_sourcef(source:CFFIPointer, param:Int, value:Float32):Void;\n\n\t@:cffi private static function lime_al_sourcefv(source:CFFIPointer, param:Int, values:Dynamic):Void;\n\n\t@:cffi private static function lime_al_sourcei(source:CFFIPointer, param:Int, value:Dynamic):Void;\n\n\t@:cffi private static function lime_al_sourceiv(source:CFFIPointer, param:Int, values:Dynamic):Void;\n\n\t@:cffi private static function lime_al_speed_of_sound(speed:Float32):Void;\n\n\t@:cffi private static function lime_alc_close_device(device:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_alc_create_context(device:CFFIPointer, attrlist:Dynamic):CFFIPointer;\n\n\t@:cffi private static function lime_alc_destroy_context(context:CFFIPointer):Void;\n\n\t@:cffi private static function lime_alc_get_contexts_device(context:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_alc_get_current_context():CFFIPointer;\n\n\t@:cffi private static function lime_alc_get_error(device:CFFIPointer):Int;\n\n\t@:cffi private static function lime_alc_get_integerv(device:CFFIPointer, param:Int, size:Int):Dynamic;\n\n\t@:cffi private static function lime_alc_get_string(device:CFFIPointer, param:Int):Dynamic;\n\n\t@:cffi private static function lime_alc_make_context_current(context:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_alc_open_device(devicename:String):CFFIPointer;\n\n\t@:cffi private static function lime_alc_pause_device(device:CFFIPointer):Void;\n\n\t@:cffi private static function lime_alc_process_context(context:CFFIPointer):Void;\n\n\t@:cffi private static function lime_alc_resume_device(device:CFFIPointer):Void;\n\n\t@:cffi private static function lime_alc_suspend_context(context:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_gen_filter():CFFIPointer;\n\n\t@:cffi private static function lime_al_filteri(filter:CFFIPointer, param:Int, value:Dynamic):Void;\n\n\t@:cffi private static function lime_al_filterf(filter:CFFIPointer, param:Int, value:Float32):Void;\n\n\t@:cffi private static function lime_al_remove_direct_filter(source:CFFIPointer):Void;\n\n\t@:cffi private static function lime_al_is_filter(filter:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_al_get_filteri(filter:CFFIPointer, param:Int):Int;\n\n\t@:cffi private static function lime_al_gen_effect():CFFIPointer;\n\n\t@:cffi private static function lime_al_effectf(effect:CFFIPointer, param:Int, value:Float32):Void;\n\n\t@:cffi private static function lime_al_effectfv(effect:CFFIPointer, param:Int, values:Array<Float>):Void;\n\n\t@:cffi private static function lime_al_effecti(effect:CFFIPointer, param:Int, value:Int):Void;\n\n\t@:cffi private static function lime_al_effectiv(effect:CFFIPointer, param:Int, values:Array<Int>):Void;\n\n\t@:cffi private static function lime_al_is_effect(effect:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_al_gen_aux():CFFIPointer;\n\n\t@:cffi private static function lime_al_auxf(aux:CFFIPointer, param:Int, value:Float32):Void;\n\n\t@:cffi private static function lime_al_auxfv(aux:CFFIPointer, param:Int, values:Array<Float>):Void;\n\n\t@:cffi private static function lime_al_auxi(aux:CFFIPointer, param:Int, value:Dynamic):Void;\n\n\t@:cffi private static function lime_al_auxiv(aux:CFFIPointer, param:Int, values:Array<Int>):Void;\n\n\t@:cffi private static function lime_al_is_aux(aux:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_al_remove_send(source:CFFIPointer, index:Int):Void;\n\t#else\n\tprivate static var lime_al_buffer_data = new cpp.Callable<cpp.Object->Int->cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_al_buffer_data\", \"oioiiv\", false));\n\tprivate static var lime_al_buffer3f = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_al_buffer3f\", \"oifffv\", false));\n\tprivate static var lime_al_buffer3i = new cpp.Callable<cpp.Object->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_buffer3i\",\n\t\t\"oiiiiv\", false));\n\tprivate static var lime_al_bufferf = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_bufferf\", \"oifv\",\n\t\tfalse));\n\tprivate static var lime_al_bufferfv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_bufferfv\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_bufferi = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_bufferi\", \"oiiv\", false));\n\tprivate static var lime_al_bufferiv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_bufferiv\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_cleanup = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_cleanup\", \"v\", false));\n\tprivate static var lime_al_delete_buffer = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_delete_buffer\", \"ov\", false));\n\tprivate static var lime_al_delete_buffers = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_delete_buffers\", \"iov\",\n\t\tfalse));\n\tprivate static var lime_al_delete_source = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_delete_source\", \"ov\", false));\n\tprivate static var lime_al_delete_sources = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_delete_sources\", \"iov\",\n\t\tfalse));\n\tprivate static var lime_al_disable = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_disable\", \"iv\", false));\n\tprivate static var lime_al_distance_model = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_distance_model\", \"iv\", false));\n\tprivate static var lime_al_doppler_factor = new cpp.Callable<cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_doppler_factor\", \"fv\", false));\n\tprivate static var lime_al_doppler_velocity = new cpp.Callable<cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_doppler_velocity\", \"fv\",\n\t\tfalse));\n\tprivate static var lime_al_enable = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_enable\", \"iv\", false));\n\tprivate static var lime_al_gen_source = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_source\", \"o\", false));\n\tprivate static var lime_al_gen_sources = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_sources\", \"io\", false));\n\tprivate static var lime_al_get_boolean = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_boolean\", \"ib\", false));\n\tprivate static var lime_al_get_booleanv = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_booleanv\", \"iio\", false));\n\tprivate static var lime_al_gen_buffer = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_buffer\", \"o\", false));\n\tprivate static var lime_al_gen_buffers = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_buffers\", \"io\", false));\n\tprivate static var lime_al_get_buffer3f = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_buffer3f\", \"oio\",\n\t\tfalse));\n\tprivate static var lime_al_get_buffer3i = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_buffer3i\", \"oio\",\n\t\tfalse));\n\tprivate static var lime_al_get_bufferf = new cpp.Callable<cpp.Object->Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_bufferf\", \"oif\", false));\n\tprivate static var lime_al_get_bufferfv = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_bufferfv\", \"oiio\",\n\t\tfalse));\n\tprivate static var lime_al_get_bufferi = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_bufferi\", \"oii\", false));\n\tprivate static var lime_al_get_bufferiv = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_bufferiv\", \"oiio\",\n\t\tfalse));\n\tprivate static var lime_al_get_double = new cpp.Callable<Int->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_double\", \"id\", false));\n\tprivate static var lime_al_get_doublev = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_doublev\", \"iio\", false));\n\tprivate static var lime_al_get_enum_value = new cpp.Callable<String->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_enum_value\", \"si\", false));\n\tprivate static var lime_al_get_error = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_error\", \"i\", false));\n\tprivate static var lime_al_get_float = new cpp.Callable<Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_float\", \"if\", false));\n\tprivate static var lime_al_get_floatv = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_floatv\", \"iio\", false));\n\tprivate static var lime_al_get_integer = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_integer\", \"ii\", false));\n\tprivate static var lime_al_get_integerv = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_integerv\", \"iio\", false));\n\tprivate static var lime_al_get_listener3f = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_listener3f\", \"io\", false));\n\tprivate static var lime_al_get_listener3i = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_listener3i\", \"io\", false));\n\tprivate static var lime_al_get_listenerf = new cpp.Callable<Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_listenerf\", \"if\", false));\n\tprivate static var lime_al_get_listenerfv = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_listenerfv\", \"iio\", false));\n\tprivate static var lime_al_get_listeneri = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_listeneri\", \"ii\", false));\n\tprivate static var lime_al_get_listeneriv = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_listeneriv\", \"iio\", false));\n\tprivate static var lime_al_get_proc_address = new cpp.Callable<String->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_proc_address\", \"sd\", false));\n\tprivate static var lime_al_get_source3f = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_source3f\", \"oio\",\n\t\tfalse));\n\tprivate static var lime_al_get_source3i = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_source3i\", \"oio\",\n\t\tfalse));\n\tprivate static var lime_al_get_sourcef = new cpp.Callable<cpp.Object->Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_sourcef\", \"oif\", false));\n\tprivate static var lime_al_get_sourcefv = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_sourcefv\", \"oiio\",\n\t\tfalse));\n\tprivate static var lime_al_get_sourcei = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_sourcei\", \"oio\", false));\n\tprivate static var lime_al_get_sourceiv = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_sourceiv\", \"oiio\",\n\t\tfalse));\n\tprivate static var lime_al_get_string = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_string\", \"io\", false));\n\tprivate static var lime_al_is_buffer = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_buffer\", \"ob\", false));\n\tprivate static var lime_al_is_enabled = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_enabled\", \"ib\", false));\n\tprivate static var lime_al_is_extension_present = new cpp.Callable<String->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_extension_present\", \"sb\",\n\t\tfalse));\n\tprivate static var lime_al_is_source = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_source\", \"ob\", false));\n\tprivate static var lime_al_listener3f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_al_listener3f\", \"ifffv\", false));\n\tprivate static var lime_al_listener3i = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_listener3i\", \"iiiiv\", false));\n\tprivate static var lime_al_listenerf = new cpp.Callable<Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_listenerf\", \"ifv\", false));\n\tprivate static var lime_al_listenerfv = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_listenerfv\", \"iov\", false));\n\tprivate static var lime_al_listeneri = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_listeneri\", \"iiv\", false));\n\tprivate static var lime_al_listeneriv = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_listeneriv\", \"iov\", false));\n\tprivate static var lime_al_source_pause = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_pause\", \"ov\", false));\n\tprivate static var lime_al_source_pausev = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_pausev\", \"iov\",\n\t\tfalse));\n\tprivate static var lime_al_source_play = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_play\", \"ov\", false));\n\tprivate static var lime_al_source_playv = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_playv\", \"iov\", false));\n\tprivate static var lime_al_source_queue_buffers = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_al_source_queue_buffers\", \"oiov\", false));\n\tprivate static var lime_al_source_rewind = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_rewind\", \"ov\", false));\n\tprivate static var lime_al_source_rewindv = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_rewindv\", \"iov\",\n\t\tfalse));\n\tprivate static var lime_al_source_stop = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_stop\", \"ov\", false));\n\tprivate static var lime_al_source_stopv = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source_stopv\", \"iov\", false));\n\tprivate static var lime_al_source_unqueue_buffers = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_al_source_unqueue_buffers\", \"oio\", false));\n\tprivate static var lime_al_source3f = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_al_source3f\", \"oifffv\", false));\n\tprivate static var lime_al_source3i = new cpp.Callable<cpp.Object->Int->cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_source3i\",\n\t\t\"oioiiv\", false));\n\tprivate static var lime_al_sourcef = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_sourcef\", \"oifv\",\n\t\tfalse));\n\tprivate static var lime_al_sourcefv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_sourcefv\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_sourcei = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_sourcei\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_sourceiv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_sourceiv\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_speed_of_sound = new cpp.Callable<cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_speed_of_sound\", \"fv\", false));\n\tprivate static var lime_alc_close_device = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_close_device\", \"ob\", false));\n\tprivate static var lime_alc_create_context = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_create_context\",\n\t\t\"ooo\", false));\n\tprivate static var lime_alc_destroy_context = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_destroy_context\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_alc_get_contexts_device = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_get_contexts_device\",\n\t\t\"oo\", false));\n\tprivate static var lime_alc_get_current_context = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_get_current_context\", \"o\",\n\t\tfalse));\n\tprivate static var lime_alc_get_error = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_get_error\", \"oi\", false));\n\tprivate static var lime_alc_get_integerv = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_get_integerv\",\n\t\t\"oiio\", false));\n\tprivate static var lime_alc_get_string = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_get_string\", \"oio\", false));\n\tprivate static var lime_alc_make_context_current = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_make_context_current\", \"ob\",\n\t\tfalse));\n\tprivate static var lime_alc_open_device = new cpp.Callable<String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_open_device\", \"so\", false));\n\tprivate static var lime_alc_pause_device = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_pause_device\", \"ov\", false));\n\tprivate static var lime_alc_process_context = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_process_context\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_alc_resume_device = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_resume_device\", \"ov\", false));\n\tprivate static var lime_alc_suspend_context = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_alc_suspend_context\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_al_gen_filter = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_filter\", \"o\", false));\n\tprivate static var lime_al_filteri = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_filteri\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_filterf = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_filterf\", \"oifv\",\n\t\tfalse));\n\tprivate static var lime_al_remove_direct_filter = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_remove_direct_filter\",\n\t\t\"ov\", false));\n\tprivate static var lime_al_is_filter = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_filter\", \"ob\", false));\n\tprivate static var lime_al_get_filteri = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_al_get_filteri\", \"oii\", false));\n\tprivate static var lime_al_gen_effect = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_effect\", \"o\", false));\n\tprivate static var lime_al_effectf = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_effectf\", \"oifv\",\n\t\tfalse));\n\tprivate static var lime_al_effectfv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_effectfv\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_effecti = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_effecti\", \"oiiv\", false));\n\tprivate static var lime_al_effectiv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_effectiv\", \"oiov\",\n\t\tfalse));\n\tprivate static var lime_al_is_effect = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_effect\", \"ob\", false));\n\tprivate static var lime_al_gen_aux = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_al_gen_aux\", \"o\", false));\n\tprivate static var lime_al_auxf = new cpp.Callable<cpp.Object->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_auxf\", \"oifv\", false));\n\tprivate static var lime_al_auxfv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_auxfv\", \"oiov\", false));\n\tprivate static var lime_al_auxi = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_auxi\", \"oiov\", false));\n\tprivate static var lime_al_auxiv = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_auxiv\", \"oiov\", false));\n\tprivate static var lime_al_is_aux = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_al_is_aux\", \"ob\", false));\n\tprivate static var lime_al_remove_send = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_al_remove_send\", \"oiv\", false));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_al_buffer_data = CFFI.load(\"lime\", \"lime_al_buffer_data\", 5);\n\tprivate static var lime_al_buffer3f = CFFI.load(\"lime\", \"lime_al_buffer3f\", 5);\n\tprivate static var lime_al_buffer3i = CFFI.load(\"lime\", \"lime_al_buffer3i\", 5);\n\tprivate static var lime_al_bufferf = CFFI.load(\"lime\", \"lime_al_bufferf\", 3);\n\tprivate static var lime_al_bufferfv = CFFI.load(\"lime\", \"lime_al_bufferfv\", 3);\n\tprivate static var lime_al_bufferi = CFFI.load(\"lime\", \"lime_al_bufferi\", 3);\n\tprivate static var lime_al_bufferiv = CFFI.load(\"lime\", \"lime_al_bufferiv\", 3);\n\tprivate static var lime_al_cleanup = CFFI.load(\"lime\", \"lime_al_cleanup\", 0);\n\tprivate static var lime_al_delete_buffer = CFFI.load(\"lime\", \"lime_al_delete_buffer\", 1);\n\tprivate static var lime_al_delete_buffers = CFFI.load(\"lime\", \"lime_al_delete_buffers\", 2);\n\tprivate static var lime_al_delete_source = CFFI.load(\"lime\", \"lime_al_delete_source\", 1);\n\tprivate static var lime_al_delete_sources = CFFI.load(\"lime\", \"lime_al_delete_sources\", 2);\n\tprivate static var lime_al_disable = CFFI.load(\"lime\", \"lime_al_disable\", 1);\n\tprivate static var lime_al_distance_model = CFFI.load(\"lime\", \"lime_al_distance_model\", 1);\n\tprivate static var lime_al_doppler_factor = CFFI.load(\"lime\", \"lime_al_doppler_factor\", 1);\n\tprivate static var lime_al_doppler_velocity = CFFI.load(\"lime\", \"lime_al_doppler_velocity\", 1);\n\tprivate static var lime_al_enable = CFFI.load(\"lime\", \"lime_al_enable\", 1);\n\tprivate static var lime_al_gen_source = CFFI.load(\"lime\", \"lime_al_gen_source\", 0);\n\tprivate static var lime_al_gen_sources = CFFI.load(\"lime\", \"lime_al_gen_sources\", 1);\n\tprivate static var lime_al_get_boolean = CFFI.load(\"lime\", \"lime_al_get_boolean\", 1);\n\tprivate static var lime_al_get_booleanv = CFFI.load(\"lime\", \"lime_al_get_booleanv\", 2);\n\tprivate static var lime_al_gen_buffer = CFFI.load(\"lime\", \"lime_al_gen_buffer\", 0);\n\tprivate static var lime_al_gen_buffers = CFFI.load(\"lime\", \"lime_al_gen_buffers\", 1);\n\tprivate static var lime_al_get_buffer3f = CFFI.load(\"lime\", \"lime_al_get_buffer3f\", 2);\n\tprivate static var lime_al_get_buffer3i = CFFI.load(\"lime\", \"lime_al_get_buffer3i\", 2);\n\tprivate static var lime_al_get_bufferf = CFFI.load(\"lime\", \"lime_al_get_bufferf\", 2);\n\tprivate static var lime_al_get_bufferfv = CFFI.load(\"lime\", \"lime_al_get_bufferfv\", 3);\n\tprivate static var lime_al_get_bufferi = CFFI.load(\"lime\", \"lime_al_get_bufferi\", 2);\n\tprivate static var lime_al_get_bufferiv = CFFI.load(\"lime\", \"lime_al_get_bufferiv\", 3);\n\tprivate static var lime_al_get_double = CFFI.load(\"lime\", \"lime_al_get_double\", 1);\n\tprivate static var lime_al_get_doublev = CFFI.load(\"lime\", \"lime_al_get_doublev\", 2);\n\tprivate static var lime_al_get_enum_value = CFFI.load(\"lime\", \"lime_al_get_enum_value\", 1);\n\tprivate static var lime_al_get_error = CFFI.load(\"lime\", \"lime_al_get_error\", 0);\n\tprivate static var lime_al_get_float = CFFI.load(\"lime\", \"lime_al_get_float\", 1);\n\tprivate static var lime_al_get_floatv = CFFI.load(\"lime\", \"lime_al_get_floatv\", 2);\n\tprivate static var lime_al_get_integer = CFFI.load(\"lime\", \"lime_al_get_integer\", 1);\n\tprivate static var lime_al_get_integerv = CFFI.load(\"lime\", \"lime_al_get_integerv\", 2);\n\tprivate static var lime_al_get_listener3f = CFFI.load(\"lime\", \"lime_al_get_listener3f\", 1);\n\tprivate static var lime_al_get_listener3i = CFFI.load(\"lime\", \"lime_al_get_listener3i\", 1);\n\tprivate static var lime_al_get_listenerf = CFFI.load(\"lime\", \"lime_al_get_listenerf\", 1);\n\tprivate static var lime_al_get_listenerfv = CFFI.load(\"lime\", \"lime_al_get_listenerfv\", 2);\n\tprivate static var lime_al_get_listeneri = CFFI.load(\"lime\", \"lime_al_get_listeneri\", 1);\n\tprivate static var lime_al_get_listeneriv = CFFI.load(\"lime\", \"lime_al_get_listeneriv\", 2);\n\tprivate static var lime_al_get_proc_address = CFFI.load(\"lime\", \"lime_al_get_proc_address\", 1);\n\tprivate static var lime_al_get_source3f = CFFI.load(\"lime\", \"lime_al_get_source3f\", 2);\n\tprivate static var lime_al_get_source3i = CFFI.load(\"lime\", \"lime_al_get_source3i\", 2);\n\tprivate static var lime_al_get_sourcef = CFFI.load(\"lime\", \"lime_al_get_sourcef\", 2);\n\tprivate static var lime_al_get_sourcefv = CFFI.load(\"lime\", \"lime_al_get_sourcefv\", 3);\n\tprivate static var lime_al_get_sourcei = CFFI.load(\"lime\", \"lime_al_get_sourcei\", 2);\n\tprivate static var lime_al_get_sourceiv = CFFI.load(\"lime\", \"lime_al_get_sourceiv\", 3);\n\tprivate static var lime_al_get_string = CFFI.load(\"lime\", \"lime_al_get_string\", 1);\n\tprivate static var lime_al_is_buffer = CFFI.load(\"lime\", \"lime_al_is_buffer\", 1);\n\tprivate static var lime_al_is_enabled = CFFI.load(\"lime\", \"lime_al_is_enabled\", 1);\n\tprivate static var lime_al_is_extension_present = CFFI.load(\"lime\", \"lime_al_is_extension_present\", 1);\n\tprivate static var lime_al_is_source = CFFI.load(\"lime\", \"lime_al_is_source\", 1);\n\tprivate static var lime_al_listener3f = CFFI.load(\"lime\", \"lime_al_listener3f\", 4);\n\tprivate static var lime_al_listener3i = CFFI.load(\"lime\", \"lime_al_listener3i\", 4);\n\tprivate static var lime_al_listenerf = CFFI.load(\"lime\", \"lime_al_listenerf\", 2);\n\tprivate static var lime_al_listenerfv = CFFI.load(\"lime\", \"lime_al_listenerfv\", 2);\n\tprivate static var lime_al_listeneri = CFFI.load(\"lime\", \"lime_al_listeneri\", 2);\n\tprivate static var lime_al_listeneriv = CFFI.load(\"lime\", \"lime_al_listeneriv\", 2);\n\tprivate static var lime_al_source_pause = CFFI.load(\"lime\", \"lime_al_source_pause\", 1);\n\tprivate static var lime_al_source_pausev = CFFI.load(\"lime\", \"lime_al_source_pausev\", 2);\n\tprivate static var lime_al_source_play = CFFI.load(\"lime\", \"lime_al_source_play\", 1);\n\tprivate static var lime_al_source_playv = CFFI.load(\"lime\", \"lime_al_source_playv\", 2);\n\tprivate static var lime_al_source_queue_buffers = CFFI.load(\"lime\", \"lime_al_source_queue_buffers\", 3);\n\tprivate static var lime_al_source_rewind = CFFI.load(\"lime\", \"lime_al_source_rewind\", 1);\n\tprivate static var lime_al_source_rewindv = CFFI.load(\"lime\", \"lime_al_source_rewindv\", 2);\n\tprivate static var lime_al_source_stop = CFFI.load(\"lime\", \"lime_al_source_stop\", 1);\n\tprivate static var lime_al_source_stopv = CFFI.load(\"lime\", \"lime_al_source_stopv\", 2);\n\tprivate static var lime_al_source_unqueue_buffers = CFFI.load(\"lime\", \"lime_al_source_unqueue_buffers\", 2);\n\tprivate static var lime_al_source3f = CFFI.load(\"lime\", \"lime_al_source3f\", 5);\n\tprivate static var lime_al_source3i = CFFI.load(\"lime\", \"lime_al_source3i\", 5);\n\tprivate static var lime_al_sourcef = CFFI.load(\"lime\", \"lime_al_sourcef\", 3);\n\tprivate static var lime_al_sourcefv = CFFI.load(\"lime\", \"lime_al_sourcefv\", 3);\n\tprivate static var lime_al_sourcei = CFFI.load(\"lime\", \"lime_al_sourcei\", 3);\n\tprivate static var lime_al_sourceiv = CFFI.load(\"lime\", \"lime_al_sourceiv\", 3);\n\tprivate static var lime_al_speed_of_sound = CFFI.load(\"lime\", \"lime_al_speed_of_sound\", 1);\n\tprivate static var lime_alc_close_device = CFFI.load(\"lime\", \"lime_alc_close_device\", 1);\n\tprivate static var lime_alc_create_context = CFFI.load(\"lime\", \"lime_alc_create_context\", 2);\n\tprivate static var lime_alc_destroy_context = CFFI.load(\"lime\", \"lime_alc_destroy_context\", 1);\n\tprivate static var lime_alc_get_contexts_device = CFFI.load(\"lime\", \"lime_alc_get_contexts_device\", 1);\n\tprivate static var lime_alc_get_current_context = CFFI.load(\"lime\", \"lime_alc_get_current_context\", 0);\n\tprivate static var lime_alc_get_error = CFFI.load(\"lime\", \"lime_alc_get_error\", 1);\n\tprivate static var lime_alc_get_integerv = CFFI.load(\"lime\", \"lime_alc_get_integerv\", 3);\n\tprivate static var lime_alc_get_string = CFFI.load(\"lime\", \"lime_alc_get_string\", 2);\n\tprivate static var lime_alc_make_context_current = CFFI.load(\"lime\", \"lime_alc_make_context_current\", 1);\n\tprivate static var lime_alc_open_device = CFFI.load(\"lime\", \"lime_alc_open_device\", 1);\n\tprivate static var lime_alc_pause_device = CFFI.load(\"lime\", \"lime_alc_pause_device\", 1);\n\tprivate static var lime_alc_process_context = CFFI.load(\"lime\", \"lime_alc_process_context\", 1);\n\tprivate static var lime_alc_resume_device = CFFI.load(\"lime\", \"lime_alc_resume_device\", 1);\n\tprivate static var lime_alc_suspend_context = CFFI.load(\"lime\", \"lime_alc_suspend_context\", 1);\n\tprivate static var lime_al_gen_filter = CFFI.load(\"lime\", \"lime_al_gen_filter\", 0);\n\tprivate static var lime_al_filteri = CFFI.load(\"lime\", \"lime_al_filteri\", 3);\n\tprivate static var lime_al_filterf = CFFI.load(\"lime\", \"lime_al_filterf\", 3);\n\tprivate static var lime_al_remove_direct_filter = CFFI.load(\"lime\", \"lime_al_remove_direct_filter\", 1);\n\tprivate static var lime_al_is_filter = CFFI.load(\"lime\", \"lime_al_is_filter\", 1);\n\tprivate static var lime_al_get_filteri = CFFI.load(\"lime\", \"lime_al_get_filteri\", 2);\n\tprivate static var lime_al_gen_effect = CFFI.load(\"lime\", \"lime_al_gen_effect\", 0);\n\tprivate static var lime_al_effectf = CFFI.load(\"lime\", \"lime_al_effectf\", 3);\n\tprivate static var lime_al_effectfv = CFFI.load(\"lime\", \"lime_al_effectfv\", 3);\n\tprivate static var lime_al_effecti = CFFI.load(\"lime\", \"lime_al_effecti\", 3);\n\tprivate static var lime_al_effectiv = CFFI.load(\"lime\", \"lime_al_effectiv\", 3);\n\tprivate static var lime_al_is_effect = CFFI.load(\"lime\", \"lime_al_is_effect\", 1);\n\tprivate static var lime_al_gen_aux = CFFI.load(\"lime\", \"lime_al_gen_aux\", 0);\n\tprivate static var lime_al_auxf = CFFI.load(\"lime\", \"lime_al_auxf\", 3);\n\tprivate static var lime_al_auxfv = CFFI.load(\"lime\", \"lime_al_auxfv\", 3);\n\tprivate static var lime_al_auxi = CFFI.load(\"lime\", \"lime_al_auxi\", 3);\n\tprivate static var lime_al_auxiv = CFFI.load(\"lime\", \"lime_al_auxiv\", 3);\n\tprivate static var lime_al_is_aux = CFFI.load(\"lime\", \"lime_al_is_aux\", 1);\n\tprivate static var lime_al_remove_send = CFFI.load(\"lime\", \"lime_al_remove_send\", 2);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_al_buffer_data\") private static function lime_al_buffer_data(buffer:CFFIPointer, format:Int, data:ArrayBufferView, size:Int,\n\t\tfreq:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_buffer3f\") private static function lime_al_buffer3f(buffer:CFFIPointer, param:Int, value1:hl.F32, value2:hl.F32,\n\t\tvalue3:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_buffer3i\") private static function lime_al_buffer3i(buffer:CFFIPointer, param:Int, value1:Int, value2:Int, value3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_bufferf\") private static function lime_al_bufferf(buffer:CFFIPointer, param:Int, value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_bufferfv\") private static function lime_al_bufferfv(buffer:CFFIPointer, param:Int, values:hl.NativeArray<hl.F32>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_bufferi\") private static function lime_al_bufferi(buffer:CFFIPointer, param:Int, value:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_bufferiv\") private static function lime_al_bufferiv(buffer:CFFIPointer, param:Int, values:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_cleanup\") private static function lime_al_cleanup():Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_delete_buffer\") private static function lime_al_delete_buffer(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_delete_buffers\") private static function lime_al_delete_buffers(n:Int, buffers:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_delete_source\") private static function lime_al_delete_source(source:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_delete_sources\") private static function lime_al_delete_sources(n:Int, sources:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_disable\") private static function lime_al_disable(capability:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_distance_model\") private static function lime_al_distance_model(distanceModel:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_doppler_factor\") private static function lime_al_doppler_factor(value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_doppler_velocity\") private static function lime_al_doppler_velocity(value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_enable\") private static function lime_al_enable(capability:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_source\") private static function lime_al_gen_source():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_sources\") private static function lime_al_gen_sources(n:Int):hl.NativeArray<CFFIPointer>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_boolean\") private static function lime_al_get_boolean(param:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_booleanv\") private static function lime_al_get_booleanv(param:Int, count:Int):hl.NativeArray<Bool>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_buffer\") private static function lime_al_gen_buffer():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_buffers\") private static function lime_al_gen_buffers(n:Int):hl.NativeArray<CFFIPointer>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_buffer3f\") private static function lime_al_get_buffer3f(buffer:CFFIPointer, param:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_buffer3i\") private static function lime_al_get_buffer3i(buffer:CFFIPointer, param:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_bufferf\") private static function lime_al_get_bufferf(buffer:CFFIPointer, param:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_bufferfv\") private static function lime_al_get_bufferfv(buffer:CFFIPointer, param:Int, count:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_bufferi\") private static function lime_al_get_bufferi(buffer:CFFIPointer, param:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_bufferiv\") private static function lime_al_get_bufferiv(buffer:CFFIPointer, param:Int, count:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_double\") private static function lime_al_get_double(param:Int):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_doublev\") private static function lime_al_get_doublev(param:Int, count:Int):hl.NativeArray<Float>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_enum_value\") private static function lime_al_get_enum_value(ename:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_error\") private static function lime_al_get_error():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_float\") private static function lime_al_get_float(param:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_floatv\") private static function lime_al_get_floatv(param:Int, count:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_integer\") private static function lime_al_get_integer(param:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_integerv\") private static function lime_al_get_integerv(param:Int, count:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_listener3f\") private static function lime_al_get_listener3f(param:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_listener3i\") private static function lime_al_get_listener3i(param:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_listenerf\") private static function lime_al_get_listenerf(param:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_listenerfv\") private static function lime_al_get_listenerfv(param:Int, count:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_listeneri\") private static function lime_al_get_listeneri(param:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_listeneriv\") private static function lime_al_get_listeneriv(param:Int, count:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_proc_address\") private static function lime_al_get_proc_address(fname:String):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_source3f\") private static function lime_al_get_source3f(source:CFFIPointer, param:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_source3i\") private static function lime_al_get_source3i(source:CFFIPointer, param:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_sourcef\") private static function lime_al_get_sourcef(source:CFFIPointer, param:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_sourcefv\") private static function lime_al_get_sourcefv(source:CFFIPointer, param:Int, count:Int):hl.NativeArray<hl.F32>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_sourcei\") private static function lime_al_get_sourcei(source:CFFIPointer, param:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_sourceiv\") private static function lime_al_get_sourceiv(source:CFFIPointer, param:Int, count:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_string\") private static function lime_al_get_string(param:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_is_buffer\") private static function lime_al_is_buffer(buffer:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_is_enabled\") private static function lime_al_is_enabled(capability:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_is_extension_present\") private static function lime_al_is_extension_present(extname:String):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_is_source\") private static function lime_al_is_source(source:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_listener3f\") private static function lime_al_listener3f(param:Int, value1:hl.F32, value2:hl.F32, value3:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_listener3i\") private static function lime_al_listener3i(param:Int, value1:Int, value2:Int, value3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_listenerf\") private static function lime_al_listenerf(param:Int, value1:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_listenerfv\") private static function lime_al_listenerfv(param:Int, values:hl.NativeArray<hl.F32>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_listeneri\") private static function lime_al_listeneri(param:Int, value1:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_listeneriv\") private static function lime_al_listeneriv(param:Int, values:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_pause\") private static function lime_al_source_pause(source:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_pausev\") private static function lime_al_source_pausev(n:Int, sources:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_play\") private static function lime_al_source_play(source:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_playv\") private static function lime_al_source_playv(n:Int, sources:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_queue_buffers\") private static function lime_al_source_queue_buffers(source:CFFIPointer, nb:Int,\n\t\tbuffers:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_rewind\") private static function lime_al_source_rewind(source:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_rewindv\") private static function lime_al_source_rewindv(n:Int, sources:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_stop\") private static function lime_al_source_stop(source:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_stopv\") private static function lime_al_source_stopv(n:Int, sources:hl.NativeArray<CFFIPointer>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source_unqueue_buffers\") private static function lime_al_source_unqueue_buffers(source:CFFIPointer,\n\t\t\tnb:Int):hl.NativeArray<CFFIPointer>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_source3f\") private static function lime_al_source3f(source:CFFIPointer, param:Int, value1:hl.F32, value2:hl.F32,\n\t\tvalue3:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_source3i\") private static function lime_al_source3i(source:CFFIPointer, param:Int, value1:Dynamic, value2:Int,\n\t\tvalue3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_sourcef\") private static function lime_al_sourcef(source:CFFIPointer, param:Int, value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_sourcefv\") private static function lime_al_sourcefv(source:CFFIPointer, param:Int, values:hl.NativeArray<hl.F32>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_sourcei\") private static function lime_al_sourcei(source:CFFIPointer, param:Int, value:Dynamic):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_sourceiv\") private static function lime_al_sourceiv(source:CFFIPointer, param:Int, values:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_speed_of_sound\") private static function lime_al_speed_of_sound(speed:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_alc_close_device\") private static function lime_alc_close_device(device:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_create_context\") private static function lime_alc_create_context(device:CFFIPointer, attrlist:hl.NativeArray<Int>):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_destroy_context\") private static function lime_alc_destroy_context(context:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_alc_get_contexts_device\") private static function lime_alc_get_contexts_device(context:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_get_current_context\") private static function lime_alc_get_current_context():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_get_error\") private static function lime_alc_get_error(device:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_get_integerv\") private static function lime_alc_get_integerv(device:CFFIPointer, param:Int, size:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_get_string\") private static function lime_alc_get_string(device:CFFIPointer, param:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_make_context_current\") private static function lime_alc_make_context_current(context:ALContext):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_alc_open_device\") private static function lime_alc_open_device(devicename:String):CFFIPointer\n\t{\n\t\treturn null;\n\t};\n\n\t@:hlNative(\"lime\", \"hl_alc_pause_device\") private static function lime_alc_pause_device(device:ALDevice):Void {}\n\n\t@:hlNative(\"lime\", \"hl_alc_process_context\") private static function lime_alc_process_context(context:ALContext):Void {}\n\n\t@:hlNative(\"lime\", \"hl_alc_resume_device\") private static function lime_alc_resume_device(device:ALDevice):Void {}\n\n\t@:hlNative(\"lime\", \"hl_alc_suspend_context\") private static function lime_alc_suspend_context(context:ALContext):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_filter\") private static function lime_al_gen_filter():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_filteri\") private static function lime_al_filteri(filter:CFFIPointer, param:Int, value:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_filterf\") private static function lime_al_filterf(filter:CFFIPointer, param:Int, value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_remove_direct_filter\") private static function lime_al_remove_direct_filter(source:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_is_filter\") private static function lime_al_is_filter(filter:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_get_filteri\") private static function lime_al_get_filteri(filter:CFFIPointer, param:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_effect\") private static function lime_al_gen_effect():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_effectf\") private static function lime_al_effectf(effect:CFFIPointer, param:Int, value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_effectfv\") private static function lime_al_effectfv(effect:CFFIPointer, param:Int, values:hl.NativeArray<hl.F32>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_effecti\") private static function lime_al_effecti(effect:CFFIPointer, param:Int, value:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_effectiv\") private static function lime_al_effectiv(effect:CFFIPointer, param:Int, values:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_is_effect\") private static function lime_al_is_effect(effect:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_gen_aux\") private static function lime_al_gen_aux():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_auxf\") private static function lime_al_auxf(aux:CFFIPointer, param:Int, value:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_auxfv\") private static function lime_al_auxfv(aux:CFFIPointer, param:Int, values:hl.NativeArray<hl.F32>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_auxi\") private static function lime_al_auxi(aux:CFFIPointer, param:Int, value:Dynamic):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_auxiv\") private static function lime_al_auxiv(aux:CFFIPointer, param:Int, values:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_al_is_aux\") private static function lime_al_is_aux(aux:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_al_remove_send\") private static function lime_al_remove_send(source:CFFIPointer, index:Int):Void {}\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && lime_cairo)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_cairo_arc(handle:CFFIPointer, xc:Float, yc:Float, radius:Float, angle1:Float, angle2:Float):Void;\n\n\t@:cffi private static function lime_cairo_arc_negative(handle:CFFIPointer, xc:Float, yc:Float, radius:Float, angle1:Float, angle2:Float):Void;\n\n\t@:cffi private static function lime_cairo_clip(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_clip_preserve(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_clip_extents(handle:CFFIPointer, x1:Float, y1:Float, x2:Float, y2:Float):Void;\n\n\t@:cffi private static function lime_cairo_close_path(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_copy_page(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_create(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_curve_to(handle:CFFIPointer, x1:Float, y1:Float, x2:Float, y2:Float, x3:Float, y3:Float):Void;\n\n\t@:cffi private static function lime_cairo_fill(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_fill_extents(handle:CFFIPointer, x1:Float, y1:Float, x2:Float, y2:Float):Void;\n\n\t@:cffi private static function lime_cairo_fill_preserve(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_get_antialias(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_get_current_point(handle:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_cairo_get_dash(handle:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_cairo_get_dash_count(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_get_fill_rule(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_get_font_face(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_get_font_options(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_get_group_target(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_get_line_cap(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_get_line_join(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_get_line_width(handle:CFFIPointer):Float;\n\n\t@:cffi private static function lime_cairo_get_matrix(handle:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_cairo_get_miter_limit(handle:CFFIPointer):Float;\n\n\t@:cffi private static function lime_cairo_get_operator(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_get_source(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_get_target(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_get_tolerance(handle:CFFIPointer):Float;\n\n\t@:cffi private static function lime_cairo_has_current_point(handle:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_cairo_identity_matrix(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_in_clip(handle:CFFIPointer, x:Float, y:Float):Bool;\n\n\t@:cffi private static function lime_cairo_in_fill(handle:CFFIPointer, x:Float, y:Float):Bool;\n\n\t@:cffi private static function lime_cairo_in_stroke(handle:CFFIPointer, x:Float, y:Float):Bool;\n\n\t@:cffi private static function lime_cairo_line_to(handle:CFFIPointer, x:Float, y:Float):Void;\n\n\t@:cffi private static function lime_cairo_mask(handle:CFFIPointer, pattern:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_mask_surface(handle:CFFIPointer, surface:CFFIPointer, x:Float, y:Float):Void;\n\n\t@:cffi private static function lime_cairo_move_to(handle:CFFIPointer, x:Float, y:Float):Void;\n\n\t@:cffi private static function lime_cairo_new_path(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_paint(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_paint_with_alpha(handle:CFFIPointer, alpha:Float):Void;\n\n\t@:cffi private static function lime_cairo_pop_group(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_pop_group_to_source(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_push_group(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_push_group_with_content(handle:CFFIPointer, content:Int):Void;\n\n\t@:cffi private static function lime_cairo_rectangle(handle:CFFIPointer, x:Float, y:Float, width:Float, height:Float):Void;\n\n\t@:cffi private static function lime_cairo_rel_curve_to(handle:CFFIPointer, dx1:Float, dy1:Float, dx2:Float, dy2:Float, dx3:Float, dy3:Float):Void;\n\n\t@:cffi private static function lime_cairo_rel_line_to(handle:CFFIPointer, dx:Float, dy:Float):Void;\n\n\t@:cffi private static function lime_cairo_rel_move_to(handle:CFFIPointer, dx:Float, dy:Float):Void;\n\n\t@:cffi private static function lime_cairo_reset_clip(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_restore(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_rotate(handle:CFFIPointer, amount:Float):Void;\n\n\t@:cffi private static function lime_cairo_save(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_scale(handle:CFFIPointer, x:Float, y:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_antialias(handle:CFFIPointer, cap:Int):Void;\n\n\t@:cffi private static function lime_cairo_set_dash(handle:CFFIPointer, dash:Dynamic):Void;\n\n\t@:cffi private static function lime_cairo_set_fill_rule(handle:CFFIPointer, cap:Int):Void;\n\n\t@:cffi private static function lime_cairo_set_font_face(handle:CFFIPointer, face:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_set_font_options(handle:CFFIPointer, options:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_set_font_size(handle:CFFIPointer, size:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_line_cap(handle:CFFIPointer, cap:Int):Void;\n\n\t@:cffi private static function lime_cairo_set_line_join(handle:CFFIPointer, join:Int):Void;\n\n\t@:cffi private static function lime_cairo_set_line_width(handle:CFFIPointer, width:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_matrix(handle:CFFIPointer, a:Float, b:Float, c:Float, d:Float, tx:Float, ty:Float):Void;\n\n\t// @:cffi private static function lime_cairo_set_matrix (handle:CFFIPointer, matrix:Dynamic):Void;\n\t@:cffi private static function lime_cairo_set_miter_limit(handle:CFFIPointer, miterLimit:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_operator(handle:CFFIPointer, op:Int):Void;\n\n\t@:cffi private static function lime_cairo_set_source(handle:CFFIPointer, pattern:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_set_source_rgb(handle:CFFIPointer, r:Float, g:Float, b:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_source_rgba(handle:CFFIPointer, r:Float, g:Float, b:Float, a:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_source_surface(handle:CFFIPointer, surface:CFFIPointer, x:Float, y:Float):Void;\n\n\t@:cffi private static function lime_cairo_set_tolerance(handle:CFFIPointer, tolerance:Float):Void;\n\n\t@:cffi private static function lime_cairo_show_glyphs(handle:CFFIPointer, glyphs:Dynamic):Void;\n\n\t@:cffi private static function lime_cairo_show_page(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_show_text(handle:CFFIPointer, text:String):Void;\n\n\t@:cffi private static function lime_cairo_status(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_stroke(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_stroke_extents(handle:CFFIPointer, x1:Float, y1:Float, x2:Float, y2:Float):Void;\n\n\t@:cffi private static function lime_cairo_stroke_preserve(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_cairo_text_path(handle:CFFIPointer, text:String):Void;\n\n\t@:cffi private static function lime_cairo_transform(handle:CFFIPointer, matrix:Dynamic):Void;\n\n\t@:cffi private static function lime_cairo_translate(handle:CFFIPointer, x:Float, y:Float):Void;\n\n\t@:cffi private static function lime_cairo_version():Int;\n\n\t@:cffi private static function lime_cairo_version_string():String;\n\n\t@:cffi private static function lime_cairo_font_face_status(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_font_options_create():CFFIPointer;\n\n\t@:cffi private static function lime_cairo_font_options_get_antialias(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_font_options_get_hint_metrics(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_font_options_get_hint_style(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_font_options_get_subpixel_order(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_font_options_set_antialias(handle:CFFIPointer, v:Int):Void;\n\n\t@:cffi private static function lime_cairo_font_options_set_hint_metrics(handle:CFFIPointer, v:Int):Void;\n\n\t@:cffi private static function lime_cairo_font_options_set_hint_style(handle:CFFIPointer, v:Int):Void;\n\n\t@:cffi private static function lime_cairo_font_options_set_subpixel_order(handle:CFFIPointer, v:Int):Void;\n\n\t@:cffi private static function lime_cairo_ft_font_face_create(face:CFFIPointer, flags:Int):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_image_surface_create(format:Int, width:Int, height:Int):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_image_surface_create_for_data(data:DataPointer, format:Int, width:Int, height:Int, stride:Int):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_image_surface_get_data(handle:CFFIPointer):DataPointer;\n\n\t@:cffi private static function lime_cairo_image_surface_get_format(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_image_surface_get_height(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_image_surface_get_stride(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_image_surface_get_width(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_pattern_add_color_stop_rgb(handle:CFFIPointer, offset:Float, red:Float, green:Float, blue:Float):Void;\n\n\t@:cffi private static function lime_cairo_pattern_add_color_stop_rgba(handle:CFFIPointer, offset:Float, red:Float, green:Float, blue:Float,\n\t\talpha:Float):Void;\n\n\t@:cffi private static function lime_cairo_pattern_create_for_surface(surface:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_pattern_create_linear(x0:Float, y0:Float, x1:Float, y1:Float):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_pattern_create_radial(cx0:Float, cy0:Float, radius0:Float, cx1:Float, cy1:Float, radius1:Float):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_pattern_create_rgb(r:Float, g:Float, b:Float):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_pattern_create_rgba(r:Float, g:Float, b:Float, a:Float):CFFIPointer;\n\n\t@:cffi private static function lime_cairo_pattern_get_color_stop_count(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_pattern_get_extend(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_pattern_get_filter(handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_cairo_pattern_get_matrix(handle:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_cairo_pattern_set_extend(handle:CFFIPointer, extend:Int):Void;\n\n\t@:cffi private static function lime_cairo_pattern_set_filter(handle:CFFIPointer, filter:Int):Void;\n\n\t@:cffi private static function lime_cairo_pattern_set_matrix(handle:CFFIPointer, matrix:Dynamic):Void;\n\n\t@:cffi private static function lime_cairo_surface_flush(surface:CFFIPointer):Void;\n\t#else\n\tprivate static var lime_cairo_arc = new cpp.Callable<cpp.Object->Float->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_arc\", \"odddddv\", false));\n\tprivate static var lime_cairo_arc_negative = new cpp.Callable<cpp.Object->Float->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_arc_negative\", \"odddddv\", false));\n\tprivate static var lime_cairo_clip = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_clip\", \"ov\", false));\n\tprivate static var lime_cairo_clip_preserve = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_clip_preserve\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_cairo_clip_extents = new cpp.Callable<cpp.Object->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_clip_extents\", \"oddddv\", false));\n\tprivate static var lime_cairo_close_path = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_close_path\", \"ov\", false));\n\tprivate static var lime_cairo_copy_page = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_copy_page\", \"ov\", false));\n\tprivate static var lime_cairo_create = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_create\", \"oo\", false));\n\tprivate static var lime_cairo_curve_to = new cpp.Callable<cpp.Object->Float->Float->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_curve_to\", \"oddddddv\", false));\n\tprivate static var lime_cairo_fill = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_fill\", \"ov\", false));\n\tprivate static var lime_cairo_fill_extents = new cpp.Callable<cpp.Object->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_fill_extents\", \"oddddv\", false));\n\tprivate static var lime_cairo_fill_preserve = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_fill_preserve\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_cairo_get_antialias = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_antialias\", \"oi\", false));\n\tprivate static var lime_cairo_get_current_point = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_current_point\",\n\t\t\"oo\", false));\n\tprivate static var lime_cairo_get_dash = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_dash\", \"oo\", false));\n\tprivate static var lime_cairo_get_dash_count = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_dash_count\", \"oi\", false));\n\tprivate static var lime_cairo_get_fill_rule = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_fill_rule\", \"oi\", false));\n\tprivate static var lime_cairo_get_font_face = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_font_face\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_cairo_get_font_options = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_font_options\",\n\t\t\"oo\", false));\n\tprivate static var lime_cairo_get_group_target = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_group_target\",\n\t\t\"oo\", false));\n\tprivate static var lime_cairo_get_line_cap = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_line_cap\", \"oi\", false));\n\tprivate static var lime_cairo_get_line_join = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_line_join\", \"oi\", false));\n\tprivate static var lime_cairo_get_line_width = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_line_width\", \"od\", false));\n\tprivate static var lime_cairo_get_matrix = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_matrix\", \"oo\", false));\n\tprivate static var lime_cairo_get_miter_limit = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_miter_limit\", \"od\",\n\t\tfalse));\n\tprivate static var lime_cairo_get_operator = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_operator\", \"oi\", false));\n\tprivate static var lime_cairo_get_source = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_source\", \"oo\", false));\n\tprivate static var lime_cairo_get_target = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_target\", \"oo\", false));\n\tprivate static var lime_cairo_get_tolerance = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_get_tolerance\", \"od\", false));\n\tprivate static var lime_cairo_has_current_point = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_has_current_point\", \"ob\",\n\t\tfalse));\n\tprivate static var lime_cairo_identity_matrix = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_identity_matrix\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_cairo_in_clip = new cpp.Callable<cpp.Object->Float->Float->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_in_clip\", \"oddb\",\n\t\tfalse));\n\tprivate static var lime_cairo_in_fill = new cpp.Callable<cpp.Object->Float->Float->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_in_fill\", \"oddb\",\n\t\tfalse));\n\tprivate static var lime_cairo_in_stroke = new cpp.Callable<cpp.Object->Float->Float->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_in_stroke\", \"oddb\",\n\t\tfalse));\n\tprivate static var lime_cairo_line_to = new cpp.Callable<cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_line_to\", \"oddv\",\n\t\tfalse));\n\tprivate static var lime_cairo_mask = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_mask\", \"oov\", false));\n\tprivate static var lime_cairo_mask_surface = new cpp.Callable<cpp.Object->cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_mask_surface\", \"ooddv\", false));\n\tprivate static var lime_cairo_move_to = new cpp.Callable<cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_move_to\", \"oddv\",\n\t\tfalse));\n\tprivate static var lime_cairo_new_path = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_new_path\", \"ov\", false));\n\tprivate static var lime_cairo_paint = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_paint\", \"ov\", false));\n\tprivate static var lime_cairo_paint_with_alpha = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_paint_with_alpha\",\n\t\t\"odv\", false));\n\tprivate static var lime_cairo_pop_group = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_pop_group\", \"oo\", false));\n\tprivate static var lime_cairo_pop_group_to_source = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_pop_group_to_source\",\n\t\t\"ov\", false));\n\tprivate static var lime_cairo_push_group = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_push_group\", \"ov\", false));\n\tprivate static var lime_cairo_push_group_with_content = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_push_group_with_content\", \"oiv\", false));\n\tprivate static var lime_cairo_rectangle = new cpp.Callable<cpp.Object->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_rectangle\", \"oddddv\", false));\n\tprivate static var lime_cairo_rel_curve_to = new cpp.Callable<cpp.Object->Float->Float->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_rel_curve_to\", \"oddddddv\", false));\n\tprivate static var lime_cairo_rel_line_to = new cpp.Callable<cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_rel_line_to\",\n\t\t\"oddv\", false));\n\tprivate static var lime_cairo_rel_move_to = new cpp.Callable<cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_rel_move_to\",\n\t\t\"oddv\", false));\n\tprivate static var lime_cairo_reset_clip = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_reset_clip\", \"ov\", false));\n\tprivate static var lime_cairo_restore = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_restore\", \"ov\", false));\n\tprivate static var lime_cairo_rotate = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_rotate\", \"odv\", false));\n\tprivate static var lime_cairo_save = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_save\", \"ov\", false));\n\tprivate static var lime_cairo_scale = new cpp.Callable<cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_scale\", \"oddv\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_antialias = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_antialias\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_dash = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_dash\", \"oov\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_fill_rule = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_fill_rule\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_font_face = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_font_face\",\n\t\t\"oov\", false));\n\tprivate static var lime_cairo_set_font_options = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_set_font_options\", \"oov\", false));\n\tprivate static var lime_cairo_set_font_size = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_font_size\",\n\t\t\"odv\", false));\n\tprivate static var lime_cairo_set_line_cap = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_line_cap\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_line_join = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_line_join\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_line_width = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_line_width\",\n\t\t\"odv\", false));\n\tprivate static var lime_cairo_set_matrix = new cpp.Callable<cpp.Object->Float->Float->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_set_matrix\", \"oddddddv\", false));\n\tprivate static var lime_cairo_set_miter_limit = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_miter_limit\",\n\t\t\"odv\", false));\n\tprivate static var lime_cairo_set_operator = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_operator\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_source = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_source\", \"oov\",\n\t\tfalse));\n\tprivate static var lime_cairo_set_source_rgb = new cpp.Callable<cpp.Object->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_set_source_rgb\", \"odddv\", false));\n\tprivate static var lime_cairo_set_source_rgba = new cpp.Callable<cpp.Object->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_set_source_rgba\", \"oddddv\", false));\n\tprivate static var lime_cairo_set_source_surface = new cpp.Callable<cpp.Object->cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_set_source_surface\", \"ooddv\", false));\n\tprivate static var lime_cairo_set_tolerance = new cpp.Callable<cpp.Object->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_set_tolerance\",\n\t\t\"odv\", false));\n\tprivate static var lime_cairo_show_glyphs = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_show_glyphs\",\n\t\t\"oov\", false));\n\tprivate static var lime_cairo_show_page = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_show_page\", \"ov\", false));\n\tprivate static var lime_cairo_show_text = new cpp.Callable<cpp.Object->String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_show_text\", \"osv\",\n\t\tfalse));\n\tprivate static var lime_cairo_status = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_status\", \"oi\", false));\n\tprivate static var lime_cairo_stroke = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_stroke\", \"ov\", false));\n\tprivate static var lime_cairo_stroke_extents = new cpp.Callable<cpp.Object->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_stroke_extents\", \"oddddv\", false));\n\tprivate static var lime_cairo_stroke_preserve = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_stroke_preserve\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_cairo_text_path = new cpp.Callable<cpp.Object->String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_text_path\", \"osv\",\n\t\tfalse));\n\tprivate static var lime_cairo_transform = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_transform\", \"oov\",\n\t\tfalse));\n\tprivate static var lime_cairo_translate = new cpp.Callable<cpp.Object->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_translate\",\n\t\t\"oddv\", false));\n\tprivate static var lime_cairo_version = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_version\", \"i\", false));\n\tprivate static var lime_cairo_version_string = new cpp.Callable<Void->String>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_version_string\", \"s\", false));\n\tprivate static var lime_cairo_font_face_status = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_font_face_status\", \"oi\",\n\t\tfalse));\n\tprivate static var lime_cairo_font_options_create = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_font_options_create\", \"o\",\n\t\tfalse));\n\tprivate static var lime_cairo_font_options_get_antialias = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_get_antialias\", \"oi\", false));\n\tprivate static var lime_cairo_font_options_get_hint_metrics = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_get_hint_metrics\", \"oi\", false));\n\tprivate static var lime_cairo_font_options_get_hint_style = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_get_hint_style\", \"oi\", false));\n\tprivate static var lime_cairo_font_options_get_subpixel_order = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_get_subpixel_order\", \"oi\", false));\n\tprivate static var lime_cairo_font_options_set_antialias = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_set_antialias\", \"oiv\", false));\n\tprivate static var lime_cairo_font_options_set_hint_metrics = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_set_hint_metrics\", \"oiv\", false));\n\tprivate static var lime_cairo_font_options_set_hint_style = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_set_hint_style\", \"oiv\", false));\n\tprivate static var lime_cairo_font_options_set_subpixel_order = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_font_options_set_subpixel_order\", \"oiv\", false));\n\tprivate static var lime_cairo_ft_font_face_create = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_ft_font_face_create\", \"oio\", false));\n\tprivate static var lime_cairo_image_surface_create = new cpp.Callable<Int->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_image_surface_create\", \"iiio\", false));\n\tprivate static var lime_cairo_image_surface_create_for_data = new cpp.Callable<lime.utils.DataPointer->Int->Int->Int->Int->\n\t\tcpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_image_surface_create_for_data\", \"diiiio\", false));\n\tprivate static var lime_cairo_image_surface_get_data = new cpp.Callable<cpp.Object->lime.utils.DataPointer>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_image_surface_get_data\", \"od\", false));\n\tprivate static var lime_cairo_image_surface_get_format = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_image_surface_get_format\", \"oi\", false));\n\tprivate static var lime_cairo_image_surface_get_height = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_image_surface_get_height\", \"oi\", false));\n\tprivate static var lime_cairo_image_surface_get_stride = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_image_surface_get_stride\", \"oi\", false));\n\tprivate static var lime_cairo_image_surface_get_width = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_image_surface_get_width\", \"oi\", false));\n\tprivate static var lime_cairo_pattern_add_color_stop_rgb = new cpp.Callable<cpp.Object->Float->Float->Float->Float->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_add_color_stop_rgb\", \"oddddv\", false));\n\tprivate static var lime_cairo_pattern_add_color_stop_rgba = new cpp.Callable<cpp.Object->Float->Float->Float->Float->Float->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_pattern_add_color_stop_rgba\", \"odddddv\", false));\n\tprivate static var lime_cairo_pattern_create_for_surface = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_create_for_surface\", \"oo\", false));\n\tprivate static var lime_cairo_pattern_create_linear = new cpp.Callable<Float->Float->Float->Float->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_create_linear\", \"ddddo\", false));\n\tprivate static var lime_cairo_pattern_create_radial = new cpp.Callable<Float->Float->Float->Float->Float->Float->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_create_radial\", \"ddddddo\", false));\n\tprivate static var lime_cairo_pattern_create_rgb = new cpp.Callable<Float->Float->Float->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_create_rgb\", \"dddo\", false));\n\tprivate static var lime_cairo_pattern_create_rgba = new cpp.Callable<Float->Float->Float->Float->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_create_rgba\", \"ddddo\", false));\n\tprivate static var lime_cairo_pattern_get_color_stop_count = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_get_color_stop_count\", \"oi\", false));\n\tprivate static var lime_cairo_pattern_get_extend = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_pattern_get_extend\", \"oi\",\n\t\tfalse));\n\tprivate static var lime_cairo_pattern_get_filter = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_pattern_get_filter\", \"oi\",\n\t\tfalse));\n\tprivate static var lime_cairo_pattern_get_matrix = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_pattern_get_matrix\",\n\t\t\"oo\", false));\n\tprivate static var lime_cairo_pattern_set_extend = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_set_extend\", \"oiv\", false));\n\tprivate static var lime_cairo_pattern_set_filter = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_set_filter\", \"oiv\", false));\n\tprivate static var lime_cairo_pattern_set_matrix = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_cairo_pattern_set_matrix\", \"oov\", false));\n\tprivate static var lime_cairo_surface_flush = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_cairo_surface_flush\", \"ov\",\n\t\tfalse));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_cairo_arc = CFFI.load(\"lime\", \"lime_cairo_arc\", -1);\n\tprivate static var lime_cairo_arc_negative = CFFI.load(\"lime\", \"lime_cairo_arc_negative\", -1);\n\tprivate static var lime_cairo_clip = CFFI.load(\"lime\", \"lime_cairo_clip\", 1);\n\tprivate static var lime_cairo_clip_preserve = CFFI.load(\"lime\", \"lime_cairo_clip_preserve\", 1);\n\tprivate static var lime_cairo_clip_extents = CFFI.load(\"lime\", \"lime_cairo_clip_extents\", 5);\n\tprivate static var lime_cairo_close_path = CFFI.load(\"lime\", \"lime_cairo_close_path\", 1);\n\tprivate static var lime_cairo_copy_page = CFFI.load(\"lime\", \"lime_cairo_copy_page\", 1);\n\tprivate static var lime_cairo_create = CFFI.load(\"lime\", \"lime_cairo_create\", 1);\n\tprivate static var lime_cairo_curve_to = CFFI.load(\"lime\", \"lime_cairo_curve_to\", -1);\n\tprivate static var lime_cairo_fill = CFFI.load(\"lime\", \"lime_cairo_fill\", 1);\n\tprivate static var lime_cairo_fill_extents = CFFI.load(\"lime\", \"lime_cairo_fill_extents\", 5);\n\tprivate static var lime_cairo_fill_preserve = CFFI.load(\"lime\", \"lime_cairo_fill_preserve\", 1);\n\tprivate static var lime_cairo_get_antialias = CFFI.load(\"lime\", \"lime_cairo_get_antialias\", 1);\n\tprivate static var lime_cairo_get_current_point = CFFI.load(\"lime\", \"lime_cairo_get_current_point\", 1);\n\tprivate static var lime_cairo_get_dash = CFFI.load(\"lime\", \"lime_cairo_get_dash\", 1);\n\tprivate static var lime_cairo_get_dash_count = CFFI.load(\"lime\", \"lime_cairo_get_dash_count\", 1);\n\tprivate static var lime_cairo_get_fill_rule = CFFI.load(\"lime\", \"lime_cairo_get_fill_rule\", 1);\n\tprivate static var lime_cairo_get_font_face = CFFI.load(\"lime\", \"lime_cairo_get_font_face\", 1);\n\tprivate static var lime_cairo_get_font_options = CFFI.load(\"lime\", \"lime_cairo_get_font_options\", 1);\n\tprivate static var lime_cairo_get_group_target = CFFI.load(\"lime\", \"lime_cairo_get_group_target\", 1);\n\tprivate static var lime_cairo_get_line_cap = CFFI.load(\"lime\", \"lime_cairo_get_line_cap\", 1);\n\tprivate static var lime_cairo_get_line_join = CFFI.load(\"lime\", \"lime_cairo_get_line_join\", 1);\n\tprivate static var lime_cairo_get_line_width = CFFI.load(\"lime\", \"lime_cairo_get_line_width\", 1);\n\tprivate static var lime_cairo_get_matrix = CFFI.load(\"lime\", \"lime_cairo_get_matrix\", 1);\n\tprivate static var lime_cairo_get_miter_limit = CFFI.load(\"lime\", \"lime_cairo_get_miter_limit\", 1);\n\tprivate static var lime_cairo_get_operator = CFFI.load(\"lime\", \"lime_cairo_get_operator\", 1);\n\tprivate static var lime_cairo_get_source = CFFI.load(\"lime\", \"lime_cairo_get_source\", 1);\n\tprivate static var lime_cairo_get_target = CFFI.load(\"lime\", \"lime_cairo_get_target\", 1);\n\tprivate static var lime_cairo_get_tolerance = CFFI.load(\"lime\", \"lime_cairo_get_tolerance\", 1);\n\tprivate static var lime_cairo_has_current_point = CFFI.load(\"lime\", \"lime_cairo_has_current_point\", 1);\n\tprivate static var lime_cairo_identity_matrix = CFFI.load(\"lime\", \"lime_cairo_identity_matrix\", 1);\n\tprivate static var lime_cairo_in_clip = CFFI.load(\"lime\", \"lime_cairo_in_clip\", 3);\n\tprivate static var lime_cairo_in_fill = CFFI.load(\"lime\", \"lime_cairo_in_fill\", 3);\n\tprivate static var lime_cairo_in_stroke = CFFI.load(\"lime\", \"lime_cairo_in_stroke\", 3);\n\tprivate static var lime_cairo_line_to = CFFI.load(\"lime\", \"lime_cairo_line_to\", 3);\n\tprivate static var lime_cairo_mask = CFFI.load(\"lime\", \"lime_cairo_mask\", 2);\n\tprivate static var lime_cairo_mask_surface = CFFI.load(\"lime\", \"lime_cairo_mask_surface\", 4);\n\tprivate static var lime_cairo_move_to = CFFI.load(\"lime\", \"lime_cairo_move_to\", 3);\n\tprivate static var lime_cairo_new_path = CFFI.load(\"lime\", \"lime_cairo_new_path\", 1);\n\tprivate static var lime_cairo_paint = CFFI.load(\"lime\", \"lime_cairo_paint\", 1);\n\tprivate static var lime_cairo_paint_with_alpha = CFFI.load(\"lime\", \"lime_cairo_paint_with_alpha\", 2);\n\tprivate static var lime_cairo_pop_group = CFFI.load(\"lime\", \"lime_cairo_pop_group\", 1);\n\tprivate static var lime_cairo_pop_group_to_source = CFFI.load(\"lime\", \"lime_cairo_pop_group_to_source\", 1);\n\tprivate static var lime_cairo_push_group = CFFI.load(\"lime\", \"lime_cairo_push_group\", 1);\n\tprivate static var lime_cairo_push_group_with_content = CFFI.load(\"lime\", \"lime_cairo_push_group_with_content\", 2);\n\tprivate static var lime_cairo_rectangle = CFFI.load(\"lime\", \"lime_cairo_rectangle\", 5);\n\tprivate static var lime_cairo_rel_curve_to = CFFI.load(\"lime\", \"lime_cairo_rel_curve_to\", -1);\n\tprivate static var lime_cairo_rel_line_to = CFFI.load(\"lime\", \"lime_cairo_rel_line_to\", 3);\n\tprivate static var lime_cairo_rel_move_to = CFFI.load(\"lime\", \"lime_cairo_rel_move_to\", 3);\n\tprivate static var lime_cairo_reset_clip = CFFI.load(\"lime\", \"lime_cairo_reset_clip\", 1);\n\tprivate static var lime_cairo_restore = CFFI.load(\"lime\", \"lime_cairo_restore\", 1);\n\tprivate static var lime_cairo_rotate = CFFI.load(\"lime\", \"lime_cairo_rotate\", 2);\n\tprivate static var lime_cairo_save = CFFI.load(\"lime\", \"lime_cairo_save\", 1);\n\tprivate static var lime_cairo_scale = CFFI.load(\"lime\", \"lime_cairo_scale\", 3);\n\tprivate static var lime_cairo_set_antialias = CFFI.load(\"lime\", \"lime_cairo_set_antialias\", 2);\n\tprivate static var lime_cairo_set_dash = CFFI.load(\"lime\", \"lime_cairo_set_dash\", 2);\n\tprivate static var lime_cairo_set_fill_rule = CFFI.load(\"lime\", \"lime_cairo_set_fill_rule\", 2);\n\tprivate static var lime_cairo_set_font_face = CFFI.load(\"lime\", \"lime_cairo_set_font_face\", 2);\n\tprivate static var lime_cairo_set_font_options = CFFI.load(\"lime\", \"lime_cairo_set_font_options\", 2);\n\tprivate static var lime_cairo_set_font_size = CFFI.load(\"lime\", \"lime_cairo_set_font_size\", 2);\n\tprivate static var lime_cairo_set_line_cap = CFFI.load(\"lime\", \"lime_cairo_set_line_cap\", 2);\n\tprivate static var lime_cairo_set_line_join = CFFI.load(\"lime\", \"lime_cairo_set_line_join\", 2);\n\tprivate static var lime_cairo_set_line_width = CFFI.load(\"lime\", \"lime_cairo_set_line_width\", 2);\n\tprivate static var lime_cairo_set_matrix = CFFI.load(\"lime\", \"lime_cairo_set_matrix\", -1);\n\tprivate static var lime_cairo_set_miter_limit = CFFI.load(\"lime\", \"lime_cairo_set_miter_limit\", 2);\n\tprivate static var lime_cairo_set_operator = CFFI.load(\"lime\", \"lime_cairo_set_operator\", 2);\n\tprivate static var lime_cairo_set_source = CFFI.load(\"lime\", \"lime_cairo_set_source\", 2);\n\tprivate static var lime_cairo_set_source_rgb = CFFI.load(\"lime\", \"lime_cairo_set_source_rgb\", 4);\n\tprivate static var lime_cairo_set_source_rgba = CFFI.load(\"lime\", \"lime_cairo_set_source_rgba\", 5);\n\tprivate static var lime_cairo_set_source_surface = CFFI.load(\"lime\", \"lime_cairo_set_source_surface\", 4);\n\tprivate static var lime_cairo_set_tolerance = CFFI.load(\"lime\", \"lime_cairo_set_tolerance\", 2);\n\tprivate static var lime_cairo_show_glyphs = CFFI.load(\"lime\", \"lime_cairo_show_glyphs\", 2);\n\tprivate static var lime_cairo_show_page = CFFI.load(\"lime\", \"lime_cairo_show_page\", 1);\n\tprivate static var lime_cairo_show_text = CFFI.load(\"lime\", \"lime_cairo_show_text\", 2);\n\tprivate static var lime_cairo_status = CFFI.load(\"lime\", \"lime_cairo_status\", 1);\n\tprivate static var lime_cairo_stroke = CFFI.load(\"lime\", \"lime_cairo_stroke\", 1);\n\tprivate static var lime_cairo_stroke_extents = CFFI.load(\"lime\", \"lime_cairo_stroke_extents\", 5);\n\tprivate static var lime_cairo_stroke_preserve = CFFI.load(\"lime\", \"lime_cairo_stroke_preserve\", 1);\n\tprivate static var lime_cairo_text_path = CFFI.load(\"lime\", \"lime_cairo_text_path\", 2);\n\tprivate static var lime_cairo_transform = CFFI.load(\"lime\", \"lime_cairo_transform\", 2);\n\tprivate static var lime_cairo_translate = CFFI.load(\"lime\", \"lime_cairo_translate\", 3);\n\tprivate static var lime_cairo_version = CFFI.load(\"lime\", \"lime_cairo_version\", 0);\n\tprivate static var lime_cairo_version_string = CFFI.load(\"lime\", \"lime_cairo_version_string\", 0);\n\tprivate static var lime_cairo_font_face_status = CFFI.load(\"lime\", \"lime_cairo_font_face_status\", 1);\n\tprivate static var lime_cairo_font_options_create = CFFI.load(\"lime\", \"lime_cairo_font_options_create\", 0);\n\tprivate static var lime_cairo_font_options_get_antialias = CFFI.load(\"lime\", \"lime_cairo_font_options_get_antialias\", 1);\n\tprivate static var lime_cairo_font_options_get_hint_metrics = CFFI.load(\"lime\", \"lime_cairo_font_options_get_hint_metrics\", 1);\n\tprivate static var lime_cairo_font_options_get_hint_style = CFFI.load(\"lime\", \"lime_cairo_font_options_get_hint_style\", 1);\n\tprivate static var lime_cairo_font_options_get_subpixel_order = CFFI.load(\"lime\", \"lime_cairo_font_options_get_subpixel_order\", 1);\n\tprivate static var lime_cairo_font_options_set_antialias = CFFI.load(\"lime\", \"lime_cairo_font_options_set_antialias\", 2);\n\tprivate static var lime_cairo_font_options_set_hint_metrics = CFFI.load(\"lime\", \"lime_cairo_font_options_set_hint_metrics\", 2);\n\tprivate static var lime_cairo_font_options_set_hint_style = CFFI.load(\"lime\", \"lime_cairo_font_options_set_hint_style\", 2);\n\tprivate static var lime_cairo_font_options_set_subpixel_order = CFFI.load(\"lime\", \"lime_cairo_font_options_set_subpixel_order\", 2);\n\tprivate static var lime_cairo_ft_font_face_create = CFFI.load(\"lime\", \"lime_cairo_ft_font_face_create\", 2);\n\tprivate static var lime_cairo_image_surface_create = CFFI.load(\"lime\", \"lime_cairo_image_surface_create\", 3);\n\tprivate static var lime_cairo_image_surface_create_for_data = CFFI.load(\"lime\", \"lime_cairo_image_surface_create_for_data\", 5);\n\tprivate static var lime_cairo_image_surface_get_data = CFFI.load(\"lime\", \"lime_cairo_image_surface_get_data\", 1);\n\tprivate static var lime_cairo_image_surface_get_format = CFFI.load(\"lime\", \"lime_cairo_image_surface_get_format\", 1);\n\tprivate static var lime_cairo_image_surface_get_height = CFFI.load(\"lime\", \"lime_cairo_image_surface_get_height\", 1);\n\tprivate static var lime_cairo_image_surface_get_stride = CFFI.load(\"lime\", \"lime_cairo_image_surface_get_stride\", 1);\n\tprivate static var lime_cairo_image_surface_get_width = CFFI.load(\"lime\", \"lime_cairo_image_surface_get_width\", 1);\n\tprivate static var lime_cairo_pattern_add_color_stop_rgb = CFFI.load(\"lime\", \"lime_cairo_pattern_add_color_stop_rgb\", 5);\n\tprivate static var lime_cairo_pattern_add_color_stop_rgba = CFFI.load(\"lime\", \"lime_cairo_pattern_add_color_stop_rgba\", -1);\n\tprivate static var lime_cairo_pattern_create_for_surface = CFFI.load(\"lime\", \"lime_cairo_pattern_create_for_surface\", 1);\n\tprivate static var lime_cairo_pattern_create_linear = CFFI.load(\"lime\", \"lime_cairo_pattern_create_linear\", 4);\n\tprivate static var lime_cairo_pattern_create_radial = CFFI.load(\"lime\", \"lime_cairo_pattern_create_radial\", -1);\n\tprivate static var lime_cairo_pattern_create_rgb = CFFI.load(\"lime\", \"lime_cairo_pattern_create_rgb\", 3);\n\tprivate static var lime_cairo_pattern_create_rgba = CFFI.load(\"lime\", \"lime_cairo_pattern_create_rgba\", 4);\n\tprivate static var lime_cairo_pattern_get_color_stop_count = CFFI.load(\"lime\", \"lime_cairo_pattern_get_color_stop_count\", 1);\n\tprivate static var lime_cairo_pattern_get_extend = CFFI.load(\"lime\", \"lime_cairo_pattern_get_extend\", 1);\n\tprivate static var lime_cairo_pattern_get_filter = CFFI.load(\"lime\", \"lime_cairo_pattern_get_filter\", 1);\n\tprivate static var lime_cairo_pattern_get_matrix = CFFI.load(\"lime\", \"lime_cairo_pattern_get_matrix\", 1);\n\tprivate static var lime_cairo_pattern_set_extend = CFFI.load(\"lime\", \"lime_cairo_pattern_set_extend\", 2);\n\tprivate static var lime_cairo_pattern_set_filter = CFFI.load(\"lime\", \"lime_cairo_pattern_set_filter\", 2);\n\tprivate static var lime_cairo_pattern_set_matrix = CFFI.load(\"lime\", \"lime_cairo_pattern_set_matrix\", 2);\n\tprivate static var lime_cairo_surface_flush = CFFI.load(\"lime\", \"lime_cairo_surface_flush\", 1);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_cairo_arc\") private static function lime_cairo_arc(handle:CFFIPointer, xc:Float, yc:Float, radius:Float, angle1:Float,\n\t\tangle2:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_arc_negative\") private static function lime_cairo_arc_negative(handle:CFFIPointer, xc:Float, yc:Float, radius:Float,\n\t\tangle1:Float, angle2:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_clip\") private static function lime_cairo_clip(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_clip_preserve\") private static function lime_cairo_clip_preserve(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_clip_extents\") private static function lime_cairo_clip_extents(handle:CFFIPointer, x1:Float, y1:Float, x2:Float,\n\t\ty2:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_close_path\") private static function lime_cairo_close_path(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_copy_page\") private static function lime_cairo_copy_page(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_create\") private static function lime_cairo_create(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_curve_to\") private static function lime_cairo_curve_to(handle:CFFIPointer, x1:Float, y1:Float, x2:Float, y2:Float,\n\t\tx3:Float, y3:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_fill\") private static function lime_cairo_fill(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_fill_extents\") private static function lime_cairo_fill_extents(handle:CFFIPointer, x1:Float, y1:Float, x2:Float,\n\t\ty2:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_fill_preserve\") private static function lime_cairo_fill_preserve(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_antialias\") private static function lime_cairo_get_antialias(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_current_point\") private static function lime_cairo_get_current_point(handle:CFFIPointer, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_dash\") private static function lime_cairo_get_dash(handle:CFFIPointer):hl.NativeArray<Float>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_dash_count\") private static function lime_cairo_get_dash_count(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_fill_rule\") private static function lime_cairo_get_fill_rule(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_font_face\") private static function lime_cairo_get_font_face(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_font_options\") private static function lime_cairo_get_font_options(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_group_target\") private static function lime_cairo_get_group_target(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_line_cap\") private static function lime_cairo_get_line_cap(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_line_join\") private static function lime_cairo_get_line_join(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_line_width\") private static function lime_cairo_get_line_width(handle:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_matrix\") private static function lime_cairo_get_matrix(handle:CFFIPointer, out:CairoMatrix3):CairoMatrix3\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_miter_limit\") private static function lime_cairo_get_miter_limit(handle:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_operator\") private static function lime_cairo_get_operator(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_source\") private static function lime_cairo_get_source(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_target\") private static function lime_cairo_get_target(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_get_tolerance\") private static function lime_cairo_get_tolerance(handle:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_has_current_point\") private static function lime_cairo_has_current_point(handle:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_identity_matrix\") private static function lime_cairo_identity_matrix(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_in_clip\") private static function lime_cairo_in_clip(handle:CFFIPointer, x:Float, y:Float):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_in_fill\") private static function lime_cairo_in_fill(handle:CFFIPointer, x:Float, y:Float):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_in_stroke\") private static function lime_cairo_in_stroke(handle:CFFIPointer, x:Float, y:Float):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_line_to\") private static function lime_cairo_line_to(handle:CFFIPointer, x:Float, y:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_mask\") private static function lime_cairo_mask(handle:CFFIPointer, pattern:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_mask_surface\") private static function lime_cairo_mask_surface(handle:CFFIPointer, surface:CFFIPointer, x:Float,\n\t\ty:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_move_to\") private static function lime_cairo_move_to(handle:CFFIPointer, x:Float, y:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_new_path\") private static function lime_cairo_new_path(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_paint\") private static function lime_cairo_paint(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_paint_with_alpha\") private static function lime_cairo_paint_with_alpha(handle:CFFIPointer, alpha:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pop_group\") private static function lime_cairo_pop_group(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pop_group_to_source\") private static function lime_cairo_pop_group_to_source(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_push_group\") private static function lime_cairo_push_group(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_push_group_with_content\") private static function lime_cairo_push_group_with_content(handle:CFFIPointer,\n\t\tcontent:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_rectangle\") private static function lime_cairo_rectangle(handle:CFFIPointer, x:Float, y:Float, width:Float,\n\t\theight:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_rel_curve_to\") private static function lime_cairo_rel_curve_to(handle:CFFIPointer, dx1:Float, dy1:Float, dx2:Float,\n\t\tdy2:Float, dx3:Float, dy3:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_rel_line_to\") private static function lime_cairo_rel_line_to(handle:CFFIPointer, dx:Float, dy:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_rel_move_to\") private static function lime_cairo_rel_move_to(handle:CFFIPointer, dx:Float, dy:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_reset_clip\") private static function lime_cairo_reset_clip(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_restore\") private static function lime_cairo_restore(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_rotate\") private static function lime_cairo_rotate(handle:CFFIPointer, amount:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_save\") private static function lime_cairo_save(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_scale\") private static function lime_cairo_scale(handle:CFFIPointer, x:Float, y:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_antialias\") private static function lime_cairo_set_antialias(handle:CFFIPointer, cap:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_dash\") private static function lime_cairo_set_dash(handle:CFFIPointer, dash:hl.NativeArray<Float>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_fill_rule\") private static function lime_cairo_set_fill_rule(handle:CFFIPointer, cap:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_font_face\") private static function lime_cairo_set_font_face(handle:CFFIPointer, face:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_font_options\") private static function lime_cairo_set_font_options(handle:CFFIPointer, options:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_font_size\") private static function lime_cairo_set_font_size(handle:CFFIPointer, size:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_line_cap\") private static function lime_cairo_set_line_cap(handle:CFFIPointer, cap:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_line_join\") private static function lime_cairo_set_line_join(handle:CFFIPointer, join:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_line_width\") private static function lime_cairo_set_line_width(handle:CFFIPointer, width:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_matrix\") private static function lime_cairo_set_matrix(handle:CFFIPointer, matrix:CairoMatrix3):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_miter_limit\") private static function lime_cairo_set_miter_limit(handle:CFFIPointer, miterLimit:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_operator\") private static function lime_cairo_set_operator(handle:CFFIPointer, op:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_source\") private static function lime_cairo_set_source(handle:CFFIPointer, pattern:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_source_rgb\") private static function lime_cairo_set_source_rgb(handle:CFFIPointer, r:Float, g:Float, b:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_source_rgba\") private static function lime_cairo_set_source_rgba(handle:CFFIPointer, r:Float, g:Float, b:Float,\n\t\ta:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_source_surface\") private static function lime_cairo_set_source_surface(handle:CFFIPointer, surface:CFFIPointer,\n\t\tx:Float, y:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_set_tolerance\") private static function lime_cairo_set_tolerance(handle:CFFIPointer, tolerance:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_show_glyphs\") private static function lime_cairo_show_glyphs(handle:CFFIPointer, glyphs:hl.NativeArray<CairoGlyph>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_show_page\") private static function lime_cairo_show_page(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_show_text\") private static function lime_cairo_show_text(handle:CFFIPointer, text:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_status\") private static function lime_cairo_status(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_stroke\") private static function lime_cairo_stroke(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_stroke_extents\") private static function lime_cairo_stroke_extents(handle:CFFIPointer, x1:Float, y1:Float, x2:Float,\n\t\ty2:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_stroke_preserve\") private static function lime_cairo_stroke_preserve(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_text_path\") private static function lime_cairo_text_path(handle:CFFIPointer, text:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_transform\") private static function lime_cairo_transform(handle:CFFIPointer, matrix:CairoMatrix3):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_translate\") private static function lime_cairo_translate(handle:CFFIPointer, x:Float, y:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_version\") private static function lime_cairo_version():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_version_string\") private static function lime_cairo_version_string():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_face_status\") private static function lime_cairo_font_face_status(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_create\") private static function lime_cairo_font_options_create():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_get_antialias\") private static function lime_cairo_font_options_get_antialias(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_get_hint_metrics\") private static function lime_cairo_font_options_get_hint_metrics(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_get_hint_style\") private static function lime_cairo_font_options_get_hint_style(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_get_subpixel_order\") private static function lime_cairo_font_options_get_subpixel_order(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_set_antialias\") private static function lime_cairo_font_options_set_antialias(handle:CFFIPointer,\n\t\tv:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_set_hint_metrics\") private static function lime_cairo_font_options_set_hint_metrics(handle:CFFIPointer,\n\t\tv:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_set_hint_style\") private static function lime_cairo_font_options_set_hint_style(handle:CFFIPointer,\n\t\tv:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_font_options_set_subpixel_order\") private static function lime_cairo_font_options_set_subpixel_order(handle:CFFIPointer,\n\t\tv:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_ft_font_face_create\") private static function lime_cairo_ft_font_face_create(face:CFFIPointer, flags:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_create\") private static function lime_cairo_image_surface_create(format:Int, width:Int,\n\t\t\theight:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_create_for_data\") private static function lime_cairo_image_surface_create_for_data(data:Float, format:Int,\n\t\t\twidth:Int, height:Int, stride:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_get_data\") private static function lime_cairo_image_surface_get_data(handle:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_get_format\") private static function lime_cairo_image_surface_get_format(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_get_height\") private static function lime_cairo_image_surface_get_height(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_get_stride\") private static function lime_cairo_image_surface_get_stride(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_image_surface_get_width\") private static function lime_cairo_image_surface_get_width(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_add_color_stop_rgb\") private static function lime_cairo_pattern_add_color_stop_rgb(handle:CFFIPointer,\n\t\toffset:Float, red:Float, green:Float, blue:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_add_color_stop_rgba\") private static function lime_cairo_pattern_add_color_stop_rgba(handle:CFFIPointer,\n\t\toffset:Float, red:Float, green:Float, blue:Float, alpha:Float):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_create_for_surface\") private static function lime_cairo_pattern_create_for_surface(surface:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_create_linear\") private static function lime_cairo_pattern_create_linear(x0:Float, y0:Float, x1:Float,\n\t\t\ty1:Float):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_create_radial\") private static function lime_cairo_pattern_create_radial(cx0:Float, cy0:Float, radius0:Float,\n\t\t\tcx1:Float, cy1:Float, radius1:Float):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_create_rgb\") private static function lime_cairo_pattern_create_rgb(r:Float, g:Float, b:Float):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_create_rgba\") private static function lime_cairo_pattern_create_rgba(r:Float, g:Float, b:Float, a:Float):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_get_color_stop_count\") private static function lime_cairo_pattern_get_color_stop_count(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_get_extend\") private static function lime_cairo_pattern_get_extend(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_get_filter\") private static function lime_cairo_pattern_get_filter(handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_get_matrix\") private static function lime_cairo_pattern_get_matrix(handle:CFFIPointer, out:CairoMatrix3):CairoMatrix3\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_set_extend\") private static function lime_cairo_pattern_set_extend(handle:CFFIPointer, extend:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_set_filter\") private static function lime_cairo_pattern_set_filter(handle:CFFIPointer, filter:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_pattern_set_matrix\") private static function lime_cairo_pattern_set_matrix(handle:CFFIPointer, matrix:CairoMatrix3):Void {}\n\n\t@:hlNative(\"lime\", \"hl_cairo_surface_flush\") private static function lime_cairo_surface_flush(surface:CFFIPointer):Void {}\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && lime_curl)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_curl_getdate(date:String, now:Float):Float;\n\n\t@:cffi private static function lime_curl_global_cleanup():Void;\n\n\t@:cffi private static function lime_curl_global_init(flags:Int):Int;\n\n\t@:cffi private static function lime_curl_version():Dynamic;\n\n\t@:cffi private static function lime_curl_version_info(type:Int):Dynamic;\n\n\t@:cffi private static function lime_curl_easy_cleanup(handle:CFFIPointer):Void;\n\n\t@:cffi private static function lime_curl_easy_duphandle(handle:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_curl_easy_escape(curl:CFFIPointer, url:String, length:Int):Dynamic;\n\n\t@:cffi private static function lime_curl_easy_flush(curl:CFFIPointer):Void;\n\n\t@:cffi private static function lime_curl_easy_getinfo(curl:CFFIPointer, info:Int):Dynamic;\n\n\t@:cffi private static function lime_curl_easy_init():CFFIPointer;\n\n\t@:cffi private static function lime_curl_easy_pause(handle:CFFIPointer, bitmask:Int):Int;\n\n\t@:cffi private static function lime_curl_easy_perform(easy_handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_curl_easy_recv(curl:CFFIPointer, buffer:Dynamic, buflen:Int, n:Int):Int;\n\n\t@:cffi private static function lime_curl_easy_reset(curl:CFFIPointer):Void;\n\n\t@:cffi private static function lime_curl_easy_send(curl:CFFIPointer, buffer:Dynamic, buflen:Int, n:Int):Int;\n\n\t@:cffi private static function lime_curl_easy_setopt(handle:CFFIPointer, option:Int, parameter:Dynamic, writeBytes:Dynamic):Int;\n\n\t@:cffi private static function lime_curl_easy_strerror(errornum:Int):Dynamic;\n\n\t@:cffi private static function lime_curl_easy_unescape(curl:CFFIPointer, url:String, inlength:Int, outlength:Int):Dynamic;\n\n\t@:cffi private static function lime_curl_multi_init():CFFIPointer;\n\n\t@:cffi private static function lime_curl_multi_add_handle(multi_handle:CFFIPointer, curl_object:Dynamic, curl_handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_curl_multi_get_running_handles(multi_handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_curl_multi_info_read(multi_handle:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_curl_multi_perform(multi_handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_curl_multi_remove_handle(multi_handle:CFFIPointer, curl_handle:CFFIPointer):Int;\n\n\t@:cffi private static function lime_curl_multi_setopt(multi_handle:CFFIPointer, option:Int, parameter:Dynamic):Int;\n\n\t@:cffi private static function lime_curl_multi_wait(multi_handle:CFFIPointer, timeout_ms:Int):Int;\n\t#else\n\tprivate static var lime_curl_getdate = new cpp.Callable<String->Float->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_getdate\", \"sdd\", false));\n\tprivate static var lime_curl_global_cleanup = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_global_cleanup\", \"v\", false));\n\tprivate static var lime_curl_global_init = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_global_init\", \"ii\", false));\n\tprivate static var lime_curl_version = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_version\", \"o\", false));\n\tprivate static var lime_curl_version_info = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_version_info\", \"io\", false));\n\tprivate static var lime_curl_easy_cleanup = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_cleanup\", \"ov\", false));\n\tprivate static var lime_curl_easy_duphandle = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_duphandle\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_curl_easy_escape = new cpp.Callable<cpp.Object->String->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_escape\",\n\t\t\"osio\", false));\n\tprivate static var lime_curl_easy_flush = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_flush\", \"ov\", false));\n\tprivate static var lime_curl_easy_getinfo = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_getinfo\", \"oio\",\n\t\tfalse));\n\tprivate static var lime_curl_easy_init = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_init\", \"o\", false));\n\tprivate static var lime_curl_easy_pause = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_pause\", \"oii\", false));\n\tprivate static var lime_curl_easy_perform = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_perform\", \"oi\", false));\n\tprivate static var lime_curl_easy_recv = new cpp.Callable<cpp.Object->cpp.Object->Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_recv\",\n\t\t\"ooiii\", false));\n\tprivate static var lime_curl_easy_reset = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_reset\", \"ov\", false));\n\tprivate static var lime_curl_easy_send = new cpp.Callable<cpp.Object->cpp.Object->Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_send\",\n\t\t\"ooiii\", false));\n\tprivate static var lime_curl_easy_setopt = new cpp.Callable<cpp.Object->Int->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_curl_easy_setopt\", \"oiooi\", false));\n\tprivate static var lime_curl_easy_strerror = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_easy_strerror\", \"io\", false));\n\tprivate static var lime_curl_easy_unescape = new cpp.Callable<cpp.Object->String->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_curl_easy_unescape\", \"osiio\", false));\n\tprivate static var lime_curl_multi_init = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_multi_init\", \"o\", false));\n\tprivate static var lime_curl_multi_add_handle = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_curl_multi_add_handle\", \"oooi\", false));\n\tprivate static var lime_curl_multi_get_running_handles = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_curl_multi_get_running_handles\", \"oi\", false));\n\tprivate static var lime_curl_multi_info_read = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_multi_info_read\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_curl_multi_perform = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_multi_perform\", \"oi\", false));\n\tprivate static var lime_curl_multi_remove_handle = new cpp.Callable<cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_curl_multi_remove_handle\", \"ooi\", false));\n\tprivate static var lime_curl_multi_setopt = new cpp.Callable<cpp.Object->Int->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_multi_setopt\",\n\t\t\"oioi\", false));\n\tprivate static var lime_curl_multi_wait = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_curl_multi_wait\", \"oii\", false));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_curl_getdate = CFFI.load(\"lime\", \"lime_curl_getdate\", 2);\n\tprivate static var lime_curl_global_cleanup = CFFI.load(\"lime\", \"lime_curl_global_cleanup\", 0);\n\tprivate static var lime_curl_global_init = CFFI.load(\"lime\", \"lime_curl_global_init\", 1);\n\tprivate static var lime_curl_version = CFFI.load(\"lime\", \"lime_curl_version\", 0);\n\tprivate static var lime_curl_version_info = CFFI.load(\"lime\", \"lime_curl_version_info\", 1);\n\tprivate static var lime_curl_easy_cleanup = CFFI.load(\"lime\", \"lime_curl_easy_cleanup\", 1);\n\tprivate static var lime_curl_easy_duphandle = CFFI.load(\"lime\", \"lime_curl_easy_duphandle\", 1);\n\tprivate static var lime_curl_easy_escape = CFFI.load(\"lime\", \"lime_curl_easy_escape\", 3);\n\tprivate static var lime_curl_easy_flush = CFFI.load(\"lime\", \"lime_curl_easy_flush\", 1);\n\tprivate static var lime_curl_easy_getinfo = CFFI.load(\"lime\", \"lime_curl_easy_getinfo\", 2);\n\tprivate static var lime_curl_easy_init = CFFI.load(\"lime\", \"lime_curl_easy_init\", 0);\n\tprivate static var lime_curl_easy_pause = CFFI.load(\"lime\", \"lime_curl_easy_pause\", 2);\n\tprivate static var lime_curl_easy_perform = CFFI.load(\"lime\", \"lime_curl_easy_perform\", 1);\n\tprivate static var lime_curl_easy_recv = CFFI.load(\"lime\", \"lime_curl_easy_recv\", 4);\n\tprivate static var lime_curl_easy_reset = CFFI.load(\"lime\", \"lime_curl_easy_reset\", 1);\n\tprivate static var lime_curl_easy_send = CFFI.load(\"lime\", \"lime_curl_easy_send\", 4);\n\tprivate static var lime_curl_easy_setopt = CFFI.load(\"lime\", \"lime_curl_easy_setopt\", 4);\n\tprivate static var lime_curl_easy_strerror = CFFI.load(\"lime\", \"lime_curl_easy_strerror\", 1);\n\tprivate static var lime_curl_easy_unescape = CFFI.load(\"lime\", \"lime_curl_easy_unescape\", 4);\n\tprivate static var lime_curl_multi_init = CFFI.load(\"lime\", \"lime_curl_multi_init\", 0);\n\tprivate static var lime_curl_multi_add_handle = CFFI.load(\"lime\", \"lime_curl_multi_add_handle\", 3);\n\tprivate static var lime_curl_multi_get_running_handles = CFFI.load(\"lime\", \"lime_curl_multi_get_running_handles\", 1);\n\tprivate static var lime_curl_multi_info_read = CFFI.load(\"lime\", \"lime_curl_multi_info_read\", 1);\n\tprivate static var lime_curl_multi_perform = CFFI.load(\"lime\", \"lime_curl_multi_perform\", 1);\n\tprivate static var lime_curl_multi_remove_handle = CFFI.load(\"lime\", \"lime_curl_multi_remove_handle\", 2);\n\tprivate static var lime_curl_multi_setopt = CFFI.load(\"lime\", \"lime_curl_multi_setopt\", 3);\n\tprivate static var lime_curl_multi_wait = CFFI.load(\"lime\", \"lime_curl_multi_wait\", 2);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_curl_getdate\") private static function lime_curl_getdate(date:String, now:Float):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_global_cleanup\") private static function lime_curl_global_cleanup():Void {}\n\n\t@:hlNative(\"lime\", \"hl_curl_global_init\") private static function lime_curl_global_init(flags:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_version\") private static function lime_curl_version():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_version_info\") private static function lime_curl_version_info(type:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_cleanup\") private static function lime_curl_easy_cleanup(handle:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_duphandle\") private static function lime_curl_easy_duphandle(handle:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_escape\") private static function lime_curl_easy_escape(curl:CFFIPointer, url:String, length:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_flush\") private static function lime_curl_easy_flush(curl:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_getinfo\") private static function lime_curl_easy_getinfo(curl:CFFIPointer, info:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_init\") private static function lime_curl_easy_init():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_pause\") private static function lime_curl_easy_pause(handle:CFFIPointer, bitmask:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_perform\") private static function lime_curl_easy_perform(easy_handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_recv\") private static function lime_curl_easy_recv(curl:CFFIPointer, buffer:Float, buflen:Int, n:Int):Int\n\t{\n\t\treturn 0;\n\t};\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_reset\") private static function lime_curl_easy_reset(curl:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_send\") private static function lime_curl_easy_send(curl:CFFIPointer, buffer:Float, buflen:Int, n:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_setopt\") private static function lime_curl_easy_setopt(handle:CFFIPointer, option:Int, parameter:Dynamic,\n\t\t\twriteBytes:Bytes):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_strerror\") private static function lime_curl_easy_strerror(errornum:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_easy_unescape\") private static function lime_curl_easy_unescape(curl:CFFIPointer, url:String, inlength:Int,\n\t\t\toutlength:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_init\") private static function lime_curl_multi_init():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_add_handle\") private static function lime_curl_multi_add_handle(multi_handle:CFFIPointer, curl_object:Dynamic,\n\t\t\tcurl_handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_get_running_handles\") private static function lime_curl_multi_get_running_handles(multi_handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_info_read\") private static function lime_curl_multi_info_read(multi_handle:CFFIPointer, object:Dynamic):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_perform\") private static function lime_curl_multi_perform(multi_handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_remove_handle\") private static function lime_curl_multi_remove_handle(multi_handle:CFFIPointer,\n\t\t\tcurl_handle:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_setopt\") private static function lime_curl_multi_setopt(multi_handle:CFFIPointer, option:Int, parameter:Dynamic):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_curl_multi_wait\") private static function lime_curl_multi_wait(multi_handle:CFFIPointer, timeout_ms:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && (lime_opengl || lime_opengles))\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_gl_active_texture(texture:Int):Void;\n\n\t@:cffi private static function lime_gl_attach_shader(program:Int, shader:Int):Void;\n\n\t@:cffi private static function lime_gl_begin_query(target:Int, query:Int):Void;\n\n\t@:cffi private static function lime_gl_begin_transform_feedback(primitiveNode:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_attrib_location(program:Int, index:Int, name:String):Void;\n\n\t@:cffi private static function lime_gl_bind_buffer(target:Int, buffer:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_buffer_base(target:Int, index:Int, buffer:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_buffer_range(target:Int, index:Int, buffer:Int, offset:DataPointer, size:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_framebuffer(target:Int, framebuffer:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_renderbuffer(target:Int, renderbuffer:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_sampler(target:Int, sampler:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_texture(target:Int, texture:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_transform_feedback(target:Int, transformFeedback:Int):Void;\n\n\t@:cffi private static function lime_gl_bind_vertex_array(vertexArray:Int):Void;\n\n\t@:cffi private static function lime_gl_blend_color(red:Float32, green:Float32, blue:Float32, alpha:Float32):Void;\n\n\t@:cffi private static function lime_gl_blend_equation(mode:Int):Void;\n\n\t@:cffi private static function lime_gl_blend_equation_separate(modeRGB:Int, modeAlpha:Int):Void;\n\n\t@:cffi private static function lime_gl_blend_func(sfactor:Int, dfactor:Int):Void;\n\n\t@:cffi private static function lime_gl_blend_func_separate(srcRGB:Int, dstRGB:Int, srcAlpha:Int, dstAlpha:Int):Void;\n\n\t@:cffi private static function lime_gl_blit_framebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int, dstY0:Int, dstX1:Int, dstY1:Int, mask:Int,\n\t\tfilter:Int):Void;\n\n\t@:cffi private static function lime_gl_buffer_data(target:Int, size:Int, srcData:DataPointer, usage:Int):Void;\n\n\t@:cffi private static function lime_gl_buffer_sub_data(target:Int, offset:Int, size:Int, srcData:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_check_framebuffer_status(target:Int):Int;\n\n\t@:cffi private static function lime_gl_clear(mask:Int):Void;\n\n\t@:cffi private static function lime_gl_clear_bufferfi(buffer:Int, drawBuffer:Int, depth:Float32, stencil:Int):Void;\n\n\t@:cffi private static function lime_gl_clear_bufferfv(buffer:Int, drawBuffer:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_clear_bufferiv(buffer:Int, drawBuffer:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_clear_bufferuiv(buffer:Int, drawBuffer:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_client_wait_sync(sync:CFFIPointer, flags:Int, timeoutA:Int, timeoutB:Int):Int;\n\n\t@:cffi private static function lime_gl_clear_color(red:Float32, green:Float32, blue:Float32, alpha:Float32):Void;\n\n\t@:cffi private static function lime_gl_clear_depthf(depth:Float32):Void;\n\n\t@:cffi private static function lime_gl_clear_stencil(s:Int):Void;\n\n\t@:cffi private static function lime_gl_color_mask(red:Bool, green:Bool, blue:Bool, alpha:Bool):Void;\n\n\t@:cffi private static function lime_gl_compile_shader(shader:Int):Void;\n\n\t@:cffi private static function lime_gl_compressed_tex_image_2d(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int,\n\t\timageSize:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_compressed_tex_image_3d(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int,\n\t\timageSize:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_compressed_tex_sub_image_2d(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int,\n\t\timageSize:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_compressed_tex_sub_image_3d(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int,\n\t\tdepth:Int, format:Int, imageSize:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_copy_buffer_sub_data(readTarget:Int, writeTarget:Int, readOffset:DataPointer, writeOffset:DataPointer,\n\t\tsize:Int):Void;\n\n\t@:cffi private static function lime_gl_copy_tex_image_2d(target:Int, level:Int, internalformat:Int, x:Int, y:Int, width:Int, height:Int, border:Int):Void;\n\n\t@:cffi private static function lime_gl_copy_tex_sub_image_2d(target:Int, level:Int, xoffset:Int, yoffset:Int, x:Int, y:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_copy_tex_sub_image_3d(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int,\n\t\theight:Int):Void;\n\n\t@:cffi private static function lime_gl_create_buffer():Int;\n\n\t@:cffi private static function lime_gl_create_framebuffer():Int;\n\n\t@:cffi private static function lime_gl_create_program():Int;\n\n\t@:cffi private static function lime_gl_create_query():Int;\n\n\t@:cffi private static function lime_gl_create_renderbuffer():Int;\n\n\t@:cffi private static function lime_gl_create_sampler():Int;\n\n\t@:cffi private static function lime_gl_create_shader(type:Int):Int;\n\n\t@:cffi private static function lime_gl_create_texture():Int;\n\n\t@:cffi private static function lime_gl_create_transform_feedback():Int;\n\n\t@:cffi private static function lime_gl_create_vertex_array():Int;\n\n\t@:cffi private static function lime_gl_cull_face(mode:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_buffer(buffer:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_framebuffer(framebuffer:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_program(program:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_query(query:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_renderbuffer(renderbuffer:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_sampler(sampler:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_shader(shader:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_sync(sync:CFFIPointer):Void;\n\n\t@:cffi private static function lime_gl_delete_texture(texture:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_transform_feedback(transformFeedback:Int):Void;\n\n\t@:cffi private static function lime_gl_delete_vertex_array(vertexArray:Int):Void;\n\n\t@:cffi private static function lime_gl_depth_func(func:Int):Void;\n\n\t@:cffi private static function lime_gl_depth_mask(flag:Bool):Void;\n\n\t@:cffi private static function lime_gl_depth_rangef(zNear:Float32, zFar:Float32):Void;\n\n\t@:cffi private static function lime_gl_detach_shader(program:Int, shader:Int):Void;\n\n\t@:cffi private static function lime_gl_disable(cap:Int):Void;\n\n\t@:cffi private static function lime_gl_disable_vertex_attrib_array(index:Int):Void;\n\n\t@:cffi private static function lime_gl_draw_arrays(mode:Int, first:Int, count:Int):Void;\n\n\t@:cffi private static function lime_gl_draw_arrays_instanced(mode:Int, first:Int, count:Int, instanceCount:Int):Void;\n\n\t@:cffi private static function lime_gl_draw_buffers(buffers:Dynamic):Void;\n\n\t@:cffi private static function lime_gl_draw_elements(mode:Int, count:Int, type:Int, offset:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_draw_elements_instanced(mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void;\n\n\t@:cffi private static function lime_gl_draw_range_elements(mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_enable(cap:Int):Void;\n\n\t@:cffi private static function lime_gl_enable_vertex_attrib_array(index:Int):Void;\n\n\t@:cffi private static function lime_gl_end_query(target:Int):Void;\n\n\t@:cffi private static function lime_gl_end_transform_feedback():Void;\n\n\t@:cffi private static function lime_gl_fence_sync(condition:Int, flags:Int):CFFIPointer;\n\n\t@:cffi private static function lime_gl_finish():Void;\n\n\t@:cffi private static function lime_gl_flush():Void;\n\n\t@:cffi private static function lime_gl_framebuffer_renderbuffer(target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:Int):Void;\n\n\t@:cffi private static function lime_gl_framebuffer_texture2D(target:Int, attachment:Int, textarget:Int, texture:Int, level:Int):Void;\n\n\t@:cffi private static function lime_gl_framebuffer_texture_layer(target:Int, attachment:Int, texture:Int, level:Int, layer:Int):Void;\n\n\t@:cffi private static function lime_gl_front_face(mode:Int):Void;\n\n\t@:cffi private static function lime_gl_generate_mipmap(target:Int):Void;\n\n\t@:cffi private static function lime_gl_get_active_attrib(program:Int, index:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_active_uniform(program:Int, index:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_active_uniform_blocki(program:Int, uniformBlockIndex:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_active_uniform_blockiv(program:Int, uniformBlockIndex:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_active_uniform_block_name(program:Int, uniformBlockIndex:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_active_uniformsiv(program:Int, uniformIndices:Dynamic, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_attached_shaders(program:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_attrib_location(program:Int, name:String):Int;\n\n\t@:cffi private static function lime_gl_get_boolean(pname:Int):Bool;\n\n\t@:cffi private static function lime_gl_get_booleanv(pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_buffer_parameteri(target:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_buffer_parameteri64v(target:Int, index:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_buffer_parameteriv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_buffer_pointerv(target:Int, pname:Int):DataPointer;\n\n\t@:cffi private static function lime_gl_get_buffer_sub_data(target:Int, offset:DataPointer, size:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_context_attributes():Dynamic;\n\n\t@:cffi private static function lime_gl_get_error():Int;\n\n\t@:cffi private static function lime_gl_get_extension(name:String):Dynamic;\n\n\t@:cffi private static function lime_gl_get_float(pname:Int):Float32;\n\n\t@:cffi private static function lime_gl_get_floatv(pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_frag_data_location(program:Int, name:String):Int;\n\n\t@:cffi private static function lime_gl_get_framebuffer_attachment_parameteri(target:Int, attachment:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_framebuffer_attachment_parameteriv(target:Int, attachment:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_integer(pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_integer64v(pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_integer64i_v(pname:Int, index:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_integerv(pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_integeri_v(pname:Int, index:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_internalformativ(target:Int, internalformat:Int, pname:Int, bufSize:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_program_binary(program:Int, binaryFormat:Int, bytes:Dynamic):Void;\n\n\t@:cffi private static function lime_gl_get_program_info_log(program:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_programi(program:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_programiv(program:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_queryi(target:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_queryiv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_query_objectui(target:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_query_objectuiv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_renderbuffer_parameteri(target:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_renderbuffer_parameteriv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_sampler_parameterf(target:Int, pname:Int):Float32;\n\n\t@:cffi private static function lime_gl_get_sampler_parameterfv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_sampler_parameteri(target:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_sampler_parameteriv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_shader_info_log(shader:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_shaderi(shader:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_shaderiv(shader:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_shader_precision_format(shadertype:Int, precisiontype:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_shader_source(shader:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_string(pname:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_stringi(pname:Int, index:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_sync_parameteri(sync:CFFIPointer, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_sync_parameteriv(sync:CFFIPointer, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_tex_parameterf(target:Int, pname:Int):Float32;\n\n\t@:cffi private static function lime_gl_get_tex_parameterfv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_tex_parameteri(target:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_tex_parameteriv(target:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_transform_feedback_varying(program:Int, index:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_get_uniformf(program:Int, location:Int):Float32;\n\n\t@:cffi private static function lime_gl_get_uniformfv(program:Int, location:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_uniformi(program:Int, location:Int):Int;\n\n\t@:cffi private static function lime_gl_get_uniformiv(program:Int, location:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_uniformui(program:Int, location:Int):Int;\n\n\t@:cffi private static function lime_gl_get_uniformuiv(program:Int, location:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_uniform_block_index(program:Int, uniformBlockName:String):Int;\n\n\t@:cffi private static function lime_gl_get_uniform_location(program:Int, name:String):Int;\n\n\t@:cffi private static function lime_gl_get_vertex_attribf(index:Int, pname:Int):Float32;\n\n\t@:cffi private static function lime_gl_get_vertex_attribfv(index:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_vertex_attribi(index:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_vertex_attribiv(index:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_vertex_attribii(index:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_vertex_attribiiv(index:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_vertex_attribiui(index:Int, pname:Int):Int;\n\n\t@:cffi private static function lime_gl_get_vertex_attribiuiv(index:Int, pname:Int, params:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_get_vertex_attrib_pointerv(index:Int, pname:Int):DataPointer;\n\n\t@:cffi private static function lime_gl_hint(target:Int, mode:Int):Void;\n\n\t@:cffi private static function lime_gl_invalidate_framebuffer(target:Int, attachments:Dynamic):Void;\n\n\t@:cffi private static function lime_gl_invalidate_sub_framebuffer(target:Int, attachments:Dynamic, x:Int, y:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_is_buffer(buffer:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_enabled(cap:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_framebuffer(framebuffer:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_program(program:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_query(query:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_renderbuffer(renderbuffer:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_sampler(sampler:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_shader(shader:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_sync(sync:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_gl_is_texture(texture:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_transform_feedback(transformFeedback:Int):Bool;\n\n\t@:cffi private static function lime_gl_is_vertex_array(vertexArray:Int):Bool;\n\n\t@:cffi private static function lime_gl_line_width(width:Float32):Void;\n\n\t@:cffi private static function lime_gl_link_program(program:Int):Void;\n\n\t@:cffi private static function lime_gl_map_buffer_range(target:Int, offset:DataPointer, length:Int, access:Int):DataPointer;\n\n\t@:cffi private static function lime_gl_object_deregister(object:Dynamic):Void;\n\n\t@:cffi private static function lime_gl_object_from_id(id:Int, type:Int):Dynamic;\n\n\t@:cffi private static function lime_gl_object_register(id:Int, type:Int, object:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_gl_pause_transform_feedback():Void;\n\n\t@:cffi private static function lime_gl_pixel_storei(pname:Int, param:Int):Void;\n\n\t@:cffi private static function lime_gl_polygon_offset(factor:Float32, units:Float32):Void;\n\n\t@:cffi private static function lime_gl_program_binary(program:Int, binaryFormat:Int, binary:DataPointer, length:Int):Void;\n\n\t@:cffi private static function lime_gl_program_parameteri(program:Int, pname:Int, value:Int):Void;\n\n\t@:cffi private static function lime_gl_read_buffer(src:Int):Void;\n\n\t@:cffi private static function lime_gl_read_pixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_release_shader_compiler():Void;\n\n\t@:cffi private static function lime_gl_renderbuffer_storage(target:Int, internalformat:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_renderbuffer_storage_multisample(target:Int, samples:Int, internalformat:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_resume_transform_feedback():Void;\n\n\t@:cffi private static function lime_gl_sample_coverage(value:Float32, invert:Bool):Void;\n\n\t@:cffi private static function lime_gl_sampler_parameterf(sampler:Int, pname:Int, param:Float32):Void;\n\n\t@:cffi private static function lime_gl_sampler_parameteri(sampler:Int, pname:Int, param:Int):Void;\n\n\t@:cffi private static function lime_gl_scissor(x:Int, y:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_shader_binary(shaders:Dynamic, binaryformat:Int, binary:DataPointer, length:Int):Void;\n\n\t@:cffi private static function lime_gl_shader_source(shader:Int, source:String):Void;\n\n\t@:cffi private static function lime_gl_stencil_func(func:Int, ref:Int, mask:Int):Void;\n\n\t@:cffi private static function lime_gl_stencil_func_separate(face:Int, func:Int, ref:Int, mask:Int):Void;\n\n\t@:cffi private static function lime_gl_stencil_mask(mask:Int):Void;\n\n\t@:cffi private static function lime_gl_stencil_mask_separate(face:Int, mask:Int):Void;\n\n\t@:cffi private static function lime_gl_stencil_op(fail:Int, zfail:Int, zpass:Int):Void;\n\n\t@:cffi private static function lime_gl_stencil_op_separate(face:Int, fail:Int, zfail:Int, zpass:Int):Void;\n\n\t@:cffi private static function lime_gl_tex_image_2d(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\tdata:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_tex_image_3d(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int,\n\t\ttype:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_tex_parameterf(target:Int, pname:Int, param:Float32):Void;\n\n\t@:cffi private static function lime_gl_tex_parameteri(target:Int, pname:Int, param:Int):Void;\n\n\t@:cffi private static function lime_gl_tex_storage_2d(target:Int, level:Int, internalformat:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_tex_storage_3d(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void;\n\n\t@:cffi private static function lime_gl_tex_sub_image_2d(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int,\n\t\tdata:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_tex_sub_image_3d(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int,\n\t\tformat:Int, type:Int, data:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_transform_feedback_varyings(program:Int, varyings:Dynamic, bufferMode:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform1f(location:Int, v0:Float32):Void;\n\n\t@:cffi private static function lime_gl_uniform1fv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform1i(location:Int, v0:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform1iv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform1ui(location:Int, v0:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform1uiv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform2f(location:Int, v0:Float32, v1:Float32):Void;\n\n\t@:cffi private static function lime_gl_uniform2fv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform2i(location:Int, v0:Int, v1:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform2iv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform2ui(location:Int, v0:Int, v1:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform2uiv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform3f(location:Int, v0:Float32, v1:Float32, v2:Float32):Void;\n\n\t@:cffi private static function lime_gl_uniform3fv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform3i(location:Int, v0:Int, v1:Int, v2:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform3iv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform3ui(location:Int, v0:Int, v1:Int, v2:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform3uiv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform4f(location:Int, v0:Float32, v1:Float32, v2:Float32, v3:Float32):Void;\n\n\t@:cffi private static function lime_gl_uniform4fv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform4i(location:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform4iv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform4ui(location:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform4uiv(location:Int, count:Int, v:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_block_binding(program:Int, uniformBlockIndex:Int, uniformBlockBinding:Int):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix2fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix2x3fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix2x4fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix3fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix3x2fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix3x4fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix4fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix4x2fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_uniform_matrix4x3fv(location:Int, count:Int, transpose:Bool, value:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_unmap_buffer(target:Int):Bool;\n\n\t@:cffi private static function lime_gl_use_program(program:Int):Void;\n\n\t@:cffi private static function lime_gl_validate_program(program:Int):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib1f(indx:Int, v0:Float32):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib1fv(indx:Int, values:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib2f(indx:Int, v0:Float32, v1:Float32):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib2fv(indx:Int, values:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib3f(indx:Int, v0:Float32, v1:Float32, v2:Float32):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib3fv(indx:Int, values:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib4f(indx:Int, v0:Float32, v1:Float32, v2:Float32, v3:Float32):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib4fv(indx:Int, values:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attribi4i(indx:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\n\t@:cffi private static function lime_gl_vertex_attribi4iv(indx:Int, values:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attribi4ui(indx:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void;\n\n\t@:cffi private static function lime_gl_vertex_attribi4uiv(indx:Int, values:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib_divisor(indx:Int, divisor:Int):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib_ipointer(indx:Int, size:Int, type:Int, stride:Int, offset:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_vertex_attrib_pointer(indx:Int, size:Int, type:Int, normalized:Bool, stride:Int, offset:DataPointer):Void;\n\n\t@:cffi private static function lime_gl_viewport(x:Int, y:Int, width:Int, height:Int):Void;\n\n\t@:cffi private static function lime_gl_wait_sync(sync:CFFIPointer, flags:Int, timeoutA:Int, timeoutB:Int):Void;\n\t#else\n\tprivate static var lime_gl_active_texture = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_active_texture\", \"iv\", false));\n\tprivate static var lime_gl_attach_shader = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_attach_shader\", \"iiv\", false));\n\tprivate static var lime_gl_begin_query = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_begin_query\", \"iiv\", false));\n\tprivate static var lime_gl_begin_transform_feedback = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_begin_transform_feedback\",\n\t\t\"iv\", false));\n\tprivate static var lime_gl_bind_attrib_location = new cpp.Callable<Int->Int->String->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_bind_attrib_location\", \"iisv\", false));\n\tprivate static var lime_gl_bind_buffer = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_buffer\", \"iiv\", false));\n\tprivate static var lime_gl_bind_buffer_base = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_buffer_base\", \"iiiv\",\n\t\tfalse));\n\tprivate static var lime_gl_bind_buffer_range = new cpp.Callable<Int->Int->Int->lime.utils.DataPointer->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_bind_buffer_range\", \"iiidiv\", false));\n\tprivate static var lime_gl_bind_framebuffer = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_framebuffer\", \"iiv\", false));\n\tprivate static var lime_gl_bind_renderbuffer = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_renderbuffer\", \"iiv\",\n\t\tfalse));\n\tprivate static var lime_gl_bind_sampler = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_sampler\", \"iiv\", false));\n\tprivate static var lime_gl_bind_texture = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_texture\", \"iiv\", false));\n\tprivate static var lime_gl_bind_transform_feedback = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_transform_feedback\",\n\t\t\"iiv\", false));\n\tprivate static var lime_gl_bind_vertex_array = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_bind_vertex_array\", \"iv\", false));\n\tprivate static var lime_gl_blend_color = new cpp.Callable<cpp.Float32->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_blend_color\", \"ffffv\", false));\n\tprivate static var lime_gl_blend_equation = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_blend_equation\", \"iv\", false));\n\tprivate static var lime_gl_blend_equation_separate = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_blend_equation_separate\",\n\t\t\"iiv\", false));\n\tprivate static var lime_gl_blend_func = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_blend_func\", \"iiv\", false));\n\tprivate static var lime_gl_blend_func_separate = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_blend_func_separate\", \"iiiiv\", false));\n\tprivate static var lime_gl_blit_framebuffer = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_blit_framebuffer\", \"iiiiiiiiiiv\", false));\n\tprivate static var lime_gl_buffer_data = new cpp.Callable<Int->Int->lime.utils.DataPointer->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_buffer_data\", \"iidiv\", false));\n\tprivate static var lime_gl_buffer_sub_data = new cpp.Callable<Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_buffer_sub_data\", \"iiidv\", false));\n\tprivate static var lime_gl_check_framebuffer_status = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_check_framebuffer_status\", \"ii\",\n\t\tfalse));\n\tprivate static var lime_gl_clear = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_clear\", \"iv\", false));\n\tprivate static var lime_gl_clear_bufferfi = new cpp.Callable<Int->Int->cpp.Float32->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_clear_bufferfi\",\n\t\t\"iifiv\", false));\n\tprivate static var lime_gl_clear_bufferfv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_clear_bufferfv\", \"iidv\", false));\n\tprivate static var lime_gl_clear_bufferiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_clear_bufferiv\", \"iidv\", false));\n\tprivate static var lime_gl_clear_bufferuiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_clear_bufferuiv\", \"iidv\", false));\n\tprivate static var lime_gl_client_wait_sync = new cpp.Callable<cpp.Object->Int->Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_client_wait_sync\",\n\t\t\"oiiii\", false));\n\tprivate static var lime_gl_clear_color = new cpp.Callable<cpp.Float32->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_clear_color\", \"ffffv\", false));\n\tprivate static var lime_gl_clear_depthf = new cpp.Callable<cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_clear_depthf\", \"fv\", false));\n\tprivate static var lime_gl_clear_stencil = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_clear_stencil\", \"iv\", false));\n\tprivate static var lime_gl_color_mask = new cpp.Callable<Bool->Bool->Bool->Bool->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_color_mask\", \"bbbbv\",\n\t\tfalse));\n\tprivate static var lime_gl_compile_shader = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_compile_shader\", \"iv\", false));\n\tprivate static var lime_gl_compressed_tex_image_2d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_compressed_tex_image_2d\", \"iiiiiiidv\", false));\n\tprivate static var lime_gl_compressed_tex_image_3d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_compressed_tex_image_3d\", \"iiiiiiiidv\", false));\n\tprivate static var lime_gl_compressed_tex_sub_image_2d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_compressed_tex_sub_image_2d\", \"iiiiiiiidv\", false));\n\tprivate static var lime_gl_compressed_tex_sub_image_3d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_compressed_tex_sub_image_3d\", \"iiiiiiiiiidv\", false));\n\tprivate static var lime_gl_copy_buffer_sub_data = new cpp.Callable<Int->Int->lime.utils.DataPointer->lime.utils.DataPointer->Int->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_copy_buffer_sub_data\", \"iiddiv\", false));\n\tprivate static var lime_gl_copy_tex_image_2d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_copy_tex_image_2d\", \"iiiiiiiiv\", false));\n\tprivate static var lime_gl_copy_tex_sub_image_2d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_copy_tex_sub_image_2d\", \"iiiiiiiiv\", false));\n\tprivate static var lime_gl_copy_tex_sub_image_3d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_copy_tex_sub_image_3d\", \"iiiiiiiiiv\", false));\n\tprivate static var lime_gl_create_buffer = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_buffer\", \"i\", false));\n\tprivate static var lime_gl_create_framebuffer = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_framebuffer\", \"i\", false));\n\tprivate static var lime_gl_create_program = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_program\", \"i\", false));\n\tprivate static var lime_gl_create_query = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_query\", \"i\", false));\n\tprivate static var lime_gl_create_renderbuffer = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_renderbuffer\", \"i\", false));\n\tprivate static var lime_gl_create_sampler = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_sampler\", \"i\", false));\n\tprivate static var lime_gl_create_shader = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_shader\", \"ii\", false));\n\tprivate static var lime_gl_create_texture = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_texture\", \"i\", false));\n\tprivate static var lime_gl_create_transform_feedback = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_transform_feedback\", \"i\",\n\t\tfalse));\n\tprivate static var lime_gl_create_vertex_array = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_create_vertex_array\", \"i\", false));\n\tprivate static var lime_gl_cull_face = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_cull_face\", \"iv\", false));\n\tprivate static var lime_gl_delete_buffer = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_buffer\", \"iv\", false));\n\tprivate static var lime_gl_delete_framebuffer = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_framebuffer\", \"iv\", false));\n\tprivate static var lime_gl_delete_program = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_program\", \"iv\", false));\n\tprivate static var lime_gl_delete_query = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_query\", \"iv\", false));\n\tprivate static var lime_gl_delete_renderbuffer = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_renderbuffer\", \"iv\", false));\n\tprivate static var lime_gl_delete_sampler = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_sampler\", \"iv\", false));\n\tprivate static var lime_gl_delete_shader = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_shader\", \"iv\", false));\n\tprivate static var lime_gl_delete_sync = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_sync\", \"ov\", false));\n\tprivate static var lime_gl_delete_texture = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_texture\", \"iv\", false));\n\tprivate static var lime_gl_delete_transform_feedback = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_transform_feedback\",\n\t\t\"iv\", false));\n\tprivate static var lime_gl_delete_vertex_array = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_delete_vertex_array\", \"iv\", false));\n\tprivate static var lime_gl_depth_func = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_depth_func\", \"iv\", false));\n\tprivate static var lime_gl_depth_mask = new cpp.Callable<Bool->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_depth_mask\", \"bv\", false));\n\tprivate static var lime_gl_depth_rangef = new cpp.Callable<cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_depth_rangef\", \"ffv\",\n\t\tfalse));\n\tprivate static var lime_gl_detach_shader = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_detach_shader\", \"iiv\", false));\n\tprivate static var lime_gl_disable = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_disable\", \"iv\", false));\n\tprivate static var lime_gl_disable_vertex_attrib_array = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_disable_vertex_attrib_array\", \"iv\", false));\n\tprivate static var lime_gl_draw_arrays = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_draw_arrays\", \"iiiv\", false));\n\tprivate static var lime_gl_draw_arrays_instanced = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_draw_arrays_instanced\", \"iiiiv\", false));\n\tprivate static var lime_gl_draw_buffers = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_draw_buffers\", \"ov\", false));\n\tprivate static var lime_gl_draw_elements = new cpp.Callable<Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_draw_elements\", \"iiidv\", false));\n\tprivate static var lime_gl_draw_elements_instanced = new cpp.Callable<Int->Int->Int->lime.utils.DataPointer->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_draw_elements_instanced\", \"iiidiv\", false));\n\tprivate static var lime_gl_draw_range_elements = new cpp.Callable<Int->Int->Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_draw_range_elements\", \"iiiiidv\", false));\n\tprivate static var lime_gl_enable = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_enable\", \"iv\", false));\n\tprivate static var lime_gl_enable_vertex_attrib_array = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_enable_vertex_attrib_array\",\n\t\t\"iv\", false));\n\tprivate static var lime_gl_end_query = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_end_query\", \"iv\", false));\n\tprivate static var lime_gl_end_transform_feedback = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_end_transform_feedback\", \"v\",\n\t\tfalse));\n\tprivate static var lime_gl_fence_sync = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_fence_sync\", \"iio\", false));\n\tprivate static var lime_gl_finish = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_finish\", \"v\", false));\n\tprivate static var lime_gl_flush = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_flush\", \"v\", false));\n\tprivate static var lime_gl_framebuffer_renderbuffer = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_framebuffer_renderbuffer\", \"iiiiv\", false));\n\tprivate static var lime_gl_framebuffer_texture2D = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_framebuffer_texture2D\", \"iiiiiv\", false));\n\tprivate static var lime_gl_framebuffer_texture_layer = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_framebuffer_texture_layer\", \"iiiiiv\", false));\n\tprivate static var lime_gl_front_face = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_front_face\", \"iv\", false));\n\tprivate static var lime_gl_generate_mipmap = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_generate_mipmap\", \"iv\", false));\n\tprivate static var lime_gl_get_active_attrib = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_active_attrib\", \"iio\",\n\t\tfalse));\n\tprivate static var lime_gl_get_active_uniform = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_active_uniform\", \"iio\",\n\t\tfalse));\n\tprivate static var lime_gl_get_active_uniform_blocki = new cpp.Callable<Int->Int->Int->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_active_uniform_blocki\", \"iiii\", false));\n\tprivate static var lime_gl_get_active_uniform_blockiv = new cpp.Callable<Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_active_uniform_blockiv\", \"iiidv\", false));\n\tprivate static var lime_gl_get_active_uniform_block_name = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_active_uniform_block_name\", \"iio\", false));\n\tprivate static var lime_gl_get_active_uniformsiv = new cpp.Callable<Int->cpp.Object->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_active_uniformsiv\", \"ioidv\", false));\n\tprivate static var lime_gl_get_attached_shaders = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_attached_shaders\", \"io\",\n\t\tfalse));\n\tprivate static var lime_gl_get_attrib_location = new cpp.Callable<Int->String->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_attrib_location\", \"isi\",\n\t\tfalse));\n\tprivate static var lime_gl_get_boolean = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_boolean\", \"ib\", false));\n\tprivate static var lime_gl_get_booleanv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_booleanv\",\n\t\t\"idv\", false));\n\tprivate static var lime_gl_get_buffer_parameteri = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_buffer_parameteri\", \"iii\",\n\t\tfalse));\n\tprivate static var lime_gl_get_buffer_parameteri64v = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_buffer_parameteri64v\", \"iidv\", false));\n\tprivate static var lime_gl_get_buffer_parameteriv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_buffer_parameteriv\", \"iidv\", false));\n\tprivate static var lime_gl_get_buffer_pointerv = new cpp.Callable<Int->Int->lime.utils.DataPointer>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_buffer_pointerv\", \"iid\", false));\n\tprivate static var lime_gl_get_buffer_sub_data = new cpp.Callable<Int->lime.utils.DataPointer->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_buffer_sub_data\", \"ididv\", false));\n\tprivate static var lime_gl_get_context_attributes = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_context_attributes\", \"o\",\n\t\tfalse));\n\tprivate static var lime_gl_get_error = new cpp.Callable<Void->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_error\", \"i\", false));\n\tprivate static var lime_gl_get_extension = new cpp.Callable<String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_extension\", \"so\", false));\n\tprivate static var lime_gl_get_float = new cpp.Callable<Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_float\", \"if\", false));\n\tprivate static var lime_gl_get_floatv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_floatv\", \"idv\",\n\t\tfalse));\n\tprivate static var lime_gl_get_frag_data_location = new cpp.Callable<Int->String->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_frag_data_location\",\n\t\t\"isi\", false));\n\tprivate static var lime_gl_get_framebuffer_attachment_parameteri = new cpp.Callable<Int->Int->Int->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_framebuffer_attachment_parameteri\", \"iiii\", false));\n\tprivate static var lime_gl_get_framebuffer_attachment_parameteriv = new cpp.Callable<Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_framebuffer_attachment_parameteriv\", \"iiidv\", false));\n\tprivate static var lime_gl_get_integer = new cpp.Callable<Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_integer\", \"ii\", false));\n\tprivate static var lime_gl_get_integer64v = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_integer64v\",\n\t\t\"idv\", false));\n\tprivate static var lime_gl_get_integer64i_v = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_integer64i_v\", \"iidv\", false));\n\tprivate static var lime_gl_get_integerv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_integerv\",\n\t\t\"idv\", false));\n\tprivate static var lime_gl_get_integeri_v = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_integeri_v\", \"iidv\", false));\n\tprivate static var lime_gl_get_internalformativ = new cpp.Callable<Int->Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_internalformativ\", \"iiiidv\", false));\n\tprivate static var lime_gl_get_program_binary = new cpp.Callable<Int->Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_program_binary\", \"iiov\", false));\n\tprivate static var lime_gl_get_program_info_log = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_program_info_log\", \"io\",\n\t\tfalse));\n\tprivate static var lime_gl_get_programi = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_programi\", \"iii\", false));\n\tprivate static var lime_gl_get_programiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_programiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_queryi = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_queryi\", \"iii\", false));\n\tprivate static var lime_gl_get_queryiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_queryiv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_get_query_objectui = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_query_objectui\", \"iii\", false));\n\tprivate static var lime_gl_get_query_objectuiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_query_objectuiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_renderbuffer_parameteri = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_renderbuffer_parameteri\", \"iii\", false));\n\tprivate static var lime_gl_get_renderbuffer_parameteriv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_renderbuffer_parameteriv\", \"iidv\", false));\n\tprivate static var lime_gl_get_sampler_parameterf = new cpp.Callable<Int->Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_sampler_parameterf\",\n\t\t\"iif\", false));\n\tprivate static var lime_gl_get_sampler_parameterfv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_sampler_parameterfv\", \"iidv\", false));\n\tprivate static var lime_gl_get_sampler_parameteri = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_sampler_parameteri\", \"iii\",\n\t\tfalse));\n\tprivate static var lime_gl_get_sampler_parameteriv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_sampler_parameteriv\", \"iidv\", false));\n\tprivate static var lime_gl_get_shader_info_log = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_shader_info_log\", \"io\",\n\t\tfalse));\n\tprivate static var lime_gl_get_shaderi = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_shaderi\", \"iii\", false));\n\tprivate static var lime_gl_get_shaderiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_shaderiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_shader_precision_format = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_shader_precision_format\", \"iio\", false));\n\tprivate static var lime_gl_get_shader_source = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_shader_source\", \"io\", false));\n\tprivate static var lime_gl_get_string = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_string\", \"io\", false));\n\tprivate static var lime_gl_get_stringi = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_stringi\", \"iio\", false));\n\tprivate static var lime_gl_get_sync_parameteri = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_sync_parameteri\", \"oii\",\n\t\tfalse));\n\tprivate static var lime_gl_get_sync_parameteriv = new cpp.Callable<cpp.Object->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_sync_parameteriv\", \"oidv\", false));\n\tprivate static var lime_gl_get_tex_parameterf = new cpp.Callable<Int->Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_tex_parameterf\", \"iif\",\n\t\tfalse));\n\tprivate static var lime_gl_get_tex_parameterfv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_tex_parameterfv\", \"iidv\", false));\n\tprivate static var lime_gl_get_tex_parameteri = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_tex_parameteri\", \"iii\", false));\n\tprivate static var lime_gl_get_tex_parameteriv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_tex_parameteriv\", \"iidv\", false));\n\tprivate static var lime_gl_get_transform_feedback_varying = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_transform_feedback_varying\", \"iio\", false));\n\tprivate static var lime_gl_get_uniformf = new cpp.Callable<Int->Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_uniformf\", \"iif\", false));\n\tprivate static var lime_gl_get_uniformfv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_uniformfv\", \"iidv\", false));\n\tprivate static var lime_gl_get_uniformi = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_uniformi\", \"iii\", false));\n\tprivate static var lime_gl_get_uniformiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_uniformiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_uniformui = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_uniformui\", \"iii\", false));\n\tprivate static var lime_gl_get_uniformuiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_uniformuiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_uniform_block_index = new cpp.Callable<Int->String->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_uniform_block_index\",\n\t\t\"isi\", false));\n\tprivate static var lime_gl_get_uniform_location = new cpp.Callable<Int->String->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_uniform_location\", \"isi\",\n\t\tfalse));\n\tprivate static var lime_gl_get_vertex_attribf = new cpp.Callable<Int->Int->cpp.Float32>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_vertex_attribf\", \"iif\",\n\t\tfalse));\n\tprivate static var lime_gl_get_vertex_attribfv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_vertex_attribfv\", \"iidv\", false));\n\tprivate static var lime_gl_get_vertex_attribi = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_vertex_attribi\", \"iii\", false));\n\tprivate static var lime_gl_get_vertex_attribiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_vertex_attribiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_vertex_attribii = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_vertex_attribii\", \"iii\",\n\t\tfalse));\n\tprivate static var lime_gl_get_vertex_attribiiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_vertex_attribiiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_vertex_attribiui = new cpp.Callable<Int->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_get_vertex_attribiui\", \"iii\",\n\t\tfalse));\n\tprivate static var lime_gl_get_vertex_attribiuiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_vertex_attribiuiv\", \"iidv\", false));\n\tprivate static var lime_gl_get_vertex_attrib_pointerv = new cpp.Callable<Int->Int->lime.utils.DataPointer>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_get_vertex_attrib_pointerv\", \"iid\", false));\n\tprivate static var lime_gl_hint = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_hint\", \"iiv\", false));\n\tprivate static var lime_gl_invalidate_framebuffer = new cpp.Callable<Int->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_invalidate_framebuffer\", \"iov\", false));\n\tprivate static var lime_gl_invalidate_sub_framebuffer = new cpp.Callable<Int->cpp.Object->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_invalidate_sub_framebuffer\", \"ioiiiiv\", false));\n\tprivate static var lime_gl_is_buffer = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_buffer\", \"ib\", false));\n\tprivate static var lime_gl_is_enabled = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_enabled\", \"ib\", false));\n\tprivate static var lime_gl_is_framebuffer = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_framebuffer\", \"ib\", false));\n\tprivate static var lime_gl_is_program = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_program\", \"ib\", false));\n\tprivate static var lime_gl_is_query = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_query\", \"ib\", false));\n\tprivate static var lime_gl_is_renderbuffer = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_renderbuffer\", \"ib\", false));\n\tprivate static var lime_gl_is_sampler = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_sampler\", \"ib\", false));\n\tprivate static var lime_gl_is_shader = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_shader\", \"ib\", false));\n\tprivate static var lime_gl_is_sync = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_sync\", \"ob\", false));\n\tprivate static var lime_gl_is_texture = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_texture\", \"ib\", false));\n\tprivate static var lime_gl_is_transform_feedback = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_transform_feedback\", \"ib\", false));\n\tprivate static var lime_gl_is_vertex_array = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_is_vertex_array\", \"ib\", false));\n\tprivate static var lime_gl_line_width = new cpp.Callable<cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_line_width\", \"fv\", false));\n\tprivate static var lime_gl_link_program = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_link_program\", \"iv\", false));\n\tprivate static var lime_gl_map_buffer_range = new cpp.Callable<Int->lime.utils.DataPointer->Int->Int->lime.utils.DataPointer>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_map_buffer_range\", \"idiid\", false));\n\tprivate static var lime_gl_object_deregister = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_object_deregister\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_gl_object_from_id = new cpp.Callable<Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_object_from_id\", \"iio\", false));\n\tprivate static var lime_gl_object_register = new cpp.Callable<Int->Int->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_object_register\",\n\t\t\"iioo\", false));\n\tprivate static var lime_gl_pause_transform_feedback = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_pause_transform_feedback\",\n\t\t\"v\", false));\n\tprivate static var lime_gl_pixel_storei = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_pixel_storei\", \"iiv\", false));\n\tprivate static var lime_gl_polygon_offset = new cpp.Callable<cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_polygon_offset\",\n\t\t\"ffv\", false));\n\tprivate static var lime_gl_program_binary = new cpp.Callable<Int->Int->lime.utils.DataPointer->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_program_binary\", \"iidiv\", false));\n\tprivate static var lime_gl_program_parameteri = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_program_parameteri\",\n\t\t\"iiiv\", false));\n\tprivate static var lime_gl_read_buffer = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_read_buffer\", \"iv\", false));\n\tprivate static var lime_gl_read_pixels = new cpp.Callable<Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_read_pixels\", \"iiiiiidv\", false));\n\tprivate static var lime_gl_release_shader_compiler = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_release_shader_compiler\", \"v\",\n\t\tfalse));\n\tprivate static var lime_gl_renderbuffer_storage = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_renderbuffer_storage\", \"iiiiv\", false));\n\tprivate static var lime_gl_renderbuffer_storage_multisample = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_renderbuffer_storage_multisample\", \"iiiiiv\", false));\n\tprivate static var lime_gl_resume_transform_feedback = new cpp.Callable<Void->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_resume_transform_feedback\",\n\t\t\"v\", false));\n\tprivate static var lime_gl_sample_coverage = new cpp.Callable<cpp.Float32->Bool->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_sample_coverage\", \"fbv\",\n\t\tfalse));\n\tprivate static var lime_gl_sampler_parameterf = new cpp.Callable<Int->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_sampler_parameterf\", \"iifv\", false));\n\tprivate static var lime_gl_sampler_parameteri = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_sampler_parameteri\",\n\t\t\"iiiv\", false));\n\tprivate static var lime_gl_scissor = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_scissor\", \"iiiiv\", false));\n\tprivate static var lime_gl_shader_binary = new cpp.Callable<cpp.Object->Int->lime.utils.DataPointer->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_shader_binary\", \"oidiv\", false));\n\tprivate static var lime_gl_shader_source = new cpp.Callable<Int->String->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_shader_source\", \"isv\", false));\n\tprivate static var lime_gl_stencil_func = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_stencil_func\", \"iiiv\", false));\n\tprivate static var lime_gl_stencil_func_separate = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_stencil_func_separate\", \"iiiiv\", false));\n\tprivate static var lime_gl_stencil_mask = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_stencil_mask\", \"iv\", false));\n\tprivate static var lime_gl_stencil_mask_separate = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_stencil_mask_separate\",\n\t\t\"iiv\", false));\n\tprivate static var lime_gl_stencil_op = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_stencil_op\", \"iiiv\", false));\n\tprivate static var lime_gl_stencil_op_separate = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_stencil_op_separate\", \"iiiiv\", false));\n\tprivate static var lime_gl_tex_image_2d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_image_2d\", \"iiiiiiiidv\", false));\n\tprivate static var lime_gl_tex_image_3d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_image_3d\", \"iiiiiiiiidv\", false));\n\tprivate static var lime_gl_tex_parameterf = new cpp.Callable<Int->Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_parameterf\",\n\t\t\"iifv\", false));\n\tprivate static var lime_gl_tex_parameteri = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_parameteri\", \"iiiv\",\n\t\tfalse));\n\tprivate static var lime_gl_tex_storage_2d = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_storage_2d\",\n\t\t\"iiiiiv\", false));\n\tprivate static var lime_gl_tex_storage_3d = new cpp.Callable<Int->Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_tex_storage_3d\", \"iiiiiiv\", false));\n\tprivate static var lime_gl_tex_sub_image_2d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_sub_image_2d\", \"iiiiiiiidv\", false));\n\tprivate static var lime_gl_tex_sub_image_3d = new cpp.Callable<Int->Int->Int->Int->Int->Int->Int->Int->Int->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_tex_sub_image_3d\", \"iiiiiiiiiidv\", false));\n\tprivate static var lime_gl_transform_feedback_varyings = new cpp.Callable<Int->cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_transform_feedback_varyings\", \"ioiv\", false));\n\tprivate static var lime_gl_uniform1f = new cpp.Callable<Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform1f\", \"ifv\", false));\n\tprivate static var lime_gl_uniform1fv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform1fv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform1i = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform1i\", \"iiv\", false));\n\tprivate static var lime_gl_uniform1iv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform1iv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform1ui = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform1ui\", \"iiv\", false));\n\tprivate static var lime_gl_uniform1uiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform1uiv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform2f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform2f\", \"iffv\",\n\t\tfalse));\n\tprivate static var lime_gl_uniform2fv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform2fv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform2i = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform2i\", \"iiiv\", false));\n\tprivate static var lime_gl_uniform2iv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform2iv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform2ui = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform2ui\", \"iiiv\", false));\n\tprivate static var lime_gl_uniform2uiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform2uiv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform3f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform3f\", \"ifffv\", false));\n\tprivate static var lime_gl_uniform3fv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform3fv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform3i = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform3i\", \"iiiiv\", false));\n\tprivate static var lime_gl_uniform3iv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform3iv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform3ui = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform3ui\", \"iiiiv\", false));\n\tprivate static var lime_gl_uniform3uiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform3uiv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform4f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform4f\", \"iffffv\", false));\n\tprivate static var lime_gl_uniform4fv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform4fv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform4i = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform4i\", \"iiiiiv\",\n\t\tfalse));\n\tprivate static var lime_gl_uniform4iv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform4iv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform4ui = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform4ui\", \"iiiiiv\",\n\t\tfalse));\n\tprivate static var lime_gl_uniform4uiv = new cpp.Callable<Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform4uiv\",\n\t\t\"iidv\", false));\n\tprivate static var lime_gl_uniform_block_binding = new cpp.Callable<Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_uniform_block_binding\",\n\t\t\"iiiv\", false));\n\tprivate static var lime_gl_uniform_matrix2fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix2fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix2x3fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix2x3fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix2x4fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix2x4fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix3fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix3fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix3x2fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix3x2fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix3x4fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix3x4fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix4fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix4fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix4x2fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix4x2fv\", \"iibdv\", false));\n\tprivate static var lime_gl_uniform_matrix4x3fv = new cpp.Callable<Int->Int->Bool->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_uniform_matrix4x3fv\", \"iibdv\", false));\n\tprivate static var lime_gl_unmap_buffer = new cpp.Callable<Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_unmap_buffer\", \"ib\", false));\n\tprivate static var lime_gl_use_program = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_use_program\", \"iv\", false));\n\tprivate static var lime_gl_validate_program = new cpp.Callable<Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_validate_program\", \"iv\", false));\n\tprivate static var lime_gl_vertex_attrib1f = new cpp.Callable<Int->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_vertex_attrib1f\", \"ifv\",\n\t\tfalse));\n\tprivate static var lime_gl_vertex_attrib1fv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib1fv\", \"idv\", false));\n\tprivate static var lime_gl_vertex_attrib2f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib2f\", \"iffv\", false));\n\tprivate static var lime_gl_vertex_attrib2fv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib2fv\", \"idv\", false));\n\tprivate static var lime_gl_vertex_attrib3f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib3f\", \"ifffv\", false));\n\tprivate static var lime_gl_vertex_attrib3fv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib3fv\", \"idv\", false));\n\tprivate static var lime_gl_vertex_attrib4f = new cpp.Callable<Int->cpp.Float32->cpp.Float32->cpp.Float32->cpp.Float32->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_vertex_attrib4f\", \"iffffv\", false));\n\tprivate static var lime_gl_vertex_attrib4fv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib4fv\", \"idv\", false));\n\tprivate static var lime_gl_vertex_attribi4i = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_vertex_attribi4i\",\n\t\t\"iiiiiv\", false));\n\tprivate static var lime_gl_vertex_attribi4iv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attribi4iv\", \"idv\", false));\n\tprivate static var lime_gl_vertex_attribi4ui = new cpp.Callable<Int->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attribi4ui\", \"iiiiiv\", false));\n\tprivate static var lime_gl_vertex_attribi4uiv = new cpp.Callable<Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attribi4uiv\", \"idv\", false));\n\tprivate static var lime_gl_vertex_attrib_divisor = new cpp.Callable<Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_vertex_attrib_divisor\",\n\t\t\"iiv\", false));\n\tprivate static var lime_gl_vertex_attrib_ipointer = new cpp.Callable<Int->Int->Int->Int->lime.utils.DataPointer->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_gl_vertex_attrib_ipointer\", \"iiiidv\", false));\n\tprivate static var lime_gl_vertex_attrib_pointer = new cpp.Callable<Int->Int->Int->Bool->Int->lime.utils.DataPointer->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_vertex_attrib_pointer\", \"iiibidv\", false));\n\tprivate static var lime_gl_viewport = new cpp.Callable<Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_viewport\", \"iiiiv\", false));\n\tprivate static var lime_gl_wait_sync = new cpp.Callable<cpp.Object->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_gl_wait_sync\", \"oiiiv\",\n\t\tfalse));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_gl_active_texture = CFFI.load(\"lime\", \"lime_gl_active_texture\", 1);\n\tprivate static var lime_gl_attach_shader = CFFI.load(\"lime\", \"lime_gl_attach_shader\", 2);\n\tprivate static var lime_gl_begin_query = CFFI.load(\"lime\", \"lime_gl_begin_query\", 2);\n\tprivate static var lime_gl_begin_transform_feedback = CFFI.load(\"lime\", \"lime_gl_begin_transform_feedback\", 1);\n\tprivate static var lime_gl_bind_attrib_location = CFFI.load(\"lime\", \"lime_gl_bind_attrib_location\", 3);\n\tprivate static var lime_gl_bind_buffer = CFFI.load(\"lime\", \"lime_gl_bind_buffer\", 2);\n\tprivate static var lime_gl_bind_buffer_base = CFFI.load(\"lime\", \"lime_gl_bind_buffer_base\", 3);\n\tprivate static var lime_gl_bind_buffer_range = CFFI.load(\"lime\", \"lime_gl_bind_buffer_range\", 5);\n\tprivate static var lime_gl_bind_framebuffer = CFFI.load(\"lime\", \"lime_gl_bind_framebuffer\", 2);\n\tprivate static var lime_gl_bind_renderbuffer = CFFI.load(\"lime\", \"lime_gl_bind_renderbuffer\", 2);\n\tprivate static var lime_gl_bind_sampler = CFFI.load(\"lime\", \"lime_gl_bind_sampler\", 2);\n\tprivate static var lime_gl_bind_texture = CFFI.load(\"lime\", \"lime_gl_bind_texture\", 2);\n\tprivate static var lime_gl_bind_transform_feedback = CFFI.load(\"lime\", \"lime_gl_bind_transform_feedback\", 2);\n\tprivate static var lime_gl_bind_vertex_array = CFFI.load(\"lime\", \"lime_gl_bind_vertex_array\", 1);\n\tprivate static var lime_gl_blend_color = CFFI.load(\"lime\", \"lime_gl_blend_color\", 4);\n\tprivate static var lime_gl_blend_equation = CFFI.load(\"lime\", \"lime_gl_blend_equation\", 1);\n\tprivate static var lime_gl_blend_equation_separate = CFFI.load(\"lime\", \"lime_gl_blend_equation_separate\", 2);\n\tprivate static var lime_gl_blend_func = CFFI.load(\"lime\", \"lime_gl_blend_func\", 2);\n\tprivate static var lime_gl_blend_func_separate = CFFI.load(\"lime\", \"lime_gl_blend_func_separate\", 4);\n\tprivate static var lime_gl_blit_framebuffer = CFFI.load(\"lime\", \"lime_gl_blit_framebuffer\", -1);\n\tprivate static var lime_gl_buffer_data = CFFI.load(\"lime\", \"lime_gl_buffer_data\", 4);\n\tprivate static var lime_gl_buffer_sub_data = CFFI.load(\"lime\", \"lime_gl_buffer_sub_data\", 4);\n\tprivate static var lime_gl_check_framebuffer_status = CFFI.load(\"lime\", \"lime_gl_check_framebuffer_status\", 1);\n\tprivate static var lime_gl_clear = CFFI.load(\"lime\", \"lime_gl_clear\", 1);\n\tprivate static var lime_gl_clear_bufferfi = CFFI.load(\"lime\", \"lime_gl_clear_bufferfi\", 4);\n\tprivate static var lime_gl_clear_bufferfv = CFFI.load(\"lime\", \"lime_gl_clear_bufferfv\", 3);\n\tprivate static var lime_gl_clear_bufferiv = CFFI.load(\"lime\", \"lime_gl_clear_bufferiv\", 3);\n\tprivate static var lime_gl_clear_bufferuiv = CFFI.load(\"lime\", \"lime_gl_clear_bufferuiv\", 3);\n\tprivate static var lime_gl_client_wait_sync = CFFI.load(\"lime\", \"lime_gl_client_wait_sync\", 4);\n\tprivate static var lime_gl_clear_color = CFFI.load(\"lime\", \"lime_gl_clear_color\", 4);\n\tprivate static var lime_gl_clear_depthf = CFFI.load(\"lime\", \"lime_gl_clear_depthf\", 1);\n\tprivate static var lime_gl_clear_stencil = CFFI.load(\"lime\", \"lime_gl_clear_stencil\", 1);\n\tprivate static var lime_gl_color_mask = CFFI.load(\"lime\", \"lime_gl_color_mask\", 4);\n\tprivate static var lime_gl_compile_shader = CFFI.load(\"lime\", \"lime_gl_compile_shader\", 1);\n\tprivate static var lime_gl_compressed_tex_image_2d = CFFI.load(\"lime\", \"lime_gl_compressed_tex_image_2d\", -1);\n\tprivate static var lime_gl_compressed_tex_image_3d = CFFI.load(\"lime\", \"lime_gl_compressed_tex_image_3d\", -1);\n\tprivate static var lime_gl_compressed_tex_sub_image_2d = CFFI.load(\"lime\", \"lime_gl_compressed_tex_sub_image_2d\", -1);\n\tprivate static var lime_gl_compressed_tex_sub_image_3d = CFFI.load(\"lime\", \"lime_gl_compressed_tex_sub_image_3d\", -1);\n\tprivate static var lime_gl_copy_buffer_sub_data = CFFI.load(\"lime\", \"lime_gl_copy_buffer_sub_data\", 5);\n\tprivate static var lime_gl_copy_tex_image_2d = CFFI.load(\"lime\", \"lime_gl_copy_tex_image_2d\", -1);\n\tprivate static var lime_gl_copy_tex_sub_image_2d = CFFI.load(\"lime\", \"lime_gl_copy_tex_sub_image_2d\", -1);\n\tprivate static var lime_gl_copy_tex_sub_image_3d = CFFI.load(\"lime\", \"lime_gl_copy_tex_sub_image_3d\", -1);\n\tprivate static var lime_gl_create_buffer = CFFI.load(\"lime\", \"lime_gl_create_buffer\", 0);\n\tprivate static var lime_gl_create_framebuffer = CFFI.load(\"lime\", \"lime_gl_create_framebuffer\", 0);\n\tprivate static var lime_gl_create_program = CFFI.load(\"lime\", \"lime_gl_create_program\", 0);\n\tprivate static var lime_gl_create_query = CFFI.load(\"lime\", \"lime_gl_create_query\", 0);\n\tprivate static var lime_gl_create_renderbuffer = CFFI.load(\"lime\", \"lime_gl_create_renderbuffer\", 0);\n\tprivate static var lime_gl_create_sampler = CFFI.load(\"lime\", \"lime_gl_create_sampler\", 0);\n\tprivate static var lime_gl_create_shader = CFFI.load(\"lime\", \"lime_gl_create_shader\", 1);\n\tprivate static var lime_gl_create_texture = CFFI.load(\"lime\", \"lime_gl_create_texture\", 0);\n\tprivate static var lime_gl_create_transform_feedback = CFFI.load(\"lime\", \"lime_gl_create_transform_feedback\", 0);\n\tprivate static var lime_gl_create_vertex_array = CFFI.load(\"lime\", \"lime_gl_create_vertex_array\", 0);\n\tprivate static var lime_gl_cull_face = CFFI.load(\"lime\", \"lime_gl_cull_face\", 1);\n\tprivate static var lime_gl_delete_buffer = CFFI.load(\"lime\", \"lime_gl_delete_buffer\", 1);\n\tprivate static var lime_gl_delete_framebuffer = CFFI.load(\"lime\", \"lime_gl_delete_framebuffer\", 1);\n\tprivate static var lime_gl_delete_program = CFFI.load(\"lime\", \"lime_gl_delete_program\", 1);\n\tprivate static var lime_gl_delete_query = CFFI.load(\"lime\", \"lime_gl_delete_query\", 1);\n\tprivate static var lime_gl_delete_renderbuffer = CFFI.load(\"lime\", \"lime_gl_delete_renderbuffer\", 1);\n\tprivate static var lime_gl_delete_sampler = CFFI.load(\"lime\", \"lime_gl_delete_sampler\", 1);\n\tprivate static var lime_gl_delete_shader = CFFI.load(\"lime\", \"lime_gl_delete_shader\", 1);\n\tprivate static var lime_gl_delete_sync = CFFI.load(\"lime\", \"lime_gl_delete_sync\", 1);\n\tprivate static var lime_gl_delete_texture = CFFI.load(\"lime\", \"lime_gl_delete_texture\", 1);\n\tprivate static var lime_gl_delete_transform_feedback = CFFI.load(\"lime\", \"lime_gl_delete_transform_feedback\", 1);\n\tprivate static var lime_gl_delete_vertex_array = CFFI.load(\"lime\", \"lime_gl_delete_vertex_array\", 1);\n\tprivate static var lime_gl_depth_func = CFFI.load(\"lime\", \"lime_gl_depth_func\", 1);\n\tprivate static var lime_gl_depth_mask = CFFI.load(\"lime\", \"lime_gl_depth_mask\", 1);\n\tprivate static var lime_gl_depth_rangef = CFFI.load(\"lime\", \"lime_gl_depth_rangef\", 2);\n\tprivate static var lime_gl_detach_shader = CFFI.load(\"lime\", \"lime_gl_detach_shader\", 2);\n\tprivate static var lime_gl_disable = CFFI.load(\"lime\", \"lime_gl_disable\", 1);\n\tprivate static var lime_gl_disable_vertex_attrib_array = CFFI.load(\"lime\", \"lime_gl_disable_vertex_attrib_array\", 1);\n\tprivate static var lime_gl_draw_arrays = CFFI.load(\"lime\", \"lime_gl_draw_arrays\", 3);\n\tprivate static var lime_gl_draw_arrays_instanced = CFFI.load(\"lime\", \"lime_gl_draw_arrays_instanced\", 4);\n\tprivate static var lime_gl_draw_buffers = CFFI.load(\"lime\", \"lime_gl_draw_buffers\", 1);\n\tprivate static var lime_gl_draw_elements = CFFI.load(\"lime\", \"lime_gl_draw_elements\", 4);\n\tprivate static var lime_gl_draw_elements_instanced = CFFI.load(\"lime\", \"lime_gl_draw_elements_instanced\", 5);\n\tprivate static var lime_gl_draw_range_elements = CFFI.load(\"lime\", \"lime_gl_draw_range_elements\", -1);\n\tprivate static var lime_gl_enable = CFFI.load(\"lime\", \"lime_gl_enable\", 1);\n\tprivate static var lime_gl_enable_vertex_attrib_array = CFFI.load(\"lime\", \"lime_gl_enable_vertex_attrib_array\", 1);\n\tprivate static var lime_gl_end_query = CFFI.load(\"lime\", \"lime_gl_end_query\", 1);\n\tprivate static var lime_gl_end_transform_feedback = CFFI.load(\"lime\", \"lime_gl_end_transform_feedback\", 0);\n\tprivate static var lime_gl_fence_sync = CFFI.load(\"lime\", \"lime_gl_fence_sync\", 2);\n\tprivate static var lime_gl_finish = CFFI.load(\"lime\", \"lime_gl_finish\", 0);\n\tprivate static var lime_gl_flush = CFFI.load(\"lime\", \"lime_gl_flush\", 0);\n\tprivate static var lime_gl_framebuffer_renderbuffer = CFFI.load(\"lime\", \"lime_gl_framebuffer_renderbuffer\", 4);\n\tprivate static var lime_gl_framebuffer_texture2D = CFFI.load(\"lime\", \"lime_gl_framebuffer_texture2D\", 5);\n\tprivate static var lime_gl_framebuffer_texture_layer = CFFI.load(\"lime\", \"lime_gl_framebuffer_texture_layer\", 5);\n\tprivate static var lime_gl_front_face = CFFI.load(\"lime\", \"lime_gl_front_face\", 1);\n\tprivate static var lime_gl_generate_mipmap = CFFI.load(\"lime\", \"lime_gl_generate_mipmap\", 1);\n\tprivate static var lime_gl_get_active_attrib = CFFI.load(\"lime\", \"lime_gl_get_active_attrib\", 2);\n\tprivate static var lime_gl_get_active_uniform = CFFI.load(\"lime\", \"lime_gl_get_active_uniform\", 2);\n\tprivate static var lime_gl_get_active_uniform_blocki = CFFI.load(\"lime\", \"lime_gl_get_active_uniform_blocki\", 3);\n\tprivate static var lime_gl_get_active_uniform_blockiv = CFFI.load(\"lime\", \"lime_gl_get_active_uniform_blockiv\", 4);\n\tprivate static var lime_gl_get_active_uniform_block_name = CFFI.load(\"lime\", \"lime_gl_get_active_uniform_block_name\", 2);\n\tprivate static var lime_gl_get_active_uniformsiv = CFFI.load(\"lime\", \"lime_gl_get_active_uniformsiv\", 4);\n\tprivate static var lime_gl_get_attached_shaders = CFFI.load(\"lime\", \"lime_gl_get_attached_shaders\", 1);\n\tprivate static var lime_gl_get_attrib_location = CFFI.load(\"lime\", \"lime_gl_get_attrib_location\", 2);\n\tprivate static var lime_gl_get_boolean = CFFI.load(\"lime\", \"lime_gl_get_boolean\", 1);\n\tprivate static var lime_gl_get_booleanv = CFFI.load(\"lime\", \"lime_gl_get_booleanv\", 2);\n\tprivate static var lime_gl_get_buffer_parameteri = CFFI.load(\"lime\", \"lime_gl_get_buffer_parameteri\", 2);\n\tprivate static var lime_gl_get_buffer_parameteri64v = CFFI.load(\"lime\", \"lime_gl_get_buffer_parameteri64v\", 3);\n\tprivate static var lime_gl_get_buffer_parameteriv = CFFI.load(\"lime\", \"lime_gl_get_buffer_parameteriv\", 3);\n\tprivate static var lime_gl_get_buffer_pointerv = CFFI.load(\"lime\", \"lime_gl_get_buffer_pointerv\", 2);\n\tprivate static var lime_gl_get_buffer_sub_data = CFFI.load(\"lime\", \"lime_gl_get_buffer_sub_data\", 4);\n\tprivate static var lime_gl_get_context_attributes = CFFI.load(\"lime\", \"lime_gl_get_context_attributes\", 0);\n\tprivate static var lime_gl_get_error = CFFI.load(\"lime\", \"lime_gl_get_error\", 0);\n\tprivate static var lime_gl_get_extension = CFFI.load(\"lime\", \"lime_gl_get_extension\", 1);\n\tprivate static var lime_gl_get_float = CFFI.load(\"lime\", \"lime_gl_get_float\", 1);\n\tprivate static var lime_gl_get_floatv = CFFI.load(\"lime\", \"lime_gl_get_floatv\", 2);\n\tprivate static var lime_gl_get_frag_data_location = CFFI.load(\"lime\", \"lime_gl_get_frag_data_location\", 2);\n\tprivate static var lime_gl_get_framebuffer_attachment_parameteri = CFFI.load(\"lime\", \"lime_gl_get_framebuffer_attachment_parameteri\", 3);\n\tprivate static var lime_gl_get_framebuffer_attachment_parameteriv = CFFI.load(\"lime\", \"lime_gl_get_framebuffer_attachment_parameteriv\", 4);\n\tprivate static var lime_gl_get_integer = CFFI.load(\"lime\", \"lime_gl_get_integer\", 1);\n\tprivate static var lime_gl_get_integer64v = CFFI.load(\"lime\", \"lime_gl_get_integer64v\", 2);\n\tprivate static var lime_gl_get_integer64i_v = CFFI.load(\"lime\", \"lime_gl_get_integer64i_v\", 3);\n\tprivate static var lime_gl_get_integerv = CFFI.load(\"lime\", \"lime_gl_get_integerv\", 2);\n\tprivate static var lime_gl_get_integeri_v = CFFI.load(\"lime\", \"lime_gl_get_integeri_v\", 3);\n\tprivate static var lime_gl_get_internalformativ = CFFI.load(\"lime\", \"lime_gl_get_internalformativ\", 5);\n\tprivate static var lime_gl_get_program_binary = CFFI.load(\"lime\", \"lime_gl_get_program_binary\", 3);\n\tprivate static var lime_gl_get_program_info_log = CFFI.load(\"lime\", \"lime_gl_get_program_info_log\", 1);\n\tprivate static var lime_gl_get_programi = CFFI.load(\"lime\", \"lime_gl_get_programi\", 2);\n\tprivate static var lime_gl_get_programiv = CFFI.load(\"lime\", \"lime_gl_get_programiv\", 3);\n\tprivate static var lime_gl_get_queryi = CFFI.load(\"lime\", \"lime_gl_get_queryi\", 2);\n\tprivate static var lime_gl_get_queryiv = CFFI.load(\"lime\", \"lime_gl_get_queryiv\", 3);\n\tprivate static var lime_gl_get_query_objectui = CFFI.load(\"lime\", \"lime_gl_get_query_objectui\", 2);\n\tprivate static var lime_gl_get_query_objectuiv = CFFI.load(\"lime\", \"lime_gl_get_query_objectuiv\", 3);\n\tprivate static var lime_gl_get_renderbuffer_parameteri = CFFI.load(\"lime\", \"lime_gl_get_renderbuffer_parameteri\", 2);\n\tprivate static var lime_gl_get_renderbuffer_parameteriv = CFFI.load(\"lime\", \"lime_gl_get_renderbuffer_parameteriv\", 3);\n\tprivate static var lime_gl_get_sampler_parameterf = CFFI.load(\"lime\", \"lime_gl_get_sampler_parameterf\", 2);\n\tprivate static var lime_gl_get_sampler_parameterfv = CFFI.load(\"lime\", \"lime_gl_get_sampler_parameterfv\", 3);\n\tprivate static var lime_gl_get_sampler_parameteri = CFFI.load(\"lime\", \"lime_gl_get_sampler_parameteri\", 2);\n\tprivate static var lime_gl_get_sampler_parameteriv = CFFI.load(\"lime\", \"lime_gl_get_sampler_parameteriv\", 3);\n\tprivate static var lime_gl_get_shader_info_log = CFFI.load(\"lime\", \"lime_gl_get_shader_info_log\", 1);\n\tprivate static var lime_gl_get_shaderi = CFFI.load(\"lime\", \"lime_gl_get_shaderi\", 2);\n\tprivate static var lime_gl_get_shaderiv = CFFI.load(\"lime\", \"lime_gl_get_shaderiv\", 3);\n\tprivate static var lime_gl_get_shader_precision_format = CFFI.load(\"lime\", \"lime_gl_get_shader_precision_format\", 2);\n\tprivate static var lime_gl_get_shader_source = CFFI.load(\"lime\", \"lime_gl_get_shader_source\", 1);\n\tprivate static var lime_gl_get_string = CFFI.load(\"lime\", \"lime_gl_get_string\", 1);\n\tprivate static var lime_gl_get_stringi = CFFI.load(\"lime\", \"lime_gl_get_stringi\", 2);\n\tprivate static var lime_gl_get_sync_parameteri = CFFI.load(\"lime\", \"lime_gl_get_sync_parameteri\", 2);\n\tprivate static var lime_gl_get_sync_parameteriv = CFFI.load(\"lime\", \"lime_gl_get_sync_parameteriv\", 3);\n\tprivate static var lime_gl_get_tex_parameterf = CFFI.load(\"lime\", \"lime_gl_get_tex_parameterf\", 2);\n\tprivate static var lime_gl_get_tex_parameterfv = CFFI.load(\"lime\", \"lime_gl_get_tex_parameterfv\", 3);\n\tprivate static var lime_gl_get_tex_parameteri = CFFI.load(\"lime\", \"lime_gl_get_tex_parameteri\", 2);\n\tprivate static var lime_gl_get_tex_parameteriv = CFFI.load(\"lime\", \"lime_gl_get_tex_parameteriv\", 3);\n\tprivate static var lime_gl_get_transform_feedback_varying = CFFI.load(\"lime\", \"lime_gl_get_transform_feedback_varying\", 2);\n\tprivate static var lime_gl_get_uniformf = CFFI.load(\"lime\", \"lime_gl_get_uniformf\", 2);\n\tprivate static var lime_gl_get_uniformfv = CFFI.load(\"lime\", \"lime_gl_get_uniformfv\", 3);\n\tprivate static var lime_gl_get_uniformi = CFFI.load(\"lime\", \"lime_gl_get_uniformi\", 2);\n\tprivate static var lime_gl_get_uniformiv = CFFI.load(\"lime\", \"lime_gl_get_uniformiv\", 3);\n\tprivate static var lime_gl_get_uniformui = CFFI.load(\"lime\", \"lime_gl_get_uniformui\", 2);\n\tprivate static var lime_gl_get_uniformuiv = CFFI.load(\"lime\", \"lime_gl_get_uniformuiv\", 3);\n\tprivate static var lime_gl_get_uniform_block_index = CFFI.load(\"lime\", \"lime_gl_get_uniform_block_index\", 2);\n\tprivate static var lime_gl_get_uniform_location = CFFI.load(\"lime\", \"lime_gl_get_uniform_location\", 2);\n\tprivate static var lime_gl_get_vertex_attribf = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribf\", 2);\n\tprivate static var lime_gl_get_vertex_attribfv = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribfv\", 3);\n\tprivate static var lime_gl_get_vertex_attribi = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribi\", 2);\n\tprivate static var lime_gl_get_vertex_attribiv = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribiv\", 3);\n\tprivate static var lime_gl_get_vertex_attribii = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribii\", 2);\n\tprivate static var lime_gl_get_vertex_attribiiv = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribiiv\", 3);\n\tprivate static var lime_gl_get_vertex_attribiui = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribiui\", 2);\n\tprivate static var lime_gl_get_vertex_attribiuiv = CFFI.load(\"lime\", \"lime_gl_get_vertex_attribiuiv\", 3);\n\tprivate static var lime_gl_get_vertex_attrib_pointerv = CFFI.load(\"lime\", \"lime_gl_get_vertex_attrib_pointerv\", 2);\n\tprivate static var lime_gl_hint = CFFI.load(\"lime\", \"lime_gl_hint\", 2);\n\tprivate static var lime_gl_invalidate_framebuffer = CFFI.load(\"lime\", \"lime_gl_invalidate_framebuffer\", 2);\n\tprivate static var lime_gl_invalidate_sub_framebuffer = CFFI.load(\"lime\", \"lime_gl_invalidate_sub_framebuffer\", -1);\n\tprivate static var lime_gl_is_buffer = CFFI.load(\"lime\", \"lime_gl_is_buffer\", 1);\n\tprivate static var lime_gl_is_enabled = CFFI.load(\"lime\", \"lime_gl_is_enabled\", 1);\n\tprivate static var lime_gl_is_framebuffer = CFFI.load(\"lime\", \"lime_gl_is_framebuffer\", 1);\n\tprivate static var lime_gl_is_program = CFFI.load(\"lime\", \"lime_gl_is_program\", 1);\n\tprivate static var lime_gl_is_query = CFFI.load(\"lime\", \"lime_gl_is_query\", 1);\n\tprivate static var lime_gl_is_renderbuffer = CFFI.load(\"lime\", \"lime_gl_is_renderbuffer\", 1);\n\tprivate static var lime_gl_is_sampler = CFFI.load(\"lime\", \"lime_gl_is_sampler\", 1);\n\tprivate static var lime_gl_is_shader = CFFI.load(\"lime\", \"lime_gl_is_shader\", 1);\n\tprivate static var lime_gl_is_sync = CFFI.load(\"lime\", \"lime_gl_is_sync\", 1);\n\tprivate static var lime_gl_is_texture = CFFI.load(\"lime\", \"lime_gl_is_texture\", 1);\n\tprivate static var lime_gl_is_transform_feedback = CFFI.load(\"lime\", \"lime_gl_is_transform_feedback\", 1);\n\tprivate static var lime_gl_is_vertex_array = CFFI.load(\"lime\", \"lime_gl_is_vertex_array\", 1);\n\tprivate static var lime_gl_line_width = CFFI.load(\"lime\", \"lime_gl_line_width\", 1);\n\tprivate static var lime_gl_link_program = CFFI.load(\"lime\", \"lime_gl_link_program\", 1);\n\tprivate static var lime_gl_map_buffer_range = CFFI.load(\"lime\", \"lime_gl_map_buffer_range\", 4);\n\tprivate static var lime_gl_object_deregister:Dynamic->Void = CFFI.load(\"lime\", \"lime_gl_object_deregister\", 1);\n\tprivate static var lime_gl_object_from_id = CFFI.load(\"lime\", \"lime_gl_object_from_id\", 2);\n\tprivate static var lime_gl_object_register = CFFI.load(\"lime\", \"lime_gl_object_register\", 3);\n\tprivate static var lime_gl_pause_transform_feedback = CFFI.load(\"lime\", \"lime_gl_pause_transform_feedback\", 0);\n\tprivate static var lime_gl_pixel_storei = CFFI.load(\"lime\", \"lime_gl_pixel_storei\", 2);\n\tprivate static var lime_gl_polygon_offset = CFFI.load(\"lime\", \"lime_gl_polygon_offset\", 2);\n\tprivate static var lime_gl_program_binary = CFFI.load(\"lime\", \"lime_gl_program_binary\", 4);\n\tprivate static var lime_gl_program_parameteri = CFFI.load(\"lime\", \"lime_gl_program_parameteri\", 3);\n\tprivate static var lime_gl_read_buffer = CFFI.load(\"lime\", \"lime_gl_read_buffer\", 1);\n\tprivate static var lime_gl_read_pixels = CFFI.load(\"lime\", \"lime_gl_read_pixels\", -1);\n\tprivate static var lime_gl_release_shader_compiler = CFFI.load(\"lime\", \"lime_gl_release_shader_compiler\", 0);\n\tprivate static var lime_gl_renderbuffer_storage = CFFI.load(\"lime\", \"lime_gl_renderbuffer_storage\", 4);\n\tprivate static var lime_gl_renderbuffer_storage_multisample = CFFI.load(\"lime\", \"lime_gl_renderbuffer_storage_multisample\", 5);\n\tprivate static var lime_gl_resume_transform_feedback = CFFI.load(\"lime\", \"lime_gl_resume_transform_feedback\", 0);\n\tprivate static var lime_gl_sample_coverage = CFFI.load(\"lime\", \"lime_gl_sample_coverage\", 2);\n\tprivate static var lime_gl_sampler_parameterf = CFFI.load(\"lime\", \"lime_gl_sampler_parameterf\", 3);\n\tprivate static var lime_gl_sampler_parameteri = CFFI.load(\"lime\", \"lime_gl_sampler_parameteri\", 3);\n\tprivate static var lime_gl_scissor = CFFI.load(\"lime\", \"lime_gl_scissor\", 4);\n\tprivate static var lime_gl_shader_binary = CFFI.load(\"lime\", \"lime_gl_shader_binary\", 4);\n\tprivate static var lime_gl_shader_source = CFFI.load(\"lime\", \"lime_gl_shader_source\", 2);\n\tprivate static var lime_gl_stencil_func = CFFI.load(\"lime\", \"lime_gl_stencil_func\", 3);\n\tprivate static var lime_gl_stencil_func_separate = CFFI.load(\"lime\", \"lime_gl_stencil_func_separate\", 4);\n\tprivate static var lime_gl_stencil_mask = CFFI.load(\"lime\", \"lime_gl_stencil_mask\", 1);\n\tprivate static var lime_gl_stencil_mask_separate = CFFI.load(\"lime\", \"lime_gl_stencil_mask_separate\", 2);\n\tprivate static var lime_gl_stencil_op = CFFI.load(\"lime\", \"lime_gl_stencil_op\", 3);\n\tprivate static var lime_gl_stencil_op_separate = CFFI.load(\"lime\", \"lime_gl_stencil_op_separate\", 4);\n\tprivate static var lime_gl_tex_image_2d = CFFI.load(\"lime\", \"lime_gl_tex_image_2d\", -1);\n\tprivate static var lime_gl_tex_image_3d = CFFI.load(\"lime\", \"lime_gl_tex_image_3d\", -1);\n\tprivate static var lime_gl_tex_parameterf = CFFI.load(\"lime\", \"lime_gl_tex_parameterf\", 3);\n\tprivate static var lime_gl_tex_parameteri = CFFI.load(\"lime\", \"lime_gl_tex_parameteri\", 3);\n\tprivate static var lime_gl_tex_storage_2d = CFFI.load(\"lime\", \"lime_gl_tex_storage_2d\", 5);\n\tprivate static var lime_gl_tex_storage_3d = CFFI.load(\"lime\", \"lime_gl_tex_storage_3d\", -1);\n\tprivate static var lime_gl_tex_sub_image_2d = CFFI.load(\"lime\", \"lime_gl_tex_sub_image_2d\", -1);\n\tprivate static var lime_gl_tex_sub_image_3d = CFFI.load(\"lime\", \"lime_gl_tex_sub_image_3d\", -1);\n\tprivate static var lime_gl_transform_feedback_varyings = CFFI.load(\"lime\", \"lime_gl_transform_feedback_varyings\", 3);\n\tprivate static var lime_gl_uniform1f = CFFI.load(\"lime\", \"lime_gl_uniform1f\", 2);\n\tprivate static var lime_gl_uniform1fv = CFFI.load(\"lime\", \"lime_gl_uniform1fv\", 3);\n\tprivate static var lime_gl_uniform1i = CFFI.load(\"lime\", \"lime_gl_uniform1i\", 2);\n\tprivate static var lime_gl_uniform1iv = CFFI.load(\"lime\", \"lime_gl_uniform1iv\", 3);\n\tprivate static var lime_gl_uniform1ui = CFFI.load(\"lime\", \"lime_gl_uniform1ui\", 2);\n\tprivate static var lime_gl_uniform1uiv = CFFI.load(\"lime\", \"lime_gl_uniform1uiv\", 3);\n\tprivate static var lime_gl_uniform2f = CFFI.load(\"lime\", \"lime_gl_uniform2f\", 3);\n\tprivate static var lime_gl_uniform2fv = CFFI.load(\"lime\", \"lime_gl_uniform2fv\", 3);\n\tprivate static var lime_gl_uniform2i = CFFI.load(\"lime\", \"lime_gl_uniform2i\", 3);\n\tprivate static var lime_gl_uniform2iv = CFFI.load(\"lime\", \"lime_gl_uniform2iv\", 3);\n\tprivate static var lime_gl_uniform2ui = CFFI.load(\"lime\", \"lime_gl_uniform2ui\", 3);\n\tprivate static var lime_gl_uniform2uiv = CFFI.load(\"lime\", \"lime_gl_uniform2uiv\", 3);\n\tprivate static var lime_gl_uniform3f = CFFI.load(\"lime\", \"lime_gl_uniform3f\", 4);\n\tprivate static var lime_gl_uniform3fv = CFFI.load(\"lime\", \"lime_gl_uniform3fv\", 3);\n\tprivate static var lime_gl_uniform3i = CFFI.load(\"lime\", \"lime_gl_uniform3i\", 4);\n\tprivate static var lime_gl_uniform3iv = CFFI.load(\"lime\", \"lime_gl_uniform3iv\", 3);\n\tprivate static var lime_gl_uniform3ui = CFFI.load(\"lime\", \"lime_gl_uniform3ui\", 4);\n\tprivate static var lime_gl_uniform3uiv = CFFI.load(\"lime\", \"lime_gl_uniform3uiv\", 3);\n\tprivate static var lime_gl_uniform4f = CFFI.load(\"lime\", \"lime_gl_uniform4f\", 5);\n\tprivate static var lime_gl_uniform4fv = CFFI.load(\"lime\", \"lime_gl_uniform4fv\", 3);\n\tprivate static var lime_gl_uniform4i = CFFI.load(\"lime\", \"lime_gl_uniform4i\", 5);\n\tprivate static var lime_gl_uniform4iv = CFFI.load(\"lime\", \"lime_gl_uniform4iv\", 3);\n\tprivate static var lime_gl_uniform4ui = CFFI.load(\"lime\", \"lime_gl_uniform4ui\", 5);\n\tprivate static var lime_gl_uniform4uiv = CFFI.load(\"lime\", \"lime_gl_uniform4uiv\", 3);\n\tprivate static var lime_gl_uniform_block_binding = CFFI.load(\"lime\", \"lime_gl_uniform_block_binding\", 3);\n\tprivate static var lime_gl_uniform_matrix2fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix2fv\", 4);\n\tprivate static var lime_gl_uniform_matrix2x3fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix2x3fv\", 4);\n\tprivate static var lime_gl_uniform_matrix2x4fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix2x4fv\", 4);\n\tprivate static var lime_gl_uniform_matrix3fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix3fv\", 4);\n\tprivate static var lime_gl_uniform_matrix3x2fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix3x2fv\", 4);\n\tprivate static var lime_gl_uniform_matrix3x4fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix3x4fv\", 4);\n\tprivate static var lime_gl_uniform_matrix4fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix4fv\", 4);\n\tprivate static var lime_gl_uniform_matrix4x2fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix4x2fv\", 4);\n\tprivate static var lime_gl_uniform_matrix4x3fv = CFFI.load(\"lime\", \"lime_gl_uniform_matrix4x3fv\", 4);\n\tprivate static var lime_gl_unmap_buffer = CFFI.load(\"lime\", \"lime_gl_unmap_buffer\", 1);\n\tprivate static var lime_gl_use_program = CFFI.load(\"lime\", \"lime_gl_use_program\", 1);\n\tprivate static var lime_gl_validate_program = CFFI.load(\"lime\", \"lime_gl_validate_program\", 1);\n\tprivate static var lime_gl_vertex_attrib1f = CFFI.load(\"lime\", \"lime_gl_vertex_attrib1f\", 2);\n\tprivate static var lime_gl_vertex_attrib1fv = CFFI.load(\"lime\", \"lime_gl_vertex_attrib1fv\", 2);\n\tprivate static var lime_gl_vertex_attrib2f = CFFI.load(\"lime\", \"lime_gl_vertex_attrib2f\", 3);\n\tprivate static var lime_gl_vertex_attrib2fv = CFFI.load(\"lime\", \"lime_gl_vertex_attrib2fv\", 2);\n\tprivate static var lime_gl_vertex_attrib3f = CFFI.load(\"lime\", \"lime_gl_vertex_attrib3f\", 4);\n\tprivate static var lime_gl_vertex_attrib3fv = CFFI.load(\"lime\", \"lime_gl_vertex_attrib3fv\", 2);\n\tprivate static var lime_gl_vertex_attrib4f = CFFI.load(\"lime\", \"lime_gl_vertex_attrib4f\", 5);\n\tprivate static var lime_gl_vertex_attrib4fv = CFFI.load(\"lime\", \"lime_gl_vertex_attrib4fv\", 2);\n\tprivate static var lime_gl_vertex_attribi4i = CFFI.load(\"lime\", \"lime_gl_vertex_attribi4i\", 5);\n\tprivate static var lime_gl_vertex_attribi4iv = CFFI.load(\"lime\", \"lime_gl_vertex_attribi4iv\", 2);\n\tprivate static var lime_gl_vertex_attribi4ui = CFFI.load(\"lime\", \"lime_gl_vertex_attribi4ui\", 5);\n\tprivate static var lime_gl_vertex_attribi4uiv = CFFI.load(\"lime\", \"lime_gl_vertex_attribi4uiv\", 2);\n\tprivate static var lime_gl_vertex_attrib_divisor = CFFI.load(\"lime\", \"lime_gl_vertex_attrib_divisor\", 2);\n\tprivate static var lime_gl_vertex_attrib_ipointer = CFFI.load(\"lime\", \"lime_gl_vertex_attrib_ipointer\", 5);\n\tprivate static var lime_gl_vertex_attrib_pointer = CFFI.load(\"lime\", \"lime_gl_vertex_attrib_pointer\", -1);\n\tprivate static var lime_gl_viewport = CFFI.load(\"lime\", \"lime_gl_viewport\", 4);\n\tprivate static var lime_gl_wait_sync = CFFI.load(\"lime\", \"lime_gl_wait_sync\", 4);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_gl_active_texture\") private static function lime_gl_active_texture(texture:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_attach_shader\") private static function lime_gl_attach_shader(program:Int, shader:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_begin_query\") private static function lime_gl_begin_query(target:Int, query:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_begin_transform_feedback\") private static function lime_gl_begin_transform_feedback(primitiveNode:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_attrib_location\") private static function lime_gl_bind_attrib_location(program:Int, index:Int, name:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_buffer\") private static function lime_gl_bind_buffer(target:Int, buffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_buffer_base\") private static function lime_gl_bind_buffer_base(target:Int, index:Int, buffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_buffer_range\") private static function lime_gl_bind_buffer_range(target:Int, index:Int, buffer:Int, offset:DataPointer,\n\t\tsize:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_framebuffer\") private static function lime_gl_bind_framebuffer(target:Int, framebuffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_renderbuffer\") private static function lime_gl_bind_renderbuffer(target:Int, renderbuffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_sampler\") private static function lime_gl_bind_sampler(target:Int, sampler:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_texture\") private static function lime_gl_bind_texture(target:Int, texture:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_transform_feedback\") private static function lime_gl_bind_transform_feedback(target:Int, transformFeedback:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_bind_vertex_array\") private static function lime_gl_bind_vertex_array(vertexArray:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_blend_color\") private static function lime_gl_blend_color(red:hl.F32, green:hl.F32, blue:hl.F32, alpha:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_blend_equation\") private static function lime_gl_blend_equation(mode:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_blend_equation_separate\") private static function lime_gl_blend_equation_separate(modeRGB:Int, modeAlpha:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_blend_func\") private static function lime_gl_blend_func(sfactor:Int, dfactor:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_blend_func_separate\") private static function lime_gl_blend_func_separate(srcRGB:Int, dstRGB:Int, srcAlpha:Int,\n\t\tdstAlpha:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_blit_framebuffer\") private static function lime_gl_blit_framebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int,\n\t\tdstY0:Int, dstX1:Int, dstY1:Int, mask:Int, filter:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_buffer_data\") private static function lime_gl_buffer_data(target:Int, size:Int, srcData:DataPointer, usage:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_buffer_sub_data\") private static function lime_gl_buffer_sub_data(target:Int, offset:Int, size:Int,\n\t\tsrcData:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_check_framebuffer_status\") private static function lime_gl_check_framebuffer_status(target:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear\") private static function lime_gl_clear(mask:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_bufferfi\") private static function lime_gl_clear_bufferfi(buffer:Int, drawBuffer:Int, depth:hl.F32, stencil:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_bufferfv\") private static function lime_gl_clear_bufferfv(buffer:Int, drawBuffer:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_bufferiv\") private static function lime_gl_clear_bufferiv(buffer:Int, drawBuffer:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_bufferuiv\") private static function lime_gl_clear_bufferuiv(buffer:Int, drawBuffer:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_client_wait_sync\") private static function lime_gl_client_wait_sync(sync:CFFIPointer, flags:Int, timeoutA:Int,\n\t\t\ttimeoutB:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_color\") private static function lime_gl_clear_color(red:hl.F32, green:hl.F32, blue:hl.F32, alpha:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_depthf\") private static function lime_gl_clear_depthf(depth:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_clear_stencil\") private static function lime_gl_clear_stencil(s:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_color_mask\") private static function lime_gl_color_mask(red:Bool, green:Bool, blue:Bool, alpha:Bool):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_compile_shader\") private static function lime_gl_compile_shader(shader:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_compressed_tex_image_2d\") private static function lime_gl_compressed_tex_image_2d(target:Int, level:Int, internalformat:Int,\n\t\twidth:Int, height:Int, border:Int, imageSize:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_compressed_tex_image_3d\") private static function lime_gl_compressed_tex_image_3d(target:Int, level:Int, internalformat:Int,\n\t\twidth:Int, height:Int, depth:Int, border:Int, imageSize:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_compressed_tex_sub_image_2d\") private static function lime_gl_compressed_tex_sub_image_2d(target:Int, level:Int, xoffset:Int,\n\t\tyoffset:Int, width:Int, height:Int, format:Int, imageSize:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_compressed_tex_sub_image_3d\") private static function lime_gl_compressed_tex_sub_image_3d(target:Int, level:Int, xoffset:Int,\n\t\tyoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, imageSize:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_copy_buffer_sub_data\") private static function lime_gl_copy_buffer_sub_data(readTarget:Int, writeTarget:Int,\n\t\treadOffset:DataPointer, writeOffset:DataPointer, size:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_copy_tex_image_2d\") private static function lime_gl_copy_tex_image_2d(target:Int, level:Int, internalformat:Int, x:Int, y:Int,\n\t\twidth:Int, height:Int, border:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_copy_tex_sub_image_2d\") private static function lime_gl_copy_tex_sub_image_2d(target:Int, level:Int, xoffset:Int, yoffset:Int,\n\t\tx:Int, y:Int, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_copy_tex_sub_image_3d\") private static function lime_gl_copy_tex_sub_image_3d(target:Int, level:Int, xoffset:Int, yoffset:Int,\n\t\tzoffset:Int, x:Int, y:Int, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_buffer\") private static function lime_gl_create_buffer():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_framebuffer\") private static function lime_gl_create_framebuffer():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_program\") private static function lime_gl_create_program():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_query\") private static function lime_gl_create_query():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_renderbuffer\") private static function lime_gl_create_renderbuffer():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_sampler\") private static function lime_gl_create_sampler():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_shader\") private static function lime_gl_create_shader(type:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_texture\") private static function lime_gl_create_texture():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_transform_feedback\") private static function lime_gl_create_transform_feedback():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_create_vertex_array\") private static function lime_gl_create_vertex_array():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_cull_face\") private static function lime_gl_cull_face(mode:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_buffer\") private static function lime_gl_delete_buffer(buffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_framebuffer\") private static function lime_gl_delete_framebuffer(framebuffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_program\") private static function lime_gl_delete_program(program:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_query\") private static function lime_gl_delete_query(query:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_renderbuffer\") private static function lime_gl_delete_renderbuffer(renderbuffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_sampler\") private static function lime_gl_delete_sampler(sampler:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_shader\") private static function lime_gl_delete_shader(shader:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_sync\") private static function lime_gl_delete_sync(sync:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_texture\") private static function lime_gl_delete_texture(texture:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_transform_feedback\") private static function lime_gl_delete_transform_feedback(transformFeedback:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_delete_vertex_array\") private static function lime_gl_delete_vertex_array(vertexArray:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_depth_func\") private static function lime_gl_depth_func(func:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_depth_mask\") private static function lime_gl_depth_mask(flag:Bool):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_depth_rangef\") private static function lime_gl_depth_rangef(zNear:hl.F32, zFar:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_detach_shader\") private static function lime_gl_detach_shader(program:Int, shader:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_disable\") private static function lime_gl_disable(cap:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_disable_vertex_attrib_array\") private static function lime_gl_disable_vertex_attrib_array(index:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_draw_arrays\") private static function lime_gl_draw_arrays(mode:Int, first:Int, count:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_draw_arrays_instanced\") private static function lime_gl_draw_arrays_instanced(mode:Int, first:Int, count:Int,\n\t\tinstanceCount:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_draw_buffers\") private static function lime_gl_draw_buffers(buffers:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_draw_elements\") private static function lime_gl_draw_elements(mode:Int, count:Int, type:Int, offset:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_draw_elements_instanced\") private static function lime_gl_draw_elements_instanced(mode:Int, count:Int, type:Int,\n\t\toffset:DataPointer, instanceCount:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_draw_range_elements\") private static function lime_gl_draw_range_elements(mode:Int, start:Int, end:Int, count:Int, type:Int,\n\t\toffset:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_enable\") private static function lime_gl_enable(cap:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_enable_vertex_attrib_array\") private static function lime_gl_enable_vertex_attrib_array(index:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_end_query\") private static function lime_gl_end_query(target:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_end_transform_feedback\") private static function lime_gl_end_transform_feedback():Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_fence_sync\") private static function lime_gl_fence_sync(condition:Int, flags:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_finish\") private static function lime_gl_finish():Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_flush\") private static function lime_gl_flush():Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_framebuffer_renderbuffer\") private static function lime_gl_framebuffer_renderbuffer(target:Int, attachment:Int,\n\t\trenderbuffertarget:Int, renderbuffer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_framebuffer_texture2D\") private static function lime_gl_framebuffer_texture2D(target:Int, attachment:Int, textarget:Int,\n\t\ttexture:Int, level:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_framebuffer_texture_layer\") private static function lime_gl_framebuffer_texture_layer(target:Int, attachment:Int, texture:Int,\n\t\tlevel:Int, layer:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_front_face\") private static function lime_gl_front_face(mode:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_generate_mipmap\") private static function lime_gl_generate_mipmap(target:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_active_attrib\") private static function lime_gl_get_active_attrib(program:Int, index:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_active_uniform\") private static function lime_gl_get_active_uniform(program:Int, index:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_active_uniform_blocki\") private static function lime_gl_get_active_uniform_blocki(program:Int, uniformBlockIndex:Int,\n\t\t\tpname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_active_uniform_blockiv\") private static function lime_gl_get_active_uniform_blockiv(program:Int, uniformBlockIndex:Int,\n\t\tpname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_active_uniform_block_name\") private static function lime_gl_get_active_uniform_block_name(program:Int,\n\t\t\tuniformBlockIndex:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_active_uniformsiv\") private static function lime_gl_get_active_uniformsiv(program:Int, uniformIndices:hl.NativeArray<Int>,\n\t\tpname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_attached_shaders\") private static function lime_gl_get_attached_shaders(program:Int):hl.NativeArray<Int>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_attrib_location\") private static function lime_gl_get_attrib_location(program:Int, name:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_boolean\") private static function lime_gl_get_boolean(pname:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_booleanv\") private static function lime_gl_get_booleanv(pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_buffer_parameteri\") private static function lime_gl_get_buffer_parameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_buffer_parameteri64v\") private static function lime_gl_get_buffer_parameteri64v(target:Int, index:Int,\n\t\tparams:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_buffer_parameteriv\") private static function lime_gl_get_buffer_parameteriv(target:Int, pname:Int,\n\t\tparams:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_buffer_pointerv\") private static function lime_gl_get_buffer_pointerv(target:Int, pname:Int):DataPointer\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_buffer_sub_data\") private static function lime_gl_get_buffer_sub_data(target:Int, offset:DataPointer, size:Int,\n\t\tdata:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_context_attributes\") private static function lime_gl_get_context_attributes():Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_error\") private static function lime_gl_get_error():Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_extension\") private static function lime_gl_get_extension(name:String):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_float\") private static function lime_gl_get_float(pname:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_floatv\") private static function lime_gl_get_floatv(pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_frag_data_location\") private static function lime_gl_get_frag_data_location(program:Int, name:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_framebuffer_attachment_parameteri\") private static function lime_gl_get_framebuffer_attachment_parameteri(target:Int,\n\t\t\tattachment:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_framebuffer_attachment_parameteriv\") private static function lime_gl_get_framebuffer_attachment_parameteriv(target:Int,\n\t\tattachment:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_integer\") private static function lime_gl_get_integer(pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_integer64v\") private static function lime_gl_get_integer64v(pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_integer64i_v\") private static function lime_gl_get_integer64i_v(pname:Int, index:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_integerv\") private static function lime_gl_get_integerv(pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_integeri_v\") private static function lime_gl_get_integeri_v(pname:Int, index:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_internalformativ\") private static function lime_gl_get_internalformativ(target:Int, internalformat:Int, pname:Int,\n\t\tbufSize:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_program_binary\") private static function lime_gl_get_program_binary(program:Int, binaryFormat:Int, bytes:Bytes):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_program_info_log\") private static function lime_gl_get_program_info_log(program:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_programi\") private static function lime_gl_get_programi(program:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_programiv\") private static function lime_gl_get_programiv(program:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_queryi\") private static function lime_gl_get_queryi(target:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_queryiv\") private static function lime_gl_get_queryiv(target:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_query_objectui\") private static function lime_gl_get_query_objectui(target:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_query_objectuiv\") private static function lime_gl_get_query_objectuiv(target:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_renderbuffer_parameteri\") private static function lime_gl_get_renderbuffer_parameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_renderbuffer_parameteriv\") private static function lime_gl_get_renderbuffer_parameteriv(target:Int, pname:Int,\n\t\tparams:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_sampler_parameterf\") private static function lime_gl_get_sampler_parameterf(target:Int, pname:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_sampler_parameterfv\") private static function lime_gl_get_sampler_parameterfv(target:Int, pname:Int,\n\t\tparams:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_sampler_parameteri\") private static function lime_gl_get_sampler_parameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_sampler_parameteriv\") private static function lime_gl_get_sampler_parameteriv(target:Int, pname:Int,\n\t\tparams:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_shader_info_log\") private static function lime_gl_get_shader_info_log(shader:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_shaderi\") private static function lime_gl_get_shaderi(shader:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_shaderiv\") private static function lime_gl_get_shaderiv(shader:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_shader_precision_format\") private static function lime_gl_get_shader_precision_format(shadertype:Int,\n\t\t\tprecisiontype:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_shader_source\") private static function lime_gl_get_shader_source(shader:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_string\") private static function lime_gl_get_string(pname:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_stringi\") private static function lime_gl_get_stringi(pname:Int, index:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_sync_parameteri\") private static function lime_gl_get_sync_parameteri(sync:CFFIPointer, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_sync_parameteriv\") private static function lime_gl_get_sync_parameteriv(sync:CFFIPointer, pname:Int,\n\t\tparams:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_tex_parameterf\") private static function lime_gl_get_tex_parameterf(target:Int, pname:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_tex_parameterfv\") private static function lime_gl_get_tex_parameterfv(target:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_tex_parameteri\") private static function lime_gl_get_tex_parameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_tex_parameteriv\") private static function lime_gl_get_tex_parameteriv(target:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_transform_feedback_varying\") private static function lime_gl_get_transform_feedback_varying(program:Int, index:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniformf\") private static function lime_gl_get_uniformf(program:Int, location:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniformfv\") private static function lime_gl_get_uniformfv(program:Int, location:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniformi\") private static function lime_gl_get_uniformi(program:Int, location:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniformiv\") private static function lime_gl_get_uniformiv(program:Int, location:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniformui\") private static function lime_gl_get_uniformui(program:Int, location:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniformuiv\") private static function lime_gl_get_uniformuiv(program:Int, location:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniform_block_index\") private static function lime_gl_get_uniform_block_index(program:Int, uniformBlockName:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_uniform_location\") private static function lime_gl_get_uniform_location(program:Int, name:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribf\") private static function lime_gl_get_vertex_attribf(index:Int, pname:Int):hl.F32\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribfv\") private static function lime_gl_get_vertex_attribfv(index:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribi\") private static function lime_gl_get_vertex_attribi(index:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribiv\") private static function lime_gl_get_vertex_attribiv(index:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribii\") private static function lime_gl_get_vertex_attribii(index:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribiiv\") private static function lime_gl_get_vertex_attribiiv(index:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribiui\") private static function lime_gl_get_vertex_attribiui(index:Int, pname:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attribiuiv\") private static function lime_gl_get_vertex_attribiuiv(index:Int, pname:Int, params:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_get_vertex_attrib_pointerv\") private static function lime_gl_get_vertex_attrib_pointerv(index:Int, pname:Int):DataPointer\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_hint\") private static function lime_gl_hint(target:Int, mode:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_invalidate_framebuffer\") private static function lime_gl_invalidate_framebuffer(target:Int,\n\t\tattachments:hl.NativeArray<Int>):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_invalidate_sub_framebuffer\") private static function lime_gl_invalidate_sub_framebuffer(target:Int,\n\t\tattachments:hl.NativeArray<Int>, x:Int, y:Int, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_buffer\") private static function lime_gl_is_buffer(buffer:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_enabled\") private static function lime_gl_is_enabled(cap:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_framebuffer\") private static function lime_gl_is_framebuffer(framebuffer:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_program\") private static function lime_gl_is_program(program:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_query\") private static function lime_gl_is_query(query:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_renderbuffer\") private static function lime_gl_is_renderbuffer(renderbuffer:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_sampler\") private static function lime_gl_is_sampler(sampler:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_shader\") private static function lime_gl_is_shader(shader:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_sync\") private static function lime_gl_is_sync(sync:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_texture\") private static function lime_gl_is_texture(texture:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_transform_feedback\") private static function lime_gl_is_transform_feedback(transformFeedback:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_is_vertex_array\") private static function lime_gl_is_vertex_array(vertexArray:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_line_width\") private static function lime_gl_line_width(width:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_link_program\") private static function lime_gl_link_program(program:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_map_buffer_range\") private static function lime_gl_map_buffer_range(target:Int, offset:DataPointer, length:Int,\n\t\t\taccess:Int):DataPointer\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_object_deregister\") private static function lime_gl_object_deregister(object:GLObject):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_object_from_id\") private static function lime_gl_object_from_id(id:Int, type:Int):GLObject\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_object_register\") private static function lime_gl_object_register(id:Int, type:Int, object:GLObject):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_pause_transform_feedback\") private static function lime_gl_pause_transform_feedback():Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_pixel_storei\") private static function lime_gl_pixel_storei(pname:Int, param:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_polygon_offset\") private static function lime_gl_polygon_offset(factor:hl.F32, units:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_program_binary\") private static function lime_gl_program_binary(program:Int, binaryFormat:Int, binary:DataPointer,\n\t\tlength:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_program_parameteri\") private static function lime_gl_program_parameteri(program:Int, pname:Int, value:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_read_buffer\") private static function lime_gl_read_buffer(src:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_read_pixels\") private static function lime_gl_read_pixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int,\n\t\tpixels:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_release_shader_compiler\") private static function lime_gl_release_shader_compiler():Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_renderbuffer_storage\") private static function lime_gl_renderbuffer_storage(target:Int, internalformat:Int, width:Int,\n\t\theight:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_renderbuffer_storage_multisample\") private static function lime_gl_renderbuffer_storage_multisample(target:Int, samples:Int,\n\t\tinternalformat:Int, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_resume_transform_feedback\") private static function lime_gl_resume_transform_feedback():Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_sample_coverage\") private static function lime_gl_sample_coverage(value:hl.F32, invert:Bool):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_sampler_parameterf\") private static function lime_gl_sampler_parameterf(sampler:Int, pname:Int, param:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_sampler_parameteri\") private static function lime_gl_sampler_parameteri(sampler:Int, pname:Int, param:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_scissor\") private static function lime_gl_scissor(x:Int, y:Int, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_shader_binary\") private static function lime_gl_shader_binary(shaders:hl.NativeArray<Int>, binaryformat:Int,\n\t\tbinary:DataPointer, length:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_shader_source\") private static function lime_gl_shader_source(shader:Int, source:String):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_stencil_func\") private static function lime_gl_stencil_func(func:Int, ref:Int, mask:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_stencil_func_separate\") private static function lime_gl_stencil_func_separate(face:Int, func:Int, ref:Int, mask:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_stencil_mask\") private static function lime_gl_stencil_mask(mask:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_stencil_mask_separate\") private static function lime_gl_stencil_mask_separate(face:Int, mask:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_stencil_op\") private static function lime_gl_stencil_op(fail:Int, zfail:Int, zpass:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_stencil_op_separate\") private static function lime_gl_stencil_op_separate(face:Int, fail:Int, zfail:Int, zpass:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_image_2d\") private static function lime_gl_tex_image_2d(target:Int, level:Int, internalformat:Int, width:Int, height:Int,\n\t\tborder:Int, format:Int, type:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_image_3d\") private static function lime_gl_tex_image_3d(target:Int, level:Int, internalformat:Int, width:Int, height:Int,\n\t\tdepth:Int, border:Int, format:Int, type:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_parameterf\") private static function lime_gl_tex_parameterf(target:Int, pname:Int, param:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_parameteri\") private static function lime_gl_tex_parameteri(target:Int, pname:Int, param:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_storage_2d\") private static function lime_gl_tex_storage_2d(target:Int, level:Int, internalformat:Int, width:Int,\n\t\theight:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_storage_3d\") private static function lime_gl_tex_storage_3d(target:Int, level:Int, internalformat:Int, width:Int,\n\t\theight:Int, depth:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_sub_image_2d\") private static function lime_gl_tex_sub_image_2d(target:Int, level:Int, xoffset:Int, yoffset:Int,\n\t\twidth:Int, height:Int, format:Int, type:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_tex_sub_image_3d\") private static function lime_gl_tex_sub_image_3d(target:Int, level:Int, xoffset:Int, yoffset:Int,\n\t\tzoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int, data:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_transform_feedback_varyings\") private static function lime_gl_transform_feedback_varyings(program:Int,\n\t\tvaryings:hl.NativeArray<Int>, bufferMode:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform1f\") private static function lime_gl_uniform1f(location:Int, v0:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform1fv\") private static function lime_gl_uniform1fv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform1i\") private static function lime_gl_uniform1i(location:Int, v0:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform1iv\") private static function lime_gl_uniform1iv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform1ui\") private static function lime_gl_uniform1ui(location:Int, v0:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform1uiv\") private static function lime_gl_uniform1uiv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform2f\") private static function lime_gl_uniform2f(location:Int, v0:hl.F32, v1:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform2fv\") private static function lime_gl_uniform2fv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform2i\") private static function lime_gl_uniform2i(location:Int, v0:Int, v1:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform2iv\") private static function lime_gl_uniform2iv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform2ui\") private static function lime_gl_uniform2ui(location:Int, v0:Int, v1:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform2uiv\") private static function lime_gl_uniform2uiv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform3f\") private static function lime_gl_uniform3f(location:Int, v0:hl.F32, v1:hl.F32, v2:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform3fv\") private static function lime_gl_uniform3fv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform3i\") private static function lime_gl_uniform3i(location:Int, v0:Int, v1:Int, v2:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform3iv\") private static function lime_gl_uniform3iv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform3ui\") private static function lime_gl_uniform3ui(location:Int, v0:Int, v1:Int, v2:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform3uiv\") private static function lime_gl_uniform3uiv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform4f\") private static function lime_gl_uniform4f(location:Int, v0:hl.F32, v1:hl.F32, v2:hl.F32, v3:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform4fv\") private static function lime_gl_uniform4fv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform4i\") private static function lime_gl_uniform4i(location:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform4iv\") private static function lime_gl_uniform4iv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform4ui\") private static function lime_gl_uniform4ui(location:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform4uiv\") private static function lime_gl_uniform4uiv(location:Int, count:Int, v:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_block_binding\") private static function lime_gl_uniform_block_binding(program:Int, uniformBlockIndex:Int,\n\t\tuniformBlockBinding:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix2fv\") private static function lime_gl_uniform_matrix2fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix2x3fv\") private static function lime_gl_uniform_matrix2x3fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix2x4fv\") private static function lime_gl_uniform_matrix2x4fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix3fv\") private static function lime_gl_uniform_matrix3fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix3x2fv\") private static function lime_gl_uniform_matrix3x2fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix3x4fv\") private static function lime_gl_uniform_matrix3x4fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix4fv\") private static function lime_gl_uniform_matrix4fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix4x2fv\") private static function lime_gl_uniform_matrix4x2fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_uniform_matrix4x3fv\") private static function lime_gl_uniform_matrix4x3fv(location:Int, count:Int, transpose:Bool,\n\t\tvalue:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_unmap_buffer\") private static function lime_gl_unmap_buffer(target:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_gl_use_program\") private static function lime_gl_use_program(program:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_validate_program\") private static function lime_gl_validate_program(program:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib1f\") private static function lime_gl_vertex_attrib1f(indx:Int, v0:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib1fv\") private static function lime_gl_vertex_attrib1fv(indx:Int, values:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib2f\") private static function lime_gl_vertex_attrib2f(indx:Int, v0:hl.F32, v1:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib2fv\") private static function lime_gl_vertex_attrib2fv(indx:Int, values:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib3f\") private static function lime_gl_vertex_attrib3f(indx:Int, v0:hl.F32, v1:hl.F32, v2:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib3fv\") private static function lime_gl_vertex_attrib3fv(indx:Int, values:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib4f\") private static function lime_gl_vertex_attrib4f(indx:Int, v0:hl.F32, v1:hl.F32, v2:hl.F32, v3:hl.F32):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib4fv\") private static function lime_gl_vertex_attrib4fv(indx:Int, values:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attribi4i\") private static function lime_gl_vertex_attribi4i(indx:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attribi4iv\") private static function lime_gl_vertex_attribi4iv(indx:Int, values:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attribi4ui\") private static function lime_gl_vertex_attribi4ui(indx:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attribi4uiv\") private static function lime_gl_vertex_attribi4uiv(indx:Int, values:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib_divisor\") private static function lime_gl_vertex_attrib_divisor(indx:Int, divisor:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib_ipointer\") private static function lime_gl_vertex_attrib_ipointer(indx:Int, size:Int, type:Int, stride:Int,\n\t\toffset:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_vertex_attrib_pointer\") private static function lime_gl_vertex_attrib_pointer(indx:Int, size:Int, type:Int, normalized:Bool,\n\t\tstride:Int, offset:DataPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_viewport\") private static function lime_gl_viewport(x:Int, y:Int, width:Int, height:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_gl_wait_sync\") private static function lime_gl_wait_sync(sync:CFFIPointer, flags:Int, timeoutA:Int, timeoutB:Int):Void {}\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && lime_harfbuzz)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_hb_blob_create(data:DataPointer, length:Int, memoryMode:Int):CFFIPointer;\n\n\t@:cffi private static function lime_hb_blob_create_sub_blob(parent:CFFIPointer, offset:Int, length:Int):CFFIPointer;\n\n\t@:cffi private static function lime_hb_blob_get_data(blob:CFFIPointer):Float;\n\n\t@:cffi private static function lime_hb_blob_get_data_writable(blob:CFFIPointer):Float;\n\n\t@:cffi private static function lime_hb_blob_get_empty():CFFIPointer;\n\n\t@:cffi private static function lime_hb_blob_get_length(blob:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_blob_is_immutable(blob:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_blob_make_immutable(blob:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_add(buffer:CFFIPointer, codepoint:Int, cluster:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_add_hxstring(buffer:CFFIPointer, text:String, itemOffset:Int, itemLength:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_add_codepoints(buffer:CFFIPointer, text:DataPointer, textLength:Int, itemOffset:Int, itemLength:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_add_utf8(buffer:CFFIPointer, text:String, itemOffset:Int, itemLength:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_add_utf16(buffer:CFFIPointer, text:DataPointer, textLength:Int, itemOffset:Int, itemLength:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_add_utf32(buffer:CFFIPointer, text:DataPointer, textLength:Int, itemOffset:Int, itemLength:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_allocation_successful(buffer:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_buffer_clear_contents(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_create():CFFIPointer;\n\n\t@:cffi private static function lime_hb_buffer_get_cluster_level(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_content_type(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_direction(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_empty():CFFIPointer;\n\n\t@:cffi private static function lime_hb_buffer_get_flags(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_glyph_infos(buffer:CFFIPointer, bytes:Bytes):Bytes;\n\n\t@:cffi private static function lime_hb_buffer_get_glyph_positions(buffer:CFFIPointer, bytes:Bytes):Bytes;\n\n\t@:cffi private static function lime_hb_buffer_get_language(buffer:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_buffer_get_length(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_replacement_codepoint(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_script(buffer:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_buffer_get_segment_properties(buffer:CFFIPointer, props:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_guess_segment_properties(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_normalize_glyphs(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_preallocate(buffer:CFFIPointer, size:Int):Bool;\n\n\t@:cffi private static function lime_hb_buffer_reset(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_reverse(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_reverse_clusters(buffer:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_serialize_format_from_string(str:String):Int;\n\n\t@:cffi private static function lime_hb_buffer_serialize_format_to_string(format:Int):CFFIPointer;\n\n\t@:cffi private static function lime_hb_buffer_serialize_list_formats():CFFIPointer;\n\n\t@:cffi private static function lime_hb_buffer_set_cluster_level(buffer:CFFIPointer, clusterLevel:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_content_type(buffer:CFFIPointer, contentType:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_direction(buffer:CFFIPointer, direction:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_flags(buffer:CFFIPointer, flags:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_language(buffer:CFFIPointer, language:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_length(buffer:CFFIPointer, length:Int):Bool;\n\n\t@:cffi private static function lime_hb_buffer_set_replacement_codepoint(buffer:CFFIPointer, replacement:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_script(buffer:CFFIPointer, script:Int):Void;\n\n\t@:cffi private static function lime_hb_buffer_set_segment_properties(buffer:CFFIPointer, props:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_face_create(blob:CFFIPointer, index:Int):CFFIPointer;\n\n\t@:cffi private static function lime_hb_face_get_empty():CFFIPointer;\n\n\t@:cffi private static function lime_hb_face_get_glyph_count(face:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_face_get_index(face:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_face_get_upem(face:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_face_is_immutable(face:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_face_make_immutable(face:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_face_reference_blob(face:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_face_reference_table(face:CFFIPointer, tag:Int):CFFIPointer;\n\n\t@:cffi private static function lime_hb_face_set_glyph_count(face:CFFIPointer, glyphCount:Int):Void;\n\n\t@:cffi private static function lime_hb_face_set_index(face:CFFIPointer, index:Int):Void;\n\n\t@:cffi private static function lime_hb_face_set_upem(face:CFFIPointer, upem:Int):Void;\n\n\t@:cffi private static function lime_hb_feature_from_string(str:String):CFFIPointer;\n\n\t@:cffi private static function lime_hb_feature_to_string(feature:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_add_glyph_origin_for_direction(font:CFFIPointer, glyph:Int, direction:Int, x:Int, y:Int):Void;\n\n\t@:cffi private static function lime_hb_font_create(face:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_create_sub_font(parent:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_get_empty():CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_get_face(font:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_get_glyph_advance_for_direction(font:CFFIPointer, glyph:Int, direction:Int):Dynamic;\n\n\t@:cffi private static function lime_hb_font_get_glyph_kerning_for_direction(font:CFFIPointer, firstGlyph:Int, secondGlyph:Int, direction:Int):Dynamic;\n\n\t@:cffi private static function lime_hb_font_get_glyph_origin_for_direction(font:CFFIPointer, glyph:Int, direction:Int):Dynamic;\n\n\t@:cffi private static function lime_hb_font_get_parent(font:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_get_ppem(font:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_get_scale(font:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_glyph_from_string(font:CFFIPointer, s:String):Int;\n\n\t@:cffi private static function lime_hb_font_glyph_to_string(font:CFFIPointer, codepoint:Int):CFFIPointer;\n\n\t@:cffi private static function lime_hb_font_is_immutable(font:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_font_make_immutable(font:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_font_set_ppem(font:CFFIPointer, xppem:Int, yppem:Int):Void;\n\n\t@:cffi private static function lime_hb_font_set_scale(font:CFFIPointer, xScale:Int, yScale:Int):Void;\n\n\t@:cffi private static function lime_hb_font_subtract_glyph_origin_for_direction(font:CFFIPointer, glyph:Int, direction:Int, x:Int, y:Int):Void;\n\n\t@:cffi private static function lime_hb_ft_font_create(font:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_ft_font_create_referenced(font:CFFIPointer):CFFIPointer;\n\n\t@:cffi private static function lime_hb_ft_font_get_load_flags(font:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_ft_font_set_load_flags(font:CFFIPointer, loadFlags:Int):Void;\n\n\t@:cffi private static function lime_hb_language_from_string(str:String):CFFIPointer;\n\n\t@:cffi private static function lime_hb_language_get_default():CFFIPointer;\n\n\t@:cffi private static function lime_hb_language_to_string(language:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_hb_segment_properties_equal(a:CFFIPointer, b:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_segment_properties_hash(p:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_set_add(set:CFFIPointer, codepoint:Int):Void;\n\n\t@:cffi private static function lime_hb_set_add_range(set:CFFIPointer, first:Int, last:Int):Void;\n\n\t@:cffi private static function lime_hb_set_allocation_successful(set:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_set_clear(set:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_set_create():CFFIPointer;\n\n\t@:cffi private static function lime_hb_set_del(set:CFFIPointer, codepoint:Int):Void;\n\n\t@:cffi private static function lime_hb_set_del_range(set:CFFIPointer, first:Int, last:Int):Void;\n\n\t@:cffi private static function lime_hb_set_get_empty():CFFIPointer;\n\n\t@:cffi private static function lime_hb_set_get_max(set:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_set_get_min(set:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_set_get_population(set:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_set_has(set:CFFIPointer, codepoint:Int):Bool;\n\n\t@:cffi private static function lime_hb_set_intersect(set:CFFIPointer, other:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_set_invert(set:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_set_is_empty(set:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_set_is_equal(set:CFFIPointer, other:CFFIPointer):Bool;\n\n\t@:cffi private static function lime_hb_set_next(set:CFFIPointer):Int;\n\n\t@:cffi private static function lime_hb_set_next_range(set:CFFIPointer):Dynamic;\n\n\t@:cffi private static function lime_hb_set_set(set:CFFIPointer, other:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_set_subtract(set:CFFIPointer, other:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_set_symmetric_difference(set:CFFIPointer, other:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_set_union(set:CFFIPointer, other:CFFIPointer):Void;\n\n\t@:cffi private static function lime_hb_shape(font:CFFIPointer, buffer:CFFIPointer, features:Dynamic):Void;\n\t#else\n\tprivate static var lime_hb_blob_create = new cpp.Callable<lime.utils.DataPointer->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_blob_create\", \"diio\", false));\n\tprivate static var lime_hb_blob_create_sub_blob = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_blob_create_sub_blob\", \"oiio\", false));\n\tprivate static var lime_hb_blob_get_data = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_blob_get_data\", \"od\", false));\n\tprivate static var lime_hb_blob_get_data_writable = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_blob_get_data_writable\",\n\t\t\"od\", false));\n\tprivate static var lime_hb_blob_get_empty = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_blob_get_empty\", \"o\", false));\n\tprivate static var lime_hb_blob_get_length = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_blob_get_length\", \"oi\", false));\n\tprivate static var lime_hb_blob_is_immutable = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_blob_is_immutable\", \"ob\", false));\n\tprivate static var lime_hb_blob_make_immutable = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_blob_make_immutable\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_hb_buffer_add = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_add\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_hb_buffer_add_hxstring = new cpp.Callable<cpp.Object->String->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_add_hxstring\", \"osiiv\", false));\n\tprivate static var lime_hb_buffer_add_codepoints = new cpp.Callable<cpp.Object->lime.utils.DataPointer->Int->Int->Int->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_add_codepoints\", \"odiiiv\", false));\n\tprivate static var lime_hb_buffer_add_utf8 = new cpp.Callable<cpp.Object->String->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_add_utf8\", \"osiiv\", false));\n\tprivate static var lime_hb_buffer_add_utf16 = new cpp.Callable<cpp.Object->lime.utils.DataPointer->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_add_utf16\", \"odiiiv\", false));\n\tprivate static var lime_hb_buffer_add_utf32 = new cpp.Callable<cpp.Object->lime.utils.DataPointer->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_add_utf32\", \"odiiiv\", false));\n\tprivate static var lime_hb_buffer_allocation_successful = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_allocation_successful\", \"ob\", false));\n\tprivate static var lime_hb_buffer_clear_contents = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_clear_contents\",\n\t\t\"ov\", false));\n\tprivate static var lime_hb_buffer_create = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_create\", \"o\", false));\n\tprivate static var lime_hb_buffer_get_cluster_level = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_cluster_level\",\n\t\t\"oi\", false));\n\tprivate static var lime_hb_buffer_get_content_type = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_content_type\",\n\t\t\"oi\", false));\n\tprivate static var lime_hb_buffer_get_direction = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_direction\", \"oi\",\n\t\tfalse));\n\tprivate static var lime_hb_buffer_get_empty = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_empty\", \"o\", false));\n\tprivate static var lime_hb_buffer_get_flags = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_flags\", \"oi\", false));\n\tprivate static var lime_hb_buffer_get_glyph_infos = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_get_glyph_infos\", \"ooo\", false));\n\tprivate static var lime_hb_buffer_get_glyph_positions = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_get_glyph_positions\", \"ooo\", false));\n\tprivate static var lime_hb_buffer_get_language = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_language\",\n\t\t\"oo\", false));\n\tprivate static var lime_hb_buffer_get_length = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_length\", \"oi\", false));\n\tprivate static var lime_hb_buffer_get_replacement_codepoint = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_get_replacement_codepoint\", \"oi\", false));\n\tprivate static var lime_hb_buffer_get_script = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_get_script\", \"oi\", false));\n\tprivate static var lime_hb_buffer_get_segment_properties = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_get_segment_properties\", \"oov\", false));\n\tprivate static var lime_hb_buffer_guess_segment_properties = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_guess_segment_properties\", \"ov\", false));\n\tprivate static var lime_hb_buffer_normalize_glyphs = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_normalize_glyphs\", \"ov\", false));\n\tprivate static var lime_hb_buffer_preallocate = new cpp.Callable<cpp.Object->Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_preallocate\", \"oib\",\n\t\tfalse));\n\tprivate static var lime_hb_buffer_reset = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_reset\", \"ov\", false));\n\tprivate static var lime_hb_buffer_reverse = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_reverse\", \"ov\", false));\n\tprivate static var lime_hb_buffer_reverse_clusters = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_reverse_clusters\", \"ov\", false));\n\tprivate static var lime_hb_buffer_serialize_format_from_string = new cpp.Callable<String->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_serialize_format_from_string\", \"si\", false));\n\tprivate static var lime_hb_buffer_serialize_format_to_string = new cpp.Callable<Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_serialize_format_to_string\", \"io\", false));\n\tprivate static var lime_hb_buffer_serialize_list_formats = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_serialize_list_formats\", \"o\", false));\n\tprivate static var lime_hb_buffer_set_cluster_level = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_set_cluster_level\", \"oiv\", false));\n\tprivate static var lime_hb_buffer_set_content_type = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_set_content_type\", \"oiv\", false));\n\tprivate static var lime_hb_buffer_set_direction = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_set_direction\",\n\t\t\"oiv\", false));\n\tprivate static var lime_hb_buffer_set_flags = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_set_flags\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_hb_buffer_set_language = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_set_language\", \"oov\", false));\n\tprivate static var lime_hb_buffer_set_length = new cpp.Callable<cpp.Object->Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_set_length\", \"oib\",\n\t\tfalse));\n\tprivate static var lime_hb_buffer_set_replacement_codepoint = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_set_replacement_codepoint\", \"oiv\", false));\n\tprivate static var lime_hb_buffer_set_script = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_buffer_set_script\",\n\t\t\"oiv\", false));\n\tprivate static var lime_hb_buffer_set_segment_properties = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_buffer_set_segment_properties\", \"oov\", false));\n\tprivate static var lime_hb_face_create = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_create\", \"oio\", false));\n\tprivate static var lime_hb_face_get_empty = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_get_empty\", \"o\", false));\n\tprivate static var lime_hb_face_get_glyph_count = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_get_glyph_count\", \"oi\",\n\t\tfalse));\n\tprivate static var lime_hb_face_get_index = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_get_index\", \"oi\", false));\n\tprivate static var lime_hb_face_get_upem = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_get_upem\", \"oi\", false));\n\tprivate static var lime_hb_face_is_immutable = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_is_immutable\", \"ob\", false));\n\tprivate static var lime_hb_face_make_immutable = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_make_immutable\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_hb_face_reference_blob = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_reference_blob\",\n\t\t\"oo\", false));\n\tprivate static var lime_hb_face_reference_table = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_face_reference_table\", \"oio\", false));\n\tprivate static var lime_hb_face_set_glyph_count = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_set_glyph_count\",\n\t\t\"oiv\", false));\n\tprivate static var lime_hb_face_set_index = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_set_index\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_hb_face_set_upem = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_face_set_upem\", \"oiv\",\n\t\tfalse));\n\tprivate static var lime_hb_feature_from_string = new cpp.Callable<String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_feature_from_string\", \"so\",\n\t\tfalse));\n\tprivate static var lime_hb_feature_to_string = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_feature_to_string\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_hb_font_add_glyph_origin_for_direction = new cpp.Callable<cpp.Object->Int->Int->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_font_add_glyph_origin_for_direction\", \"oiiiiv\", false));\n\tprivate static var lime_hb_font_create = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_create\", \"oo\", false));\n\tprivate static var lime_hb_font_create_sub_font = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_create_sub_font\",\n\t\t\"oo\", false));\n\tprivate static var lime_hb_font_get_empty = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_get_empty\", \"o\", false));\n\tprivate static var lime_hb_font_get_face = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_get_face\", \"oo\", false));\n\tprivate static var lime_hb_font_get_glyph_advance_for_direction = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_font_get_glyph_advance_for_direction\", \"oiio\", false));\n\tprivate static var lime_hb_font_get_glyph_kerning_for_direction = new cpp.Callable<cpp.Object->Int->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_font_get_glyph_kerning_for_direction\", \"oiiio\", false));\n\tprivate static var lime_hb_font_get_glyph_origin_for_direction = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_font_get_glyph_origin_for_direction\", \"oiio\", false));\n\tprivate static var lime_hb_font_get_parent = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_get_parent\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_hb_font_get_ppem = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_get_ppem\", \"oo\", false));\n\tprivate static var lime_hb_font_get_scale = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_get_scale\", \"oo\", false));\n\tprivate static var lime_hb_font_glyph_from_string = new cpp.Callable<cpp.Object->String->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_font_glyph_from_string\", \"osi\", false));\n\tprivate static var lime_hb_font_glyph_to_string = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_font_glyph_to_string\", \"oio\", false));\n\tprivate static var lime_hb_font_is_immutable = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_is_immutable\", \"ob\", false));\n\tprivate static var lime_hb_font_make_immutable = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_make_immutable\", \"ov\",\n\t\tfalse));\n\tprivate static var lime_hb_font_set_ppem = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_set_ppem\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_hb_font_set_scale = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_set_scale\",\n\t\t\"oiiv\", false));\n\tprivate static var lime_hb_font_subtract_glyph_origin_for_direction = new cpp.Callable<cpp.Object->Int->Int->Int->Int->\n\t\tcpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_font_subtract_glyph_origin_for_direction\", \"oiiiiv\", false));\n\tprivate static var lime_hb_ft_font_create = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_ft_font_create\", \"oo\", false));\n\tprivate static var lime_hb_ft_font_create_referenced = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_ft_font_create_referenced\", \"oo\", false));\n\tprivate static var lime_hb_ft_font_get_load_flags = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_ft_font_get_load_flags\", \"oi\",\n\t\tfalse));\n\tprivate static var lime_hb_ft_font_set_load_flags = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_ft_font_set_load_flags\", \"oiv\", false));\n\tprivate static var lime_hb_language_from_string = new cpp.Callable<String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_language_from_string\", \"so\",\n\t\tfalse));\n\tprivate static var lime_hb_language_get_default = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_language_get_default\", \"o\",\n\t\tfalse));\n\tprivate static var lime_hb_language_to_string = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_language_to_string\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_hb_segment_properties_equal = new cpp.Callable<cpp.Object->cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_segment_properties_equal\", \"oob\", false));\n\tprivate static var lime_hb_segment_properties_hash = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_segment_properties_hash\",\n\t\t\"oi\", false));\n\tprivate static var lime_hb_set_add = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_add\", \"oiv\", false));\n\tprivate static var lime_hb_set_add_range = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_add_range\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_hb_set_allocation_successful = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_set_allocation_successful\", \"ob\", false));\n\tprivate static var lime_hb_set_clear = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_clear\", \"ov\", false));\n\tprivate static var lime_hb_set_create = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_create\", \"o\", false));\n\tprivate static var lime_hb_set_del = new cpp.Callable<cpp.Object->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_del\", \"oiv\", false));\n\tprivate static var lime_hb_set_del_range = new cpp.Callable<cpp.Object->Int->Int->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_del_range\", \"oiiv\",\n\t\tfalse));\n\tprivate static var lime_hb_set_get_empty = new cpp.Callable<Void->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_get_empty\", \"o\", false));\n\tprivate static var lime_hb_set_get_max = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_get_max\", \"oi\", false));\n\tprivate static var lime_hb_set_get_min = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_get_min\", \"oi\", false));\n\tprivate static var lime_hb_set_get_population = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_get_population\", \"oi\", false));\n\tprivate static var lime_hb_set_has = new cpp.Callable<cpp.Object->Int->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_has\", \"oib\", false));\n\tprivate static var lime_hb_set_intersect = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_intersect\", \"oov\",\n\t\tfalse));\n\tprivate static var lime_hb_set_invert = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_invert\", \"ov\", false));\n\tprivate static var lime_hb_set_is_empty = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_is_empty\", \"ob\", false));\n\tprivate static var lime_hb_set_is_equal = new cpp.Callable<cpp.Object->cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_is_equal\", \"oob\",\n\t\tfalse));\n\tprivate static var lime_hb_set_next = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_next\", \"oi\", false));\n\tprivate static var lime_hb_set_next_range = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_next_range\", \"oo\", false));\n\tprivate static var lime_hb_set_set = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_set\", \"oov\", false));\n\tprivate static var lime_hb_set_subtract = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_subtract\", \"oov\",\n\t\tfalse));\n\tprivate static var lime_hb_set_symmetric_difference = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_hb_set_symmetric_difference\", \"oov\", false));\n\tprivate static var lime_hb_set_union = new cpp.Callable<cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_set_union\", \"oov\", false));\n\tprivate static var lime_hb_shape = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_hb_shape\", \"ooov\",\n\t\tfalse));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_hb_blob_create:lime.utils.DataPointer->Int->Int->Dynamic = CFFI.load(\"lime\", \"lime_hb_blob_create\", 3);\n\tprivate static var lime_hb_blob_create_sub_blob:Dynamic->Int->Int->Dynamic = CFFI.load(\"lime\", \"lime_hb_blob_create_sub_blob\", 3);\n\tprivate static var lime_hb_blob_get_data:Dynamic->Float = CFFI.load(\"lime\", \"lime_hb_blob_get_data\", 1);\n\tprivate static var lime_hb_blob_get_data_writable:Dynamic->Float = CFFI.load(\"lime\", \"lime_hb_blob_get_data_writable\", 1);\n\tprivate static var lime_hb_blob_get_empty:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_blob_get_empty\", 0);\n\tprivate static var lime_hb_blob_get_length:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_blob_get_length\", 1);\n\tprivate static var lime_hb_blob_is_immutable:Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_blob_is_immutable\", 1);\n\tprivate static var lime_hb_blob_make_immutable:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_blob_make_immutable\", 1);\n\tprivate static var lime_hb_buffer_add:Dynamic->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_add\", 3);\n\tprivate static var lime_hb_buffer_add_hxstring:Dynamic->String->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_add_hxstring\", 4);\n\tprivate static var lime_hb_buffer_add_codepoints:Dynamic->lime.utils.DataPointer->Int->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_add_codepoints\",\n\t\t5);\n\tprivate static var lime_hb_buffer_add_utf8:Dynamic->String->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_add_utf8\", 4);\n\tprivate static var lime_hb_buffer_add_utf16:Dynamic->lime.utils.DataPointer->Int->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_add_utf16\", 5);\n\tprivate static var lime_hb_buffer_add_utf32:Dynamic->lime.utils.DataPointer->Int->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_add_utf32\", 5);\n\tprivate static var lime_hb_buffer_allocation_successful:Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_buffer_allocation_successful\", 1);\n\tprivate static var lime_hb_buffer_clear_contents:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_clear_contents\", 1);\n\tprivate static var lime_hb_buffer_create:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_create\", 0);\n\tprivate static var lime_hb_buffer_get_cluster_level:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_cluster_level\", 1);\n\tprivate static var lime_hb_buffer_get_content_type:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_content_type\", 1);\n\tprivate static var lime_hb_buffer_get_direction:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_direction\", 1);\n\tprivate static var lime_hb_buffer_get_empty:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_get_empty\", 0);\n\tprivate static var lime_hb_buffer_get_flags:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_flags\", 1);\n\tprivate static var lime_hb_buffer_get_glyph_infos:Dynamic->Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_get_glyph_infos\", 2);\n\tprivate static var lime_hb_buffer_get_glyph_positions:Dynamic->Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_get_glyph_positions\", 2);\n\tprivate static var lime_hb_buffer_get_language:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_get_language\", 1);\n\tprivate static var lime_hb_buffer_get_length:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_length\", 1);\n\tprivate static var lime_hb_buffer_get_replacement_codepoint:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_replacement_codepoint\", 1);\n\tprivate static var lime_hb_buffer_get_script:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_buffer_get_script\", 1);\n\tprivate static var lime_hb_buffer_get_segment_properties:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_get_segment_properties\", 2);\n\tprivate static var lime_hb_buffer_guess_segment_properties:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_guess_segment_properties\", 1);\n\tprivate static var lime_hb_buffer_normalize_glyphs:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_normalize_glyphs\", 1);\n\tprivate static var lime_hb_buffer_preallocate:Dynamic->Int->Bool = CFFI.load(\"lime\", \"lime_hb_buffer_preallocate\", 2);\n\tprivate static var lime_hb_buffer_reset:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_reset\", 1);\n\tprivate static var lime_hb_buffer_reverse:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_reverse\", 1);\n\tprivate static var lime_hb_buffer_reverse_clusters:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_reverse_clusters\", 1);\n\tprivate static var lime_hb_buffer_serialize_format_from_string:String->Int = CFFI.load(\"lime\", \"lime_hb_buffer_serialize_format_from_string\", 1);\n\tprivate static var lime_hb_buffer_serialize_format_to_string:Int->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_serialize_format_to_string\", 1);\n\tprivate static var lime_hb_buffer_serialize_list_formats:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_buffer_serialize_list_formats\", 0);\n\tprivate static var lime_hb_buffer_set_cluster_level:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_cluster_level\", 2);\n\tprivate static var lime_hb_buffer_set_content_type:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_content_type\", 2);\n\tprivate static var lime_hb_buffer_set_direction:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_direction\", 2);\n\tprivate static var lime_hb_buffer_set_flags:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_flags\", 2);\n\tprivate static var lime_hb_buffer_set_language:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_language\", 2);\n\tprivate static var lime_hb_buffer_set_length:Dynamic->Int->Bool = CFFI.load(\"lime\", \"lime_hb_buffer_set_length\", 2);\n\tprivate static var lime_hb_buffer_set_replacement_codepoint:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_replacement_codepoint\", 2);\n\tprivate static var lime_hb_buffer_set_script:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_script\", 2);\n\tprivate static var lime_hb_buffer_set_segment_properties:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_buffer_set_segment_properties\", 2);\n\tprivate static var lime_hb_face_create:Dynamic->Int->Dynamic = CFFI.load(\"lime\", \"lime_hb_face_create\", 2);\n\tprivate static var lime_hb_face_get_empty:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_face_get_empty\", 0);\n\tprivate static var lime_hb_face_get_glyph_count:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_face_get_glyph_count\", 1);\n\tprivate static var lime_hb_face_get_index:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_face_get_index\", 1);\n\tprivate static var lime_hb_face_get_upem:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_face_get_upem\", 1);\n\tprivate static var lime_hb_face_is_immutable:Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_face_is_immutable\", 1);\n\tprivate static var lime_hb_face_make_immutable:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_face_make_immutable\", 1);\n\tprivate static var lime_hb_face_reference_blob:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_face_reference_blob\", 1);\n\tprivate static var lime_hb_face_reference_table:Dynamic->Int->Dynamic = CFFI.load(\"lime\", \"lime_hb_face_reference_table\", 2);\n\tprivate static var lime_hb_face_set_glyph_count:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_face_set_glyph_count\", 2);\n\tprivate static var lime_hb_face_set_index:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_face_set_index\", 2);\n\tprivate static var lime_hb_face_set_upem:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_face_set_upem\", 2);\n\tprivate static var lime_hb_feature_from_string:String->Dynamic = CFFI.load(\"lime\", \"lime_hb_feature_from_string\", 1);\n\tprivate static var lime_hb_feature_to_string:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_feature_to_string\", 1);\n\tprivate static var lime_hb_font_add_glyph_origin_for_direction:Dynamic->Int->Int->Int->Int->Void = CFFI.load(\"lime\",\n\t\t\"lime_hb_font_add_glyph_origin_for_direction\", 5);\n\tprivate static var lime_hb_font_create:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_create\", 1);\n\tprivate static var lime_hb_font_create_sub_font:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_create_sub_font\", 1);\n\tprivate static var lime_hb_font_get_empty:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_get_empty\", 0);\n\tprivate static var lime_hb_font_get_face:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_get_face\", 1);\n\tprivate static var lime_hb_font_get_glyph_advance_for_direction:Dynamic->Int->Int->Dynamic = CFFI.load(\"lime\",\n\t\t\"lime_hb_font_get_glyph_advance_for_direction\", 3);\n\tprivate static var lime_hb_font_get_glyph_kerning_for_direction:Dynamic->Int->Int->Int->Dynamic = CFFI.load(\"lime\",\n\t\t\"lime_hb_font_get_glyph_kerning_for_direction\", 4);\n\tprivate static var lime_hb_font_get_glyph_origin_for_direction:Dynamic->Int->Int->Dynamic = CFFI.load(\"lime\",\n\t\t\"lime_hb_font_get_glyph_origin_for_direction\", 3);\n\tprivate static var lime_hb_font_get_parent:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_get_parent\", 1);\n\tprivate static var lime_hb_font_get_ppem:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_get_ppem\", 1);\n\tprivate static var lime_hb_font_get_scale:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_get_scale\", 1);\n\tprivate static var lime_hb_font_glyph_from_string:Dynamic->String->Int = CFFI.load(\"lime\", \"lime_hb_font_glyph_from_string\", 2);\n\tprivate static var lime_hb_font_glyph_to_string:Dynamic->Int->Dynamic = CFFI.load(\"lime\", \"lime_hb_font_glyph_to_string\", 2);\n\tprivate static var lime_hb_font_is_immutable:Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_font_is_immutable\", 1);\n\tprivate static var lime_hb_font_make_immutable:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_font_make_immutable\", 1);\n\tprivate static var lime_hb_font_set_ppem:Dynamic->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_font_set_ppem\", 3);\n\tprivate static var lime_hb_font_set_scale:Dynamic->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_font_set_scale\", 3);\n\tprivate static var lime_hb_font_subtract_glyph_origin_for_direction:Dynamic->Int->Int->Int->Int->Void = CFFI.load(\"lime\",\n\t\t\"lime_hb_font_subtract_glyph_origin_for_direction\", 5);\n\tprivate static var lime_hb_ft_font_create:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_ft_font_create\", 1);\n\tprivate static var lime_hb_ft_font_create_referenced:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_ft_font_create_referenced\", 1);\n\tprivate static var lime_hb_ft_font_get_load_flags:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_ft_font_get_load_flags\", 1);\n\tprivate static var lime_hb_ft_font_set_load_flags:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_ft_font_set_load_flags\", 2);\n\tprivate static var lime_hb_language_from_string:String->Dynamic = CFFI.load(\"lime\", \"lime_hb_language_from_string\", 1);\n\tprivate static var lime_hb_language_get_default:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_language_get_default\", 0);\n\tprivate static var lime_hb_language_to_string:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_language_to_string\", 1);\n\tprivate static var lime_hb_segment_properties_equal:Dynamic->Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_segment_properties_equal\", 2);\n\tprivate static var lime_hb_segment_properties_hash:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_segment_properties_hash\", 1);\n\tprivate static var lime_hb_set_add:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_set_add\", 2);\n\tprivate static var lime_hb_set_add_range:Dynamic->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_set_add_range\", 3);\n\tprivate static var lime_hb_set_allocation_successful:Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_set_allocation_successful\", 1);\n\tprivate static var lime_hb_set_clear:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_clear\", 1);\n\tprivate static var lime_hb_set_create:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_set_create\", 0);\n\tprivate static var lime_hb_set_del:Dynamic->Int->Void = CFFI.load(\"lime\", \"lime_hb_set_del\", 2);\n\tprivate static var lime_hb_set_del_range:Dynamic->Int->Int->Void = CFFI.load(\"lime\", \"lime_hb_set_del_range\", 3);\n\tprivate static var lime_hb_set_get_empty:Void->Dynamic = CFFI.load(\"lime\", \"lime_hb_set_get_empty\", 0);\n\tprivate static var lime_hb_set_get_max:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_set_get_max\", 1);\n\tprivate static var lime_hb_set_get_min:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_set_get_min\", 1);\n\tprivate static var lime_hb_set_get_population:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_set_get_population\", 1);\n\tprivate static var lime_hb_set_has:Dynamic->Int->Bool = CFFI.load(\"lime\", \"lime_hb_set_has\", 2);\n\tprivate static var lime_hb_set_intersect:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_intersect\", 2);\n\tprivate static var lime_hb_set_invert:Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_invert\", 1);\n\tprivate static var lime_hb_set_is_empty:Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_set_is_empty\", 1);\n\tprivate static var lime_hb_set_is_equal:Dynamic->Dynamic->Bool = CFFI.load(\"lime\", \"lime_hb_set_is_equal\", 2);\n\tprivate static var lime_hb_set_next:Dynamic->Int = CFFI.load(\"lime\", \"lime_hb_set_next\", 1);\n\tprivate static var lime_hb_set_next_range:Dynamic->Dynamic = CFFI.load(\"lime\", \"lime_hb_set_next_range\", 1);\n\tprivate static var lime_hb_set_set:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_set\", 2);\n\tprivate static var lime_hb_set_subtract:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_subtract\", 2);\n\tprivate static var lime_hb_set_symmetric_difference:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_symmetric_difference\", 2);\n\tprivate static var lime_hb_set_union:Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_set_union\", 2);\n\tprivate static var lime_hb_shape:Dynamic->Dynamic->Dynamic->Void = CFFI.load(\"lime\", \"lime_hb_shape\", 3);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_hb_blob_create\") private static function lime_hb_blob_create(data:DataPointer, length:Int, memoryMode:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_create_sub_blob\") private static function lime_hb_blob_create_sub_blob(parent:CFFIPointer, offset:Int,\n\t\t\tlength:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_get_data\") private static function lime_hb_blob_get_data(blob:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_get_data_writable\") private static function lime_hb_blob_get_data_writable(blob:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_get_empty\") private static function lime_hb_blob_get_empty():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_get_length\") private static function lime_hb_blob_get_length(blob:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_is_immutable\") private static function lime_hb_blob_is_immutable(blob:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_blob_make_immutable\") private static function lime_hb_blob_make_immutable(blob:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_add\") private static function lime_hb_buffer_add(buffer:CFFIPointer, codepoint:Int, cluster:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_add_hxstring\") private static function lime_hb_buffer_add_hxstring(buffer:CFFIPointer, text:String, itemOffset:Int,\n\t\titemLength:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_add_codepoints\") private static function lime_hb_buffer_add_codepoints(buffer:CFFIPointer, text:DataPointer,\n\t\ttextLength:Int, itemOffset:Int, itemLength:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_add_utf8\") private static function lime_hb_buffer_add_utf8(buffer:CFFIPointer, text:String, itemOffset:Int,\n\t\titemLength:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_add_utf16\") private static function lime_hb_buffer_add_utf16(buffer:CFFIPointer, text:DataPointer, textLength:Int,\n\t\titemOffset:Int, itemLength:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_add_utf32\") private static function lime_hb_buffer_add_utf32(buffer:CFFIPointer, text:DataPointer, textLength:Int,\n\t\titemOffset:Int, itemLength:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_allocation_successful\") private static function lime_hb_buffer_allocation_successful(buffer:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_clear_contents\") private static function lime_hb_buffer_clear_contents(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_create\") private static function lime_hb_buffer_create():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_cluster_level\") private static function lime_hb_buffer_get_cluster_level(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_content_type\") private static function lime_hb_buffer_get_content_type(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_direction\") private static function lime_hb_buffer_get_direction(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_empty\") private static function lime_hb_buffer_get_empty():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_flags\") private static function lime_hb_buffer_get_flags(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_glyph_infos\") private static function lime_hb_buffer_get_glyph_infos(buffer:CFFIPointer, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_glyph_positions\") private static function lime_hb_buffer_get_glyph_positions(buffer:CFFIPointer, bytes:Bytes):Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_language\") private static function lime_hb_buffer_get_language(buffer:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_length\") private static function lime_hb_buffer_get_length(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_replacement_codepoint\") private static function lime_hb_buffer_get_replacement_codepoint(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_script\") private static function lime_hb_buffer_get_script(buffer:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_get_segment_properties\") private static function lime_hb_buffer_get_segment_properties(buffer:CFFIPointer,\n\t\tprops:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_guess_segment_properties\") private static function lime_hb_buffer_guess_segment_properties(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_normalize_glyphs\") private static function lime_hb_buffer_normalize_glyphs(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_preallocate\") private static function lime_hb_buffer_preallocate(buffer:CFFIPointer, size:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_reset\") private static function lime_hb_buffer_reset(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_reverse\") private static function lime_hb_buffer_reverse(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_reverse_clusters\") private static function lime_hb_buffer_reverse_clusters(buffer:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_serialize_format_from_string\") private static function lime_hb_buffer_serialize_format_from_string(str:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_serialize_format_to_string\") private static function lime_hb_buffer_serialize_format_to_string(format:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_serialize_list_formats\") private static function lime_hb_buffer_serialize_list_formats():hl.NativeArray<hl.Bytes>\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_cluster_level\") private static function lime_hb_buffer_set_cluster_level(buffer:CFFIPointer,\n\t\tclusterLevel:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_content_type\") private static function lime_hb_buffer_set_content_type(buffer:CFFIPointer, contentType:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_direction\") private static function lime_hb_buffer_set_direction(buffer:CFFIPointer, direction:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_flags\") private static function lime_hb_buffer_set_flags(buffer:CFFIPointer, flags:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_language\") private static function lime_hb_buffer_set_language(buffer:CFFIPointer, language:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_length\") private static function lime_hb_buffer_set_length(buffer:CFFIPointer, length:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_replacement_codepoint\") private static function lime_hb_buffer_set_replacement_codepoint(buffer:CFFIPointer,\n\t\treplacement:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_script\") private static function lime_hb_buffer_set_script(buffer:CFFIPointer, script:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_buffer_set_segment_properties\") private static function lime_hb_buffer_set_segment_properties(buffer:CFFIPointer,\n\t\tprops:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_create\") private static function lime_hb_face_create(blob:CFFIPointer, index:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_get_empty\") private static function lime_hb_face_get_empty():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_get_glyph_count\") private static function lime_hb_face_get_glyph_count(face:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_get_index\") private static function lime_hb_face_get_index(face:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_get_upem\") private static function lime_hb_face_get_upem(face:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_is_immutable\") private static function lime_hb_face_is_immutable(face:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_make_immutable\") private static function lime_hb_face_make_immutable(face:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_reference_blob\") private static function lime_hb_face_reference_blob(face:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_reference_table\") private static function lime_hb_face_reference_table(face:CFFIPointer, tag:Int):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_set_glyph_count\") private static function lime_hb_face_set_glyph_count(face:CFFIPointer, glyphCount:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_set_index\") private static function lime_hb_face_set_index(face:CFFIPointer, index:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_face_set_upem\") private static function lime_hb_face_set_upem(face:CFFIPointer, upem:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_feature_from_string\") private static function lime_hb_feature_from_string(str:String):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_feature_to_string\") private static function lime_hb_feature_to_string(feature:CFFIPointer):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_add_glyph_origin_for_direction\") private static function lime_hb_font_add_glyph_origin_for_direction(font:CFFIPointer,\n\t\tglyph:Int, direction:Int, x:Int, y:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_create\") private static function lime_hb_font_create(face:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_create_sub_font\") private static function lime_hb_font_create_sub_font(parent:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_empty\") private static function lime_hb_font_get_empty():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_face\") private static function lime_hb_font_get_face(font:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_glyph_advance_for_direction\") private static function lime_hb_font_get_glyph_advance_for_direction(font:CFFIPointer,\n\t\t\tglyph:Int, direction:Int, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_glyph_kerning_for_direction\") private static function lime_hb_font_get_glyph_kerning_for_direction(font:CFFIPointer,\n\t\t\tfirstGlyph:Int, secondGlyph:Int, direction:Int, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_glyph_origin_for_direction\") private static function lime_hb_font_get_glyph_origin_for_direction(font:CFFIPointer,\n\t\t\tglyph:Int, direction:Int, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_parent\") private static function lime_hb_font_get_parent(font:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_ppem\") private static function lime_hb_font_get_ppem(font:CFFIPointer, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_get_scale\") private static function lime_hb_font_get_scale(font:CFFIPointer, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_glyph_from_string\") private static function lime_hb_font_glyph_from_string(font:CFFIPointer, s:String):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_glyph_to_string\") private static function lime_hb_font_glyph_to_string(font:CFFIPointer, codepoint:Int):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_is_immutable\") private static function lime_hb_font_is_immutable(font:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_make_immutable\") private static function lime_hb_font_make_immutable(font:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_set_ppem\") private static function lime_hb_font_set_ppem(font:CFFIPointer, xppem:Int, yppem:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_font_set_scale\") private static function lime_hb_font_set_scale(font:CFFIPointer, xScale:Int, yScale:Int):Void {}\n\n\t@:hlNative(\"lime\",\n\t\t\"hl_hb_font_subtract_glyph_origin_for_direction\") private static function lime_hb_font_subtract_glyph_origin_for_direction(font:CFFIPointer,\n\t\tglyph:Int, direction:Int, x:Int, y:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_ft_font_create\") private static function lime_hb_ft_font_create(font:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_ft_font_create_referenced\") private static function lime_hb_ft_font_create_referenced(font:CFFIPointer):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_ft_font_get_load_flags\") private static function lime_hb_ft_font_get_load_flags(font:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_ft_font_set_load_flags\") private static function lime_hb_ft_font_set_load_flags(font:CFFIPointer, loadFlags:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_language_from_string\") private static function lime_hb_language_from_string(str:String):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_language_get_default\") private static function lime_hb_language_get_default():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_language_to_string\") private static function lime_hb_language_to_string(language:CFFIPointer):hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_segment_properties_equal\") private static function lime_hb_segment_properties_equal(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_segment_properties_hash\") private static function lime_hb_segment_properties_hash(p:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_add\") private static function lime_hb_set_add(set:CFFIPointer, codepoint:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_add_range\") private static function lime_hb_set_add_range(set:CFFIPointer, first:Int, last:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_allocation_successful\") private static function lime_hb_set_allocation_successful(set:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_clear\") private static function lime_hb_set_clear(set:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_create\") private static function lime_hb_set_create():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_del\") private static function lime_hb_set_del(set:CFFIPointer, codepoint:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_del_range\") private static function lime_hb_set_del_range(set:CFFIPointer, first:Int, last:Int):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_get_empty\") private static function lime_hb_set_get_empty():CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_get_max\") private static function lime_hb_set_get_max(set:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_get_min\") private static function lime_hb_set_get_min(set:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_get_population\") private static function lime_hb_set_get_population(set:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_has\") private static function lime_hb_set_has(set:CFFIPointer, codepoint:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_intersect\") private static function lime_hb_set_intersect(set:CFFIPointer, other:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_invert\") private static function lime_hb_set_invert(set:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_is_empty\") private static function lime_hb_set_is_empty(set:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_is_equal\") private static function lime_hb_set_is_equal(set:CFFIPointer, other:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_next\") private static function lime_hb_set_next(set:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_next_range\") private static function lime_hb_set_next_range(set:CFFIPointer, out:Vector2):Vector2\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_set\") private static function lime_hb_set_set(set:CFFIPointer, other:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_subtract\") private static function lime_hb_set_subtract(set:CFFIPointer, other:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_symmetric_difference\") private static function lime_hb_set_symmetric_difference(set:CFFIPointer, other:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_set_union\") private static function lime_hb_set_union(set:CFFIPointer, other:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_hb_shape\") private static function lime_hb_shape(font:CFFIPointer, buffer:CFFIPointer,\n\t\tfeatures:hl.NativeArray<CFFIPointer>):Void {}\n\t#end\n\t#end\n\t#if (lime_cffi && !macro && lime_vorbis)\n\t#if (cpp && !cppia)\n\t#if (disable_cffi || haxe_ver < \"3.4.0\")\n\t@:cffi private static function lime_vorbis_file_bitrate(vorbisFile:Dynamic, bitstream:Int):Int;\n\n\t@:cffi private static function lime_vorbis_file_bitrate_instant(vorbisFile:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_clear(vorbisFile:Dynamic):Void;\n\n\t@:cffi private static function lime_vorbis_file_comment(vorbisFile:Dynamic, bitstream:Int):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_crosslap(vorbisFile:Dynamic, otherVorbisFile:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_from_bytes(bytes:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_from_file(path:String):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_info(vorbisFile:Dynamic, bitstream:Int):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_pcm_seek(vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_pcm_seek_lap(vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_pcm_seek_page(vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_pcm_seek_page_lap(vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_raw_seek(vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_raw_seek_lap(vorbisFile:Dynamic, posLow:Dynamic, posHigh:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_pcm_tell(vorbisFile:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_pcm_total(vorbisFile:Dynamic, bitstream:Int):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_raw_tell(vorbisFile:Dynamic):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_raw_total(vorbisFile:Dynamic, bitstream:Int):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_read(vorbisFile:Dynamic, buffer:Dynamic, position:Int, length:Int, bigendianp:Bool, word:Int,\n\t\tsigned:Bool):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_read_float(vorbisFile:Dynamic, pcmChannels:Dynamic, samples:Int):Dynamic;\n\n\t@:cffi private static function lime_vorbis_file_seekable(vorbisFile:Dynamic):Bool;\n\n\t@:cffi private static function lime_vorbis_file_serial_number(vorbisFile:Dynamic, bitstream:Int):Int;\n\n\t@:cffi private static function lime_vorbis_file_streams(vorbisFile:Dynamic):Int;\n\n\t@:cffi private static function lime_vorbis_file_time_seek(vorbisFile:Dynamic, s:Float):Int;\n\n\t@:cffi private static function lime_vorbis_file_time_seek_lap(vorbisFile:Dynamic, s:Float):Int;\n\n\t@:cffi private static function lime_vorbis_file_time_seek_page(vorbisFile:Dynamic, s:Float):Int;\n\n\t@:cffi private static function lime_vorbis_file_time_seek_page_lap(vorbisFile:Dynamic, s:Float):Int;\n\n\t@:cffi private static function lime_vorbis_file_time_tell(vorbisFile:Dynamic):Float;\n\n\t@:cffi private static function lime_vorbis_file_time_total(vorbisFile:Dynamic, bitstream:Int):Float;\n\t#else\n\tprivate static var lime_vorbis_file_bitrate = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_bitrate\", \"oii\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_bitrate_instant = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_bitrate_instant\",\n\t\t\"oi\", false));\n\tprivate static var lime_vorbis_file_clear = new cpp.Callable<cpp.Object->cpp.Void>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_clear\", \"ov\", false));\n\tprivate static var lime_vorbis_file_comment = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_comment\",\n\t\t\"oio\", false));\n\tprivate static var lime_vorbis_file_crosslap = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_crosslap\", \"ooo\", false));\n\tprivate static var lime_vorbis_file_from_bytes = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_from_bytes\",\n\t\t\"oo\", false));\n\tprivate static var lime_vorbis_file_from_file = new cpp.Callable<String->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_from_file\", \"so\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_info = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_info\", \"oio\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_pcm_seek = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_pcm_seek\", \"oooi\", false));\n\tprivate static var lime_vorbis_file_pcm_seek_lap = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_pcm_seek_lap\", \"oooi\", false));\n\tprivate static var lime_vorbis_file_pcm_seek_page = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_pcm_seek_page\", \"oooi\", false));\n\tprivate static var lime_vorbis_file_pcm_seek_page_lap = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_pcm_seek_page_lap\", \"oooi\", false));\n\tprivate static var lime_vorbis_file_raw_seek = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_raw_seek\", \"oooi\", false));\n\tprivate static var lime_vorbis_file_raw_seek_lap = new cpp.Callable<cpp.Object->cpp.Object->cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_raw_seek_lap\", \"oooi\", false));\n\tprivate static var lime_vorbis_file_pcm_tell = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_pcm_tell\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_pcm_total = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_pcm_total\",\n\t\t\"oio\", false));\n\tprivate static var lime_vorbis_file_raw_tell = new cpp.Callable<cpp.Object->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_raw_tell\", \"oo\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_raw_total = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_raw_total\",\n\t\t\"oio\", false));\n\tprivate static var lime_vorbis_file_read = new cpp.Callable<cpp.Object->cpp.Object->Int->Int->Bool->Int->Bool->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_read\", \"ooiibibo\", false));\n\tprivate static var lime_vorbis_file_read_float = new cpp.Callable<cpp.Object->cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_read_float\", \"ooio\", false));\n\tprivate static var lime_vorbis_file_seekable = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_seekable\", \"ob\", false));\n\tprivate static var lime_vorbis_file_serial_number = new cpp.Callable<cpp.Object->Int->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_serial_number\",\n\t\t\"oii\", false));\n\tprivate static var lime_vorbis_file_streams = new cpp.Callable<cpp.Object->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_streams\", \"oi\", false));\n\tprivate static var lime_vorbis_file_time_seek = new cpp.Callable<cpp.Object->Float->Int>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_time_seek\", \"odi\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_time_seek_lap = new cpp.Callable<cpp.Object->Float->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_time_seek_lap\", \"odi\", false));\n\tprivate static var lime_vorbis_file_time_seek_page = new cpp.Callable<cpp.Object->Float->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_time_seek_page\", \"odi\", false));\n\tprivate static var lime_vorbis_file_time_seek_page_lap = new cpp.Callable<cpp.Object->Float->Int>(cpp.Prime._loadPrime(\"lime\",\n\t\t\"lime_vorbis_file_time_seek_page_lap\", \"odi\", false));\n\tprivate static var lime_vorbis_file_time_tell = new cpp.Callable<cpp.Object->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_time_tell\", \"od\",\n\t\tfalse));\n\tprivate static var lime_vorbis_file_time_total = new cpp.Callable<cpp.Object->Int->Float>(cpp.Prime._loadPrime(\"lime\", \"lime_vorbis_file_time_total\",\n\t\t\"oid\", false));\n\t#end\n\t#end\n\t#if (neko || cppia)\n\tprivate static var lime_vorbis_file_bitrate = CFFI.load(\"lime\", \"lime_vorbis_file_bitrate\", 2);\n\tprivate static var lime_vorbis_file_bitrate_instant = CFFI.load(\"lime\", \"lime_vorbis_file_bitrate_instant\", 1);\n\tprivate static var lime_vorbis_file_clear = CFFI.load(\"lime\", \"lime_vorbis_file_clear\", 1);\n\tprivate static var lime_vorbis_file_comment = CFFI.load(\"lime\", \"lime_vorbis_file_comment\", 2);\n\tprivate static var lime_vorbis_file_crosslap = CFFI.load(\"lime\", \"lime_vorbis_file_crosslap\", 2);\n\tprivate static var lime_vorbis_file_from_bytes = CFFI.load(\"lime\", \"lime_vorbis_file_from_bytes\", 1);\n\tprivate static var lime_vorbis_file_from_file = CFFI.load(\"lime\", \"lime_vorbis_file_from_file\", 1);\n\tprivate static var lime_vorbis_file_info = CFFI.load(\"lime\", \"lime_vorbis_file_info\", 2);\n\tprivate static var lime_vorbis_file_pcm_seek = CFFI.load(\"lime\", \"lime_vorbis_file_pcm_seek\", 3);\n\tprivate static var lime_vorbis_file_pcm_seek_lap = CFFI.load(\"lime\", \"lime_vorbis_file_pcm_seek_lap\", 3);\n\tprivate static var lime_vorbis_file_pcm_seek_page = CFFI.load(\"lime\", \"lime_vorbis_file_pcm_seek_page\", 3);\n\tprivate static var lime_vorbis_file_pcm_seek_page_lap = CFFI.load(\"lime\", \"lime_vorbis_file_pcm_seek_page_lap\", 3);\n\tprivate static var lime_vorbis_file_raw_seek = CFFI.load(\"lime\", \"lime_vorbis_file_raw_seek\", 3);\n\tprivate static var lime_vorbis_file_raw_seek_lap = CFFI.load(\"lime\", \"lime_vorbis_file_raw_seek_lap\", 3);\n\tprivate static var lime_vorbis_file_pcm_tell = CFFI.load(\"lime\", \"lime_vorbis_file_pcm_tell\", 1);\n\tprivate static var lime_vorbis_file_pcm_total = CFFI.load(\"lime\", \"lime_vorbis_file_pcm_total\", 2);\n\tprivate static var lime_vorbis_file_raw_tell = CFFI.load(\"lime\", \"lime_vorbis_file_raw_tell\", 1);\n\tprivate static var lime_vorbis_file_raw_total = CFFI.load(\"lime\", \"lime_vorbis_file_raw_total\", 2);\n\tprivate static var lime_vorbis_file_read = CFFI.load(\"lime\", \"lime_vorbis_file_read\", -1);\n\tprivate static var lime_vorbis_file_read_float = CFFI.load(\"lime\", \"lime_vorbis_file_read_float\", 3);\n\tprivate static var lime_vorbis_file_seekable = CFFI.load(\"lime\", \"lime_vorbis_file_seekable\", 1);\n\tprivate static var lime_vorbis_file_serial_number = CFFI.load(\"lime\", \"lime_vorbis_file_serial_number\", 2);\n\tprivate static var lime_vorbis_file_streams = CFFI.load(\"lime\", \"lime_vorbis_file_streams\", 1);\n\tprivate static var lime_vorbis_file_time_seek = CFFI.load(\"lime\", \"lime_vorbis_file_time_seek\", 2);\n\tprivate static var lime_vorbis_file_time_seek_lap = CFFI.load(\"lime\", \"lime_vorbis_file_time_seek_lap\", 2);\n\tprivate static var lime_vorbis_file_time_seek_page = CFFI.load(\"lime\", \"lime_vorbis_file_time_seek_page\", 2);\n\tprivate static var lime_vorbis_file_time_seek_page_lap = CFFI.load(\"lime\", \"lime_vorbis_file_time_seek_page_lap\", 2);\n\tprivate static var lime_vorbis_file_time_tell = CFFI.load(\"lime\", \"lime_vorbis_file_time_tell\", 1);\n\tprivate static var lime_vorbis_file_time_total = CFFI.load(\"lime\", \"lime_vorbis_file_time_total\", 2);\n\t#end\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_vorbis_file_bitrate\") private static function lime_vorbis_file_bitrate(vorbisFile:CFFIPointer, bitstream:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_bitrate_instant\") private static function lime_vorbis_file_bitrate_instant(vorbisFile:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_clear\") private static function lime_vorbis_file_clear(vorbisFile:CFFIPointer):Void {}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_comment\") private static function lime_vorbis_file_comment(vorbisFile:CFFIPointer, bitstream:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_crosslap\") private static function lime_vorbis_file_crosslap(vorbisFile:CFFIPointer, otherVorbisFile:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_from_bytes\") private static function lime_vorbis_file_from_bytes(bytes:Bytes):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_from_file\") private static function lime_vorbis_file_from_file(path:String):CFFIPointer\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_info\") private static function lime_vorbis_file_info(vorbisFile:CFFIPointer, bitstream:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_pcm_seek\") private static function lime_vorbis_file_pcm_seek(vorbisFile:CFFIPointer, posLow:Int, posHigh:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_pcm_seek_lap\") private static function lime_vorbis_file_pcm_seek_lap(vorbisFile:CFFIPointer, posLow:Int,\n\t\t\tposHigh:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_pcm_seek_page\") private static function lime_vorbis_file_pcm_seek_page(vorbisFile:CFFIPointer, posLow:Int,\n\t\t\tposHigh:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_pcm_seek_page_lap\") private static function lime_vorbis_file_pcm_seek_page_lap(vorbisFile:CFFIPointer, posLow:Int,\n\t\t\tposHigh:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_raw_seek\") private static function lime_vorbis_file_raw_seek(vorbisFile:CFFIPointer, posLow:Int, posHigh:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_raw_seek_lap\") private static function lime_vorbis_file_raw_seek_lap(vorbisFile:CFFIPointer, posLow:Int,\n\t\t\tposHigh:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_pcm_tell\") private static function lime_vorbis_file_pcm_tell(vorbisFile:CFFIPointer):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_pcm_total\") private static function lime_vorbis_file_pcm_total(vorbisFile:CFFIPointer, bitstream:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_raw_tell\") private static function lime_vorbis_file_raw_tell(vorbisFile:CFFIPointer):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_raw_total\") private static function lime_vorbis_file_raw_total(vorbisFile:CFFIPointer, bitstream:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_read\") private static function lime_vorbis_file_read(vorbisFile:CFFIPointer, buffer:Bytes, position:Int, length:Int,\n\t\t\tbigendianp:Bool, word:Int, signed:Bool):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_read_float\") private static function lime_vorbis_file_read_float(vorbisFile:CFFIPointer, pcmChannels:Bytes,\n\t\t\tsamples:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_seekable\") private static function lime_vorbis_file_seekable(vorbisFile:CFFIPointer):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_serial_number\") private static function lime_vorbis_file_serial_number(vorbisFile:CFFIPointer, bitstream:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_streams\") private static function lime_vorbis_file_streams(vorbisFile:CFFIPointer):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_time_seek\") private static function lime_vorbis_file_time_seek(vorbisFile:CFFIPointer, s:Float):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_time_seek_lap\") private static function lime_vorbis_file_time_seek_lap(vorbisFile:CFFIPointer, s:Float):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_time_seek_page\") private static function lime_vorbis_file_time_seek_page(vorbisFile:CFFIPointer, s:Float):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_time_seek_page_lap\") private static function lime_vorbis_file_time_seek_page_lap(vorbisFile:CFFIPointer, s:Float):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_time_tell\") private static function lime_vorbis_file_time_tell(vorbisFile:CFFIPointer):Float\n\t{\n\t\treturn 0;\n\t}\n\n\t@:hlNative(\"lime\", \"hl_vorbis_file_time_total\") private static function lime_vorbis_file_time_total(vorbisFile:CFFIPointer, bitstream:Int):Float\n\t{\n\t\treturn 0;\n\t}\n\t#end\n\t#end\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/native/NativeHTTPRequest.hx",
    "content": "package lime._internal.backend.native;\n\nimport haxe.io.Bytes;\nimport haxe.io.BytesBuffer;\nimport haxe.Timer;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.net.curl.CURL;\nimport lime.net.curl.CURLCode;\nimport lime.net.curl.CURLMulti;\nimport lime.net.curl.CURLMultiCode;\nimport lime.net.curl.CURLMultiMessage;\nimport lime.net.HTTPRequest;\nimport lime.net.HTTPRequestHeader;\nimport lime.net.HTTPRequestMethod;\nimport lime.system.ThreadPool;\nimport lime.system.WorkOutput;\n#if sys\n#if haxe4\nimport sys.thread.Deque;\n#elseif cpp\nimport cpp.vm.Deque;\n#elseif neko\nimport neko.vm.Deque;\n#end\nimport sys.FileSystem;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass NativeHTTPRequest\n{\n\tprivate static var activeInstances:Array<NativeHTTPRequest>;\n\tprivate static var localThreadPool:ThreadPool;\n\tprivate static var multi:CURLMulti;\n\tprivate static var multiInstances:Map<CURL, NativeHTTPRequest>;\n\tprivate static var multiProgressTimer:Timer;\n\tprivate static var multiThreadPool:ThreadPool;\n\tprivate static var multiThreadPoolRunning:Bool;\n\t#if (cpp || neko || hl)\n\tprivate static var multiAddHandle:Deque<CURL>;\n\t#end\n\tprivate static var cookieList:Array<String>;\n\n\tprivate var buffer:BytesBuffer = new BytesBuffer();\n\tprivate var bytes:Bytes;\n\tprivate var bytesLoaded:Int;\n\tprivate var bytesTotal:Int;\n\tprivate var canceled:Bool;\n\tprivate var curl:CURL;\n\tprivate var parent:_IHTTPRequest;\n\tprivate var promise:Promise<Bytes>;\n\tprivate var writeBytesLoaded:Int;\n\tprivate var writeBytesTotal:Int;\n\tprivate var timeout:Timer;\n\n\tpublic function new()\n\t{\n\t\tcurl = null;\n\t\ttimeout = null;\n\t}\n\n\tpublic function cancel():Void\n\t{\n\t\tcanceled = true;\n\n\t\tif (curl != null)\n\t\t{\n\t\t\t// This is probably run from a different thread if cURL is running\n\t\t\t// TODO\n\n\t\t\t// CURLEasy.cleanup (curl);\n\t\t\t// CURLEasy.reset (curl);\n\t\t\t// CURLEasy.perform (curl);\n\t\t}\n\n\t\tif (timeout != null)\n\t\t{\n\t\t\ttimeout.stop();\n\t\t\ttimeout = null;\n\t\t}\n\t}\n\n\tpublic function init(parent:_IHTTPRequest):Void\n\t{\n\t\tthis.parent = parent;\n\t}\n\n\tprivate function initRequest(uri:String, binary:Bool):Void\n\t{\n\t\tbytes = Bytes.alloc(0);\n\n\t\tbytesLoaded = 0;\n\t\tbytesTotal = 0;\n\t\twriteBytesLoaded = 0;\n\t\twriteBytesTotal = 0;\n\n\t\tif (curl == null)\n\t\t{\n\t\t\tcurl = new CURL();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcurl.reset();\n\t\t}\n\n\t\tvar data = parent.data;\n\t\tvar query = \"\";\n\n\t\tif (data == null)\n\t\t{\n\t\t\tfor (key in parent.formData.keys())\n\t\t\t{\n\t\t\t\tif (query.length > 0) query += \"&\";\n\t\t\t\tquery += StringTools.urlEncode(key) + \"=\" + StringTools.urlEncode(Std.string(parent.formData.get(key)));\n\t\t\t}\n\n\t\t\tif (query != \"\")\n\t\t\t{\n\t\t\t\tif (parent.method == GET)\n\t\t\t\t{\n\t\t\t\t\tif (uri.indexOf(\"?\") > -1)\n\t\t\t\t\t{\n\t\t\t\t\t\turi += \"&\" + query;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\turi += \"?\" + query;\n\t\t\t\t\t}\n\n\t\t\t\t\tquery = \"\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdata = Bytes.ofString(query);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (data != null && data.length == 0) data = null;\n\t\t}\n\n\t\tcurl.setOption(URL, uri);\n\n\t\tswitch (parent.method)\n\t\t{\n\t\t\tcase HEAD:\n\t\t\t\tcurl.setOption(NOBODY, true);\n\n\t\t\tcase GET:\n\t\t\t\tcurl.setOption(HTTPGET, true);\n\n\t\t\tcase POST:\n\t\t\t\tcurl.setOption(POST, true);\n\n\t\t\t\tif (data != null)\n\t\t\t\t{\n\t\t\t\t\tcurl.setOption(INFILE, data);\n\t\t\t\t\tcurl.setOption(INFILESIZE, data.length);\n\t\t\t\t\tcurl.setOption(POSTFIELDSIZE, data.length);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcurl.setOption(POSTFIELDSIZE, 0);\n\t\t\t\t}\n\n\t\t\tcase PUT:\n\t\t\t\tcurl.setOption(UPLOAD, true);\n\n\t\t\t\tif (data != null)\n\t\t\t\t{\n\t\t\t\t\tcurl.setOption(INFILE, data);\n\t\t\t\t\tcurl.setOption(INFILESIZE, data.length);\n\t\t\t\t}\n\n\t\t\tcase _:\n\t\t\t\tcurl.setOption(CUSTOMREQUEST, Std.string(parent.method));\n\n\t\t\t\tif (data != null)\n\t\t\t\t{\n\t\t\t\t\tcurl.setOption(INFILE, data);\n\t\t\t\t\tcurl.setOption(INFILESIZE, data.length);\n\t\t\t\t}\n\t\t}\n\n\t\tcurl.setOption(FOLLOWLOCATION, parent.followRedirects);\n\t\tcurl.setOption(AUTOREFERER, true);\n\n\t\tvar headers = [];\n\t\theaders.push(\"Expect: \");\n\n\t\tvar contentType = null;\n\n\t\tfor (header in cast(parent.headers, Array<Dynamic>))\n\t\t{\n\t\t\tif (header.name == \"Content-Type\")\n\t\t\t{\n\t\t\t\tcontentType = header.value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\theaders.push('${header.name}: ${header.value}');\n\t\t\t}\n\t\t}\n\n\t\tif (parent.contentType != null)\n\t\t{\n\t\t\tcontentType = parent.contentType;\n\t\t}\n\n\t\tif (contentType == null)\n\t\t{\n\t\t\tif (parent.data != null)\n\t\t\t{\n\t\t\t\tcontentType = \"application/octet-stream\";\n\t\t\t}\n\t\t\telse if (query != \"\")\n\t\t\t{\n\t\t\t\tcontentType = \"application/x-www-form-urlencoded\";\n\t\t\t}\n\t\t}\n\n\t\tif (contentType != null)\n\t\t{\n\t\t\theaders.push(\"Content-Type: \" + contentType);\n\t\t}\n\n\t\tcurl.setOption(HTTPHEADER, headers);\n\n\t\tcurl.setOption(PROGRESSFUNCTION, curl_onProgress);\n\t\tcurl.setOption(WRITEFUNCTION, curl_onWrite);\n\n\t\tif (parent.enableResponseHeaders)\n\t\t{\n\t\t\tparent.responseHeaders = [];\n\t\t\tcurl.setOption(HEADERFUNCTION, curl_onHeader);\n\t\t}\n\n\t\tif (parent.manageCookies)\n\t\t{\n\t\t\t// an empty string means store cookies in memory\n\t\t\t// cookies are stored only for the current session\n\t\t\tcurl.setOption(COOKIEFILE, \"\");\n\t\t\tif (cookieList != null)\n\t\t\t{\n\t\t\t\tfor (cookie in cookieList)\n\t\t\t\t{\n\t\t\t\t\t// pass in each stored cookie individually\n\t\t\t\t\tcurl.setOption(COOKIELIST, cookie);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcurl.setOption(SSL_VERIFYPEER, false);\n\t\tcurl.setOption(SSL_VERIFYHOST, 0);\n\t\tcurl.setOption(USERAGENT, parent.userAgent == null ? \"libcurl-agent/1.0\" : parent.userAgent);\n\n\t\t// curl.setOption (CONNECTTIMEOUT, 30);\n\t\tcurl.setOption(NOSIGNAL, true);\n\n\t\tcurl.setOption(TRANSFERTEXT, !binary);\n\n\t\t#if curl_verbose\n\t\tcurl.setOption(VERBOSE, true);\n\t\t#end\n\t}\n\n\tpublic function loadData(uri:String, binary:Bool = true):Future<Bytes>\n\t{\n\t\tif (uri == null)\n\t\t{\n\t\t\treturn cast Future.withError(\"The URI must not be null\");\n\t\t}\n\n\t\tvar promise = new Promise<Bytes>();\n\t\tthis.promise = promise;\n\n\t\tcanceled = false;\n\n\t\tif (uri.indexOf(\"http://\") == -1 && uri.indexOf(\"https://\") == -1)\n\t\t{\n\t\t\tif (localThreadPool == null)\n\t\t\t{\n\t\t\t\tlocalThreadPool = new ThreadPool(0, 1);\n\t\t\t\tlocalThreadPool.onProgress.add(localThreadPool_onProgress);\n\t\t\t\tlocalThreadPool.onComplete.add(localThreadPool_onComplete);\n\t\t\t\tlocalThreadPool.onError.add(localThreadPool_onError);\n\t\t\t}\n\n\t\t\tlocalThreadPool.run(localThreadPool_doWork, {instance: this, uri: uri});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (multi == null)\n\t\t\t{\n\t\t\t\tCURL.globalInit(CURL.GLOBAL_ALL);\n\n\t\t\t\tmulti = new CURLMulti();\n\t\t\t\tactiveInstances = new Array();\n\t\t\t\tmultiInstances = new Map();\n\t\t\t}\n\n\t\t\tinitRequest(uri, binary);\n\n\t\t\tif (curl != null)\n\t\t\t{\n\t\t\t\tactiveInstances.push(this);\n\t\t\t\tmultiInstances.set(curl, this);\n\n\t\t\t\t#if (cpp || neko || hl)\n\t\t\t\tif (multiAddHandle == null) multiAddHandle = new Deque<CURL>();\n\t\t\t\tmultiAddHandle.add(curl);\n\t\t\t\t#end\n\n\t\t\t\tif (multiThreadPool == null)\n\t\t\t\t{\n\t\t\t\t\tmultiThreadPool = new ThreadPool(0, 1);\n\t\t\t\t\tmultiThreadPool.onProgress.add(multiThreadPool_onProgress);\n\t\t\t\t\tmultiThreadPool.onComplete.add(multiThreadPool_onComplete);\n\t\t\t\t}\n\n\t\t\t\tif (!multiThreadPoolRunning)\n\t\t\t\t{\n\t\t\t\t\tmultiThreadPoolRunning = true;\n\t\t\t\t\tmultiThreadPool.run(multiThreadPool_doWork, multi);\n\t\t\t\t}\n\n\t\t\t\tif (multiProgressTimer == null)\n\t\t\t\t{\n\t\t\t\t\tmultiProgressTimer = new Timer(8);\n\t\t\t\t\tmultiProgressTimer.run = multiProgressTimer_onRun;\n\t\t\t\t\tmultiProgressTimer_onRun();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn promise.future;\n\t}\n\n\tpublic function loadText(uri:String):Future<String>\n\t{\n\t\tvar promise = new Promise<String>();\n\t\tvar future = loadData(uri, false);\n\n\t\tfuture.onProgress(promise.progress);\n\t\tfuture.onError(promise.error);\n\n\t\tfuture.onComplete(function(bytes)\n\t\t{\n\t\t\tif (bytes == null)\n\t\t\t{\n\t\t\t\tpromise.complete(null);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpromise.complete(bytes.getString(0, bytes.length));\n\t\t\t}\n\t\t});\n\n\t\treturn promise.future;\n\t}\n\n\tprivate function buildBuffer()\t{\n\t\tbytes = buffer.getBytes();\n\t\treturn bytes;\n\t}\n\n\t// Event Handlers\n\tprivate function curl_onHeader(curl:CURL, header:String):Void\n\t{\n\t\tvar parts = header.split(': ');\n\n\t\tif (parts.length == 2)\n\t\t{\n\t\t\tparent.responseHeaders.push(new HTTPRequestHeader(StringTools.trim(parts[0]), StringTools.trim(parts[1])));\n\t\t}\n\t}\n\n\tprivate function curl_onProgress(curl:CURL, dltotal:Float, dlnow:Float, uptotal:Float, upnow:Float):Int\n\t{\n\t\tif (upnow > writeBytesLoaded || dlnow > writeBytesLoaded || uptotal > writeBytesTotal || dltotal > writeBytesTotal)\n\t\t{\n\t\t\tif (upnow > writeBytesLoaded) writeBytesLoaded = Std.int(upnow);\n\t\t\tif (dlnow > writeBytesLoaded) writeBytesLoaded = Std.int(dlnow);\n\t\t\tif (uptotal > writeBytesTotal) writeBytesTotal = Std.int(uptotal);\n\t\t\tif (dltotal > writeBytesTotal) writeBytesTotal = Std.int(dltotal);\n\n\t\t\t// Wrong thread\n\t\t\t// promise.progress (bytesLoaded, bytesTotal);\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tprivate function curl_onWrite(curl:CURL, output:Bytes):Int\n\t{\n\t\tbuffer.addBytes(output, 0, output.length);\n\n\t\treturn output.length;\n\t}\n\n\tprivate static function localThreadPool_doWork(state:Dynamic, output:WorkOutput):Void\n\t{\n\t\tvar instance:NativeHTTPRequest = state.instance;\n\t\tvar path:String = state.uri;\n\n\t\tvar index = path.indexOf(\"?\");\n\n\t\tif (index > -1)\n\t\t{\n\t\t\tpath = path.substring(0, index);\n\t\t}\n\n\t\t#if (sys && !windows)\n\t\tif (StringTools.startsWith(path, \"~/\"))\n\t\t{\n\t\t\tpath = Sys.getEnv(\"HOME\") + \"/\" + path.substr(2);\n\t\t}\n\t\t#end\n\n\t\tif (path == null #if (sys && !android) || !FileSystem.exists(path) #end)\n\t\t{\n\t\t\toutput.sendError({instance: instance, promise: instance.promise, error: \"Cannot load file: \" + path});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tinstance.bytes = lime.utils.Bytes.fromFile(path);\n\n\t\t\tif (instance.bytes != null)\n\t\t\t{\n\t\t\t\toutput.sendProgress(\n\t\t\t\t\t{\n\t\t\t\t\t\tinstance: instance,\n\t\t\t\t\t\tpromise: instance.promise,\n\t\t\t\t\t\tbytesLoaded: instance.bytes.length,\n\t\t\t\t\t\tbytesTotal: instance.bytes.length\n\t\t\t\t\t});\n\t\t\t\toutput.sendComplete({instance: instance, promise: instance.promise, result: instance.bytes});\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\toutput.sendError({instance: instance, promise: instance.promise, error: \"Cannot load file: \" + path});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function localThreadPool_onComplete(state:{instance:NativeHTTPRequest, promise:Promise<Bytes>, result:Bytes}):Void\n\t{\n\t\tvar promise:Promise<Bytes> = state.promise;\n\t\tif (promise.isError) return;\n\t\tpromise.complete(state.result);\n\n\t\tvar instance = state.instance;\n\n\t\tif (instance.timeout != null)\n\t\t{\n\t\t\tinstance.timeout.stop();\n\t\t\tinstance.timeout = null;\n\t\t}\n\n\t\tinstance.bytes = null;\n\t\tinstance.promise = null;\n\t}\n\n\tprivate static function localThreadPool_onError(state:{instance:NativeHTTPRequest, promise:Promise<Bytes>, error:String}):Void\n\t{\n\t\tvar promise:Promise<Bytes> = state.promise;\n\t\tpromise.error(new _HTTPRequestErrorResponse(state.error, null));\n\n\t\tvar instance = state.instance;\n\n\t\tif (instance.timeout != null)\n\t\t{\n\t\t\tinstance.timeout.stop();\n\t\t\tinstance.timeout = null;\n\t\t}\n\n\t\tinstance.bytes = null;\n\t\tinstance.promise = null;\n\t}\n\n\tprivate static function localThreadPool_onProgress(state:\n\t\t{\n\t\t\tinstance:NativeHTTPRequest,\n\t\t\tpromise:Promise<Bytes>,\n\t\t\tbytesLoaded:Int,\n\t\t\tbytesTotal:Int\n\t\t}):Void\n\t{\n\t\tvar promise:Promise<Bytes> = state.promise;\n\t\tif (promise.isComplete || promise.isError) return;\n\t\tpromise.progress(state.bytesLoaded, state.bytesTotal);\n\t}\n\n\tprivate static function multiThreadPool_doWork(multi:CURLMulti, output:WorkOutput):Void\n\t{\n\t\twhile (true)\n\t\t{\n\t\t\t#if (cpp || neko || hl)\n\t\t\tvar curl = multiAddHandle.pop(false);\n\t\t\tif (curl != null) multi.addHandle(curl);\n\t\t\t#end\n\n\t\t\tvar code = multi.wait(1000);\n\n\t\t\tif (code == CURLMultiCode.OK)\n\t\t\t{\n\t\t\t\tmulti.perform();\n\t\t\t\tvar message = multi.infoRead();\n\n\t\t\t\tif (message == null && multi.runningHandles == 0)\n\t\t\t\t{\n\t\t\t\t\toutput.sendComplete();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\twhile (message != null)\n\t\t\t\t{\n\t\t\t\t\tvar curl = message.curl;\n\t\t\t\t\tvar status = curl.getInfo(RESPONSE_CODE);\n\n\t\t\t\t\t// returns an array of cookie values\n\t\t\t\t\tcookieList = curl.getInfo(COOKIELIST);\n\n\t\t\t\t\tmulti.removeHandle(curl);\n\t\t\t\t\tcurl.cleanup();\n\n\t\t\t\t\toutput.sendProgress({curl: curl, result: message.result, status: status});\n\t\t\t\t\tmessage = multi.infoRead();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function multiThreadPool_onComplete(_):Void\n\t{\n\t\t#if (cpp || neko || hl)\n\t\tvar curl = multiAddHandle.pop(false);\n\n\t\tif (curl != null)\n\t\t{\n\t\t\tmultiAddHandle.push(curl);\n\t\t\tmultiThreadPool.run(multiThreadPool_doWork, multi);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (multiProgressTimer != null)\n\t\t\t{\n\t\t\t\tmultiProgressTimer.stop();\n\t\t\t\tmultiProgressTimer = null;\n\t\t\t}\n\n\t\t\tmultiThreadPoolRunning = false;\n\t\t}\n\t\t#end\n\t}\n\n\tprivate static function multiThreadPool_onProgress(state:{curl:CURL, result:Int, status:Int}):Void\n\t{\n\t\tif (multiInstances.exists(state.curl))\n\t\t{\n\t\t\tvar instance = multiInstances.get(state.curl);\n\t\t\tactiveInstances.remove(instance);\n\t\t\tmultiInstances.remove(state.curl);\n\n\t\t\tinstance.parent.responseStatus = state.status;\n\n\t\t\tif (state.result == CURLCode.OK)\n\t\t\t{\n\t\t\t\tif ((state.status >= 200 && state.status < 400) || state.status == 0)\n\t\t\t\t{\n\t\t\t\t\tif (!instance.promise.isError)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstance.promise.complete(instance.buildBuffer());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (instance.bytes != null)\n\t\t\t\t{\n\t\t\t\t\tvar error = instance.bytes.getString(0, instance.bytes.length);\n\t\t\t\t\tvar responseData = instance.buildBuffer();\n\t\t\t\t\tinstance.promise.error(new _HTTPRequestErrorResponse(error, responseData));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar error = 'Status ${state.status}';\n\t\t\t\t\tvar responseData = instance.buildBuffer();\n\t\t\t\t\tinstance.promise.error(new _HTTPRequestErrorResponse(error, responseData));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar error = CURL.strerror(state.result);\n\t\t\t\tinstance.promise.error(new _HTTPRequestErrorResponse(error, null));\n\t\t\t}\n\n\t\t\tif (instance.timeout != null)\n\t\t\t{\n\t\t\t\tinstance.timeout.stop();\n\t\t\t\tinstance.timeout = null;\n\t\t\t}\n\n\t\t\tinstance.bytes = null;\n\t\t\tinstance.promise = null;\n\t\t}\n\n\t\tstate.curl = null;\n\t}\n\n\tprivate static function multiProgressTimer_onRun():Void\n\t{\n\t\tfor (instance in activeInstances)\n\t\t{\n\t\t\tif (instance.bytesLoaded != instance.writeBytesLoaded || instance.bytesTotal != instance.writeBytesTotal)\n\t\t\t{\n\t\t\t\tinstance.bytesLoaded = instance.writeBytesLoaded;\n\t\t\t\tinstance.bytesTotal = instance.writeBytesTotal;\n\t\t\t\tinstance.promise.progress(instance.bytesLoaded, instance.bytesTotal);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/native/NativeOpenGLRenderContext.hx",
    "content": "package lime._internal.backend.native;\n\nimport haxe.io.Bytes;\nimport haxe.Int64;\nimport lime.graphics.opengl.ext.*;\nimport lime.graphics.opengl.GLQuery;\nimport lime.graphics.opengl.GLSampler;\nimport lime.graphics.opengl.GLSync;\nimport lime.graphics.opengl.GLTransformFeedback;\nimport lime.graphics.opengl.GLVertexArrayObject;\nimport lime.graphics.opengl.GLActiveInfo;\nimport lime.graphics.opengl.GLBuffer;\nimport lime.graphics.opengl.GLContextAttributes;\nimport lime.graphics.opengl.GLFramebuffer;\nimport lime.graphics.opengl.GLProgram;\nimport lime.graphics.opengl.GLRenderbuffer;\nimport lime.graphics.opengl.GLShader;\nimport lime.graphics.opengl.GLShaderPrecisionFormat;\nimport lime.graphics.opengl.GLTexture;\nimport lime.graphics.opengl.GLUniformLocation;\nimport lime.graphics.opengl.GL;\nimport lime.graphics.RenderContextType;\nimport lime.system.CFFI;\nimport lime.utils.DataPointer;\nimport lime.utils.Float32Array;\nimport lime.utils.Int32Array;\nimport lime.utils.UInt32Array;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:dox(hide)\n@:allow(lime.ui.Window)\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.graphics.opengl)\nclass NativeOpenGLRenderContext\n{\n\tprivate static var __extensionObjects:Map<String, Dynamic>;\n\tprivate static var __extensionObjectConstructors = new Map<String, Void->Dynamic>();\n\tprivate static var __lastContextID = 0;\n\tprivate static var __supportedExtensions:Array<String>;\n\n\tpublic var DEPTH_BUFFER_BIT = 0x00000100;\n\tpublic var STENCIL_BUFFER_BIT = 0x00000400;\n\tpublic var COLOR_BUFFER_BIT = 0x00004000;\n\tpublic var POINTS = 0x0000;\n\tpublic var LINES = 0x0001;\n\tpublic var LINE_LOOP = 0x0002;\n\tpublic var LINE_STRIP = 0x0003;\n\tpublic var TRIANGLES = 0x0004;\n\tpublic var TRIANGLE_STRIP = 0x0005;\n\tpublic var TRIANGLE_FAN = 0x0006;\n\tpublic var ZERO = 0;\n\tpublic var ONE = 1;\n\tpublic var SRC_COLOR = 0x0300;\n\tpublic var ONE_MINUS_SRC_COLOR = 0x0301;\n\tpublic var SRC_ALPHA = 0x0302;\n\tpublic var ONE_MINUS_SRC_ALPHA = 0x0303;\n\tpublic var DST_ALPHA = 0x0304;\n\tpublic var ONE_MINUS_DST_ALPHA = 0x0305;\n\tpublic var DST_COLOR = 0x0306;\n\tpublic var ONE_MINUS_DST_COLOR = 0x0307;\n\tpublic var SRC_ALPHA_SATURATE = 0x0308;\n\tpublic var FUNC_ADD = 0x8006;\n\tpublic var BLEND_EQUATION = 0x8009;\n\tpublic var BLEND_EQUATION_RGB = 0x8009;\n\tpublic var BLEND_EQUATION_ALPHA = 0x883D;\n\tpublic var FUNC_SUBTRACT = 0x800A;\n\tpublic var FUNC_REVERSE_SUBTRACT = 0x800B;\n\tpublic var BLEND_DST_RGB = 0x80C8;\n\tpublic var BLEND_SRC_RGB = 0x80C9;\n\tpublic var BLEND_DST_ALPHA = 0x80CA;\n\tpublic var BLEND_SRC_ALPHA = 0x80CB;\n\tpublic var CONSTANT_COLOR = 0x8001;\n\tpublic var ONE_MINUS_CONSTANT_COLOR = 0x8002;\n\tpublic var CONSTANT_ALPHA = 0x8003;\n\tpublic var ONE_MINUS_CONSTANT_ALPHA = 0x8004;\n\tpublic var BLEND_COLOR = 0x8005;\n\tpublic var ARRAY_BUFFER = 0x8892;\n\tpublic var ELEMENT_ARRAY_BUFFER = 0x8893;\n\tpublic var ARRAY_BUFFER_BINDING = 0x8894;\n\tpublic var ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;\n\tpublic var STREAM_DRAW = 0x88E0;\n\tpublic var STATIC_DRAW = 0x88E4;\n\tpublic var DYNAMIC_DRAW = 0x88E8;\n\tpublic var BUFFER_SIZE = 0x8764;\n\tpublic var BUFFER_USAGE = 0x8765;\n\tpublic var CURRENT_VERTEX_ATTRIB = 0x8626;\n\tpublic var FRONT = 0x0404;\n\tpublic var BACK = 0x0405;\n\tpublic var FRONT_AND_BACK = 0x0408;\n\tpublic var TEXTURE_2D = 0x0DE1;\n\tpublic var CULL_FACE = 0x0B44;\n\tpublic var BLEND = 0x0BE2;\n\tpublic var DITHER = 0x0BD0;\n\tpublic var STENCIL_TEST = 0x0B90;\n\tpublic var DEPTH_TEST = 0x0B71;\n\tpublic var SCISSOR_TEST = 0x0C11;\n\tpublic var POLYGON_OFFSET_FILL = 0x8037;\n\tpublic var SAMPLE_ALPHA_TO_COVERAGE = 0x809E;\n\tpublic var SAMPLE_COVERAGE = 0x80A0;\n\tpublic var NO_ERROR = 0;\n\tpublic var INVALID_ENUM = 0x0500;\n\tpublic var INVALID_VALUE = 0x0501;\n\tpublic var INVALID_OPERATION = 0x0502;\n\tpublic var OUT_OF_MEMORY = 0x0505;\n\tpublic var CW = 0x0900;\n\tpublic var CCW = 0x0901;\n\tpublic var LINE_WIDTH = 0x0B21;\n\tpublic var ALIASED_POINT_SIZE_RANGE = 0x846D;\n\tpublic var ALIASED_LINE_WIDTH_RANGE = 0x846E;\n\tpublic var CULL_FACE_MODE = 0x0B45;\n\tpublic var FRONT_FACE = 0x0B46;\n\tpublic var DEPTH_RANGE = 0x0B70;\n\tpublic var DEPTH_WRITEMASK = 0x0B72;\n\tpublic var DEPTH_CLEAR_VALUE = 0x0B73;\n\tpublic var DEPTH_FUNC = 0x0B74;\n\tpublic var STENCIL_CLEAR_VALUE = 0x0B91;\n\tpublic var STENCIL_FUNC = 0x0B92;\n\tpublic var STENCIL_FAIL = 0x0B94;\n\tpublic var STENCIL_PASS_DEPTH_FAIL = 0x0B95;\n\tpublic var STENCIL_PASS_DEPTH_PASS = 0x0B96;\n\tpublic var STENCIL_REF = 0x0B97;\n\tpublic var STENCIL_VALUE_MASK = 0x0B93;\n\tpublic var STENCIL_WRITEMASK = 0x0B98;\n\tpublic var STENCIL_BACK_FUNC = 0x8800;\n\tpublic var STENCIL_BACK_FAIL = 0x8801;\n\tpublic var STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;\n\tpublic var STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;\n\tpublic var STENCIL_BACK_REF = 0x8CA3;\n\tpublic var STENCIL_BACK_VALUE_MASK = 0x8CA4;\n\tpublic var STENCIL_BACK_WRITEMASK = 0x8CA5;\n\tpublic var VIEWPORT = 0x0BA2;\n\tpublic var SCISSOR_BOX = 0x0C10;\n\tpublic var COLOR_CLEAR_VALUE = 0x0C22;\n\tpublic var COLOR_WRITEMASK = 0x0C23;\n\tpublic var UNPACK_ALIGNMENT = 0x0CF5;\n\tpublic var PACK_ALIGNMENT = 0x0D05;\n\tpublic var MAX_TEXTURE_SIZE = 0x0D33;\n\tpublic var MAX_VIEWPORT_DIMS = 0x0D3A;\n\tpublic var SUBPIXEL_BITS = 0x0D50;\n\tpublic var RED_BITS = 0x0D52;\n\tpublic var GREEN_BITS = 0x0D53;\n\tpublic var BLUE_BITS = 0x0D54;\n\tpublic var ALPHA_BITS = 0x0D55;\n\tpublic var DEPTH_BITS = 0x0D56;\n\tpublic var STENCIL_BITS = 0x0D57;\n\tpublic var POLYGON_OFFSET_UNITS = 0x2A00;\n\tpublic var POLYGON_OFFSET_FACTOR = 0x8038;\n\tpublic var TEXTURE_BINDING_2D = 0x8069;\n\tpublic var SAMPLE_BUFFERS = 0x80A8;\n\tpublic var SAMPLES = 0x80A9;\n\tpublic var SAMPLE_COVERAGE_VALUE = 0x80AA;\n\tpublic var SAMPLE_COVERAGE_INVERT = 0x80AB;\n\tpublic var NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2;\n\tpublic var COMPRESSED_TEXTURE_FORMATS = 0x86A3;\n\tpublic var DONT_CARE = 0x1100;\n\tpublic var FASTEST = 0x1101;\n\tpublic var NICEST = 0x1102;\n\tpublic var GENERATE_MIPMAP_HINT = 0x8192;\n\tpublic var BYTE = 0x1400;\n\tpublic var UNSIGNED_BYTE = 0x1401;\n\tpublic var SHORT = 0x1402;\n\tpublic var UNSIGNED_SHORT = 0x1403;\n\tpublic var INT = 0x1404;\n\tpublic var UNSIGNED_INT = 0x1405;\n\tpublic var FLOAT = 0x1406;\n\tpublic var FIXED = 0x0140C;\n\tpublic var DEPTH_COMPONENT = 0x1902;\n\tpublic var ALPHA = 0x1906;\n\tpublic var RGB = 0x1907;\n\tpublic var RGBA = 0x1908;\n\tpublic var LUMINANCE = 0x1909;\n\tpublic var LUMINANCE_ALPHA = 0x190A;\n\tpublic var UNSIGNED_SHORT_4_4_4_4 = 0x8033;\n\tpublic var UNSIGNED_SHORT_5_5_5_1 = 0x8034;\n\tpublic var UNSIGNED_SHORT_5_6_5 = 0x8363;\n\tpublic var FRAGMENT_SHADER = 0x8B30;\n\tpublic var VERTEX_SHADER = 0x8B31;\n\tpublic var MAX_VERTEX_ATTRIBS = 0x8869;\n\tpublic var MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;\n\tpublic var MAX_VARYING_VECTORS = 0x8DFC;\n\tpublic var MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;\n\tpublic var MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;\n\tpublic var MAX_TEXTURE_IMAGE_UNITS = 0x8872;\n\tpublic var MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;\n\tpublic var SHADER_TYPE = 0x8B4F;\n\tpublic var DELETE_STATUS = 0x8B80;\n\tpublic var LINK_STATUS = 0x8B82;\n\tpublic var VALIDATE_STATUS = 0x8B83;\n\tpublic var ATTACHED_SHADERS = 0x8B85;\n\tpublic var ACTIVE_UNIFORMS = 0x8B86;\n\tpublic var ACTIVE_UNIFORMS_MAX_LENGTH = 0x8B87;\n\tpublic var ACTIVE_ATTRIBUTES = 0x8B89;\n\tpublic var ACTIVE_ATTRIBUTES_MAX_LENGTH = 0x8B8A;\n\tpublic var SHADING_LANGUAGE_VERSION = 0x8B8C;\n\tpublic var CURRENT_PROGRAM = 0x8B8D;\n\tpublic var NEVER = 0x0200;\n\tpublic var LESS = 0x0201;\n\tpublic var EQUAL = 0x0202;\n\tpublic var LEQUAL = 0x0203;\n\tpublic var GREATER = 0x0204;\n\tpublic var NOTEQUAL = 0x0205;\n\tpublic var GEQUAL = 0x0206;\n\tpublic var ALWAYS = 0x0207;\n\tpublic var KEEP = 0x1E00;\n\tpublic var REPLACE = 0x1E01;\n\tpublic var INCR = 0x1E02;\n\tpublic var DECR = 0x1E03;\n\tpublic var INVERT = 0x150A;\n\tpublic var INCR_WRAP = 0x8507;\n\tpublic var DECR_WRAP = 0x8508;\n\tpublic var VENDOR = 0x1F00;\n\tpublic var RENDERER = 0x1F01;\n\tpublic var VERSION = 0x1F02;\n\tpublic var EXTENSIONS = 0x1F03;\n\tpublic var NEAREST = 0x2600;\n\tpublic var LINEAR = 0x2601;\n\tpublic var NEAREST_MIPMAP_NEAREST = 0x2700;\n\tpublic var LINEAR_MIPMAP_NEAREST = 0x2701;\n\tpublic var NEAREST_MIPMAP_LINEAR = 0x2702;\n\tpublic var LINEAR_MIPMAP_LINEAR = 0x2703;\n\tpublic var TEXTURE_MAG_FILTER = 0x2800;\n\tpublic var TEXTURE_MIN_FILTER = 0x2801;\n\tpublic var TEXTURE_WRAP_S = 0x2802;\n\tpublic var TEXTURE_WRAP_T = 0x2803;\n\tpublic var TEXTURE = 0x1702;\n\tpublic var TEXTURE_CUBE_MAP = 0x8513;\n\tpublic var TEXTURE_BINDING_CUBE_MAP = 0x8514;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;\n\tpublic var MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;\n\tpublic var TEXTURE0 = 0x84C0;\n\tpublic var TEXTURE1 = 0x84C1;\n\tpublic var TEXTURE2 = 0x84C2;\n\tpublic var TEXTURE3 = 0x84C3;\n\tpublic var TEXTURE4 = 0x84C4;\n\tpublic var TEXTURE5 = 0x84C5;\n\tpublic var TEXTURE6 = 0x84C6;\n\tpublic var TEXTURE7 = 0x84C7;\n\tpublic var TEXTURE8 = 0x84C8;\n\tpublic var TEXTURE9 = 0x84C9;\n\tpublic var TEXTURE10 = 0x84CA;\n\tpublic var TEXTURE11 = 0x84CB;\n\tpublic var TEXTURE12 = 0x84CC;\n\tpublic var TEXTURE13 = 0x84CD;\n\tpublic var TEXTURE14 = 0x84CE;\n\tpublic var TEXTURE15 = 0x84CF;\n\tpublic var TEXTURE16 = 0x84D0;\n\tpublic var TEXTURE17 = 0x84D1;\n\tpublic var TEXTURE18 = 0x84D2;\n\tpublic var TEXTURE19 = 0x84D3;\n\tpublic var TEXTURE20 = 0x84D4;\n\tpublic var TEXTURE21 = 0x84D5;\n\tpublic var TEXTURE22 = 0x84D6;\n\tpublic var TEXTURE23 = 0x84D7;\n\tpublic var TEXTURE24 = 0x84D8;\n\tpublic var TEXTURE25 = 0x84D9;\n\tpublic var TEXTURE26 = 0x84DA;\n\tpublic var TEXTURE27 = 0x84DB;\n\tpublic var TEXTURE28 = 0x84DC;\n\tpublic var TEXTURE29 = 0x84DD;\n\tpublic var TEXTURE30 = 0x84DE;\n\tpublic var TEXTURE31 = 0x84DF;\n\tpublic var ACTIVE_TEXTURE = 0x84E0;\n\tpublic var REPEAT = 0x2901;\n\tpublic var CLAMP_TO_EDGE = 0x812F;\n\tpublic var MIRRORED_REPEAT = 0x8370;\n\tpublic var FLOAT_VEC2 = 0x8B50;\n\tpublic var FLOAT_VEC3 = 0x8B51;\n\tpublic var FLOAT_VEC4 = 0x8B52;\n\tpublic var INT_VEC2 = 0x8B53;\n\tpublic var INT_VEC3 = 0x8B54;\n\tpublic var INT_VEC4 = 0x8B55;\n\tpublic var BOOL = 0x8B56;\n\tpublic var BOOL_VEC2 = 0x8B57;\n\tpublic var BOOL_VEC3 = 0x8B58;\n\tpublic var BOOL_VEC4 = 0x8B59;\n\tpublic var FLOAT_MAT2 = 0x8B5A;\n\tpublic var FLOAT_MAT3 = 0x8B5B;\n\tpublic var FLOAT_MAT4 = 0x8B5C;\n\tpublic var SAMPLER_2D = 0x8B5E;\n\tpublic var SAMPLER_CUBE = 0x8B60;\n\tpublic var VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;\n\tpublic var VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;\n\tpublic var VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;\n\tpublic var VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;\n\tpublic var VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;\n\tpublic var VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;\n\tpublic var VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;\n\tpublic var IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;\n\tpublic var IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;\n\tpublic var VERTEX_PROGRAM_POINT_SIZE = 0x8642;\n\tpublic var POINT_SPRITE = 0x8861;\n\tpublic var COMPILE_STATUS = 0x8B81;\n\tpublic var INFO_LOG_LENGTH = 0x8B84;\n\tpublic var SHADER_SOURCE_LENGTH = 0x8B88;\n\tpublic var SHADER_COMPILER = 0x8DFA;\n\tpublic var SHADER_BINARY_FORMATS = 0x8DF8;\n\tpublic var NUM_SHADER_BINARY_FORMATS = 0x8DF9;\n\tpublic var LOW_FLOAT = 0x8DF0;\n\tpublic var MEDIUM_FLOAT = 0x8DF1;\n\tpublic var HIGH_FLOAT = 0x8DF2;\n\tpublic var LOW_INT = 0x8DF3;\n\tpublic var MEDIUM_INT = 0x8DF4;\n\tpublic var HIGH_INT = 0x8DF5;\n\tpublic var FRAMEBUFFER = 0x8D40;\n\tpublic var RENDERBUFFER = 0x8D41;\n\tpublic var RGBA4 = 0x8056;\n\tpublic var RGB5_A1 = 0x8057;\n\tpublic var RGB565 = 0x8D62;\n\tpublic var DEPTH_COMPONENT16 = 0x81A5;\n\tpublic var STENCIL_INDEX = 0x1901;\n\tpublic var STENCIL_INDEX8 = 0x8D48;\n\tpublic var DEPTH_STENCIL = 0x84F9;\n\tpublic var RENDERBUFFER_WIDTH = 0x8D42;\n\tpublic var RENDERBUFFER_HEIGHT = 0x8D43;\n\tpublic var RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;\n\tpublic var RENDERBUFFER_RED_SIZE = 0x8D50;\n\tpublic var RENDERBUFFER_GREEN_SIZE = 0x8D51;\n\tpublic var RENDERBUFFER_BLUE_SIZE = 0x8D52;\n\tpublic var RENDERBUFFER_ALPHA_SIZE = 0x8D53;\n\tpublic var RENDERBUFFER_DEPTH_SIZE = 0x8D54;\n\tpublic var RENDERBUFFER_STENCIL_SIZE = 0x8D55;\n\tpublic var FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;\n\tpublic var FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;\n\tpublic var COLOR_ATTACHMENT0 = 0x8CE0;\n\tpublic var DEPTH_ATTACHMENT = 0x8D00;\n\tpublic var STENCIL_ATTACHMENT = 0x8D20;\n\tpublic var DEPTH_STENCIL_ATTACHMENT = 0x821A;\n\tpublic var NONE = 0;\n\tpublic var FRAMEBUFFER_COMPLETE = 0x8CD5;\n\tpublic var FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;\n\tpublic var FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;\n\tpublic var FRAMEBUFFER_UNSUPPORTED = 0x8CDD;\n\tpublic var FRAMEBUFFER_BINDING = 0x8CA6;\n\tpublic var RENDERBUFFER_BINDING = 0x8CA7;\n\tpublic var MAX_RENDERBUFFER_SIZE = 0x84E8;\n\tpublic var INVALID_FRAMEBUFFER_OPERATION = 0x0506;\n\tpublic var UNPACK_FLIP_Y_WEBGL = 0x9240;\n\tpublic var UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;\n\tpublic var CONTEXT_LOST_WEBGL = 0x9242;\n\tpublic var UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\n\tpublic var BROWSER_DEFAULT_WEBGL = 0x9244;\n\tpublic var READ_BUFFER = 0x0C02;\n\tpublic var UNPACK_ROW_LENGTH = 0x0CF2;\n\tpublic var UNPACK_SKIP_ROWS = 0x0CF3;\n\tpublic var UNPACK_SKIP_PIXELS = 0x0CF4;\n\tpublic var PACK_ROW_LENGTH = 0x0D02;\n\tpublic var PACK_SKIP_ROWS = 0x0D03;\n\tpublic var PACK_SKIP_PIXELS = 0x0D04;\n\tpublic var TEXTURE_BINDING_3D = 0x806A;\n\tpublic var UNPACK_SKIP_IMAGES = 0x806D;\n\tpublic var UNPACK_IMAGE_HEIGHT = 0x806E;\n\tpublic var MAX_3D_TEXTURE_SIZE = 0x8073;\n\tpublic var MAX_ELEMENTS_VERTICES = 0x80E8;\n\tpublic var MAX_ELEMENTS_INDICES = 0x80E9;\n\tpublic var MAX_TEXTURE_LOD_BIAS = 0x84FD;\n\tpublic var MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49;\n\tpublic var MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A;\n\tpublic var MAX_ARRAY_TEXTURE_LAYERS = 0x88FF;\n\tpublic var MIN_PROGRAM_TEXEL_OFFSET = 0x8904;\n\tpublic var MAX_PROGRAM_TEXEL_OFFSET = 0x8905;\n\tpublic var MAX_VARYING_COMPONENTS = 0x8B4B;\n\tpublic var FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B;\n\tpublic var RASTERIZER_DISCARD = 0x8C89;\n\tpublic var VERTEX_ARRAY_BINDING = 0x85B5;\n\tpublic var MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;\n\tpublic var MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;\n\tpublic var MAX_SERVER_WAIT_TIMEOUT = 0x9111;\n\tpublic var MAX_ELEMENT_INDEX = 0x8D6B;\n\tpublic var RED = 0x1903;\n\tpublic var RGB8 = 0x8051;\n\tpublic var RGBA8 = 0x8058;\n\tpublic var RGB10_A2 = 0x8059;\n\tpublic var TEXTURE_3D = 0x806F;\n\tpublic var TEXTURE_WRAP_R = 0x8072;\n\tpublic var TEXTURE_MIN_LOD = 0x813A;\n\tpublic var TEXTURE_MAX_LOD = 0x813B;\n\tpublic var TEXTURE_BASE_LEVEL = 0x813C;\n\tpublic var TEXTURE_MAX_LEVEL = 0x813D;\n\tpublic var TEXTURE_COMPARE_MODE = 0x884C;\n\tpublic var TEXTURE_COMPARE_FUNC = 0x884D;\n\tpublic var SRGB = 0x8C40;\n\tpublic var SRGB8 = 0x8C41;\n\tpublic var SRGB8_ALPHA8 = 0x8C43;\n\tpublic var COMPARE_REF_TO_TEXTURE = 0x884E;\n\tpublic var RGBA32F = 0x8814;\n\tpublic var RGB32F = 0x8815;\n\tpublic var RGBA16F = 0x881A;\n\tpublic var RGB16F = 0x881B;\n\tpublic var TEXTURE_2D_ARRAY = 0x8C1A;\n\tpublic var TEXTURE_BINDING_2D_ARRAY = 0x8C1D;\n\tpublic var R11F_G11F_B10F = 0x8C3A;\n\tpublic var RGB9_E5 = 0x8C3D;\n\tpublic var RGBA32UI = 0x8D70;\n\tpublic var RGB32UI = 0x8D71;\n\tpublic var RGBA16UI = 0x8D76;\n\tpublic var RGB16UI = 0x8D77;\n\tpublic var RGBA8UI = 0x8D7C;\n\tpublic var RGB8UI = 0x8D7D;\n\tpublic var RGBA32I = 0x8D82;\n\tpublic var RGB32I = 0x8D83;\n\tpublic var RGBA16I = 0x8D88;\n\tpublic var RGB16I = 0x8D89;\n\tpublic var RGBA8I = 0x8D8E;\n\tpublic var RGB8I = 0x8D8F;\n\tpublic var RED_INTEGER = 0x8D94;\n\tpublic var RGB_INTEGER = 0x8D98;\n\tpublic var RGBA_INTEGER = 0x8D99;\n\tpublic var R8 = 0x8229;\n\tpublic var RG8 = 0x822B;\n\tpublic var R16F = 0x822D;\n\tpublic var R32F = 0x822E;\n\tpublic var RG16F = 0x822F;\n\tpublic var RG32F = 0x8230;\n\tpublic var R8I = 0x8231;\n\tpublic var R8UI = 0x8232;\n\tpublic var R16I = 0x8233;\n\tpublic var R16UI = 0x8234;\n\tpublic var R32I = 0x8235;\n\tpublic var R32UI = 0x8236;\n\tpublic var RG8I = 0x8237;\n\tpublic var RG8UI = 0x8238;\n\tpublic var RG16I = 0x8239;\n\tpublic var RG16UI = 0x823A;\n\tpublic var RG32I = 0x823B;\n\tpublic var RG32UI = 0x823C;\n\tpublic var R8_SNORM = 0x8F94;\n\tpublic var RG8_SNORM = 0x8F95;\n\tpublic var RGB8_SNORM = 0x8F96;\n\tpublic var RGBA8_SNORM = 0x8F97;\n\tpublic var RGB10_A2UI = 0x906F;\n\tpublic var TEXTURE_IMMUTABLE_FORMAT = 0x912F;\n\tpublic var TEXTURE_IMMUTABLE_LEVELS = 0x82DF;\n\tpublic var UNSIGNED_INT_2_10_10_10_REV = 0x8368;\n\tpublic var UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B;\n\tpublic var UNSIGNED_INT_5_9_9_9_REV = 0x8C3E;\n\tpublic var FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;\n\tpublic var UNSIGNED_INT_24_8 = 0x84FA;\n\tpublic var HALF_FLOAT = 0x140B;\n\tpublic var RG = 0x8227;\n\tpublic var RG_INTEGER = 0x8228;\n\tpublic var INT_2_10_10_10_REV = 0x8D9F;\n\tpublic var CURRENT_QUERY = 0x8865;\n\tpublic var QUERY_RESULT = 0x8866;\n\tpublic var QUERY_RESULT_AVAILABLE = 0x8867;\n\tpublic var ANY_SAMPLES_PASSED = 0x8C2F;\n\tpublic var ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A;\n\tpublic var MAX_DRAW_BUFFERS = 0x8824;\n\tpublic var DRAW_BUFFER0 = 0x8825;\n\tpublic var DRAW_BUFFER1 = 0x8826;\n\tpublic var DRAW_BUFFER2 = 0x8827;\n\tpublic var DRAW_BUFFER3 = 0x8828;\n\tpublic var DRAW_BUFFER4 = 0x8829;\n\tpublic var DRAW_BUFFER5 = 0x882A;\n\tpublic var DRAW_BUFFER6 = 0x882B;\n\tpublic var DRAW_BUFFER7 = 0x882C;\n\tpublic var DRAW_BUFFER8 = 0x882D;\n\tpublic var DRAW_BUFFER9 = 0x882E;\n\tpublic var DRAW_BUFFER10 = 0x882F;\n\tpublic var DRAW_BUFFER11 = 0x8830;\n\tpublic var DRAW_BUFFER12 = 0x8831;\n\tpublic var DRAW_BUFFER13 = 0x8832;\n\tpublic var DRAW_BUFFER14 = 0x8833;\n\tpublic var DRAW_BUFFER15 = 0x8834;\n\tpublic var MAX_COLOR_ATTACHMENTS = 0x8CDF;\n\tpublic var COLOR_ATTACHMENT1 = 0x8CE1;\n\tpublic var COLOR_ATTACHMENT2 = 0x8CE2;\n\tpublic var COLOR_ATTACHMENT3 = 0x8CE3;\n\tpublic var COLOR_ATTACHMENT4 = 0x8CE4;\n\tpublic var COLOR_ATTACHMENT5 = 0x8CE5;\n\tpublic var COLOR_ATTACHMENT6 = 0x8CE6;\n\tpublic var COLOR_ATTACHMENT7 = 0x8CE7;\n\tpublic var COLOR_ATTACHMENT8 = 0x8CE8;\n\tpublic var COLOR_ATTACHMENT9 = 0x8CE9;\n\tpublic var COLOR_ATTACHMENT10 = 0x8CEA;\n\tpublic var COLOR_ATTACHMENT11 = 0x8CEB;\n\tpublic var COLOR_ATTACHMENT12 = 0x8CEC;\n\tpublic var COLOR_ATTACHMENT13 = 0x8CED;\n\tpublic var COLOR_ATTACHMENT14 = 0x8CEE;\n\tpublic var COLOR_ATTACHMENT15 = 0x8CEF;\n\tpublic var SAMPLER_3D = 0x8B5F;\n\tpublic var SAMPLER_2D_SHADOW = 0x8B62;\n\tpublic var SAMPLER_2D_ARRAY = 0x8DC1;\n\tpublic var SAMPLER_2D_ARRAY_SHADOW = 0x8DC4;\n\tpublic var SAMPLER_CUBE_SHADOW = 0x8DC5;\n\tpublic var INT_SAMPLER_2D = 0x8DCA;\n\tpublic var INT_SAMPLER_3D = 0x8DCB;\n\tpublic var INT_SAMPLER_CUBE = 0x8DCC;\n\tpublic var INT_SAMPLER_2D_ARRAY = 0x8DCF;\n\tpublic var UNSIGNED_INT_SAMPLER_2D = 0x8DD2;\n\tpublic var UNSIGNED_INT_SAMPLER_3D = 0x8DD3;\n\tpublic var UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4;\n\tpublic var UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7;\n\tpublic var MAX_SAMPLES = 0x8D57;\n\tpublic var SAMPLER_BINDING = 0x8919;\n\tpublic var PIXEL_PACK_BUFFER = 0x88EB;\n\tpublic var PIXEL_UNPACK_BUFFER = 0x88EC;\n\tpublic var PIXEL_PACK_BUFFER_BINDING = 0x88ED;\n\tpublic var PIXEL_UNPACK_BUFFER_BINDING = 0x88EF;\n\tpublic var COPY_READ_BUFFER = 0x8F36;\n\tpublic var COPY_WRITE_BUFFER = 0x8F37;\n\tpublic var COPY_READ_BUFFER_BINDING = 0x8F36;\n\tpublic var COPY_WRITE_BUFFER_BINDING = 0x8F37;\n\tpublic var FLOAT_MAT2x3 = 0x8B65;\n\tpublic var FLOAT_MAT2x4 = 0x8B66;\n\tpublic var FLOAT_MAT3x2 = 0x8B67;\n\tpublic var FLOAT_MAT3x4 = 0x8B68;\n\tpublic var FLOAT_MAT4x2 = 0x8B69;\n\tpublic var FLOAT_MAT4x3 = 0x8B6A;\n\tpublic var UNSIGNED_INT_VEC2 = 0x8DC6;\n\tpublic var UNSIGNED_INT_VEC3 = 0x8DC7;\n\tpublic var UNSIGNED_INT_VEC4 = 0x8DC8;\n\tpublic var UNSIGNED_NORMALIZED = 0x8C17;\n\tpublic var SIGNED_NORMALIZED = 0x8F9C;\n\tpublic var VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD;\n\tpublic var VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F;\n\tpublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80;\n\tpublic var TRANSFORM_FEEDBACK_VARYINGS = 0x8C83;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85;\n\tpublic var TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88;\n\tpublic var MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;\n\tpublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B;\n\tpublic var INTERLEAVED_ATTRIBS = 0x8C8C;\n\tpublic var SEPARATE_ATTRIBS = 0x8C8D;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER = 0x8C8E;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F;\n\tpublic var TRANSFORM_FEEDBACK = 0x8E22;\n\tpublic var TRANSFORM_FEEDBACK_PAUSED = 0x8E23;\n\tpublic var TRANSFORM_FEEDBACK_ACTIVE = 0x8E24;\n\tpublic var TRANSFORM_FEEDBACK_BINDING = 0x8E25;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;\n\tpublic var FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;\n\tpublic var FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;\n\tpublic var FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;\n\tpublic var FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;\n\tpublic var FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;\n\tpublic var FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;\n\tpublic var FRAMEBUFFER_DEFAULT = 0x8218;\n\tpublic var DEPTH24_STENCIL8 = 0x88F0;\n\tpublic var DRAW_FRAMEBUFFER_BINDING = 0x8CA6;\n\tpublic var READ_FRAMEBUFFER = 0x8CA8;\n\tpublic var DRAW_FRAMEBUFFER = 0x8CA9;\n\tpublic var READ_FRAMEBUFFER_BINDING = 0x8CAA;\n\tpublic var RENDERBUFFER_SAMPLES = 0x8CAB;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56;\n\tpublic var UNIFORM_BUFFER = 0x8A11;\n\tpublic var UNIFORM_BUFFER_BINDING = 0x8A28;\n\tpublic var UNIFORM_BUFFER_START = 0x8A29;\n\tpublic var UNIFORM_BUFFER_SIZE = 0x8A2A;\n\tpublic var MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B;\n\tpublic var MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D;\n\tpublic var MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E;\n\tpublic var MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F;\n\tpublic var MAX_UNIFORM_BLOCK_SIZE = 0x8A30;\n\tpublic var MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31;\n\tpublic var MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33;\n\tpublic var UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34;\n\tpublic var ACTIVE_UNIFORM_BLOCKS = 0x8A36;\n\tpublic var UNIFORM_TYPE = 0x8A37;\n\tpublic var UNIFORM_SIZE = 0x8A38;\n\tpublic var UNIFORM_BLOCK_INDEX = 0x8A3A;\n\tpublic var UNIFORM_OFFSET = 0x8A3B;\n\tpublic var UNIFORM_ARRAY_STRIDE = 0x8A3C;\n\tpublic var UNIFORM_MATRIX_STRIDE = 0x8A3D;\n\tpublic var UNIFORM_IS_ROW_MAJOR = 0x8A3E;\n\tpublic var UNIFORM_BLOCK_BINDING = 0x8A3F;\n\tpublic var UNIFORM_BLOCK_DATA_SIZE = 0x8A40;\n\tpublic var UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42;\n\tpublic var UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43;\n\tpublic var UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44;\n\tpublic var UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46;\n\tpublic var OBJECT_TYPE = 0x9112;\n\tpublic var SYNC_CONDITION = 0x9113;\n\tpublic var SYNC_STATUS = 0x9114;\n\tpublic var SYNC_FLAGS = 0x9115;\n\tpublic var SYNC_FENCE = 0x9116;\n\tpublic var SYNC_GPU_COMMANDS_COMPLETE = 0x9117;\n\tpublic var UNSIGNALED = 0x9118;\n\tpublic var SIGNALED = 0x9119;\n\tpublic var ALREADY_SIGNALED = 0x911A;\n\tpublic var TIMEOUT_EXPIRED = 0x911B;\n\tpublic var CONDITION_SATISFIED = 0x911C;\n\tpublic var WAIT_FAILED = 0x911D;\n\tpublic var SYNC_FLUSH_COMMANDS_BIT = 0x00000001;\n\tpublic var COLOR = 0x1800;\n\tpublic var DEPTH = 0x1801;\n\tpublic var STENCIL = 0x1802;\n\tpublic var MIN = 0x8007;\n\tpublic var MAX = 0x8008;\n\tpublic var DEPTH_COMPONENT24 = 0x81A6;\n\tpublic var STREAM_READ = 0x88E1;\n\tpublic var STREAM_COPY = 0x88E2;\n\tpublic var STATIC_READ = 0x88E5;\n\tpublic var STATIC_COPY = 0x88E6;\n\tpublic var DYNAMIC_READ = 0x88E9;\n\tpublic var DYNAMIC_COPY = 0x88EA;\n\tpublic var DEPTH_COMPONENT32F = 0x8CAC;\n\tpublic var DEPTH32F_STENCIL8 = 0x8CAD;\n\tpublic var INVALID_INDEX = 0xFFFFFFFF;\n\tpublic var TIMEOUT_IGNORED = -1;\n\tpublic var MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247;\n\tpublic var type(default, null):RenderContextType;\n\tpublic var version(default, null):Float;\n\n\tprivate var __arrayBufferBinding:GLBuffer;\n\tprivate var __elementBufferBinding:GLBuffer;\n\tprivate var __contextID:Int;\n\tprivate var __currentProgram:GLProgram;\n\tprivate var __framebufferBinding:GLFramebuffer;\n\tprivate var __initialized:Bool;\n\tprivate var __isContextLost:Bool;\n\tprivate var __renderbufferBinding:GLRenderbuffer;\n\tprivate var __texture2DBinding:GLTexture;\n\tprivate var __textureCubeMapBinding:GLTexture;\n\n\tprivate function new()\n\t{\n\t\t__contextID = __lastContextID++;\n\n\t\t__initialize();\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar versionString:String = getParameter(VERSION);\n\t\tif (versionString.indexOf(\"OpenGL ES\") > -1)\n\t\t{\n\t\t\ttype = OPENGLES;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttype = OPENGL;\n\t\t}\n\t\tvar ereg = ~/[0-9]+[.]?[0-9]?/i;\n\t\tif (ereg.match(versionString))\n\t\t{\n\t\t\tversion = Std.parseFloat(ereg.matched(0));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tversion = 2;\n\t\t}\n\t\t#else\n\t\ttype = OPENGL;\n\t\tversion = 2;\n\t\t#end\n\t}\n\n\tpublic function activeTexture(texture:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_active_texture(texture);\n\t\t#end\n\t}\n\n\tpublic function attachShader(program:GLProgram, shader:GLShader):Void\n\t{\n\t\tif (program != null && shader != null)\n\t\t{\n\t\t\tif (program.refs == null)\n\t\t\t{\n\t\t\t\tprogram.refs = [shader];\n\t\t\t}\n\t\t\telse if (program.refs.indexOf(shader) == -1)\n\t\t\t{\n\t\t\t\tprogram.refs.push(shader);\n\t\t\t}\n\t\t}\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_attach_shader(__getObjectID(program), __getObjectID(shader));\n\t\t#end\n\t}\n\n\tpublic function beginQuery(target:Int, query:GLQuery):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_begin_query(target, __getObjectID(query));\n\t\t#end\n\t}\n\n\tpublic function beginTransformFeedback(primitiveNode:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_begin_transform_feedback(primitiveNode);\n\t\t#end\n\t}\n\n\tpublic function bindAttribLocation(program:GLProgram, index:Int, name:String):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_attrib_location(__getObjectID(program), index, name);\n\t\t#end\n\t}\n\n\tpublic function bindBuffer(target:Int, buffer:GLBuffer):Void\n\t{\n\t\tif (target == ARRAY_BUFFER) __arrayBufferBinding = buffer;\n\t\tif (target == ELEMENT_ARRAY_BUFFER) __elementBufferBinding = buffer;\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_buffer(target, __getObjectID(buffer));\n\t\t#end\n\t}\n\n\tpublic function bindBufferBase(target:Int, index:Int, buffer:GLBuffer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_buffer_base(target, index, __getObjectID(buffer));\n\t\t#end\n\t}\n\n\tpublic function bindBufferRange(target:Int, index:Int, buffer:GLBuffer, offset:DataPointer, size:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_buffer_range(target, index, __getObjectID(buffer), offset, size);\n\t\t#end\n\t}\n\n\tpublic function bindFramebuffer(target:Int, framebuffer:GLFramebuffer):Void\n\t{\n\t\t__framebufferBinding = framebuffer;\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_framebuffer(target, __getObjectID(framebuffer));\n\t\t#end\n\t}\n\n\tpublic function bindRenderbuffer(target:Int, renderbuffer:GLRenderbuffer):Void\n\t{\n\t\t__renderbufferBinding = renderbuffer;\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_renderbuffer(target, __getObjectID(renderbuffer));\n\t\t#end\n\t}\n\n\tpublic function bindSampler(unit:Int, sampler:GLSampler):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_sampler(unit, __getObjectID(sampler));\n\t\t#end\n\t}\n\n\tpublic function bindTexture(target:Int, texture:GLTexture):Void\n\t{\n\t\tif (target == TEXTURE_2D) __texture2DBinding = texture;\n\t\tif (target == TEXTURE_CUBE_MAP) __textureCubeMapBinding = texture;\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_texture(target, __getObjectID(texture));\n\t\t#end\n\t}\n\n\tpublic function bindTransformFeedback(target:Int, transformFeedback:GLTransformFeedback):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_transform_feedback(target, __getObjectID(transformFeedback));\n\t\t#end\n\t}\n\n\tpublic function bindVertexArray(vertexArray:GLVertexArrayObject):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_bind_vertex_array(__getObjectID(vertexArray));\n\t\t#end\n\t}\n\n\tpublic function blendColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_blend_color(red, green, blue, alpha);\n\t\t#end\n\t}\n\n\tpublic function blendEquation(mode:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_blend_equation(mode);\n\t\t#end\n\t}\n\n\tpublic function blendEquationSeparate(modeRGB:Int, modeAlpha:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_blend_equation_separate(modeRGB, modeAlpha);\n\t\t#end\n\t}\n\n\tpublic function blendFunc(sfactor:Int, dfactor:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_blend_func(sfactor, dfactor);\n\t\t#end\n\t}\n\n\tpublic function blendFuncSeparate(srcRGB:Int, dstRGB:Int, srcAlpha:Int, dstAlpha:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_blend_func_separate(srcRGB, dstRGB, srcAlpha, dstAlpha);\n\t\t#end\n\t}\n\n\tpublic function blitFramebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int, dstY0:Int, dstX1:Int, dstY1:Int, mask:Int, filter:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_blit_framebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n\t\t#end\n\t}\n\n\tpublic function bufferData(target:Int, size:Int, srcData:DataPointer, usage:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_buffer_data(target, size, srcData, usage);\n\t\t#end\n\t}\n\n\tpublic function bufferSubData(target:Int, dstByteOffset:Int, size:Int, srcData:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_buffer_sub_data(target, dstByteOffset, size, srcData);\n\t\t#end\n\t}\n\n\tpublic function checkFramebufferStatus(target:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_check_framebuffer_status(target);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function clear(mask:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear(mask);\n\t\t#end\n\t}\n\n\tpublic function clearBufferfi(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_bufferfi(buffer, drawbuffer, depth, stencil);\n\t\t#end\n\t}\n\n\tpublic function clearBufferfv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_bufferfv(buffer, drawbuffer, value);\n\t\t#end\n\t}\n\n\tpublic function clearBufferiv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_bufferiv(buffer, drawbuffer, value);\n\t\t#end\n\t}\n\n\tpublic function clearBufferuiv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_bufferuiv(buffer, drawbuffer, value);\n\t\t#end\n\t}\n\n\tpublic function clearColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_color(red, green, blue, alpha);\n\t\t#end\n\t}\n\n\tpublic function clearDepthf(depth:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_depthf(depth);\n\t\t#end\n\t}\n\n\tpublic function clearStencil(s:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_clear_stencil(s);\n\t\t#end\n\t}\n\n\tpublic function clientWaitSync(sync:GLSync, flags:Int, timeout:Int64):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_client_wait_sync(sync, flags, timeout.high, timeout.low);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function colorMask(red:Bool, green:Bool, blue:Bool, alpha:Bool):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_color_mask(red, green, blue, alpha);\n\t\t#end\n\t}\n\n\tpublic function compileShader(shader:GLShader):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_compile_shader(__getObjectID(shader));\n\t\t#end\n\t}\n\n\tpublic function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, imageSize:Int, data:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_compressed_tex_image_2d(target, level, internalformat, width, height, border, imageSize, data);\n\t\t#end\n\t}\n\n\tpublic function compressedTexImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, imageSize:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_compressed_tex_image_3d(target, level, internalformat, width, height, depth, border, imageSize, data);\n\t\t#end\n\t}\n\n\tpublic function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, imageSize:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_compressed_tex_sub_image_2d(target, level, xoffset, yoffset, width, height, format, imageSize, data);\n\t\t#end\n\t}\n\n\tpublic function compressedTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int,\n\t\t\timageSize:Int, data:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_compressed_tex_sub_image_3d(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);\n\t\t#end\n\t}\n\n\tpublic function copyBufferSubData(readTarget:Int, writeTarget:Int, readOffset:DataPointer, writeOffset:DataPointer, size:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_copy_buffer_sub_data(readTarget, writeTarget, readOffset, writeOffset, size);\n\t\t#end\n\t}\n\n\tpublic function copyTexImage2D(target:Int, level:Int, internalformat:Int, x:Int, y:Int, width:Int, height:Int, border:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_copy_tex_image_2d(target, level, internalformat, x, y, width, height, border);\n\t\t#end\n\t}\n\n\tpublic function copyTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_copy_tex_sub_image_2d(target, level, xoffset, yoffset, x, y, width, height);\n\t\t#end\n\t}\n\n\tpublic function copyTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_copy_tex_sub_image_3d(target, level, xoffset, yoffset, zoffset, x, y, width, height);\n\t\t#end\n\t}\n\n\tpublic function createBuffer():GLBuffer\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_buffer();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.BUFFER, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createFramebuffer():GLFramebuffer\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_framebuffer();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.FRAMEBUFFER, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createProgram():GLProgram\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_program();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.PROGRAM, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createQuery():GLQuery\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_query();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.QUERY, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createRenderbuffer():GLRenderbuffer\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_renderbuffer();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.RENDERBUFFER, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createSampler():GLSampler\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_sampler();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.SAMPLER, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createShader(type:Int):GLShader\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_shader(type);\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.SHADER, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createTexture():GLTexture\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_texture();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.TEXTURE, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createTransformFeedback():GLTransformFeedback\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_transform_feedback();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.TRANSFORM_FEEDBACK, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function createVertexArray():GLVertexArrayObject\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar id = NativeCFFI.lime_gl_create_vertex_array();\n\t\tif (id == 0) return null;\n\t\tvar object = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, GLObjectType.VERTEX_ARRAY_OBJECT, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function cullFace(mode:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_cull_face(mode);\n\t\t#end\n\t}\n\n\tpublic function deleteBuffer(buffer:GLBuffer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (buffer != null) NativeCFFI.lime_gl_object_deregister(buffer);\n\t\tNativeCFFI.lime_gl_delete_buffer(__getObjectID(buffer));\n\t\t#end\n\t}\n\n\tpublic function deleteFramebuffer(framebuffer:GLFramebuffer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (framebuffer != null) NativeCFFI.lime_gl_object_deregister(framebuffer);\n\t\tNativeCFFI.lime_gl_delete_framebuffer(__getObjectID(framebuffer));\n\t\t#end\n\t}\n\n\tpublic function deleteProgram(program:GLProgram):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (program != null) NativeCFFI.lime_gl_object_deregister(program);\n\t\tNativeCFFI.lime_gl_delete_program(__getObjectID(program));\n\t\t#end\n\t}\n\n\tpublic function deleteQuery(query:GLQuery):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (query != null) NativeCFFI.lime_gl_object_deregister(query);\n\t\tNativeCFFI.lime_gl_delete_query(__getObjectID(query));\n\t\t#end\n\t}\n\n\tpublic function deleteRenderbuffer(renderbuffer:GLRenderbuffer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (renderbuffer != null) NativeCFFI.lime_gl_object_deregister(renderbuffer);\n\t\tNativeCFFI.lime_gl_delete_renderbuffer(__getObjectID(renderbuffer));\n\t\t#end\n\t}\n\n\tpublic function deleteSampler(sampler:GLSampler):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (sampler != null) NativeCFFI.lime_gl_object_deregister(sampler);\n\t\tNativeCFFI.lime_gl_delete_sampler(__getObjectID(sampler));\n\t\t#end\n\t}\n\n\tpublic function deleteShader(shader:GLShader):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (shader != null) NativeCFFI.lime_gl_object_deregister(shader);\n\t\tNativeCFFI.lime_gl_delete_shader(__getObjectID(shader));\n\t\t#end\n\t}\n\n\tpublic function deleteSync(sync:GLSync):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_delete_sync(sync);\n\t\t#end\n\t}\n\n\tpublic function deleteTexture(texture:GLTexture):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (texture != null) NativeCFFI.lime_gl_object_deregister(texture);\n\t\tNativeCFFI.lime_gl_delete_texture(__getObjectID(texture));\n\t\t#end\n\t}\n\n\tpublic function deleteTransformFeedback(transformFeedback:GLTransformFeedback):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (transformFeedback != null) NativeCFFI.lime_gl_object_deregister(transformFeedback);\n\t\tNativeCFFI.lime_gl_delete_transform_feedback(__getObjectID(transformFeedback));\n\t\t#end\n\t}\n\n\tpublic function deleteVertexArray(vertexArray:GLVertexArrayObject):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tif (vertexArray != null) NativeCFFI.lime_gl_object_deregister(vertexArray);\n\t\tNativeCFFI.lime_gl_delete_vertex_array(__getObjectID(vertexArray));\n\t\t#end\n\t}\n\n\tpublic function depthFunc(func:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_depth_func(func);\n\t\t#end\n\t}\n\n\tpublic function depthMask(flag:Bool):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_depth_mask(flag);\n\t\t#end\n\t}\n\n\tpublic function depthRangef(zNear:Float, zFar:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_depth_rangef(zNear, zFar);\n\t\t#end\n\t}\n\n\tpublic function detachShader(program:GLProgram, shader:GLShader):Void\n\t{\n\t\tif (program != null && program.refs != null)\n\t\t{\n\t\t\tprogram.refs.remove(shader);\n\t\t}\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_detach_shader(__getObjectID(program), __getObjectID(shader));\n\t\t#end\n\t}\n\n\tpublic function disable(cap:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_disable(cap);\n\t\t#end\n\t}\n\n\tpublic function disableVertexAttribArray(index:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_disable_vertex_attrib_array(index);\n\t\t#end\n\t}\n\n\tpublic function drawArrays(mode:Int, first:Int, count:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_draw_arrays(mode, first, count);\n\t\t#end\n\t}\n\n\tpublic function drawArraysInstanced(mode:Int, first:Int, count:Int, instanceCount:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_draw_arrays_instanced(mode, first, count, instanceCount);\n\t\t#end\n\t}\n\n\tpublic function drawBuffers(buffers:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar _buffers = new hl.NativeArray<Int>(buffers.length);\n\t\tfor (i in 0...buffers.length)\n\t\t\t_buffers[i] = buffers[i];\n\t\tvar buffers = _buffers;\n\t\t#end\n\t\tNativeCFFI.lime_gl_draw_buffers(buffers);\n\t\t#end\n\t}\n\n\tpublic function drawElements(mode:Int, count:Int, type:Int, offset:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_draw_elements(mode, count, type, offset);\n\t\t#end\n\t}\n\n\tpublic function drawElementsInstanced(mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_draw_elements_instanced(mode, count, type, offset, instanceCount);\n\t\t#end\n\t}\n\n\tpublic function drawRangeElements(mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_draw_range_elements(mode, start, end, count, type, offset);\n\t\t#end\n\t}\n\n\tpublic function enable(cap:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_enable(cap);\n\t\t#end\n\t}\n\n\tpublic function enableVertexAttribArray(index:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_enable_vertex_attrib_array(index);\n\t\t#end\n\t}\n\n\tpublic function endQuery(target:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_end_query(target);\n\t\t#end\n\t}\n\n\tpublic function endTransformFeedback():Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_end_transform_feedback();\n\t\t#end\n\t}\n\n\tpublic function fenceSync(condition:Int, flags:Int):GLSync\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_fence_sync(condition, flags);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function finish():Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_finish();\n\t\t#end\n\t}\n\n\tpublic function flush():Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_flush();\n\t\t#end\n\t}\n\n\tpublic function framebufferRenderbuffer(target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:GLRenderbuffer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_framebuffer_renderbuffer(target, attachment, renderbuffertarget, __getObjectID(renderbuffer));\n\t\t#end\n\t}\n\n\tpublic function framebufferTexture2D(target:Int, attachment:Int, textarget:Int, texture:GLTexture, level:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_framebuffer_texture2D(target, attachment, textarget, __getObjectID(texture), level);\n\t\t#end\n\t}\n\n\tpublic function framebufferTextureLayer(target:Int, attachment:Int, texture:GLTexture, level:Int, layer:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_framebuffer_texture_layer(target, attachment, __getObjectID(texture), level, layer);\n\t\t#end\n\t}\n\n\tpublic function frontFace(mode:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_front_face(mode);\n\t\t#end\n\t}\n\n\tpublic function generateMipmap(target:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_generate_mipmap(target);\n\t\t#end\n\t}\n\n\tpublic function getActiveAttrib(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar result = NativeCFFI.lime_gl_get_active_attrib(__getObjectID(program), index);\n\t\tif (result != null)\n\t\t{\n\t\t\treturn {\n\t\t\t\tsize: result.size,\n\t\t\t\ttype: result.type,\n\t\t\t\tname: CFFI.stringValue(result.name)\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\t#else\n\t\treturn NativeCFFI.lime_gl_get_active_attrib(__getObjectID(program), index);\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getActiveUniform(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar result = NativeCFFI.lime_gl_get_active_uniform(__getObjectID(program), index);\n\t\tif (result != null)\n\t\t{\n\t\t\treturn {\n\t\t\t\tsize: result.size,\n\t\t\t\ttype: result.type,\n\t\t\t\tname: CFFI.stringValue(result.name)\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\t#else\n\t\treturn NativeCFFI.lime_gl_get_active_uniform(__getObjectID(program), index);\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getActiveUniformBlocki(program:GLProgram, uniformBlockIndex:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_active_uniform_blocki(__getObjectID(program), uniformBlockIndex, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getActiveUniformBlockiv(program:GLProgram, uniformBlockIndex:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_active_uniform_blockiv(__getObjectID(program), uniformBlockIndex, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getActiveUniformBlockName(program:GLProgram, uniformBlockIndex:Int):String\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_active_uniform_block_name(__getObjectID(program), uniformBlockIndex);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getActiveUniformBlockParameter(program:GLProgram, uniformBlockIndex:Int, pname:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getActiveUniforms(program:GLProgram, uniformIndices:Array<Int>, pname:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getActiveUniformsiv(program:GLProgram, uniformIndices:Array<Int>, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar _uniformIndices = new hl.NativeArray<Int>(uniformIndices.length);\n\t\tfor (i in 0...uniformIndices.length)\n\t\t\t_uniformIndices[i] = uniformIndices[i];\n\t\tvar uniformIndices = _uniformIndices;\n\t\t#end\n\t\tNativeCFFI.lime_gl_get_active_uniformsiv(__getObjectID(program), uniformIndices, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getAttachedShaders(program:GLProgram):Array<GLShader>\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_attached_shaders(__getObjectID(program));\n\t\t#if hl\n\t\tvar _result = new Array();\n\t\tfor (i in 0...result.length)\n\t\t{\n\t\t\t_result.push(GLShader.fromInt(result[i]));\n\t\t}\n\t\tvar result = _result;\n\t\t#end\n\t\treturn result;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getAttribLocation(program:GLProgram, name:String):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_attrib_location(__getObjectID(program), name);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getBoolean(pname:Int):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_boolean(pname);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function getBooleanv(pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_booleanv(pname, params);\n\t\t#end\n\t}\n\n\tpublic function getBufferParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn getBufferParameteri(target, pname);\n\t}\n\n\tpublic function getBufferParameteri(target:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_buffer_parameteri(target, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getBufferParameteri64v(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_buffer_parameteri64v(target, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getBufferParameteriv(target:Int, pname:Int, data:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_buffer_parameteriv(target, pname, data);\n\t\t#end\n\t}\n\n\tpublic function getBufferPointerv(target:Int, pname:Int):DataPointer\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_buffer_pointerv(target, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getBufferSubData(target:Int, offset:DataPointer, size:Int, data:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_buffer_sub_data(target, offset, size, data);\n\t\t#end\n\t}\n\n\tpublic function getContextAttributes():GLContextAttributes\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar base:Dynamic = NativeCFFI.lime_gl_get_context_attributes();\n\t\tbase.premultipliedAlpha = false;\n\t\tbase.preserveDrawingBuffer = false;\n\t\treturn base;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getError():Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_error();\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getExtension(name:String):Dynamic\n\t{\n\t\tif (__extensionObjects == null)\n\t\t{\n\t\t\t__extensionObjects = new Map();\n\t\t\tvar supportedExtensions = getSupportedExtensions();\n\n\t\t\tfor (extension in supportedExtensions)\n\t\t\t{\n\t\t\t\tif (__extensionObjectConstructors.exists(extension))\n\t\t\t\t{\n\t\t\t\t\t__extensionObjects.set(extension, null);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (__extensionObjects.exists(name))\n\t\t{\n\t\t\tvar object = __extensionObjects.get(name);\n\n\t\t\tif (object == null)\n\t\t\t{\n\t\t\t\tobject = __extensionObjectConstructors.get(name)();\n\t\t\t\t__extensionObjects.set(name, object);\n\n\t\t\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t\t\tNativeCFFI.lime_gl_get_extension(name);\n\t\t\t\t#end\n\t\t\t}\n\n\t\t\treturn object;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function getFloat(pname:Int):Float\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_float(pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getFloatv(pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_floatv(pname, params);\n\t\t#end\n\t}\n\n\tpublic function getFragDataLocation(program:GLProgram, name:String):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_frag_data_location(__getObjectID(program), name);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getFramebufferAttachmentParameter(target:Int, attachment:Int, pname:Int):Dynamic\n\t{\n\t\tvar value = getFramebufferAttachmentParameteri(target, attachment, pname);\n\n\t\tif (pname == FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)\n\t\t{\n\t\t\tvar texture:GLTexture = value;\n\t\t\tif (texture != null) return texture;\n\n\t\t\tvar renderbuffer:GLRenderbuffer = value;\n\t\t\tif (renderbuffer != null) return renderbuffer;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function getFramebufferAttachmentParameteri(target:Int, attachment:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_framebuffer_attachment_parameteri(target, attachment, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getFramebufferAttachmentParameteriv(target:Int, attachment:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_framebuffer_attachment_parameteriv(target, attachment, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getIndexedParameter(target:Int, index:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getInteger(pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_integer(pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getInteger64(pname:Int):Int64\n\t{\n\t\t// TODO\n\n\t\t// #if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t// return NativeCFFI.lime_gl_get_integer64 (pname);\n\t\t// #else\n\t\treturn Int64.ofInt(0);\n\t\t// #end\n\t}\n\n\tpublic function getInteger64i(pname:Int):Int64\n\t{\n\t\t// TODO\n\n\t\t// #if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t// return NativeCFFI.lime_gl_get_integer64i (pname);\n\t\t// #else\n\t\treturn Int64.ofInt(0);\n\t\t// #end\n\t}\n\n\tpublic function getInteger64i_v(pname:Int, index:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_integer64i_v(pname, index, params);\n\t\t#end\n\t}\n\n\tpublic function getInteger64v(pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_integer64v(pname, params);\n\t\t#end\n\t}\n\n\tpublic function getIntegeri_v(pname:Int, index:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_integeri_v(pname, index, params);\n\t\t#end\n\t}\n\n\tpublic function getIntegerv(pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_integerv(pname, params);\n\t\t#end\n\t}\n\n\tpublic function getInternalformati(target:Int, internalformat:Int, pname:Int):Int\n\t{\n\t\t// TODO\n\n\t\t// #if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t// return NativeCFFI.lime_gl_get_internalformati (target, internalformat, pname);\n\t\t// #else\n\t\treturn 0;\n\t\t// #end\n\t}\n\n\tpublic function getInternalformativ(target:Int, internalformat:Int, pname:Int, bufSize:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_internalformativ(target, internalformat, pname, bufSize, params);\n\t\t#end\n\t}\n\n\tpublic function getInternalformatParameter(target:Int, internalformat:Int, pname:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getParameter(pname:Int):Dynamic\n\t{\n\t\tswitch (pname)\n\t\t{\n\t\t\tcase GL.BLEND, GL.CULL_FACE, GL.DEPTH_TEST, GL.DEPTH_WRITEMASK, GL.DITHER, GL.POLYGON_OFFSET_FILL, GL.SAMPLE_COVERAGE_INVERT, GL.SCISSOR_TEST,\n\t\t\t\tGL.STENCIL_TEST, GL.UNPACK_FLIP_Y_WEBGL, GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL:\n\t\t\t\treturn getBoolean(pname);\n\n\t\t\tcase GL.COLOR_WRITEMASK:\n\t\t\t\tvar params = Bytes.alloc(4);\n\t\t\t\tgetBooleanv(pname, params);\n\n\t\t\t\tvar data = new Array<Bool>();\n\t\t\t\tfor (i in 0...4)\n\t\t\t\t\tdata[i] = params.get(i) != 0;\n\t\t\t\treturn data;\n\n\t\t\tcase GL.DEPTH_CLEAR_VALUE, GL.LINE_WIDTH, GL.POLYGON_OFFSET_FACTOR, GL.POLYGON_OFFSET_UNITS, GL.SAMPLE_COVERAGE_VALUE:\n\t\t\t\treturn getFloat(pname);\n\n\t\t\tcase GL.ALIASED_LINE_WIDTH_RANGE, GL.ALIASED_POINT_SIZE_RANGE, GL.DEPTH_RANGE:\n\t\t\t\tvar params = new Float32Array(2);\n\t\t\t\tgetFloatv(pname, params);\n\t\t\t\treturn params;\n\n\t\t\tcase GL.BLEND_COLOR, GL.COLOR_CLEAR_VALUE:\n\t\t\t\tvar params = new Float32Array(4);\n\t\t\t\tgetFloatv(pname, params);\n\t\t\t\treturn params;\n\n\t\t\tcase GL.ACTIVE_TEXTURE, GL.ALPHA_BITS, GL.BLEND_DST_ALPHA, GL.BLEND_DST_RGB, GL.BLEND_EQUATION, GL.BLEND_EQUATION_ALPHA,\n\t\t\t\t/*GL.BLEND_EQUATION_RGB,*/ GL.BLEND_SRC_ALPHA, GL.BLEND_SRC_RGB, GL.BLUE_BITS, GL.CULL_FACE_MODE, GL.DEPTH_BITS, GL.DEPTH_FUNC, GL.FRONT_FACE,\n\t\t\t\tGL.GENERATE_MIPMAP_HINT, GL.GREEN_BITS, GL.IMPLEMENTATION_COLOR_READ_FORMAT, GL.IMPLEMENTATION_COLOR_READ_TYPE,\n\t\t\t\tGL.MAX_COMBINED_TEXTURE_IMAGE_UNITS, GL.MAX_CUBE_MAP_TEXTURE_SIZE, GL.MAX_FRAGMENT_UNIFORM_VECTORS, GL.MAX_RENDERBUFFER_SIZE,\n\t\t\t\tGL.MAX_TEXTURE_IMAGE_UNITS, GL.MAX_TEXTURE_SIZE, GL.MAX_VARYING_VECTORS, GL.MAX_VERTEX_ATTRIBS, GL.MAX_VERTEX_TEXTURE_IMAGE_UNITS,\n\t\t\t\tGL.MAX_VERTEX_UNIFORM_VECTORS, GL.PACK_ALIGNMENT, GL.RED_BITS, GL.SAMPLE_BUFFERS, GL.SAMPLES, GL.STENCIL_BACK_FAIL, GL.STENCIL_BACK_FUNC,\n\t\t\t\tGL.STENCIL_BACK_PASS_DEPTH_FAIL, GL.STENCIL_BACK_PASS_DEPTH_PASS, GL.STENCIL_BACK_REF, GL.STENCIL_BACK_VALUE_MASK, GL.STENCIL_BACK_WRITEMASK,\n\t\t\t\tGL.STENCIL_BITS, GL.STENCIL_CLEAR_VALUE, GL.STENCIL_FAIL, GL.STENCIL_FUNC, GL.STENCIL_PASS_DEPTH_FAIL, GL.STENCIL_PASS_DEPTH_PASS,\n\t\t\t\tGL.STENCIL_REF, GL.STENCIL_VALUE_MASK, GL.STENCIL_WRITEMASK, GL.SUBPIXEL_BITS, GL.UNPACK_ALIGNMENT, GL.UNPACK_COLORSPACE_CONVERSION_WEBGL:\n\t\t\t\treturn getInteger(pname);\n\n\t\t\tcase GL.COMPRESSED_TEXTURE_FORMATS:\n\t\t\t\tvar params = new UInt32Array(getInteger(GL.NUM_COMPRESSED_TEXTURE_FORMATS));\n\t\t\t\tgetIntegerv(pname, params);\n\t\t\t\treturn params;\n\n\t\t\tcase GL.MAX_VIEWPORT_DIMS:\n\t\t\t\tvar params = new Int32Array(2);\n\t\t\t\tgetIntegerv(pname, params);\n\t\t\t\treturn params;\n\n\t\t\tcase GL.SCISSOR_BOX, GL.VIEWPORT:\n\t\t\t\tvar params = new Int32Array(4);\n\t\t\t\tgetIntegerv(pname, params);\n\t\t\t\treturn params;\n\n\t\t\tcase GL.RENDERER, GL.SHADING_LANGUAGE_VERSION, GL.VENDOR, GL.VERSION:\n\t\t\t\treturn getString(pname);\n\n\t\t\tcase GL.ARRAY_BUFFER_BINDING, GL.ELEMENT_ARRAY_BUFFER_BINDING:\n\t\t\t\tvar data:GLBuffer = getInteger(pname);\n\t\t\t\treturn data;\n\n\t\t\tcase GL.CURRENT_PROGRAM:\n\t\t\t\tvar data:GLProgram = getInteger(pname);\n\t\t\t\treturn data;\n\n\t\t\tcase GL.FRAMEBUFFER_BINDING:\n\t\t\t\tvar data:GLFramebuffer = getInteger(pname);\n\t\t\t\treturn data;\n\n\t\t\tcase GL.RENDERBUFFER_BINDING:\n\t\t\t\tvar data:GLRenderbuffer = getInteger(pname);\n\t\t\t\treturn data;\n\n\t\t\tcase GL.TEXTURE_BINDING_2D, GL.TEXTURE_BINDING_CUBE_MAP:\n\t\t\t\tvar data:GLTexture = getInteger(pname);\n\t\t\t\treturn data;\n\n\t\t\tdefault:\n\t\t\t\treturn getInteger(pname);\n\t\t\t\t// return null;\n\t\t}\n\t}\n\n\tpublic function getProgrami(program:GLProgram, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_programi(__getObjectID(program), pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getProgramiv(program:GLProgram, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_programiv(__getObjectID(program), pname, params);\n\t\t#end\n\t}\n\n\tpublic function getProgramBinary(program:GLProgram, binaryFormat:Int):Bytes\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar bytes = Bytes.alloc(0);\n\t\tNativeCFFI.lime_gl_get_program_binary(__getObjectID(program), binaryFormat, bytes);\n\t\treturn bytes;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getProgramInfoLog(program:GLProgram):String\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_program_info_log(__getObjectID(program));\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getProgramParameter(program:GLProgram, pname:Int):Dynamic\n\t{\n\t\treturn getProgrami(program, pname);\n\t}\n\n\tpublic function getQuery(target:Int, pname:Int):GLQuery\n\t{\n\t\treturn getQueryi(target, pname);\n\t}\n\n\tpublic function getQueryi(target:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_queryi(target, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getQueryiv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_queryiv(target, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getQueryObjectui(query:GLQuery, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_query_objectui(__getObjectID(query), pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getQueryObjectuiv(query:GLQuery, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_query_objectuiv(__getObjectID(query), pname, params);\n\t\t#end\n\t}\n\n\tpublic function getQueryParameter(query:GLQuery, pname:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getRenderbufferParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn getRenderbufferParameteri(target, pname);\n\t}\n\n\tpublic function getRenderbufferParameteri(target:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_renderbuffer_parameteri(target, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getRenderbufferParameteriv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_renderbuffer_parameteriv(target, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getSamplerParameter(sampler:GLSampler, pname:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getSamplerParameterf(sampler:GLSampler, pname:Int):Float\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_sampler_parameterf(__getObjectID(sampler), pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getSamplerParameterfv(sampler:GLSampler, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_sampler_parameterfv(__getObjectID(sampler), pname, params);\n\t\t#end\n\t}\n\n\tpublic function getSamplerParameteri(sampler:GLSampler, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_sampler_parameteri(__getObjectID(sampler), pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getSamplerParameteriv(sampler:GLSampler, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_sampler_parameteriv(__getObjectID(sampler), pname, params);\n\t\t#end\n\t}\n\n\tpublic function getShaderi(shader:GLShader, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_shaderi(__getObjectID(shader), pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getShaderiv(shader:GLShader, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_shaderiv(__getObjectID(shader), pname, params);\n\t\t#end\n\t}\n\n\tpublic function getShaderInfoLog(shader:GLShader):String\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_shader_info_log(__getObjectID(shader));\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getShaderParameter(shader:GLShader, pname:Int):Dynamic\n\t{\n\t\treturn getShaderi(shader, pname);\n\t}\n\n\tpublic function getShaderPrecisionFormat(shadertype:Int, precisiontype:Int):GLShaderPrecisionFormat\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_shader_precision_format(shadertype, precisiontype);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getShaderSource(shader:GLShader):String\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_shader_source(__getObjectID(shader));\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getString(name:Int):String\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_string(name);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getStringi(name:Int, index:Int):String\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar result = NativeCFFI.lime_gl_get_stringi(name, index);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getSupportedExtensions():Array<String>\n\t{\n\t\tif (__supportedExtensions == null)\n\t\t{\n\t\t\t// TODO: getStringi for newer GL versions\n\n\t\t\t__supportedExtensions = new Array<String>();\n\t\t\tvar extensions = getString(GL.EXTENSIONS);\n\n\t\t\tif (extensions != null)\n\t\t\t{\n\t\t\t\tvar extensionList = extensions.split(\" \");\n\n\t\t\t\tfor (extension in extensionList)\n\t\t\t\t{\n\t\t\t\t\tif (StringTools.startsWith(extension, \"GL_\"))\n\t\t\t\t\t{\n\t\t\t\t\t\t__supportedExtensions.push(extension.substr(3));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t__supportedExtensions.push(extension);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn __supportedExtensions;\n\t}\n\n\tpublic function getSyncParameter(sync:GLSync, pname:Int):Dynamic\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getSyncParameteri(sync:GLSync, pname:Int):Int\n\t{\n\t\t// TODO\n\n\t\treturn 0;\n\t}\n\n\tpublic function getSyncParameteriv(sync:GLSync, pname:Int, params:DataPointer):Void\n\t{\n\t\t// TODO\n\t}\n\n\tpublic function getTexParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\tswitch (pname)\n\t\t{\n\t\t\tcase GL.TEXTURE_MAX_LOD, GL.TEXTURE_MIN_LOD:\n\t\t\t\treturn getTexParameterf(target, pname);\n\n\t\t\tcase GL.TEXTURE_IMMUTABLE_FORMAT:\n\t\t\t\treturn getTexParameterf(target, pname) != 0;\n\n\t\t\tdefault:\n\t\t\t\treturn getTexParameteri(target, pname);\n\t\t}\n\t}\n\n\tpublic function getTexParameterf(target:Int, pname:Int):Float\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_tex_parameterf(target, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getTexParameterfv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_tex_parameterfv(target, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getTexParameteri(target:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_tex_parameteri(target, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getTexParameteriv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_tex_parameteriv(target, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getTransformFeedbackVarying(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar result = NativeCFFI.lime_gl_get_transform_feedback_varying(__getObjectID(program), index);\n\t\tif (result != null)\n\t\t{\n\t\t\treturn {\n\t\t\t\tsize: result.size,\n\t\t\t\ttype: result.type,\n\t\t\t\tname: CFFI.stringValue(result.name)\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\t#else\n\t\tvar result:Dynamic = NativeCFFI.lime_gl_get_transform_feedback_varying(__getObjectID(program), index);\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getUniform(program:GLProgram, location:GLUniformLocation):Dynamic\n\t{\n\t\tvar info = getActiveUniform(program, location);\n\n\t\tvar bools = 0;\n\t\tvar ints = 0;\n\t\tvar floats = 0;\n\n\t\tswitch (info.type)\n\t\t{\n\t\t\tcase GL.BOOL:\n\t\t\t\tbools = 1;\n\t\t\tcase GL.INT:\n\t\t\t\tints = 1;\n\t\t\tcase GL.FLOAT:\n\t\t\t\tfloats = 1;\n\t\t\tcase GL.FLOAT_VEC2:\n\t\t\t\tfloats = 2;\n\t\t\tcase GL.INT_VEC2:\n\t\t\t\tints = 2;\n\t\t\tcase GL.BOOL_VEC2:\n\t\t\t\tbools = 2;\n\t\t\tcase GL.FLOAT_VEC3:\n\t\t\t\tfloats = 3;\n\t\t\tcase GL.INT_VEC3:\n\t\t\t\tints = 3;\n\t\t\tcase GL.BOOL_VEC3:\n\t\t\t\tbools = 3;\n\t\t\tcase GL.FLOAT_VEC4:\n\t\t\t\tfloats = 4;\n\t\t\tcase GL.INT_VEC4:\n\t\t\t\tints = 4;\n\t\t\tcase GL.BOOL_VEC4:\n\t\t\t\tbools = 4;\n\t\t\tcase GL.FLOAT_MAT2:\n\t\t\t\tfloats = 4;\n\t\t\tcase GL.FLOAT_MAT2x3:\n\t\t\t\tfloats = 12;\n\t\t\tcase GL.FLOAT_MAT2x4:\n\t\t\t\tfloats = 16;\n\t\t\tcase GL.FLOAT_MAT3:\n\t\t\t\tfloats = 9;\n\t\t\tcase GL.FLOAT_MAT3x2:\n\t\t\t\tfloats = 18;\n\t\t\tcase GL.FLOAT_MAT3x4:\n\t\t\t\tfloats = 36;\n\t\t\tcase GL.FLOAT_MAT4:\n\t\t\t\tfloats = 16;\n\t\t\tcase GL.FLOAT_MAT4x2:\n\t\t\t\tfloats = 32;\n\t\t\tcase GL.FLOAT_MAT4x3:\n\t\t\t\tfloats = 48;\n\t\t\tcase GL.SAMPLER_2D, GL.SAMPLER_3D, GL.SAMPLER_CUBE, GL.SAMPLER_2D_SHADOW:\n\t\t\t\tints = 1;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\n\t\tif (bools == 1)\n\t\t{\n\t\t\treturn getUniformi(program, location) != 0;\n\t\t}\n\t\telse if (ints == 1)\n\t\t{\n\t\t\treturn getUniformi(program, location);\n\t\t}\n\t\telse if (floats == 1)\n\t\t{\n\t\t\treturn getUniformf(program, location);\n\t\t}\n\t\telse if (bools > 0)\n\t\t{\n\t\t\tvar params = Bytes.alloc(bools);\n\t\t\tgetUniformiv(program, location, params);\n\n\t\t\tvar data = new Array<Bool>();\n\n\t\t\tfor (i in 0...bools)\n\t\t\t{\n\t\t\t\tdata[i] = params.get(i) != 0;\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\t\telse if (ints > 0)\n\t\t{\n\t\t\tvar params = new Int32Array(ints);\n\t\t\tgetUniformiv(program, location, params);\n\t\t\treturn params;\n\t\t}\n\t\telse if (floats > 0)\n\t\t{\n\t\t\tvar params = new Float32Array(floats);\n\t\t\tgetUniformfv(program, location, params);\n\t\t\treturn params;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function getUniformf(program:GLProgram, location:GLUniformLocation):Float\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_uniformf(__getObjectID(program), location);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getUniformfv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_uniformfv(__getObjectID(program), location, params);\n\t\t#end\n\t}\n\n\tpublic function getUniformi(program:GLProgram, location:GLUniformLocation):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_uniformi(__getObjectID(program), location);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getUniformiv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_uniformiv(__getObjectID(program), location, params);\n\t\t#end\n\t}\n\n\tpublic function getUniformui(program:GLProgram, location:GLUniformLocation):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_uniformui(__getObjectID(program), location);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getUniformuiv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_uniformuiv(__getObjectID(program), location, params);\n\t\t#end\n\t}\n\n\tpublic function getUniformBlockIndex(program:GLProgram, uniformBlockName:String):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_uniform_block_index(__getObjectID(program), uniformBlockName);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getUniformIndices(program:GLProgram, uniformNames:Array<String>):Array<Int>\n\t{\n\t\t// TODO\n\n\t\treturn null;\n\t}\n\n\tpublic function getUniformLocation(program:GLProgram, name:String):GLUniformLocation\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_uniform_location(__getObjectID(program), name);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getVertexAttrib(index:Int, pname:Int):Dynamic\n\t{\n\t\treturn getVertexAttribi(index, pname);\n\t}\n\n\tpublic function getVertexAttribf(index:Int, pname:Int):Float\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_vertex_attribf(index, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribfv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_vertex_attribfv(index, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribi(index:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_vertex_attribi(index, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribIi(index:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_vertex_attribii(index, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribIiv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_vertex_attribiiv(index, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribIui(index:Int, pname:Int):Int\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_vertex_attribiui(index, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribIuiv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_vertex_attribiuiv(index, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribiv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_get_vertex_attribiv(index, pname, params);\n\t\t#end\n\t}\n\n\tpublic function getVertexAttribPointerv(index:Int, pname:Int):DataPointer\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_get_vertex_attrib_pointerv(index, pname);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function hint(target:Int, mode:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_hint(target, mode);\n\t\t#end\n\t}\n\n\tpublic function invalidateFramebuffer(target:Int, attachments:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar _attachments = new hl.NativeArray<Int>(attachments.length);\n\t\tfor (i in 0...attachments.length)\n\t\t\t_attachments[i] = attachments[i];\n\t\tvar attachments = _attachments;\n\t\t#end\n\t\tNativeCFFI.lime_gl_invalidate_framebuffer(target, attachments);\n\t\t#end\n\t}\n\n\tpublic function invalidateSubFramebuffer(target:Int, attachments:Array<Int>, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar _attachments = new hl.NativeArray<Int>(attachments.length);\n\t\tfor (i in 0...attachments.length)\n\t\t\t_attachments[i] = attachments[i];\n\t\tvar attachments = _attachments;\n\t\t#end\n\t\tNativeCFFI.lime_gl_invalidate_sub_framebuffer(target, attachments, x, y, width, height);\n\t\t#end\n\t}\n\n\tpublic function isBuffer(buffer:GLBuffer):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_buffer(__getObjectID(buffer));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isContextLost():Bool\n\t{\n\t\treturn __isContextLost;\n\t}\n\n\tpublic function isEnabled(cap:Int):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_enabled(cap);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isFramebuffer(framebuffer:GLFramebuffer):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_framebuffer(__getObjectID(framebuffer));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isProgram(program:GLProgram):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_program(__getObjectID(program));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isQuery(query:GLQuery):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_query(__getObjectID(query));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isRenderbuffer(renderbuffer:GLRenderbuffer):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_renderbuffer(__getObjectID(renderbuffer));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isSampler(sampler:GLSampler):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_sampler(__getObjectID(sampler));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isShader(shader:GLShader):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_shader(__getObjectID(shader));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isSync(sync:GLSync):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_sync(sync);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isTexture(texture:GLTexture):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_texture(__getObjectID(texture));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isTransformFeedback(transformFeedback:GLTransformFeedback):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_transform_feedback(__getObjectID(transformFeedback));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function isVertexArray(vertexArray:GLVertexArrayObject):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_is_vertex_array(__getObjectID(vertexArray));\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function lineWidth(width:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_line_width(width);\n\t\t#end\n\t}\n\n\tpublic function linkProgram(program:GLProgram):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_link_program(__getObjectID(program));\n\t\t#end\n\t}\n\n\tpublic function mapBufferRange(target:Int, offset:DataPointer, length:Int, access:Int):DataPointer\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_map_buffer_range(target, offset, length, access);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function pauseTransformFeedback():Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_pause_transform_feedback();\n\t\t#end\n\t}\n\n\tpublic function pixelStorei(pname:Int, param:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_pixel_storei(pname, param);\n\t\t#end\n\t}\n\n\tpublic function polygonOffset(factor:Float, units:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_polygon_offset(factor, units);\n\t\t#end\n\t}\n\n\tpublic function programBinary(program:GLProgram, binaryFormat:Int, binary:DataPointer, length:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_program_binary(__getObjectID(program), binaryFormat, binary, length);\n\t\t#end\n\t}\n\n\tpublic function programParameteri(program:GLProgram, pname:Int, value:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_program_parameteri(__getObjectID(program), pname, value);\n\t\t#end\n\t}\n\n\tpublic function readBuffer(src:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_read_buffer(src);\n\t\t#end\n\t}\n\n\tpublic function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_read_pixels(x, y, width, height, format, type, pixels);\n\t\t#end\n\t}\n\n\tpublic function releaseShaderCompiler():Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_release_shader_compiler();\n\t\t#end\n\t}\n\n\tpublic function renderbufferStorage(target:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_renderbuffer_storage(target, internalformat, width, height);\n\t\t#end\n\t}\n\n\tpublic function renderbufferStorageMultisample(target:Int, samples:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_renderbuffer_storage_multisample(target, samples, internalformat, width, height);\n\t\t#end\n\t}\n\n\tpublic function resumeTransformFeedback():Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_resume_transform_feedback();\n\t\t#end\n\t}\n\n\tpublic function sampleCoverage(value:Float, invert:Bool):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_sample_coverage(value, invert);\n\t\t#end\n\t}\n\n\tpublic function samplerParameterf(sampler:GLSampler, pname:Int, param:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_sampler_parameterf(__getObjectID(sampler), pname, param);\n\t\t#end\n\t}\n\n\tpublic function samplerParameteri(sampler:GLSampler, pname:Int, param:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_sampler_parameteri(__getObjectID(sampler), pname, param);\n\t\t#end\n\t}\n\n\tpublic function scissor(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_scissor(x, y, width, height);\n\t\t#end\n\t}\n\n\tpublic function shaderBinary(shaders:Array<GLShader>, binaryformat:Int, binary:DataPointer, length:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar _shaders = new hl.NativeArray<Int>(shaders.length);\n\t\tfor (i in 0...shaders.length)\n\t\t\t_shaders[i] = shaders[i].id;\n\t\tvar shaders = _shaders;\n\t\t#end\n\t\tNativeCFFI.lime_gl_shader_binary(shaders, binaryformat, binary, length);\n\t\t#end\n\t}\n\n\tpublic function shaderSource(shader:GLShader, source:String):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_shader_source(__getObjectID(shader), source);\n\t\t#end\n\t}\n\n\tpublic function stencilFunc(func:Int, ref:Int, mask:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_stencil_func(func, ref, mask);\n\t\t#end\n\t}\n\n\tpublic function stencilFuncSeparate(face:Int, func:Int, ref:Int, mask:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_stencil_func_separate(face, func, ref, mask);\n\t\t#end\n\t}\n\n\tpublic function stencilMask(mask:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_stencil_mask(mask);\n\t\t#end\n\t}\n\n\tpublic function stencilMaskSeparate(face:Int, mask:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_stencil_mask_separate(face, mask);\n\t\t#end\n\t}\n\n\tpublic function stencilOp(fail:Int, zfail:Int, zpass:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_stencil_op(fail, zfail, zpass);\n\t\t#end\n\t}\n\n\tpublic function stencilOpSeparate(face:Int, fail:Int, zfail:Int, zpass:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_stencil_op_separate(face, fail, zfail, zpass);\n\t\t#end\n\t}\n\n\tpublic function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, data:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_image_2d(target, level, internalformat, width, height, border, format, type, data);\n\t\t#end\n\t}\n\n\tpublic function texImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_image_3d(target, level, internalformat, width, height, depth, border, format, type, data);\n\t\t#end\n\t}\n\n\tpublic function texStorage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_storage_2d(target, level, internalformat, width, height);\n\t\t#end\n\t}\n\n\tpublic function texStorage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_storage_3d(target, level, internalformat, width, height, depth);\n\t\t#end\n\t}\n\n\tpublic function texParameterf(target:Int, pname:Int, param:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_parameterf(target, pname, param);\n\t\t#end\n\t}\n\n\tpublic function texParameteri(target:Int, pname:Int, param:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_parameteri(target, pname, param);\n\t\t#end\n\t}\n\n\tpublic function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, pixels:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_sub_image_2d(target, level, xoffset, yoffset, width, height, format, type, pixels);\n\t\t#end\n\t}\n\n\tpublic function texSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_tex_sub_image_3d(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);\n\t\t#end\n\t}\n\n\t@:noCompletion @:dox(hide) public function toString():String\n\t{\n\t\treturn \"NativeOpenGLRenderContext\";\n\t}\n\n\tpublic function transformFeedbackVaryings(program:GLProgram, varyings:Array<String>, bufferMode:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\t#if hl\n\t\tvar _varyings = new hl.NativeArray<Int>(varyings.length);\n\t\tfor (i in 0...varyings.length)\n\t\t\t_varyings[i] = varyings[i].charCodeAt(0);\n\t\tvar varyings = _varyings;\n\t\t#end\n\t\tNativeCFFI.lime_gl_transform_feedback_varyings(__getObjectID(program), varyings, bufferMode);\n\t\t#end\n\t}\n\n\tpublic function uniform1f(location:GLUniformLocation, v0:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform1f(location, v0);\n\t\t#end\n\t}\n\n\tpublic function uniform1fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform1fv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform1i(location:GLUniformLocation, v0:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform1i(location, v0);\n\t\t#end\n\t}\n\n\tpublic function uniform1iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform1iv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform1ui(location:GLUniformLocation, v0:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform1ui(location, v0);\n\t\t#end\n\t}\n\n\tpublic function uniform1uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform1uiv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform2f(location:GLUniformLocation, v0:Float, v1:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform2f(location, v0, v1);\n\t\t#end\n\t}\n\n\tpublic function uniform2fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform2fv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform2i(location:GLUniformLocation, v0:Int, v1:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform2i(location, v0, v1);\n\t\t#end\n\t}\n\n\tpublic function uniform2iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform2iv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform2ui(location:GLUniformLocation, v0:Int, v1:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform2ui(location, v0, v1);\n\t\t#end\n\t}\n\n\tpublic function uniform2uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform2uiv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform3f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform3f(location, v0, v1, v2);\n\t\t#end\n\t}\n\n\tpublic function uniform3fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform3fv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform3i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform3i(location, v0, v1, v2);\n\t\t#end\n\t}\n\n\tpublic function uniform3iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform3iv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform3ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform3ui(location, v0, v1, v2);\n\t\t#end\n\t}\n\n\tpublic function uniform3uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform3uiv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform4f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float, v3:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform4f(location, v0, v1, v2, v3);\n\t\t#end\n\t}\n\n\tpublic function uniform4fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform4fv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform4i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform4i(location, v0, v1, v2, v3);\n\t\t#end\n\t}\n\n\tpublic function uniform4iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform4iv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniform4ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform4ui(location, v0, v1, v2, v3);\n\t\t#end\n\t}\n\n\tpublic function uniform4uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform4uiv(location, count, v);\n\t\t#end\n\t}\n\n\tpublic function uniformBlockBinding(program:GLProgram, uniformBlockIndex:Int, uniformBlockBinding:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_block_binding(__getObjectID(program), uniformBlockIndex, uniformBlockBinding);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix2fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix2x3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix2x3fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix2x4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix2x4fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix3fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix3x2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix3x2fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix3x4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix3x4fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix4fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix4x2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix4x2fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function uniformMatrix4x3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_uniform_matrix4x3fv(location, count, transpose, v);\n\t\t#end\n\t}\n\n\tpublic function unmapBuffer(target:Int):Bool\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\treturn NativeCFFI.lime_gl_unmap_buffer(target);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function useProgram(program:GLProgram):Void\n\t{\n\t\t__currentProgram = program;\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_use_program(__getObjectID(program));\n\t\t#end\n\t}\n\n\tpublic function validateProgram(program:GLProgram):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_validate_program(__getObjectID(program));\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib1f(index:Int, v0:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib1f(index, v0);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib1fv(index:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib1fv(index, v);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib2f(index:Int, v0:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib2f(index, v0, y);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib2fv(index:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib2fv(index, v);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib3f(index:Int, v0:Float, v1:Float, v2:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib3f(index, v0, v1, v2);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib3fv(index:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib3fv(index, v);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib4f(index:Int, v0:Float, v1:Float, v2:Float, v3:Float):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib4f(index, v0, v1, v2, v3);\n\t\t#end\n\t}\n\n\tpublic function vertexAttrib4fv(index:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib4fv(index, v);\n\t\t#end\n\t}\n\n\tpublic function vertexAttribDivisor(index:Int, divisor:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib_divisor(index, divisor);\n\t\t#end\n\t}\n\n\tpublic function vertexAttribI4i(index:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attribi4i(index, v0, v1, v2, v3);\n\t\t#end\n\t}\n\n\t// public function vertexAttribI4iv (index:Int, value:js.html.Int32Array) {\n\t// public function vertexAttribI4iv (index:Int, value:Array<Int>) {\n\tpublic function vertexAttribI4iv(index:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attribi4iv(index, v);\n\t\t#end\n\t}\n\n\tpublic function vertexAttribI4ui(index:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attribi4ui(index, v0, v1, v2, v3);\n\t\t#end\n\t}\n\n\t// public function vertexAttribI4iv (index:Int, value:js.html.Int32Array) {\n\t// public function vertexAttribI4iv (index:Int, value:Array<Int>) {\n\tpublic function vertexAttribI4uiv(index:Int, v:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attribi4uiv(index, v);\n\t\t#end\n\t}\n\n\tpublic function vertexAttribIPointer(index:Int, size:Int, type:Int, stride:Int, offset:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib_ipointer(index, size, type, stride, offset);\n\t\t#end\n\t}\n\n\tpublic function vertexAttribPointer(index:Int, size:Int, type:Int, normalized:Bool, stride:Int, offset:DataPointer):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_vertex_attrib_pointer(index, size, type, normalized, stride, offset);\n\t\t#end\n\t}\n\n\tpublic function viewport(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_viewport(x, y, width, height);\n\t\t#end\n\t}\n\n\tpublic function waitSync(sync:GLSync, flags:Int, timeout:Int64):Void\n\t{\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tNativeCFFI.lime_gl_wait_sync(sync, flags, timeout.high, timeout.low);\n\t\t#end\n\t}\n\n\tprivate function __contextLost():Void\n\t{\n\t\t__isContextLost = true;\n\t\t__arrayBufferBinding = null;\n\t\t__elementBufferBinding = null;\n\t\t__currentProgram = null;\n\t\t__framebufferBinding = null;\n\t\t__renderbufferBinding = null;\n\t\t__texture2DBinding = null;\n\t\t__textureCubeMapBinding = null;\n\t}\n\n\t#if (!js || !html5 || doc_gen)\n\tprivate function __createObject(id:Int):GLObject\n\t{\n\t\treturn new GLObject(id);\n\t}\n\n\tprivate function __getObjectID(object:GLObject):Int\n\t{\n\t\treturn (object == null) ? 0 : object.id;\n\t}\n\t#end\n\n\tprivate function __initialize():Void\n\t{\n\t\tif (!__initialized)\n\t\t{\n\t\t\t__extensionObjectConstructors[\"AMD_compressed_3DC_texture\"] = AMD_compressed_3DC_texture.new;\n\t\t\t__extensionObjectConstructors[\"AMD_compressed_ATC_texture\"] = AMD_compressed_ATC_texture.new;\n\t\t\t__extensionObjectConstructors[\"AMD_performance_monitor\"] = AMD_performance_monitor.new;\n\t\t\t__extensionObjectConstructors[\"AMD_program_binary_Z400\"] = AMD_program_binary_Z400.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_framebuffer_blit\"] = ANGLE_framebuffer_blit.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_framebuffer_multisample\"] = ANGLE_framebuffer_multisample.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_instanced_arrays\"] = ANGLE_instanced_arrays.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_pack_reverse_row_order\"] = ANGLE_pack_reverse_row_order.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_texture_compression_dxt3\"] = ANGLE_texture_compression_dxt3.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_texture_compression_dxt5\"] = ANGLE_texture_compression_dxt5.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_texture_usage\"] = ANGLE_texture_usage.new;\n\t\t\t__extensionObjectConstructors[\"ANGLE_translated_shader_source\"] = ANGLE_translated_shader_source.new;\n\t\t\t__extensionObjectConstructors[\"APPLE_copy_texture_levels\"] = APPLE_copy_texture_levels.new;\n\t\t\t__extensionObjectConstructors[\"APPLE_framebuffer_multisample\"] = APPLE_framebuffer_multisample.new;\n\t\t\t__extensionObjectConstructors[\"APPLE_rgb_422\"] = APPLE_rgb_422.new;\n\t\t\t__extensionObjectConstructors[\"APPLE_sync\"] = APPLE_sync.new;\n\t\t\t__extensionObjectConstructors[\"APPLE_texture_format_BGRA8888\"] = APPLE_texture_format_BGRA8888.new;\n\t\t\t__extensionObjectConstructors[\"APPLE_texture_max_level\"] = APPLE_texture_max_level.new;\n\t\t\t__extensionObjectConstructors[\"ARM_mali_program_binary\"] = ARM_mali_program_binary.new;\n\t\t\t__extensionObjectConstructors[\"ARM_mali_shader_binary\"] = ARM_mali_shader_binary.new;\n\t\t\t__extensionObjectConstructors[\"ARM_rgba8\"] = ARM_rgba8.new;\n\t\t\t__extensionObjectConstructors[\"DMP_shader_binary\"] = DMP_shader_binary.new;\n\t\t\t__extensionObjectConstructors[\"EXT_bgra\"] = EXT_bgra.new;\n\t\t\t__extensionObjectConstructors[\"EXT_blend_minmax\"] = EXT_blend_minmax.new;\n\t\t\t__extensionObjectConstructors[\"EXT_color_buffer_float\"] = EXT_color_buffer_float.new;\n\t\t\t__extensionObjectConstructors[\"EXT_color_buffer_half_float\"] = EXT_color_buffer_half_float.new;\n\t\t\t__extensionObjectConstructors[\"EXT_debug_label\"] = EXT_debug_label.new;\n\t\t\t__extensionObjectConstructors[\"EXT_debug_marker\"] = EXT_debug_marker.new;\n\t\t\t__extensionObjectConstructors[\"EXT_discard_framebuffer\"] = EXT_discard_framebuffer.new;\n\t\t\t__extensionObjectConstructors[\"EXT_map_buffer_range\"] = EXT_map_buffer_range.new;\n\t\t\t__extensionObjectConstructors[\"EXT_multi_draw_arrays\"] = EXT_multi_draw_arrays.new;\n\t\t\t__extensionObjectConstructors[\"EXT_multisampled_render_to_texture\"] = EXT_multisampled_render_to_texture.new;\n\t\t\t__extensionObjectConstructors[\"EXT_multiview_draw_buffers\"] = EXT_multiview_draw_buffers.new;\n\t\t\t__extensionObjectConstructors[\"EXT_occlusion_query_boolean\"] = EXT_occlusion_query_boolean.new;\n\t\t\t__extensionObjectConstructors[\"EXT_packed_depth_stencil\"] = EXT_packed_depth_stencil.new;\n\t\t\t__extensionObjectConstructors[\"EXT_read_format_bgra\"] = EXT_read_format_bgra.new;\n\t\t\t__extensionObjectConstructors[\"EXT_robustness\"] = EXT_robustness.new;\n\t\t\t__extensionObjectConstructors[\"EXT_sRGB\"] = EXT_sRGB.new;\n\t\t\t__extensionObjectConstructors[\"EXT_separate_shader_objects\"] = EXT_separate_shader_objects.new;\n\t\t\t__extensionObjectConstructors[\"EXT_shader_framebuffer_fetch\"] = EXT_shader_framebuffer_fetch.new;\n\t\t\t__extensionObjectConstructors[\"EXT_shader_texture_lod\"] = EXT_shader_texture_lod.new;\n\t\t\t__extensionObjectConstructors[\"EXT_shadow_samplers\"] = EXT_shadow_samplers.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_compression_dxt1\"] = EXT_texture_compression_dxt1.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_compression_s3tc\"] = EXT_texture_compression_s3tc.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_filter_anisotropic\"] = EXT_texture_filter_anisotropic.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_format_BGRA8888\"] = EXT_texture_format_BGRA8888.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_rg\"] = EXT_texture_rg.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_storage\"] = EXT_texture_storage.new;\n\t\t\t__extensionObjectConstructors[\"EXT_texture_type_2_10_10_10_REV\"] = EXT_texture_type_2_10_10_10_REV.new;\n\t\t\t__extensionObjectConstructors[\"EXT_unpack_subimage\"] = EXT_unpack_subimage.new;\n\t\t\t__extensionObjectConstructors[\"FJ_shader_binary_GCCSO\"] = FJ_shader_binary_GCCSO.new;\n\t\t\t__extensionObjectConstructors[\"IMG_multisampled_render_to_texture\"] = IMG_multisampled_render_to_texture.new;\n\t\t\t__extensionObjectConstructors[\"IMG_program_binary\"] = IMG_program_binary.new;\n\t\t\t__extensionObjectConstructors[\"IMG_read_format\"] = IMG_read_format.new;\n\t\t\t__extensionObjectConstructors[\"IMG_shader_binary\"] = IMG_shader_binary.new;\n\t\t\t__extensionObjectConstructors[\"IMG_texture_compression_pvrtc\"] = IMG_texture_compression_pvrtc.new;\n\t\t\t__extensionObjectConstructors[\"KHR_debug\"] = KHR_debug.new;\n\t\t\t__extensionObjectConstructors[\"KHR_texture_compression_astc_ldr\"] = KHR_texture_compression_astc_ldr.new;\n\t\t\t__extensionObjectConstructors[\"NV_coverage_sample\"] = NV_coverage_sample.new;\n\t\t\t__extensionObjectConstructors[\"NV_depth_nonlinear\"] = NV_depth_nonlinear.new;\n\t\t\t__extensionObjectConstructors[\"NV_draw_buffers\"] = NV_draw_buffers.new;\n\t\t\t__extensionObjectConstructors[\"NV_fbo_color_attachments\"] = NV_fbo_color_attachments.new;\n\t\t\t__extensionObjectConstructors[\"NV_fence\"] = NV_fence.new;\n\t\t\t__extensionObjectConstructors[\"NV_read_buffer\"] = NV_read_buffer.new;\n\t\t\t__extensionObjectConstructors[\"NV_read_buffer_front\"] = NV_read_buffer_front.new;\n\t\t\t__extensionObjectConstructors[\"NV_read_depth\"] = NV_read_depth.new;\n\t\t\t__extensionObjectConstructors[\"NV_read_depth_stencil\"] = NV_read_depth_stencil.new;\n\t\t\t__extensionObjectConstructors[\"NV_read_stencil\"] = NV_read_stencil.new;\n\t\t\t__extensionObjectConstructors[\"NV_texture_compression_s3tc_update\"] = NV_texture_compression_s3tc_update.new;\n\t\t\t__extensionObjectConstructors[\"NV_texture_npot_2D_mipmap\"] = NV_texture_npot_2D_mipmap.new;\n\t\t\t__extensionObjectConstructors[\"NVX_gpu_memory_info\"] = NVX_gpu_memory_info.new;\n\t\t\t__extensionObjectConstructors[\"OES_EGL_image\"] = OES_EGL_image.new;\n\t\t\t__extensionObjectConstructors[\"OES_EGL_image_external\"] = OES_EGL_image_external.new;\n\t\t\t__extensionObjectConstructors[\"OES_compressed_ETC1_RGB8_texture\"] = OES_compressed_ETC1_RGB8_texture.new;\n\t\t\t__extensionObjectConstructors[\"OES_compressed_paletted_texture\"] = OES_compressed_paletted_texture.new;\n\t\t\t__extensionObjectConstructors[\"OES_depth24\"] = OES_depth24.new;\n\t\t\t__extensionObjectConstructors[\"OES_depth32\"] = OES_depth32.new;\n\t\t\t__extensionObjectConstructors[\"OES_depth_texture\"] = OES_depth_texture.new;\n\t\t\t__extensionObjectConstructors[\"OES_element_index_uint\"] = OES_element_index_uint.new;\n\t\t\t__extensionObjectConstructors[\"OES_get_program_binary\"] = OES_get_program_binary.new;\n\t\t\t__extensionObjectConstructors[\"OES_mapbuffer\"] = OES_mapbuffer.new;\n\t\t\t__extensionObjectConstructors[\"OES_packed_depth_stencil\"] = OES_packed_depth_stencil.new;\n\t\t\t__extensionObjectConstructors[\"OES_required_internalformat\"] = OES_required_internalformat.new;\n\t\t\t__extensionObjectConstructors[\"OES_rgb8_rgba8\"] = OES_rgb8_rgba8.new;\n\t\t\t__extensionObjectConstructors[\"OES_standard_derivatives\"] = OES_standard_derivatives.new;\n\t\t\t__extensionObjectConstructors[\"OES_stencil1\"] = OES_stencil1.new;\n\t\t\t__extensionObjectConstructors[\"OES_stencil4\"] = OES_stencil4.new;\n\t\t\t__extensionObjectConstructors[\"OES_surfaceless_context\"] = OES_surfaceless_context.new;\n\t\t\t__extensionObjectConstructors[\"OES_texture_3D\"] = OES_texture_3D.new;\n\t\t\t__extensionObjectConstructors[\"OES_texture_float\"] = OES_texture_float.new;\n\t\t\t__extensionObjectConstructors[\"OES_texture_float_linear\"] = OES_texture_float_linear.new;\n\t\t\t__extensionObjectConstructors[\"OES_texture_half_float\"] = OES_texture_half_float.new;\n\t\t\t__extensionObjectConstructors[\"OES_texture_half_float_linear\"] = OES_texture_half_float_linear.new;\n\t\t\t__extensionObjectConstructors[\"OES_texture_npot\"] = OES_texture_npot.new;\n\t\t\t__extensionObjectConstructors[\"OES_vertex_array_object\"] = OES_vertex_array_object.new;\n\t\t\t__extensionObjectConstructors[\"OES_vertex_half_float\"] = OES_vertex_half_float.new;\n\t\t\t__extensionObjectConstructors[\"OES_vertex_type_10_10_10_2\"] = OES_vertex_type_10_10_10_2.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_alpha_test\"] = QCOM_alpha_test.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_binning_control\"] = QCOM_binning_control.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_driver_control\"] = QCOM_driver_control.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_extended_get\"] = QCOM_extended_get.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_extended_get2\"] = QCOM_extended_get2.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_perfmon_global_mode\"] = QCOM_perfmon_global_mode.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_tiled_rendering\"] = QCOM_tiled_rendering.new;\n\t\t\t__extensionObjectConstructors[\"QCOM_writeonly_rendering\"] = QCOM_writeonly_rendering.new;\n\t\t\t__extensionObjectConstructors[\"VIV_shader_binary\"] = VIV_shader_binary.new;\n\t\t}\n\n\t\t__initialized = true;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/backend/native/NativeWindow.hx",
    "content": "package lime._internal.backend.native;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Application;\nimport lime.graphics.cairo.Cairo;\nimport lime.graphics.cairo.CairoFormat;\nimport lime.graphics.cairo.CairoImageSurface;\nimport lime.graphics.cairo.CairoSurface;\nimport lime.graphics.opengl.GL;\nimport lime.graphics.CairoRenderContext;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.graphics.OpenGLRenderContext;\nimport lime.graphics.RenderContext;\nimport lime.math.Rectangle;\nimport lime.math.Vector2;\nimport lime.system.CFFI;\nimport lime.system.Display;\nimport lime.system.DisplayMode;\nimport lime.system.JNI;\nimport lime.system.System;\nimport lime.ui.MouseCursor;\nimport lime.ui.Window;\nimport lime.utils.UInt8Array;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime._internal.backend.native.NativeOpenGLRenderContext)\n@:access(lime.app.Application)\n@:access(lime.graphics.cairo.Cairo)\n@:access(lime.graphics.opengl.GL)\n@:access(lime.graphics.OpenGLRenderContext)\n@:access(lime.graphics.RenderContext)\n@:access(lime.system.DisplayMode)\n@:access(lime.ui.Window)\nclass NativeWindow\n{\n\tpublic var handle:Dynamic;\n\n\tprivate var closing:Bool;\n\tprivate var cursor:MouseCursor;\n\tprivate var displayMode:DisplayMode;\n\tprivate var frameRate:Float;\n\tprivate var mouseLock:Bool;\n\tprivate var parent:Window;\n\tprivate var useHardware:Bool;\n\t#if lime_cairo\n\tprivate var cacheLock:Dynamic;\n\tprivate var cairo:Cairo;\n\tprivate var primarySurface:CairoSurface;\n\t#end\n\n\tpublic function new(parent:Window)\n\t{\n\t\tthis.parent = parent;\n\n\t\tcursor = DEFAULT;\n\t\tdisplayMode = new DisplayMode(0, 0, 0, 0);\n\n\t\tvar attributes = parent.__attributes;\n\t\tvar contextAttributes = Reflect.hasField(attributes, \"context\") ? attributes.context : {};\n\t\tvar title = Reflect.hasField(attributes, \"title\") ? attributes.title : \"Lime Application\";\n\t\tvar flags = 0;\n\n\t\tif (!Reflect.hasField(contextAttributes, \"antialiasing\")) contextAttributes.antialiasing = 0;\n\t\tif (!Reflect.hasField(contextAttributes, \"background\")) contextAttributes.background = 0;\n\t\tif (!Reflect.hasField(contextAttributes, \"colorDepth\")) contextAttributes.colorDepth = 24;\n\t\tif (!Reflect.hasField(contextAttributes, \"depth\")) contextAttributes.depth = true;\n\t\tif (!Reflect.hasField(contextAttributes, \"hardware\")) contextAttributes.hardware = true;\n\t\tif (!Reflect.hasField(contextAttributes, \"stencil\")) contextAttributes.stencil = true;\n\t\tif (!Reflect.hasField(contextAttributes, \"vsync\")) contextAttributes.vsync = false;\n\n\t\t#if (cairo || (!lime_opengl && !lime_opengles))\n\t\tcontextAttributes.type = CAIRO;\n\t\t#end\n\t\tif (Reflect.hasField(contextAttributes, \"type\") && contextAttributes.type == CAIRO) contextAttributes.hardware = false;\n\n\t\tif (Reflect.hasField(attributes, \"allowHighDPI\") && attributes.allowHighDPI) flags |= cast WindowFlags.WINDOW_FLAG_ALLOW_HIGHDPI;\n\t\tif (Reflect.hasField(attributes, \"alwaysOnTop\") && attributes.alwaysOnTop) flags |= cast WindowFlags.WINDOW_FLAG_ALWAYS_ON_TOP;\n\t\tif (Reflect.hasField(attributes, \"borderless\") && attributes.borderless) flags |= cast WindowFlags.WINDOW_FLAG_BORDERLESS;\n\t\tif (Reflect.hasField(attributes, \"fullscreen\") && attributes.fullscreen) flags |= cast WindowFlags.WINDOW_FLAG_FULLSCREEN;\n\t\tif (Reflect.hasField(attributes, \"hidden\") && attributes.hidden) flags |= cast WindowFlags.WINDOW_FLAG_HIDDEN;\n\t\tif (Reflect.hasField(attributes, \"maximized\") && attributes.maximized) flags |= cast WindowFlags.WINDOW_FLAG_MAXIMIZED;\n\t\tif (Reflect.hasField(attributes, \"minimized\") && attributes.minimized) flags |= cast WindowFlags.WINDOW_FLAG_MINIMIZED;\n\t\tif (Reflect.hasField(attributes, \"resizable\") && attributes.resizable) flags |= cast WindowFlags.WINDOW_FLAG_RESIZABLE;\n\n\t\tif (contextAttributes.antialiasing >= 4)\n\t\t{\n\t\t\tflags |= cast WindowFlags.WINDOW_FLAG_HW_AA_HIRES;\n\t\t}\n\t\telse if (contextAttributes.antialiasing >= 2)\n\t\t{\n\t\t\tflags |= cast WindowFlags.WINDOW_FLAG_HW_AA;\n\t\t}\n\n\t\tif (contextAttributes.colorDepth == 32) flags |= cast WindowFlags.WINDOW_FLAG_COLOR_DEPTH_32_BIT;\n\t\tif (contextAttributes.depth) flags |= cast WindowFlags.WINDOW_FLAG_DEPTH_BUFFER;\n\t\tif (contextAttributes.hardware) flags |= cast WindowFlags.WINDOW_FLAG_HARDWARE;\n\t\tif (contextAttributes.stencil) flags |= cast WindowFlags.WINDOW_FLAG_STENCIL_BUFFER;\n\t\tif (contextAttributes.vsync) flags |= cast WindowFlags.WINDOW_FLAG_VSYNC;\n\n\t\tvar width = Reflect.hasField(attributes, \"width\") ? attributes.width : #if desktop 800 #else 0 #end;\n\t\tvar height = Reflect.hasField(attributes, \"height\") ? attributes.height : #if desktop 600 #else 0 #end;\n\n\t\t#if (!macro && lime_cffi)\n\t\thandle = NativeCFFI.lime_window_create(parent.application.__backend.handle, width, height, flags, title);\n\n\t\tif (handle != null)\n\t\t{\n\t\t\tparent.__width = NativeCFFI.lime_window_get_width(handle);\n\t\t\tparent.__height = NativeCFFI.lime_window_get_height(handle);\n\t\t\tparent.__x = NativeCFFI.lime_window_get_x(handle);\n\t\t\tparent.__y = NativeCFFI.lime_window_get_y(handle);\n\t\t\tparent.__hidden = (Reflect.hasField(attributes, \"hidden\") && attributes.hidden);\n\t\t\tparent.id = NativeCFFI.lime_window_get_id(handle);\n\t\t}\n\n\t\tparent.__scale = NativeCFFI.lime_window_get_scale(handle);\n\n\t\tvar context = new RenderContext();\n\t\tcontext.window = parent;\n\n\t\tvar contextType:String = CFFI.stringValue(NativeCFFI.lime_window_get_context_type(handle));\n\n\t\tswitch (contextType)\n\t\t{\n\t\t\tcase \"opengl\":\n\t\t\t\tvar gl = new NativeOpenGLRenderContext();\n\n\t\t\t\tuseHardware = true;\n\t\t\t\tcontextAttributes.hardware = true;\n\n\t\t\t\t#if lime_opengl\n\t\t\t\tcontext.gl = gl;\n\t\t\t\t#end\n\n\t\t\t\tcontext.gles2 = gl;\n\t\t\t\tcontext.webgl = gl;\n\t\t\t\tcontext.type = gl.type;\n\t\t\t\tcontext.version = Std.string(gl.version);\n\n\t\t\t\tif (gl.type == OPENGLES && gl.version >= 3)\n\t\t\t\t{\n\t\t\t\t\tcontext.gles3 = gl;\n\t\t\t\t\tcontext.webgl2 = gl;\n\t\t\t\t}\n\n\t\t\t\tif (GL.context == null)\n\t\t\t\t{\n\t\t\t\t\tGL.context = gl;\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tuseHardware = false;\n\t\t\t\tcontextAttributes.hardware = false;\n\n\t\t\t\t#if lime_cairo\n\t\t\t\tcontext.cairo = cairo;\n\t\t\t\tcontext.type = CAIRO;\n\t\t\t\tcontext.version = \"\";\n\n\t\t\t\tparent.context = context;\n\t\t\t\trender();\n\t\t\t\t#end\n\t\t\t\tcontext.type = CAIRO;\n\t\t}\n\n\t\tcontextAttributes.type = context.type;\n\t\tcontext.attributes = contextAttributes;\n\t\tparent.context = context;\n\n\t\tsetFrameRate(Reflect.hasField(attributes, \"frameRate\") ? attributes.frameRate : 60);\n\t\t#end\n\n\t\t// SDL 2 enables text input events by default, but we want them only\n\t\t// when requested. otherwise, we might get weird behavior like IME\n\t\t// candidate windows appearing unexpectedly when holding down a key.\n\t\t// See, for example: openfl/openfl#2697\n\t\t// it appears that SDL 3 may behave differently, if we ever upgrade.\n\t\tsetTextInputEnabled(false);\n\t}\n\n\tpublic function alert(message:String, title:String):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_alert(handle, message, title);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function close():Void\n\t{\n\t\tif (!closing)\n\t\t{\n\t\t\tclosing = true;\n\t\t\tparent.onClose.dispatch();\n\n\t\t\tif (!parent.onClose.canceled)\n\t\t\t{\n\t\t\t\tif (handle != null)\n\t\t\t\t{\n\t\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\t\tNativeCFFI.lime_window_close(handle);\n\t\t\t\t\t#end\n\t\t\t\t\thandle = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tclosing = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function contextFlip():Void\n\t{\n\t\t#if (!macro && lime_cffi)\n\t\tif (!useHardware)\n\t\t{\n\t\t\t#if lime_cairo\n\t\t\tif (cairo != null)\n\t\t\t{\n\t\t\t\tprimarySurface.flush();\n\t\t\t}\n\t\t\t#end\n\t\t\tNativeCFFI.lime_window_context_unlock(handle);\n\t\t}\n\n\t\tNativeCFFI.lime_window_context_flip(handle);\n\t\t#end\n\t}\n\n\tpublic function focus():Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_focus(handle);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function getCursor():MouseCursor\n\t{\n\t\treturn cursor;\n\t}\n\n\tpublic function getDisplay():Display\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tvar index = NativeCFFI.lime_window_get_display(handle);\n\n\t\t\tif (index > -1)\n\t\t\t{\n\t\t\t\treturn System.getDisplay(index);\n\t\t\t}\n\t\t\t#end\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic function getDisplayMode():DisplayMode\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\t#if hl\n\t\t\tNativeCFFI.lime_window_get_display_mode(handle, displayMode);\n\t\t\t#else\n\t\t\tvar data:Dynamic = NativeCFFI.lime_window_get_display_mode(handle);\n\t\t\tdisplayMode.width = data.width;\n\t\t\tdisplayMode.height = data.height;\n\t\t\tdisplayMode.pixelFormat = data.pixelFormat;\n\t\t\tdisplayMode.refreshRate = data.refreshRate;\n\t\t\t#end\n\t\t\t#end\n\t\t}\n\n\t\treturn displayMode;\n\t}\n\n\tpublic function getFrameRate():Float\n\t{\n\t\treturn frameRate;\n\t}\n\n\tpublic function getMouseLock():Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tmouseLock = NativeCFFI.lime_window_get_mouse_lock(handle);\n\t\t\t#end\n\t\t}\n\n\t\treturn mouseLock;\n\t}\n\n\tpublic function getOpacity():Float\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\treturn NativeCFFI.lime_window_get_opacity(handle);\n\t\t\t#end\n\t\t}\n\n\t\treturn 1.0;\n\t}\n\n\tpublic function getTextInputEnabled():Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\treturn NativeCFFI.lime_window_get_text_input_enabled(handle);\n\t\t\t#end\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic function move(x:Int, y:Int):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_move(handle, x, y);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function readPixels(rect:Rectangle):Image\n\t{\n\t\tvar imageBuffer:ImageBuffer = null;\n\n\t\tswitch (parent.context.type)\n\t\t{\n\t\t\tcase OPENGL, OPENGLES, WEBGL:\n\t\t\t\tvar gl = parent.context.webgl;\n\t\t\t\tvar windowWidth = Std.int(parent.__width * parent.__scale);\n\t\t\t\tvar windowHeight = Std.int(parent.__height * parent.__scale);\n\n\t\t\t\tvar x:Int;\n\t\t\t\tvar y:Int;\n\t\t\t\tvar width:Int;\n\t\t\t\tvar height:Int;\n\n\t\t\t\tif (rect != null)\n\t\t\t\t{\n\t\t\t\t\tx = Std.int(rect.x);\n\t\t\t\t\ty = Std.int((windowHeight - rect.y) - rect.height);\n\t\t\t\t\twidth = Std.int(rect.width);\n\t\t\t\t\theight = Std.int(rect.height);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0;\n\t\t\t\t\twidth = windowWidth;\n\t\t\t\t\theight = windowHeight;\n\t\t\t\t}\n\n\t\t\t\tvar data = new UInt8Array(width * height * 4);\n\n\t\t\t\tgl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n\n\t\t\t\t#if !js // TODO\n\n\t\t\t\tvar rowLength = width * 4;\n\t\t\t\tvar srcPosition = (height - 1) * rowLength;\n\t\t\t\tvar destPosition = 0;\n\n\t\t\t\tvar temp = Bytes.alloc(rowLength);\n\t\t\t\tvar buffer = data.buffer;\n\t\t\t\tvar rows = Std.int(height / 2);\n\n\t\t\t\twhile (rows-- > 0)\n\t\t\t\t{\n\t\t\t\t\ttemp.blit(0, buffer, destPosition, rowLength);\n\t\t\t\t\tbuffer.blit(destPosition, buffer, srcPosition, rowLength);\n\t\t\t\t\tbuffer.blit(srcPosition, temp, 0, rowLength);\n\n\t\t\t\t\tdestPosition += rowLength;\n\t\t\t\t\tsrcPosition -= rowLength;\n\t\t\t\t}\n\t\t\t\t#end\n\n\t\t\t\timageBuffer = new ImageBuffer(data, width, height, 32, RGBA32);\n\n\t\t\tdefault:\n\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\t#if !cs\n\t\t\t\timageBuffer = NativeCFFI.lime_window_read_pixels(handle, rect, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\t\t\t\t#else\n\t\t\t\tvar data:Dynamic = NativeCFFI.lime_window_read_pixels(handle, rect, null);\n\t\t\t\tif (data != null)\n\t\t\t\t{\n\t\t\t\t\timageBuffer = new ImageBuffer(new UInt8Array(@:privateAccess new Bytes(data.data.length, data.data.b)), data.width, data.height,\n\t\t\t\t\t\tdata.bitsPerPixel);\n\t\t\t\t}\n\t\t\t\t#end\n\t\t\t\t#end\n\n\t\t\t\tif (imageBuffer != null)\n\t\t\t\t{\n\t\t\t\t\timageBuffer.format = RGBA32;\n\t\t\t\t}\n\t\t}\n\n\t\tif (imageBuffer != null)\n\t\t{\n\t\t\treturn new Image(imageBuffer);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic function render():Void\n\t{\n\t\t#if (!macro && lime_cffi)\n\t\tNativeCFFI.lime_window_context_make_current(handle);\n\n\t\tif (!useHardware)\n\t\t{\n\t\t\t#if lime_cairo\n\t\t\tvar lock:Dynamic = NativeCFFI.lime_window_context_lock(handle);\n\n\t\t\tif (lock != null\n\t\t\t\t&& (cacheLock == null || cacheLock.pixels != lock.pixels || cacheLock.width != lock.width || cacheLock.height != lock.height))\n\t\t\t{\n\t\t\t\tprimarySurface = CairoImageSurface.create(lock.pixels, CairoFormat.ARGB32, lock.width, lock.height, lock.pitch);\n\n\t\t\t\tif (cairo != null)\n\t\t\t\t{\n\t\t\t\t\tcairo.recreate(primarySurface);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcairo = new Cairo(primarySurface);\n\t\t\t\t}\n\n\t\t\t\tparent.context.cairo = cairo;\n\t\t\t}\n\n\t\t\tcacheLock = lock;\n\t\t\t#else\n\t\t\tparent.context = null;\n\t\t\t#end\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function resize(width:Int, height:Int):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_resize(handle, width, height);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function setMinSize(width:Int, height:Int):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_minimum_size(handle, width, height);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function setMaxSize(width:Int, height:Int):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_maximum_size(handle, width, height);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function setBorderless(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_borderless(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setCursor(value:MouseCursor):MouseCursor\n\t{\n\t\tif (cursor != value)\n\t\t{\n\t\t\tif (value == null)\n\t\t\t{\n\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\tNativeCFFI.lime_window_set_cursor(handle, 0);\n\t\t\t\t#end\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar type:MouseCursorType = switch (value)\n\t\t\t\t{\n\t\t\t\t\tcase ARROW: ARROW;\n\t\t\t\t\tcase CROSSHAIR: CROSSHAIR;\n\t\t\t\t\tcase MOVE: MOVE;\n\t\t\t\t\tcase POINTER: POINTER;\n\t\t\t\t\tcase RESIZE_NESW: RESIZE_NESW;\n\t\t\t\t\tcase RESIZE_NS: RESIZE_NS;\n\t\t\t\t\tcase RESIZE_NWSE: RESIZE_NWSE;\n\t\t\t\t\tcase RESIZE_WE: RESIZE_WE;\n\t\t\t\t\tcase TEXT: TEXT;\n\t\t\t\t\tcase WAIT: WAIT;\n\t\t\t\t\tcase WAIT_ARROW: WAIT_ARROW;\n\t\t\t\t\tdefault: DEFAULT;\n\t\t\t\t}\n\n\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\tNativeCFFI.lime_window_set_cursor(handle, type);\n\t\t\t\t#end\n\t\t\t}\n\n\t\t\tcursor = value;\n\t\t}\n\n\t\treturn cursor;\n\t}\n\n\tpublic function setDisplayMode(value:DisplayMode):DisplayMode\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\t#if hl\n\t\t\tNativeCFFI.lime_window_set_display_mode(handle, value, displayMode);\n\t\t\t#else\n\t\t\tvar data:Dynamic = NativeCFFI.lime_window_set_display_mode(handle, value);\n\t\t\tdisplayMode.width = data.width;\n\t\t\tdisplayMode.height = data.height;\n\t\t\tdisplayMode.pixelFormat = data.pixelFormat;\n\t\t\tdisplayMode.refreshRate = data.refreshRate;\n\t\t\t#end\n\t\t\t#end\n\t\t}\n\n\t\treturn displayMode;\n\t}\n\n\tpublic function setMouseLock(value:Bool):Bool\n\t{\n\t\tif (mouseLock != value)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_mouse_lock(handle, value);\n\t\t\t#end\n\n\t\t\tmouseLock = value;\n\t\t}\n\n\t\treturn mouseLock;\n\t}\n\n\tpublic function setTextInputEnabled(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_text_input_enabled(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setTextInputRect(value:Rectangle):Rectangle\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_text_input_rect(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setFrameRate(value:Float):Float\n\t{\n\t\t// TODO: Support multiple independent frame rates per window\n\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_application_set_frame_rate(parent.application.__backend.handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn frameRate = value;\n\t}\n\n\tpublic function setFullscreen(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tvalue = NativeCFFI.lime_window_set_fullscreen(handle, value);\n\n\t\t\tparent.__width = NativeCFFI.lime_window_get_width(handle);\n\t\t\tparent.__height = NativeCFFI.lime_window_get_height(handle);\n\t\t\tparent.__x = NativeCFFI.lime_window_get_x(handle);\n\t\t\tparent.__y = NativeCFFI.lime_window_get_y(handle);\n\t\t\t#end\n\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\tparent.onFullscreen.dispatch();\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setIcon(image:Image):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_icon(handle, image.buffer);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function setMaximized(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\treturn NativeCFFI.lime_window_set_maximized(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setMinimized(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\treturn NativeCFFI.lime_window_set_minimized(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setOpacity(value:Float):Void\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_opacity(handle, value);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function setResizable(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_resizable(handle, value);\n\n\t\t\t// TODO: remove need for workaround\n\n\t\t\tNativeCFFI.lime_window_set_borderless(handle, !parent.__borderless);\n\t\t\tNativeCFFI.lime_window_set_borderless(handle, parent.__borderless);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setTitle(value:String):String\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\treturn NativeCFFI.lime_window_set_title(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function setVisible(value:Bool):Bool\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tNativeCFFI.lime_window_set_visible(handle, value);\n\t\t\t#end\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tpublic function warpMouse(x:Int, y:Int):Void\n\t{\n\t\t#if (!macro && lime_cffi)\n\t\tNativeCFFI.lime_window_warp_mouse(handle, x, y);\n\t\t#end\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract MouseCursorType(Int) from Int to Int\n{\n\tvar HIDDEN = 0;\n\tvar ARROW = 1;\n\tvar CROSSHAIR = 2;\n\tvar DEFAULT = 3;\n\tvar MOVE = 4;\n\tvar POINTER = 5;\n\tvar RESIZE_NESW = 6;\n\tvar RESIZE_NS = 7;\n\tvar RESIZE_NWSE = 8;\n\tvar RESIZE_WE = 9;\n\tvar TEXT = 10;\n\tvar WAIT = 11;\n\tvar WAIT_ARROW = 12;\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract WindowFlags(Int)\n{\n\tvar WINDOW_FLAG_FULLSCREEN = 0x00000001;\n\tvar WINDOW_FLAG_BORDERLESS = 0x00000002;\n\tvar WINDOW_FLAG_RESIZABLE = 0x00000004;\n\tvar WINDOW_FLAG_HARDWARE = 0x00000008;\n\tvar WINDOW_FLAG_VSYNC = 0x00000010;\n\tvar WINDOW_FLAG_HW_AA = 0x00000020;\n\tvar WINDOW_FLAG_HW_AA_HIRES = 0x00000060;\n\tvar WINDOW_FLAG_ALLOW_SHADERS = 0x00000080;\n\tvar WINDOW_FLAG_REQUIRE_SHADERS = 0x00000100;\n\tvar WINDOW_FLAG_DEPTH_BUFFER = 0x00000200;\n\tvar WINDOW_FLAG_STENCIL_BUFFER = 0x00000400;\n\tvar WINDOW_FLAG_ALLOW_HIGHDPI = 0x00000800;\n\tvar WINDOW_FLAG_HIDDEN = 0x00001000;\n\tvar WINDOW_FLAG_MINIMIZED = 0x00002000;\n\tvar WINDOW_FLAG_MAXIMIZED = 0x00004000;\n\tvar WINDOW_FLAG_ALWAYS_ON_TOP = 0x00008000;\n\tvar WINDOW_FLAG_COLOR_DEPTH_32_BIT = 0x00010000;\n}\n"
  },
  {
    "path": "src/lime/_internal/format/BMP.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime.graphics.Image;\nimport lime.math.Rectangle;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass BMP\n{\n\tpublic static function encode(image:Image, type:BMPType = null):Bytes\n\t{\n\t\tif (image.premultiplied || image.format != RGBA32)\n\t\t{\n\t\t\t// TODO: Handle encode from different formats\n\n\t\t\timage = image.clone();\n\t\t\timage.premultiplied = false;\n\t\t\timage.format = RGBA32;\n\t\t}\n\n\t\tif (type == null)\n\t\t{\n\t\t\ttype = RGB;\n\t\t}\n\n\t\tvar fileHeaderLength = 14;\n\t\tvar infoHeaderLength = 40;\n\t\tvar pixelValuesLength = (image.width * image.height * 4);\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase BITFIELD:\n\t\t\t\tinfoHeaderLength = 108;\n\n\t\t\tcase ICO:\n\t\t\t\tfileHeaderLength = 0;\n\t\t\t\tpixelValuesLength += image.width * image.height;\n\n\t\t\tcase RGB:\n\t\t\t\tpixelValuesLength = ((image.width * 3) + ((image.width * 3) % 4)) * image.height;\n\n\t\t\tdefault:\n\t\t}\n\n\t\tvar data = Bytes.alloc(fileHeaderLength + infoHeaderLength + pixelValuesLength);\n\t\tvar position = 0;\n\n\t\tif (fileHeaderLength > 0)\n\t\t{\n\t\t\tdata.set(position++, 0x42);\n\t\t\tdata.set(position++, 0x4D);\n\t\t\tdata.setInt32(position, data.length);\n\t\t\tposition += 4;\n\t\t\tdata.setUInt16(position, 0);\n\t\t\tposition += 2;\n\t\t\tdata.setUInt16(position, 0);\n\t\t\tposition += 2;\n\t\t\tdata.setInt32(position, fileHeaderLength + infoHeaderLength);\n\t\t\tposition += 4;\n\t\t}\n\n\t\tdata.setInt32(position, infoHeaderLength);\n\t\tposition += 4;\n\t\tdata.setInt32(position, image.width);\n\t\tposition += 4;\n\t\tdata.setInt32(position, type == ICO ? image.height * 2 : image.height);\n\t\tposition += 4;\n\t\tdata.setUInt16(position, 1);\n\t\tposition += 2;\n\t\tdata.setUInt16(position, type == RGB ? 24 : 32);\n\t\tposition += 2;\n\t\tdata.setInt32(position, type == BITFIELD ? 3 : 0);\n\t\tposition += 4;\n\t\tdata.setInt32(position, pixelValuesLength);\n\t\tposition += 4;\n\t\tdata.setInt32(position, 0x2e30);\n\t\tposition += 4;\n\t\tdata.setInt32(position, 0x2e30);\n\t\tposition += 4;\n\t\tdata.setInt32(position, 0);\n\t\tposition += 4;\n\t\tdata.setInt32(position, 0);\n\t\tposition += 4;\n\n\t\tif (type == BITFIELD)\n\t\t{\n\t\t\tdata.setInt32(position, 0x00FF0000);\n\t\t\tposition += 4;\n\t\t\tdata.setInt32(position, 0x0000FF00);\n\t\t\tposition += 4;\n\t\t\tdata.setInt32(position, 0x000000FF);\n\t\t\tposition += 4;\n\t\t\tdata.setInt32(position, 0xFF000000);\n\t\t\tposition += 4;\n\n\t\t\tdata.set(position++, 0x20);\n\t\t\tdata.set(position++, 0x6E);\n\t\t\tdata.set(position++, 0x69);\n\t\t\tdata.set(position++, 0x57);\n\n\t\t\tfor (i in 0...48)\n\t\t\t{\n\t\t\t\tdata.set(position++, 0);\n\t\t\t}\n\t\t}\n\n\t\tvar pixels = image.getPixels(new Rectangle(0, 0, image.width, image.height), ARGB32);\n\t\tvar readPosition = 0;\n\t\tvar a:Int;\n\t\tvar r:Int;\n\t\tvar g:Int;\n\t\tvar b:Int;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase BITFIELD:\n\t\t\t\tfor (y in 0...image.height)\n\t\t\t\t{\n\t\t\t\t\treadPosition = (image.height - 1 - y) * 4 * image.width;\n\n\t\t\t\t\tfor (x in 0...image.width)\n\t\t\t\t\t{\n\t\t\t\t\t\ta = pixels.get(readPosition++);\n\t\t\t\t\t\tr = pixels.get(readPosition++);\n\t\t\t\t\t\tg = pixels.get(readPosition++);\n\t\t\t\t\t\tb = pixels.get(readPosition++);\n\n\t\t\t\t\t\tdata.set(position++, b);\n\t\t\t\t\t\tdata.set(position++, g);\n\t\t\t\t\t\tdata.set(position++, r);\n\t\t\t\t\t\tdata.set(position++, a);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tcase ICO:\n\t\t\t\tvar andMask = Bytes.alloc(image.width * image.height);\n\t\t\t\tvar maskPosition = 0;\n\n\t\t\t\tfor (y in 0...image.height)\n\t\t\t\t{\n\t\t\t\t\treadPosition = (image.height - 1 - y) * 4 * image.width;\n\n\t\t\t\t\tfor (x in 0...image.width)\n\t\t\t\t\t{\n\t\t\t\t\t\ta = pixels.get(readPosition++);\n\t\t\t\t\t\tr = pixels.get(readPosition++);\n\t\t\t\t\t\tg = pixels.get(readPosition++);\n\t\t\t\t\t\tb = pixels.get(readPosition++);\n\n\t\t\t\t\t\tdata.set(position++, b);\n\t\t\t\t\t\tdata.set(position++, g);\n\t\t\t\t\t\tdata.set(position++, r);\n\t\t\t\t\t\tdata.set(position++, a);\n\n\t\t\t\t\t\t// if (a < 128) {\n\n\t\t\t\t\t\t// andMask.writeByte (1);\n\n\t\t\t\t\t\t// } else {\n\n\t\t\t\t\t\tandMask.set(maskPosition++, 0);\n\n\t\t\t\t\t\t// }\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdata.blit(position, andMask, 0, image.width * image.height);\n\n\t\t\tcase RGB:\n\t\t\t\tfor (y in 0...image.height)\n\t\t\t\t{\n\t\t\t\t\treadPosition = (image.height - 1 - y) * 4 * image.width;\n\n\t\t\t\t\tfor (x in 0...image.width)\n\t\t\t\t\t{\n\t\t\t\t\t\ta = pixels.get(readPosition++);\n\t\t\t\t\t\tr = pixels.get(readPosition++);\n\t\t\t\t\t\tg = pixels.get(readPosition++);\n\t\t\t\t\t\tb = pixels.get(readPosition++);\n\n\t\t\t\t\t\tdata.set(position++, b);\n\t\t\t\t\t\tdata.set(position++, g);\n\t\t\t\t\t\tdata.set(position++, r);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i in 0...((image.width * 3) % 4))\n\t\t\t\t\t{\n\t\t\t\t\t\tdata.set(position++, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t}\n\n\t\treturn data;\n\t}\n}\n\nenum BMPType\n{\n\tRGB;\n\tBITFIELD;\n\tICO;\n}\n"
  },
  {
    "path": "src/lime/_internal/format/Base64.hx",
    "content": "package lime._internal.format;\n\nimport haxe.crypto.Base64 as HaxeBase64;\nimport haxe.io.Bytes;\n\nclass Base64\n{\n\tprivate static var DICTIONARY:Array<String> = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");\n\tprivate static var EXTENDED_DICTIONARY:Array<String> =\n\t\t{\n\t\t\tvar result = new Array<String>();\n\t\t\tfor (a in DICTIONARY)\n\t\t\t{\n\t\t\t\tfor (b in DICTIONARY)\n\t\t\t\t{\n\t\t\t\t\tresult.push(a + b);\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult;\n\t\t};\n\n\tpublic static function decode(source:String):Bytes\n\t{\n\t\treturn HaxeBase64.decode(source);\n\t}\n\n\tpublic static function encode(source:Bytes):String\n\t{\n\t\tvar result = new Array<String>();\n\n\t\tvar dictionary = DICTIONARY;\n\t\tvar extendedDictionary = EXTENDED_DICTIONARY;\n\n\t\tvar numBytes = source.length;\n\t\tvar numInputTriplets = Math.floor(numBytes / 3);\n\t\tvar numChunksToWrite = numInputTriplets * 2;\n\n\t\t#if cpp\n\t\tcpp.NativeArray.setSize(result, Math.ceil(numBytes / 3) * 2);\n\t\t#elseif js\n\t\tuntyped (result).length = Math.ceil(numBytes / 3) * 2;\n\t\t#end\n\n\t\tvar numBytesRead = 0;\n\t\tvar numChunksWritten = 0;\n\t\tvar inputTriplet;\n\n\t\twhile (numChunksWritten < numChunksToWrite)\n\t\t{\n\t\t\tinputTriplet = (source.get(numBytesRead) << 16) | (source.get(numBytesRead + 1) << 8) | source.get(numBytesRead + 2);\n\t\t\tresult[numChunksWritten] = extendedDictionary[(inputTriplet >> 12) & 0xfff];\n\t\t\tresult[numChunksWritten + 1] = extendedDictionary[(inputTriplet) & 0xfff];\n\n\t\t\tnumBytesRead += 3;\n\t\t\tnumChunksWritten += 2;\n\t\t}\n\n\t\tswitch (numBytes - numInputTriplets * 3)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tinputTriplet = (source.get(numBytesRead) << 16);\n\t\t\t\tresult[numChunksWritten] = extendedDictionary[(inputTriplet >> 12) & 0xfff];\n\t\t\t\tresult[numChunksWritten + 1] = \"==\";\n\t\t\tcase 2:\n\t\t\t\tinputTriplet = (source.get(numBytesRead) << 16) | (source.get(numBytesRead + 1) << 8);\n\t\t\t\tresult[numChunksWritten] = extendedDictionary[(inputTriplet >> 12) & 0xfff];\n\t\t\t\tresult[numChunksWritten + 1] = dictionary[(inputTriplet >> 6) & 0x3f] + \"=\";\n\t\t\tcase _:\n\t\t}\n\n\t\treturn result.join(\"\");\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/format/Deflate.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\n#if flash\nimport flash.utils.ByteArray;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass Deflate\n{\n\tpublic static function compress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_deflate_compress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_deflate_compress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\t#if commonjs\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"require (\\\"pako\\\").deflateRaw\")(bytes.getData());\n\t\t#else\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"pako.deflateRaw\")(bytes.getData());\n\t\t#end\n\t\treturn Bytes.ofData(data);\n\t\t#elseif flash\n\t\tvar byteArray:ByteArray = cast bytes.getData();\n\n\t\tvar data = new ByteArray();\n\t\tdata.writeBytes(byteArray);\n\t\tdata.deflate();\n\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function decompress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_deflate_decompress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_deflate_decompress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\t#if commonjs\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"require (\\\"pako\\\").inflateRaw\")(bytes.getData());\n\t\t#else\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"pako.inflateRaw\")(bytes.getData());\n\t\t#end\n\t\treturn Bytes.ofData(data);\n\t\t#elseif flash\n\t\tvar byteArray:ByteArray = cast bytes.getData();\n\n\t\tvar data = new ByteArray();\n\t\tdata.writeBytes(byteArray);\n\t\tdata.inflate();\n\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/format/GZip.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass GZip\n{\n\tpublic static function compress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_gzip_compress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_gzip_compress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\t#if commonjs\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"require (\\\"pako\\\").gzip\")(bytes.getData());\n\t\t#else\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"pako.gzip\")(bytes.getData());\n\t\t#end\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function decompress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_gzip_decompress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_gzip_decompress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\t#if commonjs\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"require (\\\"pako\\\").ungzip\")(bytes.getData());\n\t\t#else\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"pako.ungzip\")(bytes.getData());\n\t\t#end\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/format/JPEG.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime._internal.graphics.ImageCanvasUtil;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.system.CFFI;\nimport lime.utils.UInt8Array;\n#if (js && html5)\nimport js.Browser;\n#end\n#if format\nimport format.jpg.Data;\nimport format.jpg.Writer;\nimport format.tools.Deflate;\nimport haxe.io.Bytes;\nimport haxe.io.BytesOutput;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.graphics.ImageBuffer)\nclass JPEG\n{\n\tpublic static function decodeBytes(bytes:Bytes, decodeData:Bool = true):Image\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar buffer = NativeCFFI.lime_jpeg_decode_bytes(bytes, decodeData, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#else\n\t\tvar bufferData:Dynamic = NativeCFFI.lime_jpeg_decode_bytes(bytes, decodeData, null);\n\n\t\tif (bufferData != null)\n\t\t{\n\t\t\tvar buffer = new ImageBuffer(bufferData.data, bufferData.width, bufferData.height, bufferData.bpp, bufferData.format);\n\t\t\tbuffer.transparent = bufferData.transparent;\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function decodeFile(path:String, decodeData:Bool = true):Image\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar buffer = NativeCFFI.lime_jpeg_decode_file(path, decodeData, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#else\n\t\tvar bufferData:Dynamic = NativeCFFI.lime_jpeg_decode_file(path, decodeData, null);\n\n\t\tif (bufferData != null)\n\t\t{\n\t\t\tvar buffer = new ImageBuffer(bufferData.data, bufferData.width, bufferData.height, bufferData.bpp, bufferData.format);\n\t\t\tbuffer.transparent = bufferData.transparent;\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function encode(image:Image, quality:Int):Bytes\n\t{\n\t\tif (image.premultiplied || image.format != RGBA32)\n\t\t{\n\t\t\t// TODO: Handle encode from different formats\n\n\t\t\timage = image.clone();\n\t\t\timage.premultiplied = false;\n\t\t\timage.format = RGBA32;\n\t\t}\n\n\t\t#if java\n\t\t#elseif (sys && lime_cffi && (!disable_cffi || !format) && !macro)\n\t\tif (CFFI.enabled)\n\t\t{\n\t\t\t#if !cs\n\t\t\treturn NativeCFFI.lime_image_encode(image.buffer, 1, quality, Bytes.alloc(0));\n\t\t\t#else\n\t\t\tvar data:Dynamic = NativeCFFI.lime_image_encode(image.buffer, 1, quality, null);\n\t\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t\t#end\n\t\t}\n\t\t#end\n\n\t\t#if ((!js || !html5) && format)\n\t\t#if (sys && (!disable_cffi || !format) && !macro)\n\t\telse\n\t\t#end\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar buffer = image.buffer.data.buffer;\n\n\t\t\t\tvar data:Data =\n\t\t\t\t\t{\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height,\n\t\t\t\t\t\tquality: quality,\n\t\t\t\t\t\tpixels: #if js Bytes.ofData(buffer) #else buffer #end\n\t\t\t\t\t};\n\n\t\t\t\tvar output = new BytesOutput();\n\t\t\t\tvar jpeg = new Writer(output);\n\t\t\t\tjpeg.write(data);\n\n\t\t\t\treturn output.getBytes();\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\t#elseif js\n\t\tImageCanvasUtil.convertToCanvas(image, false);\n\n\t\tif (image.buffer.__srcCanvas != null)\n\t\t{\n\t\t\tvar data = image.buffer.__srcCanvas.toDataURL(\"image/jpeg\", quality / 100);\n\t\t\t#if nodejs\n\t\t\tvar buffer = new js.node.Buffer((data.split(\";base64,\")[1] : String), \"base64\").toString(\"binary\");\n\t\t\t#else\n\t\t\tvar buffer = Browser.window.atob(data.split(\";base64,\")[1]);\n\t\t\t#end\n\t\t\tvar bytes = Bytes.alloc(buffer.length);\n\n\t\t\tfor (i in 0...buffer.length)\n\t\t\t{\n\t\t\t\tbytes.set(i, buffer.charCodeAt(i));\n\t\t\t}\n\n\t\t\treturn bytes;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/format/LZMA.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.utils.UInt8Array;\n#if flash\nimport flash.utils.CompressionAlgorithm;\nimport flash.utils.ByteArray;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass LZMA\n{\n\tpublic static function compress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_lzma_compress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_lzma_compress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"LZMA.compress\")(new UInt8Array(bytes.getData()), 5);\n\t\tif ((data is String))\n\t\t{\n\t\t\treturn Bytes.ofString(data);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Bytes.ofData(cast data);\n\t\t}\n\t\t#elseif flash\n\t\tvar byteArray:ByteArray = cast bytes.getData();\n\n\t\tvar data = new ByteArray();\n\t\tdata.writeBytes(byteArray);\n\t\tdata.compress(CompressionAlgorithm.LZMA);\n\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function decompress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_lzma_decompress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_lzma_decompress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"LZMA.decompress\")(new UInt8Array(bytes.getData()));\n\t\tif ((data is String))\n\t\t{\n\t\t\treturn Bytes.ofString(data);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Bytes.ofData(cast data);\n\t\t}\n\t\t#elseif flash\n\t\tvar byteArray:ByteArray = cast bytes.getData();\n\n\t\tvar data = new ByteArray();\n\t\tdata.writeBytes(byteArray);\n\t\tdata.uncompress(CompressionAlgorithm.LZMA);\n\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/format/PNG.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime._internal.graphics.ImageCanvasUtil;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.system.CFFI;\nimport lime.utils.UInt8Array;\n#if (js && html5)\nimport js.Browser;\n#end\n#if format\nimport format.png.Data;\nimport format.png.Writer;\n// import format.tools.Deflate;\nimport haxe.io.Bytes;\nimport haxe.io.BytesOutput;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.graphics.ImageBuffer)\nclass PNG\n{\n\tpublic static function decodeBytes(bytes:Bytes, decodeData:Bool = true):Image\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar buffer = NativeCFFI.lime_png_decode_bytes(bytes, decodeData, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#else\n\t\tvar bufferData:Dynamic = NativeCFFI.lime_png_decode_bytes(bytes, decodeData, null);\n\n\t\tif (bufferData != null)\n\t\t{\n\t\t\tvar buffer = new ImageBuffer(bufferData.data, bufferData.width, bufferData.height, bufferData.bpp, bufferData.format);\n\t\t\tbuffer.transparent = bufferData.transparent;\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function decodeFile(path:String, decodeData:Bool = true):Image\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar buffer = NativeCFFI.lime_png_decode_file(path, decodeData, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#else\n\t\tvar bufferData:Dynamic = NativeCFFI.lime_png_decode_file(path, decodeData, null);\n\n\t\tif (bufferData != null)\n\t\t{\n\t\t\tvar buffer = new ImageBuffer(bufferData.data, bufferData.width, bufferData.height, bufferData.bpp, bufferData.format);\n\t\t\tbuffer.transparent = bufferData.transparent;\n\t\t\treturn new Image(buffer);\n\t\t}\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function encode(image:Image):Bytes\n\t{\n\t\tif (image.premultiplied || image.format != RGBA32)\n\t\t{\n\t\t\t// TODO: Handle encode from different formats\n\n\t\t\timage = image.clone();\n\t\t\timage.premultiplied = false;\n\t\t\timage.format = RGBA32;\n\t\t}\n\n\t\t#if java\n\t\t#elseif (sys && lime_cffi && (!disable_cffi || !format) && !macro)\n\t\tif (CFFI.enabled)\n\t\t{\n\t\t\t#if !cs\n\t\t\treturn NativeCFFI.lime_image_encode(image.buffer, 0, 0, Bytes.alloc(0));\n\t\t\t#else\n\t\t\tvar data:Dynamic = NativeCFFI.lime_image_encode(image.buffer, 0, 0, null);\n\t\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t\t#end\n\t\t}\n\t\t#end\n\n\t\t#if ((!js || !html5) && format)\n\t\t#if (sys && (!disable_cffi || !format) && !macro)\n\t\telse\n\t\t#end\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar bytes = Bytes.alloc(image.width * image.height * 4 + image.height);\n\t\t\t\tvar sourceBytes = image.buffer.data.toBytes();\n\n\t\t\t\tvar sourceIndex:Int, index:Int;\n\n\t\t\t\tfor (y in 0...image.height)\n\t\t\t\t{\n\t\t\t\t\tsourceIndex = y * image.width * 4;\n\t\t\t\t\tindex = y * image.width * 4 + y;\n\n\t\t\t\t\tbytes.set(index, 0);\n\t\t\t\t\tbytes.blit(index + 1, sourceBytes, sourceIndex, image.width * 4);\n\t\t\t\t}\n\n\t\t\t\tvar data = new List();\n\t\t\t\tdata.add(CHeader(\n\t\t\t\t\t{\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height,\n\t\t\t\t\t\tcolbits: 8,\n\t\t\t\t\t\tcolor: ColTrue(true),\n\t\t\t\t\t\tinterlaced: false\n\t\t\t\t\t}));\n\t\t\t\tdata.add(CData(Zlib.compress(bytes)));\n\t\t\t\tdata.add(CEnd);\n\n\t\t\t\tvar output = new BytesOutput();\n\t\t\t\tvar png = new Writer(output);\n\t\t\t\tpng.write(data);\n\n\t\t\t\treturn output.getBytes();\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\t#elseif js\n\t\tImageCanvasUtil.convertToCanvas(image, false);\n\n\t\tif (image.buffer.__srcCanvas != null)\n\t\t{\n\t\t\tvar data = image.buffer.__srcCanvas.toDataURL(\"image/png\");\n\t\t\t#if nodejs\n\t\t\tvar buffer = new js.node.Buffer((data.split(\";base64,\")[1] : String), \"base64\").toString(\"binary\");\n\t\t\t#else\n\t\t\tvar buffer = Browser.window.atob(data.split(\";base64,\")[1]);\n\t\t\t#end\n\t\t\tvar bytes = Bytes.alloc(buffer.length);\n\n\t\t\tfor (i in 0...buffer.length)\n\t\t\t{\n\t\t\t\tbytes.set(i, buffer.charCodeAt(i));\n\t\t\t}\n\n\t\t\treturn bytes;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/format/Zlib.hx",
    "content": "package lime._internal.format;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\n#if flash\nimport flash.utils.ByteArray;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass Zlib\n{\n\tpublic static function compress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_zlib_compress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_zlib_compress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\t#if commonjs\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"require (\\\"pako\\\").deflate\")(bytes.getData());\n\t\t#else\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"pako.deflate\")(bytes.getData());\n\t\t#end\n\t\treturn Bytes.ofData(data);\n\t\t#elseif flash\n\t\tvar byteArray:ByteArray = cast bytes.getData();\n\n\t\tvar data = new ByteArray();\n\t\tdata.writeBytes(byteArray);\n\t\tdata.compress();\n\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function decompress(bytes:Bytes):Bytes\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if !cs\n\t\treturn NativeCFFI.lime_zlib_decompress(bytes, Bytes.alloc(0));\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_zlib_decompress(bytes, null);\n\t\tif (data == null) return null;\n\t\treturn @:privateAccess new Bytes(data.length, data.b);\n\t\t#end\n\t\t#elseif js\n\t\t#if commonjs\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"require (\\\"pako\\\").inflate\")(bytes.getData());\n\t\t#else\n\t\tvar data = untyped #if haxe4 js.Syntax.code #else __js__ #end (\"pako.inflate\")(bytes.getData());\n\t\t#end\n\t\treturn Bytes.ofData(data);\n\t\t#elseif flash\n\t\tvar byteArray:ByteArray = cast bytes.getData();\n\n\t\tvar data = new ByteArray();\n\t\tdata.writeBytes(byteArray);\n\t\tdata.uncompress();\n\n\t\treturn Bytes.ofData(data);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/graphics/ImageCanvasUtil.hx",
    "content": "package lime._internal.graphics;\n\nimport haxe.format.JsonParser;\nimport haxe.io.Bytes;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.graphics.ImageChannel;\nimport lime.graphics.PixelFormat;\nimport lime.math.ColorMatrix;\nimport lime.math.Rectangle;\nimport lime.math.Vector2;\nimport lime.system.Endian;\nimport lime.utils.BytePointer;\nimport lime.utils.UInt8Array;\n#if (js && html5)\nimport js.Browser;\n#end\n\n@:access(lime.graphics.ImageBuffer)\nclass ImageCanvasUtil\n{\n\tpublic static function colorTransform(image:Image, rect:Rectangle, colorMatrix:ColorMatrix):Void\n\t{\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.colorTransform(image, rect, colorMatrix);\n\t}\n\n\tpublic static function convertToCanvas(image:Image, clear:Bool = false):Void\n\t{\n\t\t#if (js && html5)\n\t\tvar buffer = image.buffer;\n\n\t\tif (buffer.__srcImage != null)\n\t\t{\n\t\t\tif (buffer.__srcCanvas == null)\n\t\t\t{\n\t\t\t\tcreateCanvas(image, buffer.__srcImage.width, buffer.__srcImage.height);\n\t\t\t\tbuffer.__srcContext.drawImage(buffer.__srcImage, 0, 0);\n\t\t\t}\n\n\t\t\tbuffer.__srcImage = null;\n\t\t}\n\t\telse if (buffer.__srcCanvas == null && buffer.data != null)\n\t\t{\n\t\t\timage.transparent = true;\n\t\t\tcreateCanvas(image, buffer.width, buffer.height);\n\t\t\tcreateImageData(image);\n\n\t\t\tbuffer.__srcContext.putImageData(buffer.__srcImageData, 0, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (image.type == DATA && buffer.__srcImageData != null && image.dirty)\n\t\t\t{\n\t\t\t\tbuffer.__srcContext.putImageData(buffer.__srcImageData, 0, 0);\n\t\t\t\timage.dirty = false;\n\t\t\t}\n\t\t}\n\n\t\tif (clear)\n\t\t{\n\t\t\tbuffer.data = null;\n\t\t\tbuffer.__srcImageData = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (buffer.data == null && buffer.__srcImageData != null)\n\t\t\t{\n\t\t\t\tbuffer.data = cast buffer.__srcImageData.data;\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\timage.type = CANVAS;\n\t}\n\n\tpublic static function convertToData(image:Image, clear:Bool = false):Void\n\t{\n\t\tvar buffer = image.buffer;\n\n\t\t#if (js && html5)\n\t\tif (buffer.__srcImage != null)\n\t\t{\n\t\t\tconvertToCanvas(image);\n\t\t}\n\n\t\tif (buffer.__srcCanvas != null && buffer.data == null)\n\t\t{\n\t\t\tcreateImageData(image);\n\t\t\tif (image.type == CANVAS) image.dirty = false;\n\t\t}\n\t\telse if (image.type == CANVAS && buffer.__srcCanvas != null && image.dirty)\n\t\t{\n\t\t\tif (buffer.__srcImageData == null)\n\t\t\t{\n\t\t\t\tcreateImageData(image);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbuffer.__srcImageData = buffer.__srcContext.getImageData(0, 0, buffer.width, buffer.height);\n\t\t\t\tbuffer.data = new UInt8Array(cast buffer.__srcImageData.data.buffer);\n\t\t\t}\n\n\t\t\timage.dirty = false;\n\t\t}\n\n\t\tif (clear)\n\t\t{\n\t\t\timage.buffer.__srcCanvas = null;\n\t\t\timage.buffer.__srcContext = null;\n\t\t}\n\t\t#end\n\n\t\timage.type = DATA;\n\t}\n\n\tpublic static function copyChannel(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, sourceChannel:ImageChannel,\n\t\t\tdestChannel:ImageChannel):Void\n\t{\n\t\tconvertToData(sourceImage);\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.copyChannel(image, sourceImage, sourceRect, destPoint, sourceChannel, destChannel);\n\t}\n\n\tpublic static function copyPixels(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, alphaImage:Image = null,\n\t\t\talphaPoint:Vector2 = null, mergeAlpha:Bool = false):Void\n\t{\n\t\tif (destPoint == null || destPoint.x >= image.width || destPoint.y >= image.height || sourceRect == null || sourceRect.width < 1\n\t\t\t|| sourceRect.height < 1)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (alphaImage != null && alphaImage.transparent)\n\t\t{\n\t\t\tif (alphaPoint == null) alphaPoint = new Vector2();\n\n\t\t\t// TODO: use faster method\n\n\t\t\tvar tempData = sourceImage.clone();\n\t\t\ttempData.copyChannel(alphaImage, new Rectangle(sourceRect.x + alphaPoint.x, sourceRect.y + alphaPoint.y, sourceRect.width, sourceRect.height),\n\t\t\t\tnew Vector2(sourceRect.x, sourceRect.y), ImageChannel.ALPHA, ImageChannel.ALPHA);\n\t\t\tsourceImage = tempData;\n\t\t}\n\n\t\tconvertToCanvas(image, true);\n\n\t\tif (!mergeAlpha)\n\t\t{\n\t\t\tif (image.transparent && sourceImage.transparent)\n\t\t\t{\n\t\t\t\timage.buffer.__srcContext.clearRect(destPoint.x\n\t\t\t\t\t+ image.offsetX, destPoint.y\n\t\t\t\t\t+ image.offsetY, sourceRect.width\n\t\t\t\t\t+ image.offsetX,\n\t\t\t\t\tsourceRect.height\n\t\t\t\t\t+ image.offsetY);\n\t\t\t}\n\t\t}\n\n\t\tconvertToCanvas(sourceImage);\n\n\t\tif (sourceImage.buffer.src != null)\n\t\t{\n\t\t\t// Set default composition (just in case it is different)\n\t\t\timage.buffer.__srcContext.globalCompositeOperation = \"source-over\";\n\n\t\t\timage.buffer.__srcContext.drawImage(sourceImage.buffer.src, Std.int(sourceRect.x + sourceImage.offsetX),\n\t\t\t\tStd.int(sourceRect.y + sourceImage.offsetY), Std.int(sourceRect.width), Std.int(sourceRect.height), Std.int(destPoint.x + image.offsetX),\n\t\t\t\tStd.int(destPoint.y + image.offsetY), Std.int(sourceRect.width), Std.int(sourceRect.height));\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function createCanvas(image:Image, width:Int, height:Int):Void\n\t{\n\t\t#if (js && html5)\n\t\tvar buffer = image.buffer;\n\n\t\tif (buffer.__srcCanvas == null)\n\t\t{\n\t\t\tbuffer.__srcCanvas = cast Browser.document.createElement(\"canvas\");\n\t\t\tbuffer.__srcCanvas.width = width;\n\t\t\tbuffer.__srcCanvas.height = height;\n\n\t\t\tif (!image.transparent)\n\t\t\t{\n\t\t\t\tbuffer.__srcCanvas.setAttribute(\"moz-opaque\", \"true\");\n\t\t\t}\n\n\t\t\tbuffer.__srcContext = buffer.__srcCanvas.getContext(\"2d\", {alpha: image.transparent});\n\t\t}\n\t\t#end\n\t}\n\n\tpublic static function createImageData(image:Image):Void\n\t{\n\t\t#if (js && html5)\n\t\tvar buffer = image.buffer;\n\n\t\tif (buffer.__srcImageData == null)\n\t\t{\n\t\t\tif (buffer.data == null)\n\t\t\t{\n\t\t\t\tbuffer.__srcImageData = buffer.__srcContext.getImageData(0, 0, buffer.width, buffer.height);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbuffer.__srcImageData = buffer.__srcContext.createImageData(buffer.width, buffer.height);\n\t\t\t\tbuffer.__srcImageData.data.set(cast buffer.data);\n\t\t\t}\n\n\t\t\tbuffer.data = new UInt8Array(cast buffer.__srcImageData.data.buffer);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic static function fillRect(image:Image, rect:Rectangle, color:Int, format:PixelFormat):Void\n\t{\n\t\tconvertToCanvas(image);\n\n\t\tvar r:Int;\n\t\tvar g:Int;\n\t\tvar b:Int;\n\t\tvar a:Int;\n\n\t\tif (format == ARGB32)\n\t\t{\n\t\t\tr = (color >> 16) & 0xFF;\n\t\t\tg = (color >> 8) & 0xFF;\n\t\t\tb = color & 0xFF;\n\t\t\ta = (image.transparent) ? (color >> 24) & 0xFF : 0xFF;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tr = (color >> 24) & 0xFF;\n\t\t\tg = (color >> 16) & 0xFF;\n\t\t\tb = (color >> 8) & 0xFF;\n\t\t\ta = (image.transparent) ? color & 0xFF : 0xFF;\n\t\t}\n\n\t\tif (rect.x == 0 && rect.y == 0 && rect.width == image.width && rect.height == image.height)\n\t\t{\n\t\t\tif (image.transparent && a == 0)\n\t\t\t{\n\t\t\t\timage.buffer.__srcCanvas.width = image.buffer.width;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (a < 255)\n\t\t{\n\t\t\timage.buffer.__srcContext.clearRect(rect.x + image.offsetX, rect.y + image.offsetY, rect.width + image.offsetX, rect.height + image.offsetY);\n\t\t}\n\n\t\tif (a > 0)\n\t\t{\n\t\t\timage.buffer.__srcContext.fillStyle = 'rgba(' + r + ', ' + g + ', ' + b + ', ' + (a / 255) + ')';\n\t\t\timage.buffer.__srcContext.fillRect(rect.x + image.offsetX, rect.y + image.offsetY, rect.width + image.offsetX, rect.height + image.offsetY);\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function floodFill(image:Image, x:Int, y:Int, color:Int, format:PixelFormat):Void\n\t{\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.floodFill(image, x, y, color, format);\n\t}\n\n\tpublic static function getPixel(image:Image, x:Int, y:Int, format:PixelFormat):Int\n\t{\n\t\tconvertToData(image);\n\n\t\treturn ImageDataUtil.getPixel(image, x, y, format);\n\t}\n\n\tpublic static function getPixel32(image:Image, x:Int, y:Int, format:PixelFormat):Int\n\t{\n\t\tconvertToData(image);\n\n\t\treturn ImageDataUtil.getPixel32(image, x, y, format);\n\t}\n\n\tpublic static function getPixels(image:Image, rect:Rectangle, format:PixelFormat):Bytes\n\t{\n\t\tconvertToData(image);\n\n\t\treturn ImageDataUtil.getPixels(image, rect, format);\n\t}\n\n\tpublic static function merge(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, redMultiplier:Int, greenMultiplier:Int,\n\t\t\tblueMultiplier:Int, alphaMultiplier:Int):Void\n\t{\n\t\tconvertToData(sourceImage);\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.merge(image, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier);\n\t}\n\n\tpublic static function resize(image:Image, newWidth:Int, newHeight:Int):Void\n\t{\n\t\tvar buffer = image.buffer;\n\n\t\tif (buffer.__srcCanvas == null)\n\t\t{\n\t\t\tcreateCanvas(image, newWidth, newHeight);\n\t\t\tbuffer.__srcContext.drawImage(buffer.src, 0, 0, newWidth, newHeight);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconvertToCanvas(image, true);\n\t\t\tvar sourceCanvas = buffer.__srcCanvas;\n\t\t\tbuffer.__srcCanvas = null;\n\t\t\tcreateCanvas(image, newWidth, newHeight);\n\t\t\tbuffer.__srcContext.drawImage(sourceCanvas, 0, 0, newWidth, newHeight);\n\t\t}\n\n\t\tbuffer.__srcImageData = null;\n\t\tbuffer.data = null;\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function scroll(image:Image, x:Int, y:Int):Void\n\t{\n\t\tif ((x % image.width == 0) && (y % image.height == 0)) return;\n\n\t\tvar copy = image.clone();\n\n\t\tconvertToCanvas(image, true);\n\n\t\timage.buffer.__srcContext.clearRect(x, y, image.width, image.height);\n\t\timage.buffer.__srcContext.drawImage(copy.src, x, y);\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function setPixel(image:Image, x:Int, y:Int, color:Int, format:PixelFormat):Void\n\t{\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.setPixel(image, x, y, color, format);\n\t}\n\n\tpublic static function setPixel32(image:Image, x:Int, y:Int, color:Int, format:PixelFormat):Void\n\t{\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.setPixel32(image, x, y, color, format);\n\t}\n\n\tpublic static function setPixels(image:Image, rect:Rectangle, bytePointer:BytePointer, format:PixelFormat, endian:Endian):Void\n\t{\n\t\tconvertToData(image);\n\n\t\tImageDataUtil.setPixels(image, rect, bytePointer, format, endian);\n\t}\n\n\tpublic static function sync(image:Image, clear:Bool):Void\n\t{\n\t\tif (image == null) return;\n\n\t\t#if (js && html5)\n\t\tif (image.type == CANVAS && (image.buffer.__srcCanvas != null || image.buffer.data != null))\n\t\t{\n\t\t\tconvertToCanvas(image, clear);\n\t\t}\n\t\telse if (image.type == DATA)\n\t\t{\n\t\t\tconvertToData(image, clear);\n\t\t}\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/graphics/ImageDataUtil.hx",
    "content": "package lime._internal.graphics;\n\nimport haxe.ds.Vector;\nimport haxe.Int32;\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.graphics.ImageChannel;\nimport lime.graphics.PixelFormat;\nimport lime.math.ARGB;\nimport lime.math.BGRA;\nimport lime.math.RGBA;\nimport lime.math.ColorMatrix;\nimport lime.math.Rectangle;\nimport lime.math.Vector2;\nimport lime.math.Vector4;\nimport lime.system.CFFI;\nimport lime.system.Endian;\nimport lime.utils.BytePointer;\nimport lime.utils.UInt8Array;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.graphics.ImageBuffer)\n@:access(lime.math.RGBA)\nclass ImageDataUtil\n{\n\tpublic static function displaceMap(target:Image, source:Image, map:Image, mapPoint:Vector2, componentX:Vector4, componentY:Vector4, smooth:Bool):Void\n\t{\n\t\tvar targetData:UInt8Array = target.buffer.data;\n\t\tvar sourceData:UInt8Array = source.buffer.data;\n\t\tvar mapData:UInt8Array = map.buffer.data;\n\n\t\tvar targetFormat:PixelFormat = target.buffer.format;\n\t\tvar sourceFormat:PixelFormat = source.buffer.format;\n\t\tvar mapFormat:PixelFormat = map.buffer.format;\n\n\t\tvar targetPremultiplied:Bool = target.premultiplied;\n\t\tvar sourcePremultiplied:Bool = source.premultiplied;\n\t\tvar mapPremultiplied:Bool = map.premultiplied;\n\n\t\tvar sourceView:ImageDataView = new ImageDataView(source);\n\t\tvar mapView:ImageDataView = new ImageDataView(map);\n\n\t\tvar row:Int;\n\n\t\tvar sourceOffset:Int;\n\n\t\tvar sourcePixel:RGBA = 0;\n\t\tvar mapPixel:RGBA = 0;\n\t\tvar targetPixel:RGBA = 0;\n\n\t\tvar mapPixelX:Float;\n\t\tvar mapPixelY:Float;\n\t\tvar mapPixelA:Float;\n\n\t\t// for bilinear smoothing\n\t\tvar s1:RGBA = 0;\n\t\tvar s2:RGBA = 0;\n\t\tvar s3:RGBA = 0;\n\t\tvar s4:RGBA = 0;\n\n\t\tvar mPointXFloor:Int;\n\t\tvar mPointYFloor:Int;\n\n\t\tvar disOffsetXFloor:Int;\n\t\tvar disOffsetYFloor:Int;\n\n\t\tvar disX:Float;\n\t\tvar disY:Float;\n\n\t\tfor (y in 0...sourceView.height)\n\t\t{\n\t\t\trow = sourceView.row(y);\n\n\t\t\tfor (x in 0...sourceView.width)\n\t\t\t{\n\t\t\t\tsourceOffset = row + (x * 4);\n\n\t\t\t\tmPointXFloor = Std.int(mapPoint.x);\n\t\t\t\tmPointYFloor = Std.int(mapPoint.y);\n\n\t\t\t\tif (smooth)\n\t\t\t\t{\n\t\t\t\t\ts1.readUInt8(mapData, sourceView.row(y - mPointYFloor + 1) + (x - mPointXFloor) * 4, mapFormat, mapPremultiplied);\n\t\t\t\t\ts2.readUInt8(mapData, sourceView.row(y - mPointYFloor) + (x - mPointXFloor + 1) * 4, mapFormat, mapPremultiplied);\n\t\t\t\t\ts3.readUInt8(mapData, sourceView.row(y - mPointYFloor + 1) + (x - mPointXFloor + 1) * 4, mapFormat, mapPremultiplied);\n\t\t\t\t\ts4.readUInt8(mapData, sourceView.row(y - mPointYFloor) + (x - mPointXFloor) * 4, mapFormat, mapPremultiplied);\n\n\t\t\t\t\tmapPixel = bilinear(s1, s2, s3, s4, mapPoint.x - mPointXFloor, mapPoint.y - mPointYFloor);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmapPixel.readUInt8(mapData, mapView.row(y - mPointYFloor) + (x - mPointXFloor) * 4, mapFormat, mapPremultiplied);\n\t\t\t\t}\n\n\t\t\t\tmapPixelA = mapPixel.a / 255.0;\n\t\t\t\tmapPixelX = (((mapPixel.r - 128) / 255.0)) * mapPixelA;\n\t\t\t\tmapPixelY = (((mapPixel.g - 128) / 255.0)) * mapPixelA;\n\n\t\t\t\tdisX = mapPixelX * componentX.x + mapPixelY * componentY.x;\n\t\t\t\tdisY = mapPixelX * componentX.y + mapPixelY * componentY.y;\n\n\t\t\t\tdisOffsetXFloor = Math.floor(disX * sourceView.width);\n\t\t\t\tdisOffsetYFloor = Math.floor(disY * sourceView.height);\n\n\t\t\t\tif (smooth)\n\t\t\t\t{\n\t\t\t\t\ts1.readUInt8(sourceData, sourceView.row(y + disOffsetYFloor + 1) + (x + disOffsetXFloor) * 4, sourceFormat, sourcePremultiplied);\n\t\t\t\t\ts2.readUInt8(sourceData, sourceView.row(y + disOffsetYFloor) + (x + disOffsetXFloor + 1) * 4, sourceFormat, sourcePremultiplied);\n\t\t\t\t\ts3.readUInt8(sourceData, sourceView.row(y + disOffsetYFloor + 1) + (x + disOffsetXFloor + 1) * 4, sourceFormat, sourcePremultiplied);\n\t\t\t\t\ts4.readUInt8(sourceData, sourceView.row(y + disOffsetYFloor) + (x + disOffsetXFloor) * 4, sourceFormat, sourcePremultiplied);\n\n\t\t\t\t\tsourcePixel = bilinear(s1, s2, s3, s4, disX * sourceView.width - disOffsetXFloor, disY * sourceView.height - disOffsetYFloor);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tsourcePixel.readUInt8(sourceData, sourceView.row(y + disOffsetYFloor) + (x + disOffsetXFloor) * 4, sourceFormat, sourcePremultiplied);\n\t\t\t\t}\n\n\t\t\t\tsourcePixel.writeUInt8(targetData, sourceOffset, targetFormat, targetPremultiplied);\n\t\t\t}\n\t\t}\n\n\t\ttarget.dirty = true;\n\t\ttarget.version++;\n\t}\n\n\t// s1 = (x, y+1)\n\t// s2 = (x + 1, y);\n\t// s3 = (x + 1, y + 1);\n\t// s4 = (x, y)\n\tprivate static function bilinear(s1:RGBA, s2:RGBA, s3:RGBA, s4:RGBA, su:Float, sv:Float):RGBA\n\t{\n\t\treturn lerpRGBA(lerpRGBA(s4, s2, su), lerpRGBA(s1, s3, su), sv);\n\t}\n\n\tprivate static function lerpRGBA(v0:RGBA, v1:RGBA, x:Float):RGBA\n\t{\n\t\tvar result:RGBA = 0;\n\t\tresult.r = Math.floor(lerp(v0.r, v1.r, x));\n\t\tresult.g = Math.floor(lerp(v0.g, v1.g, x));\n\t\tresult.b = Math.floor(lerp(v0.b, v1.b, x));\n\t\tresult.a = Math.floor(lerp(v0.a, v1.a, x));\n\n\t\treturn result;\n\t}\n\n\tprivate static function lerp4f(v0:Vector4, v1:Vector4, x:Float):Vector4\n\t{\n\t\treturn new Vector4(lerp(v0.x, v1.x, x), lerp(v0.y, v1.y, x), lerp(v0.z, v1.z, x), lerp(v0.w, v1.w, x));\n\t}\n\n\tprivate static function lerp(v0:Float, v1:Float, x:Float):Float\n\t{\n\t\treturn (1.0 - x) * v0 + x * v1;\n\t}\n\n\tpublic static function colorTransform(image:Image, rect:Rectangle, colorMatrix:ColorMatrix):Void\n\t{\n\t\tvar data = image.buffer.data;\n\t\tif (data == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_color_transform(image, rect, colorMatrix);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar format = image.buffer.format;\n\t\t\tvar premultiplied = image.buffer.premultiplied;\n\n\t\t\tvar dataView = new ImageDataView(image, rect);\n\n\t\t\tvar alphaTable = colorMatrix.getAlphaTable();\n\t\t\tvar redTable = colorMatrix.getRedTable();\n\t\t\tvar greenTable = colorMatrix.getGreenTable();\n\t\t\tvar blueTable = colorMatrix.getBlueTable();\n\n\t\t\tvar row, offset, pixel:RGBA = 0;\n\n\t\t\tfor (y in 0...dataView.height)\n\t\t\t{\n\t\t\t\trow = dataView.row(y);\n\n\t\t\t\tfor (x in 0...dataView.width)\n\t\t\t\t{\n\t\t\t\t\toffset = row + (x * 4);\n\n\t\t\t\t\tpixel.readUInt8(data, offset, format, premultiplied);\n\t\t\t\t\tpixel.set(redTable[pixel.r], greenTable[pixel.g], blueTable[pixel.b], alphaTable[pixel.a]);\n\t\t\t\t\tpixel.writeUInt8(data, offset, format, premultiplied);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function copyChannel(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, sourceChannel:ImageChannel,\n\t\t\tdestChannel:ImageChannel):Void\n\t{\n\t\tvar destIdx = switch (destChannel)\n\t\t{\n\t\t\tcase RED: 0;\n\t\t\tcase GREEN: 1;\n\t\t\tcase BLUE: 2;\n\t\t\tcase ALPHA: 3;\n\t\t}\n\n\t\tvar srcIdx = switch (sourceChannel)\n\t\t{\n\t\t\tcase RED: 0;\n\t\t\tcase GREEN: 1;\n\t\t\tcase BLUE: 2;\n\t\t\tcase ALPHA: 3;\n\t\t}\n\n\t\tvar srcData = sourceImage.buffer.data;\n\t\tvar destData = image.buffer.data;\n\n\t\tif (srcData == null || destData == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_copy_channel(image, sourceImage, sourceRect, destPoint, srcIdx, destIdx);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar srcView = new ImageDataView(sourceImage, sourceRect);\n\t\t\tvar destView = new ImageDataView(image, new Rectangle(destPoint.x, destPoint.y, srcView.width, srcView.height));\n\n\t\t\tvar srcFormat = sourceImage.buffer.format;\n\t\t\tvar destFormat = image.buffer.format;\n\t\t\tvar srcPremultiplied = sourceImage.buffer.premultiplied;\n\t\t\tvar destPremultiplied = image.buffer.premultiplied;\n\n\t\t\tvar srcPosition,\n\t\t\t\tdestPosition,\n\t\t\t\tsrcPixel:RGBA = 0,\n\t\t\t\tdestPixel:RGBA = 0,\n\t\t\t\tvalue = 0;\n\n\t\t\tfor (y in 0...destView.height)\n\t\t\t{\n\t\t\t\tsrcPosition = srcView.row(y);\n\t\t\t\tdestPosition = destView.row(y);\n\n\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t{\n\t\t\t\t\tsrcPixel.readUInt8(srcData, srcPosition, srcFormat, srcPremultiplied);\n\t\t\t\t\tdestPixel.readUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\tswitch (srcIdx)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tvalue = srcPixel.r;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tvalue = srcPixel.g;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tvalue = srcPixel.b;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tvalue = srcPixel.a;\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (destIdx)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tdestPixel.r = value;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tdestPixel.g = value;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tdestPixel.b = value;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tdestPixel.a = value;\n\t\t\t\t\t}\n\n\t\t\t\t\tdestPixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\tsrcPosition += 4;\n\t\t\t\t\tdestPosition += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function copyPixels(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, alphaImage:Image = null,\n\t\t\talphaPoint:Vector2 = null, mergeAlpha:Bool = false):Void\n\t{\n\t\tif (image.width == sourceImage.width\n\t\t\t&& image.height == sourceImage.height\n\t\t\t&& sourceRect.width == sourceImage.width\n\t\t\t&& sourceRect.height == sourceImage.height\n\t\t\t&& sourceRect.x == 0\n\t\t\t&& sourceRect.y == 0\n\t\t\t&& destPoint.x == 0\n\t\t\t&& destPoint.y == 0\n\t\t\t&& alphaImage == null\n\t\t\t&& alphaPoint == null\n\t\t\t&& mergeAlpha == false\n\t\t\t&& image.format == sourceImage.format)\n\t\t{\n\t\t\timage.buffer.data.set(sourceImage.buffer.data);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_copy_pixels(image, sourceImage, sourceRect, destPoint, alphaImage, alphaPoint, mergeAlpha);\n\t\t\telse\n\t\t\t#end\n\t\t\t{\n\t\t\t\tvar sourceData = sourceImage.buffer.data;\n\t\t\t\tvar destData = image.buffer.data;\n\n\t\t\t\tif (sourceData == null || destData == null) return;\n\n\t\t\t\tvar sourceView = new ImageDataView(sourceImage, sourceRect);\n\t\t\t\tvar destRect = new Rectangle(destPoint.x, destPoint.y, sourceView.width, sourceView.height);\n\t\t\t\tvar destView = new ImageDataView(image, destRect);\n\n\t\t\t\tvar sourceFormat = sourceImage.buffer.format;\n\t\t\t\tvar destFormat = image.buffer.format;\n\n\t\t\t\tvar sourcePosition:Int;\n\t\t\t\tvar destPosition:Int;\n\t\t\t\tvar sourceAlpha:Float;\n\t\t\t\tvar destAlpha:Float;\n\t\t\t\tvar oneMinusSourceAlpha:Float;\n\t\t\t\tvar blendAlpha:Float;\n\t\t\t\tvar sourcePixel:RGBA = 0;\n\t\t\t\tvar destPixel:RGBA = 0;\n\n\t\t\t\tvar sourcePremultiplied = sourceImage.buffer.premultiplied;\n\t\t\t\tvar destPremultiplied = image.buffer.premultiplied;\n\t\t\t\tvar sourceBytesPerPixel = Std.int(sourceImage.buffer.bitsPerPixel / 8);\n\t\t\t\tvar destBytesPerPixel = Std.int(image.buffer.bitsPerPixel / 8);\n\n\t\t\t\tvar useAlphaImage = (alphaImage != null && alphaImage.transparent);\n\t\t\t\tvar blend = (mergeAlpha || (useAlphaImage && !image.transparent))\n\t\t\t\t\t|| (!mergeAlpha && !image.transparent && sourceImage.transparent);\n\n\t\t\t\tif (!useAlphaImage)\n\t\t\t\t{\n\t\t\t\t\tif (blend)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (y in 0...destView.height)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsourcePosition = sourceView.row(y);\n\t\t\t\t\t\t\tdestPosition = destView.row(y);\n\n\t\t\t\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsourcePixel.readUInt8(sourceData, sourcePosition, sourceFormat, sourcePremultiplied);\n\t\t\t\t\t\t\t\tdestPixel.readUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\t\t\tsourceAlpha = sourcePixel.a / 255.0;\n\t\t\t\t\t\t\t\tdestAlpha = destPixel.a / 255.0;\n\t\t\t\t\t\t\t\toneMinusSourceAlpha = 1 - sourceAlpha;\n\t\t\t\t\t\t\t\tblendAlpha = sourceAlpha + (destAlpha * oneMinusSourceAlpha);\n\n\t\t\t\t\t\t\t\tif (blendAlpha == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdestPixel = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdestPixel.r = RGBA.__clamp[\n\t\t\t\t\t\t\t\t\t\tMath.round((sourcePixel.r * sourceAlpha + destPixel.r * destAlpha * oneMinusSourceAlpha) / blendAlpha)\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tdestPixel.g = RGBA.__clamp[\n\t\t\t\t\t\t\t\t\t\tMath.round((sourcePixel.g * sourceAlpha + destPixel.g * destAlpha * oneMinusSourceAlpha) / blendAlpha)\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tdestPixel.b = RGBA.__clamp[\n\t\t\t\t\t\t\t\t\t\tMath.round((sourcePixel.b * sourceAlpha + destPixel.b * destAlpha * oneMinusSourceAlpha) / blendAlpha)\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tdestPixel.a = RGBA.__clamp[Math.round(blendAlpha * 255.0)];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdestPixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\t\t\tdestPosition += 4;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (sourceFormat == destFormat\n\t\t\t\t\t\t&& sourcePremultiplied == destPremultiplied\n\t\t\t\t\t\t&& sourceBytesPerPixel == destBytesPerPixel)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (y in 0...destView.height)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsourcePosition = sourceView.row(y);\n\t\t\t\t\t\t\tdestPosition = destView.row(y);\n\n\t\t\t\t\t\t\t#if js\n\t\t\t\t\t\t\t// TODO: Is this faster on HTML5 than the normal copy method?\n\t\t\t\t\t\t\tdestData.set(sourceData.subarray(sourcePosition, sourcePosition + destView.width * destBytesPerPixel), destPosition);\n\t\t\t\t\t\t\t#else\n\t\t\t\t\t\t\tdestData.buffer.blit(destPosition, sourceData.buffer, sourcePosition, destView.width * destBytesPerPixel);\n\t\t\t\t\t\t\t#end\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (y in 0...destView.height)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsourcePosition = sourceView.row(y);\n\t\t\t\t\t\t\tdestPosition = destView.row(y);\n\n\t\t\t\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsourcePixel.readUInt8(sourceData, sourcePosition, sourceFormat, sourcePremultiplied);\n\t\t\t\t\t\t\t\tsourcePixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\t\t\tdestPosition += 4;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar alphaData = alphaImage.buffer.data;\n\t\t\t\t\tvar alphaFormat = alphaImage.buffer.format;\n\t\t\t\t\tvar alphaPosition, alphaPixel:RGBA = 0;\n\n\t\t\t\t\tvar alphaView = new ImageDataView(alphaImage,\n\t\t\t\t\t\tnew Rectangle(sourceView.x + (alphaPoint == null ? 0 : alphaPoint.x), sourceView.y + (alphaPoint == null ? 0 : alphaPoint.y),\n\t\t\t\t\t\t\tsourceView.width, sourceView.height));\n\n\t\t\t\t\tdestView.clip(Std.int(destPoint.x), Std.int(destPoint.y), alphaView.width, alphaView.height);\n\n\t\t\t\t\tif (blend)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (y in 0...destView.height)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsourcePosition = sourceView.row(y);\n\t\t\t\t\t\t\tdestPosition = destView.row(y);\n\t\t\t\t\t\t\talphaPosition = alphaView.row(y);\n\n\t\t\t\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsourcePixel.readUInt8(sourceData, sourcePosition, sourceFormat, sourcePremultiplied);\n\t\t\t\t\t\t\t\tdestPixel.readUInt8(destData, destPosition, destFormat, destPremultiplied);\n\t\t\t\t\t\t\t\talphaPixel.readUInt8(alphaData, alphaPosition, alphaFormat, false);\n\n\t\t\t\t\t\t\t\tsourceAlpha = (alphaPixel.a / 255.0) * (sourcePixel.a / 255.0);\n\n\t\t\t\t\t\t\t\tif (sourceAlpha > 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdestAlpha = destPixel.a / 255.0;\n\t\t\t\t\t\t\t\t\toneMinusSourceAlpha = 1 - sourceAlpha;\n\t\t\t\t\t\t\t\t\tblendAlpha = sourceAlpha + (destAlpha * oneMinusSourceAlpha);\n\n\t\t\t\t\t\t\t\t\tdestPixel.r = RGBA.__clamp[\n\t\t\t\t\t\t\t\t\t\tMath.round((sourcePixel.r * sourceAlpha + destPixel.r * destAlpha * oneMinusSourceAlpha) / blendAlpha)\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tdestPixel.g = RGBA.__clamp[\n\t\t\t\t\t\t\t\t\t\tMath.round((sourcePixel.g * sourceAlpha + destPixel.g * destAlpha * oneMinusSourceAlpha) / blendAlpha)\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tdestPixel.b = RGBA.__clamp[\n\t\t\t\t\t\t\t\t\t\tMath.round((sourcePixel.b * sourceAlpha + destPixel.b * destAlpha * oneMinusSourceAlpha) / blendAlpha)\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tdestPixel.a = RGBA.__clamp[Math.round(blendAlpha * 255.0)];\n\n\t\t\t\t\t\t\t\t\tdestPixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\t\t\tdestPosition += 4;\n\t\t\t\t\t\t\t\talphaPosition += 4;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (y in 0...destView.height)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsourcePosition = sourceView.row(y);\n\t\t\t\t\t\t\tdestPosition = destView.row(y);\n\t\t\t\t\t\t\talphaPosition = alphaView.row(y);\n\n\t\t\t\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsourcePixel.readUInt8(sourceData, sourcePosition, sourceFormat, sourcePremultiplied);\n\t\t\t\t\t\t\t\talphaPixel.readUInt8(alphaData, alphaPosition, alphaFormat, false);\n\n\t\t\t\t\t\t\t\tsourcePixel.a = Math.round(sourcePixel.a * (alphaPixel.a / 0xFF));\n\t\t\t\t\t\t\t\tsourcePixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\t\t\t\tdestPosition += 4;\n\t\t\t\t\t\t\t\talphaPosition += 4;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function fillRect(image:Image, rect:Rectangle, color:Int, format:PixelFormat):Void\n\t{\n\t\tvar fillColor:RGBA;\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\tfillColor = (color : ARGB);\n\t\t\tcase BGRA32:\n\t\t\t\tfillColor = (color : BGRA);\n\t\t\tdefault:\n\t\t\t\tfillColor = color;\n\t\t}\n\n\t\tif (!image.transparent)\n\t\t{\n\t\t\tfillColor.a = 0xFF;\n\t\t}\n\n\t\tvar data = image.buffer.data;\n\t\tif (data == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_fill_rect(image, rect, (fillColor >> 16) & 0xFFFF, (fillColor) & 0xFFFF);\n\t\telse\n\t\t\t// TODO: Better Int32 solution\n\t\t#end\n\t\t{\n\t\t\tvar format = image.buffer.format;\n\t\t\tvar premultiplied = image.buffer.premultiplied;\n\t\t\tif (premultiplied) fillColor.multiplyAlpha();\n\n\t\t\tvar dataView = new ImageDataView(image, rect);\n\t\t\tvar row;\n\n\t\t\tfor (y in 0...dataView.height)\n\t\t\t{\n\t\t\t\trow = dataView.row(y);\n\n\t\t\t\tfor (x in 0...dataView.width)\n\t\t\t\t{\n\t\t\t\t\tfillColor.writeUInt8(data, row + (x * 4), format, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function floodFill(image:Image, x:Int, y:Int, color:Int, format:PixelFormat):Void\n\t{\n\t\tvar data = image.buffer.data;\n\t\tif (data == null) return;\n\n\t\tif (format == ARGB32) color = ((color & 0xFFFFFF) << 8) | ((color >> 24) & 0xFF);\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_flood_fill(image, x, y, (color >> 16) & 0xFFFF, (color) & 0xFFFF);\n\t\telse\n\t\t\t// TODO: Better Int32 solution\n\t\t#end\n\t\t{\n\t\t\tvar format = image.buffer.format;\n\t\t\tvar premultiplied = image.buffer.premultiplied;\n\n\t\t\tvar fillColor:RGBA = color;\n\n\t\t\tvar hitColor:RGBA = 0;\n\t\t\thitColor.readUInt8(data, ((y + image.offsetY) * (image.buffer.width * 4)) + ((x + image.offsetX) * 4), format, premultiplied);\n\n\t\t\tif (!image.transparent)\n\t\t\t{\n\t\t\t\tfillColor.a = 0xFF;\n\t\t\t\thitColor.a = 0xFF;\n\t\t\t}\n\n\t\t\tif (fillColor == hitColor) return;\n\n\t\t\tif (premultiplied) fillColor.multiplyAlpha();\n\n\t\t\tvar dx = [0, -1, 1, 0];\n\t\t\tvar dy = [-1, 0, 0, 1];\n\n\t\t\tvar minX = -image.offsetX;\n\t\t\tvar minY = -image.offsetY;\n\t\t\tvar maxX = minX + image.width;\n\t\t\tvar maxY = minY + image.height;\n\n\t\t\tvar queue = new Array<Int>();\n\t\t\tqueue.push(x);\n\t\t\tqueue.push(y);\n\n\t\t\tvar curPointX,\n\t\t\t\tcurPointY,\n\t\t\t\tnextPointX,\n\t\t\t\tnextPointY,\n\t\t\t\tnextPointOffset,\n\t\t\t\treadColor:RGBA = 0;\n\n\t\t\twhile (queue.length > 0)\n\t\t\t{\n\t\t\t\tcurPointY = queue.pop();\n\t\t\t\tcurPointX = queue.pop();\n\n\t\t\t\tfor (i in 0...4)\n\t\t\t\t{\n\t\t\t\t\tnextPointX = curPointX + dx[i];\n\t\t\t\t\tnextPointY = curPointY + dy[i];\n\n\t\t\t\t\tif (nextPointX < minX || nextPointY < minY || nextPointX >= maxX || nextPointY >= maxY)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tnextPointOffset = (nextPointY * image.width + nextPointX) * 4;\n\t\t\t\t\treadColor.readUInt8(data, nextPointOffset, format, premultiplied);\n\n\t\t\t\t\tif (readColor == hitColor)\n\t\t\t\t\t{\n\t\t\t\t\t\tfillColor.writeUInt8(data, nextPointOffset, format, false);\n\n\t\t\t\t\t\tqueue.push(nextPointX);\n\t\t\t\t\t\tqueue.push(nextPointY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function gaussianBlur(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, blurX:Float = 4, blurY:Float = 4,\n\t\t\tquality:Int = 1, strength:Float = 1, color:Null<Int> = null):Image\n\t{\n\t\t// TODO: Support sourceRect better, do not modify sourceImage, create C++ implementation for native\n\n\t\t// TODO: Faster approach\n\t\tvar imagePremultiplied = image.premultiplied;\n\t\tif (imagePremultiplied) image.premultiplied = false;\n\n\t\t// TODO: Use ImageDataView\n\n\t\t// if (image.buffer.premultiplied || sourceImage.buffer.premultiplied) {\n\t\t// \t// TODO: Better handling of premultiplied alpha\n\t\t// \tthrow \"Pre-multiplied bitmaps are not supported\";\n\n\t\t// }\n\n\t\tStackBlur.blur(image, sourceImage, sourceRect, destPoint, blurX, blurY, quality);\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\n\t\tif (imagePremultiplied) image.premultiplied = true;\n\n\t\treturn image;\n\t}\n\n\tpublic static function getColorBoundsRect(image:Image, mask:Int, color:Int, findColor:Bool, format:PixelFormat):Rectangle\n\t{\n\t\tvar left = image.width + 1;\n\t\tvar right = 0;\n\t\tvar top = image.height + 1;\n\t\tvar bottom = 0;\n\n\t\tvar _color:RGBA, _mask:RGBA;\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\t_color = (color : ARGB);\n\t\t\t\t_mask = (mask : ARGB);\n\n\t\t\tcase BGRA32:\n\t\t\t\t_color = (color : BGRA);\n\t\t\t\t_mask = (mask : BGRA);\n\n\t\t\tdefault:\n\t\t\t\t_color = color;\n\t\t\t\t_mask = mask;\n\t\t}\n\n\t\tif (!image.transparent)\n\t\t{\n\t\t\t_color.a = 0xFF;\n\t\t\t_mask.a = 0xFF;\n\t\t}\n\n\t\tvar pixel:Int;\n\t\tvar hit:Bool;\n\n\t\tfor (x in 0...image.width)\n\t\t{\n\t\t\thit = false;\n\n\t\t\tfor (y in 0...image.height)\n\t\t\t{\n\t\t\t\tpixel = image.getPixel32(x, y, RGBA32);\n\t\t\t\thit = findColor ? (pixel & _mask) == _color : (pixel & _mask) != _color;\n\n\t\t\t\tif (hit)\n\t\t\t\t{\n\t\t\t\t\tif (x < left) left = x;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hit)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar ix;\n\n\t\tfor (x in 0...image.width)\n\t\t{\n\t\t\tix = (image.width - 1) - x;\n\t\t\thit = false;\n\n\t\t\tfor (y in 0...image.height)\n\t\t\t{\n\t\t\t\tpixel = image.getPixel32(ix, y, RGBA32);\n\t\t\t\thit = findColor ? (pixel & _mask) == _color : (pixel & _mask) != _color;\n\n\t\t\t\tif (hit)\n\t\t\t\t{\n\t\t\t\t\tif (ix > right) right = ix;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hit)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (y in 0...image.height)\n\t\t{\n\t\t\thit = false;\n\n\t\t\tfor (x in 0...image.width)\n\t\t\t{\n\t\t\t\tpixel = image.getPixel32(x, y, RGBA32);\n\t\t\t\thit = findColor ? (pixel & _mask) == _color : (pixel & _mask) != _color;\n\n\t\t\t\tif (hit)\n\t\t\t\t{\n\t\t\t\t\tif (y < top) top = y;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hit)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar iy;\n\n\t\tfor (y in 0...image.height)\n\t\t{\n\t\t\tiy = (image.height - 1) - y;\n\t\t\thit = false;\n\n\t\t\tfor (x in 0...image.width)\n\t\t\t{\n\t\t\t\tpixel = image.getPixel32(x, iy, RGBA32);\n\t\t\t\thit = findColor ? (pixel & _mask) == _color : (pixel & _mask) != _color;\n\n\t\t\t\tif (hit)\n\t\t\t\t{\n\t\t\t\t\tif (iy > bottom) bottom = iy;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hit)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar w = right - left;\n\t\tvar h = bottom - top;\n\n\t\tif (w > 0) w++;\n\t\tif (h > 0) h++;\n\n\t\tif (w < 0) w = 0;\n\t\tif (h < 0) h = 0;\n\n\t\tif (left == right) w = 1;\n\t\tif (top == bottom) h = 1;\n\n\t\tif (left > image.width) left = 0;\n\t\tif (top > image.height) top = 0;\n\n\t\treturn new Rectangle(left, top, w, h);\n\t}\n\n\tpublic static function getPixel(image:Image, x:Int, y:Int, format:PixelFormat):Int\n\t{\n\t\tvar pixel:RGBA = 0;\n\n\t\tpixel.readUInt8(image.buffer.data, (4 * (y + image.offsetY) * image.buffer.width + (x + image.offsetX) * 4), image.buffer.format,\n\t\t\timage.buffer.premultiplied);\n\t\tpixel.a = 0;\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\treturn (pixel : ARGB);\n\t\t\tcase BGRA32:\n\t\t\t\treturn (pixel : BGRA);\n\t\t\tdefault:\n\t\t\t\treturn pixel;\n\t\t}\n\t}\n\n\tpublic static function getPixel32(image:Image, x:Int, y:Int, format:PixelFormat):Int\n\t{\n\t\tvar pixel:RGBA = 0;\n\n\t\tpixel.readUInt8(image.buffer.data, (4 * (y + image.offsetY) * image.buffer.width + (x + image.offsetX) * 4), image.buffer.format,\n\t\t\timage.buffer.premultiplied);\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\treturn (pixel : ARGB);\n\t\t\tcase BGRA32:\n\t\t\t\treturn (pixel : BGRA);\n\t\t\tdefault:\n\t\t\t\treturn pixel;\n\t\t}\n\t}\n\n\tpublic static function getPixels(image:Image, rect:Rectangle, format:PixelFormat):Bytes\n\t{\n\t\tif (image.buffer.data == null) return null;\n\n\t\tvar length = Std.int(rect.width * rect.height);\n\t\tvar bytes = Bytes.alloc(length * 4);\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_get_pixels(image, rect, format, bytes);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar data = image.buffer.data;\n\t\t\tvar sourceFormat = image.buffer.format;\n\t\t\tvar premultiplied = image.buffer.premultiplied;\n\n\t\t\tvar dataView = new ImageDataView(image, rect);\n\t\t\tvar position;\n\t\t\tvar argb:ARGB = 0;\n\t\t\tvar bgra:BGRA = 0;\n\t\t\tvar pixel:RGBA = 0;\n\t\t\tvar destPosition = 0;\n\n\t\t\tfor (y in 0...dataView.height)\n\t\t\t{\n\t\t\t\tposition = dataView.row(y);\n\n\t\t\t\tfor (x in 0...dataView.width)\n\t\t\t\t{\n\t\t\t\t\tpixel.readUInt8(data, position, sourceFormat, premultiplied);\n\n\t\t\t\t\tswitch (format)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase ARGB32:\n\t\t\t\t\t\t\targb = pixel;\n\t\t\t\t\t\t\tpixel = cast argb;\n\t\t\t\t\t\tcase BGRA32:\n\t\t\t\t\t\t\tbgra = pixel;\n\t\t\t\t\t\t\tpixel = cast bgra;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\n\t\t\t\t\tbytes.set(destPosition++, pixel.r);\n\t\t\t\t\tbytes.set(destPosition++, pixel.g);\n\t\t\t\t\tbytes.set(destPosition++, pixel.b);\n\t\t\t\t\tbytes.set(destPosition++, pixel.a);\n\n\t\t\t\t\tposition += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\tpublic static function merge(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, redMultiplier:Int, greenMultiplier:Int,\n\t\t\tblueMultiplier:Int, alphaMultiplier:Int):Void\n\t{\n\t\tif (image.buffer.data == null || sourceImage.buffer.data == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_merge(image, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier,\n\t\t\talphaMultiplier);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar sourceView = new ImageDataView(sourceImage, sourceRect);\n\t\t\tvar destView = new ImageDataView(image, new Rectangle(destPoint.x, destPoint.y, sourceView.width, sourceView.height));\n\n\t\t\tvar sourceData = sourceImage.buffer.data;\n\t\t\tvar destData = image.buffer.data;\n\t\t\tvar sourceFormat = sourceImage.buffer.format;\n\t\t\tvar destFormat = image.buffer.format;\n\t\t\tvar sourcePremultiplied = sourceImage.buffer.premultiplied;\n\t\t\tvar destPremultiplied = image.buffer.premultiplied;\n\n\t\t\tvar sourcePosition:Int;\n\t\t\tvar destPosition:Int;\n\t\t\tvar sourcePixel:RGBA = 0;\n\t\t\tvar destPixel:RGBA = 0;\n\n\t\t\tfor (y in 0...destView.height)\n\t\t\t{\n\t\t\t\tsourcePosition = sourceView.row(y);\n\t\t\t\tdestPosition = destView.row(y);\n\n\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t{\n\t\t\t\t\tsourcePixel.readUInt8(sourceData, sourcePosition, sourceFormat, sourcePremultiplied);\n\t\t\t\t\tdestPixel.readUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\tdestPixel.r = Std.int(((sourcePixel.r * redMultiplier) + (destPixel.r * (256 - redMultiplier))) / 256);\n\t\t\t\t\tdestPixel.g = Std.int(((sourcePixel.g * greenMultiplier) + (destPixel.g * (256 - greenMultiplier))) / 256);\n\t\t\t\t\tdestPixel.b = Std.int(((sourcePixel.b * blueMultiplier) + (destPixel.b * (256 - blueMultiplier))) / 256);\n\t\t\t\t\tdestPixel.a = Std.int(((sourcePixel.a * alphaMultiplier) + (destPixel.a * (256 - alphaMultiplier))) / 256);\n\n\t\t\t\t\tdestPixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\n\t\t\t\t\tsourcePosition += 4;\n\t\t\t\t\tdestPosition += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function multiplyAlpha(image:Image):Void\n\t{\n\t\tvar data = image.buffer.data;\n\t\tif (data == null || !image.buffer.transparent) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_multiply_alpha(image);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar format = image.buffer.format;\n\t\t\tvar length = Std.int(data.length / 4);\n\t\t\tvar pixel:RGBA = 0;\n\n\t\t\tfor (i in 0...length)\n\t\t\t{\n\t\t\t\tpixel.readUInt8(data, i * 4, format, false);\n\t\t\t\tpixel.writeUInt8(data, i * 4, format, true);\n\t\t\t}\n\t\t}\n\n\t\timage.buffer.premultiplied = true;\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function resize(image:Image, newWidth:Int, newHeight:Int):Void\n\t{\n\t\tvar buffer = image.buffer;\n\t\tif (buffer.width == newWidth && buffer.height == newHeight) return;\n\t\tvar newBuffer = new ImageBuffer(new UInt8Array(newWidth * newHeight * 4), newWidth, newHeight);\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_resize(image, newBuffer, newWidth, newHeight);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar imageWidth = image.width;\n\t\t\tvar imageHeight = image.height;\n\n\t\t\tvar data = image.data;\n\t\t\tvar newData = newBuffer.data;\n\t\t\tvar sourceIndex:Int,\n\t\t\t\tsourceIndexX:Int,\n\t\t\t\tsourceIndexY:Int,\n\t\t\t\tsourceIndexXY:Int,\n\t\t\t\tindex:Int;\n\t\t\tvar sourceX:Int, sourceY:Int;\n\t\t\tvar u:Float,\n\t\t\t\tv:Float,\n\t\t\t\tuRatio:Float,\n\t\t\t\tvRatio:Float,\n\t\t\t\tuOpposite:Float,\n\t\t\t\tvOpposite:Float;\n\n\t\t\tfor (y in 0...newHeight)\n\t\t\t{\n\t\t\t\tfor (x in 0...newWidth)\n\t\t\t\t{\n\t\t\t\t\t// TODO: Handle more color formats\n\n\t\t\t\t\tu = ((x + 0.5) / newWidth) * imageWidth - 0.5;\n\t\t\t\t\tv = ((y + 0.5) / newHeight) * imageHeight - 0.5;\n\n\t\t\t\t\tsourceX = Std.int(u);\n\t\t\t\t\tsourceY = Std.int(v);\n\n\t\t\t\t\tsourceIndex = (sourceY * imageWidth + sourceX) * 4;\n\t\t\t\t\tsourceIndexX = (sourceX < imageWidth - 1) ? sourceIndex + 4 : sourceIndex;\n\t\t\t\t\tsourceIndexY = (sourceY < imageHeight - 1) ? sourceIndex + (imageWidth * 4) : sourceIndex;\n\t\t\t\t\tsourceIndexXY = (sourceIndexX != sourceIndex) ? sourceIndexY + 4 : sourceIndexY;\n\n\t\t\t\t\tindex = (y * newWidth + x) * 4;\n\n\t\t\t\t\tuRatio = u - sourceX;\n\t\t\t\t\tvRatio = v - sourceY;\n\t\t\t\t\tuOpposite = 1 - uRatio;\n\t\t\t\t\tvOpposite = 1 - vRatio;\n\n\t\t\t\t\tnewData[index] = Std.int((data[sourceIndex] * uOpposite + data[sourceIndexX] * uRatio) * vOpposite\n\t\t\t\t\t\t+ (data[sourceIndexY] * uOpposite + data[sourceIndexXY] * uRatio) * vRatio);\n\t\t\t\t\tnewData[index + 1] = Std.int((data[sourceIndex + 1] * uOpposite + data[sourceIndexX + 1] * uRatio) * vOpposite\n\t\t\t\t\t\t+ (data[sourceIndexY + 1] * uOpposite + data[sourceIndexXY + 1] * uRatio) * vRatio);\n\t\t\t\t\tnewData[index + 2] = Std.int((data[sourceIndex + 2] * uOpposite + data[sourceIndexX + 2] * uRatio) * vOpposite\n\t\t\t\t\t\t+ (data[sourceIndexY + 2] * uOpposite + data[sourceIndexXY + 2] * uRatio) * vRatio);\n\n\t\t\t\t\t// Maybe it would be better to not weigh colors with an alpha of zero, but the below should help prevent black fringes caused by transparent pixels made visible\n\n\t\t\t\t\tif (data[sourceIndexX + 3] == 0 || data[sourceIndexY + 3] == 0 || data[sourceIndexXY + 3] == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tnewData[index + 3] = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnewData[index + 3] = data[sourceIndex + 3];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuffer.data = newBuffer.data;\n\t\tbuffer.width = newWidth;\n\t\tbuffer.height = newHeight;\n\n\t\t#if (js && html5)\n\t\tbuffer.__srcImage = null;\n\t\tbuffer.__srcImageData = null;\n\t\tbuffer.__srcCanvas = null;\n\t\tbuffer.__srcContext = null;\n\t\t#end\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function resizeBuffer(image:Image, newWidth:Int, newHeight:Int):Void\n\t{\n\t\tvar buffer = image.buffer;\n\t\tvar data = image.data;\n\t\tvar newData = new UInt8Array(newWidth * newHeight * 4);\n\t\tvar sourceIndex:Int, index:Int;\n\n\t\tfor (y in 0...buffer.height)\n\t\t{\n\t\t\tfor (x in 0...buffer.width)\n\t\t\t{\n\t\t\t\tsourceIndex = (y * buffer.width + x) * 4;\n\t\t\t\tindex = (y * newWidth + x) * 4;\n\n\t\t\t\tnewData[index] = data[sourceIndex];\n\t\t\t\tnewData[index + 1] = data[sourceIndex + 1];\n\t\t\t\tnewData[index + 2] = data[sourceIndex + 2];\n\t\t\t\tnewData[index + 3] = data[sourceIndex + 3];\n\t\t\t}\n\t\t}\n\n\t\tbuffer.data = newData;\n\t\tbuffer.width = newWidth;\n\t\tbuffer.height = newHeight;\n\n\t\t#if (js && html5)\n\t\tbuffer.__srcImage = null;\n\t\tbuffer.__srcImageData = null;\n\t\tbuffer.__srcCanvas = null;\n\t\tbuffer.__srcContext = null;\n\t\t#end\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function setFormat(image:Image, format:PixelFormat):Void\n\t{\n\t\tvar data = image.buffer.data;\n\t\tif (data == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_set_format(image, format);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar index:Int;\n\t\t\tvar length = Std.int(data.length / 4);\n\t\t\tvar r1:Int;\n\t\t\tvar g1:Int;\n\t\t\tvar b1:Int;\n\t\t\tvar a1:Int;\n\t\t\tvar r2:Int;\n\t\t\tvar g2:Int;\n\t\t\tvar b2:Int;\n\t\t\tvar a2:Int;\n\t\t\tvar r:Int;\n\t\t\tvar g:Int;\n\t\t\tvar b:Int;\n\t\t\tvar a:Int;\n\n\t\t\tswitch (image.format)\n\t\t\t{\n\t\t\t\tcase RGBA32:\n\t\t\t\t\tr1 = 0;\n\t\t\t\t\tg1 = 1;\n\t\t\t\t\tb1 = 2;\n\t\t\t\t\ta1 = 3;\n\n\t\t\t\tcase ARGB32:\n\t\t\t\t\tr1 = 1;\n\t\t\t\t\tg1 = 2;\n\t\t\t\t\tb1 = 3;\n\t\t\t\t\ta1 = 0;\n\n\t\t\t\tcase BGRA32:\n\t\t\t\t\tr1 = 2;\n\t\t\t\t\tg1 = 1;\n\t\t\t\t\tb1 = 0;\n\t\t\t\t\ta1 = 3;\n\t\t\t}\n\n\t\t\tswitch (format)\n\t\t\t{\n\t\t\t\tcase RGBA32:\n\t\t\t\t\tr2 = 0;\n\t\t\t\t\tg2 = 1;\n\t\t\t\t\tb2 = 2;\n\t\t\t\t\ta2 = 3;\n\n\t\t\t\tcase ARGB32:\n\t\t\t\t\tr2 = 1;\n\t\t\t\t\tg2 = 2;\n\t\t\t\t\tb2 = 3;\n\t\t\t\t\ta2 = 0;\n\n\t\t\t\tcase BGRA32:\n\t\t\t\t\tr2 = 2;\n\t\t\t\t\tg2 = 1;\n\t\t\t\t\tb2 = 0;\n\t\t\t\t\ta2 = 3;\n\t\t\t}\n\n\t\t\tfor (i in 0...length)\n\t\t\t{\n\t\t\t\tindex = i * 4;\n\n\t\t\t\tr = data[index + r1];\n\t\t\t\tg = data[index + g1];\n\t\t\t\tb = data[index + b1];\n\t\t\t\ta = data[index + a1];\n\n\t\t\t\tdata[index + r2] = r;\n\t\t\t\tdata[index + g2] = g;\n\t\t\t\tdata[index + b2] = b;\n\t\t\t\tdata[index + a2] = a;\n\t\t\t}\n\t\t}\n\n\t\timage.buffer.format = format;\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function setPixel(image:Image, x:Int, y:Int, color:Int, format:PixelFormat):Void\n\t{\n\t\tvar pixel:RGBA;\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\tpixel = (color : ARGB);\n\t\t\tcase BGRA32:\n\t\t\t\tpixel = (color : BGRA);\n\t\t\tdefault:\n\t\t\t\tpixel = color;\n\t\t}\n\n\t\t// TODO: Write only RGB instead?\n\n\t\tvar source = new RGBA();\n\t\tsource.readUInt8(image.buffer.data, (4 * (y + image.offsetY) * image.buffer.width + (x + image.offsetX) * 4), image.buffer.format,\n\t\t\timage.buffer.premultiplied);\n\n\t\tpixel.a = source.a;\n\t\tpixel.writeUInt8(image.buffer.data, (4 * (y + image.offsetY) * image.buffer.width + (x + image.offsetX) * 4), image.buffer.format,\n\t\t\timage.buffer.premultiplied);\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function setPixel32(image:Image, x:Int, y:Int, color:Int, format:PixelFormat):Void\n\t{\n\t\tvar pixel:RGBA;\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\tpixel = (color : ARGB);\n\t\t\tcase BGRA32:\n\t\t\t\tpixel = (color : BGRA);\n\t\t\tdefault:\n\t\t\t\tpixel = color;\n\t\t}\n\n\t\tif (!image.transparent) pixel.a = 0xFF;\n\t\tpixel.writeUInt8(image.buffer.data, (4 * (y + image.offsetY) * image.buffer.width + (x + image.offsetX) * 4), image.buffer.format,\n\t\t\timage.buffer.premultiplied);\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function setPixels(image:Image, rect:Rectangle, bytePointer:BytePointer, format:PixelFormat, endian:Endian):Void\n\t{\n\t\tif (image.buffer.data == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_set_pixels(image, rect, bytePointer.bytes, bytePointer.offset, format, endian == BIG_ENDIAN ? 1 : 0);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar data = image.buffer.data;\n\t\t\tvar sourceFormat = image.buffer.format;\n\t\t\tvar premultiplied = image.buffer.premultiplied;\n\t\t\tvar dataView = new ImageDataView(image, rect);\n\t\t\tvar row, color, pixel:RGBA;\n\t\t\tvar transparent = image.transparent;\n\t\t\tvar bytes = bytePointer.bytes;\n\t\t\tvar dataPosition = bytePointer.offset;\n\t\t\tvar littleEndian = (endian != BIG_ENDIAN);\n\n\t\t\tfor (y in 0...dataView.height)\n\t\t\t{\n\t\t\t\trow = dataView.row(y);\n\n\t\t\t\tfor (x in 0...dataView.width)\n\t\t\t\t{\n\t\t\t\t\tif (littleEndian)\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor = bytes.getInt32(dataPosition); // can this be trusted on big endian systems?\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcolor = bytes.get(dataPosition + 3) | (bytes.get(dataPosition + 2) << 8) | (bytes.get(dataPosition +\n\t\t\t\t\t\t\t1) << 16) | (bytes.get(dataPosition) << 24);\n\t\t\t\t\t}\n\n\t\t\t\t\tdataPosition += 4;\n\n\t\t\t\t\tswitch (format)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase ARGB32:\n\t\t\t\t\t\t\tpixel = (color : ARGB);\n\t\t\t\t\t\tcase BGRA32:\n\t\t\t\t\t\t\tpixel = (color : BGRA);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tpixel = color;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!transparent) pixel.a = 0xFF;\n\t\t\t\t\tpixel.writeUInt8(data, row + (x * 4), sourceFormat, premultiplied);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tpublic static function threshold(image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, operation:String, threshold:Int, color:Int,\n\t\t\tmask:Int, copySource:Bool, format:PixelFormat):Int\n\t{\n\t\tvar _color:RGBA, _mask:RGBA, _threshold:RGBA;\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase ARGB32:\n\t\t\t\t_color = (color : ARGB);\n\t\t\t\t_mask = (mask : ARGB);\n\t\t\t\t_threshold = (threshold : ARGB);\n\n\t\t\tcase BGRA32:\n\t\t\t\t_color = (color : BGRA);\n\t\t\t\t_mask = (mask : BGRA);\n\t\t\t\t_threshold = (threshold : BGRA);\n\n\t\t\tdefault:\n\t\t\t\t_color = color;\n\t\t\t\t_mask = mask;\n\t\t\t\t_threshold = threshold;\n\t\t}\n\n\t\tvar _operation = switch (operation)\n\t\t{\n\t\t\tcase \"!=\": NOT_EQUALS;\n\t\t\tcase \"==\": EQUALS;\n\t\t\tcase \"<\": LESS_THAN;\n\t\t\tcase \"<=\": LESS_THAN_OR_EQUAL_TO;\n\t\t\tcase \">\": GREATER_THAN;\n\t\t\tcase \">=\": GREATER_THAN_OR_EQUAL_TO;\n\t\t\tdefault: -1;\n\t\t}\n\n\t\tif (_operation == -1) return 0;\n\n\t\tvar srcData = sourceImage.buffer.data;\n\t\tvar destData = image.buffer.data;\n\n\t\tif (srcData == null || destData == null) return 0;\n\n\t\tvar hits = 0;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) hits = NativeCFFI.lime_image_data_util_threshold(image, sourceImage, sourceRect, destPoint, _operation, (_threshold >> 16) & 0xFFFF,\n\t\t\t(_threshold) & 0xFFFF, (_color >> 16) & 0xFFFF, (_color) & 0xFFFF, (_mask >> 16) & 0xFFFF, (_mask) & 0xFFFF, copySource);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar srcView = new ImageDataView(sourceImage, sourceRect);\n\t\t\tvar destView = new ImageDataView(image, new Rectangle(destPoint.x, destPoint.y, srcView.width, srcView.height));\n\n\t\t\tvar srcFormat = sourceImage.buffer.format;\n\t\t\tvar destFormat = image.buffer.format;\n\t\t\tvar srcPremultiplied = sourceImage.buffer.premultiplied;\n\t\t\tvar destPremultiplied = image.buffer.premultiplied;\n\n\t\t\tvar srcPosition,\n\t\t\t\tdestPosition,\n\t\t\t\tsrcPixel:RGBA = 0,\n\t\t\t\tdestPixel:RGBA = 0,\n\t\t\t\tpixelMask:UInt,\n\t\t\t\ttest:Bool,\n\t\t\t\tvalue:Int;\n\n\t\t\tfor (y in 0...destView.height)\n\t\t\t{\n\t\t\t\tsrcPosition = srcView.row(y);\n\t\t\t\tdestPosition = destView.row(y);\n\n\t\t\t\tfor (x in 0...destView.width)\n\t\t\t\t{\n\t\t\t\t\tsrcPixel.readUInt8(srcData, srcPosition, srcFormat, srcPremultiplied);\n\n\t\t\t\t\tpixelMask = srcPixel & _mask;\n\n\t\t\t\t\tvalue = __pixelCompare(pixelMask, _threshold);\n\n\t\t\t\t\ttest = switch (_operation)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase NOT_EQUALS: (value != 0);\n\t\t\t\t\t\tcase EQUALS: (value == 0);\n\t\t\t\t\t\tcase LESS_THAN: (value == -1);\n\t\t\t\t\t\tcase LESS_THAN_OR_EQUAL_TO: (value == 0 || value == -1);\n\t\t\t\t\t\tcase GREATER_THAN: (value == 1);\n\t\t\t\t\t\tcase GREATER_THAN_OR_EQUAL_TO: (value == 0 || value == 1);\n\t\t\t\t\t\tdefault: false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (test)\n\t\t\t\t\t{\n\t\t\t\t\t\t_color.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\t\t\t\t\t\thits++;\n\t\t\t\t\t}\n\t\t\t\t\telse if (copySource)\n\t\t\t\t\t{\n\t\t\t\t\t\tsrcPixel.writeUInt8(destData, destPosition, destFormat, destPremultiplied);\n\t\t\t\t\t}\n\n\t\t\t\t\tsrcPosition += 4;\n\t\t\t\t\tdestPosition += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hits > 0)\n\t\t{\n\t\t\timage.dirty = true;\n\t\t\timage.version++;\n\t\t}\n\n\t\treturn hits;\n\t}\n\n\tpublic static function unmultiplyAlpha(image:Image):Void\n\t{\n\t\tvar data = image.buffer.data;\n\t\tif (data == null) return;\n\n\t\t#if (lime_cffi && !disable_cffi && !macro)\n\t\tif (CFFI.enabled) NativeCFFI.lime_image_data_util_unmultiply_alpha(image);\n\t\telse\n\t\t#end\n\t\t{\n\t\t\tvar format = image.buffer.format;\n\t\t\tvar length = Std.int(data.length / 4);\n\t\t\tvar pixel:RGBA = 0;\n\n\t\t\tfor (i in 0...length)\n\t\t\t{\n\t\t\t\tpixel.readUInt8(data, i * 4, format, true);\n\t\t\t\tpixel.writeUInt8(data, i * 4, format, false);\n\t\t\t}\n\t\t}\n\n\t\timage.buffer.premultiplied = false;\n\t\timage.dirty = true;\n\t\timage.version++;\n\t}\n\n\tprivate static function __boxBlur(imgA:UInt8Array, imgB:UInt8Array, w:Int, h:Int, bx:Float, by:Float):Void\n\t{\n\t\t// for(i in 0...imgA.length)\n\t\t// \timgB[i] = imgA[i];\n\t\timgB.set(imgA);\n\n\t\tvar bx = Std.int(bx);\n\t\tvar by = Std.int(by);\n\n\t\t__boxBlurH(imgB, imgA, w, h, bx, 0);\n\t\t__boxBlurH(imgB, imgA, w, h, bx, 1);\n\t\t__boxBlurH(imgB, imgA, w, h, bx, 2);\n\t\t__boxBlurH(imgB, imgA, w, h, bx, 3);\n\n\t\t__boxBlurT(imgA, imgB, w, h, by, 0);\n\t\t__boxBlurT(imgA, imgB, w, h, by, 1);\n\t\t__boxBlurT(imgA, imgB, w, h, by, 2);\n\t\t__boxBlurT(imgA, imgB, w, h, by, 3);\n\t}\n\n\tprivate static #if cpp inline #end function __boxBlurH(imgA:UInt8Array, imgB:UInt8Array, w:Int, h:Int, r:Int, off:Int):Void\n\t{\n\t\tvar iarr = 1 / (r + r + 1);\n\t\tvar ti:Int;\n\t\tvar li:Int;\n\t\tvar ri:Int;\n\t\tvar fv:Int;\n\t\tvar lv:Int;\n\t\tvar val:Int;\n\n\t\tfor (i in 0...h)\n\t\t{\n\t\t\tti = i * w;\n\t\t\tli = ti;\n\t\t\tri = ti + r;\n\n\t\t\tfv = imgA[ti * 4 + off];\n\t\t\tlv = imgA[(ti + w - 1) * 4 + off];\n\t\t\tval = (r + 1) * fv;\n\n\t\t\tfor (j in 0...r)\n\t\t\t{\n\t\t\t\tval += imgA[(ti + j) * 4 + off];\n\t\t\t}\n\n\t\t\tfor (j in 0...(r + 1))\n\t\t\t{\n\t\t\t\tval += imgA[ri * 4 + off] - fv;\n\t\t\t\timgB[ti * 4 + off] = Math.round(val * iarr);\n\t\t\t\tri++;\n\t\t\t\tti++;\n\t\t\t}\n\n\t\t\tfor (j in (r + 1)...(w - r))\n\t\t\t{\n\t\t\t\tval += imgA[ri * 4 + off] - imgA[li * 4 + off];\n\t\t\t\timgB[ti * 4 + off] = Math.round(val * iarr);\n\t\t\t\tri++;\n\t\t\t\tli++;\n\t\t\t\tti++;\n\t\t\t}\n\n\t\t\tfor (j in (w - r)...w)\n\t\t\t{\n\t\t\t\tval += lv - imgA[li * 4 + off];\n\t\t\t\timgB[ti * 4 + off] = Math.round(val * iarr);\n\t\t\t\tli++;\n\t\t\t\tti++;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static inline function __boxBlurT(imgA:UInt8Array, imgB:UInt8Array, w:Int, h:Int, r:Int, off:Int):Void\n\t{\n\t\tvar iarr = 1 / (r + r + 1);\n\t\tvar ws = w * 4;\n\t\tvar ti:Int;\n\t\tvar li:Int;\n\t\tvar ri:Int;\n\t\tvar fv:Int;\n\t\tvar lv:Int;\n\t\tvar val:Int;\n\n\t\tfor (i in 0...w)\n\t\t{\n\t\t\tti = i * 4 + off;\n\t\t\tli = ti;\n\t\t\tri = ti + (r * ws);\n\n\t\t\tfv = imgA[ti];\n\t\t\tlv = imgA[ti + (ws * (h - 1))];\n\t\t\tval = (r + 1) * fv;\n\n\t\t\tfor (j in 0...r)\n\t\t\t{\n\t\t\t\tval += imgA[ti + (j * ws)];\n\t\t\t}\n\n\t\t\tfor (j in 0...(r + 1))\n\t\t\t{\n\t\t\t\tval += imgA[ri] - fv;\n\t\t\t\timgB[ti] = Math.round(val * iarr);\n\t\t\t\tri += ws;\n\t\t\t\tti += ws;\n\t\t\t}\n\n\t\t\tfor (j in (r + 1)...(h - r))\n\t\t\t{\n\t\t\t\tval += imgA[ri] - imgA[li];\n\t\t\t\timgB[ti] = Math.round(val * iarr);\n\t\t\t\tli += ws;\n\t\t\t\tri += ws;\n\t\t\t\tti += ws;\n\t\t\t}\n\n\t\t\tfor (j in (h - r)...h)\n\t\t\t{\n\t\t\t\tval += lv - imgA[li];\n\t\t\t\timgB[ti] = Math.round(val * iarr);\n\t\t\t\tli += ws;\n\t\t\t\tti += ws;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns: the offset for translated coordinate in the source image or -1 if the source the coordinate out of the source or destination bounds\n\t * Note: destX and destY should be valid coordinates\n\t**/\n\tprivate static #if cpp inline #end function __calculateSourceOffset(sourceRect:Rectangle, destPoint:Vector2, destX:Int, destY:Int):Int\n\t{\n\t\tvar sourceX:Int = destX - Std.int(destPoint.x);\n\t\tvar sourceY:Int = destY - Std.int(destPoint.y);\n\n\t\tvar offset = 0;\n\n\t\tif (sourceX < 0 || sourceY < 0 || sourceX >= sourceRect.width || sourceY >= sourceRect.height)\n\t\t{\n\t\t\toffset = -1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\toffset = 4 * (sourceY * Std.int(sourceRect.width) + sourceX);\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\tprivate static function __getBoxesForGaussianBlur(sigma:Float, n:Int):Array<Float>\n\t{\n\t\tvar wIdeal = Math.sqrt((12 * sigma * sigma / n) + 1); // Ideal averaging filter width\n\t\tvar wl = Math.floor(wIdeal);\n\t\tif (wl % 2 == 0) wl--;\n\t\tvar wu = wl + 2;\n\n\t\tvar mIdeal = ((12 * sigma * sigma) - (n * wl * wl) - (4 * n * wl) - (3 * n)) / ((-4 * wl) - 4);\n\t\tvar m = Math.round(mIdeal);\n\t\tvar sizes:Array<Float> = [];\n\n\t\tfor (i in 0...n)\n\t\t{\n\t\t\tsizes.push(i < m ? wl : wu);\n\t\t}\n\n\t\treturn sizes;\n\t}\n\n\tprivate static inline function __pixelCompare(n1:UInt, n2:UInt):Int\n\t{\n\t\tvar tmp1:UInt;\n\t\tvar tmp2:UInt;\n\n\t\ttmp1 = (n1 >> 24) & 0xFF;\n\t\ttmp2 = (n2 >> 24) & 0xFF;\n\n\t\tif (tmp1 != tmp2)\n\t\t{\n\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmp1 = (n1 >> 16) & 0xFF;\n\t\t\ttmp2 = (n2 >> 16) & 0xFF;\n\n\t\t\tif (tmp1 != tmp2)\n\t\t\t{\n\t\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmp1 = (n1 >> 8) & 0xFF;\n\t\t\t\ttmp2 = (n2 >> 8) & 0xFF;\n\n\t\t\t\tif (tmp1 != tmp2)\n\t\t\t\t{\n\t\t\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmp1 = n1 & 0xFF;\n\t\t\t\t\ttmp2 = n2 & 0xFF;\n\n\t\t\t\t\tif (tmp1 != tmp2)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn (tmp1 > tmp2 ? 1 : -1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static #if cpp inline #end function __translatePixel(imgB:UInt8Array, sourceRect:Rectangle, destRect:Rectangle, destPoint:Vector2, destX:Int,\n\t\t\tdestY:Int, strength:Float):Void\n\t{\n\t\tvar d = 4 * (destY * Std.int(destRect.width) + destX);\n\t\tvar s = __calculateSourceOffset(sourceRect, destPoint, destX, destY);\n\n\t\tif (s < 0)\n\t\t{\n\t\t\timgB[d] = imgB[d + 1] = imgB[d + 2] = imgB[d + 3] = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\timgB[d] = imgB[s];\n\t\t\timgB[d + 1] = imgB[s + 1];\n\t\t\timgB[d + 2] = imgB[s + 2];\n\n\t\t\tvar a = Std.int(imgB[s + 3] * strength);\n\t\t\timgB[d + 3] = a < 0 ? 0 : (a > 255 ? 255 : a);\n\t\t}\n\t}\n}\n\nprivate class ImageDataView\n{\n\tpublic var x(default, null):Int;\n\tpublic var y(default, null):Int;\n\tpublic var height(default, null):Int;\n\tpublic var width(default, null):Int;\n\n\tprivate var byteOffset:Int;\n\tprivate var image:Image;\n\tprivate var rect:Rectangle;\n\tprivate var stride:Int;\n\tprivate var tempRect:Rectangle;\n\n\tpublic function new(image:Image, rect:Rectangle = null)\n\t{\n\t\tthis.image = image;\n\n\t\tif (rect == null)\n\t\t{\n\t\t\tthis.rect = image.rect;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (rect.x < 0) rect.x = 0;\n\t\t\tif (rect.y < 0) rect.y = 0;\n\t\t\tif (rect.x + rect.width > image.width) rect.width = image.width - rect.x;\n\t\t\tif (rect.y + rect.height > image.height) rect.height = image.height - rect.y;\n\t\t\tif (rect.width < 0) rect.width = 0;\n\t\t\tif (rect.height < 0) rect.height = 0;\n\t\t\tthis.rect = rect;\n\t\t}\n\n\t\tstride = image.buffer.stride;\n\n\t\t__update();\n\t}\n\n\tpublic function clip(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tif (tempRect == null) tempRect = new Rectangle();\n\t\ttempRect.setTo(x, y, width, height);\n\n\t\trect.intersection(tempRect, rect);\n\t\t__update();\n\t}\n\n\tpublic inline function hasRow(y:Int):Bool\n\t{\n\t\treturn (y >= 0 && y < height);\n\t}\n\n\tpublic function offset(x:Int, y:Int):Void\n\t{\n\t\tif (x < 0)\n\t\t{\n\t\t\trect.x += x;\n\t\t\tif (rect.x < 0) rect.x = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trect.x += x;\n\t\t\trect.width -= x;\n\t\t}\n\n\t\tif (y < 0)\n\t\t{\n\t\t\trect.y += y;\n\t\t\tif (rect.y < 0) rect.y = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trect.y += y;\n\t\t\trect.height -= y;\n\t\t}\n\n\t\t__update();\n\t}\n\n\tpublic inline function row(y:Int):Int\n\t{\n\t\treturn byteOffset + stride * y;\n\t}\n\n\tprivate function __update():Void\n\t{\n\t\tthis.x = Math.ceil(rect.x);\n\t\tthis.y = Math.ceil(rect.y);\n\t\tthis.width = Math.floor(rect.width);\n\t\tthis.height = Math.floor(rect.height);\n\t\tbyteOffset = (stride * (this.y + image.offsetY)) + ((this.x + image.offsetX) * 4);\n\t}\n}\n\n@:noCompletion @:dox(hide)\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract ThresholdOperation(Int) from Int to Int\n{\n\tvar NOT_EQUALS = 0;\n\tvar EQUALS = 1;\n\tvar LESS_THAN = 2;\n\tvar LESS_THAN_OR_EQUAL_TO = 3;\n\tvar GREATER_THAN = 4;\n\tvar GREATER_THAN_OR_EQUAL_TO = 5;\n}\n"
  },
  {
    "path": "src/lime/_internal/graphics/StackBlur.hx",
    "content": "package lime._internal.graphics;\n\nimport lime.graphics.Image;\nimport lime.math.Rectangle;\nimport lime.math.Vector2;\n\n// Ported from https://github.com/CreateJS/EaselJS/blob/master/src/easeljs/filters/BlurFilter.js\nclass StackBlur\n{\n\tprivate static var MUL_TABLE:Array<Int> = [\n\t\t1, 171, 205, 293, 57, 373, 79, 137, 241, 27, 391, 357, 41, 19, 283, 265, 497, 469, 443, 421, 25, 191, 365, 349, 335, 161, 155, 149, 9, 278, 269, 261,\n\t\t505, 245, 475, 231, 449, 437, 213, 415, 405, 395, 193, 377, 369, 361, 353, 345, 169, 331, 325, 319, 313, 307, 301, 37, 145, 285, 281, 69, 271, 267,\n\t\t263, 259, 509, 501, 493, 243, 479, 118, 465, 459, 113, 446, 55, 435, 429, 423, 209, 413, 51, 403, 199, 393, 97, 3, 379, 375, 371, 367, 363, 359, 355,\n\t\t351, 347, 43, 85, 337, 333, 165, 327, 323, 5, 317, 157, 311, 77, 305, 303, 75, 297, 294, 73, 289, 287, 71, 141, 279, 277, 275, 68, 135, 67, 133, 33,\n\t\t262, 260, 129, 511, 507, 503, 499, 495, 491, 61, 121, 481, 477, 237, 235, 467, 232, 115, 457, 227, 451, 7, 445, 221, 439, 218, 433, 215, 427, 425,\n\t\t211, 419, 417, 207, 411, 409, 203, 202, 401, 399, 396, 197, 49, 389, 387, 385, 383, 95, 189, 47, 187, 93, 185, 23, 183, 91, 181, 45, 179, 89, 177, 11,\n\t\t175, 87, 173, 345, 343, 341, 339, 337, 21, 167, 83, 331, 329, 327, 163, 81, 323, 321, 319, 159, 79, 315, 313, 39, 155, 309, 307, 153, 305, 303, 151,\n\t\t75, 299, 149, 37, 295, 147, 73, 291, 145, 289, 287, 143, 285, 71, 141, 281, 35, 279, 139, 69, 275, 137, 273, 17, 271, 135, 269, 267, 133, 265, 33,\n\t\t263, 131, 261, 130, 259, 129, 257, 1\n\t];\n\tprivate static var SHG_TABLE:Array<Int> = [\n\t\t0, 9, 10, 11, 9, 12, 10, 11, 12, 9, 13, 13, 10, 9, 13, 13, 14, 14, 14, 14, 10, 13, 14, 14, 14, 13, 13, 13, 9, 14, 14, 14, 15, 14, 15, 14, 15, 15, 14,\n\t\t15, 15, 15, 14, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 12, 14, 15, 15, 13, 15, 15, 15, 15, 16, 16, 16, 15, 16, 14, 16, 16, 14, 16, 13, 16,\n\t\t16, 16, 15, 16, 13, 16, 15, 16, 14, 9, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 14, 16, 16, 15, 16, 16, 10, 16, 15, 16, 14, 16, 16, 14, 16, 16, 14, 16,\n\t\t16, 14, 15, 16, 16, 16, 14, 15, 14, 15, 13, 16, 16, 15, 17, 17, 17, 17, 17, 17, 14, 15, 17, 17, 16, 16, 17, 16, 15, 17, 16, 17, 11, 17, 16, 17, 16,\n\t\t17, 16, 17, 17, 16, 17, 17, 16, 17, 17, 16, 16, 17, 17, 17, 16, 14, 17, 17, 17, 17, 15, 16, 14, 16, 15, 16, 13, 16, 15, 16, 14, 16, 15, 16, 12, 16,\n\t\t15, 16, 17, 17, 17, 17, 17, 13, 16, 15, 17, 17, 17, 16, 15, 17, 17, 17, 16, 15, 17, 17, 14, 16, 17, 17, 16, 17, 17, 16, 15, 17, 16, 14, 17, 16, 15,\n\t\t17, 16, 17, 17, 16, 17, 15, 16, 17, 14, 17, 16, 15, 17, 16, 17, 13, 17, 16, 17, 17, 16, 17, 14, 17, 16, 17, 16, 17, 16, 17, 9\n\t];\n\n\tpublic static function blur(dest:Image, source:Image, sourceRect:Rectangle, destPoint:Vector2, blurX:Float, blurY:Float, quality:Int)\n\t{\n\t\tdest.copyPixels(source, sourceRect, destPoint);\n\t\t__stackBlurCanvasRGBA(dest, Std.int(sourceRect.width), Std.int(sourceRect.height), blurX, blurY, quality);\n\t}\n\n\tprivate static function __stackBlurCanvasRGBA(image:Image, width:Int, height:Int, blurX:Float, blurY:Float, quality:Int)\n\t{\n\t\t// TODO: Handle pixel order\n\t\t// TODO: Support blur without unmultiplying alpha\n\n\t\tvar radiusX = Math.round(blurX) >> 1;\n\t\tvar radiusY = Math.round(blurY) >> 1;\n\n\t\tif (MUL_TABLE == null) return; // can be null due to static initialization order\n\t\tif (radiusX >= MUL_TABLE.length) radiusX = MUL_TABLE.length - 1;\n\t\tif (radiusY >= MUL_TABLE.length) radiusY = MUL_TABLE.length - 1;\n\t\tif (radiusX < 0 || radiusY < 0) return;\n\n\t\tvar iterations = quality;\n\t\tif (iterations < 1) iterations = 1;\n\t\tif (iterations > 3) iterations = 3;\n\n\t\tvar px = image.data;\n\t\tvar x:Int, y:Int, i:Int, p:Int, yp:Int, yi:Int, yw:Int;\n\t\tvar r:Int, g:Int, b:Int, a:Int, pr:Int, pg:Int, pb:Int, pa:Int;\n\t\tvar f:Float;\n\n\t\tvar divx = (radiusX + radiusX + 1);\n\t\tvar divy = (radiusY + radiusY + 1);\n\t\tvar w = width;\n\t\tvar h = height;\n\n\t\tvar w1 = w - 1;\n\t\tvar h1 = h - 1;\n\t\tvar rxp1 = radiusX + 1;\n\t\tvar ryp1 = radiusY + 1;\n\n\t\tvar ssx = new BlurStack();\n\t\tvar sx = ssx;\n\t\tfor (i in 1...divx)\n\t\t{\n\t\t\tsx = sx.n = new BlurStack();\n\t\t}\n\t\tsx.n = ssx;\n\n\t\tvar ssy = new BlurStack();\n\t\tvar sy = ssy;\n\t\tfor (i in 1...divy)\n\t\t{\n\t\t\tsy = sy.n = new BlurStack();\n\t\t}\n\t\tsy.n = ssy;\n\n\t\tvar si = null;\n\n\t\tvar mtx = MUL_TABLE[radiusX];\n\t\tvar stx = SHG_TABLE[radiusX];\n\t\tvar mty = MUL_TABLE[radiusY];\n\t\tvar sty = SHG_TABLE[radiusY];\n\n\t\twhile (iterations > 0)\n\t\t{\n\t\t\titerations--;\n\t\t\tyw = yi = 0;\n\t\t\tvar ms = mtx;\n\t\t\tvar ss = stx;\n\t\t\ty = h;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tr = rxp1 * (pr = px[yi]);\n\t\t\t\tg = rxp1 * (pg = px[yi + 1]);\n\t\t\t\tb = rxp1 * (pb = px[yi + 2]);\n\t\t\t\ta = rxp1 * (pa = px[yi + 3]);\n\t\t\t\tsx = ssx;\n\t\t\t\ti = rxp1;\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tsx.r = pr;\n\t\t\t\t\tsx.g = pg;\n\t\t\t\t\tsx.b = pb;\n\t\t\t\t\tsx.a = pa;\n\t\t\t\t\tsx = sx.n;\n\t\t\t\t}\n\t\t\t\twhile (--i > -1);\n\n\t\t\t\tfor (i in 1...rxp1)\n\t\t\t\t{\n\t\t\t\t\tp = yi + ((w1 < i ? w1 : i) << 2);\n\t\t\t\t\tr += (sx.r = px[p]);\n\t\t\t\t\tg += (sx.g = px[p + 1]);\n\t\t\t\t\tb += (sx.b = px[p + 2]);\n\t\t\t\t\ta += (sx.a = px[p + 3]);\n\t\t\t\t\tsx = sx.n;\n\t\t\t\t}\n\n\t\t\t\tsi = ssx;\n\t\t\t\tfor (x in 0...w)\n\t\t\t\t{\n\t\t\t\t\tpx[yi++] = (r * ms) >>> ss;\n\t\t\t\t\tpx[yi++] = (g * ms) >>> ss;\n\t\t\t\t\tpx[yi++] = (b * ms) >>> ss;\n\t\t\t\t\tpx[yi++] = (a * ms) >>> ss;\n\t\t\t\t\tp = (yw + ((p = x + radiusX + 1) < w1 ? p : w1)) << 2;\n\t\t\t\t\tr -= si.r - (si.r = px[p]);\n\t\t\t\t\tg -= si.g - (si.g = px[p + 1]);\n\t\t\t\t\tb -= si.b - (si.b = px[p + 2]);\n\t\t\t\t\ta -= si.a - (si.a = px[p + 3]);\n\t\t\t\t\tsi = si.n;\n\t\t\t\t}\n\t\t\t\tyw += w;\n\t\t\t}\n\t\t\twhile (--y > 0);\n\n\t\t\tms = mty;\n\t\t\tss = sty;\n\t\t\tfor (x in 0...w)\n\t\t\t{\n\t\t\t\tyi = x << 2;\n\t\t\t\tr = ryp1 * (pr = px[yi]);\n\t\t\t\tg = ryp1 * (pg = px[yi + 1]);\n\t\t\t\tb = ryp1 * (pb = px[yi + 2]);\n\t\t\t\ta = ryp1 * (pa = px[yi + 3]);\n\t\t\t\tsy = ssy;\n\t\t\t\tfor (i in 0...ryp1)\n\t\t\t\t{\n\t\t\t\t\tsy.r = pr;\n\t\t\t\t\tsy.g = pg;\n\t\t\t\t\tsy.b = pb;\n\t\t\t\t\tsy.a = pa;\n\t\t\t\t\tsy = sy.n;\n\t\t\t\t}\n\t\t\t\typ = w;\n\t\t\t\tfor (i in 1...(radiusY + 1))\n\t\t\t\t{\n\t\t\t\t\tyi = (yp + x) << 2;\n\t\t\t\t\tr += (sy.r = px[yi]);\n\t\t\t\t\tg += (sy.g = px[yi + 1]);\n\t\t\t\t\tb += (sy.b = px[yi + 2]);\n\t\t\t\t\ta += (sy.a = px[yi + 3]);\n\t\t\t\t\tsy = sy.n;\n\t\t\t\t\tif (i < h1)\n\t\t\t\t\t{\n\t\t\t\t\t\typ += w;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tyi = x;\n\t\t\t\tsi = ssy;\n\n\t\t\t\tif (iterations > 0)\n\t\t\t\t{\n\t\t\t\t\tfor (y in 0...h)\n\t\t\t\t\t{\n\t\t\t\t\t\tp = yi << 2;\n\t\t\t\t\t\tpx[p + 3] = pa = (a * ms) >>> ss;\n\t\t\t\t\t\tif (pa > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpx[p] = ((r * ms) >>> ss);\n\t\t\t\t\t\t\tpx[p + 1] = ((g * ms) >>> ss);\n\t\t\t\t\t\t\tpx[p + 2] = ((b * ms) >>> ss);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpx[p] = px[p + 1] = px[p + 2] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tp = (x + (((p = y + ryp1) < h1 ? p : h1) * w)) << 2;\n\t\t\t\t\t\tr -= si.r - (si.r = px[p]);\n\t\t\t\t\t\tg -= si.g - (si.g = px[p + 1]);\n\t\t\t\t\t\tb -= si.b - (si.b = px[p + 2]);\n\t\t\t\t\t\ta -= si.a - (si.a = px[p + 3]);\n\t\t\t\t\t\tsi = si.n;\n\t\t\t\t\t\tyi += w;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (y in 0...h)\n\t\t\t\t\t{\n\t\t\t\t\t\tp = yi << 2;\n\t\t\t\t\t\tpx[p + 3] = pa = (a * ms) >>> ss;\n\t\t\t\t\t\tif (pa > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tf = 255 / pa;\n\t\t\t\t\t\t\tpr = Std.int(((r * ms) >>> ss) * f);\n\t\t\t\t\t\t\tpg = Std.int(((g * ms) >>> ss) * f);\n\t\t\t\t\t\t\tpb = Std.int(((b * ms) >>> ss) * f);\n\t\t\t\t\t\t\tpx[p] = pr > 255 ? 255 : pr;\n\t\t\t\t\t\t\tpx[p + 1] = pg > 255 ? 255 : pg;\n\t\t\t\t\t\t\tpx[p + 2] = pb > 255 ? 255 : pb;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpx[p] = px[p + 1] = px[p + 2] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tp = (x + (((p = y + ryp1) < h1 ? p : h1) * w)) << 2;\n\t\t\t\t\t\tr -= si.r - (si.r = px[p]);\n\t\t\t\t\t\tg -= si.g - (si.g = px[p + 1]);\n\t\t\t\t\t\tb -= si.b - (si.b = px[p + 2]);\n\t\t\t\t\t\ta -= si.a - (si.a = px[p + 3]);\n\t\t\t\t\t\tsi = si.n;\n\t\t\t\t\t\tyi += w;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass BlurStack\n{\n\tpublic var r:Int;\n\tpublic var g:Int;\n\tpublic var b:Int;\n\tpublic var a:Int;\n\tpublic var n:BlurStack;\n\n\tpublic function new()\n\t{\n\t\tthis.r = 0;\n\t\tthis.g = 0;\n\t\tthis.b = 0;\n\t\tthis.a = 0;\n\t\tthis.n = null;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/macros/AssetsMacro.hx",
    "content": "package lime._internal.macros;\n\n#if macro\nimport haxe.crypto.BaseCode;\nimport haxe.io.Bytes;\nimport haxe.macro.Context;\nimport haxe.macro.Expr;\nimport haxe.macro.Type;\n#end\n#if (macro && !display)\nimport lime._internal.format.Base64;\nimport sys.io.File;\nimport sys.FileSystem;\n#end\n\nclass AssetsMacro\n{\n\t#if (!macro || display)\n\tmacro public static function cacheVersion()\n\t{\n\t\treturn macro 0;\n\t}\n\t#else\n\tmacro public static function cacheVersion()\n\t{\n\t\treturn macro $v{Std.int(Math.random() * 1000000)};\n\t}\n\n\tmacro public static function embedBytes():Array<Field>\n\t{\n\t\tvar fields = embedData(\":file\");\n\t\tif (fields == null) return null;\n\n\t\tfor (autoBuild in Context.getLocalClass().get().meta.extract(\":autoBuild\"))\n\t\t{\n\t\t\tswitch (autoBuild.params[0])\n\t\t\t{\n\t\t\t\tcase macro lime._internal.macros.AssetsMacro.embedByteArray():\n\t\t\t\t\treturn null;\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tvar superCall = Context.defined(\"html5\") ? macro super(bytes.b.buffer)\n\t\t\t: Context.defined(\"hl\") ? macro super(bytes.b, bytes.length)\n\t\t\t: macro super(bytes.length, bytes.b);\n\n\t\tvar definition = macro class Temp\n\t\t{\n\t\t\tpublic function new(?length:Int, ?bytesData:haxe.io.BytesData)\n\t\t\t{\n\t\t\t\tvar bytes = haxe.Resource.getBytes(resourceName);\n\t\t\t\t$superCall;\n\t\t\t}\n\t\t};\n\n\t\tfields.push(definition.fields[0]);\n\n\t\treturn fields;\n\t}\n\n\tmacro public static function embedByteArray():Array<Field>\n\t{\n\t\tvar fields = embedData(\":file\");\n\t\tif (fields == null) return null;\n\n\t\tvar definition = macro class Temp\n\t\t{\n\t\t\tpublic function new(?length:Int = 0)\n\t\t\t{\n\t\t\t\tsuper();\n\n\t\t\t\tvar bytes = haxe.Resource.getBytes(resourceName);\n\t\t\t\t__fromBytes(bytes);\n\t\t\t}\n\t\t};\n\n\t\tfields.push(definition.fields[0]);\n\n\t\treturn fields;\n\t}\n\n\tprivate static function embedData(metaName:String, encode:Bool = false):Array<Field>\n\t{\n\t\tif (Context.defined(\"display\")) return null;\n\n\t\tvar classType = Context.getLocalClass().get();\n\t\tvar metaData = classType.meta;\n\t\tvar position = Context.currentPos();\n\t\tvar fields = Context.getBuildFields();\n\n\t\tfor (meta in metaData.extract(metaName))\n\t\t{\n\t\t\tif (meta.params.length == 0) continue;\n\n\t\t\tswitch (meta.params[0].expr)\n\t\t\t{\n\t\t\t\tcase EConst(CString(\"\" | null)):\n\t\t\t\t\treturn null;\n\n\t\t\t\tcase EConst(CString(filePath)):\n\t\t\t\t\tvar path = filePath;\n\n\t\t\t\t\tif (!FileSystem.exists(filePath))\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Context.resolvePath(filePath);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!FileSystem.exists(path) || FileSystem.isDirectory(path))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar bytes = File.getBytes(path);\n\t\t\t\t\tvar resourceName = \"__ASSET__\"\n\t\t\t\t\t\t+ metaName\n\t\t\t\t\t\t+ \"_\"\n\t\t\t\t\t\t+ (classType.pack.length > 0 ? classType.pack.join(\"_\") + \"_\" : \"\")\n\t\t\t\t\t\t+ classType.name;\n\n\t\t\t\t\tif (Context.getResources().exists(resourceName))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (encode)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar resourceType = \"image/png\";\n\n\t\t\t\t\t\tif (bytes.get(0) == 0xFF && bytes.get(1) == 0xD8)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresourceType = \"image/jpg\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (bytes.get(0) == 0x47 && bytes.get(1) == 0x49 && bytes.get(2) == 0x46)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresourceType = \"image/gif\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar definition = macro class Temp\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprivate static inline var resourceType:String = $v{ resourceType };\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfields.push(definition.fields[0]);\n\n\t\t\t\t\t\tvar base64 = Base64.encode(bytes);\n\t\t\t\t\t\tContext.addResource(resourceName, Bytes.ofString(base64));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tContext.addResource(resourceName, bytes);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar definition = macro class Temp\n\t\t\t\t\t{\n\t\t\t\t\t\tprivate static inline var resourceName:String = $v{ resourceName };\n\t\t\t\t\t};\n\n\t\t\t\t\tfields.push(definition.fields[0]);\n\n\t\t\t\t\treturn fields;\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tmacro public static function embedFont():Array<Field>\n\t{\n\t\tif (Context.defined(\"display\")) return Context.getBuildFields();\n\n\t\tvar fields = null;\n\n\t\tvar classType = Context.getLocalClass().get();\n\t\tvar metaData = classType.meta.get();\n\t\tvar position = Context.currentPos();\n\t\tvar fields = Context.getBuildFields();\n\n\t\tvar path = \"\";\n\t\tvar glyphs = \"32-255\";\n\n\t\tfor (meta in metaData)\n\t\t{\n\t\t\tif (meta.name == \":font\")\n\t\t\t{\n\t\t\t\tif (meta.params.length > 0)\n\t\t\t\t{\n\t\t\t\t\tswitch (meta.params[0].expr)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase EConst(CString(filePath)):\n\t\t\t\t\t\t\tpath = filePath;\n\n\t\t\t\t\t\t\tif (!sys.FileSystem.exists(filePath))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath = Context.resolvePath(filePath);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (path != null && path != \"\")\n\t\t{\n\t\t\tif (Context.defined(\"html5\"))\n\t\t\t{\n\t\t\t\tSys.command(\"haxelib\", [\"run\", \"lime\", \"generate\", \"-font-hash\", sys.FileSystem.fullPath(path)]);\n\t\t\t\tpath += \".hash\";\n\t\t\t}\n\n\t\t\tvar bytes = File.getBytes(path);\n\t\t\tvar resourceName = \"LIME_font_\" + (classType.pack.length > 0 ? classType.pack.join(\"_\") + \"_\" : \"\") + classType.name;\n\n\t\t\tContext.addResource(resourceName, bytes);\n\n\t\t\tfor (field in fields)\n\t\t\t{\n\t\t\t\tif (field.name == \"new\")\n\t\t\t\t{\n\t\t\t\t\tfields.remove(field);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar definition = macro class Temp\n\t\t\t{\n\t\t\t\tprivate static var resourceName:String = $v{ resourceName };\n\n\t\t\t\tpublic function new()\n\t\t\t\t{\n\t\t\t\t\tsuper();\n\n\t\t\t\t\t__fromBytes(haxe.Resource.getBytes(resourceName));\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfields.push(definition.fields[0]);\n\t\t\tfields.push(definition.fields[1]);\n\n\t\t\treturn fields;\n\t\t}\n\n\t\treturn fields;\n\t}\n\n\tmacro public static function embedImage():Array<Field>\n\t{\n\t\tvar fields = embedData(\":image\", Context.defined(\"html5\"));\n\t\tif (fields == null) return null;\n\n\t\tvar definition:TypeDefinition;\n\t\tif (Context.defined(\"html5\"))\n\t\t{\n\t\t\tdefinition = macro class Temp\n\t\t\t{\n\t\t\t\tpublic static var preload:js.html.Image;\n\n\t\t\t\tpublic function new(?buffer:lime.graphics.ImageBuffer,\n\t\t\t\t\t?offsetX:Int, ?offsetY:Int, ?width:Int, ?height:Int,\n\t\t\t\t\t?color:Null<Int>, ?type:lime.graphics.ImageType,\n\t\t\t\t\t?onload:Dynamic = true)\n\t\t\t\t{\n\t\t\t\t\tsuper();\n\n\t\t\t\t\tif (preload != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar buffer = new lime.graphics.ImageBuffer();\n\t\t\t\t\t\tbuffer.__srcImage = preload;\n\t\t\t\t\t\tbuffer.width = preload.width;\n\t\t\t\t\t\tbuffer.width = preload.height;\n\n\t\t\t\t\t\t__fromImageBuffer(buffer);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t__fromBase64(haxe.Resource.getString(resourceName), resourceType, function(image)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (preload == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpreload = image.buffer.__srcImage;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (onload != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tonload(image);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdefinition = macro class Temp\n\t\t\t{\n\t\t\t\tpublic function new(?buffer:lime.graphics.ImageBuffer,\n\t\t\t\t\t?offsetX:Int, ?offsetY:Int, ?width:Int, ?height:Int,\n\t\t\t\t\t?color:Null<Int>, ?type:lime.graphics.ImageType)\n\t\t\t\t{\n\t\t\t\t\tsuper();\n\n\t\t\t\t\t__fromBytes(haxe.Resource.getBytes(resourceName), null);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfor (field in definition.fields)\n\t\t{\n\t\t\tfields.push(field);\n\t\t}\n\n\t\treturn fields;\n\t}\n\n\tmacro public static function embedSound():Array<Field>\n\t{\n\t\tvar fields = embedData(\":sound\");\n\t\t// CFFILoader.h(248) : NOT Implemented:api_buffer_data\n\t\tif (fields == null || Context.defined(\"html5\") || !Context.defined(\"openfl\"))\n\t\t\treturn null;\n\n\t\tvar definition = macro class Temp\n\t\t{\n\t\t\tpublic function new(?stream:openfl.net.URLRequest,\n\t\t\t\t?context:openfl.media.SoundLoaderContext,\n\t\t\t\t?forcePlayAsMusic:Bool = false)\n\t\t\t{\n\t\t\t\tsuper();\n\n\t\t\t\tvar byteArray = openfl.utils.ByteArray.fromBytes(haxe.Resource.getBytes(resourceName));\n\t\t\t\tloadCompressedDataFromByteArray(byteArray, byteArray.length, forcePlayAsMusic);\n\t\t\t}\n\t\t};\n\n\t\tfields.push(definition.fields[0]);\n\n\t\treturn fields;\n\t}\n\t#end\n}\n"
  },
  {
    "path": "src/lime/_internal/macros/CFFIMacro.hx",
    "content": "package lime._internal.macros;\n\n#if macro\nimport haxe.macro.Context;\nimport haxe.macro.Expr;\nimport haxe.macro.Type;\n\nusing haxe.macro.ComplexTypeTools;\nusing haxe.macro.ExprTools;\nusing haxe.macro.TypeTools;\n\nclass CFFIMacro\n{\n\tpublic static function build(defaultLibrary:String = \"lime\"):Array<Field>\n\t{\n\t\tvar pos = Context.currentPos();\n\t\tvar fields = Context.getBuildFields();\n\t\tvar newFields:Array<Field> = [];\n\n\t\tfor (field in fields)\n\t\t{\n\t\t\tswitch (field)\n\t\t\t{\n\t\t\t\tcase _ => {kind: FFun(fun), meta: meta}:\n\t\t\t\t\tfor (m in meta)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (m.name == \":cffi\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar library = null;\n\t\t\t\t\t\t\tvar method = null;\n\t\t\t\t\t\t\tvar lazy = false;\n\n\t\t\t\t\t\t\tif (Reflect.hasField(m, \"params\"))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (m.params.length > 0) library = m.params[0].getValue();\n\t\t\t\t\t\t\t\tif (m.params.length > 1) method = m.params[1].getValue();\n\t\t\t\t\t\t\t\tif (m.params.length > 2) lazy = m.params[2].getValue();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (library == null || library == \"\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlibrary = defaultLibrary;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (method == null || method == \"\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmethod = field.name;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar typeArgs = [];\n\n\t\t\t\t\t\t\tfor (arg in fun.args)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttypeArgs.push({name: arg.name, opt: false, t: arg.type.toType()});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar type = __getFunctionType(typeArgs, fun.ret.toType());\n\n\t\t\t\t\t\t\tvar typeString = type.string;\n\t\t\t\t\t\t\tvar typeSignature = type.signature;\n\t\t\t\t\t\t\tvar expr = \"\";\n\n\t\t\t\t\t\t\tif (Context.defined(\"display\") || Context.defined(\"disable_cffi\"))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tswitch (type.result.toString())\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase \"Int\", \"Float\", \"cpp.Float32\", \"cpp.Int16\", \"cpp.Int32\", \"cpp.Float64\":\n\t\t\t\t\t\t\t\t\t\texpr += \"return 0\";\n\n\t\t\t\t\t\t\t\t\tcase \"Bool\":\n\t\t\t\t\t\t\t\t\t\texpr += \"return false\";\n\n\t\t\t\t\t\t\t\t\tcase \"Void\":\n\t\t\t\t\t\t\t\t\t\texpr += \"return\";\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\texpr += \"return null\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar cffiName = \"cffi_\" + field.name;\n\t\t\t\t\t\t\t\tvar cffiExpr, cffiType;\n\n\t\t\t\t\t\t\t\tif (Context.defined(\"cpp\"))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcffiExpr = 'new cpp.Callable<$typeString> (cpp.Prime._loadPrime (\"$library\", \"$method\", \"$typeSignature\", $lazy))';\n\n\t\t\t\t\t\t\t\t\t// Sys.println (\"private static var \" + field.name + ':$typeString = CFFI.loadPrime (\"$library\", \"$method\", \"$typeSignature\");');\n\t\t\t\t\t\t\t\t\t// Sys.println (\"private static var \" + field.name + ' = new cpp.Callable<$typeString> (cpp.Prime._loadPrime (\"$library\", \"$method\", \"$typeSignature\", $lazy));');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tvar args = typeSignature.length - 1;\n\n\t\t\t\t\t\t\t\t\tif (args > 5)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\targs = -1;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcffiExpr = 'new cpp.Callable<$typeString> (lime.system.CFFI.load (\"$library\", \"$method\", $args, $lazy))';\n\n\t\t\t\t\t\t\t\t\t// Sys.println (\"private static var \" + field.name + ':$typeString = CFFI.load (\"$library\", \"$method\", $args);');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tcffiType = TPath({pack: [\"cpp\"], name: \"Callable\", params: [TPType(TFun(type.args, type.result).toComplexType())]});\n\n\t\t\t\t\t\t\t\tnewFields.push(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tname: cffiName,\n\t\t\t\t\t\t\t\t\t\taccess: [APrivate, AStatic],\n\t\t\t\t\t\t\t\t\t\tkind: FieldType.FVar(cffiType, Context.parse(cffiExpr, field.pos)),\n\t\t\t\t\t\t\t\t\t\tpos: field.pos\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (type.result.toString() != \"Void\" && type.result.toString() != \"cpp.Void\")\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\texpr += \"return \";\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\texpr += '$cffiName.call (';\n\n\t\t\t\t\t\t\t\tfor (i in 0...type.args.length)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (i > 0) expr += \", \";\n\t\t\t\t\t\t\t\t\texpr += type.args[i].name;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\texpr += \")\";\n\n\t\t\t\t\t\t\t\t// if (Context.defined (\"cpp\")) {\n\n\t\t\t\t\t\t\t\t// \tSys.println ('private static var $cffiName = new cpp.Callable<$typeString> (cpp.Prime._loadPrime (\"$library\", \"$method\", \"$typeSignature\", $lazy));');\n\n\t\t\t\t\t\t\t\t// \tvar _args = \"\";\n\t\t\t\t\t\t\t\t// \tfor (i in 0...typeArgs.length) {\n\t\t\t\t\t\t\t\t// \t\tif (i > 0) _args += \", \";\n\t\t\t\t\t\t\t\t// \t\t_args += typeArgs[i].name + \":\" + typeArgs[i].t.toString ();\n\t\t\t\t\t\t\t\t// \t}\n\n\t\t\t\t\t\t\t\t// \tSys.println ('private static function ${field.name} ($_args) { $expr; }');\n\n\t\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfield.access.push(AInline);\n\t\t\t\t\t\t\tfun.expr = Context.parse(expr, field.pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tfields = fields.concat(newFields);\n\t\treturn fields;\n\t}\n\n\tprivate static function __getFunctionType(args:Array<{name:String, opt:Bool, t:Type}>, result:Type)\n\t{\n\t\t#if (!disable_cffi && !display)\n\t\tvar useCPPTypes = Context.defined(\"cpp\");\n\t\t#else\n\t\tvar useCPPTypes = false;\n\t\t#end\n\n\t\tvar typeArgs = [];\n\t\tvar typeResult = null;\n\t\tvar typeSignature = \"\";\n\n\t\tfor (arg in args)\n\t\t{\n\t\t\tswitch (arg.t.toString())\n\t\t\t{\n\t\t\t\tcase \"Int\", \"cpp.Int16\", \"cpp.Int32\":\n\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\ttypeSignature += \"i\";\n\n\t\t\t\tcase \"Bool\":\n\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\ttypeSignature += \"b\";\n\n\t\t\t\tcase \"cpp.Float32\":\n\t\t\t\t\tif (useCPPTypes)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypeArgs.push({name: arg.name, opt: false, t: (macro:cpp.Float32).toType()});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\t}\n\n\t\t\t\t\ttypeSignature += \"f\";\n\n\t\t\t\tcase \"Float\", \"cpp.Float64\", \"lime.utils.DataPointer\":\n\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\ttypeSignature += \"d\";\n\n\t\t\t\tcase \"String\":\n\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\ttypeSignature += \"s\";\n\n\t\t\t\tcase \"cpp.ConstCharStar\":\n\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\ttypeSignature += \"c\";\n\n\t\t\t\tcase \"Void\", \"cpp.Void\":\n\t\t\t\t\tif (useCPPTypes)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypeArgs.push({name: arg.name, opt: false, t: (macro:cpp.Void).toType()});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ttypeArgs.push(arg);\n\t\t\t\t\t}\n\n\t\t\t\t\ttypeSignature += \"v\";\n\n\t\t\t\tdefault:\n\t\t\t\t\tif (useCPPTypes)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypeArgs.push({name: arg.name, opt: false, t: (macro:cpp.Object).toType()});\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ttypeArgs.push({name: arg.name, opt: false, t: (macro:Dynamic).toType()});\n\t\t\t\t\t}\n\n\t\t\t\t\ttypeSignature += \"o\";\n\t\t\t}\n\t\t}\n\n\t\tswitch (result.toString())\n\t\t{\n\t\t\tcase \"Int\", \"cpp.Int16\", \"cpp.Int32\":\n\t\t\t\ttypeResult = result;\n\t\t\t\ttypeSignature += \"i\";\n\n\t\t\tcase \"Bool\":\n\t\t\t\ttypeResult = result;\n\t\t\t\ttypeSignature += \"b\";\n\n\t\t\tcase \"cpp.Float32\":\n\t\t\t\tif (useCPPTypes)\n\t\t\t\t{\n\t\t\t\t\ttypeResult = (macro:cpp.Float32).toType();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttypeResult = result;\n\t\t\t\t}\n\n\t\t\t\ttypeSignature += \"f\";\n\n\t\t\tcase \"Float\", \"cpp.Float64\", \"lime.utils.DataPointer\":\n\t\t\t\ttypeResult = result;\n\t\t\t\ttypeSignature += \"d\";\n\n\t\t\tcase \"String\":\n\t\t\t\ttypeResult = result;\n\t\t\t\ttypeSignature += \"s\";\n\n\t\t\tcase \"cpp.ConstCharStar\":\n\t\t\t\ttypeResult = result;\n\t\t\t\ttypeSignature += \"c\";\n\n\t\t\tcase \"Void\", \"cpp.Void\":\n\t\t\t\tif (useCPPTypes)\n\t\t\t\t{\n\t\t\t\t\ttypeResult = (macro:cpp.Void).toType();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttypeResult = result;\n\t\t\t\t}\n\n\t\t\t\ttypeSignature += \"v\";\n\n\t\t\tdefault:\n\t\t\t\tif (useCPPTypes)\n\t\t\t\t{\n\t\t\t\t\ttypeResult = (macro:cpp.Object).toType();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttypeResult = (macro:Dynamic).toType();\n\t\t\t\t}\n\n\t\t\t\ttypeSignature += \"o\";\n\t\t}\n\n\t\tvar typeString = \"\";\n\n\t\tif (typeArgs.length == 0)\n\t\t{\n\t\t\ttypeString = \"Void->\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (arg in typeArgs)\n\t\t\t{\n\t\t\t\ttypeString += arg.t.toString() + \"->\";\n\t\t\t}\n\t\t}\n\n\t\ttypeString += typeResult.toString();\n\n\t\treturn {\n\t\t\targs: typeArgs,\n\t\t\tresult: typeResult,\n\t\t\tstring: typeString,\n\t\t\tsignature: typeSignature\n\t\t};\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/macros/DefineMacro.hx",
    "content": "package lime._internal.macros;\n\n#if macro\nimport haxe.macro.Compiler;\nimport haxe.macro.Context;\n\nclass DefineMacro\n{\n\tpublic static function run():Void\n\t{\n\t\tif (!Context.defined(\"tools\"))\n\t\t{\n\t\t\tif (Context.defined(\"flash\"))\n\t\t\t{\n\t\t\t\tif (Context.defined(\"air\"))\n\t\t\t\t{\n\t\t\t\t\tvar childPath = Context.resolvePath(\"lime/_internal\");\n\n\t\t\t\t\tvar parts = StringTools.replace(childPath, \"\\\\\", \"/\").split(\"/\");\n\t\t\t\t\tparts.pop(); // lime\n\t\t\t\t\tparts.pop(); // src\n\t\t\t\t\tparts.pop(); // root directory\n\n\t\t\t\t\tvar externPath = parts.join(\"/\") + \"/externs/air\";\n\n\t\t\t\t\tCompiler.addClassPath(externPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Context.defined(\"js\"))\n\t\t\t{\n\t\t\t\tif (!Context.defined(\"nodejs\"))\n\t\t\t\t{\n\t\t\t\t\tCompiler.define(\"html5\");\n\t\t\t\t\tCompiler.define(\"web\");\n\t\t\t\t\tCompiler.define(\"lime-canvas\");\n\t\t\t\t\tCompiler.define(\"lime-dom\");\n\t\t\t\t\tCompiler.define(\"lime-howlerjs\");\n\t\t\t\t\tCompiler.define(\"lime-webgl\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCompiler.define(\"native\");\n\n\t\t\t\tvar cffi = (!Context.defined(\"nocffi\") && !Context.defined(\"eval\"));\n\n\t\t\t\tif (Context.defined(\"ios\") || Context.defined(\"android\") || Context.defined(\"tizen\"))\n\t\t\t\t{\n\t\t\t\t\tCompiler.define(\"mobile\");\n\t\t\t\t\tif (cffi) Compiler.define(\"lime-opengles\");\n\t\t\t\t}\n\t\t\t\telse if (Context.defined(\"webassembly\") || Context.defined(\"wasm\") || Context.defined(\"emscripten\"))\n\t\t\t\t{\n\t\t\t\t\tCompiler.define(\"webassembly\");\n\t\t\t\t\tCompiler.define(\"wasm\");\n\t\t\t\t\tCompiler.define(\"emscripten\");\n\t\t\t\t\tCompiler.define(\"web\");\n\t\t\t\t\tif (cffi) Compiler.define(\"lime-opengles\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCompiler.define(\"desktop\");\n\t\t\t\t\tif (cffi) Compiler.define(\"lime-opengl\");\n\t\t\t\t}\n\n\t\t\t\tif (cffi)\n\t\t\t\t{\n\t\t\t\t\tCompiler.define(\"lime-cffi\");\n\n\t\t\t\t\tCompiler.define(\"lime-openal\");\n\t\t\t\t\tCompiler.define(\"lime-cairo\");\n\t\t\t\t\tCompiler.define(\"lime-curl\");\n\t\t\t\t\tCompiler.define(\"lime-harfbuzz\");\n\t\t\t\t\tCompiler.define(\"lime-vorbis\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCompiler.define(\"disable-cffi\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/macros/EventMacro.hx",
    "content": "package lime._internal.macros;\n\n#if macro\nimport haxe.macro.Context;\nimport haxe.macro.Expr;\nimport haxe.macro.Type;\n\nusing haxe.macro.Tools;\n\nclass EventMacro\n{\n\tpublic static function build()\n\t{\n\t\tvar typeArgs;\n\t\tvar typeResult;\n\n\t\tswitch (Context.follow(Context.getLocalType()))\n\t\t{\n\t\t\tcase TInst(_, [Context.follow(_) => TFun(args, result)]):\n\t\t\t\ttypeArgs = args;\n\t\t\t\ttypeResult = result;\n\n\t\t\tcase TInst(localType, _):\n\t\t\t\tContext.fatalError(\"Invalid number of type parameters for \" + localType.toString(), Context.currentPos());\n\t\t\t\treturn null;\n\n\t\t\tdefault:\n\t\t\t\tthrow false;\n\t\t}\n\n\t\tvar typeParam = TFun(typeArgs, typeResult);\n\t\tvar typeString = \"\";\n\n\t\tif (typeArgs.length == 0)\n\t\t{\n\t\t\ttypeString = \"Void->\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (arg in typeArgs)\n\t\t\t{\n\t\t\t\ttypeString += arg.t.toString() + \"->\";\n\t\t\t}\n\t\t}\n\n\t\ttypeString += typeResult.toString();\n\t\ttypeString = StringTools.replace(typeString, \"->\", \"_\");\n\t\ttypeString = StringTools.replace(typeString, \".\", \"_\");\n\t\ttypeString = StringTools.replace(typeString, \"<\", \"_\");\n\t\ttypeString = StringTools.replace(typeString, \">\", \"_\");\n\n\t\tvar name = \"_Event_\" + typeString;\n\n\t\ttry\n\t\t{\n\t\t\tContext.getType(\"lime.app.\" + name);\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\tvar pos = Context.currentPos();\n\t\t\tvar fields = Context.getBuildFields();\n\n\t\t\tvar args:Array<FunctionArg> = [];\n\t\t\tvar argName, argNames = [];\n\n\t\t\tfor (i in 0...typeArgs.length)\n\t\t\t{\n\t\t\t\tif (i == 0)\n\t\t\t\t{\n\t\t\t\t\targName = \"a\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\targName = \"a\" + i;\n\t\t\t\t}\n\n\t\t\t\targNames.push(Context.parse(argName, pos));\n\t\t\t\targs.push({name: argName, type: typeArgs[i].t.toComplexType()});\n\t\t\t}\n\n\t\t\tvar dispatch = macro\n\t\t\t\t{\n\t\t\t\t\tcanceled = false;\n\n\t\t\t\t\tvar listeners = __listeners;\n\t\t\t\t\tvar repeat = __repeat;\n\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\twhile (i < listeners.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlisteners[i]($a{argNames});\n\n\t\t\t\t\t\tif (!repeat[i])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.remove(cast listeners[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (canceled)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tvar i = 0;\n\t\t\tvar field;\n\n\t\t\twhile (i < fields.length)\n\t\t\t{\n\t\t\t\tfield = fields[i];\n\n\t\t\t\tif (field.name == \"__listeners\" || field.name == \"dispatch\")\n\t\t\t\t{\n\t\t\t\t\tfields.remove(field);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfields.push(\n\t\t\t\t{\n\t\t\t\t\tname: \"__listeners\",\n\t\t\t\t\taccess: [APublic],\n\t\t\t\t\tkind: FVar(TPath({pack: [], name: \"Array\", params: [TPType(typeParam.toComplexType())]})),\n\t\t\t\t\tpos: pos\n\t\t\t\t});\n\t\t\tfields.push(\n\t\t\t\t{\n\t\t\t\t\tname: \"dispatch\",\n\t\t\t\t\taccess: [APublic],\n\t\t\t\t\tkind: FFun(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\targs: args,\n\t\t\t\t\t\t\texpr: dispatch,\n\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t\tret: macro:Void\n\t\t\t\t\t\t}),\n\t\t\t\t\tpos: pos\n\t\t\t\t});\n\n\t\t\tvar meta:Array<MetadataEntry> = [\n\t\t\t\t{name: \":dox\", params: [macro hide], pos: pos},\n\t\t\t\t{name: \":noCompletion\", pos: pos}\n\t\t\t];\n\n\t\t\t#if !lime_debug\n\t\t\tmeta.push({name: \":fileXml\", params: [macro 'tags=\"haxe,release\"'], pos: pos});\n\t\t\tmeta.push({name: \":noDebug\", pos: pos});\n\t\t\t#end\n\n\t\t\tContext.defineType(\n\t\t\t\t{\n\t\t\t\t\tpos: pos,\n\t\t\t\t\tpack: [\"lime\", \"app\"],\n\t\t\t\t\tname: name,\n\t\t\t\t\tkind: TDClass(),\n\t\t\t\t\tfields: fields,\n\t\t\t\t\tparams: [\n\t\t\t\t\t\t{name: \"T\"}],\n\t\t\t\t\tmeta: meta\n\t\t\t\t});\n\t\t}\n\n\t\treturn TPath({pack: [\"lime\", \"app\"], name: name, params: [TPType(typeParam.toComplexType())]}).toType();\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/macros/HTTPRequestMacro.hx",
    "content": "package lime._internal.macros;\n\n#if macro\nimport haxe.macro.Context;\nimport haxe.macro.Expr;\nimport haxe.macro.Type;\n\nusing haxe.macro.Tools;\n\nclass HTTPRequestMacro\n{\n\tprivate static function build()\n\t{\n\t\tvar paramType;\n\t\tvar type:BaseType, typeArgs;\n\t\tvar stringAbstract = false;\n\t\tvar bytesAbstract = false;\n\n\t\tswitch (Context.follow(Context.getLocalType()))\n\t\t{\n\t\t\tcase TInst(localType, [t]):\n\t\t\t\tparamType = t;\n\n\t\t\t\tswitch (t)\n\t\t\t\t{\n\t\t\t\t\tcase TInst(t, args):\n\t\t\t\t\t\ttype = t.get();\n\t\t\t\t\t\ttypeArgs = args;\n\n\t\t\t\t\tcase TAbstract(t, args):\n\t\t\t\t\t\ttype = t.get();\n\t\t\t\t\t\ttypeArgs = args;\n\n\t\t\t\t\t\tstringAbstract = isStringAbstract(t.get());\n\t\t\t\t\t\tif (!stringAbstract) bytesAbstract = isBytesAbstract(t.get());\n\n\t\t\t\t\tcase TType(t, args):\n\t\t\t\t\t\ttype = t.get();\n\t\t\t\t\t\ttypeArgs = args;\n\n\t\t\t\t\tcase TMono(_):\n\t\t\t\t\t\tContext.fatalError(\"Invalid number of type parameters for \" + localType.toString(), Context.currentPos());\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\tcase TDynamic(_):\n\t\t\t\t\t\tswitch (Context.getType(\"haxe.io.Bytes\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase TInst(t, args):\n\t\t\t\t\t\t\t\ttype = t.get();\n\t\t\t\t\t\t\t\ttypeArgs = args;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow false;\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tthrow false;\n\t\t}\n\n\t\tvar typeString = type.module;\n\n\t\tif (type.name != type.module && !StringTools.endsWith(type.module, \".\" + type.name))\n\t\t{\n\t\t\ttypeString += \".\" + type.name;\n\t\t}\n\n\t\tif (typeString == \"String\" || stringAbstract)\n\t\t{\n\t\t\treturn TPath(\n\t\t\t\t{\n\t\t\t\t\tpack: [\"lime\", \"net\"],\n\t\t\t\t\tname: \"HTTPRequest\",\n\t\t\t\t\tsub: \"_HTTPRequest_String\",\n\t\t\t\t\tparams: [TPType(paramType.toComplexType())]\n\t\t\t\t}).toType();\n\t\t}\n\t\telse if (typeString == \"haxe.io.Bytes\" || bytesAbstract)\n\t\t{\n\t\t\treturn TPath(\n\t\t\t\t{\n\t\t\t\t\tpack: [\"lime\", \"net\"],\n\t\t\t\t\tname: \"HTTPRequest\",\n\t\t\t\t\tsub: \"_HTTPRequest_Bytes\",\n\t\t\t\t\tparams: [TPType(paramType.toComplexType())]\n\t\t\t\t}).toType();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar typeParamString = typeString;\n\n\t\t\tif (typeArgs.length > 0)\n\t\t\t{\n\t\t\t\ttypeParamString += \"<\";\n\n\t\t\t\tfor (i in 0...typeArgs.length)\n\t\t\t\t{\n\t\t\t\t\tif (i > 0) typeParamString += \",\";\n\t\t\t\t\ttypeParamString += typeArgs[i].toString();\n\t\t\t\t}\n\n\t\t\t\ttypeParamString += \">\";\n\t\t\t}\n\n\t\t\tvar flattenedTypeString = typeParamString;\n\n\t\t\tflattenedTypeString = StringTools.replace(flattenedTypeString, \"->\", \"_\");\n\t\t\tflattenedTypeString = StringTools.replace(flattenedTypeString, \".\", \"_\");\n\t\t\tflattenedTypeString = StringTools.replace(flattenedTypeString, \"<\", \"_\");\n\t\t\tflattenedTypeString = StringTools.replace(flattenedTypeString, \">\", \"_\");\n\n\t\t\tvar name = \"_HTTPRequest_\" + flattenedTypeString;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tContext.getType(\"lime.net.\" + name);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tvar pos = Context.currentPos();\n\n\t\t\t\tvar fields = [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"new\",\n\t\t\t\t\t\taccess: [APublic],\n\t\t\t\t\t\tkind: FFun(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\targs: [\n\t\t\t\t\t\t\t\t\t{name: \"uri\", type: macro:String, opt: true}],\n\t\t\t\t\t\t\t\texpr: macro\n\t\t\t\t\t\t\t\t{super(uri);},\n\t\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t\t\tret: macro:Void\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tpos: Context.currentPos()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"fromBytes\",\n\t\t\t\t\t\taccess: [APrivate, AOverride],\n\t\t\t\t\t\tkind: FFun(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\targs: [\n\t\t\t\t\t\t\t\t\t{name: \"bytes\", type: macro:haxe.io.Bytes}],\n\t\t\t\t\t\t\t\texpr: Context.parse(\"return \" + typeString + \".fromBytes (bytes)\", pos),\n\t\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t\t\tret: paramType.toComplexType()\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tpos: pos\n\t\t\t\t\t}\n\t\t\t\t];\n\n\t\t\t\tvar meta:Array<MetadataEntry> = [];\n\n\t\t\t\t#if !lime_debug\n\t\t\t\tmeta.push({name: \":fileXml\", params: [macro 'tags=\"haxe,release\"'], pos: pos});\n\t\t\t\tmeta.push({name: \":noDebug\", pos: pos});\n\t\t\t\t#end\n\n\t\t\t\tContext.defineType(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\tpack: [\"lime\", \"net\"],\n\t\t\t\t\t\tkind: TDClass(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpack: [\"lime\", \"net\"],\n\t\t\t\t\t\t\t\tname: \"HTTPRequest\",\n\t\t\t\t\t\t\t\tsub: \"_HTTPRequest_Bytes\",\n\t\t\t\t\t\t\t\tparams: [TPType(paramType.toComplexType())]\n\t\t\t\t\t\t\t}, null, false),\n\t\t\t\t\t\tfields: fields,\n\t\t\t\t\t\tpos: pos,\n\t\t\t\t\t\tmeta: meta\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn TPath({pack: [\"lime\", \"net\"], name: name, params: []}).toType();\n\t\t}\n\t}\n\n\tprivate static function isBytesAbstract(type:AbstractType):Bool\n\t{\n\t\twhile (type != null)\n\t\t{\n\t\t\tswitch (type.type)\n\t\t\t{\n\t\t\t\tcase TInst(t, _):\n\t\t\t\t\treturn t.get().module == \"haxe.io.Bytes\";\n\n\t\t\t\tcase TAbstract(t, _):\n\t\t\t\t\ttype = t.get();\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate static function isStringAbstract(type:AbstractType):Bool\n\t{\n\t\twhile (type != null)\n\t\t{\n\t\t\tswitch (type.type)\n\t\t\t{\n\t\t\t\tcase TInst(t, _):\n\t\t\t\t\treturn t.get().module == \"String\";\n\n\t\t\t\tcase TAbstract(t, _):\n\t\t\t\t\ttype = t.get();\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/unifill/CodePoint.hx",
    "content": "package lime._internal.unifill;\n\nabstract CodePoint(Int)\n{\n\t@:from\n\tpublic static inline function fromInt(code:Int):CodePoint\n\t{\n\t\tif (!Unicode.isScalar(code))\n\t\t{\n\t\t\tthrow new Exception.InvalidCodePoint(code);\n\t\t}\n\t\treturn new CodePoint(code);\n\t}\n\n\t@:op(A + B)\n\tpublic static inline function cons(a:CodePoint, b:String):String\n\t\treturn a.toString() + b;\n\n\t@:op(A + B)\n\tpublic static inline function snoc(a:String, b:CodePoint):String\n\t\treturn a + b.toString();\n\n\t@:op(A + B)\n\tpublic static inline function addInt(a:CodePoint, b:Int):CodePoint\n\t\treturn CodePoint.fromInt(a.toInt() + b);\n\n\t@:op(A - B)\n\tpublic static inline function sub(a:CodePoint, b:CodePoint):Int\n\t\treturn (a.toInt()) - (b.toInt());\n\n\t@:op(A - B)\n\tpublic static inline function subInt(a:CodePoint, b:Int):CodePoint\n\t\treturn CodePoint.fromInt(a.toInt() - b);\n\n\t@:op(A == B) public static function eq(a:CodePoint, b:CodePoint):Bool;\n\n\t@:op(A != B) public static function ne(a:CodePoint, b:CodePoint):Bool;\n\n\t@:op(A < B) public static function lt(a:CodePoint, b:CodePoint):Bool;\n\n\t@:op(A <= B) public static function lte(a:CodePoint, b:CodePoint):Bool;\n\n\t@:op(A > B) public static function gt(a:CodePoint, b:CodePoint):Bool;\n\n\t@:op(A >= B) public static function gte(a:CodePoint, b:CodePoint):Bool;\n\n\tinline function new(code:Int):Void\n\t{\n\t\tthis = code;\n\t}\n\n\t@:to\n\tpublic inline function toString():String\n\t\treturn InternalEncoding.fromCodePoint(this);\n\n\t@:to\n\tpublic inline function toInt():Int\n\t\treturn this;\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/CodePointIter.hx",
    "content": "package lime._internal.unifill;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass CodePointIter\n{\n\tvar string:String;\n\tvar index:Int;\n\tvar endIndex:Int;\n\n\tpublic inline function new(s:String)\n\t{\n\t\tstring = s;\n\t\tindex = 0;\n\t\tendIndex = s.length;\n\t}\n\n\tpublic inline function hasNext():Bool\n\t{\n\t\treturn index < endIndex;\n\t}\n\n\tvar i = 0; // FIXME: blocked by HaxeFoundation/haxe#4353\n\n\tpublic inline function next():CodePoint\n\t{\n\t\ti = index;\n\t\tindex += InternalEncoding.codePointWidthAt(string, index);\n\t\treturn cast InternalEncoding.codePointAt(string, i);\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/Exception.hx",
    "content": "package lime._internal.unifill;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Exception\n{\n\tfunction new() {}\n\n\tpublic function toString():String\n\t{\n\t\tthrow null;\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass InvalidCodePoint extends Exception\n{\n\tpublic var code(default, null):Int;\n\n\tpublic function new(code:Int)\n\t{\n\t\tsuper();\n\t\tthis.code = code;\n\t}\n\n\toverride public function toString():String\n\t{\n\t\treturn 'InvalidCodePoint(code: $code)';\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass InvalidCodeUnitSequence extends Exception\n{\n\tpublic var index(default, null):Int;\n\n\tpublic function new(index:Int)\n\t{\n\t\tsuper();\n\t\tthis.index = index;\n\t}\n\n\toverride public function toString():String\n\t{\n\t\treturn 'InvalidCodeUnitSequence(index: $index)';\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/InternalEncoding.hx",
    "content": "package lime._internal.unifill;\n\n#if (neko || php || cpp || lua || macro)\nprivate typedef UtfX = Utf8;\n#elseif python\nprivate typedef UtfX = Utf32;\n#else\nprivate typedef UtfX = Utf16;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n\n/**\n\tInternalEncoding provides primitive API to deal with strings across\n\tall platforms. You should consider adopting Unifill before this.\n**/\nclass InternalEncoding\n{\n\t/**\n\t\tReturns Encoding strings on the platform are encoded in.\n\t**/\n\tpublic static var internalEncoding(get, never):String;\n\n\tstatic inline function get_internalEncoding():String #if (neko || php || cpp || lua || macro) return \"UTF-8\"; #elseif python return \"UTF-32\"; #else return\n\t\t\"UTF-16\"; #end\n\n\t/**\n\t\tReturns the UTF-8/16/32 code unit at position `index` of\n\t\tString `s`.\n\t**/\n\tpublic static inline function codeUnitAt(s:String, index:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).codeUnitAt(index);\n\t}\n\n\t/**\n\t\tReturns the Unicode code point at position `index` of\n\t\tString `s`.\n\t**/\n\tpublic static inline function codePointAt(s:String, index:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).codePointAt(index);\n\t}\n\n\t/**\n\t\tReturns the character as a String at position `index` of\n\t\tString `s`.\n\t**/\n\tpublic static inline function charAt(s:String, index:Int):String\n\t{\n\t\treturn UtfX.fromString(s).charAt(index).toString();\n\t}\n\n\t/**\n\t\tReturns the number of Unicode code points from `beginIndex`\n\t\tto `endIndex` in String `s`.\n\t**/\n\tpublic static inline function codePointCount(s:String, beginIndex:Int, endIndex:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).codePointCount(beginIndex, endIndex);\n\t}\n\n\t/**\n\t\tReturns the number of units of the code point at position\n\t\t`index` of String `s`.\n\t**/\n\tpublic static inline function codePointWidthAt(s:String, index:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).codePointWidthAt(index);\n\t}\n\n\t/**\n\t\tReturns the number of units of the code point before\n\t\tposition `index` of String `s`.\n\t**/\n\tpublic static inline function codePointWidthBefore(s:String, index:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).codePointWidthBefore(index);\n\t}\n\n\t/**\n\t\tReturns the index within String `s` that is offset from\n\t\tposition `index` by `codePointOffset` code points.\n\t**/\n\tpublic static inline function offsetByCodePoints(s:String, index:Int, codePointOffset:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).offsetByCodePoints(index, codePointOffset);\n\t}\n\n\t/**\n\t\tReturns the index within String `s` that is offset from\n\t\tposition `index` by `codePointOffset` code points counting\n\t\tbackward.\n\t**/\n\tpublic static inline function backwardOffsetByCodePoints(s:String, index:Int, codePointOffset:Int):Int\n\t{\n\t\treturn UtfX.fromString(s).offsetByCodePoints(index, -codePointOffset);\n\t}\n\n\t/**\n\t\tConverts the code point `code` to a character as String.\n\t**/\n\tpublic static inline function fromCodePoint(codePoint:Int):String\n\t{\n\t\treturn UtfX.fromCodePoint(codePoint).toString();\n\t}\n\n\t/**\n\t\tConverts `codePoints` to a String.\n\t**/\n\tpublic static inline function fromCodePoints(codePoints:Iterable<Int>):String\n\t{\n\t\treturn UtfX.fromCodePoints(codePoints).toString();\n\t}\n\n\t/**\n\t\tValidates String `s`.\n\n\t\tIf the code unit sequence of `s` is invalid,\n\t\t`Exception.InvalidCodeUnitSequence` is throwed.\n\t**/\n\tpublic static inline function validate(s:String):Void\n\t{\n\t\tUtfX.fromString(s).validate();\n\t}\n\n\t/**\n\t\tReturns if String `s` is valid.\n\t**/\n\tpublic static function isValidString(s:String):Bool\n\t{\n\t\ttry\n\t\t{\n\t\t\tvalidate(s);\n\t\t\treturn true;\n\t\t}\n\t\tcatch (e:Exception.InvalidCodeUnitSequence)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic static inline function encodeWith(f:Int->Void, c:Int):Void\n\t{\n\t\tUtfX.encodeWith(f, c);\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/InternalEncodingBackwardIter.hx",
    "content": "package lime._internal.unifill;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass InternalEncodingBackwardIter\n{\n\tpublic var string:String;\n\tpublic var beginIndex:Int;\n\tpublic var index:Int;\n\n\tpublic inline function new(s:String, beginIndex:Int, endIndex:Int)\n\t{\n\t\tstring = s;\n\t\tthis.beginIndex = beginIndex;\n\t\tthis.index = endIndex;\n\t}\n\n\tpublic inline function hasNext():Bool\n\t{\n\t\treturn beginIndex < index;\n\t}\n\n\tpublic inline function next():Int\n\t{\n\t\tindex -= InternalEncoding.codePointWidthBefore(string, index);\n\t\treturn index;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/InternalEncodingIter.hx",
    "content": "package lime._internal.unifill;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass InternalEncodingIter\n{\n\tpublic var string:String;\n\tpublic var index:Int;\n\tpublic var endIndex:Int;\n\n\tpublic inline function new(s:String, beginIndex:Int, endIndex:Int)\n\t{\n\t\tstring = s;\n\t\tthis.index = beginIndex;\n\t\tthis.endIndex = endIndex;\n\t}\n\n\tpublic inline function hasNext():Bool\n\t{\n\t\treturn index < endIndex;\n\t}\n\n\tvar i = 0; // FIXME: blocked by HaxeFoundation/haxe#4353\n\n\tpublic inline function next():Int\n\t{\n\t\ti = index;\n\t\tindex += InternalEncoding.codePointWidthAt(string, index);\n\t\treturn i;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/Unicode.hx",
    "content": "package lime._internal.unifill;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Unicode\n{\n\tpublic static inline var minCodePoint:Int = 0x0000;\n\tpublic static inline var maxCodePoint:Int = 0x10FFFF;\n\tpublic static inline var minHighSurrogate:Int = 0xD800;\n\tpublic static inline var maxHighSurrogate:Int = 0xDBFF;\n\tpublic static inline var minLowSurrogate:Int = 0xDC00;\n\tpublic static inline var maxLowSurrogate:Int = 0xDFFF;\n\n\tpublic static inline function decodeSurrogate(hi:Int, lo:Int):Int\n\t\treturn (hi - 0xD7C0 << 10) | (lo & 0x3FF);\n\n\tpublic static inline function encodeHighSurrogate(c:Int):Int\n\t\treturn (c >> 10) + 0xD7C0;\n\n\tpublic static inline function encodeLowSurrogate(c:Int):Int\n\t\treturn (c & 0x3FF) | 0xDC00;\n\n\tpublic static inline function isScalar(code:Int):Bool\n\t{\n\t\treturn minCodePoint <= code && code <= maxCodePoint && !isHighSurrogate(code) && !isLowSurrogate(code);\n\t}\n\n\tpublic static inline function isHighSurrogate(code:Int):Bool\n\t{\n\t\treturn minHighSurrogate <= code && code <= maxHighSurrogate;\n\t}\n\n\tpublic static inline function isLowSurrogate(code:Int):Bool\n\t{\n\t\treturn minLowSurrogate <= code && code <= maxLowSurrogate;\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/Unifill.hx",
    "content": "package lime._internal.unifill;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n\n/**\n\tUnifill provides Unicode-code-point-wise methods on Strings. It is\n\tideally used with 'using Unifill' and then acts as an extension to\n\tthe String class.\n**/\nclass Unifill\n{\n\t/**\n\t\tReturns the number of Unicode code points of String `s`.\n\t**/\n\tpublic static inline function uLength(s:String):Int\n\t\treturn InternalEncoding.codePointCount(s, 0, s.length);\n\n\t/**\n\t\tReturns the character at position `index` by code points of String `s`.\n\t**/\n\tpublic static inline function uCharAt(s:String, index:Int):String\n\t{\n\t\t#if (neko || php || cpp)\n\t\treturn InternalEncoding.fromCodePoint(haxe.Utf8.charCodeAt(s, index));\n\t\t#else\n\t\tvar i = InternalEncoding.offsetByCodePoints(s, 0, index);\n\t\treturn InternalEncoding.charAt(s, i);\n\t\t#end\n\t}\n\n\t/**\n\t\tReturns the code point as Int at position `index` by code points of String `s`.\n\t**/\n\tpublic static inline function uCharCodeAt(s:String, index:Int):Int\n\t{\n\t\t#if (neko || php || cpp || lua || macro)\n\t\treturn cast haxe.Utf8.charCodeAt(s, index);\n\t\t#else\n\t\tvar i = InternalEncoding.offsetByCodePoints(s, 0, index);\n\t\treturn InternalEncoding.codePointAt(s, i);\n\t\t#end\n\t}\n\n\t/**\n\t\tReturns the code point at position `index` by code points of String `s`.\n\t**/\n\tpublic static inline function uCodePointAt(s:String, index:Int):CodePoint\n\t{\n\t\treturn cast uCharCodeAt(s, index);\n\t}\n\n\t/**\n\t\tReturns the position of the leftmost occurence of the str within String `s`.\n\n\t\t`startIndex` is counted by code points.\n\t**/\n\tpublic static inline function uIndexOf(s:String, value:String, startIndex:Int = 0):Int\n\t{\n\t\tvar index = s.indexOf(value, InternalEncoding.offsetByCodePoints(s, 0, startIndex));\n\t\treturn if (index >= 0) InternalEncoding.codePointCount(s, 0, index) else -1;\n\t}\n\n\t/**\n\t\tReturns the position of the rightmost occurence of the str within String `s`.\n\n\t\t`startIndex` is counted by code points.\n\t**/\n\tpublic static inline function uLastIndexOf(s:String, value:String, ?startIndex):Int\n\t{\n\t\tif (startIndex == null) startIndex = s.length - 1;\n\t\tvar index = s.lastIndexOf(value, InternalEncoding.offsetByCodePoints(s, 0, startIndex));\n\t\treturn if (index >= 0) InternalEncoding.codePointCount(s, 0, index) else -1;\n\t}\n\n\t/**\n\t\tSplits String `s` at each occurence of `delimiter`.\n\t**/\n\tpublic static inline function uSplit(s:String, delimiter:String):Array<String>\n\t{\n\t\treturn if (delimiter.length == 0)\n\t\t{\n\t\t\t[\n\t\t\t\tfor (i in new InternalEncodingIter(s, 0, s.length))\n\t\t\t\t\tInternalEncoding.charAt(s, i)\n\t\t\t];\n\t\t}\n\t\telse\n\t\t{\n\t\t\ts.split(delimiter);\n\t\t}\n\t}\n\n\t/**\n\t\tReturns `length` characters of String `s`, starting at position `startIndex`.\n\n\t\t`startIndex` and `length` are counted by code points.\n\t**/\n\tpublic static inline function uSubstr(s:String, startIndex:Int, ?length:Int):String\n\t{\n\t\tvar si = InternalEncoding.offsetByCodePoints(s, if (startIndex >= 0) 0 else s.length, startIndex);\n\t\tvar ei = if (length == null) s.length else if (length < 0) si else InternalEncoding.offsetByCodePoints(s, si, length);\n\t\treturn s.substring(si, ei);\n\t}\n\n\t/**\n\t\tReturns the part of String `s` from `startIndex` to `endIndex`.\n\n\t\t`startIndex` and `endIndex` are counted by code points.\n\t**/\n\tpublic static inline function uSubstring(s:String, startIndex:Int, ?endIndex:Int):String\n\t{\n\t\tvar si = if (startIndex < 0) 0 else InternalEncoding.offsetByCodePoints(s, 0, startIndex);\n\t\tvar ei = if (endIndex == null) s.length else if (endIndex < 0) 0 else InternalEncoding.offsetByCodePoints(s, 0, endIndex);\n\t\treturn s.substring(si, ei);\n\t}\n\n\t/**\n\t\tReturns an iterator of the code points of String `s`.\n\t**/\n\tpublic static inline function uIterator(s:String):CodePointIter\n\t{\n\t\treturn new CodePointIter(s);\n\t}\n\n\t/**\n\t\tCompares String `a` and `b`.\n\t**/\n\tpublic static function uCompare(a:String, b:String):Int\n\t{\n\t\tvar aiter = new InternalEncodingIter(a, 0, a.length);\n\t\tvar biter = new InternalEncodingIter(b, 0, b.length);\n\t\twhile (aiter.hasNext() && biter.hasNext())\n\t\t{\n\t\t\tvar acode = InternalEncoding.codePointAt(a, aiter.next());\n\t\t\tvar bcode = InternalEncoding.codePointAt(b, biter.next());\n\t\t\tif (acode < bcode) return -1;\n\t\t\tif (acode > bcode) return 1;\n\t\t}\n\t\tif (biter.hasNext()) return -1;\n\t\tif (aiter.hasNext()) return 1;\n\t\treturn 0;\n\t}\n\n\t/**\n\t\tConverts `codePoints` to string.\n\t**/\n\tpublic static inline function uToString(codePoints:Iterable<CodePoint>):String\n\t\treturn InternalEncoding.fromCodePoints(cast codePoints);\n\n\t/**\n\t\tAppends the character `c` to StringBuf `sb`.\n\t**/\n\tpublic static inline function uAddChar(sb:StringBuf, c:CodePoint):Void\n\t{\n\t\t#if (neko || php || cpp || lua || macro)\n\t\tUtf8.encodeWith(function(c) sb.addChar(c), c.toInt());\n\t\t#elseif python\n\t\t// Utf32.encodeWith(function(c) sb.addChar(c), c.toInt());\n\t\tsb.addChar(c);\n\t\t#else\n\t\tUtf16.encodeWith(function(c) sb.addChar(c), c.toInt());\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/_internal/unifill/Utf16.hx",
    "content": "package lime._internal.unifill;\n\nabstract Utf16(StringU16)\n{\n\t/**\n\t\tConverts the code point `code` to a character as a Utf16 string.\n\t**/\n\tpublic static inline function fromCodePoint(codePoint:Int):Utf16\n\t{\n\t\tif (codePoint <= 0xFFFF)\n\t\t{\n\t\t\treturn new Utf16(StringU16.fromCodeUnit(codePoint));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn new Utf16(StringU16.fromTwoCodeUnits(Unicode.encodeHighSurrogate(codePoint), Unicode.encodeLowSurrogate(codePoint)));\n\t\t}\n\t}\n\n\t/**\n\t\tConverts `codePoints` to a Utf16 string.\n\t**/\n\tpublic static inline function fromCodePoints(codePoints:Iterable<Int>):Utf16\n\t{\n\t\tvar buf = new StringU16Buffer();\n\t\tfor (c in codePoints)\n\t\t{\n\t\t\tUtf16Impl.encode_code_point(function(x) buf.addUnit(x), c);\n\t\t}\n\t\treturn new Utf16(buf.getStringU16());\n\t}\n\n\tpublic static inline function fromString(s:String):Utf16\n\t{\n\t\treturn new Utf16(StringU16.fromString(s));\n\t}\n\n\tpublic static inline function fromArray(a:Array<Int>):Utf16\n\t{\n\t\treturn new Utf16(StringU16.fromArray(a));\n\t}\n\n\tpublic static inline function encodeWith(f:Int->Void, c:Int):Void\n\t{\n\t\tUtf16Impl.encode_code_point(f, c);\n\t}\n\n\tpublic var length(get, never):Int;\n\n\t/**\n\t\tReturns the UTF-16 code unit at position `index` of `this`.\n\t**/\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn this.codeUnitAt(index);\n\t}\n\n\t/**\n\t\tReturns the Unicode code point at position `index` of\n\t\t`this`.\n\t**/\n\tpublic function codePointAt(index:Int):Int\n\t{\n\t\treturn Utf16Impl.decode_code_point(length, function(i) return codeUnitAt(i), index);\n\t}\n\n\t/**\n\t\tReturns the character as a String at position `index` of\n\t\t`this`.\n\t**/\n\tpublic inline function charAt(index:Int):Utf16\n\t{\n\t\treturn new Utf16(this.substr(index, codePointWidthAt(index)));\n\t}\n\n\t/**\n\t\tReturns the number of Unicode code points from `beginIndex`\n\t\tto `endIndex` in `this`.\n\t**/\n\tpublic function codePointCount(beginIndex:Int, endIndex:Int):Int\n\t{\n\t\tvar index = beginIndex;\n\t\tvar i = 0;\n\t\twhile (index < endIndex)\n\t\t{\n\t\t\tindex += codePointWidthAt(index);\n\t\t\t++i;\n\t\t}\n\t\treturn i;\n\t}\n\n\t/**\n\t\tReturns the number of units of the code point at position\n\t\t`index` of `this`.\n\t**/\n\tpublic inline function codePointWidthAt(index:Int):Int\n\t{\n\t\tvar c = codeUnitAt(index);\n\t\treturn Utf16Impl.code_point_width(c);\n\t}\n\n\t/**\n\t\tReturns the number of units of the code point before\n\t\tposition `index` of `this`.\n\t**/\n\tpublic inline function codePointWidthBefore(index:Int):Int\n\t{\n\t\treturn Utf16Impl.find_prev_code_point(function(i) return codeUnitAt(i), index);\n\t}\n\n\t/**\n\t\tReturns the index within `this` that is offset from\n\t\tposition `index` by `codePointOffset` code points.\n\t**/\n\tpublic inline function offsetByCodePoints(index:Int, codePointOffset:Int):Int\n\t{\n\t\treturn if (codePointOffset >= 0)\n\t\t{\n\t\t\tforward_offset_by_code_points(index, codePointOffset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbackward_offset_by_code_points(index, -codePointOffset);\n\t\t}\n\t}\n\n\t/**\n\t\tReturns `len` code units of `this`, starting at position pos.\n\t**/\n\tpublic inline function substr(index:Int, ?len:Int):Utf16\n\t{\n\t\treturn new Utf16(this.substr(index, len));\n\t}\n\n\t/**\n\t\tValidates `this` Utf16 string.\n\n\t\tIf the code unit sequence of `this` is invalid,\n\t\t`Exception.InvalidCodeUnitSequence` is throwed.\n\t**/\n\tpublic function validate():Void\n\t{\n\t\tvar len = this.length;\n\t\tvar accessor = function(i) return codeUnitAt(i);\n\t\tvar i = 0;\n\t\twhile (i < len)\n\t\t{\n\t\t\tUtf16Impl.decode_code_point(len, accessor, i);\n\t\t\ti += codePointWidthAt(i);\n\t\t}\n\t}\n\n\tpublic inline function toString():String\n\t{\n\t\treturn this.toString();\n\t}\n\n\tpublic inline function toArray():Array<Int>\n\t{\n\t\treturn this.toArray();\n\t}\n\n\tinline function new(s:StringU16)\n\t{\n\t\tthis = s;\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n\n\tinline function forward_offset_by_code_points(index:Int, codePointOffset:Int):Int\n\t{\n\t\tvar len = this.length;\n\t\tvar i = 0;\n\t\twhile (i < codePointOffset && index < len)\n\t\t{\n\t\t\tindex += codePointWidthAt(index);\n\t\t\t++i;\n\t\t}\n\t\treturn index;\n\t}\n\n\tinline function backward_offset_by_code_points(index:Int, codePointOffset:Int):Int\n\t{\n\t\tvar count = 0;\n\t\twhile (count < codePointOffset && 0 < index)\n\t\t{\n\t\t\tindex -= codePointWidthBefore(index);\n\t\t\t++count;\n\t\t}\n\t\treturn index;\n\t}\n}\n\nprivate class Utf16Impl\n{\n\tpublic static inline function code_point_width(c:Int):Int\n\t{\n\t\treturn (!Unicode.isHighSurrogate(c)) ? 1 : 2;\n\t}\n\n\tpublic static inline function find_prev_code_point(accessor:Int->Int, index:Int):Int\n\t{\n\t\tvar c = accessor(index - 1);\n\t\treturn (!Unicode.isLowSurrogate(c)) ? 1 : 2;\n\t}\n\n\tpublic static inline function encode_code_point(addUnit:Int->Void, codePoint:Int):Void\n\t{\n\t\tif (codePoint <= 0xFFFF)\n\t\t{\n\t\t\taddUnit(codePoint);\n\t\t}\n\t\telse\n\t\t{\n\t\t\taddUnit(Unicode.encodeHighSurrogate(codePoint));\n\t\t\taddUnit(Unicode.encodeLowSurrogate(codePoint));\n\t\t}\n\t}\n\n\tpublic static function decode_code_point(len:Int, accessor:Int->Int, index:Int):Int\n\t{\n\t\tif (index < 0 || len <= index) throw new Exception.InvalidCodeUnitSequence(index);\n\t\tvar hi = accessor(index);\n\t\tif (Unicode.isHighSurrogate(hi))\n\t\t{\n\t\t\tif (index + 1 < 0 || len <= index + 1)\n\t\t\t{\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t\t}\n\t\t\tvar lo = accessor(index + 1);\n\t\t\tif (Unicode.isLowSurrogate(lo))\n\t\t\t{\n\t\t\t\treturn Unicode.decodeSurrogate(hi, lo);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t\t}\n\t\t}\n\t\telse if (Unicode.isLowSurrogate(hi))\n\t\t{\n\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn hi;\n\t\t}\n\t}\n}\n\n#if !(neko || php || cpp || lua || macro || python)\nprivate abstract StringU16Buffer(StringBuf)\n{\n\tpublic inline function new()\n\t{\n\t\tthis = new StringBuf();\n\t}\n\n\tpublic inline function addUnit(unit:Int):Void\n\t{\n\t\tthis.addChar(unit);\n\t}\n\n\tpublic inline function getStringU16():StringU16\n\t{\n\t\treturn StringU16.fromString(this.toString());\n\t}\n}\n\nprivate abstract StringU16(String)\n{\n\tpublic static inline function fromString(s:String):StringU16\n\t{\n\t\treturn new StringU16(s);\n\t}\n\n\tpublic static inline function fromCodeUnit(u:Int):StringU16\n\t{\n\t\treturn new StringU16(String.fromCharCode(u));\n\t}\n\n\tpublic static inline function fromTwoCodeUnits(u0:Int, u1:Int):StringU16\n\t{\n\t\treturn new StringU16(String.fromCharCode(u0) + String.fromCharCode(u1));\n\t}\n\n\tpublic static inline function ofArray(a:Array<Int>):StringU16\n\t{\n\t\treturn fromArray(a);\n\t}\n\n\tpublic static inline function fromArray(a:Array<Int>):StringU16\n\t{\n\t\tvar buf = new StringBuf();\n\t\tfor (x in a)\n\t\t{\n\t\t\tbuf.addChar(x);\n\t\t}\n\t\treturn new StringU16(buf.toString());\n\t}\n\n\tpublic var length(get, never):Int;\n\n\tpublic #if !flash inline #end function codeUnitAt(index:Int):Int\n\t{\n\t\treturn StringTools.fastCodeAt(this, index);\n\t}\n\n\tpublic inline function substr(index:Int, ?len:Int):StringU16\n\t{\n\t\treturn new StringU16(this.substr(index, len));\n\t}\n\n\tpublic inline function toString():String\n\t{\n\t\treturn this;\n\t}\n\n\tpublic inline function toArray():Array<Int>\n\t{\n\t\tvar i = 0;\n\t\tvar len = this.length;\n\t\treturn [while (i < len) StringTools.fastCodeAt(this, i++)];\n\t}\n\n\tinline function new(s:String)\n\t{\n\t\tthis = s;\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n}\n#else\nprivate abstract StringU16Buffer(Array<Int>)\n{\n\tpublic inline function new()\n\t{\n\t\tthis = [];\n\t}\n\n\tpublic inline function addUnit(unit:Int):Void\n\t{\n\t\tthis.push(unit);\n\t}\n\n\tpublic inline function getStringU16():StringU16\n\t{\n\t\treturn StringU16.ofArray(this);\n\t}\n}\n\nprivate abstract StringU16(Array<Int>)\n{\n\tpublic static function fromString(s:String):StringU16\n\t{\n\t\tvar buf = new StringU16Buffer();\n\t\tvar addUnit = function(x) buf.addUnit(x);\n\t\tfor (i in new InternalEncodingIter(s, 0, s.length))\n\t\t{\n\t\t\tvar c = InternalEncoding.codePointAt(s, i);\n\t\t\tUtf16Impl.encode_code_point(addUnit, c);\n\t\t}\n\t\treturn buf.getStringU16();\n\t}\n\n\tpublic static inline function fromCodeUnit(u:Int):StringU16\n\t{\n\t\treturn new StringU16([u]);\n\t}\n\n\tpublic static inline function fromTwoCodeUnits(u0:Int, u1:Int):StringU16\n\t{\n\t\treturn new StringU16([u0, u1]);\n\t}\n\n\tpublic static inline function ofArray(a:Array<Int>):StringU16\n\t{\n\t\treturn new StringU16(a);\n\t}\n\n\tpublic static inline function fromArray(a:Array<Int>):StringU16\n\t{\n\t\treturn new StringU16(a.copy());\n\t}\n\n\tpublic var length(get, never):Int;\n\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn this[index];\n\t}\n\n\tpublic inline function substr(index:Int, ?len:Int):StringU16\n\t{\n\t\tif (index < 0)\n\t\t{\n\t\t\tindex += this.length;\n\t\t\tif (index < 0) index = 0;\n\t\t}\n\t\tvar j = (len != null) ? index + len : this.length;\n\t\tvar a = this.slice(index, j);\n\t\treturn new StringU16(a);\n\t}\n\n\tpublic function toString():String\n\t{\n\t\tvar buf = new StringBuf();\n\t\tvar i = 0;\n\t\tvar len = this.length;\n\t\tvar cua = function(i) return this[i];\n\t\twhile (i < len)\n\t\t{\n\t\t\tvar u = Utf16Impl.decode_code_point(len, cua, i);\n\t\t\tbuf.add(InternalEncoding.fromCodePoint(u));\n\t\t\ti += Utf16Impl.code_point_width(codeUnitAt(i));\n\t\t}\n\t\treturn buf.toString();\n\t}\n\n\tpublic inline function toArray():Array<Int>\n\t{\n\t\treturn this.copy();\n\t}\n\n\tinline function new(a:Array<Int>)\n\t{\n\t\tthis = a;\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/unifill/Utf32.hx",
    "content": "package lime._internal.unifill;\n\n#if python\nimport python.Syntax;\nimport python.lib.Builtins;\n\n/**\n\tUtf32 provides a UTF-32-encoded string.\n**/\nabstract Utf32(String)\n{\n\tpublic static inline function fromCodePoint(codePoint:Int):Utf32\n\t{\n\t\treturn new Utf32(String.fromCharCode(codePoint));\n\t}\n\n\tpublic static inline function fromCodePoints(codePoints:Iterable<Int>):Utf32\n\t{\n\t\treturn fromArray([for (c in codePoints) c]);\n\t}\n\n\tpublic static inline function fromString(string:String):Utf32\n\t{\n\t\treturn new Utf32(string);\n\t}\n\n\tpublic static inline function fromArray(a:Array<Int>):Utf32\n\t{\n\t\tvar s:String = Syntax.callField('', \"join\", Syntax.callField(Builtins, \"map\", Builtins.chr, a));\n\t\treturn new Utf32(s);\n\t}\n\n\tpublic static inline function encodeWith(f:Int->Void, c:Int):Void\n\t{\n\t\tf(c);\n\t}\n\n\tpublic var length(get, never):Int;\n\n\tpublic inline function charAt(index:Int):Utf32\n\t{\n\t\treturn new Utf32(this.charAt(index));\n\t}\n\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn this.charCodeAt(index);\n\t}\n\n\tpublic inline function codePointAt(index:Int):Int\n\t{\n\t\treturn this.charCodeAt(index);\n\t}\n\n\tpublic inline function codePointWidthAt(index:Int):Int\n\t{\n\t\treturn 1;\n\t}\n\n\tpublic inline function codePointWidthBefore(index:Int):Int\n\t{\n\t\treturn 1;\n\t}\n\n\tpublic function codePointCount(beginIndex:Int, endIndex:Int):Int\n\t{\n\t\treturn if (endIndex < beginIndex)\n\t\t{\n\t\t\t0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tendIndex - beginIndex;\n\t\t}\n\t}\n\n\tpublic inline function offsetByCodePoints(index:Int, codePointOffset:Int):Int\n\t{\n\t\tvar p = index + codePointOffset;\n\t\treturn if (p < 0)\n\t\t{\n\t\t\t0;\n\t\t}\n\t\telse if (p > this.length)\n\t\t{\n\t\t\tthis.length;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tp;\n\t\t}\n\t}\n\n\tpublic inline function toString():String\n\t{\n\t\treturn this;\n\t}\n\n\tpublic inline function toArray():Array<Int>\n\t{\n\t\treturn [for (i in 0...this.length) this.charCodeAt(i)];\n\t}\n\n\tpublic function validate():Void\n\t{\n\t\tvar i = 0;\n\t\tvar len = this.length;\n\t\tfor (i in 0...len)\n\t\t{\n\t\t\tif (!Unicode.isScalar(this.charCodeAt(i)))\n\t\t\t{\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(i);\n\t\t\t}\n\t\t}\n\t}\n\n\t@:op(A + B)\n\tstatic inline function concat(a:Utf32, b:Utf32):Utf32\n\t{\n\t\treturn new Utf32(a.toString() + b.toString());\n\t}\n\n\t@:op(A == B)\n\tstatic inline function eq(a:Utf32, b:Utf32):Bool\n\t{\n\t\treturn a.toString() == b.toString();\n\t}\n\n\t@:op(A != B)\n\tstatic inline function ne(a:Utf32, b:Utf32):Bool\n\t{\n\t\treturn !eq(a, b);\n\t}\n\n\t@:op(A + B)\n\tstatic inline function cons(a:CodePoint, b:Utf32):Utf32\n\t{\n\t\treturn new Utf32(a.toString() + b.toString());\n\t}\n\n\t@:op(A + B)\n\tstatic inline function snoc(a:Utf32, b:CodePoint):Utf32\n\t{\n\t\treturn new Utf32(a.toString() + b.toString());\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n\n\tinline function new(s:String)\n\t{\n\t\tthis = s;\n\t}\n}\n#else\n\n/**\n\tUtf32 provides a UTF-32-encoded string.\n**/\nabstract Utf32(Array<Int>)\n{\n\tpublic static inline function fromCodePoint(codePoint:Int):Utf32\n\t{\n\t\treturn new Utf32([codePoint]);\n\t}\n\n\tpublic static inline function fromCodePoints(codePoints:Iterable<Int>):Utf32\n\t{\n\t\treturn fromArray([for (c in codePoints) c]);\n\t}\n\n\tpublic static inline function fromString(string:String):Utf32\n\t{\n\t\tvar u = [\n\t\t\tfor (c in new InternalEncodingIter(string, 0, string.length))\n\t\t\t\tInternalEncoding.codePointAt(string, c)\n\t\t];\n\t\treturn new Utf32(u);\n\t}\n\n\tpublic static inline function fromArray(a:Array<Int>):Utf32\n\t{\n\t\treturn new Utf32(a.copy());\n\t}\n\n\tpublic static inline function encodeWith(f:Int->Void, c:Int):Void\n\t{\n\t\tf(c);\n\t}\n\n\tpublic var length(get, never):Int;\n\n\tpublic inline function charAt(index:Int):Utf32\n\t{\n\t\tif (0 <= index && index < this.length)\n\t\t{\n\t\t\treturn new Utf32([this[index]]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn new Utf32([]);\n\t\t}\n\t}\n\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn this[index];\n\t}\n\n\tpublic inline function codePointAt(index:Int):Int\n\t{\n\t\treturn this[index];\n\t}\n\n\tpublic inline function codePointWidthAt(index:Int):Int\n\t{\n\t\treturn 1;\n\t}\n\n\tpublic inline function codePointWidthBefore(index:Int):Int\n\t{\n\t\treturn 1;\n\t}\n\n\tpublic inline function toString():String\n\t{\n\t\treturn InternalEncoding.fromCodePoints(this);\n\t}\n\n\tpublic inline function toArray():Array<Int>\n\t{\n\t\treturn this.copy();\n\t}\n\n\tpublic function validate():Void\n\t{\n\t\tvar i = 0;\n\t\tvar len = this.length;\n\t\twhile (i < len)\n\t\t{\n\t\t\tif (!Unicode.isScalar(this[i++]))\n\t\t\t{\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(i);\n\t\t\t}\n\t\t}\n\t}\n\n\t@:op(A + B)\n\tstatic inline function concat(a:Utf32, b:Utf32):Utf32\n\t{\n\t\tvar s:Array<Int> = a.toArray();\n\t\treturn new Utf32(s.concat(cast b));\n\t}\n\n\tstatic function eq_array(a:Array<Int>, b:Array<Int>):Bool\n\t{\n\t\t// assert(a.length == b.length);\n\t\tfor (i in 0...a.length)\n\t\t{\n\t\t\tif (a[i] != b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t@:op(A == B)\n\tstatic inline function eq(a:Utf32, b:Utf32):Bool\n\t{\n\t\treturn if (a.length != b.length) false; else eq_array(cast a, cast b);\n\t}\n\n\t@:op(A != B)\n\tstatic inline function ne(a:Utf32, b:Utf32):Bool\n\t{\n\t\treturn !eq(a, b);\n\t}\n\n\t@:op(A + B)\n\tstatic inline function cons(a:CodePoint, b:Utf32):Utf32\n\t{\n\t\tvar c:Array<Int> = b.toArray();\n\t\tc.unshift(a.toInt());\n\t\treturn new Utf32(c);\n\t}\n\n\t@:op(A + B)\n\tstatic inline function snoc(a:Utf32, b:CodePoint):Utf32\n\t{\n\t\tvar c:Array<Int> = a.toArray();\n\t\tc.push(b.toInt());\n\t\treturn new Utf32(c);\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n\n\tinline function new(a:Array<Int>)\n\t{\n\t\tthis = a;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/_internal/unifill/Utf8.hx",
    "content": "package lime._internal.unifill;\n\nimport haxe.io.Bytes;\nimport haxe.io.BytesBuffer;\n\nabstract Utf8(StringU8)\n{\n\t/**\n\t\tConverts the code point `code` to a character as a Utf8 string.\n\t**/\n\tpublic static inline function fromCodePoint(codePoint:Int):Utf8\n\t{\n\t\tvar buf = new BytesBuffer();\n\t\tUtf8Impl.encode_code_point(function(c) buf.addByte(c), codePoint);\n\t\treturn new Utf8(StringU8.ofBytes(buf.getBytes()));\n\t}\n\n\t/**\n\t\tConverts `codePoints` to a Utf8 string.\n\t**/\n\tpublic static inline function fromCodePoints(codePoints:Iterable<Int>):Utf8\n\t{\n\t\tvar buf = new BytesBuffer();\n\t\tfor (c in codePoints)\n\t\t{\n\t\t\tUtf8Impl.encode_code_point(function(c) buf.addByte(c), c);\n\t\t}\n\t\treturn new Utf8(StringU8.ofBytes(buf.getBytes()));\n\t}\n\n\tpublic static inline function fromString(s:String):Utf8\n\t{\n\t\treturn new Utf8(StringU8.fromString(s));\n\t}\n\n\tpublic static inline function fromBytes(b:Bytes):Utf8\n\t{\n\t\treturn new Utf8(StringU8.fromBytes(b));\n\t}\n\n\tpublic static inline function encodeWith(f:Int->Void, c:Int):Void\n\t{\n\t\tUtf8Impl.encode_code_point(f, c);\n\t}\n\n\tpublic var length(get, never):Int;\n\n\t/**\n\t\tReturns the UTF-8 code unit at position `index` of `this`.\n\t**/\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn this.codeUnitAt(index);\n\t}\n\n\t/**\n\t\tReturns the Unicode code point at position `index` of\n\t\t`this`.\n\t**/\n\tpublic function codePointAt(index:Int):Int\n\t{\n\t\treturn Utf8Impl.decode_code_point(length, function(i) return codeUnitAt(i), index);\n\t}\n\n\t/**\n\t\tReturns the character as a String at position `index` of\n\t\t`this`.\n\t**/\n\tpublic inline function charAt(index:Int):Utf8\n\t{\n\t\treturn new Utf8(this.substr(index, codePointWidthAt(index)));\n\t}\n\n\t/**\n\t\tReturns the number of Unicode code points from `beginIndex`\n\t\tto `endIndex` in `this`.\n\t**/\n\tpublic function codePointCount(beginIndex:Int, endIndex:Int):Int\n\t{\n\t\tvar index = beginIndex;\n\t\tvar i = 0;\n\t\twhile (index < endIndex)\n\t\t{\n\t\t\tindex += codePointWidthAt(index);\n\t\t\t++i;\n\t\t}\n\t\treturn i;\n\t}\n\n\t/**\n\t\tReturns the number of units of the code point at position\n\t\t`index` of `this`.\n\t**/\n\tpublic inline function codePointWidthAt(index:Int):Int\n\t{\n\t\tvar c = codeUnitAt(index);\n\t\treturn Utf8Impl.code_point_width(c);\n\t}\n\n\t/**\n\t\tReturns the number of units of the code point before\n\t\tposition `index` of `this`.\n\t**/\n\tpublic inline function codePointWidthBefore(index:Int):Int\n\t{\n\t\treturn Utf8Impl.find_prev_code_point(function(i) return codeUnitAt(i), index);\n\t}\n\n\t/**\n\t\tReturns the index within `this` that is offset from\n\t\tposition `index` by `codePointOffset` code points.\n\t**/\n\tpublic inline function offsetByCodePoints(index:Int, codePointOffset:Int):Int\n\t{\n\t\treturn if (codePointOffset >= 0)\n\t\t{\n\t\t\tforward_offset_by_code_points(index, codePointOffset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbackward_offset_by_code_points(index, -codePointOffset);\n\t\t}\n\t}\n\n\t/**\n\t\tReturns `len` code units of `this`, starting at position pos.\n\t**/\n\tpublic inline function substr(index:Int, ?len:Int):Utf8\n\t{\n\t\treturn new Utf8(this.substr(index, len));\n\t}\n\n\t/**\n\t\tValidates `this` Utf8 string.\n\n\t\tIf the code unit sequence of `this` is invalid,\n\t\t`Exception.InvalidCodeUnitSequence` is throwed.\n\t**/\n\tpublic function validate():Void\n\t{\n\t\tvar len = this.length;\n\t\tvar accessor = function(i) return codeUnitAt(i);\n\t\tvar i = 0;\n\t\twhile (i < len)\n\t\t{\n\t\t\tUtf8Impl.decode_code_point(len, accessor, i);\n\t\t\ti += codePointWidthAt(i);\n\t\t}\n\t}\n\n\tpublic inline function toString():String\n\t{\n\t\treturn this.toString();\n\t}\n\n\tpublic inline function toBytes():Bytes\n\t{\n\t\treturn this.toBytes();\n\t}\n\n\tinline function new(s:StringU8)\n\t{\n\t\tthis = s;\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n\n\tinline function forward_offset_by_code_points(index:Int, codePointOffset:Int):Int\n\t{\n\t\tvar len = this.length;\n\t\tvar i = 0;\n\t\twhile (i < codePointOffset && index < len)\n\t\t{\n\t\t\tindex += codePointWidthAt(index);\n\t\t\t++i;\n\t\t}\n\t\treturn index;\n\t}\n\n\tinline function backward_offset_by_code_points(index:Int, codePointOffset:Int):Int\n\t{\n\t\tvar count = 0;\n\t\twhile (count < codePointOffset && 0 < index)\n\t\t{\n\t\t\tindex -= codePointWidthBefore(index);\n\t\t\t++count;\n\t\t}\n\t\treturn index;\n\t}\n}\n\nprivate class Utf8Impl\n{\n\tpublic static inline function code_point_width(c:Int):Int\n\t{\n\t\treturn (c < 0xC0) ? 1 : (c < 0xE0) ? 2 : (c < 0xF0) ? 3 : (c < 0xF8) ? 4 : 1;\n\t}\n\n\tpublic static inline function find_prev_code_point(accessor:Int->Int, index:Int):Int\n\t{\n\t\tvar c1 = accessor(index - 1);\n\t\treturn\n\t\t\t(c1 < 0x80 || c1 >= 0xC0) ? 1 : (accessor(index - 2) & 0xE0 == 0xC0) ? 2 : (accessor(index - 3) & 0xF0 == 0xE0) ? 3 : (accessor(index - 4) & 0xF8 == 0xF0) ? 4 : 1;\n\t}\n\n\tpublic static inline function encode_code_point(addUnit:Int->Void, codePoint:Int):Void\n\t{\n\t\tif (codePoint <= 0x7F)\n\t\t{\n\t\t\taddUnit(codePoint);\n\t\t}\n\t\telse if (codePoint <= 0x7FF)\n\t\t{\n\t\t\taddUnit(0xC0 | (codePoint >> 6));\n\t\t\taddUnit(0x80 | (codePoint & 0x3F));\n\t\t}\n\t\telse if (codePoint <= 0xFFFF)\n\t\t{\n\t\t\taddUnit(0xE0 | (codePoint >> 12));\n\t\t\taddUnit(0x80 | ((codePoint >> 6) & 0x3F));\n\t\t\taddUnit(0x80 | (codePoint & 0x3F));\n\t\t}\n\t\telse if (codePoint <= 0x10FFFF)\n\t\t{\n\t\t\taddUnit(0xF0 | (codePoint >> 18));\n\t\t\taddUnit(0x80 | ((codePoint >> 12) & 0x3F));\n\t\t\taddUnit(0x80 | ((codePoint >> 6) & 0x3F));\n\t\t\taddUnit(0x80 | (codePoint & 0x3F));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow new Exception.InvalidCodePoint(codePoint);\n\t\t}\n\t}\n\n\tpublic static function decode_code_point(len:Int, accessor:Int->Int, index:Int):Int\n\t{\n\t\tvar i = index;\n\t\tif (i < 0 || len <= i) throw new Exception.InvalidCodeUnitSequence(index);\n\t\tvar c1 = accessor(i);\n\t\tif (c1 < 0x80)\n\t\t{\n\t\t\treturn c1;\n\t\t}\n\t\tif (c1 < 0xC0)\n\t\t{\n\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t}\n\t\t++i;\n\t\tif (i < 0 || len <= i) throw new Exception.InvalidCodeUnitSequence(index);\n\t\tvar c2 = accessor(i);\n\t\tif (c1 < 0xE0)\n\t\t{\n\t\t\tif ((c1 & 0x1E != 0) && (c2 & 0xC0 == 0x80)) return ((c1 & 0x3F) << 6) | (c2 & 0x7F);\n\t\t\telse\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t}\n\t\t++i;\n\t\tif (i < 0 || len <= i) throw new Exception.InvalidCodeUnitSequence(index);\n\t\tvar c3 = accessor(i);\n\t\tif (c1 < 0xF0)\n\t\t{\n\t\t\tif (((c1 & 0x0F != 0) || (c2 & 0x20 != 0))\n\t\t\t\t&& (c2 & 0xC0 == 0x80)\n\t\t\t\t&& (c3 & 0xC0 == 0x80)\n\t\t\t\t&& !(c1 == 0xED && 0xA0 <= c2 && c2 <= 0xBF)) return ((c1 & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (c3 & 0x7F);\n\t\t\telse\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t}\n\t\t++i;\n\t\tif (i < 0 || len <= i) throw new Exception.InvalidCodeUnitSequence(index);\n\t\tvar c4 = accessor(i);\n\t\tif (c1 < 0xF8)\n\t\t{\n\t\t\tif (((c1 & 0x07 != 0) || (c2 & 0x30 != 0))\n\t\t\t\t&& (c2 & 0xC0 == 0x80)\n\t\t\t\t&& (c3 & 0xC0 == 0x80)\n\t\t\t\t&& (c4 & 0xC0 == 0x80)\n\t\t\t\t&& !((c1 == 0xF4 && c2 > 0x8F) || c1 > 0xF4)) return ((c1 & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 & 0x7F) << 6) | (c4 & 0x7F);\n\t\t\telse\n\t\t\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t\t}\n\t\tthrow new Exception.InvalidCodeUnitSequence(index);\n\t}\n}\n\n#if (neko || php || cpp || lua || macro)\nprivate abstract StringU8(String)\n{\n\tpublic static inline function fromString(s:String):StringU8\n\t{\n\t\treturn new StringU8(s);\n\t}\n\n\tpublic static inline function ofBytes(b:Bytes):StringU8\n\t{\n\t\treturn new StringU8(b.toString());\n\t}\n\n\tpublic static inline function fromBytes(b:Bytes):StringU8\n\t{\n\t\treturn new StringU8(b.toString());\n\t}\n\n\tpublic var length(get, never):Int;\n\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn StringTools.fastCodeAt(this, index);\n\t}\n\n\tpublic inline function substr(index:Int, ?len:Int):StringU8\n\t{\n\t\treturn new StringU8(this.substr(index, len));\n\t}\n\n\tpublic inline function toString():String\n\t{\n\t\treturn this;\n\t}\n\n\tpublic inline function toBytes():Bytes\n\t{\n\t\treturn Bytes.ofString(this);\n\t}\n\n\tinline function new(s:String)\n\t{\n\t\tthis = s;\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n}\n#else\nprivate abstract StringU8(Bytes)\n{\n\tpublic static function fromString(s:String):StringU8\n\t{\n\t\tvar buf = new BytesBuffer();\n\t\tvar addUnit = buf.addByte;\n\t\tfor (i in new InternalEncodingIter(s, 0, s.length))\n\t\t{\n\t\t\tvar c = InternalEncoding.codePointAt(s, i);\n\t\t\tUtf8Impl.encode_code_point(addUnit, c);\n\t\t}\n\t\treturn new StringU8(buf.getBytes());\n\t}\n\n\tpublic static inline function ofBytes(b:Bytes):StringU8\n\t{\n\t\treturn new StringU8(b);\n\t}\n\n\tpublic static inline function fromBytes(b:Bytes):StringU8\n\t{\n\t\tvar nb = clone_bytes(b);\n\t\treturn new StringU8(nb);\n\t}\n\n\tpublic var length(get, never):Int;\n\n\tpublic inline function codeUnitAt(index:Int):Int\n\t{\n\t\treturn this.get(index);\n\t}\n\n\tpublic inline function substr(index:Int, ?len:Int):StringU8\n\t{\n\t\tif (index < 0)\n\t\t{\n\t\t\tindex += this.length;\n\t\t\tif (index < 0) index = 0;\n\t\t}\n\t\tif (len == null) len = this.length - index;\n\t\tvar b = this.sub(index, len);\n\t\treturn new StringU8(b);\n\t}\n\n\tpublic function toString():String\n\t{\n\t\tvar buf = new StringBuf();\n\t\tvar i = 0;\n\t\tvar len = this.length;\n\t\tvar cua = function(i) return this.get(i);\n\t\twhile (i < len)\n\t\t{\n\t\t\tvar u = Utf8Impl.decode_code_point(len, cua, i);\n\t\t\tbuf.add(InternalEncoding.fromCodePoint(u));\n\t\t\ti += Utf8Impl.code_point_width(codeUnitAt(i));\n\t\t}\n\t\treturn buf.toString();\n\t}\n\n\tpublic inline function toBytes():Bytes\n\t{\n\t\treturn clone_bytes(this);\n\t}\n\n\tstatic inline function clone_bytes(b:Bytes):Bytes\n\t{\n\t\tvar nb = Bytes.alloc(b.length);\n\t\tnb.blit(0, b, 0, b.length);\n\t\treturn nb;\n\t}\n\n\tinline function new(b:Bytes)\n\t{\n\t\tthis = b;\n\t}\n\n\tinline function get_length():Int\n\t{\n\t\treturn this.length;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/app/Application.hx",
    "content": "package lime.app;\n\nimport lime.graphics.RenderContext;\nimport lime.system.System;\nimport lime.system.Orientation;\nimport lime.ui.Gamepad;\nimport lime.ui.GamepadAxis;\nimport lime.ui.GamepadButton;\nimport lime.ui.Joystick;\nimport lime.ui.JoystickHatPosition;\nimport lime.ui.KeyCode;\nimport lime.ui.KeyModifier;\nimport lime.ui.MouseButton;\nimport lime.ui.MouseWheelMode;\nimport lime.ui.Touch;\nimport lime.ui.Window;\nimport lime.ui.WindowAttributes;\nimport lime.utils.Preloader;\n\n/**\n\tThe Application class forms the foundation for most Lime projects.\n\tIt is common to extend this class in a main class. It is then possible\n\tto override \"on\" functions in the class in order to handle standard events\n\tthat are relevant.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime.ui.Window)\nclass Application extends Module\n{\n\t/**\n\t\tThe current Application instance that is executing\n\t**/\n\tpublic static var current(default, null):Application;\n\n\t/**\n\t\tThe device's orientation.\n\t**/\n\tpublic var deviceOrientation(get, never):Orientation;\n\n\t/**\n\t\tMeta-data values for the application, such as a version or a package name\n\t**/\n\tpublic var meta:Map<String, String>;\n\n\t/**\n\t\tA list of currently attached Module instances\n\t**/\n\tpublic var modules(default, null):Array<IModule>;\n\n\t/**\n\t\tUpdate events are dispatched each frame (usually just before rendering)\n\t**/\n\tpublic var onUpdate = new Event<Int->Void>();\n\n\t/**\n\t\tDispatched when a new window has been created by this application\n\t**/\n\tpublic var onCreateWindow = new Event<Window->Void>();\n\n\t/**\n\t\tDispatched when the orientation of the display has changed.\n\t**/\n\tpublic var onDisplayOrientationChange = new Event<Int->Orientation->Void>();\n\n\t/**\n\t\tDispatched when the orientation of the device has changed. Typically,\n\t\tthe display and device orientation values are the same. However, if the\n\t\tdisplay orientation is locked to portrait or landscape, the display and\n\t\tdevice orientations may be different.\n\t**/\n\tpublic var onDeviceOrientationChange = new Event<Orientation->Void>();\n\n\t/**\n\t\tThe Preloader for the current Application\n\t**/\n\tpublic var preloader(get, null):Preloader;\n\n\t/**\n\t\tThe Window associated with this Application, or the first Window\n\t\tif there are multiple Windows active\n\t**/\n\tpublic var window(get, null):Window;\n\n\t/**\n\t\tA list of active Window instances associated with this Application\n\t**/\n\tpublic var windows(get, null):Array<Window>;\n\n\t@:noCompletion private var __backend:ApplicationBackend;\n\t@:noCompletion private var __preloader:Preloader;\n\t@:noCompletion private var __window:Window;\n\t@:noCompletion private var __windowByID:Map<Int, Window>;\n\t@:noCompletion private var __windows:Array<Window>;\n\n\tprivate static function __init__()\n\t{\n\t\tvar _init = ApplicationBackend;\n\t\t#if commonjs\n\t\tvar p = untyped Application.prototype;\n\t\tuntyped Object.defineProperties(p,\n\t\t\t{\n\t\t\t\t\"preloader\": {get: p.get_preloader},\n\t\t\t\t\"window\": {get: p.get_window},\n\t\t\t\t\"windows\": {get: p.get_windows}\n\t\t\t});\n\t\t#end\n\t}\n\n\t/**\n\t\tCreates a new Application instance\n\t**/\n\tpublic function new()\n\t{\n\t\tsuper();\n\n\t\tif (Application.current == null)\n\t\t{\n\t\t\tApplication.current = this;\n\t\t}\n\n\t\tmeta = new Map();\n\t\tmodules = new Array();\n\t\t__windowByID = new Map();\n\t\t__windows = new Array();\n\n\t\t__backend = new ApplicationBackend(this);\n\n\t\t__registerLimeModule(this);\n\n\t\t__preloader = new Preloader();\n\t\t__preloader.onProgress.add(onPreloadProgress);\n\t\t__preloader.onComplete.add(onPreloadComplete);\n\t}\n\n\t/**\n\t\tAdds a new module to the Application\n\t\t@param\tmodule\tA module to add\n\t**/\n\tpublic function addModule(module:IModule):Void\n\t{\n\t\tmodule.__registerLimeModule(this);\n\t\tmodules.push(module);\n\t}\n\n\t/**\n\t\tCreates a new Window and adds it to the Application\n\t\t@param\tattributes\tA set of parameters to initialize the window\n\t**/\n\tpublic function createWindow(attributes:WindowAttributes):Window\n\t{\n\t\tvar window = __createWindow(attributes);\n\t\t__addWindow(window);\n\t\treturn window;\n\t}\n\n\t/**\n\t\tExecute the Application. On native platforms, this method\n\t\tblocks until the application is finished running. On other\n\t\tplatforms, it will return immediately\n\t\t@return\tAn exit code, 0 if there was no error\n\t**/\n\tpublic function exec():Int\n\t{\n\t\tApplication.current = this;\n\n\t\treturn __backend.exec();\n\t}\n\n\t/**\n\t\tCalled when a gamepad axis move event is fired\n\t\t@param\tgamepad\tThe current gamepad\n\t\t@param\taxis\tThe axis that was moved\n\t\t@param\tvalue\tThe axis value (between 0 and 1)\n\t**/\n\tpublic function onGamepadAxisMove(gamepad:Gamepad, axis:GamepadAxis, value:Float):Void {}\n\n\t/**\n\t\tCalled when a gamepad button down event is fired\n\t\t@param\tgamepad\tThe current gamepad\n\t\t@param\tbutton\tThe button that was pressed\n\t**/\n\tpublic function onGamepadButtonDown(gamepad:Gamepad, button:GamepadButton):Void {}\n\n\t/**\n\t\tCalled when a gamepad button up event is fired\n\t\t@param\tgamepad\tThe current gamepad\n\t\t@param\tbutton\tThe button that was released\n\t**/\n\tpublic function onGamepadButtonUp(gamepad:Gamepad, button:GamepadButton):Void {}\n\n\t/**\n\t\tCalled when a gamepad is connected\n\t\t@param\tgamepad\tThe gamepad that was connected\n\t**/\n\tpublic function onGamepadConnect(gamepad:Gamepad):Void {}\n\n\t/**\n\t\tCalled when a gamepad is disconnected\n\t\t@param\tgamepad\tThe gamepad that was disconnected\n\t**/\n\tpublic function onGamepadDisconnect(gamepad:Gamepad):Void {}\n\n\t/**\n\t\tCalled when a joystick axis move event is fired\n\t\t@param\tjoystick\tThe current joystick\n\t\t@param\taxis\tThe axis that was moved\n\t\t@param\tvalue\tThe axis value (between 0 and 1)\n\t**/\n\tpublic function onJoystickAxisMove(joystick:Joystick, axis:Int, value:Float):Void {}\n\n\t/**\n\t\tCalled when a joystick button down event is fired\n\t\t@param\tjoystick\tThe current joystick\n\t\t@param\tbutton\tThe button that was pressed\n\t**/\n\tpublic function onJoystickButtonDown(joystick:Joystick, button:Int):Void {}\n\n\t/**\n\t\tCalled when a joystick button up event is fired\n\t\t@param\tjoystick\tThe current joystick\n\t\t@param\tbutton\tThe button that was released\n\t**/\n\tpublic function onJoystickButtonUp(joystick:Joystick, button:Int):Void {}\n\n\t/**\n\t\tCalled when a joystick is connected\n\t\t@param\tjoystick\tThe joystick that was connected\n\t**/\n\tpublic function onJoystickConnect(joystick:Joystick):Void {}\n\n\t/**\n\t\tCalled when a joystick is disconnected\n\t\t@param\tjoystick\tThe joystick that was disconnected\n\t**/\n\tpublic function onJoystickDisconnect(joystick:Joystick):Void {}\n\n\t/**\n\t\tCalled when a joystick hat move event is fired\n\t\t@param\tjoystick\tThe current joystick\n\t\t@param\that\tThe hat that was moved\n\t\t@param\tposition\tThe current hat position\n\t**/\n\tpublic function onJoystickHatMove(joystick:Joystick, hat:Int, position:JoystickHatPosition):Void {}\n\n\t/**\n\t\tCalled when a key down event is fired on the primary window\n\t\t@param\tkeyCode\tThe code of the key that was pressed\n\t\t@param\tmodifier\tThe modifier of the key that was pressed\n\t**/\n\tpublic function onKeyDown(keyCode:KeyCode, modifier:KeyModifier):Void {}\n\n\t/**\n\t\tCalled when a key up event is fired on the primary window\n\t\t@param\tkeyCode\tThe code of the key that was released\n\t\t@param\tmodifier\tThe modifier of the key that was released\n\t**/\n\tpublic function onKeyUp(keyCode:KeyCode, modifier:KeyModifier):Void {}\n\n\t/**\n\t\tCalled when the module is exiting\n\t**/\n\tpublic function onModuleExit(code:Int):Void {}\n\n\t/**\n\t\tCalled when a mouse down event is fired on the primary window\n\t\t@param\tx\tThe current x coordinate of the mouse\n\t\t@param\ty\tThe current y coordinate of the mouse\n\t\t@param\tbutton\tThe ID of the mouse button that was pressed\n\t**/\n\tpublic function onMouseDown(x:Float, y:Float, button:MouseButton):Void {}\n\n\t/**\n\t\tCalled when a mouse move event is fired on the primary window\n\t\t@param\tx\tThe current x coordinate of the mouse\n\t\t@param\ty\tThe current y coordinate of the mouse\n\t**/\n\tpublic function onMouseMove(x:Float, y:Float):Void {}\n\n\t/**\n\t\tCalled when a mouse move relative event is fired on the primary window\n\t\t@param\tx\tThe x movement of the mouse\n\t\t@param\ty\tThe y movement of the mouse\n\t**/\n\tpublic function onMouseMoveRelative(x:Float, y:Float):Void {}\n\n\t/**\n\t\tCalled when a mouse up event is fired on the primary window\n\t\t@param\tx\tThe current x coordinate of the mouse\n\t\t@param\ty\tThe current y coordinate of the mouse\n\t\t@param\tbutton\tThe ID of the button that was released\n\t**/\n\tpublic function onMouseUp(x:Float, y:Float, button:MouseButton):Void {}\n\n\t/**\n\t\tCalled when a mouse wheel event is fired on the primary window\n\t\t@param\tdeltaX\tThe amount of horizontal scrolling (if applicable)\n\t\t@param\tdeltaY\tThe amount of vertical scrolling (if applicable)\n\t\t@param\tdeltaMode\tThe units of measurement used\n\t**/\n\tpublic function onMouseWheel(deltaX:Float, deltaY:Float, deltaMode:MouseWheelMode):Void {}\n\n\t/**\n\t\tCalled when a preload complete event is fired\n\t**/\n\tpublic function onPreloadComplete():Void {}\n\n\t/**\n\t\tCalled when a preload progress event is fired\n\t\t@param\tloaded\tThe number of items that are loaded\n\t\t@param\ttotal\tThe total number of items will be loaded\n\t**/\n\tpublic function onPreloadProgress(loaded:Int, total:Int):Void {}\n\n\t/**\n\t\tCalled when a render context is lost on the primary window\n\t**/\n\tpublic function onRenderContextLost():Void {}\n\n\t/**\n\t\tCalled when a render context is restored on the primary window\n\t\t@param\tcontext\tThe render context relevant to the event\n\t**/\n\tpublic function onRenderContextRestored(context:RenderContext):Void {}\n\n\t/**\n\t\tCalled when a text edit event is fired on the primary window\n\t\t@param\ttext\tThe current replacement text\n\t\t@param\tstart\tThe starting index for the edit\n\t\t@param\tlength\tThe length of the edit\n\t**/\n\tpublic function onTextEdit(text:String, start:Int, length:Int):Void {}\n\n\t/**\n\t\tCalled when a text input event is fired on the primary window\n\t\t@param\ttext\tThe current input text\n\t**/\n\tpublic function onTextInput(text:String):Void {}\n\n\t/**\n\t\tCalled when a touch cancel event is fired\n\t\t@param\ttouch\tThe current touch object\n\t**/\n\tpublic function onTouchCancel(touch:Touch):Void {}\n\n\t/**\n\t\tCalled when a touch end event is fired\n\t\t@param\ttouch\tThe current touch object\n\t**/\n\tpublic function onTouchEnd(touch:Touch):Void {}\n\n\t/**\n\t\tCalled when a touch move event is fired\n\t\t@param\ttouch\tThe current touch object\n\t**/\n\tpublic function onTouchMove(touch:Touch):Void {}\n\n\t/**\n\t\tCalled when a touch start event is fired\n\t\t@param\ttouch\tThe current touch object\n\t**/\n\tpublic function onTouchStart(touch:Touch):Void {}\n\n\t/**\n\t\tCalled when a window activate event is fired on the primary window\n\t**/\n\tpublic function onWindowActivate():Void {}\n\n\t/**\n\t\tCalled when a window close event is fired on the primary window\n\t**/\n\tpublic function onWindowClose():Void {}\n\n\t/**\n\t\tCalled when the primary window is created\n\t**/\n\tpublic function onWindowCreate():Void {}\n\n\t/**\n\t\tCalled when a window deactivate event is fired on the primary window\n\t**/\n\tpublic function onWindowDeactivate():Void {}\n\n\t/**\n\t\tCalled when a window drop file event is fired on the primary window\n\t**/\n\tpublic function onWindowDropFile(file:String):Void {}\n\n\t/**\n\t\tCalled when a window enter event is fired on the primary window\n\t**/\n\tpublic function onWindowEnter():Void {}\n\n\t/**\n\t\tCalled when a window expose event is fired on the primary window\n\t**/\n\tpublic function onWindowExpose():Void {}\n\n\t/**\n\t\tCalled when a window focus in event is fired on the primary window\n\t**/\n\tpublic function onWindowFocusIn():Void {}\n\n\t/**\n\t\tCalled when a window focus out event is fired on the primary window\n\t**/\n\tpublic function onWindowFocusOut():Void {}\n\n\t/**\n\t\tCalled when the primary window enters fullscreen\n\t**/\n\tpublic function onWindowFullscreen():Void {}\n\n\t/**\n\t\tCalled when a window leave event is fired on the primary window\n\t**/\n\tpublic function onWindowLeave():Void {}\n\n\t/**\n\t\tCalled when a window move event is fired on the primary window\n\t\t@param\tx\tThe x position of the window in desktop coordinates\n\t\t@param\ty\tThe y position of the window in desktop coordinates\n\t**/\n\tpublic function onWindowMove(x:Float, y:Float):Void {}\n\n\t/**\n\t\tCalled when the primary window is minimized\n\t**/\n\tpublic function onWindowMinimize():Void {}\n\n\t/**\n\t\tCalled when a window resize event is fired on the primary window\n\t\t@param\twidth\tThe width of the window\n\t\t@param\theight\tThe height of the window\n\t**/\n\tpublic function onWindowResize(width:Int, height:Int):Void {}\n\n\t/**\n\t\tCalled when the primary window is restored from being minimized or fullscreen\n\t**/\n\tpublic function onWindowRestore():Void {}\n\n\t/**\n\t\tRemoves a module from the Application\n\t\t@param\tmodule\tA module to remove\n\t**/\n\tpublic function removeModule(module:IModule):Void\n\t{\n\t\tif (module != null)\n\t\t{\n\t\t\tmodule.__unregisterLimeModule(this);\n\t\t\tmodules.remove(module);\n\t\t}\n\t}\n\n\t/**\n\t\tCalled when a render event is fired on the primary window\n\t\t@param\tcontext\tThe render context ready to be rendered\n\t**/\n\tpublic function render(context:RenderContext):Void {}\n\n\t/**\n\t\tCalled when an update event is fired on the primary window\n\t\t@param\tdeltaTime\tThe amount of time in milliseconds that has elapsed since the last update\n\t**/\n\tpublic function update(deltaTime:Int):Void {}\n\n\t@:noCompletion private function __addWindow(window:Window):Void\n\t{\n\t\tif (window != null)\n\t\t{\n\t\t\t__windows.push(window);\n\t\t\t__windowByID.set(window.id, window);\n\n\t\t\twindow.onClose.add(__onWindowClose.bind(window), false, -10000);\n\n\t\t\tif (__window == null)\n\t\t\t{\n\t\t\t\t__window = window;\n\n\t\t\t\twindow.onActivate.add(onWindowActivate);\n\t\t\t\twindow.onRenderContextLost.add(onRenderContextLost);\n\t\t\t\twindow.onRenderContextRestored.add(onRenderContextRestored);\n\t\t\t\twindow.onDeactivate.add(onWindowDeactivate);\n\t\t\t\twindow.onDropFile.add(onWindowDropFile);\n\t\t\t\twindow.onEnter.add(onWindowEnter);\n\t\t\t\twindow.onExpose.add(onWindowExpose);\n\t\t\t\twindow.onFocusIn.add(onWindowFocusIn);\n\t\t\t\twindow.onFocusOut.add(onWindowFocusOut);\n\t\t\t\twindow.onFullscreen.add(onWindowFullscreen);\n\t\t\t\twindow.onKeyDown.add(onKeyDown);\n\t\t\t\twindow.onKeyUp.add(onKeyUp);\n\t\t\t\twindow.onLeave.add(onWindowLeave);\n\t\t\t\twindow.onMinimize.add(onWindowMinimize);\n\t\t\t\twindow.onMouseDown.add(onMouseDown);\n\t\t\t\twindow.onMouseMove.add(onMouseMove);\n\t\t\t\twindow.onMouseMoveRelative.add(onMouseMoveRelative);\n\t\t\t\twindow.onMouseUp.add(onMouseUp);\n\t\t\t\twindow.onMouseWheel.add(onMouseWheel);\n\t\t\t\twindow.onMove.add(onWindowMove);\n\t\t\t\twindow.onRender.add(render);\n\t\t\t\twindow.onResize.add(onWindowResize);\n\t\t\t\twindow.onRestore.add(onWindowRestore);\n\t\t\t\twindow.onTextEdit.add(onTextEdit);\n\t\t\t\twindow.onTextInput.add(onTextInput);\n\n\t\t\t\tonWindowCreate();\n\t\t\t}\n\n\t\t\tonCreateWindow.dispatch(window);\n\t\t}\n\t}\n\n\t@:noCompletion private function __createWindow(attributes:WindowAttributes):Window\n\t{\n\t\tvar window = new Window(this, attributes);\n\t\tif (window.id == -1) return null;\n\t\treturn window;\n\t}\n\n\t@:noCompletion private override function __registerLimeModule(application:Application):Void\n\t{\n\t\tapplication.onUpdate.add(update);\n\t\tapplication.onExit.add(onModuleExit, false, 0);\n\t\tapplication.onExit.add(__onModuleExit, false, -1000);\n\n\t\tfor (gamepad in Gamepad.devices)\n\t\t{\n\t\t\t__onGamepadConnect(gamepad);\n\t\t}\n\n\t\tGamepad.onConnect.add(__onGamepadConnect);\n\n\t\tfor (joystick in Joystick.devices)\n\t\t{\n\t\t\t__onJoystickConnect(joystick);\n\t\t}\n\n\t\tJoystick.onConnect.add(__onJoystickConnect);\n\n\t\tTouch.onCancel.add(onTouchCancel);\n\t\tTouch.onStart.add(onTouchStart);\n\t\tTouch.onMove.add(onTouchMove);\n\t\tTouch.onEnd.add(onTouchEnd);\n\t}\n\n\t@:noCompletion private function __removeWindow(window:Window):Void\n\t{\n\t\tif (window != null && __windowByID.exists(window.id))\n\t\t{\n\t\t\tif (__window == window)\n\t\t\t{\n\t\t\t\t__window = null;\n\t\t\t}\n\n\t\t\t__windows.remove(window);\n\t\t\t__windowByID.remove(window.id);\n\t\t\twindow.close();\n\n\t\t\t__checkForAllWindowsClosed();\n\t\t}\n\t}\n\n\t@:noCompletion private function __checkForAllWindowsClosed():Void\n\t{\n\t\t// air handles this automatically with NativeApplication.autoExit\n\t\t#if !air\n\t\tif (__windows.length == 0)\n\t\t{\n\t\t\t#if !lime_doc_gen\n\t\t\tSystem.exit(0);\n\t\t\t#end\n\t\t}\n\t\t#end\n\t}\n\n\t@:noCompletion private function __onGamepadConnect(gamepad:Gamepad):Void\n\t{\n\t\tonGamepadConnect(gamepad);\n\n\t\tgamepad.onAxisMove.add(onGamepadAxisMove.bind(gamepad));\n\t\tgamepad.onButtonDown.add(onGamepadButtonDown.bind(gamepad));\n\t\tgamepad.onButtonUp.add(onGamepadButtonUp.bind(gamepad));\n\t\tgamepad.onDisconnect.add(onGamepadDisconnect.bind(gamepad));\n\t}\n\n\t@:noCompletion private function __onJoystickConnect(joystick:Joystick):Void\n\t{\n\t\tonJoystickConnect(joystick);\n\n\t\tjoystick.onAxisMove.add(onJoystickAxisMove.bind(joystick));\n\t\tjoystick.onButtonDown.add(onJoystickButtonDown.bind(joystick));\n\t\tjoystick.onButtonUp.add(onJoystickButtonUp.bind(joystick));\n\t\tjoystick.onDisconnect.add(onJoystickDisconnect.bind(joystick));\n\t\tjoystick.onHatMove.add(onJoystickHatMove.bind(joystick));\n\t}\n\n\t@:noCompletion private function __onModuleExit(code:Int):Void\n\t{\n\t\tif (onExit.canceled)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t__unregisterLimeModule(this);\n\t\t__backend.exit();\n\t\tif (Application.current == this)\n\t\t{\n\t\t\tApplication.current = null;\n\t\t}\n\t}\n\n\t@:noCompletion private function __onWindowClose(window:Window):Void\n\t{\n\t\tif (this.window == window)\n\t\t{\n\t\t\tonWindowClose();\n\t\t}\n\n\t\t__removeWindow(window);\n\t}\n\n\t@:noCompletion private override function __unregisterLimeModule(application:Application):Void\n\t{\n\t\tapplication.onUpdate.remove(update);\n\t\tapplication.onExit.remove(__onModuleExit);\n\t\tapplication.onExit.remove(onModuleExit);\n\n\t\tGamepad.onConnect.remove(__onGamepadConnect);\n\t\tJoystick.onConnect.remove(__onJoystickConnect);\n\t\tTouch.onCancel.remove(onTouchCancel);\n\t\tTouch.onStart.remove(onTouchStart);\n\t\tTouch.onMove.remove(onTouchMove);\n\t\tTouch.onEnd.remove(onTouchEnd);\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_preloader():Preloader\n\t{\n\t\treturn __preloader;\n\t}\n\n\t@:noCompletion private inline function get_window():Window\n\t{\n\t\treturn __window;\n\t}\n\n\t@:noCompletion private inline function get_windows():Array<Window>\n\t{\n\t\treturn __windows;\n\t}\n\n\t@:noCompletion private function get_deviceOrientation():Orientation\n\t{\n\t\treturn __backend.getDeviceOrientation();\n\t}\n}\n\n#if air\n@:noCompletion private typedef ApplicationBackend = lime._internal.backend.air.AIRApplication;\n#elseif flash\n@:noCompletion private typedef ApplicationBackend = lime._internal.backend.flash.FlashApplication;\n#elseif (js && html5)\n@:noCompletion private typedef ApplicationBackend = lime._internal.backend.html5.HTML5Application;\n#else\n@:noCompletion private typedef ApplicationBackend = lime._internal.backend.native.NativeApplication;\n#end\n"
  },
  {
    "path": "src/lime/app/Event.hx",
    "content": "package lime.app;\n\n/**\n\tEvent is a strictly-typed signals and slots implementation, used for\n\tcore event dispatching.\n\n\tFor example:\n\n\t```haxe\n\tvar event = new Event<Int->Void> ();\n\tevent.add (function (value:Int):Void { trace (value); });\n\tevent.dispatch (100);\n\n\tvar event = new Event<Void->Void> ();\n\tevent.add (function () { trace (\"callback\"); });\n\tevent.dispatch ();\n\t```\n**/\n#if !macro\n@:genericBuild(lime._internal.macros.EventMacro.build())\n#end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Event<T>\n{\n\t/**\n\t\tWhether the event was canceled during the previous dispatch\n\t**/\n\tpublic var canceled(default, null):Bool;\n\n\t@:noCompletion @:dox(hide) public var __listeners:Array<T>;\n\t@:noCompletion @:dox(hide) public var __repeat:Array<Bool>;\n\n\t@:noCompletion private var __priorities:Array<Int>;\n\n\t/**\n\t\tCreates a new Event instance\n\t**/\n\tpublic function new()\n\t{\n\t\t#if !macro\n\t\tcanceled = false;\n\t\t__listeners = new Array();\n\t\t__priorities = new Array<Int>();\n\t\t__repeat = new Array<Bool>();\n\t\t#end\n\t}\n\n\t/**\n\t\tAdds a new event listener\n\t\t@param\tlistener\tA callback that matches the signature of the event\n\t\t@param\tonce\tWhether to receive an event dispatch only once, or each time it is fired\n\t\t@param\tpriority\tThe priority for this listener, a higher priority will be dispatched sooner\n\t**/\n\tpublic function add(listener:T, once:Bool = false, priority:Int = 0):Void\n\t{\n\t\t#if !macro\n\t\tfor (i in 0...__priorities.length)\n\t\t{\n\t\t\tif (priority > __priorities[i])\n\t\t\t{\n\t\t\t\t__listeners.insert(i, cast listener);\n\t\t\t\t__priorities.insert(i, priority);\n\t\t\t\t__repeat.insert(i, !once);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t__listeners.push(cast listener);\n\t\t__priorities.push(priority);\n\t\t__repeat.push(!once);\n\t\t#end\n\t}\n\n\t/**\n\t\tMarks the event as canceled, and stops the current event dispatch\n\t**/\n\tpublic function cancel():Void\n\t{\n\t\tcanceled = true;\n\t}\n\n\t/**\n\t\tDispatches a new event callback to all listeners. The signature for the\n\t\t`dispatch` method depends upon the type of the `Event`. For example, an\n\t\t`Event` of type `Int->Int->Void` will create a `dispatch` method that\n\t\ttakes two `Int` arguments, like `dispatch (1, 2);`\n\t**/\n\tpublic var dispatch:Dynamic;\n\n\t// macro public function dispatch (ethis:Expr, args:Array<Expr>):Void {\n\t//\n\t// return macro {\n\t//\n\t// var listeners = $ethis.listeners;\n\t// var repeat = $ethis.repeat;\n\t// var i = 0;\n\t//\n\t// while (i < listeners.length) {\n\t//\n\t// listeners[i] ($a{args});\n\t//\n\t// if (!repeat[i]) {\n\t//\n\t// $ethis.remove (listeners[i]);\n\t//\n\t// } else {\n\t//\n\t// i++;\n\t//\n\t// }\n\t//\n\t// }\n\t//\n\t// }\n\t//\n\t// }\n\n\t/**\n\t\tChecks whether a callback is a listener to this event\n\t\t@param\tlistener\tA callback that matches the signature of the event\n\t\t@return\tWhether the callback is a listener\n\t**/\n\tpublic function has(listener:T):Bool\n\t{\n\t\t#if !macro\n\t\tfor (l in __listeners)\n\t\t{\n\t\t\tif (Reflect.compareMethods(l, listener)) return true;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t/**\n\t\tRemoves an event listener\n\t\t@param\tlistener\tA callback that matches the signature of the event\n\t**/\n\tpublic function remove(listener:T):Void\n\t{\n\t\t#if !macro\n\t\tvar i = __listeners.length;\n\n\t\twhile (--i >= 0)\n\t\t{\n\t\t\tif (Reflect.compareMethods(__listeners[i], listener))\n\t\t\t{\n\t\t\t\t__listeners.splice(i, 1);\n\t\t\t\t__priorities.splice(i, 1);\n\t\t\t\t__repeat.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\t#end\n\t}\n\n\t/**\n\t\tRemoves all event listeners\n\t**/\n\tpublic function removeAll():Void\n\t{\n\t\t#if !macro\n\t\tvar len = __listeners.length;\n\n\t\t__listeners.splice(0, len);\n\t\t__priorities.splice(0, len);\n\t\t__repeat.splice(0, len);\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/app/Future.hx",
    "content": "package lime.app;\n\nimport lime.system.System;\nimport lime.system.ThreadPool;\nimport lime.system.WorkOutput;\nimport lime.utils.Log;\n\n/**\n\t`Future` is an implementation of Futures and Promises, with the exception that\n\tin addition to \"success\" and \"failure\" states (represented as \"complete\" and \"error\"),\n\tLime `Future` introduces \"progress\" feedback as well to increase the value of\n\t`Future` values.\n\n\t```haxe\n\tvar future = Image.loadFromFile (\"image.png\");\n\tfuture.onComplete (function (image) { trace (\"Image loaded\"); });\n\tfuture.onProgress (function (loaded, total) { trace (\"Loading: \" + loaded + \", \" + total); });\n\tfuture.onError (function (error) { trace (error); });\n\n\tImage.loadFromFile (\"image.png\").then (function (image) {\n\n\t\treturn Future.withValue (image.width);\n\n\t}).onComplete (function (width) { trace (width); })\n\t```\n\n\t`Future` values can be chained together for asynchronous processing of values.\n\n\tIf an error occurs earlier in the chain, the error is propagated to all `onError` callbacks.\n\n\t`Future` will call `onComplete` callbacks, even if completion occurred before registering the\n\tcallback. This resolves race conditions, so even functions that return immediately can return\n\tvalues using `Future`.\n\n\t`Future` values are meant to be immutable, if you wish to update a `Future`, you should create one\n\tusing a `Promise`, and use the `Promise` interface to influence the error, complete or progress state\n\tof a `Future`.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:allow(lime.app.Promise) /*@:generic*/ class Future<T>\n{\n\t/**\n\t\tIf the `Future` has finished with an error state, the `error` value\n\t**/\n\tpublic var error(default, null):Dynamic;\n\n\t/**\n\t\tWhether the `Future` finished with a completion state\n\t**/\n\tpublic var isComplete(default, null):Bool;\n\n\t/**\n\t\tWhether the `Future` finished with an error state\n\t**/\n\tpublic var isError(default, null):Bool;\n\n\t/**\n\t\tIf the `Future` has finished with a completion state, the completion `value`\n\t**/\n\tpublic var value(default, null):T;\n\n\t@:noCompletion private var __completeListeners:Array<T->Void>;\n\t@:noCompletion private var __errorListeners:Array<Dynamic->Void>;\n\t@:noCompletion private var __progressListeners:Array<Int->Int->Void>;\n\n\t/**\n\t\t@param work\t\t\tOptional: a function to compute this future's value.\n\t\t@param useThreads\tWhether to run `work` on a background thread, where supported.\n\t\tIf false or if this isn't a system target, it will run immediately on the main thread.\n\t**/\n\tpublic function new(work:Void->T = null, useThreads:Bool = false)\n\t{\n\t\tif (work != null)\n\t\t{\n\t\t\t#if (lime_threads && !html5)\n\t\t\tif (useThreads)\n\t\t\t{\n\t\t\t\tvar promise = new Promise<T>();\n\t\t\t\tpromise.future = this;\n\n\t\t\t\tFutureWork.run(work, promise);\n\t\t\t}\n\t\t\telse\n\t\t\t#end\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvalue = work();\n\t\t\t\t\tisComplete = true;\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\terror = e;\n\t\t\t\t\tisError = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t\tCreate a new `Future` instance based on complete and (optionally) error and/or progress `Event` instances\n\t**/\n\tpublic static function ofEvents<T>(onComplete:Event<T->Void>, onError:Event<Dynamic->Void> = null, onProgress:Event<Int->Int->Void> = null):Future<T>\n\t{\n\t\tvar promise = new Promise<T>();\n\n\t\tonComplete.add(promise.complete, true);\n\t\tif (onError != null) onError.add(promise.error, true);\n\t\tif (onProgress != null) onProgress.add(promise.progress, true);\n\n\t\treturn promise.future;\n\t}\n\n\t/**\n\t\tRegister a listener for when the `Future` completes.\n\n\t\tIf the `Future` has already completed, this is called immediately with the result\n\t\t@param\tlistener\tA callback method to receive the result value\n\t\t@return\tThe current `Future`\n\t**/\n\tpublic function onComplete(listener:T->Void):Future<T>\n\t{\n\t\tif (listener != null)\n\t\t{\n\t\t\tif (isComplete)\n\t\t\t{\n\t\t\t\tlistener(value);\n\t\t\t}\n\t\t\telse if (!isError)\n\t\t\t{\n\t\t\t\tif (__completeListeners == null)\n\t\t\t\t{\n\t\t\t\t\t__completeListeners = new Array();\n\t\t\t\t}\n\n\t\t\t\t__completeListeners.push(listener);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tRegister a listener for when the `Future` ends with an error state.\n\n\t\tIf the `Future` has already ended with an error, this is called immediately with the error value\n\t\t@param\tlistener\tA callback method to receive the error value\n\t\t@return\tThe current `Future`\n\t**/\n\tpublic function onError(listener:Dynamic->Void):Future<T>\n\t{\n\t\tif (listener != null)\n\t\t{\n\t\t\tif (isError)\n\t\t\t{\n\t\t\t\tlistener(error);\n\t\t\t}\n\t\t\telse if (!isComplete)\n\t\t\t{\n\t\t\t\tif (__errorListeners == null)\n\t\t\t\t{\n\t\t\t\t\t__errorListeners = new Array();\n\t\t\t\t}\n\n\t\t\t\t__errorListeners.push(listener);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tRegister a listener for when the `Future` updates progress.\n\n\t\tIf the `Future` is already completed, this will not be called.\n\t\t@param\tlistener\tA callback method to receive the progress value\n\t\t@return\tThe current `Future`\n\t**/\n\tpublic function onProgress(listener:Int->Int->Void):Future<T>\n\t{\n\t\tif (listener != null)\n\t\t{\n\t\t\tif (__progressListeners == null)\n\t\t\t{\n\t\t\t\t__progressListeners = new Array();\n\t\t\t}\n\n\t\t\t__progressListeners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tAttempts to block on an asynchronous `Future`, returning when it is completed.\n\t\t@param\twaitTime\t(Optional) A timeout before this call will stop blocking\n\t\t@return\tThis current `Future`\n\t**/\n\tpublic function ready(waitTime:Int = -1):Future<T>\n\t{\n\t\t#if (lime_threads && !html5)\n\t\tif (isComplete || isError)\n\t\t{\n\t\t\treturn this;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar time = System.getTimer();\n\t\t\tvar end = time + waitTime;\n\n\t\t\twhile (!isComplete && !isError && time <= end && FutureWork.activeJobs > 0)\n\t\t\t{\n\t\t\t\t#if sys\n\t\t\t\tSys.sleep(0.01);\n\t\t\t\t#end\n\n\t\t\t\ttime = System.getTimer();\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t\t#else\n\t\treturn this;\n\t\t#end\n\t}\n\n\t/**\n\t\tAttempts to block on an asynchronous `Future`, returning the completion value when it is finished.\n\t\t@param\twaitTime\t(Optional) A timeout before this call will stop blocking\n\t\t@return\tThe completion value, or `null` if the request timed out or blocking is not possible\n\t**/\n\tpublic function result(waitTime:Int = -1):Null<T>\n\t{\n\t\tready(waitTime);\n\n\t\tif (isComplete)\n\t\t{\n\t\t\treturn value;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t\tChains two `Future` instances together, passing the result from the first\n\t\tas input for creating/returning a new `Future` instance of a new or the same type\n\t**/\n\tpublic function then<U>(next:T->Future<U>):Future<U>\n\t{\n\t\tif (isComplete)\n\t\t{\n\t\t\treturn next(value);\n\t\t}\n\t\telse if (isError)\n\t\t{\n\t\t\tvar future = new Future<U>();\n\t\t\tfuture.isError = true;\n\t\t\tfuture.error = error;\n\t\t\treturn future;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar promise = new Promise<U>();\n\n\t\t\tonError(promise.error);\n\t\t\tonProgress(promise.progress);\n\n\t\t\tonComplete(function(val)\n\t\t\t{\n\t\t\t\tvar future = next(val);\n\t\t\t\tfuture.onError(promise.error);\n\t\t\t\tfuture.onComplete(promise.complete);\n\t\t\t});\n\n\t\t\treturn promise.future;\n\t\t}\n\t}\n\n\t/**\n\t\tCreates a `Future` instance which has finished with an error value\n\t\t@param\terror\tThe error value to set\n\t\t@return\tA new `Future` instance\n\t**/\n\tpublic static function withError(error:Dynamic):Future<Dynamic>\n\t{\n\t\tvar future = new Future<Dynamic>();\n\t\tfuture.isError = true;\n\t\tfuture.error = error;\n\t\treturn future;\n\t}\n\n\t/**\n\t\tCreates a `Future` instance which has finished with a completion value\n\t\t@param\tvalue\tThe completion value to set\n\t\t@return\tA new `Future` instance\n\t**/\n\tpublic static function withValue<T>(value:T):Future<T>\n\t{\n\t\tvar future = new Future<T>();\n\t\tfuture.isComplete = true;\n\t\tfuture.value = value;\n\t\treturn future;\n\t}\n}\n\n#if (lime_threads && !html5)\n/**\n\tThe class that handles asynchronous `work` functions passed to `new Future()`.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:dox(hide) class FutureWork\n{\n\tprivate static var threadPool:ThreadPool;\n\tprivate static var promises:Map<Int, {complete:Dynamic->Dynamic, error:Dynamic->Dynamic}>;\n\n\tpublic static var minThreads(default, set):Int = 0;\n\tpublic static var maxThreads(default, set):Int = 1;\n\tpublic static var activeJobs(get, never):Int;\n\n\t@:allow(lime.app.Future)\n\tprivate static function run<T>(work:Void->T, promise:Promise<T>):Void\n\t{\n\t\tif (threadPool == null)\n\t\t{\n\t\t\tthreadPool = new ThreadPool(minThreads, maxThreads, MULTI_THREADED);\n\t\t\tthreadPool.onComplete.add(threadPool_onComplete);\n\t\t\tthreadPool.onError.add(threadPool_onError);\n\n\t\t\tpromises = new Map();\n\t\t}\n\n\t\tvar jobID:Int = threadPool.run(threadPool_doWork, work);\n\t\tpromises[jobID] = {complete: promise.complete, error: promise.error};\n\t}\n\n\t// Event Handlers\n\tprivate static function threadPool_doWork(work:Void->Dynamic, output:WorkOutput):Void\n\t{\n\t\ttry\n\t\t{\n\t\t\toutput.sendComplete(work());\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\toutput.sendError(e);\n\t\t}\n\t}\n\n\tprivate static function threadPool_onComplete(result:Dynamic):Void\n\t{\n\t\tvar promise = promises[threadPool.activeJob.id];\n\t\tpromises.remove(threadPool.activeJob.id);\n\t\tpromise.complete(result);\n\t}\n\n\tprivate static function threadPool_onError(error:Dynamic):Void\n\t{\n\t\tvar promise = promises[threadPool.activeJob.id];\n\t\tpromises.remove(threadPool.activeJob.id);\n\t\tpromise.error(error);\n\t}\n\n\t// Getters & Setters\n\t@:noCompletion private static inline function set_minThreads(value:Int):Int\n\t{\n\t\tif (threadPool != null)\n\t\t{\n\t\t\tthreadPool.minThreads = value;\n\t\t}\n\t\treturn minThreads = value;\n\t}\n\n\t@:noCompletion private static inline function set_maxThreads(value:Int):Int\n\t{\n\t\tif (threadPool != null)\n\t\t{\n\t\t\tthreadPool.maxThreads = value;\n\t\t}\n\t\treturn maxThreads = value;\n\t}\n\n\t@:noCompletion private static inline function get_activeJobs():Int\n\t{\n\t\treturn threadPool != null ? threadPool.activeJobs : 0;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/app/IModule.hx",
    "content": "package lime.app;\n\ninterface IModule\n{\n\t@:dox(show) @:noCompletion private function __registerLimeModule(application:Application):Void;\n\t@:dox(show) @:noCompletion private function __unregisterLimeModule(application:Application):Void;\n}\n"
  },
  {
    "path": "src/lime/app/Module.hx",
    "content": "package lime.app;\n\nimport lime.ui.Window;\nimport lime.utils.Preloader;\n\n/**\n\t`Module` instances can be added to a running `Application`,\n\tsimplifying support for adding new components, such as a renderer,\n\tinput handler or higher-level framework.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Module implements IModule\n{\n\t/**\n\t\tExit events are dispatched when the application is exiting\n\t**/\n\tpublic var onExit = new Event<Int->Void>();\n\n\t/**\n\t\tCreates a new `Module` instance\n\t**/\n\tpublic function new() {}\n\n\t@:noCompletion private function __registerLimeModule(application:Application):Void {}\n\n\t@:noCompletion private function __unregisterLimeModule(application:Application):Void {}\n}\n"
  },
  {
    "path": "src/lime/app/Promise.hx",
    "content": "package lime.app;\n\n/**\n\t`Promise` is an implementation of Futures and Promises, with the exception that\n\tin addition to \"success\" and \"failure\" states (represented as \"complete\" and \"error\"),\n\tLime `Future` introduces \"progress\" feedback as well to increase the value of\n\t`Future` values.\n\n\tWhile `Future` is meant to be read-only, `Promise` can be used to set the state of a future\n\tfor recipients of it's `Future` object. For example:\n\n\t```haxe\n\tfunction examplePromise ():Future<String> {\n\n\t\tvar promise = new Promise<String> ();\n\n\t\tvar progress = 0, total = 10;\n\t\tvar timer = new Timer (100);\n\t\ttimer.run = function () {\n\n\t\t\tpromise.progress (progress, total);\n\t\t\tprogress++;\n\n\t\t\tif (progress == total) {\n\n\t\t\t\tpromise.complete (\"Done!\");\n\t\t\t\ttimer.stop ();\n\n\t\t\t}\n\n\t\t};\n\n\t\treturn promise.future;\n\n\t}\n\n\tvar future = examplePromise ();\n\tfuture.onComplete (function (message) { trace (message); });\n\tfuture.onProgress (function (loaded, total) { trace (\"Progress: \" + loaded + \", \" + total); });\n\t```\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:allow(lime.app.Future)\n#if (!hl && !js && !macro)\n@:generic\n#end\nclass Promise<T>\n{\n\t/**\n\t\tThe `Future` associated with this `Promise`.\n\n\t\tAll subsequent calls to set an error, completion or progress state\n\t\twill update the status and notify listeners to this `Future`\n\t**/\n\tpublic var future(default, null):Future<T>;\n\n\t/**\n\t\tWhether the `Promise` (and related `Future`) has finished with a completion state.\n\t\tThis will be `false` if the `Promise` has not been resolved with a completion or error state.\n\t**/\n\tpublic var isComplete(get, never):Bool;\n\n\t/**\n\t\tWhether the `Promise` (and related `Future`) has finished with an error state.\n\t\tThis will be `false` if the `Promise` has not been resolved with a completion or error state.\n\t**/\n\tpublic var isError(get, never):Bool;\n\n\t#if commonjs\n\tprivate static function __init__()\n\t{\n\t\tvar p = untyped Promise.prototype;\n\t\tuntyped Object.defineProperties(p,\n\t\t\t{\n\t\t\t\t\"isComplete\": {get: p.get_isComplete},\n\t\t\t\t\"isError\": {get: p.get_isError}\n\t\t\t});\n\t}\n\t#end\n\n\t/**\n\t\tCreate a new `Promise` instance\n\t**/\n\tpublic function new()\n\t{\n\t\tfuture = new Future<T>();\n\t}\n\n\t/**\n\t\tResolves this `Promise` with a completion state\n\t\t@param\tdata\tThe completion value\n\t\t@return\tThe current `Promise`\n\t**/\n\tpublic function complete(data:T):Promise<T>\n\t{\n\t\tif (!future.isError)\n\t\t{\n\t\t\tfuture.isComplete = true;\n\t\t\tfuture.value = data;\n\n\t\t\tif (future.__completeListeners != null)\n\t\t\t{\n\t\t\t\tfor (listener in future.__completeListeners)\n\t\t\t\t{\n\t\t\t\t\tlistener(data);\n\t\t\t\t}\n\n\t\t\t\tfuture.__completeListeners = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tResolves this `Promise` with the complete, error and/or progress state\n\t\tof another `Future`\n\t\t@param\tfuture\tThe `Future` to use to resolve this `Promise`\n\t\t@return\tThe current `Promise`\n\t**/\n\tpublic function completeWith(future:Future<T>):Promise<T>\n\t{\n\t\tfuture.onComplete(complete);\n\t\tfuture.onError(error);\n\t\tfuture.onProgress(progress);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tResolves this `Promise` with an error state\n\t\t@param\tmsg\tThe error value\n\t\t@return\tThe current `Promise`\n\t**/\n\tpublic function error(msg:Dynamic):Promise<T>\n\t{\n\t\tif (!future.isComplete)\n\t\t{\n\t\t\tfuture.isError = true;\n\t\t\tfuture.error = msg;\n\n\t\t\tif (future.__errorListeners != null)\n\t\t\t{\n\t\t\t\tfor (listener in future.__errorListeners)\n\t\t\t\t{\n\t\t\t\t\tlistener(msg);\n\t\t\t\t}\n\n\t\t\t\tfuture.__errorListeners = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tSends progress updates to the related `Future`\n\t\t@param\tprogress\tA progress value\n\t\t@param\ttotal\tA total value. This should be equal or greater to the `progress` value\n\t\t@return\tThe current `Promise`\n\t**/\n\tpublic function progress(progress:Int, total:Int):Promise<T>\n\t{\n\t\tif (!future.isError && !future.isComplete)\n\t\t{\n\t\t\tif (future.__progressListeners != null)\n\t\t\t{\n\t\t\t\tfor (listener in future.__progressListeners)\n\t\t\t\t{\n\t\t\t\t\tlistener(progress, total);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_isComplete():Bool\n\t{\n\t\treturn future.isComplete;\n\t}\n\n\t@:noCompletion private inline function get_isError():Bool\n\t{\n\t\treturn future.isError;\n\t}\n}\n"
  },
  {
    "path": "src/lime/graphics/CairoRenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime.graphics.cairo.Cairo;\n\n/**\n\tThe `CairoRenderContext` represents the primary `lime.graphics.Cairo` instance when Cairo\n\tis the render context type of the `Window`.\n\n\tYou can convert from `lime.graphics.RenderContext` to `CairoRenderContext` directly\n\tif desired:\n\n\t```haxe\n\tvar cairo:CairoRenderContext = window.context;\n\t```\n**/\n@:access(lime.graphics.RenderContext)\n@:forward\n@:transitive\nabstract CairoRenderContext(Cairo) from Cairo to Cairo\n{\n\t@:from private static function fromRenderContext(context:RenderContext):CairoRenderContext\n\t{\n\t\treturn context.cairo;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/Canvas2DRenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_canvas)\n#if (lime_canvas && (lime_doc_gen || !doc_gen))\nimport js.html.CanvasRenderingContext2D;\n\n/**\n\tThe `Canvas2DRenderContext` represents the primary `js.html.CanvasRenderingContext2D` instance when Canvas\n\tis the render context type of the `Window`.\n\n\tYou can convert from `lime.graphics.RenderContext` to `Canvas2DRenderContext` directly\n\tif desired:\n\n\t```haxe\n\tvar ctx:CanvasRenderingContext2D = window.context;\n\t```\n**/\n@:access(lime.graphics.RenderContext)\n@:forward()\nabstract Canvas2DRenderContext(CanvasRenderingContext2D) from CanvasRenderingContext2D to CanvasRenderingContext2D\n{\n\t@:from private static function fromRenderContext(context:RenderContext):Canvas2DRenderContext\n\t{\n\t\treturn context.canvas2D;\n\t}\n}\n#else\n@:forward()\n@:transitive\nabstract Canvas2DRenderContext(Dynamic) from Dynamic to Dynamic\n{\n\t@:from private static function fromRenderContext(context:RenderContext):Canvas2DRenderContext\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/DOMRenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_dom)\n#if (lime_dom && (lime_doc_gen || !doc_gen))\nimport js.html.Element;\n\n/**\n\tThe `DOMRenderContext` represents the primary `js.html.Element` instance when DOM\n\tis the render context type of the `Window`.\n\n\tYou can convert from `lime.graphics.RenderContext` to `DOMRenderContext` directly\n\tif desired:\n\n\t```haxe\n\tvar dom:DOMRenderContext = window.context;\n\t```\n**/\n@:access(lime.graphics.RenderContext)\n@:forward\nabstract DOMRenderContext(Element) from Element to Element\n{\n\t@:from private static function fromRenderContext(context:RenderContext):DOMRenderContext\n\t{\n\t\treturn context.dom;\n\t}\n}\n#else\n@:forward\n@:transitive\nabstract DOMRenderContext(Dynamic) from Dynamic to Dynamic\n{\n\t@:from private static function fromRenderContext(context:RenderContext):DOMRenderContext\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/FlashRenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || flash)\n#if (flash && (lime_doc_gen || !doc_gen))\nimport flash.display.Sprite;\n\n/**\n\tThe `FlashRenderContext` represents the primary `flash.display.Sprite` instance when\n\ttargeting Flash Player.\n\n\tYou can convert from `lime.graphics.RenderContext` to `FlashRenderContext` directly\n\tif desired:\n\n\t```haxe\n\tvar sprite:FlashRenderContext = window.context;\n\t```\n**/\n@:access(lime.graphics.RenderContext)\n@:forward\nabstract FlashRenderContext(Sprite) from Sprite to Sprite\n{\n\t@:from private static function fromRenderContext(context:RenderContext):FlashRenderContext\n\t{\n\t\treturn context.flash;\n\t}\n}\n#else\n@:forward\n@:transitive\nabstract FlashRenderContext(Dynamic) from Dynamic to Dynamic\n{\n\t@:from private static function fromRenderContext(context:RenderContext):FlashRenderContext\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/Image.hx",
    "content": "package lime.graphics;\n\nimport haxe.io.Bytes;\nimport haxe.io.BytesData;\nimport haxe.io.BytesInput;\nimport haxe.io.BytesOutput;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime._internal.format.Base64;\nimport lime._internal.format.BMP;\nimport lime._internal.format.JPEG;\nimport lime._internal.format.PNG;\nimport lime._internal.graphics.ImageCanvasUtil;\nimport lime._internal.graphics.ImageDataUtil;\nimport lime.app.Application;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.math.ARGB;\nimport lime.math.BGRA;\nimport lime.math.ColorMatrix;\nimport lime.math.Rectangle;\nimport lime.math.RGBA;\nimport lime.math.Vector2;\nimport lime.net.HTTPRequest;\nimport lime.system.CFFI;\nimport lime.system.Endian;\nimport lime.system.System;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.BytePointer;\nimport lime.utils.Log;\nimport lime.utils.UInt8Array;\n#if (js && html5)\n#if !display\nimport lime._internal.backend.html5.HTML5HTTPRequest;\n#end\nimport js.Browser;\nimport js.html.CanvasElement;\nimport js.html.Image as JSImage;\nimport js.html.ImageElement;\nimport lime._internal.backend.html5.HTML5Thread;\n#elseif flash\nimport flash.display.Bitmap;\nimport flash.display.BitmapData;\nimport flash.display.Loader;\nimport flash.events.Event;\nimport flash.events.IOErrorEvent;\nimport flash.events.ProgressEvent;\nimport flash.geom.Matrix;\nimport flash.net.URLRequest;\nimport flash.system.LoaderContext;\nimport flash.utils.ByteArray;\n#end\n#if format\nimport format.png.Data;\nimport format.png.Reader;\nimport format.png.Tools;\nimport format.png.Writer;\nimport format.tools.Deflate;\n#if sys\nimport sys.io.File;\n#end\n#end\n\n/**\n\t`Image` is a convenience class for working with bitmap images in Lime.\n\n\tAlthough `ImageBuffer` holds the actual bitmap data, `Image` includes convenience methods for\n\tloading from files, loading from bytes, and performing many pixel operations over an\n\t`ImageBuffer` instance.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:autoBuild(lime._internal.macros.AssetsMacro.embedImage())\n@:access(lime._internal.backend.native.NativeCFFI)\n@:allow(lime._internal.graphics.ImageCanvasUtil)\n@:allow(lime._internal.graphics.ImageDataUtil)\n@:access(lime.app.Application)\n@:access(lime.math.ColorMatrix)\n@:access(lime.math.Rectangle)\n@:access(lime.math.Vector2)\n#if hl\n@:keep\n#end\n#if (js && html5 && !display)\n@:access(lime._internal.backend.html5.HTML5HTTPRequest)\n#end\nclass Image\n{\n\t/**\n\t\tThe `ImageBuffer` store that backs the `Image`\n\t**/\n\tpublic var buffer:ImageBuffer;\n\n\t/**\n\t\tRetrieves `UInt8Array` data from the `ImageBuffer`. If the `ImageBuffer`\n\t\tis not in a data format, it will be converted.\n\t**/\n\tpublic var data(get, set):UInt8Array;\n\n\t/**\n\t\tWhether the `Image` is dirty. This is set to `true` when pixel operations\n\t\thave been performed on the underlying `buffer`, and can be set to `false`\n\t\tagain by your own renderer.\n\t**/\n\tpublic var dirty:Bool;\n\n\t/**\n\t\tGet or set the `PixelFormat` for the underlying `ImageBuffer`. This can be\n\t\tused to convert the `ImageBuffer` to a new format.\n\t**/\n\tpublic var format(get, set):PixelFormat;\n\n\t/**\n\t\tThe logical height of the `Image`. This can be smaller than the `height`\n\t\tof the underlying `buffer`.\n\t**/\n\tpublic var height:Int;\n\n\t/**\n\t\tThe offset X position of the `Image`, from the source `buffer`,\n\t\twhen the `Image` is smaller than the full size of the source `buffer`\n\t**/\n\tpublic var offsetX:Int;\n\n\t/**\n\t\tThe offset Y position of the `Image`, from the source `buffer`,\n\t\twhen the `Image` is smaller than the full size of the source `buffer`\n\t**/\n\tpublic var offsetY:Int;\n\n\t/**\n\t\tGet or set whether the `ImageBuffer` dimensions are both a power-of-two\n\t\t(such as 2, 4, 8, 16, so on). Setting this value may resize the underlying\n\t\t`buffer`\n\t**/\n\tpublic var powerOfTwo(get, set):Bool;\n\n\t/**\n\t\tGet or set whether this `Image` has premultiplied alpha. Setting this value\n\t\tmay multiply or unmultiply data if the underlying `ImageBuffer` uses a\n\t\tdifferent format.\n\t**/\n\tpublic var premultiplied(get, set):Bool;\n\n\t/**\n\t\tThe offset, width and height of this image as a `Rectangle`\n\t**/\n\tpublic var rect(get, null):Rectangle;\n\n\t/**\n\t\tA higher-level representation of the source `ImageBuffer`. This might be an\n\t\tHTML5 Image, CanvasElement or a Flash BitmapData instance.\n\t**/\n\tpublic var src(get, set):Dynamic;\n\n\t/**\n\t\tGet or set whether the underlying `ImageBuffer` is transparent.\n\t**/\n\tpublic var transparent(get, set):Bool;\n\n\t/**\n\t\tThe current `ImageType`, representing what is being used to store the `Image`'s graphics\n\t**/\n\tpublic var type:ImageType;\n\n\t/**\n\t\tThe `version` of the `Image` increases each time it is modified, helpful to determining\n\t\twhether a cache is out-of-date.\n\t**/\n\tpublic var version:Int;\n\n\t/**\n\t\tThe logical width of the `Image`. This can be smaller than the `width`\n\t\tof the underlying `buffer`.\n\t**/\n\tpublic var width:Int;\n\n\t/**\n\t\tA convenience property, unused internally, which may be helpful for different renderer\n\t\timplementations\n\t**/\n\tpublic var x:Float;\n\n\t/**\n\t\tA convenience property, unused internally, which may be helpful for different renderer\n\t\timplementations\n\t**/\n\tpublic var y:Float;\n\n\t#if commonjs\n\tprivate static function __init__()\n\t{\n\t\tvar p = untyped Image.prototype;\n\t\tuntyped Object.defineProperties(p,\n\t\t\t{\n\t\t\t\t\"data\": {get: p.get_data, set: p.set_data},\n\t\t\t\t\"format\": {get: p.get_format, set: p.set_format},\n\t\t\t\t\"powerOfTwo\": {get: p.get_powerOfTwo, set: p.set_powerOfTwo},\n\t\t\t\t\"premultiplied\": {get: p.get_premultiplied, set: p.set_premultiplied},\n\t\t\t\t\"rect\": {get: p.get_rect},\n\t\t\t\t\"src\": {get: p.get_src, set: p.set_src},\n\t\t\t\t\"transparent\": {get: p.get_transparent, set: p.set_transparent}\n\t\t\t});\n\t}\n\t#end\n\n\t/**\n\t\tCreates a new `Image` instance.\n\n\t\tIf `buffer` is null, but `width` and `height` are set, a new `ImageBuffer` is allocated matching the `color` requested.\n\t\t@param\tbuffer\t(Optional) The `ImageBuffer` this `Image` represents\n\t\t@param\toffsetX\t(Optional) A logical offset value within the `ImageBuffer` dimensions\n\t\t@param\toffsetY\t(Optional) A logical offset value within the `ImageBuffer` dimensions\n\t\t@param\twidth\t(Optional) A logical width value within the `ImageBuffer` dimensions\n\t\t@param\theight\t(Optional) A logical height value within the `ImageBuffer` dimensions\n\t\t@param\tcolor\t(Optional) A fill color to use if the `buffer` property is `null`\n\t\t@param\ttype\t(Optional) An `ImageType` to use for this `Image`\n\t**/\n\tpublic function new(buffer:ImageBuffer = null, offsetX:Int = 0, offsetY:Int = 0, width:Int = -1, height:Int = -1, color:Null<Int> = null,\n\t\t\ttype:ImageType = null)\n\t{\n\t\tthis.offsetX = offsetX;\n\t\tthis.offsetY = offsetY;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tversion = 0;\n\n\t\tif (type == null)\n\t\t{\n\t\t\t#if (js && html5)\n\t\t\ttype = CANVAS;\n\n\t\t\t#if lime_threads\n\t\t\tif (HTML5Thread.current().isWorker())\n\t\t\t{\n\t\t\t\ttype = DATA;\n\t\t\t}\n\t\t\t#end\n\t\t\t#elseif flash\n\t\t\ttype = FLASH;\n\t\t\t#else\n\t\t\ttype = DATA;\n\t\t\t#end\n\t\t}\n\n\t\tthis.type = type;\n\n\t\tif (buffer == null)\n\t\t{\n\t\t\tif (width > 0 && height > 0)\n\t\t\t{\n\t\t\t\tswitch (this.type)\n\t\t\t\t{\n\t\t\t\t\tcase CANVAS:\n\t\t\t\t\t\tthis.buffer = new ImageBuffer(null, width, height);\n\t\t\t\t\t\tImageCanvasUtil.createCanvas(this, width, height);\n\n\t\t\t\t\t\tif (color != null && color != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfillRect(new Rectangle(0, 0, width, height), color);\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase DATA:\n\t\t\t\t\t\tthis.buffer = new ImageBuffer(new UInt8Array(width * height * 4), width, height);\n\n\t\t\t\t\t\tif (color != null && color != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfillRect(new Rectangle(0, 0, width, height), color);\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase FLASH:\n\t\t\t\t\t\t#if flash\n\t\t\t\t\t\tthis.buffer = new ImageBuffer(null, width, height);\n\t\t\t\t\t\tthis.buffer.src = new BitmapData(width, height, true, ((color & 0xFF) << 24) | (color >> 8));\n\t\t\t\t\t\t#end\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t__fromImageBuffer(buffer);\n\t\t}\n\t}\n\n\t/**\n\t\tCreates a duplicate copy of this `Image` and `ImageBuffer`\n\t\t@return\tA new `Image` instance\n\t**/\n\tpublic function clone():Image\n\t{\n\t\tif (buffer != null)\n\t\t{\n\t\t\t#if (js && html5)\n\t\t\tif (type == CANVAS)\n\t\t\t{\n\t\t\t\tImageCanvasUtil.convertToCanvas(this);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t}\n\t\t\t#end\n\n\t\t\tvar image = new Image(buffer.clone(), offsetX, offsetY, width, height, null, type);\n\t\t\timage.version = version;\n\t\t\treturn image;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn new Image(null, offsetX, offsetY, width, height, null, type);\n\t\t}\n\t}\n\n\t/**\n\t\tApplies a color transform to the underlying `ImageBuffer` data\n\t\t@param\trect\tThe target rectangle to transform\n\t\t@param\tcolorMatrix\tA `ColorMatrix` for color offset and/or multiplication\n\t**/\n\tpublic function colorTransform(rect:Rectangle, colorMatrix:ColorMatrix):Void\n\t{\n\t\trect = __clipRect(rect);\n\t\tif (buffer == null || rect == null) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.colorTransform(this, rect, colorMatrix);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.colorTransform(this, rect, colorMatrix);\n\n\t\t\tcase FLASH:\n\t\t\t\trect.offset(offsetX, offsetY);\n\t\t\t\tbuffer.__srcBitmapData.colorTransform(rect.__toFlashRectangle(), colorMatrix.__toFlashColorTransform());\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tCopy a color channel from one `Image` to another. This can also be within the same `Image` instance.\n\t\t@param\tsourceImage\tThe `Image` to copy from\n\t\t@param\tsourceRect\tThe source rectangle to copy from in the `sourceImage`\n\t\t@param\tdestPoint\tThe destination point to apply the channel in the current `Image`\n\t\t@param\tsourceChannel\tThe source color channel to copy the data from\n\t\t@param\tdestChannel\tThe destination color channel to apply the data into\n\t**/\n\tpublic function copyChannel(sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, sourceChannel:ImageChannel, destChannel:ImageChannel):Void\n\t{\n\t\tsourceRect = __clipRect(sourceRect);\n\t\tif (buffer == null || sourceRect == null) return;\n\t\tif (destChannel == ALPHA && !transparent) return;\n\t\tif (sourceRect.width <= 0 || sourceRect.height <= 0) return;\n\t\tif (sourceRect.x + sourceRect.width > sourceImage.width) sourceRect.width = sourceImage.width - sourceRect.x;\n\t\tif (sourceRect.y + sourceRect.height > sourceImage.height) sourceRect.height = sourceImage.height - sourceRect.y;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.copyChannel(this, sourceImage, sourceRect, destPoint, sourceChannel, destChannel);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\tImageCanvasUtil.convertToData(sourceImage);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.copyChannel(this, sourceImage, sourceRect, destPoint, sourceChannel, destChannel);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar srcChannel = switch (sourceChannel)\n\t\t\t\t{\n\t\t\t\t\tcase RED: 1;\n\t\t\t\t\tcase GREEN: 2;\n\t\t\t\t\tcase BLUE: 4;\n\t\t\t\t\tcase ALPHA: 8;\n\t\t\t\t}\n\n\t\t\t\tvar dstChannel = switch (destChannel)\n\t\t\t\t{\n\t\t\t\t\tcase RED: 1;\n\t\t\t\t\tcase GREEN: 2;\n\t\t\t\t\tcase BLUE: 4;\n\t\t\t\t\tcase ALPHA: 8;\n\t\t\t\t}\n\n\t\t\t\tsourceRect.offset(sourceImage.offsetX, sourceImage.offsetY);\n\t\t\t\tdestPoint.offset(offsetX, offsetY);\n\n\t\t\t\tbuffer.__srcBitmapData.copyChannel(sourceImage.buffer.src, sourceRect.__toFlashRectangle(), destPoint.__toFlashPoint(), srcChannel,\n\t\t\t\t\tdstChannel);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tCopies pixels from one `Image` to another. The source `Image` can also be this `Image`\n\t\t@param\tsourceImage\tThe source `Image` to copy from\n\t\t@param\tsourceRect\tThe source rectangle to use when copying\n\t\t@param\tdestPoint\tThe destination point to use when copying\n\t\t@param\talphaImage\t(Optional) A different `Image` to use as the alpha channel while copying\n\t\t@param\talphaPoint\t(Optional) A point in the alpha image to use when copying\n\t\t@param\tmergeAlpha\t(Optional) Whether to blend the source and destination alpha (`true`), or to replace the destination alpha (`false`)\n\t**/\n\tpublic function copyPixels(sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, alphaImage:Image = null, alphaPoint:Vector2 = null,\n\t\t\tmergeAlpha:Bool = false):Void\n\t{\n\t\tif (buffer == null || sourceImage == null) return;\n\t\tif (sourceRect.width <= 0 || sourceRect.height <= 0) return;\n\t\tif (width <= 0 || height <= 0) return;\n\n\t\tif (sourceRect.x + sourceRect.width > sourceImage.width) sourceRect.width = sourceImage.width - sourceRect.x;\n\t\tif (sourceRect.y + sourceRect.height > sourceImage.height) sourceRect.height = sourceImage.height - sourceRect.y;\n\n\t\tif (sourceRect.x < 0)\n\t\t{\n\t\t\tsourceRect.width += sourceRect.x;\n\t\t\tsourceRect.x = 0;\n\t\t}\n\n\t\tif (sourceRect.y < 0)\n\t\t{\n\t\t\tsourceRect.height += sourceRect.y;\n\t\t\tsourceRect.y = 0;\n\t\t}\n\n\t\tif (destPoint.x + sourceRect.width > width) sourceRect.width = width - destPoint.x;\n\t\tif (destPoint.y + sourceRect.height > height) sourceRect.height = height - destPoint.y;\n\n\t\tif (destPoint.x < 0)\n\t\t{\n\t\t\tsourceRect.width += destPoint.x;\n\t\t\tsourceRect.x -= destPoint.x;\n\t\t\tdestPoint.x = 0;\n\t\t}\n\n\t\tif (destPoint.y < 0)\n\t\t{\n\t\t\tsourceRect.height += destPoint.y;\n\t\t\tsourceRect.y -= destPoint.y;\n\t\t\tdestPoint.y = 0;\n\t\t}\n\n\t\tif (sourceImage == this && destPoint.x < sourceRect.right && destPoint.y < sourceRect.bottom)\n\t\t{\n\t\t\t// TODO: Optimize further?\n\t\t\tsourceImage = clone();\n\t\t}\n\n\t\tif (alphaImage == sourceImage && (alphaPoint == null || (alphaPoint.x == 0 && alphaPoint.y == 0)))\n\t\t{\n\t\t\talphaImage = null;\n\t\t\talphaPoint = null;\n\t\t}\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tif (alphaImage != null)\n\t\t\t\t{\n\t\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t\tImageCanvasUtil.convertToData(sourceImage);\n\t\t\t\t\tif (alphaImage != null) ImageCanvasUtil.convertToData(alphaImage);\n\n\t\t\t\t\tImageDataUtil.copyPixels(this, sourceImage, sourceRect, destPoint, alphaImage, alphaPoint, mergeAlpha);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tImageCanvasUtil.convertToCanvas(this);\n\t\t\t\t\tImageCanvasUtil.convertToCanvas(sourceImage);\n\t\t\t\t\tImageCanvasUtil.copyPixels(this, sourceImage, sourceRect, destPoint, alphaImage, alphaPoint, mergeAlpha);\n\t\t\t\t}\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\tImageCanvasUtil.convertToData(sourceImage);\n\t\t\t\tif (alphaImage != null) ImageCanvasUtil.convertToData(alphaImage);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.copyPixels(this, sourceImage, sourceRect, destPoint, alphaImage, alphaPoint, mergeAlpha);\n\n\t\t\tcase FLASH:\n\t\t\t\tsourceRect.offset(sourceImage.offsetX, sourceImage.offsetY);\n\t\t\t\tdestPoint.offset(offsetX, offsetY);\n\n\t\t\t\tif (alphaImage != null && alphaPoint != null)\n\t\t\t\t{\n\t\t\t\t\talphaPoint.offset(alphaImage.offsetX, alphaImage.offsetY);\n\t\t\t\t}\n\n\t\t\t\tbuffer.__srcBitmapData.copyPixels(sourceImage.buffer.__srcBitmapData, sourceRect.__toFlashRectangle(), destPoint.__toFlashPoint(),\n\t\t\t\t\talphaImage != null ? alphaImage.buffer.src : null, alphaPoint != null ? alphaPoint.__toFlashPoint() : null, mergeAlpha);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tEncodes this `Image` into an image file format, such as PNG or JPEG.\n\t\t@param\tformat\t(Optional) An `ImageFileFormat` to encode into (default is `PNG`)\n\t\t@param\tquality\t(Optional) A quality value to use when encoding as JPEG (from 0 to 100)\n\t\t@return\t`Bytes` for the encoded `Image`, or `null` if encoding was not successful\n\t**/\n\tpublic function encode(format:ImageFileFormat = null, quality:Int = 90):Bytes\n\t{\n\t\tswitch (format)\n\t\t{\n\t\t\tcase null, ImageFileFormat.PNG:\n\t\t\t\treturn PNG.encode(this);\n\n\t\t\tcase ImageFileFormat.JPEG:\n\t\t\t\treturn JPEG.encode(this, quality);\n\n\t\t\tcase ImageFileFormat.BMP:\n\t\t\t\treturn BMP.encode(this);\n\n\t\t\tdefault:\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t\tFill a rectangle in the `Image` with a solid color\n\t\t@param\trect\tA destination rectangle in this `Image` to fill\n\t\t@param\tcolor\tThe color to use when filling this `Image`\n\t\t@param\tformat\t(Optional) The `PixelFormat` that `color` is encoded in (default is `RGBA`)\n\t**/\n\tpublic function fillRect(rect:Rectangle, color:Int, format:PixelFormat = null):Void\n\t{\n\t\trect = __clipRect(rect);\n\t\tif (buffer == null || rect == null) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.fillRect(this, rect, color, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\tif (buffer.data.length == 0) return;\n\n\t\t\t\tImageDataUtil.fillRect(this, rect, color, format);\n\n\t\t\tcase FLASH:\n\t\t\t\trect.offset(offsetX, offsetY);\n\n\t\t\t\tvar argb:ARGB = switch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: color;\n\t\t\t\t\tcase BGRA32: (color : BGRA);\n\t\t\t\t\tdefault: (color : RGBA);\n\t\t\t\t}\n\n\t\t\t\tbuffer.__srcBitmapData.fillRect(rect.__toFlashRectangle(), argb);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tApplies a flood fill to this `Image`, starting with the point specified.\n\n\t\tA flood fill behaves similarly to the \"paint can\" tool in many image editors,\n\t\tthe fill will apply the chosen color to neighboring pixels of the same color.\n\t\t@param\tx\tThe target x coordinate within the `Image` to use with the fill\n\t\t@param\ty\tThe target y coordinate within the `Image` to use with the fill\n\t\t@param\tcolor\tThe color to use when performing the fill\n\t\t@param\tformat\t(Optional) The `PixelFormat` that `color` is encoded in (default is `RGBA`)\n\t**/\n\tpublic function floodFill(x:Int, y:Int, color:Int, format:PixelFormat = null):Void\n\t{\n\t\tif (buffer == null) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.floodFill(this, x, y, color, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.floodFill(this, x, y, color, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar argb:ARGB = switch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: color;\n\t\t\t\t\tcase BGRA32: (color : BGRA);\n\t\t\t\t\tdefault: (color : RGBA);\n\t\t\t\t}\n\n\t\t\t\tbuffer.__srcBitmapData.floodFill(x + offsetX, y + offsetY, argb);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tConverts a Base64-encoded `String` into an `Image`, or returns `null` if this is not possible\n\t\t@param\tbase64\tA Base64-encoded `String`\n\t\t@param\ttype\tA mime-type to describe the image data (such as \"image/png\")\n\t\t@return\tA new `Image`, or `null` if conversion was not possible\n\t**/\n\tpublic static function fromBase64(base64:String, type:String):Image\n\t{\n\t\tif (base64 == null) return null;\n\t\tvar image = new Image();\n\t\timage.__fromBase64(base64, type);\n\t\treturn image;\n\t}\n\n\t#if (!lime_doc_gen || flash)\n\t/**\n\t\tCreates a new `Image` from a Flash `BitmapData` instance\n\t\t@param\tbitmapData\tA source `bitmapData` to use\n\t\t@return\t\tA new `Image` instance\n\t**/\n\tpublic static function fromBitmapData(bitmapData:#if flash BitmapData #else Dynamic #end):Image\n\t{\n\t\tif (bitmapData == null) return null;\n\t\t#if flash\n\t\tvar buffer = new ImageBuffer(null, bitmapData.width, bitmapData.height);\n\t\tbuffer.__srcBitmapData = bitmapData;\n\t\tbuffer.transparent = bitmapData.transparent;\n\t\treturn new Image(buffer);\n\t\t#else\n\t\treturn bitmapData.image;\n\t\t#end\n\t}\n\t#end\n\n\t/**\n\t\tConverts a `Bytes` object to an `Image` instance\n\n\t\tSome platforms (such as Flash and HTML5) cannot convert `Bytes` to an\n\t\t`Image` synchronously, and may not work properly.\n\n\t\t`Image.loadFromBytes` works asynchronously, and should work\n\t\tconsistently on all platforms.\n\t\t@param\tbytes\tA `Bytes` holding encoded image data\n\t\t@return\tA new `Image` instance\n\t**/\n\tpublic static function fromBytes(bytes:Bytes):Image\n\t{\n\t\tif (bytes == null) return null;\n\t\tvar image = new Image();\n\t\tif (image.__fromBytes(bytes))\n\t\t{\n\t\t\treturn image;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t#if (!lime_doc_gen || lime_canvas)\n\t/**\n\t\tConverts an `js.html.CanvasElement` instance to an `Image`\n\t\t@param\tcanvas\tA `CanvasElement`\n\t\t@return\tA new `Image` instance\n\t**/\n\tpublic static function fromCanvas(canvas:#if (js && html5) CanvasElement #else Dynamic #end):Image\n\t{\n\t\tif (canvas == null) return null;\n\t\tvar buffer = new ImageBuffer(null, canvas.width, canvas.height);\n\t\tbuffer.src = canvas;\n\t\tvar image = new Image(buffer);\n\n\t\timage.type = CANVAS;\n\t\treturn image;\n\t}\n\t#end\n\n\t/**\n\t\tLoads an `Image` from a path synchronously.\n\n\t\tSome platforms, such as Flash and HTML5, cannot load\n\t\timages synchronously.\n\n\t\t`Image.loadFromFile` works asynchronously, and should\n\t\tbehave consistently on all platforms.\n\t\t@param\tpath\tThe source file path or URL of an encoded image file\n\t\t@return\tA new `Image` instance\n\t**/\n\tpublic static function fromFile(path:String):Image\n\t{\n\t\tif (path == null) return null;\n\t\tvar image = new Image();\n\t\tif (image.__fromFile(path))\n\t\t{\n\t\t\treturn image;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t#if (!lime_doc_gen || (js && html5))\n\t/**\n\t\tConverts a `js.html.Image` instance to an `Image`\n\t\t@param\timage\tAn `ImageElement` instance\n\t\t@return\tA new `Image` instance\n\t**/\n\tpublic static function fromImageElement(image:#if (js && html5) ImageElement #else Dynamic #end):Image\n\t{\n\t\tif (image == null) return null;\n\t\tvar buffer = new ImageBuffer(null, image.width, image.height);\n\t\tbuffer.src = image;\n\t\tvar _image = new Image(buffer);\n\n\t\t_image.type = CANVAS;\n\t\treturn _image;\n\t}\n\t#end\n\n\t/**\n\t\tFinds a region in the `Image` that includes pixels all of a certain color (when `findColor` is `true`) or\n\t\texcludes a certain color (`findColor` is `false`)\n\t\t@param\tmask\tA hexadecimal mask to use when comparing colors. You can use this to compare all of a color, or only certain color channels\n\t\t@param\tcolor\tThe color value to use in comparisons\n\t\t@param\tfindColor\t(Optional) Whether to find a region that does match the color (`true`) or excludes it (`false`)\n\t\t@param\tformat\t(Optional) The `PixelFormat` that the `color` and `mask` are encoded in (default is `RGBA`)\n\t\t@return\tThe matching bounds `Rectangle`, or `null` if no matching region is found\n\t**/\n\tpublic function getColorBoundsRect(mask:Int, color:Int, findColor:Bool = true, format:PixelFormat = null):Rectangle\n\t{\n\t\tif (buffer == null) return null;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\treturn ImageDataUtil.getColorBoundsRect(this, mask, color, findColor, format);\n\n\t\t\tcase DATA:\n\t\t\t\treturn ImageDataUtil.getColorBoundsRect(this, mask, color, findColor, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar rect = buffer.__srcBitmapData.getColorBoundsRect(mask, color, findColor);\n\t\t\t\treturn new Rectangle(rect.x, rect.y, rect.width, rect.height);\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t\tGets a 24-bit pixel from the `Image` (red, green and blue, but no alpha)\n\t\t@param\tx\tThe `x` location to fetch\n\t\t@param\ty\tThe `y` location to fetch\n\t\t@param\tformat\t(Optional) The `PixelFormat` to encode the return value in (default is `RGBA`)\n\t\t@return\tThe specified pixel, or `0` if it is out-of-bounds\n\t**/\n\tpublic function getPixel(x:Int, y:Int, format:PixelFormat = null):Int\n\t{\n\t\tif (buffer == null || x < 0 || y < 0 || x >= width || y >= height) return 0;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\treturn ImageCanvasUtil.getPixel(this, x, y, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\treturn ImageDataUtil.getPixel(this, x, y, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar color:ARGB = buffer.__srcBitmapData.getPixel(x + offsetX, y + offsetY);\n\n\t\t\t\tswitch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: return color;\n\t\t\t\t\tcase BGRA32:\n\t\t\t\t\t\tvar bgra:BGRA = color;\n\t\t\t\t\t\treturn bgra;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar rgba:RGBA = color;\n\t\t\t\t\t\treturn rgba;\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t\tGets a 32-bit pixel from the `Image`, including alpha\n\t\t@param\tx\tThe `x` location to fetch\n\t\t@param\ty\tThe `y` location to fetch\n\t\t@param\tformat\t(Optional) The `PixelFormat` to encode the return value in (default is `RGBA`)\n\t\t@return\tThe specified pixel, or `0` if it is out-of-bounds\n\t**/\n\tpublic function getPixel32(x:Int, y:Int, format:PixelFormat = null):Int\n\t{\n\t\tif (buffer == null || x < 0 || y < 0 || x >= width || y >= height) return 0;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\treturn ImageCanvasUtil.getPixel32(this, x, y, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\treturn ImageDataUtil.getPixel32(this, x, y, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar color:ARGB = buffer.__srcBitmapData.getPixel32(x + offsetX, y + offsetY);\n\n\t\t\t\tswitch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: return color;\n\t\t\t\t\tcase BGRA32:\n\t\t\t\t\t\tvar bgra:BGRA = color;\n\t\t\t\t\t\treturn bgra;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar rgba:RGBA = color;\n\t\t\t\t\t\treturn rgba;\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t\tGets a region of pixels from the `Image`, as `Bytes`\n\t\t@param\trect\tThe source `Rectangle` to read from\n\t\t@param\tformat\t(Optional) The `PixelFormat` to use when writing to the `Bytes` object (default is `RGBA`)\n\t\t@return\tA `Bytes` object representing the region, or `null` if it is not possible to read\n\t**/\n\tpublic function getPixels(rect:Rectangle, format:PixelFormat = null):Bytes\n\t{\n\t\tif (buffer == null) return null;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\treturn ImageCanvasUtil.getPixels(this, rect, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\treturn ImageDataUtil.getPixels(this, rect, format);\n\n\t\t\tcase FLASH:\n\t\t\t\t#if flash\n\t\t\t\trect.offset(offsetX, offsetY);\n\t\t\t\tvar byteArray:ByteArray = buffer.__srcBitmapData.getPixels(rect.__toFlashRectangle());\n\n\t\t\t\tswitch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: // do nothing\n\t\t\t\t\tcase BGRA32:\n\t\t\t\t\t\tvar color:BGRA;\n\t\t\t\t\t\tvar length = Std.int(byteArray.length / 4);\n\n\t\t\t\t\t\tfor (i in 0...length)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor = (byteArray.readUnsignedInt() : ARGB);\n\t\t\t\t\t\t\tbyteArray.position -= 4;\n\t\t\t\t\t\t\tbyteArray.writeUnsignedInt(color);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbyteArray.position = 0;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar color:RGBA;\n\t\t\t\t\t\tvar length = Std.int(byteArray.length / 4);\n\n\t\t\t\t\t\tfor (i in 0...length)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor = (byteArray.readUnsignedInt() : ARGB);\n\t\t\t\t\t\t\tbyteArray.position -= 4;\n\t\t\t\t\t\t\tbyteArray.writeUnsignedInt(color);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbyteArray.position = 0;\n\t\t\t\t}\n\n\t\t\t\treturn Bytes.ofData(byteArray);\n\t\t\t\t#else\n\t\t\t\treturn null;\n\t\t\t\t#end\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t\tCreates a new `Image` instance from a Base64-encoded `String`, asynchronously\n\t\t@param\tbase64\tA Base64-encoded string representing encoded image data\n\t\t@param\ttype\tThe mime type of the encoded data (such as \"image/png\")\n\t\t@return\tA `Future` to return a new `Image` instance\n\t**/\n\tpublic static function loadFromBase64(base64:String, type:String):Future<Image>\n\t{\n\t\tif (base64 == null || type == null) return Future.withValue(null);\n\n\t\t#if (js && html5 && !display)\n\t\treturn HTML5HTTPRequest.loadImage(\"data:\" + type + \";base64,\" + base64);\n\t\t#else\n\t\tif (base64 != null)\n\t\t{\n\t\t\treturn loadFromBytes(Base64.decode(base64));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn cast Future.withError(\"\");\n\t\t}\n\t\t#end\n\t}\n\n\t/**\n\t\tCreates a new `Image` instance from image-encoded `Bytes`, loaded asynchronously\n\t\t@param\tbytes\tA `Bytes` instance\n\t\t@return\tA `Future` to return a new `Image` instance\n\t**/\n\tpublic static function loadFromBytes(bytes:Bytes):Future<Image>\n\t{\n\t\tif (bytes == null) return Future.withValue(null);\n\n\t\t#if (js && html5)\n\t\tvar type = \"\";\n\n\t\tif (__isPNG(bytes))\n\t\t{\n\t\t\ttype = \"image/png\";\n\t\t}\n\t\telse if (__isJPG(bytes))\n\t\t{\n\t\t\ttype = \"image/jpeg\";\n\t\t}\n\t\telse if (__isGIF(bytes))\n\t\t{\n\t\t\ttype = \"image/gif\";\n\t\t}\n\t\telse if (__isWebP(bytes))\n\t\t{\n\t\t\ttype = \"image/webp\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// throw \"Image tried to read PNG/JPG Bytes, but found an invalid header.\";\n\t\t\treturn Future.withValue(null);\n\t\t}\n\t\t#if !display\n\t\treturn HTML5HTTPRequest.loadImageFromBytes(bytes, type);\n\t\t#else\n\t\treturn loadFromBase64(Base64.encode(bytes), type);\n\t\t#end\n\t\t#elseif flash\n\t\tvar promise = new Promise<Image>();\n\n\t\tvar loader = new Loader();\n\n\t\tloader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(event)\n\t\t{\n\t\t\tpromise.complete(Image.fromBitmapData(cast(loader.content, Bitmap).bitmapData));\n\t\t});\n\n\t\tloader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, function(event)\n\t\t{\n\t\t\tpromise.progress(Std.int(event.bytesLoaded), Std.int(event.bytesTotal));\n\t\t});\n\n\t\tloader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(event)\n\t\t{\n\t\t\tpromise.error(event.errorID);\n\t\t});\n\n\t\tloader.loadBytes(bytes.getData());\n\n\t\treturn promise.future;\n\t\t#else\n\t\treturn new Future(fromBytes.bind(bytes), true);\n\t\t#end\n\t}\n\n\t/**\n\t\tCreates a new `Image` instance from a file path or URL, loaded asynchronously\n\t\t@param\tpath\tA file path or URL containing an encoded image\n\t\t@return\tA `Future` to return a new `Image` instance\n\t**/\n\tpublic static function loadFromFile(path:String):Future<Image>\n\t{\n\t\tif (path == null) return Future.withValue(null);\n\n\t\t#if (js && html5 && !display)\n\t\treturn HTML5HTTPRequest.loadImage(path);\n\t\t#elseif flash\n\t\tvar promise = new Promise<Image>();\n\n\t\tvar loader = new Loader();\n\n\t\tloader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(event)\n\t\t{\n\t\t\tpromise.complete(Image.fromBitmapData(cast(loader.content, Bitmap).bitmapData));\n\t\t});\n\n\t\tloader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, function(event)\n\t\t{\n\t\t\tpromise.progress(Std.int(event.bytesLoaded), Std.int(event.bytesTotal));\n\t\t});\n\n\t\tloader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(event)\n\t\t{\n\t\t\tpromise.error(event.errorID);\n\t\t});\n\n\t\tloader.load(new URLRequest(path), new LoaderContext(true));\n\n\t\treturn promise.future;\n\t\t#else\n\t\tvar request = new HTTPRequest<Image>();\n\t\treturn request.load(path).then(function(image)\n\t\t{\n\t\t\tif (image != null)\n\t\t\t{\n\t\t\t\treturn Future.withValue(image);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn cast Future.withError(\"\");\n\t\t\t}\n\t\t});\n\t\t#end\n\t}\n\n\t/**\n\t\tBlits a second `Image` onto this one, using optional color multipliers\n\t\t@param\tsourceImage\tAn `Image` instance to copy from\n\t\t@param\tsourceRect\tThe source rectangle to use when copying\n\t\t@param\tdestPoint\tThe destination point in this `Image` to copy into\n\t\t@param\tredMultiplier\tA red multiplier to use when blitting\n\t\t@param\tgreenMultiplier\tA green multiplier to use when blitting\n\t\t@param\tblueMultiplier\tA blue multiplier to use when blitting\n\t\t@param\talphaMultiplier\tAn alpha multiplier to use when blitting\n\t**/\n\tpublic function merge(sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, redMultiplier:Int, greenMultiplier:Int, blueMultiplier:Int,\n\t\t\talphaMultiplier:Int):Void\n\t{\n\t\tif (buffer == null || sourceImage == null) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.convertToCanvas(this);\n\t\t\t\tImageCanvasUtil.merge(this, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\tImageCanvasUtil.convertToData(sourceImage);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.merge(this, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier);\n\n\t\t\tcase FLASH:\n\t\t\t\tsourceRect.offset(offsetX, offsetY);\n\t\t\t\tbuffer.__srcBitmapData.merge(sourceImage.buffer.__srcBitmapData, sourceRect.__toFlashRectangle(), destPoint.__toFlashPoint(), redMultiplier,\n\t\t\t\t\tgreenMultiplier, blueMultiplier, alphaMultiplier);\n\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t\tResizes the current `Image`, reallocating the `ImageBuffer` to a new size.\n\t\tThe resize algorithm for most platforms is bilinear.\n\t\t@param\tnewWidth\tA new width for the `Image`\n\t\t@param\tnewHeight\tA new height for the `Image`\n\t**/\n\tpublic function resize(newWidth:Int, newHeight:Int):Void\n\t{\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.resize(this, newWidth, newHeight);\n\n\t\t\tcase DATA:\n\t\t\t\tImageDataUtil.resize(this, newWidth, newHeight);\n\n\t\t\tcase FLASH:\n\t\t\t\t#if flash\n\t\t\t\tvar matrix = new Matrix();\n\t\t\t\tmatrix.scale(newWidth / buffer.__srcBitmapData.width, newHeight / buffer.__srcBitmapData.height);\n\t\t\t\tvar data = new BitmapData(newWidth, newHeight, true, 0x00FFFFFF);\n\t\t\t\tdata.draw(buffer.__srcBitmapData, matrix, null, null, null, true);\n\t\t\t\tbuffer.__srcBitmapData = data;\n\t\t\t\t#end\n\n\t\t\tdefault:\n\t\t}\n\n\t\tbuffer.width = newWidth;\n\t\tbuffer.height = newHeight;\n\n\t\toffsetX = 0;\n\t\toffsetY = 0;\n\t\twidth = newWidth;\n\t\theight = newHeight;\n\t}\n\n\t/**\n\t\tScrolls the content of this `Image`.\n\n\t\tPixels on the edges of the scroll will remain repeated, while others\n\t\twithin the scroll area will be shifted\n\n\t\t@param\tx\tThe amount of horizontal scroll to apply\n\t\t@param\ty\tThe amount of vertical scroll to apply\n\t**/\n\tpublic function scroll(x:Int, y:Int):Void\n\t{\n\t\tif (buffer == null) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.scroll(this, x, y);\n\n\t\t\tcase DATA:\n\t\t\t\tcopyPixels(this, rect, new Vector2(x, y));\n\n\t\t\tcase FLASH:\n\t\t\t\tbuffer.__srcBitmapData.scroll(x + offsetX, y + offsetX);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tSets a pixel in the current `Image` in 24-bit color format (red, green, blue, no alpha)\n\t\t@param\tx\tThe x coordinate of the pixel\n\t\t@param\ty\tThe y coordinate of the pixel\n\t\t@param\tcolor\tThe color to use\n\t\t@param\tformat\t(Optional) The `PixelFormat` that `color` is encoded in (default is `RGBA`)\n\t**/\n\tpublic function setPixel(x:Int, y:Int, color:Int, format:PixelFormat = null):Void\n\t{\n\t\tif (buffer == null || x < 0 || y < 0 || x >= width || y >= height) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.setPixel(this, x, y, color, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.setPixel(this, x, y, color, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar argb:ARGB = switch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: color;\n\t\t\t\t\tcase BGRA32: (color : BGRA);\n\t\t\t\t\tdefault: (color : RGBA);\n\t\t\t\t}\n\n\t\t\t\tbuffer.__srcBitmapData.setPixel(x + offsetX, y + offsetX, argb);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tSets a pixel in the current `Image` in 32-bit color format (includes alpha)\n\t\t@param\tx\tThe x coordinate of the pixel\n\t\t@param\ty\tThe y coordinate of the pixel\n\t\t@param\tcolor\tThe color to use\n\t\t@param\tformat\t(Optional) The `PixelFormat` that `color` is encoded in (default is `RGBA`)\n\t**/\n\tpublic function setPixel32(x:Int, y:Int, color:Int, format:PixelFormat = null):Void\n\t{\n\t\tif (buffer == null || x < 0 || y < 0 || x >= width || y >= height) return;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.setPixel32(this, x, y, color, format);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.setPixel32(this, x, y, color, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar argb:ARGB = switch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: color;\n\t\t\t\t\tcase BGRA32: (color : BGRA);\n\t\t\t\t\tdefault: (color : RGBA);\n\t\t\t\t}\n\n\t\t\t\tbuffer.__srcBitmapData.setPixel32(x + offsetX, y + offsetY, argb);\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tSets a region of pixels at once using a `BytePointer`\n\t\t@param\trect\tThe region of pixels in this `Image` to replace with the incoming bytes\n\t\t@param\tbytePointer\tA `BytePointer` object referencing the `Bytes` and position to read from\n\t\t@param\tformat\t(Optional) The `PixelFormat` that the pixels are encoded in (default is `RGBA`)\n\t\t@param\tendian (Optional) The endianness of the incoming bytes (default is the system endianness)\n\t**/\n\tpublic function setPixels(rect:Rectangle, bytePointer:BytePointer, format:PixelFormat = null, endian:Endian = null):Void\n\t{\n\t\trect = __clipRect(rect);\n\t\tif (buffer == null || rect == null) return;\n\t\tif (endian == null) endian = BIG_ENDIAN;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS:\n\t\t\t\tImageCanvasUtil.setPixels(this, rect, bytePointer, format, endian);\n\n\t\t\tcase DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t#end\n\n\t\t\t\tImageDataUtil.setPixels(this, rect, bytePointer, format, endian);\n\n\t\t\tcase FLASH:\n\t\t\t\t#if flash\n\t\t\t\trect.offset(offsetX, offsetY);\n\t\t\t\tvar byteArray = new ByteArray();\n\n\t\t\t\tswitch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: // do nothing\n\t\t\t\t\tcase BGRA32:\n\t\t\t\t\t\tvar srcData:ByteArray = bytePointer.bytes.getData();\n\t\t\t\t\t\tbyteArray = new ByteArray();\n\t\t\t\t\t\tbyteArray.position = bytePointer.offset;\n\t\t\t\t\t\t#if flash\n\t\t\t\t\t\tbyteArray.length = srcData.length;\n\t\t\t\t\t\t#end\n\n\t\t\t\t\t\tvar color:BGRA;\n\t\t\t\t\t\tvar length = Std.int(byteArray.length / 4);\n\n\t\t\t\t\t\tfor (i in 0...length)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor = srcData.readUnsignedInt();\n\t\t\t\t\t\t\tbyteArray.writeUnsignedInt(cast(color, ARGB));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsrcData.position = 0;\n\t\t\t\t\t\tbyteArray.position = 0;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar srcData = bytePointer.bytes.getData();\n\t\t\t\t\t\tbyteArray = new ByteArray();\n\t\t\t\t\t\tbyteArray.position = bytePointer.offset;\n\t\t\t\t\t\t#if flash\n\t\t\t\t\t\tbyteArray.length = srcData.length;\n\t\t\t\t\t\t#end\n\n\t\t\t\t\t\tvar color:RGBA;\n\t\t\t\t\t\tvar length = Std.int(byteArray.length / 4);\n\n\t\t\t\t\t\tfor (i in 0...length)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcolor = srcData.readUnsignedInt();\n\t\t\t\t\t\t\tbyteArray.writeUnsignedInt(cast(color, ARGB));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsrcData.position = 0;\n\t\t\t\t\t\tbyteArray.position = 0;\n\t\t\t\t}\n\n\t\t\t\tbuffer.__srcBitmapData.setPixels(rect.__toFlashRectangle(), byteArray);\n\t\t\t\t#end\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t\tTests pixel values in an image against a specified threshold and sets\n\t\tpixels that pass the test to new color values. Using the\n\t\t`threshold()` method, you can isolate and replace color ranges\n\t\tin an image and perform other logical operations on image pixels.\n\n\t\tThe `threshold()` method's test logic is as follows:\n\n\t\t 1. If `((pixelValue & mask) operation(threshold & mask))`,\n\t\tthen set the pixel to `color`;\n\t\t 2. Otherwise, if `copySource == true`, then set the pixel to\n\t\tcorresponding pixel value from `sourceBitmap`.\n\n\t\tThe `operation` parameter specifies the comparison operator\n\t\tto use for the threshold test. For example, by using \"==\" as the\n\t\t`operation` parameter, you can isolate a specific color value\n\t\tin an image. Or by using `{operation: \"<\", mask: 0xFF000000,\n\t\tthreshold: 0x7F000000, color: 0x00000000}`, you can set all\n\t\tdestination pixels to be fully transparent when the source image pixel's\n\t\talpha is less than 0x7F. You can use this technique for animated\n\t\ttransitions and other effects.\n\n\t\t@param\tsourceImage\tThe input bitmap image to use. The source image can be a different `Image` object or it can refer to the current `Image` instance.\n\t\t@param\tsourceRect\tA rectangle that defines the area of the source image to use as input.\n\t\t@param\tdestPoint\tThe point within the destination image (the current `Image` instance) that corresponds to the upper-left corner of the source rectangle.\n\t\t@param\toperation\tOne of the following comparison operators, passed as a `String`: \"<\", \"<=\", \">\", \">=\", \"==\", \"!=\"\n\t\t@param\tthreshold\tThe value that each pixel is tested against to see if it meets or exceeds the threshhold.\n\t\t@param\tcolor\tThe color value that a pixel is set to if the threshold test succeeds. The default value is 0x00000000.\n\t\t@param\tmask\tThe mask to use to isolate a color component.\n\t\t@param\tcopySource\tIf the value is `true`, pixel values from the source image are copied to the destination when the threshold test fails. If the value is `false`, the source image is not copied when the threshold test fails.\n\t\t@return\tThe number of pixels that were changed.\n\t**/\n\tpublic function threshold(sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, operation:String, threshold:Int, color:Int = 0x00000000,\n\t\t\tmask:Int = 0xFFFFFFFF, copySource:Bool = false, format:PixelFormat = null):Int\n\t{\n\t\tif (buffer == null || sourceImage == null || sourceRect == null) return 0;\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase CANVAS, DATA:\n\t\t\t\t#if (js && html5)\n\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\tImageCanvasUtil.convertToData(sourceImage);\n\t\t\t\t#end\n\n\t\t\t\treturn ImageDataUtil.threshold(this, sourceImage, sourceRect, destPoint, operation, threshold, color, mask, copySource, format);\n\n\t\t\tcase FLASH:\n\t\t\t\tvar _color:ARGB = switch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: color;\n\t\t\t\t\tcase BGRA32: (color : BGRA);\n\t\t\t\t\tdefault: (color : RGBA);\n\t\t\t\t}\n\n\t\t\t\tvar _mask:ARGB = switch (format)\n\t\t\t\t{\n\t\t\t\t\tcase ARGB32: mask;\n\t\t\t\t\tcase BGRA32: (mask : BGRA);\n\t\t\t\t\tdefault: (mask : RGBA);\n\t\t\t\t}\n\n\t\t\t\tsourceRect.offset(sourceImage.offsetX, sourceImage.offsetY);\n\t\t\t\tdestPoint.offset(offsetX, offsetY);\n\n\t\t\t\treturn buffer.__srcBitmapData.threshold(sourceImage.buffer.src, sourceRect.__toFlashRectangle(), destPoint.__toFlashPoint(), operation,\n\t\t\t\t\tthreshold, _color, _mask, copySource);\n\n\t\t\tdefault:\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion private function __clipRect(r:Rectangle):Rectangle\n\t{\n\t\tif (r == null) return null;\n\n\t\tif (r.x < 0)\n\t\t{\n\t\t\tr.width -= -r.x;\n\t\t\tr.x = 0;\n\n\t\t\tif (r.x + r.width <= 0) return null;\n\t\t}\n\n\t\tif (r.y < 0)\n\t\t{\n\t\t\tr.height -= -r.y;\n\t\t\tr.y = 0;\n\n\t\t\tif (r.y + r.height <= 0) return null;\n\t\t}\n\n\t\tif (r.x + r.width >= width)\n\t\t{\n\t\t\tr.width -= r.x + r.width - width;\n\n\t\t\tif (r.width <= 0) return null;\n\t\t}\n\n\t\tif (r.y + r.height >= height)\n\t\t{\n\t\t\tr.height -= r.y + r.height - height;\n\n\t\t\tif (r.height <= 0) return null;\n\t\t}\n\n\t\treturn r;\n\t}\n\n\t@:noCompletion private function __fromBase64(base64:String, type:String, onload:Image->Void = null):Void\n\t{\n\t\t#if (js && html5)\n\t\tvar image:JSImage = untyped #if haxe4 js.Syntax.code #else __js__ #end ('new window.Image ()');\n\n\t\tvar image_onLoaded = function(event)\n\t\t{\n\t\t\tbuffer = new ImageBuffer(null, image.width, image.height);\n\t\t\tbuffer.__srcImage = cast image;\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY = 0;\n\t\t\twidth = buffer.width;\n\t\t\theight = buffer.height;\n\n\t\t\tif (onload != null)\n\t\t\t{\n\t\t\t\tonload(this);\n\t\t\t}\n\t\t}\n\n\t\timage.addEventListener(\"load\", image_onLoaded, false);\n\t\timage.src = \"data:\" + type + \";base64,\" + base64;\n\t\t#else\n\t\tif (base64 != null)\n\t\t{\n\t\t\t__fromBytes(Base64.decode(base64));\n\t\t}\n\t\t#end\n\t}\n\n\t@:noCompletion private function __fromBytes(bytes:Bytes, onload:Image->Void = null):Bool\n\t{\n\t\t#if (js && html5)\n\t\tvar type = \"\";\n\n\t\tif (__isPNG(bytes))\n\t\t{\n\t\t\ttype = \"image/png\";\n\t\t}\n\t\telse if (__isJPG(bytes))\n\t\t{\n\t\t\ttype = \"image/jpeg\";\n\t\t}\n\t\telse if (__isGIF(bytes))\n\t\t{\n\t\t\ttype = \"image/gif\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// throw \"Image tried to read PNG/JPG Bytes, but found an invalid header.\";\n\t\t\treturn false;\n\t\t}\n\n\t\t__fromBase64(Base64.encode(bytes), type, onload);\n\t\treturn true;\n\t\t#elseif (lime_cffi && !macro)\n\t\tif (bytes == null || bytes.length == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tvar imageBuffer:ImageBuffer = null;\n\n\t\t#if !cs\n\t\timageBuffer = NativeCFFI.lime_image_load_bytes(bytes, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\t\t#else\n\t\tvar data = NativeCFFI.lime_image_load_bytes(bytes, null);\n\t\tif (data != null)\n\t\t{\n\t\t\timageBuffer = new ImageBuffer(new UInt8Array(@:privateAccess new Bytes(data.data.buffer.length, data.data.buffer.b)), data.width, data.height,\n\t\t\t\tdata.bitsPerPixel);\n\t\t}\n\t\t#end\n\n\t\tif (imageBuffer != null)\n\t\t{\n\t\t\t__fromImageBuffer(imageBuffer);\n\n\t\t\tif (onload != null)\n\t\t\t{\n\t\t\t\tonload(this);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\t#else\n\t\tLog.warn(\"Image.fromBytes not supported on this target\");\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t@:noCompletion private function __fromFile(path:String, onload:Image->Void = null, onerror:Void->Void = null):Bool\n\t{\n\t\t#if (js && html5)\n\t\tvar image:JSImage = untyped #if haxe4 js.Syntax.code #else __js__ #end ('new window.Image ()');\n\n\t\t#if !display\n\t\tif (!HTML5HTTPRequest.__isSameOrigin(path))\n\t\t{\n\t\t\timage.crossOrigin = \"Anonymous\";\n\t\t}\n\t\t#end\n\n\t\timage.onload = function(_)\n\t\t{\n\t\t\tbuffer = new ImageBuffer(null, image.width, image.height);\n\t\t\tbuffer.__srcImage = cast image;\n\n\t\t\twidth = image.width;\n\t\t\theight = image.height;\n\n\t\t\tif (onload != null)\n\t\t\t{\n\t\t\t\tonload(this);\n\t\t\t}\n\t\t}\n\n\t\timage.onerror = function(_)\n\t\t{\n\t\t\tif (onerror != null)\n\t\t\t{\n\t\t\t\tonerror();\n\t\t\t}\n\t\t}\n\n\t\timage.src = path;\n\n\t\t// Another IE9 bug: loading 20+ images fails unless this line is added.\n\t\t// (issue #1019768)\n\t\tif (image.complete) {}\n\n\t\treturn true;\n\t\t#elseif (lime_cffi || java)\n\t\tvar buffer:ImageBuffer = null;\n\n\t\t#if (!sys || disable_cffi || java || macro)\n\t\tif (false) {}\n\t\t#else\n\t\tif (CFFI.enabled)\n\t\t{\n\t\t\t#if !cs\n\t\t\tbuffer = NativeCFFI.lime_image_load_file(path, new ImageBuffer(new UInt8Array(Bytes.alloc(0))));\n\t\t\t#else\n\t\t\tvar data = NativeCFFI.lime_image_load_file(path, null);\n\t\t\tif (data != null)\n\t\t\t{\n\t\t\t\tbuffer = new ImageBuffer(new UInt8Array(@:privateAccess new Bytes(data.data.buffer.length, data.data.buffer.b)), data.width, data.height,\n\t\t\t\t\tdata.bitsPerPixel);\n\t\t\t}\n\t\t\t#end\n\t\t}\n\t\t#end\n\n\t\t#if (sys && format)\n\t\telse\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar bytes = File.getBytes(path);\n\t\t\t\tvar input = new BytesInput(bytes, 0, bytes.length);\n\t\t\t\tvar png = new Reader(input).read();\n\t\t\t\tvar data = Tools.extract32(png);\n\t\t\t\tvar header = Tools.getHeader(png);\n\n\t\t\t\tvar data = new UInt8Array(Bytes.ofData(data.getData()));\n\t\t\t\tvar length = header.width * header.height;\n\n\t\t\t\tfor (i in 0...length)\n\t\t\t\t{\n\t\t\t\t\tvar b = data[i * 4];\n\t\t\t\t\tvar g = data[i * 4 + 1];\n\t\t\t\t\tvar r = data[i * 4 + 2];\n\t\t\t\t\tvar a = data[i * 4 + 3];\n\n\t\t\t\t\tdata[i * 4] = r;\n\t\t\t\t\tdata[i * 4 + 1] = g;\n\t\t\t\t\tdata[i * 4 + 2] = b;\n\t\t\t\t\tdata[i * 4 + 3] = a;\n\t\t\t\t}\n\n\t\t\t\tbuffer = new ImageBuffer(data, header.width, header.height);\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\t#end\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\t__fromImageBuffer(buffer);\n\n\t\t\tif (onload != null)\n\t\t\t{\n\t\t\t\tonload(this);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\t#else\n\t\tLog.warn(\"Image.fromFile not supported on this target\");\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t@:noCompletion private function __fromImageBuffer(buffer:ImageBuffer):Void\n\t{\n\t\tthis.buffer = buffer;\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\tif (width == -1)\n\t\t\t{\n\t\t\t\tthis.width = buffer.width;\n\t\t\t}\n\n\t\t\tif (height == -1)\n\t\t\t{\n\t\t\t\tthis.height = buffer.height;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function __isGIF(bytes:Bytes):Bool\n\t{\n\t\tif (bytes == null || bytes.length < 6) return false;\n\n\t\tvar header = bytes.getString(0, 6);\n\t\treturn (header == \"GIF87a\" || header == \"GIF89a\");\n\t}\n\n\tprivate static function __isJPG(bytes:Bytes):Bool\n\t{\n\t\tif (bytes == null || bytes.length < 4) return false;\n\n\t\treturn bytes.get(0) == 0xFF\n\t\t\t&& bytes.get(1) == 0xD8\n\t\t\t&& bytes.get(bytes.length - 2) == 0xFF\n\t\t\t&& bytes.get(bytes.length - 1) == 0xD9;\n\t}\n\n\tprivate static function __isPNG(bytes:Bytes):Bool\n\t{\n\t\tif (bytes == null || bytes.length < 8) return false;\n\n\t\treturn (bytes.get(0) == 0x89 && bytes.get(1) == \"P\".code && bytes.get(2) == \"N\".code && bytes.get(3) == \"G\".code && bytes.get(4) == \"\\r\".code\n\t\t\t&& bytes.get(5) == \"\\n\".code && bytes.get(6) == 0x1A && bytes.get(7) == \"\\n\".code);\n\t}\n\n\tprivate static function __isWebP(bytes:Bytes):Bool\n\t{\n\t\tif (bytes == null || bytes.length < 16) return false;\n\n\t\treturn (bytes.getString(0, 4) == \"RIFF\" && bytes.getString(8, 4) == \"WEBP\");\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_data():UInt8Array\n\t{\n\t\tif (buffer.data == null && buffer.width > 0 && buffer.height > 0)\n\t\t{\n\t\t\t#if (js && html5)\n\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t#elseif flash\n\t\t\tvar pixels = buffer.__srcBitmapData.getPixels(buffer.__srcBitmapData.rect);\n\t\t\tbuffer.data = new UInt8Array(Bytes.ofData(pixels));\n\t\t\t#end\n\t\t}\n\n\t\treturn buffer.data;\n\t}\n\n\t@:noCompletion private function set_data(value:UInt8Array):UInt8Array\n\t{\n\t\treturn buffer.data = value;\n\t}\n\n\t@:noCompletion private function get_format():PixelFormat\n\t{\n\t\treturn buffer.format;\n\t}\n\n\t@:noCompletion private function set_format(value:PixelFormat):PixelFormat\n\t{\n\t\tif (buffer.format != value)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase DATA:\n\t\t\t\t\tImageDataUtil.setFormat(this, value);\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\treturn buffer.format = value;\n\t}\n\n\t@:noCompletion private function get_powerOfTwo():Bool\n\t{\n\t\treturn ((buffer.width != 0)\n\t\t\t&& ((buffer.width & (~buffer.width + 1)) == buffer.width))\n\t\t\t&& ((buffer.height != 0) && ((buffer.height & (~buffer.height + 1)) == buffer.height));\n\t}\n\n\t@:noCompletion private function set_powerOfTwo(value:Bool):Bool\n\t{\n\t\tif (value != powerOfTwo)\n\t\t{\n\t\t\tvar newWidth = 1;\n\t\t\tvar newHeight = 1;\n\n\t\t\twhile (newWidth < buffer.width)\n\t\t\t{\n\t\t\t\tnewWidth <<= 1;\n\t\t\t}\n\n\t\t\twhile (newHeight < buffer.height)\n\t\t\t{\n\t\t\t\tnewHeight <<= 1;\n\t\t\t}\n\n\t\t\tif (newWidth == buffer.width && newHeight == buffer.height)\n\t\t\t{\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase CANVAS:\n\t\t\t\t\t#if (js && html5)\n\t\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t\t#end\n\t\t\t\t\tImageDataUtil.resizeBuffer(this, newWidth, newHeight);\n\n\t\t\t\tcase DATA:\n\t\t\t\t\tImageDataUtil.resizeBuffer(this, newWidth, newHeight);\n\n\t\t\t\tcase FLASH:\n\t\t\t\t\t#if flash\n\t\t\t\t\tvar bitmapData = new BitmapData(newWidth, newHeight, true, 0x000000);\n\t\t\t\t\tbitmapData.draw(buffer.src, null, null, null, true);\n\n\t\t\t\t\tbuffer.src = bitmapData;\n\t\t\t\t\tbuffer.width = newWidth;\n\t\t\t\t\tbuffer.height = newHeight;\n\t\t\t\t\t#end\n\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_premultiplied():Bool\n\t{\n\t\treturn buffer.premultiplied;\n\t}\n\n\t@:noCompletion private function set_premultiplied(value:Bool):Bool\n\t{\n\t\tif (value && !buffer.premultiplied)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase CANVAS, DATA:\n\t\t\t\t\t#if (js && html5)\n\t\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t\t#end\n\n\t\t\t\t\tImageDataUtil.multiplyAlpha(this);\n\n\t\t\t\tdefault:\n\t\t\t\t\t// TODO\n\t\t\t}\n\t\t}\n\t\telse if (!value && buffer.premultiplied)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase DATA:\n\t\t\t\t\t#if (js && html5)\n\t\t\t\t\tImageCanvasUtil.convertToData(this);\n\t\t\t\t\t#end\n\n\t\t\t\t\tImageDataUtil.unmultiplyAlpha(this);\n\n\t\t\t\tdefault:\n\t\t\t\t\t// TODO\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_rect():Rectangle\n\t{\n\t\treturn new Rectangle(0, 0, width, height);\n\t}\n\n\t@:noCompletion private function get_src():Dynamic\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcCanvas == null && (buffer.data != null || type == DATA))\n\t\t{\n\t\t\tImageCanvasUtil.convertToCanvas(this);\n\t\t}\n\t\t#end\n\n\t\treturn buffer.src;\n\t}\n\n\t@:noCompletion private function set_src(value:Dynamic):Dynamic\n\t{\n\t\treturn buffer.src = value;\n\t}\n\n\t@:noCompletion private function get_transparent():Bool\n\t{\n\t\tif (buffer == null) return false;\n\t\treturn buffer.transparent;\n\t}\n\n\t@:noCompletion private function set_transparent(value:Bool):Bool\n\t{\n\t\t// TODO, modify data to set transparency\n\t\tif (buffer == null) return false;\n\t\treturn buffer.transparent = value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/graphics/ImageBuffer.hx",
    "content": "package lime.graphics;\n\nimport haxe.io.Bytes;\nimport lime.graphics.cairo.CairoSurface;\nimport lime.utils.UInt8Array;\n#if (js && html5)\nimport lime._internal.graphics.ImageCanvasUtil;\nimport js.html.CanvasElement;\nimport js.html.CanvasRenderingContext2D;\nimport js.html.Image as HTMLImage;\nimport js.html.ImageData;\nimport js.Browser;\n#if haxe4\nimport js.lib.Uint8ClampedArray;\n#else\nimport js.html.Uint8ClampedArray;\n#end\n#elseif flash\nimport flash.display.BitmapData;\n#end\n\n/**\n\t`ImageBuffer` is a simple object for storing image data.\n\n\tFor higher-level operations, use the `Image` class.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n#if hl\n@:keep\n#end\n@:allow(lime.graphics.Image)\nclass ImageBuffer\n{\n\t/**\n\t\tThe number of bits per pixel in this image data\n\t**/\n\tpublic var bitsPerPixel:Int;\n\n\t/**\n\t\tThe data for this image, represented as a `UInt8Array`\n\t**/\n\tpublic var data:UInt8Array;\n\n\t/**\n\t\tThe `PixelFormat` for this image data\n\t**/\n\tpublic var format:PixelFormat;\n\n\t/**\n\t\tThe height of this image data\n\t**/\n\tpublic var height:Int;\n\n\t/**\n\t\tWhether the image data has premultiplied alpha\n\t**/\n\tpublic var premultiplied:Bool;\n\n\t/**\n\t\tThe data for this image, represented as a `js.html.CanvasElement`, `js.html.Image` or `flash.display.BitmapData`\n\t**/\n\tpublic var src(get, set):Dynamic;\n\n\t/**\n\t\tThe stride, or number of data values (in bytes) per row in the image data\n\t**/\n\tpublic var stride(get, never):Int;\n\n\t/**\n\t\tWhether this image data is transparent\n\t**/\n\tpublic var transparent:Bool;\n\n\t/**\n\t\tThe width of this image data\n\t**/\n\tpublic var width:Int;\n\n\t@:noCompletion private var __srcBitmapData:#if flash BitmapData #else Dynamic #end;\n\t@:noCompletion private var __srcCanvas:#if (js && html5) CanvasElement #else Dynamic #end;\n\t@:noCompletion private var __srcContext:#if (js && html5) CanvasRenderingContext2D #else Dynamic #end;\n\t@:noCompletion private var __srcCustom:Dynamic;\n\t@:noCompletion private var __srcImage:#if (js && html5) HTMLImage #else Dynamic #end;\n\t@:noCompletion private var __srcImageData:#if (js && html5) ImageData #else Dynamic #end;\n\n\t#if commonjs\n\tprivate static function __init__()\n\t{\n\t\tvar p = untyped ImageBuffer.prototype;\n\t\tuntyped Object.defineProperties(p,\n\t\t\t{\n\t\t\t\t\"src\": {get: p.get_src, set: p.set_src},\n\t\t\t\t\"stride\": {get: p.get_stride}\n\t\t\t});\n\t}\n\t#end\n\n\t/**\n\t\tCreates a new `ImageBuffer` instance\n\t\t@param\tdata\t(Optional) Initial `UInt8Array` data\n\t\t@param\twidth\t(Optional) An initial `width` value\n\t\t@param\theight\t(Optional) An initial `height` value\n\t\t@param\tbitsPerPixel\t(Optional) The `bitsPerPixel` of the data (default is 32)\n\t\t@param\tformat\t(Optional) The `PixelFormat` of this image buffer\n\t**/\n\tpublic function new(data:UInt8Array = null, width:Int = 0, height:Int = 0, bitsPerPixel:Int = 32, format:PixelFormat = null)\n\t{\n\t\tthis.data = data;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.bitsPerPixel = bitsPerPixel;\n\t\tthis.format = (format == null ? RGBA32 : format);\n\t\tpremultiplied = false;\n\t\ttransparent = true;\n\t}\n\n\t/**\n\t\tCreates a duplicate of this `ImageBuffer`\n\n\t\tIf the current `ImageBuffer` has `data` or `src` information, this will be\n\t\tcloned as well.\n\t\t@return\tA new `ImageBuffer` with duplicate values\n\t**/\n\tpublic function clone():ImageBuffer\n\t{\n\t\tvar buffer = new ImageBuffer(data, width, height, bitsPerPixel);\n\n\t\t#if flash\n\t\tif (__srcBitmapData != null) buffer.__srcBitmapData = __srcBitmapData.clone();\n\t\t#elseif (js && html5)\n\t\tif (data != null)\n\t\t{\n\t\t\tbuffer.data = new UInt8Array(data.byteLength);\n\t\t\tvar copy = new UInt8Array(data);\n\t\t\tbuffer.data.set(copy);\n\t\t}\n\t\telse if (__srcImageData != null)\n\t\t{\n\t\t\tbuffer.__srcCanvas = cast Browser.document.createElement(\"canvas\");\n\t\t\tbuffer.__srcContext = cast buffer.__srcCanvas.getContext(\"2d\");\n\t\t\tbuffer.__srcCanvas.width = __srcImageData.width;\n\t\t\tbuffer.__srcCanvas.height = __srcImageData.height;\n\t\t\tbuffer.__srcImageData = buffer.__srcContext.createImageData(__srcImageData.width, __srcImageData.height);\n\t\t\tvar copy = new Uint8ClampedArray(__srcImageData.data);\n\t\t\tbuffer.__srcImageData.data.set(copy);\n\t\t}\n\t\telse if (__srcCanvas != null)\n\t\t{\n\t\t\tbuffer.__srcCanvas = cast Browser.document.createElement(\"canvas\");\n\t\t\tbuffer.__srcContext = cast buffer.__srcCanvas.getContext(\"2d\");\n\t\t\tbuffer.__srcCanvas.width = __srcCanvas.width;\n\t\t\tbuffer.__srcCanvas.height = __srcCanvas.height;\n\t\t\tbuffer.__srcContext.drawImage(__srcCanvas, 0, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbuffer.__srcImage = __srcImage;\n\t\t}\n\t\t#elseif nodejs\n\t\tif (data != null)\n\t\t{\n\t\t\tbuffer.data = new UInt8Array(data.byteLength);\n\t\t\tvar copy = new UInt8Array(data);\n\t\t\tbuffer.data.set(copy);\n\t\t}\n\t\tbuffer.__srcCustom = __srcCustom;\n\t\t#else\n\t\tif (data != null)\n\t\t{\n\t\t\tvar bytes = Bytes.alloc(data.byteLength);\n\t\t\tbytes.blit(0, buffer.data.buffer, 0, data.byteLength);\n\t\t\tbuffer.data = new UInt8Array(bytes);\n\t\t}\n\t\t#end\n\n\t\tbuffer.bitsPerPixel = bitsPerPixel;\n\t\tbuffer.format = format;\n\t\tbuffer.premultiplied = premultiplied;\n\t\tbuffer.transparent = transparent;\n\t\treturn buffer;\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_src():Dynamic\n\t{\n\t\t#if (js && html5)\n\t\tif (__srcImage != null) return __srcImage;\n\t\treturn __srcCanvas;\n\t\t#elseif flash\n\t\treturn __srcBitmapData;\n\t\t#else\n\t\treturn __srcCustom;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_src(value:Dynamic):Dynamic\n\t{\n\t\t#if (js && html5)\n\t\tif ((value is HTMLImage))\n\t\t{\n\t\t\t__srcImage = cast value;\n\t\t}\n\t\telse if ((value is CanvasElement))\n\t\t{\n\t\t\t__srcCanvas = cast value;\n\t\t\t__srcContext = cast __srcCanvas.getContext(\"2d\");\n\t\t}\n\t\t#elseif flash\n\t\t__srcBitmapData = cast value;\n\t\t#else\n\t\t__srcCustom = value;\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_stride():Int\n\t{\n\t\treturn width * Std.int(bitsPerPixel / 8);\n\t}\n}\n"
  },
  {
    "path": "src/lime/graphics/ImageChannel.hx",
    "content": "package lime.graphics;\n\n/**\n\tAn enum with values for standard image color channels\n**/\nenum ImageChannel\n{\n\t/**\n\t\tThe red color channel\n\t**/\n\tRED;\n\n\t/**\n\t\tThe green color channel\n\t**/\n\tGREEN;\n\n\t/**\n\t\tThe blue color channel\n\t**/\n\tBLUE;\n\n\t/**\n\t\tThe alpha color channel\n\t**/\n\tALPHA;\n}\n"
  },
  {
    "path": "src/lime/graphics/ImageFileFormat.hx",
    "content": "package lime.graphics;\n\n/**\n\tAn enum with values for image encoding formats\n**/\nenum ImageFileFormat\n{\n\t/**\n\t\tAn image file encoded in the BMP file format\n\t**/\n\tBMP;\n\n\t/**\n\t\tAn image file encoded in the JPEG file format\n\t**/\n\tJPEG;\n\n\t/**\n\t\tAn image file encoded in the PNG file format\n\t**/\n\tPNG;\n}\n"
  },
  {
    "path": "src/lime/graphics/ImageType.hx",
    "content": "package lime.graphics;\n\n/**\n\tAn enum containing values for the underlying image type\n\trepresented by an `ImageBuffer`\n**/\nenum ImageType\n{\n\t/**\n\t\tThe source image data is stored in a `js.html.Image` or `js.html.CanvasElement`\n\t**/\n\tCANVAS;\n\n\t/**\n\t\tThe source image data is stored in a `UInt8Array`\n\t**/\n\tDATA;\n\n\t/**\n\t\tThe source image data is stored in a `flash.display.BitmapData`\n\t**/\n\tFLASH;\n\n\t/**\n\t\tThe source image data is stored in a custom format\n\t**/\n\tCUSTOM;\n}\n"
  },
  {
    "path": "src/lime/graphics/OpenGLES2RenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles)\n#if (doc_gen || (sys && lime_cffi))\nimport lime.graphics.opengl.*;\n\n/**\n\tThe `OpenGLES2RenderContext` allows access to OpenGL ES 2.0 features when OpenGL or\n\tOpenGL ES is the render context type of the `Window`.\n\n\tUsing an OpenGL ES context on a desktop platform enables support for cross-platform\n\tcode that should run on the majority of desktop and mobile platforms (when using\n\thardware acceleration).\n\n\tPlatforms supporting an OpenGL ES context are compatible with the Lime\n\t`WebGLRenderContext` if you would prefer to write WebGL-style code, or support web\n\tbrowsers with the same code.\n\n\tYou can convert from `lime.graphics.RenderContext`, `lime.graphics.OpenGLRenderContext`,\n\t`lime.graphics.OpenGLES3RenderContext`, `lime.graphics.opengl.GL`, and can convert to\n\t`lime.graphics.WebGLRenderContext` directly if desired:\n\n\t```haxe\n\tvar gles2:OpenGLES2RenderContext = window.context;\n\tvar gles2:OpenGLES2RenderContext = gl;\n\tvar gles2:OpenGLES2RenderContext = gles3;\n\tvar gles2:OpenGLES2RenderContext = GL;\n\n\tvar webgl:WebGLRenderContext = gles2;\n\t```\n**/\n@:forward(ACTIVE_ATTRIBUTES, ACTIVE_TEXTURE, ACTIVE_UNIFORMS, ALIASED_LINE_WIDTH_RANGE, ALIASED_POINT_SIZE_RANGE, ALPHA, ALPHA_BITS, ALWAYS, ARRAY_BUFFER,\n\tARRAY_BUFFER_BINDING, ATTACHED_SHADERS, BACK, BLEND, BLEND_COLOR, BLEND_DST_ALPHA, BLEND_DST_RGB, BLEND_EQUATION, BLEND_EQUATION_ALPHA,\n\tBLEND_EQUATION_RGB, BLEND_SRC_ALPHA, BLEND_SRC_RGB, BLUE_BITS, BOOL, BOOL_VEC2, BOOL_VEC3, BOOL_VEC4, BROWSER_DEFAULT_WEBGL, BUFFER_SIZE, BUFFER_USAGE,\n\tBYTE, CCW, CLAMP_TO_EDGE, COLOR_ATTACHMENT0, COLOR_BUFFER_BIT, COLOR_CLEAR_VALUE, COLOR_WRITEMASK, COMPILE_STATUS, COMPRESSED_TEXTURE_FORMATS,\n\tCONSTANT_ALPHA, CONSTANT_COLOR, CULL_FACE, CULL_FACE_MODE, CURRENT_PROGRAM, CURRENT_VERTEX_ATTRIB, CW, DECR, DECR_WRAP, DELETE_STATUS, DEPTH_ATTACHMENT,\n\tDEPTH_BITS, DEPTH_BUFFER_BIT, DEPTH_CLEAR_VALUE, DEPTH_COMPONENT, DEPTH_COMPONENT16, DEPTH_FUNC, DEPTH_RANGE, DEPTH_STENCIL, DEPTH_STENCIL_ATTACHMENT,\n\tDEPTH_TEST, DEPTH_WRITEMASK, DITHER, DONT_CARE, DST_ALPHA, DST_COLOR, DYNAMIC_DRAW, ELEMENT_ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER_BINDING, EQUAL, FASTEST,\n\tFLOAT, FLOAT_MAT2, FLOAT_MAT3, FLOAT_MAT4, FLOAT_VEC2, FLOAT_VEC3, FLOAT_VEC4, FRAGMENT_SHADER, FRAMEBUFFER, FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, FRAMEBUFFER_BINDING,\n\tFRAMEBUFFER_COMPLETE, FRAMEBUFFER_INCOMPLETE_ATTACHMENT, FRAMEBUFFER_INCOMPLETE_DIMENSIONS, FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,\n\tFRAMEBUFFER_UNSUPPORTED, FRONT, FRONT_AND_BACK, FRONT_FACE, FUNC_ADD, FUNC_REVERSE_SUBTRACT, FUNC_SUBTRACT, GENERATE_MIPMAP_HINT, GEQUAL, GREATER,\n\tGREEN_BITS, HIGH_FLOAT, HIGH_INT, INCR, INCR_WRAP, INT, INT_VEC2, INT_VEC3, INT_VEC4, INVALID_ENUM, INVALID_FRAMEBUFFER_OPERATION, INVALID_OPERATION,\n\tINVALID_VALUE, INVERT, KEEP, LEQUAL, LESS, LINEAR, LINEAR_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, LINES, LINE_LOOP, LINE_STRIP, LINE_WIDTH, LINK_STATUS,\n\tLOW_FLOAT, LOW_INT, LUMINANCE, LUMINANCE_ALPHA, MAX_COMBINED_TEXTURE_IMAGE_UNITS, MAX_CUBE_MAP_TEXTURE_SIZE, MAX_FRAGMENT_UNIFORM_VECTORS,\n\tMAX_RENDERBUFFER_SIZE, MAX_TEXTURE_IMAGE_UNITS, MAX_TEXTURE_SIZE, MAX_VARYING_VECTORS, MAX_VERTEX_ATTRIBS, MAX_VERTEX_TEXTURE_IMAGE_UNITS,\n\tMAX_VERTEX_UNIFORM_VECTORS, MAX_VIEWPORT_DIMS, MEDIUM_FLOAT, MEDIUM_INT, MIRRORED_REPEAT, NEAREST, NEAREST_MIPMAP_LINEAR, NEAREST_MIPMAP_NEAREST, NEVER,\n\tNICEST, NONE, NOTEQUAL, NO_ERROR, ONE, ONE_MINUS_CONSTANT_ALPHA, ONE_MINUS_CONSTANT_COLOR, ONE_MINUS_DST_ALPHA, ONE_MINUS_DST_COLOR, ONE_MINUS_SRC_ALPHA,\n\tONE_MINUS_SRC_COLOR, OUT_OF_MEMORY, PACK_ALIGNMENT, POINTS, POLYGON_OFFSET_FACTOR, POLYGON_OFFSET_FILL, POLYGON_OFFSET_UNITS, RED_BITS, RENDERBUFFER,\n\tRENDERBUFFER_ALPHA_SIZE, RENDERBUFFER_BINDING, RENDERBUFFER_BLUE_SIZE, RENDERBUFFER_DEPTH_SIZE, RENDERBUFFER_GREEN_SIZE, RENDERBUFFER_HEIGHT,\n\tRENDERBUFFER_INTERNAL_FORMAT, RENDERBUFFER_RED_SIZE, RENDERBUFFER_STENCIL_SIZE, RENDERBUFFER_WIDTH, RENDERER, REPEAT, REPLACE, RGB, RGB565, RGB5_A1, RGBA,\n\tRGBA4, SAMPLER_2D, SAMPLER_CUBE, SAMPLES, SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_BUFFERS, SAMPLE_COVERAGE, SAMPLE_COVERAGE_INVERT, SAMPLE_COVERAGE_VALUE,\n\tSCISSOR_BOX, SCISSOR_TEST, SHADER_TYPE, SHADING_LANGUAGE_VERSION, SHORT, SRC_ALPHA, SRC_ALPHA_SATURATE, SRC_COLOR, STATIC_DRAW, STENCIL_ATTACHMENT,\n\tSTENCIL_BACK_FAIL, STENCIL_BACK_FUNC, STENCIL_BACK_PASS_DEPTH_FAIL, STENCIL_BACK_PASS_DEPTH_PASS, STENCIL_BACK_REF, STENCIL_BACK_VALUE_MASK,\n\tSTENCIL_BACK_WRITEMASK, STENCIL_BITS, STENCIL_BUFFER_BIT, STENCIL_CLEAR_VALUE, STENCIL_FAIL, STENCIL_FUNC, STENCIL_INDEX, STENCIL_INDEX8,\n\tSTENCIL_PASS_DEPTH_FAIL, STENCIL_PASS_DEPTH_PASS, STENCIL_REF, STENCIL_TEST, STENCIL_VALUE_MASK, STENCIL_WRITEMASK, STREAM_DRAW, SUBPIXEL_BITS, TEXTURE,\n\tTEXTURE0, TEXTURE1, TEXTURE10, TEXTURE11, TEXTURE12, TEXTURE13, TEXTURE14, TEXTURE15, TEXTURE16, TEXTURE17, TEXTURE18, TEXTURE19, TEXTURE2, TEXTURE20,\n\tTEXTURE21, TEXTURE22, TEXTURE23, TEXTURE24, TEXTURE25, TEXTURE26, TEXTURE27, TEXTURE28, TEXTURE29, TEXTURE3, TEXTURE30, TEXTURE31, TEXTURE4, TEXTURE5,\n\tTEXTURE6, TEXTURE7, TEXTURE8, TEXTURE9, TEXTURE_2D, TEXTURE_BINDING_2D, TEXTURE_BINDING_CUBE_MAP, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_NEGATIVE_X,\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Z, TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z,\n\tTEXTURE_MAG_FILTER, TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, TEXTURE_WRAP_T, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, UNPACK_ALIGNMENT, UNSIGNED_BYTE,\n\tUNSIGNED_INT, UNSIGNED_SHORT, UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_5_5_5_1, UNSIGNED_SHORT_5_6_5, VALIDATE_STATUS, VENDOR, VERSION,\n\tVERTEX_ATTRIB_ARRAY_BUFFER_BINDING, VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_POINTER, VERTEX_ATTRIB_ARRAY_SIZE,\n\tVERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE, VERTEX_SHADER, VIEWPORT, ZERO, activeTexture, attachShader, bindAttribLocation, bindBuffer,\n\tbindFramebuffer, bindTexture, blendColor, blendEquation, blendEquationSeparate, blendFunc, blendFuncSeparate, bufferData, bufferSubData,\n\tcheckFramebufferStatus, clear, clearColor, clearDepthf, clearStencil, colorMask, compileShader, compressedTexImage2D, compressedTexSubImage2D,\n\tcopyTexImage2D, copyTexSubImage2D, createBuffer, createFramebuffer, createProgram, createRenderbuffer, createShader, createTexture, cullFace,\n\tdeleteBuffer, deleteFramebuffer, deleteProgram, deleteRenderbuffer, deleteShader, deleteTexture, depthFunc, depthMask, depthRangef, detachShader, disable,\n\tdisableVertexAttribArray, drawArrays, drawElements, enable, enableVertexAttribArray, finish, flush, framebufferRenderbuffer, framebufferTexture2D,\n\tfrontFace, genBuffers, generateMipmap, genFramebuffers, genRenderbuffers, genTextures, getActiveAttrib, getActiveUniform, getAttachedShaders,\n\tgetAttribLocation, getBoolean, getBooleanv, getBufferParameteri, getBufferParameteriv, getError, getFloat, getFloatv, getFramebufferAttachmentParameteri,\n\tgetFramebufferAttachmentParameteriv, getInteger, getIntegerv, getProgramInfoLog, getProgrami, getProgramiv, getRenderbufferParameteri,\n\tgetRenderbufferParameteriv, getShaderi, getShaderInfoLog, getShaderiv, getShaderPrecisionFormat, getShaderSource, getString, getTexParameterf,\n\tgetTexParameterfv, getTexParameteri, getTexParameteriv, getUniform, getUniformLocation, getVertexAttribf, getVertexAttribfv, getVertexAttribi,\n\tgetVertexAttribiv, getVertexAttribPointerv, hint, isBuffer, isEnabled, isFramebuffer, isProgram, isRenderbuffer, isShader, isTexture, lineWidth,\n\tlinkProgram, pixelStorei, polygonOffset, readPixels, releaseShaderCompiler, renderbufferStorage, sampleCoverage, scissor, shaderBinary, shaderSource,\n\tstencilFunc, stencilFuncSeparate, stencilMask, stencilMaskSeparate, stencilOp, stencilOpSeparate, texImage2D, texParameterf, texParameteri, texSubImage2D,\n\tuniform1f, uniform1fv, uniform1i, uniform1iv, uniform2f, uniform2fv, uniform2i, uniform2iv, uniform3f, uniform3fv, uniform3i, uniform3iv, uniform4f,\n\tuniform4fv, uniform4i, uniform4iv, uniformMatrix2fv, uniformMatrix3fv, uniformMatrix4fv, useProgram, validateProgram, vertexAttrib1f, vertexAttrib1fv,\n\tvertexAttrib2f, vertexAttrib2fv, vertexAttrib3f, vertexAttrib3fv, vertexAttrib4f, vertexAttrib4fv, vertexAttribPointer, viewport, EXTENSIONS, type, version)\n@:transitive\nabstract OpenGLES2RenderContext(OpenGLES3RenderContext) from OpenGLES3RenderContext\n\t#if (!doc_gen && lime_opengl) from OpenGLRenderContext #end\n{\n\t@:from private static function fromGL(gl:Class<GL>):OpenGLES2RenderContext\n\t{\n\t\treturn cast GL.context;\n\t}\n\n\t@:from private static function fromRenderContext(context:RenderContext):OpenGLES2RenderContext\n\t{\n\t\treturn context.gles2;\n\t}\n}\n#else\nimport lime.graphics.opengl.GL;\n\n@:forward()\n@:transitive\nabstract OpenGLES2RenderContext(Dynamic) from Dynamic to Dynamic\n{\n\t@:from private static function fromGL(gl:Class<GL>):OpenGLES2RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromOpenGLES3RenderContext(gl:OpenGLES3RenderContext):OpenGLES2RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t#if (!doc_gen && lime_opengl)\n\t@:from private static function fromOpenGLRenderContext(gl:OpenGLRenderContext):OpenGLES2RenderContext\n\t{\n\t\treturn null;\n\t}\n\t#end\n\n\t@:from private static function fromRenderContext(context:RenderContext):OpenGLES2RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromWebGLRenderContext(gl:WebGLRenderContext):OpenGLES2RenderContext\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/OpenGLES3RenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles)\n#if (lime_doc_gen || (sys && lime_cffi && !doc_gen))\nimport haxe.Int64;\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeOpenGLRenderContext;\nimport lime.graphics.opengl.*;\nimport lime.utils.DataPointer;\nimport lime.utils.Float32Array;\nimport lime.utils.Int32Array;\n\n/**\n\tThe `OpenGLES3RenderContext` allows access to OpenGL ES 3.0 features when OpenGL or\n\tOpenGL ES is the render context type of the `Window`, and the current context supports\n\tGLES3 features.\n\n\tUsing an OpenGL ES context on a desktop platform enables support for cross-platform\n\tcode that should run on both desktop and mobile platforms (when using\n\thardware acceleration), though support for OpenGL ES 3.0 features are more limited than\n\tGLES2.\n\n\tPlatforms supporting an OpenGL ES 3.0 context are compatible with the Lime\n\t`WebGLRenderContext` as well as the `WebGL2RenderContext` if you would prefer to write\n\tWebGL-style code, or support web browsers with the same code. Be aware that not all\n\tbrowsers support WebGL 2, so only plain WebGL might be available.\n\n\tYou can convert from `lime.graphics.RenderContext`, `lime.graphics.OpenGLRenderContext`,\n\t`lime.graphics.opengl.GL`, and can convert to `lime.graphics.OpenGLES2RenderContext`,\n\t`lime.graphics.WebGL2RenderContext` or `lime.graphics.WebGLRenderContext` directly\n\tif desired:\n\n\t```haxe\n\tvar gles3:OpenGLES3RenderContext = window.context;\n\tvar gles3:OpenGLES3RenderContext = gl;\n\tvar gles3:OpenGLES3RenderContext = GL;\n\n\tvar gles2:OpenGLES2RenderContext = gles3;\n\tvar webgl2:WebGL2RenderContext = gles3;\n\tvar webgl:WebGLRenderContext = gles3;\n\t```\n**/\n@:forward\n@:transitive\n#if (lime_doc_gen)\nabstract OpenGLES3RenderContext(NativeOpenGLRenderContext) from NativeOpenGLRenderContext\n{\n#else\n@:transitive\nabstract OpenGLES3RenderContext(OpenGLRenderContext) from OpenGLRenderContext\n{\n#end\n\nprivate static var __extensions:String;\npublic var EXTENSIONS(get, never):Int;\npublic var DEPTH_BUFFER_BIT(get, never):Int;\npublic var STENCIL_BUFFER_BIT(get, never):Int;\npublic var COLOR_BUFFER_BIT(get, never):Int;\npublic var POINTS(get, never):Int;\npublic var LINES(get, never):Int;\npublic var LINE_LOOP(get, never):Int;\npublic var LINE_STRIP(get, never):Int;\npublic var TRIANGLES(get, never):Int;\npublic var TRIANGLE_STRIP(get, never):Int;\npublic var TRIANGLE_FAN(get, never):Int;\npublic var ZERO(get, never):Int;\npublic var ONE(get, never):Int;\npublic var SRC_COLOR(get, never):Int;\npublic var ONE_MINUS_SRC_COLOR(get, never):Int;\npublic var SRC_ALPHA(get, never):Int;\npublic var ONE_MINUS_SRC_ALPHA(get, never):Int;\npublic var DST_ALPHA(get, never):Int;\npublic var ONE_MINUS_DST_ALPHA(get, never):Int;\npublic var DST_COLOR(get, never):Int;\npublic var ONE_MINUS_DST_COLOR(get, never):Int;\npublic var SRC_ALPHA_SATURATE(get, never):Int;\npublic var FUNC_ADD(get, never):Int;\npublic var BLEND_EQUATION(get, never):Int;\npublic var BLEND_EQUATION_RGB(get, never):Int;\npublic var BLEND_EQUATION_ALPHA(get, never):Int;\npublic var FUNC_SUBTRACT(get, never):Int;\npublic var FUNC_REVERSE_SUBTRACT(get, never):Int;\npublic var BLEND_DST_RGB(get, never):Int;\npublic var BLEND_SRC_RGB(get, never):Int;\npublic var BLEND_DST_ALPHA(get, never):Int;\npublic var BLEND_SRC_ALPHA(get, never):Int;\npublic var CONSTANT_COLOR(get, never):Int;\npublic var ONE_MINUS_CONSTANT_COLOR(get, never):Int;\npublic var CONSTANT_ALPHA(get, never):Int;\npublic var ONE_MINUS_CONSTANT_ALPHA(get, never):Int;\npublic var BLEND_COLOR(get, never):Int;\npublic var ARRAY_BUFFER(get, never):Int;\npublic var ELEMENT_ARRAY_BUFFER(get, never):Int;\npublic var ARRAY_BUFFER_BINDING(get, never):Int;\npublic var ELEMENT_ARRAY_BUFFER_BINDING(get, never):Int;\npublic var STREAM_DRAW(get, never):Int;\npublic var STATIC_DRAW(get, never):Int;\npublic var DYNAMIC_DRAW(get, never):Int;\npublic var BUFFER_SIZE(get, never):Int;\npublic var BUFFER_USAGE(get, never):Int;\npublic var CURRENT_VERTEX_ATTRIB(get, never):Int;\npublic var FRONT(get, never):Int;\npublic var BACK(get, never):Int;\npublic var FRONT_AND_BACK(get, never):Int;\npublic var CULL_FACE(get, never):Int;\npublic var BLEND(get, never):Int;\npublic var DITHER(get, never):Int;\npublic var STENCIL_TEST(get, never):Int;\npublic var DEPTH_TEST(get, never):Int;\npublic var SCISSOR_TEST(get, never):Int;\npublic var POLYGON_OFFSET_FILL(get, never):Int;\npublic var SAMPLE_ALPHA_TO_COVERAGE(get, never):Int;\npublic var SAMPLE_COVERAGE(get, never):Int;\npublic var NO_ERROR(get, never):Int;\npublic var INVALID_ENUM(get, never):Int;\npublic var INVALID_VALUE(get, never):Int;\npublic var INVALID_OPERATION(get, never):Int;\npublic var OUT_OF_MEMORY(get, never):Int;\npublic var CW(get, never):Int;\npublic var CCW(get, never):Int;\npublic var LINE_WIDTH(get, never):Int;\npublic var ALIASED_POINT_SIZE_RANGE(get, never):Int;\npublic var ALIASED_LINE_WIDTH_RANGE(get, never):Int;\npublic var CULL_FACE_MODE(get, never):Int;\npublic var FRONT_FACE(get, never):Int;\npublic var DEPTH_RANGE(get, never):Int;\npublic var DEPTH_WRITEMASK(get, never):Int;\npublic var DEPTH_CLEAR_VALUE(get, never):Int;\npublic var DEPTH_FUNC(get, never):Int;\npublic var STENCIL_CLEAR_VALUE(get, never):Int;\npublic var STENCIL_FUNC(get, never):Int;\npublic var STENCIL_FAIL(get, never):Int;\npublic var STENCIL_PASS_DEPTH_FAIL(get, never):Int;\npublic var STENCIL_PASS_DEPTH_PASS(get, never):Int;\npublic var STENCIL_REF(get, never):Int;\npublic var STENCIL_VALUE_MASK(get, never):Int;\npublic var STENCIL_WRITEMASK(get, never):Int;\npublic var STENCIL_BACK_FUNC(get, never):Int;\npublic var STENCIL_BACK_FAIL(get, never):Int;\npublic var STENCIL_BACK_PASS_DEPTH_FAIL(get, never):Int;\npublic var STENCIL_BACK_PASS_DEPTH_PASS(get, never):Int;\npublic var STENCIL_BACK_REF(get, never):Int;\npublic var STENCIL_BACK_VALUE_MASK(get, never):Int;\npublic var STENCIL_BACK_WRITEMASK(get, never):Int;\npublic var VIEWPORT(get, never):Int;\npublic var SCISSOR_BOX(get, never):Int;\npublic var COLOR_CLEAR_VALUE(get, never):Int;\npublic var COLOR_WRITEMASK(get, never):Int;\npublic var UNPACK_ALIGNMENT(get, never):Int;\npublic var PACK_ALIGNMENT(get, never):Int;\npublic var MAX_TEXTURE_SIZE(get, never):Int;\npublic var MAX_VIEWPORT_DIMS(get, never):Int;\npublic var SUBPIXEL_BITS(get, never):Int;\npublic var RED_BITS(get, never):Int;\npublic var GREEN_BITS(get, never):Int;\npublic var BLUE_BITS(get, never):Int;\npublic var ALPHA_BITS(get, never):Int;\npublic var DEPTH_BITS(get, never):Int;\npublic var STENCIL_BITS(get, never):Int;\npublic var POLYGON_OFFSET_UNITS(get, never):Int;\npublic var POLYGON_OFFSET_FACTOR(get, never):Int;\npublic var TEXTURE_BINDING_2D(get, never):Int;\npublic var SAMPLE_BUFFERS(get, never):Int;\npublic var SAMPLES(get, never):Int;\npublic var SAMPLE_COVERAGE_VALUE(get, never):Int;\npublic var SAMPLE_COVERAGE_INVERT(get, never):Int;\npublic var COMPRESSED_TEXTURE_FORMATS(get, never):Int;\npublic var DONT_CARE(get, never):Int;\npublic var FASTEST(get, never):Int;\npublic var NICEST(get, never):Int;\npublic var GENERATE_MIPMAP_HINT(get, never):Int;\npublic var BYTE(get, never):Int;\npublic var UNSIGNED_BYTE(get, never):Int;\npublic var SHORT(get, never):Int;\npublic var UNSIGNED_SHORT(get, never):Int;\npublic var INT(get, never):Int;\npublic var UNSIGNED_INT(get, never):Int;\npublic var FLOAT(get, never):Int;\npublic var DEPTH_COMPONENT(get, never):Int;\npublic var ALPHA(get, never):Int;\npublic var RGB(get, never):Int;\npublic var RGBA(get, never):Int;\npublic var LUMINANCE(get, never):Int;\npublic var LUMINANCE_ALPHA(get, never):Int;\npublic var UNSIGNED_SHORT_4_4_4_4(get, never):Int;\npublic var UNSIGNED_SHORT_5_5_5_1(get, never):Int;\npublic var UNSIGNED_SHORT_5_6_5(get, never):Int;\npublic var FRAGMENT_SHADER(get, never):Int;\npublic var VERTEX_SHADER(get, never):Int;\npublic var MAX_VERTEX_ATTRIBS(get, never):Int;\npublic var MAX_VERTEX_UNIFORM_VECTORS(get, never):Int;\npublic var MAX_VARYING_VECTORS(get, never):Int;\npublic var MAX_COMBINED_TEXTURE_IMAGE_UNITS(get, never):Int;\npublic var MAX_VERTEX_TEXTURE_IMAGE_UNITS(get, never):Int;\npublic var MAX_TEXTURE_IMAGE_UNITS(get, never):Int;\npublic var MAX_FRAGMENT_UNIFORM_VECTORS(get, never):Int;\npublic var SHADER_TYPE(get, never):Int;\npublic var DELETE_STATUS(get, never):Int;\npublic var LINK_STATUS(get, never):Int;\npublic var VALIDATE_STATUS(get, never):Int;\npublic var ATTACHED_SHADERS(get, never):Int;\npublic var ACTIVE_UNIFORMS(get, never):Int;\npublic var ACTIVE_ATTRIBUTES(get, never):Int;\npublic var SHADING_LANGUAGE_VERSION(get, never):Int;\npublic var CURRENT_PROGRAM(get, never):Int;\npublic var NEVER(get, never):Int;\npublic var LESS(get, never):Int;\npublic var EQUAL(get, never):Int;\npublic var LEQUAL(get, never):Int;\npublic var GREATER(get, never):Int;\npublic var NOTEQUAL(get, never):Int;\npublic var GEQUAL(get, never):Int;\npublic var ALWAYS(get, never):Int;\npublic var KEEP(get, never):Int;\npublic var REPLACE(get, never):Int;\npublic var INCR(get, never):Int;\npublic var DECR(get, never):Int;\npublic var INVERT(get, never):Int;\npublic var INCR_WRAP(get, never):Int;\npublic var DECR_WRAP(get, never):Int;\npublic var VENDOR(get, never):Int;\npublic var RENDERER(get, never):Int;\npublic var VERSION(get, never):Int;\npublic var NEAREST(get, never):Int;\npublic var LINEAR(get, never):Int;\npublic var NEAREST_MIPMAP_NEAREST(get, never):Int;\npublic var LINEAR_MIPMAP_NEAREST(get, never):Int;\npublic var NEAREST_MIPMAP_LINEAR(get, never):Int;\npublic var LINEAR_MIPMAP_LINEAR(get, never):Int;\npublic var TEXTURE_MAG_FILTER(get, never):Int;\npublic var TEXTURE_MIN_FILTER(get, never):Int;\npublic var TEXTURE_WRAP_S(get, never):Int;\npublic var TEXTURE_WRAP_T(get, never):Int;\npublic var TEXTURE_2D(get, never):Int;\npublic var TEXTURE(get, never):Int;\npublic var TEXTURE_CUBE_MAP(get, never):Int;\npublic var TEXTURE_BINDING_CUBE_MAP(get, never):Int;\npublic var TEXTURE_CUBE_MAP_POSITIVE_X(get, never):Int;\npublic var TEXTURE_CUBE_MAP_NEGATIVE_X(get, never):Int;\npublic var TEXTURE_CUBE_MAP_POSITIVE_Y(get, never):Int;\npublic var TEXTURE_CUBE_MAP_NEGATIVE_Y(get, never):Int;\npublic var TEXTURE_CUBE_MAP_POSITIVE_Z(get, never):Int;\npublic var TEXTURE_CUBE_MAP_NEGATIVE_Z(get, never):Int;\npublic var MAX_CUBE_MAP_TEXTURE_SIZE(get, never):Int;\npublic var TEXTURE0(get, never):Int;\npublic var TEXTURE1(get, never):Int;\npublic var TEXTURE2(get, never):Int;\npublic var TEXTURE3(get, never):Int;\npublic var TEXTURE4(get, never):Int;\npublic var TEXTURE5(get, never):Int;\npublic var TEXTURE6(get, never):Int;\npublic var TEXTURE7(get, never):Int;\npublic var TEXTURE8(get, never):Int;\npublic var TEXTURE9(get, never):Int;\npublic var TEXTURE10(get, never):Int;\npublic var TEXTURE11(get, never):Int;\npublic var TEXTURE12(get, never):Int;\npublic var TEXTURE13(get, never):Int;\npublic var TEXTURE14(get, never):Int;\npublic var TEXTURE15(get, never):Int;\npublic var TEXTURE16(get, never):Int;\npublic var TEXTURE17(get, never):Int;\npublic var TEXTURE18(get, never):Int;\npublic var TEXTURE19(get, never):Int;\npublic var TEXTURE20(get, never):Int;\npublic var TEXTURE21(get, never):Int;\npublic var TEXTURE22(get, never):Int;\npublic var TEXTURE23(get, never):Int;\npublic var TEXTURE24(get, never):Int;\npublic var TEXTURE25(get, never):Int;\npublic var TEXTURE26(get, never):Int;\npublic var TEXTURE27(get, never):Int;\npublic var TEXTURE28(get, never):Int;\npublic var TEXTURE29(get, never):Int;\npublic var TEXTURE30(get, never):Int;\npublic var TEXTURE31(get, never):Int;\npublic var ACTIVE_TEXTURE(get, never):Int;\npublic var REPEAT(get, never):Int;\npublic var CLAMP_TO_EDGE(get, never):Int;\npublic var MIRRORED_REPEAT(get, never):Int;\npublic var FLOAT_VEC2(get, never):Int;\npublic var FLOAT_VEC3(get, never):Int;\npublic var FLOAT_VEC4(get, never):Int;\npublic var INT_VEC2(get, never):Int;\npublic var INT_VEC3(get, never):Int;\npublic var INT_VEC4(get, never):Int;\npublic var BOOL(get, never):Int;\npublic var BOOL_VEC2(get, never):Int;\npublic var BOOL_VEC3(get, never):Int;\npublic var BOOL_VEC4(get, never):Int;\npublic var FLOAT_MAT2(get, never):Int;\npublic var FLOAT_MAT3(get, never):Int;\npublic var FLOAT_MAT4(get, never):Int;\npublic var SAMPLER_2D(get, never):Int;\npublic var SAMPLER_CUBE(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_ENABLED(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_SIZE(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_STRIDE(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_TYPE(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_NORMALIZED(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_POINTER(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_BUFFER_BINDING(get, never):Int;\npublic var VERTEX_PROGRAM_POINT_SIZE(get, never):Int;\npublic var POINT_SPRITE(get, never):Int;\npublic var COMPILE_STATUS(get, never):Int;\npublic var LOW_FLOAT(get, never):Int;\npublic var MEDIUM_FLOAT(get, never):Int;\npublic var HIGH_FLOAT(get, never):Int;\npublic var LOW_INT(get, never):Int;\npublic var MEDIUM_INT(get, never):Int;\npublic var HIGH_INT(get, never):Int;\npublic var FRAMEBUFFER(get, never):Int;\npublic var RENDERBUFFER(get, never):Int;\npublic var RGBA4(get, never):Int;\npublic var RGB5_A1(get, never):Int;\npublic var RGB565(get, never):Int;\npublic var DEPTH_COMPONENT16(get, never):Int;\npublic var STENCIL_INDEX(get, never):Int;\npublic var STENCIL_INDEX8(get, never):Int;\npublic var DEPTH_STENCIL(get, never):Int;\npublic var RENDERBUFFER_WIDTH(get, never):Int;\npublic var RENDERBUFFER_HEIGHT(get, never):Int;\npublic var RENDERBUFFER_INTERNAL_FORMAT(get, never):Int;\npublic var RENDERBUFFER_RED_SIZE(get, never):Int;\npublic var RENDERBUFFER_GREEN_SIZE(get, never):Int;\npublic var RENDERBUFFER_BLUE_SIZE(get, never):Int;\npublic var RENDERBUFFER_ALPHA_SIZE(get, never):Int;\npublic var RENDERBUFFER_DEPTH_SIZE(get, never):Int;\npublic var RENDERBUFFER_STENCIL_SIZE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_OBJECT_NAME(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE(get, never):Int;\npublic var COLOR_ATTACHMENT0(get, never):Int;\npublic var DEPTH_ATTACHMENT(get, never):Int;\npublic var STENCIL_ATTACHMENT(get, never):Int;\npublic var DEPTH_STENCIL_ATTACHMENT(get, never):Int;\npublic var NONE(get, never):Int;\npublic var FRAMEBUFFER_COMPLETE(get, never):Int;\npublic var FRAMEBUFFER_INCOMPLETE_ATTACHMENT(get, never):Int;\npublic var FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT(get, never):Int;\npublic var FRAMEBUFFER_INCOMPLETE_DIMENSIONS(get, never):Int;\npublic var FRAMEBUFFER_UNSUPPORTED(get, never):Int;\npublic var FRAMEBUFFER_BINDING(get, never):Int;\npublic var RENDERBUFFER_BINDING(get, never):Int;\npublic var MAX_RENDERBUFFER_SIZE(get, never):Int;\npublic var INVALID_FRAMEBUFFER_OPERATION(get, never):Int;\npublic var UNPACK_FLIP_Y_WEBGL(get, never):Int;\npublic var UNPACK_PREMULTIPLY_ALPHA_WEBGL(get, never):Int;\npublic var CONTEXT_LOST_WEBGL(get, never):Int;\npublic var UNPACK_COLORSPACE_CONVERSION_WEBGL(get, never):Int;\npublic var BROWSER_DEFAULT_WEBGL(get, never):Int;\npublic var READ_BUFFER(get, never):Int;\npublic var UNPACK_ROW_LENGTH(get, never):Int;\npublic var UNPACK_SKIP_ROWS(get, never):Int;\npublic var UNPACK_SKIP_PIXELS(get, never):Int;\npublic var PACK_ROW_LENGTH(get, never):Int;\npublic var PACK_SKIP_ROWS(get, never):Int;\npublic var PACK_SKIP_PIXELS(get, never):Int;\npublic var TEXTURE_BINDING_3D(get, never):Int;\npublic var UNPACK_SKIP_IMAGES(get, never):Int;\npublic var UNPACK_IMAGE_HEIGHT(get, never):Int;\npublic var MAX_3D_TEXTURE_SIZE(get, never):Int;\npublic var MAX_ELEMENTS_VERTICES(get, never):Int;\npublic var MAX_ELEMENTS_INDICES(get, never):Int;\npublic var MAX_TEXTURE_LOD_BIAS(get, never):Int;\npublic var MAX_FRAGMENT_UNIFORM_COMPONENTS(get, never):Int;\npublic var MAX_VERTEX_UNIFORM_COMPONENTS(get, never):Int;\npublic var MAX_ARRAY_TEXTURE_LAYERS(get, never):Int;\npublic var MIN_PROGRAM_TEXEL_OFFSET(get, never):Int;\npublic var MAX_PROGRAM_TEXEL_OFFSET(get, never):Int;\npublic var MAX_VARYING_COMPONENTS(get, never):Int;\npublic var FRAGMENT_SHADER_DERIVATIVE_HINT(get, never):Int;\npublic var RASTERIZER_DISCARD(get, never):Int;\npublic var VERTEX_ARRAY_BINDING(get, never):Int;\npublic var MAX_VERTEX_OUTPUT_COMPONENTS(get, never):Int;\npublic var MAX_FRAGMENT_INPUT_COMPONENTS(get, never):Int;\npublic var MAX_SERVER_WAIT_TIMEOUT(get, never):Int;\npublic var MAX_ELEMENT_INDEX(get, never):Int;\npublic var RED(get, never):Int;\npublic var RGB8(get, never):Int;\npublic var RGBA8(get, never):Int;\npublic var RGB10_A2(get, never):Int;\npublic var TEXTURE_3D(get, never):Int;\npublic var TEXTURE_WRAP_R(get, never):Int;\npublic var TEXTURE_MIN_LOD(get, never):Int;\npublic var TEXTURE_MAX_LOD(get, never):Int;\npublic var TEXTURE_BASE_LEVEL(get, never):Int;\npublic var TEXTURE_MAX_LEVEL(get, never):Int;\npublic var TEXTURE_COMPARE_MODE(get, never):Int;\npublic var TEXTURE_COMPARE_FUNC(get, never):Int;\npublic var SRGB(get, never):Int;\npublic var SRGB8(get, never):Int;\npublic var SRGB8_ALPHA8(get, never):Int;\npublic var COMPARE_REF_TO_TEXTURE(get, never):Int;\npublic var RGBA32F(get, never):Int;\npublic var RGB32F(get, never):Int;\npublic var RGBA16F(get, never):Int;\npublic var RGB16F(get, never):Int;\npublic var TEXTURE_2D_ARRAY(get, never):Int;\npublic var TEXTURE_BINDING_2D_ARRAY(get, never):Int;\npublic var R11F_G11F_B10F(get, never):Int;\npublic var RGB9_E5(get, never):Int;\npublic var RGBA32UI(get, never):Int;\npublic var RGB32UI(get, never):Int;\npublic var RGBA16UI(get, never):Int;\npublic var RGB16UI(get, never):Int;\npublic var RGBA8UI(get, never):Int;\npublic var RGB8UI(get, never):Int;\npublic var RGBA32I(get, never):Int;\npublic var RGB32I(get, never):Int;\npublic var RGBA16I(get, never):Int;\npublic var RGB16I(get, never):Int;\npublic var RGBA8I(get, never):Int;\npublic var RGB8I(get, never):Int;\npublic var RED_INTEGER(get, never):Int;\npublic var RGB_INTEGER(get, never):Int;\npublic var RGBA_INTEGER(get, never):Int;\npublic var R8(get, never):Int;\npublic var RG8(get, never):Int;\npublic var R16F(get, never):Int;\npublic var R32F(get, never):Int;\npublic var RG16F(get, never):Int;\npublic var RG32F(get, never):Int;\npublic var R8I(get, never):Int;\npublic var R8UI(get, never):Int;\npublic var R16I(get, never):Int;\npublic var R16UI(get, never):Int;\npublic var R32I(get, never):Int;\npublic var R32UI(get, never):Int;\npublic var RG8I(get, never):Int;\npublic var RG8UI(get, never):Int;\npublic var RG16I(get, never):Int;\npublic var RG16UI(get, never):Int;\npublic var RG32I(get, never):Int;\npublic var RG32UI(get, never):Int;\npublic var R8_SNORM(get, never):Int;\npublic var RG8_SNORM(get, never):Int;\npublic var RGB8_SNORM(get, never):Int;\npublic var RGBA8_SNORM(get, never):Int;\npublic var RGB10_A2UI(get, never):Int;\npublic var TEXTURE_IMMUTABLE_FORMAT(get, never):Int;\npublic var TEXTURE_IMMUTABLE_LEVELS(get, never):Int;\npublic var UNSIGNED_INT_2_10_10_10_REV(get, never):Int;\npublic var UNSIGNED_INT_10F_11F_11F_REV(get, never):Int;\npublic var UNSIGNED_INT_5_9_9_9_REV(get, never):Int;\npublic var FLOAT_32_UNSIGNED_INT_24_8_REV(get, never):Int;\npublic var UNSIGNED_INT_24_8(get, never):Int;\npublic var HALF_FLOAT(get, never):Int;\npublic var RG(get, never):Int;\npublic var RG_INTEGER(get, never):Int;\npublic var INT_2_10_10_10_REV(get, never):Int;\npublic var CURRENT_QUERY(get, never):Int;\npublic var QUERY_RESULT(get, never):Int;\npublic var QUERY_RESULT_AVAILABLE(get, never):Int;\npublic var ANY_SAMPLES_PASSED(get, never):Int;\npublic var ANY_SAMPLES_PASSED_CONSERVATIVE(get, never):Int;\npublic var MAX_DRAW_BUFFERS(get, never):Int;\npublic var DRAW_BUFFER0(get, never):Int;\npublic var DRAW_BUFFER1(get, never):Int;\npublic var DRAW_BUFFER2(get, never):Int;\npublic var DRAW_BUFFER3(get, never):Int;\npublic var DRAW_BUFFER4(get, never):Int;\npublic var DRAW_BUFFER5(get, never):Int;\npublic var DRAW_BUFFER6(get, never):Int;\npublic var DRAW_BUFFER7(get, never):Int;\npublic var DRAW_BUFFER8(get, never):Int;\npublic var DRAW_BUFFER9(get, never):Int;\npublic var DRAW_BUFFER10(get, never):Int;\npublic var DRAW_BUFFER11(get, never):Int;\npublic var DRAW_BUFFER12(get, never):Int;\npublic var DRAW_BUFFER13(get, never):Int;\npublic var DRAW_BUFFER14(get, never):Int;\npublic var DRAW_BUFFER15(get, never):Int;\npublic var MAX_COLOR_ATTACHMENTS(get, never):Int;\npublic var COLOR_ATTACHMENT1(get, never):Int;\npublic var COLOR_ATTACHMENT2(get, never):Int;\npublic var COLOR_ATTACHMENT3(get, never):Int;\npublic var COLOR_ATTACHMENT4(get, never):Int;\npublic var COLOR_ATTACHMENT5(get, never):Int;\npublic var COLOR_ATTACHMENT6(get, never):Int;\npublic var COLOR_ATTACHMENT7(get, never):Int;\npublic var COLOR_ATTACHMENT8(get, never):Int;\npublic var COLOR_ATTACHMENT9(get, never):Int;\npublic var COLOR_ATTACHMENT10(get, never):Int;\npublic var COLOR_ATTACHMENT11(get, never):Int;\npublic var COLOR_ATTACHMENT12(get, never):Int;\npublic var COLOR_ATTACHMENT13(get, never):Int;\npublic var COLOR_ATTACHMENT14(get, never):Int;\npublic var COLOR_ATTACHMENT15(get, never):Int;\npublic var SAMPLER_3D(get, never):Int;\npublic var SAMPLER_2D_SHADOW(get, never):Int;\npublic var SAMPLER_2D_ARRAY(get, never):Int;\npublic var SAMPLER_2D_ARRAY_SHADOW(get, never):Int;\npublic var SAMPLER_CUBE_SHADOW(get, never):Int;\npublic var INT_SAMPLER_2D(get, never):Int;\npublic var INT_SAMPLER_3D(get, never):Int;\npublic var INT_SAMPLER_CUBE(get, never):Int;\npublic var INT_SAMPLER_2D_ARRAY(get, never):Int;\npublic var UNSIGNED_INT_SAMPLER_2D(get, never):Int;\npublic var UNSIGNED_INT_SAMPLER_3D(get, never):Int;\npublic var UNSIGNED_INT_SAMPLER_CUBE(get, never):Int;\npublic var UNSIGNED_INT_SAMPLER_2D_ARRAY(get, never):Int;\npublic var MAX_SAMPLES(get, never):Int;\npublic var SAMPLER_BINDING(get, never):Int;\npublic var PIXEL_PACK_BUFFER(get, never):Int;\npublic var PIXEL_UNPACK_BUFFER(get, never):Int;\npublic var PIXEL_PACK_BUFFER_BINDING(get, never):Int;\npublic var PIXEL_UNPACK_BUFFER_BINDING(get, never):Int;\npublic var COPY_READ_BUFFER(get, never):Int;\npublic var COPY_WRITE_BUFFER(get, never):Int;\npublic var COPY_READ_BUFFER_BINDING(get, never):Int;\npublic var COPY_WRITE_BUFFER_BINDING(get, never):Int;\npublic var FLOAT_MAT2x3(get, never):Int;\npublic var FLOAT_MAT2x4(get, never):Int;\npublic var FLOAT_MAT3x2(get, never):Int;\npublic var FLOAT_MAT3x4(get, never):Int;\npublic var FLOAT_MAT4x2(get, never):Int;\npublic var FLOAT_MAT4x3(get, never):Int;\npublic var UNSIGNED_INT_VEC2(get, never):Int;\npublic var UNSIGNED_INT_VEC3(get, never):Int;\npublic var UNSIGNED_INT_VEC4(get, never):Int;\npublic var UNSIGNED_NORMALIZED(get, never):Int;\npublic var SIGNED_NORMALIZED(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_INTEGER(get, never):Int;\npublic var VERTEX_ATTRIB_ARRAY_DIVISOR(get, never):Int;\npublic var TRANSFORM_FEEDBACK_BUFFER_MODE(get, never):Int;\npublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS(get, never):Int;\npublic var TRANSFORM_FEEDBACK_VARYINGS(get, never):Int;\npublic var TRANSFORM_FEEDBACK_BUFFER_START(get, never):Int;\npublic var TRANSFORM_FEEDBACK_BUFFER_SIZE(get, never):Int;\npublic var TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN(get, never):Int;\npublic var MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS(get, never):Int;\npublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS(get, never):Int;\npublic var INTERLEAVED_ATTRIBS(get, never):Int;\npublic var SEPARATE_ATTRIBS(get, never):Int;\npublic var TRANSFORM_FEEDBACK_BUFFER(get, never):Int;\npublic var TRANSFORM_FEEDBACK_BUFFER_BINDING(get, never):Int;\npublic var TRANSFORM_FEEDBACK(get, never):Int;\npublic var TRANSFORM_FEEDBACK_PAUSED(get, never):Int;\npublic var TRANSFORM_FEEDBACK_ACTIVE(get, never):Int;\npublic var TRANSFORM_FEEDBACK_BINDING(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_RED_SIZE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_GREEN_SIZE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_BLUE_SIZE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE(get, never):Int;\npublic var FRAMEBUFFER_DEFAULT(get, never):Int;\npublic var DEPTH24_STENCIL8(get, never):Int;\npublic var DRAW_FRAMEBUFFER_BINDING(get, never):Int;\npublic var READ_FRAMEBUFFER(get, never):Int;\npublic var DRAW_FRAMEBUFFER(get, never):Int;\npublic var READ_FRAMEBUFFER_BINDING(get, never):Int;\npublic var RENDERBUFFER_SAMPLES(get, never):Int;\npublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER(get, never):Int;\npublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE(get, never):Int;\npublic var UNIFORM_BUFFER(get, never):Int;\npublic var UNIFORM_BUFFER_BINDING(get, never):Int;\npublic var UNIFORM_BUFFER_START(get, never):Int;\npublic var UNIFORM_BUFFER_SIZE(get, never):Int;\npublic var MAX_VERTEX_UNIFORM_BLOCKS(get, never):Int;\npublic var MAX_FRAGMENT_UNIFORM_BLOCKS(get, never):Int;\npublic var MAX_COMBINED_UNIFORM_BLOCKS(get, never):Int;\npublic var MAX_UNIFORM_BUFFER_BINDINGS(get, never):Int;\npublic var MAX_UNIFORM_BLOCK_SIZE(get, never):Int;\npublic var MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS(get, never):Int;\npublic var MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS(get, never):Int;\npublic var UNIFORM_BUFFER_OFFSET_ALIGNMENT(get, never):Int;\npublic var ACTIVE_UNIFORM_BLOCKS(get, never):Int;\npublic var UNIFORM_TYPE(get, never):Int;\npublic var UNIFORM_SIZE(get, never):Int;\npublic var UNIFORM_BLOCK_INDEX(get, never):Int;\npublic var UNIFORM_OFFSET(get, never):Int;\npublic var UNIFORM_ARRAY_STRIDE(get, never):Int;\npublic var UNIFORM_MATRIX_STRIDE(get, never):Int;\npublic var UNIFORM_IS_ROW_MAJOR(get, never):Int;\npublic var UNIFORM_BLOCK_BINDING(get, never):Int;\npublic var UNIFORM_BLOCK_DATA_SIZE(get, never):Int;\npublic var UNIFORM_BLOCK_ACTIVE_UNIFORMS(get, never):Int;\npublic var UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES(get, never):Int;\npublic var UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER(get, never):Int;\npublic var UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER(get, never):Int;\npublic var OBJECT_TYPE(get, never):Int;\npublic var SYNC_CONDITION(get, never):Int;\npublic var SYNC_STATUS(get, never):Int;\npublic var SYNC_FLAGS(get, never):Int;\npublic var SYNC_FENCE(get, never):Int;\npublic var SYNC_GPU_COMMANDS_COMPLETE(get, never):Int;\npublic var UNSIGNALED(get, never):Int;\npublic var SIGNALED(get, never):Int;\npublic var ALREADY_SIGNALED(get, never):Int;\npublic var TIMEOUT_EXPIRED(get, never):Int;\npublic var CONDITION_SATISFIED(get, never):Int;\npublic var WAIT_FAILED(get, never):Int;\npublic var SYNC_FLUSH_COMMANDS_BIT(get, never):Int;\npublic var COLOR(get, never):Int;\npublic var DEPTH(get, never):Int;\npublic var STENCIL(get, never):Int;\npublic var MIN(get, never):Int;\npublic var MAX(get, never):Int;\npublic var DEPTH_COMPONENT24(get, never):Int;\npublic var STREAM_READ(get, never):Int;\npublic var STREAM_COPY(get, never):Int;\npublic var STATIC_READ(get, never):Int;\npublic var STATIC_COPY(get, never):Int;\npublic var DYNAMIC_READ(get, never):Int;\npublic var DYNAMIC_COPY(get, never):Int;\npublic var DEPTH_COMPONENT32F(get, never):Int;\npublic var DEPTH32F_STENCIL8(get, never):Int;\npublic var INVALID_INDEX(get, never):Int;\npublic var TIMEOUT_IGNORED(get, never):Int;\npublic var MAX_CLIENT_WAIT_TIMEOUT_WEBGL(get, never):Int;\npublic var type(get, never):RenderContextType;\npublic var version(get, never):Float;\n\n@:noCompletion private inline function get_EXTENSIONS():Int\n{\n\treturn 0x1F03;\n}\n\n@:noCompletion private inline function get_DEPTH_BUFFER_BIT():Int\n{\n\treturn this.DEPTH_BUFFER_BIT;\n}\n\n@:noCompletion private inline function get_STENCIL_BUFFER_BIT():Int\n{\n\treturn this.STENCIL_BUFFER_BIT;\n}\n\n@:noCompletion private inline function get_COLOR_BUFFER_BIT():Int\n{\n\treturn this.COLOR_BUFFER_BIT;\n}\n\n@:noCompletion private inline function get_POINTS():Int\n{\n\treturn this.POINTS;\n}\n\n@:noCompletion private inline function get_LINES():Int\n{\n\treturn this.LINES;\n}\n\n@:noCompletion private inline function get_LINE_LOOP():Int\n{\n\treturn this.LINE_LOOP;\n}\n\n@:noCompletion private inline function get_LINE_STRIP():Int\n{\n\treturn this.LINE_STRIP;\n}\n\n@:noCompletion private inline function get_TRIANGLES():Int\n{\n\treturn this.TRIANGLES;\n}\n\n@:noCompletion private inline function get_TRIANGLE_STRIP():Int\n{\n\treturn this.TRIANGLE_STRIP;\n}\n\n@:noCompletion private inline function get_TRIANGLE_FAN():Int\n{\n\treturn this.TRIANGLE_FAN;\n}\n\n@:noCompletion private inline function get_ZERO():Int\n{\n\treturn this.ZERO;\n}\n\n@:noCompletion private inline function get_ONE():Int\n{\n\treturn this.ONE;\n}\n\n@:noCompletion private inline function get_SRC_COLOR():Int\n{\n\treturn this.SRC_COLOR;\n}\n\n@:noCompletion private inline function get_ONE_MINUS_SRC_COLOR():Int\n{\n\treturn this.ONE_MINUS_SRC_COLOR;\n}\n\n@:noCompletion private inline function get_SRC_ALPHA():Int\n{\n\treturn this.SRC_ALPHA;\n}\n\n@:noCompletion private inline function get_ONE_MINUS_SRC_ALPHA():Int\n{\n\treturn this.ONE_MINUS_SRC_ALPHA;\n}\n\n@:noCompletion private inline function get_DST_ALPHA():Int\n{\n\treturn this.DST_ALPHA;\n}\n\n@:noCompletion private inline function get_ONE_MINUS_DST_ALPHA():Int\n{\n\treturn this.ONE_MINUS_DST_ALPHA;\n}\n\n@:noCompletion private inline function get_DST_COLOR():Int\n{\n\treturn this.DST_COLOR;\n}\n\n@:noCompletion private inline function get_ONE_MINUS_DST_COLOR():Int\n{\n\treturn this.ONE_MINUS_DST_COLOR;\n}\n\n@:noCompletion private inline function get_SRC_ALPHA_SATURATE():Int\n{\n\treturn this.SRC_ALPHA_SATURATE;\n}\n\n@:noCompletion private inline function get_FUNC_ADD():Int\n{\n\treturn this.FUNC_ADD;\n}\n\n@:noCompletion private inline function get_BLEND_EQUATION():Int\n{\n\treturn this.BLEND_EQUATION;\n}\n\n@:noCompletion private inline function get_BLEND_EQUATION_RGB():Int\n{\n\treturn this.BLEND_EQUATION_RGB;\n}\n\n@:noCompletion private inline function get_BLEND_EQUATION_ALPHA():Int\n{\n\treturn this.BLEND_EQUATION_ALPHA;\n}\n\n@:noCompletion private inline function get_FUNC_SUBTRACT():Int\n{\n\treturn this.FUNC_SUBTRACT;\n}\n\n@:noCompletion private inline function get_FUNC_REVERSE_SUBTRACT():Int\n{\n\treturn this.FUNC_REVERSE_SUBTRACT;\n}\n\n@:noCompletion private inline function get_BLEND_DST_RGB():Int\n{\n\treturn this.BLEND_DST_RGB;\n}\n\n@:noCompletion private inline function get_BLEND_SRC_RGB():Int\n{\n\treturn this.BLEND_SRC_RGB;\n}\n\n@:noCompletion private inline function get_BLEND_DST_ALPHA():Int\n{\n\treturn this.BLEND_DST_ALPHA;\n}\n\n@:noCompletion private inline function get_BLEND_SRC_ALPHA():Int\n{\n\treturn this.BLEND_SRC_ALPHA;\n}\n\n@:noCompletion private inline function get_CONSTANT_COLOR():Int\n{\n\treturn this.CONSTANT_COLOR;\n}\n\n@:noCompletion private inline function get_ONE_MINUS_CONSTANT_COLOR():Int\n{\n\treturn this.ONE_MINUS_CONSTANT_COLOR;\n}\n\n@:noCompletion private inline function get_CONSTANT_ALPHA():Int\n{\n\treturn this.CONSTANT_ALPHA;\n}\n\n@:noCompletion private inline function get_ONE_MINUS_CONSTANT_ALPHA():Int\n{\n\treturn this.ONE_MINUS_CONSTANT_ALPHA;\n}\n\n@:noCompletion private inline function get_BLEND_COLOR():Int\n{\n\treturn this.BLEND_COLOR;\n}\n\n@:noCompletion private inline function get_ARRAY_BUFFER():Int\n{\n\treturn this.ARRAY_BUFFER;\n}\n\n@:noCompletion private inline function get_ELEMENT_ARRAY_BUFFER():Int\n{\n\treturn this.ELEMENT_ARRAY_BUFFER;\n}\n\n@:noCompletion private inline function get_ARRAY_BUFFER_BINDING():Int\n{\n\treturn this.ARRAY_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_ELEMENT_ARRAY_BUFFER_BINDING():Int\n{\n\treturn this.ELEMENT_ARRAY_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_STREAM_DRAW():Int\n{\n\treturn this.STREAM_DRAW;\n}\n\n@:noCompletion private inline function get_STATIC_DRAW():Int\n{\n\treturn this.STATIC_DRAW;\n}\n\n@:noCompletion private inline function get_DYNAMIC_DRAW():Int\n{\n\treturn this.DYNAMIC_DRAW;\n}\n\n@:noCompletion private inline function get_BUFFER_SIZE():Int\n{\n\treturn this.BUFFER_SIZE;\n}\n\n@:noCompletion private inline function get_BUFFER_USAGE():Int\n{\n\treturn this.BUFFER_USAGE;\n}\n\n@:noCompletion private inline function get_CURRENT_VERTEX_ATTRIB():Int\n{\n\treturn this.CURRENT_VERTEX_ATTRIB;\n}\n\n@:noCompletion private inline function get_FRONT():Int\n{\n\treturn this.FRONT;\n}\n\n@:noCompletion private inline function get_BACK():Int\n{\n\treturn this.BACK;\n}\n\n@:noCompletion private inline function get_FRONT_AND_BACK():Int\n{\n\treturn this.FRONT_AND_BACK;\n}\n\n@:noCompletion private inline function get_CULL_FACE():Int\n{\n\treturn this.CULL_FACE;\n}\n\n@:noCompletion private inline function get_BLEND():Int\n{\n\treturn this.BLEND;\n}\n\n@:noCompletion private inline function get_DITHER():Int\n{\n\treturn this.DITHER;\n}\n\n@:noCompletion private inline function get_STENCIL_TEST():Int\n{\n\treturn this.STENCIL_TEST;\n}\n\n@:noCompletion private inline function get_DEPTH_TEST():Int\n{\n\treturn this.DEPTH_TEST;\n}\n\n@:noCompletion private inline function get_SCISSOR_TEST():Int\n{\n\treturn this.SCISSOR_TEST;\n}\n\n@:noCompletion private inline function get_POLYGON_OFFSET_FILL():Int\n{\n\treturn this.POLYGON_OFFSET_FILL;\n}\n\n@:noCompletion private inline function get_SAMPLE_ALPHA_TO_COVERAGE():Int\n{\n\treturn this.SAMPLE_ALPHA_TO_COVERAGE;\n}\n\n@:noCompletion private inline function get_SAMPLE_COVERAGE():Int\n{\n\treturn this.SAMPLE_COVERAGE;\n}\n\n@:noCompletion private inline function get_NO_ERROR():Int\n{\n\treturn this.NO_ERROR;\n}\n\n@:noCompletion private inline function get_INVALID_ENUM():Int\n{\n\treturn this.INVALID_ENUM;\n}\n\n@:noCompletion private inline function get_INVALID_VALUE():Int\n{\n\treturn this.INVALID_VALUE;\n}\n\n@:noCompletion private inline function get_INVALID_OPERATION():Int\n{\n\treturn this.INVALID_OPERATION;\n}\n\n@:noCompletion private inline function get_OUT_OF_MEMORY():Int\n{\n\treturn this.OUT_OF_MEMORY;\n}\n\n@:noCompletion private inline function get_CW():Int\n{\n\treturn this.CW;\n}\n\n@:noCompletion private inline function get_CCW():Int\n{\n\treturn this.CCW;\n}\n\n@:noCompletion private inline function get_LINE_WIDTH():Int\n{\n\treturn this.LINE_WIDTH;\n}\n\n@:noCompletion private inline function get_ALIASED_POINT_SIZE_RANGE():Int\n{\n\treturn this.ALIASED_POINT_SIZE_RANGE;\n}\n\n@:noCompletion private inline function get_ALIASED_LINE_WIDTH_RANGE():Int\n{\n\treturn this.ALIASED_LINE_WIDTH_RANGE;\n}\n\n@:noCompletion private inline function get_CULL_FACE_MODE():Int\n{\n\treturn this.CULL_FACE_MODE;\n}\n\n@:noCompletion private inline function get_FRONT_FACE():Int\n{\n\treturn this.FRONT_FACE;\n}\n\n@:noCompletion private inline function get_DEPTH_RANGE():Int\n{\n\treturn this.DEPTH_RANGE;\n}\n\n@:noCompletion private inline function get_DEPTH_WRITEMASK():Int\n{\n\treturn this.DEPTH_WRITEMASK;\n}\n\n@:noCompletion private inline function get_DEPTH_CLEAR_VALUE():Int\n{\n\treturn this.DEPTH_CLEAR_VALUE;\n}\n\n@:noCompletion private inline function get_DEPTH_FUNC():Int\n{\n\treturn this.DEPTH_FUNC;\n}\n\n@:noCompletion private inline function get_STENCIL_CLEAR_VALUE():Int\n{\n\treturn this.STENCIL_CLEAR_VALUE;\n}\n\n@:noCompletion private inline function get_STENCIL_FUNC():Int\n{\n\treturn this.STENCIL_FUNC;\n}\n\n@:noCompletion private inline function get_STENCIL_FAIL():Int\n{\n\treturn this.STENCIL_FAIL;\n}\n\n@:noCompletion private inline function get_STENCIL_PASS_DEPTH_FAIL():Int\n{\n\treturn this.STENCIL_PASS_DEPTH_FAIL;\n}\n\n@:noCompletion private inline function get_STENCIL_PASS_DEPTH_PASS():Int\n{\n\treturn this.STENCIL_PASS_DEPTH_PASS;\n}\n\n@:noCompletion private inline function get_STENCIL_REF():Int\n{\n\treturn this.STENCIL_REF;\n}\n\n@:noCompletion private inline function get_STENCIL_VALUE_MASK():Int\n{\n\treturn this.STENCIL_VALUE_MASK;\n}\n\n@:noCompletion private inline function get_STENCIL_WRITEMASK():Int\n{\n\treturn this.STENCIL_WRITEMASK;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_FUNC():Int\n{\n\treturn this.STENCIL_BACK_FUNC;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_FAIL():Int\n{\n\treturn this.STENCIL_BACK_FAIL;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_PASS_DEPTH_FAIL():Int\n{\n\treturn this.STENCIL_BACK_PASS_DEPTH_FAIL;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_PASS_DEPTH_PASS():Int\n{\n\treturn this.STENCIL_BACK_PASS_DEPTH_PASS;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_REF():Int\n{\n\treturn this.STENCIL_BACK_REF;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_VALUE_MASK():Int\n{\n\treturn this.STENCIL_BACK_VALUE_MASK;\n}\n\n@:noCompletion private inline function get_STENCIL_BACK_WRITEMASK():Int\n{\n\treturn this.STENCIL_BACK_WRITEMASK;\n}\n\n@:noCompletion private inline function get_VIEWPORT():Int\n{\n\treturn this.VIEWPORT;\n}\n\n@:noCompletion private inline function get_SCISSOR_BOX():Int\n{\n\treturn this.SCISSOR_BOX;\n}\n\n@:noCompletion private inline function get_COLOR_CLEAR_VALUE():Int\n{\n\treturn this.COLOR_CLEAR_VALUE;\n}\n\n@:noCompletion private inline function get_COLOR_WRITEMASK():Int\n{\n\treturn this.COLOR_WRITEMASK;\n}\n\n@:noCompletion private inline function get_UNPACK_ALIGNMENT():Int\n{\n\treturn this.UNPACK_ALIGNMENT;\n}\n\n@:noCompletion private inline function get_PACK_ALIGNMENT():Int\n{\n\treturn this.PACK_ALIGNMENT;\n}\n\n@:noCompletion private inline function get_MAX_TEXTURE_SIZE():Int\n{\n\treturn this.MAX_TEXTURE_SIZE;\n}\n\n@:noCompletion private inline function get_MAX_VIEWPORT_DIMS():Int\n{\n\treturn this.MAX_VIEWPORT_DIMS;\n}\n\n@:noCompletion private inline function get_SUBPIXEL_BITS():Int\n{\n\treturn this.SUBPIXEL_BITS;\n}\n\n@:noCompletion private inline function get_RED_BITS():Int\n{\n\treturn this.RED_BITS;\n}\n\n@:noCompletion private inline function get_GREEN_BITS():Int\n{\n\treturn this.GREEN_BITS;\n}\n\n@:noCompletion private inline function get_BLUE_BITS():Int\n{\n\treturn this.BLUE_BITS;\n}\n\n@:noCompletion private inline function get_ALPHA_BITS():Int\n{\n\treturn this.ALPHA_BITS;\n}\n\n@:noCompletion private inline function get_DEPTH_BITS():Int\n{\n\treturn this.DEPTH_BITS;\n}\n\n@:noCompletion private inline function get_STENCIL_BITS():Int\n{\n\treturn this.STENCIL_BITS;\n}\n\n@:noCompletion private inline function get_POLYGON_OFFSET_UNITS():Int\n{\n\treturn this.POLYGON_OFFSET_UNITS;\n}\n\n@:noCompletion private inline function get_POLYGON_OFFSET_FACTOR():Int\n{\n\treturn this.POLYGON_OFFSET_FACTOR;\n}\n\n@:noCompletion private inline function get_TEXTURE_BINDING_2D():Int\n{\n\treturn this.TEXTURE_BINDING_2D;\n}\n\n@:noCompletion private inline function get_SAMPLE_BUFFERS():Int\n{\n\treturn this.SAMPLE_BUFFERS;\n}\n\n@:noCompletion private inline function get_SAMPLES():Int\n{\n\treturn this.SAMPLES;\n}\n\n@:noCompletion private inline function get_SAMPLE_COVERAGE_VALUE():Int\n{\n\treturn this.SAMPLE_COVERAGE_VALUE;\n}\n\n@:noCompletion private inline function get_SAMPLE_COVERAGE_INVERT():Int\n{\n\treturn this.SAMPLE_COVERAGE_INVERT;\n}\n\n@:noCompletion private inline function get_COMPRESSED_TEXTURE_FORMATS():Int\n{\n\treturn this.COMPRESSED_TEXTURE_FORMATS;\n}\n\n@:noCompletion private inline function get_DONT_CARE():Int\n{\n\treturn this.DONT_CARE;\n}\n\n@:noCompletion private inline function get_FASTEST():Int\n{\n\treturn this.FASTEST;\n}\n\n@:noCompletion private inline function get_NICEST():Int\n{\n\treturn this.NICEST;\n}\n\n@:noCompletion private inline function get_GENERATE_MIPMAP_HINT():Int\n{\n\treturn this.GENERATE_MIPMAP_HINT;\n}\n\n@:noCompletion private inline function get_BYTE():Int\n{\n\treturn this.BYTE;\n}\n\n@:noCompletion private inline function get_UNSIGNED_BYTE():Int\n{\n\treturn this.UNSIGNED_BYTE;\n}\n\n@:noCompletion private inline function get_SHORT():Int\n{\n\treturn this.SHORT;\n}\n\n@:noCompletion private inline function get_UNSIGNED_SHORT():Int\n{\n\treturn this.UNSIGNED_SHORT;\n}\n\n@:noCompletion private inline function get_INT():Int\n{\n\treturn this.INT;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT():Int\n{\n\treturn this.UNSIGNED_INT;\n}\n\n@:noCompletion private inline function get_FLOAT():Int\n{\n\treturn this.FLOAT;\n}\n\n@:noCompletion private inline function get_DEPTH_COMPONENT():Int\n{\n\treturn this.DEPTH_COMPONENT;\n}\n\n@:noCompletion private inline function get_ALPHA():Int\n{\n\treturn this.ALPHA;\n}\n\n@:noCompletion private inline function get_RGB():Int\n{\n\treturn this.RGB;\n}\n\n@:noCompletion private inline function get_RGBA():Int\n{\n\treturn this.RGBA;\n}\n\n@:noCompletion private inline function get_LUMINANCE():Int\n{\n\treturn this.LUMINANCE;\n}\n\n@:noCompletion private inline function get_LUMINANCE_ALPHA():Int\n{\n\treturn this.LUMINANCE_ALPHA;\n}\n\n@:noCompletion private inline function get_UNSIGNED_SHORT_4_4_4_4():Int\n{\n\treturn this.UNSIGNED_SHORT_4_4_4_4;\n}\n\n@:noCompletion private inline function get_UNSIGNED_SHORT_5_5_5_1():Int\n{\n\treturn this.UNSIGNED_SHORT_5_5_5_1;\n}\n\n@:noCompletion private inline function get_UNSIGNED_SHORT_5_6_5():Int\n{\n\treturn this.UNSIGNED_SHORT_5_6_5;\n}\n\n@:noCompletion private inline function get_FRAGMENT_SHADER():Int\n{\n\treturn this.FRAGMENT_SHADER;\n}\n\n@:noCompletion private inline function get_VERTEX_SHADER():Int\n{\n\treturn this.VERTEX_SHADER;\n}\n\n@:noCompletion private inline function get_MAX_VERTEX_ATTRIBS():Int\n{\n\treturn this.MAX_VERTEX_ATTRIBS;\n}\n\n@:noCompletion private inline function get_MAX_VERTEX_UNIFORM_VECTORS():Int\n{\n\treturn this.MAX_VERTEX_UNIFORM_VECTORS;\n}\n\n@:noCompletion private inline function get_MAX_VARYING_VECTORS():Int\n{\n\treturn this.MAX_VARYING_VECTORS;\n}\n\n@:noCompletion private inline function get_MAX_COMBINED_TEXTURE_IMAGE_UNITS():Int\n{\n\treturn this.MAX_COMBINED_TEXTURE_IMAGE_UNITS;\n}\n\n@:noCompletion private inline function get_MAX_VERTEX_TEXTURE_IMAGE_UNITS():Int\n{\n\treturn this.MAX_VERTEX_TEXTURE_IMAGE_UNITS;\n}\n\n@:noCompletion private inline function get_MAX_TEXTURE_IMAGE_UNITS():Int\n{\n\treturn this.MAX_TEXTURE_IMAGE_UNITS;\n}\n\n@:noCompletion private inline function get_MAX_FRAGMENT_UNIFORM_VECTORS():Int\n{\n\treturn this.MAX_FRAGMENT_UNIFORM_VECTORS;\n}\n\n@:noCompletion private inline function get_SHADER_TYPE():Int\n{\n\treturn this.SHADER_TYPE;\n}\n\n@:noCompletion private inline function get_DELETE_STATUS():Int\n{\n\treturn this.DELETE_STATUS;\n}\n\n@:noCompletion private inline function get_LINK_STATUS():Int\n{\n\treturn this.LINK_STATUS;\n}\n\n@:noCompletion private inline function get_VALIDATE_STATUS():Int\n{\n\treturn this.VALIDATE_STATUS;\n}\n\n@:noCompletion private inline function get_ATTACHED_SHADERS():Int\n{\n\treturn this.ATTACHED_SHADERS;\n}\n\n@:noCompletion private inline function get_ACTIVE_UNIFORMS():Int\n{\n\treturn this.ACTIVE_UNIFORMS;\n}\n\n@:noCompletion private inline function get_ACTIVE_ATTRIBUTES():Int\n{\n\treturn this.ACTIVE_ATTRIBUTES;\n}\n\n@:noCompletion private inline function get_SHADING_LANGUAGE_VERSION():Int\n{\n\treturn this.SHADING_LANGUAGE_VERSION;\n}\n\n@:noCompletion private inline function get_CURRENT_PROGRAM():Int\n{\n\treturn this.CURRENT_PROGRAM;\n}\n\n@:noCompletion private inline function get_NEVER():Int\n{\n\treturn this.NEVER;\n}\n\n@:noCompletion private inline function get_LESS():Int\n{\n\treturn this.LESS;\n}\n\n@:noCompletion private inline function get_EQUAL():Int\n{\n\treturn this.EQUAL;\n}\n\n@:noCompletion private inline function get_LEQUAL():Int\n{\n\treturn this.LEQUAL;\n}\n\n@:noCompletion private inline function get_GREATER():Int\n{\n\treturn this.GREATER;\n}\n\n@:noCompletion private inline function get_NOTEQUAL():Int\n{\n\treturn this.NOTEQUAL;\n}\n\n@:noCompletion private inline function get_GEQUAL():Int\n{\n\treturn this.GEQUAL;\n}\n\n@:noCompletion private inline function get_ALWAYS():Int\n{\n\treturn this.ALWAYS;\n}\n\n@:noCompletion private inline function get_KEEP():Int\n{\n\treturn this.KEEP;\n}\n\n@:noCompletion private inline function get_REPLACE():Int\n{\n\treturn this.REPLACE;\n}\n\n@:noCompletion private inline function get_INCR():Int\n{\n\treturn this.INCR;\n}\n\n@:noCompletion private inline function get_DECR():Int\n{\n\treturn this.DECR;\n}\n\n@:noCompletion private inline function get_INVERT():Int\n{\n\treturn this.INVERT;\n}\n\n@:noCompletion private inline function get_INCR_WRAP():Int\n{\n\treturn this.INCR_WRAP;\n}\n\n@:noCompletion private inline function get_DECR_WRAP():Int\n{\n\treturn this.DECR_WRAP;\n}\n\n@:noCompletion private inline function get_VENDOR():Int\n{\n\treturn this.VENDOR;\n}\n\n@:noCompletion private inline function get_RENDERER():Int\n{\n\treturn this.RENDERER;\n}\n\n@:noCompletion private inline function get_VERSION():Int\n{\n\treturn this.VERSION;\n}\n\n@:noCompletion private inline function get_NEAREST():Int\n{\n\treturn this.NEAREST;\n}\n\n@:noCompletion private inline function get_LINEAR():Int\n{\n\treturn this.LINEAR;\n}\n\n@:noCompletion private inline function get_NEAREST_MIPMAP_NEAREST():Int\n{\n\treturn this.NEAREST_MIPMAP_NEAREST;\n}\n\n@:noCompletion private inline function get_LINEAR_MIPMAP_NEAREST():Int\n{\n\treturn this.LINEAR_MIPMAP_NEAREST;\n}\n\n@:noCompletion private inline function get_NEAREST_MIPMAP_LINEAR():Int\n{\n\treturn this.NEAREST_MIPMAP_LINEAR;\n}\n\n@:noCompletion private inline function get_LINEAR_MIPMAP_LINEAR():Int\n{\n\treturn this.LINEAR_MIPMAP_LINEAR;\n}\n\n@:noCompletion private inline function get_TEXTURE_MAG_FILTER():Int\n{\n\treturn this.TEXTURE_MAG_FILTER;\n}\n\n@:noCompletion private inline function get_TEXTURE_MIN_FILTER():Int\n{\n\treturn this.TEXTURE_MIN_FILTER;\n}\n\n@:noCompletion private inline function get_TEXTURE_WRAP_S():Int\n{\n\treturn this.TEXTURE_WRAP_S;\n}\n\n@:noCompletion private inline function get_TEXTURE_WRAP_T():Int\n{\n\treturn this.TEXTURE_WRAP_T;\n}\n\n@:noCompletion private inline function get_TEXTURE_2D():Int\n{\n\treturn this.TEXTURE_2D;\n}\n\n@:noCompletion private inline function get_TEXTURE():Int\n{\n\treturn this.TEXTURE;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP():Int\n{\n\treturn this.TEXTURE_CUBE_MAP;\n}\n\n@:noCompletion private inline function get_TEXTURE_BINDING_CUBE_MAP():Int\n{\n\treturn this.TEXTURE_BINDING_CUBE_MAP;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP_POSITIVE_X():Int\n{\n\treturn this.TEXTURE_CUBE_MAP_POSITIVE_X;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP_NEGATIVE_X():Int\n{\n\treturn this.TEXTURE_CUBE_MAP_NEGATIVE_X;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP_POSITIVE_Y():Int\n{\n\treturn this.TEXTURE_CUBE_MAP_POSITIVE_Y;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP_NEGATIVE_Y():Int\n{\n\treturn this.TEXTURE_CUBE_MAP_NEGATIVE_Y;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP_POSITIVE_Z():Int\n{\n\treturn this.TEXTURE_CUBE_MAP_POSITIVE_Z;\n}\n\n@:noCompletion private inline function get_TEXTURE_CUBE_MAP_NEGATIVE_Z():Int\n{\n\treturn this.TEXTURE_CUBE_MAP_NEGATIVE_Z;\n}\n\n@:noCompletion private inline function get_MAX_CUBE_MAP_TEXTURE_SIZE():Int\n{\n\treturn this.MAX_CUBE_MAP_TEXTURE_SIZE;\n}\n\n@:noCompletion private inline function get_TEXTURE0():Int\n{\n\treturn this.TEXTURE0;\n}\n\n@:noCompletion private inline function get_TEXTURE1():Int\n{\n\treturn this.TEXTURE1;\n}\n\n@:noCompletion private inline function get_TEXTURE2():Int\n{\n\treturn this.TEXTURE2;\n}\n\n@:noCompletion private inline function get_TEXTURE3():Int\n{\n\treturn this.TEXTURE3;\n}\n\n@:noCompletion private inline function get_TEXTURE4():Int\n{\n\treturn this.TEXTURE4;\n}\n\n@:noCompletion private inline function get_TEXTURE5():Int\n{\n\treturn this.TEXTURE5;\n}\n\n@:noCompletion private inline function get_TEXTURE6():Int\n{\n\treturn this.TEXTURE6;\n}\n\n@:noCompletion private inline function get_TEXTURE7():Int\n{\n\treturn this.TEXTURE7;\n}\n\n@:noCompletion private inline function get_TEXTURE8():Int\n{\n\treturn this.TEXTURE8;\n}\n\n@:noCompletion private inline function get_TEXTURE9():Int\n{\n\treturn this.TEXTURE9;\n}\n\n@:noCompletion private inline function get_TEXTURE10():Int\n{\n\treturn this.TEXTURE10;\n}\n\n@:noCompletion private inline function get_TEXTURE11():Int\n{\n\treturn this.TEXTURE11;\n}\n\n@:noCompletion private inline function get_TEXTURE12():Int\n{\n\treturn this.TEXTURE12;\n}\n\n@:noCompletion private inline function get_TEXTURE13():Int\n{\n\treturn this.TEXTURE13;\n}\n\n@:noCompletion private inline function get_TEXTURE14():Int\n{\n\treturn this.TEXTURE14;\n}\n\n@:noCompletion private inline function get_TEXTURE15():Int\n{\n\treturn this.TEXTURE15;\n}\n\n@:noCompletion private inline function get_TEXTURE16():Int\n{\n\treturn this.TEXTURE16;\n}\n\n@:noCompletion private inline function get_TEXTURE17():Int\n{\n\treturn this.TEXTURE17;\n}\n\n@:noCompletion private inline function get_TEXTURE18():Int\n{\n\treturn this.TEXTURE18;\n}\n\n@:noCompletion private inline function get_TEXTURE19():Int\n{\n\treturn this.TEXTURE19;\n}\n\n@:noCompletion private inline function get_TEXTURE20():Int\n{\n\treturn this.TEXTURE20;\n}\n\n@:noCompletion private inline function get_TEXTURE21():Int\n{\n\treturn this.TEXTURE21;\n}\n\n@:noCompletion private inline function get_TEXTURE22():Int\n{\n\treturn this.TEXTURE22;\n}\n\n@:noCompletion private inline function get_TEXTURE23():Int\n{\n\treturn this.TEXTURE23;\n}\n\n@:noCompletion private inline function get_TEXTURE24():Int\n{\n\treturn this.TEXTURE24;\n}\n\n@:noCompletion private inline function get_TEXTURE25():Int\n{\n\treturn this.TEXTURE25;\n}\n\n@:noCompletion private inline function get_TEXTURE26():Int\n{\n\treturn this.TEXTURE26;\n}\n\n@:noCompletion private inline function get_TEXTURE27():Int\n{\n\treturn this.TEXTURE27;\n}\n\n@:noCompletion private inline function get_TEXTURE28():Int\n{\n\treturn this.TEXTURE28;\n}\n\n@:noCompletion private inline function get_TEXTURE29():Int\n{\n\treturn this.TEXTURE29;\n}\n\n@:noCompletion private inline function get_TEXTURE30():Int\n{\n\treturn this.TEXTURE30;\n}\n\n@:noCompletion private inline function get_TEXTURE31():Int\n{\n\treturn this.TEXTURE31;\n}\n\n@:noCompletion private inline function get_ACTIVE_TEXTURE():Int\n{\n\treturn this.ACTIVE_TEXTURE;\n}\n\n@:noCompletion private inline function get_REPEAT():Int\n{\n\treturn this.REPEAT;\n}\n\n@:noCompletion private inline function get_CLAMP_TO_EDGE():Int\n{\n\treturn this.CLAMP_TO_EDGE;\n}\n\n@:noCompletion private inline function get_MIRRORED_REPEAT():Int\n{\n\treturn this.MIRRORED_REPEAT;\n}\n\n@:noCompletion private inline function get_FLOAT_VEC2():Int\n{\n\treturn this.FLOAT_VEC2;\n}\n\n@:noCompletion private inline function get_FLOAT_VEC3():Int\n{\n\treturn this.FLOAT_VEC3;\n}\n\n@:noCompletion private inline function get_FLOAT_VEC4():Int\n{\n\treturn this.FLOAT_VEC4;\n}\n\n@:noCompletion private inline function get_INT_VEC2():Int\n{\n\treturn this.INT_VEC2;\n}\n\n@:noCompletion private inline function get_INT_VEC3():Int\n{\n\treturn this.INT_VEC3;\n}\n\n@:noCompletion private inline function get_INT_VEC4():Int\n{\n\treturn this.INT_VEC4;\n}\n\n@:noCompletion private inline function get_BOOL():Int\n{\n\treturn this.BOOL;\n}\n\n@:noCompletion private inline function get_BOOL_VEC2():Int\n{\n\treturn this.BOOL_VEC2;\n}\n\n@:noCompletion private inline function get_BOOL_VEC3():Int\n{\n\treturn this.BOOL_VEC3;\n}\n\n@:noCompletion private inline function get_BOOL_VEC4():Int\n{\n\treturn this.BOOL_VEC4;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT2():Int\n{\n\treturn this.FLOAT_MAT2;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT3():Int\n{\n\treturn this.FLOAT_MAT3;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT4():Int\n{\n\treturn this.FLOAT_MAT4;\n}\n\n@:noCompletion private inline function get_SAMPLER_2D():Int\n{\n\treturn this.SAMPLER_2D;\n}\n\n@:noCompletion private inline function get_SAMPLER_CUBE():Int\n{\n\treturn this.SAMPLER_CUBE;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_ENABLED():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_ENABLED;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_SIZE():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_SIZE;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_STRIDE():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_STRIDE;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_TYPE():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_TYPE;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_NORMALIZED():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_NORMALIZED;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_POINTER():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_POINTER;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_VERTEX_PROGRAM_POINT_SIZE():Int\n{#if (js && html5) return 0; #else return this.VERTEX_PROGRAM_POINT_SIZE; #end\n} // TODO\n\n@:noCompletion private inline function get_POINT_SPRITE():Int\n{#if (js && html5) return 0; #else return this.POINT_SPRITE; #end\n} // TODO\n\n@:noCompletion private inline function get_COMPILE_STATUS():Int\n{\n\treturn this.COMPILE_STATUS;\n}\n\n@:noCompletion private inline function get_LOW_FLOAT():Int\n{\n\treturn this.LOW_FLOAT;\n}\n\n@:noCompletion private inline function get_MEDIUM_FLOAT():Int\n{\n\treturn this.MEDIUM_FLOAT;\n}\n\n@:noCompletion private inline function get_HIGH_FLOAT():Int\n{\n\treturn this.HIGH_FLOAT;\n}\n\n@:noCompletion private inline function get_LOW_INT():Int\n{\n\treturn this.LOW_INT;\n}\n\n@:noCompletion private inline function get_MEDIUM_INT():Int\n{\n\treturn this.MEDIUM_INT;\n}\n\n@:noCompletion private inline function get_HIGH_INT():Int\n{\n\treturn this.HIGH_INT;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER():Int\n{\n\treturn this.FRAMEBUFFER;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER():Int\n{\n\treturn this.RENDERBUFFER;\n}\n\n@:noCompletion private inline function get_RGBA4():Int\n{\n\treturn this.RGBA4;\n}\n\n@:noCompletion private inline function get_RGB5_A1():Int\n{\n\treturn this.RGB5_A1;\n}\n\n@:noCompletion private inline function get_RGB565():Int\n{\n\treturn this.RGB565;\n}\n\n@:noCompletion private inline function get_DEPTH_COMPONENT16():Int\n{\n\treturn this.DEPTH_COMPONENT16;\n}\n\n@:noCompletion private inline function get_STENCIL_INDEX():Int\n{\n\treturn this.STENCIL_INDEX;\n}\n\n@:noCompletion private inline function get_STENCIL_INDEX8():Int\n{\n\treturn this.STENCIL_INDEX8;\n}\n\n@:noCompletion private inline function get_DEPTH_STENCIL():Int\n{\n\treturn this.DEPTH_STENCIL;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_WIDTH():Int\n{\n\treturn this.RENDERBUFFER_WIDTH;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_HEIGHT():Int\n{\n\treturn this.RENDERBUFFER_HEIGHT;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_INTERNAL_FORMAT():Int\n{\n\treturn this.RENDERBUFFER_INTERNAL_FORMAT;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_RED_SIZE():Int\n{\n\treturn this.RENDERBUFFER_RED_SIZE;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_GREEN_SIZE():Int\n{\n\treturn this.RENDERBUFFER_GREEN_SIZE;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_BLUE_SIZE():Int\n{\n\treturn this.RENDERBUFFER_BLUE_SIZE;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_ALPHA_SIZE():Int\n{\n\treturn this.RENDERBUFFER_ALPHA_SIZE;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_DEPTH_SIZE():Int\n{\n\treturn this.RENDERBUFFER_DEPTH_SIZE;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_STENCIL_SIZE():Int\n{\n\treturn this.RENDERBUFFER_STENCIL_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT0():Int\n{\n\treturn this.COLOR_ATTACHMENT0;\n}\n\n@:noCompletion private inline function get_DEPTH_ATTACHMENT():Int\n{\n\treturn this.DEPTH_ATTACHMENT;\n}\n\n@:noCompletion private inline function get_STENCIL_ATTACHMENT():Int\n{\n\treturn this.STENCIL_ATTACHMENT;\n}\n\n@:noCompletion private inline function get_DEPTH_STENCIL_ATTACHMENT():Int\n{\n\treturn this.DEPTH_STENCIL_ATTACHMENT;\n}\n\n@:noCompletion private inline function get_NONE():Int\n{\n\treturn this.NONE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_COMPLETE():Int\n{\n\treturn this.FRAMEBUFFER_COMPLETE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_ATTACHMENT():Int\n{\n\treturn this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT():Int\n{\n\treturn this.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_DIMENSIONS():Int\n{\n\treturn this.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_UNSUPPORTED():Int\n{\n\treturn this.FRAMEBUFFER_UNSUPPORTED;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_BINDING():Int\n{\n\treturn this.FRAMEBUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_BINDING():Int\n{\n\treturn this.RENDERBUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_MAX_RENDERBUFFER_SIZE():Int\n{\n\treturn this.MAX_RENDERBUFFER_SIZE;\n}\n\n@:noCompletion private inline function get_INVALID_FRAMEBUFFER_OPERATION():Int\n{\n\treturn this.INVALID_FRAMEBUFFER_OPERATION;\n}\n\n@:noCompletion private inline function get_UNPACK_FLIP_Y_WEBGL():Int\n{\n\treturn this.UNPACK_FLIP_Y_WEBGL;\n}\n\n@:noCompletion private inline function get_UNPACK_PREMULTIPLY_ALPHA_WEBGL():Int\n{\n\treturn this.UNPACK_PREMULTIPLY_ALPHA_WEBGL;\n}\n\n@:noCompletion private inline function get_CONTEXT_LOST_WEBGL():Int\n{\n\treturn this.CONTEXT_LOST_WEBGL;\n}\n\n@:noCompletion private inline function get_UNPACK_COLORSPACE_CONVERSION_WEBGL():Int\n{\n\treturn this.UNPACK_COLORSPACE_CONVERSION_WEBGL;\n}\n\n@:noCompletion private inline function get_BROWSER_DEFAULT_WEBGL():Int\n{\n\treturn this.BROWSER_DEFAULT_WEBGL;\n}\n\n@:noCompletion private inline function get_type():RenderContextType\n{\n\treturn this.type;\n}\n\n@:noCompletion private inline function get_version():Float\n{\n\treturn this.version;\n}\n\n@:noCompletion private inline function get_READ_BUFFER():Int\n{\n\treturn this.READ_BUFFER;\n}\n\n@:noCompletion private inline function get_UNPACK_ROW_LENGTH():Int\n{\n\treturn this.UNPACK_ROW_LENGTH;\n}\n\n@:noCompletion private inline function get_UNPACK_SKIP_ROWS():Int\n{\n\treturn this.UNPACK_SKIP_ROWS;\n}\n\n@:noCompletion private inline function get_UNPACK_SKIP_PIXELS():Int\n{\n\treturn this.UNPACK_SKIP_PIXELS;\n}\n\n@:noCompletion private inline function get_PACK_ROW_LENGTH():Int\n{\n\treturn this.PACK_ROW_LENGTH;\n}\n\n@:noCompletion private inline function get_PACK_SKIP_ROWS():Int\n{\n\treturn this.PACK_SKIP_ROWS;\n}\n\n@:noCompletion private inline function get_PACK_SKIP_PIXELS():Int\n{\n\treturn this.PACK_SKIP_PIXELS;\n}\n\n@:noCompletion private inline function get_TEXTURE_BINDING_3D():Int\n{\n\treturn this.TEXTURE_BINDING_3D;\n}\n\n@:noCompletion private inline function get_UNPACK_SKIP_IMAGES():Int\n{\n\treturn this.UNPACK_SKIP_IMAGES;\n}\n\n@:noCompletion private inline function get_UNPACK_IMAGE_HEIGHT():Int\n{\n\treturn this.UNPACK_IMAGE_HEIGHT;\n}\n\n@:noCompletion private inline function get_MAX_3D_TEXTURE_SIZE():Int\n{\n\treturn this.MAX_3D_TEXTURE_SIZE;\n}\n\n@:noCompletion private inline function get_MAX_ELEMENTS_VERTICES():Int\n{\n\treturn this.MAX_ELEMENTS_VERTICES;\n}\n\n@:noCompletion private inline function get_MAX_ELEMENTS_INDICES():Int\n{\n\treturn this.MAX_ELEMENTS_INDICES;\n}\n\n@:noCompletion private inline function get_MAX_TEXTURE_LOD_BIAS():Int\n{\n\treturn this.MAX_TEXTURE_LOD_BIAS;\n}\n\n@:noCompletion private inline function get_MAX_FRAGMENT_UNIFORM_COMPONENTS():Int\n{\n\treturn this.MAX_FRAGMENT_UNIFORM_COMPONENTS;\n}\n\n@:noCompletion private inline function get_MAX_VERTEX_UNIFORM_COMPONENTS():Int\n{\n\treturn this.MAX_VERTEX_UNIFORM_COMPONENTS;\n}\n\n@:noCompletion private inline function get_MAX_ARRAY_TEXTURE_LAYERS():Int\n{\n\treturn this.MAX_ARRAY_TEXTURE_LAYERS;\n}\n\n@:noCompletion private inline function get_MIN_PROGRAM_TEXEL_OFFSET():Int\n{\n\treturn this.MIN_PROGRAM_TEXEL_OFFSET;\n}\n\n@:noCompletion private inline function get_MAX_PROGRAM_TEXEL_OFFSET():Int\n{\n\treturn this.MAX_PROGRAM_TEXEL_OFFSET;\n}\n\n@:noCompletion private inline function get_MAX_VARYING_COMPONENTS():Int\n{\n\treturn this.MAX_VARYING_COMPONENTS;\n}\n\n@:noCompletion private inline function get_FRAGMENT_SHADER_DERIVATIVE_HINT():Int\n{\n\treturn this.FRAGMENT_SHADER_DERIVATIVE_HINT;\n}\n\n@:noCompletion private inline function get_RASTERIZER_DISCARD():Int\n{\n\treturn this.RASTERIZER_DISCARD;\n}\n\n@:noCompletion private inline function get_VERTEX_ARRAY_BINDING():Int\n{\n\treturn this.VERTEX_ARRAY_BINDING;\n}\n\n@:noCompletion private inline function get_MAX_VERTEX_OUTPUT_COMPONENTS():Int\n{\n\treturn this.MAX_VERTEX_OUTPUT_COMPONENTS;\n}\n\n@:noCompletion private inline function get_MAX_FRAGMENT_INPUT_COMPONENTS():Int\n{\n\treturn this.MAX_FRAGMENT_INPUT_COMPONENTS;\n}\n\n@:noCompletion private inline function get_MAX_SERVER_WAIT_TIMEOUT():Int\n{\n\treturn this.MAX_SERVER_WAIT_TIMEOUT;\n}\n\n@:noCompletion private inline function get_MAX_ELEMENT_INDEX():Int\n{\n\treturn this.MAX_ELEMENT_INDEX;\n}\n\n@:noCompletion private inline function get_RED():Int\n{\n\treturn this.RED;\n}\n\n@:noCompletion private inline function get_RGB8():Int\n{\n\treturn this.RGB8;\n}\n\n@:noCompletion private inline function get_RGBA8():Int\n{\n\treturn this.RGBA8;\n}\n\n@:noCompletion private inline function get_RGB10_A2():Int\n{\n\treturn this.RGB10_A2;\n}\n\n@:noCompletion private inline function get_TEXTURE_3D():Int\n{\n\treturn this.TEXTURE_3D;\n}\n\n@:noCompletion private inline function get_TEXTURE_WRAP_R():Int\n{\n\treturn this.TEXTURE_WRAP_R;\n}\n\n@:noCompletion private inline function get_TEXTURE_MIN_LOD():Int\n{\n\treturn this.TEXTURE_MIN_LOD;\n}\n\n@:noCompletion private inline function get_TEXTURE_MAX_LOD():Int\n{\n\treturn this.TEXTURE_MAX_LOD;\n}\n\n@:noCompletion private inline function get_TEXTURE_BASE_LEVEL():Int\n{\n\treturn this.TEXTURE_BASE_LEVEL;\n}\n\n@:noCompletion private inline function get_TEXTURE_MAX_LEVEL():Int\n{\n\treturn this.TEXTURE_MAX_LEVEL;\n}\n\n@:noCompletion private inline function get_TEXTURE_COMPARE_MODE():Int\n{\n\treturn this.TEXTURE_COMPARE_MODE;\n}\n\n@:noCompletion private inline function get_TEXTURE_COMPARE_FUNC():Int\n{\n\treturn this.TEXTURE_COMPARE_FUNC;\n}\n\n@:noCompletion private inline function get_SRGB():Int\n{\n\treturn this.SRGB;\n}\n\n@:noCompletion private inline function get_SRGB8():Int\n{\n\treturn this.SRGB8;\n}\n\n@:noCompletion private inline function get_SRGB8_ALPHA8():Int\n{\n\treturn this.SRGB8_ALPHA8;\n}\n\n@:noCompletion private inline function get_COMPARE_REF_TO_TEXTURE():Int\n{\n\treturn this.COMPARE_REF_TO_TEXTURE;\n}\n\n@:noCompletion private inline function get_RGBA32F():Int\n{\n\treturn this.RGBA32F;\n}\n\n@:noCompletion private inline function get_RGB32F():Int\n{\n\treturn this.RGB32F;\n}\n\n@:noCompletion private inline function get_RGBA16F():Int\n{\n\treturn this.RGBA16F;\n}\n\n@:noCompletion private inline function get_RGB16F():Int\n{\n\treturn this.RGB16F;\n}\n\n@:noCompletion private inline function get_TEXTURE_2D_ARRAY():Int\n{\n\treturn this.TEXTURE_2D_ARRAY;\n}\n\n@:noCompletion private inline function get_TEXTURE_BINDING_2D_ARRAY():Int\n{\n\treturn this.TEXTURE_BINDING_2D_ARRAY;\n}\n\n@:noCompletion private inline function get_R11F_G11F_B10F():Int\n{\n\treturn this.R11F_G11F_B10F;\n}\n\n@:noCompletion private inline function get_RGB9_E5():Int\n{\n\treturn this.RGB9_E5;\n}\n\n@:noCompletion private inline function get_RGBA32UI():Int\n{\n\treturn this.RGBA32UI;\n}\n\n@:noCompletion private inline function get_RGB32UI():Int\n{\n\treturn this.RGB32UI;\n}\n\n@:noCompletion private inline function get_RGBA16UI():Int\n{\n\treturn this.RGBA16UI;\n}\n\n@:noCompletion private inline function get_RGB16UI():Int\n{\n\treturn this.RGB16UI;\n}\n\n@:noCompletion private inline function get_RGBA8UI():Int\n{\n\treturn this.RGBA8UI;\n}\n\n@:noCompletion private inline function get_RGB8UI():Int\n{\n\treturn this.RGB8UI;\n}\n\n@:noCompletion private inline function get_RGBA32I():Int\n{\n\treturn this.RGBA32I;\n}\n\n@:noCompletion private inline function get_RGB32I():Int\n{\n\treturn this.RGB32I;\n}\n\n@:noCompletion private inline function get_RGBA16I():Int\n{\n\treturn this.RGBA16I;\n}\n\n@:noCompletion private inline function get_RGB16I():Int\n{\n\treturn this.RGB16I;\n}\n\n@:noCompletion private inline function get_RGBA8I():Int\n{\n\treturn this.RGBA8I;\n}\n\n@:noCompletion private inline function get_RGB8I():Int\n{\n\treturn this.RGB8I;\n}\n\n@:noCompletion private inline function get_RED_INTEGER():Int\n{\n\treturn this.RED_INTEGER;\n}\n\n@:noCompletion private inline function get_RGB_INTEGER():Int\n{\n\treturn this.RGB_INTEGER;\n}\n\n@:noCompletion private inline function get_RGBA_INTEGER():Int\n{\n\treturn this.RGBA_INTEGER;\n}\n\n@:noCompletion private inline function get_R8():Int\n{\n\treturn this.R8;\n}\n\n@:noCompletion private inline function get_RG8():Int\n{\n\treturn this.RG8;\n}\n\n@:noCompletion private inline function get_R16F():Int\n{\n\treturn this.R16F;\n}\n\n@:noCompletion private inline function get_R32F():Int\n{\n\treturn this.R32F;\n}\n\n@:noCompletion private inline function get_RG16F():Int\n{\n\treturn this.RG16F;\n}\n\n@:noCompletion private inline function get_RG32F():Int\n{\n\treturn this.RG32F;\n}\n\n@:noCompletion private inline function get_R8I():Int\n{\n\treturn this.R8I;\n}\n\n@:noCompletion private inline function get_R8UI():Int\n{\n\treturn this.R8UI;\n}\n\n@:noCompletion private inline function get_R16I():Int\n{\n\treturn this.R16I;\n}\n\n@:noCompletion private inline function get_R16UI():Int\n{\n\treturn this.R16UI;\n}\n\n@:noCompletion private inline function get_R32I():Int\n{\n\treturn this.R32I;\n}\n\n@:noCompletion private inline function get_R32UI():Int\n{\n\treturn this.R32UI;\n}\n\n@:noCompletion private inline function get_RG8I():Int\n{\n\treturn this.RG8I;\n}\n\n@:noCompletion private inline function get_RG8UI():Int\n{\n\treturn this.RG8UI;\n}\n\n@:noCompletion private inline function get_RG16I():Int\n{\n\treturn this.RG16I;\n}\n\n@:noCompletion private inline function get_RG16UI():Int\n{\n\treturn this.RG16UI;\n}\n\n@:noCompletion private inline function get_RG32I():Int\n{\n\treturn this.RG32I;\n}\n\n@:noCompletion private inline function get_RG32UI():Int\n{\n\treturn this.RG32UI;\n}\n\n@:noCompletion private inline function get_R8_SNORM():Int\n{\n\treturn this.R8_SNORM;\n}\n\n@:noCompletion private inline function get_RG8_SNORM():Int\n{\n\treturn this.RG8_SNORM;\n}\n\n@:noCompletion private inline function get_RGB8_SNORM():Int\n{\n\treturn this.RGB8_SNORM;\n}\n\n@:noCompletion private inline function get_RGBA8_SNORM():Int\n{\n\treturn this.RGBA8_SNORM;\n}\n\n@:noCompletion private inline function get_RGB10_A2UI():Int\n{\n\treturn this.RGB10_A2UI;\n}\n\n@:noCompletion private inline function get_TEXTURE_IMMUTABLE_FORMAT():Int\n{\n\treturn this.TEXTURE_IMMUTABLE_FORMAT;\n}\n\n@:noCompletion private inline function get_TEXTURE_IMMUTABLE_LEVELS():Int\n{\n\treturn this.TEXTURE_IMMUTABLE_LEVELS;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_2_10_10_10_REV():Int\n{\n\treturn this.UNSIGNED_INT_2_10_10_10_REV;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_10F_11F_11F_REV():Int\n{\n\treturn this.UNSIGNED_INT_10F_11F_11F_REV;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_5_9_9_9_REV():Int\n{\n\treturn this.UNSIGNED_INT_5_9_9_9_REV;\n}\n\n@:noCompletion private inline function get_FLOAT_32_UNSIGNED_INT_24_8_REV():Int\n{\n\treturn this.FLOAT_32_UNSIGNED_INT_24_8_REV;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_24_8():Int\n{\n\treturn this.UNSIGNED_INT_24_8;\n}\n\n@:noCompletion private inline function get_HALF_FLOAT():Int\n{\n\treturn this.HALF_FLOAT;\n}\n\n@:noCompletion private inline function get_RG():Int\n{\n\treturn this.RG;\n}\n\n@:noCompletion private inline function get_RG_INTEGER():Int\n{\n\treturn this.RG_INTEGER;\n}\n\n@:noCompletion private inline function get_INT_2_10_10_10_REV():Int\n{\n\treturn this.INT_2_10_10_10_REV;\n}\n\n@:noCompletion private inline function get_CURRENT_QUERY():Int\n{\n\treturn this.CURRENT_QUERY;\n}\n\n@:noCompletion private inline function get_QUERY_RESULT():Int\n{\n\treturn this.QUERY_RESULT;\n}\n\n@:noCompletion private inline function get_QUERY_RESULT_AVAILABLE():Int\n{\n\treturn this.QUERY_RESULT_AVAILABLE;\n}\n\n@:noCompletion private inline function get_ANY_SAMPLES_PASSED():Int\n{\n\treturn this.ANY_SAMPLES_PASSED;\n}\n\n@:noCompletion private inline function get_ANY_SAMPLES_PASSED_CONSERVATIVE():Int\n{\n\treturn this.ANY_SAMPLES_PASSED_CONSERVATIVE;\n}\n\n@:noCompletion private inline function get_MAX_DRAW_BUFFERS():Int\n{\n\treturn this.MAX_DRAW_BUFFERS;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER0():Int\n{\n\treturn this.DRAW_BUFFER0;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER1():Int\n{\n\treturn this.DRAW_BUFFER1;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER2():Int\n{\n\treturn this.DRAW_BUFFER2;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER3():Int\n{\n\treturn this.DRAW_BUFFER3;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER4():Int\n{\n\treturn this.DRAW_BUFFER4;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER5():Int\n{\n\treturn this.DRAW_BUFFER5;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER6():Int\n{\n\treturn this.DRAW_BUFFER6;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER7():Int\n{\n\treturn this.DRAW_BUFFER7;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER8():Int\n{\n\treturn this.DRAW_BUFFER8;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER9():Int\n{\n\treturn this.DRAW_BUFFER9;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER10():Int\n{\n\treturn this.DRAW_BUFFER10;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER11():Int\n{\n\treturn this.DRAW_BUFFER11;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER12():Int\n{\n\treturn this.DRAW_BUFFER12;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER13():Int\n{\n\treturn this.DRAW_BUFFER13;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER14():Int\n{\n\treturn this.DRAW_BUFFER14;\n}\n\n@:noCompletion private inline function get_DRAW_BUFFER15():Int\n{\n\treturn this.DRAW_BUFFER15;\n}\n\n@:noCompletion private inline function get_MAX_COLOR_ATTACHMENTS():Int\n{\n\treturn this.MAX_COLOR_ATTACHMENTS;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT1():Int\n{\n\treturn this.COLOR_ATTACHMENT1;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT2():Int\n{\n\treturn this.COLOR_ATTACHMENT2;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT3():Int\n{\n\treturn this.COLOR_ATTACHMENT3;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT4():Int\n{\n\treturn this.COLOR_ATTACHMENT4;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT5():Int\n{\n\treturn this.COLOR_ATTACHMENT5;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT6():Int\n{\n\treturn this.COLOR_ATTACHMENT6;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT7():Int\n{\n\treturn this.COLOR_ATTACHMENT7;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT8():Int\n{\n\treturn this.COLOR_ATTACHMENT8;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT9():Int\n{\n\treturn this.COLOR_ATTACHMENT9;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT10():Int\n{\n\treturn this.COLOR_ATTACHMENT10;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT11():Int\n{\n\treturn this.COLOR_ATTACHMENT11;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT12():Int\n{\n\treturn this.COLOR_ATTACHMENT12;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT13():Int\n{\n\treturn this.COLOR_ATTACHMENT13;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT14():Int\n{\n\treturn this.COLOR_ATTACHMENT14;\n}\n\n@:noCompletion private inline function get_COLOR_ATTACHMENT15():Int\n{\n\treturn this.COLOR_ATTACHMENT15;\n}\n\n@:noCompletion private inline function get_SAMPLER_3D():Int\n{\n\treturn this.SAMPLER_3D;\n}\n\n@:noCompletion private inline function get_SAMPLER_2D_SHADOW():Int\n{\n\treturn this.SAMPLER_2D_SHADOW;\n}\n\n@:noCompletion private inline function get_SAMPLER_2D_ARRAY():Int\n{\n\treturn this.SAMPLER_2D_ARRAY;\n}\n\n@:noCompletion private inline function get_SAMPLER_2D_ARRAY_SHADOW():Int\n{\n\treturn this.SAMPLER_2D_ARRAY_SHADOW;\n}\n\n@:noCompletion private inline function get_SAMPLER_CUBE_SHADOW():Int\n{\n\treturn this.SAMPLER_CUBE_SHADOW;\n}\n\n@:noCompletion private inline function get_INT_SAMPLER_2D():Int\n{\n\treturn this.INT_SAMPLER_2D;\n}\n\n@:noCompletion private inline function get_INT_SAMPLER_3D():Int\n{\n\treturn this.INT_SAMPLER_3D;\n}\n\n@:noCompletion private inline function get_INT_SAMPLER_CUBE():Int\n{\n\treturn this.INT_SAMPLER_CUBE;\n}\n\n@:noCompletion private inline function get_INT_SAMPLER_2D_ARRAY():Int\n{\n\treturn this.INT_SAMPLER_2D_ARRAY;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_2D():Int\n{\n\treturn this.UNSIGNED_INT_SAMPLER_2D;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_3D():Int\n{\n\treturn this.UNSIGNED_INT_SAMPLER_3D;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_CUBE():Int\n{\n\treturn this.UNSIGNED_INT_SAMPLER_CUBE;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_2D_ARRAY():Int\n{\n\treturn this.UNSIGNED_INT_SAMPLER_2D_ARRAY;\n}\n\n@:noCompletion private inline function get_MAX_SAMPLES():Int\n{\n\treturn this.MAX_SAMPLES;\n}\n\n@:noCompletion private inline function get_SAMPLER_BINDING():Int\n{\n\treturn this.SAMPLER_BINDING;\n}\n\n@:noCompletion private inline function get_PIXEL_PACK_BUFFER():Int\n{\n\treturn this.PIXEL_PACK_BUFFER;\n}\n\n@:noCompletion private inline function get_PIXEL_UNPACK_BUFFER():Int\n{\n\treturn this.PIXEL_UNPACK_BUFFER;\n}\n\n@:noCompletion private inline function get_PIXEL_PACK_BUFFER_BINDING():Int\n{\n\treturn this.PIXEL_PACK_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_PIXEL_UNPACK_BUFFER_BINDING():Int\n{\n\treturn this.PIXEL_UNPACK_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_COPY_READ_BUFFER():Int\n{\n\treturn this.COPY_READ_BUFFER;\n}\n\n@:noCompletion private inline function get_COPY_WRITE_BUFFER():Int\n{\n\treturn this.COPY_WRITE_BUFFER;\n}\n\n@:noCompletion private inline function get_COPY_READ_BUFFER_BINDING():Int\n{\n\treturn this.COPY_READ_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_COPY_WRITE_BUFFER_BINDING():Int\n{\n\treturn this.COPY_WRITE_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT2x3():Int\n{\n\treturn this.FLOAT_MAT2x3;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT2x4():Int\n{\n\treturn this.FLOAT_MAT2x4;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT3x2():Int\n{\n\treturn this.FLOAT_MAT3x2;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT3x4():Int\n{\n\treturn this.FLOAT_MAT3x4;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT4x2():Int\n{\n\treturn this.FLOAT_MAT4x2;\n}\n\n@:noCompletion private inline function get_FLOAT_MAT4x3():Int\n{\n\treturn this.FLOAT_MAT4x3;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_VEC2():Int\n{\n\treturn this.UNSIGNED_INT_VEC2;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_VEC3():Int\n{\n\treturn this.UNSIGNED_INT_VEC3;\n}\n\n@:noCompletion private inline function get_UNSIGNED_INT_VEC4():Int\n{\n\treturn this.UNSIGNED_INT_VEC4;\n}\n\n@:noCompletion private inline function get_UNSIGNED_NORMALIZED():Int\n{\n\treturn this.UNSIGNED_NORMALIZED;\n}\n\n@:noCompletion private inline function get_SIGNED_NORMALIZED():Int\n{\n\treturn this.SIGNED_NORMALIZED;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_INTEGER():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_INTEGER;\n}\n\n@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_DIVISOR():Int\n{\n\treturn this.VERTEX_ATTRIB_ARRAY_DIVISOR;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_MODE():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_BUFFER_MODE;\n}\n\n@:noCompletion private inline function get_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS():Int\n{\n\treturn this.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_VARYINGS():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_VARYINGS;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_START():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_BUFFER_START;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_SIZE():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_BUFFER_SIZE;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;\n}\n\n@:noCompletion private inline function get_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS():Int\n{\n\treturn this.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;\n}\n\n@:noCompletion private inline function get_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS():Int\n{\n\treturn this.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;\n}\n\n@:noCompletion private inline function get_INTERLEAVED_ATTRIBS():Int\n{\n\treturn this.INTERLEAVED_ATTRIBS;\n}\n\n@:noCompletion private inline function get_SEPARATE_ATTRIBS():Int\n{\n\treturn this.SEPARATE_ATTRIBS;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_BUFFER;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_BINDING():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK():Int\n{\n\treturn this.TRANSFORM_FEEDBACK;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_PAUSED():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_PAUSED;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_ACTIVE():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_ACTIVE;\n}\n\n@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BINDING():Int\n{\n\treturn this.TRANSFORM_FEEDBACK_BINDING;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_RED_SIZE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_RED_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_DEFAULT():Int\n{\n\treturn this.FRAMEBUFFER_DEFAULT;\n}\n\n@:noCompletion private inline function get_DEPTH24_STENCIL8():Int\n{\n\treturn this.DEPTH24_STENCIL8;\n}\n\n@:noCompletion private inline function get_DRAW_FRAMEBUFFER_BINDING():Int\n{\n\treturn this.DRAW_FRAMEBUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_READ_FRAMEBUFFER():Int\n{\n\treturn this.READ_FRAMEBUFFER;\n}\n\n@:noCompletion private inline function get_DRAW_FRAMEBUFFER():Int\n{\n\treturn this.DRAW_FRAMEBUFFER;\n}\n\n@:noCompletion private inline function get_READ_FRAMEBUFFER_BINDING():Int\n{\n\treturn this.READ_FRAMEBUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_RENDERBUFFER_SAMPLES():Int\n{\n\treturn this.RENDERBUFFER_SAMPLES;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER():Int\n{\n\treturn this.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER;\n}\n\n@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE():Int\n{\n\treturn this.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;\n}\n\n@:noCompletion private inline function get_UNIFORM_BUFFER():Int\n{\n\treturn this.UNIFORM_BUFFER;\n}\n\n@:noCompletion private inline function get_UNIFORM_BUFFER_BINDING():Int\n{\n\treturn this.UNIFORM_BUFFER_BINDING;\n}\n\n@:noCompletion private inline function get_UNIFORM_BUFFER_START():Int\n{\n\treturn this.UNIFORM_BUFFER_START;\n}\n\n@:noCompletion private inline function get_UNIFORM_BUFFER_SIZE():Int\n{\n\treturn this.UNIFORM_BUFFER_SIZE;\n}\n\n@:noCompletion private inline function get_MAX_VERTEX_UNIFORM_BLOCKS():Int\n{\n\treturn this.MAX_VERTEX_UNIFORM_BLOCKS;\n}\n\n@:noCompletion private inline function get_MAX_FRAGMENT_UNIFORM_BLOCKS():Int\n{\n\treturn this.MAX_FRAGMENT_UNIFORM_BLOCKS;\n}\n\n@:noCompletion private inline function get_MAX_COMBINED_UNIFORM_BLOCKS():Int\n{\n\treturn this.MAX_COMBINED_UNIFORM_BLOCKS;\n}\n\n@:noCompletion private inline function get_MAX_UNIFORM_BUFFER_BINDINGS():Int\n{\n\treturn this.MAX_UNIFORM_BUFFER_BINDINGS;\n}\n\n@:noCompletion private inline function get_MAX_UNIFORM_BLOCK_SIZE():Int\n{\n\treturn this.MAX_UNIFORM_BLOCK_SIZE;\n}\n\n@:noCompletion private inline function get_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS():Int\n{\n\treturn this.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;\n}\n\n@:noCompletion private inline function get_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS():Int\n{\n\treturn this.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;\n}\n\n@:noCompletion private inline function get_UNIFORM_BUFFER_OFFSET_ALIGNMENT():Int\n{\n\treturn this.UNIFORM_BUFFER_OFFSET_ALIGNMENT;\n}\n\n@:noCompletion private inline function get_ACTIVE_UNIFORM_BLOCKS():Int\n{\n\treturn this.ACTIVE_UNIFORM_BLOCKS;\n}\n\n@:noCompletion private inline function get_UNIFORM_TYPE():Int\n{\n\treturn this.UNIFORM_TYPE;\n}\n\n@:noCompletion private inline function get_UNIFORM_SIZE():Int\n{\n\treturn this.UNIFORM_SIZE;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_INDEX():Int\n{\n\treturn this.UNIFORM_BLOCK_INDEX;\n}\n\n@:noCompletion private inline function get_UNIFORM_OFFSET():Int\n{\n\treturn this.UNIFORM_OFFSET;\n}\n\n@:noCompletion private inline function get_UNIFORM_ARRAY_STRIDE():Int\n{\n\treturn this.UNIFORM_ARRAY_STRIDE;\n}\n\n@:noCompletion private inline function get_UNIFORM_MATRIX_STRIDE():Int\n{\n\treturn this.UNIFORM_MATRIX_STRIDE;\n}\n\n@:noCompletion private inline function get_UNIFORM_IS_ROW_MAJOR():Int\n{\n\treturn this.UNIFORM_IS_ROW_MAJOR;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_BINDING():Int\n{\n\treturn this.UNIFORM_BLOCK_BINDING;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_DATA_SIZE():Int\n{\n\treturn this.UNIFORM_BLOCK_DATA_SIZE;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_ACTIVE_UNIFORMS():Int\n{\n\treturn this.UNIFORM_BLOCK_ACTIVE_UNIFORMS;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES():Int\n{\n\treturn this.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER():Int\n{\n\treturn this.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER;\n}\n\n@:noCompletion private inline function get_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER():Int\n{\n\treturn this.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER;\n}\n\n@:noCompletion private inline function get_OBJECT_TYPE():Int\n{\n\treturn this.OBJECT_TYPE;\n}\n\n@:noCompletion private inline function get_SYNC_CONDITION():Int\n{\n\treturn this.SYNC_CONDITION;\n}\n\n@:noCompletion private inline function get_SYNC_STATUS():Int\n{\n\treturn this.SYNC_STATUS;\n}\n\n@:noCompletion private inline function get_SYNC_FLAGS():Int\n{\n\treturn this.SYNC_FLAGS;\n}\n\n@:noCompletion private inline function get_SYNC_FENCE():Int\n{\n\treturn this.SYNC_FENCE;\n}\n\n@:noCompletion private inline function get_SYNC_GPU_COMMANDS_COMPLETE():Int\n{\n\treturn this.SYNC_GPU_COMMANDS_COMPLETE;\n}\n\n@:noCompletion private inline function get_UNSIGNALED():Int\n{\n\treturn this.UNSIGNALED;\n}\n\n@:noCompletion private inline function get_SIGNALED():Int\n{\n\treturn this.SIGNALED;\n}\n\n@:noCompletion private inline function get_ALREADY_SIGNALED():Int\n{\n\treturn this.ALREADY_SIGNALED;\n}\n\n@:noCompletion private inline function get_TIMEOUT_EXPIRED():Int\n{\n\treturn this.TIMEOUT_EXPIRED;\n}\n\n@:noCompletion private inline function get_CONDITION_SATISFIED():Int\n{\n\treturn this.CONDITION_SATISFIED;\n}\n\n@:noCompletion private inline function get_WAIT_FAILED():Int\n{\n\treturn this.WAIT_FAILED;\n}\n\n@:noCompletion private inline function get_SYNC_FLUSH_COMMANDS_BIT():Int\n{\n\treturn this.SYNC_FLUSH_COMMANDS_BIT;\n}\n\n@:noCompletion private inline function get_COLOR():Int\n{\n\treturn this.COLOR;\n}\n\n@:noCompletion private inline function get_DEPTH():Int\n{\n\treturn this.DEPTH;\n}\n\n@:noCompletion private inline function get_STENCIL():Int\n{\n\treturn this.STENCIL;\n}\n\n@:noCompletion private inline function get_MIN():Int\n{\n\treturn this.MIN;\n}\n\n@:noCompletion private inline function get_MAX():Int\n{\n\treturn this.MAX;\n}\n\n@:noCompletion private inline function get_DEPTH_COMPONENT24():Int\n{\n\treturn this.DEPTH_COMPONENT24;\n}\n\n@:noCompletion private inline function get_STREAM_READ():Int\n{\n\treturn this.STREAM_READ;\n}\n\n@:noCompletion private inline function get_STREAM_COPY():Int\n{\n\treturn this.STREAM_COPY;\n}\n\n@:noCompletion private inline function get_STATIC_READ():Int\n{\n\treturn this.STATIC_READ;\n}\n\n@:noCompletion private inline function get_STATIC_COPY():Int\n{\n\treturn this.STATIC_COPY;\n}\n\n@:noCompletion private inline function get_DYNAMIC_READ():Int\n{\n\treturn this.DYNAMIC_READ;\n}\n\n@:noCompletion private inline function get_DYNAMIC_COPY():Int\n{\n\treturn this.DYNAMIC_COPY;\n}\n\n@:noCompletion private inline function get_DEPTH_COMPONENT32F():Int\n{\n\treturn this.DEPTH_COMPONENT32F;\n}\n\n@:noCompletion private inline function get_DEPTH32F_STENCIL8():Int\n{\n\treturn this.DEPTH32F_STENCIL8;\n}\n\n@:noCompletion private inline function get_INVALID_INDEX():Int\n{\n\treturn this.INVALID_INDEX;\n}\n\n@:noCompletion private inline function get_TIMEOUT_IGNORED():Int\n{\n\treturn this.TIMEOUT_IGNORED;\n}\n\n@:noCompletion private inline function get_MAX_CLIENT_WAIT_TIMEOUT_WEBGL():Int\n{\n\treturn this.MAX_CLIENT_WAIT_TIMEOUT_WEBGL;\n}\n\npublic inline function activeTexture(texture:Int):Void\n{\n\tthis.activeTexture(texture);\n}\n\npublic inline function attachShader(program:GLProgram, shader:GLShader):Void\n{\n\tthis.attachShader(program, shader);\n}\n\npublic inline function beginQuery(target:Int, query:GLQuery):Void\n{\n\tthis.beginQuery(target, query);\n}\n\npublic inline function beginTransformFeedback(primitiveNode:Int):Void\n{\n\tthis.beginTransformFeedback(primitiveNode);\n}\n\npublic inline function bindAttribLocation(program:GLProgram, index:Int, name:String):Void\n{\n\tthis.bindAttribLocation(program, index, name);\n}\n\npublic inline function bindBuffer(target:Int, buffer:GLBuffer):Void\n{\n\tthis.bindBuffer(target, buffer);\n}\n\npublic inline function bindBufferBase(target:Int, index:Int, buffer:GLBuffer):Void\n{\n\tthis.bindBufferBase(target, index, buffer);\n}\n\npublic inline function bindBufferRange(target:Int, index:Int, buffer:GLBuffer, offset:DataPointer, size:Int):Void\n{\n\tthis.bindBufferRange(target, index, buffer, offset, size);\n}\n\npublic inline function bindFramebuffer(target:Int, framebuffer:GLFramebuffer):Void\n{\n\tthis.bindFramebuffer(target, framebuffer);\n}\n\npublic inline function bindRenderbuffer(target:Int, renderbuffer:GLRenderbuffer):Void\n{\n\tthis.bindRenderbuffer(target, renderbuffer);\n}\n\npublic inline function bindSampler(unit:Int, sampler:GLSampler):Void\n{\n\tthis.bindSampler(unit, sampler);\n}\n\npublic inline function bindTexture(target:Int, texture:GLTexture):Void\n{\n\tthis.bindTexture(target, texture);\n}\n\npublic inline function bindTransformFeedback(target:Int, transformFeedback:GLTransformFeedback):Void\n{\n\tthis.bindTransformFeedback(target, transformFeedback);\n}\n\npublic inline function bindVertexArray(vertexArray:GLVertexArrayObject):Void\n{\n\tthis.bindVertexArray(vertexArray);\n}\n\npublic inline function blendColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n{\n\tthis.blendColor(red, green, blue, alpha);\n}\n\npublic inline function blendEquation(mode:Int):Void\n{\n\tthis.blendEquation(mode);\n}\n\npublic inline function blendEquationSeparate(modeRGB:Int, modeAlpha:Int):Void\n{\n\tthis.blendEquationSeparate(modeRGB, modeAlpha);\n}\n\npublic inline function blendFunc(sfactor:Int, dfactor:Int):Void\n{\n\tthis.blendFunc(sfactor, dfactor);\n}\n\npublic inline function blendFuncSeparate(srcRGB:Int, dstRGB:Int, srcAlpha:Int, dstAlpha:Int):Void\n{\n\tthis.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);\n}\n\npublic inline function blitFramebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int, dstY0:Int, dstX1:Int, dstY1:Int, mask:Int, filter:Int):Void\n{\n\tthis.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n}\n\npublic inline function bufferData(target:Int, size:Int, data:DataPointer, usage:Int):Void\n{\n\tthis.bufferData(target, size, data, usage);\n}\n\npublic inline function bufferSubData(target:Int, offset:Int, size:Int, data:DataPointer):Void\n{\n\tthis.bufferSubData(target, offset, size, data);\n}\n\npublic inline function checkFramebufferStatus(target:Int):Int\n{\n\treturn this.checkFramebufferStatus(target);\n}\n\npublic inline function clear(mask:Int):Void\n{\n\tthis.clear(mask);\n}\n\npublic inline function clearBufferfi(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void\n{\n\tthis.clearBufferfi(buffer, drawbuffer, depth, stencil);\n}\n\npublic inline function clearBufferfv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n{\n\tthis.clearBufferfv(buffer, drawbuffer, value);\n}\n\npublic inline function clearBufferiv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n{\n\tthis.clearBufferiv(buffer, drawbuffer, value);\n}\n\npublic inline function clearBufferuiv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n{\n\tthis.clearBufferuiv(buffer, drawbuffer, value);\n}\n\npublic inline function clearColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n{\n\tthis.clearColor(red, green, blue, alpha);\n}\n\npublic inline function clearDepthf(depth:Float):Void\n{\n\tthis.clearDepthf(depth);\n}\n\npublic inline function clearStencil(s:Int):Void\n{\n\tthis.clearStencil(s);\n}\n\npublic inline function clientWaitSync(sync:GLSync, flags:Int, timeout:Int64):Int\n{\n\treturn this.clientWaitSync(sync, flags, timeout);\n}\n\npublic inline function colorMask(red:Bool, green:Bool, blue:Bool, alpha:Bool):Void\n{\n\tthis.colorMask(red, green, blue, alpha);\n}\n\npublic inline function compileShader(shader:GLShader):Void\n{\n\tthis.compileShader(shader);\n}\n\npublic inline function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, imageSize:Int, data:DataPointer):Void\n{\n\tthis.compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);\n}\n\npublic inline function compressedTexImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, imageSize:Int,\n\t\tdata:DataPointer):Void\n{\n\tthis.compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);\n}\n\npublic inline function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, imageSize:Int,\n\t\tdata:DataPointer):Void\n{\n\tthis.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);\n}\n\npublic inline function compressedTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int,\n\t\timageSize:Int, data:DataPointer):Void\n{\n\tthis.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);\n}\n\npublic inline function copyBufferSubData(readTarget:Int, writeTarget:Int, readOffset:DataPointer, writeOffset:DataPointer, size:Int):Void\n{\n\tthis.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);\n}\n\npublic inline function copyTexImage2D(target:Int, level:Int, internalformat:Int, x:Int, y:Int, width:Int, height:Int, border:Int):Void\n{\n\tthis.copyTexImage2D(target, level, internalformat, x, y, width, height, border);\n}\n\npublic inline function copyTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n{\n\tthis.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);\n}\n\npublic inline function copyTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n{\n\tthis.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);\n}\n\npublic inline function createBuffer():GLBuffer\n{\n\treturn this.createBuffer();\n}\n\npublic inline function createFramebuffer():GLFramebuffer\n{\n\treturn this.createFramebuffer();\n}\n\npublic inline function createProgram():GLProgram\n{\n\treturn this.createProgram();\n}\n\npublic inline function createQuery():GLQuery\n{\n\treturn this.createQuery();\n}\n\npublic inline function createRenderbuffer():GLRenderbuffer\n{\n\treturn this.createRenderbuffer();\n}\n\npublic inline function createSampler():GLSampler\n{\n\treturn this.createSampler();\n}\n\npublic inline function createShader(type:Int):GLShader\n{\n\treturn this.createShader(type);\n}\n\npublic inline function createTexture():GLTexture\n{\n\treturn this.createTexture();\n}\n\npublic inline function createTransformFeedback():GLTransformFeedback\n{\n\treturn this.createTransformFeedback();\n}\n\npublic inline function createVertexArray():GLVertexArrayObject\n{\n\treturn this.createVertexArray();\n}\n\npublic inline function cullFace(mode:Int):Void\n{\n\tthis.cullFace(mode);\n}\n\npublic inline function deleteBuffer(buffer:GLBuffer):Void\n{\n\tthis.deleteBuffer(buffer);\n}\n\npublic inline function deleteFramebuffer(framebuffer:GLFramebuffer):Void\n{\n\tthis.deleteFramebuffer(framebuffer);\n}\n\npublic inline function deleteProgram(program:GLProgram):Void\n{\n\tthis.deleteProgram(program);\n}\n\npublic inline function deleteQuery(query:GLQuery):Void\n{\n\tthis.deleteQuery(query);\n}\n\npublic inline function deleteRenderbuffer(renderbuffer:GLRenderbuffer):Void\n{\n\tthis.deleteRenderbuffer(renderbuffer);\n}\n\npublic inline function deleteSampler(sampler:GLSampler):Void\n{\n\tthis.deleteSampler(sampler);\n}\n\npublic inline function deleteShader(shader:GLShader):Void\n{\n\tthis.deleteShader(shader);\n}\n\npublic inline function deleteSync(sync:GLSync):Void\n{\n\tthis.deleteSync(sync);\n}\n\npublic inline function deleteTexture(texture:GLTexture):Void\n{\n\tthis.deleteTexture(texture);\n}\n\npublic inline function deleteTransformFeedback(transformFeedback:GLTransformFeedback):Void\n{\n\tthis.deleteTransformFeedback(transformFeedback);\n}\n\npublic inline function deleteVertexArray(vertexArray:GLVertexArrayObject):Void\n{\n\tthis.deleteVertexArray(vertexArray);\n}\n\npublic inline function depthFunc(func:Int):Void\n{\n\tthis.depthFunc(func);\n}\n\npublic inline function depthMask(flag:Bool):Void\n{\n\tthis.depthMask(flag);\n}\n\npublic inline function depthRangef(zNear:Float, zFar:Float):Void\n{\n\tthis.depthRangef(zNear, zFar);\n}\n\npublic inline function detachShader(program:GLProgram, shader:GLShader):Void\n{\n\tthis.detachShader(program, shader);\n}\n\npublic inline function disable(cap:Int):Void\n{\n\tthis.disable(cap);\n}\n\npublic inline function disableVertexAttribArray(index:Int):Void\n{\n\tthis.disableVertexAttribArray(index);\n}\n\npublic inline function drawArrays(mode:Int, first:Int, count:Int):Void\n{\n\tthis.drawArrays(mode, first, count);\n}\n\npublic inline function drawArraysInstanced(mode:Int, first:Int, count:Int, instanceCount:Int):Void\n{\n\tthis.drawArraysInstanced(mode, first, count, instanceCount);\n}\n\npublic inline function drawBuffers(buffers:Array<Int>):Void\n{\n\tthis.drawBuffers(buffers);\n}\n\npublic inline function drawElements(mode:Int, count:Int, type:Int, offset:DataPointer):Void\n{\n\tthis.drawElements(mode, count, type, offset);\n}\n\npublic inline function drawElementsInstanced(mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void\n{\n\tthis.drawElementsInstanced(mode, count, type, offset, instanceCount);\n}\n\npublic inline function drawRangeElements(mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void\n{\n\tthis.drawRangeElements(mode, start, end, count, type, offset);\n}\n\npublic inline function enable(cap:Int):Void\n{\n\tthis.enable(cap);\n}\n\npublic inline function enableVertexAttribArray(index:Int):Void\n{\n\tthis.enableVertexAttribArray(index);\n}\n\npublic inline function endQuery(target:Int):Void\n{\n\tthis.endQuery(target);\n}\n\npublic inline function endTransformFeedback():Void\n{\n\tthis.endTransformFeedback();\n}\n\npublic inline function fenceSync(condition:Int, flags:Int):GLSync\n{\n\treturn this.fenceSync(condition, flags);\n}\n\npublic inline function finish():Void\n{\n\tthis.finish();\n}\n\npublic inline function flush():Void\n{\n\tthis.flush();\n}\n\npublic inline function framebufferRenderbuffer(target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:GLRenderbuffer):Void\n{\n\tthis.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);\n}\n\npublic inline function framebufferTexture2D(target:Int, attachment:Int, textarget:Int, texture:GLTexture, level:Int):Void\n{\n\tthis.framebufferTexture2D(target, attachment, textarget, texture, level);\n}\n\npublic inline function framebufferTextureLayer(target:Int, attachment:Int, texture:GLTexture, level:Int, layer:Int):Void\n{\n\tthis.framebufferTextureLayer(target, attachment, texture, level, layer);\n}\n\npublic inline function frontFace(mode:Int):Void\n{\n\tthis.frontFace(mode);\n}\n\npublic function genBuffers(n:Int, buffers:Array<GLBuffer> = null):Array<GLBuffer>\n{\n\tif (buffers == null) buffers = [];\n\n\tfor (i in 0...n)\n\t{\n\t\tbuffers[i] = createBuffer();\n\t}\n\n\treturn buffers;\n}\n\npublic inline function generateMipmap(target:Int):Void\n{\n\tthis.generateMipmap(target);\n}\n\npublic function genFramebuffers(n:Int, framebuffers:Array<GLFramebuffer> = null):Array<GLFramebuffer>\n{\n\tif (framebuffers == null) framebuffers = [];\n\n\tfor (i in 0...n)\n\t{\n\t\tframebuffers[i] = createFramebuffer();\n\t}\n\n\treturn framebuffers;\n}\n\npublic function genQueries(n:Int, queries:Array<GLQuery> = null):Array<GLQuery>\n{\n\tif (queries == null) queries = [];\n\n\tfor (i in 0...n)\n\t{\n\t\tqueries[i] = createQuery();\n\t}\n\n\treturn queries;\n}\n\npublic function genRenderbuffers(n:Int, renderbuffers:Array<GLRenderbuffer> = null):Array<GLRenderbuffer>\n{\n\tif (renderbuffers == null) renderbuffers = [];\n\n\tfor (i in 0...n)\n\t{\n\t\trenderbuffers[i] = createRenderbuffer();\n\t}\n\n\treturn renderbuffers;\n}\n\npublic function genSamplers(n:Int, samplers:Array<GLSampler> = null):Array<GLSampler>\n{\n\tif (samplers == null) samplers = [];\n\n\tfor (i in 0...n)\n\t{\n\t\tsamplers[i] = createSampler();\n\t}\n\n\treturn samplers;\n}\n\npublic function genTextures(n:Int, textures:Array<GLTexture> = null):Array<GLTexture>\n{\n\tif (textures == null) textures = [];\n\n\tfor (i in 0...n)\n\t{\n\t\ttextures[i] = createTexture();\n\t}\n\n\treturn textures;\n}\n\npublic function genTransformFeedbacks(n:Int, transformFeedbacks:Array<GLTransformFeedback> = null):Array<GLTransformFeedback>\n{\n\tif (transformFeedbacks == null) transformFeedbacks = [];\n\n\tfor (i in 0...n)\n\t{\n\t\ttransformFeedbacks[i] = createTransformFeedback();\n\t}\n\n\treturn transformFeedbacks;\n}\n\npublic inline function getActiveAttrib(program:GLProgram, index:Int):GLActiveInfo\n{\n\treturn this.getActiveAttrib(program, index);\n}\n\npublic inline function getActiveUniform(program:GLProgram, index:Int):GLActiveInfo\n{\n\treturn this.getActiveUniform(program, index);\n}\n\npublic inline function getActiveUniformBlocki(program:GLProgram, uniformBlockIndex:Int, pname:Int):Int\n{\n\treturn this.getActiveUniformBlocki(program, uniformBlockIndex, pname);\n}\n\npublic inline function getActiveUniformBlockiv(program:GLProgram, uniformBlockIndex:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);\n}\n\npublic inline function getActiveUniformBlockName(program:GLProgram, uniformBlockIndex:Int):String\n{\n\treturn this.getActiveUniformBlockName(program, uniformBlockIndex);\n}\n\npublic inline function getActiveUniformsiv(program:GLProgram, uniformIndices:Array<Int>, pname:Int, params:DataPointer):Void\n{\n\tthis.getActiveUniformsiv(program, uniformIndices, pname, params);\n}\n\npublic inline function getAttachedShaders(program:GLProgram):Array<GLShader>\n{\n\treturn this.getAttachedShaders(program);\n}\n\npublic inline function getAttribLocation(program:GLProgram, name:String):Int\n{\n\treturn this.getAttribLocation(program, name);\n}\n\npublic inline function getBoolean(pname:Int):Bool\n{\n\treturn this.getBoolean(pname);\n}\n\npublic inline function getBooleanv(pname:Int, params:DataPointer):Void\n{\n\tthis.getBooleanv(pname, params);\n}\n\npublic inline function getBufferParameteri(target:Int, pname:Int):Int\n{\n\treturn this.getBufferParameteri(target, pname);\n}\n\npublic inline function getBufferParameteri64v(target:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getBufferParameteri64v(target, pname, params);\n}\n\npublic inline function getBufferParameteriv(target:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getBufferParameteriv(target, pname, params);\n}\n\npublic inline function getBufferPointerv(target:Int, pname:Int):DataPointer\n{\n\treturn this.getBufferPointerv(target, pname);\n}\n\npublic inline function getError():Int\n{\n\treturn this.getError();\n}\n\npublic inline function getFloat(pname:Int):Float\n{\n\treturn this.getFloat(pname);\n}\n\npublic inline function getFloatv(pname:Int, params:DataPointer):Void\n{\n\tthis.getFloatv(pname, params);\n}\n\npublic inline function getExtension(name:String):Dynamic\n{\n\treturn this.getExtension(name);\n}\n\npublic inline function getFragDataLocation(program:GLProgram, name:String):Int\n{\n\treturn this.getFragDataLocation(program, name);\n}\n\npublic inline function getFramebufferAttachmentParameteri(target:Int, attachment:Int, pname:Int):Int\n{\n\treturn this.getFramebufferAttachmentParameteri(target, attachment, pname);\n}\n\npublic inline function getFramebufferAttachmentParameteriv(target:Int, attachment:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getFramebufferAttachmentParameteriv(target, attachment, pname, params);\n}\n\npublic inline function getInteger(pname:Int):Int\n{\n\treturn this.getInteger(pname);\n}\n\npublic inline function getInteger64(pname:Int):Int64\n{\n\treturn this.getInteger64(pname);\n}\n\npublic inline function getInteger64i(pname:Int):Int64\n{\n\treturn this.getInteger64(pname);\n}\n\npublic inline function getInteger64i_v(pname:Int, index:Int, params:DataPointer):Void\n{\n\tthis.getInteger64i_v(pname, index, params);\n}\n\npublic inline function getInteger64v(pname:Int, params:DataPointer):Void\n{\n\tthis.getInteger64v(pname, params);\n}\n\npublic inline function getIntegeri_v(pname:Int, index:Int, params:DataPointer):Void\n{\n\tthis.getIntegeri_v(pname, index, params);\n}\n\npublic inline function getIntegerv(pname:Int, params:DataPointer):Void\n{\n\tthis.getIntegerv(pname, params);\n}\n\npublic inline function getInternalformati(target:Int, internalformat:Int, pname:Int):Int\n{\n\treturn this.getInternalformatParameter(target, internalformat, pname);\n}\n\npublic inline function getInternalformativ(target:Int, internalformat:Int, pname:Int, bufSize, params:DataPointer):Void\n{\n\treturn this.getInternalformativ(target, internalformat, pname, bufSize, params);\n}\n\npublic inline function getProgramBinary(program:GLProgram, binaryFormat:Int):Bytes\n{\n\treturn this.getProgramBinary(program, binaryFormat);\n}\n\npublic inline function getProgrami(program:GLProgram, pname:Int):Int\n{\n\treturn this.getProgrami(program, pname);\n}\n\npublic inline function getProgramInfoLog(program:GLProgram):String\n{\n\treturn this.getProgramInfoLog(program);\n}\n\npublic inline function getProgramiv(program:GLProgram, pname:Int, params:DataPointer):Void\n{\n\tthis.getProgramiv(program, pname, params);\n}\n\npublic inline function getQueryi(target:Int, pname:Int):Int\n{\n\treturn this.getQueryi(target, pname);\n}\n\npublic inline function getQueryiv(target:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getQueryiv(target, pname, params);\n}\n\npublic inline function getQueryObjectui(query:GLQuery, pname:Int):Int\n{\n\treturn this.getQueryObjectui(query, pname);\n}\n\npublic inline function getQueryObjectuiv(query:GLQuery, pname:Int, params:DataPointer):Void\n{\n\tthis.getQueryObjectuiv(query, pname, params);\n}\n\npublic inline function getRenderbufferParameteri(target:Int, pname:Int):Int\n{\n\treturn this.getRenderbufferParameteri(target, pname);\n}\n\npublic inline function getRenderbufferParameteriv(target:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getRenderbufferParameteriv(target, pname, params);\n}\n\npublic inline function getSamplerParameteri(sampler:GLSampler, pname:Int):Int\n{\n\treturn this.getSamplerParameteri(sampler, pname);\n}\n\npublic inline function getSamplerParameteriv(sampler:GLSampler, pname:Int, params:DataPointer):Void\n{\n\tthis.getSamplerParameteriv(sampler, pname, params);\n}\n\npublic inline function getSamplerParameterf(sampler:GLSampler, pname:Int):Float\n{\n\treturn this.getSamplerParameterf(sampler, pname);\n}\n\npublic inline function getSamplerParameterfv(sampler:GLSampler, pname:Int, params:DataPointer):Void\n{\n\tthis.getSamplerParameterfv(sampler, pname, params);\n}\n\npublic inline function getShaderInfoLog(shader:GLShader):String\n{\n\treturn this.getShaderInfoLog(shader);\n}\n\npublic inline function getShaderi(shader:GLShader, pname:Int):Int\n{\n\treturn this.getShaderi(shader, pname);\n}\n\npublic inline function getShaderiv(shader:GLShader, pname:Int, params:DataPointer):Void\n{\n\tthis.getShaderiv(shader, pname, params);\n}\n\npublic inline function getShaderPrecisionFormat(shadertype:Int, precisiontype:Int):GLShaderPrecisionFormat\n{\n\treturn this.getShaderPrecisionFormat(shadertype, precisiontype);\n}\n\npublic inline function getShaderSource(shader:GLShader):String\n{\n\treturn this.getShaderSource(shader);\n}\n\npublic inline function getString(name:Int):String\n{\n\treturn this.getString(name);\n}\n\npublic inline function getStringi(name:Int, index:Int):String\n{\n\treturn this.getStringi(name, index);\n}\n\npublic inline function getSyncParameteri(sync:GLSync, pname:Int):Int\n{\n\treturn this.getSyncParameteri(sync, pname);\n}\n\npublic inline function getSyncParameteriv(sync:GLSync, pname:Int, params:DataPointer):Void\n{\n\tthis.getSyncParameteriv(sync, pname, params);\n}\n\npublic inline function getTexParameterf(target:Int, pname:Int):Float\n{\n\treturn this.getTexParameterf(target, pname);\n}\n\npublic inline function getTexParameterfv(target:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getTexParameterfv(target, pname, params);\n}\n\npublic inline function getTexParameteri(target:Int, pname:Int):Int\n{\n\treturn this.getTexParameteri(target, pname);\n}\n\npublic inline function getTexParameteriv(target:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getTexParameteriv(target, pname, params);\n}\n\npublic inline function getTransformFeedbackVarying(program:GLProgram, index:Int):GLActiveInfo\n{\n\treturn this.getTransformFeedbackVarying(program, index);\n}\n\npublic inline function getUniformf(program:GLProgram, location:GLUniformLocation):Float\n{\n\treturn this.getUniformf(program, location);\n}\n\npublic inline function getUniformfv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n{\n\tthis.getUniformfv(program, location, params);\n}\n\npublic inline function getUniformi(program:GLProgram, location:GLUniformLocation):Int\n{\n\treturn this.getUniformi(program, location);\n}\n\npublic inline function getUniformiv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n{\n\tthis.getUniformiv(program, location, params);\n}\n\npublic inline function getUniformui(program:GLProgram, location:GLUniformLocation):Int\n{\n\treturn this.getUniformui(program, location);\n}\n\npublic inline function getUniformuiv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n{\n\treturn this.getUniformuiv(program, location, params);\n}\n\npublic inline function getUniformBlockIndex(program:GLProgram, uniformBlockName:String):Int\n{\n\treturn this.getUniformBlockIndex(program, uniformBlockName);\n}\n\npublic inline function getUniformIndices(program:GLProgram, uniformNames:Array<String>):Array<Int>\n{\n\treturn this.getUniformIndices(program, uniformNames);\n}\n\npublic inline function getUniformLocation(program:GLProgram, name:String):GLUniformLocation\n{\n\treturn this.getUniformLocation(program, name);\n}\n\npublic inline function getVertexAttribf(index:Int, pname:Int):Float\n{\n\treturn this.getVertexAttribf(index, pname);\n}\n\npublic inline function getVertexAttribfv(index:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getVertexAttribfv(index, pname, params);\n}\n\npublic inline function getVertexAttribi(index:Int, pname:Int):Int\n{\n\treturn this.getVertexAttrib(index, pname);\n}\n\npublic inline function getVertexAttribIi(index:Int, pname:Int):Int\n{\n\treturn this.getVertexAttribIi(index, pname);\n}\n\npublic inline function getVertexAttribIiv(index:Int, pname:Int, params:DataPointer):Void\n{\n\treturn this.getVertexAttribIiv(index, pname, params);\n}\n\npublic inline function getVertexAttribIui(index:Int, pname:Int):Int\n{\n\treturn this.getVertexAttribIui(index, pname);\n}\n\npublic inline function getVertexAttribIuiv(index:Int, pname:Int, params:DataPointer):Void\n{\n\treturn this.getVertexAttribIuiv(index, pname, params);\n}\n\npublic inline function getVertexAttribiv(index:Int, pname:Int, params:DataPointer):Void\n{\n\tthis.getVertexAttribiv(index, pname, params);\n}\n\npublic inline function getVertexAttribPointerv(index:Int, pname:Int):DataPointer\n{\n\treturn this.getVertexAttribPointerv(index, pname);\n}\n\npublic inline function hint(target:Int, mode:Int):Void\n{\n\tthis.hint(target, mode);\n}\n\npublic inline function invalidateFramebuffer(target:Int, attachments:Array<Int>):Void\n{\n\tthis.invalidateFramebuffer(target, attachments);\n}\n\npublic inline function invalidateSubFramebuffer(target:Int, attachments:Array<Int>, x:Int, y:Int, width:Int, height:Int):Void\n{\n\tthis.invalidateSubFramebuffer(target, attachments, x, y, width, height);\n}\n\npublic inline function isBuffer(buffer:GLBuffer):Bool\n{\n\treturn this.isBuffer(buffer);\n}\n\npublic inline function isEnabled(cap:Int):Bool\n{\n\treturn this.isEnabled(cap);\n}\n\npublic inline function isFramebuffer(framebuffer:GLFramebuffer):Bool\n{\n\treturn this.isFramebuffer(framebuffer);\n}\n\npublic inline function isProgram(program:GLProgram):Bool\n{\n\treturn this.isProgram(program);\n}\n\npublic inline function isQuery(query:GLQuery):Bool\n{\n\treturn this.isQuery(query);\n}\n\npublic inline function isRenderbuffer(renderbuffer:GLRenderbuffer):Bool\n{\n\treturn this.isRenderbuffer(renderbuffer);\n}\n\npublic inline function isSampler(sampler:GLSampler):Bool\n{\n\treturn this.isSampler(sampler);\n}\n\npublic inline function isShader(shader:GLShader):Bool\n{\n\treturn this.isShader(shader);\n}\n\npublic inline function isTexture(texture:GLTexture):Bool\n{\n\treturn this.isTexture(texture);\n}\n\npublic inline function isTransformFeedback(transformFeedback:GLTransformFeedback):Bool\n{\n\treturn this.isTransformFeedback(transformFeedback);\n}\n\npublic inline function isVertexArray(vertexArray:GLVertexArrayObject):Bool\n{\n\treturn this.isVertexArray(vertexArray);\n}\n\npublic inline function lineWidth(width:Float):Void\n{\n\tthis.lineWidth(width);\n}\n\npublic inline function linkProgram(program:GLProgram):Void\n{\n\tthis.linkProgram(program);\n}\n\npublic inline function mapBufferRange(target:Int, offset:DataPointer, length:Int, access:Int):DataPointer\n{\n\treturn this.mapBufferRange(target, offset, length, access);\n}\n\npublic inline function pauseTransformFeedback():Void\n{\n\tthis.pauseTransformFeedback();\n}\n\npublic inline function pixelStorei(pname:Int, param:Int):Void\n{\n\tthis.pixelStorei(pname, param);\n}\n\npublic inline function polygonOffset(factor:Float, units:Float):Void\n{\n\tthis.polygonOffset(factor, units);\n}\n\npublic inline function programBinary(program:GLProgram, binaryFormat:Int, binary:DataPointer, length:Int):Void\n{\n\tthis.programBinary(program, binaryFormat, binary, length);\n}\n\npublic inline function programParameteri(program:GLProgram, pname:Int, value:Int):Void\n{\n\tthis.programParameteri(program, pname, value);\n}\n\npublic inline function readBuffer(src:Int):Void\n{\n\tthis.readBuffer(src);\n}\n\npublic inline function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, data:DataPointer):Void\n{\n\tthis.readPixels(x, y, width, height, format, type, data);\n}\n\npublic inline function releaseShaderCompiler():Void\n{\n\tthis.releaseShaderCompiler();\n}\n\npublic inline function renderbufferStorage(target:Int, internalformat:Int, width:Int, height:Int):Void\n{\n\tthis.renderbufferStorage(target, internalformat, width, height);\n}\n\npublic inline function renderbufferStorageMultisample(target:Int, samples:Int, internalformat:Int, width:Int, height:Int):Void\n{\n\tthis.renderbufferStorageMultisample(target, samples, internalformat, width, height);\n}\n\npublic inline function resumeTransformFeedback():Void\n{\n\tthis.resumeTransformFeedback();\n}\n\npublic inline function sampleCoverage(value:Float, invert:Bool):Void\n{\n\tthis.sampleCoverage(value, invert);\n}\n\npublic inline function samplerParameterf(sampler:GLSampler, pname:Int, param:Float):Void\n{\n\tthis.samplerParameterf(sampler, pname, param);\n}\n\npublic inline function samplerParameteri(sampler:GLSampler, pname:Int, param:Int):Void\n{\n\tthis.samplerParameteri(sampler, pname, param);\n}\n\npublic inline function scissor(x:Int, y:Int, width:Int, height:Int):Void\n{\n\tthis.scissor(x, y, width, height);\n}\n\npublic inline function shaderBinary(shaders:Array<GLShader>, binaryformat:Int, binary:DataPointer, length:Int):Void\n{\n\tthis.shaderBinary(shaders, binaryformat, binary, length);\n}\n\npublic inline function shaderSource(shader:GLShader, source:String):Void\n{\n\tthis.shaderSource(shader, source);\n}\n\npublic inline function stencilFunc(func:Int, ref:Int, mask:Int):Void\n{\n\tthis.stencilFunc(func, ref, mask);\n}\n\npublic inline function stencilFuncSeparate(face:Int, func:Int, ref:Int, mask:Int):Void\n{\n\tthis.stencilFuncSeparate(face, func, ref, mask);\n}\n\npublic inline function stencilMask(mask:Int):Void\n{\n\tthis.stencilMask(mask);\n}\n\npublic inline function stencilMaskSeparate(face:Int, mask:Int):Void\n{\n\tthis.stencilMaskSeparate(face, mask);\n}\n\npublic inline function stencilOp(fail:Int, zfail:Int, zpass:Int):Void\n{\n\tthis.stencilOp(fail, zfail, zpass);\n}\n\npublic inline function stencilOpSeparate(face:Int, fail:Int, zfail:Int, zpass:Int):Void\n{\n\tthis.stencilOpSeparate(face, fail, zfail, zpass);\n}\n\npublic inline function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, data:DataPointer):Void\n{\n\tthis.texImage2D(target, level, internalformat, width, height, border, format, type, data);\n}\n\npublic inline function texImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\tdata:DataPointer):Void\n{\n\tthis.texImage3D(target, level, internalformat, width, height, depth, border, format, type, data);\n}\n\npublic inline function texStorage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int):Void\n{\n\tthis.texStorage2D(target, level, internalformat, width, height);\n}\n\npublic inline function texStorage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void\n{\n\tthis.texStorage3D(target, level, internalformat, width, height, depth);\n}\n\npublic inline function texParameterf(target:Int, pname:Int, param:Float):Void\n{\n\tthis.texParameterf(target, pname, param);\n}\n\npublic inline function texParameteri(target:Int, pname:Int, param:Int):Void\n{\n\tthis.texParameteri(target, pname, param);\n}\n\npublic inline function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, data:DataPointer):Void\n{\n\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data);\n}\n\npublic inline function texSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int,\n\t\tdata:DataPointer):Void\n{\n\tthis.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);\n}\n\npublic inline function transformFeedbackVaryings(program:GLProgram, varyings:Array<String>, bufferMode:Int):Void\n{\n\tthis.transformFeedbackVaryings(program, varyings, bufferMode);\n}\n\npublic inline function uniform1f(location:GLUniformLocation, v0:Float):Void\n{\n\tthis.uniform1f(location, v0);\n}\n\npublic inline function uniform1fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform1fv(location, count, v);\n}\n\npublic inline function uniform1i(location:GLUniformLocation, v0:Int):Void\n{\n\tthis.uniform1i(location, v0);\n}\n\npublic inline function uniform1iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform1iv(location, count, v);\n}\n\npublic inline function uniform1ui(location:GLUniformLocation, v0:Int):Void\n{\n\tthis.uniform1ui(location, v0);\n}\n\npublic inline function uniform1uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform1uiv(location, count, v);\n}\n\npublic inline function uniform2f(location:GLUniformLocation, v0:Float, v1:Float):Void\n{\n\tthis.uniform2f(location, v0, v1);\n}\n\npublic inline function uniform2fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform2fv(location, count, v);\n}\n\npublic inline function uniform2i(location:GLUniformLocation, v0:Int, v1:Int):Void\n{\n\tthis.uniform2i(location, v0, v1);\n}\n\npublic inline function uniform2iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform2iv(location, count, v);\n}\n\npublic inline function uniform2ui(location:GLUniformLocation, v0:Int, v1:Int):Void\n{\n\tthis.uniform2ui(location, v0, v1);\n}\n\npublic inline function uniform2uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform2uiv(location, count, v);\n}\n\npublic inline function uniform3f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float):Void\n{\n\tthis.uniform3f(location, v0, v1, v2);\n}\n\npublic inline function uniform3fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform3fv(location, count, v);\n}\n\npublic inline function uniform3i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n{\n\tthis.uniform3i(location, v0, v1, v2);\n}\n\npublic inline function uniform3iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform3iv(location, count, v);\n}\n\npublic inline function uniform3ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n{\n\tthis.uniform3ui(location, v0, v1, v2);\n}\n\npublic inline function uniform3uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform3uiv(location, count, v);\n}\n\npublic inline function uniform4f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float, v3:Float):Void\n{\n\tthis.uniform4f(location, v0, v1, v2, v3);\n}\n\npublic inline function uniform4fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform4fv(location, count, v);\n}\n\npublic inline function uniform4i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void\n{\n\tthis.uniform4i(location, v0, v1, v2, v3);\n}\n\npublic inline function uniform4iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform4iv(location, count, v);\n}\n\npublic inline function uniform4ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void\n{\n\tthis.uniform4ui(location, v0, v1, v2, v3);\n}\n\npublic inline function uniform4uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n{\n\tthis.uniform4uiv(location, count, v);\n}\n\npublic inline function uniformBlockBinding(program:GLProgram, uniformBlockIndex:Int, uniformBlockBinding:Int):Void\n{\n\tthis.uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);\n}\n\npublic inline function uniformMatrix2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix2fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix2x3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix2x3fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix2x4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix2x4fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix3fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix3x2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix3x2fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix3x4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix3x4fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix4fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix4x2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix4x2fv(location, count, transpose, v);\n}\n\npublic inline function uniformMatrix4x3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n{\n\tthis.uniformMatrix4x3fv(location, count, transpose, v);\n}\n\npublic inline function unmapBuffer(target:Int):Bool\n{\n\treturn this.unmapBuffer(target);\n}\n\npublic inline function useProgram(program:GLProgram):Void\n{\n\tthis.useProgram(program);\n}\n\npublic inline function validateProgram(program:GLProgram):Void\n{\n\tthis.validateProgram(program);\n}\n\npublic inline function vertexAttrib1f(indx:Int, x:Float):Void\n{\n\tthis.vertexAttrib1f(indx, x);\n}\n\npublic inline function vertexAttrib1fv(indx:Int, values:DataPointer):Void\n{\n\tthis.vertexAttrib1fv(indx, values);\n}\n\npublic inline function vertexAttrib2f(indx:Int, x:Float, y:Float):Void\n{\n\tthis.vertexAttrib2f(indx, x, y);\n}\n\npublic inline function vertexAttrib2fv(indx:Int, values:DataPointer):Void\n{\n\tthis.vertexAttrib2fv(indx, values);\n}\n\npublic inline function vertexAttrib3f(indx:Int, x:Float, y:Float, z:Float):Void\n{\n\tthis.vertexAttrib3f(indx, x, y, z);\n}\n\npublic inline function vertexAttrib3fv(indx:Int, values:DataPointer):Void\n{\n\tthis.vertexAttrib3fv(indx, values);\n}\n\npublic inline function vertexAttrib4f(indx:Int, x:Float, y:Float, z:Float, w:Float):Void\n{\n\tthis.vertexAttrib4f(indx, x, y, z, w);\n}\n\npublic inline function vertexAttrib4fv(indx:Int, values:DataPointer):Void\n{\n\tthis.vertexAttrib4fv(indx, values);\n}\n\npublic inline function vertexAttribDivisor(index:Int, divisor:Int):Void\n{\n\tthis.vertexAttribDivisor(index, divisor);\n}\n\npublic inline function vertexAttribI4i(indx:Int, x:Int, y:Int, z:Int, w:Int):Void\n{\n\tthis.vertexAttribI4i(indx, x, y, z, w);\n}\n\npublic inline function vertexAttribI4iv(indx:Int, values:DataPointer):Void\n{\n\tthis.vertexAttribI4iv(indx, values);\n}\n\npublic inline function vertexAttribI4ui(indx:Int, x:Int, y:Int, z:Int, w:Int):Void\n{\n\tthis.vertexAttribI4ui(indx, x, y, z, w);\n}\n\npublic inline function vertexAttribI4uiv(indx:Int, values:DataPointer):Void\n{\n\tthis.vertexAttribI4uiv(indx, values);\n}\n\npublic inline function vertexAttribIPointer(indx:Int, size:Int, type:Int, stride:Int, pointer:DataPointer):Void\n{\n\tthis.vertexAttribIPointer(indx, size, type, stride, pointer);\n}\n\npublic inline function vertexAttribPointer(indx:Int, size:Int, type:Int, normalized:Bool, stride:Int, pointer:DataPointer):Void\n{\n\tthis.vertexAttribPointer(indx, size, type, normalized, stride, pointer);\n}\n\npublic inline function viewport(x:Int, y:Int, width:Int, height:Int):Void\n{\n\tthis.viewport(x, y, width, height);\n}\n\npublic inline function waitSync(sync:GLSync, flags:Int, timeout:Int64):Void\n{\n\tthis.waitSync(sync, flags, timeout);\n}\n\n@:from private static function fromGL(gl:Class<GL>):OpenGLES3RenderContext\n{\n\treturn cast GL.context;\n}\n\n@:from private static function fromRenderContext(context:RenderContext):OpenGLES3RenderContext\n{\n\treturn context.gles3;\n}\n}\n#else\nimport lime.graphics.opengl.GL;\n\n@:forward()\n@:transitive\nabstract OpenGLES3RenderContext(Dynamic) from Dynamic to Dynamic\n{\n\t@:from private static function fromRenderContext(context:RenderContext):OpenGLES3RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromGL(gl:Class<GL>):OpenGLES3RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromOpenGLES2RenderContext(context:OpenGLES2RenderContext):OpenGLES3RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromWebGLRenderContext(context:WebGLRenderContext):OpenGLES3RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromWebGL2RenderContext(context:WebGL2RenderContext):OpenGLES3RenderContext\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/OpenGLRenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_opengl)\n#if (lime_doc_gen || (sys && lime_cffi && !doc_gen))\nimport lime._internal.backend.native.NativeOpenGLRenderContext;\n\n/**\n\tThe `OpenGLRenderContext` allows access to OpenGL features when OpenGL is the render\n\tcontext type of the `Window`. Historically, Lime was designed for WebGL render support\n\ton all platforms, and support has expanded to provide additional OpenGL ES native APIs.\n\n\tSupport for desktop OpenGL-specific features is currently sparse, but the\n\t`OpenGLRenderContext` provides the platform for us to add additional desktop specific\n\tfeatures.\n\n\tThe `OpenGLRenderContext` is not compatible with mobile or web targets, but it can be\n\tconverted to an OpenGL ES or a WebGL-style context for cross-platform development.\n\n\tYou can convert from `lime.graphics.RenderContext` or `lime.graphics.opengl.GL`, and\n\tcan convert to `lime.graphics.OpenGLES3RenderContext`,\n\t`lime.graphics.OpenGLES2RenderContext`, `lime.graphics.WebGL2RenderContext`, or\n\t`lime.graphics.WebGLRenderContext` directly if desired:\n\n\t```haxe\n\tvar gl:OpenGLRenderContext = window.context;\n\tvar gl:OpenGLRenderContext = GL;\n\n\tvar gles3:OpenGLES3RenderContext = gl;\n\tvar gles2:OpenGLES2RenderContext = gl;\n\tvar webgl2:WebGL2RenderContext = gl;\n\tvar webgl:WebGLRenderContext = gl;\n\t```\n**/\n@:access(lime.graphics.RenderContext)\n@:forward()\n@:transitive\nabstract OpenGLRenderContext(NativeOpenGLRenderContext) from NativeOpenGLRenderContext to NativeOpenGLRenderContext\n{\n\t@:from private static function fromRenderContext(context:RenderContext):OpenGLRenderContext\n\t{\n\t\treturn context.gl;\n\t}\n}\n#else\n@:forward()\n@:transitive\nabstract OpenGLRenderContext(Dynamic) from Dynamic to Dynamic\n{\n\t@:from private static function fromRenderContext(context:RenderContext):OpenGLRenderContext\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/PixelFormat.hx",
    "content": "package lime.graphics;\n\n/**\n\tAn enum containing different pixel encoding formats for image data\n**/\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract PixelFormat(Int) from Int to Int from UInt to UInt\n{\n\t/**\n\t\tAn image encoded in 32-bit RGBA color order\n\t**/\n\tpublic var RGBA32 = 0;\n\n\t/**\n\t\tAn image encoded in 32-bit ARGB color order\n\t**/\n\tpublic var ARGB32 = 1;\n\n\t/**\n\t\tAn image encoded in 32-bit BGRA color order\n\t**/\n\tpublic var BGRA32 = 2;\n}\n"
  },
  {
    "path": "src/lime/graphics/RenderContext.hx",
    "content": "package lime.graphics;\n\nimport lime.app.Event;\nimport lime.ui.Window;\n\n/**\n\tThe `RenderContext` provides access to rendering for a Lime `Window`.\n\n\tOnly one render context type is used at once, but when `OPENGL` or\n\t`OPENGLES` is the context type, compatibility contexts for other\n\tforms of GL (such as WebGL) may be available also.\n**/\nclass RenderContext\n{\n\t/**\n\t\tAdditional information about the current context\n\t**/\n\tpublic var attributes(default, null):RenderContextAttributes;\n\n\t/**\n\t\tAccess to the current Cairo render context, if available\n\t**/\n\t#if (!lime_doc_gen || native)\n\tpublic var cairo(default, null):CairoRenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current HTML5 canvas render context, if available\n\t**/\n\t#if (!lime_doc_gen || (js && html5))\n\tpublic var canvas2D(default, null):Canvas2DRenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current HTML5 DOM render context, if available\n\t**/\n\t#if (!lime_doc_gen || (js && html5))\n\tpublic var dom(default, null):DOMRenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current Flash render context, if available\n\t**/\n\t#if (!lime_doc_gen || flash)\n\tpublic var flash(default, null):FlashRenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current OpenGL render API, if available\n\t**/\n\t#if (!lime_doc_gen || (native && desktop))\n\tpublic var gl(default, null):OpenGLRenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current OpenGL ES 2.0 render API, if available\n\t**/\n\t#if (!lime_doc_gen || native)\n\tpublic var gles2(default, null):OpenGLES2RenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current OpenGL ES 3.0 render API, if available\n\t**/\n\t#if (!lime_doc_gen || native)\n\tpublic var gles3(default, null):OpenGLES3RenderContext;\n\t#end\n\n\t/**\n\t\tThe type of the current `RenderContext`\n\t**/\n\tpublic var type(default, null):RenderContextType;\n\n\tpublic var version(default, null):String;\n\n\t/**\n\t\tAccess to the current WebGL render API, if available\n\t**/\n\t#if (!lime_doc_gen || native || (js && html5))\n\tpublic var webgl(default, null):WebGLRenderContext;\n\t#end\n\n\t/**\n\t\tAccess to the current WebGL 2 render API, if available\n\t**/\n\t#if (!lime_doc_gen || native || (js && html5))\n\tpublic var webgl2(default, null):WebGL2RenderContext;\n\t#end\n\tpublic var window(default, null):Window;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/RenderContextAttributes.hx",
    "content": "package lime.graphics;\n\n/**\n\tAdditional options possible for a render context\n**/\ntypedef RenderContextAttributes =\n{\n\t/**\n\t\tWhether to enable anti-aliasing, `0` is disabled, `2` enables\n\t\t2x2 anti-aliasing or `4` enables 4x4 anti-aliasing.\n\t**/\n\t@:optional var antialiasing:Int;\n\n\t/**\n\t\tAn optional `background` property to be provided to rendering,\n\t\ta value of `null` means no background color.\n\t**/\n\t@:optional var background:Null<Int>;\n\n\t/**\n\t\tThe color depth of the rendering context in bits\n\t**/\n\t@:optional var colorDepth:Int;\n\n\t/**\n\t\tWhether a depth buffer is enabled\n\t**/\n\t@:optional var depth:Bool;\n\n\t/**\n\t\tWhether hardware acceleration is allowed\n\t**/\n\t@:optional var hardware:Bool;\n\n\t#if html5\n\t/**\n\t\tWhether to preserve the `HTMLCanvas`'s image data after rendering\n\t**/\n\t@:optional var preserveDrawingBuffer:Bool;\n\t#end\n\n\t/**\n\t\tWhether a stencil buffer is enabled\n\t**/\n\t@:optional var stencil:Bool;\n\n\t/**\n\t\tThe type of render context requested\n\t**/\n\t@:optional var type:RenderContextType;\n\n\t@:optional var version:String;\n\n\t/**\n\t\tWhether vertical-sync (VSync) is enabled\n\t**/\n\t@:optional var vsync:Bool;\n}\n"
  },
  {
    "path": "src/lime/graphics/RenderContextType.hx",
    "content": "package lime.graphics;\n\n/**\n\tAn enum for possible render context types\n**/\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract RenderContextType(String) from String to String\n{\n\t/**\n\t\tDescribes a Cairo render context\n\t**/\n\tvar CAIRO = \"cairo\";\n\n\t/**\n\t\tDescribes an HTML5 canvas render context\n\t**/\n\tvar CANVAS = \"canvas\";\n\n\t/**\n\t\tDescribes an HTML5 DOM render context\n\t**/\n\tvar DOM = \"dom\";\n\n\t/**\n\t\tDescribes a Flash render context\n\t**/\n\tvar FLASH = \"flash\";\n\n\t/**\n\t\tDescribes an OpenGL render context\n\t**/\n\tvar OPENGL = \"opengl\";\n\n\t/**\n\t\tDescribes an OpenGL ES render context\n\t**/\n\tvar OPENGLES = \"opengles\";\n\n\t/**\n\t\tDescribes a WebGL render context\n\t**/\n\tvar WEBGL = \"webgl\";\n\n\t/**\n\t\tDescribes a custom render context\n\t**/\n\tvar CUSTOM = \"custom\";\n}\n"
  },
  {
    "path": "src/lime/graphics/WebGL2RenderContext.hx",
    "content": "package lime.graphics;\n\n#if (lime_webgl && !doc_gen)\nimport lime._internal.backend.html5.HTML5WebGL2RenderContext;\nimport lime.graphics.opengl.*;\nimport lime.utils.DataPointer;\n@:access(lime.graphics.RenderContext)\n@:forward()\n@:transitive\nabstract WebGL2RenderContext(HTML5WebGL2RenderContext) from HTML5WebGL2RenderContext to HTML5WebGL2RenderContext\n{\n\tpublic inline function bufferData(target:Int, srcData:Dynamic, usage:Int, ?srcOffset:Int, ?length:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.bufferData(target, srcData, usage, srcOffset, length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.bufferData(target, srcData, usage);\n\t\t}\n\t}\n\n\tpublic inline function bufferSubData(target:Int, dstByteOffset:Int, srcData:Dynamic, ?srcOffset:Int, ?length:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.bufferSubData(target, dstByteOffset, srcData, srcOffset, length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.bufferSubData(target, dstByteOffset, srcData);\n\t\t}\n\t}\n\n\tpublic inline function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, srcData:Dynamic, ?srcOffset:Int,\n\t\t\t?srcLengthOverride:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.compressedTexImage2D(target, level, internalformat, width, height, border, srcData, srcOffset, srcLengthOverride);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.compressedTexImage2D(target, level, internalformat, width, height, border, srcData);\n\t\t}\n\t}\n\n\tpublic inline function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, srcData:Dynamic,\n\t\t\t?srcOffset:Int, ?srcLengthOverride:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, srcData, srcOffset, srcLengthOverride);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, srcData);\n\t\t}\n\t}\n\n\tpublic inline function getBufferSubData(target:Int, srcByteOffset:DataPointer, dstData:Dynamic, ?srcOffset:Dynamic, ?length:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.getBufferSubData(target, srcByteOffset, dstData, srcOffset, length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.getBufferSubData(target, srcByteOffset, dstData);\n\t\t}\n\t}\n\n\tpublic inline function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:Dynamic, ?dstOffset:Int):Void\n\t{\n\t\tif (dstOffset != null)\n\t\t{\n\t\t\tthis.readPixels(x, y, width, height, format, type, pixels, dstOffset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.readPixels(x, y, width, height, format, type, pixels);\n\t\t}\n\t}\n\n\tpublic inline function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Dynamic, ?format:Int, ?type:Int,\n\t\t\t?srcData:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.texImage2D(target, level, internalformat, width, height, border, format, type, srcData, srcOffset);\n\t\t}\n\t\telse if (format != null)\n\t\t{\n\t\t\tthis.texImage2D(target, level, internalformat, width, height, border, format, type, srcData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.texImage2D(target, level, internalformat, width, height, border); // target, level, internalformat, format, type, pixels\n\t\t}\n\t}\n\n\tpublic inline function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Dynamic, ?type:Int, ?srcData:Dynamic,\n\t\t\t?srcOffset:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, srcData, srcOffset);\n\t\t}\n\t\telse if (type != null)\n\t\t{\n\t\t\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, srcData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format); // target, level, xoffset, yoffset, format, type, pixels\n\t\t}\n\t}\n\n\tpublic inline function uniform1fv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform1fv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform1fv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniform1iv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform1iv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform1iv(location, data);\n\t\t}\n\t}\n\n\tpublic function uniform2fv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform2fv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform2fv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniform2iv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform2iv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform2iv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniform3fv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform3fv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform3fv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniform3iv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform3iv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform3iv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniform4fv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform4fv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform4fv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniform4iv(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniform4iv(location, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniform4iv(location, data);\n\t\t}\n\t}\n\n\tpublic inline function uniformMatrix2fv(location:GLUniformLocation, transpose:Bool, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniformMatrix2fv(location, transpose, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniformMatrix2fv(location, transpose, data);\n\t\t}\n\t}\n\n\tpublic inline function uniformMatrix3fv(location:GLUniformLocation, transpose:Bool, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniformMatrix3fv(location, transpose, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniformMatrix3fv(location, transpose, data);\n\t\t}\n\t}\n\n\tpublic inline function uniformMatrix4fv(location:GLUniformLocation, transpose:Bool, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tif (srcOffset != null)\n\t\t{\n\t\t\tthis.uniformMatrix4fv(location, transpose, data, srcOffset, srcLength);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.uniformMatrix4fv(location, transpose, data);\n\t\t}\n\t}\n\n\t@:from private static function fromGL(gl:Class<GL>):WebGL2RenderContext\n\t{\n\t\treturn null;\n\t}\n\n\t@:from private static function fromRenderContext(context:RenderContext):WebGL2RenderContext\n\t{\n\t\treturn context.webgl2;\n\t}\n\n\t@:from private static function toWebGLRenderContext(gl:WebGLRenderContext):WebGL2RenderContext\n\t{\n\t\treturn cast gl;\n\t}\n}\n#elseif (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\nimport haxe.Int64;\nimport lime.graphics.opengl.*;\nimport lime.graphics.OpenGLRenderContext;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.ArrayBufferView;\nimport lime.utils.BytePointer;\nimport lime.utils.DataPointer;\nimport lime.utils.Float32Array;\nimport lime.utils.Int32Array;\nimport lime.utils.UInt32Array;\n\n/**\n\tThe `WebGL2RenderContext` allows access to WebGL 2 features when OpenGL, OpenGL ES\n\tor WebGL is the render context type of the `Window`, and the current context supports\n\tWebGL 2 features.\n\n\tUsing a WebGL context on a desktop platform enables support for cross-platform\n\tcode that should run on all platforms (when using hardware acceleration), though support\n\tfor WebGL 2 features are more limited than WebGL, and require an OpenGL ES 3.0 compatible\n\tdesktop or mobile context.\n\n\tYou can convert from `lime.graphics.RenderContext`, `lime.graphics.OpenGLRenderContext`,\n\t`lime.graphics.OpenGLES3RenderContext` or `lime.graphics.opengl.GL`, and can convert to\n\t`lime.graphics.WebGLRenderContext` directly if desired:\n\n\t```haxe\n\tvar webgl2:WebGL2RenderContext = window.context;\n\tvar webgl2:WebGL2RenderContext = gl;\n\tvar webgl2:WebGL2RenderContext = gles3;\n\tvar webgl2:WebGL2RenderContext = GL;\n\n\tvar webgl:WebGLRenderContext = webgl2;\n\t```\n**/\n@:access(lime.graphics.RenderContext)\n#if !doc_gen\n@:transitive\nabstract WebGL2RenderContext(OpenGLRenderContext) from OpenGLRenderContext to OpenGLRenderContext\n{\n#else\nabstract WebGL2RenderContext(Dynamic) from Dynamic to Dynamic\n{\n#end\n\n\tprivate static var __tempPointer = new BytePointer();\n\tpublic var DEPTH_BUFFER_BIT(get, never):Int;\n\tpublic var STENCIL_BUFFER_BIT(get, never):Int;\n\tpublic var COLOR_BUFFER_BIT(get, never):Int;\n\tpublic var POINTS(get, never):Int;\n\tpublic var LINES(get, never):Int;\n\tpublic var LINE_LOOP(get, never):Int;\n\tpublic var LINE_STRIP(get, never):Int;\n\tpublic var TRIANGLES(get, never):Int;\n\tpublic var TRIANGLE_STRIP(get, never):Int;\n\tpublic var TRIANGLE_FAN(get, never):Int;\n\tpublic var ZERO(get, never):Int;\n\tpublic var ONE(get, never):Int;\n\tpublic var SRC_COLOR(get, never):Int;\n\tpublic var ONE_MINUS_SRC_COLOR(get, never):Int;\n\tpublic var SRC_ALPHA(get, never):Int;\n\tpublic var ONE_MINUS_SRC_ALPHA(get, never):Int;\n\tpublic var DST_ALPHA(get, never):Int;\n\tpublic var ONE_MINUS_DST_ALPHA(get, never):Int;\n\tpublic var DST_COLOR(get, never):Int;\n\tpublic var ONE_MINUS_DST_COLOR(get, never):Int;\n\tpublic var SRC_ALPHA_SATURATE(get, never):Int;\n\tpublic var FUNC_ADD(get, never):Int;\n\tpublic var BLEND_EQUATION(get, never):Int;\n\tpublic var BLEND_EQUATION_RGB(get, never):Int;\n\tpublic var BLEND_EQUATION_ALPHA(get, never):Int;\n\tpublic var FUNC_SUBTRACT(get, never):Int;\n\tpublic var FUNC_REVERSE_SUBTRACT(get, never):Int;\n\tpublic var BLEND_DST_RGB(get, never):Int;\n\tpublic var BLEND_SRC_RGB(get, never):Int;\n\tpublic var BLEND_DST_ALPHA(get, never):Int;\n\tpublic var BLEND_SRC_ALPHA(get, never):Int;\n\tpublic var CONSTANT_COLOR(get, never):Int;\n\tpublic var ONE_MINUS_CONSTANT_COLOR(get, never):Int;\n\tpublic var CONSTANT_ALPHA(get, never):Int;\n\tpublic var ONE_MINUS_CONSTANT_ALPHA(get, never):Int;\n\tpublic var BLEND_COLOR(get, never):Int;\n\tpublic var ARRAY_BUFFER(get, never):Int;\n\tpublic var ELEMENT_ARRAY_BUFFER(get, never):Int;\n\tpublic var ARRAY_BUFFER_BINDING(get, never):Int;\n\tpublic var ELEMENT_ARRAY_BUFFER_BINDING(get, never):Int;\n\tpublic var STREAM_DRAW(get, never):Int;\n\tpublic var STATIC_DRAW(get, never):Int;\n\tpublic var DYNAMIC_DRAW(get, never):Int;\n\tpublic var BUFFER_SIZE(get, never):Int;\n\tpublic var BUFFER_USAGE(get, never):Int;\n\tpublic var CURRENT_VERTEX_ATTRIB(get, never):Int;\n\tpublic var FRONT(get, never):Int;\n\tpublic var BACK(get, never):Int;\n\tpublic var FRONT_AND_BACK(get, never):Int;\n\tpublic var CULL_FACE(get, never):Int;\n\tpublic var BLEND(get, never):Int;\n\tpublic var DITHER(get, never):Int;\n\tpublic var STENCIL_TEST(get, never):Int;\n\tpublic var DEPTH_TEST(get, never):Int;\n\tpublic var SCISSOR_TEST(get, never):Int;\n\tpublic var POLYGON_OFFSET_FILL(get, never):Int;\n\tpublic var SAMPLE_ALPHA_TO_COVERAGE(get, never):Int;\n\tpublic var SAMPLE_COVERAGE(get, never):Int;\n\tpublic var NO_ERROR(get, never):Int;\n\tpublic var INVALID_ENUM(get, never):Int;\n\tpublic var INVALID_VALUE(get, never):Int;\n\tpublic var INVALID_OPERATION(get, never):Int;\n\tpublic var OUT_OF_MEMORY(get, never):Int;\n\tpublic var CW(get, never):Int;\n\tpublic var CCW(get, never):Int;\n\tpublic var LINE_WIDTH(get, never):Int;\n\tpublic var ALIASED_POINT_SIZE_RANGE(get, never):Int;\n\tpublic var ALIASED_LINE_WIDTH_RANGE(get, never):Int;\n\tpublic var CULL_FACE_MODE(get, never):Int;\n\tpublic var FRONT_FACE(get, never):Int;\n\tpublic var DEPTH_RANGE(get, never):Int;\n\tpublic var DEPTH_WRITEMASK(get, never):Int;\n\tpublic var DEPTH_CLEAR_VALUE(get, never):Int;\n\tpublic var DEPTH_FUNC(get, never):Int;\n\tpublic var STENCIL_CLEAR_VALUE(get, never):Int;\n\tpublic var STENCIL_FUNC(get, never):Int;\n\tpublic var STENCIL_FAIL(get, never):Int;\n\tpublic var STENCIL_PASS_DEPTH_FAIL(get, never):Int;\n\tpublic var STENCIL_PASS_DEPTH_PASS(get, never):Int;\n\tpublic var STENCIL_REF(get, never):Int;\n\tpublic var STENCIL_VALUE_MASK(get, never):Int;\n\tpublic var STENCIL_WRITEMASK(get, never):Int;\n\tpublic var STENCIL_BACK_FUNC(get, never):Int;\n\tpublic var STENCIL_BACK_FAIL(get, never):Int;\n\tpublic var STENCIL_BACK_PASS_DEPTH_FAIL(get, never):Int;\n\tpublic var STENCIL_BACK_PASS_DEPTH_PASS(get, never):Int;\n\tpublic var STENCIL_BACK_REF(get, never):Int;\n\tpublic var STENCIL_BACK_VALUE_MASK(get, never):Int;\n\tpublic var STENCIL_BACK_WRITEMASK(get, never):Int;\n\tpublic var VIEWPORT(get, never):Int;\n\tpublic var SCISSOR_BOX(get, never):Int;\n\tpublic var COLOR_CLEAR_VALUE(get, never):Int;\n\tpublic var COLOR_WRITEMASK(get, never):Int;\n\tpublic var UNPACK_ALIGNMENT(get, never):Int;\n\tpublic var PACK_ALIGNMENT(get, never):Int;\n\tpublic var MAX_TEXTURE_SIZE(get, never):Int;\n\tpublic var MAX_VIEWPORT_DIMS(get, never):Int;\n\tpublic var SUBPIXEL_BITS(get, never):Int;\n\tpublic var RED_BITS(get, never):Int;\n\tpublic var GREEN_BITS(get, never):Int;\n\tpublic var BLUE_BITS(get, never):Int;\n\tpublic var ALPHA_BITS(get, never):Int;\n\tpublic var DEPTH_BITS(get, never):Int;\n\tpublic var STENCIL_BITS(get, never):Int;\n\tpublic var POLYGON_OFFSET_UNITS(get, never):Int;\n\tpublic var POLYGON_OFFSET_FACTOR(get, never):Int;\n\tpublic var TEXTURE_BINDING_2D(get, never):Int;\n\tpublic var SAMPLE_BUFFERS(get, never):Int;\n\tpublic var SAMPLES(get, never):Int;\n\tpublic var SAMPLE_COVERAGE_VALUE(get, never):Int;\n\tpublic var SAMPLE_COVERAGE_INVERT(get, never):Int;\n\tpublic var COMPRESSED_TEXTURE_FORMATS(get, never):Int;\n\tpublic var DONT_CARE(get, never):Int;\n\tpublic var FASTEST(get, never):Int;\n\tpublic var NICEST(get, never):Int;\n\tpublic var GENERATE_MIPMAP_HINT(get, never):Int;\n\tpublic var BYTE(get, never):Int;\n\tpublic var UNSIGNED_BYTE(get, never):Int;\n\tpublic var SHORT(get, never):Int;\n\tpublic var UNSIGNED_SHORT(get, never):Int;\n\tpublic var INT(get, never):Int;\n\tpublic var UNSIGNED_INT(get, never):Int;\n\tpublic var FLOAT(get, never):Int;\n\tpublic var DEPTH_COMPONENT(get, never):Int;\n\tpublic var ALPHA(get, never):Int;\n\tpublic var RGB(get, never):Int;\n\tpublic var RGBA(get, never):Int;\n\tpublic var LUMINANCE(get, never):Int;\n\tpublic var LUMINANCE_ALPHA(get, never):Int;\n\tpublic var UNSIGNED_SHORT_4_4_4_4(get, never):Int;\n\tpublic var UNSIGNED_SHORT_5_5_5_1(get, never):Int;\n\tpublic var UNSIGNED_SHORT_5_6_5(get, never):Int;\n\tpublic var FRAGMENT_SHADER(get, never):Int;\n\tpublic var VERTEX_SHADER(get, never):Int;\n\tpublic var MAX_VERTEX_ATTRIBS(get, never):Int;\n\tpublic var MAX_VERTEX_UNIFORM_VECTORS(get, never):Int;\n\tpublic var MAX_VARYING_VECTORS(get, never):Int;\n\tpublic var MAX_COMBINED_TEXTURE_IMAGE_UNITS(get, never):Int;\n\tpublic var MAX_VERTEX_TEXTURE_IMAGE_UNITS(get, never):Int;\n\tpublic var MAX_TEXTURE_IMAGE_UNITS(get, never):Int;\n\tpublic var MAX_FRAGMENT_UNIFORM_VECTORS(get, never):Int;\n\tpublic var SHADER_TYPE(get, never):Int;\n\tpublic var DELETE_STATUS(get, never):Int;\n\tpublic var LINK_STATUS(get, never):Int;\n\tpublic var VALIDATE_STATUS(get, never):Int;\n\tpublic var ATTACHED_SHADERS(get, never):Int;\n\tpublic var ACTIVE_UNIFORMS(get, never):Int;\n\tpublic var ACTIVE_ATTRIBUTES(get, never):Int;\n\tpublic var SHADING_LANGUAGE_VERSION(get, never):Int;\n\tpublic var CURRENT_PROGRAM(get, never):Int;\n\tpublic var NEVER(get, never):Int;\n\tpublic var LESS(get, never):Int;\n\tpublic var EQUAL(get, never):Int;\n\tpublic var LEQUAL(get, never):Int;\n\tpublic var GREATER(get, never):Int;\n\tpublic var NOTEQUAL(get, never):Int;\n\tpublic var GEQUAL(get, never):Int;\n\tpublic var ALWAYS(get, never):Int;\n\tpublic var KEEP(get, never):Int;\n\tpublic var REPLACE(get, never):Int;\n\tpublic var INCR(get, never):Int;\n\tpublic var DECR(get, never):Int;\n\tpublic var INVERT(get, never):Int;\n\tpublic var INCR_WRAP(get, never):Int;\n\tpublic var DECR_WRAP(get, never):Int;\n\tpublic var VENDOR(get, never):Int;\n\tpublic var RENDERER(get, never):Int;\n\tpublic var VERSION(get, never):Int;\n\tpublic var NEAREST(get, never):Int;\n\tpublic var LINEAR(get, never):Int;\n\tpublic var NEAREST_MIPMAP_NEAREST(get, never):Int;\n\tpublic var LINEAR_MIPMAP_NEAREST(get, never):Int;\n\tpublic var NEAREST_MIPMAP_LINEAR(get, never):Int;\n\tpublic var LINEAR_MIPMAP_LINEAR(get, never):Int;\n\tpublic var TEXTURE_MAG_FILTER(get, never):Int;\n\tpublic var TEXTURE_MIN_FILTER(get, never):Int;\n\tpublic var TEXTURE_WRAP_S(get, never):Int;\n\tpublic var TEXTURE_WRAP_T(get, never):Int;\n\tpublic var TEXTURE_2D(get, never):Int;\n\tpublic var TEXTURE(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP(get, never):Int;\n\tpublic var TEXTURE_BINDING_CUBE_MAP(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_X(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_X(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_Y(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_Y(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP_POSITIVE_Z(get, never):Int;\n\tpublic var TEXTURE_CUBE_MAP_NEGATIVE_Z(get, never):Int;\n\tpublic var MAX_CUBE_MAP_TEXTURE_SIZE(get, never):Int;\n\tpublic var TEXTURE0(get, never):Int;\n\tpublic var TEXTURE1(get, never):Int;\n\tpublic var TEXTURE2(get, never):Int;\n\tpublic var TEXTURE3(get, never):Int;\n\tpublic var TEXTURE4(get, never):Int;\n\tpublic var TEXTURE5(get, never):Int;\n\tpublic var TEXTURE6(get, never):Int;\n\tpublic var TEXTURE7(get, never):Int;\n\tpublic var TEXTURE8(get, never):Int;\n\tpublic var TEXTURE9(get, never):Int;\n\tpublic var TEXTURE10(get, never):Int;\n\tpublic var TEXTURE11(get, never):Int;\n\tpublic var TEXTURE12(get, never):Int;\n\tpublic var TEXTURE13(get, never):Int;\n\tpublic var TEXTURE14(get, never):Int;\n\tpublic var TEXTURE15(get, never):Int;\n\tpublic var TEXTURE16(get, never):Int;\n\tpublic var TEXTURE17(get, never):Int;\n\tpublic var TEXTURE18(get, never):Int;\n\tpublic var TEXTURE19(get, never):Int;\n\tpublic var TEXTURE20(get, never):Int;\n\tpublic var TEXTURE21(get, never):Int;\n\tpublic var TEXTURE22(get, never):Int;\n\tpublic var TEXTURE23(get, never):Int;\n\tpublic var TEXTURE24(get, never):Int;\n\tpublic var TEXTURE25(get, never):Int;\n\tpublic var TEXTURE26(get, never):Int;\n\tpublic var TEXTURE27(get, never):Int;\n\tpublic var TEXTURE28(get, never):Int;\n\tpublic var TEXTURE29(get, never):Int;\n\tpublic var TEXTURE30(get, never):Int;\n\tpublic var TEXTURE31(get, never):Int;\n\tpublic var ACTIVE_TEXTURE(get, never):Int;\n\tpublic var REPEAT(get, never):Int;\n\tpublic var CLAMP_TO_EDGE(get, never):Int;\n\tpublic var MIRRORED_REPEAT(get, never):Int;\n\tpublic var FLOAT_VEC2(get, never):Int;\n\tpublic var FLOAT_VEC3(get, never):Int;\n\tpublic var FLOAT_VEC4(get, never):Int;\n\tpublic var INT_VEC2(get, never):Int;\n\tpublic var INT_VEC3(get, never):Int;\n\tpublic var INT_VEC4(get, never):Int;\n\tpublic var BOOL(get, never):Int;\n\tpublic var BOOL_VEC2(get, never):Int;\n\tpublic var BOOL_VEC3(get, never):Int;\n\tpublic var BOOL_VEC4(get, never):Int;\n\tpublic var FLOAT_MAT2(get, never):Int;\n\tpublic var FLOAT_MAT3(get, never):Int;\n\tpublic var FLOAT_MAT4(get, never):Int;\n\tpublic var SAMPLER_2D(get, never):Int;\n\tpublic var SAMPLER_CUBE(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_ENABLED(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_SIZE(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_STRIDE(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_TYPE(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_NORMALIZED(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_POINTER(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_BUFFER_BINDING(get, never):Int;\n\tpublic var COMPILE_STATUS(get, never):Int;\n\tpublic var LOW_FLOAT(get, never):Int;\n\tpublic var MEDIUM_FLOAT(get, never):Int;\n\tpublic var HIGH_FLOAT(get, never):Int;\n\tpublic var LOW_INT(get, never):Int;\n\tpublic var MEDIUM_INT(get, never):Int;\n\tpublic var HIGH_INT(get, never):Int;\n\tpublic var FRAMEBUFFER(get, never):Int;\n\tpublic var RENDERBUFFER(get, never):Int;\n\tpublic var RGBA4(get, never):Int;\n\tpublic var RGB5_A1(get, never):Int;\n\tpublic var RGB565(get, never):Int;\n\tpublic var DEPTH_COMPONENT16(get, never):Int;\n\tpublic var STENCIL_INDEX(get, never):Int;\n\tpublic var STENCIL_INDEX8(get, never):Int;\n\tpublic var DEPTH_STENCIL(get, never):Int;\n\tpublic var RENDERBUFFER_WIDTH(get, never):Int;\n\tpublic var RENDERBUFFER_HEIGHT(get, never):Int;\n\tpublic var RENDERBUFFER_INTERNAL_FORMAT(get, never):Int;\n\tpublic var RENDERBUFFER_RED_SIZE(get, never):Int;\n\tpublic var RENDERBUFFER_GREEN_SIZE(get, never):Int;\n\tpublic var RENDERBUFFER_BLUE_SIZE(get, never):Int;\n\tpublic var RENDERBUFFER_ALPHA_SIZE(get, never):Int;\n\tpublic var RENDERBUFFER_DEPTH_SIZE(get, never):Int;\n\tpublic var RENDERBUFFER_STENCIL_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_OBJECT_NAME(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE(get, never):Int;\n\tpublic var COLOR_ATTACHMENT0(get, never):Int;\n\tpublic var DEPTH_ATTACHMENT(get, never):Int;\n\tpublic var STENCIL_ATTACHMENT(get, never):Int;\n\tpublic var DEPTH_STENCIL_ATTACHMENT(get, never):Int;\n\tpublic var NONE(get, never):Int;\n\tpublic var FRAMEBUFFER_COMPLETE(get, never):Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_ATTACHMENT(get, never):Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT(get, never):Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_DIMENSIONS(get, never):Int;\n\tpublic var FRAMEBUFFER_UNSUPPORTED(get, never):Int;\n\tpublic var FRAMEBUFFER_BINDING(get, never):Int;\n\tpublic var RENDERBUFFER_BINDING(get, never):Int;\n\tpublic var MAX_RENDERBUFFER_SIZE(get, never):Int;\n\tpublic var INVALID_FRAMEBUFFER_OPERATION(get, never):Int;\n\tpublic var UNPACK_FLIP_Y_WEBGL(get, never):Int;\n\tpublic var UNPACK_PREMULTIPLY_ALPHA_WEBGL(get, never):Int;\n\tpublic var CONTEXT_LOST_WEBGL(get, never):Int;\n\tpublic var UNPACK_COLORSPACE_CONVERSION_WEBGL(get, never):Int;\n\tpublic var BROWSER_DEFAULT_WEBGL(get, never):Int;\n\tpublic var READ_BUFFER(get, never):Int;\n\tpublic var UNPACK_ROW_LENGTH(get, never):Int;\n\tpublic var UNPACK_SKIP_ROWS(get, never):Int;\n\tpublic var UNPACK_SKIP_PIXELS(get, never):Int;\n\tpublic var PACK_ROW_LENGTH(get, never):Int;\n\tpublic var PACK_SKIP_ROWS(get, never):Int;\n\tpublic var PACK_SKIP_PIXELS(get, never):Int;\n\tpublic var TEXTURE_BINDING_3D(get, never):Int;\n\tpublic var UNPACK_SKIP_IMAGES(get, never):Int;\n\tpublic var UNPACK_IMAGE_HEIGHT(get, never):Int;\n\tpublic var MAX_3D_TEXTURE_SIZE(get, never):Int;\n\tpublic var MAX_ELEMENTS_VERTICES(get, never):Int;\n\tpublic var MAX_ELEMENTS_INDICES(get, never):Int;\n\tpublic var MAX_TEXTURE_LOD_BIAS(get, never):Int;\n\tpublic var MAX_FRAGMENT_UNIFORM_COMPONENTS(get, never):Int;\n\tpublic var MAX_VERTEX_UNIFORM_COMPONENTS(get, never):Int;\n\tpublic var MAX_ARRAY_TEXTURE_LAYERS(get, never):Int;\n\tpublic var MIN_PROGRAM_TEXEL_OFFSET(get, never):Int;\n\tpublic var MAX_PROGRAM_TEXEL_OFFSET(get, never):Int;\n\tpublic var MAX_VARYING_COMPONENTS(get, never):Int;\n\tpublic var FRAGMENT_SHADER_DERIVATIVE_HINT(get, never):Int;\n\tpublic var RASTERIZER_DISCARD(get, never):Int;\n\tpublic var VERTEX_ARRAY_BINDING(get, never):Int;\n\tpublic var MAX_VERTEX_OUTPUT_COMPONENTS(get, never):Int;\n\tpublic var MAX_FRAGMENT_INPUT_COMPONENTS(get, never):Int;\n\tpublic var MAX_SERVER_WAIT_TIMEOUT(get, never):Int;\n\tpublic var MAX_ELEMENT_INDEX(get, never):Int;\n\tpublic var RED(get, never):Int;\n\tpublic var RGB8(get, never):Int;\n\tpublic var RGBA8(get, never):Int;\n\tpublic var RGB10_A2(get, never):Int;\n\tpublic var TEXTURE_3D(get, never):Int;\n\tpublic var TEXTURE_WRAP_R(get, never):Int;\n\tpublic var TEXTURE_MIN_LOD(get, never):Int;\n\tpublic var TEXTURE_MAX_LOD(get, never):Int;\n\tpublic var TEXTURE_BASE_LEVEL(get, never):Int;\n\tpublic var TEXTURE_MAX_LEVEL(get, never):Int;\n\tpublic var TEXTURE_COMPARE_MODE(get, never):Int;\n\tpublic var TEXTURE_COMPARE_FUNC(get, never):Int;\n\tpublic var SRGB(get, never):Int;\n\tpublic var SRGB8(get, never):Int;\n\tpublic var SRGB8_ALPHA8(get, never):Int;\n\tpublic var COMPARE_REF_TO_TEXTURE(get, never):Int;\n\tpublic var RGBA32F(get, never):Int;\n\tpublic var RGB32F(get, never):Int;\n\tpublic var RGBA16F(get, never):Int;\n\tpublic var RGB16F(get, never):Int;\n\tpublic var TEXTURE_2D_ARRAY(get, never):Int;\n\tpublic var TEXTURE_BINDING_2D_ARRAY(get, never):Int;\n\tpublic var R11F_G11F_B10F(get, never):Int;\n\tpublic var RGB9_E5(get, never):Int;\n\tpublic var RGBA32UI(get, never):Int;\n\tpublic var RGB32UI(get, never):Int;\n\tpublic var RGBA16UI(get, never):Int;\n\tpublic var RGB16UI(get, never):Int;\n\tpublic var RGBA8UI(get, never):Int;\n\tpublic var RGB8UI(get, never):Int;\n\tpublic var RGBA32I(get, never):Int;\n\tpublic var RGB32I(get, never):Int;\n\tpublic var RGBA16I(get, never):Int;\n\tpublic var RGB16I(get, never):Int;\n\tpublic var RGBA8I(get, never):Int;\n\tpublic var RGB8I(get, never):Int;\n\tpublic var RED_INTEGER(get, never):Int;\n\tpublic var RGB_INTEGER(get, never):Int;\n\tpublic var RGBA_INTEGER(get, never):Int;\n\tpublic var R8(get, never):Int;\n\tpublic var RG8(get, never):Int;\n\tpublic var R16F(get, never):Int;\n\tpublic var R32F(get, never):Int;\n\tpublic var RG16F(get, never):Int;\n\tpublic var RG32F(get, never):Int;\n\tpublic var R8I(get, never):Int;\n\tpublic var R8UI(get, never):Int;\n\tpublic var R16I(get, never):Int;\n\tpublic var R16UI(get, never):Int;\n\tpublic var R32I(get, never):Int;\n\tpublic var R32UI(get, never):Int;\n\tpublic var RG8I(get, never):Int;\n\tpublic var RG8UI(get, never):Int;\n\tpublic var RG16I(get, never):Int;\n\tpublic var RG16UI(get, never):Int;\n\tpublic var RG32I(get, never):Int;\n\tpublic var RG32UI(get, never):Int;\n\tpublic var R8_SNORM(get, never):Int;\n\tpublic var RG8_SNORM(get, never):Int;\n\tpublic var RGB8_SNORM(get, never):Int;\n\tpublic var RGBA8_SNORM(get, never):Int;\n\tpublic var RGB10_A2UI(get, never):Int;\n\tpublic var TEXTURE_IMMUTABLE_FORMAT(get, never):Int;\n\tpublic var TEXTURE_IMMUTABLE_LEVELS(get, never):Int;\n\tpublic var UNSIGNED_INT_2_10_10_10_REV(get, never):Int;\n\tpublic var UNSIGNED_INT_10F_11F_11F_REV(get, never):Int;\n\tpublic var UNSIGNED_INT_5_9_9_9_REV(get, never):Int;\n\tpublic var FLOAT_32_UNSIGNED_INT_24_8_REV(get, never):Int;\n\tpublic var UNSIGNED_INT_24_8(get, never):Int;\n\tpublic var HALF_FLOAT(get, never):Int;\n\tpublic var RG(get, never):Int;\n\tpublic var RG_INTEGER(get, never):Int;\n\tpublic var INT_2_10_10_10_REV(get, never):Int;\n\tpublic var CURRENT_QUERY(get, never):Int;\n\tpublic var QUERY_RESULT(get, never):Int;\n\tpublic var QUERY_RESULT_AVAILABLE(get, never):Int;\n\tpublic var ANY_SAMPLES_PASSED(get, never):Int;\n\tpublic var ANY_SAMPLES_PASSED_CONSERVATIVE(get, never):Int;\n\tpublic var MAX_DRAW_BUFFERS(get, never):Int;\n\tpublic var DRAW_BUFFER0(get, never):Int;\n\tpublic var DRAW_BUFFER1(get, never):Int;\n\tpublic var DRAW_BUFFER2(get, never):Int;\n\tpublic var DRAW_BUFFER3(get, never):Int;\n\tpublic var DRAW_BUFFER4(get, never):Int;\n\tpublic var DRAW_BUFFER5(get, never):Int;\n\tpublic var DRAW_BUFFER6(get, never):Int;\n\tpublic var DRAW_BUFFER7(get, never):Int;\n\tpublic var DRAW_BUFFER8(get, never):Int;\n\tpublic var DRAW_BUFFER9(get, never):Int;\n\tpublic var DRAW_BUFFER10(get, never):Int;\n\tpublic var DRAW_BUFFER11(get, never):Int;\n\tpublic var DRAW_BUFFER12(get, never):Int;\n\tpublic var DRAW_BUFFER13(get, never):Int;\n\tpublic var DRAW_BUFFER14(get, never):Int;\n\tpublic var DRAW_BUFFER15(get, never):Int;\n\tpublic var MAX_COLOR_ATTACHMENTS(get, never):Int;\n\tpublic var COLOR_ATTACHMENT1(get, never):Int;\n\tpublic var COLOR_ATTACHMENT2(get, never):Int;\n\tpublic var COLOR_ATTACHMENT3(get, never):Int;\n\tpublic var COLOR_ATTACHMENT4(get, never):Int;\n\tpublic var COLOR_ATTACHMENT5(get, never):Int;\n\tpublic var COLOR_ATTACHMENT6(get, never):Int;\n\tpublic var COLOR_ATTACHMENT7(get, never):Int;\n\tpublic var COLOR_ATTACHMENT8(get, never):Int;\n\tpublic var COLOR_ATTACHMENT9(get, never):Int;\n\tpublic var COLOR_ATTACHMENT10(get, never):Int;\n\tpublic var COLOR_ATTACHMENT11(get, never):Int;\n\tpublic var COLOR_ATTACHMENT12(get, never):Int;\n\tpublic var COLOR_ATTACHMENT13(get, never):Int;\n\tpublic var COLOR_ATTACHMENT14(get, never):Int;\n\tpublic var COLOR_ATTACHMENT15(get, never):Int;\n\tpublic var SAMPLER_3D(get, never):Int;\n\tpublic var SAMPLER_2D_SHADOW(get, never):Int;\n\tpublic var SAMPLER_2D_ARRAY(get, never):Int;\n\tpublic var SAMPLER_2D_ARRAY_SHADOW(get, never):Int;\n\tpublic var SAMPLER_CUBE_SHADOW(get, never):Int;\n\tpublic var INT_SAMPLER_2D(get, never):Int;\n\tpublic var INT_SAMPLER_3D(get, never):Int;\n\tpublic var INT_SAMPLER_CUBE(get, never):Int;\n\tpublic var INT_SAMPLER_2D_ARRAY(get, never):Int;\n\tpublic var UNSIGNED_INT_SAMPLER_2D(get, never):Int;\n\tpublic var UNSIGNED_INT_SAMPLER_3D(get, never):Int;\n\tpublic var UNSIGNED_INT_SAMPLER_CUBE(get, never):Int;\n\tpublic var UNSIGNED_INT_SAMPLER_2D_ARRAY(get, never):Int;\n\tpublic var MAX_SAMPLES(get, never):Int;\n\tpublic var SAMPLER_BINDING(get, never):Int;\n\tpublic var PIXEL_PACK_BUFFER(get, never):Int;\n\tpublic var PIXEL_UNPACK_BUFFER(get, never):Int;\n\tpublic var PIXEL_PACK_BUFFER_BINDING(get, never):Int;\n\tpublic var PIXEL_UNPACK_BUFFER_BINDING(get, never):Int;\n\tpublic var COPY_READ_BUFFER(get, never):Int;\n\tpublic var COPY_WRITE_BUFFER(get, never):Int;\n\tpublic var COPY_READ_BUFFER_BINDING(get, never):Int;\n\tpublic var COPY_WRITE_BUFFER_BINDING(get, never):Int;\n\tpublic var FLOAT_MAT2x3(get, never):Int;\n\tpublic var FLOAT_MAT2x4(get, never):Int;\n\tpublic var FLOAT_MAT3x2(get, never):Int;\n\tpublic var FLOAT_MAT3x4(get, never):Int;\n\tpublic var FLOAT_MAT4x2(get, never):Int;\n\tpublic var FLOAT_MAT4x3(get, never):Int;\n\tpublic var UNSIGNED_INT_VEC2(get, never):Int;\n\tpublic var UNSIGNED_INT_VEC3(get, never):Int;\n\tpublic var UNSIGNED_INT_VEC4(get, never):Int;\n\tpublic var UNSIGNED_NORMALIZED(get, never):Int;\n\tpublic var SIGNED_NORMALIZED(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_INTEGER(get, never):Int;\n\tpublic var VERTEX_ATTRIB_ARRAY_DIVISOR(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_MODE(get, never):Int;\n\tpublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_VARYINGS(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_START(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_SIZE(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN(get, never):Int;\n\tpublic var MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS(get, never):Int;\n\tpublic var MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS(get, never):Int;\n\tpublic var INTERLEAVED_ATTRIBS(get, never):Int;\n\tpublic var SEPARATE_ATTRIBS(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_BUFFER_BINDING(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_PAUSED(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_ACTIVE(get, never):Int;\n\tpublic var TRANSFORM_FEEDBACK_BINDING(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_RED_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_GREEN_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_BLUE_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE(get, never):Int;\n\tpublic var FRAMEBUFFER_DEFAULT(get, never):Int;\n\tpublic var DEPTH24_STENCIL8(get, never):Int;\n\tpublic var DRAW_FRAMEBUFFER_BINDING(get, never):Int;\n\tpublic var READ_FRAMEBUFFER(get, never):Int;\n\tpublic var DRAW_FRAMEBUFFER(get, never):Int;\n\tpublic var READ_FRAMEBUFFER_BINDING(get, never):Int;\n\tpublic var RENDERBUFFER_SAMPLES(get, never):Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER(get, never):Int;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE(get, never):Int;\n\tpublic var UNIFORM_BUFFER(get, never):Int;\n\tpublic var UNIFORM_BUFFER_BINDING(get, never):Int;\n\tpublic var UNIFORM_BUFFER_START(get, never):Int;\n\tpublic var UNIFORM_BUFFER_SIZE(get, never):Int;\n\tpublic var MAX_VERTEX_UNIFORM_BLOCKS(get, never):Int;\n\tpublic var MAX_FRAGMENT_UNIFORM_BLOCKS(get, never):Int;\n\tpublic var MAX_COMBINED_UNIFORM_BLOCKS(get, never):Int;\n\tpublic var MAX_UNIFORM_BUFFER_BINDINGS(get, never):Int;\n\tpublic var MAX_UNIFORM_BLOCK_SIZE(get, never):Int;\n\tpublic var MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS(get, never):Int;\n\tpublic var MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS(get, never):Int;\n\tpublic var UNIFORM_BUFFER_OFFSET_ALIGNMENT(get, never):Int;\n\tpublic var ACTIVE_UNIFORM_BLOCKS(get, never):Int;\n\tpublic var UNIFORM_TYPE(get, never):Int;\n\tpublic var UNIFORM_SIZE(get, never):Int;\n\tpublic var UNIFORM_BLOCK_INDEX(get, never):Int;\n\tpublic var UNIFORM_OFFSET(get, never):Int;\n\tpublic var UNIFORM_ARRAY_STRIDE(get, never):Int;\n\tpublic var UNIFORM_MATRIX_STRIDE(get, never):Int;\n\tpublic var UNIFORM_IS_ROW_MAJOR(get, never):Int;\n\tpublic var UNIFORM_BLOCK_BINDING(get, never):Int;\n\tpublic var UNIFORM_BLOCK_DATA_SIZE(get, never):Int;\n\tpublic var UNIFORM_BLOCK_ACTIVE_UNIFORMS(get, never):Int;\n\tpublic var UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES(get, never):Int;\n\tpublic var UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER(get, never):Int;\n\tpublic var UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER(get, never):Int;\n\tpublic var OBJECT_TYPE(get, never):Int;\n\tpublic var SYNC_CONDITION(get, never):Int;\n\tpublic var SYNC_STATUS(get, never):Int;\n\tpublic var SYNC_FLAGS(get, never):Int;\n\tpublic var SYNC_FENCE(get, never):Int;\n\tpublic var SYNC_GPU_COMMANDS_COMPLETE(get, never):Int;\n\tpublic var UNSIGNALED(get, never):Int;\n\tpublic var SIGNALED(get, never):Int;\n\tpublic var ALREADY_SIGNALED(get, never):Int;\n\tpublic var TIMEOUT_EXPIRED(get, never):Int;\n\tpublic var CONDITION_SATISFIED(get, never):Int;\n\tpublic var WAIT_FAILED(get, never):Int;\n\tpublic var SYNC_FLUSH_COMMANDS_BIT(get, never):Int;\n\tpublic var COLOR(get, never):Int;\n\tpublic var DEPTH(get, never):Int;\n\tpublic var STENCIL(get, never):Int;\n\tpublic var MIN(get, never):Int;\n\tpublic var MAX(get, never):Int;\n\tpublic var DEPTH_COMPONENT24(get, never):Int;\n\tpublic var STREAM_READ(get, never):Int;\n\tpublic var STREAM_COPY(get, never):Int;\n\tpublic var STATIC_READ(get, never):Int;\n\tpublic var STATIC_COPY(get, never):Int;\n\tpublic var DYNAMIC_READ(get, never):Int;\n\tpublic var DYNAMIC_COPY(get, never):Int;\n\tpublic var DEPTH_COMPONENT32F(get, never):Int;\n\tpublic var DEPTH32F_STENCIL8(get, never):Int;\n\tpublic var INVALID_INDEX(get, never):Int;\n\tpublic var TIMEOUT_IGNORED(get, never):Int;\n\tpublic var MAX_CLIENT_WAIT_TIMEOUT_WEBGL(get, never):Int;\n\n\t@:noCompletion private inline function get_DEPTH_BUFFER_BIT():Int\n\t{\n\t\treturn this.DEPTH_BUFFER_BIT;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BUFFER_BIT():Int\n\t{\n\t\treturn this.STENCIL_BUFFER_BIT;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_BUFFER_BIT():Int\n\t{\n\t\treturn this.COLOR_BUFFER_BIT;\n\t}\n\n\t@:noCompletion private inline function get_POINTS():Int\n\t{\n\t\treturn this.POINTS;\n\t}\n\n\t@:noCompletion private inline function get_LINES():Int\n\t{\n\t\treturn this.LINES;\n\t}\n\n\t@:noCompletion private inline function get_LINE_LOOP():Int\n\t{\n\t\treturn this.LINE_LOOP;\n\t}\n\n\t@:noCompletion private inline function get_LINE_STRIP():Int\n\t{\n\t\treturn this.LINE_STRIP;\n\t}\n\n\t@:noCompletion private inline function get_TRIANGLES():Int\n\t{\n\t\treturn this.TRIANGLES;\n\t}\n\n\t@:noCompletion private inline function get_TRIANGLE_STRIP():Int\n\t{\n\t\treturn this.TRIANGLE_STRIP;\n\t}\n\n\t@:noCompletion private inline function get_TRIANGLE_FAN():Int\n\t{\n\t\treturn this.TRIANGLE_FAN;\n\t}\n\n\t@:noCompletion private inline function get_ZERO():Int\n\t{\n\t\treturn this.ZERO;\n\t}\n\n\t@:noCompletion private inline function get_ONE():Int\n\t{\n\t\treturn this.ONE;\n\t}\n\n\t@:noCompletion private inline function get_SRC_COLOR():Int\n\t{\n\t\treturn this.SRC_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_ONE_MINUS_SRC_COLOR():Int\n\t{\n\t\treturn this.ONE_MINUS_SRC_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_SRC_ALPHA():Int\n\t{\n\t\treturn this.SRC_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_ONE_MINUS_SRC_ALPHA():Int\n\t{\n\t\treturn this.ONE_MINUS_SRC_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_DST_ALPHA():Int\n\t{\n\t\treturn this.DST_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_ONE_MINUS_DST_ALPHA():Int\n\t{\n\t\treturn this.ONE_MINUS_DST_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_DST_COLOR():Int\n\t{\n\t\treturn this.DST_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_ONE_MINUS_DST_COLOR():Int\n\t{\n\t\treturn this.ONE_MINUS_DST_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_SRC_ALPHA_SATURATE():Int\n\t{\n\t\treturn this.SRC_ALPHA_SATURATE;\n\t}\n\n\t@:noCompletion private inline function get_FUNC_ADD():Int\n\t{\n\t\treturn this.FUNC_ADD;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_EQUATION():Int\n\t{\n\t\treturn this.BLEND_EQUATION;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_EQUATION_RGB():Int\n\t{\n\t\treturn this.BLEND_EQUATION_RGB;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_EQUATION_ALPHA():Int\n\t{\n\t\treturn this.BLEND_EQUATION_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_FUNC_SUBTRACT():Int\n\t{\n\t\treturn this.FUNC_SUBTRACT;\n\t}\n\n\t@:noCompletion private inline function get_FUNC_REVERSE_SUBTRACT():Int\n\t{\n\t\treturn this.FUNC_REVERSE_SUBTRACT;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_DST_RGB():Int\n\t{\n\t\treturn this.BLEND_DST_RGB;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_SRC_RGB():Int\n\t{\n\t\treturn this.BLEND_SRC_RGB;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_DST_ALPHA():Int\n\t{\n\t\treturn this.BLEND_DST_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_SRC_ALPHA():Int\n\t{\n\t\treturn this.BLEND_SRC_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_CONSTANT_COLOR():Int\n\t{\n\t\treturn this.CONSTANT_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_ONE_MINUS_CONSTANT_COLOR():Int\n\t{\n\t\treturn this.ONE_MINUS_CONSTANT_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_CONSTANT_ALPHA():Int\n\t{\n\t\treturn this.CONSTANT_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_ONE_MINUS_CONSTANT_ALPHA():Int\n\t{\n\t\treturn this.ONE_MINUS_CONSTANT_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_BLEND_COLOR():Int\n\t{\n\t\treturn this.BLEND_COLOR;\n\t}\n\n\t@:noCompletion private inline function get_ARRAY_BUFFER():Int\n\t{\n\t\treturn this.ARRAY_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_ELEMENT_ARRAY_BUFFER():Int\n\t{\n\t\treturn this.ELEMENT_ARRAY_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_ARRAY_BUFFER_BINDING():Int\n\t{\n\t\treturn this.ARRAY_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_ELEMENT_ARRAY_BUFFER_BINDING():Int\n\t{\n\t\treturn this.ELEMENT_ARRAY_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_STREAM_DRAW():Int\n\t{\n\t\treturn this.STREAM_DRAW;\n\t}\n\n\t@:noCompletion private inline function get_STATIC_DRAW():Int\n\t{\n\t\treturn this.STATIC_DRAW;\n\t}\n\n\t@:noCompletion private inline function get_DYNAMIC_DRAW():Int\n\t{\n\t\treturn this.DYNAMIC_DRAW;\n\t}\n\n\t@:noCompletion private inline function get_BUFFER_SIZE():Int\n\t{\n\t\treturn this.BUFFER_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_BUFFER_USAGE():Int\n\t{\n\t\treturn this.BUFFER_USAGE;\n\t}\n\n\t@:noCompletion private inline function get_CURRENT_VERTEX_ATTRIB():Int\n\t{\n\t\treturn this.CURRENT_VERTEX_ATTRIB;\n\t}\n\n\t@:noCompletion private inline function get_FRONT():Int\n\t{\n\t\treturn this.FRONT;\n\t}\n\n\t@:noCompletion private inline function get_BACK():Int\n\t{\n\t\treturn this.BACK;\n\t}\n\n\t@:noCompletion private inline function get_FRONT_AND_BACK():Int\n\t{\n\t\treturn this.FRONT_AND_BACK;\n\t}\n\n\t@:noCompletion private inline function get_CULL_FACE():Int\n\t{\n\t\treturn this.CULL_FACE;\n\t}\n\n\t@:noCompletion private inline function get_BLEND():Int\n\t{\n\t\treturn this.BLEND;\n\t}\n\n\t@:noCompletion private inline function get_DITHER():Int\n\t{\n\t\treturn this.DITHER;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_TEST():Int\n\t{\n\t\treturn this.STENCIL_TEST;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_TEST():Int\n\t{\n\t\treturn this.DEPTH_TEST;\n\t}\n\n\t@:noCompletion private inline function get_SCISSOR_TEST():Int\n\t{\n\t\treturn this.SCISSOR_TEST;\n\t}\n\n\t@:noCompletion private inline function get_POLYGON_OFFSET_FILL():Int\n\t{\n\t\treturn this.POLYGON_OFFSET_FILL;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLE_ALPHA_TO_COVERAGE():Int\n\t{\n\t\treturn this.SAMPLE_ALPHA_TO_COVERAGE;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLE_COVERAGE():Int\n\t{\n\t\treturn this.SAMPLE_COVERAGE;\n\t}\n\n\t@:noCompletion private inline function get_NO_ERROR():Int\n\t{\n\t\treturn this.NO_ERROR;\n\t}\n\n\t@:noCompletion private inline function get_INVALID_ENUM():Int\n\t{\n\t\treturn this.INVALID_ENUM;\n\t}\n\n\t@:noCompletion private inline function get_INVALID_VALUE():Int\n\t{\n\t\treturn this.INVALID_VALUE;\n\t}\n\n\t@:noCompletion private inline function get_INVALID_OPERATION():Int\n\t{\n\t\treturn this.INVALID_OPERATION;\n\t}\n\n\t@:noCompletion private inline function get_OUT_OF_MEMORY():Int\n\t{\n\t\treturn this.OUT_OF_MEMORY;\n\t}\n\n\t@:noCompletion private inline function get_CW():Int\n\t{\n\t\treturn this.CW;\n\t}\n\n\t@:noCompletion private inline function get_CCW():Int\n\t{\n\t\treturn this.CCW;\n\t}\n\n\t@:noCompletion private inline function get_LINE_WIDTH():Int\n\t{\n\t\treturn this.LINE_WIDTH;\n\t}\n\n\t@:noCompletion private inline function get_ALIASED_POINT_SIZE_RANGE():Int\n\t{\n\t\treturn this.ALIASED_POINT_SIZE_RANGE;\n\t}\n\n\t@:noCompletion private inline function get_ALIASED_LINE_WIDTH_RANGE():Int\n\t{\n\t\treturn this.ALIASED_LINE_WIDTH_RANGE;\n\t}\n\n\t@:noCompletion private inline function get_CULL_FACE_MODE():Int\n\t{\n\t\treturn this.CULL_FACE_MODE;\n\t}\n\n\t@:noCompletion private inline function get_FRONT_FACE():Int\n\t{\n\t\treturn this.FRONT_FACE;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_RANGE():Int\n\t{\n\t\treturn this.DEPTH_RANGE;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_WRITEMASK():Int\n\t{\n\t\treturn this.DEPTH_WRITEMASK;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_CLEAR_VALUE():Int\n\t{\n\t\treturn this.DEPTH_CLEAR_VALUE;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_FUNC():Int\n\t{\n\t\treturn this.DEPTH_FUNC;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_CLEAR_VALUE():Int\n\t{\n\t\treturn this.STENCIL_CLEAR_VALUE;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_FUNC():Int\n\t{\n\t\treturn this.STENCIL_FUNC;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_FAIL():Int\n\t{\n\t\treturn this.STENCIL_FAIL;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_PASS_DEPTH_FAIL():Int\n\t{\n\t\treturn this.STENCIL_PASS_DEPTH_FAIL;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_PASS_DEPTH_PASS():Int\n\t{\n\t\treturn this.STENCIL_PASS_DEPTH_PASS;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_REF():Int\n\t{\n\t\treturn this.STENCIL_REF;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_VALUE_MASK():Int\n\t{\n\t\treturn this.STENCIL_VALUE_MASK;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_WRITEMASK():Int\n\t{\n\t\treturn this.STENCIL_WRITEMASK;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_FUNC():Int\n\t{\n\t\treturn this.STENCIL_BACK_FUNC;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_FAIL():Int\n\t{\n\t\treturn this.STENCIL_BACK_FAIL;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_PASS_DEPTH_FAIL():Int\n\t{\n\t\treturn this.STENCIL_BACK_PASS_DEPTH_FAIL;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_PASS_DEPTH_PASS():Int\n\t{\n\t\treturn this.STENCIL_BACK_PASS_DEPTH_PASS;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_REF():Int\n\t{\n\t\treturn this.STENCIL_BACK_REF;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_VALUE_MASK():Int\n\t{\n\t\treturn this.STENCIL_BACK_VALUE_MASK;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BACK_WRITEMASK():Int\n\t{\n\t\treturn this.STENCIL_BACK_WRITEMASK;\n\t}\n\n\t@:noCompletion private inline function get_VIEWPORT():Int\n\t{\n\t\treturn this.VIEWPORT;\n\t}\n\n\t@:noCompletion private inline function get_SCISSOR_BOX():Int\n\t{\n\t\treturn this.SCISSOR_BOX;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_CLEAR_VALUE():Int\n\t{\n\t\treturn this.COLOR_CLEAR_VALUE;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_WRITEMASK():Int\n\t{\n\t\treturn this.COLOR_WRITEMASK;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_ALIGNMENT():Int\n\t{\n\t\treturn this.UNPACK_ALIGNMENT;\n\t}\n\n\t@:noCompletion private inline function get_PACK_ALIGNMENT():Int\n\t{\n\t\treturn this.PACK_ALIGNMENT;\n\t}\n\n\t@:noCompletion private inline function get_MAX_TEXTURE_SIZE():Int\n\t{\n\t\treturn this.MAX_TEXTURE_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VIEWPORT_DIMS():Int\n\t{\n\t\treturn this.MAX_VIEWPORT_DIMS;\n\t}\n\n\t@:noCompletion private inline function get_SUBPIXEL_BITS():Int\n\t{\n\t\treturn this.SUBPIXEL_BITS;\n\t}\n\n\t@:noCompletion private inline function get_RED_BITS():Int\n\t{\n\t\treturn this.RED_BITS;\n\t}\n\n\t@:noCompletion private inline function get_GREEN_BITS():Int\n\t{\n\t\treturn this.GREEN_BITS;\n\t}\n\n\t@:noCompletion private inline function get_BLUE_BITS():Int\n\t{\n\t\treturn this.BLUE_BITS;\n\t}\n\n\t@:noCompletion private inline function get_ALPHA_BITS():Int\n\t{\n\t\treturn this.ALPHA_BITS;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_BITS():Int\n\t{\n\t\treturn this.DEPTH_BITS;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_BITS():Int\n\t{\n\t\treturn this.STENCIL_BITS;\n\t}\n\n\t@:noCompletion private inline function get_POLYGON_OFFSET_UNITS():Int\n\t{\n\t\treturn this.POLYGON_OFFSET_UNITS;\n\t}\n\n\t@:noCompletion private inline function get_POLYGON_OFFSET_FACTOR():Int\n\t{\n\t\treturn this.POLYGON_OFFSET_FACTOR;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_BINDING_2D():Int\n\t{\n\t\treturn this.TEXTURE_BINDING_2D;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLE_BUFFERS():Int\n\t{\n\t\treturn this.SAMPLE_BUFFERS;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLES():Int\n\t{\n\t\treturn this.SAMPLES;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLE_COVERAGE_VALUE():Int\n\t{\n\t\treturn this.SAMPLE_COVERAGE_VALUE;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLE_COVERAGE_INVERT():Int\n\t{\n\t\treturn this.SAMPLE_COVERAGE_INVERT;\n\t}\n\n\t@:noCompletion private inline function get_COMPRESSED_TEXTURE_FORMATS():Int\n\t{\n\t\treturn this.COMPRESSED_TEXTURE_FORMATS;\n\t}\n\n\t@:noCompletion private inline function get_DONT_CARE():Int\n\t{\n\t\treturn this.DONT_CARE;\n\t}\n\n\t@:noCompletion private inline function get_FASTEST():Int\n\t{\n\t\treturn this.FASTEST;\n\t}\n\n\t@:noCompletion private inline function get_NICEST():Int\n\t{\n\t\treturn this.NICEST;\n\t}\n\n\t@:noCompletion private inline function get_GENERATE_MIPMAP_HINT():Int\n\t{\n\t\treturn this.GENERATE_MIPMAP_HINT;\n\t}\n\n\t@:noCompletion private inline function get_BYTE():Int\n\t{\n\t\treturn this.BYTE;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_BYTE():Int\n\t{\n\t\treturn this.UNSIGNED_BYTE;\n\t}\n\n\t@:noCompletion private inline function get_SHORT():Int\n\t{\n\t\treturn this.SHORT;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_SHORT():Int\n\t{\n\t\treturn this.UNSIGNED_SHORT;\n\t}\n\n\t@:noCompletion private inline function get_INT():Int\n\t{\n\t\treturn this.INT;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT():Int\n\t{\n\t\treturn this.UNSIGNED_INT;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT():Int\n\t{\n\t\treturn this.FLOAT;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_COMPONENT():Int\n\t{\n\t\treturn this.DEPTH_COMPONENT;\n\t}\n\n\t@:noCompletion private inline function get_ALPHA():Int\n\t{\n\t\treturn this.ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_RGB():Int\n\t{\n\t\treturn this.RGB;\n\t}\n\n\t@:noCompletion private inline function get_RGBA():Int\n\t{\n\t\treturn this.RGBA;\n\t}\n\n\t@:noCompletion private inline function get_LUMINANCE():Int\n\t{\n\t\treturn this.LUMINANCE;\n\t}\n\n\t@:noCompletion private inline function get_LUMINANCE_ALPHA():Int\n\t{\n\t\treturn this.LUMINANCE_ALPHA;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_SHORT_4_4_4_4():Int\n\t{\n\t\treturn this.UNSIGNED_SHORT_4_4_4_4;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_SHORT_5_5_5_1():Int\n\t{\n\t\treturn this.UNSIGNED_SHORT_5_5_5_1;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_SHORT_5_6_5():Int\n\t{\n\t\treturn this.UNSIGNED_SHORT_5_6_5;\n\t}\n\n\t@:noCompletion private inline function get_FRAGMENT_SHADER():Int\n\t{\n\t\treturn this.FRAGMENT_SHADER;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_SHADER():Int\n\t{\n\t\treturn this.VERTEX_SHADER;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VERTEX_ATTRIBS():Int\n\t{\n\t\treturn this.MAX_VERTEX_ATTRIBS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VERTEX_UNIFORM_VECTORS():Int\n\t{\n\t\treturn this.MAX_VERTEX_UNIFORM_VECTORS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VARYING_VECTORS():Int\n\t{\n\t\treturn this.MAX_VARYING_VECTORS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_COMBINED_TEXTURE_IMAGE_UNITS():Int\n\t{\n\t\treturn this.MAX_COMBINED_TEXTURE_IMAGE_UNITS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VERTEX_TEXTURE_IMAGE_UNITS():Int\n\t{\n\t\treturn this.MAX_VERTEX_TEXTURE_IMAGE_UNITS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_TEXTURE_IMAGE_UNITS():Int\n\t{\n\t\treturn this.MAX_TEXTURE_IMAGE_UNITS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_FRAGMENT_UNIFORM_VECTORS():Int\n\t{\n\t\treturn this.MAX_FRAGMENT_UNIFORM_VECTORS;\n\t}\n\n\t@:noCompletion private inline function get_SHADER_TYPE():Int\n\t{\n\t\treturn this.SHADER_TYPE;\n\t}\n\n\t@:noCompletion private inline function get_DELETE_STATUS():Int\n\t{\n\t\treturn this.DELETE_STATUS;\n\t}\n\n\t@:noCompletion private inline function get_LINK_STATUS():Int\n\t{\n\t\treturn this.LINK_STATUS;\n\t}\n\n\t@:noCompletion private inline function get_VALIDATE_STATUS():Int\n\t{\n\t\treturn this.VALIDATE_STATUS;\n\t}\n\n\t@:noCompletion private inline function get_ATTACHED_SHADERS():Int\n\t{\n\t\treturn this.ATTACHED_SHADERS;\n\t}\n\n\t@:noCompletion private inline function get_ACTIVE_UNIFORMS():Int\n\t{\n\t\treturn this.ACTIVE_UNIFORMS;\n\t}\n\n\t@:noCompletion private inline function get_ACTIVE_ATTRIBUTES():Int\n\t{\n\t\treturn this.ACTIVE_ATTRIBUTES;\n\t}\n\n\t@:noCompletion private inline function get_SHADING_LANGUAGE_VERSION():Int\n\t{\n\t\treturn this.SHADING_LANGUAGE_VERSION;\n\t}\n\n\t@:noCompletion private inline function get_CURRENT_PROGRAM():Int\n\t{\n\t\treturn this.CURRENT_PROGRAM;\n\t}\n\n\t@:noCompletion private inline function get_NEVER():Int\n\t{\n\t\treturn this.NEVER;\n\t}\n\n\t@:noCompletion private inline function get_LESS():Int\n\t{\n\t\treturn this.LESS;\n\t}\n\n\t@:noCompletion private inline function get_EQUAL():Int\n\t{\n\t\treturn this.EQUAL;\n\t}\n\n\t@:noCompletion private inline function get_LEQUAL():Int\n\t{\n\t\treturn this.LEQUAL;\n\t}\n\n\t@:noCompletion private inline function get_GREATER():Int\n\t{\n\t\treturn this.GREATER;\n\t}\n\n\t@:noCompletion private inline function get_NOTEQUAL():Int\n\t{\n\t\treturn this.NOTEQUAL;\n\t}\n\n\t@:noCompletion private inline function get_GEQUAL():Int\n\t{\n\t\treturn this.GEQUAL;\n\t}\n\n\t@:noCompletion private inline function get_ALWAYS():Int\n\t{\n\t\treturn this.ALWAYS;\n\t}\n\n\t@:noCompletion private inline function get_KEEP():Int\n\t{\n\t\treturn this.KEEP;\n\t}\n\n\t@:noCompletion private inline function get_REPLACE():Int\n\t{\n\t\treturn this.REPLACE;\n\t}\n\n\t@:noCompletion private inline function get_INCR():Int\n\t{\n\t\treturn this.INCR;\n\t}\n\n\t@:noCompletion private inline function get_DECR():Int\n\t{\n\t\treturn this.DECR;\n\t}\n\n\t@:noCompletion private inline function get_INVERT():Int\n\t{\n\t\treturn this.INVERT;\n\t}\n\n\t@:noCompletion private inline function get_INCR_WRAP():Int\n\t{\n\t\treturn this.INCR_WRAP;\n\t}\n\n\t@:noCompletion private inline function get_DECR_WRAP():Int\n\t{\n\t\treturn this.DECR_WRAP;\n\t}\n\n\t@:noCompletion private inline function get_VENDOR():Int\n\t{\n\t\treturn this.VENDOR;\n\t}\n\n\t@:noCompletion private inline function get_RENDERER():Int\n\t{\n\t\treturn this.RENDERER;\n\t}\n\n\t@:noCompletion private inline function get_VERSION():Int\n\t{\n\t\treturn this.VERSION;\n\t}\n\n\t@:noCompletion private inline function get_NEAREST():Int\n\t{\n\t\treturn this.NEAREST;\n\t}\n\n\t@:noCompletion private inline function get_LINEAR():Int\n\t{\n\t\treturn this.LINEAR;\n\t}\n\n\t@:noCompletion private inline function get_NEAREST_MIPMAP_NEAREST():Int\n\t{\n\t\treturn this.NEAREST_MIPMAP_NEAREST;\n\t}\n\n\t@:noCompletion private inline function get_LINEAR_MIPMAP_NEAREST():Int\n\t{\n\t\treturn this.LINEAR_MIPMAP_NEAREST;\n\t}\n\n\t@:noCompletion private inline function get_NEAREST_MIPMAP_LINEAR():Int\n\t{\n\t\treturn this.NEAREST_MIPMAP_LINEAR;\n\t}\n\n\t@:noCompletion private inline function get_LINEAR_MIPMAP_LINEAR():Int\n\t{\n\t\treturn this.LINEAR_MIPMAP_LINEAR;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_MAG_FILTER():Int\n\t{\n\t\treturn this.TEXTURE_MAG_FILTER;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_MIN_FILTER():Int\n\t{\n\t\treturn this.TEXTURE_MIN_FILTER;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_WRAP_S():Int\n\t{\n\t\treturn this.TEXTURE_WRAP_S;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_WRAP_T():Int\n\t{\n\t\treturn this.TEXTURE_WRAP_T;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_2D():Int\n\t{\n\t\treturn this.TEXTURE_2D;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE():Int\n\t{\n\t\treturn this.TEXTURE;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_BINDING_CUBE_MAP():Int\n\t{\n\t\treturn this.TEXTURE_BINDING_CUBE_MAP;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP_POSITIVE_X():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP_POSITIVE_X;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP_NEGATIVE_X():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP_NEGATIVE_X;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP_POSITIVE_Y():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP_POSITIVE_Y;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP_NEGATIVE_Y():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP_NEGATIVE_Y;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP_POSITIVE_Z():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP_POSITIVE_Z;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_CUBE_MAP_NEGATIVE_Z():Int\n\t{\n\t\treturn this.TEXTURE_CUBE_MAP_NEGATIVE_Z;\n\t}\n\n\t@:noCompletion private inline function get_MAX_CUBE_MAP_TEXTURE_SIZE():Int\n\t{\n\t\treturn this.MAX_CUBE_MAP_TEXTURE_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE0():Int\n\t{\n\t\treturn this.TEXTURE0;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE1():Int\n\t{\n\t\treturn this.TEXTURE1;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE2():Int\n\t{\n\t\treturn this.TEXTURE2;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE3():Int\n\t{\n\t\treturn this.TEXTURE3;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE4():Int\n\t{\n\t\treturn this.TEXTURE4;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE5():Int\n\t{\n\t\treturn this.TEXTURE5;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE6():Int\n\t{\n\t\treturn this.TEXTURE6;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE7():Int\n\t{\n\t\treturn this.TEXTURE7;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE8():Int\n\t{\n\t\treturn this.TEXTURE8;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE9():Int\n\t{\n\t\treturn this.TEXTURE9;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE10():Int\n\t{\n\t\treturn this.TEXTURE10;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE11():Int\n\t{\n\t\treturn this.TEXTURE11;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE12():Int\n\t{\n\t\treturn this.TEXTURE12;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE13():Int\n\t{\n\t\treturn this.TEXTURE13;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE14():Int\n\t{\n\t\treturn this.TEXTURE14;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE15():Int\n\t{\n\t\treturn this.TEXTURE15;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE16():Int\n\t{\n\t\treturn this.TEXTURE16;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE17():Int\n\t{\n\t\treturn this.TEXTURE17;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE18():Int\n\t{\n\t\treturn this.TEXTURE18;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE19():Int\n\t{\n\t\treturn this.TEXTURE19;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE20():Int\n\t{\n\t\treturn this.TEXTURE20;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE21():Int\n\t{\n\t\treturn this.TEXTURE21;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE22():Int\n\t{\n\t\treturn this.TEXTURE22;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE23():Int\n\t{\n\t\treturn this.TEXTURE23;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE24():Int\n\t{\n\t\treturn this.TEXTURE24;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE25():Int\n\t{\n\t\treturn this.TEXTURE25;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE26():Int\n\t{\n\t\treturn this.TEXTURE26;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE27():Int\n\t{\n\t\treturn this.TEXTURE27;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE28():Int\n\t{\n\t\treturn this.TEXTURE28;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE29():Int\n\t{\n\t\treturn this.TEXTURE29;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE30():Int\n\t{\n\t\treturn this.TEXTURE30;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE31():Int\n\t{\n\t\treturn this.TEXTURE31;\n\t}\n\n\t@:noCompletion private inline function get_ACTIVE_TEXTURE():Int\n\t{\n\t\treturn this.ACTIVE_TEXTURE;\n\t}\n\n\t@:noCompletion private inline function get_REPEAT():Int\n\t{\n\t\treturn this.REPEAT;\n\t}\n\n\t@:noCompletion private inline function get_CLAMP_TO_EDGE():Int\n\t{\n\t\treturn this.CLAMP_TO_EDGE;\n\t}\n\n\t@:noCompletion private inline function get_MIRRORED_REPEAT():Int\n\t{\n\t\treturn this.MIRRORED_REPEAT;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_VEC2():Int\n\t{\n\t\treturn this.FLOAT_VEC2;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_VEC3():Int\n\t{\n\t\treturn this.FLOAT_VEC3;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_VEC4():Int\n\t{\n\t\treturn this.FLOAT_VEC4;\n\t}\n\n\t@:noCompletion private inline function get_INT_VEC2():Int\n\t{\n\t\treturn this.INT_VEC2;\n\t}\n\n\t@:noCompletion private inline function get_INT_VEC3():Int\n\t{\n\t\treturn this.INT_VEC3;\n\t}\n\n\t@:noCompletion private inline function get_INT_VEC4():Int\n\t{\n\t\treturn this.INT_VEC4;\n\t}\n\n\t@:noCompletion private inline function get_BOOL():Int\n\t{\n\t\treturn this.BOOL;\n\t}\n\n\t@:noCompletion private inline function get_BOOL_VEC2():Int\n\t{\n\t\treturn this.BOOL_VEC2;\n\t}\n\n\t@:noCompletion private inline function get_BOOL_VEC3():Int\n\t{\n\t\treturn this.BOOL_VEC3;\n\t}\n\n\t@:noCompletion private inline function get_BOOL_VEC4():Int\n\t{\n\t\treturn this.BOOL_VEC4;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT2():Int\n\t{\n\t\treturn this.FLOAT_MAT2;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT3():Int\n\t{\n\t\treturn this.FLOAT_MAT3;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT4():Int\n\t{\n\t\treturn this.FLOAT_MAT4;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_2D():Int\n\t{\n\t\treturn this.SAMPLER_2D;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_CUBE():Int\n\t{\n\t\treturn this.SAMPLER_CUBE;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_ENABLED():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_ENABLED;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_SIZE():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_STRIDE():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_STRIDE;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_TYPE():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_TYPE;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_NORMALIZED():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_NORMALIZED;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_POINTER():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_POINTER;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_COMPILE_STATUS():Int\n\t{\n\t\treturn this.COMPILE_STATUS;\n\t}\n\n\t@:noCompletion private inline function get_LOW_FLOAT():Int\n\t{\n\t\treturn this.LOW_FLOAT;\n\t}\n\n\t@:noCompletion private inline function get_MEDIUM_FLOAT():Int\n\t{\n\t\treturn this.MEDIUM_FLOAT;\n\t}\n\n\t@:noCompletion private inline function get_HIGH_FLOAT():Int\n\t{\n\t\treturn this.HIGH_FLOAT;\n\t}\n\n\t@:noCompletion private inline function get_LOW_INT():Int\n\t{\n\t\treturn this.LOW_INT;\n\t}\n\n\t@:noCompletion private inline function get_MEDIUM_INT():Int\n\t{\n\t\treturn this.MEDIUM_INT;\n\t}\n\n\t@:noCompletion private inline function get_HIGH_INT():Int\n\t{\n\t\treturn this.HIGH_INT;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER():Int\n\t{\n\t\treturn this.FRAMEBUFFER;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER():Int\n\t{\n\t\treturn this.RENDERBUFFER;\n\t}\n\n\t@:noCompletion private inline function get_RGBA4():Int\n\t{\n\t\treturn this.RGBA4;\n\t}\n\n\t@:noCompletion private inline function get_RGB5_A1():Int\n\t{\n\t\treturn this.RGB5_A1;\n\t}\n\n\t@:noCompletion private inline function get_RGB565():Int\n\t{\n\t\treturn this.RGB565;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_COMPONENT16():Int\n\t{\n\t\treturn this.DEPTH_COMPONENT16;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_INDEX():Int\n\t{\n\t\treturn this.STENCIL_INDEX;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_INDEX8():Int\n\t{\n\t\treturn this.STENCIL_INDEX8;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_STENCIL():Int\n\t{\n\t\treturn this.DEPTH_STENCIL;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_WIDTH():Int\n\t{\n\t\treturn this.RENDERBUFFER_WIDTH;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_HEIGHT():Int\n\t{\n\t\treturn this.RENDERBUFFER_HEIGHT;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_INTERNAL_FORMAT():Int\n\t{\n\t\treturn this.RENDERBUFFER_INTERNAL_FORMAT;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_RED_SIZE():Int\n\t{\n\t\treturn this.RENDERBUFFER_RED_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_GREEN_SIZE():Int\n\t{\n\t\treturn this.RENDERBUFFER_GREEN_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_BLUE_SIZE():Int\n\t{\n\t\treturn this.RENDERBUFFER_BLUE_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_ALPHA_SIZE():Int\n\t{\n\t\treturn this.RENDERBUFFER_ALPHA_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_DEPTH_SIZE():Int\n\t{\n\t\treturn this.RENDERBUFFER_DEPTH_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_STENCIL_SIZE():Int\n\t{\n\t\treturn this.RENDERBUFFER_STENCIL_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT0():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT0;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_ATTACHMENT():Int\n\t{\n\t\treturn this.DEPTH_ATTACHMENT;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL_ATTACHMENT():Int\n\t{\n\t\treturn this.STENCIL_ATTACHMENT;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_STENCIL_ATTACHMENT():Int\n\t{\n\t\treturn this.DEPTH_STENCIL_ATTACHMENT;\n\t}\n\n\t@:noCompletion private inline function get_NONE():Int\n\t{\n\t\treturn this.NONE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_COMPLETE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_COMPLETE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_ATTACHMENT():Int\n\t{\n\t\treturn this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT():Int\n\t{\n\t\treturn this.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_DIMENSIONS():Int\n\t{\n\t\treturn this.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_UNSUPPORTED():Int\n\t{\n\t\treturn this.FRAMEBUFFER_UNSUPPORTED;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_BINDING():Int\n\t{\n\t\treturn this.FRAMEBUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_BINDING():Int\n\t{\n\t\treturn this.RENDERBUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_MAX_RENDERBUFFER_SIZE():Int\n\t{\n\t\treturn this.MAX_RENDERBUFFER_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_INVALID_FRAMEBUFFER_OPERATION():Int\n\t{\n\t\treturn this.INVALID_FRAMEBUFFER_OPERATION;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_FLIP_Y_WEBGL():Int\n\t{\n\t\treturn this.UNPACK_FLIP_Y_WEBGL;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_PREMULTIPLY_ALPHA_WEBGL():Int\n\t{\n\t\treturn this.UNPACK_PREMULTIPLY_ALPHA_WEBGL;\n\t}\n\n\t@:noCompletion private inline function get_CONTEXT_LOST_WEBGL():Int\n\t{\n\t\treturn this.CONTEXT_LOST_WEBGL;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_COLORSPACE_CONVERSION_WEBGL():Int\n\t{\n\t\treturn this.UNPACK_COLORSPACE_CONVERSION_WEBGL;\n\t}\n\n\t@:noCompletion private inline function get_BROWSER_DEFAULT_WEBGL():Int\n\t{\n\t\treturn this.BROWSER_DEFAULT_WEBGL;\n\t}\n\n\t@:noCompletion private inline function get_READ_BUFFER():Int\n\t{\n\t\treturn this.READ_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_ROW_LENGTH():Int\n\t{\n\t\treturn this.UNPACK_ROW_LENGTH;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_SKIP_ROWS():Int\n\t{\n\t\treturn this.UNPACK_SKIP_ROWS;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_SKIP_PIXELS():Int\n\t{\n\t\treturn this.UNPACK_SKIP_PIXELS;\n\t}\n\n\t@:noCompletion private inline function get_PACK_ROW_LENGTH():Int\n\t{\n\t\treturn this.PACK_ROW_LENGTH;\n\t}\n\n\t@:noCompletion private inline function get_PACK_SKIP_ROWS():Int\n\t{\n\t\treturn this.PACK_SKIP_ROWS;\n\t}\n\n\t@:noCompletion private inline function get_PACK_SKIP_PIXELS():Int\n\t{\n\t\treturn this.PACK_SKIP_PIXELS;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_BINDING_3D():Int\n\t{\n\t\treturn this.TEXTURE_BINDING_3D;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_SKIP_IMAGES():Int\n\t{\n\t\treturn this.UNPACK_SKIP_IMAGES;\n\t}\n\n\t@:noCompletion private inline function get_UNPACK_IMAGE_HEIGHT():Int\n\t{\n\t\treturn this.UNPACK_IMAGE_HEIGHT;\n\t}\n\n\t@:noCompletion private inline function get_MAX_3D_TEXTURE_SIZE():Int\n\t{\n\t\treturn this.MAX_3D_TEXTURE_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_MAX_ELEMENTS_VERTICES():Int\n\t{\n\t\treturn this.MAX_ELEMENTS_VERTICES;\n\t}\n\n\t@:noCompletion private inline function get_MAX_ELEMENTS_INDICES():Int\n\t{\n\t\treturn this.MAX_ELEMENTS_INDICES;\n\t}\n\n\t@:noCompletion private inline function get_MAX_TEXTURE_LOD_BIAS():Int\n\t{\n\t\treturn this.MAX_TEXTURE_LOD_BIAS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_FRAGMENT_UNIFORM_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_FRAGMENT_UNIFORM_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VERTEX_UNIFORM_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_VERTEX_UNIFORM_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_ARRAY_TEXTURE_LAYERS():Int\n\t{\n\t\treturn this.MAX_ARRAY_TEXTURE_LAYERS;\n\t}\n\n\t@:noCompletion private inline function get_MIN_PROGRAM_TEXEL_OFFSET():Int\n\t{\n\t\treturn this.MIN_PROGRAM_TEXEL_OFFSET;\n\t}\n\n\t@:noCompletion private inline function get_MAX_PROGRAM_TEXEL_OFFSET():Int\n\t{\n\t\treturn this.MAX_PROGRAM_TEXEL_OFFSET;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VARYING_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_VARYING_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_FRAGMENT_SHADER_DERIVATIVE_HINT():Int\n\t{\n\t\treturn this.FRAGMENT_SHADER_DERIVATIVE_HINT;\n\t}\n\n\t@:noCompletion private inline function get_RASTERIZER_DISCARD():Int\n\t{\n\t\treturn this.RASTERIZER_DISCARD;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ARRAY_BINDING():Int\n\t{\n\t\treturn this.VERTEX_ARRAY_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VERTEX_OUTPUT_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_VERTEX_OUTPUT_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_FRAGMENT_INPUT_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_FRAGMENT_INPUT_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_SERVER_WAIT_TIMEOUT():Int\n\t{\n\t\treturn this.MAX_SERVER_WAIT_TIMEOUT;\n\t}\n\n\t@:noCompletion private inline function get_MAX_ELEMENT_INDEX():Int\n\t{\n\t\treturn this.MAX_ELEMENT_INDEX;\n\t}\n\n\t@:noCompletion private inline function get_RED():Int\n\t{\n\t\treturn this.RED;\n\t}\n\n\t@:noCompletion private inline function get_RGB8():Int\n\t{\n\t\treturn this.RGB8;\n\t}\n\n\t@:noCompletion private inline function get_RGBA8():Int\n\t{\n\t\treturn this.RGBA8;\n\t}\n\n\t@:noCompletion private inline function get_RGB10_A2():Int\n\t{\n\t\treturn this.RGB10_A2;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_3D():Int\n\t{\n\t\treturn this.TEXTURE_3D;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_WRAP_R():Int\n\t{\n\t\treturn this.TEXTURE_WRAP_R;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_MIN_LOD():Int\n\t{\n\t\treturn this.TEXTURE_MIN_LOD;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_MAX_LOD():Int\n\t{\n\t\treturn this.TEXTURE_MAX_LOD;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_BASE_LEVEL():Int\n\t{\n\t\treturn this.TEXTURE_BASE_LEVEL;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_MAX_LEVEL():Int\n\t{\n\t\treturn this.TEXTURE_MAX_LEVEL;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_COMPARE_MODE():Int\n\t{\n\t\treturn this.TEXTURE_COMPARE_MODE;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_COMPARE_FUNC():Int\n\t{\n\t\treturn this.TEXTURE_COMPARE_FUNC;\n\t}\n\n\t@:noCompletion private inline function get_SRGB():Int\n\t{\n\t\treturn this.SRGB;\n\t}\n\n\t@:noCompletion private inline function get_SRGB8():Int\n\t{\n\t\treturn this.SRGB8;\n\t}\n\n\t@:noCompletion private inline function get_SRGB8_ALPHA8():Int\n\t{\n\t\treturn this.SRGB8_ALPHA8;\n\t}\n\n\t@:noCompletion private inline function get_COMPARE_REF_TO_TEXTURE():Int\n\t{\n\t\treturn this.COMPARE_REF_TO_TEXTURE;\n\t}\n\n\t@:noCompletion private inline function get_RGBA32F():Int\n\t{\n\t\treturn this.RGBA32F;\n\t}\n\n\t@:noCompletion private inline function get_RGB32F():Int\n\t{\n\t\treturn this.RGB32F;\n\t}\n\n\t@:noCompletion private inline function get_RGBA16F():Int\n\t{\n\t\treturn this.RGBA16F;\n\t}\n\n\t@:noCompletion private inline function get_RGB16F():Int\n\t{\n\t\treturn this.RGB16F;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_2D_ARRAY():Int\n\t{\n\t\treturn this.TEXTURE_2D_ARRAY;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_BINDING_2D_ARRAY():Int\n\t{\n\t\treturn this.TEXTURE_BINDING_2D_ARRAY;\n\t}\n\n\t@:noCompletion private inline function get_R11F_G11F_B10F():Int\n\t{\n\t\treturn this.R11F_G11F_B10F;\n\t}\n\n\t@:noCompletion private inline function get_RGB9_E5():Int\n\t{\n\t\treturn this.RGB9_E5;\n\t}\n\n\t@:noCompletion private inline function get_RGBA32UI():Int\n\t{\n\t\treturn this.RGBA32UI;\n\t}\n\n\t@:noCompletion private inline function get_RGB32UI():Int\n\t{\n\t\treturn this.RGB32UI;\n\t}\n\n\t@:noCompletion private inline function get_RGBA16UI():Int\n\t{\n\t\treturn this.RGBA16UI;\n\t}\n\n\t@:noCompletion private inline function get_RGB16UI():Int\n\t{\n\t\treturn this.RGB16UI;\n\t}\n\n\t@:noCompletion private inline function get_RGBA8UI():Int\n\t{\n\t\treturn this.RGBA8UI;\n\t}\n\n\t@:noCompletion private inline function get_RGB8UI():Int\n\t{\n\t\treturn this.RGB8UI;\n\t}\n\n\t@:noCompletion private inline function get_RGBA32I():Int\n\t{\n\t\treturn this.RGBA32I;\n\t}\n\n\t@:noCompletion private inline function get_RGB32I():Int\n\t{\n\t\treturn this.RGB32I;\n\t}\n\n\t@:noCompletion private inline function get_RGBA16I():Int\n\t{\n\t\treturn this.RGBA16I;\n\t}\n\n\t@:noCompletion private inline function get_RGB16I():Int\n\t{\n\t\treturn this.RGB16I;\n\t}\n\n\t@:noCompletion private inline function get_RGBA8I():Int\n\t{\n\t\treturn this.RGBA8I;\n\t}\n\n\t@:noCompletion private inline function get_RGB8I():Int\n\t{\n\t\treturn this.RGB8I;\n\t}\n\n\t@:noCompletion private inline function get_RED_INTEGER():Int\n\t{\n\t\treturn this.RED_INTEGER;\n\t}\n\n\t@:noCompletion private inline function get_RGB_INTEGER():Int\n\t{\n\t\treturn this.RGB_INTEGER;\n\t}\n\n\t@:noCompletion private inline function get_RGBA_INTEGER():Int\n\t{\n\t\treturn this.RGBA_INTEGER;\n\t}\n\n\t@:noCompletion private inline function get_R8():Int\n\t{\n\t\treturn this.R8;\n\t}\n\n\t@:noCompletion private inline function get_RG8():Int\n\t{\n\t\treturn this.RG8;\n\t}\n\n\t@:noCompletion private inline function get_R16F():Int\n\t{\n\t\treturn this.R16F;\n\t}\n\n\t@:noCompletion private inline function get_R32F():Int\n\t{\n\t\treturn this.R32F;\n\t}\n\n\t@:noCompletion private inline function get_RG16F():Int\n\t{\n\t\treturn this.RG16F;\n\t}\n\n\t@:noCompletion private inline function get_RG32F():Int\n\t{\n\t\treturn this.RG32F;\n\t}\n\n\t@:noCompletion private inline function get_R8I():Int\n\t{\n\t\treturn this.R8I;\n\t}\n\n\t@:noCompletion private inline function get_R8UI():Int\n\t{\n\t\treturn this.R8UI;\n\t}\n\n\t@:noCompletion private inline function get_R16I():Int\n\t{\n\t\treturn this.R16I;\n\t}\n\n\t@:noCompletion private inline function get_R16UI():Int\n\t{\n\t\treturn this.R16UI;\n\t}\n\n\t@:noCompletion private inline function get_R32I():Int\n\t{\n\t\treturn this.R32I;\n\t}\n\n\t@:noCompletion private inline function get_R32UI():Int\n\t{\n\t\treturn this.R32UI;\n\t}\n\n\t@:noCompletion private inline function get_RG8I():Int\n\t{\n\t\treturn this.RG8I;\n\t}\n\n\t@:noCompletion private inline function get_RG8UI():Int\n\t{\n\t\treturn this.RG8UI;\n\t}\n\n\t@:noCompletion private inline function get_RG16I():Int\n\t{\n\t\treturn this.RG16I;\n\t}\n\n\t@:noCompletion private inline function get_RG16UI():Int\n\t{\n\t\treturn this.RG16UI;\n\t}\n\n\t@:noCompletion private inline function get_RG32I():Int\n\t{\n\t\treturn this.RG32I;\n\t}\n\n\t@:noCompletion private inline function get_RG32UI():Int\n\t{\n\t\treturn this.RG32UI;\n\t}\n\n\t@:noCompletion private inline function get_R8_SNORM():Int\n\t{\n\t\treturn this.R8_SNORM;\n\t}\n\n\t@:noCompletion private inline function get_RG8_SNORM():Int\n\t{\n\t\treturn this.RG8_SNORM;\n\t}\n\n\t@:noCompletion private inline function get_RGB8_SNORM():Int\n\t{\n\t\treturn this.RGB8_SNORM;\n\t}\n\n\t@:noCompletion private inline function get_RGBA8_SNORM():Int\n\t{\n\t\treturn this.RGBA8_SNORM;\n\t}\n\n\t@:noCompletion private inline function get_RGB10_A2UI():Int\n\t{\n\t\treturn this.RGB10_A2UI;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_IMMUTABLE_FORMAT():Int\n\t{\n\t\treturn this.TEXTURE_IMMUTABLE_FORMAT;\n\t}\n\n\t@:noCompletion private inline function get_TEXTURE_IMMUTABLE_LEVELS():Int\n\t{\n\t\treturn this.TEXTURE_IMMUTABLE_LEVELS;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_2_10_10_10_REV():Int\n\t{\n\t\treturn this.UNSIGNED_INT_2_10_10_10_REV;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_10F_11F_11F_REV():Int\n\t{\n\t\treturn this.UNSIGNED_INT_10F_11F_11F_REV;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_5_9_9_9_REV():Int\n\t{\n\t\treturn this.UNSIGNED_INT_5_9_9_9_REV;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_32_UNSIGNED_INT_24_8_REV():Int\n\t{\n\t\treturn this.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_24_8():Int\n\t{\n\t\treturn this.UNSIGNED_INT_24_8;\n\t}\n\n\t@:noCompletion private inline function get_HALF_FLOAT():Int\n\t{\n\t\treturn this.HALF_FLOAT;\n\t}\n\n\t@:noCompletion private inline function get_RG():Int\n\t{\n\t\treturn this.RG;\n\t}\n\n\t@:noCompletion private inline function get_RG_INTEGER():Int\n\t{\n\t\treturn this.RG_INTEGER;\n\t}\n\n\t@:noCompletion private inline function get_INT_2_10_10_10_REV():Int\n\t{\n\t\treturn this.INT_2_10_10_10_REV;\n\t}\n\n\t@:noCompletion private inline function get_CURRENT_QUERY():Int\n\t{\n\t\treturn this.CURRENT_QUERY;\n\t}\n\n\t@:noCompletion private inline function get_QUERY_RESULT():Int\n\t{\n\t\treturn this.QUERY_RESULT;\n\t}\n\n\t@:noCompletion private inline function get_QUERY_RESULT_AVAILABLE():Int\n\t{\n\t\treturn this.QUERY_RESULT_AVAILABLE;\n\t}\n\n\t@:noCompletion private inline function get_ANY_SAMPLES_PASSED():Int\n\t{\n\t\treturn this.ANY_SAMPLES_PASSED;\n\t}\n\n\t@:noCompletion private inline function get_ANY_SAMPLES_PASSED_CONSERVATIVE():Int\n\t{\n\t\treturn this.ANY_SAMPLES_PASSED_CONSERVATIVE;\n\t}\n\n\t@:noCompletion private inline function get_MAX_DRAW_BUFFERS():Int\n\t{\n\t\treturn this.MAX_DRAW_BUFFERS;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER0():Int\n\t{\n\t\treturn this.DRAW_BUFFER0;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER1():Int\n\t{\n\t\treturn this.DRAW_BUFFER1;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER2():Int\n\t{\n\t\treturn this.DRAW_BUFFER2;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER3():Int\n\t{\n\t\treturn this.DRAW_BUFFER3;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER4():Int\n\t{\n\t\treturn this.DRAW_BUFFER4;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER5():Int\n\t{\n\t\treturn this.DRAW_BUFFER5;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER6():Int\n\t{\n\t\treturn this.DRAW_BUFFER6;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER7():Int\n\t{\n\t\treturn this.DRAW_BUFFER7;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER8():Int\n\t{\n\t\treturn this.DRAW_BUFFER8;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER9():Int\n\t{\n\t\treturn this.DRAW_BUFFER9;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER10():Int\n\t{\n\t\treturn this.DRAW_BUFFER10;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER11():Int\n\t{\n\t\treturn this.DRAW_BUFFER11;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER12():Int\n\t{\n\t\treturn this.DRAW_BUFFER12;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER13():Int\n\t{\n\t\treturn this.DRAW_BUFFER13;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER14():Int\n\t{\n\t\treturn this.DRAW_BUFFER14;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_BUFFER15():Int\n\t{\n\t\treturn this.DRAW_BUFFER15;\n\t}\n\n\t@:noCompletion private inline function get_MAX_COLOR_ATTACHMENTS():Int\n\t{\n\t\treturn this.MAX_COLOR_ATTACHMENTS;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT1():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT1;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT2():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT2;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT3():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT3;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT4():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT4;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT5():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT5;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT6():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT6;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT7():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT7;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT8():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT8;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT9():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT9;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT10():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT10;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT11():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT11;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT12():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT12;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT13():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT13;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT14():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT14;\n\t}\n\n\t@:noCompletion private inline function get_COLOR_ATTACHMENT15():Int\n\t{\n\t\treturn this.COLOR_ATTACHMENT15;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_3D():Int\n\t{\n\t\treturn this.SAMPLER_3D;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_2D_SHADOW():Int\n\t{\n\t\treturn this.SAMPLER_2D_SHADOW;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_2D_ARRAY():Int\n\t{\n\t\treturn this.SAMPLER_2D_ARRAY;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_2D_ARRAY_SHADOW():Int\n\t{\n\t\treturn this.SAMPLER_2D_ARRAY_SHADOW;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_CUBE_SHADOW():Int\n\t{\n\t\treturn this.SAMPLER_CUBE_SHADOW;\n\t}\n\n\t@:noCompletion private inline function get_INT_SAMPLER_2D():Int\n\t{\n\t\treturn this.INT_SAMPLER_2D;\n\t}\n\n\t@:noCompletion private inline function get_INT_SAMPLER_3D():Int\n\t{\n\t\treturn this.INT_SAMPLER_3D;\n\t}\n\n\t@:noCompletion private inline function get_INT_SAMPLER_CUBE():Int\n\t{\n\t\treturn this.INT_SAMPLER_CUBE;\n\t}\n\n\t@:noCompletion private inline function get_INT_SAMPLER_2D_ARRAY():Int\n\t{\n\t\treturn this.INT_SAMPLER_2D_ARRAY;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_2D():Int\n\t{\n\t\treturn this.UNSIGNED_INT_SAMPLER_2D;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_3D():Int\n\t{\n\t\treturn this.UNSIGNED_INT_SAMPLER_3D;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_CUBE():Int\n\t{\n\t\treturn this.UNSIGNED_INT_SAMPLER_CUBE;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_SAMPLER_2D_ARRAY():Int\n\t{\n\t\treturn this.UNSIGNED_INT_SAMPLER_2D_ARRAY;\n\t}\n\n\t@:noCompletion private inline function get_MAX_SAMPLES():Int\n\t{\n\t\treturn this.MAX_SAMPLES;\n\t}\n\n\t@:noCompletion private inline function get_SAMPLER_BINDING():Int\n\t{\n\t\treturn this.SAMPLER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_PIXEL_PACK_BUFFER():Int\n\t{\n\t\treturn this.PIXEL_PACK_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_PIXEL_UNPACK_BUFFER():Int\n\t{\n\t\treturn this.PIXEL_UNPACK_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_PIXEL_PACK_BUFFER_BINDING():Int\n\t{\n\t\treturn this.PIXEL_PACK_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_PIXEL_UNPACK_BUFFER_BINDING():Int\n\t{\n\t\treturn this.PIXEL_UNPACK_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_COPY_READ_BUFFER():Int\n\t{\n\t\treturn this.COPY_READ_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_COPY_WRITE_BUFFER():Int\n\t{\n\t\treturn this.COPY_WRITE_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_COPY_READ_BUFFER_BINDING():Int\n\t{\n\t\treturn this.COPY_READ_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_COPY_WRITE_BUFFER_BINDING():Int\n\t{\n\t\treturn this.COPY_WRITE_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT2x3():Int\n\t{\n\t\treturn this.FLOAT_MAT2x3;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT2x4():Int\n\t{\n\t\treturn this.FLOAT_MAT2x4;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT3x2():Int\n\t{\n\t\treturn this.FLOAT_MAT3x2;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT3x4():Int\n\t{\n\t\treturn this.FLOAT_MAT3x4;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT4x2():Int\n\t{\n\t\treturn this.FLOAT_MAT4x2;\n\t}\n\n\t@:noCompletion private inline function get_FLOAT_MAT4x3():Int\n\t{\n\t\treturn this.FLOAT_MAT4x3;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_VEC2():Int\n\t{\n\t\treturn this.UNSIGNED_INT_VEC2;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_VEC3():Int\n\t{\n\t\treturn this.UNSIGNED_INT_VEC3;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_INT_VEC4():Int\n\t{\n\t\treturn this.UNSIGNED_INT_VEC4;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNED_NORMALIZED():Int\n\t{\n\t\treturn this.UNSIGNED_NORMALIZED;\n\t}\n\n\t@:noCompletion private inline function get_SIGNED_NORMALIZED():Int\n\t{\n\t\treturn this.SIGNED_NORMALIZED;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_INTEGER():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_INTEGER;\n\t}\n\n\t@:noCompletion private inline function get_VERTEX_ATTRIB_ARRAY_DIVISOR():Int\n\t{\n\t\treturn this.VERTEX_ATTRIB_ARRAY_DIVISOR;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_MODE():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_BUFFER_MODE;\n\t}\n\n\t@:noCompletion private inline function get_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_VARYINGS():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_VARYINGS;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_START():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_BUFFER_START;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_SIZE():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_BUFFER_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;\n\t}\n\n\t@:noCompletion private inline function get_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS():Int\n\t{\n\t\treturn this.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;\n\t}\n\n\t@:noCompletion private inline function get_INTERLEAVED_ATTRIBS():Int\n\t{\n\t\treturn this.INTERLEAVED_ATTRIBS;\n\t}\n\n\t@:noCompletion private inline function get_SEPARATE_ATTRIBS():Int\n\t{\n\t\treturn this.SEPARATE_ATTRIBS;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BUFFER_BINDING():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_PAUSED():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_PAUSED;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_ACTIVE():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_ACTIVE;\n\t}\n\n\t@:noCompletion private inline function get_TRANSFORM_FEEDBACK_BINDING():Int\n\t{\n\t\treturn this.TRANSFORM_FEEDBACK_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_RED_SIZE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_RED_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_DEFAULT():Int\n\t{\n\t\treturn this.FRAMEBUFFER_DEFAULT;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH24_STENCIL8():Int\n\t{\n\t\treturn this.DEPTH24_STENCIL8;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_FRAMEBUFFER_BINDING():Int\n\t{\n\t\treturn this.DRAW_FRAMEBUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_READ_FRAMEBUFFER():Int\n\t{\n\t\treturn this.READ_FRAMEBUFFER;\n\t}\n\n\t@:noCompletion private inline function get_DRAW_FRAMEBUFFER():Int\n\t{\n\t\treturn this.DRAW_FRAMEBUFFER;\n\t}\n\n\t@:noCompletion private inline function get_READ_FRAMEBUFFER_BINDING():Int\n\t{\n\t\treturn this.READ_FRAMEBUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_RENDERBUFFER_SAMPLES():Int\n\t{\n\t\treturn this.RENDERBUFFER_SAMPLES;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER():Int\n\t{\n\t\treturn this.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER;\n\t}\n\n\t@:noCompletion private inline function get_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE():Int\n\t{\n\t\treturn this.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BUFFER():Int\n\t{\n\t\treturn this.UNIFORM_BUFFER;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BUFFER_BINDING():Int\n\t{\n\t\treturn this.UNIFORM_BUFFER_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BUFFER_START():Int\n\t{\n\t\treturn this.UNIFORM_BUFFER_START;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BUFFER_SIZE():Int\n\t{\n\t\treturn this.UNIFORM_BUFFER_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_MAX_VERTEX_UNIFORM_BLOCKS():Int\n\t{\n\t\treturn this.MAX_VERTEX_UNIFORM_BLOCKS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_FRAGMENT_UNIFORM_BLOCKS():Int\n\t{\n\t\treturn this.MAX_FRAGMENT_UNIFORM_BLOCKS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_COMBINED_UNIFORM_BLOCKS():Int\n\t{\n\t\treturn this.MAX_COMBINED_UNIFORM_BLOCKS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_UNIFORM_BUFFER_BINDINGS():Int\n\t{\n\t\treturn this.MAX_UNIFORM_BUFFER_BINDINGS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_UNIFORM_BLOCK_SIZE():Int\n\t{\n\t\treturn this.MAX_UNIFORM_BLOCK_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS():Int\n\t{\n\t\treturn this.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BUFFER_OFFSET_ALIGNMENT():Int\n\t{\n\t\treturn this.UNIFORM_BUFFER_OFFSET_ALIGNMENT;\n\t}\n\n\t@:noCompletion private inline function get_ACTIVE_UNIFORM_BLOCKS():Int\n\t{\n\t\treturn this.ACTIVE_UNIFORM_BLOCKS;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_TYPE():Int\n\t{\n\t\treturn this.UNIFORM_TYPE;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_SIZE():Int\n\t{\n\t\treturn this.UNIFORM_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_INDEX():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_INDEX;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_OFFSET():Int\n\t{\n\t\treturn this.UNIFORM_OFFSET;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_ARRAY_STRIDE():Int\n\t{\n\t\treturn this.UNIFORM_ARRAY_STRIDE;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_MATRIX_STRIDE():Int\n\t{\n\t\treturn this.UNIFORM_MATRIX_STRIDE;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_IS_ROW_MAJOR():Int\n\t{\n\t\treturn this.UNIFORM_IS_ROW_MAJOR;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_BINDING():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_BINDING;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_DATA_SIZE():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_DATA_SIZE;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_ACTIVE_UNIFORMS():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_ACTIVE_UNIFORMS;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER;\n\t}\n\n\t@:noCompletion private inline function get_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER():Int\n\t{\n\t\treturn this.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER;\n\t}\n\n\t@:noCompletion private inline function get_OBJECT_TYPE():Int\n\t{\n\t\treturn this.OBJECT_TYPE;\n\t}\n\n\t@:noCompletion private inline function get_SYNC_CONDITION():Int\n\t{\n\t\treturn this.SYNC_CONDITION;\n\t}\n\n\t@:noCompletion private inline function get_SYNC_STATUS():Int\n\t{\n\t\treturn this.SYNC_STATUS;\n\t}\n\n\t@:noCompletion private inline function get_SYNC_FLAGS():Int\n\t{\n\t\treturn this.SYNC_FLAGS;\n\t}\n\n\t@:noCompletion private inline function get_SYNC_FENCE():Int\n\t{\n\t\treturn this.SYNC_FENCE;\n\t}\n\n\t@:noCompletion private inline function get_SYNC_GPU_COMMANDS_COMPLETE():Int\n\t{\n\t\treturn this.SYNC_GPU_COMMANDS_COMPLETE;\n\t}\n\n\t@:noCompletion private inline function get_UNSIGNALED():Int\n\t{\n\t\treturn this.UNSIGNALED;\n\t}\n\n\t@:noCompletion private inline function get_SIGNALED():Int\n\t{\n\t\treturn this.SIGNALED;\n\t}\n\n\t@:noCompletion private inline function get_ALREADY_SIGNALED():Int\n\t{\n\t\treturn this.ALREADY_SIGNALED;\n\t}\n\n\t@:noCompletion private inline function get_TIMEOUT_EXPIRED():Int\n\t{\n\t\treturn this.TIMEOUT_EXPIRED;\n\t}\n\n\t@:noCompletion private inline function get_CONDITION_SATISFIED():Int\n\t{\n\t\treturn this.CONDITION_SATISFIED;\n\t}\n\n\t@:noCompletion private inline function get_WAIT_FAILED():Int\n\t{\n\t\treturn this.WAIT_FAILED;\n\t}\n\n\t@:noCompletion private inline function get_SYNC_FLUSH_COMMANDS_BIT():Int\n\t{\n\t\treturn this.SYNC_FLUSH_COMMANDS_BIT;\n\t}\n\n\t@:noCompletion private inline function get_COLOR():Int\n\t{\n\t\treturn this.COLOR;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH():Int\n\t{\n\t\treturn this.DEPTH;\n\t}\n\n\t@:noCompletion private inline function get_STENCIL():Int\n\t{\n\t\treturn this.STENCIL;\n\t}\n\n\t@:noCompletion private inline function get_MIN():Int\n\t{\n\t\treturn this.MIN;\n\t}\n\n\t@:noCompletion private inline function get_MAX():Int\n\t{\n\t\treturn this.MAX;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_COMPONENT24():Int\n\t{\n\t\treturn this.DEPTH_COMPONENT24;\n\t}\n\n\t@:noCompletion private inline function get_STREAM_READ():Int\n\t{\n\t\treturn this.STREAM_READ;\n\t}\n\n\t@:noCompletion private inline function get_STREAM_COPY():Int\n\t{\n\t\treturn this.STREAM_COPY;\n\t}\n\n\t@:noCompletion private inline function get_STATIC_READ():Int\n\t{\n\t\treturn this.STATIC_READ;\n\t}\n\n\t@:noCompletion private inline function get_STATIC_COPY():Int\n\t{\n\t\treturn this.STATIC_COPY;\n\t}\n\n\t@:noCompletion private inline function get_DYNAMIC_READ():Int\n\t{\n\t\treturn this.DYNAMIC_READ;\n\t}\n\n\t@:noCompletion private inline function get_DYNAMIC_COPY():Int\n\t{\n\t\treturn this.DYNAMIC_COPY;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH_COMPONENT32F():Int\n\t{\n\t\treturn this.DEPTH_COMPONENT32F;\n\t}\n\n\t@:noCompletion private inline function get_DEPTH32F_STENCIL8():Int\n\t{\n\t\treturn this.DEPTH32F_STENCIL8;\n\t}\n\n\t@:noCompletion private inline function get_INVALID_INDEX():Int\n\t{\n\t\treturn this.INVALID_INDEX;\n\t}\n\n\t@:noCompletion private inline function get_TIMEOUT_IGNORED():Int\n\t{\n\t\treturn this.TIMEOUT_IGNORED;\n\t}\n\n\t@:noCompletion private inline function get_MAX_CLIENT_WAIT_TIMEOUT_WEBGL():Int\n\t{\n\t\treturn this.MAX_CLIENT_WAIT_TIMEOUT_WEBGL;\n\t}\n\n\tpublic inline function activeTexture(texture:Int):Void\n\t{\n\t\tthis.activeTexture(texture);\n\t}\n\n\tpublic inline function attachShader(program:GLProgram, shader:GLShader):Void\n\t{\n\t\tthis.attachShader(program, shader);\n\t}\n\n\tpublic inline function beginQuery(target:Int, query:GLQuery):Void\n\t{\n\t\tthis.beginQuery(target, query);\n\t}\n\n\tpublic inline function beginTransformFeedback(primitiveNode:Int):Void\n\t{\n\t\tthis.beginTransformFeedback(primitiveNode);\n\t}\n\n\tpublic inline function bindAttribLocation(program:GLProgram, index:Int, name:String):Void\n\t{\n\t\tthis.bindAttribLocation(program, index, name);\n\t}\n\n\tpublic inline function bindBuffer(target:Int, buffer:GLBuffer):Void\n\t{\n\t\tthis.bindBuffer(target, buffer);\n\t}\n\n\tpublic inline function bindBufferBase(target:Int, index:Int, buffer:GLBuffer):Void\n\t{\n\t\tthis.bindBufferBase(target, index, buffer);\n\t}\n\n\tpublic inline function bindBufferRange(target:Int, index:Int, buffer:GLBuffer, offset:DataPointer, size:Int):Void\n\t{\n\t\tthis.bindBufferRange(target, index, buffer, offset, size);\n\t}\n\n\tpublic inline function bindFramebuffer(target:Int, framebuffer:GLFramebuffer):Void\n\t{\n\t\tthis.bindFramebuffer(target, framebuffer);\n\t}\n\n\tpublic inline function bindRenderbuffer(target:Int, renderbuffer:GLRenderbuffer):Void\n\t{\n\t\tthis.bindRenderbuffer(target, renderbuffer);\n\t}\n\n\tpublic inline function bindSampler(unit:Int, sampler:GLSampler):Void\n\t{\n\t\tthis.bindSampler(unit, sampler);\n\t}\n\n\tpublic inline function bindTexture(target:Int, texture:GLTexture):Void\n\t{\n\t\tthis.bindTexture(target, texture);\n\t}\n\n\tpublic inline function bindTransformFeedback(target:Int, transformFeedback:GLTransformFeedback):Void\n\t{\n\t\tthis.bindTransformFeedback(target, transformFeedback);\n\t}\n\n\tpublic inline function bindVertexArray(vertexArray:GLVertexArrayObject):Void\n\t{\n\t\tthis.bindVertexArray(vertexArray);\n\t}\n\n\tpublic inline function blendColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n\t{\n\t\tthis.blendColor(red, green, blue, alpha);\n\t}\n\n\tpublic inline function blendEquation(mode:Int):Void\n\t{\n\t\tthis.blendEquation(mode);\n\t}\n\n\tpublic inline function blendEquationSeparate(modeRGB:Int, modeAlpha:Int):Void\n\t{\n\t\tthis.blendEquationSeparate(modeRGB, modeAlpha);\n\t}\n\n\tpublic inline function blendFunc(sfactor:Int, dfactor:Int):Void\n\t{\n\t\tthis.blendFunc(sfactor, dfactor);\n\t}\n\n\tpublic inline function blendFuncSeparate(srcRGB:Int, dstRGB:Int, srcAlpha:Int, dstAlpha:Int):Void\n\t{\n\t\tthis.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);\n\t}\n\n\tpublic inline function blitFramebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int, dstY0:Int, dstX1:Int, dstY1:Int, mask:Int, filter:Int):Void\n\t{\n\t\tthis.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n\t}\n\n\t#if !lime_webgl\n\tpublic function bufferData(target:Int, srcData:ArrayBufferView, usage:Int, srcOffset:Int = 0, length:Int = 0):Void\n\t#else\n\tpublic inline function bufferData(target:Int, srcData:Dynamic, usage:Int, ?srcOffset:Int, ?length:Int):Void\n\t#end\n\t{\n\t\tvar size = (srcData != null) ? srcData.byteLength : 0;\n\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.bufferData(target, size, __tempPointer, usage);\n\t\t}\n\n\t#if !lime_webgl\n\tpublic inline function bufferSubData(target:Int, offset:Int, srcData:ArrayBufferView, srcOffset:Int = 0, ?length:Int):Void\n\t#else\n\tpublic inline function bufferSubData(target:Int, offset:Int, srcData:Dynamic, ?srcOffset:Int, ?length:Int):Void\n\t#end\n\t{\n\t\tvar size = (length != null) ? length : (srcData != null) ? srcData.byteLength : 0;\n\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.bufferSubData(target, offset, size, __tempPointer);\n\t}\n\n\tpublic inline function checkFramebufferStatus(target:Int):Int\n\t{\n\t\treturn this.checkFramebufferStatus(target);\n\t}\n\n\tpublic inline function clear(mask:Int):Void\n\t{\n\t\tthis.clear(mask);\n\t}\n\n\tpublic inline function clearBufferfi(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void\n\t{\n\t\tthis.clearBufferfi(buffer, drawbuffer, depth, stencil);\n\t}\n\n\tpublic function clearBufferfv(buffer:Int, drawbuffer:Int, values:ArrayBufferView, srcOffset:Int = 0):Void\n\t{\n\t\t__tempPointer.set(values, srcOffset);\n\t\tthis.clearBufferfv(buffer, drawbuffer, __tempPointer);\n\t}\n\n\tpublic function clearBufferiv(buffer:Int, drawbuffer:Int, values:ArrayBufferView, ?srcOffset:Int):Void\n\t{\n\t\t__tempPointer.set(values, srcOffset);\n\t\tthis.clearBufferiv(buffer, drawbuffer, __tempPointer);\n\t}\n\n\tpublic function clearBufferuiv(buffer:Int, drawbuffer:Int, values:ArrayBufferView, ?srcOffset:Int):Void\n\t{\n\t\t__tempPointer.set(values, srcOffset);\n\t\tthis.clearBufferuiv(buffer, drawbuffer, __tempPointer);\n\t}\n\n\tpublic inline function clearColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n\t{\n\t\tthis.clearColor(red, green, blue, alpha);\n\t}\n\n\tpublic inline function clearDepth(depth:Float):Void\n\t{\n\t\tthis.clearDepthf(depth);\n\t}\n\n\tpublic inline function clearStencil(s:Int):Void\n\t{\n\t\tthis.clearStencil(s);\n\t}\n\n\tpublic inline function clientWaitSync(sync:GLSync, flags:Int, timeout:Int64):Int\n\t{\n\t\treturn this.clientWaitSync(sync, flags, timeout);\n\t}\n\n\tpublic inline function colorMask(red:Bool, green:Bool, blue:Bool, alpha:Bool):Void\n\t{\n\t\tthis.colorMask(red, green, blue, alpha);\n\t}\n\n\tpublic inline function compileShader(shader:GLShader):Void\n\t{\n\t\tthis.compileShader(shader);\n\t}\n\n\t#if !lime_webgl\n\tpublic function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, srcData:ArrayBufferView,\n\t\tsrcOffset:Int = 0,\n\t\t\t?srcLengthOverride:Int):Void\n\t#else\n\tpublic inline function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, srcData:Dynamic,\n\t\t?srcOffset:Int,\n\t\t\t?srcLengthOverride:Int):Void\n\t#end\n\t{\n\t\tvar imageSize = (srcLengthOverride != null) ? srcLengthOverride : (srcData != null) ? srcData.byteLength : 0;\n\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, __tempPointer);\n\t}\n\n\tpublic function compressedTexImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int,\n\t\tsrcData:ArrayBufferView,\n\t\t\tsrcOffset:Int = 0, ?srcLengthOverride:Int):Void\n\t{\n\t\tvar imageSize = (srcLengthOverride != null) ? srcLengthOverride : (srcData != null) ? srcData.byteLength : 0;\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, __tempPointer);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int,\n\t\tsrcData:ArrayBufferView,\n\t\t\tsrcOffset:Int = 0, ?srcLengthOverride:Int):Void\n\t#else\n\tpublic inline function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int,\n\t\tsrcData:Dynamic,\n\t\t\t?srcOffset:Int, ?srcLengthOverride:Int):Void\n\t#end\n\t{\n\t\tvar imageSize = (srcLengthOverride != null) ? srcLengthOverride : (srcData != null) ? srcData.byteLength : 0;\n\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, __tempPointer);\n\t}\n\n\tpublic inline function compressedTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int,\n\t\tdepth:Int, format:Int,\n\t\t\tsrcData:ArrayBufferView, srcOffset:Int = 0, ?srcLengthOverride:Int):Void\n\t{\n\t\tvar imageSize = (srcLengthOverride != null) ? srcLengthOverride : (srcData != null) ? srcData.byteLength : 0;\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, __tempPointer);\n\t}\n\n\tpublic inline function copyBufferSubData(readTarget:Int, writeTarget:Int, readOffset:DataPointer, writeOffset:DataPointer, size:Int):Void\n\t{\n\t\tthis.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);\n\t}\n\n\tpublic inline function copyTexImage2D(target:Int, level:Int, internalformat:Int, x:Int, y:Int, width:Int, height:Int, border:Int):Void\n\t{\n\t\tthis.copyTexImage2D(target, level, internalformat, x, y, width, height, border);\n\t}\n\n\tpublic inline function copyTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);\n\t}\n\n\tpublic inline function copyTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int,\n\t\theight:Int):Void\n\t{\n\t\tthis.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);\n\t}\n\n\tpublic inline function createBuffer():GLBuffer\n\t{\n\t\treturn this.createBuffer();\n\t}\n\n\tpublic inline function createFramebuffer():GLFramebuffer\n\t{\n\t\treturn this.createFramebuffer();\n\t}\n\n\tpublic inline function createProgram():GLProgram\n\t{\n\t\treturn this.createProgram();\n\t}\n\n\tpublic inline function createQuery():GLQuery\n\t{\n\t\treturn this.createQuery();\n\t}\n\n\tpublic inline function createRenderbuffer():GLRenderbuffer\n\t{\n\t\treturn this.createRenderbuffer();\n\t}\n\n\tpublic inline function createSampler():GLSampler\n\t{\n\t\treturn this.createSampler();\n\t}\n\n\tpublic inline function createShader(type:Int):GLShader\n\t{\n\t\treturn this.createShader(type);\n\t}\n\n\tpublic inline function createTexture():GLTexture\n\t{\n\t\treturn this.createTexture();\n\t}\n\n\tpublic inline function createTransformFeedback():GLTransformFeedback\n\t{\n\t\treturn this.createTransformFeedback();\n\t}\n\n\tpublic inline function createVertexArray():GLVertexArrayObject\n\t{\n\t\treturn this.createVertexArray();\n\t}\n\n\tpublic inline function cullFace(mode:Int):Void\n\t{\n\t\tthis.cullFace(mode);\n\t}\n\n\tpublic inline function deleteBuffer(buffer:GLBuffer):Void\n\t{\n\t\tthis.deleteBuffer(buffer);\n\t}\n\n\tpublic inline function deleteFramebuffer(framebuffer:GLFramebuffer):Void\n\t{\n\t\tthis.deleteFramebuffer(framebuffer);\n\t}\n\n\tpublic inline function deleteProgram(program:GLProgram):Void\n\t{\n\t\tthis.deleteProgram(program);\n\t}\n\n\tpublic inline function deleteQuery(query:GLQuery):Void\n\t{\n\t\tthis.deleteQuery(query);\n\t}\n\n\tpublic inline function deleteRenderbuffer(renderbuffer:GLRenderbuffer):Void\n\t{\n\t\tthis.deleteRenderbuffer(renderbuffer);\n\t}\n\n\tpublic inline function deleteSampler(sampler:GLSampler):Void\n\t{\n\t\tthis.deleteSampler(sampler);\n\t}\n\n\tpublic inline function deleteShader(shader:GLShader):Void\n\t{\n\t\tthis.deleteShader(shader);\n\t}\n\n\tpublic inline function deleteSync(sync:GLSync):Void\n\t{\n\t\tthis.deleteSync(sync);\n\t}\n\n\tpublic inline function deleteTexture(texture:GLTexture):Void\n\t{\n\t\tthis.deleteTexture(texture);\n\t}\n\n\tpublic inline function deleteTransformFeedback(transformFeedback:GLTransformFeedback):Void\n\t{\n\t\tthis.deleteTransformFeedback(transformFeedback);\n\t}\n\n\tpublic inline function deleteVertexArray(vertexArray:GLVertexArrayObject):Void\n\t{\n\t\tthis.deleteVertexArray(vertexArray);\n\t}\n\n\tpublic inline function depthFunc(func:Int):Void\n\t{\n\t\tthis.depthFunc(func);\n\t}\n\n\tpublic inline function depthMask(flag:Bool):Void\n\t{\n\t\tthis.depthMask(flag);\n\t}\n\n\tpublic inline function depthRange(zNear:Float, zFar:Float):Void\n\t{\n\t\tthis.depthRangef(zNear, zFar);\n\t}\n\n\tpublic inline function detachShader(program:GLProgram, shader:GLShader):Void\n\t{\n\t\tthis.detachShader(program, shader);\n\t}\n\n\tpublic inline function disable(cap:Int):Void\n\t{\n\t\tthis.disable(cap);\n\t}\n\n\tpublic inline function disableVertexAttribArray(index:Int):Void\n\t{\n\t\tthis.disableVertexAttribArray(index);\n\t}\n\n\tpublic inline function drawArrays(mode:Int, first:Int, count:Int):Void\n\t{\n\t\tthis.drawArrays(mode, first, count);\n\t}\n\n\tpublic inline function drawArraysInstanced(mode:Int, first:Int, count:Int, instanceCount:Int):Void\n\t{\n\t\tthis.drawArraysInstanced(mode, first, count, instanceCount);\n\t}\n\n\tpublic inline function drawBuffers(buffers:Array<Int>):Void\n\t{\n\t\tthis.drawBuffers(buffers);\n\t}\n\n\tpublic inline function drawElements(mode:Int, count:Int, type:Int, offset:DataPointer):Void\n\t{\n\t\tthis.drawElements(mode, count, type, offset);\n\t}\n\n\tpublic inline function drawElementsInstanced(mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void\n\t{\n\t\tthis.drawElementsInstanced(mode, count, type, offset, instanceCount);\n\t}\n\n\tpublic inline function drawRangeElements(mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void\n\t{\n\t\tthis.drawRangeElements(mode, start, end, count, type, offset);\n\t}\n\n\tpublic inline function enable(cap:Int):Void\n\t{\n\t\tthis.enable(cap);\n\t}\n\n\tpublic inline function enableVertexAttribArray(index:Int):Void\n\t{\n\t\tthis.enableVertexAttribArray(index);\n\t}\n\n\tpublic inline function endQuery(target:Int):Void\n\t{\n\t\tthis.endQuery(target);\n\t}\n\n\tpublic inline function endTransformFeedback():Void\n\t{\n\t\tthis.endTransformFeedback();\n\t}\n\n\tpublic inline function fenceSync(condition:Int, flags:Int):GLSync\n\t{\n\t\treturn this.fenceSync(condition, flags);\n\t}\n\n\tpublic inline function finish():Void\n\t{\n\t\tthis.finish();\n\t}\n\n\tpublic inline function flush():Void\n\t{\n\t\tthis.flush();\n\t}\n\n\tpublic inline function framebufferRenderbuffer(target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:GLRenderbuffer):Void\n\t{\n\t\tthis.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);\n\t}\n\n\tpublic inline function framebufferTexture2D(target:Int, attachment:Int, textarget:Int, texture:GLTexture, level:Int):Void\n\t{\n\t\tthis.framebufferTexture2D(target, attachment, textarget, texture, level);\n\t}\n\n\tpublic inline function framebufferTextureLayer(target:Int, attachment:Int, texture:GLTexture, level:Int, layer:Int):Void\n\t{\n\t\tthis.framebufferTextureLayer(target, attachment, texture, level, layer);\n\t}\n\n\tpublic inline function frontFace(mode:Int):Void\n\t{\n\t\tthis.frontFace(mode);\n\t}\n\n\tpublic inline function generateMipmap(target:Int):Void\n\t{\n\t\tthis.generateMipmap(target);\n\t}\n\n\tpublic inline function getActiveAttrib(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\treturn this.getActiveAttrib(program, index);\n\t}\n\n\tpublic inline function getActiveUniform(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\treturn this.getActiveUniform(program, index);\n\t}\n\n\tpublic inline function getActiveUniformBlockName(program:GLProgram, uniformBlockIndex:Int):String\n\t{\n\t\treturn this.getActiveUniformBlockName(program, uniformBlockIndex);\n\t}\n\n\tpublic inline function getActiveUniformBlockParameter(program:GLProgram, uniformBlockIndex:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getActiveUniformBlockParameter(program, uniformBlockIndex, pname);\n\t}\n\n\tpublic inline function getActiveUniforms(program:GLProgram, uniformIndices:Array<Int>, pname:Int):Dynamic\n\t{\n\t\treturn this.getActiveUniforms(program, uniformIndices, pname);\n\t}\n\n\tpublic inline function getAttachedShaders(program:GLProgram):Array<GLShader>\n\t{\n\t\treturn this.getAttachedShaders(program);\n\t}\n\n\tpublic inline function getAttribLocation(program:GLProgram, name:String):Int\n\t{\n\t\treturn this.getAttribLocation(program, name);\n\t}\n\n\tpublic inline function getBufferParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getBufferParameter(target, pname);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function getBufferSubData(target:Int, srcByteOffset:DataPointer, dstData:ArrayBuffer, srcOffset:Int = 0, ?length:Int):Void\n\t#else\n\tpublic inline function getBufferSubData(target:Int, srcByteOffset:DataPointer, dstData:Dynamic, ?srcOffset:Dynamic, ?length:Int):Void\n\t#end\n\t{\n\t\t#if !js\n\t\tvar size = (length != null) ? length : (dstData != null) ? dstData.length : 0;\n\n\t\tthis.getBufferSubData(target, srcByteOffset + srcOffset, size, dstData);\n\t\t#end\n\t}\n\n\tpublic inline function getContextAttributes():GLContextAttributes\n\t{\n\t\treturn this.getContextAttributes();\n\t}\n\n\tpublic inline function getError():Int\n\t{\n\t\treturn this.getError();\n\t}\n\n\tpublic inline function getExtension(name:String):Dynamic\n\t{\n\t\treturn this.getExtension(name);\n\t}\n\n\tpublic inline function getFragDataLocation(program:GLProgram, name:String):Int\n\t{\n\t\treturn this.getFragDataLocation(program, name);\n\t}\n\n\tpublic inline function getFramebufferAttachmentParameter(target:Int, attachment:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getFramebufferAttachmentParameter(target, attachment, pname);\n\t}\n\n\tpublic inline function getIndexedParameter(target:Int, index:Int):Dynamic\n\t{\n\t\treturn this.getIndexedParameter(target, index);\n\t}\n\n\tpublic inline function getInternalformatParameter(target:Int, internalformat:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getInternalformatParameter(target, internalformat, pname);\n\t}\n\n\tpublic inline function getParameter(pname:Int):Dynamic\n\t{\n\t\treturn this.getParameter(pname);\n\t}\n\n\tpublic inline function getProgramInfoLog(program:GLProgram):String\n\t{\n\t\treturn this.getProgramInfoLog(program);\n\t}\n\n\tpublic inline function getProgramParameter(program:GLProgram, pname:Int):Dynamic\n\t{\n\t\treturn this.getProgramParameter(program, pname);\n\t}\n\n\tpublic inline function getQuery(target:Int, pname:Int):GLQuery\n\t{\n\t\treturn this.getQuery(target, pname);\n\t}\n\n\tpublic inline function getQueryParameter(query:GLQuery, pname:Int):Dynamic\n\t{\n\t\treturn this.getQueryParameter(query, pname);\n\t}\n\n\tpublic inline function getRenderbufferParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getRenderbufferParameter(target, pname);\n\t}\n\n\tpublic inline function getSamplerParameter(sampler:GLSampler, pname:Int):Dynamic\n\t{\n\t\treturn this.getSamplerParameter(sampler, pname);\n\t}\n\n\tpublic inline function getShaderInfoLog(shader:GLShader):String\n\t{\n\t\treturn this.getShaderInfoLog(shader);\n\t}\n\n\tpublic inline function getShaderParameter(shader:GLShader, pname:Int):Dynamic\n\t{\n\t\treturn this.getShaderParameter(shader, pname);\n\t}\n\n\tpublic inline function getShaderPrecisionFormat(shadertype:Int, precisiontype:Int):GLShaderPrecisionFormat\n\t{\n\t\treturn this.getShaderPrecisionFormat(shadertype, precisiontype);\n\t}\n\n\tpublic inline function getShaderSource(shader:GLShader):String\n\t{\n\t\treturn this.getShaderSource(shader);\n\t}\n\n\tpublic inline function getSupportedExtensions():Array<String>\n\t{\n\t\treturn this.getSupportedExtensions();\n\t}\n\n\tpublic inline function getSyncParameter(sync:GLSync, pname:Int):Dynamic\n\t{\n\t\treturn this.getSyncParameter(sync, pname);\n\t}\n\n\tpublic inline function getTexParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getTexParameter(target, pname);\n\t}\n\n\tpublic inline function getTransformFeedbackVarying(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\treturn this.getTransformFeedbackVarying(program, index);\n\t}\n\n\tpublic inline function getUniform(program:GLProgram, location:GLUniformLocation):Dynamic\n\t{\n\t\treturn this.getUniform(program, location);\n\t}\n\n\tpublic inline function getUniformBlockIndex(program:GLProgram, uniformBlockName:String):Int\n\t{\n\t\treturn this.getUniformBlockIndex(program, uniformBlockName);\n\t}\n\n\tpublic inline function getUniformIndices(program:GLProgram, uniformNames:Array<String>):Array<Int>\n\t{\n\t\treturn this.getUniformIndices(program, uniformNames);\n\t}\n\n\tpublic inline function getUniformLocation(program:GLProgram, name:String):GLUniformLocation\n\t{\n\t\treturn this.getUniformLocation(program, name);\n\t}\n\n\tpublic inline function getVertexAttrib(index:Int, pname:Int):Dynamic\n\t{\n\t\treturn this.getVertexAttrib(index, pname);\n\t}\n\n\tpublic inline function getVertexAttribOffset(index:Int, pname:Int):DataPointer\n\t{\n\t\treturn this.getVertexAttribPointerv(index, pname);\n\t}\n\n\tpublic inline function hint(target:Int, mode:Int):Void\n\t{\n\t\tthis.hint(target, mode);\n\t}\n\n\tpublic inline function invalidateFramebuffer(target:Int, attachments:Array<Int>):Void\n\t{\n\t\tthis.invalidateFramebuffer(target, attachments);\n\t}\n\n\tpublic inline function invalidateSubFramebuffer(target:Int, attachments:Array<Int>, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.invalidateSubFramebuffer(target, attachments, x, y, width, height);\n\t}\n\n\tpublic inline function isBuffer(buffer:GLBuffer):Bool\n\t{\n\t\treturn this.isBuffer(buffer);\n\t}\n\n\tpublic inline function isContextLost():Bool\n\t{\n\t\treturn this.isContextLost();\n\t}\n\n\tpublic inline function isEnabled(cap:Int):Bool\n\t{\n\t\treturn this.isEnabled(cap);\n\t}\n\n\tpublic inline function isFramebuffer(framebuffer:GLFramebuffer):Bool\n\t{\n\t\treturn this.isFramebuffer(framebuffer);\n\t}\n\n\tpublic inline function isProgram(program:GLProgram):Bool\n\t{\n\t\treturn this.isProgram(program);\n\t}\n\n\tpublic inline function isQuery(query:GLQuery):Bool\n\t{\n\t\treturn this.isQuery(query);\n\t}\n\n\tpublic inline function isRenderbuffer(renderbuffer:GLRenderbuffer):Bool\n\t{\n\t\treturn this.isRenderbuffer(renderbuffer);\n\t}\n\n\tpublic inline function isSampler(sampler:GLSampler):Bool\n\t{\n\t\treturn this.isSampler(sampler);\n\t}\n\n\tpublic inline function isShader(shader:GLShader):Bool\n\t{\n\t\treturn this.isShader(shader);\n\t}\n\n\tpublic inline function isSync(sync:GLSync):Bool\n\t{\n\t\treturn this.isSync(sync);\n\t}\n\n\tpublic inline function isTexture(texture:GLTexture):Bool\n\t{\n\t\treturn this.isTexture(texture);\n\t}\n\n\tpublic inline function isTransformFeedback(transformFeedback:GLTransformFeedback):Bool\n\t{\n\t\treturn this.isTransformFeedback(transformFeedback);\n\t}\n\n\tpublic inline function isVertexArray(vertexArray:GLVertexArrayObject):Bool\n\t{\n\t\treturn this.isVertexArray(vertexArray);\n\t}\n\n\tpublic inline function lineWidth(width:Float):Void\n\t{\n\t\tthis.lineWidth(width);\n\t}\n\n\tpublic inline function linkProgram(program:GLProgram):Void\n\t{\n\t\tthis.linkProgram(program);\n\t}\n\n\tpublic inline function pauseTransformFeedback():Void\n\t{\n\t\tthis.pauseTransformFeedback();\n\t}\n\n\tpublic inline function pixelStorei(pname:Int, param:Int):Void\n\t{\n\t\tthis.pixelStorei(pname, param);\n\t}\n\n\tpublic inline function polygonOffset(factor:Float, units:Float):Void\n\t{\n\t\tthis.polygonOffset(factor, units);\n\t}\n\n\tpublic inline function readBuffer(src:Int):Void\n\t{\n\t\tthis.readBuffer(src);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:ArrayBufferView,\n\t\tdstOffset:Int = 0):Void\n\t#else\n\tpublic inline function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:Dynamic, ?dstOffset:Int):Void\n\t#end\n\t{\n\t\t__tempPointer.set(pixels, dstOffset);\n\t\tthis.readPixels(x, y, width, height, format, type, __tempPointer);\n\t}\n\n\tpublic inline function renderbufferStorage(target:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.renderbufferStorage(target, internalformat, width, height);\n\t}\n\n\tpublic inline function renderbufferStorageMultisample(target:Int, samples:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.renderbufferStorageMultisample(target, samples, internalformat, width, height);\n\t}\n\n\tpublic inline function resumeTransformFeedback():Void\n\t{\n\t\tthis.resumeTransformFeedback();\n\t}\n\n\tpublic inline function sampleCoverage(value:Float, invert:Bool):Void\n\t{\n\t\tthis.sampleCoverage(value, invert);\n\t}\n\n\tpublic inline function samplerParameterf(sampler:GLSampler, pname:Int, param:Float):Void\n\t{\n\t\tthis.samplerParameterf(sampler, pname, param);\n\t}\n\n\tpublic inline function samplerParameteri(sampler:GLSampler, pname:Int, param:Int):Void\n\t{\n\t\tthis.samplerParameteri(sampler, pname, param);\n\t}\n\n\tpublic inline function scissor(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.scissor(x, y, width, height);\n\t}\n\n\tpublic inline function shaderSource(shader:GLShader, source:String):Void\n\t{\n\t\tthis.shaderSource(shader, source);\n\t}\n\n\tpublic inline function stencilFunc(func:Int, ref:Int, mask:Int):Void\n\t{\n\t\tthis.stencilFunc(func, ref, mask);\n\t}\n\n\tpublic inline function stencilFuncSeparate(face:Int, func:Int, ref:Int, mask:Int):Void\n\t{\n\t\tthis.stencilFuncSeparate(face, func, ref, mask);\n\t}\n\n\tpublic inline function stencilMask(mask:Int):Void\n\t{\n\t\tthis.stencilMask(mask);\n\t}\n\n\tpublic inline function stencilMaskSeparate(face:Int, mask:Int):Void\n\t{\n\t\tthis.stencilMaskSeparate(face, mask);\n\t}\n\n\tpublic inline function stencilOp(fail:Int, zfail:Int, zpass:Int):Void\n\t{\n\t\tthis.stencilOp(fail, zfail, zpass);\n\t}\n\n\tpublic inline function stencilOpSeparate(face:Int, fail:Int, zfail:Int, zpass:Int):Void\n\t{\n\t\tthis.stencilOpSeparate(face, fail, zfail, zpass);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int,\n\t\ttype:Int, srcData:ArrayBufferView,\n\t\t\tsrcOffset:Int = 0):Void\n\t#else\n\tpublic inline function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Dynamic, ?format:Int,\n\t\t?type:Int, ?srcData:Dynamic,\n\t\t\t?srcOffset:Int):Void\n\t#end\n\t{\n\t\t#if !lime_webgl\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.texImage2D(target, level, internalformat, width, height, border, format, type, __tempPointer);\n\t\t#end\n\t}\n\n\tpublic inline function texImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int,\n\t\tformat:Int, type:Int,\n\t\t\tsrcData:ArrayBufferView, srcOffset:Int = 0):Void\n\t{\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.texImage3D(target, level, internalformat, width, height, depth, border, format, type, __tempPointer);\n\t}\n\n\tpublic inline function texStorage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.texStorage2D(target, level, internalformat, width, height);\n\t}\n\n\tpublic inline function texStorage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void\n\t{\n\t\tthis.texStorage3D(target, level, internalformat, width, height, depth);\n\t}\n\n\tpublic inline function texParameterf(target:Int, pname:Int, param:Float):Void\n\t{\n\t\tthis.texParameterf(target, pname, param);\n\t}\n\n\tpublic inline function texParameteri(target:Int, pname:Int, param:Int):Void\n\t{\n\t\tthis.texParameteri(target, pname, param);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int,\n\t\ttype:Int, srcData:ArrayBufferView,\n\t\t\tsrcOffset:Int = 0):Void\n\t#else\n\tpublic inline function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Dynamic,\n\t\t?type:Int, ?srcData:Dynamic,\n\t\t\t?srcOffset:Int):Void\n\t#end\n\t{\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, __tempPointer);\n\t}\n\n\tpublic inline function texSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int,\n\t\tdepth:Int, format:Int, type:Int,\n\t\t\tsrcData:ArrayBufferView, srcOffset:Int = 0):Void\n\t{\n\t\t__tempPointer.set(srcData, srcOffset);\n\t\tthis.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, __tempPointer);\n\t}\n\n\tpublic inline function transformFeedbackVaryings(program:GLProgram, varyings:Array<String>, bufferMode:Int):Void\n\t{\n\t\tthis.transformFeedbackVaryings(program, varyings, bufferMode);\n\t}\n\n\tpublic inline function uniform1f(location:GLUniformLocation, v0:Float):Void\n\t{\n\t\tthis.uniform1f(location, v0);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform1fv(location:GLUniformLocation, v:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform1fv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform1fv(location, v != null ? v.length : 0, v);\n\t}\n\n\tpublic inline function uniform1i(location:GLUniformLocation, v0:Int):Void\n\t{\n\t\tthis.uniform1i(location, v0);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform1iv(location:GLUniformLocation, v:Int32Array, ?srcOffset:Int, ?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform1iv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform1iv(location, v != null ? v.length : 0, v);\n\t}\n\n\tpublic inline function uniform1ui(location:GLUniformLocation, v0:Int):Void\n\t{\n\t\tthis.uniform1ui(location, v0);\n\t}\n\n\tpublic inline function uniform1uiv(location:GLUniformLocation, v:UInt32Array, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tthis.uniform1uiv(location, v != null ? v.length : 0, v);\n\t}\n\n\tpublic inline function uniform2f(location:GLUniformLocation, v0:Float, v1:Float):Void\n\t{\n\t\tthis.uniform2f(location, v0, v1);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform2fv(location:GLUniformLocation, v:Float32Array, ?srcOffset:Int, ?srcLength:Int):Void\n\t#else\n\tpublic function uniform2fv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform2fv(location, v != null ? v.length >> 1 : 0, v);\n\t}\n\n\tpublic inline function uniform2i(location:GLUniformLocation, v0:Int, v1:Int):Void\n\t{\n\t\tthis.uniform2i(location, v0, v1);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform2iv(location:GLUniformLocation, v:Int32Array, ?srcOffset:Int, ?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform2iv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform2iv(location, v != null ? v.length >> 1 : 0, v);\n\t}\n\n\tpublic inline function uniform2ui(location:GLUniformLocation, v0:Int, v1:Int):Void\n\t{\n\t\tthis.uniform2ui(location, v0, v1);\n\t}\n\n\tpublic inline function uniform2uiv(location:GLUniformLocation, v:UInt32Array, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t{\n\t\tthis.uniform2uiv(location, v != null ? v.length >> 1 : 0, v);\n\t}\n\n\tpublic inline function uniform3f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float):Void\n\t{\n\t\tthis.uniform3f(location, v0, v1, v2);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform3fv(location:GLUniformLocation, v:Float32Array, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform3fv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform3fv(location, v != null ? Std.int(v.length / 3) : 0, v);\n\t}\n\n\tpublic inline function uniform3i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n\t{\n\t\tthis.uniform3i(location, v0, v1, v2);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform3iv(location:GLUniformLocation, v:Int32Array, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform3iv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform3iv(location, v != null ? Std.int(v.length / 3) : 0, v);\n\t}\n\n\tpublic inline function uniform3ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n\t{\n\t\tthis.uniform3ui(location, v0, v1, v2);\n\t}\n\n\tpublic inline function uniform3uiv(location:GLUniformLocation, v:UInt32Array, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t{\n\t\tthis.uniform3uiv(location, v != null ? Std.int(v.length / 3) : 0, v);\n\t}\n\n\tpublic inline function uniform4f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float,\n\t\tv3:Float):Void\n\t{\n\t\tthis.uniform4f(location, v0, v1, v2, v3);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform4fv(location:GLUniformLocation, v:Float32Array, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform4fv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform4fv(location, v != null ? v.length >> 2 : 0, v);\n\t}\n\n\tpublic inline function uniform4i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int,\n\t\tv3:Int):Void\n\t{\n\t\tthis.uniform4i(location, v0, v1, v2, v3);\n\t}\n\n\t#if !lime_webgl\n\tpublic inline function uniform4iv(location:GLUniformLocation, v:Int32Array, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#else\n\tpublic inline function uniform4iv(location:GLUniformLocation, v:Dynamic, ?srcOffset:Int,\n\t\t?srcLength:Int):Void\n\t#end\n\t{\n\t\tthis.uniform4iv(location, v != null ? v.length >> 2 : 0, v);\n\t}\n\n\tpublic inline function uniform4ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int,\n\t\tv3:Int):Void\n\t{\n\t\tthis.uniform4ui(location, v0, v1, v2, v3);\n\t}\n\n\tpublic inline function uniform4uiv(location:GLUniformLocation, v:UInt32Array,\n\t\t?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tthis.uniform4uiv(location, v != null ? v.length >> 2 : 0, v);\n\t}\n\n\tpublic inline function uniformBlockBinding(program:GLProgram, uniformBlockIndex:Int,\n\t\tuniformBlockBinding:Int):Void\n\t{\n\t\tthis.uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);\n\t}\n\n\t#if !lime_webgl\n\tpublic function uniformMatrix2fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t#else\n\tpublic inline function uniformMatrix2fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tvar count = 0;\n\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = v.length >> 2;\n\t\t__tempPointer.set(v, srcOffset);\n\t\tthis.uniformMatrix2fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic function uniformMatrix2x3fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t{\n\t\tvar count = 0;\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 6);\n\n\t\t__tempPointer.set(v, srcOffset);\n\n\t\tthis.uniformMatrix2x3fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic function uniformMatrix2x4fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t{\n\t\tvar count = 0;\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 8);\n\n\t\t__tempPointer.set(v, srcOffset);\n\n\t\tthis.uniformMatrix2x4fv(location, count, transpose, __tempPointer);\n\t}\n\n\t#if !lime_webgl\n\tpublic function uniformMatrix3fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t#else\n\tpublic inline function uniformMatrix3fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tvar count = 0;\n\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 9);\n\t\t__tempPointer.set(v, srcOffset);\n\t\tthis.uniformMatrix3fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic function uniformMatrix3x2fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t{\n\t\tvar count = 0;\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 6);\n\n\t\t__tempPointer.set(v, srcOffset);\n\n\t\tthis.uniformMatrix3x2fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic function uniformMatrix3x4fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t{\n\t\tvar count = 0;\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 12);\n\n\t\t__tempPointer.set(v, srcOffset);\n\n\t\tthis.uniformMatrix3x4fv(location, count, transpose, __tempPointer);\n\t}\n\n\t#if !lime_webgl\n\tpublic function uniformMatrix4fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t#else\n\tpublic inline function uniformMatrix4fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t#end\n\t{\n\t\tvar count = 0;\n\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = v.length >> 4;\n\t\t__tempPointer.set(v, srcOffset);\n\t\tthis.uniformMatrix4fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic function uniformMatrix4x2fv(location:GLUniformLocation,\n\t\ttranspose:Bool, v:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t{\n\t\tvar count = 0;\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 8);\n\n\t\t__tempPointer.set(v, srcOffset);\n\n\t\tthis.uniformMatrix4x2fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic function uniformMatrix4x3fv(location:GLUniformLocation, transpose:Bool,\n\t\tv:Float32Array, srcOffset:Int = 0, ?srcLength:Int):Void\n\t{\n\t\tvar count = 0;\n\t\tif (srcLength != null) count = srcLength;\n\t\telse if (v != null) count = Std.int(v.length / 12);\n\n\t\t__tempPointer.set(v, srcOffset);\n\n\t\tthis.uniformMatrix4x3fv(location, count, transpose, __tempPointer);\n\t}\n\n\tpublic inline function useProgram(program:GLProgram):Void\n\t{\n\t\tthis.useProgram(program);\n\t}\n\n\tpublic inline function validateProgram(program:GLProgram):Void\n\t{\n\t\tthis.validateProgram(program);\n\t}\n\n\tpublic inline function vertexAttrib1f(indx:Int, x:Float):Void\n\t{\n\t\tthis.vertexAttrib1f(indx, x);\n\t}\n\n\tpublic inline function vertexAttrib1fv(indx:Int,\n\t\tvalues:#if (!lime_webgl && !doc_gen) DataPointer #else Float32Array #end):Void\n\t{\n\t\tthis.vertexAttrib1fv(indx, values);\n\t}\n\n\tpublic inline function vertexAttrib2f(indx:Int, x:Float, y:Float):Void\n\t{\n\t\tthis.vertexAttrib2f(indx, x, y);\n\t}\n\n\tpublic inline function vertexAttrib2fv(indx:Int,\n\t\tvalues:#if (!lime_webgl && !doc_gen) DataPointer #else Float32Array #end):Void\n\t{\n\t\tthis.vertexAttrib2fv(indx, values);\n\t}\n\n\tpublic inline function vertexAttrib3f(indx:Int, x:Float, y:Float, z:Float):Void\n\t{\n\t\tthis.vertexAttrib3f(indx, x, y, z);\n\t}\n\n\tpublic inline function vertexAttrib3fv(indx:Int,\n\t\tvalues:#if (!lime_webgl && !doc_gen) DataPointer #else Float32Array #end):Void\n\t{\n\t\tthis.vertexAttrib3fv(indx, values);\n\t}\n\n\tpublic inline function vertexAttrib4f(indx:Int, x:Float, y:Float, z:Float,\n\t\tw:Float):Void\n\t{\n\t\tthis.vertexAttrib4f(indx, x, y, z, w);\n\t}\n\n\tpublic inline function vertexAttrib4fv(indx:Int,\n\t\tvalues:#if (!lime_webgl && !doc_gen) DataPointer #else Float32Array #end):Void\n\t{\n\t\tthis.vertexAttrib4fv(indx, values);\n\t}\n\n\tpublic inline function vertexAttribDivisor(index:Int, divisor:Int):Void\n\t{\n\t\tthis.vertexAttribDivisor(index, divisor);\n\t}\n\n\tpublic inline function vertexAttribI4i(indx:Int, x:Int, y:Int, z:Int,\n\t\tw:Int):Void\n\t{\n\t\tthis.vertexAttribI4i(indx, x, y, z, w);\n\t}\n\n\tpublic inline function vertexAttribI4iv(indx:Int,\n\t\tvalues:#if (!lime_webgl && !doc_gen) DataPointer #else Float32Array #end):Void\n\t{\n\t\tthis.vertexAttribI4iv(indx, values);\n\t}\n\n\tpublic inline function vertexAttribI4ui(indx:Int, x:Int, y:Int, z:Int,\n\t\tw:Int):Void\n\t{\n\t\tthis.vertexAttribI4ui(indx, x, y, z, w);\n\t}\n\n\tpublic inline function vertexAttribI4uiv(indx:Int,\n\t\tvalues:#if (!lime_webgl && !doc_gen) DataPointer #else Float32Array #end):Void\n\t{\n\t\tthis.vertexAttribI4uiv(indx, values);\n\t}\n\n\tpublic inline function vertexAttribIPointer(index:Int, size:Int, type:Int,\n\t\tstride:Int, offset:DataPointer):Void\n\t{\n\t\tthis.vertexAttribIPointer(index, size, type, stride, offset);\n\t}\n\n\tpublic inline function vertexAttribPointer(indx:Int, size:Int, type:Int,\n\t\tnormalized:Bool, stride:Int, offset:DataPointer):Void\n\t{\n\t\tthis.vertexAttribPointer(indx, size, type, normalized, stride, offset);\n\t}\n\n\tpublic inline function viewport(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tthis.viewport(x, y, width, height);\n\t}\n\n\tpublic inline function waitSync(sync:GLSync, flags:Int, timeout:Int64):Void\n\t{\n\t\tthis.waitSync(sync, flags, timeout);\n\t}\n\n\t@:from private static function fromRenderContext(context:RenderContext):WebGL2RenderContext\n\t{\n\t\treturn context.webgl2;\n\t}\n\n\t#if (!doc_gen && (lime_opengl || lime_opengles))\n\t@:from private static function fromOpenGLES3RenderContext(gl:OpenGLES3RenderContext):WebGL2RenderContext\n\t{\n\t\treturn cast gl;\n\t}\n\t#end\n\n\t@:from private static function fromGL(gl:Class<GL>):WebGL2RenderContext\n\t{\n\t\treturn cast GL.context;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/WebGLRenderContext.hx",
    "content": "package lime.graphics;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\nimport lime.graphics.opengl.*;\nimport lime.utils.ArrayBufferView;\nimport lime.utils.Float32Array;\n\n/**\n\tThe `WebGLRenderContext` allows access to WebGL features when OpenGL, OpenGL ES or\n\tWebGL is the render context type of the `Window`.\n\n\tUsing a WebGL context on a desktop or mobile platform enables support for cross-platform\n\tcode that should run all platforms (when hardware acceleration is supported).\n\n\tYou can convert from `lime.graphics.RenderContext`, `lime.graphics.OpenGLRenderContext`,\n\t`lime.graphics.OpenGLES3RenderContext`, `lime.graphics.OpenGLES2RenderContext`,\n\t`lime.graphics.WebGL2RenderContext` or `lime.graphics.opengl.GL` directly if desired:\n\n\t```haxe\n\tvar webgl:WebGLRenderContext = window.context;\n\tvar webgl:WebGLRenderContext = gl;\n\tvar webgl:WebGLRenderContext = gles3;\n\tvar webgl:WebGLRenderContext = gles2;\n\tvar webgl:WebGLRenderContext = webgl2;\n\tvar webgl:WebGLRenderContext = GL;\n\t```\n**/\n@:forward(DEPTH_BUFFER_BIT, STENCIL_BUFFER_BIT, COLOR_BUFFER_BIT, POINTS, LINES, LINE_LOOP, LINE_STRIP, TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN, ZERO, ONE,\n\tSRC_COLOR, ONE_MINUS_SRC_COLOR, SRC_ALPHA, ONE_MINUS_SRC_ALPHA, DST_ALPHA, ONE_MINUS_DST_ALPHA, DST_COLOR, ONE_MINUS_DST_COLOR, SRC_ALPHA_SATURATE,\n\tFUNC_ADD, BLEND_EQUATION, BLEND_EQUATION_RGB, BLEND_EQUATION_ALPHA, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, BLEND_DST_RGB, BLEND_SRC_RGB, BLEND_DST_ALPHA,\n\tBLEND_SRC_ALPHA, CONSTANT_COLOR, ONE_MINUS_CONSTANT_COLOR, CONSTANT_ALPHA, ONE_MINUS_CONSTANT_ALPHA, BLEND_COLOR, ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,\n\tARRAY_BUFFER_BINDING, ELEMENT_ARRAY_BUFFER_BINDING, STREAM_DRAW, STATIC_DRAW, DYNAMIC_DRAW, BUFFER_SIZE, BUFFER_USAGE, CURRENT_VERTEX_ATTRIB, FRONT, BACK,\n\tFRONT_AND_BACK, CULL_FACE, BLEND, DITHER, STENCIL_TEST, DEPTH_TEST, SCISSOR_TEST, POLYGON_OFFSET_FILL, SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_COVERAGE,\n\tNO_ERROR, INVALID_ENUM, INVALID_VALUE, INVALID_OPERATION, OUT_OF_MEMORY, CW, CCW, LINE_WIDTH, ALIASED_POINT_SIZE_RANGE, ALIASED_LINE_WIDTH_RANGE,\n\tCULL_FACE_MODE, FRONT_FACE, DEPTH_RANGE, DEPTH_WRITEMASK, DEPTH_CLEAR_VALUE, DEPTH_FUNC, STENCIL_CLEAR_VALUE, STENCIL_FUNC, STENCIL_FAIL,\n\tSTENCIL_PASS_DEPTH_FAIL, STENCIL_PASS_DEPTH_PASS, STENCIL_REF, STENCIL_VALUE_MASK, STENCIL_WRITEMASK, STENCIL_BACK_FUNC, STENCIL_BACK_FAIL,\n\tSTENCIL_BACK_PASS_DEPTH_FAIL, STENCIL_BACK_PASS_DEPTH_PASS, STENCIL_BACK_REF, STENCIL_BACK_VALUE_MASK, STENCIL_BACK_WRITEMASK, VIEWPORT, SCISSOR_BOX,\n\tCOLOR_CLEAR_VALUE, COLOR_WRITEMASK, UNPACK_ALIGNMENT, PACK_ALIGNMENT, MAX_TEXTURE_SIZE, MAX_VIEWPORT_DIMS, SUBPIXEL_BITS, RED_BITS, GREEN_BITS, BLUE_BITS,\n\tALPHA_BITS, DEPTH_BITS, STENCIL_BITS, POLYGON_OFFSET_UNITS, POLYGON_OFFSET_FACTOR, TEXTURE_BINDING_2D, SAMPLE_BUFFERS, SAMPLES, SAMPLE_COVERAGE_VALUE,\n\tSAMPLE_COVERAGE_INVERT, COMPRESSED_TEXTURE_FORMATS, DONT_CARE, FASTEST, NICEST, GENERATE_MIPMAP_HINT, BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT,\n\tUNSIGNED_INT, FLOAT, DEPTH_COMPONENT, ALPHA, RGB, RGBA, LUMINANCE, LUMINANCE_ALPHA, UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_5_5_5_1, UNSIGNED_SHORT_5_6_5,\n\tFRAGMENT_SHADER, VERTEX_SHADER, MAX_VERTEX_ATTRIBS, MAX_VERTEX_UNIFORM_VECTORS, MAX_VARYING_VECTORS, MAX_COMBINED_TEXTURE_IMAGE_UNITS,\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS, MAX_TEXTURE_IMAGE_UNITS, MAX_FRAGMENT_UNIFORM_VECTORS, SHADER_TYPE, DELETE_STATUS, LINK_STATUS, VALIDATE_STATUS,\n\tATTACHED_SHADERS, ACTIVE_UNIFORMS, ACTIVE_ATTRIBUTES, SHADING_LANGUAGE_VERSION, CURRENT_PROGRAM, NEVER, LESS, EQUAL, LEQUAL, GREATER, NOTEQUAL, GEQUAL,\n\tALWAYS, KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, DECR_WRAP, VENDOR, RENDERER, VERSION, NEAREST, LINEAR, NEAREST_MIPMAP_NEAREST,\n\tLINEAR_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_LINEAR, TEXTURE_MAG_FILTER, TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, TEXTURE_WRAP_T, TEXTURE_2D,\n\tTEXTURE, TEXTURE_CUBE_MAP, TEXTURE_BINDING_CUBE_MAP, TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,\n\tTEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z, MAX_CUBE_MAP_TEXTURE_SIZE, TEXTURE0, TEXTURE1, TEXTURE2, TEXTURE3,\n\tTEXTURE4, TEXTURE5, TEXTURE6, TEXTURE7, TEXTURE8, TEXTURE9, TEXTURE10, TEXTURE11, TEXTURE12, TEXTURE13, TEXTURE14, TEXTURE15, TEXTURE16, TEXTURE17,\n\tTEXTURE18, TEXTURE19, TEXTURE20, TEXTURE21, TEXTURE22, TEXTURE23, TEXTURE24, TEXTURE25, TEXTURE26, TEXTURE27, TEXTURE28, TEXTURE29, TEXTURE30, TEXTURE31,\n\tACTIVE_TEXTURE, REPEAT, CLAMP_TO_EDGE, MIRRORED_REPEAT, FLOAT_VEC2, FLOAT_VEC3, FLOAT_VEC4, INT_VEC2, INT_VEC3, INT_VEC4, BOOL, BOOL_VEC2, BOOL_VEC3,\n\tBOOL_VEC4, FLOAT_MAT2, FLOAT_MAT3, FLOAT_MAT4, SAMPLER_2D, SAMPLER_CUBE, VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_SIZE,\n\tVERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE, VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_POINTER, VERTEX_ATTRIB_ARRAY_BUFFER_BINDING,\n\tCOMPILE_STATUS, LOW_FLOAT, MEDIUM_FLOAT, HIGH_FLOAT, LOW_INT, MEDIUM_INT, HIGH_INT, FRAMEBUFFER, RENDERBUFFER, RGBA4, RGB5_A1, RGB565, DEPTH_COMPONENT16,\n\tSTENCIL_INDEX, STENCIL_INDEX8, DEPTH_STENCIL, RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT, RENDERBUFFER_INTERNAL_FORMAT, RENDERBUFFER_RED_SIZE,\n\tRENDERBUFFER_GREEN_SIZE, RENDERBUFFER_BLUE_SIZE, RENDERBUFFER_ALPHA_SIZE, RENDERBUFFER_DEPTH_SIZE, RENDERBUFFER_STENCIL_SIZE,\n\tFRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL,\n\tFRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT, DEPTH_STENCIL_ATTACHMENT, NONE,\n\tFRAMEBUFFER_COMPLETE, FRAMEBUFFER_INCOMPLETE_ATTACHMENT, FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, FRAMEBUFFER_INCOMPLETE_DIMENSIONS,\n\tFRAMEBUFFER_UNSUPPORTED, FRAMEBUFFER_BINDING, RENDERBUFFER_BINDING, MAX_RENDERBUFFER_SIZE, INVALID_FRAMEBUFFER_OPERATION, UNPACK_FLIP_Y_WEBGL,\n\tUNPACK_PREMULTIPLY_ALPHA_WEBGL, CONTEXT_LOST_WEBGL, UNPACK_COLORSPACE_CONVERSION_WEBGL, BROWSER_DEFAULT_WEBGL, type, version, activeTexture, attachShader,\n\tbindAttribLocation, bindBuffer, bindFramebuffer, bindRenderbuffer, bindTexture, blendColor, blendEquation, blendEquationSeparate, blendFunc,\n\tblendFuncSeparate, checkFramebufferStatus, clear, clearColor, clearDepth, clearStencil, colorMask, compileShader, copyTexImage2D, copyTexSubImage2D,\n\tcreateBuffer, createFramebuffer, createProgram, createRenderbuffer, createShader, createTexture, cullFace, cullFace, deleteBuffer, deleteFramebuffer,\n\tdeleteProgram, deleteRenderbuffer, deleteShader, deleteTexture, depthFunc, depthMask, depthRange, detachShader, disable, disableVertexAttribArray,\n\tdrawArrays, drawElements, enable, enableVertexAttribArray, finish, flush, framebufferRenderbuffer, framebufferTexture2D, frontFace, generateMipmap,\n\tgetActiveAttrib, getActiveUniform, getAttachedShaders, getAttribLocation, getBufferParameter, getContextAttributes, getError, getExtension,\n\tgetFramebufferAttachmentParameter, getParameter, getProgramInfoLog, getProgramParameter, getRenderbufferParameter, getShaderInfoLog, getShaderParameter,\n\tgetShaderPrecisionFormat, getShaderSource, getSupportedExtensions, getTexParameter, getUniform, getUniformLocation, getVertexAttrib,\n\tgetVertexAttribOffset, hint, isBuffer, isContextLost, isEnabled, isFramebuffer, isProgram, isRenderbuffer, isShader, isTexture, lineWidth, linkProgram,\n\tpixelStorei, polygonOffset, renderbufferStorage, sampleCoverage, scissor, shaderSource, stencilFunc, stencilFuncSeparate, stencilMask,\n\tstencilMaskSeparate, stencilOp, stencilOpSeparate, texParameterf, texParameteri, uniform1f, uniform1fv, uniform1i, uniform1iv, uniform2f, uniform2fv,\n\tuniform2i, uniform2iv, uniform3f, uniform3fv, uniform3i, uniform3iv, uniform4f, uniform4fv, uniform4i, uniform4iv, useProgram, validateProgram,\n\tvertexAttrib1f, vertexAttrib1fv, vertexAttrib2f, vertexAttrib2fv, vertexAttrib3f, vertexAttrib3fv, vertexAttrib4f, vertexAttrib4fv, vertexAttribPointer,\n\tviewport)\n@:transitive\nabstract WebGLRenderContext(WebGL2RenderContext)\n{\n\tpublic function bufferData(target:Int, srcData:#if (!js || !html5 || display) ArrayBufferView #else Dynamic #end, usage:Int):Void\n\t{\n\t\tthis.bufferData(target, srcData, usage);\n\t}\n\n\tpublic inline function bufferSubData(target:Int, offset:Int, srcData:#if (!js || !html5 || display) ArrayBufferView #else Dynamic #end):Void\n\t{\n\t\tthis.bufferSubData(target, offset, srcData);\n\t}\n\n\tpublic function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int,\n\t\t\tsrcData:#if (!js || !html5 || display) ArrayBufferView #else Dynamic #end):Void\n\t{\n\t\tthis.compressedTexImage2D(target, level, internalformat, width, height, border, srcData);\n\t}\n\n\tpublic inline function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int,\n\t\t\tsrcData:#if (!js || !html5 || display) ArrayBufferView #else Dynamic #end):Void\n\t{\n\t\tthis.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, srcData);\n\t}\n\n\tpublic inline function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int,\n\t\t\tpixels:#if (!js || !html5 || display) ArrayBufferView #else Dynamic #end):Void\n\t{\n\t\tthis.readPixels(x, y, width, height, format, type, pixels);\n\t}\n\n\t#if (!js || !html5 || lime_doc_gen)\n\tpublic inline function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\t\tsrcData:ArrayBufferView):Void\n\t{\n\t\tthis.texImage2D(target, level, internalformat, width, height, border, format, type, srcData);\n\t}\n\t#else\n\t// public function texImage2D (target:Int, level:Int, internalformat:Int, format:Int, type:Int, pixels:Dynamic /*ImageBitmap*/):Void {\n\t// public function texImage2D (target:Int, level:Int, internalformat:Int, format:Int, type:Int, pixels:#if (js && html5) CanvasElement #else Dynamic #end):Void {\n\t// public function texImage2D (target:Int, level:Int, internalformat:Int, format:Int, type:Int, pixels:#if (js && html5) ImageData #else Dynamic #end):Void {\n\t// public function texImage2D (target:Int, level:Int, internalformat:Int, format:Int, type:Int, pixels:#if (js && html5) ImageElement #else Dynamic #end):Void {\n\t// public function texImage2D (target:Int, level:Int, internalformat:Int, format:Int, type:Int, pixels:#if (js && html5) VideoElement #else Dynamic #end):Void {\n\t// public function texImage2D (target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int, srcData:ArrayBufferView):Void {\n\tpublic function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Dynamic, ?format:Int, ?type:Int, ?srcData:Dynamic):Void\n\t{\n\t\tthis.texImage2D(target, level, internalformat, width, height, border, format, type, srcData);\n\t}\n\t#end\n\n\t#if (!js || !html5 || lime_doc_gen)\n\tpublic inline function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int,\n\t\t\tsrcData:ArrayBufferView, srcOffset:Int = 0):Void\n\t{\n\t\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, srcData, srcOffset);\n\t}\n\t#else\n\t// public function texSubImage2D (target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, pixels:#if (js && html5) CanvasElement #else Dynamic #end):Void {\n\t// public function texSubImage2D (target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, pixels:Dynamic /*ImageBitmap*/):Void {\n\t// public function texSubImage2D (target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, pixels:#if (js && html5) ImageData #else Dynamic #end):Void {\n\t// public function texSubImage2D (target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, pixels:#if (js && html5) ImageElement #else Dynamic #end):Void {\n\t// public function texSubImage2D (target:Int, level:Int, xoffset:Int, yoffset:Int, format:Int, type:Int, pixels:#if (js && html5) VideoElement #else Dynamic #end):Void {\n\t// public function texSubImage2D (target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, srcData:ArrayBufferView):Void {\n\tpublic function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Dynamic, ?type:Int, ?srcData:Dynamic):Void\n\t{\n\t\tthis.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, srcData);\n\t}\n\t#end\n\n\tpublic function uniformMatrix2fv(location:GLUniformLocation, transpose:Bool, v:Float32Array):Void\n\t{\n\t\tthis.uniformMatrix2fv(location, transpose, v);\n\t}\n\n\tpublic function uniformMatrix3fv(location:GLUniformLocation, transpose:Bool, v:Float32Array):Void\n\t{\n\t\tthis.uniformMatrix3fv(location, transpose, v);\n\t}\n\n\tpublic function uniformMatrix4fv(location:GLUniformLocation, transpose:Bool, v:Float32Array):Void\n\t{\n\t\tthis.uniformMatrix4fv(location, transpose, v);\n\t}\n\n\t@:from private static function fromWebGL2RenderContext(gl:WebGL2RenderContext):WebGLRenderContext\n\t{\n\t\treturn cast gl;\n\t}\n\n\t@:from private static function fromRenderContext(context:RenderContext):WebGLRenderContext\n\t{\n\t\treturn context.webgl;\n\t}\n\n\t@:from private static function fromGL(gl:Class<GL>):WebGLRenderContext\n\t{\n\t\treturn cast GL.context;\n\t}\n\n\t#if (!doc_gen && lime_opengl)\n\t@:from private static function fromOpenGLContext(gl:OpenGLRenderContext):WebGLRenderContext\n\t{\n\t\t#if (sys && lime_cffi && lime_opengl)\n\t\treturn cast gl;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\t#end\n\n\t#if (!doc_gen && (lime_opengl || lime_opengles))\n\t@:from private static function fromOpenGLES2Context(gl:OpenGLES2RenderContext):WebGLRenderContext\n\t{\n\t\t#if (sys && lime_cffi && lime_opengl)\n\t\treturn cast gl;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\t#end\n\n\t#if (!doc_gen && (lime_opengl || lime_opengles))\n\t@:from private static function fromOpenGLES3Context(gl:OpenGLES3RenderContext):WebGLRenderContext\n\t{\n\t\t#if (sys && lime_cffi && lime_opengl)\n\t\treturn cast gl;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\t#end\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/Cairo.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.math.Matrix3;\nimport lime.math.Vector2;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\nimport lime.text.Glyph;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass Cairo\n{\n\tpublic static var version(get, null):Int;\n\tpublic static var versionString(get, null):String;\n\n\tpublic var antialias(get, set):CairoAntialias;\n\tpublic var currentPoint(get, never):Vector2;\n\tpublic var dash(get, set):Array<Float>;\n\tpublic var dashCount(get, never):Int;\n\tpublic var fillRule(get, set):CairoFillRule;\n\tpublic var fontFace(get, set):CairoFontFace;\n\tpublic var fontOptions(get, set):CairoFontOptions;\n\tpublic var groupTarget(get, never):CairoSurface;\n\tpublic var hasCurrentPoint(get, never):Bool;\n\tpublic var lineCap(get, set):CairoLineCap;\n\tpublic var lineJoin(get, set):CairoLineJoin;\n\tpublic var lineWidth(get, set):Float;\n\tpublic var matrix(get, set):Matrix3;\n\tpublic var miterLimit(get, set):Float;\n\t#if (haxe_ver < \"4.0.0\")\n\tpublic var operator(get, set):CairoOperator;\n\t#end\n\tpublic var source(get, set):CairoPattern;\n\tpublic var target(get, null):CairoSurface;\n\tpublic var tolerance(get, set):Float;\n\tpublic var userData:Dynamic;\n\n\t@:noCompletion private var handle:CFFIPointer;\n\n\tpublic function new(surface:CairoSurface = null):Void\n\t{\n\t\tif (surface != null)\n\t\t{\n\t\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t\thandle = NativeCFFI.lime_cairo_create(surface);\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function arc(xc:Float, yc:Float, radius:Float, angle1:Float, angle2:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_arc(handle, xc, yc, radius, angle1, angle2);\n\t\t#end\n\t}\n\n\tpublic function arcNegative(xc:Float, yc:Float, radius:Float, angle1:Float, angle2:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_arc_negative(handle, xc, yc, radius, angle1, angle2);\n\t\t#end\n\t}\n\n\tpublic function clip():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_clip(handle);\n\t\t#end\n\t}\n\n\tpublic function clipExtents(x1:Float, y1:Float, x2:Float, y2:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_clip_extents(handle, x1, y1, x2, y2);\n\t\t#end\n\t}\n\n\tpublic function clipPreserve():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_clip_preserve(handle);\n\t\t#end\n\t}\n\n\tpublic function closePath():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_close_path(handle);\n\t\t#end\n\t}\n\n\tpublic function copyPage():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_copy_page(handle);\n\t\t#end\n\t}\n\n\tpublic function curveTo(x1:Float, y1:Float, x2:Float, y2:Float, x3:Float, y3:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_curve_to(handle, x1, y1, x2, y2, x3, y3);\n\t\t#end\n\t}\n\n\tpublic function fill():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_fill(handle);\n\t\t#end\n\t}\n\n\tpublic function fillExtents(x1:Float, y1:Float, x2:Float, y2:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_fill_extents(handle, x1, y1, x2, y2);\n\t\t#end\n\t}\n\n\tpublic function fillPreserve():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_fill_preserve(handle);\n\t\t#end\n\t}\n\n\tpublic function getOperator():CairoOperator\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_operator(handle);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\tpublic function identityMatrix():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_identity_matrix(handle);\n\t\t#end\n\t}\n\n\tpublic function inClip(x:Float, y:Float):Bool\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_in_clip(handle, x, y);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function inFill(x:Float, y:Float):Bool\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_in_fill(handle, x, y);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function inStroke(x:Float, y:Float):Bool\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_in_stroke(handle, x, y);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function lineTo(x:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_line_to(handle, x, y);\n\t\t#end\n\t}\n\n\tpublic function mask(pattern:CairoPattern):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_mask(handle, pattern);\n\t\t#end\n\t}\n\n\tpublic function maskSurface(surface:CairoSurface, x:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_mask_surface(handle, surface, x, y);\n\t\t#end\n\t}\n\n\tpublic function moveTo(x:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_move_to(handle, x, y);\n\t\t#end\n\t}\n\n\tpublic function newPath():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_new_path(handle);\n\t\t#end\n\t}\n\n\tpublic function paint():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_paint(handle);\n\t\t#end\n\t}\n\n\tpublic function paintWithAlpha(alpha:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_paint_with_alpha(handle, alpha);\n\t\t#end\n\t}\n\n\tpublic function popGroup():CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pop_group(handle);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function popGroupToSource():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_pop_group_to_source(handle);\n\t\t#end\n\t}\n\n\tpublic function pushGroup():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_push_group(handle);\n\t\t#end\n\t}\n\n\tpublic function pushGroupWithContent(content:CairoContent):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_push_group_with_content(handle, content);\n\t\t#end\n\t}\n\n\t@:noCompletion private function recreate(surface:CairoSurface):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\thandle = NativeCFFI.lime_cairo_create(surface);\n\t\t#end\n\t}\n\n\tpublic function rectangle(x:Float, y:Float, width:Float, height:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_rectangle(handle, x, y, width, height);\n\t\t#end\n\t}\n\n\tpublic function relCurveTo(dx1:Float, dy1:Float, dx2:Float, dy2:Float, dx3:Float, dy3:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_rel_curve_to(handle, dx1, dy1, dx2, dy2, dx3, dy3);\n\t\t#end\n\t}\n\n\tpublic function relLineTo(dx:Float, dy:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_rel_line_to(handle, dx, dy);\n\t\t#end\n\t}\n\n\tpublic function relMoveTo(dx:Float, dy:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_rel_move_to(handle, dx, dy);\n\t\t#end\n\t}\n\n\tpublic function resetClip():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_reset_clip(handle);\n\t\t#end\n\t}\n\n\tpublic function restore():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_restore(handle);\n\t\t#end\n\t}\n\n\tpublic function rotate(amount:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_rotate(handle, amount);\n\t\t#end\n\t}\n\n\tpublic function save():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_save(handle);\n\t\t#end\n\t}\n\n\tpublic function scale(x:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_scale(handle, x, y);\n\t\t#end\n\t}\n\n\tpublic function setFontSize(size:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_font_size(handle, size);\n\t\t#end\n\t}\n\n\tpublic function setOperator(value:CairoOperator):CairoOperator\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_operator(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\tpublic function setSourceRGB(r:Float, g:Float, b:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_source_rgb(handle, r, g, b);\n\t\t#end\n\t}\n\n\tpublic function setSourceRGBA(r:Float, g:Float, b:Float, a:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_source_rgba(handle, r, g, b, a);\n\t\t#end\n\t}\n\n\tpublic function setSourceSurface(surface:CairoSurface, x:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_source_surface(handle, surface, x, y);\n\t\t#end\n\t}\n\n\tpublic function showGlyphs(glyphs:Array<CairoGlyph>):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\tvar _glyphs = new hl.NativeArray<CairoGlyph>(glyphs.length);\n\t\tfor (i in 0...glyphs.length)\n\t\t\t_glyphs[i] = glyphs[i];\n\t\tvar glyphs = _glyphs;\n\t\t#end\n\t\tNativeCFFI.lime_cairo_show_glyphs(handle, glyphs);\n\t\t#end\n\t}\n\n\tpublic function showPage():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_show_page(handle);\n\t\t#end\n\t}\n\n\tpublic function showText(utf8:String):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_show_text(handle, utf8);\n\t\t#end\n\t}\n\n\tpublic function status():CairoStatus\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_status(handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function stroke():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_stroke(handle);\n\t\t#end\n\t}\n\n\tpublic function strokeExtents(x1:Float, y1:Float, x2:Float, y2:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_stroke_extents(handle, x1, y1, x2, y2);\n\t\t#end\n\t}\n\n\tpublic function strokePreserve():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_stroke_preserve(handle);\n\t\t#end\n\t}\n\n\tpublic function textPath(utf8:String):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_text_path(handle, utf8);\n\t\t#end\n\t}\n\n\tpublic function transform(matrix:Matrix3):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_transform(handle, matrix.toCairoMatrix3());\n\t\t#end\n\t}\n\n\tpublic function translate(x:Float, y:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_translate(handle, x, y);\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_antialias():CairoAntialias\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_antialias(handle);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_antialias(value:CairoAntialias):CairoAntialias\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_antialias(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_currentPoint():Vector2\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\treturn NativeCFFI.lime_cairo_get_current_point(handle, new Vector2());\n\t\t#else\n\t\tvar vec:Dynamic = NativeCFFI.lime_cairo_get_current_point(handle);\n\t\treturn new Vector2(vec.x, vec.y);\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t@:noCompletion private function get_dash():Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\tvar result:hl.NativeArray<Float> = NativeCFFI.lime_cairo_get_dash(handle);\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\tvar result:Dynamic = NativeCFFI.lime_cairo_get_dash(handle);\n\t\treturn result;\n\t\t#end\n\t\t#end\n\n\t\treturn [];\n\t}\n\n\t@:noCompletion private function set_dash(value:Array<Float>):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\tvar _value = new hl.NativeArray<Float>(value.length);\n\t\tfor (i in 0...value.length)\n\t\t\t_value[i] = value[i];\n\t\tNativeCFFI.lime_cairo_set_dash(handle, _value);\n\t\t#else\n\t\tNativeCFFI.lime_cairo_set_dash(handle, value);\n\t\t#end\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_dashCount():Int\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_dash_count(handle);\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion private function get_fillRule():CairoFillRule\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_fill_rule(handle);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_fillRule(value:CairoFillRule):CairoFillRule\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_fill_rule(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_fontFace():CairoFontFace\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_font_face(handle);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_fontFace(value:CairoFontFace):CairoFontFace\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_font_face(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_fontOptions():CairoFontOptions\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_font_options(handle);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_fontOptions(value:CairoFontOptions):CairoFontOptions\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_font_options(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_groupTarget():CairoSurface\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_group_target(handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_hasCurrentPoint():Bool\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_has_current_point(handle);\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t@:noCompletion private function get_lineCap():CairoLineCap\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_line_cap(handle);\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion private function set_lineCap(value:CairoLineCap):CairoLineCap\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_line_cap(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_lineJoin():CairoLineJoin\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_line_join(handle);\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion private function set_lineJoin(value:CairoLineJoin):CairoLineJoin\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_line_join(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_lineWidth():Float\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_line_width(handle);\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion private function set_lineWidth(value:Float):Float\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_line_width(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_matrix():Matrix3\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\treturn NativeCFFI.lime_cairo_get_matrix(handle, new CairoMatrix3());\n\t\t#else\n\t\tvar m:Dynamic = NativeCFFI.lime_cairo_get_matrix(handle);\n\t\treturn new Matrix3(m.a, m.b, m.c, m.d, m.tx, m.ty);\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t@:noCompletion private function set_matrix(value:Matrix3):Matrix3\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\tNativeCFFI.lime_cairo_set_matrix(handle, value.toCairoMatrix3());\n\t\t#else\n\t\tNativeCFFI.lime_cairo_set_matrix(handle, value.a, value.b, value.c, value.d, value.tx, value.ty);\n\t\t// NativeCFFI.lime_cairo_set_matrix (handle, value);\n\t\t#end\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_miterLimit():Float\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_miter_limit(handle);\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion private function set_miterLimit(value:Float):Float\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_miter_limit(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t#if (haxe_ver < \"4.0.0\")\n\t@:noCompletion private function get_operator():CairoOperator\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_operator(handle);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_operator(value:CairoOperator):CairoOperator\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_operator(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\t#end\n\n\t@:noCompletion private function get_source():CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_source(handle);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_source(value:CairoPattern):CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_source(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_target():CairoSurface\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_target(handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_tolerance():Float\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_get_tolerance(handle);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_tolerance(value:Float):Float\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_set_tolerance(handle, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\tprivate static function get_version():Int\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_version();\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tprivate static function get_versionString():String\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn CFFI.stringValue(NativeCFFI.lime_cairo_version_string());\n\t\t#else\n\t\treturn \"\";\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoAntialias.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoAntialias(Int) from Int to Int from UInt to UInt\n{\n\tpublic var DEFAULT = 0;\n\tpublic var NONE = 1;\n\tpublic var GRAY = 2;\n\tpublic var SUBPIXEL = 3;\n\tpublic var FAST = 4;\n\tpublic var GOOD = 5;\n\tpublic var BEST = 6;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoContent.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoContent(Int) from Int to Int from UInt to UInt\n{\n\tpublic var COLOR = 0x1000;\n\tpublic var ALPHA = 0x2000;\n\tpublic var COLOR_ALPHA = 0x3000;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoExtend.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoExtend(Int) from Int to Int from UInt to UInt\n{\n\tpublic var NONE = 0;\n\tpublic var REPEAT = 1;\n\tpublic var REFLECT = 2;\n\tpublic var PAD = 3;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoFTFontFace.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\nimport lime.text.Font;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract CairoFTFontFace(CairoFontFace) from CairoFontFace to CairoFontFace from CFFIPointer to CFFIPointer\n{\n\tpublic static inline var FT_LOAD_FORCE_AUTOHINT = (1 << 5);\n\n\t@:noCompletion private function new()\n\t{\n\t\tthis = cast 0;\n\t}\n\n\tpublic static function create(face:Font, loadFlags:Int):CairoFTFontFace\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_ft_font_face_create(face.src, loadFlags);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoFillRule.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoFillRule(Int) from Int to Int from UInt to UInt\n{\n\tpublic var WINDING = 0;\n\tpublic var EVEN_ODD = 1;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoFilter.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoFilter(Int) from Int to Int from UInt to UInt\n{\n\tpublic var FAST = 0;\n\tpublic var GOOD = 1;\n\tpublic var BEST = 2;\n\tpublic var NEAREST = 3;\n\tpublic var BILINEAR = 4;\n\tpublic var GAUSSIAN = 5;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoFontFace.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract CairoFontFace(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private function new()\n\t{\n\t\tthis = null;\n\t}\n\n\tpublic function status():CairoStatus\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_font_face_status(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoFontOptions.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || native)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\nimport lime.text.Font;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract CairoFontOptions(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic var antialias(get, set):CairoAntialias;\n\tpublic var hintMetrics(get, set):CairoHintMetrics;\n\tpublic var hintStyle(get, set):CairoHintStyle;\n\tpublic var subpixelOrder(get, set):CairoSubpixelOrder;\n\n\tpublic function new()\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tthis = NativeCFFI.lime_cairo_font_options_create();\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_antialias():CairoAntialias\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_font_options_get_antialias(this);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_antialias(value:CairoAntialias):CairoAntialias\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_font_options_set_antialias(this, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_hintMetrics():CairoHintMetrics\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_font_options_get_hint_metrics(this);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_hintMetrics(value:CairoHintMetrics):CairoHintMetrics\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_font_options_set_hint_metrics(this, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_hintStyle():CairoHintStyle\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_font_options_get_hint_style(this);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_hintStyle(value:CairoHintStyle):CairoHintStyle\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_font_options_set_hint_style(this, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_subpixelOrder():CairoSubpixelOrder\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_font_options_get_subpixel_order(this);\n\t\t#end\n\n\t\treturn cast 0;\n\t}\n\n\t@:noCompletion private function set_subpixelOrder(value:CairoSubpixelOrder):CairoSubpixelOrder\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_font_options_set_subpixel_order(this, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoFormat.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoFormat(Int) from Int to Int from UInt to UInt\n{\n\tpublic var INVALID = -1;\n\tpublic var ARGB32 = 0;\n\tpublic var RGB24 = 1;\n\tpublic var A8 = 2;\n\tpublic var A1 = 3;\n\tpublic var RGB16_565 = 4;\n\tpublic var RGB30 = 5;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoGlyph.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass CairoGlyph\n{\n\tpublic var index:Int;\n\tpublic var x:Float;\n\tpublic var y:Float;\n\n\tpublic function new(index:Int, x:Float = 0, y:Float = 0)\n\t{\n\t\tthis.index = index;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoHintMetrics.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoHintMetrics(Int) from Int to Int from UInt to UInt\n{\n\tpublic var DEFAULT = 0;\n\tpublic var OFF = 1;\n\tpublic var ON = 2;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoHintStyle.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoHintStyle(Int) from Int to Int from UInt to UInt\n{\n\tpublic var DEFAULT = 0;\n\tpublic var NONE = 1;\n\tpublic var SLIGHT = 2;\n\tpublic var MEDIUM = 3;\n\tpublic var FULL = 4;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoImageSurface.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\nimport lime.utils.DataPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\n@:forward abstract CairoImageSurface(CairoSurface) from CairoSurface to CairoSurface from CFFIPointer to CFFIPointer\n{\n\tpublic var data(get, never):DataPointer;\n\tpublic var format(get, never):CairoFormat;\n\tpublic var height(get, never):Int;\n\tpublic var stride(get, never):Int;\n\tpublic var width(get, never):Int;\n\n\tpublic function new(format:CairoFormat, width:Int, height:Int):CairoSurface\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tthis = NativeCFFI.lime_cairo_image_surface_create(format, width, height);\n\t\t#else\n\t\tthis = cast 0;\n\t\t#end\n\t}\n\n\tpublic static function create(data:DataPointer, format:CairoFormat, width:Int, height:Int, stride:Int):CairoSurface\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_image_surface_create_for_data(data, format, width, height, stride);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function fromImage(image:Image):CairoSurface\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn create(#if nodejs image.data #else image.data.buffer #end, CairoFormat.ARGB32, image.width, image.height, image.buffer.stride);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_data():DataPointer\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_image_surface_get_data(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_format():CairoFormat\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_image_surface_get_format(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_height():Int\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_image_surface_get_height(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_stride():Int\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_image_surface_get_stride(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_width():Int\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_image_surface_get_width(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoLineCap.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoLineCap(Int) from Int to Int from UInt to UInt\n{\n\tpublic var BUTT = 0;\n\tpublic var ROUND = 1;\n\tpublic var SQUARE = 2;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoLineJoin.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoLineJoin(Int) from Int to Int from UInt to UInt\n{\n\tpublic var MITER = 0;\n\tpublic var ROUND = 1;\n\tpublic var BEVEL = 2;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoOperator.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoOperator(Int) from Int to Int from UInt to UInt\n{\n\tpublic var CLEAR = 0;\n\tpublic var SOURCE = 1;\n\tpublic var OVER = 2;\n\tpublic var IN = 3;\n\tpublic var OUT = 4;\n\tpublic var ATOP = 5;\n\tpublic var DEST = 6;\n\tpublic var DEST_OVER = 7;\n\tpublic var DEST_IN = 8;\n\tpublic var DEST_OUT = 9;\n\tpublic var DEST_ATOP = 10;\n\tpublic var XOR = 11;\n\tpublic var ADD = 12;\n\tpublic var SATURATE = 13;\n\tpublic var MULTIPLY = 14;\n\tpublic var SCREEN = 15;\n\tpublic var OVERLAY = 16;\n\tpublic var DARKEN = 17;\n\tpublic var LIGHTEN = 18;\n\tpublic var COLOR_DODGE = 19;\n\tpublic var COLOR_BURN = 20;\n\tpublic var HARD_LIGHT = 21;\n\tpublic var SOFT_LIGHT = 22;\n\tpublic var DIFFERENCE = 23;\n\tpublic var EXCLUSION = 24;\n\tpublic var HSL_HUE = 25;\n\tpublic var HSL_SATURATION = 26;\n\tpublic var HSL_COLOR = 27;\n\tpublic var HSL_LUMINOSITY = 28;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoPattern.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.math.Matrix3;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract CairoPattern(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic var colorStopCount(get, never):Int;\n\tpublic var extend(get, set):CairoExtend;\n\tpublic var filter(get, set):CairoFilter;\n\tpublic var matrix(get, set):Matrix3;\n\n\tpublic function new(handle)\n\t{\n\t\tthis = handle;\n\t}\n\n\tpublic function addColorStopRGB(offset:Float, r:Float, g:Float, b:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_pattern_add_color_stop_rgb(this, offset, r, g, b);\n\t\t#end\n\t}\n\n\tpublic function addColorStopRGBA(offset:Float, r:Float, g:Float, b:Float, a:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_pattern_add_color_stop_rgba(this, offset, r, g, b, a);\n\t\t#end\n\t}\n\n\tpublic static function createForSurface(surface:CairoSurface):CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_create_for_surface(surface);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function createLinear(x0:Float, y0:Float, x1:Float, y1:Float):CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_create_linear(x0, y0, x1, y1);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function createRadial(cx0:Float, cy0:Float, radius0:Float, cx1:Float, cy1:Float, radius1:Float):CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_create_radial(cx0, cy0, radius0, cx1, cy1, radius1);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function createRGB(r:Float, g:Float, b:Float):CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_create_rgb(r, g, b);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function createRGBA(r:Float, g:Float, b:Float, a:Float):CairoPattern\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_create_rgba(r, g, b, a);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_colorStopCount():Int\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_get_color_stop_count(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function get_extend():CairoExtend\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_get_extend(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_extend(value:CairoExtend):CairoExtend\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_pattern_set_extend(this, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_filter():CairoFilter\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\treturn NativeCFFI.lime_cairo_pattern_get_filter(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_filter(value:CairoFilter):CairoFilter\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_pattern_set_filter(this, value);\n\t\t#end\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_matrix():Matrix3\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\t#if hl\n\t\treturn NativeCFFI.lime_cairo_pattern_get_matrix(this, new CairoMatrix3());\n\t\t#else\n\t\tvar m:Dynamic = NativeCFFI.lime_cairo_pattern_get_matrix(this);\n\t\treturn new Matrix3(m.a, m.b, m.c, m.d, m.tx, m.ty);\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_matrix(value:Matrix3):Matrix3\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_pattern_set_matrix(this, value.toCairoMatrix3());\n\t\t#end\n\n\t\treturn value;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoStatus.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoStatus(Int) from Int to Int from UInt to UInt\n{\n\tpublic var SUCCESS = 0;\n\tpublic var NO_MEMORY = 1;\n\tpublic var INVALID_RESTORE = 2;\n\tpublic var INVALID_POP_GROUP = 3;\n\tpublic var NO_CURRENT_POINT = 4;\n\tpublic var INVALID_MATRIX = 5;\n\tpublic var INVALID_STATUS = 6;\n\tpublic var NULL_POINTER = 7;\n\tpublic var INVALID_STRING = 8;\n\tpublic var INVALID_PATH_DATA = 9;\n\tpublic var READ_ERROR = 10;\n\tpublic var WRITE_ERROR = 11;\n\tpublic var SURFACE_FINISHED = 12;\n\tpublic var SURFACE_TYPE_MISMATCH = 13;\n\tpublic var PATTERN_TYPE_MISMATCH = 14;\n\tpublic var INVALID_CONTENT = 15;\n\tpublic var INVALID_FORMAT = 16;\n\tpublic var INVALID_VISUAL = 17;\n\tpublic var FILE_NOT_FOUND = 18;\n\tpublic var INVALID_DASH = 19;\n\tpublic var INVALID_DSC_COMMENT = 20;\n\tpublic var INVALID_INDEX = 21;\n\tpublic var CLIP_NOT_REPRESENTABLE = 22;\n\tpublic var TEMP_FILE_ERROR = 23;\n\tpublic var INVALID_STRIDE = 24;\n\tpublic var FONT_TYPE_MISMATCH = 25;\n\tpublic var USER_FONT_IMMUTABLE = 26;\n\tpublic var USER_FONT_ERROR = 27;\n\tpublic var NEGATIVE_COUNT = 28;\n\tpublic var INVALID_CLUSTERS = 29;\n\tpublic var INVALID_SLANT = 30;\n\tpublic var INVALID_WEIGHT = 31;\n\tpublic var INVALID_SIZE = 32;\n\tpublic var USER_FONT_NOT_IMPLEMENTED = 33;\n\tpublic var DEVICE_TYPE_MISMATCH = 34;\n\tpublic var DEVICE_ERROR = 35;\n\tpublic var INVALID_MESH_CONSTRUCTION = 36;\n\tpublic var DEVICE_FINISHED = 37;\n\tpublic var JBIG2_GLOBAL_MISSING = 38;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoSubpixelOrder.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CairoSubpixelOrder(Int) from Int to Int from UInt to UInt\n{\n\tpublic var DEFAULT = 0;\n\tpublic var RGB = 1;\n\tpublic var BGR = 2;\n\tpublic var VRGB = 3;\n\tpublic var VBGR = 4;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/cairo/CairoSurface.hx",
    "content": "package lime.graphics.cairo;\n\n#if (!lime_doc_gen || lime_cairo)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract CairoSurface(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic function flush():Void\n\t{\n\t\t#if (lime_cffi && lime_cairo && !macro)\n\t\tNativeCFFI.lime_cairo_surface_flush(this);\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GL.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\nimport haxe.io.Bytes;\nimport haxe.Int64;\nimport lime.utils.ArrayBufferView;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.BytePointer;\nimport lime.utils.DataPointer;\nimport lime.utils.Float32Array;\nimport lime.utils.Int32Array;\n#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\n#end\n\n@:allow(lime.ui.Window)\nclass GL\n{\n\tpublic static inline var DEPTH_BUFFER_BIT = 0x00000100;\n\tpublic static inline var STENCIL_BUFFER_BIT = 0x00000400;\n\tpublic static inline var COLOR_BUFFER_BIT = 0x00004000;\n\tpublic static inline var POINTS = 0x0000;\n\tpublic static inline var LINES = 0x0001;\n\tpublic static inline var LINE_LOOP = 0x0002;\n\tpublic static inline var LINE_STRIP = 0x0003;\n\tpublic static inline var TRIANGLES = 0x0004;\n\tpublic static inline var TRIANGLE_STRIP = 0x0005;\n\tpublic static inline var TRIANGLE_FAN = 0x0006;\n\tpublic static inline var ZERO = 0;\n\tpublic static inline var ONE = 1;\n\tpublic static inline var SRC_COLOR = 0x0300;\n\tpublic static inline var ONE_MINUS_SRC_COLOR = 0x0301;\n\tpublic static inline var SRC_ALPHA = 0x0302;\n\tpublic static inline var ONE_MINUS_SRC_ALPHA = 0x0303;\n\tpublic static inline var DST_ALPHA = 0x0304;\n\tpublic static inline var ONE_MINUS_DST_ALPHA = 0x0305;\n\tpublic static inline var DST_COLOR = 0x0306;\n\tpublic static inline var ONE_MINUS_DST_COLOR = 0x0307;\n\tpublic static inline var SRC_ALPHA_SATURATE = 0x0308;\n\tpublic static inline var FUNC_ADD = 0x8006;\n\tpublic static inline var BLEND_EQUATION = 0x8009;\n\tpublic static inline var BLEND_EQUATION_RGB = 0x8009;\n\tpublic static inline var BLEND_EQUATION_ALPHA = 0x883D;\n\tpublic static inline var FUNC_SUBTRACT = 0x800A;\n\tpublic static inline var FUNC_REVERSE_SUBTRACT = 0x800B;\n\tpublic static inline var BLEND_DST_RGB = 0x80C8;\n\tpublic static inline var BLEND_SRC_RGB = 0x80C9;\n\tpublic static inline var BLEND_DST_ALPHA = 0x80CA;\n\tpublic static inline var BLEND_SRC_ALPHA = 0x80CB;\n\tpublic static inline var CONSTANT_COLOR = 0x8001;\n\tpublic static inline var ONE_MINUS_CONSTANT_COLOR = 0x8002;\n\tpublic static inline var CONSTANT_ALPHA = 0x8003;\n\tpublic static inline var ONE_MINUS_CONSTANT_ALPHA = 0x8004;\n\tpublic static inline var BLEND_COLOR = 0x8005;\n\tpublic static inline var ARRAY_BUFFER = 0x8892;\n\tpublic static inline var ELEMENT_ARRAY_BUFFER = 0x8893;\n\tpublic static inline var ARRAY_BUFFER_BINDING = 0x8894;\n\tpublic static inline var ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;\n\tpublic static inline var STREAM_DRAW = 0x88E0;\n\tpublic static inline var STATIC_DRAW = 0x88E4;\n\tpublic static inline var DYNAMIC_DRAW = 0x88E8;\n\tpublic static inline var BUFFER_SIZE = 0x8764;\n\tpublic static inline var BUFFER_USAGE = 0x8765;\n\tpublic static inline var CURRENT_VERTEX_ATTRIB = 0x8626;\n\tpublic static inline var FRONT = 0x0404;\n\tpublic static inline var BACK = 0x0405;\n\tpublic static inline var FRONT_AND_BACK = 0x0408;\n\tpublic static inline var CULL_FACE = 0x0B44;\n\tpublic static inline var BLEND = 0x0BE2;\n\tpublic static inline var DITHER = 0x0BD0;\n\tpublic static inline var STENCIL_TEST = 0x0B90;\n\tpublic static inline var DEPTH_TEST = 0x0B71;\n\tpublic static inline var SCISSOR_TEST = 0x0C11;\n\tpublic static inline var POLYGON_OFFSET_FILL = 0x8037;\n\tpublic static inline var SAMPLE_ALPHA_TO_COVERAGE = 0x809E;\n\tpublic static inline var SAMPLE_COVERAGE = 0x80A0;\n\tpublic static inline var NO_ERROR = 0;\n\tpublic static inline var INVALID_ENUM = 0x0500;\n\tpublic static inline var INVALID_VALUE = 0x0501;\n\tpublic static inline var INVALID_OPERATION = 0x0502;\n\tpublic static inline var OUT_OF_MEMORY = 0x0505;\n\tpublic static inline var CW = 0x0900;\n\tpublic static inline var CCW = 0x0901;\n\tpublic static inline var LINE_WIDTH = 0x0B21;\n\tpublic static inline var ALIASED_POINT_SIZE_RANGE = 0x846D;\n\tpublic static inline var ALIASED_LINE_WIDTH_RANGE = 0x846E;\n\tpublic static inline var CULL_FACE_MODE = 0x0B45;\n\tpublic static inline var FRONT_FACE = 0x0B46;\n\tpublic static inline var DEPTH_RANGE = 0x0B70;\n\tpublic static inline var DEPTH_WRITEMASK = 0x0B72;\n\tpublic static inline var DEPTH_CLEAR_VALUE = 0x0B73;\n\tpublic static inline var DEPTH_FUNC = 0x0B74;\n\tpublic static inline var STENCIL_CLEAR_VALUE = 0x0B91;\n\tpublic static inline var STENCIL_FUNC = 0x0B92;\n\tpublic static inline var STENCIL_FAIL = 0x0B94;\n\tpublic static inline var STENCIL_PASS_DEPTH_FAIL = 0x0B95;\n\tpublic static inline var STENCIL_PASS_DEPTH_PASS = 0x0B96;\n\tpublic static inline var STENCIL_REF = 0x0B97;\n\tpublic static inline var STENCIL_VALUE_MASK = 0x0B93;\n\tpublic static inline var STENCIL_WRITEMASK = 0x0B98;\n\tpublic static inline var STENCIL_BACK_FUNC = 0x8800;\n\tpublic static inline var STENCIL_BACK_FAIL = 0x8801;\n\tpublic static inline var STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;\n\tpublic static inline var STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;\n\tpublic static inline var STENCIL_BACK_REF = 0x8CA3;\n\tpublic static inline var STENCIL_BACK_VALUE_MASK = 0x8CA4;\n\tpublic static inline var STENCIL_BACK_WRITEMASK = 0x8CA5;\n\tpublic static inline var VIEWPORT = 0x0BA2;\n\tpublic static inline var SCISSOR_BOX = 0x0C10;\n\tpublic static inline var COLOR_CLEAR_VALUE = 0x0C22;\n\tpublic static inline var COLOR_WRITEMASK = 0x0C23;\n\tpublic static inline var UNPACK_ALIGNMENT = 0x0CF5;\n\tpublic static inline var PACK_ALIGNMENT = 0x0D05;\n\tpublic static inline var MAX_TEXTURE_SIZE = 0x0D33;\n\tpublic static inline var MAX_VIEWPORT_DIMS = 0x0D3A;\n\tpublic static inline var SUBPIXEL_BITS = 0x0D50;\n\tpublic static inline var RED_BITS = 0x0D52;\n\tpublic static inline var GREEN_BITS = 0x0D53;\n\tpublic static inline var BLUE_BITS = 0x0D54;\n\tpublic static inline var ALPHA_BITS = 0x0D55;\n\tpublic static inline var DEPTH_BITS = 0x0D56;\n\tpublic static inline var STENCIL_BITS = 0x0D57;\n\tpublic static inline var POLYGON_OFFSET_UNITS = 0x2A00;\n\tpublic static inline var POLYGON_OFFSET_FACTOR = 0x8038;\n\tpublic static inline var TEXTURE_BINDING_2D = 0x8069;\n\tpublic static inline var SAMPLE_BUFFERS = 0x80A8;\n\tpublic static inline var SAMPLES = 0x80A9;\n\tpublic static inline var SAMPLE_COVERAGE_VALUE = 0x80AA;\n\tpublic static inline var SAMPLE_COVERAGE_INVERT = 0x80AB;\n\tpublic static inline var NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2;\n\tpublic static inline var COMPRESSED_TEXTURE_FORMATS = 0x86A3;\n\tpublic static inline var DONT_CARE = 0x1100;\n\tpublic static inline var FASTEST = 0x1101;\n\tpublic static inline var NICEST = 0x1102;\n\tpublic static inline var GENERATE_MIPMAP_HINT = 0x8192;\n\tpublic static inline var BYTE = 0x1400;\n\tpublic static inline var UNSIGNED_BYTE = 0x1401;\n\tpublic static inline var SHORT = 0x1402;\n\tpublic static inline var UNSIGNED_SHORT = 0x1403;\n\tpublic static inline var INT = 0x1404;\n\tpublic static inline var UNSIGNED_INT = 0x1405;\n\tpublic static inline var FLOAT = 0x1406;\n\tpublic static inline var DEPTH_COMPONENT = 0x1902;\n\tpublic static inline var ALPHA = 0x1906;\n\tpublic static inline var RGB = 0x1907;\n\tpublic static inline var RGBA = 0x1908;\n\tpublic static inline var LUMINANCE = 0x1909;\n\tpublic static inline var LUMINANCE_ALPHA = 0x190A;\n\tpublic static inline var UNSIGNED_SHORT_4_4_4_4 = 0x8033;\n\tpublic static inline var UNSIGNED_SHORT_5_5_5_1 = 0x8034;\n\tpublic static inline var UNSIGNED_SHORT_5_6_5 = 0x8363;\n\tpublic static inline var FRAGMENT_SHADER = 0x8B30;\n\tpublic static inline var VERTEX_SHADER = 0x8B31;\n\tpublic static inline var MAX_VERTEX_ATTRIBS = 0x8869;\n\tpublic static inline var MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;\n\tpublic static inline var MAX_VARYING_VECTORS = 0x8DFC;\n\tpublic static inline var MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;\n\tpublic static inline var MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;\n\tpublic static inline var MAX_TEXTURE_IMAGE_UNITS = 0x8872;\n\tpublic static inline var MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;\n\tpublic static inline var SHADER_TYPE = 0x8B4F;\n\tpublic static inline var DELETE_STATUS = 0x8B80;\n\tpublic static inline var LINK_STATUS = 0x8B82;\n\tpublic static inline var VALIDATE_STATUS = 0x8B83;\n\tpublic static inline var ATTACHED_SHADERS = 0x8B85;\n\tpublic static inline var ACTIVE_UNIFORMS = 0x8B86;\n\tpublic static inline var ACTIVE_ATTRIBUTES = 0x8B89;\n\tpublic static inline var SHADING_LANGUAGE_VERSION = 0x8B8C;\n\tpublic static inline var CURRENT_PROGRAM = 0x8B8D;\n\tpublic static inline var NEVER = 0x0200;\n\tpublic static inline var LESS = 0x0201;\n\tpublic static inline var EQUAL = 0x0202;\n\tpublic static inline var LEQUAL = 0x0203;\n\tpublic static inline var GREATER = 0x0204;\n\tpublic static inline var NOTEQUAL = 0x0205;\n\tpublic static inline var GEQUAL = 0x0206;\n\tpublic static inline var ALWAYS = 0x0207;\n\tpublic static inline var KEEP = 0x1E00;\n\tpublic static inline var REPLACE = 0x1E01;\n\tpublic static inline var INCR = 0x1E02;\n\tpublic static inline var DECR = 0x1E03;\n\tpublic static inline var INVERT = 0x150A;\n\tpublic static inline var INCR_WRAP = 0x8507;\n\tpublic static inline var DECR_WRAP = 0x8508;\n\tpublic static inline var VENDOR = 0x1F00;\n\tpublic static inline var RENDERER = 0x1F01;\n\tpublic static inline var VERSION = 0x1F02;\n\tpublic static inline var EXTENSIONS = 0x1F03;\n\tpublic static inline var NEAREST = 0x2600;\n\tpublic static inline var LINEAR = 0x2601;\n\tpublic static inline var NEAREST_MIPMAP_NEAREST = 0x2700;\n\tpublic static inline var LINEAR_MIPMAP_NEAREST = 0x2701;\n\tpublic static inline var NEAREST_MIPMAP_LINEAR = 0x2702;\n\tpublic static inline var LINEAR_MIPMAP_LINEAR = 0x2703;\n\tpublic static inline var TEXTURE_MAG_FILTER = 0x2800;\n\tpublic static inline var TEXTURE_MIN_FILTER = 0x2801;\n\tpublic static inline var TEXTURE_WRAP_S = 0x2802;\n\tpublic static inline var TEXTURE_WRAP_T = 0x2803;\n\tpublic static inline var TEXTURE_2D = 0x0DE1;\n\tpublic static inline var TEXTURE = 0x1702;\n\tpublic static inline var TEXTURE_CUBE_MAP = 0x8513;\n\tpublic static inline var TEXTURE_BINDING_CUBE_MAP = 0x8514;\n\tpublic static inline var TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\n\tpublic static inline var TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;\n\tpublic static inline var TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;\n\tpublic static inline var TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;\n\tpublic static inline var TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;\n\tpublic static inline var TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;\n\tpublic static inline var MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;\n\tpublic static inline var TEXTURE0 = 0x84C0;\n\tpublic static inline var TEXTURE1 = 0x84C1;\n\tpublic static inline var TEXTURE2 = 0x84C2;\n\tpublic static inline var TEXTURE3 = 0x84C3;\n\tpublic static inline var TEXTURE4 = 0x84C4;\n\tpublic static inline var TEXTURE5 = 0x84C5;\n\tpublic static inline var TEXTURE6 = 0x84C6;\n\tpublic static inline var TEXTURE7 = 0x84C7;\n\tpublic static inline var TEXTURE8 = 0x84C8;\n\tpublic static inline var TEXTURE9 = 0x84C9;\n\tpublic static inline var TEXTURE10 = 0x84CA;\n\tpublic static inline var TEXTURE11 = 0x84CB;\n\tpublic static inline var TEXTURE12 = 0x84CC;\n\tpublic static inline var TEXTURE13 = 0x84CD;\n\tpublic static inline var TEXTURE14 = 0x84CE;\n\tpublic static inline var TEXTURE15 = 0x84CF;\n\tpublic static inline var TEXTURE16 = 0x84D0;\n\tpublic static inline var TEXTURE17 = 0x84D1;\n\tpublic static inline var TEXTURE18 = 0x84D2;\n\tpublic static inline var TEXTURE19 = 0x84D3;\n\tpublic static inline var TEXTURE20 = 0x84D4;\n\tpublic static inline var TEXTURE21 = 0x84D5;\n\tpublic static inline var TEXTURE22 = 0x84D6;\n\tpublic static inline var TEXTURE23 = 0x84D7;\n\tpublic static inline var TEXTURE24 = 0x84D8;\n\tpublic static inline var TEXTURE25 = 0x84D9;\n\tpublic static inline var TEXTURE26 = 0x84DA;\n\tpublic static inline var TEXTURE27 = 0x84DB;\n\tpublic static inline var TEXTURE28 = 0x84DC;\n\tpublic static inline var TEXTURE29 = 0x84DD;\n\tpublic static inline var TEXTURE30 = 0x84DE;\n\tpublic static inline var TEXTURE31 = 0x84DF;\n\tpublic static inline var ACTIVE_TEXTURE = 0x84E0;\n\tpublic static inline var REPEAT = 0x2901;\n\tpublic static inline var CLAMP_TO_EDGE = 0x812F;\n\tpublic static inline var MIRRORED_REPEAT = 0x8370;\n\tpublic static inline var FLOAT_VEC2 = 0x8B50;\n\tpublic static inline var FLOAT_VEC3 = 0x8B51;\n\tpublic static inline var FLOAT_VEC4 = 0x8B52;\n\tpublic static inline var INT_VEC2 = 0x8B53;\n\tpublic static inline var INT_VEC3 = 0x8B54;\n\tpublic static inline var INT_VEC4 = 0x8B55;\n\tpublic static inline var BOOL = 0x8B56;\n\tpublic static inline var BOOL_VEC2 = 0x8B57;\n\tpublic static inline var BOOL_VEC3 = 0x8B58;\n\tpublic static inline var BOOL_VEC4 = 0x8B59;\n\tpublic static inline var FLOAT_MAT2 = 0x8B5A;\n\tpublic static inline var FLOAT_MAT3 = 0x8B5B;\n\tpublic static inline var FLOAT_MAT4 = 0x8B5C;\n\tpublic static inline var SAMPLER_2D = 0x8B5E;\n\tpublic static inline var SAMPLER_CUBE = 0x8B60;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;\n\tpublic static inline var IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;\n\tpublic static inline var IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;\n\tpublic static inline var VERTEX_PROGRAM_POINT_SIZE = 0x8642;\n\tpublic static inline var POINT_SPRITE = 0x8861;\n\tpublic static inline var COMPILE_STATUS = 0x8B81;\n\tpublic static inline var LOW_FLOAT = 0x8DF0;\n\tpublic static inline var MEDIUM_FLOAT = 0x8DF1;\n\tpublic static inline var HIGH_FLOAT = 0x8DF2;\n\tpublic static inline var LOW_INT = 0x8DF3;\n\tpublic static inline var MEDIUM_INT = 0x8DF4;\n\tpublic static inline var HIGH_INT = 0x8DF5;\n\tpublic static inline var FRAMEBUFFER = 0x8D40;\n\tpublic static inline var RENDERBUFFER = 0x8D41;\n\tpublic static inline var RGBA4 = 0x8056;\n\tpublic static inline var RGB5_A1 = 0x8057;\n\tpublic static inline var RGB565 = 0x8D62;\n\tpublic static inline var DEPTH_COMPONENT16 = 0x81A5;\n\tpublic static inline var STENCIL_INDEX = 0x1901;\n\tpublic static inline var STENCIL_INDEX8 = 0x8D48;\n\tpublic static inline var DEPTH_STENCIL = 0x84F9;\n\tpublic static inline var RENDERBUFFER_WIDTH = 0x8D42;\n\tpublic static inline var RENDERBUFFER_HEIGHT = 0x8D43;\n\tpublic static inline var RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;\n\tpublic static inline var RENDERBUFFER_RED_SIZE = 0x8D50;\n\tpublic static inline var RENDERBUFFER_GREEN_SIZE = 0x8D51;\n\tpublic static inline var RENDERBUFFER_BLUE_SIZE = 0x8D52;\n\tpublic static inline var RENDERBUFFER_ALPHA_SIZE = 0x8D53;\n\tpublic static inline var RENDERBUFFER_DEPTH_SIZE = 0x8D54;\n\tpublic static inline var RENDERBUFFER_STENCIL_SIZE = 0x8D55;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;\n\tpublic static inline var COLOR_ATTACHMENT0 = 0x8CE0;\n\tpublic static inline var DEPTH_ATTACHMENT = 0x8D00;\n\tpublic static inline var STENCIL_ATTACHMENT = 0x8D20;\n\tpublic static inline var DEPTH_STENCIL_ATTACHMENT = 0x821A;\n\tpublic static inline var NONE = 0;\n\tpublic static inline var FRAMEBUFFER_COMPLETE = 0x8CD5;\n\tpublic static inline var FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;\n\tpublic static inline var FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;\n\tpublic static inline var FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;\n\tpublic static inline var FRAMEBUFFER_UNSUPPORTED = 0x8CDD;\n\tpublic static inline var FRAMEBUFFER_BINDING = 0x8CA6;\n\tpublic static inline var RENDERBUFFER_BINDING = 0x8CA7;\n\tpublic static inline var MAX_RENDERBUFFER_SIZE = 0x84E8;\n\tpublic static inline var INVALID_FRAMEBUFFER_OPERATION = 0x0506;\n\tpublic static inline var UNPACK_FLIP_Y_WEBGL = 0x9240;\n\tpublic static inline var UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;\n\tpublic static inline var CONTEXT_LOST_WEBGL = 0x9242;\n\tpublic static inline var UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\n\tpublic static inline var BROWSER_DEFAULT_WEBGL = 0x9244;\n\tpublic static inline var READ_BUFFER = 0x0C02;\n\tpublic static inline var UNPACK_ROW_LENGTH = 0x0CF2;\n\tpublic static inline var UNPACK_SKIP_ROWS = 0x0CF3;\n\tpublic static inline var UNPACK_SKIP_PIXELS = 0x0CF4;\n\tpublic static inline var PACK_ROW_LENGTH = 0x0D02;\n\tpublic static inline var PACK_SKIP_ROWS = 0x0D03;\n\tpublic static inline var PACK_SKIP_PIXELS = 0x0D04;\n\tpublic static inline var TEXTURE_BINDING_3D = 0x806A;\n\tpublic static inline var UNPACK_SKIP_IMAGES = 0x806D;\n\tpublic static inline var UNPACK_IMAGE_HEIGHT = 0x806E;\n\tpublic static inline var MAX_3D_TEXTURE_SIZE = 0x8073;\n\tpublic static inline var MAX_ELEMENTS_VERTICES = 0x80E8;\n\tpublic static inline var MAX_ELEMENTS_INDICES = 0x80E9;\n\tpublic static inline var MAX_TEXTURE_LOD_BIAS = 0x84FD;\n\tpublic static inline var MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49;\n\tpublic static inline var MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A;\n\tpublic static inline var MAX_ARRAY_TEXTURE_LAYERS = 0x88FF;\n\tpublic static inline var MIN_PROGRAM_TEXEL_OFFSET = 0x8904;\n\tpublic static inline var MAX_PROGRAM_TEXEL_OFFSET = 0x8905;\n\tpublic static inline var MAX_VARYING_COMPONENTS = 0x8B4B;\n\tpublic static inline var FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B;\n\tpublic static inline var RASTERIZER_DISCARD = 0x8C89;\n\tpublic static inline var VERTEX_ARRAY_BINDING = 0x85B5;\n\tpublic static inline var MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;\n\tpublic static inline var MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;\n\tpublic static inline var MAX_SERVER_WAIT_TIMEOUT = 0x9111;\n\tpublic static inline var MAX_ELEMENT_INDEX = 0x8D6B;\n\tpublic static inline var RED = 0x1903;\n\tpublic static inline var RGB8 = 0x8051;\n\tpublic static inline var RGBA8 = 0x8058;\n\tpublic static inline var RGB10_A2 = 0x8059;\n\tpublic static inline var TEXTURE_3D = 0x806F;\n\tpublic static inline var TEXTURE_WRAP_R = 0x8072;\n\tpublic static inline var TEXTURE_MIN_LOD = 0x813A;\n\tpublic static inline var TEXTURE_MAX_LOD = 0x813B;\n\tpublic static inline var TEXTURE_BASE_LEVEL = 0x813C;\n\tpublic static inline var TEXTURE_MAX_LEVEL = 0x813D;\n\tpublic static inline var TEXTURE_COMPARE_MODE = 0x884C;\n\tpublic static inline var TEXTURE_COMPARE_FUNC = 0x884D;\n\tpublic static inline var SRGB = 0x8C40;\n\tpublic static inline var SRGB8 = 0x8C41;\n\tpublic static inline var SRGB8_ALPHA8 = 0x8C43;\n\tpublic static inline var COMPARE_REF_TO_TEXTURE = 0x884E;\n\tpublic static inline var RGBA32F = 0x8814;\n\tpublic static inline var RGB32F = 0x8815;\n\tpublic static inline var RGBA16F = 0x881A;\n\tpublic static inline var RGB16F = 0x881B;\n\tpublic static inline var TEXTURE_2D_ARRAY = 0x8C1A;\n\tpublic static inline var TEXTURE_BINDING_2D_ARRAY = 0x8C1D;\n\tpublic static inline var R11F_G11F_B10F = 0x8C3A;\n\tpublic static inline var RGB9_E5 = 0x8C3D;\n\tpublic static inline var RGBA32UI = 0x8D70;\n\tpublic static inline var RGB32UI = 0x8D71;\n\tpublic static inline var RGBA16UI = 0x8D76;\n\tpublic static inline var RGB16UI = 0x8D77;\n\tpublic static inline var RGBA8UI = 0x8D7C;\n\tpublic static inline var RGB8UI = 0x8D7D;\n\tpublic static inline var RGBA32I = 0x8D82;\n\tpublic static inline var RGB32I = 0x8D83;\n\tpublic static inline var RGBA16I = 0x8D88;\n\tpublic static inline var RGB16I = 0x8D89;\n\tpublic static inline var RGBA8I = 0x8D8E;\n\tpublic static inline var RGB8I = 0x8D8F;\n\tpublic static inline var RED_INTEGER = 0x8D94;\n\tpublic static inline var RGB_INTEGER = 0x8D98;\n\tpublic static inline var RGBA_INTEGER = 0x8D99;\n\tpublic static inline var R8 = 0x8229;\n\tpublic static inline var RG8 = 0x822B;\n\tpublic static inline var R16F = 0x822D;\n\tpublic static inline var R32F = 0x822E;\n\tpublic static inline var RG16F = 0x822F;\n\tpublic static inline var RG32F = 0x8230;\n\tpublic static inline var R8I = 0x8231;\n\tpublic static inline var R8UI = 0x8232;\n\tpublic static inline var R16I = 0x8233;\n\tpublic static inline var R16UI = 0x8234;\n\tpublic static inline var R32I = 0x8235;\n\tpublic static inline var R32UI = 0x8236;\n\tpublic static inline var RG8I = 0x8237;\n\tpublic static inline var RG8UI = 0x8238;\n\tpublic static inline var RG16I = 0x8239;\n\tpublic static inline var RG16UI = 0x823A;\n\tpublic static inline var RG32I = 0x823B;\n\tpublic static inline var RG32UI = 0x823C;\n\tpublic static inline var R8_SNORM = 0x8F94;\n\tpublic static inline var RG8_SNORM = 0x8F95;\n\tpublic static inline var RGB8_SNORM = 0x8F96;\n\tpublic static inline var RGBA8_SNORM = 0x8F97;\n\tpublic static inline var RGB10_A2UI = 0x906F;\n\tpublic static inline var TEXTURE_IMMUTABLE_FORMAT = 0x912F;\n\tpublic static inline var TEXTURE_IMMUTABLE_LEVELS = 0x82DF;\n\tpublic static inline var UNSIGNED_INT_2_10_10_10_REV = 0x8368;\n\tpublic static inline var UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B;\n\tpublic static inline var UNSIGNED_INT_5_9_9_9_REV = 0x8C3E;\n\tpublic static inline var FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;\n\tpublic static inline var UNSIGNED_INT_24_8 = 0x84FA;\n\tpublic static inline var HALF_FLOAT = 0x140B;\n\tpublic static inline var RG = 0x8227;\n\tpublic static inline var RG_INTEGER = 0x8228;\n\tpublic static inline var INT_2_10_10_10_REV = 0x8D9F;\n\tpublic static inline var CURRENT_QUERY = 0x8865;\n\tpublic static inline var QUERY_RESULT = 0x8866;\n\tpublic static inline var QUERY_RESULT_AVAILABLE = 0x8867;\n\tpublic static inline var ANY_SAMPLES_PASSED = 0x8C2F;\n\tpublic static inline var ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A;\n\tpublic static inline var MAX_DRAW_BUFFERS = 0x8824;\n\tpublic static inline var DRAW_BUFFER0 = 0x8825;\n\tpublic static inline var DRAW_BUFFER1 = 0x8826;\n\tpublic static inline var DRAW_BUFFER2 = 0x8827;\n\tpublic static inline var DRAW_BUFFER3 = 0x8828;\n\tpublic static inline var DRAW_BUFFER4 = 0x8829;\n\tpublic static inline var DRAW_BUFFER5 = 0x882A;\n\tpublic static inline var DRAW_BUFFER6 = 0x882B;\n\tpublic static inline var DRAW_BUFFER7 = 0x882C;\n\tpublic static inline var DRAW_BUFFER8 = 0x882D;\n\tpublic static inline var DRAW_BUFFER9 = 0x882E;\n\tpublic static inline var DRAW_BUFFER10 = 0x882F;\n\tpublic static inline var DRAW_BUFFER11 = 0x8830;\n\tpublic static inline var DRAW_BUFFER12 = 0x8831;\n\tpublic static inline var DRAW_BUFFER13 = 0x8832;\n\tpublic static inline var DRAW_BUFFER14 = 0x8833;\n\tpublic static inline var DRAW_BUFFER15 = 0x8834;\n\tpublic static inline var MAX_COLOR_ATTACHMENTS = 0x8CDF;\n\tpublic static inline var COLOR_ATTACHMENT1 = 0x8CE1;\n\tpublic static inline var COLOR_ATTACHMENT2 = 0x8CE2;\n\tpublic static inline var COLOR_ATTACHMENT3 = 0x8CE3;\n\tpublic static inline var COLOR_ATTACHMENT4 = 0x8CE4;\n\tpublic static inline var COLOR_ATTACHMENT5 = 0x8CE5;\n\tpublic static inline var COLOR_ATTACHMENT6 = 0x8CE6;\n\tpublic static inline var COLOR_ATTACHMENT7 = 0x8CE7;\n\tpublic static inline var COLOR_ATTACHMENT8 = 0x8CE8;\n\tpublic static inline var COLOR_ATTACHMENT9 = 0x8CE9;\n\tpublic static inline var COLOR_ATTACHMENT10 = 0x8CEA;\n\tpublic static inline var COLOR_ATTACHMENT11 = 0x8CEB;\n\tpublic static inline var COLOR_ATTACHMENT12 = 0x8CEC;\n\tpublic static inline var COLOR_ATTACHMENT13 = 0x8CED;\n\tpublic static inline var COLOR_ATTACHMENT14 = 0x8CEE;\n\tpublic static inline var COLOR_ATTACHMENT15 = 0x8CEF;\n\tpublic static inline var SAMPLER_3D = 0x8B5F;\n\tpublic static inline var SAMPLER_2D_SHADOW = 0x8B62;\n\tpublic static inline var SAMPLER_2D_ARRAY = 0x8DC1;\n\tpublic static inline var SAMPLER_2D_ARRAY_SHADOW = 0x8DC4;\n\tpublic static inline var SAMPLER_CUBE_SHADOW = 0x8DC5;\n\tpublic static inline var INT_SAMPLER_2D = 0x8DCA;\n\tpublic static inline var INT_SAMPLER_3D = 0x8DCB;\n\tpublic static inline var INT_SAMPLER_CUBE = 0x8DCC;\n\tpublic static inline var INT_SAMPLER_2D_ARRAY = 0x8DCF;\n\tpublic static inline var UNSIGNED_INT_SAMPLER_2D = 0x8DD2;\n\tpublic static inline var UNSIGNED_INT_SAMPLER_3D = 0x8DD3;\n\tpublic static inline var UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4;\n\tpublic static inline var UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7;\n\tpublic static inline var MAX_SAMPLES = 0x8D57;\n\tpublic static inline var SAMPLER_BINDING = 0x8919;\n\tpublic static inline var PIXEL_PACK_BUFFER = 0x88EB;\n\tpublic static inline var PIXEL_UNPACK_BUFFER = 0x88EC;\n\tpublic static inline var PIXEL_PACK_BUFFER_BINDING = 0x88ED;\n\tpublic static inline var PIXEL_UNPACK_BUFFER_BINDING = 0x88EF;\n\tpublic static inline var COPY_READ_BUFFER = 0x8F36;\n\tpublic static inline var COPY_WRITE_BUFFER = 0x8F37;\n\tpublic static inline var COPY_READ_BUFFER_BINDING = 0x8F36;\n\tpublic static inline var COPY_WRITE_BUFFER_BINDING = 0x8F37;\n\tpublic static inline var FLOAT_MAT2x3 = 0x8B65;\n\tpublic static inline var FLOAT_MAT2x4 = 0x8B66;\n\tpublic static inline var FLOAT_MAT3x2 = 0x8B67;\n\tpublic static inline var FLOAT_MAT3x4 = 0x8B68;\n\tpublic static inline var FLOAT_MAT4x2 = 0x8B69;\n\tpublic static inline var FLOAT_MAT4x3 = 0x8B6A;\n\tpublic static inline var UNSIGNED_INT_VEC2 = 0x8DC6;\n\tpublic static inline var UNSIGNED_INT_VEC3 = 0x8DC7;\n\tpublic static inline var UNSIGNED_INT_VEC4 = 0x8DC8;\n\tpublic static inline var UNSIGNED_NORMALIZED = 0x8C17;\n\tpublic static inline var SIGNED_NORMALIZED = 0x8F9C;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD;\n\tpublic static inline var VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE;\n\tpublic static inline var TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F;\n\tpublic static inline var MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80;\n\tpublic static inline var TRANSFORM_FEEDBACK_VARYINGS = 0x8C83;\n\tpublic static inline var TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84;\n\tpublic static inline var TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85;\n\tpublic static inline var TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88;\n\tpublic static inline var MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;\n\tpublic static inline var MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B;\n\tpublic static inline var INTERLEAVED_ATTRIBS = 0x8C8C;\n\tpublic static inline var SEPARATE_ATTRIBS = 0x8C8D;\n\tpublic static inline var TRANSFORM_FEEDBACK_BUFFER = 0x8C8E;\n\tpublic static inline var TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F;\n\tpublic static inline var TRANSFORM_FEEDBACK = 0x8E22;\n\tpublic static inline var TRANSFORM_FEEDBACK_PAUSED = 0x8E23;\n\tpublic static inline var TRANSFORM_FEEDBACK_ACTIVE = 0x8E24;\n\tpublic static inline var TRANSFORM_FEEDBACK_BINDING = 0x8E25;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;\n\tpublic static inline var FRAMEBUFFER_DEFAULT = 0x8218;\n\tpublic static inline var DEPTH24_STENCIL8 = 0x88F0;\n\tpublic static inline var DRAW_FRAMEBUFFER_BINDING = 0x8CA6;\n\tpublic static inline var READ_FRAMEBUFFER = 0x8CA8;\n\tpublic static inline var DRAW_FRAMEBUFFER = 0x8CA9;\n\tpublic static inline var READ_FRAMEBUFFER_BINDING = 0x8CAA;\n\tpublic static inline var RENDERBUFFER_SAMPLES = 0x8CAB;\n\tpublic static inline var FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4;\n\tpublic static inline var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56;\n\tpublic static inline var UNIFORM_BUFFER = 0x8A11;\n\tpublic static inline var UNIFORM_BUFFER_BINDING = 0x8A28;\n\tpublic static inline var UNIFORM_BUFFER_START = 0x8A29;\n\tpublic static inline var UNIFORM_BUFFER_SIZE = 0x8A2A;\n\tpublic static inline var MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B;\n\tpublic static inline var MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D;\n\tpublic static inline var MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E;\n\tpublic static inline var MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F;\n\tpublic static inline var MAX_UNIFORM_BLOCK_SIZE = 0x8A30;\n\tpublic static inline var MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31;\n\tpublic static inline var MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33;\n\tpublic static inline var UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34;\n\tpublic static inline var ACTIVE_UNIFORM_BLOCKS = 0x8A36;\n\tpublic static inline var UNIFORM_TYPE = 0x8A37;\n\tpublic static inline var UNIFORM_SIZE = 0x8A38;\n\tpublic static inline var UNIFORM_BLOCK_INDEX = 0x8A3A;\n\tpublic static inline var UNIFORM_OFFSET = 0x8A3B;\n\tpublic static inline var UNIFORM_ARRAY_STRIDE = 0x8A3C;\n\tpublic static inline var UNIFORM_MATRIX_STRIDE = 0x8A3D;\n\tpublic static inline var UNIFORM_IS_ROW_MAJOR = 0x8A3E;\n\tpublic static inline var UNIFORM_BLOCK_BINDING = 0x8A3F;\n\tpublic static inline var UNIFORM_BLOCK_DATA_SIZE = 0x8A40;\n\tpublic static inline var UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42;\n\tpublic static inline var UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43;\n\tpublic static inline var UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44;\n\tpublic static inline var UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46;\n\tpublic static inline var OBJECT_TYPE = 0x9112;\n\tpublic static inline var SYNC_CONDITION = 0x9113;\n\tpublic static inline var SYNC_STATUS = 0x9114;\n\tpublic static inline var SYNC_FLAGS = 0x9115;\n\tpublic static inline var SYNC_FENCE = 0x9116;\n\tpublic static inline var SYNC_GPU_COMMANDS_COMPLETE = 0x9117;\n\tpublic static inline var UNSIGNALED = 0x9118;\n\tpublic static inline var SIGNALED = 0x9119;\n\tpublic static inline var ALREADY_SIGNALED = 0x911A;\n\tpublic static inline var TIMEOUT_EXPIRED = 0x911B;\n\tpublic static inline var CONDITION_SATISFIED = 0x911C;\n\tpublic static inline var WAIT_FAILED = 0x911D;\n\tpublic static inline var SYNC_FLUSH_COMMANDS_BIT = 0x00000001;\n\tpublic static inline var COLOR = 0x1800;\n\tpublic static inline var DEPTH = 0x1801;\n\tpublic static inline var STENCIL = 0x1802;\n\tpublic static inline var MIN = 0x8007;\n\tpublic static inline var MAX = 0x8008;\n\tpublic static inline var DEPTH_COMPONENT24 = 0x81A6;\n\tpublic static inline var STREAM_READ = 0x88E1;\n\tpublic static inline var STREAM_COPY = 0x88E2;\n\tpublic static inline var STATIC_READ = 0x88E5;\n\tpublic static inline var STATIC_COPY = 0x88E6;\n\tpublic static inline var DYNAMIC_READ = 0x88E9;\n\tpublic static inline var DYNAMIC_COPY = 0x88EA;\n\tpublic static inline var DEPTH_COMPONENT32F = 0x8CAC;\n\tpublic static inline var DEPTH32F_STENCIL8 = 0x8CAD;\n\tpublic static inline var INVALID_INDEX = 0xFFFFFFFF;\n\tpublic static inline var TIMEOUT_IGNORED = -1;\n\tpublic static inline var MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247;\n\t#if lime_opengl\n\tpublic static var context(default, null):OpenGLRenderContext;\n\t#elseif lime_opengles\n\tpublic static var context(default, null):OpenGLES3RenderContext;\n\t#elseif lime_webgl\n\tpublic static var context(default, null):WebGL2RenderContext;\n\t#else\n\tpublic static var context(default, null):Dynamic;\n\t#end\n\tpublic static var type(default, null):RenderContextType;\n\tpublic static var version(default, null):Float;\n\n\tpublic static inline function activeTexture(texture:Int):Void\n\t{\n\t\tcontext.activeTexture(texture);\n\t}\n\n\tpublic static inline function attachShader(program:GLProgram, shader:GLShader):Void\n\t{\n\t\tcontext.attachShader(program, shader);\n\t}\n\n\tpublic static inline function beginQuery(target:Int, query:GLQuery):Void\n\t{\n\t\tcontext.beginQuery(target, query);\n\t}\n\n\tpublic static inline function beginTransformFeedback(primitiveNode:Int):Void\n\t{\n\t\tcontext.beginTransformFeedback(primitiveNode);\n\t}\n\n\tpublic static inline function bindAttribLocation(program:GLProgram, index:Int, name:String):Void\n\t{\n\t\tcontext.bindAttribLocation(program, index, name);\n\t}\n\n\tpublic static inline function bindBuffer(target:Int, buffer:GLBuffer):Void\n\t{\n\t\tcontext.bindBuffer(target, buffer);\n\t}\n\n\tpublic static inline function bindBufferBase(target:Int, index:Int, buffer:GLBuffer):Void\n\t{\n\t\tcontext.bindBufferBase(target, index, buffer);\n\t}\n\n\tpublic static inline function bindBufferRange(target:Int, index:Int, buffer:GLBuffer, offset:DataPointer, size:Int):Void\n\t{\n\t\tcontext.bindBufferRange(target, index, buffer, offset, size);\n\t}\n\n\tpublic static inline function bindFramebuffer(target:Int, framebuffer:GLFramebuffer):Void\n\t{\n\t\tcontext.bindFramebuffer(target, framebuffer);\n\t}\n\n\tpublic static inline function bindRenderbuffer(target:Int, renderbuffer:GLRenderbuffer):Void\n\t{\n\t\tcontext.bindRenderbuffer(target, renderbuffer);\n\t}\n\n\tpublic static inline function bindSampler(unit:Int, sampler:GLSampler):Void\n\t{\n\t\tcontext.bindSampler(unit, sampler);\n\t}\n\n\tpublic static inline function bindTexture(target:Int, texture:GLTexture):Void\n\t{\n\t\tcontext.bindTexture(target, texture);\n\t}\n\n\tpublic static inline function bindTransformFeedback(target:Int, transformFeedback:GLTransformFeedback):Void\n\t{\n\t\tcontext.bindTransformFeedback(target, transformFeedback);\n\t}\n\n\tpublic static inline function bindVertexArray(vertexArray:GLVertexArrayObject):Void\n\t{\n\t\tcontext.bindVertexArray(vertexArray);\n\t}\n\n\tpublic static inline function blitFramebuffer(srcX0:Int, srcY0:Int, srcX1:Int, srcY1:Int, dstX0:Int, dstY0:Int, dstX1:Int, dstY1:Int, mask:Int,\n\t\t\tfilter:Int):Void\n\t{\n\t\tcontext.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n\t}\n\n\tpublic static inline function blendColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n\t{\n\t\tcontext.blendColor(red, green, blue, alpha);\n\t}\n\n\tpublic static inline function blendEquation(mode:Int):Void\n\t{\n\t\tcontext.blendEquation(mode);\n\t}\n\n\tpublic static inline function blendEquationSeparate(modeRGB:Int, modeAlpha:Int):Void\n\t{\n\t\tcontext.blendEquationSeparate(modeRGB, modeAlpha);\n\t}\n\n\tpublic static inline function blendFunc(sfactor:Int, dfactor:Int):Void\n\t{\n\t\tcontext.blendFunc(sfactor, dfactor);\n\t}\n\n\tpublic static inline function blendFuncSeparate(srcRGB:Int, dstRGB:Int, srcAlpha:Int, dstAlpha:Int):Void\n\t{\n\t\tcontext.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function bufferData(target:Int, size:Int, srcData:DataPointer, usage:Int):Void\n\t{\n\t\tcontext.bufferData(target, size, srcData, usage);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function bufferDataWEBGL(target:Int, srcData:Dynamic, usage:Int, ?srcOffset:Int, ?length:Int):Void\n\t{\n\t\tcontext.bufferData(target, srcData, usage, srcOffset, length);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function bufferSubData(target:Int, dstByteOffset:Int, size:Int, srcData:DataPointer):Void\n\t{\n\t\tcontext.bufferSubData(target, dstByteOffset, size, srcData);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function bufferSubDataWEBGL(target:Int, dstByteOffset:Int, srcData:Dynamic, ?srcOffset:Int, ?length:Int):Void\n\t{\n\t\tcontext.bufferSubData(target, dstByteOffset, srcData, srcOffset, length);\n\t}\n\t#end\n\n\tpublic static inline function checkFramebufferStatus(target:Int):Int\n\t{\n\t\treturn context.checkFramebufferStatus(target);\n\t}\n\n\tpublic static inline function clear(mask:Int):Void\n\t{\n\t\tcontext.clear(mask);\n\t}\n\n\tpublic static inline function clearBufferfi(buffer:Int, drawbuffer:Int, depth:Float, stencil:Int):Void\n\t{\n\t\tcontext.clearBufferfi(buffer, drawbuffer, depth, stencil);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function clearBufferfv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n\t{\n\t\tcontext.clearBufferfv(buffer, drawbuffer, value);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function clearBufferfvWEBGL(buffer:Int, drawbuffer:Int, values:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.clearBufferfv(buffer, drawbuffer, values, srcOffset);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function clearBufferiv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n\t{\n\t\tcontext.clearBufferiv(buffer, drawbuffer, value);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function clearBufferivWEBGL(buffer:Int, drawbuffer:Int, values:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.clearBufferiv(buffer, drawbuffer, values, srcOffset);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function clearBufferuiv(buffer:Int, drawbuffer:Int, value:DataPointer):Void\n\t{\n\t\tcontext.clearBufferuiv(buffer, drawbuffer, value);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function clearBufferuivWEBGL(buffer:Int, drawbuffer:Int, values:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.clearBufferuiv(buffer, drawbuffer, values, srcOffset);\n\t}\n\t#end\n\n\tpublic static inline function clearColor(red:Float, green:Float, blue:Float, alpha:Float):Void\n\t{\n\t\tcontext.clearColor(red, green, blue, alpha);\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function clearDepth(depth:Float):Void\n\t{\n\t\tcontext.clearDepth(depth);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function clearDepthf(depth:Float):Void\n\t{\n\t\tcontext.clearDepthf(depth);\n\t}\n\t#end\n\n\tpublic static inline function clearStencil(s:Int):Void\n\t{\n\t\tcontext.clearStencil(s);\n\t}\n\n\tpublic static inline function clientWaitSync(sync:GLSync, flags:Int, timeout:#if (!js || !html5 || doc_gen) Int64 #else Dynamic #end):Int\n\t{\n\t\treturn context.clientWaitSync(sync, flags, timeout);\n\t}\n\n\tpublic static inline function colorMask(red:Bool, green:Bool, blue:Bool, alpha:Bool):Void\n\t{\n\t\tcontext.colorMask(red, green, blue, alpha);\n\t}\n\n\tpublic static inline function compileShader(shader:GLShader):Void\n\t{\n\t\tcontext.compileShader(shader);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function compressedTexImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, imageSize:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\tcontext.compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function compressedTexImage2DWEBGL(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, srcData:Dynamic,\n\t\t\t?srcOffset:Int, ?srcLengthOverride:Int):Void\n\t{\n\t\tcontext.compressedTexImage2D(target, level, internalformat, width, height, border, srcData, srcOffset, srcLengthOverride);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function compressedTexImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, imageSize:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\tcontext.compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function compressedTexImage3DWEBGL(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int,\n\t\t\tsrcData:Dynamic, ?srcOffset:Int, ?srcLengthOverride:Int):Void\n\t{\n\t\tcontext.compressedTexImage3D(target, level, internalformat, width, height, depth, border, srcData, srcOffset, srcLengthOverride);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function compressedTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, imageSize:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\tcontext.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function compressedTexSubImage2DWEBGL(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int,\n\t\t\tsrcData:Dynamic, ?srcOffset:Int, ?srcLengthOverride:Int):Void\n\t{\n\t\tcontext.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, srcData, srcOffset, srcLengthOverride);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function compressedTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int,\n\t\t\tformat:Int, imageSize:Int, data:DataPointer):Void\n\t{\n\t\tcontext.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function compressedTexSubImage3DWEBGL(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int,\n\t\t\tformat:Int, srcData:Dynamic, ?srcOffset:Int, ?srcLengthOverride:Int):Void\n\t{\n\t\tcontext.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, srcData, srcOffset, srcLengthOverride);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function copyBufferSubData(readTarget:Int, writeTarget:Int, readOffset:DataPointer, writeOffset:DataPointer, size:Int):Void\n\t{\n\t\tcontext.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);\n\t}\n\t#end\n\n\tpublic static inline function copyTexImage2D(target:Int, level:Int, internalformat:Int, x:Int, y:Int, width:Int, height:Int, border:Int):Void\n\t{\n\t\tcontext.copyTexImage2D(target, level, internalformat, x, y, width, height, border);\n\t}\n\n\tpublic static inline function copyTexSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);\n\t}\n\n\tpublic static inline function copyTexSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);\n\t}\n\n\tpublic static inline function createBuffer():GLBuffer\n\t{\n\t\treturn context.createBuffer();\n\t}\n\n\tpublic static inline function createFramebuffer():GLFramebuffer\n\t{\n\t\treturn context.createFramebuffer();\n\t}\n\n\tpublic static inline function createProgram():GLProgram\n\t{\n\t\treturn context.createProgram();\n\t}\n\n\tpublic static inline function createQuery():GLQuery\n\t{\n\t\treturn context.createQuery();\n\t}\n\n\tpublic static inline function createRenderbuffer():GLRenderbuffer\n\t{\n\t\treturn context.createRenderbuffer();\n\t}\n\n\tpublic static inline function createSampler():GLSampler\n\t{\n\t\treturn context.createSampler();\n\t}\n\n\tpublic static inline function createShader(type:Int):GLShader\n\t{\n\t\treturn context.createShader(type);\n\t}\n\n\tpublic static inline function createTexture():GLTexture\n\t{\n\t\treturn context.createTexture();\n\t}\n\n\tpublic static inline function createTransformFeedback():GLTransformFeedback\n\t{\n\t\treturn context.createTransformFeedback();\n\t}\n\n\tpublic static inline function createVertexArray():GLVertexArrayObject\n\t{\n\t\treturn context.createVertexArray();\n\t}\n\n\tpublic static inline function cullFace(mode:Int):Void\n\t{\n\t\tcontext.cullFace(mode);\n\t}\n\n\tpublic static inline function deleteBuffer(buffer:GLBuffer):Void\n\t{\n\t\tcontext.deleteBuffer(buffer);\n\t}\n\n\tpublic static inline function deleteFramebuffer(framebuffer:GLFramebuffer):Void\n\t{\n\t\tcontext.deleteFramebuffer(framebuffer);\n\t}\n\n\tpublic static inline function deleteProgram(program:GLProgram):Void\n\t{\n\t\tcontext.deleteProgram(program);\n\t}\n\n\tpublic static inline function deleteQuery(query:GLQuery):Void\n\t{\n\t\tcontext.deleteQuery(query);\n\t}\n\n\tpublic static inline function deleteRenderbuffer(renderbuffer:GLRenderbuffer):Void\n\t{\n\t\tcontext.deleteRenderbuffer(renderbuffer);\n\t}\n\n\tpublic static inline function deleteSampler(sampler:GLSampler):Void\n\t{\n\t\tcontext.deleteSampler(sampler);\n\t}\n\n\tpublic static inline function deleteShader(shader:GLShader):Void\n\t{\n\t\tcontext.deleteShader(shader);\n\t}\n\n\tpublic static inline function deleteSync(sync:GLSync):Void\n\t{\n\t\tcontext.deleteSync(sync);\n\t}\n\n\tpublic static inline function deleteTexture(texture:GLTexture):Void\n\t{\n\t\tcontext.deleteTexture(texture);\n\t}\n\n\tpublic static inline function deleteTransformFeedback(transformFeedback:GLTransformFeedback):Void\n\t{\n\t\tcontext.deleteTransformFeedback(transformFeedback);\n\t}\n\n\tpublic static inline function deleteVertexArray(vertexArray:GLVertexArrayObject):Void\n\t{\n\t\tcontext.deleteVertexArray(vertexArray);\n\t}\n\n\tpublic static inline function depthFunc(func:Int):Void\n\t{\n\t\tcontext.depthFunc(func);\n\t}\n\n\tpublic static inline function depthMask(flag:Bool):Void\n\t{\n\t\tcontext.depthMask(flag);\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function depthRange(zNear:Float, zFar:Float):Void\n\t{\n\t\tcontext.depthRange(zNear, zFar);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function depthRangef(zNear:Float, zFar:Float):Void\n\t{\n\t\tcontext.depthRangef(zNear, zFar);\n\t}\n\t#end\n\n\tpublic static inline function detachShader(program:GLProgram, shader:GLShader):Void\n\t{\n\t\tcontext.detachShader(program, shader);\n\t}\n\n\tpublic static inline function disable(cap:Int):Void\n\t{\n\t\tcontext.disable(cap);\n\t}\n\n\tpublic static inline function disableVertexAttribArray(index:Int):Void\n\t{\n\t\tcontext.disableVertexAttribArray(index);\n\t}\n\n\tpublic static inline function drawArrays(mode:Int, first:Int, count:Int):Void\n\t{\n\t\tcontext.drawArrays(mode, first, count);\n\t}\n\n\tpublic static inline function drawArraysInstanced(mode:Int, first:Int, count:Int, instanceCount:Int):Void\n\t{\n\t\tcontext.drawArraysInstanced(mode, first, count, instanceCount);\n\t}\n\n\tpublic static inline function drawBuffers(buffers:Array<Int>):Void\n\t{\n\t\tcontext.drawBuffers(buffers);\n\t}\n\n\tpublic static inline function drawElements(mode:Int, count:Int, type:Int, offset:Int):Void\n\t{\n\t\tcontext.drawElements(mode, count, type, offset);\n\t}\n\n\tpublic static inline function drawElementsInstanced(mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void\n\t{\n\t\tcontext.drawElementsInstanced(mode, count, type, offset, instanceCount);\n\t}\n\n\tpublic static inline function drawRangeElements(mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void\n\t{\n\t\tcontext.drawRangeElements(mode, start, end, count, type, offset);\n\t}\n\n\tpublic static inline function enable(cap:Int):Void\n\t{\n\t\tcontext.enable(cap);\n\t}\n\n\tpublic static inline function enableVertexAttribArray(index:Int):Void\n\t{\n\t\tcontext.enableVertexAttribArray(index);\n\t}\n\n\tpublic static inline function endQuery(target:Int):Void\n\t{\n\t\tcontext.endQuery(target);\n\t}\n\n\tpublic static inline function endTransformFeedback():Void\n\t{\n\t\tcontext.endTransformFeedback();\n\t}\n\n\tpublic static inline function fenceSync(condition:Int, flags:Int):GLSync\n\t{\n\t\treturn context.fenceSync(condition, flags);\n\t}\n\n\tpublic static inline function finish():Void\n\t{\n\t\tcontext.finish();\n\t}\n\n\tpublic static inline function flush():Void\n\t{\n\t\tcontext.flush();\n\t}\n\n\tpublic static inline function framebufferRenderbuffer(target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:GLRenderbuffer):Void\n\t{\n\t\tcontext.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);\n\t}\n\n\tpublic static inline function framebufferTexture2D(target:Int, attachment:Int, textarget:Int, texture:GLTexture, level:Int):Void\n\t{\n\t\tcontext.framebufferTexture2D(target, attachment, textarget, texture, level);\n\t}\n\n\tpublic static inline function framebufferTextureLayer(target:Int, attachment:Int, texture:GLTexture, level:Int, layer:Int):Void\n\t{\n\t\tcontext.framebufferTextureLayer(target, attachment, texture, level, layer);\n\t}\n\n\tpublic static inline function frontFace(mode:Int):Void\n\t{\n\t\tcontext.frontFace(mode);\n\t}\n\n\tpublic static inline function generateMipmap(target:Int):Void\n\t{\n\t\tcontext.generateMipmap(target);\n\t}\n\n\tpublic static inline function getActiveAttrib(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\treturn context.getActiveAttrib(program, index);\n\t}\n\n\tpublic static inline function getActiveUniform(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\treturn context.getActiveUniform(program, index);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getActiveUniformBlocki(program:GLProgram, uniformBlockIndex:Int, pname:Int):Int\n\t{\n\t\treturn context.getActiveUniformBlocki(program, uniformBlockIndex, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getActiveUniformBlockiv(program:GLProgram, uniformBlockIndex:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getActiveUniformBlockName(program:GLProgram, uniformBlockIndex:Int):String\n\t{\n\t\treturn context.getActiveUniformBlockName(program, uniformBlockIndex);\n\t}\n\n\tpublic static inline function getActiveUniformBlockParameter(program:GLProgram, uniformBlockIndex:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getActiveUniformBlockParameter(program, uniformBlockIndex, pname);\n\t}\n\n\tpublic static inline function getActiveUniforms(program:GLProgram, uniformIndices:Array<Int>, pname:Int):Dynamic\n\t{\n\t\treturn context.getActiveUniforms(program, uniformIndices, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getActiveUniformsiv(program:GLProgram, uniformIndices:Array<Int>, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getActiveUniformsiv(program, uniformIndices, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getAttachedShaders(program:GLProgram):Array<GLShader>\n\t{\n\t\treturn context.getAttachedShaders(program);\n\t}\n\n\tpublic static inline function getAttribLocation(program:GLProgram, name:String):Int\n\t{\n\t\treturn context.getAttribLocation(program, name);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBoolean(pname:Int):Bool\n\t{\n\t\treturn context.getBoolean(pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBooleanv(pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getBooleanv(pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getBufferParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getBufferParameter(target, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBufferParameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn context.getBufferParameteri(target, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBufferParameteri64v(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getBufferParameteri64v(target, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBufferParameteriv(target:Int, pname:Int, data:DataPointer):Void\n\t{\n\t\tcontext.getBufferParameteriv(target, pname, data);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBufferPointerv(target:Int, pname:Int):DataPointer\n\t{\n\t\treturn context.getBufferPointerv(target, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getBufferSubData(target:Int, offset:DataPointer, size:Int, data:DataPointer):Void\n\t{\n\t\tcontext.getBufferSubData(target, offset, size, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function getBufferSubDataWEBGL(target:Int, srcByteOffset:DataPointer, dstData:Dynamic, ?srcOffset:Dynamic, ?length:Int):Void\n\t{\n\t\tcontext.getBufferSubData(target, srcByteOffset, dstData, srcOffset, length);\n\t}\n\t#end\n\n\tpublic static inline function getContextAttributes():GLContextAttributes\n\t{\n\t\treturn context.getContextAttributes();\n\t}\n\n\tpublic static inline function getError():Int\n\t{\n\t\treturn context.getError();\n\t}\n\n\tpublic static inline function getExtension(name:String):Dynamic\n\t{\n\t\treturn context.getExtension(name);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getFloat(pname:Int):Float\n\t{\n\t\treturn context.getFloat(pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getFloatv(pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getFloatv(pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getFragDataLocation(program:GLProgram, name:String):Int\n\t{\n\t\treturn context.getFragDataLocation(program, name);\n\t}\n\n\tpublic static inline function getFramebufferAttachmentParameter(target:Int, attachment:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getFramebufferAttachmentParameter(target, attachment, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getFramebufferAttachmentParameteri(target:Int, attachment:Int, pname:Int):Int\n\t{\n\t\treturn context.getFramebufferAttachmentParameteri(target, attachment, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getFramebufferAttachmentParameteriv(target:Int, attachment:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getFramebufferAttachmentParameteriv(target, attachment, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getIndexedParameter(target:Int, index:Int):Dynamic\n\t{\n\t\treturn context.getIndexedParameter(target, index);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInteger(pname:Int):Int\n\t{\n\t\treturn context.getInteger(pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInteger64(pname:Int):Int64\n\t{\n\t\treturn context.getInteger64(pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInteger64i(pname:Int):Int64\n\t{\n\t\treturn context.getInteger64i(pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInteger64i_v(pname:Int, index:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getInteger64i_v(pname, index, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInteger64v(pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getInteger64v(pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getIntegeri_v(pname:Int, index:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getIntegeri_v(pname, index, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getIntegerv(pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getIntegerv(pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInternalformati(target:Int, internalformat:Int, pname:Int):Int\n\t{\n\t\treturn context.getInternalformati(target, internalformat, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getInternalformativ(target:Int, internalformat:Int, pname:Int, bufSize:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getInternalformativ(target, internalformat, pname, bufSize, params);\n\t}\n\t#end\n\n\tpublic static inline function getInternalformatParameter(target:Int, internalformat:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getInternalformatParameter(target, internalformat, pname);\n\t}\n\n\tpublic static inline function getParameter(pname:Int):Dynamic\n\t{\n\t\treturn context.getParameter(pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getProgrami(program:GLProgram, pname:Int):Int\n\t{\n\t\treturn context.getProgrami(program, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getProgramiv(program:GLProgram, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getProgramiv(program, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getProgramBinary(program:GLProgram, binaryFormat:Int):Bytes\n\t{\n\t\treturn context.getProgramBinary(program, binaryFormat);\n\t}\n\t#end\n\n\tpublic static inline function getProgramInfoLog(program:GLProgram):String\n\t{\n\t\treturn context.getProgramInfoLog(program);\n\t}\n\n\tpublic static inline function getProgramParameter(program:GLProgram, pname:Int):Dynamic\n\t{\n\t\treturn context.getProgramParameter(program, pname);\n\t}\n\n\tpublic static inline function getQuery(target:Int, pname:Int):GLQuery\n\t{\n\t\treturn context.getQuery(target, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getQueryi(target:Int, pname:Int):Int\n\t{\n\t\treturn context.getQueryi(target, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getQueryiv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getQueryiv(target, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getQueryObjectui(query:GLQuery, pname:Int):Int\n\t{\n\t\treturn context.getQueryObjectui(query, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getQueryObjectuiv(query:GLQuery, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getQueryObjectuiv(query, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getQueryParameter(query:GLQuery, pname:Int):Dynamic\n\t{\n\t\treturn context.getQueryParameter(query, pname);\n\t}\n\n\tpublic static inline function getRenderbufferParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getRenderbufferParameter(target, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getRenderbufferParameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn context.getRenderbufferParameteri(target, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getRenderbufferParameteriv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getRenderbufferParameteriv(target, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getSamplerParameter(sampler:GLSampler, pname:Int):Dynamic\n\t{\n\t\treturn context.getSamplerParameter(sampler, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getSamplerParameterf(sampler:GLSampler, pname:Int):Float\n\t{\n\t\treturn context.getSamplerParameterf(sampler, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getSamplerParameterfv(sampler:GLSampler, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getSamplerParameterfv(sampler, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getSamplerParameteri(sampler:GLSampler, pname:Int):Int\n\t{\n\t\treturn context.getSamplerParameteri(sampler, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getSamplerParameteriv(sampler:GLSampler, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getSamplerParameteriv(sampler, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getShaderi(shader:GLShader, pname:Int):Int\n\t{\n\t\treturn context.getShaderi(shader, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getShaderiv(shader:GLShader, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getShaderiv(shader, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getShaderInfoLog(shader:GLShader):String\n\t{\n\t\treturn context.getShaderInfoLog(shader);\n\t}\n\n\tpublic static inline function getShaderParameter(shader:GLShader, pname:Int):Dynamic\n\t{\n\t\treturn context.getShaderParameter(shader, pname);\n\t}\n\n\tpublic static inline function getShaderPrecisionFormat(shadertype:Int, precisiontype:Int):GLShaderPrecisionFormat\n\t{\n\t\treturn context.getShaderPrecisionFormat(shadertype, precisiontype);\n\t}\n\n\tpublic static inline function getShaderSource(shader:GLShader):String\n\t{\n\t\treturn context.getShaderSource(shader);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getString(name:Int):String\n\t{\n\t\treturn context.getString(name);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getStringi(name:Int, index:Int):String\n\t{\n\t\treturn context.getStringi(name, index);\n\t}\n\t#end\n\n\tpublic static inline function getSupportedExtensions():Array<String>\n\t{\n\t\treturn context.getSupportedExtensions();\n\t}\n\n\tpublic static inline function getSyncParameter(sync:GLSync, pname:Int):Dynamic\n\t{\n\t\treturn context.getSyncParameter(sync, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getSyncParameteri(sync:GLSync, pname:Int):Int\n\t{\n\t\treturn context.getSyncParameteri(sync, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getSyncParameteriv(sync:GLSync, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getSyncParameteriv(sync, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getTexParameter(target:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getTexParameter(target, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getTexParameterf(target:Int, pname:Int):Float\n\t{\n\t\treturn context.getTexParameterf(target, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getTexParameterfv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getTexParameterfv(target, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getTexParameteri(target:Int, pname:Int):Int\n\t{\n\t\treturn context.getTexParameteri(target, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getTexParameteriv(target:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getTexParameteriv(target, pname, params);\n\t}\n\t#end\n\n\tpublic static inline function getTransformFeedbackVarying(program:GLProgram, index:Int):GLActiveInfo\n\t{\n\t\treturn context.getTransformFeedbackVarying(program, index);\n\t}\n\n\tpublic static inline function getUniform(program:GLProgram, location:GLUniformLocation):Dynamic\n\t{\n\t\treturn context.getUniform(program, location);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getUniformf(program:GLProgram, location:GLUniformLocation):Float\n\t{\n\t\treturn context.getUniformf(program, location);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getUniformfv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n\t{\n\t\tcontext.getUniformfv(program, location, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getUniformi(program:GLProgram, location:GLUniformLocation):Int\n\t{\n\t\treturn context.getUniformi(program, location);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getUniformiv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n\t{\n\t\tcontext.getUniformiv(program, location, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getUniformui(program:GLProgram, location:GLUniformLocation):Int\n\t{\n\t\treturn context.getUniformui(program, location);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getUniformuiv(program:GLProgram, location:GLUniformLocation, params:DataPointer):Void\n\t{\n\t\tcontext.getUniformuiv(program, location, params);\n\t}\n\t#end\n\n\tpublic static inline function getUniformBlockIndex(program:GLProgram, uniformBlockName:String):Int\n\t{\n\t\treturn context.getUniformBlockIndex(program, uniformBlockName);\n\t}\n\n\tpublic static inline function getUniformIndices(program:GLProgram, uniformNames:Array<String>):Array<Int>\n\t{\n\t\treturn context.getUniformIndices(program, uniformNames);\n\t}\n\n\tpublic static inline function getUniformLocation(program:GLProgram, name:String):GLUniformLocation\n\t{\n\t\treturn context.getUniformLocation(program, name);\n\t}\n\n\tpublic static inline function getVertexAttrib(index:Int, pname:Int):Dynamic\n\t{\n\t\treturn context.getVertexAttrib(index, pname);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribf(index:Int, pname:Int):Float\n\t{\n\t\treturn context.getVertexAttribf(index, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribfv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getVertexAttribfv(index, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribi(index:Int, pname:Int):Int\n\t{\n\t\treturn context.getVertexAttribi(index, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribIi(index:Int, pname:Int):Int\n\t{\n\t\treturn context.getVertexAttribIi(index, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribIiv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getVertexAttribIiv(index, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribIui(index:Int, pname:Int):Int\n\t{\n\t\treturn context.getVertexAttribIui(index, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribIuiv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getVertexAttribIuiv(index, pname, params);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribiv(index:Int, pname:Int, params:DataPointer):Void\n\t{\n\t\tcontext.getVertexAttribiv(index, pname, params);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function getVertexAttribOffset(index:Int, pname:Int):DataPointer\n\t{\n\t\treturn context.getVertexAttribOffset(index, pname);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function getVertexAttribPointerv(index:Int, pname:Int):DataPointer\n\t{\n\t\treturn context.getVertexAttribPointerv(index, pname);\n\t}\n\t#end\n\n\tpublic static inline function hint(target:Int, mode:Int):Void\n\t{\n\t\tcontext.hint(target, mode);\n\t}\n\n\tpublic static inline function invalidateFramebuffer(target:Int, attachments:Array<Int>):Void\n\t{\n\t\tcontext.invalidateFramebuffer(target, attachments);\n\t}\n\n\tpublic static inline function invalidateSubFramebuffer(target:Int, attachments:Array<Int>, x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.invalidateSubFramebuffer(target, attachments, x, y, width, height);\n\t}\n\n\tpublic static inline function isBuffer(buffer:GLBuffer):Bool\n\t{\n\t\treturn context.isBuffer(buffer);\n\t}\n\n\tpublic static inline function isContextLost():Bool\n\t{\n\t\treturn context.isContextLost();\n\t}\n\n\tpublic static inline function isEnabled(cap:Int):Bool\n\t{\n\t\treturn context.isEnabled(cap);\n\t}\n\n\tpublic static inline function isFramebuffer(framebuffer:GLFramebuffer):Bool\n\t{\n\t\treturn context.isFramebuffer(framebuffer);\n\t}\n\n\tpublic static inline function isProgram(program:GLProgram):Bool\n\t{\n\t\treturn context.isProgram(program);\n\t}\n\n\tpublic static inline function isQuery(query:GLQuery):Bool\n\t{\n\t\treturn context.isQuery(query);\n\t}\n\n\tpublic static inline function isRenderbuffer(renderbuffer:GLRenderbuffer):Bool\n\t{\n\t\treturn context.isRenderbuffer(renderbuffer);\n\t}\n\n\tpublic static inline function isSampler(sampler:GLSampler):Bool\n\t{\n\t\treturn context.isSampler(sampler);\n\t}\n\n\tpublic static inline function isShader(shader:GLShader):Bool\n\t{\n\t\treturn context.isShader(shader);\n\t}\n\n\tpublic static inline function isSync(sync:GLSync):Bool\n\t{\n\t\treturn context.isSync(sync);\n\t}\n\n\tpublic static inline function isTexture(texture:GLTexture):Bool\n\t{\n\t\treturn context.isTexture(texture);\n\t}\n\n\tpublic static inline function isTransformFeedback(transformFeedback:GLTransformFeedback):Bool\n\t{\n\t\treturn context.isTransformFeedback(transformFeedback);\n\t}\n\n\tpublic static inline function isVertexArray(vertexArray:GLVertexArrayObject):Bool\n\t{\n\t\treturn context.isVertexArray(vertexArray);\n\t}\n\n\tpublic static inline function lineWidth(width:Float):Void\n\t{\n\t\tcontext.lineWidth(width);\n\t}\n\n\tpublic static inline function linkProgram(program:GLProgram):Void\n\t{\n\t\tcontext.linkProgram(program);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function mapBufferRange(target:Int, offset:DataPointer, length:Int, access:Int):DataPointer\n\t{\n\t\treturn context.mapBufferRange(target, offset, length, access);\n\t}\n\t#end\n\n\tpublic static inline function pauseTransformFeedback():Void\n\t{\n\t\tcontext.pauseTransformFeedback();\n\t}\n\n\tpublic static inline function pixelStorei(pname:Int, param:Int):Void\n\t{\n\t\tcontext.pixelStorei(pname, param);\n\t}\n\n\tpublic static inline function polygonOffset(factor:Float, units:Float):Void\n\t{\n\t\tcontext.polygonOffset(factor, units);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function programBinary(program:GLProgram, binaryFormat:Int, binary:DataPointer, length:Int):Void\n\t{\n\t\tcontext.programBinary(program, binaryFormat, binary, length);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function programParameteri(program:GLProgram, pname:Int, value:Int):Void\n\t{\n\t\tcontext.programParameteri(program, pname, value);\n\t}\n\t#end\n\n\tpublic static inline function readBuffer(src:Int):Void\n\t{\n\t\tcontext.readBuffer(src);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function readPixels(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:BytePointer):Void\n\t{\n\t\tcontext.readPixels(x, y, width, height, format, type, pixels);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function readPixelsWEBGL(x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:Dynamic, ?dstOffset:Int):Void\n\t{\n\t\tcontext.readPixels(x, y, width, height, format, type, pixels, dstOffset);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function releaseShaderCompiler():Void\n\t{\n\t\tcontext.releaseShaderCompiler();\n\t}\n\t#end\n\n\tpublic static inline function renderbufferStorage(target:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.renderbufferStorage(target, internalformat, width, height);\n\t}\n\n\tpublic static inline function renderbufferStorageMultisample(target:Int, samples:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.renderbufferStorageMultisample(target, samples, internalformat, width, height);\n\t}\n\n\tpublic static inline function resumeTransformFeedback():Void\n\t{\n\t\tcontext.resumeTransformFeedback();\n\t}\n\n\tpublic static inline function sampleCoverage(value:Float, invert:Bool):Void\n\t{\n\t\tcontext.sampleCoverage(value, invert);\n\t}\n\n\tpublic static inline function samplerParameterf(sampler:GLSampler, pname:Int, param:Float):Void\n\t{\n\t\tcontext.samplerParameterf(sampler, pname, param);\n\t}\n\n\tpublic static inline function samplerParameteri(sampler:GLSampler, pname:Int, param:Int):Void\n\t{\n\t\tcontext.samplerParameteri(sampler, pname, param);\n\t}\n\n\tpublic static inline function scissor(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.scissor(x, y, width, height);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function shaderBinary(shaders:Array<GLShader>, binaryformat:Int, binary:DataPointer, length:Int):Void\n\t{\n\t\tcontext.shaderBinary(shaders, binaryformat, binary, length);\n\t}\n\t#end\n\n\tpublic static inline function shaderSource(shader:GLShader, source:String):Void\n\t{\n\t\tcontext.shaderSource(shader, source);\n\t}\n\n\tpublic static inline function stencilFunc(func:Int, ref:Int, mask:Int):Void\n\t{\n\t\tcontext.stencilFunc(func, ref, mask);\n\t}\n\n\tpublic static inline function stencilFuncSeparate(face:Int, func:Int, ref:Int, mask:Int):Void\n\t{\n\t\tcontext.stencilFuncSeparate(face, func, ref, mask);\n\t}\n\n\tpublic static inline function stencilMask(mask:Int):Void\n\t{\n\t\tcontext.stencilMask(mask);\n\t}\n\n\tpublic static inline function stencilMaskSeparate(face:Int, mask:Int):Void\n\t{\n\t\tcontext.stencilMaskSeparate(face, mask);\n\t}\n\n\tpublic static inline function stencilOp(fail:Int, zfail:Int, zpass:Int):Void\n\t{\n\t\tcontext.stencilOp(fail, zfail, zpass);\n\t}\n\n\tpublic static inline function stencilOpSeparate(face:Int, fail:Int, zfail:Int, zpass:Int):Void\n\t{\n\t\tcontext.stencilOpSeparate(face, fail, zfail, zpass);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function texImage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, format:Int, type:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\tcontext.texImage2D(target, level, internalformat, width, height, border, format, type, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function texImage2DWEBGL(target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Dynamic, ?format:Int, ?type:Int,\n\t\t\t?srcData:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.texImage2D(target, level, internalformat, width, height, border, format, type, srcData, srcOffset);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function texImage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int,\n\t\t\tdata:DataPointer):Void\n\t{\n\t\tcontext.texImage3D(target, level, internalformat, width, height, depth, border, format, type, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function texImage3DWEBGL(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int,\n\t\t\ttype:Int, srcData:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.texImage3D(target, level, internalformat, width, height, depth, border, format, type, srcData, srcOffset);\n\t}\n\t#end\n\n\tpublic static inline function texStorage2D(target:Int, level:Int, internalformat:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.texStorage2D(target, level, internalformat, width, height);\n\t}\n\n\tpublic static inline function texStorage3D(target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void\n\t{\n\t\tcontext.texStorage3D(target, level, internalformat, width, height, depth);\n\t}\n\n\tpublic static inline function texParameterf(target:Int, pname:Int, param:Float):Void\n\t{\n\t\tcontext.texParameterf(target, pname, param);\n\t}\n\n\tpublic static inline function texParameteri(target:Int, pname:Int, param:Int):Void\n\t{\n\t\tcontext.texParameteri(target, pname, param);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function texSubImage2D(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int,\n\t\t\tpixels:ArrayBufferView):Void\n\t{\n\t\tcontext.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function texSubImage2DWEBGL(target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Dynamic, ?type:Int,\n\t\t\t?srcData:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, srcData, srcOffset);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function texSubImage3D(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int,\n\t\t\ttype:Int, data:DataPointer):Void\n\t{\n\t\tcontext.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function texSubImage3DWEBGL(target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int,\n\t\t\tformat:Int, type:Int, source:Dynamic, ?srcOffset:Int):Void\n\t{\n\t\tcontext.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, source, srcOffset);\n\t}\n\t#end\n\n\tpublic static inline function transformFeedbackVaryings(program:GLProgram, varyings:Array<String>, bufferMode:Int):Void\n\t{\n\t\tcontext.transformFeedbackVaryings(program, varyings, bufferMode);\n\t}\n\n\tpublic static inline function uniform1f(location:GLUniformLocation, v0:Float):Void\n\t{\n\t\tcontext.uniform1f(location, v0);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform1fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform1fv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform1fvWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform1fv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform1i(location:GLUniformLocation, v0:Int):Void\n\t{\n\t\tcontext.uniform1i(location, v0);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform1iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform1iv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform1ivWEBGL(location:GLUniformLocation, ?data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform1iv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform1ui(location:GLUniformLocation, v0:Int):Void\n\t{\n\t\tcontext.uniform1ui(location, v0);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform1uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform1uiv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform1uivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform1uiv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform2f(location:GLUniformLocation, v0:Float, v1:Float):Void\n\t{\n\t\tcontext.uniform2f(location, v0, v1);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform2fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform2fv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform2fvWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform2fv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform2i(location:GLUniformLocation, x:Int, y:Int):Void\n\t{\n\t\tcontext.uniform2i(location, x, y);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform2iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform2iv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform2ivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform2iv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform2ui(location:GLUniformLocation, x:Int, y:Int):Void\n\t{\n\t\tcontext.uniform2ui(location, x, y);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform2uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform2uiv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform2uivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform2uiv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform3f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float):Void\n\t{\n\t\tcontext.uniform3f(location, v0, v1, v2);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform3fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform3fv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform3fvWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform3fv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform3i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n\t{\n\t\tcontext.uniform3i(location, v0, v1, v2);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform3iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform3iv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform3ivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform3iv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform3ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int):Void\n\t{\n\t\tcontext.uniform3ui(location, v0, v1, v2);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform3uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform3uiv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform3uivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform3uiv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform4f(location:GLUniformLocation, v0:Float, v1:Float, v2:Float, v3:Float):Void\n\t{\n\t\tcontext.uniform4f(location, v0, v1, v2, v3);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform4fv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform4fv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform4fvWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform4fv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform4i(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\tcontext.uniform4i(location, v0, v1, v2, v3);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform4iv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform4iv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform4ivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform4iv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniform4ui(location:GLUniformLocation, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\tcontext.uniform4ui(location, v0, v1, v2, v3);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniform4uiv(location:GLUniformLocation, count:Int, v:DataPointer):Void\n\t{\n\t\tcontext.uniform4uiv(location, count, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniform4uivWEBGL(location:GLUniformLocation, data:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniform4uiv(location, data, srcOffset, srcLength);\n\t}\n\t#end\n\n\tpublic static inline function uniformBlockBinding(program:GLProgram, uniformBlockIndex:Int, uniformBlockBinding:Int):Void\n\t{\n\t\tcontext.uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);\n\t}\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix2fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix2fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix2fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix2x3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix2x3fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix2x3fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix2x3fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix2x4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix2x4fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix2x4fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix2x4fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix3fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix3fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix3fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix3x2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix3x2fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix3x2fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix3x2fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix3x4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix3x4fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix3x4fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix3x4fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix4fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix4fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix4fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix4fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix4x2fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix4x2fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix4x2fvWEBGL(location:GLUniformLocation, transpose:Bool, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix4x2fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function uniformMatrix4x3fv(location:GLUniformLocation, count:Int, transpose:Bool, v:DataPointer):Void\n\t{\n\t\tcontext.uniformMatrix4x3fv(location, count, transpose, v);\n\t}\n\t#end\n\n\t#if lime_webgl\n\tpublic static inline function uniformMatrix4x3fvWEBGL(location:GLUniformLocation, transpose:Dynamic, v:Dynamic, ?srcOffset:Int, ?srcLength:Int):Void\n\t{\n\t\tcontext.uniformMatrix4x3fv(location, transpose, v, srcOffset, srcLength);\n\t}\n\t#end\n\n\t#if (lime_opengl || lime_opengles)\n\tpublic static inline function unmapBuffer(target:Int):Bool\n\t{\n\t\treturn context.unmapBuffer(target);\n\t}\n\t#end\n\n\tpublic static inline function useProgram(program:GLProgram):Void\n\t{\n\t\tcontext.useProgram(program);\n\t}\n\n\tpublic static inline function validateProgram(program:GLProgram):Void\n\t{\n\t\tcontext.validateProgram(program);\n\t}\n\n\tpublic static inline function vertexAttrib1f(index:Int, v0:Float):Void\n\t{\n\t\tcontext.vertexAttrib1f(index, v0);\n\t}\n\n\tpublic static inline function vertexAttrib1fv(index:Int, v:#if (!js || !html5 || doc_gen) DataPointer #else Dynamic #end):Void\n\t{\n\t\t#if !doc_gen\n\t\tcontext.vertexAttrib1fv(index, v);\n\t\t#end\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function vertexAttrib1fvWEBGL(index:Int, v:Dynamic):Void\n\t{\n\t\tcontext.vertexAttrib1fv(index, v);\n\t}\n\t#end\n\n\tpublic static inline function vertexAttrib2f(index:Int, v0:Float, v1:Float):Void\n\t{\n\t\tcontext.vertexAttrib2f(index, v0, v1);\n\t}\n\n\tpublic static inline function vertexAttrib2fv(index:Int, v:#if (!js || !html5 || doc_gen) DataPointer #else Dynamic #end):Void\n\t{\n\t\t#if !doc_gen\n\t\tcontext.vertexAttrib2fv(index, v);\n\t\t#end\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function vertexAttrib2fvWEBGL(index:Int, v:Dynamic):Void\n\t{\n\t\tcontext.vertexAttrib2fv(index, v);\n\t}\n\t#end\n\n\tpublic static inline function vertexAttrib3f(index:Int, v0:Float, v1:Float, v2:Float):Void\n\t{\n\t\tcontext.vertexAttrib3f(index, v0, v1, v2);\n\t}\n\n\tpublic static inline function vertexAttrib3fv(index:Int, v:#if (!js || !html5 || doc_gen) DataPointer #else Dynamic #end):Void\n\t{\n\t\t#if !doc_gen\n\t\tcontext.vertexAttrib3fv(index, v);\n\t\t#end\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function vertexAttrib3fvWEBGL(index:Int, v:Dynamic):Void\n\t{\n\t\tcontext.vertexAttrib3fv(index, v);\n\t}\n\t#end\n\n\tpublic static inline function vertexAttrib4f(index:Int, v0:Float, v1:Float, v2:Float, v3:Float):Void\n\t{\n\t\tcontext.vertexAttrib4f(index, v0, v1, v2, v3);\n\t}\n\n\tpublic static inline function vertexAttrib4fv(index:Int, v:#if (!js || !html5 || doc_gen) DataPointer #else Dynamic #end):Void\n\t{\n\t\t#if !doc_gen\n\t\tcontext.vertexAttrib4fv(index, v);\n\t\t#end\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function vertexAttrib4fvWEBGL(index:Int, v:Dynamic):Void\n\t{\n\t\tcontext.vertexAttrib4fv(index, v);\n\t}\n\t#end\n\n\tpublic static inline function vertexAttribDivisor(index:Int, divisor:Int):Void\n\t{\n\t\tcontext.vertexAttribDivisor(index, divisor);\n\t}\n\n\tpublic static inline function vertexAttribI4i(index:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\tcontext.vertexAttribI4i(index, v0, v1, v2, v3);\n\t}\n\n\tpublic static inline function vertexAttribI4iv(index:Int, v:#if (!js || !html5 || doc_gen) DataPointer #else Dynamic #end):Void\n\t{\n\t\t#if !doc_gen\n\t\tcontext.vertexAttribI4iv(index, v);\n\t\t#end\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function vertexAttribI4ivWEBGL(index:Int, v:Dynamic):Void\n\t{\n\t\tcontext.vertexAttribI4iv(index, v);\n\t}\n\t#end\n\n\tpublic static inline function vertexAttribI4ui(index:Int, v0:Int, v1:Int, v2:Int, v3:Int):Void\n\t{\n\t\tcontext.vertexAttribI4ui(index, v0, v1, v2, v3);\n\t}\n\n\tpublic static inline function vertexAttribI4uiv(index:Int, v:#if (!js || !html5 || doc_gen) DataPointer #else Dynamic #end):Void\n\t{\n\t\t#if !doc_gen\n\t\tcontext.vertexAttribI4uiv(index, v);\n\t\t#end\n\t}\n\n\t#if lime_webgl\n\tpublic static inline function vertexAttribI4uivWEBGL(index:Int, v:Dynamic):Void\n\t{\n\t\tcontext.vertexAttribI4uiv(index, v);\n\t}\n\t#end\n\n\tpublic static inline function vertexAttribIPointer(index:Int, size:Int, type:Int, stride:Int, offset:DataPointer):Void\n\t{\n\t\tcontext.vertexAttribIPointer(index, size, type, stride, offset);\n\t}\n\n\tpublic static inline function vertexAttribPointer(index:Int, size:Int, type:Int, normalized:Bool, stride:Int, offset:DataPointer):Void\n\t{\n\t\tcontext.vertexAttribPointer(index, size, type, normalized, stride, offset);\n\t}\n\n\tpublic static inline function viewport(x:Int, y:Int, width:Int, height:Int):Void\n\t{\n\t\tcontext.viewport(x, y, width, height);\n\t}\n\n\tpublic static inline function waitSync(sync:GLSync, flags:Int, timeout:#if (!js || !html5 || doc_gen) Int64 #else Dynamic #end):Void\n\t{\n\t\tcontext.waitSync(sync, flags, timeout);\n\t}\n\n\tprivate static inline function __getObjectID(object:#if (!js || !html5 || doc_gen) GLObject #else Dynamic #end):Int\n\t{\n\t\treturn (object == null) ? 0 : @:privateAccess object.id;\n\t}\n}\n\n#if (!js || !html5 || doc_gen)\n@:access(lime._internal.backend.native.NativeCFFI)\n#if hl\n@:keep\n#end\n@:dox(hide) @:noCompletion class GLObject\n{\n\t@:noCompletion private var id:Int;\n\t@:noCompletion private var ptr:#if (lime_cffi && (lime_opengl || lime_opengles) && !macro) CFFIPointer #else Dynamic #end;\n\t@:noCompletion private var refs:Array<GLObject>;\n\n\t@:noCompletion private function new(id:Int)\n\t{\n\t\tthis.id = id;\n\t}\n\n\tpublic static function fromInt(type:GLObjectType, id:Int):GLObject\n\t{\n\t\tif (id == 0) return null;\n\n\t\t#if (lime_cffi && (lime_opengl || lime_opengles) && !macro)\n\t\tvar object = NativeCFFI.lime_gl_object_from_id(id, type);\n\n\t\tif (object != null)\n\t\t{\n\t\t\treturn object;\n\t\t}\n\n\t\tobject = new GLObject(id);\n\t\tobject.ptr = NativeCFFI.lime_gl_object_register(id, type, object);\n\t\treturn object;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n\n@:dox(hide) @:noCompletion #if (haxe_ver >= 4.0) enum #else @:enum #end abstract GLObjectType(Int) to Int\n{\n\tvar UNKNOWN = 0;\n\tvar PROGRAM = 1;\n\tvar SHADER = 2;\n\tvar BUFFER = 3;\n\tvar TEXTURE = 4;\n\tvar FRAMEBUFFER = 5;\n\tvar RENDERBUFFER = 6;\n\tvar VERTEX_ARRAY_OBJECT = 7;\n\tvar QUERY = 8;\n\tvar SAMPLER = 9;\n\tvar SYNC = 10;\n\tvar TRANSFORM_FEEDBACK = 11;\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLActiveInfo.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if (!lime_webgl || doc_gen)\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\ntypedef GLActiveInfo =\n{\n\tsize:Int,\n\ttype:Int,\n\tname:String\n}\n#else\ntypedef GLActiveInfo = js.html.webgl.ActiveInfo;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLBuffer.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLBuffer(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLBuffer\n\t{\n\t\treturn GLObject.fromInt(BUFFER, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\ntypedef GLBuffer = js.html.webgl.Buffer;\n#else\ntypedef GLBuffer = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLContextAttributes.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if (!lime_webgl || doc_gen)\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\ntypedef GLContextAttributes =\n{\n\talpha:Bool,\n\tdepth:Bool,\n\tstencil:Bool,\n\tantialias:Bool,\n\tpremultipliedAlpha:Bool,\n\tpreserveDrawingBuffer:Bool\n}\n#else\ntypedef GLContextAttributes = js.html.webgl.ContextAttributes;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLFramebuffer.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLFramebuffer(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLFramebuffer\n\t{\n\t\treturn GLObject.fromInt(FRAMEBUFFER, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\ntypedef GLFramebuffer = js.html.webgl.Framebuffer;\n#else\ntypedef GLFramebuffer = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLProgram.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if !doc_gen\nimport lime.graphics.opengl.GL;\nimport lime.graphics.opengl.GLShader;\nimport lime.graphics.WebGLRenderContext;\nimport lime.utils.Log;\n\n#if !lime_webgl\n@:forward(id, refs) abstract GLProgram(GLObject) from GLObject to GLObject\n{\n#else\n@:forward() abstract GLProgram(js.html.webgl.Program) from js.html.webgl.Program to js.html.webgl.Program\n{\n#end\n\n#if !lime_webgl\n@:from private static function fromInt(id:Int):GLProgram\n{\n\treturn GLObject.fromInt(PROGRAM, id);\n}\n#end\n\npublic static function fromSources(gl:WebGLRenderContext, vertexSource:String, fragmentSource:String):GLProgram\n{\n\tvar vertexShader = GLShader.fromSource(gl, vertexSource, gl.VERTEX_SHADER);\n\tvar fragmentShader = GLShader.fromSource(gl, fragmentSource, gl.FRAGMENT_SHADER);\n\n\tvar program = gl.createProgram();\n\tgl.attachShader(program, vertexShader);\n\tgl.attachShader(program, fragmentShader);\n\tgl.linkProgram(program);\n\n\tif (gl.getProgramParameter(program, GL.LINK_STATUS) == 0)\n\t{\n\t\tvar message = \"Unable to initialize the shader program\";\n\t\tmessage += \"\\n\" + GL.getProgramInfoLog(program);\n\t\tLog.error(message);\n\t}\n\n\treturn program;\n}\n}\n#else\n@:forward abstract GLProgram(Dynamic) from Dynamic to Dynamic\n{\n\tpublic static function fromSources(gl:Dynamic, vertexSource:String, fragmentSource:String):GLProgram\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLQuery.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLQuery(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLQuery\n\t{\n\t\treturn GLObject.fromInt(QUERY, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\n@:native(\"WebGLQuery\")\nextern class GLQuery {}\n#else\ntypedef GLQuery = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLRenderbuffer.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLRenderbuffer(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLRenderbuffer\n\t{\n\t\treturn GLObject.fromInt(RENDERBUFFER, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\ntypedef GLRenderbuffer = js.html.webgl.Renderbuffer;\n#else\ntypedef GLRenderbuffer = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLSampler.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLSampler(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLSampler\n\t{\n\t\treturn GLObject.fromInt(SAMPLER, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\n@:native(\"WebGLSampler\")\nextern class GLSampler {}\n#else\ntypedef GLSampler = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLShader.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if !doc_gen\nimport lime.graphics.opengl.GL;\nimport lime.graphics.WebGLRenderContext;\nimport lime.utils.Log;\n\n#if !lime_webgl\n@:forward(id) abstract GLShader(GLObject) from GLObject to GLObject\n{\n#else\n@:forward() abstract GLShader(js.html.webgl.Shader) from js.html.webgl.Shader to js.html.webgl.Shader\n{\n#end\n\n#if !lime_webgl\n@:from private static function fromInt(id:Int):GLShader\n{\n\treturn GLObject.fromInt(SHADER, id);\n}\n#end\n\npublic static function fromSource(gl:WebGLRenderContext, source:String, type:Int):GLShader\n{\n\tvar shader = gl.createShader(type);\n\tgl.shaderSource(shader, source);\n\tgl.compileShader(shader);\n\tvar shaderInfoLog = gl.getShaderInfoLog(shader);\n\tvar compileStatus = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n\tif (shaderInfoLog != null || compileStatus == 0)\n\t{\n\t\tvar message;\n\n\t\tif (compileStatus == 0) message = \"Error \";\n\t\telse\n\t\t\tmessage = \"Info \";\n\n\t\tif (type == gl.VERTEX_SHADER) message = \"compiling vertex shader\";\n\t\telse if (type == gl.FRAGMENT_SHADER) message = \"compiling fragment shader\";\n\t\telse\n\t\t\tmessage = \"compiling unknown shader type\";\n\n\t\tmessage += \"\\n\" + shaderInfoLog;\n\n\t\tif (compileStatus == 0) Log.error(message);\n\t\telse if (shaderInfoLog != null) Log.debug(message);\n\t}\n\n\treturn shader;\n}\n}\n#else\n@:forward abstract GLShader(Dynamic) from Dynamic to Dynamic\n{\n\tpublic static function fromSources(gl:Dynamic, source:String, type:Int):GLShader\n\t{\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLShaderPrecisionFormat.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if (!lime_webgl || doc_gen)\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\ntypedef GLShaderPrecisionFormat =\n{\n\trangeMin:Int,\n\trangeMax:Int,\n\tprecision:Int\n};\n\n#else\ntypedef GLShaderPrecisionFormat = js.html.webgl.ShaderPrecisionFormat;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLSync.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract GLSync(CFFIPointer) from CFFIPointer to CFFIPointer {}\n#elseif (lime_webgl && !doc_gen)\n@:native(\"WebGLSync\")\nextern class GLSync {}\n#else\ntypedef GLSync = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLTexture.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLTexture(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLTexture\n\t{\n\t\treturn GLObject.fromInt(TEXTURE, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\ntypedef GLTexture = js.html.webgl.Texture;\n#else\ntypedef GLTexture = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLTransformFeedback.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLTransformFeedback(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLTransformFeedback\n\t{\n\t\treturn GLObject.fromInt(TRANSFORM_FEEDBACK, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\n@:native(\"WebGLTransformFeedback\")\nextern class GLTransformFeedback {}\n#else\ntypedef GLTransformFeedback = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLUniformLocation.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if (!lime_webgl || doc_gen)\ntypedef GLUniformLocation = Int;\n#else\ntypedef GLUniformLocation = js.html.webgl.UniformLocation;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/GLVertexArrayObject.hx",
    "content": "package lime.graphics.opengl;\n\n#if (!lime_doc_gen || lime_opengl || lime_opengles || lime_webgl)\n#if ((lime_opengl || lime_opengles) && !doc_gen)\nimport lime.graphics.opengl.GL;\n\n@:forward(id)\nabstract GLVertexArrayObject(GLObject) from GLObject to GLObject\n{\n\t@:from private static function fromInt(id:Int):GLVertexArrayObject\n\t{\n\t\treturn GLObject.fromInt(VERTEX_ARRAY_OBJECT, id);\n\t}\n}\n#elseif (lime_webgl && !doc_gen)\n@:native(\"WebGLVertexArrayObject\")\nextern class GLVertexArrayObject {}\n#else\ntypedef GLVertexArrayObject = Dynamic;\n#end\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/AMD_compressed_3DC_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class AMD_compressed_3DC_texture\n{\n\tpublic var _3DC_X_AMD = 0x87F9;\n\tpublic var _3DC_XY_AMD = 0x87FA;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/AMD_compressed_ATC_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class AMD_compressed_ATC_texture\n{\n\tpublic var ATC_RGB_AMD = 0x8C92;\n\tpublic var ATC_RGBA_EXPLICIT_ALPHA_AMD = 0x8C93;\n\tpublic var ATC_RGBA_INTERPOLATED_ALPHA_AMD = 0x87EE;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/AMD_performance_monitor.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class AMD_performance_monitor\n{\n\tpublic var COUNTER_TYPE_AMD = 0x8BC0;\n\tpublic var COUNTER_RANGE_AMD = 0x8BC1;\n\tpublic var UNSIGNED_INT64_AMD = 0x8BC2;\n\tpublic var PERCENTAGE_AMD = 0x8BC3;\n\tpublic var PERFMON_RESULT_AVAILABLE_AMD = 0x8BC4;\n\tpublic var PERFMON_RESULT_SIZE_AMD = 0x8BC5;\n\tpublic var PERFMON_RESULT_AMD = 0x8BC6;\n\n\t@:noCompletion private function new() {}\n\n\t// public function getPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);\n\t// public function getPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);\n\t// public function getPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);\n\t// public function getPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);\n\t// public function getPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data);\n\t// public function genPerfMonitorsAMD (GLsizei n, GLuint *monitors);\n\t// public function deletePerfMonitorsAMD (GLsizei n, GLuint *monitors);\n\t// public function selectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);\n\t// public function beginPerfMonitorAMD (GLuint monitor);\n\t// public function endPerfMonitorAMD (GLuint monitor);\n\t// public function getPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/AMD_program_binary_Z400.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class AMD_program_binary_Z400\n{\n\tpublic var Z400_BINARY_AMD = 0x8740;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_framebuffer_blit.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_framebuffer_blit\n{\n\tpublic var READ_FRAMEBUFFER_ANGLE = 0x8CA8;\n\tpublic var DRAW_FRAMEBUFFER_ANGLE = 0x8CA9;\n\tpublic var DRAW_FRAMEBUFFER_BINDING_ANGLE = 0x8CA6;\n\tpublic var READ_FRAMEBUFFER_BINDING_ANGLE = 0x8CAA;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_framebuffer_multisample.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_framebuffer_multisample\n{\n\tpublic var RENDERBUFFER_SAMPLES_ANGLE = 0x8CAB;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE = 0x8D56;\n\tpublic var MAX_SAMPLES_ANGLE = 0x8D57;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_instanced_arrays.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class ANGLE_instanced_arrays\n{\n\tpublic var VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 0x88FE;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\n\t// GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);\n\t// GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor);\n\tpublic function drawArraysInstancedANGLE(mode:Int, first:Int, count:Int, primcount:Int):Void {}\n\n\tpublic function drawElementsInstancedANGLE(mode:Int, count:Int, type:Int, offset:Int, primcount:Int):Void {}\n\n\tpublic function vertexAttribDivisorANGLE(index:Int, divisor:Int):Void {}\n}\n#else\n@:native(\"ANGLE_instanced_arrays\")\n@:noCompletion extern class ANGLE_instanced_arrays\n{\n\tpublic var VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:Int;\n\tpublic function drawArraysInstancedANGLE(mode:Int, first:Int, count:Int, primcount:Int):Void;\n\tpublic function drawElementsInstancedANGLE(mode:Int, count:Int, type:Int, offset:Int, primcount:Int):Void;\n\tpublic function vertexAttribDivisorANGLE(index:Int, divisor:Int):Void;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_pack_reverse_row_order.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_pack_reverse_row_order\n{\n\tpublic var PACK_REVERSE_ROW_ORDER_ANGLE = 0x93A4;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_texture_compression_dxt3.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_texture_compression_dxt3\n{\n\tpublic var COMPRESSED_RGBA_S3TC_DXT3_ANGLE = 0x83F2;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_texture_compression_dxt5.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_texture_compression_dxt5\n{\n\tpublic var COMPRESSED_RGBA_S3TC_DXT5_ANGLE = 0x83F3;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_texture_usage.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_texture_usage\n{\n\tpublic var TEXTURE_USAGE_ANGLE = 0x93A2;\n\tpublic var FRAMEBUFFER_ATTACHMENT_ANGLE = 0x93A3;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ANGLE_translated_shader_source.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ANGLE_translated_shader_source\n{\n\tpublic var TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE = 0x93A0;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/APPLE_copy_texture_levels.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class APPLE_copy_texture_levels\n{\n\t@:noCompletion private function new() {}\n\t// GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/APPLE_framebuffer_multisample.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class APPLE_framebuffer_multisample\n{\n\tpublic var RENDERBUFFER_SAMPLES_APPLE = 0x8CAB;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE = 0x8D56;\n\tpublic var MAX_SAMPLES_APPLE = 0x8D57;\n\tpublic var READ_FRAMEBUFFER_APPLE = 0x8CA8;\n\tpublic var DRAW_FRAMEBUFFER_APPLE = 0x8CA9;\n\tpublic var DRAW_FRAMEBUFFER_BINDING_APPLE = 0x8CA6;\n\tpublic var READ_FRAMEBUFFER_BINDING_APPLE = 0x8CAA;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\n\t// GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/APPLE_rgb_422.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class APPLE_rgb_422\n{\n\tpublic var RGB_422_APPLE = 0x8A1F;\n\tpublic var UNSIGNED_SHORT_8_8_APPLE = 0x85BA;\n\tpublic var UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/APPLE_sync.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class APPLE_sync\n{\n\tpublic var SYNC_OBJECT_APPLE = 0x8A53;\n\tpublic var MAX_SERVER_WAIT_TIMEOUT_APPLE = 0x9111;\n\tpublic var OBJECT_TYPE_APPLE = 0x9112;\n\tpublic var SYNC_CONDITION_APPLE = 0x9113;\n\tpublic var SYNC_STATUS_APPLE = 0x9114;\n\tpublic var SYNC_FLAGS_APPLE = 0x9115;\n\tpublic var SYNC_FENCE_APPLE = 0x9116;\n\tpublic var SYNC_GPU_COMMANDS_COMPLETE_APPLE = 0x9117;\n\tpublic var UNSIGNALED_APPLE = 0x9118;\n\tpublic var SIGNALED_APPLE = 0x9119;\n\tpublic var ALREADY_SIGNALED_APPLE = 0x911A;\n\tpublic var TIMEOUT_EXPIRED_APPLE = 0x911B;\n\tpublic var CONDITION_SATISFIED_APPLE = 0x911C;\n\tpublic var WAIT_FAILED_APPLE = 0x911D;\n\tpublic var SYNC_FLUSH_COMMANDS_BIT_APPLE = 0x00000001;\n\tpublic var TIMEOUT_IGNORED_APPLE = 0xFFFFFFFF;\n\n\t// public var TIMEOUT_IGNORED_APPLE = 0xFFFFFFFFFFFFFFFFull;\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags);\n\t// GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync);\n\t// GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync);\n\t// GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);\n\t// GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);\n\t// GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params);\n\t// GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/APPLE_texture_format_BGRA8888.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class APPLE_texture_format_BGRA8888\n{\n\tpublic var BGRA_EXT = 0x80E1;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/APPLE_texture_max_level.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class APPLE_texture_max_level\n{\n\tpublic var TEXTURE_MAX_LEVEL_APPLE = 0x813D;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ARM_mali_program_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ARM_mali_program_binary\n{\n\tpublic var MALI_PROGRAM_BINARY_ARM = 0x8F61;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ARM_mali_shader_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class ARM_mali_shader_binary\n{\n\tpublic var MALI_SHADER_BINARY_ARM = 0x8F60;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/ARM_rgba8.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class ARM_rgba8\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/DMP_shader_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class DMP_shader_binary\n{\n\tpublic var SHADER_BINARY_DMP = 0x9250;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_bgra.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_bgra\n{\n\tpublic var BGR_EXT = 0x80E0;\n\tpublic var BGRA_EXT = 0x80E1;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_blend_minmax.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class EXT_blend_minmax\n{\n\tpublic var MIN_EXT = 0x8007;\n\tpublic var MAX_EXT = 0x8008;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"ANGLE_instanced_arrays\")\n@:noCompletion extern class EXT_blend_minmax\n{\n\tpublic var MIN_EXT:Int;\n\tpublic var MAX_EXT:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_color_buffer_float.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (!js || !html5 || display)\n@:noCompletion class EXT_color_buffer_float\n{\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"EXT_color_buffer_float\")\n@:noCompletion extern class EXT_color_buffer_float {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_color_buffer_half_float.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class EXT_color_buffer_half_float\n{\n\tpublic var RGBA16F_EXT = 0x881A;\n\tpublic var RGB16F_EXT = 0x881B;\n\t#if (!js && !html5)\n\tpublic var RG16F_EXT = 0x822F;\n\tpublic var R16F_EXT = 0x822D;\n\t#end\n\tpublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT = 0x8211;\n\tpublic var UNSIGNED_NORMALIZED_EXT = 0x8C17;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"EXT_color_buffer_half_float\")\n@:noCompletion extern class EXT_color_buffer_half_float\n{\n\tpublic var RGBA16F_EXT:Int;\n\tpublic var RGB16F_EXT:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT:Int;\n\tpublic var UNSIGNED_NORMALIZED_EXT:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_debug_label.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_debug_label\n{\n\tpublic var PROGRAM_PIPELINE_OBJECT_EXT = 0x8A4F;\n\tpublic var PROGRAM_OBJECT_EXT = 0x8B40;\n\tpublic var SHADER_OBJECT_EXT = 0x8B48;\n\tpublic var BUFFER_OBJECT_EXT = 0x9151;\n\tpublic var QUERY_OBJECT_EXT = 0x9153;\n\tpublic var VERTEX_ARRAY_OBJECT_EXT = 0x9154;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);\n\t// GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_debug_marker.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class EXT_debug_marker\n{\n\t@:noCompletion private function new() {}\n\t// GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);\n\t// GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);\n\t// GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_discard_framebuffer.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_discard_framebuffer\n{\n\tpublic var COLOR_EXT = 0x1800;\n\tpublic var DEPTH_EXT = 0x1801;\n\tpublic var STENCIL_EXT = 0x1802;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_disjoint_timer_query.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"EXT_disjoint_timer_query\")\n@:noCompletion extern class EXT_disjoint_timer_query\n{\n\tpublic var QUERY_COUNTER_BITS_EXT:Int;\n\tpublic var CURRENT_QUERY_EXT:Int;\n\tpublic var QUERY_RESULT_EXT:Int;\n\tpublic var QUERY_RESULT_AVAILABLE_EXT:Int;\n\tpublic var TIME_ELAPSED_EXT:Int;\n\tpublic var TIMESTAMP_EXT:Int;\n\tpublic var GPU_DISJOINT_EXT:Int;\n\tpublic function createQueryEXT():Dynamic; /*WebGLQuery*/\n\tpublic function deleteQueryEXT(query:Dynamic /*WebGLQuery*/):Void;\n\tpublic function isQueryEXT(query:Dynamic /*WebGLQuery*/):Bool;\n\tpublic function beginQueryEXT(target:Int, query:Dynamic /*WebGLQuery*/):Void;\n\tpublic function endQueryEXT(target:Int):Void;\n\tpublic function queryCounterEXT(query:Dynamic /*WebGLQuery*/, target:Int):Void;\n\tpublic function getQueryEXT(target:Int, pname:Int):Dynamic; /*WebGLQuery or Int*/\n\tpublic function getQueryObjectEXT(query:Dynamic /*WebGLQuery*/, pname:Int):Dynamic;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_frag_depth.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:native(\"EXT_frag_depth\")\n@:noCompletion extern class EXT_frag_depth {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_map_buffer_range.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_map_buffer_range\n{\n\tpublic var MAP_READ_BIT_EXT = 0x0001;\n\tpublic var MAP_WRITE_BIT_EXT = 0x0002;\n\tpublic var MAP_INVALIDATE_RANGE_BIT_EXT = 0x0004;\n\tpublic var MAP_INVALIDATE_BUFFER_BIT_EXT = 0x0008;\n\tpublic var MAP_FLUSH_EXPLICIT_BIT_EXT = 0x0010;\n\tpublic var MAP_UNSYNCHRONIZED_BIT_EXT = 0x0020;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\n\t// GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_multi_draw_arrays.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class EXT_multi_draw_arrays\n{\n\t@:noCompletion private function new() {}\n\t// GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei);\n\t// GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_multisampled_render_to_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_multisampled_render_to_texture\n{\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT = 0x8D6C;\n\tpublic var RENDERBUFFER_SAMPLES_EXT = 0x8CAB;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56;\n\tpublic var MAX_SAMPLES_EXT = 0x8D57;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\n\t// GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_multiview_draw_buffers.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_multiview_draw_buffers\n{\n\tpublic var COLOR_ATTACHMENT_EXT = 0x90F0;\n\tpublic var MULTIVIEW_EXT = 0x90F1;\n\tpublic var DRAW_BUFFER_EXT = 0x0C01;\n\tpublic var READ_BUFFER_EXT = 0x0C02;\n\tpublic var MAX_MULTIVIEW_BUFFERS_EXT = 0x90F2;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index);\n\t// GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices);\n\t// GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_occlusion_query_boolean.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_occlusion_query_boolean\n{\n\tpublic var ANY_SAMPLES_PASSED_EXT = 0x8C2F;\n\tpublic var ANY_SAMPLES_PASSED_CONSERVATIVE_EXT = 0x8D6A;\n\tpublic var CURRENT_QUERY_EXT = 0x8865;\n\tpublic var QUERY_RESULT_EXT = 0x8866;\n\tpublic var QUERY_RESULT_AVAILABLE_EXT = 0x8867;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids);\n\t// GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids);\n\t// GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id);\n\t// GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id);\n\t// GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target);\n\t// GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params);\n\t// GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_packed_depth_stencil.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_packed_depth_stencil\n{\n\tpublic var DEPTH_STENCIL_EXT = 0x84F9;\n\tpublic var UNSIGNED_INT_24_8_EXT = 0x84FA;\n\tpublic var DEPTH24_STENCIL8_EXT = 0x88F0;\n\tpublic var TEXTURE_STENCIL_SIZE_EXT = 0x88F1;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_read_format_bgra.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_read_format_bgra\n{\n\tpublic var BGRA_EXT = 0x80E1;\n\tpublic var UNSIGNED_SHORT_4_4_4_4_REV_EXT = 0x8365;\n\tpublic var UNSIGNED_SHORT_1_5_5_5_REV_EXT = 0x8366;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_robustness.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_robustness\n{\n\tpublic var GUILTY_CONTEXT_RESET_EXT = 0x8253;\n\tpublic var INNOCENT_CONTEXT_RESET_EXT = 0x8254;\n\tpublic var UNKNOWN_CONTEXT_RESET_EXT = 0x8255;\n\tpublic var CONTEXT_ROBUST_ACCESS_EXT = 0x90F3;\n\tpublic var RESET_NOTIFICATION_STRATEGY_EXT = 0x8256;\n\tpublic var LOSE_CONTEXT_ON_RESET_EXT = 0x8252;\n\tpublic var NO_RESET_NOTIFICATION_EXT = 0x8261;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);\n\t// GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);\n\t// GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, float *params);\n\t// GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_sRGB.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class EXT_sRGB\n{\n\tpublic var SRGB_EXT = 0x8C40;\n\tpublic var SRGB_ALPHA_EXT = 0x8C42;\n\tpublic var SRGB8_ALPHA8_EXT = 0x8C43;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"EXT_sRGB\")\n@:noCompletion extern class EXT_sRGB\n{\n\tpublic var SRGB_EXT:Int;\n\tpublic var SRGB_ALPHA_EXT:Int;\n\tpublic var SRGB8_ALPHA8_EXT:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_separate_shader_objects.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_separate_shader_objects\n{\n\tpublic var VERTEX_SHADER_BIT_EXT = 0x00000001;\n\tpublic var FRAGMENT_SHADER_BIT_EXT = 0x00000002;\n\tpublic var ALL_SHADER_BITS_EXT = 0xFFFFFFFF;\n\tpublic var PROGRAM_SEPARABLE_EXT = 0x8258;\n\tpublic var ACTIVE_PROGRAM_EXT = 0x8259;\n\tpublic var PROGRAM_PIPELINE_BINDING_EXT = 0x825A;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program);\n\t// GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program);\n\t// GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings);\n\t// GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline);\n\t// GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines);\n\t// GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines);\n\t// GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline);\n\t// GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);\n\t// GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n\t// GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline);\n\t// GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_shader_framebuffer_fetch.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_shader_framebuffer_fetch\n{\n\tpublic var FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT = 0x8A52;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_shader_texture_lod.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class EXT_shader_texture_lod\n{\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"EXT_shader_texture_lod\")\n@:noCompletion extern class EXT_shader_texture_lod {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_shadow_samplers.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_shadow_samplers\n{\n\tpublic var TEXTURE_COMPARE_MODE_EXT = 0x884C;\n\tpublic var TEXTURE_COMPARE_FUNC_EXT = 0x884D;\n\tpublic var COMPARE_REF_TO_TEXTURE_EXT = 0x884E;\n\tpublic var SAMPLER_2D_SHADOW_EXT = 0x8B62;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_compression_dxt1.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_texture_compression_dxt1\n{\n\tpublic var COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_compression_s3tc.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_texture_compression_s3tc\n{\n\tpublic var COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_filter_anisotropic.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class EXT_texture_filter_anisotropic\n{\n\tpublic var TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;\n\tpublic var MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"EXT_texture_filter_anisotropic\")\n@:noCompletion extern class EXT_texture_filter_anisotropic\n{\n\tpublic var TEXTURE_MAX_ANISOTROPY_EXT:Int;\n\tpublic var MAX_TEXTURE_MAX_ANISOTROPY_EXT:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_format_BGRA8888.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_texture_format_BGRA8888\n{\n\tpublic var BGRA_EXT = 0x80E1;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_rg.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_texture_rg\n{\n\tpublic var RED_EXT = 0x1903;\n\tpublic var RG_EXT = 0x8227;\n\tpublic var R8_EXT = 0x8229;\n\tpublic var RG8_EXT = 0x822B;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_storage.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_texture_storage\n{\n\tpublic var TEXTURE_IMMUTABLE_FORMAT_EXT = 0x912F;\n\tpublic var ALPHA8_EXT = 0x803C;\n\tpublic var LUMINANCE8_EXT = 0x8040;\n\tpublic var LUMINANCE8_ALPHA8_EXT = 0x8045;\n\tpublic var RGBA32F_EXT = 0x8814;\n\tpublic var RGB32F_EXT = 0x8815;\n\tpublic var ALPHA32F_EXT = 0x8816;\n\tpublic var LUMINANCE32F_EXT = 0x8818;\n\tpublic var LUMINANCE_ALPHA32F_EXT = 0x8819;\n\tpublic var RGBA16F_EXT = 0x881A;\n\tpublic var RGB16F_EXT = 0x881B;\n\tpublic var ALPHA16F_EXT = 0x881C;\n\tpublic var LUMINANCE16F_EXT = 0x881E;\n\tpublic var LUMINANCE_ALPHA16F_EXT = 0x881F;\n\tpublic var RGB10_A2_EXT = 0x8059;\n\tpublic var RGB10_EXT = 0x8052;\n\tpublic var BGRA8_EXT = 0x93A1;\n\tpublic var R8_EXT = 0x8229;\n\tpublic var RG8_EXT = 0x822B;\n\tpublic var R32F_EXT = 0x822E;\n\tpublic var RG32F_EXT = 0x8230;\n\tpublic var R16F_EXT = 0x822D;\n\tpublic var RG16F_EXT = 0x822F;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\n\t// GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\n\t// GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n\t// GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\n\t// GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\n\t// GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_texture_type_2_10_10_10_REV.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_texture_type_2_10_10_10_REV\n{\n\tpublic var UNSIGNED_INT_2_10_10_10_REV_EXT = 0x8368;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/EXT_unpack_subimage.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class EXT_unpack_subimage\n{\n\tpublic var UNPACK_ROW_LENGTH = 0x0CF2;\n\tpublic var UNPACK_SKIP_ROWS = 0x0CF3;\n\tpublic var UNPACK_SKIP_PIXELS = 0x0CF4;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/FJ_shader_binary_GCCSO.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class FJ_shader_binary_GCCSO\n{\n\tpublic var GCCSO_SHADER_BINARY_FJ = 0x9260;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/IMG_multisampled_render_to_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class IMG_multisampled_render_to_texture\n{\n\tpublic var RENDERBUFFER_SAMPLES_IMG = 0x9133;\n\tpublic var FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG = 0x9134;\n\tpublic var MAX_SAMPLES_IMG = 0x9135;\n\tpublic var TEXTURE_SAMPLES_IMG = 0x9136;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum, GLsizei, GLenum, GLsizei, GLsizei);\n\t// GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/IMG_program_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class IMG_program_binary\n{\n\tpublic var SGX_PROGRAM_BINARY_IMG = 0x9130;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/IMG_read_format.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class IMG_read_format\n{\n\tpublic var BGRA_IMG = 0x80E1;\n\tpublic var UNSIGNED_SHORT_4_4_4_4_REV_IMG = 0x8365;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/IMG_shader_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class IMG_shader_binary\n{\n\tpublic var SGX_BINARY_IMG = 0x8C0A;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/IMG_texture_compression_pvrtc.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class IMG_texture_compression_pvrtc\n{\n\tpublic var COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;\n\tpublic var COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;\n\tpublic var COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;\n\tpublic var COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/KHR_debug.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class KHR_debug\n{\n\tpublic var DEBUG_OUTPUT_SYNCHRONOUS = 0x8242;\n\tpublic var DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243;\n\tpublic var DEBUG_CALLBACK_FUNCTION = 0x8244;\n\tpublic var DEBUG_CALLBACK_USER_PARAM = 0x8245;\n\tpublic var DEBUG_SOURCE_API = 0x8246;\n\tpublic var DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247;\n\tpublic var DEBUG_SOURCE_SHADER_COMPILER = 0x8248;\n\tpublic var DEBUG_SOURCE_THIRD_PARTY = 0x8249;\n\tpublic var DEBUG_SOURCE_APPLICATION = 0x824A;\n\tpublic var DEBUG_SOURCE_OTHER = 0x824B;\n\tpublic var DEBUG_TYPE_ERROR = 0x824C;\n\tpublic var DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D;\n\tpublic var DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E;\n\tpublic var DEBUG_TYPE_PORTABILITY = 0x824F;\n\tpublic var DEBUG_TYPE_PERFORMANCE = 0x8250;\n\tpublic var DEBUG_TYPE_OTHER = 0x8251;\n\tpublic var DEBUG_TYPE_MARKER = 0x8268;\n\tpublic var DEBUG_TYPE_PUSH_GROUP = 0x8269;\n\tpublic var DEBUG_TYPE_POP_GROUP = 0x826A;\n\tpublic var DEBUG_SEVERITY_NOTIFICATION = 0x826B;\n\tpublic var MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C;\n\tpublic var DEBUG_GROUP_STACK_DEPTH = 0x826D;\n\tpublic var BUFFER = 0x82E0;\n\tpublic var SHADER = 0x82E1;\n\tpublic var PROGRAM = 0x82E2;\n\tpublic var QUERY = 0x82E3;\n\tpublic var SAMPLER = 0x82E6;\n\tpublic var MAX_LABEL_LENGTH = 0x82E8;\n\tpublic var MAX_DEBUG_MESSAGE_LENGTH = 0x9143;\n\tpublic var MAX_DEBUG_LOGGED_MESSAGES = 0x9144;\n\tpublic var DEBUG_LOGGED_MESSAGES = 0x9145;\n\tpublic var DEBUG_SEVERITY_HIGH = 0x9146;\n\tpublic var DEBUG_SEVERITY_MEDIUM = 0x9147;\n\tpublic var DEBUG_SEVERITY_LOW = 0x9148;\n\tpublic var DEBUG_OUTPUT = 0x92E0;\n\tpublic var CONTEXT_FLAG_DEBUG_BIT = 0x00000002;\n\tpublic var STACK_OVERFLOW = 0x0503;\n\tpublic var STACK_UNDERFLOW = 0x0504;\n\n\t@:noCompletion private function new() {}\n\n\t// public function debugMessageControl (source:Int, type:Int, severity:Int, count:Int, ids:Array<Int>, enabled:Bool):Void {}\n\t// public function debugMessageInsert (source:Int, type:Int, id:Int, severity:Int, message:String):Void {}\n\t// public function debugMessageCallback (callback:Dynamic, userParam:Dynamic):Void;\n\t// public function getDebugMessageLog (count:Int, sources:Array<Int>, types:Array<Int>, ids:Array<Int>, severities:Array<Int>, lengths:Array<Int>):String {}\n\t// public function pushDebugGroup (source:Int, id:Int, message:String):Void {}\n\t// public function popDebugGroup ():Void {}\n\t// public function objectLabel (identifier:Int, name:Int, label:String):Void {}\n\t// public function getObjectLabel (identifier:Int, name:Int):String {}\n\t// public function objectPtrLabel (ptr:Dynamic, label:String):Void {}\n\t// public function getObjectPtrLabel (ptr:Dynamic):String {}\n\t// public function getPointerv (pname:Int, params:Array<Dynamic>):Void {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/KHR_texture_compression_astc_ldr.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class KHR_texture_compression_astc_ldr\n{\n\tpublic var COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0;\n\tpublic var COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1;\n\tpublic var COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2;\n\tpublic var COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3;\n\tpublic var COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4;\n\tpublic var COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5;\n\tpublic var COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6;\n\tpublic var COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7;\n\tpublic var COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8;\n\tpublic var COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9;\n\tpublic var COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA;\n\tpublic var COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB;\n\tpublic var COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC;\n\tpublic var COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NVX_gpu_memory_info.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NVX_gpu_memory_info\n{\n\tpublic var GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = 0x9047;\n\tpublic var GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = 0x9048;\n\tpublic var GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX = 0x9049;\n\tpublic var GPU_MEMORY_INFO_EVICTION_COUNT_NVX = 0x904A;\n\tpublic var GPU_MEMORY_INFO_EVICTED_MEMORY_NVX = 0x904B;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_coverage_sample.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NV_coverage_sample\n{\n\tpublic var COVERAGE_COMPONENT_NV = 0x8ED0;\n\tpublic var COVERAGE_COMPONENT4_NV = 0x8ED1;\n\tpublic var COVERAGE_ATTACHMENT_NV = 0x8ED2;\n\tpublic var COVERAGE_BUFFERS_NV = 0x8ED3;\n\tpublic var COVERAGE_SAMPLES_NV = 0x8ED4;\n\tpublic var COVERAGE_ALL_FRAGMENTS_NV = 0x8ED5;\n\tpublic var COVERAGE_EDGE_FRAGMENTS_NV = 0x8ED6;\n\tpublic var COVERAGE_AUTOMATIC_NV = 0x8ED7;\n\tpublic var COVERAGE_BUFFER_BIT_NV = 0x8000;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask);\n\t// GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_depth_nonlinear.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NV_depth_nonlinear\n{\n\tpublic var DEPTH_COMPONENT16_NONLINEAR_NV = 0x8E2C;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_draw_buffers.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NV_draw_buffers\n{\n\tpublic var MAX_DRAW_BUFFERS_NV = 0x8824;\n\tpublic var DRAW_BUFFER0_NV = 0x8825;\n\tpublic var DRAW_BUFFER1_NV = 0x8826;\n\tpublic var DRAW_BUFFER2_NV = 0x8827;\n\tpublic var DRAW_BUFFER3_NV = 0x8828;\n\tpublic var DRAW_BUFFER4_NV = 0x8829;\n\tpublic var DRAW_BUFFER5_NV = 0x882A;\n\tpublic var DRAW_BUFFER6_NV = 0x882B;\n\tpublic var DRAW_BUFFER7_NV = 0x882C;\n\tpublic var DRAW_BUFFER8_NV = 0x882D;\n\tpublic var DRAW_BUFFER9_NV = 0x882E;\n\tpublic var DRAW_BUFFER10_NV = 0x882F;\n\tpublic var DRAW_BUFFER11_NV = 0x8830;\n\tpublic var DRAW_BUFFER12_NV = 0x8831;\n\tpublic var DRAW_BUFFER13_NV = 0x8832;\n\tpublic var DRAW_BUFFER14_NV = 0x8833;\n\tpublic var DRAW_BUFFER15_NV = 0x8834;\n\tpublic var COLOR_ATTACHMENT0_NV = 0x8CE0;\n\tpublic var COLOR_ATTACHMENT1_NV = 0x8CE1;\n\tpublic var COLOR_ATTACHMENT2_NV = 0x8CE2;\n\tpublic var COLOR_ATTACHMENT3_NV = 0x8CE3;\n\tpublic var COLOR_ATTACHMENT4_NV = 0x8CE4;\n\tpublic var COLOR_ATTACHMENT5_NV = 0x8CE5;\n\tpublic var COLOR_ATTACHMENT6_NV = 0x8CE6;\n\tpublic var COLOR_ATTACHMENT7_NV = 0x8CE7;\n\tpublic var COLOR_ATTACHMENT8_NV = 0x8CE8;\n\tpublic var COLOR_ATTACHMENT9_NV = 0x8CE9;\n\tpublic var COLOR_ATTACHMENT10_NV = 0x8CEA;\n\tpublic var COLOR_ATTACHMENT11_NV = 0x8CEB;\n\tpublic var COLOR_ATTACHMENT12_NV = 0x8CEC;\n\tpublic var COLOR_ATTACHMENT13_NV = 0x8CED;\n\tpublic var COLOR_ATTACHMENT14_NV = 0x8CEE;\n\tpublic var COLOR_ATTACHMENT15_NV = 0x8CEF;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_fbo_color_attachments.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NV_fbo_color_attachments\n{\n\tpublic var MAX_COLOR_ATTACHMENTS_NV = 0x8CDF;\n\tpublic var COLOR_ATTACHMENT0_NV = 0x8CE0;\n\tpublic var COLOR_ATTACHMENT1_NV = 0x8CE1;\n\tpublic var COLOR_ATTACHMENT2_NV = 0x8CE2;\n\tpublic var COLOR_ATTACHMENT3_NV = 0x8CE3;\n\tpublic var COLOR_ATTACHMENT4_NV = 0x8CE4;\n\tpublic var COLOR_ATTACHMENT5_NV = 0x8CE5;\n\tpublic var COLOR_ATTACHMENT6_NV = 0x8CE6;\n\tpublic var COLOR_ATTACHMENT7_NV = 0x8CE7;\n\tpublic var COLOR_ATTACHMENT8_NV = 0x8CE8;\n\tpublic var COLOR_ATTACHMENT9_NV = 0x8CE9;\n\tpublic var COLOR_ATTACHMENT10_NV = 0x8CEA;\n\tpublic var COLOR_ATTACHMENT11_NV = 0x8CEB;\n\tpublic var COLOR_ATTACHMENT12_NV = 0x8CEC;\n\tpublic var COLOR_ATTACHMENT13_NV = 0x8CED;\n\tpublic var COLOR_ATTACHMENT14_NV = 0x8CEE;\n\tpublic var COLOR_ATTACHMENT15_NV = 0x8CEF;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_fence.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NV_fence\n{\n\tpublic var ALL_COMPLETED_NV = 0x84F2;\n\tpublic var FENCE_STATUS_NV = 0x84F3;\n\tpublic var FENCE_CONDITION_NV = 0x84F4;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *);\n\t// GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *);\n\t// GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint);\n\t// GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint);\n\t// GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *);\n\t// GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint);\n\t// GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint, GLenum);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_read_buffer.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class NV_read_buffer\n{\n\tpublic var READ_BUFFER_NV = 0x0C02;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_read_buffer_front.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class NV_read_buffer_front\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_read_depth.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class NV_read_depth\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_read_depth_stencil.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class NV_read_depth_stencil\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_read_stencil.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class NV_read_stencil\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_texture_compression_s3tc_update.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class NV_texture_compression_s3tc_update\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/NV_texture_npot_2D_mipmap.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class NV_texture_npot_2D_mipmap\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_EGL_image.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class OES_EGL_image\n{\n\t@:noCompletion private function new() {}\n\t// public function eglImageTargetTexture2DOES (target:Int, image:BytesPointer):Void {}\n\t// public function eglImageTargetRenderbufferStorageOES (target:Int, image:BytesPointer):Void {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_EGL_image_external.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_EGL_image_external\n{\n\tpublic var TEXTURE_EXTERNAL_OES = 0x8D65;\n\tpublic var SAMPLER_EXTERNAL_OES = 0x8D66;\n\tpublic var TEXTURE_BINDING_EXTERNAL_OES = 0x8D67;\n\tpublic var REQUIRED_TEXTURE_IMAGE_UNITS_OES = 0x8D68;\n\n\t@:noCompletion private function new() {}\n\n\t// public function eglImageTargetTexture2DOES (target:Int, image:BytesPointer):Void {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_compressed_ETC1_RGB8_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_compressed_ETC1_RGB8_texture\n{\n\tpublic var ETC1_RGB8_OES = 0x8D64;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_compressed_paletted_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_compressed_paletted_texture\n{\n\tpublic var PALETTE4_RGB8_OES = 0x8B90;\n\tpublic var PALETTE4_RGBA8_OES = 0x8B91;\n\tpublic var PALETTE4_R5_G6_B5_OES = 0x8B92;\n\tpublic var PALETTE4_RGBA4_OES = 0x8B93;\n\tpublic var PALETTE4_RGB5_A1_OES = 0x8B94;\n\tpublic var PALETTE8_RGB8_OES = 0x8B95;\n\tpublic var PALETTE8_RGBA8_OES = 0x8B96;\n\tpublic var PALETTE8_R5_G6_B5_OES = 0x8B97;\n\tpublic var PALETTE8_RGBA4_OES = 0x8B98;\n\tpublic var PALETTE8_RGB5_A1_OES = 0x8B99;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_depth24.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_depth24\n{\n\tpublic var DEPTH_COMPONENT24_OES = 0x81A6;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_depth32.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_depth32\n{\n\tpublic var DEPTH_COMPONENT32_OES = 0x81A7;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_depth_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class OES_depth_texture\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_element_index_uint.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class OES_element_index_uint\n{\n\tpublic var UNSIGNED_INT = 0x1405;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"OES_element_index_uint\")\n@:noCompletion extern class OES_element_index_uint {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_get_program_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_get_program_binary\n{\n\tpublic var PROGRAM_BINARY_LENGTH_OES = 0x8741;\n\tpublic var NUM_PROGRAM_BINARY_FORMATS_OES = 0x87FE;\n\tpublic var PROGRAM_BINARY_FORMATS_OES = 0x87FF;\n\n\t@:noCompletion private function new() {}\n\n\t// public function getProgramBinaryOES (program:GLProgram, bufSize:Int, length:Int, binaryFormat:Int, binary:BytesPointer):Void {}\n\t// public function programBinaryOES (program:GLProgram, binaryFormat:Int, binary:BytesPointer, length:Int):Void {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_mapbuffer.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_mapbuffer\n{\n\tpublic var WRITE_ONLY_OES = 0x88B9;\n\tpublic var BUFFER_ACCESS_OES = 0x88BB;\n\tpublic var BUFFER_MAPPED_OES = 0x88BC;\n\tpublic var BUFFER_MAP_POINTER_OES = 0x88BD;\n\n\t@:noCompletion private function new() {}\n\n\t// public function mapBufferOES (target:Int, access:Int):Dynamic {}\n\t// public function unmapBufferOES (target:Int):Bool {}\n\t// public function getBufferPointervOES (target:Int, pname:Int):Dynamic {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_packed_depth_stencil.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_packed_depth_stencil\n{\n\tpublic var DEPTH_STENCIL_OES = 0x84F9;\n\tpublic var UNSIGNED_INT_24_8_OES = 0x84FA;\n\tpublic var DEPTH24_STENCIL8_OES = 0x88F0;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_required_internalformat.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_required_internalformat\n{\n\tpublic var ALPHA8_OES = 0x803C;\n\tpublic var DEPTH_COMPONENT16_OES = 0x81A5;\n\tpublic var DEPTH_COMPONENT24_OES = 0x81A6;\n\tpublic var DEPTH24_STENCIL8_OES = 0x88F0;\n\tpublic var DEPTH_COMPONENT32_OES = 0x81A7;\n\tpublic var LUMINANCE4_ALPHA4_OES = 0x8043;\n\tpublic var LUMINANCE8_ALPHA8_OES = 0x8045;\n\tpublic var LUMINANCE8_OES = 0x8040;\n\tpublic var RGBA4_OES = 0x8056;\n\tpublic var RGB5_A1_OES = 0x8057;\n\tpublic var RGB565_OES = 0x8D62;\n\tpublic var RGB8_OES = 0x8051;\n\tpublic var RGBA8_OES = 0x8058;\n\tpublic var RGB10_EXT = 0x8052;\n\tpublic var RGB10_A2_EXT = 0x8059;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_rgb8_rgba8.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_rgb8_rgba8\n{\n\tpublic var RGB8_OES = 0x8051;\n\tpublic var RGBA8_OES = 0x8058;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_standard_derivatives.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class OES_standard_derivatives\n{\n\tpublic var FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"OES_standard_derivatives\")\n@:noCompletion extern class OES_standard_derivatives\n{\n\tpublic var FRAGMENT_SHADER_DERIVATIVE_HINT_OES:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_stencil1.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_stencil1\n{\n\tpublic var STENCIL_INDEX1_OES = 0x8D46;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_stencil4.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_stencil4\n{\n\tpublic var STENCIL_INDEX4_OES = 0x8D47;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_surfaceless_context.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_surfaceless_context\n{\n\tpublic var FRAMEBUFFER_UNDEFINED_OES = 0x8219;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_texture_3D.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_texture_3D\n{\n\tpublic var TEXTURE_WRAP_R_OES = 0x8072;\n\tpublic var TEXTURE_3D_OES = 0x806F;\n\tpublic var TEXTURE_BINDING_3D_OES = 0x806A;\n\tpublic var MAX_3D_TEXTURE_SIZE_OES = 0x8073;\n\tpublic var SAMPLER_3D_OES = 0x8B5F;\n\tpublic var FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES = 0x8CD4;\n\n\t@:noCompletion private function new() {}\n\n\t// public function texImage3DOES (target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, format:Int, type:Int, pixels:BytesPointer):Void {}\n\t// public function texSubImage3DOES (target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int, pixels:BytesPointer):Void {}\n\t// public function copyTexSubImage3DOES (target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, x:Int, y:Int, width:Int, height:Int):Void {}\n\t// public function compressedTexImage3DOES (target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int, border:Int, imageSize:Int, data:BytesPointer):Void {}\n\t// public function compressedTexSubImage3DOES (target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, imageSize:Int, data:BytesPointer):Void {}\n\t// public function framebufferTexture3DOES (target:Int, attachment:Int, textarget:Int, texture:Int, level:Int, zoffset:Int):Void {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_texture_float.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (!js || !html5 || display)\n@:noCompletion class OES_texture_float\n{\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"OES_texture_float\")\n@:noCompletion extern class OES_texture_float {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_texture_float_linear.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (!js || !html5 || display)\n@:noCompletion class OES_texture_float_linear\n{\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"OES_texture_float_linear\")\n@:noCompletion extern class OES_texture_float_linear {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_texture_half_float.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class OES_texture_half_float\n{\n\tpublic var HALF_FLOAT_OES = 0x8D61;\n\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"OES_texture_half_float\")\n@:noCompletion extern class OES_texture_half_float\n{\n\tpublic var HALF_FLOAT_OES:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_texture_half_float_linear.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (!js || !html5 || display)\n@:noCompletion class OES_texture_half_float_linear\n{\n\t@:noCompletion private function new() {}\n}\n#else\n@:native(\"OES_texture_half_float_linear\")\n@:noCompletion extern class OES_texture_half_float_linear {}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_texture_npot.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class OES_texture_npot\n{\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_vertex_array_object.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n#if (!js || !html5 || display)\n@:noCompletion class OES_vertex_array_object\n{\n\tpublic var VERTEX_ARRAY_BINDING_OES = 0x85B5;\n\n\t@:noCompletion private function new() {}\n\n\tpublic function createVertexArrayOES():Dynamic\n\t{\n\t\treturn null;\n\t} /*WebGLVertexArrayObject*/\n\n\tpublic function deleteVertexArrayOES(arrayObject:Dynamic /*WebGLVertexArrayObject*/):Void {}\n\n\tpublic function isVertexArrayOES(arrayObject:Dynamic /*WebGLVertexArrayObject*/):Bool\n\t{\n\t\treturn false;\n\t}\n\n\tpublic function bindVertexArrayOES(arrayObject:Dynamic /*WebGLVertexArrayObject*/):Void {}\n\n\t// public function bindVertexArrayOES (array:Int):Void {}\n\t// public function deleteVertexArraysOES (n:Int, arrays:Array<Int>):Void {}\n\t// public function genVertexArraysOES (n:Int, arrays:Array<Int>):Void {}\n\t// public function isVertexArrayOES (array:Int):Bool;\n}\n#else\n@:native(\"OES_vertex_array_object\")\n@:noCompletion extern class OES_vertex_array_object\n{\n\tpublic var VERTEX_ARRAY_BINDING_OES:Int;\n\tpublic function createVertexArrayOES():Dynamic; /*WebGLVertexArrayObject*/\n\tpublic function deleteVertexArrayOES(arrayObject:Dynamic /*WebGLVertexArrayObject*/):Void;\n\tpublic function isVertexArrayOES(arrayObject:Dynamic /*WebGLVertexArrayObject*/):Bool;\n\tpublic function bindVertexArrayOES(arrayObject:Dynamic /*WebGLVertexArrayObject*/):Void;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_vertex_half_float.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_vertex_half_float\n{\n\tpublic var HALF_FLOAT_OES = 0x8D61;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/OES_vertex_type_10_10_10_2.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class OES_vertex_type_10_10_10_2\n{\n\tpublic var UNSIGNED_INT_10_10_10_2_OES = 0x8DF6;\n\tpublic var INT_10_10_10_2_OES = 0x8DF7;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_alpha_test.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class QCOM_alpha_test\n{\n\tpublic var ALPHA_TEST_QCOM = 0x0BC0;\n\tpublic var ALPHA_TEST_FUNC_QCOM = 0x0BC1;\n\tpublic var ALPHA_TEST_REF_QCOM = 0x0BC2;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_binning_control.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class QCOM_binning_control\n{\n\tpublic var BINNING_CONTROL_HINT_QCOM = 0x8FB0;\n\tpublic var CPU_OPTIMIZED_QCOM = 0x8FB1;\n\tpublic var GPU_OPTIMIZED_QCOM = 0x8FB2;\n\tpublic var RENDER_DIRECT_TO_FRAMEBUFFER_QCOM = 0x8FB3;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_driver_control.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class QCOM_driver_control\n{\n\t@:noCompletion private function new() {}\n\t// GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls);\n\t// GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);\n\t// GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl);\n\t// GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_extended_get.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class QCOM_extended_get\n{\n\tpublic var TEXTURE_WIDTH_QCOM = 0x8BD2;\n\tpublic var TEXTURE_HEIGHT_QCOM = 0x8BD3;\n\tpublic var TEXTURE_DEPTH_QCOM = 0x8BD4;\n\tpublic var TEXTURE_INTERNAL_FORMAT_QCOM = 0x8BD5;\n\tpublic var TEXTURE_FORMAT_QCOM = 0x8BD6;\n\tpublic var TEXTURE_TYPE_QCOM = 0x8BD7;\n\tpublic var TEXTURE_IMAGE_VALID_QCOM = 0x8BD8;\n\tpublic var TEXTURE_NUM_LEVELS_QCOM = 0x8BD9;\n\tpublic var TEXTURE_TARGET_QCOM = 0x8BDA;\n\tpublic var TEXTURE_OBJECT_VALID_QCOM = 0x8BDB;\n\tpublic var STATE_RESTORE = 0x8BDC;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures);\n\t// GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);\n\t// GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);\n\t// GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);\n\t// GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);\n\t// GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param);\n\t// GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);\n\t// GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_extended_get2.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:noCompletion class QCOM_extended_get2\n{\n\t@:noCompletion private function new() {}\n\t// GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders);\n\t// GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms);\n\t// GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program);\n\t// GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_perfmon_global_mode.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class QCOM_perfmon_global_mode\n{\n\tpublic var PERFMON_GLOBAL_MODE_QCOM = 0x8FA0;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_tiled_rendering.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class QCOM_tiled_rendering\n{\n\tpublic var COLOR_BUFFER_BIT0_QCOM = 0x00000001;\n\tpublic var COLOR_BUFFER_BIT1_QCOM = 0x00000002;\n\tpublic var COLOR_BUFFER_BIT2_QCOM = 0x00000004;\n\tpublic var COLOR_BUFFER_BIT3_QCOM = 0x00000008;\n\tpublic var COLOR_BUFFER_BIT4_QCOM = 0x00000010;\n\tpublic var COLOR_BUFFER_BIT5_QCOM = 0x00000020;\n\tpublic var COLOR_BUFFER_BIT6_QCOM = 0x00000040;\n\tpublic var COLOR_BUFFER_BIT7_QCOM = 0x00000080;\n\tpublic var DEPTH_BUFFER_BIT0_QCOM = 0x00000100;\n\tpublic var DEPTH_BUFFER_BIT1_QCOM = 0x00000200;\n\tpublic var DEPTH_BUFFER_BIT2_QCOM = 0x00000400;\n\tpublic var DEPTH_BUFFER_BIT3_QCOM = 0x00000800;\n\tpublic var DEPTH_BUFFER_BIT4_QCOM = 0x00001000;\n\tpublic var DEPTH_BUFFER_BIT5_QCOM = 0x00002000;\n\tpublic var DEPTH_BUFFER_BIT6_QCOM = 0x00004000;\n\tpublic var DEPTH_BUFFER_BIT7_QCOM = 0x00008000;\n\tpublic var STENCIL_BUFFER_BIT0_QCOM = 0x00010000;\n\tpublic var STENCIL_BUFFER_BIT1_QCOM = 0x00020000;\n\tpublic var STENCIL_BUFFER_BIT2_QCOM = 0x00040000;\n\tpublic var STENCIL_BUFFER_BIT3_QCOM = 0x00080000;\n\tpublic var STENCIL_BUFFER_BIT4_QCOM = 0x00100000;\n\tpublic var STENCIL_BUFFER_BIT5_QCOM = 0x00200000;\n\tpublic var STENCIL_BUFFER_BIT6_QCOM = 0x00400000;\n\tpublic var STENCIL_BUFFER_BIT7_QCOM = 0x00800000;\n\tpublic var MULTISAMPLE_BUFFER_BIT0_QCOM = 0x01000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT1_QCOM = 0x02000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT2_QCOM = 0x04000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT3_QCOM = 0x08000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT4_QCOM = 0x10000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT5_QCOM = 0x20000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT6_QCOM = 0x40000000;\n\tpublic var MULTISAMPLE_BUFFER_BIT7_QCOM = 0x80000000;\n\n\t@:noCompletion private function new() {}\n\n\t// GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);\n\t// GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask);\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/QCOM_writeonly_rendering.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class QCOM_writeonly_rendering\n{\n\tpublic var WRITEONLY_RENDERING_QCOM = 0x8823;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/VIV_shader_binary.hx",
    "content": "package lime.graphics.opengl.ext;\n\n@:keep\n@:noCompletion class VIV_shader_binary\n{\n\tpublic var SHADER_BINARY_VIV = 0x8FC4;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_color_buffer_float.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_color_buffer_float\")\n@:noCompletion extern class WEBGL_color_buffer_float\n{\n\tpublic var RGBA32F_EXT:Int;\n\tpublic var RGB32F_EXT:Int;\n\tpublic var FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT:Int;\n\tpublic var UNSIGNED_NORMALIZED_EXT:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_compressed_texture_atc.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_compressed_texture_atc\")\n@:noCompletion extern class WEBGL_compressed_texture_atc\n{\n\tpublic var COMPRESSED_RGB_ATC_WEBGL:Int;\n\tpublic var COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL:Int;\n\tpublic var COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_compressed_texture_etc.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_compressed_texture_etc\")\n@:noCompletion extern class WEBGL_compressed_texture_etc\n{\n\tpublic var COMPRESSED_R11_EAC:Int;\n\tpublic var COMPRESSED_SIGNED_R11_EAC:Int;\n\tpublic var COMPRESSED_RG11_EAC:Int;\n\tpublic var COMPRESSED_SIGNED_RG11_EAC:Int;\n\tpublic var COMPRESSED_RGB8_ETC2:Int;\n\tpublic var COMPRESSED_RGBA8_ETC2_EAC:Int;\n\tpublic var COMPRESSED_SRGB8_ETC2:Int;\n\tpublic var COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:Int;\n\tpublic var COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:Int;\n\tpublic var COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_compressed_texture_etc1.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_compressed_texture_etc1\")\n@:noCompletion extern class WEBGL_compressed_texture_etc1\n{\n\tpublic var COMPRESSED_RGB_ETC1_WEBGL:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_compressed_texture_pvrtc.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_compressed_texture_pvrtc\")\n@:noCompletion extern class WEBGL_compressed_texture_pvrtc\n{\n\tpublic var COMPRESSED_RGB_PVRTC_4BPPV1_IMG:Int;\n\tpublic var COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:Int;\n\tpublic var COMPRESSED_RGB_PVRTC_2BPPV1_IMG:Int;\n\tpublic var COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_compressed_texture_s3tc.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_compressed_texture_s3tc\")\n@:noCompletion extern class WEBGL_compressed_texture_s3tc\n{\n\tpublic var COMPRESSED_RGB_S3TC_DXT1_EXT:Int;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT1_EXT:Int;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT3_EXT:Int;\n\tpublic var COMPRESSED_RGBA_S3TC_DXT5_EXT:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_debug_renderer_info.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_debug_renderer_info\")\n@:noCompletion extern class WEBGL_debug_renderer_info\n{\n\tpublic var UNMASKED_VENDOR_WEBGL:Int;\n\tpublic var UNMASKED_RENDERER_WEBGL:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_debug_shaders.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\nimport lime.graphics.opengl.GLShader;\n\n@:keep\n@:native(\"WEBGL_debug_shaders\")\n@:noCompletion extern class WEBGL_debug_shaders\n{\n\tpublic function getTranslatedShaderSource(shader:GLShader):String;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_depth_texture.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\nimport lime.graphics.opengl.GLShader;\n\n@:keep\n@:native(\"WEBGL_depth_texture\")\n@:noCompletion extern class WEBGL_depth_texture\n{\n\tpublic var UNSIGNED_INT_24_8_WEBGL:Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_draw_buffers.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_draw_buffers\")\n@:noCompletion extern class WEBGL_draw_buffers\n{\n\tpublic var COLOR_ATTACHMENT0_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT1_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT2_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT3_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT4_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT5_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT6_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT7_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT8_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT9_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT10_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT11_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT12_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT13_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT14_WEBGL:Int;\n\tpublic var COLOR_ATTACHMENT15_WEBGL:Int;\n\tpublic var DRAW_BUFFER0_WEBGL:Int;\n\tpublic var DRAW_BUFFER1_WEBGL:Int;\n\tpublic var DRAW_BUFFER2_WEBGL:Int;\n\tpublic var DRAW_BUFFER3_WEBGL:Int;\n\tpublic var DRAW_BUFFER4_WEBGL:Int;\n\tpublic var DRAW_BUFFER5_WEBGL:Int;\n\tpublic var DRAW_BUFFER6_WEBGL:Int;\n\tpublic var DRAW_BUFFER7_WEBGL:Int;\n\tpublic var DRAW_BUFFER8_WEBGL:Int;\n\tpublic var DRAW_BUFFER9_WEBGL:Int;\n\tpublic var DRAW_BUFFER10_WEBGL:Int;\n\tpublic var DRAW_BUFFER11_WEBGL:Int;\n\tpublic var DRAW_BUFFER12_WEBGL:Int;\n\tpublic var DRAW_BUFFER13_WEBGL:Int;\n\tpublic var DRAW_BUFFER14_WEBGL:Int;\n\tpublic var DRAW_BUFFER15_WEBGL:Int;\n\tpublic var MAX_COLOR_ATTACHMENTS_WEBGL:Int;\n\tpublic var MAX_DRAW_BUFFERS_WEBGL:Int;\n\tpublic function drawBuffersWEBGL(buffers:Array<Int>):Void;\n}\n#end\n"
  },
  {
    "path": "src/lime/graphics/opengl/ext/WEBGL_lose_context.hx",
    "content": "package lime.graphics.opengl.ext;\n\n#if (js && html5)\n@:keep\n@:native(\"WEBGL_lose_context\")\n@:noCompletion extern class WEBGL_lose_context\n{\n\tpublic function loseContext():Void;\n\tpublic function restoreContext():Void;\n}\n#end\n"
  },
  {
    "path": "src/lime/math/ARGB.hx",
    "content": "package lime.math;\n\nimport lime.graphics.PixelFormat;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\n\n/**\n\tA utility for storing, accessing and converting colors in an ARGB\n\t(alpha, red, green, blue) color format.\n\n\t```haxe\n\tvar color:ARGB = 0xFF883300;\n\ttrace (color.a); // 0xFF\n\ttrace (color.r); // 0x88\n\ttrace (color.g); // 0x33\n\ttrace (color.b); // 0x00\n\n\tvar convert:BGRA = color; // 0x003388FF\n\t```\n**/\n@:transitive\nabstract ARGB(#if (flash && !lime_doc_gen) Int #else UInt #end) from Int to Int from UInt to UInt\n{\n\tprivate static var a16:Int;\n\tprivate static var unmult:Float;\n\n\t/**\n\t\tAccesses the alpha component of the color\n\t**/\n\tpublic var a(get, set):Int;\n\n\t/**\n\t\tAccesses the blue component of the color\n\t**/\n\tpublic var b(get, set):Int;\n\n\t/**\n\t\tAccesses the green component of the color\n\t**/\n\tpublic var g(get, set):Int;\n\n\t/**\n\t\tAccesses the red component of the color\n\t**/\n\tpublic var r(get, set):Int;\n\n\t/**\n\t\tCreates a new ARGB instance\n\t\t@param\targb\t(Optional) An ARGB color value\n\t**/\n\tpublic inline function new(argb:Int = 0)\n\t{\n\t\tthis = argb;\n\t}\n\n\t/**\n\t\tCreates a new ARGB instance from component values\n\t\t@param\ta\tAn alpha component value\n\t\t@param\tr\tA red component value\n\t\t@param\tg\tA green component value\n\t\t@param\tb\tA blue component value\n\t\t@return\tA new ARGB instance\n\t**/\n\tpublic static inline function create(a:Int, r:Int, g:Int, b:Int):ARGB\n\t{\n\t\tvar argb = new ARGB();\n\t\targb.set(a, r, g, b);\n\t\treturn argb;\n\t}\n\n\t/**\n\t\tMultiplies the red, green and blue components by the current alpha component\n\t**/\n\tpublic inline function multiplyAlpha():Void\n\t{\n\t\tif (a == 0)\n\t\t{\n\t\t\tthis = 0;\n\t\t}\n\t\telse if (a != 0xFF)\n\t\t{\n\t\t\ta16 = RGBA.__alpha16[a];\n\t\t\tset(a, (r * a16) >> 16, (g * a16) >> 16, (b * a16) >> 16);\n\t\t}\n\t}\n\n\t/**\n\t\tReads a value from a `UInt8Array` into the current `ARGB` color\n\t\t@param\tdata\tA `UInt8Array` instance\n\t\t@param\toffset\tAn offset into the `UInt8Array` to read\n\t\t@param\tformat\t(Optional) The `PixelFormat` represented by the `UInt8Array` data\n\t\t@param\tpremultiplied\t(Optional) Whether the data is stored in premultiplied alpha format\n\t**/\n\tpublic inline function readUInt8(data:UInt8Array, offset:Int, format:PixelFormat = RGBA32, premultiplied:Bool = false):Void\n\t{\n\t\tswitch (format)\n\t\t{\n\t\t\tcase BGRA32:\n\t\t\t\tset(data[offset + 1], data[offset], data[offset + 3], data[offset + 2]);\n\n\t\t\tcase RGBA32:\n\t\t\t\tset(data[offset + 1], data[offset + 2], data[offset + 3], data[offset]);\n\n\t\t\tcase ARGB32:\n\t\t\t\tset(data[offset + 2], data[offset + 3], data[offset], data[offset + 1]);\n\t\t}\n\n\t\tif (premultiplied)\n\t\t{\n\t\t\tunmultiplyAlpha();\n\t\t}\n\t}\n\n\t/**\n\t\tSets the current `ARGB` color to new component values\n\t\t@param\ta\tThe alpha component value to set\n\t\t@param\tr\tThe red component value to set\n\t\t@param\tg\tThe green component value to set\n\t\t@param\tb\tThe blue component vlaue to set\n\t**/\n\tpublic inline function set(a:Int, r:Int, g:Int, b:Int):Void\n\t{\n\t\tthis = ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);\n\t}\n\n\t/**\n\t\tDivides the current red, green and blue components by the alpha component\n\t**/\n\tpublic inline function unmultiplyAlpha()\n\t{\n\t\tif (a != 0 && a != 0xFF)\n\t\t{\n\t\t\tunmult = 255.0 / a;\n\t\t\tset(a, RGBA.__clamp[Math.floor(r * unmult)], RGBA.__clamp[Math.floor(g * unmult)], RGBA.__clamp[Math.floor(b * unmult)]);\n\t\t}\n\t}\n\n\t/**\n\t\tWrites the current `ARGB` color into a `UInt8Array`\n\t\t@param\tdata\tA `UInt8Array` instance\n\t\t@param\toffset\tAn offset into the `UInt8Array` to write\n\t\t@param\tformat\t(Optional) The `PixelFormat` represented by the `UInt8Array` data\n\t\t@param\tpremultiplied\t(Optional) Whether the data is stored in premultiplied alpha format\n\t**/\n\tpublic inline function writeUInt8(data:UInt8Array, offset:Int, format:PixelFormat = RGBA32, premultiplied:Bool = false):Void\n\t{\n\t\tif (premultiplied)\n\t\t{\n\t\t\tmultiplyAlpha();\n\t\t}\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase BGRA32:\n\t\t\t\tdata[offset] = b;\n\t\t\t\tdata[offset + 1] = g;\n\t\t\t\tdata[offset + 2] = r;\n\t\t\t\tdata[offset + 3] = a;\n\n\t\t\tcase RGBA32:\n\t\t\t\tdata[offset] = r;\n\t\t\t\tdata[offset + 1] = g;\n\t\t\t\tdata[offset + 2] = b;\n\t\t\t\tdata[offset + 3] = a;\n\n\t\t\tcase ARGB32:\n\t\t\t\tdata[offset] = a;\n\t\t\t\tdata[offset + 1] = r;\n\t\t\t\tdata[offset + 2] = g;\n\t\t\t\tdata[offset + 3] = b;\n\t\t}\n\t}\n\n\t@:from private static inline function __fromBGRA(bgra:BGRA):ARGB\n\t{\n\t\treturn ARGB.create(bgra.a, bgra.r, bgra.g, bgra.b);\n\t}\n\n\t@:from private static inline function __fromRGBA(rgba:RGBA):ARGB\n\t{\n\t\treturn ARGB.create(rgba.a, rgba.r, rgba.g, rgba.b);\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_a():Int\n\t{\n\t\treturn (this >> 24) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_a(value:Int):Int\n\t{\n\t\tset(value, r, g, b);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_b():Int\n\t{\n\t\treturn this & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_b(value:Int):Int\n\t{\n\t\tset(a, r, g, value);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_g():Int\n\t{\n\t\treturn (this >> 8) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_g(value:Int):Int\n\t{\n\t\tset(a, r, value, b);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_r():Int\n\t{\n\t\treturn (this >> 16) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_r(value:Int):Int\n\t{\n\t\tset(a, value, g, b);\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/BGRA.hx",
    "content": "package lime.math;\n\nimport lime.graphics.PixelFormat;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\n\n/**\n\tA utility for storing, accessing and converting colors in a BGRA\n\t(blue, green, red, alpha) color format.\n\n\t```haxe\n\tvar color:BGRA = 0x003388FF;\n\ttrace (color.b); // 0x00\n\ttrace (color.g); // 0x33\n\ttrace (color.r); // 0x88\n\ttrace (color.a); // 0xFF\n\n\tvar convert:ARGB = color; // 0xFF883300\n\t```\n**/\n@:transitive\nabstract BGRA(#if (flash && !lime_doc_gen) Int #else UInt #end) from Int to Int from UInt to UInt\n{\n\tprivate static var a16:Int;\n\tprivate static var unmult:Float;\n\n\t/**\n\t\tAccesses the alpha component of the color\n\t**/\n\tpublic var a(get, set):Int;\n\n\t/**\n\t\tAccesses the blue component of the color\n\t**/\n\tpublic var b(get, set):Int;\n\n\t/**\n\t\tAccesses the green component of the color\n\t**/\n\tpublic var g(get, set):Int;\n\n\t/**\n\t\tAccesses the red component of the color\n\t**/\n\tpublic var r(get, set):Int;\n\n\t/**\n\t\tCreates a new BGRA instance\n\t\t@param\tbgra\t(Optional) A BGRA color value\n\t**/\n\tpublic inline function new(bgra:Int = 0)\n\t{\n\t\tthis = bgra;\n\t}\n\n\t/**\n\t\tCreates a new BGRA instance from component values\n\t\t@param\tb\tA blue component value\n\t\t@param\tg\tA green component value\n\t\t@param\tr\tA red component value\n\t\t@param\ta\tAn alpha component value\n\t\t@return\tA new BGRA instance\n\t**/\n\tpublic static inline function create(b:Int, g:Int, r:Int, a:Int):BGRA\n\t{\n\t\tvar bgra = new BGRA();\n\t\tbgra.set(b, g, r, a);\n\t\treturn bgra;\n\t}\n\n\t/**\n\t\tMultiplies the red, green and blue components by the current alpha component\n\t**/\n\tpublic inline function multiplyAlpha()\n\t{\n\t\tif (a == 0)\n\t\t{\n\t\t\tthis = 0;\n\t\t}\n\t\telse if (a != 0xFF)\n\t\t{\n\t\t\ta16 = RGBA.__alpha16[a];\n\t\t\tset((b * a16) >> 16, (g * a16) >> 16, (r * a16) >> 16, a);\n\t\t}\n\t}\n\n\t/**\n\t\tReads a value from a `UInt8Array` into the current `BGRA` color\n\t\t@param\tdata\tA `UInt8Array` instance\n\t\t@param\toffset\tAn offset into the `UInt8Array` to read\n\t\t@param\tformat\t(Optional) The `PixelFormat` represented by the `UInt8Array` data\n\t\t@param\tpremultiplied\t(Optional) Whether the data is stored in premultiplied alpha format\n\t**/\n\tpublic inline function readUInt8(data:UInt8Array, offset:Int, format:PixelFormat = RGBA32, premultiplied:Bool = false):Void\n\t{\n\t\tswitch (format)\n\t\t{\n\t\t\tcase BGRA32:\n\t\t\t\tset(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);\n\n\t\t\tcase RGBA32:\n\t\t\t\tset(data[offset + 2], data[offset + 1], data[offset], data[offset + 3]);\n\n\t\t\tcase ARGB32:\n\t\t\t\tset(data[offset + 3], data[offset + 2], data[offset + 1], data[offset]);\n\t\t}\n\n\t\tif (premultiplied)\n\t\t{\n\t\t\tunmultiplyAlpha();\n\t\t}\n\t}\n\n\t/**\n\t\tSets the current `BGRA` color to new component values\n\t\t@param\tb\tThe blue component vlaue to set\n\t\t@param\tg\tThe green component value to set\n\t\t@param\tr\tThe red component value to set\n\t\t@param\ta\tThe alpha component value to set\n\t**/\n\tpublic inline function set(b:Int, g:Int, r:Int, a:Int):Void\n\t{\n\t\tthis = ((b & 0xFF) << 24) | ((g & 0xFF) << 16) | ((r & 0xFF) << 8) | (a & 0xFF);\n\t}\n\n\t/**\n\t\tDivides the current red, green and blue components by the alpha component\n\t**/\n\tpublic inline function unmultiplyAlpha()\n\t{\n\t\tif (a != 0 && a != 0xFF)\n\t\t{\n\t\t\tunmult = 255.0 / a;\n\t\t\tset(RGBA.__clamp[Math.floor(b * unmult)], RGBA.__clamp[Math.floor(g * unmult)], RGBA.__clamp[Math.floor(r * unmult)], a);\n\t\t}\n\t}\n\n\t/**\n\t\tWrites the current `BGRA` color into a `UInt8Array`\n\t\t@param\tdata\tA `UInt8Array` instance\n\t\t@param\toffset\tAn offset into the `UInt8Array` to write\n\t\t@param\tformat\t(Optional) The `PixelFormat` represented by the `UInt8Array` data\n\t\t@param\tpremultiplied\t(Optional) Whether the data is stored in premultiplied alpha format\n\t**/\n\tpublic inline function writeUInt8(data:UInt8Array, offset:Int, format:PixelFormat = RGBA32, premultiplied:Bool = false):Void\n\t{\n\t\tif (premultiplied)\n\t\t{\n\t\t\tmultiplyAlpha();\n\t\t}\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase BGRA32:\n\t\t\t\tdata[offset] = b;\n\t\t\t\tdata[offset + 1] = g;\n\t\t\t\tdata[offset + 2] = r;\n\t\t\t\tdata[offset + 3] = a;\n\n\t\t\tcase RGBA32:\n\t\t\t\tdata[offset] = r;\n\t\t\t\tdata[offset + 1] = g;\n\t\t\t\tdata[offset + 2] = b;\n\t\t\t\tdata[offset + 3] = a;\n\n\t\t\tcase ARGB32:\n\t\t\t\tdata[offset] = a;\n\t\t\t\tdata[offset + 1] = r;\n\t\t\t\tdata[offset + 2] = g;\n\t\t\t\tdata[offset + 3] = b;\n\t\t}\n\t}\n\n\t@:from private static inline function __fromARGB(argb:ARGB):BGRA\n\t{\n\t\treturn BGRA.create(argb.b, argb.g, argb.r, argb.a);\n\t}\n\n\t@:from private static inline function __fromRGBA(rgba:RGBA):BGRA\n\t{\n\t\treturn BGRA.create(rgba.b, rgba.g, rgba.r, rgba.a);\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_a():Int\n\t{\n\t\treturn this & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_a(value:Int):Int\n\t{\n\t\tset(b, g, r, value);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_b():Int\n\t{\n\t\treturn (this >> 24) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_b(value:Int):Int\n\t{\n\t\tset(value, g, r, a);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_g():Int\n\t{\n\t\treturn (this >> 16) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_g(value:Int):Int\n\t{\n\t\tset(b, value, r, a);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_r():Int\n\t{\n\t\treturn (this >> 8) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_r(value:Int):Int\n\t{\n\t\tset(b, g, value, a);\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/ColorMatrix.hx",
    "content": "package lime.math;\n\nimport lime.utils.Float32Array;\nimport lime.utils.UInt8Array;\n#if flash\nimport flash.geom.ColorTransform;\n#end\n\n/**\n\t`ColorMatrix` is a 4x5 matrix containing color multiplication\n\tand offset values for tinting and other kinds of color\n\tmanipulation. In addition to using the multiplier, offset and\n\t`color` properties, it can be edited directly as a `Float32Array`\n**/\nabstract ColorMatrix(Float32Array) from Float32Array to Float32Array\n{\n\tprivate static var __alphaTable:UInt8Array;\n\tprivate static var __blueTable:UInt8Array;\n\tprivate static var __greenTable:UInt8Array;\n\tprivate static var __identity = [\n\t\t1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0\n\t];\n\tprivate static var __redTable:UInt8Array;\n\n\t/**\n\t\tThe current alpha multiplication value (default is 1.0)\n\t**/\n\tpublic var alphaMultiplier(get, set):Float;\n\n\t/**\n\t\tThe current alpha offset value (default is 0)\n\t**/\n\tpublic var alphaOffset(get, set):Float;\n\n\t/**\n\t\tThe current blue multiplication value (default is 1.0)\n\t**/\n\tpublic var blueMultiplier(get, set):Float;\n\n\t/**\n\t\tThe current blue offset value (default is 0)\n\t**/\n\tpublic var blueOffset(get, set):Float;\n\n\t/**\n\t\tGets or sets a color offset for tinting.\n\n\t\tThis will change the red, green and blue multipliers\n\t\tto zero, and affect the red, green and blue offset\n\t\tvalues.\n\t**/\n\tpublic var color(get, set):Int;\n\n\t/**\n\t\tThe current green multiplication value (default is 1.0)\n\t**/\n\tpublic var greenMultiplier(get, set):Float;\n\n\t/**\n\t\tThe current green offset value (default is 0)\n\t**/\n\tpublic var greenOffset(get, set):Float;\n\n\t/**\n\t\tThe current red multiplication value (default is 1.0)\n\t**/\n\tpublic var redMultiplier(get, set):Float;\n\n\t/**\n\t\tThe current red offset value (default is 0)\n\t**/\n\tpublic var redOffset(get, set):Float;\n\n\t/**\n\t\tCreates a new `ColorMatrix` instance\n\t\t@param\tdata\t(Optional) Initial `Float32Array` data to use\n\t**/\n\tpublic function new(data:Float32Array = null)\n\t{\n\t\tif (data != null && data.length == 20)\n\t\t{\n\t\t\tthis = data;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = new Float32Array(__identity);\n\t\t}\n\t}\n\n\t/**\n\t\tCreates a duplicate of the current `ColorMatrix` instance\n\t\t@return\tA new `ColorMatrix` instance\n\t**/\n\tpublic function clone():ColorMatrix\n\t{\n\t\treturn new ColorMatrix(new Float32Array(this));\n\t}\n\n\t/**\n\t\tAdds the color multipliers from a second `ColorMatrix` to the current one\n\t\t@param\tsecond\tThe `ColorMatrix` to `concat` to the current one\n\t**/\n\tpublic function concat(second:ColorMatrix):Void\n\t{\n\t\tredMultiplier += second.redMultiplier;\n\t\tgreenMultiplier += second.greenMultiplier;\n\t\tblueMultiplier += second.blueMultiplier;\n\t\talphaMultiplier += second.alphaMultiplier;\n\t}\n\n\t/**\n\t\tSets the current `ColorMatrix` values to the same as another one\n\t\t@param\tother\tThe `ColorMatrix` to copy from\n\t**/\n\tpublic function copyFrom(other:ColorMatrix):Void\n\t{\n\t\tthis.set(cast other);\n\t}\n\n\t/**\n\t\tResets to default values\n\t**/\n\tpublic function identity()\n\t{\n\t\tthis[0] = 1;\n\t\tthis[1] = 0;\n\t\tthis[2] = 0;\n\t\tthis[3] = 0;\n\t\tthis[4] = 0;\n\t\tthis[5] = 0;\n\t\tthis[6] = 1;\n\t\tthis[7] = 0;\n\t\tthis[8] = 0;\n\t\tthis[9] = 0;\n\t\tthis[10] = 0;\n\t\tthis[11] = 0;\n\t\tthis[12] = 1;\n\t\tthis[13] = 0;\n\t\tthis[14] = 0;\n\t\tthis[15] = 0;\n\t\tthis[16] = 0;\n\t\tthis[17] = 0;\n\t\tthis[18] = 1;\n\t\tthis[19] = 0;\n\t}\n\n\t/**\n\t\tReturns a reference to a `UInt8Array` table for transforming\n\t\talpha values using the current matrix.\n\n\t\tThe table is 256 values in length, and includes values based\n\t\ton the `alphaMultipler` and `alphaOffset` values of the matrix.\n\n\t\tThe values are constrained within 0 and 255.\n\n\t\tFor example:\n\n\t\t```haxe\n\t\tvar colorMatrix = new ColorMatrix ();\n\t\tcolorMatrix.alphaOffset = 12;\n\n\t\tvar alphaTable = colorMatrix.getAlphaTable ();\n\t\ttrace (alphaTable[0]); // 12\n\t\ttrace (alphaTable[1]); // 13\n\t\t```\n\t**/\n\tpublic function getAlphaTable():UInt8Array\n\t{\n\t\tif (__alphaTable == null)\n\t\t{\n\t\t\t__alphaTable = new UInt8Array(256);\n\t\t}\n\n\t\tvar value:Int;\n\t\t__alphaTable[0] = 0;\n\n\t\tfor (i in 1...256)\n\t\t{\n\t\t\tvalue = Math.floor(i * alphaMultiplier + alphaOffset);\n\t\t\tif (value > 0xFF) value = 0xFF;\n\t\t\tif (value < 0) value = 0;\n\t\t\t__alphaTable[i] = value;\n\t\t}\n\n\t\treturn __alphaTable;\n\t}\n\n\t/**\n\t\tReturns a reference to a `UInt8Array` table for transforming\n\t\tblue values using the current matrix.\n\n\t\tThe table is 256 values in length, and includes values based\n\t\ton the `blueMultiplier` and `blueOffset` values of the matrix.\n\n\t\tThe values are constrained within 0 and 255.\n\n\t\tFor example:\n\n\t\t```haxe\n\t\tvar colorMatrix = new ColorMatrix ();\n\t\tcolorMatrix.blueOffset = 16;\n\n\t\tvar blueTable = colorMatrix.getBlueTable ();\n\t\ttrace (blueTable[0]); // 16\n\t\ttrace (blueTable[1]); // 17\n\t\t```\n\t**/\n\tpublic function getBlueTable():UInt8Array\n\t{\n\t\tif (__blueTable == null)\n\t\t{\n\t\t\t__blueTable = new UInt8Array(256);\n\t\t}\n\n\t\tvar value:Int;\n\n\t\tfor (i in 0...256)\n\t\t{\n\t\t\tvalue = Math.floor(i * blueMultiplier + blueOffset);\n\t\t\tif (value > 0xFF) value = 0xFF;\n\t\t\tif (value < 0) value = 0;\n\t\t\t__blueTable[i] = value;\n\t\t}\n\n\t\treturn __blueTable;\n\t}\n\n\t/**\n\t\tReturns a reference to a `UInt8Array` table for transforming\n\t\tgreen values using the current matrix.\n\n\t\tThe table is 256 values in length, and includes values based\n\t\ton the `greenMultiplier` and `greenOffset` values of the matrix.\n\n\t\tThe values are constrained within 0 and 255.\n\n\t\tFor example:\n\n\t\t```haxe\n\t\tvar colorMatrix = new ColorMatrix ();\n\t\tcolorMatrix.greenOffset = 16;\n\n\t\tvar greenTable = colorMatrix.getGreenTable ();\n\t\ttrace (greenTable[0]); // 16\n\t\ttrace (greenTable[1]); // 17\n\t\t```\n\t**/\n\tpublic function getGreenTable():UInt8Array\n\t{\n\t\tif (__greenTable == null)\n\t\t{\n\t\t\t__greenTable = new UInt8Array(256);\n\t\t}\n\n\t\tvar value:Int;\n\n\t\tfor (i in 0...256)\n\t\t{\n\t\t\tvalue = Math.floor(i * greenMultiplier + greenOffset);\n\t\t\tif (value > 0xFF) value = 0xFF;\n\t\t\tif (value < 0) value = 0;\n\t\t\t__greenTable[i] = value;\n\t\t}\n\n\t\treturn __greenTable;\n\t}\n\n\t/**\n\t\tReturns a reference to a `UInt8Array` table for transforming\n\t\tred values using the current matrix.\n\n\t\tThe table is 256 values in length, and includes values based\n\t\ton the `redMultiplier` and `redOffset` values of the matrix.\n\n\t\tThe values are constrained within 0 and 255.\n\n\t\tFor example:\n\n\t\t```haxe\n\t\tvar colorMatrix = new ColorMatrix ();\n\t\tcolorMatrix.redOffset = 16;\n\n\t\tvar redTable = colorMatrix.getRedTable ();\n\t\ttrace (redTable[0]); // 16\n\t\ttrace (redTable[1]); // 17\n\t\t```\n\t**/\n\tpublic function getRedTable():UInt8Array\n\t{\n\t\tif (__redTable == null)\n\t\t{\n\t\t\t__redTable = new UInt8Array(256);\n\t\t}\n\n\t\tvar value:Int;\n\n\t\tfor (i in 0...256)\n\t\t{\n\t\t\tvalue = Math.floor(i * redMultiplier + redOffset);\n\t\t\tif (value > 0xFF) value = 0xFF;\n\t\t\tif (value < 0) value = 0;\n\t\t\t__redTable[i] = value;\n\t\t}\n\n\t\treturn __redTable;\n\t}\n\n\t@:noCompletion private function __toFlashColorTransform():#if flash ColorTransform #else Dynamic #end\n\t{\n\t\t#if flash\n\t\treturn new ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_alphaMultiplier():Float\n\t{\n\t\treturn this[18];\n\t}\n\n\t@:noCompletion private inline function set_alphaMultiplier(value:Float):Float\n\t{\n\t\treturn this[18] = value;\n\t}\n\n\t@:noCompletion private inline function get_alphaOffset():Float\n\t{\n\t\treturn this[19] * 255;\n\t}\n\n\t@:noCompletion private inline function set_alphaOffset(value:Float):Float\n\t{\n\t\treturn this[19] = value / 255;\n\t}\n\n\t@:noCompletion private inline function get_blueMultiplier():Float\n\t{\n\t\treturn this[12];\n\t}\n\n\t@:noCompletion private inline function set_blueMultiplier(value:Float):Float\n\t{\n\t\treturn this[12] = value;\n\t}\n\n\t@:noCompletion private inline function get_blueOffset():Float\n\t{\n\t\treturn this[14] * 255;\n\t}\n\n\t@:noCompletion private inline function set_blueOffset(value:Float):Float\n\t{\n\t\treturn this[14] = value / 255;\n\t}\n\n\t@:noCompletion private function get_color():Int\n\t{\n\t\treturn ((Std.int(redOffset) << 16) | (Std.int(greenOffset) << 8) | Std.int(blueOffset));\n\t}\n\n\t@:noCompletion private function set_color(value:Int):Int\n\t{\n\t\tredOffset = (value >> 16) & 0xFF;\n\t\tgreenOffset = (value >> 8) & 0xFF;\n\t\tblueOffset = value & 0xFF;\n\n\t\tredMultiplier = 0;\n\t\tgreenMultiplier = 0;\n\t\tblueMultiplier = 0;\n\n\t\treturn color;\n\t}\n\n\t@:noCompletion private inline function get_greenMultiplier():Float\n\t{\n\t\treturn this[6];\n\t}\n\n\t@:noCompletion private inline function set_greenMultiplier(value:Float):Float\n\t{\n\t\treturn this[6] = value;\n\t}\n\n\t@:noCompletion private inline function get_greenOffset():Float\n\t{\n\t\treturn this[9] * 255;\n\t}\n\n\t@:noCompletion private inline function set_greenOffset(value:Float):Float\n\t{\n\t\treturn this[9] = value / 255;\n\t}\n\n\t@:noCompletion private inline function get_redMultiplier():Float\n\t{\n\t\treturn this[0];\n\t}\n\n\t@:noCompletion private inline function set_redMultiplier(value:Float):Float\n\t{\n\t\treturn this[0] = value;\n\t}\n\n\t@:noCompletion private inline function get_redOffset():Float\n\t{\n\t\treturn this[4] * 255;\n\t}\n\n\t@:noCompletion private inline function set_redOffset(value:Float):Float\n\t{\n\t\treturn this[4] = value / 255;\n\t}\n\n\t@:dox(hide) @:noCompletion @:arrayAccess public function get(index:Int):Float\n\t{\n\t\treturn this[index];\n\t}\n\n\t@:dox(hide) @:noCompletion @:arrayAccess public function set(index:Int, value:Float):Float\n\t{\n\t\treturn this[index] = value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/Matrix3.hx",
    "content": "package lime.math;\n\nimport lime.utils.Float32Array;\n\n/**\n\t`Matrix3` is a 3x3 transformation matrix particularly useful for\n\ttwo-dimensional transformation. It can be used for rotation, scale\n\tand skewing of a two-dimensional object.\n\n\tAlthough a 3x3 matrix is represented, configurable values can be\n\tconsidered as a 3x2 matrix:\n\n\t```\n\t[ a, c, tx ]\n\t[ b, d, ty ]\n\t[ 0, 0,  1 ]\n\t```\n\n\tValues are stored in column-major order for GLSL compatibility.\n**/\n#if hl\n@:keep\n#end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nabstract Matrix3(Float32Array) to Float32Array\n{\n\t/**\n\t\tThe matrix a component, used in scaling and skewing (default is 1)\n\t**/\n\tpublic var a(get, set):Float;\n\n\t/**\n\t\tThe matrix b component, used in rotation and skewing (default is 0)\n\t**/\n\tpublic var b(get, set):Float;\n\n\t/**\n\t\tThe matrix c component, used in rotation and skewing (default is 0)\n\t**/\n\tpublic var c(get, set):Float;\n\n\t/**\n\t\tThe matrix d component, used in scaling and skewing (default is 1)\n\t**/\n\tpublic var d(get, set):Float;\n\n\t/**\n\t\tThe matrix tx component, used in translation (default is 0)\n\t**/\n\tpublic var tx(get, set):Float;\n\n\t/**\n\t\tThe matrix ty component, used in translation (default is 0)\n\t**/\n\tpublic var ty(get, set):Float;\n\n\t/**\n\t\tCreates a new `Matrix` instance\n\t\t@param\ta\t(Optional) An initial a component value (default is 1)\n\t\t@param\tb\t(Optional) An initial b component value (default is 0)\n\t\t@param\tc\t(Optional) An initial c component value (default is 0)\n\t\t@param\td\t(Optional) An initial d component value (default is 1)\n\t\t@param\ttx\t(Optional) An initial tx component value (default is 0)\n\t\t@param\tty\t(Optional) An initial ty component value (default is 0)\n\t**/\n\tpublic function new(a:Float = 1, b:Float = 0, c:Float = 0, d:Float = 1, tx:Float = 0, ty:Float = 0)\n\t{\n\t\t// Column-major order means adjacent values form a column, not a row.\n\t\tthis = new Float32Array([\n\t\t\ta,  b,  0, // column 0\n\t\t\tc,  d,  0, // column 1\n\t\t\ttx, ty, 1  // column 2\n\t\t]);\n\t}\n\n\t/**\n\t\tCreates a duplicate of the current `Matrix3`\n\t\t@return\tA duplicate `Matrix3` instance\n\t**/\n\tpublic inline function clone():Matrix3\n\t{\n\t\treturn new Matrix3(a, b, c, d, tx, ty);\n\t}\n\n\t/**\n\t\tConcatenates the values of a second matrix to the current\n\t\t`Matrix3`, combining the effects of both. This is the same\n\t\tas matrix multiplication. The second matrix is not modified.\n\t\t@param\tm\tA second `Matrix3` to concatenate to the current instance\n\t**/\n\tpublic function concat(m:Matrix3):Void\n\t{\n\t\tvar a1 = a * m.a + b * m.c;\n\t\tb = a * m.b + b * m.d;\n\t\ta = a1;\n\n\t\tvar c1 = c * m.a + d * m.c;\n\t\td = c * m.b + d * m.d;\n\t\tc = c1;\n\n\t\tvar tx1 = tx * m.a + ty * m.c + m.tx;\n\t\tty = tx * m.b + ty * m.d + m.ty;\n\t\ttx = tx1;\n\t}\n\n\t/**\n\t\tCopies the `x` and `y` components from a `Vector4` instance\n\t\tto the `a`/`c`, `b`/`d` or the `tx`/`ty` column of the current\n\t\tmatrix\n\t\t@param\tcolumn\tThe column to copy into (0, 1 or 2)\n\t\t@param\tvector4\tThe `Vector4` instance to copy from\n\t**/\n\tpublic function copyColumnFrom(column:Int, vector4:Vector4):Void\n\t{\n\t\tif (column > 2)\n\t\t{\n\t\t\tthrow \"Column \" + column + \" out of bounds (2)\";\n\t\t}\n\t\telse if (column == 0)\n\t\t{\n\t\t\ta = vector4.x;\n\t\t\tb = vector4.y;\n\t\t}\n\t\telse if (column == 1)\n\t\t{\n\t\t\tc = vector4.x;\n\t\t\td = vector4.y;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttx = vector4.x;\n\t\t\tty = vector4.y;\n\t\t}\n\t}\n\n\t/**\n\t\tCopies a column of the current matrix into a `Vector4`\n\t\tinstance. The `w` value will not be modified.\n\t\t@param\tcolumn\tThe column to copy from (0, 1 or 2)\n\t\t@param\tvector4\tThe `Vector4` instance to copy to\n\t**/\n\tpublic function copyColumnTo(column:Int, vector4:Vector4):Void\n\t{\n\t\tif (column > 2)\n\t\t{\n\t\t\tthrow \"Column \" + column + \" out of bounds (2)\";\n\t\t}\n\t\telse if (column == 0)\n\t\t{\n\t\t\tvector4.x = a;\n\t\t\tvector4.y = b;\n\t\t\tvector4.z = 0;\n\t\t}\n\t\telse if (column == 1)\n\t\t{\n\t\t\tvector4.x = c;\n\t\t\tvector4.y = d;\n\t\t\tvector4.z = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvector4.x = tx;\n\t\t\tvector4.y = ty;\n\t\t\tvector4.z = 1;\n\t\t}\n\t}\n\n\t/**\n\t\tCopies the values of another `Matrix3` and\n\t\tapplies it to the current instance\n\t\t@param\tsourceMatrix3\tThe `Matrix3` to copy from\n\t**/\n\tpublic function copyFrom(sourceMatrix3:Matrix3):Void\n\t{\n\t\ta = sourceMatrix3.a;\n\t\tb = sourceMatrix3.b;\n\t\tc = sourceMatrix3.c;\n\t\td = sourceMatrix3.d;\n\t\ttx = sourceMatrix3.tx;\n\t\tty = sourceMatrix3.ty;\n\t}\n\n\t/**\n\t\tCopies the values of a `Vector4` instance into a row\n\t\tof the current matrix\n\t\t@param\trow\tThe row to copy into (0 or 1)\n\t\t@param\tvector4\tThe `Vector4` instance to copy from\n\t**/\n\tpublic function copyRowFrom(row:Int, vector4:Vector4):Void\n\t{\n\t\tif (row > 2)\n\t\t{\n\t\t\tthrow \"Row \" + row + \" out of bounds (2)\";\n\t\t}\n\t\telse if (row == 0)\n\t\t{\n\t\t\ta = vector4.x;\n\t\t\tc = vector4.y;\n\t\t\ttx = vector4.z;\n\t\t}\n\t\telse if (row == 1)\n\t\t{\n\t\t\tb = vector4.x;\n\t\t\td = vector4.y;\n\t\t\tty = vector4.z;\n\t\t}\n\t}\n\n\t/**\n\t\tCopies a row of the current matrix into a `Vector4`\n\t\tinstance. The `w` value will not be modified.\n\t\t@param\trow\tThe row to copy into (0, 1 or 2)\n\t\t@param\tvector4\tThe `Vector4` instance to copy from\n\t**/\n\tpublic function copyRowTo(row:Int, vector4:Vector4):Void\n\t{\n\t\tif (row > 2)\n\t\t{\n\t\t\tthrow \"Row \" + row + \" out of bounds (2)\";\n\t\t}\n\t\telse if (row == 0)\n\t\t{\n\t\t\tvector4.x = a;\n\t\t\tvector4.y = c;\n\t\t\tvector4.z = tx;\n\t\t}\n\t\telse if (row == 1)\n\t\t{\n\t\t\tvector4.x = b;\n\t\t\tvector4.y = d;\n\t\t\tvector4.z = ty;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvector4.setTo(0, 0, 1);\n\t\t}\n\t}\n\n\t/**\n\t\tApplies a two-dimensional transformation to the current matrix.\n\n\t\tThis is the same as calling `identity()`, `rotate()`, `scale()`\n\t\tthen `translate()` with these values.\n\t\t@param\tscaleX\tAn x scale transformation value\n\t\t@param\tscaleY\tA y scale transformation value\n\t\t@param\trotation (Optional) A rotation value (default is 0)\n\t\t@param\txTranslate\t(Optional) A translate x value (default is 0)\n\t\t@param\tyTranslate\t(Optional) A translate y value (default is 0)\n\t**/\n\tpublic function createBox(scaleX:Float, scaleY:Float, rotation:Float = 0, xTranslate:Float = 0, yTranslate:Float = 0):Void\n\t{\n\t\tif (rotation != 0)\n\t\t{\n\t\t\tvar cos = Math.cos(rotation);\n\t\t\tvar sin = Math.sin(rotation);\n\n\t\t\ta = cos * scaleX;\n\t\t\tb = sin * scaleY;\n\t\t\tc = -sin * scaleX;\n\t\t\td = cos * scaleY;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ta = scaleX;\n\t\t\tb = 0;\n\t\t\tc = 0;\n\t\t\td = scaleY;\n\t\t}\n\n\t\ttx = xTranslate;\n\t\tty = yTranslate;\n\t}\n\n\t/**\n\t\tCreates a matrix to use for a linear gradient fill\n\t\t@param\twidth\tThe width of the gradient fill\n\t\t@param\theight\tThe height of the gradient fill\n\t\t@param\trotation\t(Optional) A rotation for the gradient fill (default is 0)\n\t\t@param\txTranslate\t(Optional) An x offset for the gradient fill (default is 0)\n\t\t@param\tyTranslate\t(Optional) A y offset for the gradient fill (default is 0)\n\t\t@return\tA new `Matrix` instance\n\t**/\n\tpublic function createGradientBox(width:Float, height:Float, rotation:Float = 0, xTranslate:Float = 0, yTranslate:Float = 0):Void\n\t{\n\t\ta = width / 1638.4;\n\t\td = height / 1638.4;\n\n\t\t// rotation is clockwise\n\t\tif (rotation != 0)\n\t\t{\n\t\t\tvar cos = Math.cos(rotation);\n\t\t\tvar sin = Math.sin(rotation);\n\n\t\t\tb = sin * d;\n\t\t\tc = -sin * a;\n\t\t\ta *= cos;\n\t\t\td *= cos;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tb = 0;\n\t\t\tc = 0;\n\t\t}\n\n\t\ttx = xTranslate + width / 2;\n\t\tty = yTranslate + height / 2;\n\t}\n\n\t/**\n\t\tCheck if two matrices have the same values\n\t\t@return\tWhether both matrices are equal\n\t**/\n\tpublic function equals(matrix3:Matrix3):Bool\n\t{\n\t\treturn (matrix3 != null && tx == matrix3.tx && ty == matrix3.ty && a == matrix3.a && b == matrix3.b && c == matrix3.c && d == matrix3.d);\n\t}\n\n\t/**\n\t\tTransforms a `Vector2` instance by the current matrix,\n\t\twithout considering the `tx` and `ty` values of the matrix\n\t\t@param\tresult\t(Optional) An existing `Vector2` instance to fill with the result\n\t\t@return\tA new `Vector2` instance representing the transformed values\n\t**/\n\tpublic function deltaTransformVector(Vector2:Vector2, result:Vector2 = null):Vector2\n\t{\n\t\tif (result == null) result = new Vector2();\n\t\tresult.x = Vector2.x * a + Vector2.y * c;\n\t\tresult.y = Vector2.x * b + Vector2.y * d;\n\t\treturn result;\n\t}\n\n\t@:from private static inline function fromCairoMatrix3(matrix:CairoMatrix3):Matrix3\n\t{\n\t\treturn new Matrix3(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n\t}\n\n\t@:from private static inline function fromFloat32Array(array:Float32Array):Matrix3\n\t{\n\t\tif (array.length != 9)\n\t\t{\n\t\t\tthrow \"Expected array of length 9, got \" + array.length;\n\t\t}\n\n\t\treturn cast array;\n\t}\n\n\t/**\n\t\tResets the matrix to default identity values\n\t**/\n\tpublic function identity():Void\n\t{\n\t\ta = 1;\n\t\tb = 0;\n\t\tc = 0;\n\t\td = 1;\n\t\ttx = 0;\n\t\tty = 0;\n\t}\n\n\t/**\n\t\tInverts the values of the current matrix\n\t\t@return\tThe current matrix instance\n\t**/\n\tpublic function invert():Matrix3\n\t{\n\t\tvar norm = a * d - b * c;\n\n\t\tif (norm == 0)\n\t\t{\n\t\t\ta = b = c = d = 0;\n\t\t\ttx = -tx;\n\t\t\tty = -ty;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnorm = 1.0 / norm;\n\t\t\tvar a1 = d * norm;\n\t\t\td = a * norm;\n\t\t\ta = a1;\n\t\t\tb *= -norm;\n\t\t\tc *= -norm;\n\n\t\t\tvar tx1 = -a * tx - c * ty;\n\t\t\tty = -b * tx - d * ty;\n\t\t\ttx = tx1;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t\tApplies rotation to the current matrix\n\t\t@param\ttheta\tA rotation value in degrees\n\t**/\n\tpublic function rotate(theta:Float):Void\n\t{\n\t\t/*\n\t\t\tRotate object \"after\" other transforms\n\n\t\t\t[  a  c  tx ][  ma  mc  mtx ]\n\t\t\t[  b  d  ty ][  mb  md  mty ]\n\t\t\t[  0  0   1 ][   0   0    1 ]\n\n\t\t\tma = md = cos\n\t\t\tmb = sin\n\t\t\tmc = -sin\n\t\t\tmtx = my = 0\n\n\t\t */\n\n\t\tvar cos = Math.cos(theta);\n\t\tvar sin = Math.sin(theta);\n\n\t\tvar a1 = a * cos - b * sin;\n\t\tb = a * sin + b * cos;\n\t\ta = a1;\n\n\t\tvar c1 = c * cos - d * sin;\n\t\td = c * sin + d * cos;\n\t\tc = c1;\n\n\t\tvar tx1 = tx * cos - ty * sin;\n\t\tty = tx * sin + ty * cos;\n\t\ttx = tx1;\n\t}\n\n\t/**\n\t\tScales the current matrix\n\t\t@param\tsx\tThe x scale to apply\n\t\t@param\tsy\tThe y scale to apply\n\t**/\n\tpublic function scale(sx:Float, sy:Float):Void\n\t{\n\t\t/*\n\n\t\t\tScale object \"after\" other transforms\n\n\t\t\t[  a  c  tx ][  sx  0   0 ]\n\t\t\t[  b  d  ty ][  0   sy  0 ]\n\t\t\t[  0  0   1 ][  0   0   1 ]\n\t\t */\n\n\t\ta *= sx;\n\t\tb *= sy;\n\t\tc *= sx;\n\t\td *= sy;\n\t\ttx *= sx;\n\t\tty *= sy;\n\t}\n\n\t@:noCompletion private inline function setRotation(theta:Float, scale:Float = 1):Void\n\t{\n\t\ta = Math.cos(theta) * scale;\n\t\tc = Math.sin(theta) * scale;\n\t\tb = -c;\n\t\td = a;\n\t}\n\n\t/**\n\t\tSets the values of the current matrix\n\t\t@param\ta\tThe new matrix a value\n\t\t@param\tb\tThe new matrix b value\n\t\t@param\tc\tThe new matrix c value\n\t\t@param\td\tThe new matrix d value\n\t\t@param\ttx\tThe new matrix tx value\n\t\t@param\tty\tThe new matrix ty value\n\t**/\n\tpublic #if !js inline #end function setTo(a:Float, b:Float, c:Float, d:Float, tx:Float, ty:Float):Void\n\t{\n\t\tset_a(a);\n\t\tset_b(b);\n\t\tset_c(c);\n\t\tset_d(d);\n\t\tset_tx(tx);\n\t\tset_ty(ty);\n\t}\n\n\t@:dox(hide) @:noCompletion @:to public inline function toCairoMatrix3():CairoMatrix3\n\t{\n\t\treturn new CairoMatrix3(a, b, c, d, tx, ty);\n\t}\n\n\t@:dox(hide) public inline function toString():String\n\t{\n\t\treturn 'matrix($a, $b, $c, $d, $tx, $ty)';\n\t}\n\n\t/**\n\t\tTransforms a `Rectangle` instance by the current matrix\n\t\tand returns `Rectangle` with the bounds of the transformed\n\t\trectangle.\n\t\t@param\ttransform\tA `Matrix3` instance to transform by\n\t\t@param\tresult\t(Optional) A `Rectangle` instance to use for the result\n\t\t@return\tA `Rectangle` represented the transformed bounds\n\t**/\n\tpublic function transformRect(rect:Rectangle, result:Rectangle = null):Rectangle\n\t{\n\t\tif (result == null) result = new Rectangle();\n\n\t\tvar tx0 = a * rect.x + c * rect.y;\n\t\tvar tx1 = tx0;\n\t\tvar ty0 = b * rect.x + d * rect.y;\n\t\tvar ty1 = ty0;\n\n\t\tvar tx = a * (rect.x + rect.width) + c * rect.y;\n\t\tvar ty = b * (rect.x + rect.width) + d * rect.y;\n\n\t\tif (tx < tx0) tx0 = tx;\n\t\tif (ty < ty0) ty0 = ty;\n\t\tif (tx > tx1) tx1 = tx;\n\t\tif (ty > ty1) ty1 = ty;\n\n\t\ttx = a * (rect.x + rect.width) + c * (rect.y + rect.height);\n\t\tty = b * (rect.x + rect.width) + d * (rect.y + rect.height);\n\n\t\tif (tx < tx0) tx0 = tx;\n\t\tif (ty < ty0) ty0 = ty;\n\t\tif (tx > tx1) tx1 = tx;\n\t\tif (ty > ty1) ty1 = ty;\n\n\t\ttx = a * rect.x + c * (rect.y + rect.height);\n\t\tty = b * rect.x + d * (rect.y + rect.height);\n\n\t\tif (tx < tx0) tx0 = tx;\n\t\tif (ty < ty0) ty0 = ty;\n\t\tif (tx > tx1) tx1 = tx;\n\t\tif (ty > ty1) ty1 = ty;\n\n\t\tresult.setTo(tx0 + tx, ty0 + ty, tx1 - tx0, ty1 - ty0);\n\t\treturn result;\n\t}\n\n\t/**\n\t\tTransforms a `Vector2` instance by the current matrix\n\t\t@param\tresult\t(Optional) An existing `Vector2` instance to fill with the result\n\t\t@return\tA new `Vector2` instance representing the transformed values\n\t**/\n\tpublic function transformVector(pos:Vector2, result:Vector2 = null):Vector2\n\t{\n\t\tif (result == null) result = new Vector2();\n\t\tresult.x = pos.x * a + pos.y * c + tx;\n\t\tresult.y = pos.x * b + pos.y * d + ty;\n\t\treturn result;\n\t}\n\n\t/**\n\t\tAdjusts the `tx` and `ty` of the current matrix\n\t\t@param\tdx\tThe x amount to translate\n\t\t@param\tdy\tThe y amount to translate\n\t**/\n\tpublic inline function translate(dx:Float, dy:Float)\n\t{\n\t\ttx += dx;\n\t\tty += dy;\n\t}\n\n\tinline function get_a():Float\n\t{\n\t\treturn this[0];\n\t}\n\tinline function set_a(value: Float):Float\n\t{\n\t\treturn this[0] = value;\n\t}\n\n\tinline function get_b():Float\n\t{\n\t\treturn this[1];\n\t}\n\tinline function set_b(value: Float):Float\n\t{\n\t\treturn this[1] = value;\n\t}\n\n\tinline function get_c():Float\n\t{\n\t\treturn this[3];\n\t}\n\tinline function set_c(value: Float):Float\n\t{\n\t\treturn this[3] = value;\n\t}\n\n\tinline function get_d():Float\n\t{\n\t\treturn this[4];\n\t}\n\tinline function set_d(value: Float):Float\n\t{\n\t\treturn this[4] = value;\n\t}\n\n\tinline function get_tx():Float\n\t{\n\t\treturn this[6];\n\t}\n\tinline function set_tx(value: Float):Float\n\t{\n\t\treturn this[6] = value;\n\t}\n\n\tinline function get_ty():Float\n\t{\n\t\treturn this[7];\n\t}\n\tinline function set_ty(value: Float):Float\n\t{\n\t\treturn this[7] = value;\n\t}\n\n\t@:dox(hide) @:noCompletion @:arrayAccess public function get(index:Int):Float\n\t{\n\t\treturn this[index];\n\t}\n\n\t@:dox(hide) @:noCompletion @:arrayAccess public function set(index:Int, value:Float):Float\n\t{\n\t\tthis[index] = value;\n\t\treturn value;\n\t}\n}\n\n/**\n\tAn object with the same data as a `Matrix3`, in Cairo's expected format.\n**/\nclass CairoMatrix3\n{\n\tpublic var a:Float;\n\tpublic var b:Float;\n\tpublic var c:Float;\n\tpublic var d:Float;\n\tpublic var tx:Float;\n\tpublic var ty:Float;\n\n\tpublic function new(a:Float = 1, b:Float = 0, c:Float = 0, d:Float = 1, tx:Float = 0, ty:Float = 0)\n\t{\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.d = d;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/Matrix4.hx",
    "content": "package lime.math;\n\nimport lime.utils.Float32Array;\nimport lime.utils.Log;\n\n/**\n\t`Matrix4` is a 4x4 matrix, useful for 3D calculations\n**/\nabstract Matrix4(Float32Array) from Float32Array to Float32Array\n{\n\tprivate static var __identity:Array<Float> = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0];\n\n\t/**\n\t\tGets the determinant of the matrix\n\t**/\n\tpublic var determinant(get, never):Float;\n\n\t/**\n\t\tGets or sets the position value of this matrix\n\t**/\n\tpublic var position(get, set):Vector4;\n\n\t/**\n\t\tCreates a new matrix instance\n\t\t@param\tdata\t(Optional) A `Float32Array` of 16 values to use for this matrix\n\t**/\n\tpublic function new(data:Float32Array = null)\n\t{\n\t\tif (data != null && data.length == 16)\n\t\t{\n\t\t\tthis = data;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = new Float32Array(__identity);\n\t\t}\n\t}\n\n\t/**\n\t\tAppends a second matrix by multiplying its values against the current one\n\t\t@param\tlhs\tA second matrix instance\n\t**/\n\tpublic function append(lhs:Matrix4):Void\n\t{\n\t\tvar m111:Float = this[0],\n\t\t\tm121:Float = this[4],\n\t\t\tm131:Float = this[8],\n\t\t\tm141:Float = this[12],\n\t\t\tm112:Float = this[1],\n\t\t\tm122:Float = this[5],\n\t\t\tm132:Float = this[9],\n\t\t\tm142:Float = this[13],\n\t\t\tm113:Float = this[2],\n\t\t\tm123:Float = this[6],\n\t\t\tm133:Float = this[10],\n\t\t\tm143:Float = this[14],\n\t\t\tm114:Float = this[3],\n\t\t\tm124:Float = this[7],\n\t\t\tm134:Float = this[11],\n\t\t\tm144:Float = this[15],\n\t\t\tm211:Float = lhs[0],\n\t\t\tm221:Float = lhs[4],\n\t\t\tm231:Float = lhs[8],\n\t\t\tm241:Float = lhs[12],\n\t\t\tm212:Float = lhs[1],\n\t\t\tm222:Float = lhs[5],\n\t\t\tm232:Float = lhs[9],\n\t\t\tm242:Float = lhs[13],\n\t\t\tm213:Float = lhs[2],\n\t\t\tm223:Float = lhs[6],\n\t\t\tm233:Float = lhs[10],\n\t\t\tm243:Float = lhs[14],\n\t\t\tm214:Float = lhs[3],\n\t\t\tm224:Float = lhs[7],\n\t\t\tm234:Float = lhs[11],\n\t\t\tm244:Float = lhs[15];\n\n\t\tthis[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241;\n\t\tthis[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242;\n\t\tthis[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243;\n\t\tthis[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244;\n\n\t\tthis[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241;\n\t\tthis[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242;\n\t\tthis[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243;\n\t\tthis[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244;\n\n\t\tthis[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241;\n\t\tthis[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242;\n\t\tthis[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243;\n\t\tthis[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244;\n\n\t\tthis[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241;\n\t\tthis[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242;\n\t\tthis[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243;\n\t\tthis[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244;\n\t}\n\n\t/**\n\t\tAppends rotation to the current matrix\n\t\t@param\tdegrees\tA rotation value (in degrees)\n\t\t@param\taxis\tThe coordinate position of the rotation axis\n\t\t@param\tpivotPoint\t(Optional) A pivot point to use in the rotation\n\t**/\n\tpublic function appendRotation(degrees:Float, axis:Vector4, pivotPoint:Vector4 = null):Void\n\t{\n\t\tvar m = __getAxisRotation(axis.x, axis.y, axis.z, degrees);\n\n\t\tif (pivotPoint != null)\n\t\t{\n\t\t\tvar p = pivotPoint;\n\t\t\tm.appendTranslation(p.x, p.y, p.z);\n\t\t}\n\n\t\tappend(m);\n\t}\n\n\t/**\n\t\tAppends a scale value to the current matrix\n\t\t@param\txScale\tThe x scale to append\n\t\t@param\tyScale\tThe y scale to append\n\t\t@param\tzScale\tThe z scale to append\n\t**/\n\tpublic function appendScale(xScale:Float, yScale:Float, zScale:Float):Void\n\t{\n\t\tappend(new Matrix4(new Float32Array([\n\t\t\txScale, 0.0, 0.0, 0.0, 0.0, yScale, 0.0, 0.0, 0.0, 0.0, zScale, 0.0, 0.0, 0.0, 0.0, 1.0\n\t\t])));\n\t}\n\n\t/**\n\t\tIncreases the position/translation of the current matrix\n\t\t@param\tx\tThe x amount to offset the current position\n\t\t@param\ty\tThe y amount to offset the current position\n\t\t@param\tz\tThe z amount to offset the current position\n\t**/\n\tpublic function appendTranslation(x:Float, y:Float, z:Float):Void\n\t{\n\t\tthis[12] = this[12] + x;\n\t\tthis[13] = this[13] + y;\n\t\tthis[14] = this[14] + z;\n\t}\n\n\t/**\n\t\tCreates a duplicate of the current `Matrix4`\n\t\t@return\tA new `Matrix4` with the same values as the current matrix\n\t**/\n\tpublic function clone():Matrix4\n\t{\n\t\treturn new Matrix4(new Float32Array(this));\n\t}\n\n\t/**\n\t\tCopies a column of data from a `Vector4` instance into the values of this matrix\n\t\t@param\tcolumn\tThe column to copy into (0, 1, 2 or 3)\n\t\t@param\tvector\tThe `Vector4` copy from\n\t**/\n\tpublic function copyColumnFrom(column:Int, vector:Vector4):Void\n\t{\n\t\tswitch (column)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tthis[0] = vector.x;\n\t\t\t\tthis[1] = vector.y;\n\t\t\t\tthis[2] = vector.z;\n\t\t\t\tthis[3] = vector.w;\n\n\t\t\tcase 1:\n\t\t\t\tthis[4] = vector.x;\n\t\t\t\tthis[5] = vector.y;\n\t\t\t\tthis[6] = vector.z;\n\t\t\t\tthis[7] = vector.w;\n\n\t\t\tcase 2:\n\t\t\t\tthis[8] = vector.x;\n\t\t\t\tthis[9] = vector.y;\n\t\t\t\tthis[10] = vector.z;\n\t\t\t\tthis[11] = vector.w;\n\n\t\t\tcase 3:\n\t\t\t\tthis[12] = vector.x;\n\t\t\t\tthis[13] = vector.y;\n\t\t\t\tthis[14] = vector.z;\n\t\t\t\tthis[15] = vector.w;\n\n\t\t\tdefault:\n\t\t\t\tLog.error(\"Column \" + column + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t\tCopies a column of data from the current matrix into a `Vector4` instance\n\t\t@param\tcolumn\tThe column to copy (0, 1, 2 or 3)\n\t\t@param\tvector\tThe `Vector4` copy to\n\t**/\n\tpublic function copyColumnTo(column:Int, vector:Vector4):Void\n\t{\n\t\tswitch (column)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tvector.x = this[0];\n\t\t\t\tvector.y = this[1];\n\t\t\t\tvector.z = this[2];\n\t\t\t\tvector.w = this[3];\n\n\t\t\tcase 1:\n\t\t\t\tvector.x = this[4];\n\t\t\t\tvector.y = this[5];\n\t\t\t\tvector.z = this[6];\n\t\t\t\tvector.w = this[7];\n\n\t\t\tcase 2:\n\t\t\t\tvector.x = this[8];\n\t\t\t\tvector.y = this[9];\n\t\t\t\tvector.z = this[10];\n\t\t\t\tvector.w = this[11];\n\n\t\t\tcase 3:\n\t\t\t\tvector.x = this[12];\n\t\t\t\tvector.y = this[13];\n\t\t\t\tvector.z = this[14];\n\t\t\t\tvector.w = this[15];\n\n\t\t\tdefault:\n\t\t\t\tLog.error(\"Column \" + column + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t\tCopies the values of another `Matrix4` into the current matrix\n\t\t@param\tother\tA `Matrix4` instance to copy from\n\t**/\n\tpublic function copyFrom(other:Matrix4):Void\n\t{\n\t\tthis.set(cast other);\n\t}\n\n\t/**\n\t\tCopies a row of data from a `Vector4` instance into the values of this matrix\n\t\t@param\trow\tThe row to copy into (0, 1, 2 or 3)\n\t\t@param\tvector\tThe `Vector4` copy from\n\t**/\n\tpublic function copyRowFrom(row:Int, vector:Vector4)\n\t{\n\t\tswitch (row)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tthis[0] = vector.x;\n\t\t\t\tthis[4] = vector.y;\n\t\t\t\tthis[8] = vector.z;\n\t\t\t\tthis[12] = vector.w;\n\n\t\t\tcase 1:\n\t\t\t\tthis[1] = vector.x;\n\t\t\t\tthis[5] = vector.y;\n\t\t\t\tthis[9] = vector.z;\n\t\t\t\tthis[13] = vector.w;\n\n\t\t\tcase 2:\n\t\t\t\tthis[2] = vector.x;\n\t\t\t\tthis[6] = vector.y;\n\t\t\t\tthis[10] = vector.z;\n\t\t\t\tthis[14] = vector.w;\n\n\t\t\tcase 3:\n\t\t\t\tthis[3] = vector.x;\n\t\t\t\tthis[7] = vector.y;\n\t\t\t\tthis[11] = vector.z;\n\t\t\t\tthis[15] = vector.w;\n\n\t\t\tdefault:\n\t\t\t\tLog.error(\"Row \" + row + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t\tCopies a row of data from the current matrix into a `Vector4` instance\n\t\t@param\tcolumn\tThe row to copy (0, 1, 2 or 3)\n\t\t@param\tvector\tThe `Vector4` copy to\n\t**/\n\tpublic function copyRowTo(row:Int, vector:Vector4):Void\n\t{\n\t\tswitch (row)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tvector.x = this[0];\n\t\t\t\tvector.y = this[4];\n\t\t\t\tvector.z = this[8];\n\t\t\t\tvector.w = this[12];\n\n\t\t\tcase 1:\n\t\t\t\tvector.x = this[1];\n\t\t\t\tvector.y = this[5];\n\t\t\t\tvector.z = this[9];\n\t\t\t\tvector.w = this[13];\n\n\t\t\tcase 2:\n\t\t\t\tvector.x = this[2];\n\t\t\t\tvector.y = this[6];\n\t\t\t\tvector.z = this[10];\n\t\t\t\tvector.w = this[14];\n\n\t\t\tcase 3:\n\t\t\t\tvector.x = this[3];\n\t\t\t\tvector.y = this[7];\n\t\t\t\tvector.z = this[11];\n\t\t\t\tvector.w = this[15];\n\n\t\t\tdefault:\n\t\t\t\tLog.error(\"Row \" + row + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t\tResets the current matrix using two-dimensional transform values\n\t\t@param\ta\tA two-dimensional matrix a value\n\t\t@param\tb\tA two-dimensional matrix b value\n\t\t@param\tc\tA two-dimensional matrix c value\n\t\t@param\td\tA two-dimensional matrix d value\n\t\t@param\ttx\t(Optional) A two-dimensional matrix tx value (default is 0)\n\t\t@param\tty\t(Optional) A two-dimensional matrix ty value (default is 0)\n\t**/\n\tpublic function create2D(a:Float, b:Float, c:Float, d:Float, tx:Float = 0, ty:Float = 0):Void\n\t{\n\t\tthis[0] = a;\n\t\tthis[1] = b;\n\t\tthis[2] = 0;\n\t\tthis[3] = 0;\n\n\t\tthis[4] = c;\n\t\tthis[5] = d;\n\t\tthis[6] = 0;\n\t\tthis[7] = 0;\n\n\t\tthis[8] = 0;\n\t\tthis[9] = 0;\n\t\tthis[10] = 1;\n\t\tthis[11] = 0;\n\n\t\tthis[12] = tx;\n\t\tthis[13] = ty;\n\t\tthis[14] = 0;\n\t\tthis[15] = 1;\n\t}\n\n\t/**\n\t\tInitializes this matrix with values for an orthographic projection, useful in rendering\n\t\t@param\tleft\tThe left (or x0) coordinate for the projection\n\t\t@param\tright\tThe right (or x1) coordinate for the projection\n\t\t@param\tbottom\tThe bottom (or y0) coordinate for the projection\n\t\t@param\ttop\tThe top (or y1) coordinate for the projection\n\t\t@param\tzNear\tThe near depth-clipping plane position\n\t\t@param\tzFar\tThe far depth-clipping plane position\n\t**/\n\tpublic function createOrtho(left:Float, right:Float, bottom:Float, top:Float, zNear:Float, zFar:Float):Void\n\t{\n\t\tvar sx = 1.0 / (right - left);\n\t\tvar sy = 1.0 / (top - bottom);\n\t\tvar sz = 1.0 / (zFar - zNear);\n\n\t\tthis[0] = 2 * sx;\n\t\tthis[1] = 0;\n\t\tthis[2] = 0;\n\t\tthis[3] = 0;\n\n\t\tthis[4] = 0;\n\t\tthis[5] = 2 * sy;\n\t\tthis[6] = 0;\n\t\tthis[7] = 0;\n\n\t\tthis[8] = 0;\n\t\tthis[9] = 0;\n\t\tthis[10] = -2 * sz;\n\t\tthis[11] = 0;\n\n\t\tthis[12] = -(left + right) * sx;\n\t\tthis[13] = -(bottom + top) * sy;\n\t\tthis[14] = -(zNear + zFar) * sz;\n\t\tthis[15] = 1;\n\t}\n\t\n\t/**\n\t\tInitializes this matrix with values for a perspective projection \n\t\t@param\tfov\tThe field of view\n\t\t@param\taspect\tThe aspect ratio\n\t\t@param\tzNear\tThe near depth-clipping plane position\n\t\t@param\tzFar\tThe far depth-clipping plane position\n\t**/\n\tpublic function createPerspective(fov:Float, aspect:Float, zNear:Float, zFar:Float):Void\n\t{\n\t\tif (aspect > -0.0000001 && aspect < 0.0000001)\n\t\t{\n\t\t\tthrow \"Aspect ratio may not be 0\";\n\t\t}\n\n\t\tvar top = fov * zNear;\n\t\tvar bottom = -top;\n\t\tvar right = top * aspect;\n\t\tvar left = -right;\n\n\t\tthis[0] = 2.0 * zNear / (right - left);\n\t\tthis[1] = 0;\n\t\tthis[2] = 0;\n\t\tthis[3] = 0;\n\n\t\tthis[4] = 0;\n\t\tthis[5] = 2.0 * zNear / (top - bottom);\n\t\tthis[6] = 0;\n\t\tthis[7] = 0;\n\n\t\tthis[8] = (right + left) / (right - left);\n\t\tthis[9] = (top + bottom) / (top - bottom);\n\t\tthis[10] = -(zFar + zNear) / (zFar - zNear);\n\t\tthis[11] = -1.0;\n\n\t\tthis[12] = 0;\n\t\tthis[13] = 0;\n\t\tthis[14] = -2 * zFar * zNear / (zFar - zNear);\n\t\tthis[15] = 1;\n\t}\n\n\t/**\n\t * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector4 objects.\n\t */\n\t/*public function decompose(?orientationStyle:Orientation3D):Vector<Vector4> {\n\n\t\tif (orientationStyle==null)\n\t\t\torientationStyle = Orientation3D.EULER_ANGLES;\n\n\t\tvar vec = new Vector<Vector4>();\n\t\tvar m = clone();\n\t\tvar mr = m.copy();\n\n\t\tvar pos = new Vector4 (mr[12], mr[13], mr[14]);\n\t\tmr[12] = 0;\n\t\tmr[13] = 0;\n\t\tmr[14] = 0;\n\n\t\tvar scale = new Vector4 ();\n\n\t\tscale.x = Math.sqrt(mr[0] * mr[0] + mr[1] * mr[1] + mr[2] * mr[2]);\n\t\tscale.y = Math.sqrt(mr[4] * mr[4] + mr[5] * mr[5] + mr[6] * mr[6]);\n\t\tscale.z = Math.sqrt(mr[8] * mr[8] + mr[9] * mr[9] + mr[10] * mr[10]);\n\n\t\tif (mr[0] * (mr[5] * mr[10] - mr[6] * mr[9]) - mr[1] * (mr[4] * mr[10] - mr[6] * mr[8]) + mr[2] * (mr[4] * mr[9] - mr[5] * mr[8]) < 0) {\n\n\t\t\tscale.z = -scale.z;\n\n\t\t}\n\n\t\tmr[0] /= scale.x;\n\t\tmr[1] /= scale.x;\n\t\tmr[2] /= scale.x;\n\t\tmr[4] /= scale.y;\n\t\tmr[5] /= scale.y;\n\t\tmr[6] /= scale.y;\n\t\tmr[8] /= scale.z;\n\t\tmr[9] /= scale.z;\n\t\tmr[10] /= scale.z;\n\n\t\tvar rot = new Vector4 ();\n\t\tswitch (orientationStyle) {\n\n\t\t\tcase Orientation3D.AXIS_ANGLE:\n\t\t\t\trot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1) / 2);\n\n\t\t\t\tvar len = Math.sqrt((mr[6] - mr[9]) * (mr[6] - mr[9]) + (mr[8] - mr[2]) * (mr[8] - mr[2]) + (mr[1] - mr[4]) * (mr[1] - mr[4]));\n\t\t\t\trot.x = (mr[6] - mr[9]) / len;\n\t\t\t\trot.y = (mr[8] - mr[2]) / len;\n\t\t\t\trot.z = (mr[1] - mr[4]) / len;\n\n\t\t\tcase Orientation3D.QUATERNION:\n\t\t\t\tvar tr = mr[0] + mr[5] + mr[10];\n\n\t\t\t\tif (tr > 0) {\n\t\t\t\t\trot.w = Math.sqrt(1 + tr) / 2;\n\n\t\t\t\t\trot.x = (mr[6] - mr[9]) / (4 * rot.w);\n\t\t\t\t\trot.y = (mr[8] - mr[2]) / (4 * rot.w);\n\t\t\t\t\trot.z = (mr[1] - mr[4]) / (4 * rot.w);\n\t\t\t\t} else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) {\n\t\t\t\t\trot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10]) / 2;\n\n\t\t\t\t\trot.w = (mr[6] - mr[9]) / (4 * rot.x);\n\t\t\t\t\trot.y = (mr[1] + mr[4]) / (4 * rot.x);\n\t\t\t\t\trot.z = (mr[8] + mr[2]) / (4 * rot.x);\n\t\t\t\t} else if (mr[5] > mr[10]) {\n\t\t\t\t\trot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10]) / 2;\n\n\t\t\t\t\trot.x = (mr[1] + mr[4]) / (4 * rot.y);\n\t\t\t\t\trot.w = (mr[8] - mr[2]) / (4 * rot.y);\n\t\t\t\t\trot.z = (mr[6] + mr[9]) / (4 * rot.y);\n\t\t\t\t} else {\n\t\t\t\t\trot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5]) / 2;\n\n\t\t\t\t\trot.x = (mr[8] + mr[2]) / (4 * rot.z);\n\t\t\t\t\trot.y = (mr[6] + mr[9]) / (4 * rot.z);\n\t\t\t\t\trot.w = (mr[1] - mr[4]) / (4 * rot.z);\n\t\t\t\t}\n\n\t\t\tcase Orientation3D.EULER_ANGLES:\n\t\t\t\trot.y = Math.asin(-mr[2]);\n\n\t\t\t\tif (mr[2] != 1 && mr[2] != -1) {\n\t\t\t\t\trot.x = Math.atan2(mr[6], mr[10]);\n\t\t\t\t\trot.z = Math.atan2(mr[1], mr[0]);\n\t\t\t\t} else {\n\t\t\t\t\trot.z = 0;\n\t\t\t\t\trot.x = Math.atan2(mr[4], mr[5]);\n\t\t\t\t}\n\t\t}\n\n\t\tvec.push(pos);\n\t\tvec.push(rot);\n\t\tvec.push(scale);\n\n\t\treturn vec;\n\n\t}*/\n\t/**\n\t\tTransforms a vector using this matrix, ignoring the translation of the matrix\n\t\t@param\tresult\t(Optional) An existing `Vector4` instance to fill with the result\n\t\t@param\tv\tA `Vector4` instance to transform\n\t**/\n\tpublic function deltaTransformVector(v:Vector4, result:Vector4 = null):Vector4\n\t{\n\t\tif (result == null) result = new Vector4();\n\t\tvar x = v.x, y = v.y, z = v.z;\n\t\tresult.x = (x * this[0] + y * this[4] + z * this[8] + this[3]);\n\t\tresult.y = (x * this[1] + y * this[5] + z * this[9] + this[7]);\n\t\tresult.z = (x * this[2] + y * this[6] + z * this[10] + this[11]);\n\t\treturn result;\n\t}\n\n\t@:from public static function fromMatrix3(matrix3:Matrix3):Matrix4\n\t{\n\t\tvar mat = new Matrix4();\n\t\tmat.create2D(matrix3.a, matrix3.b, matrix3.c, matrix3.d, matrix3.tx, matrix3.ty);\n\t\treturn mat;\n\t}\n\n\t/**\n\t\tResets the current matrix using default identity values\n\t**/\n\tpublic function identity():Void\n\t{\n\t\tthis[0] = 1;\n\t\tthis[1] = 0;\n\t\tthis[2] = 0;\n\t\tthis[3] = 0;\n\t\tthis[4] = 0;\n\t\tthis[5] = 1;\n\t\tthis[6] = 0;\n\t\tthis[7] = 0;\n\t\tthis[8] = 0;\n\t\tthis[9] = 0;\n\t\tthis[10] = 1;\n\t\tthis[11] = 0;\n\t\tthis[12] = 0;\n\t\tthis[13] = 0;\n\t\tthis[14] = 0;\n\t\tthis[15] = 1;\n\t}\n\n\t/**\n\t\tInterpolates from one `Matrix4` instance to another, given a percentage between the two\n\t\t@param\tthisMat\tThe first `Matrix4` object to start from\n\t\t@param\ttoMat\tThe second `Matrix4` object to interpolate toward\n\t\t@param\tpercent\tThe percentage value to interpolate by\n\t\t@param\tresult\t(Optional) A `Matrix4` instance to use when returning the result\n\t\t@return\tA `Matrix4` with the resulting value\n\t**/\n\tpublic static function interpolate(thisMat:Matrix4, toMat:Matrix4, percent:Float, result:Matrix4 = null):Matrix4\n\t{\n\t\tif (result == null) result = new Matrix4();\n\n\t\tfor (i in 0...16)\n\t\t{\n\t\t\tresult[i] = thisMat[i] + (toMat[i] - thisMat[i]) * percent;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t\tInterpolates the current matrix toward another matrix, resetting the values of the current matrix\n\t\t@param\ttoMat\tThe second `Matrix4` object to interpolate toward\n\t\t@param\tpercetn\tThe percentage value to interpolate by\n\t**/\n\tpublic function interpolateTo(toMat:Matrix4, percent:Float):Void\n\t{\n\t\tfor (i in 0...16)\n\t\t{\n\t\t\tthis[i] = this[i] + (toMat[i] - this[i]) * percent;\n\t\t}\n\t}\n\n\t/**\n\t\tAttempts to invert the current matrix, so long as the determinant is greater than zero\n\t\t@return\tWhether the `invert` operation was successful\n\t**/\n\tpublic function invert():Bool\n\t{\n\t\tvar d = determinant;\n\t\tvar invertable = Math.abs(d) > 0.00000000001;\n\n\t\tif (invertable)\n\t\t{\n\t\t\td = 1 / d;\n\n\t\t\tvar m11:Float = this[0];\n\t\t\tvar m21:Float = this[4];\n\t\t\tvar m31:Float = this[8];\n\t\t\tvar m41:Float = this[12];\n\t\t\tvar m12:Float = this[1];\n\t\t\tvar m22:Float = this[5];\n\t\t\tvar m32:Float = this[9];\n\t\t\tvar m42:Float = this[13];\n\t\t\tvar m13:Float = this[2];\n\t\t\tvar m23:Float = this[6];\n\t\t\tvar m33:Float = this[10];\n\t\t\tvar m43:Float = this[14];\n\t\t\tvar m14:Float = this[3];\n\t\t\tvar m24:Float = this[7];\n\t\t\tvar m34:Float = this[11];\n\t\t\tvar m44:Float = this[15];\n\n\t\t\tthis[0] = d * (m22 * (m33 * m44 - m43 * m34) - m32 * (m23 * m44 - m43 * m24) + m42 * (m23 * m34 - m33 * m24));\n\t\t\tthis[1] = -d * (m12 * (m33 * m44 - m43 * m34) - m32 * (m13 * m44 - m43 * m14) + m42 * (m13 * m34 - m33 * m14));\n\t\t\tthis[2] = d * (m12 * (m23 * m44 - m43 * m24) - m22 * (m13 * m44 - m43 * m14) + m42 * (m13 * m24 - m23 * m14));\n\t\t\tthis[3] = -d * (m12 * (m23 * m34 - m33 * m24) - m22 * (m13 * m34 - m33 * m14) + m32 * (m13 * m24 - m23 * m14));\n\t\t\tthis[4] = -d * (m21 * (m33 * m44 - m43 * m34) - m31 * (m23 * m44 - m43 * m24) + m41 * (m23 * m34 - m33 * m24));\n\t\t\tthis[5] = d * (m11 * (m33 * m44 - m43 * m34) - m31 * (m13 * m44 - m43 * m14) + m41 * (m13 * m34 - m33 * m14));\n\t\t\tthis[6] = -d * (m11 * (m23 * m44 - m43 * m24) - m21 * (m13 * m44 - m43 * m14) + m41 * (m13 * m24 - m23 * m14));\n\t\t\tthis[7] = d * (m11 * (m23 * m34 - m33 * m24) - m21 * (m13 * m34 - m33 * m14) + m31 * (m13 * m24 - m23 * m14));\n\t\t\tthis[8] = d * (m21 * (m32 * m44 - m42 * m34) - m31 * (m22 * m44 - m42 * m24) + m41 * (m22 * m34 - m32 * m24));\n\t\t\tthis[9] = -d * (m11 * (m32 * m44 - m42 * m34) - m31 * (m12 * m44 - m42 * m14) + m41 * (m12 * m34 - m32 * m14));\n\t\t\tthis[10] = d * (m11 * (m22 * m44 - m42 * m24) - m21 * (m12 * m44 - m42 * m14) + m41 * (m12 * m24 - m22 * m14));\n\t\t\tthis[11] = -d * (m11 * (m22 * m34 - m32 * m24) - m21 * (m12 * m34 - m32 * m14) + m31 * (m12 * m24 - m22 * m14));\n\t\t\tthis[12] = -d * (m21 * (m32 * m43 - m42 * m33) - m31 * (m22 * m43 - m42 * m23) + m41 * (m22 * m33 - m32 * m23));\n\t\t\tthis[13] = d * (m11 * (m32 * m43 - m42 * m33) - m31 * (m12 * m43 - m42 * m13) + m41 * (m12 * m33 - m32 * m13));\n\t\t\tthis[14] = -d * (m11 * (m22 * m43 - m42 * m23) - m21 * (m12 * m43 - m42 * m13) + m41 * (m12 * m23 - m22 * m13));\n\t\t\tthis[15] = d * (m11 * (m22 * m33 - m32 * m23) - m21 * (m12 * m33 - m32 * m13) + m31 * (m12 * m23 - m22 * m13));\n\t\t}\n\n\t\treturn invertable;\n\t}\n\n\t/**\n\t\tSets the matrix values as a transformation orientated toward a certain vector position\n\t\t@param\tpos\tA target vector position in absolute coordinates\n\t\t@param\tat\t(Optional) A vector relative to this matrix which defines the current direction\n\t\t@param\tup\t(Optional) A vector relative to this matrix which defines the \"up\" direction\n\t**/\n\tpublic function pointAt(pos:Vector4, at:Vector4 = null, up:Vector4 = null):Void\n\t{\n\t\t// TODO: This implementation is broken\n\n\t\tif (at == null)\n\t\t{\n\t\t\tat = new Vector4(0, 0, 1);\n\t\t}\n\n\t\tif (up == null)\n\t\t{\n\t\t\tup = new Vector4(0, 1, 0);\n\t\t}\n\n\t\tvar dir = pos.subtract(at);\n\t\tvar vup = up.clone();\n\t\tvar right:Vector4;\n\n\t\tdir.normalize();\n\t\tvup.normalize();\n\n\t\tvar dir2 = dir.clone();\n\t\tdir2.scaleBy(vup.dotProduct(dir));\n\n\t\tvup = vup.subtract(dir2);\n\n\t\tif (vup.length > 0)\n\t\t{\n\t\t\tvup.normalize();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (dir.x != 0)\n\t\t\t{\n\t\t\t\tvup = new Vector4(-dir.y, dir.x, 0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvup = new Vector4(1, 0, 0);\n\t\t\t}\n\t\t}\n\n\t\tright = vup.crossProduct(dir);\n\t\tright.normalize();\n\n\t\tthis[0] = right.x;\n\t\tthis[4] = right.y;\n\t\tthis[8] = right.z;\n\t\tthis[12] = 0.0;\n\t\tthis[1] = vup.x;\n\t\tthis[5] = vup.y;\n\t\tthis[9] = vup.z;\n\t\tthis[13] = 0.0;\n\t\tthis[2] = dir.x;\n\t\tthis[6] = dir.y;\n\t\tthis[10] = dir.z;\n\t\tthis[14] = 0.0;\n\t\tthis[3] = pos.x;\n\t\tthis[7] = pos.y;\n\t\tthis[11] = pos.z;\n\t\tthis[15] = 1.0;\n\t}\n\n\t/**\n\t\tPrepends a right-hand matrix to the current matrix\n\t\t@param\trhx\tA right-hand `Matrix4` to append\n\t**/\n\tpublic function prepend(rhs:Matrix4):Void\n\t{\n\t\tvar m111:Float = rhs[0],\n\t\t\tm121:Float = rhs[4],\n\t\t\tm131:Float = rhs[8],\n\t\t\tm141:Float = rhs[12],\n\t\t\tm112:Float = rhs[1],\n\t\t\tm122:Float = rhs[5],\n\t\t\tm132:Float = rhs[9],\n\t\t\tm142:Float = rhs[13],\n\t\t\tm113:Float = rhs[2],\n\t\t\tm123:Float = rhs[6],\n\t\t\tm133:Float = rhs[10],\n\t\t\tm143:Float = rhs[14],\n\t\t\tm114:Float = rhs[3],\n\t\t\tm124:Float = rhs[7],\n\t\t\tm134:Float = rhs[11],\n\t\t\tm144:Float = rhs[15],\n\t\t\tm211:Float = this[0],\n\t\t\tm221:Float = this[4],\n\t\t\tm231:Float = this[8],\n\t\t\tm241:Float = this[12],\n\t\t\tm212:Float = this[1],\n\t\t\tm222:Float = this[5],\n\t\t\tm232:Float = this[9],\n\t\t\tm242:Float = this[13],\n\t\t\tm213:Float = this[2],\n\t\t\tm223:Float = this[6],\n\t\t\tm233:Float = this[10],\n\t\t\tm243:Float = this[14],\n\t\t\tm214:Float = this[3],\n\t\t\tm224:Float = this[7],\n\t\t\tm234:Float = this[11],\n\t\t\tm244:Float = this[15];\n\n\t\tthis[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241;\n\t\tthis[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242;\n\t\tthis[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243;\n\t\tthis[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244;\n\n\t\tthis[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241;\n\t\tthis[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242;\n\t\tthis[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243;\n\t\tthis[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244;\n\n\t\tthis[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241;\n\t\tthis[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242;\n\t\tthis[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243;\n\t\tthis[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244;\n\n\t\tthis[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241;\n\t\tthis[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242;\n\t\tthis[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243;\n\t\tthis[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244;\n\t}\n\n\t/**\n\t\tPrepends rotation to this matrix\n\t\t@param\tdegrees\tThe rotation amount in degrees\n\t\t@param\taxis\tThe rotation axis\n\t\t@param\tpivotPoint\t(Optional) A pivot point for the rotation\n\t**/\n\tpublic function prependRotation(degrees:Float, axis:Vector4, pivotPoint:Vector4 = null):Void\n\t{\n\t\tvar m = __getAxisRotation(axis.x, axis.y, axis.z, degrees);\n\n\t\tif (pivotPoint != null)\n\t\t{\n\t\t\tvar p = pivotPoint;\n\t\t\tm.appendTranslation(p.x, p.y, p.z);\n\t\t}\n\n\t\tprepend(m);\n\t}\n\n\t/**\n\t\tPrepends scale to this matrix\n\t\t@param\txScale\tAn x scale value\n\t\t@param\tyScale\tA y scale value\n\t\t@param\tzScale\tA z scale value\n\t**/\n\tpublic function prependScale(xScale:Float, yScale:Float, zScale:Float):Void\n\t{\n\t\tprepend(new Matrix4(new Float32Array([\n\t\t\txScale, 0.0, 0.0, 0.0, 0.0, yScale, 0.0, 0.0, 0.0, 0.0, zScale, 0.0, 0.0, 0.0, 0.0, 1.0\n\t\t])));\n\t}\n\n\t/**\n\t\tPrepends translation values to this matrix\n\t\t@param\tx\tAn x translation value\n\t\t@param\ty\tA y translation value\n\t\t@param\tz\tA z translation value\n\t**/\n\tpublic function prependTranslation(x:Float, y:Float, z:Float):Void\n\t{\n\t\tvar m = new Matrix4();\n\t\tm.position = new Vector4(x, y, z);\n\t\tprepend(m);\n\t}\n\n\t/*public function recompose (components:Vector<Vector4>, ?orientationStyle:Orientation3D ):Bool {\n\n\t\tif (components.length < 3 || components[2].x == 0 || components[2].y == 0 || components[2].z == 0)\n\t\t\treturn false;\n\n\t\tif (orientationStyle == null)\n\t\t\torientationStyle = Orientation3D.EULER_ANGLES;\n\n\t\tidentity();\n\n\t\tvar scale = [];\n\t\tscale[0] = scale[1] = scale[2] = components[2].x;\n\t\tscale[4] = scale[5] = scale[6] = components[2].y;\n\t\tscale[8] = scale[9] = scale[10] = components[2].z;\n\n\t\tswitch (orientationStyle) {\n\n\t\t\tcase Orientation3D.EULER_ANGLES:\n\t\t\t\tvar cx = Math.cos(components[1].x);\n\t\t\t\tvar cy = Math.cos(components[1].y);\n\t\t\t\tvar cz = Math.cos(components[1].z);\n\t\t\t\tvar sx = Math.sin(components[1].x);\n\t\t\t\tvar sy = Math.sin(components[1].y);\n\t\t\t\tvar sz = Math.sin(components[1].z);\n\n\t\t\t\tthis[0]=cy*cz*scale[0];\n\t\t\t\tthis[1]=cy*sz*scale[1];\n\t\t\t\tthis[2]=- sy*scale[2];\n\t\t\t\tthis[3]=0;\n\t\t\t\tthis[4] = (sx*sy*cz-cx*sz)*scale[4];\n\t\t\t\tthis[5] = (sx*sy*sz+cx*cz)*scale[5];\n\t\t\t\tthis[6]=sx*cy*scale[6];\n\t\t\t\tthis[7]=0;\n\t\t\t\tthis[8] = (cx*sy*cz+sx*sz)*scale[8];\n\t\t\t\tthis[9] = (cx*sy*sz-sx*cz)*scale[9];\n\t\t\t\tthis[10]=cx*cy*scale[10];\n\t\t\t\tthis[11]=0;\n\t\t\t\tthis[12]=components[0].x;\n\t\t\t\tthis[13]=components[0].y;\n\t\t\t\tthis[14]=components[0].z;\n\t\t\t\tthis[15]=1;\n\n\t\t\tdefault:\n\n\t\t\t\tvar x = components[1].x;\n\t\t\t\tvar y = components[1].y;\n\t\t\t\tvar z = components[1].z;\n\t\t\t\tvar w = components[1].w;\n\t\t\t\tif (Type.enumEq(orientationStyle, Orientation3D.AXIS_ANGLE)) {\n\t\t\t\t\tx *= Math.sin(w/2);\n\t\t\t\t\ty *= Math.sin(w/2);\n\t\t\t\t\tz *= Math.sin(w/2);\n\t\t\t\t\tw = Math.cos(w/2);\n\t\t\t\t}\n\n\t\t\t\tthis[0] = (1-2*y*y-2*z*z)*scale[0];\n\t\t\t\tthis[1] = (2*x*y+2*w*z)*scale[1];\n\t\t\t\tthis[2] = (2*x*z-2*w*y)*scale[2];\n\t\t\t\tthis[3] = 0;\n\t\t\t\tthis[4] = (2*x*y-2*w*z)*scale[4];\n\t\t\t\tthis[5] = (1-2*x*x-2*z*z)*scale[5];\n\t\t\t\tthis[6] = (2*y*z+2*w*x)*scale[6];\n\t\t\t\tthis[7] = 0;\n\t\t\t\tthis[8] = (2*x*z+2*w*y)*scale[8];\n\t\t\t\tthis[9] = (2*y*z-2*w*x)*scale[9];\n\t\t\t\tthis[10] = (1-2*x*x-2*y*y)*scale[10];\n\t\t\t\tthis[11] = 0;\n\t\t\t\tthis[12] = components[0].x;\n\t\t\t\tthis[13] = components[0].y;\n\t\t\t\tthis[14] = components[0].z;\n\t\t\t\tthis[15] = 1;\n\t\t}\n\n\t\tif (components[2].x == 0)\n\t\t\tthis[0] = 1e-15;\n\t\tif (components[2].y == 0)\n\t\t\tthis[5] = 1e-15;\n\t\tif (components[2].z == 0)\n\t\t\tthis[10] = 1e-15;\n\n\t\treturn !(components[2].x == 0 || components[2].y == 0 || components[2].y == 0);\n\t}*/\n\t/**\n\t\tTransforms a `Vector4` instance using the current matrix\n\t\t@param\tresult\t(Optional) An existing `Vector2` instance to fill with the result\n\t\t@return\tThe resulting `Vector4` instance\n\t**/\n\tpublic function transformVector(v:Vector4, result:Vector4 = null):Vector4\n\t{\n\t\tif (result == null) result = new Vector4();\n\t\tvar x = v.x, y = v.y, z = v.z;\n\t\tresult.x = (x * this[0] + y * this[4] + z * this[8] + this[12]);\n\t\tresult.y = (x * this[1] + y * this[5] + z * this[9] + this[13]);\n\t\tresult.z = (x * this[2] + y * this[6] + z * this[10] + this[14]);\n\t\tresult.w = (x * this[3] + y * this[7] + z * this[11] + this[15]);\n\t\treturn result;\n\t}\n\n\t/**\n\t\tTransforms a series of [x, y, z] value pairs at once\n\t\t@param\tain\tAn input `Float32Array` to transform\n\t\t@param\taout\tAn output `Float32Array` to write to\n\t**/\n\tpublic function transformVectors(ain:Float32Array, aout:Float32Array):Void\n\t{\n\t\tvar i = 0;\n\t\tvar x:Float, y:Float, z:Float;\n\n\t\twhile (i + 3 <= ain.length)\n\t\t{\n\t\t\tx = ain[i];\n\t\t\ty = ain[i + 1];\n\t\t\tz = ain[i + 2];\n\n\t\t\taout[i] = x * this[0] + y * this[4] + z * this[8] + this[12];\n\t\t\taout[i + 1] = x * this[1] + y * this[5] + z * this[9] + this[13];\n\t\t\taout[i + 2] = x * this[2] + y * this[6] + z * this[10] + this[14];\n\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\t/**\n\t\tTransposes the current matrix\n\t**/\n\tpublic function transpose():Void\n\t{\n\t\t__swap(1, 4);\n\t\t__swap(2, 8);\n\t\t__swap(3, 12);\n\t\t__swap(6, 9);\n\t\t__swap(7, 13);\n\t\t__swap(11, 14);\n\t}\n\n\t@:noCompletion private function __getAxisRotation(x:Float, y:Float, z:Float, degrees:Float):Matrix4\n\t{\n\t\tvar m = new Matrix4();\n\n\t\tvar a1 = new Vector4(x, y, z);\n\t\tvar rad = -degrees * (Math.PI / 180);\n\t\tvar c = Math.cos(rad);\n\t\tvar s = Math.sin(rad);\n\t\tvar t = 1.0 - c;\n\n\t\tm[0] = c + a1.x * a1.x * t;\n\t\tm[5] = c + a1.y * a1.y * t;\n\t\tm[10] = c + a1.z * a1.z * t;\n\n\t\tvar tmp1 = a1.x * a1.y * t;\n\t\tvar tmp2 = a1.z * s;\n\t\tm[4] = tmp1 + tmp2;\n\t\tm[1] = tmp1 - tmp2;\n\t\ttmp1 = a1.x * a1.z * t;\n\t\ttmp2 = a1.y * s;\n\t\tm[8] = tmp1 - tmp2;\n\t\tm[2] = tmp1 + tmp2;\n\t\ttmp1 = a1.y * a1.z * t;\n\t\ttmp2 = a1.x * s;\n\t\tm[9] = tmp1 + tmp2;\n\t\tm[6] = tmp1 - tmp2;\n\n\t\treturn m;\n\t}\n\n\t@:noCompletion private inline function __swap(a:Int, b:Int):Void\n\t{\n\t\tvar temp = this[a];\n\t\tthis[a] = this[b];\n\t\tthis[b] = temp;\n\t}\n\n\t// Getters & Setters\n\t@:noCompletion private function get_determinant():Float\n\t{\n\t\treturn 1 * ((this[0] * this[5] - this[4] * this[1]) * (this[10] * this[15] - this[14] * this[11])\n\t\t\t- (this[0] * this[9] - this[8] * this[1]) * (this[6] * this[15] - this[14] * this[7])\n\t\t\t+ (this[0] * this[13] - this[12] * this[1]) * (this[6] * this[11] - this[10] * this[7])\n\t\t\t+ (this[4] * this[9] - this[8] * this[5]) * (this[2] * this[15] - this[14] * this[3])\n\t\t\t- (this[4] * this[13] - this[12] * this[5]) * (this[2] * this[11] - this[10] * this[3])\n\t\t\t+ (this[8] * this[13] - this[12] * this[9]) * (this[2] * this[7] - this[6] * this[3]));\n\t}\n\n\t@:noCompletion private function get_position():Vector4\n\t{\n\t\treturn new Vector4(this[12], this[13], this[14]);\n\t}\n\n\t@:noCompletion private function set_position(val:Vector4):Vector4\n\t{\n\t\tthis[12] = val.x;\n\t\tthis[13] = val.y;\n\t\tthis[14] = val.z;\n\t\treturn val;\n\t}\n\n\t@:dox(hide) @:noCompletion @:arrayAccess public function get(index:Int):Float\n\t{\n\t\treturn this[index];\n\t}\n\n\t@:dox(hide) @:noCompletion @:arrayAccess public function set(index:Int, value:Float):Float\n\t{\n\t\tthis[index] = value;\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/RGBA.hx",
    "content": "package lime.math;\n\nimport lime.graphics.PixelFormat;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\n\n/**\n\tA utility for storing, accessing and converting colors in an RGBA\n\t(red, green, blue, alpha) color format.\n\n\t```haxe\n\tvar color:RGBA = 0x883300FF;\n\ttrace (color.r); // 0x88\n\ttrace (color.g); // 0x33\n\ttrace (color.b); // 0x00\n\ttrace (color.a); // 0xFF\n\n\tvar convert:ARGB = color; // 0xFF883300\n\t```\n**/\n@:allow(lime.math)\n@:transitive\nabstract RGBA(#if (flash && !lime_doc_gen) Int #else UInt #end) from Int to Int from UInt to UInt\n{\n\tprivate static var __alpha16:UInt32Array;\n\tprivate static var __clamp:UInt8Array;\n\tprivate static var a16:Int;\n\tprivate static var unmult:Float;\n\n\t/**\n\t\tAccesses the alpha component of the color\n\t**/\n\tpublic var a(get, set):Int;\n\n\t/**\n\t\tAccesses the blue component of the color\n\t**/\n\tpublic var b(get, set):Int;\n\n\t/**\n\t\tAccesses the green component of the color\n\t**/\n\tpublic var g(get, set):Int;\n\n\t/**\n\t\tAccesses the red component of the color\n\t**/\n\tpublic var r(get, set):Int;\n\n\tprivate static function __init__():Void\n\t{\n\t\t#if (js && modular)\n\t\t__initColors();\n\t\t#else\n\t\t__alpha16 = new UInt32Array(256);\n\n\t\tfor (i in 0...256)\n\t\t{\n\t\t\t__alpha16[i] = Math.ceil((i) * ((1 << 16) / 0xFF));\n\t\t}\n\n\t\t__clamp = new UInt8Array(0xFF + 0xFF + 1);\n\n\t\tfor (i in 0...0xFF)\n\t\t{\n\t\t\t__clamp[i] = i;\n\t\t}\n\n\t\tfor (i in 0xFF...(0xFF + 0xFF + 1))\n\t\t{\n\t\t\t__clamp[i] = 0xFF;\n\t\t}\n\t\t#end\n\t}\n\n\t#if (js && modular)\n\tprivate static function __initColors()\n\t{\n\t\t__alpha16 = new UInt32Array(256);\n\n\t\tfor (i in 0...256)\n\t\t{\n\t\t\t__alpha16[i] = Math.ceil((i) * ((1 << 16) / 0xFF));\n\t\t}\n\n\t\t__clamp = new UInt8Array(0xFF + 0xFF);\n\n\t\tfor (i in 0...0xFF)\n\t\t{\n\t\t\t__clamp[i] = i;\n\t\t}\n\n\t\tfor (i in 0xFF...(0xFF + 0xFF + 1))\n\t\t{\n\t\t\t__clamp[i] = 0xFF;\n\t\t}\n\t}\n\t#end\n\n\t/**\n\t\tCreates a new RGBA instance\n\t\t@param\trgba\t(Optional) An RGBA color value\n\t**/\n\tpublic inline function new(rgba:Int = 0)\n\t{\n\t\tthis = rgba;\n\t}\n\n\t/**\n\t\tCreates a new RGBA instance from component values\n\t\t@param\tr\tA red component value\n\t\t@param\tg\tA green component value\n\t\t@param\tb\tA blue component value\n\t\t@param\ta\tAn alpha component value\n\t\t@return\tA new RGBA instance\n\t**/\n\tpublic static inline function create(r:Int, g:Int, b:Int, a:Int):RGBA\n\t{\n\t\tvar rgba = new RGBA();\n\t\trgba.set(r, g, b, a);\n\t\treturn rgba;\n\t}\n\n\t/**\n\t\tMultiplies the red, green and blue components by the current alpha component\n\t**/\n\tpublic inline function multiplyAlpha()\n\t{\n\t\tif (a == 0)\n\t\t{\n\t\t\tif (this != 0)\n\t\t\t{\n\t\t\t\tthis = 0;\n\t\t\t}\n\t\t}\n\t\telse if (a != 0xFF)\n\t\t{\n\t\t\ta16 = __alpha16[a];\n\t\t\tset((r * a16) >> 16, (g * a16) >> 16, (b * a16) >> 16, a);\n\t\t}\n\t}\n\n\t/**\n\t\tReads a value from a `UInt8Array` into the current `RGBA` color\n\t\t@param\tdata\tA `UInt8Array` instance\n\t\t@param\toffset\tAn offset into the `UInt8Array` to read\n\t\t@param\tformat\t(Optional) The `PixelFormat` represented by the `UInt8Array` data\n\t\t@param\tpremultiplied\t(Optional) Whether the data is stored in premultiplied alpha format\n\t**/\n\tpublic inline function readUInt8(data:UInt8Array, offset:Int, format:PixelFormat = RGBA32, premultiplied:Bool = false):Void\n\t{\n\t\tswitch (format)\n\t\t{\n\t\t\tcase BGRA32:\n\t\t\t\tset(data[offset + 2], data[offset + 1], data[offset], data[offset + 3]);\n\n\t\t\tcase RGBA32:\n\t\t\t\tset(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]);\n\n\t\t\tcase ARGB32:\n\t\t\t\tset(data[offset + 1], data[offset + 2], data[offset + 3], data[offset]);\n\t\t}\n\n\t\tif (premultiplied)\n\t\t{\n\t\t\tunmultiplyAlpha();\n\t\t}\n\t}\n\n\t/**\n\t\tSets the current `RGBA` color to new component values\n\t\t@param\tr\tThe red component value to set\n\t\t@param\tg\tThe green component value to set\n\t\t@param\tb\tThe blue component vlaue to set\n\t\t@param\ta\tThe alpha component value to set\n\t**/\n\tpublic inline function set(r:Int, g:Int, b:Int, a:Int):Void\n\t{\n\t\tthis = ((r & 0xFF) << 24) | ((g & 0xFF) << 16) | ((b & 0xFF) << 8) | (a & 0xFF);\n\t}\n\n\t/**\n\t\tDivides the current red, green and blue components by the alpha component\n\t**/\n\tpublic inline function unmultiplyAlpha()\n\t{\n\t\tif (a != 0 && a != 0xFF)\n\t\t{\n\t\t\tunmult = 255.0 / a;\n\t\t\tset(__clamp[Math.round(r * unmult)], __clamp[Math.round(g * unmult)], __clamp[Math.round(b * unmult)], a);\n\t\t}\n\t}\n\n\t/**\n\t\tWrites the current `RGBA` color into a `UInt8Array`\n\t\t@param\tdata\tA `UInt8Array` instance\n\t\t@param\toffset\tAn offset into the `UInt8Array` to write\n\t\t@param\tformat\t(Optional) The `PixelFormat` represented by the `UInt8Array` data\n\t\t@param\tpremultiplied\t(Optional) Whether the data is stored in premultiplied alpha format\n\t**/\n\tpublic inline function writeUInt8(data:UInt8Array, offset:Int, format:PixelFormat = RGBA32, premultiplied:Bool = false):Void\n\t{\n\t\tif (premultiplied)\n\t\t{\n\t\t\tmultiplyAlpha();\n\t\t}\n\n\t\tswitch (format)\n\t\t{\n\t\t\tcase BGRA32:\n\t\t\t\tdata[offset] = b;\n\t\t\t\tdata[offset + 1] = g;\n\t\t\t\tdata[offset + 2] = r;\n\t\t\t\tdata[offset + 3] = a;\n\n\t\t\tcase RGBA32:\n\t\t\t\tdata[offset] = r;\n\t\t\t\tdata[offset + 1] = g;\n\t\t\t\tdata[offset + 2] = b;\n\t\t\t\tdata[offset + 3] = a;\n\n\t\t\tcase ARGB32:\n\t\t\t\tdata[offset] = a;\n\t\t\t\tdata[offset + 1] = r;\n\t\t\t\tdata[offset + 2] = g;\n\t\t\t\tdata[offset + 3] = b;\n\t\t}\n\t}\n\n\t@:from private static inline function __fromARGB(argb:ARGB):RGBA\n\t{\n\t\treturn RGBA.create(argb.r, argb.g, argb.b, argb.a);\n\t}\n\n\t@:from private static inline function __fromBGRA(bgra:BGRA):RGBA\n\t{\n\t\treturn RGBA.create(bgra.r, bgra.g, bgra.b, bgra.a);\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_a():Int\n\t{\n\t\treturn this & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_a(value:Int):Int\n\t{\n\t\tset(r, g, b, value);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_b():Int\n\t{\n\t\treturn (this >> 8) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_b(value:Int):Int\n\t{\n\t\tset(r, g, value, a);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_g():Int\n\t{\n\t\treturn (this >> 16) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_g(value:Int):Int\n\t{\n\t\tset(r, value, b, a);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_r():Int\n\t{\n\t\treturn (this >> 24) & 0xFF;\n\t}\n\n\t@:noCompletion private inline function set_r(value:Int):Int\n\t{\n\t\tset(value, g, b, a);\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/Rectangle.hx",
    "content": "package lime.math;\n\n#if flash\nimport flash.geom.Rectangle as FlashRectangle;\n#end\n\n/**\n\tThe `Rectangle` class provides a simple object for storing\n\tand manipulating a logical rectangle for calculations\n**/\n#if hl\n@:keep\n#end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Rectangle\n{\n\t/**\n\t\tGet or set the bottom (y + height) value of the `Rectangle`\n\t**/\n\tpublic var bottom(get, set):Float;\n\n\t/**\n\t\tGet or set the bottom-right (x + width, y + height) as a `Vector2`\n\t**/\n\tpublic var bottomRight(get, set):Vector2;\n\n\t/**\n\t\tGet or set the height of the rectangle\n\t**/\n\tpublic var height:Float;\n\n\t/**\n\t\tGet or set the left (x) of the rectangle\n\t**/\n\tpublic var left(get, set):Float;\n\n\t/**\n\t\tGet or set the right (x + width) of the rectangle\n\t**/\n\tpublic var right(get, set):Float;\n\n\t/**\n\t\tGet or set the size (width, height) as a `Vector2`\n\t**/\n\tpublic var size(get, set):Vector2;\n\n\t/**\n\t\tGet or set the top (y) of the rectangle\n\t**/\n\tpublic var top(get, set):Float;\n\n\t/**\n\t\tGet or set the top-left (x, y) as a `Vector2`\n\t**/\n\tpublic var topLeft(get, set):Vector2;\n\n\t/**\n\t\tGet or set the width of the rectangle\n\t**/\n\tpublic var width:Float;\n\n\t/**\n\t\tGet or set the x of the rectangle\n\t**/\n\tpublic var x:Float;\n\n\t/**\n\t\tGet or set the y of the rectangle\n\t**/\n\tpublic var y:Float;\n\n\t/**\n\t\tCreate a new `Rectangle` instance\n\t\t@param\tx\t(Optional) Initial x value (default is 0)\n\t\t@param\ty\t(Optional) Initial y value (default is 0)\n\t\t@param\twidth\t(Optional) Initial width value (default is 0)\n\t\t@param\theight\t(Optional) Initial height value (default is 0)\n\t**/\n\tpublic function new(x:Float = 0, y:Float = 0, width:Float = 0, height:Float = 0):Void\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t\tCreates a clone of this `Rectangle`\n\t\t@return\tA new `Rectangle` instance\n\t**/\n\tpublic function clone():Rectangle\n\t{\n\t\treturn new Rectangle(x, y, width, height);\n\t}\n\n\t/**\n\t\tReturns whether this rectangle contains the specified (x, y) point\n\t\t@param\tx\tThe x coordinate to test\n\t\t@param\ty\tThe y coordinate to test\n\t\t@return\tWhether the point is contained in the rectangle\n\t**/\n\tpublic function contains(x:Float, y:Float):Bool\n\t{\n\t\treturn x >= this.x && y >= this.y && x < right && y < bottom;\n\t}\n\n\t@:dox(hide) @:noCompletion @:deprecated(\"Use containsVector\") public function containsPoint(point:Vector2):Bool\n\t{\n\t\treturn containsVector(point);\n\t}\n\n\t/**\n\t\tReturns whether this rectangle contains another rectangle\n\t\tThis will return `false` if the second rectangle only\n\t\toverlaps but is not fully contained within the current rectangle\n\t\t@param\trect\tA second `Rectangle` instance to test\n\t\t@return\tWhether the `rect` is contained within the current `Rectangle`\n\t**/\n\tpublic function containsRect(rect:Rectangle):Bool\n\t{\n\t\tif (rect.width <= 0 || rect.height <= 0)\n\t\t{\n\t\t\treturn rect.x > x && rect.y > y && rect.right < right && rect.bottom < bottom;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn rect.x >= x && rect.y >= y && rect.right <= right && rect.bottom <= bottom;\n\t\t}\n\t}\n\n\t/**\n\t\tReturns whether this rectangle contains the specified vector\n\t\t@param\tvector\tThe vector to test\n\t\t@return\tWhether the vector is contained in the rectangle\n\t**/\n\tpublic function containsVector(vector:Vector2):Bool\n\t{\n\t\treturn contains(vector.x, vector.y);\n\t}\n\n\t/**\n\t\tCopies the x, y, width and height of another `Rectangle`\n\t\t@param\tsourceRect\tAnother `Rectangle` instance\n\t**/\n\tpublic function copyFrom(sourceRect:Rectangle):Void\n\t{\n\t\tx = sourceRect.x;\n\t\ty = sourceRect.y;\n\t\twidth = sourceRect.width;\n\t\theight = sourceRect.height;\n\t}\n\n\t/**\n\t\tChecks whether the current `Rectangle` and another\n\t\tinstance have equal values\n\t\t@param\ttoCompare\tAnother `Rectangle` to compare with\n\t\t@return\tWhether both rectangles are not `null` and have equal values\n\t**/\n\tpublic function equals(toCompare:Rectangle):Bool\n\t{\n\t\treturn toCompare != null && x == toCompare.x && y == toCompare.y && width == toCompare.width && height == toCompare.height;\n\t}\n\n\t/**\n\t\tIncreases the size of the current rectangle by\n\t\tthe given delta x and y values\n\t\t@param\tdx\tA delta x value to increase the size by\n\t\t@param\tdy\tA delta y value to increase the size by\n\t**/\n\tpublic function inflate(dx:Float, dy:Float):Void\n\t{\n\t\tx -= dx;\n\t\twidth += dx * 2;\n\t\ty -= dy;\n\t\theight += dy * 2;\n\t}\n\n\t/**\n\t\tIncreases the size of the current rectangle by\n\t\tthe given delta vector values\n\t\t@param\tvector\tA delta vector to increase the size by\n\t**/\n\tpublic function inflateVector(vector:Vector2):Void\n\t{\n\t\tinflate(vector.x, vector.y);\n\t}\n\n\t/**\n\t\tReturns a new rectangle with the area where the current\n\t\t`Rectangle` and another `Rectangle` instance overlap.\n\t\tIf they do not overlap, the returned `Rectangle` will\n\t\tbe empty\n\t\t@param\ttoIntersect\tAnother `Rectangle` instance to intersect with\n\t\t@param\tresult\t(Optional) A `Rectangle` instance to use for the result\n\t\t@return\tA `Rectangle` of the intersection area\n\t**/\n\tpublic function intersection(toIntersect:Rectangle, result:Rectangle = null):Rectangle\n\t{\n\t\tif (result == null) result = new Rectangle();\n\n\t\tvar x0 = x < toIntersect.x ? toIntersect.x : x;\n\t\tvar x1 = right > toIntersect.right ? toIntersect.right : right;\n\n\t\tif (x1 <= x0)\n\t\t{\n\t\t\tresult.setEmpty();\n\t\t\treturn result;\n\t\t}\n\n\t\tvar y0 = y < toIntersect.y ? toIntersect.y : y;\n\t\tvar y1 = bottom > toIntersect.bottom ? toIntersect.bottom : bottom;\n\n\t\tif (y1 <= y0)\n\t\t{\n\t\t\tresult.setEmpty();\n\t\t\treturn result;\n\t\t}\n\n\t\tresult.x = x0;\n\t\tresult.y = y0;\n\t\tresult.width = x1 - x0;\n\t\tresult.height = y1 - y0;\n\t\treturn result;\n\t}\n\n\t/**\n\t\tReturns if the current `Rectangle` overlaps with another instance\n\t\t@param\ttoIntersect\tAnother `Rectangle` to compare with\n\t\t@return\tWhether the rectangles intersect\n\t**/\n\tpublic function intersects(toIntersect:Rectangle):Bool\n\t{\n\t\tvar x0 = x < toIntersect.x ? toIntersect.x : x;\n\t\tvar x1 = right > toIntersect.right ? toIntersect.right : right;\n\n\t\tif (x1 <= x0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tvar y0 = y < toIntersect.y ? toIntersect.y : y;\n\t\tvar y1 = bottom > toIntersect.bottom ? toIntersect.bottom : bottom;\n\n\t\treturn y1 > y0;\n\t}\n\n\t/**\n\t\tWhether this rectangle is empty\n\t\t@return\t`true` if the width or height is <= 0\n\t**/\n\tpublic function isEmpty():Bool\n\t{\n\t\treturn (width <= 0 || height <= 0);\n\t}\n\n\t/**\n\t\tMoves the rectangle by offset x and values\n\t\t@param\tdx\tA delta x value\n\t\t@param\tdy\tA delta y value\n\t**/\n\tpublic function offset(dx:Float, dy:Float):Void\n\t{\n\t\tx += dx;\n\t\ty += dy;\n\t}\n\n\t/**\n\t\tMoves the rectangle by the values of a `Vector2`\n\t\t@param\tdx\tA delta vector\n\t**/\n\tpublic function offsetVector(vector:Vector2):Void\n\t{\n\t\tx += vector.x;\n\t\ty += vector.y;\n\t}\n\n\t/**\n\t\tMakes this rectangle empty\n\t**/\n\tpublic function setEmpty():Void\n\t{\n\t\tx = y = width = height = 0;\n\t}\n\n\t/**\n\t\tSets the values of this rectangle at once\n\t\t@param\txa\tA new x value\n\t\t@param\tya\tA new y value\n\t\t@param\twidtha\tA new width value\n\t\t@param\theighta\tA new height value\n\t**/\n\tpublic function setTo(xa:Float, ya:Float, widtha:Float, heighta:Float):Void\n\t{\n\t\tx = xa;\n\t\ty = ya;\n\t\twidth = widtha;\n\t\theight = heighta;\n\t}\n\n\t/**\n\t\tCombines two rectangles together, returning the\n\t\tminimum `Rectangle` that contains both rectangles\n\t\t@param\ttoUnion\tA second `Rectangle` to unify\n\t\t@param\tresult\t(Optional) A `Rectangle` instance for the result\n\t\t@return\tA `Rectangle` that contains the dimensions of both rectangles\n\t**/\n\tpublic function union(toUnion:Rectangle, result:Rectangle = null):Rectangle\n\t{\n\t\tif (result == null) result = new Rectangle();\n\n\t\tif (width == 0 || height == 0)\n\t\t{\n\t\t\tresult.copyFrom(toUnion);\n\t\t}\n\t\telse if (toUnion.width == 0 || toUnion.height == 0)\n\t\t{\n\t\t\tresult.copyFrom(this);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar x0 = x > toUnion.x ? toUnion.x : x;\n\t\t\tvar x1 = right < toUnion.right ? toUnion.right : right;\n\t\t\tvar y0 = y > toUnion.y ? toUnion.y : y;\n\t\t\tvar y1 = bottom < toUnion.bottom ? toUnion.bottom : bottom;\n\n\t\t\tresult.setTo(x0, y0, x1 - x0, y1 - y0);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t@:noCompletion private function __toFlashRectangle():#if flash FlashRectangle #else Dynamic #end\n\t{\n\t\t#if flash\n\t\treturn new FlashRectangle(x, y, width, height);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t// Getters & Setters\n\t@:noCompletion private function get_bottom():Float\n\t{\n\t\treturn y + height;\n\t}\n\n\t@:noCompletion private function set_bottom(b:Float):Float\n\t{\n\t\theight = b - y;\n\t\treturn b;\n\t}\n\n\t@:noCompletion private function get_bottomRight():Vector2\n\t{\n\t\treturn new Vector2(x + width, y + height);\n\t}\n\n\t@:noCompletion private function set_bottomRight(p:Vector2):Vector2\n\t{\n\t\twidth = p.x - x;\n\t\theight = p.y - y;\n\t\treturn p.clone();\n\t}\n\n\t@:noCompletion private function get_left():Float\n\t{\n\t\treturn x;\n\t}\n\n\t@:noCompletion private function set_left(l:Float):Float\n\t{\n\t\twidth -= l - x;\n\t\tx = l;\n\t\treturn l;\n\t}\n\n\t@:noCompletion private function get_right():Float\n\t{\n\t\treturn x + width;\n\t}\n\n\t@:noCompletion private function set_right(r:Float):Float\n\t{\n\t\twidth = r - x;\n\t\treturn r;\n\t}\n\n\t@:noCompletion private function get_size():Vector2\n\t{\n\t\treturn new Vector2(width, height);\n\t}\n\n\t@:noCompletion private function set_size(p:Vector2):Vector2\n\t{\n\t\twidth = p.x;\n\t\theight = p.y;\n\t\treturn p.clone();\n\t}\n\n\t@:noCompletion private function get_top():Float\n\t{\n\t\treturn y;\n\t}\n\n\t@:noCompletion private function set_top(t:Float):Float\n\t{\n\t\theight -= t - y;\n\t\ty = t;\n\t\treturn t;\n\t}\n\n\t@:noCompletion private function get_topLeft():Vector2\n\t{\n\t\treturn new Vector2(x, y);\n\t}\n\n\t@:noCompletion private function set_topLeft(p:Vector2):Vector2\n\t{\n\t\tx = p.x;\n\t\ty = p.y;\n\t\treturn p.clone();\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/Vector2.hx",
    "content": "package lime.math;\n\n#if flash\nimport flash.geom.Point;\n#end\n\n/**\n\tThe `Vector2` class can be used for calculating math with\n\tbasic (x, y) coordinates\n**/\n#if hl\n@:keep\n#end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Vector2\n{\n\t/**\n\t\tGets the length of this vector from (0, 0) to (x, y)\n\t**/\n\tpublic var length(get, never):Float;\n\n\t/**\n\t\tGets the square of the length of this vector, which\n\t\tavoids use of `Math.sqrt` for faster performance\n\t**/\n\tpublic var lengthSquared(get, never):Float;\n\n\t/**\n\t\tThe x coodinate for this vector\n\t**/\n\tpublic var x:Float;\n\n\t/**\n\t\tThe y coodinate for this vector\n\t**/\n\tpublic var y:Float;\n\n\t/**\n\t\tCreates a new `Vector` instance\n\t\t@param\tx\t(Optional) An initial `x` value (default is 0)\n\t\t@param\ty\t(Optional) An initial `y` value (default is 0)\n\t**/\n\tpublic function new(x:Float = 0, y:Float = 0)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\t/**\n\t\tAdds the current vector to a second `Vector2` instance\n\t\tand returns the result\n\t\t@param\tv\tA `Vector2` instance to add\n\t\t@param\tresult\t(Optional) A `Vector2` instance to store the result\n\t\t@return\tA `Vector2` instance that combines both vector values\n\t**/\n\tpublic function add(v:Vector2, result:Vector2 = null):Vector2\n\t{\n\t\tif (result == null) result = new Vector2();\n\t\tresult.setTo(v.x + x, v.y + y);\n\t\treturn result;\n\t}\n\n\t/**\n\t\tClones the current `Vector2`\n\t\t@return\tA new `Vector2` instance with the same values as the current one\n\t**/\n\tpublic function clone():Vector2\n\t{\n\t\treturn new Vector2(x, y);\n\t}\n\n\t/**\n\t\tCalculates the distance between two `Vector2` points\n\t\t@param\tpt1\tA `Vector2` instance\n\t\t@param\tpt2\tA second `Vector2` instance\n\t\t@return\tThe distance between each `Vector2`\n\t**/\n\tpublic static function distance(pt1:Vector2, pt2:Vector2):Float\n\t{\n\t\tvar dx = pt1.x - pt2.x;\n\t\tvar dy = pt1.y - pt2.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t}\n\n\t/**\n\t\tWhether this `Vector2` has the same values as another instance\n\t\t@param\ttoCompare\tA `Vector2` instance to compare against\n\t\t@return\tWhether the values of each vector are equal\n\t**/\n\tpublic function equals(toCompare:Vector2):Bool\n\t{\n\t\treturn toCompare != null && toCompare.x == x && toCompare.y == y;\n\t}\n\n\t/**\n\t\tInterpolates between two points, given a specified percentage value\n\t\t@param\tpt1\tA `Vector2` instance\n\t\t@param\tpt2\tA second `Vector2` instance\n\t\t@param\tf\tA percentage value to interpolate\n\t\t@param\tresult\t(Optional) A `Vector2` instance to use for the result\n\t\t@return\tA `Vector2` instance holding the interpolated value\n\t**/\n\tpublic static function interpolate(pt1:Vector2, pt2:Vector2, f:Float, result:Vector2 = null):Vector2\n\t{\n\t\tif (result == null) result = new Vector2();\n\t\tresult.setTo(pt2.x + f * (pt1.x - pt2.x), pt2.y + f * (pt1.y - pt2.y));\n\t\treturn result;\n\t}\n\n\t/**\n\t\tNormalizes this vector between the current length and a set scale value\n\t\t@param\tthickness\tThe scaling value. . For example, if the current vector is `(0, 5)` and you normalize it to 1, the normalized value will be `(0, 1)`\n\t**/\n\tpublic function normalize(thickness:Float):Void\n\t{\n\t\tif (x == 0 && y == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar norm = thickness / Math.sqrt(x * x + y * y);\n\t\t\tx *= norm;\n\t\t\ty *= norm;\n\t\t}\n\t}\n\n\t/**\n\t\tOffsets the current value of this vector\n\t\t@param\tdx\tAn offset x value\n\t\t@param\tdy\tAn offset y value\n\t**/\n\tpublic function offset(dx:Float, dy:Float):Void\n\t{\n\t\tx += dx;\n\t\ty += dy;\n\t}\n\n\t/**\n\t\tConverts a polar coordinate to into a cartesian `Vector2` instance\n\t\t@param\tlen\tThe length of the polar value\n\t\t@param\tangle\tThe angle of the polar value\n\t\t@param\tresult\t(Optional) A `Vector2` instance to store the result\n\t\t@return\tA `Vector2` instance in cartesian coordinates\n\t**/\n\tpublic static function polar(len:Float, angle:Float, result:Vector2 = null):Vector2\n\t{\n\t\tif (result == null) result = new Vector2();\n\t\tresult.setTo(len * Math.cos(angle), len * Math.sin(angle));\n\t\treturn result;\n\t}\n\n\t/**\n\t\tSets this `Vector2` to new values\n\t\t@param\txa\tAn `x` value\n\t\t@param\tya\tA `y` value\n\t**/\n\tpublic inline function setTo(xa:Float, ya:Float):Void\n\t{\n\t\tx = xa;\n\t\ty = ya;\n\t}\n\n\t/**\n\t\tSubtracts the current vector from another `Vector2` instance\n\t\t@param\tv\tA `Vector2` instance to subtract from the current vector\n\t\t@param\tresult\t(Optional) A `Vector2` instance to store the result\n\t\t@return\tA `Vector2` instance containing the subtracted values\n\t**/\n\tpublic function subtract(v:Vector2, result:Vector2 = null):Vector2\n\t{\n\t\tif (result == null) result = new Vector2();\n\t\tresult.setTo(x - v.x, y - v.y);\n\t\treturn result;\n\t}\n\n\t@:noCompletion private function __toFlashPoint():#if flash Point #else Dynamic #end\n\t{\n\t\t#if flash\n\t\treturn new Point(x, y);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t// Getters & Setters\n\t@:noCompletion private function get_length():Float\n\t{\n\t\treturn Math.sqrt(x * x + y * y);\n\t}\n\n\t@:noCompletion private function get_lengthSquared():Float\n\t{\n\t\treturn (x * x + y * y);\n\t}\n}\n"
  },
  {
    "path": "src/lime/math/Vector4.hx",
    "content": "package lime.math;\n\n/**\n\t`Vector4` is a vector suitable for three-dimensional\n\tmath, containing (x, y, z, w) components\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Vector4\n{\n\t/**\n\t\tA constant representing the x axis (1, 0, 0)\n\t**/\n\tpublic static var X_AXIS(get, never):Vector4;\n\n\t/**\n\t\tA constant representing the y axis (0, 1, 0)\n\t**/\n\tpublic static var Y_AXIS(get, never):Vector4;\n\n\t/**\n\t\tA constant representing the z axis (0, 0, 1)\n\t**/\n\tpublic static var Z_AXIS(get, never):Vector4;\n\n\t/**\n\t\tGet the length of this vector\n\t**/\n\tpublic var length(get, never):Float;\n\n\t/**\n\t\tGet the squared length of this vector\n\t\t(avoiding the use of `Math.sqrt` for faster\n\t\tperformance)\n\t**/\n\tpublic var lengthSquared(get, never):Float;\n\n\t/**\n\t\tThe w component value\n\t**/\n\tpublic var w:Float;\n\n\t/**\n\t\tThe x component value\n\t**/\n\tpublic var x:Float;\n\n\t/**\n\t\tThe y component value\n\t**/\n\tpublic var y:Float;\n\n\t/**\n\t\tThe z component value\n\t**/\n\tpublic var z:Float;\n\n\t/**\n\t\tCreates a new `Vector4` instance\n\t\t@param\tx\t(Optional) An initial x value (default is 0)\n\t\t@param\ty\t(Optional) An initial y value (default is 0)\n\t\t@param\tz\t(Optional) An initial z value (default is 0)\n\t\t@param\tw\t(Optional) An initial w value (default is 0)\n\t**/\n\tpublic function new(x:Float = 0., y:Float = 0., z:Float = 0., w:Float = 0.)\n\t{\n\t\tthis.w = w;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\t/**\n\t\tAdds two `Vector4` instances together and returns the result\n\t\t@param\ta\tA `Vector4` instance to add to the current one\n\t\t@param\tresult\t(Optional) A `Vector4` instance to store the result\n\t\t@return\tA `Vector4` instance with the added value\n\t**/\n\tpublic inline function add(a:Vector4, result:Vector4 = null):Vector4\n\t{\n\t\tif (result == null) result = new Vector4();\n\t\tresult.setTo(this.x + a.x, this.y + a.y, this.z + a.z);\n\t\treturn result;\n\t}\n\n\t/**\n\t\tCalculates the angle between two `Vector4` coordinates\n\t\t@param\ta\tA `Vector4` instance\n\t\t@param\tb\tA second `Vector4` instance\n\t\t@return\tThe calculated angle\n\t**/\n\tpublic static inline function angleBetween(a:Vector4, b:Vector4):Float\n\t{\n\t\tvar a0 = a.clone();\n\t\ta0.normalize();\n\t\tvar b0 = b.clone();\n\t\tb0.normalize();\n\n\t\treturn Math.acos(a0.dotProduct(b0));\n\t}\n\n\t/**\n\t\tCreates a new `Vector4` instance with the same values as the current one\n\t\t@return\tA new `Vector4` instance with the same values\n\t**/\n\tpublic inline function clone():Vector4\n\t{\n\t\treturn new Vector4(x, y, z, w);\n\t}\n\n\t/**\n\t\tCopies the x, y and z component values of another `Vector4` instance\n\t\t@param\tsourceVector4\tA `Vector4` instance to copy from\n\t**/\n\tpublic inline function copyFrom(sourceVector4:Vector4):Void\n\t{\n\t\tx = sourceVector4.x;\n\t\ty = sourceVector4.y;\n\t\tz = sourceVector4.z;\n\t}\n\n\t/**\n\t\tPerforms vector multiplication between this vector and another `Vector4` instance\n\t\t@param\ta\tA `Vector4` instance to multiply by\n\t\t@param\tresult\t(Optional) A `Vector4` to use for the result\n\t\t@return\tA `Vector4` instance with the result\n\t**/\n\tpublic inline function crossProduct(a:Vector4, result:Vector4 = null):Vector4\n\t{\n\t\tif (result == null) result = new Vector4();\n\t\tresult.setTo(y * a.z - z * a.y, z * a.x - x * a.z, x * a.y - y * a.x);\n\t\tresult.w = 1;\n\t\treturn result;\n\t}\n\n\t/**\n\t\tDecrements the x, y and z component values by those in another `Vector4` instance\n\t\t@param\ta\tA `Vector4` instance to decrement the current vector by\n\t**/\n\tpublic inline function decrementBy(a:Vector4):Void\n\t{\n\t\tx -= a.x;\n\t\ty -= a.y;\n\t\tz -= a.z;\n\t}\n\n\t/**\n\t\tCalculates the distance between two vectors\n\t\t@param\tpt1\tA `Vector4` instance\n\t\t@param\tpt2\tA second `Vector4` instance\n\t\t@return\tThe distance between each vector\n\t**/\n\tpublic inline static function distance(pt1:Vector4, pt2:Vector4):Float\n\t{\n\t\tvar x = pt2.x - pt1.x;\n\t\tvar y = pt2.y - pt1.y;\n\t\tvar z = pt2.z - pt1.z;\n\n\t\treturn Math.sqrt(x * x + y * y + z * z);\n\t}\n\n\t/**\n\t\tCalculates the squared distance between two vectors,\n\t\t(avoids the use of `Math.sqrt` for faster performance)\n\t\t@param\tpt1\tA `Vector4` instance\n\t\t@param\tpt2\tA second `Vector4` instance\n\t\t@return\tThe square of the distance between each vector\n\t**/\n\tpublic inline static function distanceSquared(pt1:Vector4, pt2:Vector4):Float\n\t{\n\t\tvar x = pt2.x - pt1.x;\n\t\tvar y = pt2.y - pt1.y;\n\t\tvar z = pt2.z - pt1.z;\n\n\t\treturn x * x + y * y + z * z;\n\t}\n\n\t/**\n\t\tCalculates the dot product of the current vector with another `Vector4` instance\n\t\t@param\ta\tA `Vector4` instance to use in the dot product\n\t\t@return\tThe calculated dot product value\n\t**/\n\tpublic inline function dotProduct(a:Vector4):Float\n\t{\n\t\treturn x * a.x + y * a.y + z * a.z;\n\t}\n\n\t/**\n\t\tWhether two `Vector4` instances have equal component values.\n\n\t\tComparing the w component value is optional.\n\t\t@param\ttoCompare\tA `Vector4` instance to compare against\n\t\t@param\tallFour\t(Optional) Whether to compare against the w component (default is false)\n\t\t@return\tWhether both instances have equal values\n\t**/\n\tpublic inline function equals(toCompare:Vector4, ?allFour:Bool = false):Bool\n\t{\n\t\treturn x == toCompare.x && y == toCompare.y && z == toCompare.z && (!allFour || w == toCompare.w);\n\t}\n\n\t/**\n\t\tIncrements the x, y and z component values by those in a second `Vector4` instance\n\t\t@param\ta\tA `Vector4` instance to increment the current vector by\n\t**/\n\tpublic inline function incrementBy(a:Vector4):Void\n\t{\n\t\tx += a.x;\n\t\ty += a.y;\n\t\tz += a.z;\n\t}\n\n\t/**\n\t\tWhether two `Vector4` instances have nearly equal component values.\n\t\tComparison is performed within a given tolerance value.\n\t\t@param\ttoCompare\tA `Vector4` instance to compare against\n\t\t@param\ttolerance\tA floating point value determining how near the values must be to be considered near equal\n\t\t@param\tallFour\t(Optional) Whether to compare against the w component (default is false)\n\t\t@return\tWhether both instances have equal values, within the given tolerance\n\t**/\n\tpublic inline function nearEquals(toCompare:Vector4, tolerance:Float, ?allFour:Bool = false):Bool\n\t{\n\t\treturn Math.abs(x - toCompare.x) < tolerance\n\t\t\t&& Math.abs(y - toCompare.y) < tolerance\n\t\t\t&& Math.abs(z - toCompare.z) < tolerance\n\t\t\t&& (!allFour || Math.abs(w - toCompare.w) < tolerance);\n\t}\n\n\t/**\n\t\tNegates the x, y and z values of the current vector\n\t\t(multiplying each value by -1)\n\t**/\n\tpublic inline function negate():Void\n\t{\n\t\tx *= -1;\n\t\ty *= -1;\n\t\tz *= -1;\n\t}\n\n\t/**\n\t\tDivides the x, y and z component values by the\n\t\tlength of the vector\n\t**/\n\tpublic inline function normalize():Float\n\t{\n\t\tvar l = length;\n\n\t\tif (l != 0)\n\t\t{\n\t\t\tx /= l;\n\t\t\ty /= l;\n\t\t\tz /= l;\n\t\t}\n\n\t\treturn l;\n\t}\n\n\t/**\n\t\tDivides the x, y and z component values by the\n\t\tw component value\n\t**/\n\tpublic inline function project():Void\n\t{\n\t\tx /= w;\n\t\ty /= w;\n\t\tz /= w;\n\t}\n\n\t/**\n\t\tScales the x, y and z component values by a scale value\n\t\t@param\ts\tThe amount of scale to apply\n\t**/\n\tpublic inline function scaleBy(s:Float):Void\n\t{\n\t\tx *= s;\n\t\ty *= s;\n\t\tz *= s;\n\t}\n\n\t/**\n\t\tSets the x, y and z component values\n\t\t@param\txa\tAn x value\n\t\t@param\tya\tA y value\n\t\t@param\tza\tA z value\n\t**/\n\tpublic inline function setTo(xa:Float, ya:Float, za:Float):Void\n\t{\n\t\tx = xa;\n\t\ty = ya;\n\t\tz = za;\n\t}\n\n\t/**\n\t\tSubtracts the values of a second `Vector4` instance\n\t\tfrom the current one\n\t\t@param\ta\tA second `Vector4` instance to substract\n\t\t@param\tresult\t(Optional) A `Vector4` instance to store the result\n\t\t@return\tA `Vector4` instance containing the subtracted value\n\t**/\n\tpublic inline function subtract(a:Vector4, result:Vector4 = null):Vector4\n\t{\n\t\tif (result == null) result = new Vector4();\n\t\tresult.setTo(x - a.x, y - a.y, z - a.z);\n\t\treturn result;\n\t}\n\n\t@:dox(hide) public inline function toString():String\n\t{\n\t\treturn \"Vector4(\" + x + \", \" + y + \", \" + z + \")\";\n\t}\n\n\t// Getters & Setters\n\t@:noCompletion private inline function get_length():Float\n\t{\n\t\treturn Math.sqrt(x * x + y * y + z * z);\n\t}\n\n\t@:noCompletion private inline function get_lengthSquared():Float\n\t{\n\t\treturn x * x + y * y + z * z;\n\t}\n\n\tprivate inline static function get_X_AXIS():Vector4\n\t{\n\t\treturn new Vector4(1, 0, 0);\n\t}\n\n\tprivate inline static function get_Y_AXIS():Vector4\n\t{\n\t\treturn new Vector4(0, 1, 0);\n\t}\n\n\tprivate inline static function get_Z_AXIS():Vector4\n\t{\n\t\treturn new Vector4(0, 0, 1);\n\t}\n}\n"
  },
  {
    "path": "src/lime/media/AudioBuffer.hx",
    "content": "package lime.media;\n\nimport haxe.io.Bytes;\nimport haxe.io.Path;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime._internal.format.Base64;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.media.openal.AL;\nimport lime.media.openal.ALBuffer;\nimport lime.media.vorbis.VorbisFile;\nimport lime.net.HTTPRequest;\nimport lime.utils.Log;\nimport lime.utils.UInt8Array;\n#if lime_howlerjs\nimport lime.media.howlerjs.Howl;\n#end\n#if (js && html5)\nimport js.html.Audio;\n#elseif flash\nimport flash.media.Sound;\nimport flash.net.URLRequest;\n#end\n\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.utils.Assets)\n#if hl\n@:keep\n#end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n\n/**\n\tThe `AudioBuffer` class represents a buffer of audio data that can be played back using an `AudioSource`.\n\tIt supports a variety of audio formats and platforms, providing a consistent API for loading and managing audio data.\n\n\tDepending on the platform, the audio backend may differ, but the class provides a unified interface for accessing\n\taudio data, whether it's stored in memory, loaded from a file, or streamed.\n\n\t@see lime.media.AudioSource\n**/\nclass AudioBuffer\n{\n\t/**\n\t\tThe number of bits per sample in the audio data.\n\t**/\n\tpublic var bitsPerSample:Int;\n\n\t/**\n\t\tThe number of audio channels (e.g., 1 for mono, 2 for stereo).\n\t**/\n\tpublic var channels:Int;\n\n\t/**\n\t\tThe raw audio data stored as a `UInt8Array`.\n\t**/\n\tpublic var data:UInt8Array;\n\n\t/**\n\t\tThe sample rate of the audio data, in Hz.\n\t**/\n\tpublic var sampleRate:Int;\n\n\t/**\n\t\tThe source of the audio data. This can be an `Audio`, `Sound`, `Howl`, or other platform-specific object.\n\t**/\n\tpublic var src(get, set):Dynamic;\n\n\t@:noCompletion private var __srcAudio:#if (js && html5) Audio #else Dynamic #end;\n\t@:noCompletion private var __srcBuffer:#if lime_cffi ALBuffer #else Dynamic #end;\n\t@:noCompletion private var __srcCustom:Dynamic;\n\t@:noCompletion private var __srcHowl:#if lime_howlerjs Howl #else Dynamic #end;\n\t@:noCompletion private var __srcSound:#if flash Sound #else Dynamic #end;\n\t@:noCompletion private var __srcVorbisFile:#if lime_vorbis VorbisFile #else Dynamic #end;\n\n\t#if commonjs\n\tprivate static function __init__()\n\t{\n\t\tvar p = untyped AudioBuffer.prototype;\n\t\tuntyped Object.defineProperties(p,\n\t\t\t{\n\t\t\t\t\"src\": {get: p.get_src, set: p.set_src}\n\t\t\t});\n\t}\n\t#end\n\n\t/**\n\t\tCreates a new, empty `AudioBuffer` instance.\n\t**/\n\tpublic function new() {}\n\n\t/**\n\t\tDisposes of the resources used by this `AudioBuffer`, such as unloading any associated audio data.\n\t**/\n\tpublic function dispose():Void\n\t{\n\t\t#if (js && html5 && lime_howlerjs)\n\t\t__srcHowl.unload();\n\t\t#end\n\t}\n\n\t/**\n\t\tCreates an `AudioBuffer` from a Base64-encoded string.\n\n\t\t@param base64String The Base64-encoded audio data.\n\t\t@return An `AudioBuffer` instance with the decoded audio data.\n\t**/\n\tpublic static function fromBase64(base64String:String):AudioBuffer\n\t{\n\t\tif (base64String == null) return null;\n\n\t\t#if (js && html5 && lime_howlerjs)\n\t\t// if base64String doesn't contain codec data, add it.\n\t\tif (base64String.indexOf(\",\") == -1)\n\t\t{\n\t\t\tbase64String = \"data:\" + __getCodec(Base64.decode(base64String)) + \";base64,\" + base64String;\n\t\t}\n\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.src = new Howl({src: [base64String], html5: true, preload: false});\n\t\treturn audioBuffer;\n\t\t#elseif (lime_cffi && !macro)\n\t\t#if !cs\n\t\t// if base64String contains codec data, strip it then decode it.\n\t\tvar base64StringSplit = base64String.split(\",\");\n\t\tvar base64StringNoEncoding = base64StringSplit[base64StringSplit.length - 1];\n\t\tvar bytes:Bytes = Base64.decode(base64StringNoEncoding);\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.data = new UInt8Array(Bytes.alloc(0));\n\n\t\treturn NativeCFFI.lime_audio_load_bytes(bytes, audioBuffer);\n\t\t#else\n\t\t// if base64String contains codec data, strip it then decode it.\n\t\tvar base64StringSplit = base64String.split(\",\");\n\t\tvar base64StringNoEncoding = base64StringSplit[base64StringSplit.length - 1];\n\t\tvar bytes:Bytes = Base64.decode(base64StringNoEncoding);\n\t\tvar data:Dynamic = NativeCFFI.lime_audio_load_bytes(bytes, null);\n\n\t\tif (data != null)\n\t\t{\n\t\t\tvar audioBuffer = new AudioBuffer();\n\t\t\taudioBuffer.bitsPerSample = data.bitsPerSample;\n\t\t\taudioBuffer.channels = data.channels;\n\t\t\taudioBuffer.data = new UInt8Array(@:privateAccess new Bytes(data.data.length, data.data.b));\n\t\t\taudioBuffer.sampleRate = data.sampleRate;\n\t\t\treturn audioBuffer;\n\t\t}\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t/**\n\t\tCreates an `AudioBuffer` from a `Bytes` object.\n\n\t\t@param bytes The `Bytes` object containing the audio data.\n\t\t@return An `AudioBuffer` instance with the decoded audio data.\n\t**/\n\tpublic static function fromBytes(bytes:Bytes):AudioBuffer\n\t{\n\t\tif (bytes == null) return null;\n\n\t\t#if (js && html5 && lime_howlerjs)\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.src = new Howl({src: [\"data:\" + __getCodec(bytes) + \";base64,\" + Base64.encode(bytes)], html5: true, preload: false});\n\n\t\treturn audioBuffer;\n\t\t#elseif (lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.data = new UInt8Array(Bytes.alloc(0));\n\n\t\treturn NativeCFFI.lime_audio_load_bytes(bytes, audioBuffer);\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_audio_load_bytes(bytes, null);\n\n\t\tif (data != null)\n\t\t{\n\t\t\tvar audioBuffer = new AudioBuffer();\n\t\t\taudioBuffer.bitsPerSample = data.bitsPerSample;\n\t\t\taudioBuffer.channels = data.channels;\n\t\t\taudioBuffer.data = new UInt8Array(@:privateAccess new Bytes(data.data.length, data.data.b));\n\t\t\taudioBuffer.sampleRate = data.sampleRate;\n\t\t\treturn audioBuffer;\n\t\t}\n\t\t#end\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t/**\n\t\tCreates an `AudioBuffer` from a file.\n\n\t\t@param path The file path to the audio data.\n\t\t@return An `AudioBuffer` instance with the audio data loaded from the file.\n\t**/\n\tpublic static function fromFile(path:String):AudioBuffer\n\t{\n\t\tif (path == null) return null;\n\n\t\t#if (js && html5 && lime_howlerjs)\n\t\tvar audioBuffer = new AudioBuffer();\n\n\t\t#if force_html5_audio\n\t\taudioBuffer.__srcHowl = new Howl({src: [path], html5: true, preload: false});\n\t\t#else\n\t\taudioBuffer.__srcHowl = new Howl({src: [path], preload: false});\n\t\t#end\n\n\t\treturn audioBuffer;\n\t\t#elseif flash\n\t\tswitch (Path.extension(path))\n\t\t{\n\t\t\tcase \"ogg\", \"wav\":\n\t\t\t\treturn null;\n\t\t\tdefault:\n\t\t}\n\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.__srcSound = new Sound(new URLRequest(path));\n\t\treturn audioBuffer;\n\t\t#elseif (lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.data = new UInt8Array(Bytes.alloc(0));\n\n\t\treturn NativeCFFI.lime_audio_load_file(path, audioBuffer);\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_audio_load_file(path, null);\n\n\t\tif (data != null)\n\t\t{\n\t\t\tvar audioBuffer = new AudioBuffer();\n\t\t\taudioBuffer.bitsPerSample = data.bitsPerSample;\n\t\t\taudioBuffer.channels = data.channels;\n\t\t\taudioBuffer.data = new UInt8Array(@:privateAccess new Bytes(data.data.length, data.data.b));\n\t\t\taudioBuffer.sampleRate = data.sampleRate;\n\t\t\treturn audioBuffer;\n\t\t}\n\n\t\treturn null;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t/**\n\t\tCreates an `AudioBuffer` from an array of file paths.\n\n\t\t@param paths An array of file paths to search for audio data.\n\t\t@return An `AudioBuffer` instance with the audio data loaded from the first valid file found.\n\t**/\n\tpublic static function fromFiles(paths:Array<String>):AudioBuffer\n\t{\n\t\t#if (js && html5 && lime_howlerjs)\n\t\tvar audioBuffer = new AudioBuffer();\n\n\t\t#if force_html5_audio\n\t\taudioBuffer.__srcHowl = new Howl({src: paths, html5: true, preload: false});\n\t\t#else\n\t\taudioBuffer.__srcHowl = new Howl({src: paths, preload: false});\n\t\t#end\n\n\t\treturn audioBuffer;\n\t\t#else\n\t\tvar buffer = null;\n\n\t\tfor (path in paths)\n\t\t{\n\t\t\tbuffer = AudioBuffer.fromFile(path);\n\t\t\tif (buffer != null) break;\n\t\t}\n\n\t\treturn buffer;\n\t\t#end\n\t}\n\n\t/**\n\t\tCreates an `AudioBuffer` from a `VorbisFile`.\n\n\t\t@param vorbisFile The `VorbisFile` object containing the audio data.\n\t\t@return An `AudioBuffer` instance with the decoded audio data.\n\t**/\n\t#if lime_vorbis\n\n\tpublic static function fromVorbisFile(vorbisFile:VorbisFile):AudioBuffer\n\t{\n\t\tif (vorbisFile == null) return null;\n\n\t\tvar info = vorbisFile.info();\n\n\t\tvar audioBuffer = new AudioBuffer();\n\t\taudioBuffer.channels = info.channels;\n\t\taudioBuffer.sampleRate = info.rate;\n\t\taudioBuffer.bitsPerSample = 16;\n\t\taudioBuffer.__srcVorbisFile = vorbisFile;\n\n\t\treturn audioBuffer;\n\t}\n\t#else\n\tpublic static function fromVorbisFile(vorbisFile:Dynamic):AudioBuffer\n\t{\n\t\treturn null;\n\t}\n\t#end\n\n\t/**\n\t\tAsynchronously loads an `AudioBuffer` from a file.\n\n\t\t@param path The file path to the audio data.\n\t\t@return A `Future` that resolves to the loaded `AudioBuffer`.\n\t**/\n\tpublic static function loadFromFile(path:String):Future<AudioBuffer>\n\t{\n\t\t#if (flash || (js && html5))\n\t\tvar promise = new Promise<AudioBuffer>();\n\n\t\tvar audioBuffer = AudioBuffer.fromFile(path);\n\n\t\tif (audioBuffer != null)\n\t\t{\n\t\t\t#if flash\n\t\t\taudioBuffer.__srcSound.addEventListener(flash.events.Event.COMPLETE, function(event)\n\t\t\t{\n\t\t\t\tpromise.complete(audioBuffer);\n\t\t\t});\n\n\t\t\taudioBuffer.__srcSound.addEventListener(flash.events.ProgressEvent.PROGRESS, function(event)\n\t\t\t{\n\t\t\t\tpromise.progress(Std.int(event.bytesLoaded), Std.int(event.bytesTotal));\n\t\t\t});\n\n\t\t\taudioBuffer.__srcSound.addEventListener(flash.events.IOErrorEvent.IO_ERROR, promise.error);\n\t\t\t#elseif (js && html5 && lime_howlerjs)\n\t\t\tif (audioBuffer != null)\n\t\t\t{\n\t\t\t\taudioBuffer.__srcHowl.on(\"load\", function()\n\t\t\t\t{\n\t\t\t\t\tpromise.complete(audioBuffer);\n\t\t\t\t});\n\n\t\t\t\taudioBuffer.__srcHowl.on(\"loaderror\", function(id, msg)\n\t\t\t\t{\n\t\t\t\t\tpromise.error(msg);\n\t\t\t\t});\n\n\t\t\t\taudioBuffer.__srcHowl.load();\n\t\t\t}\n\t\t\t#else\n\t\t\tpromise.complete(audioBuffer);\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpromise.error(null);\n\t\t}\n\n\t\treturn promise.future;\n\t\t#else\n\t\t// TODO: Streaming\n\n\t\tvar request = new HTTPRequest<AudioBuffer>();\n\t\treturn request.load(path).then(function(buffer)\n\t\t{\n\t\t\tif (buffer != null)\n\t\t\t{\n\t\t\t\treturn Future.withValue(buffer);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn cast Future.withError(\"\");\n\t\t\t}\n\t\t});\n\t\t#end\n\t}\n\n\t/**\n\t\tAsynchronously loads an `AudioBuffer` from multiple files.\n\n\t\t@param paths An array of file paths to search for audio data.\n\t\t@return A `Future` that resolves to the loaded `AudioBuffer`.\n\t**/\n\tpublic static function loadFromFiles(paths:Array<String>):Future<AudioBuffer>\n\t{\n\t\t#if (js && html5 && lime_howlerjs)\n\t\tvar promise = new Promise<AudioBuffer>();\n\n\t\tvar audioBuffer = AudioBuffer.fromFiles(paths);\n\n\t\tif (audioBuffer != null)\n\t\t{\n\t\t\taudioBuffer.__srcHowl.on(\"load\", function()\n\t\t\t{\n\t\t\t\tpromise.complete(audioBuffer);\n\t\t\t});\n\n\t\t\taudioBuffer.__srcHowl.on(\"loaderror\", function()\n\t\t\t{\n\t\t\t\tpromise.error(null);\n\t\t\t});\n\n\t\t\taudioBuffer.__srcHowl.load();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpromise.error(null);\n\t\t}\n\n\t\treturn promise.future;\n\t\t#else\n\t\treturn new Future(fromFiles.bind(paths), true);\n\t\t#end\n\t}\n\n\tprivate static function __getCodec(bytes:Bytes):String\n\t{\n\t\tvar signature:String = null;\n\t\ttry\n\t\t{\n\t\t\tsignature = bytes.getString(0, 4);\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\t// if the bytes don't represent a valid UTF-8 string, getString()\n\t\t\t// may throw an exception. in that case, we expect to end up in\n\t\t\t// the default switch case below where it tries to detect MP3.\n\t\t}\n\n\t\tswitch (signature)\n\t\t{\n\t\t\tcase \"OggS\":\n\t\t\t\treturn \"audio/ogg\";\n\t\t\tcase \"fLaC\":\n\t\t\t\treturn \"audio/flac\";\n\t\t\tcase \"RIFF\" if (bytes.getString(8, 4) == \"WAVE\"):\n\t\t\t\treturn \"audio/wav\";\n\t\t\tdefault:\n\t\t\t\tswitch ([bytes.get(0), bytes.get(1), bytes.get(2)])\n\t\t\t\t{\n\t\t\t\t\tcase [73, 68, 51] | [255, 251, _] | [255, 250, _] | [255, 243, _]: return \"audio/mp3\";\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t}\n\n\t\tLog.error(\"Unsupported sound format\");\n\t\treturn null;\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_src():Dynamic\n\t{\n\t\t#if (js && html5)\n\t\t#if lime_howlerjs\n\t\treturn __srcHowl;\n\t\t#else\n\t\treturn __srcAudio;\n\t\t#end\n\t\t#elseif flash\n\t\treturn __srcSound;\n\t\t#elseif lime_vorbis\n\t\treturn __srcVorbisFile;\n\t\t#else\n\t\treturn __srcCustom;\n\t\t#end\n\t}\n\n\t@:noCompletion private function set_src(value:Dynamic):Dynamic\n\t{\n\t\t#if (js && html5)\n\t\t#if lime_howlerjs\n\t\treturn __srcHowl = value;\n\t\t#else\n\t\treturn __srcAudio = value;\n\t\t#end\n\t\t#elseif flash\n\t\treturn __srcSound = value;\n\t\t#elseif lime_vorbis\n\t\treturn __srcVorbisFile = value;\n\t\t#else\n\t\treturn __srcCustom = value;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/media/AudioContext.hx",
    "content": "package lime.media;\n\n@:access(lime.media.FlashAudioContext)\n@:access(lime.media.HTML5AudioContext)\n@:access(lime.media.OpenALAudioContext)\n@:access(lime.media.WebAudioContext)\nclass AudioContext\n{\n\tpublic var custom:Dynamic;\n\t#if (!lime_doc_gen || flash)\n\tpublic var flash(default, null):FlashAudioContext;\n\t#end\n\t#if (!lime_doc_gen || (js && html5))\n\tpublic var html5(default, null):HTML5AudioContext;\n\t#end\n\t#if (!lime_doc_gen || lime_openal)\n\tpublic var openal(default, null):OpenALAudioContext;\n\t#end\n\tpublic var type(default, null):AudioContextType;\n\t#if (!lime_doc_gen || (js && html5))\n\tpublic var web(default, null):WebAudioContext;\n\t#end\n\n\tpublic function new(type:AudioContextType = null)\n\t{\n\t\tif (type != CUSTOM)\n\t\t{\n\t\t\t#if (js && html5)\n\t\t\tif (type == null || type == WEB)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"window.AudioContext = window.AudioContext || window.webkitAudioContext;\");\n\t\t\t\t\tweb = cast untyped #if haxe4 js.Syntax.code #else __js__ #end (\"new window.AudioContext ()\");\n\t\t\t\t\tthis.type = WEB;\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t}\n\n\t\t\tif (web == null && type != WEB)\n\t\t\t{\n\t\t\t\thtml5 = new HTML5AudioContext();\n\t\t\t\tthis.type = HTML5;\n\t\t\t}\n\t\t\t#elseif flash\n\t\t\tflash = new FlashAudioContext();\n\t\t\tthis.type = FLASH;\n\t\t\t#else\n\t\t\topenal = new OpenALAudioContext();\n\t\t\tthis.type = OPENAL;\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.type = CUSTOM;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/media/AudioContextType.hx",
    "content": "package lime.media;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract AudioContextType(String) from String to String\n{\n\tvar FLASH = \"flash\";\n\tvar HTML5 = \"html5\";\n\tvar OPENAL = \"openal\";\n\tvar WEB = \"web\";\n\tvar CUSTOM = \"custom\";\n}\n"
  },
  {
    "path": "src/lime/media/AudioManager.hx",
    "content": "package lime.media;\n\nimport haxe.Timer;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.media.openal.AL;\nimport lime.media.openal.ALC;\nimport lime.media.openal.ALContext;\nimport lime.media.openal.ALDevice;\n#if (js && html5)\nimport js.Browser;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass AudioManager\n{\n\tpublic static var context:AudioContext;\n\n\tpublic static function init(context:AudioContext = null)\n\t{\n\t\tif (AudioManager.context == null)\n\t\t{\n\t\t\tif (context == null)\n\t\t\t{\n\t\t\t\tAudioManager.context = new AudioContext();\n\t\t\t\tcontext = AudioManager.context;\n\n\t\t\t\t#if !lime_doc_gen\n\t\t\t\tif (context.type == OPENAL)\n\t\t\t\t{\n\t\t\t\t\tvar alc = context.openal;\n\n\t\t\t\t\tvar device = alc.openDevice();\n\t\t\t\t\tif (device != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar ctx = alc.createContext(device);\n\t\t\t\t\t\talc.makeContextCurrent(ctx);\n\t\t\t\t\t\talc.processContext(ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t#end\n\t\t\t}\n\n\t\t\tAudioManager.context = context;\n\n\t\t\t#if (lime_cffi && !macro && lime_openal && (ios || tvos || mac))\n\t\t\tvar timer = new Timer(100);\n\t\t\ttimer.run = function()\n\t\t\t{\n\t\t\t\tNativeCFFI.lime_al_cleanup();\n\t\t\t};\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic static function resume():Void\n\t{\n\t\t#if !lime_doc_gen\n\t\tif (context != null && context.type == OPENAL)\n\t\t{\n\t\t\tvar alc = context.openal;\n\t\t\tvar currentContext = alc.getCurrentContext();\n\n\t\t\tif (currentContext != null)\n\t\t\t{\n\t\t\t\tvar device = alc.getContextsDevice(currentContext);\n\t\t\t\talc.resumeDevice(device);\n\t\t\t\talc.processContext(currentContext);\n\t\t\t}\n\t\t}\n\t\t#end\n\t}\n\n\tpublic static function shutdown():Void\n\t{\n\t\t#if !lime_doc_gen\n\t\tif (context != null && context.type == OPENAL)\n\t\t{\n\t\t\tvar alc = context.openal;\n\t\t\tvar currentContext = alc.getCurrentContext();\n\n\t\t\tif (currentContext != null)\n\t\t\t{\n\t\t\t\tvar device = alc.getContextsDevice(currentContext);\n\t\t\t\talc.makeContextCurrent(null);\n\t\t\t\talc.destroyContext(currentContext);\n\n\t\t\t\tif (device != null)\n\t\t\t\t{\n\t\t\t\t\talc.closeDevice(device);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\tcontext = null;\n\t}\n\n\tpublic static function suspend():Void\n\t{\n\t\t#if !lime_doc_gen\n\t\tif (context != null && context.type == OPENAL)\n\t\t{\n\t\t\tvar alc = context.openal;\n\t\t\tvar currentContext = alc.getCurrentContext();\n\n\t\t\tif (currentContext != null)\n\t\t\t{\n\t\t\t\talc.suspendContext(currentContext);\n\t\t\t\tvar device = alc.getContextsDevice(currentContext);\n\n\t\t\t\tif (device != null)\n\t\t\t\t{\n\t\t\t\t\talc.pauseDevice(device);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/media/AudioSource.hx",
    "content": "package lime.media;\n\nimport lime.app.Event;\nimport lime.media.openal.AL;\nimport lime.media.openal.ALSource;\nimport lime.math.Vector4;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n/**\n\tThe `AudioSource` class provides a way to control audio playback in a Lime application. \n\tIt allows for playing, pausing, and stopping audio, as well as controlling various \n\taudio properties such as gain, pitch, and looping.\n\n\tDepending on the platform, the audio backend may vary, but the API remains consistent.\n\n\t@see lime.media.AudioBuffer\n**/\nclass AudioSource\n{\n\t/**\n\t\tAn event that is dispatched when the audio playback is complete.\n\t**/\n\tpublic var onComplete = new Event<Void->Void>();\n\t\n\t/**\n\t\tThe `AudioBuffer` associated with this `AudioSource`.\n\t**/\n\tpublic var buffer:AudioBuffer;\n\n\t/**\n\t\tThe current playback position of the audio, in milliseconds.\n\t**/\n\tpublic var currentTime(get, set):Int;\n\n\t/**\n\t\tThe gain (volume) of the audio. A value of `1.0` represents the default volume.\n\t**/\n\tpublic var gain(get, set):Float;\n\n\t/**\n\t\tThe length of the audio, in milliseconds.\n\t**/\n\tpublic var length(get, set):Int;\n\n\t/**\n\t\tThe number of times the audio will loop. A value of `0` means the audio will not loop.\n\t**/\n\tpublic var loops(get, set):Int;\n\n\t/**\n\t\tThe pitch of the audio. A value of `1.0` represents the default pitch.\n\t**/\n\tpublic var pitch(get, set):Float;\n\n\t/**\n\t\tThe offset within the audio buffer to start playback, in samples.\n\t**/\n\tpublic var offset:Int;\n\n\t/**\n\t\tThe 3D position of the audio source, represented as a `Vector4`.\n\t**/\n\tpublic var position(get, set):Vector4;\n\n\t@:noCompletion private var __backend:AudioSourceBackend;\n\n\t/**\n\t\tCreates a new `AudioSource` instance.\n\t\t@param buffer The `AudioBuffer` to associate with this `AudioSource`.\n\t\t@param offset The starting offset within the audio buffer, in samples.\n\t\t@param length The length of the audio to play, in milliseconds. If `null`, the full buffer is used.\n\t\t@param loops The number of times to loop the audio. `0` means no looping.\n\t**/\n\tpublic function new(buffer:AudioBuffer = null, offset:Int = 0, length:Null<Int> = null, loops:Int = 0)\n\t{\n\t\tthis.buffer = buffer;\n\t\tthis.offset = offset;\n\n\t\t__backend = new AudioSourceBackend(this);\n\n\t\tif (length != null && length != 0)\n\t\t{\n\t\t\tthis.length = length;\n\t\t}\n\n\t\tthis.loops = loops;\n\n\t\tif (buffer != null)\n\t\t{\n\t\t\tinit();\n\t\t}\n\t}\n\n\t/**\n\t\tReleases any resources used by this `AudioSource`.\n\t**/\n\tpublic function dispose():Void\n\t{\n\t\t__backend.dispose();\n\t}\n\n\t@:noCompletion private function init():Void\n\t{\n\t\t__backend.init();\n\t}\n\n\t/**\n\t\tStarts or resumes audio playback.\n\t**/\n\tpublic function play():Void\n\t{\n\t\t__backend.play();\n\t}\n\n\t/**\n\t\tPauses audio playback.\n\t**/\n\tpublic function pause():Void\n\t{\n\t\t__backend.pause();\n\t}\n\n\t/**\n\t\tStops audio playback and resets the playback position to the beginning.\n\t**/\n\tpublic function stop():Void\n\t{\n\t\t__backend.stop();\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_currentTime():Int\n\t{\n\t\treturn __backend.getCurrentTime();\n\t}\n\n\t@:noCompletion private function set_currentTime(value:Int):Int\n\t{\n\t\treturn __backend.setCurrentTime(value);\n\t}\n\n\t@:noCompletion private function get_gain():Float\n\t{\n\t\treturn __backend.getGain();\n\t}\n\n\t@:noCompletion private function set_gain(value:Float):Float\n\t{\n\t\treturn __backend.setGain(value);\n\t}\n\n\t@:noCompletion private function get_length():Int\n\t{\n\t\treturn __backend.getLength();\n\t}\n\n\t@:noCompletion private function set_length(value:Int):Int\n\t{\n\t\treturn __backend.setLength(value);\n\t}\n\n\t@:noCompletion private function get_loops():Int\n\t{\n\t\treturn __backend.getLoops();\n\t}\n\n\t@:noCompletion private function set_loops(value:Int):Int\n\t{\n\t\treturn __backend.setLoops(value);\n\t}\n\n\t@:noCompletion private function get_pitch():Float\n\t{\n\t\treturn __backend.getPitch();\n\t}\n\n\t@:noCompletion private function set_pitch(value:Float):Float\n\t{\n\t\treturn __backend.setPitch(value);\n\t}\n\n\t@:noCompletion private function get_position():Vector4\n\t{\n\t\treturn __backend.getPosition();\n\t}\n\n\t@:noCompletion private function set_position(value:Vector4):Vector4\n\t{\n\t\treturn __backend.setPosition(value);\n\t}\n}\n\n#if flash\n@:noCompletion private typedef AudioSourceBackend = lime._internal.backend.flash.FlashAudioSource;\n#elseif (js && html5)\n@:noCompletion private typedef AudioSourceBackend = lime._internal.backend.html5.HTML5AudioSource;\n#else\n@:noCompletion private typedef AudioSourceBackend = lime._internal.backend.native.NativeAudioSource;\n#end\n"
  },
  {
    "path": "src/lime/media/FlashAudioContext.hx",
    "content": "package lime.media;\n\n#if (!lime_doc_gen || flash)\n#if flash\nimport flash.media.Sound;\n#end\n\nclass FlashAudioContext\n{\n\t@:noCompletion private function new() {}\n\n\tpublic function createBuffer(stream:Dynamic /*URLRequest*/ = null, context:Dynamic /*SoundLoaderContext*/ = null):AudioBuffer\n\t{\n\t\t#if flash\n\t\tvar buffer = new AudioBuffer();\n\t\tbuffer.src = new Sound(stream, context);\n\t\treturn buffer;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getBytesLoaded(buffer:AudioBuffer):UInt\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.bytesLoaded;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getBytesTotal(buffer:AudioBuffer):Int\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.bytesTotal;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getID3(buffer:AudioBuffer):Dynamic /*ID3Info*/\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.id3;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getIsBuffering(buffer:AudioBuffer):Bool\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.isBuffering;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getIsURLInaccessible(buffer:AudioBuffer):Bool\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.isURLInaccessible;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getLength(buffer:AudioBuffer):Float\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.length;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getURL(buffer:AudioBuffer):String\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.url;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function close(buffer:AudioBuffer):Void\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\tbuffer.src.close();\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function extract(buffer:AudioBuffer, target:Dynamic /*flash.utils.ByteArray*/, length:Float, startPosition:Float = -1):Float\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.extract(target, length, startPosition);\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function load(buffer:AudioBuffer, stream:Dynamic /*flash.net.URLRequest*/, context:Dynamic /*SoundLoaderContext*/ = null):Void\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\tbuffer.src.load(stream, context);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function loadCompressedDataFromByteArray(buffer:AudioBuffer, bytes:Dynamic /*flash.utils.ByteArray*/, bytesLength:UInt):Void\n\t{\n\t\t#if flash11\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\tbuffer.src.loadCompressedDataFromByteArray(bytes, bytesLength);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function loadPCMFromByteArray(buffer:AudioBuffer, bytes:Dynamic /*flash.utils.ByteArray*/, samples:UInt, format:String = null, stereo:Bool = true,\n\t\t\tsampleRate:Float = 44100):Void\n\t{\n\t\t#if flash11\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\tbuffer.src.loadPCMFromByteArray(bytes, samples, format, stereo, sampleRate);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function play(buffer:AudioBuffer, startTime:Float = 0, loops:Int = 0, sndTransform:Dynamic /*SoundTransform*/ = null):Dynamic /*SoundChannel*/\n\t{\n\t\t#if flash\n\t\tif (buffer.src != null)\n\t\t{\n\t\t\treturn buffer.src.play(startTime, loops, sndTransform);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/HTML5AudioContext.hx",
    "content": "package lime.media;\n\n#if (!lime_doc_gen || (js && html5))\n#if (js && html5)\nimport js.html.Audio;\n#end\n\n@:access(lime.media.AudioBuffer)\nclass HTML5AudioContext\n{\n\tpublic var HAVE_CURRENT_DATA:Int = 2;\n\tpublic var HAVE_ENOUGH_DATA:Int = 4;\n\tpublic var HAVE_FUTURE_DATA:Int = 3;\n\tpublic var HAVE_METADATA:Int = 1;\n\tpublic var HAVE_NOTHING:Int = 0;\n\tpublic var NETWORK_EMPTY:Int = 0;\n\tpublic var NETWORK_IDLE:Int = 1;\n\tpublic var NETWORK_LOADING:Int = 2;\n\tpublic var NETWORK_NO_SOURCE:Int = 3;\n\n\t@:noCompletion private function new() {}\n\n\tpublic function canPlayType(buffer:AudioBuffer, type:String):String\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.canPlayType(type);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function createBuffer(urlString:String = null):AudioBuffer\n\t{\n\t\t#if (js && html5)\n\t\tvar buffer = new AudioBuffer();\n\t\tbuffer.__srcAudio = new Audio();\n\t\tbuffer.__srcAudio.src = urlString;\n\t\treturn buffer;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getAutoplay(buffer:AudioBuffer):Bool\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.autoplay;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getBuffered(buffer:AudioBuffer):Dynamic /*TimeRanges*/\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.buffered;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getCurrentSrc(buffer:AudioBuffer):String\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.currentSrc;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getCurrentTime(buffer:AudioBuffer):Float\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.currentTime;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getDefaultPlaybackRate(buffer:AudioBuffer):Float\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.defaultPlaybackRate;\n\t\t}\n\t\t#end\n\n\t\treturn 1;\n\t}\n\n\tpublic function getDuration(buffer:AudioBuffer):Float\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.duration;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getEnded(buffer:AudioBuffer):Bool\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.ended;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getError(buffer:AudioBuffer):Dynamic /*MediaError*/\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.error;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getLoop(buffer:AudioBuffer):Bool\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.loop;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getMuted(buffer:AudioBuffer):Bool\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.muted;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getNetworkState(buffer:AudioBuffer):Int\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.networkState;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getPaused(buffer:AudioBuffer):Bool\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.paused;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getPlaybackRate(buffer:AudioBuffer):Float\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.playbackRate;\n\t\t}\n\t\t#end\n\n\t\treturn 1;\n\t}\n\n\tpublic function getPlayed(buffer:AudioBuffer):Dynamic /*TimeRanges*/\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.played;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getPreload(buffer:AudioBuffer):String\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.preload;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getReadyState(buffer:AudioBuffer):Int\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.readyState;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getSeekable(buffer:AudioBuffer):Dynamic /*TimeRanges*/\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.seekable;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getSeeking(buffer:AudioBuffer):Bool\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.seeking;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic function getSrc(buffer:AudioBuffer):String\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.src;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function getStartTime(buffer:AudioBuffer):Float\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.playbackRate;\n\t\t}\n\t\t#end\n\n\t\treturn 0;\n\t}\n\n\tpublic function getVolume(buffer:AudioBuffer):Float\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\treturn buffer.__srcAudio.volume;\n\t\t}\n\t\t#end\n\n\t\treturn 1;\n\t}\n\n\tpublic function load(buffer:AudioBuffer):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.load();\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function pause(buffer:AudioBuffer):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.pause();\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function play(buffer:AudioBuffer):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.play();\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setAutoplay(buffer:AudioBuffer, value:Bool):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.autoplay = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setCurrentTime(buffer:AudioBuffer, value:Float):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.currentTime = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setDefaultPlaybackRate(buffer:AudioBuffer, value:Float):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.defaultPlaybackRate = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setLoop(buffer:AudioBuffer, value:Bool):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.loop = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setMuted(buffer:AudioBuffer, value:Bool):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.muted = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setPlaybackRate(buffer:AudioBuffer, value:Float):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.playbackRate = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setPreload(buffer:AudioBuffer, value:String):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.preload = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setSrc(buffer:AudioBuffer, value:String):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.src = value;\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function setVolume(buffer:AudioBuffer, value:Float):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (buffer.__srcAudio != null)\n\t\t{\n\t\t\tbuffer.__srcAudio.volume = value;\n\t\t}\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/OpenALAudioContext.hx",
    "content": "package lime.media;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.media.openal.AL;\nimport lime.media.openal.ALBuffer;\nimport lime.media.openal.ALC;\nimport lime.media.openal.ALContext;\nimport lime.media.openal.ALDevice;\nimport lime.media.openal.ALSource;\nimport lime.utils.ArrayBufferView;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass OpenALAudioContext\n{\n\tpublic var NONE:Int = 0;\n\tpublic var FALSE:Int = 0;\n\tpublic var TRUE:Int = 1;\n\tpublic var SOURCE_RELATIVE:Int = 0x202;\n\tpublic var CONE_INNER_ANGLE:Int = 0x1001;\n\tpublic var CONE_OUTER_ANGLE:Int = 0x1002;\n\tpublic var PITCH:Int = 0x1003;\n\tpublic var POSITION:Int = 0x1004;\n\tpublic var DIRECTION:Int = 0x1005;\n\tpublic var VELOCITY:Int = 0x1006;\n\tpublic var LOOPING:Int = 0x1007;\n\tpublic var BUFFER:Int = 0x1009;\n\tpublic var GAIN:Int = 0x100A;\n\tpublic var MIN_GAIN:Int = 0x100D;\n\tpublic var MAX_GAIN:Int = 0x100E;\n\tpublic var ORIENTATION:Int = 0x100F;\n\tpublic var SOURCE_STATE:Int = 0x1010;\n\tpublic var INITIAL:Int = 0x1011;\n\tpublic var PLAYING:Int = 0x1012;\n\tpublic var PAUSED:Int = 0x1013;\n\tpublic var STOPPED:Int = 0x1014;\n\tpublic var BUFFERS_QUEUED:Int = 0x1015;\n\tpublic var BUFFERS_PROCESSED:Int = 0x1016;\n\tpublic var REFERENCE_DISTANCE:Int = 0x1020;\n\tpublic var ROLLOFF_FACTOR:Int = 0x1021;\n\tpublic var CONE_OUTER_GAIN:Int = 0x1022;\n\tpublic var MAX_DISTANCE:Int = 0x1023;\n\tpublic var SEC_OFFSET:Int = 0x1024;\n\tpublic var SAMPLE_OFFSET:Int = 0x1025;\n\tpublic var BYTE_OFFSET:Int = 0x1026;\n\tpublic var SOURCE_TYPE:Int = 0x1027;\n\tpublic var STATIC:Int = 0x1028;\n\tpublic var STREAMING:Int = 0x1029;\n\tpublic var UNDETERMINED:Int = 0x1030;\n\tpublic var FORMAT_MONO8:Int = 0x1100;\n\tpublic var FORMAT_MONO16:Int = 0x1101;\n\tpublic var FORMAT_STEREO8:Int = 0x1102;\n\tpublic var FORMAT_STEREO16:Int = 0x1103;\n\tpublic var FREQUENCY:Int = 0x2001;\n\tpublic var BITS:Int = 0x2002;\n\tpublic var CHANNELS:Int = 0x2003;\n\tpublic var SIZE:Int = 0x2004;\n\tpublic var NO_ERROR:Int = 0;\n\tpublic var INVALID_NAME:Int = 0xA001;\n\tpublic var INVALID_ENUM:Int = 0xA002;\n\tpublic var INVALID_VALUE:Int = 0xA003;\n\tpublic var INVALID_OPERATION:Int = 0xA004;\n\tpublic var OUT_OF_MEMORY:Int = 0xA005;\n\tpublic var VENDOR:Int = 0xB001;\n\tpublic var VERSION:Int = 0xB002;\n\tpublic var RENDERER:Int = 0xB003;\n\tpublic var EXTENSIONS:Int = 0xB004;\n\tpublic var DOPPLER_FACTOR:Int = 0xC000;\n\tpublic var SPEED_OF_SOUND:Int = 0xC003;\n\tpublic var DOPPLER_VELOCITY:Int = 0xC001;\n\tpublic var DISTANCE_MODEL:Int = 0xD000;\n\tpublic var INVERSE_DISTANCE:Int = 0xD001;\n\tpublic var INVERSE_DISTANCE_CLAMPED:Int = 0xD002;\n\tpublic var LINEAR_DISTANCE:Int = 0xD003;\n\tpublic var LINEAR_DISTANCE_CLAMPED:Int = 0xD004;\n\tpublic var EXPONENT_DISTANCE:Int = 0xD005;\n\tpublic var EXPONENT_DISTANCE_CLAMPED:Int = 0xD006;\n\tpublic var REFRESH:Int = 0x1008;\n\tpublic var SYNC:Int = 0x1009;\n\tpublic var MONO_SOURCES:Int = 0x1010;\n\tpublic var STEREO_SOURCES:Int = 0x1011;\n\tpublic var INVALID_DEVICE:Int = 0xA001;\n\tpublic var INVALID_CONTEXT:Int = 0xA002;\n\tpublic var ATTRIBUTES_SIZE:Int = 0x1002;\n\tpublic var ALL_ATTRIBUTES:Int = 0x1003;\n\tpublic var DEFAULT_DEVICE_SPECIFIER:Int = 0x1004;\n\tpublic var DEVICE_SPECIFIER:Int = 0x1005;\n\tpublic var ENUMERATE_ALL_EXT:Int = 1;\n\tpublic var DEFAULT_ALL_DEVICES_SPECIFIER:Int = 0x1012;\n\tpublic var ALL_DEVICES_SPECIFIER:Int = 0x1013;\n\n\t@:noCompletion private function new() {}\n\n\tpublic function bufferData(buffer:ALBuffer, format:Int, data:ArrayBufferView, size:Int, freq:Int):Void\n\t{\n\t\tAL.bufferData(buffer, format, data, size, freq);\n\t}\n\n\tpublic function buffer3f(buffer:ALBuffer, param:Int, value1:Float, value2:Float, value3:Float):Void\n\t{\n\t\tAL.buffer3f(buffer, param, value1, value2, value3);\n\t}\n\n\tpublic function buffer3i(buffer:ALBuffer, param:Int, value1:Int, value2:Int, value3:Int):Void\n\t{\n\t\tAL.buffer3i(buffer, param, value1, value2, value3);\n\t}\n\n\tpublic function bufferf(buffer:ALBuffer, param:Int, value:Float):Void\n\t{\n\t\tAL.bufferf(buffer, param, value);\n\t}\n\n\tpublic function bufferfv(buffer:ALBuffer, param:Int, values:Array<Float>):Void\n\t{\n\t\tAL.bufferfv(buffer, param, values);\n\t}\n\n\tpublic function bufferi(buffer:ALBuffer, param:Int, value:Int):Void\n\t{\n\t\tAL.bufferi(buffer, param, value);\n\t}\n\n\tpublic function bufferiv(buffer:ALBuffer, param:Int, values:Array<Int>):Void\n\t{\n\t\tAL.bufferiv(buffer, param, values);\n\t}\n\n\tpublic function closeDevice(device:ALDevice):Bool\n\t{\n\t\treturn ALC.closeDevice(device);\n\t}\n\n\tpublic function createContext(device:ALDevice, attrlist:Array<Int> = null):ALContext\n\t{\n\t\treturn ALC.createContext(device, attrlist);\n\t}\n\n\tpublic function createBuffer():ALBuffer\n\t{\n\t\treturn AL.createBuffer();\n\t}\n\n\tpublic function createSource():ALSource\n\t{\n\t\treturn AL.createSource();\n\t}\n\n\tpublic function deleteBuffer(buffer:ALBuffer):Void\n\t{\n\t\tAL.deleteBuffer(buffer);\n\t}\n\n\tpublic function deleteBuffers(buffers:Array<ALBuffer>):Void\n\t{\n\t\tAL.deleteBuffers(buffers);\n\t}\n\n\tpublic function deleteSource(source:ALSource):Void\n\t{\n\t\tAL.deleteSource(source);\n\t}\n\n\tpublic function deleteSources(sources:Array<ALSource>):Void\n\t{\n\t\tAL.deleteSources(sources);\n\t}\n\n\tpublic function destroyContext(context:ALContext):Void\n\t{\n\t\tif (context == null) return;\n\t\tALC.destroyContext(context);\n\t}\n\n\tpublic function disable(capability:Int):Void\n\t{\n\t\tAL.disable(capability);\n\t}\n\n\tpublic function distanceModel(distanceModel:Int):Void\n\t{\n\t\tAL.distanceModel(distanceModel);\n\t}\n\n\tpublic function dopplerFactor(value:Float):Void\n\t{\n\t\tAL.dopplerFactor(value);\n\t}\n\n\tpublic function dopplerVelocity(value:Float):Void\n\t{\n\t\tAL.dopplerVelocity(value);\n\t}\n\n\tpublic function enable(capability:Int):Void\n\t{\n\t\tAL.enable(capability);\n\t}\n\n\t@:deprecated public function genSource():ALSource\n\t{\n\t\treturn createSource();\n\t}\n\n\tpublic function genSources(n:Int):Array<ALSource>\n\t{\n\t\treturn AL.genSources(n);\n\t}\n\n\t@:deprecated public function genBuffer():ALBuffer\n\t{\n\t\treturn createBuffer();\n\t}\n\n\tpublic function genBuffers(n:Int):Array<ALBuffer>\n\t{\n\t\treturn AL.genBuffers(n);\n\t}\n\n\tpublic function getBoolean(param:Int):Bool\n\t{\n\t\treturn AL.getBoolean(param);\n\t}\n\n\tpublic function getBooleanv(param:Int, count:Int = 1):Array<Bool>\n\t{\n\t\treturn AL.getBooleanv(param, count);\n\t}\n\n\tpublic function getBuffer3f(buffer:ALBuffer, param:Int):Array<Float>\n\t{\n\t\treturn AL.getBuffer3f(buffer, param);\n\t}\n\n\tpublic function getBuffer3i(buffer:ALBuffer, param:Int):Array<Int>\n\t{\n\t\treturn AL.getBuffer3i(buffer, param);\n\t}\n\n\tpublic function getBufferf(buffer:ALBuffer, param:Int):Float\n\t{\n\t\treturn AL.getBufferf(buffer, param);\n\t}\n\n\tpublic function getBufferfv(buffer:ALBuffer, param:Int, count:Int = 1):Array<Float>\n\t{\n\t\treturn AL.getBufferfv(buffer, param, count);\n\t}\n\n\tpublic function getBufferi(buffer:ALBuffer, param:Int):Int\n\t{\n\t\treturn AL.getBufferi(buffer, param);\n\t}\n\n\tpublic function getBufferiv(buffer:ALBuffer, param:Int, count:Int = 1):Array<Int>\n\t{\n\t\treturn AL.getBufferiv(buffer, param, count);\n\t}\n\n\tpublic function getContextsDevice(context:ALContext):ALDevice\n\t{\n\t\tif (context == null) return null;\n\t\treturn ALC.getContextsDevice(context);\n\t}\n\n\tpublic function getCurrentContext():ALContext\n\t{\n\t\treturn ALC.getCurrentContext();\n\t}\n\n\tpublic function getDouble(param:Int):Float\n\t{\n\t\treturn AL.getDouble(param);\n\t}\n\n\tpublic function getDoublev(param:Int, count:Int = 1):Array<Float>\n\t{\n\t\treturn AL.getDoublev(param, count);\n\t}\n\n\tpublic function getEnumValue(ename:String):Int\n\t{\n\t\treturn AL.getEnumValue(ename);\n\t}\n\n\tpublic function getError(device:ALDevice = null):Int\n\t{\n\t\tif (device == null)\n\t\t{\n\t\t\treturn AL.getError();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ALC.getError(device);\n\t\t}\n\t}\n\n\tpublic function getErrorString(device:ALDevice = null):String\n\t{\n\t\tif (device == null)\n\t\t{\n\t\t\treturn AL.getErrorString();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ALC.getErrorString(device);\n\t\t}\n\t}\n\n\tpublic function getFloat(param:Int):Float\n\t{\n\t\treturn AL.getFloat(param);\n\t}\n\n\tpublic function getFloatv(param:Int, count:Int = 1):Array<Float>\n\t{\n\t\treturn AL.getFloatv(param, count);\n\t}\n\n\tpublic function getInteger(param:Int):Int\n\t{\n\t\treturn AL.getInteger(param);\n\t}\n\n\tpublic function getIntegerv(param:Int, count:Int = 1, device:ALDevice = null):Array<Int>\n\t{\n\t\tif (device == null)\n\t\t{\n\t\t\treturn AL.getIntegerv(param, count);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ALC.getIntegerv(device, param, count);\n\t\t}\n\t}\n\n\tpublic function getListener3f(param:Int):Array<Float>\n\t{\n\t\treturn AL.getListener3f(param);\n\t}\n\n\tpublic function getListener3i(param:Int):Array<Int>\n\t{\n\t\treturn AL.getListener3i(param);\n\t}\n\n\tpublic function getListenerf(param:Int):Float\n\t{\n\t\treturn AL.getListenerf(param);\n\t}\n\n\tpublic function getListenerfv(param:Int, count:Int = 1):Array<Float>\n\t{\n\t\treturn AL.getListenerfv(param, count);\n\t}\n\n\tpublic function getListeneri(param:Int):Int\n\t{\n\t\treturn AL.getListeneri(param);\n\t}\n\n\tpublic function getListeneriv(param:Int, count:Int = 1):Array<Int>\n\t{\n\t\treturn AL.getListeneriv(param, count);\n\t}\n\n\tpublic function getProcAddress(fname:String):Dynamic\n\t{\n\t\treturn AL.getProcAddress(fname);\n\t}\n\n\tpublic function getSource3f(source:ALSource, param:Int):Array<Float>\n\t{\n\t\treturn AL.getSource3f(source, param);\n\t}\n\n\tpublic function getSourcef(source:ALSource, param:Int):Float\n\t{\n\t\treturn AL.getSourcef(source, param);\n\t}\n\n\tpublic function getSource3i(source:ALSource, param:Int):Array<Int>\n\t{\n\t\treturn AL.getSource3i(source, param);\n\t}\n\n\tpublic function getSourcefv(source:ALSource, param:Int, count:Int = 1):Array<Float>\n\t{\n\t\treturn AL.getSourcefv(source, param);\n\t}\n\n\tpublic function getSourcei(source:ALSource, param:Int):Dynamic\n\t{\n\t\treturn AL.getSourcei(source, param);\n\t}\n\n\tpublic function getSourceiv(source:ALSource, param:Int, count:Int = 1):Array<Int>\n\t{\n\t\treturn AL.getSourceiv(source, param, count);\n\t}\n\n\tpublic function getString(param:Int, device:ALDevice = null):String\n\t{\n\t\tif (device == null)\n\t\t{\n\t\t\treturn AL.getString(param);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ALC.getString(device, param);\n\t\t}\n\t}\n\n\tpublic function isBuffer(buffer:ALBuffer):Bool\n\t{\n\t\treturn AL.isBuffer(buffer);\n\t}\n\n\tpublic function isEnabled(capability:Int):Bool\n\t{\n\t\treturn AL.isEnabled(capability);\n\t}\n\n\tpublic function isExtensionPresent(extname:String):Bool\n\t{\n\t\treturn AL.isExtensionPresent(extname);\n\t}\n\n\tpublic function isSource(source:ALSource):Bool\n\t{\n\t\treturn AL.isSource(source);\n\t}\n\n\tpublic function listener3f(param:Int, value1:Float, value2:Float, value3:Float):Void\n\t{\n\t\tAL.listener3f(param, value1, value2, value3);\n\t}\n\n\tpublic function listener3i(param:Int, value1:Int, value2:Int, value3:Int):Void\n\t{\n\t\tAL.listener3i(param, value1, value2, value3);\n\t}\n\n\tpublic function listenerf(param:Int, value:Float):Void\n\t{\n\t\tAL.listenerf(param, value);\n\t}\n\n\tpublic function listenerfv(param:Int, values:Array<Float>):Void\n\t{\n\t\tAL.listenerfv(param, values);\n\t}\n\n\tpublic function listeneri(param:Int, value:Int):Void\n\t{\n\t\tAL.listeneri(param, value);\n\t}\n\n\tpublic function listeneriv(param:Int, values:Array<Int>):Void\n\t{\n\t\tAL.listeneriv(param, values);\n\t}\n\n\tpublic function makeContextCurrent(context:ALContext):Bool\n\t{\n\t\treturn ALC.makeContextCurrent(context);\n\t}\n\n\tpublic function openDevice(deviceName:String = null):ALDevice\n\t{\n\t\treturn ALC.openDevice(deviceName);\n\t}\n\n\tpublic function pauseDevice(device:ALDevice):Void\n\t{\n\t\tALC.pauseDevice(device);\n\t}\n\n\tpublic function processContext(context:ALContext):Void\n\t{\n\t\tALC.processContext(context);\n\t}\n\n\tpublic function resumeDevice(device:ALDevice):Void\n\t{\n\t\tALC.resumeDevice(device);\n\t}\n\n\tpublic function source3f(source:ALSource, param:Int, value1:Float, value2:Float, value3:Float):Void\n\t{\n\t\tAL.source3f(source, param, value1, value2, value3);\n\t}\n\n\tpublic function source3i(source:ALSource, param:Int, value1:Int, value2:Int, value3:Int):Void\n\t{\n\t\tAL.source3i(source, param, value1, value2, value3);\n\t}\n\n\tpublic function sourcef(source:ALSource, param:Int, value:Float):Void\n\t{\n\t\tAL.sourcef(source, param, value);\n\t}\n\n\tpublic function sourcefv(source:ALSource, param:Int, values:Array<Float>):Void\n\t{\n\t\tAL.sourcefv(source, param, values);\n\t}\n\n\tpublic function sourcei(source:ALSource, param:Int, value:Dynamic):Void\n\t{\n\t\tAL.sourcei(source, param, value);\n\t}\n\n\tpublic function sourceiv(source:ALSource, param:Int, values:Array<Int>):Void\n\t{\n\t\tAL.sourceiv(source, param, values);\n\t}\n\n\tpublic function sourcePlay(source:ALSource):Void\n\t{\n\t\tAL.sourcePlay(source);\n\t}\n\n\tpublic function sourcePlayv(sources:Array<ALSource>):Void\n\t{\n\t\tAL.sourcePlayv(sources);\n\t}\n\n\tpublic function sourceStop(source:ALSource):Void\n\t{\n\t\tAL.sourceStop(source);\n\t}\n\n\tpublic function sourceStopv(sources:Array<ALSource>):Void\n\t{\n\t\tAL.sourceStopv(sources);\n\t}\n\n\tpublic function sourceRewind(source:ALSource):Void\n\t{\n\t\tAL.sourceRewind(source);\n\t}\n\n\tpublic function sourceRewindv(sources:Array<ALSource>):Void\n\t{\n\t\tAL.sourceRewindv(sources);\n\t}\n\n\tpublic function sourcePause(source:ALSource):Void\n\t{\n\t\tAL.sourcePause(source);\n\t}\n\n\tpublic function sourcePausev(sources:Array<ALSource>):Void\n\t{\n\t\tAL.sourcePausev(sources);\n\t}\n\n\tpublic function sourceQueueBuffer(source:ALSource, buffer:ALBuffer):Void\n\t{\n\t\tAL.sourceQueueBuffer(source, buffer);\n\t}\n\n\tpublic function sourceQueueBuffers(source:ALSource, nb:Int, buffers:Array<ALBuffer>):Void\n\t{\n\t\tAL.sourceQueueBuffers(source, nb, buffers);\n\t}\n\n\tpublic function sourceUnqueueBuffer(source:ALSource):ALBuffer\n\t{\n\t\treturn AL.sourceUnqueueBuffer(source);\n\t}\n\n\tpublic function sourceUnqueueBuffers(source:ALSource, nb:Int):Array<ALBuffer>\n\t{\n\t\treturn AL.sourceUnqueueBuffers(source, nb);\n\t}\n\n\tpublic function speedOfSound(value:Float):Void\n\t{\n\t\tAL.speedOfSound(value);\n\t}\n\n\tpublic function suspendContext(context:ALContext):Void\n\t{\n\t\tALC.suspendContext(context);\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/WebAudioContext.hx",
    "content": "package lime.media;\n\n#if (!lime_doc_gen || (js && html5))\n#if (!lime_doc_gen && (!js || !html5 || display))\nclass WebAudioContext\n{\n\tpublic var activeSourceCount(default, null):Int;\n\tpublic var currentTime(default, null):Float;\n\tpublic var destination(default, null):Dynamic /*AudioDestinationNode*/;\n\tpublic var listener(default, null):Dynamic /*AudioListener*/;\n\tpublic var oncomplete:Dynamic /*js.html.EventListener*/;\n\tpublic var sampleRate(default, null):Float;\n\n\tpublic function new() {}\n\n\t#if (haxe_ver >= 4.2)\n\tpublic function resume():Dynamic /*Promise<Void>*/\n\t{\n\t\treturn null;\n\t}\n\t#end\n\n\tpublic function createAnalyser():Dynamic /*AnalyserNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createBiquadFilter():Dynamic /*BiquadFilterNode*/\n\t{\n\t\treturn null;\n\t}\n\n\t@:overload(function(numberOfChannels:Int, numberOfFrames:Int, sampleRate:Float):Dynamic /*AudioBuffer*/ {})\n\tpublic function createBuffer(buffer:Dynamic /*js.html.ArrayBuffer*/, mixToMono:Bool):Dynamic /*AudioBuffer*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createBufferSource():Dynamic /*AudioBufferSourceNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createChannelMerger(?numberOfInputs:Int):Dynamic /*ChannelMergerNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createChannelSplitter(?numberOfOutputs:Int):Dynamic /*ChannelSplitterNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createConvolver():Dynamic /*ConvolverNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createDelay(?maxDelayTime:Float):Dynamic /*DelayNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createDynamicsCompressor():Dynamic /*DynamicsCompressorNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createGain():Dynamic /*GainNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createMediaElementSource(mediaElement:Dynamic /*js.html.MediaElement*/):Dynamic /*MediaElementAudioSourceNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createMediaStreamSource(mediaStream:Dynamic /*js.html.rtc.MediaStream*/):Dynamic /*MediaStreamAudioSourceNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createOscillator():Dynamic /*OscillatorNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createPanner():Dynamic /*PannerNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createScriptProcessor(bufferSize:Int, ?numberOfInputChannels:Int, ?numberOfOutputChannels:Int):Dynamic /*ScriptProcessorNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createWaveShaper():Dynamic /*WaveShaperNode*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function createWaveTable(real:Dynamic /*js.html.Float32Array*/, imag:Dynamic /*js.html.Float32Array*/):Dynamic /*WaveTable*/\n\t{\n\t\treturn null;\n\t}\n\n\tpublic function decodeAudioData(audioData:Dynamic /*js.html.ArrayBuffer*/, successCallback:Dynamic /*AudioBufferCallback*/,\n\t\t?errorCallback:Dynamic /*AudioBufferCallback*/):Void {}\n\n\tpublic function startRendering():Void {}\n}\n#else\ntypedef WebAudioContext = js.html.audio.AudioContext;\n#end\n#end\n"
  },
  {
    "path": "src/lime/media/howlerjs/Howl.hx",
    "content": "package lime.media.howlerjs;\n\n#if (!lime_doc_gen || lime_howlerjs)\n#if (!lime_howlerjs || display)\nimport haxe.Constraints.Function;\nclass Howl\n{\n\tpublic function new(options:HowlOptions) {}\n\n\t/**\n\t * Get the duration of this sound. Passing a sound id will return the sprite duration.\n\t * @param\tid\t\tThe sound id to check. If none is passed, return full source duration.\n\t * @return\tAudio duration in seconds.\n\t */\n\tpublic function duration(?id:Int):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Fade a currently playing sound between two volumes (if no id is passsed, all sounds will fade).\n\t * @param\tfrom\t\tThe value to fade from (0.0 to 1.0).\n\t * @param\tto\t\tThe volume to fade to (0.0 to 1.0).\n\t * @param\tlen\t\tTime in milliseconds to fade.\n\t * @param\tid\t\tThe sound id (omit to fade all sounds).\n\t * @return\n\t */\n\tpublic function fade(from:Float, to:Float, len:Int, ?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Load the audio file.\n\t * @return\n\t */\n\tpublic function load():Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n\t * \tloop() -> Returns the group's loop value.\n\t * \tloop(id) -> Returns the sound id's loop value.\n\t * \tloop(loop) -> Sets the loop value for all sounds in this Howl group.\n\t * \tloop(loop, id) -> Sets the loop value of passed sound id.\n\t * @return\tReturns self or current loop value.\n\t */\n\tpublic function loop(?loop:Dynamic, ?id:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Mute/unmute a single sound or all sounds in this Howl group.\n\t * @param\tmuted\t\tSet to true to mute and false to unmute.\n\t * @param\tid\t\tThe sound ID to update (omit to mute/unmute all).\n\t * @return\n\t */\n\tpublic function mute(muted:Bool, ?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove a custom event. Call without parameters to remove all events.\n\t * @param\tevent\t\tEvent name.\n\t * @param\tfn\t\tListener to remove. Leave empty to remove all.\n\t * @param\tid\t\t(optional) Only remove events for this sound.\n\t * @return\n\t */\n\tpublic function off(event:String, fn:Function, ?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Listen to a custom event.\n\t * @param\tevent\t\tEvent name.\n\t * @param\tfn\t\tListener to call.\n\t * @param\tid\t\t(optional) Only listen to events for this sound.\n\t * @return\n\t */\n\tpublic function on(event:String, fn:Function, ?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Listen to a custom event and remove it once fired.\n\t * @param\tevent\t\tEvent name.\n\t * @param\tfn\t\tListener to call.\n\t * @param\tid\t\t(optional) Only listen to events for this sound.\n\t * @return\n\t */\n\tpublic function once(event:String, fn:Function, ?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pause playback and save current position.\n\t * @param\tid\t\tThe sound ID (empty to pause all in group).\n\t * @return\n\t */\n\tpublic function pause(?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Play a sound or resume previous playback.\n\t * @param\tsprite\t\tSprite name for sprite playback or sound id to continue previous.\n\t * @return\tSound ID.\n\t */\n\tpublic function play(?sprite:Dynamic):Int\n\t{\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n\t * @param\tid\t\tThe sound id to check. If none is passed, the whole sound group is checked.\n\t * @return\tTrue if playing and false if not.\n\t */\n\tpublic function playing(?id:Int):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get/set the playback rate of a sound. This method can optionally take 0, 1 or 2 arguments.\n\t * \trate() -> Returns the first sound node's current playback rate.\n\t * \trate(id) -> Returns the sound id's current playback rate.\n\t * \trate(rate) -> Sets the playback rate of all sounds in this Howl group.\n\t * \trate(rate, id) -> Sets the playback rate of passed sound id.\n\t * @return\tReturns self or the current playback rate.\n\t */\n\tpublic function rate(?rate:Float, ?id:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get/set the seek position of a sound (in seconds). This method can optionally take 0, 1 or 2 arguments.\n\t * \tseek() -> Returns the first sound node's current seek position.\n\t * \tseek(id) -> Returns the sound id's current seek position.\n\t * \tseek(seek) -> Sets the seek position of the first sound node.\n\t * \tseek(seek, id) -> Sets the seek position of passed sound id.\n\t * @return\tReturns self or the current seek position.\n\t */\n\tpublic function seek(?seek:Float, ?id:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the current loaded state of this Howl.\n\t * @return\t'unloaded', 'loading', 'loaded'\n\t */\n\tpublic function state():String\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Stop playback and reset to start.\n\t * @param\tid\t\tThe sound ID (empty to stop all in group).\n\t * @return\n\t */\n\tpublic function stop(?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unload and destroy the current Howl object.\n\t * This will immediately stop all sound instances attached to this group.\n\t */\n\tpublic function unload():Void {}\n\n\t/**\n\t * Get/set the volume of this sound or of the Howl group. This method can optionally take 0, 1 or 2 arguments.\n\t * \tvolume() -> Returns the group's volume value.\n\t * \tvolume(id) -> Returns the sound id's current volume.\n\t * \tvolume(vol) -> Sets the volume of all sounds in this Howl group.\n\t * \tvolume(vol, id) -> Sets the volume of passed sound id.\n\t * @return\tReturns self or current volume.\n\t */\n\tpublic function volume(?vol:Float, ?id:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get/set the 3D spatial position of the audio source for this sound or group relative to the global listener.\n\t * @param  x  The x-position of the audio source.\n\t * @param  y  The y-position of the audio source.\n\t * @param  z  The z-position of the audio source.\n\t * @param  id The sound ID. If none is passed, all in group will be updated.\n\t * @return Returns self or the current 3D spatial position: [x, y, z].\n\t */\n\tpublic function pos(?x:Float, ?y:Float, ?z:Float, ?id:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get/set the stereo panning of the audio source for this sound or all in the group.\n\t * @param  pan  A value of -1.0 is all the way left and 1.0 is all the way right.\n\t * @param  id (optional) The sound ID. If none is passed, all in group will be updated.\n\t * @return Returns self or the current stereo panning value.\n\t */\n\tpublic function stereo(?pan:Float, ?id:Int):Dynamic\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get/set the panner node's attributes for a sound or group of sounds. This method can optionally take 0, 1 or 2 arguments.\n\t *   pannerAttr() -> Returns the group's values.\n\t *   pannerAttr(id) -> Returns the sound id's values.\n\t *   pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n\t *   pannerAttr(o, id) -> Set's the values of passed sound id.\n\t *\n\t *   Attributes:\n\t *     coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n\t *                      inside of which there will be no volume reduction.\n\t *     coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n\t *                      outside of which the volume will be reduced to a constant value of coneOuterGain.\n\t *     coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n\t *                     coneOuterAngle. It is a linear value in the range [0, 1].\n\t *     distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n\t *                     listener. Can be linear, inverse or `exponential.\n\t *     maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n\t *                   will not be reduced any further.\n\t *     refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n\t *                   This is simply a variable of the distance model and has a different effect depending on which model\n\t *                   is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n\t *     rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n\t *                     variable of the distance model and can be in the range of [0, 1] with linear and [0, ∞]\n\t *                     with inverse and exponential.\n\t *     panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n\t *                     Can be HRTF or equalpower.\n\t *\n\t * @return Returns self or current panner attributes.\n\t */\n\tpublic function pannerAttr(args:PannerAttr, ?id:Int):Howl\n\t{\n\t\treturn this;\n\t}\n}\n#else\nimport haxe.Constraints.Function;\nimport haxe.extern.EitherType;\n\n#if commonjs\n@:jsRequire(\"howler\", \"Howl\")\n#else\n@:native(\"Howl\")\n#end\nextern class Howl\n{\n\tpublic function new(options:HowlOptions);\n\tpublic function duration(?id:Int):Int;\n\tpublic function fade(from:Float, to:Float, len:Int, ?id:Int):Howl;\n\tpublic function load():Howl;\n\t@:overload(function(id:Int):Bool {})\n\t@:overload(function(loop:Bool):Howl {})\n\t@:overload(function(loop:Bool, id:Int):Howl {})\n\tpublic function loop():Bool;\n\tpublic function mute(muted:Bool, ?id:Int):Howl;\n\tpublic function off(event:String, fn:Function, ?id:Int):Howl;\n\tpublic function on(event:String, fn:Function, ?id:Int):Howl;\n\tpublic function once(event:String, fn:Function, ?id:Int):Howl;\n\tpublic function pause(?id:Int):Howl;\n\t@:overload(function(id:Int):Int {})\n\tpublic function play(?sprite:String):Int;\n\tpublic function playing(?id:Int):Bool;\n\t@:overload(function(id:Int):Float {})\n\t@:overload(function(rate:Float):Howl {})\n\t@:overload(function(rate:Float, id:Int):Howl {})\n\tpublic function rate():Float;\n\tpublic function state():String;\n\t@:overload(function(id:Int):Float {})\n\t@:overload(function(seek:Float):Howl {})\n\t@:overload(function(seek:Float, id:Int):Howl {})\n\tpublic function seek():Float;\n\tpublic function stop(?id:Int):Howl;\n\tpublic function unload():Void;\n\t@:overload(function(id:Int):Float {})\n\t@:overload(function(vol:Float):Howl {})\n\t@:overload(function(vol:Float, id:Int):Howl {})\n\tpublic function volume():Float;\n\t@:overload(function(pan:Float):Howl {})\n\t@:overload(function(pan:Float, id:Int):Howl {})\n\tpublic function stereo():Float;\n\t@:overload(function(x:Float):Howl {})\n\t@:overload(function(x:Float, y:Float):Howl {})\n\t@:overload(function(x:Float, y:Float, z:Float):Howl {})\n\t@:overload(function(x:Float, y:Float, z:Float, id:Int):Howl {})\n\tpublic function pos():Array<Float>;\n\tpublic function pannerAttr(args:PannerAttr, ?id:Int):Howl;\n}\n#end\n\ntypedef HowlOptions =\n{\n\tsrc:Array<String>,\n\t?volume:Float,\n\t?html5:Bool,\n\t?loop:Bool,\n\t?preload:Bool,\n\t?autoplay:Bool,\n\t?mute:Bool,\n\t?sprite:Dynamic,\n\t?rate:Float,\n\t?pool:Float,\n\t?format:Array<String>,\n\t?onload:Function,\n\t?onloaderror:Function,\n\t?onplay:Function,\n\t?onend:Function,\n\t?onpause:Function,\n\t?onstop:Function,\n\t?onmute:Function,\n\t?onvolume:Function,\n\t?onrate:Function,\n\t?onseek:Function,\n\t?onfade:Function\n}\n\ntypedef PannerAttr =\n{\n\t?coneInnerAngle:Float,\n\t?coneOuterAngle:Float,\n\t?coneOuterGain:Float,\n\t?distanceModel:String,\n\t?maxDistance:Float,\n\t?refDistance:Float,\n\t?rolloffFactor:Float,\n\t?panningModel:String\n}\n#end\n"
  },
  {
    "path": "src/lime/media/howlerjs/Howler.hx",
    "content": "package lime.media.howlerjs;\n\n#if (!lime_doc_gen || lime_howlerjs)\n#if (!lime_howlerjs || display)\nclass Howler\n{\n\tpublic static var autoSuspend:Bool;\n\tpublic static var ctx:WebAudioContext;\n\tpublic static var masterGain:Dynamic;\n\tpublic static var mobileAutoEnable:Bool;\n\tpublic static var noAudio:Bool;\n\tpublic static var usingWebAudio:Bool;\n\n\t/**\n\t * Check for codec support of specific extension.\n\t * @param\text\t\tAudio file extention.\n\t * @return\n\t */\n\tpublic static function codecs(ext:String):Bool\n\t{\n\t\treturn false;\n\t}\n\n\t/**\n\t * Handle muting and unmuting globally.\n\t * @param\tmuted\t\tIs muted or not.\n\t */\n\tpublic static function mute(muted:Bool):Class<Howler>\n\t{\n\t\treturn Howler;\n\t}\n\n\t/**\n\t * Unload and destroy all currently loaded Howl objects.\n\t * @return\n\t */\n\tpublic static function unload():Class<Howler>\n\t{\n\t\treturn Howler;\n\t}\n\n\t/**\n\t * Get/set the global volume for all sounds.\n\t * @param\tvol\t\tVolume from 0.0 to 1.0.\n\t * @return\tReturns self or current volume.\n\t */\n\tpublic static function volume(?vol:Float):Dynamic\n\t{\n\t\tif (vol != null) return Howler;\n\t\treturn vol;\n\t}\n}\n#else\nimport haxe.extern.EitherType;\nimport js.html.audio.GainNode;\nimport lime.media.WebAudioContext;\n\n#if commonjs\n@:jsRequire(\"howler\")\n#else\n@:native(\"Howler\")\n#end\nextern class Howler\n{\n\tpublic static var autoSuspend:Bool;\n\tpublic static var ctx:WebAudioContext;\n\tpublic static var masterGain:GainNode;\n\tpublic static var mobileAutoEnable:Bool;\n\tpublic static var noAudio:Bool;\n\tpublic static var usingWebAudio:Bool;\n\tpublic static function codecs(ext:String):Bool;\n\tpublic static function mute(muted:Bool):Howler;\n\tpublic static function unload():Howler;\n\tpublic static function volume(?vol:Float):EitherType<Int, Howler>;\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/media/openal/AL.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\nimport lime.utils.ArrayBufferView;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass AL\n{\n\tpublic static inline var NONE:Int = 0;\n\tpublic static inline var FALSE:Int = 0;\n\tpublic static inline var TRUE:Int = 1;\n\tpublic static inline var SOURCE_RELATIVE:Int = 0x202;\n\tpublic static inline var CONE_INNER_ANGLE:Int = 0x1001;\n\tpublic static inline var CONE_OUTER_ANGLE:Int = 0x1002;\n\tpublic static inline var PITCH:Int = 0x1003;\n\tpublic static inline var POSITION:Int = 0x1004;\n\tpublic static inline var DIRECTION:Int = 0x1005;\n\tpublic static inline var VELOCITY:Int = 0x1006;\n\tpublic static inline var LOOPING:Int = 0x1007;\n\tpublic static inline var BUFFER:Int = 0x1009;\n\tpublic static inline var GAIN:Int = 0x100A;\n\tpublic static inline var MIN_GAIN:Int = 0x100D;\n\tpublic static inline var MAX_GAIN:Int = 0x100E;\n\tpublic static inline var ORIENTATION:Int = 0x100F;\n\tpublic static inline var SOURCE_STATE:Int = 0x1010;\n\tpublic static inline var INITIAL:Int = 0x1011;\n\tpublic static inline var PLAYING:Int = 0x1012;\n\tpublic static inline var PAUSED:Int = 0x1013;\n\tpublic static inline var STOPPED:Int = 0x1014;\n\tpublic static inline var BUFFERS_QUEUED:Int = 0x1015;\n\tpublic static inline var BUFFERS_PROCESSED:Int = 0x1016;\n\tpublic static inline var REFERENCE_DISTANCE:Int = 0x1020;\n\tpublic static inline var ROLLOFF_FACTOR:Int = 0x1021;\n\tpublic static inline var CONE_OUTER_GAIN:Int = 0x1022;\n\tpublic static inline var MAX_DISTANCE:Int = 0x1023;\n\tpublic static inline var SEC_OFFSET:Int = 0x1024;\n\tpublic static inline var SAMPLE_OFFSET:Int = 0x1025;\n\tpublic static inline var BYTE_OFFSET:Int = 0x1026;\n\tpublic static inline var SOURCE_TYPE:Int = 0x1027;\n\tpublic static inline var STATIC:Int = 0x1028;\n\tpublic static inline var STREAMING:Int = 0x1029;\n\tpublic static inline var UNDETERMINED:Int = 0x1030;\n\tpublic static inline var FORMAT_MONO8:Int = 0x1100;\n\tpublic static inline var FORMAT_MONO16:Int = 0x1101;\n\tpublic static inline var FORMAT_STEREO8:Int = 0x1102;\n\tpublic static inline var FORMAT_STEREO16:Int = 0x1103;\n\tpublic static inline var FREQUENCY:Int = 0x2001;\n\tpublic static inline var BITS:Int = 0x2002;\n\tpublic static inline var CHANNELS:Int = 0x2003;\n\tpublic static inline var SIZE:Int = 0x2004;\n\tpublic static inline var NO_ERROR:Int = 0;\n\tpublic static inline var INVALID_NAME:Int = 0xA001;\n\tpublic static inline var INVALID_ENUM:Int = 0xA002;\n\tpublic static inline var INVALID_VALUE:Int = 0xA003;\n\tpublic static inline var INVALID_OPERATION:Int = 0xA004;\n\tpublic static inline var OUT_OF_MEMORY:Int = 0xA005;\n\tpublic static inline var VENDOR:Int = 0xB001;\n\tpublic static inline var VERSION:Int = 0xB002;\n\tpublic static inline var RENDERER:Int = 0xB003;\n\tpublic static inline var EXTENSIONS:Int = 0xB004;\n\tpublic static inline var DOPPLER_FACTOR:Int = 0xC000;\n\tpublic static inline var SPEED_OF_SOUND:Int = 0xC003;\n\tpublic static inline var DOPPLER_VELOCITY:Int = 0xC001;\n\tpublic static inline var DISTANCE_MODEL:Int = 0xD000;\n\tpublic static inline var INVERSE_DISTANCE:Int = 0xD001;\n\tpublic static inline var INVERSE_DISTANCE_CLAMPED:Int = 0xD002;\n\tpublic static inline var LINEAR_DISTANCE:Int = 0xD003;\n\tpublic static inline var LINEAR_DISTANCE_CLAMPED:Int = 0xD004;\n\tpublic static inline var EXPONENT_DISTANCE:Int = 0xD005;\n\tpublic static inline var EXPONENT_DISTANCE_CLAMPED:Int = 0xD006;\n\t/* Listener properties. */\n\tpublic static inline var METERS_PER_UNIT:Int = 0x20004;\n\t/* Source properties. */\n\tpublic static inline var DIRECT_FILTER:Int = 0x20005;\n\tpublic static inline var AUXILIARY_SEND_FILTER:Int = 0x20006;\n\tpublic static inline var AIR_ABSORPTION_FACTOR:Int = 0x20007;\n\tpublic static inline var ROOM_ROLLOFF_FACTOR:Int = 0x20008;\n\tpublic static inline var CONE_OUTER_GAINHF:Int = 0x20009;\n\tpublic static inline var DIRECT_FILTER_GAINHF_AUTO:Int = 0x2000A;\n\tpublic static inline var AUXILIARY_SEND_FILTER_GAIN_AUTO:Int = 0x2000B;\n\tpublic static inline var AUXILIARY_SEND_FILTER_GAINHF_AUTO:Int = 0x2000C;\n\t/* Effect properties. */\n\t/* Reverb effect parameters */\n\tpublic static inline var REVERB_DENSITY:Int = 0x0001;\n\tpublic static inline var REVERB_DIFFUSION:Int = 0x0002;\n\tpublic static inline var REVERB_GAIN:Int = 0x0003;\n\tpublic static inline var REVERB_GAINHF:Int = 0x0004;\n\tpublic static inline var REVERB_DECAY_TIME:Int = 0x0005;\n\tpublic static inline var REVERB_DECAY_HFRATIO:Int = 0x0006;\n\tpublic static inline var REVERB_REFLECTIONS_GAIN:Int = 0x0007;\n\tpublic static inline var REVERB_REFLECTIONS_DELAY:Int = 0x0008;\n\tpublic static inline var REVERB_LATE_REVERB_GAIN:Int = 0x0009;\n\tpublic static inline var REVERB_LATE_REVERB_DELAY:Int = 0x000A;\n\tpublic static inline var REVERB_AIR_ABSORPTION_GAINHF:Int = 0x000B;\n\tpublic static inline var REVERB_ROOM_ROLLOFF_FACTOR:Int = 0x000C;\n\tpublic static inline var REVERB_DECAY_HFLIMIT:Int = 0x000D;\n\t/* EAX Reverb effect parameters */ // Windows only... ?\n\tpublic static inline var EAXREVERB_DENSITY:Int = 0x0001;\n\tpublic static inline var EAXREVERB_DIFFUSION:Int = 0x0002;\n\tpublic static inline var EAXREVERB_GAIN:Int = 0x0003;\n\tpublic static inline var EAXREVERB_GAINHF:Int = 0x0004;\n\tpublic static inline var EAXREVERB_GAINLF:Int = 0x0005;\n\tpublic static inline var EAXREVERB_DECAY_TIME:Int = 0x0006;\n\tpublic static inline var EAXREVERB_DECAY_HFRATIO:Int = 0x0007;\n\tpublic static inline var EAXREVERB_DECAY_LFRATIO:Int = 0x0008;\n\tpublic static inline var EAXREVERB_REFLECTIONS_GAIN:Int = 0x0009;\n\tpublic static inline var EAXREVERB_REFLECTIONS_DELAY:Int = 0x000A;\n\tpublic static inline var EAXREVERB_REFLECTIONS_PAN:Int = 0x000B;\n\tpublic static inline var EAXREVERB_LATE_REVERB_GAIN:Int = 0x000C;\n\tpublic static inline var EAXREVERB_LATE_REVERB_DELAY:Int = 0x000D;\n\tpublic static inline var EAXREVERB_LATE_REVERB_PAN:Int = 0x000E;\n\tpublic static inline var EAXREVERB_ECHO_TIME:Int = 0x000F;\n\tpublic static inline var EAXREVERB_ECHO_DEPTH:Int = 0x0010;\n\tpublic static inline var EAXREVERB_MODULATION_TIME:Int = 0x0011;\n\tpublic static inline var EAXREVERB_MODULATION_DEPTH:Int = 0x0012;\n\tpublic static inline var EAXREVERB_AIR_ABSORPTION_GAINHF:Int = 0x0013;\n\tpublic static inline var EAXREVERB_HFREFERENCE:Int = 0x0014;\n\tpublic static inline var EAXREVERB_LFREFERENCE:Int = 0x0015;\n\tpublic static inline var EAXREVERB_ROOM_ROLLOFF_FACTOR:Int = 0x0016;\n\tpublic static inline var EAXREVERB_DECAY_HFLIMIT:Int = 0x0017;\n\t/* Chorus effect parameters */\n\tpublic static inline var CHORUS_WAVEFORM:Int = 0x0001;\n\tpublic static inline var CHORUS_PHASE:Int = 0x0002;\n\tpublic static inline var CHORUS_RATE:Int = 0x0003;\n\tpublic static inline var CHORUS_DEPTH:Int = 0x0004;\n\tpublic static inline var CHORUS_FEEDBACK:Int = 0x0005;\n\tpublic static inline var CHORUS_DELAY:Int = 0x0006;\n\t/* Distortion effect parameters */\n\tpublic static inline var DISTORTION_EDGE:Int = 0x0001;\n\tpublic static inline var DISTORTION_GAIN:Int = 0x0002;\n\tpublic static inline var DISTORTION_LOWPASS_CUTOFF:Int = 0x0003;\n\tpublic static inline var DISTORTION_EQCENTER:Int = 0x0004;\n\tpublic static inline var DISTORTION_EQBANDWIDTH:Int = 0x0005;\n\t/* Echo effect parameters */\n\tpublic static inline var ECHO_DELAY:Int = 0x0001;\n\tpublic static inline var ECHO_LRDELAY:Int = 0x0002;\n\tpublic static inline var ECHO_DAMPING:Int = 0x0003;\n\tpublic static inline var ECHO_FEEDBACK:Int = 0x0004;\n\tpublic static inline var ECHO_SPREAD:Int = 0x0005;\n\t/* Flanger effect parameters */\n\tpublic static inline var FLANGER_WAVEFORM:Int = 0x0001;\n\tpublic static inline var FLANGER_PHASE:Int = 0x0002;\n\tpublic static inline var FLANGER_RATE:Int = 0x0003;\n\tpublic static inline var FLANGER_DEPTH:Int = 0x0004;\n\tpublic static inline var FLANGER_FEEDBACK:Int = 0x0005;\n\tpublic static inline var FLANGER_DELAY:Int = 0x0006;\n\t/* Frequency shifter effect parameters */\n\tpublic static inline var FREQUENCY_SHIFTER_FREQUENCY:Int = 0x0001;\n\tpublic static inline var FREQUENCY_SHIFTER_LEFT_DIRECTION:Int = 0x0002;\n\tpublic static inline var FREQUENCY_SHIFTER_RIGHT_DIRECTION:Int = 0x0003;\n\t/* Vocal morpher effect parameters */\n\tpublic static inline var VOCAL_MORPHER_PHONEMEA:Int = 0x0001;\n\tpublic static inline var VOCAL_MORPHER_PHONEMEA_COARSE_TUNING:Int = 0x0002;\n\tpublic static inline var VOCAL_MORPHER_PHONEMEB:Int = 0x0003;\n\tpublic static inline var VOCAL_MORPHER_PHONEMEB_COARSE_TUNING:Int = 0x0004;\n\tpublic static inline var VOCAL_MORPHER_WAVEFORM:Int = 0x0005;\n\tpublic static inline var VOCAL_MORPHER_RATE:Int = 0x0006;\n\t/* Pitchshifter effect parameters */\n\tpublic static inline var PITCH_SHIFTER_COARSE_TUNE:Int = 0x0001;\n\tpublic static inline var PITCH_SHIFTER_FINE_TUNE:Int = 0x0002;\n\t/* Ringmodulator effect parameters */\n\tpublic static inline var RING_MODULATOR_FREQUENCY:Int = 0x0001;\n\tpublic static inline var RING_MODULATOR_HIGHPASS_CUTOFF:Int = 0x0002;\n\tpublic static inline var RING_MODULATOR_WAVEFORM:Int = 0x0003;\n\t/* Autowah effect parameters */\n\tpublic static inline var AUTOWAH_ATTACK_TIME:Int = 0x0001;\n\tpublic static inline var AUTOWAH_RELEASE_TIME:Int = 0x0002;\n\tpublic static inline var AUTOWAH_RESONANCE:Int = 0x0003;\n\tpublic static inline var AUTOWAH_PEAK_GAIN:Int = 0x0004;\n\t/* Compressor effect parameters */\n\tpublic static inline var COMPRESSOR_ONOFF:Int = 0x0001;\n\t/* Equalizer effect parameters */\n\tpublic static inline var EQUALIZER_LOW_GAIN:Int = 0x0001;\n\tpublic static inline var EQUALIZER_LOW_CUTOFF:Int = 0x0002;\n\tpublic static inline var EQUALIZER_MID1_GAIN:Int = 0x0003;\n\tpublic static inline var EQUALIZER_MID1_CENTER:Int = 0x0004;\n\tpublic static inline var EQUALIZER_MID1_WIDTH:Int = 0x0005;\n\tpublic static inline var EQUALIZER_MID2_GAIN:Int = 0x0006;\n\tpublic static inline var EQUALIZER_MID2_CENTER:Int = 0x0007;\n\tpublic static inline var EQUALIZER_MID2_WIDTH:Int = 0x0008;\n\tpublic static inline var EQUALIZER_HIGH_GAIN:Int = 0x0009;\n\tpublic static inline var EQUALIZER_HIGH_CUTOFF:Int = 0x000A;\n\t/* Effect type */\n\tpublic static inline var EFFECT_FIRST_PARAMETER:Int = 0x0000;\n\tpublic static inline var EFFECT_LAST_PARAMETER:Int = 0x8000;\n\tpublic static inline var EFFECT_TYPE:Int = 0x8001;\n\t/* Effect types, used with the AL_EFFECT_TYPE property */\n\tpublic static inline var EFFECT_NULL:Int = 0x0000;\n\tpublic static inline var EFFECT_EAXREVERB:Int = 0x8000;\n\tpublic static inline var EFFECT_REVERB:Int = 0x0001;\n\tpublic static inline var EFFECT_CHORUS:Int = 0x0002;\n\tpublic static inline var EFFECT_DISTORTION:Int = 0x0003;\n\tpublic static inline var EFFECT_ECHO:Int = 0x0004;\n\tpublic static inline var EFFECT_FLANGER:Int = 0x0005;\n\tpublic static inline var EFFECT_FREQUENCY_SHIFTER:Int = 0x0006;\n\tpublic static inline var EFFECT_VOCAL_MORPHER:Int = 0x0007;\n\tpublic static inline var EFFECT_PITCH_SHIFTER:Int = 0x0008;\n\tpublic static inline var EFFECT_RING_MODULATOR:Int = 0x0009;\n\tpublic static inline var FFECT_AUTOWAH:Int = 0x000A; // TODO: deprecate and remove\n\tpublic static inline var EFFECT_AUTOWAH:Int = 0x000A;\n\tpublic static inline var EFFECT_COMPRESSOR:Int = 0x000B;\n\tpublic static inline var EFFECT_EQUALIZER:Int = 0x000C;\n\t/* Auxiliary Effect Slot properties. */\n\tpublic static inline var EFFECTSLOT_EFFECT:Int = 0x0001;\n\tpublic static inline var EFFECTSLOT_GAIN:Int = 0x0002;\n\tpublic static inline var EFFECTSLOT_AUXILIARY_SEND_AUTO:Int = 0x0003;\n\t/* NULL Auxiliary Slot ID to disable a source send. */\n\t// public static inline var EFFECTSLOT_NULL:Int = 0x0000;\t\t//Use removeSend instead\n\t/* Filter properties. */\n\t/* Lowpass filter parameters */\n\tpublic static inline var LOWPASS_GAIN:Int = 0x0001; /*Not exactly a lowpass. Apparently it's a shelf*/\n\tpublic static inline var LOWPASS_GAINHF:Int = 0x0002;\n\t/* Highpass filter parameters */\n\tpublic static inline var HIGHPASS_GAIN:Int = 0x0001;\n\tpublic static inline var HIGHPASS_GAINLF:Int = 0x0002;\n\t/* Bandpass filter parameters */\n\tpublic static inline var BANDPASS_GAIN:Int = 0x0001;\n\tpublic static inline var BANDPASS_GAINLF:Int = 0x0002;\n\tpublic static inline var BANDPASS_GAINHF:Int = 0x0003;\n\t/* Filter type */\n\tpublic static inline var FILTER_FIRST_PARAMETER:Int = 0x0000; /*This is not even in the documentation*/\n\tpublic static inline var FILTER_LAST_PARAMETER:Int = 0x8000; /*This one neither*/\n\tpublic static inline var FILTER_TYPE:Int = 0x8001;\n\t/* Filter types, used with the AL_FILTER_TYPE property */\n\tpublic static inline var FILTER_NULL:Int = 0x0000;\n\tpublic static inline var FILTER_LOWPASS:Int = 0x0001;\n\tpublic static inline var FILTER_HIGHPASS:Int = 0x0002;\n\tpublic static inline var FILTER_BANDPASS:Int = 0x0003;\n\n\tpublic static function removeDirectFilter(source:ALSource)\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_remove_direct_filter(source);\n\t\t#end\n\t}\n\n\tpublic static function removeSend(source:ALSource, index:Int)\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_remove_send(source, index);\n\t\t#end\n\t}\n\n\tpublic static function auxf(aux:CFFIPointer, param:Int, value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_auxf(aux, param, value);\n\t\t#end\n\t}\n\n\tpublic static function auxfv(aux:CFFIPointer, param:Int, values:Array<Float>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<hl.F32>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_auxfv(aux, param, values);\n\t\t#end\n\t}\n\n\tpublic static function auxi(aux:CFFIPointer, param:Int, value:Dynamic):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_auxi(aux, param, value);\n\t\t#end\n\t}\n\n\tpublic static function auxiv(aux:CFFIPointer, param:Int, values:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<Int>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_auxiv(aux, param, values);\n\t\t#end\n\t}\n\n\tpublic static function bufferData(buffer:ALBuffer, format:Int, data:ArrayBufferView, size:Int, freq:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_buffer_data(buffer, format, data, size, freq);\n\t\t#end\n\t}\n\n\tpublic static function buffer3f(buffer:ALBuffer, param:Int, value1:Float, value2:Float, value3:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_buffer3f(buffer, param, value1, value2, value3);\n\t\t#end\n\t}\n\n\tpublic static function buffer3i(buffer:ALBuffer, param:Int, value1:Int, value2:Int, value3:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_buffer3i(buffer, param, value1, value2, value3);\n\t\t#end\n\t}\n\n\tpublic static function bufferf(buffer:ALBuffer, param:Int, value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_bufferf(buffer, param, value);\n\t\t#end\n\t}\n\n\tpublic static function bufferfv(buffer:ALBuffer, param:Int, values:Array<Float>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<hl.F32>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_bufferfv(buffer, param, values);\n\t\t#end\n\t}\n\n\tpublic static function bufferi(buffer:ALBuffer, param:Int, value:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_bufferi(buffer, param, value);\n\t\t#end\n\t}\n\n\tpublic static function bufferiv(buffer:ALBuffer, param:Int, values:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<Int>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_bufferiv(buffer, param, values);\n\t\t#end\n\t}\n\n\tpublic static function createAux():ALAuxiliaryEffectSlot\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_aux();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function createBuffer():ALBuffer\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_buffer();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function createEffect():ALEffect\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_effect();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function createFilter():ALFilter\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_filter();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function createSource():ALSource\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_source();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function deleteBuffer(buffer:ALBuffer):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_delete_buffer(buffer);\n\t\t#end\n\t}\n\n\tpublic static function deleteBuffers(buffers:Array<ALBuffer>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _buffers = new hl.NativeArray<ALBuffer>(buffers.length);\n\t\tfor (i in 0...buffers.length)\n\t\t\t_buffers[i] = buffers[i];\n\t\tvar buffers = _buffers;\n\t\t#end\n\t\tNativeCFFI.lime_al_delete_buffers(buffers.length, buffers);\n\t\t#end\n\t}\n\n\tpublic static function deleteSource(source:ALSource):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_delete_source(source);\n\t\t#end\n\t}\n\n\tpublic static function deleteSources(sources:Array<ALSource>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _sources = new hl.NativeArray<ALSource>(sources.length);\n\t\tfor (i in 0...sources.length)\n\t\t\t_sources[i] = sources[i];\n\t\tvar sources = _sources;\n\t\t#end\n\t\tNativeCFFI.lime_al_delete_sources(sources.length, sources);\n\t\t#end\n\t}\n\n\tpublic static function disable(capability:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_disable(capability);\n\t\t#end\n\t}\n\n\tpublic static function distanceModel(distanceModel:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_distance_model(distanceModel);\n\t\t#end\n\t}\n\n\tpublic static function dopplerFactor(value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_doppler_factor(value);\n\t\t#end\n\t}\n\n\tpublic static function dopplerVelocity(value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_doppler_velocity(value);\n\t\t#end\n\t}\n\n\tpublic static function effectf(effect:CFFIPointer, param:Int, value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_effectf(effect, param, value);\n\t\t#end\n\t}\n\n\tpublic static function effectfv(effect:CFFIPointer, param:Int, values:Array<Float>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<hl.F32>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_effectfv(effect, param, values);\n\t\t#end\n\t}\n\n\tpublic static function effecti(effect:CFFIPointer, param:Int, value:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_effecti(effect, param, value);\n\t\t#end\n\t}\n\n\tpublic static function effectiv(effect:CFFIPointer, param:Int, values:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<Int>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_effectiv(effect, param, values);\n\t\t#end\n\t}\n\n\tpublic static function enable(capability:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_enable(capability);\n\t\t#end\n\t}\n\n\t@:deprecated(\"genSource has been renamed to 'createSource' for consistency with OpenGL\") public static function genSource():ALSource\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_source();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function genSources(n:Int):Array<ALSource>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_gen_sources(n);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:deprecated(\"genBuffer has been renamed to 'createBuffer' for consistency with OpenGL\") public static function genBuffer():ALBuffer\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_gen_buffer();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function genBuffers(n:Int):Array<ALBuffer>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_gen_buffers(n);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getBoolean(param:Int):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_boolean(param);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function getBooleanv(param:Int, count:Int = 1):Array<Bool>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_booleanv(param, 1);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getBuffer3f(buffer:ALBuffer, param:Int):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_buffer3f(buffer, param);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getBuffer3i(buffer:ALBuffer, param:Int):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_buffer3i(buffer, param);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getBufferf(buffer:ALBuffer, param:Int):Float\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_bufferf(buffer, param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getBufferfv(buffer:ALBuffer, param:Int, count:Int = 1):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_bufferfv(buffer, param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getBufferi(buffer:ALBuffer, param:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_bufferi(buffer, param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getBufferiv(buffer:ALBuffer, param:Int, count:Int = 1):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_bufferiv(buffer, param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getDouble(param:Int):Float\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_double(param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getDoublev(param:Int, count:Int = 1):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_doublev(param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getEnumValue(ename:String):Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_enum_value(ename);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getError():Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_error();\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getErrorString():String\n\t{\n\t\treturn switch (getError())\n\t\t{\n\t\t\tcase INVALID_NAME: \"INVALID_NAME: Invalid parameter name\";\n\t\t\tcase INVALID_ENUM: \"INVALID_ENUM: Invalid enum value\";\n\t\t\tcase INVALID_VALUE: \"INVALID_VALUE: Invalid parameter value\";\n\t\t\tcase INVALID_OPERATION: \"INVALID_OPERATION: Illegal operation or call\";\n\t\t\tcase OUT_OF_MEMORY: \"OUT_OF_MEMORY: OpenAL has run out of memory\";\n\t\t\tdefault: \"\";\n\t\t}\n\t}\n\n\tpublic static function getFilteri(filter:ALFilter, param:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_filteri(filter, param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getFloat(param:Int):Float\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_float(param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getFloatv(param:Int, count:Int = 1):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_floatv(param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getInteger(param:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_integer(param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getIntegerv(param:Int, count:Int = 1):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_integerv(param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getListener3f(param:Int):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_listener3f(param);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getListener3i(param:Int):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_listener3i(param);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getListenerf(param:Int):Float\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_listenerf(param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getListenerfv(param:Int, count:Int = 1):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_listenerfv(param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getListeneri(param:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_listeneri(param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getListeneriv(param:Int, count:Int = 1):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_listeneriv(param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:dox(hide) @:noCompletion public static function getParameter(param:Int):Dynamic\n\t{\n\t\t// TODO, return any type value (similar to WebGL getParameter)\n\t\treturn null;\n\t}\n\n\tpublic static function getProcAddress(fname:String):Dynamic\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_proc_address(fname);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getSource3f(source:ALSource, param:Int):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_source3f(source, param);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getSourcef(source:ALSource, param:Int):Float\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_sourcef(source, param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getSource3i(source:ALSource, param:Int):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_source3i(source, param);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getSourcefv(source:ALSource, param:Int, count:Int = 1):Array<Float>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_sourcefv(source, param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result:Array<Float> = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getSourcei(source:ALSource, param:Int):Dynamic\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_get_sourcei(source, param);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getSourceiv(source:ALSource, param:Int, count:Int = 1):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_sourceiv(source, param, count);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getString(param:Int):String\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_get_string(param);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function isBuffer(buffer:ALBuffer):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_buffer(buffer);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function isEnabled(capability:Int):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_enabled(capability);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function isExtensionPresent(extname:String):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_extension_present(extname);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function isAux(aux:ALAuxiliaryEffectSlot):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_aux(aux);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function isEffect(effect:ALEffect):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_effect(effect);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function isFilter(filter:ALFilter):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_filter(filter);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function isSource(source:ALSource):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_al_is_source(source);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function listener3f(param:Int, value1:Float, value2:Float, value3:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_listener3f(param, value1, value2, value3);\n\t\t#end\n\t}\n\n\tpublic static function listener3i(param:Int, value1:Int, value2:Int, value3:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_listener3i(param, value1, value2, value3);\n\t\t#end\n\t}\n\n\tpublic static function listenerf(param:Int, value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_listenerf(param, value);\n\t\t#end\n\t}\n\n\tpublic static function listenerfv(param:Int, values:Array<Float>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<hl.F32>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_listenerfv(param, values);\n\t\t#end\n\t}\n\n\tpublic static function listeneri(param:Int, value:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_listeneri(param, value);\n\t\t#end\n\t}\n\n\tpublic static function listeneriv(param:Int, values:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<Int>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_listeneriv(param, values);\n\t\t#end\n\t}\n\n\tpublic static function source3f(source:ALSource, param:Int, value1:Float, value2:Float, value3:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_source3f(source, param, value1, value2, value3);\n\t\t#end\n\t}\n\n\tpublic static function source3i(source:ALSource, param:Int, value1:Dynamic, value2:Int, value3:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_source3i(source, param, value1, value2, value3);\n\t\t#end\n\t}\n\n\tpublic static function sourcef(source:ALSource, param:Int, value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_sourcef(source, param, value);\n\t\t#end\n\t}\n\n\tpublic static function sourcefv(source:ALSource, param:Int, values:Array<Float>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<hl.F32>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_sourcefv(source, param, values);\n\t\t#end\n\t}\n\n\tpublic static function sourcei(source:ALSource, param:Int, value:Dynamic):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_sourcei(source, param, value);\n\t\t#end\n\t}\n\n\tpublic static function filteri(filter:ALFilter, param:Int, value:Dynamic):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_filteri(filter, param, value);\n\t\t#end\n\t}\n\n\tpublic static function filterf(filter:ALFilter, param:Int, value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_filterf(filter, param, value);\n\t\t#end\n\t}\n\n\tpublic static function sourceiv(source:ALSource, param:Int, values:Array<Int>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _values = new hl.NativeArray<Int>(values.length);\n\t\tfor (i in 0...values.length)\n\t\t\t_values[i] = values[i];\n\t\tvar values = _values;\n\t\t#end\n\t\tNativeCFFI.lime_al_sourceiv(source, param, values);\n\t\t#end\n\t}\n\n\tpublic static function sourcePlay(source:ALSource):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_source_play(source);\n\t\t#end\n\t}\n\n\tpublic static function sourcePlayv(sources:Array<ALSource>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _sources = new hl.NativeArray<ALSource>(sources.length);\n\t\tfor (i in 0...sources.length)\n\t\t\t_sources[i] = sources[i];\n\t\tvar sources = _sources;\n\t\t#end\n\t\tNativeCFFI.lime_al_source_playv(sources.length, sources);\n\t\t#end\n\t}\n\n\tpublic static function sourceStop(source:ALSource):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_source_stop(source);\n\t\t#end\n\t}\n\n\tpublic static function sourceStopv(sources:Array<ALSource>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _sources = new hl.NativeArray<ALSource>(sources.length);\n\t\tfor (i in 0...sources.length)\n\t\t\t_sources[i] = sources[i];\n\t\tvar sources = _sources;\n\t\t#end\n\t\tNativeCFFI.lime_al_source_stopv(sources.length, sources);\n\t\t#end\n\t}\n\n\tpublic static function sourceRewind(source:ALSource):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_source_rewind(source);\n\t\t#end\n\t}\n\n\tpublic static function sourceRewindv(sources:Array<ALSource>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _sources = new hl.NativeArray<ALSource>(sources.length);\n\t\tfor (i in 0...sources.length)\n\t\t\t_sources[i] = sources[i];\n\t\tvar sources = _sources;\n\t\t#end\n\t\tNativeCFFI.lime_al_source_rewindv(sources.length, sources);\n\t\t#end\n\t}\n\n\tpublic static function sourcePause(source:ALSource):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_source_pause(source);\n\t\t#end\n\t}\n\n\tpublic static function sourcePausev(sources:Array<ALSource>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _sources = new hl.NativeArray<ALSource>(sources.length);\n\t\tfor (i in 0...sources.length)\n\t\t\t_sources[i] = sources[i];\n\t\tvar sources = _sources;\n\t\t#end\n\t\tNativeCFFI.lime_al_source_pausev(sources.length, sources);\n\t\t#end\n\t}\n\n\tpublic static function sourceQueueBuffer(source:ALSource, buffer:ALBuffer):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar buffers:hl.NativeArray<ALBuffer> = new hl.NativeArray<ALBuffer>(1);\n\t\tbuffers[0] = buffer;\n\t\t#else\n\t\tvar buffers:Array<ALBuffer> = [buffer];\n\t\t#end\n\t\tNativeCFFI.lime_al_source_queue_buffers(source, 1, buffers);\n\t\t#end\n\t}\n\n\tpublic static function sourceQueueBuffers(source:ALSource, nb:Int, buffers:Array<ALBuffer>):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _buffers = new hl.NativeArray<ALBuffer>(buffers.length);\n\t\tfor (i in 0...buffers.length)\n\t\t\t_buffers[i] = buffers[i];\n\t\tvar buffers = _buffers;\n\t\t#end\n\t\tNativeCFFI.lime_al_source_queue_buffers(source, nb, buffers);\n\t\t#end\n\t}\n\n\tpublic static function sourceUnqueueBuffer(source:ALSource):ALBuffer\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar res = NativeCFFI.lime_al_source_unqueue_buffers(source, 1);\n\t\treturn res[0];\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function sourceUnqueueBuffers(source:ALSource, nb:Int):Array<ALBuffer>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_al_source_unqueue_buffers(source, nb);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function speedOfSound(value:Float):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_al_speed_of_sound(value);\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALAuxiliaryEffectSlot.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\nabstract ALAuxiliaryEffectSlot(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALBuffer.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\n@:transitive\nabstract ALBuffer(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALC.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass ALC\n{\n\tpublic static inline var FALSE:Int = 0;\n\tpublic static inline var TRUE:Int = 1;\n\tpublic static inline var FREQUENCY:Int = 0x1007;\n\tpublic static inline var REFRESH:Int = 0x1008;\n\tpublic static inline var SYNC:Int = 0x1009;\n\tpublic static inline var MONO_SOURCES:Int = 0x1010;\n\tpublic static inline var STEREO_SOURCES:Int = 0x1011;\n\tpublic static inline var NO_ERROR:Int = 0;\n\tpublic static inline var INVALID_DEVICE:Int = 0xA001;\n\tpublic static inline var INVALID_CONTEXT:Int = 0xA002;\n\tpublic static inline var INVALID_ENUM:Int = 0xA003;\n\tpublic static inline var INVALID_VALUE:Int = 0xA004;\n\tpublic static inline var OUT_OF_MEMORY:Int = 0xA005;\n\tpublic static inline var ATTRIBUTES_SIZE:Int = 0x1002;\n\tpublic static inline var ALL_ATTRIBUTES:Int = 0x1003;\n\tpublic static inline var DEFAULT_DEVICE_SPECIFIER:Int = 0x1004;\n\tpublic static inline var DEVICE_SPECIFIER:Int = 0x1005;\n\tpublic static inline var EXTENSIONS:Int = 0x1006;\n\tpublic static inline var ENUMERATE_ALL_EXT:Int = 1;\n\tpublic static inline var DEFAULT_ALL_DEVICES_SPECIFIER:Int = 0x1012;\n\tpublic static inline var ALL_DEVICES_SPECIFIER:Int = 0x1013;\n\n\tpublic static function closeDevice(device:ALDevice):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_alc_close_device(device);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function createContext(device:ALDevice, attrlist:Array<Int> = null):ALContext\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\t#if hl\n\t\tvar _attrlist = null;\n\t\tif (attrlist != null)\n\t\t{\n\t\t\t_attrlist = new hl.NativeArray<Int>(attrlist.length);\n\t\t\tfor (i in 0...attrlist.length)\n\t\t\t\t_attrlist[i] = attrlist[i];\n\t\t}\n\t\tvar attrlist = _attrlist;\n\t\t#end\n\t\tvar handle = NativeCFFI.lime_alc_create_context(device, attrlist);\n\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn new ALContext(handle);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function destroyContext(context:ALContext):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_alc_destroy_context(context);\n\t\t#end\n\t}\n\n\tpublic static function getContextsDevice(context:ALContext):ALDevice\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar handle:Dynamic = NativeCFFI.lime_alc_get_contexts_device(context);\n\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn new ALDevice(handle);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function getCurrentContext():ALContext\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar handle:Dynamic = NativeCFFI.lime_alc_get_current_context();\n\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn new ALContext(handle);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function getError(device:ALDevice):Int\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_alc_get_error(device);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function getErrorString(device:ALDevice):String\n\t{\n\t\treturn switch (getError(device))\n\t\t{\n\t\t\tcase INVALID_DEVICE: \"INVALID_DEVICE: Invalid device (or no device?)\";\n\t\t\tcase INVALID_CONTEXT: \"INVALID_CONTEXT: Invalid context (or no context?)\";\n\t\t\tcase INVALID_ENUM: \"INVALID_ENUM: Invalid enum value\";\n\t\t\tcase INVALID_VALUE: \"INVALID_VALUE: Invalid param value\";\n\t\t\tcase OUT_OF_MEMORY: \"OUT_OF_MEMORY: OpenAL has run out of memory\";\n\t\t\tdefault: \"\";\n\t\t}\n\t}\n\n\tpublic static function getIntegerv(device:ALDevice, param:Int, size:Int):Array<Int>\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_alc_get_integerv(device, param, size);\n\t\t#if hl\n\t\tif (result == null) return [];\n\t\tvar _result = [];\n\t\tfor (i in 0...result.length)\n\t\t\t_result[i] = result[i];\n\t\treturn _result;\n\t\t#else\n\t\treturn result;\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getString(device:ALDevice, param:Int):String\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar result = NativeCFFI.lime_alc_get_string(device, param);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function makeContextCurrent(context:ALContext):Bool\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\treturn NativeCFFI.lime_alc_make_context_current(context);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic static function openDevice(deviceName:String = null):ALDevice\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tvar handle = NativeCFFI.lime_alc_open_device(deviceName);\n\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn new ALDevice(handle);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function pauseDevice(device:ALDevice):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_alc_pause_device(device);\n\t\t#end\n\t}\n\n\tpublic static function processContext(context:ALContext):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_alc_process_context(context);\n\t\t#end\n\t}\n\n\tpublic static function resumeDevice(device:ALDevice):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_alc_resume_device(device);\n\t\t#end\n\t}\n\n\tpublic static function suspendContext(context:ALContext):Void\n\t{\n\t\t#if (lime_cffi && lime_openal && !macro)\n\t\tNativeCFFI.lime_alc_suspend_context(context);\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALContext.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\n@:allow(lime.media.openal.ALC)\nabstract ALContext(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALDevice.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\n@:allow(lime.media.openal.ALC)\nabstract ALDevice(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALEffect.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\nabstract ALEffect(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALFilter.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\nabstract ALFilter(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/openal/ALSource.hx",
    "content": "package lime.media.openal;\n\n#if (!lime_doc_gen || lime_openal)\nimport lime.system.CFFIPointer;\n\n@:allow(lime.media.openal.AL)\nabstract ALSource(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\t@:noCompletion private inline function new(handle:CFFIPointer)\n\t{\n\t\tthis = handle;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/vorbis/Vorbis.hx",
    "content": "package lime.media.vorbis;\n\n#if (!lime_doc_gen || lime_vorbis)\n@:headerCode(\"\n#undef EFAULT\n#undef EINVAL\n\")\nclass Vorbis\n{\n\tpublic static inline var FALSE = -1;\n\tpublic static inline var EOF = -2;\n\tpublic static inline var HOLE = -3;\n\tpublic static inline var EREAD = -128;\n\tpublic static inline var EFAULT = -129;\n\tpublic static inline var EIMPL = -130;\n\tpublic static inline var EINVAL = -131;\n\tpublic static inline var ENOTVORBIS = -132;\n\tpublic static inline var EBADHEADER = -133;\n\tpublic static inline var EVERSION = -134;\n\tpublic static inline var ENOTAUDIO = -135;\n\tpublic static inline var EBADPACKET = -136;\n\tpublic static inline var EBADLINK = -137;\n\tpublic static inline var ENOSEEK = -138;\n\t// TODO: Vorbis primitives\n}\n#end\n"
  },
  {
    "path": "src/lime/media/vorbis/VorbisComment.hx",
    "content": "package lime.media.vorbis;\n\n#if (!lime_doc_gen || lime_vorbis)\nclass VorbisComment\n{\n\tpublic var userComments:Array<String>;\n\tpublic var vendor:String;\n\n\tpublic function new() {}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/vorbis/VorbisFile.hx",
    "content": "package lime.media.vorbis;\n\n#if (!lime_doc_gen || lime_vorbis)\nimport haxe.Int64;\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\n\n#if hl\n@:keep\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass VorbisFile\n{\n\tpublic var bitstream(default, null):Int;\n\n\t@:noCompletion private var handle:Dynamic;\n\n\t@:noCompletion private function new(handle:Dynamic)\n\t{\n\t\tthis.handle = handle;\n\t}\n\n\tpublic function bitrate(bitstream:Int = -1):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_bitrate(handle, bitstream);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function bitrateInstant():Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_bitrate_instant(handle);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function clear():Void\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tNativeCFFI.lime_vorbis_file_clear(handle);\n\t\t#end\n\t}\n\n\tpublic function comment(bitstream:Int = -1):VorbisComment\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_comment(handle, bitstream);\n\n\t\tif (data != null)\n\t\t{\n\t\t\tvar comment = new VorbisComment();\n\t\t\tcomment.userComments = data.userComments;\n\t\t\tcomment.vendor = data.vendor;\n\t\t\treturn comment;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function crosslap(other:VorbisFile):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_crosslap(handle, other.handle);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic static function fromBytes(bytes:Bytes):VorbisFile\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar handle = NativeCFFI.lime_vorbis_file_from_bytes(bytes);\n\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn new VorbisFile(handle);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function fromFile(path:String):VorbisFile\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar handle = NativeCFFI.lime_vorbis_file_from_file(path);\n\n\t\tif (handle != null)\n\t\t{\n\t\t\treturn new VorbisFile(handle);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function info(bitstream:Int = -1):VorbisInfo\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_info(handle, bitstream);\n\n\t\tif (data != null)\n\t\t{\n\t\t\tvar info = new VorbisInfo();\n\t\t\tinfo.bitrateLower = data.bitrateLower;\n\t\t\tinfo.bitrateNominal = data.bitrateNominal;\n\t\t\tinfo.bitrateUpper = data.bitrateUpper;\n\t\t\tinfo.channels = data.channels;\n\t\t\tinfo.rate = data.rate;\n\t\t\tinfo.version = data.version;\n\t\t\treturn info;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function pcmSeek(pos:Int64):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_pcm_seek(handle, pos.low, pos.high);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function pcmSeekLap(pos:Int64):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_pcm_seek_lap(handle, pos.low, pos.high);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function pcmSeekPage(pos:Int64):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_pcm_seek_page(handle, pos.low, pos.high);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function pcmSeekPageLap(pos:Int64):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_pcm_seek_page_lap(handle, pos.low, pos.high);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function pcmTell():Int64\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_pcm_tell(handle);\n\n\t\tif (data != null)\n\t\t{\n\t\t\treturn Int64.make(data.high, data.low);\n\t\t}\n\t\t#end\n\n\t\treturn Int64.ofInt(0);\n\t}\n\n\tpublic function pcmTotal(bitstream:Int = -1):Int64\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_pcm_total(handle, bitstream);\n\n\t\tif (data != null)\n\t\t{\n\t\t\treturn Int64.make(data.high, data.low);\n\t\t}\n\t\t#end\n\n\t\treturn Int64.ofInt(0);\n\t}\n\n\tpublic function rawSeek(pos:Int64):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_raw_seek(handle, pos.low, pos.high);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function rawSeekLap(pos:Int64):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_raw_seek_lap(handle, pos.low, pos.high);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function rawTell():Int64\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_raw_tell(handle);\n\n\t\tif (data != null)\n\t\t{\n\t\t\treturn Int64.make(data.high, data.low);\n\t\t}\n\t\t#end\n\n\t\treturn Int64.ofInt(0);\n\t}\n\n\tpublic function rawTotal(bitstream:Int = -1):Int64\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_raw_total(handle, bitstream);\n\n\t\tif (data != null)\n\t\t{\n\t\t\treturn Int64.make(data.high, data.low);\n\t\t}\n\t\t#end\n\n\t\treturn Int64.ofInt(0);\n\t}\n\n\tpublic function read(buffer:Bytes, position:Int, length:Int = 4096, bigEndianPacking:Bool = false, wordSize:Int = 2, signed:Bool = true):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_read(handle, buffer, position, length, bigEndianPacking, wordSize, signed);\n\t\tif (data == null) return 0;\n\t\tbitstream = data.bitstream;\n\t\treturn data.returnValue;\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t// public function readFilter (buffer:Bytes, length:Int = 4096, endianness:Endian = LITTLE_ENDIAN, wordSize:Int = 2, signed:Bool = true, bitstream:Int = 0, filter, filter_param\n\tpublic function readFloat(pcmChannels:Bytes, samples:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\tvar data = NativeCFFI.lime_vorbis_file_read_float(handle, pcmChannels, samples);\n\t\tif (data == null) return 0;\n\t\tbitstream = data.bitstream;\n\t\treturn data.returnValue;\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function seekable():Bool\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_seekable(handle);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function serialNumber(bitstream:Int = -1):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_serial_number(handle, bitstream);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function streams():Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_streams(handle);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function timeSeek(s:Float):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_time_seek(handle, s);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function timeSeekLap(s:Float):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_time_seek_lap(handle, s);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function timeSeekPage(s:Float):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_time_seek_page(handle, s);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function timeSeekPageLap(s:Float):Int\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_time_seek_page_lap(handle, s);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function timeTell():Float\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_time_tell(handle);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function timeTotal(bitstream:Int = -1):Float\n\t{\n\t\t#if (lime_cffi && lime_vorbis && !macro)\n\t\treturn NativeCFFI.lime_vorbis_file_time_total(handle, bitstream);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/media/vorbis/VorbisInfo.hx",
    "content": "package lime.media.vorbis;\n\n#if (!lime_doc_gen || lime_vorbis)\nclass VorbisInfo\n{\n\tpublic var bitrateLower:Int;\n\tpublic var bitrateNominal:Int;\n\tpublic var bitrateUpper:Int;\n\t// public var bitrateWindow:Int;\n\tpublic var channels:Int;\n\tpublic var rate:Int;\n\tpublic var version:Int;\n\n\tpublic function new() {}\n}\n#end\n"
  },
  {
    "path": "src/lime/net/HTTPRequest.hx",
    "content": "package lime.net;\n\nimport haxe.io.Bytes;\nimport haxe.macro.Compiler;\nimport lime.app.Event;\nimport lime.app.Future;\nimport lime.app.Promise;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n#if doc_gen\nclass HTTPRequest<T>\n{\n#else\n#if !macro\n@:genericBuild(lime._internal.macros.HTTPRequestMacro.build())\n#end\nclass HTTPRequest<T> extends AbstractHTTPRequest<T> {}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nprivate class AbstractHTTPRequest<T> implements _IHTTPRequest\n{\n#end\n\npublic var contentType:String;\npublic var data:Bytes;\npublic var enableResponseHeaders:Bool;\npublic var followRedirects:Bool;\npublic var formData:Map<String, Dynamic>;\npublic var headers:Array<HTTPRequestHeader>;\npublic var method:HTTPRequestMethod;\npublic var responseData:T;\npublic var responseHeaders:Array<HTTPRequestHeader>;\npublic var responseStatus:Int;\npublic var timeout:Int;\npublic var uri:String;\npublic var userAgent:String;\npublic var withCredentials:Bool;\npublic var manageCookies:Bool;\n#if !doc_gen\n@:noCompletion private var __backend:HTTPRequestBackend;\n#end\n\npublic function new(uri:String = null)\n{\n\tthis.uri = uri;\n\n\tcontentType = \"application/x-www-form-urlencoded\";\n\tfollowRedirects = true;\n\tenableResponseHeaders = false;\n\tformData = new Map();\n\theaders = [];\n\tmethod = GET;\n\ttimeout = #if lime_default_timeout Std.parseInt(Compiler.getDefine(\"lime-default-timeout\")) #else 30000 #end;\n\twithCredentials = false;\n\tmanageCookies = true;\n\n\t#if !doc_gen\n\t__backend = new HTTPRequestBackend();\n\t__backend.init(this);\n\t#end\n}\n\npublic function cancel():Void\n{\n\t#if !doc_gen\n\t__backend.cancel();\n\t#end\n}\n\npublic function load(uri:String = null):Future<T>\n{\n\treturn null;\n}\n}\n#if !doc_gen\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:noCompletion class _HTTPRequest_Bytes<T> extends AbstractHTTPRequest<T>\n{\n\tpublic function new(uri:String = null)\n\t{\n\t\tsuper(uri);\n\t}\n\n\t@:noCompletion private function fromBytes(bytes:Bytes):T\n\t{\n\t\treturn cast bytes;\n\t}\n\n\tpublic override function load(uri:String = null):Future<T>\n\t{\n\t\tif (uri != null)\n\t\t{\n\t\t\tthis.uri = uri;\n\t\t}\n\n\t\tvar promise = new Promise<T>();\n\t\tvar future = __backend.loadData(this.uri);\n\n\t\tfuture.onProgress(promise.progress);\n\t\tfuture.onError(function(errorResponse:_HTTPRequestErrorResponse<T>)\n\t\t{\n\t\t\tresponseData = errorResponse.responseData;\n\t\t\tpromise.error(errorResponse.error);\n\t\t});\n\n\t\tfuture.onComplete(function(bytes)\n\t\t{\n\t\t\tresponseData = fromBytes(bytes);\n\t\t\tpromise.complete(responseData);\n\t\t});\n\n\t\treturn promise.future;\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:noCompletion class _HTTPRequest_String<T> extends AbstractHTTPRequest<T>\n{\n\tpublic function new(uri:String = null)\n\t{\n\t\tsuper(uri);\n\t}\n\n\tpublic override function load(uri:String = null):Future<T>\n\t{\n\t\tif (uri != null)\n\t\t{\n\t\t\tthis.uri = uri;\n\t\t}\n\n\t\tvar promise = new Promise<T>();\n\t\tvar future = __backend.loadText(this.uri);\n\n\t\tfuture.onProgress(promise.progress);\n\t\tfuture.onError(function(errorResponse:_HTTPRequestErrorResponse<T>)\n\t\t{\n\t\t\tresponseData = errorResponse.responseData;\n\t\t\tpromise.error(errorResponse.error);\n\t\t});\n\n\t\tfuture.onComplete(function(text)\n\t\t{\n\t\t\tresponseData = cast text;\n\t\t\tpromise.complete(responseData);\n\t\t});\n\n\t\treturn promise.future;\n\t}\n}\n\n@:noCompletion class _HTTPRequestErrorResponse<T> {\n\tpublic var error:Dynamic;\n\tpublic var responseData:T;\n\tpublic function new(error:Dynamic, responseData:T) {\n\t\tthis.error = error;\n\t\tthis.responseData = responseData;\n\t}\n}\n\n@:noCompletion interface _IHTTPRequest\n{\n\tpublic var contentType:String;\n\tpublic var data:haxe.io.Bytes;\n\tpublic var enableResponseHeaders:Bool;\n\tpublic var followRedirects:Bool;\n\tpublic var formData:Map<String, Dynamic>;\n\tpublic var headers:Array<HTTPRequestHeader>;\n\tpublic var method:HTTPRequestMethod;\n\t// public var responseData:T;\n\tpublic var responseHeaders:Array<HTTPRequestHeader>;\n\tpublic var responseStatus:Int;\n\tpublic var timeout:Int;\n\tpublic var uri:String;\n\tpublic var userAgent:String;\n\tpublic var withCredentials:Bool;\n\tpublic var manageCookies:Bool;\n\tpublic function cancel():Void;\n}\n\n#if flash\nprivate typedef HTTPRequestBackend = lime._internal.backend.flash.FlashHTTPRequest;\n#elseif (js && html5)\nprivate typedef HTTPRequestBackend = lime._internal.backend.html5.HTML5HTTPRequest;\n#else\nprivate typedef HTTPRequestBackend = lime._internal.backend.native.NativeHTTPRequest;\n#end\n#end\n"
  },
  {
    "path": "src/lime/net/HTTPRequestHeader.hx",
    "content": "package lime.net;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass HTTPRequestHeader\n{\n\tpublic var name:String;\n\tpublic var value:String;\n\n\tpublic function new(name:String, value:String = \"\")\n\t{\n\t\tthis.name = name;\n\t\tthis.value = value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/net/HTTPRequestMethod.hx",
    "content": "package lime.net;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HTTPRequestMethod(String) from String to String\n{\n\tpublic var DELETE = \"DELETE\";\n\tpublic var GET = \"GET\";\n\tpublic var HEAD = \"HEAD\";\n\tpublic var OPTIONS = \"OPTIONS\";\n\tpublic var POST = \"POST\";\n\tpublic var PUT = \"PUT\";\n}\n"
  },
  {
    "path": "src/lime/net/URIParser.hx",
    "content": "package lime.net;\n\n/**\n\tClass used for parsing URIs and URLs.\n\tBased on http://blog.stevenlevithan.com/archives/parseuri\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass URIParser\n{\n\tpublic static var URI_REGEX = ~/^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\tpublic static var QUERY_REGEX = ~/(?:^|&)([^&=]*)=?([^&]*)/;\n\n\t/**\n\t\tThe original URI from the constructor if the parsing is successful.\n\t\tOtherwise `null`.\n\t**/\n\tpublic var source:String;\n\n\t/**\n\t\tProtocol found in this URI.\n\t\tIn `\"https://example.com/page/index.html\"` this would be `\"https\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var protocol:String;\n\n\t/**\n\t\tHostname and port along with the credentials found in this URI.\n\t\tIn `\"https://john:secret@example.com:443/page/index.html\"` this would be `\"john:secret@example.com:443\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var authority:String;\n\n\t/**\n\t\tCredentials found in this URI.\n\t\tIn `\"https://john:secret@example.com/page/index.html\"` this would be `\"john:secret\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var userInfo:String;\n\n\t/**\n\t\tUsername found in this URI.\n\t\tIn `\"https://john:secret@example.com/index.html\"` this would be `\"john\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var user:String;\n\n\t/**\n\t\tPassword found in this URI.\n\t\tIn `\"https://john:secret@example.com/index.html\"` this would be `\"secret\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var password:String;\n\n\t/**\n\t\tHostname (domain/IP) found in this URI.\n\t\tIn `\"https://subdomain.example.com:443/index.html\"` this would be `\"subdomain.example.com\"`\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var host:String;\n\n\t/**\n\t\tPort used in this URI as **String**.\n\t\tIn `\"https://subdomain.example.com:443/index.html\"` this would be `\"443\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var port:String;\n\n\t/**\n\t\tFull path after the host with all the directories and parameters, starting with `/`.\n\t\tIn `\"https://subdomain.example.com/files/website/index.php?action=upload&token=12345#header\"`\n\t\tthis would be `\"/files/website/index.php?action=upload&token=12345#header\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var relative:String;\n\n\t/**\n\t\tFull path after the domain with directories, starting with `/`, without parameters\n\t\tIn `\"https://subdomain.example.com/files/website/index.php?action=upload&token=12345#header\"`\n\t\tthis would be `\"/files/website/index.php\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var path:String;\n\n\t/**\n\t\tDirectory where the target file pointed by the URI is located. Starts and ends with `/`.\n\t\tIn `\"https://subdomain.example.com/files/website/index.php\"` this would be `\"/files/website/\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var directory:String;\n\n\t/**\n\t\tName of the file pointed by the URI.\n\t\tIn `\"https://example.com/files/website/index.php?action=upload\"` this would be `\"index.php\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var file:String;\n\n\t/**\n\t\tQuery string passed to the URI.\n\t\tIn `\"https://example.com/index.php?action=upload&token=12345#header\"`\n\t\tthis would be `\"action=upload&token=12345\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var query:String;\n\n\t/**\n\t\tThe \"#hash\" part of the URI.\n\t\tIn `\"https://example.com/index.php?action=upload&token=12345#header\"` this would be `\"header\"`.\n\t\tIn a more sophisicated example `\"https://example.com/index.php?action=upload#header=/abc/1234\"`\n\t\tthat would be `\"header=/abc/1234\"`.\n\t\t`null` if unspecified or malformed.\n\t**/\n\tpublic var anchor:String;\n\n\t/**\n\t\tValue from `query` returned as an array of key-value pairs.\n\t\tIn `\"https://example.com/index.php?action=upload&token=12345#header\"` the array would be\n\t\t`[{k: \"action\", v: \"upload\"}, {k: \"token\", v: \"12345\"}]`. If query is not present or the URI\n\t\tis malformed, it is just an empty array.\n\n\t\t```haxe\n\t\tvar uri = new URIParser(\"https://example.com/index.php?action=upload&token=12345#header\");\n\t\tfor( q in uri.queryArray )\n\t\t\ttrace( q.k + \" = \" + q.v); // action = upload\n\t\t\t\t\t\t\t\t\t   // token = 12345\n\t\t```\n\t**/\n\tpublic var queryArray:Array<KVPair>;\n\n\t/**\n\t\tParses the given URI with regular expression and stores its parts in class variables.\n\t\tIf the URI is malformed and cannot be parsed, the values will be `null`.\n\t\t@param uri the URI to be parsed.\n\t**/\n\tpublic function new(uri:String)\n\t{\n\t\tif (URI_REGEX.match(uri))\n\t\t{\n\t\t\tsource = uri;\n\t\t\tprotocol = URI_REGEX.matched(1);\n\t\t\tauthority = URI_REGEX.matched(2);\n\t\t\tuserInfo = URI_REGEX.matched(3);\n\t\t\tuser = URI_REGEX.matched(4);\n\t\t\tpassword = URI_REGEX.matched(5);\n\t\t\thost = URI_REGEX.matched(6);\n\t\t\tport = URI_REGEX.matched(7);\n\t\t\trelative = URI_REGEX.matched(8);\n\t\t\tpath = URI_REGEX.matched(9);\n\t\t\tdirectory = URI_REGEX.matched(10);\n\t\t\tfile = URI_REGEX.matched(11);\n\t\t\tquery = URI_REGEX.matched(12);\n\t\t\tanchor = URI_REGEX.matched(13);\n\n\t\t\tif (query != null && query.length > 0)\n\t\t\t{\n\t\t\t\tqueryArray = parseQuery(query);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttrace('URI \"$uri\" isn\\'t well formed.');\n\t\t}\n\t}\n\n\tpublic static function parseQuery(query:String):Array<KVPair>\n\t{\n\t\tvar result:Array<KVPair> = [];\n\n\t\tfor (str in query.split(\"&\"))\n\t\t{\n\t\t\tif (QUERY_REGEX.match(str))\n\t\t\t{\n\t\t\t\tresult.push({k: QUERY_REGEX.matched(1), v: QUERY_REGEX.matched(2)});\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\n@:dox(hide) typedef KVPair =\n{\n\tk:String,\n\tv:String\n};\n"
  },
  {
    "path": "src/lime/net/curl/CURL.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass CURL\n{\n\tpublic static inline var GLOBAL_SSL:Int = 1 << 0;\n\tpublic static inline var GLOBAL_WIN32:Int = 1 << 1;\n\tpublic static inline var GLOBAL_ALL:Int = GLOBAL_SSL | GLOBAL_WIN32;\n\tpublic static inline var GLOBAL_NOTHING:Int = 0;\n\tpublic static inline var GLOBAL_DEFAULT:Int = GLOBAL_ALL;\n\tpublic static inline var GLOBAL_ACK_EINTR:Int = 1 << 2;\n\n\t@:noCompletion private var handle:CFFIPointer;\n\t@:noCompletion private var headerBytes:Bytes;\n\t@:noCompletion private var writeBytes:Bytes;\n\n\tpublic function new(handle:CFFIPointer = null)\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\tthis.handle = handle;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t#if (lime_cffi && lime_curl && !macro)\n\t\t\tthis.handle = NativeCFFI.lime_curl_easy_init();\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic function cleanup():Void\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tNativeCFFI.lime_curl_easy_cleanup(handle);\n\t\t#end\n\t}\n\n\tpublic function clone():CURL\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn new CURL(NativeCFFI.lime_curl_easy_duphandle(handle));\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function escape(url:String, length:Int):String\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tvar result = NativeCFFI.lime_curl_easy_escape(handle, url, length);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getDate(date:String, now:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_getdate(date, cast now);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function getInfo(info:CURLInfo):Dynamic\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn NativeCFFI.lime_curl_easy_getinfo(handle, cast(info, Int));\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function globalCleanup():Void\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tNativeCFFI.lime_curl_global_cleanup();\n\t\t#end\n\t}\n\n\tpublic static function globalInit(flags:Int):CURLCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_global_init(flags);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function pause(bitMask:Int):CURLCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_easy_pause(handle, bitMask);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function perform():CURLCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_easy_perform(handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t/*public static function recv (handle:Dynamic):CURLCode {\n\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_easy_perform (handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\n\t}*/\n\tpublic function reset():Void\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tNativeCFFI.lime_curl_easy_reset(handle);\n\t\t#end\n\t}\n\n\t/*public static function send (handle:Dynamic):CURLCode {\n\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_easy_perform (handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\n\t}*/\n\tpublic function setOption(option:CURLOption, parameter:Dynamic):CURLCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tvar bytes = null;\n\n\t\tswitch (option)\n\t\t{\n\t\t\tcase CURLOption.PROGRESSFUNCTION:\n\t\t\t\tvar callback:CURL->Float->Float->Float->Float->Void = cast parameter;\n\t\t\t\tparameter = function(dltotal:Float, dlnow:Float, ultotal:Float, ulnow:Float)\n\t\t\t\t{\n\t\t\t\t\tcallback(this, dltotal, dlnow, ultotal, ulnow);\n\t\t\t\t}\n\n\t\t\tcase CURLOption.XFERINFOFUNCTION:\n\t\t\t\tvar callback:CURL->Int->Int->Int->Int->Int = cast parameter;\n\t\t\t\tparameter = function(dltotal:Int, dlnow:Int, ultotal:Int, ulnow:Int):Int\n\t\t\t\t{\n\t\t\t\t\treturn callback(this, dltotal, dlnow, ultotal, ulnow);\n\t\t\t\t}\n\n\t\t\tcase CURLOption.WRITEFUNCTION:\n\t\t\t\tvar callback:CURL->Bytes->Int = cast parameter;\n\t\t\t\tparameter = function(bytes:Bytes, length:Int):Int\n\t\t\t\t{\n\t\t\t\t\tvar cacheLength = bytes.length;\n\t\t\t\t\t@:privateAccess bytes.length = length;\n\t\t\t\t\tvar read = callback(this, bytes);\n\t\t\t\t\t@:privateAccess bytes.length = cacheLength;\n\t\t\t\t\treturn read;\n\t\t\t\t}\n\t\t\t\tbytes = Bytes.alloc(0);\n\n\t\t\t// case CURLOption.READFUNCTION:\n\n\t\t\t// Impossible to support with GC blocking restrictions\n\t\t\t// TODO: Unsafe version?\n\t\t\t// return cast 0;\n\n\t\t\tcase CURLOption.READDATA:\n\t\t\t\tbytes = parameter;\n\n\t\t\tcase CURLOption.HEADERFUNCTION:\n\t\t\t\tvar callback:CURL->String->Void = cast parameter;\n\t\t\t\tparameter = function(header)\n\t\t\t\t{\n\t\t\t\t\tcallback(this, CFFI.stringValue(header));\n\t\t\t\t}\n\n\t\t\tcase CURLOption.HTTPHEADER:\n\t\t\t\t#if hl\n\t\t\t\tvar headers:Array<String> = cast parameter;\n\t\t\t\tvar _headers = new hl.NativeArray<String>(headers.length);\n\t\t\t\tfor (i in 0...headers.length)\n\t\t\t\t\t_headers[i] = headers[i];\n\t\t\t\tparameter = _headers;\n\t\t\t\t#end\n\n\t\t\tdefault:\n\t\t}\n\n\t\treturn cast NativeCFFI.lime_curl_easy_setopt(handle, cast(option, Int), parameter, bytes);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic static function strerror(code:CURLCode):String\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tvar result = NativeCFFI.lime_curl_easy_strerror(cast(code, Int));\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function unescape(url:String, inLength:Int, outLength:Int):String\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tvar result = NativeCFFI.lime_curl_easy_unescape(handle, url, inLength, outLength);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function version():String\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tvar result = NativeCFFI.lime_curl_version();\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function versionInfo(type:CURLVersion):Dynamic\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn NativeCFFI.lime_curl_version_info(cast(type, Int));\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLCode.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CURLCode(Int) from Int to Int from UInt to UInt\n{\n\tvar OK = 0;\n\tvar UNSUPPORTED_PROTOCOL = 1;\n\tvar FAILED_INIT = 2;\n\tvar URL_MALFORMAT = 3;\n\tvar NOT_BUILT_IN = 4;\n\tvar COULDNT_RESOLVE_PROXY = 5;\n\tvar COULDNT_RESOLVE_HOST = 6;\n\tvar COULDNT_CONNECT = 7;\n\tvar WEIRD_SERVER_REPLY = 8;\n\tvar REMOTE_ACCESS_DENIED = 9;\n\tvar FTP_ACCEPT_FAILED = 10;\n\tvar FTP_WEIRD_PASS_REPLY = 11;\n\tvar FTP_ACCEPT_TIMEOUT = 12;\n\tvar FTP_WEIRD_PASV_REPLY = 13;\n\tvar FTP_WEIRD_227_FORMAT = 14;\n\tvar FTP_CANT_GET_HOST = 15;\n\tvar HTTP2 = 16;\n\tvar FTP_COULDNT_SET_TYPE = 17;\n\tvar PARTIAL_FILE = 18;\n\tvar FTP_COULDNT_RETR_FILE = 19;\n\t// var OBSOLETE20 = 20;\n\tvar QUOTE_ERROR = 21;\n\tvar HTTP_RETURNED_ERROR = 22;\n\tvar WRITE_ERROR = 23;\n\t// var OBSOLETE24 = 24;\n\tvar UPLOAD_FAILED = 25;\n\tvar READ_ERROR = 26;\n\tvar OUT_OF_MEMORY = 27;\n\tvar OPERATION_TIMEDOUT = 28;\n\t// var OBSOLETE29 = 29;\n\tvar FTP_PORT_FAILED = 30;\n\tvar FTP_COULDNT_USE_REST = 31;\n\t// var OBSOLETE32 = 32;\n\tvar RANGE_ERROR = 33;\n\tvar HTTP_POST_ERROR = 34;\n\tvar SSL_CONNECT_ERROR = 35;\n\tvar BAD_DOWNLOAD_RESUME = 36;\n\tvar FILE_COULDNT_READ_FILE = 37;\n\tvar LDAP_CANNOT_BIND = 38;\n\tvar LDAP_SEARCH_FAILED = 39;\n\t// var OBSOLETE40 = 40;\n\t// var FUNCTION_NOT_FOUND = 41;\n\tvar ABORTED_BY_CALLBACK = 42;\n\tvar BAD_FUNCTION_ARGUMENT = 43;\n\t// var OBSOLETE44 = 44;\n\tvar INTERFACE_FAILED = 45;\n\t// var OBSOLETE46 = 46;\n\tvar TOO_MANY_REDIRECTS = 47;\n\tvar UNKNOWN_OPTION = 48;\n\tvar TELNET_OPTION_SYNTAX = 49;\n\t// var OBSOLETE50 = 50;\n\tvar PEER_FAILED_VERIFICATION = 51;\n\tvar GOT_NOTHING = 52;\n\tvar SSL_ENGINE_NOTFOUND = 53;\n\tvar SSL_ENGINE_SETFAILED = 54;\n\tvar SEND_ERROR = 55;\n\tvar RECV_ERROR = 56;\n\t// var OBSOLETE57 = 57;\n\tvar SSL_CERTPROBLEM = 58;\n\tvar SSL_CIPHER = 59;\n\tvar SSL_CACERT = 60;\n\tvar BAD_CONTENT_ENCODING = 61;\n\tvar LDAP_INVALID_URL = 62;\n\tvar FILESIZE_EXCEEDED = 63;\n\tvar USE_SSL_FAILED = 64;\n\tvar SEND_FAIL_REWIND = 65;\n\tvar SSL_ENGINE_INITFAILED = 66;\n\tvar LOGIN_DENIED = 67;\n\tvar TFTP_NOTFOUND = 68;\n\tvar TFTP_PERM = 69;\n\tvar REMOTE_DISK_FULL = 70;\n\tvar TFTP_ILLEGAL = 71;\n\tvar TFTP_UNKNOWNID = 72;\n\tvar REMOTE_FILE_EXISTS = 73;\n\tvar TFTP_NOSUCHUSER = 74;\n\tvar CONV_FAILED = 75;\n\tvar CONV_REQD = 76;\n\tvar SSL_CACERT_BADFILE = 77;\n\tvar REMOTE_FILE_NOT_FOUND = 78;\n\tvar SSH = 79;\n\tvar SSL_SHUTDOWN_FAILED = 80;\n\tvar AGAIN = 81;\n\tvar SSL_CRL_BADFILE = 82;\n\tvar SSL_ISSUER_ERROR = 83;\n\tvar FTP_PRET_FAILED = 84;\n\tvar RTSP_CSEQ_ERROR = 85;\n\tvar RTSP_SESSION_ERROR = 86;\n\tvar FTP_BAD_FILE_LIST = 87;\n\tvar CHUNK_FAILED = 88;\n\tvar NO_CONNECTION_AVAILABLE = 89;\n\tvar SSL_PINNEDPUBKEYNOTMATCH = 90;\n\tvar SSL_INVALIDCERTSTATUS = 91;\n\tvar HTTP2_STREAM = 92;\n\t// var LAST = 93;\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLInfo.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CURLInfo(Int) from Int to Int from UInt to UInt\n{\n\tvar NONE = 0;\n\tvar EFFECTIVE_URL = 0x100000 + 1;\n\tvar RESPONSE_CODE = 0x200000 + 2;\n\tvar TOTAL_TIME = 0x300000 + 3;\n\tvar NAMELOOKUP_TIME = 0x300000 + 4;\n\tvar CONNECT_TIME = 0x300000 + 5;\n\tvar PRETRANSFER_TIME = 0x300000 + 6;\n\tvar SIZE_UPLOAD = 0x300000 + 7;\n\tvar SIZE_UPLOAD_T = 0x600000 + 7;\n\tvar SIZE_DOWNLOAD = 0x300000 + 8;\n\tvar SIZE_DOWNLOAD_T = 0x600000 + 8;\n\tvar SPEED_DOWNLOAD = 0x300000 + 9;\n\tvar SPEED_DOWNLOAD_T = 0x600000 + 9;\n\tvar SPEED_UPLOAD = 0x300000 + 10;\n\tvar SPEED_UPLOAD_T = 0x600000 + 10;\n\tvar HEADER_SIZE = 0x200000 + 11;\n\tvar REQUEST_SIZE = 0x200000 + 12;\n\tvar SSL_VERIFYRESULT = 0x200000 + 13;\n\tvar FILETIME = 0x200000 + 14;\n\tvar CONTENT_LENGTH_DOWNLOAD = 0x300000 + 15;\n\tvar CONTENT_LENGTH_DOWNLOAD_T = 0x600000 + 15;\n\tvar CONTENT_LENGTH_UPLOAD = 0x300000 + 16;\n\tvar CONTENT_LENGTH_UPLOAD_T = 0x300000 + 16;\n\tvar STARTTRANSFER_TIME = 0x300000 + 17;\n\tvar CONTENT_TYPE = 0x100000 + 18;\n\tvar REDIRECT_TIME = 0x300000 + 19;\n\tvar REDIRECT_COUNT = 0x200000 + 20;\n\tvar PRIVATE = 0x100000 + 21;\n\tvar HTTP_CONNECTCODE = 0x200000 + 22;\n\tvar HTTPAUTH_AVAIL = 0x200000 + 23;\n\tvar PROXYAUTH_AVAIL = 0x200000 + 24;\n\tvar OS_ERRNO = 0x200000 + 25;\n\tvar NUM_CONNECTS = 0x200000 + 26;\n\tvar SSL_ENGINES = 0x400000 + 27;\n\tvar COOKIELIST = 0x400000 + 28;\n\tvar LASTSOCKET = 0x200000 + 29;\n\tvar FTP_ENTRY_PATH = 0x100000 + 30;\n\tvar REDIRECT_URL = 0x100000 + 31;\n\tvar PRIMARY_IP = 0x100000 + 32;\n\tvar APPCONNECT_TIME = 0x300000 + 33;\n\tvar CERTINFO = 0x400000 + 34;\n\tvar CONDITION_UNMET = 0x200000 + 35;\n\tvar RTSP_SESSION_ID = 0x100000 + 36;\n\tvar RTSP_CLIENT_CSEQ = 0x200000 + 37;\n\tvar RTSP_SERVER_CSEQ = 0x200000 + 38;\n\tvar RTSP_CSEQ_RECV = 0x200000 + 39;\n\tvar PRIMARY_PORT = 0x200000 + 40;\n\tvar LOCAL_IP = 0x100000 + 41;\n\tvar LOCAL_PORT = 0x200000 + 42;\n\tvar TLS_SESSION = 0x400000 + 43;\n\tvar ACTIVESOCKET = 0x500000 + 44;\n\tvar TLS_SSL_PTR = 0x400000 + 45;\n\tvar HTTP_VERSION = 0x200000 + 46;\n\tvar PROXY_SSL_VERIFYRESULT = 0x200000 + 47;\n\tvar PROTOCOL = 0x200000 + 48;\n\tvar SCHEME = 0x100000 + 49;\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLMulti.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.net.curl.CURL)\n@:access(lime.net.curl.CURLMultiMessage)\nclass CURLMulti\n{\n\tpublic var runningHandles(get, never):Int;\n\n\t@:noCompletion private var handle:CFFIPointer;\n\t#if hl\n\t@:noCompletion private var infoObject:CURLMultiMessage;\n\t#end\n\n\tpublic function new(handle:CFFIPointer = null)\n\t{\n\t\tif (handle != null)\n\t\t{\n\t\t\tthis.handle = handle;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t#if (lime_cffi && lime_curl && !macro)\n\t\t\tthis.handle = NativeCFFI.lime_curl_multi_init();\n\t\t\t#end\n\t\t}\n\n\t\t#if hl\n\t\tinfoObject = new CURLMultiMessage(null, 0);\n\t\t#end\n\t}\n\n\tpublic function addHandle(curl:CURL):CURLMultiCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_multi_add_handle(handle, curl, curl.handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function infoRead():CURLMultiMessage\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\tvar msg:Dynamic = NativeCFFI.lime_curl_multi_info_read(handle #if hl, infoObject #end);\n\n\t\tif (msg != null)\n\t\t{\n\t\t\treturn new CURLMultiMessage(msg.curl, msg.result);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic function perform():CURLMultiCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_multi_perform(handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function removeHandle(curl:CURL):CURLMultiCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_multi_remove_handle(handle, curl.handle);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function setOption(option:CURLMultiOption, parameter:Dynamic):CURLMultiCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_multi_setopt(handle, option, parameter);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tpublic function wait(timeoutMS:Int):CURLMultiCode\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn cast NativeCFFI.lime_curl_multi_wait(handle, timeoutMS);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_runningHandles():Int\n\t{\n\t\t#if (lime_cffi && lime_curl && !macro)\n\t\treturn NativeCFFI.lime_curl_multi_get_running_handles(handle);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLMultiCode.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CURLMultiCode(Int) from Int to Int from UInt /*to UInt*/\n{\n\t/* please call curl_multi_perform() or curl_multi_socket*() soon */\n\tvar CALL_MULTI_PERFORM = -1;\n\tvar OK = 0;\n\t/* the passed-in handle is not a valid CURLM handle */\n\tvar BAD_HANDLE = 1;\n\t/* an easy handle was not good/valid */\n\tvar BAD_EASY_HANDLE = 2;\n\t/* if you ever get this, you're in trouble */\n\tvar OUT_OF_MEMORY = 3;\n\t/* this is a libcurl bug */\n\tvar INTERNAL_ERROR = 4;\n\t/* the passed in socket argument did not match */\n\tvar BAD_SOCKET = 5;\n\t/* curl_multi_setopt() with unsupported option */\n\tvar UNKNOWN_OPTION = 6;\n\t/* an easy handle already added to a multi handle was attempted to get added - again */\n\tvar ADDED_ALREADY = 7;\n\t// LAST\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLMultiMessage.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\nclass CURLMultiMessage\n{\n\tpublic var curl:CURL;\n\tpublic var result:CURLCode;\n\n\t@:noCompletion private function new(curl:CURL, result:CURLCode)\n\t{\n\t\tthis.curl = curl;\n\t\tthis.result = result;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLMultiOption.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CURLMultiOption(Int) from Int to Int from UInt to UInt\n{\n\t/* This is the socket callback function pointer */\n\tvar SOCKETFUNCTION = 200001;\n\t/* This is the argument passed to the socket callback */\n\tvar SOCKETDATA = 100002;\n\t/* set to 1 to enable pipelining for this multi handle */\n\tvar PIPELINING = 3;\n\t/* This is the timer callback function pointer */\n\tvar TIMERFUNCTION = 20004;\n\t/* This is the argument passed to the timer callback */\n\tvar TIMERDATA = 10005;\n\t/* maximum number of entries in the connection cache */\n\tvar MAXCONNECTS = 6;\n\t/* maximum number of (pipelining) connections to one host */\n\tvar MAX_HOST_CONNECTIONS = 7;\n\t/* maximum number of requests in a pipeline */\n\tvar MAX_PIPELINE_LENGTH = 8;\n\t/* a connection with a content-length longer than this\n\t\twill not be considered for pipelining */\n\tvar CONTENT_LENGTH_PENALTY_SIZE = 30009;\n\t/* a connection with a chunk length longer than this\n\t\twill not be considered for pipelining */\n\tvar CHUNK_LENGTH_PENALTY_SIZE = 30010;\n\t/* a list of site names(+port) that are blacklisted from\n\t\tpipelining */\n\tvar PIPELINING_SITE_BL = 10011;\n\t/* a list of server types that are blacklisted from\n\t\tpipelining */\n\tvar PIPELINING_SERVER_BL = 10012;\n\t/* maximum number of open connections in total */\n\tvar MAX_TOTAL_CONNECTIONS = 13;\n\t/* This is the server push callback function pointer */\n\tvar PUSHFUNCTION = 20014;\n\t/* This is the argument passed to the server push callback */\n\tvar PUSHDATA = 10015;\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLOption.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CURLOption(Int) from Int to Int from UInt to UInt\n{\n\t// var FILE = 10001;\n\t// var WRITEDATA = 10001;\n\tvar URL = 10002;\n\tvar PORT = 3;\n\tvar PROXY = 10004;\n\tvar USERPWD = 10005;\n\tvar PROXYUSERPWD = 10006;\n\tvar RANGE = 10007;\n\tvar INFILE = 10009;\n\tvar READDATA = 10009;\n\tvar ERRORBUFFER = 10010;\n\tvar WRITEFUNCTION = 20011;\n\tvar READFUNCTION = 20012;\n\tvar TIMEOUT = 13;\n\tvar INFILESIZE = 14;\n\tvar POSTFIELDS = 10015;\n\tvar REFERER = 10016;\n\tvar FTPPORT = 10017;\n\tvar USERAGENT = 10018;\n\tvar LOW_SPEED_LIMIT = 19;\n\tvar LOW_SPEED_TIME = 20;\n\tvar RESUME_FROM = 21;\n\tvar COOKIE = 22;\n\tvar HTTPHEADER = 10023;\n\tvar RTSPHEADER = 10023;\n\tvar HTTPPOST = 10024;\n\tvar SSLCERT = 10025;\n\tvar KEYPASSWD = 10026;\n\tvar CRLF = 27;\n\tvar QUOTE = 10028;\n\tvar WRITEHEADER = 10029;\n\tvar HEADERDATA = 10029;\n\tvar COOKIEFILE = 10031;\n\tvar SSLVERSION = 32;\n\tvar TIMECONDITION = 33;\n\tvar TIMEVALUE = 34;\n\tvar CUSTOMREQUEST = 10036;\n\tvar STDERR = 10037;\n\tvar POSTQUOTE = 10039;\n\tvar WRITEINFO = 10040;\n\tvar VERBOSE = 41;\n\tvar HEADER = 42;\n\tvar NOPROGRESS = 43;\n\tvar NOBODY = 44;\n\tvar FAILONERROR = 45;\n\tvar UPLOAD = 46;\n\tvar POST = 47;\n\tvar DIRLISTONLY = 48;\n\tvar APPEND = 50;\n\tvar NETRC = 51;\n\tvar FOLLOWLOCATION = 52;\n\tvar TRANSFERTEXT = 53;\n\tvar PUT = 54;\n\tvar PROGRESSFUNCTION = 20056;\n\tvar PROGRESSDATA = 10057;\n\tvar XFERINFODATA = 10057;\n\tvar AUTOREFERER = 58;\n\tvar PROXYPORT = 59;\n\tvar POSTFIELDSIZE = 60;\n\tvar HTTPPROXYTUNNEL = 61;\n\tvar INTERFACE = 10062;\n\tvar KRBLEVEL = 10063;\n\tvar SSL_VERIFYPEER = 64;\n\tvar CAINFO = 10065;\n\tvar MAXREDIRS = 68;\n\tvar FILETIME = 69;\n\tvar TELNETOPTIONS = 10070;\n\tvar MAXCONNECTS = 71;\n\tvar CLOSEPOLICY = 72;\n\tvar FRESH_CONNECT = 74;\n\tvar FORBID_REUSE = 75;\n\tvar RANDOM_FILE = 10076;\n\tvar EGDSOCKET = 10077;\n\tvar CONNECTTIMEOUT = 78;\n\tvar HEADERFUNCTION = 20079;\n\tvar HTTPGET = 80;\n\tvar SSL_VERIFYHOST = 81;\n\tvar COOKIEJAR = 10082;\n\tvar SSL_CIPHER_LIST = 10083;\n\tvar HTTP_VERSION = 84;\n\tvar FTP_USE_EPSV = 85;\n\tvar SSLCERTTYPE = 10086;\n\tvar SSLKEY = 10087;\n\tvar SSLKEYTYPE = 10088;\n\tvar SSLENGINE = 10089;\n\tvar SSLENGINE_DEFAULT = 90;\n\tvar DNS_USE_GLOBAL_CACHE = 91;\n\tvar DNS_CACHE_TIMEOUT = 92;\n\tvar PREQUOTE = 10093;\n\tvar DEBUGFUNCTION = 20094;\n\tvar DEBUGDATA = 10095;\n\tvar COOKIESESSION = 96;\n\tvar CAPATH = 10097;\n\tvar BUFFERSIZE = 98;\n\tvar NOSIGNAL = 99;\n\tvar SHARE = 10100;\n\tvar PROXYTYPE = 101;\n\tvar ACCEPT_ENCODING = 10102;\n\tvar PRIVATE = 10103;\n\tvar HTTP200ALIASES = 10104;\n\tvar UNRESTRICTED_AUTH = 105;\n\tvar FTP_USE_EPRT = 106;\n\tvar HTTPAUTH = 107;\n\tvar SSL_CTX_FUNCTION = 20108;\n\tvar SSL_CTX_DATA = 10109;\n\tvar FTP_CREATE_MISSING_DIRS = 110;\n\tvar PROXYAUTH = 111;\n\tvar FTP_RESPONSE_TIMEOUT = 112;\n\tvar SERVER_RESPONSE_TIMEOUT = 112;\n\tvar IPRESOLVE = 113;\n\tvar MAXFILESIZE = 114;\n\tvar INFILESIZE_LARGE = 30115;\n\tvar RESUME_FROM_LARGE = 30116;\n\tvar MAXFILESIZE_LARGE = 30117;\n\tvar NETRC_FILE = 10118;\n\tvar USE_SSL = 119;\n\tvar POSTFIELDSIZE_LARGE = 30120;\n\tvar TCP_NODELAY = 121;\n\tvar FTPSSLAUTH = 129;\n\tvar IOCTLFUNCTION = 20130;\n\tvar IOCTLDATA = 10131;\n\tvar FTP_ACCOUNT = 10134;\n\tvar COOKIELIST = 10135;\n\tvar IGNORE_CONTENT_LENGTH = 10136;\n\tvar FTP_SKIP_PASV_IP = 137;\n\tvar FTP_FILEMETHOD = 138;\n\tvar LOCALPORT = 139;\n\tvar LOCALPORTRANGE = 140;\n\tvar CONNECT_ONLY = 141;\n\tvar CONV_FROM_NETWORK_FUNCTION = 20142;\n\tvar CONV_TO_NETWORK_FUNCTION = 20143;\n\tvar CONV_FROM_UTF8_FUNCTION = 20144;\n\tvar MAX_SEND_SPEED_LARGE = 30145;\n\tvar MAX_RECV_SPEED_LARGE = 30146;\n\tvar FTP_ALTERNATIVE_TO_USER = 10147;\n\tvar SOCKOPTFUNCTION = 20148;\n\tvar SOCKOPTDATA = 10149;\n\tvar SSL_SESSIONID_CACHE = 150;\n\tvar SSH_AUTH_TYPES = 151;\n\tvar SSH_PUBLIC_KEYFILE = 10152;\n\tvar SSH_PRIVATE_KEYFILE = 10153;\n\tvar FTP_SSL_CCC = 154;\n\tvar TIMEOUT_MS = 155;\n\tvar CONNECTTIMEOUT_MS = 156;\n\tvar HTTP_TRANSFER_DECODING = 157;\n\tvar HTTP_CONTENT_DECODING = 158;\n\tvar NEW_FILE_PERMS = 159;\n\tvar NEW_DIRECTORY_PERMS = 160;\n\tvar POSTREDIR = 161;\n\tvar SSH_HOST_PUBLIC_KEY_MD5 = 10162;\n\tvar OPENSOCKETFUNCTION = 20163;\n\tvar OPENSOCKETDATA = 10164;\n\tvar COPYPOSTFIELDS = 10165;\n\tvar PROXY_TRANSFER_MODE = 166;\n\tvar SEEKFUNCTION = 20167;\n\tvar SEEKDATA = 10168;\n\tvar CRLFILE = 10169;\n\tvar ISSUERCERT = 10170;\n\tvar ADDRESS_SCOPE = 171;\n\tvar CERTINFO = 172;\n\tvar USERNAME = 10173;\n\tvar PASSWORD = 10174;\n\tvar PROXYUSERNAME = 10175;\n\tvar PROXYPASSWORD = 10176;\n\tvar NOPROXY = 10177;\n\tvar TFTP_BLKSIZE = 178;\n\tvar SOCKS5_GSSAPI_SERVICE = 10179;\n\tvar SOCKS5_GSSAPI_NEC = 180;\n\tvar PROTOCOLS = 181;\n\tvar REDIR_PROTOCOLS = 182;\n\tvar SSH_KNOWNHOSTS = 10183;\n\tvar SSH_KEYFUNCTION = 20184;\n\tvar SSH_KEYDATA = 10185;\n\tvar MAIL_FROM = 10186;\n\tvar MAIL_RCPT = 10187;\n\tvar FTP_USE_PRET = 188;\n\tvar RTSP_REQUEST = 189;\n\tvar RTSP_SESSION_ID = 10190;\n\tvar RTSP_STREAM_URI = 10191;\n\tvar RTSP_TRANSPORT = 10192;\n\tvar RTSP_CLIENT_CSEQ = 193;\n\tvar RTSP_SERVER_CSEQ = 194;\n\tvar INTERLEAVEDATA = 10195;\n\tvar INTERLEAVEFUNCTION = 20196;\n\tvar WILDCARDMATCH = 197;\n\tvar CHUNK_BGN_FUNCTION = 20198;\n\tvar CHUNK_END_FUNCTION = 20199;\n\tvar FNMATCH_FUNCTION = 20200;\n\tvar CHUNK_DATA = 10201;\n\tvar FNMATCH_DATA = 10202;\n\tvar RESOLVE = 10203;\n\tvar TLSAUTH_USERNAME = 10204;\n\tvar TLSAUTH_PASSWORD = 10205;\n\tvar TLSAUTH_TYPE = 10206;\n\tvar TRANSFER_ENCODING = 207;\n\tvar CLOSESOCKETFUNCTION = 20208;\n\tvar CLOSESOCKETDATA = 10209;\n\tvar GSSAPI_DELEGATION = 210;\n\tvar DNS_SERVERS = 10211;\n\tvar ACCEPTTIMEOUT_MS = 212;\n\tvar TCP_KEEPALIVE = 213;\n\tvar TCP_KEEPIDLE = 214;\n\tvar TCP_KEEPINTVL = 215;\n\tvar SSL_OPTIONS = 216;\n\tvar MAIL_AUTH = 10217;\n\tvar SASL_IR = 218;\n\tvar XFERINFOFUNCTION = 20219;\n\tvar XOAUTH2_BEARER = 10220;\n\tvar DNS_INTERFACE = 10221;\n\tvar DNS_LOCAL_IP4 = 10222;\n\tvar DNS_LOCAL_IP6 = 10223;\n\tvar LOGIN_OPTIONS = 10224;\n\tvar SSL_ENABLE_NPN = 225;\n\tvar SSL_ENABLE_ALPN = 226;\n\tvar EXPECT_100_TIMEOUT_MS = 227;\n\tvar PROXYHEADER = 10228;\n\tvar HEADEROPT = 229;\n\tvar PINNEDPUBLICKEY = 10230;\n\tvar UNIX_SOCKET_PATH = 10231;\n\tvar SSL_VERIFYSTATUS = 232;\n\tvar SSL_FALSESTART = 233;\n\tvar PATH_AS_IS = 234;\n\tvar PROXY_SERVICE_NAME = 10235;\n\tvar SERVICE_NAME = 10236;\n\tvar PIPEWAIT = 237;\n\tvar DEFAULT_PROTOCOL = 10238;\n\tvar STREAM_WEIGHT = 239;\n\tvar STREAM_DEPENDS = 10240;\n\tvar STREAM_DEPENDS_E = 10241;\n\tvar TFTP_NO_OPTIONS = 242;\n\tvar CONNECT_TO = 243;\n\tvar TCP_FASTOPEN = 244;\n\tvar KEEP_SENDING_ON_ERROR = 245;\n\tvar PROXY_CAINFO = 10246;\n\tvar PROXY_CAPATH = 10247;\n\tvar PROXY_SSL_VERIFYPEER = 248;\n\tvar PROXY_SSL_VERIFYHOST = 249;\n\tvar PROXY_SSLVERSION = 250;\n\tvar PROXY_TLSAUTH_USERNAME = 10251;\n\tvar PROXY_TLSAUTH_PASSWORD = 10252;\n\tvar PROXY_TLSAUTH_TYPE = 10253;\n\tvar PROXY_SSLCERT = 10254;\n\tvar PROXY_SSLCERTTYPE = 10255;\n\tvar PROXY_SSLKEY = 10256;\n\tvar PROXY_SSLKEYTYPE = 10257;\n\tvar PROXY_KEYPASSWD = 10258;\n\tvar PROXY_SSL_CIPHER_LIST = 10259;\n\tvar PROXY_CRLFILE = 10260;\n\tvar PROXY_SSL_OPTIONS = 261;\n\tvar PRE_PROXY = 10262;\n\tvar PROXY_PINNEDPUBLICKEY = 10263;\n\tvar ABSTRACT_UNIX_SOCKET = 10264;\n\tvar SUPPRESS_CONNECT_HEADERS = 265;\n\tvar REQUEST_TARGET = 10266;\n\tvar SOCKS5_AUTH = 267;\n\tvar SSH_COMPRESSION = 268;\n\tvar MIMEPOST = 10269;\n}\n#end\n"
  },
  {
    "path": "src/lime/net/curl/CURLVersion.hx",
    "content": "package lime.net.curl;\n\n#if (!lime_doc_gen || lime_curl)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract CURLVersion(Int) from Int to Int from UInt to UInt\n{\n\tvar FIRST = 0;\n\tvar SECOND = 1;\n\tvar THIRD = 2;\n\tvar FOURTH = 3;\n\t// var LAST = 4;\n}\n#end\n"
  },
  {
    "path": "src/lime/net/oauth/OAuthClient.hx",
    "content": "package lime.net.oauth;\n\nimport haxe.crypto.Sha1;\n\n// import lime.net.URLRequestMethod;\n// import lime.net.URLRequest;\nclass OAuthClient\n{\n\tpublic var version:OAuthVersion;\n\tpublic var consumer:OAuthConsumer;\n\n\tpublic function new(version:OAuthVersion, consumer:OAuthConsumer)\n\t{\n\t\tthis.version = version;\n\t\tthis.consumer = consumer;\n\t}\n\n\t// public function createRequest (method:URLRequestMethod, url:String):URLRequest {\n\t//\n\t// var parameters = new Map<String, String>();\n\t//\n\t// parameters.set(\"oauth_version\", Std.string(version));\n\t// parameters.set(\"oauth_signature_method\", Std.string(OAuthSignatureMethod.HMAC_SHA1));\n\t// parameters.set(\"oauth_nonce\", generateNonce ());\n\t// parameters.set(\"oauth_timestamp\", Std.string(Std.int(Date.now ().getTime () / 1000)));\n\t// parameters.set(\"oauth_consumer_key\", consumer.key);\n\t//\n\t// var oauth = new OAuthRequest (version, method, url, parameters);\n\t// if(version == V1) oauth.sign (consumer, OAuthSignatureMethod.HMAC_SHA1);\n\t// oauth.request.requestHeaders.push(oauth.getHeader());\n\t// return oauth.request;\n\t//\n\t// }\n\tpublic function generateNonce():String\n\t{\n\t\treturn Sha1.encode(Std.string(Math.random()));\n\t}\n}\n"
  },
  {
    "path": "src/lime/net/oauth/OAuthConsumer.hx",
    "content": "package lime.net.oauth;\n\nclass OAuthConsumer\n{\n\tpublic var key:String;\n\tpublic var secret:String;\n\n\tpublic function new(key:String, secret:String)\n\t{\n\t\tthis.key = key;\n\t\tthis.secret = secret;\n\t}\n}\n"
  },
  {
    "path": "src/lime/net/oauth/OAuthRequest.hx",
    "content": "package lime.net.oauth;\n\n// import haxe.crypto.Base64;\n// import haxe.crypto.Hmac;\n// import haxe.io.Bytes;\n// import lime.net.URLRequestMethod;\n// import lime.net.URLRequestHeader;\n// import lime.net.URLRequest;\n// import lime.net.URIParser;\n// import lime.net.oauth.OAuthToken;\n//\n// using StringTools;\n//\n// class OAuthRequest {\n//\n// public var version:OAuthVersion = V1;\n// public var parameters:Map<String, String>;\n// public var request:URLRequest;\n//\n// private var uri:URIParser;\n//\n//\n// public function new (version:OAuthVersion = V1, method:URLRequestMethod, url:String, parameters:Map<String, String>) {\n//\n// this.version = version;\n// request = new URLRequest();\n// request.url = url;\n// request.method = cast method;\n// this.parameters = parameters;\n//\n// uri = new URIParser(url);\n//\n// }\n//\n//\n// public function getHeader ():URLRequestHeader {\n//\n// var result = \"\";\n//\n// switch(version) {\n//\n// case V1:\n// result = \"OAuth \";\n//\n// var keys = parameters.keys();\n// for(key in keys) {\n// result += '${key.urlEncode()}=\"${parameters.get(key).urlEncode()}\"';\n// if(keys.hasNext()) {\n// result += \", \";\n// }\n// }\n//\n// case V2:\n//// TODO\n// }\n//\n// return new URLRequestHeader(\"Authorization\", result);\n//\n// }\n//\n///**\n//* Signs the petition, only for OAuth 1.0\n//*/\n// public function sign (consumer:OAuthConsumer, ?accessToken:OAuth1AccessToken, ?signatureMethod:OAuthSignatureMethod = HMAC_SHA1):Void {\n//\n// var key = consumer.secret.urlEncode() + \"&\";\n// if(accessToken != null) {\n// key += accessToken.secret == null ? \"\" : accessToken.secret.urlEncode();\n// }\n// var message = request.method + \"&\" + normalizeURI() + \"&\" + normalizeParameters();\n// var hash = new Hmac (SHA1);\n// var bytes = hash.make (Bytes.ofString (key), Bytes.ofString (message));\n//\n// parameters.set(\"oauth_signature\", Base64.encode (bytes));\n// }\n//\n//// SIGNING FUNCTIONS\n//\n///**\n//* Prepares the message parameters for the signing process\n//*/\n// private function normalizeParameters():String {\n//\n// var result = new Array<KVPair>();\n//\n// if(uri.queryArray != null) {\n// result = result.concat(uri.queryArray);\n// }\n//// TODO add data if POST\n//\n// for(key in parameters.keys()) {\n//\n// if(key == \"realm\") continue;\n// result.push( { k: key, v: parameters.get(key) } );\n//\n// }\n//\n// result.sort(OAuthSort);\n//\n// return result.map(function(p:KVPair) return p.k.urlEncode()+\"=\"+p.v.urlEncode()).join(\"&\").urlEncode();\n// }\n//\n// private function normalizeURI():String {\n// var scheme = uri.protocol == null ? \"https\" : uri.protocol.toLowerCase();\n// var authority = uri.authority.toLowerCase();\n// var port = (scheme == \"https\" || scheme == \"http\") ? null : uri.port;\n// var path = uri.path;\n// var result = (scheme + \"://\" + authority + (port == null ? \"\" : \":\" + port) + path);\n// return result.urlEncode();\n// }\n//\n///**\n//* Parameters are sorted by name, using lexicographical byte value ordering.\n//* If two or more parameters share the same name, they are sorted by their value.\n//*/\n// private function OAuthSort(a:KVPair, b:KVPair) {\n// return if(a.k < b.k) -1 else if (a.k > b.k) 1 else if (a.v < b.v) -1 else 1;\n// }\n//\n// }\n//\n//\n// typedef KVPair = {k:String, v:String};\n"
  },
  {
    "path": "src/lime/net/oauth/OAuthSignatureMethod.hx",
    "content": "package lime.net.oauth;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract OAuthSignatureMethod(String)\n{\n\t// var PLAINTEXT = \"PLAINTEXT\";\n\tvar HMAC_SHA1 = \"HMAC-SHA1\";\n\t// var RSA_SHA1 = \"RSA-SHA1\";\n}\n"
  },
  {
    "path": "src/lime/net/oauth/OAuthToken.hx",
    "content": "package lime.net.oauth;\n\nclass RequestToken\n{\n\tpublic var token(default, null):String;\n\tpublic var secret(default, null):String;\n\n\tpublic function new(token:String, secret:String)\n\t{\n\t\tthis.token = token;\n\t\tthis.secret = secret;\n\t}\n}\n\nclass AccessToken\n{\n\tpublic var token(default, null):String;\n\n\tpublic function new(token:String)\n\t{\n\t\tthis.token = token;\n\t}\n}\n\nclass OAuth1AccessToken extends AccessToken\n{\n\tpublic var secret(default, null):String;\n\n\tpublic function new(token:String, ?secret:String)\n\t{\n\t\tsuper(token);\n\t\tthis.secret = secret;\n\t}\n}\n\nclass OAuth2AccessToken extends AccessToken\n{\n\tpublic var expires(default, null):Int = -1;\n\n\tpublic function new(token:String, ?expires:Int)\n\t{\n\t\tsuper(token);\n\t\tthis.expires = expires;\n\t}\n}\n\nclass RefreshToken\n{\n\tpublic var token(default, null):String;\n\n\tpublic function new(token:String)\n\t{\n\t\tthis.token = token;\n\t}\n}\n"
  },
  {
    "path": "src/lime/net/oauth/OAuthVersion.hx",
    "content": "package lime.net.oauth;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract OAuthVersion(String)\n{\n\tvar V1 = \"1.0\";\n\tvar V2 = \"2.0\";\n}\n"
  },
  {
    "path": "src/lime/system/BackgroundWorker.hx",
    "content": "package lime.system;\n\nimport lime.app.Application;\nimport lime.app.Event;\n#if sys\n#if haxe4\nimport sys.thread.Deque;\nimport sys.thread.Thread;\n#elseif cpp\nimport cpp.vm.Deque;\nimport cpp.vm.Thread;\n#elseif neko\nimport neko.vm.Deque;\nimport neko.vm.Thread;\n#end\n#end\n\n/**\n\tA `BackgroundWorker` allows the execution of a function on a background thread, \n\tavoiding the blocking of the main thread. This is particularly useful for long-running \n\toperations like file I/O, network requests, or computationally intensive tasks.\n\n\t### Notes:\n\t- **Thread Support:** Only system targets (such as C++, Neko) support threading. \n\t- **Events:** The class uses the `Event` class to dispatch completion, error, \n\t  and progress notifications.\n\t\n\t@see `ThreadPool` for more advanced threading capabilities, including thread \n\tsafety, HTML5 threads, and more robust handling of tasks.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass BackgroundWorker\n{\n\tprivate static var MESSAGE_COMPLETE = \"__COMPLETE__\";\n\tprivate static var MESSAGE_ERROR = \"__ERROR__\";\n\n\t/**\n\t\tIndicates whether the worker has been canceled.\n\t**/\n\tpublic var canceled(default, null):Bool;\n\n\t/**\n\t\tIndicates whether the worker has completed its task.\n\t**/\n\tpublic var completed(default, null):Bool;\n\n\t/**\n\t\tDispatched when the worker is about to perform its task.\n\t\tThe function to execute should be added as a listener to this event.\n\t**/\n\tpublic var doWork = new Event<Dynamic->Void>();\n\n\t/**\n\t\tDispatched when the worker has successfully completed its task.\n\t**/\n\tpublic var onComplete = new Event<Dynamic->Void>();\n\n\t/**\n\t\tDispatched if an error occurs during the execution of the worker's task.\n\t**/\n\tpublic var onError = new Event<Dynamic->Void>();\n\t\n\t/**\n\t\tDispatched periodically during the worker's task to provide progress updates.\n\t**/\n\tpublic var onProgress = new Event<Dynamic->Void>();\n\n\t@:noCompletion private var __runMessage:Dynamic;\n\t#if (cpp || neko || (haxe4 && hl))\n\t@:noCompletion private var __messageQueue:Deque<Dynamic>;\n\t@:noCompletion private var __workerThread:Thread;\n\t#end\n\n\t/**\n\t\tCreates a new `BackgroundWorker` instance.\n\t**/\n\tpublic function new() {}\n\n\t/**\n\t\tCancels the worker's task if it is still running. This won't stop the thread \n\t\timmediately.\n\t**/\n\tpublic function cancel():Void\n\t{\n\t\tcanceled = true;\n\n\t\t#if (cpp || neko || (haxe4 && hl))\n\t\t__workerThread = null;\n\t\t#end\n\t}\n\n\t/**\n\t\tStarts the worker's task, optionally passing a message to the task.\n\t\t@param message An optional message to pass to the worker's task.\n\t**/\n\tpublic function run(message:Dynamic = null):Void\n\t{\n\t\tcanceled = false;\n\t\tcompleted = false;\n\t\t__runMessage = message;\n\n\t\t#if (cpp || neko || (haxe4 && hl))\n\t\t__messageQueue = new Deque<Dynamic>();\n\t\t__workerThread = Thread.create(__doWork);\n\n\t\t// TODO: Better way to do this\n\n\t\tif (Application.current != null)\n\t\t{\n\t\t\tApplication.current.onUpdate.add(__update);\n\t\t}\n\t\t#else\n\t\t__doWork();\n\t\t#end\n\t}\n\n\t/**\n\t\tSends a completion message, indicating that the worker has finished its task.\n\t\t@param message An optional message to pass to the `onComplete` event.\n\t**/\n\tpublic function sendComplete(message:Dynamic = null):Void\n\t{\n\t\tcompleted = true;\n\n\t\t#if (cpp || neko || (haxe4 && hl))\n\t\t__messageQueue.add(MESSAGE_COMPLETE);\n\t\t__messageQueue.add(message);\n\t\t#else\n\t\tif (!canceled)\n\t\t{\n\t\t\tcanceled = true;\n\t\t\tonComplete.dispatch(message);\n\t\t}\n\t\t#end\n\t}\n\n\t/**\n\t\tSends an error message, indicating that an error occurred during the worker's task.\n\t\t@param message An optional message to pass to the `onError` event.\n\t**/\n\tpublic function sendError(message:Dynamic = null):Void\n\t{\n\t\t#if (cpp || neko || (haxe4 && hl))\n\t\t__messageQueue.add(MESSAGE_ERROR);\n\t\t__messageQueue.add(message);\n\t\t#else\n\t\tif (!canceled)\n\t\t{\n\t\t\tcanceled = true;\n\t\t\tonError.dispatch(message);\n\t\t}\n\t\t#end\n\t}\n\t\n\t/**\n\t\tSends a progress update message.\n\t\t@param message An optional message to pass to the `onProgress` event.\n\t**/\n\tpublic function sendProgress(message:Dynamic = null):Void\n\t{\n\t\t#if (cpp || neko || (haxe4 && hl))\n\t\t__messageQueue.add(message);\n\t\t#else\n\t\tif (!canceled)\n\t\t{\n\t\t\tonProgress.dispatch(message);\n\t\t}\n\t\t#end\n\t}\n\n\t@:noCompletion private function __doWork():Void\n\t{\n\t\tdoWork.dispatch(__runMessage);\n\n\t\t// #if (cpp || neko)\n\t\t//\n\t\t// __messageQueue.add (MESSAGE_COMPLETE);\n\t\t//\n\t\t// #else\n\t\t//\n\t\t// if (!canceled) {\n\t\t//\n\t\t// canceled = true;\n\t\t// onComplete.dispatch (null);\n\t\t//\n\t\t// }\n\t\t//\n\t\t// #end\n\t}\n\n\t@:noCompletion private function __update(deltaTime:Int):Void\n\t{\n\t\t#if (cpp || neko || (haxe4 && hl))\n\t\tvar message = __messageQueue.pop(false);\n\n\t\tif (message != null)\n\t\t{\n\t\t\tif (message == MESSAGE_ERROR)\n\t\t\t{\n\t\t\t\tApplication.current.onUpdate.remove(__update);\n\n\t\t\t\tif (!canceled)\n\t\t\t\t{\n\t\t\t\t\tcanceled = true;\n\t\t\t\t\tonError.dispatch(__messageQueue.pop(false));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (message == MESSAGE_COMPLETE)\n\t\t\t{\n\t\t\t\tApplication.current.onUpdate.remove(__update);\n\n\t\t\t\tif (!canceled)\n\t\t\t\t{\n\t\t\t\t\tcanceled = true;\n\t\t\t\t\tonComplete.dispatch(__messageQueue.pop(false));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!canceled)\n\t\t\t\t{\n\t\t\t\t\tonProgress.dispatch(message);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/system/CFFI.hx",
    "content": "package lime.system;\n\n#if (!lime_doc_gen || lime_cffi)\nimport haxe.io.Path;\nimport lime._internal.macros.CFFIMacro;\n#if (sys && !macro)\nimport sys.io.Process;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass CFFI\n{\n\t@:noCompletion private static var __moduleNames:Map<String, String> = null;\n\t#if neko\n\tprivate static var __loadedNekoAPI:Bool;\n\t#elseif nodejs\n\tprivate static var __nodeNDLLModule:Dynamic;\n\t#end\n\tpublic static var available:Bool;\n\tpublic static var enabled:Bool;\n\n\tprivate static function __init__():Void\n\t{\n\t\t#if lime_cffi\n\t\tavailable = true;\n\t\tenabled = #if disable_cffi false; #else true; #end\n\t\t#else\n\t\tavailable = false;\n\t\tenabled = false;\n\t\t#end\n\t}\n\n\t#if macro\n\tpublic static function build(defaultLibrary:String = \"lime\")\n\t{\n\t\treturn CFFIMacro.build(defaultLibrary);\n\t}\n\t#end\n\n\t/**\n\t * Tries to load a native CFFI primitive on compatible platforms\n\t * @param\tlibrary\tThe name of the native library (such as \"lime\")\n\t * @param\tmethod\tThe exported primitive method name\n\t * @param\targs\tThe number of arguments\n\t * @param\tlazy\tWhether to load the symbol immediately, or to allow lazy loading\n\t * @return\tThe loaded method\n\t */\n\tpublic static function load(library:String, method:String, args:Int = 0, lazy:Bool = false):Dynamic\n\t{\n\t\t#if (disable_cffi || macro || hl)\n\t\tvar enabled = false;\n\t\t#end\n\n\t\t#if optional_cffi\n\t\tif (library != \"lime\" || method != \"neko_init\")\n\t\t{\n\t\t\tlazy = true;\n\t\t}\n\t\t#end\n\n\t\tif (!enabled)\n\t\t{\n\t\t\treturn Reflect.makeVarArgs(function(__) return {});\n\t\t}\n\n\t\tvar result:Dynamic = null;\n\n\t\t#if (!disable_cffi && !macro)\n\t\t#if (sys && !html5)\n\t\tif (__moduleNames == null) __moduleNames = new Map<String, String>();\n\n\t\tif (lazy)\n\t\t{\n\t\t\t__moduleNames.set(library, library);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\t#if neko\n\t\t\t\tresult = neko.Lib.loadLazy(library, method, args);\n\t\t\t\t#elseif java\n\t\t\t\tresult = __loadJava(library, method, args);\n\t\t\t\t#elseif cpp\n\t\t\t\tresult = cpp.Lib.loadLazy(library, method, args);\n\t\t\t\t#end\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t#if (cpp && (iphone || webassembly || android || static_link || tvos))\n\t\t\treturn cpp.Lib.load(library, method, args);\n\t\t\t#end\n\n\t\t\tif (__moduleNames.exists(library))\n\t\t\t{\n\t\t\t\t#if cpp\n\t\t\t\treturn cpp.Lib.load(__moduleNames.get(library), method, args);\n\t\t\t\t#elseif neko\n\t\t\t\t#if neko_cffi_trace\n\t\t\t\tvar result:Dynamic = neko.Lib.load(__moduleNames.get(library), method, args);\n\t\t\t\tif (result == null) return null;\n\n\t\t\t\treturn Reflect.makeVarArgs(function(args)\n\t\t\t\t{\n\t\t\t\t\ttrace(\"Called \" + library + \"@\" + method);\n\t\t\t\t\treturn Reflect.callMethod(result, result, args);\n\t\t\t\t});\n\t\t\t\t#else\n\t\t\t\treturn neko.Lib.load(__moduleNames.get(library), method, args);\n\t\t\t\t#end\n\t\t\t\t#elseif nodejs\n\t\t\t\treturn untyped __nodeNDLLModule.load_lib(__moduleNames.get(library), method, args);\n\t\t\t\t#elseif java\n\t\t\t\tresult = __loadJava(__moduleNames.get(library), method, args);\n\t\t\t\t#elseif cs\n\t\t\t\treturn untyped CSFunctionLoader.load(__moduleNames.get(library), method, args);\n\t\t\t\t#else\n\t\t\t\treturn null;\n\t\t\t\t#end\n\t\t\t}\n\n\t\t\t#if waxe\n\t\t\tif (library == \"lime\")\n\t\t\t{\n\t\t\t\tflash.Lib.load(\"waxe\", \"wx_boot\", 1);\n\t\t\t}\n\t\t\t#elseif nodejs\n\t\t\tif (__nodeNDLLModule == null)\n\t\t\t{\n\t\t\t\t__nodeNDLLModule = untyped require('ndll');\n\t\t\t}\n\t\t\t#end\n\n\t\t\t__moduleNames.set(library, library);\n\n\t\t\tvar programPath:String = \".\";\n\t\t\t#if sys\n\t\t\tprogramPath = Path.directory(Sys.programPath());\n\t\t\t#end\n\n\t\t\tresult = __tryLoad(programPath + \"/\" + library, library, method, args);\n\n\t\t\tif (result == null)\n\t\t\t{\n\t\t\t\tresult = __tryLoad(programPath + \"\\\\\" + library, library, method, args);\n\t\t\t}\n\n\t\t\tif (result == null)\n\t\t\t{\n\t\t\t\tresult = __tryLoad(library, library, method, args);\n\t\t\t}\n\n\t\t\tif (result == null)\n\t\t\t{\n\t\t\t\tvar ndllFolder = __findNDLLFolder();\n\n\t\t\t\tif (ndllFolder != \"\")\n\t\t\t\t{\n\t\t\t\t\tresult = __tryLoad(ndllFolder + __sysName() + \"/\" + library, library, method, args);\n\n\t\t\t\t\tif (result == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult = __tryLoad(ndllFolder + __sysName() + \"64/\" + library, library, method, args);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult = __tryLoad(ndllFolder + __sysName() + \"Arm64/\" + library, library, method, args);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t__loaderTrace(\"Result : \" + result);\n\t\t}\n\n\t\t#if neko\n\t\tif (library == \"lime\" && method != \"neko_init\")\n\t\t{\n\t\t\t__loadNekoAPI(lazy);\n\t\t}\n\t\t#end\n\t\t#end\n\t\t#else\n\t\tresult = function(_, _, _, _, _, _)\n\t\t{\n\t\t\treturn {};\n\t\t};\n\t\t#end\n\n\t\treturn result;\n\t}\n\n\tpublic static macro function loadPrime(library:String, method:String, signature:String, lazy:Bool = false):Dynamic\n\t{\n\t\t#if (!display && !macro && cpp && !disable_cffi)\n\t\treturn cpp.Prime.load(library, method, signature, lazy);\n\t\t#else\n\t\tvar args = signature.length - 1;\n\n\t\tif (args > 5)\n\t\t{\n\t\t\targs = -1;\n\t\t}\n\n\t\treturn {call: CFFI.load(library, method, args, lazy)};\n\t\t#end\n\t}\n\n\t@:dox(hide) #if !hl inline #end public static function stringValue(#if hl value:hl.Bytes #else value:String #end):String\n\t{\n\t\t#if hl\n\t\treturn value != null ? @:privateAccess String.fromUTF8(value) : null;\n\t\t#else\n\t\treturn value;\n\t\t#end\n\t}\n\n\tprivate static function __findNDLLFolder():String\n\t{\n\t\t#if (sys && !macro && !html5)\n\t\tvar process = new Process(\"haxelib\", [\"path\", \"lime\"]);\n\n\t\ttry\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tvar line = StringTools.trim(process.stdout.readLine());\n\n\t\t\t\tif (StringTools.startsWith(line, \"-L \"))\n\t\t\t\t{\n\t\t\t\t\tprocess.close();\n\t\t\t\t\treturn Path.addTrailingSlash(line.substr(3));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\tprocess.close();\n\t\t#end\n\n\t\treturn \"\";\n\t}\n\n\tprivate static function __loaderTrace(message:String)\n\t{\n\t\t#if (sys && !html5)\n\t\t// #if (haxe_ver < 3.4)\n\t\t// var get_env = cpp.Lib.load (\"std\", \"get_env\", 1);\n\t\t// var debug = (get_env (\"OPENFL_LOAD_DEBUG\") != null);\n\t\t// #else\n\t\tvar debug = (Sys.getEnv(\"OPENFL_LOAD_DEBUG\") != null);\n\t\t// #end\n\n\t\tif (debug)\n\t\t{\n\t\t\tSys.println(message);\n\t\t}\n\t\t#end\n\t}\n\n\t#if java\n\tprivate static var __loadedLibraries = new Map<String, Bool>();\n\n\tprivate static function __loadJava(library:String, method:String, args:Int = 0)\n\t{\n\t\tif (!__loadedLibraries.exists(library))\n\t\t{\n\t\t\tvar extension = #if android \".so\" #else \".ndll\" #end;\n\t\t\tvar path = Sys.getCwd() + \"/\" + library + extension;\n\n\t\t\tjava.lang.System.load(path);\n\n\t\t\t__loadedLibraries.set(library, true);\n\n\t\t\ttrace(\"load library: \" + library);\n\t\t}\n\n\t\treturn null;\n\t}\n\t#end\n\n\t#if neko\n\tprivate static function __loadNekoAPI(lazy:Bool):Void\n\t{\n\t\tif (!__loadedNekoAPI)\n\t\t{\n\t\t\tvar init:Dynamic = null;\n\t\t\tvar error:Dynamic = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tinit = load(\"lime\", \"neko_init\", 5);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\terror = e;\n\t\t\t}\n\n\t\t\tif (init != null)\n\t\t\t{\n\t\t\t\t__loaderTrace(\"Found nekoapi @ \" + __moduleNames.get(\"lime\"));\n\t\t\t\tinit(function(s) return new String(s), function(len:Int)\n\t\t\t\t{\n\t\t\t\t\tvar r = [];\n\t\t\t\t\tif (len > 0) r[len - 1] = null;\n\t\t\t\t\treturn r;\n\t\t\t\t}, null, true, false);\n\n\t\t\t\t__loadedNekoAPI = true;\n\t\t\t}\n\t\t\telse if (!lazy)\n\t\t\t{\n\t\t\t\tvar ndllFolder = __findNDLLFolder() + __sysName();\n\t\t\t\tthrow \"Could not load lime.ndll. This file is provided with Lime's Haxelib releases, but not via Git. \"\n\t\t\t\t\t+ \"Please copy it from Lime's latest Haxelib release into either \"\n\t\t\t\t\t+ ndllFolder + \" or \" + ndllFolder + \"64, as appropriate for your system. \"\n\t\t\t\t\t+ \"Advanced users may run `lime rebuild cpp` instead.\"\n\t\t\t\t\t+ (error != null ? '\\nInternal error: $error' : \"\");\n\t\t\t}\n\t\t}\n\t}\n\t#end\n\n\tprivate static function __sysName():String\n\t{\n\t\t#if (sys && !html5)\n\t\t#if cpp\n\t\tvar sys_string = cpp.Lib.load(\"std\", \"sys_string\", 0);\n\t\treturn sys_string();\n\t\t#else\n\t\treturn Sys.systemName();\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tprivate static function __tryLoad(name:String, library:String, func:String, args:Int):Dynamic\n\t{\n\t\t#if sys\n\t\ttry\n\t\t{\n\t\t\t#if cpp\n\t\t\tvar result = cpp.Lib.load(name, func, args);\n\t\t\t#elseif (neko)\n\t\t\tvar result = neko.Lib.load(name, func, args);\n\t\t\t#elseif nodejs\n\t\t\tvar result = untyped __nodeNDLLModule.load_lib(name, func, args);\n\t\t\t#elseif java\n\t\t\tvar result = __loadJava(name, func, args);\n\t\t\t#elseif cs\n\t\t\tvar result = CSFunctionLoader.load(name, func, args);\n\t\t\t#else\n\t\t\tvar result = null;\n\t\t\t#end\n\n\t\t\tif (result != null)\n\t\t\t{\n\t\t\t\t__loaderTrace(\"Got result \" + name);\n\t\t\t\t__moduleNames.set(library, name);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\t__loaderTrace(\"Failed to load : \" + name);\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n}\n\n#if cs\n@:dox(hide) private class CSFunctionLoader\n{\n\tpublic static function load(name:String, func:String, args:Int):Dynamic\n\t{\n\t\tvar func:cs.ndll.NDLLFunction = cs.ndll.NDLLFunction.Load(name, func, args);\n\n\t\tif (func == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tif (args == -1)\n\t\t{\n\t\t\tvar haxeFunc:Dynamic = function(args:Array<Dynamic>):Dynamic\n\t\t\t{\n\t\t\t\treturn func.CallMult(args);\n\t\t\t}\n\n\t\t\treturn Reflect.makeVarArgs(haxeFunc);\n\t\t}\n\t\telse if (args == 0)\n\t\t{\n\t\t\treturn function():Dynamic\n\t\t\t{\n\t\t\t\treturn func.Call0();\n\t\t\t}\n\t\t}\n\t\telse if (args == 1)\n\t\t{\n\t\t\treturn function(arg1:Dynamic):Dynamic\n\t\t\t{\n\t\t\t\treturn func.Call1(arg1);\n\t\t\t}\n\t\t}\n\t\telse if (args == 2)\n\t\t{\n\t\t\treturn function(arg1:Dynamic, arg2:Dynamic):Dynamic\n\t\t\t{\n\t\t\t\treturn func.Call2(arg1, arg2);\n\t\t\t}\n\t\t}\n\t\telse if (args == 3)\n\t\t{\n\t\t\treturn function(arg1:Dynamic, arg2:Dynamic, arg3:Dynamic):Dynamic\n\t\t\t{\n\t\t\t\treturn func.Call3(arg1, arg2, arg3);\n\t\t\t}\n\t\t}\n\t\telse if (args == 4)\n\t\t{\n\t\t\treturn function(arg1:Dynamic, arg2:Dynamic, arg3:Dynamic, arg4:Dynamic):Dynamic\n\t\t\t{\n\t\t\t\treturn func.Call4(arg1, arg2, arg3, arg4);\n\t\t\t}\n\t\t}\n\t\telse if (args == 5)\n\t\t{\n\t\t\treturn function(arg1:Dynamic, arg2:Dynamic, arg3:Dynamic, arg4:Dynamic, arg5:Dynamic):Dynamic\n\t\t\t{\n\t\t\t\treturn func.Call5(arg1, arg2, arg3, arg4, arg5);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/system/CFFIPointer.hx",
    "content": "package lime.system;\n\n#if (!lime_doc_gen || lime_cffi)\nimport lime._internal.backend.native.NativeCFFI;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract CFFIPointer(Dynamic) from Dynamic to Dynamic\n{\n\tpublic inline function new(handle:Dynamic)\n\t{\n\t\tthis = handle;\n\t}\n\n\tpublic function get():Float\n\t{\n\t\tif (this != null)\n\t\t{\n\t\t\t#if (lime_cffi && !macro)\n\t\t\treturn NativeCFFI.lime_cffi_get_native_pointer(this);\n\t\t\t#end\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t@:noCompletion @:op(A == B) private static inline function equals(a:CFFIPointer, b:Int):Bool\n\t{\n\t\treturn a.get() == b;\n\t}\n\n\t@:noCompletion @:op(A == B) private static inline function equalsPointer(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn a.get() == b.get();\n\t}\n\n\t@:noCompletion @:op(A > B) private static inline function greaterThan(a:CFFIPointer, b:Int):Bool\n\t{\n\t\treturn a.get() > b;\n\t}\n\n\t@:noCompletion @:op(A > B) private static inline function greaterThanPointer(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn a.get() > b.get();\n\t}\n\n\t@:noCompletion @:op(A >= B) private static inline function greaterThanOrEqual(a:CFFIPointer, b:Int):Bool\n\t{\n\t\treturn a.get() >= b;\n\t}\n\n\t@:noCompletion @:op(A >= B) private static inline function greaterThanOrEqualPointer(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn a.get() >= b.get();\n\t}\n\n\t@:noCompletion @:op(A < B) private static inline function lessThan(a:CFFIPointer, b:Int):Bool\n\t{\n\t\treturn a.get() < b;\n\t}\n\n\t@:noCompletion @:op(A < B) private static inline function lessThanPointer(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn a.get() < b.get();\n\t}\n\n\t@:noCompletion @:op(A <= B) private static inline function lessThanOrEqual(a:CFFIPointer, b:Int):Bool\n\t{\n\t\treturn a.get() <= b;\n\t}\n\n\t@:noCompletion @:op(A <= B) private static inline function lessThanOrEqualPointer(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn a.get() <= b.get();\n\t}\n\n\t@:noCompletion @:op(A != B) private static inline function notEquals(a:CFFIPointer, b:Int):Bool\n\t{\n\t\treturn a.get() != b;\n\t}\n\n\t@:noCompletion @:op(A != B) private static inline function notEqualsPointer(a:CFFIPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn a.get() != b.get();\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/system/Clipboard.hx",
    "content": "package lime.system;\n\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Application;\nimport lime.app.Event;\nimport lime.system.CFFI;\n#if flash\nimport flash.desktop.Clipboard as FlashClipboard;\n#elseif (js && html5)\nimport lime._internal.backend.html5.HTML5Window;\n#end\n\n/**\n\tReads and writes text on the system clipboard.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.ui.Window)\nclass Clipboard\n{\n\t/**\n\t\tDispatched when the clipboard text changes.\n\t**/\n\tpublic static var onUpdate = new Event<Void->Void>();\n\n\t/**\n\t\tThe text currently stored in the clipboard.\n\t**/\n\tpublic static var text(get, set):String;\n\n\tprivate static var _text:String;\n\t@:noCompletion private static var __updated = false;\n\n\tprivate static function __update():Void\n\t{\n\t\tvar cacheText = _text;\n\t\t_text = null;\n\n\t\t#if (lime_cffi && !macro)\n\t\t_text = CFFI.stringValue(NativeCFFI.lime_clipboard_get_text());\n\t\t#elseif flash\n\t\tif (FlashClipboard.generalClipboard.hasFormat(TEXT_FORMAT))\n\t\t{\n\t\t\t_text = FlashClipboard.generalClipboard.getData(TEXT_FORMAT);\n\t\t}\n\t\t#elseif (js || html5)\n\t\t_text = cacheText;\n\t\t#end\n\t\t__updated = true;\n\n\t\tif (_text != cacheText)\n\t\t{\n\t\t\tonUpdate.dispatch();\n\t\t}\n\t}\n\n\t// Get & Set Methods\n\tprivate static function get_text():String\n\t{\n\t\t// On some native platforms, __update() is called automatically when the\n\t\t// native clipboard changes. On others, __update() needs to be called\n\t\t// manually.\n\t\t#if (flash || js || html5 || ios || tvos || android)\n\t\t__update();\n\t\t#elseif linux\n\t\t// Xorg won't call __update until we call set_text at least once.\n\t\t// Details: SDL_x11clipboard.c calls X11_XSetSelectionOwner,\n\t\t// registering this app to receive clipboard events.\n\t\tif (_text == null)\n\t\t{\n\t\t\t__update();\n\n\t\t\t// Call set_text while changing as little as possible. (Rich text\n\t\t\t// formatting will unavoidably be lost.)\n\t\t\tset_text(_text);\n\t\t}\n\t\t#elseif (windows || mac)\n\t\tif (!__updated)\n\t\t{\n\t\t\t// Lime listens for clipboard updates automatically, but if the\n\t\t\t// clipboard has never been updated since before the app started,\n\t\t\t// we need to populate the initial contents manually\n\t\t\t__update();\n\t\t}\n\t\t#end\n\n\t\treturn _text;\n\t}\n\n\tprivate static function set_text(value:String):String\n\t{\n\t\tvar cacheText = _text;\n\t\t_text = value;\n\n\t\t#if (lime_cffi && !macro)\n\t\tNativeCFFI.lime_clipboard_set_text(value);\n\t\t#elseif flash\n\t\tFlashClipboard.generalClipboard.setData(TEXT_FORMAT, value);\n\t\t#elseif (js && html5)\n\t\tvar window = Application.current.window;\n\t\tif (window != null)\n\t\t{\n\t\t\twindow.__backend.setClipboard(value);\n\t\t}\n\t\t#end\n\n\t\tif (_text != cacheText)\n\t\t{\n\t\t\tonUpdate.dispatch();\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/system/Display.hx",
    "content": "package lime.system;\n\nimport lime.math.Rectangle;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Display\n{\n\t/**\n\t * The desktop area represented by this display, with the upper-leftmost display at 0,0\n\t**/\n\tpublic var bounds(default, null):Rectangle;\n\n\t/**\n\t * The current display mode\n\t**/\n\tpublic var currentMode(default, null):DisplayMode;\n\n\tpublic var id(default, null):Int;\n\n\t/**\n\t * Pixel density of the display\n\t */\n\tpublic var dpi(default, null):Float;\n\n\t/**\n\t * Orientation of the display\n\t */\n\tpublic var orientation(default, null):Orientation;\n\n\t/**\n\t * The name of the device, such as \"Samsung SyncMaster P2350\", \"iPhone 6\", \"Oculus Rift DK2\", etc.\n\t**/\n\tpublic var name(default, null):String;\n\n\t/**\n\t * All of the display modes supported by this device\n\t**/\n\tpublic var supportedModes(default, null):Array<DisplayMode>;\n\n\t/**\n\t\tThe area within the display's `bounds` where it is safe to render\n\t\tcontent without being obscured by notches, holes, or other display\n\t\tcutouts.\n\t**/\n\tpublic var safeArea(default, null):Rectangle;\n\n\t@:noCompletion private function new() {}\n}\n"
  },
  {
    "path": "src/lime/system/DisplayMode.hx",
    "content": "package lime.system;\n\nimport lime.graphics.PixelFormat;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass DisplayMode\n{\n\t/**\n\t * vertical resolution\n\t**/\n\tpublic var height(default, null):Int;\n\n\t/**\n\t * pixel format\n\t**/\n\tpublic var pixelFormat(default, null):PixelFormat;\n\n\t/**\n\t * refresh rate in Hz\n\t**/\n\tpublic var refreshRate(default, null):Int;\n\n\t/**\n\t * horizontal resolution\n\t**/\n\tpublic var width(default, null):Int;\n\n\t@:noCompletion private function new(width:Int, height:Int, refreshRate:Int, pixelFormat:PixelFormat)\n\t{\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.refreshRate = refreshRate;\n\t\tthis.pixelFormat = pixelFormat;\n\t}\n}\n"
  },
  {
    "path": "src/lime/system/Endian.hx",
    "content": "package lime.system;\n\nenum Endian\n{\n\tLITTLE_ENDIAN;\n\tBIG_ENDIAN;\n}\n"
  },
  {
    "path": "src/lime/system/FileWatcher.hx",
    "content": "package lime.system;\n\n#if (!lime_doc_gen || lime_cffi)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Application;\nimport lime.app.Event;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass FileWatcher\n{\n\tpublic var onAdd = new Event<String->Void>();\n\tpublic var onDelete = new Event<String->Void>();\n\tpublic var onModify = new Event<String->Void>();\n\tpublic var onMove = new Event<String->String->Void>();\n\n\t@:noCompletion private var handle:CFFIPointer;\n\t@:noCompletion private var __hasUpdate:Bool;\n\t@:noCompletion private var __ids:Map<String, Int>;\n\n\tpublic function new()\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\thandle = NativeCFFI.lime_file_watcher_create(this_onChange);\n\t\t__ids = new Map();\n\t\t#end\n\t}\n\n\tpublic function addDirectory(path:String, recursive:Bool = true):Bool\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (!__hasUpdate && Application.current != null)\n\t\t{\n\t\t\tApplication.current.onUpdate.add(this_onUpdate);\n\t\t\t__hasUpdate = true;\n\t\t}\n\n\t\tvar id:Int = NativeCFFI.lime_file_watcher_add_directory(handle, path, recursive);\n\n\t\tif (id >= 0)\n\t\t{\n\t\t\t__ids[path] = id;\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// throw error?\n\t\t\t// FileNotFound\t= -1,\n\t\t\t// FileRepeated\t= -2,\n\t\t\t// FileOutOfScope\t= -3,\n\t\t\t// FileNotReadable\t= -4,\n\t\t\t// FileRemote\t\t= -5, /** Directory in remote file system ( create a generic FileWatcher instance to watch this directory ). */\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t@:noCompletion private function combine(directory:String, file:String):String\n\t{\n\t\tvar trailingSlash = (directory.substr(-1) == \"/\" || directory.substr(-1) == \"\\\\\");\n\t\tvar startingSlash = (file.substr(0, 1) == \"/\" || file.substr(0, 1) == \"\\\\\");\n\t\tvar path;\n\n\t\tif (trailingSlash && startingSlash)\n\t\t{\n\t\t\tpath = directory + file.substr(1);\n\t\t}\n\t\telse if (!trailingSlash && !startingSlash)\n\t\t{\n\t\t\tpath = directory + #if windows \"\\\\\" #else \"/\" #end + file;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpath = directory + file;\n\t\t}\n\n\t\treturn path;\n\t}\n\n\tpublic function removeDirectory(path:String):Bool\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (__ids.exists(path))\n\t\t{\n\t\t\tNativeCFFI.lime_file_watcher_remove_directory(handle, __ids[path]);\n\t\t\t__ids.remove(path);\n\n\t\t\tif (!__ids.keys().hasNext())\n\t\t\t{\n\t\t\t\tApplication.current.onUpdate.remove(this_onUpdate);\n\t\t\t\t__hasUpdate = false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t@:noCompletion private function this_onChange(directory:String, file:String, action:Int, oldFile:String):Void\n\t{\n\t\tvar path = combine(directory, file);\n\n\t\tswitch (action)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tonAdd.dispatch(path);\n\n\t\t\tcase 2:\n\t\t\t\tonDelete.dispatch(path);\n\n\t\t\tcase 3:\n\t\t\t\tonModify.dispatch(path);\n\n\t\t\tcase 4:\n\t\t\t\tonMove.dispatch(combine(directory, oldFile), path);\n\t\t}\n\t}\n\n\t@:noCompletion private function this_onUpdate(_):Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tNativeCFFI.lime_file_watcher_update(handle);\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/system/JNI.hx",
    "content": "package lime.system;\n\n#if (!lime_doc_gen || android)\n#if macro\nimport haxe.macro.Context;\nimport haxe.macro.Expr;\nimport haxe.macro.Type;\n#else\nimport lime._internal.backend.native.NativeCFFI;\n#end\n#if !lime_doc_gen\n#if target.threaded\nimport sys.thread.Thread;\n#elseif cpp\nimport cpp.vm.Thread;\n#elseif neko\nimport neko.vm.Thread;\n#end\n#end\n\nusing StringTools;\n\n/**\n\tThe Java Native Interface (JNI) allows C++ code to call Java functions, and\n\tvice versa. On Android, Haxe code compiles to C++, but only Java code can\n\taccess the Android system API, so it's often necessary to use both.\n\n\tFor a working example, run `lime create extension MyExtension`, then look at\n\tMyExtension.hx and MyExtension.java.\n\n\tYou can pass Haxe objects to Java, much like any other data. In Java,\n\tthey'll have type `org.haxe.lime.HaxeObject`, meaning the method that\n\treceives them might have signature `(Lorg/haxe/lime/HaxeObject;)V`. Once\n\tsent, the Java class can store the object and call its functions.\n\n\tNote that most Java code runs on a different thread than Haxe, meaning that\n\tyou can get thread-related errors in both directions. Java functions can\n\tuse `Extension.callbackHandler.post()` to switch to the UI thread, while\n\tHaxe code can avoid the problem using `lime.system.JNI.JNISafety`.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass JNI\n{\n\tprivate static var alreadyCreated = new Map<String, Bool>();\n\tprivate static var initialized = false;\n\n\tprivate static function transformClassName(className:String):String\n\t{\n\t\tvar parts:Array<String> = className.split(\".\");\n\t\tif (parts.length <= 1)\n\t\t\treturn className;\n\n\t\tvar nestedClassName:String = \"\";\n\t\tif (~/^[A-Z]/.match(parts[parts.length - 2]))\n\t\t\tnestedClassName = \"$\" + parts.pop();\n\n\t\treturn parts.join(\"/\") + nestedClassName;\n\t}\n\n\tpublic static function callMember(method:Dynamic, jobject:Dynamic, a:Array<Dynamic>):Dynamic\n\t{\n\t\treturn Reflect.callMethod(null, method, [jobject].concat(a));\n\t}\n\n\tpublic static function callStatic(method:Dynamic, a:Array<Dynamic>):Dynamic\n\t{\n\t\treturn Reflect.callMethod(null, method, a);\n\t}\n\n\t/**\n\t\t@param className A string in the format `\"com/package/ClassName\"` or\n\t\t`\"com/package/ClassName$NestedClass\"`. If dots are used instead, `JNI`\n\t\twill attempt to replace them with the correct symbols.\n\t\t@param memberName The member field's name.\n\t\t@param signature A Java VM type signature.\n\t\t@see Java VM type signatures: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432\n\t**/\n\tpublic static function createMemberField(className:String, memberName:String, signature:String):JNIMemberField\n\t{\n\t\tinit();\n\n\t\t#if (android && lime_cffi && !macro)\n\t\tclassName = transformClassName(className);\n\t\treturn new JNIMemberField(NativeCFFI.lime_jni_create_field(className, memberName, signature, false));\n\t\t#else\n\t\treturn new JNIMemberField(null);\n\t\t#end\n\t}\n\n\t/**\n\t\t@param className A string in the format `\"com/package/ClassName\"` or\n\t\t`\"com/package/ClassName$NestedClass\"`. If dots are used instead, `JNI`\n\t\twill attempt to replace them with the correct symbols.\n\t\t@param memberName The member method's name.\n\t\t@param signature A Java VM type signature.\n\t\t@param useArray Set this to create a function that takes a single\n\t\t`Array<Dynamic>` argument, instead of multiple `Dynamic` arguments.\n\t\t@param quietFail Set this to suppress the \"method not found\" error.\n\t\t@see Java VM type signatures: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432\n\t**/\n\tpublic static function createMemberMethod(className:String, memberName:String, signature:String, useArray:Bool = false, quietFail:Bool = false):Dynamic\n\t{\n\t\tinit();\n\n\t\t#if (android && lime_cffi && !macro)\n\t\tclassName = transformClassName(className);\n\t\tvar handle = NativeCFFI.lime_jni_create_method(className, memberName, signature, false, quietFail);\n\n\t\tif (handle == null)\n\t\t{\n\t\t\tif (quietFail)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthrow \"Could not find member function \\\"\" + memberName + \"\\\"\";\n\t\t}\n\n\t\tvar method = new JNIMethod(handle);\n\t\treturn method.getMemberMethod(useArray);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t/**\n\t\t@param className A string in the format `\"com/package/ClassName\"` or\n\t\t`\"com/package/ClassName$NestedClass\"`. If dots are used instead, `JNI`\n\t\twill attempt to replace them with the correct symbols.\n\t\t@param memberName The static field's name.\n\t\t@param signature A Java VM type signature.\n\t\t@see Java VM type signatures: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432\n\t**/\n\tpublic static function createStaticField(className:String, memberName:String, signature:String):JNIStaticField\n\t{\n\t\tinit();\n\n\t\t#if (android && lime_cffi && !macro)\n\t\tclassName = transformClassName(className);\n\t\treturn new JNIStaticField(NativeCFFI.lime_jni_create_field(className, memberName, signature, true));\n\t\t#else\n\t\treturn new JNIStaticField(null);\n\t\t#end\n\t}\n\n\t/**\n\t\t@param className A string in the format `\"com/package/ClassName\"` or\n\t\t`\"com/package/ClassName$NestedClass\"`. If dots are used instead, `JNI`\n\t\twill attempt to replace them with the correct symbols.\n\t\t@param memberName The static method's name. To get a constructor, use\n\t\t`<init>` as the method name.\n\t\t@param signature A Java VM type signature. To get a constructor, use `V`\n\t\tas the function's return value.\n\t\t@param useArray Set this to create a function that takes a single\n\t\t`Array<Dynamic>` argument, instead of multiple `Dynamic` arguments.\n\t\t@param quietFail Set this to suppress the \"method not found\" error.\n\t\t@see Java VM type signatures: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432\n\t**/\n\tpublic static function createStaticMethod(className:String, memberName:String, signature:String, useArray:Bool = false, quietFail:Bool = false):Dynamic\n\t{\n\t\tinit();\n\n\t\t#if (android && lime_cffi && !macro)\n\t\tclassName = transformClassName(className);\n\t\tvar handle = NativeCFFI.lime_jni_create_method(className, memberName, signature, true, quietFail);\n\n\t\tif (handle == null)\n\t\t{\n\t\t\tif (quietFail)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthrow \"Could not find static function \\\"\" + memberName + \"\\\"\";\n\t\t}\n\n\t\tvar method = new JNIMethod(handle);\n\t\treturn method.getStaticMethod(useArray);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function getEnv():Dynamic\n\t{\n\t\tinit();\n\n\t\t#if (android && lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_jni_get_env();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tprivate static function init():Void\n\t{\n\t\tif (!initialized)\n\t\t{\n\t\t\tinitialized = true;\n\n\t\t\t#if (android && !macro)\n\t\t\tvar method = System.load(\"lime\", \"lime_jni_init_callback\", 1);\n\t\t\tmethod(onCallback);\n\t\t\t#end\n\t\t}\n\t}\n\n\tprivate static function onCallback(object:Dynamic, method:String, args:Array<Dynamic>):Dynamic\n\t{\n\t\tvar field = Reflect.field(object, method);\n\n\t\tif (field != null)\n\t\t{\n\t\t\tif (args == null) args = [];\n\n\t\t\treturn Reflect.callMethod(object, field, args);\n\t\t}\n\n\t\ttrace(\"onCallback - unknown field \" + method);\n\t\treturn null;\n\t}\n\n\tpublic static function postUICallback(callback:Void->Void):Void\n\t{\n\t\t// TODO: Rename this?\n\n\t\t#if (android && lime_cffi && !macro)\n\t\tNativeCFFI.lime_jni_post_ui_callback(callback);\n\t\t#else\n\t\tcallback();\n\t\t#end\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass JNIMemberField\n{\n\t@:noCompletion private var field:Dynamic;\n\n\tpublic function new(field:Dynamic)\n\t{\n\t\tthis.field = field;\n\t}\n\n\tpublic function get(jobject:Dynamic):Dynamic\n\t{\n\t\t#if (android && lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_jni_get_member(field, jobject);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function set(jobject:Dynamic, value:Dynamic):Dynamic\n\t{\n\t\t#if (android && lime_cffi && !macro)\n\t\tNativeCFFI.lime_jni_set_member(field, jobject, value);\n\t\t#end\n\t\treturn value;\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass JNIStaticField\n{\n\t@:noCompletion private var field:Dynamic;\n\n\tpublic function new(field:Dynamic)\n\t{\n\t\tthis.field = field;\n\t}\n\n\tpublic function get():Dynamic\n\t{\n\t\t#if (android && lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_jni_get_static(field);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function set(value:Dynamic):Dynamic\n\t{\n\t\t#if (android && lime_cffi && !macro)\n\t\tNativeCFFI.lime_jni_set_static(field, value);\n\t\t#end\n\t\treturn value;\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass JNIMethod\n{\n\t@:noCompletion private var method:Dynamic;\n\n\tpublic function new(method:Dynamic)\n\t{\n\t\tthis.method = method;\n\t}\n\n\tpublic function callMember(args:Array<Dynamic>):Dynamic\n\t{\n\t\t#if (android && lime_cffi && !macro)\n\t\tvar jobject = args.shift();\n\t\treturn NativeCFFI.lime_jni_call_member(method, jobject, args);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function callStatic(args:Array<Dynamic>):Dynamic\n\t{\n\t\t#if (android && lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_jni_call_static(method, args);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getMemberMethod(useArray:Bool):Dynamic\n\t{\n\t\tif (useArray)\n\t\t{\n\t\t\treturn callMember;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Reflect.makeVarArgs(callMember);\n\t\t}\n\t}\n\n\tpublic function getStaticMethod(useArray:Bool):Dynamic\n\t{\n\t\tif (useArray)\n\t\t{\n\t\t\treturn callStatic;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Reflect.makeVarArgs(callStatic);\n\t\t}\n\t}\n}\n\n/**\n\tMost times a Java class calls a Haxe function, it does so on the UI thread,\n\twhich can lead to thread-related errors. These errors can be avoided by\n\tswitching back to the main thread before executing any code.\n\n\tUsage:\n\n\t```haxe\n\tclass MyClass implements JNISafety\n\t{\n\t\t@:runOnMainThread\n\t\tpublic function callbackFunction(data:Dynamic):Void\n\t\t{\n\t\t\t// Code here is guaranteed to run on Haxe's main thread. It's safe\n\t\t\t// to call `callbackFunction` via JNI.\n\t\t}\n\n\t\tpublic function notACallbackFunction():Void\n\t\t{\n\t\t\t// Code here will run on whichever thread calls the function. It may\n\t\t\t// not be safe to call `notACallbackFunction` via JNI.\n\t\t}\n\t}\n\t```\n**/\n// Haxe 3 can't parse \"target.threaded\" inside parentheses.\n#if !(doc_gen || macro)\n#if target.threaded\n@:autoBuild(lime.system.JNI.JNISafetyTools.build())\n#elseif (cpp || neko)\n@:autoBuild(lime.system.JNI.JNISafetyTools.build())\n#end\n#end\ninterface JNISafety {}\n\n#if !doc_gen\nclass JNISafetyTools\n{\n\t#if target.threaded\n\tprivate static var mainThread:Thread = Thread.current();\n\t#elseif (cpp || neko)\n\tprivate static var mainThread:Thread = Thread.current();\n\t#end\n\n\t/**\n\t\t@return Whether the calling function is being run on the main thread.\n\t**/\n\tpublic static inline function onMainThread():Bool\n\t{\n\t\t#if target.threaded\n\t\treturn Thread.current() == mainThread;\n\t\t#elseif (cpp || neko)\n\t\treturn Thread.current() == mainThread;\n\t\t#else\n\t\treturn true;\n\t\t#end\n\t}\n\n\tpublic static macro function build():Array<Field>\n\t{\n\t\tvar fields:Array<Field> = Context.getBuildFields();\n\n\t\t#if macro\n\t\tfor (field in fields)\n\t\t{\n\t\t\t// Don't modify constructors.\n\t\t\tif (field.name == \"new\")\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Don't modify functions lacking `@:runOnMainThread`.\n\t\t\tif (field.meta == null || !Lambda.exists(field.meta,\n\t\t\t\tfunction(meta) return meta.name == \":runOnMainThread\"))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tswitch (field.kind)\n\t\t\t{\n\t\t\t\tcase FFun(f):\n\t\t\t\t\t// The function needs to call itself and can't be inline.\n\t\t\t\t\tfield.access.remove(AInline);\n\n\t\t\t\t\t// Make sure there's no return value.\n\t\t\t\t\tswitch (f.ret)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase macro:Void:\n\t\t\t\t\t\t\t// Good to go.\n\t\t\t\t\t\tcase null:\n\t\t\t\t\t\t\tf.ret = macro:Void;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tContext.error(\"Expected return type Void, got \"\n\t\t\t\t\t\t\t\t+ new haxe.macro.Printer().printComplexType(f.ret) + \".\", field.pos);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar args:Array<Expr> = [];\n\t\t\t\t\tfor (arg in f.args)\n\t\t\t\t\t{\n\t\t\t\t\t\targs.push(macro $i{arg.name});\n\n\t\t\t\t\t\t// Account for an unlikely edge case.\n\t\t\t\t\t\tif (arg.name == field.name)\n\t\t\t\t\t\t\tContext.error('${field.name}() should not take an argument named ${field.name}.', field.pos);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check the thread before running the function.\n\t\t\t\t\tf.expr = macro\n\t\t\t\t\t\tif (!lime.system.JNI.JNISafetyTools.onMainThread())\n\t\t\t\t\t\t\thaxe.MainLoop.runInMainThread($i{field.name}.bind($a{args}))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t${f.expr};\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\treturn fields;\n\t}\n}\n#end\n#end\n"
  },
  {
    "path": "src/lime/system/Locale.hx",
    "content": "package lime.system;\n\n#if flash\nimport flash.system.Capabilities;\n#end\nimport lime.system.CFFI;\nimport lime.system.JNI;\n\nabstract Locale(String) from String to String\n{\n\t@:isVar public static var currentLocale(get, set):Locale;\n\tpublic static var systemLocale(get, never):Locale;\n\tprivate static var __systemLocale:Locale;\n\n\tpublic var language(get, never):String;\n\tpublic var region(get, never):String;\n\n\tpublic function new(value:String)\n\t{\n\t\tthis = value;\n\t}\n\n\t@:noCompletion @:op(A == B) private static function equals(a:Locale, b:Locale):Bool\n\t{\n\t\tvar language = a.language;\n\t\tvar region = a.region;\n\n\t\tvar language2 = b.language;\n\t\tvar region2 = b.region;\n\n\t\tvar languageMatch = (language == language2);\n\t\tvar regionMatch = (region == region2);\n\n\t\tif (!languageMatch && language != null && language2 != null)\n\t\t{\n\t\t\tlanguageMatch = (language.toLowerCase() == language2.toLowerCase());\n\t\t}\n\n\t\tif (!regionMatch && region != null && region2 != null)\n\t\t{\n\t\t\tregionMatch = (region.toLowerCase() == region2.toLowerCase());\n\t\t}\n\n\t\treturn (languageMatch && regionMatch);\n\t}\n\n\t#if hl\n\t@:hlNative(\"lime\", \"hl_locale_get_system_locale\") private static function lime_locale_get_system_locale():hl.Bytes\n\t{\n\t\treturn null;\n\t}\n\t#end\n\n\tprivate static function __init():Void\n\t{\n\t\tif (__systemLocale == null)\n\t\t{\n\t\t\tvar locale = null;\n\n\t\t\t#if flash\n\t\t\tlocale = Capabilities.language;\n\t\t\t#elseif (js && html5)\n\t\t\tlocale = untyped navigator.language;\n\t\t\t#elseif (android)\n\t\t\tvar getDefault:Void->Dynamic = JNI.createStaticMethod(\"java/util/Locale\", \"getDefault\", \"()Ljava/util/Locale;\");\n\t\t\tvar toString:Dynamic->String = JNI.createMemberMethod(\"java/util/Locale\", \"toString\", \"()Ljava/lang/String;\");\n\n\t\t\tlocale = toString(getDefault());\n\t\t\t#elseif (lime_cffi && !macro)\n\t\t\t#if hl\n\t\t\tlocale = CFFI.stringValue(lime_locale_get_system_locale());\n\t\t\t#else\n\t\t\tlocale = CFFI.load(\"lime\", \"lime_locale_get_system_locale\", 0)();\n\t\t\t#end\n\t\t\t#end\n\n\t\t\tif (locale != null)\n\t\t\t{\n\t\t\t\t__systemLocale = locale;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t__systemLocale = \"en-US\";\n\t\t\t}\n\n\t\t\tcurrentLocale = __systemLocale;\n\t\t}\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_language():String\n\t{\n\t\tif (this != null)\n\t\t{\n\t\t\tvar index = this.indexOf(\"_\");\n\n\t\t\tif (index > -1)\n\t\t\t{\n\t\t\t\tvar dashIndex = this.indexOf(\"-\");\n\t\t\t\tif (dashIndex > -1 && dashIndex < index) index = dashIndex;\n\n\t\t\t\treturn this.substring(0, index);\n\t\t\t}\n\n\t\t\tindex = this.indexOf(\"-\");\n\n\t\t\tif (index > -1)\n\t\t\t{\n\t\t\t\treturn this.substring(0, index);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t@:noCompletion private function get_region():String\n\t{\n\t\tif (this != null)\n\t\t{\n\t\t\tvar underscoreIndex = this.indexOf(\"_\");\n\t\t\tvar dotIndex = this.indexOf(\".\");\n\t\t\tvar dashIndex = this.indexOf(\"-\");\n\n\t\t\tif (underscoreIndex > -1)\n\t\t\t{\n\t\t\t\tif (dotIndex > -1)\n\t\t\t\t{\n\t\t\t\t\treturn this.substring(underscoreIndex + 1, dotIndex);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn this.substring(underscoreIndex + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (dashIndex > -1)\n\t\t\t{\n\t\t\t\tif (dotIndex > -1)\n\t\t\t\t{\n\t\t\t\t\treturn this.substring(dashIndex + 1, dotIndex);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn this.substring(dashIndex + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Get & Set Methods\n\tprivate static function get_currentLocale():Locale\n\t{\n\t\t__init();\n\n\t\treturn currentLocale;\n\t}\n\n\tprivate static function set_currentLocale(value:Locale):Locale\n\t{\n\t\t__init();\n\n\t\treturn currentLocale = value;\n\t}\n\n\tprivate static function get_systemLocale():Locale\n\t{\n\t\t__init();\n\n\t\treturn __systemLocale;\n\t}\n}\n"
  },
  {
    "path": "src/lime/system/Orientation.hx",
    "content": "package lime.system;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract Orientation(Int)\n{\n\tvar UNKNOWN = 0;\n\tvar LANDSCAPE = 1;\n\tvar LANDSCAPE_FLIPPED = 2;\n\tvar PORTRAIT = 3;\n\tvar PORTRAIT_FLIPPED = 4;\n}"
  },
  {
    "path": "src/lime/system/Sensor.hx",
    "content": "package lime.system;\n\nimport lime.app.Event;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Sensor\n{\n\tprivate static var sensorByID = new Map<Int, Sensor>();\n\tprivate static var sensors = new Array<Sensor>();\n\n\tpublic var id:Int;\n\tpublic var onUpdate = new Event<Float->Float->Float->Void>();\n\tpublic var type:SensorType;\n\n\t@:noCompletion private function new(type:SensorType, id:Int)\n\t{\n\t\tthis.type = type;\n\t\tthis.id = id;\n\t}\n\n\tpublic static function getSensors(type:SensorType = null):Array<Sensor>\n\t{\n\t\tif (type == null)\n\t\t{\n\t\t\treturn sensors.copy();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar result = [];\n\n\t\t\tfor (sensor in sensors)\n\t\t\t{\n\t\t\t\tif (sensor.type == type)\n\t\t\t\t{\n\t\t\t\t\tresult.push(sensor);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tprivate static function registerSensor(type:SensorType, id:Int):Sensor\n\t{\n\t\tvar sensor = new Sensor(type, id);\n\n\t\tsensors.push(sensor);\n\t\tsensorByID.set(id, sensor);\n\n\t\treturn sensor;\n\t}\n}\n"
  },
  {
    "path": "src/lime/system/SensorType.hx",
    "content": "package lime.system;\n\nenum SensorType\n{\n\tACCELEROMETER;\n}\n"
  },
  {
    "path": "src/lime/system/System.hx",
    "content": "package lime.system;\n\nimport haxe.Constraints;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Application;\nimport lime.graphics.RenderContextAttributes;\nimport lime.math.Rectangle;\nimport lime.ui.WindowAttributes;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.UInt8Array;\nimport lime.utils.UInt16Array;\n#if flash\nimport flash.net.URLRequest;\nimport flash.system.Capabilities;\nimport flash.Lib;\n#end\n#if air\nimport flash.desktop.NativeApplication;\n#end\n#if ((js && html5) || electron)\nimport js.html.Element;\nimport js.Browser;\n#end\n#if sys\nimport sys.io.Process;\n#end\n\n/**\n\tAccess operating system level settings and operations.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.system.Display)\n@:access(lime.system.DisplayMode)\n#if (cpp && windows && !lime_disable_gpu_hint)\n@:cppFileCode('\n#if defined(HX_WINDOWS) && !defined(__MINGW32__)\nextern \"C\" {\n\t_declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001;\n\t_declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;\n}\n#endif\n')\n#end\nclass System\n{\n\t/**\n\t\tDetermines if the screen saver is allowed to start or not.\n\t**/\n\tpublic static var allowScreenTimeout(get, set):Bool;\n\n\t/**\n\t\tThe path to the directory where the application is installed, along with\n\t\tits supporting files. In many cases, this directory is read-only, and\n\t\tattempts to write to files, create new files, or delete files in this\n\t\tdirectory are likely fail.\n\t**/\n\tpublic static var applicationDirectory(get, never):String;\n\n\t/**\n\t\tThe application's dedicated storage directory, which unique to each\n\t\tapplication and user. Useful for storing settings on a user-specific\n\t\tand application-specific basis.\n\n\t\tThis directory may or may not be removed when the application is\n\t\tuninstalled, and it depends on the platform and installer technology\n\t\tthat is used.\n\t**/\n\tpublic static var applicationStorageDirectory(get, never):String;\n\n\t/**\n\t\tThe path to the directory containing the user's desktop.\n\t**/\n\tpublic static var desktopDirectory(get, never):String;\n\n\tpublic static var deviceModel(get, never):String;\n\tpublic static var deviceVendor(get, never):String;\n\tpublic static var disableCFFI:Bool;\n\n\t/**\n\t\tThe path to the directory containing the user's documents.\n\t**/\n\tpublic static var documentsDirectory(get, never):String;\n\n\t/**\n\t\tThe platform's default endianness for bytes.\n\t**/\n\tpublic static var endianness(get, never):Endian;\n\n\t/**\n\t\tThe path to the directory where fonts are installed.\n\t**/\n\tpublic static var fontsDirectory(get, never):String;\n\n\t/**\n\t\tThe number of available video displays.\n\t**/\n\tpublic static var numDisplays(get, never):Int;\n\n\tpublic static var platformLabel(get, never):String;\n\tpublic static var platformName(get, never):String;\n\tpublic static var platformVersion(get, never):String;\n\n\t/**\n\t\tThe path to the user's home directory.\n\t**/\n\tpublic static var userDirectory(get, never):String;\n\n\t@:noCompletion private static var __applicationDirectory:String;\n\t@:noCompletion private static var __applicationEntryPoint:Map<String, Function>;\n\t@:noCompletion private static var __applicationStorageDirectory:String;\n\t@:noCompletion private static var __desktopDirectory:String;\n\t@:noCompletion private static var __deviceModel:String;\n\t@:noCompletion private static var __deviceVendor:String;\n\t@:noCompletion private static var __directories = new Map<SystemDirectory, String>();\n\t@:noCompletion private static var __documentsDirectory:String;\n\t@:noCompletion private static var __endianness:Endian;\n\t@:noCompletion private static var __fontsDirectory:String;\n\t@:noCompletion private static var __platformLabel:String;\n\t@:noCompletion private static var __platformName:String;\n\t@:noCompletion private static var __platformVersion:String;\n\t@:noCompletion private static var __userDirectory:String;\n\n\t#if (js && html5)\n\t@:keep @:expose(\"lime.embed\")\n\tpublic static function embed(projectName:String, element:Dynamic, width:Null<Int> = null, height:Null<Int> = null, config:Dynamic = null):Void\n\t{\n\t\tif (__applicationEntryPoint == null) return;\n\n\t\tif (__applicationEntryPoint.exists(projectName))\n\t\t{\n\t\t\tvar htmlElement:Element = null;\n\n\t\t\tif ((element is String))\n\t\t\t{\n\t\t\t\thtmlElement = cast Browser.document.getElementById(element);\n\t\t\t}\n\t\t\telse if (element == null)\n\t\t\t{\n\t\t\t\thtmlElement = cast Browser.document.createElement(\"div\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thtmlElement = cast element;\n\t\t\t}\n\n\t\t\tif (htmlElement == null)\n\t\t\t{\n\t\t\t\tBrowser.window.console.log(\"[lime.embed] ERROR: Cannot find target element: \" + element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (width == null)\n\t\t\t{\n\t\t\t\twidth = 0;\n\t\t\t}\n\n\t\t\tif (height == null)\n\t\t\t{\n\t\t\t\theight = 0;\n\t\t\t}\n\n\t\t\tif (config == null) config = {};\n\n\t\t\tif (Reflect.hasField(config, \"background\") && (config.background is String))\n\t\t\t{\n\t\t\t\tvar background = StringTools.replace(Std.string(config.background), \"#\", \"\");\n\n\t\t\t\tif (background.indexOf(\"0x\") > -1)\n\t\t\t\t{\n\t\t\t\t\tconfig.background = Std.parseInt(background);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconfig.background = Std.parseInt(\"0x\" + background);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconfig.element = htmlElement;\n\t\t\tconfig.width = width;\n\t\t\tconfig.height = height;\n\n\t\t\t__applicationEntryPoint[projectName](config);\n\t\t}\n\t}\n\t#end\n\n\t#if (!lime_doc_gen || sys)\n\t/**\n\t\tAttempts to exit the application. Dispatches `onExit`, and will not\n\t\texit if the event is canceled. When exiting using this method, Lime will\n\t\tgracefully shut down a number of subsystems, including (but not limited\n\t\tto) audio, graphics, timers, and game controllers.\n\n\t\tTo properly exit a Lime application, it's best to call Lime's\n\t\t`System.exit()` instead of calling Haxe's built-in `Sys.exit()`. When\n\t\ttargeting native platforms especially, Lime's is built on C++ libraries\n\t\tthat expose functions to clean up resources properly on exit. Haxe's\n\t\t`Sys.exit()` exits immediately without giving Lime a chance to clean\n\t\tthings up. With that in mind, the proper and correct way to exit a Lime\n\t\tapp is by calling `lime.system.System.exit()`, and to avoid using\n\t\t`Sys.exit()`.\n\t**/\n\tpublic static function exit(code:Int):Void\n\t{\n\t\tvar currentApp = Application.current;\n\t\t#if ((sys || (js && html5) || air) && !macro)\n\t\tif (currentApp != null)\n\t\t{\n\t\t\tcurrentApp.onExit.dispatch(code);\n\n\t\t\tif (currentApp.onExit.canceled)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\t#if sys\n\t\tSys.exit(code);\n\t\t#elseif (js && html5)\n\t\tif (currentApp != null && currentApp.window != null)\n\t\t{\n\t\t\tcurrentApp.window.close();\n\t\t}\n\t\t#elseif air\n\t\tNativeApplication.nativeApplication.exit(code);\n\t\t#end\n\t}\n\t#end\n\n\t/**\n\t\tReturns information about the video display with the specified ID.\n\t**/\n\tpublic static function getDisplay(id:Int):Display\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar displayInfo:Dynamic = NativeCFFI.lime_system_get_display(id);\n\n\t\tif (displayInfo != null)\n\t\t{\n\t\t\tvar display = new Display();\n\t\t\tdisplay.id = id;\n\t\t\tdisplay.name = CFFI.stringValue(displayInfo.name);\n\t\t\tdisplay.bounds = new Rectangle(displayInfo.bounds.x, displayInfo.bounds.y, displayInfo.bounds.width, displayInfo.bounds.height);\n\t\t\tdisplay.orientation = displayInfo.orientation;\n\n\t\t\t#if android\n\t\t\tvar getDisplaySafeArea = JNI.createStaticMethod(\"org/haxe/lime/GameActivity\", \"getDisplaySafeAreaInsets\", \"()[I\");\n\t\t\tvar result = getDisplaySafeArea();\n\t\t\tdisplay.safeArea = new Rectangle(\n\t\t\t\tdisplay.bounds.x + result[0],\n\t\t\t\tdisplay.bounds.y + result[1],\n\t\t\t\tdisplay.bounds.width - result[0] - result[2],\n\t\t\t\tdisplay.bounds.height - result[1] - result[3]);\n\t\t\t#else\n\t\t\tdisplay.safeArea = new Rectangle(\n\t\t\t\tdisplayInfo.safeArea.x,\n\t\t\t\tdisplayInfo.safeArea.y,\n\t\t\t\tdisplayInfo.safeArea.width,\n\t\t\t\tdisplayInfo.safeArea.height);\n\t\t\t#end\n\n\t\t\t#if ios\n\t\t\tvar tablet = NativeCFFI.lime_system_get_ios_tablet();\n\t\t\tvar scale = Application.current.window.scale;\n\t\t\tif (!tablet && scale > 2.46)\n\t\t\t{\n\t\t\t\tdisplay.dpi = 401; // workaround for iPhone Plus\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdisplay.dpi = (tablet ? 132 : 163) * scale;\n\t\t\t}\n\t\t\t#elseif android\n\t\t\tvar getDisplayDPI = JNI.createStaticMethod(\"org/haxe/lime/GameActivity\", \"getDisplayXDPI\", \"()D\");\n\t\t\tdisplay.dpi = Math.round(getDisplayDPI());\n\t\t\t#else\n\t\t\tdisplay.dpi = displayInfo.dpi;\n\t\t\t#end\n\n\t\t\tdisplay.supportedModes = [];\n\n\t\t\tvar displayMode;\n\n\t\t\t#if hl\n\t\t\tvar supportedModes:hl.NativeArray<Dynamic> = displayInfo.supportedModes;\n\t\t\t#else\n\t\t\tvar supportedModes:Array<Dynamic> = displayInfo.supportedModes;\n\t\t\t#end\n\t\t\tfor (mode in supportedModes)\n\t\t\t{\n\t\t\t\tdisplayMode = new DisplayMode(mode.width, mode.height, mode.refreshRate, mode.pixelFormat);\n\t\t\t\tdisplay.supportedModes.push(displayMode);\n\t\t\t}\n\n\t\t\tvar mode = displayInfo.currentMode;\n\t\t\tvar currentMode = new DisplayMode(mode.width, mode.height, mode.refreshRate, mode.pixelFormat);\n\n\t\t\tfor (mode in display.supportedModes)\n\t\t\t{\n\t\t\t\tif (currentMode.pixelFormat == mode.pixelFormat\n\t\t\t\t\t&& currentMode.width == mode.width\n\t\t\t\t\t&& currentMode.height == mode.height\n\t\t\t\t\t&& currentMode.refreshRate == mode.refreshRate)\n\t\t\t\t{\n\t\t\t\t\tcurrentMode = mode;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdisplay.currentMode = currentMode;\n\n\t\t\treturn display;\n\t\t}\n\t\t#elseif (flash || html5)\n\t\tif (id == 0)\n\t\t{\n\t\t\tvar display = new Display();\n\t\t\tdisplay.id = 0;\n\t\t\tdisplay.name = \"Generic Display\";\n\n\t\t\t#if flash\n\t\t\tdisplay.dpi = Capabilities.screenDPI;\n\t\t\tdisplay.currentMode = new DisplayMode(Std.int(Capabilities.screenResolutionX), Std.int(Capabilities.screenResolutionY), 60, ARGB32);\n\t\t\t#if air\n\t\t\tswitch (flash.Lib.current.stage.orientation) {\n\t\t\t\tcase DEFAULT:\n\t\t\t\t\tdisplay.orientation = PORTRAIT;\n\t\t\t\tcase UPSIDE_DOWN:\n\t\t\t\t\tdisplay.orientation = PORTRAIT_FLIPPED;\n\t\t\t\tcase ROTATED_LEFT:\n\t\t\t\t\tdisplay.orientation = LANDSCAPE_FLIPPED;\n\t\t\t\tcase ROTATED_RIGHT:\n\t\t\t\t\tdisplay.orientation = LANDSCAPE;\n\t\t\t\tdefault:\n\t\t\t\t\tdisplay.orientation = UNKNOWN;\n\t\t\t}\n\n\t\t\t#else\n\t\t\tdisplay.orientation = UNKNOWN;\n\t\t\t#end\n\t\t\t#elseif (js && html5)\n\t\t\t// var div = Browser.document.createElement (\"div\");\n\t\t\t// div.style.width = \"1in\";\n\t\t\t// Browser.document.body.appendChild (div);\n\t\t\t// var ppi = Browser.document.defaultView.getComputedStyle (div, null).getPropertyValue (\"width\");\n\t\t\t// Browser.document.body.removeChild (div);\n\t\t\t// display.dpi = Std.parseFloat (ppi);\n\t\t\tdisplay.dpi = 96 * Browser.window.devicePixelRatio;\n\t\t\tdisplay.currentMode = new DisplayMode(Browser.window.screen.width, Browser.window.screen.height, 60, ARGB32);\n\t\t\tif (Browser.window.screen.orientation != null)\n\t\t\t{\n\t\t\t\tswitch (Browser.window.screen.orientation.type)\n\t\t\t\t{\n\t\t\t\t\tcase PORTRAIT_PRIMARY:\n\t\t\t\t\t\tdisplay.orientation = PORTRAIT;\n\t\t\t\t\tcase PORTRAIT_SECONDARY:\n\t\t\t\t\t\tdisplay.orientation = PORTRAIT_FLIPPED;\n\t\t\t\t\tcase LANDSCAPE_PRIMARY:\n\t\t\t\t\t\tdisplay.orientation = LANDSCAPE;\n\t\t\t\t\tcase LANDSCAPE_SECONDARY:\n\t\t\t\t\t\tdisplay.orientation = LANDSCAPE_FLIPPED;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tdisplay.orientation = UNKNOWN;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdisplay.orientation = UNKNOWN;\n\t\t\t}\n\t\t\t#end\n\n\t\t\tdisplay.supportedModes = [display.currentMode];\n\t\t\tdisplay.bounds = new Rectangle(0, 0, display.currentMode.width, display.currentMode.height);\n\t\t\tdisplay.safeArea = new Rectangle(0, 0, display.currentMode.width, display.currentMode.height);\n\t\t\treturn display;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t/**\n\t\tThe number of milliseconds since the application was initialized.\n\t**/\n\tpublic static function getTimer():Int\n\t{\n\t\t#if flash\n\t\treturn flash.Lib.getTimer();\n\t\t#elseif ((js && !nodejs) || electron)\n\t\treturn Std.int(Browser.window.performance.now());\n\t\t#elseif (lime_cffi && !macro)\n\t\treturn cast NativeCFFI.lime_system_get_timer();\n\t\t#elseif cpp\n\t\treturn Std.int(untyped __global__.__time_stamp() * 1000);\n\t\t#elseif sys\n\t\treturn Std.int(Sys.time() * 1000);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t#if (!lime_doc_gen || lime_cffi)\n\tpublic static inline function load(library:String, method:String, args:Int = 0, lazy:Bool = false):Dynamic\n\t{\n\t\t#if !macro\n\t\treturn CFFI.load(library, method, args, lazy);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\t#end\n\n\t/**\n\t\tOpens a file with the system default application.\n\n\t\tIn a web browser, opens a URL with target `_blank`.\n\t**/\n\tpublic static function openFile(path:String):Void\n\t{\n\t\tif (path != null)\n\t\t{\n\t\t\t#if (sys && windows)\n\t\t\tSys.command(\"start\", [\"\", path]);\n\t\t\t#elseif mac\n\t\t\tSys.command(\"/usr/bin/open\", [path]);\n\t\t\t#elseif linux\n\t\t\tSys.command(\"/usr/bin/xdg-open\", [path]);\n\t\t\t#elseif (js && html5)\n\t\t\tBrowser.window.open(path, \"_blank\");\n\t\t\t#elseif flash\n\t\t\tLib.getURL(new URLRequest(path), \"_blank\");\n\t\t\t#elseif android\n\t\t\tvar openFile = JNI.createStaticMethod(\"org/haxe/lime/GameActivity\", \"openFile\", \"(Ljava/lang/String;)V\");\n\t\t\topenFile(path);\n\t\t\t#elseif (lime_cffi && !macro)\n\t\t\tNativeCFFI.lime_system_open_file(path);\n\t\t\t#end\n\t\t}\n\t}\n\n\t/**\n\t\tOpens a URL with the specified target web browser window.\n\t**/\n\tpublic static function openURL(url:String, target:String = \"_blank\"):Void\n\t{\n\t\tif (url != null)\n\t\t{\n\t\t\t#if desktop\n\t\t\topenFile(url);\n\t\t\t#elseif (js && html5)\n\t\t\tBrowser.window.open(url, target);\n\t\t\t#elseif flash\n\t\t\tLib.getURL(new URLRequest(url), target);\n\t\t\t#elseif android\n\t\t\tvar openURL = JNI.createStaticMethod(\"org/haxe/lime/GameActivity\", \"openURL\", \"(Ljava/lang/String;Ljava/lang/String;)V\");\n\t\t\topenURL(url, target);\n\t\t\t#elseif (lime_cffi && !macro)\n\t\t\tNativeCFFI.lime_system_open_url(url, target);\n\t\t\t#end\n\t\t}\n\t}\n\n\t@:noCompletion private static function __copyMissingFields(target:Dynamic, source:Dynamic):Void\n\t{\n\t\tif (source == null || target == null) return;\n\n\t\tfor (field in Reflect.fields(source))\n\t\t{\n\t\t\tif (!Reflect.hasField(target, field))\n\t\t\t{\n\t\t\t\tReflect.setField(target, field, Reflect.field(source, field));\n\t\t\t}\n\t\t}\n\t}\n\n\t@:noCompletion private static function __getDirectory(type:SystemDirectory):String\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (__directories.exists(type))\n\t\t{\n\t\t\treturn __directories.get(type);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar path:String;\n\n\t\t\tif (type == APPLICATION_STORAGE)\n\t\t\t{\n\t\t\t\tvar company = \"MyCompany\";\n\t\t\t\tvar file = \"MyApplication\";\n\n\t\t\t\tif (Application.current != null)\n\t\t\t\t{\n\t\t\t\t\tif (Application.current.meta.exists(\"company\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tcompany = Application.current.meta.get(\"company\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Application.current.meta.exists(\"file\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tfile = Application.current.meta.get(\"file\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_system_get_directory(type, company, file));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_system_get_directory(type, null, null));\n\t\t\t}\n\n\t\t\t#if windows\n\t\t\tvar seperator = \"\\\\\";\n\t\t\t#else\n\t\t\tvar seperator = \"/\";\n\t\t\t#end\n\n\t\t\tif (path != null && path.length > 0 && !StringTools.endsWith(path, seperator))\n\t\t\t{\n\t\t\t\tpath += seperator;\n\t\t\t}\n\n\t\t\t__directories.set(type, path);\n\t\t\treturn path;\n\t\t}\n\t\t#elseif flash\n\t\tif (type != FONTS && Capabilities.playerType == \"Desktop\")\n\t\t{\n\t\t\tvar propertyName = switch (type)\n\t\t\t{\n\t\t\t\tcase APPLICATION: \"applicationDirectory\";\n\t\t\t\tcase APPLICATION_STORAGE: \"applicationStorageDirectory\";\n\t\t\t\tcase DESKTOP: \"desktopDirectory\";\n\t\t\t\tcase DOCUMENTS: \"documentsDirectory\";\n\t\t\t\tdefault: \"userDirectory\";\n\t\t\t}\n\n\t\t\treturn Reflect.getProperty(Type.resolveClass(\"flash.filesystem.File\"), propertyName).nativePath;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t#if sys\n\tprivate static function __parseArguments(attributes:WindowAttributes):Void\n\t{\n\t\t// TODO: Handle default arguments, like --window-fps=60\n\n\t\tvar arguments = Sys.args();\n\t\tvar stripQuotes = ~/^['\"](.*)['\"]$/;\n\t\tvar equals, argValue, parameters = null;\n\t\tvar windowParamPrefix = \"--window-\";\n\n\t\tif (arguments != null)\n\t\t{\n\t\t\tfor (argument in arguments)\n\t\t\t{\n\t\t\t\tequals = argument.indexOf(\"=\");\n\n\t\t\t\tif (equals > 0)\n\t\t\t\t{\n\t\t\t\t\targValue = argument.substr(equals + 1);\n\n\t\t\t\t\tif (stripQuotes.match(argValue))\n\t\t\t\t\t{\n\t\t\t\t\t\targValue = stripQuotes.matched(1);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (parameters == null) parameters = new Map<String, String>();\n\t\t\t\t\tparameters.set(argument.substr(0, equals), argValue);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (parameters != null)\n\t\t{\n\t\t\tif (attributes.parameters == null) attributes.parameters = {};\n\t\t\tif (attributes.context == null) attributes.context = {};\n\n\t\t\tfor (parameter in parameters.keys())\n\t\t\t{\n\t\t\t\targValue = parameters.get(parameter);\n\n\t\t\t\tif (#if lime_disable_window_override false && #end StringTools.startsWith(parameter, windowParamPrefix))\n\t\t\t\t{\n\t\t\t\t\tswitch (parameter.substr(windowParamPrefix.length))\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"allow-high-dpi\":\n\t\t\t\t\t\t\tattributes.allowHighDPI = __parseBool(argValue);\n\t\t\t\t\t\tcase \"always-on-top\":\n\t\t\t\t\t\t\tattributes.alwaysOnTop = __parseBool(argValue);\n\t\t\t\t\t\tcase \"antialiasing\":\n\t\t\t\t\t\t\tattributes.context.antialiasing = Std.parseInt(argValue);\n\t\t\t\t\t\tcase \"background\":\n\t\t\t\t\t\t\tattributes.context.background = (argValue == \"\" || argValue == \"null\") ? null : Std.parseInt(argValue);\n\t\t\t\t\t\tcase \"borderless\":\n\t\t\t\t\t\t\tattributes.borderless = __parseBool(argValue);\n\t\t\t\t\t\tcase \"colorDepth\":\n\t\t\t\t\t\t\tattributes.context.colorDepth = Std.parseInt(argValue);\n\t\t\t\t\t\tcase \"depth\", \"depth-buffer\":\n\t\t\t\t\t\t\tattributes.context.depth = __parseBool(argValue);\n\t\t\t\t\t\t// case \"display\": windowConfig.display = Std.parseInt (argValue);\n\t\t\t\t\t\tcase \"fullscreen\":\n\t\t\t\t\t\t\tattributes.fullscreen = __parseBool(argValue);\n\t\t\t\t\t\tcase \"hardware\":\n\t\t\t\t\t\t\tattributes.context.hardware = __parseBool(argValue);\n\t\t\t\t\t\tcase \"height\":\n\t\t\t\t\t\t\tattributes.height = Std.parseInt(argValue);\n\t\t\t\t\t\tcase \"hidden\":\n\t\t\t\t\t\t\tattributes.hidden = __parseBool(argValue);\n\t\t\t\t\t\tcase \"maximized\":\n\t\t\t\t\t\t\tattributes.maximized = __parseBool(argValue);\n\t\t\t\t\t\tcase \"minimized\":\n\t\t\t\t\t\t\tattributes.minimized = __parseBool(argValue);\n\t\t\t\t\t\tcase \"render-type\", \"renderer\":\n\t\t\t\t\t\t\tattributes.context.type = argValue;\n\t\t\t\t\t\tcase \"render-version\", \"renderer-version\":\n\t\t\t\t\t\t\tattributes.context.version = argValue;\n\t\t\t\t\t\tcase \"resizable\":\n\t\t\t\t\t\t\tattributes.resizable = __parseBool(argValue);\n\t\t\t\t\t\tcase \"stencil\", \"stencil-buffer\":\n\t\t\t\t\t\t\tattributes.context.stencil = __parseBool(argValue);\n\t\t\t\t\t\t// case \"title\": windowConfig.title = argValue;\n\t\t\t\t\t\tcase \"vsync\":\n\t\t\t\t\t\t\tattributes.context.vsync = __parseBool(argValue);\n\t\t\t\t\t\tcase \"width\":\n\t\t\t\t\t\t\tattributes.width = Std.parseInt(argValue);\n\t\t\t\t\t\tcase \"x\":\n\t\t\t\t\t\t\tattributes.x = Std.parseInt(argValue);\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\tattributes.y = Std.parseInt(argValue);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (!Reflect.hasField(attributes.parameters, parameter))\n\t\t\t\t{\n\t\t\t\t\tReflect.setField(attributes.parameters, parameter, argValue);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t#end\n\n\t@:noCompletion private static inline function __parseBool(value:String):Bool\n\t{\n\t\treturn (value == \"true\");\n\t}\n\n\t@:noCompletion private static function __registerEntryPoint(projectName:String, entryPoint:Function):Void\n\t{\n\t\tif (__applicationEntryPoint == null)\n\t\t{\n\t\t\t__applicationEntryPoint = new Map();\n\t\t}\n\n\t\t__applicationEntryPoint[projectName] = entryPoint;\n\t}\n\n\t@:noCompletion private static function __runProcess(command:String, args:Array<String> = null):String\n\t{\n\t\t#if sys\n\t\ttry\n\t\t{\n\t\t\tif (args == null) args = [];\n\n\t\t\tvar process = new Process(command, args);\n\t\t\tvar value = StringTools.trim(process.stdout.readLine().toString());\n\t\t\tprocess.close();\n\t\t\treturn value;\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\t\t#end\n\t\treturn null;\n\t}\n\n\t// Get & Set Methods\n\tprivate static function get_allowScreenTimeout():Bool\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_system_get_allow_screen_timeout();\n\t\t#else\n\t\treturn true;\n\t\t#end\n\t}\n\n\tprivate static function set_allowScreenTimeout(value:Bool):Bool\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_system_set_allow_screen_timeout(value);\n\t\t#else\n\t\treturn true;\n\t\t#end\n\t}\n\n\tprivate static function get_applicationDirectory():String\n\t{\n\t\tif (__applicationDirectory == null)\n\t\t{\n\t\t\t__applicationDirectory = __getDirectory(APPLICATION);\n\t\t}\n\n\t\treturn __applicationDirectory;\n\t}\n\n\tprivate static function get_applicationStorageDirectory():String\n\t{\n\t\tif (__applicationStorageDirectory == null)\n\t\t{\n\t\t\t__applicationStorageDirectory = __getDirectory(APPLICATION_STORAGE);\n\t\t}\n\n\t\treturn __applicationStorageDirectory;\n\t}\n\n\tprivate static function get_deviceModel():String\n\t{\n\t\tif (__deviceModel == null)\n\t\t{\n\t\t\t#if (lime_cffi && !macro && (windows || ios || tvos))\n\t\t\t__deviceModel = CFFI.stringValue(NativeCFFI.lime_system_get_device_model());\n\t\t\t#elseif android\n\t\t\tvar manufacturer:String = JNI.createStaticField(\"android/os/Build\", \"MANUFACTURER\", \"Ljava/lang/String;\").get();\n\t\t\tvar model:String = JNI.createStaticField(\"android/os/Build\", \"MODEL\", \"Ljava/lang/String;\").get();\n\t\t\tif (manufacturer != null && model != null)\n\t\t\t{\n\t\t\t\tif (StringTools.startsWith(model.toLowerCase(), manufacturer.toLowerCase()))\n\t\t\t\t{\n\t\t\t\t\tmodel = StringTools.trim(model.substr(manufacturer.length));\n\t\t\t\t\twhile (StringTools.startsWith(model, \"-\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tmodel = StringTools.trim(model.substr(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t__deviceModel = model;\n\t\t\t}\n\t\t\t#elseif mac\n\t\t\t__deviceModel = __runProcess(\"sysctl\", [\"-n\", \"hw.model\"]);\n\t\t\t#elseif linux\n\t\t\t__deviceModel = __runProcess(\"cat\", [\"/sys/devices/virtual/dmi/id/sys_vendor\"]);\n\t\t\t#end\n\t\t}\n\n\t\treturn __deviceModel;\n\t}\n\n\tprivate static function get_deviceVendor():String\n\t{\n\t\tif (__deviceVendor == null)\n\t\t{\n\t\t\t#if (lime_cffi && !macro && windows && !html5)\n\t\t\t__deviceVendor = CFFI.stringValue(NativeCFFI.lime_system_get_device_vendor());\n\t\t\t#elseif android\n\t\t\tvar vendor:String = JNI.createStaticField(\"android/os/Build\", \"MANUFACTURER\", \"Ljava/lang/String;\").get();\n\t\t\tif (vendor != null)\n\t\t\t{\n\t\t\t\t__deviceVendor = vendor.charAt(0).toUpperCase() + vendor.substr(1);\n\t\t\t}\n\t\t\t#elseif (ios || mac || tvos)\n\t\t\t__deviceVendor = \"Apple\";\n\t\t\t#elseif linux\n\t\t\t__deviceVendor = __runProcess(\"cat\", [\"/sys/devices/virtual/dmi/id/product_name\"]);\n\t\t\t#end\n\t\t}\n\n\t\treturn __deviceVendor;\n\t}\n\n\tprivate static function get_desktopDirectory():String\n\t{\n\t\tif (__desktopDirectory == null)\n\t\t{\n\t\t\t__desktopDirectory = __getDirectory(DESKTOP);\n\t\t}\n\n\t\treturn __desktopDirectory;\n\t}\n\n\tprivate static function get_documentsDirectory():String\n\t{\n\t\tif (__documentsDirectory == null)\n\t\t{\n\t\t\t__documentsDirectory = __getDirectory(DOCUMENTS);\n\t\t}\n\n\t\treturn __documentsDirectory;\n\t}\n\n\tprivate static function get_endianness():Endian\n\t{\n\t\tif (__endianness == null)\n\t\t{\n\t\t\t#if (ps3 || wiiu || flash)\n\t\t\t__endianness = BIG_ENDIAN;\n\t\t\t#else\n\t\t\tvar arrayBuffer = new ArrayBuffer(2);\n\t\t\tvar uint8Array = new UInt8Array(arrayBuffer);\n\t\t\tvar uint16array = new UInt16Array(arrayBuffer);\n\t\t\tuint8Array[0] = 0xAA;\n\t\t\tuint8Array[1] = 0xBB;\n\t\t\tif (uint16array[0] == 0xAABB) __endianness = BIG_ENDIAN;\n\t\t\telse\n\t\t\t\t__endianness = LITTLE_ENDIAN;\n\t\t\t#end\n\t\t}\n\n\t\treturn __endianness;\n\t}\n\n\tprivate static function get_fontsDirectory():String\n\t{\n\t\tif (__fontsDirectory == null)\n\t\t{\n\t\t\t__fontsDirectory = __getDirectory(FONTS);\n\t\t}\n\n\t\treturn __fontsDirectory;\n\t}\n\n\tprivate static function get_numDisplays():Int\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_system_get_num_displays();\n\t\t#else\n\t\treturn 1;\n\t\t#end\n\t}\n\n\tprivate static function get_platformLabel():String\n\t{\n\t\tif (__platformLabel == null)\n\t\t{\n\t\t\t#if (lime_cffi && !macro && windows && !html5)\n\t\t\tvar label:String = CFFI.stringValue(NativeCFFI.lime_system_get_platform_label());\n\t\t\tif (label != null) __platformLabel = StringTools.trim(label);\n\t\t\t#elseif linux\n\t\t\t__platformLabel = __runProcess(\"lsb_release\", [\"-ds\"]);\n\t\t\t#else\n\t\t\tvar name = System.platformName;\n\t\t\tvar version = System.platformVersion;\n\t\t\tif (name != null && version != null) __platformLabel = name + \" \" + version;\n\t\t\telse if (name != null) __platformLabel = name;\n\t\t\t#end\n\t\t}\n\n\t\treturn __platformLabel;\n\t}\n\n\tprivate static function get_platformName():String\n\t{\n\t\tif (__platformName == null)\n\t\t{\n\t\t\t#if windows\n\t\t\t__platformName = \"Windows\";\n\t\t\t#elseif mac\n\t\t\t__platformName = \"macOS\";\n\t\t\t#elseif linux\n\t\t\t__platformName = __runProcess(\"lsb_release\", [\"-is\"]);\n\t\t\t#elseif ios\n\t\t\t__platformName = \"iOS\";\n\t\t\t#elseif android\n\t\t\t__platformName = \"Android\";\n\t\t\t#elseif air\n\t\t\t__platformName = \"AIR\";\n\t\t\t#elseif flash\n\t\t\t__platformName = \"Flash Player\";\n\t\t\t#elseif tvos\n\t\t\t__platformName = \"tvOS\";\n\t\t\t#elseif tizen\n\t\t\t__platformName = \"Tizen\";\n\t\t\t#elseif blackberry\n\t\t\t__platformName = \"BlackBerry\";\n\t\t\t#elseif firefox\n\t\t\t__platformName = \"Firefox\";\n\t\t\t#elseif webos\n\t\t\t__platformName = \"webOS\";\n\t\t\t#elseif nodejs\n\t\t\t__platformName = \"Node.js\";\n\t\t\t#elseif js\n\t\t\t__platformName = \"HTML5\";\n\t\t\t#end\n\t\t}\n\n\t\treturn __platformName;\n\t}\n\n\tprivate static function get_platformVersion():String\n\t{\n\t\tif (__platformVersion == null)\n\t\t{\n\t\t\t#if (lime_cffi && !macro && windows && !html5)\n\t\t\t__platformVersion = CFFI.stringValue(NativeCFFI.lime_system_get_platform_version());\n\t\t\t#elseif android\n\t\t\tvar release = JNI.createStaticField(\"android/os/Build$VERSION\", \"RELEASE\", \"Ljava/lang/String;\").get();\n\t\t\tvar api = JNI.createStaticField(\"android/os/Build$VERSION\", \"SDK_INT\", \"I\").get();\n\t\t\tif (release != null && api != null) __platformVersion = release + \" (API \" + api + \")\";\n\t\t\t#elseif (lime_cffi && !macro && (ios || tvos))\n\t\t\t__platformVersion = NativeCFFI.lime_system_get_platform_version();\n\t\t\t#elseif mac\n\t\t\t__platformVersion = __runProcess(\"sw_vers\", [\"-productVersion\"]);\n\t\t\t#elseif linux\n\t\t\t__platformVersion = __runProcess(\"lsb_release\", [\"-rs\"]);\n\t\t\t#elseif flash\n\t\t\t__platformVersion = Capabilities.version;\n\t\t\t#end\n\t\t}\n\n\t\treturn __platformVersion;\n\t}\n\n\tprivate static function get_userDirectory():String\n\t{\n\t\tif (__userDirectory == null)\n\t\t{\n\t\t\t__userDirectory = __getDirectory(USER);\n\t\t}\n\n\t\treturn __userDirectory;\n\t}\n}\n\n#if (haxe_ver >= 4.0) private enum #else @:enum private #end abstract SystemDirectory(Int) from Int to Int from UInt to UInt\n{\n\tvar APPLICATION = 0;\n\tvar APPLICATION_STORAGE = 1;\n\tvar DESKTOP = 2;\n\tvar DOCUMENTS = 3;\n\tvar FONTS = 4;\n\tvar USER = 5;\n}\n"
  },
  {
    "path": "src/lime/system/ThreadPool.hx",
    "content": "package lime.system;\n\nimport lime.app.Application;\nimport lime.app.Event;\nimport lime.system.WorkOutput;\nimport lime.utils.Log;\n#if target.threaded\nimport sys.thread.Deque;\nimport sys.thread.Thread;\n#elseif cpp\nimport cpp.vm.Deque;\nimport cpp.vm.Thread;\n#elseif neko\nimport neko.vm.Deque;\nimport neko.vm.Thread;\n#elseif html5\nimport lime._internal.backend.html5.HTML5Thread as Thread;\nimport lime._internal.backend.html5.HTML5Thread.Transferable;\n\n#if lime_threads_deque\n#error \"lime_threads_deque is not yet supported in HTML5\"\n#end\n#end\n#if (haxe_ver >= 4.1)\nimport haxe.Exception;\n#end\n\n/**\n\tA thread pool executes one or more functions asynchronously.\n\n\tIn multi-threaded mode, jobs run on background threads. In HTML5, this means\n\tusing web workers, which impose additional restrictions (see below). In\n\tsingle-threaded mode, jobs run between frames on the main thread. To avoid\n\tblocking, these jobs should only do a small amount of work at a time.\n\n\tIn multi-threaded mode, the pool spins up new threads as jobs arrive (up to\n\t`maxThreads`). If too many jobs arrive at once, it places them in a queue to\n\trun when threads open up. If you run jobs frequently but not constantly, you\n\tcan also set `minThreads` to keep a certain number of threads alive,\n\tavoiding the overhead of repeatedly spinning them up.\n\n\tSample usage:\n\n\t\tvar threadPool:ThreadPool = new ThreadPool();\n\t\tthreadPool.onComplete.add(onFileProcessed);\n\n\t\tthreadPool.maxThreads = 3;\n\t\tfor(url in urls)\n\t\t{\n\t\t\tthreadPool.run(processFile, url);\n\t\t}\n\n\tGuidelines to make your code work on all targets and configurations:\n\n\t- For thread safety and web worker compatibility, your work function should\n\t  only return data through the `WorkOutput` object it receives.\n\t- For web worker compatibility, you should only send data to your work\n\t  function via the `State` object. But since this can be any object, you can\n\t  put an arbitrary amount of data there.\n\t- For web worker compatibility, your work function must be static, and you\n\t  can't `bind()` any extra arguments.\n\t- For single-threaded performance, your function should only do a small\n\t  amount of work at a time. Store progress in the `State` object so you can\n\t  pick up where you left off. You don't have to worry about timing: just aim\n\t  to take a small fraction of the frame's time, and `ThreadPool` will keep\n\t  running the function until enough time passes.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass ThreadPool extends WorkOutput\n{\n\t#if (haxe4 && lime_threads && !html5)\n\t/**\n\t\tA reference to the app's main thread, for use in `isMainThread()`.\n\t**/\n\tprivate static var __mainThread:Thread = Thread.current();\n\t#end\n\n\t/**\n\t\tA rough estimate of how much of the app's time should be spent on\n\t\tsingle-threaded jobs, across all active `ThreadPool`s. For instance, the\n\t\tdefault value of 1/2 means `ThreadPool`s will attempt to use about half\n\t\tthe app's available time every frame.\n\n\t\tThe accuracy of this estimate depends on how often your work functions\n\t\treturn. If you find that a `ThreadPool` is taking longer than scheduled,\n\t\ttry making the work function return more often.\n\t**/\n\tpublic static var workLoad:Float = 1 / 2;\n\n\t/**\n\t\t__Access this only from the main thread.__\n\n\t\tThe sum of `workPriority` values from all pools with an ongoing\n\t\tsingle-threaded job.\n\t**/\n\tprivate static var __totalWorkPriority:Float = 0;\n\n\t/**\n\t\tReturns whether the caller called this function from the main thread.\n\t**/\n\tpublic static inline function isMainThread():Bool\n\t{\n\t\t#if (html5 && lime_threads)\n\t\treturn !Thread.current().isWorker();\n\t\t#elseif (haxe4 && lime_threads)\n\t\treturn Thread.current() == __mainThread;\n\t\t#else\n\t\treturn true;\n\t\t#end\n\t}\n\n\t/**\n\t\tThe number of jobs actively being executed.\n\t**/\n\tpublic var activeJobs(get, never):Int;\n\n\t/**\n\t\tThe number of jobs currently running on a background thread.\n\t**/\n\tpublic var activeThreads(default, null):Int = 0;\n\n\t/**\n\t\tThe number of background threads in this pool, including both active and\n\t\tidle threads. Does not include threads that are shutting down.\n\t**/\n\tpublic var currentThreads(get, never):Int;\n\n\t/**\n\t\tThe number of background threads in this pool that are currently idle,\n\t\tneither working on a job nor shutting down.\n\t**/\n\tpublic var idleThreads(get, never):Int;\n\n\t/**\n\t\t`idleThreads + __queuedExitEvents`\n\t**/\n\tprivate var __idleThreads:Int = 0;\n\n\t/**\n\t\t__Set this only from the main thread.__\n\n\t\tThe maximum number of background threads this pool can have at once. If\n\t\tthis value decreases, active jobs will still be allowed to finish.\n\t**/\n\tpublic var maxThreads:Int;\n\n\t/**\n\t\t__Set this only from the main thread.__\n\n\t\tThe number of background threads that will be kept alive at all times,\n\t\teven if there's no work to do. Setting this won't immediately spin up\n\t\tnew threads; you must still call `run()` to get them started.\n\t**/\n\tpublic var minThreads:Int;\n\n\t/**\n\t\tDispatched on the main thread when `doWork` calls `sendComplete()`.\n\t\tDispatched at most once per job.\n\t**/\n\tpublic var onComplete(default, null) = new Event<Dynamic->Void>();\n\n\t/**\n\t\tDispatched on the main thread when `doWork` calls `sendError()`.\n\t\tDispatched at most once per job.\n\t**/\n\tpublic var onError(default, null) = new Event<Dynamic->Void>();\n\n\t/**\n\t\tDispatched on the main thread when `doWork` calls `sendProgress()`. May\n\t\tbe dispatched any number of times per job.\n\t**/\n\tpublic var onProgress(default, null) = new Event<Dynamic->Void>();\n\n\t/**\n\t\tDispatched on the main thread when a new job begins. Dispatched exactly\n\t\tonce per job.\n\t**/\n\tpublic var onRun(default, null) = new Event<State->Void>();\n\n\t#if (haxe_ver >= 4.1)\n\t/**\n\t\tDispatched on the main thread when `doWork` throws an error. Dispatched\n\t\tat most once per job.\n\n\t\tIf no listeners have been added, instead the error will be rethrown.\n\t**/\n\tpublic var onUncaughtError(default, null) = new Event<Exception->Void>();\n\t#end\n\n\t/**\n\t\tHow important this pool's single-threaded jobs are, relative to other\n\t\tpools. Pools will be allocated a share of the time per frame (see\n\t\t`workLoad`) based on their importance.\n\n\t\tFor instance, if all pools use the default priority of 1, they will all\n\t\trun for an approximately equal amount of time each frame. If one has a\n\t\tvalue of 2, it will run approximately twice as long as the others.\n\t**/\n\tpublic var workPriority(default, set):Float = 1;\n\n\t@:deprecated(\"Instead pass the callback to ThreadPool.run().\")\n\t@:noCompletion @:dox(hide) public var doWork(get, never):PseudoEvent;\n\n\tprivate var __doWork:WorkFunction<State->WorkOutput->Void>;\n\n\t#if lime_threads\n\t/**\n\t\tJobs running or queued to run on a background thread.\n\t**/\n\tprivate var __multiThreadedJobs:JobArray = new JobArray();\n\n\t#if lime_threads_deque\n\tprivate var __multiThreadedQueue:JobQueue = new JobQueue();\n\tprivate var __queuedWorkEvents:Int = 0;\n\t#end\n\n\tprivate var __queuedExitEvents:Int = 0;\n\n\tprivate var __threads:Array<ThreadData> = [];\n\t#end\n\n\t/**\n\t\tWhether a job is running on the main thread, or will run during the next\n\t\tupdate. As long as this is true, this pool's `workPriority` will be\n\t\tincluded in `__totalWorkPriority`.\n\t**/\n\tprivate var __singleThreadedJobRunning(default, set):Bool = false;\n\n\t/**\n\t\tJobs running or queued to run on the main thread.\n\t**/\n\tprivate var __singleThreadedJobs:JobArray = new JobArray();\n\n\t/**\n\t\t__Call this only from the main thread.__\n\n\t\t@param minThreads The number of threads that will be kept alive at all\n\t\ttimes, even if there's no work to do. The threads won't spin up\n\t\timmediately; only after enough calls to `run()`.\n\t\t@param maxThreads The maximum number of threads that will run at once.\n\t\t@param mode The mode jobs will run in by default. Defaults to\n\t\t`SINGLE_THREADED` in HTML5 for backwards compatibility.\n\t**/\n\tpublic function new(minThreads:Int = 0, maxThreads:Int = 1, mode:ThreadMode = null)\n\t{\n\t\tif (!isMainThread())\n\t\t{\n\t\t\tthrow \"Call new ThreadPool() only from the main thread.\";\n\t\t}\n\n\t\tsuper(mode);\n\n\t\tthis.minThreads = minThreads;\n\t\tthis.maxThreads = maxThreads;\n\t}\n\n\t/**\n\t\tCancels all active and queued jobs.\n\n\t\tNote: It isn't possible to terminate a job from the outside, so canceled\n\t\tjobs may continue to run for some time. However, any events they send\n\t\twill be ignored.\n\t\t@param error If not null, this error will be dispatched for each active\n\t\tor queued job.\n\t**/\n\tpublic function cancel(error:Dynamic = null):Void\n\t{\n\t\tif (!isMainThread())\n\t\t{\n\t\t\tthrow \"Call cancel() only from the main thread.\";\n\t\t}\n\n\t\t#if lime_threads\n\t\t// Dispatch error events.\n\t\tif (error != null)\n\t\t{\n\t\t\tfor (job in __multiThreadedJobs)\n\t\t\t{\n\t\t\t\tif (job.started)\n\t\t\t\t{\n\t\t\t\t\tjob.duration = timestamp() - job.startTime;\n\t\t\t\t}\n\n\t\t\t\tactiveJob = job;\n\t\t\t\tonError.dispatch(error);\n\t\t\t\tactiveJob = null;\n\t\t\t}\n\t\t}\n\t\t__multiThreadedJobs.clear();\n\n\t\t#if lime_threads_deque\n\t\t// Clear the queue, then replace the `EXIT` events.\n\t\tvar queuedEvent:ThreadEvent = null;\n\t\twhile ((queuedEvent = __multiThreadedQueue.pop(false)) != null)\n\t\t{\n\t\t\tif (queuedEvent.event == EXIT)\n\t\t\t{\n\t\t\t\t__queuedExitEvents--;\n\t\t\t}\n\t\t}\n\t\t__queuedWorkEvents = 0;\n\n\t\twhile (currentThreads > minThreads)\n\t\t{\n\t\t\t__multiThreadedQueue.add({event: EXIT});\n\t\t\t__queuedExitEvents++;\n\t\t}\n\t\t#end\n\n\t\t// Make all threads go idle. In `lime_threads_deque` mode, this will\n\t\t// make them check the queue. Otherwise, `__onThreadIdle()` will decide\n\t\t// which should be exited.\n\t\tfor (threadID in 0...__threads.length)\n\t\t{\n\t\t\tvar threadData:ThreadData = __threads[threadID];\n\t\t\tif (threadData != null && threadData.jobID != null)\n\t\t\t{\n\t\t\t\tthreadData.thread.sendMessage({event: IDLE});\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\t// Clear single-threaded jobs.\n\t\tif (error != null)\n\t\t{\n\t\t\tfor (job in __singleThreadedJobs)\n\t\t\t{\n\t\t\t\tactiveJob = job;\n\t\t\t\tonError.dispatch(error);\n\t\t\t}\n\t\t}\n\n\t\t__singleThreadedJobs.clear();\n\t\t__singleThreadedJobRunning = false;\n\n\t\t__jobComplete.value = false;\n\t\tactiveJob = null;\n\t}\n\n\t/**\n\t\tCancels one active or queued job. Does not dispatch an error event.\n\n\t\tNote: It isn't possible to terminate a job from the outside, so the job\n\t\tmay continue to run for some time. However, any events it sends will be\n\t\tignored.\n\t\t@return Whether a job was canceled.\n\t**/\n\tpublic function cancelJob(jobID:Int):Bool\n\t{\n\t\tif (__singleThreadedJobs.removeJob(jobID) != null)\n\t\t{\n\t\t\t__singleThreadedJobRunning = __singleThreadedJobs.length > 0;\n\t\t\treturn true;\n\t\t}\n\n\t\t#if lime_threads\n\t\tvar job:JobData = __multiThreadedJobs.removeJob(jobID);\n\t\tif (job != null)\n\t\t{\n\t\t\tfor (threadData in __threads)\n\t\t\t{\n\t\t\t\tif (threadData != null && threadData.jobID == jobID)\n\t\t\t\t{\n\t\t\t\t\tthreadData.thread.sendMessage({event: IDLE});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t/**\n\t\tAlias for `ThreadPool.run()`.\n\t**/\n\t@:noCompletion public inline function queue(doWork:WorkFunction<State->WorkOutput->Void> = null, state:State = null):Int\n\t{\n\t\treturn run(doWork, state);\n\t}\n\n\t/**\n\t\tRuns the given function asynchronously, or queues it for later if no\n\t\tmore threads are available.\n\t\t@param doWork The function to run. For best results, see the guidelines\n\t\tin the `ThreadPool` class overview. In brief: `doWork` should be static,\n\t\tonly access its arguments, and return often.\n\t\t@param state An object to pass to `doWork`. Consider passing a mutable\n\t\tobject so that `doWork` can save its progress.\n\t\t@param mode Which mode to run the job in. If omitted, the pool's default\n\t\tmode will be used.\n\t\t@return The job's unique ID.\n\t**/\n\tpublic function run(doWork:WorkFunction<State->WorkOutput->Void> = null, state:State = null, ?mode:ThreadMode = null):Int\n\t{\n\t\tif (!isMainThread())\n\t\t{\n\t\t\tthrow \"Call run() only from the main thread.\";\n\t\t}\n\n\t\tif (mode == null)\n\t\t{\n\t\t\tmode = this.mode;\n\t\t}\n\n\t\tif (doWork == null)\n\t\t{\n\t\t\tif (__doWork == null #if html5 || mode == MULTI_THREADED #end)\n\t\t\t{\n\t\t\t\tthrow \"run() requires doWork argument.\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdoWork = __doWork;\n\t\t\t}\n\t\t}\n\n\t\tif (state == null)\n\t\t{\n\t\t\tstate = {};\n\t\t}\n\n\t\tvar job:JobData = new JobData(doWork, state);\n\t\t#if lime_threads\n\t\tif (mode == MULTI_THREADED)\n\t\t{\n\t\t\t__multiThreadedJobs.push(job);\n\t\t\t__runMultiThreadedJob(job);\n\t\t}\n\t\telse\n\t\t#end\n\t\t{\n\t\t\t__singleThreadedJobs.push(job);\n\t\t\t__singleThreadedJobRunning = true;\n\t\t}\n\n\t\tif (Application.current != null && !Application.current.onUpdate.has(__update))\n\t\t{\n\t\t\tApplication.current.onUpdate.add(__update);\n\t\t}\n\n\t\treturn job.id;\n\t}\n\n\t/**\n\t\t__Call this only from the main thread.__\n\n\t\tDispatches the given event immediately.\n\t**/\n\tprivate function __dispatchJobOutput(event:ThreadEvent):Void\n\t{\n\t\tvar oldActiveJob:Null<JobData> = activeJob;\n\t\tactiveJob = null;\n\n\t\tif (__singleThreadedJobs.length > 0 && event.jobID == __singleThreadedJobs.first().id)\n\t\t{\n\t\t\tactiveJob = __singleThreadedJobs.first();\n\t\t}\n\t\t#if lime_threads\n\t\telse if ((activeJob = __multiThreadedJobs.getJob(event.jobID)) != null)\n\t\t{\n\t\t\tif (activeJob.started)\n\t\t\t{\n\t\t\t\tactiveJob.duration = timestamp() - activeJob.startTime;\n\t\t\t}\n\n\t\t\tif (event.event == COMPLETE || event.event == ERROR || event.event == UNCAUGHT_ERROR)\n\t\t\t{\n\t\t\t\t__multiThreadedJobs.removeJob(activeJob.id);\n\t\t\t}\n\t\t}\n\t\t#end\n\t\telse if (event.jobID != null)\n\t\t{\n\t\t\t#if (lime_threads && lime_threads_deque)\n\t\t\t// `cancelJob()` can't remove the job from the queue, so instead it\n\t\t\t// marks it to be canceled later. (And \"later\" is now.)\n\t\t\tif (event.event == WORK && event.threadID != null)\n\t\t\t{\n\t\t\t\t__threads[event.threadID].thread.sendMessage({event: IDLE});\n\t\t\t\t__queuedWorkEvents--;\n\t\t\t}\n\t\t\t#end\n\n\t\t\tactiveJob = oldActiveJob;\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (event.event)\n\t\t{\n\t\t\tcase PROGRESS:\n\t\t\t\tonProgress.dispatch(event.message);\n\n\t\t\tcase COMPLETE:\n\t\t\t\tonComplete.dispatch(event.message);\n\n\t\t\tcase ERROR:\n\t\t\t\tonError.dispatch(event.message);\n\n\t\t\tcase UNCAUGHT_ERROR:\n\t\t\t\tvar message:String;\n\n\t\t\t\t#if (haxe_ver >= 4.1)\n\t\t\t\tif (Std.isOfType(event.message, Exception))\n\t\t\t\t{\n\t\t\t\t\tif (onUncaughtError.__listeners.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tonUncaughtError.dispatch(event.message);\n\t\t\t\t\t\tmessage = null;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage = (event.message:Exception).details();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t#end\n\t\t\t\t{\n\t\t\t\t\tmessage = Std.string(event.message);\n\t\t\t\t}\n\n\t\t\t\tif (message != null)\n\t\t\t\t{\n\t\t\t\t\tactiveJob = null;\n\t\t\t\t\tLog.error(message);\n\t\t\t\t}\n\n\t\t\tcase WORK:\n\t\t\t\tactiveJob.startTime = timestamp();\n\t\t\t\tonRun.dispatch(activeJob.state);\n\n\t\t\t\t#if lime_threads\n\t\t\t\tvar threadData = __threads[event.threadID];\n\t\t\t\tif (threadData.jobID == null)\n\t\t\t\t{\n\t\t\t\t\t__idleThreads--;\n\t\t\t\t\tactiveThreads++;\n\t\t\t\t}\n\t\t\t\tthreadData.jobID = event.jobID;\n\n\t\t\t\t#if lime_threads_deque\n\t\t\t\t__queuedWorkEvents--;\n\t\t\t\t#end\n\t\t\t\t#end\n\n\t\t\t#if lime_threads\n\t\t\tcase IDLE:\n\t\t\t\t__onThreadIdle(event.threadID);\n\n\t\t\tcase EXIT:\n\t\t\t\tvar threadData:ThreadData = __threads[event.threadID];\n\t\t\t\tif (threadData.jobID != null)\n\t\t\t\t\tactiveThreads--;\n\t\t\t\telse\n\t\t\t\t\t__idleThreads--;\n\n\t\t\t\t__threads[event.threadID] = null;\n\t\t\t\t__queuedExitEvents--;\n\t\t\t#end\n\n\t\t\tdefault:\n\t\t}\n\n\t\tactiveJob = oldActiveJob;\n\t}\n\n\tpublic override function sendComplete(message:Dynamic = null, transferList:Array<Transferable> = null)\n\t{\n\t\tif (__jobComplete.value)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\telse if (isMainThread() && activeJob == __singleThreadedJobs.first())\n\t\t{\n\t\t\t__jobComplete.value = true;\n\t\t\t__dispatchJobOutput({event: COMPLETE, message: message, jobID: activeJob.id});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsuper.sendComplete(message, transferList);\n\t\t}\n\t}\n\n\tpublic override function sendError(message:Dynamic = null, transferList:Array<Transferable> = null)\n\t{\n\t\tif (__jobComplete.value)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\telse if (isMainThread() && activeJob == __singleThreadedJobs.first())\n\t\t{\n\t\t\t__jobComplete.value = true;\n\t\t\t__dispatchJobOutput({event: ERROR, message: message, jobID: activeJob.id});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsuper.sendError(message, transferList);\n\t\t}\n\t}\n\n\tpublic override function sendProgress(message:Dynamic = null, transferList:Array<Transferable> = null)\n\t{\n\t\tif (__jobComplete.value)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\telse if (isMainThread() && activeJob == __singleThreadedJobs.first())\n\t\t{\n\t\t\t__dispatchJobOutput({event: PROGRESS, message: message, jobID: activeJob.id});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsuper.sendProgress(message, transferList);\n\t\t}\n\t}\n\n\t#if lime_threads\n\t/**\n\t\t__Run this only on a background thread.__\n\n\t\tRetrieves jobs using `Thread.readMessage()`, runs them until complete,\n\t\tand repeats. The first message must be `ThreadArguments`, and the rest\n\t\tmust be `ThreadEvent`s.\n\t**/\n\tprivate static function __executeThread():Void\n\t{\n\t\t// @formatter:off\n\t\tJSAsync.async({\n\t\t\tvar args:ThreadArguments = Thread.readMessage(true);\n\t\t\tvar output:WorkOutput = #if html5 new WorkOutput(MULTI_THREADED) #else args.output #end;\n\t\t\t#if lime_threads_deque\n\t\t\tvar jobQueue:JobQueue = args.queue;\n\t\t\t#end\n\t\t\tvar event:ThreadEvent = null;\n\t\t\tvar firstLoop:Bool = true;\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\t// Get a job.\n\t\t\t\tif (event == null)\n\t\t\t\t{\n\t\t\t\t\t#if lime_threads_deque\n\t\t\t\t\tevent = jobQueue.pop(false);\n\t\t\t\t\t#else\n\t\t\t\t\tevent = Thread.readMessage(false);\n\t\t\t\t\t#end\n\n\t\t\t\t\tif (event == null && !firstLoop)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Let the main thread know this thread is awaiting\n\t\t\t\t\t\t// work. Threads start out idle, so there's no need\n\t\t\t\t\t\t// during the first loop.\n\t\t\t\t\t\toutput.sendThreadEvent({event: IDLE, threadID: args.threadID});\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (event == null) {\n\t\t\t\t\t\t#if lime_threads_deque\n\t\t\t\t\t\tevent = jobQueue.pop(true);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\tevent = Thread.readMessage(true);\n\t\t\t\t\t\t#end\n\t\t\t\t\t}\n\n\t\t\t\t\t#if lime_threads_deque\n\t\t\t\t\t// Any interruptions sent in `lime_threads_deque` mode are\n\t\t\t\t\t// simply to make the thread check `jobQueue`. If they\n\t\t\t\t\t// arrive while the thread is waiting for `jobQueue.pop()`,\n\t\t\t\t\t// then their job is already done and they can be ignored.\n\t\t\t\t\twhile (Thread.readMessage(false) != null) {}\n\t\t\t\t\t#end\n\n\t\t\t\t\toutput.resetJobProgress();\n\n\t\t\t\t\tfirstLoop = false;\n\t\t\t\t}\n\n\t\t\t\tif (event.event == EXIT)\n\t\t\t\t{\n\t\t\t\t\t// Quit working.\n\t\t\t\t\toutput.sendThreadEvent({event: EXIT, threadID: args.threadID});\n\t\t\t\t\t#if html5\n\t\t\t\t\tThread.current().destroy();\n\t\t\t\t\t#end\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.event != WORK || event.doWork == null || event.jobID == null)\n\t\t\t\t{\n\t\t\t\t\t// Go idle.\n\t\t\t\t\tevent = null;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Get to work.\n\t\t\t\toutput.activeJob = new JobData(event.doWork, event.state, event.jobID);\n\n\t\t\t\tvar interruption:ThreadEvent = null;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\twhile (!output.__jobComplete.value && (interruption = Thread.readMessage(false)) == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (output.workIterations.value == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toutput.sendThreadEvent({event: WORK, jobID: event.jobID, threadID: args.threadID});\n\t\t\t\t\t\t}\n\t\t\t\t\t\toutput.workIterations.value = output.workIterations.value + 1;\n\t\t\t\t\t\tevent.doWork.dispatch(event.state, output);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (e:#if (haxe_ver >= 4.1) Exception #else Dynamic #end)\n\t\t\t\t{\n\t\t\t\t\toutput.sendUncaughtError(e);\n\t\t\t\t}\n\n\t\t\t\toutput.activeJob = null;\n\n\t\t\t\tif (interruption == null || output.__jobComplete.value)\n\t\t\t\t{\n\t\t\t\t\t// Work is done; wait for more.\n\t\t\t\t\tevent = interruption;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Work on the new job.\n\t\t\t\t\tevent = interruption;\n\t\t\t\t\toutput.resetJobProgress();\n\t\t\t\t}\n\n\t\t\t\t// Do it all again.\n\t\t\t}\n\t\t});\n\t\t// @formatter:on\n\t}\n\t#end\n\n\tprivate static inline function timestamp():Float\n\t{\n\t\t#if sys\n\t\treturn Sys.cpuTime();\n\t\t#else\n\t\treturn haxe.Timer.stamp();\n\t\t#end\n\t}\n\n\t/**\n\t\tProcesses the job queues, then processes incoming events.\n\t**/\n\tprivate function __update(deltaTime:Int):Void\n\t{\n\t\tif (!isMainThread())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Run single-threaded jobs.\n\t\tvar endTime:Float = timestamp();\n\t\tif (__totalWorkPriority > 0)\n\t\t{\n\t\t\t// Lime may be run without a window.\n\t\t\tvar frameRate:Float = 60;\n\t\t\tif (Application.current.window != null)\n\t\t\t{\n\t\t\t\tframeRate = Application.current.window.frameRate;\n\t\t\t}\n\n\t\t\t// `workLoad / frameRate` is the total time that pools may use per frame.\n\t\t\t// `workPriority / __totalWorkPriority` is this pool's fraction of that total.\n\t\t\t// Multiply together to get how much time this pool can spend.\n\t\t\tendTime += workLoad * workPriority / (frameRate * __totalWorkPriority);\n\t\t}\n\n\t\tvar jobStartTime:Float;\n\t\twhile (__singleThreadedJobs.length > 0 && (jobStartTime = timestamp()) < endTime)\n\t\t{\n\t\t\tactiveJob = __singleThreadedJobs.first();\n\n\t\t\tif (!activeJob.started)\n\t\t\t{\n\t\t\t\tactiveJob.startTime = jobStartTime;\n\t\t\t\tonRun.dispatch(activeJob.state);\n\t\t\t}\n\n\t\t\t__jobComplete.value = false;\n\t\t\tworkIterations.value = 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tworkIterations.value = workIterations.value + 1;\n\t\t\t\t\tactiveJob.doWork.dispatch(activeJob.state, this);\n\t\t\t\t}\n\t\t\t\twhile (!__jobComplete.value && timestamp() < endTime);\n\t\t\t}\n\t\t\tcatch (e:#if (haxe_ver >= 4.1) Exception #else Dynamic #end)\n\t\t\t{\n\t\t\t\t__jobComplete.value = true;\n\t\t\t\t__dispatchJobOutput({event: UNCAUGHT_ERROR, message: e, jobID: activeJob.id});\n\t\t\t}\n\n\t\t\tvar jobEndTime:Float = timestamp();\n\n\t\t\tactiveJob.duration += jobEndTime - jobStartTime;\n\n\t\t\tactiveJob = null;\n\n\t\t\tif (__jobComplete.value)\n\t\t\t{\n\t\t\t\t__singleThreadedJobs.shift();\n\t\t\t\t__singleThreadedJobRunning = __singleThreadedJobs.length > 0;\n\t\t\t}\n\t\t}\n\n\t\t#if (lime_threads && !lime_threads_deque)\n\t\t__runMultiThreadedJobs();\n\t\t#end\n\n\t\t// Process events.\n\t\tvar threadEvent:ThreadEvent;\n\t\twhile ((threadEvent = __jobOutput.pop(false)) != null)\n\t\t{\n\t\t\t__dispatchJobOutput(threadEvent);\n\t\t}\n\n\t\tif (activeJobs #if lime_threads + __queuedExitEvents #if lime_threads_deque + __queuedWorkEvents #end #end\n\t\t\t<= 0)\n\t\t{\n\t\t\tApplication.current.onUpdate.remove(__update);\n\t\t}\n\t}\n\n\t#if lime_threads\n\n\t/**\n\t\tHandles a thread that just became idle. Depending on the circumstances,\n\t\tthis may do one of three things:\n\n\t\t- Start the next queued job, adding it to `__multiThreadedJobs`.\n\t\t- Marks the thread as idle.\n\t\t- Exit the thread if it doesn't need to be kept.\n\t**/\n\tprivate function __onThreadIdle(threadID:Int):Void\n\t{\n\t\tif (!isMainThread())\n\t\t{\n\t\t\tthrow \"Call __onThreadIdle() only from the main thread.\";\n\t\t}\n\n\t\tvar threadData:ThreadData = __threads[threadID];\n\t\tif (threadData == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (threadData.jobID != null)\n\t\t{\n\t\t\tthreadData.jobID = null;\n\t\t\tactiveThreads--;\n\t\t\t__idleThreads++;\n\t\t}\n\n\t\t#if lime_threads_deque\n\t\tif (idleThreads - __queuedWorkEvents > minThreads)\n\t\t{\n\t\t\t__multiThreadedQueue.add({event: EXIT});\n\t\t\t__queuedExitEvents++;\n\t\t}\n\t\t#else\n\t\t__runMultiThreadedJobs();\n\n\t\tif (idleThreads > minThreads)\n\t\t{\n\t\t\t#if html5\n\t\t\tthreadData.thread.destroy();\n\t\t\t__threads[threadID] = null;\n\t\t\t__idleThreads--;\n\t\t\t#else\n\t\t\tthreadData.thread.sendMessage({event: EXIT});\n\t\t\t__queuedExitEvents++;\n\t\t\t#end\n\t\t}\n\t\t#end\n\t}\n\n\tprivate function __runMultiThreadedJob(job:JobData):Void\n\t{\n\t\tif (job.started)\n\t\t{\n\t\t\tthrow \"Job \" + job.id + \" was already started!\";\n\t\t}\n\n\t\t#if html5\n\t\tjob.doWork.makePortable();\n\t\t#end\n\n\t\tvar threadEvent:ThreadEvent = {\n\t\t\tevent: WORK,\n\t\t\tjobID: job.id,\n\t\t\tdoWork: job.doWork,\n\t\t\tstate: job.state\n\t\t};\n\n\t\t#if lime_threads_deque\n\t\t__multiThreadedQueue.add(threadEvent);\n\t\t__queuedWorkEvents++;\n\t\tif (idleThreads <= __queuedWorkEvents && currentThreads < maxThreads)\n\t\t{\n\t\t\tcreateThread(__executeThread);\n\t\t}\n\t\t#else\n\t\tvar threadData:ThreadData = null;\n\t\tif (idleThreads > 0)\n\t\t{\n\t\t\tfor (data in __threads)\n\t\t\t{\n\t\t\t\tif (data != null && data.jobID == null)\n\t\t\t\t{\n\t\t\t\t\tthreadData = data;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (threadData == null)\n\t\t{\n\t\t\tif (currentThreads >= maxThreads)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar thread:Thread = createThread(__executeThread);\n\t\t\tfor (data in __threads)\n\t\t\t{\n\t\t\t\tif (data.thread == thread)\n\t\t\t\t{\n\t\t\t\t\tthreadData = data;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (threadData == null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthreadData.jobID = job.id;\n\t\tthreadData.thread.sendMessage(threadEvent);\n\t\t__idleThreads--;\n\t\tactiveThreads++;\n\t\t#end\n\n\t\t// Mark the job as started, even if it's only queued, to prevent\n\t\t// queueing it again. `startTime` will be updated again later, when\n\t\t// confirmation is received.\n\t\tjob.startTime = 0;\n\t}\n\n\t#if !lime_threads_deque\n\tprivate function __runMultiThreadedJobs():Void\n\t{\n\t\tif (activeThreads >= maxThreads)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfor (job in __multiThreadedJobs)\n\t\t{\n\t\t\tif (!job.started)\n\t\t\t{\n\t\t\t\t__runMultiThreadedJob(job);\n\t\t\t\tif (activeThreads >= maxThreads)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t#end\n\n\tprivate override function createThread(executeThread:WorkFunction<Void->Void>):Thread\n\t{\n\t\tvar thread:Thread = super.createThread(executeThread);\n\n\t\tvar index:Int = __threads.indexOf(null);\n\t\tif (index < 0)\n\t\t{\n\t\t\tindex = __threads.length;\n\t\t}\n\t\t__threads[index] = {thread: thread, jobID: null};\n\t\t__idleThreads++;\n\n\t\tthread.sendMessage({\n\t\t\t#if !html5\n\t\t\toutput: this,\n\t\t\t#end\n\t\t\t#if lime_threads_deque\n\t\t\tqueue: __multiThreadedQueue,\n\t\t\t#end\n\t\t\tthreadID: index\n\t\t});\n\n\t\treturn thread;\n\t}\n\n\t#end\n\n\t// Getters & Setters\n\n\tprivate inline function get_activeJobs():Int\n\t{\n\t\treturn activeThreads + (__singleThreadedJobs.length > 0 ? 1 : 0);\n\t}\n\n\tprivate inline function get_currentThreads():Int\n\t{\n\t\treturn activeThreads + idleThreads;\n\t}\n\n\tprivate function get_doWork():PseudoEvent\n\t{\n\t\treturn this;\n\t}\n\n\tprivate inline function get_idleThreads():Int\n\t{\n\t\treturn __idleThreads\n\t\t\t#if lime_threads - __queuedExitEvents #end;\n\t}\n\n\tprivate inline function set___singleThreadedJobRunning(value:Bool):Bool\n\t{\n\t\tif (value != __singleThreadedJobRunning)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\t__totalWorkPriority += workPriority;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t__totalWorkPriority -= workPriority;\n\t\t\t}\n\t\t}\n\t\treturn __singleThreadedJobRunning = value;\n\t}\n\n\tprivate function set_workPriority(value:Float):Float\n\t{\n\t\tif (__singleThreadedJobRunning)\n\t\t{\n\t\t\t__totalWorkPriority += value - workPriority;\n\t\t}\n\t\treturn workPriority = value;\n\t}\n}\n\n@:access(lime.system.ThreadPool)\nprivate abstract PseudoEvent(ThreadPool) from ThreadPool\n{\n\t@:noCompletion @:dox(hide) public var __listeners(get, never):Array<Dynamic>;\n\n\tprivate inline function get___listeners():Array<Dynamic>\n\t{\n\t\treturn [];\n\t};\n\n\t@:noCompletion @:dox(hide) public var __repeat(get, never):Array<Bool>;\n\n\tprivate inline function get___repeat():Array<Bool>\n\t{\n\t\treturn [];\n\t};\n\n\tpublic function add(callback:Dynamic->Void):Void\n\t{\n\t\tfunction callCallback(state:State, output:WorkOutput):Void\n\t\t{\n\t\t\tcallback(state);\n\t\t}\n\n\t\t#if (lime_threads && html5)\n\t\tthis.__doWork = {func: callCallback};\n\t\t#else\n\t\tthis.__doWork = callCallback;\n\t\t#end\n\t}\n\n\tpublic inline function cancel():Void {}\n\n\tpublic inline function dispatch():Void {}\n\n\tpublic inline function has(callback:Dynamic->Void):Bool\n\t{\n\t\treturn this.__doWork != null;\n\t}\n\n\tpublic inline function remove(callback:Dynamic->Void):Void\n\t{\n\t\tthis.__doWork = null;\n\t}\n\n\tpublic inline function removeAll():Void\n\t{\n\t\tthis.__doWork = null;\n\t}\n}\n\nprivate class JobArray\n{\n\tprivate var jobs:Array<JobData> = [];\n\n\tpublic var length(get, never):Int;\n\n\t/**\n\t\tThe first non-null index in `jobs`.\n\t**/\n\tprivate var startIndex:Int = 0;\n\n\tpublic inline function new() {}\n\n\tpublic inline function clear():Void\n\t{\n\t\t#if haxe4\n\t\tjobs.resize(0);\n\t\t#else\n\t\tjobs.splice(0, jobs.length);\n\t\t#end\n\t\tstartIndex = 0;\n\t}\n\n\tpublic inline function first():JobData\n\t{\n\t\treturn jobs[startIndex];\n\t}\n\n\tpublic function getJob(id:Int):JobData\n\t{\n\t\tfor (i in startIndex...jobs.length)\n\t\t{\n\t\t\tif (jobs[i].id == id)\n\t\t\t{\n\t\t\t\treturn jobs[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate inline function get_length():Int\n\t{\n\t\treturn jobs.length - startIndex;\n\t}\n\n\tpublic inline function iterator():JobArrayIterator\n\t{\n\t\treturn new JobArrayIterator(jobs, startIndex);\n\t}\n\n\tpublic inline function push(job:JobData):Int\n\t{\n\t\treturn jobs.push(job);\n\t}\n\n\tpublic function removeJob(id:Int):JobData\n\t{\n\t\tfor (i in startIndex...jobs.length)\n\t\t{\n\t\t\tvar job:JobData = jobs[i];\n\t\t\tif (job.id != id)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((i - startIndex) * 2 <= length)\n\t\t\t{\n\t\t\t\t// Closer to the start; shift earlier entries +1.\n\t\t\t\tvar j:Int = i;\n\t\t\t\twhile (j > startIndex)\n\t\t\t\t{\n\t\t\t\t\tjobs[j] = jobs[j - 1];\n\t\t\t\t\tj--;\n\t\t\t\t}\n\n\t\t\t\tshift();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Closer to the end; shift later entries -1.\n\t\t\t\tjobs.splice(i, 1);\n\t\t\t}\n\n\t\t\treturn job;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic function shift():JobData\n\t{\n\t\tvar job:JobData = jobs[startIndex];\n\n\t\tjobs[startIndex] = null;\n\t\tstartIndex++;\n\n\t\tif (startIndex >= jobs.length)\n\t\t{\n\t\t\tclear();\n\t\t}\n\t\telse if (startIndex >= 100)\n\t\t{\n\t\t\tjobs.splice(0, startIndex);\n\t\t\tstartIndex = 0;\n\t\t}\n\n\t\treturn job;\n\t}\n}\n\nprivate class JobArrayIterator\n{\n\tprivate var index:Int;\n\tprivate var jobs:Array<JobData>;\n\n\tpublic inline function new(jobs:Array<JobData>, startIndex:Int)\n\t{\n\t\tthis.jobs = jobs;\n\t\tindex = startIndex;\n\t}\n\n\tpublic inline function hasNext():Bool\n\t{\n\t\treturn index < jobs.length;\n\t}\n\n\tpublic inline function next():JobData\n\t{\n\t\treturn jobs[index++];\n\t}\n}\n\n#if lime_threads_deque\n@:forward\nprivate abstract JobQueue(Deque<ThreadEvent>) from Deque<ThreadEvent>\n{\n\tpublic inline function new()\n\t{\n\t\tthis = new Deque<ThreadEvent>();\n\t}\n\n\t// Only allow adding to the end.\n\tpublic inline function push(event:ThreadEvent):Void\n\t{\n\t\tthis.add(event);\n\t}\n}\n#end\n\nprivate typedef ThreadArguments = {\n\t#if !html5\n\tvar output:WorkOutput;\n\t#end\n\n\t#if lime_threads_deque\n\tvar queue:JobQueue;\n\t#end\n\n\tvar threadID:Int;\n};\n\n#if lime_threads\nprivate typedef ThreadData = {\n\tvar thread:Thread;\n\t@:optional var jobID:Int;\n};\n#end\n"
  },
  {
    "path": "src/lime/system/WorkOutput.hx",
    "content": "package lime.system;\n\n#if target.threaded\nimport sys.thread.Deque;\nimport sys.thread.Thread;\nimport sys.thread.Tls;\n#elseif cpp\nimport cpp.vm.Deque;\nimport cpp.vm.Thread;\nimport cpp.vm.Tls;\n#elseif neko\nimport neko.vm.Deque;\nimport neko.vm.Thread;\nimport neko.vm.Tls;\n#end\n#if html5\nimport lime._internal.backend.html5.HTML5Thread as Thread;\nimport lime._internal.backend.html5.HTML5Thread.Transferable;\n#end\n#if macro\nimport haxe.macro.Expr;\n\nusing haxe.macro.Context;\n#end\n\n// In addition to `WorkOutput`, this module contains a number of small enums,\n// abstracts, and classes used by all of Lime's threading classes.\n\n/**\n\tFunctions and variables available to the `doWork` function. For instance,\n\tthe `sendProgress()`, `sendComplete()`, and `sendError()` functions allow\n\treturning output.\n\n\t`doWork` should exclusively use `WorkOutput` to communicate with the main\n\tthread. On many targets it's also possible to access static or instance\n\tvariables, but this isn't thread safe and won't work in HTML5.\n**/\nclass WorkOutput\n{\n\t/**\n\t\tThread-local storage. Tracks how many times `doWork` has been called for\n\t\tthe current job, including (if applicable) the ongoing call.\n\n\t\tIn single-threaded mode, it only counts the number of calls this frame.\n\t\tThe lower the number, the less accurate `ThreadPool.workLoad` becomes,\n\t\tbut the higher the number, the more overhead there is. As a ballpark\n\t\testimate, aim for 10-100 iterations.\n\t**/\n\tpublic var workIterations(default, null):Tls<Int> = new Tls();\n\n\t/**\n\t\tThe mode jobs will run in by default. If threads aren't available, jobs\n\t\twill always run in `SINGLE_THREADED` mode.\n\t**/\n\tpublic var mode:ThreadMode;\n\n\t/**\n\t\tMessages sent by active jobs, received by the main thread.\n\t**/\n\tprivate var __jobOutput:Deque<ThreadEvent> = new Deque();\n\n\t/**\n\t\tThread-local storage. Tracks whether `sendError()` or `sendComplete()`\n\t\twas called by this job, or if the job threw an error.\n\t**/\n\tprivate var __jobComplete:Tls<Bool> = new Tls();\n\n\t/**\n\t\tThe job that is currently running on this thread, or the job that\n\t\ttriggered the ongoing event (`onComplete`, `onProgress`, etc.). Will be\n\t\tnull in all other cases.\n\t**/\n\tpublic var activeJob(get, set):Null<JobData>;\n\n\t@:noCompletion private var __activeJob:Tls<JobData> = new Tls();\n\n\tprivate inline function new(mode:Null<ThreadMode>)\n\t{\n\t\tworkIterations.value = 0;\n\t\t__jobComplete.value = false;\n\n\t\t#if lime_threads\n\t\tthis.mode = mode != null ? mode : #if html5 SINGLE_THREADED #else MULTI_THREADED #end;\n\t\t#end\n\t}\n\n\t/**\n\t\tDispatches `onComplete` on the main thread, with the given message.\n\t\t`doWork` should return after calling this.\n\n\t\tIf using web workers, you can also pass a list of transferable objects.\n\t\t@see https://developer.mozilla.org/en-US/docs/Glossary/Transferable_objects\n\t**/\n\tpublic function sendComplete(message:Dynamic = null, transferList:Array<Transferable> = null):Void\n\t{\n\t\tif (!__jobComplete.value)\n\t\t{\n\t\t\t__jobComplete.value = true;\n\n\t\t\tsendThreadEvent({event: COMPLETE, message: message, jobID: activeJob.id}, transferList);\n\t\t}\n\t}\n\n\t/**\n\t\tDispatches `onError` on the main thread, with the given message.\n\t\t`doWork` should return after calling this.\n\n\t\tIf using web workers, you can also pass a list of transferable objects.\n\t\t@see https://developer.mozilla.org/en-US/docs/Glossary/Transferable_objects\n\t**/\n\tpublic function sendError(message:Dynamic = null, transferList:Array<Transferable> = null):Void\n\t{\n\t\tif (!__jobComplete.value)\n\t\t{\n\t\t\t__jobComplete.value = true;\n\n\t\t\tsendThreadEvent({event: ERROR, message: message, jobID: activeJob.id}, transferList);\n\t\t}\n\t}\n\n\t/**\n\t\tDispatches `onProgress` on the main thread, with the given message. This\n\t\tcan be called any number of times per job.\n\n\t\tIf using web workers, you can also pass a list of transferable objects.\n\t\t@see https://developer.mozilla.org/en-US/docs/Glossary/Transferable_objects\n\t**/\n\tpublic function sendProgress(message:Dynamic = null, transferList:Array<Transferable> = null):Void\n\t{\n\t\tif (!__jobComplete.value)\n\t\t{\n\t\t\tsendThreadEvent({event: PROGRESS, message: message, jobID: activeJob.id}, transferList);\n\t\t}\n\t}\n\n\tprivate function sendUncaughtError(message:#if (haxe_ver >= 4.1) haxe.Exception #else Dynamic #end):Void\n\t{\n\t\tif (!__jobComplete.value)\n\t\t{\n\t\t\t__jobComplete.value = true;\n\n\t\t\tsendThreadEvent({event: UNCAUGHT_ERROR, message: message, jobID: activeJob.id});\n\t\t}\n\t}\n\n\tprivate inline function sendThreadEvent(event:ThreadEvent, transferList:Array<Transferable> = null):Void\n\t{\n\t\t#if (lime_threads && html5)\n\t\tif (Thread.current().isWorker())\n\t\t{\n\t\t\tThread.returnMessage(event, transferList);\n\t\t}\n\t\telse\n\t\t#end\n\t\t__jobOutput.add(event);\n\t}\n\n\tprivate inline function resetJobProgress():Void\n\t{\n\t\t__jobComplete.value = false;\n\t\tworkIterations.value = 0;\n\t}\n\n\t#if lime_threads\n\tprivate function createThread(executeThread:WorkFunction<Void->Void>):Thread\n\t{\n\t\tvar thread:Thread = Thread.create(executeThread);\n\n\t\t#if html5\n\t\tthread.onMessage.add(function(event:ThreadEvent)\n\t\t{\n\t\t\t__jobOutput.add(event);\n\t\t});\n\t\t#end\n\n\t\treturn thread;\n\t}\n\t#end\n\n\t// Getters & Setters\n\n\tprivate inline function get_activeJob():JobData\n\t{\n\t\treturn __activeJob.value;\n\t}\n\n\tprivate inline function set_activeJob(value:JobData):JobData\n\t{\n\t\treturn __activeJob.value = value;\n\t}\n}\n\n#if haxe4 enum #else @:enum #end abstract ThreadMode(Bool)\n{\n\t/**\n\t\tAll work will be done on the main thread, during `Application.onUpdate`.\n\n\t\tTo avoid lag spikes, `doWork` should return after completing a fraction\n\t\tof a frame's worth of work, storing its progress in `state`. It will be\n\t\tcalled again with the same `state` next frame, or this frame if there's\n\t\tstill time.\n\n\t\t@see https://en.wikipedia.org/wiki/Green_threads\n\t\t@see https://en.wikipedia.org/wiki/Cooperative_multitasking\n\t**/\n\tvar SINGLE_THREADED = false;\n\n\t/**\n\t\tAll work will be done on a background thread.\n\n\t\tUnlike single-threaded mode, there is no risk of causing lag spikes.\n\t\tEven so, `doWork` should return periodically, to allow canceling the\n\t\tthread. If not canceled, `doWork` will be called again immediately.\n\n\t\tIn HTML5, web workers will be used to achieve this. This means `doWork`\n\t\tmust be a static function, and you can't use `bind()`. Web workers also\n\t\timpose a longer delay each time `doWork` returns, so it shouldn't return\n\t\tas often in multi-threaded mode as in single-threaded mode.\n\t**/\n\tvar MULTI_THREADED = true;\n}\n\n/**\n\tA function that performs asynchronous work. This can either be work on\n\tanother thread (\"multi-threaded mode\"), or it can represent a green thread\n\t(\"single-threaded mode\").\n\n\tIn single-threaded mode, the work function shouldn't complete the job all at\n\tonce, as the main thread would lock up. Instead, it should perform a\n\tfraction of the job each time it's called. `ThreadPool` provides the\n\tfunction with a persistent `State` argument for tracking progress, which can\n\tbe any object of your choice.\n\n\tCaution: if using multi-threaded mode in HTML5, this must be a static\n\tfunction and binding arguments is forbidden. Compile with\n\t`-Dlime-warn-portability` to highlight functions that won't work.\n**/\n#if (lime_threads && html5)\ntypedef WorkFunction<T:haxe.Constraints.Function> = lime._internal.backend.html5.HTML5Thread.WorkFunction<T>;\n#else\nabstract WorkFunction<T:haxe.Constraints.Function>(T) from T to T\n{\n\t/**\n\t\tExecutes this function with the given arguments.\n\t**/\n\tpublic macro function dispatch(self:Expr, args:Array<Expr>):Expr\n\t{\n\t\tswitch (self.typeof().follow().toComplexType())\n\t\t{\n\t\t\tcase TPath({sub: \"WorkFunction\", params: [TPType(t)]}):\n\t\t\t\treturn macro($self : $t)($a{args});\n\t\t\tdefault:\n\t\t\t\tthrow \"Underlying function type not found.\";\n\t\t}\n\t}\n}\n#end\n\n/**\n\tAn argument of any type to pass to the `doWork` function. Though `doWork`\n\tonly accepts a single argument, you can pass multiple values as part of an\n\tanonymous structure. (Or an array, or a class.)\n\n\t\t// Does not work: too many arguments.\n\t\t// threadPool.run(doWork, argument0, argument1, argument2);\n\n\t\t// Works: all arguments are combined into one `State` object.\n\t\tthreadPool.run(doWork, { arg0: argument0, arg1: argument1, arg2: argument2 });\n\n\t\t// Alternatives that also work, if everything is the correct type.\n\t\tthreadPool.run(doWork, [argument0, argument1, argument2]);\n\t\tthreadPool.run(doWork, new DoWorkArgs(argument0, argument1, argument2));\n\n\tAny changes made to this object will persist if and when `doWork` is called\n\tagain for the same job. (See `WorkFunction` for instructions on how to do\n\tthis.) This is the recommended way to store `doWork`'s progress.\n\n\tCaution: after passing an object to `doWork`, avoid accessing or modifying\n\tthat object from the main thread, and avoid passing it to other threads.\n\tDoing either may lead to race conditions. If you need to store an object,\n\tpass a clone of that object to `doWork`.\n**/\ntypedef State = Dynamic;\n\nclass JobData\n{\n\tprivate static var nextID:Int = 0;\n\n\t/**\n\t\t`JobData` instances will regularly be copied in HTML5, so checking\n\t\tequality won't work. Instead, compare identifiers.\n\t**/\n\tpublic var id(default, null):Int;\n\n\t/**\n\t\tThe function responsible for carrying out the job.\n\t**/\n\tpublic var doWork(default, null):WorkFunction<State->WorkOutput->Void>;\n\n\t/**\n\t\tThe original `State` object passed to the job. Avoid modifying this\n\t\tobject if the job is running in multi-threaded mode.\n\t**/\n\tpublic var state(default, null):State;\n\n\t/**\n\t\tThe total time spent on this job.\n\n\t\tIn multi-threaded mode, this includes the overhead for sending messages,\n\t\tplus any time spent waiting for a canceled job to return. The latter\n\t\tdelay can be reduced by returning at regular intervals.\n\t**/\n\t@:allow(lime.system.WorkOutput)\n\tpublic var duration(default, null):Float = 0;\n\n\tpublic var started(get, never):Bool;\n\n\t@:allow(lime.system.WorkOutput)\n\tprivate var startTime:Float = -1;\n\n\t@:allow(lime.system.WorkOutput)\n\tprivate inline function new(doWork:WorkFunction<State->WorkOutput->Void>, state:State, ?id:Int)\n\t{\n\t\tthis.id = id != null ? id : nextID++;\n\t\tthis.doWork = doWork;\n\t\tthis.state = state;\n\t}\n\n\tprivate inline function get_started():Bool\n\t{\n\t\treturn startTime >= 0;\n\t}\n}\n\n#if haxe4 enum #else @:enum #end abstract ThreadEventType(String)\n{\n\t// Events sent from a worker to the main thread, in any mode\n\tvar COMPLETE = \"COMPLETE\";\n\tvar ERROR = \"ERROR\";\n\tvar PROGRESS = \"PROGRESS\";\n\tvar UNCAUGHT_ERROR = \"UNCAUGHT_ERROR\";\n\n\t// Commands sent from the main thread to a worker thread, and returned by\n\t// the worker to confirm the change of state, in multi-threaded mode only\n\tvar WORK = \"WORK\";\n\tvar IDLE = \"IDLE\";\n\tvar EXIT = \"EXIT\";\n}\n\ntypedef ThreadEvent =\n{\n\tvar event:ThreadEventType;\n\t@:optional var message:Dynamic;\n\t@:optional var jobID:Int;\n\n\t/**\n\t\tRequired when a worker thread reports a state change (WORK, IDLE, EXIT).\n\t**/\n\t@:optional var threadID:Int;\n\n\t// Only for WORK events sent by the main thread to a worker\n\t@:optional var doWork:WorkFunction<State->WorkOutput->Void>;\n\t@:optional var state:State;\n}\n\nclass JSAsync\n{\n\t/**\n\t\tIn JavaScript, runs the given block of code within an `async` function,\n\t\tenabling the `await` keyword. On other targets, runs the code normally.\n\t**/\n\tpublic static macro function async(code:Expr):Expr\n\t{\n\t\tif (Context.defined(\"js\"))\n\t\t{\n\t\t\tvar jsCode:Expr = #if haxe4 macro js.Syntax.code #else macro untyped __js__ #end;\n\t\t\treturn macro $jsCode(\"(async {0})()\", function() $code);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn code;\n\t\t}\n\t}\n}\n\n// Define platform-specific types\n#if target.threaded\n// Haxe 3 compatibility: \"target.threaded\" can't go in parentheses.\n#elseif !(cpp || neko)\n@:forward(push, add)\nabstract Deque<T>(List<T>) from List<T> to List<T>\n{\n\tpublic inline function new()\n\t{\n\t\tthis = new List<T>();\n\t}\n\n\tpublic inline function pop(block:Bool):Null<T>\n\t{\n\t\treturn this.pop();\n\t}\n}\n\nclass Tls<T>\n{\n\tpublic var value:T;\n\n\tpublic inline function new() {}\n}\n#end\n\n#if !html5\ntypedef Transferable = Dynamic;\n#end\n"
  },
  {
    "path": "src/lime/text/Font.hx",
    "content": "package lime.text;\n\nimport haxe.io.Bytes;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.math.Vector2;\nimport lime.net.HTTPRequest;\nimport lime.system.CFFI;\nimport lime.system.System;\nimport lime.utils.Assets;\nimport lime.utils.Log;\nimport lime.utils.UInt8Array;\n#if (js && html5)\nimport js.html.CanvasElement;\nimport js.html.CanvasRenderingContext2D;\nimport js.html.SpanElement;\nimport js.Browser;\n#end\n#if (lime_cffi && !macro)\nimport haxe.io.Path;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n#if (!display && !flash && !nodejs && !macro)\n@:autoBuild(lime._internal.macros.AssetsMacro.embedFont())\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.text.Glyph)\nclass Font\n{\n\t/**\n     \t* The ascender value of the font.\n     \t*/\n\tpublic var ascender:Int;\n\n\t /**\n     \t* The descender value of the font.\n     \t*/\n\tpublic var descender:Int;\n\n\t/**\n     \t* The height of the font.\n     \t*/\n\tpublic var height:Int;\n\n\t/**\n     \t* The name of the font.\n    \t */\n\tpublic var name(default, null):String;\n\n\t/**\n     \t* The number of glyphs in the font.\n     \t*/\n\tpublic var numGlyphs:Int;\n\n\n\tpublic var src:Dynamic;\n\n\t/**\n    \t* The underline position of the font.\n    \t*/\n\tpublic var underlinePosition:Int;\n\n\t/**\n    \t* The underline thickness of the font.\n    \t*/\n\tpublic var underlineThickness:Int;\n\n\t/**\n    \t* The underline position of the font.\n    \t*/\n\tpublic var strikethroughPosition:Int;\n\n\t/**\n    \t* The underline thickness of the font.\n    \t*/\n\tpublic var strikethroughThickness:Int;\n\n\t/**\n     \t* The units per EM of the font.\n     \t*/\n\tpublic var unitsPerEM:Int;\n\n\t@:noCompletion private var __fontID:String;\n\t@:noCompletion private var __fontPath:String;\n\t#if lime_cffi\n\t@:noCompletion private var __fontPathWithoutDirectory:String;\n\t#end\n\t@:noCompletion private var __init:Bool;\n\n\t/**\n     \t* Creates a new instance of a Font object.\n     \t*\n     \t* @param name Optional name of the font.\n     \t*/\n\tpublic function new(name:String = null)\n\t{\n\t\tif (name != null)\n\t\t{\n\t\t\tthis.name = name;\n\t\t}\n\n\t\tif (!__init)\n\t\t{\n\t\t\t#if js if (ascender == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\")) #end ascender = 0;\n\t\t\t#if js\n\t\t\tif (descender == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\"))\n\t\t\t#end\n\t\t\tdescender = 0;\n\t\t\t#if js\n\t\t\tif (height == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\"))\n\t\t\t#end\n\t\t\theight = 0;\n\t\t\t#if js\n\t\t\tif (numGlyphs == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\"))\n\t\t\t#end\n\t\t\tnumGlyphs = 0;\n\t\t\t#if js\n\t\t\tif (underlinePosition == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\"))\n\t\t\t#end\n\t\t\tunderlinePosition = 0;\n\t\t\t#if js\n\t\t\tif (underlineThickness == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\"))\n\t\t\t#end\n\t\t\tunderlineThickness = 0;\n\t\t\t#if js\n\t\t\tif (unitsPerEM == untyped #if haxe4 js.Syntax.code #else __js__ #end (\"undefined\"))\n\t\t\t#end\n\t\t\tunitsPerEM = 0;\n\n\t\t\tif (__fontID != null)\n\t\t\t{\n\t\t\t\tif (Assets.isLocal(__fontID))\n\t\t\t\t{\n\t\t\t\t\t__fromBytes(Assets.getBytes(__fontID));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (__fontPath != null)\n\t\t\t{\n\t\t\t\t__fromFile(__fontPath);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n     \t* Decomposes the font into outline data.\n     \t*\n     \t* @return An instance of `NativeFontData` that contains decomposed font outline information.\n     \t*/\n\tpublic function decompose():NativeFontData\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (src == null) throw \"Uninitialized font handle.\";\n\t\tvar data:Dynamic = NativeCFFI.lime_font_outline_decompose(src, 1024 * 20);\n\t\t#if hl\n\t\tif (data != null)\n\t\t{\n\t\t\tdata.family_name = @:privateAccess String.fromUCS2(data.family_name);\n\t\t\tdata.style_name = @:privateAccess String.fromUTF8(data.style_name);\n\t\t}\n\t\t#end\n\t\treturn data;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t/**\n     \t* Creates a Font instance from byte data.\n     \t*\n     \t* @param bytes The byte data containing the font.\n     \t* @return A `Font` instance.\n     \t*/\n\tpublic static function fromBytes(bytes:Bytes):Font\n\t{\n\t\tif (bytes == null) return null;\n\n\t\tvar font = new Font();\n\t\tfont.__fromBytes(bytes);\n\n\t\t#if (lime_cffi && !macro)\n\t\treturn (font.src != null) ? font : null;\n\t\t#else\n\t\treturn font;\n\t\t#end\n\t}\n\n\t/**\n     \t* Creates a Font instance from a file path.\n     \t*\n     \t* @param path The file path of the font.\n     \t* @return A `Font` instance.\n     \t*/\n\tpublic static function fromFile(path:String):Font\n\t{\n\t\tif (path == null) return null;\n\n\t\tvar font = new Font();\n\t\tfont.__fromFile(path);\n\n\t\t#if (lime_cffi && !macro)\n\t\treturn (font.src != null) ? font : null;\n\t\t#else\n\t\treturn font;\n\t\t#end\n\t}\n\n\t/**\n     \t* Loads a Font from byte data asynchronously.\n     \t*\n     \t* @param bytes The byte data containing the font.\n     \t* @return A `Future` containing a `Font` instance.\n     \t*/\n\tpublic static function loadFromBytes(bytes:Bytes):Future<Font>\n\t{\n\t\treturn Future.withValue(fromBytes(bytes));\n\t}\n\n\t/**\n     \t* Loads a Font from a file path asynchronously.\n     \t*\n     \t* @param path The file path of the font.\n     \t* @return A `Future` containing a `Font` instance.\n     \t*/\n\tpublic static function loadFromFile(path:String):Future<Font>\n\t{\n\t\tvar request = new HTTPRequest<Font>();\n\t\treturn request.load(path).then(function(font)\n\t\t{\n\t\t\tif (font != null)\n\t\t\t{\n\t\t\t\treturn Future.withValue(font);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn cast Future.withError(\"\");\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n     \t* Loads a Font by its name asynchronously.\n     \t*\n     \t* @param path The name of the font.\n     \t* @return A `Future` containing a `Font` instance.\n     \t*/\n\tpublic static function loadFromName(path:String):Future<Font>\n\t{\n\t\t#if (js && html5)\n\t\tvar font = new Font();\n\t\treturn font.__loadFromName(path);\n\t\t#else\n\t\treturn cast Future.withError(\"\");\n\t\t#end\n\t}\n\n\t/**\n     \t* Retrieves a glyph from the font by a character.\n     \t*\n     \t* @param character The character whose glyph to retrieve.\n     \t* @return A `Glyph` instance representing the glyph of the character.\n     \t*/\n\tpublic function getGlyph(character:String):Glyph\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_font_get_glyph_index(src, character);\n\t\t#else\n\t\treturn -1;\n\t\t#end\n\t}\n\n\t/**\n     \t* Retrieves an array of glyphs for a set of characters.\n     \t*\n     \t* @param characters The string containing characters to retrieve glyphs for.\n     \t* @return An array of `Glyph` instances representing the glyphs of the characters.\n     \t*/\n\tpublic function getGlyphs(characters:String = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^`'\\\"/\\\\&*()[]{}<>|:;_-+=?,. \"):Array<Glyph>\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if hl\n\t\treturn [for (index in NativeCFFI.lime_font_get_glyph_indices(src, characters)) new Glyph(index)];\n\t\t#else\n\t\treturn NativeCFFI.lime_font_get_glyph_indices(src, characters);\n\t\t#end\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t/**\n     \t* Retrieves metrics for a given glyph.\n     \t*\n     \t* @param glyph The glyph whose metrics to retrieve.\n     \t* @return A `GlyphMetrics` instance containing the metrics of the glyph.\n     \t*/\n\tpublic function getGlyphMetrics(glyph:Glyph):GlyphMetrics\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar value:Dynamic = NativeCFFI.lime_font_get_glyph_metrics(src, glyph);\n\t\tvar metrics = new GlyphMetrics();\n\n\t\tmetrics.advance = new Vector2(value.horizontalAdvance, value.verticalAdvance);\n\t\tmetrics.height = value.height;\n\t\tmetrics.horizontalBearing = new Vector2(value.horizontalBearingX, value.horizontalBearingY);\n\t\tmetrics.verticalBearing = new Vector2(value.verticalBearingX, value.verticalBearingY);\n\n\t\treturn metrics;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t/**\n     \t* Renders a specific glyph to an image.\n     \t*\n     \t* @param glyph The glyph to render.\n     \t* @param fontSize The size to render the glyph at.\n     \t* @return An `Image` instance representing the rendered glyph.\n     \t*/\n\tpublic function renderGlyph(glyph:Glyph, fontSize:Int):Image\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t__setSize(fontSize, 96);\n\n\t\t// Allocate an estimated buffer size - adjust if necessary\n\t\tvar bytes:Bytes = Bytes.alloc(0); // Allocate some reasonable initial size\n\n\t\t// Call native function to render glyph and get byte data\n\t\tbytes = NativeCFFI.lime_font_render_glyph(src, glyph, bytes);\n\n\t\tif (bytes != null && bytes.length > 0)\n\t\t{\n\t\t\tvar dataPosition = 0;\n\n\t\t\t// Extract glyph information from the byte array\n\t\t\tvar index:Int = bytes.getInt32(dataPosition);\n\t\t\tdataPosition += 4;\n\n\t\t\tvar width:Int = bytes.getInt32(dataPosition);\n\t\t\tdataPosition += 4;\n\n\t\t\tvar height:Int = bytes.getInt32(dataPosition);\n\t\t\tdataPosition += 4;\n\n\t\t\tvar x:Int = bytes.getInt32(dataPosition);\n\t\t\tdataPosition += 4;\n\n\t\t\tvar y:Int = bytes.getInt32(dataPosition);\n\t\t\tdataPosition += 4;\n\n\t\t\t// Check if width and height are valid before proceeding\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Extract pixel data from the byte array, accounting for 32-bit RGBA data\n\t\t\tvar pitch = width * 4; // 32-bit color data\n\n\t\t\t// Create a new Bytes array to store the extracted bitmap data without padding\n\t\t\tvar dataBytes = Bytes.alloc(width * height * 4);\n\n\t\t\t// Extract row by row to handle RGBA data\n\t\t\tfor (i in 0...height)\n\t\t\t{\n\t\t\t\tdataBytes.blit(i * width * 4, bytes, dataPosition + (i * pitch), width * 4);\n\t\t\t}\n\n\t\t\t// Create ImageBuffer and Image from the extracted data\n\t\t\tvar buffer = new ImageBuffer(new UInt8Array(dataBytes), width, height, 32);\n\t\t\tvar image = new Image(buffer, 0, 0, width, height);\n\t\t\timage.x = x;\n\t\t\timage.y = y;\n\n\t\t\treturn image;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\t/**\n     \t* Renders a set of glyphs to images.\n     \t*\n     \t* @param glyphs The glyphs to render.\n     \t* @param fontSize The size to render the glyphs at.\n     \t* @return A `Map` containing glyphs mapped to their corresponding images.\n     \t*/\n\tpublic function renderGlyphs(glyphs:Array<Glyph>, fontSize:Int):Map<Glyph, Image>\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar uniqueGlyphs = new Map<Int, Bool>();\n\n\t\tfor (glyph in glyphs)\n\t\t{\n\t\t\tuniqueGlyphs.set(glyph, true);\n\t\t}\n\n\t\tvar glyphList = [];\n\n\t\tfor (key in uniqueGlyphs.keys())\n\t\t{\n\t\t\tglyphList.push(key);\n\t\t}\n\n\t\t#if hl\n\t\tvar _glyphList = new hl.NativeArray<Glyph>(glyphList.length);\n\n\t\tfor (i in 0...glyphList.length)\n\t\t{\n\t\t\t_glyphList[i] = glyphList[i];\n\t\t}\n\n\t\tvar glyphList = _glyphList;\n\t\t#end\n\n\t\t__setSize(fontSize, 96);\n\n\t\tvar bytes = Bytes.alloc(0);\n\t\tbytes = NativeCFFI.lime_font_render_glyphs(src, glyphList, bytes);\n\n\t\tif (bytes != null && bytes.length > 0)\n\t\t{\n\t\t\tvar bytesPosition = 0;\n\t\t\tvar count = bytes.getInt32(bytesPosition);\n\t\t\tbytesPosition += 4;\n\n\t\t\tvar bufferWidth = 128;\n\t\t\tvar bufferHeight = 128;\n\t\t\tvar offsetX = 0;\n\t\t\tvar offsetY = 0;\n\t\t\tvar maxRows = 0;\n\n\t\t\tvar width:Int;\n\t\t\tvar height:Int;\n\t\t\tvar i = 0;\n\n\t\t\twhile (i < count)\n\t\t\t{\n\t\t\t\tbytesPosition += 4;\n\t\t\t\twidth = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\t\t\t\theight = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\n\t\t\t\tbytesPosition += (4 * 2) + width * height;\n\n\t\t\t\tif (offsetX + width > bufferWidth)\n\t\t\t\t{\n\t\t\t\t\toffsetY += maxRows + 1;\n\t\t\t\t\toffsetX = 0;\n\t\t\t\t\tmaxRows = 0;\n\t\t\t\t}\n\n\t\t\t\tif (offsetY + height > bufferHeight)\n\t\t\t\t{\n\t\t\t\t\tif (bufferWidth < bufferHeight)\n\t\t\t\t\t{\n\t\t\t\t\t\tbufferWidth *= 2;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbufferHeight *= 2;\n\t\t\t\t\t}\n\n\t\t\t\t\toffsetX = 0;\n\t\t\t\t\toffsetY = 0;\n\t\t\t\t\tmaxRows = 0;\n\n\t\t\t\t\t// TODO: make this better\n\n\t\t\t\t\tbytesPosition = 4;\n\t\t\t\t\ti = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\toffsetX += width + 1;\n\n\t\t\t\tif (height > maxRows)\n\t\t\t\t{\n\t\t\t\t\tmaxRows = height;\n\t\t\t\t}\n\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tvar map = new Map<Int, Image>();\n\t\t\tvar buffer = new ImageBuffer(null, bufferWidth, bufferHeight, 8);\n\t\t\tvar dataPosition = 0;\n\t\t\tvar data = Bytes.alloc(bufferWidth * bufferHeight);\n\n\t\t\tbytesPosition = 4;\n\t\t\toffsetX = 0;\n\t\t\toffsetY = 0;\n\t\t\tmaxRows = 0;\n\n\t\t\tvar index:Int;\n\t\t\tvar x:Int;\n\t\t\tvar y:Int;\n\t\t\tvar image:Image;\n\n\t\t\tfor (i in 0...count)\n\t\t\t{\n\t\t\t\tindex = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\t\t\t\twidth = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\t\t\t\theight = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\t\t\t\tx = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\t\t\t\ty = bytes.getInt32(bytesPosition);\n\t\t\t\tbytesPosition += 4;\n\n\t\t\t\tif (offsetX + width > bufferWidth)\n\t\t\t\t{\n\t\t\t\t\toffsetY += maxRows + 1;\n\t\t\t\t\toffsetX = 0;\n\t\t\t\t\tmaxRows = 0;\n\t\t\t\t}\n\n\t\t\t\tfor (i in 0...height)\n\t\t\t\t{\n\t\t\t\t\tdataPosition = ((i + offsetY) * bufferWidth) + offsetX;\n\t\t\t\t\tdata.blit(dataPosition, bytes, bytesPosition, width);\n\t\t\t\t\tbytesPosition += width;\n\t\t\t\t}\n\n\t\t\t\timage = new Image(buffer, offsetX, offsetY, width, height);\n\t\t\t\timage.x = x;\n\t\t\t\timage.y = y;\n\n\t\t\t\tmap.set(index, image);\n\n\t\t\t\toffsetX += width + 1;\n\n\t\t\t\tif (height > maxRows)\n\t\t\t\t{\n\t\t\t\t\tmaxRows = height;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#if js\n\t\t\tbuffer.data = data.byteView;\n\t\t\t#else\n\t\t\tbuffer.data = new UInt8Array(data);\n\t\t\t#end\n\n\t\t\treturn map;\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t@:noCompletion private function __copyFrom(other:Font):Void\n\t{\n\t\tif (other != null)\n\t\t{\n\t\t\tascender = other.ascender;\n\t\t\tdescender = other.descender;\n\t\t\theight = other.height;\n\t\t\tname = other.name;\n\t\t\tnumGlyphs = other.numGlyphs;\n\t\t\tsrc = other.src;\n\t\t\tunderlinePosition = other.underlinePosition;\n\t\t\tunderlineThickness = other.underlineThickness;\n\t\t\tunitsPerEM = other.unitsPerEM;\n\n\t\t\t__fontID = other.__fontID;\n\t\t\t__fontPath = other.__fontPath;\n\n\t\t\t#if lime_cffi\n\t\t\t__fontPathWithoutDirectory = other.__fontPathWithoutDirectory;\n\t\t\t#end\n\n\t\t\t__init = true;\n\t\t}\n\t}\n\n\t@:noCompletion private function __fromBytes(bytes:Bytes):Void\n\t{\n\t\t__fontPath = null;\n\n\t\t#if (lime_cffi && !macro)\n\t\t__fontPathWithoutDirectory = null;\n\n\t\tsrc = NativeCFFI.lime_font_load_bytes(bytes);\n\n\t\t__initializeSource();\n\t\t#end\n\t}\n\n\t@:noCompletion private function __fromFile(path:String):Void\n\t{\n\t\t__fontPath = path;\n\n\t\t#if (lime_cffi && !macro)\n\t\t__fontPathWithoutDirectory = Path.withoutDirectory(__fontPath);\n\n\t\tsrc = NativeCFFI.lime_font_load_file(__fontPath);\n\n\t\t__initializeSource();\n\t\t#end\n\t}\n\n\t@:noCompletion private function __initializeSource():Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (src != null)\n\t\t{\n\t\t\tif (name == null)\n\t\t\t{\n\t\t\t\tname = CFFI.stringValue(cast NativeCFFI.lime_font_get_family_name(src));\n\t\t\t}\n\n\t\t\tascender = NativeCFFI.lime_font_get_ascender(src);\n\t\t\tdescender = NativeCFFI.lime_font_get_descender(src);\n\t\t\theight = NativeCFFI.lime_font_get_height(src);\n\t\t\tnumGlyphs = NativeCFFI.lime_font_get_num_glyphs(src);\n\t\t\tunderlinePosition = NativeCFFI.lime_font_get_underline_position(src);\n\t\t\tunderlineThickness = NativeCFFI.lime_font_get_underline_thickness(src);\n\t\t\tstrikethroughPosition = NativeCFFI.lime_font_get_strikethrough_position(src);\n\t\t\tstrikethroughThickness = NativeCFFI.lime_font_get_strikethrough_thickness(src);\n\t\t\tunitsPerEM = NativeCFFI.lime_font_get_units_per_em(src);\n\t\t}\n\t\t#end\n\n\t\t__init = true;\n\t}\n\n\t@:noCompletion private function __loadFromName(name:String):Future<Font>\n\t{\n\t\tvar promise = new Promise<Font>();\n\n\t\t#if (js && html5)\n\t\tthis.name = name;\n\n\t\tvar userAgent = Browser.navigator.userAgent.toLowerCase();\n\t\tvar isSafari = (userAgent.indexOf(\" safari/\") >= 0 && userAgent.indexOf(\" chrome/\") < 0);\n\t\tvar isUIWebView = ~/(iPhone|iPod|iPad).*AppleWebKit(?!.*Version)/i.match(userAgent);\n\n\t\tif (!isSafari && !isUIWebView && untyped (Browser.document).fonts && untyped (Browser.document).fonts.load)\n\t\t{\n\t\t\tuntyped (Browser.document).fonts.load(\"1em '\" + name + \"'\").then(function(_)\n\t\t\t{\n\t\t\t\tpromise.complete(this);\n\t\t\t}, function(_)\n\t\t\t{\n\t\t\t\tLog.warn(\"Could not load web font \\\"\" + name + \"\\\"\");\n\t\t\t\tpromise.complete(this);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar node1 = __measureFontNode(\"'\" + name + \"', sans-serif\");\n\t\t\tvar node2 = __measureFontNode(\"'\" + name + \"', serif\");\n\n\t\t\tvar width1 = node1.offsetWidth;\n\t\t\tvar width2 = node2.offsetWidth;\n\n\t\t\tvar interval = -1;\n\t\t\tvar timeout = 3000;\n\t\t\tvar intervalLength = 50;\n\t\t\tvar intervalCount = 0;\n\t\t\tvar loaded:Bool;\n\t\t\tvar timeExpired:Bool;\n\n\t\t\tvar checkFont = function()\n\t\t\t{\n\t\t\t\tintervalCount++;\n\n\t\t\t\tloaded = (node1.offsetWidth != width1 || node2.offsetWidth != width2);\n\t\t\t\ttimeExpired = (intervalCount * intervalLength >= timeout);\n\n\t\t\t\tif (loaded || timeExpired)\n\t\t\t\t{\n\t\t\t\t\tBrowser.window.clearInterval(interval);\n\t\t\t\t\tnode1.parentNode.removeChild(node1);\n\t\t\t\t\tnode2.parentNode.removeChild(node2);\n\t\t\t\t\tnode1 = null;\n\t\t\t\t\tnode2 = null;\n\n\t\t\t\t\tif (timeExpired)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.warn(\"Could not load web font \\\"\" + name + \"\\\"\");\n\t\t\t\t\t}\n\n\t\t\t\t\tpromise.complete(this);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinterval = Browser.window.setInterval(checkFont, intervalLength);\n\t\t}\n\t\t#else\n\t\tpromise.error(\"\");\n\t\t#end\n\n\t\treturn promise.future;\n\t}\n\n\t#if (js && html5)\n\tprivate static function __measureFontNode(fontFamily:String):SpanElement\n\t{\n\t\tvar node:SpanElement = cast Browser.document.createElement(\"span\");\n\t\tnode.setAttribute(\"aria-hidden\", \"true\");\n\t\tvar text = Browser.document.createTextNode(\"BESbswy\");\n\t\tnode.appendChild(text);\n\t\tvar style = node.style;\n\t\tstyle.display = \"block\";\n\t\tstyle.position = \"absolute\";\n\t\tstyle.top = \"-9999px\";\n\t\tstyle.left = \"-9999px\";\n\t\tstyle.fontSize = \"300px\";\n\t\tstyle.width = \"auto\";\n\t\tstyle.height = \"auto\";\n\t\tstyle.lineHeight = \"normal\";\n\t\tstyle.margin = \"0\";\n\t\tstyle.padding = \"0\";\n\t\tstyle.fontVariant = \"normal\";\n\t\tstyle.whiteSpace = \"nowrap\";\n\t\tstyle.fontFamily = fontFamily;\n\t\tBrowser.document.body.appendChild(node);\n\t\treturn node;\n\t}\n\t#end\n\n\t@:noCompletion private function __setSize(size:Int, dpi:Int = 72):Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tNativeCFFI.lime_font_set_size(src, size, dpi);\n\t\t#end\n\t}\n}\n\n/**\n* Represents decomposed font data, containing kerning information, glyphs, and other properties.\n*/\ntypedef NativeFontData =\n{\n\tvar has_kerning:Bool;\n\tvar is_fixed_width:Bool;\n\tvar has_glyph_names:Bool;\n\tvar is_italic:Bool;\n\tvar is_bold:Bool;\n\tvar num_glyphs:Int;\n\tvar family_name:String;\n\tvar style_name:String;\n\tvar em_size:Int;\n\tvar ascend:Int;\n\tvar descend:Int;\n\tvar height:Int;\n\tvar glyphs:Array<NativeGlyphData>;\n\tvar kerning:Array<NativeKerningData>;\n}\n\n/**\n* Represents data for an individual glyph, including dimensions and control points.\n*/\ntypedef NativeGlyphData =\n{\n\tvar char_code:Int;\n\tvar advance:Int;\n\tvar min_x:Int;\n\tvar max_x:Int;\n\tvar min_y:Int;\n\tvar max_y:Int;\n\tvar points:Array<Int>;\n}\n\n/**\n* Represents kerning information between two glyphs.\n*/\ntypedef NativeKerningData =\n{\n\tvar left_glyph:Int;\n\tvar right_glyph:Int;\n\tvar x:Int;\n\tvar y:Int;\n}\n"
  },
  {
    "path": "src/lime/text/Glyph.hx",
    "content": "package lime.text;\n\nabstract Glyph(Int) from Int to Int from UInt to UInt\n{\n\tpublic function new(i:Int)\n\t{\n\t\tthis = i;\n\t}\n}\n"
  },
  {
    "path": "src/lime/text/GlyphMetrics.hx",
    "content": "package lime.text;\n\nimport lime.math.Vector2;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass GlyphMetrics\n{\n\tpublic var advance:Vector2;\n\tpublic var height:Int;\n\tpublic var horizontalBearing:Vector2;\n\tpublic var verticalBearing:Vector2;\n\n\tpublic function new() {}\n}\n"
  },
  {
    "path": "src/lime/text/UTF8String.hx",
    "content": "package lime.text;\n\n#if !haxe4\nimport haxe.Utf8;\nimport lime._internal.unifill.Unifill;\nimport lime._internal.unifill.CodePoint;\nimport lime.system.Locale;\n\nabstract UTF8String(String) from String to String\n{\n\t#if sys\n\tprivate static var lowercaseMap:Map<Int, Int>;\n\tprivate static var uppercaseMap:Map<Int, Int>;\n\t#end\n\n\t/**\n\t\tThe number of characters in `this` String.\n\t**/\n\tpublic var length(get, never):Int;\n\n\t/**\n\t\tCreates a copy from a given String.\n\t**/\n\tpublic function new(str:String)\n\t{\n\t\tthis = new String(str);\n\t}\n\n\t/**\n\t\tReturns the character at position `index` of `this` String.\n\n\t\tIf `index` is negative or exceeds `this.length`, the empty String `\"\"`\n\t\tis returned.\n\t**/\n\tpublic function charAt(index:Int):String\n\t{\n\t\treturn Unifill.uCharAt(this, index);\n\t}\n\n\t/**\n\t\tReturns the character code at position `index` of `this` String.\n\n\t\tIf `index` is negative or exceeds `this.length`, `null` is returned.\n\n\t\tTo obtain the character code of a single character, `\"x\".code` can be\n\t\tused instead to inline the character code at compile time. Note that\n\t\tthis only works on String literals of length 1.\n\t**/\n\tpublic function charCodeAt(index:Int):Null<Int>\n\t{\n\t\tif (index < 0 || index >= Unifill.uLength(this)) return null;\n\t\treturn Unifill.uCharCodeAt(this, index);\n\t}\n\n\t/**\n\t\tReturns the String corresponding to the character code `code`.\n\n\t\tIf `code` is negative or has another invalid value, the result is\n\t\tunspecified.\n\t**/\n\tpublic static function fromCharCode(code:Int):String\n\t{\n\t\treturn CodePoint.fromInt(code);\n\t}\n\n\t/**\n\t\tReturns the string corresponding to the array of character codes `codes`.\n\n\t\tIf #unifill is defined, these codes will be treated as UTF-8 code points,\n\t\totherwise it will default to using String.fromCharCode() for each character\n\t**/\n\tpublic static function fromCharCodes(codes:Array<Int>):String\n\t{\n\t\tvar s = \"\";\n\n\t\tfor (code in codes)\n\t\t{\n\t\t\ts += CodePoint.fromInt(code);\n\t\t}\n\n\t\treturn s;\n\t}\n\n\t/**\n\t\tReturns the position of the leftmost occurence of `str` within `this`\n\t\tString.\n\n\t\tIf `startIndex` is given, the search is performed within the substring\n\t\tof `this` String starting from `startIndex`. Otherwise the search is\n\t\tperformed within `this` String. In either case, the returned position\n\t\tis relative to the beginning of `this` String.\n\n\t\tIf `str` cannot be found, -1 is returned.\n\t**/\n\tpublic function indexOf(str:String, startIndex:Int = 0):Int\n\t{\n\t\treturn Unifill.uIndexOf(this, str, startIndex);\n\t}\n\n\t/**\n\t\tReturns the position of the rightmost occurence of `str` within `this`\n\t\tString.\n\n\t\tIf `startIndex` is given, the search is performed within the substring\n\t\tof `this` String from 0 to `startIndex`. Otherwise the search is\n\t\tperformed within `this` String. In either case, the returned position\n\t\tis relative to the beginning of `this` String.\n\n\t\tIf `str` cannot be found, -1 is returned.\n\t**/\n\tpublic function lastIndexOf(str:String, ?startIndex:Int):Int\n\t{\n\t\treturn Unifill.uLastIndexOf(this, str, startIndex);\n\t}\n\n\t/**\n\t\tSplits `this` String at each occurence of `delimiter`.\n\n\t\tIf `this` String is the empty String `\"\"`, the result is not consistent\n\t\tacross targets and may either be `[]` (on Js, Cpp) or `[\"\"]`.\n\n\t\tIf `delimiter` is the empty String `\"\"`, `this` String is split into an\n\t\tArray of `this.length` elements, where the elements correspond to the\n\t\tcharacters of `this` String.\n\n\t\tIf `delimiter` is not found within `this` String, the result is an Array\n\t\twith one element, which equals `this` String.\n\n\t\tIf `delimiter` is null, the result is unspecified.\n\n\t\tOtherwise, `this` String is split into parts at each occurence of\n\t\t`delimiter`. If `this` String starts (or ends) with `delimiter`, the\n\t\tresult `Array` contains a leading (or trailing) empty String `\"\"` element.\n\t\tTwo subsequent delimiters also result in an empty String `\"\"` element.\n\t**/\n\tpublic function split(delimiter:String):Array<String>\n\t{\n\t\treturn Unifill.uSplit(this, delimiter);\n\t}\n\n\t/**\n\t\tReturns `len` characters of `this` String, starting at position `pos`.\n\n\t\tIf `len` is omitted, all characters from position `pos` to the end of\n\t\t`this` String are included.\n\n\t\tIf `pos` is negative, its value is calculated from the end of `this`\n\t\tString by `this.length + pos`. If this yields a negative value, 0 is\n\t\tused instead.\n\n\t\tIf the calculated position + `len` exceeds `this.length`, the characters\n\t\tfrom that position to the end of `this` String are returned.\n\n\t\tIf `len` is negative, the result is unspecified.\n\t**/\n\tpublic function substr(pos:Int, ?len:Int):String\n\t{\n\t\tif (len == null)\n\t\t{\n\t\t\tlen = (this : UTF8String).length - pos;\n\t\t}\n\n\t\treturn Utf8.sub(this, pos, len);\n\t}\n\n\t/**\n\t\tReturns the part of `this` String from `startIndex` to but not including `endIndex`.\n\n\t\tIf `startIndex` or `endIndex` are negative, 0 is used instead.\n\n\t\tIf `startIndex` exceeds `endIndex`, they are swapped.\n\n\t\tIf the (possibly swapped) `endIndex` is omitted or exceeds\n\t\t`this.length`, `this.length` is used instead.\n\n\t\tIf the (possibly swapped) `startIndex` exceeds `this.length`, the empty\n\t\tString `\"\"` is returned.\n\t**/\n\tpublic function substring(startIndex:Int, ?endIndex:Int):String\n\t{\n\t\treturn Unifill.uSubstring(this, startIndex, endIndex);\n\t}\n\n\t/**\n\t\tReturns a String where all characters of `this` String are lower case.\n\n\t\tAffects the characters `A-Z`. Other characters remain unchanged.\n\n\t\tIf `language` is specified, language-specific casing rules will be followed.\n\t**/\n\tpublic function toLowerCase(locale:Locale = null):String\n\t{\n\t\t#if sys\n\t\tif (lowercaseMap == null)\n\t\t{\n\t\t\tlowercaseMap = new Map<Int, Int>();\n\t\t\tUtf8Ext.fillUpperToLowerMap(lowercaseMap);\n\t\t}\n\n\t\tvar r = new Utf8();\n\n\t\tUtf8.iter(this, function(v)\n\t\t{\n\t\t\tif (locale != null)\n\t\t\t{\n\t\t\t\tvar v2 = toLowerCaseLocaleFixes(v, locale);\n\t\t\t\tif (v2 != v)\n\t\t\t\t{\n\t\t\t\t\tr.addChar(v2);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tr.addChar(lowercaseMap.exists(v) ? lowercaseMap[v] : v);\n\t\t});\n\n\t\treturn r.toString();\n\t\t#else\n\t\treturn this.toLowerCase();\n\t\t#end\n\t}\n\n\tprivate static function toLowerCaseLocaleFixes(v:Int, locale:Locale):Int\n\t{\n\t\treturn switch (locale.language)\n\t\t{\n\t\t\tcase \"tr\":\n\t\t\t\tswitch (v)\n\t\t\t\t{\n\t\t\t\t\tcase 0xC4B0: 0x69; // İ-->i (large dotted İ to small i) //probably redundant and can be removed, presented here for logical symmtery for when genuine cases are needed\n\t\t\t\t\tdefault: v;\n\t\t\t\t}\n\t\t\tdefault: v;\n\t\t}\n\t}\n\n\t/**\n\t\tReturns the String itself.\n\t**/\n\tpublic function toString():String\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t\tReturns a String where all characters of `this` String are upper case.\n\n\t\tAffects the characters `a-z`. Other characters remain unchanged.\n\n\t\tIf `language` is specified, language-specific casing rules will be followed.\n\t**/\n\tpublic function toUpperCase(locale:Locale = null):String\n\t{\n\t\t#if sys\n\t\tif (uppercaseMap == null)\n\t\t{\n\t\t\tuppercaseMap = new Map<Int, Int>();\n\t\t\tUtf8Ext.fillLowerToUpperMap(uppercaseMap);\n\t\t}\n\n\t\tvar r = new Utf8();\n\n\t\tUtf8.iter(this, function(v)\n\t\t{\n\t\t\tif (locale != null)\n\t\t\t{\n\t\t\t\tvar v2 = toUpperCaseLocaleFixes(v, locale);\n\t\t\t\tif (v2 != v)\n\t\t\t\t{\n\t\t\t\t\tr.addChar(v2);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tr.addChar(uppercaseMap.exists(v) ? uppercaseMap[v] : v);\n\t\t});\n\n\t\treturn r.toString();\n\t\t#else\n\t\treturn this.toUpperCase();\n\t\t#end\n\t}\n\n\tprivate static function toUpperCaseLocaleFixes(v:Int, locale:Locale):Int\n\t{\n\t\treturn switch (locale.language)\n\t\t{\n\t\t\tcase \"tr\":\n\t\t\t\tswitch (v)\n\t\t\t\t{\n\t\t\t\t\tcase 0x69: 0xC4B0; // i-->İ (small i to large dotted İ)\n\t\t\t\t\tdefault: v;\n\t\t\t\t}\n\t\t\tdefault: v;\n\t\t}\n\t}\n\n\t@:op(A == B) private static function equals(a:UTF8String, b:UTF8String):Bool\n\t{\n\t\tif (a == null || b == null) return (a : String) == (b : String);\n\t\treturn Unifill.uCompare(a, b) == 0;\n\t}\n\n\t@:op(A < B) private static function lt(a:UTF8String, b:UTF8String):Bool\n\t{\n\t\tif (b == null) return false;\n\t\tif (a == null) return true;\n\t\treturn Unifill.uCompare(a, b) == -1;\n\t}\n\n\t@:op(A > B) private static function gt(a:UTF8String, b:UTF8String):Bool\n\t{\n\t\tif (a == null) return false;\n\t\tif (b == null) return true;\n\t\treturn Unifill.uCompare(a, b) == 1;\n\t}\n\n\t@:op(A <= B) private static function lteq(a:UTF8String, b:UTF8String):Bool\n\t{\n\t\tif (b == null) return (a == null);\n\t\tif (a == null) return true;\n\t\treturn Unifill.uCompare(a, b) != 1;\n\t}\n\n\t@:op(A >= B) private static function gteq(a:UTF8String, b:UTF8String):Bool\n\t{\n\t\tif (a == null) return (b == null);\n\t\tif (b == null) return true;\n\t\treturn Unifill.uCompare(a, b) != -1;\n\t}\n\n\t@:op(A + B) private static function plus(a:UTF8String, b:UTF8String):UTF8String\n\t{\n\t\tif (a == null && b == null) return null;\n\t\tif (a == null) return b;\n\t\tif (b == null) return a;\n\n\t\tvar sb = new StringBuf();\n\t\tsb.add(Std.string(a));\n\t\tsb.add(Std.string(b));\n\t\treturn sb.toString();\n\t}\n\n\t@:from static function fromDynamic(value:Dynamic):UTF8String\n\t{\n\t\treturn Std.string(value);\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_length():Int\n\t{\n\t\treturn this == null ? 0 : Unifill.uLength(this);\n\t}\n}\n\n// generated from org.zamedev.lib.tools.CaseMapsGenerator\nprivate class Utf8Ext\n{\n\tpublic static function fillUpperToLowerMap(map:Map<Int, Int>):Void\n\t{\n\t\tvar i = 0;\n\t\tfor (i in 0...26)\n\t\t\tmap[0x41 + i] = 0x61 + i;\n\t\tfor (i in 0...23)\n\t\t\tmap[0xC0 + i] = 0xE0 + i;\n\t\tfor (i in 0...7)\n\t\t\tmap[0xD8 + i] = 0xF8 + i;\n\t\twhile (i < 48)\n\t\t{\n\t\t\tmap[0x100 + i] = 0x101 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x130] = 0x69;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x132 + i] = 0x133 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 16)\n\t\t{\n\t\t\tmap[0x139 + i] = 0x13A + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 46)\n\t\t{\n\t\t\tmap[0x14A + i] = 0x14B + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x178] = 0xFF;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x179 + i] = 0x17A + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x181] = 0x253;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x182 + i] = 0x183 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x186] = 0x254;\n\t\tmap[0x187] = 0x188;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x189 + i] = 0x256 + i;\n\t\tmap[0x18B] = 0x18C;\n\t\tmap[0x18E] = 0x1DD;\n\t\tmap[0x18F] = 0x259;\n\t\tmap[0x190] = 0x25B;\n\t\tmap[0x191] = 0x192;\n\t\tmap[0x193] = 0x260;\n\t\tmap[0x194] = 0x263;\n\t\tmap[0x196] = 0x269;\n\t\tmap[0x197] = 0x268;\n\t\tmap[0x198] = 0x199;\n\t\tmap[0x19C] = 0x26F;\n\t\tmap[0x19D] = 0x272;\n\t\tmap[0x19F] = 0x275;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x1A0 + i] = 0x1A1 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1A6] = 0x280;\n\t\tmap[0x1A7] = 0x1A8;\n\t\tmap[0x1A9] = 0x283;\n\t\tmap[0x1AC] = 0x1AD;\n\t\tmap[0x1AE] = 0x288;\n\t\tmap[0x1AF] = 0x1B0;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1B1 + i] = 0x28A + i;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x1B3 + i] = 0x1B4 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1B7] = 0x292;\n\t\tmap[0x1B8] = 0x1B9;\n\t\tmap[0x1BC] = 0x1BD;\n\t\tmap[0x1C4] = 0x1C6;\n\t\tmap[0x1C7] = 0x1C9;\n\t\tmap[0x1CA] = 0x1CC;\n\t\twhile (i < 16)\n\t\t{\n\t\t\tmap[0x1CD + i] = 0x1CE + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 18)\n\t\t{\n\t\t\tmap[0x1DE + i] = 0x1DF + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1F1] = 0x1F3;\n\t\tmap[0x1F4] = 0x1F5;\n\t\tmap[0x1F6] = 0x195;\n\t\tmap[0x1F7] = 0x1BF;\n\t\twhile (i < 40)\n\t\t{\n\t\t\tmap[0x1F8 + i] = 0x1F9 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x220] = 0x19E;\n\t\twhile (i < 18)\n\t\t{\n\t\t\tmap[0x222 + i] = 0x223 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x23A] = 0x2C65;\n\t\tmap[0x23B] = 0x23C;\n\t\tmap[0x23D] = 0x19A;\n\t\tmap[0x23E] = 0x2C66;\n\t\tmap[0x241] = 0x242;\n\t\tmap[0x243] = 0x180;\n\t\tmap[0x244] = 0x289;\n\t\tmap[0x245] = 0x28C;\n\t\twhile (i < 10)\n\t\t{\n\t\t\tmap[0x246 + i] = 0x247 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x370 + i] = 0x371 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x376] = 0x377;\n\t\tmap[0x37F] = 0x3F3;\n\t\tmap[0x386] = 0x3AC;\n\t\tfor (i in 0...3)\n\t\t\tmap[0x388 + i] = 0x3AD + i;\n\t\tmap[0x38C] = 0x3CC;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x38E + i] = 0x3CD + i;\n\t\tfor (i in 0...17)\n\t\t\tmap[0x391 + i] = 0x3B1 + i;\n\t\tfor (i in 0...9)\n\t\t\tmap[0x3A3 + i] = 0x3C3 + i;\n\t\tmap[0x3CF] = 0x3D7;\n\t\twhile (i < 24)\n\t\t{\n\t\t\tmap[0x3D8 + i] = 0x3D9 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x3F4] = 0x3B8;\n\t\tmap[0x3F7] = 0x3F8;\n\t\tmap[0x3F9] = 0x3F2;\n\t\tmap[0x3FA] = 0x3FB;\n\t\tfor (i in 0...3)\n\t\t\tmap[0x3FD + i] = 0x37B + i;\n\t\tfor (i in 0...16)\n\t\t\tmap[0x400 + i] = 0x450 + i;\n\t\tfor (i in 0...32)\n\t\t\tmap[0x410 + i] = 0x430 + i;\n\t\twhile (i < 34)\n\t\t{\n\t\t\tmap[0x460 + i] = 0x461 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 54)\n\t\t{\n\t\t\tmap[0x48A + i] = 0x48B + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x4C0] = 0x4CF;\n\t\twhile (i < 14)\n\t\t{\n\t\t\tmap[0x4C1 + i] = 0x4C2 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 96)\n\t\t{\n\t\t\tmap[0x4D0 + i] = 0x4D1 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tfor (i in 0...38)\n\t\t\tmap[0x531 + i] = 0x561 + i;\n\t\tfor (i in 0...38)\n\t\t\tmap[0x10A0 + i] = 0x2D00 + i;\n\t\tmap[0x10C7] = 0x2D27;\n\t\tmap[0x10CD] = 0x2D2D;\n\t\tfor (i in 0...80)\n\t\t\tmap[0x13A0 + i] = 0xAB70 + i;\n\t\tfor (i in 0...6)\n\t\t\tmap[0x13F0 + i] = 0x13F8 + i;\n\t\twhile (i < 150)\n\t\t{\n\t\t\tmap[0x1E00 + i] = 0x1E01 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1E9E] = 0xDF;\n\t\twhile (i < 96)\n\t\t{\n\t\t\tmap[0x1EA0 + i] = 0x1EA1 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F08 + i] = 0x1F00 + i;\n\t\tfor (i in 0...6)\n\t\t\tmap[0x1F18 + i] = 0x1F10 + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F28 + i] = 0x1F20 + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F38 + i] = 0x1F30 + i;\n\t\tfor (i in 0...6)\n\t\t\tmap[0x1F48 + i] = 0x1F40 + i;\n\t\twhile (i < 8)\n\t\t{\n\t\t\tmap[0x1F59 + i] = 0x1F51 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F68 + i] = 0x1F60 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FB8 + i] = 0x1FB0 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FBA + i] = 0x1F70 + i;\n\t\tfor (i in 0...4)\n\t\t\tmap[0x1FC8 + i] = 0x1F72 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FD8 + i] = 0x1FD0 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FDA + i] = 0x1F76 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FE8 + i] = 0x1FE0 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FEA + i] = 0x1F7A + i;\n\t\tmap[0x1FEC] = 0x1FE5;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FF8 + i] = 0x1F78 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FFA + i] = 0x1F7C + i;\n\t\tmap[0x2126] = 0x3C9;\n\t\tmap[0x212A] = 0x6B;\n\t\tmap[0x212B] = 0xE5;\n\t\tmap[0x2132] = 0x214E;\n\t\tmap[0x2183] = 0x2184;\n\t\tfor (i in 0...47)\n\t\t\tmap[0x2C00 + i] = 0x2C30 + i;\n\t\tmap[0x2C60] = 0x2C61;\n\t\tmap[0x2C62] = 0x26B;\n\t\tmap[0x2C63] = 0x1D7D;\n\t\tmap[0x2C64] = 0x27D;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x2C67 + i] = 0x2C68 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x2C6D] = 0x251;\n\t\tmap[0x2C6E] = 0x271;\n\t\tmap[0x2C6F] = 0x250;\n\t\tmap[0x2C70] = 0x252;\n\t\tmap[0x2C72] = 0x2C73;\n\t\tmap[0x2C75] = 0x2C76;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x2C7E + i] = 0x23F + i;\n\t\twhile (i < 100)\n\t\t{\n\t\t\tmap[0x2C80 + i] = 0x2C81 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x2CEB + i] = 0x2CEC + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x2CF2] = 0x2CF3;\n\t\twhile (i < 46)\n\t\t{\n\t\t\tmap[0xA640 + i] = 0xA641 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 28)\n\t\t{\n\t\t\tmap[0xA680 + i] = 0xA681 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 14)\n\t\t{\n\t\t\tmap[0xA722 + i] = 0xA723 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 62)\n\t\t{\n\t\t\tmap[0xA732 + i] = 0xA733 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0xA779 + i] = 0xA77A + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0xA77D] = 0x1D79;\n\t\twhile (i < 10)\n\t\t{\n\t\t\tmap[0xA77E + i] = 0xA77F + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0xA78B] = 0xA78C;\n\t\tmap[0xA78D] = 0x265;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0xA790 + i] = 0xA791 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 20)\n\t\t{\n\t\t\tmap[0xA796 + i] = 0xA797 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0xA7AA] = 0x266;\n\t\tmap[0xA7AB] = 0x25C;\n\t\tmap[0xA7AC] = 0x261;\n\t\tmap[0xA7AD] = 0x26C;\n\t\tmap[0xA7AE] = 0x26A;\n\t\tmap[0xA7B0] = 0x29E;\n\t\tmap[0xA7B1] = 0x287;\n\t\tmap[0xA7B2] = 0x29D;\n\t\tmap[0xA7B3] = 0xAB53;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0xA7B4 + i] = 0xA7B5 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tfor (i in 0...26)\n\t\t\tmap[0xFF21 + i] = 0xFF41 + i;\n\t\tfor (i in 0...40)\n\t\t\tmap[0x10400 + i] = 0x10428 + i;\n\t\tfor (i in 0...36)\n\t\t\tmap[0x104B0 + i] = 0x104D8 + i;\n\t\tfor (i in 0...51)\n\t\t\tmap[0x10C80 + i] = 0x10CC0 + i;\n\t\tfor (i in 0...32)\n\t\t\tmap[0x118A0 + i] = 0x118C0 + i;\n\t\tfor (i in 0...34)\n\t\t\tmap[0x1E900 + i] = 0x1E922 + i;\n\t}\n\n\tpublic static function fillLowerToUpperMap(map:Map<Int, Int>):Void\n\t{\n\t\tvar i = 0;\n\t\tfor (i in 0...26)\n\t\t\tmap[0x61 + i] = 0x41 + i;\n\t\tmap[0xB5] = 0x39C;\n\t\tfor (i in 0...23)\n\t\t\tmap[0xE0 + i] = 0xC0 + i;\n\t\tfor (i in 0...7)\n\t\t\tmap[0xF8 + i] = 0xD8 + i;\n\t\tmap[0xFF] = 0x178;\n\t\twhile (i < 48)\n\t\t{\n\t\t\tmap[0x101 + i] = 0x100 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x131] = 0x49;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x133 + i] = 0x132 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 16)\n\t\t{\n\t\t\tmap[0x13A + i] = 0x139 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 46)\n\t\t{\n\t\t\tmap[0x14B + i] = 0x14A + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x17A + i] = 0x179 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x17F] = 0x53;\n\t\tmap[0x180] = 0x243;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x183 + i] = 0x182 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x188] = 0x187;\n\t\tmap[0x18C] = 0x18B;\n\t\tmap[0x192] = 0x191;\n\t\tmap[0x195] = 0x1F6;\n\t\tmap[0x199] = 0x198;\n\t\tmap[0x19A] = 0x23D;\n\t\tmap[0x19E] = 0x220;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x1A1 + i] = 0x1A0 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1A8] = 0x1A7;\n\t\tmap[0x1AD] = 0x1AC;\n\t\tmap[0x1B0] = 0x1AF;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x1B4 + i] = 0x1B3 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1B9] = 0x1B8;\n\t\tmap[0x1BD] = 0x1BC;\n\t\tmap[0x1BF] = 0x1F7;\n\t\tmap[0x1C6] = 0x1C4;\n\t\tmap[0x1C9] = 0x1C7;\n\t\tmap[0x1CC] = 0x1CA;\n\t\twhile (i < 16)\n\t\t{\n\t\t\tmap[0x1CE + i] = 0x1CD + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1DD] = 0x18E;\n\t\twhile (i < 18)\n\t\t{\n\t\t\tmap[0x1DF + i] = 0x1DE + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1F0] = 0x4A;\n\t\tmap[0x1F3] = 0x1F1;\n\t\tmap[0x1F5] = 0x1F4;\n\t\twhile (i < 40)\n\t\t{\n\t\t\tmap[0x1F9 + i] = 0x1F8 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 18)\n\t\t{\n\t\t\tmap[0x223 + i] = 0x222 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x23C] = 0x23B;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x23F + i] = 0x2C7E + i;\n\t\tmap[0x242] = 0x241;\n\t\twhile (i < 10)\n\t\t{\n\t\t\tmap[0x247 + i] = 0x246 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x250] = 0x2C6F;\n\t\tmap[0x251] = 0x2C6D;\n\t\tmap[0x252] = 0x2C70;\n\t\tmap[0x253] = 0x181;\n\t\tmap[0x254] = 0x186;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x256 + i] = 0x189 + i;\n\t\tmap[0x259] = 0x18F;\n\t\tmap[0x25B] = 0x190;\n\t\tmap[0x25C] = 0xA7AB;\n\t\tmap[0x260] = 0x193;\n\t\tmap[0x261] = 0xA7AC;\n\t\tmap[0x263] = 0x194;\n\t\tmap[0x265] = 0xA78D;\n\t\tmap[0x266] = 0xA7AA;\n\t\tmap[0x268] = 0x197;\n\t\tmap[0x269] = 0x196;\n\t\tmap[0x26A] = 0xA7AE;\n\t\tmap[0x26B] = 0x2C62;\n\t\tmap[0x26C] = 0xA7AD;\n\t\tmap[0x26F] = 0x19C;\n\t\tmap[0x271] = 0x2C6E;\n\t\tmap[0x272] = 0x19D;\n\t\tmap[0x275] = 0x19F;\n\t\tmap[0x27D] = 0x2C64;\n\t\tmap[0x280] = 0x1A6;\n\t\tmap[0x283] = 0x1A9;\n\t\tmap[0x287] = 0xA7B1;\n\t\tmap[0x288] = 0x1AE;\n\t\tmap[0x289] = 0x244;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x28A + i] = 0x1B1 + i;\n\t\tmap[0x28C] = 0x245;\n\t\tmap[0x292] = 0x1B7;\n\t\tmap[0x29D] = 0xA7B2;\n\t\tmap[0x29E] = 0xA7B0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x371 + i] = 0x370 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x377] = 0x376;\n\t\tfor (i in 0...3)\n\t\t\tmap[0x37B + i] = 0x3FD + i;\n\t\tmap[0x390] = 0x3AA;\n\t\tmap[0x3AC] = 0x386;\n\t\tfor (i in 0...3)\n\t\t\tmap[0x3AD + i] = 0x388 + i;\n\t\tmap[0x3B0] = 0x3AB;\n\t\tfor (i in 0...17)\n\t\t\tmap[0x3B1 + i] = 0x391 + i;\n\t\tmap[0x3C2] = 0x3A3;\n\t\tfor (i in 0...9)\n\t\t\tmap[0x3C3 + i] = 0x3A3 + i;\n\t\tmap[0x3CC] = 0x38C;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x3CD + i] = 0x38E + i;\n\t\tmap[0x3D0] = 0x392;\n\t\tmap[0x3D1] = 0x398;\n\t\tmap[0x3D5] = 0x3A6;\n\t\tmap[0x3D6] = 0x3A0;\n\t\tmap[0x3D7] = 0x3CF;\n\t\twhile (i < 24)\n\t\t{\n\t\t\tmap[0x3D9 + i] = 0x3D8 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x3F0] = 0x39A;\n\t\tmap[0x3F1] = 0x3A1;\n\t\tmap[0x3F2] = 0x3F9;\n\t\tmap[0x3F3] = 0x37F;\n\t\tmap[0x3F5] = 0x395;\n\t\tmap[0x3F8] = 0x3F7;\n\t\tmap[0x3FB] = 0x3FA;\n\t\tfor (i in 0...32)\n\t\t\tmap[0x430 + i] = 0x410 + i;\n\t\tfor (i in 0...16)\n\t\t\tmap[0x450 + i] = 0x400 + i;\n\t\twhile (i < 34)\n\t\t{\n\t\t\tmap[0x461 + i] = 0x460 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 54)\n\t\t{\n\t\t\tmap[0x48B + i] = 0x48A + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 14)\n\t\t{\n\t\t\tmap[0x4C2 + i] = 0x4C1 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x4CF] = 0x4C0;\n\t\twhile (i < 96)\n\t\t{\n\t\t\tmap[0x4D1 + i] = 0x4D0 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tfor (i in 0...38)\n\t\t\tmap[0x561 + i] = 0x531 + i;\n\t\tfor (i in 0...6)\n\t\t\tmap[0x13F8 + i] = 0x13F0 + i;\n\t\tmap[0x1C80] = 0x412;\n\t\tmap[0x1C81] = 0x414;\n\t\tmap[0x1C82] = 0x41E;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1C83 + i] = 0x421 + i;\n\t\tmap[0x1C85] = 0x422;\n\t\tmap[0x1C86] = 0x42A;\n\t\tmap[0x1C87] = 0x462;\n\t\tmap[0x1C88] = 0xA64A;\n\t\tmap[0x1D79] = 0xA77D;\n\t\tmap[0x1D7D] = 0x2C63;\n\t\twhile (i < 150)\n\t\t{\n\t\t\tmap[0x1E01 + i] = 0x1E00 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x1E96] = 0x48;\n\t\tmap[0x1E97] = 0x54;\n\t\tmap[0x1E98] = 0x57;\n\t\tmap[0x1E99] = 0x59;\n\t\tmap[0x1E9B] = 0x1E60;\n\t\twhile (i < 96)\n\t\t{\n\t\t\tmap[0x1EA1 + i] = 0x1EA0 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F00 + i] = 0x1F08 + i;\n\t\tfor (i in 0...6)\n\t\t\tmap[0x1F10 + i] = 0x1F18 + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F20 + i] = 0x1F28 + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F30 + i] = 0x1F38 + i;\n\t\tfor (i in 0...6)\n\t\t\tmap[0x1F40 + i] = 0x1F48 + i;\n\t\tmap[0x1F50] = 0x3A5;\n\t\tmap[0x1F51] = 0x1F59;\n\t\tmap[0x1F52] = 0x3A5;\n\t\tmap[0x1F53] = 0x1F5B;\n\t\tmap[0x1F54] = 0x3A5;\n\t\tmap[0x1F55] = 0x1F5D;\n\t\tmap[0x1F56] = 0x3A5;\n\t\tmap[0x1F57] = 0x1F5F;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F60 + i] = 0x1F68 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1F70 + i] = 0x1FBA + i;\n\t\tfor (i in 0...4)\n\t\t\tmap[0x1F72 + i] = 0x1FC8 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1F76 + i] = 0x1FDA + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1F78 + i] = 0x1FF8 + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1F7A + i] = 0x1FEA + i;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1F7C + i] = 0x1FFA + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F80 + i] = 0x1F88 + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1F90 + i] = 0x1F98 + i;\n\t\tfor (i in 0...8)\n\t\t\tmap[0x1FA0 + i] = 0x1FA8 + i;\n\t\tfor (i in 0...3)\n\t\t\tmap[0x1FB0 + i] = 0x1FB8 + i;\n\t\tmap[0x1FB3] = 0x1FBC;\n\t\tmap[0x1FB4] = 0x386;\n\t\tmap[0x1FB6] = 0x391;\n\t\tmap[0x1FB7] = 0x391;\n\t\tmap[0x1FBE] = 0x399;\n\t\tmap[0x1FC2] = 0x1FCA;\n\t\tmap[0x1FC3] = 0x1FCC;\n\t\tmap[0x1FC4] = 0x389;\n\t\tmap[0x1FC6] = 0x397;\n\t\tmap[0x1FC7] = 0x397;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FD0 + i] = 0x1FD8 + i;\n\t\tmap[0x1FD2] = 0x3AA;\n\t\tmap[0x1FD3] = 0x3AA;\n\t\tmap[0x1FD6] = 0x399;\n\t\tmap[0x1FD7] = 0x3AA;\n\t\tfor (i in 0...2)\n\t\t\tmap[0x1FE0 + i] = 0x1FE8 + i;\n\t\tmap[0x1FE2] = 0x3AB;\n\t\tmap[0x1FE3] = 0x3AB;\n\t\tmap[0x1FE4] = 0x3A1;\n\t\tmap[0x1FE5] = 0x1FEC;\n\t\tmap[0x1FE6] = 0x3A5;\n\t\tmap[0x1FE7] = 0x3AB;\n\t\tmap[0x1FF2] = 0x1FFA;\n\t\tmap[0x1FF3] = 0x1FFC;\n\t\tmap[0x1FF4] = 0x38F;\n\t\tmap[0x1FF6] = 0x3A9;\n\t\tmap[0x1FF7] = 0x3A9;\n\t\tmap[0x214E] = 0x2132;\n\t\tmap[0x2184] = 0x2183;\n\t\tfor (i in 0...47)\n\t\t\tmap[0x2C30 + i] = 0x2C00 + i;\n\t\tmap[0x2C61] = 0x2C60;\n\t\tmap[0x2C65] = 0x23A;\n\t\tmap[0x2C66] = 0x23E;\n\t\twhile (i < 6)\n\t\t{\n\t\t\tmap[0x2C68 + i] = 0x2C67 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x2C73] = 0x2C72;\n\t\tmap[0x2C76] = 0x2C75;\n\t\twhile (i < 100)\n\t\t{\n\t\t\tmap[0x2C81 + i] = 0x2C80 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0x2CEC + i] = 0x2CEB + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0x2CF3] = 0x2CF2;\n\t\tfor (i in 0...38)\n\t\t\tmap[0x2D00 + i] = 0x10A0 + i;\n\t\tmap[0x2D27] = 0x10C7;\n\t\tmap[0x2D2D] = 0x10CD;\n\t\twhile (i < 46)\n\t\t{\n\t\t\tmap[0xA641 + i] = 0xA640 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 28)\n\t\t{\n\t\t\tmap[0xA681 + i] = 0xA680 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 14)\n\t\t{\n\t\t\tmap[0xA723 + i] = 0xA722 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 62)\n\t\t{\n\t\t\tmap[0xA733 + i] = 0xA732 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0xA77A + i] = 0xA779 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 10)\n\t\t{\n\t\t\tmap[0xA77F + i] = 0xA77E + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0xA78C] = 0xA78B;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0xA791 + i] = 0xA790 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 20)\n\t\t{\n\t\t\tmap[0xA797 + i] = 0xA796 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\twhile (i < 4)\n\t\t{\n\t\t\tmap[0xA7B5 + i] = 0xA7B4 + i;\n\t\t\ti += 2;\n\t\t}\n\t\ti = 0;\n\t\tmap[0xAB53] = 0xA7B3;\n\t\tfor (i in 0...80)\n\t\t\tmap[0xAB70 + i] = 0x13A0 + i;\n\t\tfor (i in 0...26)\n\t\t\tmap[0xFF41 + i] = 0xFF21 + i;\n\t\tfor (i in 0...40)\n\t\t\tmap[0x10428 + i] = 0x10400 + i;\n\t\tfor (i in 0...36)\n\t\t\tmap[0x104D8 + i] = 0x104B0 + i;\n\t\tfor (i in 0...51)\n\t\t\tmap[0x10CC0 + i] = 0x10C80 + i;\n\t\tfor (i in 0...32)\n\t\t\tmap[0x118C0 + i] = 0x118A0 + i;\n\t\tfor (i in 0...34)\n\t\t\tmap[0x1E922 + i] = 0x1E900 + i;\n\t}\n}\n#else\ntypedef UTF8String = UnicodeString;\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HB.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nclass HB\n{\n\tpublic static function shape(font:HBFont, buffer:HBBuffer, features:Array<HBFeature> = null):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_shape(font, buffer, #if hl null #else features #end);\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBlob.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\nimport lime.utils.DataPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBBlob(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic static var empty(get, never):HBBlob;\n\n\tpublic var data(get, never):DataPointer;\n\tpublic var dataWritable(get, never):DataPointer;\n\tpublic var immutable(get, never):Bool;\n\tpublic var length(get, never):Int;\n\n\tpublic function new(data:DataPointer, length:Int, memoryMode:Int)\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tthis = NativeCFFI.lime_hb_blob_create(data, length, memoryMode);\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\tpublic function createSubBlob(offset:Int, length:Int):HBBlob\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_blob_create_sub_blob(this, offset, length);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function makeImmutable():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_blob_make_immutable(this);\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_data():DataPointer\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_blob_get_data(this);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_dataWritable():DataPointer\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_blob_get_data_writable(this);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\tprivate static inline function get_empty():HBBlob\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_blob_get_empty();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_immutable():Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_blob_is_immutable(this);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_length():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_blob_get_length(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBuffer.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\nimport lime.utils.Bytes;\nimport lime.utils.DataPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBBuffer(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic var allocationSuccessful(get, never):Bool;\n\tpublic var clusterLevel(get, set):HBBufferClusterLevel;\n\tpublic var contentType(get, set):HBBufferContentType;\n\tpublic var direction(get, set):HBDirection;\n\tpublic var flags(get, set):Int;\n\tpublic var language(get, set):HBLanguage;\n\tpublic var length(get, set):Int;\n\tpublic var replacementCodepoint(get, set):Int;\n\tpublic var script(get, set):HBScript;\n\tpublic var segmentProperties(get, set):HBSegmentProperties;\n\n\tpublic function new()\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tthis = NativeCFFI.lime_hb_buffer_create();\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\tpublic function add(codepoint:Int, cluster:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_add(this, codepoint, cluster);\n\t\t#end\n\t}\n\n\tpublic function addString(text:String, itemOffset:Int, itemLength:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_add_hxstring(this, text, itemOffset, itemLength);\n\t\t#end\n\t}\n\n\tpublic function addCodepoints(text:DataPointer, textLength:Int, itemOffset:Int, itemLength:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_add_codepoints(this, text, textLength, itemOffset, itemLength);\n\t\t#end\n\t}\n\n\tpublic function addUTF8(text:String, itemOffset:Int, itemLength:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_add_utf8(this, text, itemOffset, itemLength);\n\t\t#end\n\t}\n\n\tpublic function addUTF16(text:DataPointer, textLength:Int, itemOffset:Int, itemLength:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_add_utf16(this, text, textLength, itemOffset, itemLength);\n\t\t#end\n\t}\n\n\tpublic function addUTF32(text:DataPointer, textLength:Int, itemOffset:Int, itemLength:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_add_utf32(this, text, textLength, itemOffset, itemLength);\n\t\t#end\n\t}\n\n\tpublic function clearContents():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_clear_contents(this);\n\t\t#end\n\t}\n\n\tpublic function getGlyphInfo():Array<HBGlyphInfo>\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tvar bytes = Bytes.alloc(0);\n\t\tbytes = NativeCFFI.lime_hb_buffer_get_glyph_infos(this, bytes);\n\n\t\tif (bytes == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar result = new Array<HBGlyphInfo>();\n\n\t\t\tvar length = bytes.length;\n\t\t\tvar position = 0, info;\n\n\t\t\twhile (position < length)\n\t\t\t{\n\t\t\t\tinfo = new HBGlyphInfo();\n\t\t\t\tinfo.codepoint = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tinfo.mask = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tinfo.cluster = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tresult.push(info);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getGlyphPositions():Array<HBGlyphPosition>\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tvar bytes = Bytes.alloc(0);\n\t\tbytes = NativeCFFI.lime_hb_buffer_get_glyph_positions(this, bytes);\n\n\t\tif (bytes == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar result = new Array<HBGlyphPosition>();\n\n\t\t\tvar length = bytes.length;\n\t\t\tvar position = 0, glyphPosition;\n\n\t\t\twhile (position < length)\n\t\t\t{\n\t\t\t\tglyphPosition = new HBGlyphPosition();\n\t\t\t\tglyphPosition.xAdvance = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tglyphPosition.yAdvance = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tglyphPosition.xOffset = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tglyphPosition.yOffset = bytes.getInt32(position);\n\t\t\t\tposition += 4;\n\t\t\t\tresult.push(glyphPosition);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function guessSegmentProperties():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_guess_segment_properties(this);\n\t\t#end\n\t}\n\n\tpublic function normalizeGlyphs():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_normalize_glyphs(this);\n\t\t#end\n\t}\n\n\tpublic function preallocate(size:Int):Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_preallocate(this, size);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function reset():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_reset(this);\n\t\t#end\n\t}\n\n\tpublic function reverse():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_reverse(this);\n\t\t#end\n\t}\n\n\tpublic function reverseClusters():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_reverse_clusters(this);\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_allocationSuccessful():Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_allocation_successful(this);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_clusterLevel():HBBufferClusterLevel\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_cluster_level(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_clusterLevel(value:HBBufferClusterLevel):HBBufferClusterLevel\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_cluster_level(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_contentType():HBBufferContentType\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_content_type(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_contentType(value:HBBufferContentType):HBBufferContentType\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_content_type(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_direction():HBDirection\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_direction(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_direction(value:HBDirection):HBDirection\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_direction(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\tprivate static inline function get_empty():HBBuffer\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_empty();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_flags():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_flags(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_flags(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_flags(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_language():HBLanguage\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_language(this);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_language(value:HBLanguage):HBLanguage\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_language(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_length():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_length(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_length(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_length(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_replacementCodepoint():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_replacement_codepoint(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_replacementCodepoint(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_replacement_codepoint(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_script():HBScript\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_buffer_get_script(this);\n\t\t#else\n\t\treturn cast 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_script(value:HBScript):HBScript\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\t#if neko\n\t\tvalue = -1;\n\t\t#end\n\t\tNativeCFFI.lime_hb_buffer_set_script(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_segmentProperties():HBSegmentProperties\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn null;\n\t\t// return NativeCFFI.lime_hb_buffer_get_segment_properties (this);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_segmentProperties(value:HBSegmentProperties):HBSegmentProperties\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_buffer_set_segment_properties(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBufferClusterLevel.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBBufferClusterLevel(Int) from Int to Int\n{\n\tpublic var MONOTONE_GRAPHEMES = 0;\n\tpublic var MONOTONE_CHARACTERS = 1;\n\tpublic var CHARACTERS = 2;\n\tpublic var DEFAULT = 0;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBufferContentType.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBBufferContentType(Int) from Int to Int\n{\n\tpublic var INVALID = 0;\n\tpublic var UNICODE = 1;\n\tpublic var GLYPHS = 2;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBufferFlags.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBBufferFlags(Int) from Int to Int\n{\n\tpublic var DEFAULT = 0x00000000;\n\tpublic var BOT = 0x00000001;\n\tpublic var EOT = 0x00000002;\n\tpublic var PRESERVE_DEFAULT_IGNORABLES = 0x00000004;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBufferSerializeFlags.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBBufferSerializeFlags(Int) from Int to Int\n{\n\tpublic var DEFAULT = 0x00000000;\n\tpublic var NO_CLUSTERS = 0x00000001;\n\tpublic var NO_POSITIONS = 0x00000002;\n\tpublic var NO_GLYPH_NAMES = 0x00000004;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBBufferSerializeFormat.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBBufferSerializeFormat(Int) from Int to Int\n{\n\t// public var HB_BUFFER_SERIALIZE_FORMAT_TEXT = HB_TAG('T', 'E', 'X', 'T');\n\t// public var JSON = HB_TAG('J', 'S', 'O', 'N');\n\t// public var INVALID = HB_TAG_NONE;\n\t// public static inline function fromString (str:String):HBBufferSerializeFormat {\n\t//\n\t//\n\t//\n\t// }\n}\n// @:cffi private static function lime_hb_buffer_serialize_format_from_string (str:String, len:Int):Int;\n// @:cffi private static function lime_hb_buffer_serialize_format_to_string (format:Int):CFFIPointer;\n// @:cffi private static function lime_hb_buffer_serialize_list_formats ():CFFIPointer;\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBDirection.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBDirection(Int) from Int to Int\n{\n\tpublic var INVALID = 0;\n\tpublic var LTR = 4;\n\tpublic var RTL = 5;\n\tpublic var TTB = 6;\n\tpublic var BTT = 7;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBFTFont.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\nimport lime.text.Font;\n\n@:forward\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBFTFont(HBFont) to HBFont from CFFIPointer to CFFIPointer\n{\n\tpublic var loadFlags(get, set):Int;\n\n\tpublic function new(font:Font)\n\t{\n\t\tif (font.src != null)\n\t\t{\n\t\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\t\t// this = NativeCFFI.lime_hb_ft_font_create (font.src);\n\t\t\tthis = NativeCFFI.lime_hb_ft_font_create_referenced(font.src);\n\t\t\t#else\n\t\t\tthis = null;\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_loadFlags():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_ft_font_get_load_flags(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_loadFlags(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_ft_font_set_load_flags(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBFace.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBFace(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic static var empty(get, never):HBFace;\n\n\tpublic var glyphCount(get, set):Int;\n\tpublic var immutable(get, never):Bool;\n\tpublic var index(get, set):Int;\n\tpublic var upem(get, set):Int;\n\n\tpublic function new(blob:HBBlob, index:Int)\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tthis = NativeCFFI.lime_hb_face_create(blob, index);\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\tprivate static inline function get_empty():HBFace\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_face_get_empty();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_glyphCount():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_face_get_glyph_count(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_glyphCount(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_face_set_glyph_count(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_immutable():Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_face_is_immutable(this);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_index():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_face_get_index(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_index(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_face_set_index(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_upem():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_face_get_upem(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_upem(value:Int):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_face_set_upem(this, value);\n\t\t#end\n\t\treturn value;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBFeature.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nclass HBFeature\n{\n\tpublic function new() {}\n}\n// @:cffi private static function lime_hb_feature_from_string (str:String):CFFIPointer;\n// @:cffi private static function lime_hb_feature_to_string (feature:CFFIPointer):CFFIPointer;\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBFont.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.math.Vector2;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBFont(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic static var empty(get, never):HBFont;\n\n\tpublic var face(get, never):HBFace;\n\tpublic var immutable(get, never):Bool;\n\tpublic var parent(get, never):HBFont;\n\tpublic var ppem(get, set):Vector2;\n\tpublic var scale(get, set):Vector2;\n\n\tpublic function new(face:HBFace)\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tthis = NativeCFFI.lime_hb_font_create(face);\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\tpublic function addGlyphOriginForDirection(glyph:Int, direction:HBDirection, x:Int, y:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_font_add_glyph_origin_for_direction(this, glyph, direction, x, y);\n\t\t#end\n\t}\n\n\tpublic function createSubFont():HBFont\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_create_sub_font(this);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getGlyphAdvanceForDirection(glyph:Int, direction:HBDirection):Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_glyph_advance_for_direction(this, glyph, direction #if hl, new Vector2() #end);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getGlyphKerningForDirection(glyph:Int, firstGlyph:Int, secondGlyph:Int, direction:HBDirection):Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_glyph_kerning_for_direction(this, firstGlyph, secondGlyph, direction #if hl, new Vector2() #end);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function getGlyphOriginForDirection(glyph:Int, direction:HBDirection):Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_glyph_origin_for_direction(this, glyph, direction #if hl, new Vector2() #end);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function glyphFromString(s:String):Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_glyph_from_string(this, s);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function glyphToString(codepoint:Int):String\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tvar result = NativeCFFI.lime_hb_font_glyph_to_string(this, codepoint);\n\t\treturn CFFI.stringValue(result);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function makeImmutable():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_font_make_immutable(this);\n\t\t#end\n\t}\n\n\tpublic function subtractGlyphOriginForDirection(glyph:Int, direction:HBDirection, x:Int, y:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_font_subtract_glyph_origin_for_direction(this, glyph, direction, x, y);\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\tprivate static inline function get_empty():HBFont\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_empty();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_face():HBFace\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_face(this);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_immutable():Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_is_immutable(this);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_parent():HBFont\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_parent(this);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_ppem():Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_ppem(this #if hl, new Vector2() #end);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_ppem(value:Vector2):Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_font_set_ppem(this, Std.int(value.x), Std.int(value.y));\n\t\t#end\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_scale():Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_font_get_scale(this #if hl, new Vector2() #end);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function set_scale(value:Vector2):Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_font_set_scale(this, Std.int(value.x), Std.int(value.y));\n\t\t#end\n\t\treturn value;\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBGlyphExtents.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nclass HBGlyphExtents\n{\n\tpublic function new() {}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBGlyphInfo.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nclass HBGlyphInfo\n{\n\tpublic var codepoint:Int;\n\tpublic var mask:Int;\n\tpublic var cluster:Int;\n\n\tpublic function new() {}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBGlyphPosition.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nclass HBGlyphPosition\n{\n\tpublic var xAdvance:Int;\n\tpublic var xOffset:Int;\n\tpublic var yAdvance:Int;\n\tpublic var yOffset:Int;\n\n\tpublic function new() {}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBLanguage.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.CFFI;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBLanguage(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic function new(language:String = null)\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tif (language != null)\n\t\t{\n\t\t\tthis = NativeCFFI.lime_hb_language_from_string(language);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = NativeCFFI.lime_hb_language_get_default();\n\t\t}\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\tpublic function toString():String\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tif (this != null)\n\t\t{\n\t\t\tvar result = NativeCFFI.lime_hb_language_to_string(this);\n\t\t\treturn CFFI.stringValue(result);\n\t\t}\n\t\t#end\n\t\treturn null;\n\t}\n\n\t@:from private static function fromString(value:String):HBLanguage\n\t{\n\t\treturn new HBLanguage(value);\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBMemoryMode.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBMemoryMode(Int) from Int to Int\n{\n\tpublic var DUPLICATE = 0;\n\tpublic var READONLY = 1;\n\tpublic var WRITABLE = 2;\n\tpublic var READONLY_MAY_MAKE_WRITABLE = 3;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBScript.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract HBScript(Int) from Int to Int\n{\n\tpublic var COMMON = \"Z\".code << 24 | \"y\".code << 16 | \"y\".code << 8 | \"y\".code;\n\tpublic var INHERITED = \"Z\".code << 24 | \"i\".code << 16 | \"n\".code << 8 | \"h\".code;\n\tpublic var UNKNOWN = \"Z\".code << 24 | \"z\".code << 16 | \"z\".code << 8 | \"z\".code;\n\tpublic var ARABIC = \"A\".code << 24 | \"r\".code << 16 | \"a\".code << 8 | \"b\".code;\n\tpublic var ARMENIAN = \"A\".code << 24 | \"r\".code << 16 | \"m\".code << 8 | \"n\".code;\n\tpublic var BENGALI = \"B\".code << 24 | \"e\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var CYRILLIC = \"C\".code << 24 | \"y\".code << 16 | \"r\".code << 8 | \"l\".code;\n\tpublic var DEVANAGARI = \"D\".code << 24 | \"e\".code << 16 | \"v\".code << 8 | \"a\".code;\n\tpublic var GEORGIAN = \"G\".code << 24 | \"e\".code << 16 | \"o\".code << 8 | \"r\".code;\n\tpublic var GREEK = \"G\".code << 24 | \"r\".code << 16 | \"e\".code << 8 | \"k\".code;\n\tpublic var GUJARATI = \"G\".code << 24 | \"u\".code << 16 | \"j\".code << 8 | \"r\".code;\n\tpublic var GURMUKHI = \"G\".code << 24 | \"u\".code << 16 | \"r\".code << 8 | \"u\".code;\n\tpublic var HANGUL = \"H\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var HAN = \"H\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"i\".code;\n\tpublic var HEBREW = \"H\".code << 24 | \"e\".code << 16 | \"b\".code << 8 | \"r\".code;\n\tpublic var HIRAGANA = \"H\".code << 24 | \"i\".code << 16 | \"r\".code << 8 | \"a\".code;\n\tpublic var KANNADA = \"K\".code << 24 | \"n\".code << 16 | \"d\".code << 8 | \"a\".code;\n\tpublic var KATAKANA = \"K\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"a\".code;\n\tpublic var LAO = \"L\".code << 24 | \"a\".code << 16 | \"o\".code << 8 | \"o\".code;\n\tpublic var LATIN = \"L\".code << 24 | \"a\".code << 16 | \"t\".code << 8 | \"n\".code;\n\tpublic var MALAYALAM = \"M\".code << 24 | \"l\".code << 16 | \"y\".code << 8 | \"m\".code;\n\tpublic var ORIYA = \"O\".code << 24 | \"r\".code << 16 | \"y\".code << 8 | \"a\".code;\n\tpublic var TAMIL = \"T\".code << 24 | \"a\".code << 16 | \"m\".code << 8 | \"l\".code;\n\tpublic var TELUGU = \"T\".code << 24 | \"e\".code << 16 | \"l\".code << 8 | \"u\".code;\n\tpublic var THAI = \"T\".code << 24 | \"h\".code << 16 | \"a\".code << 8 | \"i\".code;\n\tpublic var TIBETAN = \"T\".code << 24 | \"i\".code << 16 | \"b\".code << 8 | \"t\".code;\n\tpublic var BOPOMOFO = \"B\".code << 24 | \"o\".code << 16 | \"p\".code << 8 | \"o\".code;\n\tpublic var BRAILLE = \"B\".code << 24 | \"r\".code << 16 | \"a\".code << 8 | \"i\".code;\n\tpublic var CANADIAN_SYLLABICS = \"C\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"s\".code;\n\tpublic var CHEROKEE = \"C\".code << 24 | \"h\".code << 16 | \"e\".code << 8 | \"r\".code;\n\tpublic var ETHIOPIC = \"E\".code << 24 | \"t\".code << 16 | \"h\".code << 8 | \"i\".code;\n\tpublic var KHMER = \"K\".code << 24 | \"h\".code << 16 | \"m\".code << 8 | \"r\".code;\n\tpublic var MONGOLIAN = \"M\".code << 24 | \"o\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var MYANMAR = \"M\".code << 24 | \"y\".code << 16 | \"m\".code << 8 | \"r\".code;\n\tpublic var OGHAM = \"O\".code << 24 | \"g\".code << 16 | \"a\".code << 8 | \"m\".code;\n\tpublic var RUNIC = \"R\".code << 24 | \"u\".code << 16 | \"n\".code << 8 | \"r\".code;\n\tpublic var SINHALA = \"S\".code << 24 | \"i\".code << 16 | \"n\".code << 8 | \"h\".code;\n\tpublic var SYRIAC = \"S\".code << 24 | \"y\".code << 16 | \"r\".code << 8 | \"c\".code;\n\tpublic var THAANA = \"T\".code << 24 | \"h\".code << 16 | \"a\".code << 8 | \"a\".code;\n\tpublic var YI = \"Y\".code << 24 | \"i\".code << 16 | \"i\".code << 8 | \"i\".code;\n\tpublic var DESERET = \"D\".code << 24 | \"s\".code << 16 | \"r\".code << 8 | \"t\".code;\n\tpublic var GOTHIC = \"G\".code << 24 | \"o\".code << 16 | \"t\".code << 8 | \"h\".code;\n\tpublic var OLD_ITALIC = \"I\".code << 24 | \"t\".code << 16 | \"a\".code << 8 | \"l\".code;\n\tpublic var BUHID = \"B\".code << 24 | \"u\".code << 16 | \"h\".code << 8 | \"d\".code;\n\tpublic var HANUNOO = \"H\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"o\".code;\n\tpublic var TAGALOG = \"T\".code << 24 | \"g\".code << 16 | \"l\".code << 8 | \"g\".code;\n\tpublic var TAGBANWA = \"T\".code << 24 | \"a\".code << 16 | \"g\".code << 8 | \"b\".code;\n\tpublic var CYPRIOT = \"C\".code << 24 | \"p\".code << 16 | \"r\".code << 8 | \"t\".code;\n\tpublic var LIMBU = \"L\".code << 24 | \"i\".code << 16 | \"m\".code << 8 | \"b\".code;\n\tpublic var LINEAR_B = \"L\".code << 24 | \"i\".code << 16 | \"n\".code << 8 | \"b\".code;\n\tpublic var OSMANYA = \"O\".code << 24 | \"s\".code << 16 | \"m\".code << 8 | \"a\".code;\n\tpublic var SHAVIAN = \"S\".code << 24 | \"h\".code << 16 | \"a\".code << 8 | \"w\".code;\n\tpublic var TAI_LE = \"T\".code << 24 | \"a\".code << 16 | \"l\".code << 8 | \"e\".code;\n\tpublic var UGARITIC = \"U\".code << 24 | \"g\".code << 16 | \"a\".code << 8 | \"r\".code;\n\tpublic var BUGINESE = \"B\".code << 24 | \"u\".code << 16 | \"g\".code << 8 | \"i\".code;\n\tpublic var COPTIC = \"C\".code << 24 | \"o\".code << 16 | \"p\".code << 8 | \"t\".code;\n\tpublic var GLAGOLITIC = \"G\".code << 24 | \"l\".code << 16 | \"a\".code << 8 | \"g\".code;\n\tpublic var KHAROSHTHI = \"K\".code << 24 | \"h\".code << 16 | \"a\".code << 8 | \"r\".code;\n\tpublic var NEW_TAI_LUE = \"T\".code << 24 | \"a\".code << 16 | \"l\".code << 8 | \"u\".code;\n\tpublic var OLD_PERSIAN = \"X\".code << 24 | \"p\".code << 16 | \"e\".code << 8 | \"o\".code;\n\tpublic var SYLOTI_NAGRI = \"S\".code << 24 | \"y\".code << 16 | \"l\".code << 8 | \"o\".code;\n\tpublic var TIFINAGH = \"T\".code << 24 | \"f\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var BALINESE = \"B\".code << 24 | \"a\".code << 16 | \"l\".code << 8 | \"i\".code;\n\tpublic var CUNEIFORM = \"X\".code << 24 | \"s\".code << 16 | \"u\".code << 8 | \"x\".code;\n\tpublic var NKO = \"N\".code << 24 | \"k\".code << 16 | \"o\".code << 8 | \"o\".code;\n\tpublic var PHAGS_PA = \"P\".code << 24 | \"h\".code << 16 | \"a\".code << 8 | \"g\".code;\n\tpublic var PHOENICIAN = \"P\".code << 24 | \"h\".code << 16 | \"n\".code << 8 | \"x\".code;\n\tpublic var CARIAN = \"C\".code << 24 | \"a\".code << 16 | \"r\".code << 8 | \"i\".code;\n\tpublic var CHAM = \"C\".code << 24 | \"h\".code << 16 | \"a\".code << 8 | \"m\".code;\n\tpublic var KAYAH_LI = \"K\".code << 24 | \"a\".code << 16 | \"l\".code << 8 | \"i\".code;\n\tpublic var LEPCHA = \"L\".code << 24 | \"e\".code << 16 | \"p\".code << 8 | \"c\".code;\n\tpublic var LYCIAN = \"L\".code << 24 | \"y\".code << 16 | \"c\".code << 8 | \"i\".code;\n\tpublic var LYDIAN = \"L\".code << 24 | \"y\".code << 16 | \"d\".code << 8 | \"i\".code;\n\tpublic var OL_CHIKI = \"O\".code << 24 | \"l\".code << 16 | \"c\".code << 8 | \"k\".code;\n\tpublic var REJANG = \"R\".code << 24 | \"j\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var SAURASHTRA = \"S\".code << 24 | \"a\".code << 16 | \"u\".code << 8 | \"r\".code;\n\tpublic var SUNDANESE = \"S\".code << 24 | \"u\".code << 16 | \"n\".code << 8 | \"d\".code;\n\tpublic var VAI = \"V\".code << 24 | \"a\".code << 16 | \"i\".code << 8 | \"i\".code;\n\tpublic var AVESTAN = \"A\".code << 24 | \"v\".code << 16 | \"s\".code << 8 | \"t\".code;\n\tpublic var BAMUM = \"B\".code << 24 | \"a\".code << 16 | \"m\".code << 8 | \"u\".code;\n\tpublic var EGYPTIAN_HIEROGLYPHS = \"E\".code << 24 | \"g\".code << 16 | \"y\".code << 8 | \"p\".code;\n\tpublic var IMPERIAL_ARAMAIC = \"A\".code << 24 | \"r\".code << 16 | \"m\".code << 8 | \"i\".code;\n\tpublic var INSCRIPTIONAL_PAHLAVI = \"P\".code << 24 | \"h\".code << 16 | \"l\".code << 8 | \"i\".code;\n\tpublic var INSCRIPTIONAL_PARTHIAN = \"P\".code << 24 | \"r\".code << 16 | \"t\".code << 8 | \"i\".code;\n\tpublic var JAVANESE = \"J\".code << 24 | \"a\".code << 16 | \"v\".code << 8 | \"a\".code;\n\tpublic var KAITHI = \"K\".code << 24 | \"t\".code << 16 | \"h\".code << 8 | \"i\".code;\n\tpublic var LISU = \"L\".code << 24 | \"i\".code << 16 | \"s\".code << 8 | \"u\".code;\n\tpublic var MEETEI_MAYEK = \"M\".code << 24 | \"t\".code << 16 | \"e\".code << 8 | \"i\".code;\n\tpublic var OLD_SOUTH_ARABIAN = \"S\".code << 24 | \"a\".code << 16 | \"r\".code << 8 | \"b\".code;\n\tpublic var OLD_TURKIC = \"O\".code << 24 | \"r\".code << 16 | \"k\".code << 8 | \"h\".code;\n\tpublic var SAMARITAN = \"S\".code << 24 | \"a\".code << 16 | \"m\".code << 8 | \"r\".code;\n\tpublic var TAI_THAM = \"L\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"a\".code;\n\tpublic var TAI_VIET = \"T\".code << 24 | \"a\".code << 16 | \"v\".code << 8 | \"t\".code;\n\tpublic var BATAK = \"B\".code << 24 | \"a\".code << 16 | \"t\".code << 8 | \"k\".code;\n\tpublic var BRAHMI = \"B\".code << 24 | \"r\".code << 16 | \"a\".code << 8 | \"h\".code;\n\tpublic var MANDAIC = \"M\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"d\".code;\n\tpublic var CHAKMA = \"C\".code << 24 | \"a\".code << 16 | \"k\".code << 8 | \"m\".code;\n\tpublic var MEROITIC_CURSIVE = \"M\".code << 24 | \"e\".code << 16 | \"r\".code << 8 | \"c\".code;\n\tpublic var MEROITIC_HIEROGLYPHS = \"M\".code << 24 | \"e\".code << 16 | \"r\".code << 8 | \"o\".code;\n\tpublic var MIAO = \"P\".code << 24 | \"l\".code << 16 | \"r\".code << 8 | \"d\".code;\n\tpublic var SHARADA = \"S\".code << 24 | \"h\".code << 16 | \"r\".code << 8 | \"d\".code;\n\tpublic var SORA_SOMPENG = \"S\".code << 24 | \"o\".code << 16 | \"r\".code << 8 | \"a\".code;\n\tpublic var TAKRI = \"T\".code << 24 | \"a\".code << 16 | \"k\".code << 8 | \"r\".code;\n\tpublic var BASSA_VAH = \"B\".code << 24 | \"a\".code << 16 | \"s\".code << 8 | \"s\".code;\n\tpublic var CAUCASIAN_ALBANIAN = \"A\".code << 24 | \"g\".code << 16 | \"h\".code << 8 | \"b\".code;\n\tpublic var DUPLOYAN = \"D\".code << 24 | \"u\".code << 16 | \"p\".code << 8 | \"l\".code;\n\tpublic var ELBASAN = \"E\".code << 24 | \"l\".code << 16 | \"b\".code << 8 | \"a\".code;\n\tpublic var GRANTHA = \"G\".code << 24 | \"r\".code << 16 | \"a\".code << 8 | \"n\".code;\n\tpublic var KHOJKI = \"K\".code << 24 | \"h\".code << 16 | \"o\".code << 8 | \"j\".code;\n\tpublic var KHUDAWADI = \"S\".code << 24 | \"i\".code << 16 | \"n\".code << 8 | \"d\".code;\n\tpublic var LINEAR_A = \"L\".code << 24 | \"i\".code << 16 | \"n\".code << 8 | \"a\".code;\n\tpublic var MAHAJANI = \"M\".code << 24 | \"a\".code << 16 | \"h\".code << 8 | \"j\".code;\n\tpublic var MANICHAEAN = \"M\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"i\".code;\n\tpublic var MENDE_KIKAKUI = \"M\".code << 24 | \"e\".code << 16 | \"n\".code << 8 | \"d\".code;\n\tpublic var MODI = \"M\".code << 24 | \"o\".code << 16 | \"d\".code << 8 | \"i\".code;\n\tpublic var MRO = \"M\".code << 24 | \"r\".code << 16 | \"o\".code << 8 | \"o\".code;\n\tpublic var NABATAEAN = \"N\".code << 24 | \"b\".code << 16 | \"a\".code << 8 | \"t\".code;\n\tpublic var OLD_NORTH_ARABIAN = \"N\".code << 24 | \"a\".code << 16 | \"r\".code << 8 | \"b\".code;\n\tpublic var OLD_PERMIC = \"P\".code << 24 | \"e\".code << 16 | \"r\".code << 8 | \"m\".code;\n\tpublic var PAHAWH_HMONG = \"H\".code << 24 | \"m\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var PALMYRENE = \"P\".code << 24 | \"a\".code << 16 | \"l\".code << 8 | \"m\".code;\n\tpublic var PAU_CIN_HAU = \"P\".code << 24 | \"a\".code << 16 | \"u\".code << 8 | \"c\".code;\n\tpublic var PSALTER_PAHLAVI = \"P\".code << 24 | \"h\".code << 16 | \"l\".code << 8 | \"p\".code;\n\tpublic var SIDDHAM = \"S\".code << 24 | \"i\".code << 16 | \"d\".code << 8 | \"d\".code;\n\tpublic var TIRHUTA = \"T\".code << 24 | \"i\".code << 16 | \"r\".code << 8 | \"h\".code;\n\tpublic var WARANG_CITI = \"W\".code << 24 | \"a\".code << 16 | \"r\".code << 8 | \"a\".code;\n\tpublic var AHOM = \"A\".code << 24 | \"h\".code << 16 | \"o\".code << 8 | \"m\".code;\n\tpublic var ANATOLIAN_HIEROGLYPHS = \"H\".code << 24 | \"l\".code << 16 | \"u\".code << 8 | \"w\".code;\n\tpublic var HATRAN = \"H\".code << 24 | \"a\".code << 16 | \"t\".code << 8 | \"r\".code;\n\tpublic var MULTANI = \"M\".code << 24 | \"u\".code << 16 | \"l\".code << 8 | \"t\".code;\n\tpublic var OLD_HUNGARIAN = \"H\".code << 24 | \"u\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var SIGNWRITING = \"S\".code << 24 | \"g\".code << 16 | \"n\".code << 8 | \"w\".code;\n\tpublic var ADLAM = \"A\".code << 24 | \"d\".code << 16 | \"l\".code << 8 | \"m\".code;\n\tpublic var BHAIKSUKI = \"B\".code << 24 | \"h\".code << 16 | \"k\".code << 8 | \"s\".code;\n\tpublic var MARCHEN = \"M\".code << 24 | \"a\".code << 16 | \"r\".code << 8 | \"c\".code;\n\tpublic var OSAGE = \"O\".code << 24 | \"s\".code << 16 | \"g\".code << 8 | \"e\".code;\n\tpublic var TANGUT = \"T\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var NEWA = \"N\".code << 24 | \"e\".code << 16 | \"w\".code << 8 | \"a\".code;\n\tpublic var MASARAM_GONDI = \"G\".code << 24 | \"o\".code << 16 | \"n\".code << 8 | \"m\".code;\n\tpublic var NUSHU = \"N\".code << 24 | \"s\".code << 16 | \"h\".code << 8 | \"u\".code;\n\tpublic var SOYOMBO = \"S\".code << 24 | \"o\".code << 16 | \"y\".code << 8 | \"o\".code;\n\tpublic var ZANABAZAR_SQUARE = \"Z\".code << 24 | \"a\".code << 16 | \"n\".code << 8 | \"b\".code;\n\tpublic var DOGRA = \"D\".code << 24 | \"o\".code << 16 | \"g\".code << 8 | \"r\".code;\n\tpublic var GUNJALA_GONDI = \"G\".code << 24 | \"o\".code << 16 | \"n\".code << 8 | \"g\".code;\n\tpublic var HANIFI_ROHINGYA = \"R\".code << 24 | \"o\".code << 16 | \"h\".code << 8 | \"g\".code;\n\tpublic var MAKASAR = \"M\".code << 24 | \"a\".code << 16 | \"k\".code << 8 | \"a\".code;\n\tpublic var MEDEFAIDRIN = \"M\".code << 24 | \"e\".code << 16 | \"d\".code << 8 | \"f\".code;\n\tpublic var OLD_SOGDIAN = \"S\".code << 24 | \"o\".code << 16 | \"g\".code << 8 | \"o\".code;\n\tpublic var SOGDIAN = \"S\".code << 24 | \"o\".code << 16 | \"g\".code << 8 | \"d\".code;\n\tpublic var INVALID = 0;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBSegmentProperties.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nclass HBSegmentProperties\n{\n\tpublic function new() {}\n\t// @:cffi private static function lime_hb_segment_properties_equal (a:CFFIPointer, b:CFFIPointer):Bool;\n\t// @:cffi private static function lime_hb_segment_properties_hash (p:CFFIPointer):Int;\n}\n#end\n"
  },
  {
    "path": "src/lime/text/harfbuzz/HBSet.hx",
    "content": "package lime.text.harfbuzz;\n\n#if (!lime_doc_gen || lime_harfbuzz)\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.math.Vector2;\nimport lime.system.CFFIPointer;\n\n@:access(lime._internal.backend.native.NativeCFFI)\nabstract HBSet(CFFIPointer) from CFFIPointer to CFFIPointer\n{\n\tpublic static var empty(get, never):HBSet;\n\n\tpublic var allocationSuccessful(get, never):Bool;\n\tpublic var isEmpty(get, never):Bool;\n\tpublic var max(get, never):Int;\n\tpublic var min(get, never):Int;\n\tpublic var population(get, never):Int;\n\n\tpublic function new()\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tthis = NativeCFFI.lime_hb_set_create();\n\t\t#else\n\t\tthis = null;\n\t\t#end\n\t}\n\n\tpublic function add(codepoint:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_add(this, codepoint);\n\t\t#end\n\t}\n\n\tpublic function addRange(first:Int, last:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_add_range(this, first, last);\n\t\t#end\n\t}\n\n\tpublic function clear():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_clear(this);\n\t\t#end\n\t}\n\n\tpublic function del(codepoint:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_del(this, codepoint);\n\t\t#end\n\t}\n\n\tpublic function delRange(first:Int, last:Int):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_del_range(this, first, last);\n\t\t#end\n\t}\n\n\tpublic function has(codepoint:Int):Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_has(this, codepoint);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function intersect(other:HBSet):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_intersect(this, other);\n\t\t#end\n\t}\n\n\tpublic function invert():Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_invert(this);\n\t\t#end\n\t}\n\n\tpublic function isEqual(other:HBSet):Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_is_equal(this, other);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tpublic function next():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_next(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tpublic function nextRange():Vector2\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_next_range(this #if hl, new Vector2() #end);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function set(other:HBSet):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_set(this, other);\n\t\t#end\n\t}\n\n\tpublic function subtract(other:HBSet):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_subtract(this, other);\n\t\t#end\n\t}\n\n\tpublic function symmetricDifference(other:HBSet):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_symmetric_difference(this, other);\n\t\t#end\n\t}\n\n\tpublic function union(other:HBSet):Void\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\tNativeCFFI.lime_hb_set_union(this, other);\n\t\t#end\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_allocationSuccessful():Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_allocation_successful(this);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tprivate static inline function get_empty():HBSet\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_get_empty();\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_isEmpty():Bool\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_is_empty(this);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_max():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_get_max(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_min():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_get_min(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_population():Int\n\t{\n\t\t#if (lime_cffi && lime_harfbuzz && !macro)\n\t\treturn NativeCFFI.lime_hb_set_get_population(this);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/tools/AIRHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport sys.FileSystem;\n\nclass AIRHelper\n{\n\tpublic static function build(project:HXProject, workingDirectory:String, targetPlatform:Platform, targetPath:String, applicationXML:String,\n\t\t\tfiles:Array<String>, fileDirectory:String = null):String\n\t{\n\t\t// var airTarget = \"air\";\n\t\t// var extension = \".air\";\n\t\tvar airTarget = \"bundle\";\n\t\tvar extension = \"\";\n\n\t\tswitch (targetPlatform)\n\t\t{\n\t\t\tcase MAC:\n\n\t\t\t\tif (airTarget == \"bundle\")\n\t\t\t\t{\n\t\t\t\t\textension = \".app\";\n\t\t\t\t}\n\n\t\t\tcase IOS:\n\t\t\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t\t\t{\n\t\t\t\t\tif (project.debug)\n\t\t\t\t\t{\n\t\t\t\t\t\tairTarget = \"ipa-debug-interpreter-simulator\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tairTarget = \"ipa-test-interpreter-simulator\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar supportedExportMethods = [\"adhoc\", \"appstore\"];\n\t\t\t\t\tvar exportMethod:String = null;\n\t\t\t\t\tfor (m in supportedExportMethods)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (project.targetFlags.exists(m))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (exportMethod != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLog.error(\"Must not specify multiple export methods. Found: \" + exportMethod + \" and \" + m);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\texportMethod = m;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (exportMethod == null && project.targetFlags.exists(\"final\")) {\n\t\t\t\t\t\texportMethod = \"appstore\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (project.debug)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (exportMethod != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.error(\"Must not specify export method for a debug build. Found: \" + exportMethod);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tairTarget = \"ipa-debug\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (exportMethod)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"appstore\":\n\t\t\t\t\t\t\t\tairTarget = \"ipa-app-store\";\n\t\t\t\t\t\t\tcase \"adhoc\":\n\t\t\t\t\t\t\t\tairTarget = \"ipa-ad-hoc\";\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tairTarget = \"ipa-test\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// extension = \".ipa\";\n\n\t\t\tcase ANDROID:\n\t\t\t\tif (project.debug)\n\t\t\t\t{\n\t\t\t\t\tairTarget = \"apk-debug\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tairTarget = \"apk\";\n\t\t\t\t}\n\n\t\t\t// extension = \".apk\";\n\n\t\t\tdefault:\n\t\t}\n\n\t\tvar signingOptions:Array<String> = [];\n\n\t\tif (project.keystore != null)\n\t\t{\n\t\t\tvar keystoreType = project.keystore.type != null ? project.keystore.type : \"pkcs12\";\n\t\t\tsigningOptions.push(\"-storetype\");\n\t\t\tsigningOptions.push(keystoreType);\n\n\t\t\tif (project.keystore.path != null)\n\t\t\t{\n\t\t\t\tvar keystore = Path.tryFullPath(project.keystore.path);\n\t\t\t\tsigningOptions.push(\"-keystore\");\n\t\t\t\tsigningOptions.push(keystore);\n\t\t\t}\n\n\t\t\tif (project.keystore.alias != null)\n\t\t\t{\n\t\t\t\tsigningOptions.push(\"-alias\");\n\t\t\t\tsigningOptions.push(project.keystore.alias);\n\t\t\t}\n\n\t\t\tif (project.keystore.password != null)\n\t\t\t{\n\t\t\t\tsigningOptions.push(\"-storepass\");\n\t\t\t\tsigningOptions.push(project.keystore.password);\n\t\t\t}\n\n\t\t\tif (project.keystore.aliasPassword != null)\n\t\t\t{\n\t\t\t\tsigningOptions.push(\"-keypass\");\n\t\t\t\tsigningOptions.push(project.keystore.aliasPassword);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsigningOptions.push(\"-storetype\");\n\t\t\tsigningOptions.push(\"pkcs12\");\n\t\t\tsigningOptions.push(\"-keystore\");\n\t\t\tsigningOptions.push(System.findTemplate(project.templatePaths, \"air/debug.pfx\"));\n\t\t\tsigningOptions.push(\"-storepass\");\n\t\t\tsigningOptions.push(\"samplePassword\");\n\t\t}\n\n\t\tif (project.config.exists(\"air.tsa\"))\n\t\t{\n\t\t\tsigningOptions.push(\"-tsa\");\n\t\t\tsigningOptions.push(project.config.getString(\"air.tsa\"));\n\t\t}\n\n\t\tvar args = [\"-package\"];\n\n\t\t// TODO: Is this an old workaround fixed in newer AIR SDK?\n\n\t\tif (airTarget == \"air\" || airTarget == \"bundle\")\n\t\t{\n\t\t\targs = args.concat(signingOptions);\n\t\t\targs.push(\"-target\");\n\t\t\targs.push(airTarget);\n\t\t}\n\t\telse\n\t\t{\n\t\t\targs.push(\"-target\");\n\t\t\targs.push(airTarget);\n\n\t\t\tif (project.debug)\n\t\t\t{\n\t\t\t\tif (project.config.exists(\"air.connect\"))\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-connect\");\n\t\t\t\t\targs.push(project.config.getString(\"air.connect\"));\n\t\t\t\t}\n\t\t\t\telse if (project.config.exists(\"air.listen\"))\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-listen\");\n\t\t\t\t\targs.push(project.config.getString(\"air.listen\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-connect\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\targs = args.concat(signingOptions);\n\t\t}\n\n\t\tif (targetPlatform == IOS)\n\t\t{\n\t\t\tvar provisioningProfile = IOSHelper.getProvisioningFile(project);\n\n\t\t\tif (provisioningProfile != \"\")\n\t\t\t{\n\t\t\t\targs.push(\"-provisioning-profile\");\n\t\t\t\targs.push(provisioningProfile);\n\t\t\t}\n\t\t}\n\n\t\targs = args.concat([targetPath + extension, applicationXML]);\n\n\t\tif (targetPlatform == IOS && System.hostPlatform == MAC && project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\targs.push(\"-platformsdk\");\n\t\t\targs.push(IOSHelper.getSDKDirectory(project));\n\t\t}\n\n\t\tif (fileDirectory != null && fileDirectory != \"\")\n\t\t{\n\t\t\targs.push(\"-C\");\n\t\t\targs.push(fileDirectory);\n\t\t}\n\n\t\targs = args.concat(files);\n\n\t\tvar extDirs:Array<String> = getExtDirs(project);\n\n\t\tif (extDirs.length > 0)\n\t\t{\n\t\t\targs.push(\"-extdir\");\n\n\t\t\tfor (extDir in extDirs)\n\t\t\t{\n\t\t\t\targs.push(extDir);\n\t\t\t}\n\t\t}\n\n\t\tif (targetPlatform == ANDROID)\n\t\t{\n\t\t\tSys.putEnv(\"AIR_NOANDROIDFLAIR\", \"true\");\n\t\t}\n\n\t\tif (targetPlatform == IOS && System.hostPlatform == MAC)\n\t\t{\n\t\t\tvar simulatorName = XCodeHelper.getSimulatorName(project);\n\t\t\tif (simulatorName == null)\n\t\t\t{\n\t\t\t\tLog.warn(\"Skipping AIR_IOS_SIMULATOR_DEVICE environment variable because default simulator not found\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSys.putEnv(\"AIR_IOS_SIMULATOR_DEVICE\", simulatorName);\n\t\t\t}\n\t\t}\n\n\t\tSystem.runCommand(workingDirectory, project.defines.get(\"AIR_SDK\") + \"/bin/adt\", args);\n\n\t\treturn targetPath + extension;\n\t}\n\n\tpublic static function getExtDirs(project:HXProject):Array<String>\n\t{\n\t\tvar extDirs:Array<String> = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tvar extDir:String = FileSystem.fullPath(Path.directory(dependency.path));\n\n\t\t\tif (StringTools.endsWith(dependency.path, \".ane\") && extDirs.indexOf(extDir) == -1)\n\t\t\t{\n\t\t\t\textDirs.push(extDir);\n\t\t\t}\n\t\t}\n\n\t\treturn extDirs;\n\t}\n\n\tpublic static function run(project:HXProject, workingDirectory:String, targetPlatform:Platform, applicationXML:String, rootDirectory:String = null):Void\n\t{\n\t\tvar runInAdl = true;\n\t\tif (targetPlatform == ANDROID && !project.targetFlags.exists(\"air-simulator\"))\n\t\t{\n\t\t\trunInAdl = false;\n\t\t\tAndroidHelper.initialize(project);\n\t\t\tAndroidHelper.install(project,\n\t\t\t\tFileSystem.fullPath(workingDirectory)\n\t\t\t\t+ \"/\"\n\t\t\t\t+ (rootDirectory != null ? rootDirectory + \"/\" : \"\")\n\t\t\t\t+ project.app.file\n\t\t\t\t+ \".apk\");\n\t\t\tAndroidHelper.run(project.meta.packageName + \"/.AppEntry\");\n\t\t}\n\t\telse if (targetPlatform == IOS && !project.targetFlags.exists(\"air-simulator\"))\n\t\t{\n\t\t\trunInAdl = false;\n\t\t\tvar args = [\"-platform\", \"ios\"];\n\n\t\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t\t{\n\t\t\t\targs.push(\"-device\");\n\t\t\t\targs.push(\"ios-simulator\");\n\t\t\t\targs.push(\"-platformsdk\");\n\t\t\t\targs.push(IOSHelper.getSDKDirectory(project));\n\n\t\t\t\tSystem.runCommand(\"\", \"killall\", [\"iPhone Simulator\"], true, true);\n\t\t\t}\n\n\t\t\tSystem.runCommand(workingDirectory, project.defines.get(\"AIR_SDK\") + \"/bin/adt\",\n\t\t\t\t[\"-uninstallApp\"].concat(args).concat([\"-appid\", project.meta.packageName]), true, true);\n\t\t\tSystem.runCommand(workingDirectory, project.defines.get(\"AIR_SDK\") + \"/bin/adt\", [\"-installApp\"].concat(args).concat([\"-package\",\n\t\t\t\tFileSystem.fullPath(workingDirectory)\n\t\t\t\t+ \"/\"\n\t\t\t\t+ (rootDirectory != null ? rootDirectory + \"/\" : \"\")\n\t\t\t\t+ project.app.file\n\t\t\t\t+ \".ipa\"]));\n\t\t\tSystem.runCommand(workingDirectory, project.defines.get(\"AIR_SDK\") + \"/bin/adt\",\n\t\t\t\t[\"-launchApp\"].concat(args).concat([\"-appid\", project.meta.packageName]), true, true);\n\n\t\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t\t{\n\t\t\t\tvar simulatorAppPath:String = \"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/\";\n\n\t\t\t\tif (!FileSystem.exists(simulatorAppPath))\n\t\t\t\t{\n\t\t\t\t\tsimulatorAppPath = \"/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/\";\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(\"\", \"open\", [simulatorAppPath]);\n\t\t\t}\n\t\t}\n\t\tif (runInAdl)\n\t\t{\n\t\t\tvar extDirs:Array<String> = getExtDirs(project);\n\n\t\t\tvar profile:String;\n\n\t\t\tif (project.config.exists(\"air.profile\"))\n\t\t\t{\n\t\t\t\tprofile = project.config.getString(\"air.profile\");\n\t\t\t}\n\t\t\telse if (targetPlatform == ANDROID)\n\t\t\t{\n\t\t\t\tprofile = \"mobileDevice\";\n\t\t\t}\n\t\t\telse if (targetPlatform == IOS)\n\t\t\t{\n\t\t\t\tprofile = \"mobileDevice\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprofile = extDirs.length > 0 ? \"extendedDesktop\" : \"desktop\";\n\t\t\t}\n\n\t\t\tvar args = [\"-profile\", profile];\n\n\t\t\tif (targetPlatform == ANDROID || targetPlatform == IOS)\n\t\t\t{\n\t\t\t\targs.push(\"-XscreenDPI\");\n\t\t\t\tif (project.config.exists(\"air.screenDPI\"))\n\t\t\t\t{\n\t\t\t\t\tvar screenDPI = project.config.getString(\"air.screenDPI\");\n\t\t\t\t\targs.push(screenDPI);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\targs.push(\"252\");\n\t\t\t\t}\n\t\t\t\targs.push(\"-screensize\");\n\t\t\t\tif (project.config.exists(\"air.screensize\"))\n\t\t\t\t{\n\t\t\t\t\tvar screensize = project.config.getString(\"air.screensize\");\n\t\t\t\t\targs.push(screensize);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// these are just generic default dimensions that are a bit\n\t\t\t\t\t// larger than AIR's defaults for the simulator\n\t\t\t\t\targs.push(\"480x762:480x800\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (targetPlatform == ANDROID)\n\t\t\t{\n\t\t\t\targs.push(\"-XversionPlatform\");\n\t\t\t\targs.push(\"AND\");\n\t\t\t}\n\t\t\telse if (targetPlatform == IOS)\n\t\t\t{\n\t\t\t\targs.push(\"-XversionPlatform\");\n\t\t\t\targs.push(\"IOS\");\n\t\t\t}\n\n\t\t\tif (!project.debug)\n\t\t\t{\n\t\t\t\targs.push(\"-nodebug\");\n\t\t\t}\n\n\t\t\tif (extDirs.length > 0)\n\t\t\t{\n\t\t\t\targs.push(\"-extdir\");\n\n\t\t\t\tfor (extDir in extDirs)\n\t\t\t\t{\n\t\t\t\t\tif (!FileSystem.exists(extDir + \"/adl\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(\"Create \" + extDir + \"/adl directory, and extract your ANE files to .ane directories.\");\n\t\t\t\t\t}\n\n\t\t\t\t\targs.push(extDir + \"/adl\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\targs.push(applicationXML);\n\n\t\t\tif (rootDirectory != null && rootDirectory != \"\")\n\t\t\t{\n\t\t\t\targs.push(rootDirectory);\n\t\t\t}\n\n\t\t\tSystem.runCommand(workingDirectory, project.defines.get(\"AIR_SDK\") + \"/bin/adl\", args);\n\t\t}\n\t}\n\n\tpublic static function trace(project:HXProject, workingDirectory:String, targetPlatform:Platform, applicationXML:String, rootDirectory:String = null)\n\t{\n\t\tif (targetPlatform == ANDROID && !project.targetFlags.exists(\"air-simulator\"))\n\t\t{\n\t\t\tAndroidHelper.initialize(project);\n\t\t\tvar deviceID:String = null;\n\t\t\tvar adbFilter:String = null;\n\n\t\t\t// if (!Log.verbose) {\n\n\t\t\tif (project.debug)\n\t\t\t{\n\t\t\t\tadbFilter = project.meta.packageName + \":I ActivityManager:I *:S\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadbFilter = project.meta.packageName + \":I *:S\";\n\t\t\t}\n\n\t\t\t// }\n\n\t\t\tAndroidHelper.trace(project, project.debug, deviceID, adbFilter);\n\t\t}\n\t}\n\n\tpublic static function uninstall(project:HXProject, workingDirectory:String, targetPlatform:Platform, applicationXML:String, rootDirectory:String = null)\n\t{\n\t\tif (targetPlatform == ANDROID)\n\t\t{\n\t\t\tAndroidHelper.initialize(project);\n\t\t\tvar deviceID:String = null;\n\t\t\tAndroidHelper.uninstall(project.meta.packageName, deviceID);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/AndroidHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass AndroidHelper\n{\n\tprivate static var adbName:String;\n\tprivate static var adbPath:String;\n\tprivate static var emulatorName:String;\n\tprivate static var emulatorPath:String;\n\n\tpublic static function build(project:HXProject, projectDirectory:String):Void\n\t{\n\t\tif (project.environment.exists(\"ANDROID_SDK\"))\n\t\t{\n\t\t\tSys.putEnv(\"ANDROID_SDK\", project.environment.get(\"ANDROID_SDK\"));\n\t\t}\n\n\t\tvar task = \"assembleDebug\";\n\n\t\tif (project.keystore != null)\n\t\t{\n\t\t\ttask = \"assembleRelease\";\n\t\t}\n\n\t\tif (project.environment.exists(\"ANDROID_GRADLE_TASK\"))\n\t\t{\n\t\t\ttask = project.environment.get(\"ANDROID_GRADLE_TASK\");\n\t\t}\n\n\t\tvar args = task.split(\" \");\n\t\t// args.push (\"--stacktrace\");\n\t\t// args.push (\"--debug\");\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targs.push(\"--info\");\n\t\t}\n\n\t\tif (System.hostPlatform != WINDOWS)\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", Path.combine(projectDirectory, \"gradlew\")]);\n\t\t\tSystem.runCommand(projectDirectory, \"./gradlew\", args);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.runCommand(projectDirectory, \"gradlew\", args);\n\t\t}\n\t}\n\n\tprivate static function connect(deviceID:String):Void\n\t{\n\t\tif (deviceID != null && deviceID != \"\" && deviceID.indexOf(\"emulator\") == -1)\n\t\t{\n\t\t\tif (deviceID.indexOf(\":\") > 0)\n\t\t\t{\n\t\t\t\tdeviceID = deviceID.substr(0, deviceID.indexOf(\":\"));\n\t\t\t}\n\n\t\t\tSystem.runCommand(adbPath, adbName, [\"connect\", deviceID]);\n\t\t}\n\t}\n\n\tpublic static function getBuildToolsVersion(project:HXProject):String\n\t{\n\t\tvar buildToolsPath = Path.combine(project.environment.get(\"ANDROID_SDK\"), \"build-tools/\");\n\n\t\tvar version = ~/^(\\d+)\\.(\\d+)\\.(\\d+)$/i;\n\t\tvar current = {major: 0, minor: 0, micro: 0};\n\n\t\tif (!FileSystem.exists(buildToolsPath))\n\t\t{\n\t\t\tLog.error(\"Cannot find directory \\\"\" + buildToolsPath + \"\\\"\");\n\t\t}\n\n\t\tfor (buildTool in FileSystem.readDirectory(buildToolsPath))\n\t\t{\n\t\t\t// gradle only likes simple version numbers (x.y.z)\n\n\t\t\tif (!version.match(buildTool))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar newVersion =\n\t\t\t\t{\n\t\t\t\t\tmajor: Std.parseInt(version.matched(1)),\n\t\t\t\t\tminor: Std.parseInt(version.matched(2)),\n\t\t\t\t\tmicro: Std.parseInt(version.matched(3))\n\t\t\t\t};\n\n\t\t\tif (newVersion.major != current.major)\n\t\t\t{\n\t\t\t\tif (newVersion.major > current.major)\n\t\t\t\t{\n\t\t\t\t\tcurrent = newVersion;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (newVersion.minor != current.minor)\n\t\t\t{\n\t\t\t\tif (newVersion.minor > current.minor)\n\t\t\t\t{\n\t\t\t\t\tcurrent = newVersion;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (newVersion.micro > current.micro)\n\t\t\t\t{\n\t\t\t\t\tcurrent = newVersion;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn '${current.major}.${current.minor}.${current.micro}';\n\t}\n\n\tpublic static function getDeviceSDKVersion(deviceID:String):Int\n\t{\n\t\tvar devices = listDevices();\n\n\t\tif (devices.length > 0)\n\t\t{\n\t\t\tvar tempFile = System.getTemporaryFile();\n\n\t\t\tvar args = [\"wait-for-device\", \"shell\", \"getprop\", \"ro.build.version.sdk\", \">\", tempFile];\n\n\t\t\tif (deviceID != null && deviceID != \"\")\n\t\t\t{\n\t\t\t\targs.unshift(deviceID);\n\t\t\t\targs.unshift(\"-s\");\n\n\t\t\t\t// connect (deviceID);\n\t\t\t}\n\n\t\t\tif (System.hostPlatform == MAC)\n\t\t\t{\n\t\t\t\tSystem.runCommand(adbPath, \"perl\", [\"-e\", 'alarm shift @ARGV; exec @ARGV', \"3\", adbName].concat(args), true, true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.runCommand(adbPath, adbName, args, true, true);\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(tempFile))\n\t\t\t{\n\t\t\t\tvar output = File.getContent(tempFile);\n\t\t\t\tFileSystem.deleteFile(tempFile);\n\t\t\t\treturn Std.parseInt(output);\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tpublic static function initialize(project:HXProject):Void\n\t{\n\t\tadbPath = project.environment.get(\"ANDROID_SDK\") + \"/platform-tools/\";\n\t\temulatorPath = project.environment.get(\"ANDROID_SDK\") + \"/emulator/\";\n\n\t\tadbName = \"adb\";\n\t\temulatorName = \"emulator\";\n\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tadbName += \".exe\";\n\t\t\temulatorName += \".exe\";\n\t\t}\n\n\t\tif (!FileSystem.exists(adbPath + adbName))\n\t\t{\n\t\t\t// in older SDKs, adb was located in /tools/\n\t\t\tadbPath = project.environment.get(\"ANDROID_SDK\") + \"/tools/\";\n\t\t}\n\n\t\tif (!FileSystem.exists(emulatorPath + emulatorName))\n\t\t{\n\t\t\t// in older SDKs, emulator was located in /tools/\n\t\t\temulatorPath = project.environment.get(\"ANDROID_SDK\") + \"/tools/\";\n\t\t}\n\n\t\tif (System.hostPlatform != WINDOWS)\n\t\t{\n\t\t\tadbName = \"./\" + adbName;\n\t\t\temulatorName = \"./\" + emulatorName;\n\t\t}\n\n\t\tif (project.environment.exists(\"JAVA_HOME\"))\n\t\t{\n\t\t\tvar javaHome = project.environment.get(\"JAVA_HOME\");\n\t\t\tif (!FileSystem.exists(javaHome))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for JAVA_HOME does not exist: \" + javaHome);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t\tif (!FileSystem.isDirectory(javaHome))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for JAVA_HOME must be a directory: \" + javaHome);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t\tSys.putEnv(\"JAVA_HOME\", project.environment.get(\"JAVA_HOME\"));\n\t\t}\n\t}\n\n\tpublic static function install(project:HXProject, targetPath:String, deviceID:String = null):String\n\t{\n\t\tif (!FileSystem.exists(adbPath + adbName))\n\t\t{\n\t\t\tLog.error(\"adb not found in Android SDK: \" + project.environment.get(\"ANDROID_SDK\"));\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"emulator\") || project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tif (!FileSystem.exists(emulatorPath + emulatorName))\n\t\t\t{\n\t\t\t\tLog.error(\"emulator not found in Android SDK: \" + project.environment.get(\"ANDROID_SDK\"));\n\t\t\t}\n\n\t\t\tLog.info(\"\", \"Searching for Android emulator\");\n\n\t\t\tvar devices = listDevices();\n\n\t\t\tfor (device in devices)\n\t\t\t{\n\t\t\t\tif (device.indexOf(\"emulator\") > -1)\n\t\t\t\t{\n\t\t\t\t\tdeviceID = device;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// TODO: Check emulator capabilities, if it is GPU enabled and if API LEVEL >15 (http://developer.android.com/tools/devices/emulator.html)\n\n\t\t\tif (deviceID == null)\n\t\t\t{\n\t\t\t\tvar avds = listAVDs();\n\n\t\t\t\tif (avds.length == 0)\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"Cannot find emulator, please use AVD manager to create one\");\n\t\t\t\t}\n\n\t\t\t\tLog.info(\"Starting AVD: \" + avds[0]);\n\n\t\t\t\tSystem.runProcess(emulatorPath, emulatorName, [\"-avd\", avds[0], \"-gpu\", \"on\"], false);\n\n\t\t\t\twhile (deviceID == null)\n\t\t\t\t{\n\t\t\t\t\tdevices = listDevices();\n\n\t\t\t\t\tfor (device in devices)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (device.indexOf(\"emulator\") > -1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdeviceID = device;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (deviceID == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.sleep(3);\n\n\t\t\t\t\t\tif (!Log.verbose)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSys.print(\".\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.println(\"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSystem.runCommand(adbPath, adbName, [\"-s\", deviceID, \"shell\", \"input\", \"keyevent\", \"82\"]);\n\t\t}\n\n\t\tvar args = [\"install\", \"-r\"];\n\n\t\t// if (getDeviceSDKVersion (deviceID) > 16) {\n\n\t\targs.push(\"-d\");\n\n\t\t// }\n\n\t\targs.push(targetPath);\n\n\t\tif (deviceID != null && deviceID != \"\")\n\t\t{\n\t\t\targs.unshift(deviceID);\n\t\t\targs.unshift(\"-s\");\n\n\t\t\tconnect(deviceID);\n\t\t}\n\n\t\tSystem.runCommand(adbPath, adbName, args);\n\n\t\treturn deviceID;\n\t}\n\n\tpublic static function listAVDs():Array<String>\n\t{\n\t\tvar avds = new Array<String>();\n\t\tvar output = System.runProcess(emulatorPath, emulatorName, [\"-list-avds\"]);\n\t\tif (output != null && output != \"\")\n\t\t{\n\t\t\t// -list-avds returns only the avd names, separated by line breaks\n\t\t\tfor (line in output.split(\"\\n\"))\n\t\t\t{\n\t\t\t\tavds.push(StringTools.trim(line));\n\t\t\t}\n\t\t}\n\n\t\treturn avds;\n\t}\n\n\tpublic static function listDevices():Array<String>\n\t{\n\t\tvar devices = new Array<String>();\n\t\tvar output = \"\";\n\n\t\tif (System.hostPlatform != WINDOWS)\n\t\t{\n\t\t\t/*\n\t\t\t * using System.runProcess on *NIX platforms for `adb devices` usually\n\t\t\t * hangs when adb also starts the server.\n\t\t\t * To avoid this, we start the server beforehand\n\t\t\t */\n\t\t\tSystem.runCommand(adbPath, adbName, [\"start-server\"], true);\n\t\t}\n\t\toutput = System.runProcess(adbPath, adbName, [\"devices\"], true, true);\n\n\t\tif (output != null && output != \"\")\n\t\t{\n\t\t\tfor (line in output.split(\"\\n\"))\n\t\t\t{\n\t\t\t\tif (line.indexOf(\"device\") > -1 && line.indexOf(\"attached\") == -1)\n\t\t\t\t{\n\t\t\t\t\tdevices.push(StringTools.trim(line.substr(0, line.indexOf(\"device\"))));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn devices;\n\t}\n\n\tpublic static function run(activityName:String, deviceID:String = null):Void\n\t{\n\t\tvar args = [\"shell\", \"am\", \"start\", \"-a\", \"android.intent.action.MAIN\", \"-n\", activityName];\n\n\t\tif (deviceID != null && deviceID != \"\")\n\t\t{\n\t\t\targs.unshift(deviceID);\n\t\t\targs.unshift(\"-s\");\n\n\t\t\tconnect(deviceID);\n\t\t}\n\n\t\tSystem.runCommand(adbPath, adbName, args);\n\t}\n\n\tpublic static function trace(project:HXProject, debug:Bool, deviceID:String = null, customFilter:String = null):Void\n\t{\n\t\tif (!FileSystem.exists(adbPath + adbName))\n\t\t{\n\t\t\tLog.error(\"adb not found in Android SDK: \" + project.environment.get(\"ANDROID_SDK\"));\n\t\t}\n\n\t\t// Use -DFULL_LOGCAT or  <set name=\"FULL_LOGCAT\" /> if you do not want to filter log messages\n\n\t\tvar args = [\"logcat\"];\n\n\t\tif (deviceID != null && deviceID != \"\")\n\t\t{\n\t\t\targs.unshift(deviceID);\n\t\t\targs.unshift(\"-s\");\n\n\t\t\tconnect(deviceID);\n\t\t}\n\n\t\tif (customFilter != null)\n\t\t{\n\t\t\tSystem.runCommand(adbPath, adbName, args.concat([customFilter]));\n\t\t}\n\t\telse if (project.environment.exists(\"FULL_LOGCAT\") || Log.verbose)\n\t\t{\n\t\t\tSystem.runCommand(adbPath, adbName, args.concat([\"-c\"]));\n\t\t\tSystem.runCommand(adbPath, adbName, args);\n\t\t}\n\t\telse if (debug)\n\t\t{\n\t\t\tvar filter = \"*:E\";\n\t\t\tvar includeTags = [\n\t\t\t\t\"lime\",\n\t\t\t\t\"Lime\",\n\t\t\t\t\"Main\",\n\t\t\t\t\"GameActivity\",\n\t\t\t\t\"SDLActivity\",\n\t\t\t\t\"GLThread\",\n\t\t\t\t\"trace\",\n\t\t\t\t\"Haxe\"\n\t\t\t];\n\n\t\t\tfor (tag in includeTags)\n\t\t\t{\n\t\t\t\tfilter += \" \" + tag + \":D\";\n\t\t\t}\n\n\t\t\tSys.println(filter);\n\n\t\t\tSystem.runCommand(adbPath, adbName, args.concat([filter]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.runCommand(adbPath, adbName, args.concat([\"*:S trace:I\"]));\n\t\t}\n\t}\n\n\tpublic static function uninstall(packageName:String, deviceID:String = null):Void\n\t{\n\t\tif (!FileSystem.exists(adbPath + adbName))\n\t\t{\n\t\t\tLog.error(\"adb not found in Android SDK\");\n\t\t}\n\n\t\tvar args = [\"uninstall\", packageName];\n\n\t\tif (deviceID != null && deviceID != \"\")\n\t\t{\n\t\t\targs.unshift(deviceID);\n\t\t\targs.unshift(\"-s\");\n\n\t\t\tconnect(deviceID);\n\t\t}\n\n\t\tSystem.runCommand(adbPath, adbName, args);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ApplicationData.hx",
    "content": "package lime.tools;\n\n@:forward\nabstract ApplicationData({\n\t@:optional var file:String;\n\t@:optional var init:String;\n\t@:optional var main:String;\n\t@:optional var path:String;\n\t@:optional var preloader:String;\n\t@:optional var swfVersion:Float;\n\t@:optional var url:String;\n}) from Dynamic\n{\n\t@:noCompletion\n\tpublic static var expectedFields:ApplicationData = {\n\t\tfile: \"\",\n\t\tinit: \"\",\n\t\tmain: \"\",\n\t\tpath: \"\",\n\t\tpreloader: \"\",\n\t\tswfVersion: 0.0,\n\t\turl: \"\"\n\t};\n}\n"
  },
  {
    "path": "src/lime/tools/Architecture.hx",
    "content": "package lime.tools;\n\nenum Architecture\n{\n\tARMV5;\n\tARMV6;\n\tARMV7;\n\tARMV7S;\n\tARM64;\n\tX86;\n\tX64;\n\tMIPS;\n\tMIPSEL;\n}\n"
  },
  {
    "path": "src/lime/tools/Asset.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.AssetType;\nimport sys.FileSystem;\n\n@:access(lime.tools.AssetHelper)\nclass Asset\n{\n\tpublic var data:Dynamic;\n\tpublic var embed:Null<Bool>;\n\tpublic var encoding:AssetEncoding;\n\tpublic var flatName:String;\n\tpublic var format:String;\n\tpublic var glyphs:String;\n\tpublic var id:String;\n\tpublic var library:String;\n\t// public var path:String;\n\t// public var rename:String;\n\tpublic var resourceName:String;\n\tpublic var sourcePath:String;\n\tpublic var targetPath:String;\n\tpublic var type:AssetType;\n\n\tpublic function new(path:String = \"\", rename:String = \"\", type:AssetType = null, embed:Null<Bool> = null, setDefaults:Bool = true)\n\t{\n\t\tif (!setDefaults) return;\n\n\t\tthis.embed = embed;\n\t\tsourcePath = Path.standardize(path);\n\n\t\tif (rename == \"\")\n\t\t{\n\t\t\ttargetPath = path;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetPath = rename;\n\t\t}\n\n\t\tid = targetPath;\n\t\tresourceName = targetPath;\n\t\tflatName = StringTools.getFlatName(targetPath);\n\t\tformat = Path.extension(path).toLowerCase();\n\t\tglyphs = \"32-255\";\n\n\t\tif (type == null)\n\t\t{\n\t\t\tvar extension = Path.extension(path);\n\t\t\tif (extension != null) extension = extension.toLowerCase();\n\n\t\t\tif (AssetHelper.knownExtensions.exists(extension))\n\t\t\t{\n\t\t\t\tthis.type = AssetHelper.knownExtensions.get(extension);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch (extension)\n\t\t\t\t{\n\t\t\t\t\tcase \"bundle\":\n\t\t\t\t\t\tthis.type = AssetType.MANIFEST;\n\n\t\t\t\t\tcase \"ogg\", \"m4a\":\n\t\t\t\t\t\tif (FileSystem.exists(path))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar stat = FileSystem.stat(path);\n\n\t\t\t\t\t\t\t// if (stat.size > 1024 * 128) {\n\t\t\t\t\t\t\tif (stat.size > 1024 * 1024)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tthis.type = AssetType.MUSIC;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tthis.type = AssetType.SOUND;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.type = AssetType.SOUND;\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (path != \"\" && System.isText(path))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.type = AssetType.TEXT;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.type = AssetType.BINARY;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.type = type;\n\t\t}\n\t}\n\n\tpublic function clone():Asset\n\t{\n\t\tvar asset = new Asset(\"\", \"\", null, null, false);\n\n\t\tasset.data = data;\n\t\tasset.embed = embed;\n\t\tasset.encoding = encoding;\n\t\tasset.flatName = flatName;\n\t\tasset.format = format;\n\t\tasset.glyphs = glyphs;\n\t\tasset.id = id;\n\t\tasset.library = library;\n\t\tasset.resourceName = resourceName;\n\t\tasset.sourcePath = sourcePath;\n\t\tasset.targetPath = targetPath;\n\t\tasset.type = type;\n\n\t\t// ObjectTools.copyFields (this, asset);\n\n\t\treturn asset;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/AssetEncoding.hx",
    "content": "package lime.tools;\n\nenum AssetEncoding\n{\n\tNONE;\n\tBASE64;\n}\n"
  },
  {
    "path": "src/lime/tools/AssetHelper.hx",
    "content": "package lime.tools;\n\n#if lime\nimport haxe.io.Bytes as HaxeBytes;\nimport haxe.Serializer;\nimport haxe.Unserializer;\nimport hxp.*;\nimport lime._internal.format.Base64;\nimport lime.tools.AssetType;\nimport lime.tools.Asset;\nimport lime.tools.HXProject;\nimport lime.tools.Library;\nimport lime.utils.AssetManifest;\nimport lime.utils.Bytes;\nimport sys.io.File;\nimport sys.io.FileOutput;\nimport sys.FileSystem;\n\nclass AssetHelper\n{\n\tprivate static var DEFAULT_LIBRARY_NAME = \"default\";\n\tprivate static var knownExtensions:Map<String, AssetType>;\n\n\tprivate static function __init__():Void\n\t{\n\t\tknownExtensions = [\n\n\t\t\t\"jpg\" => IMAGE, \"jpeg\" => IMAGE, \"png\" => IMAGE, \"gif\" => IMAGE, \"webp\" => IMAGE, \"bmp\" => IMAGE, \"tiff\" => IMAGE, \"jfif\" => IMAGE, \"otf\" => FONT,\n\t\t\t\"ttf\" => FONT, \"wav\" => SOUND, \"wave\" => SOUND, \"mp3\" => MUSIC, \"mp2\" => MUSIC, \"exe\" => BINARY, \"bin\" => BINARY, \"so\" => BINARY, \"pch\" => BINARY,\n\t\t\t\"dll\" => BINARY, \"zip\" => BINARY, \"tar\" => BINARY, \"gz\" => BINARY, \"fla\" => BINARY, \"swf\" => BINARY, \"atf\" => BINARY, \"psd\" => BINARY,\n\t\t\t\"awd\" => BINARY, \"txt\" => TEXT, \"text\" => TEXT, \"xml\" => TEXT, \"java\" => TEXT, \"hx\" => TEXT, \"cpp\" => TEXT, \"c\" => TEXT, \"h\" => TEXT,\n\t\t\t\"cs\" => TEXT, \"js\" => TEXT, \"mm\" => TEXT, \"hxml\" => TEXT, \"html\" => TEXT, \"json\" => TEXT, \"css\" => TEXT, \"gpe\" => TEXT, \"pbxproj\" => TEXT,\n\t\t\t\"plist\" => TEXT, \"properties\" => TEXT, \"ini\" => TEXT, \"hxproj\" => TEXT, \"nmml\" => TEXT, \"lime\" => TEXT, \"svg\" => TEXT,\n\n\t\t];\n\t}\n\n\tpublic static function copyAsset(asset:Asset, destination:String, context:Dynamic = null)\n\t{\n\t\tif (asset.sourcePath != \"\")\n\t\t{\n\t\t\tSystem.copyFile(asset.sourcePath, destination, context, asset.type == TEMPLATE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (asset.encoding == AssetEncoding.BASE64)\n\t\t\t\t{\n\t\t\t\t\tFile.saveBytes(destination, Base64.decode(asset.data));\n\t\t\t\t}\n\t\t\t\telse if ((asset.data is HaxeBytes))\n\t\t\t\t{\n\t\t\t\t\tFile.saveBytes(destination, cast asset.data);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tFile.saveContent(destination, Std.string(asset.data));\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tLog.error(\"Cannot write to file \\\"\" + destination + \"\\\"\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function copyAssetIfNewer(asset:Asset, destination:String)\n\t{\n\t\tif (asset.sourcePath != \"\")\n\t\t{\n\t\t\tif (System.isNewer(asset.sourcePath, destination))\n\t\t\t{\n\t\t\t\tSystem.copyFile(asset.sourcePath, destination, null, asset.type == TEMPLATE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.mkdir(Path.directory(destination));\n\n\t\t\tLog.info(\"\", \" - \\x1b[1mWriting file:\\x1b[0m \" + destination);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (asset.encoding == AssetEncoding.BASE64)\n\t\t\t\t{\n\t\t\t\t\tFile.saveBytes(destination, Base64.decode(asset.data));\n\t\t\t\t}\n\t\t\t\telse if ((asset.data is HaxeBytes))\n\t\t\t\t{\n\t\t\t\t\tFile.saveBytes(destination, cast asset.data);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tFile.saveContent(destination, Std.string(asset.data));\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tLog.error(\"Cannot write to file \\\"\" + destination + \"\\\"\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function createManifest(project:HXProject, library:String = null, targetPath:String = null):AssetManifest\n\t{\n\t\tvar manifest = new AssetManifest();\n\t\tvar pathGroups = new Map<String, Array<String>>();\n\n\t\tvar libraries = new Map<String, Library>();\n\t\tif (library == null) library = DEFAULT_LIBRARY_NAME;\n\n\t\tfor (lib in project.libraries)\n\t\t{\n\t\t\tlibraries[lib.name] = lib;\n\t\t}\n\n\t\tvar assetData:Dynamic;\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tassetData = getAssetData(project, pathGroups, libraries, library, asset);\n\n\t\t\tif (assetData != null)\n\t\t\t{\n\t\t\t\tmanifest.assets.push(assetData);\n\t\t\t}\n\t\t}\n\n\t\tif (targetPath != null)\n\t\t{\n\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\tLog.info(\"\", \" - \\x1b[1mWriting asset manifest:\\x1b[0m \" + targetPath);\n\t\t\tFile.saveContent(targetPath, manifest.serialize());\n\t\t}\n\n\t\treturn manifest;\n\t}\n\n\tpublic static function createManifests(project:HXProject, targetDirectory:String = null):Array<AssetManifest>\n\t{\n\t\tvar libraryNames = new Map<String, Bool>();\n\t\tvar hasManifest = new Map<String, Bool>();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.library != null && !libraryNames.exists(asset.library))\n\t\t\t{\n\t\t\t\tlibraryNames[asset.library] = true;\n\t\t\t}\n\n\t\t\tif (asset.type == MANIFEST)\n\t\t\t{\n\t\t\t\thasManifest.set(asset.library != null ? asset.library : DEFAULT_LIBRARY_NAME, true);\n\t\t\t}\n\t\t}\n\n\t\tvar manifest:AssetManifest = null;\n\t\tvar manifests:Array<AssetManifest> = [];\n\n\t\tif (!hasManifest.exists(DEFAULT_LIBRARY_NAME))\n\t\t{\n\t\t\tmanifest = createManifest(project);\n\t\t\tmanifest.name = DEFAULT_LIBRARY_NAME;\n\t\t\tmanifests.push(manifest);\n\t\t}\n\n\t\tfor (library in libraryNames.keys())\n\t\t{\n\t\t\tif (!hasManifest.exists(library))\n\t\t\t{\n\t\t\t\tmanifest = createManifest(project, library);\n\t\t\t\tmanifest.name = library;\n\t\t\t\tmanifests.push(manifest);\n\t\t\t}\n\t\t}\n\n\t\tif (targetDirectory != null)\n\t\t{\n\t\t\tSystem.mkdir(targetDirectory);\n\t\t\tvar targetPath:String;\n\n\t\t\tfor (manifest in manifests)\n\t\t\t{\n\t\t\t\ttargetPath = Path.combine(targetDirectory, manifest.name + \".json\");\n\t\t\t\tLog.info(\"\", \" - \\x1b[1mWriting asset manifest:\\x1b[0m \" + targetPath);\n\t\t\t\tFile.saveContent(targetPath, manifest.serialize());\n\t\t\t}\n\t\t}\n\n\t\treturn manifests;\n\t}\n\n\tprivate static function getAssetData(project:HXProject, pathGroups:Map<String, Array<String>>, libraries:Map<String, Library>, library:String,\n\t\t\tasset:Asset):Dynamic\n\t{\n\t\tif ((asset.library != null && asset.library != library) || asset.type == TEMPLATE) return null;\n\t\tif (asset.library == null && library != DEFAULT_LIBRARY_NAME) return null;\n\n\t\tvar size = 100;\n\n\t\tif (FileSystem.exists(asset.sourcePath))\n\t\t{\n\t\t\tsize = FileSystem.stat(asset.sourcePath).size;\n\t\t}\n\n\t\tvar assetData:Dynamic =\n\t\t\t{\n\t\t\t\tid: asset.id,\n\t\t\t\tsize: size,\n\t\t\t\ttype: Std.string(asset.type)\n\t\t\t};\n\n\t\tif (project.target == FLASH || project.target == AIR)\n\t\t{\n\t\t\tif (asset.embed != false || asset.type == FONT)\n\t\t\t{\n\t\t\t\tassetData.className = \"__ASSET__\" + asset.flatName;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tassetData.path = asset.resourceName;\n\t\t\t}\n\n\t\t\tif (asset.embed == false && asset.library != null && libraries.exists(asset.library))\n\t\t\t{\n\t\t\t\tassetData.preload = libraries[asset.library].preload;\n\t\t\t}\n\t\t}\n\t\telse if (project.target == HTML5)\n\t\t{\n\t\t\tif (asset.type == FONT)\n\t\t\t{\n\t\t\t\tassetData.className = \"__ASSET__\" + asset.flatName;\n\t\t\t\tassetData.preload = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tassetData.path = asset.resourceName;\n\n\t\t\t\tif (asset.embed != false || (asset.library != null && libraries.exists(asset.library) && libraries[asset.library].preload))\n\t\t\t\t{\n\t\t\t\t\tassetData.preload = true;\n\t\t\t\t}\n\n\t\t\t\tif (asset.type == MUSIC || asset.type == SOUND)\n\t\t\t\t{\n\t\t\t\t\tvar soundName = Path.withoutExtension(assetData.path);\n\n\t\t\t\t\tif (!pathGroups.exists(soundName))\n\t\t\t\t\t{\n\t\t\t\t\t\tpathGroups.set(soundName, [assetData.path]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpathGroups[soundName].push(assetData.path);\n\t\t\t\t\t\tReflect.deleteField(assetData, \"preload\");\n\t\t\t\t\t}\n\n\t\t\t\t\tReflect.deleteField(assetData, \"path\");\n\t\t\t\t\tassetData.pathGroup = pathGroups[soundName];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (project.target == WEB_ASSEMBLY\n\t\t\t\t&& (asset.embed != false\n\t\t\t\t\t|| (asset.library != null && libraries.exists(asset.library) && libraries[asset.library].preload)))\n\t\t\t{\n\t\t\t\tassetData.preload = true;\n\t\t\t}\n\n\t\t\tif (asset.embed == true || asset.type == FONT)\n\t\t\t{\n\t\t\t\tassetData.className = \"__ASSET__\" + asset.flatName;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tassetData.path = asset.resourceName;\n\t\t\t}\n\t\t}\n\n\t\treturn assetData;\n\t}\n\n\tprivate static function getPackedAssetData(project:HXProject, output:FileOutput, pathGroups:Map<String, Array<String>>, libraries:Map<String, Library>,\n\t\t\tlibrary:Library, asset:Asset):Dynamic\n\t{\n\t\tif (project.target == HTML5 && (asset.type == MUSIC || asset.type == SOUND || asset.type == FONT))\n\t\t{\n\t\t\treturn getAssetData(project, pathGroups, libraries, library.name, asset);\n\t\t}\n\n\t\tif (asset.type == TEMPLATE) return null;\n\t\tif (asset.library == library.name || (asset.library == null && library.name == DEFAULT_LIBRARY_NAME))\n\t\t{\n\t\t\tif (output.tell() == 0)\n\t\t\t{\n\t\t\t\t// write some dummy text at the start of the packed asset file just to prevent\n\t\t\t\t// the file from beginning with a packed file header.\n\t\t\t\toutput.writeString(\"lime-asset-pack\");\n\t\t\t}\n\n\t\t\tvar assetData:Dynamic =\n\t\t\t\t{\n\t\t\t\t\tid: asset.id,\n\t\t\t\t\tsize: 0,\n\t\t\t\t\ttype: Std.string(asset.type),\n\t\t\t\t\tposition: output.tell()\n\t\t\t\t};\n\n\t\t\tif (project.target == HTML5 && asset.type == FONT)\n\t\t\t{\n\t\t\t\tassetData.className = \"__ASSET__\" + asset.flatName;\n\t\t\t\tassetData.preload = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch (library.type)\n\t\t\t\t{\n\t\t\t\t\tcase \"deflate\", \"zip\":\n\t\t\t\t\t\tif (asset.data != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar bytes:Bytes = asset.data;\n\t\t\t\t\t\t\tbytes = bytes.compress(DEFLATE);\n\t\t\t\t\t\t\toutput.writeBytes(bytes, 0, bytes.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (asset.sourcePath != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar tempBytes:Bytes = File.getBytes(asset.sourcePath);\n\t\t\t\t\t\t\ttempBytes = tempBytes.compress(DEFLATE);\n\t\t\t\t\t\t\toutput.writeBytes(tempBytes, 0, tempBytes.length);\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"gzip\":\n\t\t\t\t\t\tif (asset.data != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar bytes:Bytes = asset.data;\n\t\t\t\t\t\t\tbytes = bytes.compress(GZIP);\n\t\t\t\t\t\t\toutput.writeBytes(bytes, 0, asset.data.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (asset.sourcePath != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar tempBytes:Bytes = File.getBytes(asset.sourcePath);\n\t\t\t\t\t\t\ttempBytes = tempBytes.compress(GZIP);\n\t\t\t\t\t\t\toutput.writeBytes(tempBytes, 0, tempBytes.length);\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (asset.data != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toutput.writeBytes(asset.data, 0, asset.data.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (asset.sourcePath != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar input = File.read(asset.sourcePath, true);\n\t\t\t\t\t\t\toutput.writeInput(input);\n\t\t\t\t\t\t\tinput.close();\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (project.target == HTML5 && asset.type == IMAGE)\n\t\t\t{\n\t\t\t\tassetData.preload = true;\n\t\t\t}\n\n\t\t\tvar position = output.tell();\n\t\t\tassetData.length = position - assetData.position;\n\n\t\t\tasset.library = library.name;\n\n\t\t\t// asset.sourcePath = \"\";\n\n\t\t\tif (project.target != HTML5 || asset.type != FONT)\n\t\t\t{\n\t\t\t\tasset.targetPath = null;\n\t\t\t}\n\n\t\t\tasset.data = null;\n\n\t\t\treturn assetData;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate static function isPackedLibrary(project:HXProject, library:Library)\n\t{\n\t\tif (project.target == FLASH && library.embed != false) return false;\n\n\t\treturn switch (library.type)\n\t\t{\n\t\t\tcase \"pak\", \"pack\", \"gzip\", \"zip\", \"deflate\": true;\n\t\t\tdefault: false;\n\t\t}\n\t}\n\n\tpublic static function processLibraries(project:HXProject, targetDirectory:String = null):Void\n\t{\n\t\tvar hasManifest = new Map<String, Bool>();\n\t\tvar libraryMap = new Map<String, Bool>();\n\n\t\tfor (library in project.libraries)\n\t\t{\n\t\t\tlibraryMap[library.name] = true;\n\t\t}\n\n\t\tvar library:Library;\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.library != null && asset.library != DEFAULT_LIBRARY_NAME && !libraryMap.exists(asset.library))\n\t\t\t{\n\t\t\t\tlibrary = new Library(null, asset.library);\n\t\t\t\tproject.libraries.push(library);\n\n\t\t\t\tlibraryMap[asset.library] = true;\n\t\t\t}\n\n\t\t\tif (asset.type == MANIFEST)\n\t\t\t{\n\t\t\t\thasManifest.set(asset.library != null ? asset.library : DEFAULT_LIBRARY_NAME, true);\n\t\t\t}\n\t\t}\n\n\t\tif (project.assets.length > 0 && !libraryMap.exists(DEFAULT_LIBRARY_NAME))\n\t\t{\n\t\t\tlibrary = new Library(null, DEFAULT_LIBRARY_NAME);\n\t\t\tproject.libraries.push(library);\n\t\t}\n\n\t\tvar handlers = new Array<String>();\n\t\tvar hasPackedLibraries = false;\n\t\tvar type:String;\n\n\t\tfor (library in project.libraries)\n\t\t{\n\t\t\ttype = library.type;\n\n\t\t\tif (library.sourcePath != null || type != null)\n\t\t\t{\n\t\t\t\tif (type == null)\n\t\t\t\t{\n\t\t\t\t\ttype = Path.extension(library.sourcePath).toLowerCase();\n\t\t\t\t}\n\n\t\t\t\tif (project.libraryHandlers.exists(type))\n\t\t\t\t{\n\t\t\t\t\tvar handler = project.libraryHandlers.get(type);\n\n\t\t\t\t\thandlers.remove(handler);\n\t\t\t\t\thandlers.push(handler);\n\n\t\t\t\t\tlibrary.type = type;\n\t\t\t\t}\n\t\t\t\telse if (isPackedLibrary(project, library))\n\t\t\t\t{\n\t\t\t\t\thasPackedLibraries = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (handlers.length > 0)\n\t\t{\n\t\t\tvar projectData = Serializer.run(project);\n\t\t\tvar temporaryFile = System.getTemporaryFile();\n\n\t\t\tFile.saveContent(temporaryFile, projectData);\n\n\t\t\tfor (handler in handlers)\n\t\t\t{\n\t\t\t\tvar outputFile = System.getTemporaryFile();\n\t\t\t\tvar args = [\"run\", handler, \"process\", temporaryFile, outputFile];\n\n\t\t\t\tif (Log.verbose)\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-verbose\");\n\t\t\t\t}\n\n\t\t\t\tif (targetDirectory != null)\n\t\t\t\t{\n\t\t\t\t\targs.push(\"--targetDirectory=\" + Path.tryFullPath(targetDirectory));\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHaxelib.runCommand(\"\", args, false);\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\tvar types:Array<String> = [];\n\n\t\t\t\t\tfor (library in project.libraries)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (library.type != null\n\t\t\t\t\t\t\t&& project.libraryHandlers.exists(library.type)\n\t\t\t\t\t\t\t&& project.libraryHandlers.get(library.type) == handler)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttypes.push(library.type);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tLog.error(\"Could not process asset libraries (\" + types.join(\", \") + \")\");\n\t\t\t\t}\n\n\t\t\t\tif (FileSystem.exists(outputFile))\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvar output = File.getContent(outputFile);\n\t\t\t\t\t\tvar data:HXProject = Unserializer.run(output);\n\t\t\t\t\t\tproject.merge(data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(e);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tFileSystem.deleteFile(outputFile);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFileSystem.deleteFile(temporaryFile);\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\tif (hasPackedLibraries)\n\t\t{\n\t\t\tprocessPackedLibraries(project, targetDirectory);\n\t\t}\n\n\t\tif (project.assets.length == 0)\n\t\t{\n\t\t\tproject.haxedefs.set(\"disable_preloader_assets\", \"1\");\n\t\t}\n\n\t\tvar manifest:AssetManifest;\n\t\tvar embed:Bool;\n\t\tvar asset:Asset;\n\n\t\tfor (library in project.libraries)\n\t\t{\n\t\t\tif (library.type == null\n\t\t\t\t|| (project.target == FLASH\n\t\t\t\t\t&& library.embed != false\n\t\t\t\t\t&& [\"pak\", \"pack\", \"gzip\", \"zip\", \"deflate\"].indexOf(library.type) > -1))\n\t\t\t{\n\t\t\t\tif (library.name == DEFAULT_LIBRARY_NAME)\n\t\t\t\t{\n\t\t\t\t\tlibrary.preload = true;\n\t\t\t\t}\n\n\t\t\t\tif (!hasManifest.exists(library.name))\n\t\t\t\t{\n\t\t\t\t\tmanifest = createManifest(project, library.name != DEFAULT_LIBRARY_NAME ? library.name : null);\n\t\t\t\t\tembed = false;\n\n\t\t\t\t\tif (manifest.assets.length == 0 || (project.target == HTML5 && library.name == DEFAULT_LIBRARY_NAME))\n\t\t\t\t\t{\n\t\t\t\t\t\tembed = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// TODO: Make this assumption elsewhere?\n\n\t\t\t\t\t\tvar allEmbedded = true;\n\n\t\t\t\t\t\tfor (childAsset in manifest.assets)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!Reflect.hasField(childAsset, \"className\") || childAsset.className == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tallEmbedded = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (allEmbedded) embed = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tasset = new Asset(\"\", \"manifest/\" + library.name + \".json\", AssetType.MANIFEST);\n\n\t\t\t\t\tif (embed)\n\t\t\t\t\t{\n\t\t\t\t\t\tasset.embed = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tasset.embed = false;\n\t\t\t\t\t\tmanifest.rootPath = \"../\";\n\t\t\t\t\t}\n\n\t\t\t\t\tasset.library = library.name;\n\t\t\t\t\tasset.data = manifest.serialize();\n\n\t\t\t\t\tproject.assets.push(asset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function processPackedLibraries(project:HXProject, targetDirectory:String = null):Void\n\t{\n\t\tvar type:String;\n\t\tvar cacheAvailable:Bool;\n\t\tvar cacheDirectory:String;\n\t\tvar filename:String;\n\t\tvar output, manifest, position, assetData:Dynamic, input;\n\t\tvar embeddedLibrary = false;\n\n\t\tvar pathGroups = new Map<String, Array<String>>();\n\t\tvar libraries = new Map<String, Library>();\n\t\tfor (lib in project.libraries)\n\t\t{\n\t\t\tlibraries[lib.name] = lib;\n\t\t}\n\n\t\tfor (library in project.libraries)\n\t\t{\n\t\t\ttype = library.type;\n\n\t\t\tif (isPackedLibrary(project, library))\n\t\t\t{\n\t\t\t\t// TODO\n\t\t\t\t#if !nodejs\n\t\t\t\tif (type == \"zip\") type = \"deflate\";\n\n\t\t\t\t// TODO: Support library.embed=true by embedding all the assets instead of packing\n\n\t\t\t\tcacheAvailable = false;\n\t\t\t\tcacheDirectory = null;\n\n\t\t\t\tif (targetDirectory != null)\n\t\t\t\t{\n\t\t\t\t\tmanifest = new AssetManifest();\n\n\t\t\t\t\tcacheDirectory = targetDirectory + \"/obj/libraries/\";\n\t\t\t\t\tfilename = library.name + \".pak\";\n\n\t\t\t\t\t// TODO: Support caching\n\n\t\t\t\t\tSystem.mkdir(cacheDirectory);\n\n\t\t\t\t\tif (FileSystem.exists(cacheDirectory + filename))\n\t\t\t\t\t{\n\t\t\t\t\t\tFileSystem.deleteFile(cacheDirectory + filename);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput = File.write(cacheDirectory + filename, true);\n\t\t\t\t\tposition = 0;\n\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvar assetData:Dynamic;\n\n\t\t\t\t\t\tfor (asset in project.assets)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tassetData = getPackedAssetData(project, output, pathGroups, libraries, library, asset);\n\n\t\t\t\t\t\t\tif (assetData != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmanifest.assets.push(assetData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t{\n\t\t\t\t\t\toutput.close();\n\t\t\t\t\t\tFileSystem.deleteFile(cacheDirectory + filename);\n\n\t\t\t\t\t\t#if neko\n\t\t\t\t\t\tneko.Lib.rethrow(e);\n\t\t\t\t\t\t#end\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.close();\n\n\t\t\t\t\tvar libraryAsset = new Asset(cacheDirectory + filename, \"lib/\" + filename, AssetType.BINARY);\n\t\t\t\t\tlibraryAsset.library = library.name;\n\t\t\t\t\tproject.assets.push(libraryAsset);\n\n\t\t\t\t\tvar data = new Asset(\"\", \"manifest/\" + library.name + \".json\", AssetType.MANIFEST);\n\t\t\t\t\tdata.library = library.name;\n\t\t\t\t\tmanifest.libraryType = \"lime.utils.PackedAssetLibrary\";\n\t\t\t\t\tmanifest.libraryArgs = [\"lib/\" + filename, type];\n\t\t\t\t\t// manifest.rootPath = \"../\";\n\t\t\t\t\tdata.data = manifest.serialize();\n\t\t\t\t\tdata.embed = true;\n\n\t\t\t\t\tproject.assets.push(data);\n\t\t\t\t\tembeddedLibrary = true;\n\t\t\t\t}\n\n\t\t\t\tif (library.name == DEFAULT_LIBRARY_NAME)\n\t\t\t\t{\n\t\t\t\t\tlibrary.preload = true;\n\t\t\t\t}\n\t\t\t\t#end\n\t\t\t}\n\t\t}\n\n\t\tif (embeddedLibrary)\n\t\t{\n\t\t\tproject.haxeflags.push(\"lime.utils.PackedAssetLibrary\");\n\t\t}\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/tools/AssetType.hx",
    "content": "package lime.tools;\n\nenum AssetType\n{\n\tBINARY;\n\tBUNDLE;\n\tFONT;\n\tIMAGE;\n\tMANIFEST;\n\tMOVIE_CLIP;\n\tMUSIC;\n\tSOUND;\n\tTEMPLATE;\n\tTEXT;\n}\n"
  },
  {
    "path": "src/lime/tools/CLICommand.hx",
    "content": "package lime.tools;\n\n// \"Command-Line Interface Command\"\nclass CLICommand\n{\n\tpublic var command:String;\n\tpublic var args:Array<String>;\n\n\tpublic function new(command:String, args:Array<String> = null)\n\t{\n\t\tthis.command = command;\n\t\tthis.args = args != null ? args : new Array<String>();\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/CLIHelper.hx",
    "content": "package lime.tools;\n\nimport haxe.io.Eof;\nimport hxp.*;\n\nclass CLIHelper\n{\n\tpublic static function ask(question:String, options:Array<String> = null):Answer\n\t{\n\t\tif (options == null)\n\t\t{\n\t\t\toptions = [\"y\", \"n\", \"a\"];\n\t\t}\n\n\t\twhile (true)\n\t\t{\n\t\t\tLog.print(Log.accentColor + question + \"\\x1b[0m \\x1b[3;37m[\" + options.join(\"/\") + \"]\\x1b[0m ? \");\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tswitch (readLine())\n\t\t\t\t{\n\t\t\t\t\tcase \"n\":\n\t\t\t\t\t\treturn NO;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\treturn YES;\n\t\t\t\t\tcase \"a\":\n\t\t\t\t\t\treturn ALWAYS;\n\t\t\t\t\tcase _ => x if (options.indexOf(x) > -1):\n\t\t\t\t\t\treturn CUSTOM(x);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tSys.exit(0);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static inline function getChar():Int\n\t{\n\t\treturn Sys.getChar(false);\n\t}\n\n\tpublic static function param(name:String, passwd:Bool = false):String\n\t{\n\t\tLog.print(name + \": \");\n\n\t\tif (passwd)\n\t\t{\n\t\t\tvar s = new StringBuf();\n\t\t\tvar c:Int;\n\t\t\twhile ((c = getChar()) != 13)\n\t\t\t\ts.addChar(c);\n\n\t\t\tLog.print(\"\");\n\t\t\tLog.println(\"\");\n\n\t\t\treturn s.toString();\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\treturn readLine();\n\t\t}\n\t\tcatch (e:Eof)\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tpublic static function progress(prefix:String, now:Int, total:Int):Void\n\t{\n\t\tvar percent = Math.floor((now / total) * 100);\n\n\t\tLog.print('\\r$prefix $now/$total ($percent%)');\n\t}\n\n\tpublic static inline function readLine():String\n\t{\n\t\treturn Sys.stdin().readLine();\n\t}\n}\n\nenum Answer\n{\n\tYES;\n\tNO;\n\tALWAYS;\n\tCUSTOM(answer:String);\n}\n"
  },
  {
    "path": "src/lime/tools/CPPHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass CPPHelper\n{\n\tprivate static var rebuiltLibraries = new Map<String, Bool>();\n\tprivate static var rebuiltPaths = new Map<String, Bool>();\n\n\tpublic static function compile(project:HXProject, path:String, flags:Array<String> = null, buildFile:String = \"Build.xml\"):Void\n\t{\n\t\tif (project.config.getBool(\"cpp.requireBuild\", true))\n\t\t{\n\t\t\tvar args = [\"run\", project.config.getString(\"cpp.buildLibrary\", \"hxcpp\"), buildFile];\n\t\t\tvar foundOptions = false;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar options = Path.combine(path, \"Options.txt\");\n\n\t\t\t\tif (FileSystem.exists(options))\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-options\");\n\t\t\t\t\targs.push(Path.tryFullPath(options));\n\n\t\t\t\t\t// var list;\n\t\t\t\t\t// var input = File.read (options, false);\n\t\t\t\t\t// var text = input.readLine ();\n\n\t\t\t\t\t// if (StringTools.startsWith (text, \" -D\")) {\n\n\t\t\t\t\t// \tlist = text.split (\" \");\n\n\t\t\t\t\t// } else {\n\n\t\t\t\t\t// \tlist = [ \"-D\" + StringTools.trim (text) ];\n\n\t\t\t\t\t// \twhile (!input.eof ()) {\n\n\t\t\t\t\t// \t\tlist.push (\"-D\" + StringTools.trim (input.readLine ()));\n\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \tlist.pop ();\n\n\t\t\t\t\t// }\n\n\t\t\t\t\t// for (option in list) {\n\n\t\t\t\t\t// \tif (option != \"\" && !StringTools.startsWith (option, \"-Dno_compilation\") && !StringTools.startsWith (option, \"-Dno-compilation\")) {\n\n\t\t\t\t\t// \t\targs.push (option);\n\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// }\n\n\t\t\t\t\tfoundOptions = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tif (flags != null)\n\t\t\t{\n\t\t\t\targs = args.concat(flags);\n\t\t\t}\n\n\t\t\tif (!foundOptions)\n\t\t\t{\n\t\t\t\tfor (key in project.haxedefs.keys())\n\t\t\t\t{\n\t\t\t\t\tvar value = project.haxedefs.get(key);\n\n\t\t\t\t\tif (value == null || value == \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\targs.push(\"-D\" + key);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\targs.push(\"-D\" + key + \"=\" + value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (project.debug)\n\t\t\t{\n\t\t\t\targs.push(\"-debug\");\n\t\t\t}\n\n\t\t\tif (Log.verbose)\n\t\t\t{\n\t\t\t\targs.push(\"-verbose\");\n\t\t\t}\n\n\t\t\tif (!Log.enableColor)\n\t\t\t{\n\t\t\t\t// args.push (\"-nocolor\");\n\t\t\t\tSys.putEnv(\"HXCPP_NO_COLOR\", \"\");\n\t\t\t}\n\n\t\t\tif (System.hostPlatform == WINDOWS && !project.environment.exists(\"HXCPP_COMPILE_THREADS\"))\n\t\t\t{\n\t\t\t\tvar threads = 1;\n\n\t\t\t\tif (System.processorCores > 1)\n\t\t\t\t{\n\t\t\t\t\tthreads = System.processorCores - 1;\n\t\t\t\t}\n\n\t\t\t\tSys.putEnv(\"HXCPP_COMPILE_THREADS\", Std.string(threads));\n\t\t\t}\n\n\t\t\tSys.putEnv(\"HXCPP_EXIT_ON_ERROR\", \"\");\n\n\t\t\tvar code = Haxelib.runCommand(path, args);\n\n\t\t\tif (code != 0)\n\t\t\t{\n\t\t\t\tSys.exit(code);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function rebuild(project:HXProject, commands:Array<Array<String>>, path:String = null, buildFile:String = null):Void\n\t{\n\t\tvar buildRelease = (!project.targetFlags.exists(\"debug\"));\n\t\tvar buildDebug = (project.targetFlags.exists(\"debug\")\n\t\t\t|| (!project.targetFlags.exists(\"rebuild\")\n\t\t\t\t&& !project.targetFlags.exists(\"release\")\n\t\t\t\t&& !project.targetFlags.exists(\"final\")\n\t\t\t\t&& project.config.exists(\"project.rebuild.fulldebug\")));\n\n\t\tfor (haxelib in project.haxelibs)\n\t\t{\n\t\t\tif (!rebuiltLibraries.exists(haxelib.name))\n\t\t\t{\n\t\t\t\tvar defines = MapTools.copy(project.defines);\n\t\t\t\tdefines.set(\"rebuild\", \"1\");\n\n\t\t\t\tvar haxelibProject = HXProject.fromHaxelib(haxelib, defines);\n\n\t\t\t\tif (haxelibProject == null)\n\t\t\t\t{\n\t\t\t\t\thaxelibProject = new HXProject();\n\t\t\t\t\thaxelibProject.config.set(\"project.rebuild.path\", Path.combine(Haxelib.getPath(haxelib), \"project\"));\n\t\t\t\t}\n\n\t\t\t\tMapTools.copyKeys(project.targetFlags, haxelibProject.targetFlags);\n\n\t\t\t\trebuiltLibraries.set(haxelib.name, true);\n\n\t\t\t\tif (!rebuiltPaths.exists(haxelibProject.config.get(\"project.rebuild.path\")))\n\t\t\t\t{\n\t\t\t\t\trebuiltPaths.set(haxelibProject.config.get(\"project.rebuild.path\"), true);\n\t\t\t\t\trebuild(haxelibProject, commands);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"clean\"))\n\t\t{\n\t\t\tif (buildRelease)\n\t\t\t{\n\t\t\t\tfor (command in commands)\n\t\t\t\t{\n\t\t\t\t\trebuildSingle(project, command.concat([\"clean\"]), path, buildFile);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (buildDebug)\n\t\t\t{\n\t\t\t\tfor (command in commands)\n\t\t\t\t{\n\t\t\t\t\trebuildSingle(project, command.concat([\"-Ddebug\", \"-Dfulldebug\", \"clean\"]), path, buildFile);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (command in commands)\n\t\t{\n\t\t\tif (buildRelease)\n\t\t\t{\n\t\t\t\trebuildSingle(project, command, path, buildFile);\n\t\t\t}\n\n\t\t\tif (buildDebug)\n\t\t\t{\n\t\t\t\trebuildSingle(project, command.concat([\"-Ddebug\", \"-Dfulldebug\"]), path, buildFile);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function rebuildSingle(project:HXProject, flags:Array<String> = null, path:String = null, buildFile:String = null):Void\n\t{\n\t\tif (path == null)\n\t\t{\n\t\t\tpath = project.config.get(\"project.rebuild.path\");\n\t\t}\n\n\t\tif (path == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (!FileSystem.exists(path))\n\t\t{\n\t\t\tLog.warn(\"Skipping rebuild. Path not found: \" + path + \"\\nIf you are using a release from Haxelib, source code for native binaries may not be bundled. To rebuild, you may need to check out the full repository.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (buildFile == null && project.config.exists(\"project.rebuild.file\"))\n\t\t{\n\t\t\tbuildFile = project.config.get(\"project.rebuild.file\");\n\t\t}\n\n\t\tif (buildFile == null) buildFile = \"Build.xml\";\n\n\t\tif (!FileSystem.exists(Path.combine(path, buildFile)))\n\t\t{\n\t\t\tLog.warn(\"Skipping rebuild. Path not found: \" + path + \"\\nIf you are using a release from Haxelib, source code for native binaries may not be bundled. To rebuild, you may need to check out the full repository.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar args = [\"run\", project.config.getString(\"cpp.buildLibrary\", \"hxcpp\"), buildFile];\n\n\t\tif (flags != null)\n\t\t{\n\t\t\targs = args.concat(flags);\n\t\t}\n\n\t\tfor (key in project.haxedefs.keys())\n\t\t{\n\t\t\tvar value = project.haxedefs.get(key);\n\n\t\t\tif (value == null || value == \"\")\n\t\t\t{\n\t\t\t\targs.push(\"-D\" + key);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\targs.push(\"-D\" + key + \"=\" + value);\n\t\t\t}\n\t\t}\n\n\t\t/*if (project.debug) {\n\n\t\t\targs.push (\"-Ddebug\");\n\n\t\t}*/\n\n\t\tif (project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\targs.push(\"-Dstatic_link\");\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targs.push(\"-verbose\");\n\t\t}\n\n\t\tif (!Log.enableColor)\n\t\t{\n\t\t\t// args.push (\"-nocolor\");\n\t\t\tSys.putEnv(\"HXCPP_NO_COLOR\", \"\");\n\t\t}\n\n\t\tif (System.hostPlatform == WINDOWS && !project.environment.exists(\"HXCPP_COMPILE_THREADS\"))\n\t\t{\n\t\t\tvar threads = 1;\n\n\t\t\tif (System.processorCores > 1)\n\t\t\t{\n\t\t\t\tthreads = System.processorCores - 1;\n\t\t\t}\n\n\t\t\tSys.putEnv(\"HXCPP_COMPILE_THREADS\", Std.string(threads));\n\t\t}\n\n\t\tSys.putEnv(\"HXCPP_EXIT_ON_ERROR\", \"\");\n\n\t\tHaxelib.runCommand(path, args);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/CSHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.Architecture;\nimport lime.tools.HXProject;\nimport sys.io.File;\nimport sys.FileSystem;\n\nusing StringTools;\n\nclass CSHelper\n{\n\tpublic static var ndllSourceFiles:Array<String> = [\n\t\t\"cs.ndll.NDLLFunction\", \"cs.ndll.CFFICSLoader\", \"cs.ndll.CSAbstract\", \"cs.ndll.CSHandleContainer\", \"cs.ndll.CSHandleScope\", \"cs.ndll.CSPersistent\",\n\t\t\"cs.ndll.DelegateConverter\", \"cs.ndll.HandleUtils\", \"cs.ndll.NativeMethods\", \"cs.ndll.NDLLFunction\",\n\t];\n\n\tprivate static function getAndroidABIName(arch:Architecture):String\n\t{\n\t\tvar name = switch (arch)\n\t\t{\n\t\t\tcase ARMV5:\n\t\t\t\t\"armeabi\";\n\t\t\tcase ARMV7:\n\t\t\t\t\"armeabi-v7a\";\n\t\t\tcase ARM64:\n\t\t\t\t\"arm64-v8a\";\n\t\t\tcase X86:\n\t\t\t\t\"x86\";\n\t\t\tcase X64:\n\t\t\t\t\"x86_64\";\n\t\t\tcase _:\n\t\t\t\tnull;\n\t\t}\n\n\t\tif (name == null)\n\t\t{\n\t\t\tthrow \"Unsupported architecture:\" + arch;\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tpublic static function getAndroidABINames(architectures:Array<Architecture>):String\n\t{\n\t\tvar result = \"\";\n\t\tvar first = true;\n\n\t\tfor (arch in architectures)\n\t\t{\n\t\t\tif (first)\n\t\t\t{\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tresult += \",\";\n\t\t\t}\n\n\t\t\tvar archName = getAndroidABIName(arch);\n\t\t\tresult += archName;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic static function getAndroidNativeLibraryPaths(libPath:String, libraries:Array<NDLL>, architectures:Array<Architecture>):Array<String>\n\t{\n\t\tvar paths:Array<String> = [];\n\n\t\tfor (arch in architectures)\n\t\t{\n\t\t\tvar archName = getAndroidABIName(arch);\n\n\t\t\tfor (lib in libraries)\n\t\t\t{\n\t\t\t\tpaths.push(FileSystem.absolutePath(libPath + \"/\" + archName + \"/\" + \"lib\" + lib.name + \".so\").replace(\"/\", \"\\\\\"));\n\t\t\t}\n\t\t}\n\n\t\treturn paths;\n\t}\n\n\tpublic static function copySourceFiles(templatePaths:Array<String>, targetPath:String)\n\t{\n\t\tSystem.recursiveCopyTemplate(templatePaths, \"cs/src\", targetPath);\n\t}\n\n\tpublic static function addSourceFiles(txtPath:String, sourceFiles:Array<String>)\n\t{\n\t\tif (sourceFiles.length == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin modules\\n');\n\n\t\tfor (fileName in sourceFiles)\n\t\t{\n\t\t\tfile.writeString('M $fileName\\nC $fileName\\n');\n\t\t}\n\n\t\tfile.writeString('end modules\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function addAndroidResources(txtPath:String, resources:Array<String>)\n\t{\n\t\tif (resources.length == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin android_resources\\n');\n\n\t\tfor (resource in resources)\n\t\t{\n\t\t\tfile.writeString('$resource\\n');\n\t\t}\n\n\t\tfile.writeString('end android_resources\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function addAssemblies(txtPath:String, assemblies:Array<String>)\n\t{\n\t\tif (assemblies.length == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin libs\\n');\n\n\t\tfor (assembly in assemblies)\n\t\t{\n\t\t\tfile.writeString(assembly.replace(\"/\", \"\\\\\") + '\\n');\n\t\t}\n\n\t\tfile.writeString('end libs\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function addNativeLibraries(txtPath:String, libPath:String, libraries:Array<NDLL>, architectures:Array<Architecture>)\n\t{\n\t\tif (libraries.length == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin native_libs\\n');\n\n\t\tfor (arch in architectures)\n\t\t{\n\t\t\tvar archName = getAndroidABIName(arch);\n\n\t\t\tfor (lib in libraries)\n\t\t\t{\n\t\t\t\tfile.writeString(FileSystem.absolutePath(libPath + \"/\" + archName + \"/\" + \"lib\" + lib.name + \".so\").replace(\"/\", \"\\\\\") + '\\n');\n\t\t\t}\n\t\t}\n\n\t\tfile.writeString('end native_libs\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function addAndroidABIs(txtPath:String, architectures:Array<Architecture>)\n\t{\n\t\tif (architectures.length == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin android_abis\\n');\n\n\t\tfor (arch in architectures)\n\t\t{\n\t\t\tvar archName = getAndroidABIName(arch);\n\t\t\tfile.writeString(archName + '\\n');\n\t\t}\n\n\t\tfile.writeString('end android_abis\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function addAssets(txtPath:String, assets:Array<String>)\n\t{\n\t\tif (assets.length == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin android_assets\\n');\n\n\t\tfor (asset in assets)\n\t\t{\n\t\t\tfile.writeString(FileSystem.absolutePath(asset).replace(\"/\", \"\\\\\") + '\\n');\n\t\t}\n\n\t\tfile.writeString('end android_assets\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function addGUID(txtPath:String, guid:String)\n\t{\n\t\tvar file = File.append(txtPath, false);\n\t\tfile.writeString('\\nbegin guid\\n');\n\n\t\tfile.writeString('$guid\\n');\n\n\t\tfile.writeString('end guid\\n');\n\t\tfile.close();\n\t}\n\n\tpublic static function compile(project:HXProject, path:String, outPath:String, arch:String, platform:String, buildFile:String = \"hxcs_build.txt\",\n\t\t\tnoCompile:Bool = false)\n\t{\n\t\tvar args = [\n\t\t\t\"run\",\n\t\t\tproject.config.getString(\"cs.buildLibrary\", \"hxcs\"),\n\t\t\tbuildFile,\n\t\t\t\"--arch\",\n\t\t\tarch,\n\t\t\t\"--platform\",\n\t\t\tplatform,\n\t\t\t\"--out\",\n\t\t\toutPath,\n\t\t\t\"--unsafe\"\n\t\t];\n\t\tif (noCompile) args.push(\"--no-compile\");\n\t\tvar code = Haxelib.runCommand(path, args);\n\n\t\tif (code != 0)\n\t\t{\n\t\t\tSys.exit(code);\n\t\t}\n\t}\n\n\tpublic static function buildGradleProj(path:String)\n\t{\n\t\tvar gradlePath = FileSystem.absolutePath(path + \"/\" + \"gradlew\");\n\t\tSystem.runCommand(path, gradlePath, [\"build\", \"assembleRelease\"]);\n\t}\n\n\tinline public static function buildSln(path:String, slnPath:String, task:String = null)\n\t{\n\t\tbuildCSProj(path, slnPath, task);\n\t}\n\n\tpublic static function buildCSProj(path:String, csprojPath:String, task:String = null)\n\t{\n\t\tvar msBuildPath = \"C:/Program Files (x86)/MSBuild/14.0/Bin/MSBuild.exe\";\n\t\tvar absCSProjPath = FileSystem.absolutePath(csprojPath);\n\t\tvar args = [absCSProjPath, \"/p:Configuration=Release\"];\n\n\t\tif (task != null)\n\t\t{\n\t\t\targs.push(\"/t:\" + task);\n\t\t}\n\n\t\tSystem.runCommand(path, msBuildPath, args);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/Command.hx",
    "content": "package lime.tools;\n\nenum Command\n{\n\tBUILD;\n\tCLEAN;\n\tCONFIG;\n\tDEPLOY;\n\tDISPLAY;\n\tUPDATE;\n\tRUN;\n\tTEST;\n\tTRACE;\n\tPUBLISH;\n\tREBUILD;\n}\n"
  },
  {
    "path": "src/lime/tools/CommandHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.CLICommand;\nimport lime.tools.Platform;\n\nclass CommandHelper\n{\n\tpublic static function executeCommands(commands:Array<CLICommand>):Void\n\t{\n\t\tfor (c in commands)\n\t\t{\n\t\t\tSys.command(c.command, c.args);\n\t\t}\n\t}\n\n\tpublic static function openFile(file:String):CLICommand\n\t{\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\treturn new CLICommand(\"start\", [file]);\n\t\t}\n\t\telse if (System.hostPlatform == MAC)\n\t\t{\n\t\t\treturn new CLICommand(\"/usr/bin/open\", [file]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn new CLICommand(\"/usr/bin/xdg-open\", [file]);\n\t\t}\n\t}\n\n\tpublic static function interpretHaxe(mainFile:String):CLICommand\n\t{\n\t\treturn new CLICommand(\"haxe\", [\"-main\", mainFile, \"--interp\"]);\n\t}\n\n\tpublic static function fromSingleString(command:String):CLICommand\n\t{\n\t\tvar args:Array<String> = command.split(\" \");\n\t\tcommand = args.shift();\n\t\treturn new CLICommand(command, args);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ConfigData.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\n#if (haxe_ver >= 4)\nimport haxe.xml.Access;\n#else\nimport haxe.xml.Fast as Access;\n#end\n\nabstract ConfigData(Dynamic) to Dynamic from Dynamic\n{\n\tprivate static inline var ARRAY:String = \"___array\";\n\n\tpublic function new()\n\t{\n\t\tthis = {};\n\t}\n\n\tprivate function addBucket(bucket:String, parent:Dynamic):Dynamic\n\t{\n\t\tif (!Reflect.hasField(parent, bucket))\n\t\t{\n\t\t\tlog(\"config data > adding a bucketType \" + bucket);\n\t\t\tReflect.setField(parent, bucket, {});\n\t\t}\n\n\t\treturn Reflect.field(parent, bucket);\n\t}\n\n\tpublic function clone():ConfigData\n\t{\n\t\treturn ObjectTools.deepCopy(this);\n\t}\n\n\tpublic function exists(id:String):Bool\n\t{\n\t\treturn get(id) != null;\n\t}\n\n\tpublic function get(id:String):ConfigData\n\t{\n\t\tvar tree = id.split(\".\");\n\t\tvar current = this;\n\n\t\tfor (leaf in tree)\n\t\t{\n\t\t\tcurrent = Reflect.field(current, leaf);\n\n\t\t\tif (current == null)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t}\n\n\tpublic function getArray(id:String, defaultValue:Array<Dynamic> = null):Array<Dynamic>\n\t{\n\t\tvar tree = id.split(\".\");\n\t\tvar array:Array<Dynamic> = null;\n\n\t\tvar current = this;\n\t\tvar field = tree.pop();\n\n\t\tfor (leaf in tree)\n\t\t{\n\t\t\tcurrent = Reflect.field(current, leaf);\n\n\t\t\tif (current == null)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (current != null)\n\t\t{\n\t\t\tarray = Reflect.field(current, field + ARRAY);\n\n\t\t\tif (array == null && Reflect.hasField(current, field))\n\t\t\t{\n\t\t\t\tarray = [Reflect.field(current, field)];\n\t\t\t}\n\t\t}\n\n\t\tif (array != null)\n\t\t{\n\t\t\treturn array;\n\t\t}\n\n\t\tif (defaultValue == null)\n\t\t{\n\t\t\tdefaultValue = [];\n\t\t}\n\n\t\treturn defaultValue;\n\t}\n\n\tpublic function getArrayString(id:String, childField:String = null, defaultValue:Array<String> = null):Array<String>\n\t{\n\t\tvar array = getArray(id);\n\n\t\tif (array.length > 0)\n\t\t{\n\t\t\tvar value:Array<String> = [];\n\n\t\t\tif (childField == null)\n\t\t\t{\n\t\t\t\tfor (item in array)\n\t\t\t\t{\n\t\t\t\t\tvalue.push(Std.string(item));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (item in array)\n\t\t\t\t{\n\t\t\t\t\tvalue.push(Std.string(Reflect.field(item, childField)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\n\t\tif (defaultValue == null)\n\t\t{\n\t\t\tdefaultValue = [];\n\t\t}\n\n\t\treturn defaultValue;\n\t}\n\n\tpublic function getBool(id:String, defaultValue:Bool = true):Bool\n\t{\n\t\tif (exists(id))\n\t\t{\n\t\t\treturn get(id) == \"true\";\n\t\t}\n\n\t\treturn defaultValue;\n\t}\n\n\tpublic function getInt(id:String, defaultValue:Int = 0):Int\n\t{\n\t\tif (exists(id))\n\t\t{\n\t\t\treturn Std.parseInt(Std.string(get(id)));\n\t\t}\n\n\t\treturn defaultValue;\n\t}\n\n\tpublic function getFloat(id:String, defaultValue:Float = 0):Float\n\t{\n\t\tif (exists(id))\n\t\t{\n\t\t\treturn Std.parseFloat(Std.string(get(id)));\n\t\t}\n\n\t\treturn defaultValue;\n\t}\n\n\tpublic function getString(id:String, defaultValue:String = \"\"):String\n\t{\n\t\tif (exists(id))\n\t\t{\n\t\t\treturn Std.string(get(id));\n\t\t}\n\n\t\treturn defaultValue;\n\t}\n\n\tpublic function getKeyValueArray(id:String, defaultValues:Dynamic = null):Array<{ key:String, value:Dynamic }>\n\t{\n\t\tvar values = {};\n\t\tif (defaultValues != null)\n\t\t{\n\t\t\tObjectTools.copyFields(defaultValues, values);\n\t\t}\n\n\t\tvar data = get(id);\n\t\tfor (key in Reflect.fields(data))\n\t\t{\n\t\t\tif (!StringTools.endsWith (key, ARRAY))\n\t\t\t{\n\t\t\t\tReflect.setField(values, key, Reflect.field(data, key));\n\t\t\t}\n\t\t}\n\n\t\tvar pairs:Array<{ key:String, value:Dynamic }> = [];\n\t\tfor (key in Reflect.fields(values))\n\t\t{\n\t\t\tpairs.push({ key: key, value: Reflect.field(values, key) });\n\t\t}\n\n\t\treturn pairs;\n\t}\n\n\tprivate function log(v:Dynamic):Void\n\t{\n\t\tif (Log.verbose)\n\t\t{\n\t\t\t// Log.println (v);\n\t\t}\n\t}\n\n\tpublic function merge(other:ConfigData):Void\n\t{\n\t\tif (other != null)\n\t\t{\n\t\t\tmergeValues(other, this);\n\t\t}\n\t}\n\n\tprivate function mergeValues<T>(source:T, destination:T):Void\n\t{\n\t\tfor (field in Reflect.fields(source))\n\t\t{\n\t\t\tif (StringTools.endsWith(field, ARRAY))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar doCopy = true;\n\t\t\tvar exists = Reflect.hasField(destination, field);\n\t\t\tvar typeDest:String = null;\n\n\t\t\tif (exists)\n\t\t\t{\n\t\t\t\tvar valueSource = Reflect.field(source, field);\n\t\t\t\tvar valueDest = Reflect.field(destination, field);\n\t\t\t\tvar typeSource = Type.typeof(valueSource).getName();\n\t\t\t\ttypeDest = Type.typeof(valueDest).getName();\n\n\t\t\t\t// if trying to copy a non object over an object, don't\n\t\t\t\tif (typeSource != \"TObject\" && typeDest == \"TObject\")\n\t\t\t\t{\n\t\t\t\t\tdoCopy = false;\n\n\t\t\t\t\t// if (Log.verbose) {\n\t\t\t\t\t//\n\t\t\t\t\t// Log.println (field + \" not merged by preference\");\n\t\t\t\t\t//\n\t\t\t\t\t// }\n\t\t\t\t}\n\n\t\t\t\tif (doCopy && Reflect.field(source, field) != Reflect.field(destination, field) && typeSource != \"TObject\")\n\t\t\t\t{\n\t\t\t\t\tif (!Reflect.hasField(destination, field + ARRAY))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(destination, field + ARRAY, [ObjectTools.deepCopy(Reflect.field(destination, field))]);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar array:Array<Dynamic> = Reflect.field(destination, field + ARRAY);\n\n\t\t\t\t\tif (Reflect.hasField(source, field + ARRAY))\n\t\t\t\t\t{\n\t\t\t\t\t\tarray = array.concat(Reflect.field(source, field + ARRAY));\n\t\t\t\t\t\tReflect.setField(destination, field + ARRAY, array);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tarray.push(Reflect.field(source, field));\n\t\t\t\t\t}\n\n\t\t\t\t\tReflect.setField(destination, field, Reflect.field(source, field));\n\t\t\t\t\tdoCopy = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (doCopy)\n\t\t\t{\n\t\t\t\tif (typeDest == \"TObject\")\n\t\t\t\t{\n\t\t\t\t\tmergeValues(Reflect.field(source, field), Reflect.field(destination, field));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tReflect.setField(destination, field, Reflect.field(source, field));\n\n\t\t\t\t\tif (Reflect.hasField(source, field + ARRAY))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(destination, field + ARRAY, Reflect.field(source, field + ARRAY));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function parse(elem:Access, substitute:String->String = null):Void\n\t{\n\t\tvar bucket = this;\n\t\tvar bucketType = \"\";\n\n\t\tif (StringTools.startsWith(elem.name, \"config:\"))\n\t\t{\n\t\t\tvar items = elem.name.split(\":\");\n\t\t\tbucketType = items[1];\n\t\t}\n\n\t\tif (elem.has.type)\n\t\t{\n\t\t\tbucketType = elem.att.type;\n\t\t}\n\n\t\tif (bucketType != \"\")\n\t\t{\n\t\t\tbucket = addBucket(bucketType, this);\n\t\t}\n\n\t\tparseAttributes(elem, bucket, substitute);\n\t\tparseChildren(elem, bucket, 0, substitute);\n\n\t\tlog(\"> current config : \" + this);\n\t}\n\n\tprivate function parseAttributes(elem:Access, bucket:Dynamic, substitute:String->String = null):Void\n\t{\n\t\tfor (attrName in elem.x.attributes())\n\t\t{\n\t\t\tif (attrName != \"type\")\n\t\t\t{\n\t\t\t\tvar attrValue = elem.x.get(attrName);\n\t\t\t\tif (substitute != null) attrValue = substitute(attrValue);\n\t\t\t\tsetNode(bucket, attrName, attrValue);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseChildren(elem:Access, bucket:Dynamic, depth:Int = 0, substitute:String->String = null):Void\n\t{\n\t\tfor (child in elem.elements)\n\t\t{\n\t\t\tif (child.name != \"config\")\n\t\t\t{\n\t\t\t\t// log(\"config data > child : \" + child.name);\n\n\t\t\t\tvar d = depth + 1;\n\n\t\t\t\tvar hasChildren = child.x.elements().hasNext();\n\t\t\t\tvar hasAttributes = child.x.attributes().hasNext();\n\n\t\t\t\tif (Reflect.hasField(bucket, child.name))\n\t\t\t\t{\n\t\t\t\t\tvar array:Array<Dynamic> = Reflect.field(bucket, child.name + ARRAY);\n\t\t\t\t\tif (array == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tarray = [ObjectTools.deepCopy(Reflect.field(bucket, child.name))];\n\t\t\t\t\t\tReflect.setField(bucket, child.name + ARRAY, array);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar arrayBucket = {};\n\t\t\t\t\tarray.push(arrayBucket);\n\n\t\t\t\t\tif (hasAttributes)\n\t\t\t\t\t{\n\t\t\t\t\t\tparseAttributes(child, arrayBucket, substitute);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (hasChildren)\n\t\t\t\t\t{\n\t\t\t\t\t\tparseChildren(child, arrayBucket, d, substitute);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!hasChildren && !hasAttributes)\n\t\t\t\t\t{\n\t\t\t\t\t\tparseValue(child, arrayBucket, substitute);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!hasChildren && !hasAttributes)\n\t\t\t\t{\n\t\t\t\t\tparseValue(child, bucket, substitute);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar childBucket = addBucket(child.name, bucket);\n\n\t\t\t\t\tif (hasAttributes)\n\t\t\t\t\t{\n\t\t\t\t\t\tparseAttributes(child, childBucket, substitute);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (hasChildren)\n\t\t\t\t\t{\n\t\t\t\t\t\tparseChildren(child, childBucket, d, substitute);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseValue(elem:Access, bucket:Dynamic, substitute:String->String = null):Void\n\t{\n\t\tif (elem.innerHTML != \"\")\n\t\t{\n\t\t\tvar value = elem.innerHTML;\n\t\t\tif (substitute != null) value = substitute(value);\n\t\t\tsetNode(bucket, elem.name, value);\n\t\t}\n\t}\n\n\tpublic function push(id:String, value:Dynamic, ?unique:Bool = false):Void\n\t{\n\t\tvar tree = id.split(\".\");\n\t\tvar current = this;\n\t\tvar field = tree.pop();\n\n\t\tfor (leaf in tree)\n\t\t{\n\t\t\tif (!Reflect.hasField(current, leaf))\n\t\t\t{\n\t\t\t\tReflect.setField(current, leaf, {});\n\t\t\t\tcurrent = Reflect.field(current, leaf);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrent = Reflect.field(current, leaf);\n\n\t\t\t\tif (current == null)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Reflect.hasField(current, field))\n\t\t{\n\t\t\tvar array:Array<Dynamic> = Reflect.field(current, field + ARRAY);\n\n\t\t\tif (array == null)\n\t\t\t{\n\t\t\t\tarray = [ObjectTools.deepCopy(Reflect.field(current, field))];\n\t\t\t\tReflect.setField(current, field + ARRAY, array);\n\t\t\t}\n\n\t\t\tif (!unique || array.indexOf(value) == -1)\n\t\t\t{\n\t\t\t\tarray.push(value);\n\t\t\t}\n\t\t}\n\n\t\tReflect.setField(current, field, value);\n\t}\n\n\tpublic function set(id:String, value:Dynamic):Void\n\t{\n\t\tvar tree = id.split(\".\");\n\t\tvar current = this;\n\t\tvar field = tree.pop();\n\n\t\tfor (leaf in tree)\n\t\t{\n\t\t\tif (!Reflect.hasField(current, leaf))\n\t\t\t{\n\t\t\t\tReflect.setField(current, leaf, {});\n\t\t\t\tcurrent = Reflect.field(current, leaf);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrent = Reflect.field(current, leaf);\n\n\t\t\t\tif (current == null)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tReflect.setField(current, field, value);\n\t}\n\n\tprivate function setNode(bucket:Dynamic, node:String, value:Dynamic):Void\n\t{\n\t\t// log(\"config data > setting a node \" + node + \" to \" + value + \" on \" + bucket);\n\n\t\tvar doCopy = true;\n\t\tvar exists = Reflect.hasField(bucket, node);\n\n\t\tif (exists)\n\t\t{\n\t\t\tvar valueDest = Reflect.field(bucket, node);\n\t\t\tvar typeSource = Type.typeof(value).getName();\n\t\t\tvar typeDest = Type.typeof(valueDest).getName();\n\n\t\t\t// trace (node + \" / existed in dest as \" + typeDest + \" / \" + typeSource );\n\n\t\t\tif (typeSource != \"TObject\" && typeDest == \"TObject\")\n\t\t\t{\n\t\t\t\tdoCopy = false;\n\t\t\t\tlog(node + \" not merged by preference over object\");\n\t\t\t}\n\n\t\t\tif (doCopy)\n\t\t\t{\n\t\t\t\tif (typeSource != \"TObject\")\n\t\t\t\t{\n\t\t\t\t\tvar array:Array<Dynamic> = Reflect.field(bucket, node + ARRAY);\n\t\t\t\t\tif (array == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tarray = [ObjectTools.deepCopy(Reflect.field(bucket, node))];\n\t\t\t\t\t\tReflect.setField(bucket, node + ARRAY, array);\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push(value);\n\t\t\t\t}\n\n\t\t\t\tReflect.setField(bucket, node, value);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tReflect.setField(bucket, node, value);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ConfigHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\nimport lime.tools.ProjectXMLParser;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass ConfigHelper\n{\n\tprivate static var backedUpConfig:Bool = false;\n\tprivate static var configPath:String = null;\n\n\tpublic static function getConfig():HXProject\n\t{\n\t\tvar config = getConfigPath();\n\n\t\tif (FileSystem.exists(config))\n\t\t{\n\t\t\tLog.info(\"\", Log.accentColor + \"Reading Lime config: \" + config + Log.resetColor);\n\n\t\t\treturn new ProjectXMLParser(config);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.warn(\"\", \"Could not read Lime config: \" + config);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static function getConfigPath():String\n\t{\n\t\tif (configPath == null)\n\t\t{\n\t\t\tvar environment = Sys.environment();\n\n\t\t\tif (environment.exists(\"LIME_CONFIG\"))\n\t\t\t{\n\t\t\t\tconfigPath = environment.get(\"LIME_CONFIG\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar home = \"\";\n\n\t\t\t\tif (environment.exists(\"HOME\"))\n\t\t\t\t{\n\t\t\t\t\thome = environment.get(\"HOME\");\n\t\t\t\t}\n\t\t\t\telse if (environment.exists(\"USERPROFILE\"))\n\t\t\t\t{\n\t\t\t\t\thome = environment.get(\"USERPROFILE\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLog.warn(\"Lime config might be missing (Environment has no \\\"HOME\\\" variable)\");\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconfigPath = home + \"/.lime/config.xml\";\n\n\t\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t\t{\n\t\t\t\t\tconfigPath = configPath.split(\"/\").join(\"\\\\\");\n\t\t\t\t}\n\n\t\t\t\tif (!FileSystem.exists(configPath))\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(configPath));\n\n\t\t\t\t\tvar hxcppConfig:String = null;\n\n\t\t\t\t\tif (environment.exists(\"HXCPP_CONFIG\"))\n\t\t\t\t\t{\n\t\t\t\t\t\thxcppConfig = environment.get(\"HXCPP_CONFIG\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thxcppConfig = home + \"/.hxcpp_config.xml\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (FileSystem.exists(hxcppConfig))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar vars = new ProjectXMLParser(hxcppConfig);\n\n\t\t\t\t\t\tfor (key in vars.defines.keys())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (key != key.toUpperCase())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvars.defines.remove(key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twriteConfig(configPath, vars.defines);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twriteConfig(configPath, new Map());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tSys.putEnv(\"LIME_CONFIG\", configPath);\n\t\t\t}\n\t\t}\n\n\t\treturn configPath;\n\t}\n\n\tpublic static function getConfigValue(name:String):String\n\t{\n\t\tvar config = getConfig();\n\n\t\tif (config.defines.exists(name))\n\t\t{\n\t\t\treturn config.defines.get(name);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static function removeConfigValue(name:String):Void\n\t{\n\t\tvar path = getConfigPath();\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\tvar configText = File.getContent(path);\n\t\t\tvar lines = configText.split(\"\\n\");\n\n\t\t\tvar findSet = \"<set name=\\\"\" + name + \"\\\"\";\n\t\t\tvar findSetenv = \"<setenv name=\\\"\" + name + \"\\\"\";\n\t\t\tvar findDefine = \"<define name=\\\"\" + name + \"\\\"\";\n\t\t\tvar line, i = 0, index = 0, found = false;\n\n\t\t\twhile (i < lines.length)\n\t\t\t{\n\t\t\t\tline = lines[i];\n\n\t\t\t\tif ((index = line.indexOf(findSet)) > -1)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tlines.splice(i, 1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ((index = line.indexOf(findSetenv)) > -1)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tlines.splice(i, 1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ((index = line.indexOf(findDefine)) > -1)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tlines.splice(i, 1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tvar content = lines.join(\"\\n\");\n\t\t\tFile.saveContent(path, content);\n\n\t\t\tif (found)\n\t\t\t{\n\t\t\t\tLog.info(\"Removed define \\\"\" + name + \"\\\"\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.info(\"There is no define \\\"\" + name + \"\\\"\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.error(\"Cannot find \\\"\" + path + \"\\\"\");\n\t\t}\n\t}\n\n\tprivate static function stripQuotes(path:String):String\n\t{\n\t\tif (path != null)\n\t\t{\n\t\t\treturn path.split(\"\\\"\").join(\"\");\n\t\t}\n\n\t\treturn path;\n\t}\n\n\tpublic static function writeConfig(path:String, defines:Map<String, Dynamic>):Void\n\t{\n\t\tvar newContent = \"\";\n\t\tvar definesText = \"\";\n\t\tvar env = Sys.environment();\n\n\t\tfor (key in defines.keys())\n\t\t{\n\t\t\tif (key != \"LIME_CONFIG\" && key != \"LIME_CONFIG\" && (!env.exists(key) || env.get(key) != defines.get(key)))\n\t\t\t{\n\t\t\t\tdefinesText += \"\\t\\t<set name=\\\"\" + key + \"\\\" value=\\\"\" + stripQuotes(Std.string(defines.get(key))) + \"\\\" />\\n\";\n\t\t\t}\n\t\t}\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\tvar input = File.read(path, false);\n\t\t\tvar bytes = input.readAll();\n\t\t\tinput.close();\n\n\t\t\tif (!backedUpConfig)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar backup = File.write(path + \".bak\", false);\n\t\t\t\t\tbackup.writeBytes(bytes, 0, bytes.length);\n\t\t\t\t\tbackup.close();\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\n\t\t\t\tbackedUpConfig = true;\n\t\t\t}\n\n\t\t\tvar content = bytes.getString(0, bytes.length);\n\n\t\t\tvar startIndex = content.indexOf(\"<section id=\\\"defines\\\">\");\n\t\t\tvar endIndex = content.indexOf(\"</section>\", startIndex);\n\n\t\t\tnewContent += content.substr(0, startIndex) + \"<section id=\\\"defines\\\">\\n\\t\\t\\n\";\n\t\t\tnewContent += definesText;\n\t\t\tnewContent += \"\\t\\t\\n\\t\" + content.substr(endIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnewContent += \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\n\";\n\t\t\tnewContent += \"<config>\\n\\t\\n\";\n\t\t\tnewContent += \"\\t<section id=\\\"defines\\\">\\n\\t\\t\\n\";\n\t\t\tnewContent += definesText;\n\t\t\tnewContent += \"\\t\\t\\n\\t</section>\\n\\t\\n</config>\";\n\t\t}\n\n\t\tvar output = File.write(path, false);\n\t\toutput.writeString(newContent);\n\t\toutput.close();\n\n\t\tif (backedUpConfig)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFileSystem.deleteFile(path + \".bak\");\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t}\n\n\tpublic static function writeConfigValue(name:String, value:String):Void\n\t{\n\t\tvar path = getConfigPath();\n\n\t\ttry\n\t\t{\n\t\t\tif (!FileSystem.exists(value) && FileSystem.exists(Path.expand(value)))\n\t\t\t{\n\t\t\t\tvalue = Path.expand(value);\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\tvar configText = File.getContent(path);\n\t\t\tvar lines = configText.split(\"\\n\");\n\n\t\t\tvar findSet = \"<set name=\\\"\" + name + \"\\\"\";\n\t\t\tvar findSetenv = \"<setenv name=\\\"\" + name + \"\\\"\";\n\t\t\tvar findDefine = \"<define name=\\\"\" + name + \"\\\"\";\n\t\t\tvar line, i = 0, index = 0, found = false;\n\n\t\t\twhile (i < lines.length)\n\t\t\t{\n\t\t\t\tline = lines[i];\n\n\t\t\t\tif ((index = line.indexOf(findSet)) > -1)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tlines[i] = line.substr(0, index) + \"<set name=\\\"\" + name + \"\\\" value=\\\"\" + value + \"\\\" />\";\n\t\t\t\t}\n\n\t\t\t\tif ((index = line.indexOf(findSetenv)) > -1)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tlines[i] = line.substr(0, index) + \"<setenv name=\\\"\" + name + \"\\\" value=\\\"\" + value + \"\\\" />\";\n\t\t\t\t}\n\n\t\t\t\tif ((index = line.indexOf(findDefine)) > -1)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tlines[i] = line.substr(0, index) + \"<define name=\\\"\" + name + \"\\\" value=\\\"\" + value + \"\\\" />\";\n\t\t\t\t}\n\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif (!found && lines.length > 2)\n\t\t\t{\n\t\t\t\tvar insertPoint = lines.length - 3;\n\n\t\t\t\tif (StringTools.trim(lines[lines.length - 1]) == \"\")\n\t\t\t\t{\n\t\t\t\t\tinsertPoint--;\n\t\t\t\t}\n\n\t\t\t\tif (StringTools.trim(lines[insertPoint + 1]) != \"\")\n\t\t\t\t{\n\t\t\t\t\tlines.insert(insertPoint + 1, \"\\t\");\n\t\t\t\t}\n\n\t\t\t\tlines.insert(insertPoint + 1, \"\\t<define name=\\\"\" + name + \"\\\" value=\\\"\" + value + \"\\\" />\");\n\t\t\t}\n\n\t\t\tvar content = lines.join(\"\\n\");\n\t\t\tFile.saveContent(path, content);\n\n\t\t\tLog.info(\"Set \\x1b[1m\" + name + \"\\x1b[0m to \\x1b[1m\" + value + \"\\x1b[0m\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.error(\"Cannot find \\\"\" + path + \"\\\"\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/Dependency.hx",
    "content": "package lime.tools;\n\nclass Dependency\n{\n\t// TODO: Is \"forceLoad\" the best name? Implement \"whole-archive\" on GCC\n\tpublic var embed:Bool;\n\tpublic var forceLoad:Bool;\n\tpublic var allowWebWorkers:Bool;\n\tpublic var name:String;\n\tpublic var path:String;\n\n\tpublic function new(name:String, path:String)\n\t{\n\t\tthis.name = name;\n\t\tthis.path = path;\n\t}\n\n\tpublic function clone():Dependency\n\t{\n\t\tvar dependency = new Dependency(name, path);\n\t\tdependency.embed = embed;\n\t\tdependency.forceLoad = forceLoad;\n\t\treturn dependency;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/DeploymentHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.HXProject;\n\nclass DeploymentHelper\n{\n\tpublic static function deploy(project:HXProject, targetFlags:Map<String, String>, targetDirectory:String, targetName:String)\n\t{\n\t\tvar name = project.meta.title + \" (\" + project.meta.version + \" build \" + project.meta.buildNumber + \") (\" + targetName + \").zip\";\n\t\tvar targetPath = Path.combine(targetDirectory + \"/dist\", name);\n\n\t\tSystem.compress(Path.combine(targetDirectory, \"bin\"), targetPath);\n\n\t\tif (targetFlags.exists(\"gdrive\"))\n\t\t{\n\t\t\tvar parent = targetFlags.get(\"parent\");\n\n\t\t\tvar args = [\"upload\", \"-f\", targetPath];\n\n\t\t\tif (targetFlags.exists(\"config\"))\n\t\t\t{\n\t\t\t\targs.push(\"--config\");\n\t\t\t\targs.push(targetFlags.get(\"config\"));\n\t\t\t}\n\n\t\t\tif (parent != null && parent != \"\")\n\t\t\t{\n\t\t\t\targs.push(\"-p\");\n\t\t\t\targs.push(parent);\n\t\t\t}\n\n\t\t\tSystem.runCommand(\"\", \"drive\", args);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ElectronHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.HXProject;\n\nclass ElectronHelper\n{\n\tpublic static function launch(project:HXProject, path:String, ?npx:Bool):Void\n\t{\n\t\tif (npx)\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"npx\", [\"electron\", path]);\n\t\t\treturn;\n\t\t}\n\n\t\tvar electronPath = project.defines.get(\"ELECTRON_PATH\");\n\t\tif (electronPath == null || electronPath == \"\")\n\t\t{\n\t\t\telectronPath = \"electron\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\telectronPath = Path.combine(electronPath, \"electron\");\n\t\t}\n\n\t\tSystem.runCommand(\"\", electronPath, [path]);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/FlashHelper.hx",
    "content": "package lime.tools;\n\n// import openfl.text.Font;\n// import openfl.utils.ByteArray;\nimport sys.io.FileInput;\nimport haxe.io.Bytes;\nimport hxp.*;\nimport lime._internal.format.Base64;\nimport lime.tools.Asset;\nimport lime.tools.AssetEncoding;\nimport lime.tools.AssetType;\nimport lime.tools.HXProject;\n#if (lime && lime_cffi && !macro)\nimport lime.text.Font;\n#end\nimport sys.io.File;\nimport sys.FileSystem;\nimport sys.io.FileSeek;\n#if format\nimport format.swf.Data;\nimport format.swf.Constants;\nimport format.swf.Reader;\nimport format.swf.Writer;\nimport format.wav.Data;\n#end\n\nclass FlashHelper\n{\n\tprivate static var swfAssetID = 1000;\n\n\t#if format\n\tprivate static function embedAsset(inAsset:Asset, packageName:String, outTags:Array<SWFTag>)\n\t{\n\t\tvar embed = inAsset.embed;\n\t\tvar path = inAsset.sourcePath;\n\t\tvar type = inAsset.type;\n\t\tvar flatName = inAsset.flatName;\n\t\tvar ext = inAsset.format;\n\t\tvar name = (path == null || path == \"\") ? inAsset.targetPath : path;\n\n\t\tif (embed == false)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tLog.info(\"\", \" - \\x1b[1mEmbedding asset:\\x1b[0m \\x1b[3;37m(\" + type + \")\\x1b[0m \" + name);\n\n\t\tvar cid = nextAssetID();\n\n\t\tif (type == AssetType.MUSIC || type == AssetType.SOUND)\n\t\t{\n\t\t\tvar src = path;\n\n\t\t\tif (ext != \"mp3\" && ext != \"wav\")\n\t\t\t{\n\t\t\t\tfor (e in [\"wav\", \"mp3\"])\n\t\t\t\t{\n\t\t\t\t\tsrc = path.substr(0, path.length - ext.length) + e;\n\n\t\t\t\t\tif (FileSystem.exists(src))\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!FileSystem.exists(src))\n\t\t\t{\n\t\t\t\tSys.println(\"Warning: Could not embed unsupported audio file \\\"\" + name + \"\\\", embedding as binary\");\n\t\t\t\tinAsset.type = BINARY;\n\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t}\n\n\t\t\tvar input = File.read(src, true);\n\n\t\t\tif (ext == \"mp3\")\n\t\t\t{\n\t\t\t\tvar reader = new mpeg.audio.MpegAudioReader(input);\n\n\t\t\t\tvar frameDataWriter = new haxe.io.BytesOutput();\n\t\t\t\tvar totalLengthSamples = 0;\n\t\t\t\tvar samplingFrequency = -1;\n\t\t\t\tvar isStereo:Null<Bool> = null;\n\t\t\t\tvar encoderDelay = 0;\n\t\t\t\tvar endPadding = 0;\n\t\t\t\tvar decoderDelay = 529; // This is a constant delay caused by the Fraunhofer MP3 Decoder used in Flash Player.\n\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\tswitch (reader.readNext())\n\t\t\t\t\t{\n\t\t\t\t\t\tcase Frame(frame):\n\t\t\t\t\t\t\tif (frame.header.layer != mpeg.audio.Layer.Layer3)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\"\n\t\t\t\t\t\t\t\t\t+ name\n\t\t\t\t\t\t\t\t\t+ \"\\\" (Flash only supports Layer-III MP3 files, but file is \"\n\t\t\t\t\t\t\t\t\t+ frame.header.layer\n\t\t\t\t\t\t\t\t\t+ \"), embedding as binary\");\n\t\t\t\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar frameSamplingFrequency = frame.header.samplingFrequency;\n\t\t\t\t\t\t\tif (samplingFrequency == -1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsamplingFrequency = frameSamplingFrequency;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (frameSamplingFrequency != samplingFrequency)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\"\n\t\t\t\t\t\t\t\t\t+ name\n\t\t\t\t\t\t\t\t\t+ \"\\\" (Flash does not support MP3 audio with variable sampling frequencies), embedding as binary\");\n\t\t\t\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar frameIsStereo = frame.header.mode != mpeg.audio.Mode.SingleChannel;\n\t\t\t\t\t\t\tif (isStereo == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tisStereo = frameIsStereo;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (frameIsStereo != isStereo)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\"\n\t\t\t\t\t\t\t\t\t+ name\n\t\t\t\t\t\t\t\t\t+ \"\\\" (Flash does not support MP3 audio with mixed mono and stero frames), embedding as binary\");\n\t\t\t\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tframeDataWriter.write(frame.frameData);\n\t\t\t\t\t\t\ttotalLengthSamples += mpeg.audio.Utils.lookupSamplesPerFrame(frame.header.version, frame.header.layer);\n\n\t\t\t\t\t\tcase GaplessInfo(giEncoderDelay, giEndPadding):\n\t\t\t\t\t\t\tencoderDelay = giEncoderDelay;\n\t\t\t\t\t\t\tendPadding = giEndPadding;\n\n\t\t\t\t\t\tcase Info(_): // ignore\n\t\t\t\t\t\tcase Unknown(_): // ignore\n\t\t\t\t\t\tcase End:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalLengthSamples == 0)\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\" + name + \"\\\" (Could not find any valid MP3 audio data), embedding as binary\");\n\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t}\n\n\t\t\t\tvar flashSamplingFrequency = switch (samplingFrequency)\n\t\t\t\t{\n\t\t\t\t\tcase 11025: SR11k;\n\t\t\t\t\tcase 22050: SR22k;\n\t\t\t\t\tcase 44100: SR44k;\n\t\t\t\t\tdefault: null;\n\t\t\t\t}\n\n\t\t\t\tif (flashSamplingFrequency == null)\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\"\n\t\t\t\t\t\t+ name\n\t\t\t\t\t\t+ \"\\\" (Flash supports 11025, 22050 and 44100kHz MP3 files, but file is \"\n\t\t\t\t\t\t+ samplingFrequency\n\t\t\t\t\t\t+ \"kHz), embedding as binary\");\n\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t}\n\n\t\t\t\tvar frameData = frameDataWriter.getBytes();\n\n\t\t\t\tvar snd:format.swf.Data.Sound =\n\t\t\t\t\t{\n\t\t\t\t\t\tsid: cid,\n\t\t\t\t\t\tformat: SFMP3,\n\t\t\t\t\t\trate: flashSamplingFrequency,\n\t\t\t\t\t\tis16bit: true,\n\t\t\t\t\t\tisStereo: isStereo,\n\t\t\t\t\t\tsamples: totalLengthSamples - endPadding - encoderDelay,\n\t\t\t\t\t\tdata: SDMp3(encoderDelay + decoderDelay, frameData)\n\t\t\t\t\t};\n\n\t\t\t\toutTags.push(TSound(snd));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar header = input.readString(4);\n\n\t\t\t\tif (ext == \"ogg\" || header == \"OggS\")\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: Skipping unsupported OGG file \\\"\" + name + \"\\\", embedding as binary\");\n\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t}\n\t\t\t\telse if (header != \"RIFF\")\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: Could not embed unrecognized WAV file \\\"\" + name + \"\\\", embedding as binary\");\n\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tinput.close();\n\t\t\t\t\tinput = File.read(src, true);\n\n\t\t\t\t\tvar r = new format.wav.Reader(input);\n\t\t\t\t\tvar wav = r.read();\n\t\t\t\t\tvar hdr = wav.header;\n\n\t\t\t\t\tif (hdr.format != WF_PCM)\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\"\n\t\t\t\t\t\t\t+ name\n\t\t\t\t\t\t\t+ \"\\\" (Only PCM uncompressed WAV files are currently supported), embedding as binary\");\n\t\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check sampling rate\n\t\t\t\t\tvar flashRate = switch (hdr.samplingRate)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 5512: SR5k;\n\t\t\t\t\t\tcase 11025: SR11k;\n\t\t\t\t\t\tcase 22050: SR22k;\n\t\t\t\t\t\tcase 44100: SR44k;\n\t\t\t\t\t\tdefault: null;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (flashRate == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.println(\"Warning: Could not embed \\\"\"\n\t\t\t\t\t\t\t+ name\n\t\t\t\t\t\t\t+ \"\\\" (Flash supports 5512, 11025, 22050 and 44100kHz WAV files, but file is \"\n\t\t\t\t\t\t\t+ hdr.samplingRate\n\t\t\t\t\t\t\t+ \"kHz), embedding as binary\");\n\t\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar isStereo = switch (hdr.channels)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1: false;\n\t\t\t\t\t\tcase 2: true;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow \"Number of channels should be 1 or 2, but for '\" + src + \"' it is \" + hdr.channels;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar is16bit = switch (hdr.bitsPerSample)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 8: false;\n\t\t\t\t\t\tcase 16: true;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow \"Bits per sample should be 8 or 16, but for '\" + src + \"' it is \" + hdr.bitsPerSample;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (wav.data != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar sampleCount = Std.int(wav.data.length / (hdr.bitsPerSample / 8));\n\n\t\t\t\t\t\tvar snd:format.swf.Data.Sound =\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsid: cid,\n\t\t\t\t\t\t\t\tformat: SFLittleEndianUncompressed,\n\t\t\t\t\t\t\t\trate: flashRate,\n\t\t\t\t\t\t\t\tis16bit: is16bit,\n\t\t\t\t\t\t\t\tisStereo: isStereo,\n\t\t\t\t\t\t\t\tsamples: sampleCount,\n\t\t\t\t\t\t\t\tdata: SDRaw(wav.data)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\toutTags.push(TSound(snd));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.println(\"Warning: Could not embed WAV file \\\"\" + name + \"\\\", the file may be corrupted, embedding as binary\");\n\t\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinput.close();\n\t\t}\n\t\telse if (type == AssetType.IMAGE)\n\t\t{\n\t\t\tif (inAsset.data != null)\n\t\t\t{\n\t\t\t\tif (inAsset.encoding == AssetEncoding.BASE64)\n\t\t\t\t{\n\t\t\t\t\toutTags.push(TBitsJPEG(cid, JDJPEG2(Base64.decode(inAsset.data))));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toutTags.push(TBitsJPEG(cid, JDJPEG2(inAsset.data)));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar src = path;\n\n\t\t\t\tif (ext == \"jpg\" || ext == \"jpeg\" || ext == \"png\" || ext == \"gif\")\n\t\t\t\t{\n\t\t\t\t\tif (!FileSystem.exists(src))\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.println(\"Warning: Could not find image path \\\"\" + src + \"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvar bytes = File.getBytes(src);\n\t\t\t\t\t\toutTags.push(TBitsJPEG(cid, JDJPEG2(bytes)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: Could not embed image file \\\"\" + name + \"\\\", unknown image type, embedding as binary\");\n\t\t\t\t\tinAsset.type = BINARY;\n\t\t\t\t\treturn embedAsset(inAsset, packageName, outTags);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (type == AssetType.FONT)\n\t\t{\n\t\t\t// More code ripped off from \"samhaxe\"\n\n\t\t\t#if (lime && lime_cffi && !macro)\n\t\t\tvar src = path;\n\t\t\tvar face = Font.fromFile(src);\n\t\t\tvar font = face.decompose();\n\t\t\tvar font_name = font.family_name;\n\t\t\t// fallback for font name is case no one could be found..\n\t\t\tif (font_name == null || font_name.length == 0) font_name = Path.withoutExtension(name).split(\"/\").pop().split(\"\\\\\").pop();\n\n\t\t\tvar glyphs = new Array<Font2GlyphData>();\n\t\t\tvar glyph_layout = new Array<FontLayoutGlyphData>();\n\n\t\t\tfor (native_glyph in font.glyphs)\n\t\t\t{\n\t\t\t\tif (native_glyph.char_code > 65535)\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: glyph with character code greater than 65535 encountered (\" + native_glyph.char_code + \"). Skipping...\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar shapeRecords = new Array<ShapeRecord>();\n\t\t\t\tvar i:Int = 0;\n\t\t\t\tvar styleChanged:Bool = false;\n\t\t\t\tvar dx = 0;\n\t\t\t\tvar dy = 0;\n\n\t\t\t\twhile (i < native_glyph.points.length)\n\t\t\t\t{\n\t\t\t\t\tvar type = native_glyph.points[i++];\n\n\t\t\t\t\tswitch (type)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 1: // Move\n\n\t\t\t\t\t\t\tdx = native_glyph.points[i++];\n\t\t\t\t\t\t\tdy = native_glyph.points[i++];\n\t\t\t\t\t\t\tshapeRecords.push(SHRChange(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmoveTo: {dx: dx, dy: -dy},\n\t\t\t\t\t\t\t\t\t// Set fill style to 1 in first style change record\n\t\t\t\t\t\t\t\t\t// Required by DefineFontX\n\t\t\t\t\t\t\t\t\tfillStyle0: if (!styleChanged) {idx: 1}\n\t\t\t\t\t\t\t\t\telse null,\n\t\t\t\t\t\t\t\t\tfillStyle1: null,\n\t\t\t\t\t\t\t\t\tlineStyle: null,\n\t\t\t\t\t\t\t\t\tnewStyles: null\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\tstyleChanged = true;\n\n\t\t\t\t\t\tcase 2: // LineTo\n\n\t\t\t\t\t\t\tdx = native_glyph.points[i++];\n\t\t\t\t\t\t\tdy = native_glyph.points[i++];\n\t\t\t\t\t\t\tshapeRecords.push(SHREdge(dx, -dy));\n\n\t\t\t\t\t\tcase 3: // CurveTo\n\t\t\t\t\t\t\tvar cdx = native_glyph.points[i++];\n\t\t\t\t\t\t\tvar cdy = native_glyph.points[i++];\n\t\t\t\t\t\t\tdx = native_glyph.points[i++];\n\t\t\t\t\t\t\tdy = native_glyph.points[i++];\n\t\t\t\t\t\t\tshapeRecords.push(SHRCurvedEdge(cdx, -cdy, dx, -dy));\n\n\t\t\t\t\t\tcase 4: // CubicCurveTo\n\t\t\t\t\t\t\tvar p1x = native_glyph.points[i++];\n\t\t\t\t\t\t\tvar p1y = native_glyph.points[i++];\n\t\t\t\t\t\t\tvar p2x = native_glyph.points[i++];\n\t\t\t\t\t\t\tvar p2y = native_glyph.points[i++];\n\t\t\t\t\t\t\tvar p3x = native_glyph.points[i++];\n\t\t\t\t\t\t\tvar p3y = native_glyph.points[i++];\n\n\t\t\t\t\t\t\t// Get original points\n\n\t\t\t\t\t\t\tvar cp1x = p1x + dx;\n\t\t\t\t\t\t\tvar cp1y = p1y + dy;\n\t\t\t\t\t\t\tvar cp2x = p2x + cp1x;\n\t\t\t\t\t\t\tvar cp2y = p2y + cp1y;\n\t\t\t\t\t\t\tvar endx = p3x + cp2x;\n\t\t\t\t\t\t\tvar endy = p3y + cp2y;\n\n\t\t\t\t\t\t\t// Convert to quadratic\n\n\t\t\t\t\t\t\tvar cpx = Std.int((-0.25 * dx) + (0.75 * cp1x) + (0.75 * cp2x) + (-0.25 * endx));\n\t\t\t\t\t\t\tvar cpy = Std.int((-0.25 * dy) + (0.75 * cp1y) + (0.75 * cp2y) + (-0.25 * endy));\n\n\t\t\t\t\t\t\t// Offset again\n\n\t\t\t\t\t\t\tvar cdx = cpx - dx;\n\t\t\t\t\t\t\tvar cdy = cpy - dy;\n\t\t\t\t\t\t\tdx = endx - cpx;\n\t\t\t\t\t\t\tdy = endy - cpy;\n\n\t\t\t\t\t\t\tshapeRecords.push(SHRCurvedEdge(cdx, -cdy, dx, -dy));\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow \"Invalid control point type encountered! (\" + type + \")\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tshapeRecords.push(SHREnd);\n\n\t\t\t\tglyphs.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tcharCode: native_glyph.char_code,\n\t\t\t\t\t\tshape:\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tshapeRecords: shapeRecords\n\t\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\tglyph_layout.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tadvance: native_glyph.advance,\n\t\t\t\t\t\tbounds:\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tleft: native_glyph.min_x,\n\t\t\t\t\t\t\t\tright: native_glyph.max_x,\n\t\t\t\t\t\t\t\ttop: -native_glyph.max_y,\n\t\t\t\t\t\t\t\tbottom: -native_glyph.min_y,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tvar kerning = new Array<FontKerningData>();\n\n\t\t\tif (font.kerning != null)\n\t\t\t{\n\t\t\t\tvar length = font.kerning.length;\n\t\t\t\tif (length > 0xFFFF) length = 0xFFFF;\n\t\t\t\tvar k:NativeKerningData;\n\n\t\t\t\tfor (i in 0...length)\n\t\t\t\t{\n\t\t\t\t\tk = font.kerning[i];\n\n\t\t\t\t\tkerning.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcharCode1: k.left_glyph,\n\t\t\t\t\t\t\tcharCode2: k.right_glyph,\n\t\t\t\t\t\t\tadjust: k.x,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar swf_em = 1024 * 20;\n\t\t\tvar ascent = Math.round(Math.abs(font.ascend * swf_em / font.em_size));\n\t\t\tvar descent = Math.round(Math.abs((font.descend) * swf_em / font.em_size));\n\t\t\tvar leading = Math.round((font.height - font.ascend + font.descend) * swf_em / font.em_size);\n\t\t\tvar language = LangCode.LCNone;\n\n\t\t\toutTags.push(TFont(cid, FDFont3(\n\t\t\t\t{\n\t\t\t\t\tshiftJIS: false,\n\t\t\t\t\tisSmall: false,\n\t\t\t\t\tisANSI: false,\n\t\t\t\t\tisItalic: font.is_italic,\n\t\t\t\t\tisBold: font.is_bold,\n\t\t\t\t\tlanguage: language,\n\t\t\t\t\tname: font_name,\n\t\t\t\t\tglyphs: glyphs,\n\t\t\t\t\tlayout:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tascent: ascent,\n\t\t\t\t\t\t\tdescent: descent,\n\t\t\t\t\t\t\tleading: leading,\n\t\t\t\t\t\t\tglyphs: glyph_layout,\n\t\t\t\t\t\t\tkerning: kerning\n\t\t\t\t\t\t}\n\t\t\t\t})));\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar bytes:Bytes = null;\n\n\t\t\tif (inAsset.data != null)\n\t\t\t{\n\t\t\t\tif (inAsset.encoding == AssetEncoding.BASE64)\n\t\t\t\t{\n\t\t\t\t\tbytes = Base64.decode(inAsset.data);\n\t\t\t\t}\n\t\t\t\telse if ((inAsset.data is Bytes))\n\t\t\t\t{\n\t\t\t\t\tbytes = cast inAsset.data;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbytes = Bytes.ofString(Std.string(inAsset.data));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bytes == null)\n\t\t\t{\n\t\t\t\tbytes = File.getBytes(path);\n\t\t\t}\n\n\t\t\toutTags.push(TBinaryData(cid, bytes));\n\t\t}\n\n\t\toutTags.push(TSymbolClass([\n\t\t\t{cid: cid, className: packageName + \"__ASSET__\" + flatName}]));\n\n\t\treturn true;\n\t}\n\t#end\n\n\t/*public static function embedAssets (targetPath:String, assets:Array<Asset>, packageName:String = \"\"):Void {\n\n\t\ttry {\n\n\t\t\tvar input = File.read (targetPath, true);\n\n\t\t\tif (input != null) {\n\n\t\t\t\tvar reader = new Reader (input);\n\t\t\t\tvar swf = reader.read ();\n\t\t\t\tinput.close();\n\n\t\t\t\tvar new_tags = new Array<SWFTag> ();\n\t\t\t\tvar inserted = false;\n\n\t\t\t\tfor (tag in swf.tags) {\n\n\t\t\t\t\tvar name = Type.enumConstructor (tag);\n\n\t\t\t\t\tif (name == \"TShowFrame\" && !inserted && assets.length > 0) {\n\n\t\t\t\t\t\tnew_tags.push (TShowFrame);\n\n\t\t\t\t\t\tfor (asset in assets) {\n\n\t\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t\tif (asset.type != AssetType.TEMPLATE && embedAsset (asset, packageName, new_tags)) {\n\n\t\t\t\t\t\t\t\t\tinserted = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} catch (e:Dynamic) {\n\n\t\t\t\t\t\t\t\tSys.println (\"Error embedding \\\"\" + asset.sourcePath + \"\\\": \" + e);\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnew_tags.push (tag);\n\n\t\t\t\t}\n\n\t\t\t\tif (inserted) {\n\n\t\t\t\t\tswf.tags = new_tags;\n\t\t\t\t\tvar output = File.write (targetPath, true);\n\t\t\t\t\tvar writer = new Writer (output);\n\t\t\t\t\twriter.write (swf);\n\t\t\t\t\toutput.close ();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttrace (\"Embedding assets failed! We encountered an error. Does '\" + targetPath + \"' exist?\");\n\n\t\t\t}\n\n\t\t} catch (e:Dynamic) {\n\n\t\t\ttrace (\"Embedding assets failed! We encountered an error accessing '\" + targetPath + \"': \" + e);\n\n\t\t}\n\n\t}*/\n\tpublic static function enableLogging():Void\n\t{\n\t\ttry\n\t\t{\n\t\t\tvar path = switch (System.hostPlatform)\n\t\t\t{\n\t\t\t\tcase WINDOWS: Sys.getEnv(\"HOMEDRIVE\") + \"/\" + Sys.getEnv(\"HOMEPATH\") + \"/mm.cfg\";\n\t\t\t\t// case MAC: \"/Library/Application Support/Macromedia/mm.cfg\";\n\t\t\t\tdefault: Sys.getEnv(\"HOME\") + \"/mm.cfg\";\n\t\t\t}\n\n\t\t\tif (!FileSystem.exists(path))\n\t\t\t{\n\t\t\t\tFile.saveContent(path, \"ErrorReportingEnable=1\\nTraceOutputFileEnable=1\\nMaxWarnings=50\");\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\t}\n\n\tprivate static function compileSWC(project:HXProject, assets:Array<Asset>, id:Int, destination:String):Void\n\t{\n\t\t#if format\n\t\tdestination = destination + \"/obj\";\n\t\tSystem.mkdir(destination);\n\n\t\tvar label = (id > 0 ? Std.string(id + 1) : \"\");\n\n\t\tvar swfVersions = [\n\t\t\t9, 10, /*10.1,*/ 10.2, 10.3, 11, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 12, 13, 14\n\t\t];\n\n\t\tvar flashVersion = 9;\n\n\t\tif (project.app.swfVersion > 14)\n\t\t{\n\t\t\tflashVersion += Std.int((swfVersions.length - 1) + (project.app.swfVersion - 14));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (swfVersion in swfVersions)\n\t\t\t{\n\t\t\t\tif (project.app.swfVersion > swfVersion)\n\t\t\t\t{\n\t\t\t\t\tflashVersion++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar header:SWFHeader =\n\t\t\t{\n\t\t\t\tversion: flashVersion,\n\t\t\t\tcompressed: true,\n\t\t\t\twidth: (project.window.width == 0 ? 800 : project.window.width),\n\t\t\t\theight: (project.window.height == 0 ? 500 : project.window.height),\n\t\t\t\tfps: project.window.fps * 256,\n\t\t\t\tnframes: project.target == AIR ? 1 : 2\n\t\t\t};\n\n\t\tvar tags = new Array<SWFTag>();\n\t\tvar packageName = \"\";\n\t\tvar inserted = false;\n\n\t\ttags.push(TBackgroundColor(project.window.background & 0xFFFFFF));\n\n\t\tif (project.target != AIR)\n\t\t{\n\t\t\ttags.push(TShowFrame);\n\t\t}\n\n\t\t// Might generate ABC later, so we don't need the @:bind calls in DefaultAssetLibrary?\n\n\t\t/*var abc = new haxe.io.BytesOutput ();\n\t\t\tvar abcWriter = new format.abc.Writer (abc);\n\n\t\t\tfor (asset in assets) {\n\n\t\t\t\tvar classDef:ClassDef = {\n\t\t\t\t\tvar name : packageName + \"__ASSET__\" + asset.flatName;\n\t\t\t\t\tvar superclass : asset.flashClass;\n\t\t\t\t\tvar interfaces : []];\n\t\t\t\t\tvar constructor : null;\n\t\t\t\t\tvar fields : [];\n\t\t\t\t\tvar namespace : null;\n\t\t\t\t\tvar isSealed : false;\n\t\t\t\t\tvar isFinal : false;\n\t\t\t\t\tvar isInterface : false;\n\t\t\t\t\tvar statics : [];\n\t\t\t\t\tvar staticFields : [];\n\t\t\t\t}\n\t\t\t\tabcWriter.writeClass (classDef);\n\n\t\t}*/\n\n\t\tfor (asset in assets)\n\t\t{\n\t\t\t#if format\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (asset.type != AssetType.TEMPLATE && embedAsset(asset, packageName, tags))\n\t\t\t\t{\n\t\t\t\t\tinserted = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tSys.println(\"Error embedding \\\"\" + asset.sourcePath + \"\\\": \" + e);\n\t\t\t}\n\t\t\t#end\n\t\t}\n\n\t\ttags.push(TShowFrame);\n\n\t\tif (inserted)\n\t\t{\n\t\t\tvar swf:SWF = {header: header, tags: tags};\n\t\t\tvar output = File.write(destination + \"/assets.swf\", true);\n\t\t\tvar writer = new Writer(output);\n\t\t\twriter.write(swf);\n\t\t\toutput.close();\n\t\t}\n\t\t#end\n\t}\n\n\t/*private static function compileSWC (project:HXProject, embed:String, id:Int):Void {\n\n\t\tvar destination = project.app.path + \"/flash/obj\";\n\t\tSystem.mkdir (destination);\n\n\t\tvar label = (id > 0 ? Std.string (id + 1) : \"\");\n\n\t\tFile.saveContent (destination + \"/EmbeddedAssets.hx\", embed);\n\t\tvar args = [ \"EmbeddedAssets\", \"-cp\", destination, \"-D\", \"swf-preloader-frame\", \"-swf\", destination + \"/assets.swf\" ];\n\n\t\tif (id == 0) {\n\n\t\t\tvar header = args.push (\"-swf-header\");\n\t\t\targs.push ((project.window.width == 0 ? 800 : project.window.width) + \":\" + (project.window.height == 0 ? 500 : project.window.height) + \":\" + project.window.fps + \":\" + StringTools.hex (project.window.background, 6));\n\n\t\t} else {\n\n\t\t\tif (FileSystem.exists (destination + \"/assets.swf\")) {\n\n\t\t\t\tSystem.copyFile (destination + \"/assets.swf\", destination + \"/.assets.swf\");\n\n\t\t\t}\n\n\t\t\t// Have to daisy-chain it to fix Haxe compiler issue\n\n\t\t\targs.push (\"-swf-lib\");\n\t\t\targs.push (destination + \"/.assets.swf\");\n\t\t\targs.push (\"-D\");\n\t\t\targs.push (\"flash-use-stage\");\n\n\t\t}\n\n\t\tSystem.runCommand (\"\", \"haxe\", args);\n\n\t\tif (FileSystem.exists (destination + \"/.assets.swf\")) {\n\n\t\t\ttry {\n\n\t\t\t\tFileSystem.deleteFile (destination + \"/.assets.swf\");\n\n\t\t\t} catch (e:Dynamic) {}\n\n\t\t}\n\n\t}*/\n\tpublic static function embedAssets(project:HXProject, targetDirectory:String):Bool\n\t{\n\t\tvar embed = \"\";\n\t\tvar assets:Array<Asset> = [];\n\t\tvar maxSize = 1024 * 1024 * 16;\n\t\tvar currentSize = 0;\n\t\tvar id = 0;\n\t\tvar tempFiles:Array<String> = [];\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed == null || asset.embed == true)\n\t\t\t{\n\t\t\t\t// Log.info (\"\", \" - \\x1b[1mEmbedding asset:\\x1b[0m \\x1b[3;37m(\" + asset.type + \")\\x1b[0m \" + asset.sourcePath);\n\n\t\t\t\tvar flashClass = switch (asset.type)\n\t\t\t\t{\n\t\t\t\t\tcase MUSIC: \"flash.media.Sound\";\n\t\t\t\t\tcase SOUND: \"flash.media.Sound\";\n\t\t\t\t\tcase IMAGE: \"flash.display.BitmapData\";\n\t\t\t\t\tcase FONT: \"flash.text.Font\";\n\t\t\t\t\tdefault: \"flash.utils.ByteArray\";\n\t\t\t\t}\n\n\t\t\t\tvar tagName = switch (asset.type)\n\t\t\t\t{\n\t\t\t\t\tcase MUSIC: \"@:sound\";\n\t\t\t\t\tcase SOUND: \"@:sound\";\n\t\t\t\t\tcase IMAGE: \"@:bitmap\";\n\t\t\t\t\tcase FONT: \"@:font\";\n\t\t\t\t\tdefault: \"@:file\";\n\t\t\t\t}\n\n\t\t\t\tvar ignoreAsset = false;\n\t\t\t\tvar sourcePath:String = null;\n\n\t\t\t\tif (asset.data != null)\n\t\t\t\t{\n\t\t\t\t\tsourcePath = System.getTemporaryFile();\n\t\t\t\t\ttempFiles.push(sourcePath);\n\n\t\t\t\t\tif (asset.encoding == AssetEncoding.BASE64)\n\t\t\t\t\t{\n\t\t\t\t\t\tFile.saveBytes(sourcePath, Base64.decode(asset.data));\n\t\t\t\t\t}\n\t\t\t\t\telse if ((asset.data is Bytes))\n\t\t\t\t\t{\n\t\t\t\t\t\tFile.saveBytes(sourcePath, asset.data);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tFile.saveContent(sourcePath, Std.string(asset.data));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tsourcePath = asset.sourcePath;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar stat = FileSystem.stat(sourcePath);\n\n\t\t\t\t\tif (stat.size >= maxSize)\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.println(\"Warning: Cannot embed large file \\\"\" + sourcePath + \"\\\" (>16MB)\");\n\t\t\t\t\t\tignoreAsset = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/*if (currentSize + stat.size >= maxSize) {\n\n\t\t\t\t\t\t\t//compileSWC (project, embed, id);\n\t\t\t\t\t\t\tcompileSWC (project, assets, id);\n\n\t\t\t\t\t\t\tid++;\n\t\t\t\t\t\t\tcurrentSize = 0;\n\t\t\t\t\t\t\tembed = \"\";\n\t\t\t\t\t\t\tassets = [];\n\n\t\t\t\t\t\t}*/\n\n\t\t\t\t\t\tcurrentSize += stat.size;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Warning: Could not access \\\"\" + sourcePath + \"\\\", does the file exist?\");\n\t\t\t\t\tignoreAsset = true;\n\t\t\t\t}\n\n\t\t\t\tif (ignoreAsset)\n\t\t\t\t{\n\t\t\t\t\tembed += \"@:keep class __ASSET__\" + asset.flatName + \" extends \" + flashClass + \" { }\\n\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tassets.push(asset);\n\n\t\t\t\t\tif (asset.type == IMAGE)\n\t\t\t\t\t{\n\t\t\t\t\t\tembed += \"@:keep \" + tagName + \"('\" + sourcePath + \"') class __ASSET__\" + asset.flatName + \" extends \" + flashClass\n\t\t\t\t\t\t\t+ \" { public function new () { super (0, 0, true, 0); } }\\n\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tembed += \"@:keep \" + tagName + \"('\" + sourcePath + \"') class __ASSET__\" + asset.flatName + \" extends \" + flashClass + \" { }\\n\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (embed != \"\")\n\t\t{\n\t\t\t// compileSWC (project, embed, id);\n\t\t\tcompileSWC(project, assets, id, targetDirectory);\n\t\t}\n\n\t\tfor (tempFile in tempFiles)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFileSystem.deleteFile(tempFile);\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\tif (assets.length > 0)\n\t\t{\n\t\t\tproject.haxeflags.push(\"-cp \" + targetDirectory);\n\t\t\tproject.haxeflags.push(\"-swf-lib obj/assets.swf\");\n\t\t\tproject.haxedefs.set(\"flash-use-stage\", \"\");\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic static function getLogLength():Int\n\t{\n\t\ttry\n\t\t{\n\t\t\tvar path = switch (System.hostPlatform)\n\t\t\t{\n\t\t\t\tcase WINDOWS: Path.escape(Sys.getEnv(\"APPDATA\") + \"/Macromedia/Flash Player/Logs/flashlog.txt\");\n\t\t\t\tcase MAC: Sys.getEnv(\"HOME\") + \"/Library/Preferences/Macromedia/Flash Player/Logs/flashlog.txt\";\n\t\t\t\tdefault: Sys.getEnv(\"HOME\") + \"/.macromedia/Flash_Player/Logs/flashlog.txt\";\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(path))\n\t\t\t{\n\t\t\t\treturn FileSystem.stat(path).size;\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\treturn 0;\n\t}\n\n\tprivate static function nextAssetID()\n\t{\n\t\treturn swfAssetID++;\n\t}\n\n\tpublic static function run(project:HXProject, workingDirectory:String, targetPath:String):Void\n\t{\n\t\tvar player:String = null;\n\n\t\tif (!StringTools.endsWith(targetPath, \".html\"))\n\t\t{\n\t\t\tif (project.environment.exists(\"SWF_PLAYER\"))\n\t\t\t{\n\t\t\t\tplayer = project.environment.get(\"SWF_PLAYER\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tplayer = Sys.getEnv(\"FLASH_PLAYER_EXE\");\n\t\t\t}\n\t\t}\n\n\t\tSystem.openFile(workingDirectory, targetPath, player);\n\t}\n\n\tpublic static function tailLog(start:Int = 0, clear:Bool = true):Void\n\t{\n\t\ttry\n\t\t{\n\t\t\tvar path = switch (System.hostPlatform)\n\t\t\t{\n\t\t\t\tcase WINDOWS: Sys.getEnv(\"APPDATA\") + \"/Macromedia/Flash Player/Logs/flashlog.txt\";\n\t\t\t\tcase MAC: Sys.getEnv(\"HOME\") + \"/Library/Preferences/Macromedia/Flash Player/Logs/flashlog.txt\";\n\t\t\t\tdefault: Sys.getEnv(\"HOME\") + \"/.macromedia/Flash_Player/Logs/flashlog.txt\";\n\t\t\t}\n\n\t\t\tvar position = start;\n\n\t\t\tif (FileSystem.exists(path))\n\t\t\t{\n\t\t\t\tif (clear)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tFile.saveContent(path, \"\");\n\t\t\t\t\t\tposition = 0;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\tvar input:FileInput = null;\n\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tinput = File.read(path, false);\n\t\t\t\t\t\tinput.seek(position, FileSeek.SeekBegin);\n\n\t\t\t\t\t\tif (!input.eof())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar bytes = input.readAll();\n\t\t\t\t\t\t\tposition = input.tell();\n\n\t\t\t\t\t\t\tif (bytes.length > 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.print(bytes.getString(0, bytes.length));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinput.close();\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (input != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tSys.sleep(0.3);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/GUID.hx",
    "content": "package lime.tools;\n\nimport haxe.crypto.Sha1;\nimport haxe.io.Bytes;\nimport haxe.crypto.Crc32;\n\n// https://groups.google.com/d/msg/haxelang/N03kf5WSrTU/KU8nmsaqfIIJ\nclass GUID\n{\n\tinline public static function randomIntegerWithinRange(min:Int, max:Int, ?seeded:Bool = false):Int\n\t{\n\t\treturn seeded ? Math.floor(GUID.seededRandom() * (1 + max - min) + min) : Math.floor(Math.random() * (1 + max - min) + min);\n\t}\n\n\tpublic static function createRandomIdentifier(length:Int, radix:Int = 61, ?seeded:Bool = false):String\n\t{\n\t\tvar characters = [\n\t\t\t'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',\n\t\t\t'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n\t\t\t'w', 'x', 'y', 'z'\n\t\t];\n\t\tvar id:Array<String> = new Array<String>();\n\t\tradix = (radix > 61) ? 61 : radix;\n\n\t\twhile (length-- > 0)\n\t\t{\n\t\t\tid.push(characters[GUID.randomIntegerWithinRange(0, radix, seeded)]);\n\t\t}\n\n\t\treturn id.join('');\n\t}\n\n\tpublic static function uuid(?seeded:Bool = false):String\n\t{\n\t\tvar specialChars = ['8', '9', 'A', 'B'];\n\n\t\treturn \"{\"\n\t\t\t+ GUID.createRandomIdentifier(8, 15, seeded)\n\t\t\t+ '-'\n\t\t\t+ GUID.createRandomIdentifier(4, 15, seeded)\n\t\t\t+ '-4'\n\t\t\t+ GUID.createRandomIdentifier(3, 15, seeded)\n\t\t\t+ '-'\n\t\t\t+ specialChars[GUID.randomIntegerWithinRange(0, 3, seeded)]\n\t\t\t+ GUID.createRandomIdentifier(3, 15, seeded)\n\t\t\t+ '-'\n\t\t\t+ GUID.createRandomIdentifier(12, 15, seeded)\n\t\t\t+ \"}\";\n\t}\n\n\tprivate static var seed:Int = 0;\n\n\tprivate static function setSeed(input:String):Int\n\t{\n\t\tvar inputBytes = Bytes.ofString(input);\n\t\tvar hashedBytes = Sha1.make(inputBytes);\n\t\treturn GUID.seed = Crc32.make(hashedBytes);\n\t}\n\n\tprivate static function seededRandom():Float\n\t{\n\t\tGUID.seed++;\n\t\tvar x = Math.sin(GUID.seed) * 10000;\n\t\treturn x - Math.floor(x);\n\t}\n\n\tpublic static function seededUuid(seed:String):String\n\t{\n\t\tGUID.setSeed(seed);\n\t\treturn uuid(true);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/HTML5Helper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.Architecture;\nimport lime.tools.Asset;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\nimport sys.FileSystem;\nimport sys.io.File;\n#if neko\nimport neko.vm.Thread;\n#elseif cpp\nimport cpp.vm.Thread;\n#end\n\nclass HTML5Helper\n{\n\tpublic static function encodeSourceMappingURL(sourceFile:String)\n\t{\n\t\t// This is only required for projects with url-unsafe characters built with a Haxe version prior to 4.0.0\n\n\t\tvar filename = Path.withoutDirectory(sourceFile);\n\n\t\tif (filename != StringTools.urlEncode(filename))\n\t\t{\n\t\t\tvar output = System.runProcess(\"\", \"haxe\", [\"-version\"], true, true, true, false, true);\n\t\t\tvar haxeVer:Version = StringTools.trim(output);\n\n\t\t\tif (haxeVer < (\"4.0.0\":Version))\n\t\t\t{\n\t\t\t\tvar replaceString = \"//# sourceMappingURL=\" + filename + \".map\";\n\t\t\t\tvar replacement = \"//# sourceMappingURL=\" + StringTools.urlEncode(filename) + \".map\";\n\n\t\t\t\tSystem.replaceText(sourceFile, replaceString, replacement);\n\t\t\t}\n\t\t}\n\t}\n\n\t// public static function generateFontData (project:HXProject, font:Asset):String {\n\t// \tvar sourcePath = font.sourcePath;\n\t// \tif (!FileSystem.exists (FileSystem.fullPath (sourcePath) + \".hash\")) {\n\t// \t\tvar templatePaths = [ Path.combine (Haxelib.getPath (new Haxelib (#if lime \"lime\" #else \"hxp\" #end)), \"templates\") ].concat (project.templatePaths);\n\t// \t\tSystem.runCommand (Path.directory (sourcePath), \"neko\", [ System.findTemplate (templatePaths, \"bin/hxswfml.n\"), \"ttf2hash2\", Path.withoutDirectory (sourcePath), FileSystem.fullPath (sourcePath) + \".hash\", \"-glyphs\", font.glyphs ]);\n\t// \t}\n\t// \treturn \"-resource \" + FileSystem.fullPath (sourcePath) + \".hash@__ASSET__\" + font.flatName;\n\t// }\n\tpublic static function generateWebfonts(project:HXProject, font:Asset):Void\n\t{\n\t\tvar suffix = switch (System.hostPlatform)\n\t\t{\n\t\t\tcase WINDOWS: \"-windows.exe\";\n\t\t\tcase MAC: \"-mac\";\n\t\t\tcase LINUX: \"-linux\";\n\t\t\tdefault: return;\n\t\t}\n\n\t\tif (suffix == \"-linux\")\n\t\t{\n\t\t\tif (System.hostArchitecture == X86)\n\t\t\t{\n\t\t\t\tsuffix += \"32\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsuffix += \"64\";\n\t\t\t}\n\t\t}\n\n\t\tvar templatePaths = [\n\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t].concat(project.templatePaths);\n\t\tvar webify = System.findTemplate(templatePaths, \"bin/webify\" + suffix);\n\t\tif (System.hostPlatform != WINDOWS)\n\t\t{\n\t\t\tSys.command(\"chmod\", [\"+x\", webify]);\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\tSystem.runCommand(\"\", webify, [FileSystem.fullPath(font.sourcePath)]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.runProcess(\"\", webify, [FileSystem.fullPath(font.sourcePath)], true, true, true);\n\t\t}\n\t}\n\n\tpublic static function launch(project:HXProject, path:String, port:Int = 0):Void\n\t{\n\t\tif (project.app.url != null && project.app.url != \"\")\n\t\t{\n\t\t\tSystem.openURL(project.app.url);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar suffix = switch (System.hostPlatform)\n\t\t\t{\n\t\t\t\tcase WINDOWS: \"-windows.exe\";\n\t\t\t\tcase MAC: \"-mac\";\n\t\t\t\tcase LINUX: \"-linux\";\n\t\t\t\tdefault: return;\n\t\t\t}\n\n\t\t\tif (suffix == \"-linux\")\n\t\t\t{\n\t\t\t\tif (System.hostArchitecture == X86)\n\t\t\t\t{\n\t\t\t\t\tsuffix += \"32\";\n\t\t\t\t}\n\t\t\t\telse if( System.hostArchitecture == ARMV7)\n\t\t\t\t{\n\t\t\t\t\tsuffix += \"Arm\";\n\t\t\t\t}\n\t\t\t\telse if( System.hostArchitecture == ARM64)\n\t\t\t\t{\n\t\t\t\t\tsuffix += \"Arm64\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tsuffix += \"64\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar templatePaths = [\n\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t].concat(project.templatePaths);\n\t\t\tvar node = System.findTemplate(templatePaths, \"bin/node/node\" + suffix);\n\t\t\tvar server = System.findTemplate(templatePaths, \"bin/node/http-server/bin/http-server\");\n\n\t\t\tif (System.hostPlatform != WINDOWS)\n\t\t\t{\n\t\t\t\tSys.command(\"chmod\", [\"+x\", node]);\n\t\t\t}\n\n\t\t\tvar args = [server, path, \"-c-1\", \"--cors\"];\n\n\t\t\tif (project.targetFlags.exists(\"port\"))\n\t\t\t{\n\t\t\t\tport = Std.parseInt(project.targetFlags.get(\"port\"));\n\t\t\t}\n\n\t\t\tif (port != 0)\n\t\t\t{\n\t\t\t\targs.push(\"-p\");\n\t\t\t\targs.push(Std.string(port));\n\t\t\t\tLog.info(\"\", \"\\x1b[1mStarting local web server:\\x1b[0m http://localhost:\" + port);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.info(\"\", \"\\x1b[1mStarting local web server:\\x1b[0m http://localhost:[3000*]\");\n\t\t\t}\n\n\t\t\tif (!project.targetFlags.exists(\"nolaunch\"))\n\t\t\t{\n\t\t\t\targs.push(\"-o\");\n\t\t\t}\n\n\t\t\tif (!Log.verbose)\n\t\t\t{\n\t\t\t\targs.push(\"--silent\");\n\t\t\t}\n\n\t\t\tSystem.runCommand(\"\", node, args);\n\t\t}\n\t}\n\n\tpublic static function minify(project:HXProject, sourceFile:String):Bool\n\t{\n\t\tif (FileSystem.exists(sourceFile))\n\t\t{\n\t\t\tvar tempFile = System.getTemporaryFile(\".js\");\n\n\t\t\tif (project.targetFlags.exists(\"terser\"))\n\t\t\t{\n\t\t\t\tvar executable = \"npx\";\n\t\t\t\tvar terser = \"terser\";\n\t\t\t\tif (!project.targetFlags.exists(\"npx\")) {\n\t\t\t\t\tvar suffix = switch (System.hostPlatform)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase WINDOWS: \"-windows.exe\";\n\t\t\t\t\t\tcase MAC: \"-mac\";\n\t\t\t\t\t\tcase LINUX: \"-linux\";\n\t\t\t\t\t\tdefault: return false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (suffix == \"-linux\")\n\t\t\t\t\t{\n\t\t\t\t\t\tif (System.hostArchitecture == X86)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsuffix += \"32\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsuffix += \"64\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar templatePaths = [\n\t\t\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t\t\t].concat(project.templatePaths);\n\t\t\t\t\texecutable = System.findTemplate(templatePaths, \"bin/node/node\" + suffix);\n\t\t\t\t\tterser = System.findTemplate(templatePaths, \"bin/node/terser/bin/terser\");\n\n\t\t\t\t\tif (System.hostPlatform != WINDOWS)\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.command(\"chmod\", [\"+x\", executable]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar args = [\n\t\t\t\t\tterser,\n\t\t\t\t\tsourceFile,\n\t\t\t\t\t\"-c\",\n\t\t\t\t\t\"-m\",\n\t\t\t\t\t\"-o\",\n\t\t\t\t\ttempFile\n\t\t\t\t];\n\n\t\t\t\tif (FileSystem.exists(sourceFile + \".map\"))\n\t\t\t\t{\n\t\t\t\t\targs.push(\"--source-map\");\n\t\t\t\t\targs.push('content=\\'${sourceFile}.map\\'');\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(\"\", executable, args);\n\t\t\t}\n\t\t\telse if (project.targetFlags.exists(\"yui\"))\n\t\t\t{\n\t\t\t\tvar templatePaths = [\n\t\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t\t].concat(project.templatePaths);\n\t\t\t\tSystem.runCommand(\"\", \"java\", [\n\t\t\t\t\t\"-Dapple.awt.UIElement=true\",\n\t\t\t\t\t\"-jar\",\n\t\t\t\t\tSystem.findTemplate(templatePaths, \"bin/yuicompressor-2.4.7.jar\"),\n\t\t\t\t\t\"-o\",\n\t\t\t\t\ttempFile,\n\t\t\t\t\tsourceFile\n\t\t\t\t]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar executable:String;\n\t\t\t\tvar args:Array<String>;\n\t\t\t\tif (project.targetFlags.exists(\"npx\"))\n\t\t\t\t{\n\t\t\t\t\texecutable = \"npx\";\n\t\t\t\t\targs = [\n\t\t\t\t\t\t\"google-closure-compiler\"\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\texecutable = \"java\";\n\t\t\t\t\tvar templatePaths = [\n\t\t\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t\t\t].concat(project.templatePaths);\n\t\t\t\t\targs = [\n\t\t\t\t\t\t\"-Dapple.awt.UIElement=true\",\n\t\t\t\t\t\t\"-jar\",\n\t\t\t\t\t\tSystem.findTemplate(templatePaths, \"bin/compiler.jar\"),\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\targs.push(\"--strict_mode_input\");\n\t\t\t\targs.push(\"false\");\n\t\t\t\targs.push(\"--js\");\n\t\t\t\targs.push(sourceFile);\n\t\t\t\targs.push(\"--js_output_file\");\n\t\t\t\targs.push(tempFile);\n\n\t\t\t\tif (project.targetFlags.exists(\"advanced\"))\n\t\t\t\t{\n\t\t\t\t\targs.push(\"--compilation_level\");\n\t\t\t\t\targs.push(\"ADVANCED_OPTIMIZATIONS\");\n\t\t\t\t}\n\n\t\t\t\tif (FileSystem.exists(sourceFile + \".map\") || project.targetFlags.exists(\"source-map\"))\n\t\t\t\t{\n\t\t\t\t\t// if an input .js.map exists closure automatically detects it (from sourceMappingURL)\n\t\t\t\t\t// --source_map_location_mapping adds file:// to paths (similarly to haxe's .js.map)\n\n\t\t\t\t\targs.push(\"--create_source_map\");\n\t\t\t\t\targs.push(tempFile + \".map\");\n\t\t\t\t\targs.push(\"--source_map_location_mapping\");\n\t\t\t\t\targs.push(\"/|file:///\");\n\t\t\t\t}\n\n\t\t\t\tif (!Log.verbose)\n\t\t\t\t{\n\t\t\t\t\targs.push(\"--jscomp_off=uselessCode\");\n\t\t\t\t\targs.push(\"--jscomp_off=suspiciousCode\"); // avoid warnings caused by the embedded minified libraries\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(\"\", executable, args);\n\n\t\t\t\tif (FileSystem.exists(tempFile + \".map\"))\n\t\t\t\t{\n\t\t\t\t\t// closure does not include a sourceMappingURL in the created .js, we do it here\n\t\t\t\t\t#if !nodejs\n\t\t\t\t\tvar f = File.append(tempFile);\n\t\t\t\t\tf.writeString(\"//# sourceMappingURL=\" + StringTools.urlEncode(Path.withoutDirectory(sourceFile)) + \".map\");\n\t\t\t\t\tf.close();\n\t\t\t\t\t#end\n\n\t\t\t\t\tFile.copy(tempFile + \".map\", sourceFile + \".map\");\n\t\t\t\t\tFileSystem.deleteFile(tempFile + \".map\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tFileSystem.deleteFile(sourceFile);\n\t\t\tFile.copy(tempFile, sourceFile);\n\t\t\tFileSystem.deleteFile(tempFile);\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/HXProject.hx",
    "content": "package lime.tools;\n\nimport haxe.io.Eof;\nimport haxe.Json;\nimport haxe.Serializer;\nimport haxe.Unserializer;\nimport hxp.*;\nimport lime.tools.Architecture;\nimport lime.tools.AssetType;\nimport lime.tools.Platform;\nimport sys.FileSystem;\nimport sys.io.File;\nimport sys.io.Process;\n#if (haxe_ver >= 4)\nimport haxe.xml.Access;\n#else\nimport haxe.xml.Fast as Access;\n#end\n#if (lime && lime_cffi && !macro)\nimport lime.text.Font;\n\n@:access(lime.text.Font)\n#end\nclass HXProject extends Script\n{\n\tpublic var app:ApplicationData;\n\tpublic var architectures:Array<Architecture>;\n\tpublic var assets:Array<Asset>;\n\t// public var command:String;\n\tpublic var config:ConfigData;\n\tpublic var debug:Bool;\n\t// public var defines:Map<String, Dynamic>;\n\tpublic var dependencies:Array<Dependency>;\n\tpublic var environment:Map<String, String>;\n\tpublic var excludeArchitectures:Array<Architecture>;\n\tpublic var haxedefs:Map<String, Dynamic>;\n\tpublic var haxeflags:Array<String>;\n\tpublic var haxelibs:Array<Haxelib>;\n\tpublic var host(get, null):Platform;\n\tpublic var icons:Array<Icon>;\n\tpublic var javaPaths:Array<String>;\n\tpublic var keystore:Keystore;\n\tpublic var languages:Array<String>;\n\tpublic var launchStoryboard:LaunchStoryboard;\n\tpublic var libraries:Array<Library>;\n\tpublic var libraryHandlers:Map<String, String>;\n\tpublic var meta:MetaData;\n\tpublic var modules:Map<String, ModuleData>;\n\tpublic var ndlls:Array<NDLL>;\n\tpublic var platformType:PlatformType;\n\tpublic var postBuildCallbacks:Array<CLICommand>;\n\tpublic var preBuildCallbacks:Array<CLICommand>;\n\tpublic var samplePaths:Array<String>;\n\tpublic var sources:Array<String>;\n\tpublic var splashScreens:Array<SplashScreen>;\n\tpublic var target:Platform;\n\tpublic var targetFlags:Map<String, String>;\n\tpublic var targetHandlers:Map<String, String>;\n\tpublic var templateContext(get, null):Dynamic;\n\tpublic var templatePaths:Array<String>;\n\t@:isVar public var window(get, set):WindowData;\n\tpublic var windows:Array<WindowData>;\n\tpublic var projectFilePath:String;\n\n\tprivate var needRerun:Bool;\n\n\tpublic static var _command:String;\n\tpublic static var _debug:Bool;\n\tpublic static var _environment:Map<String, String>;\n\tpublic static var _target:Platform;\n\tpublic static var _targetFlags:Map<String, String>;\n\tpublic static var _templatePaths:Array<String>;\n\tpublic static var _userDefines:Map<String, Dynamic>;\n\n\tprivate static var initialized:Bool;\n\n\tpublic static function main()\n\t{\n\t\tvar args = Sys.args();\n\n\t\tif (args.length < 2)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar inputData = Unserializer.run(File.getContent(args[0]));\n\t\tvar outputFile = args[1];\n\n\t\tHXProject._command = inputData.command;\n\t\tHXProject._target = inputData.target;\n\t\tHXProject._debug = inputData.debug;\n\t\tHXProject._targetFlags = inputData.targetFlags;\n\t\tHXProject._templatePaths = inputData.templatePaths;\n\t\tHXProject._userDefines = inputData.userDefines;\n\t\tHXProject._environment = inputData.environment;\n\t\tLog.verbose = inputData.logVerbose;\n\t\tLog.enableColor = inputData.logEnableColor;\n\n\t\t#if lime\n\t\tSystem.dryRun = inputData.processDryRun;\n\t\t#end\n\n\t\tHaxelib.debug = inputData.haxelibDebug;\n\n\t\tinitializeStatics();\n\n\t\tvar classRef = Type.resolveClass(inputData.name);\n\t\tif (classRef == null)\n\t\t{\n\t\t\tLog.error('Unable to find class ${ inputData.name } in ${ inputData.projectFile }');\n\t\t\treturn;\n\t\t}\n\t\tvar instance = Type.createInstance(classRef, []);\n\n\t\tvar serializer = new Serializer();\n\t\tserializer.useCache = true;\n\t\tserializer.serialize(instance);\n\n\t\tFile.saveContent(outputFile, serializer.toString());\n\t}\n\n\tpublic function new(defines:Map<String, Dynamic> = null)\n\t{\n\t\tsuper();\n\n\t\tinitializeStatics();\n\n\t\tcommand = _command;\n\t\tconfig = new ConfigData();\n\t\tdebug = _debug;\n\t\ttarget = _target;\n\t\ttargetFlags = MapTools.copy(_targetFlags);\n\t\ttemplatePaths = _templatePaths.copy();\n\n\t\tplatformType = PlatformType.DESKTOP;\n\t\tarchitectures = [];\n\t\texcludeArchitectures = [];\n\n\t\tplatformType = switch (target)\n\t\t{\n\t\t\tcase AIR if (targetFlags.exists(\"ios\") || targetFlags.exists(\"android\")):\n\t\t\t\tPlatformType.MOBILE;\n\n\t\t\tcase FLASH, HTML5, FIREFOX, WEB_ASSEMBLY:\n\t\t\t\tPlatformType.WEB;\n\n\t\t\tcase ANDROID, BLACKBERRY, IOS, TIZEN, WEBOS, TVOS:\n\t\t\t\tPlatformType.MOBILE;\n\n\t\t\tcase WINDOWS, MAC, LINUX, AIR:\n\t\t\t\tPlatformType.DESKTOP;\n\n\t\t\tdefault:\n\t\t\t\t// TODO: Better handling of platform type for pluggable targets\n\t\t\t\tPlatformType.CONSOLE;\n\t\t}\n\n\t\tif (target == WINDOWS && targetFlags.exists(\"uwp\") || targetFlags.exists(\"winjs\"))\n\t\t{\n\t\t\ttargetFlags.set(\"uwp\", \"\");\n\t\t\ttargetFlags.set(\"winjs\", \"\");\n\t\t}\n\n\t\tmeta = {};\n\t\tapp = {};\n\t\twindow = {};\n\t\twindows = [window];\n\t\tassets = new Array<Asset>();\n\n\t\tif (defines != null)\n\t\t{\n\t\t\tthis.defines = MapTools.copy(defines);\n\t\t}\n\t\telse if (_userDefines != null)\n\t\t{\n\t\t\tthis.defines = MapTools.copy(_userDefines);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.defines = new Map<String, String>();\n\t\t}\n\n\t\tdependencies = new Array<Dependency>();\n\n\t\tif (_environment != null)\n\t\t{\n\t\t\tenvironment = _environment;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tenvironment = Sys.environment();\n\t\t\tfor (conflict in [\"air\", \"android\", \"cpp\", \"flash\", \"hl\", \"html5\", \"ios\", \"linux\", \"mac\", \"neko\", \"webassembly\", \"windows\"])\n\t\t\t{\n\t\t\t\tenvironment.remove(conflict);\n\t\t\t}\n\t\t}\n\n\t\thaxedefs = new Map<String, Dynamic>();\n\t\thaxeflags = new Array<String>();\n\t\thaxelibs = new Array<Haxelib>();\n\t\ticons = new Array<Icon>();\n\t\tjavaPaths = new Array<String>();\n\t\tlanguages = new Array<String>();\n\t\tlibraries = new Array<Library>();\n\t\tlibraryHandlers = new Map<String, String>();\n\t\tmodules = new Map<String, ModuleData>();\n\t\tndlls = new Array<NDLL>();\n\t\tpostBuildCallbacks = new Array<CLICommand>();\n\t\tpreBuildCallbacks = new Array<CLICommand>();\n\t\tsources = new Array<String>();\n\t\tsamplePaths = new Array<String>();\n\t\tsplashScreens = new Array<SplashScreen>();\n\t\ttargetHandlers = new Map<String, String>();\n\n\t\tinitializeDefines();\n\t}\n\n\tpublic function clone():HXProject\n\t{\n\t\tvar project = new HXProject();\n\n\t\tObjectTools.copyFields(app, project.app);\n\t\tproject.architectures = architectures.copy();\n\t\tproject.assets = assets.copy();\n\n\t\tfor (i in 0...assets.length)\n\t\t{\n\t\t\tproject.assets[i] = assets[i].clone();\n\t\t}\n\n\t\tproject.command = command;\n\t\tproject.config = config.clone();\n\t\tproject.debug = debug;\n\n\t\tfor (key in defines.keys())\n\t\t{\n\t\t\tproject.defines.set(key, defines.get(key));\n\t\t}\n\n\t\tfor (dependency in dependencies)\n\t\t{\n\t\t\tproject.dependencies.push(dependency.clone());\n\t\t}\n\n\t\tfor (key in environment.keys())\n\t\t{\n\t\t\tproject.environment.set(key, environment.get(key));\n\t\t}\n\n\t\tproject.excludeArchitectures = excludeArchitectures.copy();\n\n\t\tfor (key in haxedefs.keys())\n\t\t{\n\t\t\tproject.haxedefs.set(key, haxedefs.get(key));\n\t\t}\n\n\t\tproject.haxeflags = haxeflags.copy();\n\n\t\tfor (haxelib in haxelibs)\n\t\t{\n\t\t\tproject.haxelibs.push(haxelib.clone());\n\t\t}\n\n\t\tfor (icon in icons)\n\t\t{\n\t\t\tproject.icons.push(icon.clone());\n\t\t}\n\n\t\tproject.javaPaths = javaPaths.copy();\n\n\t\tif (keystore != null)\n\t\t{\n\t\t\tproject.keystore = keystore.clone();\n\t\t}\n\n\t\tproject.languages = languages.copy();\n\n\t\tif (launchStoryboard != null)\n\t\t{\n\t\t\tproject.launchStoryboard = launchStoryboard.clone();\n\t\t}\n\n\t\tfor (library in libraries)\n\t\t{\n\t\t\tproject.libraries.push(library.clone());\n\t\t}\n\n\t\tfor (key in libraryHandlers.keys())\n\t\t{\n\t\t\tproject.libraryHandlers.set(key, libraryHandlers.get(key));\n\t\t}\n\n\t\tObjectTools.copyFields(meta, project.meta);\n\n\t\tfor (key in modules.keys())\n\t\t{\n\t\t\tproject.modules.set(key, modules.get(key).clone());\n\t\t}\n\n\t\tfor (ndll in ndlls)\n\t\t{\n\t\t\tproject.ndlls.push(ndll.clone());\n\t\t}\n\n\t\tproject.platformType = platformType;\n\t\tproject.postBuildCallbacks = postBuildCallbacks.copy();\n\t\tproject.preBuildCallbacks = preBuildCallbacks.copy();\n\t\tproject.samplePaths = samplePaths.copy();\n\t\tproject.sources = sources.copy();\n\n\t\tfor (splashScreen in splashScreens)\n\t\t{\n\t\t\tproject.splashScreens.push(splashScreen.clone());\n\t\t}\n\n\t\tproject.target = target;\n\n\t\tfor (key in targetFlags.keys())\n\t\t{\n\t\t\tproject.targetFlags.set(key, targetFlags.get(key));\n\t\t}\n\n\t\tfor (key in targetHandlers.keys())\n\t\t{\n\t\t\tproject.targetHandlers.set(key, targetHandlers.get(key));\n\t\t}\n\n\t\tproject.templatePaths = templatePaths.copy();\n\n\t\tfor (i in 0...windows.length)\n\t\t{\n\t\t\tproject.windows[i] = (ObjectTools.copyFields(windows[i], {}));\n\t\t}\n\n\t\treturn project;\n\t}\n\n\tprivate function filter(text:String, include:Array<String> = null, exclude:Array<String> = null):Bool\n\t{\n\t\tif (include == null)\n\t\t{\n\t\t\tinclude = [\"*\"];\n\t\t}\n\n\t\tif (exclude == null)\n\t\t{\n\t\t\texclude = [];\n\t\t}\n\n\t\tfor (filter in exclude)\n\t\t{\n\t\t\tif (filter != \"\")\n\t\t\t{\n\t\t\t\tfilter = StringTools.replace(filter, \".\", \"\\\\.\");\n\t\t\t\tfilter = StringTools.replace(filter, \"*\", \".*\");\n\n\t\t\t\tvar regexp = new EReg(\"^\" + filter + \"$\", \"i\");\n\n\t\t\t\tif (regexp.match(text))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (filter in include)\n\t\t{\n\t\t\tif (filter != \"\")\n\t\t\t{\n\t\t\t\tfilter = StringTools.replace(filter, \".\", \"\\\\.\");\n\t\t\t\tfilter = StringTools.replace(filter, \"*\", \".*\");\n\n\t\t\t\tvar regexp = new EReg(\"^\" + filter, \"i\");\n\n\t\t\t\tif (regexp.match(text))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic static function fromFile(projectFile:String, userDefines:Map<String, Dynamic> = null, includePaths:Array<String> = null):HXProject\n\t{\n\t\tvar project:HXProject = null;\n\n\t\tvar path = FileSystem.fullPath(Path.withoutDirectory(projectFile));\n\t\tvar name = Path.withoutDirectory(Path.withoutExtension(projectFile));\n\t\tname = name.charAt(0).toUpperCase() + name.substr(1);\n\n\t\tvar tempDirectory = FileSystem.fullPath(System.getTemporaryDirectory());\n\t\tvar classFile = Path.combine(tempDirectory, name + \".hx\");\n\n\t\tSystem.copyFile(path, classFile);\n\n\t\tvar args = [\n\t\t\tname,\n\t\t\t#if lime\n\t\t\t\"-lib\", \"lime\",\n\t\t\t\"-lib\", \"hxp\",\n\t\t\t#end\n\t\t\t\"-cp\", tempDirectory,\n\t\t\t\"-cp\", Path.combine(Haxelib.getPath(new Haxelib(\"hxp\")), \"src\")\n\t\t];\n\t\tvar input = File.read(classFile, false);\n\t\tvar tag = \"@:compiler(\";\n\n\t\ttry\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tvar line = input.readLine();\n\n\t\t\t\tif (StringTools.startsWith(line, tag))\n\t\t\t\t{\n\t\t\t\t\targs.push(line.substring(tag.length + 1, line.length - 2));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (ex:Eof) {}\n\n\t\tinput.close();\n\n\t\tvar cacheDryRun = System.dryRun;\n\t\tSystem.dryRun = false;\n\n\t\tvar inputFile = Path.combine(tempDirectory, \"input.dat\");\n\t\tvar outputFile = Path.combine(tempDirectory, \"output.dat\");\n\n\t\tvar inputData = Serializer.run(\n\t\t\t{\n\t\t\t\tcommand: HXProject._command,\n\t\t\t\tname: name,\n\t\t\t\ttarget: HXProject._target,\n\t\t\t\tdebug: HXProject._debug,\n\t\t\t\tprojectFile: projectFile,\n\t\t\t\ttargetFlags: HXProject._targetFlags,\n\t\t\t\ttemplatePaths: HXProject._templatePaths,\n\t\t\t\tuserDefines: HXProject._userDefines,\n\t\t\t\tenvironment: HXProject._environment,\n\t\t\t\tlogVerbose: Log.verbose,\n\t\t\t\tlogEnableColor: Log.enableColor,\n\t\t\t\tprocessDryRun: cacheDryRun,\n\t\t\t\thaxelibDebug: Haxelib.debug\n\t\t\t});\n\n\t\tFile.saveContent(inputFile, inputData);\n\n\t\ttry\n\t\t{\n\t\t\t#if (lime && !eval)\n\t\t\tvar nekoOutput = Path.combine(tempDirectory, name + \".n\");\n\t\t\tSystem.runCommand(\"\", \"haxe\", args.concat([\"-main\", \"lime.tools.HXProject\", \"-neko\", nekoOutput]));\n\t\t\tSystem.runCommand(\"\", \"neko\", [nekoOutput, inputFile, outputFile]);\n\t\t\t#else\n\t\t\tSystem.runCommand(\"\", \"haxe\", args.concat([\"--run\", \"lime.tools.HXProject\", inputFile, outputFile]));\n\t\t\t#end\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\tLog.error(Std.string(e));\n\t\t\tFileSystem.deleteFile(inputFile);\n\t\t\tSys.exit(1);\n\t\t}\n\n\t\tSystem.dryRun = cacheDryRun;\n\n\t\tvar tPaths:Array<String> = [];\n\n\t\ttry\n\t\t{\n\t\t\tFileSystem.deleteFile(inputFile);\n\n\t\t\tvar outputPath = Path.combine(tempDirectory, \"output.dat\");\n\n\t\t\tif (FileSystem.exists(outputPath))\n\t\t\t{\n\t\t\t\tvar output = File.getContent(outputPath);\n\t\t\t\tvar unserializer = new Unserializer(output);\n\t\t\t\tunserializer.setResolver(cast {resolveEnum: Type.resolveEnum, resolveClass: resolveClass});\n\t\t\t\tproject = unserializer.unserialize();\n\n\t\t\t\t// Because the project file template paths need to take priority,\n\t\t\t\t// Add them after loading template paths from haxelibs below\n\t\t\t\ttPaths = project.templatePaths;\n\t\t\t\tproject.templatePaths = [];\n\n\t\t\t\tFileSystem.deleteFile(outputPath);\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\tSystem.removeDirectory(tempDirectory);\n\n\t\tif (project != null)\n\t\t{\n\t\t\tfor (key in project.environment.keys())\n\t\t\t{\n\t\t\t\tSys.putEnv(key, project.environment[key]);\n\t\t\t}\n\n\t\t\tvar defines = MapTools.copyDynamic(userDefines);\n\t\t\tMapTools.copyKeys(project.defines, defines);\n\n\t\t\tprocessHaxelibs(project, defines);\n\n\t\t\t// Adding template paths from the Project file\n\t\t\tproject.templatePaths = ArrayTools.concatUnique(project.templatePaths, tPaths, true);\n\t\t}\n\n\t\treturn project;\n\t}\n\n\tpublic static function fromHaxelib(haxelib:Haxelib, userDefines:Map<String, Dynamic> = null, clearCache:Bool = false):HXProject\n\t{\n\t\tif (haxelib.name == null || haxelib.name == \"\")\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tvar path = Haxelib.getPath(haxelib, false, clearCache);\n\n\t\tif (path == null || path == \"\")\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\t// if (!userDefines.exists (haxelib.name)) {\n\t\t//\n\t\t// userDefines.set (haxelib.name, Haxelib.getVersion (haxelib));\n\t\t//\n\t\t// }\n\n\t\treturn HXProject.fromPath(path, userDefines);\n\t}\n\n\tpublic static function fromPath(directory:String, userDefines:Map<String, Dynamic> = null):HXProject\n\t{\n\t\tif (!FileSystem.exists(directory) || !FileSystem.isDirectory(directory))\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tvar files = [\"include.lime\", \"include.nmml\", \"include.xml\", \"include.hxp\"];\n\t\tvar projectFile:String = null;\n\n\t\tfor (file in files)\n\t\t{\n\t\t\tif (FileSystem.exists(Path.combine(directory, file)))\n\t\t\t{\n\t\t\t\tprojectFile = Path.combine(directory, file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar project:HXProject = null;\n\n\t\tif (projectFile != null)\n\t\t{\n\t\t\tif (StringTools.endsWith(projectFile, \".hxp\"))\n\t\t\t{\n\t\t\t\tvar cwd = Sys.getCwd();\n\t\t\t\tSys.setCwd(directory);\n\t\t\t\tproject = HXProject.fromFile(projectFile, userDefines);\n\t\t\t\tSys.setCwd(cwd);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tproject = new ProjectXMLParser(projectFile, userDefines);\n\t\t\t}\n\n\t\t\tif (project.config.get(\"project.rebuild.path\") == null)\n\t\t\t{\n\t\t\t\tproject.config.set(\"project.rebuild.path\", Path.combine(directory, \"project\"));\n\t\t\t}\n\t\t}\n\n\t\treturn project;\n\t}\n\n\tprivate function getHaxelibVersion(haxelib:Haxelib):String\n\t{\n\t\tvar version = haxelib.version;\n\n\t\tif (version == \"\" || version == null)\n\t\t{\n\t\t\tvar haxelibPath = Haxelib.getPath(haxelib);\n\t\t\tvar jsonPath = Path.combine(haxelibPath, \"haxelib.json\");\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (FileSystem.exists(jsonPath))\n\t\t\t\t{\n\t\t\t\t\tvar json = Json.parse(File.getContent(jsonPath));\n\t\t\t\t\tversion = json.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\treturn version;\n\t}\n\n\tpublic function include(path:String):Void\n\t{\n\t\t// extend project file somehow?\n\t}\n\n\tpublic function includeAssets(path:String, rename:String = null, include:Array<String> = null, exclude:Array<String> = null):Void\n\t{\n\t\tif (include == null)\n\t\t{\n\t\t\tinclude = [\"*\"];\n\t\t}\n\n\t\tif (exclude == null)\n\t\t{\n\t\t\texclude = [];\n\t\t}\n\n\t\texclude = exclude.concat([\".*\", \"cvs\", \"thumbs.db\", \"desktop.ini\", \"*.hash\"]);\n\n\t\tif (path == \"\")\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar targetPath = \"\";\n\n\t\tif (rename != null)\n\t\t{\n\t\t\ttargetPath = rename;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetPath = path;\n\t\t}\n\n\t\tif (!FileSystem.exists(path))\n\t\t{\n\t\t\tLog.error(\"Could not find asset path \\\"\" + path + \"\\\"\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar files = FileSystem.readDirectory(path);\n\n\t\tif (targetPath != \"\")\n\t\t{\n\t\t\ttargetPath += \"/\";\n\t\t}\n\n\t\tfor (file in files)\n\t\t{\n\t\t\tif (FileSystem.isDirectory(path + \"/\" + file))\n\t\t\t{\n\t\t\t\tif (filter(file, [\"*\"], exclude))\n\t\t\t\t{\n\t\t\t\t\tincludeAssets(path + \"/\" + file, targetPath + file, include, exclude);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (filter(file, include, exclude))\n\t\t\t\t{\n\t\t\t\t\tassets.push(new Asset(path + \"/\" + file, targetPath + file));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// #if lime\n\tpublic function includeXML(xml:String):Void\n\t{\n\t\tvar projectXML = new ProjectXMLParser();\n\t\t@:privateAccess projectXML.parseXML(new Access(Xml.parse(xml).firstElement()), \"\");\n\t\tmerge(projectXML);\n\t}\n\t// #end\n\n\tprivate function initializeDefines():Void\n\t{\n\t\tswitch (platformType)\n\t\t{\n\t\t\tcase MOBILE:\n\t\t\t\tdefines.set(\"platformType\", \"mobile\");\n\t\t\t\tdefines.set(\"mobile\", \"1\");\n\n\t\t\tcase DESKTOP:\n\t\t\t\tdefines.set(\"platformType\", \"desktop\");\n\t\t\t\tdefines.set(\"desktop\", \"1\");\n\n\t\t\tcase WEB:\n\t\t\t\tdefines.set(\"platformType\", \"web\");\n\t\t\t\tdefines.set(\"web\", \"1\");\n\n\t\t\tcase CONSOLE:\n\t\t\t\tdefines.set(\"platformType\", \"console\");\n\t\t\t\tdefines.set(\"console\", \"1\");\n\t\t}\n\n\t\tif (targetFlags.exists(\"neko\"))\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"neko\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"neko\", \"1\");\n\t\t}\n\t\telse if (targetFlags.exists(\"hl\"))\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"hl\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"hl\", \"1\");\n\t\t\tif (targetFlags.exists(\"hlc\"))\n\t\t\t{\n\t\t\t\tdefines.set(\"hlc\", \"1\");\n\t\t\t}\n\t\t}\n\t\telse if (targetFlags.exists(\"java\"))\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"java\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"java\", \"1\");\n\t\t}\n\t\telse if (targetFlags.exists(\"nodejs\"))\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"nodejs\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"nodejs\", \"1\");\n\t\t}\n\t\telse if (targetFlags.exists(\"cs\"))\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"cs\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"cs\", \"1\");\n\t\t}\n\t\telse if (target == Platform.FIREFOX)\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"js\");\n\t\t\tdefines.set(\"html5\", \"1\");\n\t\t}\n\t\telse if (target == Platform.AIR)\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"swf\");\n\t\t\tdefines.set(\"flash\", \"1\");\n\t\t\tif (targetFlags.exists(\"ios\")) defines.set(\"ios\", \"1\");\n\t\t\tif (targetFlags.exists(\"android\")) defines.set(\"android\", \"1\");\n\t\t}\n\t\telse if (target == Platform.WINDOWS && (targetFlags.exists(\"uwp\") || targetFlags.exists(\"winjs\")))\n\t\t{\n\t\t\ttargetFlags.set(\"uwp\", \"\");\n\t\t\ttargetFlags.set(\"winjs\", \"\");\n\n\t\t\tdefines.set(\"targetType\", \"js\");\n\t\t\tdefines.set(\"html5\", \"1\");\n\t\t\tdefines.set(\"uwp\", \"1\");\n\t\t\tdefines.set(\"winjs\", \"1\");\n\t\t}\n\t\telse if (platformType == DESKTOP && target != System.hostPlatform)\n\t\t{\n\t\t\tdefines.set(\"native\", \"1\");\n\n\t\t\tif (target == Platform.LINUX && targetFlags.exists(\"cpp\"))\n\t\t\t{\n\t\t\t\tdefines.set(\"targetType\", \"cpp\");\n\t\t\t\tdefines.set(\"cpp\", \"1\");\n\t\t\t}\n\t\t\telse if (target == Platform.WINDOWS && (targetFlags.exists(\"cpp\") || targetFlags.exists(\"mingw\")))\n\t\t\t{\n\t\t\t\tdefines.set(\"targetType\", \"cpp\");\n\t\t\t\tdefines.set(\"cpp\", \"1\");\n\t\t\t\tdefines.set(\"mingw\", \"1\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttargetFlags.set(\"neko\", \"1\");\n\n\t\t\t\tdefines.set(\"targetType\", \"neko\");\n\t\t\t\tdefines.set(\"neko\", \"1\");\n\t\t\t}\n\t\t}\n\t\telse if (target == Platform.WEB_ASSEMBLY)\n\t\t{\n\t\t\tdefines.set(\"webassembly\", \"1\");\n\t\t\tdefines.set(\"wasm\", \"1\");\n\t\t\tdefines.set(\"emscripten\", \"1\");\n\t\t\tdefines.set(\"targetType\", \"cpp\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"cpp\", \"1\");\n\t\t}\n\t\telse if (targetFlags.exists(\"cpp\")\n\t\t\t|| ((platformType != PlatformType.WEB) && !targetFlags.exists(\"html5\")))\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"cpp\");\n\t\t\tdefines.set(\"native\", \"1\");\n\t\t\tdefines.set(\"cpp\", \"1\");\n\t\t}\n\t\telse if (target == Platform.FLASH)\n\t\t{\n\t\t\tdefines.set(\"targetType\", \"swf\");\n\t\t}\n\n\t\tif (debug)\n\t\t{\n\t\t\tdefines.set(\"buildType\", \"debug\");\n\t\t\tdefines.set(\"debug\", \"1\");\n\t\t}\n\t\telse if (targetFlags.exists(\"final\"))\n\t\t{\n\t\t\tdefines.set(\"buildType\", \"final\");\n\t\t\tdefines.set(\"final\", \"1\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdefines.set(\"buildType\", \"release\");\n\t\t\tdefines.set(\"release\", \"1\");\n\t\t}\n\n\t\tif (targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tdefines.set(\"static_link\", \"1\");\n\t\t}\n\n\t\tif (defines.exists(\"SWF_PLAYER\"))\n\t\t{\n\t\t\tenvironment.set(\"SWF_PLAYER\", defines.get(\"SWF_PLAYER\"));\n\t\t}\n\n\t\tdefines.set(Std.string(target).toLowerCase(), \"1\");\n\t\tdefines.set(\"target\", Std.string(target).toLowerCase());\n\t\tdefines.set(\"platform\", defines.get(\"target\"));\n\n\t\tswitch (System.hostPlatform)\n\t\t{\n\t\t\tcase WINDOWS:\n\t\t\t\tdefines.set(\"host\", \"windows\");\n\t\t\tcase MAC:\n\t\t\t\tdefines.set(\"host\", \"mac\");\n\t\t\tcase LINUX:\n\t\t\t\tdefines.set(\"host\", \"linux\");\n\t\t\tdefault:\n\t\t\t\tdefines.set(\"host\", \"unknown\");\n\t\t}\n\n\t\t#if lime\n\t\tdefines.set(\"lime-tools\", \"1\");\n\t\t#end\n\n\t\tdefines.set(\"hxp\", \"1\"); // TODO: Version?\n\t}\n\n\tprivate static function initializeStatics():Void\n\t{\n\t\tif (!initialized)\n\t\t{\n\t\t\tif (_target == null)\n\t\t\t{\n\t\t\t\t_target = System.hostPlatform;\n\t\t\t}\n\n\t\t\tif (_targetFlags == null)\n\t\t\t{\n\t\t\t\t_targetFlags = new Map<String, String>();\n\t\t\t}\n\n\t\t\tif (_templatePaths == null)\n\t\t\t{\n\t\t\t\t_templatePaths = new Array<String>();\n\t\t\t}\n\n\t\t\tinitialized = true;\n\t\t}\n\t}\n\n\tpublic function merge(project:HXProject):Void\n\t{\n\t\tif (project != null)\n\t\t{\n\t\t\tObjectTools.copyFields(project.meta, meta);\n\t\t\tObjectTools.copyFields(project.app, app);\n\n\t\t\tfor (i in 0...project.windows.length)\n\t\t\t{\n\t\t\t\tif (i < windows.length)\n\t\t\t\t{\n\t\t\t\t\tObjectTools.copyFields(project.windows[i], windows[i]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twindows.push(ObjectTools.copyFields(project.windows[i], {}));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tMapTools.copyUniqueKeys(project.defines, defines);\n\t\t\tMapTools.copyUniqueKeys(project.environment, environment);\n\t\t\tMapTools.copyUniqueKeysDynamic(project.haxedefs, haxedefs);\n\t\t\tMapTools.copyUniqueKeys(project.libraryHandlers, libraryHandlers);\n\t\t\tMapTools.copyUniqueKeys(project.targetFlags, targetFlags);\n\t\t\tMapTools.copyUniqueKeys(project.targetHandlers, targetHandlers);\n\n\t\t\tconfig.merge(project.config);\n\n\t\t\tarchitectures = ArrayTools.concatUnique(architectures, project.architectures);\n\t\t\tassets = ArrayTools.concatUnique(assets, project.assets);\n\t\t\tdependencies = ArrayTools.concatUnique(dependencies, project.dependencies, true);\n\t\t\texcludeArchitectures = ArrayTools.concatUnique(excludeArchitectures, project.excludeArchitectures);\n\t\t\thaxeflags = ArrayTools.concatUnique(haxeflags, project.haxeflags);\n\t\t\thaxelibs = ArrayTools.concatUnique(haxelibs, project.haxelibs, true, \"name\");\n\t\t\ticons = ArrayTools.concatUnique(icons, project.icons);\n\t\t\tjavaPaths = ArrayTools.concatUnique(javaPaths, project.javaPaths, true);\n\n\t\t\tif (keystore == null)\n\t\t\t{\n\t\t\t\tkeystore = project.keystore;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tkeystore.merge(project.keystore);\n\t\t\t}\n\n\t\t\tif (launchStoryboard == null)\n\t\t\t{\n\t\t\t\tlaunchStoryboard = project.launchStoryboard;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlaunchStoryboard.merge(project.launchStoryboard);\n\t\t\t}\n\n\t\t\tif (projectFilePath == null)\n\t\t\t{\n\t\t\t\tprojectFilePath = project.projectFilePath;\n\t\t\t}\n\n\t\t\tlanguages = ArrayTools.concatUnique(languages, project.languages, true);\n\t\t\tlibraries = ArrayTools.concatUnique(libraries, project.libraries, true);\n\n\t\t\tfor (key in project.modules.keys())\n\t\t\t{\n\t\t\t\tif (modules.exists(key))\n\t\t\t\t{\n\t\t\t\t\tmodules.get(key).merge(project.modules.get(key));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmodules.set(key, project.modules.get(key));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tndlls = ArrayTools.concatUnique(ndlls, project.ndlls);\n\t\t\tpostBuildCallbacks = postBuildCallbacks.concat(project.postBuildCallbacks);\n\t\t\tpreBuildCallbacks = preBuildCallbacks.concat(project.preBuildCallbacks);\n\t\t\tsamplePaths = ArrayTools.concatUnique(samplePaths, project.samplePaths, true);\n\t\t\tsources = ArrayTools.concatUnique(sources, project.sources, true);\n\t\t\tsplashScreens = ArrayTools.concatUnique(splashScreens, project.splashScreens);\n\t\t\ttemplatePaths = ArrayTools.concatUnique(templatePaths, project.templatePaths, true);\n\t\t}\n\t}\n\n\tpublic function path(value:String):Void\n\t{\n\t\tif (host == Platform.WINDOWS)\n\t\t{\n\t\t\tsetenv(\"PATH\", value + \";\" + Sys.getEnv(\"PATH\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsetenv(\"PATH\", value + \":\" + Sys.getEnv(\"PATH\"));\n\t\t}\n\t}\n\n\t// #if lime\n\t@:noCompletion private static function processHaxelibs(project:HXProject, userDefines:Map<String, Dynamic>):Void\n\t{\n\t\tvar haxelibs = project.haxelibs.copy();\n\t\tproject.haxelibs = [];\n\n\t\tfor (haxelib in haxelibs)\n\t\t{\n\t\t\tvar validatePath = Haxelib.getPath(haxelib, true);\n\t\t\tproject.haxelibs.push(haxelib);\n\n\t\t\tvar includeProject = HXProject.fromHaxelib(haxelib, userDefines);\n\n\t\t\tif (includeProject != null)\n\t\t\t{\n\t\t\t\tfor (ndll in includeProject.ndlls)\n\t\t\t\t{\n\t\t\t\t\tif (ndll.haxelib == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tndll.haxelib = haxelib;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tproject.merge(includeProject);\n\t\t\t}\n\t\t}\n\t}\n\n\t@:noCompletion private static function resolveClass(name:String):Class<Dynamic>\n\t{\n\t\tvar type = Type.resolveClass(name);\n\n\t\tif (type == null)\n\t\t{\n\t\t\treturn HXProject;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn type;\n\t\t}\n\t}\n\n\t// #end\n\tpublic function setenv(name:String, value:String):Void\n\t{\n\t\tif (value == null)\n\t\t{\n\t\t\tenvironment.remove(name);\n\t\t\tvalue = \"\";\n\t\t}\n\n\t\tif (name == \"HAXELIB_PATH\")\n\t\t{\n\t\t\tvar currentPath = Haxelib.getRepositoryPath();\n\t\t\tSys.putEnv(name, value);\n\t\t\tvar newPath = Haxelib.getRepositoryPath(true);\n\n\t\t\tif (currentPath != newPath)\n\t\t\t{\n\t\t\t\tvar valid = try\n\t\t\t\t{\n\t\t\t\t\t(newPath != null && newPath != \"\" && FileSystem.exists(FileSystem.fullPath(newPath)));\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\tfalse;\n\t\t\t\t}\n\n\t\t\t\tif (!valid)\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"The specified haxelib repository path \\\"\" + value + \"\\\" does not exist\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tneedRerun = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.putEnv(name, value);\n\t\t}\n\n\t\tif (value != \"\")\n\t\t{\n\t\t\tenvironment.set(name, value);\n\t\t}\n\t}\n\n\t// Getters & Setters\n\tprivate function get_host():Platform\n\t{\n\t\treturn System.hostPlatform;\n\t}\n\n\tprivate function get_templateContext():Dynamic\n\t{\n\t\tvar context:Dynamic = {};\n\n\t\tif (app == null) app = {};\n\t\tif (meta == null) meta = {};\n\n\t\tif (window == null)\n\t\t{\n\t\t\twindow = {};\n\t\t\twindows = [window];\n\t\t}\n\n\t\t// config.populate ();\n\n\t\tfor (field in Reflect.fields(app))\n\t\t{\n\t\t\tReflect.setField(context, \"APP_\" + StringTools.formatUppercaseVariable(field), Reflect.field(app, field));\n\t\t}\n\n\t\tcontext.BUILD_DIR = app.path;\n\n\t\tfor (key in environment.keys())\n\t\t{\n\t\t\tReflect.setField(context, \"ENV_\" + key, environment.get(key));\n\t\t}\n\n\t\tcontext.meta = meta;\n\n\t\tfor (field in Reflect.fields(meta))\n\t\t{\n\t\t\tReflect.setField(context, \"APP_\" + StringTools.formatUppercaseVariable(field), Reflect.field(meta, field));\n\t\t\tReflect.setField(context, \"META_\" + StringTools.formatUppercaseVariable(field), Reflect.field(meta, field));\n\t\t}\n\n\t\tcontext.APP_PACKAGE = context.META_PACKAGE = meta.packageName;\n\n\t\tfor (field in Reflect.fields(windows[0]))\n\t\t{\n\t\t\tReflect.setField(context, \"WIN_\" + StringTools.formatUppercaseVariable(field), Reflect.field(windows[0], field));\n\t\t\tReflect.setField(context, \"WINDOW_\" + StringTools.formatUppercaseVariable(field), Reflect.field(windows[0], field));\n\t\t}\n\n\t\tif (windows[0].orientation == Orientation.LANDSCAPE || windows[0].orientation == Orientation.PORTRAIT)\n\t\t{\n\t\t\tcontext.WIN_ORIENTATION = Std.string(windows[0].orientation).toLowerCase();\n\t\t\tcontext.WINDOW_ORIENTATION = Std.string(windows[0].orientation).toLowerCase();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcontext.WIN_ORIENTATION = \"auto\";\n\t\t\tcontext.WINDOW_ORIENTATION = \"auto\";\n\t\t}\n\n\t\tcontext.windows = windows;\n\n\t\tfor (i in 0...windows.length)\n\t\t{\n\t\t\tfor (field in Reflect.fields(windows[i]))\n\t\t\t{\n\t\t\t\tReflect.setField(context, \"WINDOW_\" + StringTools.formatUppercaseVariable(field) + \"_\" + i, Reflect.field(windows[i], field));\n\t\t\t}\n\n\t\t\tif (windows[i].orientation == Orientation.LANDSCAPE || windows[i].orientation == Orientation.PORTRAIT)\n\t\t\t{\n\t\t\t\tReflect.setField(context, \"WINDOW_ORIENTATION_\" + i, Std.string(windows[i].orientation).toLowerCase());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tReflect.setField(context, \"WINDOW_ORIENTATION_\" + i, \"\");\n\t\t\t}\n\n\t\t\tif (windows[i].title == \"\") windows[i].title = meta.title;\n\t\t}\n\n\t\tfor (haxeflag in haxeflags)\n\t\t{\n\t\t\tif (StringTools.startsWith(haxeflag, \"-lib\"))\n\t\t\t{\n\t\t\t\tReflect.setField(context, \"LIB_\" + StringTools.formatUppercaseVariable(haxeflag.substr(5)), \"true\");\n\t\t\t}\n\t\t}\n\n\t\tcontext.assets = new Array<Dynamic>();\n\n\t\tfor (asset in assets)\n\t\t{\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tvar embeddedAsset:Dynamic = {};\n\t\t\t\tObjectTools.copyFields(asset, embeddedAsset);\n\n\t\t\t\tembeddedAsset.sourcePath = Path.standardize(asset.sourcePath);\n\n\t\t\t\tif (asset.embed == null)\n\t\t\t\t{\n\t\t\t\t\tembeddedAsset.embed = (platformType == PlatformType.WEB || target == AIR);\n\t\t\t\t}\n\n\t\t\t\tembeddedAsset.type = Std.string(asset.type).toLowerCase();\n\n\t\t\t\t#if (lime && lime_cffi && !macro)\n\t\t\t\tif (asset.type == FONT)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvar font = Font.fromFile(asset.sourcePath);\n\t\t\t\t\t\tembeddedAsset.fontName = font.name;\n\n\t\t\t\t\t\tLog.info(\"\", \" - \\x1b[1mDetecting font name:\\x1b[0m \" + asset.sourcePath + \" \\x1b[3;37m->\\x1b[0m \\\"\" + font.name + \"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\t\t\t\t#end\n\n\t\t\t\tcontext.assets.push(embeddedAsset);\n\t\t\t}\n\t\t}\n\n\t\tcontext.languages = (languages.length > 0) ? languages : null;\n\t\tcontext.libraries = new Array<Dynamic>();\n\t\tvar embeddedLibraries = new Map<String, Dynamic>();\n\n\t\tfor (library in libraries)\n\t\t{\n\t\t\tvar embeddedLibrary:Dynamic = {};\n\t\t\tObjectTools.copyFields(library, embeddedLibrary);\n\t\t\tcontext.libraries.push(embeddedLibrary);\n\t\t\tembeddedLibraries[library.name] = embeddedLibrary;\n\t\t}\n\n\t\tfor (asset in assets)\n\t\t{\n\t\t\tif (asset.library != null && !embeddedLibraries.exists(asset.library))\n\t\t\t{\n\t\t\t\tvar embeddedLibrary:Dynamic = {};\n\t\t\t\tembeddedLibrary.name = asset.library;\n\t\t\t\tcontext.libraries.push(embeddedLibrary);\n\t\t\t\tembeddedLibraries[asset.library] = embeddedLibrary;\n\t\t\t}\n\t\t}\n\n\t\tcontext.ndlls = new Array<Dynamic>();\n\n\t\tfor (ndll in ndlls)\n\t\t{\n\t\t\tvar templateNDLL:Dynamic = {};\n\t\t\tObjectTools.copyFields(ndll, templateNDLL);\n\t\t\ttemplateNDLL.nameSafe = StringTools.replace(ndll.name, \"-\", \"_\");\n\t\t\tcontext.ndlls.push(templateNDLL);\n\t\t}\n\n\t\t// Reflect.setField (context, \"ndlls\", ndlls);\n\t\t// Reflect.setField (context, \"sslCaCert\", sslCaCert);\n\t\tcontext.sslCaCert = \"\";\n\n\t\tvar compilerFlags:Array<String> = [];\n\n\t\tfor (haxelib in haxelibs)\n\t\t{\n\t\t\tvar name = haxelib.name;\n\n\t\t\t// TODO: Handle real version when better/smarter haxelib available\n\t\t\tvar version = haxelib.version;\n\t\t\t// var version = Haxelib.getVersion (haxelib);\n\n\t\t\tif (version != null && version != \"\")\n\t\t\t{\n\t\t\t\tname += \":\" + version;\n\t\t\t}\n\n\t\t\t// #if lime\n\n\t\t\tif (Haxelib.pathOverrides.exists(name))\n\t\t\t{\n\t\t\t\tvar path = Haxelib.pathOverrides.get(name);\n\t\t\t\tvar jsonPath = Path.combine(path, \"haxelib.json\");\n\t\t\t\tvar added = false;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (FileSystem.exists(jsonPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar json = Json.parse(File.getContent(jsonPath));\n\t\t\t\t\t\tif (Reflect.hasField(json, \"classPath\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = Path.combine(path, json.classPath);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar haxelibName = json.name;\n\t\t\t\t\t\tcompilerFlags = ArrayTools.concatUnique(compilerFlags, [\"-D \" + haxelibName + \"=\" + json.version], true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\n\t\t\t\tvar param = \"-cp \" + path;\n\t\t\t\tcompilerFlags.remove(param);\n\t\t\t\tcompilerFlags.push(param);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar cache = Log.verbose;\n\t\t\t\tLog.verbose = Haxelib.debug;\n\t\t\t\tvar output = Haxelib.runProcess(\"\", [\"path\", name], true, true, true);\n\t\t\t\tLog.verbose = cache;\n\n\t\t\t\tvar split = output != null ? output.split(\"\\n\") : [];\n\t\t\t\tvar haxelibName:String = null;\n\n\t\t\t\tfor (arg in split)\n\t\t\t\t{\n\t\t\t\t\targ = StringTools.trim(arg);\n\n\t\t\t\t\tif (arg != \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tif (StringTools.startsWith(arg, \"Error: \"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.error(arg.substr(7));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!StringTools.startsWith(arg, \"-\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar path = Path.standardize(arg);\n\n\t\t\t\t\t\t\tif (path != null && StringTools.trim(path) != \"\" && !StringTools.startsWith(StringTools.trim(path), \"#\"))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar param = \"-cp \" + path;\n\t\t\t\t\t\t\t\tcompilerFlags.remove(param);\n\t\t\t\t\t\t\t\tcompilerFlags.push(param);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar version = \"0.0.0\";\n\t\t\t\t\t\t\tvar jsonPath = Path.combine(path, \"haxelib.json\");\n\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (FileSystem.exists(jsonPath))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tvar json = Json.parse(File.getContent(jsonPath));\n\t\t\t\t\t\t\t\t\thaxelibName = json.name;\n\t\t\t\t\t\t\t\t\tcompilerFlags = ArrayTools.concatUnique(compilerFlags, [\"-D \" + haxelibName + \"=\" + json.version], true);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (StringTools.startsWith(arg, \"-D \") && arg.indexOf(\"=\") == -1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar name = arg.substr(3);\n\n\t\t\t\t\t\t\t\tif (name != haxelibName)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcompilerFlags = ArrayTools.concatUnique(compilerFlags, [\"-D \" + name], true);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t/*var haxelib = new Haxelib (arg.substr (3));\n\t\t\t\t\t\t\t\t\tvar path = Haxelib.getPath (haxelib);\n\t\t\t\t\t\t\t\t\tvar version = getHaxelibVersion (haxelib);\n\n\t\t\t\t\t\t\t\t\tif (path != null) {\n\n\t\t\t\t\t\t\t\t\t\tCompatibilityHelper.patchProject (this, haxelib, version);\n\t\t\t\t\t\t\t\t\t\tcompilerFlags = ArrayTools.concatUnique (compilerFlags, [ \"-D \" + haxelib.name + \"=\" + version ], true);\n\n\t\t\t\t\t\t\t\t}*/\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!StringTools.startsWith(arg, \"-L\"))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcompilerFlags = ArrayTools.concatUnique(compilerFlags, [arg], true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// #else\n\n\t\t\t// compilerFlags.push (\"-lib \" + name);\n\n\t\t\t// #end\n\n\t\t\tReflect.setField(context, \"LIB_\" + StringTools.formatUppercaseVariable(haxelib.name), true);\n\n\t\t\tif (name == \"nme\")\n\t\t\t{\n\t\t\t\tcontext.EMBED_ASSETS = false;\n\t\t\t}\n\t\t}\n\n\t\tfor (source in sources)\n\t\t{\n\t\t\tif (source != null && StringTools.trim(source) != \"\")\n\t\t\t{\n\t\t\t\tcompilerFlags.push(\"-cp \" + source);\n\t\t\t}\n\t\t}\n\n\t\tfor (key in defines.keys())\n\t\t{\n\t\t\tvar value = defines.get(key);\n\n\t\t\tif (value == null || value == \"\")\n\t\t\t{\n\t\t\t\tReflect.setField(context, \"SET_\" + StringTools.formatUppercaseVariable(key), true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tReflect.setField(context, \"SET_\" + StringTools.formatUppercaseVariable(key), value);\n\t\t\t}\n\t\t}\n\n\t\tfor (key in haxedefs.keys())\n\t\t{\n\t\t\tvar value = haxedefs.get(key);\n\n\t\t\tif (value == null || value == \"\")\n\t\t\t{\n\t\t\t\tcompilerFlags.push(\"-D \" + key);\n\n\t\t\t\tReflect.setField(context, \"DEFINE_\" + StringTools.formatUppercaseVariable(key), true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcompilerFlags.push(\"-D \" + key + \"=\" + value);\n\n\t\t\t\tReflect.setField(context, \"DEFINE_\" + StringTools.formatUppercaseVariable(key), value);\n\t\t\t}\n\t\t}\n\n\t\tif (target != Platform.FLASH)\n\t\t{\n\t\t\tcompilerFlags.push(\"-D \" + Std.string(target).toLowerCase());\n\t\t}\n\n\t\tcompilerFlags.push(\"-D \" + Std.string(platformType).toLowerCase());\n\t\tcompilerFlags = compilerFlags.concat(haxeflags);\n\n\t\tif (compilerFlags.length == 0)\n\t\t{\n\t\t\tcontext.HAXE_FLAGS = \"\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcontext.HAXE_FLAGS = \"\\n\" + compilerFlags.join(\"\\n\");\n\t\t}\n\n\t\tvar main = app.main;\n\n\t\tif (main == null)\n\t\t{\n\t\t\tmain = \"Main\";\n\t\t}\n\n\t\tvar indexOfPeriod = main.lastIndexOf(\".\");\n\n\t\tcontext.APP_MAIN_PACKAGE = main.substr(0, indexOfPeriod + 1);\n\t\tcontext.APP_MAIN_CLASS = main.substr(indexOfPeriod + 1);\n\n\t\tvar type = \"release\";\n\n\t\tif (debug)\n\t\t{\n\t\t\ttype = \"debug\";\n\t\t}\n\t\telse if (targetFlags.exists(\"final\"))\n\t\t{\n\t\t\ttype = \"final\";\n\t\t}\n\n\t\tvar hxml = Std.string(target).toLowerCase() + \"/hxml/\" + type + \".hxml\";\n\n\t\tfor (templatePath in templatePaths)\n\t\t{\n\t\t\tvar path = Path.combine(templatePath, hxml);\n\n\t\t\tif (FileSystem.exists(path))\n\t\t\t{\n\t\t\t\tcontext.HXML_PATH = path;\n\t\t\t}\n\t\t}\n\n\t\tcontext.RELEASE = (type == \"release\");\n\t\tcontext.DEBUG = debug;\n\t\tcontext.FINAL = (type == \"final\");\n\t\tcontext.SWF_VERSION = app.swfVersion;\n\t\tcontext.PRELOADER_NAME = app.preloader;\n\n\t\tif (keystore != null)\n\t\t{\n\t\t\tif (keystore.path != null)\n\t\t\t{\n\t\t\t\tcontext.KEY_STORE = Path.tryFullPath(keystore.path);\n\t\t\t}\n\n\t\t\tif (keystore.password != null)\n\t\t\t{\n\t\t\t\tcontext.KEY_STORE_PASSWORD = keystore.password;\n\t\t\t}\n\n\t\t\tif (keystore.alias != null)\n\t\t\t{\n\t\t\t\tcontext.KEY_STORE_ALIAS = keystore.alias;\n\t\t\t}\n\t\t\telse if (keystore.path != null)\n\t\t\t{\n\t\t\t\tcontext.KEY_STORE_ALIAS = Path.withoutExtension(Path.withoutDirectory(keystore.path));\n\t\t\t}\n\n\t\t\tif (keystore.aliasPassword != null)\n\t\t\t{\n\t\t\t\tcontext.KEY_STORE_ALIAS_PASSWORD = keystore.aliasPassword;\n\t\t\t}\n\t\t\telse if (keystore.password != null)\n\t\t\t{\n\t\t\t\tcontext.KEY_STORE_ALIAS_PASSWORD = keystore.password;\n\t\t\t}\n\t\t}\n\n\t\tcontext.config = config;\n\n\t\treturn context;\n\t}\n\n\tprivate function get_window():WindowData\n\t{\n\t\tif (windows != null)\n\t\t{\n\t\t\treturn windows[0];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn window;\n\t\t}\n\t}\n\n\tprivate function set_window(value:WindowData):WindowData\n\t{\n\t\tif (windows != null)\n\t\t{\n\t\t\treturn windows[0] = window = value;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn window = value;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/HashlinkHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.Haxelib;\nimport hxp.Log;\nimport sys.FileSystem;\nimport lime.tools.ConfigHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\nimport hxp.Path;\nimport hxp.System;\n\nclass HashlinkHelper\n{\n\tpublic static inline var BUNDLED_HL_VER = \"1.14.0\";\n\n\tpublic static function copyHashlink(project:HXProject, targetDirectory:String, applicationDirectory:String, executablePath:String, ?is64 = true)\n\t{\n\t\tvar platform = project.target;\n\t\tvar bindir = switch project.target\n\t\t{\n\t\t\tcase LINUX: \"Linux\";\n\t\t\tcase MAC: \"Mac\";\n\t\t\tcase WINDOWS: \"Windows\";\n\t\t\tdefault:\n\t\t\t\tLog.error('HashLink is not supported on ${project.target} (Supported: Windows, Mac and Linux)');\n\t\t\t\tSys.exit(1);\n\t\t\t\t\"\";\n\t\t};\n\t\tif(is64) {\n\t\t\tbindir += \"64\";\n\t\t}\n\n\t\tvar hlPath = ConfigHelper.getConfigValue(\"HL_PATH\");\n\t\tif (hlPath == null)\n\t\t{\n\t\t\tSystem.recursiveCopyTemplate(project.templatePaths, 'bin/hl/$bindir', applicationDirectory);\n\t\t\tSystem.renameFile(Path.combine(applicationDirectory, \"hl\" + (project.target == WINDOWS ? \".exe\" : \"\")), executablePath);\n\n\t\t\tif (project.targetFlags.exists(\"hlc\"))\n\t\t\t{\n\t\t\t\tvar limeDirectory = Haxelib.getPath(new Haxelib(\"lime\"), true);\n\t\t\t\tvar includeDirectory = sys.FileSystem.exists(Path.combine(limeDirectory, \"project\"))\n\t\t\t\t\t? Path.combine(limeDirectory, \"project/lib/hashlink/src\")\n\t\t\t\t\t: Path.combine(limeDirectory,  \"templates/bin/hl/include\");\n\n\t\t\t\tSystem.copyFile(Path.combine(includeDirectory, \"hlc.h\"), Path.combine(targetDirectory, \"obj/hlc.h\"), null, false);\n\t\t\t\tSystem.copyFile(Path.combine(includeDirectory, \"hl.h\"), Path.combine(targetDirectory, \"obj/hl.h\"), null, false);\n\t\t\t\tSystem.copyFile(Path.combine(includeDirectory, \"hlc_main.c\"), Path.combine(targetDirectory, \"obj/hlc_main.c\"), null, false);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!project.targetFlags.exists(\"hlc\"))\n\t\t\t{\n\t\t\t\tSystem.copyFile(Path.combine(hlPath, \"hl\" + (platform == WINDOWS ? \".exe\" : \"\")), executablePath);\n\t\t\t}\n\t\t\tif (platform == WINDOWS)\n\t\t\t{\n\t\t\t\tSystem.copyFile(Path.combine(hlPath, \"libhl.dll\"), Path.combine(applicationDirectory, \"libhl.dll\"));\n\t\t\t\tvar msvcrPath = Path.combine(hlPath, \"msvcr120.dll\");\n\t\t\t\tif (FileSystem.exists(msvcrPath))\n\t\t\t\t{\n\t\t\t\t\tSystem.copyFile(msvcrPath, Path.combine(applicationDirectory, \"msvcr120.dll\"));\n\t\t\t\t}\n\t\t\t\tvar vcruntimePath = Path.combine(hlPath, \"vcruntime140.dll\");\n\t\t\t\tif (FileSystem.exists(vcruntimePath))\n\t\t\t\t{\n\t\t\t\t\tSystem.copyFile(vcruntimePath, Path.combine(applicationDirectory, \"vcruntime140.dll\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (platform == MAC || platform == IOS)\n\t\t\t{\n\t\t\t\tSystem.copyFile(Path.combine(hlPath, \"libhl.dylib\"), Path.combine(applicationDirectory, \"libhl.dylib\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.copyFile(Path.combine(hlPath, \"libhl.so\"), Path.combine(applicationDirectory, \"libhl.so\"));\n\t\t\t}\n\n\t\t\tfor (file in System.readDirectory(hlPath)\n\t\t\t\t.filter(function(f) return Path.extension(f) == \"hdll\"\n\t\t\t\t\t&& Path.withoutDirectory(f) != \"sdl.hdll\"\n\t\t\t\t\t&& Path.withoutDirectory(f) != \"openal.hdll\"))\n\t\t\t{\n\t\t\t\tSystem.copyFile(file, Path.combine(applicationDirectory, Path.withoutDirectory(file)));\n\t\t\t}\n\n\t\t\tif (project.targetFlags.exists(\"hlc\"))\n\t\t\t{\n\t\t\t\tfor (file in System.readDirectory(Path.combine(hlPath, \"include\")))\n\t\t\t\t{\n\t\t\t\t\tSystem.copyFile(file, Path.combine(targetDirectory, Path.combine(\"obj\", Path.withoutDirectory(file))));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// make sure no hxcpp hash files or MSVC build artifacts remain\n\n\t\tfor (file in System.readDirectory(applicationDirectory))\n\t\t{\n\t\t\tswitch Path.extension(file)\n\t\t\t{\n\t\t\t\tcase \"hash\", \"pdb\", \"ilk\", \"exp\":\n\t\t\t\t\tSystem.deleteFile(file);\n\t\t\t\tcase \"lib\":\n\t\t\t\t\tif (platform != WINDOWS)\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.deleteFile(file);\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t\tif (project.targetFlags.exists(\"hlc\"))\n\t\t{\n\t\t\tif (sys.FileSystem.exists(executablePath))\n\t\t\t{\n\t\t\t\tSystem.deleteFile(executablePath);\n\t\t\t}\n\n\t\t\tvar appMainCPath = Path.combine(targetDirectory, \"obj/ApplicationMain.c\");\n\t\t\tvar appMainCText = System.readText(appMainCPath);\n\t\t\tvar index = appMainCText.indexOf(\"#ifndef HL_MAKE\");\n\t\t\tappMainCText = appMainCText.substr(0, index) + \"\n// --------- START LIME HL/C INJECTED CODE --------- //\n// undefine things to avoid Haxe field name conflicts\n#undef BIG_ENDIAN\n#undef LITTLE_ENDIAN\n#undef TRUE\n#undef FALSE\n#undef BOOLEAN\n#undef ERROR\n#undef NO_ERROR\n#undef DELETE\n#undef OPTIONS\n#undef IN\n#undef OUT\n#undef ALTERNATE\n#undef OPTIONAL\n#undef DOUBLE_CLICK\n#undef DIFFERENCE\n#undef POINT\n#undef RECT\n#undef OVERFLOW\n#undef UNDERFLOW\n#undef DOMAIN\n#undef TRANSPARENT\n#undef CONST\n#undef CopyFile\n#undef COLOR_HIGHLIGHT\n#undef __valid\n#undef WAIT_FAILED\n// ---------- END LIME HL/C INJECTED CODE ---------- //\n\" + appMainCText.substr(index);\n\t\t\tSystem.writeText(appMainCText, appMainCPath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.copyFile(Path.combine(targetDirectory, \"obj/ApplicationMain.hl\"), Path.combine(applicationDirectory, \"hlboot.dat\"));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/IOSHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.Platform;\nimport lime.tools.HXProject;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass IOSHelper\n{\n\tprivate static var initialized = false;\n\n\tpublic static function build(project:HXProject, workingDirectory:String, additionalArguments:Array<String> = null):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar commands = getXCodeArgs(project);\n\n\t\tif (project.targetFlags.exists(\"archive\"))\n\t\t{\n\t\t\tvar configuration = project.environment.get(\"CONFIGURATION\");\n\t\t\tvar platformName = project.environment.get(\"PLATFORM_NAME\");\n\n\t\t\tcommands.push(\"archive\");\n\t\t\tcommands.push(\"-scheme\");\n\t\t\tcommands.push(project.app.file);\n\t\t\tcommands.push(\"-archivePath\");\n\t\t\tcommands.push(Path.combine(\"build\", Path.combine(configuration + \"-\" + platformName, project.app.file)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcommands.push(\"build\");\n\t\t\tif (project.targetFlags.exists(\"nosign\"))\n\t\t\t{\n\t\t\t\tcommands.push(\"CODE_SIGN_IDENTITY=\\\"\\\"\");\n\t\t\t\tcommands.push(\"CODE_SIGNING_REQUIRED=\\\"NO\\\"\");\n\t\t\t\tcommands.push(\"CODE_SIGN_ENTITLEMENTS=\\\"\\\"\");\n\t\t\t\tcommands.push(\"CODE_SIGNING_ALLOWED=\\\"NO\\\"\");\n\t\t\t}\n\t\t}\n\n\t\tif (additionalArguments != null)\n\t\t{\n\t\t\tcommands = commands.concat(additionalArguments);\n\t\t}\n\n\t\tSystem.runCommand(workingDirectory, \"xcodebuild\", commands);\n\t}\n\n\tpublic static function deploy(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar commands = getXCodeArgs(project);\n\t\tvar archiveCommands = commands.concat([]);\n\n\t\t// generate xcarchive\n\t\tvar configuration = project.environment.get(\"CONFIGURATION\");\n\t\tvar platformName = project.environment.get(\"PLATFORM_NAME\");\n\n\t\tarchiveCommands.push(\"archive\");\n\t\tarchiveCommands.push(\"-scheme\");\n\t\tarchiveCommands.push(project.app.file);\n\t\tarchiveCommands.push(\"-archivePath\");\n\t\tarchiveCommands.push(Path.combine(\"build\", Path.combine(configuration + \"-\" + platformName, project.app.file)));\n\n\t\tSystem.runCommand(workingDirectory, \"xcodebuild\", archiveCommands);\n\n\t\tvar supportedExportMethods = [\"adhoc\", \"development\", \"enterprise\", \"appstore\"];\n\t\tvar exportMethods:Array<String> = [];\n\t\tfor (m in supportedExportMethods)\n\t\t{\n\t\t\tif (project.targetFlags.exists(m))\n\t\t\t{\n\t\t\t\texportMethods.push(m);\n\t\t\t}\n\t\t}\n\n\t\tif (exportMethods.length == 0)\n\t\t{\n\t\t\texportMethods.push(\"appstore\");\n\t\t}\n\n\t\tfor (exportMethod in exportMethods)\n\t\t{\n\t\t\t// generate IPA from xcarchive\n\t\t\tvar exportCommands = commands.concat([]);\n\n\t\t\texportCommands.push(\"-exportArchive\");\n\t\t\texportCommands.push(\"-archivePath\");\n\t\t\texportCommands.push(Path.combine(\"build\", Path.combine(configuration + \"-\" + platformName, project.app.file + \".xcarchive\")));\n\t\t\texportCommands.push(\"-exportOptionsPlist\");\n\t\t\texportCommands.push(Path.combine(project.app.file, \"exportOptions-\" + exportMethod + \".plist\"));\n\t\t\texportCommands.push(\"-exportPath\");\n\t\t\texportCommands.push(Path.combine(\"dist\", exportMethod));\n\n\t\t\tSystem.runCommand(workingDirectory, \"xcodebuild\", exportCommands);\n\t\t}\n\t}\n\n\tprivate static function getXCodeArgs(project:HXProject):Array<String>\n\t{\n\t\tvar platformName = \"iphoneos\";\n\t\tvar iphoneVersion = project.environment.get(\"IPHONE_VER\");\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tplatformName = \"iphonesimulator\";\n\t\t}\n\n\t\tvar configuration = \"Release\";\n\n\t\tif (project.debug)\n\t\t{\n\t\t\tconfiguration = \"Debug\";\n\t\t}\n\n\t\tproject.setenv(\"PLATFORM_NAME\", platformName);\n\t\tproject.setenv(\"CONFIGURATION\", configuration);\n\n\t\t// setting CONFIGURATION and PLATFORM_NAME in project.environment doesn't set them for xcodebuild so also pass via command line\n\t\tvar commands = [\n\t\t\t\"-configuration\",\n\t\t\tconfiguration,\n\t\t\t\"PLATFORM_NAME=\" + platformName,\n\t\t\t\"SDKROOT=\" + platformName + iphoneVersion\n\t\t];\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tif (project.targetFlags.exists(\"i386\") || project.targetFlags.exists(\"32\") || project.targetFlags.exists(\"x86_32\"))\n\t\t\t{\n\t\t\t\tcommands.push(\"-arch\");\n\t\t\t\tcommands.push(\"i386\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcommands.push(\"-arch\");\n\t\t\t\tcommands.push(\"x86_64\");\n\t\t\t}\n\t\t}\n\t\telse if (project.targetFlags.exists(\"armv7\"))\n\t\t{\n\t\t\tcommands.push(\"-arch\");\n\t\t\tcommands.push(\"armv7\");\n\t\t}\n\t\telse if (project.targetFlags.exists(\"armv7s\"))\n\t\t{\n\t\t\tcommands.push(\"-arch\");\n\t\t\tcommands.push(\"armv7s\");\n\t\t}\n\t\telse if (project.targetFlags.exists(\"arm64\"))\n\t\t{\n\t\t\tcommands.push(\"-arch\");\n\t\t\tcommands.push(\"arm64\");\n\t\t}\n\n\t\tcommands.push(\"-project\");\n\t\tcommands.push(project.app.file + \".xcodeproj\");\n\n\t\tvar xcodeVersions = getXcodeVersion().split(\".\").map(function(i:String)\n\t\t{\n\t\t\tvar ver = Std.parseInt(i);\n\t\t\treturn ver != null ? ver : 0;\n\t\t});\n\n\t\tif (xcodeVersions[0] >= 9)\n\t\t{\n\t\t\tif (project.config.getBool('ios.allow-provisioning-updates', true))\n\t\t\t{\n\t\t\t\tcommands.push(\"-allowProvisioningUpdates\");\n\t\t\t}\n\t\t\tif (project.config.getBool('ios.allow-provisioning-device-registration', true))\n\t\t\t{\n\t\t\t\tcommands.push(\"-allowProvisioningDeviceRegistration\");\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\tpublic static function getSDKDirectory(project:HXProject):String\n\t{\n\t\tinitialize(project);\n\n\t\tvar platformName = \"iPhoneOS\";\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tplatformName = \"iPhoneSimulator\";\n\t\t}\n\n\t\tvar process = new Process(\"xcode-select\", [\"--print-path\"]);\n\t\tvar directory = process.stdout.readLine();\n\t\tprocess.close();\n\n\t\tif (directory == \"\" || directory.indexOf(\"Run xcode-select\") > -1)\n\t\t{\n\t\t\tdirectory = \"/Applications/Xcode.app/Contents/Developer\";\n\t\t}\n\n\t\tdirectory += \"/Platforms/\"\n\t\t\t+ platformName\n\t\t\t+ \".platform/Developer/SDKs/\"\n\t\t\t+ platformName\n\t\t\t+ project.environment.get(\"IPHONE_VER\")\n\t\t\t+ \".sdk\";\n\t\treturn directory;\n\t}\n\n\tpublic static function getIOSVersion(project:HXProject):Void\n\t{\n\t\tif (!project.environment.exists(\"IPHONE_VER\") || project.environment.get(\"IPHONE_VER\") == \"4.2\")\n\t\t{\n\t\t\tif (!project.environment.exists(\"DEVELOPER_DIR\") && System.hostPlatform == MAC)\n\t\t\t{\n\t\t\t\tvar process = new Process(\"xcode-select\", [\"--print-path\"]);\n\t\t\t\tvar developerDir = process.stdout.readLine();\n\t\t\t\tprocess.close();\n\n\t\t\t\tproject.environment.set(\"DEVELOPER_DIR\", developerDir);\n\t\t\t}\n\n\t\t\tvar devPath = project.environment.get(\"DEVELOPER_DIR\") + \"/Platforms/iPhoneOS.platform/Developer/SDKs\";\n\n\t\t\tif (FileSystem.exists(devPath))\n\t\t\t{\n\t\t\t\tvar files = FileSystem.readDirectory(devPath);\n\t\t\t\tvar extractVersion = ~/^iPhoneOS(.*).sdk$/;\n\t\t\t\tvar best = \"0\", version;\n\n\t\t\t\tfor (file in files)\n\t\t\t\t{\n\t\t\t\t\tif (extractVersion.match(file))\n\t\t\t\t\t{\n\t\t\t\t\t\tversion = extractVersion.matched(1);\n\n\t\t\t\t\t\tif (Std.parseFloat(version) > Std.parseFloat(best))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbest = version;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (best != \"\")\n\t\t\t\t{\n\t\t\t\t\tproject.environment.set(\"IPHONE_VER\", best);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function getOSXVersion():String\n\t{\n\t\tvar output = System.runProcess(\"\", \"sw_vers\", [\"-productVersion\"]);\n\n\t\treturn StringTools.trim(output);\n\t}\n\n\tpublic static function getProvisioningFile(project:HXProject = null):String\n\t{\n\t\tif (project != null && project.config.exists(\"ios.provisioning-profile\"))\n\t\t{\n\t\t\treturn Path.tryFullPath(project.config.getString(\"ios.provisioning-profile\"));\n\t\t}\n\t\telse if (System.hostPlatform == MAC)\n\t\t{\n\t\t\tvar path = Path.expand(\"~/Library/MobileDevice/Provisioning Profiles\");\n\t\t\tvar files = FileSystem.readDirectory(path);\n\n\t\t\tfor (file in files)\n\t\t\t{\n\t\t\t\tif (Path.extension(file) == \"mobileprovision\")\n\t\t\t\t{\n\t\t\t\t\treturn path + \"/\" + file;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\tprivate static function getXcodeVersion():String\n\t{\n\t\tvar output = System.runProcess(\"\", \"xcodebuild\", [\"-version\"]);\n\t\tvar firstLine = output.split(\"\\n\").shift();\n\n\t\treturn StringTools.trim(firstLine.substring(\"Xcode\".length, firstLine.length));\n\t}\n\n\tprivate static function initialize(project:HXProject):Void\n\t{\n\t\tif (!initialized)\n\t\t{\n\t\t\tgetIOSVersion(project);\n\n\t\t\tinitialized = true;\n\t\t}\n\t}\n\n\tpublic static function launch(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar configuration = \"Release\";\n\n\t\tif (project.debug)\n\t\t{\n\t\t\tconfiguration = \"Debug\";\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tvar applicationPath = \"\";\n\n\t\t\tif (Path.extension(workingDirectory) == \"app\" || Path.extension(workingDirectory) == \"ipa\")\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory + \"/build/\" + configuration + \"-iphonesimulator/\" + project.app.file + \".app\";\n\t\t\t}\n\n\t\t\tvar currentDeviceID = XCodeHelper.getSimulatorID(project);\n\n\t\t\tif (Log.verbose)\n\t\t\t{\n\t\t\t\tvar currentSimulatorName = XCodeHelper.getSimulatorName(project);\n\t\t\t\tLog.info(\"Using iOS simulator: \" + currentSimulatorName);\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSystem.runProcess(\"\", \"open\", [\"-Ra\", \"iOS Simulator\"], true, false);\n\t\t\t\tSystem.runCommand(\"\", \"open\", [\"-a\", \"iOS Simulator\", \"--args\", \"-CurrentDeviceUDID\", currentDeviceID]);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"open\", [\"-a\", \"Simulator\", \"--args\", \"-CurrentDeviceUDID\", currentDeviceID]);\n\t\t\t}\n\n\t\t\twaitForDeviceState(\"xcrun\", [\"simctl\", \"boot\", currentDeviceID]);\n\t\t\twaitForDeviceState(\"xcrun\", [\"simctl\", \"uninstall\", currentDeviceID, project.meta.packageName]);\n\t\t\twaitForDeviceState(\"xcrun\", [\"simctl\", \"install\", currentDeviceID, applicationPath]);\n\t\t\twaitForDeviceState(\"xcrun\", [\"simctl\", \"launch\", currentDeviceID, project.meta.packageName]);\n\n\t\t\tSystem.runCommand(\"\", \"tail\", [\"-F\", \"$HOME/Library/Logs/CoreSimulator/\" + currentDeviceID + \"/system.log\"]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar applicationPath = \"\";\n\n\t\t\tif (Path.extension(workingDirectory) == \"app\" || Path.extension(workingDirectory) == \"ipa\")\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory + \"/build/\" + configuration + \"-iphoneos/\" + project.app.file + \".app\";\n\t\t\t}\n\n\t\t\tvar requireIPad = project.config.getString(\"ios.device\", \"universal\") == \"ipad\";\n\t\t\tvar requireIPhone = project.config.getString(\"ios.device\", \"universal\") == \"iphone\";\n\n\t\t\tvar xcodeVersion = Std.parseFloat(getXcodeVersion());\n\t\t\tif (!Math.isNaN(xcodeVersion) && xcodeVersion >= 16) {\n\t\t\t\t// ios-deploy doesn't work with newer iOS SDKs where it can't\n\t\t\t\t// find DeveloperDiskImage.dmg. however, Xcode 16 adds new\n\t\t\t\t// commands for installing and launching apps on connected\n\t\t\t\t// devices, so we'll prefer those, if available.\n\n\t\t\t\tvar deviceUUID:String = null;\n\n\t\t\t\t// we'll try various combinations of the following filters to\n\t\t\t\t// select an iOS device. there may be multiple devices to choose\n\t\t\t\t// from, so these filters help us figure out the best one.\n\n\t\t\t\tvar filterPlatformIOS = \"Platform == 'iOS'\"; // includes iPadOS\n\t\t\t\tvar filterDeveloperModeEnabled = \"deviceProperties.developerModeStatus == 'enabled'\";\n\t\t\t\tvar filterStateConnected = \"State == 'connected'\";\n\t\t\t\tvar filterStateAvailable = \"State == 'available (paired)'\";\n\t\t\t\tvar filterTransportTypeWired = \"connectionProperties.transportType == 'wired'\";\n\t\t\t\tvar filterTransportTypeLocalNetwork = \"connectionProperties.transportType == 'localNetwork'\";\n\t\t\t\tvar filterDeviceTypeIPhone = \"hardwareProperties.deviceType == 'iPhone'\";\n\t\t\t\tvar filterDeviceTypeIPad = \"hardwareProperties.deviceType == 'iPad'\";\n\n\t\t\t\t// first, some strictly required filters:\n\t\t\t\t// 1. the platform must always be iOS (which includes iPadOS).\n\t\t\t\t// 2. the device must be in developer mode.\n\t\t\t\t// 3. if required by the project config, limit to iPhone or iPad only\n\t\t\t\tvar baseFilters = [\n\t\t\t\t\tfilterPlatformIOS,\n\t\t\t\t\tfilterDeveloperModeEnabled,\n\t\t\t\t];\n\t\t\t\tif (requireIPad)\n\t\t\t\t{\n\t\t\t\t\tbaseFilters.push(filterDeviceTypeIPad);\n\t\t\t\t}\n\t\t\t\telse if (requireIPhone)\n\t\t\t\t{\n\t\t\t\t\tbaseFilters.push(filterDeviceTypeIPhone);\n\t\t\t\t}\n\n\t\t\t\t// after that, we have the following preferences, in order:\n\t\t\t\t// 1. state: \"connected\" preferred over \"available (paired)\"\n\t\t\t\t// 2. transportType: \"wired\" preferred over \"localNetwork\"\n\t\t\t\tvar stateFilters = [filterStateConnected, filterStateAvailable];\n\t\t\t\tvar transportTypeFilters = [filterTransportTypeWired, filterTransportTypeLocalNetwork];\n\t\t\t\tfor (stateFilter in stateFilters)\n\t\t\t\t{\n\t\t\t\t\tfor (transportTypeFilter in transportTypeFilters)\n\t\t\t\t\t{\n\t\t\t\t\t\tdeviceUUID = findDeviceUUIDWithFilters(baseFilters.concat([\n\t\t\t\t\t\t\tstateFilter,\n\t\t\t\t\t\t\ttransportTypeFilter\n\t\t\t\t\t\t]));\n\t\t\t\t\t\tif (deviceUUID != null && deviceUUID.length > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (deviceUUID != null && deviceUUID.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (deviceUUID == null || deviceUUID.length == 0) {\n\t\t\t\t\t// devices running iOS 16 and older don't support\n\t\t\t\t\t// xcrun devicectl, so if no device was found, try falling\n\t\t\t\t\t// back to ios-deploy\n\t\t\t\t\tfallbackLaunch(project, applicationPath);\n\t\t\t\t\t// Log.error(\"No device connected\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (Log.verbose)\n\t\t\t\t{\n\t\t\t\t\tLog.info(\"Detected iOS device UUID: \" + deviceUUID);\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(\"\", \"xcrun\", [\"devicectl\", \"device\", \"install\", \"app\", \"--device\", deviceUUID, FileSystem.fullPath(applicationPath)]);\n\t\t\t\tSystem.runCommand(\"\", \"xcrun\", [\"devicectl\", \"device\", \"process\", \"launch\", \"--console\", \"--device\", deviceUUID, project.meta.packageName]);\n\t\t\t} else {\n\t\t\t\t// continue using ios-deploy if Xcode version is 15 or older\n\t\t\t\tfallbackLaunch(project, applicationPath);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function findDeviceUUIDWithFilters(filters:Array<String>):String\n\t{\n\t\tvar listDevicesOutput = System.runProcess(\"\", \"xcrun\",\n\t\t\t[\n\t\t\t\t\"devicectl\", \"list\", \"devices\",\n\t\t\t\t\"--hide-default-columns\", \"--columns\", \"Identifier\",\n\t\t\t\t\"--filter\", filters.join(\" AND \")\n\t\t\t]);\n\t\tvar ready = false;\n\t\tfor (line in listDevicesOutput.split(\"\\n\"))\n\t\t{\n\t\t\tif (!ready)\n\t\t\t{\n\t\t\t\tready = StringTools.startsWith(line, \"----\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn line;\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static function fallbackLaunch(project:HXProject, applicationPath:String):Void\n\t{\n\t\tvar templatePaths = [\n\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t].concat(project.templatePaths);\n\t\tvar launcher = System.findTemplate(templatePaths, \"bin/ios-deploy\");\n\t\tSys.command(\"chmod\", [\"+x\", launcher]);\n\n\t\tSystem.runCommand(\"\", launcher, [\n\t\t\t\"install\",\n\t\t\t\"--noninteractive\",\n\t\t\t\"--debug\",\n\t\t\t\"--bundle\",\n\t\t\tFileSystem.fullPath(applicationPath)\n\t\t]);\n\t}\n\n\tpublic static function sign(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar configuration = \"Release\";\n\n\t\tif (project.debug)\n\t\t{\n\t\t\tconfiguration = \"Debug\";\n\t\t}\n\n\t\tvar identity = project.config.getString(\"ios.identity\", \"iPhone Developer\");\n\n\t\tvar commands = [\"-s\", identity, \"CODE_SIGN_IDENTITY=\" + identity];\n\n\t\tif (project.config.exists(\"ios.provisioning-profile\"))\n\t\t{\n\t\t\tcommands.push(\"PROVISIONING_PROFILE=\" + project.config.getString(\"ios.provisioning-profile\"));\n\t\t}\n\n\t\tvar applicationPath = \"build/\" + configuration + \"-iphoneos/\" + project.app.file + \".app\";\n\t\tcommands.push(applicationPath);\n\n\t\tSystem.runCommand(workingDirectory, \"codesign\", commands, true, true);\n\t}\n\n\tprivate static function waitForDeviceState(command:String, args:Array<String>):Void\n\t{\n\t\tvar output:String;\n\n\t\twhile (true)\n\t\t{\n\t\t\toutput = System.runProcess(\"\", command, args, true, true, true);\n\n\t\t\tif (output != null && output.toLowerCase().indexOf(\"invalid device state\") > -1)\n\t\t\t{\n\t\t\t\tSys.sleep(3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/Icon.hx",
    "content": "package lime.tools;\n\nclass Icon\n{\n\tpublic var height:Int;\n\tpublic var path:String;\n\tpublic var size:Int;\n\tpublic var width:Int;\n\tpublic var priority:Int;\n\n\tpublic function new(path:String, size:Int = 0, priority:Int = 0)\n\t{\n\t\tthis.path = path;\n\t\tthis.size = height = width = size;\n\t\tthis.priority = priority;\n\t}\n\n\tpublic function clone():Icon\n\t{\n\t\tvar icon = new Icon(path);\n\t\ticon.size = size;\n\t\ticon.width = width;\n\t\ticon.height = height;\n\n\t\treturn icon;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/IconHelper.hx",
    "content": "package lime.tools;\n\n// import openfl.display.Bitmap;\n// import openfl.display.BitmapData;\n// import openfl.display.Shape;\n// import openfl.geom.Rectangle;\n// import openfl.utils.ByteArray;\n// import format.SVG;\nimport haxe.io.Bytes;\nimport haxe.io.BytesOutput;\nimport hxp.*;\nimport lime.tools.ImageHelper;\n#if (lime && lime_cffi && !macro)\nimport lime.graphics.Image;\nimport lime.math.Rectangle;\n#end\nimport lime.tools.Icon;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass IconHelper\n{\n\tprivate static function canUseCache(targetPath:String, icons:Array<Icon>):Bool\n\t{\n\t\tif (FileSystem.exists(targetPath))\n\t\t{\n\t\t\tvar cacheTime = System.getLastModified(targetPath);\n\n\t\t\tfor (icon in icons)\n\t\t\t{\n\t\t\t\tif (System.getLastModified(icon.path) > cacheTime)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic static function createIcon(icons:Array<Icon>, width:Int, height:Int, targetPath:String):Bool\n\t{\n\t\t#if (lime && lime_cffi && !macro)\n\t\tvar icon = findMatch(icons, width, height);\n\n\t\tif (icon != null && icon.size > 0 && Path.extension(icon.path) == \"png\")\n\t\t{\n\t\t\tif (canUseCache(targetPath, [icon]))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\tSystem.copyFile(icon.path, targetPath);\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (canUseCache(targetPath, icons))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tvar image = getIconImage(icons, width, height);\n\n\t\t\tif (image != null)\n\t\t\t{\n\t\t\t\tvar bytes = image.encode(PNG);\n\n\t\t\t\tif (bytes != null)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\t\t\tFile.saveBytes(targetPath, bytes);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic static function createMacIcon(icons:Array<Icon>, targetPath:String):Bool\n\t{\n\t\t#if (lime && lime_cffi && !macro)\n\t\tif (canUseCache(targetPath, icons))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tvar out = new BytesOutput();\n\t\tout.bigEndian = true;\n\n\t\t// Not sure why the 128x128 icon is not saving properly. Disabling for now\n\n\t\tfor (i in 0...3)\n\t\t{\n\t\t\tvar s = ([16, 32, 48, 128])[i];\n\t\t\tvar code = ([\"is32\", \"il32\", \"ih32\", \"it32\"])[i];\n\t\t\tvar image = getIconImage(icons, s, s);\n\n\t\t\tif (image != null)\n\t\t\t{\n\t\t\t\tfor (c in 0...4)\n\t\t\t\t\tout.writeByte(code.charCodeAt(c));\n\n\t\t\t\tvar n = s * s;\n\t\t\t\tvar pixels = image.getPixels(new Rectangle(0, 0, s, s), ARGB32);\n\n\t\t\t\tvar bytes_r = packBits(pixels, 1, s * s);\n\t\t\t\tvar bytes_g = packBits(pixels, 2, s * s);\n\t\t\t\tvar bytes_b = packBits(pixels, 3, s * s);\n\n\t\t\t\tout.writeInt32(bytes_r.length + bytes_g.length + bytes_b.length + 8);\n\t\t\t\tout.writeBytes(bytes_r, 0, bytes_r.length);\n\t\t\t\tout.writeBytes(bytes_g, 0, bytes_g.length);\n\t\t\t\tout.writeBytes(bytes_b, 0, bytes_b.length);\n\n\t\t\t\tvar code = ([\"s8mk\", \"l8mk\", \"h8mk\", \"t8mk\"])[i];\n\n\t\t\t\tfor (c in 0...4)\n\t\t\t\t\tout.writeByte(code.charCodeAt(c));\n\n\t\t\t\tvar bytes_a = extractBits(pixels, 0, s * s);\n\t\t\t\tout.writeInt32(bytes_a.length + 8);\n\t\t\t\tout.writeBytes(bytes_a, 0, bytes_a.length);\n\t\t\t}\n\t\t}\n\n\t\tfor (i in 0...5)\n\t\t{\n\t\t\tvar s = ([32, 64, 256, 512, 1024])[i];\n\t\t\tvar code = ([\"ic11\", \"ic12\", \"ic08\", \"ic09\", \"ic10\"])[i];\n\t\t\tvar image = getIconImage(icons, s, s);\n\n\t\t\tif (image != null)\n\t\t\t{\n\t\t\t\tvar bytes = image.encode(PNG);\n\n\t\t\t\tif (bytes != null)\n\t\t\t\t{\n\t\t\t\t\tfor (c in 0...4)\n\t\t\t\t\t\tout.writeByte(code.charCodeAt(c));\n\n\t\t\t\t\tout.writeInt32(bytes.length + 8);\n\t\t\t\t\tout.writeBytes(bytes, 0, bytes.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar bytes = out.getBytes();\n\n\t\tif (bytes.length > 0)\n\t\t{\n\t\t\tvar file = File.write(targetPath, true);\n\t\t\tfile.bigEndian = true;\n\n\t\t\tfor (c in 0...4)\n\t\t\t\tfile.writeByte(\"icns\".charCodeAt(c));\n\n\t\t\tfile.writeInt32(bytes.length + 8);\n\t\t\tfile.writeBytes(bytes, 0, bytes.length);\n\t\t\tfile.close();\n\n\t\t\treturn true;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tpublic static function createWindowsIcon(icons:Array<Icon>, targetPath:String):Bool\n\t{\n\t\t#if (lime && lime_cffi && !macro)\n\t\tif (canUseCache(targetPath, icons))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tvar sizes = [16, 24, 32, 40, 48, 64, 96, 128, 256, 512, 768];\n\n\t\tvar images = new Array<Image>();\n\t\tvar imageData = new Array<Bytes>();\n\n\t\tfor (size in sizes)\n\t\t{\n\t\t\tvar image = getIconImage(icons, size, size);\n\n\t\t\tif (image != null)\n\t\t\t{\n\t\t\t\tvar data:Bytes = null;\n\n\t\t\t\tif (size < 256)\n\t\t\t\t{\n\t\t\t\t\tdata = lime._internal.format.BMP.encode(image, ICO);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdata = image.encode(PNG);\n\t\t\t\t}\n\n\t\t\t\tif (data != null)\n\t\t\t\t{\n\t\t\t\t\timageData.push(data);\n\t\t\t\t\timages.push(image);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar length = 6 + (16 * images.length);\n\n\t\tfor (data in imageData)\n\t\t{\n\t\t\tlength += data.length;\n\t\t}\n\n\t\tvar icon = Bytes.alloc(length);\n\t\tvar position = 0;\n\t\ticon.setUInt16(position, 0);\n\t\tposition += 2;\n\t\ticon.setUInt16(position, 1);\n\t\tposition += 2;\n\t\ticon.setUInt16(position, images.length);\n\t\tposition += 2;\n\n\t\tvar dataOffset = 6 + (16 * images.length);\n\n\t\tfor (i in 0...images.length)\n\t\t{\n\t\t\tvar size = images[i].width;\n\n\t\t\ticon.set(position++, size > 255 ? 0 : size);\n\t\t\ticon.set(position++, size > 255 ? 0 : size);\n\t\t\ticon.set(position++, 0);\n\t\t\ticon.set(position++, 0);\n\t\t\ticon.setUInt16(position, 1);\n\t\t\tposition += 2;\n\t\t\ticon.setUInt16(position, 32);\n\t\t\tposition += 2;\n\t\t\ticon.setInt32(position, imageData[i].length);\n\t\t\tposition += 4;\n\t\t\ticon.setInt32(position, dataOffset);\n\t\t\tposition += 4;\n\n\t\t\tdataOffset += imageData[i].length;\n\t\t}\n\n\t\tfor (data in imageData)\n\t\t{\n\t\t\ticon.blit(position, data, 0, data.length);\n\t\t\tposition += data.length;\n\t\t}\n\n\t\tif (images.length > 0)\n\t\t{\n\t\t\tFile.saveBytes(targetPath, icon);\n\t\t\treturn true;\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\tprivate static function extractBits(data:Bytes, offset:Int, len:Int):Bytes\n\t{\n\t\tvar out = new BytesOutput();\n\n\t\tfor (i in 0...len)\n\t\t{\n\t\t\tout.writeByte(data.get(i * 4 + offset));\n\t\t}\n\n\t\treturn out.getBytes();\n\t}\n\n\tpublic static function findMatch(icons:Array<Icon>, width:Int, height:Int):Icon\n\t{\n\t\tvar match:Icon = null;\n\n\t\tfor (icon in icons)\n\t\t{\n\t\t\tif (icon.width == width && icon.height == height && (match == null || match.priority <= icon.priority))\n\t\t\t{\n\t\t\t\tmatch = icon;\n\t\t\t}\n\t\t}\n\n\t\treturn match;\n\t}\n\n\tpublic static function findNearestMatch(icons:Array<Icon>, width:Int, height:Int, ?acceptSmaller:Bool = false):Icon\n\t{\n\t\tvar match:Icon = null;\n\t\tvar matchDifference = Math.POSITIVE_INFINITY;\n\n\t\tfor (icon in icons)\n\t\t{\n\t\t\tvar iconDifference = icon.width - width + icon.height - height;\n\n\t\t\t// If size is unspecified, accept it as an almost-perfect match\n\t\t\tif (icon.width == 0 && icon.height == 0)\n\t\t\t{\n\t\t\t\ticonDifference = 1;\n\t\t\t}\n\n\t\t\tif (iconDifference < 0 && !acceptSmaller)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Math.abs(iconDifference) < Math.abs(matchDifference)\n\t\t\t\t|| iconDifference == matchDifference && icon.priority >= match.priority)\n\t\t\t{\n\t\t\t\tmatch = icon;\n\t\t\t\tmatchDifference = iconDifference;\n\t\t\t}\n\t\t}\n\n\t\tif (match == null && !acceptSmaller)\n\t\t{\n\t\t\t// Try again but accept any icon\n\t\t\treturn findNearestMatch(icons, width, height, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn match;\n\t\t}\n\t}\n\n\tprivate static function getIconImage(icons:Array<Icon>, width:Int, height:Int,\n\t\t\tbackgroundColor:Int = null):#if (lime && lime_cffi && !macro) Image #else Dynamic #end\n\t{\n\t\tvar icon = findMatch(icons, width, height);\n\n\t\tif (icon == null)\n\t\t{\n\t\t\ticon = findNearestMatch(icons, width, height);\n\t\t}\n\n\t\tif (icon == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tif (icon.path == null || !FileSystem.exists(icon.path))\n\t\t{\n\t\t\tLog.warn(\"Could not find icon path: \" + icon.path);\n\t\t\treturn null;\n\t\t}\n\n\t\tvar extension = Path.extension(icon.path);\n\n\t\t#if (lime && lime_cffi && !macro)\n\t\tvar image:Image = null;\n\t\tswitch (extension)\n\t\t{\n\t\t\tcase \"png\", \"jpg\", \"jpeg\":\n\t\t\t\timage = ImageHelper.resizeImage(Image.fromFile(icon.path), width, height);\n\n\t\t\tcase \"svg\":\n\t\t\t\t// image = ImageHelper.rasterizeSVG (null /*new SVG (File.getContent (icon.path))*/, width, height, backgroundColor);\n\t\t\t\timage = ImageHelper.rasterizeSVG(icon.path, width, height, backgroundColor);\n\t\t}\n\t\treturn image;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tprivate static function packBits(data:Bytes, offset:Int, len:Int):Bytes\n\t{\n\t\tvar out = new BytesOutput();\n\t\tvar idx = 0;\n\n\t\twhile (idx < len)\n\t\t{\n\t\t\tvar val = data.get(idx * 4 + offset);\n\t\t\tvar same = 1;\n\n\t\t\t/*\n\t\t\t\tHmmmm...\n\t\t\t\twhile( ((idx+same) < len) && (data[ (idx+same)*4 + offset ]==val) && (same < 2) )\n\t\t\t\tsame++;\n\t\t\t */\n\n\t\t\tif (same == 1)\n\t\t\t{\n\t\t\t\tvar raw = idx + 120 < len ? 120 : len - idx;\n\t\t\t\tout.writeByte(raw - 1);\n\n\t\t\t\tfor (i in 0...raw)\n\t\t\t\t{\n\t\t\t\t\tout.writeByte(data.get(idx * 4 + offset));\n\t\t\t\t\tidx++;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tout.writeByte(257 - same);\n\t\t\t\tout.writeByte(val);\n\t\t\t\tidx += same;\n\t\t\t}\n\t\t}\n\n\t\treturn out.getBytes();\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ImageHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\n#if (lime && lime_cffi && !macro)\nimport lime.graphics.Image;\nimport lime.graphics.ImageBuffer;\nimport lime.utils.UInt8Array;\n#end\nimport lime.tools.Platform;\nimport sys.io.File;\nimport sys.io.FileSeek;\nimport sys.FileSystem;\n\nclass ImageHelper\n{\n\tpublic static function rasterizeSVG(path:String, width:Int, height:Int,\n\t\t\tbackgroundColor:Int = null):#if (lime && lime_cffi && !macro) Image #else Dynamic #end\n\t{\n\t\t// public static function rasterizeSVG (svg:Dynamic /*SVG*/, width:Int, height:Int, backgroundColor:Int = null):Image {\n\n\t\t#if (lime && lime_cffi && !macro)\n\t\tif (path == null) return null;\n\n\t\tvar temp = System.getTemporaryFile(\".png\");\n\n\t\ttry\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"neko\", [\n\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), \"svg.n\"),\n\t\t\t\t\"process\",\n\t\t\t\tpath,\n\t\t\t\tStd.string(width),\n\t\t\t\tStd.string(height),\n\t\t\t\ttemp\n\t\t\t], true, true);\n\n\t\t\tif (FileSystem.exists(temp))\n\t\t\t{\n\t\t\t\tvar image = Image.fromFile(temp);\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tFileSystem.deleteFile(temp);\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\n\t\t\t\tif (image.buffer != null)\n\t\t\t\t{\n\t\t\t\t\treturn image;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\tvar rasterizer = Haxelib.getPath(new Haxelib(\"lime\")) + \"/templates/bin/batik/batik-rasterizer.jar\";\n\t\tvar args = [\n\t\t\t\"-Dapple.awt.UIElement=true\",\n\t\t\t\"-jar\",\n\t\t\trasterizer,\n\t\t\t\"-d\",\n\t\t\ttemp,\n\t\t\t\"-w\",\n\t\t\tStd.string(width),\n\t\t\t\"-h\",\n\t\t\tStd.string(height)\n\t\t];\n\n\t\tif (backgroundColor != null)\n\t\t{\n\t\t\tvar a:Int = ((backgroundColor >> 24) & 0xFF);\n\t\t\tvar r:Int = ((backgroundColor >> 16) & 0xFF);\n\t\t\tvar g:Int = ((backgroundColor >> 8) & 0xFF);\n\t\t\tvar b:Int = (backgroundColor & 0xFF);\n\n\t\t\targs.push(\"-bg\");\n\t\t\targs.push(a + \".\" + r + \".\" + g + \".\" + b);\n\t\t}\n\n\t\targs.push(path);\n\n\t\tif (System.hostPlatform == MAC)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar found = false;\n\n\t\t\t\tif (FileSystem.exists(\"/System/Library/Java/JavaVirtualMachines\"))\n\t\t\t\t{\n\t\t\t\t\tfound = (FileSystem.readDirectory(\"/System/Library/Java/JavaVirtualMachines\").length > 0);\n\t\t\t\t}\n\n\t\t\t\tif (!found && FileSystem.exists(\"/Library/Java/JavaVirtualMachines\"))\n\t\t\t\t{\n\t\t\t\t\tfound = (FileSystem.readDirectory(\"/Library/Java/JavaVirtualMachines\").length > 0);\n\t\t\t\t}\n\n\t\t\t\tif (!found)\n\t\t\t\t{\n\t\t\t\t\tif (Log.verbose) Log.warn(\"Skipping SVG to PNG rasterization step, no Java runtime detected\");\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"java\", args, true, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.runProcess(\"\", \"java\", args, true, true, true);\n\t\t}\n\n\t\tif (FileSystem.exists(temp))\n\t\t{\n\t\t\tvar image = Image.fromFile(temp);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFileSystem.deleteFile(temp);\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tif (image.buffer != null)\n\t\t\t{\n\t\t\t\treturn image;\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\tpublic static function readPNGImageSize(path:String)\n\t{\n\t\tvar toReturn = {width: 0, height: 0};\n\t\tvar fileInput = File.read(path);\n\t\tvar header = (fileInput.readByte() << 8) | fileInput.readByte();\n\n\t\tif (header == 0x8950)\n\t\t{\n\t\t\tfileInput.seek(8 + 4 + 4, FileSeek.SeekBegin);\n\n\t\t\tvar width = (fileInput.readByte() << 24) | (fileInput.readByte() << 16) | (fileInput.readByte() << 8) | fileInput.readByte();\n\t\t\tvar height = (fileInput.readByte() << 24) | (fileInput.readByte() << 16) | (fileInput.readByte() << 8) | fileInput.readByte();\n\n\t\t\ttoReturn =\n\t\t\t\t{\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height\n\t\t\t\t};\n\t\t}\n\n\t\tfileInput.close();\n\n\t\treturn toReturn;\n\t}\n\n\tpublic static function resizeImage(image:#if (lime && lime_cffi && !macro) Image #else Dynamic #end, width:Int,\n\t\t\theight:Int):#if (lime && lime_cffi && !macro) Image #else Dynamic #end\n\t{\n\t\t#if (lime && lime_cffi && !macro)\n\t\tif (image == null) return null;\n\n\t\tif (image.width == width && image.height == height)\n\t\t{\n\t\t\treturn image;\n\t\t}\n\n\t\timage.resize(width, height);\n\t\t#end\n\n\t\treturn image;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/JavaHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport sys.io.File;\n\nclass JavaHelper\n{\n\tpublic static function copyLibraries(templatePaths:Array<String>, platformName:String, targetPath:String)\n\t{\n\t\tSystem.recursiveCopyTemplate(templatePaths, \"java/ndll/\" + platformName, targetPath);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/Keystore.hx",
    "content": "package lime.tools;\n\nclass Keystore\n{\n\tpublic var alias:String;\n\tpublic var aliasPassword:String;\n\tpublic var password:String;\n\tpublic var path:String;\n\tpublic var type:String;\n\n\tpublic function new(path:String = null, password:String = null, alias:String = null, aliasPassword:String = null)\n\t{\n\t\tthis.path = path;\n\t\tthis.password = password;\n\t\tthis.alias = alias;\n\t\tthis.aliasPassword = aliasPassword;\n\t}\n\n\tpublic function clone():Keystore\n\t{\n\t\treturn new Keystore(path, password, alias, aliasPassword);\n\t}\n\n\tpublic function merge(keystore:Keystore):Void\n\t{\n\t\tif (keystore != null)\n\t\t{\n\t\t\tif (keystore.path != null && keystore.path != \"\") path = keystore.path;\n\t\t\tif (keystore.password != null) password = keystore.password;\n\t\t\tif (keystore.alias != null) alias = keystore.alias;\n\t\t\tif (keystore.aliasPassword != null) aliasPassword = keystore.aliasPassword;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/LaunchStoryboard.hx",
    "content": "package lime.tools;\n\nimport hxp.ObjectTools;\n\nclass LaunchStoryboard\n{\n\tpublic var assetsPath:String;\n\tpublic var assets:Array<LaunchStoryboardAsset>;\n\tpublic var path:String;\n\n\tpublic var template:String;\n\tpublic var templateContext:Dynamic;\n\n\tpublic function new()\n\t{\n\t\tassets = [];\n\t\ttemplateContext = {};\n\t}\n\n\tpublic function clone():LaunchStoryboard\n\t{\n\t\tvar launchStoryboard = new LaunchStoryboard();\n\t\tlaunchStoryboard.assetsPath = assetsPath;\n\t\tlaunchStoryboard.assets = assets.copy();\n\t\tlaunchStoryboard.path = path;\n\t\tlaunchStoryboard.template = template;\n\t\tlaunchStoryboard.templateContext = ObjectTools.copyFields(templateContext, {});\n\n\t\treturn launchStoryboard;\n\t}\n\n\tpublic function merge(launchStoryboard:LaunchStoryboard):Void\n\t{\n\t\tif (launchStoryboard != null)\n\t\t{\n\t\t\tif (launchStoryboard.assetsPath != null) assetsPath = launchStoryboard.assetsPath;\n\t\t\tif (launchStoryboard.assets != null) assets = launchStoryboard.assets;\n\t\t\tif (launchStoryboard.path != null) path = launchStoryboard.path;\n\t\t\tif (launchStoryboard.template != null) template = launchStoryboard.template;\n\t\t\tif (launchStoryboard.templateContext != null) templateContext = launchStoryboard.templateContext;\n\t\t}\n\t}\n}\n\nclass LaunchStoryboardAsset\n{\n\tpublic var type:String;\n\n\tpublic function new(type:String)\n\t{\n\t\tthis.type = type;\n\t}\n}\n\nclass ImageSet extends LaunchStoryboardAsset\n{\n\tpublic var name:String;\n\tpublic var width = 0;\n\tpublic var height = 0;\n\n\tpublic function new(name:String)\n\t{\n\t\tsuper(\"imageset\");\n\t\tthis.name = name;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/Library.hx",
    "content": "package lime.tools;\n\nimport hxp.Path;\n\nclass Library\n{\n\tpublic var embed:Null<Bool>;\n\tpublic var generate:Null<Bool>;\n\tpublic var name:String;\n\tpublic var prefix:String;\n\tpublic var preload:Null<Bool>;\n\tpublic var sourcePath:String;\n\tpublic var type:String;\n\n\tpublic function new(sourcePath:String, name:String = \"\", type:String = null, embed:Null<Bool> = null, preload:Null<Bool> = null,\n\t\t\tgenerate:Null<Bool> = null, prefix:String = \"\")\n\t{\n\t\tthis.sourcePath = sourcePath;\n\n\t\tif (name == \"\")\n\t\t{\n\t\t\tthis.name = Path.withoutDirectory(Path.withoutExtension(sourcePath));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.name = name;\n\t\t}\n\n\t\tthis.type = type;\n\t\tthis.embed = embed;\n\t\tthis.preload = preload;\n\t\tthis.generate = generate;\n\t\tthis.prefix = prefix;\n\t}\n\n\tpublic function clone():Library\n\t{\n\t\treturn new Library(sourcePath, name, type, embed, preload, generate, prefix);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/MetaData.hx",
    "content": "package lime.tools;\n\n@:forward\nabstract MetaData({\n\t@:optional var buildNumber:String;\n\t@:optional var company:String;\n\t@:optional var companyId:String;\n\t@:optional var companyUrl:String;\n\t@:optional var description:String;\n\t@:optional var packageName:String;\n\t@:optional var title:String;\n\t@:optional var version:String;\n\t@:optional var copyrightYears:String;\n}) from Dynamic\n{\n\t@:noCompletion\n\tpublic static var expectedFields:MetaData = {\n\t\tbuildNumber: \"\",\n\t\tcompany: \"\",\n\t\tcompanyId: \"\",\n\t\tcompanyUrl: \"\",\n\t\tdescription: \"\",\n\t\tpackageName: \"\",\n\t\ttitle: \"\",\n\t\tversion: \"\",\n\t\tcopyrightYears: \"\"\n\t};\n}\n"
  },
  {
    "path": "src/lime/tools/ModuleData.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\n\nclass ModuleData\n{\n\tpublic var classNames:Array<String>;\n\tpublic var excludeTypes:Array<String>;\n\tpublic var haxeflags:Array<String>;\n\tpublic var includeTypes:Array<String>;\n\tpublic var name:String;\n\n\tpublic function new(name:String)\n\t{\n\t\tthis.name = name;\n\t\tclassNames = [];\n\t\texcludeTypes = [];\n\t\thaxeflags = [];\n\t\tincludeTypes = [];\n\t}\n\n\tpublic function clone():ModuleData\n\t{\n\t\tvar copy = new ModuleData(name);\n\t\tcopy.classNames = classNames.copy();\n\t\tcopy.excludeTypes = excludeTypes.copy();\n\t\tcopy.haxeflags = haxeflags.copy();\n\t\tcopy.includeTypes = includeTypes.copy();\n\t\treturn copy;\n\t}\n\n\tpublic function merge(other:ModuleData):Bool\n\t{\n\t\tif (other.name == name)\n\t\t{\n\t\t\tclassNames = ArrayTools.concatUnique(classNames, other.classNames);\n\t\t\texcludeTypes = ArrayTools.concatUnique(excludeTypes, other.excludeTypes);\n\t\t\thaxeflags = ArrayTools.concatUnique(haxeflags, other.haxeflags);\n\t\t\tincludeTypes = ArrayTools.concatUnique(includeTypes, other.includeTypes);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ModuleHelper.hx",
    "content": "package lime.tools;\n\n#if !macro\nimport hxp.*;\nimport lime.tools.Dependency;\nimport lime.tools.HXProject;\nimport lime.tools.ModuleData;\nimport sys.io.File;\nimport sys.FileSystem;\nclass ModuleHelper\n{\n\tpublic static function addModuleSource(source:String, moduleData:ModuleData, include:Array<String>, exclude:Array<String>, packageName:String = null)\n\t{\n\t\tif (!FileSystem.exists(source))\n\t\t{\n\t\t\tLog.error(\"Could not find module source \\\"\" + source + \"\\\"\");\n\t\t\treturn;\n\t\t}\n\n\t\tmoduleData.haxeflags.push(\"-cp \" + source);\n\n\t\tvar path = source;\n\n\t\tif (packageName != null && packageName.length > 0)\n\t\t{\n\t\t\tpath = Path.combine(source, StringTools.replace(packageName, \".\", \"/\"));\n\t\t}\n\n\t\tparseModuleSource(source, moduleData, include, exclude, path);\n\t}\n\n\tpublic static function buildModules(project:HXProject, tempDirectory:String, outputDirectory:String):Void\n\t{\n\t\ttempDirectory = Path.combine(tempDirectory, \"lib\");\n\t\toutputDirectory = Path.combine(outputDirectory, \"lib\");\n\n\t\tSystem.mkdir(tempDirectory);\n\t\tSystem.mkdir(outputDirectory);\n\n\t\tvar importName:String;\n\t\tvar hxmlPath:String;\n\t\tvar importPath:String;\n\t\tvar outputPath:String;\n\t\tvar moduleImport:String;\n\t\tvar hxml:String;\n\n\t\tfor (module in project.modules)\n\t\t{\n\t\t\tif (module.classNames.length > 0)\n\t\t\t{\n\t\t\t\timportName = \"Module\" + module.name.charAt(0).toUpperCase() + module.name.substr(1);\n\n\t\t\t\thxmlPath = Path.combine(tempDirectory, module.name + \".hxml\");\n\t\t\t\timportPath = Path.combine(tempDirectory, importName + \".hx\");\n\n\t\t\t\tif (project.targetFlags.exists(\"final\"))\n\t\t\t\t{\n\t\t\t\t\toutputPath = Path.combine(outputDirectory, module.name + \".min.js\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toutputPath = Path.combine(outputDirectory, module.name + \".js\");\n\t\t\t\t}\n\n\t\t\t\tmoduleImport = \"package;\\n\\nimport \" + module.classNames.join(\";\\nimport \") + \";\";\n\n\t\t\t\thxml = \"-cp \" + tempDirectory;\n\t\t\t\thxml += \"\\n\" + module.haxeflags.join(\"\\n\");\n\n\t\t\t\tfor (haxelib in project.haxelibs)\n\t\t\t\t{\n\t\t\t\t\thxml += \"\\n-cp \" + Haxelib.getPath(haxelib);\n\t\t\t\t}\n\n\t\t\t\tfor (key in project.haxedefs.keys())\n\t\t\t\t{\n\t\t\t\t\tif (key != \"no-compilation\")\n\t\t\t\t\t{\n\t\t\t\t\t\tvar value = project.haxedefs.get(key);\n\n\t\t\t\t\t\tif (value == null || value == \"\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thxml += \"\\n-D \" + key;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thxml += \"\\n-D \" + key + \"=\" + value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\thxml += \"\\n-D html5\";\n\t\t\t\thxml += \"\\n-D html\";\n\t\t\t\thxml += \"\\n--no-inline\";\n\t\t\t\thxml += \"\\n-dce no\";\n\t\t\t\thxml += \"\\n-js \" + outputPath;\n\n\t\t\t\tvar includeTypes = module.classNames.concat(module.includeTypes);\n\t\t\t\tvar excludeTypes = module.excludeTypes;\n\n\t\t\t\tfor (otherModule in project.modules)\n\t\t\t\t{\n\t\t\t\t\tif (otherModule != module)\n\t\t\t\t\t{\n\t\t\t\t\t\texcludeTypes = excludeTypes.concat(ArrayTools.getUnique(includeTypes, otherModule.classNames));\n\t\t\t\t\t\texcludeTypes = excludeTypes.concat(ArrayTools.getUnique(includeTypes, otherModule.includeTypes));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (excludeTypes.length > 0)\n\t\t\t\t{\n\t\t\t\t\t// order by short filters first, so they match earlier\n\t\t\t\t\thaxe.ds.ArraySort.sort(excludeTypes, shortFirst);\n\t\t\t\t\thxml += \"\\n--macro lime.tools.ModuleHelper.exclude(['\" + excludeTypes.join(\"','\") + \"'])\";\n\t\t\t\t}\n\n\t\t\t\t// order by short filters first, so they match earlier\n\t\t\t\thaxe.ds.ArraySort.sort(includeTypes, shortFirst);\n\t\t\t\thxml += \"\\n--macro lime.tools.ModuleHelper.expose(['\" + includeTypes.join(\"','\") + \"'])\";\n\t\t\t\t// hxml += \"\\n--macro lime.tools.ModuleHelper.generate()\";\n\n\t\t\t\thxml += \"\\n\" + importName;\n\n\t\t\t\tFile.saveContent(importPath, moduleImport);\n\t\t\t\tFile.saveContent(hxmlPath, hxml);\n\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxmlPath]);\n\n\t\t\t\tpatchFile(outputPath);\n\n\t\t\t\tif (project.targetFlags.exists(\"final\"))\n\t\t\t\t{\n\t\t\t\t\tHTML5Helper.minify(project, outputPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function parseModuleSource(source:String, moduleData:ModuleData, include:Array<String>, exclude:Array<String>, currentPath:String):Void\n\t{\n\t\tvar files = FileSystem.readDirectory(currentPath);\n\t\tvar filePath:String, className:String, packageName:String;\n\n\t\tfor (file in files)\n\t\t{\n\t\t\tfilePath = Path.combine(currentPath, file);\n\n\t\t\tif (FileSystem.isDirectory(filePath))\n\t\t\t{\n\t\t\t\tpackageName = StringTools.replace(filePath, source, \"\");\n\t\t\t\tpackageName = StringTools.replace(packageName, \"\\\\\", \"/\");\n\n\t\t\t\twhile (StringTools.startsWith(packageName, \"/\"))\n\t\t\t\t\tpackageName = packageName.substr(1);\n\n\t\t\t\tpackageName = StringTools.replace(packageName, \"/\", \".\");\n\n\t\t\t\tif (StringTools.filter(packageName, include, exclude))\n\t\t\t\t{\n\t\t\t\t\tparseModuleSource(source, moduleData, include, exclude, filePath);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (Path.extension(file) != \"hx\") continue;\n\n\t\t\t\tclassName = StringTools.replace(filePath, source, \"\");\n\t\t\t\tclassName = StringTools.replace(className, \"\\\\\", \"/\");\n\n\t\t\t\twhile (StringTools.startsWith(className, \"/\"))\n\t\t\t\t\tclassName = className.substr(1);\n\n\t\t\t\tclassName = StringTools.replace(className, \"/\", \".\");\n\t\t\t\tclassName = StringTools.replace(className, \".hx\", \"\");\n\n\t\t\t\tif (StringTools.filter(className, include, exclude))\n\t\t\t\t{\n\t\t\t\t\tmoduleData.classNames.push(className);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function patchFile(outputPath:String):Void\n\t{\n\t\tvar replaceString = \"var $hxClasses = {}\";\n\t\tvar replacement = \"if (!$hx_exports.$hxClasses) $hx_exports.$hxClasses = {};\\nvar $hxClasses = $hx_exports.$hxClasses\";\n\n\t\tSystem.replaceText(outputPath, replaceString, replacement);\n\t}\n\n\tpublic static function updateProject(project:HXProject):Void\n\t{\n\t\tvar excludeTypes = [];\n\t\tvar suffix = (project.targetFlags.exists(\"final\") ? \".min\" : \"\") + \".js\";\n\t\tvar hasModules = false;\n\n\t\tfor (module in project.modules)\n\t\t{\n\t\t\tproject.dependencies.push(new Dependency(\"./lib/\" + module.name + suffix, null));\n\n\t\t\texcludeTypes = ArrayTools.concatUnique(excludeTypes, module.classNames);\n\t\t\texcludeTypes = ArrayTools.concatUnique(excludeTypes, module.excludeTypes);\n\t\t\texcludeTypes = ArrayTools.concatUnique(excludeTypes, module.includeTypes);\n\n\t\t\thasModules = true;\n\t\t}\n\n\t\tif (excludeTypes.length > 0)\n\t\t{\n\t\t\t// order by short filters first, so they match earlier\n\t\t\thaxe.ds.ArraySort.sort(excludeTypes, shortFirst);\n\t\t\tproject.haxeflags.push(\"--macro lime.tools.ModuleHelper.exclude(['\" + excludeTypes.join(\"','\") + \"'])\");\n\t\t}\n\n\t\t// if (hasModules) {\n\t\t//\n\t\t// project.haxeflags.push (\"--macro lime.tools.ModuleHelper.generate()\");\n\t\t//\n\t\t// }\n\t}\n\n\tpublic static function shortFirst(a, b):Int\n\t{\n\t\tif (a.length < b.length) return -1;\n\t\telse if (a.length > b.length) return 1;\n\t\treturn 0;\n\t}\n}\n#else\nimport haxe.macro.Compiler;\nimport haxe.macro.Context;\nimport haxe.macro.Type;\nimport haxe.macro.Expr;\nimport haxe.macro.JSGenApi;\n\nusing haxe.macro.Tools;\nusing Lambda;\nusing StringTools;\n\nclass ModuleHelper\n{\n\tpublic static function exclude(types:Array<String>):Void\n\t{\n\t\tfor (type in types)\n\t\t{\n\t\t\tCompiler.exclude(type);\n\t\t\tCompiler.addMetadata(\"@:native(\\\"$hx_exports.\" + type + \"\\\")\", type);\n\t\t}\n\t}\n\n\tpublic static function expose(classNames:Array<String>):Void\n\t{\n\t\tfor (className in classNames)\n\t\t{\n\t\t\tCompiler.addMetadata(\"@:expose('\" + className + \"')\", className);\n\t\t}\n\t}\n\n\tpublic static function generate()\n\t{\n\t\t// Compiler.setCustomJSGenerator(function(api) new Generator(api).generate());\n\t}\n}\n\nclass Generator\n{\n\tvar api:JSGenApi;\n\tvar buf:StringBuf;\n\tvar inits:List<TypedExpr>;\n\tvar statics:List<{c:ClassType, f:ClassField}>;\n\tvar packages:haxe.ds.StringMap<Bool>;\n\tvar forbidden:haxe.ds.StringMap<Bool>;\n\tvar jsModern:Bool;\n\tvar jsFlatten:Bool;\n\tvar dce:Bool;\n\tvar indentLevel = 0;\n\tvar genExtend = false;\n\tvar genExpose = false;\n\tvar iRE = ~/^(.*)$/gm;\n\n\tpublic function new(api)\n\t{\n\t\tthis.api = api;\n\t\tbuf = new StringBuf();\n\t\tinits = new List();\n\t\tstatics = new List();\n\t\tpackages = new haxe.ds.StringMap();\n\t\tforbidden = new haxe.ds.StringMap();\n\t\tjsModern = !Context.defined(\"js-classic\");\n\t\tjsFlatten = !Context.defined(\"js-unflatten\");\n\t\tdce = Context.definedValue(\"dce\") != \"no\";\n\t\tfor (x in [\"prototype\", \"__proto__\", \"constructor\"])\n\t\t\tforbidden.set(x, true);\n\t\tapi.setTypeAccessor(getType);\n\n\t\tfor (t in api.types)\n\t\t{\n\t\t\tswitch (t)\n\t\t\t{\n\t\t\t\tcase TInst(c, _):\n\t\t\t\t\tif (!c.get().isExtern && c.get().superClass != null) genExtend = true;\n\t\t\t\t\tif (c.get().meta.has(\":expose\")) genExpose = true;\n\t\t\t\t\tif (genExtend && genExpose) break;\n\t\t\t\tcase _:\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getType(t:Type)\n\t{\n\t\treturn switch (t)\n\t\t{\n\t\t\tcase TInst(c, _): getPath(c.get());\n\t\t\tcase TEnum(e, _): getPath(e.get());\n\t\t\tcase TAbstract(a, _): getPath(a.get());\n\t\t\tdefault: throw \"assert\";\n\t\t};\n\t}\n\n\tinline function indent(str:String, level = 0, notFirst = false):String\n\t{\n\t\tvar first = true;\n\t\tvar lines = str.split(\"\\n\");\n\t\tvar nstr = \"\";\n\t\tfor (i in 0...lines.length)\n\t\t{\n\t\t\tvar s = lines[i];\n\t\t\tif (first && notFirst)\n\t\t\t{\n\t\t\t\tfirst = false;\n\t\t\t\tnstr += s;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (i in 0...level)\n\t\t\t\t{\n\t\t\t\t\tnstr += '\\t';\n\t\t\t\t}\n\t\t\t\tnstr += '$s';\n\t\t\t}\n\t\t\tif (i < lines.length - 1) nstr += \"\\n\";\n\t\t}\n\t\treturn nstr;\n\t}\n\n\tinline function print(str)\n\t{\n\t\tprinti(str, indentLevel);\n\t}\n\n\tinline function printi(str, level = 0, notFirst = false)\n\t{\n\t\tbuf.add(indent(str, level, notFirst));\n\t}\n\n\tinline function println(s:String = \"\")\n\t{\n\t\tprint(s);\n\t\tnewline();\n\t}\n\n\tinline function printn(s:String = \"\")\n\t\tprint('$s\\n');\n\n\tinline function printin(str, level = 0, notFirst = false)\n\t\tbuf.add(indent(str, level, notFirst) + \"\\n\");\n\n\tfunction printif(f:String, s:String)\n\t{\n\t\tif (api.hasFeature(f)) println(s);\n\t}\n\n\tinline function newline()\n\t{\n\t\tbuf.add(\";\\n\");\n\t}\n\n\tfunction field(p, staticField = true)\n\t{\n\t\tif (staticField) return api.isKeyword(p) ? '[\"$p\"]' : '.$p';\n\t\telse\n\t\t\treturn api.isKeyword(p) ? '\\'$p\\'' : p;\n\t}\n\n\tfunction genPackage(p:Array<String>)\n\t{\n\t\tif (p.length == 0) print(\"var \");\n\t\tvar full:String = null;\n\t\tfor (x in p)\n\t\t{\n\t\t\tvar prev = full;\n\t\t\tif (full == null) full = x;\n\t\t\telse\n\t\t\t\tfull += \".\" + x;\n\t\t\tif (packages.exists(full)) continue;\n\t\t\tpackages.set(full, true);\n\t\t\tif (prev == null) println('var $x = ' + (jsModern ? \"{}\" : '$x || {}'));\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar p = prev + field(x);\n\t\t\t\tprintln((jsModern ? '' : 'if(!$p) ') + '$p = {}');\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getPath(t:BaseType)\n\t{\n\t\treturn packClass(t.pack, t.name);\n\t}\n\n\tfunction getDotPath(t:BaseType)\n\t{\n\t\treturn (t.pack.length == 0) ? t.name : t.pack.join('.') + '.' + t.name;\n\t}\n\n\tfunction packClass(p:Array<String>, name:String)\n\t{\n\t\tif (jsFlatten)\n\t\t{\n\t\t\tvar r = '';\n\t\t\tfor (i in p)\n\t\t\t{\n\t\t\t\tr += i.replace(\"_\", \"_$\") + '_';\n\t\t\t}\n\t\t\treturn r + name.replace(\"_\", \"_$\");\n\t\t}\n\t\treturn (p.length == 0) ? name : p.join('.') + '.' + name;\n\t}\n\n\tfunction checkFieldName(c:ClassType, f:ClassField)\n\t{\n\t\tif (forbidden.exists(f.name)) Context.error(\"The field \" + f.name + \" is not allowed in JS\", c.pos);\n\t}\n\n\tfunction genClassField(c:ClassType, p:String, f:ClassField, first:Bool)\n\t{\n\t\tcheckFieldName(c, f);\n\t\tvar field = field(f.name, false);\n\t\tvar e = f.expr();\n\t\tif (e != null)\n\t\t{\n\t\t\tprintin((first ? \"\" : \",\") + '$field: ' + api.generateValue(e), indentLevel, false);\n\t\t\treturn false;\n\t\t}\n\t\telse if (!dce && (f.kind.match(FVar(AccNormal, AccNormal) | FMethod(_)) || f.meta.has(\":isVar\")))\n\t\t{\n\t\t\tprintin((first ? \"\" : \",\") + '$field: null', indentLevel, false);\n\t\t\treturn false;\n\t\t}\n\t\treturn first;\n\t}\n\n\tfunction genStaticField(c:ClassType, p:String, f:ClassField)\n\t{\n\t\tcheckFieldName(c, f);\n\t\tvar field = field(f.name);\n\t\tvar e = f.expr();\n\t\tif (e != null)\n\t\t{\n\t\t\tswitch (f.kind)\n\t\t\t{\n\t\t\t\tcase FMethod(_):\n\t\t\t\t\tprint('$p$field = ');\n\t\t\t\t\tprintln(api.generateValue(e));\n\t\t\t\tdefault:\n\t\t\t\t\tstatics.add({c: c, f: f});\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!dce && (f.kind.match(FVar(AccNormal, AccNormal) | FMethod(_)) || f.meta.has(\":isVar\"))) println('$p$field = null');\n\t\t}\n\t}\n\n\tfunction getProperties(fields:Array<ClassField>):String\n\t{\n\t\tvar properties:Array<String> = [];\n\t\tfor (f in fields)\n\t\t{\n\t\t\tswitch (f.kind)\n\t\t\t{\n\t\t\t\tcase FVar(g, s):\n\t\t\t\t\t{\n\t\t\t\t\t\tif (g == AccCall) properties.push('get_${f.name}:\"get_${f.name}\"');\n\t\t\t\t\t\tif (s == AccCall) properties.push('set_${f.name}:\"set_${f.name}\"');\n\t\t\t\t\t}\n\t\t\t\tcase _:\n\t\t\t}\n\t\t}\n\t\treturn (properties.length > 0) ? ('{' + properties.join(\",\") + '}') : \"\";\n\t}\n\n\tfunction genClass(c:ClassType)\n\t{\n\t\tapi.setCurrentClass(c);\n\n\t\tvar hxClasses = api.hasFeature(\"Type.resolveClass\");\n\t\tvar p = getPath(c);\n\t\tvar pn = getDotPath(c);\n\t\tif (jsFlatten) print(\"var \");\n\t\telse\n\t\t\tgenPackage(c.pack);\n\n\t\tif (hxClasses && !jsModern) print('$p = $$hxClasses[\"$pn\"] = ');\n\t\telse\n\t\t\tprint('$p = ' + (c.meta.has(\":expose\") ? '$$hx_exports.$p = ' : ''));\n\t\tif (c.constructor != null) print(api.generateValue(c.constructor.get().expr()));\n\t\telse\n\t\t\tprint(\"function() { }\");\n\t\tnewline();\n\t\tif (hxClasses && jsModern) println('$$hxClasses[\"$pn\"] = $p');\n\n\t\tvar name = pn.split(\".\").map(api.quoteString).join(\",\");\n\t\tif (api.hasFeature(\"js.Boot.isClass\"))\n\t\t{\n\t\t\tif (api.hasFeature(\"Type.getClassName\")) println('$p.__name__ = [$name]');\n\t\t\telse\n\t\t\t\tprintln('$p.__name__ = true');\n\t\t}\n\t\tif (c.interfaces.length > 0)\n\t\t{\n\t\t\tvar me = this;\n\t\t\tvar inter = c.interfaces.map(function(i) return me.getPath(i.t.get())).join(\",\");\n\t\t\tprint('$p.__interfaces__ = [$inter]');\n\t\t\tnewline();\n\t\t}\n\t\tvar has_property_reflection = api.hasFeature(\"Reflect.getProperty\") || api.hasFeature(\"Reflect.setProperty\");\n\n\t\tif (has_property_reflection)\n\t\t{\n\t\t\tvar staticProperties = getProperties(c.statics.get());\n\t\t\tif (staticProperties.length > 0) printn('$p.__properties__ = $staticProperties');\n\t\t}\n\t\tfor (f in c.statics.get())\n\t\t\tgenStaticField(c, p, f);\n\n\t\tvar has_class = api.hasFeature(\"js.Boot.getClass\") && (c.superClass != null || c.fields.get().length > 0 || c.constructor != null);\n\t\tvar has_prototype = has_class || c.superClass != null || c.fields.get().length > 0;\n\n\t\tif (has_prototype)\n\t\t{\n\t\t\tif (c.superClass != null)\n\t\t\t{\n\t\t\t\tvar psup = getPath(c.superClass.t.get());\n\t\t\t\tprintln('$p.__super__ = $psup');\n\t\t\t\tprintn('$p.prototype = $$extend($psup.prototype,{');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprintn('$p.prototype = {');\n\t\t\t}\n\t\t\tindentLevel++;\n\t\t\tvar first = true;\n\t\t\tfor (f in c.fields.get())\n\t\t\t{\n\t\t\t\tswitch (f.kind)\n\t\t\t\t{\n\t\t\t\t\tcase FVar(r, _):\n\t\t\t\t\t\tif (r == AccResolve) continue;\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t\tfirst = genClassField(c, p, f, first);\n\t\t\t}\n\t\t\tif (has_class)\n\t\t\t{\n\t\t\t\tif (!first) print(\",\");\n\t\t\t\tprinti('__class__: $p\\n');\n\t\t\t}\n\t\t\tif (has_property_reflection)\n\t\t\t{\n\t\t\t\tvar properties = getProperties(c.fields.get());\n\t\t\t\tif (properties.length > 0) if (c.superClass != null)\n\t\t\t\t{\n\t\t\t\t\tvar psup = getPath(c.superClass.t.get());\n\t\t\t\t\tprintn((first ? \"\" : \",\") + '__properties__: $$extend($psup.prototype.__properties__,$properties)');\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tprintn((first ? \"\" : \",\") + '__properties__: $properties');\n\t\t\t}\n\t\t\tindentLevel--;\n\t\t\tif (c.superClass != null) printin(\"});\", 0);\n\t\t\telse\n\t\t\t\tprintin(\"};\", 0);\n\t\t}\n\t}\n\n\tfunction genEnum(e:EnumType)\n\t{\n\t\tvar p = getPath(e);\n\t\tvar pn = getDotPath(e);\n\t\tvar names = pn.split(\".\").map(api.quoteString).join(\",\");\n\t\tvar constructs = e.names.map(api.quoteString).join(\",\");\n\t\tvar hxClasses = api.hasFeature(\"Type.resolveEnum\");\n\n\t\tif (jsFlatten) print(\"var \");\n\t\telse\n\t\t\tgenPackage(e.pack);\n\n\t\tif (hxClasses) print('$p = $$hxClasses[\"$pn\"] = {');\n\t\telse\n\t\t\tprint('$p = {');\n\n\t\tif (api.hasFeature(\"js.Boot.isEnum\")) if (api.hasFeature(\"Type.getEnumName\")) print(' __ename__ : [$names],');\n\t\telse\n\t\t\tprint(' __ename__ : true,');\n\t\tprintln(' __constructs__ : [$constructs] }');\n\t\tfor (c in e.constructs.keys())\n\t\t{\n\t\t\tvar c = e.constructs.get(c);\n\t\t\tvar f = field(c.name);\n\t\t\tprint('$p$f = ');\n\t\t\tswitch (c.type)\n\t\t\t{\n\t\t\t\tcase TFun(args, _):\n\t\t\t\t\tvar sargs = args.map(function(a) return a.name).join(\",\");\n\t\t\t\t\tprint('function($sargs) { var $$x = [\"${c.name}\",${c.index},$sargs]; $$x.__enum__ = $p; $$x.toString = $$estr; return $$x; }');\n\t\t\t\tdefault:\n\t\t\t\t\tprintln(\"[\" + api.quoteString(c.name) + \",\" + c.index + \"]\");\n\t\t\t\t\tif (api.hasFeature(\"may_print_enum\")) println('$p$f.toString = $$estr');\n\t\t\t\t\tprint('$p$f.__enum__ = $p');\n\t\t\t}\n\t\t\tnewline();\n\t\t}\n\t\tif (api.hasFeature(\"Type.allEnums\"))\n\t\t{\n\t\t\tvar ec = Lambda.fold(e.constructs, function(c:EnumField, r:Array<String>)\n\t\t\t{\n\t\t\t\tif (!c.type.match(TFun(_, _))) r.push('$p.${c.name}');\n\t\t\t\treturn r;\n\t\t\t}, []);\n\t\t\tif (ec.length > 0) println('$p.__empty_constructs__ = [' + ec.join(\",\") + ']');\n\t\t}\n\t\tvar meta = api.buildMetaData(e);\n\t\tif (meta != null)\n\t\t{\n\t\t\tprint('$p.__meta__ = ');\n\t\t\tprintln(api.generateValue(meta));\n\t\t}\n\t}\n\n\tfunction genType(t:Type)\n\t{\n\t\tswitch (t)\n\t\t{\n\t\t\tcase TInst(c, _):\n\t\t\t\tvar c = c.get();\n\t\t\t\tif (c.init != null) inits.add(c.init);\n\t\t\t\tif (!c.isExtern) genClass(c);\n\t\t\tcase TEnum(r, _):\n\t\t\t\tvar e = r.get();\n\t\t\t\tif (!e.isExtern) genEnum(e);\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tpublic function generate()\n\t{\n\t\tif (jsModern) println('(function (' + (genExpose ? \"$hx_exports\" : \"\") + \", $global) { \\\"use strict\\\"\");\n\n\t\tif (jsModern) println(\"if (!$hx_exports.$hxClasses) $hx_exports.$hxClasses = {}\");\n\n\t\tvar vars = [];\n\t\tif (api.hasFeature(\"Type.resolveClass\") || api.hasFeature(\"Type.resolveEnum\")) // vars.push(\"$hxClasses = \" + (jsModern? \"{}\" : \"$hxClasses || {}\"));\n\t\t\tvars.push(\"$hxClasses = \" + (jsModern ? \"$hx_exports.$hxClasses\" : \"$hxClasses || {}\"));\n\t\tif (api.hasFeature(\"may_print_enum\")) vars.push(\"$estr = function() { return \" + packClass([\"js\"], \"Boot\") + \".__string_rec(this,''); }\");\n\t\tif (vars.length > 0) println(\"var \" + vars.join(\",\"));\n\n\t\tif (genExtend) print(\"function $extend(from, fields) {\n\tfunction Inherit() {} Inherit.prototype = from; var proto = new Inherit();\n\tfor (var name in fields) proto[name] = fields[name];\n\tif( fields.toString !== Object.prototype.toString ) proto.toString = fields.toString;\n\treturn proto;\n}\\n\");\n\n\t\tfor (t in api.types)\n\t\t\tgenType(t);\n\n\t\tif (api.hasFeature(\"use.$iterator\"))\n\t\t{\n\t\t\tapi.addFeature(\"use.$bind\");\n\t\t\tprintn(\"function $iterator(o) { if( o instanceof Array ) return function() { return HxOverrides.iter(o); }; return typeof(o.iterator) == 'function' ? $bind(o,o.iterator) : o.iterator; }\");\n\t\t}\n\t\tif (api.hasFeature(\"use.$bind\"))\n\t\t{\n\t\t\tprintln(\"var $_, $fid = 0\");\n\t\t\tprintn(\"function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $fid++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = function(){ return f.method.apply(f.scope, arguments); }; f.scope = o; f.method = m; o.hx__closures__[m.__id__] = f; } return f; }\");\n\t\t}\n\t\tfor (e in inits)\n\t\t\tgenInit(e);\n\t\tfor (s in statics)\n\t\t\tprintln(getPath(s.c) + field(s.f.name) + ' = ' + api.generateValue(s.f.expr()));\n\t\tif (api.main != null) println(api.generateValue(api.main));\n\t\tif (jsModern) print('})('\n\t\t\t+ (genExpose ? 'typeof exports != \"undefined\" ? exports : typeof window != \"undefined\" ? window : typeof self != \"undefined\" ? self : this, ' : '')\n\t\t\t+ 'typeof window != \"undefined\" ? window : typeof global != \"undefined\" ? global : typeof self != \"undefined\" ? self : this);\\n');\n\t\tsys.io.File.saveContent(api.outputFile, buf.toString());\n\t}\n\n\tfunction genInit(e:TypedExpr)\n\t{\n\t\tvar code = api.generateStatement(e);\n\t\t// cosmetic only\n\t\tvar colon = ';';\n\t\tfor (l in code.split('\\n'))\n\t\t{\n\t\t\tif (l == \"{\" || l == \"}\")\n\t\t\t{\n\t\t\t\tcolon = '';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tprintn(l.replace(\"\\t\", \"\") + colon);\n\t\t}\n\t}\n}\n#end\n"
  },
  {
    "path": "src/lime/tools/NekoHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.Platform;\nimport sys.FileSystem;\nimport sys.io.File;\n\nclass NekoHelper\n{\n\tpublic static function copyLibraries(templatePaths:Array<String>, platformName:String, targetPath:String)\n\t{\n\t\t// System.recursiveCopyTemplate (templatePaths, \"neko/ndll/\" + platformName, targetPath);\n\t}\n\n\tpublic static function createExecutable(templatePaths:Array<String>, platformName:String, source:String, target:String, iconPath:String = null):Void\n\t{\n\t\t/*var executablePath = System.findTemplate (templatePaths, \"neko/bin/neko-\" + platformName);\n\t\t\tvar executable = File.getBytes (executablePath);\n\t\t\tvar sourceContents = File.getBytes (source);\n\n\t\t\tvar output = File.write (target, true);\n\t\t\toutput.write (executable);\n\t\t\toutput.write (sourceContents);\n\t\t\toutput.writeString (\"NEKO\");\n\t\t\toutput.writeInt32 (executable.length);\n\t\t\toutput.close (); */\n\n\t\tvar path = Path.tryFullPath(source);\n\t\tvar file = Path.withoutDirectory(path);\n\t\tvar dir = Path.directory(path);\n\n\t\tSystem.runCommand(dir, \"nekotools\", [\"boot\", file]);\n\n\t\tvar path = Path.withoutExtension(source);\n\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tpath += \".exe\";\n\t\t}\n\n\t\tSystem.copyFile(path, target);\n\t}\n\n\tpublic static function createWindowsExecutable(templatePaths:Array<String>, source:String, target:String, iconPath:String):Void\n\t{\n\t\t/*var executablePath = System.findTemplate (templatePaths, \"neko/bin/neko-windows\");\n\t\t\tvar executable = File.getBytes (executablePath);\n\t\t\tvar sourceContents = File.getBytes (source);\n\n\t\t\tvar output = File.write (target, true);\n\t\t\toutput.write (executable);\n\t\t\toutput.close ();\n\n\t\t\tif (iconPath != null && System.hostPlatform == WINDOWS) {\n\n\t\t\t\tvar templates = [ Haxelib.getPath (new Haxelib (#if lime \"lime\" #else \"hxp\" #end)) + \"/templates\" ].concat (templatePaths);\n\t\t\t\tSystem.runCommand (\"\", System.findTemplate (templates, \"bin/ReplaceVistaIcon.exe\"), [ target, iconPath, \"1\" ], true, true);\n\n\t\t\t}\n\n\t\t\tvar executable = File.getBytes (target);\n\t\t\tvar output = File.write (target, true);\n\t\t\toutput.write (executable);\n\t\t\toutput.write (sourceContents);\n\t\t\toutput.writeString (\"NEKO\");\n\t\t\toutput.writeInt32 (executable.length);\n\t\t\toutput.close (); */\n\n\t\tcreateExecutable(templatePaths, null, source, target, iconPath);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/NodeJSHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.Architecture;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\n\nclass NodeJSHelper\n{\n\tpublic static function run(project:HXProject, modulePath:String, args:Array<String> = null):Void\n\t{\n\t\t/*var suffix = switch (System.hostPlatform) {\n\n\t\t\t\tcase Platform.WINDOWS: \"-windows.exe\";\n\t\t\t\tcase Platform.MAC: \"-mac\";\n\t\t\t\tcase Platform.LINUX: \"-linux\";\n\t\t\t\tdefault: return;\n\n\t\t\t}\n\n\t\t\tif (suffix == \"-linux\") {\n\n\t\t\t\tif (System.hostArchitecture == X86) {\n\n\t\t\t\t\tsuffix += \"32\";\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsuffix += \"64\";\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar templatePaths = [ Path.combine (Haxelib.getPath (new Haxelib (#if lime \"lime\" #else \"hxp\" #end)), \"templates\") ].concat (project.templatePaths);\n\t\t\tvar node = System.findTemplate (templatePaths, \"bin/node/node\" + suffix);\n\n\t\t\tif (System.hostPlatform != WINDOWS) {\n\n\t\t\t\tSys.command (\"chmod\", [ \"+x\", node ]);\n\n\t\t\t}\n\n\t\t\tif (args == null) {\n\n\t\t\t\targs = [];\n\n\t\t}*/\n\n\t\targs.unshift(Path.withoutDirectory(modulePath));\n\n\t\tSystem.runCommand(Path.directory(modulePath), \"node\", args);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/Orientation.hx",
    "content": "package lime.tools;\n\nenum Orientation\n{\n\tPORTRAIT;\n\tLANDSCAPE;\n\tALL;\n\tAUTO;\n}\n"
  },
  {
    "path": "src/lime/tools/Platform.hx",
    "content": "package lime.tools;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract Platform(String) from hxp.HostPlatform\n{\n\tvar AIR = \"air\";\n\tvar ANDROID = \"android\";\n\tvar BLACKBERRY = \"blackberry\";\n\tvar CONSOLE_PC = \"console-pc\";\n\tvar FIREFOX = \"firefox\";\n\tvar FLASH = \"flash\";\n\tvar HTML5 = \"html5\";\n\tvar IOS = \"ios\";\n\tvar LINUX = \"linux\";\n\tvar MAC = \"mac\";\n\tvar PS3 = \"ps3\";\n\tvar PS4 = \"ps4\";\n\tvar TIZEN = \"tizen\";\n\tvar VITA = \"vita\";\n\tvar WEB_ASSEMBLY = \"webassembly\";\n\tvar WINDOWS = \"windows\";\n\tvar WEBOS = \"webos\";\n\tvar WIIU = \"wiiu\";\n\tvar XBOX1 = \"xbox1\";\n\tvar EMSCRIPTEN = \"emscripten\";\n\tvar TVOS = \"tvos\";\n\tvar CUSTOM = null;\n\n\t@:op(A == B) @:commutative\n\tprivate inline function equalsHostPlatform(hostPlatform:hxp.HostPlatform):Bool\n\t{\n\t\treturn this == hostPlatform;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/PlatformTarget.hx",
    "content": "package lime.tools;\n\nimport haxe.rtti.Meta;\nimport hxp.*;\nimport lime.tools.AssetHelper;\nimport lime.tools.CommandHelper;\nimport sys.FileSystem;\nimport sys.io.File;\n\nclass PlatformTarget\n{\n\tpublic var additionalArguments:Array<String>;\n\tpublic var buildType:String;\n\tpublic var command:String;\n\tpublic var noOutput:Bool;\n\tpublic var project:HXProject;\n\tpublic var targetDirectory:String;\n\tpublic var targetFlags:Map<String, String>;\n\tpublic var traceEnabled = true;\n\n\tpublic function new(command:String = null, project:HXProject = null, targetFlags:Map<String, String> = null)\n\t{\n\t\tthis.command = command;\n\t\tthis.project = project;\n\t\tthis.targetFlags = targetFlags;\n\n\t\tbuildType = \"release\";\n\n\t\tif (project != null)\n\t\t{\n\t\t\tif (project.debug)\n\t\t\t{\n\t\t\t\tbuildType = \"debug\";\n\t\t\t}\n\t\t\telse if (project.targetFlags.exists(\"final\"))\n\t\t\t{\n\t\t\t\tbuildType = \"final\";\n\t\t\t}\n\t\t}\n\n\t\tfor (haxeflag in project.haxeflags)\n\t\t{\n\t\t\tif (haxeflag == \"--no-output\")\n\t\t\t{\n\t\t\t\tnoOutput = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function execute(additionalArguments:Array<String>):Void\n\t{\n\t\t// Log.info (\"\", Log.accentColor + \"Using target platform: \" + Std.string (project.target).toUpperCase () + Log.resetColor);\n\n\t\tthis.additionalArguments = additionalArguments;\n\t\tvar metaFields = Meta.getFields(Type.getClass(this));\n\n\t\t// known issue: this may not log in `-eval` mode on Linux\n\t\tinline function logCommand(command:String):Void\n\t\t{\n\t\t\tif (!Reflect.hasField(metaFields, command)\n\t\t\t\t|| !Reflect.hasField(Reflect.field(metaFields, command), \"ignore\"))\n\t\t\t{\n\t\t\t\tLog.info(\"\", \"\\n\" + Log.accentColor + \"Running command: \" + command.toUpperCase() + Log.resetColor);\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"watch\"))\n\t\t{\n\t\t\tLog.info(\"\", \"\\n\" + Log.accentColor + \"Running command: WATCH\" + Log.resetColor);\n\t\t\twatch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (command == \"display\")\n\t\t{\n\t\t\tdisplay();\n\t\t}\n\n\t\t// if (command == \"clean\" || project.targetFlags.exists (\"clean\")) {\n\t\tif (command == \"clean\"\n\t\t\t|| (project.targetFlags.exists(\"clean\") && (command == \"update\" || command == \"build\" || command == \"test\")))\n\t\t{\n\t\t\tlogCommand(\"CLEAN\");\n\t\t\tclean();\n\t\t}\n\n\t\tif (command == \"rebuild\" || project.targetFlags.exists(\"rebuild\"))\n\t\t{\n\t\t\tlogCommand(\"REBUILD\");\n\n\t\t\t// hack for now, need to move away from project.rebuild.path, probably\n\n\t\t\tif (project.targetFlags.exists(\"rebuild\"))\n\t\t\t{\n\t\t\t\tproject.config.set(\"project.rebuild.path\", null);\n\t\t\t}\n\n\t\t\trebuild();\n\t\t}\n\n\t\tif (command == \"update\" || command == \"build\" || command == \"test\")\n\t\t{\n\t\t\tlogCommand(\"update\");\n\n\t\t\t_touchedFiles = [];\n\t\t\tupdate();\n\n\t\t\tdeleteStaleFiles(_touchedFiles);\n\t\t\t_touchedFiles = null;\n\t\t}\n\n\t\tif (command == \"build\" || command == \"test\")\n\t\t{\n\t\t\tCommandHelper.executeCommands(project.preBuildCallbacks);\n\n\t\t\tlogCommand(\"build\");\n\t\t\tbuild();\n\n\t\t\tCommandHelper.executeCommands(project.postBuildCallbacks);\n\t\t}\n\n\t\tif (command == \"deploy\")\n\t\t{\n\t\t\tlogCommand(\"deploy\");\n\t\t\tdeploy();\n\t\t}\n\n\t\tif (command == \"install\" || command == \"run\" || command == \"test\")\n\t\t{\n\t\t\tlogCommand(\"install\");\n\t\t\tinstall();\n\t\t}\n\n\t\tif (command == \"run\" || command == \"rerun\" || command == \"test\")\n\t\t{\n\t\t\tlogCommand(\"run\");\n\t\t\trun();\n\t\t}\n\n\t\tif ((command == \"test\" || command == \"trace\" || command == \"run\" || command == \"rerun\")\n\t\t\t&& (traceEnabled || command == \"trace\"))\n\t\t{\n\t\t\tlogCommand(\"trace\");\n\t\t\tthis.trace();\n\t\t}\n\n\t\tif (command == \"uninstall\")\n\t\t{\n\t\t\tlogCommand(\"UNINSTALL\");\n\t\t\tuninstall();\n\t\t}\n\t}\n\n\t@ignore public function build():Void {}\n\n\t@ignore public function clean():Void {}\n\n\t@ignore public function deploy():Void {}\n\n\t@ignore public function display():Void {}\n\n\t@ignore public function install():Void {}\n\n\t@ignore public function rebuild():Void {}\n\n\t@ignore public function run():Void {}\n\n\t@ignore public function trace():Void {}\n\n\t@ignore public function uninstall():Void {}\n\n\t@ignore public function update():Void {}\n\n\t@ignore public function watch():Void {}\n\n\t// Functions to track and delete stale files\n\n\t/**\n\t\tFiles that were copied into the output directory due to something in\n\t\tproject.xml, but which might not be included next time.\n\n\t\t`PlatformTarget` will handle assets and templates, but subclasses are\n\t\tresponsible for adding any other files they copy (e.g., dependencies).\n\t**/\n\tprivate var _touchedFiles:Array<String> = null;\n\n\t/**\n\t\tCalls `System.copyIfNewer()` with the given arguments, then records the\n\t\tfile in `_touchedFiles`. See `_touchedFiles` for information about what\n\t\tneeds to be recorded.\n\t**/\n\tprivate function copyIfNewer(source:String, destination:String):Void\n\t{\n\t\tSystem.copyIfNewer(source, destination);\n\n\t\tif (_touchedFiles != null)\n\t\t{\n\t\t\t_touchedFiles.push(destination);\n\t\t}\n\t}\n\n\tprivate function deleteStaleFiles(touchedFiles:Array<String>):Void\n\t{\n\t\tif (project.defines.exists(\"lime-ignore-stale-files\")) return;\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\ttouchedFiles.push(targetDirectory + \"/bin/\" + asset.targetPath);\n\t\t}\n\n\t\tvar record:String = targetDirectory + \"/.files\";\n\t\tif (FileSystem.exists(record))\n\t\t{\n\t\t\tfor (oldFile in File.getContent(record).split(\"\\n\"))\n\t\t\t{\n\t\t\t\tif (oldFile.length > 0 && touchedFiles.indexOf(oldFile) < 0)\n\t\t\t\t{\n\t\t\t\t\tSystem.deleteFile(oldFile);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tFile.saveContent(record, touchedFiles.join(\"\\n\"));\n\t}\n\n\t/**\n\t\tCalls `System.recursiveCopy()` with the given arguments, then records\n\t\tthe files in `_touchedFiles`. See `_touchedFiles` for information about\n\t\twhat needs to be recorded.\n\t**/\n\tprivate function recursiveCopy(source:String, destination:String, context:Dynamic = null, process:Bool = true):Void\n\t{\n\t\tSystem.recursiveCopy(source, destination, context, process);\n\n\t\tif (_touchedFiles == null || !FileSystem.exists(source)) return;\n\n\t\tfunction recurse(source:String, destination:String):Void\n\t\t{\n\t\t\tfor (file in FileSystem.readDirectory(source))\n\t\t\t{\n\t\t\t\tif (file.charAt(0) == \".\") continue;\n\n\t\t\t\tif (FileSystem.isDirectory(source + \"/\" + file))\n\t\t\t\t{\n\t\t\t\t\trecurse(source + \"/\" + file, destination + \"/\" + file);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_touchedFiles.push(destination + \"/\" + file);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trecurse(source, destination);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/PlatformTargetMain.hx",
    "content": "package lime.tools;\n\nimport haxe.Unserializer;\nimport hxp.*;\nimport lime.tools.Architecture;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass PlatformTargetMain\n{\n\tprivate static var additionalArguments = new Array<String>();\n\tprivate static var targetFlags = new Map<String, String>();\n\tprivate static var traceEnabled:Bool = true;\n\n\tpublic static function main()\n\t{\n\t\tvar arguments = Sys.args();\n\t\tvar runFromHaxelib = false;\n\n\t\tif (arguments.length > 0)\n\t\t{\n\t\t\t// When the command-line tools are called from haxelib,\n\t\t\t// the last argument is the project directory and the\n\t\t\t// path to Lime is the current working directory\n\n\t\t\tvar lastArgument = \"\";\n\n\t\t\tfor (i in 0...arguments.length)\n\t\t\t{\n\t\t\t\tlastArgument = arguments.pop();\n\t\t\t\tif (lastArgument.length > 0) break;\n\t\t\t}\n\n\t\t\tlastArgument = new Path(lastArgument).toString();\n\n\t\t\tif (((StringTools.endsWith(lastArgument, \"/\") && lastArgument != \"/\") || StringTools.endsWith(lastArgument, \"\\\\\"))\n\t\t\t\t&& !StringTools.endsWith(lastArgument, \":\\\\\"))\n\t\t\t{\n\t\t\t\tlastArgument = lastArgument.substr(0, lastArgument.length - 1);\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(lastArgument) && FileSystem.isDirectory(lastArgument))\n\t\t\t{\n\t\t\t\tSys.setCwd(lastArgument);\n\t\t\t\trunFromHaxelib = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\targuments.push(lastArgument);\n\t\t\t}\n\t\t}\n\n\t\tif (!runFromHaxelib)\n\t\t{\n\t\t\tif (FileSystem.exists(\"tools.n\"))\n\t\t\t{\n\t\t\t\tHaxelib.setOverridePath(new Haxelib(\"lime\"), Path.combine(Sys.getCwd(), \"../\"));\n\t\t\t}\n\t\t\telse if (FileSystem.exists(\"run.n\"))\n\t\t\t{\n\t\t\t\tHaxelib.setOverridePath(new Haxelib(\"lime\"), Sys.getCwd());\n\t\t\t}\n\t\t}\n\n\t\tvar additionalArguments:Array<String> = [];\n\t\tvar catchArguments = false;\n\t\tvar className = \"\";\n\t\tvar command = \"\";\n\t\tvar words:Array<String> = [];\n\n\t\tfor (argument in arguments)\n\t\t{\n\t\t\tvar equals = argument.indexOf(\"=\");\n\n\t\t\tif (catchArguments)\n\t\t\t{\n\t\t\t\tadditionalArguments.push(argument);\n\t\t\t}\n\t\t\telse if (argument == \"-v\" || argument == \"-verbose\")\n\t\t\t{\n\t\t\t\tLog.verbose = true;\n\t\t\t}\n\t\t\telse if (argument == \"-args\")\n\t\t\t{\n\t\t\t\tcatchArguments = true;\n\t\t\t}\n\t\t\telse if (argument == \"-notrace\")\n\t\t\t{\n\t\t\t\ttraceEnabled = false;\n\t\t\t}\n\t\t\telse if (argument == \"-debug\")\n\t\t\t{\n\t\t\t\t// debug = true;\n\t\t\t}\n\t\t\telse if (argument == \"-nocolor\")\n\t\t\t{\n\t\t\t\tLog.enableColor = false;\n\t\t\t}\n\t\t\telse if (className.length == 0)\n\t\t\t{\n\t\t\t\tclassName = argument;\n\t\t\t}\n\t\t\telse if (command.length == 0)\n\t\t\t{\n\t\t\t\tcommand = argument;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twords.push(argument);\n\t\t\t}\n\t\t}\n\n\t\tif (words.length > 0)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar classRef = Type.resolveClass(className);\n\t\t\t\tif (classRef == null) throw \"Cannot find class name \\\"\" + className + \"\\\"\";\n\n\t\t\t\tvar inputPath = words[0];\n\t\t\t\tvar projectData = File.getContent(inputPath);\n\n\t\t\t\tvar unserializer = new Unserializer(projectData);\n\t\t\t\tunserializer.setResolver(cast {resolveEnum: Type.resolveEnum, resolveClass: resolveClass});\n\t\t\t\tvar project:HXProject = unserializer.unserialize();\n\n\t\t\t\tvar platform = Type.createInstance(classRef, [command, project, project.targetFlags]);\n\t\t\t\tplatform.traceEnabled = traceEnabled;\n\t\t\t\tplatform.execute(additionalArguments);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tLog.error(e);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function resolveClass(name:String):Class<Dynamic>\n\t{\n\t\tvar result = Type.resolveClass(name);\n\n\t\tif (result == null)\n\t\t{\n\t\t\tresult = HXProject;\n\t\t}\n\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/PlatformType.hx",
    "content": "package lime.tools;\n\nenum PlatformType\n{\n\tDESKTOP;\n\tMOBILE;\n\tWEB;\n\tCONSOLE;\n}\n"
  },
  {
    "path": "src/lime/tools/ProjectHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport sys.io.File;\nimport sys.FileSystem;\n#if neko\nimport neko.Lib;\n#elseif cpp\nimport cpp.Lib;\n#end\n\nclass ProjectHelper\n{\n\t// private static var doubleVarMatch = new EReg (\"\\\\$\\\\${(.*?)}\", \"\");\n\tprivate static var varMatch = new EReg(\"{{(.*?)}}\", \"\");\n\n\tpublic static function copyLibrary(project:HXProject, ndll:NDLL, directoryName:String, namePrefix:String, nameSuffix:String, targetDirectory:String,\n\t\t\tallowDebug:Bool = false, targetSuffix:String = null)\n\t{\n\t\tvar path = NDLL.getLibraryPath(ndll, directoryName, namePrefix, nameSuffix, allowDebug);\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\tvar targetPath = Path.combine(targetDirectory, namePrefix + ndll.name);\n\n\t\t\tif (targetSuffix != null)\n\t\t\t{\n\t\t\t\ttargetPath += targetSuffix;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttargetPath += nameSuffix;\n\t\t\t}\n\n\t\t\tif (project.config.getBool(\"tools.copy-ndlls\"))\n\t\t\t{\n\t\t\t\tLog.info(\"\", \" - \\x1b[1mCopying library file:\\x1b[0m \" + path + \" \\x1b[3;37m->\\x1b[0m \" + targetPath);\n\n\t\t\t\tSystem.mkdir(targetDirectory);\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tFile.copy(path, targetPath);\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"Cannot copy to \\\"\" + targetPath + \"\\\", is the file in use?\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.info(\"\", \" - \\x1b[1mSkipping library file:\\x1b[0m \" + path + \" \\x1b[3;37m->\\x1b[0m \" + targetPath);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.error(\"Source path \\\"\" + path + \"\\\" does not exist\");\n\t\t}\n\t}\n\n\tpublic static function getCurrentCommand():String\n\t{\n\t\tvar args = Sys.args();\n\t\targs.remove(\"-watch\");\n\n\t\tif (Haxelib.pathOverrides.exists(\"lime-tools\"))\n\t\t{\n\t\t\tvar tools = Haxelib.pathOverrides.get(\"lime-tools\");\n\n\t\t\treturn \"neko \" + tools + \"/tools.n \" + args.join(\" \");\n\t\t}\n\t\telse\n\t\t{\n\t\t\targs.pop();\n\n\t\t\treturn \"lime \" + args.join(\" \");\n\t\t}\n\t}\n\n\tpublic static function recursiveSmartCopyTemplate(project:HXProject, source:String, destination:String, context:Dynamic = null, process:Bool = true,\n\t\t\twarnIfNotFound:Bool = true)\n\t{\n\t\tvar destinations:Array<String> = [];\n\t\tvar paths = System.findTemplateRecursive(project.templatePaths, source, warnIfNotFound, destinations);\n\n\t\tif (paths != null)\n\t\t{\n\t\t\tSystem.mkdir(destination);\n\t\t\tvar itemDestination:String;\n\n\t\t\tfor (i in 0...paths.length)\n\t\t\t{\n\t\t\t\titemDestination = Path.combine(destination, ProjectHelper.substitutePath(project, destinations[i]));\n\t\t\t\tSystem.copyFile(paths[i], itemDestination, context, process);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function replaceVariable(project:HXProject, string:String):String\n\t{\n\t\tif (string.substr(0, 8) == \"haxelib:\")\n\t\t{\n\t\t\tvar path = Haxelib.getPath(new Haxelib(string.substr(8)), true);\n\t\t\treturn Path.standardize(path);\n\t\t}\n\t\telse if (project.defines.exists(string))\n\t\t{\n\t\t\treturn project.defines.get(string);\n\t\t}\n\t\telse if (project.environment != null && project.environment.exists(string))\n\t\t{\n\t\t\treturn project.environment.get(string);\n\t\t}\n\t\t// TODO: Should we start phasing this out?\n\t\telse if (string == \"projectDirectory\")\n\t\t{\n\t\t\tLog.info(\"\", \"Consider using ${project.workingDirectory} instead of ${projectDirectory}.\");\n\t\t\treturn project.workingDirectory;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar substring = StringTools.replace(string, \" \", \"\");\n\t\t\tvar index:Int;\n\t\t\tvar value:String;\n\n\t\t\tif (substring.indexOf(\"==\") > -1)\n\t\t\t{\n\t\t\t\tindex = substring.indexOf(\"==\");\n\t\t\t\tvalue = ProjectHelper.replaceVariable(project, substring.substr(0, index));\n\n\t\t\t\treturn Std.string(value == substring.substr(index + 2));\n\t\t\t}\n\t\t\telse if (substring.indexOf(\"!=\") > -1)\n\t\t\t{\n\t\t\t\tindex = substring.indexOf(\"!=\");\n\t\t\t\tvalue = ProjectHelper.replaceVariable(project, substring.substr(0, index));\n\n\t\t\t\treturn Std.string(value != substring.substr(index + 2));\n\t\t\t}\n\t\t\telse if (substring.indexOf(\"<=\") > -1)\n\t\t\t{\n\t\t\t\tindex = substring.indexOf(\"<=\");\n\t\t\t\tvalue = ProjectHelper.replaceVariable(project, substring.substr(0, index));\n\n\t\t\t\treturn Std.string(value <= substring.substr(index + 2));\n\t\t\t}\n\t\t\telse if (substring.indexOf(\"<\") > -1)\n\t\t\t{\n\t\t\t\tindex = substring.indexOf(\"<\");\n\t\t\t\tvalue = ProjectHelper.replaceVariable(project, substring.substr(0, index));\n\n\t\t\t\treturn Std.string(value < substring.substr(index + 1));\n\t\t\t}\n\t\t\telse if (substring.indexOf(\">=\") > -1)\n\t\t\t{\n\t\t\t\tindex = substring.indexOf(\">=\");\n\t\t\t\tvalue = ProjectHelper.replaceVariable(project, substring.substr(0, index));\n\n\t\t\t\treturn Std.string(value >= substring.substr(index + 2));\n\t\t\t}\n\t\t\telse if (substring.indexOf(\">\") > -1)\n\t\t\t{\n\t\t\t\tindex = substring.indexOf(\">\");\n\t\t\t\tvalue = ProjectHelper.replaceVariable(project, substring.substr(0, index));\n\n\t\t\t\treturn Std.string(value > substring.substr(index + 1));\n\t\t\t}\n\t\t\telse if (substring.indexOf(\".\") > -1)\n\t\t\t{\n\t\t\t\tvar fields = substring.split(\".\");\n\t\t\t\tif (fields[0] == \"project\") fields.shift();\n\n\t\t\t\tvar object:Dynamic = project;\n\t\t\t\twhile (object != null && fields.length > 0)\n\t\t\t\t{\n\t\t\t\t\tobject = Reflect.getProperty(object, fields.shift());\n\t\t\t\t}\n\n\t\t\t\tif (object != null && object != project)\n\t\t\t\t{\n\t\t\t\t\treturn Std.string(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn string;\n\t}\n\n\tpublic static function substitutePath(project:HXProject, path:String):String\n\t{\n\t\tvar newString = path;\n\n\t\t// while (doubleVarMatch.match (newString)) {\n\n\t\t// \tnewString = doubleVarMatch.matchedLeft () + \"${\" + ProjectHelper.replaceVariable (this, doubleVarMatch.matched (1)) + \"}\" + doubleVarMatch.matchedRight ();\n\n\t\t// }\n\n\t\twhile (varMatch.match(newString))\n\t\t{\n\t\t\tnewString = varMatch.matchedLeft() + ProjectHelper.replaceVariable(project, varMatch.matched(1)) + varMatch.matchedRight();\n\t\t}\n\n\t\treturn newString;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/ProjectXMLParser.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.CommandHelper;\nimport lime.tools.ModuleHelper;\nimport lime.tools.Asset;\nimport lime.tools.AssetType;\nimport lime.tools.Dependency;\nimport lime.tools.HXProject;\n#if lime\nimport lime.utils.AssetManifest;\n#end\nimport sys.io.File;\nimport sys.FileSystem;\n#if (haxe_ver >= 4)\nimport haxe.xml.Access;\n#else\nimport haxe.xml.Fast as Access;\n#end\n\nclass ProjectXMLParser extends HXProject\n{\n\tpublic var includePaths:Array<String>;\n\n\tprivate static var doubleVarMatch = new EReg(\"\\\\$\\\\${(.*?)}\", \"\");\n\tprivate static var varMatch = new EReg(\"\\\\${(.*?)}\", \"\");\n\n\tpublic function new(path:String = \"\", defines:Map<String, Dynamic> = null, includePaths:Array<String> = null, useExtensionPath:Bool = false)\n\t{\n\t\tsuper(defines);\n\n\t\tif (includePaths != null)\n\t\t{\n\t\t\tthis.includePaths = includePaths;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.includePaths = new Array<String>();\n\t\t}\n\n\t\tif (path != \"\")\n\t\t{\n\t\t\tprocess(path, useExtensionPath);\n\t\t}\n\t}\n\n\tprivate function isValidElement(element:Access, section:String):Bool\n\t{\n\t\tif (element.x.get(\"if\") != null)\n\t\t{\n\t\t\tvar value = element.x.get(\"if\");\n\t\t\tvar optionalDefines = value.split(\"||\");\n\t\t\tvar matchOptional = false;\n\n\t\t\tfor (optional in optionalDefines)\n\t\t\t{\n\t\t\t\toptional = substitute(optional);\n\t\t\t\tvar requiredDefines = optional.split(\" \");\n\t\t\t\tvar matchRequired = true;\n\n\t\t\t\tfor (required in requiredDefines)\n\t\t\t\t{\n\t\t\t\t\trequired = substitute(required);\n\t\t\t\t\tvar check = StringTools.trim(required);\n\n\t\t\t\t\tif (check == \"false\")\n\t\t\t\t\t{\n\t\t\t\t\t\tmatchRequired = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (check != \"\"\n\t\t\t\t\t\t&& check != \"true\"\n\t\t\t\t\t\t&& !defines.exists(check)\n\t\t\t\t\t\t&& (environment == null || !environment.exists(check))\n\t\t\t\t\t\t&& check != command)\n\t\t\t\t\t{\n\t\t\t\t\t\tmatchRequired = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (matchRequired)\n\t\t\t\t{\n\t\t\t\t\tmatchOptional = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (optionalDefines.length > 0 && !matchOptional)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (element.has.unless)\n\t\t{\n\t\t\tvar value = substitute(element.att.unless);\n\t\t\tvar optionalDefines = value.split(\"||\");\n\t\t\tvar matchOptional = false;\n\n\t\t\tfor (optional in optionalDefines)\n\t\t\t{\n\t\t\t\toptional = substitute(optional);\n\t\t\t\tvar requiredDefines = optional.split(\" \");\n\t\t\t\tvar matchRequired = true;\n\n\t\t\t\tfor (required in requiredDefines)\n\t\t\t\t{\n\t\t\t\t\trequired = substitute(required);\n\t\t\t\t\tvar check = StringTools.trim(required);\n\n\t\t\t\t\tif (check == \"false\")\n\t\t\t\t\t{\n\t\t\t\t\t\tmatchRequired = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (check != \"\"\n\t\t\t\t\t\t&& check != \"true\"\n\t\t\t\t\t\t&& !defines.exists(check)\n\t\t\t\t\t\t&& (environment == null || !environment.exists(check))\n\t\t\t\t\t\t&& check != command)\n\t\t\t\t\t{\n\t\t\t\t\t\tmatchRequired = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (matchRequired)\n\t\t\t\t{\n\t\t\t\t\tmatchOptional = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (optionalDefines.length > 0 && matchOptional)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (section != \"\")\n\t\t{\n\t\t\tif (element.name != \"section\")\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!element.has.id)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (substitute(element.att.id) != section)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function findIncludeFile(base:String):String\n\t{\n\t\tif (base == \"\")\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (base.substr(0, 1) != \"/\" && base.substr(0, 1) != \"\\\\\" && base.substr(1, 1) != \":\" && base.substr(0, 1) != \".\" && !FileSystem.exists(base))\n\t\t{\n\t\t\tfor (path in includePaths)\n\t\t\t{\n\t\t\t\tvar includePath = path + \"/\" + base;\n\n\t\t\t\tif (FileSystem.exists(includePath))\n\t\t\t\t{\n\t\t\t\t\tif (FileSystem.exists(includePath + \"/include.lime\"))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn includePath + \"/include.lime\";\n\t\t\t\t\t}\n\t\t\t\t\telse if (FileSystem.exists(includePath + \"/include.nmml\"))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn includePath + \"/include.nmml\";\n\t\t\t\t\t}\n\t\t\t\t\telse if (FileSystem.exists(includePath + \"/include.xml\"))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn includePath + \"/include.xml\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn includePath;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (base.substr(-1, 1) == \"/\")\n\t\t\t{\n\t\t\t\tbase = base.substr(0, base.length - 1);\n\t\t\t}\n\t\t\telse if (base.substr(-1, 1) == \"\\\\\")\n\t\t\t{\n\t\t\t\tbase = base.substring(0, base.length - 1);\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(base))\n\t\t\t{\n\t\t\t\tif (FileSystem.exists(base + \"/include.lime\"))\n\t\t\t\t{\n\t\t\t\t\treturn base + \"/include.lime\";\n\t\t\t\t}\n\t\t\t\telse if (FileSystem.exists(base + \"/include.nmml\"))\n\t\t\t\t{\n\t\t\t\t\treturn base + \"/include.nmml\";\n\t\t\t\t}\n\t\t\t\telse if (FileSystem.exists(base + \"/include.xml\"))\n\t\t\t\t{\n\t\t\t\t\treturn base + \"/include.xml\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn base;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\tprivate function formatAttributeName(name:String):String\n\t{\n\t\tvar segments = name.toLowerCase().split(\"-\");\n\n\t\tfor (i in 1...segments.length)\n\t\t{\n\t\t\tsegments[i] = segments[i].substr(0, 1).toUpperCase() + segments[i].substr(1);\n\t\t}\n\n\t\treturn segments.join(\"\");\n\t}\n\n\tpublic static function fromFile(path:String, defines:Map<String, Dynamic> = null, includePaths:Array<String> = null,\n\t\t\tuseExtensionPath:Bool = false):ProjectXMLParser\n\t{\n\t\tif (path == null) return null;\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\treturn new ProjectXMLParser(path, defines, includePaths, useExtensionPath);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate function parseAppElement(element:Access, extensionPath:String):Void\n\t{\n\t\tfor (attribute in element.x.attributes())\n\t\t{\n\t\t\tswitch (attribute)\n\t\t\t{\n\t\t\t\tcase \"path\":\n\t\t\t\t\tapp.path = Path.combine(extensionPath, substitute(element.att.path));\n\n\t\t\t\tcase \"min-swf-version\":\n\t\t\t\t\tvar version = Std.parseFloat(substitute(element.att.resolve(\"min-swf-version\")));\n\n\t\t\t\t\tif (version > app.swfVersion)\n\t\t\t\t\t{\n\t\t\t\t\t\tapp.swfVersion = version;\n\t\t\t\t\t}\n\n\t\t\t\tcase \"swf-version\":\n\t\t\t\t\tapp.swfVersion = Std.parseFloat(substitute(element.att.resolve(\"swf-version\")));\n\n\t\t\t\tcase \"preloader\":\n\t\t\t\t\tapp.preloader = substitute(element.att.preloader);\n\n\t\t\t\tdefault:\n\t\t\t\t\t// if we are happy with this spec, we can tighten up this parsing a bit, later\n\n\t\t\t\t\tvar name = formatAttributeName(attribute);\n\t\t\t\t\tvar value = substitute(element.att.resolve(attribute));\n\n\t\t\t\t\tif (attribute == \"package\")\n\t\t\t\t\t{\n\t\t\t\t\t\tname = \"packageName\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Reflect.hasField(ApplicationData.expectedFields, name))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(app, name, value);\n\t\t\t\t\t}\n\t\t\t\t\telse if (Reflect.hasField(MetaData.expectedFields, name))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(meta, name, value);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseAssetsElement(element:Access, basePath:String = \"\", isTemplate:Bool = false):Void\n\t{\n\t\tvar path = \"\";\n\t\tvar embed:Null<Bool> = null;\n\t\tvar library:String = null;\n\t\tvar targetPath = \"\";\n\t\tvar glyphs:String = null;\n\t\tvar type:AssetType = null;\n\n\t\tif (element.has.path)\n\t\t{\n\t\t\tpath = Path.combine(basePath, substitute(element.att.path));\n\t\t}\n\n\t\tif (element.has.embed)\n\t\t{\n\t\t\tembed = parseBool(element.att.embed);\n\t\t}\n\n\t\tif (element.has.rename)\n\t\t{\n\t\t\ttargetPath = substitute(element.att.rename);\n\t\t}\n\t\telse if (element.has.path)\n\t\t{\n\t\t\ttargetPath = substitute(element.att.path);\n\t\t}\n\n\t\tif (element.has.library)\n\t\t{\n\t\t\tlibrary = substitute(element.att.library);\n\t\t}\n\n\t\tif (element.has.glyphs)\n\t\t{\n\t\t\tglyphs = substitute(element.att.glyphs);\n\t\t}\n\n\t\tif (isTemplate)\n\t\t{\n\t\t\ttype = AssetType.TEMPLATE;\n\t\t}\n\t\telse if (element.has.type)\n\t\t{\n\t\t\tvar typeName = substitute(element.att.type);\n\n\t\t\tif (Reflect.hasField(AssetType, typeName.toUpperCase()))\n\t\t\t{\n\t\t\t\ttype = Reflect.field(AssetType, typeName.toUpperCase());\n\t\t\t}\n\t\t\telse if (typeName == \"bytes\")\n\t\t\t{\n\t\t\t\ttype = AssetType.BINARY;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.warn(\"Ignoring unknown asset type \\\"\" + typeName + \"\\\"\");\n\t\t\t}\n\t\t}\n\n\t\tif (path == \"\" && (element.has.include || element.has.exclude || type != null))\n\t\t{\n\t\t\tLog.error(\"In order to use 'include' or 'exclude' on <asset /> nodes, you must specify also specify a 'path' attribute\");\n\t\t\treturn;\n\t\t}\n\t\telse if (!element.elements.hasNext())\n\t\t{\n\t\t\t// Empty element\n\n\t\t\tif (path == \"\")\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!FileSystem.exists(path))\n\t\t\t{\n\t\t\t\tLog.error(\"Could not find asset path \\\"\" + path + \"\\\"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!FileSystem.isDirectory(path))\n\t\t\t{\n\t\t\t\tvar asset = new Asset(path, targetPath, type, embed);\n\t\t\t\tasset.library = library;\n\n\t\t\t\tif (element.has.id)\n\t\t\t\t{\n\t\t\t\t\tasset.id = substitute(element.att.id);\n\t\t\t\t}\n\n\t\t\t\tif (glyphs != null)\n\t\t\t\t{\n\t\t\t\t\tasset.glyphs = glyphs;\n\t\t\t\t}\n\n\t\t\t\tassets.push(asset);\n\t\t\t}\n\t\t\telse if (Path.extension(path) == \"bundle\")\n\t\t\t{\n\t\t\t\tparseAssetsElementLibrary(path, targetPath, \"*\", \"\", type, embed, library, glyphs, true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar exclude = \".*|cvs|thumbs.db|desktop.ini|*.fla|*.hash\";\n\t\t\t\tvar include = \"\";\n\n\t\t\t\tif (element.has.exclude)\n\t\t\t\t{\n\t\t\t\t\texclude += \"|\" + substitute(element.att.exclude);\n\t\t\t\t}\n\n\t\t\t\tif (element.has.include)\n\t\t\t\t{\n\t\t\t\t\tinclude = substitute(element.att.include);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// if (type == null) {\n\n\t\t\t\t\tinclude = \"*\";\n\n\t\t\t\t\t/*} else {\n\n\t\t\t\t\t\tswitch (type) {\n\n\t\t\t\t\t\t\tcase IMAGE:\n\n\t\t\t\t\t\t\t\tinclude = \"*.jpg|*.jpeg|*.png|*.gif\";\n\n\t\t\t\t\t\t\tcase SOUND:\n\n\t\t\t\t\t\t\t\tinclude = \"*.wav|*.ogg\";\n\n\t\t\t\t\t\t\tcase MUSIC:\n\n\t\t\t\t\t\t\t\tinclude = \"*.mp2|*.mp3|*.ogg\";\n\n\t\t\t\t\t\t\tcase FONT:\n\n\t\t\t\t\t\t\t\tinclude = \"*.otf|*.ttf\";\n\n\t\t\t\t\t\t\tcase TEMPLATE:\n\n\t\t\t\t\t\t\t\tinclude = \"*\";\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tinclude = \"*\";\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}*/\n\t\t\t\t}\n\n\t\t\t\tparseAssetsElementDirectory(path, targetPath, include, exclude, type, embed, library, glyphs, true);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (path != \"\")\n\t\t\t{\n\t\t\t\tpath += \"/\";\n\t\t\t}\n\n\t\t\tif (targetPath != \"\")\n\t\t\t{\n\t\t\t\ttargetPath += \"/\";\n\t\t\t}\n\n\t\t\tfor (childElement in element.elements)\n\t\t\t{\n\t\t\t\tvar isValid = isValidElement(childElement, \"\");\n\n\t\t\t\tif (isValid)\n\t\t\t\t{\n\t\t\t\t\tvar childPath = substitute(childElement.has.name ? childElement.att.name : childElement.att.path);\n\t\t\t\t\tvar childTargetPath = childPath;\n\t\t\t\t\tvar childEmbed:Null<Bool> = embed;\n\t\t\t\t\tvar childLibrary = library;\n\t\t\t\t\tvar childType = type;\n\t\t\t\t\tvar childGlyphs = glyphs;\n\n\t\t\t\t\tif (childElement.has.rename)\n\t\t\t\t\t{\n\t\t\t\t\t\tchildTargetPath = substitute(childElement.att.rename);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (childElement.has.embed)\n\t\t\t\t\t{\n\t\t\t\t\t\tchildEmbed = parseBool(childElement.att.embed);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (childElement.has.library)\n\t\t\t\t\t{\n\t\t\t\t\t\tchildLibrary = substitute(childElement.att.library);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (childElement.has.glyphs)\n\t\t\t\t\t{\n\t\t\t\t\t\tchildGlyphs = substitute(childElement.att.glyphs);\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (childElement.name)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"image\", \"sound\", \"music\", \"font\", \"template\":\n\t\t\t\t\t\t\tchildType = Reflect.field(AssetType, childElement.name.toUpperCase());\n\n\t\t\t\t\t\tcase \"library\", \"manifest\":\n\t\t\t\t\t\t\tchildType = AssetType.MANIFEST;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif (childElement.has.type)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tchildType = Reflect.field(AssetType, substitute(childElement.att.type).toUpperCase());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar asset = new Asset(path + childPath, targetPath + childTargetPath, childType, childEmbed);\n\t\t\t\t\tasset.library = childLibrary;\n\n\t\t\t\t\tif (childElement.has.id)\n\t\t\t\t\t{\n\t\t\t\t\t\tasset.id = substitute(childElement.att.id);\n\t\t\t\t\t}\n\t\t\t\t\telse if (childElement.has.name)\n\t\t\t\t\t{\n\t\t\t\t\t\tasset.id = substitute(childElement.att.name);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (childGlyphs != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tasset.glyphs = childGlyphs;\n\t\t\t\t\t}\n\n\t\t\t\t\tassets.push(asset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseAssetsElementDirectory(path:String, targetPath:String, include:String, exclude:String, type:AssetType, embed:Null<Bool>,\n\t\t\tlibrary:String, glyphs:String, recursive:Bool):Void\n\t{\n\t\tvar files = FileSystem.readDirectory(path);\n\n\t\tif (targetPath != \"\")\n\t\t{\n\t\t\ttargetPath += \"/\";\n\t\t}\n\n\t\tfor (file in files)\n\t\t{\n\t\t\tif (FileSystem.exists(path + \"/\" + file) && FileSystem.isDirectory(path + \"/\" + file))\n\t\t\t{\n\t\t\t\tif (Path.extension(file) == \"bundle\")\n\t\t\t\t{\n\t\t\t\t\tparseAssetsElementLibrary(path + \"/\" + file, targetPath + file, include, exclude, type, embed, library, glyphs, true);\n\t\t\t\t}\n\t\t\t\telse if (recursive)\n\t\t\t\t{\n\t\t\t\t\tif (filter(file, [\"*\"], exclude.split(\"|\")))\n\t\t\t\t\t{\n\t\t\t\t\t\tparseAssetsElementDirectory(path + \"/\" + file, targetPath + file, include, exclude, type, embed, library, glyphs, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (filter(file, include.split(\"|\"), exclude.split(\"|\")))\n\t\t\t\t{\n\t\t\t\t\tvar asset = new Asset(path + \"/\" + file, targetPath + file, type, embed);\n\t\t\t\t\tasset.library = library;\n\n\t\t\t\t\tif (glyphs != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tasset.glyphs = glyphs;\n\t\t\t\t\t}\n\n\t\t\t\t\tassets.push(asset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseAssetsElementLibrary(path:String, targetPath:String, include:String, exclude:String, type:AssetType, embed:Null<Bool>,\n\t\t\tlibrary:String, glyphs:String, recursive:Bool):Void\n\t{\n\t\tvar includePath = findIncludeFile(path);\n\n\t\tif (includePath != null && includePath != \"\" && FileSystem.exists(includePath) && !FileSystem.isDirectory(includePath))\n\t\t{\n\t\t\tvar includeProject = new ProjectXMLParser(includePath, defines);\n\t\t\tmerge(includeProject);\n\t\t}\n\n\t\tvar processedLibrary = false;\n\t\tvar jsonPath = Path.combine(path, \"library.json\");\n\n\t\tif (FileSystem.exists(jsonPath))\n\t\t{\n\t\t\t#if lime\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar manifest = AssetManifest.fromFile(jsonPath);\n\n\t\t\t\tif (manifest != null)\n\t\t\t\t{\n\t\t\t\t\tlibrary = targetPath;\n\n\t\t\t\t\tvar asset = new Asset(jsonPath, Path.combine(targetPath, \"library.json\"), AssetType.MANIFEST);\n\t\t\t\t\tasset.id = \"libraries/\" + library + \".json\";\n\t\t\t\t\tasset.library = library;\n\t\t\t\t\tasset.data = manifest.serialize();\n\t\t\t\t\tasset.embed = embed;\n\t\t\t\t\tassets.push(asset);\n\n\t\t\t\t\tfor (manifestAsset in manifest.assets)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Reflect.hasField(manifestAsset, \"path\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar asset = new Asset(Path.combine(path, manifestAsset.path), Path.combine(targetPath, manifestAsset.path), type, embed);\n\t\t\t\t\t\t\tasset.id = manifestAsset.id;\n\t\t\t\t\t\t\tasset.library = library;\n\t\t\t\t\t\t\tasset.embed = embed;\n\t\t\t\t\t\t\tassets.push(asset);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tprocessedLibrary = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t\t#end\n\t\t}\n\n\t\tif (!processedLibrary)\n\t\t{\n\t\t\tparseAssetsElementDirectory(path, targetPath, include, exclude, type, embed, library, glyphs, true);\n\t\t}\n\t}\n\n\tprivate function parseBool(attribute:String):Bool\n\t{\n\t\treturn substitute(attribute) == \"true\";\n\t}\n\n\tprivate function parseCommandElement(element:Access, commandList:Array<CLICommand>):Void\n\t{\n\t\tvar command:CLICommand = null;\n\n\t\tif (element.has.haxe)\n\t\t{\n\t\t\tcommand = CommandHelper.interpretHaxe(substitute(element.att.haxe));\n\t\t}\n\n\t\tif (element.has.open)\n\t\t{\n\t\t\tcommand = CommandHelper.openFile(substitute(element.att.open));\n\t\t}\n\n\t\tif (element.has.command)\n\t\t{\n\t\t\tcommand = CommandHelper.fromSingleString(substitute(element.att.command));\n\t\t}\n\n\t\tif (element.has.cmd)\n\t\t{\n\t\t\tcommand = CommandHelper.fromSingleString(substitute(element.att.cmd));\n\t\t}\n\n\t\tif (command != null)\n\t\t{\n\t\t\tfor (arg in element.elements)\n\t\t\t{\n\t\t\t\tif (arg.name == \"arg\")\n\t\t\t\t{\n\t\t\t\t\tcommand.args.push(arg.innerData);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcommandList.push(command);\n\t\t}\n\t}\n\n\tprivate function parseMetaElement(element:Access):Void\n\t{\n\t\tfor (attribute in element.x.attributes())\n\t\t{\n\t\t\tswitch (attribute)\n\t\t\t{\n\t\t\t\tcase \"title\", \"description\", \"package\", \"version\", \"company\", \"company-id\", \"build-number\", \"company-url\", \"copyright-years\":\n\t\t\t\t\tvar value = substitute(element.att.resolve(attribute));\n\n\t\t\t\t\tdefines.set(\"APP_\" + StringTools.replace(attribute, \"-\", \"_\").toUpperCase(), value);\n\n\t\t\t\t\tvar name = formatAttributeName(attribute);\n\n\t\t\t\t\tif (attribute == \"package\")\n\t\t\t\t\t{\n\t\t\t\t\t\tname = \"packageName\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Reflect.hasField(MetaData.expectedFields, name))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(meta, name, value);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseModuleElement(element:Access, basePath:String = \"\", moduleData:ModuleData = null):Void\n\t{\n\t\tvar topLevel = (moduleData == null);\n\n\t\tvar exclude = \"\";\n\t\tvar include = \"*\";\n\n\t\tif (element.has.include)\n\t\t{\n\t\t\tinclude = substitute(element.att.include);\n\t\t}\n\n\t\tif (element.has.exclude)\n\t\t{\n\t\t\texclude = substitute(element.att.exclude);\n\t\t}\n\n\t\tif (moduleData == null)\n\t\t{\n\t\t\tvar name = substitute(element.att.name);\n\n\t\t\tif (modules.exists(name))\n\t\t\t{\n\t\t\t\tmoduleData = modules.get(name);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmoduleData = new ModuleData(name);\n\t\t\t\tmodules.set(name, moduleData);\n\t\t\t}\n\t\t}\n\n\t\tswitch (element.name)\n\t\t{\n\t\t\tcase \"module\" | \"source\":\n\t\t\t\tvar sourceAttribute = (element.name == \"module\" ? \"source\" : \"path\");\n\n\t\t\t\tif (element.has.resolve(sourceAttribute))\n\t\t\t\t{\n\t\t\t\t\tvar source = Path.combine(basePath, substitute(element.att.resolve(sourceAttribute)));\n\t\t\t\t\tvar packageName = \"\";\n\n\t\t\t\t\tif (element.has.resolve(\"package\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tpackageName = element.att.resolve(\"package\");\n\t\t\t\t\t}\n\n\t\t\t\t\tModuleHelper.addModuleSource(source, moduleData, include.split(\"|\"), exclude.split(\"|\"), packageName);\n\t\t\t\t}\n\n\t\t\tcase \"class\":\n\t\t\t\tif (element.has.remove)\n\t\t\t\t{\n\t\t\t\t\tmoduleData.classNames.remove(substitute(element.att.remove));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmoduleData.classNames.push(substitute(element.att.name));\n\t\t\t\t}\n\n\t\t\tcase \"haxedef\":\n\t\t\t\tvar value = substitute(element.att.name);\n\n\t\t\t\tif (element.has.value)\n\t\t\t\t{\n\t\t\t\t\tvalue += \"=\" + substitute(element.att.value);\n\t\t\t\t}\n\n\t\t\t\tmoduleData.haxeflags.push(\"-D \" + value);\n\n\t\t\tcase \"haxeflag\":\n\t\t\t\tvar flag = substitute(element.att.name);\n\n\t\t\t\tif (element.has.value)\n\t\t\t\t{\n\t\t\t\t\tflag += \" \" + substitute(element.att.value);\n\t\t\t\t}\n\n\t\t\t\tmoduleData.haxeflags.push(substitute(flag));\n\n\t\t\tcase \"include\":\n\t\t\t\tmoduleData.includeTypes.push(substitute(element.att.type));\n\n\t\t\tcase \"exclude\":\n\t\t\t\tmoduleData.excludeTypes.push(substitute(element.att.type));\n\t\t}\n\n\t\tif (topLevel)\n\t\t{\n\t\t\tfor (childElement in element.elements)\n\t\t\t{\n\t\t\t\tif (isValidElement(childElement, \"\"))\n\t\t\t\t{\n\t\t\t\t\tparseModuleElement(childElement, basePath, moduleData);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseOutputElement(element:Access, extensionPath:String):Void\n\t{\n\t\tif (element.has.name)\n\t\t{\n\t\t\tapp.file = substitute(element.att.name);\n\t\t}\n\n\t\tif (element.has.path)\n\t\t{\n\t\t\tapp.path = Path.combine(extensionPath, substitute(element.att.path));\n\t\t}\n\n\t\tif (element.has.resolve(\"swf-version\"))\n\t\t{\n\t\t\tapp.swfVersion = Std.parseFloat(substitute(element.att.resolve(\"swf-version\")));\n\t\t}\n\t}\n\n\tprivate function parseXML(xml:Access, section:String, extensionPath:String = \"\"):Void\n\t{\n\t\tfor (element in xml.elements)\n\t\t{\n\t\t\tif (!isValidElement(element, section)) continue;\n\n\t\t\tswitch (element.name)\n\t\t\t{\n\t\t\t\tcase \"set\":\n\t\t\t\t\tvar name = element.att.name;\n\t\t\t\t\tvar value = \"\";\n\n\t\t\t\t\tif (element.has.value)\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = substitute(element.att.value);\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (name)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"BUILD_DIR\": app.path = value;\n\t\t\t\t\t\tcase \"SWF_VERSION\": app.swfVersion = Std.parseFloat(value);\n\t\t\t\t\t\tcase \"PRERENDERED_ICON\": config.set(\"ios.prerenderedIcon\", value);\n\t\t\t\t\t\tcase \"ANDROID_INSTALL_LOCATION\": config.set(\"android.install-location\", value);\n\t\t\t\t\t}\n\n\t\t\t\t\tdefines.set(name, value);\n\t\t\t\t\tenvironment.set(name, value);\n\n\t\t\t\tcase \"unset\":\n\t\t\t\t\tdefines.remove(element.att.name);\n\t\t\t\t\tenvironment.remove(element.att.name);\n\n\t\t\t\tcase \"define\":\n\t\t\t\t\tvar name = element.att.name;\n\t\t\t\t\tvar value = \"\";\n\n\t\t\t\t\tif (element.has.value)\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = substitute(element.att.value);\n\t\t\t\t\t}\n\n\t\t\t\t\tdefines.set(name, value);\n\t\t\t\t\thaxedefs.set(name, value);\n\t\t\t\t\tenvironment.set(name, value);\n\n\t\t\t\tcase \"undefine\":\n\t\t\t\t\tdefines.remove(element.att.name);\n\t\t\t\t\thaxedefs.remove(element.att.name);\n\t\t\t\t\tenvironment.remove(element.att.name);\n\n\t\t\t\tcase \"setenv\":\n\t\t\t\t\tvar value = \"\";\n\n\t\t\t\t\tif (element.has.value)\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = substitute(element.att.value);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = \"1\";\n\t\t\t\t\t}\n\n\t\t\t\t\tvar name = substitute(element.att.name);\n\n\t\t\t\t\tdefines.set(name, value);\n\t\t\t\t\tenvironment.set(name, value);\n\t\t\t\t\tsetenv(name, value);\n\n\t\t\t\t\tif (needRerun) return;\n\n\t\t\t\tcase \"error\":\n\t\t\t\t\tLog.error(substitute(element.att.value));\n\n\t\t\t\tcase \"echo\":\n\t\t\t\t\tif (command != \"display\")\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.println(substitute(element.att.value));\n\t\t\t\t\t}\n\n\t\t\t\tcase \"log\":\n\t\t\t\t\tvar verbose = \"\";\n\n\t\t\t\t\tif (element.has.verbose)\n\t\t\t\t\t{\n\t\t\t\t\t\tverbose = substitute(element.att.verbose);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.error)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(substitute(element.att.error), verbose);\n\t\t\t\t\t}\n\t\t\t\t\telse if (command != \"display\")\n\t\t\t\t\t{\n\t\t\t\t\t\tif (element.has.warn)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(substitute(element.att.warn), verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (element.has.info)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.info(substitute(element.att.info), verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (element.has.value)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.info(substitute(element.att.value), verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (verbose != \"\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.info(\"\", verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"path\":\n\t\t\t\t\tvar value = \"\";\n\n\t\t\t\t\tif (element.has.value)\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = substitute(element.att.value);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = substitute(element.att.name);\n\t\t\t\t\t}\n\n\t\t\t\t\tpath(value);\n\n\t\t\t\tcase \"include\":\n\t\t\t\t\tvar path = \"\";\n\t\t\t\t\tvar addSourcePath = true;\n\t\t\t\t\tvar haxelib:Haxelib = null;\n\n\t\t\t\t\tif (element.has.haxelib)\n\t\t\t\t\t{\n\t\t\t\t\t\thaxelib = new Haxelib(substitute(element.att.haxelib));\n\t\t\t\t\t\tpath = findIncludeFile(Haxelib.getPath(haxelib, true));\n\t\t\t\t\t\taddSourcePath = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar subPath = substitute(element.att.path);\n\t\t\t\t\t\tif (subPath == \"\") subPath = element.att.path;\n\n\t\t\t\t\t\tpath = findIncludeFile(Path.combine(extensionPath, subPath));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = findIncludeFile(Path.combine(extensionPath, substitute(element.att.name)));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (path != null && path != \"\" && FileSystem.exists(path) && !FileSystem.isDirectory(path))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar includeProject = new ProjectXMLParser(path, defines);\n\n\t\t\t\t\t\tif (includeProject != null && haxelib != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (ndll in includeProject.ndlls)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (ndll.haxelib == null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tndll.haxelib = haxelib;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (addSourcePath)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar dir = Path.directory(path);\n\n\t\t\t\t\t\t\tif (dir != \"\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tincludeProject.sources.unshift(dir);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmerge(includeProject);\n\t\t\t\t\t}\n\t\t\t\t\telse if (!element.has.noerror)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (path == \"\" || FileSystem.isDirectory(path))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar errorPath = \"\";\n\n\t\t\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terrorPath = element.att.path;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (element.has.name)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terrorPath = element.att.name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terrorPath = Std.string(element);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tLog.error(\"\\\"\" + errorPath + \"\\\" does not appear to be a valid <include /> path\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.error(\"Could not find include file \\\"\" + path + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"meta\":\n\t\t\t\t\tparseMetaElement(element);\n\n\t\t\t\tcase \"app\":\n\t\t\t\t\tparseAppElement(element, extensionPath);\n\n\t\t\t\tcase \"java\":\n\t\t\t\t\tjavaPaths.push(Path.combine(extensionPath, substitute(element.att.path)));\n\n\t\t\t\tcase \"language\":\n\t\t\t\t\tlanguages.push(element.att.name);\n\n\t\t\t\tcase \"haxelib\":\n\t\t\t\t\tif (element.has.repository)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetenv(\"HAXELIB_PATH\", Path.combine(Sys.getCwd(), element.att.repository));\n\t\t\t\t\t\tif (needRerun) return;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar name = substitute(element.att.name);\n\t\t\t\t\tvar version = \"\";\n\t\t\t\t\tvar optional = false;\n\t\t\t\t\tvar path:String = null;\n\n\t\t\t\t\tif (element.has.version)\n\t\t\t\t\t{\n\t\t\t\t\t\tversion = substitute(element.att.version);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.optional)\n\t\t\t\t\t{\n\t\t\t\t\t\toptional = parseBool(element.att.optional);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t}\n\n\t\t\t\t\tvar haxelib = new Haxelib(name, version);\n\n\t\t\t\t\tif (version != \"\" && defines.exists(name) && !haxelib.versionMatches(defines.get(name)))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.warn(\"Ignoring requested haxelib \\\"\" + name + \"\\\" version \\\"\" + version + \"\\\" (version \\\"\" + defines.get(name)\n\t\t\t\t\t\t\t+ \"\\\" was already included)\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (path == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (defines.exists(\"setup\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = Haxelib.getPath(haxelib);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = Haxelib.getPath(haxelib, !optional);\n\n\t\t\t\t\t\t\tif (optional && path == \"\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.tryFullPath(Path.combine(extensionPath, path));\n\n\t\t\t\t\t\tif (version != \"\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tHaxelib.pathOverrides.set(name + \":\" + version, path);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tHaxelib.pathOverrides.set(name, path);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defines.exists(haxelib.name))\n\t\t\t\t\t{\n\t\t\t\t\t\tdefines.set(haxelib.name, Std.string(Haxelib.getVersion(haxelib)));\n\t\t\t\t\t}\n\n\t\t\t\t\thaxelibs.push(haxelib);\n\n\t\t\t\t\tvar includeProject = HXProject.fromHaxelib(haxelib, defines);\n\n\t\t\t\t\tif (includeProject != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (ndll in includeProject.ndlls)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ndll.haxelib == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tndll.haxelib = haxelib;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmerge(includeProject);\n\t\t\t\t\t}\n\n\t\t\t\tcase \"ndll\":\n\t\t\t\t\tvar name = substitute(element.att.name);\n\t\t\t\t\tvar haxelib:Haxelib = null;\n\t\t\t\t\tvar staticLink:Null<Bool> = null;\n\t\t\t\t\tvar registerStatics = true;\n\t\t\t\t\tvar subdirectory:String = null;\n\n\t\t\t\t\tif (element.has.haxelib)\n\t\t\t\t\t{\n\t\t\t\t\t\thaxelib = new Haxelib(substitute(element.att.haxelib));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.dir)\n\t\t\t\t\t{\n\t\t\t\t\t\tsubdirectory = substitute(element.att.dir);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (haxelib == null && (name == \"std\" || name == \"regexp\" || name == \"zlib\"))\n\t\t\t\t\t{\n\t\t\t\t\t\thaxelib = new Haxelib(config.getString(\"cpp.buildLibrary\", \"hxcpp\"));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.type)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar typeString = substitute(element.att.type).toLowerCase();\n\t\t\t\t\t\tif (typeString == \"static\") staticLink = true;\n\t\t\t\t\t\tif (typeString == \"dynamic\") staticLink = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.register)\n\t\t\t\t\t{\n\t\t\t\t\t\tregisterStatics = parseBool(element.att.register);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar ndll = new NDLL(name, haxelib, staticLink, registerStatics);\n\t\t\t\t\tndll.extensionPath = extensionPath;\n\t\t\t\t\tndll.subdirectory = subdirectory;\n\n\t\t\t\t\tndlls.push(ndll);\n\n\t\t\t\tcase \"architecture\":\n\t\t\t\t\tif (element.has.name)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = substitute(element.att.name);\n\n\t\t\t\t\t\tif (Reflect.hasField(Architecture, name.toUpperCase()))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tArrayTools.addUnique(architectures, Reflect.field(Architecture, name.toUpperCase()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown architecture: \" + name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.exclude)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar exclude = substitute(element.att.exclude);\n\n\t\t\t\t\t\tif (Reflect.hasField(Architecture, exclude.toUpperCase()))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tArrayTools.addUnique(excludeArchitectures, Reflect.field(Architecture, exclude.toUpperCase()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown architecture: \" + exclude);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"launchImage\", \"splashscreen\", \"splashScreen\":\n\t\t\t\t\tvar path = \"\";\n\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.name));\n\t\t\t\t\t}\n\n\t\t\t\t\tvar splashScreen = new SplashScreen(path);\n\n\t\t\t\t\tif (element.has.width)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.width));\n\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown width=\\\"\" + element.att.width + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsplashScreen.width = parsedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.height)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.height));\n\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown height=\\\"\" + element.att.height + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsplashScreen.height = parsedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsplashScreens.push(splashScreen);\n\n\t\t\t\tcase \"launchStoryboard\":\n\t\t\t\t\tif (launchStoryboard == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tlaunchStoryboard = new LaunchStoryboard();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tlaunchStoryboard.path = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t}\n\t\t\t\t\telse if (element.has.name)\n\t\t\t\t\t{\n\t\t\t\t\t\tlaunchStoryboard.path = Path.combine(extensionPath, substitute(element.att.name));\n\t\t\t\t\t}\n\t\t\t\t\telse if (element.has.template)\n\t\t\t\t\t{\n\t\t\t\t\t\tlaunchStoryboard.template = substitute(element.att.template);\n\t\t\t\t\t\tlaunchStoryboard.templateContext = {};\n\n\t\t\t\t\t\tfor (attr in element.x.attributes())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (attr == \"assetsPath\") continue;\n\n\t\t\t\t\t\t\tvar valueType = \"String\";\n\t\t\t\t\t\t\tvar valueName = attr;\n\n\t\t\t\t\t\t\tif (valueName.indexOf(\"-\") != -1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalueType = valueName.substring(valueName.lastIndexOf(\"-\") + 1);\n\t\t\t\t\t\t\t\tvalueName = valueName.substring(0, valueName.lastIndexOf(\"-\"));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (valueName.indexOf(\":\") != -1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalueType = valueName.substring(valueName.lastIndexOf(\":\") + 1);\n\t\t\t\t\t\t\t\tvalueName = valueName.substring(0, valueName.lastIndexOf(\":\"));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar stringValue = element.x.get(attr);\n\t\t\t\t\t\t\tvar value:Dynamic;\n\n\t\t\t\t\t\t\tswitch (valueType)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase \"Int\":\n\t\t\t\t\t\t\t\t\tvalue = Std.parseInt(stringValue);\n\t\t\t\t\t\t\t\tcase \"RGB\":\n\t\t\t\t\t\t\t\t\tvar rgb:lime.math.ARGB = Std.parseInt(stringValue);\n\t\t\t\t\t\t\t\t\tvalue = {r: rgb.r / 255, g: rgb.g / 255, b: rgb.b / 255};\n\t\t\t\t\t\t\t\tcase \"String\":\n\t\t\t\t\t\t\t\t\tvalue = stringValue;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown value type \\\"\" + valueType + \"\\\" in storyboard configuration.\");\n\t\t\t\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tReflect.setField(launchStoryboard.templateContext, valueName, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.assetsPath)\n\t\t\t\t\t{\n\t\t\t\t\t\tlaunchStoryboard.assetsPath = Path.combine(extensionPath, substitute(element.att.assetsPath));\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (childElement in element.elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!isValidElement(childElement, \"\")) continue;\n\n\t\t\t\t\t\tif (childElement.name == \"imageset\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar name = substitute(childElement.att.name);\n\t\t\t\t\t\t\tvar imageset = new LaunchStoryboard.ImageSet(name);\n\n\t\t\t\t\t\t\tif (childElement.has.width)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(childElement.att.width));\n\t\t\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown width=\\\"\" + element.att.width + \"\\\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\timageset.width = parsedValue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (childElement.has.height)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(childElement.att.height));\n\t\t\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown height=\\\"\" + element.att.height + \"\\\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\timageset.height = parsedValue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlaunchStoryboard.assets.push(imageset);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"icon\":\n\t\t\t\t\tvar path = \"\";\n\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.name));\n\t\t\t\t\t}\n\n\t\t\t\t\tvar icon = new Icon(path);\n\n\t\t\t\t\tif (element.has.size)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.size));\n\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown size=\\\"\" + element.att.size + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ticon.size = icon.width = icon.height = parsedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.width)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.width));\n\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown width=\\\"\" + element.att.width + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ticon.width = parsedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.height)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.height));\n\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown height=\\\"\" + element.att.height + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ticon.height = parsedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.priority)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.priority));\n\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown priority=\\\"\" + element.att.priority + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ticon.priority = parsedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ticons.push(icon);\n\n\t\t\t\tcase \"source\", \"classpath\":\n\t\t\t\t\tvar path = \"\";\n\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.name));\n\t\t\t\t\t}\n\n\t\t\t\t\tsources.push(path);\n\n\t\t\t\tcase \"extension\":\n\n\t\t\t\t\t// deprecated\n\n\t\t\t\tcase \"haxedef\":\n\t\t\t\t\tif (element.has.remove)\n\t\t\t\t\t{\n\t\t\t\t\t\thaxedefs.remove(substitute(element.att.remove));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = substitute(element.att.name);\n\t\t\t\t\t\tvar value = \"\";\n\n\t\t\t\t\t\tif (element.has.value)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue = substitute(element.att.value);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thaxedefs.set(name, value);\n\t\t\t\t\t}\n\n\t\t\t\tcase \"haxeflag\", \"compilerflag\":\n\t\t\t\t\tvar flag = substitute(element.att.name);\n\n\t\t\t\t\tif (element.has.value)\n\t\t\t\t\t{\n\t\t\t\t\t\tflag += \" \" + substitute(element.att.value);\n\t\t\t\t\t}\n\n\t\t\t\t\thaxeflags.push(substitute(flag));\n\n\t\t\t\tcase \"window\":\n\t\t\t\t\tparseWindowElement(element);\n\n\t\t\t\tcase \"assets\":\n\t\t\t\t\tparseAssetsElement(element, extensionPath);\n\n\t\t\t\tcase \"library\", \"swf\":\n\t\t\t\t\tif (element.has.handler)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (element.has.type)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlibraryHandlers.set(substitute(element.att.type), substitute(element.att.handler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvar path:String = null;\n\t\t\t\t\t\tvar name = \"\";\n\t\t\t\t\t\tvar type:String = null;\n\t\t\t\t\t\tvar embed:Null<Bool> = null;\n\t\t\t\t\t\tvar preload = false;\n\t\t\t\t\t\tvar generate = false;\n\t\t\t\t\t\tvar prefix = \"\";\n\n\t\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname = substitute(element.att.name);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.id)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname = substitute(element.att.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.type)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype = substitute(element.att.type);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.embed)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tembed = parseBool(element.att.embed);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.preload)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpreload = parseBool(element.att.preload);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.generate)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgenerate = parseBool(element.att.generate);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.prefix)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprefix = substitute(element.att.prefix);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlibraries.push(new Library(path, name, type, embed, preload, generate, prefix));\n\t\t\t\t\t}\n\n\t\t\t\tcase \"module\":\n\t\t\t\t\tparseModuleElement(element, extensionPath);\n\n\t\t\t\tcase \"ssl\":\n\n\t\t\t\t\t// if (wantSslCertificate())\n\t\t\t\t\t// parseSsl (element);\n\n\t\t\t\tcase \"sample\":\n\t\t\t\t\tsamplePaths.push(Path.combine(extensionPath, substitute(element.att.path)));\n\n\t\t\t\tcase \"target\":\n\t\t\t\t\tif (element.has.handler)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (element.has.name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttargetHandlers.set(substitute(element.att.name), substitute(element.att.handler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (element.has.name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttargetHandlers.set(substitute(element.att.name), Path.combine(extensionPath, substitute(element.att.path)));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"template\":\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (element.has.haxelib)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar haxelibPath = Haxelib.getPath(new Haxelib(substitute(element.att.haxelib)), true);\n\t\t\t\t\t\t\tvar path = Path.combine(haxelibPath, substitute(element.att.path));\n\t\t\t\t\t\t\ttemplatePaths.push(path);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar path = Path.combine(extensionPath, substitute(element.att.path));\n\n\t\t\t\t\t\t\tif (FileSystem.exists(path) && !FileSystem.isDirectory(path))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tparseAssetsElement(element, extensionPath, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttemplatePaths.push(path);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tparseAssetsElement(element, extensionPath, true);\n\t\t\t\t\t}\n\n\t\t\t\tcase \"templatePath\":\n\t\t\t\t\ttemplatePaths.push(Path.combine(extensionPath, substitute(element.att.name)));\n\n\t\t\t\tcase \"preloader\":\n\t\t\t\t\t// deprecated\n\n\t\t\t\t\tapp.preloader = substitute(element.att.name);\n\n\t\t\t\tcase \"output\":\n\t\t\t\t\t// deprecated\n\n\t\t\t\t\tparseOutputElement(element, extensionPath);\n\n\t\t\t\tcase \"section\":\n\t\t\t\t\tparseXML(element, \"\", extensionPath);\n\n\t\t\t\tcase \"certificate\":\n\t\t\t\t\tif (element.has.path || element.has.type)\n\t\t\t\t\t{\n\t\t\t\t\t\tkeystore = new Keystore();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (keystore != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.path = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (element.has.keystore)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.path = Path.combine(extensionPath, substitute(element.att.keystore));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.type)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.type = substitute(element.att.type);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.password)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.password = substitute(element.att.password);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.alias)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.alias = substitute(element.att.alias);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (element.has.resolve(\"alias-password\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.aliasPassword = substitute(element.att.resolve(\"alias-password\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (element.has.alias_password)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeystore.aliasPassword = substitute(element.att.alias_password);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.identity)\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"ios.identity\", element.att.identity);\n\t\t\t\t\t\tconfig.set(\"tvos.identity\", element.att.identity);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"team-id\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"ios.team-id\", element.att.resolve(\"team-id\"));\n\t\t\t\t\t\tconfig.set(\"tvos.team-id\", element.att.resolve(\"team-id\"));\n\t\t\t\t\t}\n\n\t\t\t\tcase \"dependency\":\n\t\t\t\t\tvar name = \"\";\n\t\t\t\t\tvar path = \"\";\n\n\t\t\t\t\tif (element.has.path)\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(extensionPath, substitute(element.att.path));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.name)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar foundName = substitute(element.att.name);\n\n\t\t\t\t\t\tif (StringTools.endsWith(foundName, \".a\") || StringTools.endsWith(foundName, \".dll\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = Path.combine(extensionPath, foundName);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname = foundName;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar dependency = new Dependency(name, path);\n\n\t\t\t\t\tif (element.has.embed)\n\t\t\t\t\t{\n\t\t\t\t\t\tdependency.embed = parseBool(element.att.embed);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"force-load\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tdependency.forceLoad = parseBool(element.att.resolve(\"force-load\"));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"allow-web-workers\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tdependency.allowWebWorkers = parseBool(element.att.resolve(\"allow-web-workers\"));\n\t\t\t\t\t}\n\n\t\t\t\t\tvar i = dependencies.length;\n\n\t\t\t\t\twhile (i-- > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((name != \"\" && dependencies[i].name == name) || (path != \"\" && dependencies[i].path == path))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdependencies.splice(i, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdependencies.push(dependency);\n\n\t\t\t\tcase \"android\":\n\t\t\t\t\t// deprecated\n\n\t\t\t\t\tfor (attribute in element.x.attributes())\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = attribute;\n\t\t\t\t\t\tvar value = substitute(element.att.resolve(attribute));\n\n\t\t\t\t\t\tswitch (name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"minimum-sdk-version\":\n\t\t\t\t\t\t\t\tvar parsedValue = Std.parseInt(value);\n\t\t\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown \" + name + \"=\\\"\" + value + \"\\\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tconfig.set(\"android.minimum-sdk-version\", parsedValue);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcase \"target-sdk-version\":\n\t\t\t\t\t\t\t\tvar parsedValue = Std.parseInt(value);\n\t\t\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown \" + name + \"=\\\"\" + value + \"\\\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tconfig.set(\"android.target-sdk-version\", parsedValue);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcase \"install-location\":\n\t\t\t\t\t\t\t\tconfig.set(\"android.install-location\", value);\n\n\t\t\t\t\t\t\tcase \"extension\":\n\t\t\t\t\t\t\t\tvar extensions = config.getArrayString(\"android.extension\");\n\n\t\t\t\t\t\t\t\tif (extensions == null || extensions.indexOf(value) == -1)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tconfig.push(\"android.extension\", value);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcase \"permission\":\n\t\t\t\t\t\t\t\tvar permissions = config.getArrayString(\"android.permission\");\n\n\t\t\t\t\t\t\t\tif (permissions == null || permissions.indexOf(value) == -1)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tconfig.push(\"android.permission\", value);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcase \"gradle-version\":\n\t\t\t\t\t\t\t\tconfig.set(\"android.gradle-version\", value);\n\n\t\t\t\t\t\t\tcase \"gradle-plugin\":\n\t\t\t\t\t\t\t\tconfig.set(\"android.gradle-plugin\", value);\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tname = formatAttributeName(attribute);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"cpp\":\n\t\t\t\t\t// deprecated\n\n\t\t\t\t\tfor (attribute in element.x.attributes())\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = attribute;\n\t\t\t\t\t\tvar value = substitute(element.att.resolve(attribute));\n\n\t\t\t\t\t\tswitch (name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"build-library\":\n\t\t\t\t\t\t\t\tconfig.set(\"cpp.buildLibrary\", value);\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tname = formatAttributeName(attribute);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"ios\":\n\t\t\t\t\t// deprecated\n\n\t\t\t\t\tif (target != Platform.IOS) continue;\n\n\t\t\t\t\tif (element.has.deployment)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar deployment = Std.parseFloat(substitute(element.att.deployment));\n\n\t\t\t\t\t\t// If it is specified, assume the dev knows what he is doing!\n\t\t\t\t\t\tconfig.set(\"ios.deployment\", deployment);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.binaries)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar binaries = substitute(element.att.binaries);\n\n\t\t\t\t\t\tswitch (binaries)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"fat\":\n\t\t\t\t\t\t\t\tArrayTools.addUnique(architectures, Architecture.ARMV6);\n\t\t\t\t\t\t\t\tArrayTools.addUnique(architectures, Architecture.ARMV7);\n\n\t\t\t\t\t\t\tcase \"armv6\":\n\t\t\t\t\t\t\t\tArrayTools.addUnique(architectures, Architecture.ARMV6);\n\t\t\t\t\t\t\t\tarchitectures.remove(Architecture.ARMV7);\n\n\t\t\t\t\t\t\tcase \"armv7\":\n\t\t\t\t\t\t\t\tArrayTools.addUnique(architectures, Architecture.ARMV7);\n\t\t\t\t\t\t\t\tarchitectures.remove(Architecture.ARMV6);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.devices)\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"ios.device\", substitute(element.att.devices).toLowerCase());\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.compiler)\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"ios.compiler\", substitute(element.att.compiler));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"prerendered-icon\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"ios.prerenderedIcon\", substitute(element.att.resolve(\"prerendered-icon\")));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"linker-flags\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.push(\"ios.linker-flags\", substitute(element.att.resolve(\"linker-flags\")));\n\t\t\t\t\t}\n\n\t\t\t\tcase \"tvos\":\n\t\t\t\t\t// deprecated\n\n\t\t\t\t\tif (target != Platform.TVOS) continue;\n\n\t\t\t\t\tif (element.has.deployment)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar deployment = Std.parseFloat(substitute(element.att.deployment));\n\n\t\t\t\t\t\t// If it is specified, assume the dev knows what he is doing!\n\t\t\t\t\t\tconfig.set(\"tvos.deployment\", deployment);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.binaries)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar binaries = substitute(element.att.binaries);\n\n\t\t\t\t\t\tswitch (binaries)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"arm64\":\n\t\t\t\t\t\t\t\tArrayTools.addUnique(architectures, Architecture.ARM64);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.devices)\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"tvos.device\", substitute(element.att.devices).toLowerCase());\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.compiler)\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"tvos.compiler\", substitute(element.att.compiler));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"prerendered-icon\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.set(\"tvos.prerenderedIcon\", substitute(element.att.resolve(\"prerendered-icon\")));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.has.resolve(\"linker-flags\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.push(\"tvos.linker-flags\", substitute(element.att.resolve(\"linker-flags\")));\n\t\t\t\t\t}\n\n\t\t\t\tcase \"config\":\n\t\t\t\t\tconfig.parse(element, substitute);\n\n\t\t\t\tcase \"prebuild\":\n\t\t\t\t\tparseCommandElement(element, preBuildCallbacks);\n\n\t\t\t\tcase \"postbuild\":\n\t\t\t\t\tparseCommandElement(element, postBuildCallbacks);\n\n\t\t\t\tdefault:\n\t\t\t\t\tif (StringTools.startsWith(element.name, \"config:\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tconfig.parse(element, substitute);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function parseWindowElement(element:Access):Void\n\t{\n\t\tvar id = 0;\n\n\t\tif (element.has.id)\n\t\t{\n\t\t\tvar parsedValue = Std.parseInt(substitute(element.att.id));\n\t\t\tif (parsedValue == null)\n\t\t\t{\n\t\t\t\tLog.warn(\"Ignoring unknown id=\\\"\" + element.att.id + \"\\\"\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tid = parsedValue;\n\t\t\t}\n\t\t}\n\n\t\twhile (id >= windows.length)\n\t\t{\n\t\t\twindows.push({});\n\t\t}\n\n\t\tfor (attribute in element.x.attributes())\n\t\t{\n\t\t\tvar name = attribute;\n\t\t\tvar value = substitute(element.att.resolve(attribute));\n\n\t\t\tswitch (name)\n\t\t\t{\n\t\t\t\tcase \"background\":\n\t\t\t\t\tvalue = StringTools.replace(value, \"#\", \"\");\n\n\t\t\t\t\tif (value == \"null\" || value == \"transparent\" || value == \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\twindows[id].background = null;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (value.indexOf(\"0x\") == -1) value = \"0x\" + value;\n\n\t\t\t\t\t\tif (value.length == 10 && StringTools.startsWith(value, \"0x00\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twindows[id].background = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar parsedValue = Std.parseInt(value);\n\t\t\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLog.warn(\"Ignoring unknown \" + name + \"=\\\"\" + value + \"\\\"\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twindows[id].background = parsedValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"orientation\":\n\t\t\t\t\tvar orientation = Reflect.field(Orientation, Std.string(value).toUpperCase());\n\n\t\t\t\t\tif (orientation != null)\n\t\t\t\t\t{\n\t\t\t\t\t\twindows[id].orientation = orientation;\n\t\t\t\t\t}\n\n\t\t\t\tcase \"height\", \"width\", \"fps\", \"antialiasing\":\n\t\t\t\t\tvar parsedValue = Std.parseInt(value);\n\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.warn(\"Ignoring unknown \" + name + \"=\\\"\" + value + \"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(windows[id], name, parsedValue);\n\t\t\t\t\t}\n\n\t\t\t\tcase \"parameters\", \"title\":\n\t\t\t\t\tReflect.setField(windows[id], name, Std.string(value));\n\n\t\t\t\tcase \"allow-high-dpi\":\n\t\t\t\t\tReflect.setField(windows[id], \"allowHighDPI\", value == \"true\");\n\n\t\t\t\tcase \"color-depth\":\n\t\t\t\t\tvar parsedValue = Std.parseInt(value);\n\t\t\t\t\tif (parsedValue == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.warn(\"Ignoring unknown \" + name + \"=\\\"\" + value + \"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(windows[id], \"colorDepth\", parsedValue);\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tif (Reflect.hasField(WindowData.expectedFields, name))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(windows[id], name, value == \"true\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (Reflect.hasField(WindowData.expectedFields, formatAttributeName(name)))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(windows[id], formatAttributeName(name), value == \"true\");\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function process(projectFile:String, useExtensionPath:Bool):Void\n\t{\n\t\tvar xml:Access = null;\n\t\tvar extensionPath = \"\";\n\n\t\ttry\n\t\t{\n\t\t\txml = new Access(Xml.parse(File.getContent(projectFile)).firstElement());\n\t\t\textensionPath = Path.directory(projectFile);\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\tLog.error(\"\\\"\" + projectFile + \"\\\" contains invalid XML data\", e);\n\t\t}\n\n\t\tparseXML(xml, \"\", extensionPath);\n\t}\n\n\tprivate function substitute(string:String):String\n\t{\n\t\tvar newString = string;\n\n\t\twhile (doubleVarMatch.match(newString))\n\t\t{\n\t\t\tnewString = doubleVarMatch.matchedLeft()\n\t\t\t\t+ \"${\"\n\t\t\t\t+ ProjectHelper.replaceVariable(this, doubleVarMatch.matched(1))\n\t\t\t\t+ \"}\"\n\t\t\t\t+ doubleVarMatch.matchedRight();\n\t\t}\n\n\t\twhile (varMatch.match(newString))\n\t\t{\n\t\t\tnewString = varMatch.matchedLeft() + ProjectHelper.replaceVariable(this, varMatch.matched(1)) + varMatch.matchedRight();\n\t\t}\n\n\t\treturn newString;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/SplashScreen.hx",
    "content": "package lime.tools;\n\nclass SplashScreen\n{\n\tpublic var height:Int;\n\tpublic var path:String;\n\tpublic var width:Int;\n\n\tpublic function new(path:String, width:Int = 0, height:Int = 0)\n\t{\n\t\tthis.path = path;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tpublic function clone():SplashScreen\n\t{\n\t\tvar splashScreen = new SplashScreen(path);\n\t\tsplashScreen.width = width;\n\t\tsplashScreen.height = height;\n\n\t\treturn splashScreen;\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/TVOSHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.HXProject;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass TVOSHelper\n{\n\tprivate static var initialized = false;\n\n\tpublic static function build(project:HXProject, workingDirectory:String, additionalArguments:Array<String> = null):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar commands = getXCodeArgs(project);\n\n\t\tif (project.targetFlags.exists(\"archive\"))\n\t\t{\n\t\t\tvar configuration = project.environment.get(\"CONFIGURATION\");\n\t\t\tvar platformName = project.environment.get(\"PLATFORM_NAME\");\n\n\t\t\tcommands.push(\"archive\");\n\t\t\tcommands.push(\"-scheme\");\n\t\t\tcommands.push(project.app.file);\n\t\t\tcommands.push(\"-archivePath\");\n\t\t\tcommands.push(Path.combine(\"build\", Path.combine(configuration + \"-\" + platformName, project.app.file)));\n\t\t}\n\n\t\tif (additionalArguments != null)\n\t\t{\n\t\t\tcommands = commands.concat(additionalArguments);\n\t\t}\n\n\t\tSystem.runCommand(workingDirectory, \"xcodebuild\", commands);\n\t}\n\n\tpublic static function deploy(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar commands = getXCodeArgs(project);\n\t\tvar archiveCommands = commands.concat([]);\n\n\t\t// generate xcarchive\n\t\tvar configuration = project.environment.get(\"CONFIGURATION\");\n\t\tvar platformName = project.environment.get(\"PLATFORM_NAME\");\n\n\t\tarchiveCommands.push(\"archive\");\n\t\tarchiveCommands.push(\"-scheme\");\n\t\tarchiveCommands.push(project.app.file);\n\t\tarchiveCommands.push(\"-archivePath\");\n\t\tarchiveCommands.push(Path.combine(\"build\", Path.combine(configuration + \"-\" + platformName, project.app.file)));\n\n\t\tSystem.runCommand(workingDirectory, \"xcodebuild\", archiveCommands);\n\n\t\t// generate IPA from xcarchive\n\t\tvar exportCommands = commands.concat([]);\n\n\t\tvar exportMethod = project.targetFlags.exists(\"adhoc\") ? \"adhoc\" : project.targetFlags.exists(\"development\") ? \"development\" : project.targetFlags.exists(\"enterprise\") ? \"enterprise\" : \"appstore\";\n\n\t\texportCommands.push(\"-exportArchive\");\n\t\texportCommands.push(\"-archivePath\");\n\t\texportCommands.push(Path.combine(\"build\", Path.combine(configuration + \"-\" + platformName, project.app.file + \".xcarchive\")));\n\t\texportCommands.push(\"-exportOptionsPlist\");\n\t\texportCommands.push(Path.combine(project.app.file, \"exportOptions-\" + exportMethod + \".plist\"));\n\t\texportCommands.push(\"-exportPath\");\n\t\texportCommands.push(Path.combine(\"dist\", exportMethod));\n\n\t\tSystem.runCommand(workingDirectory, \"xcodebuild\", exportCommands);\n\t}\n\n\tprivate static function getXCodeArgs(project:HXProject):Array<String>\n\t{\n\t\tvar platformName = \"appletvos\";\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tplatformName = \"appletvsimulator\";\n\t\t}\n\n\t\tvar configuration = \"Release\";\n\n\t\tif (project.debug)\n\t\t{\n\t\t\tconfiguration = \"Debug\";\n\t\t}\n\n\t\tvar iphoneVersion = project.environment.get(\"TVOS_VER\");\n\t\tvar commands = [\n\t\t\t\"-configuration\",\n\t\t\tconfiguration,\n\t\t\t\"PLATFORM_NAME=\" + platformName,\n\t\t\t\"SDKROOT=\" + platformName + iphoneVersion\n\t\t];\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tcommands.push(\"-arch\");\n\t\t\tcommands.push(\"x86_64\");\n\t\t}\n\n\t\tproject.setenv(\"PLATFORM_NAME\", platformName);\n\t\tproject.setenv(\"CONFIGURATION\", configuration);\n\n\t\t// setting CONFIGURATION and PLATFORM_NAME in project.environment doesn't set them for xcodebuild so also pass via command line\n\t\tvar commands = [\n\t\t\t\"-configuration\",\n\t\t\tconfiguration,\n\t\t\t\"PLATFORM_NAME=\" + platformName,\n\t\t\t\"SDKROOT=\" + platformName + iphoneVersion\n\t\t];\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tcommands.push(\"-arch\");\n\t\t\tcommands.push(\"x86_64\");\n\t\t}\n\n\t\tcommands.push(\"-project\");\n\t\tcommands.push(project.app.file + \".xcodeproj\");\n\n\t\tvar xcodeVersions = getXcodeVersion().split(\".\").map(function(i:String)\n\t\t{\n\t\t\tvar ver = Std.parseInt(i);\n\t\t\treturn ver != null ? ver : 0;\n\t\t});\n\n\t\tif (xcodeVersions[0] >= 9)\n\t\t{\n\t\t\tif (project.config.getBool('ios.allow-provisioning-updates', true))\n\t\t\t{\n\t\t\t\tcommands.push(\"-allowProvisioningUpdates\");\n\t\t\t}\n\t\t\tif (project.config.getBool('ios.allow-provisioning-device-registration', true))\n\t\t\t{\n\t\t\t\tcommands.push(\"-allowProvisioningDeviceRegistration\");\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\tprivate static function getIOSVersion(project:HXProject):Void\n\t{\n\t\tif (!project.environment.exists(\"TVOS_VER\"))\n\t\t{\n\t\t\tif (!project.environment.exists(\"DEVELOPER_DIR\"))\n\t\t\t{\n\t\t\t\tvar proc = new Process(\"xcode-select\", [\"--print-path\"]);\n\t\t\t\tvar developer_dir = proc.stdout.readLine();\n\t\t\t\tproc.close();\n\t\t\t\tproject.environment.set(\"DEVELOPER_DIR\", developer_dir);\n\t\t\t}\n\n\t\t\tvar dev_path = project.environment.get(\"DEVELOPER_DIR\") + \"/Platforms/AppleTVOS.platform/Developer/SDKs\";\n\n\t\t\tif (FileSystem.exists(dev_path))\n\t\t\t{\n\t\t\t\tvar best = \"\";\n\t\t\t\tvar files = FileSystem.readDirectory(dev_path);\n\t\t\t\tvar extract_version = ~/^AppleTVOS(.*).sdk$/;\n\n\t\t\t\tfor (file in files)\n\t\t\t\t{\n\t\t\t\t\tif (extract_version.match(file))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar ver = extract_version.matched(1);\n\n\t\t\t\t\t\tif (ver > best)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbest = ver;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (best != \"\")\n\t\t\t\t{\n\t\t\t\t\tproject.environment.set(\"TVOS_VER\", best);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function getOSXVersion():String\n\t{\n\t\tvar output = System.runProcess(\"\", \"sw_vers\", [\"-productVersion\"]);\n\t\treturn StringTools.trim(output);\n\t}\n\n\tpublic static function getProvisioningFile():String\n\t{\n\t\tvar path = Path.expand(\"~/Library/MobileDevice/Provisioning Profiles\");\n\t\tvar files = FileSystem.readDirectory(path);\n\n\t\tfor (file in files)\n\t\t{\n\t\t\tif (Path.extension(file) == \"mobileprovision\")\n\t\t\t{\n\t\t\t\treturn path + \"/\" + file;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\tpublic static function getSDKDirectory(project:HXProject):String\n\t{\n\t\tinitialize(project);\n\n\t\tvar platformName = \"AppleTVOS\";\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tplatformName = \"AppleTVSimulator\";\n\t\t}\n\n\t\tvar process = new Process(\"xcode-select\", [\"--print-path\"]);\n\t\tvar directory = process.stdout.readLine();\n\t\tprocess.close();\n\n\t\tif (directory == \"\" || directory.indexOf(\"Run xcode-select\") > -1)\n\t\t{\n\t\t\tdirectory = \"/Applications/Xcode.app/Contents/Developer\";\n\t\t}\n\n\t\tdirectory += \"/Platforms/\" + platformName + \".platform/Developer/SDKs/\" + platformName + project.environment.get(\"TVOS_VER\") + \".sdk\";\n\t\tLog.info(directory);\n\t\treturn directory;\n\t}\n\n\tprivate static function getXcodeVersion():String\n\t{\n\t\tvar output = System.runProcess(\"\", \"xcodebuild\", [\"-version\"]);\n\t\tvar firstLine = output.split(\"\\n\").shift();\n\n\t\treturn StringTools.trim(firstLine.substring(\"Xcode\".length, firstLine.length));\n\t}\n\n\tprivate static function initialize(project:HXProject):Void\n\t{\n\t\tif (!initialized)\n\t\t{\n\t\t\tgetIOSVersion(project);\n\n\t\t\tinitialized = true;\n\t\t}\n\t}\n\n\tpublic static function launch(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar configuration = \"Release\";\n\n\t\tif (project.debug)\n\t\t{\n\t\t\tconfiguration = \"Debug\";\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tvar applicationPath = \"\";\n\n\t\t\tif (Path.extension(workingDirectory) == \"app\" || Path.extension(workingDirectory) == \"ipa\")\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory + \"/build/\" + configuration + \"-appletvsimulator/\" + project.app.file + \".app\";\n\t\t\t}\n\n\t\t\tvar templatePaths = [\n\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t].concat(project.templatePaths);\n\t\t\tvar launcher = System.findTemplate(templatePaths, \"bin/ios-sim\");\n\t\t\tSys.command(\"chmod\", [\"+x\", launcher]);\n\n\t\t\t// device config\n\t\t\tvar defaultDevice = \"apple-tv-1080p\";\n\t\t\tvar devices:Array<String> = [\"apple-tv-1080p\"];\n\t\t\tvar oldDevices:Map<String, String> = [\"appletv\" => \"apple-tv-1080p\"];\n\n\t\t\tvar deviceFlag:String = null;\n\t\t\tvar deviceTypeID:String = null;\n\n\t\t\t// check if old device flag and convert to current\n\t\t\tfor (key in oldDevices.keys())\n\t\t\t{\n\t\t\t\tif (project.targetFlags.exists(key))\n\t\t\t\t{\n\t\t\t\t\tdeviceFlag = oldDevices[key];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check known device in command line args\n\t\t\tif (deviceFlag == null)\n\t\t\t{\n\t\t\t\tfor (i in 0...devices.length)\n\t\t\t\t{\n\t\t\t\t\tif (project.targetFlags.exists(devices[i]))\n\t\t\t\t\t{\n\t\t\t\t\t\tdeviceFlag = devices[i];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// default to iphone 6\n\t\t\tif (deviceFlag == null)\n\t\t\t{\n\t\t\t\tdeviceFlag = defaultDevice;\n\t\t\t}\n\n\t\t\t// check if device is available\n\t\t\t// $ ios-sim showdevicetypes\n\t\t\tvar devicesOutput:String = System.runProcess(\"\", launcher, [\"showdevicetypes\"]);\n\t\t\tvar deviceTypeList:Array<String> = devicesOutput.split(\"\\n\");\n\n\t\t\tfor (i in 0...deviceTypeList.length)\n\t\t\t{\n\t\t\t\tvar r = new EReg(deviceFlag + \",\", \"i\");\n\n\t\t\t\tif (r.match(deviceTypeList[i]))\n\t\t\t\t{\n\t\t\t\t\tdeviceTypeID = deviceTypeList[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (deviceTypeID == null)\n\t\t\t{\n\t\t\t\tLog.warn(\"Device \\\"\" + deviceFlag + \"\\\" was not found\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.info(\"Launch app on \\\"\" + deviceTypeID + \"\\\"\");\n\t\t\t}\n\n\t\t\t// run command with --devicetypeid if exists\n\t\t\tif (deviceTypeID != null)\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", launcher, [\n\t\t\t\t\t\"launch\",\n\t\t\t\t\tFileSystem.fullPath(applicationPath),\n\t\t\t\t\t/*\"--sdk\", project.environment.get (\"IPHONE_VER\"),*/\n\t\t\t\t\t\"--devicetypeid\",\n\t\t\t\t\tdeviceTypeID,\n\t\t\t\t\t\"--timeout\",\n\t\t\t\t\t\"60\"\n\t\t\t\t]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", launcher, [\n\t\t\t\t\t\"launch\",\n\t\t\t\t\tFileSystem.fullPath(applicationPath),\n\t\t\t\t\t/*\"--sdk\", project.environment.get (\"IPHONE_VER\"), \"--devicetypeid\", deviceTypeID,*/\n\t\t\t\t\t\"--timeout\",\n\t\t\t\t\t\"60\"\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar applicationPath = \"\";\n\n\t\t\tif (Path.extension(workingDirectory) == \"app\" || Path.extension(workingDirectory) == \"ipa\")\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tapplicationPath = workingDirectory + \"/build/\" + configuration + \"-appletvos/\" + project.app.file + \".app\";\n\t\t\t}\n\n\t\t\tvar templatePaths = [\n\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t].concat(project.templatePaths);\n\t\t\tvar launcher = System.findTemplate(templatePaths, \"bin/ios-deploy\");\n\t\t\tSys.command(\"chmod\", [\"+x\", launcher]);\n\n\t\t\tvar xcodeVersion = getXcodeVersion();\n\n\t\t\tSystem.runCommand(\"\", launcher, [\n\t\t\t\t\"install\",\n\t\t\t\t\"--noninteractive\",\n\t\t\t\t\"--debug\",\n\t\t\t\t\"--timeout\",\n\t\t\t\t\"5\",\n\t\t\t\t\"--bundle\",\n\t\t\t\tFileSystem.fullPath(applicationPath)\n\t\t\t]);\n\t\t}\n\t}\n\n\tpublic static function sign(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tinitialize(project);\n\n\t\tvar configuration = \"Release\";\n\n\t\tif (project.debug)\n\t\t{\n\t\t\tconfiguration = \"Debug\";\n\t\t}\n\n\t\tvar identity = project.config.getString(\"tvos.identity\", \"tvOS Developer\");\n\n\t\tvar commands = [\"-s\", identity, \"CODE_SIGN_IDENTITY=\" + identity];\n\n\t\tif (project.config.exists(\"tvos.provisioning-profile\"))\n\t\t{\n\t\t\tcommands.push(\"PROVISIONING_PROFILE=\" + project.config.getString(\"tvos.provisioning-profile\"));\n\t\t}\n\n\t\tvar applicationPath = \"build/\" + configuration + \"-appletvos/\" + project.app.file + \".app\";\n\t\tcommands.push(applicationPath);\n\n\t\tSystem.runCommand(workingDirectory, \"codesign\", commands, true, true);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/TizenHelper.hx",
    "content": "package lime.tools;\n\nimport haxe.crypto.Crc32;\nimport haxe.io.Bytes;\nimport haxe.io.Eof;\nimport hxp.*;\nimport lime.tools.HXProject;\nimport lime.tools.Platform;\nimport sys.FileSystem;\n\nclass TizenHelper\n{\n\tprivate static var cacheID:String = null;\n\tprivate static var cacheUUID:String = null;\n\n\tpublic static function createPackage(project:HXProject, workingDirectory:String, targetPath:String):Void\n\t{\n\t\tvar keystore:String = null;\n\t\tvar password:String = null;\n\n\t\tif (project.keystore != null)\n\t\t{\n\t\t\tkeystore = Path.tryFullPath(project.keystore.path);\n\t\t\tpassword = project.keystore.password;\n\n\t\t\tif (password == null)\n\t\t\t{\n\t\t\t\tpassword = prompt(\"Keystore password\", true);\n\t\t\t\tSys.println(\"\");\n\t\t\t}\n\t\t}\n\n\t\tif (keystore == null)\n\t\t{\n\t\t\tvar templatePaths = [\n\t\t\t\tPath.combine(Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)), #if lime \"templates\" #else \"\" #end)\n\t\t\t].concat(project.templatePaths);\n\t\t\tkeystore = System.findTemplate(templatePaths, \"bin/debug.p12\");\n\t\t\tpassword = \"1234\";\n\t\t}\n\n\t\tvar packageName = getUUID(project) + \"-\" + project.meta.version + \"-\";\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tpackageName += \"i386\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpackageName += \"arm\";\n\t\t}\n\n\t\tpackageName += \".tpk\";\n\n\t\tif (FileSystem.exists(Path.combine(workingDirectory, packageName)))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFileSystem.deleteFile((Path.combine(workingDirectory, packageName)));\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\trunCommand(project, workingDirectory, \"native-packaging\", [\"--sign-author-key\", keystore, \"--sign-author-pwd\", password]);\n\t}\n\n\tpublic static function getUUID(project:HXProject):String\n\t{\n\t\tif (cacheID != project.meta.packageName)\n\t\t{\n\t\t\tif (project.meta.packageName != null || project.meta.packageName.length == 10 || project.meta.packageName.indexOf(\".\") == -1)\n\t\t\t{\n\t\t\t\tvar bytes = Bytes.ofString(project.meta.packageName);\n\t\t\t\tvar crc = Crc32.make(bytes);\n\t\t\t\tcacheUUID = StringTools.generateUUID(10, null, crc);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcacheUUID = project.meta.packageName;\n\t\t\t}\n\n\t\t\tcacheID = project.meta.packageName;\n\t\t}\n\n\t\treturn cacheUUID;\n\t}\n\n\tpublic static function install(project:HXProject, workingDirectory:String):Void\n\t{\n\t\tvar packageName = getUUID(project) + \"-\" + project.meta.version + \"-\";\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tpackageName += \"i386\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpackageName += \"arm\";\n\t\t}\n\n\t\tpackageName += \".tpk\";\n\n\t\trunCommand(project, \"\", \"native-install\", [\"--package\", FileSystem.fullPath(workingDirectory + \"/\" + packageName)]);\n\t}\n\n\tpublic static function launch(project:HXProject):Void\n\t{\n\t\trunCommand(project, \"\", \"native-run\", [\"--package\", getUUID(project)]);\n\t}\n\n\tprivate static function prompt(name:String, ?passwd:Bool):String\n\t{\n\t\tSys.print(name + \": \");\n\n\t\tif (passwd)\n\t\t{\n\t\t\tvar s = new StringBuf();\n\t\t\tvar c:Int;\n\t\t\twhile ((c = Sys.getChar(false)) != 13)\n\t\t\t\ts.addChar(c);\n\t\t\treturn s.toString();\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\treturn Sys.stdin().readLine();\n\t\t}\n\t\tcatch (e:Eof)\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate static function runCommand(project:HXProject, workingDirectory:String, command:String, args:Array<String>):Void\n\t{\n\t\tvar sdkDirectory = \"\";\n\n\t\tif (project.environment.exists(\"TIZEN_SDK\"))\n\t\t{\n\t\t\tsdkDirectory = project.environment.get(\"TIZEN_SDK\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t{\n\t\t\t\tsdkDirectory = \"C:\\\\Development\\\\Tizen\\\\tizen-sdk\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsdkDirectory = \"~/Development/Tizen/tizen-sdk\";\n\t\t\t}\n\t\t}\n\n\t\tSystem.runCommand(workingDirectory, Path.combine(sdkDirectory, \"tools/ide/bin/\" + command), args);\n\t}\n\n\tpublic static function trace(project:HXProject, follow:Bool = true):Void\n\t{\n\t\t/*var args:Array<String> = [];\n\n\t\t\tif (follow) {\n\n\t\t\t\targs.push (\"-f\");\n\n\t\t\t}\n\n\t\t\targs.push (project.meta.packageName);\n\n\t\t\trunPalmCommand (project, \"\", \"log\", args); */\n\n\t\tvar sdkDirectory = \"\";\n\n\t\tif (project.environment.exists(\"TIZEN_SDK\"))\n\t\t{\n\t\t\tsdkDirectory = project.environment.get(\"TIZEN_SDK\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t{\n\t\t\t\tsdkDirectory = \"C:\\\\Development\\\\Tizen\\\\tizen-sdk\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsdkDirectory = \"~/Development/Tizen/tizen-sdk\";\n\t\t\t}\n\t\t}\n\n\t\t// var args = [ \"--package\", project.meta.packageName ];\n\t\t// var args = [ \"dlog\", project.meta.packageName + \":V\", \"*:E\" ];\n\t\tvar args = [\"dlog\", project.app.file + \":V\", \"*:F\"];\n\n\t\tSystem.runCommand(\"\", Path.combine(sdkDirectory, \"tools/sdb\"), [\"dlog\", \"-c\"]);\n\t\tSystem.runCommand(\"\", Path.combine(sdkDirectory, \"tools/sdb\"), args);\n\t\t// runCommand (project, \"\", \"native-debug\", [ \"-p\", project.meta.packageName ]);\n\t}\n}\n"
  },
  {
    "path": "src/lime/tools/WindowData.hx",
    "content": "package lime.tools;\n\n@:forward\nabstract WindowData({\n\t@:optional var width:Int;\n\t@:optional var height:Int;\n\t@:optional var x:Float;\n\t@:optional var y:Float;\n\t@:optional var background:Null<Int>;\n\t@:optional var parameters:String;\n\t@:optional var fps:Int;\n\t@:optional var hardware:Bool;\n\t@:optional var display:Int;\n\t@:optional var resizable:Bool;\n\t@:optional var borderless:Bool;\n\t@:optional var vsync:Bool;\n\t@:optional var fullscreen:Bool;\n\t@:optional var allowHighDPI:Bool;\n\t@:optional var alwaysOnTop:Bool;\n\t@:optional var antialiasing:Int;\n\t@:optional var orientation:Orientation;\n\t@:optional var allowShaders:Bool;\n\t@:optional var requireShaders:Bool;\n\t@:optional var depthBuffer:Bool;\n\t@:optional var stencilBuffer:Bool;\n\t@:optional var title:String;\n\t#if (js && html5)\n\t@:optional var element:js.html.Element;\n\t#end\n\t@:optional var colorDepth:Int;\n\t@:optional var minimized:Bool;\n\t@:optional var maximized:Bool;\n\t@:optional var hidden:Bool;\n}) from Dynamic\n{\n\t@:noCompletion\n\tpublic static var expectedFields:WindowData = {\n\t\twidth: 0,\n\t\theight: 0,\n\t\tx: 0.0,\n\t\ty: 0.0,\n\t\tbackground: 0,\n\t\tparameters: \"\",\n\t\tfps: 0,\n\t\thardware: false,\n\t\tdisplay: 0,\n\t\tresizable: false,\n\t\tborderless: false,\n\t\tvsync: false,\n\t\tfullscreen: false,\n\t\tallowHighDPI: false,\n\t\talwaysOnTop: false,\n\t\tantialiasing: 0,\n\t\torientation: Orientation.AUTO,\n\t\tallowShaders: false,\n\t\trequireShaders: false,\n\t\tdepthBuffer: false,\n\t\tstencilBuffer: false,\n\t\ttitle: \"\",\n\t\t#if (js && html5)\n\t\telement: null,\n\t\t#end\n\t\tcolorDepth: 0,\n\t\tminimized: false,\n\t\tmaximized: false,\n\t\thidden: false\n\t};\n}\n"
  },
  {
    "path": "src/lime/tools/XCodeHelper.hx",
    "content": "package lime.tools;\n\nimport hxp.*;\nimport lime.tools.HXProject;\n\nclass XCodeHelper\n{\n\t// different computers may have different sets of simulators installed\n\t// so there isn't necessarily a reasonable default for ipads\n\tprivate static var DEFAULT_IPAD_SIMULATOR_NAMES = [\n\t\t\"ipad\",\n\t\t\"ipad-air\"\n\t];\n\tprivate static var DEFAULT_IPAD_AIR_SIMULATOR_FALLBACK_REGEX = ~/ipad-air-.+/g;\n\tprivate static var DEFAULT_IPAD_SIMULATOR_FALLBACK_REGEX = ~/ipad-.+/g;\n\t// this should be a standard iPhone of a particular generation\n\tprivate static var DEFAULT_IPHONE_SIMULATOR_REGEX = ~/iphone-\\d+/g;\n\tprivate static var DEFAULT_IPHONE_SIMULATOR_FALLBACK_REGEX = ~/iphone-.+/g;\n\n\tprivate static function extractSimulatorFlagName(line:String):String\n\t{\n\t\tvar device = line.substring(0, line.indexOf(\"(\") - 1);\n\t\tdevice = device.toLowerCase();\n\t\tdevice = StringTools.replace(device, \" \", \"-\");\n\t\treturn device;\n\t}\n\n\tprivate static function extractSimulatorFullName(line:String):String\n\t{\n\t\tvar name = \"\";\n\n\t\tif (line.indexOf(\"inch\") > -1 || line.indexOf(\"generation\") > -1)\n\t\t{\n\t\t\tname = line.substring(0, line.indexOf(\")\") + 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tname = line.substring(0, line.indexOf(\"(\") - 1);\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tprivate static function extractSimulatorID(line:String):String\n\t{\n\t\tvar id = line.substring(line.indexOf(\"(\") + 1, line.indexOf(\")\"));\n\n\t\tif (id.indexOf(\"inch\") > -1 || id.indexOf(\"generation\") > -1)\n\t\t{\n\t\t\tvar startIndex = line.indexOf(\")\") + 2;\n\t\t\tid = line.substring(line.indexOf(\"(\", startIndex) + 1, line.indexOf(\")\", startIndex));\n\t\t}\n\n\t\treturn id;\n\t}\n\n\tpublic static function getSelectedSimulator(project:HXProject):SimulatorInfo\n\t{\n\t\tvar output = getSimulators();\n\t\tvar lines = output.split(\"\\n\");\n\t\tvar foundSection = false;\n\t\tvar device = \"\";\n\t\tvar deviceID = \"\";\n\t\tvar deviceName = \"\";\n\t\tvar devices = new Map<String, SimulatorInfo>();\n\t\tvar currentDevice:SimulatorInfo = null;\n\n\t\tfor (line in lines)\n\t\t{\n\t\t\tif (StringTools.startsWith(line, \"--\"))\n\t\t\t{\n\t\t\t\tif (line.indexOf(\"Unavailable\") > -1)\n\t\t\t\t{\n\t\t\t\t\tfoundSection = false;\n\t\t\t\t}\n\t\t\t\telse if (line.indexOf(\"iOS\") > -1)\n\t\t\t\t{\n\t\t\t\t\tfoundSection = true;\n\t\t\t\t}\n\t\t\t\telse if (foundSection)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (foundSection)\n\t\t\t{\n\t\t\t\tdeviceName = extractSimulatorFullName(StringTools.trim(line));\n\t\t\t\tdeviceID = extractSimulatorID(StringTools.trim(line));\n\t\t\t\tdevice = extractSimulatorFlagName(StringTools.trim(line));\n\t\t\t\tdevices.set(device, {id: deviceID, name: deviceName});\n\n\t\t\t\tif (project.targetFlags.exists(device))\n\t\t\t\t{\n\t\t\t\t\tcurrentDevice = devices.get(device);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (currentDevice == null)\n\t\t{\n\t\t\tif (project.targetFlags.exists(\"ipad\") || project.config.getString(\"ios.device\", \"universal\") == \"ipad\")\n\t\t\t{\n\t\t\t\tfor (device in DEFAULT_IPAD_SIMULATOR_NAMES)\n\t\t\t\t{\n\t\t\t\t\t// try to find a relatively standard ipad simulator\n\t\t\t\t\tcurrentDevice = devices.get(device);\n\t\t\t\t\tif (currentDevice != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// if we couldn't find one of the default names, let's try to\n\t\t\t\t// find any iPad Air, which should be a reasonable default\n\t\t\t\tif (currentDevice == null)\n\t\t\t\t{\n\t\t\t\t\tfor (device in devices.keys())\n\t\t\t\t\t{\n\t\t\t\t\t\tif (DEFAULT_IPAD_AIR_SIMULATOR_FALLBACK_REGEX.match(device))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrentDevice = devices.get(device);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// worst case, if we still haven't found a good name, choose the\n\t\t\t\t// first ipad that we find. it could be a mini or pro, which\n\t\t\t\t// might not necessarily be ideal, but it's better than nothing.\n\t\t\t\tif (currentDevice == null)\n\t\t\t\t{\n\t\t\t\t\tfor (device in devices.keys())\n\t\t\t\t\t{\n\t\t\t\t\t\tif (DEFAULT_IPAD_SIMULATOR_FALLBACK_REGEX.match(device))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrentDevice = devices.get(device);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (device in devices.keys())\n\t\t\t\t{\n\t\t\t\t\t// try to find a standard iphone, which should have an name\n\t\t\t\t\t// like iphone-15 or iphone-16\n\t\t\t\t\tif (DEFAULT_IPHONE_SIMULATOR_REGEX.match(device))\n\t\t\t\t\t{\n\t\t\t\t\t\tcurrentDevice = devices.get(device);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// of we can't find a standard iphone for some reason, choose\n\t\t\t\t// the first iphone- name that we find. it could be a plus, pro,\n\t\t\t\t// se, or something that might not necessarily be ideal, but\n\t\t\t\t// it's better than nothing at all.\n\t\t\t\tif (currentDevice == null)\n\t\t\t\t{\n\t\t\t\t\tfor (device in devices.keys())\n\t\t\t\t\t{\n\t\t\t\t\t\tif (DEFAULT_IPHONE_SIMULATOR_FALLBACK_REGEX.match(device))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrentDevice = devices.get(device);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn currentDevice;\n\t}\n\n\tpublic static function getSimulatorID(project:HXProject):String\n\t{\n\t\tvar simulator = getSelectedSimulator(project);\n\t\tif (simulator == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\treturn simulator.id;\n\t}\n\n\tpublic static function getSimulatorName(project:HXProject):String\n\t{\n\t\tvar simulator = getSelectedSimulator(project);\n\t\tif (simulator == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\treturn simulator.name;\n\t}\n\n\tprivate static function getSimulators():String\n\t{\n\t\treturn System.runProcess(\"\", \"xcrun\", [\"simctl\", \"list\", \"devices\"]);\n\t}\n}\n\nprivate typedef SimulatorInfo =\n{\n\tpublic var id:String;\n\tpublic var name:String;\n}\n"
  },
  {
    "path": "src/lime/ui/FileDialog.hx",
    "content": "package lime.ui;\n\nimport haxe.io.Bytes;\nimport haxe.io.Path;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Event;\nimport lime.graphics.Image;\nimport lime.system.CFFI;\nimport lime.system.ThreadPool;\nimport lime.utils.ArrayBuffer;\nimport lime.utils.Resource;\n#if hl\nimport hl.Bytes as HLBytes;\nimport hl.NativeArray;\n#end\n#if sys\nimport sys.FileSystem;\nimport sys.io.File;\n#end\n#if (js && html5)\nimport js.html.Blob;\n#end\n\n/**\n\tSimple file dialog used for asking user where to save a file, or select files to open.\n\n\tExample usage:\n\t```haxe\n\tvar fileDialog = new FileDialog();\n\n\tfileDialog.onCancel.add( () -> trace(\"Canceled.\") );\n\n\tfileDialog.onSave.add( path -> trace(\"File saved in \" + path) );\n\n\tfileDialog.onOpen.add( res -> trace(\"Size of the file = \" + (res:haxe.io.Bytes).length) );\n\n\tif ( fileDialog.open(\"jpg\", null, \"Load file\") )\n\t\ttrace(\"File dialog opened, waiting for selection...\");\n\telse\n\t\ttrace(\"This dialog is unsupported.\");\n\t```\n\n\tAvailability note: most file dialog operations are only available on desktop targets, though\n\t`save()` is also available in HTML5.\n**/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.graphics.Image)\nclass FileDialog\n{\n\t/**\n\t\tTriggers when the user clicks \"Cancel\" during any operation, or when a function is unsupported\n\t\t(such as `open()` on HTML5).\n\t**/\n\tpublic var onCancel = new Event<Void->Void>();\n\n\t/**\n\t\tTriggers when `open()` is successful. The `lime.utils.Resource` contains the file's data, and can\n\t\tbe implicitly cast to `haxe.io.Bytes`.\n\t**/\n\tpublic var onOpen = new Event<Resource->Void>();\n\n\t/**\n\t\tTriggers when `save()` is successful. The `String` is the path to the saved file.\n\t**/\n\tpublic var onSave = new Event<String->Void>();\n\n\t/**\n\t\tTriggers when `browse()` is successful and `type` is anything other than\n\t\t`FileDialogType.OPEN_MULTIPLE`. The `String` is the path to the selected file.\n\t**/\n\tpublic var onSelect = new Event<String->Void>();\n\n\t/**\n\t\tTriggers when `browse()` is successful and `type` is `FileDialogType.OPEN_MULTIPLE`. The\n\t\t`Array<String>` contains all selected file paths.\n\t**/\n\tpublic var onSelectMultiple = new Event<Array<String>->Void>();\n\n\tpublic function new() {}\n\n\t/**\n\t\tOpens a file selection dialog. If successful, either `onSelect` or `onSelectMultiple` will trigger\n\t\twith the result(s).\n\n\t\tThis function only works on desktop targets, and will return `false` otherwise.\n\t\t@param type \t\tType of the file dialog: `OPEN`, `SAVE`, `OPEN_DIRECTORY` or `OPEN_MULTIPLE`.\n\t\t@param filter \t\tA filter to use when browsing. Asterisks are treated as wildcards. For example,\n\t\t`\"*.jpg\"` will match any file ending in `.jpg`.\n\t\t@param defaultPath \tThe directory in which to start browsing and/or the default filename to\n\t\tsuggest. Defaults to `Sys.getCwd()`, with no default filename.\n\t\t@param title \t\tThe title to give the dialog window.\n\t\t@return Whether `browse()` is supported on this target.\n\t**/\n\tpublic function browse(type:FileDialogType = null, filter:String = null, defaultPath:String = null, title:String = null):Bool\n\t{\n\t\tif (type == null) type = FileDialogType.OPEN;\n\n\t\t#if sys\n\t\tif (defaultPath != null && defaultPath.length > 0\n\t\t\t&& FileSystem.exists(defaultPath)\n\t\t\t&& FileSystem.isDirectory(defaultPath))\n\t\t{\n\t\t\t// if the default path is a directory, and the default path doesn't\n\t\t\t// end with a separator, tiny file dialogs may open its parent\n\t\t\t// directory instead.\n\t\t\tvar lastChar = defaultPath.charAt(defaultPath.length - 1);\n\t\t\t#if windows\n\t\t\tif (lastChar != \"/\" && lastChar != \"\\\\\")\n\t\t\t{\n\t\t\t\tdefaultPath = defaultPath + \"\\\\\";\n\t\t\t}\n\t\t\t#else\n\t\t\tif (lastChar != \"/\")\n\t\t\t{\n\t\t\t\tdefaultPath = defaultPath + \"/\";\n\t\t\t}\n\t\t\t#end\n\t\t}\n\t\t#end\n\n\t\t#if desktop\n\t\tvar worker = new ThreadPool(#if windows SINGLE_THREADED #end);\n\n\t\tworker.onComplete.add(function(result)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase OPEN, OPEN_DIRECTORY, SAVE:\n\t\t\t\t\tvar path:String = cast result;\n\n\t\t\t\t\tif (path != null)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Makes sure the filename ends with extension\n\t\t\t\t\t\tif (type == SAVE && filter != null && path.indexOf(\".\") == -1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath += \".\" + filter;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect.dispatch(path);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tonCancel.dispatch();\n\t\t\t\t\t}\n\n\t\t\t\tcase OPEN_MULTIPLE:\n\t\t\t\t\tvar paths:Array<String> = cast result;\n\n\t\t\t\t\tif (paths != null && paths.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tonSelectMultiple.dispatch(paths);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tonCancel.dispatch();\n\t\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tworker.run(function(_, __)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase OPEN:\n\t\t\t\t\t#if linux\n\t\t\t\t\tif (title == null) title = \"Open File\";\n\t\t\t\t\t#end\n\n\t\t\t\t\tvar path = null;\n\t\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\t\ttrace(defaultPath);\n\t\t\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_file_dialog_open_file(title, filter, defaultPath));\n\t\t\t\t\t#end\n\n\t\t\t\t\tworker.sendComplete(path);\n\n\t\t\t\tcase OPEN_MULTIPLE:\n\t\t\t\t\t#if linux\n\t\t\t\t\tif (title == null) title = \"Open Files\";\n\t\t\t\t\t#end\n\n\t\t\t\t\tvar paths = null;\n\t\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\t\t#if hl\n\t\t\t\t\tvar bytes:NativeArray<HLBytes> = cast NativeCFFI.lime_file_dialog_open_files(title, filter, defaultPath);\n\t\t\t\t\tif (bytes != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tpaths = [];\n\t\t\t\t\t\tfor (i in 0...bytes.length)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpaths[i] = CFFI.stringValue(bytes[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t#else\n\t\t\t\t\tpaths = NativeCFFI.lime_file_dialog_open_files(title, filter, defaultPath);\n\t\t\t\t\t#end\n\t\t\t\t\t#end\n\n\t\t\t\t\tworker.sendComplete(paths);\n\n\t\t\t\tcase OPEN_DIRECTORY:\n\t\t\t\t\t#if linux\n\t\t\t\t\tif (title == null) title = \"Open Directory\";\n\t\t\t\t\t#end\n\n\t\t\t\t\tvar path = null;\n\t\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_file_dialog_open_directory(title, filter, defaultPath));\n\t\t\t\t\t#end\n\n\t\t\t\t\tworker.sendComplete(path);\n\n\t\t\t\tcase SAVE:\n\t\t\t\t\t#if linux\n\t\t\t\t\tif (title == null) title = \"Save File\";\n\t\t\t\t\t#end\n\n\t\t\t\t\tvar path = null;\n\t\t\t\t\t#if (!macro && lime_cffi)\n\t\t\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_file_dialog_save_file(title, filter, defaultPath));\n\t\t\t\t\t#end\n\n\t\t\t\t\tworker.sendComplete(path);\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t\t#else\n\t\tonCancel.dispatch();\n\t\treturn false;\n\t\t#end\n\t}\n\n\t/**\n\t\tShows an open file dialog. If successful, `onOpen` will trigger with the file contents.\n\n\t\tThis function only works on desktop targets, and will return `false` otherwise.\n\t\t@param filter \t\tA filter to use when browsing. Asterisks are treated as wildcards. For example,\n\t\t`\"*.jpg\"` will match any file ending in `.jpg`.\n\t\t@param defaultPath \tThe directory in which to start browsing and/or the default filename to\n\t\tsuggest. Defaults to `Sys.getCwd()`, with no default filename.\n\t\t@param title \t\tThe title to give the dialog window.\n\t\t@return Whether `open()` is supported on this target.\n\t**/\n\tpublic function open(filter:String = null, defaultPath:String = null, title:String = null):Bool\n\t{\n\t\t#if (desktop && sys)\n\t\tvar worker = new ThreadPool(#if windows SINGLE_THREADED #end);\n\n\t\tworker.onComplete.add(function(path:String)\n\t\t{\n\t\t\tif (path != null)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar data = File.getBytes(path);\n\t\t\t\t\tonOpen.dispatch(data);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t}\n\n\t\t\tonCancel.dispatch();\n\t\t});\n\n\t\tworker.run(function(_, __)\n\t\t{\n\t\t\t#if linux\n\t\t\tif (title == null) title = \"Open File\";\n\t\t\t#end\n\n\t\t\tvar path = null;\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_file_dialog_open_file(title, filter, defaultPath));\n\t\t\t#end\n\n\t\t\tworker.sendComplete(path);\n\t\t});\n\n\t\treturn true;\n\t\t#else\n\t\tonCancel.dispatch();\n\t\treturn false;\n\t\t#end\n\t}\n\n\t/**\n\t\tShows an open file dialog. If successful, `onSave` will trigger with the selected path.\n\n\t\tThis function only works on desktop and HMTL5 targets, and will return `false` otherwise.\n\t\t@param data \t\tThe file contents, in `haxe.io.Bytes` format. (Implicit casting possible.)\n\t\t@param filter \t\tA filter to use when browsing. Asterisks are treated as wildcards. For example,\n\t\t`\"*.jpg\"` will match any file ending in `.jpg`. Used only if targeting deskop.\n\t\t@param defaultPath \tThe directory in which to start browsing and/or the default filename to\n\t\tsuggest. When targeting destkop, this defaults to `Sys.getCwd()` with no default filename. When targeting\n\t\tHTML5, this defaults to the browser's download directory, with a default filename based on the MIME type.\n\t\t@param title \t\tThe title to give the dialog window.\n\t\t@param type \t\tThe default MIME type of the file, in case the type can't be determined from the\n\t\tfile data. Used only if targeting HTML5.\n\t\t@return Whether `save()` is supported on this target.\n\t**/\n\tpublic function save(data:Resource, filter:String = null, defaultPath:String = null, title:String = null, type:String = \"application/octet-stream\"):Bool\n\t{\n\t\tif (data == null)\n\t\t{\n\t\t\tonCancel.dispatch();\n\t\t\treturn false;\n\t\t}\n\n\t\t#if (desktop && sys)\n\t\tvar worker = new ThreadPool(#if windows SINGLE_THREADED #end);\n\n\t\tworker.onComplete.add(function(path:String)\n\t\t{\n\t\t\tif (path != null)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tFile.saveBytes(path, data);\n\t\t\t\t\tonSave.dispatch(path);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t}\n\n\t\t\tonCancel.dispatch();\n\t\t});\n\n\t\tworker.run(function(_, __)\n\t\t{\n\t\t\t#if linux\n\t\t\tif (title == null) title = \"Save File\";\n\t\t\t#end\n\n\t\t\tvar path = null;\n\t\t\t#if (!macro && lime_cffi)\n\t\t\tpath = CFFI.stringValue(NativeCFFI.lime_file_dialog_save_file(title, filter, defaultPath));\n\t\t\t#end\n\n\t\t\tworker.sendComplete(path);\n\t\t});\n\n\t\treturn true;\n\t\t#elseif (js && html5)\n\t\t// TODO: Cleaner API for mimeType detection\n\n\t\tvar defaultExtension = \"\";\n\n\t\tif (Image.__isPNG(data))\n\t\t{\n\t\t\ttype = \"image/png\";\n\t\t\tdefaultExtension = \".png\";\n\t\t}\n\t\telse if (Image.__isJPG(data))\n\t\t{\n\t\t\ttype = \"image/jpeg\";\n\t\t\tdefaultExtension = \".jpg\";\n\t\t}\n\t\telse if (Image.__isGIF(data))\n\t\t{\n\t\t\ttype = \"image/gif\";\n\t\t\tdefaultExtension = \".gif\";\n\t\t}\n\t\telse if (Image.__isWebP(data))\n\t\t{\n\t\t\ttype = \"image/webp\";\n\t\t\tdefaultExtension = \".webp\";\n\t\t}\n\n\t\tvar path = defaultPath != null ? Path.withoutDirectory(defaultPath) : \"download\" + defaultExtension;\n\t\tvar buffer = (data : Bytes).getData();\n\t\tbuffer = buffer.slice(0, (data : Bytes).length);\n\n\t\t#if commonjs\n\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"require ('file-saver')\")(new Blob([buffer], {type: type}), path, true);\n\t\t#else\n\t\tuntyped window.saveAs(new Blob([buffer], {type: type}), path, true);\n\t\t#end\n\t\tonSave.dispatch(path);\n\t\treturn true;\n\t\t#else\n\t\tonCancel.dispatch();\n\t\treturn false;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/FileDialogType.hx",
    "content": "package lime.ui;\n\nenum FileDialogType\n{\n\tOPEN;\n\tOPEN_MULTIPLE;\n\tSAVE;\n\tOPEN_DIRECTORY;\n}\n"
  },
  {
    "path": "src/lime/ui/Gamepad.hx",
    "content": "package lime.ui;\n\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Event;\nimport lime.system.CFFI;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.ui.Joystick)\nclass Gamepad\n{\n\tpublic static var devices = new Map<Int, Gamepad>();\n\tpublic static var onConnect = new Event<Gamepad->Void>();\n\n\tpublic var connected(default, null):Bool;\n\tpublic var guid(get, never):String;\n\tpublic var id(default, null):Int;\n\tpublic var name(get, never):String;\n\tpublic var onAxisMove = new Event<GamepadAxis->Float->Void>();\n\tpublic var onButtonDown = new Event<GamepadButton->Void>();\n\tpublic var onButtonUp = new Event<GamepadButton->Void>();\n\tpublic var onDisconnect = new Event<Void->Void>();\n\n\t#if (js && html5)\n\tprivate var __jsGamepad:js.html.Gamepad;\n\t#end\n\n\tpublic function new(id:Int)\n\t{\n\t\tthis.id = id;\n\t\tconnected = true;\n\n\t\t#if (js && html5)\n\t\tvar devices = Joystick.__getDeviceData();\n\t\t__jsGamepad = devices[this.id];\n\t\t#end\n\t}\n\n\tpublic static function addMappings(mappings:Array<String>):Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\t#if hl\n\t\tvar _mappings = new hl.NativeArray<String>(mappings.length);\n\t\tfor (i in 0...mappings.length)\n\t\t\t_mappings[i] = mappings[i];\n\t\tvar mappings = _mappings;\n\t\t#end\n\t\tNativeCFFI.lime_gamepad_add_mappings(mappings);\n\t\t#end\n\t}\n\n\t/**\n\t\t@param\tlowFrequencyRumble\tThe intensity of the low frequency (strong)\n\t\trumble motor, from 0 to 1.\n\t\t@param\thighFrequencyRumble\tThe intensity of the high frequency (weak)\n\t\trumble motor, from 0 to 1. Will be ignored in situations where only one\n\t\tmotor is available.\n\t\t@param\tduration\tThe duration of the rumble effect, in milliseconds.\n\t**/\n\tpublic inline function rumble(lowFrequencyRumble:Float, highFrequencyRumble:Float, duration:Int):Void\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tNativeCFFI.lime_gamepad_rumble(this.id, lowFrequencyRumble, highFrequencyRumble, duration);\n\t\t#elseif (js && html5)\n\t\tvar actuator:Dynamic = (untyped __jsGamepad.vibrationActuator) ? untyped __jsGamepad.vibrationActuator\n\t\t\t: (untyped __jsGamepad.hapticActuators) ? untyped __jsGamepad.hapticActuators[0]\n\t\t\t: null;\n\t\tif (actuator == null) return;\n\n\t\tif (untyped actuator.playEffect)\n\t\t{\n\t\t\tuntyped actuator.playEffect(\"dual-rumble\", {\n\t\t\t\tduration: duration,\n\t\t\t\tstrongMagnitude: lowFrequencyRumble,\n\t\t\t\tweakMagnitude: highFrequencyRumble\n\t\t\t});\n\t\t}\n\t\telse if (untyped actuator.pulse)\n\t\t{\n\t\t\tuntyped actuator.pulse(lowFrequencyRumble, duration);\n\t\t}\n\t\t#else\n\t\treturn;\n\t\t#end\n\t}\n\n\t@:noCompletion private static function __connect(id:Int):Void\n\t{\n\t\tif (!devices.exists(id))\n\t\t{\n\t\t\tvar gamepad = new Gamepad(id);\n\t\t\tdevices.set(id, gamepad);\n\t\t\tonConnect.dispatch(gamepad);\n\t\t}\n\t}\n\n\t@:noCompletion private static function __disconnect(id:Int):Void\n\t{\n\t\tvar gamepad = devices.get(id);\n\t\tif (gamepad != null) gamepad.connected = false;\n\t\tdevices.remove(id);\n\t\tif (gamepad != null) gamepad.onDisconnect.dispatch();\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_guid():String\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn CFFI.stringValue(NativeCFFI.lime_gamepad_get_device_guid(this.id));\n\t\t#elseif (js && html5)\n\t\treturn __jsGamepad.id;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_name():String\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn CFFI.stringValue(NativeCFFI.lime_gamepad_get_device_name(this.id));\n\t\t#elseif (js && html5)\n\t\treturn __jsGamepad.id;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/GamepadAxis.hx",
    "content": "package lime.ui;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract GamepadAxis(Int) from Int to Int from UInt to UInt\n{\n\tvar LEFT_X = 0;\n\tvar LEFT_Y = 1;\n\tvar RIGHT_X = 2;\n\tvar RIGHT_Y = 3;\n\tvar TRIGGER_LEFT = 4;\n\tvar TRIGGER_RIGHT = 5;\n\n\tpublic inline function toString():String\n\t{\n\t\treturn switch (this)\n\t\t{\n\t\t\tcase LEFT_X: \"LEFT_X\";\n\t\t\tcase LEFT_Y: \"LEFT_Y\";\n\t\t\tcase RIGHT_X: \"RIGHT_X\";\n\t\t\tcase RIGHT_Y: \"RIGHT_Y\";\n\t\t\tcase TRIGGER_LEFT: \"TRIGGER_LEFT\";\n\t\t\tcase TRIGGER_RIGHT: \"TRIGGER_RIGHT\";\n\t\t\tdefault: \"UNKNOWN (\" + this + \")\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/GamepadButton.hx",
    "content": "package lime.ui;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract GamepadButton(Int) from Int to Int from UInt to UInt\n{\n\tvar A = 0;\n\tvar B = 1;\n\tvar X = 2;\n\tvar Y = 3;\n\tvar BACK = 4;\n\tvar GUIDE = 5;\n\tvar START = 6;\n\tvar LEFT_STICK = 7;\n\tvar RIGHT_STICK = 8;\n\tvar LEFT_SHOULDER = 9;\n\tvar RIGHT_SHOULDER = 10;\n\tvar DPAD_UP = 11;\n\tvar DPAD_DOWN = 12;\n\tvar DPAD_LEFT = 13;\n\tvar DPAD_RIGHT = 14;\n\n\tpublic inline function toString():String\n\t{\n\t\treturn switch (this)\n\t\t{\n\t\t\tcase A: \"A\";\n\t\t\tcase B: \"B\";\n\t\t\tcase X: \"X\";\n\t\t\tcase Y: \"Y\";\n\t\t\tcase BACK: \"BACK\";\n\t\t\tcase GUIDE: \"GUIDE\";\n\t\t\tcase START: \"START\";\n\t\t\tcase LEFT_STICK: \"LEFT_STICK\";\n\t\t\tcase RIGHT_STICK: \"RIGHT_STICK\";\n\t\t\tcase LEFT_SHOULDER: \"LEFT_SHOULDER\";\n\t\t\tcase RIGHT_SHOULDER: \"RIGHT_SHOULDER\";\n\t\t\tcase DPAD_UP: \"DPAD_UP\";\n\t\t\tcase DPAD_DOWN: \"DPAD_DOWN\";\n\t\t\tcase DPAD_LEFT: \"DPAD_LEFT\";\n\t\t\tcase DPAD_RIGHT: \"DPAD_RIGHT\";\n\t\t\tdefault: \"UNKNOWN (\" + this + \")\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/Haptic.hx",
    "content": "package lime.ui;\n\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.system.JNI;\nimport lime.utils.Log;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass Haptic\n{\n\t#if android\n\tprivate static var lime_haptic_vibrate:Int->Int->Void;\n\t#end\n\n\tpublic static function vibrate(period:Int, duration:Int):Void\n\t{\n\t\t#if android\n\t\tif (lime_haptic_vibrate == null)\n\t\t{\n\t\t\tlime_haptic_vibrate = JNI.createStaticMethod(\"org/haxe/lime/GameActivity\", \"vibrate\", \"(II)V\");\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tlime_haptic_vibrate(period, duration);\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\tLog.warn(\"Haptic.vibrate is not available (the VIBRATE permission may be missing)\");\n\t\t}\n\t\t#elseif (js && html5)\n\t\tvar pattern = [];\n\n\t\tif (period == 0)\n\t\t{\n\t\t\tpattern = [duration];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar periodMS = Std.int(Math.ceil(period / 2));\n\t\t\tvar count = Std.int(Math.ceil((duration / period) * 2));\n\t\t\tpattern = [0]; // w3c spec says to vibrate on even elements of the pattern and android waits on even elements. This line makes the Navigator.vibrate match android behavior. https://w3c.github.io/vibration/ vs https://developer.android.com/reference/android/os/Vibrator.html#vibrate(long[],%20int)\n\n\t\t\tfor (i in 0...count)\n\t\t\t{\n\t\t\t\tpattern.push(periodMS);\n\t\t\t}\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tif (!js.Browser.navigator.vibrate(pattern))\n\t\t\t{\n\t\t\t\tLog.verbose(\"Navigator.vibrate() returned false.\");\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\tLog.verbose(\"Navigator.vibrate() threw an error (it might be Internet Explorer or Edge not supporting the feature)\");\n\t\t}\n\t\t#elseif (lime_cffi && !macro)\n\t\tNativeCFFI.lime_haptic_vibrate(period, duration);\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/Joystick.hx",
    "content": "package lime.ui;\n\nimport lime._internal.backend.native.NativeCFFI;\nimport lime.app.Event;\nimport lime.system.CFFI;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime._internal.backend.native.NativeCFFI)\nclass Joystick\n{\n\tpublic static var devices = new Map<Int, Joystick>();\n\tpublic static var onConnect = new Event<Joystick->Void>();\n\n\tpublic var connected(default, null):Bool;\n\tpublic var guid(get, never):String;\n\tpublic var id(default, null):Int;\n\tpublic var name(get, never):String;\n\tpublic var numAxes(get, never):Int;\n\tpublic var numButtons(get, never):Int;\n\tpublic var numHats(get, never):Int;\n\tpublic var onAxisMove = new Event<Int->Float->Void>();\n\tpublic var onButtonDown = new Event<Int->Void>();\n\tpublic var onButtonUp = new Event<Int->Void>();\n\tpublic var onDisconnect = new Event<Void->Void>();\n\tpublic var onHatMove = new Event<Int->JoystickHatPosition->Void>();\n\n\tpublic function new(id:Int)\n\t{\n\t\tthis.id = id;\n\t\tconnected = true;\n\t}\n\n\t@:noCompletion private static function __connect(id:Int):Void\n\t{\n\t\tif (!devices.exists(id))\n\t\t{\n\t\t\tvar joystick = new Joystick(id);\n\t\t\tdevices.set(id, joystick);\n\t\t\tonConnect.dispatch(joystick);\n\t\t}\n\t}\n\n\t@:noCompletion private static function __disconnect(id:Int):Void\n\t{\n\t\tvar joystick = devices.get(id);\n\t\tif (joystick != null) joystick.connected = false;\n\t\tdevices.remove(id);\n\t\tif (joystick != null) joystick.onDisconnect.dispatch();\n\t}\n\n\t#if (js && html5)\n\t@:noCompletion private static function __getDeviceData():Array<js.html.Gamepad>\n\t{\n\t\tvar res:Array<js.html.Gamepad> = null;\n\n\t\ttry\n\t\t{\n\t\t\tres = (untyped navigator.getGamepads) ? untyped navigator.getGamepads() : (untyped navigator.webkitGetGamepads) ? untyped navigator.webkitGetGamepads() : null;\n\t\t}\n\t\tcatch (err:Dynamic)\n\t\t{\n\t\t\t// if something went wrong, treat it the same as when navigator.getGamepads doesn't exist\n\t\t\t// we probably don't have permission to use this feature\n\t\t}\n\n\t\treturn res;\n\t}\n\t#end\n\n\t// Get & Set Methods\n\t@:noCompletion private inline function get_guid():String\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn CFFI.stringValue(NativeCFFI.lime_joystick_get_device_guid(this.id));\n\t\t#elseif (js && html5)\n\t\tvar devices = __getDeviceData();\n\t\treturn devices[this.id].id;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_name():String\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn CFFI.stringValue(NativeCFFI.lime_joystick_get_device_name(this.id));\n\t\t#elseif (js && html5)\n\t\tvar devices = __getDeviceData();\n\t\treturn devices[this.id].id;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_numAxes():Int\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_joystick_get_num_axes(this.id);\n\t\t#elseif (js && html5)\n\t\tvar devices = __getDeviceData();\n\t\treturn devices[this.id].axes.length;\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_numButtons():Int\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_joystick_get_num_buttons(this.id);\n\t\t#elseif (js && html5)\n\t\tvar devices = __getDeviceData();\n\t\treturn devices[this.id].buttons.length;\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion private inline function get_numHats():Int\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn NativeCFFI.lime_joystick_get_num_hats(this.id);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/JoystickHatPosition.hx",
    "content": "package lime.ui;\n\nabstract JoystickHatPosition(Int) from Int to Int from UInt to UInt\n{\n\tpublic static inline var CENTER:JoystickHatPosition = 0x00;\n\tpublic static inline var DOWN:JoystickHatPosition = 0x04;\n\tpublic static inline var LEFT:JoystickHatPosition = 0x08;\n\tpublic static inline var RIGHT:JoystickHatPosition = 0x02;\n\tpublic static inline var UP:JoystickHatPosition = 0x01;\n\tpublic static inline var DOWN_LEFT:JoystickHatPosition = (0x04 | 0x08);\n\tpublic static inline var DOWN_RIGHT:JoystickHatPosition = (0x04 | 0x02);\n\tpublic static inline var UP_LEFT:JoystickHatPosition = (0x01 | 0x08);\n\tpublic static inline var UP_RIGHT:JoystickHatPosition = (0x01 | 0x02);\n\n\tpublic var center(get, set):Bool;\n\tpublic var down(get, set):Bool;\n\tpublic var left(get, set):Bool;\n\tpublic var right(get, set):Bool;\n\tpublic var up(get, set):Bool;\n\n\tpublic function new(value:Int)\n\t{\n\t\tthis = value;\n\t}\n\n\t@:noCompletion private function get_center():Bool\n\t{\n\t\treturn (this == 0);\n\t}\n\n\t@:noCompletion private inline function set_center(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis = 0;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_down():Bool\n\t{\n\t\treturn (this & DOWN > 0);\n\t}\n\n\t@:noCompletion private inline function set_down(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= DOWN;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - DOWN;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_left():Bool\n\t{\n\t\treturn (this & LEFT > 0);\n\t}\n\n\t@:noCompletion private inline function set_left(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= LEFT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - LEFT;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_right():Bool\n\t{\n\t\treturn (this & RIGHT > 0);\n\t}\n\n\t@:noCompletion private inline function set_right(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= RIGHT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - RIGHT;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_up():Bool\n\t{\n\t\treturn (this & UP > 0);\n\t}\n\n\t@:noCompletion private inline function set_up(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= UP;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - UP;\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/KeyCode.hx",
    "content": "package lime.ui;\n\nimport lime._internal.backend.native.NativeCFFI;\n\n/**\n\tUsed by keyboard event listeners to identify which key was pressed\n\tdown or released.\n\n\t@see `lime.ui.Window.onKeyDown`\n\t@see `lime.ui.Window.onKeyUp`\n\t@see `lime.ui.ScanCode`\n**/\n@:access(lime._internal.backend.native.NativeCFFI)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract KeyCode(Int) from Int to Int from UInt to UInt\n{\n\tvar UNKNOWN = 0x00;\n\tvar BACKSPACE = 0x08;\n\tvar TAB = 0x09;\n\tvar RETURN = 0x0D;\n\tvar ESCAPE = 0x1B;\n\tvar SPACE = 0x20;\n\tvar EXCLAMATION = 0x21;\n\tvar QUOTE = 0x22;\n\tvar HASH = 0x23;\n\tvar DOLLAR = 0x24;\n\tvar PERCENT = 0x25;\n\tvar AMPERSAND = 0x26;\n\tvar SINGLE_QUOTE = 0x27;\n\tvar LEFT_PARENTHESIS = 0x28;\n\tvar RIGHT_PARENTHESIS = 0x29;\n\tvar ASTERISK = 0x2A;\n\tvar PLUS = 0x2B;\n\tvar COMMA = 0x2C;\n\tvar MINUS = 0x2D;\n\tvar PERIOD = 0x2E;\n\tvar SLASH = 0x2F;\n\tvar NUMBER_0 = 0x30;\n\tvar NUMBER_1 = 0x31;\n\tvar NUMBER_2 = 0x32;\n\tvar NUMBER_3 = 0x33;\n\tvar NUMBER_4 = 0x34;\n\tvar NUMBER_5 = 0x35;\n\tvar NUMBER_6 = 0x36;\n\tvar NUMBER_7 = 0x37;\n\tvar NUMBER_8 = 0x38;\n\tvar NUMBER_9 = 0x39;\n\tvar COLON = 0x3A;\n\tvar SEMICOLON = 0x3B;\n\tvar LESS_THAN = 0x3C;\n\tvar EQUALS = 0x3D;\n\tvar GREATER_THAN = 0x3E;\n\tvar QUESTION = 0x3F;\n\tvar AT = 0x40;\n\tvar LEFT_BRACKET = 0x5B;\n\tvar BACKSLASH = 0x5C;\n\tvar RIGHT_BRACKET = 0x5D;\n\tvar CARET = 0x5E;\n\tvar UNDERSCORE = 0x5F;\n\tvar GRAVE = 0x60;\n\tvar A = 0x61;\n\tvar B = 0x62;\n\tvar C = 0x63;\n\tvar D = 0x64;\n\tvar E = 0x65;\n\tvar F = 0x66;\n\tvar G = 0x67;\n\tvar H = 0x68;\n\tvar I = 0x69;\n\tvar J = 0x6A;\n\tvar K = 0x6B;\n\tvar L = 0x6C;\n\tvar M = 0x6D;\n\tvar N = 0x6E;\n\tvar O = 0x6F;\n\tvar P = 0x70;\n\tvar Q = 0x71;\n\tvar R = 0x72;\n\tvar S = 0x73;\n\tvar T = 0x74;\n\tvar U = 0x75;\n\tvar V = 0x76;\n\tvar W = 0x77;\n\tvar X = 0x78;\n\tvar Y = 0x79;\n\tvar Z = 0x7A;\n\tvar DELETE = 0x7F;\n\tvar CAPS_LOCK = 0x40000039;\n\tvar F1 = 0x4000003A;\n\tvar F2 = 0x4000003B;\n\tvar F3 = 0x4000003C;\n\tvar F4 = 0x4000003D;\n\tvar F5 = 0x4000003E;\n\tvar F6 = 0x4000003F;\n\tvar F7 = 0x40000040;\n\tvar F8 = 0x40000041;\n\tvar F9 = 0x40000042;\n\tvar F10 = 0x40000043;\n\tvar F11 = 0x40000044;\n\tvar F12 = 0x40000045;\n\tvar PRINT_SCREEN = 0x40000046;\n\tvar SCROLL_LOCK = 0x40000047;\n\tvar PAUSE = 0x40000048;\n\tvar INSERT = 0x40000049;\n\tvar HOME = 0x4000004A;\n\tvar PAGE_UP = 0x4000004B;\n\tvar END = 0x4000004D;\n\tvar PAGE_DOWN = 0x4000004E;\n\tvar RIGHT = 0x4000004F;\n\tvar LEFT = 0x40000050;\n\tvar DOWN = 0x40000051;\n\tvar UP = 0x40000052;\n\tvar NUM_LOCK = 0x40000053;\n\tvar NUMPAD_DIVIDE = 0x40000054;\n\tvar NUMPAD_MULTIPLY = 0x40000055;\n\tvar NUMPAD_MINUS = 0x40000056;\n\tvar NUMPAD_PLUS = 0x40000057;\n\tvar NUMPAD_ENTER = 0x40000058;\n\tvar NUMPAD_1 = 0x40000059;\n\tvar NUMPAD_2 = 0x4000005A;\n\tvar NUMPAD_3 = 0x4000005B;\n\tvar NUMPAD_4 = 0x4000005C;\n\tvar NUMPAD_5 = 0x4000005D;\n\tvar NUMPAD_6 = 0x4000005E;\n\tvar NUMPAD_7 = 0x4000005F;\n\tvar NUMPAD_8 = 0x40000060;\n\tvar NUMPAD_9 = 0x40000061;\n\tvar NUMPAD_0 = 0x40000062;\n\tvar NUMPAD_PERIOD = 0x40000063;\n\tvar APPLICATION = 0x40000065;\n\tvar POWER = 0x40000066;\n\tvar NUMPAD_EQUALS = 0x40000067;\n\tvar F13 = 0x40000068;\n\tvar F14 = 0x40000069;\n\tvar F15 = 0x4000006A;\n\tvar F16 = 0x4000006B;\n\tvar F17 = 0x4000006C;\n\tvar F18 = 0x4000006D;\n\tvar F19 = 0x4000006E;\n\tvar F20 = 0x4000006F;\n\tvar F21 = 0x40000070;\n\tvar F22 = 0x40000071;\n\tvar F23 = 0x40000072;\n\tvar F24 = 0x40000073;\n\tvar EXECUTE = 0x40000074;\n\tvar HELP = 0x40000075;\n\tvar MENU = 0x40000076;\n\tvar SELECT = 0x40000077;\n\tvar STOP = 0x40000078;\n\tvar AGAIN = 0x40000079;\n\tvar UNDO = 0x4000007A;\n\tvar CUT = 0x4000007B;\n\tvar COPY = 0x4000007C;\n\tvar PASTE = 0x4000007D;\n\tvar FIND = 0x4000007E;\n\tvar MUTE = 0x4000007F;\n\tvar VOLUME_UP = 0x40000080;\n\tvar VOLUME_DOWN = 0x40000081;\n\tvar NUMPAD_COMMA = 0x40000085;\n\t// var NUMPAD_EQUALS_AS400 = 0x40000086;\n\tvar ALT_ERASE = 0x40000099;\n\tvar SYSTEM_REQUEST = 0x4000009A;\n\tvar CANCEL = 0x4000009B;\n\tvar CLEAR = 0x4000009C;\n\tvar PRIOR = 0x4000009D;\n\tvar RETURN2 = 0x4000009E;\n\tvar SEPARATOR = 0x4000009F;\n\tvar OUT = 0x400000A0;\n\tvar OPER = 0x400000A1;\n\tvar CLEAR_AGAIN = 0x400000A2;\n\tvar CRSEL = 0x400000A3;\n\tvar EXSEL = 0x400000A4;\n\tvar NUMPAD_00 = 0x400000B0;\n\tvar NUMPAD_000 = 0x400000B1;\n\tvar THOUSAND_SEPARATOR = 0x400000B2;\n\tvar DECIMAL_SEPARATOR = 0x400000B3;\n\tvar CURRENCY_UNIT = 0x400000B4;\n\tvar CURRENCY_SUBUNIT = 0x400000B5;\n\tvar NUMPAD_LEFT_PARENTHESIS = 0x400000B6;\n\tvar NUMPAD_RIGHT_PARENTHESIS = 0x400000B7;\n\tvar NUMPAD_LEFT_BRACE = 0x400000B8;\n\tvar NUMPAD_RIGHT_BRACE = 0x400000B9;\n\tvar NUMPAD_TAB = 0x400000BA;\n\tvar NUMPAD_BACKSPACE = 0x400000BB;\n\tvar NUMPAD_A = 0x400000BC;\n\tvar NUMPAD_B = 0x400000BD;\n\tvar NUMPAD_C = 0x400000BE;\n\tvar NUMPAD_D = 0x400000BF;\n\tvar NUMPAD_E = 0x400000C0;\n\tvar NUMPAD_F = 0x400000C1;\n\tvar NUMPAD_XOR = 0x400000C2;\n\tvar NUMPAD_POWER = 0x400000C3;\n\tvar NUMPAD_PERCENT = 0x400000C4;\n\tvar NUMPAD_LESS_THAN = 0x400000C5;\n\tvar NUMPAD_GREATER_THAN = 0x400000C6;\n\tvar NUMPAD_AMPERSAND = 0x400000C7;\n\tvar NUMPAD_DOUBLE_AMPERSAND = 0x400000C8;\n\tvar NUMPAD_VERTICAL_BAR = 0x400000C9;\n\tvar NUMPAD_DOUBLE_VERTICAL_BAR = 0x400000CA;\n\tvar NUMPAD_COLON = 0x400000CB;\n\tvar NUMPAD_HASH = 0x400000CC;\n\tvar NUMPAD_SPACE = 0x400000CD;\n\tvar NUMPAD_AT = 0x400000CE;\n\tvar NUMPAD_EXCLAMATION = 0x400000CF;\n\tvar NUMPAD_MEM_STORE = 0x400000D0;\n\tvar NUMPAD_MEM_RECALL = 0x400000D1;\n\tvar NUMPAD_MEM_CLEAR = 0x400000D2;\n\tvar NUMPAD_MEM_ADD = 0x400000D3;\n\tvar NUMPAD_MEM_SUBTRACT = 0x400000D4;\n\tvar NUMPAD_MEM_MULTIPLY = 0x400000D5;\n\tvar NUMPAD_MEM_DIVIDE = 0x400000D6;\n\tvar NUMPAD_PLUS_MINUS = 0x400000D7;\n\tvar NUMPAD_CLEAR = 0x400000D8;\n\tvar NUMPAD_CLEAR_ENTRY = 0x400000D9;\n\tvar NUMPAD_BINARY = 0x400000DA;\n\tvar NUMPAD_OCTAL = 0x400000DB;\n\tvar NUMPAD_DECIMAL = 0x400000DC;\n\tvar NUMPAD_HEXADECIMAL = 0x400000DD;\n\tvar LEFT_CTRL = 0x400000E0;\n\tvar LEFT_SHIFT = 0x400000E1;\n\tvar LEFT_ALT = 0x400000E2;\n\tvar LEFT_META = 0x400000E3;\n\tvar RIGHT_CTRL = 0x400000E4;\n\tvar RIGHT_SHIFT = 0x400000E5;\n\tvar RIGHT_ALT = 0x400000E6;\n\tvar RIGHT_META = 0x400000E7;\n\tvar MODE = 0x40000101;\n\tvar AUDIO_NEXT = 0x40000102;\n\tvar AUDIO_PREVIOUS = 0x40000103;\n\tvar AUDIO_STOP = 0x40000104;\n\tvar AUDIO_PLAY = 0x40000105;\n\tvar AUDIO_MUTE = 0x40000106;\n\tvar MEDIA_SELECT = 0x40000107;\n\tvar WWW = 0x40000108;\n\tvar MAIL = 0x40000109;\n\tvar CALCULATOR = 0x4000010A;\n\tvar COMPUTER = 0x4000010B;\n\tvar APP_CONTROL_SEARCH = 0x4000010C;\n\tvar APP_CONTROL_HOME = 0x4000010D;\n\tvar APP_CONTROL_BACK = 0x4000010E;\n\tvar APP_CONTROL_FORWARD = 0x4000010F;\n\tvar APP_CONTROL_STOP = 0x40000110;\n\tvar APP_CONTROL_REFRESH = 0x40000111;\n\tvar APP_CONTROL_BOOKMARKS = 0x40000112;\n\tvar BRIGHTNESS_DOWN = 0x40000113;\n\tvar BRIGHTNESS_UP = 0x40000114;\n\tvar DISPLAY_SWITCH = 0x40000115;\n\tvar BACKLIGHT_TOGGLE = 0x40000116;\n\tvar BACKLIGHT_DOWN = 0x40000117;\n\tvar BACKLIGHT_UP = 0x40000118;\n\tvar EJECT = 0x40000119;\n\tvar SLEEP = 0x4000011A;\n\n\t@:from public static function fromScanCode(scanCode:ScanCode):KeyCode\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar code:Int = scanCode;\n\t\treturn NativeCFFI.lime_key_code_from_scan_code(code);\n\t\t#else\n\t\treturn KeyCode.UNKNOWN;\n\t\t#end\n\t}\n\n\tprivate static function toScanCode(keyCode:KeyCode):ScanCode\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar code:Int = keyCode;\n\t\treturn NativeCFFI.lime_key_code_to_scan_code(code);\n\t\t#else\n\t\treturn ScanCode.UNKNOWN;\n\t\t#end\n\t}\n\n\t@:op(A > B) private static inline function gt(a:KeyCode, b:KeyCode):Bool\n\t{\n\t\treturn (a : Int) > (b : Int);\n\t}\n\n\t@:op(A >= B) private static inline function gte(a:KeyCode, b:KeyCode):Bool\n\t{\n\t\treturn (a : Int) >= (b : Int);\n\t}\n\n\t@:op(A < B) private static inline function lt(a:KeyCode, b:KeyCode):Bool\n\t{\n\t\treturn (a : Int) < (b : Int);\n\t}\n\n\t@:op(A <= B) private static inline function lte(a:KeyCode, b:KeyCode):Bool\n\t{\n\t\treturn (a : Int) <= (b : Int);\n\t}\n\n\t@:op(A + B) private static inline function plus(a:KeyCode, b:Int):KeyCode\n\t{\n\t\treturn (a : Int) + b;\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/KeyModifier.hx",
    "content": "package lime.ui;\n\nabstract KeyModifier(Int) from Int to Int from UInt to UInt\n{\n\tpublic static inline var NONE:KeyModifier = 0x0000;\n\tpublic static inline var LEFT_SHIFT:KeyModifier = 0x0001;\n\tpublic static inline var RIGHT_SHIFT:KeyModifier = 0x0002;\n\tpublic static inline var LEFT_CTRL:KeyModifier = 0x0040;\n\tpublic static inline var RIGHT_CTRL:KeyModifier = 0x0080;\n\tpublic static inline var LEFT_ALT:KeyModifier = 0x0100;\n\tpublic static inline var RIGHT_ALT:KeyModifier = 0x0200;\n\tpublic static inline var LEFT_META:KeyModifier = 0x0400;\n\tpublic static inline var RIGHT_META:KeyModifier = 0x0800;\n\tpublic static inline var NUM_LOCK:KeyModifier = 0x1000;\n\tpublic static inline var CAPS_LOCK:KeyModifier = 0x2000;\n\tpublic static inline var MODE:KeyModifier = 0x4000;\n\tpublic static inline var CTRL:KeyModifier = (0x0040 | 0x0080);\n\tpublic static inline var SHIFT:KeyModifier = (0x001 | 0x0002);\n\tpublic static inline var ALT:KeyModifier = (0x0100 | 0x0200);\n\tpublic static inline var META:KeyModifier = (0x0400 | 0x0800);\n\n\tpublic var altKey(get, set):Bool;\n\tpublic var capsLock(get, set):Bool;\n\tpublic var ctrlKey(get, set):Bool;\n\tpublic var metaKey(get, set):Bool;\n\tpublic var numLock(get, set):Bool;\n\tpublic var shiftKey(get, set):Bool;\n\n\t@:noCompletion private function get_altKey():Bool\n\t{\n\t\treturn (this & LEFT_ALT > 0) || (this & RIGHT_ALT > 0);\n\t}\n\n\t@:noCompletion private inline function set_altKey(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= ALT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - ALT;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_capsLock():Bool\n\t{\n\t\treturn (this & CAPS_LOCK > 0) || (this & CAPS_LOCK > 0);\n\t}\n\n\t@:noCompletion private inline function set_capsLock(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= CAPS_LOCK;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - CAPS_LOCK;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_ctrlKey():Bool\n\t{\n\t\treturn (this & LEFT_CTRL > 0) || (this & RIGHT_CTRL > 0);\n\t}\n\n\t@:noCompletion private inline function set_ctrlKey(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= CTRL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - CTRL;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_metaKey():Bool\n\t{\n\t\treturn (this & LEFT_META > 0) || (this & RIGHT_META > 0);\n\t}\n\n\t@:noCompletion private inline function set_metaKey(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= META;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - META;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_numLock():Bool\n\t{\n\t\treturn (this & NUM_LOCK > 0) || (this & NUM_LOCK > 0);\n\t}\n\n\t@:noCompletion private inline function set_numLock(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= NUM_LOCK;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - NUM_LOCK;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_shiftKey():Bool\n\t{\n\t\treturn (this & LEFT_SHIFT > 0) || (this & RIGHT_SHIFT > 0);\n\t}\n\n\t@:noCompletion private inline function set_shiftKey(value:Bool):Bool\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tthis |= SHIFT;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis &= 0xFFFFFFF - SHIFT;\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/MouseButton.hx",
    "content": "package lime.ui;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract MouseButton(Int) from Int to Int\n{\n\tvar LEFT = 0;\n\tvar MIDDLE = 1;\n\tvar RIGHT = 2;\n}\n"
  },
  {
    "path": "src/lime/ui/MouseCursor.hx",
    "content": "package lime.ui;\n\nenum MouseCursor\n{\n\tARROW;\n\tCROSSHAIR;\n\tDEFAULT;\n\tMOVE;\n\tPOINTER;\n\tRESIZE_NESW;\n\tRESIZE_NS;\n\tRESIZE_NWSE;\n\tRESIZE_WE;\n\tTEXT;\n\tWAIT;\n\tWAIT_ARROW;\n\tCUSTOM;\n}\n"
  },
  {
    "path": "src/lime/ui/MouseWheelMode.hx",
    "content": "package lime.ui;\n\nenum MouseWheelMode\n{\n\tPIXELS;\n\tLINES;\n\tPAGES;\n\tUNKNOWN;\n}\n"
  },
  {
    "path": "src/lime/ui/ScanCode.hx",
    "content": "package lime.ui;\n\nimport lime._internal.backend.native.NativeCFFI;\n\n/**\n\tMay be used to identify the scan code associated with the `KeyCode` passed\n\tto keyboard event listeners.\n\n\t@see `lime.ui.Window.onKeyDown`\n\t@see `lime.ui.Window.onKeyUp`\n\t@see `lime.ui.KeyCode`\n**/\n@:access(lime._internal.backend.native.NativeCFFI)\n@:access(lime.ui.KeyCode)\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract ScanCode(Int) from Int to Int from UInt to UInt\n{\n\tvar UNKNOWN = 0;\n\tvar BACKSPACE = 42;\n\tvar TAB = 43;\n\tvar RETURN = 40;\n\tvar ESCAPE = 41;\n\tvar SPACE = 44;\n\t// var EXCLAMATION = 0x21;\n\t// var QUOTE = 0x22;\n\t// var HASH = 0x23;\n\t// var DOLLAR = 0x24;\n\t// var PERCENT = 0x25;\n\t// var AMPERSAND = 0x26;\n\tvar SINGLE_QUOTE = 52;\n\t// var LEFT_PARENTHESIS = 0x28;\n\t// var RIGHT_PARENTHESIS = 0x29;\n\t// var ASTERISK = 0x2A;\n\t// var PLUS = 0x2B;\n\tvar COMMA = 54;\n\tvar MINUS = 45;\n\tvar PERIOD = 55;\n\tvar SLASH = 56;\n\tvar NUMBER_0 = 39;\n\tvar NUMBER_1 = 30;\n\tvar NUMBER_2 = 31;\n\tvar NUMBER_3 = 32;\n\tvar NUMBER_4 = 33;\n\tvar NUMBER_5 = 34;\n\tvar NUMBER_6 = 35;\n\tvar NUMBER_7 = 36;\n\tvar NUMBER_8 = 37;\n\tvar NUMBER_9 = 38;\n\t// var COLON = 0x3A;\n\tvar SEMICOLON = 51;\n\t// var LESS_THAN = 0x3C;\n\tvar EQUALS = 46;\n\t// var GREATER_THAN = 0x3E;\n\t// var QUESTION = 0x3F;\n\t// var AT = 0x40;\n\tvar LEFT_BRACKET = 47;\n\tvar BACKSLASH = 49;\n\tvar RIGHT_BRACKET = 48;\n\t// var CARET = 0x5E;\n\t// var UNDERSCORE = 0x5F;\n\tvar GRAVE = 53;\n\tvar A = 4;\n\tvar B = 5;\n\tvar C = 6;\n\tvar D = 7;\n\tvar E = 8;\n\tvar F = 9;\n\tvar G = 10;\n\tvar H = 11;\n\tvar I = 12;\n\tvar J = 13;\n\tvar K = 14;\n\tvar L = 15;\n\tvar M = 16;\n\tvar N = 17;\n\tvar O = 18;\n\tvar P = 19;\n\tvar Q = 20;\n\tvar R = 21;\n\tvar S = 22;\n\tvar T = 23;\n\tvar U = 24;\n\tvar V = 25;\n\tvar W = 26;\n\tvar X = 27;\n\tvar Y = 28;\n\tvar Z = 29;\n\tvar DELETE = 76;\n\tvar CAPS_LOCK = 57;\n\tvar F1 = 58;\n\tvar F2 = 59;\n\tvar F3 = 60;\n\tvar F4 = 61;\n\tvar F5 = 62;\n\tvar F6 = 63;\n\tvar F7 = 64;\n\tvar F8 = 65;\n\tvar F9 = 66;\n\tvar F10 = 67;\n\tvar F11 = 68;\n\tvar F12 = 69;\n\tvar PRINT_SCREEN = 70;\n\tvar SCROLL_LOCK = 71;\n\tvar PAUSE = 72;\n\tvar INSERT = 73;\n\tvar HOME = 74;\n\tvar PAGE_UP = 75;\n\tvar END = 77;\n\tvar PAGE_DOWN = 78;\n\tvar RIGHT = 79;\n\tvar LEFT = 80;\n\tvar DOWN = 81;\n\tvar UP = 82;\n\tvar NUM_LOCK = 83;\n\tvar NUMPAD_DIVIDE = 84;\n\tvar NUMPAD_MULTIPLY = 85;\n\tvar NUMPAD_MINUS = 86;\n\tvar NUMPAD_PLUS = 87;\n\tvar NUMPAD_ENTER = 88;\n\tvar NUMPAD_1 = 89;\n\tvar NUMPAD_2 = 90;\n\tvar NUMPAD_3 = 91;\n\tvar NUMPAD_4 = 92;\n\tvar NUMPAD_5 = 93;\n\tvar NUMPAD_6 = 94;\n\tvar NUMPAD_7 = 95;\n\tvar NUMPAD_8 = 96;\n\tvar NUMPAD_9 = 97;\n\tvar NUMPAD_0 = 98;\n\tvar NUMPAD_PERIOD = 99;\n\tvar APPLICATION = 101;\n\tvar POWER = 102;\n\tvar NUMPAD_EQUALS = 103;\n\tvar F13 = 104;\n\tvar F14 = 105;\n\tvar F15 = 106;\n\tvar F16 = 107;\n\tvar F17 = 108;\n\tvar F18 = 109;\n\tvar F19 = 110;\n\tvar F20 = 111;\n\tvar F21 = 112;\n\tvar F22 = 113;\n\tvar F23 = 114;\n\tvar F24 = 115;\n\tvar EXECUTE = 116;\n\tvar HELP = 117;\n\tvar MENU = 118;\n\tvar SELECT = 119;\n\tvar STOP = 120;\n\tvar AGAIN = 121;\n\tvar UNDO = 122;\n\tvar CUT = 123;\n\tvar COPY = 124;\n\tvar PASTE = 125;\n\tvar FIND = 126;\n\tvar MUTE = 127;\n\tvar VOLUME_UP = 128;\n\tvar VOLUME_DOWN = 129;\n\tvar NUMPAD_COMMA = 133;\n\t// var NUMPAD_EQUALS_AS400 = 134;\n\tvar ALT_ERASE = 153;\n\tvar SYSTEM_REQUEST = 154;\n\tvar CANCEL = 155;\n\tvar CLEAR = 156;\n\tvar PRIOR = 157;\n\tvar RETURN2 = 158;\n\tvar SEPARATOR = 159;\n\tvar OUT = 160;\n\tvar OPER = 161;\n\tvar CLEAR_AGAIN = 162;\n\tvar CRSEL = 163;\n\tvar EXSEL = 164;\n\tvar NUMPAD_00 = 176;\n\tvar NUMPAD_000 = 177;\n\tvar THOUSAND_SEPARATOR = 178;\n\tvar DECIMAL_SEPARATOR = 179;\n\tvar CURRENCY_UNIT = 180;\n\tvar CURRENCY_SUBUNIT = 181;\n\tvar NUMPAD_LEFT_PARENTHESIS = 182;\n\tvar NUMPAD_RIGHT_PARENTHESIS = 183;\n\tvar NUMPAD_LEFT_BRACE = 184;\n\tvar NUMPAD_RIGHT_BRACE = 185;\n\tvar NUMPAD_TAB = 186;\n\tvar NUMPAD_BACKSPACE = 187;\n\tvar NUMPAD_A = 188;\n\tvar NUMPAD_B = 189;\n\tvar NUMPAD_C = 190;\n\tvar NUMPAD_D = 191;\n\tvar NUMPAD_E = 192;\n\tvar NUMPAD_F = 193;\n\tvar NUMPAD_XOR = 194;\n\tvar NUMPAD_POWER = 195;\n\tvar NUMPAD_PERCENT = 196;\n\tvar NUMPAD_LESS_THAN = 197;\n\tvar NUMPAD_GREATER_THAN = 198;\n\tvar NUMPAD_AMPERSAND = 199;\n\tvar NUMPAD_DOUBLE_AMPERSAND = 200;\n\tvar NUMPAD_VERTICAL_BAR = 201;\n\tvar NUMPAD_DOUBLE_VERTICAL_BAR = 202;\n\tvar NUMPAD_COLON = 203;\n\tvar NUMPAD_HASH = 204;\n\tvar NUMPAD_SPACE = 205;\n\tvar NUMPAD_AT = 206;\n\tvar NUMPAD_EXCLAMATION = 207;\n\tvar NUMPAD_MEM_STORE = 208;\n\tvar NUMPAD_MEM_RECALL = 209;\n\tvar NUMPAD_MEM_CLEAR = 210;\n\tvar NUMPAD_MEM_ADD = 211;\n\tvar NUMPAD_MEM_SUBTRACT = 212;\n\tvar NUMPAD_MEM_MULTIPLY = 213;\n\tvar NUMPAD_MEM_DIVIDE = 214;\n\tvar NUMPAD_PLUS_MINUS = 215;\n\tvar NUMPAD_CLEAR = 216;\n\tvar NUMPAD_CLEAR_ENTRY = 217;\n\tvar NUMPAD_BINARY = 218;\n\tvar NUMPAD_OCTAL = 219;\n\tvar NUMPAD_DECIMAL = 220;\n\tvar NUMPAD_HEXADECIMAL = 221;\n\tvar LEFT_CTRL = 224;\n\tvar LEFT_SHIFT = 225;\n\tvar LEFT_ALT = 226;\n\tvar LEFT_META = 227;\n\tvar RIGHT_CTRL = 228;\n\tvar RIGHT_SHIFT = 229;\n\tvar RIGHT_ALT = 230;\n\tvar RIGHT_META = 231;\n\tvar MODE = 257;\n\tvar AUDIO_NEXT = 258;\n\tvar AUDIO_PREVIOUS = 259;\n\tvar AUDIO_STOP = 260;\n\tvar AUDIO_PLAY = 261;\n\tvar AUDIO_MUTE = 262;\n\tvar MEDIA_SELECT = 263;\n\tvar WWW = 264;\n\tvar MAIL = 265;\n\tvar CALCULATOR = 266;\n\tvar COMPUTER = 267;\n\tvar APP_CONTROL_SEARCH = 268;\n\tvar APP_CONTROL_HOME = 269;\n\tvar APP_CONTROL_BACK = 270;\n\tvar APP_CONTROL_FORWARD = 271;\n\tvar APP_CONTROL_STOP = 272;\n\tvar APP_CONTROL_REFRESH = 273;\n\tvar APP_CONTROL_BOOKMARKS = 274;\n\tvar BRIGHTNESS_DOWN = 275;\n\tvar BRIGHTNESS_UP = 276;\n\tvar DISPLAY_SWITCH = 277;\n\tvar BACKLIGHT_TOGGLE = 278;\n\tvar BACKLIGHT_DOWN = 279;\n\tvar BACKLIGHT_UP = 280;\n\tvar EJECT = 281;\n\tvar SLEEP = 282;\n\n\t@:from public static function fromKeyCode(keyCode:KeyCode):ScanCode\n\t{\n\t\treturn KeyCode.toScanCode(keyCode);\n\t}\n\n\tprivate static function toKeyCode(scanCode:ScanCode):KeyCode\n\t{\n\t\treturn KeyCode.fromScanCode(scanCode);\n\t}\n\n\t@:op(A > B) private static inline function gt(a:ScanCode, b:ScanCode):Bool\n\t{\n\t\treturn (a : Int) > (b : Int);\n\t}\n\n\t@:op(A >= B) private static inline function gte(a:ScanCode, b:ScanCode):Bool\n\t{\n\t\treturn (a : Int) >= (b : Int);\n\t}\n\n\t@:op(A < B) private static inline function lt(a:ScanCode, b:ScanCode):Bool\n\t{\n\t\treturn (a : Int) < (b : Int);\n\t}\n\n\t@:op(A <= B) private static inline function lte(a:ScanCode, b:ScanCode):Bool\n\t{\n\t\treturn (a : Int) <= (b : Int);\n\t}\n\n\t@:op(A + B) private static inline function plus(a:ScanCode, b:Int):ScanCode\n\t{\n\t\treturn (a : Int) + b;\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/Touch.hx",
    "content": "package lime.ui;\n\nimport lime.app.Event;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Touch\n{\n\tpublic static var onCancel = new Event<Touch->Void>();\n\tpublic static var onEnd = new Event<Touch->Void>();\n\tpublic static var onMove = new Event<Touch->Void>();\n\tpublic static var onStart = new Event<Touch->Void>();\n\n\tpublic var device:Int;\n\tpublic var dx:Float;\n\tpublic var dy:Float;\n\tpublic var id:Int;\n\tpublic var pressure:Float;\n\tpublic var x:Float;\n\tpublic var y:Float;\n\n\tpublic function new(x:Float, y:Float, id:Int, dx:Float, dy:Float, pressure:Float, device:Int)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.id = id;\n\t\tthis.dx = dx;\n\t\tthis.dy = dy;\n\t\tthis.pressure = pressure;\n\t\tthis.device = device;\n\t}\n}\n"
  },
  {
    "path": "src/lime/ui/Window.hx",
    "content": "package lime.ui;\n\nimport lime.app.Application;\nimport lime.app.Event;\nimport lime.graphics.Image;\nimport lime.graphics.RenderContext;\nimport lime.graphics.RenderContextAttributes;\nimport lime.math.Rectangle;\nimport lime.system.Display;\nimport lime.system.DisplayMode;\n#if (js && html5)\nimport js.html.Element;\n#end\n#if openfl\nimport openfl.display.Stage;\n#elseif flash\nimport flash.display.Stage;\n#else\ntypedef Stage = Dynamic;\n#end\n\n#if hl\n@:keep\n#end\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Window\n{\n\tpublic var application(default, null):Application;\n\tpublic var borderless(get, set):Bool;\n\tpublic var context(default, null):RenderContext;\n\tpublic var cursor(get, set):MouseCursor;\n\tpublic var display(get, null):Display;\n\tpublic var displayMode(get, set):DisplayMode;\n\t#if (!lime_doc_gen || (js && html5))\n\tpublic var element(default, null):#if (js && html5) Element #else Dynamic #end;\n\t#end\n\n\t/**\n\t * The current frame rate (measured in frames-per-second) of the window.\n\t *\n\t * On some platforms, a frame rate of 60 or greater may imply vsync, which will\n\t * perform more quickly on displays with a higher refresh rate\n\t**/\n\tpublic var frameRate(get, set):Float;\n\n\tpublic var fullscreen(get, set):Bool;\n\tpublic var height(get, set):Int;\n\tpublic var hidden(get, null):Bool;\n\tpublic var id(default, null):Int;\n\tpublic var maxHeight(get, set):Int;\n\tpublic var maximized(get, set):Bool;\n\tpublic var maxWidth(get, set):Int;\n\tpublic var minHeight(get, set):Int;\n\tpublic var minimized(get, set):Bool;\n\tpublic var minWidth(get, set):Int;\n\tpublic var mouseLock(get, set):Bool;\n\tpublic var onActivate(default, null) = new Event<Void->Void>();\n\tpublic var onClose(default, null) = new Event<Void->Void>();\n\tpublic var onDeactivate(default, null) = new Event<Void->Void>();\n\tpublic var onDropFile(default, null) = new Event<String->Void>();\n\tpublic var onEnter(default, null) = new Event<Void->Void>();\n\tpublic var onExpose(default, null) = new Event<Void->Void>();\n\tpublic var onFocusIn(default, null) = new Event<Void->Void>();\n\tpublic var onFocusOut(default, null) = new Event<Void->Void>();\n\tpublic var onFullscreen(default, null) = new Event<Void->Void>();\n\tpublic var onHide(default, null) = new Event<Void->Void>();\n\n\t/**\n\t\tFired when the user presses a key down when this window has focus.\n\t**/\n\tpublic var onKeyDown(default, null) = new Event<KeyCode->KeyModifier->Void>();\n\n\t/**\n\t\tFired when the user releases a key that was down.\n\t**/\n\tpublic var onKeyUp(default, null) = new Event<KeyCode->KeyModifier->Void>();\n\n\tpublic var onLeave(default, null) = new Event<Void->Void>();\n\n\t/**\n\t\tFired when the window is maximized.\n\t**/\n\tpublic var onMaximize(default, null) = new Event<Void->Void>();\n\n\t/**\n\t\tFired when the window is minimized.\n\t**/\n\tpublic var onMinimize(default, null) = new Event<Void->Void>();\n\n\t/**\n\t\tFired when the user pressed a mouse button down.\n\t**/\n\tpublic var onMouseDown(default, null) = new Event<Float->Float->MouseButton->Void>();\n\n\t/**\n\t\tFired when the mouse is moved over the window.\n\t**/\n\tpublic var onMouseMove(default, null) = new Event<Float->Float->Void>();\n\tpublic var onMouseMoveRelative(default, null) = new Event<Float->Float->Void>();\n\n\t/**\n\t\tFired when the user releases a mouse button that was pressed down.\n\t**/\n\tpublic var onMouseUp(default, null) = new Event<Float->Float->Int->Void>();\n\n\t/**\n\t\tFired when the user interacts with the mouse wheel.\n\t**/\n\tpublic var onMouseWheel(default, null) = new Event<Float->Float->MouseWheelMode->Void>();\n\n\t/**\n\t\tFired when the window is moved to a new position.\n\t**/\n\tpublic var onMove(default, null) = new Event<Float->Float->Void>();\n\tpublic var onRender(default, null) = new Event<RenderContext->Void>();\n\tpublic var onRenderContextLost(default, null) = new Event<Void->Void>();\n\tpublic var onRenderContextRestored(default, null) = new Event<RenderContext->Void>();\n\n\t/**\n\t\tFired when the window is resized with new dimensions.\n\t**/\n\tpublic var onResize(default, null) = new Event<Int->Int->Void>();\n\n\tpublic var onRestore(default, null) = new Event<Void->Void>();\n\tpublic var onShow(default, null) = new Event<Void->Void>();\n\tpublic var onTextEdit(default, null) = new Event<String->Int->Int->Void>();\n\tpublic var onTextInput(default, null) = new Event<String->Void>();\n\n\tpublic var opacity(get, set):Float;\n\tpublic var parameters:Dynamic;\n\tpublic var resizable(get, set):Bool;\n\tpublic var scale(get, null):Float;\n\t#if (!lime_doc_gen || flash || openfl)\n\tpublic var stage(default, null):Stage;\n\t#end\n\tpublic var textInputEnabled(get, set):Bool;\n\tpublic var title(get, set):String;\n\tpublic var visible(get, set):Bool;\n\tpublic var width(get, set):Int;\n\tpublic var x(get, set):Int;\n\tpublic var y(get, set):Int;\n\n\t@:allow(openfl.display.Stage)\n\t@:allow(lime.app.Application)\n\t@:allow(lime._internal.backend.html5.HTML5Window)\n\tprivate var clickCount:Int = 0;\n\n\t@:noCompletion private var __attributes:WindowAttributes;\n\t@:noCompletion private var __backend:WindowBackend;\n\t@:noCompletion private var __borderless:Bool;\n\t@:noCompletion private var __fullscreen:Bool;\n\t@:noCompletion private var __height:Int;\n\t@:noCompletion private var __hidden:Bool;\n\t@:noCompletion private var __maximized:Bool;\n\t@:noCompletion private var __minimized:Bool;\n\t@:noCompletion private var __resizable:Bool;\n\t@:noCompletion private var __scale:Float;\n\t@:noCompletion private var __title:String;\n\t@:noCompletion private var __width:Int;\n\t@:noCompletion private var __x:Int;\n\t@:noCompletion private var __y:Int;\n\t@:noCompletion private var __minWidth:Int = 0;\n\t@:noCompletion private var __minHeight:Int = 0;\n\t@:noCompletion private var __maxWidth:Int = 0x7FFFFFFF;\n\t@:noCompletion private var __maxHeight:Int = 0x7FFFFFFF;\n\n\t#if commonjs\n\tprivate static function __init__()\n\t{\n\t\tvar p = untyped Window.prototype;\n\t\tuntyped Object.defineProperties(p,\n\t\t\t{\n\t\t\t\t\"borderless\": {get: p.get_borderless, set: p.set_borderless},\n\t\t\t\t\"cursor\": {get: p.get_cursor, set: p.set_cursor},\n\t\t\t\t\"display\": {get: p.get_display},\n\t\t\t\t\"displayMode\": {get: p.get_displayMode, set: p.set_displayMode},\n\t\t\t\t\"frameRate\": {get: p.get_frameRate, set: p.set_frameRate},\n\t\t\t\t\"fullscreen\": {get: p.get_fullscreen, set: p.set_fullscreen},\n\t\t\t\t\"height\": {get: p.get_height, set: p.set_height},\n\t\t\t\t\"maxHeight\": {get: p.get_maxHeight, set: p.set_maxHeight},\n\t\t\t\t\"maximized\": {get: p.get_maximized, set: p.set_maximized},\n\t\t\t\t\"maxWidth\": {get: p.get_maxWidth, set: p.set_maxWidth},\n\t\t\t\t\"minHeight\": {get: p.get_minHeight, set: p.set_minHeight},\n\t\t\t\t\"minimized\": {get: p.get_minimized, set: p.set_minimized},\n\t\t\t\t\"minWidth\": {get: p.get_minWidth, set: p.set_minWidth},\n\t\t\t\t\"mouseLock\": {get: p.get_mouseLock, set: p.set_mouseLock},\n\t\t\t\t\"resizable\": {get: p.get_resizable, set: p.set_resizable},\n\t\t\t\t\"scale\": {get: p.get_scale},\n\t\t\t\t\"textInputEnabled\": {get: p.get_textInputEnabled, set: p.set_textInputEnabled},\n\t\t\t\t\"title\": {get: p.get_title, set: p.set_title},\n\t\t\t\t\"visible\": {get: p.get_visible, set: p.set_visible},\n\t\t\t\t\"width\": {get: p.get_width, set: p.set_width},\n\t\t\t\t\"x\": {get: p.get_x, set: p.set_y},\n\t\t\t\t\"y\": {get: p.get_x, set: p.set_y}\n\t\t\t});\n\t}\n\t#end\n\n\t@:noCompletion private function new(application:Application, attributes:WindowAttributes)\n\t{\n\t\tthis.application = application;\n\t\t__attributes = attributes != null ? attributes : {};\n\n\t\tif (Reflect.hasField(__attributes, \"parameters\")) parameters = __attributes.parameters;\n\n\t\t__width = 0;\n\t\t__height = 0;\n\t\t__fullscreen = false;\n\t\t__scale = 1;\n\t\t__x = 0;\n\t\t__y = 0;\n\t\t__title = Reflect.hasField(__attributes, \"title\") ? __attributes.title : \"\";\n\t\t__hidden = false;\n\t\t__borderless = Reflect.hasField(__attributes, \"borderless\") ? __attributes.borderless : false;\n\t\t__resizable = Reflect.hasField(__attributes, \"resizable\") ? __attributes.resizable : false;\n\t\t__maximized = Reflect.hasField(__attributes, \"maximized\") ? __attributes.maximized : false;\n\t\t__minimized = Reflect.hasField(__attributes, \"minimized\") ? __attributes.minimized : false;\n\n\t\tid = -1;\n\n\t\t__backend = new WindowBackend(this);\n\n\t\t#if windows\n\t\tvar mappings = [\n\n\t\t\t\"8f0e1200000000000000504944564944,Acme,platform:Windows,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2\",\n\t\t\t\"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows\",\n\t\t\t\"ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows\",\n\t\t\t\"6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows\",\n\t\t\t\"0d0f6e00000000000000504944564944,HORIPAD 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows\",\n\t\t\t\"88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows\",\n\t\t\t\"4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows\",\n\t\t\t\"25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows\",\n\t\t\t\"4c05c405000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows\",\n\t\t\t\"4c05cc09000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows\",\n\t\t\t\"4c05a00b000000000000504944564944,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows\",\n\t\t\t\"6d0418c2000000000000504944564944,Logitech RumblePad 2 USB,platform:Windows,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"36280100000000000000504944564944,OUYA Controller,platform:Windows,a:b0,b:b3,y:b2,x:b1,start:b14,guide:b15,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b8,dpleft:b10,dpdown:b9,dpright:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b12,righttrigger:b13\",\n\t\t\t\"4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Windows\",\n\t\t\t\"00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows\",\n\t\t\t\"00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows\",\n\t\t\t\"28040140000000000000504944564944,GamePad Pro USB,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"ff113133000000000000504944564944,SVEN X-PAD,platform:Windows,a:b2,b:b3,y:b1,x:b0,start:b5,back:b4,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b8,righttrigger:b9\",\n\t\t\t\"8f0e0300000000000000504944564944,Piranha xtreme,platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2\",\n\t\t\t\"8f0e0d31000000000000504944564944,Multilaser JS071 USB,platform:Windows,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"10080300000000000000504944564944,PS2 USB,platform:Windows,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a4,righty:a2,lefttrigger:b4,righttrigger:b5\",\n\t\t\t\"79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftstick:a0,rightstick:a2,leftshoulder:a3,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:h0.6,lefty:h0.12,rightx:h0.9,righty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"d6206dca000000000000504944564944,PowerA Pro Ex,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide:b10,back:b5,leftstick:b8,rightstick:b9,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows\",\n\t\t\t\"4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,platform:Windows,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2\",\n\t\t\t\"83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,y:b2,x:b3,start:b7,back:b6,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Windows\",\n\t\t\t\"10080100000000000000504944564944,PS1 USB,platform:Windows,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2\",\n\t\t\t\"49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows\",\n\t\t\t\"4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2\",\n\t\t\t\"79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows\",\n\t\t\t\"300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,x:b0,y:b1,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b5,righttrigger:b7,platform:Windows\",\n\t\t\t\"10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,y:b3,x:b4,start:b11,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,platform:Windows\",\n\t\t\t\"63252305000000000000504944564944,USB Vibration Joystick (BM),platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"20380900000000000000504944564944,8Bitdo NES30 PRO Wireless,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8\",\n\t\t\t\"02200090000000000000504944564944,8Bitdo NES30 PRO USB,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8\",\n\t\t\t\"ff113133000000000000504944564944,Gembird JPD-DualForce,platform:Windows,a:b2,b:b3,x:b0,y:b1,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,leftstick:b10,rightstick:b11\",\n\t\t\t\"341a0108000000000000504944564944,EXEQ RF USB Gamepad 8206,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,leftstick:b8,rightstick:b7,back:b8,start:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows\",\n\t\t\t\"c0111352000000000000504944564944,Battalife Joystick,platform:Windows,x:b4,a:b6,b:b7,y:b5,back:b2,start:b3,leftshoulder:b0,rightshoulder:b1,leftx:a0,lefty:a1\",\n\t\t\t\"100801e5000000000000504944564944,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Windows\",\n\t\t\t\"79000600000000000000504944564944,NGS Phantom,a:b2,b:b3,y:b1,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows\"\n\n\t\t];\n\n\t\tGamepad.addMappings(mappings);\n\t\t#elseif mac\n\t\tvar mappings = [\n\n\t\t\t\"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X\",\n\t\t\t\"6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X\",\n\t\t\t\"6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X\",\n\t\t\t\"6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X\",\n\t\t\t\"6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X\",\n\t\t\t\"4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X\",\n\t\t\t\"4c05000000000000c405000000000000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X\",\n\t\t\t\"4c05000000000000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X\",\n\t\t\t\"5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X\",\n\t\t\t\"891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b8,guide:b10,back:b9,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Mac OS X\",\n\t\t\t\"4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Mac OS X\",\n\t\t\t\"8f0e0000000000000300000000000000,Piranha xtreme,platform:Mac OS X,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2\",\n\t\t\t\"0d0f0000000000004d00000000000000,HORI Gem Pad 3,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X\",\n\t\t\t\"4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,platform:Mac OS X,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X\",\n\t\t\t\"050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,y:b9,x:b10,start:b6,guide:b8,back:b7,dpup:b2,dpleft:b0,dpdown:b3,dpright:b1,leftx:a0,lefty:a1,lefttrigger:b12,righttrigger:,leftshoulder:b11,platform:Mac OS X\",\n\t\t\t\"83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X\",\n\t\t\t\"bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X\",\n\t\t\t\"79000000000000001100000000000000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a3,lefty:a4,platform:Mac OS X\",\n\t\t\t\"5e04000000000000dd02000000000000,Xbox One Wired Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"5e04000000000000ea02000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"5e04000000000000e002000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b10,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X\",\n\t\t\t\"79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X\",\n\t\t\t\"2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X\",\n\t\t\t\"351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X\",\n\t\t\t\"b4040000000000000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,x:b3,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X\",\n\t\t\t\"81170000000000007e05000000000000,Sega Saturn,x:b0,a:b2,b:b4,y:b6,start:b13,dpleft:b15,dpdown:b16,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,lefttrigger:b10,rightshoulder:b9,righttrigger:a4,righttrigger:b11,leftx:a0,lefty:a2,platform:Mac OS X\",\n\t\t\t\"10280000000000000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X\",\n\t\t\t\"d814000000000000cecf000000000000,MC Cthulhu,platform:Mac OS X,leftx:,lefty:,rightx:,righty:,lefttrigger:b6,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,righttrigger:b7\",\n\t\t\t\"0d0f0000000000006600000000000000,HORIPAD FPS PLUS 4,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:a4\"\n\n\t\t];\n\n\t\tGamepad.addMappings(mappings);\n\t\t#elseif linux\n\t\tvar mappings = [\n\n\t\t\t\"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux\",\n\t\t\t\"03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux\",\n\t\t\t\"030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux\",\n\t\t\t\"030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux\",\n\t\t\t\"030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux\",\n\t\t\t\"030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux\",\n\t\t\t\"030000004c050000c405000011010000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux\",\n\t\t\t\"050000004c050000c405000000010000,Sony DualShock 4 BT,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux\",\n\t\t\t\"030000004c050000cc09000011010000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux\",\n\t\t\t\"050000004c050000cc09000000010000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux\",\n\t\t\t\"030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux\",\n\t\t\t\"030000006f0e00003001000001010000,EA Sports PS3 Controller,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux\",\n\t\t\t\"03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,y:b0,x:b3,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux\",\n\t\t\t\"03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Linux\",\n\t\t\t\"030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,y:b3,x:b1,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux\",\n\t\t\t\"030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5\",\n\t\t\t\"030000008f0e00000300000010010000,GreenAsia Inc.    USB Joystick     ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2\",\n\t\t\t\"030000008f0e00001200000010010000,GreenAsia Inc.      USB  Joystick  ,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2\",\n\t\t\t\"030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux\",\n\t\t\t\"030000006d04000016c2000010010000,Logitech Logitech Dual Action,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,y:b3,x:b1,start:b7,leftshoulder:,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,rightstick:,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Linux\",\n\t\t\t\"030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux\",\n\t\t\t\"030000006d04000018c2000010010000,Logitech Logitech RumblePad 2 USB,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"05000000d6200000ad0d000001000000,Moga Pro,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4\",\n\t\t\t\"030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"030000004f04000008d0000000010000,Thrustmaster Run N Drive  Wireless,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux\",\n\t\t\t\"0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux\",\n\t\t\t\"030000006f0e00001f01000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"03000000280400000140000000010000,Gravis GamePad Pro USB ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftx:a0,lefty:a1\",\n\t\t\t\"030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"030000005e0400008502000000010000,Microsoft X-Box pad (Japan),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2\",\n\t\t\t\"03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,platform:Linux,a:b2,b:b1,y:b0,x:b3,start:b8,back:b9,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5\",\n\t\t\t\"030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux\",\n\t\t\t\"030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux\",\n\t\t\t\"03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux\",\n\t\t\t\"060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux\",\n\t\t\t\"050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux\",\n\t\t\t\"03000000790000000600000010010000,DragonRise Inc.   Generic   USB  Joystick  ,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a3,rightx:a1,righty:a4\",\n\t\t\t\"03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13\",\n\t\t\t\"05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2\",\n\t\t\t\"05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2\",\n\t\t\t\"030000008916000001fd000024010000,Razer Onza Classic Edition,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:b11,dpdown:b14,dpright:b12,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"030000005e040000dd02000003020000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux\",\n\t\t\t\"03000000790000001100000010010000,RetroLink Saturn Classic Controller,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1\",\n\t\t\t\"050000007e0500003003000001000000,Nintendo Wii U Pro Controller,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16\",\n\t\t\t\"030000005e0400008e02000004010000,Microsoft X-Box 360 pad,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2\",\n\t\t\t\"030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1\",\n\t\t\t\"030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7\",\n\t\t\t\"03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b7,back:b6,guide:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,lefttrigger:a5,righttrigger:a4,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux\",\n\t\t\t\"030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"030000006f0e00001304000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:a0,rightstick:a3,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux\",\n\t\t\t\"03000000bd12000015d0000010010000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux\",\n\t\t\t\"03000000790000001100000010010000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux\",\n\t\t\t\"03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux\",\n\t\t\t\"03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux\",\n\t\t\t\"03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux\",\n\t\t\t\"030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux\",\n\t\t\t\"030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,platform:Linux,a:b0,b:b2,x:b1,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7\",\n\t\t\t\"05000000102800000900000000010000,8Bitdo SFC30 GamePad,platform:Linux,x:b4,a:b1,b:b0,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1\",\n\t\t\t\"03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftshoulder:b4,rightshoulder:b5,lefttrigger:b6,righttrigger:b7,leftx:a0,lefty:a1\",\n\t\t\t\"030000000d0f00000d00000000010000,hori,platform:Linux,a:b0,b:b6,y:b2,x:b1,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,start:b9,guide:b10,back:b8,leftshoulder:b3,rightshoulder:b7,leftx:b4,lefty:b5\",\n\t\t\t\"03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5\",\n\t\t\t\"03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,platform:Linux,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),platform:Linux,a:b3,b:b4,y:b1,x:b0,start:b7,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5\",\n\t\t\t\"05000000010000000100000003000000,Nintendo Wiimote,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\",\n\t\t\t\"030000005e0400008e02000062230000,Microsoft X-Box 360 pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,y:b1,x:b0,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b6,righttrigger:b7,platform:Linux\",\n\t\t\t\"030000006f0e00000103000000020000,Logic3 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"05000000380700006652000025010000,Mad Catz C.T.R.L.R ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3\",\n\t\t\t\"030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4\",\n\t\t\t\"03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:a2,righttrigger:a5\",\n\t\t\t\"05000000a00500003232000001000000,8Bitdo Zero GamePad,platform:Linux,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1\",\n\t\t\t\"030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Linux\",\n\t\t\t\"03000000100800000300000010010000,USB Gamepad,platform:Linux,a:b2,b:b1,x:b3,y:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5\",\n\t\t\t\"05000000ac0500003232000001000000,VR-BOX,platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5\",\n\t\t\t\"03000000780000000600000010010000,Microntek USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftx:a0,lefty:a1\"\n\n\t\t];\n\n\t\tGamepad.addMappings(mappings);\n\t\t#elseif (ios || tvos)\n\t\tvar mappings = [\n\n\t\t\t\"4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,\",\n\t\t\t\"4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,\",\n\t\t\t\"4d466947616d65706164030000000000,MFi Apple TV Remote,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,\",\n\n\t\t];\n\n\t\tGamepad.addMappings(mappings);\n\t\t#end\n\t}\n\n\tpublic function alert(message:String = null, title:String = null):Void\n\t{\n\t\t__backend.alert(message, title);\n\t}\n\n\tpublic function close():Void\n\t{\n\t\t__backend.close();\n\t}\n\n\tpublic function focus():Void\n\t{\n\t\t__backend.focus();\n\t}\n\n\tpublic function move(x:Int, y:Int):Void\n\t{\n\t\t__backend.move(x, y);\n\n\t\t__x = x;\n\t\t__y = y;\n\t}\n\n\tpublic function readPixels(rect:Rectangle = null):Image\n\t{\n\t\treturn __backend.readPixels(rect);\n\t}\n\n\tpublic function resize(width:Int, height:Int):Void\n\t{\n\t\tif (width < __minWidth)\n\t\t{\n\t\t\twidth = __minWidth;\n\t\t}\n\t\telse if (width > __maxWidth)\n\t\t{\n\t\t\twidth = __maxWidth;\n\t\t}\n\t\tif (height < __minHeight)\n\t\t{\n\t\t\theight = __minHeight;\n\t\t}\n\t\telse if (height > __maxHeight)\n\t\t{\n\t\t\theight = __maxHeight;\n\t\t}\n\n\t\t__backend.resize(width, height);\n\n\t\t__width = width;\n\t\t__height = height;\n\t}\n\n\tpublic function setMinSize(width:Int, height:Int):Void\n\t{\n\t\t__backend.setMinSize(width, height);\n\n\t\t__minWidth = width;\n\t\t__minHeight = height;\n\t\tif (__width < __minWidth || __height < __minHeight) {\n\t\t\tresize(__width, __height);\n\t\t}\n\t}\n\n\tpublic function setMaxSize(width:Int, height:Int):Void\n\t{\n\t\t__backend.setMaxSize(width, height);\n\n\t\t__maxWidth = width;\n\t\t__maxHeight = height;\n\t\tif (__width > __maxWidth || __height > __maxHeight) {\n\t\t\tresize(__width, __height);\n\t\t}\n\t}\n\n\tpublic function setIcon(image:Image):Void\n\t{\n\t\tif (image == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t__backend.setIcon(image);\n\t}\n\n\tpublic function toString():String\n\t{\n\t\treturn \"[object Window]\";\n\t}\n\n\tpublic function warpMouse(x:Int, y:Int):Void\n\t{\n\t\t__backend.warpMouse(x, y);\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_cursor():MouseCursor\n\t{\n\t\treturn __backend.getCursor();\n\t}\n\n\t@:noCompletion private function set_cursor(value:MouseCursor):MouseCursor\n\t{\n\t\treturn __backend.setCursor(value);\n\t}\n\n\t@:noCompletion private function get_display():Display\n\t{\n\t\treturn __backend.getDisplay();\n\t}\n\n\t@:noCompletion private function get_displayMode():DisplayMode\n\t{\n\t\treturn __backend.getDisplayMode();\n\t}\n\n\t@:noCompletion private function set_displayMode(value:DisplayMode):DisplayMode\n\t{\n\t\treturn __backend.setDisplayMode(value);\n\t}\n\n\t@:noCompletion private inline function get_borderless():Bool\n\t{\n\t\treturn __borderless;\n\t}\n\n\t@:noCompletion private function set_borderless(value:Bool):Bool\n\t{\n\t\treturn __borderless = __backend.setBorderless(value);\n\t}\n\n\t@:noCompletion private inline function get_frameRate():Float\n\t{\n\t\treturn __backend.getFrameRate();\n\t}\n\n\t@:noCompletion private inline function set_frameRate(value:Float):Float\n\t{\n\t\treturn __backend.setFrameRate(value);\n\t}\n\n\t@:noCompletion private inline function get_fullscreen():Bool\n\t{\n\t\treturn __fullscreen;\n\t}\n\n\t@:noCompletion private function set_fullscreen(value:Bool):Bool\n\t{\n\t\treturn __fullscreen = __backend.setFullscreen(value);\n\t}\n\n\t@:noCompletion private inline function get_height():Int\n\t{\n\t\treturn __height;\n\t}\n\n\t@:noCompletion private function set_height(value:Int):Int\n\t{\n\t\tresize(__width, value);\n\t\treturn __height;\n\t}\n\n\t@:noCompletion private inline function get_hidden():Bool\n\t{\n\t\treturn __hidden;\n\t}\n\n\t@:noCompletion private inline function get_maxHeight():Int\n\t{\n\t\treturn __maxHeight;\n\t}\n\n\t@:noCompletion private function set_maxHeight(value:Int):Int\n\t{\n\t\tsetMaxSize(__maxWidth, value);\n\t\treturn __maxHeight;\n\t}\n\n\t@:noCompletion private inline function get_maximized():Bool\n\t{\n\t\treturn __maximized;\n\t}\n\n\t@:noCompletion private inline function set_maximized(value:Bool):Bool\n\t{\n\t\t__minimized = false;\n\t\treturn __maximized = __backend.setMaximized(value);\n\t}\n\n\t@:noCompletion private inline function get_maxWidth():Int\n\t{\n\t\treturn __maxWidth;\n\t}\n\n\t@:noCompletion private function set_maxWidth(value:Int):Int\n\t{\n\t\tsetMinSize(value, __maxHeight);\n\t\treturn __maxWidth;\n\t}\n\n\t@:noCompletion private inline function get_minHeight():Int\n\t{\n\t\treturn __minHeight;\n\t}\n\n\t@:noCompletion private function set_minHeight(value:Int):Int\n\t{\n\t\tsetMinSize(__minWidth, value);\n\t\treturn __minHeight;\n\t}\n\n\t@:noCompletion private inline function get_minimized():Bool\n\t{\n\t\treturn __minimized;\n\t}\n\n\t@:noCompletion private function set_minimized(value:Bool):Bool\n\t{\n\t\t__maximized = false;\n\t\treturn __minimized = __backend.setMinimized(value);\n\t}\n\n\t@:noCompletion private inline function get_minWidth():Int\n\t{\n\t\treturn __minWidth;\n\t}\n\n\t@:noCompletion private function set_minWidth(value:Int):Int\n\t{\n\t\tsetMinSize(value, __minHeight);\n\t\treturn __minWidth;\n\t}\n\n\t@:noCompletion private function get_mouseLock():Bool\n\t{\n\t\treturn __backend.getMouseLock();\n\t}\n\n\t@:noCompletion private function set_mouseLock(value:Bool):Bool\n\t{\n\t\t__backend.setMouseLock(value);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private function get_opacity():Float\n\t{\n\t\treturn __backend.getOpacity();\n\t}\n\n\t@:noCompletion private function set_opacity(value:Float):Float\n\t{\n\t\t__backend.setOpacity(value);\n\t\treturn value;\n\t}\n\n\t@:noCompletion private inline function get_resizable():Bool\n\t{\n\t\treturn __resizable;\n\t}\n\n\t@:noCompletion private function set_resizable(value:Bool):Bool\n\t{\n\t\t__resizable = __backend.setResizable(value);\n\t\treturn __resizable;\n\t}\n\n\t@:noCompletion private inline function get_scale():Float\n\t{\n\t\treturn __scale;\n\t}\n\n\t@:noCompletion private inline function get_textInputEnabled():Bool\n\t{\n\t\treturn __backend.getTextInputEnabled();\n\t}\n\n\t@:noCompletion private inline function set_textInputEnabled(value:Bool):Bool\n\t{\n\t\treturn __backend.setTextInputEnabled(value);\n\t}\n\n\tpublic function setTextInputRect(value:Rectangle):Rectangle\n\t{\n\t\treturn __backend.setTextInputRect(value);\n\t}\n\n\t@:noCompletion private inline function get_title():String\n\t{\n\t\treturn __title;\n\t}\n\n\t@:noCompletion private function set_title(value:String):String\n\t{\n\t\treturn __title = __backend.setTitle(value);\n\t}\n\n\t@:noCompletion private inline function get_visible():Bool\n\t{\n\t\treturn !__hidden;\n\t}\n\n\t@:noCompletion private function set_visible(value:Bool):Bool\n\t{\n\t\t__hidden = !__backend.setVisible(value);\n\t\treturn !__hidden;\n\t}\n\n\t@:noCompletion private inline function get_width():Int\n\t{\n\t\treturn __width;\n\t}\n\n\t@:noCompletion private function set_width(value:Int):Int\n\t{\n\t\tresize(value, __height);\n\t\treturn __width;\n\t}\n\n\t@:noCompletion private inline function get_x():Int\n\t{\n\t\treturn __x;\n\t}\n\n\t@:noCompletion private function set_x(value:Int):Int\n\t{\n\t\tmove(value, __y);\n\t\treturn __x;\n\t}\n\n\t@:noCompletion private inline function get_y():Int\n\t{\n\t\treturn __y;\n\t}\n\n\t@:noCompletion private function set_y(value:Int):Int\n\t{\n\t\tmove(__x, value);\n\t\treturn __y;\n\t}\n}\n\n#if air\n@:noCompletion private typedef WindowBackend = lime._internal.backend.air.AIRWindow;\n#elseif flash\n@:noCompletion private typedef WindowBackend = lime._internal.backend.flash.FlashWindow;\n#elseif (js && html5)\n@:noCompletion private typedef WindowBackend = lime._internal.backend.html5.HTML5Window;\n#else\n@:noCompletion private typedef WindowBackend = lime._internal.backend.native.NativeWindow;\n#end\n"
  },
  {
    "path": "src/lime/ui/WindowAttributes.hx",
    "content": "package lime.ui;\n\nimport lime.graphics.RenderContextAttributes;\n\ntypedef WindowAttributes =\n{\n\t@:optional public var allowHighDPI:Bool;\n\t@:optional public var alwaysOnTop:Bool;\n\t@:optional public var borderless:Bool;\n\t@:optional public var context:RenderContextAttributes;\n\t// @:optional public var display:Int;\n\t@:optional public var element:#if (js && html5 && !doc_gen) js.html.Element #else Dynamic #end;\n\t@:optional public var frameRate:Float;\n\t@:optional public var fullscreen:Bool;\n\t@:optional public var height:Int;\n\t@:optional public var hidden:Bool;\n\t@:optional public var maximized:Bool;\n\t@:optional public var minimized:Bool;\n\t@:optional public var parameters:Dynamic;\n\t@:optional public var resizable:Bool;\n\t@:optional public var title:String;\n\t@:optional public var width:Int;\n\t@:optional public var x:Int;\n\t@:optional public var y:Int;\n}\n"
  },
  {
    "path": "src/lime/utils/ArrayBuffer.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\ntypedef ArrayBuffer = #if haxe4 js.lib.ArrayBuffer #else js.html.ArrayBuffer #end;\n#else\nimport haxe.io.Bytes;\n\n@:forward\n@:transitive\nabstract ArrayBuffer(Bytes) from Bytes to Bytes\n\t#if doc_gen from Dynamic to Dynamic\n\t#end\n{\n\tpublic var byteLength(get, never):Int;\n\n\tprivate inline function get_byteLength()\n\t{\n\t\treturn this.length;\n\t}\n\n\tpublic inline function new(byteLength:Int)\n\t{\n\t\tthis = Bytes.alloc(byteLength);\n\t}\n\n\tpublic static inline function isView(arg:Dynamic):Bool\n\t{\n\t\treturn (arg != null && (arg is ArrayBufferView));\n\t}\n\n\tpublic inline function slice(begin:Int, end:Null<Int> = null)\n\t{\n\t\tif (end == null) end = this.length;\n\t\tif (begin < 0) begin = 0;\n\t\tif (end > this.length) end = this.length;\n\t\tvar length = end - begin;\n\t\tif (begin < 0 || length <= 0)\n\t\t{\n\t\t\treturn new ArrayBuffer(0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar bytes = Bytes.alloc(length);\n\t\t\tbytes.blit(0, this, begin, length);\n\t\t\treturn cast bytes;\n\t\t}\n\t}\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/ArrayBufferView.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\ntypedef ArrayBufferView = #if haxe4 js.lib.ArrayBufferView #else js.html.ArrayBufferView #end;\n#else\nimport lime.system.System;\nimport lime.system.Endian;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass ArrayBufferView\n{\n\tpublic var type = TypedArrayType.None;\n\tpublic var buffer:ArrayBuffer;\n\tpublic var byteOffset:Int;\n\tpublic var byteLength:Int;\n\tpublic var length:Int;\n\n\t// internal for avoiding switching on types\n\tvar bytesPerElement(default, null):Int = 0;\n\n\t@:allow(lime.utils)\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction new(elements:Null<Int> = null, in_type:TypedArrayType)\n\t{\n\t\ttype = in_type;\n\t\tbytesPerElement = bytesForType(type);\n\n\t\t// other constructor types use\n\t\t// the init calls below\n\t\tif (elements != null && elements != 0)\n\t\t{\n\t\t\tif (elements < 0) elements = 0;\n\t\t\t// :note:spec: also has, platform specific max int?\n\t\t\t// elements = min(elements,maxint);\n\n\t\t\tbyteOffset = 0;\n\t\t\tbyteLength = toByteLength(elements);\n\t\t\tbuffer = new ArrayBuffer(byteLength);\n\t\t\tlength = elements;\n\t\t}\n\t} // new\n\n\t// Constructor helpers\n\t@:allow(lime.utils)\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction initTypedArray(view:ArrayBufferView)\n\t{\n\t\tvar srcData = view.buffer;\n\t\tvar srcLength = view.length;\n\t\tvar srcByteOffset = view.byteOffset;\n\t\tvar srcElementSize = view.bytesPerElement;\n\t\tvar elementSize = bytesPerElement;\n\n\t\t// same species, so just blit the data\n\t\t// in other words, it shares the same bytes per element etc\n\t\tif (view.type == type)\n\t\t{\n\t\t\tcloneBuffer(srcData, srcByteOffset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// see :note:1: below use FPHelper!\n\t\t\tthrow(\"unimplemented\");\n\t\t}\n\n\t\tbyteLength = bytesPerElement * srcLength;\n\t\tbyteOffset = 0;\n\t\tlength = srcLength;\n\n\t\treturn this;\n\t} // (typedArray)\n\n\t@:allow(lime.utils)\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction initBuffer(in_buffer:ArrayBuffer, in_byteOffset:Int = 0, len:Null<Int> = null)\n\t{\n\t\tif (in_byteOffset < 0) throw TAError.RangeError;\n\t\tif (in_byteOffset % bytesPerElement != 0) throw TAError.RangeError;\n\n\t\tvar bufferByteLength = in_buffer.length;\n\t\tvar elementSize = bytesPerElement;\n\t\tvar newByteLength = bufferByteLength;\n\n\t\tif (len == null)\n\t\t{\n\t\t\tnewByteLength = bufferByteLength - in_byteOffset;\n\n\t\t\tif (bufferByteLength % bytesPerElement != 0) throw TAError.RangeError;\n\t\t\tif (newByteLength < 0) throw TAError.RangeError;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnewByteLength = len * bytesPerElement;\n\n\t\t\tvar newRange = in_byteOffset + newByteLength;\n\t\t\tif (newRange > bufferByteLength) throw TAError.RangeError;\n\t\t}\n\n\t\tbuffer = in_buffer;\n\t\tbyteOffset = in_byteOffset;\n\t\tbyteLength = newByteLength;\n\t\tlength = Std.int(newByteLength / bytesPerElement);\n\n\t\treturn this;\n\t} // (buffer [, byteOffset [, length]])\n\n\t@:allow(lime.utils)\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction initArray<T>(array:Array<T>)\n\t{\n\t\tbyteOffset = 0;\n\t\tlength = array.length;\n\t\tbyteLength = toByteLength(length);\n\n\t\tbuffer = new ArrayBuffer(byteLength);\n\t\tcopyFromArray(cast array);\n\n\t\treturn this;\n\t}\n\n\t// Public shared APIs\n\t// T is required because it can translate [0,0] as Int array\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function set<T>(view:ArrayBufferView = null, array:Array<T> = null, offset:Int = 0):Void\n\t{\n\t\tif (view != null && array == null)\n\t\t{\n\t\t\tif (offset + view.length > this.length) {\n\t\t\t\tthrow TAError.RangeError;\n\t\t\t}\n\t\t\tif (bytesPerElement == view.bytesPerElement)\n\t\t\t{\n\t\t\t\tbuffer.blit(toByteLength(offset), view.buffer, view.byteOffset, view.byteLength);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (i in 0...view.length)\n\t\t\t\t{\n\t\t\t\t\ttransferElement(view, i, this, offset + i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (array != null && view == null)\n\t\t{\n\t\t\tcopyFromArray(cast array, offset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid .set call. either view, or array must be not-null.\";\n\t\t}\n\t}\n\n\t// Internal TypedArray api\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction cloneBuffer(src:ArrayBuffer, srcByteOffset:Int = 0)\n\t{\n\t\tvar srcLength = src.length;\n\t\tvar cloneLength = srcLength - srcByteOffset;\n\n\t\tbuffer = new ArrayBuffer(cloneLength);\n\t\tbuffer.blit(0, src, srcByteOffset, cloneLength);\n\t}\n\n\t@:generic\n\t@:allow(lime.utils)\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction subarray<T_subarray>(begin:Int, end:Null<Int> = null):T_subarray\n\t{\n\t\tif (end == null) end = length;\n\t\tvar len = end - begin;\n\t\tif (len < 0) len = 0;\n\t\tif (len > this.length) len = this.length;\n\t\tvar byte_offset = toByteLength(begin) + byteOffset;\n\n\t\tvar view:ArrayBufferView = switch (type)\n\t\t{\n\t\t\tcase Int8:\n\t\t\t\tnew Int8Array(buffer, byte_offset, len);\n\n\t\t\tcase Int16:\n\t\t\t\tnew Int16Array(buffer, byte_offset, len);\n\n\t\t\tcase Int32:\n\t\t\t\tnew Int32Array(buffer, byte_offset, len);\n\n\t\t\tcase Uint8:\n\t\t\t\tnew UInt8Array(buffer, byte_offset, len);\n\n\t\t\tcase Uint8Clamped:\n\t\t\t\tnew UInt8ClampedArray(buffer, byte_offset, len);\n\n\t\t\tcase Uint16:\n\t\t\t\tnew UInt16Array(buffer, byte_offset, len);\n\n\t\t\tcase Uint32:\n\t\t\t\tnew UInt32Array(buffer, byte_offset, len);\n\n\t\t\tcase Float32:\n\t\t\t\tnew Float32Array(buffer, byte_offset, len);\n\n\t\t\tcase Float64:\n\t\t\t\tnew Float64Array(buffer, byte_offset, len);\n\n\t\t\tcase None:\n\t\t\t\tthrow \"subarray on a blank ArrayBufferView\";\n\t\t}\n\n\t\treturn cast view;\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction bytesForType(type:TypedArrayType):Int\n\t{\n\t\treturn switch (type)\n\t\t{\n\t\t\tcase Int8:\n\t\t\t\tInt8Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Uint8:\n\t\t\t\tUInt8Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Uint8Clamped:\n\t\t\t\tUInt8ClampedArray.BYTES_PER_ELEMENT;\n\n\t\t\tcase Int16:\n\t\t\t\tInt16Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Uint16:\n\t\t\t\tUInt16Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Int32:\n\t\t\t\tInt32Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Uint32:\n\t\t\t\tUInt32Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Float32:\n\t\t\t\tFloat32Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase Float64:\n\t\t\t\tFloat64Array.BYTES_PER_ELEMENT;\n\n\t\t\tcase _: 1;\n\t\t}\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction toString()\n\t{\n\t\tvar name = switch (type)\n\t\t{\n\t\t\tcase Int8: 'Int8Array';\n\t\t\tcase Uint8: 'UInt8Array';\n\t\t\tcase Uint8Clamped: 'UInt8ClampedArray';\n\t\t\tcase Int16: 'Int16Array';\n\t\t\tcase Uint16: 'UInt16Array';\n\t\t\tcase Int32: 'Int32Array';\n\t\t\tcase Uint32: 'UInt32Array';\n\t\t\tcase Float32: 'Float32Array';\n\t\t\tcase Float64: 'Float64Array';\n\t\t\tcase _: 'ArrayBufferView';\n\t\t}\n\n\t\treturn name + ' [byteLength:${this.byteLength}, length:${this.length}]';\n\t} // toString\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tfunction toByteLength(elemCount:Int):Int\n\t{\n\t\treturn elemCount * bytesPerElement;\n\t}\n\n\t// Non-spec\n\t#if !no_typedarray_inline\n\t#end\n\tfunction copyFromArray(array:Array<#if hl Dynamic #else Float #end>, offset:Int = 0)\n\t{\n\t\t// Ideally, native semantics could be used, like cpp.NativeArray.blit\n\t\tvar i = 0, len = array.length;\n\n\t\tif (offset + len > this.length) {\n\t\t\tthrow TAError.RangeError;\n\t\t}\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase Int8:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setInt8(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setInt8(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Int16:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setInt16(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setInt16(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Int32:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setInt32(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setInt32(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Uint8:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setUint8(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setUint8(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Uint16:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setUint16(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setUint16(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Uint32:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setUint32(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setUint32(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Uint8Clamped:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\t#if neko\n\t\t\t\t\tvar value = array[i];\n\t\t\t\t\tif (value == null) value = 0;\n\t\t\t\t\tArrayBufferIO.setUint8Clamped(buffer, pos, Std.int(value));\n\t\t\t\t\t#else\n\t\t\t\t\tArrayBufferIO.setUint8Clamped(buffer, pos, Std.int(array[i]));\n\t\t\t\t\t#end\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Float32:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\tArrayBufferIO.setFloat32(buffer, pos, array[i]);\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\tcase Float64:\n\t\t\t\twhile (i < len)\n\t\t\t\t{\n\t\t\t\t\tvar pos = (offset + i) * bytesPerElement;\n\t\t\t\t\tArrayBufferIO.setFloat64(buffer, pos, array[i]);\n\t\t\t\t\t++i;\n\t\t\t\t}\n\n\t\t\tcase None:\n\t\t\t\tthrow \"copyFromArray on a base type ArrayBuffer\";\n\t\t}\n\t}\n\n\tstatic function transferElement(fromView:ArrayBufferView, fromIndex:Int, toView:ArrayBufferView, toIndex:Int):Void\n\t{\n\t\tvar fromValue:Dynamic = null;\n\t\tvar fromPos = fromView.byteOffset + (fromIndex * fromView.bytesPerElement);\n\t\tswitch (fromView.type)\n\t\t{\n\t\t\tcase Int8:\n\t\t\t\tfromValue = ArrayBufferIO.getInt8(fromView.buffer, fromPos);\n\t\t\tcase Int16:\n\t\t\t\tfromValue = ArrayBufferIO.getInt16(fromView.buffer, fromPos);\n\t\t\tcase Int32:\n\t\t\t\tfromValue = ArrayBufferIO.getInt32(fromView.buffer, fromPos);\n\t\t\tcase Uint8:\n\t\t\t\tfromValue = ArrayBufferIO.getUint8(fromView.buffer, fromPos);\n\t\t\tcase Uint16:\n\t\t\t\tfromValue = ArrayBufferIO.getUint16(fromView.buffer, fromPos);\n\t\t\tcase Uint32:\n\t\t\t\tfromValue = ArrayBufferIO.getUint32(fromView.buffer, fromPos);\n\t\t\tcase Uint8Clamped:\n\t\t\t\tfromValue = ArrayBufferIO.getUint8(fromView.buffer, fromPos);\n\t\t\tcase Float32:\n\t\t\t\tfromValue = ArrayBufferIO.getFloat32(fromView.buffer, fromPos);\n\t\t\tcase Float64:\n\t\t\t\tfromValue = ArrayBufferIO.getFloat64(fromView.buffer, fromPos);\n\t\t\tcase None:\n\t\t\t\tthrow \"transferElement on a base type ArrayBuffer\";\n\t\t}\n\n\t\tvar toPos = toView.byteOffset + (toIndex * toView.bytesPerElement);\n\t\tswitch (toView.type)\n\t\t{\n\t\t\tcase Int8:\n\t\t\t\tArrayBufferIO.setInt8(toView.buffer, toPos, fromValue);\n\t\t\tcase Int16:\n\t\t\t\tArrayBufferIO.setInt16(toView.buffer, toPos, fromValue);\n\t\t\tcase Int32:\n\t\t\t\tArrayBufferIO.setInt32(toView.buffer, toPos, fromValue);\n\t\t\tcase Uint8:\n\t\t\t\tArrayBufferIO.setUint8(toView.buffer, toPos, fromValue);\n\t\t\tcase Uint16:\n\t\t\t\tArrayBufferIO.setUint16(toView.buffer, toPos, fromValue);\n\t\t\tcase Uint32:\n\t\t\t\tArrayBufferIO.setUint32(toView.buffer, toPos, fromValue);\n\t\t\tcase Uint8Clamped:\n\t\t\t\tArrayBufferIO.setUint8Clamped(toView.buffer, toPos, fromValue);\n\t\t\tcase Float32:\n\t\t\t\tArrayBufferIO.setFloat32(toView.buffer, toPos, fromValue);\n\t\t\tcase Float64:\n\t\t\t\tArrayBufferIO.setFloat64(toView.buffer, toPos, fromValue);\n\t\t\tcase None:\n\t\t\t\tthrow \"transferElement on a base type ArrayBuffer\";\n\t\t}\n\t}\n\n} // ArrayBufferView\n\n#end // !js\n@:noCompletion @:dox(hide) enum TAError\n{\n\tRangeError;\n}\n\n@:noCompletion @:dox(hide) #if (haxe_ver >= 4.0) enum #else @:enum #end\nabstract TypedArrayType(Int) from Int to Int\n{\n\tvar None = 0;\n\tvar Int8 = 1;\n\tvar Int16 = 2;\n\tvar Int32 = 3;\n\tvar Uint8 = 4;\n\tvar Uint8Clamped = 5;\n\tvar Uint16 = 6;\n\tvar Uint32 = 7;\n\tvar Float32 = 8;\n\tvar Float64 = 9;\n}\n\n#if (!js || doc_gen)\n@:noCompletion @:dox(hide) class ArrayBufferIO\n{\n\t// 8\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getInt8(buffer:ArrayBuffer, byteOffset:Int):Int\n\t{\n\t\t#if cpp\n\t\tvar val:Int = untyped __global__.__hxcpp_memory_get_byte(buffer.getData(), byteOffset) & 0xFF;\n\t\treturn ((val & 0x80) != 0) ? (val - 0x100) : val;\n\t\t#else\n\t\tvar val:Int = buffer.get(byteOffset);\n\t\treturn ((val & 0x80) != 0) ? (val - 0x100) : val;\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setInt8(buffer:ArrayBuffer, byteOffset:Int, value:Int)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_byte(buffer.getData(), byteOffset, value & 0xFF);\n\t\t#elseif neko\n\t\tif (value == null) value = 0;\n\t\tuntyped __dollar__sset(buffer.b, byteOffset, value & 0xFF);\n\t\t#else\n\t\tbuffer.set(byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getUint8(buffer:ArrayBuffer, byteOffset:Int):Null<UInt>\n\t{\n\t\t#if cpp\n\t\treturn untyped __global__.__hxcpp_memory_get_byte(buffer.getData(), byteOffset) & 0xFF;\n\t\t#else\n\t\treturn buffer.get(byteOffset);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setUint8Clamped(buffer:ArrayBuffer, byteOffset:Int, value:UInt)\n\t{\n\t\tsetUint8(buffer, byteOffset, _clamp(value));\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setUint8(buffer:ArrayBuffer, byteOffset:Int, value:UInt)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_byte(buffer.getData(), byteOffset, value & 0xFF);\n\t\t#else\n\t\t#if neko\n\t\tif (value == null) value = 0;\n\t\t#end\n\t\tbuffer.set(byteOffset, value);\n\t\t#end\n\t}\n\n\t// 16\n\tpublic static function getInt16(buffer:ArrayBuffer, byteOffset:Int):Int\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_i16(buffer.getData(), byteOffset);\n\t\t#else\n\t\tvar ch1 = buffer.get(byteOffset);\n\t\tvar ch2 = buffer.get(byteOffset + 1);\n\n\t\tvar val = ((ch2 << 8) | ch1);\n\n\t\treturn ((val & 0x8000) != 0) ? (val - 0x10000) : (val);\n\t\t#end\n\t}\n\n\tpublic static function getInt16_BE(buffer:ArrayBuffer, byteOffset:Int):Int\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tvar ch1:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset) & 0xFF;\n\t\tvar ch2:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 1) & 0xFF;\n\t\tvar val = ((ch1 << 8) | ch2);\n\t\treturn ((val & 0x8000) != 0) ? (val - 0x10000) : (val);\n\t\t#else\n\t\tvar ch1 = buffer.get(byteOffset);\n\t\tvar ch2 = buffer.get(byteOffset + 1);\n\t\tvar val = ((ch1 << 8) | ch2);\n\t\treturn ((val & 0x8000) != 0) ? (val - 0x10000) : (val);\n\t\t#end\n\t}\n\n\tpublic static function setInt16(buffer:ArrayBuffer, byteOffset:Int, value:Int)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_i16(buffer.getData(), byteOffset, value);\n\t\t#elseif neko\n\t\tif (value == null) value = 0;\n\t\tuntyped var b = buffer.b;\n\t\tuntyped __dollar__sset(b, byteOffset, (value) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 1, (value >> 8) & 0xFF);\n\t\t#else\n\t\tbuffer.set(byteOffset, (value) & 0xFF);\n\t\tbuffer.set(byteOffset + 1, (value >> 8) & 0xFF);\n\t\t#end\n\t}\n\n\tpublic static function setInt16_BE(buffer:ArrayBuffer, byteOffset:Int, value:Int)\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset, (value >> 8) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 1, value & 0xFF);\n\t\t#elseif neko\n\t\tif (value == null) value = 0;\n\t\tuntyped var b = buffer.b;\n\t\tuntyped __dollar__sset(b, byteOffset, (value >> 8) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 1, (value) & 0xFF);\n\t\t#else\n\t\tbuffer.set(byteOffset, (value >> 8) & 0xFF);\n\t\tbuffer.set(byteOffset + 1, (value) & 0xFF);\n\t\t#end\n\t} // setInt16_BE\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getUint16(buffer:ArrayBuffer, byteOffset:Int):Null<UInt>\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_ui16(buffer.getData(), byteOffset) & 0xFFFF;\n\t\t#else\n\t\tvar ch1 = buffer.get(byteOffset);\n\t\tvar ch2 = buffer.get(byteOffset + 1);\n\n\t\treturn ((ch2 << 8) | ch1);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getUint16_BE(buffer:ArrayBuffer, byteOffset:Int):Null<UInt>\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tvar ch1:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset) & 0xFF;\n\t\tvar ch2:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 1) & 0xFF;\n\t\treturn ((ch1 << 8) | ch2);\n\t\t#else\n\t\tvar ch1 = buffer.get(byteOffset);\n\t\tvar ch2 = buffer.get(byteOffset + 1);\n\t\treturn ((ch1 << 8) | ch2);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setUint16(buffer:ArrayBuffer, byteOffset:Int, value:UInt)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_ui16(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\tsetInt16(buffer, byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setUint16_BE(buffer:ArrayBuffer, byteOffset:Int, value:UInt)\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset, (value >> 8) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 1, value & 0xFF);\n\t\t#elseif neko\n\t\tif (value == null) value = 0;\n\t\tuntyped var b = buffer.b;\n\t\tuntyped __dollar__sset(b, byteOffset, (value >> 8) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 1, (value) & 0xFF);\n\t\t#else\n\t\tbuffer.set(byteOffset, (value >> 8) & 0xFF);\n\t\tbuffer.set(byteOffset + 1, (value) & 0xFF);\n\t\t#end\n\t}\n\n\t// 32\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getInt32(buffer:ArrayBuffer, byteOffset:Int):Int\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_i32(buffer.getData(), byteOffset);\n\t\t#else\n\t\treturn buffer.getInt32(byteOffset);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getInt32_BE(buffer:ArrayBuffer, byteOffset:Int):Int\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tvar ch1:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset) & 0xFF;\n\t\tvar ch2:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 1) & 0xFF;\n\t\tvar ch3:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 2) & 0xFF;\n\t\tvar ch4:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 3) & 0xFF;\n\t\treturn (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4;\n\t\t#else\n\t\tvar ch1 = buffer.get(byteOffset);\n\t\tvar ch2 = buffer.get(byteOffset + 1);\n\t\tvar ch3 = buffer.get(byteOffset + 2);\n\t\tvar ch4 = buffer.get(byteOffset + 3);\n\t\treturn (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4;\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setInt32(buffer:ArrayBuffer, byteOffset:Int, value:Int)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_i32(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\t#if neko\n\t\tif (value == null) value = 0;\n\t\t#end\n\n\t\tbuffer.setInt32(byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setInt32_BE(buffer:ArrayBuffer, byteOffset:Int, value:Int)\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset, (value >> 24) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 1, (value >> 16) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 2, (value >> 8) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 3, value & 0xFF);\n\t\t#elseif neko\n\t\tif (value == null) value = 0;\n\t\tuntyped var b = buffer.b;\n\t\tuntyped __dollar__sset(b, byteOffset, (value >> 24) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 1, (value >> 16) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 2, (value >> 8) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 3, value & 0xFF);\n\t\t#else\n\t\tbuffer.set(byteOffset, (value >> 24) & 0xFF);\n\t\tbuffer.set(byteOffset + 1, (value >> 16) & 0xFF);\n\t\tbuffer.set(byteOffset + 2, (value >> 8) & 0xFF);\n\t\tbuffer.set(byteOffset + 3, value & 0xFF);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getUint32(buffer:ArrayBuffer, byteOffset:Int):Null<UInt>\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_ui32(buffer.getData(), byteOffset);\n\t\t#else\n\t\tvar ch1:Int = buffer.get(byteOffset);\n\t\tvar ch2:Int = buffer.get(byteOffset + 1);\n\t\tvar ch3:Int = buffer.get(byteOffset + 2);\n\t\tvar ch4:Int = buffer.get(byteOffset + 3);\n\t\treturn ch1 | (ch2 << 8) | (ch3 << 16) | (ch4 << 24);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getUint32_BE(buffer:ArrayBuffer, byteOffset:Int):Null<UInt>\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tvar ch1:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset) & 0xFF;\n\t\tvar ch2:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 1) & 0xFF;\n\t\tvar ch3:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 2) & 0xFF;\n\t\tvar ch4:Int = untyped __global__.__hxcpp_memory_get_byte(bufferData, byteOffset + 3) & 0xFF;\n\t\treturn (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4;\n\t\t#else\n\t\tvar ch1 = buffer.get(byteOffset);\n\t\tvar ch2 = buffer.get(byteOffset + 1);\n\t\tvar ch3 = buffer.get(byteOffset + 2);\n\t\tvar ch4 = buffer.get(byteOffset + 3);\n\t\treturn (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4;\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setUint32(buffer:ArrayBuffer, byteOffset:Int, value:UInt)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_ui32(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\tsetInt32(buffer, byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setUint32_BE(buffer:ArrayBuffer, byteOffset:Int, value:UInt):Void\n\t{\n\t\t#if cpp\n\t\tvar bufferData = buffer.getData();\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset, (value >> 24) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 1, (value >> 16) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 2, (value >> 8) & 0xFF);\n\t\tuntyped __global__.__hxcpp_memory_set_byte(bufferData, byteOffset + 3, value & 0xFF);\n\t\t#elseif neko\n\t\tif (value == null) value = 0;\n\t\tuntyped var b = buffer.b;\n\t\tuntyped __dollar__sset(b, byteOffset, (value >> 24) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 1, (value >> 16) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 2, (value >> 8) & 0xFF);\n\t\tuntyped __dollar__sset(b, byteOffset + 3, value & 0xFF);\n\t\t#else\n\t\tbuffer.set(byteOffset, (value >> 24) & 0xFF);\n\t\tbuffer.set(byteOffset + 1, (value >> 16) & 0xFF);\n\t\tbuffer.set(byteOffset + 2, (value >> 8) & 0xFF);\n\t\tbuffer.set(byteOffset + 3, value & 0xFF);\n\t\t#end\n\t}\n\n\t// Float\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getFloat32(buffer:ArrayBuffer, byteOffset:Int):Float\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_float(buffer.getData(), byteOffset);\n\t\t#else\n\t\treturn buffer.getFloat(byteOffset);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getFloat32_BE(buffer:ArrayBuffer, byteOffset:Int):Float\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_float(buffer.getData(), byteOffset);\n\t\t#else\n\t\treturn buffer.getFloat(byteOffset);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setFloat32(buffer:ArrayBuffer, byteOffset:Int, value:Float)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_float(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\t#if neko\n\t\tif (value == null) value = 0;\n\t\t#end\n\t\tbuffer.setFloat(byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setFloat32_BE(buffer:ArrayBuffer, byteOffset:Int, value:Float)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_float(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\t#if neko\n\t\tif (value == null) value = 0;\n\t\t#end\n\t\tbuffer.setFloat(byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getFloat64(buffer:ArrayBuffer, byteOffset:Int):Float\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_double(buffer.getData(), byteOffset);\n\t\t#else\n\t\treturn buffer.getDouble(byteOffset);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function getFloat64_BE(buffer:ArrayBuffer, byteOffset:Int):Float\n\t{\n\t\t#if cpp\n\t\tuntyped return __global__.__hxcpp_memory_get_double(buffer.getData(), byteOffset);\n\t\t#else\n\t\treturn buffer.getDouble(byteOffset);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setFloat64(buffer:ArrayBuffer, byteOffset:Int, value:Float)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_double(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\t#if neko\n\t\tif (value == null) value = 0;\n\t\t#end\n\t\tbuffer.setDouble(byteOffset, value);\n\t\t#end\n\t}\n\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\tpublic static function setFloat64_BE(buffer:ArrayBuffer, byteOffset:Int, value:Float)\n\t{\n\t\t#if cpp\n\t\tuntyped __global__.__hxcpp_memory_set_double(buffer.getData(), byteOffset, value);\n\t\t#else\n\t\t#if neko\n\t\tif (value == null) value = 0;\n\t\t#end\n\t\tbuffer.setDouble(byteOffset, value);\n\t\t#end\n\t}\n\n\t// Internal\n\t#if !no_typedarray_inline\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end\n\tinline\n\t#end\n\t// clamp a Int to a 0-255 Uint8 (for Uint8Clamped array)\n\tstatic function _clamp(_in:Float):Int\n\t{\n\t\tvar _out = Std.int(_in);\n\t\t_out = _out > 255 ? 255 : _out;\n\t\treturn _out < 0 ? 0 : _out;\n\t} // _clamp\n}\n#else // #error \"ArrayBufferIO is not used on js target, use DataView instead\"\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/AssetBundle.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Bytes;\nimport haxe.io.BytesInput;\nimport haxe.io.Input;\nimport haxe.zip.Reader;\nimport lime.app.Future;\nimport lime.utils.Bytes as LimeBytes;\n#if sys\nimport sys.io.File;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass AssetBundle\n{\n\tpublic var data:Map<String, Bytes>;\n\tpublic var paths:Array<String>;\n\n\tpublic function new()\n\t{\n\t\t// compressed = new Map();\n\t\tdata = new Map();\n\t\tpaths = new Array();\n\t}\n\n\tpublic static function fromBytes(bytes:Bytes):AssetBundle\n\t{\n\t\tvar input = new BytesInput(bytes);\n\t\treturn __extractBundle(input);\n\t}\n\n\tpublic static function fromFile(path:String):AssetBundle\n\t{\n\t\t#if sys\n\t\tvar input = File.read(path);\n\t\treturn __extractBundle(input);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function loadFromBytes(bytes:Bytes):Future<AssetBundle>\n\t{\n\t\treturn Future.withValue(fromBytes(bytes));\n\t}\n\n\tpublic static function loadFromFile(path:String):Future<AssetBundle>\n\t{\n\t\treturn LimeBytes.loadFromFile(path).then(loadFromBytes);\n\t}\n\n\t@:noCompletion private static function __extractBundle(input:Input):AssetBundle\n\t{\n\t\tvar entries = Reader.readZip(input);\n\n\t\tvar bundle = new AssetBundle();\n\n\t\tfor (entry in entries)\n\t\t{\n\t\t\tif (entry.compressed)\n\t\t\t{\n\t\t\t\tvar bytes:LimeBytes = entry.data;\n\t\t\t\tbundle.data.set(entry.fileName, bytes.decompress(DEFLATE));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbundle.data.set(entry.fileName, entry.data);\n\t\t\t}\n\t\t\tbundle.paths.push(entry.fileName);\n\t\t}\n\n\t\treturn bundle;\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/AssetCache.hx",
    "content": "package lime.utils;\n\nimport haxe.macro.Compiler;\nimport lime.media.AudioBuffer;\nimport lime.graphics.Image;\n#if !(macro || commonjs)\nimport lime._internal.macros.AssetsMacro;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass AssetCache\n{\n\tpublic var audio:Map<String, AudioBuffer>;\n\tpublic var enabled:Bool = true;\n\tpublic var image:Map<String, Image>;\n\tpublic var font:Map<String, Dynamic /*Font*/>;\n\tpublic var version:Int;\n\n\tpublic function new()\n\t{\n\t\taudio = new Map<String, AudioBuffer>();\n\t\tfont = new Map<String, Dynamic /*Font*/>();\n\t\timage = new Map<String, Image>();\n\n\t\t#if (macro || commonjs || lime_disable_assets_version)\n\t\tversion = 0;\n\t\t#elseif lime_assets_version\n\t\tversion = Std.parseInt(Compiler.getDefine(\"lime-assets-version\"));\n\t\t#else\n\t\tversion = AssetsMacro.cacheVersion();\n\t\t#end\n\t}\n\n\tpublic function exists(id:String, ?type:AssetType):Bool\n\t{\n\t\tif (type == AssetType.IMAGE || type == null)\n\t\t{\n\t\t\tif (image.exists(id)) return true;\n\t\t}\n\n\t\tif (type == AssetType.FONT || type == null)\n\t\t{\n\t\t\tif (font.exists(id)) return true;\n\t\t}\n\n\t\tif (type == AssetType.SOUND || type == AssetType.MUSIC || type == null)\n\t\t{\n\t\t\tif (audio.exists(id)) return true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic function set(id:String, type:AssetType, asset:Dynamic):Void\n\t{\n\t\tswitch (type)\n\t\t{\n\t\t\tcase FONT:\n\t\t\t\tfont.set(id, asset);\n\n\t\t\tcase IMAGE:\n\t\t\t\tif (!(asset is Image)) throw \"Cannot cache non-Image asset: \" + asset + \" as Image\";\n\n\t\t\t\timage.set(id, asset);\n\n\t\t\tcase SOUND, MUSIC:\n\t\t\t\tif (!(asset is AudioBuffer)) throw \"Cannot cache non-AudioBuffer asset: \" + asset + \" as AudioBuffer\";\n\n\t\t\t\taudio.set(id, asset);\n\n\t\t\tdefault:\n\t\t\t\tthrow type + \" assets are not cachable\";\n\t\t}\n\t}\n\n\tpublic function clear(prefix:String = null):Void\n\t{\n\t\tif (prefix == null)\n\t\t{\n\t\t\taudio = new Map<String, AudioBuffer>();\n\t\t\tfont = new Map<String, Dynamic /*Font*/>();\n\t\t\timage = new Map<String, Image>();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar keys = audio.keys();\n\n\t\t\tfor (key in keys)\n\t\t\t{\n\t\t\t\tif (StringTools.startsWith(key, prefix))\n\t\t\t\t{\n\t\t\t\t\taudio.remove(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar keys = font.keys();\n\n\t\t\tfor (key in keys)\n\t\t\t{\n\t\t\t\tif (StringTools.startsWith(key, prefix))\n\t\t\t\t{\n\t\t\t\t\tfont.remove(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar keys = image.keys();\n\n\t\t\tfor (key in keys)\n\t\t\t{\n\t\t\t\tif (StringTools.startsWith(key, prefix))\n\t\t\t\t{\n\t\t\t\t\timage.remove(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/AssetLibrary.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Path;\nimport lime.app.Event;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.media.AudioBuffer;\nimport lime.graphics.Image;\nimport lime.net.HTTPRequest;\nimport lime.text.Font;\nimport lime.utils.AssetType;\n#if flash\nimport flash.display.BitmapData;\nimport flash.media.Sound;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime.text.Font)\n@:access(lime.utils.Assets)\nclass AssetLibrary\n{\n\tpublic var onChange = new Event<Void->Void>();\n\n\t@:noCompletion private var assetsLoaded:Int;\n\t@:noCompletion private var assetsTotal:Int;\n\t@:noCompletion private var bytesLoaded:Int;\n\t@:noCompletion private var bytesLoadedCache:Map<String, Int>;\n\t@:noCompletion private var bytesTotal:Int;\n\t@:noCompletion private var cachedAudioBuffers = new Map<String, AudioBuffer>();\n\t@:noCompletion private var cachedBytes = new Map<String, Bytes>();\n\t@:noCompletion private var cachedFonts = new Map<String, Font>();\n\t@:noCompletion private var cachedImages = new Map<String, Image>();\n\t@:noCompletion private var cachedText = new Map<String, String>();\n\t@:noCompletion private var classTypes = new Map<String, Class<Dynamic>>();\n\t@:noCompletion private var loaded:Bool;\n\t@:noCompletion private var pathGroups = new Map<String, Array<String>>();\n\t@:noCompletion private var paths = new Map<String, String>();\n\t@:noCompletion private var preload = new Map<String, Bool>();\n\t@:noCompletion private var promise:Promise<AssetLibrary>;\n\t@:noCompletion private var sizes = new Map<String, Int>();\n\t@:noCompletion private var types = new Map<String, AssetType>();\n\n\tpublic function new()\n\t{\n\t\tbytesLoaded = 0;\n\t\tbytesTotal = 0;\n\t}\n\n\tpublic function exists(id:String, type:String):Bool\n\t{\n\t\tvar requestedType = type != null ? cast(type, AssetType) : null;\n\t\tvar assetType = types.get(id);\n\n\t\tif (assetType != null)\n\t\t{\n\t\t\tif (assetType == requestedType\n\t\t\t\t|| ((requestedType == SOUND || requestedType == MUSIC) && (assetType == MUSIC || assetType == SOUND)))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t#if flash\n\t\t\tif (requestedType == BINARY && (assetType == BINARY || assetType == TEXT || assetType == IMAGE))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (requestedType == TEXT && assetType == BINARY)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (requestedType == null || paths.exists(id))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t#else\n\t\t\tif (requestedType == BINARY || requestedType == null || (assetType == BINARY && requestedType == TEXT))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t#end\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic static function fromBytes(bytes:Bytes, rootPath:String = null):AssetLibrary\n\t{\n\t\treturn fromManifest(AssetManifest.fromBytes(bytes, rootPath));\n\t}\n\n\tpublic static function fromFile(path:String, rootPath:String = null):AssetLibrary\n\t{\n\t\treturn fromManifest(AssetManifest.fromFile(path, rootPath));\n\t}\n\n\tpublic static function fromBundle(bundle:AssetBundle):AssetLibrary\n\t{\n\t\tif (bundle.data.exists(\"library.json\"))\n\t\t{\n\t\t\tvar manifest = AssetManifest.fromBytes(bundle.data.get(\"library.json\"));\n\t\t\tif (manifest != null)\n\t\t\t{\n\t\t\t\tvar library:AssetLibrary = null;\n\n\t\t\t\tif (manifest.libraryType == null)\n\t\t\t\t{\n\t\t\t\t\tlibrary = new AssetLibrary();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar libraryClass = Type.resolveClass(manifest.libraryType);\n\n\t\t\t\t\tif (libraryClass != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tlibrary = Type.createInstance(libraryClass, manifest.libraryArgs);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.warn(\"Could not find library type: \" + manifest.libraryType);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlibrary.__fromBundle(bundle, manifest);\n\t\t\t\treturn library;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar library = new AssetLibrary();\n\t\t\tlibrary.__fromBundle(bundle);\n\t\t\treturn library;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static function fromManifest(manifest:AssetManifest):AssetLibrary\n\t{\n\t\tif (manifest == null) return null;\n\n\t\tvar library:AssetLibrary = null;\n\n\t\tif (manifest.libraryType == null)\n\t\t{\n\t\t\tlibrary = new AssetLibrary();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar libraryClass = Type.resolveClass(manifest.libraryType);\n\n\t\t\tif (libraryClass != null)\n\t\t\t{\n\t\t\t\tlibrary = Type.createInstance(libraryClass, manifest.libraryArgs);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.warn(\"Could not find library type: \" + manifest.libraryType);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tlibrary.__fromManifest(manifest);\n\n\t\treturn library;\n\t}\n\n\tpublic function getAsset(id:String, type:String):Dynamic\n\t{\n\t\treturn switch (type)\n\t\t{\n\t\t\tcase BINARY: getBytes(id);\n\t\t\tcase FONT: getFont(id);\n\t\t\tcase IMAGE: getImage(id);\n\t\t\tcase MUSIC, SOUND: getAudioBuffer(id);\n\t\t\tcase TEXT: getText(id);\n\n\t\t\tcase TEMPLATE: throw \"Not sure how to get template: \" + id;\n\t\t\tdefault: throw \"Unknown asset type: \" + type;\n\t\t}\n\t}\n\n\tpublic function getAudioBuffer(id:String):AudioBuffer\n\t{\n\t\tif (cachedAudioBuffers.exists(id))\n\t\t{\n\t\t\treturn cachedAudioBuffers.get(id);\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\t#if flash\n\t\t\tvar buffer = new AudioBuffer();\n\t\t\tbuffer.src = cast(Type.createInstance(classTypes.get(id), []), Sound);\n\t\t\treturn buffer;\n\t\t\t#else\n\t\t\treturn AudioBuffer.fromBytes(cast(Type.createInstance(classTypes.get(id), []), Bytes));\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn AudioBuffer.fromFile(getPath(id));\n\t\t}\n\t}\n\n\tpublic function getBytes(id:String):Bytes\n\t{\n\t\tif (cachedBytes.exists(id))\n\t\t{\n\t\t\treturn cachedBytes.get(id);\n\t\t}\n\t\telse if (cachedText.exists(id))\n\t\t{\n\t\t\tvar bytes = Bytes.ofString(cachedText.get(id));\n\t\t\tcachedBytes.set(id, bytes);\n\t\t\treturn bytes;\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\t#if flash\n\t\t\tvar data = Type.createInstance(classTypes.get(id), []);\n\n\t\t\tswitch (types.get(id))\n\t\t\t{\n\t\t\t\tcase TEXT, BINARY:\n\t\t\t\t\treturn Bytes.ofData(cast(Type.createInstance(classTypes.get(id), []), flash.utils.ByteArray));\n\n\t\t\t\tcase IMAGE:\n\t\t\t\t\tvar bitmapData = cast(Type.createInstance(classTypes.get(id), []), BitmapData);\n\t\t\t\t\treturn Bytes.ofData(bitmapData.getPixels(bitmapData.rect));\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t\t#else\n\t\t\treturn cast(Type.createInstance(classTypes.get(id), []), Bytes);\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Bytes.fromFile(getPath(id));\n\t\t}\n\t}\n\n\tpublic function getFont(id:String):Font\n\t{\n\t\tif (cachedFonts.exists(id))\n\t\t{\n\t\t\treturn cachedFonts.get(id);\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\t#if flash\n\t\t\tvar src = Type.createInstance(classTypes.get(id), []);\n\n\t\t\tvar font = new Font(src.fontName);\n\t\t\tfont.src = src;\n\t\t\treturn font;\n\t\t\t#else\n\t\t\treturn cast(Type.createInstance(classTypes.get(id), []), Font);\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Font.fromFile(getPath(id));\n\t\t}\n\t}\n\n\tpublic function getImage(id:String):Image\n\t{\n\t\tif (cachedImages.exists(id))\n\t\t{\n\t\t\treturn cachedImages.get(id);\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\t#if flash\n\t\t\treturn Image.fromBitmapData(cast(Type.createInstance(classTypes.get(id), []), BitmapData));\n\t\t\t#else\n\t\t\treturn cast(Type.createInstance(classTypes.get(id), []), Image);\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Image.fromFile(getPath(id));\n\t\t}\n\t}\n\n\tpublic function getPath(id:String):String\n\t{\n\t\tif (paths.exists(id))\n\t\t{\n\t\t\treturn paths.get(id);\n\t\t}\n\t\telse if (pathGroups.exists(id))\n\t\t{\n\t\t\treturn pathGroups.get(id)[0];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function getText(id:String):String\n\t{\n\t\tif (cachedText.exists(id))\n\t\t{\n\t\t\treturn cachedText.get(id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar bytes = getBytes(id);\n\n\t\t\tif (bytes == null)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn bytes.getString(0, bytes.length);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function isLocal(id:String, type:String):Bool\n\t{\n\t\t#if sys\n\t\treturn true;\n\t\t#else\n\t\tif (classTypes.exists(id))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn switch (cast(type, AssetType))\n\t\t{\n\t\t\tcase null:\n\t\t\t\tcachedBytes.exists(id) || cachedText.exists(id) || cachedImages.exists(id)\n\t\t\t\t\t|| cachedAudioBuffers.exists(id) || cachedFonts.exists(id);\n\n\t\t\tcase IMAGE:\n\t\t\t\tcachedImages.exists(id);\n\n\t\t\tcase MUSIC, SOUND:\n\t\t\t\tcachedAudioBuffers.exists(id);\n\n\t\t\tcase FONT:\n\t\t\t\tcachedFonts.exists(id);\n\n\t\t\tdefault:\n\t\t\t\tcachedBytes.exists(id) || cachedText.exists(id);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic function list(type:String):Array<String>\n\t{\n\t\tvar requestedType = type != null ? cast(type, AssetType) : null;\n\t\tvar items = [];\n\n\t\tfor (id in types.keys())\n\t\t{\n\t\t\tif (requestedType == null || exists(id, type))\n\t\t\t{\n\t\t\t\titems.push(id);\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t}\n\n\tpublic function loadAsset(id:String, type:String):Future<Dynamic>\n\t{\n\t\treturn switch (type)\n\t\t{\n\t\t\tcase BINARY: loadBytes(id);\n\t\t\tcase FONT: loadFont(id);\n\t\t\tcase IMAGE: loadImage(id);\n\t\t\tcase MUSIC, SOUND: loadAudioBuffer(id);\n\t\t\tcase TEXT: loadText(id);\n\n\t\t\tcase TEMPLATE: throw \"Not sure how to load template: \" + id;\n\t\t\tdefault: throw \"Unknown asset type: \" + type;\n\t\t}\n\t}\n\n\tpublic function load():Future<AssetLibrary>\n\t{\n\t\tif (loaded)\n\t\t{\n\t\t\treturn Future.withValue(this);\n\t\t}\n\n\t\tif (promise == null)\n\t\t{\n\t\t\tpromise = new Promise<AssetLibrary>();\n\t\t\tbytesLoadedCache = new Map();\n\n\t\t\tassetsLoaded = 0;\n\t\t\tassetsTotal = 1;\n\n\t\t\tfor (id in preload.keys())\n\t\t\t{\n\t\t\t\tif (!preload.get(id)) continue;\n\n\t\t\t\tLog.verbose(\"Preloading asset: \" + id + \" [\" + types.get(id) + \"]\");\n\n\t\t\t\tswitch (types.get(id))\n\t\t\t\t{\n\t\t\t\t\tcase BINARY:\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\t\tvar future = loadBytes(id);\n\t\t\t\t\t\tfuture.onProgress(load_onProgress.bind(id));\n\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\tfuture.onComplete(loadBytes_onComplete.bind(id));\n\n\t\t\t\t\tcase FONT:\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\t\tvar future = loadFont(id);\n\t\t\t\t\t\tfuture.onProgress(load_onProgress.bind(id));\n\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\tfuture.onComplete(loadFont_onComplete.bind(id));\n\n\t\t\t\t\tcase IMAGE:\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\t\tvar future = loadImage(id);\n\t\t\t\t\t\tfuture.onProgress(load_onProgress.bind(id));\n\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\tfuture.onComplete(loadImage_onComplete.bind(id));\n\n\t\t\t\t\tcase MUSIC, SOUND:\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\t\tvar future = loadAudioBuffer(id);\n\t\t\t\t\t\tfuture.onProgress(load_onProgress.bind(id));\n\t\t\t\t\t\tfuture.onError(loadAudioBuffer_onError.bind(id));\n\t\t\t\t\t\tfuture.onComplete(loadAudioBuffer_onComplete.bind(id));\n\n\t\t\t\t\tcase TEXT:\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\t\tvar future = loadText(id);\n\t\t\t\t\t\tfuture.onProgress(load_onProgress.bind(id));\n\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\tfuture.onComplete(loadText_onComplete.bind(id));\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t__assetLoaded(null);\n\t\t}\n\n\t\treturn promise.future;\n\t}\n\n\tpublic function loadAudioBuffer(id:String):Future<AudioBuffer>\n\t{\n\t\tif (cachedAudioBuffers.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedAudioBuffers.get(id));\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(AudioBuffer.fromBytes(cast(Type.createInstance(classTypes.get(id), []), Bytes)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pathGroups.exists(id))\n\t\t\t{\n\t\t\t\treturn AudioBuffer.loadFromFiles(pathGroups.get(id));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn AudioBuffer.loadFromFile(paths.get(id));\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function loadBytes(id:String):Future<Bytes>\n\t{\n\t\tif (cachedBytes.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedBytes.get(id));\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\t#if flash\n\t\t\treturn Future.withValue(Bytes.ofData(Type.createInstance(classTypes.get(id), [])));\n\t\t\t#else\n\t\t\treturn Future.withValue(Type.createInstance(classTypes.get(id), []));\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Bytes.loadFromFile(getPath(id));\n\t\t}\n\t}\n\n\tpublic function loadFont(id:String):Future<Font>\n\t{\n\t\tif (cachedFonts.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedFonts.get(id));\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\tvar font:Font = Type.createInstance(classTypes.get(id), []);\n\n\t\t\t#if (js && html5)\n\t\t\treturn font.__loadFromName(font.name);\n\t\t\t#else\n\t\t\treturn Future.withValue(font);\n\t\t\t#end\n\t\t}\n\t\telse\n\t\t{\n\t\t\t#if (js && html5)\n\t\t\treturn Font.loadFromName(getPath(id));\n\t\t\t#else\n\t\t\treturn Font.loadFromFile(getPath(id));\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic static function loadFromBytes(bytes:Bytes, rootPath:String = null):Future<AssetLibrary>\n\t{\n\t\treturn AssetManifest.loadFromBytes(bytes, rootPath).then(function(manifest)\n\t\t{\n\t\t\treturn loadFromManifest(manifest);\n\t\t});\n\t}\n\n\tpublic static function loadFromFile(path:String, rootPath:String = null):Future<AssetLibrary>\n\t{\n\t\treturn AssetManifest.loadFromFile(path, rootPath).then(function(manifest)\n\t\t{\n\t\t\treturn loadFromManifest(manifest);\n\t\t});\n\t}\n\n\tpublic static function loadFromManifest(manifest:AssetManifest):Future<AssetLibrary>\n\t{\n\t\tvar library = fromManifest(manifest);\n\n\t\tif (library != null)\n\t\t{\n\t\t\treturn library.load();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn cast Future.withError(\"Could not load asset manifest\");\n\t\t}\n\t}\n\n\tpublic function loadImage(id:String):Future<Image>\n\t{\n\t\tif (cachedImages.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedImages.get(id));\n\t\t}\n\t\telse if (classTypes.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(Type.createInstance(classTypes.get(id), []));\n\t\t}\n\t\telse if (cachedBytes.exists(id))\n\t\t{\n\t\t\treturn Image.loadFromBytes(cachedBytes.get(id)).then(function(image)\n\t\t\t{\n\t\t\t\tcachedBytes.remove(id);\n\t\t\t\tcachedImages.set(id, image);\n\t\t\t\treturn Future.withValue(image);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Image.loadFromFile(getPath(id));\n\t\t}\n\t}\n\n\tpublic function loadText(id:String):Future<String>\n\t{\n\t\tif (cachedText.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedText.get(id));\n\t\t}\n\t\telse if (cachedBytes.exists(id) || classTypes.exists(id))\n\t\t{\n\t\t\tvar bytes = getBytes(id);\n\n\t\t\tif (bytes == null)\n\t\t\t{\n\t\t\t\treturn cast Future.withValue(null);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar text = bytes.getString(0, bytes.length);\n\t\t\t\tcachedText.set(id, text);\n\t\t\t\treturn Future.withValue(text);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar request = new HTTPRequest<String>();\n\t\t\treturn request.load(getPath(id));\n\t\t}\n\t}\n\n\tpublic function unload():Void\n\t{\n\t\t#if haxe4\n\t\tcachedBytes.clear();\n\t\tcachedFonts.clear();\n\t\tcachedImages.clear();\n\t\tcachedAudioBuffers.clear();\n\t\tcachedText.clear();\n\t\t#else\n\t\tcachedBytes = new Map<String, Bytes>();\n\t\tcachedFonts = new Map<String, Font>();\n\t\tcachedImages = new Map<String, Image>();\n\t\tcachedText = new Map<String, String>();\n\t\tclassTypes = new Map<String, Class<Dynamic>>();\n\t\t#end\n\t}\n\n\t@:noCompletion private function __assetLoaded(id:String):Void\n\t{\n\t\tassetsLoaded++;\n\n\t\tif (id != null)\n\t\t{\n\t\t\tLog.verbose(\"Loaded asset: \" + id + \" [\" + types.get(id) + \"] (\" + (assetsLoaded - 1) + \"/\" + (assetsTotal - 1) + \")\");\n\t\t}\n\n\t\tif (id != null)\n\t\t{\n\t\t\tvar size = sizes.exists(id) ? sizes.get(id) : 0;\n\n\t\t\tif (!bytesLoadedCache.exists(id))\n\t\t\t{\n\t\t\t\tbytesLoaded += size;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar cache = bytesLoadedCache.get(id);\n\n\t\t\t\tif (cache < size)\n\t\t\t\t{\n\t\t\t\t\tbytesLoaded += (size - cache);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbytesLoadedCache.set(id, size);\n\t\t}\n\n\t\tif (assetsLoaded < assetsTotal)\n\t\t{\n\t\t\tpromise.progress(bytesLoaded, bytesTotal);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tloaded = true;\n\t\t\tpromise.progress(bytesTotal, bytesTotal);\n\t\t\tpromise.complete(this);\n\t\t}\n\t}\n\n\t@:noCompletion private function __cacheBreak(path:String):String\n\t{\n\t\treturn Assets.__cacheBreak(path);\n\t}\n\n\t@:noCompletion private function __fromBundle(bundle:AssetBundle, manifest:AssetManifest = null):Void\n\t{\n\t\tif (manifest != null)\n\t\t{\n\t\t\tvar id, data, type:AssetType;\n\t\t\tfor (asset in manifest.assets)\n\t\t\t{\n\t\t\t\tid = Reflect.hasField(asset, \"id\") ? asset.id : asset.path;\n\t\t\t\tdata = bundle.data.get(asset.path);\n\n\t\t\t\tif (Reflect.hasField(asset, \"type\"))\n\t\t\t\t{\n\t\t\t\t\ttype = asset.type;\n\t\t\t\t\tswitch (type)\n\t\t\t\t\t{\n\t\t\t\t\t\t#if !web\n\t\t\t\t\t\tcase IMAGE:\n\t\t\t\t\t\t\tcachedImages.set(id, Image.fromBytes(data));\n\t\t\t\t\t\tcase MUSIC, SOUND:\n\t\t\t\t\t\t\tcachedAudioBuffers.set(id, AudioBuffer.fromBytes(data));\n\t\t\t\t\t\tcase FONT:\n\t\t\t\t\t\t\tcachedFonts.set(id, Font.fromBytes(data));\n\t\t\t\t\t\t#end\n\t\t\t\t\t\tcase TEXT:\n\t\t\t\t\t\t\tcachedText.set(id, data != null ? Std.string(data) : null);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tcachedBytes.set(id, data);\n\t\t\t\t\t}\n\t\t\t\t\ttypes.set(id, asset.type);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcachedBytes.set(id, data);\n\t\t\t\t\ttypes.set(id, BINARY);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (path in bundle.paths)\n\t\t\t{\n\t\t\t\tcachedBytes.set(path, bundle.data.get(path));\n\t\t\t\ttypes.set(path, BINARY);\n\t\t\t}\n\t\t}\n\t}\n\n\t@:noCompletion private function __fromManifest(manifest:AssetManifest):Void\n\t{\n\t\tvar hasSize = (manifest.version >= 2);\n\t\tvar size, id, pathGroup:Array<String>, classRef;\n\n\t\tvar basePath = manifest.rootPath;\n\t\tif (basePath == null) basePath = \"\";\n\t\tif (basePath != \"\") basePath += \"/\";\n\n\t\tfor (asset in manifest.assets)\n\t\t{\n\t\t\tsize = hasSize && Reflect.hasField(asset, \"size\") ? asset.size : 100;\n\t\t\tid = Reflect.hasField(asset, \"id\") ? asset.id : asset.path;\n\n\t\t\tif (Reflect.hasField(asset, \"path\"))\n\t\t\t{\n\t\t\t\tpaths.set(id, __cacheBreak(__resolvePath(basePath + Reflect.field(asset, \"path\"))));\n\t\t\t}\n\n\t\t\tif (Reflect.hasField(asset, \"pathGroup\"))\n\t\t\t{\n\t\t\t\tpathGroup = Reflect.field(asset, \"pathGroup\");\n\n\t\t\t\tfor (i in 0...pathGroup.length)\n\t\t\t\t{\n\t\t\t\t\tpathGroup[i] = __cacheBreak(__resolvePath(basePath + pathGroup[i]));\n\t\t\t\t}\n\n\t\t\t\tpathGroups.set(id, pathGroup);\n\t\t\t}\n\n\t\t\tsizes.set(id, size);\n\t\t\ttypes.set(id, asset.type);\n\n\t\t\tif (Reflect.hasField(asset, \"preload\"))\n\t\t\t{\n\t\t\t\tpreload.set(id, Reflect.field(asset, \"preload\"));\n\t\t\t}\n\n\t\t\tif (Reflect.hasField(asset, \"className\"))\n\t\t\t{\n\t\t\t\tclassRef = Type.resolveClass(Reflect.field(asset, \"className\"));\n\n\t\t\t\t#if (js && html5 && modular)\n\t\t\t\tif (classRef == null)\n\t\t\t\t{\n\t\t\t\t\tclassRef = untyped $hx_exports[asset.className];\n\t\t\t\t}\n\t\t\t\t#end\n\n\t\t\t\tclassTypes.set(id, classRef);\n\t\t\t}\n\t\t}\n\n\t\tbytesTotal = 0;\n\n\t\tfor (asset in manifest.assets)\n\t\t{\n\t\t\tid = Reflect.hasField(asset, \"id\") ? asset.id : asset.path;\n\n\t\t\tif (preload.exists(id) && preload.get(id) && sizes.exists(id))\n\t\t\t{\n\t\t\t\tbytesTotal += sizes.get(id);\n\t\t\t}\n\t\t}\n\t}\n\n\t@:noCompletion private function __resolvePath(path:String):String\n\t{\n\t\tpath = StringTools.replace(path, \"\\\\\", \"/\");\n\n\t\tvar colonIdx:Int = path.indexOf(\":\");\n\t\tif (StringTools.startsWith(path, \"http\") && colonIdx > 0)\n\t\t{\n\t\t\tvar lastSlashIdx:Int = colonIdx + 3;\n\t\t\tvar httpSection:String = path.substr(0, lastSlashIdx);\n\t\t\tpath = httpSection + StringTools.replace(path.substr(lastSlashIdx), \"//\", \"/\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpath = StringTools.replace(path, \"//\", \"/\");\n\t\t}\n\n\t\t#if android\n\t\tif (StringTools.startsWith(path, \"./\"))\n\t\t{\n\t\t\tpath = path.substr(2);\n\t\t}\n\t\t#end\n\n\t\tif (path.indexOf(\"./\") > -1)\n\t\t{\n\t\t\tvar split = path.split(\"/\");\n\t\t\tvar newPath = [];\n\n\t\t\tfor (i in 0...split.length)\n\t\t\t{\n\t\t\t\tif (split[i] == \"..\")\n\t\t\t\t{\n\t\t\t\t\tif (i == 0 || newPath[i - 1] == \"..\")\n\t\t\t\t\t{\n\t\t\t\t\t\tnewPath.push(\"..\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnewPath.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (split[i] == \".\")\n\t\t\t\t{\n\t\t\t\t\tif (i == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tnewPath.push(\".\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnewPath.push(split[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpath = newPath.join(\"/\");\n\t\t}\n\n\t\treturn path;\n\t}\n\n\t// Event Handlers\n\t@:noCompletion private function loadAudioBuffer_onComplete(id:String, audioBuffer:AudioBuffer):Void\n\t{\n\t\tcachedAudioBuffers.set(id, audioBuffer);\n\n\t\tif (pathGroups.exists(id))\n\t\t{\n\t\t\tvar pathGroup = pathGroups.get(id);\n\n\t\t\tfor (otherID in pathGroups.keys())\n\t\t\t{\n\t\t\t\tif (otherID == id) continue;\n\n\t\t\t\tfor (path in pathGroup)\n\t\t\t\t{\n\t\t\t\t\tif (pathGroups.get(otherID).indexOf(path) > -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tcachedAudioBuffers.set(otherID, audioBuffer);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t__assetLoaded(id);\n\t}\n\n\t@:noCompletion private function loadAudioBuffer_onError(id:String, message:Dynamic):Void\n\t{\n\t\t#if (js && html5)\n\t\tif (message != null && message != \"\")\n\t\t{\n\t\t\tLog.warn(\"Could not load \\\"\" + id + \"\\\": \" + Std.string(message));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.warn(\"Could not load \\\"\" + id + \"\\\"\");\n\t\t}\n\n\t\tloadAudioBuffer_onComplete(id, new AudioBuffer());\n\t\t#else\n\t\tload_onError(id, message);\n\t\t#end\n\t}\n\n\t@:noCompletion private function loadBytes_onComplete(id:String, bytes:Bytes):Void\n\t{\n\t\tcachedBytes.set(id, bytes);\n\t\t__assetLoaded(id);\n\t}\n\n\t@:noCompletion private function loadFont_onComplete(id:String, font:Font):Void\n\t{\n\t\tcachedFonts.set(id, font);\n\t\t__assetLoaded(id);\n\t}\n\n\t@:noCompletion private function loadImage_onComplete(id:String, image:Image):Void\n\t{\n\t\tcachedImages.set(id, image);\n\t\t__assetLoaded(id);\n\t}\n\n\t@:noCompletion private function loadText_onComplete(id:String, text:String):Void\n\t{\n\t\tcachedText.set(id, text);\n\t\t__assetLoaded(id);\n\t}\n\n\t@:noCompletion private function load_onError(id:String, message:Dynamic):Void\n\t{\n\t\tif (message != null && message != \"\")\n\t\t{\n\t\t\tpromise.error(\"Error loading asset \\\"\" + id + \"\\\": \" + Std.string(message));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpromise.error(\"Error loading asset \\\"\" + id + \"\\\"\");\n\t\t}\n\t}\n\n\t@:noCompletion private function load_onProgress(id:String, bytesLoaded:Int, bytesTotal:Int):Void\n\t{\n\t\tif (bytesLoaded > 0)\n\t\t{\n\t\t\tvar size = sizes.get(id);\n\t\t\tvar percent;\n\n\t\t\tif (bytesTotal > 0)\n\t\t\t{\n\t\t\t\t// Use a ratio in case the real bytesTotal is different than our precomputed total\n\n\t\t\t\tpercent = (bytesLoaded / bytesTotal);\n\t\t\t\tif (percent > 1) percent = 1;\n\t\t\t\tbytesLoaded = Math.floor(percent * size);\n\t\t\t}\n\t\t\telse if (bytesLoaded > size)\n\t\t\t{\n\t\t\t\tbytesLoaded = size;\n\t\t\t}\n\n\t\t\tif (bytesLoadedCache.exists(id))\n\t\t\t{\n\t\t\t\tvar cache = bytesLoadedCache.get(id);\n\n\t\t\t\tif (bytesLoaded != cache)\n\t\t\t\t{\n\t\t\t\t\tthis.bytesLoaded += (bytesLoaded - cache);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.bytesLoaded += bytesLoaded;\n\t\t\t}\n\n\t\t\tbytesLoadedCache.set(id, bytesLoaded);\n\t\t\tpromise.progress(this.bytesLoaded, this.bytesTotal);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/AssetManifest.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Path;\nimport haxe.Serializer;\nimport haxe.Unserializer;\nimport lime.app.Future;\nimport lime.utils.Bytes;\n#if !macro\nimport haxe.Json;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass AssetManifest\n{\n\tpublic var assets:Array<Dynamic>;\n\tpublic var libraryArgs:Array<String>;\n\tpublic var libraryType:String;\n\tpublic var name:String;\n\tpublic var rootPath:String;\n\tpublic var version:Int;\n\n\tpublic function new()\n\t{\n\t\tassets = [];\n\t\tlibraryArgs = [];\n\t\tversion = 2;\n\t}\n\n\tpublic static function fromBytes(bytes:Bytes, rootPath:String = null):AssetManifest\n\t{\n\t\tif (bytes != null)\n\t\t{\n\t\t\treturn parse(bytes.getString(0, bytes.length), rootPath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static function fromFile(path:String, rootPath:String = null):AssetManifest\n\t{\n\t\tpath = __resolvePath(path);\n\t\trootPath = __resolveRootPath(rootPath, path);\n\n\t\tif (path == null) return null;\n\n\t\treturn fromBytes(Bytes.fromFile(path), rootPath);\n\t}\n\n\tpublic static function loadFromBytes(bytes:Bytes, rootPath:String = null):Future<AssetManifest>\n\t{\n\t\treturn Future.withValue(fromBytes(bytes, rootPath));\n\t}\n\n\tpublic static function loadFromFile(path:String, rootPath:String = null):Future<AssetManifest>\n\t{\n\t\tpath = __resolvePath(path);\n\t\trootPath = __resolveRootPath(rootPath, path);\n\n\t\tif (path == null) return null;\n\n\t\treturn Bytes.loadFromFile(path).then(function(bytes)\n\t\t{\n\t\t\treturn Future.withValue(fromBytes(bytes, rootPath));\n\t\t});\n\t}\n\n\tpublic static function parse(data:String, rootPath:String = null):AssetManifest\n\t{\n\t\tif (data == null || data == \"\") return null;\n\n\t\t#if !macro\n\t\tvar manifestData = Json.parse(data);\n\t\tvar manifest = new AssetManifest();\n\n\t\tif (Reflect.hasField(manifestData, \"name\"))\n\t\t{\n\t\t\tmanifest.name = manifestData.name;\n\t\t}\n\n\t\tif (Reflect.hasField(manifestData, \"libraryType\"))\n\t\t{\n\t\t\tmanifest.libraryType = manifestData.libraryType;\n\t\t}\n\n\t\tif (Reflect.hasField(manifestData, \"libraryArgs\"))\n\t\t{\n\t\t\tmanifest.libraryArgs = manifestData.libraryArgs;\n\t\t}\n\n\t\tif (Reflect.hasField(manifestData, \"assets\"))\n\t\t{\n\t\t\tvar assets:Dynamic = manifestData.assets;\n\t\t\tif (Reflect.hasField(manifestData, \"version\") && manifestData.version <= 2)\n\t\t\t{\n\t\t\t\tmanifest.assets = Unserializer.run(assets);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmanifest.assets = assets;\n\t\t\t}\n\t\t}\n\n\t\tif (Reflect.hasField(manifestData, \"rootPath\"))\n\t\t{\n\t\t\tmanifest.rootPath = manifestData.rootPath;\n\t\t}\n\n\t\tif (rootPath != null && rootPath != \"\")\n\t\t{\n\t\t\tif (manifest.rootPath == null || manifest.rootPath == \"\")\n\t\t\t{\n\t\t\t\tmanifest.rootPath = rootPath;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmanifest.rootPath = rootPath + \"/\" + manifest.rootPath;\n\t\t\t}\n\t\t}\n\n\t\treturn manifest;\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic function serialize():String\n\t{\n\t\t#if !macro\n\t\tvar manifestData:Dynamic = {};\n\t\tmanifestData.version = version;\n\t\tmanifestData.libraryType = libraryType;\n\t\tmanifestData.libraryArgs = libraryArgs;\n\t\tmanifestData.name = name;\n\t\tmanifestData.assets = Serializer.run(assets);\n\t\tmanifestData.rootPath = rootPath;\n\n\t\treturn Json.stringify(manifestData);\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tprivate static function __resolvePath(path:String):String\n\t{\n\t\tif (path == null) return null;\n\n\t\tvar queryIndex = path.indexOf(\"?\");\n\t\tvar basePath;\n\n\t\tif (queryIndex > -1)\n\t\t{\n\t\t\tbasePath = path.substr(0, queryIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbasePath = path;\n\t\t}\n\n\t\tbasePath = StringTools.replace(basePath, \"\\\\\", \"/\");\n\n\t\twhile (StringTools.endsWith(basePath, \"/\"))\n\t\t{\n\t\t\tbasePath = basePath.substr(0, basePath.length - 1);\n\t\t}\n\n\t\tif (StringTools.endsWith(basePath, \".bundle\"))\n\t\t{\n\t\t\tif (queryIndex > -1)\n\t\t\t{\n\t\t\t\treturn basePath + \"/library.json\" + path.substr(queryIndex);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn basePath + \"/library.json\";\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn path;\n\t\t}\n\t}\n\n\tprivate static function __resolveRootPath(rootPath:String, path:String):String\n\t{\n\t\tif (rootPath != null) return rootPath;\n\n\t\tvar queryIndex = path.indexOf(\"?\");\n\n\t\tif (queryIndex > -1)\n\t\t{\n\t\t\trootPath = path.substr(0, queryIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trootPath = path;\n\t\t}\n\n\t\trootPath = StringTools.replace(rootPath, \"\\\\\", \"/\");\n\n\t\twhile (StringTools.endsWith(rootPath, \"/\"))\n\t\t{\n\t\t\tif (rootPath == \"/\") return rootPath;\n\t\t\trootPath = rootPath.substr(0, rootPath.length - 1);\n\t\t}\n\n\t\tif (StringTools.endsWith(rootPath, \".bundle\"))\n\t\t{\n\t\t\treturn rootPath;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Path.directory(rootPath);\n\t\t}\n\n\t\treturn rootPath;\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/AssetType.hx",
    "content": "package lime.utils;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract AssetType(String) to String\n{\n\tvar BINARY = \"BINARY\";\n\tvar FONT = \"FONT\";\n\tvar IMAGE = \"IMAGE\";\n\tvar MANIFEST = \"MANIFEST\";\n\tvar MUSIC = \"MUSIC\";\n\tvar SOUND = \"SOUND\";\n\tvar TEMPLATE = \"TEMPLATE\";\n\tvar TEXT = \"TEXT\";\n}\n"
  },
  {
    "path": "src/lime/utils/Assets.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Path;\nimport haxe.CallStack;\nimport haxe.Unserializer;\nimport lime.app.Application;\nimport lime.app.Event;\nimport lime.app.Promise;\nimport lime.app.Future;\nimport lime.media.AudioBuffer;\nimport lime.graphics.Image;\nimport lime.text.Font;\nimport lime.utils.Bytes;\nimport lime.utils.Log;\n#if !macro\nimport haxe.Json;\n#end\n\n/**\n * <p>The Assets class provides a cross-platform interface to access\n * embedded images, fonts, sounds and other resource files.</p>\n *\n * <p>The contents are populated automatically when an application\n * is compiled using the Lime command-line tools, based on the\n * contents of the project file.</p>\n *\n * <p>For most platforms, the assets are included in the same directory\n * or package as the application, and the paths are handled\n * automatically. For web content, the assets are preloaded before\n * the start of the rest of the application.</p>\n */\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:access(lime.utils.AssetLibrary)\nclass Assets\n{\n\tpublic static var cache:AssetCache = new AssetCache();\n\tpublic static var onChange = new Event<Void->Void>();\n\n\tprivate static var bundlePaths = new Map<String, String>();\n\tprivate static var libraries(default, null) = new Map<String, AssetLibrary>();\n\tprivate static var libraryPaths = new Map<String, String>();\n\n\tpublic static function exists(id:String, type:AssetType = null):Bool\n\t{\n\t\t#if (tools && !display)\n\t\tif (type == null)\n\t\t{\n\t\t\ttype = BINARY;\n\t\t}\n\n\t\tvar symbol = new LibrarySymbol(id);\n\n\t\tif (symbol.library != null)\n\t\t{\n\t\t\treturn symbol.exists(type);\n\t\t}\n\t\t#end\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Gets an instance of a cached or embedded asset\n\t * @usage\t\tvar sound = Assets.getAsset(\"sound.wav\", SOUND);\n\t * @param\tid\t\tThe ID or asset path for the asset\n\t * @return\t\tAn Asset object, or null.\n\t */\n\tpublic static function getAsset(id:String, type:AssetType, useCache:Bool):Dynamic\n\t{\n\t\t#if (tools && !display)\n\t\tif (useCache && cache.enabled)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase BINARY, TEXT: // Not cached\n\n\t\t\t\t\tuseCache = false;\n\n\t\t\t\tcase FONT:\n\t\t\t\t\tvar font = cache.font.get(id);\n\n\t\t\t\t\tif (font != null)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn font;\n\t\t\t\t\t}\n\n\t\t\t\tcase IMAGE:\n\t\t\t\t\tvar image = cache.image.get(id);\n\n\t\t\t\t\tif (isValidImage(image))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn image;\n\t\t\t\t\t}\n\n\t\t\t\tcase MUSIC, SOUND:\n\t\t\t\t\tvar audio = cache.audio.get(id);\n\n\t\t\t\t\tif (isValidAudio(audio))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn audio;\n\t\t\t\t\t}\n\n\t\t\t\tcase TEMPLATE:\n\t\t\t\t\tthrow \"Not sure how to get template: \" + id;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tvar symbol = new LibrarySymbol(id);\n\n\t\tif (symbol.library != null)\n\t\t{\n\t\t\tif (symbol.exists(type))\n\t\t\t{\n\t\t\t\tif (symbol.isLocal(type))\n\t\t\t\t{\n\t\t\t\t\tvar asset = symbol.library.getAsset(symbol.symbolName, type);\n\n\t\t\t\t\tif (useCache && cache.enabled)\n\t\t\t\t\t{\n\t\t\t\t\t\tcache.set(id, type, asset);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn asset;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLog.error(type + \" asset \\\"\" + id + \"\\\" exists, but only asynchronously\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error(\"There is no \" + type + \" asset with an ID of \\\"\" + id + \"\\\"\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.error(__libraryNotFound(symbol.libraryName));\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets an instance of an embedded sound\n\t * @usage\t\tvar sound = Assets.getAudioBuffer (\"sound.wav\");\n\t * @param\tid\t\tThe ID or asset path for the sound\n\t * @return\t\tA new Sound object\n\t */\n\tpublic static function getAudioBuffer(id:String, useCache:Bool = true):AudioBuffer\n\t{\n\t\treturn cast getAsset(id, SOUND, useCache);\n\t}\n\n\t/**\n\t * Gets an instance of an embedded binary asset\n\t * @usage\t\tvar bytes = Assets.getBytes(\"file.zip\");\n\t * @param\tid\t\tThe ID or asset path for the file\n\t * @return\t\tA new Bytes object\n\t */\n\tpublic static function getBytes(id:String):Bytes\n\t{\n\t\treturn cast getAsset(id, BINARY, false);\n\t}\n\n\t/**\n\t * Gets an instance of an embedded font\n\t * @usage\t\tvar fontName = Assets.getFont(\"font.ttf\").fontName;\n\t * @param\tid\t\tThe ID or asset path for the font\n\t * @return\t\tA new Font object\n\t */\n\tpublic static function getFont(id:String, useCache:Bool = true):Font\n\t{\n\t\treturn getAsset(id, FONT, useCache);\n\t}\n\n\t/**\n\t * Gets an instance of an embedded bitmap.\n\t *\n\t * _Note:_ This method may behave differently, depending on the target\n\t * platform. On targets that can quickly create a new image synchronously,\n\t * every call to `Assets.getImage()` with the same ID will return a new\n\t * `Image` instance. However, on other targets where creating images\n\t * synchronously is unacceptably slow, or where images may not be created\n\t * synchronously and must be created asynchronously, every call to\n\t * `Assets.getImage()` with the same ID may return a single, shared `Image`\n\t * instance.\n\t *\n\t * With that in mind, modifying or disposing the contents of the `Image`\n\t * returned by `Assets.getImage()` may affect the results of future calls to\n\t * Assets.getImage()` on some targets. To access an `Image` instance that\n\t * may be modified without affecting future calls to `Assets.getImage()`,\n\t * call the `Image` instance's `clone()` method to manually create a copy.\n\t *\n\t * @usage\t\tvar bitmap = new Bitmap(Assets.getBitmapData(\"image.jpg\"));\n\t * @param\tid\t\tThe ID or asset path for the bitmap\n\t * @param\tuseCache\t\t(Optional) Whether to use BitmapData from the cache(Default: true)\n\t * @return\t\tA new BitmapData object\n\t */\n\tpublic static function getImage(id:String, useCache:Bool = true):Image\n\t{\n\t\treturn getAsset(id, IMAGE, useCache);\n\t}\n\n\tpublic static function getLibrary(name:String):AssetLibrary\n\t{\n\t\tif (name == null || name == \"\")\n\t\t{\n\t\t\tname = \"default\";\n\t\t}\n\n\t\treturn libraries.get(name);\n\t}\n\n\t/**\n\t * Gets the file path (if available) for an asset\n\t * @usage\t\tvar path = Assets.getPath(\"image.jpg\");\n\t * @param\tid\t\tThe ID or asset path for the asset\n\t * @return\t\tThe path to the asset (or null)\n\t */\n\tpublic static function getPath(id:String):String\n\t{\n\t\t#if (tools && !display)\n\t\tvar symbol = new LibrarySymbol(id);\n\n\t\tif (symbol.library != null)\n\t\t{\n\t\t\tif (symbol.exists())\n\t\t\t{\n\t\t\t\treturn symbol.library.getPath(symbol.symbolName);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error(\"There is no asset with an ID of \\\"\" + id + \"\\\"\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.error(__libraryNotFound(symbol.libraryName));\n\t\t}\n\t\t#end\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets an instance of an embedded text asset\n\t * @usage\t\tvar text = Assets.getText(\"text.txt\");\n\t * @param\tid\t\tThe ID or asset path for the file\n\t * @return\t\tA new String object\n\t */\n\tpublic static function getText(id:String):String\n\t{\n\t\treturn getAsset(id, TEXT, false);\n\t}\n\n\tpublic static function hasLibrary(name:String):Bool\n\t{\n\t\tif (name == null || name == \"\")\n\t\t{\n\t\t\tname = \"default\";\n\t\t}\n\n\t\treturn libraries.exists(name);\n\t}\n\n\tpublic static function isLocal(id:String, type:AssetType = null, useCache:Bool = true):Bool\n\t{\n\t\t#if (tools && !display)\n\t\tif (useCache && cache.enabled)\n\t\t{\n\t\t\tif (cache.exists(id, type)) return true;\n\t\t}\n\n\t\tvar symbol = new LibrarySymbol(id);\n\t\treturn symbol.library != null && symbol.isLocal(type);\n\t\t#else\n\t\treturn false;\n\t\t#end\n\t}\n\n\tprivate static function isValidAudio(buffer:AudioBuffer):Bool\n\t{\n\t\t// TODO: Check disposed\n\n\t\treturn buffer != null;\n\t}\n\n\tprivate static function isValidImage(image:Image):Bool\n\t{\n\t\t// TODO: Check disposed\n\n\t\treturn (image != null && image.buffer != null);\n\t}\n\n\tpublic static function list(type:AssetType = null):Array<String>\n\t{\n\t\tvar items = [];\n\n\t\tfor (library in libraries)\n\t\t{\n\t\t\tvar libraryItems = library.list(type);\n\n\t\t\tif (libraryItems != null)\n\t\t\t{\n\t\t\t\titems = items.concat(libraryItems);\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t}\n\n\tpublic static function loadAsset(id:String, type:AssetType, useCache:Bool):Future<Dynamic>\n\t{\n\t\t#if (tools && !display)\n\t\tif (useCache && cache.enabled)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\t\tcase BINARY, TEXT: // Not cached\n\n\t\t\t\t\tuseCache = false;\n\n\t\t\t\tcase FONT:\n\t\t\t\t\tvar font = cache.font.get(id);\n\n\t\t\t\t\tif (font != null)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn Future.withValue(font);\n\t\t\t\t\t}\n\n\t\t\t\tcase IMAGE:\n\t\t\t\t\tvar image = cache.image.get(id);\n\n\t\t\t\t\tif (isValidImage(image))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn Future.withValue(image);\n\t\t\t\t\t}\n\n\t\t\t\tcase MUSIC, SOUND:\n\t\t\t\t\tvar audio = cache.audio.get(id);\n\n\t\t\t\t\tif (isValidAudio(audio))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn Future.withValue(audio);\n\t\t\t\t\t}\n\n\t\t\t\tcase TEMPLATE:\n\t\t\t\t\tthrow \"Not sure how to get template: \" + id;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tvar symbol = new LibrarySymbol(id);\n\n\t\tif (symbol.library != null)\n\t\t{\n\t\t\tif (symbol.exists(type))\n\t\t\t{\n\t\t\t\tvar future = symbol.library.loadAsset(symbol.symbolName, type);\n\n\t\t\t\tif (useCache && cache.enabled)\n\t\t\t\t{\n\t\t\t\t\tfuture.onComplete(function(asset) cache.set(id, type, asset));\n\t\t\t\t}\n\n\t\t\t\treturn future;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn Future.withError(\"There is no \" + type + \" asset with an ID of \\\"\" + id + \"\\\"\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Future.withError(__libraryNotFound(symbol.libraryName));\n\t\t}\n\t\t#else\n\t\treturn null;\n\t\t#end\n\t}\n\n\tpublic static function loadAudioBuffer(id:String, useCache:Bool = true):Future<AudioBuffer>\n\t{\n\t\treturn cast loadAsset(id, SOUND, useCache);\n\t}\n\n\tpublic static function loadBytes(id:String):Future<Bytes>\n\t{\n\t\treturn cast loadAsset(id, BINARY, false);\n\t}\n\n\tpublic static function loadFont(id:String, useCache:Bool = true):Future<Font>\n\t{\n\t\treturn cast loadAsset(id, FONT, useCache);\n\t}\n\n\tpublic static function loadImage(id:String, useCache:Bool = true):Future<Image>\n\t{\n\t\treturn cast loadAsset(id, IMAGE, useCache);\n\t}\n\n\tpublic static function loadLibrary(id:String):Future<AssetLibrary>\n\t{\n\t\tvar promise = new Promise<AssetLibrary>();\n\n\t\t#if (tools && !display && !macro)\n\t\tvar library = getLibrary(id);\n\n\t\tif (library != null)\n\t\t{\n\t\t\treturn library.load();\n\t\t}\n\n\t\tvar path = id;\n\t\tvar rootPath = null;\n\n\t\tif (bundlePaths.exists(id))\n\t\t{\n\t\t\tAssetBundle.loadFromFile(bundlePaths.get(id)).onComplete(function(bundle)\n\t\t\t{\n\t\t\t\tif (bundle == null)\n\t\t\t\t{\n\t\t\t\t\tpromise.error(\"Cannot load bundle for library \\\"\" + id + \"\\\"\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar library = AssetLibrary.fromBundle(bundle);\n\n\t\t\t\tif (library == null)\n\t\t\t\t{\n\t\t\t\t\tpromise.error(\"Cannot open library \\\"\" + id + \"\\\"\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlibraries.set(id, library);\n\t\t\t\t\tlibrary.onChange.add(onChange.dispatch);\n\t\t\t\t\tpromise.completeWith(library.load());\n\t\t\t\t}\n\t\t\t}).onError(function(_)\n\t\t\t{\n\t\t\t\t\tpromise.error(\"There is no asset library with an ID of \\\"\" + id + \"\\\"\");\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (libraryPaths.exists(id))\n\t\t\t{\n\t\t\t\tpath = libraryPaths[id];\n\t\t\t\trootPath = Path.directory(path);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (StringTools.endsWith(path, \".bundle\"))\n\t\t\t\t{\n\t\t\t\t\trootPath = path;\n\t\t\t\t\tpath += \"/library.json\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trootPath = Path.directory(path);\n\t\t\t\t}\n\t\t\t\tpath = __cacheBreak(path);\n\t\t\t}\n\n\t\t\tAssetManifest.loadFromFile(path, rootPath).onComplete(function(manifest)\n\t\t\t{\n\t\t\t\tif (manifest == null)\n\t\t\t\t{\n\t\t\t\t\tpromise.error(\"Cannot parse asset manifest for library \\\"\" + id + \"\\\"\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar library = AssetLibrary.fromManifest(manifest);\n\n\t\t\t\tif (library == null)\n\t\t\t\t{\n\t\t\t\t\tpromise.error(\"Cannot open library \\\"\" + id + \"\\\"\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlibraries.set(id, library);\n\t\t\t\t\tlibrary.onChange.add(onChange.dispatch);\n\t\t\t\t\tpromise.completeWith(library.load());\n\t\t\t\t}\n\t\t\t}).onError(function(_)\n\t\t\t{\n\t\t\t\t\tpromise.error(\"There is no asset library with an ID of \\\"\" + id + \"\\\"\");\n\t\t\t});\n\t\t}\n\t\t#end\n\n\t\treturn promise.future;\n\t}\n\n\tpublic static function loadText(id:String):Future<String>\n\t{\n\t\treturn cast loadAsset(id, TEXT, false);\n\t}\n\n\tpublic static function registerLibrary(name:String, library:AssetLibrary):Void\n\t{\n\t\tif (name == null || name == \"\")\n\t\t{\n\t\t\tname = \"default\";\n\t\t}\n\n\t\tif (libraries.exists(name))\n\t\t{\n\t\t\tif (libraries.get(name) == library)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tunloadLibrary(name);\n\t\t\t}\n\t\t}\n\n\t\tif (library != null)\n\t\t{\n\t\t\tlibrary.onChange.add(library_onChange);\n\t\t}\n\n\t\tlibraries.set(name, library);\n\t}\n\n\tpublic static function unloadLibrary(name:String):Void\n\t{\n\t\tremoveLibrary(name, true);\n\t}\n\n\tpublic static function removeLibrary(name:String, unload:Bool = true):Void\n\t{\n\t\t#if (tools && !display)\n\t\tif (name == null || name == \"\")\n\t\t{\n\t\t\tname = \"default\";\n\t\t}\n\n\t\tvar library = libraries.get(name);\n\n\t\tif (library != null)\n\t\t{\n\t\t\tcache.clear(name + \":\");\n\t\t\tlibrary.onChange.remove(library_onChange);\n\t\t\tif (unload)\n\t\t\t{\n\t\t\t\tlibrary.unload();\n\t\t\t}\n\t\t}\n\n\t\tlibraries.remove(name);\n\t\t#end\n\t}\n\n\t@:noCompletion private static function __cacheBreak(path:String):String\n\t{\n\t\t#if web\n\t\tif (cache.version > 0)\n\t\t{\n\t\t\tif (path.indexOf(\"?\") > -1)\n\t\t\t{\n\t\t\t\tpath += \"&\" + cache.version;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpath += \"?\" + cache.version;\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\treturn path;\n\t}\n\n\t@:noCompletion private static function __libraryNotFound(name:String):String\n\t{\n\t\tif (name == null || name == \"\")\n\t\t{\n\t\t\tname = \"default\";\n\t\t}\n\n\t\tif (Application.current != null && Application.current.preloader != null && !Application.current.preloader.complete)\n\t\t{\n\t\t\treturn \"There is no asset library named \\\"\" + name + \"\\\", or it is not yet preloaded\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn \"There is no asset library named \\\"\" + name + \"\\\"\";\n\t\t}\n\t}\n\n\t// Event Handlers\n\t@:noCompletion private static function library_onChange():Void\n\t{\n\t\tcache.clear();\n\t\tonChange.dispatch();\n\t}\n}\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nprivate class LibrarySymbol\n{\n\tpublic var library(default, null):AssetLibrary;\n\tpublic var libraryName(default, null):String;\n\tpublic var symbolName(default, null):String;\n\n\tpublic inline function new(id:String)\n\t{\n\t\tvar colonIndex = id.indexOf(\":\");\n\t\tlibraryName = id.substring(0, colonIndex);\n\t\tsymbolName = id.substring(colonIndex + 1);\n\t\tlibrary = Assets.getLibrary(libraryName);\n\t}\n\n\tpublic inline function isLocal(?type)\n\t\treturn library.isLocal(symbolName, type);\n\n\tpublic inline function exists(?type)\n\t\treturn library.exists(symbolName, type);\n}\n"
  },
  {
    "path": "src/lime/utils/BytePointer.hx",
    "content": "package lime.utils;\n\nimport haxe.io.BytesData;\nimport haxe.io.Bytes;\nimport lime.utils.Bytes as LimeBytes;\n\n@:access(haxe.io.Bytes)\n@:access(lime.utils.BytePointerData)\n@:forward()\n@:transitive\nabstract BytePointer(BytePointerData) from BytePointerData to BytePointerData\n{\n\tpublic inline function new(bytes:Bytes = null, offset:Int = 0):Void\n\t{\n\t\tthis = new BytePointerData(bytes, offset);\n\t}\n\n\tpublic function set(?bytes:Bytes, ?bufferView:ArrayBufferView, ?buffer:ArrayBuffer, ?offset:Int):Void\n\t{\n\t\tif (buffer != null)\n\t\t{\n\t\t\t#if js\n\t\t\tbytes = Bytes.ofData(cast buffer);\n\t\t\t#else\n\t\t\tbytes = buffer;\n\t\t\t#end\n\t\t}\n\n\t\tif (bytes != null || bufferView == null)\n\t\t{\n\t\t\tthis.bytes = bytes;\n\t\t\tthis.offset = offset != null ? offset : 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t#if js\n\t\t\tthis.bytes = Bytes.ofData(cast bufferView.buffer);\n\t\t\t#else\n\t\t\tthis.bytes = bufferView.buffer;\n\t\t\t#end\n\n\t\t\tthis.offset = offset != null ? bufferView.byteOffset + offset : bufferView.byteOffset;\n\t\t}\n\t}\n\n\t@:arrayAccess @:noCompletion private inline function __arrayGet(index:Int):Int\n\t{\n\t\treturn (this.bytes != null) ? this.bytes.get(index + this.offset) : 0;\n\t}\n\n\t@:arrayAccess @:noCompletion private inline function __arraySet(index:Int, value:Int):Int\n\t{\n\t\tif (this.bytes == null) this.bytes.set(index + this.offset, value);\n\t\treturn value;\n\t}\n\n\t@:from @:noCompletion public static function fromArrayBufferView(arrayBufferView:ArrayBufferView):BytePointer\n\t{\n\t\tif (arrayBufferView == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new BytePointerData(Bytes.ofData(arrayBufferView.buffer), arrayBufferView.byteOffset);\n\t\t#else\n\t\treturn new BytePointerData((arrayBufferView.buffer : Bytes), arrayBufferView.byteOffset);\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromArrayBuffer(buffer:ArrayBuffer):BytePointer\n\t{\n\t\tif (buffer == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new BytePointerData(Bytes.ofData(buffer), 0);\n\t\t#else\n\t\treturn new BytePointerData((buffer : Bytes), 0);\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromBytes(bytes:Bytes):BytePointer\n\t{\n\t\treturn new BytePointerData(bytes, 0);\n\t}\n\n\t@:from @:noCompletion public static function fromBytesData(bytesData:BytesData):BytePointer\n\t{\n\t\tif (bytesData == null) return new BytePointerData(null, 0);\n\t\telse\n\t\t\treturn new BytePointerData(Bytes.ofData(bytesData), 0);\n\t}\n\n\tpublic static function fromFile(path:String):BytePointer\n\t{\n\t\treturn new BytePointerData(LimeBytes.fromFile(path), 0);\n\t}\n\n\t@:from @:noCompletion public static function fromLimeBytes(bytes:LimeBytes):BytePointer\n\t{\n\t\treturn new BytePointerData(bytes, 0);\n\t}\n\n\t@:to @:noCompletion public static function toUInt8Array(bytePointer:BytePointer):UInt8Array\n\t{\n\t\t#if (js && !doc_gen)\n\t\treturn new UInt8Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 8));\n\t\t#else\n\t\treturn new UInt8Array(bytePointer.bytes, Std.int(bytePointer.offset / 8));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toUInt8ClampedArray(bytePointer:BytePointer):UInt8ClampedArray\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new UInt8ClampedArray(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 8));\n\t\t#else\n\t\treturn new UInt8ClampedArray(bytePointer.bytes, Std.int(bytePointer.offset / 8));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toInt8Array(bytePointer:BytePointer):Int8Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new Int8Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 8));\n\t\t#else\n\t\treturn new Int8Array(bytePointer.bytes, Std.int(bytePointer.offset / 8));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toUInt16Array(bytePointer:BytePointer):UInt16Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new UInt16Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 16));\n\t\t#else\n\t\treturn new UInt16Array(bytePointer.bytes, Std.int(bytePointer.offset / 16));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toInt16Array(bytePointer:BytePointer):Int16Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new Int16Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 16));\n\t\t#else\n\t\treturn new Int16Array(bytePointer.bytes, Std.int(bytePointer.offset / 16));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toUInt32Array(bytePointer:BytePointer):UInt32Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new UInt32Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 32));\n\t\t#else\n\t\treturn new UInt32Array(bytePointer.bytes, Std.int(bytePointer.offset / 32));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toInt32Array(bytePointer:BytePointer):Int32Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new Int32Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 32));\n\t\t#else\n\t\treturn new Int32Array(bytePointer.bytes, Std.int(bytePointer.offset / 32));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toFloat32Array(bytePointer:BytePointer):Float32Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new Float32Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 32));\n\t\t#else\n\t\treturn new Float32Array(bytePointer.bytes, Std.int(bytePointer.offset / 32));\n\t\t#end\n\t}\n\n\t@:to @:noCompletion public static function toFloat64Array(bytePointer:BytePointer):Float64Array\n\t{\n\t\tif (bytePointer == null || bytePointer.bytes == null) return null;\n\n\t\t#if (js && !doc_gen)\n\t\treturn new Float64Array(bytePointer.bytes.getData(), Std.int(bytePointer.offset / 64));\n\t\t#else\n\t\treturn new Float64Array(bytePointer.bytes, Std.int(bytePointer.offset / 64));\n\t\t#end\n\t}\n}\n\n@:noCompletion @:dox(hide) class BytePointerData\n{\n\tpublic var bytes:Bytes;\n\tpublic var offset:Int;\n\n\tpublic function new(bytes:Bytes, offset:Int)\n\t{\n\t\tthis.bytes = bytes;\n\t\tthis.offset = offset;\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/Bytes.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Bytes as HaxeBytes;\nimport haxe.io.BytesData;\nimport lime._internal.backend.native.NativeCFFI;\nimport lime._internal.format.Deflate;\nimport lime._internal.format.GZip;\nimport lime._internal.format.LZMA;\nimport lime._internal.format.Zlib;\nimport lime.app.Future;\nimport lime.net.HTTPRequest;\n\n@:access(haxe.io.Bytes)\n@:access(lime._internal.backend.native.NativeCFFI)\n@:forward()\n@:transitive\nabstract Bytes(HaxeBytes) from HaxeBytes to HaxeBytes\n{\n\tpublic function new(length:Int, bytesData:BytesData)\n\t{\n\t\t#if js\n\t\tthis = new HaxeBytes(bytesData);\n\t\t// bytesData may have extra bytes. See https://github.com/HaxeFoundation/haxe/issues/8974\n\t\tthis.length = length;\n\t\t#elseif hl\n\t\tthis = new HaxeBytes(bytesData, length);\n\t\t#else\n\t\tthis = new HaxeBytes(length, bytesData);\n\t\t#end\n\t}\n\n\tpublic static function alloc(length:Int):Bytes\n\t{\n\t\t#if hl\n\t\tif (length == 0) return new Bytes(0, null);\n\t\t#end\n\t\treturn HaxeBytes.alloc(length);\n\t}\n\n\tpublic function compress(algorithm:CompressionAlgorithm):Bytes\n\t{\n\t\tswitch (algorithm)\n\t\t{\n\t\t\tcase DEFLATE:\n\t\t\t\treturn Deflate.compress(this);\n\n\t\t\tcase GZIP:\n\t\t\t\treturn GZip.compress(this);\n\n\t\t\tcase LZMA:\n\t\t\t\treturn LZMA.compress(this);\n\n\t\t\tcase ZLIB:\n\t\t\t\treturn Zlib.compress(this);\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function decompress(algorithm:CompressionAlgorithm):Bytes\n\t{\n\t\tswitch (algorithm)\n\t\t{\n\t\t\tcase DEFLATE:\n\t\t\t\treturn Deflate.decompress(this);\n\n\t\t\tcase GZIP:\n\t\t\t\treturn GZip.decompress(this);\n\n\t\t\tcase LZMA:\n\t\t\t\treturn LZMA.decompress(this);\n\n\t\t\tcase ZLIB:\n\t\t\t\treturn Zlib.decompress(this);\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static inline function fastGet(b:BytesData, pos:Int):Int\n\t{\n\t\treturn HaxeBytes.fastGet(b, pos);\n\t}\n\n\tpublic static function fromBytes(bytes:haxe.io.Bytes):Bytes\n\t{\n\t\tif (bytes == null) return null;\n\n\t\treturn new Bytes(bytes.length, bytes.getData());\n\t}\n\n\tpublic static function fromFile(path:String):Bytes\n\t{\n\t\t#if (sys && lime_cffi && !macro)\n\t\t#if !cs\n\t\tvar bytes = Bytes.alloc(0);\n\t\tNativeCFFI.lime_bytes_read_file(path, bytes);\n\t\tif (bytes.length > 0) return bytes;\n\t\t#else\n\t\tvar data:Dynamic = NativeCFFI.lime_bytes_read_file(path, null);\n\t\tif (data != null) return new Bytes(data.length, data.b);\n\t\t#end\n\t\t#end\n\t\treturn null;\n\t}\n\n\tpublic static function loadFromBytes(bytes:haxe.io.Bytes):Future<Bytes>\n\t{\n\t\treturn Future.withValue(fromBytes(bytes));\n\t}\n\n\tpublic static function loadFromFile(path:String):Future<Bytes>\n\t{\n\t\tvar request = new HTTPRequest<Bytes>();\n\t\treturn request.load(path);\n\t}\n\n\tpublic static function ofData(b:BytesData):Bytes\n\t{\n\t\tvar bytes = HaxeBytes.ofData(b);\n\t\treturn new Bytes(bytes.length, bytes.getData());\n\t}\n\n\tpublic static function ofString(s:String):Bytes\n\t{\n\t\tvar bytes = HaxeBytes.ofString(s);\n\t\treturn new Bytes(bytes.length, bytes.getData());\n\t}\n\n\t#if (lime_cffi && !macro)\n\tpublic static function __fromNativePointer(data:Dynamic, length:Int):Bytes\n\t{\n\t\tvar bytes = Bytes.alloc(0);\n\t\treturn NativeCFFI.lime_bytes_from_data_pointer(data, length, bytes);\n\t}\n\t#end\n}\n"
  },
  {
    "path": "src/lime/utils/CompressionAlgorithm.hx",
    "content": "package lime.utils;\n\nenum CompressionAlgorithm\n{\n\tDEFLATE;\n\tGZIP;\n\tLZMA;\n\tZLIB;\n}\n"
  },
  {
    "path": "src/lime/utils/DataPointer.hx",
    "content": "package lime.utils;\n\nimport haxe.io.BytesData;\nimport haxe.io.Bytes;\nimport lime.system.CFFIPointer;\nimport lime.utils.Bytes as LimeBytes;\n#if cpp\nimport cpp.Char;\nimport cpp.Pointer;\nimport cpp.UInt8;\n#end\n#if (lime_cffi && !macro)\nimport lime._internal.backend.native.NativeCFFI;\n\n@:access(lime._internal.backend.native.NativeCFFI)\n#end\n@:access(haxe.io.Bytes)\n@:transitive\nabstract DataPointer(DataPointerType) to DataPointerType\n{\n\t@:noCompletion private function new(data:#if !doc_gen DataPointerType #else Dynamic #end)\n\t{\n\t\tthis = data;\n\t}\n\n\t#if (lime_cffi && !js && !doc_gen)\n\t@:from @:noCompletion private static function fromInt(value:Int):DataPointer\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tvar float:Float = value;\n\t\treturn new DataPointer(float);\n\t\t#else\n\t\treturn cast value;\n\t\t#end\n\t}\n\t#else\n\t@:from @:noCompletion private static function fromFloat(value:Float):DataPointer\n\t{\n\t\treturn cast value;\n\t}\n\t#end\n\n\t#if (cpp && !cppia && !doc_gen)\n\t#if (haxe_ver < 4)\n\t@:from @:noCompletion public static inline function fromCharPointer(pointer:Pointer<Char>):DataPointer\n\t{\n\t\treturn untyped __cpp__('(uintptr_t){0}', pointer.ptr);\n\t}\n\n\t@:from @:noCompletion public static inline function fromUint8Pointer(pointer:Pointer<UInt8>):DataPointer\n\t{\n\t\treturn untyped __cpp__('(uintptr_t){0}', pointer.ptr);\n\t}\n\t#end\n\n\t@:generic @:from @:noCompletion public static inline function fromPointer<T>(pointer:Pointer<T>):DataPointer\n\t{\n\t\treturn untyped __cpp__('(uintptr_t){0}', pointer.ptr);\n\t}\n\t#end\n\n\t@:from @:noCompletion public static function fromBytesPointer(pointer:BytePointer):DataPointer\n\t{\n\t\t#if (cpp && !doc_gen)\n\t\tif (pointer == null || pointer.bytes == null) return cast 0;\n\t\treturn Pointer.arrayElem(pointer.bytes.b, 0).add(pointer.offset);\n\t\t#elseif (lime_cffi && !macro)\n\t\tif (pointer == null || pointer.bytes == null) return cast 0;\n\t\tvar data:Float = NativeCFFI.lime_bytes_get_data_pointer_offset(pointer.bytes, pointer.offset);\n\t\treturn new DataPointer(data);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromArrayBufferView(arrayBufferView:ArrayBufferView):DataPointer\n\t{\n\t\t#if (cpp && !doc_gen)\n\t\tif (arrayBufferView == null) return cast 0;\n\t\treturn Pointer.arrayElem(arrayBufferView.buffer.b, 0).add(arrayBufferView.byteOffset);\n\t\t#elseif (lime_cffi && !js && !macro)\n\t\tif (arrayBufferView == null) return cast 0;\n\t\tvar data:Float = NativeCFFI.lime_bytes_get_data_pointer_offset(arrayBufferView.buffer, arrayBufferView.byteOffset);\n\t\treturn new DataPointer(data);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromArrayBuffer(buffer:ArrayBuffer):DataPointer\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (buffer == null) return cast 0;\n\t\treturn fromBytes(buffer);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromBytes(bytes:Bytes):DataPointer\n\t{\n\t\t#if (cpp && !doc_gen)\n\t\tif (bytes == null) return cast 0;\n\t\treturn Pointer.arrayElem(bytes.b, 0);\n\t\t#elseif (lime_cffi && !macro)\n\t\tif (bytes == null) return cast 0;\n\t\tvar data:Float = NativeCFFI.lime_bytes_get_data_pointer(bytes);\n\t\treturn new DataPointer(data);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromBytesData(bytesData:BytesData):DataPointer\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (bytesData == null) return cast 0;\n\t\treturn fromBytes(Bytes.ofData(bytesData));\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:from @:noCompletion public static function fromLimeBytes(bytes:LimeBytes):DataPointer\n\t{\n\t\treturn fromBytes(bytes);\n\t}\n\n\t#if !lime_doc_gen\n\t@:from @:noCompletion public static function fromCFFIPointer(pointer:CFFIPointer):DataPointer\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (pointer == null) return cast 0;\n\t\treturn new DataPointer(pointer.get());\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\t#end\n\n\tpublic static function fromFile(path:String):DataPointer\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\treturn fromBytes(LimeBytes.fromFile(path));\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\tprivate static function __withOffset(data:DataPointer, offset:Int):DataPointer\n\t{\n\t\t#if (lime_cffi && !macro)\n\t\tif (data == 0) return cast 0;\n\t\tvar data:Float = NativeCFFI.lime_data_pointer_offset(data, offset);\n\t\treturn new DataPointer(data);\n\t\t#else\n\t\treturn 0;\n\t\t#end\n\t}\n\n\t@:noCompletion @:op(A == B) private static inline function equals(a:DataPointer, b:Int):Bool\n\t{\n\t\treturn (a : Float) == b;\n\t}\n\n\t@:noCompletion @:op(A == B) private static inline function equalsPointer(a:DataPointer, b:DataPointer):Bool\n\t{\n\t\treturn (a : Float) == (b : Float);\n\t}\n\n\t@:noCompletion @:op(A > B) private static inline function greaterThan(a:DataPointer, b:Int):Bool\n\t{\n\t\treturn (a : Float) > b;\n\t}\n\n\t#if !lime_doc_gen\n\t@:noCompletion @:op(A > B) private static inline function greaterThanPointer(a:DataPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn (a : Float) > b;\n\t}\n\t#end\n\n\t@:noCompletion @:op(A >= B) private static inline function greaterThanOrEqual(a:DataPointer, b:Int):Bool\n\t{\n\t\treturn (a : Float) >= b;\n\t}\n\n\t#if !lime_doc_gen\n\t@:noCompletion @:op(A >= B) private static inline function greaterThanOrEqualPointer(a:DataPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn (a : Float) >= b;\n\t}\n\t#end\n\n\t@:noCompletion @:op(A < B) private static inline function lessThan(a:DataPointer, b:Int):Bool\n\t{\n\t\treturn (a : Float) < b;\n\t}\n\n\t#if !lime_doc_gen\n\t@:noCompletion @:op(A < B) private static inline function lessThanPointer(a:DataPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn (a : Float) < b;\n\t}\n\t#end\n\n\t@:noCompletion @:op(A <= B) private static inline function lessThanOrEqual(a:DataPointer, b:Int):Bool\n\t{\n\t\treturn (a : Float) <= b;\n\t}\n\n\t#if !lime_doc_gen\n\t@:noCompletion @:op(A <= B) private static inline function lessThanOrEqualPointer(a:DataPointer, b:CFFIPointer):Bool\n\t{\n\t\treturn (a : Float) <= b;\n\t}\n\t#end\n\n\t@:noCompletion @:op(A != B) private static inline function notEquals(a:DataPointer, b:Int):Bool\n\t{\n\t\treturn (a : Float) != b;\n\t}\n\n\t@:noCompletion @:op(A != B) private static inline function notEqualsPointer(a:DataPointer, b:DataPointer):Bool\n\t{\n\t\treturn (a : Float) != (b : Float);\n\t}\n\n\t@:noCompletion @:op(A + B) private static inline function plus(a:DataPointer, b:Int):DataPointer\n\t{\n\t\treturn __withOffset(a, b);\n\t}\n\n\t@:noCompletion @:op(A + B) private static inline function plusPointer(a:DataPointer, b:DataPointer):DataPointer\n\t{\n\t\treturn __withOffset(a, Std.int((b : Float)));\n\t}\n\n\t@:noCompletion @:op(A - B) private static inline function minus(a:DataPointer, b:Int):DataPointer\n\t{\n\t\treturn __withOffset(a, -b);\n\t}\n\n\t@:noCompletion @:op(A - B) private static inline function minusPointer(a:DataPointer, b:DataPointer):DataPointer\n\t{\n\t\treturn __withOffset(a, -Std.int((b : Float)));\n\t}\n}\n\n#if (lime_cffi && !js)\nprivate typedef DataPointerType = Float;\n#else\nprivate typedef DataPointerType = Int;\n#end\n"
  },
  {
    "path": "src/lime/utils/DataView.hx",
    "content": "package lime.utils;\n\nimport lime.utils.ArrayBufferView;\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.DataView as JSDataView;\n#else\nimport js.html.DataView as JSDataView;\n#end\n@:forward\nabstract DataView(JSDataView) from JSDataView to JSDataView to ArrayBufferView\n{\n\tpublic inline function new(buffer:ArrayBuffer, byteOffset:Null<Int> = null, byteLength:Null<Int> = null)\n\t{\n\t\tif (byteOffset != null && byteLength == null) this = new JSDataView(buffer, byteOffset);\n\t\telse if (byteOffset != null && byteLength != null) this = new JSDataView(buffer, byteOffset, byteLength);\n\t\telse\n\t\t\tthis = new JSDataView(buffer);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getInt8(byteOffset:Int):Int\n\t{\n\t\treturn this.getInt8(byteOffset);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getInt16(byteOffset:Int, ?littleEndian:Bool = true):Int\n\t{\n\t\treturn this.getInt16(byteOffset, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getInt32(byteOffset:Int, ?littleEndian:Bool = true):Int\n\t{\n\t\treturn this.getInt32(byteOffset, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getUint8(byteOffset:Int):UInt\n\t{\n\t\treturn this.getUint8(byteOffset);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getUint16(byteOffset:Int, ?littleEndian:Bool = true):UInt\n\t{\n\t\treturn this.getUint16(byteOffset, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getUint32(byteOffset:Int, ?littleEndian:Bool = true):UInt\n\t{\n\t\treturn this.getUint32(byteOffset, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getFloat32(byteOffset:Int, ?littleEndian:Bool = true):Float\n\t{\n\t\treturn this.getFloat32(byteOffset, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getFloat64(byteOffset:Int, ?littleEndian:Bool = true):Float\n\t{\n\t\treturn this.getFloat64(byteOffset, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setInt8(byteOffset:Int, value:Int)\n\t{\n\t\tthis.setInt8(byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setInt16(byteOffset:Int, value:Int, ?littleEndian:Bool = true)\n\t{\n\t\tthis.setInt16(byteOffset, value, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setInt32(byteOffset:Int, value:Int, ?littleEndian:Bool = true)\n\t{\n\t\tthis.setInt32(byteOffset, value, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setUint8(byteOffset:Int, value:UInt)\n\t{\n\t\tthis.setUint8(byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setUint16(byteOffset:Int, value:UInt, ?littleEndian:Bool = true)\n\t{\n\t\tthis.setUint16(byteOffset, value, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setUint32(byteOffset:Int, value:UInt, ?littleEndian:Bool = true)\n\t{\n\t\tthis.setUint32(byteOffset, value, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setFloat32(byteOffset:Int, value:Float, ?littleEndian:Bool = true)\n\t{\n\t\tthis.setFloat32(byteOffset, value, littleEndian);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setFloat64(byteOffset:Int, value:Float, ?littleEndian:Bool = true)\n\t{\n\t\tthis.setFloat64(byteOffset, value, littleEndian);\n\t}\n}\n#else\nimport lime.utils.ArrayBuffer;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass DataView\n{\n\tpublic var buffer:ArrayBuffer;\n\tpublic var byteLength:Int;\n\tpublic var byteOffset:Int;\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function new(buffer:ArrayBuffer, byteOffset:Int = 0, byteLength:Null<Int> = null)\n\t{\n\t\tif (byteOffset < 0) throw TAError.RangeError;\n\n\t\tvar bufferByteLength = buffer.length;\n\t\tvar viewByteLength = bufferByteLength - byteOffset;\n\n\t\tif (byteOffset > bufferByteLength) throw TAError.RangeError;\n\n\t\tif (byteLength != null)\n\t\t{\n\t\t\tif (byteLength < 0) throw TAError.RangeError;\n\n\t\t\tviewByteLength = byteLength;\n\n\t\t\tif (byteOffset + viewByteLength > bufferByteLength) throw TAError.RangeError;\n\t\t}\n\n\t\tthis.buffer = buffer;\n\t\tthis.byteLength = viewByteLength;\n\t\tthis.byteOffset = byteOffset;\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getInt8(byteOffset:Int):Int\n\t{\n\t\treturn ArrayBufferIO.getInt8(buffer, byteOffset);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getInt16(byteOffset:Int, ?littleEndian:Bool = true):Int\n\t{\n\t\treturn littleEndian ? ArrayBufferIO.getInt16(buffer, byteOffset) : // little endian\n\t\t\tArrayBufferIO.getInt16_BE(buffer, byteOffset); // big endian\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getInt32(byteOffset:Int, ?littleEndian:Bool = true):Int\n\t{\n\t\treturn littleEndian ? ArrayBufferIO.getInt32(buffer, byteOffset) : // little endian\n\t\t\tArrayBufferIO.getInt32_BE(buffer, byteOffset); // big endian\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getUint8(byteOffset:Int):UInt\n\t{\n\t\treturn ArrayBufferIO.getUint8(buffer, byteOffset);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getUint16(byteOffset:Int, ?littleEndian:Bool = true):UInt\n\t{\n\t\treturn littleEndian ? ArrayBufferIO.getUint16(buffer, byteOffset) : // little endian\n\t\t\tArrayBufferIO.getUint16_BE(buffer, byteOffset); // big endian\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getUint32(byteOffset:Int, ?littleEndian:Bool = true):UInt\n\t{\n\t\treturn littleEndian ? ArrayBufferIO.getUint32(buffer, byteOffset) : // little endian\n\t\t\tArrayBufferIO.getUint32_BE(buffer, byteOffset); // big endian\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getFloat32(byteOffset:Int, ?littleEndian:Bool = true):Float\n\t{\n\t\treturn littleEndian ? ArrayBufferIO.getFloat32(buffer, byteOffset) : // little endian\n\t\t\tArrayBufferIO.getFloat32_BE(buffer, byteOffset); // big endian\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function getFloat64(byteOffset:Int, ?littleEndian:Bool = true):Float\n\t{\n\t\treturn littleEndian ? ArrayBufferIO.getFloat64(buffer, byteOffset) : // little endian\n\t\t\tArrayBufferIO.getFloat64_BE(buffer, byteOffset); // big endian\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setInt8(byteOffset:Int, value:Int)\n\t{\n\t\tArrayBufferIO.setInt8(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setInt16(byteOffset:Int, value:Int, ?littleEndian:Bool = true)\n\t{\n\t\tlittleEndian ? ArrayBufferIO.setInt16(buffer, byteOffset, value) : ArrayBufferIO.setInt16_BE(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setInt32(byteOffset:Int, value:Int, ?littleEndian:Bool = true)\n\t{\n\t\tlittleEndian ? ArrayBufferIO.setInt32(buffer, byteOffset, value) : ArrayBufferIO.setInt32_BE(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setUint8(byteOffset:Int, value:UInt)\n\t{\n\t\tArrayBufferIO.setUint8(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setUint16(byteOffset:Int, value:UInt, ?littleEndian:Bool = true)\n\t{\n\t\tlittleEndian ? ArrayBufferIO.setUint16(buffer, byteOffset, value) : ArrayBufferIO.setUint16_BE(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setUint32(byteOffset:Int, value:UInt, ?littleEndian:Bool = true)\n\t{\n\t\tlittleEndian ? ArrayBufferIO.setUint32(buffer, byteOffset, value) : ArrayBufferIO.setUint32_BE(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setFloat32(byteOffset:Int, value:Float, ?littleEndian:Bool = true)\n\t{\n\t\tlittleEndian ? ArrayBufferIO.setFloat32(buffer, byteOffset, value) : ArrayBufferIO.setFloat32_BE(buffer, byteOffset, value);\n\t}\n\n\t#if !no_typedarray_inline\n\tinline\n\t#end\n\tpublic function setFloat64(byteOffset:Int, value:Float, ?littleEndian:Bool = true)\n\t{\n\t\tlittleEndian ? ArrayBufferIO.setFloat64(buffer, byteOffset, value) : ArrayBufferIO.setFloat64_BE(buffer, byteOffset, value);\n\t}\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/Float32Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Float32Array as JSFloat32Array;\nimport js.lib.Uint8Array as JSUInt8Array;\n#else\nimport js.html.Float32Array as JSFloat32Array;\nimport js.html.Uint8Array as JSUInt8Array;\n#end\n@:forward\n@:arrayAccess\n@:transitive\nabstract Float32Array(JSFloat32Array) from JSFloat32Array to JSFloat32Array\n{\n\t@:to function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 4;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Float>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSFloat32Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSFloat32Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSFloat32Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSFloat32Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSFloat32Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSFloat32Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSFloat32Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:Float):Float\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):Float\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Float32Array\n\t{\n\t\tif (byteOffset == null) return new JSFloat32Array(cast bytes.getData());\n\t\tif (len == null) return new JSFloat32Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSFloat32Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Float32Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBuffer;\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract Float32Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 4;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Float>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Float32);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float32).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float32).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float32).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float32).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for Float32Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):Float32Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Float32Array\n\t{\n\t\treturn new Float32Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function toString()\n\t\treturn this != null ? 'Float32Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n\n\t#if (haxe_ver >= 4.0) extern #else @:extern #end inline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int):Float\n\t{\n\t\treturn ArrayBufferIO.getFloat32(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT));\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:Float):Float\n\t{\n\t\tArrayBufferIO.setFloat32(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT), val);\n\t\treturn val;\n\t}\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/Float64Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Float64Array as JSFloat64Array;\nimport js.lib.Uint8Array as JSUInt8Array;\n#else\nimport js.html.Float64Array as JSFloat64Array;\nimport js.html.Uint8Array as JSUInt8Array;\n#end\n@:forward\n@:transitive\nabstract Float64Array(JSFloat64Array) from JSFloat64Array to JSFloat64Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 8;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Float>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSFloat64Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSFloat64Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSFloat64Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSFloat64Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSFloat64Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSFloat64Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSFloat64Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:Float):Float\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):Float\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Float64Array\n\t{\n\t\tif (byteOffset == null) return new JSFloat64Array(cast bytes.getData());\n\t\tif (len == null) return new JSFloat64Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSFloat64Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tfunction toString()\n\t\treturn this != null ? 'Float64Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract Float64Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 8;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Float>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Float64);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float64).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float64).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float64).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Float64).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for Float64Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):Float64Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Float64Array\n\t{\n\t\treturn new Float64Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int):Float\n\t{\n\t\treturn ArrayBufferIO.getFloat64(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT));\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:Float):Float\n\t{\n\t\tArrayBufferIO.setFloat64(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT), val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Float64Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/Int16Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Int16Array as JSInt16Array;\nimport js.lib.Uint8Array as JSUInt8Array;\n#else\nimport js.html.Int16Array as JSInt16Array;\nimport js.html.Uint8Array as JSUInt8Array;\n#end\n@:forward\n@:transitive\nabstract Int16Array(JSInt16Array) from JSInt16Array to JSInt16Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 2;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSInt16Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSInt16Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSInt16Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSInt16Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSInt16Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSInt16Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSInt16Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:Int):Int\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):Int\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Int16Array\n\t{\n\t\tif (byteOffset == null) return new JSInt16Array(cast bytes.getData());\n\t\tif (len == null) return new JSInt16Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSInt16Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Int16Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract Int16Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 2;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Int16);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int16).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int16).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int16).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int16).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for Int16Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):Int16Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Int16Array\n\t{\n\t\treturn new Int16Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getInt16(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT));\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:Int)\n\t{\n\t\tArrayBufferIO.setInt16(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT), val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Int16Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/Int32Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Int32Array as JSInt32Array;\nimport js.lib.Uint8Array as JSUInt8Array;\n#else\nimport js.html.Int32Array as JSInt32Array;\nimport js.html.Uint8Array as JSUInt8Array;\n#end\n@:forward\n@:transitive\nabstract Int32Array(JSInt32Array) from JSInt32Array to JSInt32Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 4;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSInt32Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSInt32Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSInt32Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSInt32Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSInt32Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSInt32Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSInt32Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:Int):Int\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):Int\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Int32Array\n\t{\n\t\tif (byteOffset == null) return new JSInt32Array(cast bytes.getData());\n\t\tif (len == null) return new JSInt32Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSInt32Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Int32Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract Int32Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 4;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Int32);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int32).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int32).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int32).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int32).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for Int32Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):Int32Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Int32Array\n\t{\n\t\treturn new Int32Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getInt32(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT));\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:Int)\n\t{\n\t\tArrayBufferIO.setInt32(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT), val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Int32Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/Int8Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Int8Array as JSInt8Array;\nimport js.lib.Uint8Array as JSUInt8Array;\n#else\nimport js.html.Int8Array as JSInt8Array;\nimport js.html.Uint8Array as JSUInt8Array;\n#end\n@:forward\n@:transitive\nabstract Int8Array(JSInt8Array) from JSInt8Array to JSInt8Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 1;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSInt8Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSInt8Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSInt8Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSInt8Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSInt8Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSInt8Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSInt8Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:Int):Int\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):Int\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Int8Array\n\t{\n\t\treturn new JSInt8Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Int8Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract Int8Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 1;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Int8);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int8).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int8).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int8).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Int8).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for Int8Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):Int8Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):Int8Array\n\t{\n\t\tif (byteOffset == null) return new Int8Array(null, null, cast bytes.getData());\n\t\tif (len == null) return new Int8Array(null, null, cast bytes.getData(), byteOffset);\n\t\treturn new Int8Array(null, null, cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getInt8(this.buffer, this.byteOffset + idx);\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:Int)\n\t{\n\t\tArrayBufferIO.setInt8(this.buffer, this.byteOffset + idx, val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'Int8Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/Log.hx",
    "content": "package lime.utils;\n\nimport haxe.PosInfos;\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Log\n{\n\tpublic static var level:LogLevel;\n\tpublic static var throwErrors:Bool = true;\n\n\tpublic static function debug(message:Dynamic, ?info:PosInfos):Void\n\t{\n\t\tif (level >= LogLevel.DEBUG)\n\t\t{\n\t\t\t#if js\n\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").debug(\"[\" + info.className + \"] \" + message);\n\t\t\t#else\n\t\t\tprintln(\"[\" + info.className + \"] \" + Std.string(message));\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic static function error(message:Dynamic, ?info:PosInfos):Void\n\t{\n\t\tif (level >= LogLevel.ERROR)\n\t\t{\n\t\t\tvar message = \"[\" + info.className + \"] ERROR: \" + message;\n\n\t\t\tif (throwErrors)\n\t\t\t{\n\t\t\t\t#if webassembly\n\t\t\t\tprintln(message);\n\t\t\t\t#end\n\t\t\t\tthrow message;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t#if js\n\t\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").error(message);\n\t\t\t\t#else\n\t\t\t\tprintln(message);\n\t\t\t\t#end\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function info(message:Dynamic, ?info:PosInfos):Void\n\t{\n\t\tif (level >= LogLevel.INFO)\n\t\t{\n\t\t\t#if js\n\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").info(\"[\" + info.className + \"] \" + message);\n\t\t\t#else\n\t\t\tprintln(\"[\" + info.className + \"] \" + Std.string(message));\n\t\t\t#end\n\t\t}\n\t}\n\n\tpublic static inline function print(message:Dynamic):Void\n\t{\n\t\t#if sys\n\t\tSys.print(Std.string(message));\n\t\t#elseif flash\n\t\tuntyped __global__[\"trace\"](Std.string(message));\n\t\t#elseif js\n\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").log(message);\n\t\t#else\n\t\ttrace(message);\n\t\t#end\n\t}\n\n\tpublic static inline function println(message:Dynamic):Void\n\t{\n\t\t#if sys\n\t\tSys.println(Std.string(message));\n\t\t#elseif flash\n\t\tuntyped __global__[\"trace\"](Std.string(message));\n\t\t#elseif js\n\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").log(message);\n\t\t#else\n\t\ttrace(Std.string(message));\n\t\t#end\n\t}\n\n\tpublic static function verbose(message:Dynamic, ?info:PosInfos):Void\n\t{\n\t\tif (level >= LogLevel.VERBOSE)\n\t\t{\n\t\t\tprintln(\"[\" + info.className + \"] \" + message);\n\t\t}\n\t}\n\n\tpublic static function warn(message:Dynamic, ?info:PosInfos):Void\n\t{\n\t\tif (level >= LogLevel.WARN)\n\t\t{\n\t\t\t#if js\n\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").warn(\"[\" + info.className + \"] WARNING: \" + message);\n\t\t\t#else\n\t\t\tprintln(\"[\" + info.className + \"] WARNING: \" + Std.string(message));\n\t\t\t#end\n\t\t}\n\t}\n\n\tprivate static function __init__():Void\n\t{\n\t\t#if no_traces\n\t\tlevel = NONE;\n\t\t#elseif verbose\n\t\tlevel = VERBOSE;\n\t\t#else\n\t\t#if sys\n\t\tvar args = Sys.args();\n\t\tif (args.indexOf(\"-v\") > -1 || args.indexOf(\"-verbose\") > -1)\n\t\t{\n\t\t\tlevel = VERBOSE;\n\t\t}\n\t\telse\n\t\t#end\n\t\t{\n\t\t\t#if debug\n\t\t\tlevel = DEBUG;\n\t\t\t#else\n\t\t\tlevel = INFO;\n\t\t\t#end\n\t\t}\n\t\t#end\n\n\t\t#if js\n\t\tif (untyped #if haxe4 js.Syntax.code #else __js__ #end (\"typeof console\") == \"undefined\")\n\t\t{\n\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console = {}\");\n\t\t}\n\t\tif (untyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").log == null)\n\t\t{\n\t\t\tuntyped #if haxe4 js.Syntax.code #else __js__ #end (\"console\").log = function() {};\n\t\t}\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/LogLevel.hx",
    "content": "package lime.utils;\n\n#if (haxe_ver >= 4.0) enum #else @:enum #end abstract LogLevel(Int) from Int to Int from UInt to UInt\n{\n\tvar NONE = 0;\n\tvar ERROR = 1;\n\tvar WARN = 2;\n\tvar INFO = 3;\n\tvar DEBUG = 4;\n\tvar VERBOSE = 5;\n\n\t@:op(A > B) private static inline function gt(a:LogLevel, b:LogLevel):Bool\n\t{\n\t\treturn (a : Int) > (b : Int);\n\t}\n\n\t@:op(A >= B) private static inline function gte(a:LogLevel, b:LogLevel):Bool\n\t{\n\t\treturn (a : Int) >= (b : Int);\n\t}\n\n\t@:op(A < B) private static inline function lt(a:LogLevel, b:LogLevel):Bool\n\t{\n\t\treturn (a : Int) < (b : Int);\n\t}\n\n\t@:op(A <= B) private static inline function lte(a:LogLevel, b:LogLevel):Bool\n\t{\n\t\treturn (a : Int) <= (b : Int);\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/ObjectPool.hx",
    "content": "package lime.utils;\n\nimport haxe.ds.ObjectMap;\n\n\n/**\n \tA generic object pool for reusing objects.\n **/\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n#if !js @:generic #end class ObjectPool<T>\n{\n\t/**\n  \t\tThe number of active objects in the pool.\n  \t**/\n\tpublic var activeObjects(default, null):Int;\n\n\t/**\n   \t\tThe number of inactive objects in the pool.\n   \t**/\n\tpublic var inactiveObjects(default, null):Int;\n\n\t/**\n \t\tThe total size of the object pool (both active and inactive objects).\n  \t**/\n\tpublic var size(get, set):Null<Int>;\n\n\t@:noCompletion private var __inactiveObject0:T;\n\t@:noCompletion private var __inactiveObject1:T;\n\t@:noCompletion private var __inactiveObjectList:List<T>;\n\t@:noCompletion private var __pool:Map<T, Bool>;\n\t@:noCompletion private var __size:Null<Int>;\n\n\t/**\n   \t\tCreates a new ObjectPool instance.\n   \n   \t\t@param create A function that creates a new instance of type T.\n   \t\t@param clean A function that cleans up an instance of type T before it is reused.\n   \t\t@param size The maximum size of the object pool.\n   \t**/\n\tpublic function new(create:Void->T = null, clean:T->Void = null, size:Null<Int> = null)\n\t{\n\t\t__pool = cast new ObjectMap();\n\n\t\tactiveObjects = 0;\n\t\tinactiveObjects = 0;\n\n\t\t__inactiveObject0 = null;\n\t\t__inactiveObject1 = null;\n\t\t__inactiveObjectList = new List<T>();\n\n\t\tif (create != null)\n\t\t{\n\t\t\tthis.create = create;\n\t\t}\n\t\tif (clean != null)\n\t\t{\n\t\t\tthis.clean = clean;\n\t\t}\n\t\tif (size != null)\n\t\t{\n\t\t\tthis.size = size;\n\t\t}\n\t}\n\t/**\n   \t\tAdds an object to the object pool.\n   \n   \t\t@param object The object to add to the pool.\n   \t**/\n\tpublic function add(object:T):Void\n\t{\n\t\tif (object != null && !__pool.exists(object))\n\t\t{\n\t\t\t__pool.set(object, false);\n\t\t\tclean(object);\n\t\t\t__addInactive(object);\n\t\t}\n\t}\n\n\t/**\n\t\tDynamic function.\n\n   \t\tCleans up an object before returning it to the pool.\n   \n   \t\t@param object The object to clean up.\n  \t**/\n\tpublic dynamic function clean(object:T):Void {}\n\n\t/**\n  \t\tClears the object pool, removing all objects.\n  \t**/\n\tpublic function clear():Void\n\t{\n\t\t__pool = cast new ObjectMap();\n\n\t\tactiveObjects = 0;\n\t\tinactiveObjects = 0;\n\n\t\t__inactiveObject0 = null;\n\t\t__inactiveObject1 = null;\n\t\t__inactiveObjectList.clear();\n\t}\n\n\t/**\n\t\tDynamic function.\n\n   \t\tCreates a new Object.\n     \t**/\n\tpublic dynamic function create():T\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n   \t\tCreates a new object and adds it to the pool, or returns an existing inactive object from the pool.\n   \n   \t\t@return The object retrieved from the pool, or null if the pool is full and no new objects can be created.\n  \t**/\n\tpublic function get():T\n\t{\n\t\tvar object = null;\n\n\t\tif (inactiveObjects > 0)\n\t\t{\n\t\t\tobject = __getInactive();\n\t\t}\n\t\telse if (__size == null || activeObjects < __size)\n\t\t{\n\t\t\tobject = create();\n\n\t\t\tif (object != null)\n\t\t\t{\n\t\t\t\t__pool.set(object, true);\n\t\t\t\tactiveObjects++;\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t}\n\n\t/**\n   \t\tReleases an active object back into the pool.\n   \n   \t\t@param object The object to release.\n   \t**/\n\tpublic function release(object:T):Void\n\t{\n\t\t#if debug\n\t\tif (object == null || !__pool.exists(object))\n\t\t{\n\t\t\tLog.error(\"Object is not a member of the pool\");\n\t\t}\n\t\telse if (!__pool.get(object))\n\t\t{\n\t\t\tLog.error(\"Object has already been released\");\n\t\t}\n\t\t#end\n\n\t\tactiveObjects--;\n\n\t\tif (__size == null || activeObjects + inactiveObjects < __size)\n\t\t{\n\t\t\tclean(object);\n\t\t\t__addInactive(object);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t__pool.remove(object);\n\t\t}\n\t}\n\n\t/**\n   \t\tRemoves an object from the pool.\n    \n   \t\t@param object The object to remove from the pool.\n   \t**/\n\tpublic function remove(object:T):Void\n\t{\n\t\tif (object != null && __pool.exists(object))\n\t\t{\n\t\t\t__pool.remove(object);\n\n\t\t\tif (__inactiveObject0 == object)\n\t\t\t{\n\t\t\t\t__inactiveObject0 = null;\n\t\t\t\tinactiveObjects--;\n\t\t\t}\n\t\t\telse if (__inactiveObject1 == object)\n\t\t\t{\n\t\t\t\t__inactiveObject1 = null;\n\t\t\t\tinactiveObjects--;\n\t\t\t}\n\t\t\telse if (__inactiveObjectList.remove(object))\n\t\t\t{\n\t\t\t\tinactiveObjects--;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tactiveObjects--;\n\t\t\t}\n\t\t}\n\t}\n\n\t@:noCompletion private inline function __addInactive(object:T):Void\n\t{\n\t\t#if debug\n\t\t__pool.set(object, false);\n\t\t#end\n\n\t\tif (__inactiveObject0 == null)\n\t\t{\n\t\t\t__inactiveObject0 = object;\n\t\t}\n\t\telse if (__inactiveObject1 == null)\n\t\t{\n\t\t\t__inactiveObject1 = object;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t__inactiveObjectList.add(object);\n\t\t}\n\n\t\tinactiveObjects++;\n\t}\n\n\t@:noCompletion private inline function __getInactive():T\n\t{\n\t\tvar object = null;\n\n\t\tif (__inactiveObject0 != null)\n\t\t{\n\t\t\tobject = __inactiveObject0;\n\t\t\t__inactiveObject0 = null;\n\t\t}\n\t\telse if (__inactiveObject1 != null)\n\t\t{\n\t\t\tobject = __inactiveObject1;\n\t\t\t__inactiveObject1 = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tobject = __inactiveObjectList.pop();\n\n\t\t\tif (__inactiveObjectList.length > 0)\n\t\t\t{\n\t\t\t\t__inactiveObject0 = __inactiveObjectList.pop();\n\t\t\t}\n\n\t\t\tif (__inactiveObjectList.length > 0)\n\t\t\t{\n\t\t\t\t__inactiveObject1 = __inactiveObjectList.pop();\n\t\t\t}\n\t\t}\n\n\t\t#if debug\n\t\t__pool.set(object, true);\n\t\t#end\n\n\t\tinactiveObjects--;\n\t\tactiveObjects++;\n\n\t\treturn object;\n\t}\n\n\t@:noCompletion private function __removeInactive(count:Int):Void\n\t{\n\t\tif (count <= 0 || inactiveObjects == 0) return;\n\n\t\tif (__inactiveObject0 != null)\n\t\t{\n\t\t\t__pool.remove(__inactiveObject0);\n\t\t\t__inactiveObject0 = null;\n\t\t\tinactiveObjects--;\n\t\t\tcount--;\n\t\t}\n\n\t\tif (count == 0 || inactiveObjects == 0) return;\n\n\t\tif (__inactiveObject1 != null)\n\t\t{\n\t\t\t__pool.remove(__inactiveObject1);\n\t\t\t__inactiveObject1 = null;\n\t\t\tinactiveObjects--;\n\t\t\tcount--;\n\t\t}\n\n\t\tif (count == 0 || inactiveObjects == 0) return;\n\n\t\tfor (object in __inactiveObjectList)\n\t\t{\n\t\t\t__pool.remove(object);\n\t\t\t__inactiveObjectList.remove(object);\n\t\t\tinactiveObjects--;\n\t\t\tcount--;\n\n\t\t\tif (count == 0 || inactiveObjects == 0) return;\n\t\t}\n\t}\n\n\t// Get & Set Methods\n\t@:noCompletion private function get_size():Null<Int>\n\t{\n\t\treturn __size;\n\t}\n\n\t@:noCompletion private function set_size(value:Null<Int>):Null<Int>\n\t{\n\t\tif (value == null)\n\t\t{\n\t\t\t__size = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar current = inactiveObjects + activeObjects;\n\t\t\t__size = value;\n\n\t\t\tif (current > value)\n\t\t\t{\n\t\t\t\t__removeInactive(current - value);\n\t\t\t}\n\t\t\telse if (value > current)\n\t\t\t{\n\t\t\t\tvar object;\n\n\t\t\t\tfor (i in 0...(value - current))\n\t\t\t\t{\n\t\t\t\t\tobject = create();\n\n\t\t\t\t\tif (object != null)\n\t\t\t\t\t{\n\t\t\t\t\t\t__pool.set(object, false);\n\t\t\t\t\t\t__inactiveObjectList.add(object);\n\t\t\t\t\t\tinactiveObjects++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/PackedAssetLibrary.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Bytes;\nimport haxe.io.Path;\nimport lime.app.Event;\nimport lime.app.Future;\nimport lime.app.Promise;\nimport lime.media.AudioBuffer;\nimport lime.graphics.Image;\nimport lime.net.HTTPRequest;\nimport lime.text.Font;\nimport lime.utils.AssetType;\nimport lime.utils.Bytes;\n#if flash\nimport flash.display.BitmapData;\nimport flash.media.Sound;\n#end\n\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\n@:keep class PackedAssetLibrary extends AssetLibrary\n{\n\t@:noCompletion private var id:String;\n\t@:noCompletion private var lengths = new Map<String, Int>();\n\t@:noCompletion private var packedData:Bytes;\n\t@:noCompletion private var positions = new Map<String, Int>();\n\t@:noCompletion private var type:String;\n\t@:noCompletion private var rootPath:String;\n\n\tpublic function new(id:String, type:String)\n\t{\n\t\tsuper();\n\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t}\n\n\tpublic static function fromBytes(bytes:Bytes, rootPath:String = null):PackedAssetLibrary\n\t{\n\t\treturn cast fromManifest(AssetManifest.fromBytes(bytes, rootPath));\n\t}\n\n\tpublic static function fromFile(path:String, rootPath:String = null):PackedAssetLibrary\n\t{\n\t\treturn cast fromManifest(AssetManifest.fromFile(path, rootPath));\n\t}\n\n\tpublic static function fromManifest(manifest:AssetManifest):PackedAssetLibrary\n\t{\n\t\treturn cast AssetLibrary.fromManifest(manifest);\n\t}\n\n\tpublic override function getAudioBuffer(id:String):AudioBuffer\n\t{\n\t\t#if (js && html5)\n\t\treturn super.getAudioBuffer(id);\n\t\t#else\n\t\tif (cachedAudioBuffers.exists(id))\n\t\t{\n\t\t\treturn cachedAudioBuffers.get(id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn AudioBuffer.fromBytes(bytes);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic override function getBytes(id:String):Bytes\n\t{\n\t\tif (cachedBytes.exists(id))\n\t\t{\n\t\t\treturn cachedBytes.get(id);\n\t\t}\n\t\telse if (cachedText.exists(id))\n\t\t{\n\t\t\tvar bytes = Bytes.ofString(cachedText.get(id));\n\t\t\tcachedBytes.set(id, bytes);\n\t\t\treturn bytes;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn bytes;\n\t\t}\n\t}\n\n\tpublic override function getFont(id:String):Font\n\t{\n\t\t#if (js && html5)\n\t\treturn super.getFont(id);\n\t\t#else\n\t\tif (cachedFonts.exists(id))\n\t\t{\n\t\t\treturn cachedFonts.get(id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Font.fromBytes(bytes);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic override function getImage(id:String):Image\n\t{\n\t\tif (cachedImages.exists(id))\n\t\t{\n\t\t\treturn cachedImages.get(id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Image.fromBytes(bytes);\n\t\t}\n\t}\n\n\tpublic override function getText(id:String):String\n\t{\n\t\tif (cachedText.exists(id))\n\t\t{\n\t\t\treturn cachedText.get(id);\n\t\t}\n\t\telse if (type == \"gzip\" || type == \"zip\" || type == \"deflate\")\n\t\t{\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn bytes.getString(0, bytes.length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn packedData.getString(positions[id], lengths[id]);\n\t\t}\n\t}\n\n\tpublic override function isLocal(id:String, type:String):Bool\n\t{\n\t\treturn true;\n\t}\n\n\tpublic override function load():Future<AssetLibrary>\n\t{\n\t\tif (loaded)\n\t\t{\n\t\t\treturn Future.withValue(cast this);\n\t\t}\n\n\t\tif (promise == null)\n\t\t{\n\t\t\tpromise = new Promise<AssetLibrary>();\n\t\t\tbytesLoadedCache = new Map();\n\n\t\t\t// TODO: Handle `preload` for individual assets\n\t\t\t// TODO: Do not preload bytes on native, if we can read from it instead (all non-Android targets?)\n\n\t\t\tassetsLoaded = 0;\n\t\t\tassetsTotal = 2; //for our initial __assetLoaded(null) call and __assetLoaded(this.id)\n\n\t\t\tfor (id in preload.keys())\n\t\t\t{\n\t\t\t\tif (!preload.get(id)) continue;\n\n\t\t\t\tswitch (types.get(id))\n\t\t\t\t{\n\t\t\t\t\tcase BINARY, FONT, IMAGE, TEXT:\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\tcase MUSIC, SOUND:\n\t\t\t\t\t\tLog.verbose(\"Preloading asset: \" + id + \" [\" + types.get(id) + \"]\");\n\t\t\t\t\t\tassetsTotal++;\n\n\t\t\t\t\t\tvar future = loadAudioBuffer(id);\n\t\t\t\t\t\tfuture.onProgress(load_onProgress.bind(id));\n\t\t\t\t\t\tfuture.onError(loadAudioBuffer_onError.bind(id));\n\t\t\t\t\t\tfuture.onComplete(loadAudioBuffer_onComplete.bind(id));\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar packedData_onComplete = function(data:Bytes)\n\t\t\t{\n\t\t\t\tcachedBytes.set(id, data);\n\t\t\t\tpackedData = data;\n\n\t\t\t\t__assetLoaded(this.id);\n\n\t\t\t\tfor (id in preload.keys())\n\t\t\t\t{\n\t\t\t\t\tif (!preload.get(id)) continue;\n\n\t\t\t\t\tswitch (types.get(id))\n\t\t\t\t\t{\n\t\t\t\t\t\tcase BINARY:\n\t\t\t\t\t\t\tLog.verbose(\"Preloading asset: \" + id + \" [\" + types.get(id) + \"]\");\n\t\t\t\t\t\t\tvar future = loadBytes(id);\n\t\t\t\t\t\t\t// future.onProgress (load_onProgress.bind (id));\n\t\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\t\tfuture.onComplete(loadBytes_onComplete.bind(id));\n\n\t\t\t\t\t\tcase FONT:\n\t\t\t\t\t\t\tLog.verbose(\"Preloading asset: \" + id + \" [\" + types.get(id) + \"]\");\n\t\t\t\t\t\t\tvar future = loadFont(id);\n\t\t\t\t\t\t\t// future.onProgress (load_onProgress.bind (id));\n\t\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\t\tfuture.onComplete(loadFont_onComplete.bind(id));\n\n\t\t\t\t\t\tcase IMAGE:\n\t\t\t\t\t\t\tLog.verbose(\"Preloading asset: \" + id + \" [\" + types.get(id) + \"]\");\n\t\t\t\t\t\t\tvar future = loadImage(id);\n\t\t\t\t\t\t\t// future.onProgress (load_onProgress.bind (id));\n\t\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\t\tfuture.onComplete(loadImage_onComplete.bind(id));\n\n\t\t\t\t\t\tcase TEXT:\n\t\t\t\t\t\t\tLog.verbose(\"Preloading asset: \" + id + \" [\" + types.get(id) + \"]\");\n\t\t\t\t\t\t\tvar future = loadText(id);\n\t\t\t\t\t\t\t// future.onProgress (load_onProgress.bind (id));\n\t\t\t\t\t\t\tfuture.onError(load_onError.bind(id));\n\t\t\t\t\t\t\tfuture.onComplete(loadText_onComplete.bind(id));\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t__assetLoaded(null);\n\n\t\t\tif (cachedBytes.exists(id))\n\t\t\t{\n\t\t\t\tpackedData_onComplete(cachedBytes.get(id));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar basePath = rootPath == null || rootPath == \"\" ?  \"\" : Path.addTrailingSlash(rootPath);\n\t\t\t\tvar libPath = getPath(id);\n\t\t\t\tif (libPath == null) libPath = id;\n\n\t\t\t\tvar path = Path.join([basePath, libPath]);\n\t\t\t\tpath = __cacheBreak(path);\n\n\t\t\t\tvar packedData_onProgress = load_onProgress.bind(this.id);\n\n\t\t\t\tBytes.loadFromFile(path).onProgress(packedData_onProgress).onError(promise.error).onComplete(packedData_onComplete);\n\t\t\t}\n\t\t}\n\n\t\treturn promise.future;\n\t}\n\n\tpublic override function loadAudioBuffer(id:String):Future<AudioBuffer>\n\t{\n\t\t#if (js && html5)\n\t\treturn super.loadAudioBuffer(id);\n\t\t#else\n\t\tif (cachedAudioBuffers.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedAudioBuffers.get(id));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method, use `loadFromBytes` method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Future.withValue(AudioBuffer.fromBytes(bytes));\n\t\t}\n\t\t#end\n\t}\n\n\tpublic override function loadBytes(id:String):Future<Bytes>\n\t{\n\t\tif (cachedBytes.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedBytes.get(id));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Future.withValue(bytes);\n\t\t}\n\t}\n\n\tpublic override function loadFont(id:String):Future<Font>\n\t{\n\t\t#if (js && html5)\n\t\treturn super.loadFont(id);\n\t\t#else\n\t\tif (cachedFonts.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedFonts.get(id));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Font.loadFromBytes(bytes);\n\t\t}\n\t\t#end\n\t}\n\n\tpublic static function loadFromBytes(bytes:Bytes, rootPath:String = null):Future<PackedAssetLibrary>\n\t{\n\t\treturn AssetLibrary.loadFromBytes(bytes, rootPath).then(function(library)\n\t\t{\n\t\t\tvar assetLibrary:PackedAssetLibrary = cast library;\n\t\t\treturn Future.withValue(assetLibrary);\n\t\t});\n\t}\n\n\tpublic static function loadFromFile(path:String, rootPath:String = null):Future<PackedAssetLibrary>\n\t{\n\t\treturn AssetLibrary.loadFromFile(path, rootPath).then(function(library)\n\t\t{\n\t\t\tvar assetLibrary:PackedAssetLibrary = cast library;\n\t\t\treturn Future.withValue(assetLibrary);\n\t\t});\n\t}\n\n\tpublic static function loadFromManifest(manifest:AssetManifest):Future<PackedAssetLibrary>\n\t{\n\t\treturn AssetLibrary.loadFromManifest(manifest).then(function(library)\n\t\t{\n\t\t\tvar assetLibrary:PackedAssetLibrary = cast library;\n\t\t\treturn Future.withValue(assetLibrary);\n\t\t});\n\t}\n\n\tpublic override function loadImage(id:String):Future<Image>\n\t{\n\t\tif (cachedImages.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedImages.get(id));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// TODO: More efficient method\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Image.loadFromBytes(bytes);\n\t\t}\n\t}\n\n\tpublic override function loadText(id:String):Future<String>\n\t{\n\t\tif (cachedText.exists(id))\n\t\t{\n\t\t\treturn Future.withValue(cachedText.get(id));\n\t\t}\n\t\telse if (cachedBytes.exists(id))\n\t\t{\n\t\t\tvar bytes = getBytes(id);\n\n\t\t\tif (bytes == null)\n\t\t\t{\n\t\t\t\treturn cast Future.withValue(null);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar text = bytes.getString(0, bytes.length);\n\t\t\t\tcachedText.set(id, text);\n\t\t\t\treturn Future.withValue(text);\n\t\t\t}\n\t\t}\n\t\telse if (type == \"gzip\" || type == \"deflate\")\n\t\t{\n\t\t\tvar bytes = Bytes.alloc(lengths[id]);\n\t\t\tbytes.blit(0, packedData, positions[id], lengths[id]);\n\t\t\tif (type == \"gzip\") bytes = bytes.decompress(GZIP);\n\t\t\telse if (type == \"zip\" || type == \"deflate\") bytes = bytes.decompress(DEFLATE);\n\t\t\treturn Future.withValue(bytes.getString(0, bytes.length));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn Future.withValue(packedData.getString(positions[id], lengths[id]));\n\t\t}\n\t}\n\n\tpublic override function unload():Void {}\n\n\t@:noCompletion private override function __fromManifest(manifest:AssetManifest):Void\n\t{\n\t\trootPath = manifest.rootPath;\n\n\t\tsuper.__fromManifest(manifest);\n\n\t\tvar packedBytesTotal = 0;\n\t\tbytesTotal = 0;\n\n\t\tfor (asset in manifest.assets)\n\t\t{\n\t\t\tvar id = asset.id;\n\n\t\t\tif (Reflect.hasField(asset, \"position\"))\n\t\t\t{\n\t\t\t\tpositions.set(id, Reflect.field(asset, \"position\"));\n\t\t\t}\n\n\t\t\tif (Reflect.hasField(asset, \"length\"))\n\t\t\t{\n\t\t\t\tvar length = Reflect.field(asset, \"length\");\n\t\t\t\tlengths.set(id, length);\n\n\t\t\t\t//for individual packed assets, the size represents the work done unpacking them\n\t\t\t\t//since this is likely to be much faster than downloading, set it to something\n\t\t\t\t//small like the packed length / 10.\n\t\t\t\tsizes.set(id, Math.floor(length / 10));\n\n\t\t\t\tpackedBytesTotal += length;\n\t\t\t}\n\n\t\t\tif (preload.exists(id) && preload.get(id) && sizes.exists(id))\n\t\t\t{\n\t\t\t\tbytesTotal += sizes.get(id);\n\t\t\t}\n\t\t}\n\t\t\n\t\tsizes.set(this.id, packedBytesTotal);\n\t\tbytesTotal += packedBytesTotal;\n\t}\n\n\t@:noCompletion private override function __assetLoaded(id:String):Void\n\t{\n\t\tassetsLoaded++;\n\n\t\tif (id != null)\n\t\t{\n\t\t\tLog.verbose(\"Loaded asset: \" + id + \" [\" + types.get(id) + \"] (\" + (assetsLoaded - 1) + \"/\" + (assetsTotal - 1) + \")\");\n\t\t}\n\n\t\tif (id != null)\n\t\t{\n\t\t\tvar size = sizes.exists(id) ? sizes.get(id) : 0;\n\n\t\t\tif (!bytesLoadedCache.exists(id))\n\t\t\t{\n\t\t\t\tbytesLoaded += size;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar cache = bytesLoadedCache.get(id);\n\n\t\t\t\tif (cache < size)\n\t\t\t\t{\n\t\t\t\t\tbytesLoaded += (size - cache);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbytesLoadedCache.set(id, size);\n\t\t}\n\n\t\tif (assetsLoaded < assetsTotal)\n\t\t{\n\t\t\tpromise.progress(bytesLoaded, bytesTotal);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tloaded = true;\n\t\t\tpromise.progress(bytesTotal, bytesTotal);\n\t\t\tpromise.complete(this);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/Preloader.hx",
    "content": "package lime.utils;\n\nimport haxe.ds.ObjectMap;\nimport haxe.io.Bytes;\nimport haxe.io.Path;\nimport haxe.macro.Compiler;\nimport haxe.Timer;\nimport lime.app.Event;\nimport lime.media.AudioBuffer;\nimport lime.system.System;\nimport lime.utils.AssetLibrary;\nimport lime.utils.Assets;\nimport lime.utils.AssetType;\nimport lime.utils.Log;\n#if (js && html5)\nimport js.html.Image;\nimport js.html.SpanElement;\nimport js.Browser;\nimport lime.net.HTTPRequest;\n#elseif flash\nimport flash.display.LoaderInfo;\nimport flash.display.Sprite;\nimport flash.events.ProgressEvent;\nimport flash.Lib;\n#end\n\n@:access(lime.utils.AssetLibrary)\n#if !lime_debug\n@:fileXml('tags=\"haxe,release\"')\n@:noDebug\n#end\nclass Preloader #if flash extends Sprite #end\n{\n\tpublic var complete(default, null):Bool;\n\tpublic var onComplete = new Event<Void->Void>();\n\tpublic var onProgress = new Event<Int->Int->Void>();\n\n\t@:noCompletion private var bytesLoaded:Int;\n\t@:noCompletion private var bytesLoadedCache = new ObjectMap<#if !disable_preloader_assets AssetLibrary #else Dynamic #end, Int>();\n\t@:noCompletion private var bytesLoadedCache2 = new Map<String, Int>();\n\t@:noCompletion private var bytesTotal:Int;\n\t@:noCompletion private var bytesTotalCache = new Map<String, Int>();\n\t@:noCompletion private var initLibraryNames:Bool;\n\t@:noCompletion private var libraries:Array<#if !disable_preloader_assets AssetLibrary #else Dynamic #end>;\n\t@:noCompletion private var libraryNames:Array<String>;\n\t@:noCompletion private var loadedLibraries:Int;\n\t@:noCompletion private var loadedStage:Bool;\n\t@:noCompletion private var preloadComplete:Bool;\n\t@:noCompletion private var preloadStarted:Bool;\n\t@:noCompletion private var simulateProgress:Bool;\n\n\tpublic function new()\n\t{\n\t\t// TODO: Split out core preloader support from generic Preloader type\n\n\t\t#if flash\n\t\tsuper();\n\t\t#end\n\n\t\tbytesLoaded = 0;\n\t\tbytesTotal = 0;\n\n\t\tlibraries = new Array<#if !disable_preloader_assets AssetLibrary #else Dynamic #end>();\n\t\tlibraryNames = new Array<String>();\n\n\t\tonProgress.add(update);\n\n\t\t#if simulate_preloader\n\t\tvar preloadTime = Std.parseInt(Compiler.getDefine(\"simulate_preloader\"));\n\n\t\tif (preloadTime == 1)\n\t\t{\n\t\t\tpreloadTime = 3000;\n\t\t}\n\n\t\tvar startTime = System.getTimer();\n\t\tvar currentTime = 0;\n\t\tvar timeStep = Std.int(1000 / 60);\n\t\tvar timer = new Timer(timeStep);\n\n\t\tsimulateProgress = true;\n\n\t\ttimer.run = function()\n\t\t{\n\t\t\tcurrentTime = System.getTimer() - startTime;\n\t\t\tif (currentTime > preloadTime) currentTime = preloadTime;\n\t\t\tonProgress.dispatch(currentTime, preloadTime);\n\n\t\t\tif (currentTime >= preloadTime)\n\t\t\t{\n\t\t\t\ttimer.stop();\n\n\t\t\t\tsimulateProgress = false;\n\t\t\t\tstart();\n\t\t\t}\n\t\t};\n\t\t#end\n\n\t\t#if flash\n\t\tLib.current.addChild(this);\n\n\t\tLib.current.loaderInfo.addEventListener(flash.events.Event.COMPLETE, loaderInfo_onComplete);\n\t\tLib.current.loaderInfo.addEventListener(flash.events.Event.INIT, loaderInfo_onInit);\n\t\tLib.current.loaderInfo.addEventListener(ProgressEvent.PROGRESS, loaderInfo_onProgress);\n\t\tLib.current.addEventListener(flash.events.Event.ENTER_FRAME, current_onEnter);\n\t\t#end\n\t}\n\n\tpublic function addLibrary(library:#if !disable_preloader_assets AssetLibrary #else Dynamic #end):Void\n\t{\n\t\tlibraries.push(library);\n\t}\n\n\tpublic function addLibraryName(name:String):Void\n\t{\n\t\tif (libraryNames.indexOf(name) == -1)\n\t\t{\n\t\t\tlibraryNames.push(name);\n\t\t}\n\t}\n\n\tpublic function load():Void\n\t{\n\t\tfor (library in libraries)\n\t\t{\n\t\t\tbytesTotal += library.bytesTotal;\n\t\t}\n\n\t\tloadedLibraries = -1;\n\t\tpreloadStarted = false;\n\n\t\tfor (library in libraries)\n\t\t{\n\t\t\tLog.verbose(\"Preloading asset library\");\n\n\t\t\tlibrary.load()\n\t\t\t\t.onProgress(function(loaded, total)\n\t\t\t\t{\n\t\t\t\t\tif (!bytesLoadedCache.exists(library))\n\t\t\t\t\t{\n\t\t\t\t\t\tbytesLoaded += loaded;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbytesLoaded += loaded - bytesLoadedCache.get(library);\n\t\t\t\t\t}\n\n\t\t\t\t\tbytesLoadedCache.set(library, loaded);\n\n\t\t\t\t\tif (!simulateProgress)\n\t\t\t\t\t{\n\t\t\t\t\t\tonProgress.dispatch(bytesLoaded, bytesTotal);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.onComplete(function(_)\n\t\t\t\t{\n\t\t\t\t\tif (!bytesLoadedCache.exists(library))\n\t\t\t\t\t{\n\t\t\t\t\t\tbytesLoaded += library.bytesTotal;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbytesLoaded += Std.int(library.bytesTotal) - bytesLoadedCache.get(library);\n\t\t\t\t\t}\n\n\t\t\t\t\tloadedAssetLibrary();\n\t\t\t\t})\n\t\t\t\t.onError(function(e)\n\t\t\t\t{\n\t\t\t\t\tLog.error(e);\n\t\t\t\t});\n\t\t}\n\n\t\t// TODO: Handle bytes total better\n\n\t\tfor (name in libraryNames)\n\t\t{\n\t\t\tbytesTotal += 200;\n\t\t}\n\n\t\tloadedLibraries++;\n\t\tpreloadStarted = true;\n\t\tupdateProgress();\n\t}\n\n\t@:noCompletion private function loadedAssetLibrary(name:String = null):Void\n\t{\n\t\tloadedLibraries++;\n\n\t\tvar current = loadedLibraries;\n\t\tif (!preloadStarted) current++;\n\n\t\tvar totalLibraries = libraries.length + libraryNames.length;\n\n\t\tif (name != null)\n\t\t{\n\t\t\tLog.verbose(\"Loaded asset library: \" + name + \" [\" + current + \"/\" + totalLibraries + \"]\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.verbose(\"Loaded asset library [\" + current + \"/\" + totalLibraries + \"]\");\n\t\t}\n\n\t\tupdateProgress();\n\t}\n\n\t@:noCompletion private function start():Void\n\t{\n\t\tif (complete || simulateProgress || !preloadComplete) return;\n\n\t\tcomplete = true;\n\n\t\t#if flash\n\t\tif (Lib.current.contains(this))\n\t\t{\n\t\t\tLib.current.removeChild(this);\n\t\t}\n\t\t#end\n\n\t\tonComplete.dispatch();\n\t}\n\n\t@:noCompletion private function update(loaded:Int, total:Int):Void {}\n\n\t@:noCompletion private function updateProgress():Void\n\t{\n\t\tif (!simulateProgress)\n\t\t{\n\t\t\tonProgress.dispatch(bytesLoaded, bytesTotal);\n\t\t}\n\n\t\t#if !disable_preloader_assets\n\t\tif (#if flash loadedStage && #end loadedLibraries == libraries.length && !initLibraryNames)\n\t\t{\n\t\t\tinitLibraryNames = true;\n\n\t\t\tfor (name in libraryNames)\n\t\t\t{\n\t\t\t\tLog.verbose(\"Preloading asset library: \" + name);\n\n\t\t\t\tAssets.loadLibrary(name)\n\t\t\t\t\t.onProgress(function(loaded, total)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (total > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!bytesTotalCache.exists(name))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbytesTotalCache.set(name, total);\n\t\t\t\t\t\t\t\tbytesTotal += (total - 200);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (loaded > total) loaded = total;\n\n\t\t\t\t\t\t\tif (!bytesLoadedCache2.exists(name))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbytesLoaded += loaded;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbytesLoaded += loaded - bytesLoadedCache2.get(name);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbytesLoadedCache2.set(name, loaded);\n\n\t\t\t\t\t\t\tif (!simulateProgress)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tonProgress.dispatch(bytesLoaded, bytesTotal);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.onComplete(function(library)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar total = 200;\n\n\t\t\t\t\t\tif (bytesTotalCache.exists(name))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttotal = bytesTotalCache.get(name);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!bytesLoadedCache2.exists(name))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbytesLoaded += total;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbytesLoaded += total - bytesLoadedCache2.get(name);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tloadedAssetLibrary(name);\n\t\t\t\t\t})\n\t\t\t\t\t.onError(function(e)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(e);\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t#end\n\n\t\tif (!simulateProgress #if flash && loadedStage #end\n\t\t\t&& loadedLibraries == (libraries.length + libraryNames.length))\n\t\t{\n\t\t\tif (!preloadComplete)\n\t\t\t{\n\t\t\t\tpreloadComplete = true;\n\n\t\t\t\tLog.verbose(\"Preload complete\");\n\t\t\t}\n\n\t\t\tstart();\n\t\t}\n\t}\n\n\t#if flash\n\t@:noCompletion private function current_onEnter(event:flash.events.Event):Void\n\t{\n\t\tif (!loadedStage && Lib.current.loaderInfo.bytesLoaded == Lib.current.loaderInfo.bytesTotal)\n\t\t{\n\t\t\tloadedStage = true;\n\n\t\t\tif (bytesTotalCache[\"_root\"] > 0)\n\t\t\t{\n\t\t\t\tvar loaded = Lib.current.loaderInfo.bytesLoaded;\n\t\t\t\tbytesLoaded += loaded - bytesLoadedCache2[\"_root\"];\n\t\t\t\tbytesLoadedCache2[\"_root\"] = loaded;\n\n\t\t\t\tupdateProgress();\n\t\t\t}\n\t\t}\n\n\t\tif (loadedStage)\n\t\t{\n\t\t\tLib.current.removeEventListener(flash.events.Event.ENTER_FRAME, current_onEnter);\n\t\t\tLib.current.loaderInfo.removeEventListener(flash.events.Event.COMPLETE, loaderInfo_onComplete);\n\t\t\tLib.current.loaderInfo.removeEventListener(flash.events.Event.INIT, loaderInfo_onInit);\n\t\t\tLib.current.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, loaderInfo_onProgress);\n\n\t\t\tupdateProgress();\n\t\t}\n\t}\n\n\t@:noCompletion private function loaderInfo_onComplete(event:flash.events.Event):Void\n\t{\n\t\t// loadedStage = true;\n\n\t\tif (bytesTotalCache[\"_root\"] > 0)\n\t\t{\n\t\t\tvar loaded = Lib.current.loaderInfo.bytesLoaded;\n\t\t\tbytesLoaded += loaded - bytesLoadedCache2[\"_root\"];\n\t\t\tbytesLoadedCache2[\"_root\"] = loaded;\n\n\t\t\tupdateProgress();\n\t\t}\n\t}\n\n\t@:noCompletion private function loaderInfo_onInit(event:flash.events.Event):Void\n\t{\n\t\tbytesTotal += Lib.current.loaderInfo.bytesTotal;\n\t\tbytesTotalCache[\"_root\"] = Lib.current.loaderInfo.bytesTotal;\n\n\t\tif (bytesTotalCache[\"_root\"] > 0)\n\t\t{\n\t\t\tvar loaded = Lib.current.loaderInfo.bytesLoaded;\n\t\t\tbytesLoaded += loaded;\n\t\t\tbytesLoadedCache2[\"_root\"] = loaded;\n\n\t\t\tupdateProgress();\n\t\t}\n\t}\n\n\t@:noCompletion private function loaderInfo_onProgress(event:flash.events.ProgressEvent):Void\n\t{\n\t\tif (bytesTotalCache[\"_root\"] > 0)\n\t\t{\n\t\t\tvar loaded = Lib.current.loaderInfo.bytesLoaded;\n\t\t\tbytesLoaded += loaded - bytesLoadedCache2[\"_root\"];\n\t\t\tbytesLoadedCache2[\"_root\"] = loaded;\n\n\t\t\tupdateProgress();\n\t\t}\n\t}\n\t#end\n}\n"
  },
  {
    "path": "src/lime/utils/Resource.hx",
    "content": "package lime.utils;\n\nimport haxe.io.Bytes;\n\n@:transitive\nabstract Resource(Bytes) from Bytes to Bytes\n{\n\tpublic function new(size:Int = 0)\n\t{\n\t\tthis = Bytes.alloc(size);\n\t}\n\n\t@:from private static inline function __fromString(value:String):Resource\n\t{\n\t\treturn Bytes.ofString(value);\n\t}\n\n\t@:to private static inline function __toString(value:Resource):String\n\t{\n\t\treturn (value : Bytes).toString();\n\t}\n}\n"
  },
  {
    "path": "src/lime/utils/UInt16Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Uint8Array as JSUInt8Array;\nimport js.lib.Uint16Array as JSUInt16Array;\n#else\nimport js.html.Uint8Array as JSUInt8Array;\nimport js.html.Uint16Array as JSUInt16Array;\n#end\n@:forward\n@:transitive\nabstract UInt16Array(JSUInt16Array) from JSUInt16Array to JSUInt16Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 2;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSUInt16Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSUInt16Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt16Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt16Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSUInt16Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSUInt16Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSUInt16Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:UInt):UInt\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):UInt\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt16Array\n\t{\n\t\tif (byteOffset == null) return new JSUInt16Array(cast bytes.getData());\n\t\tif (len == null) return new JSUInt16Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSUInt16Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt16Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract UInt16Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 2;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Uint16);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint16).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint16).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint16).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint16).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for UInt16Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):UInt16Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt16Array\n\t{\n\t\treturn new UInt16Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getUint16(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT));\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:UInt)\n\t{\n\t\tArrayBufferIO.setUint16(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT), val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt16Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/UInt32Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Uint8Array as JSUInt8Array;\nimport js.lib.Uint32Array as JSUInt32Array;\n#else\nimport js.html.Uint8Array as JSUInt8Array;\nimport js.html.Uint32Array as JSUInt32Array;\n#end\n@:forward\n@:transitive\nabstract UInt32Array(JSUInt32Array) from JSUInt32Array to JSUInt32Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 4;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSUInt32Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSUInt32Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt32Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt32Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSUInt32Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSUInt32Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSUInt32Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:UInt):UInt\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):UInt\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt32Array\n\t{\n\t\tif (byteOffset == null) return new JSUInt32Array(cast bytes.getData());\n\t\tif (len == null) return new JSUInt32Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSUInt32Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt32Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract UInt32Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 4;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Uint32);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint32).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint32).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint32).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint32).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for UInt32Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):UInt32Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt32Array\n\t{\n\t\treturn new UInt32Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getUint32(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT));\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:UInt)\n\t{\n\t\tArrayBufferIO.setUint32(this.buffer, this.byteOffset + (idx * BYTES_PER_ELEMENT), val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt32Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/UInt8Array.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Uint8Array as JSUInt8Array;\n#else\nimport js.html.Uint8Array as JSUInt8Array;\n#end\n@:forward\n@:transitive\nabstract UInt8Array(JSUInt8Array) from JSUInt8Array to JSUInt8Array\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 1;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSUInt8Array(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSUInt8Array(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt8Array(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt8Array(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSUInt8Array(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSUInt8Array(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSUInt8Array(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:UInt):UInt\n\t\treturn this[idx] = val;\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):UInt\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int, ?len:Int):UInt8Array\n\t{\n\t\tif (byteOffset == null) return new JSUInt8Array(cast bytes.getData());\n\t\tif (len == null) return new JSUInt8Array(cast bytes.getData(), byteOffset);\n\t\treturn new JSUInt8Array(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt8Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\nabstract UInt8Array(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 1;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Uint8);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for UInt8Array\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):UInt8Array\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt8Array\n\t{\n\t\treturn new UInt8Array(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function toString()\n\t\treturn this != null ? 'UInt8Array [byteLength:${this.byteLength}, length:${this.length}]' : null;\n\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getUint8(this.buffer, this.byteOffset + idx);\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:UInt)\n\t{\n\t\tArrayBufferIO.setUint8(this.buffer, this.byteOffset + idx, val);\n\t\treturn val;\n\t}\n}\n#end // !js\n"
  },
  {
    "path": "src/lime/utils/UInt8ClampedArray.hx",
    "content": "package lime.utils;\n\n#if (js && !doc_gen)\n#if haxe4\nimport js.lib.Uint8Array as JSUInt8Array;\nimport js.lib.Uint8ClampedArray as JSUInt8ClampedArray;\n#else\nimport js.html.Uint8Array as JSUInt8Array;\nimport js.html.Uint8ClampedArray as JSUInt8ClampedArray;\n#end\n@:forward\n@:transitive\nabstract UInt8ClampedArray(JSUInt8ClampedArray) from JSUInt8ClampedArray to JSUInt8ClampedArray\n{\n\t@:to inline function toArrayBufferView():ArrayBufferView\n\t\treturn this;\n\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 1;\n\n\t@:generic\n\tpublic inline function new<T>(?elements:Int, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView, ?buffer:ArrayBuffer,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new JSUInt8ClampedArray(elements);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new JSUInt8ClampedArray(untyped array);\n\t\t#if (openfl && commonjs)\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt8ClampedArray(untyped (vector));\n\t\t#elseif openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new JSUInt8ClampedArray(untyped untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new JSUInt8ClampedArray(untyped view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tif (len == null)\n\t\t\t{\n\t\t\t\tthis = new JSUInt8ClampedArray(buffer, byteoffset);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis = new JSUInt8ClampedArray(buffer, byteoffset, len);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis = null;\n\t\t}\n\t}\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __set(idx:Int, val:UInt):UInt\n\t\treturn this[idx] = _clamp(val);\n\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end inline function __get(idx:Int):UInt\n\t\treturn this[idx];\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt8ClampedArray\n\t{\n\t\tif (byteOffset == null) return new JSUInt8ClampedArray(cast bytes.getData());\n\t\tif (len == null) return new JSUInt8ClampedArray(cast bytes.getData(), byteOffset);\n\t\treturn new JSUInt8ClampedArray(cast bytes.getData(), byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn @:privateAccess new haxe.io.Bytes(cast new JSUInt8Array(this.buffer));\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt8ClampedArray [byteLength:${this.byteLength}, length:${this.length}]' : null;\n\n\t// internal\n\t// clamp a Int to a 0-255 Uint8\n\tstatic function _clamp(_in:Float):Int\n\t{\n\t\tvar _out = Std.int(_in);\n\t\t_out = _out > 255 ? 255 : _out;\n\t\treturn _out < 0 ? 0 : _out;\n\t} // _clamp\n}\n#else\nimport lime.utils.ArrayBufferView;\n\n@:transitive\n@:forward\n@:arrayAccess\nabstract UInt8ClampedArray(ArrayBufferView) from ArrayBufferView to ArrayBufferView\n{\n\tpublic inline static var BYTES_PER_ELEMENT:Int = 1;\n\n\tpublic var length(get, never):Int;\n\n\t#if (haxe_ver < 4.2)\n\t@:generic\n\t#end\n\tpublic inline function new<T>(?elements:Int, ?buffer:ArrayBuffer, ?array:Array<T>, #if openfl ?vector:openfl.Vector<Int>, #end ?view:ArrayBufferView,\n\t\t\t?byteoffset:Int = 0, ?len:Null<Int>)\n\t{\n\t\tif (elements != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(elements, Uint8Clamped);\n\t\t}\n\t\telse if (array != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8Clamped).initArray(array);\n\t\t#if openfl\n\t\t}\n\t\telse if (vector != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8Clamped).initArray(untyped (vector).__array);\n\t\t#end\n\t\t}\n\t\telse if (view != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8Clamped).initTypedArray(view);\n\t\t}\n\t\telse if (buffer != null)\n\t\t{\n\t\t\tthis = new ArrayBufferView(0, Uint8Clamped).initBuffer(buffer, byteoffset, len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow \"Invalid constructor arguments for UInt8ClampedArray\";\n\t\t}\n\t}\n\n\t// Public API\n\tpublic inline function subarray(begin:Int, end:Null<Int> = null):UInt8ClampedArray\n\t\treturn this.subarray(begin, end);\n\n\t// non spec haxe conversions\n\tinline public static function fromBytes(bytes:haxe.io.Bytes, ?byteOffset:Int = 0, ?len:Int):UInt8ClampedArray\n\t{\n\t\treturn new UInt8ClampedArray(bytes, byteOffset, len);\n\t}\n\n\tinline public function toBytes():haxe.io.Bytes\n\t{\n\t\treturn this.buffer;\n\t}\n\n\t// Internal\n\tinline function get_length()\n\t\treturn this.length;\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __get(idx:Int)\n\t{\n\t\treturn ArrayBufferIO.getUint8(this.buffer, this.byteOffset + idx);\n\t}\n\n\t@:noCompletion\n\t@:arrayAccess #if (haxe_ver >= 4.0) extern #else @:extern #end\n\tpublic inline function __set(idx:Int, val:UInt)\n\t{\n\t\tArrayBufferIO.setUint8Clamped(this.buffer, this.byteOffset + idx, val);\n\t\treturn val;\n\t}\n\n\tinline function toString()\n\t\treturn this != null ? 'UInt8ClampedArray [byteLength:${this.byteLength}, length:${this.length}]' : null;\n}\n#end // !js\n"
  },
  {
    "path": "templates/air/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-swf-version ::SWF_VERSION::\n-swf ::OUTPUT_DIR::/bin/::APP_FILE::.swf\n-swf-header ::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end:::::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end:::::WIN_FPS:::::WIN_FLASHBACKGROUND::\n-cp ::OUTPUT_DIR::/haxe\n-debug\n-D air"
  },
  {
    "path": "templates/air/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-swf-version ::SWF_VERSION::\n-swf ::OUTPUT_DIR::/bin/::APP_FILE::.swf\n-swf-header ::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end:::::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end:::::WIN_FPS:::::WIN_FLASHBACKGROUND::\n-cp ::OUTPUT_DIR::/haxe\n-D final\n-D air"
  },
  {
    "path": "templates/air/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-swf-version ::SWF_VERSION::\n-swf ::OUTPUT_DIR::/bin/::APP_FILE::.swf\n-swf-header ::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end:::::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end:::::WIN_FPS:::::WIN_FLASHBACKGROUND::\n-cp ::OUTPUT_DIR::/haxe\n-D air"
  },
  {
    "path": "templates/air/template/application.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<application xmlns=\"http://ns.adobe.com/air/application/::AIR_SDK_VERSION::\">\n\t<id>::APP_PACKAGE::</id>\n\t<versionLabel>::APP_VERSION::</versionLabel>\n\t<versionNumber>::APP_BUILD_NUMBER_SPLIT::</versionNumber>\n\t<filename>::APP_FILE::</filename>\n\t<name>::APP_TITLE::</name>\n\t<description>::APP_DESCRIPTION::</description>\n\t<!-- <copyright>????</copyright> -->\n\t<initialWindow>\n\t\t<title>::APP_TITLE::</title>\n\t\t<content>::APP_FILE::.swf</content>\n\t\t<systemChrome>::if (WIN_BORDERLESS)::none::else::standard::end::</systemChrome>\n\t\t<transparent>false</transparent>\n\t\t<visible>::if (LIB_MUNIT)::false::else::::if (WIN_HIDDEN)::false::else::true::end::::end::</visible>\n\t\t<minimizable>true</minimizable>\n\t\t<maximizable>true</maximizable>\n\t\t<resizable>::WIN_RESIZABLE::</resizable>\n\t\t::if (WIN_WIDTH != 0)::<width>::WIN_WIDTH::</width>::end::\n\t\t::if (WIN_HEIGHT != 0)::<height>::WIN_HEIGHT::</height>::end::\n\t\t<!-- <minSize>320 240</minSize>\n\t\t<maxSize>1280 960</maxSize> -->\n\t\t<renderMode>::if (WIN_HARDWARE)::direct::else::cpu::end::</renderMode>\n\t\t::if (WIN_ORIENTATION == \"auto\")::\n\t\t<autoOrients>true</autoOrients>\n\t\t<aspectRatio>any</aspectRatio>\n\t\t::else::\n\t\t<autoOrients>false</autoOrients>\n\t\t<aspectRatio>::if (WIN_ORIENTATION == \"portrait\")::portrait::else::landscape::end::</aspectRatio>\n\t\t::end::\n\t\t<fullScreen>::WIN_FULLSCREEN::</fullScreen>\n\t\t::if (WIN_HARDWARE)::<depthAndStencil>true</depthAndStencil>::end::\n\t\t::if WIN_ALLOW_HIGH_DPI::<requestedDisplayResolution>high</requestedDisplayResolution>::end::\n\t</initialWindow>\n\t<installFolder>::if (APP_COMPANY != \"\")::::APP_COMPANY::/::APP_TITLE::::else::::APP_TITLE::::end::</installFolder>\n\t<programMenuFolder>::APP_TITLE::</programMenuFolder>\n\t::if (icons != null)::<icon>::foreach icons::\n\t\t<image::size::x::size::>::path::</image::size::x::size::>::end::\n\t</icon>::end::\n\t::if (languages != null)::<supportedLanguages>::foreach languages::::__current__:: ::end::</supportedLanguages>::end::\n\t<customUpdateUI>false</customUpdateUI>\n\t<allowBrowserInvocation>false</allowBrowserInvocation>\n\t<!-- <fileTypes>\n\t\t<fileType>\n\t\t\t<name>adobe.VideoFile</name>\n\t\t\t<extension>avf</extension>\n\t\t\t<description>Adobe Video File</description>\n\t\t\t<contentType>application/vnd.adobe.video-file</contentType>\n\t\t\t<icon>\n\t\t\t\t<image16x16>icons/avfIcon_16.png</image16x16>\n\t\t\t\t<image32x32>icons/avfIcon_32.png</image32x32>\n\t\t\t\t<image48x48>icons/avfIcon_48.png</image48x48>\n\t\t\t\t<image128x128>icons/avfIcon_128.png</image128x128>\n\t\t\t</icon>\n\t\t</fileType>\n\t</fileTypes> -->\n\t<android>\n\t\t<manifestAdditions>\n\t\t\t<![CDATA[\n\t\t\t\t<manifest>\n\t\t\t\t\t<uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\t\t\t\t\t<uses-permission android:name=\"android.permission.INTERNET\" />\n\t\t\t\t\t<uses-permission android:name=\"android.permission.VIBRATE\" />\n\t\t\t\t\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t\t\t\t</manifest>\n\t\t\t]]>\n\t\t</manifestAdditions>\n\t</android>\n\t<iPhone>\n\t\t<InfoAdditions>\n\t\t\t<![CDATA[\n\t\t\t\t::if (IOS_TARGET_DEVICES != null)::<key>UIDeviceFamily</key>\n\t\t\t\t<array>::foreach IOS_TARGET_DEVICES::\n\t\t\t\t\t<string>::__current__::</string>::end::\n\t\t\t\t</array>::end::\n\t\t\t]]>\n\t\t</InfoAdditions>\n\t\t<requestedDisplayResolution>::if WIN_ALLOW_HIGH_DPI::high::else::standard::end::</requestedDisplayResolution>\n\t</iPhone>\n\t::if (extensions != null)::<extensions>::foreach extensions::\n\t\t<extensionID>::name::</extensionID>::end::\n\t</extensions>::end::\n</application>"
  },
  {
    "path": "templates/android/MainActivity.java",
    "content": "package ::APP_PACKAGE::;\n\nimport android.os.Bundle;\n\npublic class MainActivity extends org.haxe.lime.GameActivity {\n}\n\n"
  },
  {
    "path": "templates/android/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D android\n-D android-9\n-debug\n"
  },
  {
    "path": "templates/android/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D android\n-D android-9\n-D final\n"
  },
  {
    "path": "templates/android/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D android\n-D android-9\n"
  },
  {
    "path": "templates/android/template/app/build.gradle",
    "content": "import groovy.swing.SwingBuilder\nimport java.awt.GridBagLayout\nimport java.awt.GridBagConstraints\nimport javax.swing.border.EmptyBorder\n\napply plugin: 'com.android.application'\n\nSystem.setProperty('java.awt.headless','false')\n\n//Uncomment to debug deprecation warnings.\n/* tasks.withType(JavaCompile) {\n\toptions.compilerArgs << \"-Xlint:unchecked\" << \"-Xlint:deprecation\"\n} */\n\nandroid {\n\tnamespace \"::APP_PACKAGE::\"\n\tcompileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n\tbuildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION\n\t::if (ANDROID_GRADLE_PLUGIN>=\"4.0\")::ndkPath '::ANDROID_NDK_ROOT_ESCAPED::'::end::\n\t::if (ANDROID_NDK_VERSION)::ndkVersion '::ANDROID_NDK_VERSION::'::end::\n\n\tdefaultConfig {\n\t\tapplicationId \"::META_PACKAGE_NAME::\"\n\t\tminSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)\n\t\ttargetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)\n\t\tversionCode Integer.parseInt(project.VERSION_CODE)\n\t\tversionName project.VERSION_NAME\n\t\t::if (languages != null)::resConfigs ::foreach languages::\"::__current__::\", ::end::\"\"::end::\n\t}\n\n\t::if KEY_STORE::\n\tsigningConfigs {\n\t\tif (project.KEY_STORE_PASSWORD == 'null') {\n\t\t\tdef keyStoreFile = project.KEY_STORE.split('/')\n\t\t\tkeyStoreFile = keyStoreFile[keyStoreFile.length - 1]\n\t\t\tproject.KEY_STORE_PASSWORD = getPassword('\\nPlease enter key password for ' + keyStoreFile + ':');\n\t\t}\n\n\t\tif (project.KEY_STORE_ALIAS_PASSWORD == 'null') {\n\t\t\tproject.KEY_STORE_ALIAS_PASSWORD = getPassword(\"\\nPlease enter key alias password for alias \" + project.KEY_STORE_ALIAS + \":\")\n\t\t}\n\n\t\trelease {\n\t\t\tstoreFile file(project.KEY_STORE)\n\t\t\tstorePassword project.KEY_STORE_PASSWORD\n\t\t\tkeyAlias project.KEY_STORE_ALIAS\n\t\t\tkeyPassword project.KEY_STORE_ALIAS_PASSWORD\n\t\t}\n\t}\n\t::else::\n\tFile signingFile = file('signing.properties')\n\tif(signingFile.exists()) {\n\t\tProperties signing = new Properties()\n\t\tsigning.load(new FileInputStream(signingFile))\n\n\t\tsigningConfigs {\n\t\t\trelease {\n\t\t\t\tstoreFile file(signing[\"KEY_STORE\"])\n\t\t\t\tstorePassword signing[\"KEY_STORE_PASSWORD\"]\n\t\t\t\tkeyAlias signing[\"KEY_STORE_ALIAS\"]\n\t\t\t\tkeyPassword signing[\"KEY_STORE_ALIAS_PASSWORD\"]\n\t\t\t}\n\t\t}\n\t} else {\n\t\tsigningConfigs {\n\t\t\trelease\n\t\t}\n\t}\n\t::end::\n\n\tbuildTypes {\n\t\trelease {\n\t\t\tminifyEnabled false\n\t\t\tsigningConfig signingConfigs.release\n\t\t}\n\t}\n\n\tandroid.applicationVariants.all { variant ->\n\t\tvariant.outputs.all { output ->\n\t\t\tif (outputFileName != null && outputFileName.endsWith('.apk')) {\n\t\t\t\toutputFileName =  \"::APP_FILE::-\" + variant.buildType.name + \".apk\"\n\t\t\t}\n\t\t}\n\t}\n}\n\ndependencies {\n\timplementation fileTree(dir: 'libs', include: ['*.jar'])\n\t::if (ANDROID_LIBRARY_PROJECTS)::::foreach (ANDROID_LIBRARY_PROJECTS)::implementation project(':deps:::name::')\n\t::end::::end::\n}\n\ndef getPassword(message) {\n\tdef password = '';\n\tif (System.console() == null) {\n\t\tnew SwingBuilder().edt {\n\t\t\tdialog(\n\t\t\t\ttitle: 'Enter password',\n\t\t\t\talwaysOnTop: true,\n\t\t\t\tsize: [350, 150],\n\t\t\t\tresizable: false,\n\t\t\t\tlocationRelativeTo: null,\n\t\t\t\tpack: true,\n\t\t\t\tmodal: true,\n\t\t\t\tshow: true\n\t\t\t) {\n\t\t\t\tlookAndFeel('system')\n\n\t\t\t\tpanel(border: new EmptyBorder(10, 10, 10, 10)) {\n\t\t\t\t\tgridBagLayout()\n\t\t\t\t\tdef gbc = new GridBagConstraints();\n\n\t\t\t\t\tgbc.gridx = 0\n\t\t\t\t\tgbc.gridy = 0\n\t\t\t\t\tgbc.fill = GridBagConstraints.HORIZONTAL\n\t\t\t\t\tgbc.insets = [0, 0, 10, 0]\n\t\t\t\t\tlabel(\n\t\t\t\t\t\ttext: '<html>' +\n\t\t\t\t\t\t'<body style=\"width: 350px\">' +\n\t\t\t\t\t\tmessage +\n\t\t\t\t\t\t'</body>' +\n\t\t\t\t\t\t'</html>',\n\t\t\t\t\t\tconstraints: gbc)\n\n\t\t\t\t\tgbc.gridy = 1\n\t\t\t\t\tinput = passwordField(constraints: gbc)\n\n\t\t\t\t\tgbc.gridy = 2\n\t\t\t\t\tgbc.fill = GridBagConstraints.NONE\n\t\t\t\t\tgbc.insets = [0, 0, 0, 0]\n\t\t\t\t\tgbc.ipadx = 50\n\t\t\t\t\tbutton = button(\n\t\t\t\t\t\tdefaultButton: true,\n\t\t\t\t\t\ttext: 'OK',\n\t\t\t\t\t\tactionPerformed: {\n\t\t\t\t\t\t\tpassword = input.password\n\t\t\t\t\t\t\tdispose()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tconstraints: gbc)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tpassword = System.console().readPassword(message)\n\t}\n\treturn new String(password)\n}\n"
  },
  {
    "path": "templates/android/template/app/libs/readme.txt",
    "content": "place JAR files here\n"
  },
  {
    "path": "templates/android/template/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" android:versionCode=\"::APP_BUILD_NUMBER::\" android:versionName=\"::APP_VERSION::\" android:installLocation=\"::ANDROID_INSTALL_LOCATION::\">\n\n\t<uses-feature android:glEsVersion=\"0x00020000\" android:required=\"true\" />\n\t<uses-feature android:name=\"android.hardware.touchscreen\" android:required=\"false\" />\n\n\t::foreach ANDROID_PERMISSIONS::<uses-permission android:name=\"::__current__::\" />\n\t::end::\n\n\t<application ::foreach ANDROID_APPLICATION::::if ((value != null) && (value != \"\"))::::key::=\"::value::\" ::end::::end::>\n\n\t\t::if (WIN_ORIENTATION==\"portrait\")::\n\t\t<meta-data android:name=\"SDL_ENV.SDL_IOS_ORIENTATIONS\" android:value=\"Portrait PortraitUpsideDown\" />\n\t\t::elseif (WIN_ORIENTATION==\"landscape\")::\n\t\t<meta-data android:name=\"SDL_ENV.SDL_IOS_ORIENTATIONS\" android:value=\"LandscapeLeft LandscapeRight\" />\n\t\t::end::\n\n\t\t<activity ::foreach ANDROID_ACTIVITY::::if ((value != null) && (value != \"\"))::::key::=\"::value::\" ::end::::end::>\n\n\t\t\t<intent-filter>\n\n\t\t\t\t<action android:name=\"android.intent.action.MAIN\" />\n\t\t\t\t<category android:name=\"android.intent.category.LAUNCHER\" />\n\t\t\t\t<category android:name=\"tv.ouya.intent.category.GAME\" />\n\n\t\t\t</intent-filter>\n\n\t\t\t::foreach ANDROID_ACCEPT_FILE_INTENT::\n\t\t\t<intent-filter>\n\n\t\t\t\t<action android:name=\"android.intent.action.VIEW\" />\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t\t<data android:mimeType=\"::__current__::\" />\n\n\t\t\t</intent-filter>\n\t\t\t::end::\n\n\t\t</activity>\n\n\t</application>\n\n</manifest>\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/haxe/lime/GameActivity.java",
    "content": "package org.haxe.lime;\n\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.res.AssetManager;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.os.VibrationEffect;\nimport android.os.Vibrator;\nimport android.view.DisplayCutout;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.view.KeyCharacterMap;\nimport android.view.KeyEvent;\nimport android.view.OrientationEventListener;\nimport android.view.View;\nimport android.view.WindowInsets;\nimport android.view.WindowManager;\nimport android.webkit.MimeTypeMap;\nimport android.Manifest;\nimport org.haxe.extension.Extension;\nimport org.libsdl.app.SDLActivity;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.List;\n\n\npublic class GameActivity extends SDLActivity {\n\n\n\tprivate static AssetManager assetManager;\n\tprivate static List<Extension> extensions;\n\tprivate static DisplayMetrics metrics;\n\tprivate static DisplayCutout displayCutout;\n\tprivate static Vibrator vibrator;\n\tprivate static OrientationEventListener orientationListener;\n\tprivate static HaxeObject deviceOrientationListener;\n\tprivate static int deviceOrientation = SDL_ORIENTATION_UNKNOWN;\n\n\tpublic Handler handler;\n\n\tpublic static void setDeviceOrientationListener (HaxeObject object) {\n\n\t\tdeviceOrientationListener = object;\n\t\tif (deviceOrientationListener != null)\n\t\t{\n\t\t\tdeviceOrientationListener.call1(\"onOrientationChanged\", deviceOrientation);\n\t\t}\n\n\t}\n\n\tpublic static double getDisplayXDPI () {\n\n\t\tif (metrics == null) {\n\n\t\t\tmetrics = Extension.mainContext.getResources ().getDisplayMetrics ();\n\n\t\t}\n\n\t\treturn metrics.xdpi;\n\n\t}\n\n\tpublic static int[] getDisplaySafeAreaInsets () {\n\n\t\tif (displayCutout == null) {\n\n\t\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n\n\t\t\t\tWindowInsets windowInsets = ((GameActivity)Extension.mainContext).getWindow().getDecorView().getRootWindowInsets();\n\n\t\t\t\tif (windowInsets != null) {\n\n\t\t\t\t\tdisplayCutout = windowInsets.getDisplayCutout();\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint[] result = {0, 0, 0, 0};\n\n\t\tif (displayCutout != null) {\n\n\t\t\tresult[0] = displayCutout.getSafeInsetLeft();\n\t\t\tresult[1] = displayCutout.getSafeInsetTop();\n\t\t\tresult[2] = displayCutout.getSafeInsetRight();\n\t\t\tresult[3] = displayCutout.getSafeInsetBottom();\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\n\tprotected String[] getLibraries () {\n\n\t\treturn new String[] {\n\t\t\t::foreach ndlls::\"::name::\",\n\t\t\t::end::\"ApplicationMain\"\n\t\t};\n\n\t}\n\n\n\t@Override protected String getMainSharedObject () {\n\n\t\treturn \"libApplicationMain.so\";\n\n\t}\n\n\n\t@Override protected String getMainFunction () {\n\n\t\treturn \"hxcpp_main\";\n\n\t}\n\n\n\t@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\tif (!extension.onActivityResult (requestCode, resultCode, data)) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.onActivityResult (requestCode, resultCode, data);\n\n\t}\n\n\n\t@Override public void onBackPressed () {\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\tif (!extension.onBackPressed ()) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.onBackPressed ();\n\n\t}\n\n\n\tprotected void onCreate (Bundle state) {\n\n\t\tsuper.onCreate (state);\n\n\t\torientationListener = new OrientationEventListener(this) {\n\n\t\t\tpublic void onOrientationChanged(int degrees) {\n\n\t\t\t\tint orientation = SDL_ORIENTATION_UNKNOWN;\n\t\t\t\tif (degrees >= 315 || (degrees >= 0 && degrees < 45))\n\t\t\t\t{\n\t\t\t\t\torientation = SDL_ORIENTATION_PORTRAIT;\n\t\t\t\t}\n\t\t\t\telse if\t(degrees >= 45 && degrees < 135)\n\t\t\t\t{\n\t\t\t\t\torientation = SDL_ORIENTATION_LANDSCAPE_FLIPPED;\n\t\t\t\t}\n\t\t\t\telse if\t(degrees >= 135 && degrees < 225)\n\t\t\t\t{\n\t\t\t\t\torientation = SDL_ORIENTATION_PORTRAIT_FLIPPED;\n\t\t\t\t}\n\t\t\t\telse if\t(degrees >= 225 && degrees < 315)\n\t\t\t\t{\n\t\t\t\t\torientation = SDL_ORIENTATION_LANDSCAPE;\n\t\t\t\t}\n\n\t\t\t\tif (deviceOrientation != orientation) {\n\t\t\t\t\tdeviceOrientation = orientation;\n\t\t\t\t\tif (deviceOrientationListener != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tdeviceOrientationListener.call1(\"onOrientationChanged\", deviceOrientation);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tassetManager = getAssets ();\n\n\t\tif (checkSelfPermission(Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED) {\n\n\t\t\tvibrator = (Vibrator)mSingleton.getSystemService (Context.VIBRATOR_SERVICE);\n\n\t\t}\n\n\t\thandler = new Handler (Looper.getMainLooper ());\n\n\t\tExtension.assetManager = assetManager;\n\t\tExtension.callbackHandler = handler;\n\t\tExtension.mainActivity = this;\n\t\tExtension.mainContext = this;\n\t\tExtension.mainView = mLayout;\n\t\tExtension.packageName = getApplicationContext ().getPackageName ();\n\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n\n\t\t\tswitch (\"::ANDROID_DISPLAY_CUTOUT::\") {\n\n\t\t\t\tcase \"always\":\n\t\t\t\t\tgetWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"never\":\n\t\t\t\t\tgetWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"shortEdges\":\n\t\t\t\t\tgetWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"default\":\n\t\t\t\t\tgetWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tgetWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (extensions == null) {\n\n\t\t\textensions = new ArrayList<Extension> ();\n\t\t\t::if (ANDROID_EXTENSIONS != null)::::foreach ANDROID_EXTENSIONS::\n\t\t\textensions.add (new ::__current__:: ());::end::::end::\n\n\t\t}\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onCreate (state);\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onDestroy () {\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onDestroy ();\n\n\t\t}\n\n\t\tsuper.onDestroy ();\n\n\t}\n\n\n\t@Override public void onLowMemory () {\n\n\t\tsuper.onLowMemory ();\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onLowMemory ();\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onNewIntent (final Intent intent) {\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onNewIntent (intent);\n\n\t\t}\n\n\t\tsuper.onNewIntent (intent);\n\n\t}\n\n\n\t@Override protected void onPause () {\n\n\t\tif (vibrator != null) {\n\n\t\t\tvibrator.cancel ();\n\n\t\t}\n\n\t\torientationListener.disable();\n\n\t\tsuper.onPause ();\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onPause ();\n\n\t\t}\n\n\t}\n\n\n\t::if (ANDROID_TARGET_SDK_VERSION >= 23)::\n\t@Override public void onRequestPermissionsResult (int requestCode, String permissions[], int[] grantResults) {\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\tif (!extension.onRequestPermissionsResult (requestCode, permissions, grantResults)) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.onRequestPermissionsResult (requestCode, permissions, grantResults);\n\n\t}\n\t::end::\n\n\n\t@Override protected void onRestart () {\n\n\t\tsuper.onRestart ();\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onRestart ();\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onResume () {\n\n\t\tsuper.onResume ();\n\n\t\torientationListener.enable();\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onResume ();\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onRestoreInstanceState (Bundle savedState) {\n\n\t\tsuper.onRestoreInstanceState (savedState);\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onRestoreInstanceState (savedState);\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onSaveInstanceState (Bundle outState) {\n\n\t\tsuper.onSaveInstanceState (outState);\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onSaveInstanceState (outState);\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onStart () {\n\n\t\tsuper.onStart ();\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onStart ();\n\n\t\t}\n\n\t}\n\n\n\t@Override protected void onStop () {\n\n\t\tsuper.onStop ();\n\n\t\tfor (Extension extension : extensions) {\n\n\t\t\textension.onStop ();\n\n\t\t}\n\n\t}\n\n\n\t::if (ANDROID_TARGET_SDK_VERSION >= 14)::\n\t@Override public void onTrimMemory (int level) {\n\n\t\tif (Build.VERSION.SDK_INT >= 14) {\n\n\t\t\tsuper.onTrimMemory (level);\n\n\t\t\tfor (Extension extension : extensions) {\n\n\t\t\t\textension.onTrimMemory (level);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t::end::\n\n\n\tpublic static void openFile (String path) {\n\n\t\ttry {\n\n\t\t\tString extension = path;\n\t\t\tint index = path.lastIndexOf ('.');\n\n\t\t\tif (index > 0) {\n\n\t\t\t\textension = path.substring (index + 1);\n\n\t\t\t}\n\n\t\t\tString mimeType = MimeTypeMap.getSingleton ().getMimeTypeFromExtension (extension);\n\t\t\tFile file = new File (path);\n\n\t\t\tIntent intent = new Intent ();\n\t\t\tintent.setAction (Intent.ACTION_VIEW);\n\t\t\tintent.setDataAndType (Uri.fromFile (file), mimeType);\n\n\t\t\tExtension.mainActivity.startActivity (intent);\n\n\t\t} catch (Exception e) {\n\n\t\t\tLog.e (\"GameActivity\", e.toString ());\n\t\t\treturn;\n\n\t\t}\n\n\t}\n\n\n\tpublic static void openURL (String url, String target) {\n\n\t\tIntent browserIntent = new Intent (Intent.ACTION_VIEW).setData (Uri.parse (url));\n\n\t\ttry {\n\n\t\t\tExtension.mainActivity.startActivity (browserIntent);\n\n\t\t} catch (Exception e) {\n\n\t\t\tLog.e (\"GameActivity\", e.toString ());\n\t\t\treturn;\n\n\t\t}\n\n\t}\n\n\n\tpublic static void postUICallback (final long handle) {\n\n\t\tExtension.callbackHandler.post (new Runnable () {\n\n\t\t\t@Override public void run () {\n\n\t\t\t\tLime.onCallback (handle);\n\n\t\t\t}\n\n\t\t});\n\n\t}\n\n\n\tpublic static void vibrate (int period, int duration) {\n\n\t\tif (vibrator == null || !vibrator.hasVibrator () || period < 0 || duration <= 0) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif (period == 0) {\n\n\t\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\n\t\t\t\tvibrator.vibrate (VibrationEffect.createOneShot (duration, VibrationEffect.DEFAULT_AMPLITUDE));\n\n\t\t\t} else {\n\n\t\t\t\tvibrator.vibrate (duration);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// each period has two halves (vibrator off/vibrator on), and each half requires a separate entry in the array\n\t\t\tint periodMS = (int)Math.ceil (period / 2.0);\n\t\t\tint count = (int)Math.ceil (duration / (double) periodMS);\n\t\t\tlong[] pattern = new long[count];\n\n\t\t\t// the first entry is the delay before vibration starts, so leave it as 0\n\t\t\tfor (int i = 1; i < count; i++) {\n\n\t\t\t\tpattern[i] = periodMS;\n\n\t\t\t}\n\n\t\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\n\t\t\t\tvibrator.vibrate (VibrationEffect.createWaveform (pattern, -1));\n\n\t\t\t} else {\n\n\t\t\t\tvibrator.vibrate (pattern, -1);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/HIDDevice.java",
    "content": "package org.libsdl.app;\n\nimport android.hardware.usb.UsbDevice;\n\ninterface HIDDevice\n{\n    public int getId();\n    public int getVendorId();\n    public int getProductId();\n    public String getSerialNumber();\n    public int getVersion();\n    public String getManufacturerName();\n    public String getProductName();\n    public UsbDevice getDevice();\n    public boolean open();\n    public int sendFeatureReport(byte[] report);\n    public int sendOutputReport(byte[] report);\n    public boolean getFeatureReport(byte[] report);\n    public void setFrozen(boolean frozen);\n    public void close();\n    public void shutdown();\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java",
    "content": "package org.libsdl.app;\n\nimport android.content.Context;\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.BluetoothGatt;\nimport android.bluetooth.BluetoothGattCallback;\nimport android.bluetooth.BluetoothGattCharacteristic;\nimport android.bluetooth.BluetoothGattDescriptor;\nimport android.bluetooth.BluetoothManager;\nimport android.bluetooth.BluetoothProfile;\nimport android.bluetooth.BluetoothGattService;\nimport android.hardware.usb.UsbDevice;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.util.Log;\nimport android.os.*;\n\n//import com.android.internal.util.HexDump;\n\nimport java.lang.Runnable;\nimport java.util.Arrays;\nimport java.util.LinkedList;\nimport java.util.UUID;\n\nclass HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDevice {\n\n    private static final String TAG = \"hidapi\";\n    private HIDDeviceManager mManager;\n    private BluetoothDevice mDevice;\n    private int mDeviceId;\n    private BluetoothGatt mGatt;\n    private boolean mIsRegistered = false;\n    private boolean mIsConnected = false;\n    private boolean mIsChromebook = false;\n    private boolean mIsReconnecting = false;\n    private boolean mFrozen = false;\n    private LinkedList<GattOperation> mOperations;\n    GattOperation mCurrentOperation = null;\n    private Handler mHandler;\n\n    private static final int TRANSPORT_AUTO = 0;\n    private static final int TRANSPORT_BREDR = 1;\n    private static final int TRANSPORT_LE = 2;\n\n    private static final int CHROMEBOOK_CONNECTION_CHECK_INTERVAL = 10000;\n\n    static public final UUID steamControllerService = UUID.fromString(\"100F6C32-1735-4313-B402-38567131E5F3\");\n    static public final UUID inputCharacteristic = UUID.fromString(\"100F6C33-1735-4313-B402-38567131E5F3\");\n    static public final UUID reportCharacteristic = UUID.fromString(\"100F6C34-1735-4313-B402-38567131E5F3\");\n    static private final byte[] enterValveMode = new byte[] { (byte)0xC0, (byte)0x87, 0x03, 0x08, 0x07, 0x00 };\n\n    static class GattOperation {\n        private enum Operation {\n            CHR_READ,\n            CHR_WRITE,\n            ENABLE_NOTIFICATION\n        }\n\n        Operation mOp;\n        UUID mUuid;\n        byte[] mValue;\n        BluetoothGatt mGatt;\n        boolean mResult = true;\n\n        private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid) {\n            mGatt = gatt;\n            mOp = operation;\n            mUuid = uuid;\n        }\n\n        private GattOperation(BluetoothGatt gatt, GattOperation.Operation operation, UUID uuid, byte[] value) {\n            mGatt = gatt;\n            mOp = operation;\n            mUuid = uuid;\n            mValue = value;\n        }\n\n        public void run() {\n            // This is executed in main thread\n            BluetoothGattCharacteristic chr;\n\n            switch (mOp) {\n                case CHR_READ:\n                    chr = getCharacteristic(mUuid);\n                    //Log.v(TAG, \"Reading characteristic \" + chr.getUuid());\n                    if (!mGatt.readCharacteristic(chr)) {\n                        Log.e(TAG, \"Unable to read characteristic \" + mUuid.toString());\n                        mResult = false;\n                        break;\n                    }\n                    mResult = true;\n                    break;\n                case CHR_WRITE:\n                    chr = getCharacteristic(mUuid);\n                    //Log.v(TAG, \"Writing characteristic \" + chr.getUuid() + \" value=\" + HexDump.toHexString(value));\n                    chr.setValue(mValue);\n                    if (!mGatt.writeCharacteristic(chr)) {\n                        Log.e(TAG, \"Unable to write characteristic \" + mUuid.toString());\n                        mResult = false;\n                        break;\n                    }\n                    mResult = true;\n                    break;\n                case ENABLE_NOTIFICATION:\n                    chr = getCharacteristic(mUuid);\n                    //Log.v(TAG, \"Writing descriptor of \" + chr.getUuid());\n                    if (chr != null) {\n                        BluetoothGattDescriptor cccd = chr.getDescriptor(UUID.fromString(\"00002902-0000-1000-8000-00805f9b34fb\"));\n                        if (cccd != null) {\n                            int properties = chr.getProperties();\n                            byte[] value;\n                            if ((properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == BluetoothGattCharacteristic.PROPERTY_NOTIFY) {\n                                value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE;\n                            } else if ((properties & BluetoothGattCharacteristic.PROPERTY_INDICATE) == BluetoothGattCharacteristic.PROPERTY_INDICATE) {\n                                value = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE;\n                            } else {\n                                Log.e(TAG, \"Unable to start notifications on input characteristic\");\n                                mResult = false;\n                                return;\n                            }\n\n                            mGatt.setCharacteristicNotification(chr, true);\n                            cccd.setValue(value);\n                            if (!mGatt.writeDescriptor(cccd)) {\n                                Log.e(TAG, \"Unable to write descriptor \" + mUuid.toString());\n                                mResult = false;\n                                return;\n                            }\n                            mResult = true;\n                        }\n                    }\n            }\n        }\n\n        public boolean finish() {\n            return mResult;\n        }\n\n        private BluetoothGattCharacteristic getCharacteristic(UUID uuid) {\n            BluetoothGattService valveService = mGatt.getService(steamControllerService);\n            if (valveService == null)\n                return null;\n            return valveService.getCharacteristic(uuid);\n        }\n\n        static public GattOperation readCharacteristic(BluetoothGatt gatt, UUID uuid) {\n            return new GattOperation(gatt, Operation.CHR_READ, uuid);\n        }\n\n        static public GattOperation writeCharacteristic(BluetoothGatt gatt, UUID uuid, byte[] value) {\n            return new GattOperation(gatt, Operation.CHR_WRITE, uuid, value);\n        }\n\n        static public GattOperation enableNotification(BluetoothGatt gatt, UUID uuid) {\n            return new GattOperation(gatt, Operation.ENABLE_NOTIFICATION, uuid);\n        }\n    }\n\n    public HIDDeviceBLESteamController(HIDDeviceManager manager, BluetoothDevice device) {\n        mManager = manager;\n        mDevice = device;\n        mDeviceId = mManager.getDeviceIDForIdentifier(getIdentifier());\n        mIsRegistered = false;\n        mIsChromebook = mManager.getContext().getPackageManager().hasSystemFeature(\"org.chromium.arc.device_management\");\n        mOperations = new LinkedList<GattOperation>();\n        mHandler = new Handler(Looper.getMainLooper());\n\n        mGatt = connectGatt();\n        // final HIDDeviceBLESteamController finalThis = this;\n        // mHandler.postDelayed(new Runnable() {\n        //     @Override\n        //     public void run() {\n        //         finalThis.checkConnectionForChromebookIssue();\n        //     }\n        // }, CHROMEBOOK_CONNECTION_CHECK_INTERVAL);\n    }\n\n    public String getIdentifier() {\n        return String.format(\"SteamController.%s\", mDevice.getAddress());\n    }\n\n    public BluetoothGatt getGatt() {\n        return mGatt;\n    }\n\n    // Because on Chromebooks we show up as a dual-mode device, it will attempt to connect TRANSPORT_AUTO, which will use TRANSPORT_BREDR instead\n    // of TRANSPORT_LE.  Let's force ourselves to connect low energy.\n    private BluetoothGatt connectGatt(boolean managed) {\n        if (Build.VERSION.SDK_INT >= 23 /* Android 6.0 (M) */) {\n            try {\n                return mDevice.connectGatt(mManager.getContext(), managed, this, TRANSPORT_LE);\n            } catch (Exception e) {\n                return mDevice.connectGatt(mManager.getContext(), managed, this);\n            }\n        } else {\n            return mDevice.connectGatt(mManager.getContext(), managed, this);\n        }\n    }\n\n    private BluetoothGatt connectGatt() {\n        return connectGatt(false);\n    }\n\n    protected int getConnectionState() {\n\n        Context context = mManager.getContext();\n        if (context == null) {\n            // We are lacking any context to get our Bluetooth information.  We'll just assume disconnected.\n            return BluetoothProfile.STATE_DISCONNECTED;\n        }\n\n        BluetoothManager btManager = (BluetoothManager)context.getSystemService(Context.BLUETOOTH_SERVICE);\n        if (btManager == null) {\n            // This device doesn't support Bluetooth.  We should never be here, because how did\n            // we instantiate a device to start with?\n            return BluetoothProfile.STATE_DISCONNECTED;\n        }\n\n        return btManager.getConnectionState(mDevice, BluetoothProfile.GATT);\n    }\n\n    public void reconnect() {\n\n        if (getConnectionState() != BluetoothProfile.STATE_CONNECTED) {\n            mGatt.disconnect();\n            mGatt = connectGatt();\n        }\n\n    }\n\n    protected void checkConnectionForChromebookIssue() {\n        if (!mIsChromebook) {\n            // We only do this on Chromebooks, because otherwise it's really annoying to just attempt\n            // over and over.\n            return;\n        }\n\n        int connectionState = getConnectionState();\n\n        switch (connectionState) {\n            case BluetoothProfile.STATE_CONNECTED:\n                if (!mIsConnected) {\n                    // We are in the Bad Chromebook Place.  We can force a disconnect\n                    // to try to recover.\n                    Log.v(TAG, \"Chromebook: We are in a very bad state; the controller shows as connected in the underlying Bluetooth layer, but we never received a callback.  Forcing a reconnect.\");\n                    mIsReconnecting = true;\n                    mGatt.disconnect();\n                    mGatt = connectGatt(false);\n                    break;\n                }\n                else if (!isRegistered()) {\n                    if (mGatt.getServices().size() > 0) {\n                        Log.v(TAG, \"Chromebook: We are connected to a controller, but never got our registration.  Trying to recover.\");\n                        probeService(this);\n                    }\n                    else {\n                        Log.v(TAG, \"Chromebook: We are connected to a controller, but never discovered services.  Trying to recover.\");\n                        mIsReconnecting = true;\n                        mGatt.disconnect();\n                        mGatt = connectGatt(false);\n                        break;\n                    }\n                }\n                else {\n                    Log.v(TAG, \"Chromebook: We are connected, and registered.  Everything's good!\");\n                    return;\n                }\n                break;\n\n            case BluetoothProfile.STATE_DISCONNECTED:\n                Log.v(TAG, \"Chromebook: We have either been disconnected, or the Chromebook BtGatt.ContextMap bug has bitten us.  Attempting a disconnect/reconnect, but we may not be able to recover.\");\n\n                mIsReconnecting = true;\n                mGatt.disconnect();\n                mGatt = connectGatt(false);\n                break;\n\n            case BluetoothProfile.STATE_CONNECTING:\n                Log.v(TAG, \"Chromebook: We're still trying to connect.  Waiting a bit longer.\");\n                break;\n        }\n\n        final HIDDeviceBLESteamController finalThis = this;\n        mHandler.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                finalThis.checkConnectionForChromebookIssue();\n            }\n        }, CHROMEBOOK_CONNECTION_CHECK_INTERVAL);\n    }\n\n    private boolean isRegistered() {\n        return mIsRegistered;\n    }\n\n    private void setRegistered() {\n        mIsRegistered = true;\n    }\n\n    private boolean probeService(HIDDeviceBLESteamController controller) {\n\n        if (isRegistered()) {\n            return true;\n        }\n\n        if (!mIsConnected) {\n            return false;\n        }\n\n        Log.v(TAG, \"probeService controller=\" + controller);\n\n        for (BluetoothGattService service : mGatt.getServices()) {\n            if (service.getUuid().equals(steamControllerService)) {\n                Log.v(TAG, \"Found Valve steam controller service \" + service.getUuid());\n\n                for (BluetoothGattCharacteristic chr : service.getCharacteristics()) {\n                    if (chr.getUuid().equals(inputCharacteristic)) {\n                        Log.v(TAG, \"Found input characteristic\");\n                        // Start notifications\n                        BluetoothGattDescriptor cccd = chr.getDescriptor(UUID.fromString(\"00002902-0000-1000-8000-00805f9b34fb\"));\n                        if (cccd != null) {\n                            enableNotification(chr.getUuid());\n                        }\n                    }\n                }\n                return true;\n            }\n        }\n\n        if ((mGatt.getServices().size() == 0) && mIsChromebook && !mIsReconnecting) {\n            Log.e(TAG, \"Chromebook: Discovered services were empty; this almost certainly means the BtGatt.ContextMap bug has bitten us.\");\n            mIsConnected = false;\n            mIsReconnecting = true;\n            mGatt.disconnect();\n            mGatt = connectGatt(false);\n        }\n\n        return false;\n    }\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    private void finishCurrentGattOperation() {\n        GattOperation op = null;\n        synchronized (mOperations) {\n            if (mCurrentOperation != null) {\n                op = mCurrentOperation;\n                mCurrentOperation = null;\n            }\n        }\n        if (op != null) {\n            boolean result = op.finish(); // TODO: Maybe in main thread as well?\n\n            // Our operation failed, let's add it back to the beginning of our queue.\n            if (!result) {\n                mOperations.addFirst(op);\n            }\n        }\n        executeNextGattOperation();\n    }\n\n    private void executeNextGattOperation() {\n        synchronized (mOperations) {\n            if (mCurrentOperation != null)\n                return;\n\n            if (mOperations.isEmpty())\n                return;\n\n            mCurrentOperation = mOperations.removeFirst();\n        }\n\n        // Run in main thread\n        mHandler.post(new Runnable() {\n            @Override\n            public void run() {\n                synchronized (mOperations) {\n                    if (mCurrentOperation == null) {\n                        Log.e(TAG, \"Current operation null in executor?\");\n                        return;\n                    }\n\n                    mCurrentOperation.run();\n                    // now wait for the GATT callback and when it comes, finish this operation\n                }\n            }\n        });\n    }\n\n    private void queueGattOperation(GattOperation op) {\n        synchronized (mOperations) {\n            mOperations.add(op);\n        }\n        executeNextGattOperation();\n    }\n\n    private void enableNotification(UUID chrUuid) {\n        GattOperation op = HIDDeviceBLESteamController.GattOperation.enableNotification(mGatt, chrUuid);\n        queueGattOperation(op);\n    }\n\n    public void writeCharacteristic(UUID uuid, byte[] value) {\n        GattOperation op = HIDDeviceBLESteamController.GattOperation.writeCharacteristic(mGatt, uuid, value);\n        queueGattOperation(op);\n    }\n\n    public void readCharacteristic(UUID uuid) {\n        GattOperation op = HIDDeviceBLESteamController.GattOperation.readCharacteristic(mGatt, uuid);\n        queueGattOperation(op);\n    }\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    //////////////  BluetoothGattCallback overridden methods\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    public void onConnectionStateChange(BluetoothGatt g, int status, int newState) {\n        //Log.v(TAG, \"onConnectionStateChange status=\" + status + \" newState=\" + newState);\n        mIsReconnecting = false;\n        if (newState == 2) {\n            mIsConnected = true;\n            // Run directly, without GattOperation\n            if (!isRegistered()) {\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        mGatt.discoverServices();\n                    }\n                });\n            }\n        }\n        else if (newState == 0) {\n            mIsConnected = false;\n        }\n\n        // Disconnection is handled in SteamLink using the ACTION_ACL_DISCONNECTED Intent.\n    }\n\n    public void onServicesDiscovered(BluetoothGatt gatt, int status) {\n        //Log.v(TAG, \"onServicesDiscovered status=\" + status);\n        if (status == 0) {\n            if (gatt.getServices().size() == 0) {\n                Log.v(TAG, \"onServicesDiscovered returned zero services; something has gone horribly wrong down in Android's Bluetooth stack.\");\n                mIsReconnecting = true;\n                mIsConnected = false;\n                gatt.disconnect();\n                mGatt = connectGatt(false);\n            }\n            else {\n                probeService(this);\n            }\n        }\n    }\n\n    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {\n        //Log.v(TAG, \"onCharacteristicRead status=\" + status + \" uuid=\" + characteristic.getUuid());\n\n        if (characteristic.getUuid().equals(reportCharacteristic) && !mFrozen) {\n            mManager.HIDDeviceFeatureReport(getId(), characteristic.getValue());\n        }\n\n        finishCurrentGattOperation();\n    }\n\n    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {\n        //Log.v(TAG, \"onCharacteristicWrite status=\" + status + \" uuid=\" + characteristic.getUuid());\n\n        if (characteristic.getUuid().equals(reportCharacteristic)) {\n            // Only register controller with the native side once it has been fully configured\n            if (!isRegistered()) {\n                Log.v(TAG, \"Registering Steam Controller with ID: \" + getId());\n                mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0);\n                setRegistered();\n            }\n        }\n\n        finishCurrentGattOperation();\n    }\n\n    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {\n    // Enable this for verbose logging of controller input reports\n        //Log.v(TAG, \"onCharacteristicChanged uuid=\" + characteristic.getUuid() + \" data=\" + HexDump.dumpHexString(characteristic.getValue()));\n\n        if (characteristic.getUuid().equals(inputCharacteristic) && !mFrozen) {\n            mManager.HIDDeviceInputReport(getId(), characteristic.getValue());\n        }\n    }\n\n    public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {\n        //Log.v(TAG, \"onDescriptorRead status=\" + status);\n    }\n\n    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {\n        BluetoothGattCharacteristic chr = descriptor.getCharacteristic();\n        //Log.v(TAG, \"onDescriptorWrite status=\" + status + \" uuid=\" + chr.getUuid() + \" descriptor=\" + descriptor.getUuid());\n\n        if (chr.getUuid().equals(inputCharacteristic)) {\n            boolean hasWrittenInputDescriptor = true;\n            BluetoothGattCharacteristic reportChr = chr.getService().getCharacteristic(reportCharacteristic);\n            if (reportChr != null) {\n                Log.v(TAG, \"Writing report characteristic to enter valve mode\");\n                reportChr.setValue(enterValveMode);\n                gatt.writeCharacteristic(reportChr);\n            }\n        }\n\n        finishCurrentGattOperation();\n    }\n\n    public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {\n        //Log.v(TAG, \"onReliableWriteCompleted status=\" + status);\n    }\n\n    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {\n        //Log.v(TAG, \"onReadRemoteRssi status=\" + status);\n    }\n\n    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {\n        //Log.v(TAG, \"onMtuChanged status=\" + status);\n    }\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    //////// Public API\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public int getId() {\n        return mDeviceId;\n    }\n\n    @Override\n    public int getVendorId() {\n        // Valve Corporation\n        final int VALVE_USB_VID = 0x28DE;\n        return VALVE_USB_VID;\n    }\n\n    @Override\n    public int getProductId() {\n        // We don't have an easy way to query from the Bluetooth device, but we know what it is\n        final int D0G_BLE2_PID = 0x1106;\n        return D0G_BLE2_PID;\n    }\n\n    @Override\n    public String getSerialNumber() {\n        // This will be read later via feature report by Steam\n        return \"12345\";\n    }\n\n    @Override\n    public int getVersion() {\n        return 0;\n    }\n\n    @Override\n    public String getManufacturerName() {\n        return \"Valve Corporation\";\n    }\n\n    @Override\n    public String getProductName() {\n        return \"Steam Controller\";\n    }\n\n    @Override\n    public UsbDevice getDevice() {\n        return null;\n    }\n\n    @Override\n    public boolean open() {\n        return true;\n    }\n\n    @Override\n    public int sendFeatureReport(byte[] report) {\n        if (!isRegistered()) {\n            Log.e(TAG, \"Attempted sendFeatureReport before Steam Controller is registered!\");\n            if (mIsConnected) {\n                probeService(this);\n            }\n            return -1;\n        }\n\n        // We need to skip the first byte, as that doesn't go over the air\n        byte[] actual_report = Arrays.copyOfRange(report, 1, report.length - 1);\n        //Log.v(TAG, \"sendFeatureReport \" + HexDump.dumpHexString(actual_report));\n        writeCharacteristic(reportCharacteristic, actual_report);\n        return report.length;\n    }\n\n    @Override\n    public int sendOutputReport(byte[] report) {\n        if (!isRegistered()) {\n            Log.e(TAG, \"Attempted sendOutputReport before Steam Controller is registered!\");\n            if (mIsConnected) {\n                probeService(this);\n            }\n            return -1;\n        }\n\n        //Log.v(TAG, \"sendFeatureReport \" + HexDump.dumpHexString(report));\n        writeCharacteristic(reportCharacteristic, report);\n        return report.length;\n    }\n\n    @Override\n    public boolean getFeatureReport(byte[] report) {\n        if (!isRegistered()) {\n            Log.e(TAG, \"Attempted getFeatureReport before Steam Controller is registered!\");\n            if (mIsConnected) {\n                probeService(this);\n            }\n            return false;\n        }\n\n        //Log.v(TAG, \"getFeatureReport\");\n        readCharacteristic(reportCharacteristic);\n        return true;\n    }\n\n    @Override\n    public void close() {\n    }\n\n    @Override\n    public void setFrozen(boolean frozen) {\n        mFrozen = frozen;\n    }\n\n    @Override\n    public void shutdown() {\n        close();\n\n        BluetoothGatt g = mGatt;\n        if (g != null) {\n            g.disconnect();\n            g.close();\n            mGatt = null;\n        }\n        mManager = null;\n        mIsRegistered = false;\n        mIsConnected = false;\n        mOperations.clear();\n    }\n\n}\n\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/HIDDeviceManager.java",
    "content": "package org.libsdl.app;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.PendingIntent;\nimport android.bluetooth.BluetoothAdapter;\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.BluetoothManager;\nimport android.bluetooth.BluetoothProfile;\nimport android.os.Build;\nimport android.util.Log;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageManager;\nimport android.hardware.usb.*;\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\n\npublic class HIDDeviceManager {\n    private static final String TAG = \"hidapi\";\n    private static final String ACTION_USB_PERMISSION = \"org.libsdl.app.USB_PERMISSION\";\n\n    private static HIDDeviceManager sManager;\n    private static int sManagerRefCount = 0;\n\n    public static HIDDeviceManager acquire(Context context) {\n        if (sManagerRefCount == 0) {\n            sManager = new HIDDeviceManager(context);\n        }\n        ++sManagerRefCount;\n        return sManager;\n    }\n\n    public static void release(HIDDeviceManager manager) {\n        if (manager == sManager) {\n            --sManagerRefCount;\n            if (sManagerRefCount == 0) {\n                sManager.close();\n                sManager = null;\n            }\n        }\n    }\n\n    private Context mContext;\n    private HashMap<Integer, HIDDevice> mDevicesById = new HashMap<Integer, HIDDevice>();\n    private HashMap<BluetoothDevice, HIDDeviceBLESteamController> mBluetoothDevices = new HashMap<BluetoothDevice, HIDDeviceBLESteamController>();\n    private int mNextDeviceId = 0;\n    private SharedPreferences mSharedPreferences = null;\n    private boolean mIsChromebook = false;\n    private UsbManager mUsbManager;\n    private Handler mHandler;\n    private BluetoothManager mBluetoothManager;\n    private List<BluetoothDevice> mLastBluetoothDevices;\n\n    private final BroadcastReceiver mUsbBroadcast = new BroadcastReceiver() {\n        @Override\n        public void onReceive(Context context, Intent intent) {\n            String action = intent.getAction();\n            if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {\n                UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);\n                handleUsbDeviceAttached(usbDevice);\n            } else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {\n                UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);\n                handleUsbDeviceDetached(usbDevice);\n            } else if (action.equals(HIDDeviceManager.ACTION_USB_PERMISSION)) {\n                UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);\n                handleUsbDevicePermission(usbDevice, intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false));\n            }\n        }\n    };\n\n    private final BroadcastReceiver mBluetoothBroadcast = new BroadcastReceiver() {\n        @Override\n        public void onReceive(Context context, Intent intent) {\n            String action = intent.getAction();\n            // Bluetooth device was connected. If it was a Steam Controller, handle it\n            if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {\n                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);\n                Log.d(TAG, \"Bluetooth device connected: \" + device);\n\n                if (isSteamController(device)) {\n                    connectBluetoothDevice(device);\n                }\n            }\n\n            // Bluetooth device was disconnected, remove from controller manager (if any)\n            if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {\n                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);\n                Log.d(TAG, \"Bluetooth device disconnected: \" + device);\n\n                disconnectBluetoothDevice(device);\n            }\n        }\n    };\n\n    private HIDDeviceManager(final Context context) {\n        mContext = context;\n\n        HIDDeviceRegisterCallback();\n\n        mSharedPreferences = mContext.getSharedPreferences(\"hidapi\", Context.MODE_PRIVATE);\n        mIsChromebook = mContext.getPackageManager().hasSystemFeature(\"org.chromium.arc.device_management\");\n\n//        if (shouldClear) {\n//            SharedPreferences.Editor spedit = mSharedPreferences.edit();\n//            spedit.clear();\n//            spedit.commit();\n//        }\n//        else\n        {\n            mNextDeviceId = mSharedPreferences.getInt(\"next_device_id\", 0);\n        }\n    }\n\n    public Context getContext() {\n        return mContext;\n    }\n\n    public int getDeviceIDForIdentifier(String identifier) {\n        SharedPreferences.Editor spedit = mSharedPreferences.edit();\n\n        int result = mSharedPreferences.getInt(identifier, 0);\n        if (result == 0) {\n            result = mNextDeviceId++;\n            spedit.putInt(\"next_device_id\", mNextDeviceId);\n        }\n\n        spedit.putInt(identifier, result);\n        spedit.commit();\n        return result;\n    }\n\n    private void initializeUSB() {\n        mUsbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);\n        if (mUsbManager == null) {\n            return;\n        }\n\n        /*\n        // Logging\n        for (UsbDevice device : mUsbManager.getDeviceList().values()) {\n            Log.i(TAG,\"Path: \" + device.getDeviceName());\n            Log.i(TAG,\"Manufacturer: \" + device.getManufacturerName());\n            Log.i(TAG,\"Product: \" + device.getProductName());\n            Log.i(TAG,\"ID: \" + device.getDeviceId());\n            Log.i(TAG,\"Class: \" + device.getDeviceClass());\n            Log.i(TAG,\"Protocol: \" + device.getDeviceProtocol());\n            Log.i(TAG,\"Vendor ID \" + device.getVendorId());\n            Log.i(TAG,\"Product ID: \" + device.getProductId());\n            Log.i(TAG,\"Interface count: \" + device.getInterfaceCount());\n            Log.i(TAG,\"---------------------------------------\");\n\n            // Get interface details\n            for (int index = 0; index < device.getInterfaceCount(); index++) {\n                UsbInterface mUsbInterface = device.getInterface(index);\n                Log.i(TAG,\"  *****     *****\");\n                Log.i(TAG,\"  Interface index: \" + index);\n                Log.i(TAG,\"  Interface ID: \" + mUsbInterface.getId());\n                Log.i(TAG,\"  Interface class: \" + mUsbInterface.getInterfaceClass());\n                Log.i(TAG,\"  Interface subclass: \" + mUsbInterface.getInterfaceSubclass());\n                Log.i(TAG,\"  Interface protocol: \" + mUsbInterface.getInterfaceProtocol());\n                Log.i(TAG,\"  Endpoint count: \" + mUsbInterface.getEndpointCount());\n\n                // Get endpoint details\n                for (int epi = 0; epi < mUsbInterface.getEndpointCount(); epi++)\n                {\n                    UsbEndpoint mEndpoint = mUsbInterface.getEndpoint(epi);\n                    Log.i(TAG,\"    ++++   ++++   ++++\");\n                    Log.i(TAG,\"    Endpoint index: \" + epi);\n                    Log.i(TAG,\"    Attributes: \" + mEndpoint.getAttributes());\n                    Log.i(TAG,\"    Direction: \" + mEndpoint.getDirection());\n                    Log.i(TAG,\"    Number: \" + mEndpoint.getEndpointNumber());\n                    Log.i(TAG,\"    Interval: \" + mEndpoint.getInterval());\n                    Log.i(TAG,\"    Packet size: \" + mEndpoint.getMaxPacketSize());\n                    Log.i(TAG,\"    Type: \" + mEndpoint.getType());\n                }\n            }\n        }\n        Log.i(TAG,\" No more devices connected.\");\n        */\n\n        // Register for USB broadcasts and permission completions\n        IntentFilter filter = new IntentFilter();\n        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);\n        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);\n        filter.addAction(HIDDeviceManager.ACTION_USB_PERMISSION);\n        mContext.registerReceiver(mUsbBroadcast, filter);\n\n        for (UsbDevice usbDevice : mUsbManager.getDeviceList().values()) {\n            handleUsbDeviceAttached(usbDevice);\n        }\n    }\n\n    UsbManager getUSBManager() {\n        return mUsbManager;\n    }\n\n    private void shutdownUSB() {\n        try {\n            mContext.unregisterReceiver(mUsbBroadcast);\n        } catch (Exception e) {\n            // We may not have registered, that's okay\n        }\n    }\n\n    private boolean isHIDDeviceInterface(UsbDevice usbDevice, UsbInterface usbInterface) {\n        if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_HID) {\n            return true;\n        }\n        if (isXbox360Controller(usbDevice, usbInterface) || isXboxOneController(usbDevice, usbInterface)) {\n            return true;\n        }\n        return false;\n    }\n\n    private boolean isXbox360Controller(UsbDevice usbDevice, UsbInterface usbInterface) {\n        final int XB360_IFACE_SUBCLASS = 93;\n        final int XB360_IFACE_PROTOCOL = 1; // Wired\n        final int XB360W_IFACE_PROTOCOL = 129; // Wireless\n        final int[] SUPPORTED_VENDORS = {\n            0x0079, // GPD Win 2\n            0x044f, // Thrustmaster\n            0x045e, // Microsoft\n            0x046d, // Logitech\n            0x056e, // Elecom\n            0x06a3, // Saitek\n            0x0738, // Mad Catz\n            0x07ff, // Mad Catz\n            0x0e6f, // PDP\n            0x0f0d, // Hori\n            0x1038, // SteelSeries\n            0x11c9, // Nacon\n            0x12ab, // Unknown\n            0x1430, // RedOctane\n            0x146b, // BigBen\n            0x1532, // Razer Sabertooth\n            0x15e4, // Numark\n            0x162e, // Joytech\n            0x1689, // Razer Onza\n            0x1949, // Lab126, Inc.\n            0x1bad, // Harmonix\n            0x20d6, // PowerA\n            0x24c6, // PowerA\n            0x2c22, // Qanba\n            0x2dc8, // 8BitDo\n            0x9886, // ASTRO Gaming\n        };\n\n        if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC &&\n            usbInterface.getInterfaceSubclass() == XB360_IFACE_SUBCLASS &&\n            (usbInterface.getInterfaceProtocol() == XB360_IFACE_PROTOCOL ||\n             usbInterface.getInterfaceProtocol() == XB360W_IFACE_PROTOCOL)) {\n            int vendor_id = usbDevice.getVendorId();\n            for (int supportedVid : SUPPORTED_VENDORS) {\n                if (vendor_id == supportedVid) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    private boolean isXboxOneController(UsbDevice usbDevice, UsbInterface usbInterface) {\n        final int XB1_IFACE_SUBCLASS = 71;\n        final int XB1_IFACE_PROTOCOL = 208;\n        final int[] SUPPORTED_VENDORS = {\n            0x03f0, // HP\n            0x044f, // Thrustmaster\n            0x045e, // Microsoft\n            0x0738, // Mad Catz\n            0x0b05, // ASUS\n            0x0e6f, // PDP\n            0x0f0d, // Hori\n            0x10f5, // Turtle Beach\n            0x1532, // Razer Wildcat\n            0x20d6, // PowerA\n            0x24c6, // PowerA\n            0x2dc8, // 8BitDo\n            0x2e24, // Hyperkin\n            0x3537, // GameSir\n        };\n\n        if (usbInterface.getId() == 0 &&\n            usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC &&\n            usbInterface.getInterfaceSubclass() == XB1_IFACE_SUBCLASS &&\n            usbInterface.getInterfaceProtocol() == XB1_IFACE_PROTOCOL) {\n            int vendor_id = usbDevice.getVendorId();\n            for (int supportedVid : SUPPORTED_VENDORS) {\n                if (vendor_id == supportedVid) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    private void handleUsbDeviceAttached(UsbDevice usbDevice) {\n        connectHIDDeviceUSB(usbDevice);\n    }\n\n    private void handleUsbDeviceDetached(UsbDevice usbDevice) {\n        List<Integer> devices = new ArrayList<Integer>();\n        for (HIDDevice device : mDevicesById.values()) {\n            if (usbDevice.equals(device.getDevice())) {\n                devices.add(device.getId());\n            }\n        }\n        for (int id : devices) {\n            HIDDevice device = mDevicesById.get(id);\n            mDevicesById.remove(id);\n            device.shutdown();\n            HIDDeviceDisconnected(id);\n        }\n    }\n\n    private void handleUsbDevicePermission(UsbDevice usbDevice, boolean permission_granted) {\n        for (HIDDevice device : mDevicesById.values()) {\n            if (usbDevice.equals(device.getDevice())) {\n                boolean opened = false;\n                if (permission_granted) {\n                    opened = device.open();\n                }\n                HIDDeviceOpenResult(device.getId(), opened);\n            }\n        }\n    }\n\n    private void connectHIDDeviceUSB(UsbDevice usbDevice) {\n        synchronized (this) {\n            int interface_mask = 0;\n            for (int interface_index = 0; interface_index < usbDevice.getInterfaceCount(); interface_index++) {\n                UsbInterface usbInterface = usbDevice.getInterface(interface_index);\n                if (isHIDDeviceInterface(usbDevice, usbInterface)) {\n                    // Check to see if we've already added this interface\n                    // This happens with the Xbox Series X controller which has a duplicate interface 0, which is inactive\n                    int interface_id = usbInterface.getId();\n                    if ((interface_mask & (1 << interface_id)) != 0) {\n                        continue;\n                    }\n                    interface_mask |= (1 << interface_id);\n\n                    HIDDeviceUSB device = new HIDDeviceUSB(this, usbDevice, interface_index);\n                    int id = device.getId();\n                    mDevicesById.put(id, device);\n                    HIDDeviceConnected(id, device.getIdentifier(), device.getVendorId(), device.getProductId(), device.getSerialNumber(), device.getVersion(), device.getManufacturerName(), device.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol());\n                }\n            }\n        }\n    }\n\n    private void initializeBluetooth() {\n        Log.d(TAG, \"Initializing Bluetooth\");\n\n        if (Build.VERSION.SDK_INT >= 31 /* Android 12  */ &&\n            mContext.getPackageManager().checkPermission(android.Manifest.permission.BLUETOOTH_CONNECT, mContext.getPackageName()) != PackageManager.PERMISSION_GRANTED) {\n            Log.d(TAG, \"Couldn't initialize Bluetooth, missing android.permission.BLUETOOTH_CONNECT\");\n            return;\n        }\n\n        if (Build.VERSION.SDK_INT <= 30 /* Android 11.0 (R) */ &&\n            mContext.getPackageManager().checkPermission(android.Manifest.permission.BLUETOOTH, mContext.getPackageName()) != PackageManager.PERMISSION_GRANTED) {\n            Log.d(TAG, \"Couldn't initialize Bluetooth, missing android.permission.BLUETOOTH\");\n            return;\n        }\n\n        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) || (Build.VERSION.SDK_INT < 18 /* Android 4.3 (JELLY_BEAN_MR2) */)) {\n            Log.d(TAG, \"Couldn't initialize Bluetooth, this version of Android does not support Bluetooth LE\");\n            return;\n        }\n\n        // Find bonded bluetooth controllers and create SteamControllers for them\n        mBluetoothManager = (BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE);\n        if (mBluetoothManager == null) {\n            // This device doesn't support Bluetooth.\n            return;\n        }\n\n        BluetoothAdapter btAdapter = mBluetoothManager.getAdapter();\n        if (btAdapter == null) {\n            // This device has Bluetooth support in the codebase, but has no available adapters.\n            return;\n        }\n\n        // Get our bonded devices.\n        for (BluetoothDevice device : btAdapter.getBondedDevices()) {\n\n            Log.d(TAG, \"Bluetooth device available: \" + device);\n            if (isSteamController(device)) {\n                connectBluetoothDevice(device);\n            }\n\n        }\n\n        // NOTE: These don't work on Chromebooks, to my undying dismay.\n        IntentFilter filter = new IntentFilter();\n        filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);\n        filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);\n        mContext.registerReceiver(mBluetoothBroadcast, filter);\n\n        if (mIsChromebook) {\n            mHandler = new Handler(Looper.getMainLooper());\n            mLastBluetoothDevices = new ArrayList<BluetoothDevice>();\n\n            // final HIDDeviceManager finalThis = this;\n            // mHandler.postDelayed(new Runnable() {\n            //     @Override\n            //     public void run() {\n            //         finalThis.chromebookConnectionHandler();\n            //     }\n            // }, 5000);\n        }\n    }\n\n    private void shutdownBluetooth() {\n        try {\n            mContext.unregisterReceiver(mBluetoothBroadcast);\n        } catch (Exception e) {\n            // We may not have registered, that's okay\n        }\n    }\n\n    // Chromebooks do not pass along ACTION_ACL_CONNECTED / ACTION_ACL_DISCONNECTED properly.\n    // This function provides a sort of dummy version of that, watching for changes in the\n    // connected devices and attempting to add controllers as things change.\n    public void chromebookConnectionHandler() {\n        if (!mIsChromebook) {\n            return;\n        }\n\n        ArrayList<BluetoothDevice> disconnected = new ArrayList<BluetoothDevice>();\n        ArrayList<BluetoothDevice> connected = new ArrayList<BluetoothDevice>();\n\n        List<BluetoothDevice> currentConnected = mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT);\n\n        for (BluetoothDevice bluetoothDevice : currentConnected) {\n            if (!mLastBluetoothDevices.contains(bluetoothDevice)) {\n                connected.add(bluetoothDevice);\n            }\n        }\n        for (BluetoothDevice bluetoothDevice : mLastBluetoothDevices) {\n            if (!currentConnected.contains(bluetoothDevice)) {\n                disconnected.add(bluetoothDevice);\n            }\n        }\n\n        mLastBluetoothDevices = currentConnected;\n\n        for (BluetoothDevice bluetoothDevice : disconnected) {\n            disconnectBluetoothDevice(bluetoothDevice);\n        }\n        for (BluetoothDevice bluetoothDevice : connected) {\n            connectBluetoothDevice(bluetoothDevice);\n        }\n\n        final HIDDeviceManager finalThis = this;\n        mHandler.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                finalThis.chromebookConnectionHandler();\n            }\n        }, 10000);\n    }\n\n    public boolean connectBluetoothDevice(BluetoothDevice bluetoothDevice) {\n        Log.v(TAG, \"connectBluetoothDevice device=\" + bluetoothDevice);\n        synchronized (this) {\n            if (mBluetoothDevices.containsKey(bluetoothDevice)) {\n                Log.v(TAG, \"Steam controller with address \" + bluetoothDevice + \" already exists, attempting reconnect\");\n\n                HIDDeviceBLESteamController device = mBluetoothDevices.get(bluetoothDevice);\n                device.reconnect();\n\n                return false;\n            }\n            HIDDeviceBLESteamController device = new HIDDeviceBLESteamController(this, bluetoothDevice);\n            int id = device.getId();\n            mBluetoothDevices.put(bluetoothDevice, device);\n            mDevicesById.put(id, device);\n\n            // The Steam Controller will mark itself connected once initialization is complete\n        }\n        return true;\n    }\n\n    public void disconnectBluetoothDevice(BluetoothDevice bluetoothDevice) {\n        synchronized (this) {\n            HIDDeviceBLESteamController device = mBluetoothDevices.get(bluetoothDevice);\n            if (device == null)\n                return;\n\n            int id = device.getId();\n            mBluetoothDevices.remove(bluetoothDevice);\n            mDevicesById.remove(id);\n            device.shutdown();\n            HIDDeviceDisconnected(id);\n        }\n    }\n\n    public boolean isSteamController(BluetoothDevice bluetoothDevice) {\n        // Sanity check.  If you pass in a null device, by definition it is never a Steam Controller.\n        if (bluetoothDevice == null) {\n            return false;\n        }\n\n        // If the device has no local name, we really don't want to try an equality check against it.\n        if (bluetoothDevice.getName() == null) {\n            return false;\n        }\n\n        return bluetoothDevice.getName().equals(\"SteamController\") && ((bluetoothDevice.getType() & BluetoothDevice.DEVICE_TYPE_LE) != 0);\n    }\n\n    private void close() {\n        shutdownUSB();\n        shutdownBluetooth();\n        synchronized (this) {\n            for (HIDDevice device : mDevicesById.values()) {\n                device.shutdown();\n            }\n            mDevicesById.clear();\n            mBluetoothDevices.clear();\n            HIDDeviceReleaseCallback();\n        }\n    }\n\n    public void setFrozen(boolean frozen) {\n        synchronized (this) {\n            for (HIDDevice device : mDevicesById.values()) {\n                device.setFrozen(frozen);\n            }\n        }\n    }\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    private HIDDevice getDevice(int id) {\n        synchronized (this) {\n            HIDDevice result = mDevicesById.get(id);\n            if (result == null) {\n                Log.v(TAG, \"No device for id: \" + id);\n                Log.v(TAG, \"Available devices: \" + mDevicesById.keySet());\n            }\n            return result;\n        }\n    }\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    ////////// JNI interface functions\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    public boolean initialize(boolean usb, boolean bluetooth) {\n        Log.v(TAG, \"initialize(\" + usb + \", \" + bluetooth + \")\");\n\n        if (usb) {\n            initializeUSB();\n        }\n        if (bluetooth) {\n            initializeBluetooth();\n        }\n        return true;\n    }\n\n    public boolean openDevice(int deviceID) {\n        Log.v(TAG, \"openDevice deviceID=\" + deviceID);\n        HIDDevice device = getDevice(deviceID);\n        if (device == null) {\n            HIDDeviceDisconnected(deviceID);\n            return false;\n        }\n\n        // Look to see if this is a USB device and we have permission to access it\n        UsbDevice usbDevice = device.getDevice();\n        if (usbDevice != null && !mUsbManager.hasPermission(usbDevice)) {\n            HIDDeviceOpenPending(deviceID);\n            try {\n                final int FLAG_MUTABLE = 0x02000000; // PendingIntent.FLAG_MUTABLE, but don't require SDK 31\n                int flags;\n                if (Build.VERSION.SDK_INT >= 31 /* Android 12.0 (S) */) {\n                    flags = FLAG_MUTABLE;\n                } else {\n                    flags = 0;\n                }\n                if (Build.VERSION.SDK_INT >= 33 /* Android 14.0 (U) */) {\n                   Intent intent = new Intent(HIDDeviceManager.ACTION_USB_PERMISSION);\n                   intent.setPackage(mContext.getPackageName());\n                   mUsbManager.requestPermission(usbDevice, PendingIntent.getBroadcast(mContext, 0, intent, flags));\n               } else {\n                   mUsbManager.requestPermission(usbDevice, PendingIntent.getBroadcast(mContext, 0, new Intent(HIDDeviceManager.ACTION_USB_PERMISSION), flags));\n               }\n            } catch (Exception e) {\n                Log.v(TAG, \"Couldn't request permission for USB device \" + usbDevice);\n                HIDDeviceOpenResult(deviceID, false);\n            }\n            return false;\n        }\n\n        try {\n            return device.open();\n        } catch (Exception e) {\n            Log.e(TAG, \"Got exception: \" + Log.getStackTraceString(e));\n        }\n        return false;\n    }\n\n    public int sendOutputReport(int deviceID, byte[] report) {\n        try {\n            //Log.v(TAG, \"sendOutputReport deviceID=\" + deviceID + \" length=\" + report.length);\n            HIDDevice device;\n            device = getDevice(deviceID);\n            if (device == null) {\n                HIDDeviceDisconnected(deviceID);\n                return -1;\n            }\n\n            return device.sendOutputReport(report);\n        } catch (Exception e) {\n            Log.e(TAG, \"Got exception: \" + Log.getStackTraceString(e));\n        }\n        return -1;\n    }\n\n    public int sendFeatureReport(int deviceID, byte[] report) {\n        try {\n            //Log.v(TAG, \"sendFeatureReport deviceID=\" + deviceID + \" length=\" + report.length);\n            HIDDevice device;\n            device = getDevice(deviceID);\n            if (device == null) {\n                HIDDeviceDisconnected(deviceID);\n                return -1;\n            }\n\n            return device.sendFeatureReport(report);\n        } catch (Exception e) {\n            Log.e(TAG, \"Got exception: \" + Log.getStackTraceString(e));\n        }\n        return -1;\n    }\n\n    public boolean getFeatureReport(int deviceID, byte[] report) {\n        try {\n            //Log.v(TAG, \"getFeatureReport deviceID=\" + deviceID);\n            HIDDevice device;\n            device = getDevice(deviceID);\n            if (device == null) {\n                HIDDeviceDisconnected(deviceID);\n                return false;\n            }\n\n            return device.getFeatureReport(report);\n        } catch (Exception e) {\n            Log.e(TAG, \"Got exception: \" + Log.getStackTraceString(e));\n        }\n        return false;\n    }\n\n    public void closeDevice(int deviceID) {\n        try {\n            Log.v(TAG, \"closeDevice deviceID=\" + deviceID);\n            HIDDevice device;\n            device = getDevice(deviceID);\n            if (device == null) {\n                HIDDeviceDisconnected(deviceID);\n                return;\n            }\n\n            device.close();\n        } catch (Exception e) {\n            Log.e(TAG, \"Got exception: \" + Log.getStackTraceString(e));\n        }\n    }\n\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n    /////////////// Native methods\n    //////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    private native void HIDDeviceRegisterCallback();\n    private native void HIDDeviceReleaseCallback();\n\n    native void HIDDeviceConnected(int deviceID, String identifier, int vendorId, int productId, String serial_number, int release_number, String manufacturer_string, String product_string, int interface_number, int interface_class, int interface_subclass, int interface_protocol);\n    native void HIDDeviceOpenPending(int deviceID);\n    native void HIDDeviceOpenResult(int deviceID, boolean opened);\n    native void HIDDeviceDisconnected(int deviceID);\n\n    native void HIDDeviceInputReport(int deviceID, byte[] report);\n    native void HIDDeviceFeatureReport(int deviceID, byte[] report);\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java",
    "content": "package org.libsdl.app;\n\nimport android.hardware.usb.*;\nimport android.os.Build;\nimport android.util.Log;\nimport java.util.Arrays;\n\nclass HIDDeviceUSB implements HIDDevice {\n\n    private static final String TAG = \"hidapi\";\n\n    protected HIDDeviceManager mManager;\n    protected UsbDevice mDevice;\n    protected int mInterfaceIndex;\n    protected int mInterface;\n    protected int mDeviceId;\n    protected UsbDeviceConnection mConnection;\n    protected UsbEndpoint mInputEndpoint;\n    protected UsbEndpoint mOutputEndpoint;\n    protected InputThread mInputThread;\n    protected boolean mRunning;\n    protected boolean mFrozen;\n\n    public HIDDeviceUSB(HIDDeviceManager manager, UsbDevice usbDevice, int interface_index) {\n        mManager = manager;\n        mDevice = usbDevice;\n        mInterfaceIndex = interface_index;\n        mInterface = mDevice.getInterface(mInterfaceIndex).getId();\n        mDeviceId = manager.getDeviceIDForIdentifier(getIdentifier());\n        mRunning = false;\n    }\n\n    public String getIdentifier() {\n        return String.format(\"%s/%x/%x/%d\", mDevice.getDeviceName(), mDevice.getVendorId(), mDevice.getProductId(), mInterfaceIndex);\n    }\n\n    @Override\n    public int getId() {\n        return mDeviceId;\n    }\n\n    @Override\n    public int getVendorId() {\n        return mDevice.getVendorId();\n    }\n\n    @Override\n    public int getProductId() {\n        return mDevice.getProductId();\n    }\n\n    @Override\n    public String getSerialNumber() {\n        String result = null;\n        if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {\n            try {\n                result = mDevice.getSerialNumber();\n            }\n            catch (SecurityException exception) {\n                //Log.w(TAG, \"App permissions mean we cannot get serial number for device \" + getDeviceName() + \" message: \" + exception.getMessage());\n            }\n        }\n        if (result == null) {\n            result = \"\";\n        }\n        return result;\n    }\n\n    @Override\n    public int getVersion() {\n        return 0;\n    }\n\n    @Override\n    public String getManufacturerName() {\n        String result = null;\n        if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {\n            result = mDevice.getManufacturerName();\n        }\n        if (result == null) {\n            result = String.format(\"%x\", getVendorId());\n        }\n        return result;\n    }\n\n    @Override\n    public String getProductName() {\n        String result = null;\n        if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {\n            result = mDevice.getProductName();\n        }\n        if (result == null) {\n            result = String.format(\"%x\", getProductId());\n        }\n        return result;\n    }\n\n    @Override\n    public UsbDevice getDevice() {\n        return mDevice;\n    }\n\n    public String getDeviceName() {\n        return getManufacturerName() + \" \" + getProductName() + \"(0x\" + String.format(\"%x\", getVendorId()) + \"/0x\" + String.format(\"%x\", getProductId()) + \")\";\n    }\n\n    @Override\n    public boolean open() {\n        mConnection = mManager.getUSBManager().openDevice(mDevice);\n        if (mConnection == null) {\n            Log.w(TAG, \"Unable to open USB device \" + getDeviceName());\n            return false;\n        }\n\n        // Force claim our interface\n        UsbInterface iface = mDevice.getInterface(mInterfaceIndex);\n        if (!mConnection.claimInterface(iface, true)) {\n            Log.w(TAG, \"Failed to claim interfaces on USB device \" + getDeviceName());\n            close();\n            return false;\n        }\n\n        // Find the endpoints\n        for (int j = 0; j < iface.getEndpointCount(); j++) {\n            UsbEndpoint endpt = iface.getEndpoint(j);\n            switch (endpt.getDirection()) {\n            case UsbConstants.USB_DIR_IN:\n                if (mInputEndpoint == null) {\n                    mInputEndpoint = endpt;\n                }\n                break;\n            case UsbConstants.USB_DIR_OUT:\n                if (mOutputEndpoint == null) {\n                    mOutputEndpoint = endpt;\n                }\n                break;\n            }\n        }\n\n        // Make sure the required endpoints were present\n        if (mInputEndpoint == null || mOutputEndpoint == null) {\n            Log.w(TAG, \"Missing required endpoint on USB device \" + getDeviceName());\n            close();\n            return false;\n        }\n\n        // Start listening for input\n        mRunning = true;\n        mInputThread = new InputThread();\n        mInputThread.start();\n\n        return true;\n    }\n\n    @Override\n    public int sendFeatureReport(byte[] report) {\n        int res = -1;\n        int offset = 0;\n        int length = report.length;\n        boolean skipped_report_id = false;\n        byte report_number = report[0];\n\n        if (report_number == 0x0) {\n            ++offset;\n            --length;\n            skipped_report_id = true;\n        }\n\n        res = mConnection.controlTransfer(\n            UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_OUT,\n            0x09/*HID set_report*/,\n            (3/*HID feature*/ << 8) | report_number,\n            mInterface,\n            report, offset, length,\n            1000/*timeout millis*/);\n\n        if (res < 0) {\n            Log.w(TAG, \"sendFeatureReport() returned \" + res + \" on device \" + getDeviceName());\n            return -1;\n        }\n\n        if (skipped_report_id) {\n            ++length;\n        }\n        return length;\n    }\n\n    @Override\n    public int sendOutputReport(byte[] report) {\n        int r = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000);\n        if (r != report.length) {\n            Log.w(TAG, \"sendOutputReport() returned \" + r + \" on device \" + getDeviceName());\n        }\n        return r;\n    }\n\n    @Override\n    public boolean getFeatureReport(byte[] report) {\n        int res = -1;\n        int offset = 0;\n        int length = report.length;\n        boolean skipped_report_id = false;\n        byte report_number = report[0];\n\n        if (report_number == 0x0) {\n            /* Offset the return buffer by 1, so that the report ID\n               will remain in byte 0. */\n            ++offset;\n            --length;\n            skipped_report_id = true;\n        }\n\n        res = mConnection.controlTransfer(\n            UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_IN,\n            0x01/*HID get_report*/,\n            (3/*HID feature*/ << 8) | report_number,\n            mInterface,\n            report, offset, length,\n            1000/*timeout millis*/);\n\n        if (res < 0) {\n            Log.w(TAG, \"getFeatureReport() returned \" + res + \" on device \" + getDeviceName());\n            return false;\n        }\n\n        if (skipped_report_id) {\n            ++res;\n            ++length;\n        }\n\n        byte[] data;\n        if (res == length) {\n            data = report;\n        } else {\n            data = Arrays.copyOfRange(report, 0, res);\n        }\n        mManager.HIDDeviceFeatureReport(mDeviceId, data);\n\n        return true;\n    }\n\n    @Override\n    public void close() {\n        mRunning = false;\n        if (mInputThread != null) {\n            while (mInputThread.isAlive()) {\n                mInputThread.interrupt();\n                try {\n                    mInputThread.join();\n                } catch (InterruptedException e) {\n                    // Keep trying until we're done\n                }\n            }\n            mInputThread = null;\n        }\n        if (mConnection != null) {\n            UsbInterface iface = mDevice.getInterface(mInterfaceIndex);\n            mConnection.releaseInterface(iface);\n            mConnection.close();\n            mConnection = null;\n        }\n    }\n\n    @Override\n    public void shutdown() {\n        close();\n        mManager = null;\n    }\n\n    @Override\n    public void setFrozen(boolean frozen) {\n        mFrozen = frozen;\n    }\n\n    protected class InputThread extends Thread {\n        @Override\n        public void run() {\n            int packetSize = mInputEndpoint.getMaxPacketSize();\n            byte[] packet = new byte[packetSize];\n            while (mRunning) {\n                int r;\n                try\n                {\n                    r = mConnection.bulkTransfer(mInputEndpoint, packet, packetSize, 1000);\n                }\n                catch (Exception e)\n                {\n                    Log.v(TAG, \"Exception in UsbDeviceConnection bulktransfer: \" + e);\n                    break;\n                }\n                if (r < 0) {\n                    // Could be a timeout or an I/O error\n                }\n                if (r > 0) {\n                    byte[] data;\n                    if (r == packetSize) {\n                        data = packet;\n                    } else {\n                        data = Arrays.copyOfRange(packet, 0, r);\n                    }\n\n                    if (!mFrozen) {\n                        mManager.HIDDeviceInputReport(mDeviceId, data);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/SDL.java",
    "content": "package org.libsdl.app;\n\nimport android.content.Context;\n\nimport java.lang.Class;\nimport java.lang.reflect.Method;\n\n/**\n    SDL library initialization\n*/\npublic class SDL {\n\n    // This function should be called first and sets up the native code\n    // so it can call into the Java classes\n    public static void setupJNI() {\n        SDLActivity.nativeSetupJNI();\n        SDLAudioManager.nativeSetupJNI();\n        SDLControllerManager.nativeSetupJNI();\n    }\n\n    // This function should be called each time the activity is started\n    public static void initialize() {\n        setContext(null);\n\n        SDLActivity.initialize();\n        SDLAudioManager.initialize();\n        SDLControllerManager.initialize();\n    }\n\n    // This function stores the current activity (SDL or not)\n    public static void setContext(Context context) {\n        SDLAudioManager.setContext(context);\n        mContext = context;\n    }\n\n    public static Context getContext() {\n        return mContext;\n    }\n\n    public static void loadLibrary(String libraryName) throws UnsatisfiedLinkError, SecurityException, NullPointerException {\n        loadLibrary(libraryName, mContext);\n    }\n\n    public static void loadLibrary(String libraryName, Context context) throws UnsatisfiedLinkError, SecurityException, NullPointerException {\n\n        if (libraryName == null) {\n            throw new NullPointerException(\"No library name provided.\");\n        }\n\n        try {\n            // Let's see if we have ReLinker available in the project.  This is necessary for \n            // some projects that have huge numbers of local libraries bundled, and thus may \n            // trip a bug in Android's native library loader which ReLinker works around.  (If\n            // loadLibrary works properly, ReLinker will simply use the normal Android method\n            // internally.)\n            //\n            // To use ReLinker, just add it as a dependency.  For more information, see \n            // https://github.com/KeepSafe/ReLinker for ReLinker's repository.\n            //\n            Class<?> relinkClass = context.getClassLoader().loadClass(\"com.getkeepsafe.relinker.ReLinker\");\n            Class<?> relinkListenerClass = context.getClassLoader().loadClass(\"com.getkeepsafe.relinker.ReLinker$LoadListener\");\n            Class<?> contextClass = context.getClassLoader().loadClass(\"android.content.Context\");\n            Class<?> stringClass = context.getClassLoader().loadClass(\"java.lang.String\");\n\n            // Get a 'force' instance of the ReLinker, so we can ensure libraries are reinstalled if \n            // they've changed during updates.\n            Method forceMethod = relinkClass.getDeclaredMethod(\"force\");\n            Object relinkInstance = forceMethod.invoke(null);\n            Class<?> relinkInstanceClass = relinkInstance.getClass();\n\n            // Actually load the library!\n            Method loadMethod = relinkInstanceClass.getDeclaredMethod(\"loadLibrary\", contextClass, stringClass, stringClass, relinkListenerClass);\n            loadMethod.invoke(relinkInstance, context, libraryName, null, null);\n        }\n        catch (final Throwable e) {\n            // Fall back\n            try {\n                System.loadLibrary(libraryName);\n            }\n            catch (final UnsatisfiedLinkError ule) {\n                throw ule;\n            }\n            catch (final SecurityException se) {\n                throw se;\n            }\n        }\n    }\n\n    protected static Context mContext;\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/SDLActivity.java",
    "content": "package org.libsdl.app;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.Dialog;\nimport android.app.UiModeManager;\nimport android.content.ClipboardManager;\nimport android.content.ClipData;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.pm.ActivityInfo;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.res.Configuration;\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\nimport android.graphics.PorterDuff;\nimport android.graphics.drawable.Drawable;\nimport android.hardware.Sensor;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.text.Editable;\nimport android.text.InputType;\nimport android.text.Selection;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.util.SparseArray;\nimport android.view.Display;\nimport android.view.Gravity;\nimport android.view.InputDevice;\nimport android.view.KeyEvent;\nimport android.view.PointerIcon;\nimport android.view.Surface;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.view.inputmethod.BaseInputConnection;\nimport android.view.inputmethod.EditorInfo;\nimport android.view.inputmethod.InputConnection;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport java.util.Hashtable;\nimport java.util.Locale;\n\n\n/**\n    SDL Activity\n*/\npublic class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {\n    private static final String TAG = \"SDL\";\n    private static final int SDL_MAJOR_VERSION = 2;\n    private static final int SDL_MINOR_VERSION = 30;\n    private static final int SDL_MICRO_VERSION = 12;\n/*\n    // Display InputType.SOURCE/CLASS of events and devices\n    //\n    // SDLActivity.debugSource(device.getSources(), \"device[\" + device.getName() + \"]\");\n    // SDLActivity.debugSource(event.getSource(), \"event\");\n    public static void debugSource(int sources, String prefix) {\n        int s = sources;\n        int s_copy = sources;\n        String cls = \"\";\n        String src = \"\";\n        int tst = 0;\n        int FLAG_TAINTED = 0x80000000;\n\n        if ((s & InputDevice.SOURCE_CLASS_BUTTON) != 0)     cls += \" BUTTON\";\n        if ((s & InputDevice.SOURCE_CLASS_JOYSTICK) != 0)   cls += \" JOYSTICK\";\n        if ((s & InputDevice.SOURCE_CLASS_POINTER) != 0)    cls += \" POINTER\";\n        if ((s & InputDevice.SOURCE_CLASS_POSITION) != 0)   cls += \" POSITION\";\n        if ((s & InputDevice.SOURCE_CLASS_TRACKBALL) != 0)  cls += \" TRACKBALL\";\n\n\n        int s2 = s_copy & ~InputDevice.SOURCE_ANY; // keep class bits\n        s2 &= ~(  InputDevice.SOURCE_CLASS_BUTTON\n                | InputDevice.SOURCE_CLASS_JOYSTICK\n                | InputDevice.SOURCE_CLASS_POINTER\n                | InputDevice.SOURCE_CLASS_POSITION\n                | InputDevice.SOURCE_CLASS_TRACKBALL);\n\n        if (s2 != 0) cls += \"Some_Unknown\";\n\n        s2 = s_copy & InputDevice.SOURCE_ANY; // keep source only, no class;\n\n        if (Build.VERSION.SDK_INT >= 23) {\n            tst = InputDevice.SOURCE_BLUETOOTH_STYLUS;\n            if ((s & tst) == tst) src += \" BLUETOOTH_STYLUS\";\n            s2 &= ~tst;\n        }\n\n        tst = InputDevice.SOURCE_DPAD;\n        if ((s & tst) == tst) src += \" DPAD\";\n        s2 &= ~tst;\n\n        tst = InputDevice.SOURCE_GAMEPAD;\n        if ((s & tst) == tst) src += \" GAMEPAD\";\n        s2 &= ~tst;\n\n        if (Build.VERSION.SDK_INT >= 21) {\n            tst = InputDevice.SOURCE_HDMI;\n            if ((s & tst) == tst) src += \" HDMI\";\n            s2 &= ~tst;\n        }\n\n        tst = InputDevice.SOURCE_JOYSTICK;\n        if ((s & tst) == tst) src += \" JOYSTICK\";\n        s2 &= ~tst;\n\n        tst = InputDevice.SOURCE_KEYBOARD;\n        if ((s & tst) == tst) src += \" KEYBOARD\";\n        s2 &= ~tst;\n\n        tst = InputDevice.SOURCE_MOUSE;\n        if ((s & tst) == tst) src += \" MOUSE\";\n        s2 &= ~tst;\n\n        if (Build.VERSION.SDK_INT >= 26) {\n            tst = InputDevice.SOURCE_MOUSE_RELATIVE;\n            if ((s & tst) == tst) src += \" MOUSE_RELATIVE\";\n            s2 &= ~tst;\n\n            tst = InputDevice.SOURCE_ROTARY_ENCODER;\n            if ((s & tst) == tst) src += \" ROTARY_ENCODER\";\n            s2 &= ~tst;\n        }\n        tst = InputDevice.SOURCE_STYLUS;\n        if ((s & tst) == tst) src += \" STYLUS\";\n        s2 &= ~tst;\n\n        tst = InputDevice.SOURCE_TOUCHPAD;\n        if ((s & tst) == tst) src += \" TOUCHPAD\";\n        s2 &= ~tst;\n\n        tst = InputDevice.SOURCE_TOUCHSCREEN;\n        if ((s & tst) == tst) src += \" TOUCHSCREEN\";\n        s2 &= ~tst;\n\n        if (Build.VERSION.SDK_INT >= 18) {\n            tst = InputDevice.SOURCE_TOUCH_NAVIGATION;\n            if ((s & tst) == tst) src += \" TOUCH_NAVIGATION\";\n            s2 &= ~tst;\n        }\n\n        tst = InputDevice.SOURCE_TRACKBALL;\n        if ((s & tst) == tst) src += \" TRACKBALL\";\n        s2 &= ~tst;\n\n        tst = InputDevice.SOURCE_ANY;\n        if ((s & tst) == tst) src += \" ANY\";\n        s2 &= ~tst;\n\n        if (s == FLAG_TAINTED) src += \" FLAG_TAINTED\";\n        s2 &= ~FLAG_TAINTED;\n\n        if (s2 != 0) src += \" Some_Unknown\";\n\n        Log.v(TAG, prefix + \"int=\" + s_copy + \" CLASS={\" + cls + \" } source(s):\" + src);\n    }\n*/\n\n    public static boolean mIsResumedCalled, mHasFocus;\n    public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24  /* Android 7.0 (N) */);\n\n    // Cursor types\n    // private static final int SDL_SYSTEM_CURSOR_NONE = -1;\n    private static final int SDL_SYSTEM_CURSOR_ARROW = 0;\n    private static final int SDL_SYSTEM_CURSOR_IBEAM = 1;\n    private static final int SDL_SYSTEM_CURSOR_WAIT = 2;\n    private static final int SDL_SYSTEM_CURSOR_CROSSHAIR = 3;\n    private static final int SDL_SYSTEM_CURSOR_WAITARROW = 4;\n    private static final int SDL_SYSTEM_CURSOR_SIZENWSE = 5;\n    private static final int SDL_SYSTEM_CURSOR_SIZENESW = 6;\n    private static final int SDL_SYSTEM_CURSOR_SIZEWE = 7;\n    private static final int SDL_SYSTEM_CURSOR_SIZENS = 8;\n    private static final int SDL_SYSTEM_CURSOR_SIZEALL = 9;\n    private static final int SDL_SYSTEM_CURSOR_NO = 10;\n    private static final int SDL_SYSTEM_CURSOR_HAND = 11;\n\n    protected static final int SDL_ORIENTATION_UNKNOWN = 0;\n    protected static final int SDL_ORIENTATION_LANDSCAPE = 1;\n    protected static final int SDL_ORIENTATION_LANDSCAPE_FLIPPED = 2;\n    protected static final int SDL_ORIENTATION_PORTRAIT = 3;\n    protected static final int SDL_ORIENTATION_PORTRAIT_FLIPPED = 4;\n\n    protected static int mCurrentOrientation;\n    protected static Locale mCurrentLocale;\n\n    // Handle the state of the native layer\n    public enum NativeState {\n           INIT, RESUMED, PAUSED\n    }\n\n    public static NativeState mNextNativeState;\n    public static NativeState mCurrentNativeState;\n\n    /** If shared libraries (e.g. SDL or the native application) could not be loaded. */\n    public static boolean mBrokenLibraries = true;\n\n    // Main components\n    protected static SDLActivity mSingleton;\n    protected static SDLSurface mSurface;\n    protected static DummyEdit mTextEdit;\n    protected static boolean mScreenKeyboardShown;\n    protected static ViewGroup mLayout;\n    protected static SDLClipboardHandler mClipboardHandler;\n    protected static Hashtable<Integer, PointerIcon> mCursors;\n    protected static int mLastCursorID;\n    protected static SDLGenericMotionListener_API12 mMotionListener;\n    protected static HIDDeviceManager mHIDDeviceManager;\n\n    // This is what SDL runs in. It invokes SDL_main(), eventually\n    protected static Thread mSDLThread;\n\n    protected static SDLGenericMotionListener_API12 getMotionListener() {\n        if (mMotionListener == null) {\n            if (Build.VERSION.SDK_INT >= 26 /* Android 8.0 (O) */) {\n                mMotionListener = new SDLGenericMotionListener_API26();\n            } else if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n                mMotionListener = new SDLGenericMotionListener_API24();\n            } else {\n                mMotionListener = new SDLGenericMotionListener_API12();\n            }\n        }\n\n        return mMotionListener;\n    }\n\n    /**\n     * This method returns the name of the shared object with the application entry point\n     * It can be overridden by derived classes.\n     */\n    protected String getMainSharedObject() {\n        String library;\n        String[] libraries = SDLActivity.mSingleton.getLibraries();\n        if (libraries.length > 0) {\n            library = \"lib\" + libraries[libraries.length - 1] + \".so\";\n        } else {\n            library = \"libmain.so\";\n        }\n        return getContext().getApplicationInfo().nativeLibraryDir + \"/\" + library;\n    }\n\n    /**\n     * This method returns the name of the application entry point\n     * It can be overridden by derived classes.\n     */\n    protected String getMainFunction() {\n        return \"SDL_main\";\n    }\n\n    /**\n     * This method is called by SDL before loading the native shared libraries.\n     * It can be overridden to provide names of shared libraries to be loaded.\n     * The default implementation returns the defaults. It never returns null.\n     * An array returned by a new implementation must at least contain \"SDL2\".\n     * Also keep in mind that the order the libraries are loaded may matter.\n     * @return names of shared libraries to be loaded (e.g. \"SDL2\", \"main\").\n     */\n    protected String[] getLibraries() {\n        return new String[] {\n            \"SDL2\",\n            // \"SDL2_image\",\n            // \"SDL2_mixer\",\n            // \"SDL2_net\",\n            // \"SDL2_ttf\",\n            \"main\"\n        };\n    }\n\n    // Load the .so\n    public void loadLibraries() {\n       for (String lib : getLibraries()) {\n          SDL.loadLibrary(lib, this);\n       }\n    }\n\n    /**\n     * This method is called by SDL before starting the native application thread.\n     * It can be overridden to provide the arguments after the application name.\n     * The default implementation returns an empty array. It never returns null.\n     * @return arguments for the native application.\n     */\n    protected String[] getArguments() {\n        return new String[0];\n    }\n\n    public static void initialize() {\n        // The static nature of the singleton and Android quirkyness force us to initialize everything here\n        // Otherwise, when exiting the app and returning to it, these variables *keep* their pre exit values\n        mSingleton = null;\n        mSurface = null;\n        mTextEdit = null;\n        mLayout = null;\n        mClipboardHandler = null;\n        mCursors = new Hashtable<Integer, PointerIcon>();\n        mLastCursorID = 0;\n        mSDLThread = null;\n        mIsResumedCalled = false;\n        mHasFocus = true;\n        mNextNativeState = NativeState.INIT;\n        mCurrentNativeState = NativeState.INIT;\n    }\n    \n    protected SDLSurface createSDLSurface(Context context) {\n        return new SDLSurface(context);\n    }\n\n    // Setup\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        Log.v(TAG, \"Device: \" + Build.DEVICE);\n        Log.v(TAG, \"Model: \" + Build.MODEL);\n        Log.v(TAG, \"onCreate()\");\n        super.onCreate(savedInstanceState);\n\n        try {\n            Thread.currentThread().setName(\"SDLActivity\");\n        } catch (Exception e) {\n            Log.v(TAG, \"modify thread properties failed \" + e.toString());\n        }\n\n        // Load shared libraries\n        String errorMsgBrokenLib = \"\";\n        try {\n            loadLibraries();\n            mBrokenLibraries = false; /* success */\n        } catch(UnsatisfiedLinkError e) {\n            System.err.println(e.getMessage());\n            mBrokenLibraries = true;\n            errorMsgBrokenLib = e.getMessage();\n        } catch(Exception e) {\n            System.err.println(e.getMessage());\n            mBrokenLibraries = true;\n            errorMsgBrokenLib = e.getMessage();\n        }\n\n        if (!mBrokenLibraries) {\n            String expected_version = String.valueOf(SDL_MAJOR_VERSION) + \".\" +\n                                      String.valueOf(SDL_MINOR_VERSION) + \".\" +\n                                      String.valueOf(SDL_MICRO_VERSION);\n            String version = nativeGetVersion();\n            if (!version.equals(expected_version)) {\n                mBrokenLibraries = true;\n                errorMsgBrokenLib = \"SDL C/Java version mismatch (expected \" + expected_version + \", got \" + version + \")\";\n            }\n        }\n\n        if (mBrokenLibraries) {\n            mSingleton = this;\n            AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);\n            dlgAlert.setMessage(\"An error occurred while trying to start the application. Please try again and/or reinstall.\"\n                  + System.getProperty(\"line.separator\")\n                  + System.getProperty(\"line.separator\")\n                  + \"Error: \" + errorMsgBrokenLib);\n            dlgAlert.setTitle(\"SDL Error\");\n            dlgAlert.setPositiveButton(\"Exit\",\n                new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog,int id) {\n                        // if this button is clicked, close current activity\n                        SDLActivity.mSingleton.finish();\n                    }\n                });\n           dlgAlert.setCancelable(false);\n           dlgAlert.create().show();\n\n           return;\n        }\n\n        // Set up JNI\n        SDL.setupJNI();\n\n        // Initialize state\n        SDL.initialize();\n\n        // So we can call stuff from static callbacks\n        mSingleton = this;\n        SDL.setContext(this);\n\n        mClipboardHandler = new SDLClipboardHandler();\n\n        mHIDDeviceManager = HIDDeviceManager.acquire(this);\n\n        // Set up the surface\n        mSurface = createSDLSurface(this);\n\n        mLayout = new RelativeLayout(this);\n        mLayout.addView(mSurface);\n\n        // Get our current screen orientation and pass it down.\n        mCurrentOrientation = SDLActivity.getCurrentOrientation();\n        // Only record current orientation\n        SDLActivity.onNativeOrientationChanged(mCurrentOrientation);\n\n        try {\n            if (Build.VERSION.SDK_INT < 24 /* Android 7.0 (N) */) {\n                mCurrentLocale = getContext().getResources().getConfiguration().locale;\n            } else {\n                mCurrentLocale = getContext().getResources().getConfiguration().getLocales().get(0);\n            }\n        } catch(Exception ignored) {\n        }\n\n        setContentView(mLayout);\n\n        setWindowStyle(false);\n\n        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this);\n\n        // Get filename from \"Open with\" of another application\n        Intent intent = getIntent();\n        if (intent != null && intent.getData() != null) {\n            String filename = intent.getData().getPath();\n            if (filename != null) {\n                Log.v(TAG, \"Got filename: \" + filename);\n                SDLActivity.onNativeDropFile(filename);\n            }\n        }\n    }\n\n    protected void pauseNativeThread() {\n        mNextNativeState = NativeState.PAUSED;\n        mIsResumedCalled = false;\n\n        if (SDLActivity.mBrokenLibraries) {\n            return;\n        }\n\n        SDLActivity.handleNativeState();\n    }\n\n    protected void resumeNativeThread() {\n        mNextNativeState = NativeState.RESUMED;\n        mIsResumedCalled = true;\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        SDLActivity.handleNativeState();\n    }\n\n    // Events\n    @Override\n    protected void onPause() {\n        Log.v(TAG, \"onPause()\");\n        super.onPause();\n\n        if (mHIDDeviceManager != null) {\n            mHIDDeviceManager.setFrozen(true);\n        }\n        if (!mHasMultiWindow) {\n            pauseNativeThread();\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        Log.v(TAG, \"onResume()\");\n        super.onResume();\n\n        if (mHIDDeviceManager != null) {\n            mHIDDeviceManager.setFrozen(false);\n        }\n        if (!mHasMultiWindow) {\n            resumeNativeThread();\n        }\n    }\n\n    @Override\n    protected void onStop() {\n        Log.v(TAG, \"onStop()\");\n        super.onStop();\n        if (mHasMultiWindow) {\n            pauseNativeThread();\n        }\n    }\n\n    @Override\n    protected void onStart() {\n        Log.v(TAG, \"onStart()\");\n        super.onStart();\n        if (mHasMultiWindow) {\n            resumeNativeThread();\n        }\n    }\n\n    public static int getCurrentOrientation() {\n        int result = SDL_ORIENTATION_UNKNOWN;\n\n        Activity activity = (Activity)getContext();\n        if (activity == null) {\n            return result;\n        }\n        Display display = activity.getWindowManager().getDefaultDisplay();\n\n        switch (display.getRotation()) {\n            case Surface.ROTATION_0:\n                result = SDL_ORIENTATION_PORTRAIT;\n                break;\n\n            case Surface.ROTATION_90:\n                result = SDL_ORIENTATION_LANDSCAPE;\n                break;\n\n            case Surface.ROTATION_180:\n                result = SDL_ORIENTATION_PORTRAIT_FLIPPED;\n                break;\n\n            case Surface.ROTATION_270:\n                result = SDL_ORIENTATION_LANDSCAPE_FLIPPED;\n                break;\n        }\n\n        return result;\n    }\n\n    @Override\n    public void onWindowFocusChanged(boolean hasFocus) {\n        super.onWindowFocusChanged(hasFocus);\n        Log.v(TAG, \"onWindowFocusChanged(): \" + hasFocus);\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        mHasFocus = hasFocus;\n        if (hasFocus) {\n           mNextNativeState = NativeState.RESUMED;\n           SDLActivity.getMotionListener().reclaimRelativeMouseModeIfNeeded();\n\n           SDLActivity.handleNativeState();\n           nativeFocusChanged(true);\n\n        } else {\n           nativeFocusChanged(false);\n           if (!mHasMultiWindow) {\n               mNextNativeState = NativeState.PAUSED;\n               SDLActivity.handleNativeState();\n           }\n        }\n    }\n\n    @Override\n    public void onLowMemory() {\n        Log.v(TAG, \"onLowMemory()\");\n        super.onLowMemory();\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        SDLActivity.nativeLowMemory();\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        Log.v(TAG, \"onConfigurationChanged()\");\n        super.onConfigurationChanged(newConfig);\n\n        if (SDLActivity.mBrokenLibraries) {\n           return;\n        }\n\n        if (mCurrentLocale == null || !mCurrentLocale.equals(newConfig.locale)) {\n            mCurrentLocale = newConfig.locale;\n            SDLActivity.onNativeLocaleChanged();\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        Log.v(TAG, \"onDestroy()\");\n\n        if (mHIDDeviceManager != null) {\n            HIDDeviceManager.release(mHIDDeviceManager);\n            mHIDDeviceManager = null;\n        }\n\n        SDLAudioManager.release(this);\n\n        if (SDLActivity.mBrokenLibraries) {\n           super.onDestroy();\n           return;\n        }\n\n        if (SDLActivity.mSDLThread != null) {\n\n            // Send Quit event to \"SDLThread\" thread\n            SDLActivity.nativeSendQuit();\n\n            // Wait for \"SDLThread\" thread to end\n            try {\n                SDLActivity.mSDLThread.join();\n            } catch(Exception e) {\n                Log.v(TAG, \"Problem stopping SDLThread: \" + e);\n            }\n        }\n\n        SDLActivity.nativeQuit();\n\n        super.onDestroy();\n    }\n\n    @Override\n    public void onBackPressed() {\n        // Check if we want to block the back button in case of mouse right click.\n        //\n        // If we do, the normal hardware back button will no longer work and people have to use home,\n        // but the mouse right click will work.\n        //\n        boolean trapBack = SDLActivity.nativeGetHintBoolean(\"SDL_ANDROID_TRAP_BACK_BUTTON\", false);\n        if (trapBack) {\n            // Exit and let the mouse handler handle this button (if appropriate)\n            return;\n        }\n\n        // Default system back button behavior.\n        if (!isFinishing()) {\n            super.onBackPressed();\n        }\n    }\n\n    // Called by JNI from SDL.\n    public static void manualBackButton() {\n        mSingleton.pressBackButton();\n    }\n\n    // Used to get us onto the activity's main thread\n    public void pressBackButton() {\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                if (!SDLActivity.this.isFinishing()) {\n                    SDLActivity.this.superOnBackPressed();\n                }\n            }\n        });\n    }\n\n    // Used to access the system back behavior.\n    public void superOnBackPressed() {\n        super.onBackPressed();\n    }\n\n    @Override\n    public boolean dispatchKeyEvent(KeyEvent event) {\n\n        if (SDLActivity.mBrokenLibraries) {\n           return false;\n        }\n\n        int keyCode = event.getKeyCode();\n        // Ignore certain special keys so they're handled by Android\n        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||\n            keyCode == KeyEvent.KEYCODE_VOLUME_UP ||\n            keyCode == KeyEvent.KEYCODE_CAMERA ||\n            keyCode == KeyEvent.KEYCODE_ZOOM_IN || /* API 11 */\n            keyCode == KeyEvent.KEYCODE_ZOOM_OUT /* API 11 */\n            ) {\n            return false;\n        }\n        return super.dispatchKeyEvent(event);\n    }\n\n    /* Transition to next state */\n    public static void handleNativeState() {\n\n        if (mNextNativeState == mCurrentNativeState) {\n            // Already in same state, discard.\n            return;\n        }\n\n        // Try a transition to init state\n        if (mNextNativeState == NativeState.INIT) {\n\n            mCurrentNativeState = mNextNativeState;\n            return;\n        }\n\n        // Try a transition to paused state\n        if (mNextNativeState == NativeState.PAUSED) {\n            if (mSDLThread != null) {\n                nativePause();\n            }\n            if (mSurface != null) {\n                mSurface.handlePause();\n            }\n            mCurrentNativeState = mNextNativeState;\n            return;\n        }\n\n        // Try a transition to resumed state\n        if (mNextNativeState == NativeState.RESUMED) {\n            if (mSurface.mIsSurfaceReady && mHasFocus && mIsResumedCalled) {\n                if (mSDLThread == null) {\n                    // This is the entry point to the C app.\n                    // Start up the C app thread and enable sensor input for the first time\n                    // FIXME: Why aren't we enabling sensor input at start?\n\n                    mSDLThread = new Thread(new SDLMain(), \"SDLThread\");\n                    mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true);\n                    mSDLThread.start();\n\n                    // No nativeResume(), don't signal Android_ResumeSem\n                } else {\n                    nativeResume();\n                }\n                mSurface.handleResume();\n\n                mCurrentNativeState = mNextNativeState;\n            }\n        }\n    }\n\n    // Messages from the SDLMain thread\n    static final int COMMAND_CHANGE_TITLE = 1;\n    static final int COMMAND_CHANGE_WINDOW_STYLE = 2;\n    static final int COMMAND_TEXTEDIT_HIDE = 3;\n    static final int COMMAND_SET_KEEP_SCREEN_ON = 5;\n\n    protected static final int COMMAND_USER = 0x8000;\n\n    protected static boolean mFullscreenModeActive;\n\n    /**\n     * This method is called by SDL if SDL did not handle a message itself.\n     * This happens if a received message contains an unsupported command.\n     * Method can be overwritten to handle Messages in a different class.\n     * @param command the command of the message.\n     * @param param the parameter of the message. May be null.\n     * @return if the message was handled in overridden method.\n     */\n    protected boolean onUnhandledMessage(int command, Object param) {\n        return false;\n    }\n\n    /**\n     * A Handler class for Messages from native SDL applications.\n     * It uses current Activities as target (e.g. for the title).\n     * static to prevent implicit references to enclosing object.\n     */\n    protected static class SDLCommandHandler extends Handler {\n        @Override\n        public void handleMessage(Message msg) {\n            Context context = SDL.getContext();\n            if (context == null) {\n                Log.e(TAG, \"error handling message, getContext() returned null\");\n                return;\n            }\n            switch (msg.arg1) {\n            case COMMAND_CHANGE_TITLE:\n                if (context instanceof Activity) {\n                    ((Activity) context).setTitle((String)msg.obj);\n                } else {\n                    Log.e(TAG, \"error handling message, getContext() returned no Activity\");\n                }\n                break;\n            case COMMAND_CHANGE_WINDOW_STYLE:\n                if (Build.VERSION.SDK_INT >= 19 /* Android 4.4 (KITKAT) */) {\n                    if (context instanceof Activity) {\n                        Window window = ((Activity) context).getWindow();\n                        if (window != null) {\n                            if ((msg.obj instanceof Integer) && ((Integer) msg.obj != 0)) {\n                                int flags = View.SYSTEM_UI_FLAG_FULLSCREEN |\n                                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |\n                                        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |\n                                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |\n                                        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |\n                                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE;\n                                window.getDecorView().setSystemUiVisibility(flags);\n                                window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);\n                                window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);\n                                SDLActivity.mFullscreenModeActive = true;\n                            } else {\n                                int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_VISIBLE;\n                                window.getDecorView().setSystemUiVisibility(flags);\n                                window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);\n                                window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);\n                                SDLActivity.mFullscreenModeActive = false;\n                            }\n                        }\n                    } else {\n                        Log.e(TAG, \"error handling message, getContext() returned no Activity\");\n                    }\n                }\n                break;\n            case COMMAND_TEXTEDIT_HIDE:\n                if (mTextEdit != null) {\n                    // Note: On some devices setting view to GONE creates a flicker in landscape.\n                    // Setting the View's sizes to 0 is similar to GONE but without the flicker.\n                    // The sizes will be set to useful values when the keyboard is shown again.\n                    mTextEdit.setLayoutParams(new RelativeLayout.LayoutParams(0, 0));\n\n                    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);\n                    imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);\n\n                    mScreenKeyboardShown = false;\n\n                    mSurface.requestFocus();\n                }\n                break;\n            case COMMAND_SET_KEEP_SCREEN_ON:\n            {\n                if (context instanceof Activity) {\n                    Window window = ((Activity) context).getWindow();\n                    if (window != null) {\n                        if ((msg.obj instanceof Integer) && ((Integer) msg.obj != 0)) {\n                            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n                        } else {\n                            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n                        }\n                    }\n                }\n                break;\n            }\n            default:\n                if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {\n                    Log.e(TAG, \"error handling message, command is \" + msg.arg1);\n                }\n            }\n        }\n    }\n\n    // Handler for the messages\n    Handler commandHandler = new SDLCommandHandler();\n\n    // Send a message from the SDLMain thread\n    boolean sendCommand(int command, Object data) {\n        Message msg = commandHandler.obtainMessage();\n        msg.arg1 = command;\n        msg.obj = data;\n        boolean result = commandHandler.sendMessage(msg);\n\n        if (Build.VERSION.SDK_INT >= 19 /* Android 4.4 (KITKAT) */) {\n            if (command == COMMAND_CHANGE_WINDOW_STYLE) {\n                // Ensure we don't return until the resize has actually happened,\n                // or 500ms have passed.\n\n                boolean bShouldWait = false;\n\n                if (data instanceof Integer) {\n                    // Let's figure out if we're already laid out fullscreen or not.\n                    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();\n                    DisplayMetrics realMetrics = new DisplayMetrics();\n                    display.getRealMetrics(realMetrics);\n\n                    boolean bFullscreenLayout = ((realMetrics.widthPixels == mSurface.getWidth()) &&\n                            (realMetrics.heightPixels == mSurface.getHeight()));\n\n                    if ((Integer) data == 1) {\n                        // If we aren't laid out fullscreen or actively in fullscreen mode already, we're going\n                        // to change size and should wait for surfaceChanged() before we return, so the size\n                        // is right back in native code.  If we're already laid out fullscreen, though, we're\n                        // not going to change size even if we change decor modes, so we shouldn't wait for\n                        // surfaceChanged() -- which may not even happen -- and should return immediately.\n                        bShouldWait = !bFullscreenLayout;\n                    } else {\n                        // If we're laid out fullscreen (even if the status bar and nav bar are present),\n                        // or are actively in fullscreen, we're going to change size and should wait for\n                        // surfaceChanged before we return, so the size is right back in native code.\n                        bShouldWait = bFullscreenLayout;\n                    }\n                }\n\n                if (bShouldWait && (SDLActivity.getContext() != null)) {\n                    // We'll wait for the surfaceChanged() method, which will notify us\n                    // when called.  That way, we know our current size is really the\n                    // size we need, instead of grabbing a size that's still got\n                    // the navigation and/or status bars before they're hidden.\n                    //\n                    // We'll wait for up to half a second, because some devices\n                    // take a surprisingly long time for the surface resize, but\n                    // then we'll just give up and return.\n                    //\n                    synchronized (SDLActivity.getContext()) {\n                        try {\n                            SDLActivity.getContext().wait(500);\n                        } catch (InterruptedException ie) {\n                            ie.printStackTrace();\n                        }\n                    }\n                }\n            }\n        }\n\n        return result;\n    }\n\n    // C functions we call\n    public static native String nativeGetVersion();\n    public static native int nativeSetupJNI();\n    public static native int nativeRunMain(String library, String function, Object arguments);\n    public static native void nativeLowMemory();\n    public static native void nativeSendQuit();\n    public static native void nativeQuit();\n    public static native void nativePause();\n    public static native void nativeResume();\n    public static native void nativeFocusChanged(boolean hasFocus);\n    public static native void onNativeDropFile(String filename);\n    public static native void nativeSetScreenResolution(int surfaceWidth, int surfaceHeight, int deviceWidth, int deviceHeight, float rate);\n    public static native void onNativeResize();\n    public static native void onNativeKeyDown(int keycode);\n    public static native void onNativeKeyUp(int keycode);\n    public static native boolean onNativeSoftReturnKey();\n    public static native void onNativeKeyboardFocusLost();\n    public static native void onNativeMouse(int button, int action, float x, float y, boolean relative);\n    public static native void onNativeTouch(int touchDevId, int pointerFingerId,\n                                            int action, float x,\n                                            float y, float p);\n    public static native void onNativeAccel(float x, float y, float z);\n    public static native void onNativeClipboardChanged();\n    public static native void onNativeSurfaceCreated();\n    public static native void onNativeSurfaceChanged();\n    public static native void onNativeSurfaceDestroyed();\n    public static native String nativeGetHint(String name);\n    public static native boolean nativeGetHintBoolean(String name, boolean default_value);\n    public static native void nativeSetenv(String name, String value);\n    public static native void onNativeOrientationChanged(int orientation);\n    public static native void nativeAddTouch(int touchId, String name);\n    public static native void nativePermissionResult(int requestCode, boolean result);\n    public static native void onNativeLocaleChanged();\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean setActivityTitle(String title) {\n        // Called from SDLMain() thread and can't directly affect the view\n        return mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void setWindowStyle(boolean fullscreen) {\n        // Called from SDLMain() thread and can't directly affect the view\n        mSingleton.sendCommand(COMMAND_CHANGE_WINDOW_STYLE, fullscreen ? 1 : 0);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     * This is a static method for JNI convenience, it calls a non-static method\n     * so that is can be overridden\n     */\n    public static void setOrientation(int w, int h, boolean resizable, String hint)\n    {\n        if (mSingleton != null) {\n            mSingleton.setOrientationBis(w, h, resizable, hint);\n        }\n    }\n\n    /**\n     * This can be overridden\n     */\n    public void setOrientationBis(int w, int h, boolean resizable, String hint)\n    {\n        int orientation_landscape = -1;\n        int orientation_portrait = -1;\n\n        /* If set, hint \"explicitly controls which UI orientations are allowed\". */\n        if (hint.contains(\"LandscapeRight\") && hint.contains(\"LandscapeLeft\")) {\n            orientation_landscape = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;\n        } else if (hint.contains(\"LandscapeLeft\")) {\n            orientation_landscape = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;\n        } else if (hint.contains(\"LandscapeRight\")) {\n            orientation_landscape = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;\n        }\n\n        /* exact match to 'Portrait' to distinguish with PortraitUpsideDown */\n        boolean contains_Portrait = hint.contains(\"Portrait \") || hint.endsWith(\"Portrait\");\n\n        if (contains_Portrait && hint.contains(\"PortraitUpsideDown\")) {\n            orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;\n        } else if (contains_Portrait) {\n            orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n        } else if (hint.contains(\"PortraitUpsideDown\")) {\n            orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;\n        }\n\n        boolean is_landscape_allowed = (orientation_landscape != -1);\n        boolean is_portrait_allowed = (orientation_portrait != -1);\n        int req; /* Requested orientation */\n\n        /* No valid hint, nothing is explicitly allowed */\n        if (!is_portrait_allowed && !is_landscape_allowed) {\n            if (resizable) {\n                /* All orientations are allowed, respecting user orientation lock setting */\n                req = ActivityInfo.SCREEN_ORIENTATION_FULL_USER;\n            } else {\n                /* Fixed window and nothing specified. Get orientation from w/h of created window */\n                req = (w > h ? ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);\n            }\n        } else {\n            /* At least one orientation is allowed */\n            if (resizable) {\n                if (is_portrait_allowed && is_landscape_allowed) {\n                    /* hint allows both landscape and portrait, promote to full user */\n                    req = ActivityInfo.SCREEN_ORIENTATION_FULL_USER;\n                } else {\n                    /* Use the only one allowed \"orientation\" */\n                    req = (is_landscape_allowed ? orientation_landscape : orientation_portrait);\n                }\n            } else {\n                /* Fixed window and both orientations are allowed. Choose one. */\n                if (is_portrait_allowed && is_landscape_allowed) {\n                    req = (w > h ? orientation_landscape : orientation_portrait);\n                } else {\n                    /* Use the only one allowed \"orientation\" */\n                    req = (is_landscape_allowed ? orientation_landscape : orientation_portrait);\n                }\n            }\n        }\n\n        Log.v(TAG, \"setOrientation() requestedOrientation=\" + req + \" width=\" + w +\" height=\"+ h +\" resizable=\" + resizable + \" hint=\" + hint);\n        mSingleton.setRequestedOrientation(req);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void minimizeWindow() {\n\n        if (mSingleton == null) {\n            return;\n        }\n\n        Intent startMain = new Intent(Intent.ACTION_MAIN);\n        startMain.addCategory(Intent.CATEGORY_HOME);\n        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        mSingleton.startActivity(startMain);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean shouldMinimizeOnFocusLoss() {\n/*\n        if (Build.VERSION.SDK_INT >= 24) {\n            if (mSingleton == null) {\n                return true;\n            }\n\n            if (mSingleton.isInMultiWindowMode()) {\n                return false;\n            }\n\n            if (mSingleton.isInPictureInPictureMode()) {\n                return false;\n            }\n        }\n\n        return true;\n*/\n        return false;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean isScreenKeyboardShown()\n    {\n        if (mTextEdit == null) {\n            return false;\n        }\n\n        if (!mScreenKeyboardShown) {\n            return false;\n        }\n\n        InputMethodManager imm = (InputMethodManager) SDL.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);\n        return imm.isAcceptingText();\n\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean supportsRelativeMouse()\n    {\n        // DeX mode in Samsung Experience 9.0 and earlier doesn't support relative mice properly under\n        // Android 7 APIs, and simply returns no data under Android 8 APIs.\n        //\n        // This is fixed in Samsung Experience 9.5, which corresponds to Android 8.1.0, and\n        // thus SDK version 27.  If we are in DeX mode and not API 27 or higher, as a result,\n        // we should stick to relative mode.\n        //\n        if (Build.VERSION.SDK_INT < 27 /* Android 8.1 (O_MR1) */ && isDeXMode()) {\n            return false;\n        }\n\n        return SDLActivity.getMotionListener().supportsRelativeMouse();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean setRelativeMouseEnabled(boolean enabled)\n    {\n        if (enabled && !supportsRelativeMouse()) {\n            return false;\n        }\n\n        return SDLActivity.getMotionListener().setRelativeMouseEnabled(enabled);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean sendMessage(int command, int param) {\n        if (mSingleton == null) {\n            return false;\n        }\n        return mSingleton.sendCommand(command, param);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static Context getContext() {\n        return SDL.getContext();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean isAndroidTV() {\n        UiModeManager uiModeManager = (UiModeManager) getContext().getSystemService(UI_MODE_SERVICE);\n        if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {\n            return true;\n        }\n        if (Build.MANUFACTURER.equals(\"MINIX\") && Build.MODEL.equals(\"NEO-U1\")) {\n            return true;\n        }\n        if (Build.MANUFACTURER.equals(\"Amlogic\") && Build.MODEL.equals(\"X96-W\")) {\n            return true;\n        }\n        return Build.MANUFACTURER.equals(\"Amlogic\") && Build.MODEL.startsWith(\"TV\");\n    }\n\n    public static double getDiagonal()\n    {\n        DisplayMetrics metrics = new DisplayMetrics();\n        Activity activity = (Activity)getContext();\n        if (activity == null) {\n            return 0.0;\n        }\n        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);\n\n        double dWidthInches = metrics.widthPixels / (double)metrics.xdpi;\n        double dHeightInches = metrics.heightPixels / (double)metrics.ydpi;\n\n        return Math.sqrt((dWidthInches * dWidthInches) + (dHeightInches * dHeightInches));\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean isTablet() {\n        // If our diagonal size is seven inches or greater, we consider ourselves a tablet.\n        return (getDiagonal() >= 7.0);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean isChromebook() {\n        if (getContext() == null) {\n            return false;\n        }\n        return getContext().getPackageManager().hasSystemFeature(\"org.chromium.arc.device_management\");\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean isDeXMode() {\n        if (Build.VERSION.SDK_INT < 24 /* Android 7.0 (N) */) {\n            return false;\n        }\n        try {\n            final Configuration config = getContext().getResources().getConfiguration();\n            final Class<?> configClass = config.getClass();\n            return configClass.getField(\"SEM_DESKTOP_MODE_ENABLED\").getInt(configClass)\n                    == configClass.getField(\"semDesktopModeEnabled\").getInt(config);\n        } catch(Exception ignored) {\n            return false;\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static DisplayMetrics getDisplayDPI() {\n        return getContext().getResources().getDisplayMetrics();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean getManifestEnvironmentVariables() {\n        try {\n            if (getContext() == null) {\n                return false;\n            }\n\n            ApplicationInfo applicationInfo = getContext().getPackageManager().getApplicationInfo(getContext().getPackageName(), PackageManager.GET_META_DATA);\n            Bundle bundle = applicationInfo.metaData;\n            if (bundle == null) {\n                return false;\n            }\n            String prefix = \"SDL_ENV.\";\n            final int trimLength = prefix.length();\n            for (String key : bundle.keySet()) {\n                if (key.startsWith(prefix)) {\n                    String name = key.substring(trimLength);\n                    String value = bundle.get(key).toString();\n                    nativeSetenv(name, value);\n                }\n            }\n            /* environment variables set! */\n            return true;\n        } catch (Exception e) {\n           Log.v(TAG, \"exception \" + e.toString());\n        }\n        return false;\n    }\n\n    // This method is called by SDLControllerManager's API 26 Generic Motion Handler.\n    public static View getContentView() {\n        return mLayout;\n    }\n\n    static class ShowTextInputTask implements Runnable {\n        /*\n         * This is used to regulate the pan&scan method to have some offset from\n         * the bottom edge of the input region and the top edge of an input\n         * method (soft keyboard)\n         */\n        static final int HEIGHT_PADDING = 15;\n\n        public int x, y, w, h;\n\n        public ShowTextInputTask(int x, int y, int w, int h) {\n            this.x = x;\n            this.y = y;\n            this.w = w;\n            this.h = h;\n\n            /* Minimum size of 1 pixel, so it takes focus. */\n            if (this.w <= 0) {\n                this.w = 1;\n            }\n            if (this.h + HEIGHT_PADDING <= 0) {\n                this.h = 1 - HEIGHT_PADDING;\n            }\n        }\n\n        @Override\n        public void run() {\n            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(w, h + HEIGHT_PADDING);\n            params.leftMargin = x;\n            params.topMargin = y;\n\n            if (mTextEdit == null) {\n                mTextEdit = new DummyEdit(SDL.getContext());\n\n                mLayout.addView(mTextEdit, params);\n            } else {\n                mTextEdit.setLayoutParams(params);\n            }\n\n            mTextEdit.setVisibility(View.VISIBLE);\n            mTextEdit.requestFocus();\n\n            InputMethodManager imm = (InputMethodManager) SDL.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);\n            imm.showSoftInput(mTextEdit, 0);\n\n            mScreenKeyboardShown = true;\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean showTextInput(int x, int y, int w, int h) {\n        // Transfer the task to the main thread as a Runnable\n        return mSingleton.commandHandler.post(new ShowTextInputTask(x, y, w, h));\n    }\n\n    public static boolean isTextInputEvent(KeyEvent event) {\n\n        // Key pressed with Ctrl should be sent as SDL_KEYDOWN/SDL_KEYUP and not SDL_TEXTINPUT\n        if (event.isCtrlPressed()) {\n            return false;\n        }\n\n        return event.isPrintingKey() || event.getKeyCode() == KeyEvent.KEYCODE_SPACE;\n    }\n\n    public static boolean handleKeyEvent(View v, int keyCode, KeyEvent event, InputConnection ic) {\n        int deviceId = event.getDeviceId();\n        int source = event.getSource();\n\n        if (source == InputDevice.SOURCE_UNKNOWN) {\n            InputDevice device = InputDevice.getDevice(deviceId);\n            if (device != null) {\n                source = device.getSources();\n            }\n        }\n\n//        if (event.getAction() == KeyEvent.ACTION_DOWN) {\n//            Log.v(\"SDL\", \"key down: \" + keyCode + \", deviceId = \" + deviceId + \", source = \" + source);\n//        } else if (event.getAction() == KeyEvent.ACTION_UP) {\n//            Log.v(\"SDL\", \"key up: \" + keyCode + \", deviceId = \" + deviceId + \", source = \" + source);\n//        }\n\n        // Dispatch the different events depending on where they come from\n        // Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD\n        // So, we try to process them as JOYSTICK/DPAD/GAMEPAD events first, if that fails we try them as KEYBOARD\n        //\n        // Furthermore, it's possible a game controller has SOURCE_KEYBOARD and\n        // SOURCE_JOYSTICK, while its key events arrive from the keyboard source\n        // So, retrieve the device itself and check all of its sources\n        if (SDLControllerManager.isDeviceSDLJoystick(deviceId)) {\n            // Note that we process events with specific key codes here\n            if (event.getAction() == KeyEvent.ACTION_DOWN) {\n                if (SDLControllerManager.onNativePadDown(deviceId, keyCode) == 0) {\n                    return true;\n                }\n            } else if (event.getAction() == KeyEvent.ACTION_UP) {\n                if (SDLControllerManager.onNativePadUp(deviceId, keyCode) == 0) {\n                    return true;\n                }\n            }\n        }\n\n        if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {\n            // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses\n            // they are ignored here because sending them as mouse input to SDL is messy\n            if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) {\n                switch (event.getAction()) {\n                case KeyEvent.ACTION_DOWN:\n                case KeyEvent.ACTION_UP:\n                    // mark the event as handled or it will be handled by system\n                    // handling KEYCODE_BACK by system will call onBackPressed()\n                    return true;\n                }\n            }\n        }\n\n        if (event.getAction() == KeyEvent.ACTION_DOWN) {\n            if (isTextInputEvent(event)) {\n                if (ic != null) {\n                    ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);\n                } else {\n                    SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);\n                }\n            }\n            onNativeKeyDown(keyCode);\n            return true;\n        } else if (event.getAction() == KeyEvent.ACTION_UP) {\n            onNativeKeyUp(keyCode);\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static Surface getNativeSurface() {\n        if (SDLActivity.mSurface == null) {\n            return null;\n        }\n        return SDLActivity.mSurface.getNativeSurface();\n    }\n\n    // Input\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void initTouch() {\n        int[] ids = InputDevice.getDeviceIds();\n\n        for (int id : ids) {\n            InputDevice device = InputDevice.getDevice(id);\n            /* Allow SOURCE_TOUCHSCREEN and also Virtual InputDevices because they can send TOUCHSCREEN events */\n            if (device != null && ((device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN\n                    || device.isVirtual())) {\n\n                int touchDevId = device.getId();\n                /*\n                 * Prevent id to be -1, since it's used in SDL internal for synthetic events\n                 * Appears when using Android emulator, eg:\n                 *  adb shell input mouse tap 100 100\n                 *  adb shell input touchscreen tap 100 100\n                 */\n                if (touchDevId < 0) {\n                    touchDevId -= 1;\n                }\n                nativeAddTouch(touchDevId, device.getName());\n            }\n        }\n    }\n\n    // Messagebox\n\n    /** Result of current messagebox. Also used for blocking the calling thread. */\n    protected final int[] messageboxSelection = new int[1];\n\n    /**\n     * This method is called by SDL using JNI.\n     * Shows the messagebox from UI thread and block calling thread.\n     * buttonFlags, buttonIds and buttonTexts must have same length.\n     * @param buttonFlags array containing flags for every button.\n     * @param buttonIds array containing id for every button.\n     * @param buttonTexts array containing text for every button.\n     * @param colors null for default or array of length 5 containing colors.\n     * @return button id or -1.\n     */\n    public int messageboxShowMessageBox(\n            final int flags,\n            final String title,\n            final String message,\n            final int[] buttonFlags,\n            final int[] buttonIds,\n            final String[] buttonTexts,\n            final int[] colors) {\n\n        messageboxSelection[0] = -1;\n\n        // sanity checks\n\n        if ((buttonFlags.length != buttonIds.length) && (buttonIds.length != buttonTexts.length)) {\n            return -1; // implementation broken\n        }\n\n        // collect arguments for Dialog\n\n        final Bundle args = new Bundle();\n        args.putInt(\"flags\", flags);\n        args.putString(\"title\", title);\n        args.putString(\"message\", message);\n        args.putIntArray(\"buttonFlags\", buttonFlags);\n        args.putIntArray(\"buttonIds\", buttonIds);\n        args.putStringArray(\"buttonTexts\", buttonTexts);\n        args.putIntArray(\"colors\", colors);\n\n        // trigger Dialog creation on UI thread\n\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                messageboxCreateAndShow(args);\n            }\n        });\n\n        // block the calling thread\n\n        synchronized (messageboxSelection) {\n            try {\n                messageboxSelection.wait();\n            } catch (InterruptedException ex) {\n                ex.printStackTrace();\n                return -1;\n            }\n        }\n\n        // return selected value\n\n        return messageboxSelection[0];\n    }\n\n    protected void messageboxCreateAndShow(Bundle args) {\n\n        // TODO set values from \"flags\" to messagebox dialog\n\n        // get colors\n\n        int[] colors = args.getIntArray(\"colors\");\n        int backgroundColor;\n        int textColor;\n        int buttonBorderColor;\n        int buttonBackgroundColor;\n        int buttonSelectedColor;\n        if (colors != null) {\n            int i = -1;\n            backgroundColor = colors[++i];\n            textColor = colors[++i];\n            buttonBorderColor = colors[++i];\n            buttonBackgroundColor = colors[++i];\n            buttonSelectedColor = colors[++i];\n        } else {\n            backgroundColor = Color.TRANSPARENT;\n            textColor = Color.TRANSPARENT;\n            buttonBorderColor = Color.TRANSPARENT;\n            buttonBackgroundColor = Color.TRANSPARENT;\n            buttonSelectedColor = Color.TRANSPARENT;\n        }\n\n        // create dialog with title and a listener to wake up calling thread\n\n        final AlertDialog dialog = new AlertDialog.Builder(this).create();\n        dialog.setTitle(args.getString(\"title\"));\n        dialog.setCancelable(false);\n        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {\n            @Override\n            public void onDismiss(DialogInterface unused) {\n                synchronized (messageboxSelection) {\n                    messageboxSelection.notify();\n                }\n            }\n        });\n\n        // create text\n\n        TextView message = new TextView(this);\n        message.setGravity(Gravity.CENTER);\n        message.setText(args.getString(\"message\"));\n        if (textColor != Color.TRANSPARENT) {\n            message.setTextColor(textColor);\n        }\n\n        // create buttons\n\n        int[] buttonFlags = args.getIntArray(\"buttonFlags\");\n        int[] buttonIds = args.getIntArray(\"buttonIds\");\n        String[] buttonTexts = args.getStringArray(\"buttonTexts\");\n\n        final SparseArray<Button> mapping = new SparseArray<Button>();\n\n        LinearLayout buttons = new LinearLayout(this);\n        buttons.setOrientation(LinearLayout.HORIZONTAL);\n        buttons.setGravity(Gravity.CENTER);\n        for (int i = 0; i < buttonTexts.length; ++i) {\n            Button button = new Button(this);\n            final int id = buttonIds[i];\n            button.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    messageboxSelection[0] = id;\n                    dialog.dismiss();\n                }\n            });\n            if (buttonFlags[i] != 0) {\n                // see SDL_messagebox.h\n                if ((buttonFlags[i] & 0x00000001) != 0) {\n                    mapping.put(KeyEvent.KEYCODE_ENTER, button);\n                }\n                if ((buttonFlags[i] & 0x00000002) != 0) {\n                    mapping.put(KeyEvent.KEYCODE_ESCAPE, button); /* API 11 */\n                }\n            }\n            button.setText(buttonTexts[i]);\n            if (textColor != Color.TRANSPARENT) {\n                button.setTextColor(textColor);\n            }\n            if (buttonBorderColor != Color.TRANSPARENT) {\n                // TODO set color for border of messagebox button\n            }\n            if (buttonBackgroundColor != Color.TRANSPARENT) {\n                Drawable drawable = button.getBackground();\n                if (drawable == null) {\n                    // setting the color this way removes the style\n                    button.setBackgroundColor(buttonBackgroundColor);\n                } else {\n                    // setting the color this way keeps the style (gradient, padding, etc.)\n                    drawable.setColorFilter(buttonBackgroundColor, PorterDuff.Mode.MULTIPLY);\n                }\n            }\n            if (buttonSelectedColor != Color.TRANSPARENT) {\n                // TODO set color for selected messagebox button\n            }\n            buttons.addView(button);\n        }\n\n        // create content\n\n        LinearLayout content = new LinearLayout(this);\n        content.setOrientation(LinearLayout.VERTICAL);\n        content.addView(message);\n        content.addView(buttons);\n        if (backgroundColor != Color.TRANSPARENT) {\n            content.setBackgroundColor(backgroundColor);\n        }\n\n        // add content to dialog and return\n\n        dialog.setView(content);\n        dialog.setOnKeyListener(new Dialog.OnKeyListener() {\n            @Override\n            public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) {\n                Button button = mapping.get(keyCode);\n                if (button != null) {\n                    if (event.getAction() == KeyEvent.ACTION_UP) {\n                        button.performClick();\n                    }\n                    return true; // also for ignored actions\n                }\n                return false;\n            }\n        });\n\n        dialog.show();\n    }\n\n    private final Runnable rehideSystemUi = new Runnable() {\n        @Override\n        public void run() {\n            if (Build.VERSION.SDK_INT >= 19 /* Android 4.4 (KITKAT) */) {\n                int flags = View.SYSTEM_UI_FLAG_FULLSCREEN |\n                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |\n                        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |\n                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |\n                        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |\n                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE;\n\n                SDLActivity.this.getWindow().getDecorView().setSystemUiVisibility(flags);\n            }\n        }\n    };\n\n    public void onSystemUiVisibilityChange(int visibility) {\n        if (SDLActivity.mFullscreenModeActive && ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 || (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0)) {\n\n            Handler handler = getWindow().getDecorView().getHandler();\n            if (handler != null) {\n                handler.removeCallbacks(rehideSystemUi); // Prevent a hide loop.\n                handler.postDelayed(rehideSystemUi, 2000);\n            }\n\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean clipboardHasText() {\n        return mClipboardHandler.clipboardHasText();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static String clipboardGetText() {\n        return mClipboardHandler.clipboardGetText();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void clipboardSetText(String string) {\n        mClipboardHandler.clipboardSetText(string);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int createCustomCursor(int[] colors, int width, int height, int hotSpotX, int hotSpotY) {\n        Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);\n        ++mLastCursorID;\n\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            try {\n                mCursors.put(mLastCursorID, PointerIcon.create(bitmap, hotSpotX, hotSpotY));\n            } catch (Exception e) {\n                return 0;\n            }\n        } else {\n            return 0;\n        }\n        return mLastCursorID;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void destroyCustomCursor(int cursorID) {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            try {\n                mCursors.remove(cursorID);\n            } catch (Exception e) {\n            }\n        }\n        return;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean setCustomCursor(int cursorID) {\n\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            try {\n                mSurface.setPointerIcon(mCursors.get(cursorID));\n            } catch (Exception e) {\n                return false;\n            }\n        } else {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static boolean setSystemCursor(int cursorID) {\n        int cursor_type = 0; //PointerIcon.TYPE_NULL;\n        switch (cursorID) {\n        case SDL_SYSTEM_CURSOR_ARROW:\n            cursor_type = 1000; //PointerIcon.TYPE_ARROW;\n            break;\n        case SDL_SYSTEM_CURSOR_IBEAM:\n            cursor_type = 1008; //PointerIcon.TYPE_TEXT;\n            break;\n        case SDL_SYSTEM_CURSOR_WAIT:\n            cursor_type = 1004; //PointerIcon.TYPE_WAIT;\n            break;\n        case SDL_SYSTEM_CURSOR_CROSSHAIR:\n            cursor_type = 1007; //PointerIcon.TYPE_CROSSHAIR;\n            break;\n        case SDL_SYSTEM_CURSOR_WAITARROW:\n            cursor_type = 1004; //PointerIcon.TYPE_WAIT;\n            break;\n        case SDL_SYSTEM_CURSOR_SIZENWSE:\n            cursor_type = 1017; //PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;\n            break;\n        case SDL_SYSTEM_CURSOR_SIZENESW:\n            cursor_type = 1016; //PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;\n            break;\n        case SDL_SYSTEM_CURSOR_SIZEWE:\n            cursor_type = 1014; //PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;\n            break;\n        case SDL_SYSTEM_CURSOR_SIZENS:\n            cursor_type = 1015; //PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;\n            break;\n        case SDL_SYSTEM_CURSOR_SIZEALL:\n            cursor_type = 1020; //PointerIcon.TYPE_GRAB;\n            break;\n        case SDL_SYSTEM_CURSOR_NO:\n            cursor_type = 1012; //PointerIcon.TYPE_NO_DROP;\n            break;\n        case SDL_SYSTEM_CURSOR_HAND:\n            cursor_type = 1002; //PointerIcon.TYPE_HAND;\n            break;\n        }\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            try {\n                mSurface.setPointerIcon(PointerIcon.getSystemIcon(SDL.getContext(), cursor_type));\n            } catch (Exception e) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void requestPermission(String permission, int requestCode) {\n        if (Build.VERSION.SDK_INT < 23 /* Android 6.0 (M) */) {\n            nativePermissionResult(requestCode, true);\n            return;\n        }\n\n        Activity activity = (Activity)getContext();\n        if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {\n            activity.requestPermissions(new String[]{permission}, requestCode);\n        } else {\n            nativePermissionResult(requestCode, true);\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        boolean result = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED);\n        nativePermissionResult(requestCode, result);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int openURL(String url)\n    {\n        try {\n            Intent i = new Intent(Intent.ACTION_VIEW);\n            i.setData(Uri.parse(url));\n\n            int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;\n            if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {\n                flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;\n            } else {\n                flags |= Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;\n            }\n            i.addFlags(flags);\n\n            mSingleton.startActivity(i);\n        } catch (Exception ex) {\n            return -1;\n        }\n        return 0;\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int showToast(String message, int duration, int gravity, int xOffset, int yOffset)\n    {\n        if(null == mSingleton) {\n            return - 1;\n        }\n\n        try\n        {\n            class OneShotTask implements Runnable {\n                String mMessage;\n                int mDuration;\n                int mGravity;\n                int mXOffset;\n                int mYOffset;\n\n                OneShotTask(String message, int duration, int gravity, int xOffset, int yOffset) {\n                    mMessage  = message;\n                    mDuration = duration;\n                    mGravity  = gravity;\n                    mXOffset  = xOffset;\n                    mYOffset  = yOffset;\n                }\n\n                public void run() {\n                    try\n                    {\n                        Toast toast = Toast.makeText(mSingleton, mMessage, mDuration);\n                        if (mGravity >= 0) {\n                            toast.setGravity(mGravity, mXOffset, mYOffset);\n                        }\n                        toast.show();\n                    } catch(Exception ex) {\n                        Log.e(TAG, ex.getMessage());\n                    }\n                }\n            }\n            mSingleton.runOnUiThread(new OneShotTask(message, duration, gravity, xOffset, yOffset));\n        } catch(Exception ex) {\n            return -1;\n        }\n        return 0;\n    }\n}\n\n/**\n    Simple runnable to start the SDL application\n*/\nclass SDLMain implements Runnable {\n    @Override\n    public void run() {\n        // Runs SDL_main()\n        String library = SDLActivity.mSingleton.getMainSharedObject();\n        String function = SDLActivity.mSingleton.getMainFunction();\n        String[] arguments = SDLActivity.mSingleton.getArguments();\n\n        try {\n            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DISPLAY);\n        } catch (Exception e) {\n            Log.v(\"SDL\", \"modify thread properties failed \" + e.toString());\n        }\n\n        Log.v(\"SDL\", \"Running main function \" + function + \" from library \" + library);\n\n        SDLActivity.nativeRunMain(library, function, arguments);\n\n        Log.v(\"SDL\", \"Finished main function\");\n\n        if (SDLActivity.mSingleton != null && !SDLActivity.mSingleton.isFinishing()) {\n            // Let's finish the Activity\n            SDLActivity.mSDLThread = null;\n            SDLActivity.mSingleton.finish();\n        }  // else: Activity is already being destroyed\n\n    }\n}\n\n/* This is a fake invisible editor view that receives the input and defines the\n * pan&scan region\n */\nclass DummyEdit extends View implements View.OnKeyListener {\n    InputConnection ic;\n\n    public DummyEdit(Context context) {\n        super(context);\n        setFocusableInTouchMode(true);\n        setFocusable(true);\n        setOnKeyListener(this);\n    }\n\n    @Override\n    public boolean onCheckIsTextEditor() {\n        return true;\n    }\n\n    @Override\n    public boolean onKey(View v, int keyCode, KeyEvent event) {\n        return SDLActivity.handleKeyEvent(v, keyCode, event, ic);\n    }\n\n    //\n    @Override\n    public boolean onKeyPreIme (int keyCode, KeyEvent event) {\n        // As seen on StackOverflow: http://stackoverflow.com/questions/7634346/keyboard-hide-event\n        // FIXME: Discussion at http://bugzilla.libsdl.org/show_bug.cgi?id=1639\n        // FIXME: This is not a 100% effective solution to the problem of detecting if the keyboard is showing or not\n        // FIXME: A more effective solution would be to assume our Layout to be RelativeLayout or LinearLayout\n        // FIXME: And determine the keyboard presence doing this: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android\n        // FIXME: An even more effective way would be if Android provided this out of the box, but where would the fun be in that :)\n        if (event.getAction()==KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {\n            if (SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == View.VISIBLE) {\n                SDLActivity.onNativeKeyboardFocusLost();\n            }\n        }\n        return super.onKeyPreIme(keyCode, event);\n    }\n\n    @Override\n    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {\n        ic = new SDLInputConnection(this, true);\n\n        outAttrs.inputType = InputType.TYPE_CLASS_TEXT |\n                             InputType.TYPE_TEXT_FLAG_MULTI_LINE;\n        outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI |\n                              EditorInfo.IME_FLAG_NO_FULLSCREEN /* API 11 */;\n\n        return ic;\n    }\n}\n\nclass SDLInputConnection extends BaseInputConnection {\n\n    protected EditText mEditText;\n    protected String mCommittedText = \"\";\n\n    public SDLInputConnection(View targetView, boolean fullEditor) {\n        super(targetView, fullEditor);\n        mEditText = new EditText(SDL.getContext());\n    }\n\n    @Override\n    public Editable getEditable() {\n        return mEditText.getEditableText();\n    }\n\n    @Override\n    public boolean sendKeyEvent(KeyEvent event) {\n        /*\n         * This used to handle the keycodes from soft keyboard (and IME-translated input from hardkeyboard)\n         * However, as of Ice Cream Sandwich and later, almost all soft keyboard doesn't generate key presses\n         * and so we need to generate them ourselves in commitText.  To avoid duplicates on the handful of keys\n         * that still do, we empty this out.\n         */\n\n        /*\n         * Return DOES still generate a key event, however.  So rather than using it as the 'click a button' key\n         * as we do with physical keyboards, let's just use it to hide the keyboard.\n         */\n\n        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {\n            if (SDLActivity.onNativeSoftReturnKey()) {\n                return true;\n            }\n        }\n\n        return super.sendKeyEvent(event);\n    }\n\n    @Override\n    public boolean commitText(CharSequence text, int newCursorPosition) {\n        if (!super.commitText(text, newCursorPosition)) {\n            return false;\n        }\n        updateText();\n        return true;\n    }\n\n    @Override\n    public boolean setComposingText(CharSequence text, int newCursorPosition) {\n        if (!super.setComposingText(text, newCursorPosition)) {\n            return false;\n        }\n        updateText();\n        return true;\n    }\n\n    @Override\n    public boolean deleteSurroundingText(int beforeLength, int afterLength) {\n        // Workaround to capture backspace key. Ref: http://stackoverflow.com/questions>/14560344/android-backspace-in-webview-baseinputconnection\n        // and https://bugzilla.libsdl.org/show_bug.cgi?id=2265\n        if (beforeLength > 0 && afterLength == 0) {\n            // backspace(s)\n            while (beforeLength-- > 0) {\n                nativeGenerateScancodeForUnichar('\\b');\n            }\n            return true;\n        }\n\n        if (!super.deleteSurroundingText(beforeLength, afterLength)) {\n            return false;\n        }\n        updateText();\n        return true;\n    }\n\n    protected void updateText() {\n        final Editable content = getEditable();\n        if (content == null) {\n            return;\n        }\n\n        String text = content.toString();\n        int compareLength = Math.min(text.length(), mCommittedText.length());\n        int matchLength, offset;\n\n        /* Backspace over characters that are no longer in the string */\n        for (matchLength = 0; matchLength < compareLength; ) {\n            int codePoint = mCommittedText.codePointAt(matchLength);\n            if (codePoint != text.codePointAt(matchLength)) {\n                break;\n            }\n            matchLength += Character.charCount(codePoint);\n        }\n        /* FIXME: This doesn't handle graphemes, like '🌬️' */\n        for (offset = matchLength; offset < mCommittedText.length(); ) {\n            int codePoint = mCommittedText.codePointAt(offset);\n            nativeGenerateScancodeForUnichar('\\b');\n            offset += Character.charCount(codePoint);\n        }\n\n        if (matchLength < text.length()) {\n            String pendingText = text.subSequence(matchLength, text.length()).toString();\n            for (offset = 0; offset < pendingText.length(); ) {\n                int codePoint = pendingText.codePointAt(offset);\n                if (codePoint == '\\n') {\n                    if (SDLActivity.onNativeSoftReturnKey()) {\n                        return;\n                    }\n                }\n                /* Higher code points don't generate simulated scancodes */\n                if (codePoint < 128) {\n                    nativeGenerateScancodeForUnichar((char)codePoint);\n                }\n                offset += Character.charCount(codePoint);\n            }\n            SDLInputConnection.nativeCommitText(pendingText, 0);\n        }\n        mCommittedText = text;\n    }\n\n    public static native void nativeCommitText(String text, int newCursorPosition);\n\n    public static native void nativeGenerateScancodeForUnichar(char c);\n}\n\nclass SDLClipboardHandler implements\n    ClipboardManager.OnPrimaryClipChangedListener {\n\n    protected ClipboardManager mClipMgr;\n\n    SDLClipboardHandler() {\n       mClipMgr = (ClipboardManager) SDL.getContext().getSystemService(Context.CLIPBOARD_SERVICE);\n       mClipMgr.addPrimaryClipChangedListener(this);\n    }\n\n    public boolean clipboardHasText() {\n       return mClipMgr.hasPrimaryClip();\n    }\n\n    public String clipboardGetText() {\n        ClipData clip = mClipMgr.getPrimaryClip();\n        if (clip != null) {\n            ClipData.Item item = clip.getItemAt(0);\n            if (item != null) {\n                CharSequence text = item.getText();\n                if (text != null) {\n                    return text.toString();\n                }\n            }\n        }\n        return null;\n    }\n\n    public void clipboardSetText(String string) {\n       mClipMgr.removePrimaryClipChangedListener(this);\n       ClipData clip = ClipData.newPlainText(null, string);\n       mClipMgr.setPrimaryClip(clip);\n       mClipMgr.addPrimaryClipChangedListener(this);\n    }\n\n    @Override\n    public void onPrimaryClipChanged() {\n        SDLActivity.onNativeClipboardChanged();\n    }\n}\n\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/SDLAudioManager.java",
    "content": "package org.libsdl.app;\n\nimport android.content.Context;\nimport android.media.AudioDeviceCallback;\nimport android.media.AudioDeviceInfo;\nimport android.media.AudioFormat;\nimport android.media.AudioManager;\nimport android.media.AudioRecord;\nimport android.media.AudioTrack;\nimport android.media.MediaRecorder;\nimport android.os.Build;\nimport android.util.Log;\n\nimport java.util.Arrays;\n\npublic class SDLAudioManager {\n    protected static final String TAG = \"SDLAudio\";\n\n    protected static AudioTrack mAudioTrack;\n    protected static AudioRecord mAudioRecord;\n    protected static Context mContext;\n\n    private static final int[] NO_DEVICES = {};\n\n    private static AudioDeviceCallback mAudioDeviceCallback;\n\n    public static void initialize() {\n        mAudioTrack = null;\n        mAudioRecord = null;\n        mAudioDeviceCallback = null;\n\n        if(Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */)\n        {\n            mAudioDeviceCallback = new AudioDeviceCallback() {\n                @Override\n                public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {\n                    Arrays.stream(addedDevices).forEach(deviceInfo -> addAudioDevice(deviceInfo.isSink(), deviceInfo.getId()));\n                }\n\n                @Override\n                public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {\n                    Arrays.stream(removedDevices).forEach(deviceInfo -> removeAudioDevice(deviceInfo.isSink(), deviceInfo.getId()));\n                }\n            };\n        }\n    }\n\n    public static void setContext(Context context) {\n        mContext = context;\n        if (context != null) {\n            registerAudioDeviceCallback();\n        }\n    }\n\n    public static void release(Context context) {\n        unregisterAudioDeviceCallback(context);\n    }\n\n    // Audio\n\n    protected static String getAudioFormatString(int audioFormat) {\n        switch (audioFormat) {\n            case AudioFormat.ENCODING_PCM_8BIT:\n                return \"8-bit\";\n            case AudioFormat.ENCODING_PCM_16BIT:\n                return \"16-bit\";\n            case AudioFormat.ENCODING_PCM_FLOAT:\n                return \"float\";\n            default:\n                return Integer.toString(audioFormat);\n        }\n    }\n\n    protected static int[] open(boolean isCapture, int sampleRate, int audioFormat, int desiredChannels, int desiredFrames, int deviceId) {\n        int channelConfig;\n        int sampleSize;\n        int frameSize;\n\n        Log.v(TAG, \"Opening \" + (isCapture ? \"capture\" : \"playback\") + \", requested \" + desiredFrames + \" frames of \" + desiredChannels + \" channel \" + getAudioFormatString(audioFormat) + \" audio at \" + sampleRate + \" Hz\");\n\n        /* On older devices let's use known good settings */\n        if (Build.VERSION.SDK_INT < 21 /* Android 5.0 (LOLLIPOP) */) {\n            if (desiredChannels > 2) {\n                desiredChannels = 2;\n            }\n        }\n\n        /* AudioTrack has sample rate limitation of 48000 (fixed in 5.0.2) */\n        if (Build.VERSION.SDK_INT < 22 /* Android 5.1 (LOLLIPOP_MR1) */) {\n            if (sampleRate < 8000) {\n                sampleRate = 8000;\n            } else if (sampleRate > 48000) {\n                sampleRate = 48000;\n            }\n        }\n\n        if (audioFormat == AudioFormat.ENCODING_PCM_FLOAT) {\n            int minSDKVersion = (isCapture ? 23 /* Android 6.0 (M) */ : 21 /* Android 5.0 (LOLLIPOP) */);\n            if (Build.VERSION.SDK_INT < minSDKVersion) {\n                audioFormat = AudioFormat.ENCODING_PCM_16BIT;\n            }\n        }\n        switch (audioFormat)\n        {\n        case AudioFormat.ENCODING_PCM_8BIT:\n            sampleSize = 1;\n            break;\n        case AudioFormat.ENCODING_PCM_16BIT:\n            sampleSize = 2;\n            break;\n        case AudioFormat.ENCODING_PCM_FLOAT:\n            sampleSize = 4;\n            break;\n        default:\n            Log.v(TAG, \"Requested format \" + audioFormat + \", getting ENCODING_PCM_16BIT\");\n            audioFormat = AudioFormat.ENCODING_PCM_16BIT;\n            sampleSize = 2;\n            break;\n        }\n\n        if (isCapture) {\n            switch (desiredChannels) {\n            case 1:\n                channelConfig = AudioFormat.CHANNEL_IN_MONO;\n                break;\n            case 2:\n                channelConfig = AudioFormat.CHANNEL_IN_STEREO;\n                break;\n            default:\n                Log.v(TAG, \"Requested \" + desiredChannels + \" channels, getting stereo\");\n                desiredChannels = 2;\n                channelConfig = AudioFormat.CHANNEL_IN_STEREO;\n                break;\n            }\n        } else {\n            switch (desiredChannels) {\n            case 1:\n                channelConfig = AudioFormat.CHANNEL_OUT_MONO;\n                break;\n            case 2:\n                channelConfig = AudioFormat.CHANNEL_OUT_STEREO;\n                break;\n            case 3:\n                channelConfig = AudioFormat.CHANNEL_OUT_STEREO | AudioFormat.CHANNEL_OUT_FRONT_CENTER;\n                break;\n            case 4:\n                channelConfig = AudioFormat.CHANNEL_OUT_QUAD;\n                break;\n            case 5:\n                channelConfig = AudioFormat.CHANNEL_OUT_QUAD | AudioFormat.CHANNEL_OUT_FRONT_CENTER;\n                break;\n            case 6:\n                channelConfig = AudioFormat.CHANNEL_OUT_5POINT1;\n                break;\n            case 7:\n                channelConfig = AudioFormat.CHANNEL_OUT_5POINT1 | AudioFormat.CHANNEL_OUT_BACK_CENTER;\n                break;\n            case 8:\n                if (Build.VERSION.SDK_INT >= 23 /* Android 6.0 (M) */) {\n                    channelConfig = AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;\n                } else {\n                    Log.v(TAG, \"Requested \" + desiredChannels + \" channels, getting 5.1 surround\");\n                    desiredChannels = 6;\n                    channelConfig = AudioFormat.CHANNEL_OUT_5POINT1;\n                }\n                break;\n            default:\n                Log.v(TAG, \"Requested \" + desiredChannels + \" channels, getting stereo\");\n                desiredChannels = 2;\n                channelConfig = AudioFormat.CHANNEL_OUT_STEREO;\n                break;\n            }\n\n/*\n            Log.v(TAG, \"Speaker configuration (and order of channels):\");\n\n            if ((channelConfig & 0x00000004) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_FRONT_LEFT\");\n            }\n            if ((channelConfig & 0x00000008) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_FRONT_RIGHT\");\n            }\n            if ((channelConfig & 0x00000010) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_FRONT_CENTER\");\n            }\n            if ((channelConfig & 0x00000020) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_LOW_FREQUENCY\");\n            }\n            if ((channelConfig & 0x00000040) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_BACK_LEFT\");\n            }\n            if ((channelConfig & 0x00000080) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_BACK_RIGHT\");\n            }\n            if ((channelConfig & 0x00000100) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_FRONT_LEFT_OF_CENTER\");\n            }\n            if ((channelConfig & 0x00000200) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_FRONT_RIGHT_OF_CENTER\");\n            }\n            if ((channelConfig & 0x00000400) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_BACK_CENTER\");\n            }\n            if ((channelConfig & 0x00000800) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_SIDE_LEFT\");\n            }\n            if ((channelConfig & 0x00001000) != 0) {\n                Log.v(TAG, \"   CHANNEL_OUT_SIDE_RIGHT\");\n            }\n*/\n        }\n        frameSize = (sampleSize * desiredChannels);\n\n        // Let the user pick a larger buffer if they really want -- but ye\n        // gods they probably shouldn't, the minimums are horrifyingly high\n        // latency already\n        int minBufferSize;\n        if (isCapture) {\n            minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);\n        } else {\n            minBufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat);\n        }\n        desiredFrames = Math.max(desiredFrames, (minBufferSize + frameSize - 1) / frameSize);\n\n        int[] results = new int[4];\n\n        if (isCapture) {\n            if (mAudioRecord == null) {\n                mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRate,\n                        channelConfig, audioFormat, desiredFrames * frameSize);\n\n                // see notes about AudioTrack state in audioOpen(), above. Probably also applies here.\n                if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {\n                    Log.e(TAG, \"Failed during initialization of AudioRecord\");\n                    mAudioRecord.release();\n                    mAudioRecord = null;\n                    return null;\n                }\n\n                if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */ && deviceId != 0) {\n                    mAudioRecord.setPreferredDevice(getOutputAudioDeviceInfo(deviceId));\n                }\n\n                mAudioRecord.startRecording();\n            }\n\n            results[0] = mAudioRecord.getSampleRate();\n            results[1] = mAudioRecord.getAudioFormat();\n            results[2] = mAudioRecord.getChannelCount();\n\n        } else {\n            if (mAudioTrack == null) {\n                mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);\n\n                // Instantiating AudioTrack can \"succeed\" without an exception and the track may still be invalid\n                // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java\n                // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState()\n                if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) {\n                    /* Try again, with safer values */\n\n                    Log.e(TAG, \"Failed during initialization of Audio Track\");\n                    mAudioTrack.release();\n                    mAudioTrack = null;\n                    return null;\n                }\n\n                if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */ && deviceId != 0) {\n                    mAudioTrack.setPreferredDevice(getInputAudioDeviceInfo(deviceId));\n                }\n\n                mAudioTrack.play();\n            }\n\n            results[0] = mAudioTrack.getSampleRate();\n            results[1] = mAudioTrack.getAudioFormat();\n            results[2] = mAudioTrack.getChannelCount();\n        }\n        results[3] = desiredFrames;\n\n        Log.v(TAG, \"Opening \" + (isCapture ? \"capture\" : \"playback\") + \", got \" + results[3] + \" frames of \" + results[2] + \" channel \" + getAudioFormatString(results[1]) + \" audio at \" + results[0] + \" Hz\");\n\n        return results;\n    }\n\n    private static AudioDeviceInfo getInputAudioDeviceInfo(int deviceId) {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);\n            return Arrays.stream(audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS))\n                    .filter(deviceInfo -> deviceInfo.getId() == deviceId)\n                    .findFirst()\n                    .orElse(null);\n        } else {\n            return null;\n        }\n    }\n\n    private static AudioDeviceInfo getOutputAudioDeviceInfo(int deviceId) {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);\n            return Arrays.stream(audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS))\n                    .filter(deviceInfo -> deviceInfo.getId() == deviceId)\n                    .findFirst()\n                    .orElse(null);\n        } else {\n            return null;\n        }\n    }\n\n    private static void registerAudioDeviceCallback() {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);\n            audioManager.registerAudioDeviceCallback(mAudioDeviceCallback, null);\n        }\n    }\n\n    private static void unregisterAudioDeviceCallback(Context context) {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);\n            audioManager.unregisterAudioDeviceCallback(mAudioDeviceCallback);\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int[] getAudioOutputDevices() {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);\n            return Arrays.stream(audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)).mapToInt(AudioDeviceInfo::getId).toArray();\n        } else {\n            return NO_DEVICES;\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int[] getAudioInputDevices() {\n        if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n            AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);\n            return Arrays.stream(audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)).mapToInt(AudioDeviceInfo::getId).toArray();\n        } else {\n            return NO_DEVICES;\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int[] audioOpen(int sampleRate, int audioFormat, int desiredChannels, int desiredFrames, int deviceId) {\n        return open(false, sampleRate, audioFormat, desiredChannels, desiredFrames, deviceId);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void audioWriteFloatBuffer(float[] buffer) {\n        if (mAudioTrack == null) {\n            Log.e(TAG, \"Attempted to make audio call with uninitialized audio!\");\n            return;\n        }\n\n        if (android.os.Build.VERSION.SDK_INT < 21 /* Android 5.0 (LOLLIPOP) */) {\n            Log.e(TAG, \"Attempted to make an incompatible audio call with uninitialized audio! (floating-point output is supported since Android 5.0 Lollipop)\");\n            return;\n        }\n\n        for (int i = 0; i < buffer.length;) {\n            int result = mAudioTrack.write(buffer, i, buffer.length - i, AudioTrack.WRITE_BLOCKING);\n            if (result > 0) {\n                i += result;\n            } else if (result == 0) {\n                try {\n                    Thread.sleep(1);\n                } catch(InterruptedException e) {\n                    // Nom nom\n                }\n            } else {\n                Log.w(TAG, \"SDL audio: error return from write(float)\");\n                return;\n            }\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void audioWriteShortBuffer(short[] buffer) {\n        if (mAudioTrack == null) {\n            Log.e(TAG, \"Attempted to make audio call with uninitialized audio!\");\n            return;\n        }\n\n        for (int i = 0; i < buffer.length;) {\n            int result = mAudioTrack.write(buffer, i, buffer.length - i);\n            if (result > 0) {\n                i += result;\n            } else if (result == 0) {\n                try {\n                    Thread.sleep(1);\n                } catch(InterruptedException e) {\n                    // Nom nom\n                }\n            } else {\n                Log.w(TAG, \"SDL audio: error return from write(short)\");\n                return;\n            }\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void audioWriteByteBuffer(byte[] buffer) {\n        if (mAudioTrack == null) {\n            Log.e(TAG, \"Attempted to make audio call with uninitialized audio!\");\n            return;\n        }\n\n        for (int i = 0; i < buffer.length; ) {\n            int result = mAudioTrack.write(buffer, i, buffer.length - i);\n            if (result > 0) {\n                i += result;\n            } else if (result == 0) {\n                try {\n                    Thread.sleep(1);\n                } catch(InterruptedException e) {\n                    // Nom nom\n                }\n            } else {\n                Log.w(TAG, \"SDL audio: error return from write(byte)\");\n                return;\n            }\n        }\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static int[] captureOpen(int sampleRate, int audioFormat, int desiredChannels, int desiredFrames, int deviceId) {\n        return open(true, sampleRate, audioFormat, desiredChannels, desiredFrames, deviceId);\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static int captureReadFloatBuffer(float[] buffer, boolean blocking) {\n        if (Build.VERSION.SDK_INT < 23 /* Android 6.0 (M) */) {\n            return 0;\n        } else {\n            return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);\n        }\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static int captureReadShortBuffer(short[] buffer, boolean blocking) {\n        if (Build.VERSION.SDK_INT < 23 /* Android 6.0 (M) */) {\n            return mAudioRecord.read(buffer, 0, buffer.length);\n        } else {\n            return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);\n        }\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static int captureReadByteBuffer(byte[] buffer, boolean blocking) {\n        if (Build.VERSION.SDK_INT < 23 /* Android 6.0 (M) */) {\n            return mAudioRecord.read(buffer, 0, buffer.length);\n        } else {\n            return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);\n        }\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static void audioClose() {\n        if (mAudioTrack != null) {\n            mAudioTrack.stop();\n            mAudioTrack.release();\n            mAudioTrack = null;\n        }\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static void captureClose() {\n        if (mAudioRecord != null) {\n            mAudioRecord.stop();\n            mAudioRecord.release();\n            mAudioRecord = null;\n        }\n    }\n\n    /** This method is called by SDL using JNI. */\n    public static void audioSetThreadPriority(boolean iscapture, int device_id) {\n        try {\n\n            /* Set thread name */\n            if (iscapture) {\n                Thread.currentThread().setName(\"SDLAudioC\" + device_id);\n            } else {\n                Thread.currentThread().setName(\"SDLAudioP\" + device_id);\n            }\n\n            /* Set thread priority */\n            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);\n\n        } catch (Exception e) {\n            Log.v(TAG, \"modify thread properties failed \" + e.toString());\n        }\n    }\n\n    public static native int nativeSetupJNI();\n\n    public static native void removeAudioDevice(boolean isCapture, int deviceId);\n\n    public static native void addAudioDevice(boolean isCapture, int deviceId);\n\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/SDLControllerManager.java",
    "content": "package org.libsdl.app;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\nimport android.content.Context;\nimport android.os.Build;\nimport android.os.VibrationEffect;\nimport android.os.Vibrator;\nimport android.util.Log;\nimport android.view.InputDevice;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\nimport android.view.View;\n\n\npublic class SDLControllerManager\n{\n\n    public static native int nativeSetupJNI();\n\n    public static native int nativeAddJoystick(int device_id, String name, String desc,\n                                               int vendor_id, int product_id,\n                                               boolean is_accelerometer, int button_mask,\n                                               int naxes, int axis_mask, int nhats, int nballs);\n    public static native int nativeRemoveJoystick(int device_id);\n    public static native int nativeAddHaptic(int device_id, String name);\n    public static native int nativeRemoveHaptic(int device_id);\n    public static native int onNativePadDown(int device_id, int keycode);\n    public static native int onNativePadUp(int device_id, int keycode);\n    public static native void onNativeJoy(int device_id, int axis,\n                                          float value);\n    public static native void onNativeHat(int device_id, int hat_id,\n                                          int x, int y);\n\n    protected static SDLJoystickHandler mJoystickHandler;\n    protected static SDLHapticHandler mHapticHandler;\n\n    private static final String TAG = \"SDLControllerManager\";\n\n    public static void initialize() {\n        if (mJoystickHandler == null) {\n            if (Build.VERSION.SDK_INT >= 19 /* Android 4.4 (KITKAT) */) {\n                mJoystickHandler = new SDLJoystickHandler_API19();\n            } else {\n                mJoystickHandler = new SDLJoystickHandler_API16();\n            }\n        }\n\n        if (mHapticHandler == null) {\n            if (Build.VERSION.SDK_INT >= 26 /* Android 8.0 (O) */) {\n                mHapticHandler = new SDLHapticHandler_API26();\n            } else {\n                mHapticHandler = new SDLHapticHandler();\n            }\n        }\n    }\n\n    // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance\n    public static boolean handleJoystickMotionEvent(MotionEvent event) {\n        return mJoystickHandler.handleMotionEvent(event);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void pollInputDevices() {\n        mJoystickHandler.pollInputDevices();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void pollHapticDevices() {\n        mHapticHandler.pollHapticDevices();\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void hapticRun(int device_id, float intensity, int length) {\n        mHapticHandler.run(device_id, intensity, length);\n    }\n\n    /**\n     * This method is called by SDL using JNI.\n     */\n    public static void hapticStop(int device_id)\n    {\n        mHapticHandler.stop(device_id);\n    }\n\n    // Check if a given device is considered a possible SDL joystick\n    public static boolean isDeviceSDLJoystick(int deviceId) {\n        InputDevice device = InputDevice.getDevice(deviceId);\n        // We cannot use InputDevice.isVirtual before API 16, so let's accept\n        // only nonnegative device ids (VIRTUAL_KEYBOARD equals -1)\n        if ((device == null) || (deviceId < 0)) {\n            return false;\n        }\n        int sources = device.getSources();\n\n        /* This is called for every button press, so let's not spam the logs */\n        /*\n        if ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {\n            Log.v(TAG, \"Input device \" + device.getName() + \" has class joystick.\");\n        }\n        if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) {\n            Log.v(TAG, \"Input device \" + device.getName() + \" is a dpad.\");\n        }\n        if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) {\n            Log.v(TAG, \"Input device \" + device.getName() + \" is a gamepad.\");\n        }\n        */\n\n        return ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 ||\n                ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) ||\n                ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD)\n        );\n    }\n\n}\n\nclass SDLJoystickHandler {\n\n    /**\n     * Handles given MotionEvent.\n     * @param event the event to be handled.\n     * @return if given event was processed.\n     */\n    public boolean handleMotionEvent(MotionEvent event) {\n        return false;\n    }\n\n    /**\n     * Handles adding and removing of input devices.\n     */\n    public void pollInputDevices() {\n    }\n}\n\n/* Actual joystick functionality available for API >= 12 devices */\nclass SDLJoystickHandler_API16 extends SDLJoystickHandler {\n\n    static class SDLJoystick {\n        public int device_id;\n        public String name;\n        public String desc;\n        public ArrayList<InputDevice.MotionRange> axes;\n        public ArrayList<InputDevice.MotionRange> hats;\n    }\n    static class RangeComparator implements Comparator<InputDevice.MotionRange> {\n        @Override\n        public int compare(InputDevice.MotionRange arg0, InputDevice.MotionRange arg1) {\n            // Some controllers, like the Moga Pro 2, return AXIS_GAS (22) for right trigger and AXIS_BRAKE (23) for left trigger - swap them so they're sorted in the right order for SDL\n            int arg0Axis = arg0.getAxis();\n            int arg1Axis = arg1.getAxis();\n            if (arg0Axis == MotionEvent.AXIS_GAS) {\n                arg0Axis = MotionEvent.AXIS_BRAKE;\n            } else if (arg0Axis == MotionEvent.AXIS_BRAKE) {\n                arg0Axis = MotionEvent.AXIS_GAS;\n            }\n            if (arg1Axis == MotionEvent.AXIS_GAS) {\n                arg1Axis = MotionEvent.AXIS_BRAKE;\n            } else if (arg1Axis == MotionEvent.AXIS_BRAKE) {\n                arg1Axis = MotionEvent.AXIS_GAS;\n            }\n\n            // Make sure the AXIS_Z is sorted between AXIS_RY and AXIS_RZ.\n            // This is because the usual pairing are:\n            // - AXIS_X + AXIS_Y (left stick).\n            // - AXIS_RX, AXIS_RY (sometimes the right stick, sometimes triggers).\n            // - AXIS_Z, AXIS_RZ (sometimes the right stick, sometimes triggers).\n            // This sorts the axes in the above order, which tends to be correct\n            // for Xbox-ish game pads that have the right stick on RX/RY and the\n            // triggers on Z/RZ.\n            //\n            // Gamepads that don't have AXIS_Z/AXIS_RZ but use\n            // AXIS_LTRIGGER/AXIS_RTRIGGER are unaffected by this.\n            //\n            // References:\n            // - https://developer.android.com/develop/ui/views/touch-and-input/game-controllers/controller-input\n            // - https://www.kernel.org/doc/html/latest/input/gamepad.html\n            if (arg0Axis == MotionEvent.AXIS_Z) {\n                arg0Axis = MotionEvent.AXIS_RZ - 1;\n            } else if (arg0Axis > MotionEvent.AXIS_Z && arg0Axis < MotionEvent.AXIS_RZ) {\n                --arg0Axis;\n            }\n            if (arg1Axis == MotionEvent.AXIS_Z) {\n                arg1Axis = MotionEvent.AXIS_RZ - 1;\n            } else if (arg1Axis > MotionEvent.AXIS_Z && arg1Axis < MotionEvent.AXIS_RZ) {\n                --arg1Axis;\n            }\n\n            return arg0Axis - arg1Axis;\n        }\n    }\n\n    private final ArrayList<SDLJoystick> mJoysticks;\n\n    public SDLJoystickHandler_API16() {\n\n        mJoysticks = new ArrayList<SDLJoystick>();\n    }\n\n    @Override\n    public void pollInputDevices() {\n        int[] deviceIds = InputDevice.getDeviceIds();\n\n        for (int device_id : deviceIds) {\n            if (SDLControllerManager.isDeviceSDLJoystick(device_id)) {\n                SDLJoystick joystick = getJoystick(device_id);\n                if (joystick == null) {\n                    InputDevice joystickDevice = InputDevice.getDevice(device_id);\n                    joystick = new SDLJoystick();\n                    joystick.device_id = device_id;\n                    joystick.name = joystickDevice.getName();\n                    joystick.desc = getJoystickDescriptor(joystickDevice);\n                    joystick.axes = new ArrayList<InputDevice.MotionRange>();\n                    joystick.hats = new ArrayList<InputDevice.MotionRange>();\n\n                    List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();\n                    Collections.sort(ranges, new RangeComparator());\n                    for (InputDevice.MotionRange range : ranges) {\n                        if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {\n                            if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {\n                                joystick.hats.add(range);\n                            } else {\n                                joystick.axes.add(range);\n                            }\n                        }\n                    }\n\n                    mJoysticks.add(joystick);\n                    SDLControllerManager.nativeAddJoystick(joystick.device_id, joystick.name, joystick.desc,\n                            getVendorId(joystickDevice), getProductId(joystickDevice), false,\n                            getButtonMask(joystickDevice), joystick.axes.size(), getAxisMask(joystick.axes), joystick.hats.size()/2, 0);\n                }\n            }\n        }\n\n        /* Check removed devices */\n        ArrayList<Integer> removedDevices = null;\n        for (SDLJoystick joystick : mJoysticks) {\n            int device_id = joystick.device_id;\n            int i;\n            for (i = 0; i < deviceIds.length; i++) {\n                if (device_id == deviceIds[i]) break;\n            }\n            if (i == deviceIds.length) {\n                if (removedDevices == null) {\n                    removedDevices = new ArrayList<Integer>();\n                }\n                removedDevices.add(device_id);\n            }\n        }\n\n        if (removedDevices != null) {\n            for (int device_id : removedDevices) {\n                SDLControllerManager.nativeRemoveJoystick(device_id);\n                for (int i = 0; i < mJoysticks.size(); i++) {\n                    if (mJoysticks.get(i).device_id == device_id) {\n                        mJoysticks.remove(i);\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    protected SDLJoystick getJoystick(int device_id) {\n        for (SDLJoystick joystick : mJoysticks) {\n            if (joystick.device_id == device_id) {\n                return joystick;\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public boolean handleMotionEvent(MotionEvent event) {\n        int actionPointerIndex = event.getActionIndex();\n        int action = event.getActionMasked();\n        if (action == MotionEvent.ACTION_MOVE) {\n            SDLJoystick joystick = getJoystick(event.getDeviceId());\n            if (joystick != null) {\n                for (int i = 0; i < joystick.axes.size(); i++) {\n                    InputDevice.MotionRange range = joystick.axes.get(i);\n                    /* Normalize the value to -1...1 */\n                    float value = (event.getAxisValue(range.getAxis(), actionPointerIndex) - range.getMin()) / range.getRange() * 2.0f - 1.0f;\n                    SDLControllerManager.onNativeJoy(joystick.device_id, i, value);\n                }\n                for (int i = 0; i < joystick.hats.size() / 2; i++) {\n                    int hatX = Math.round(event.getAxisValue(joystick.hats.get(2 * i).getAxis(), actionPointerIndex));\n                    int hatY = Math.round(event.getAxisValue(joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex));\n                    SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY);\n                }\n            }\n        }\n        return true;\n    }\n\n    public String getJoystickDescriptor(InputDevice joystickDevice) {\n        String desc = joystickDevice.getDescriptor();\n\n        if (desc != null && !desc.isEmpty()) {\n            return desc;\n        }\n\n        return joystickDevice.getName();\n    }\n    public int getProductId(InputDevice joystickDevice) {\n        return 0;\n    }\n    public int getVendorId(InputDevice joystickDevice) {\n        return 0;\n    }\n    public int getAxisMask(List<InputDevice.MotionRange> ranges) {\n        return -1;\n    }\n    public int getButtonMask(InputDevice joystickDevice) {\n        return -1;\n    }\n}\n\nclass SDLJoystickHandler_API19 extends SDLJoystickHandler_API16 {\n\n    @Override\n    public int getProductId(InputDevice joystickDevice) {\n        return joystickDevice.getProductId();\n    }\n\n    @Override\n    public int getVendorId(InputDevice joystickDevice) {\n        return joystickDevice.getVendorId();\n    }\n\n    @Override\n    public int getAxisMask(List<InputDevice.MotionRange> ranges) {\n        // For compatibility, keep computing the axis mask like before,\n        // only really distinguishing 2, 4 and 6 axes.\n        int axis_mask = 0;\n        if (ranges.size() >= 2) {\n            // ((1 << SDL_GAMEPAD_AXIS_LEFTX) | (1 << SDL_GAMEPAD_AXIS_LEFTY))\n            axis_mask |= 0x0003;\n        }\n        if (ranges.size() >= 4) {\n            // ((1 << SDL_GAMEPAD_AXIS_RIGHTX) | (1 << SDL_GAMEPAD_AXIS_RIGHTY))\n            axis_mask |= 0x000c;\n        }\n        if (ranges.size() >= 6) {\n            // ((1 << SDL_GAMEPAD_AXIS_LEFT_TRIGGER) | (1 << SDL_GAMEPAD_AXIS_RIGHT_TRIGGER))\n            axis_mask |= 0x0030;\n        }\n        // Also add an indicator bit for whether the sorting order has changed.\n        // This serves to disable outdated gamecontrollerdb.txt mappings.\n        boolean have_z = false;\n        boolean have_past_z_before_rz = false;\n        for (InputDevice.MotionRange range : ranges) {\n            int axis = range.getAxis();\n            if (axis == MotionEvent.AXIS_Z) {\n                have_z = true;\n            } else if (axis > MotionEvent.AXIS_Z && axis < MotionEvent.AXIS_RZ) {\n                have_past_z_before_rz = true;\n            }\n        }\n        if (have_z && have_past_z_before_rz) {\n            // If both these exist, the compare() function changed sorting order.\n            // Set a bit to indicate this fact.\n            axis_mask |= 0x8000;\n        }\n        return axis_mask;\n    }\n\n    @Override\n    public int getButtonMask(InputDevice joystickDevice) {\n        int button_mask = 0;\n        int[] keys = new int[] {\n            KeyEvent.KEYCODE_BUTTON_A,\n            KeyEvent.KEYCODE_BUTTON_B,\n            KeyEvent.KEYCODE_BUTTON_X,\n            KeyEvent.KEYCODE_BUTTON_Y,\n            KeyEvent.KEYCODE_BACK,\n            KeyEvent.KEYCODE_MENU,\n            KeyEvent.KEYCODE_BUTTON_MODE,\n            KeyEvent.KEYCODE_BUTTON_START,\n            KeyEvent.KEYCODE_BUTTON_THUMBL,\n            KeyEvent.KEYCODE_BUTTON_THUMBR,\n            KeyEvent.KEYCODE_BUTTON_L1,\n            KeyEvent.KEYCODE_BUTTON_R1,\n            KeyEvent.KEYCODE_DPAD_UP,\n            KeyEvent.KEYCODE_DPAD_DOWN,\n            KeyEvent.KEYCODE_DPAD_LEFT,\n            KeyEvent.KEYCODE_DPAD_RIGHT,\n            KeyEvent.KEYCODE_BUTTON_SELECT,\n            KeyEvent.KEYCODE_DPAD_CENTER,\n\n            // These don't map into any SDL controller buttons directly\n            KeyEvent.KEYCODE_BUTTON_L2,\n            KeyEvent.KEYCODE_BUTTON_R2,\n            KeyEvent.KEYCODE_BUTTON_C,\n            KeyEvent.KEYCODE_BUTTON_Z,\n            KeyEvent.KEYCODE_BUTTON_1,\n            KeyEvent.KEYCODE_BUTTON_2,\n            KeyEvent.KEYCODE_BUTTON_3,\n            KeyEvent.KEYCODE_BUTTON_4,\n            KeyEvent.KEYCODE_BUTTON_5,\n            KeyEvent.KEYCODE_BUTTON_6,\n            KeyEvent.KEYCODE_BUTTON_7,\n            KeyEvent.KEYCODE_BUTTON_8,\n            KeyEvent.KEYCODE_BUTTON_9,\n            KeyEvent.KEYCODE_BUTTON_10,\n            KeyEvent.KEYCODE_BUTTON_11,\n            KeyEvent.KEYCODE_BUTTON_12,\n            KeyEvent.KEYCODE_BUTTON_13,\n            KeyEvent.KEYCODE_BUTTON_14,\n            KeyEvent.KEYCODE_BUTTON_15,\n            KeyEvent.KEYCODE_BUTTON_16,\n        };\n        int[] masks = new int[] {\n            (1 << 0),   // A -> A\n            (1 << 1),   // B -> B\n            (1 << 2),   // X -> X\n            (1 << 3),   // Y -> Y\n            (1 << 4),   // BACK -> BACK\n            (1 << 6),   // MENU -> START\n            (1 << 5),   // MODE -> GUIDE\n            (1 << 6),   // START -> START\n            (1 << 7),   // THUMBL -> LEFTSTICK\n            (1 << 8),   // THUMBR -> RIGHTSTICK\n            (1 << 9),   // L1 -> LEFTSHOULDER\n            (1 << 10),  // R1 -> RIGHTSHOULDER\n            (1 << 11),  // DPAD_UP -> DPAD_UP\n            (1 << 12),  // DPAD_DOWN -> DPAD_DOWN\n            (1 << 13),  // DPAD_LEFT -> DPAD_LEFT\n            (1 << 14),  // DPAD_RIGHT -> DPAD_RIGHT\n            (1 << 4),   // SELECT -> BACK\n            (1 << 0),   // DPAD_CENTER -> A\n            (1 << 15),  // L2 -> ??\n            (1 << 16),  // R2 -> ??\n            (1 << 17),  // C -> ??\n            (1 << 18),  // Z -> ??\n            (1 << 20),  // 1 -> ??\n            (1 << 21),  // 2 -> ??\n            (1 << 22),  // 3 -> ??\n            (1 << 23),  // 4 -> ??\n            (1 << 24),  // 5 -> ??\n            (1 << 25),  // 6 -> ??\n            (1 << 26),  // 7 -> ??\n            (1 << 27),  // 8 -> ??\n            (1 << 28),  // 9 -> ??\n            (1 << 29),  // 10 -> ??\n            (1 << 30),  // 11 -> ??\n            (1 << 31),  // 12 -> ??\n            // We're out of room...\n            0xFFFFFFFF,  // 13 -> ??\n            0xFFFFFFFF,  // 14 -> ??\n            0xFFFFFFFF,  // 15 -> ??\n            0xFFFFFFFF,  // 16 -> ??\n        };\n        boolean[] has_keys = joystickDevice.hasKeys(keys);\n        for (int i = 0; i < keys.length; ++i) {\n            if (has_keys[i]) {\n                button_mask |= masks[i];\n            }\n        }\n        return button_mask;\n    }\n}\n\nclass SDLHapticHandler_API26 extends SDLHapticHandler {\n    @Override\n    public void run(int device_id, float intensity, int length) {\n        SDLHaptic haptic = getHaptic(device_id);\n        if (haptic != null) {\n            Log.d(\"SDL\", \"Rtest: Vibe with intensity \" + intensity + \" for \" + length);\n            if (intensity == 0.0f) {\n                stop(device_id);\n                return;\n            }\n\n            int vibeValue = Math.round(intensity * 255);\n\n            if (vibeValue > 255) {\n                vibeValue = 255;\n            }\n            if (vibeValue < 1) {\n                stop(device_id);\n                return;\n            }\n            try {\n                haptic.vib.vibrate(VibrationEffect.createOneShot(length, vibeValue));\n            }\n            catch (Exception e) {\n                // Fall back to the generic method, which uses DEFAULT_AMPLITUDE, but works even if\n                // something went horribly wrong with the Android 8.0 APIs.\n                haptic.vib.vibrate(length);\n            }\n        }\n    }\n}\n\nclass SDLHapticHandler {\n\n    static class SDLHaptic {\n        public int device_id;\n        public String name;\n        public Vibrator vib;\n    }\n\n    private final ArrayList<SDLHaptic> mHaptics;\n\n    public SDLHapticHandler() {\n        mHaptics = new ArrayList<SDLHaptic>();\n    }\n\n    public void run(int device_id, float intensity, int length) {\n        SDLHaptic haptic = getHaptic(device_id);\n        if (haptic != null) {\n            haptic.vib.vibrate(length);\n        }\n    }\n\n    public void stop(int device_id) {\n        SDLHaptic haptic = getHaptic(device_id);\n        if (haptic != null) {\n            haptic.vib.cancel();\n        }\n    }\n\n    public void pollHapticDevices() {\n\n        final int deviceId_VIBRATOR_SERVICE = 999999;\n        boolean hasVibratorService = false;\n\n        int[] deviceIds = InputDevice.getDeviceIds();\n        // It helps processing the device ids in reverse order\n        // For example, in the case of the XBox 360 wireless dongle,\n        // so the first controller seen by SDL matches what the receiver\n        // considers to be the first controller\n\n        for (int i = deviceIds.length - 1; i > -1; i--) {\n            SDLHaptic haptic = getHaptic(deviceIds[i]);\n            if (haptic == null) {\n                InputDevice device = InputDevice.getDevice(deviceIds[i]);\n                Vibrator vib = device.getVibrator();\n                if (vib != null) {\n                    if (vib.hasVibrator()) {\n                        haptic = new SDLHaptic();\n                        haptic.device_id = deviceIds[i];\n                        haptic.name = device.getName();\n                        haptic.vib = vib;\n                        mHaptics.add(haptic);\n                        SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name);\n                    }\n                }\n            }\n        }\n\n        /* Check VIBRATOR_SERVICE */\n        Vibrator vib = (Vibrator) SDL.getContext().getSystemService(Context.VIBRATOR_SERVICE);\n        if (vib != null) {\n            hasVibratorService = vib.hasVibrator();\n\n            if (hasVibratorService) {\n                SDLHaptic haptic = getHaptic(deviceId_VIBRATOR_SERVICE);\n                if (haptic == null) {\n                    haptic = new SDLHaptic();\n                    haptic.device_id = deviceId_VIBRATOR_SERVICE;\n                    haptic.name = \"VIBRATOR_SERVICE\";\n                    haptic.vib = vib;\n                    mHaptics.add(haptic);\n                    SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name);\n                }\n            }\n        }\n\n        /* Check removed devices */\n        ArrayList<Integer> removedDevices = null;\n        for (SDLHaptic haptic : mHaptics) {\n            int device_id = haptic.device_id;\n            int i;\n            for (i = 0; i < deviceIds.length; i++) {\n                if (device_id == deviceIds[i]) break;\n            }\n\n            if (device_id != deviceId_VIBRATOR_SERVICE || !hasVibratorService) {\n                if (i == deviceIds.length) {\n                    if (removedDevices == null) {\n                        removedDevices = new ArrayList<Integer>();\n                    }\n                    removedDevices.add(device_id);\n                }\n            }  // else: don't remove the vibrator if it is still present\n        }\n\n        if (removedDevices != null) {\n            for (int device_id : removedDevices) {\n                SDLControllerManager.nativeRemoveHaptic(device_id);\n                for (int i = 0; i < mHaptics.size(); i++) {\n                    if (mHaptics.get(i).device_id == device_id) {\n                        mHaptics.remove(i);\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    protected SDLHaptic getHaptic(int device_id) {\n        for (SDLHaptic haptic : mHaptics) {\n            if (haptic.device_id == device_id) {\n                return haptic;\n            }\n        }\n        return null;\n    }\n}\n\nclass SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {\n    // Generic Motion (mouse hover, joystick...) events go here\n    @Override\n    public boolean onGenericMotion(View v, MotionEvent event) {\n        float x, y;\n        int action;\n\n        switch ( event.getSource() ) {\n            case InputDevice.SOURCE_JOYSTICK:\n                return SDLControllerManager.handleJoystickMotionEvent(event);\n\n            case InputDevice.SOURCE_MOUSE:\n                action = event.getActionMasked();\n                switch (action) {\n                    case MotionEvent.ACTION_SCROLL:\n                        x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0);\n                        y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0);\n                        SDLActivity.onNativeMouse(0, action, x, y, false);\n                        return true;\n\n                    case MotionEvent.ACTION_HOVER_MOVE:\n                        x = event.getX(0);\n                        y = event.getY(0);\n\n                        SDLActivity.onNativeMouse(0, action, x, y, false);\n                        return true;\n\n                    default:\n                        break;\n                }\n                break;\n\n            default:\n                break;\n        }\n\n        // Event was not managed\n        return false;\n    }\n\n    public boolean supportsRelativeMouse() {\n        return false;\n    }\n\n    public boolean inRelativeMode() {\n        return false;\n    }\n\n    public boolean setRelativeMouseEnabled(boolean enabled) {\n        return false;\n    }\n\n    public void reclaimRelativeMouseModeIfNeeded()\n    {\n\n    }\n\n    public float getEventX(MotionEvent event) {\n        return event.getX(0);\n    }\n\n    public float getEventY(MotionEvent event) {\n        return event.getY(0);\n    }\n\n}\n\nclass SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 {\n    // Generic Motion (mouse hover, joystick...) events go here\n\n    private boolean mRelativeModeEnabled;\n\n    @Override\n    public boolean onGenericMotion(View v, MotionEvent event) {\n\n        // Handle relative mouse mode\n        if (mRelativeModeEnabled) {\n            if (event.getSource() == InputDevice.SOURCE_MOUSE) {\n                int action = event.getActionMasked();\n                if (action == MotionEvent.ACTION_HOVER_MOVE) {\n                    float x = event.getAxisValue(MotionEvent.AXIS_RELATIVE_X);\n                    float y = event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y);\n                    SDLActivity.onNativeMouse(0, action, x, y, true);\n                    return true;\n                }\n            }\n        }\n\n        // Event was not managed, call SDLGenericMotionListener_API12 method\n        return super.onGenericMotion(v, event);\n    }\n\n    @Override\n    public boolean supportsRelativeMouse() {\n        return true;\n    }\n\n    @Override\n    public boolean inRelativeMode() {\n        return mRelativeModeEnabled;\n    }\n\n    @Override\n    public boolean setRelativeMouseEnabled(boolean enabled) {\n        mRelativeModeEnabled = enabled;\n        return true;\n    }\n\n    @Override\n    public float getEventX(MotionEvent event) {\n        if (mRelativeModeEnabled) {\n            return event.getAxisValue(MotionEvent.AXIS_RELATIVE_X);\n        } else {\n            return event.getX(0);\n        }\n    }\n\n    @Override\n    public float getEventY(MotionEvent event) {\n        if (mRelativeModeEnabled) {\n            return event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y);\n        } else {\n            return event.getY(0);\n        }\n    }\n}\n\nclass SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {\n    // Generic Motion (mouse hover, joystick...) events go here\n    private boolean mRelativeModeEnabled;\n\n    @Override\n    public boolean onGenericMotion(View v, MotionEvent event) {\n        float x, y;\n        int action;\n\n        switch ( event.getSource() ) {\n            case InputDevice.SOURCE_JOYSTICK:\n                return SDLControllerManager.handleJoystickMotionEvent(event);\n\n            case InputDevice.SOURCE_MOUSE:\n            // DeX desktop mouse cursor is a separate non-standard input type.\n            case InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN:\n                action = event.getActionMasked();\n                switch (action) {\n                    case MotionEvent.ACTION_SCROLL:\n                        x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0);\n                        y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0);\n                        SDLActivity.onNativeMouse(0, action, x, y, false);\n                        return true;\n\n                    case MotionEvent.ACTION_HOVER_MOVE:\n                        x = event.getX(0);\n                        y = event.getY(0);\n                        SDLActivity.onNativeMouse(0, action, x, y, false);\n                        return true;\n\n                    default:\n                        break;\n                }\n                break;\n\n            case InputDevice.SOURCE_MOUSE_RELATIVE:\n                action = event.getActionMasked();\n                switch (action) {\n                    case MotionEvent.ACTION_SCROLL:\n                        x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0);\n                        y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0);\n                        SDLActivity.onNativeMouse(0, action, x, y, false);\n                        return true;\n\n                    case MotionEvent.ACTION_HOVER_MOVE:\n                        x = event.getX(0);\n                        y = event.getY(0);\n                        SDLActivity.onNativeMouse(0, action, x, y, true);\n                        return true;\n\n                    default:\n                        break;\n                }\n                break;\n\n            default:\n                break;\n        }\n\n        // Event was not managed\n        return false;\n    }\n\n    @Override\n    public boolean supportsRelativeMouse() {\n        return (!SDLActivity.isDeXMode() || Build.VERSION.SDK_INT >= 27 /* Android 8.1 (O_MR1) */);\n    }\n\n    @Override\n    public boolean inRelativeMode() {\n        return mRelativeModeEnabled;\n    }\n\n    @Override\n    public boolean setRelativeMouseEnabled(boolean enabled) {\n        if (!SDLActivity.isDeXMode() || Build.VERSION.SDK_INT >= 27 /* Android 8.1 (O_MR1) */) {\n            if (enabled) {\n                SDLActivity.getContentView().requestPointerCapture();\n            } else {\n                SDLActivity.getContentView().releasePointerCapture();\n            }\n            mRelativeModeEnabled = enabled;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    @Override\n    public void reclaimRelativeMouseModeIfNeeded()\n    {\n        if (mRelativeModeEnabled && !SDLActivity.isDeXMode()) {\n            SDLActivity.getContentView().requestPointerCapture();\n        }\n    }\n\n    @Override\n    public float getEventX(MotionEvent event) {\n        // Relative mouse in capture mode will only have relative for X/Y\n        return event.getX(0);\n    }\n\n    @Override\n    public float getEventY(MotionEvent event) {\n        // Relative mouse in capture mode will only have relative for X/Y\n        return event.getY(0);\n    }\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/java/org/libsdl/app/SDLSurface.java",
    "content": "package org.libsdl.app;\n\n\nimport android.content.Context;\nimport android.content.pm.ActivityInfo;\nimport android.hardware.Sensor;\nimport android.hardware.SensorEvent;\nimport android.hardware.SensorEventListener;\nimport android.hardware.SensorManager;\nimport android.os.Build;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.view.Display;\nimport android.view.InputDevice;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\nimport android.view.Surface;\nimport android.view.SurfaceHolder;\nimport android.view.SurfaceView;\nimport android.view.View;\nimport android.view.WindowManager;\n\n\n/**\n    SDLSurface. This is what we draw on, so we need to know when it's created\n    in order to do anything useful.\n\n    Because of this, that's where we set up the SDL thread\n*/\npublic class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,\n    View.OnKeyListener, View.OnTouchListener, SensorEventListener  {\n\n    // Sensors\n    protected SensorManager mSensorManager;\n    protected Display mDisplay;\n\n    // Keep track of the surface size to normalize touch events\n    protected float mWidth, mHeight;\n\n    // Is SurfaceView ready for rendering\n    public boolean mIsSurfaceReady;\n\n    // Startup\n    public SDLSurface(Context context) {\n        super(context);\n        getHolder().addCallback(this);\n\n        setFocusable(true);\n        setFocusableInTouchMode(true);\n        requestFocus();\n        setOnKeyListener(this);\n        setOnTouchListener(this);\n\n        mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();\n        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);\n\n        setOnGenericMotionListener(SDLActivity.getMotionListener());\n\n        // Some arbitrary defaults to avoid a potential division by zero\n        mWidth = 1.0f;\n        mHeight = 1.0f;\n\n        mIsSurfaceReady = false;\n    }\n\n    public void handlePause() {\n        enableSensor(Sensor.TYPE_ACCELEROMETER, false);\n    }\n\n    public void handleResume() {\n        setFocusable(true);\n        setFocusableInTouchMode(true);\n        requestFocus();\n        setOnKeyListener(this);\n        setOnTouchListener(this);\n        enableSensor(Sensor.TYPE_ACCELEROMETER, true);\n    }\n\n    public Surface getNativeSurface() {\n        return getHolder().getSurface();\n    }\n\n    // Called when we have a valid drawing surface\n    @Override\n    public void surfaceCreated(SurfaceHolder holder) {\n        Log.v(\"SDL\", \"surfaceCreated()\");\n        SDLActivity.onNativeSurfaceCreated();\n    }\n\n    // Called when we lose the surface\n    @Override\n    public void surfaceDestroyed(SurfaceHolder holder) {\n        Log.v(\"SDL\", \"surfaceDestroyed()\");\n\n        // Transition to pause, if needed\n        SDLActivity.mNextNativeState = SDLActivity.NativeState.PAUSED;\n        SDLActivity.handleNativeState();\n\n        mIsSurfaceReady = false;\n        SDLActivity.onNativeSurfaceDestroyed();\n    }\n\n    // Called when the surface is resized\n    @Override\n    public void surfaceChanged(SurfaceHolder holder,\n                               int format, int width, int height) {\n        Log.v(\"SDL\", \"surfaceChanged()\");\n\n        if (SDLActivity.mSingleton == null) {\n            return;\n        }\n\n        mWidth = width;\n        mHeight = height;\n        int nDeviceWidth = width;\n        int nDeviceHeight = height;\n        try\n        {\n            if (Build.VERSION.SDK_INT >= 17 /* Android 4.2 (JELLY_BEAN_MR1) */) {\n                DisplayMetrics realMetrics = new DisplayMetrics();\n                mDisplay.getRealMetrics( realMetrics );\n                nDeviceWidth = realMetrics.widthPixels;\n                nDeviceHeight = realMetrics.heightPixels;\n            }\n        } catch(Exception ignored) {\n        }\n\n        synchronized(SDLActivity.getContext()) {\n            // In case we're waiting on a size change after going fullscreen, send a notification.\n            SDLActivity.getContext().notifyAll();\n        }\n\n        Log.v(\"SDL\", \"Window size: \" + width + \"x\" + height);\n        Log.v(\"SDL\", \"Device size: \" + nDeviceWidth + \"x\" + nDeviceHeight);\n        SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, mDisplay.getRefreshRate());\n        SDLActivity.onNativeResize();\n\n        // Prevent a screen distortion glitch,\n        // for instance when the device is in Landscape and a Portrait App is resumed.\n        boolean skip = false;\n        int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation();\n\n        if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) {\n            if (mWidth > mHeight) {\n               skip = true;\n            }\n        } else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) {\n            if (mWidth < mHeight) {\n               skip = true;\n            }\n        }\n\n        // Special Patch for Square Resolution: Black Berry Passport\n        if (skip) {\n           double min = Math.min(mWidth, mHeight);\n           double max = Math.max(mWidth, mHeight);\n\n           if (max / min < 1.20) {\n              Log.v(\"SDL\", \"Don't skip on such aspect-ratio. Could be a square resolution.\");\n              skip = false;\n           }\n        }\n\n        // Don't skip in MultiWindow.\n        if (skip) {\n            if (Build.VERSION.SDK_INT >= 24 /* Android 7.0 (N) */) {\n                if (SDLActivity.mSingleton.isInMultiWindowMode()) {\n                    Log.v(\"SDL\", \"Don't skip in Multi-Window\");\n                    skip = false;\n                }\n            }\n        }\n\n        if (skip) {\n           Log.v(\"SDL\", \"Skip .. Surface is not ready.\");\n           mIsSurfaceReady = false;\n           return;\n        }\n\n        /* If the surface has been previously destroyed by onNativeSurfaceDestroyed, recreate it here */\n        SDLActivity.onNativeSurfaceChanged();\n\n        /* Surface is ready */\n        mIsSurfaceReady = true;\n\n        SDLActivity.mNextNativeState = SDLActivity.NativeState.RESUMED;\n        SDLActivity.handleNativeState();\n    }\n\n    // Key events\n    @Override\n    public boolean onKey(View v, int keyCode, KeyEvent event) {\n        return SDLActivity.handleKeyEvent(v, keyCode, event, null);\n    }\n\n    // Touch events\n    @Override\n    public boolean onTouch(View v, MotionEvent event) {\n        /* Ref: http://developer.android.com/training/gestures/multi.html */\n        int touchDevId = event.getDeviceId();\n        final int pointerCount = event.getPointerCount();\n        int action = event.getActionMasked();\n        int pointerFingerId;\n        int i = -1;\n        float x,y,p;\n\n        /*\n         * Prevent id to be -1, since it's used in SDL internal for synthetic events\n         * Appears when using Android emulator, eg:\n         *  adb shell input mouse tap 100 100\n         *  adb shell input touchscreen tap 100 100\n         */\n        if (touchDevId < 0) {\n            touchDevId -= 1;\n        }\n\n        // 12290 = Samsung DeX mode desktop mouse\n        // 12290 = 0x3002 = 0x2002 | 0x1002 = SOURCE_MOUSE | SOURCE_TOUCHSCREEN\n        // 0x2   = SOURCE_CLASS_POINTER\n        if (event.getSource() == InputDevice.SOURCE_MOUSE || event.getSource() == (InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN)) {\n            int mouseButton = 1;\n            try {\n                Object object = event.getClass().getMethod(\"getButtonState\").invoke(event);\n                if (object != null) {\n                    mouseButton = (Integer) object;\n                }\n            } catch(Exception ignored) {\n            }\n\n            // We need to check if we're in relative mouse mode and get the axis offset rather than the x/y values\n            // if we are.  We'll leverage our existing mouse motion listener\n            SDLGenericMotionListener_API12 motionListener = SDLActivity.getMotionListener();\n            x = motionListener.getEventX(event);\n            y = motionListener.getEventY(event);\n\n            SDLActivity.onNativeMouse(mouseButton, action, x, y, motionListener.inRelativeMode());\n        } else {\n            switch(action) {\n                case MotionEvent.ACTION_MOVE:\n                    for (i = 0; i < pointerCount; i++) {\n                        pointerFingerId = event.getPointerId(i);\n                        x = event.getX(i) / mWidth;\n                        y = event.getY(i) / mHeight;\n                        p = event.getPressure(i);\n                        if (p > 1.0f) {\n                            // may be larger than 1.0f on some devices\n                            // see the documentation of getPressure(i)\n                            p = 1.0f;\n                        }\n                        SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);\n                    }\n                    break;\n\n                case MotionEvent.ACTION_UP:\n                case MotionEvent.ACTION_DOWN:\n                    // Primary pointer up/down, the index is always zero\n                    i = 0;\n                    /* fallthrough */\n                case MotionEvent.ACTION_POINTER_UP:\n                case MotionEvent.ACTION_POINTER_DOWN:\n                    // Non primary pointer up/down\n                    if (i == -1) {\n                        i = event.getActionIndex();\n                    }\n\n                    pointerFingerId = event.getPointerId(i);\n                    x = event.getX(i) / mWidth;\n                    y = event.getY(i) / mHeight;\n                    p = event.getPressure(i);\n                    if (p > 1.0f) {\n                        // may be larger than 1.0f on some devices\n                        // see the documentation of getPressure(i)\n                        p = 1.0f;\n                    }\n                    SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);\n                    break;\n\n                case MotionEvent.ACTION_CANCEL:\n                    for (i = 0; i < pointerCount; i++) {\n                        pointerFingerId = event.getPointerId(i);\n                        x = event.getX(i) / mWidth;\n                        y = event.getY(i) / mHeight;\n                        p = event.getPressure(i);\n                        if (p > 1.0f) {\n                            // may be larger than 1.0f on some devices\n                            // see the documentation of getPressure(i)\n                            p = 1.0f;\n                        }\n                        SDLActivity.onNativeTouch(touchDevId, pointerFingerId, MotionEvent.ACTION_UP, x, y, p);\n                    }\n                    break;\n\n                default:\n                    break;\n            }\n        }\n\n        return true;\n   }\n\n    // Sensor events\n    public void enableSensor(int sensortype, boolean enabled) {\n        // TODO: This uses getDefaultSensor - what if we have >1 accels?\n        if (enabled) {\n            mSensorManager.registerListener(this,\n                            mSensorManager.getDefaultSensor(sensortype),\n                            SensorManager.SENSOR_DELAY_GAME, null);\n        } else {\n            mSensorManager.unregisterListener(this,\n                            mSensorManager.getDefaultSensor(sensortype));\n        }\n    }\n\n    @Override\n    public void onAccuracyChanged(Sensor sensor, int accuracy) {\n        // TODO\n    }\n\n    @Override\n    public void onSensorChanged(SensorEvent event) {\n        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {\n\n            // Since we may have an orientation set, we won't receive onConfigurationChanged events.\n            // We thus should check here.\n            int newOrientation;\n\n            float x, y;\n            switch (mDisplay.getRotation()) {\n                case Surface.ROTATION_90:\n                    x = -event.values[1];\n                    y = event.values[0];\n                    newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE;\n                    break;\n                case Surface.ROTATION_270:\n                    x = event.values[1];\n                    y = -event.values[0];\n                    newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE_FLIPPED;\n                    break;\n                case Surface.ROTATION_180:\n                    x = -event.values[0];\n                    y = -event.values[1];\n                    newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT_FLIPPED;\n                    break;\n                case Surface.ROTATION_0:\n                default:\n                    x = event.values[0];\n                    y = event.values[1];\n                    newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT;\n                    break;\n            }\n\n            if (newOrientation != SDLActivity.mCurrentOrientation) {\n                SDLActivity.mCurrentOrientation = newOrientation;\n                SDLActivity.onNativeOrientationChanged(newOrientation);\n            }\n\n            SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH,\n                                      y / SensorManager.GRAVITY_EARTH,\n                                      event.values[2] / SensorManager.GRAVITY_EARTH);\n\n\n        }\n    }\n\n    // Captured pointer events for API 26.\n    public boolean onCapturedPointerEvent(MotionEvent event)\n    {\n        int action = event.getActionMasked();\n\n        float x, y;\n        switch (action) {\n            case MotionEvent.ACTION_SCROLL:\n                x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0);\n                y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0);\n                SDLActivity.onNativeMouse(0, action, x, y, false);\n                return true;\n\n            case MotionEvent.ACTION_HOVER_MOVE:\n            case MotionEvent.ACTION_MOVE:\n                x = event.getX(0);\n                y = event.getY(0);\n                SDLActivity.onNativeMouse(0, action, x, y, true);\n                return true;\n\n            case MotionEvent.ACTION_BUTTON_PRESS:\n            case MotionEvent.ACTION_BUTTON_RELEASE:\n\n                // Change our action value to what SDL's code expects.\n                if (action == MotionEvent.ACTION_BUTTON_PRESS) {\n                    action = MotionEvent.ACTION_DOWN;\n                } else { /* MotionEvent.ACTION_BUTTON_RELEASE */\n                    action = MotionEvent.ACTION_UP;\n                }\n\n                x = event.getX(0);\n                y = event.getY(0);\n                int button = event.getButtonState();\n\n                SDLActivity.onNativeMouse(button, action, x, y, true);\n                return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "templates/android/template/app/src/main/jniLibs/armeabi/readme.txt",
    "content": "place binaries here\n"
  },
  {
    "path": "templates/android/template/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n\trepositories {\n\t\tmavenCentral()\n\t\tgoogle()\n\t}\n\tdependencies {\n\t\tclasspath 'com.android.tools.build:gradle:::ANDROID_GRADLE_PLUGIN::'\n\n\t\t// NOTE: Do not place your application dependencies here; they belong\n\t\t// in the individual module build.gradle files\n\t}\n}\n\nallprojects {\n\trepositories {\n\t\tmavenCentral()\n\t\tgoogle()\n\t}::if ANDROID_GRADLE_BUILD_DIRECTORY::\n\tbuildDir = \"::ANDROID_GRADLE_BUILD_DIRECTORY::/::APP_FILE::/${project.name}\"::end::\n}\n\ntask clean(type: Delete) {\n\tdelete rootProject.buildDir\n}\n\nwrapper {\n\tgradleVersion = '::ANDROID_GRADLE_VERSION::'\n}\n\nconfigure(subprojects.findAll {!it.file('build.gradle').exists() && it.file('build.xml').exists()}) {\n\tbuildscript {\n\t\trepositories {\n\t\t\tmavenCentral()\n\t\t\tgoogle()\n\t\t}\n\n\t\tdependencies {\n\t\t\tclasspath 'com.android.tools.build:gradle:::ANDROID_GRADLE_PLUGIN::'\n\t\t}\n\t}\n\n\tapply plugin: 'android-library'\n\n\tandroid {\n\t\tcompileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n\t\tbuildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION\n\t\t::if (ANDROID_GRADLE_PLUGIN>=\"4.0\")::ndkPath '::ANDROID_NDK_ROOT_ESCAPED::'::end::\n\t\t::if (ANDROID_NDK_VERSION)::ndkVersion '::ANDROID_NDK_VERSION::'::end::\n\n\t\tsourceSets {\n\t\t\tmain {\n\t\t\t\tmanifest.srcFile 'AndroidManifest.xml'\n\t\t\t\tjava.srcDirs = ['src']\n\t\t\t\tres.srcDirs = ['res']\n\t\t\t}\n\t\t}\n\t}\n\n\tdependencies {\n\t\timplementation project(':deps:extension-api')\n\t}\n}\n"
  },
  {
    "path": "templates/android/template/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-::ANDROID_GRADLE_VERSION::-bin.zip\n"
  },
  {
    "path": "templates/android/template/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\nVERSION_NAME=::META_VERSION::\nVERSION_CODE=::META_BUILD_NUMBER::\n\nANDROID_BUILD_TARGET_SDK_VERSION=::ANDROID_TARGET_SDK_VERSION::\nANDROID_BUILD_MIN_SDK_VERSION=::ANDROID_MINIMUM_SDK_VERSION::\nANDROID_BUILD_SDK_VERSION=::ANDROID_TARGET_SDK_VERSION::\nANDROID_BUILD_TOOLS_VERSION=::ANDROID_BUILD_TOOLS_VERSION::\n::if (ANDROID_TARGET_SDK_VERSION>=28)::\nandroid.useAndroidX=::ANDROID_USE_ANDROIDX::\nandroid.enableJetifier=::ANDROID_ENABLE_JETIFIER::\n::end::\n::if KEY_STORE::\nKEY_STORE=::KEY_STORE::\nKEY_STORE_PASSWORD=::KEY_STORE_PASSWORD::\nKEY_STORE_ALIAS=::KEY_STORE_ALIAS::\nKEY_STORE_ALIAS_PASSWORD=::KEY_STORE_ALIAS_PASSWORD::\n::end::\n::foreach ANDROID_GRADLE_PROPERTIES::::if ((value != null) && (value != \"\"))::::key::=::value::\n::end::::end::"
  },
  {
    "path": "templates/android/template/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "templates/android/template/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "templates/android/template/local.properties",
    "content": "## This file must *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local configuration.\n#\n# Location of the SDK. This is only used by Gradle.\n#\nsdk.dir=::ANDROID_SDK_ESCAPED::\n::if (ANDROID_GRADLE_PLUGIN<\"4.0\")::\nndk.dir=::ANDROID_NDK_ROOT_ESCAPED::\n::end::\n"
  },
  {
    "path": "templates/android/template/settings.gradle",
    "content": "include ':app'\n::if (ANDROID_LIBRARY_PROJECTS)::::foreach (ANDROID_LIBRARY_PROJECTS)::include ':deps:::name::'\n::end::::end::"
  },
  {
    "path": "templates/bin/lime.sh",
    "content": "#!/bin/sh\nhaxelib run lime \"$@\"\n"
  },
  {
    "path": "templates/bin/node/http-server/LICENSE",
    "content": "Copyright (c) 2011-2022 Charlie Robbins, Marak Squires, Jade Michael Thornton and the Contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/README.md",
    "content": "[![GitHub Workflow Status (master)](https://img.shields.io/github/workflow/status/http-party/http-server/Node.js%20CI/master?style=flat-square)](https://github.com/http-party/http-server/actions)\n[![npm](https://img.shields.io/npm/v/http-server.svg?style=flat-square)](https://www.npmjs.com/package/http-server) [![homebrew](https://img.shields.io/homebrew/v/http-server?style=flat-square)](https://formulae.brew.sh/formula/http-server) [![npm downloads](https://img.shields.io/npm/dm/http-server?color=blue&label=npm%20downloads&style=flat-square)](https://www.npmjs.com/package/http-server)\n[![license](https://img.shields.io/github/license/http-party/http-server.svg?style=flat-square)](https://github.com/http-party/http-server)\n\n# http-server: a simple static HTTP server\n\n`http-server` is a simple, zero-configuration command-line static HTTP server.  It is powerful enough for production usage, but it's simple and hackable enough to be used for testing, local development and learning.\n\n![Example of running http-server](https://github.com/http-party/http-server/raw/master/screenshots/public.png)\n\n## Installation:\n\n#### Running on-demand:\n\nUsing `npx` you can run the script without installing it first:\n\n    npx http-server [path] [options]\n\n#### Globally via `npm`\n\n    npm install --global http-server\n\nThis will install `http-server` globally so that it may be run from the command line anywhere.\n\n#### Globally via Homebrew\n\n    brew install http-server\n     \n#### As a dependency in your `npm` package:\n\n    npm install http-server\n\n## Usage:\n\n     http-server [path] [options]\n\n`[path]` defaults to `./public` if the folder exists, and `./` otherwise.\n\n*Now you can visit http://localhost:8080 to view your server*\n\n**Note:** Caching is on by default. Add `-c-1` as an option to disable caching.\n\n## Available Options:\n\n| Command         | \tDescription         | Defaults  |\n| -------------  |-------------|-------------|\n|`-p` or `--port` |Port to use. Use `-p 0` to look for an open port, starting at 8080. It will also read from `process.env.PORT`. |8080 |\n|`-a`   |Address to use |0.0.0.0|\n|`-d`     |Show directory listings |`true` |\n|`-i`   | Display autoIndex | `true` |\n|`-g` or `--gzip` |When enabled it will serve `./public/some-file.js.gz` in place of `./public/some-file.js` when a gzipped version of the file exists and the request accepts gzip encoding. If brotli is also enabled, it will try to serve brotli first.|`false`|\n|`-b` or `--brotli`|When enabled it will serve `./public/some-file.js.br` in place of `./public/some-file.js` when a brotli compressed version of the file exists and the request accepts `br` encoding. If gzip is also enabled, it will try to serve brotli first. |`false`|\n|`-e` or `--ext`  |Default file extension if none supplied |`html` | \n|`-s` or `--silent` |Suppress log messages from output  | |\n|`--cors` |Enable CORS via the `Access-Control-Allow-Origin` header  | |\n|`-o [path]` |Open browser window after starting the server. Optionally provide a URL path to open. e.g.: -o /other/dir/ | |\n|`-c` |Set cache time (in seconds) for cache-control max-age header, e.g. `-c10` for 10 seconds. To disable caching, use `-c-1`.|`3600` |\n|`-U` or `--utc` |Use UTC time format in log messages.| |\n|`--log-ip` |Enable logging of the client's IP address |`false` |\n|`-P` or `--proxy` |Proxies all requests which can't be resolved locally to the given url. e.g.: -P http://someurl.com | |\n|`--proxy-options` |Pass proxy [options](https://github.com/http-party/node-http-proxy#options) using nested dotted objects. e.g.: --proxy-options.secure false |\n|`--username` |Username for basic authentication | |\n|`--password` |Password for basic authentication | |\n|`-S`, `--tls` or `--ssl` |Enable secure request serving with TLS/SSL (HTTPS)|`false`|\n|`-C` or `--cert` |Path to ssl cert file |`cert.pem` | \n|`-K` or `--key` |Path to ssl key file |`key.pem` |\n|`-r` or `--robots` | Automatically provide a /robots.txt (The content of which defaults to `User-agent: *\\nDisallow: /`)  | `false` |\n|`--no-dotfiles` |Do not show dotfiles| |\n|`--mimetypes` |Path to a .types file for custom mimetype definition| |\n|`-h` or `--help` |Print this list and exit. |   |\n|`-v` or `--version`|Print the version and exit. | |\n\n## Magic Files\n\n- `index.html` will be served as the default file to any directory requests.\n- `404.html` will be served if a file is not found. This can be used for Single-Page App (SPA) hosting to serve the entry page.\n\n## Catch-all redirect\n\nTo implement a catch-all redirect, use the index page itself as the proxy with:\n\n```\nhttp-server --proxy http://localhost:8080?\n```\n\nNote the `?` at the end of the proxy URL. Thanks to [@houston3](https://github.com/houston3) for this clever hack!\n\n## TLS/SSL\n\nFirst, you need to make sure that [openssl](https://github.com/openssl/openssl) is installed correctly, and you have `key.pem` and `cert.pem` files. You can generate them using this command:\n\n``` sh\nopenssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem\n```\n\nYou will be prompted with a few questions after entering the command. Use `127.0.0.1` as value for `Common name` if you want to be able to install the certificate in your OS's root certificate store or browser so that it is trusted.\n\nThis generates a cert-key pair and it will be valid for 3650 days (about 10 years).\n\nThen you need to run the server with `-S` for enabling SSL and `-C` for your certificate file.\n\n``` sh\nhttp-server -S -C cert.pem\n```\n\nIf you wish to use a passphrase with your private key you can include one in the openssl command via the -passout parameter (using password of foobar)\n\n\ne.g.\n`openssl req -newkey rsa:2048 -passout pass:foobar -keyout key.pem -x509 -days 365 -out cert.pem`\n\nFor security reasons, the passphrase will only be read from the `NODE_HTTP_SERVER_SSL_PASSPHRASE` environment variable.\n\n\nThis is what should be output if successful:\n\n``` sh\nStarting up http-server, serving ./ through https\n\nhttp-server settings:\nCORS: disabled\nCache: 3600 seconds\nConnection Timeout: 120 seconds\nDirectory Listings: visible\nAutoIndex: visible\nServe GZIP Files: false\nServe Brotli Files: false\nDefault File Extension: none\n\nAvailable on:\n  https://127.0.0.1:8080\n  https://192.168.1.101:8080\n  https://192.168.1.104:8080\nHit CTRL-C to stop the server\n```\n\n# Development\n\nCheckout this repository locally, then:\n\n```sh\n$ npm i\n$ npm start\n```\n\n*Now you can visit http://localhost:8080 to view your server*\n\nYou should see the turtle image in the screenshot above hosted at that URL. See\nthe `./public` folder for demo content.\n"
  },
  {
    "path": "templates/bin/node/http-server/bin/http-server",
    "content": "#!/usr/bin/env node\n\n'use strict';\n\nvar chalk     = require('chalk'),\n    os         = require('os'),\n    httpServer = require('../lib/http-server'),\n    portfinder = require('portfinder'),\n    opener     = require('opener'),\n\n    fs         = require('fs'),\n    url        = require('url');\nvar argv = require('minimist')(process.argv.slice(2), {\n  alias: {\n    tls: 'ssl'\n  }\n});\nvar ifaces = os.networkInterfaces();\n\nprocess.title = 'http-server';\n\nif (argv.h || argv.help) {\n  console.log([\n    'usage: http-server [path] [options]',\n    '',\n    'options:',\n    '  -p --port    Port to use. If 0, look for open port. [8080]',\n    '  -a           Address to use [0.0.0.0]',\n    '  -d           Show directory listings [true]',\n    '  -i           Display autoIndex [true]',\n    '  -g --gzip    Serve gzip files when possible [false]',\n    '  -b --brotli  Serve brotli files when possible [false]',\n    '               If both brotli and gzip are enabled, brotli takes precedence',\n    '  -e --ext     Default file extension if none supplied [none]',\n    '  -s --silent  Suppress log messages from output',\n    '  --cors[=headers]   Enable CORS via the \"Access-Control-Allow-Origin\" header',\n    '                     Optionally provide CORS headers list separated by commas',\n    '  -o [path]    Open browser window after starting the server.',\n    '               Optionally provide a URL path to open the browser window to.',\n    '  -c           Cache time (max-age) in seconds [3600], e.g. -c10 for 10 seconds.',\n    '               To disable caching, use -c-1.',\n    '  -t           Connections timeout in seconds [120], e.g. -t60 for 1 minute.',\n    '               To disable timeout, use -t0',\n    '  -U --utc     Use UTC time format in log messages.',\n    '  --log-ip     Enable logging of the client\\'s IP address',\n    '',\n    '  -P --proxy       Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com',\n    '  --proxy-options  Pass options to proxy using nested dotted objects. e.g.: --proxy-options.secure false',\n    '',\n    '  --username   Username for basic authentication [none]',\n    '               Can also be specified with the env variable NODE_HTTP_SERVER_USERNAME',\n    '  --password   Password for basic authentication [none]',\n    '               Can also be specified with the env variable NODE_HTTP_SERVER_PASSWORD',\n    '',\n    '  -S --tls --ssl   Enable secure request serving with TLS/SSL (HTTPS)',\n    '  -C --cert    Path to TLS cert file (default: cert.pem)',\n    '  -K --key     Path to TLS key file (default: key.pem)',\n    '',\n    '  -r --robots        Respond to /robots.txt [User-agent: *\\\\nDisallow: /]',\n    '  --no-dotfiles      Do not show dotfiles',\n    '  --mimetypes        Path to a .types file for custom mimetype definition',\n    '  -h --help          Print this list and exit.',\n    '  -v --version       Print the version and exit.'\n  ].join('\\n'));\n  process.exit();\n}\n\nvar port = argv.p || argv.port || parseInt(process.env.PORT, 10),\n    host = argv.a || '0.0.0.0',\n    tls = argv.S || argv.tls,\n    sslPassphrase = process.env.NODE_HTTP_SERVER_SSL_PASSPHRASE,\n    proxy = argv.P || argv.proxy,\n    proxyOptions = argv['proxy-options'],\n    utc = argv.U || argv.utc,\n    version = argv.v || argv.version,\n    logger;\n\nvar proxyOptionsBooleanProps = [\n  'ws', 'xfwd', 'secure', 'toProxy', 'prependPath', 'ignorePath', 'changeOrigin',\n  'preserveHeaderKeyCase', 'followRedirects', 'selfHandleResponse'\n];\n\nif (proxyOptions) {\n  Object.keys(proxyOptions).forEach(function (key) {\n    if (proxyOptionsBooleanProps.indexOf(key) > -1) {\n      proxyOptions[key] = proxyOptions[key].toLowerCase() === 'true';\n    }\n  });\n}\n\nif (!argv.s && !argv.silent) {\n  logger = {\n    info: console.log,\n    request: function (req, res, error) {\n      var date = utc ? new Date().toUTCString() : new Date();\n      var ip = argv['log-ip']\n          ? req.headers['x-forwarded-for'] || '' +  req.connection.remoteAddress\n          : '';\n      if (error) {\n        logger.info(\n          '[%s] %s \"%s %s\" Error (%s): \"%s\"',\n          date, ip, chalk.red(req.method), chalk.red(req.url),\n          chalk.red(error.status.toString()), chalk.red(error.message)\n        );\n      }\n      else {\n        logger.info(\n          '[%s] %s \"%s %s\" \"%s\"',\n          date, ip, chalk.cyan(req.method), chalk.cyan(req.url),\n          req.headers['user-agent']\n        );\n      }\n    }\n  };\n}\nelse if (chalk) {\n  logger = {\n    info: function () {},\n    request: function () {}\n  };\n}\n\n// CHANGE: Always show logger info\nif (!logger) logger = {};\nlogger.info = console.log;\n// END CHANGE\n\nif (version) {\n  logger.info('v' + require('../package.json').version);\n  process.exit();\n}\n\nif (!port) {\n  // CHANGE: Start finding ports beginning at port 3000\n  portfinder.basePort = 3000;\n  // END CHANGE\n  portfinder.getPort(function (err, port) {\n    if (err) { throw err; }\n    listen(port);\n  });\n}\nelse {\n  listen(port);\n}\n\nfunction listen(port) {\n  var options = {\n    root: argv._[0],\n    cache: argv.c,\n    timeout: argv.t,\n    showDir: argv.d,\n    autoIndex: argv.i,\n    gzip: argv.g || argv.gzip,\n    brotli: argv.b || argv.brotli,\n    robots: argv.r || argv.robots,\n    ext: argv.e || argv.ext,\n    logFn: logger.request,\n    proxy: proxy,\n    proxyOptions: proxyOptions,\n    showDotfiles: argv.dotfiles,\n    mimetypes: argv.mimetypes,\n    username: argv.username || process.env.NODE_HTTP_SERVER_USERNAME,\n    password: argv.password || process.env.NODE_HTTP_SERVER_PASSWORD\n  };\n\n  if (argv.cors) {\n    options.cors = true;\n    if (typeof argv.cors === 'string') {\n      options.corsHeaders = argv.cors;\n    }\n  }\n\n  if (proxy) {\n    try {\n      new url.URL(proxy)\n    }\n    catch (err) {\n      logger.info(chalk.red('Error: Invalid proxy url'));\n      process.exit(1);\n    }\n  }\n\n  if (tls) {\n    options.https = {\n      cert: argv.C || argv.cert || 'cert.pem',\n      key: argv.K || argv.key || 'key.pem',\n      passphrase: sslPassphrase,\n    };\n    try {\n      fs.lstatSync(options.https.cert);\n    }\n    catch (err) {\n      logger.info(chalk.red('Error: Could not find certificate ' + options.https.cert));\n      process.exit(1);\n    }\n    try {\n      fs.lstatSync(options.https.key);\n    }\n    catch (err) {\n      logger.info(chalk.red('Error: Could not find private key ' + options.https.key));\n      process.exit(1);\n    }\n  }\n\n  var server = httpServer.createServer(options);\n  server.listen(port, host, function () {\n    var protocol = tls ? 'https://' : 'http://';\n\n    logger.info([\n      chalk.yellow('Starting up http-server, serving '),\n      chalk.cyan(server.root),\n      tls ? (chalk.yellow(' through') + chalk.cyan(' https')) : ''\n    ].join(''));\n\n    logger.info([chalk.yellow('\\nhttp-server version: '), chalk.cyan(require('../package.json').version)].join(''));\n\n    logger.info([\n      chalk.yellow('\\nhttp-server settings: '),\n      ([chalk.yellow('CORS: '), argv.cors ? chalk.cyan(argv.cors) : chalk.red('disabled')].join('')),\n      ([chalk.yellow('Cache: '), argv.c ? (argv.c === '-1' ? chalk.red('disabled') : chalk.cyan(argv.c + ' seconds')) : chalk.cyan('3600 seconds')].join('')),\n      ([chalk.yellow('Connection Timeout: '), argv.t === '0' ? chalk.red('disabled') : (argv.t ? chalk.cyan(argv.t + ' seconds') : chalk.cyan('120 seconds'))].join('')),\n      ([chalk.yellow('Directory Listings: '), argv.d ? chalk.red('not visible') : chalk.cyan('visible')].join('')),\n      ([chalk.yellow('AutoIndex: '), argv.i ? chalk.red('not visible') : chalk.cyan('visible')].join('')),\n      ([chalk.yellow('Serve GZIP Files: '), argv.g || argv.gzip ? chalk.cyan('true') : chalk.red('false')].join('')),\n      ([chalk.yellow('Serve Brotli Files: '), argv.b || argv.brotli ? chalk.cyan('true') : chalk.red('false')].join('')),\n      ([chalk.yellow('Default File Extension: '), argv.e ? chalk.cyan(argv.e) : (argv.ext ? chalk.cyan(argv.ext) : chalk.red('none'))].join(''))\n    ].join('\\n'));\n\n    logger.info(chalk.yellow('\\nAvailable on:'));\n\n    if (argv.a && host !== '0.0.0.0') {\n      logger.info(`  ${protocol}${host}:${chalk.green(port.toString())}`);\n    } else {\n      Object.keys(ifaces).forEach(function (dev) {\n        ifaces[dev].forEach(function (details) {\n          if (details.family === 'IPv4') {\n            logger.info(('  ' + protocol + details.address + ':' + chalk.green(port.toString())));\n          }\n        });\n      });\n    }\n\n    if (typeof proxy === 'string') {\n      if (proxyOptions) {\n        logger.info('Unhandled requests will be served from: ' + proxy + '. Options: ' + JSON.stringify(proxyOptions));\n      }\n      else {\n        logger.info('Unhandled requests will be served from: ' + proxy);\n      }\n    }\n\n    logger.info('Hit CTRL-C to stop the server');\n    if (argv.o) {\n      const openHost = host === '0.0.0.0' ? '127.0.0.1' : host;\n      let openUrl = `${protocol}${openHost}:${port}`;\n      if (typeof argv.o === 'string') {\n        openUrl += argv.o[0] === '/' ? argv.o : '/' + argv.o;\n      }\n      logger.info('Open: ' + openUrl);\n      opener(openUrl);\n    }\n\n    // Spacing before logs\n    if (!argv.s) logger.info();\n  });\n}\n\nif (process.platform === 'win32') {\n  require('readline').createInterface({\n    input: process.stdin,\n    output: process.stdout\n  }).on('SIGINT', function () {\n    process.emit('SIGINT');\n  });\n}\n\nprocess.on('SIGINT', function () {\n  logger.info(chalk.red('http-server stopped.'));\n  process.exit();\n});\n\nprocess.on('SIGTERM', function () {\n  logger.info(chalk.red('http-server stopped.'));\n  process.exit();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/doc/http-server.1",
    "content": ".TH http-server 1 \"April 2020\" GNU \"http-server man page\"\n\n.SH NAME\nhttp-server \\- a simple zero-configuration command-line http server\n\n.SH SYNOPSIS\n.B http-server\n[\\fIPATH\\fR]\n[\\fIOPTIONS\\fR]\n\n.SH DESCRIPTION\n\\fBhttp-server\\fR is a simple, zero-configuration command-line http server. It is powerful enough for production usage, but it's simple and hackable enough to be used for testing, local development, and learning.\n\n.SH OPTIONS\n\n.TP\n.BI [\\fIPATH\\fR]\nThe directory to serve.\nDefaults to ./public if it exists, and ./ otherwise.\n\n.TP\n.BI \\-p \", \" \\-\\-port \" \" \\fIPORT\\fR\nPort to use. If 0, look for the first available port, starting at 8080.\nDefault is 8080.\n\n.TP\n.BI \\-a \" \" \\fIADDRESS\\fR\nAddress to use.\nDefault is 0.0.0.0.\n\n.TP\n.BI \\-d\nShow directory listings.\nDefault is true.\n\n.TP\n.BI \\-i\nDisplay autoIndex.\nDefault is true.\n\n.TP\n.BI \\-g \", \" \\-\\-gzip\nServe gzip files when possible.\nDefault is false.\n\n.TP\n.BI \\-b \", \" \\-\\-brotli\nServe brotli files when possible.\nIf both brotli and gzip are enabled, brotli takes precedence.\nDefault is false.\n\n.TP\n.BI \\-e \", \" \\-\\-ext \" \" \\fIEXTENSION\\fR\nDefault file extension is none is provided.\n\n.TP\n.BI \\-s \", \" \\-\\-silent\nSuppress log messages from output.\n\n.TP\n.BI \\-\\-cors \" \" [\\fIHEADERS\\fR]\nEnable CORS via the \"Access-Control-Allow-Origin\" header.\nOptionally provide CORS headers list separated by commas.\n\n.TP\n.BI \\-o \" \" [\\fIPATH\\fR]\nOpen default browser window after starting the server.\nOptionally provide a URL path to open the browser window to.\n\n.TP\n.BI \\-c \" \" \\fITIME\\fR\nCache time (max-age) in seconds.\nTo disable caching, use \\-c \\-1.\nDefault is 3600.\n\n.TP\n.BI \\-U \", \" \\-\\-utc\nUse UTC time format in log messages.\n\n.TP\n.BI \\-\\-log\\-ip\nEnable logging of the client IP address.\n\n.TP\n.BI \\-P \", \" \\-\\-proxy\nFallback proxy if the request cannot be resolved.\n\n.TP\n.BI \\-\\-proxy\\-options\nPass proxy options using nested dotted objects.\n\n.TP\n.BI \\-\\-username \" \" \\fIUSERNAME\\fR\nUsername for basic authentication.\nCan also be specified with the environment variable NODE_HTTP_SERVER_USERNAME.\nDefaults to none.\n\n.TP\n.BI \\-\\-password \" \" \\fIPASSWORD\\fR\nPassword for basic authentication.\nCan also be specified with the environment variable NODE_HTTP_SERVER_PASSWORD.\nDefaults to none.\n\n.TP\n.BI \\-S \", \" \\-\\-tls \", \" \\-\\-ssl\nEnable https.\n\n.TP\n.BI \\-C \", \" \\-\\-cert \" \" [\\fIFILE\\fR]\nPath to SSL certificate file.\nIf not specified, uses cert.pem.\n\n.TP\n.BI \\-K \", \" \\-\\-key \" \" [\\fIFILE\\fR]\nPath to SSL key file.\nIf not specified, uses key.pem.\nPassphrase will be read from NODE_HTTP_SERVER_SSL_PASSPHRASE (if set)\n\n.TP\n.BI \\-r \", \" \\-\\-robots \" \" [\\fIUSER\\-AGENT\\fR]\nRespond to /robots.txt request.\nIf not specified, uses \"User-agent: *\\\\nDisallow: /]\"\n\n.TP\n.BI \\-\\-no\\-dotfiles\nDo not show dotfiles.\n\n.TP\n.BI \\-h \", \" \\-\\-help\nPrint usage and exit.\n\n.TP\n.BI \\-v \", \" \\-\\-version\nPrint version and exit.\n\n.SH FILES\n.B index.html\nwill be served as the default file to any directory requests.\n\n.B 404.html\nwill be served if a file is not found. This can be used for SPA hosting to serve the entry page.\n\n.SH COPYING\nCopyright (c) 2011-2022 Charlie Robbins, Marak Squires, and the Contributors.\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n.SH VERSION\nVersion 0.12.2\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/aliases.json",
    "content": "{\n  \"autoIndex\": [ \"autoIndex\", \"autoindex\" ],\n  \"showDir\": [ \"showDir\", \"showdir\" ],\n  \"showDotfiles\": [\"showDotfiles\", \"showdotfiles\"],\n  \"humanReadable\": [ \"humanReadable\", \"humanreadable\", \"human-readable\" ],\n  \"hidePermissions\": [\"hidePermissions\", \"hidepermissions\", \"hide-permissions\"],\n  \"si\": [ \"si\", \"index\" ],\n  \"handleError\": [ \"handleError\", \"handleerror\" ],\n  \"cors\": [ \"cors\", \"CORS\" ],\n  \"headers\": [ \"H\", \"header\", \"headers\" ],\n  \"contentType\": [ \"contentType\", \"contenttype\", \"content-type\" ],\n  \"mimeType\": [\n    \"mimetype\",\n    \"mimetypes\",\n    \"mimeType\",\n    \"mimeTypes\",\n    \"mime-type\",\n    \"mime-types\",\n    \"mime-Type\",\n    \"mime-Types\"\n  ],\n  \"weakEtags\": [ \"weakEtags\", \"weaketags\", \"weak-etags\" ],\n  \"weakCompare\": [\n    \"weakcompare\",\n    \"weakCompare\",\n    \"weak-compare\",\n    \"weak-Compare\"\n  ],\n  \"handleOptionsMethod\": [\n    \"handleOptionsMethod\",\n    \"handleoptionsmethod\",\n    \"handle-options-method\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/defaults.json",
    "content": "{\n  \"autoIndex\": true,\n  \"showDir\": true,\n  \"showDotfiles\": true,\n  \"humanReadable\": true,\n  \"hidePermissions\": false,\n  \"si\": false,\n  \"cache\": \"max-age=3600\",\n  \"cors\": false,\n  \"gzip\": true,\n  \"brotli\": false,\n  \"defaultExt\": \".html\",\n  \"handleError\": true,\n  \"contentType\": \"application/octet-stream\",\n  \"weakEtags\": true,\n  \"weakCompare\": true,\n  \"handleOptionsMethod\": false\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/etag.js",
    "content": "'use strict';\n\nmodule.exports = (stat, weakEtag) => {\n  let etag = `\"${[stat.ino, stat.size, stat.mtime.toISOString()].join('-')}\"`;\n  if (weakEtag) {\n    etag = `W/${etag}`;\n  }\n  return etag;\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/index.js",
    "content": "#! /usr/bin/env node\n\n'use strict';\n\nconst path = require('path');\nconst fs = require('fs');\nconst url = require('url');\nconst { Readable } = require('stream');\nconst buffer = require('buffer');\nconst mime = require('mime');\nconst urlJoin = require('url-join');\nconst showDir = require('./show-dir');\nconst version = require('../../package.json').version;\nconst status = require('./status-handlers');\nconst generateEtag = require('./etag');\nconst optsParser = require('./opts');\nconst htmlEncodingSniffer = require('html-encoding-sniffer');\n\nlet httpServerCore = null;\n\nfunction decodePathname(pathname) {\n  const pieces = pathname.replace(/\\\\/g, '/').split('/');\n\n  const normalized = path.normalize(pieces.map((rawPiece) => {\n    const piece = decodeURIComponent(rawPiece);\n\n    if (process.platform === 'win32' && /\\\\/.test(piece)) {\n      throw new Error('Invalid forward slash character');\n    }\n\n    return piece;\n  }).join('/'));\n  return process.platform === 'win32'\n    ? normalized.replace(/\\\\/g, '/') : normalized;\n}\n\nconst nonUrlSafeCharsRgx = /[\\x00-\\x1F\\x20\\x7F-\\uFFFF]+/g;\nfunction ensureUriEncoded(text) {\n  return text\n  return String(text).replace(nonUrlSafeCharsRgx, encodeURIComponent);\n}\n\n// Check to see if we should try to compress a file with gzip.\nfunction shouldCompressGzip(req) {\n  const headers = req.headers;\n\n  return headers && headers['accept-encoding'] &&\n    headers['accept-encoding']\n    .split(',')\n    .some(el => ['*', 'compress', 'gzip', 'deflate'].indexOf(el.trim()) !== -1)\n  ;\n}\n\nfunction shouldCompressBrotli(req) {\n  const headers = req.headers;\n\n  return headers && headers['accept-encoding'] &&\n    headers['accept-encoding']\n    .split(',')\n    .some(el => ['*', 'br'].indexOf(el.trim()) !== -1)\n  ;\n}\n\nfunction hasGzipId12(gzipped, cb) {\n  const stream = fs.createReadStream(gzipped, { start: 0, end: 1 });\n  let buffer = Buffer.from('');\n  let hasBeenCalled = false;\n\n  stream.on('data', (chunk) => {\n    buffer = Buffer.concat([buffer, chunk], 2);\n  });\n\n  stream.on('error', (err) => {\n    if (hasBeenCalled) {\n      throw err;\n    }\n\n    hasBeenCalled = true;\n    cb(err);\n  });\n\n  stream.on('close', () => {\n    if (hasBeenCalled) {\n      return;\n    }\n\n    hasBeenCalled = true;\n    cb(null, buffer[0] === 31 && buffer[1] === 139);\n  });\n}\n\n\nmodule.exports = function createMiddleware(_dir, _options) {\n  let dir;\n  let options;\n  if (typeof _dir === 'string') {\n    dir = _dir;\n    options = _options;\n  } else {\n    options = _dir;\n    dir = options.root;\n  }\n\n  const root = path.join(path.resolve(dir), '/');\n  const opts = optsParser(options);\n  const cache = opts.cache;\n  const autoIndex = opts.autoIndex;\n  const baseDir = opts.baseDir;\n  let defaultExt = opts.defaultExt;\n  const handleError = opts.handleError;\n  const headers = opts.headers;\n  const weakEtags = opts.weakEtags;\n  const handleOptionsMethod = opts.handleOptionsMethod;\n\n  opts.root = dir;\n  if (defaultExt && /^\\./.test(defaultExt)) {\n    defaultExt = defaultExt.replace(/^\\./, '');\n  }\n\n  // Support hashes and .types files in mimeTypes @since 0.8\n  if (opts.mimeTypes) {\n    try {\n      // You can pass a JSON blob here---useful for CLI use\n      opts.mimeTypes = JSON.parse(opts.mimeTypes);\n    } catch (e) {\n      // swallow parse errors, treat this as a string mimetype input\n    }\n    if (typeof opts.mimeTypes === 'string') {\n      mime.load(opts.mimeTypes);\n    } else if (typeof opts.mimeTypes === 'object') {\n      mime.define(opts.mimeTypes);\n    }\n  }\n\n  function shouldReturn304(req, serverLastModified, serverEtag) {\n    if (!req || !req.headers) {\n      return false;\n    }\n\n    const clientModifiedSince = req.headers['if-modified-since'];\n    const clientEtag = req.headers['if-none-match'];\n    let clientModifiedDate;\n\n    if (!clientModifiedSince && !clientEtag) {\n      // Client did not provide any conditional caching headers\n      return false;\n    }\n\n    if (clientModifiedSince) {\n      // Catch \"illegal access\" dates that will crash v8\n      try {\n        clientModifiedDate = new Date(Date.parse(clientModifiedSince));\n      } catch (err) {\n        return false;\n      }\n\n      if (clientModifiedDate.toString() === 'Invalid Date') {\n        return false;\n      }\n      // If the client's copy is older than the server's, don't return 304\n      if (clientModifiedDate < new Date(serverLastModified)) {\n        return false;\n      }\n    }\n\n    if (clientEtag) {\n      // Do a strong or weak etag comparison based on setting\n      // https://www.ietf.org/rfc/rfc2616.txt Section 13.3.3\n      if (opts.weakCompare && clientEtag !== serverEtag\n          && clientEtag !== `W/${serverEtag}` && `W/${clientEtag}` !== serverEtag) {\n        return false;\n      }\n      if (!opts.weakCompare && (clientEtag !== serverEtag || clientEtag.indexOf('W/') === 0)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return function middleware(req, res, next) {\n    // Figure out the path for the file from the given url\n    const parsed = url.parse(req.url);\n    let pathname = null;\n    let file = null;\n    let gzippedFile = null;\n    let brotliFile = null;\n\n    try {\n      decodeURIComponent(req.url); // check validity of url\n      pathname = decodePathname(parsed.pathname);\n    } catch (err) {\n      status[400](res, next, { error: err });\n      return;\n    }\n\n    file = path.normalize(\n      path.join(\n        root,\n        path.relative(path.join('/', baseDir), pathname)\n      )\n    );\n    // determine compressed forms if they were to exist\n    gzippedFile = `${file}.gz`;\n    brotliFile = `${file}.br`;\n\n    Object.keys(headers).forEach((key) => {\n      res.setHeader(key, headers[key]);\n    });\n\n    if (req.method === 'OPTIONS' && handleOptionsMethod) {\n      res.end();\n      return;\n    }\n\n    // TODO: This check is broken, which causes the 403 on the\n    // expected 404.\n    if (file.slice(0, root.length) !== root) {\n      status[403](res, next);\n      return;\n    }\n\n    if (req.method && (req.method !== 'GET' && req.method !== 'HEAD')) {\n      status[405](res, next);\n      return;\n    }\n\n\n    function serve(stat) {\n      // Do a MIME lookup, fall back to octet-stream and handle gzip\n      // and brotli special case.\n      const defaultType = opts.contentType || 'application/octet-stream';\n      let contentType = mime.lookup(file, defaultType);\n      const range = (req.headers && req.headers.range);\n      const lastModified = (new Date(stat.mtime)).toUTCString();\n      const etag = generateEtag(stat, weakEtags);\n      let cacheControl = cache;\n      let stream = null;\n      if (contentType && isTextFile(contentType)) {\n        if (stat.size < buffer.constants.MAX_LENGTH) {\n          const bytes = fs.readFileSync(file);\n          const sniffedEncoding = htmlEncodingSniffer(bytes, {\n            defaultEncoding: 'UTF-8'\n          });\n          contentType += `; charset=${sniffedEncoding}`;\n          stream = Readable.from(bytes)\n        } else {\n          // Assume text types are utf8\n          contentType += '; charset=UTF-8';\n        }\n      }\n\n      if (file === gzippedFile) { // is .gz picked up\n        res.setHeader('Content-Encoding', 'gzip');\n        // strip gz ending and lookup mime type\n        contentType = mime.lookup(path.basename(file, '.gz'), defaultType);\n      } else if (file === brotliFile) { // is .br picked up\n        res.setHeader('Content-Encoding', 'br');\n        // strip br ending and lookup mime type\n        contentType = mime.lookup(path.basename(file, '.br'), defaultType);\n      }\n\n      if (typeof cacheControl === 'function') {\n        cacheControl = cache(pathname);\n      }\n      if (typeof cacheControl === 'number') {\n        cacheControl = `max-age=${cacheControl}`;\n      }\n\n      if (range) {\n        const total = stat.size;\n        const parts = range.trim().replace(/bytes=/, '').split('-');\n        const partialstart = parts[0];\n        const partialend = parts[1];\n        const start = parseInt(partialstart, 10);\n        const end = Math.min(\n          total - 1,\n          partialend ? parseInt(partialend, 10) : total - 1\n        );\n        const chunksize = (end - start) + 1;\n        let fstream = null;\n\n        if (start > end || isNaN(start) || isNaN(end)) {\n          status['416'](res, next);\n          return;\n        }\n\n        fstream = fs.createReadStream(file, { start, end });\n        fstream.on('error', (err) => {\n          status['500'](res, next, { error: err });\n        });\n        res.on('close', () => {\n          fstream.destroy();\n        });\n        res.writeHead(206, {\n          'Content-Range': `bytes ${start}-${end}/${total}`,\n          'Accept-Ranges': 'bytes',\n          'Content-Length': chunksize,\n          'Content-Type': contentType,\n          'cache-control': cacheControl,\n          'last-modified': lastModified,\n          etag,\n        });\n        fstream.pipe(res);\n        return;\n      }\n\n      // TODO: Helper for this, with default headers.\n      res.setHeader('cache-control', cacheControl);\n      res.setHeader('last-modified', lastModified);\n      res.setHeader('etag', etag);\n\n      // Return a 304 if necessary\n      if (shouldReturn304(req, lastModified, etag)) {\n        status[304](res, next);\n        return;\n      }\n\n      res.setHeader('content-length', stat.size);\n      res.setHeader('content-type', contentType);\n\n      // set the response statusCode if we have a request statusCode.\n      // This only can happen if we have a 404 with some kind of 404.html\n      // In all other cases where we have a file we serve the 200\n      res.statusCode = req.statusCode || 200;\n\n      if (req.method === 'HEAD') {\n        res.end();\n        return;\n      }\n\n      // stream may already have been assigned during encoding sniffing.\n      if (stream === null) {\n        stream = fs.createReadStream(file);\n      }\n\n      stream.pipe(res);\n      stream.on('error', (err) => {\n        status['500'](res, next, { error: err });\n      });\n      stream.on('close', () => {\n        stream.destroy();\n      })\n    }\n\n\n    function statFile() {\n      try {\n        fs.stat(file, (err, stat) => {\n          if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) {\n            if (req.statusCode === 404) {\n              // This means we're already trying ./404.html and can not find it.\n              // So send plain text response with 404 status code\n              status[404](res, next);\n            } else if (!path.extname(parsed.pathname).length && defaultExt) {\n              // If there is no file extension in the path and we have a default\n              // extension try filename and default extension combination before rendering 404.html.\n              middleware({\n                url: `${parsed.pathname}.${defaultExt}${(parsed.search) ? parsed.search : ''}`,\n                headers: req.headers,\n              }, res, next);\n            } else {\n              // Try to serve default ./404.html\n              const rawUrl = (handleError ? `/${path.join(baseDir, `404.${defaultExt}`)}` : req.url);\n              const encodedUrl = ensureUriEncoded(rawUrl);\n              middleware({\n                url: encodedUrl,\n                headers: req.headers,\n                statusCode: 404,\n              }, res, next);\n            }\n          } else if (err) {\n            status[500](res, next, { error: err });\n          } else if (stat.isDirectory()) {\n            if (!autoIndex && !opts.showDir) {\n              status[404](res, next);\n              return;\n            }\n\n\n            // 302 to / if necessary\n            if (!pathname.match(/\\/$/)) {\n              res.statusCode = 302;\n              const q = parsed.query ? `?${parsed.query}` : '';\n              res.setHeader(\n                'location',\n                ensureUriEncoded(`${parsed.pathname}/${q}`)\n              );\n              res.end();\n              return;\n            }\n\n            if (autoIndex) {\n              middleware({\n                url: urlJoin(\n                  encodeURIComponent(pathname),\n                  `/index.${defaultExt}`\n                ),\n                headers: req.headers,\n              }, res, (autoIndexError) => {\n                if (autoIndexError) {\n                  status[500](res, next, { error: autoIndexError });\n                  return;\n                }\n                if (opts.showDir) {\n                  showDir(opts, stat)(req, res);\n                  return;\n                }\n\n                status[403](res, next);\n              });\n              return;\n            }\n\n            if (opts.showDir) {\n              showDir(opts, stat)(req, res);\n            }\n          } else {\n            serve(stat);\n          }\n        });\n      } catch (err) {\n        status[500](res, next, { error: err.message });\n      }\n    }\n\n    function isTextFile(mimeType) {\n      return (/^text\\/|^application\\/(javascript|json)/).test(mimeType);\n    }\n\n    // serve gzip file if exists and is valid\n    function tryServeWithGzip() {\n      try {\n        fs.stat(gzippedFile, (err, stat) => {\n          if (!err && stat.isFile()) {\n            hasGzipId12(gzippedFile, (gzipErr, isGzip) => {\n              if (!gzipErr && isGzip) {\n                file = gzippedFile;\n                serve(stat);\n              } else {\n                statFile();\n              }\n            });\n          } else {\n            statFile();\n          }\n        });\n      } catch (err) {\n        status[500](res, next, { error: err.message });\n      }\n    }\n\n    // serve brotli file if exists, otherwise try gzip\n    function tryServeWithBrotli(shouldTryGzip) {\n      try {\n        fs.stat(brotliFile, (err, stat) => {\n          if (!err && stat.isFile()) {\n            file = brotliFile;\n            serve(stat);\n          } else if (shouldTryGzip) {\n            tryServeWithGzip();\n          } else {\n            statFile();\n          }\n        });\n      } catch (err) {\n        status[500](res, next, { error: err.message });\n      }\n    }\n\n    const shouldTryBrotli = opts.brotli && shouldCompressBrotli(req);\n    const shouldTryGzip = opts.gzip && shouldCompressGzip(req);\n    // always try brotli first, next try gzip, finally serve without compression\n    if (shouldTryBrotli) {\n      tryServeWithBrotli(shouldTryGzip);\n    } else if (shouldTryGzip) {\n      tryServeWithGzip();\n    } else {\n      statFile();\n    }\n  };\n};\n\n\nhttpServerCore = module.exports;\nhttpServerCore.version = version;\nhttpServerCore.showDir = showDir;\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/opts.js",
    "content": "'use strict';\n\n// This is so you can have options aliasing and defaults in one place.\n\nconst defaults = require('./defaults.json');\nconst aliases = require('./aliases.json');\n\nmodule.exports = (opts) => {\n  let autoIndex = defaults.autoIndex;\n  let showDir = defaults.showDir;\n  let showDotfiles = defaults.showDotfiles;\n  let humanReadable = defaults.humanReadable;\n  let hidePermissions = defaults.hidePermissions;\n  let si = defaults.si;\n  let cache = defaults.cache;\n  let gzip = defaults.gzip;\n  let brotli = defaults.brotli;\n  let defaultExt = defaults.defaultExt;\n  let handleError = defaults.handleError;\n  const headers = {};\n  let contentType = defaults.contentType;\n  let mimeTypes;\n  let weakEtags = defaults.weakEtags;\n  let weakCompare = defaults.weakCompare;\n  let handleOptionsMethod = defaults.handleOptionsMethod;\n\n  function isDeclared(k) {\n    return typeof opts[k] !== 'undefined' && opts[k] !== null;\n  }\n\n  function setHeader(str) {\n    const m = /^(.+?)\\s*:\\s*(.*)$/.exec(str);\n    if (!m) {\n      headers[str] = true;\n    } else {\n      headers[m[1]] = m[2];\n    }\n  }\n\n\n  if (opts) {\n    aliases.autoIndex.some((k) => {\n      if (isDeclared(k)) {\n        autoIndex = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.showDir.some((k) => {\n      if (isDeclared(k)) {\n        showDir = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.showDotfiles.some((k) => {\n      if (isDeclared(k)) {\n        showDotfiles = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.humanReadable.some((k) => {\n      if (isDeclared(k)) {\n        humanReadable = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.hidePermissions.some((k) => {\n      if (isDeclared(k)) {\n        hidePermissions = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.si.some((k) => {\n      if (isDeclared(k)) {\n        si = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    if (opts.defaultExt && typeof opts.defaultExt === 'string') {\n      defaultExt = opts.defaultExt;\n    }\n\n    if (typeof opts.cache !== 'undefined' && opts.cache !== null) {\n      if (typeof opts.cache === 'string') {\n        cache = opts.cache;\n      } else if (typeof opts.cache === 'number') {\n        cache = `max-age=${opts.cache}`;\n      } else if (typeof opts.cache === 'function') {\n        cache = opts.cache;\n      }\n    }\n\n    if (typeof opts.gzip !== 'undefined' && opts.gzip !== null) {\n      gzip = opts.gzip;\n    }\n\n    if (typeof opts.brotli !== 'undefined' && opts.brotli !== null) {\n      brotli = opts.brotli;\n    }\n\n    aliases.handleError.some((k) => {\n      if (isDeclared(k)) {\n        handleError = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.cors.forEach((k) => {\n      if (isDeclared(k) && opts[k]) {\n        handleOptionsMethod = true;\n        headers['Access-Control-Allow-Origin'] = '*';\n        headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since';\n      }\n    });\n\n    aliases.headers.forEach((k) => {\n      if (isDeclared(k)) {\n        if (Array.isArray(opts[k])) {\n          opts[k].forEach(setHeader);\n        } else if (opts[k] && typeof opts[k] === 'object') {\n          Object.keys(opts[k]).forEach((key) => {\n            headers[key] = opts[k][key];\n          });\n        } else {\n          setHeader(opts[k]);\n        }\n      }\n    });\n\n    aliases.contentType.some((k) => {\n      if (isDeclared(k)) {\n        contentType = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.mimeType.some((k) => {\n      if (isDeclared(k)) {\n        mimeTypes = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.weakEtags.some((k) => {\n      if (isDeclared(k)) {\n        weakEtags = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.weakCompare.some((k) => {\n      if (isDeclared(k)) {\n        weakCompare = opts[k];\n        return true;\n      }\n      return false;\n    });\n\n    aliases.handleOptionsMethod.some((k) => {\n      if (isDeclared(k)) {\n        handleOptionsMethod = handleOptionsMethod || opts[k];\n        return true;\n      }\n      return false;\n    });\n  }\n\n  return {\n    cache,\n    autoIndex,\n    showDir,\n    showDotfiles,\n    humanReadable,\n    hidePermissions,\n    si,\n    defaultExt,\n    baseDir: (opts && opts.baseDir) || '/',\n    gzip,\n    brotli,\n    handleError,\n    headers,\n    contentType,\n    mimeTypes,\n    weakEtags,\n    weakCompare,\n    handleOptionsMethod,\n  };\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/icons.json",
    "content": "{\n  \"_blank\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWBJREFUeNqEUj1LxEAQnd1MVA4lyIEWx6UIKEGUExGsbC3tLfwJ/hT/g7VlCnubqxXBwg/Q4hQP/LhKL5nZuBsvuGfW5MGyuzM7jzdvVuR5DgYnZ+f99ai7Vt5t9K9unu4HLweI3qWYxI6PDosdy0fhcntxO44CcOBzPA7mfEyuHwf7ntQk4jcnywOxIlfxOCNYaLVgb6cXbkTdhJXq2SIlNMC0xIqhHczDbi8OVzpLSUa0WebRfmigLHqj1EcPZnwf7gbDIrYVRyEinurj6jTBHyI7pqVrFQqEbt6TEmZ9v1NRAJNC1xTYxIQh/MmRUlmFQE3qWOW1nqB2TWk1/3tgJV0waVvkFIEeZbHq4ElyKzAmEXOx6gnEVJuWBzmkRJBRPYGZBDsVaOlpSgVJE2yVaAe/0kx/3azBRO0VsbMFZE3CDSZKweZfYIVg+DZ6v7h9GDVOwZPw/PoxKu/fAgwALbDAXf7DdQkAAAAASUVORK5CYII=\",\n  \"_page\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmhJREFUeNpsUztv01AYPfdhOy/XTZ80VV1VoCqlA2zQqUgwMEErWBALv4GJDfEDmOEHsFTqVCTExAiiSI2QEKJKESVFFBWo04TESRzfy2c7LY/kLtf2d8+555zvM9NaI1ora5svby9OnbUEBxgDlIKiWjXQeLy19/X17sEtcPY2rtHS96/Hu0RvXXLz+cUzM87zShsI29DpHCYt4E6Box4IZzTnbDx7V74GjhOSfwgE0H2638K9h08A3iHGVbjTw7g6YmAyw/BgecHNGGJjvfQhIfmfIFDAXJpjuugi7djIFVI4P0plctgJQ0xnFe5eOO02OwEp2VkhSCnC8WOCdqgwnzFx4/IyppwRVN+XYXsecqZA1pB48ekAnw9/4GZx3L04N/GoTwEjX4cNH5vlPfjtAIYp8cWrQutxrC5Mod3VsXVTMFSqtaE+gl9dhaUxE2tXZiF7nYiiatJ3v5s8R/1yOCNLOuwjkELiTbmC9dJHpIaGASsDkoFQGJQwHWMcHWJYOmUj1OjvQotuytt5nHMLEGkCyx6QU384jwkUAd2sxJbS/QShZtg/8rHzzQOzSaFhxQrA6YgQMQHojCUlgnCAAvKFBoXXaHfArSCZDE0gyWJgFIKmvUFKO4MUNIk2a4+hODtDUVuJ/J732AKS6ZtImdTyAQQB3bZN8l9t75IFh0JMUdVKsohsUPqRgnka0tYgggYpCHkKGTsHI5NOMojB4iTICCepvX53AIEfQta1iUCmoTiBmdEri2RgddKFhuJoqb/af/yw/d3zTNM6UkaOfis62aUgddAbnz+rXuPY+Vnzjt9/CzAAbmLjCrfBiRgAAAAASUVORK5CYII=\",\n  \"aac\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNp0Uk1PE0EYftruVlvAUkhVEPoBcsEoLRJBY01MPHjCs3cvogcT/4qJJN5NvHhoohcOnPw4YEGIkCh+oLGBKm3Z7nZ3dme2vjOhTcjiJJvZzPvOM8/HG2q325Dr3kLp7Y1ibpIxjs4KhQBZfvV6s7K5Vb0bjeof5ZlcGysP1a51mifODybvzE8mzCbrAoTDIThMoGXZiZ4YSiurf+Z1XeuCqJ7Oj+sK3jQcNAmg8xkGQ71mYejcAB49vpmeuzJccl0+dUj6KIAvfHCPg3N+uAv4vg9BOxcCmfEzuP/genpmeqhEMgude10Jwm+DuUIyUdTlqu2byoMfX/dRermBeExHsTiWNi3+lMpzRwDki8zxCIATmzbevfmClukiP5NFhJgwkjeRTeLShdOoVJqnAgwkgCAZ6+UdLC9twjQZ8pdzioFkZBHY3q6B3l4dJEEEPOCeD4cYVH7Xsf15F+FImC775INAJBJSkVoWo0QY9YqgiR4ZZzRaGBkdwK3bFxGLRZUfB3Rm2x4x9CGtsUxH9QYkKICDFuLxKAozGZwdTqBRs2FbLlXbiPdECMCHadj/AaDXZNFqedCIvnRcS4UpRo7+hC5zUmw8Ope9wUFinvpmZ7NKt2RTmB4hKZo6n8qP4Oq1HBkKlVYAQBrUlziB0XQSif4YmQhksgNIJk9iaLhPaV9b/Um+uJSCdzyDbGZQRSkvjo+n4JNxubGUSsCj+ZCpODYjkGMAND2k7exUsfhkCd+29yguB88Wl7FW/o6tT7/gcXqAgGv7hhx1LWBireHVn79YP6ChQ3njb/eFlfWqGqT3H3ZlGIhGI2i2UO/U/wkwAAmoalcxlNA1AAAAAElFTkSuQmCC\",\n  \"ai\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk5JREFUeNpsU01vElEUPTPzZqBAQaSFQiJYUmlKYhoTF41L3Tbu/Q/+AvsX3Bp/gPsuWLrqyqQ7TUxMtAvF1tYGoXwNw7wv7zwYgtKX3Lw379575p5z77O01ohW+/DVh8zj7aYKhflGdG9ZsGwLNydffgVfr19YHvsEa+Zu/nxndob5StQK+dyzvZzyw/gKlmMj7IygFM+xvNcanp4/t5dAomXHBy2UUBOO2MAl/B9/cPb6PULuoHx0WM0e3GvpUOxD3wZAJWutZqYUYmqpSg5OMgH3YQObL59W0/ullpryR3HegkKEqiWBSGV4R3vQ7sIhScTZFTpHx3A215B5sluVY/WWMg7+ATB/lcLsKpTonHzD+OMFEuTz8ikkt9Kwt9YJZB38cpBdoQAZJdLvCGByfoPB6Xdk90pYy6Xg3c/DaWwArg09DaG5lCsUFN0pckZAojdC8m4auBqaALuSgez7VB1RtDSUWOQvUaBLFUzJBMJ2DwmPgd1Jwm0WoSgJfjDvrTKxtwAIyEkAOQ5hU//Zdg5uowDlUNMnwZLW0sSuUuACYhwQRwFvJxupCjEYUUccOkoaKmdOlZnY1TkgAcXAhxhOwLsDsHoN3u4O5JTDfVCH6I9nfjId3gIgSUATFJk/hVevGtOMwS0XwQ3AzB/FrlKg8Q27I2javVoZrFgwD4qVipAEyMlnaFArzaj/D0DiMXlJAFQyK2r8fnMMRZp4lQ1MaSL5tU/1kqAkMCh2tYI+7+kh70cjPbr4bEZ51jZr8TJnB9PJXpz3V4ABAPOQVJn2Q60GAAAAAElFTkSuQmCC\",\n  \"aiff\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAohJREFUeNpkU9tqE1EUXZmZpE3aTBLbJFPTtFURtSCthr7UCyKKFJ/9An3og6Ag/oXfoUj7og9asCBYKT6UIPHaWtpq7NU2aZK5z5wZ9xxMpMwZDuewz9prr32ZiO/7CNaDx3OLt6fOjBqGg/aKRCIInp8+KzfKH7fudnVF58nE16el+/yU2mBFSWZKpWJKVc0OgUBo02K4NDmU6o75Mx+Wdu9IUXFeiOA/pn1xHeYaugVDdzpbp91qGlAKGTx8dC19/Wpxhjnsxj/RRwk85hGJC9d1O6fneWAuoztDYSSLe9OT6SuXB2ccx73Z9uukwDwfls1g0xZIY/Ad/Gnyt/XVfbyYrSDRE8PExHB6/8B6QuaxIwRBFMt0iIAiMx+LCys8jfGJEUik2WpZOD2SQf9oDtVqQwopCAiY66FS/om3b75CVS2MlU7AJ2WiJBCZjZ2dJuRkDJZFwFAR7UCBja3fNfxY2YEoCtRCj9em3Tpds6FpJseGCBxS0GgYGBzqw62p84gnYnAI2CSbSbPhEpFAaE2zODaUAlWWwDoS5DheGqbWpVE/0CmqCY9qkEyINBceb2uADRNQ8bSWAVVzIFKomCQim+0luS4yKYlsHlRyZo7EsSEC23K5vAsXh/H92zZkuRvxeBS5nEx2yp2KqhxPoV5TYS/8CtdApylM9sZQKKSQzyeRTseRV2QoAzIYY8jme5DN9fI0dQoUIjANGydP9VM7PZw9p/AiBpNYrdbw/t0yTJqRtdU9UrfJCUMpSJIgbWzsYe51BcViHzLHeqCRqhZ1YX1tFwNfZBxS9O3NWkAcHqR606k/n/3coKAoV/Y7vQ/OYCZevlrmv3c0GsFh06u3/f4KMABvSWfDHmbK2gAAAABJRU5ErkJggg==\",\n  \"avi\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm1JREFUeNpsU8tu00AUPXZcN0nzTpq2KQ3pAwkIAnWHqCoeexBb+AQ+ABZ8A2s+AIkdm266QUJIFWKBkHg1KpRHi5omJGkbJ3bGHj+4M1EQrTvSyGPPueeec++1EgQBxHp+/9mbyuriRZdxjJaiKBD3W+u1+p9a856max+gDO8ebT+WT20Ezi9NZi/crqadvn2MQBAGfpCOpqNru2937vxPIpY6Onjccx3Twck9MBiSU0ncfHirXFmZX3Md9wqCUwiEVN/zaQfHt0vfbBe5uQyuPVgpl5Zn11ybL4/i/lkICOw5niQRGQShoiqI6Bo43W2ub8n3hRtLZT7gTynk6gkCX9gAOxpAnxhHZDwC1/aI1EViJolu/QhKRMHZ1UX0Gr1USIEn5FPWHy+/wTokkrQOq2vBaHZBN4hmY9Jwfr4An/teiEB45ZZDwDiMhoExT0N+sYDCuUkkplLIlXP4/XEXdo+RUhdhBSSfUwtVTUG8MIHK9QVqI7D/uY6vr2pwmCPrkz+Tk9gwARWQ9WxppbXZhNnpw+ya4A5HZi6L4lIR8WyCcL6sTZiAWjWgAmpxkn5+kqTamK6WkCwmERmLDLvjB0ML9ikWXPLFuozYOap3L8HYN6DHdbS/d5CeTVBndBz87FCBLYkNTyIjBQemnIEsSY5lYrK1+UoWcToLMjEHAyIQ2BCBSx/NVh+ZUhrqmEqBebS3WyhdLg0zt/ugAaIklsSGLHCLa6zDMGhZ2HjyGsnpFPqNHnY2fmHv3R5SMymYbROszSQ2ROAY9qHiofvlxSc5xsKKqqnY3diRE9h4X5d/pzg7lnM4ivsrwADe9Wg/CQJgFAAAAABJRU5ErkJggg==\",\n  \"bmp\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmZJREFUeNp0U+1rUlEY/13v9YV0vq2wttI5CdpL9aEGBZUDv0df668I6n+or0UQ/RuuD0EgVDAZrsKF4AR1a6COKW5qXvXec27PuVeda3bgcF6e8/ye5/d7niMZhgExnK9fbTrm5pbBGMZDkgCyq+VyhTUaT6Eo2ZHJePPWXJXRhez3B1yxmM/QdctXUSCgtV4Py4CvY3cky4e1x5DlLCaGbbzjXDcousG5OQe5HPRSCQPK4PpsEM/XH4WvhS4noeu3JwHGGRiULhsMoKZS4I0GtEIB9mgULJGA0+9DPBpBT7sffvf1W/Lg6OgJufw8C0CRGEXWazUwiiyFQjA8bsjVKjaJzovMD/Q5gxyJhG2cvyeXe2cAuADQNGBmBvLaGuTFRaDfh31lBTWi9pumjbK0B4JQul3vOQpM8JdskOLrdCvDcDjAsjtg5TIkoiKLaokMNR2cnZbqNAMycqG7XbHKR2fMzwO/dsxSwu0BiBJsNsv2LwAJAJCI5ux2gXYbqNetcz5PoORI1cDS0n8AxGW7A+zvEYBKZ2ZlcsEtJLbedMjePBaCTQMghx45ulyWkzxMVUQ2RMQhLfFO16YAqCrixPnm6iqKrRb2W23EfF4cUNSrHg90cr7hDyB33MTnSmUKALVs4uIlROjxg+AsPhGVl3fuIl2tIOB0Ya91gkOi9mxhAal0ekork1ic/kGLBORMxy2K1qS9V1ZQbNThIj2EGh+2tsyOnSai8r1UxMNIBB+LRTTULr4Uds0K1tU/uOLxIrmbNz8XXSrnASSpubG9fbKRyVh1n/zSw29t9oC1b47MfwUYAAUsLiWr4QUJAAAAAElFTkSuQmCC\",\n  \"c\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcxJREFUeNqEUk1rE0EYfmZnkgoJCaGNCehuJTalhJZSUZB66a0HwXsP/Qn+FM+9+hty0LNYCr2I7UVLIW0Fc0hpQpSS7O7MrO9MspuvVV8YMnk/nn2e5x0WRRFMvP/w6WSz5jbi/9NxfP693Wp3DrJCnMW5d28P7a+IE15lufR8o1ZEStwPhkWHsWbrZ+eNEPxsuubEF6m0TBv2Q4liPofXuzveulttSqW2UwH+GjqC0horpSL2njU89+FyMwjlTlxOJMTa9ZQHzDQIjgwdom9zLzfXPc75kbnOAswBJTlC2XrqQRMLxhi442DgB4UFBhgPpm3B5pgBHNUUxQKAHs8pHf3TEuFMetM9IKr/i2mWMwC0SnuSFTG2YKyppwKYVdGO7TFhzBqGIenVeLCUtfURgErucx5ECKREKBU4d3B718PHz6cICGT/1Qs8qpQtGOdyhtGEARWDQFqQJSeDL98u4VbLaKw9IRAJPwjtoJGlVAoDQ800+fRFTTYXcjlcXN2g++s36p5Lzzlve1iEROa8BGH1EbrSAeqrjxEqicHQt8/YSDHMpaNs7wJAp9vvfb287idboAVkRAa5fBYXP9rxO4Mgf0xvPPdHgAEA8OoGd40i1j0AAAAASUVORK5CYII=\",\n  \"cpp\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfJJREFUeNqEUs9PE0EU/mZ2WgqpXX+QIDFdalVslh8NlAOQaOKFAwfvHvwT/FM8e/U/MOnBmwcj8WD0ACEGghIkbU0baaEthe3OTJ0ZWV26q37JZt68ee/b9733yGAwgMbL12/fz+azbnAPY2Nrt7Zfqz9JMrYZ+J4/e2pOFjiciRvXlgp5GzHonXk2o6S8V6k/TjBrM/xGA4MLyeOSPZ8jkx7D+uqCU3Amy1yIYizB36AlCSkwfjWDR4uu40yMl/s+XwjeWThQQ4Z6QNSnSkYykcDXasP4lmfvOZTSF9q8TDBEFPbN5bOqCglCCCxK0TvvZyIV4CIxbgpC+4gm/PUmFCIE8iJPyME/e8Lon9j4HvyHYLjKSwRCSEUgf9+15mFbx8QS6CZJMzJ9SlBCwX3fJDLG4PX7ykcwkmQmJtpEhWa7g1dvNlSwjwelebz7tAXLolh0p/Fxe9fErK2WDFGEgKjxfNjegX0lDTc/heNuF99/HGEslcKXwyoazWNDdlCr6+DoJgrBzdI0T9rYO6yg2zszMlaKM3Dv5OBzbuyZuzm1B16U4Nzz2f3cFOx0Gq12F9cztpExncsqYoaHpSIKtx0zJdVIFpHQ6py29muNk1uTN829o/6SHEnh80HFaE6NjmLnWxUJy1LyTltB3k8BBgBeEeQTiWRskAAAAABJRU5ErkJggg==\",\n  \"css\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk1JREFUeNpsUktvUlEQ/u5DoCLl/RAKKKUvWmIxjYntQtcu3LvwJ/hTXLt16coFC2PsojEaMKZtCqFaTdGmjbS0CG3By+vei3OOBSGXSU7uzNyZ78z3zRF6vR6YvXzzPrMUCyf68bB9zO+VfpROn5hkOdfPPX/2lH/lfiLidztX5mN2jLGG0rKLENIE8liWpdzwP7HvqJqujmvudFU4bFY8Wk1FZsOBtKppd8YCDNu77CZevd3gflfTUFcUhP0ePLibiIR9rjSBpgwAfe4dVcV6dhtep4PH5msylGYLrzeybErcT85FYiH/CyPAf74gObC2vMhzsiRhPhpC6eQUM+EA1pJzILEnjRSuJsju7MJqsUCSRei6Dp3yXqcdGlHZ/rLPazQWGCn8+6YW4pAkEW0SjzUzanWlCa/LgcR0lNfovTEi6lcIkzesnM/R8RlN0INGp3h4DHoDsE5YRvQyiKiRSMzikRAOS2WoqoZWu41K7RwzlOOAVDMMMHhIGvFlRxJFrKYW0ep0IYgC3SDh4b1lTJjNfENsrazOAMAw680mPuW+8lFno1P4XDigRhOiwQAyJK7TbsNS/PaA7giAIAhYz2yRgBIfsVA8wIetPG6FAqhdNrC5u0f+TUyHgyMTDDToEt/ftQsEvW4EPG5OZcrvw0mlimarTXkPfpXPcNlQoGtjACgpryQXsPNtH/nvRXqBJpoKHMzGNkNB0Odls7LNyAYKpUq1dt1iuvB7fRDp9kr9D1xOFwkpoksXusmXaZWFn0coV89r/b6/AgwAkUENaQaRxswAAAAASUVORK5CYII=\",\n  \"dat\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfVJREFUeNqMU01PE1EUPe/Na0uptmlASg3MoiZgCA3hQ8PHAjbqwsS9C3+CP8W1W/+BSReyYUPwI4QAVkAgUEgIbVIg1FZb2pl5b3zv2cHBjsaTTOa+e989OffcGeK6LhTevFv+OJoZHPHOfrz/sl86KpWfhxnLe7lXL1/oN/MSZqonOXU/k0AA6lfNhEFIrlAsP2PMyPtr1AscLpyg5pbtIHErhqez4+awmc45nI8FEvwNaiQuBHqTcSxMjJhmX0/Osp1xr878FxWEzwMinxAzEA4xFIpnOjedHTKpYbxW4U2CP4j8uWxmUKsghMCgFI2mFe9QgHZj0Ba4yhFF+KvGJToIRLuPC/efnjD6+26wB1Lq/xgbSCBXKeWJG/OTdky8cWTdT3C9RmWSGk2XCLlWo4xTNbfN5qh7PpXM72GjZeHt0gpq9QbmH4whGb+NpU/reDQ7hcWVVXxvXOHxzCQopQEKXKEbL6o1ZIcy+LC5g62DY2zsHeC0fA4zndIrHOjvg2XbAQRSfsuy9XxC2qzi/H5B6/68W0AsGkW0KyJPBLbDO0fg3JX/CUM81i0bD6WKe6j9qOPJ3EMcF0tSNsFA6g6alqW+VtZBUL78Vtk+Oqne7U9rs5qOQCjSheJFBeFIFOfVujSUYu3rIc4uqxWv76cAAwCwbvRb3SgYxQAAAABJRU5ErkJggg==\",\n  \"dmg\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAn9JREFUeNpsU01rE1EUPe9lkk47yWTStCmtNhFSWxos2EXVhSsRcasuxYV05V8Qf4DgD/AvCK5EV1oFI7iUBqmCNdDvppq2mWSSzEzy3vPOpFFq+uDNfR/3nnvueXeYUgrBWH1/9/NE7k5BKRnuRcfF2qdnmJq9DeF9tQ+2isuMsxXGWHh/a1mEVsPJSI5fSU3OPEj291IIlN49RXz0KqzEQjIeZS/L5Y/3wPGhDxIM/i/A7fZWgVG0t5EaG0ZUa0JGM8gvPrZmLt58QYwv91mfAqCIE0sAqgumBFITGQzpUYhuF0KfRa7waDyXXXolpVrsh/0tgSLDr5I+wUZo1UHCSkAficPzY6juFSmbRPrC/azjq+fkcO00gAqoU7B0ETKkfWbuCTjTYeq5oESAauexcTScX+ZACWFm0YQSLZKhHdr67+/wW0e0dgjYo3sCEXXybYtBDVSHLp2es3IpsILS24c42lkBg6DzRjgRzCDZ/xr0GNRJwwYiWgzt+hYMawleu0V3wbkT+kUirOc7IGJAz68R/Qak1BAlx3hqASPGBJRXpXOv58dkz3eAgQoOm4hyj57NgZm0MHvpBmK6QdUdg/DAg9cRkhicBSDaKJdeo1bdxmR2DtWDDUxl51HZ+QHTysD3XdQO95Gfv06aeGcAdBrY3Chi8lwO3768QWX7J5q1XWyVSxgajiOXLyBG2hzurRKV9lmt7ISNkkjo6HhNyjoK+2gXRsKE57ZIE2ot10Z1fz0Ue4ABVw3NMjnW14rInh8jTYywoTg3EOFpOM4mXNfH9PQUfGlrAwBOs3I8ljbtuMWhRWzIIPrkn+GcYcgIWEowbZ+0qB334/4IMADESjqbnHbH0gAAAABJRU5ErkJggg==\",\n  \"doc\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAppJREFUeNpsU79PFEEU/mZ39vZu77g7DokcP04BBSUmiEKCSCxs7Ei00JAYO2NlTKyMrX+CJhaGwopSQ0dMtFEsbDRBgiZEQIF4IHcg+2t2Z8eZ5QDlnM1mZ9+8973vfe8NEUJArfSNhzPG0VIfeIiDRSDkw1cWVt3N8rhG6SdSO2Gvn8dfuueqZwuNZqk3Jxg7iNcIfBbgXD6ZC8u5qffzX8eoYeyDxC77uygKhcouovgVUQj1H4YB2ovNuD9+tTTU0zMVBmG/+C8AIYh8F361DL/yE5HnADKYlVdg6MDAmW7cuz5WGuw+PsWDYGAvbL8ECFUt4K7/AHd/I9c7BLaxinD2Ld5Zo7g78RLuRhlBS2cpWbGfStfhfwCEpK0nUjCbWuGsLciSOELPhkq/YgdY3l6HsLfRcLYf+pHNbH0JigEPkLAyMsiEJ7NrqQzM1i7wyhoMZqOhvQs6Z0ovXgdAJACRoulEg5HOwrOroKk0zOY2BDtVpTF0CU6kLkQJXa+BNEoG0lMSsBBKQXWNQktmoGcaYeSaQCIVWOvUYQAiWZFQtk5mSMoSzEILtBrTfEcviC5bwVwQmoh96wA0ic5dB57ngeoaTIPCdb34zDITYNLOOIeVSsW+dQC+7+NSWx6jJ4tY/rWNV7PfcGv0tBoPTM7M4eKJVgx2FTE9u4QPS6x+kHzfw/mOAjarW2hJG3hy8zIceweuY+PRtREMdzbjzcd5WBqPB6xeRGUMGRzHjWvMmxQ7tiOF1JBN6FiTd6Sy9RuFbHpX7MMMqOD088Ii+op5OUAO7jyeRGfBwrF8Cg8mXuDL4neMXzgFwhwZz+hf7a9d5yu3Z6DTPjVQIY9k7erO7Y63Lvc8ErEeyq6JaM6efjai4v4IMABI0DEPqPKkigAAAABJRU5ErkJggg==\",\n  \"dotx\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAndJREFUeNpsU01rE1EUPTPzJk0y+WhMStW2qdVWxUVEQUF0I+4ELQiC7lz4N9z0T+hG9wrdZKUgLqulhrbSag1CKpT0g7RpYjqZmffle5NEKdMHlzfvvXvPPffcO4aUEno9f3Vt4dTp+BXOe+fB0u/NbVpv7h89NU1j1TCM8H7+xY9wJwPHZMbOjRadLAvE/2gToJTiTPx89k+OlVd/LT+0TPIPpO/SzyQk40xCMxBSZ9Z3CoAx5DOjeHT7SbE0XSpzwa8OWB9jINELolQg8AR0EgUKn1PIlIWpkUt4cPNxkTOU12trs8p95RiAXpqaztqou8q6SKQJJmZSqGwsodFsIJk1kcyLYv7IeafcLx4HUNkFF4jFTExMZ0B9DrfD4HUEusYhWs4GPEJg5wly/tBYRIOeDhpEwlS34xcyajdQr3UwOT2MlJOEBRuGNHWp9AQRVXDfQiFV/U5GBSiQ5p6ngBEa5z3fiIhC6g6IMDBwOdoHPkYnHPVyhN0tF7E4QSpr94CEOKELffq+y9Bq+DCJ7rWBoQQBVbPR2O6G4OlsLASJMtCZfQqm0NP5IVWnamdAkUxbyuIYtD7wWegb0YAzAVMkkI6NwPM9xEwHloyDGAmk7AKS9rAS0FKOdugbYeAHPu7OPEM+MY7q3hIKqTFQHmC3XcONc/fxdfMDrk/ew/edzyhvvTmBAddocVRqH3Frahau56qpZDho7+PnTgXffi/gbHYmLEvPSIQBp5JU62sYz13G609zKBXvoOMdYn2zgm7Xg2MVML/4Eu3uPgxhk2gXmNl8v/i2pcXTP8tKdTEcbWLZqDQXwu/l6pfwbEnSGsT9FWAA4mdHv2/9YJ4AAAAASUVORK5CYII=\",\n  \"dwg\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAoFJREFUeNpsU0tPE2EUPfOg006hD4rQh8WgbCSwkKgbF2owujaCiQsXxpX+D6MmbtXEsHCLmIAbE6NLo8YlGIxREIshIqVl+mQ6j8/zFVCb4UtuZua795577rl3FCEE5Bl79vPd5LHYiOP7cH1AUWi85ytmvlas1bJ9E5ryBntH3BpuP/X9i7ovkluuiE8N9SDepaLpCcRCCqa/VDCaMuIjSWP25Upl6n+QDoCz6Yh7KKzh3sI2LuUimPtRRyaqodj0MDloYiITSTi+mH29Wu0AUf9CsZPJoW5czJl48LmCc5kIKo5Al67B9gUGYxrun+5NnMlFZ+GKiQADj2a7AquseLIvjMv5KMaSBu4sWVir+3i8VIVKYSby0UTdFU8Znu8AYBHQgVOJEN5uOXi4UsdawwU0FSf6TaSoyw6DRvukPkgGWpDKy4F8a3jImCrqFDFn6rhKPR4VGnhvOTAY3WLcjifcQAsqRfhUc/Gq1MKNbBh9nIAMDjEppocxs9HCMktfGTCwP/oOBkUKNk/qF3pDYC6Ktk8RfWzyaaoKrqdDaBDwya8W1m0/CPCR3kFy7CcnmWQRUJqcRJFUKtTnPCeR71LwoeYF92CYyVnCFZpCTrRtCv5to2St8SOrKxiPqEEA4fkYT+mI0rdoeUiH1XZVuQPpsIKqw2QmfifTsnOABiWySlH9uU0Hh2MqjsZV5LtpPSoGeN9rKnhBX7ehoOSLIIPfnGONXGMMWN7xUfVldYDbjM3mrh5HCDgS17DhHgDQcIU+XbBxnDTn1x1UuQcJ9iv7l5Q5e1zLGri92EDJFnoAgHtcfr6wbbVXUqq193+0z97n3UJt1+d51n7aHwEGAAHXJoAuZNlzAAAAAElFTkSuQmCC\",\n  \"dxf\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo5JREFUeNpsU0trE1EYPfNMmtdoH2kDNmJbaVFcaBVFpAsREQpFwY0bu3HjQnTj1mVd+ANcuC3qQixmry6E0kWFVIQ+bKy2tbFJm3emyXTujGca+4DkwsedfLnn3POd77uS67rw1vC79ek7fZEzpu3AYUqS9tKQGZPLpa3VXP0uFCmJ/8t9OLC3q/uJbcs5bkIybvdHoMsSbLKENRmvU2WcNnTjRFD7ML1WGSPJHI6sA4KRWMAWVDPxLYex3iCmfpuIh1QsFSyMxQO4GvXHHwOJ6XWSyIck8v6HQsnjAxFc7vTj2VwBg4aG78VdBHQFCk+dbVcxMdwev9gTSEC455sIBOu2KLsoJFzqasP9vjCeDBlYqzn4VXXwarGKZN7Crd5QfLDT/7KpBM84c9fFUFjFp2wdk6smflRsKKqMa7EgfJJ3Ac2OKlit2pEmBTQfngdpnupoU7BUtRGiiTe7fXiRqmK+KuDn6TpvYogmBRJcrOwIJLIWxmM+dOsyLKryQAaJpjJ1/AxrGO3SqdZt7kKZJrzJWBg5piHENuY8vV6e0UOye1TyftvC5l+gZB8SHJTwpSx4q4JeTUKaxhXoR57h7Rn+3iFolJ3xvPhab6HgJG/pJ7jsNP4sUX+jZiCgEsWd/DjH5IrSYpBUAr0yHpzSoXKOP25a6OBhndh0zcX1qIYM2RIbu6i0KiHD5B/GTMHG03kTGpEL7H80wHFOWwhqDZ+SpkBOtCDYJDhZE4gRcKNbYynAqbCMbXpwpVPFbEng0aKJGbYzK1p4wIegLlcEPmdt+DjXbzcsxFlCynRwwVAwW6hjqeg0Zt521SYCWCJvbe0Un29UDx7Hgrs3IEitHXkw3jOv2fl92D8BBgAJeyqBh90ENQAAAABJRU5ErkJggg==\",\n  \"eps\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNp0U01vElEUPfMFCEVArdoSqEA0KV246UJdUJM2Lo2JK/9FjXu3utJqTNz4D9worrsQExbFpAFT0TYp0CZ8pIAiyMfMvBnvm2Foa9uX3Lw7c98979x77hNM0wRf7ufPsq7Z2SQYw2QJAkDxQalUZa3WI8hy3gmZr15bu+z8kILBkCeRCJi6bufKMji0NhwiCQR6iitdatTvQ5LyOLLEiWcYukm3m4Zhmbq1BX13FyoxuH7xAlbvpqKRK1fT0PWbRwEmDEyiy1QVg/V1GO02tO1tKLEY2PIy3KEAlmJRDLXb0TeZL+n9g4MHlLJ5HIBuYnSzXq+DlcsQLk/D9Hoh1WrIUjlPcpsYGQzS3LWoaBhvKeXWMQCDA1D9pt8PaXERUjwOjEZQFhZQp9L2yERiqYRCkPt/z58ogTGqHQLE1BLgUmC6XGD5AlipBIFKkbhanKHGYLBDqQ4ZED0OAbfLlo8OIxwGvhVgyTHlA3xkomjH/gegBgDURMv6faDbBZpN+/tHkUApkdTA/PwZAPxntwdUyjYA/+ZMqJHjLgM9iv/6zRt2GgMaIE21aVIjnSm0DGPfmhzyde0UAE2Dj+p7urKCPvkZku9eJILOSMUnkvVhIo7GYIB3xSKYdhoA1erXGVKXpvFxZwdBonnD68PQ7YEwM4O4xwMPxc8RYE87g4FIcz+kvfmnA0YzIJIy77/m0OCqsTkkCTysKPjJG3viLei63Gm3kCO6UWqcMejjxecMPmxsoFKtYop6UNirYL9Wtc5OHqzznIXHq1na7OfMJROcK8a6O7MjW7nfzZdrd7jzT4ABACh3NGsh3GcdAAAAAElFTkSuQmCC\",\n  \"exe\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo1JREFUeNp0k8tPE1EUxr+ZzvRJO62lUAQaKIQ0FVJFjBBdoIkrDDHuXJi4NnHtX+HCjW408Q/QmHTRaCRRohIJifgiiBICTQu29mHfnc7MHc+MlECKdxZz595zf+c737nD6boOYzxJLC6Nhwej7e/24HkO779s7G6mMjcEwfKZ21+/d+em+RbagaFev28qEpZwzKg3ZckqCPH1nfS8hScIdyhBe6JqTG3PfyTTeLrwFhvbKdy9/xi5QglXL0yGJsKDccZY7LDIAwWHpSferWBh+RN8ni4UylVER8MY6PHj0uSpUK0hxzfTmWsUtnoEwO3rer64jEyxim6/Hy67DXaHExvJX3jw7CX8XjfORUdDlOohhU4fAVjILCPbm9V1yIqK2FgYt+ZmsZcv4lH8Nb5upXD7+hVMjIRQa8qeDg8UTYPU5cTcxSk4nS709XTD53ZhpD+IYMAPj+TBz93fZiz5oHV4AP1fGdlyHZIkIZkrI7GyhnK9CZXy+Aig6p1+HQAY003AcF8AVtGGfLWG9XTO4MLZ5cL0WAixoT4zVmPHADSiMo3hzHA/xgeDWFjbNg8H3A7kKnX0koEcPdTu/ylgRGZgOjNv38zoSXC8BZJDRKOlwGEV0VJVGM0y4joAPO1spXbx6sNHeD1uRIYGUCxVSRlDt1fC8rfvcDnsmJ+dOaLgoAs6AVLZPJJ7WdhEkUyT8GJpBflSBcVKDTvpDBw2GzQqQT1OgaZqUOhtFQUTUKnVTVWNpgy51YLVKph7sqKYkA4A1ScEfT66vm5kC3+ofh6Xz59FQ5bpkvE4QW3M5Apoyorhl9ABIKnFgNdTOh2NkJG6WSf9eRBJtmFwLDJmriUzeaOkYvvcXwEGAIVNH6cDA1DkAAAAAElFTkSuQmCC\",\n  \"flv\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmtJREFUeNpsUl1PE0EUPbssLYUCXdpaC9gWoSTgAyFigiRGY+KjvuuTr/4A44MP/gx/gMYfwIsan0RjIjGiJIZgSIGFIoXSD0t3Z3dnd70zpITazuZmJzP3nnvumaMEQQCx3jx69SV3a3KWMxetpSgKxP3m242Do43SQy2k/YRydvds67n8a63k+FRSn7l/bdg5tdsAuM3he/5weDC8vLdqPLgIIpba2niux52mg//DqlsYSg3iztO7mczN3DJ3+ByCLgCBH4hOFEF7cDpzPCRyOpaeLGXSc2PL3HbnW3XaRQCPEgWI2MsRVAVqrwbX9bHxbhOKpiJ/bzpDOr2k68V2BtRNzMtqDEqPejY/4zSGjb54BM0mQ8k4xsDoIMauXxnqYOD7PmwScP31d0SS/eAuh1lrolFpIBQNQw2pqJdqsAlIceB1AJCIkkE/FZskXDQVRXw6IYHiE0nBEcaPXSSvJnGwWkQXAE4acAhbxPMJpOdHweoMhc9b2F8zwKizbdlyPLVH7QLg+JKBYzoorxzjz3oRzUoToaEw9KyO8XQW5AE5jrFT6AbAYVVNxCZ0Ka3So+DSTAoDiej5ywTySbls1OEDobhFlMcXxrHw+AbINEjNXgb7y6BndLhk8cRkHHbD7g4gEhiJFxsdhrDqaamBaDKKerGGSKwPI9kR9EZCaNA5ubE7A5s8IFhsrxQkgJhZoa/06xC5xRz2v+3BOjFlbqcGlquxsondT9vY+2pAJdeZR6fI355CgQCN2A4O1w7gkQ7cdLUOAKdhV6uFSv3kd/n8mT68eC8dKWLnY4FsfeZQh7nVVt0/AQYAsf5g+SvepeQAAAAASUVORK5CYII=\",\n  \"gif\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmVJREFUeNp0U0tPE1EU/trplAqlL0laiw40xASByEJIZFGVnSvj1j+gWxNXJq7VrbrwF7h10cSNhMRHojEuACVBKmH6SJQyJeXRxzzv9dyZPiCtN5lMe8853znf953xcc4hztDzZ1+C6fQMHAfd4/MBFG+p6h/n4OAeAoGNToi/eOm+A50LKRaLh6amoty2vVpZdotNXccMEK3LwZxa2bsDSdrAqePv/mLM5tSdMwYBYqyvw9zdhUn/L59P4OGtG8qlZCoH254/DdCdQBCxqZu+ugqnWoW9swN5ehp2NotgIo6bGQWGtaS8+vQ5V9a0u5S+1gfABEilAqdUgm98HDwUQkDT8JXoPPq+BoM5kCYmFT9jryn1+hkAt7heBx8dhbSwACmTAUwTgdlZ/CVKJaLnI1GD8TikZiPSR8Gxib8chH95mZTxgwWHwH7+gFMswqcokIRbjMO2HDCnZ1VvArpjEmnKZc8+cZJJYGsLsMiZ8AgwEqaY6Mb6RQR33JFhGECzCRyfAFXNu9v+RVNRZWIMuDJNuYMAaDycUFGhCOgtuAtFVDA83G5A8TrFDw+F5QMAxAKJJxz2xnW3RPJGbm+rCyjotZetH4DGzaSSeDA3h4Zl4R0JOEZWTpIzF4n/m995bNdqZwB6m0gFft3Ak6vz+KYWwFsGlqIxXItEcDt1ARMEtKdVgZb+fwA0G2C2hXM0ZTZNRcSf0b1pmXi7uYnjI+Lfanm5fRQsK8BIxKcrK7i/uIgP+Tw+FlREqHN5fx/vyU4uHBE6UO4gDWqk/JFaLuMxcXeFk6TuJ90V0HOk1in7J8AAjmgkPfjU+isAAAAASUVORK5CYII=\",\n  \"h\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAbRJREFUeNqMUk1Lw0AQnf0woK0ttVqp0hwqVCl+UBERT94F7x78Cf4Uz179DT14F8WbYHtRkBYRLNqDtdaPZLObuLs1NGlXcWDJZGbey+x7QUEQgIqT07PL5WKhHL5H46J+22q22vsWpbWwdnR4oJ80LNiz2czGUjENhvj4ctIE4Wrj8XmPUlKL9nCYcOFzE9j1OKSTCdjdrtiLdr7KhVgzEvwW6krC92E6k4Kd9bJt57JV5vFK2KfRQRV+RAMkzxglYI1RaDy2dW1rpWRjQo5VGicYIorWVooFvQVCCAjG8Omw1MgG8AM0uSBUDSnCfk/IGCHwf3DCD/7UhOLBrFkDuep/hDUSSCv1iYo4rIfqGwmUSNJjfYbBcQKhZw0aBMA4B48LwBhBt/cON80HmM9NQ6fXg/Wlku4TwmNWDzaQqzHG+0PSKod5cH5Vh2RiAhYKc8DlV1UPSyuFMGygVlMg1/P6BC6DqXQK8jNZDXAYA1f21V34wMXYFaiyVw0rJyzLgs3VMkxOjGtix/V0XWChZ0cI2i/dzvXdfTd0Qf91BMPrhyNzgKfOmxaWypqaDXHfAgwAtCL8XOfF47gAAAAASUVORK5CYII=\",\n  \"hpp\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAehJREFUeNqEUk1v00AUHK/XKf1yZdESVRBXjRSRFqMQVBA5Ic5I3DnwE/gpnLnyG3LgXglx4UDDLZS0RWkDLiRxSusk9u6GXSembmLgWZbX7+2bnZl92mg0goo3b3ffO/ncdvyfjHef6q2Dlvs8Q2ktzr16+SL60jhhZ69bO8X8ClLC7w9XdKJVG8fuM0r1WrJG4gXjgqU1D0MGc2kBTytl+7a9XmWcl1IB/hZKEhccq5aJJ/e3bTu7Wg1CVo7rNLlRhUh4oMnXoDoyhoHGyWmUe+QUbELIa7W8CjAFlMzdzeckCwFN06ATAn8QmDMMMGlMuwWucpoCHNe4jBkAMenjYvRPTyi53JvuwX8AplleAeBcRFrH6rXIxLim9I/pi3QA1RhKaYxdjkN8IwalCMIwWs9ljMkh0wzk+9M7w179C3LZNXxve2h+c3Hu91HeKmD/6zHOLnw83ilB1/V0CeqU3Q81LC/O41b2Btx2N2JVP2riR8eTUxmi0TzBwrKZMsqMoz8MsDh/DWuWhUBKURLKxQIeOMWoptYPnS1c+INZBkwISomOSsmBZS7B+3WOzZvrKGzkMAiGqNy7g+LmRkRfekBnANy2163PZXrSbrQ6vch19Xz8fPDHyL39QzkHBKedXjfu+y3AAGU37INBJto1AAAAAElFTkSuQmCC\",\n  \"html\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmBJREFUeNqEUktPE1EU/mY605a+hhZTBNKRDApNrWIRA4nEBUZdmCgLNi4MK5f+FNdu3bFv1J1EXODCR1JJSMTwpqUP6NiCpe10Zjz3hj5Mm3iSybl37jnf+c53jmDbNpi9eb+6Ftcisea909bWNzNb6dwzSXKkhIt/r14+515qBqmDA8HpqKagh53XaopblpIbe+knDpFAhPab2Dw0TKvRK7lmNODzePBgZlK9oUWSpmVNdpIU8T+jaMsyMaD4MDcZVa+NhJMN00w0n6V2nN3yQgdHWZag+LzYPTomIAtT0THVtPGanmb/BbjwLFkvn2IttYGYplKyDzsHh7gdmyAWfh5zVq0Guhg4RAHFUhmfvq3j134aXo8bd+ITnMFOOovU5jbGRoZwNxFn1cxuAIcDW/sZDjA/c4u+BNxOJyxqaenpI3z88gMfPn9Hv98HQZS6RazW6kjExvFi8TGdDSy/W0Emf4LS6R8sv11BmfzSwkPcm74Jo9Ei0GZgmkw8QCOao8OXcaz/5vSZnPdnp3ApqBBLkWJE0Ci7ASzbIhCLLQ1E0iOkBDh9NpUgiUejo8oNuJwyn0YPABtn51UYFFivG3yBGCNZkuDtc/MW+ZQI3OrYpBaARCKufk3B5XIiWyhiL5ODp8+FfFHH+KiKSqWKUL8fC/NznGlPBmz+24dZjKnD0CJDcMoyW0SqXuMtHBFw7rhIAD1ErNUNafxKBNevapwu65NpEQ4FqXIA+RMd6VwBP3cPSERb6gLIFIq61+UqGWaFdcrVt/lmAuWjAi2aiMFwmOYuIJ/N6M28vwIMAMoNDyg4rcU9AAAAAElFTkSuQmCC\",\n  \"ics\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhRJREFUeNqEUkFPE0EU/mZ2dra7bLNpi2AxQFKalkJrohICiYkXPagXrx78Df4K48GDBzmQePLMhUODNxQ5ciEkJVqDtJGmMWrCATRbd2ecoS5u3aovmezsvu9973vfPiKlhI4XL7c2r5YL81LIELEghLA3u/udxmHnPmfGW/Wuv+LpwwdneRYBx7PeWK0wOYYhcXxyckGV1fdbnbuMsXcklqPRJQxFMKz4RxDCtVO4s3xlRjWoB0FYjlQPEEBieChwKCRGMx5uLtaKs1P5ei8IKlGa/YkXMXYtlTEDlsnw/mMXhBJcqxSK6vlcpa4PEpCooUyIqs5M6hG1o2CUwqA091cFcYLf/sjzcX75EiQIojI9779CTYR4jwTBf+r7GAwh0AxCiL6JMT/04vQ79u8aI2O/7Jzg69o6Go8ewycUahtBpADhHKLnK/eVbkMdtROWIv80NQ2sPhncA9Htwn+9hZG0rY6DzFwJl+7dhs0ZstUy8rduwPS/wd/ehmi3kwq4zTHiWUgXp+EuL8FvNvFl5Rn4xAS86iyI2kY3n0Mv48ByrOQmancdi8I0Kcj3U5iuA29xAelKCUHrEIayzltagG2E4IwkFaQgSC6lYI09iN0d8It5uNV5nG5sgJdKYC0G8WoTOZvBISFNEBxnsuzD3GX4vfDsszzqAu0jkJQDedCGbB6AWg54pYbPo+NGVPdTgAEAqQq70PytIL0AAAAASUVORK5CYII=\",\n  \"iso\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjlJREFUeNp0kstrU0EUxr/k5qbJzdPYpGkpsUJoA2q1oLjTdiGiIC5cuXHlxv9BEOrStTvBnQvRrSAIsejCrlqpsURq2hCJNQ+TNLm5uc/x3MmzJh34mDNnvvnNzOE4GGOwx8+t9XQkfn0VE0Y5/7Z+kHm+dvOhtd3P9c/xwNZh7nWaMYtNUmX/Fct/vlN7/8J5aRRgyzm8xzpRDjGE2aVH4VTqdnoUYg/XkEhmy+Cx3DhA5tMzdFolvg5Mx3Fx9SmH0JIg79Zo3j4GADMIokJTKtjbfAKXU4Y/2NvSfyH75TFOxa9Cmr0XnlPFl5ReOQ6wNMDsoFX6AElqQlNV1KsOuNwS/AGFjEUIDhmn5+/DMM16/9igBowAzFKIswPJr6MjlxFP3sV04gaP7RzMPe6xvWM1gNUBM2UKYlBau3QghGphg29J3gDlLLilWNdD3gkvIIDRhD9yGe2mCV0V4HFXuCxT5Dlv8Dz3sIkAs03FalDxBMQSt9BRBMhNncuO7dyU28c9tnf8C/Q0ZtR4GImeQSj8APLRH772BWcgiFODffCv/t8H9tO0v3RjV7VqkeeXLlzDfvYjj88uXhl4JwIsrYxmLY/M1gYclIvGE9jZfNPrSCD3/QgLyeWTADV6wW9AryIcCkB0u1Aq/oCPumlufoF72vIheaLDr4wCLIOqrYnULA14PSoqpSJEAUilZrD77Sv3LK+cI0+Be8cAbbmAOrob0agtD491LYfkoqvnyZLsWRkA/gkwABL4S3L78XYyAAAAAElFTkSuQmCC\",\n  \"java\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjxJREFUeNp8U01v00AUnNiOEyepQyhQobRBSlVIoRCBEPTAjQsSEneE+An8FM5cuXLNoQduIAE3qopKNJAIIppA2jrOR93aa6/N8yZuUxyxkrXr3ffmzczbTQRBgHC83nj3ca28dD36nx6fvnzrNNrdp4oibyUmey9fPBezEgWVFuYLdyvlPGaMY4fl1aRS+9pqP5ElAkmcnknRwuO+Nyt5u/ETYfyj9WrpZnmpxn2/Ok1Swn/GvtnH5k4TLue4kNfxoFoprRQv1TzOb8cAIu3+ZD7oD/Hm7XuxzqRUNDtdkuLiTmW5tFxceBXlnXgQTAORSMt2oGezUJJJrK9dFWdEH7Ik4dB29LiESeUEJXd7/dAT3L+1ivlCHr8NEzutXTBvbJPPSdO/AH5wysChwM/1HzCGlmAzOrKxu2eCud6Z2Jke2MwThpUXL6Nn2ZAVFTlNw70bK0iRnGAq9qwHtOmTRpsx1NsHyKRVnNPnoMoK9kc2BjbD4vk5JGV5NkBoEPM4FFnCteJFWOS4ntHEfphQyKaFTWFLw704AJ26ZFx/ZEEi3YyY0O1Dmr4EKTUHA8hUnS6siI0DEHLYog+b28RCRuNXR/iQUpPUEQ+NVht6Lodnjx+GXYgDSFRnq97Ed2pXSlXhUSeGhxYc5sKlNXM5DGLR2TMwfZVPAIi+otGNWy1fEZUKeo4qc4ysI+F8VksLIJfYcD9QYgB/DNPMptWBlsnBIS86xmDMTBo/PWd0LB6VZfdEbJT3V4ABAA5HIzlv9dtdAAAAAElFTkSuQmCC\",\n  \"jpg\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU8luUlEY/s4dmMpkWxRopGJNNbiwhk1tItbGtXHr0hcwmvgOdWld6Bu4coXumtREE3ZKu8FgOlC1kIoXtC3jPfdc/8PUIpzkBM7wf+f/hsts24YczuerGUc0moBlYTAYA+i8sbdXtAzjITRtq39kr73s/Gr9DTUYPOeamwvYnHdrdR0SnDebuCbswJGqpX+Uf92Hqm7hzFAG/4TgNr1uCwEJ0trcBC8U0Kb1/PQkHt9JxSLnL6TB+Y2zAIMOJBGLXmtsbEAYBsx8HnqCGKVScAX8uHf5EpqmGXv18VO6VDEe0PXsKABN8+AAgiabmYFNNJTDQ2RUFc8+Z9G0OPR4PKYwvKari0MAgiY/OQGCAajhMNR4nDZMaInrKBGl70SPMScck1NQG3X/CAWLE3/dAWV5hRRVIJxOWNksrP19sFgMqqAebUGYHMI6teq0A9oTVAhqu2sfbYYjsL7lCZ3683gA70T3TK7/B4BNoO020GwB9TpwfAz8LgMtWn/NkV8EHgoB81c7nYwCyBZlEVkHcqMTKFnkmehJTOPvEfCnKi0fAyADJKfXC/h83TaZTJjaa5lANLpOFqAXtlEAorAwO9u5syT5UxLfU0e3o1FMu1x4u7ODYq02BKAMAVSrSNLrK1MhLPj8mNF0vFm+C1ZvwKBwXXE4AGn1WAASazESwUW3BzUSMeJ2o1Aq4sPurvQYSRLwlhRR6mSaYyi0WlpAJrFRx3ouh5/lMt5lv8BLwXp0M4lSpYL17e2uK5wP6lj/c2ZPn2RI+YT8fDvqoyegVLyfG5kBKaQQOfvF2pLc+ifAABiQH3PEc1i/AAAAAElFTkSuQmCC\",\n  \"js\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUQ5ODY5Q0NGMTE4MTFFMTlDRjlDN0VBQTY3QTk0MTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUQ5ODY5Q0RGMTE4MTFFMTlDRjlDN0VBQTY3QTk0MTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRDk4NjlDQUYxMTgxMUUxOUNGOUM3RUFBNjdBOTQxMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFRDk4NjlDQkYxMTgxMUUxOUNGOUM3RUFBNjdBOTQxMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoT8zQ8AAAJdSURBVHjadFNbTxNREP52t7S0bktbKFAvTUVaw60YqkExUTD6oD74qC/yD/wp/gh885XEEI0RAyYQUiMpIBGMkYR6o23abi+73e2uc04v1LROMtnZPTPffvPNHMGyLDB7sbJ2ciUSli3U35smkK9t7x9v7n2dD/g8KUkUwWqeP3vKz23NxJGzgwOx0RC6mSgIo+WKuvP56MeUzy2nJEk8PWsGJVVTuhWbpgmHw47FB7d98Wg4mVWK52o1sxOg3Va3PmFp+Q2PdUquaFUM9/vw+O6cP3bxwm46Xwh1ALR3/vL1e+hGjcc9koScUsTSq3coVDQsXJ3wzo5HEs3clgZNMTVdx1T0Ep7cn6//QRQwMhzA6uZHLD5cIFEFSKIU+G8LK+tb0KsGZKcTJoEyP08AbpcLy6sbPKdQrigdAGaDwWxsDH1uGbliCYIgcM8WFPg8Mq5Pjzdyu4jYbCE44EepXMHuwXe+A8x3KKYxYsjvbUzmlPGpBmYdgI1oYjSMbL4Ao1YXMkcM2Dd2xnbAamPQAqg1GORLZdycmYTdJqFKk2DPR3fmwI4zBDrg9RADqxPAbPBif2WTSB584/3/TGegEOit+DRcvQ4OZJi1LgwIQKVCg2i6nb1I7H3Br3QWqT9pBAP9uDY5xjdSM3RqxeoUkfVnEOW8UkLykERTNXjkM7h3Iw6NNvHw6JjuhAhVrba0+QeALozcI9nQR0VvNxJc/ZmxCNGvIBQcpDG6udA22kyW29HC72wu8yG579ZoiSYuR/ly2+y9CA4NceWLmo717T1i5ULqJNtapL8CDACskxPFZRxLwQAAAABJRU5ErkJggg==\",\n  \"key\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlZJREFUeNpsU11PE0EUPbM7u/2AtJUWU6qiiSYYo5EmmPDCD9AH46sx8cEnja/+CB989z+Y+MKPgMiDsYQACcbaWBBogYD92t2Zud7ZlQZsbzKZ3bl3zj3n3IwgItjYeDO3MlWme0bjUth8e8/fO2tHzx3XqUEk50uft+Ndnhdmc3SlfNPkVZT8Cy600DoIISvVfKYtlvfX1p66XmoIYsMZdjJQWvEFbbsC/S5g2QhSkKUK7rx6OzvzqLpsovAhaAxA3DUBQn2TUFsl7KwTfm4Z9DoO5LW7uPXi9Wxpfn7ZKF09vyPxX2iWcNRkKGZz0mQWKoNs8AVB6x1yRY2pYnc2LLofuXTxMgAlmlXIfngCxNxEzM+DPv6NQa2BygLgZyX6JT83ngHTN5GAL0WSoUQkSQnXkyBh/k0GegTAaldM20sTKvet+yyhIZApECamL0jUSe3oFChx3TopM4TeEQP2gc6BgGIwb4KGNXRhCkMGxgg2kJeybRiZM45D8W61qEAknSmpHStBhywu0nFVupSCTAcM4ECwqapv+NQ6LS9JGALoMIIoPYDjZiEL1xHtbyO39AQUDaA7R1AH23DSeSA4hv5RG/VAhxomPYP8sw9A4TaC9iHkjUWmrtGvbyC18BLe3GP0m3WW4I5hEBEnPIStXzyuFIxb4EkMEJ79Qa/xHbKxCdM7xeCwzUZOjgEwnuzt7qLz6T3cySmQP43uzjeIiTJM6io6W19B/NLCKMVGCzkCoLR/0lrfOI2fNy/huKC1FTsK/rbGNeMRC8dHpHByfu+vAAMAL/0jvAVZQl0AAAAASUVORK5CYII=\",\n  \"less\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjZERjZENTJGMTE4MTFFMUIwOEVERjQ5MTZEMkVBREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjZERjZENTNGMTE4MTFFMUIwOEVERjQ5MTZEMkVBREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGNkRGNkQ1MEYxMTgxMUUxQjA4RURGNDkxNkQyRUFERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNkRGNkQ1MUYxMTgxMUUxQjA4RURGNDkxNkQyRUFERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl1w97IAAAJhSURBVHjahJNLbxJRFMf/wPAIMIxMkUI7tS0VYqlGDLGhjdKkqyZ24cJFN925de+XcONHaHRj4k7TND6SGo1VWwmp2kSLhlqMDbQ87gzPYcY7k4GgoJ6bmdw598zvnvM/95pUVYVma+svcovx8yMnFZHAMJPJBJfDzq5vpX6+/vD5qo/z7DOMBdo/d26t6jFMJ3iY51jBz4M+LP6wxEw40Gy23qYzB3HO7fpmpZCOmfEfa7Xb4NxOrC4lvbPToe2yKE3K1PdPwNOtHdx79ESfq4qKkijB5/XgevIyHxEC24USmewDqD2ABxubaLRkfW6zMqjWGlh7/ByyAtxYnOPnL0Q2+gGGmKRaw8zUBJaTiS5QOO1FJnuIAM8hciaIWHgi8NcSNt+loVDY8JBXh2ojJAR1HbTSNFMUpV8Dxcjg0nSYBrtBxdLbqI1iheCUh9XXNGurAwCdEkb9QyBSFam9TDfoPZ1LUg1BH28IiwEARTVAQOzcFKRaHZpLoa9avY6L1Gfs0c32t4PU6W2lWsV8LAorw0Cs1nXftYWE3qZGqwWHzYp2zzlgetuolVFvtiDLbRRKFTAWCxx2G/KlMtXFhWPqOzsWHJwBx7rxKv2R7mwFz3lw9/5DLC/M4Us2RwV0g3U58XJnF7dvrsBOoX0Abbej/DFKRMKI30fTVGC32WA2m5H9cQQvhYi0vE/7Wdgczn6ARA9QPBrBszcp/XvpyqxebzQ0Tlsq6llxLhe9bD4cFMr9XdjLHpLv+SLGBYHAYiVu1kNOpAaRTWbCejgiw0zGhFGSK1aw+zXbvfK/BBgAPwADAs5GpGsAAAAASUVORK5CYII=\",\n  \"mid\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNpsU01PE1EUPdOZKWUotKUKFLEWkQ1EASGGxGBi4sIVrt27IixN/Cn+CxfVnQsXJiz8IAoqRBGEaMUUWzofnXkz781436QDkjKTyXuZe96595x3rxJFEeTzaKW6dmdpfIoxjuRRFECGn7/4Utvarj/syWgflU5s891qvGoJePJasfBgeSpnW+yEIJVS4DEBx3FzGT2qfvh0tJxOE4mCU0yy8X3BLdODRQTJZ5oMzYaD0UuDePzkbnnx1mjV9/lMp+izBKEIwQMOzvnJGoYhhBDgFKtMjmBl9XZ54WapSjLnknMnEkQYgflCVhKXLt+/dRMy2d5OHdVnPoxeHUtLV8u2w5/S78UzBJwLMC8gAsosIqy9/ga37WNmvgKVKmEkb7JSwI3pIdRq1kBXBZJAUKkb6wd49fIzbJthdn6cIhE0XUWbyP4cmshmdZAE0eUBD6gCN0DtZwM7Xw+RUlVEJCui7CmyPaS94zC06ZMedREERNA6djBWHsS9+9fRS3p9AraOXbhELMlUQju2G2O7JAQENk0XhpHG3MIVlEZzaDbdOKO8jWy/TraGsMmL4L8KTgnIfcfy4JBWeQNp0j10MQtB4EJOg6qFMI/bEH3pGNtF4LOAjHMxO1dGvW4jXzDi7Iw60TB0jJRyONhv4MdunbDneMA6BMPDA6iMFzExcQH9AxkUiwby+QzevtnF2OU8lBT1i8fOa2UO1/FwdGTHE2STHM/14+vlPOz0RxibKPfn9AHXZHBzYx866ZdTKkuVndhHuqenS1h/v4ffvxqyvbUuAtPizZ0Dp7X1fTs+FA9cMnWd4ZG90NOjomVFzeTcPwEGACDGeYddZX86AAAAAElFTkSuQmCC\",\n  \"mp3\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNp0U89PE0EU/ra7XWxpSsFYIbVQf9REFBHkYBRIPJh4wrN3DsZ4MPGP8b/wUCIHEw5EY0w04o9ILcREGmwVgaXbbXdnd2bXNxPahGyczebtzrz3ve99740WRRHkWn5cebu4cH6SMY7e0jRAHr9c3WxsVvcemmbys9yT6+uHJ8oaPefypdPDD5Ymh5w26wMkEho8JtDtuEOZFCrvN/4uJZNGH0T59D58X/C27aFNAL3Xthmsww5GCyN4+uzu+OLtQsUPxPQx6ZMAoQjBAw7O+bEVCMMQgqygs+LFs1h+dGd8bna0QmXO9OL6JYgwAvOFZKKoy3V44CgNfv7Yx8oLH+lUEgvzF8Ydhz+n41snAGRG5gUEwClzhHdvttFxfNyYK0EnJozKK5eGcf1qHo1GOxtjwI+pfvm4g/W1qtJgerYE2SXJSIL9+W0jk0mCShAxDXgQKgbNXxZq35vQKCiKQkSUXdc1+gcch1FHGPmKuIgBCdc66qJQHMG9+1NIpUylxxHtuW6gEiTIu+N4yjdWgty0yTmdNjFzcwKjY0MU7MLt+IjoSad16FoIx3b/A0DZ7FYXnsdpAjUMDOjI5zPgfoBsRodhhGhZHfBBU/nGAGRtxWIOg5lT2NtrI5dL0SB5KJzLodloqXaOEatPGztKq5gG3S5DNjuAK5NjKJfPYKI0okBkSdemCiSgS/rkQNLSePtxBj4LSCwfFtE0krqqX7ZVMnu9XlMXy2l7ME0dzA3iANQyY6vWxC61UY41zTyNcYh6/QCNXQvzi5dR39nHVq1BUyuMGAARsF6tbbe4iKD1r7Om5iFBdmW1SsDflLiuB6sX90+AAQDHAW7dW0YnzgAAAABJRU5ErkJggg==\",\n  \"mp4\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnBJREFUeNpsk99r01AUx79psrTrujVtbceabnZs4DYRHSoMh6Dgq77rn+AfoA/+If4Bok+C0CfxVRDBh+I2NqZzrpS1DVvbtU3SJPcm8SSlsJlecsn9dT73nO85V/B9H0H78OLdt/LDlQ1uMYybIAgI9n99OWxoe83nkiz9hDDae330JvxL48O51Xxm/enNtKPbVwAh0Ec6kYpXat9Pnl2GBC02HrjM5Y7h4P8+7FtIFVJ49OrxUnl7ucIdfhv+BIDv+fBcj7p/tXMPrs2RXVTw4OX2UnFTrXCbbY7tpMsA13FDSDAOQ4gJEGUJLs0PPh9CkESsPrmxxEz2lra3rnpAt3G6adgdQhBpmeLkFodNmsjpOPoXBrQTDcmFFNS7i3MRDzzPCw/vva8ikU+COQxm14BBhvJcHLGpGPTOAJxxeLbrRgAkYujBdH4G5oWJWXUW19YL4XqunAMFhnq1BqWYgaY1MAHASQOiU96zKzkU76mwehaOvx6h9uMv7KFN3RopL4oTAI4HRh4wSl399xla+00YbR3yrIzM9SzSqgJJnoKcklGrH08CcJjnBtLLCsSEGGpSWJvHtDKNoFippsJ0ulIsDDUCCATMlBQkNuahEyiZTcLsmFBKaQxaOk53TlHeKkM70AjAooCghBOk9sKtIvqtPqS4FBaRnJSRX8tj2DOh3lFB5Qw2ZNFK5LRo6w4sKt2ggAzywidAMN/9uIPSZglBLDO5FF3mRD3wHE9qVRvoHrUpfn+UEQK0/7ShtwboHJ6jdH8RZxSC57hSVETb7e5/2u0FxqPHJow+8iZ4lYY2QGu3idhIxO7Y7p8AAwALCGZKEPBGCgAAAABJRU5ErkJggg==\",\n  \"mpg\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNpsU0tPE1EU/ubRdlqmnUBboa0UeUQDiUGCC1+JmrhxoXt/gBvXJi74If4AV0Y3sNKF0YUaICqoIfjgVShEiGF4tDOdO/fOeOaSKtie5GZu7pzz3e/c7ztKGIaI4vn9p+/P3h4e4a6Pv6EoQBDiy7P5rc1P1Xt6XP8M5ejXo6UJ+dWbuemeTGdpvNdiNe9YvQLe4Bi4PmTpRmyq8m71rp74BxKF2twIHvAo+f/l1T2Yp0zceHizfOZa/xRnfBRhG4CQqAYioBWeXDyA8Di6ei1ceXC1XBwrTXHPH2vW6ccBBBMI6BsSUEQzakGL6xB0tvjyBxRNxdCtc2Xf8R9TyaWTDOg2TjfVdw6hqIoE9B2GxkEDWlLH7s4ette2kSp0oDRezrQwCIIA3oGHr0/mKMmE53qo23W4+w5S+Q5ohob9X3tgHgO8ULQACC7gMx9mKQP30EW6mEHpYi8xcJEdzMucjfkKcrTfmqmiFYBxCF/Id+gayKJwoQjHdrA5v4HK7Cq44KjZNWpagaqp7QACks0H9znW365ia24DzoEDozOJbH8eVtGShXHTwNracnsG7q6LzsEuaAlNPm9h7DSSVjLyCMkppDI+GS2StQWA1RlKo0X56n2X+6QHkmkDakxF9WMVqWyK+s/BrthYfvWz1Ug+zUDcjMPMm0h3pxEjFma3CbIuCud7oMc0LL1ZgmElpGJtW3B+15HIGNITrMYIlOH7i0U41NrInREylYbu4R5qQbQBaAh95fVKZCnpQCnb9DrWZyrRERS6NDeUw+yHaXh7rt4C4B8y+9vkwn7kwKNRpDoa9aiFKBYnF+RcREqQ2e1m3R8BBgAy9kz9ysCE6QAAAABJRU5ErkJggg==\",\n  \"odf\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAi5JREFUeNp0UktrU0EU/mbu3FfE1KRRUpWYheALNBURUVy7cy9UkO6KW/+Lbt0IPsFui4gLBbUqFaUuXETUKCYa0jS5yZ2ZO557b5MmTXpgmDPnfOc7jznMGINYPi0de5UvmpORxpjE/kbNqW005DVu8TWw1H758ZfkFgNgJmtyxSPRjJIj0QTW/RDiYGXGb7Dl32/eXrVsd0gSCx9miqC0ooCdp69g5Q/h6OLN0ty5ynIkwzMwUwh2FwMdcbDiCZQXlkqFCpEoPT/wih1YjLInANcD+/Ua9bu3wJlGvrBZCmet2+S6ME5g4oGlZ9A/I70XCDhhDexPNTFmswJBwcnuXkF86VSNZxVu0ukLSGnBcqlnN4HoCQIaIuIv7LUooMOgQ7q75LAAb59B9gCBHSKgqemRr94mMKmD24CfM8nb7THYGQNLpAkUkcb66JyGBFFEWRVL57gFEH5qj8Lxwca2qS3EZaugmzAw24dR/XQgwtsCSBjPIdWbUoE2UJLBnV8Ac/ciWHsK9/glWLnD6K2vgPszsOdOQdfeQ1c/ThKoTgDn9A3KUED/52d45xchZsvorD6Bf/Z60riV3Q9Z/0bbGU1uopYGkfERSQ3VbsMwl0qlqoIARmSoPYXWy0dor79LfBMEEd8jGs/uQ3Yl7PJFNFbuEXiV2riCf88fovXhBbo/vqP3t02/ZYmJFqTkzY160Go9uEMbFK8hR/NrdXtFuUVmnmySVGgO4v4LMAAjRgmO+SJJiQAAAABJRU5ErkJggg==\",\n  \"ods\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAetJREFUeNqMUj1IHEEU/i7u7Z23e8tGgneGQPw3hZDkkhQiSuwMQREba4uUgpVlCrvEQhurkCoWqcQQ0oTAaYKNqJygGEwgHCSB6Knn7eXcdX/GmdHVPWYFP3gw78173/vmvYkQQsAwNvckq96UnyIEh7/d4t7uUd/8y+85P+bXSX4grkhI6nJYPW7LrXpBK2YxiSoShhu4Buq1NPofDeqdrZ3Z4cl7D4J3UtA5VyVAlmJoru9Af2ZAp1lcCQ3nqgiuKmbY3l/BH+MnHM9GVLP0Ww3KNA33CQoQQnL834Fj74PUGkANEIkCSSsa8gQqgYTIcB0PVsXB318GInRiCVWCkpRFAs+j5gKlA4t29Ggh4d0t04FKt9PQqF4UFgumSEA8ApeaElilWbYRVy/lsns/N1QBkxtENF4jxPxcgcB1CZVOrvMteK5IQDtJJIGh++PcX9iYwWjXK37+vP0WdYk0Ht99jtX8JywWFkQChw4tc+cZcvlF7rMze+ubbxN40fMalRMDP/6twaiUeK7wlZ0TD0a5hLTWxo2d45KKprqHKJslTsy209s2wnMFBTYNZjc/oLt9gPvLOx+hxVJIKS2YW5pCbSyJTGMK775O8VyBwDJd2LTDl/X5i8v3S7NVw9vJb51tITDEUwEGANCx2/rXEEFFAAAAAElFTkSuQmCC\",\n  \"odt\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAepJREFUeNqMkz1II1EQx/+7Ca6JkqyYiJ8cKEpAQbBQFDm0sVOsFBS9wt5KOTgEG5twxVlZ+XEnKNiIghYKxx5nwEpIIXaiSAgKGmMi0d23u8+3T7OaZJEMLG9mmPnN/w1vBUopLPNNhRWXHOyDg0nx82TiJtZPlPVoNpftc2cTotcHtxx06kdXpSQ/BvzKESZzIDmAz6y+NojOjpDMZiqRPIgNoFyWM8DrKUV7axO+gcp4g7AzmquAdVNqOgL2z2I4id1B0wgeygOyt/rLL5buLwAIDgA9dY+L+DkuDQOCrkMgBsRglcMOqAGwIstMg8AkGsuZMNUMRMkLqE+QGloglvlA7uIOAKvZajR0qJkUj/XHe0BTIclVKKlrfKsj9qA8gA6wqSJzPaXlr7ky//tdLEUfawsBjExUFGVWbT7AxSa42H2LMfODmvd3wKb7RAMLYwM8nts8xJ/pEe7/3PmP2eGv3D+9usb35W0bINoA7RmjXSHsH0f5Z/mUSZ0Ir2JmsBtD80s8/rGyzWsLFTD5yUQCbfUBHl9d38LvkdDTXIuHVBo0k+bbt06qO+yAPGXwe/cA4wO9PN44jKDG70GougIzi2tQ00ms7/3lpwnBBgjZ37Kkd1Shht5XzBIFl/ufFtniT/lFgAEAU//g6kvdGBMAAAAASUVORK5CYII=\",\n  \"otp\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcJJREFUeNqMkssvA1EUxr+ZjkdbrfFKVD12ErYSRELY2fkH+BMsLcQaSwsrSzZi47EjJEQkEhYkFlhYSVtFpdqOqpk717l3jKZmiC+5mZlzv/s795wzCuccQncz3YeRBj4KHz0/RrOZe2NsZPP20o255zQ3EAxzEAC+6uzTw13G4TFQAakA/CWtIYbY0KBOrx7IvwDQqlHV1o3YxKTOvyAUvfQCfqmA3e4ikyS/zRAKvOot7eoSHEgZIHrCfQAfBqBaKQQDKScQAExd8emBANg+2U2CvNMkkgSqBmrCxFB8mujeoJBWwEqARcssKTAJEGrmaGrjqK1zvNknH4BtyxKl2VUpRxmj5W+x73q9AEaZrR/ND1EJluIpS3i9JQiA+a+hSq8HwJjTsLrRaWitPTCOlhEZn5N75sM1qigmlN+dB3u++Qao5W4TtbEXXIsiszGL4PA00itTsu6XnQWo0TjMTAJqfMDx/ryBJcaVzSNSH4fW0Q+rkIf5rsjRiid7yyN7uoXS3Zn0egE0NiORAN9bQ017D1Lri7CLlP2EDr3Rf7C/itzV2bfXA/igLDaRixfngFhSCooH2xVPCWBlwKcAAwBX1suA6te+hAAAAABJRU5ErkJggg==\",\n  \"ots\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfZJREFUeNqMUk1rE1EUPS8zmabJdDKB2glEwY9ExJYiBUEQpV25qgtBXfgbpEtXuujKf+AfEKRddOdOGHClbYVCvyKWaijT2mhjphk7Sd7Me76ZONp0EsiBYWbOvfe88+69hHOOAE9f3zTVnDKNHvhlsfqPw/rM0ovyWsRFdXJEpDIyRnSlVz0KSkmvabaJeXSJBEhgAJzTDNybmtUnS5Pmg/lrN07H5NM/f13FoMgpXDSuhiIiK3Qi6LUugX7FAbaPPsJqfIHHKCStqRsXVFPQuZgD9BBxjikSiRq41AAkgCQBzVf0+BWEBX7GBm0xgHHUqk1UbBuEcIydzyCZlOI9YEGuDxwduCCitS3Xh3viCZ4jrcq4PJ6DLHd67tjtuAAXib54dCPVEfQ5XIcik/0/2iDeOYz3ceCxrisMi904y0XiMQFfkB7lg6xFHwFxEqUMV0anUNBLWKm8xd3i4zBWOzmASx0UsiW831mA59Xjm+h7HCOygduXHqJatzA7Poey9QnXjTuoVD/j/sRcmDOWLgqnLC5A2wwST+Pn8T629lahSCo291bwu9XA7vcy3m2+gTaUR14thrk9BXasbdiOjSe3nmPpwys0xSi/HpbDd3bIQC6dx/q3ZbRb/j8BEi3Po5cTJpHI9CBNDEa++GyDBN9/BBgAwfDlCVUQaNAAAAAASUVORK5CYII=\",\n  \"ott\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdFJREFUeNqMU89r02AYfpJ0iVm7EqhVOxw7dDBEdpiCE1RoEZRddvUgbIex/Rs7eehppyF4LOzQu4MxwYp0HgShIuwwUVSCVtl0s13afl+SzzcpyZYmyF74eN583/s+PO+PSEIIeJZdrtQVI19Cgmk/Ph39bpllXq82g7sgLxVcyKNZpIx8Uj5u5zSjc9Gov8ZihCRC8D+7On4JczevGeTGSEIC4ctKJtB1DTPXi1iCCEkIm1EFlC2Em0iwtWfinXkIzjiO0jljtDC5TtflGIGUQMB+mfja/oPv2Rx9MMjpMdJxOXyXTwkcwIkewfqQ1QtQNB385zcI14FrtQexsSb6SRysZ4Fbf+F6eHwATc9gJGNAm5iCTL5n/LCVRGADNoeaGoHqyaXj5gqQlTODovcwNk5Aj6wXqV8eCo7EDhMonEHpW+dZC7gUG98D3geo7vkb01h9cAvPdt76OGy1xntUd3bjUxAk3+l2sHJ/FgtrT0MUJNfDSm0bjQ/72Hzxxo+NK+h3B7XRNO4UrwymQtMIkdTBU0m+sBOayLsn8Ka78mQDjx/e87HXPkb1+UsfP37+AmZ1fP/suknBb6nefVQXjl06TxMlJfWKNWr+Kv8TYAAkUueexJF47QAAAABJRU5ErkJggg==\",\n  \"pdf\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmhJREFUeNp0U0trU0EYPTP35qYxaW6TlDapNKWGbgo2FkF8rARB6rboXusf0F/hyq2U4krFqugqSBeuAyL4SERBstHa0iR9JKZJ7mvu+M0tqZGkH3x8987jzDnnm2FSSqh4ns0VU1ybFzj674Wa3uWiWbfsFQb+jrGj8Xvbm0HlvYVRxhJprpmTlGmum+OMm5uNPZNbtjk3l82ey8++8oW4Jv/H/wdA456g2kvH99FyHNiuAz2dwflbN8YW8zMK5Go/CMfQkAhpGsyQgRCtlpE4jIULyC9fHzu7MPPEl/5ib6WOE0JJNRiHHg6j86mMjw/2gG4bkbY4PW4Yj2j64skA5FTHdaEMPiAJszt1sK0d4suJmY4k0+IDDGRfqmh0u5gejQc+fG8eYCIahRQCEfgQnIuhEkgtONE+dGxYxEDj1DhiEycZ+1YXdUpHCqTMJIYyEES5aXXQsi2kYlGEia5GtHVKn+amPBeCutPgfLALPuVu+xDVPw2EQyFEjHDghbpYNm1yKVVnYjTOerepn4E6XQmLGSPkPkOXWATMSDcjQEkAaqOu6+i/rccALtFL53LI3r0Nq1ZD4/MXZJaWYFer+PXiJc6s3IEgY3+uPYZHTAcAHM+DTE8gnM1CSyaCulv+GrRy8uYyElcu4XfhLVpkpNtn/DGA5Uu0abFH36WnzzCayWAkmYJvWeCkfb9SwY+NDbSoOx4bYqJF8rZqVRRXV/HhzWtUSmWwmWl0RmN4v76OUqGASrmMOkntSHF8MOs954dT08W248wzYsJDOujRBAaqqikTpRo/qqd0/dv97c3Lat9fAQYA4z8bX9nTsb8AAAAASUVORK5CYII=\",\n  \"php\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhNJREFUeNqMkltrE0EUx//ZbDaXNrvZzdIkbYOXGgxYQlCK2IIY6EufxGdB8Av44AdR8AP44JOPBR+Ego0PClUKTTXQSmkTYtOkmubSJrQ1e3H2yJSEJNIDs3PmP+f89pyZcdm2DcdWvn7LzkxFHmCIra7nm9ulg8yLZ09yXON55Dgjt1PM2iPs0+aW/frdh8bzV2/SvQBnCLiEqcFxLKSSodlrU9leiGPihWePBkgeEZO6ShC2dCAZNuf6ADb+ldQ5PUPx4BCFcgXfdwq4Ph1Dtd5CZi4Nw7SQiMdCXkl6yVIy/QBWgcU+yx/XsLK2cdHndqlK/lZxH/OpJO7fnsWY3z/YAq+g0TmHpoUH2vB5PXi8RD9Fo10aAmDJTgWyIuOupmK38rsPcOvqJO33XWEvwLJsmKxHRVEwf/MKWl/yUMf8mIloWN8rw+sP0D6PHQmYuzGNgCRiMZVA17IQV4OIaTI8buH/AJMFd02Tkp05PO4jnWvc57EDAINt7u1X8Pb9KgI+Lxbv3cFR8xjx6AQ+b+Txs/qL9KePlih2CMBCq92hg2qzt1AoV7H5YxdhdqhHzRbgcpFeqdUplpvQW4FhmAixZ/sws4BoWCM/qmsE5XqE3dDQCrqGAYWdejqZgK6GUD8+IV9VghBFN1RZJv3sT5diBwC15gncggCPJKF0WCPN8dun55jQdVpz3Ynl9leAAQAJhiGatD9AOgAAAABJRU5ErkJggg==\",\n  \"png\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmtJREFUeNpsU9tOE1EUXXPp0CAUWmJbC04xBANNTF+kKhG8fID6aqL/gPEj9E0lIf6Dj30HL03wxQtVIC0QKrWxNG1Dk9Z2Oj1zxn1m0oIZTnIyZ8/ee+211z5Hsm0bYg29fLGpxWIJWBYGS5IA8ncKhT9Wvf4Yqprtu+w3q85X7f9QxseD/pmZMZsxN9fnc5JNw0ACGGv6tPSvyvEDKEoWZ5Y8OHHObKpucw4B0t3agnl4CJPs2YkQVu4s61ORaBqMJc8CDBiIRhhVM9bXYdVqYAcH8M3NgS0tQQsFcfdKHEbvlr6WyaR/V6uPKPy7B4DT7lUq4MUipMlJ2MPDUKtVfKZ2nn/5BoNbkONxXeb8LYXe/A9AJLNWCxgdhZJagDI9DZg9qIkEytRSkdqTSFQtGILSbgc8LViM+tc0yPfukzIyOJ359k9YR0eQdB2KmBbpwXoM3Dod1SkD+scpEapCI5DdpsJhIJcjajQZagcjI+5oLe4VkeQnyiZgdIH2X6BJ7dSqQLfrggjw0AQwP+/GegCIHppNoFAgEMO1RZKo7BQgRi3yN05cnwdA0BQMAgF3C6pnbuNg92M9AFT1diSCh6kb+FGvo2MxnBB9ocZxp4Mns1cde213B81e7xwAcl4jkaa0IUSjUdLJwkL0Ej6VSvArCt7l81iku6GrKnYEU89VJlSJRmR0Dax+fI9suYxSo4HlWIw6M3FBlnD9YhiXabyOsOeIqG7TzDeIYo6EDGp+ZPb2kKKqH8h+mkxiI5/D1/19J3bwYPvPWXq2skkiJVxesqt0XzghpKM8nRVV2Lv2q9eLIvSfAAMAaacnllcFBmYAAAAASUVORK5CYII=\",\n  \"ppt\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkhJREFUeNpsU11rE0EUPTM7ySZpmzT9DNamWAtFfSiCigr+AxF9zKtv/hvf/Aki+FEi6ov4ItWHPGiwiBUKoUqqTUJImmR3M7Mz3t0kNe1m4LIwc+65595zlxljEJzdR5uf5nLmsvZx6gSvtd9W9bjhF7jg5dH9nRc/wq8YXaTSJptb0xklx7IZoKUEz1zJ2DUU69/37vFYrDxegJ9U0lC+AoIIVGg9CL+vIObP48KDQn7x0sWiVnJrnEDg7KGk+i/Ac4iUM/R7BsmrSSxtXMfa3X7el8+Kjf3KfUJ+iRJQw4w0Tc8BRyWGRAZY3rBR/VlC+XED2ayDhZyXl03+hNA3TxNQshlGLAnE44zCIL1goXZwiMNvB1i6zbC0KuAsxNITWwgNMYPeLVJiFEO9ArjHAivrAjNzBr4f4vwIgdGD4YUACsZCE8AtYGWT5jCsGQw5wEYJzP/pj5RwYTA1b07eQmfZ8P0sgdaM2FlYwWkMgMpl6NQAO33GKM0wsQWflkh1uqGVmVWblsiDkQyqxwfag35SqcktaEWTUTHYNx4iGU/C29+BvX4Lpu/C7zYgFjegSY63WySsHyXwpYHU00ieu0bAOuJbBTArBkiXKiaAmTzcvRJUV9E8rOgqBwqlY8ASs/AadbRLb8CzeTjVClqft6FdB17tL7yeCbFRBYoLr6vR/PiSEl5BZJaBD0/R2nkOZqfQ2fsKt+0SEQ+GLSIEUvJm+6jbah2+pS2aon+4g/afd4SYJVuA7vvXdC/IHQtSoTnK+yfAAIEaId1m+vudAAAAAElFTkSuQmCC\",\n  \"psd\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqxJREFUeNpsU01ME0EYfbtdKKWGtoItRWgJHApCBE2I0YuoiSaaeDJeOJh41YN3TfTixcRwMfEk8eDJGA+Eg0YTTRRMg02KKFooCBbTlkJLS7f7P+u3K9Xo8iWT3Zn55s173/uGM00TVlwZfzJztD92iKO5ouvQGQPHcQDN380vlDPr65fdLj4Oa41i9sFt+ytgN7o7woGOrqgvvpLBaF8vWj1NUAwGTVNRM3mf5vU/zaU+XySQuTqIFXz9hxmGLkoS7r+YxvVnrzGzlgXPDOzUZPT4m3Dt/KlIuH9oUjXYEHZZ/wOgGQZi4TZcGI5hLb+FO++TSOSKcLtcMA0dI0EPrp4+HtnfG5skiUecDGwQE2MjAwiGWlFVNDz+tIyCokJhPKYSX7Gdz2I01hOJdnY9rJ/7UwPGTEiqjtbmJtw4MYx78S/4Wa3h5UoOYwPdIOp2Xi/t18rlFgcDw6o+ydiWVRwOBnCpL0oOAMmNEhLZIgSeoxwGSWcERon/M9DoBknTIdNQNAMnO4PIVGpIFXcwndlA2OtGc4MAxml27p4AIulWSIa9QVadiYSoJxhqBJivKgh5ad3k9gaw6JdlDaqq7q5wINY4F22HaLHSDZQkBW72O9cBYFEviBIURQH7a7MN0uDisUW12ZZcaGlmdq4DwCqeTo1zNtZuW7hUqGIw7MNqSUS2ImNsKEpSdEwt5lGhfQdAkQBEoub3NNrDJfAIeBuRrcrY5xGQ2RFJAjl00I8PCckJUCB9q1URBnk38XEJEuk41tmGwZAf66s1VOh2keqwoUnYpFxHH4iKIixkN3HzVQKP3iQR/5GDKMuYmE3h+fx3MHqh1sMafztHLuiCg0FAk0uFdLqcpGY5QEXbTC/j7mIaVjc18DxufUtBJ/vcggs+3ijVz/0SYABsJHPUtu/OYwAAAABJRU5ErkJggg==\",\n  \"py\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlVJREFUeNpsUktvEmEUPTPzTUFmgJK2UqXQFG3pA6OBLrQxamJcaYwuu3Dp0l9iXLvVtRuDpgt3JIYaTVSaxtRHsJq2xEJBHgXmifebMhECXzKZme+ee+65516h2+2Cn2cb2VwyHl12//vP2/zOQaF4uD7GWN69e/LogfNm7kUsPBFaXYwHMeK0OlpQEJApHJTuykzK98dE98O0bLM/UNgr4v32Dj1fwSQRt9dSsfmZcMa0rIv9ODaqYrPVxuPnL1Cu1aEbJu7fvIZUIo4bqeVYRzcyv/8c3SPYpwECt/dmu4ON3Ed4TymI+hQc1ZqoE+F+uQLDsnHlwkKMscJTgl4eJOi9fxZLePNhGx6ZQRRFqH4VjZaGSv0Y6cQcJLpra0ZguIWegqDiw7lYBBZV6xiGk9DQDLzK5bEyF4Hi9VLMsoYI7J6Es5PjeHjnOl5ubqHaaJGBEkzbxplQAKIgDmBHekDTgI+qKKqKLvNApgmEgyquLs1CoFn2Y4cIeLJpkjoCLkWnUSIF3JxISIUsCjAoxhWNJLBIJs3YeXj/08oYZkOKY65HllE/bkMmY504YUd40HUq2JSSyW6iVPmLiXE/ZMYQCU+hXK3h1toqdNN0sEObyKtqtDQ6kXDwcadDS2TBryp4nX2HxXjsJK6bDnZIAZem6Tp5YMMmicn5OC4lztNWtvB9cg+hQABtWjKL2jH/T3GgBcYDXEE6mcDM6SlaJAGMWkivLBC54ZgniZaDHSI4rNSqn7/t1vgkGJPwZXffSeCjk2iUWz9+nSTQN8e6ef8EGAClUi/qoiOc3wAAAABJRU5ErkJggg==\",\n  \"qt\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnVJREFUeNpsU8tu00AUPU5sp41NkzRxpfSZqi0VIIQqEEJUZYXECvbwCWxYsuBD+ABUFrDrCnWBQEJdIWigBSr6pqRJ1ebhxrE9M7aZmSrQ4o505fHMnXPPPWdGiaIIYrx89GKpNDdxmXkU3aEoCsT+z8W1Sm21+jCpJctQTvaerj+TX7WbnJ+0cpfuX8mQtn8GgJ4AZtIFY2Hz3foDVRcgyt+cRHcS0IARh+D/8G0PpmVi7smd0dLs+AIjwTVEiANEYYQwCHlEZyJgIQKfoX84g9uPZ0cHZ4YWmE9nuufU0wABCSSImMsWEgqSuoqA/39/swZFTWLy7vQo7dDnfPvWWQa8GuOV3IYLJXmyzDzG2/ChZ3pwbHdQ267BKJoYuj7SF2MQhiF8LuDK/Gf0DKTBKINz1IbTbEMzU1ANDW7LAfEIQKIgBsBFlAx6LYOz6MAcvoDCtAVGGPKlAiIu/F55F33FDA6W93EOAOMaMOl7biKPwRtD8Foetj5sYPfTDtxjl1f3Ubo5jkQieQ4ACSUD2iE4XDpAdbUiW9D7UsiN9WNkZgxajwbd0LGzt3keAJPUc1N5SVeENT0Ao2BKV6QzwlZeRBSKAYhe3aYHcZWn7l1EfjyPypcK9LQGa8qCvW9j9+MvaasQOHaRhGWdhsNLR8hwodYWf6B4tYjDjSOovRqq32rSYq/lytw4A77o1V2ERiAtzY5kkUrrsH+3QF2KY87ArTtQuQ6nAf4x6FCV1D001+vYersBM2vA4y1Rm2D7/Rac/TZIw4d/6MrcGAPf9htN0miJh7Lyuoyvr8rQeP9iVJcrSKgJ+TrFcyYebXTP/RFgAFQobmIOBxbsAAAAAElFTkSuQmCC\",\n  \"rar\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnpJREFUeNpsUktPE1EU/u68OgylZXi0hZACQU1LEKKCMcat7jTRnQsXxsQtv4E/4M74P1iriUaNCw1FgxpjCJQKKAU60+m8mJnrmSll4XCTc8+959zz3e88GOcc8aq9evChOHl/lvMoubvWX/z4+BwTlbvw7bXdg8b7h6LE1gGW+O88CRMt4XTlR6/rYxce5Xv3jlHH19fPkBu+gWy5mlcFb3Wn/umeKOEMJF5C7xCFbtA9dRXjFoYKGiTRAlPGUV1aKU9O3VwNQ74A8DQAIZxqAuAhBPIMFYpQVAVB4CPSZjEzv1weH5tbDQN+JQ2Abu488mnzIbAAA3o/VK2PwDJo7r5Fy7ZRuvi4PFS6+qIXdVYD8Jg6BUcuOD8BozSLlRWyicgVKkTMQWwUlFF0Ooe5FIPk57BD7G0SiywyjD8bCDyHsOkeeeR3SUxEkROmU6BfQYFJMHfhWXV8efkUrb13VPMTsrcTQSzxZ/+n0GVA6EGbSGdgG9vo15fg2nFgbO8k70SRdd+mahDT81vUxTZRlJBRMsjq89C0EXCvSf7TIBZ136YZUJEiE7LgJ2dN01BZuE0dkIhxE7KcQTK1QUj+cwAEyrPZ+IydzRoyah+mLy2isbWBweESJEnB9q+1RM9Ub9GQOWkABg8HjRr2d9Yh0hTlBlRsfn+D4vg0BvUC9rZqECUJuk7Tzr1zahCYlB6HJAREPwfbbMBzLBzsbUKVI0qBgQkc+SxgWUYaIAqOpKwKXJ6bgGlaaDV/YvHaFNrtDsKTfVSrJeqIg/bRNwjclFIALeP3saybhu8SC4VBHwnhBXXIKocYRXD9QzBi4Xgchmkd9+L+CTAAMqwy+ZzluBgAAAAASUVORK5CYII=\",\n  \"rb\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAixJREFUeNqEUktvElEU/mag5f2yJhXLwxIt0kiqsVEXujP+A925cu1Pce3WtXVtYuJCF7KtTY0NrVQIpRVKeXTkMcO9F8+9ZVooJJ5kcmbmfOe733fO1YbDIWS8+/g1dycVX7W/xyO3vdsuVKqvnE7HZ230783rlyo7bVBicSGyfjsVwozomVbIPe/c+FmsPHfoRKJd1HT7hXHBZjVbA4aA14NnD9bC2VR8gwuxPi5Sx39Cp+M0XUP0ahhP1jLhW7HFD4zze3b93ILtXYyyVKlR8/5hFbnvO9gtlrGSjOF+OpXkYviWyo8mCS4R6bqO4p86vm3v4fC4DrPfw4unj1XN6JvBaQtjChzUXK43sVU4wNFJA43Tv/B73edQwTmfIhAjCVL6UdPAj1IVFSKhCdAcAI9rnjBiAjtBYEu3GEeh1sKJ0YXR68sVIujzIhzwY8DEBHZqiLRKkicQDfvABxaiQTc4Y/C65pCOXwcjcmlvJgHtlwi4epYifiQWgmoLZwPW6HQG07LgcOgKO0UglAKOTt/E+09fwAiUWU7QAE9xUK3jbvomsispZVHMVEDSZdHo9rCZ/4VIMKAu0XGjpU7d2S8hk0pCELHEzrjKnCQOYJoD+Dxu1RyiwUm5LaMDo9NFt2cqDLvY4oQFp/QpfT/MrmI5FkWebt+NpWto0j2QmQkOjZ9hpwhqjXZzM/+7LU+cc7lRrjXh8/lVLRK5ovLWXglOsiOxdt8/AQYAzv8qbmu6vgEAAAAASUVORK5CYII=\",\n  \"rtf\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe5JREFUeNqEU01PE0EYfnZmd5FSvgLYFuwWt9EgHyEaox68eDJevHvwJ/hTPHv1N/QgZ2NC4g3kUAQKFKGhjVKqRrvbnRlnht262FHfy+y8877PPM8z71pCCKh4/ebt+rJfXEz26Vjf2mnsN5rPKKWbVpx7+eK5Xu2kyMtNTd5d8MdhiJ9BOO7atFI9ajy1UyAqSPIRMR6ZmoNehNHMMB7fX/UWvEKFMbYKE8DfQnAhwRmmJkbx6M6S5+WmK2Evup2c9yUk2nnKA0XVcSiGXAe1k5beP1i+4RFCXqnPywB/AKVzK34RjHNYlgVKCH50w7EBBogbTa/AVM5SgBdn0gc2AMDjPsbFPz2xye9asweS6n+NTbG8BCCfUtLjff2WoVnVpAH6z6hMUtJE3EykYfpF4vUiL3QNS7FMeSAQRBHW3r1Hq91B+VoBQRji4+ExFsvz6Hz7jm7Yw5OH92AcJKW9G4SoHhzhy/lXbB98Qmm2oCXN5WawsV2TACEoJXqwTKOsb3BtR2ucmZxANpPB8JUhyPnHWDaDpfJ1eZFALzJJ4MKO5MEtv4TSXB7V/br8iQLMz+almRZWbvoo5q9qRlxwewCgeXbe3qrVO5ZkUD/9jJGRLPaOm6COi92TU1DbxYe9umRD0DrrtJO+XwIMABWp9nS+FgaoAAAAAElFTkSuQmCC\",\n  \"sass\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDNDMTBBM0JGMTE5MTFFMTg3N0NFOTIyMTQ2QzhBNkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDNDMTBBM0NGMTE5MTFFMTg3N0NFOTIyMTQ2QzhBNkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowM0MxMEEzOUYxMTkxMUUxODc3Q0U5MjIxNDZDOEE2RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowM0MxMEEzQUYxMTkxMUUxODc3Q0U5MjIxNDZDOEE2RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Po72XUcAAAJcSURBVHjahFJdTxNBFD1bykc/ttvdtttWGgI0bYrUgDZoNYqRJ014kMRXHvwB/hQTH/wFhMREJfFBQxBjhMRIFEQSCAlQxKYGggiU3e3HbnfX2bFt1EU9k9m9mblz5p4zlzFNExYmpue/jmTSZw5PZAl1MAwDT0c7O72wvPdudeNakPNtOZ0tsM7cvzdOc5yN5LDAsTFRAJks/kC2PxFRVe39Si6f4byez62EpAEH/gNN18F53Ri/Ocxf7OtdLMpKT42s/ZPg1cISJp/P0tg0TBzLCoK8D7eHh4RkLLJ4cCz12AjMXwgez8yhqtVo3NbqRKlcxcSL16gZwJ2Ry8KVc8kZO0HdTKlURn+8G6PD2SZhLMQj96WAiMAh2RXFYKI78lcJcx9WYBCycICnpNbojUWpD5Y0C4Zh2D0w6hWc70uQZC+IWfQZrXF0IsHvY+meBd08haAhoVMMQFJKWF7PNZM+klhRyogGhbqxOIXAMOtEwGAqDqVcgbVkkE+5UsEAWavf0az2t0ZqvK2qabh6IU3joizDwTgwej1LdVfJXkdbK8mt2QkayO99A0/0trQ46I1lVcX+UREhnsP34yLp1AD1xibBMuntpzU8mJyi3Tc1O4+l9U06n7x8Q/8PHz1DrrALt8tlr0CrkbJMHTop9Sk5sLa1g8L+ARJdnShKClY3tunN69t5iGLYTlCtakjFY7gxNABdN3B37BaqqoYT8pyX0in4ORbRkIA46YlDRbUTbBZ2Jb/Pw4qiKFnapcpPo9pdbrg8DjAOBsFgELJmsGs7eWkkc5bu/xBgAHkWC6UPADTOAAAAAElFTkSuQmCC\",\n  \"scss\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM4QjYyNDVGMTE4MTFFMTlBREZCNDNEM0ExMTk0MUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM4QjYyNDZGMTE4MTFFMTlBREZCNDNEM0ExMTk0MUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzhCNjI0M0YxMTgxMUUxOUFERkI0M0QzQTExOTQxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzhCNjI0NEYxMTgxMUUxOUFERkI0M0QzQTExOTQxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pkf1yeMAAAJbSURBVHjahFNdTxNBFD0tLULpB91uodVWPmorUIxo0VSiNSExMYYHE33l0Ud/in+C+OSjYgjRGDBRCKJIUkIEWi0WKlja0ul22+5219lJ26gLeiezuXvn7rnnnrlrUFUVms3Mvd2bjIyezRVLBA0zGAzo6jhjm1te+7EU37rFO+w7JlMbtG+ePJ5mOaZmci/nsPl6ONBtw18WDQc9tZq0sp7YjTisXV/NFKRpRvzHpHodDqsF03djzuvDg6vHJWFAprF/Arxe/oins6+YryoqCiUBvNOO+7FrXMjnWc0WyIAOQP0N4Nn8IqqSzPx2swllsYqZl28gK8DDyRvcxKXQvB6gISYpiwgH+jEVi7YAfW4nEqk0PJwDofNejAX7Pae2sPhhHQoF63U5Gai2Bn1epoPWmmaKoug1UBoMrgwHabIVVCx2jdrKFwm67TZ2plldPQGg2cK5HheIUMbaZqKV9In6giDCy3MNYXECgKI2gICxoQAEsQItpNCHWKngMo01arTY/jFIzbutShJuXh1Fm9FImYiM7tTtKOtbO+toN9Nc+fQ5SGUOIVYl7HzPIH2YRZ0y2KZ+sVzBHn2v1mpMGx0DTaR3nzfwfGEJdybGkdo/wEigDyvxLzg4yiESvojZhfd49OAeLJ2degaSLIPOO6vwgiYaaRErTRREEdn8MeJbSVZ5M7nLdNExqFLaQwEfFfACQn1+HBWKSKb3MT4Sgstuh9vVDa+bQ4DORE6o6RlspzMk9TOPfr+fiLJCLFYr3TZSKNcI7+aJwWQmPM+TkqRg49tu65f/JcAAMwMas6WUKd8AAAAASUVORK5CYII=\",\n  \"sql\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAh5JREFUeNp8kctrE1EUxr+ZyXMkoa1NBROaSkpTBE23PhZ25cql2y5duvAPUdGFS1FxIRRBXZlFQ9GVdDENIhGJxkDsw2mneZnM83ruNZlOmNoDhzlzz3d/9zv3Sowx8Ch/qlYK2XM3cEJsbH0+qjV/rd6/u6aN18b7RMFT+9aosP/Ex+0ae/puw7j36PlKEMAzctKJ3aGFamMHjV0d+wcGitkMrpWWp6hVIciEk2MAOwbUWjosx0UiFoWqJpGMx5DNzODq5aIPoa82AWBg/lyKLMH1PMp/a9XvLXLzG1cuFlBaWpiKxaIPSLY6CaC93ggQjyiQZRkeQSzLRovGaPciWLt5faSWEBoh6KBvOhiaNga0+Y9pwaFxvu7rfp8F5pWDt+qNMp2IijHGwddWCvN+33/CoAOP5nVdT9SdoQ1JkggiQ6Yvr7V60+9z7akA2gfH9cRF8hO5F5Ve4lQAF9uuK+qFsylkzsQxrcaQm04hdWkR83Mzfp9rQ3fAFzu9Ph6+WMfjl6/pGBdb2jbKmx8QlRjWy5vkyhUZBPgOeGNHN9AbDLGUz6He2hVj3Ll9C8/evsdgaMK0HV8bcmDTU0UUBYXcedR+NLGnH0I3jvDk1Rsy46FP4C/1BtrdntCGHNiOAzWZgEKQ5Qt5lIqLojbaXSQTcRy2OwT4SZqk0IYAOgkVWUE+lxX/zb0DpFNpkTzmZmfFtzewhHYcfwUYAMZmVaZQlLFHAAAAAElFTkSuQmCC\",\n  \"tga\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNp0U89PE0EU/ra725K22ILRGipb22pMG6JcSEQTbUIwnozxpBcvepeEP0KPogcT/wlNT17kIKbEmChFUYKGVtL0R2gLtNCl3Z1Z3+zSAlonmezOe/O+973vvZEsy4JYnqdPMu6RkSQYQ29JEkB+PZcrslrtPhQl23VZc8/tr9I1yMHg0EA8HrBM04lVFAhoY38fSSDQVN3pfKV8G7KcxZHl6v1xblqU3eLc3p2VFZjr6+gQgwsnhzGTuq6Nhs6kYZqXjwL0GFhEl3U60OfnwWs1GGtrUKNRsKkpeIIBpKIRtI1J7cX7hXRhc/MOhXw5DkCZGG2zXAajzFIoBMvng1ypIKOqmP30GW3OIEcimovzlxRy5RgAFwDEAIODkCcmIMdiQLsNdWwMZdJlg8pzEUt1aBhKq3XinxKYqF9yQbqRIqsMy+0Gyy47bKgUWXSLtDENE5wdtuqQATm50F1VnPbRGeEw8HXZbiV8fsDvI9ldju9vADAyihLEbrWAZhOoVp3z6iqBUiB1A4nEfwCEsbkL/M4TgE5n5jDx+oTEzp1d8m9tC8H6MaAB0imzx0NU/WKUYE+loEyawDBo2ui6TGfT6ANAxrvx87gYCGCxXEKVJvCWFsG3eh1vN/J4OD6Od4UC8o0G3TX7TGLHwI9iEQmvF9X6Fh7F4/iYy+GcLOMSlfEgGsP0qdNOmX0BiGKpVkV1bw/1nW2b/gCpf1PTcI+Y7eg6ps+G4bG4PR99SjAVo9HE4q+fKNE0vl5awuSohjeijbRefVjAtUgEQRK7Yhi9OKn7nKWZxxlSPWl3QwgnaIrW8QMhD542vUbx/W49m7sq4v4IMABOqi3Ej7bAEAAAAABJRU5ErkJggg==\",\n  \"tgz\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNpsU1trE0EYPbMzSTfdtInFtkkpiaXVWou2FRUEn/so6JugL/oH/Af+B1988if40jcFERQURNBSQdDWlLQN2lsue8neZsZvc7FoOrDszM75znfOmVmmtUYyvry++36yfOeS1qqzDtvH2P76ApPlW3Drb2sHex/uccHWAdbZX30kO2+B3siN3zhTnHuQ66+95i423jzFzOVljBdKOZNHazvVT7e5wF+SZBj9iZJ+3J11mbW2kR8T4LwFli5i4fqTUvnczTUp9RLtDhKgJx0q4dEwWAxrREKICHEsoYYXMXvlcWmquLgmY71yCkG/c0AkARgLMZpnMDMpGNzEYe0dGp6HwvmHpbHC1Wf9MnFCkHQOyYEPzSJwQ2B65Tm5NZG3Fshim6wbMNJn4bpHowMKtIqo2COgR2IcAptwjvcgo6i77igjEmVDqbY8xQJ1VwRULhiBI6+G9Zf3cbTziuzIDkmHSNqECTFgQScEcYuc2NA8TcdYwXD+GkK/TYVN+u72WrIudiAD8o6oAR2RRCmQMjis3CIy1iSpPySCXhFTXeyAgh4BR+JVw8pauLi0Cp4yCX9A90FQhnSBYtnF/k+Q+HYam9itfIZB3QvT8zj8XSW5EhNTs9ivbSLwPUzPLNPJBIMEKnaQYg6aB9+RGR5F5VsNgnNKXMI1NdJGG5WfHzFVLJ7k8c8xUngpVodlDSGbFYj8Y4yMpOG09lHf3yIFPzA3fwHZTAQVtU4JUTeFDrdgDdlI8wAz5Qy2KxswReI7QODZcOr0ZH3q2hIDBI7zq16tuk3FNPxAI4wN+pkoccYoE4YJU5EdUtM4Qst26v26PwIMAKj3P/2YUKgYAAAAAElFTkSuQmCC\",\n  \"tiff\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmRJREFUeNp0UktPE1EU/qYzHWstlrYJNcWUElyUJsaNGh9B0g1Lo0v9Ey78EbrVxBhXuHShm25YGBJRQpAYBDEWpaEPEhksdVpbyjzveO4MfZDCTWbauefc736PIziOA77OPH2yJCcSGdg2uksQAKofFou/7VrtASRpvVNynj13f6XOhjg8HAlMTIQdy/LO+v3uYUPTkAHCTb+cK+0pdyGK6+hbvu4/xiyHbncYAwfR19ZgbG/DoO9LsSgeTd9JXoxfyMG2rvQDdBlwIZauQ5ufh12twioU4E+nYU1NIRCNIDs+Bt28mXzx8VNuZ796j9q/DgAwomwqClilAmF0FE4wCInAlkjO4y+r0JgNX2os6XPYS2q/cQyAcQatFjA0BPH6NYipccAwIGUy2CVJFZInkKlyJAqx3T4/IMGmJkeWIWSz5KgI5pdhb3yDXS5DSCYh8rTID8s0wexeVD0GtMd85KkkefFxUfE47M1NokbJkByEQl6tL+ouAI+MUwbFhnYbaJKc/Sqg0x4H4eDRGDA56fUOABA9/GsCpaIHwr8FOhQ823O5RfW66tUGADhNy3RNRDjcN41HLxdQ8J6jYTsOQLfOJBK4f+s2/uoathoNGKT1MtFeVHZxdWTEZfEq/wMKl3rCJOIzTV6ADs2R5ulYDDNkYjp0DhrF+zCVgkw31+v1UxjQZkNV0SADd2o1MIuc9gmY+/kLxb0/UFoHePd9A1qzeUoKpilx9xcLWzgg+u/zeVfuQqkM9bCN1ysrWKXxdtPgvScwUAm58XZ52W16QyPtifRUzi588GbEi1ztHPsvwAC4uC9qhnsZvwAAAABJRU5ErkJggg==\",\n  \"txt\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAeJJREFUeNp8UrtOG1EQPfsyXiyzBguIJSyChZBBEFCKpKHLo6egpErNn8CHgH8gkZIiTSIXLhJAWCgkoMgRMSiRBSK29z4y9+I1d/HCrFb3MTPnnjkzlpQSynY+fP70fGF2gQuByCz6lfdd9Uurfvrrjes6762eb3tzQ69uFJwPsqOPC+MBEmxxphi4tlU5OGmsOzaBWLc+O9oIIVhScidkyGZ8vH62nHtSKlaI4cse6TjAfSaFBBcco0EWqyvzubmpyQrj/FXk75cQaSEMeMXU8xykPA/Hjd/6/LRcyjEpt2i7HAe4A2TeLZWKUOJaVLxj27j813EHGKCXaAJExu/4BOdiAED08riQD2riOrexyRoYc3CvsAbLGAAjZga7vgZG23WMCdBvoxKJc36TRBlMiaa2JByjNqqD8qkYc1pjDK7abey+/YhrWlfKswhpiCR96aEU9o5+QE3g2ovVWDm2Sc22bBQm8vrVpbkS9r+doPr1EOWZaQ0yFoxg2PcREosEAI4uvZhJpzFMP+cSXRbq+043RManez+tNWKMI6GN0g0Z04HFR+NoNC/0yx717efZOSbzY3AcR4Op2AGA5p/W31r9e0vNgSrh9OwCrpeCkqvZuqTybnpRqx/r2CjvvwADAJC/7lzAzQmwAAAAAElFTkSuQmCC\",\n  \"wav\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAApFJREFUeNpsU1tPE0EYPXtpKbX0wqUQKVQMFdIXQBNCQBs06KP+B8ODGh+Mf4b/4IsGE54kxhcMBrkp7YOQgBRvSKG73fvsrt8Otoask0xmd+b7zpxzvm8E3/cRjPkniyulW0NFy2JoDkEAguOlpXJ9p3L8MBqVl4O9YHxae8pXuRlcGO7KPLhfTDVUqwUgigJMy4Whm6lEXHjxYf3XnByRN0QB/2KaH7btMlUxoRJAcyqKhdOaht7+DJ49n+2cvTnwynXcsb+kLwJ4rgfmMDDGWqvneXCZS9ND7mov5h9ND85M9y86Dpto5rUkuJ4Py3YDJpy6QGJPayqB+Njf+43XL220t0cwOZkfrNXsBUqZugDA6CbLdAiAwaek1ZU9LmP8Rh6S78GsGxjOp9FdzKJaVZIhBgGASzK21w/wbrnCk8euX+EMAjaaZuPHdwUdHVFYluuGPGCORwwYjg5rqOwccRk+3Ux0IEvntmsNG4ZmUayL/wAwKHUNfZfTKN0ZRaw9Cof8qJ/pMAyHy5KkAMTksSEJtnMenM7EMVMawbejMzJRh67bXEYiIXEAVTW50SEAhzqwfqrBcXx4VOhYm4RsNgHbsJFOyZTsQ1MN+hcohoUlkFiMT+TQFpMwXOjGpXgE+XwGk1N5pFJtKNCequgYGupCRBbCDOp0KBJc4VoP3dyBONW8uydBgBHUThqQKCk3mEZ/LoUG+RBioJO7VarAwEAntjYPiUUW9Hh4b2R7k9j98hN37xWx8fGAt3eIAdVMLn+uUv+b2KReSCZjZJiB9bV9jIz2ofr1BKvvd7G9dRC80lae0HzOt+cWVnrSKDrMJykifwNBpCgE/UAllEXufmDu8Zlffvvm8XSQ90eAAQA0pF7c08o4PAAAAABJRU5ErkJggg==\",\n  \"xls\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmxJREFUeNpsU0trFEEQ/mamZ3Y2+0zIC2MmITEkUYgERFQErx5E8KTi1b/h79A/4SW3nCNeYggBYZVEMU/y3N3Z7M7OTD/G6lk2ruw20zRdU/XV91VVG0mSQK/3n1a/jky6d6Xs3G8WXS+Pw5N6LXjLLGuna/78oZKerGsYKtrDE16uJGL1L9gEOOcYd2dL1fNwrbL//aXN7J1efPMmkUqEFAk0A0VZNbFEaQCBscIkXj975y3NLq9xye8PBkAniHOFph+j2eC4rsdoB4LsFubGl/Hq8RtvYWpxTQi52o1jvWiGYaRZL0/auDgOkC/Z8BYL2Pqxidp1FZkhoDxpeaXA/Ujuj/4HoOxKKjiOiek7RUShRNQWaNYFQuMafrYCxiw4ozZKfqbYJ0EvRdl1DQyyTs8XCNTA6UELMwvDyLpZWIZNNlNLlQOK2LMJRJ+5AkuZ1S7CFFzJzk56GnUjQWlYkqCoBWFbonEVYcLLA4dNnB624GQsDBWIgfZJEgxkoChzSFWvn4VpQemDm2VwXQsXJwF1h6c+gxlQ5jgSiEUEt0wdIe7tMES+nEG2aCLiJMOIIWIr9e0DEELAMUrwRuchVAyTKimUwO75Jm6VF3Bv7imOaj+xd7UFKVS/BPJF1b/E4tgTrE49J60O5kceoNqowiuuYKa8ghHXA48U9MT2AQgyRvTThE30bQiaSGa4yLMJNFo+Dq/2cHt4CYlwyFf2S6BHwwrMw/avDbR5C1k7h1YQ4KH3Amf+AcZyEbZPv9CItzQD1l9EbtYOjv74v/d3O9RMPTDrsEwGIWN8q2yk7XNYRs9JrRv3V4ABADSGR6eQ0/NQAAAAAElFTkSuQmCC\",\n  \"xlsx\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU8tqFEEUPVXdPY/ueWZIoiYZiSYKYhJc6EbduHOhgijo3t/wH1z6B0JAhOyMILhxo4kJGk1ASTAxwWF0Mpp5dHc9vFUzYwidaoqmq+8959xzbzGtNcx69PTS26ETmQtS9r4Hy/xv7MW7jV+th5yzVcaYPX/++It9u4NAv+CVR6tBUUTqMJsDcRzjZOZM8W9ZLKx+/XDb4e5/kH5In0lpIYWGUaC0YTZnBCAEKoVR3L36oDo7NbsglZwbqD6iQKOXFMcKUVfBkBAoQhlD5xxMDp/HrSv3q1JgYW3z0x0KXzkCYJaRZljru23aHWTzLiamAyytv0O9UYdf5PArqlppBfMUfu4oALErqZBKcUxMFRCHEp0DgW5Lo4N9NIN1dF0XXsVFOUyPJTzo+WBANDidjp8tgHGG3c0DnJ4uIRf4cOCBaW5KjY8xkZL72xpJ9QcFz5bVqHUJGHZL2YtNmKi06YCyiVFb4s/vEKMTAf1p4edOG6mMi1zR6wEpdUwX+vLDtkCzHoK7ptcM6ayLmGajvtex4PliyoIkFRjmUEASelB2rXQRSfjUCT9PlWpmW21iTGzCAyEkUixPRqXhe2V4zKczbdmybgkpJ0cGOuA6Y2MTCsKoi5HsNK7N3MN+uwYaWbxYfoLLkzdxcew6lrYWaZhm8PHHG3zffp1UwJSHz9vvkU8PodbcQYYYS5lxYkxTkGdVDQdV1Js1qPgYD6JIuIE7gsXVefIhIuM05k7dwMbeMmh87a18ufIMaVYyprrJLgje2Nr+1tzYXANnDnr3zRhHj37Vvy2wpXHtNAd5/wQYAD6WMuT2CwoVAAAAAElFTkSuQmCC\",\n  \"xml\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAilJREFUeNqMks1PE0EYxh+g3W2t1G0sEqyISynUFJsSOShNwCamiYZED3LgIkcuxoN/iCZePZiYGD2aGD+i0F5KMChxlVaakAK2ykcAt+WzdLu7zkxo3WZL4pu8mXfmeeY3885ug67roPFh5nvc62m9hjoR+5LMp7MrkYf370qVtco+VtCUFpbj+jGR+JbWn76OyQ8ePwsZATQb8R/hanZgINgj9IqeuBFCw1Kt9OMBnNWCs24XwkG/QKYUEiGjVAPQof/rq0783pShET3ULQo8xz0iS5FaANmrHQH2DoqY+DSLSz6RzecWlnD9ymU47LYjd4O5BXqDTG4FM3NpTEkpdJ5rw0AowLRMbhUfp58gTOaD/UHmNQPI6YmvKWRX1zESHUJ/oBs2nmPa+Mgw0ZIM3tZyGoJwygzQNB2jNyJIZX7iB0lpPoM70UGmPX8zCU+rG8NDVxHwdiC5mKsPUFUN/gvtLLf39sFzVqaN3YrC6TjBauqhXhNA1TQoqloV7Da+pjZq1FsXUCamF29j6LvYhf3iISamZ3Fv9DZevouhRzzPfOG+3hpA9U9UyioOlTJ7pFeTCQS6RGzIebyf+oz5pSzWtmSW1EO9phvQ00slBRt/8qR3DoWdXbiczUiTzd52D+tdLmyTB14mx1rMAKVcRpEATjrsuElee/HXGmnFRyBOGD30C/nEDjNgs7CDpsYmnHG3YPegBCvHs9oYfm8nG9dJa5X4K8AAQzQX4KSN3wcAAAAASUVORK5CYII=\",\n  \"yml\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdxJREFUeNqMUl1rE0EUPbM7m5Y0Zptu21AwWwhYpfSDFh+kvvRd8N0Hf4I/xWdf/Q158F0QoQ+CVsFKaLSQpt/dpmvztTOzzky6cetOpWcZZvbO3MO5514SxzEU3r57/3GpWllM/tP4sL3TarROXuSo/SWJvX71Uu80Cfhlr/T4UdWFAVfdnmsTUtvdP35OUyQKVnJgXDBTcj9icAsTeLax7j/052qM81UjwW1QJXEhMF0qYnN90fdnvdogYmvJPU0/VBApD4hcDrWRcyikfB17srzgW7b9Rh1vEvxDlI4tVytaBSEEtmWh0xsUMwpwnWjqAlcxogiHd1wiQyCu87iI/+sJtf6+NXsgpd7FWCMB50KvkYMGMbLdZgLlfj+K9K4+FnFQ2x7WntIs50AbmiGwLILt+k+EvzvSNIHzdigdJ/AmXQRhiHv5POSwYmG+cqPVo0HqDxj8uTK2vn1Hfa+JmdIkvtZ/4fOPXU3WPDpFeNWVyUKryCiIGMN4zsH98gym3CIcOTwT+XHdXrdQQHAZotE8kBPpSqPNHtBOr48HUmLOcXRJT9dWNMGYJFby91pHOAvaykSaITg+bwefdhrteDRTMSwyrFCgI88E056Hy+4Ah2cXQZL3R4ABALUe7fqXWFN6AAAAAElFTkSuQmCC\",\n  \"zip\": \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm9JREFUeNpsk0tv00AUhc+MY6dOmgeFJg1FoVVpUWlFC0s2IFF1jxBbhKj4BSxYdscPYcEmQmIDq0gsERIViy4TpD7VFzF1Ho5je2a4thOqNhlp5Mz4zudzzp0wpRTC8fPrk0/TC6+fDtYicLH97T1Kc2vQDcs+rH3eUAxVznn0fn1DRM8E+iOdv5ct3XmZG6yVlNj6solUbgVTt0q5FGtX6vXqC6VklTE+KAO/OODHSIQPRQpsXC+kkEz2ELA0ystv84tLzyucsbWByisAGf+QAS2CCDRRLMJMmxC+i8C4jdLCm/zM7OOKFGptcO6/BTpJ0yeQB0Y+mfKQuZZG0jQgeRbW8Xdomobs9LN8scc+UPHNy4Dwq8IljotIIQEm59/RoSyM1CKkXKZNBm7kIVgyM6wgAnSgRK9vqQfHPiMFDHqyFVsLR9Cm0o4YzoAASrSjCelQfRPb1Vc4qn0EY5L2W9GEaBLcxQgFHpGbkMIDJ69e+wjJ8VXqRgKid0r7ftQdxkRs9SqA2kgAm14SSIQh9uhuLGPMnKJs/5KquL1x0N0RCsizigoDaLqBdHoMiyvrlBsHVx1wphD4BCewoqxGKKDwAgtOy8JufYuk+5golGGaGZwc1sIGoDz3AOPZSVLaHgVwydoJDM1H4DbQODughB3YpOD44HfoHgnu4e7So0uAi0stHLJ3Aud8B9bpHu6vPoSu9TtDl6tUuoFiIYOgu0+158MKmOxomtyD3Qi/3MTR7i8K0EDG1GHO5DE3X4DvNahZlJOwEkOATvdPc2//hx3mXJ5lFJaF8K8bStd0YGfnOJbMGex21x6c+yfAAOlIPDJzr7cLAAAAAElFTkSuQmCC\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/index.js",
    "content": "'use strict';\n\nconst styles = require('./styles');\nconst lastModifiedToString = require('./last-modified-to-string');\nconst permsToString = require('./perms-to-string');\nconst sizeToString = require('./size-to-string');\nconst sortFiles = require('./sort-files');\nconst fs = require('fs');\nconst path = require('path');\nconst he = require('he');\nconst etag = require('../etag');\nconst url = require('url');\nconst status = require('../status-handlers');\n\nconst supportedIcons = styles.icons;\nconst css = styles.css;\n\nmodule.exports = (opts) => {\n  // opts are parsed by opts.js, defaults already applied\n  const cache = opts.cache;\n  const root = path.resolve(opts.root);\n  const baseDir = opts.baseDir;\n  const humanReadable = opts.humanReadable;\n  const hidePermissions = opts.hidePermissions;\n  const handleError = opts.handleError;\n  const showDotfiles = opts.showDotfiles;\n  const si = opts.si;\n  const weakEtags = opts.weakEtags;\n\n  return function middleware(req, res, next) {\n    // Figure out the path for the file from the given url\n    const parsed = url.parse(req.url);\n    const pathname = decodeURIComponent(parsed.pathname);\n    const dir = path.normalize(\n      path.join(\n        root,\n        path.relative(\n          path.join('/', baseDir),\n          pathname\n        )\n      )\n    );\n\n    fs.stat(dir, (statErr, stat) => {\n      if (statErr) {\n        if (handleError) {\n          status[500](res, next, { error: statErr });\n        } else {\n          next();\n        }\n        return;\n      }\n\n      // files are the listing of dir\n      fs.readdir(dir, (readErr, _files) => {\n        let files = _files;\n\n        if (readErr) {\n          if (handleError) {\n            status[500](res, next, { error: readErr });\n          } else {\n            next();\n          }\n          return;\n        }\n\n        // Optionally exclude dotfiles from directory listing.\n        if (!showDotfiles) {\n          files = files.filter(filename => filename.slice(0, 1) !== '.');\n        }\n\n        res.setHeader('content-type', 'text/html');\n        res.setHeader('etag', etag(stat, weakEtags));\n        res.setHeader('last-modified', (new Date(stat.mtime)).toUTCString());\n        res.setHeader('cache-control', cache);\n\n        function render(dirs, renderFiles, lolwuts) {\n          // each entry in the array is a [name, stat] tuple\n\n          let html = `${[\n            '<!doctype html>',\n            '<html>',\n            '  <head>',\n            '    <meta charset=\"utf-8\">',\n            '    <meta name=\"viewport\" content=\"width=device-width\">',\n            `    <title>Index of ${he.encode(pathname)}</title>`,\n            `    <style type=\"text/css\">${css}</style>`,\n            '  </head>',\n            '  <body>',\n            `<h1>Index of ${he.encode(pathname)}</h1>`,\n          ].join('\\n')}\\n`;\n\n          html += '<table>';\n\n          const failed = false;\n          const writeRow = (file) => {\n            // render a row given a [name, stat] tuple\n            const isDir = file[1].isDirectory && file[1].isDirectory();\n            let href = `./${encodeURIComponent(file[0])}`;\n\n            // append trailing slash and query for dir entry\n            if (isDir) {\n              href += `/${he.encode((parsed.search) ? parsed.search : '')}`;\n            }\n\n            const displayName = he.encode(file[0]) + ((isDir) ? '/' : '');\n            const ext = file[0].split('.').pop();\n            const classForNonDir = supportedIcons[ext] ? ext : '_page';\n            const iconClass = `icon-${isDir ? '_blank' : classForNonDir}`;\n\n            // TODO: use stylessheets?\n            html += `${'<tr>' +\n              '<td><i class=\"icon '}${iconClass}\"></i></td>`;\n            if (!hidePermissions) {\n              html += `<td class=\"perms\"><code>(${permsToString(file[1])})</code></td>`;\n            }\n            html +=\n              `<td class=\"last-modified\">${lastModifiedToString(file[1])}</td>` +\n              `<td class=\"file-size\"><code>${sizeToString(file[1], humanReadable, si)}</code></td>` +\n              `<td class=\"display-name\"><a href=\"${href}\">${displayName}</a></td>` +\n              '</tr>\\n';\n          };\n\n          dirs.sort((a, b) => a[0].toString().localeCompare(b[0].toString())).forEach(writeRow);\n          renderFiles.sort((a, b) => a.toString().localeCompare(b.toString())).forEach(writeRow);\n          lolwuts.sort((a, b) => a[0].toString().localeCompare(b[0].toString())).forEach(writeRow);\n\n          html += '</table>\\n';\n          html += `<br><address>Node.js ${\n            process.version\n            }/ <a href=\"https://github.com/http-party/http-server\">http-server</a> ` +\n            `server running @ ${\n            he.encode(req.headers.host || '')}</address>\\n` +\n            '</body></html>'\n          ;\n\n          if (!failed) {\n            res.writeHead(200, { 'Content-Type': 'text/html' });\n            res.end(html);\n          }\n        }\n\n        sortFiles(dir, files, (lolwuts, dirs, sortedFiles) => {\n          // It's possible to get stat errors for all sorts of reasons here.\n          // Unfortunately, our two choices are to either bail completely,\n          // or just truck along as though everything's cool. In this case,\n          // I decided to just tack them on as \"??!?\" items along with dirs\n          // and files.\n          //\n          // Whatever.\n\n          // if it makes sense to, add a .. link\n          if (path.resolve(dir, '..').slice(0, root.length) === root) {\n            fs.stat(path.join(dir, '..'), (err, s) => {\n              if (err) {\n                if (handleError) {\n                  status[500](res, next, { error: err });\n                } else {\n                  next();\n                }\n                return;\n              }\n              dirs.unshift(['..', s]);\n              render(dirs, sortedFiles, lolwuts);\n            });\n          } else {\n            render(dirs, sortedFiles, lolwuts);\n          }\n        });\n      });\n    });\n  };\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/last-modified-to-string.js",
    "content": "'use strict';\n\nmodule.exports = function lastModifiedToString(stat) {\n  const t = new Date(stat.mtime);\n  return (('0' + (t.getDate())).slice(-2) + '-' +\n          t.toLocaleString('default', { month: 'short' }) + '-' +\n          t.getFullYear() + ' ' +\n          ('0' + t.getHours()).slice(-2) + ':' +\n          ('0' + t.getMinutes()).slice(-2));\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/perms-to-string.js",
    "content": "'use strict';\n\nmodule.exports = function permsToString(stat) {\n  if (!stat.isDirectory || !stat.mode) {\n    return '???!!!???';\n  }\n\n  const dir = stat.isDirectory() ? 'd' : '-';\n  const mode = stat.mode.toString(8);\n\n  return dir + mode.slice(-3).split('').map(n => [\n    '---',\n    '--x',\n    '-w-',\n    '-wx',\n    'r--',\n    'r-x',\n    'rw-',\n    'rwx',\n  ][parseInt(n, 10)]).join('');\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/size-to-string.js",
    "content": "'use strict';\n\n// given a file's stat, return the size of it in string\n// humanReadable: (boolean) whether to result is human readable\n// si: (boolean) whether to use si (1k = 1000), otherwise 1k = 1024\n// adopted from http://stackoverflow.com/a/14919494/665507\nmodule.exports = function sizeToString(stat, humanReadable, si) {\n  if (stat.isDirectory && stat.isDirectory()) {\n    return '';\n  }\n\n  let bytes = stat.size;\n  const threshold = si ? 1000 : 1024;\n\n  if (!humanReadable || bytes < threshold) {\n    return `${bytes}B`;\n  }\n\n  const units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\n  let u = -1;\n  do {\n    bytes /= threshold;\n    u += 1;\n  } while (bytes >= threshold);\n\n  let b = bytes.toFixed(1);\n  if (isNaN(b)) b = '??';\n\n  return b + units[u];\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/sort-files.js",
    "content": "'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\n\nmodule.exports = function sortByIsDirectory(dir, paths, cb) {\n  // take the listing file names in `dir`\n  // returns directory and file array, each entry is\n  // of the array a [name, stat] tuple\n  let pending = paths.length;\n  const errs = [];\n  const dirs = [];\n  const files = [];\n\n  if (!pending) {\n    cb(errs, dirs, files);\n    return;\n  }\n\n  paths.forEach((file) => {\n    fs.stat(path.join(dir, file), (err, s) => {\n      if (err) {\n        errs.push([file, err]);\n      } else if (s.isDirectory()) {\n        dirs.push([file, s]);\n      } else {\n        files.push([file, s]);\n      }\n\n      pending -= 1;\n      if (pending === 0) {\n        cb(errs, dirs, files);\n      }\n    });\n  });\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/show-dir/styles.js",
    "content": "'use strict';\n\nconst icons = require('./icons.json');\n\nconst IMG_SIZE = 16;\n\nlet css = `i.icon { display: block; height: ${IMG_SIZE}px; width: ${IMG_SIZE}px; }\\n`;\ncss += 'table tr { white-space: nowrap; }\\n';\ncss += 'td.perms {}\\n';\ncss += 'td.file-size { text-align: right; padding-left: 1em; }\\n';\ncss += 'td.display-name { padding-left: 1em; }\\n';\n\nObject.keys(icons).forEach((key) => {\n  css += `i.icon-${key} {\\n`;\n  css += `  background-image: url(\"data:image/png;base64,${icons[key]}\");\\n`;\n  css += '}\\n\\n';\n});\n\nexports.icons = icons;\nexports.css = css;\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/core/status-handlers.js",
    "content": "'use strict';\n\nconst he = require('he');\n\n// not modified\nexports['304'] = (res) => {\n  res.statusCode = 304;\n  res.end();\n};\n\n// access denied\nexports['403'] = (res, next) => {\n  res.statusCode = 403;\n  if (typeof next === 'function') {\n    next();\n  } else if (res.writable) {\n    res.setHeader('content-type', 'text/plain');\n    res.end('ACCESS DENIED');\n  }\n};\n\n// disallowed method\nexports['405'] = (res, next, opts) => {\n  res.statusCode = 405;\n  if (typeof next === 'function') {\n    next();\n  } else {\n    res.setHeader('allow', (opts && opts.allow) || 'GET, HEAD');\n    res.end();\n  }\n};\n\n// not found\nexports['404'] = (res, next) => {\n  res.statusCode = 404;\n  if (typeof next === 'function') {\n    next();\n  } else if (res.writable) {\n    res.setHeader('content-type', 'text/plain');\n    res.end('File not found. :(');\n  }\n};\n\nexports['416'] = (res, next) => {\n  res.statusCode = 416;\n  if (typeof next === 'function') {\n    next();\n  } else if (res.writable) {\n    res.setHeader('content-type', 'text/plain');\n    res.end('Requested range not satisfiable');\n  }\n};\n\n// flagrant error\nexports['500'] = (res, next, opts) => {\n  res.statusCode = 500;\n  res.setHeader('content-type', 'text/html');\n  const error = String(opts.error.stack || opts.error || 'No specified error');\n  const html = `${[\n    '<!doctype html>',\n    '<html>',\n    '  <head>',\n    '    <meta charset=\"utf-8\">',\n    '    <title>500 Internal Server Error</title>',\n    '  </head>',\n    '  <body>',\n    '    <p>',\n    `      ${he.encode(error)}`,\n    '    </p>',\n    '  </body>',\n    '</html>',\n  ].join('\\n')}\\n`;\n  res.end(html);\n};\n\n// bad request\nexports['400'] = (res, next, opts) => {\n  res.statusCode = 400;\n  res.setHeader('content-type', 'text/html');\n  const error = opts && opts.error ? String(opts.error) : 'Malformed request.';\n  const html = `${[\n    '<!doctype html>',\n    '<html>',\n    '  <head>',\n    '    <meta charset=\"utf-8\">',\n    '    <title>400 Bad Request</title>',\n    '  </head>',\n    '  <body>',\n    '    <p>',\n    `      ${he.encode(error)}`,\n    '    </p>',\n    '  </body>',\n    '</html>',\n  ].join('\\n')}\\n`;\n  res.end(html);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/http-server.js",
    "content": "'use strict';\n\nvar fs = require('fs'),\n  union = require('union'),\n  httpServerCore = require('./core'),\n  auth = require('basic-auth'),\n  httpProxy = require('http-proxy'),\n  corser = require('corser'),\n  secureCompare = require('secure-compare');\n\n//\n// Remark: backwards compatibility for previous\n// case convention of HTTP\n//\nexports.HttpServer = exports.HTTPServer = HttpServer;\n\n/**\n * Returns a new instance of HttpServer with the\n * specified `options`.\n */\nexports.createServer = function (options) {\n  return new HttpServer(options);\n};\n\n/**\n * Constructor function for the HttpServer object\n * which is responsible for serving static files along\n * with other HTTP-related features.\n */\nfunction HttpServer(options) {\n  options = options || {};\n\n  if (options.root) {\n    this.root = options.root;\n  } else {\n    try {\n      // eslint-disable-next-line no-sync\n      fs.lstatSync('./public');\n      this.root = './public';\n    } catch (err) {\n      this.root = './';\n    }\n  }\n\n  this.headers = options.headers || {};\n  this.headers['Accept-Ranges'] = 'bytes';\n\n  this.cache = (\n    // eslint-disable-next-line no-nested-ternary\n    options.cache === undefined ? 3600 :\n    // -1 is a special case to turn off caching.\n    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#Preventing_caching\n      options.cache === -1 ? 'no-cache, no-store, must-revalidate' :\n        options.cache // in seconds.\n  );\n  this.showDir = options.showDir !== 'false';\n  this.autoIndex = options.autoIndex !== 'false';\n  this.showDotfiles = options.showDotfiles;\n  this.gzip = options.gzip === true;\n  this.brotli = options.brotli === true;\n  if (options.ext) {\n    this.ext = options.ext === true\n      ? 'html'\n      : options.ext;\n  }\n  this.contentType = options.contentType ||\n    this.ext === 'html' ? 'text/html' : 'application/octet-stream';\n\n  var before = options.before ? options.before.slice() : [];\n\n  if (options.logFn) {\n    before.push(function (req, res) {\n      options.logFn(req, res);\n      res.emit('next');\n    });\n  }\n\n  if (options.username || options.password) {\n    before.push(function (req, res) {\n      var credentials = auth(req);\n\n      // We perform these outside the if to avoid short-circuiting and giving\n      // an attacker knowledge of whether the username is correct via a timing\n      // attack.\n      if (credentials) {\n        // if credentials is defined, name and pass are guaranteed to be string\n        // type\n        var usernameEqual = secureCompare(options.username.toString(), credentials.name);\n        var passwordEqual = secureCompare(options.password.toString(), credentials.pass);\n        if (usernameEqual && passwordEqual) {\n          return res.emit('next');\n        }\n      }\n\n      res.statusCode = 401;\n      res.setHeader('WWW-Authenticate', 'Basic realm=\"\"');\n      res.end('Access denied');\n    });\n  }\n\n  if (options.cors) {\n    this.headers['Access-Control-Allow-Origin'] = '*';\n    this.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Range';\n    if (options.corsHeaders) {\n      options.corsHeaders.split(/\\s*,\\s*/)\n        .forEach(function (h) { this.headers['Access-Control-Allow-Headers'] += ', ' + h; }, this);\n    }\n    before.push(corser.create(options.corsHeaders ? {\n      requestHeaders: this.headers['Access-Control-Allow-Headers'].split(/\\s*,\\s*/)\n    } : null));\n  }\n\n  if (options.robots) {\n    before.push(function (req, res) {\n      if (req.url === '/robots.txt') {\n        res.setHeader('Content-Type', 'text/plain');\n        var robots = options.robots === true\n          ? 'User-agent: *\\nDisallow: /'\n          : options.robots.replace(/\\\\n/, '\\n');\n\n        return res.end(robots);\n      }\n\n      res.emit('next');\n    });\n  }\n\n  before.push(httpServerCore({\n    root: this.root,\n    cache: this.cache,\n    showDir: this.showDir,\n    showDotfiles: this.showDotfiles,\n    autoIndex: this.autoIndex,\n    defaultExt: this.ext,\n    gzip: this.gzip,\n    brotli: this.brotli,\n    contentType: this.contentType,\n    mimetypes: options.mimetypes,\n    handleError: typeof options.proxy !== 'string'\n  }));\n\n  if (typeof options.proxy === 'string') {\n    var proxyOptions = options.proxyOptions || {};\n    var proxy = httpProxy.createProxyServer(proxyOptions);\n    before.push(function (req, res) {\n      proxy.web(req, res, {\n        target: options.proxy,\n        changeOrigin: true\n      }, function (err, req, res) {\n        if (options.logFn) {\n          options.logFn(req, res, {\n            message: err.message,\n            status: res.statusCode });\n        }\n        res.emit('next');\n      });\n    });\n  }\n\n  var serverOptions = {\n    before: before,\n    headers: this.headers,\n    onError: function (err, req, res) {\n      if (options.logFn) {\n        options.logFn(req, res, err);\n      }\n\n      res.end();\n    }\n  };\n\n  if (options.https) {\n    serverOptions.https = options.https;\n  }\n\n  this.server = serverOptions.https && serverOptions.https.passphrase\n    // if passphrase is set, shim must be used as union does not support\n    ? require('./shims/https-server-shim')(serverOptions)\n    : union.createServer(serverOptions);\n\n  if (options.timeout !== undefined) {\n    this.server.setTimeout(options.timeout);\n  }\n}\n\nHttpServer.prototype.listen = function () {\n  this.server.listen.apply(this.server, arguments);\n};\n\nHttpServer.prototype.close = function () {\n  return this.server.close();\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/lib/shims/https-server-shim.js",
    "content": "/* eslint-disable no-process-env */\n/* eslint-disable no-sync */\nvar https = require('https');\nvar fs = require('fs');\nvar core = require('union/lib/core');\nvar RoutingStream = require('union/lib/routing-stream');\n\nmodule.exports = function (options) {\n  var isArray = Array.isArray(options.after);\n  var credentials;\n\n  if (!options) {\n    throw new Error('options is required to create a server');\n  }\n\n  function requestHandler(req, res) {\n    var routingStream = new RoutingStream({\n      before: options.before,\n      buffer: options.buffer,\n      after:\n        isArray &&\n        options.after.map(function (After) {\n          return new After();\n        }),\n      request: req,\n      response: res,\n      limit: options.limit,\n      headers: options.headers\n    });\n\n    routingStream.on('error', function (err) {\n      var fn = options.onError || core.errorHandler;\n      fn(err, routingStream, routingStream.target, function () {\n        routingStream.target.emit('next');\n      });\n    });\n\n    req.pipe(routingStream);\n  }\n\n  var serverOptions;\n\n  serverOptions = options.https;\n  if (!serverOptions.key || !serverOptions.cert) {\n    throw new Error(\n      'Both options key and cert are required.'\n    );\n  }\n\n  credentials = {\n    key: fs.readFileSync(serverOptions.key),\n    cert: fs.readFileSync(serverOptions.cert),\n    passphrase: process.env.NODE_HTTP_SERVER_SSL_PASSPHRASE\n  };\n\n  if (serverOptions.ca) {\n    serverOptions.ca = !Array.isArray(serverOptions.ca)\n      ? [serverOptions.ca]\n      : serverOptions.ca;\n\n    credentials.ca = serverOptions.ca.map(function (ca) {\n      return fs.readFileSync(ca);\n    });\n  }\n\n  return https.createServer(credentials, requestHandler);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/.package-lock.json",
    "content": "{\n  \"name\": \"http-server\",\n  \"version\": \"14.1.1\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/async\": {\n      \"version\": \"2.6.4\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.14\"\n      }\n    },\n    \"node_modules/basic-auth\": {\n      \"version\": \"2.0.1\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"5.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/chalk\": {\n      \"version\": \"4.1.2\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/corser\": {\n      \"version\": \"2.0.1\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"3.2.7\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.1\"\n      }\n    },\n    \"node_modules/eventemitter3\": {\n      \"version\": \"4.0.7\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/follow-redirects\": {\n      \"version\": \"1.15.2\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/RubenVerborgh\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"debug\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/has-flag\": {\n      \"version\": \"4.0.0\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/he\": {\n      \"version\": \"1.2.0\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"he\": \"bin/he\"\n      }\n    },\n    \"node_modules/html-encoding-sniffer\": {\n      \"version\": \"3.0.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"whatwg-encoding\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/http-proxy\": {\n      \"version\": \"1.18.1\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"eventemitter3\": \"^4.0.0\",\n        \"follow-redirects\": \"^1.0.0\",\n        \"requires-port\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lodash\": {\n      \"version\": \"4.17.21\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/mime\": {\n      \"version\": \"1.6.0\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"mime\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/minimist\": {\n      \"version\": \"1.2.8\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/mkdirp\": {\n      \"version\": \"0.5.6\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"minimist\": \"^1.2.6\"\n      },\n      \"bin\": {\n        \"mkdirp\": \"bin/cmd.js\"\n      }\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/opener\": {\n      \"version\": \"1.5.2\",\n      \"license\": \"(WTFPL OR MIT)\",\n      \"bin\": {\n        \"opener\": \"bin/opener-bin.js\"\n      }\n    },\n    \"node_modules/portfinder\": {\n      \"version\": \"1.0.32\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"async\": \"^2.6.4\",\n        \"debug\": \"^3.2.7\",\n        \"mkdirp\": \"^0.5.6\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.12.0\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.5.3.tgz\",\n      \"integrity\": \"sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/requires-port\": {\n      \"version\": \"1.0.0\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/secure-compare\": {\n      \"version\": \"3.0.1\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/supports-color\": {\n      \"version\": \"7.2.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/union\": {\n      \"version\": \"0.5.0\",\n      \"dependencies\": {\n        \"qs\": \"^6.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/url-join\": {\n      \"version\": \"4.0.1\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/whatwg-encoding\": {\n      \"version\": \"2.0.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"iconv-lite\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ansi-styles/index.d.ts",
    "content": "declare type CSSColor =\n\t| 'aliceblue'\n\t| 'antiquewhite'\n\t| 'aqua'\n\t| 'aquamarine'\n\t| 'azure'\n\t| 'beige'\n\t| 'bisque'\n\t| 'black'\n\t| 'blanchedalmond'\n\t| 'blue'\n\t| 'blueviolet'\n\t| 'brown'\n\t| 'burlywood'\n\t| 'cadetblue'\n\t| 'chartreuse'\n\t| 'chocolate'\n\t| 'coral'\n\t| 'cornflowerblue'\n\t| 'cornsilk'\n\t| 'crimson'\n\t| 'cyan'\n\t| 'darkblue'\n\t| 'darkcyan'\n\t| 'darkgoldenrod'\n\t| 'darkgray'\n\t| 'darkgreen'\n\t| 'darkgrey'\n\t| 'darkkhaki'\n\t| 'darkmagenta'\n\t| 'darkolivegreen'\n\t| 'darkorange'\n\t| 'darkorchid'\n\t| 'darkred'\n\t| 'darksalmon'\n\t| 'darkseagreen'\n\t| 'darkslateblue'\n\t| 'darkslategray'\n\t| 'darkslategrey'\n\t| 'darkturquoise'\n\t| 'darkviolet'\n\t| 'deeppink'\n\t| 'deepskyblue'\n\t| 'dimgray'\n\t| 'dimgrey'\n\t| 'dodgerblue'\n\t| 'firebrick'\n\t| 'floralwhite'\n\t| 'forestgreen'\n\t| 'fuchsia'\n\t| 'gainsboro'\n\t| 'ghostwhite'\n\t| 'gold'\n\t| 'goldenrod'\n\t| 'gray'\n\t| 'green'\n\t| 'greenyellow'\n\t| 'grey'\n\t| 'honeydew'\n\t| 'hotpink'\n\t| 'indianred'\n\t| 'indigo'\n\t| 'ivory'\n\t| 'khaki'\n\t| 'lavender'\n\t| 'lavenderblush'\n\t| 'lawngreen'\n\t| 'lemonchiffon'\n\t| 'lightblue'\n\t| 'lightcoral'\n\t| 'lightcyan'\n\t| 'lightgoldenrodyellow'\n\t| 'lightgray'\n\t| 'lightgreen'\n\t| 'lightgrey'\n\t| 'lightpink'\n\t| 'lightsalmon'\n\t| 'lightseagreen'\n\t| 'lightskyblue'\n\t| 'lightslategray'\n\t| 'lightslategrey'\n\t| 'lightsteelblue'\n\t| 'lightyellow'\n\t| 'lime'\n\t| 'limegreen'\n\t| 'linen'\n\t| 'magenta'\n\t| 'maroon'\n\t| 'mediumaquamarine'\n\t| 'mediumblue'\n\t| 'mediumorchid'\n\t| 'mediumpurple'\n\t| 'mediumseagreen'\n\t| 'mediumslateblue'\n\t| 'mediumspringgreen'\n\t| 'mediumturquoise'\n\t| 'mediumvioletred'\n\t| 'midnightblue'\n\t| 'mintcream'\n\t| 'mistyrose'\n\t| 'moccasin'\n\t| 'navajowhite'\n\t| 'navy'\n\t| 'oldlace'\n\t| 'olive'\n\t| 'olivedrab'\n\t| 'orange'\n\t| 'orangered'\n\t| 'orchid'\n\t| 'palegoldenrod'\n\t| 'palegreen'\n\t| 'paleturquoise'\n\t| 'palevioletred'\n\t| 'papayawhip'\n\t| 'peachpuff'\n\t| 'peru'\n\t| 'pink'\n\t| 'plum'\n\t| 'powderblue'\n\t| 'purple'\n\t| 'rebeccapurple'\n\t| 'red'\n\t| 'rosybrown'\n\t| 'royalblue'\n\t| 'saddlebrown'\n\t| 'salmon'\n\t| 'sandybrown'\n\t| 'seagreen'\n\t| 'seashell'\n\t| 'sienna'\n\t| 'silver'\n\t| 'skyblue'\n\t| 'slateblue'\n\t| 'slategray'\n\t| 'slategrey'\n\t| 'snow'\n\t| 'springgreen'\n\t| 'steelblue'\n\t| 'tan'\n\t| 'teal'\n\t| 'thistle'\n\t| 'tomato'\n\t| 'turquoise'\n\t| 'violet'\n\t| 'wheat'\n\t| 'white'\n\t| 'whitesmoke'\n\t| 'yellow'\n\t| 'yellowgreen';\n\ndeclare namespace ansiStyles {\n\tinterface ColorConvert {\n\t\t/**\n\t\tThe RGB color space.\n\n\t\t@param red - (`0`-`255`)\n\t\t@param green - (`0`-`255`)\n\t\t@param blue - (`0`-`255`)\n\t\t*/\n\t\trgb(red: number, green: number, blue: number): string;\n\n\t\t/**\n\t\tThe RGB HEX color space.\n\n\t\t@param hex - A hexadecimal string containing RGB data.\n\t\t*/\n\t\thex(hex: string): string;\n\n\t\t/**\n\t\t@param keyword - A CSS color name.\n\t\t*/\n\t\tkeyword(keyword: CSSColor): string;\n\n\t\t/**\n\t\tThe HSL color space.\n\n\t\t@param hue - (`0`-`360`)\n\t\t@param saturation - (`0`-`100`)\n\t\t@param lightness - (`0`-`100`)\n\t\t*/\n\t\thsl(hue: number, saturation: number, lightness: number): string;\n\n\t\t/**\n\t\tThe HSV color space.\n\n\t\t@param hue - (`0`-`360`)\n\t\t@param saturation - (`0`-`100`)\n\t\t@param value - (`0`-`100`)\n\t\t*/\n\t\thsv(hue: number, saturation: number, value: number): string;\n\n\t\t/**\n\t\tThe HSV color space.\n\n\t\t@param hue - (`0`-`360`)\n\t\t@param whiteness - (`0`-`100`)\n\t\t@param blackness - (`0`-`100`)\n\t\t*/\n\t\thwb(hue: number, whiteness: number, blackness: number): string;\n\n\t\t/**\n\t\tUse a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color.\n\t\t*/\n\t\tansi(ansi: number): string;\n\n\t\t/**\n\t\tUse an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.\n\t\t*/\n\t\tansi256(ansi: number): string;\n\t}\n\n\tinterface CSPair {\n\t\t/**\n\t\tThe ANSI terminal control sequence for starting this style.\n\t\t*/\n\t\treadonly open: string;\n\n\t\t/**\n\t\tThe ANSI terminal control sequence for ending this style.\n\t\t*/\n\t\treadonly close: string;\n\t}\n\n\tinterface ColorBase {\n\t\treadonly ansi: ColorConvert;\n\t\treadonly ansi256: ColorConvert;\n\t\treadonly ansi16m: ColorConvert;\n\n\t\t/**\n\t\tThe ANSI terminal control sequence for ending this color.\n\t\t*/\n\t\treadonly close: string;\n\t}\n\n\tinterface Modifier {\n\t\t/**\n\t\tResets the current color chain.\n\t\t*/\n\t\treadonly reset: CSPair;\n\n\t\t/**\n\t\tMake text bold.\n\t\t*/\n\t\treadonly bold: CSPair;\n\n\t\t/**\n\t\tEmitting only a small amount of light.\n\t\t*/\n\t\treadonly dim: CSPair;\n\n\t\t/**\n\t\tMake text italic. (Not widely supported)\n\t\t*/\n\t\treadonly italic: CSPair;\n\n\t\t/**\n\t\tMake text underline. (Not widely supported)\n\t\t*/\n\t\treadonly underline: CSPair;\n\n\t\t/**\n\t\tInverse background and foreground colors.\n\t\t*/\n\t\treadonly inverse: CSPair;\n\n\t\t/**\n\t\tPrints the text, but makes it invisible.\n\t\t*/\n\t\treadonly hidden: CSPair;\n\n\t\t/**\n\t\tPuts a horizontal line through the center of the text. (Not widely supported)\n\t\t*/\n\t\treadonly strikethrough: CSPair;\n\t}\n\n\tinterface ForegroundColor {\n\t\treadonly black: CSPair;\n\t\treadonly red: CSPair;\n\t\treadonly green: CSPair;\n\t\treadonly yellow: CSPair;\n\t\treadonly blue: CSPair;\n\t\treadonly cyan: CSPair;\n\t\treadonly magenta: CSPair;\n\t\treadonly white: CSPair;\n\n\t\t/**\n\t\tAlias for `blackBright`.\n\t\t*/\n\t\treadonly gray: CSPair;\n\n\t\t/**\n\t\tAlias for `blackBright`.\n\t\t*/\n\t\treadonly grey: CSPair;\n\n\t\treadonly blackBright: CSPair;\n\t\treadonly redBright: CSPair;\n\t\treadonly greenBright: CSPair;\n\t\treadonly yellowBright: CSPair;\n\t\treadonly blueBright: CSPair;\n\t\treadonly cyanBright: CSPair;\n\t\treadonly magentaBright: CSPair;\n\t\treadonly whiteBright: CSPair;\n\t}\n\n\tinterface BackgroundColor {\n\t\treadonly bgBlack: CSPair;\n\t\treadonly bgRed: CSPair;\n\t\treadonly bgGreen: CSPair;\n\t\treadonly bgYellow: CSPair;\n\t\treadonly bgBlue: CSPair;\n\t\treadonly bgCyan: CSPair;\n\t\treadonly bgMagenta: CSPair;\n\t\treadonly bgWhite: CSPair;\n\n\t\t/**\n\t\tAlias for `bgBlackBright`.\n\t\t*/\n\t\treadonly bgGray: CSPair;\n\n\t\t/**\n\t\tAlias for `bgBlackBright`.\n\t\t*/\n\t\treadonly bgGrey: CSPair;\n\n\t\treadonly bgBlackBright: CSPair;\n\t\treadonly bgRedBright: CSPair;\n\t\treadonly bgGreenBright: CSPair;\n\t\treadonly bgYellowBright: CSPair;\n\t\treadonly bgBlueBright: CSPair;\n\t\treadonly bgCyanBright: CSPair;\n\t\treadonly bgMagentaBright: CSPair;\n\t\treadonly bgWhiteBright: CSPair;\n\t}\n}\n\ndeclare const ansiStyles: {\n\treadonly modifier: ansiStyles.Modifier;\n\treadonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase;\n\treadonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase;\n\treadonly codes: ReadonlyMap<number, number>;\n} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier;\n\nexport = ansiStyles;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ansi-styles/index.js",
    "content": "'use strict';\n\nconst wrapAnsi16 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => (...args) => {\n\tconst rgb = fn(...args);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nconst ansi2ansi = n => n;\nconst rgb2rgb = (r, g, b) => [r, g, b];\n\nconst setLazyProperty = (object, property, get) => {\n\tObject.defineProperty(object, property, {\n\t\tget: () => {\n\t\t\tconst value = get();\n\n\t\t\tObject.defineProperty(object, property, {\n\t\t\t\tvalue,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\treturn value;\n\t\t},\n\t\tenumerable: true,\n\t\tconfigurable: true\n\t});\n};\n\n/** @type {typeof import('color-convert')} */\nlet colorConvert;\nconst makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {\n\tif (colorConvert === undefined) {\n\t\tcolorConvert = require('color-convert');\n\t}\n\n\tconst offset = isBackground ? 10 : 0;\n\tconst styles = {};\n\n\tfor (const [sourceSpace, suite] of Object.entries(colorConvert)) {\n\t\tconst name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;\n\t\tif (sourceSpace === targetSpace) {\n\t\t\tstyles[name] = wrap(identity, offset);\n\t\t} else if (typeof suite === 'object') {\n\t\t\tstyles[name] = wrap(suite[targetSpace], offset);\n\t\t}\n\t}\n\n\treturn styles;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\n\t\t\t// Bright color\n\t\t\tblackBright: [90, 39],\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Alias bright black as gray (and grey)\n\tstyles.color.gray = styles.color.blackBright;\n\tstyles.bgColor.bgGray = styles.bgColor.bgBlackBright;\n\tstyles.color.grey = styles.color.blackBright;\n\tstyles.bgColor.bgGrey = styles.bgColor.bgBlackBright;\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tsetLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));\n\tsetLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ansi-styles/license",
    "content": "MIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ansi-styles/package.json",
    "content": "{\n\t\"name\": \"ansi-styles\",\n\t\"version\": \"4.3.0\",\n\t\"description\": \"ANSI escape codes for styling strings in the terminal\",\n\t\"license\": \"MIT\",\n\t\"repository\": \"chalk/ansi-styles\",\n\t\"funding\": \"https://github.com/chalk/ansi-styles?sponsor=1\",\n\t\"author\": {\n\t\t\"name\": \"Sindre Sorhus\",\n\t\t\"email\": \"sindresorhus@gmail.com\",\n\t\t\"url\": \"sindresorhus.com\"\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=8\"\n\t},\n\t\"scripts\": {\n\t\t\"test\": \"xo && ava && tsd\",\n\t\t\"screenshot\": \"svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor\"\n\t},\n\t\"files\": [\n\t\t\"index.js\",\n\t\t\"index.d.ts\"\n\t],\n\t\"keywords\": [\n\t\t\"ansi\",\n\t\t\"styles\",\n\t\t\"color\",\n\t\t\"colour\",\n\t\t\"colors\",\n\t\t\"terminal\",\n\t\t\"console\",\n\t\t\"cli\",\n\t\t\"string\",\n\t\t\"tty\",\n\t\t\"escape\",\n\t\t\"formatting\",\n\t\t\"rgb\",\n\t\t\"256\",\n\t\t\"shell\",\n\t\t\"xterm\",\n\t\t\"log\",\n\t\t\"logging\",\n\t\t\"command-line\",\n\t\t\"text\"\n\t],\n\t\"dependencies\": {\n\t\t\"color-convert\": \"^2.0.1\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/color-convert\": \"^1.9.0\",\n\t\t\"ava\": \"^2.3.0\",\n\t\t\"svg-term-cli\": \"^2.1.1\",\n\t\t\"tsd\": \"^0.11.0\",\n\t\t\"xo\": \"^0.25.3\"\n\t}\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ansi-styles/readme.md",
    "content": "# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)\n\n> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal\n\nYou probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.\n\n<img src=\"screenshot.svg\" width=\"900\">\n\n## Install\n\n```\n$ npm install ansi-styles\n```\n\n## Usage\n\n```js\nconst style = require('ansi-styles');\n\nconsole.log(`${style.green.open}Hello world!${style.green.close}`);\n\n\n// Color conversion between 16/256/truecolor\n// NOTE: If conversion goes to 16 colors or 256 colors, the original color\n//       may be degraded to fit that color palette. This means terminals\n//       that do not support 16 million colors will best-match the\n//       original color.\nconsole.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);\nconsole.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);\nconsole.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close);\n```\n\n## API\n\nEach style has an `open` and `close` property.\n\n## Styles\n\n### Modifiers\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(Not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(Not widely supported)*\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `blackBright` (alias: `gray`, `grey`)\n- `redBright`\n- `greenBright`\n- `yellowBright`\n- `blueBright`\n- `magentaBright`\n- `cyanBright`\n- `whiteBright`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n- `bgBlackBright` (alias: `bgGray`, `bgGrey`)\n- `bgRedBright`\n- `bgGreenBright`\n- `bgYellowBright`\n- `bgBlueBright`\n- `bgMagentaBright`\n- `bgCyanBright`\n- `bgWhiteBright`\n\n## Advanced usage\n\nBy default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.\n\n- `style.modifier`\n- `style.color`\n- `style.bgColor`\n\n###### Example\n\n```js\nconsole.log(style.color.green.open);\n```\n\nRaw escape codes (i.e. without the CSI escape prefix `\\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.\n\n###### Example\n\n```js\nconsole.log(style.codes.get(36));\n//=> 39\n```\n\n## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)\n\n`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.\n\nThe following color spaces from `color-convert` are supported:\n\n- `rgb`\n- `hex`\n- `keyword`\n- `hsl`\n- `hsv`\n- `hwb`\n- `ansi`\n- `ansi256`\n\nTo use these, call the associated conversion function with the intended output, for example:\n\n```js\nstyle.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code\nstyle.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code\n\nstyle.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code\nstyle.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code\n\nstyle.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code\nstyle.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code\n```\n\n## Related\n\n- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n## For enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/CHANGELOG.md",
    "content": "# v2.6.4\n- Fix potential prototype pollution exploit (#1828)\n\n# v2.6.3\n- Updated lodash to squelch a security warning (#1675)\n\n# v2.6.2\n- Updated lodash to squelch a security warning (#1620)\n\n# v2.6.1\n- Updated lodash to prevent `npm audit` warnings. (#1532, #1533)\n- Made `async-es` more optimized for webpack users (#1517)\n- Fixed a stack overflow with large collections and a synchronous iterator (#1514)\n- Various small fixes/chores (#1505, #1511, #1527, #1530)\n\n# v2.6.0\n- Added missing aliases for many methods.  Previously, you could not (e.g.) `require('async/find')` or use `async.anyLimit`. (#1483)\n- Improved `queue` performance. (#1448, #1454)\n- Add missing sourcemap (#1452, #1453)\n- Various doc updates (#1448, #1471, #1483)\n\n# v2.5.0\n- Added `concatLimit`, the `Limit` equivalent of [`concat`](https://caolan.github.io/async/docs.html#concat) ([#1426](https://github.com/caolan/async/issues/1426), [#1430](https://github.com/caolan/async/pull/1430))\n- `concat` improvements: it now preserves order, handles falsy values and the `iteratee` callback takes a variable number of arguments ([#1437](https://github.com/caolan/async/issues/1437), [#1436](https://github.com/caolan/async/pull/1436))\n- Fixed an issue in `queue`  where there was a size discrepancy between `workersList().length` and `running()` ([#1428](https://github.com/caolan/async/issues/1428), [#1429](https://github.com/caolan/async/pull/1429))\n- Various doc fixes ([#1422](https://github.com/caolan/async/issues/1422), [#1424](https://github.com/caolan/async/pull/1424))\n\n# v2.4.1\n- Fixed a bug preventing functions wrapped  with `timeout()` from being re-used. ([#1418](https://github.com/caolan/async/issues/1418), [#1419](https://github.com/caolan/async/issues/1419))\n\n# v2.4.0\n- Added `tryEach`, for running async functions in parallel, where you only expect one to succeed. ([#1365](https://github.com/caolan/async/issues/1365), [#687](https://github.com/caolan/async/issues/687))\n- Improved performance, most notably in `parallel` and `waterfall` ([#1395](https://github.com/caolan/async/issues/1395))\n- Added `queue.remove()`, for removing items in a `queue` ([#1397](https://github.com/caolan/async/issues/1397), [#1391](https://github.com/caolan/async/issues/1391))\n- Fixed using `eval`, preventing Async from running in pages with Content Security Policy ([#1404](https://github.com/caolan/async/issues/1404), [#1403](https://github.com/caolan/async/issues/1403))\n- Fixed errors thrown in an `asyncify`ed function's callback being caught by the underlying Promise ([#1408](https://github.com/caolan/async/issues/1408))\n- Fixed timing of `queue.empty()` ([#1367](https://github.com/caolan/async/issues/1367))\n- Various doc fixes ([#1314](https://github.com/caolan/async/issues/1314), [#1394](https://github.com/caolan/async/issues/1394), [#1412](https://github.com/caolan/async/issues/1412))\n\n# v2.3.0\n- Added support for ES2017 `async` functions.  Wherever you can pass a Node-style/CPS function that uses a callback, you can also pass an `async` function.  Previously, you had to wrap `async` functions with `asyncify`.  The caveat is that it will only work if `async` functions are supported natively in your environment, transpiled implementations can't be detected.  ([#1386](https://github.com/caolan/async/issues/1386), [#1390](https://github.com/caolan/async/issues/1390))\n- Small doc fix ([#1392](https://github.com/caolan/async/issues/1392))\n\n# v2.2.0\n- Added `groupBy`, and the `Series`/`Limit` equivalents, analogous to [`_.groupBy`](http://lodash.com/docs#groupBy) ([#1364](https://github.com/caolan/async/issues/1364))\n- Fixed `transform` bug when `callback` was not passed ([#1381](https://github.com/caolan/async/issues/1381))\n- Added note about `reflect` to `parallel` docs ([#1385](https://github.com/caolan/async/issues/1385))\n\n# v2.1.5\n- Fix `auto` bug when function names collided with Array.prototype ([#1358](https://github.com/caolan/async/issues/1358))\n- Improve some error messages ([#1349](https://github.com/caolan/async/issues/1349))\n- Avoid stack overflow case in queue\n- Fixed an issue in `some`, `every` and `find` where processing would continue after the result was determined.\n- Cleanup implementations of `some`, `every` and `find`\n\n# v2.1.3\n- Make bundle size smaller\n- Create optimized hotpath for `filter` in array case.\n\n# v2.1.2\n- Fixed a stackoverflow bug with `detect`, `some`, `every` on large inputs ([#1293](https://github.com/caolan/async/issues/1293)).\n\n# v2.1.0\n\n- `retry` and `retryable` now support an optional `errorFilter` function that determines if the `task` should retry on the error ([#1256](https://github.com/caolan/async/issues/1256), [#1261](https://github.com/caolan/async/issues/1261))\n- Optimized array iteration in `race`, `cargo`, `queue`, and `priorityQueue` ([#1253](https://github.com/caolan/async/issues/1253))\n- Added alias documentation to doc site ([#1251](https://github.com/caolan/async/issues/1251), [#1254](https://github.com/caolan/async/issues/1254))\n- Added [BootStrap scrollspy](http://getbootstrap.com/javascript/#scrollspy) to docs to highlight in the sidebar the current method being viewed  ([#1289](https://github.com/caolan/async/issues/1289), [#1300](https://github.com/caolan/async/issues/1300))\n- Various minor doc fixes ([#1263](https://github.com/caolan/async/issues/1263), [#1264](https://github.com/caolan/async/issues/1264), [#1271](https://github.com/caolan/async/issues/1271), [#1278](https://github.com/caolan/async/issues/1278), [#1280](https://github.com/caolan/async/issues/1280), [#1282](https://github.com/caolan/async/issues/1282), [#1302](https://github.com/caolan/async/issues/1302))\n\n# v2.0.1\n\n- Significantly optimized all iteration based collection methods such as `each`, `map`, `filter`, etc ([#1245](https://github.com/caolan/async/issues/1245), [#1246](https://github.com/caolan/async/issues/1246), [#1247](https://github.com/caolan/async/issues/1247)).\n\n# v2.0.0\n\nLots of changes here!\n\nFirst and foremost, we have a slick new [site for docs](https://caolan.github.io/async/). Special thanks to [**@hargasinski**](https://github.com/hargasinski) for his work converting our old docs to `jsdoc` format and implementing the new website. Also huge ups to [**@ivanseidel**](https://github.com/ivanseidel) for designing our new logo. It was a long process for both of these tasks, but I think these changes turned out extraordinary well.\n\nThe biggest feature is modularization. You can now `require(\"async/series\")` to only require the `series` function. Every Async library function is available this way. You still can `require(\"async\")` to require the entire library, like you could do before.\n\nWe also provide Async as a collection of ES2015 modules. You can now `import {each} from 'async-es'` or `import waterfall from 'async-es/waterfall'`. If you are using only a few Async functions, and are using a ES bundler such as Rollup, this can significantly lower your build size.\n\nMajor thanks to [**@Kikobeats**](github.com/Kikobeats), [**@aearly**](github.com/aearly) and [**@megawac**](github.com/megawac) for doing the majority of the modularization work, as well as [**@jdalton**](github.com/jdalton) and [**@Rich-Harris**](github.com/Rich-Harris) for advisory work on the general modularization strategy.\n\nAnother one of the general themes of the 2.0 release is standardization of what an \"async\" function is. We are now more strictly following the node-style continuation passing style. That is, an async function is a function that:\n\n1. Takes a variable number of arguments\n2. The last argument is always a callback\n3. The callback can accept any number of arguments\n4. The first argument passed to the callback will be treated as an error result, if the argument is truthy\n5. Any number of result arguments can be passed after the \"error\" argument\n6. The callback is called once and exactly once, either on the same tick or later tick of the JavaScript event loop.\n\nThere were several cases where Async accepted some functions that did not strictly have these properties, most notably `auto`, `every`, `some`, `filter`, `reject` and `detect`.\n\nAnother theme is performance. We have eliminated internal deferrals in all cases where they make sense. For example, in `waterfall` and `auto`, there was a `setImmediate` between each task -- these deferrals have been removed. A `setImmediate` call can add up to 1ms of delay. This might not seem like a lot, but it can add up if you are using many Async functions in the course of processing a HTTP request, for example. Nearly all asynchronous functions that do I/O already have some sort of deferral built in, so the extra deferral is unnecessary. The trade-off of this change is removing our built-in stack-overflow defense. Many synchronous callback calls in series can quickly overflow the JS call stack. If you do have a function that is sometimes synchronous (calling its callback on the same tick), and are running into stack overflows, wrap it with `async.ensureAsync()`.\n\nAnother big performance win has been re-implementing `queue`, `cargo`, and `priorityQueue` with [doubly linked lists](https://en.wikipedia.org/wiki/Doubly_linked_list) instead of arrays. This has lead to queues being an order of [magnitude faster on large sets of tasks](https://github.com/caolan/async/pull/1205).\n\n## New Features\n\n- Async is now modularized. Individual functions can be `require()`d from the main package. (`require('async/auto')`) ([#984](https://github.com/caolan/async/issues/984), [#996](https://github.com/caolan/async/issues/996))\n- Async is also available as a collection of ES2015 modules in the new `async-es` package. (`import {forEachSeries} from 'async-es'`) ([#984](https://github.com/caolan/async/issues/984), [#996](https://github.com/caolan/async/issues/996))\n- Added `race`, analogous to `Promise.race()`. It will run an array of async tasks in parallel and will call its callback with the result of the first task to respond. ([#568](https://github.com/caolan/async/issues/568), [#1038](https://github.com/caolan/async/issues/1038))\n- Collection methods now accept ES2015 iterators.  Maps, Sets, and anything that implements the iterator spec can now be passed directly to `each`, `map`, `parallel`, etc.. ([#579](https://github.com/caolan/async/issues/579), [#839](https://github.com/caolan/async/issues/839), [#1074](https://github.com/caolan/async/issues/1074))\n- Added `mapValues`, for mapping over the properties of an object and returning an object with the same keys. ([#1157](https://github.com/caolan/async/issues/1157), [#1177](https://github.com/caolan/async/issues/1177))\n- Added `timeout`, a wrapper for an async function that will make the task time-out after the specified time. ([#1007](https://github.com/caolan/async/issues/1007), [#1027](https://github.com/caolan/async/issues/1027))\n- Added `reflect` and `reflectAll`, analagous to [`Promise.reflect()`](http://bluebirdjs.com/docs/api/reflect.html), a wrapper for async tasks that always succeeds, by gathering results and errors into an object.  ([#942](https://github.com/caolan/async/issues/942), [#1012](https://github.com/caolan/async/issues/1012), [#1095](https://github.com/caolan/async/issues/1095))\n- `constant` supports dynamic arguments -- it will now always use its last argument as the callback. ([#1016](https://github.com/caolan/async/issues/1016), [#1052](https://github.com/caolan/async/issues/1052))\n- `setImmediate` and `nextTick` now support arguments to partially apply to the deferred function, like the node-native versions do. ([#940](https://github.com/caolan/async/issues/940), [#1053](https://github.com/caolan/async/issues/1053))\n- `auto` now supports resolving cyclic dependencies using [Kahn's algorithm](https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm) ([#1140](https://github.com/caolan/async/issues/1140)).\n- Added `autoInject`, a relative of `auto` that automatically spreads a task's dependencies as arguments to the task function. ([#608](https://github.com/caolan/async/issues/608), [#1055](https://github.com/caolan/async/issues/1055), [#1099](https://github.com/caolan/async/issues/1099), [#1100](https://github.com/caolan/async/issues/1100))\n- You can now limit the concurrency of `auto` tasks. ([#635](https://github.com/caolan/async/issues/635), [#637](https://github.com/caolan/async/issues/637))\n- Added `retryable`, a relative of `retry` that wraps an async function, making it retry when called. ([#1058](https://github.com/caolan/async/issues/1058))\n- `retry` now supports specifying a function that determines the next time interval, useful for exponential backoff, logging and other retry strategies. ([#1161](https://github.com/caolan/async/issues/1161))\n- `retry` will now pass all of the arguments the task function was resolved with to the callback ([#1231](https://github.com/caolan/async/issues/1231)).\n- Added `q.unsaturated` -- callback called when a `queue`'s number of running workers falls below a threshold. ([#868](https://github.com/caolan/async/issues/868), [#1030](https://github.com/caolan/async/issues/1030), [#1033](https://github.com/caolan/async/issues/1033), [#1034](https://github.com/caolan/async/issues/1034))\n- Added `q.error` -- a callback called whenever a `queue` task calls its callback with an error. ([#1170](https://github.com/caolan/async/issues/1170))\n- `applyEach` and `applyEachSeries` now pass results to the final callback. ([#1088](https://github.com/caolan/async/issues/1088))\n\n## Breaking changes\n\n- Calling a callback more than once is considered an error, and an error will be thrown. This had an explicit breaking change in `waterfall`. If you were relying on this behavior, you should more accurately represent your control flow as an event emitter or stream. ([#814](https://github.com/caolan/async/issues/814), [#815](https://github.com/caolan/async/issues/815), [#1048](https://github.com/caolan/async/issues/1048), [#1050](https://github.com/caolan/async/issues/1050))\n- `auto` task functions now always take the callback as the last argument. If a task has dependencies, the `results` object will be passed as the first argument. To migrate old task functions, wrap them with [`_.flip`](https://lodash.com/docs#flip) ([#1036](https://github.com/caolan/async/issues/1036), [#1042](https://github.com/caolan/async/issues/1042))\n- Internal `setImmediate` calls have been refactored away. This may make existing flows vulnerable to stack overflows if you use many synchronous functions in series. Use `ensureAsync` to work around this. ([#696](https://github.com/caolan/async/issues/696), [#704](https://github.com/caolan/async/issues/704), [#1049](https://github.com/caolan/async/issues/1049), [#1050](https://github.com/caolan/async/issues/1050))\n- `map` used to return an object when iterating over an object.  `map` now always returns an array, like in other libraries.  The previous object behavior has been split out into `mapValues`. ([#1157](https://github.com/caolan/async/issues/1157), [#1177](https://github.com/caolan/async/issues/1177))\n- `filter`, `reject`, `some`, `every`, `detect` and their families like `{METHOD}Series` and `{METHOD}Limit` now expect an error as the first callback argument, rather than just a simple boolean. Pass `null` as the first argument, or use `fs.access` instead of `fs.exists`. ([#118](https://github.com/caolan/async/issues/118), [#774](https://github.com/caolan/async/issues/774), [#1028](https://github.com/caolan/async/issues/1028), [#1041](https://github.com/caolan/async/issues/1041))\n- `{METHOD}` and `{METHOD}Series` are now implemented in terms of `{METHOD}Limit`. This is a major internal simplification, and is not expected to cause many problems, but it does subtly affect how functions execute internally. ([#778](https://github.com/caolan/async/issues/778), [#847](https://github.com/caolan/async/issues/847))\n- `retry`'s callback is now optional. Previously, omitting the callback would partially apply the function, meaning it could be passed directly as a task to `series` or `auto`. The partially applied \"control-flow\" behavior has been separated out into `retryable`. ([#1054](https://github.com/caolan/async/issues/1054), [#1058](https://github.com/caolan/async/issues/1058))\n- The test function for `whilst`, `until`, and `during` used to be passed non-error args from the iteratee function's callback, but this led to weirdness where the first call of the test function would be passed no args. We have made it so the test function is never passed extra arguments, and only the `doWhilst`, `doUntil`, and `doDuring` functions pass iteratee callback arguments to the test function ([#1217](https://github.com/caolan/async/issues/1217), [#1224](https://github.com/caolan/async/issues/1224))\n- The `q.tasks` array has been renamed `q._tasks` and is now implemented as a doubly linked list (DLL). Any code that used to interact with this array will need to be updated to either use the provided helpers or support DLLs ([#1205](https://github.com/caolan/async/issues/1205)).\n- The timing of the `q.saturated()` callback in a `queue` has been modified to better reflect when tasks pushed to the queue will start queueing. ([#724](https://github.com/caolan/async/issues/724), [#1078](https://github.com/caolan/async/issues/1078))\n- Removed `iterator` method in favour of [ES2015 iterator protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators ) which natively supports arrays ([#1237](https://github.com/caolan/async/issues/1237))\n- Dropped support for Component, Jam, SPM, and Volo ([#1175](https://github.com/caolan/async/issues/1175), #[#176](https://github.com/caolan/async/issues/176))\n\n## Bug Fixes\n\n- Improved handling of no dependency cases in `auto` & `autoInject` ([#1147](https://github.com/caolan/async/issues/1147)).\n- Fixed a bug where the callback generated by `asyncify` with  `Promises` could resolve twice ([#1197](https://github.com/caolan/async/issues/1197)).\n- Fixed several documented optional callbacks not actually being optional ([#1223](https://github.com/caolan/async/issues/1223)).\n\n## Other\n\n- Added `someSeries` and `everySeries` for symmetry, as well as a complete set of `any`/`anyLimit`/`anySeries` and `all`/`/allLmit`/`allSeries` aliases.\n- Added `find` as an alias for `detect. (as well as `findLimit` and `findSeries`).\n- Various doc fixes ([#1005](https://github.com/caolan/async/issues/1005), [#1008](https://github.com/caolan/async/issues/1008), [#1010](https://github.com/caolan/async/issues/1010), [#1015](https://github.com/caolan/async/issues/1015), [#1021](https://github.com/caolan/async/issues/1021), [#1037](https://github.com/caolan/async/issues/1037), [#1039](https://github.com/caolan/async/issues/1039), [#1051](https://github.com/caolan/async/issues/1051), [#1102](https://github.com/caolan/async/issues/1102), [#1107](https://github.com/caolan/async/issues/1107), [#1121](https://github.com/caolan/async/issues/1121), [#1123](https://github.com/caolan/async/issues/1123), [#1129](https://github.com/caolan/async/issues/1129), [#1135](https://github.com/caolan/async/issues/1135), [#1138](https://github.com/caolan/async/issues/1138), [#1141](https://github.com/caolan/async/issues/1141), [#1153](https://github.com/caolan/async/issues/1153), [#1216](https://github.com/caolan/async/issues/1216), [#1217](https://github.com/caolan/async/issues/1217), [#1232](https://github.com/caolan/async/issues/1232), [#1233](https://github.com/caolan/async/issues/1233), [#1236](https://github.com/caolan/async/issues/1236), [#1238](https://github.com/caolan/async/issues/1238))\n\nThank you [**@aearly**](github.com/aearly) and [**@megawac**](github.com/megawac) for taking the lead on version 2 of async.\n\n------------------------------------------\n\n# v1.5.2\n- Allow using `\"constructor\"` as an argument in `memoize` ([#998](https://github.com/caolan/async/issues/998))\n- Give a better error messsage when `auto` dependency checking fails ([#994](https://github.com/caolan/async/issues/994))\n- Various doc updates ([#936](https://github.com/caolan/async/issues/936), [#956](https://github.com/caolan/async/issues/956), [#979](https://github.com/caolan/async/issues/979), [#1002](https://github.com/caolan/async/issues/1002))\n\n# v1.5.1\n- Fix issue with `pause` in `queue` with concurrency enabled ([#946](https://github.com/caolan/async/issues/946))\n- `while` and `until` now pass the final result to callback ([#963](https://github.com/caolan/async/issues/963))\n- `auto` will properly handle concurrency when there is no callback ([#966](https://github.com/caolan/async/issues/966))\n- `auto` will no. properly stop execution when an error occurs ([#988](https://github.com/caolan/async/issues/988), [#993](https://github.com/caolan/async/issues/993))\n- Various doc fixes ([#971](https://github.com/caolan/async/issues/971), [#980](https://github.com/caolan/async/issues/980))\n\n# v1.5.0\n\n- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) ([#892](https://github.com/caolan/async/issues/892))\n- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. ([#873](https://github.com/caolan/async/issues/873))\n- `auto` now accepts an optional `concurrency` argument to limit the number o. running tasks ([#637](https://github.com/caolan/async/issues/637))\n- Added `queue#workersList()`, to retrieve the lis. of currently running tasks. ([#891](https://github.com/caolan/async/issues/891))\n- Various code simplifications ([#896](https://github.com/caolan/async/issues/896), [#904](https://github.com/caolan/async/issues/904))\n- Various doc fixes :scroll: ([#890](https://github.com/caolan/async/issues/890), [#894](https://github.com/caolan/async/issues/894), [#903](https://github.com/caolan/async/issues/903), [#905](https://github.com/caolan/async/issues/905), [#912](https://github.com/caolan/async/issues/912))\n\n# v1.4.2\n\n- Ensure coverage files don't get published on npm ([#879](https://github.com/caolan/async/issues/879))\n\n# v1.4.1\n\n- Add in overlooked `detectLimit` method ([#866](https://github.com/caolan/async/issues/866))\n- Removed unnecessary files from npm releases ([#861](https://github.com/caolan/async/issues/861))\n- Removed usage of a reserved word to prevent :boom: in older environments ([#870](https://github.com/caolan/async/issues/870))\n\n# v1.4.0\n\n- `asyncify` now supports promises ([#840](https://github.com/caolan/async/issues/840))\n- Added `Limit` versions of `filter` and `reject` ([#836](https://github.com/caolan/async/issues/836))\n- Add `Limit` versions of `detect`, `some` and `every` ([#828](https://github.com/caolan/async/issues/828), [#829](https://github.com/caolan/async/issues/829))\n- `some`, `every` and `detect` now short circuit early ([#828](https://github.com/caolan/async/issues/828), [#829](https://github.com/caolan/async/issues/829))\n- Improve detection of the global object ([#804](https://github.com/caolan/async/issues/804)), enabling use in WebWorkers\n- `whilst` now called with arguments from iterator ([#823](https://github.com/caolan/async/issues/823))\n- `during` now gets called with arguments from iterator ([#824](https://github.com/caolan/async/issues/824))\n- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0))\n\n\n# v1.3.0\n\nNew Features:\n- Added `constant`\n- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. ([#671](https://github.com/caolan/async/issues/671), [#806](https://github.com/caolan/async/issues/806))\n- Added `during` and `doDuring`, which are like `whilst` with an async truth test. ([#800](https://github.com/caolan/async/issues/800))\n- `retry` now accepts an `interval` parameter to specify a delay between retries. ([#793](https://github.com/caolan/async/issues/793))\n- `async` should work better in Web Workers due to better `root` detection ([#804](https://github.com/caolan/async/issues/804))\n- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` ([#642](https://github.com/caolan/async/issues/642))\n- Various internal updates ([#786](https://github.com/caolan/async/issues/786), [#801](https://github.com/caolan/async/issues/801), [#802](https://github.com/caolan/async/issues/802), [#803](https://github.com/caolan/async/issues/803))\n- Various doc fixes ([#790](https://github.com/caolan/async/issues/790), [#794](https://github.com/caolan/async/issues/794))\n\nBug Fixes:\n- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. ([#740](https://github.com/caolan/async/issues/740), [#744](https://github.com/caolan/async/issues/744), [#783](https://github.com/caolan/async/issues/783))\n\n\n# v1.2.1\n\nBug Fix:\n\n- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. ([#782](https://github.com/caolan/async/issues/782))\n\n\n# v1.2.0\n\nNew Features:\n\n- Added `timesLimit` ([#743](https://github.com/caolan/async/issues/743))\n- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`. The new concurrency will be reflected the next time a task is processed. ([#747](https://github.com/caolan/async/issues/747), [#772](https://github.com/caolan/async/issues/772))\n\nBug Fixes:\n\n- Fixed a regression in `each` and family with empty arrays that have additional properties. ([#775](https://github.com/caolan/async/issues/775), [#777](https://github.com/caolan/async/issues/777))\n\n\n# v1.1.1\n\nBug Fix:\n\n- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. ([#782](https://github.com/caolan/async/issues/782))\n\n\n# v1.1.0\n\nNew Features:\n\n- `cargo` now supports all of the same methods and event callbacks as `queue`.\n- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. ([#769](https://github.com/caolan/async/issues/769))\n- Optimized `map`, `eachOf`, and `waterfall` families of functions\n- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array ([#667](https://github.com/caolan/async/issues/667)).\n- The callback is now optional for the composed results of `compose` and `seq`. ([#618](https://github.com/caolan/async/issues/618))\n- Reduced file size by 4kb, (minified version by 1kb)\n- Added code coverage through `nyc` and `coveralls` ([#768](https://github.com/caolan/async/issues/768))\n\nBug Fixes:\n\n- `forever` will no longer stack overflow with a synchronous iterator ([#622](https://github.com/caolan/async/issues/622))\n- `eachLimit` and other limit functions will stop iterating once an error occurs ([#754](https://github.com/caolan/async/issues/754))\n- Always pass `null` in callbacks when there is no error ([#439](https://github.com/caolan/async/issues/439))\n- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue ([#668](https://github.com/caolan/async/issues/668))\n- `each` and family will properly handle an empty array ([#578](https://github.com/caolan/async/issues/578))\n- `eachSeries` and family will finish if the underlying array is modified during execution ([#557](https://github.com/caolan/async/issues/557))\n- `queue` will throw if a non-function is passed to `q.push()` ([#593](https://github.com/caolan/async/issues/593))\n- Doc fixes ([#629](https://github.com/caolan/async/issues/629), [#766](https://github.com/caolan/async/issues/766))\n\n\n# v1.0.0\n\nNo known breaking changes, we are simply complying with semver from here on out.\n\nChanges:\n\n- Start using a changelog!\n- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) ([#168](https://github.com/caolan/async/issues/168) [#704](https://github.com/caolan/async/issues/704) [#321](https://github.com/caolan/async/issues/321))\n- Detect deadlocks in `auto` ([#663](https://github.com/caolan/async/issues/663))\n- Better support for require.js ([#527](https://github.com/caolan/async/issues/527))\n- Throw if queue created with concurrency `0` ([#714](https://github.com/caolan/async/issues/714))\n- Fix unneeded iteration in `queue.resume()` ([#758](https://github.com/caolan/async/issues/758))\n- Guard against timer mocking overriding `setImmediate` ([#609](https://github.com/caolan/async/issues/609) [#611](https://github.com/caolan/async/issues/611))\n- Miscellaneous doc fixes ([#542](https://github.com/caolan/async/issues/542) [#596](https://github.com/caolan/async/issues/596) [#615](https://github.com/caolan/async/issues/615) [#628](https://github.com/caolan/async/issues/628) [#631](https://github.com/caolan/async/issues/631) [#690](https://github.com/caolan/async/issues/690) [#729](https://github.com/caolan/async/issues/729))\n- Use single noop function internally ([#546](https://github.com/caolan/async/issues/546))\n- Optimize internal `_each`, `_map` and `_keys` functions.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/LICENSE",
    "content": "Copyright (c) 2010-2018 Caolan McMahon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/README.md",
    "content": "![Async Logo](https://raw.githubusercontent.com/caolan/async/master/logo/async-logo_readme.jpg)\n\n[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)\n[![NPM version](https://img.shields.io/npm/v/async.svg)](https://www.npmjs.com/package/async)\n[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master)\n[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n[![libhive - Open source examples](https://www.libhive.com/providers/npm/packages/async/examples/badge.svg)](https://www.libhive.com/providers/npm/packages/async)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/async/badge?style=rounded)](https://www.jsdelivr.com/package/npm/async)\n\n\nAsync is a utility module which provides straight-forward, powerful functions for working with [asynchronous JavaScript](http://caolan.github.io/async/global.html). Although originally designed for use with [Node.js](https://nodejs.org/) and installable via `npm install --save async`, it can also be used directly in the browser.\n\nThis version of the package is optimized for the Node.js environment. If you use Async with webpack, install [`async-es`](https://www.npmjs.com/package/async-es) instead.\n\nFor Documentation, visit <https://caolan.github.io/async/>\n\n*For Async v1.5.x documentation, go [HERE](https://github.com/caolan/async/blob/v1.5.2/README.md)*\n\n\n```javascript\n// for use with Node-style callbacks...\nvar async = require(\"async\");\n\nvar obj = {dev: \"/dev.json\", test: \"/test.json\", prod: \"/prod.json\"};\nvar configs = {};\n\nasync.forEachOf(obj, (value, key, callback) => {\n    fs.readFile(__dirname + value, \"utf8\", (err, data) => {\n        if (err) return callback(err);\n        try {\n            configs[key] = JSON.parse(data);\n        } catch (e) {\n            return callback(e);\n        }\n        callback();\n    });\n}, err => {\n    if (err) console.error(err.message);\n    // configs is now a map of JSON data\n    doSomethingWith(configs);\n});\n```\n\n```javascript\nvar async = require(\"async\");\n\n// ...or ES2017 async functions\nasync.mapLimit(urls, 5, async function(url) {\n    const response = await fetch(url)\n    return response.body\n}, (err, results) => {\n    if (err) throw err\n    // results is now an array of the response bodies\n    console.log(results)\n})\n```\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/all.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _notId = require('./internal/notId');\n\nvar _notId2 = _interopRequireDefault(_notId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns `true` if every element in `coll` satisfies an async test. If any\n * iteratee call returns `false`, the main `callback` is immediately called.\n *\n * @name every\n * @static\n * @memberOf module:Collections\n * @method\n * @alias all\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n * @example\n *\n * async.every(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // if result is true then every file exists\n * });\n */\nexports.default = (0, _doParallel2.default)((0, _createTester2.default)(_notId2.default, _notId2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/allLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _notId = require('./internal/notId');\n\nvar _notId2 = _interopRequireDefault(_notId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time.\n *\n * @name everyLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n */\nexports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_notId2.default, _notId2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/allSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _everyLimit = require('./everyLimit');\n\nvar _everyLimit2 = _interopRequireDefault(_everyLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time.\n *\n * @name everySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in series.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n */\nexports.default = (0, _doLimit2.default)(_everyLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/any.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns `true` if at least one element in the `coll` satisfies an async test.\n * If any iteratee call returns `true`, the main `callback` is immediately\n * called.\n *\n * @name some\n * @static\n * @memberOf module:Collections\n * @method\n * @alias any\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n * @example\n *\n * async.some(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // if result is true then at least one of the files exists\n * });\n */\nexports.default = (0, _doParallel2.default)((0, _createTester2.default)(Boolean, _identity2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/anyLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time.\n *\n * @name someLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anyLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n */\nexports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(Boolean, _identity2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/anySeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _someLimit = require('./someLimit');\n\nvar _someLimit2 = _interopRequireDefault(_someLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time.\n *\n * @name someSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anySeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in series.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n */\nexports.default = (0, _doLimit2.default)(_someLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/apply.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (fn /*, ...args*/) {\n    var args = (0, _slice2.default)(arguments, 1);\n    return function () /*callArgs*/{\n        var callArgs = (0, _slice2.default)(arguments);\n        return fn.apply(null, args.concat(callArgs));\n    };\n};\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n;\n\n/**\n * Creates a continuation function with some arguments already applied.\n *\n * Useful as a shorthand when combined with other control flow functions. Any\n * arguments passed to the returned function are added to the arguments\n * originally passed to apply.\n *\n * @name apply\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {Function} fn - The function you want to eventually apply all\n * arguments to. Invokes with (arguments...).\n * @param {...*} arguments... - Any number of arguments to automatically apply\n * when the continuation is called.\n * @returns {Function} the partially-applied function\n * @example\n *\n * // using apply\n * async.parallel([\n *     async.apply(fs.writeFile, 'testfile1', 'test1'),\n *     async.apply(fs.writeFile, 'testfile2', 'test2')\n * ]);\n *\n *\n * // the same process without using apply\n * async.parallel([\n *     function(callback) {\n *         fs.writeFile('testfile1', 'test1', callback);\n *     },\n *     function(callback) {\n *         fs.writeFile('testfile2', 'test2', callback);\n *     }\n * ]);\n *\n * // It's possible to pass any number of additional arguments when calling the\n * // continuation:\n *\n * node> var fn = async.apply(sys.puts, 'one');\n * node> fn('two', 'three');\n * one\n * two\n * three\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/applyEach.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _applyEach = require('./internal/applyEach');\n\nvar _applyEach2 = _interopRequireDefault(_applyEach);\n\nvar _map = require('./map');\n\nvar _map2 = _interopRequireDefault(_map);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Applies the provided arguments to each function in the array, calling\n * `callback` after all functions have completed. If you only provide the first\n * argument, `fns`, then it will return a function which lets you pass in the\n * arguments as if it were a single function call. If more arguments are\n * provided, `callback` is required while `args` is still optional.\n *\n * @name applyEach\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} fns - A collection of {@link AsyncFunction}s\n * to all call with the same arguments\n * @param {...*} [args] - any number of separate arguments to pass to the\n * function.\n * @param {Function} [callback] - the final argument should be the callback,\n * called when all functions have completed processing.\n * @returns {Function} - If only the first argument, `fns`, is provided, it will\n * return a function which lets you pass in the arguments as if it were a single\n * function call. The signature is `(..args, callback)`. If invoked with any\n * arguments, `callback` is required.\n * @example\n *\n * async.applyEach([enableSearch, updateSchema], 'bucket', callback);\n *\n * // partial application example:\n * async.each(\n *     buckets,\n *     async.applyEach([enableSearch, updateSchema]),\n *     callback\n * );\n */\nexports.default = (0, _applyEach2.default)(_map2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/applyEachSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _applyEach = require('./internal/applyEach');\n\nvar _applyEach2 = _interopRequireDefault(_applyEach);\n\nvar _mapSeries = require('./mapSeries');\n\nvar _mapSeries2 = _interopRequireDefault(_mapSeries);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time.\n *\n * @name applyEachSeries\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.applyEach]{@link module:ControlFlow.applyEach}\n * @category Control Flow\n * @param {Array|Iterable|Object} fns - A collection of {@link AsyncFunction}s to all\n * call with the same arguments\n * @param {...*} [args] - any number of separate arguments to pass to the\n * function.\n * @param {Function} [callback] - the final argument should be the callback,\n * called when all functions have completed processing.\n * @returns {Function} - If only the first argument is provided, it will return\n * a function which lets you pass in the arguments as if it were a single\n * function call.\n */\nexports.default = (0, _applyEach2.default)(_mapSeries2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/asyncify.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = asyncify;\n\nvar _isObject = require('lodash/isObject');\n\nvar _isObject2 = _interopRequireDefault(_isObject);\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _setImmediate = require('./internal/setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Take a sync function and make it async, passing its return value to a\n * callback. This is useful for plugging sync functions into a waterfall,\n * series, or other async functions. Any arguments passed to the generated\n * function will be passed to the wrapped function (except for the final\n * callback argument). Errors thrown will be passed to the callback.\n *\n * If the function passed to `asyncify` returns a Promise, that promises's\n * resolved/rejected state will be used to call the callback, rather than simply\n * the synchronous return value.\n *\n * This also means you can asyncify ES2017 `async` functions.\n *\n * @name asyncify\n * @static\n * @memberOf module:Utils\n * @method\n * @alias wrapSync\n * @category Util\n * @param {Function} func - The synchronous function, or Promise-returning\n * function to convert to an {@link AsyncFunction}.\n * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be\n * invoked with `(args..., callback)`.\n * @example\n *\n * // passing a regular synchronous function\n * async.waterfall([\n *     async.apply(fs.readFile, filename, \"utf8\"),\n *     async.asyncify(JSON.parse),\n *     function (data, next) {\n *         // data is the result of parsing the text.\n *         // If there was a parsing error, it would have been caught.\n *     }\n * ], callback);\n *\n * // passing a function returning a promise\n * async.waterfall([\n *     async.apply(fs.readFile, filename, \"utf8\"),\n *     async.asyncify(function (contents) {\n *         return db.model.create(contents);\n *     }),\n *     function (model, next) {\n *         // `model` is the instantiated model object.\n *         // If there was an error, this function would be skipped.\n *     }\n * ], callback);\n *\n * // es2017 example, though `asyncify` is not needed if your JS environment\n * // supports async functions out of the box\n * var q = async.queue(async.asyncify(async function(file) {\n *     var intermediateStep = await processFile(file);\n *     return await somePromise(intermediateStep)\n * }));\n *\n * q.push(files);\n */\nfunction asyncify(func) {\n    return (0, _initialParams2.default)(function (args, callback) {\n        var result;\n        try {\n            result = func.apply(this, args);\n        } catch (e) {\n            return callback(e);\n        }\n        // if result is Promise object\n        if ((0, _isObject2.default)(result) && typeof result.then === 'function') {\n            result.then(function (value) {\n                invokeCallback(callback, null, value);\n            }, function (err) {\n                invokeCallback(callback, err.message ? err : new Error(err));\n            });\n        } else {\n            callback(null, result);\n        }\n    });\n}\n\nfunction invokeCallback(callback, error, value) {\n    try {\n        callback(error, value);\n    } catch (e) {\n        (0, _setImmediate2.default)(rethrow, e);\n    }\n}\n\nfunction rethrow(error) {\n    throw error;\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/auto.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (tasks, concurrency, callback) {\n    if (typeof concurrency === 'function') {\n        // concurrency is optional, shift the args.\n        callback = concurrency;\n        concurrency = null;\n    }\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var keys = (0, _keys2.default)(tasks);\n    var numTasks = keys.length;\n    if (!numTasks) {\n        return callback(null);\n    }\n    if (!concurrency) {\n        concurrency = numTasks;\n    }\n\n    var results = {};\n    var runningTasks = 0;\n    var hasError = false;\n\n    var listeners = Object.create(null);\n\n    var readyTasks = [];\n\n    // for cycle detection:\n    var readyToCheck = []; // tasks that have been identified as reachable\n    // without the possibility of returning to an ancestor task\n    var uncheckedDependencies = {};\n\n    (0, _baseForOwn2.default)(tasks, function (task, key) {\n        if (!(0, _isArray2.default)(task)) {\n            // no dependencies\n            enqueueTask(key, [task]);\n            readyToCheck.push(key);\n            return;\n        }\n\n        var dependencies = task.slice(0, task.length - 1);\n        var remainingDependencies = dependencies.length;\n        if (remainingDependencies === 0) {\n            enqueueTask(key, task);\n            readyToCheck.push(key);\n            return;\n        }\n        uncheckedDependencies[key] = remainingDependencies;\n\n        (0, _arrayEach2.default)(dependencies, function (dependencyName) {\n            if (!tasks[dependencyName]) {\n                throw new Error('async.auto task `' + key + '` has a non-existent dependency `' + dependencyName + '` in ' + dependencies.join(', '));\n            }\n            addListener(dependencyName, function () {\n                remainingDependencies--;\n                if (remainingDependencies === 0) {\n                    enqueueTask(key, task);\n                }\n            });\n        });\n    });\n\n    checkForDeadlocks();\n    processQueue();\n\n    function enqueueTask(key, task) {\n        readyTasks.push(function () {\n            runTask(key, task);\n        });\n    }\n\n    function processQueue() {\n        if (readyTasks.length === 0 && runningTasks === 0) {\n            return callback(null, results);\n        }\n        while (readyTasks.length && runningTasks < concurrency) {\n            var run = readyTasks.shift();\n            run();\n        }\n    }\n\n    function addListener(taskName, fn) {\n        var taskListeners = listeners[taskName];\n        if (!taskListeners) {\n            taskListeners = listeners[taskName] = [];\n        }\n\n        taskListeners.push(fn);\n    }\n\n    function taskComplete(taskName) {\n        var taskListeners = listeners[taskName] || [];\n        (0, _arrayEach2.default)(taskListeners, function (fn) {\n            fn();\n        });\n        processQueue();\n    }\n\n    function runTask(key, task) {\n        if (hasError) return;\n\n        var taskCallback = (0, _onlyOnce2.default)(function (err, result) {\n            runningTasks--;\n            if (arguments.length > 2) {\n                result = (0, _slice2.default)(arguments, 1);\n            }\n            if (err) {\n                var safeResults = {};\n                (0, _baseForOwn2.default)(results, function (val, rkey) {\n                    safeResults[rkey] = val;\n                });\n                safeResults[key] = result;\n                hasError = true;\n                listeners = Object.create(null);\n\n                callback(err, safeResults);\n            } else {\n                results[key] = result;\n                taskComplete(key);\n            }\n        });\n\n        runningTasks++;\n        var taskFn = (0, _wrapAsync2.default)(task[task.length - 1]);\n        if (task.length > 1) {\n            taskFn(results, taskCallback);\n        } else {\n            taskFn(taskCallback);\n        }\n    }\n\n    function checkForDeadlocks() {\n        // Kahn's algorithm\n        // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm\n        // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html\n        var currentTask;\n        var counter = 0;\n        while (readyToCheck.length) {\n            currentTask = readyToCheck.pop();\n            counter++;\n            (0, _arrayEach2.default)(getDependents(currentTask), function (dependent) {\n                if (--uncheckedDependencies[dependent] === 0) {\n                    readyToCheck.push(dependent);\n                }\n            });\n        }\n\n        if (counter !== numTasks) {\n            throw new Error('async.auto cannot execute tasks due to a recursive dependency');\n        }\n    }\n\n    function getDependents(taskName) {\n        var result = [];\n        (0, _baseForOwn2.default)(tasks, function (task, key) {\n            if ((0, _isArray2.default)(task) && (0, _baseIndexOf2.default)(task, taskName, 0) >= 0) {\n                result.push(key);\n            }\n        });\n        return result;\n    }\n};\n\nvar _arrayEach = require('lodash/_arrayEach');\n\nvar _arrayEach2 = _interopRequireDefault(_arrayEach);\n\nvar _baseForOwn = require('lodash/_baseForOwn');\n\nvar _baseForOwn2 = _interopRequireDefault(_baseForOwn);\n\nvar _baseIndexOf = require('lodash/_baseIndexOf');\n\nvar _baseIndexOf2 = _interopRequireDefault(_baseIndexOf);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _keys = require('lodash/keys');\n\nvar _keys2 = _interopRequireDefault(_keys);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];\n\n/**\n * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on\n * their requirements. Each function can optionally depend on other functions\n * being completed first, and each function is run as soon as its requirements\n * are satisfied.\n *\n * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence\n * will stop. Further tasks will not execute (so any other functions depending\n * on it will not run), and the main `callback` is immediately called with the\n * error.\n *\n * {@link AsyncFunction}s also receive an object containing the results of functions which\n * have completed so far as the first argument, if they have dependencies. If a\n * task function has no dependencies, it will only be passed a callback.\n *\n * @name auto\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Object} tasks - An object. Each of its properties is either a\n * function or an array of requirements, with the {@link AsyncFunction} itself the last item\n * in the array. The object's key of a property serves as the name of the task\n * defined by that property, i.e. can be used when specifying requirements for\n * other tasks. The function receives one or two arguments:\n * * a `results` object, containing the results of the previously executed\n *   functions, only passed if the task has any dependencies,\n * * a `callback(err, result)` function, which must be called when finished,\n *   passing an `error` (which can be `null`) and the result of the function's\n *   execution.\n * @param {number} [concurrency=Infinity] - An optional `integer` for\n * determining the maximum number of tasks that can be run in parallel. By\n * default, as many as possible.\n * @param {Function} [callback] - An optional callback which is called when all\n * the tasks have been completed. It receives the `err` argument if any `tasks`\n * pass an error to their callback. Results are always returned; however, if an\n * error occurs, no further `tasks` will be performed, and the results object\n * will only contain partial results. Invoked with (err, results).\n * @returns undefined\n * @example\n *\n * async.auto({\n *     // this function will just be passed a callback\n *     readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),\n *     showData: ['readData', function(results, cb) {\n *         // results.readData is the file's contents\n *         // ...\n *     }]\n * }, callback);\n *\n * async.auto({\n *     get_data: function(callback) {\n *         console.log('in get_data');\n *         // async code to get some data\n *         callback(null, 'data', 'converted to array');\n *     },\n *     make_folder: function(callback) {\n *         console.log('in make_folder');\n *         // async code to create a directory to store a file in\n *         // this is run at the same time as getting the data\n *         callback(null, 'folder');\n *     },\n *     write_file: ['get_data', 'make_folder', function(results, callback) {\n *         console.log('in write_file', JSON.stringify(results));\n *         // once there is some data and the directory exists,\n *         // write the data to a file in the directory\n *         callback(null, 'filename');\n *     }],\n *     email_link: ['write_file', function(results, callback) {\n *         console.log('in email_link', JSON.stringify(results));\n *         // once the file is written let's email a link to it...\n *         // results.write_file contains the filename returned by write_file.\n *         callback(null, {'file':results.write_file, 'email':'user@example.com'});\n *     }]\n * }, function(err, results) {\n *     console.log('err = ', err);\n *     console.log('results = ', results);\n * });\n */"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/autoInject.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = autoInject;\n\nvar _auto = require('./auto');\n\nvar _auto2 = _interopRequireDefault(_auto);\n\nvar _baseForOwn = require('lodash/_baseForOwn');\n\nvar _baseForOwn2 = _interopRequireDefault(_baseForOwn);\n\nvar _arrayMap = require('lodash/_arrayMap');\n\nvar _arrayMap2 = _interopRequireDefault(_arrayMap);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _trim = require('lodash/trim');\n\nvar _trim2 = _interopRequireDefault(_trim);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar FN_ARGS = /^(?:async\\s+)?(function)?\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /(=.+)?(\\s*)$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\n\nfunction parseParams(func) {\n    func = func.toString().replace(STRIP_COMMENTS, '');\n    func = func.match(FN_ARGS)[2].replace(' ', '');\n    func = func ? func.split(FN_ARG_SPLIT) : [];\n    func = func.map(function (arg) {\n        return (0, _trim2.default)(arg.replace(FN_ARG, ''));\n    });\n    return func;\n}\n\n/**\n * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent\n * tasks are specified as parameters to the function, after the usual callback\n * parameter, with the parameter names matching the names of the tasks it\n * depends on. This can provide even more readable task graphs which can be\n * easier to maintain.\n *\n * If a final callback is specified, the task results are similarly injected,\n * specified as named parameters after the initial error parameter.\n *\n * The autoInject function is purely syntactic sugar and its semantics are\n * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}.\n *\n * @name autoInject\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.auto]{@link module:ControlFlow.auto}\n * @category Control Flow\n * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of\n * the form 'func([dependencies...], callback). The object's key of a property\n * serves as the name of the task defined by that property, i.e. can be used\n * when specifying requirements for other tasks.\n * * The `callback` parameter is a `callback(err, result)` which must be called\n *   when finished, passing an `error` (which can be `null`) and the result of\n *   the function's execution. The remaining parameters name other tasks on\n *   which the task is dependent, and the results from those tasks are the\n *   arguments of those parameters.\n * @param {Function} [callback] - An optional callback which is called when all\n * the tasks have been completed. It receives the `err` argument if any `tasks`\n * pass an error to their callback, and a `results` object with any completed\n * task results, similar to `auto`.\n * @example\n *\n * //  The example from `auto` can be rewritten as follows:\n * async.autoInject({\n *     get_data: function(callback) {\n *         // async code to get some data\n *         callback(null, 'data', 'converted to array');\n *     },\n *     make_folder: function(callback) {\n *         // async code to create a directory to store a file in\n *         // this is run at the same time as getting the data\n *         callback(null, 'folder');\n *     },\n *     write_file: function(get_data, make_folder, callback) {\n *         // once there is some data and the directory exists,\n *         // write the data to a file in the directory\n *         callback(null, 'filename');\n *     },\n *     email_link: function(write_file, callback) {\n *         // once the file is written let's email a link to it...\n *         // write_file contains the filename returned by write_file.\n *         callback(null, {'file':write_file, 'email':'user@example.com'});\n *     }\n * }, function(err, results) {\n *     console.log('err = ', err);\n *     console.log('email_link = ', results.email_link);\n * });\n *\n * // If you are using a JS minifier that mangles parameter names, `autoInject`\n * // will not work with plain functions, since the parameter names will be\n * // collapsed to a single letter identifier.  To work around this, you can\n * // explicitly specify the names of the parameters your task function needs\n * // in an array, similar to Angular.js dependency injection.\n *\n * // This still has an advantage over plain `auto`, since the results a task\n * // depends on are still spread into arguments.\n * async.autoInject({\n *     //...\n *     write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) {\n *         callback(null, 'filename');\n *     }],\n *     email_link: ['write_file', function(write_file, callback) {\n *         callback(null, {'file':write_file, 'email':'user@example.com'});\n *     }]\n *     //...\n * }, function(err, results) {\n *     console.log('err = ', err);\n *     console.log('email_link = ', results.email_link);\n * });\n */\nfunction autoInject(tasks, callback) {\n    var newTasks = {};\n\n    (0, _baseForOwn2.default)(tasks, function (taskFn, key) {\n        var params;\n        var fnIsAsync = (0, _wrapAsync.isAsync)(taskFn);\n        var hasNoDeps = !fnIsAsync && taskFn.length === 1 || fnIsAsync && taskFn.length === 0;\n\n        if ((0, _isArray2.default)(taskFn)) {\n            params = taskFn.slice(0, -1);\n            taskFn = taskFn[taskFn.length - 1];\n\n            newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn);\n        } else if (hasNoDeps) {\n            // no dependencies, use the function as-is\n            newTasks[key] = taskFn;\n        } else {\n            params = parseParams(taskFn);\n            if (taskFn.length === 0 && !fnIsAsync && params.length === 0) {\n                throw new Error(\"autoInject task functions require explicit parameters.\");\n            }\n\n            // remove callback param\n            if (!fnIsAsync) params.pop();\n\n            newTasks[key] = params.concat(newTask);\n        }\n\n        function newTask(results, taskCb) {\n            var newArgs = (0, _arrayMap2.default)(params, function (name) {\n                return results[name];\n            });\n            newArgs.push(taskCb);\n            (0, _wrapAsync2.default)(taskFn).apply(null, newArgs);\n        }\n    });\n\n    (0, _auto2.default)(newTasks, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/bower.json",
    "content": "{\n  \"name\": \"async\",\n  \"main\": \"dist/async.js\",\n  \"ignore\": [\n    \"bower_components\",\n    \"lib\",\n    \"mocha_test\",\n    \"node_modules\",\n    \"perf\",\n    \"support\",\n    \"**/.*\",\n    \"*.config.js\",\n    \"*.json\",\n    \"index.js\",\n    \"Makefile\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/cargo.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cargo;\n\nvar _queue = require('./internal/queue');\n\nvar _queue2 = _interopRequireDefault(_queue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A cargo of tasks for the worker function to complete. Cargo inherits all of\n * the same methods and event callbacks as [`queue`]{@link module:ControlFlow.queue}.\n * @typedef {Object} CargoObject\n * @memberOf module:ControlFlow\n * @property {Function} length - A function returning the number of items\n * waiting to be processed. Invoke like `cargo.length()`.\n * @property {number} payload - An `integer` for determining how many tasks\n * should be process per round. This property can be changed after a `cargo` is\n * created to alter the payload on-the-fly.\n * @property {Function} push - Adds `task` to the `queue`. The callback is\n * called once the `worker` has finished processing the task. Instead of a\n * single task, an array of `tasks` can be submitted. The respective callback is\n * used for every task in the list. Invoke like `cargo.push(task, [callback])`.\n * @property {Function} saturated - A callback that is called when the\n * `queue.length()` hits the concurrency and further tasks will be queued.\n * @property {Function} empty - A callback that is called when the last item\n * from the `queue` is given to a `worker`.\n * @property {Function} drain - A callback that is called when the last item\n * from the `queue` has returned from the `worker`.\n * @property {Function} idle - a function returning false if there are items\n * waiting or being processed, or true if not. Invoke like `cargo.idle()`.\n * @property {Function} pause - a function that pauses the processing of tasks\n * until `resume()` is called. Invoke like `cargo.pause()`.\n * @property {Function} resume - a function that resumes the processing of\n * queued tasks when the queue is paused. Invoke like `cargo.resume()`.\n * @property {Function} kill - a function that removes the `drain` callback and\n * empties remaining tasks from the queue forcing it to go idle. Invoke like `cargo.kill()`.\n */\n\n/**\n * Creates a `cargo` object with the specified payload. Tasks added to the\n * cargo will be processed altogether (up to the `payload` limit). If the\n * `worker` is in progress, the task is queued until it becomes available. Once\n * the `worker` has completed some tasks, each callback of those tasks is\n * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966)\n * for how `cargo` and `queue` work.\n *\n * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers\n * at a time, cargo passes an array of tasks to a single worker, repeating\n * when the worker is finished.\n *\n * @name cargo\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @category Control Flow\n * @param {AsyncFunction} worker - An asynchronous function for processing an array\n * of queued tasks. Invoked with `(tasks, callback)`.\n * @param {number} [payload=Infinity] - An optional `integer` for determining\n * how many tasks should be processed per round; if omitted, the default is\n * unlimited.\n * @returns {module:ControlFlow.CargoObject} A cargo object to manage the tasks. Callbacks can\n * attached as certain properties to listen for specific events during the\n * lifecycle of the cargo and inner queue.\n * @example\n *\n * // create a cargo object with payload 2\n * var cargo = async.cargo(function(tasks, callback) {\n *     for (var i=0; i<tasks.length; i++) {\n *         console.log('hello ' + tasks[i].name);\n *     }\n *     callback();\n * }, 2);\n *\n * // add some items\n * cargo.push({name: 'foo'}, function(err) {\n *     console.log('finished processing foo');\n * });\n * cargo.push({name: 'bar'}, function(err) {\n *     console.log('finished processing bar');\n * });\n * cargo.push({name: 'baz'}, function(err) {\n *     console.log('finished processing baz');\n * });\n */\nfunction cargo(worker, payload) {\n  return (0, _queue2.default)(worker, 1, payload);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/compose.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () /*...args*/{\n  return _seq2.default.apply(null, (0, _slice2.default)(arguments).reverse());\n};\n\nvar _seq = require('./seq');\n\nvar _seq2 = _interopRequireDefault(_seq);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n;\n\n/**\n * Creates a function which is a composition of the passed asynchronous\n * functions. Each function consumes the return value of the function that\n * follows. Composing functions `f()`, `g()`, and `h()` would produce the result\n * of `f(g(h()))`, only this version uses callbacks to obtain the return values.\n *\n * Each function is executed with the `this` binding of the composed function.\n *\n * @name compose\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {...AsyncFunction} functions - the asynchronous functions to compose\n * @returns {Function} an asynchronous function that is the composed\n * asynchronous `functions`\n * @example\n *\n * function add1(n, callback) {\n *     setTimeout(function () {\n *         callback(null, n + 1);\n *     }, 10);\n * }\n *\n * function mul3(n, callback) {\n *     setTimeout(function () {\n *         callback(null, n * 3);\n *     }, 10);\n * }\n *\n * var add1mul3 = async.compose(mul3, add1);\n * add1mul3(4, function (err, result) {\n *     // result now equals 15\n * });\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/concat.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nvar _concatLimit = require('./concatLimit');\n\nvar _concatLimit2 = _interopRequireDefault(_concatLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Applies `iteratee` to each item in `coll`, concatenating the results. Returns\n * the concatenated list. The `iteratee`s are called in parallel, and the\n * results are concatenated as they return. There is no guarantee that the\n * results array will be returned in the original order of `coll` passed to the\n * `iteratee` function.\n *\n * @name concat\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,\n * which should use an array as its result. Invoked with (item, callback).\n * @param {Function} [callback(err)] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n * @example\n *\n * async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files) {\n *     // files is now a list of filenames that exist in the 3 directories\n * });\n */\nexports.default = (0, _doLimit2.default)(_concatLimit2.default, Infinity);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/concatLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (coll, limit, iteratee, callback) {\n    callback = callback || _noop2.default;\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _mapLimit2.default)(coll, limit, function (val, callback) {\n        _iteratee(val, function (err /*, ...args*/) {\n            if (err) return callback(err);\n            return callback(null, (0, _slice2.default)(arguments, 1));\n        });\n    }, function (err, mapResults) {\n        var result = [];\n        for (var i = 0; i < mapResults.length; i++) {\n            if (mapResults[i]) {\n                result = _concat.apply(result, mapResults[i]);\n            }\n        }\n\n        return callback(err, result);\n    });\n};\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _mapLimit = require('./mapLimit');\n\nvar _mapLimit2 = _interopRequireDefault(_mapLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _concat = Array.prototype.concat;\n\n/**\n * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time.\n *\n * @name concatLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.concat]{@link module:Collections.concat}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,\n * which should use an array as its result. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/concatSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nvar _concatLimit = require('./concatLimit');\n\nvar _concatLimit2 = _interopRequireDefault(_concatLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time.\n *\n * @name concatSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.concat]{@link module:Collections.concat}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`.\n * The iteratee should complete with an array an array of results.\n * Invoked with (item, callback).\n * @param {Function} [callback(err)] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n */\nexports.default = (0, _doLimit2.default)(_concatLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/constant.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function () /*...values*/{\n    var values = (0, _slice2.default)(arguments);\n    var args = [null].concat(values);\n    return function () /*...ignoredArgs, callback*/{\n        var callback = arguments[arguments.length - 1];\n        return callback.apply(this, args);\n    };\n};\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n;\n\n/**\n * Returns a function that when called, calls-back with the values provided.\n * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to\n * [`auto`]{@link module:ControlFlow.auto}.\n *\n * @name constant\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {...*} arguments... - Any number of arguments to automatically invoke\n * callback with.\n * @returns {AsyncFunction} Returns a function that when invoked, automatically\n * invokes the callback with the previous given arguments.\n * @example\n *\n * async.waterfall([\n *     async.constant(42),\n *     function (value, next) {\n *         // value === 42\n *     },\n *     //...\n * ], callback);\n *\n * async.waterfall([\n *     async.constant(filename, \"utf8\"),\n *     fs.readFile,\n *     function (fileData, next) {\n *         //...\n *     }\n *     //...\n * ], callback);\n *\n * async.auto({\n *     hostname: async.constant(\"https://server.net/\"),\n *     port: findFreePort,\n *     launchServer: [\"hostname\", \"port\", function (options, cb) {\n *         startServer(options, cb);\n *     }],\n *     //...\n * }, callback);\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/detect.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _findGetResult = require('./internal/findGetResult');\n\nvar _findGetResult2 = _interopRequireDefault(_findGetResult);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns the first value in `coll` that passes an async truth test. The\n * `iteratee` is applied in parallel, meaning the first iteratee to return\n * `true` will fire the detect `callback` with that result. That means the\n * result might not be the first item in the original `coll` (in terms of order)\n * that passes the test.\n\n * If order within the original `coll` is important, then look at\n * [`detectSeries`]{@link module:Collections.detectSeries}.\n *\n * @name detect\n * @static\n * @memberOf module:Collections\n * @method\n * @alias find\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n * @example\n *\n * async.detect(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // result now equals the first file in the list that exists\n * });\n */\nexports.default = (0, _doParallel2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/detectLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _findGetResult = require('./internal/findGetResult');\n\nvar _findGetResult2 = _interopRequireDefault(_findGetResult);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name detectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findLimit\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n */\nexports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/detectSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _detectLimit = require('./detectLimit');\n\nvar _detectLimit2 = _interopRequireDefault(_detectLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time.\n *\n * @name detectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findSeries\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n */\nexports.default = (0, _doLimit2.default)(_detectLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/dir.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _consoleFunc = require('./internal/consoleFunc');\n\nvar _consoleFunc2 = _interopRequireDefault(_consoleFunc);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Logs the result of an [`async` function]{@link AsyncFunction} to the\n * `console` using `console.dir` to display the properties of the resulting object.\n * Only works in Node.js or in browsers that support `console.dir` and\n * `console.error` (such as FF and Chrome).\n * If multiple arguments are returned from the async function,\n * `console.dir` is called on each argument in order.\n *\n * @name dir\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} function - The function you want to eventually apply\n * all arguments to.\n * @param {...*} arguments... - Any number of arguments to apply to the function.\n * @example\n *\n * // in a module\n * var hello = function(name, callback) {\n *     setTimeout(function() {\n *         callback(null, {hello: name});\n *     }, 1000);\n * };\n *\n * // in the node repl\n * node> async.dir(hello, 'world');\n * {hello: 'world'}\n */\nexports.default = (0, _consoleFunc2.default)('dir');\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/dist/async.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (factory((global.async = global.async || {})));\n}(this, (function (exports) { 'use strict';\n\nfunction slice(arrayLike, start) {\n    start = start|0;\n    var newLen = Math.max(arrayLike.length - start, 0);\n    var newArr = Array(newLen);\n    for(var idx = 0; idx < newLen; idx++)  {\n        newArr[idx] = arrayLike[start + idx];\n    }\n    return newArr;\n}\n\n/**\n * Creates a continuation function with some arguments already applied.\n *\n * Useful as a shorthand when combined with other control flow functions. Any\n * arguments passed to the returned function are added to the arguments\n * originally passed to apply.\n *\n * @name apply\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {Function} fn - The function you want to eventually apply all\n * arguments to. Invokes with (arguments...).\n * @param {...*} arguments... - Any number of arguments to automatically apply\n * when the continuation is called.\n * @returns {Function} the partially-applied function\n * @example\n *\n * // using apply\n * async.parallel([\n *     async.apply(fs.writeFile, 'testfile1', 'test1'),\n *     async.apply(fs.writeFile, 'testfile2', 'test2')\n * ]);\n *\n *\n * // the same process without using apply\n * async.parallel([\n *     function(callback) {\n *         fs.writeFile('testfile1', 'test1', callback);\n *     },\n *     function(callback) {\n *         fs.writeFile('testfile2', 'test2', callback);\n *     }\n * ]);\n *\n * // It's possible to pass any number of additional arguments when calling the\n * // continuation:\n *\n * node> var fn = async.apply(sys.puts, 'one');\n * node> fn('two', 'three');\n * one\n * two\n * three\n */\nvar apply = function(fn/*, ...args*/) {\n    var args = slice(arguments, 1);\n    return function(/*callArgs*/) {\n        var callArgs = slice(arguments);\n        return fn.apply(null, args.concat(callArgs));\n    };\n};\n\nvar initialParams = function (fn) {\n    return function (/*...args, callback*/) {\n        var args = slice(arguments);\n        var callback = args.pop();\n        fn.call(this, args, callback);\n    };\n};\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nvar hasSetImmediate = typeof setImmediate === 'function' && setImmediate;\nvar hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';\n\nfunction fallback(fn) {\n    setTimeout(fn, 0);\n}\n\nfunction wrap(defer) {\n    return function (fn/*, ...args*/) {\n        var args = slice(arguments, 1);\n        defer(function () {\n            fn.apply(null, args);\n        });\n    };\n}\n\nvar _defer;\n\nif (hasSetImmediate) {\n    _defer = setImmediate;\n} else if (hasNextTick) {\n    _defer = process.nextTick;\n} else {\n    _defer = fallback;\n}\n\nvar setImmediate$1 = wrap(_defer);\n\n/**\n * Take a sync function and make it async, passing its return value to a\n * callback. This is useful for plugging sync functions into a waterfall,\n * series, or other async functions. Any arguments passed to the generated\n * function will be passed to the wrapped function (except for the final\n * callback argument). Errors thrown will be passed to the callback.\n *\n * If the function passed to `asyncify` returns a Promise, that promises's\n * resolved/rejected state will be used to call the callback, rather than simply\n * the synchronous return value.\n *\n * This also means you can asyncify ES2017 `async` functions.\n *\n * @name asyncify\n * @static\n * @memberOf module:Utils\n * @method\n * @alias wrapSync\n * @category Util\n * @param {Function} func - The synchronous function, or Promise-returning\n * function to convert to an {@link AsyncFunction}.\n * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be\n * invoked with `(args..., callback)`.\n * @example\n *\n * // passing a regular synchronous function\n * async.waterfall([\n *     async.apply(fs.readFile, filename, \"utf8\"),\n *     async.asyncify(JSON.parse),\n *     function (data, next) {\n *         // data is the result of parsing the text.\n *         // If there was a parsing error, it would have been caught.\n *     }\n * ], callback);\n *\n * // passing a function returning a promise\n * async.waterfall([\n *     async.apply(fs.readFile, filename, \"utf8\"),\n *     async.asyncify(function (contents) {\n *         return db.model.create(contents);\n *     }),\n *     function (model, next) {\n *         // `model` is the instantiated model object.\n *         // If there was an error, this function would be skipped.\n *     }\n * ], callback);\n *\n * // es2017 example, though `asyncify` is not needed if your JS environment\n * // supports async functions out of the box\n * var q = async.queue(async.asyncify(async function(file) {\n *     var intermediateStep = await processFile(file);\n *     return await somePromise(intermediateStep)\n * }));\n *\n * q.push(files);\n */\nfunction asyncify(func) {\n    return initialParams(function (args, callback) {\n        var result;\n        try {\n            result = func.apply(this, args);\n        } catch (e) {\n            return callback(e);\n        }\n        // if result is Promise object\n        if (isObject(result) && typeof result.then === 'function') {\n            result.then(function(value) {\n                invokeCallback(callback, null, value);\n            }, function(err) {\n                invokeCallback(callback, err.message ? err : new Error(err));\n            });\n        } else {\n            callback(null, result);\n        }\n    });\n}\n\nfunction invokeCallback(callback, error, value) {\n    try {\n        callback(error, value);\n    } catch (e) {\n        setImmediate$1(rethrow, e);\n    }\n}\n\nfunction rethrow(error) {\n    throw error;\n}\n\nvar supportsSymbol = typeof Symbol === 'function';\n\nfunction isAsync(fn) {\n    return supportsSymbol && fn[Symbol.toStringTag] === 'AsyncFunction';\n}\n\nfunction wrapAsync(asyncFn) {\n    return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn;\n}\n\nfunction applyEach$1(eachfn) {\n    return function(fns/*, ...args*/) {\n        var args = slice(arguments, 1);\n        var go = initialParams(function(args, callback) {\n            var that = this;\n            return eachfn(fns, function (fn, cb) {\n                wrapAsync(fn).apply(that, args.concat(cb));\n            }, callback);\n        });\n        if (args.length) {\n            return go.apply(this, args);\n        }\n        else {\n            return go;\n        }\n    };\n}\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Built-in value references. */\nvar Symbol$1 = root.Symbol;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag$1),\n      tag = value[symToStringTag$1];\n\n  try {\n    value[symToStringTag$1] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag$1] = tag;\n    } else {\n      delete value[symToStringTag$1];\n    }\n  }\n  return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto$1 = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString$1 = objectProto$1.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString$1.call(value);\n}\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]';\nvar undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]';\nvar funcTag = '[object Function]';\nvar genTag = '[object GeneratorFunction]';\nvar proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n// A temporary value used to identify if the loop should be broken.\n// See #1064, #1293\nvar breakLoop = {};\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nfunction once(fn) {\n    return function () {\n        if (fn === null) return;\n        var callFn = fn;\n        fn = null;\n        callFn.apply(this, arguments);\n    };\n}\n\nvar iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator;\n\nvar getIterator = function (coll) {\n    return iteratorSymbol && coll[iteratorSymbol] && coll[iteratorSymbol]();\n};\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/** Used for built-in method references. */\nvar objectProto$3 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$2 = objectProto$3.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto$3.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty$2.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER$1 = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER$1 : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\n/** `Object#toString` result references. */\nvar argsTag$1 = '[object Arguments]';\nvar arrayTag = '[object Array]';\nvar boolTag = '[object Boolean]';\nvar dateTag = '[object Date]';\nvar errorTag = '[object Error]';\nvar funcTag$1 = '[object Function]';\nvar mapTag = '[object Map]';\nvar numberTag = '[object Number]';\nvar objectTag = '[object Object]';\nvar regexpTag = '[object RegExp]';\nvar setTag = '[object Set]';\nvar stringTag = '[object String]';\nvar weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]';\nvar dataViewTag = '[object DataView]';\nvar float32Tag = '[object Float32Array]';\nvar float64Tag = '[object Float64Array]';\nvar int8Tag = '[object Int8Array]';\nvar int16Tag = '[object Int16Array]';\nvar int32Tag = '[object Int32Array]';\nvar uint8Tag = '[object Uint8Array]';\nvar uint8ClampedTag = '[object Uint8ClampedArray]';\nvar uint16Tag = '[object Uint16Array]';\nvar uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag$1] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\n/** Detect free variable `exports`. */\nvar freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports$1 && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/** Used for built-in method references. */\nvar objectProto$2 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$1 = objectProto$2.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty$1.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto$5 = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$5;\n\n  return value === proto;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/** Used for built-in method references. */\nvar objectProto$4 = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$3 = objectProto$4.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty$3.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nfunction createArrayIterator(coll) {\n    var i = -1;\n    var len = coll.length;\n    return function next() {\n        return ++i < len ? {value: coll[i], key: i} : null;\n    }\n}\n\nfunction createES2015Iterator(iterator) {\n    var i = -1;\n    return function next() {\n        var item = iterator.next();\n        if (item.done)\n            return null;\n        i++;\n        return {value: item.value, key: i};\n    }\n}\n\nfunction createObjectIterator(obj) {\n    var okeys = keys(obj);\n    var i = -1;\n    var len = okeys.length;\n    return function next() {\n        var key = okeys[++i];\n        if (key === '__proto__') {\n            return next();\n        }\n        return i < len ? {value: obj[key], key: key} : null;\n    };\n}\n\nfunction iterator(coll) {\n    if (isArrayLike(coll)) {\n        return createArrayIterator(coll);\n    }\n\n    var iterator = getIterator(coll);\n    return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);\n}\n\nfunction onlyOnce(fn) {\n    return function() {\n        if (fn === null) throw new Error(\"Callback was already called.\");\n        var callFn = fn;\n        fn = null;\n        callFn.apply(this, arguments);\n    };\n}\n\nfunction _eachOfLimit(limit) {\n    return function (obj, iteratee, callback) {\n        callback = once(callback || noop);\n        if (limit <= 0 || !obj) {\n            return callback(null);\n        }\n        var nextElem = iterator(obj);\n        var done = false;\n        var running = 0;\n        var looping = false;\n\n        function iterateeCallback(err, value) {\n            running -= 1;\n            if (err) {\n                done = true;\n                callback(err);\n            }\n            else if (value === breakLoop || (done && running <= 0)) {\n                done = true;\n                return callback(null);\n            }\n            else if (!looping) {\n                replenish();\n            }\n        }\n\n        function replenish () {\n            looping = true;\n            while (running < limit && !done) {\n                var elem = nextElem();\n                if (elem === null) {\n                    done = true;\n                    if (running <= 0) {\n                        callback(null);\n                    }\n                    return;\n                }\n                running += 1;\n                iteratee(elem.value, elem.key, onlyOnce(iterateeCallback));\n            }\n            looping = false;\n        }\n\n        replenish();\n    };\n}\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name eachOfLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`. The `key` is the item's key, or index in the case of an\n * array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nfunction eachOfLimit(coll, limit, iteratee, callback) {\n    _eachOfLimit(limit)(coll, wrapAsync(iteratee), callback);\n}\n\nfunction doLimit(fn, limit) {\n    return function (iterable, iteratee, callback) {\n        return fn(iterable, limit, iteratee, callback);\n    };\n}\n\n// eachOf implementation optimized for array-likes\nfunction eachOfArrayLike(coll, iteratee, callback) {\n    callback = once(callback || noop);\n    var index = 0,\n        completed = 0,\n        length = coll.length;\n    if (length === 0) {\n        callback(null);\n    }\n\n    function iteratorCallback(err, value) {\n        if (err) {\n            callback(err);\n        } else if ((++completed === length) || value === breakLoop) {\n            callback(null);\n        }\n    }\n\n    for (; index < length; index++) {\n        iteratee(coll[index], index, onlyOnce(iteratorCallback));\n    }\n}\n\n// a generic version of eachOf which can handle array, object, and iterator cases.\nvar eachOfGeneric = doLimit(eachOfLimit, Infinity);\n\n/**\n * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument\n * to the iteratee.\n *\n * @name eachOf\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEachOf\n * @category Collection\n * @see [async.each]{@link module:Collections.each}\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each\n * item in `coll`.\n * The `key` is the item's key, or index in the case of an array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @example\n *\n * var obj = {dev: \"/dev.json\", test: \"/test.json\", prod: \"/prod.json\"};\n * var configs = {};\n *\n * async.forEachOf(obj, function (value, key, callback) {\n *     fs.readFile(__dirname + value, \"utf8\", function (err, data) {\n *         if (err) return callback(err);\n *         try {\n *             configs[key] = JSON.parse(data);\n *         } catch (e) {\n *             return callback(e);\n *         }\n *         callback();\n *     });\n * }, function (err) {\n *     if (err) console.error(err.message);\n *     // configs is now a map of JSON data\n *     doSomethingWith(configs);\n * });\n */\nvar eachOf = function(coll, iteratee, callback) {\n    var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric;\n    eachOfImplementation(coll, wrapAsync(iteratee), callback);\n};\n\nfunction doParallel(fn) {\n    return function (obj, iteratee, callback) {\n        return fn(eachOf, obj, wrapAsync(iteratee), callback);\n    };\n}\n\nfunction _asyncMap(eachfn, arr, iteratee, callback) {\n    callback = callback || noop;\n    arr = arr || [];\n    var results = [];\n    var counter = 0;\n    var _iteratee = wrapAsync(iteratee);\n\n    eachfn(arr, function (value, _, callback) {\n        var index = counter++;\n        _iteratee(value, function (err, v) {\n            results[index] = v;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, results);\n    });\n}\n\n/**\n * Produces a new collection of values by mapping each value in `coll` through\n * the `iteratee` function. The `iteratee` is called with an item from `coll`\n * and a callback for when it has finished processing. Each of these callback\n * takes 2 arguments: an `error`, and the transformed item from `coll`. If\n * `iteratee` passes an error to its callback, the main `callback` (for the\n * `map` function) is immediately called with the error.\n *\n * Note, that since this function applies the `iteratee` to each item in\n * parallel, there is no guarantee that the `iteratee` functions will complete\n * in order. However, the results array will be in the same order as the\n * original `coll`.\n *\n * If `map` is passed an Object, the results will be an Array.  The results\n * will roughly be in the order of the original Objects' keys (but this can\n * vary across JavaScript engines).\n *\n * @name map\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an Array of the\n * transformed items from the `coll`. Invoked with (err, results).\n * @example\n *\n * async.map(['file1','file2','file3'], fs.stat, function(err, results) {\n *     // results is now an array of stats for each file\n * });\n */\nvar map = doParallel(_asyncMap);\n\n/**\n * Applies the provided arguments to each function in the array, calling\n * `callback` after all functions have completed. If you only provide the first\n * argument, `fns`, then it will return a function which lets you pass in the\n * arguments as if it were a single function call. If more arguments are\n * provided, `callback` is required while `args` is still optional.\n *\n * @name applyEach\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} fns - A collection of {@link AsyncFunction}s\n * to all call with the same arguments\n * @param {...*} [args] - any number of separate arguments to pass to the\n * function.\n * @param {Function} [callback] - the final argument should be the callback,\n * called when all functions have completed processing.\n * @returns {Function} - If only the first argument, `fns`, is provided, it will\n * return a function which lets you pass in the arguments as if it were a single\n * function call. The signature is `(..args, callback)`. If invoked with any\n * arguments, `callback` is required.\n * @example\n *\n * async.applyEach([enableSearch, updateSchema], 'bucket', callback);\n *\n * // partial application example:\n * async.each(\n *     buckets,\n *     async.applyEach([enableSearch, updateSchema]),\n *     callback\n * );\n */\nvar applyEach = applyEach$1(map);\n\nfunction doParallelLimit(fn) {\n    return function (obj, limit, iteratee, callback) {\n        return fn(_eachOfLimit(limit), obj, wrapAsync(iteratee), callback);\n    };\n}\n\n/**\n * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time.\n *\n * @name mapLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an array of the\n * transformed items from the `coll`. Invoked with (err, results).\n */\nvar mapLimit = doParallelLimit(_asyncMap);\n\n/**\n * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time.\n *\n * @name mapSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an array of the\n * transformed items from the `coll`. Invoked with (err, results).\n */\nvar mapSeries = doLimit(mapLimit, 1);\n\n/**\n * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time.\n *\n * @name applyEachSeries\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.applyEach]{@link module:ControlFlow.applyEach}\n * @category Control Flow\n * @param {Array|Iterable|Object} fns - A collection of {@link AsyncFunction}s to all\n * call with the same arguments\n * @param {...*} [args] - any number of separate arguments to pass to the\n * function.\n * @param {Function} [callback] - the final argument should be the callback,\n * called when all functions have completed processing.\n * @returns {Function} - If only the first argument is provided, it will return\n * a function which lets you pass in the arguments as if it were a single\n * function call.\n */\nvar applyEachSeries = applyEach$1(mapSeries);\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\n/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\n/**\n * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on\n * their requirements. Each function can optionally depend on other functions\n * being completed first, and each function is run as soon as its requirements\n * are satisfied.\n *\n * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence\n * will stop. Further tasks will not execute (so any other functions depending\n * on it will not run), and the main `callback` is immediately called with the\n * error.\n *\n * {@link AsyncFunction}s also receive an object containing the results of functions which\n * have completed so far as the first argument, if they have dependencies. If a\n * task function has no dependencies, it will only be passed a callback.\n *\n * @name auto\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Object} tasks - An object. Each of its properties is either a\n * function or an array of requirements, with the {@link AsyncFunction} itself the last item\n * in the array. The object's key of a property serves as the name of the task\n * defined by that property, i.e. can be used when specifying requirements for\n * other tasks. The function receives one or two arguments:\n * * a `results` object, containing the results of the previously executed\n *   functions, only passed if the task has any dependencies,\n * * a `callback(err, result)` function, which must be called when finished,\n *   passing an `error` (which can be `null`) and the result of the function's\n *   execution.\n * @param {number} [concurrency=Infinity] - An optional `integer` for\n * determining the maximum number of tasks that can be run in parallel. By\n * default, as many as possible.\n * @param {Function} [callback] - An optional callback which is called when all\n * the tasks have been completed. It receives the `err` argument if any `tasks`\n * pass an error to their callback. Results are always returned; however, if an\n * error occurs, no further `tasks` will be performed, and the results object\n * will only contain partial results. Invoked with (err, results).\n * @returns undefined\n * @example\n *\n * async.auto({\n *     // this function will just be passed a callback\n *     readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),\n *     showData: ['readData', function(results, cb) {\n *         // results.readData is the file's contents\n *         // ...\n *     }]\n * }, callback);\n *\n * async.auto({\n *     get_data: function(callback) {\n *         console.log('in get_data');\n *         // async code to get some data\n *         callback(null, 'data', 'converted to array');\n *     },\n *     make_folder: function(callback) {\n *         console.log('in make_folder');\n *         // async code to create a directory to store a file in\n *         // this is run at the same time as getting the data\n *         callback(null, 'folder');\n *     },\n *     write_file: ['get_data', 'make_folder', function(results, callback) {\n *         console.log('in write_file', JSON.stringify(results));\n *         // once there is some data and the directory exists,\n *         // write the data to a file in the directory\n *         callback(null, 'filename');\n *     }],\n *     email_link: ['write_file', function(results, callback) {\n *         console.log('in email_link', JSON.stringify(results));\n *         // once the file is written let's email a link to it...\n *         // results.write_file contains the filename returned by write_file.\n *         callback(null, {'file':results.write_file, 'email':'user@example.com'});\n *     }]\n * }, function(err, results) {\n *     console.log('err = ', err);\n *     console.log('results = ', results);\n * });\n */\nvar auto = function (tasks, concurrency, callback) {\n    if (typeof concurrency === 'function') {\n        // concurrency is optional, shift the args.\n        callback = concurrency;\n        concurrency = null;\n    }\n    callback = once(callback || noop);\n    var keys$$1 = keys(tasks);\n    var numTasks = keys$$1.length;\n    if (!numTasks) {\n        return callback(null);\n    }\n    if (!concurrency) {\n        concurrency = numTasks;\n    }\n\n    var results = {};\n    var runningTasks = 0;\n    var hasError = false;\n\n    var listeners = Object.create(null);\n\n    var readyTasks = [];\n\n    // for cycle detection:\n    var readyToCheck = []; // tasks that have been identified as reachable\n    // without the possibility of returning to an ancestor task\n    var uncheckedDependencies = {};\n\n    baseForOwn(tasks, function (task, key) {\n        if (!isArray(task)) {\n            // no dependencies\n            enqueueTask(key, [task]);\n            readyToCheck.push(key);\n            return;\n        }\n\n        var dependencies = task.slice(0, task.length - 1);\n        var remainingDependencies = dependencies.length;\n        if (remainingDependencies === 0) {\n            enqueueTask(key, task);\n            readyToCheck.push(key);\n            return;\n        }\n        uncheckedDependencies[key] = remainingDependencies;\n\n        arrayEach(dependencies, function (dependencyName) {\n            if (!tasks[dependencyName]) {\n                throw new Error('async.auto task `' + key +\n                    '` has a non-existent dependency `' +\n                    dependencyName + '` in ' +\n                    dependencies.join(', '));\n            }\n            addListener(dependencyName, function () {\n                remainingDependencies--;\n                if (remainingDependencies === 0) {\n                    enqueueTask(key, task);\n                }\n            });\n        });\n    });\n\n    checkForDeadlocks();\n    processQueue();\n\n    function enqueueTask(key, task) {\n        readyTasks.push(function () {\n            runTask(key, task);\n        });\n    }\n\n    function processQueue() {\n        if (readyTasks.length === 0 && runningTasks === 0) {\n            return callback(null, results);\n        }\n        while(readyTasks.length && runningTasks < concurrency) {\n            var run = readyTasks.shift();\n            run();\n        }\n\n    }\n\n    function addListener(taskName, fn) {\n        var taskListeners = listeners[taskName];\n        if (!taskListeners) {\n            taskListeners = listeners[taskName] = [];\n        }\n\n        taskListeners.push(fn);\n    }\n\n    function taskComplete(taskName) {\n        var taskListeners = listeners[taskName] || [];\n        arrayEach(taskListeners, function (fn) {\n            fn();\n        });\n        processQueue();\n    }\n\n\n    function runTask(key, task) {\n        if (hasError) return;\n\n        var taskCallback = onlyOnce(function(err, result) {\n            runningTasks--;\n            if (arguments.length > 2) {\n                result = slice(arguments, 1);\n            }\n            if (err) {\n                var safeResults = {};\n                baseForOwn(results, function(val, rkey) {\n                    safeResults[rkey] = val;\n                });\n                safeResults[key] = result;\n                hasError = true;\n                listeners = Object.create(null);\n\n                callback(err, safeResults);\n            } else {\n                results[key] = result;\n                taskComplete(key);\n            }\n        });\n\n        runningTasks++;\n        var taskFn = wrapAsync(task[task.length - 1]);\n        if (task.length > 1) {\n            taskFn(results, taskCallback);\n        } else {\n            taskFn(taskCallback);\n        }\n    }\n\n    function checkForDeadlocks() {\n        // Kahn's algorithm\n        // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm\n        // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html\n        var currentTask;\n        var counter = 0;\n        while (readyToCheck.length) {\n            currentTask = readyToCheck.pop();\n            counter++;\n            arrayEach(getDependents(currentTask), function (dependent) {\n                if (--uncheckedDependencies[dependent] === 0) {\n                    readyToCheck.push(dependent);\n                }\n            });\n        }\n\n        if (counter !== numTasks) {\n            throw new Error(\n                'async.auto cannot execute tasks due to a recursive dependency'\n            );\n        }\n    }\n\n    function getDependents(taskName) {\n        var result = [];\n        baseForOwn(tasks, function (task, key) {\n            if (isArray(task) && baseIndexOf(task, taskName, 0) >= 0) {\n                result.push(key);\n            }\n        });\n        return result;\n    }\n};\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol$1 ? Symbol$1.prototype : undefined;\nvar symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n  var length = array.length;\n  end = end === undefined ? length : end;\n  return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\nfunction charsEndIndex(strSymbols, chrSymbols) {\n  var index = strSymbols.length;\n\n  while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n  return index;\n}\n\n/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\nfunction charsStartIndex(strSymbols, chrSymbols) {\n  var index = -1,\n      length = strSymbols.length;\n\n  while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n  return index;\n}\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n  return string.split('');\n}\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff';\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f';\nvar reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f';\nvar rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff';\nvar rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\nvar rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange$1 = '\\\\ud800-\\\\udfff';\nvar rsComboMarksRange$1 = '\\\\u0300-\\\\u036f';\nvar reComboHalfMarksRange$1 = '\\\\ufe20-\\\\ufe2f';\nvar rsComboSymbolsRange$1 = '\\\\u20d0-\\\\u20ff';\nvar rsComboRange$1 = rsComboMarksRange$1 + reComboHalfMarksRange$1 + rsComboSymbolsRange$1;\nvar rsVarRange$1 = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange$1 + ']';\nvar rsCombo = '[' + rsComboRange$1 + ']';\nvar rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]';\nvar rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')';\nvar rsNonAstral = '[^' + rsAstralRange$1 + ']';\nvar rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}';\nvar rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]';\nvar rsZWJ$1 = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?';\nvar rsOptVar = '[' + rsVarRange$1 + ']?';\nvar rsOptJoin = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*';\nvar rsSeq = rsOptVar + reOptMod + rsOptJoin;\nvar rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n  return string.match(reUnicode) || [];\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n  return hasUnicode(string)\n    ? unicodeToArray(string)\n    : asciiToArray(string);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim('  abc  ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map(['  foo  ', '  bar  '], _.trim);\n * // => ['foo', 'bar']\n */\nfunction trim(string, chars, guard) {\n  string = toString(string);\n  if (string && (guard || chars === undefined)) {\n    return string.replace(reTrim, '');\n  }\n  if (!string || !(chars = baseToString(chars))) {\n    return string;\n  }\n  var strSymbols = stringToArray(string),\n      chrSymbols = stringToArray(chars),\n      start = charsStartIndex(strSymbols, chrSymbols),\n      end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n  return castSlice(strSymbols, start, end).join('');\n}\n\nvar FN_ARGS = /^(?:async\\s+)?(function)?\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /(=.+)?(\\s*)$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\n\nfunction parseParams(func) {\n    func = func.toString().replace(STRIP_COMMENTS, '');\n    func = func.match(FN_ARGS)[2].replace(' ', '');\n    func = func ? func.split(FN_ARG_SPLIT) : [];\n    func = func.map(function (arg){\n        return trim(arg.replace(FN_ARG, ''));\n    });\n    return func;\n}\n\n/**\n * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent\n * tasks are specified as parameters to the function, after the usual callback\n * parameter, with the parameter names matching the names of the tasks it\n * depends on. This can provide even more readable task graphs which can be\n * easier to maintain.\n *\n * If a final callback is specified, the task results are similarly injected,\n * specified as named parameters after the initial error parameter.\n *\n * The autoInject function is purely syntactic sugar and its semantics are\n * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}.\n *\n * @name autoInject\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.auto]{@link module:ControlFlow.auto}\n * @category Control Flow\n * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of\n * the form 'func([dependencies...], callback). The object's key of a property\n * serves as the name of the task defined by that property, i.e. can be used\n * when specifying requirements for other tasks.\n * * The `callback` parameter is a `callback(err, result)` which must be called\n *   when finished, passing an `error` (which can be `null`) and the result of\n *   the function's execution. The remaining parameters name other tasks on\n *   which the task is dependent, and the results from those tasks are the\n *   arguments of those parameters.\n * @param {Function} [callback] - An optional callback which is called when all\n * the tasks have been completed. It receives the `err` argument if any `tasks`\n * pass an error to their callback, and a `results` object with any completed\n * task results, similar to `auto`.\n * @example\n *\n * //  The example from `auto` can be rewritten as follows:\n * async.autoInject({\n *     get_data: function(callback) {\n *         // async code to get some data\n *         callback(null, 'data', 'converted to array');\n *     },\n *     make_folder: function(callback) {\n *         // async code to create a directory to store a file in\n *         // this is run at the same time as getting the data\n *         callback(null, 'folder');\n *     },\n *     write_file: function(get_data, make_folder, callback) {\n *         // once there is some data and the directory exists,\n *         // write the data to a file in the directory\n *         callback(null, 'filename');\n *     },\n *     email_link: function(write_file, callback) {\n *         // once the file is written let's email a link to it...\n *         // write_file contains the filename returned by write_file.\n *         callback(null, {'file':write_file, 'email':'user@example.com'});\n *     }\n * }, function(err, results) {\n *     console.log('err = ', err);\n *     console.log('email_link = ', results.email_link);\n * });\n *\n * // If you are using a JS minifier that mangles parameter names, `autoInject`\n * // will not work with plain functions, since the parameter names will be\n * // collapsed to a single letter identifier.  To work around this, you can\n * // explicitly specify the names of the parameters your task function needs\n * // in an array, similar to Angular.js dependency injection.\n *\n * // This still has an advantage over plain `auto`, since the results a task\n * // depends on are still spread into arguments.\n * async.autoInject({\n *     //...\n *     write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) {\n *         callback(null, 'filename');\n *     }],\n *     email_link: ['write_file', function(write_file, callback) {\n *         callback(null, {'file':write_file, 'email':'user@example.com'});\n *     }]\n *     //...\n * }, function(err, results) {\n *     console.log('err = ', err);\n *     console.log('email_link = ', results.email_link);\n * });\n */\nfunction autoInject(tasks, callback) {\n    var newTasks = {};\n\n    baseForOwn(tasks, function (taskFn, key) {\n        var params;\n        var fnIsAsync = isAsync(taskFn);\n        var hasNoDeps =\n            (!fnIsAsync && taskFn.length === 1) ||\n            (fnIsAsync && taskFn.length === 0);\n\n        if (isArray(taskFn)) {\n            params = taskFn.slice(0, -1);\n            taskFn = taskFn[taskFn.length - 1];\n\n            newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn);\n        } else if (hasNoDeps) {\n            // no dependencies, use the function as-is\n            newTasks[key] = taskFn;\n        } else {\n            params = parseParams(taskFn);\n            if (taskFn.length === 0 && !fnIsAsync && params.length === 0) {\n                throw new Error(\"autoInject task functions require explicit parameters.\");\n            }\n\n            // remove callback param\n            if (!fnIsAsync) params.pop();\n\n            newTasks[key] = params.concat(newTask);\n        }\n\n        function newTask(results, taskCb) {\n            var newArgs = arrayMap(params, function (name) {\n                return results[name];\n            });\n            newArgs.push(taskCb);\n            wrapAsync(taskFn).apply(null, newArgs);\n        }\n    });\n\n    auto(newTasks, callback);\n}\n\n// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation\n// used for queues. This implementation assumes that the node provided by the user can be modified\n// to adjust the next and last properties. We implement only the minimal functionality\n// for queue support.\nfunction DLL() {\n    this.head = this.tail = null;\n    this.length = 0;\n}\n\nfunction setInitial(dll, node) {\n    dll.length = 1;\n    dll.head = dll.tail = node;\n}\n\nDLL.prototype.removeLink = function(node) {\n    if (node.prev) node.prev.next = node.next;\n    else this.head = node.next;\n    if (node.next) node.next.prev = node.prev;\n    else this.tail = node.prev;\n\n    node.prev = node.next = null;\n    this.length -= 1;\n    return node;\n};\n\nDLL.prototype.empty = function () {\n    while(this.head) this.shift();\n    return this;\n};\n\nDLL.prototype.insertAfter = function(node, newNode) {\n    newNode.prev = node;\n    newNode.next = node.next;\n    if (node.next) node.next.prev = newNode;\n    else this.tail = newNode;\n    node.next = newNode;\n    this.length += 1;\n};\n\nDLL.prototype.insertBefore = function(node, newNode) {\n    newNode.prev = node.prev;\n    newNode.next = node;\n    if (node.prev) node.prev.next = newNode;\n    else this.head = newNode;\n    node.prev = newNode;\n    this.length += 1;\n};\n\nDLL.prototype.unshift = function(node) {\n    if (this.head) this.insertBefore(this.head, node);\n    else setInitial(this, node);\n};\n\nDLL.prototype.push = function(node) {\n    if (this.tail) this.insertAfter(this.tail, node);\n    else setInitial(this, node);\n};\n\nDLL.prototype.shift = function() {\n    return this.head && this.removeLink(this.head);\n};\n\nDLL.prototype.pop = function() {\n    return this.tail && this.removeLink(this.tail);\n};\n\nDLL.prototype.toArray = function () {\n    var arr = Array(this.length);\n    var curr = this.head;\n    for(var idx = 0; idx < this.length; idx++) {\n        arr[idx] = curr.data;\n        curr = curr.next;\n    }\n    return arr;\n};\n\nDLL.prototype.remove = function (testFn) {\n    var curr = this.head;\n    while(!!curr) {\n        var next = curr.next;\n        if (testFn(curr)) {\n            this.removeLink(curr);\n        }\n        curr = next;\n    }\n    return this;\n};\n\nfunction queue(worker, concurrency, payload) {\n    if (concurrency == null) {\n        concurrency = 1;\n    }\n    else if(concurrency === 0) {\n        throw new Error('Concurrency must not be zero');\n    }\n\n    var _worker = wrapAsync(worker);\n    var numRunning = 0;\n    var workersList = [];\n\n    var processingScheduled = false;\n    function _insert(data, insertAtFront, callback) {\n        if (callback != null && typeof callback !== 'function') {\n            throw new Error('task callback must be a function');\n        }\n        q.started = true;\n        if (!isArray(data)) {\n            data = [data];\n        }\n        if (data.length === 0 && q.idle()) {\n            // call drain immediately if there are no tasks\n            return setImmediate$1(function() {\n                q.drain();\n            });\n        }\n\n        for (var i = 0, l = data.length; i < l; i++) {\n            var item = {\n                data: data[i],\n                callback: callback || noop\n            };\n\n            if (insertAtFront) {\n                q._tasks.unshift(item);\n            } else {\n                q._tasks.push(item);\n            }\n        }\n\n        if (!processingScheduled) {\n            processingScheduled = true;\n            setImmediate$1(function() {\n                processingScheduled = false;\n                q.process();\n            });\n        }\n    }\n\n    function _next(tasks) {\n        return function(err){\n            numRunning -= 1;\n\n            for (var i = 0, l = tasks.length; i < l; i++) {\n                var task = tasks[i];\n\n                var index = baseIndexOf(workersList, task, 0);\n                if (index === 0) {\n                    workersList.shift();\n                } else if (index > 0) {\n                    workersList.splice(index, 1);\n                }\n\n                task.callback.apply(task, arguments);\n\n                if (err != null) {\n                    q.error(err, task.data);\n                }\n            }\n\n            if (numRunning <= (q.concurrency - q.buffer) ) {\n                q.unsaturated();\n            }\n\n            if (q.idle()) {\n                q.drain();\n            }\n            q.process();\n        };\n    }\n\n    var isProcessing = false;\n    var q = {\n        _tasks: new DLL(),\n        concurrency: concurrency,\n        payload: payload,\n        saturated: noop,\n        unsaturated:noop,\n        buffer: concurrency / 4,\n        empty: noop,\n        drain: noop,\n        error: noop,\n        started: false,\n        paused: false,\n        push: function (data, callback) {\n            _insert(data, false, callback);\n        },\n        kill: function () {\n            q.drain = noop;\n            q._tasks.empty();\n        },\n        unshift: function (data, callback) {\n            _insert(data, true, callback);\n        },\n        remove: function (testFn) {\n            q._tasks.remove(testFn);\n        },\n        process: function () {\n            // Avoid trying to start too many processing operations. This can occur\n            // when callbacks resolve synchronously (#1267).\n            if (isProcessing) {\n                return;\n            }\n            isProcessing = true;\n            while(!q.paused && numRunning < q.concurrency && q._tasks.length){\n                var tasks = [], data = [];\n                var l = q._tasks.length;\n                if (q.payload) l = Math.min(l, q.payload);\n                for (var i = 0; i < l; i++) {\n                    var node = q._tasks.shift();\n                    tasks.push(node);\n                    workersList.push(node);\n                    data.push(node.data);\n                }\n\n                numRunning += 1;\n\n                if (q._tasks.length === 0) {\n                    q.empty();\n                }\n\n                if (numRunning === q.concurrency) {\n                    q.saturated();\n                }\n\n                var cb = onlyOnce(_next(tasks));\n                _worker(data, cb);\n            }\n            isProcessing = false;\n        },\n        length: function () {\n            return q._tasks.length;\n        },\n        running: function () {\n            return numRunning;\n        },\n        workersList: function () {\n            return workersList;\n        },\n        idle: function() {\n            return q._tasks.length + numRunning === 0;\n        },\n        pause: function () {\n            q.paused = true;\n        },\n        resume: function () {\n            if (q.paused === false) { return; }\n            q.paused = false;\n            setImmediate$1(q.process);\n        }\n    };\n    return q;\n}\n\n/**\n * A cargo of tasks for the worker function to complete. Cargo inherits all of\n * the same methods and event callbacks as [`queue`]{@link module:ControlFlow.queue}.\n * @typedef {Object} CargoObject\n * @memberOf module:ControlFlow\n * @property {Function} length - A function returning the number of items\n * waiting to be processed. Invoke like `cargo.length()`.\n * @property {number} payload - An `integer` for determining how many tasks\n * should be process per round. This property can be changed after a `cargo` is\n * created to alter the payload on-the-fly.\n * @property {Function} push - Adds `task` to the `queue`. The callback is\n * called once the `worker` has finished processing the task. Instead of a\n * single task, an array of `tasks` can be submitted. The respective callback is\n * used for every task in the list. Invoke like `cargo.push(task, [callback])`.\n * @property {Function} saturated - A callback that is called when the\n * `queue.length()` hits the concurrency and further tasks will be queued.\n * @property {Function} empty - A callback that is called when the last item\n * from the `queue` is given to a `worker`.\n * @property {Function} drain - A callback that is called when the last item\n * from the `queue` has returned from the `worker`.\n * @property {Function} idle - a function returning false if there are items\n * waiting or being processed, or true if not. Invoke like `cargo.idle()`.\n * @property {Function} pause - a function that pauses the processing of tasks\n * until `resume()` is called. Invoke like `cargo.pause()`.\n * @property {Function} resume - a function that resumes the processing of\n * queued tasks when the queue is paused. Invoke like `cargo.resume()`.\n * @property {Function} kill - a function that removes the `drain` callback and\n * empties remaining tasks from the queue forcing it to go idle. Invoke like `cargo.kill()`.\n */\n\n/**\n * Creates a `cargo` object with the specified payload. Tasks added to the\n * cargo will be processed altogether (up to the `payload` limit). If the\n * `worker` is in progress, the task is queued until it becomes available. Once\n * the `worker` has completed some tasks, each callback of those tasks is\n * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966)\n * for how `cargo` and `queue` work.\n *\n * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers\n * at a time, cargo passes an array of tasks to a single worker, repeating\n * when the worker is finished.\n *\n * @name cargo\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @category Control Flow\n * @param {AsyncFunction} worker - An asynchronous function for processing an array\n * of queued tasks. Invoked with `(tasks, callback)`.\n * @param {number} [payload=Infinity] - An optional `integer` for determining\n * how many tasks should be processed per round; if omitted, the default is\n * unlimited.\n * @returns {module:ControlFlow.CargoObject} A cargo object to manage the tasks. Callbacks can\n * attached as certain properties to listen for specific events during the\n * lifecycle of the cargo and inner queue.\n * @example\n *\n * // create a cargo object with payload 2\n * var cargo = async.cargo(function(tasks, callback) {\n *     for (var i=0; i<tasks.length; i++) {\n *         console.log('hello ' + tasks[i].name);\n *     }\n *     callback();\n * }, 2);\n *\n * // add some items\n * cargo.push({name: 'foo'}, function(err) {\n *     console.log('finished processing foo');\n * });\n * cargo.push({name: 'bar'}, function(err) {\n *     console.log('finished processing bar');\n * });\n * cargo.push({name: 'baz'}, function(err) {\n *     console.log('finished processing baz');\n * });\n */\nfunction cargo(worker, payload) {\n    return queue(worker, 1, payload);\n}\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time.\n *\n * @name eachOfSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Invoked with (err).\n */\nvar eachOfSeries = doLimit(eachOfLimit, 1);\n\n/**\n * Reduces `coll` into a single value using an async `iteratee` to return each\n * successive step. `memo` is the initial state of the reduction. This function\n * only operates in series.\n *\n * For performance reasons, it may make sense to split a call to this function\n * into a parallel map, and then use the normal `Array.prototype.reduce` on the\n * results. This function is for situations where each step in the reduction\n * needs to be async; if you can get the data before reducing it, then it's\n * probably a good idea to do so.\n *\n * @name reduce\n * @static\n * @memberOf module:Collections\n * @method\n * @alias inject\n * @alias foldl\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n * @example\n *\n * async.reduce([1,2,3], 0, function(memo, item, callback) {\n *     // pointless async:\n *     process.nextTick(function() {\n *         callback(null, memo + item)\n *     });\n * }, function(err, result) {\n *     // result is now equal to the last value of memo, which is 6\n * });\n */\nfunction reduce(coll, memo, iteratee, callback) {\n    callback = once(callback || noop);\n    var _iteratee = wrapAsync(iteratee);\n    eachOfSeries(coll, function(x, i, callback) {\n        _iteratee(memo, x, function(err, v) {\n            memo = v;\n            callback(err);\n        });\n    }, function(err) {\n        callback(err, memo);\n    });\n}\n\n/**\n * Version of the compose function that is more natural to read. Each function\n * consumes the return value of the previous function. It is the equivalent of\n * [compose]{@link module:ControlFlow.compose} with the arguments reversed.\n *\n * Each function is executed with the `this` binding of the composed function.\n *\n * @name seq\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.compose]{@link module:ControlFlow.compose}\n * @category Control Flow\n * @param {...AsyncFunction} functions - the asynchronous functions to compose\n * @returns {Function} a function that composes the `functions` in order\n * @example\n *\n * // Requires lodash (or underscore), express3 and dresende's orm2.\n * // Part of an app, that fetches cats of the logged user.\n * // This example uses `seq` function to avoid overnesting and error\n * // handling clutter.\n * app.get('/cats', function(request, response) {\n *     var User = request.models.User;\n *     async.seq(\n *         _.bind(User.get, User),  // 'User.get' has signature (id, callback(err, data))\n *         function(user, fn) {\n *             user.getCats(fn);      // 'getCats' has signature (callback(err, data))\n *         }\n *     )(req.session.user_id, function (err, cats) {\n *         if (err) {\n *             console.error(err);\n *             response.json({ status: 'error', message: err.message });\n *         } else {\n *             response.json({ status: 'ok', message: 'Cats found', data: cats });\n *         }\n *     });\n * });\n */\nfunction seq(/*...functions*/) {\n    var _functions = arrayMap(arguments, wrapAsync);\n    return function(/*...args*/) {\n        var args = slice(arguments);\n        var that = this;\n\n        var cb = args[args.length - 1];\n        if (typeof cb == 'function') {\n            args.pop();\n        } else {\n            cb = noop;\n        }\n\n        reduce(_functions, args, function(newargs, fn, cb) {\n            fn.apply(that, newargs.concat(function(err/*, ...nextargs*/) {\n                var nextargs = slice(arguments, 1);\n                cb(err, nextargs);\n            }));\n        },\n        function(err, results) {\n            cb.apply(that, [err].concat(results));\n        });\n    };\n}\n\n/**\n * Creates a function which is a composition of the passed asynchronous\n * functions. Each function consumes the return value of the function that\n * follows. Composing functions `f()`, `g()`, and `h()` would produce the result\n * of `f(g(h()))`, only this version uses callbacks to obtain the return values.\n *\n * Each function is executed with the `this` binding of the composed function.\n *\n * @name compose\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {...AsyncFunction} functions - the asynchronous functions to compose\n * @returns {Function} an asynchronous function that is the composed\n * asynchronous `functions`\n * @example\n *\n * function add1(n, callback) {\n *     setTimeout(function () {\n *         callback(null, n + 1);\n *     }, 10);\n * }\n *\n * function mul3(n, callback) {\n *     setTimeout(function () {\n *         callback(null, n * 3);\n *     }, 10);\n * }\n *\n * var add1mul3 = async.compose(mul3, add1);\n * add1mul3(4, function (err, result) {\n *     // result now equals 15\n * });\n */\nvar compose = function(/*...args*/) {\n    return seq.apply(null, slice(arguments).reverse());\n};\n\nvar _concat = Array.prototype.concat;\n\n/**\n * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time.\n *\n * @name concatLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.concat]{@link module:Collections.concat}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,\n * which should use an array as its result. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n */\nvar concatLimit = function(coll, limit, iteratee, callback) {\n    callback = callback || noop;\n    var _iteratee = wrapAsync(iteratee);\n    mapLimit(coll, limit, function(val, callback) {\n        _iteratee(val, function(err /*, ...args*/) {\n            if (err) return callback(err);\n            return callback(null, slice(arguments, 1));\n        });\n    }, function(err, mapResults) {\n        var result = [];\n        for (var i = 0; i < mapResults.length; i++) {\n            if (mapResults[i]) {\n                result = _concat.apply(result, mapResults[i]);\n            }\n        }\n\n        return callback(err, result);\n    });\n};\n\n/**\n * Applies `iteratee` to each item in `coll`, concatenating the results. Returns\n * the concatenated list. The `iteratee`s are called in parallel, and the\n * results are concatenated as they return. There is no guarantee that the\n * results array will be returned in the original order of `coll` passed to the\n * `iteratee` function.\n *\n * @name concat\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,\n * which should use an array as its result. Invoked with (item, callback).\n * @param {Function} [callback(err)] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n * @example\n *\n * async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files) {\n *     // files is now a list of filenames that exist in the 3 directories\n * });\n */\nvar concat = doLimit(concatLimit, Infinity);\n\n/**\n * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time.\n *\n * @name concatSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.concat]{@link module:Collections.concat}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`.\n * The iteratee should complete with an array an array of results.\n * Invoked with (item, callback).\n * @param {Function} [callback(err)] - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is an array\n * containing the concatenated results of the `iteratee` function. Invoked with\n * (err, results).\n */\nvar concatSeries = doLimit(concatLimit, 1);\n\n/**\n * Returns a function that when called, calls-back with the values provided.\n * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to\n * [`auto`]{@link module:ControlFlow.auto}.\n *\n * @name constant\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {...*} arguments... - Any number of arguments to automatically invoke\n * callback with.\n * @returns {AsyncFunction} Returns a function that when invoked, automatically\n * invokes the callback with the previous given arguments.\n * @example\n *\n * async.waterfall([\n *     async.constant(42),\n *     function (value, next) {\n *         // value === 42\n *     },\n *     //...\n * ], callback);\n *\n * async.waterfall([\n *     async.constant(filename, \"utf8\"),\n *     fs.readFile,\n *     function (fileData, next) {\n *         //...\n *     }\n *     //...\n * ], callback);\n *\n * async.auto({\n *     hostname: async.constant(\"https://server.net/\"),\n *     port: findFreePort,\n *     launchServer: [\"hostname\", \"port\", function (options, cb) {\n *         startServer(options, cb);\n *     }],\n *     //...\n * }, callback);\n */\nvar constant = function(/*...values*/) {\n    var values = slice(arguments);\n    var args = [null].concat(values);\n    return function (/*...ignoredArgs, callback*/) {\n        var callback = arguments[arguments.length - 1];\n        return callback.apply(this, args);\n    };\n};\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nfunction _createTester(check, getResult) {\n    return function(eachfn, arr, iteratee, cb) {\n        cb = cb || noop;\n        var testPassed = false;\n        var testResult;\n        eachfn(arr, function(value, _, callback) {\n            iteratee(value, function(err, result) {\n                if (err) {\n                    callback(err);\n                } else if (check(result) && !testResult) {\n                    testPassed = true;\n                    testResult = getResult(true, value);\n                    callback(null, breakLoop);\n                } else {\n                    callback();\n                }\n            });\n        }, function(err) {\n            if (err) {\n                cb(err);\n            } else {\n                cb(null, testPassed ? testResult : getResult(false));\n            }\n        });\n    };\n}\n\nfunction _findGetResult(v, x) {\n    return x;\n}\n\n/**\n * Returns the first value in `coll` that passes an async truth test. The\n * `iteratee` is applied in parallel, meaning the first iteratee to return\n * `true` will fire the detect `callback` with that result. That means the\n * result might not be the first item in the original `coll` (in terms of order)\n * that passes the test.\n\n * If order within the original `coll` is important, then look at\n * [`detectSeries`]{@link module:Collections.detectSeries}.\n *\n * @name detect\n * @static\n * @memberOf module:Collections\n * @method\n * @alias find\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n * @example\n *\n * async.detect(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // result now equals the first file in the list that exists\n * });\n */\nvar detect = doParallel(_createTester(identity, _findGetResult));\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name detectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findLimit\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n */\nvar detectLimit = doParallelLimit(_createTester(identity, _findGetResult));\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time.\n *\n * @name detectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findSeries\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n */\nvar detectSeries = doLimit(detectLimit, 1);\n\nfunction consoleFunc(name) {\n    return function (fn/*, ...args*/) {\n        var args = slice(arguments, 1);\n        args.push(function (err/*, ...args*/) {\n            var args = slice(arguments, 1);\n            if (typeof console === 'object') {\n                if (err) {\n                    if (console.error) {\n                        console.error(err);\n                    }\n                } else if (console[name]) {\n                    arrayEach(args, function (x) {\n                        console[name](x);\n                    });\n                }\n            }\n        });\n        wrapAsync(fn).apply(null, args);\n    };\n}\n\n/**\n * Logs the result of an [`async` function]{@link AsyncFunction} to the\n * `console` using `console.dir` to display the properties of the resulting object.\n * Only works in Node.js or in browsers that support `console.dir` and\n * `console.error` (such as FF and Chrome).\n * If multiple arguments are returned from the async function,\n * `console.dir` is called on each argument in order.\n *\n * @name dir\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} function - The function you want to eventually apply\n * all arguments to.\n * @param {...*} arguments... - Any number of arguments to apply to the function.\n * @example\n *\n * // in a module\n * var hello = function(name, callback) {\n *     setTimeout(function() {\n *         callback(null, {hello: name});\n *     }, 1000);\n * };\n *\n * // in the node repl\n * node> async.dir(hello, 'world');\n * {hello: 'world'}\n */\nvar dir = consoleFunc('dir');\n\n/**\n * The post-check version of [`during`]{@link module:ControlFlow.during}. To reflect the difference in\n * the order of operations, the arguments `test` and `fn` are switched.\n *\n * Also a version of [`doWhilst`]{@link module:ControlFlow.doWhilst} with asynchronous `test` function.\n * @name doDuring\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.during]{@link module:ControlFlow.during}\n * @category Control Flow\n * @param {AsyncFunction} fn - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {AsyncFunction} test - asynchronous truth test to perform before each\n * execution of `fn`. Invoked with (...args, callback), where `...args` are the\n * non-error args from the previous callback of `fn`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `fn` has stopped. `callback`\n * will be passed an error if one occurred, otherwise `null`.\n */\nfunction doDuring(fn, test, callback) {\n    callback = onlyOnce(callback || noop);\n    var _fn = wrapAsync(fn);\n    var _test = wrapAsync(test);\n\n    function next(err/*, ...args*/) {\n        if (err) return callback(err);\n        var args = slice(arguments, 1);\n        args.push(check);\n        _test.apply(this, args);\n    }\n\n    function check(err, truth) {\n        if (err) return callback(err);\n        if (!truth) return callback(null);\n        _fn(next);\n    }\n\n    check(null, true);\n\n}\n\n/**\n * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in\n * the order of operations, the arguments `test` and `iteratee` are switched.\n *\n * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n *\n * @name doWhilst\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {AsyncFunction} iteratee - A function which is called each time `test`\n * passes. Invoked with (callback).\n * @param {Function} test - synchronous truth test to perform after each\n * execution of `iteratee`. Invoked with any non-error callback results of\n * `iteratee`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `iteratee` has stopped.\n * `callback` will be passed an error and any arguments passed to the final\n * `iteratee`'s callback. Invoked with (err, [results]);\n */\nfunction doWhilst(iteratee, test, callback) {\n    callback = onlyOnce(callback || noop);\n    var _iteratee = wrapAsync(iteratee);\n    var next = function(err/*, ...args*/) {\n        if (err) return callback(err);\n        var args = slice(arguments, 1);\n        if (test.apply(this, args)) return _iteratee(next);\n        callback.apply(null, [null].concat(args));\n    };\n    _iteratee(next);\n}\n\n/**\n * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the\n * argument ordering differs from `until`.\n *\n * @name doUntil\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.doWhilst]{@link module:ControlFlow.doWhilst}\n * @category Control Flow\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` fails. Invoked with (callback).\n * @param {Function} test - synchronous truth test to perform after each\n * execution of `iteratee`. Invoked with any non-error callback results of\n * `iteratee`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has passed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n */\nfunction doUntil(iteratee, test, callback) {\n    doWhilst(iteratee, function() {\n        return !test.apply(this, arguments);\n    }, callback);\n}\n\n/**\n * Like [`whilst`]{@link module:ControlFlow.whilst}, except the `test` is an asynchronous function that\n * is passed a callback in the form of `function (err, truth)`. If error is\n * passed to `test` or `fn`, the main callback is immediately called with the\n * value of the error.\n *\n * @name during\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {AsyncFunction} test - asynchronous truth test to perform before each\n * execution of `fn`. Invoked with (callback).\n * @param {AsyncFunction} fn - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `fn` has stopped. `callback`\n * will be passed an error, if one occurred, otherwise `null`.\n * @example\n *\n * var count = 0;\n *\n * async.during(\n *     function (callback) {\n *         return callback(null, count < 5);\n *     },\n *     function (callback) {\n *         count++;\n *         setTimeout(callback, 1000);\n *     },\n *     function (err) {\n *         // 5 seconds have passed\n *     }\n * );\n */\nfunction during(test, fn, callback) {\n    callback = onlyOnce(callback || noop);\n    var _fn = wrapAsync(fn);\n    var _test = wrapAsync(test);\n\n    function next(err) {\n        if (err) return callback(err);\n        _test(check);\n    }\n\n    function check(err, truth) {\n        if (err) return callback(err);\n        if (!truth) return callback(null);\n        _fn(next);\n    }\n\n    _test(check);\n}\n\nfunction _withoutIndex(iteratee) {\n    return function (value, index, callback) {\n        return iteratee(value, callback);\n    };\n}\n\n/**\n * Applies the function `iteratee` to each item in `coll`, in parallel.\n * The `iteratee` is called with an item from the list, and a callback for when\n * it has finished. If the `iteratee` passes an error to its `callback`, the\n * main `callback` (for the `each` function) is immediately called with the\n * error.\n *\n * Note, that since this function applies `iteratee` to each item in parallel,\n * there is no guarantee that the iteratee functions will complete in order.\n *\n * @name each\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEach\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to\n * each item in `coll`. Invoked with (item, callback).\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOf`.\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @example\n *\n * // assuming openFiles is an array of file names and saveFile is a function\n * // to save the modified contents of that file:\n *\n * async.each(openFiles, saveFile, function(err){\n *   // if any of the saves produced an error, err would equal that error\n * });\n *\n * // assuming openFiles is an array of file names\n * async.each(openFiles, function(file, callback) {\n *\n *     // Perform operation on file here.\n *     console.log('Processing file ' + file);\n *\n *     if( file.length > 32 ) {\n *       console.log('This file name is too long');\n *       callback('File name too long');\n *     } else {\n *       // Do work to process file here\n *       console.log('File processed');\n *       callback();\n *     }\n * }, function(err) {\n *     // if any of the file processing produced an error, err would equal that error\n *     if( err ) {\n *       // One of the iterations produced an error.\n *       // All processing will now stop.\n *       console.log('A file failed to process');\n *     } else {\n *       console.log('All files have been processed successfully');\n *     }\n * });\n */\nfunction eachLimit(coll, iteratee, callback) {\n    eachOf(coll, _withoutIndex(wrapAsync(iteratee)), callback);\n}\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\n *\n * @name eachLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfLimit`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nfunction eachLimit$1(coll, limit, iteratee, callback) {\n    _eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback);\n}\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\n *\n * @name eachSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfSeries`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nvar eachSeries = doLimit(eachLimit$1, 1);\n\n/**\n * Wrap an async function and ensure it calls its callback on a later tick of\n * the event loop.  If the function already calls its callback on a next tick,\n * no extra deferral is added. This is useful for preventing stack overflows\n * (`RangeError: Maximum call stack size exceeded`) and generally keeping\n * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony)\n * contained. ES2017 `async` functions are returned as-is -- they are immune\n * to Zalgo's corrupting influences, as they always resolve on a later tick.\n *\n * @name ensureAsync\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - an async function, one that expects a node-style\n * callback as its last argument.\n * @returns {AsyncFunction} Returns a wrapped function with the exact same call\n * signature as the function passed in.\n * @example\n *\n * function sometimesAsync(arg, callback) {\n *     if (cache[arg]) {\n *         return callback(null, cache[arg]); // this would be synchronous!!\n *     } else {\n *         doSomeIO(arg, callback); // this IO would be asynchronous\n *     }\n * }\n *\n * // this has a risk of stack overflows if many results are cached in a row\n * async.mapSeries(args, sometimesAsync, done);\n *\n * // this will defer sometimesAsync's callback if necessary,\n * // preventing stack overflows\n * async.mapSeries(args, async.ensureAsync(sometimesAsync), done);\n */\nfunction ensureAsync(fn) {\n    if (isAsync(fn)) return fn;\n    return initialParams(function (args, callback) {\n        var sync = true;\n        args.push(function () {\n            var innerArgs = arguments;\n            if (sync) {\n                setImmediate$1(function () {\n                    callback.apply(null, innerArgs);\n                });\n            } else {\n                callback.apply(null, innerArgs);\n            }\n        });\n        fn.apply(this, args);\n        sync = false;\n    });\n}\n\nfunction notId(v) {\n    return !v;\n}\n\n/**\n * Returns `true` if every element in `coll` satisfies an async test. If any\n * iteratee call returns `false`, the main `callback` is immediately called.\n *\n * @name every\n * @static\n * @memberOf module:Collections\n * @method\n * @alias all\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n * @example\n *\n * async.every(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // if result is true then every file exists\n * });\n */\nvar every = doParallel(_createTester(notId, notId));\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time.\n *\n * @name everyLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n */\nvar everyLimit = doParallelLimit(_createTester(notId, notId));\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time.\n *\n * @name everySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in series.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n */\nvar everySeries = doLimit(everyLimit, 1);\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nfunction filterArray(eachfn, arr, iteratee, callback) {\n    var truthValues = new Array(arr.length);\n    eachfn(arr, function (x, index, callback) {\n        iteratee(x, function (err, v) {\n            truthValues[index] = !!v;\n            callback(err);\n        });\n    }, function (err) {\n        if (err) return callback(err);\n        var results = [];\n        for (var i = 0; i < arr.length; i++) {\n            if (truthValues[i]) results.push(arr[i]);\n        }\n        callback(null, results);\n    });\n}\n\nfunction filterGeneric(eachfn, coll, iteratee, callback) {\n    var results = [];\n    eachfn(coll, function (x, index, callback) {\n        iteratee(x, function (err, v) {\n            if (err) {\n                callback(err);\n            } else {\n                if (v) {\n                    results.push({index: index, value: x});\n                }\n                callback();\n            }\n        });\n    }, function (err) {\n        if (err) {\n            callback(err);\n        } else {\n            callback(null, arrayMap(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), baseProperty('value')));\n        }\n    });\n}\n\nfunction _filter(eachfn, coll, iteratee, callback) {\n    var filter = isArrayLike(coll) ? filterArray : filterGeneric;\n    filter(eachfn, coll, wrapAsync(iteratee), callback || noop);\n}\n\n/**\n * Returns a new array of all the values in `coll` which pass an async truth\n * test. This operation is performed in parallel, but the results array will be\n * in the same order as the original.\n *\n * @name filter\n * @static\n * @memberOf module:Collections\n * @method\n * @alias select\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @example\n *\n * async.filter(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, results) {\n *     // results now equals an array of the existing files\n * });\n */\nvar filter = doParallel(_filter);\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name filterLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nvar filterLimit = doParallelLimit(_filter);\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time.\n *\n * @name filterSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results)\n */\nvar filterSeries = doLimit(filterLimit, 1);\n\n/**\n * Calls the asynchronous function `fn` with a callback parameter that allows it\n * to call itself again, in series, indefinitely.\n\n * If an error is passed to the callback then `errback` is called with the\n * error, and execution stops, otherwise it will never be called.\n *\n * @name forever\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} fn - an async function to call repeatedly.\n * Invoked with (next).\n * @param {Function} [errback] - when `fn` passes an error to it's callback,\n * this function will be called, and execution stops. Invoked with (err).\n * @example\n *\n * async.forever(\n *     function(next) {\n *         // next is suitable for passing to things that need a callback(err [, whatever]);\n *         // it will result in this function being called again.\n *     },\n *     function(err) {\n *         // if next is called with a value in its first parameter, it will appear\n *         // in here as 'err', and execution will stop.\n *     }\n * );\n */\nfunction forever(fn, errback) {\n    var done = onlyOnce(errback || noop);\n    var task = wrapAsync(ensureAsync(fn));\n\n    function next(err) {\n        if (err) return done(err);\n        task(next);\n    }\n    next();\n}\n\n/**\n * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time.\n *\n * @name groupByLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.groupBy]{@link module:Collections.groupBy}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n */\nvar groupByLimit = function(coll, limit, iteratee, callback) {\n    callback = callback || noop;\n    var _iteratee = wrapAsync(iteratee);\n    mapLimit(coll, limit, function(val, callback) {\n        _iteratee(val, function(err, key) {\n            if (err) return callback(err);\n            return callback(null, {key: key, val: val});\n        });\n    }, function(err, mapResults) {\n        var result = {};\n        // from MDN, handle object having an `hasOwnProperty` prop\n        var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n        for (var i = 0; i < mapResults.length; i++) {\n            if (mapResults[i]) {\n                var key = mapResults[i].key;\n                var val = mapResults[i].val;\n\n                if (hasOwnProperty.call(result, key)) {\n                    result[key].push(val);\n                } else {\n                    result[key] = [val];\n                }\n            }\n        }\n\n        return callback(err, result);\n    });\n};\n\n/**\n * Returns a new object, where each value corresponds to an array of items, from\n * `coll`, that returned the corresponding key. That is, the keys of the object\n * correspond to the values passed to the `iteratee` callback.\n *\n * Note: Since this function applies the `iteratee` to each item in parallel,\n * there is no guarantee that the `iteratee` functions will complete in order.\n * However, the values for each key in the `result` will be in the same order as\n * the original `coll`. For Objects, the values will roughly be in the order of\n * the original Objects' keys (but this can vary across JavaScript engines).\n *\n * @name groupBy\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n * @example\n *\n * async.groupBy(['userId1', 'userId2', 'userId3'], function(userId, callback) {\n *     db.findById(userId, function(err, user) {\n *         if (err) return callback(err);\n *         return callback(null, user.age);\n *     });\n * }, function(err, result) {\n *     // result is object containing the userIds grouped by age\n *     // e.g. { 30: ['userId1', 'userId3'], 42: ['userId2']};\n * });\n */\nvar groupBy = doLimit(groupByLimit, Infinity);\n\n/**\n * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time.\n *\n * @name groupBySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.groupBy]{@link module:Collections.groupBy}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n */\nvar groupBySeries = doLimit(groupByLimit, 1);\n\n/**\n * Logs the result of an `async` function to the `console`. Only works in\n * Node.js or in browsers that support `console.log` and `console.error` (such\n * as FF and Chrome). If multiple arguments are returned from the async\n * function, `console.log` is called on each argument in order.\n *\n * @name log\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} function - The function you want to eventually apply\n * all arguments to.\n * @param {...*} arguments... - Any number of arguments to apply to the function.\n * @example\n *\n * // in a module\n * var hello = function(name, callback) {\n *     setTimeout(function() {\n *         callback(null, 'hello ' + name);\n *     }, 1000);\n * };\n *\n * // in the node repl\n * node> async.log(hello, 'world');\n * 'hello world'\n */\nvar log = consoleFunc('log');\n\n/**\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name mapValuesLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.mapValues]{@link module:Collections.mapValues}\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n */\nfunction mapValuesLimit(obj, limit, iteratee, callback) {\n    callback = once(callback || noop);\n    var newObj = {};\n    var _iteratee = wrapAsync(iteratee);\n    eachOfLimit(obj, limit, function(val, key, next) {\n        _iteratee(val, key, function (err, result) {\n            if (err) return next(err);\n            newObj[key] = result;\n            next();\n        });\n    }, function (err) {\n        callback(err, newObj);\n    });\n}\n\n/**\n * A relative of [`map`]{@link module:Collections.map}, designed for use with objects.\n *\n * Produces a new Object by mapping each value of `obj` through the `iteratee`\n * function. The `iteratee` is called each `value` and `key` from `obj` and a\n * callback for when it has finished processing. Each of these callbacks takes\n * two arguments: an `error`, and the transformed item from `obj`. If `iteratee`\n * passes an error to its callback, the main `callback` (for the `mapValues`\n * function) is immediately called with the error.\n *\n * Note, the order of the keys in the result is not guaranteed.  The keys will\n * be roughly in the order they complete, (but this is very engine-specific)\n *\n * @name mapValues\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n * @example\n *\n * async.mapValues({\n *     f1: 'file1',\n *     f2: 'file2',\n *     f3: 'file3'\n * }, function (file, key, callback) {\n *   fs.stat(file, callback);\n * }, function(err, result) {\n *     // result is now a map of stats for each file, e.g.\n *     // {\n *     //     f1: [stats for file1],\n *     //     f2: [stats for file2],\n *     //     f3: [stats for file3]\n *     // }\n * });\n */\n\nvar mapValues = doLimit(mapValuesLimit, Infinity);\n\n/**\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time.\n *\n * @name mapValuesSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.mapValues]{@link module:Collections.mapValues}\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n */\nvar mapValuesSeries = doLimit(mapValuesLimit, 1);\n\nfunction has(obj, key) {\n    return key in obj;\n}\n\n/**\n * Caches the results of an async function. When creating a hash to store\n * function results against, the callback is omitted from the hash and an\n * optional hash function can be used.\n *\n * If no hash function is specified, the first argument is used as a hash key,\n * which may work reasonably if it is a string or a data type that converts to a\n * distinct string. Note that objects and arrays will not behave reasonably.\n * Neither will cases where the other arguments are significant. In such cases,\n * specify your own hash function.\n *\n * The cache of results is exposed as the `memo` property of the function\n * returned by `memoize`.\n *\n * @name memoize\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - The async function to proxy and cache results from.\n * @param {Function} hasher - An optional function for generating a custom hash\n * for storing results. It has all the arguments applied to it apart from the\n * callback, and must be synchronous.\n * @returns {AsyncFunction} a memoized version of `fn`\n * @example\n *\n * var slow_fn = function(name, callback) {\n *     // do something\n *     callback(null, result);\n * };\n * var fn = async.memoize(slow_fn);\n *\n * // fn can now be used as if it were slow_fn\n * fn('some name', function() {\n *     // callback\n * });\n */\nfunction memoize(fn, hasher) {\n    var memo = Object.create(null);\n    var queues = Object.create(null);\n    hasher = hasher || identity;\n    var _fn = wrapAsync(fn);\n    var memoized = initialParams(function memoized(args, callback) {\n        var key = hasher.apply(null, args);\n        if (has(memo, key)) {\n            setImmediate$1(function() {\n                callback.apply(null, memo[key]);\n            });\n        } else if (has(queues, key)) {\n            queues[key].push(callback);\n        } else {\n            queues[key] = [callback];\n            _fn.apply(null, args.concat(function(/*args*/) {\n                var args = slice(arguments);\n                memo[key] = args;\n                var q = queues[key];\n                delete queues[key];\n                for (var i = 0, l = q.length; i < l; i++) {\n                    q[i].apply(null, args);\n                }\n            }));\n        }\n    });\n    memoized.memo = memo;\n    memoized.unmemoized = fn;\n    return memoized;\n}\n\n/**\n * Calls `callback` on a later loop around the event loop. In Node.js this just\n * calls `process.nextTick`.  In the browser it will use `setImmediate` if\n * available, otherwise `setTimeout(callback, 0)`, which means other higher\n * priority events may precede the execution of `callback`.\n *\n * This is used internally for browser-compatibility purposes.\n *\n * @name nextTick\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.setImmediate]{@link module:Utils.setImmediate}\n * @category Util\n * @param {Function} callback - The function to call on a later loop around\n * the event loop. Invoked with (args...).\n * @param {...*} args... - any number of additional arguments to pass to the\n * callback on the next tick.\n * @example\n *\n * var call_order = [];\n * async.nextTick(function() {\n *     call_order.push('two');\n *     // call_order now equals ['one','two']\n * });\n * call_order.push('one');\n *\n * async.setImmediate(function (a, b, c) {\n *     // a, b, and c equal 1, 2, and 3\n * }, 1, 2, 3);\n */\nvar _defer$1;\n\nif (hasNextTick) {\n    _defer$1 = process.nextTick;\n} else if (hasSetImmediate) {\n    _defer$1 = setImmediate;\n} else {\n    _defer$1 = fallback;\n}\n\nvar nextTick = wrap(_defer$1);\n\nfunction _parallel(eachfn, tasks, callback) {\n    callback = callback || noop;\n    var results = isArrayLike(tasks) ? [] : {};\n\n    eachfn(tasks, function (task, key, callback) {\n        wrapAsync(task)(function (err, result) {\n            if (arguments.length > 2) {\n                result = slice(arguments, 1);\n            }\n            results[key] = result;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, results);\n    });\n}\n\n/**\n * Run the `tasks` collection of functions in parallel, without waiting until\n * the previous function has completed. If any of the functions pass an error to\n * its callback, the main `callback` is immediately called with the value of the\n * error. Once the `tasks` have completed, the results are passed to the final\n * `callback` as an array.\n *\n * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about\n * parallel execution of code.  If your tasks do not use any timers or perform\n * any I/O, they will actually be executed in series.  Any synchronous setup\n * sections for each task will happen one after the other.  JavaScript remains\n * single-threaded.\n *\n * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the\n * execution of other tasks when a task fails.\n *\n * It is also possible to use an object instead of an array. Each property will\n * be run as a function and the results will be passed to the final `callback`\n * as an object instead of an array. This can be a more readable way of handling\n * results from {@link async.parallel}.\n *\n * @name parallel\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection of\n * [async functions]{@link AsyncFunction} to run.\n * Each async function can complete with any number of optional `result` values.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed successfully. This function gets a results array\n * (or object) containing all the result arguments passed to the task callbacks.\n * Invoked with (err, results).\n *\n * @example\n * async.parallel([\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'two');\n *         }, 100);\n *     }\n * ],\n * // optional callback\n * function(err, results) {\n *     // the results array will equal ['one','two'] even though\n *     // the second function had a shorter timeout.\n * });\n *\n * // an example using an object instead of an array\n * async.parallel({\n *     one: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 1);\n *         }, 200);\n *     },\n *     two: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 2);\n *         }, 100);\n *     }\n * }, function(err, results) {\n *     // results is now equals to: {one: 1, two: 2}\n * });\n */\nfunction parallelLimit(tasks, callback) {\n    _parallel(eachOf, tasks, callback);\n}\n\n/**\n * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name parallelLimit\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.parallel]{@link module:ControlFlow.parallel}\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection of\n * [async functions]{@link AsyncFunction} to run.\n * Each async function can complete with any number of optional `result` values.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed successfully. This function gets a results array\n * (or object) containing all the result arguments passed to the task callbacks.\n * Invoked with (err, results).\n */\nfunction parallelLimit$1(tasks, limit, callback) {\n    _parallel(_eachOfLimit(limit), tasks, callback);\n}\n\n/**\n * A queue of tasks for the worker function to complete.\n * @typedef {Object} QueueObject\n * @memberOf module:ControlFlow\n * @property {Function} length - a function returning the number of items\n * waiting to be processed. Invoke with `queue.length()`.\n * @property {boolean} started - a boolean indicating whether or not any\n * items have been pushed and processed by the queue.\n * @property {Function} running - a function returning the number of items\n * currently being processed. Invoke with `queue.running()`.\n * @property {Function} workersList - a function returning the array of items\n * currently being processed. Invoke with `queue.workersList()`.\n * @property {Function} idle - a function returning false if there are items\n * waiting or being processed, or true if not. Invoke with `queue.idle()`.\n * @property {number} concurrency - an integer for determining how many `worker`\n * functions should be run in parallel. This property can be changed after a\n * `queue` is created to alter the concurrency on-the-fly.\n * @property {Function} push - add a new task to the `queue`. Calls `callback`\n * once the `worker` has finished processing the task. Instead of a single task,\n * a `tasks` array can be submitted. The respective callback is used for every\n * task in the list. Invoke with `queue.push(task, [callback])`,\n * @property {Function} unshift - add a new task to the front of the `queue`.\n * Invoke with `queue.unshift(task, [callback])`.\n * @property {Function} remove - remove items from the queue that match a test\n * function.  The test function will be passed an object with a `data` property,\n * and a `priority` property, if this is a\n * [priorityQueue]{@link module:ControlFlow.priorityQueue} object.\n * Invoked with `queue.remove(testFn)`, where `testFn` is of the form\n * `function ({data, priority}) {}` and returns a Boolean.\n * @property {Function} saturated - a callback that is called when the number of\n * running workers hits the `concurrency` limit, and further tasks will be\n * queued.\n * @property {Function} unsaturated - a callback that is called when the number\n * of running workers is less than the `concurrency` & `buffer` limits, and\n * further tasks will not be queued.\n * @property {number} buffer - A minimum threshold buffer in order to say that\n * the `queue` is `unsaturated`.\n * @property {Function} empty - a callback that is called when the last item\n * from the `queue` is given to a `worker`.\n * @property {Function} drain - a callback that is called when the last item\n * from the `queue` has returned from the `worker`.\n * @property {Function} error - a callback that is called when a task errors.\n * Has the signature `function(error, task)`.\n * @property {boolean} paused - a boolean for determining whether the queue is\n * in a paused state.\n * @property {Function} pause - a function that pauses the processing of tasks\n * until `resume()` is called. Invoke with `queue.pause()`.\n * @property {Function} resume - a function that resumes the processing of\n * queued tasks when the queue is paused. Invoke with `queue.resume()`.\n * @property {Function} kill - a function that removes the `drain` callback and\n * empties remaining tasks from the queue forcing it to go idle. No more tasks\n * should be pushed to the queue after calling this function. Invoke with `queue.kill()`.\n */\n\n/**\n * Creates a `queue` object with the specified `concurrency`. Tasks added to the\n * `queue` are processed in parallel (up to the `concurrency` limit). If all\n * `worker`s are in progress, the task is queued until one becomes available.\n * Once a `worker` completes a `task`, that `task`'s callback is called.\n *\n * @name queue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} worker - An async function for processing a queued task.\n * If you want to handle errors from an individual task, pass a callback to\n * `q.push()`. Invoked with (task, callback).\n * @param {number} [concurrency=1] - An `integer` for determining how many\n * `worker` functions should be run in parallel.  If omitted, the concurrency\n * defaults to `1`.  If the concurrency is `0`, an error is thrown.\n * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can\n * attached as certain properties to listen for specific events during the\n * lifecycle of the queue.\n * @example\n *\n * // create a queue object with concurrency 2\n * var q = async.queue(function(task, callback) {\n *     console.log('hello ' + task.name);\n *     callback();\n * }, 2);\n *\n * // assign a callback\n * q.drain = function() {\n *     console.log('all items have been processed');\n * };\n *\n * // add some items to the queue\n * q.push({name: 'foo'}, function(err) {\n *     console.log('finished processing foo');\n * });\n * q.push({name: 'bar'}, function (err) {\n *     console.log('finished processing bar');\n * });\n *\n * // add some items to the queue (batch-wise)\n * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {\n *     console.log('finished processing item');\n * });\n *\n * // add some items to the front of the queue\n * q.unshift({name: 'bar'}, function (err) {\n *     console.log('finished processing bar');\n * });\n */\nvar queue$1 = function (worker, concurrency) {\n    var _worker = wrapAsync(worker);\n    return queue(function (items, cb) {\n        _worker(items[0], cb);\n    }, concurrency, 1);\n};\n\n/**\n * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and\n * completed in ascending priority order.\n *\n * @name priorityQueue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @category Control Flow\n * @param {AsyncFunction} worker - An async function for processing a queued task.\n * If you want to handle errors from an individual task, pass a callback to\n * `q.push()`.\n * Invoked with (task, callback).\n * @param {number} concurrency - An `integer` for determining how many `worker`\n * functions should be run in parallel.  If omitted, the concurrency defaults to\n * `1`.  If the concurrency is `0`, an error is thrown.\n * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are two\n * differences between `queue` and `priorityQueue` objects:\n * * `push(task, priority, [callback])` - `priority` should be a number. If an\n *   array of `tasks` is given, all tasks will be assigned the same priority.\n * * The `unshift` method was removed.\n */\nvar priorityQueue = function(worker, concurrency) {\n    // Start with a normal queue\n    var q = queue$1(worker, concurrency);\n\n    // Override push to accept second parameter representing priority\n    q.push = function(data, priority, callback) {\n        if (callback == null) callback = noop;\n        if (typeof callback !== 'function') {\n            throw new Error('task callback must be a function');\n        }\n        q.started = true;\n        if (!isArray(data)) {\n            data = [data];\n        }\n        if (data.length === 0) {\n            // call drain immediately if there are no tasks\n            return setImmediate$1(function() {\n                q.drain();\n            });\n        }\n\n        priority = priority || 0;\n        var nextNode = q._tasks.head;\n        while (nextNode && priority >= nextNode.priority) {\n            nextNode = nextNode.next;\n        }\n\n        for (var i = 0, l = data.length; i < l; i++) {\n            var item = {\n                data: data[i],\n                priority: priority,\n                callback: callback\n            };\n\n            if (nextNode) {\n                q._tasks.insertBefore(nextNode, item);\n            } else {\n                q._tasks.push(item);\n            }\n        }\n        setImmediate$1(q.process);\n    };\n\n    // Remove unshift function\n    delete q.unshift;\n\n    return q;\n};\n\n/**\n * Runs the `tasks` array of functions in parallel, without waiting until the\n * previous function has completed. Once any of the `tasks` complete or pass an\n * error to its callback, the main `callback` is immediately called. It's\n * equivalent to `Promise.race()`.\n *\n * @name race\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction}\n * to run. Each function can complete with an optional `result` value.\n * @param {Function} callback - A callback to run once any of the functions have\n * completed. This function gets an error or result from the first function that\n * completed. Invoked with (err, result).\n * @returns undefined\n * @example\n *\n * async.race([\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'two');\n *         }, 100);\n *     }\n * ],\n * // main callback\n * function(err, result) {\n *     // the result will be equal to 'two' as it finishes earlier\n * });\n */\nfunction race(tasks, callback) {\n    callback = once(callback || noop);\n    if (!isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));\n    if (!tasks.length) return callback();\n    for (var i = 0, l = tasks.length; i < l; i++) {\n        wrapAsync(tasks[i])(callback);\n    }\n}\n\n/**\n * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order.\n *\n * @name reduceRight\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reduce]{@link module:Collections.reduce}\n * @alias foldr\n * @category Collection\n * @param {Array} array - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n */\nfunction reduceRight (array, memo, iteratee, callback) {\n    var reversed = slice(array).reverse();\n    reduce(reversed, memo, iteratee, callback);\n}\n\n/**\n * Wraps the async function in another function that always completes with a\n * result object, even when it errors.\n *\n * The result object has either the property `error` or `value`.\n *\n * @name reflect\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - The async function you want to wrap\n * @returns {Function} - A function that always passes null to it's callback as\n * the error. The second argument to the callback will be an `object` with\n * either an `error` or a `value` property.\n * @example\n *\n * async.parallel([\n *     async.reflect(function(callback) {\n *         // do some stuff ...\n *         callback(null, 'one');\n *     }),\n *     async.reflect(function(callback) {\n *         // do some more stuff but error ...\n *         callback('bad stuff happened');\n *     }),\n *     async.reflect(function(callback) {\n *         // do some more stuff ...\n *         callback(null, 'two');\n *     })\n * ],\n * // optional callback\n * function(err, results) {\n *     // values\n *     // results[0].value = 'one'\n *     // results[1].error = 'bad stuff happened'\n *     // results[2].value = 'two'\n * });\n */\nfunction reflect(fn) {\n    var _fn = wrapAsync(fn);\n    return initialParams(function reflectOn(args, reflectCallback) {\n        args.push(function callback(error, cbArg) {\n            if (error) {\n                reflectCallback(null, { error: error });\n            } else {\n                var value;\n                if (arguments.length <= 2) {\n                    value = cbArg;\n                } else {\n                    value = slice(arguments, 1);\n                }\n                reflectCallback(null, { value: value });\n            }\n        });\n\n        return _fn.apply(this, args);\n    });\n}\n\n/**\n * A helper function that wraps an array or an object of functions with `reflect`.\n *\n * @name reflectAll\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.reflect]{@link module:Utils.reflect}\n * @category Util\n * @param {Array|Object|Iterable} tasks - The collection of\n * [async functions]{@link AsyncFunction} to wrap in `async.reflect`.\n * @returns {Array} Returns an array of async functions, each wrapped in\n * `async.reflect`\n * @example\n *\n * let tasks = [\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     function(callback) {\n *         // do some more stuff but error ...\n *         callback(new Error('bad stuff happened'));\n *     },\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'two');\n *         }, 100);\n *     }\n * ];\n *\n * async.parallel(async.reflectAll(tasks),\n * // optional callback\n * function(err, results) {\n *     // values\n *     // results[0].value = 'one'\n *     // results[1].error = Error('bad stuff happened')\n *     // results[2].value = 'two'\n * });\n *\n * // an example using an object instead of an array\n * let tasks = {\n *     one: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     two: function(callback) {\n *         callback('two');\n *     },\n *     three: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'three');\n *         }, 100);\n *     }\n * };\n *\n * async.parallel(async.reflectAll(tasks),\n * // optional callback\n * function(err, results) {\n *     // values\n *     // results.one.value = 'one'\n *     // results.two.error = 'two'\n *     // results.three.value = 'three'\n * });\n */\nfunction reflectAll(tasks) {\n    var results;\n    if (isArray(tasks)) {\n        results = arrayMap(tasks, reflect);\n    } else {\n        results = {};\n        baseForOwn(tasks, function(task, key) {\n            results[key] = reflect.call(this, task);\n        });\n    }\n    return results;\n}\n\nfunction reject$1(eachfn, arr, iteratee, callback) {\n    _filter(eachfn, arr, function(value, cb) {\n        iteratee(value, function(err, v) {\n            cb(err, !v);\n        });\n    }, callback);\n}\n\n/**\n * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test.\n *\n * @name reject\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @example\n *\n * async.reject(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, results) {\n *     // results now equals an array of missing files\n *     createFiles(results);\n * });\n */\nvar reject = doParallel(reject$1);\n\n/**\n * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name rejectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reject]{@link module:Collections.reject}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nvar rejectLimit = doParallelLimit(reject$1);\n\n/**\n * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time.\n *\n * @name rejectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reject]{@link module:Collections.reject}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nvar rejectSeries = doLimit(rejectLimit, 1);\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant$1(value) {\n  return function() {\n    return value;\n  };\n}\n\n/**\n * Attempts to get a successful response from `task` no more than `times` times\n * before returning an error. If the task is successful, the `callback` will be\n * passed the result of the successful task. If all attempts fail, the callback\n * will be passed the error and result (if any) of the final attempt.\n *\n * @name retry\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @see [async.retryable]{@link module:ControlFlow.retryable}\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an\n * object with `times` and `interval` or a number.\n * * `times` - The number of attempts to make before giving up.  The default\n *   is `5`.\n * * `interval` - The time to wait between retries, in milliseconds.  The\n *   default is `0`. The interval may also be specified as a function of the\n *   retry count (see example).\n * * `errorFilter` - An optional synchronous function that is invoked on\n *   erroneous result. If it returns `true` the retry attempts will continue;\n *   if the function returns `false` the retry flow is aborted with the current\n *   attempt's error and result being returned to the final callback.\n *   Invoked with (err).\n * * If `opts` is a number, the number specifies the number of times to retry,\n *   with the default interval of `0`.\n * @param {AsyncFunction} task - An async function to retry.\n * Invoked with (callback).\n * @param {Function} [callback] - An optional callback which is called when the\n * task has succeeded, or after the final failed attempt. It receives the `err`\n * and `result` arguments of the last attempt at completing the `task`. Invoked\n * with (err, results).\n *\n * @example\n *\n * // The `retry` function can be used as a stand-alone control flow by passing\n * // a callback, as shown below:\n *\n * // try calling apiMethod 3 times\n * async.retry(3, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod 3 times, waiting 200 ms between each retry\n * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod 10 times with exponential backoff\n * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds)\n * async.retry({\n *   times: 10,\n *   interval: function(retryCount) {\n *     return 50 * Math.pow(2, retryCount);\n *   }\n * }, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod the default 5 times no delay between each retry\n * async.retry(apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod only when error condition satisfies, all other\n * // errors will abort the retry control flow and return to final callback\n * async.retry({\n *   errorFilter: function(err) {\n *     return err.message === 'Temporary error'; // only retry on a specific error\n *   }\n * }, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // to retry individual methods that are not as reliable within other\n * // control flow functions, use the `retryable` wrapper:\n * async.auto({\n *     users: api.getUsers.bind(api),\n *     payments: async.retryable(3, api.getPayments.bind(api))\n * }, function(err, results) {\n *     // do something with the results\n * });\n *\n */\nfunction retry(opts, task, callback) {\n    var DEFAULT_TIMES = 5;\n    var DEFAULT_INTERVAL = 0;\n\n    var options = {\n        times: DEFAULT_TIMES,\n        intervalFunc: constant$1(DEFAULT_INTERVAL)\n    };\n\n    function parseTimes(acc, t) {\n        if (typeof t === 'object') {\n            acc.times = +t.times || DEFAULT_TIMES;\n\n            acc.intervalFunc = typeof t.interval === 'function' ?\n                t.interval :\n                constant$1(+t.interval || DEFAULT_INTERVAL);\n\n            acc.errorFilter = t.errorFilter;\n        } else if (typeof t === 'number' || typeof t === 'string') {\n            acc.times = +t || DEFAULT_TIMES;\n        } else {\n            throw new Error(\"Invalid arguments for async.retry\");\n        }\n    }\n\n    if (arguments.length < 3 && typeof opts === 'function') {\n        callback = task || noop;\n        task = opts;\n    } else {\n        parseTimes(options, opts);\n        callback = callback || noop;\n    }\n\n    if (typeof task !== 'function') {\n        throw new Error(\"Invalid arguments for async.retry\");\n    }\n\n    var _task = wrapAsync(task);\n\n    var attempt = 1;\n    function retryAttempt() {\n        _task(function(err) {\n            if (err && attempt++ < options.times &&\n                (typeof options.errorFilter != 'function' ||\n                    options.errorFilter(err))) {\n                setTimeout(retryAttempt, options.intervalFunc(attempt));\n            } else {\n                callback.apply(null, arguments);\n            }\n        });\n    }\n\n    retryAttempt();\n}\n\n/**\n * A close relative of [`retry`]{@link module:ControlFlow.retry}.  This method\n * wraps a task and makes it retryable, rather than immediately calling it\n * with retries.\n *\n * @name retryable\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.retry]{@link module:ControlFlow.retry}\n * @category Control Flow\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional\n * options, exactly the same as from `retry`\n * @param {AsyncFunction} task - the asynchronous function to wrap.\n * This function will be passed any arguments passed to the returned wrapper.\n * Invoked with (...args, callback).\n * @returns {AsyncFunction} The wrapped function, which when invoked, will\n * retry on an error, based on the parameters specified in `opts`.\n * This function will accept the same parameters as `task`.\n * @example\n *\n * async.auto({\n *     dep1: async.retryable(3, getFromFlakyService),\n *     process: [\"dep1\", async.retryable(3, function (results, cb) {\n *         maybeProcessData(results.dep1, cb);\n *     })]\n * }, callback);\n */\nvar retryable = function (opts, task) {\n    if (!task) {\n        task = opts;\n        opts = null;\n    }\n    var _task = wrapAsync(task);\n    return initialParams(function (args, callback) {\n        function taskFn(cb) {\n            _task.apply(null, args.concat(cb));\n        }\n\n        if (opts) retry(opts, taskFn, callback);\n        else retry(taskFn, callback);\n\n    });\n};\n\n/**\n * Run the functions in the `tasks` collection in series, each one running once\n * the previous function has completed. If any functions in the series pass an\n * error to its callback, no more functions are run, and `callback` is\n * immediately called with the value of the error. Otherwise, `callback`\n * receives an array of results when `tasks` have completed.\n *\n * It is also possible to use an object instead of an array. Each property will\n * be run as a function, and the results will be passed to the final `callback`\n * as an object instead of an array. This can be a more readable way of handling\n *  results from {@link async.series}.\n *\n * **Note** that while many implementations preserve the order of object\n * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)\n * explicitly states that\n *\n * > The mechanics and order of enumerating the properties is not specified.\n *\n * So if you rely on the order in which your series of functions are executed,\n * and want this to work on all platforms, consider using an array.\n *\n * @name series\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection containing\n * [async functions]{@link AsyncFunction} to run in series.\n * Each function can complete with any number of optional `result` values.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed. This function gets a results array (or object)\n * containing all the result arguments passed to the `task` callbacks. Invoked\n * with (err, result).\n * @example\n * async.series([\n *     function(callback) {\n *         // do some stuff ...\n *         callback(null, 'one');\n *     },\n *     function(callback) {\n *         // do some more stuff ...\n *         callback(null, 'two');\n *     }\n * ],\n * // optional callback\n * function(err, results) {\n *     // results is now equal to ['one', 'two']\n * });\n *\n * async.series({\n *     one: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 1);\n *         }, 200);\n *     },\n *     two: function(callback){\n *         setTimeout(function() {\n *             callback(null, 2);\n *         }, 100);\n *     }\n * }, function(err, results) {\n *     // results is now equal to: {one: 1, two: 2}\n * });\n */\nfunction series(tasks, callback) {\n    _parallel(eachOfSeries, tasks, callback);\n}\n\n/**\n * Returns `true` if at least one element in the `coll` satisfies an async test.\n * If any iteratee call returns `true`, the main `callback` is immediately\n * called.\n *\n * @name some\n * @static\n * @memberOf module:Collections\n * @method\n * @alias any\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n * @example\n *\n * async.some(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // if result is true then at least one of the files exists\n * });\n */\nvar some = doParallel(_createTester(Boolean, identity));\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time.\n *\n * @name someLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anyLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n */\nvar someLimit = doParallelLimit(_createTester(Boolean, identity));\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time.\n *\n * @name someSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anySeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in series.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n */\nvar someSeries = doLimit(someLimit, 1);\n\n/**\n * Sorts a list by the results of running each `coll` value through an async\n * `iteratee`.\n *\n * @name sortBy\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a value to use as the sort criteria as\n * its `result`.\n * Invoked with (item, callback).\n * @param {Function} callback - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is the items\n * from the original `coll` sorted by the values returned by the `iteratee`\n * calls. Invoked with (err, results).\n * @example\n *\n * async.sortBy(['file1','file2','file3'], function(file, callback) {\n *     fs.stat(file, function(err, stats) {\n *         callback(err, stats.mtime);\n *     });\n * }, function(err, results) {\n *     // results is now the original array of files sorted by\n *     // modified date\n * });\n *\n * // By modifying the callback parameter the\n * // sorting order can be influenced:\n *\n * // ascending order\n * async.sortBy([1,9,3,5], function(x, callback) {\n *     callback(null, x);\n * }, function(err,result) {\n *     // result callback\n * });\n *\n * // descending order\n * async.sortBy([1,9,3,5], function(x, callback) {\n *     callback(null, x*-1);    //<- x*-1 instead of x, turns the order around\n * }, function(err,result) {\n *     // result callback\n * });\n */\nfunction sortBy (coll, iteratee, callback) {\n    var _iteratee = wrapAsync(iteratee);\n    map(coll, function (x, callback) {\n        _iteratee(x, function (err, criteria) {\n            if (err) return callback(err);\n            callback(null, {value: x, criteria: criteria});\n        });\n    }, function (err, results) {\n        if (err) return callback(err);\n        callback(null, arrayMap(results.sort(comparator), baseProperty('value')));\n    });\n\n    function comparator(left, right) {\n        var a = left.criteria, b = right.criteria;\n        return a < b ? -1 : a > b ? 1 : 0;\n    }\n}\n\n/**\n * Sets a time limit on an asynchronous function. If the function does not call\n * its callback within the specified milliseconds, it will be called with a\n * timeout error. The code property for the error object will be `'ETIMEDOUT'`.\n *\n * @name timeout\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} asyncFn - The async function to limit in time.\n * @param {number} milliseconds - The specified time limit.\n * @param {*} [info] - Any variable you want attached (`string`, `object`, etc)\n * to timeout Error for more information..\n * @returns {AsyncFunction} Returns a wrapped function that can be used with any\n * of the control flow functions.\n * Invoke this function with the same parameters as you would `asyncFunc`.\n * @example\n *\n * function myFunction(foo, callback) {\n *     doAsyncTask(foo, function(err, data) {\n *         // handle errors\n *         if (err) return callback(err);\n *\n *         // do some stuff ...\n *\n *         // return processed data\n *         return callback(null, data);\n *     });\n * }\n *\n * var wrapped = async.timeout(myFunction, 1000);\n *\n * // call `wrapped` as you would `myFunction`\n * wrapped({ bar: 'bar' }, function(err, data) {\n *     // if `myFunction` takes < 1000 ms to execute, `err`\n *     // and `data` will have their expected values\n *\n *     // else `err` will be an Error with the code 'ETIMEDOUT'\n * });\n */\nfunction timeout(asyncFn, milliseconds, info) {\n    var fn = wrapAsync(asyncFn);\n\n    return initialParams(function (args, callback) {\n        var timedOut = false;\n        var timer;\n\n        function timeoutCallback() {\n            var name = asyncFn.name || 'anonymous';\n            var error  = new Error('Callback function \"' + name + '\" timed out.');\n            error.code = 'ETIMEDOUT';\n            if (info) {\n                error.info = info;\n            }\n            timedOut = true;\n            callback(error);\n        }\n\n        args.push(function () {\n            if (!timedOut) {\n                callback.apply(null, arguments);\n                clearTimeout(timer);\n            }\n        });\n\n        // setup timer and call original function\n        timer = setTimeout(timeoutCallback, milliseconds);\n        fn.apply(null, args);\n    });\n}\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil;\nvar nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n  var index = -1,\n      length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n      result = Array(length);\n\n  while (length--) {\n    result[fromRight ? length : ++index] = start;\n    start += step;\n  }\n  return result;\n}\n\n/**\n * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name timesLimit\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.times]{@link module:ControlFlow.times}\n * @category Control Flow\n * @param {number} count - The number of times to run the function.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see [async.map]{@link module:Collections.map}.\n */\nfunction timeLimit(count, limit, iteratee, callback) {\n    var _iteratee = wrapAsync(iteratee);\n    mapLimit(baseRange(0, count, 1), limit, _iteratee, callback);\n}\n\n/**\n * Calls the `iteratee` function `n` times, and accumulates results in the same\n * manner you would use with [map]{@link module:Collections.map}.\n *\n * @name times\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Control Flow\n * @param {number} n - The number of times to run the function.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see {@link module:Collections.map}.\n * @example\n *\n * // Pretend this is some complicated async factory\n * var createUser = function(id, callback) {\n *     callback(null, {\n *         id: 'user' + id\n *     });\n * };\n *\n * // generate 5 users\n * async.times(5, function(n, next) {\n *     createUser(n, function(err, user) {\n *         next(err, user);\n *     });\n * }, function(err, users) {\n *     // we should now have 5 users\n * });\n */\nvar times = doLimit(timeLimit, Infinity);\n\n/**\n * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time.\n *\n * @name timesSeries\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.times]{@link module:ControlFlow.times}\n * @category Control Flow\n * @param {number} n - The number of times to run the function.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see {@link module:Collections.map}.\n */\nvar timesSeries = doLimit(timeLimit, 1);\n\n/**\n * A relative of `reduce`.  Takes an Object or Array, and iterates over each\n * element in series, each step potentially mutating an `accumulator` value.\n * The type of the accumulator defaults to the type of collection passed in.\n *\n * @name transform\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {*} [accumulator] - The initial state of the transform.  If omitted,\n * it will default to an empty Object or Array, depending on the type of `coll`\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * collection that potentially modifies the accumulator.\n * Invoked with (accumulator, item, key, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the transformed accumulator.\n * Invoked with (err, result).\n * @example\n *\n * async.transform([1,2,3], function(acc, item, index, callback) {\n *     // pointless async:\n *     process.nextTick(function() {\n *         acc.push(item * 2)\n *         callback(null)\n *     });\n * }, function(err, result) {\n *     // result is now equal to [2, 4, 6]\n * });\n *\n * @example\n *\n * async.transform({a: 1, b: 2, c: 3}, function (obj, val, key, callback) {\n *     setImmediate(function () {\n *         obj[key] = val * 2;\n *         callback();\n *     })\n * }, function (err, result) {\n *     // result is equal to {a: 2, b: 4, c: 6}\n * })\n */\nfunction transform (coll, accumulator, iteratee, callback) {\n    if (arguments.length <= 3) {\n        callback = iteratee;\n        iteratee = accumulator;\n        accumulator = isArray(coll) ? [] : {};\n    }\n    callback = once(callback || noop);\n    var _iteratee = wrapAsync(iteratee);\n\n    eachOf(coll, function(v, k, cb) {\n        _iteratee(accumulator, v, k, cb);\n    }, function(err) {\n        callback(err, accumulator);\n    });\n}\n\n/**\n * It runs each task in series but stops whenever any of the functions were\n * successful. If one of the tasks were successful, the `callback` will be\n * passed the result of the successful task. If all tasks fail, the callback\n * will be passed the error and result (if any) of the final attempt.\n *\n * @name tryEach\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection containing functions to\n * run, each function is passed a `callback(err, result)` it must call on\n * completion with an error `err` (which can be `null`) and an optional `result`\n * value.\n * @param {Function} [callback] - An optional callback which is called when one\n * of the tasks has succeeded, or all have failed. It receives the `err` and\n * `result` arguments of the last attempt at completing the `task`. Invoked with\n * (err, results).\n * @example\n * async.tryEach([\n *     function getDataFromFirstWebsite(callback) {\n *         // Try getting the data from the first website\n *         callback(err, data);\n *     },\n *     function getDataFromSecondWebsite(callback) {\n *         // First website failed,\n *         // Try getting the data from the backup website\n *         callback(err, data);\n *     }\n * ],\n * // optional callback\n * function(err, results) {\n *     Now do something with the data.\n * });\n *\n */\nfunction tryEach(tasks, callback) {\n    var error = null;\n    var result;\n    callback = callback || noop;\n    eachSeries(tasks, function(task, callback) {\n        wrapAsync(task)(function (err, res/*, ...args*/) {\n            if (arguments.length > 2) {\n                result = slice(arguments, 1);\n            } else {\n                result = res;\n            }\n            error = err;\n            callback(!err);\n        });\n    }, function () {\n        callback(error, result);\n    });\n}\n\n/**\n * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original,\n * unmemoized form. Handy for testing.\n *\n * @name unmemoize\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.memoize]{@link module:Utils.memoize}\n * @category Util\n * @param {AsyncFunction} fn - the memoized function\n * @returns {AsyncFunction} a function that calls the original unmemoized function\n */\nfunction unmemoize(fn) {\n    return function () {\n        return (fn.unmemoized || fn).apply(null, arguments);\n    };\n}\n\n/**\n * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when\n * stopped, or an error occurs.\n *\n * @name whilst\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Function} test - synchronous truth test to perform before each\n * execution of `iteratee`. Invoked with ().\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n * @returns undefined\n * @example\n *\n * var count = 0;\n * async.whilst(\n *     function() { return count < 5; },\n *     function(callback) {\n *         count++;\n *         setTimeout(function() {\n *             callback(null, count);\n *         }, 1000);\n *     },\n *     function (err, n) {\n *         // 5 seconds have passed, n = 5\n *     }\n * );\n */\nfunction whilst(test, iteratee, callback) {\n    callback = onlyOnce(callback || noop);\n    var _iteratee = wrapAsync(iteratee);\n    if (!test()) return callback(null);\n    var next = function(err/*, ...args*/) {\n        if (err) return callback(err);\n        if (test()) return _iteratee(next);\n        var args = slice(arguments, 1);\n        callback.apply(null, [null].concat(args));\n    };\n    _iteratee(next);\n}\n\n/**\n * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when\n * stopped, or an error occurs. `callback` will be passed an error and any\n * arguments passed to the final `iteratee`'s callback.\n *\n * The inverse of [whilst]{@link module:ControlFlow.whilst}.\n *\n * @name until\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {Function} test - synchronous truth test to perform before each\n * execution of `iteratee`. Invoked with ().\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` fails. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has passed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n */\nfunction until(test, iteratee, callback) {\n    whilst(function() {\n        return !test.apply(this, arguments);\n    }, iteratee, callback);\n}\n\n/**\n * Runs the `tasks` array of functions in series, each passing their results to\n * the next in the array. However, if any of the `tasks` pass an error to their\n * own callback, the next function is not executed, and the main `callback` is\n * immediately called with the error.\n *\n * @name waterfall\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array} tasks - An array of [async functions]{@link AsyncFunction}\n * to run.\n * Each function should complete with any number of `result` values.\n * The `result` values will be passed as arguments, in order, to the next task.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed. This will be passed the results of the last task's\n * callback. Invoked with (err, [results]).\n * @returns undefined\n * @example\n *\n * async.waterfall([\n *     function(callback) {\n *         callback(null, 'one', 'two');\n *     },\n *     function(arg1, arg2, callback) {\n *         // arg1 now equals 'one' and arg2 now equals 'two'\n *         callback(null, 'three');\n *     },\n *     function(arg1, callback) {\n *         // arg1 now equals 'three'\n *         callback(null, 'done');\n *     }\n * ], function (err, result) {\n *     // result now equals 'done'\n * });\n *\n * // Or, with named functions:\n * async.waterfall([\n *     myFirstFunction,\n *     mySecondFunction,\n *     myLastFunction,\n * ], function (err, result) {\n *     // result now equals 'done'\n * });\n * function myFirstFunction(callback) {\n *     callback(null, 'one', 'two');\n * }\n * function mySecondFunction(arg1, arg2, callback) {\n *     // arg1 now equals 'one' and arg2 now equals 'two'\n *     callback(null, 'three');\n * }\n * function myLastFunction(arg1, callback) {\n *     // arg1 now equals 'three'\n *     callback(null, 'done');\n * }\n */\nvar waterfall = function(tasks, callback) {\n    callback = once(callback || noop);\n    if (!isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));\n    if (!tasks.length) return callback();\n    var taskIndex = 0;\n\n    function nextTask(args) {\n        var task = wrapAsync(tasks[taskIndex++]);\n        args.push(onlyOnce(next));\n        task.apply(null, args);\n    }\n\n    function next(err/*, ...args*/) {\n        if (err || taskIndex === tasks.length) {\n            return callback.apply(null, arguments);\n        }\n        nextTask(slice(arguments, 1));\n    }\n\n    nextTask([]);\n};\n\n/**\n * An \"async function\" in the context of Async is an asynchronous function with\n * a variable number of parameters, with the final parameter being a callback.\n * (`function (arg1, arg2, ..., callback) {}`)\n * The final callback is of the form `callback(err, results...)`, which must be\n * called once the function is completed.  The callback should be called with a\n * Error as its first argument to signal that an error occurred.\n * Otherwise, if no error occurred, it should be called with `null` as the first\n * argument, and any additional `result` arguments that may apply, to signal\n * successful completion.\n * The callback must be called exactly once, ideally on a later tick of the\n * JavaScript event loop.\n *\n * This type of function is also referred to as a \"Node-style async function\",\n * or a \"continuation passing-style function\" (CPS). Most of the methods of this\n * library are themselves CPS/Node-style async functions, or functions that\n * return CPS/Node-style async functions.\n *\n * Wherever we accept a Node-style async function, we also directly accept an\n * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}.\n * In this case, the `async` function will not be passed a final callback\n * argument, and any thrown error will be used as the `err` argument of the\n * implicit callback, and the return value will be used as the `result` value.\n * (i.e. a `rejected` of the returned Promise becomes the `err` callback\n * argument, and a `resolved` value becomes the `result`.)\n *\n * Note, due to JavaScript limitations, we can only detect native `async`\n * functions and not transpilied implementations.\n * Your environment must have `async`/`await` support for this to work.\n * (e.g. Node > v7.6, or a recent version of a modern browser).\n * If you are using `async` functions through a transpiler (e.g. Babel), you\n * must still wrap the function with [asyncify]{@link module:Utils.asyncify},\n * because the `async function` will be compiled to an ordinary function that\n * returns a promise.\n *\n * @typedef {Function} AsyncFunction\n * @static\n */\n\n/**\n * Async is a utility module which provides straight-forward, powerful functions\n * for working with asynchronous JavaScript. Although originally designed for\n * use with [Node.js](http://nodejs.org) and installable via\n * `npm install --save async`, it can also be used directly in the browser.\n * @module async\n * @see AsyncFunction\n */\n\n\n/**\n * A collection of `async` functions for manipulating collections, such as\n * arrays and objects.\n * @module Collections\n */\n\n/**\n * A collection of `async` functions for controlling the flow through a script.\n * @module ControlFlow\n */\n\n/**\n * A collection of `async` utility functions.\n * @module Utils\n */\n\nvar index = {\n    apply: apply,\n    applyEach: applyEach,\n    applyEachSeries: applyEachSeries,\n    asyncify: asyncify,\n    auto: auto,\n    autoInject: autoInject,\n    cargo: cargo,\n    compose: compose,\n    concat: concat,\n    concatLimit: concatLimit,\n    concatSeries: concatSeries,\n    constant: constant,\n    detect: detect,\n    detectLimit: detectLimit,\n    detectSeries: detectSeries,\n    dir: dir,\n    doDuring: doDuring,\n    doUntil: doUntil,\n    doWhilst: doWhilst,\n    during: during,\n    each: eachLimit,\n    eachLimit: eachLimit$1,\n    eachOf: eachOf,\n    eachOfLimit: eachOfLimit,\n    eachOfSeries: eachOfSeries,\n    eachSeries: eachSeries,\n    ensureAsync: ensureAsync,\n    every: every,\n    everyLimit: everyLimit,\n    everySeries: everySeries,\n    filter: filter,\n    filterLimit: filterLimit,\n    filterSeries: filterSeries,\n    forever: forever,\n    groupBy: groupBy,\n    groupByLimit: groupByLimit,\n    groupBySeries: groupBySeries,\n    log: log,\n    map: map,\n    mapLimit: mapLimit,\n    mapSeries: mapSeries,\n    mapValues: mapValues,\n    mapValuesLimit: mapValuesLimit,\n    mapValuesSeries: mapValuesSeries,\n    memoize: memoize,\n    nextTick: nextTick,\n    parallel: parallelLimit,\n    parallelLimit: parallelLimit$1,\n    priorityQueue: priorityQueue,\n    queue: queue$1,\n    race: race,\n    reduce: reduce,\n    reduceRight: reduceRight,\n    reflect: reflect,\n    reflectAll: reflectAll,\n    reject: reject,\n    rejectLimit: rejectLimit,\n    rejectSeries: rejectSeries,\n    retry: retry,\n    retryable: retryable,\n    seq: seq,\n    series: series,\n    setImmediate: setImmediate$1,\n    some: some,\n    someLimit: someLimit,\n    someSeries: someSeries,\n    sortBy: sortBy,\n    timeout: timeout,\n    times: times,\n    timesLimit: timeLimit,\n    timesSeries: timesSeries,\n    transform: transform,\n    tryEach: tryEach,\n    unmemoize: unmemoize,\n    until: until,\n    waterfall: waterfall,\n    whilst: whilst,\n\n    // aliases\n    all: every,\n    allLimit: everyLimit,\n    allSeries: everySeries,\n    any: some,\n    anyLimit: someLimit,\n    anySeries: someSeries,\n    find: detect,\n    findLimit: detectLimit,\n    findSeries: detectSeries,\n    forEach: eachLimit,\n    forEachSeries: eachSeries,\n    forEachLimit: eachLimit$1,\n    forEachOf: eachOf,\n    forEachOfSeries: eachOfSeries,\n    forEachOfLimit: eachOfLimit,\n    inject: reduce,\n    foldl: reduce,\n    foldr: reduceRight,\n    select: filter,\n    selectLimit: filterLimit,\n    selectSeries: filterSeries,\n    wrapSync: asyncify\n};\n\nexports['default'] = index;\nexports.apply = apply;\nexports.applyEach = applyEach;\nexports.applyEachSeries = applyEachSeries;\nexports.asyncify = asyncify;\nexports.auto = auto;\nexports.autoInject = autoInject;\nexports.cargo = cargo;\nexports.compose = compose;\nexports.concat = concat;\nexports.concatLimit = concatLimit;\nexports.concatSeries = concatSeries;\nexports.constant = constant;\nexports.detect = detect;\nexports.detectLimit = detectLimit;\nexports.detectSeries = detectSeries;\nexports.dir = dir;\nexports.doDuring = doDuring;\nexports.doUntil = doUntil;\nexports.doWhilst = doWhilst;\nexports.during = during;\nexports.each = eachLimit;\nexports.eachLimit = eachLimit$1;\nexports.eachOf = eachOf;\nexports.eachOfLimit = eachOfLimit;\nexports.eachOfSeries = eachOfSeries;\nexports.eachSeries = eachSeries;\nexports.ensureAsync = ensureAsync;\nexports.every = every;\nexports.everyLimit = everyLimit;\nexports.everySeries = everySeries;\nexports.filter = filter;\nexports.filterLimit = filterLimit;\nexports.filterSeries = filterSeries;\nexports.forever = forever;\nexports.groupBy = groupBy;\nexports.groupByLimit = groupByLimit;\nexports.groupBySeries = groupBySeries;\nexports.log = log;\nexports.map = map;\nexports.mapLimit = mapLimit;\nexports.mapSeries = mapSeries;\nexports.mapValues = mapValues;\nexports.mapValuesLimit = mapValuesLimit;\nexports.mapValuesSeries = mapValuesSeries;\nexports.memoize = memoize;\nexports.nextTick = nextTick;\nexports.parallel = parallelLimit;\nexports.parallelLimit = parallelLimit$1;\nexports.priorityQueue = priorityQueue;\nexports.queue = queue$1;\nexports.race = race;\nexports.reduce = reduce;\nexports.reduceRight = reduceRight;\nexports.reflect = reflect;\nexports.reflectAll = reflectAll;\nexports.reject = reject;\nexports.rejectLimit = rejectLimit;\nexports.rejectSeries = rejectSeries;\nexports.retry = retry;\nexports.retryable = retryable;\nexports.seq = seq;\nexports.series = series;\nexports.setImmediate = setImmediate$1;\nexports.some = some;\nexports.someLimit = someLimit;\nexports.someSeries = someSeries;\nexports.sortBy = sortBy;\nexports.timeout = timeout;\nexports.times = times;\nexports.timesLimit = timeLimit;\nexports.timesSeries = timesSeries;\nexports.transform = transform;\nexports.tryEach = tryEach;\nexports.unmemoize = unmemoize;\nexports.until = until;\nexports.waterfall = waterfall;\nexports.whilst = whilst;\nexports.all = every;\nexports.allLimit = everyLimit;\nexports.allSeries = everySeries;\nexports.any = some;\nexports.anyLimit = someLimit;\nexports.anySeries = someSeries;\nexports.find = detect;\nexports.findLimit = detectLimit;\nexports.findSeries = detectSeries;\nexports.forEach = eachLimit;\nexports.forEachSeries = eachSeries;\nexports.forEachLimit = eachLimit$1;\nexports.forEachOf = eachOf;\nexports.forEachOfSeries = eachOfSeries;\nexports.forEachOfLimit = eachOfLimit;\nexports.inject = reduce;\nexports.foldl = reduce;\nexports.foldr = reduceRight;\nexports.select = filter;\nexports.selectLimit = filterLimit;\nexports.selectSeries = filterSeries;\nexports.wrapSync = asyncify;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/dist/async.min.js",
    "content": "!function(n,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t(n.async=n.async||{})}(this,function(n){\"use strict\";function t(n,t){t|=0;for(var e=Math.max(n.length-t,0),r=Array(e),u=0;u<e;u++)r[u]=n[t+u];return r}function e(n){var t=typeof n;return null!=n&&(\"object\"==t||\"function\"==t)}function r(n){setTimeout(n,0)}function u(n){return function(e){var r=t(arguments,1);n(function(){e.apply(null,r)})}}function i(n){return ct(function(t,r){var u;try{u=n.apply(this,t)}catch(n){return r(n)}e(u)&&\"function\"==typeof u.then?u.then(function(n){o(r,null,n)},function(n){o(r,n.message?n:new Error(n))}):r(null,u)})}function o(n,t,e){try{n(t,e)}catch(n){lt(c,n)}}function c(n){throw n}function f(n){return st&&\"AsyncFunction\"===n[Symbol.toStringTag]}function a(n){return f(n)?i(n):n}function l(n){return function(e){var r=t(arguments,1),u=ct(function(t,r){var u=this;return n(e,function(n,e){a(n).apply(u,t.concat(e))},r)});return r.length?u.apply(this,r):u}}function s(n){var t=mt.call(n,bt),e=n[bt];try{n[bt]=void 0;var r=!0}catch(n){}var u=gt.call(n);return r&&(t?n[bt]=e:delete n[bt]),u}function p(n){return St.call(n)}function h(n){return null==n?void 0===n?Lt:kt:Ot&&Ot in Object(n)?s(n):p(n)}function y(n){if(!e(n))return!1;var t=h(n);return t==xt||t==Et||t==wt||t==At}function v(n){return\"number\"==typeof n&&n>-1&&n%1==0&&n<=Tt}function d(n){return null!=n&&v(n.length)&&!y(n)}function m(){}function g(n){return function(){if(null!==n){var t=n;n=null,t.apply(this,arguments)}}}function b(n,t){for(var e=-1,r=Array(n);++e<n;)r[e]=t(e);return r}function j(n){return null!=n&&\"object\"==typeof n}function S(n){return j(n)&&h(n)==It}function k(){return!1}function L(n,t){var e=typeof n;return t=null==t?Nt:t,!!t&&(\"number\"==e||\"symbol\"!=e&&Qt.test(n))&&n>-1&&n%1==0&&n<t}function O(n){return j(n)&&v(n.length)&&!!me[h(n)]}function w(n){return function(t){return n(t)}}function x(n,t){var e=Pt(n),r=!e&&zt(n),u=!e&&!r&&Wt(n),i=!e&&!r&&!u&&Oe(n),o=e||r||u||i,c=o?b(n.length,String):[],f=c.length;for(var a in n)!t&&!xe.call(n,a)||o&&(\"length\"==a||u&&(\"offset\"==a||\"parent\"==a)||i&&(\"buffer\"==a||\"byteLength\"==a||\"byteOffset\"==a)||L(a,f))||c.push(a);return c}function E(n){var t=n&&n.constructor,e=\"function\"==typeof t&&t.prototype||Ee;return n===e}function A(n,t){return function(e){return n(t(e))}}function T(n){if(!E(n))return Ae(n);var t=[];for(var e in Object(n))_e.call(n,e)&&\"constructor\"!=e&&t.push(e);return t}function _(n){return d(n)?x(n):T(n)}function B(n){var t=-1,e=n.length;return function(){return++t<e?{value:n[t],key:t}:null}}function F(n){var t=-1;return function(){var e=n.next();return e.done?null:(t++,{value:e.value,key:t})}}function I(n){var t=_(n),e=-1,r=t.length;return function u(){var i=t[++e];return\"__proto__\"===i?u():e<r?{value:n[i],key:i}:null}}function M(n){if(d(n))return B(n);var t=Ft(n);return t?F(t):I(n)}function U(n){return function(){if(null===n)throw new Error(\"Callback was already called.\");var t=n;n=null,t.apply(this,arguments)}}function q(n){return function(t,e,r){function u(n,t){if(f-=1,n)c=!0,r(n);else{if(t===_t||c&&f<=0)return c=!0,r(null);a||i()}}function i(){for(a=!0;f<n&&!c;){var t=o();if(null===t)return c=!0,void(f<=0&&r(null));f+=1,e(t.value,t.key,U(u))}a=!1}if(r=g(r||m),n<=0||!t)return r(null);var o=M(t),c=!1,f=0,a=!1;i()}}function z(n,t,e,r){q(t)(n,a(e),r)}function P(n,t){return function(e,r,u){return n(e,t,r,u)}}function V(n,t,e){function r(n,t){n?e(n):++i!==o&&t!==_t||e(null)}e=g(e||m);var u=0,i=0,o=n.length;for(0===o&&e(null);u<o;u++)t(n[u],u,U(r))}function D(n){return function(t,e,r){return n(Fe,t,a(e),r)}}function R(n,t,e,r){r=r||m,t=t||[];var u=[],i=0,o=a(e);n(t,function(n,t,e){var r=i++;o(n,function(n,t){u[r]=t,e(n)})},function(n){r(n,u)})}function C(n){return function(t,e,r,u){return n(q(e),t,a(r),u)}}function $(n,t){for(var e=-1,r=null==n?0:n.length;++e<r&&t(n[e],e,n)!==!1;);return n}function W(n){return function(t,e,r){for(var u=-1,i=Object(t),o=r(t),c=o.length;c--;){var f=o[n?c:++u];if(e(i[f],f,i)===!1)break}return t}}function N(n,t){return n&&Pe(n,t,_)}function Q(n,t,e,r){for(var u=n.length,i=e+(r?1:-1);r?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function G(n){return n!==n}function H(n,t,e){for(var r=e-1,u=n.length;++r<u;)if(n[r]===t)return r;return-1}function J(n,t,e){return t===t?H(n,t,e):Q(n,G,e)}function K(n,t){for(var e=-1,r=null==n?0:n.length,u=Array(r);++e<r;)u[e]=t(n[e],e,n);return u}function X(n){return\"symbol\"==typeof n||j(n)&&h(n)==De}function Y(n){if(\"string\"==typeof n)return n;if(Pt(n))return K(n,Y)+\"\";if(X(n))return $e?$e.call(n):\"\";var t=n+\"\";return\"0\"==t&&1/n==-Re?\"-0\":t}function Z(n,t,e){var r=-1,u=n.length;t<0&&(t=-t>u?0:u+t),e=e>u?u:e,e<0&&(e+=u),u=t>e?0:e-t>>>0,t>>>=0;for(var i=Array(u);++r<u;)i[r]=n[r+t];return i}function nn(n,t,e){var r=n.length;return e=void 0===e?r:e,!t&&e>=r?n:Z(n,t,e)}function tn(n,t){for(var e=n.length;e--&&J(t,n[e],0)>-1;);return e}function en(n,t){for(var e=-1,r=n.length;++e<r&&J(t,n[e],0)>-1;);return e}function rn(n){return n.split(\"\")}function un(n){return Xe.test(n)}function on(n){return n.match(mr)||[]}function cn(n){return un(n)?on(n):rn(n)}function fn(n){return null==n?\"\":Y(n)}function an(n,t,e){if(n=fn(n),n&&(e||void 0===t))return n.replace(gr,\"\");if(!n||!(t=Y(t)))return n;var r=cn(n),u=cn(t),i=en(r,u),o=tn(r,u)+1;return nn(r,i,o).join(\"\")}function ln(n){return n=n.toString().replace(kr,\"\"),n=n.match(br)[2].replace(\" \",\"\"),n=n?n.split(jr):[],n=n.map(function(n){return an(n.replace(Sr,\"\"))})}function sn(n,t){var e={};N(n,function(n,t){function r(t,e){var r=K(u,function(n){return t[n]});r.push(e),a(n).apply(null,r)}var u,i=f(n),o=!i&&1===n.length||i&&0===n.length;if(Pt(n))u=n.slice(0,-1),n=n[n.length-1],e[t]=u.concat(u.length>0?r:n);else if(o)e[t]=n;else{if(u=ln(n),0===n.length&&!i&&0===u.length)throw new Error(\"autoInject task functions require explicit parameters.\");i||u.pop(),e[t]=u.concat(r)}}),Ve(e,t)}function pn(){this.head=this.tail=null,this.length=0}function hn(n,t){n.length=1,n.head=n.tail=t}function yn(n,t,e){function r(n,t,e){if(null!=e&&\"function\"!=typeof e)throw new Error(\"task callback must be a function\");if(s.started=!0,Pt(n)||(n=[n]),0===n.length&&s.idle())return lt(function(){s.drain()});for(var r=0,u=n.length;r<u;r++){var i={data:n[r],callback:e||m};t?s._tasks.unshift(i):s._tasks.push(i)}f||(f=!0,lt(function(){f=!1,s.process()}))}function u(n){return function(t){o-=1;for(var e=0,r=n.length;e<r;e++){var u=n[e],i=J(c,u,0);0===i?c.shift():i>0&&c.splice(i,1),u.callback.apply(u,arguments),null!=t&&s.error(t,u.data)}o<=s.concurrency-s.buffer&&s.unsaturated(),s.idle()&&s.drain(),s.process()}}if(null==t)t=1;else if(0===t)throw new Error(\"Concurrency must not be zero\");var i=a(n),o=0,c=[],f=!1,l=!1,s={_tasks:new pn,concurrency:t,payload:e,saturated:m,unsaturated:m,buffer:t/4,empty:m,drain:m,error:m,started:!1,paused:!1,push:function(n,t){r(n,!1,t)},kill:function(){s.drain=m,s._tasks.empty()},unshift:function(n,t){r(n,!0,t)},remove:function(n){s._tasks.remove(n)},process:function(){if(!l){for(l=!0;!s.paused&&o<s.concurrency&&s._tasks.length;){var n=[],t=[],e=s._tasks.length;s.payload&&(e=Math.min(e,s.payload));for(var r=0;r<e;r++){var f=s._tasks.shift();n.push(f),c.push(f),t.push(f.data)}o+=1,0===s._tasks.length&&s.empty(),o===s.concurrency&&s.saturated();var a=U(u(n));i(t,a)}l=!1}},length:function(){return s._tasks.length},running:function(){return o},workersList:function(){return c},idle:function(){return s._tasks.length+o===0},pause:function(){s.paused=!0},resume:function(){s.paused!==!1&&(s.paused=!1,lt(s.process))}};return s}function vn(n,t){return yn(n,1,t)}function dn(n,t,e,r){r=g(r||m);var u=a(e);Or(n,function(n,e,r){u(t,n,function(n,e){t=e,r(n)})},function(n){r(n,t)})}function mn(){var n=K(arguments,a);return function(){var e=t(arguments),r=this,u=e[e.length-1];\"function\"==typeof u?e.pop():u=m,dn(n,e,function(n,e,u){e.apply(r,n.concat(function(n){var e=t(arguments,1);u(n,e)}))},function(n,t){u.apply(r,[n].concat(t))})}}function gn(n){return n}function bn(n,t){return function(e,r,u,i){i=i||m;var o,c=!1;e(r,function(e,r,i){u(e,function(r,u){r?i(r):n(u)&&!o?(c=!0,o=t(!0,e),i(null,_t)):i()})},function(n){n?i(n):i(null,c?o:t(!1))})}}function jn(n,t){return t}function Sn(n){return function(e){var r=t(arguments,1);r.push(function(e){var r=t(arguments,1);\"object\"==typeof console&&(e?console.error&&console.error(e):console[n]&&$(r,function(t){console[n](t)}))}),a(e).apply(null,r)}}function kn(n,e,r){function u(n){if(n)return r(n);var e=t(arguments,1);e.push(i),c.apply(this,e)}function i(n,t){return n?r(n):t?void o(u):r(null)}r=U(r||m);var o=a(n),c=a(e);i(null,!0)}function Ln(n,e,r){r=U(r||m);var u=a(n),i=function(n){if(n)return r(n);var o=t(arguments,1);return e.apply(this,o)?u(i):void r.apply(null,[null].concat(o))};u(i)}function On(n,t,e){Ln(n,function(){return!t.apply(this,arguments)},e)}function wn(n,t,e){function r(n){return n?e(n):void o(u)}function u(n,t){return n?e(n):t?void i(r):e(null)}e=U(e||m);var i=a(t),o=a(n);o(u)}function xn(n){return function(t,e,r){return n(t,r)}}function En(n,t,e){Fe(n,xn(a(t)),e)}function An(n,t,e,r){q(t)(n,xn(a(e)),r)}function Tn(n){return f(n)?n:ct(function(t,e){var r=!0;t.push(function(){var n=arguments;r?lt(function(){e.apply(null,n)}):e.apply(null,n)}),n.apply(this,t),r=!1})}function _n(n){return!n}function Bn(n){return function(t){return null==t?void 0:t[n]}}function Fn(n,t,e,r){var u=new Array(t.length);n(t,function(n,t,r){e(n,function(n,e){u[t]=!!e,r(n)})},function(n){if(n)return r(n);for(var e=[],i=0;i<t.length;i++)u[i]&&e.push(t[i]);r(null,e)})}function In(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(e,i){e?r(e):(i&&u.push({index:t,value:n}),r())})},function(n){n?r(n):r(null,K(u.sort(function(n,t){return n.index-t.index}),Bn(\"value\")))})}function Mn(n,t,e,r){var u=d(t)?Fn:In;u(n,t,a(e),r||m)}function Un(n,t){function e(n){return n?r(n):void u(e)}var r=U(t||m),u=a(Tn(n));e()}function qn(n,t,e,r){r=g(r||m);var u={},i=a(e);z(n,t,function(n,t,e){i(n,t,function(n,r){return n?e(n):(u[t]=r,void e())})},function(n){r(n,u)})}function zn(n,t){return t in n}function Pn(n,e){var r=Object.create(null),u=Object.create(null);e=e||gn;var i=a(n),o=ct(function(n,o){var c=e.apply(null,n);zn(r,c)?lt(function(){o.apply(null,r[c])}):zn(u,c)?u[c].push(o):(u[c]=[o],i.apply(null,n.concat(function(){var n=t(arguments);r[c]=n;var e=u[c];delete u[c];for(var i=0,o=e.length;i<o;i++)e[i].apply(null,n)})))});return o.memo=r,o.unmemoized=n,o}function Vn(n,e,r){r=r||m;var u=d(e)?[]:{};n(e,function(n,e,r){a(n)(function(n,i){arguments.length>2&&(i=t(arguments,1)),u[e]=i,r(n)})},function(n){r(n,u)})}function Dn(n,t){Vn(Fe,n,t)}function Rn(n,t,e){Vn(q(t),n,e)}function Cn(n,t){if(t=g(t||m),!Pt(n))return t(new TypeError(\"First argument to race must be an array of functions\"));if(!n.length)return t();for(var e=0,r=n.length;e<r;e++)a(n[e])(t)}function $n(n,e,r,u){var i=t(n).reverse();dn(i,e,r,u)}function Wn(n){var e=a(n);return ct(function(n,r){return n.push(function(n,e){if(n)r(null,{error:n});else{var u;u=arguments.length<=2?e:t(arguments,1),r(null,{value:u})}}),e.apply(this,n)})}function Nn(n){var t;return Pt(n)?t=K(n,Wn):(t={},N(n,function(n,e){t[e]=Wn.call(this,n)})),t}function Qn(n,t,e,r){Mn(n,t,function(n,t){e(n,function(n,e){t(n,!e)})},r)}function Gn(n){return function(){return n}}function Hn(n,t,e){function r(n,t){if(\"object\"==typeof t)n.times=+t.times||i,n.intervalFunc=\"function\"==typeof t.interval?t.interval:Gn(+t.interval||o),n.errorFilter=t.errorFilter;else{if(\"number\"!=typeof t&&\"string\"!=typeof t)throw new Error(\"Invalid arguments for async.retry\");n.times=+t||i}}function u(){f(function(n){n&&l++<c.times&&(\"function\"!=typeof c.errorFilter||c.errorFilter(n))?setTimeout(u,c.intervalFunc(l)):e.apply(null,arguments)})}var i=5,o=0,c={times:i,intervalFunc:Gn(o)};if(arguments.length<3&&\"function\"==typeof n?(e=t||m,t=n):(r(c,n),e=e||m),\"function\"!=typeof t)throw new Error(\"Invalid arguments for async.retry\");var f=a(t),l=1;u()}function Jn(n,t){Vn(Or,n,t)}function Kn(n,t,e){function r(n,t){var e=n.criteria,r=t.criteria;return e<r?-1:e>r?1:0}var u=a(t);Ie(n,function(n,t){u(n,function(e,r){return e?t(e):void t(null,{value:n,criteria:r})})},function(n,t){return n?e(n):void e(null,K(t.sort(r),Bn(\"value\")))})}function Xn(n,t,e){var r=a(n);return ct(function(u,i){function o(){var t=n.name||\"anonymous\",r=new Error('Callback function \"'+t+'\" timed out.');r.code=\"ETIMEDOUT\",e&&(r.info=e),f=!0,i(r)}var c,f=!1;u.push(function(){f||(i.apply(null,arguments),clearTimeout(c))}),c=setTimeout(o,t),r.apply(null,u)})}function Yn(n,t,e,r){for(var u=-1,i=iu(uu((t-n)/(e||1)),0),o=Array(i);i--;)o[r?i:++u]=n,n+=e;return o}function Zn(n,t,e,r){var u=a(e);Ue(Yn(0,n,1),t,u,r)}function nt(n,t,e,r){arguments.length<=3&&(r=e,e=t,t=Pt(n)?[]:{}),r=g(r||m);var u=a(e);Fe(n,function(n,e,r){u(t,n,e,r)},function(n){r(n,t)})}function tt(n,e){var r,u=null;e=e||m,Ur(n,function(n,e){a(n)(function(n,i){r=arguments.length>2?t(arguments,1):i,u=n,e(!n)})},function(){e(u,r)})}function et(n){return function(){return(n.unmemoized||n).apply(null,arguments)}}function rt(n,e,r){r=U(r||m);var u=a(e);if(!n())return r(null);var i=function(e){if(e)return r(e);if(n())return u(i);var o=t(arguments,1);r.apply(null,[null].concat(o))};u(i)}function ut(n,t,e){rt(function(){return!n.apply(this,arguments)},t,e)}var it,ot=function(n){var e=t(arguments,1);return function(){var r=t(arguments);return n.apply(null,e.concat(r))}},ct=function(n){return function(){var e=t(arguments),r=e.pop();n.call(this,e,r)}},ft=\"function\"==typeof setImmediate&&setImmediate,at=\"object\"==typeof process&&\"function\"==typeof process.nextTick;it=ft?setImmediate:at?process.nextTick:r;var lt=u(it),st=\"function\"==typeof Symbol,pt=\"object\"==typeof global&&global&&global.Object===Object&&global,ht=\"object\"==typeof self&&self&&self.Object===Object&&self,yt=pt||ht||Function(\"return this\")(),vt=yt.Symbol,dt=Object.prototype,mt=dt.hasOwnProperty,gt=dt.toString,bt=vt?vt.toStringTag:void 0,jt=Object.prototype,St=jt.toString,kt=\"[object Null]\",Lt=\"[object Undefined]\",Ot=vt?vt.toStringTag:void 0,wt=\"[object AsyncFunction]\",xt=\"[object Function]\",Et=\"[object GeneratorFunction]\",At=\"[object Proxy]\",Tt=9007199254740991,_t={},Bt=\"function\"==typeof Symbol&&Symbol.iterator,Ft=function(n){return Bt&&n[Bt]&&n[Bt]()},It=\"[object Arguments]\",Mt=Object.prototype,Ut=Mt.hasOwnProperty,qt=Mt.propertyIsEnumerable,zt=S(function(){return arguments}())?S:function(n){return j(n)&&Ut.call(n,\"callee\")&&!qt.call(n,\"callee\")},Pt=Array.isArray,Vt=\"object\"==typeof n&&n&&!n.nodeType&&n,Dt=Vt&&\"object\"==typeof module&&module&&!module.nodeType&&module,Rt=Dt&&Dt.exports===Vt,Ct=Rt?yt.Buffer:void 0,$t=Ct?Ct.isBuffer:void 0,Wt=$t||k,Nt=9007199254740991,Qt=/^(?:0|[1-9]\\d*)$/,Gt=\"[object Arguments]\",Ht=\"[object Array]\",Jt=\"[object Boolean]\",Kt=\"[object Date]\",Xt=\"[object Error]\",Yt=\"[object Function]\",Zt=\"[object Map]\",ne=\"[object Number]\",te=\"[object Object]\",ee=\"[object RegExp]\",re=\"[object Set]\",ue=\"[object String]\",ie=\"[object WeakMap]\",oe=\"[object ArrayBuffer]\",ce=\"[object DataView]\",fe=\"[object Float32Array]\",ae=\"[object Float64Array]\",le=\"[object Int8Array]\",se=\"[object Int16Array]\",pe=\"[object Int32Array]\",he=\"[object Uint8Array]\",ye=\"[object Uint8ClampedArray]\",ve=\"[object Uint16Array]\",de=\"[object Uint32Array]\",me={};me[fe]=me[ae]=me[le]=me[se]=me[pe]=me[he]=me[ye]=me[ve]=me[de]=!0,me[Gt]=me[Ht]=me[oe]=me[Jt]=me[ce]=me[Kt]=me[Xt]=me[Yt]=me[Zt]=me[ne]=me[te]=me[ee]=me[re]=me[ue]=me[ie]=!1;var ge=\"object\"==typeof n&&n&&!n.nodeType&&n,be=ge&&\"object\"==typeof module&&module&&!module.nodeType&&module,je=be&&be.exports===ge,Se=je&&pt.process,ke=function(){try{var n=be&&be.require&&be.require(\"util\").types;return n?n:Se&&Se.binding&&Se.binding(\"util\")}catch(n){}}(),Le=ke&&ke.isTypedArray,Oe=Le?w(Le):O,we=Object.prototype,xe=we.hasOwnProperty,Ee=Object.prototype,Ae=A(Object.keys,Object),Te=Object.prototype,_e=Te.hasOwnProperty,Be=P(z,1/0),Fe=function(n,t,e){var r=d(n)?V:Be;r(n,a(t),e)},Ie=D(R),Me=l(Ie),Ue=C(R),qe=P(Ue,1),ze=l(qe),Pe=W(),Ve=function(n,e,r){function u(n,t){j.push(function(){f(n,t)})}function i(){if(0===j.length&&0===v)return r(null,y);for(;j.length&&v<e;){var n=j.shift();n()}}function o(n,t){var e=b[n];e||(e=b[n]=[]),e.push(t)}function c(n){var t=b[n]||[];$(t,function(n){n()}),i()}function f(n,e){if(!d){var u=U(function(e,u){if(v--,arguments.length>2&&(u=t(arguments,1)),e){var i={};N(y,function(n,t){i[t]=n}),i[n]=u,d=!0,b=Object.create(null),r(e,i)}else y[n]=u,c(n)});v++;var i=a(e[e.length-1]);e.length>1?i(y,u):i(u)}}function l(){for(var n,t=0;S.length;)n=S.pop(),t++,$(s(n),function(n){0===--k[n]&&S.push(n)});if(t!==h)throw new Error(\"async.auto cannot execute tasks due to a recursive dependency\")}function s(t){var e=[];return N(n,function(n,r){Pt(n)&&J(n,t,0)>=0&&e.push(r)}),e}\"function\"==typeof e&&(r=e,e=null),r=g(r||m);var p=_(n),h=p.length;if(!h)return r(null);e||(e=h);var y={},v=0,d=!1,b=Object.create(null),j=[],S=[],k={};N(n,function(t,e){if(!Pt(t))return u(e,[t]),void S.push(e);var r=t.slice(0,t.length-1),i=r.length;return 0===i?(u(e,t),void S.push(e)):(k[e]=i,void $(r,function(c){if(!n[c])throw new Error(\"async.auto task `\"+e+\"` has a non-existent dependency `\"+c+\"` in \"+r.join(\", \"));o(c,function(){i--,0===i&&u(e,t)})}))}),l(),i()},De=\"[object Symbol]\",Re=1/0,Ce=vt?vt.prototype:void 0,$e=Ce?Ce.toString:void 0,We=\"\\\\ud800-\\\\udfff\",Ne=\"\\\\u0300-\\\\u036f\",Qe=\"\\\\ufe20-\\\\ufe2f\",Ge=\"\\\\u20d0-\\\\u20ff\",He=Ne+Qe+Ge,Je=\"\\\\ufe0e\\\\ufe0f\",Ke=\"\\\\u200d\",Xe=RegExp(\"[\"+Ke+We+He+Je+\"]\"),Ye=\"\\\\ud800-\\\\udfff\",Ze=\"\\\\u0300-\\\\u036f\",nr=\"\\\\ufe20-\\\\ufe2f\",tr=\"\\\\u20d0-\\\\u20ff\",er=Ze+nr+tr,rr=\"\\\\ufe0e\\\\ufe0f\",ur=\"[\"+Ye+\"]\",ir=\"[\"+er+\"]\",or=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",cr=\"(?:\"+ir+\"|\"+or+\")\",fr=\"[^\"+Ye+\"]\",ar=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",lr=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",sr=\"\\\\u200d\",pr=cr+\"?\",hr=\"[\"+rr+\"]?\",yr=\"(?:\"+sr+\"(?:\"+[fr,ar,lr].join(\"|\")+\")\"+hr+pr+\")*\",vr=hr+pr+yr,dr=\"(?:\"+[fr+ir+\"?\",ir,ar,lr,ur].join(\"|\")+\")\",mr=RegExp(or+\"(?=\"+or+\")|\"+dr+vr,\"g\"),gr=/^\\s+|\\s+$/g,br=/^(?:async\\s+)?(function)?\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m,jr=/,/,Sr=/(=.+)?(\\s*)$/,kr=/((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;pn.prototype.removeLink=function(n){return n.prev?n.prev.next=n.next:this.head=n.next,n.next?n.next.prev=n.prev:this.tail=n.prev,n.prev=n.next=null,this.length-=1,n},pn.prototype.empty=function(){for(;this.head;)this.shift();return this},pn.prototype.insertAfter=function(n,t){t.prev=n,t.next=n.next,n.next?n.next.prev=t:this.tail=t,n.next=t,this.length+=1},pn.prototype.insertBefore=function(n,t){t.prev=n.prev,t.next=n,n.prev?n.prev.next=t:this.head=t,n.prev=t,this.length+=1},pn.prototype.unshift=function(n){this.head?this.insertBefore(this.head,n):hn(this,n)},pn.prototype.push=function(n){this.tail?this.insertAfter(this.tail,n):hn(this,n)},pn.prototype.shift=function(){return this.head&&this.removeLink(this.head)},pn.prototype.pop=function(){return this.tail&&this.removeLink(this.tail)},pn.prototype.toArray=function(){for(var n=Array(this.length),t=this.head,e=0;e<this.length;e++)n[e]=t.data,t=t.next;return n},pn.prototype.remove=function(n){for(var t=this.head;t;){var e=t.next;n(t)&&this.removeLink(t),t=e}return this};var Lr,Or=P(z,1),wr=function(){return mn.apply(null,t(arguments).reverse())},xr=Array.prototype.concat,Er=function(n,e,r,u){u=u||m;var i=a(r);Ue(n,e,function(n,e){i(n,function(n){return n?e(n):e(null,t(arguments,1))})},function(n,t){for(var e=[],r=0;r<t.length;r++)t[r]&&(e=xr.apply(e,t[r]));return u(n,e)})},Ar=P(Er,1/0),Tr=P(Er,1),_r=function(){var n=t(arguments),e=[null].concat(n);return function(){var n=arguments[arguments.length-1];return n.apply(this,e)}},Br=D(bn(gn,jn)),Fr=C(bn(gn,jn)),Ir=P(Fr,1),Mr=Sn(\"dir\"),Ur=P(An,1),qr=D(bn(_n,_n)),zr=C(bn(_n,_n)),Pr=P(zr,1),Vr=D(Mn),Dr=C(Mn),Rr=P(Dr,1),Cr=function(n,t,e,r){r=r||m;var u=a(e);Ue(n,t,function(n,t){u(n,function(e,r){return e?t(e):t(null,{key:r,val:n})})},function(n,t){for(var e={},u=Object.prototype.hasOwnProperty,i=0;i<t.length;i++)if(t[i]){var o=t[i].key,c=t[i].val;u.call(e,o)?e[o].push(c):e[o]=[c]}return r(n,e)})},$r=P(Cr,1/0),Wr=P(Cr,1),Nr=Sn(\"log\"),Qr=P(qn,1/0),Gr=P(qn,1);Lr=at?process.nextTick:ft?setImmediate:r;var Hr=u(Lr),Jr=function(n,t){var e=a(n);return yn(function(n,t){e(n[0],t)},t,1)},Kr=function(n,t){var e=Jr(n,t);return e.push=function(n,t,r){if(null==r&&(r=m),\"function\"!=typeof r)throw new Error(\"task callback must be a function\");if(e.started=!0,Pt(n)||(n=[n]),0===n.length)return lt(function(){e.drain()});t=t||0;for(var u=e._tasks.head;u&&t>=u.priority;)u=u.next;for(var i=0,o=n.length;i<o;i++){var c={data:n[i],priority:t,callback:r};u?e._tasks.insertBefore(u,c):e._tasks.push(c)}lt(e.process)},delete e.unshift,e},Xr=D(Qn),Yr=C(Qn),Zr=P(Yr,1),nu=function(n,t){t||(t=n,n=null);var e=a(t);return ct(function(t,r){function u(n){e.apply(null,t.concat(n))}n?Hn(n,u,r):Hn(u,r)})},tu=D(bn(Boolean,gn)),eu=C(bn(Boolean,gn)),ru=P(eu,1),uu=Math.ceil,iu=Math.max,ou=P(Zn,1/0),cu=P(Zn,1),fu=function(n,e){function r(t){var e=a(n[i++]);t.push(U(u)),e.apply(null,t)}function u(u){return u||i===n.length?e.apply(null,arguments):void r(t(arguments,1))}if(e=g(e||m),!Pt(n))return e(new Error(\"First argument to waterfall must be an array of functions\"));if(!n.length)return e();var i=0;r([])},au={apply:ot,applyEach:Me,applyEachSeries:ze,asyncify:i,auto:Ve,autoInject:sn,cargo:vn,compose:wr,concat:Ar,concatLimit:Er,concatSeries:Tr,constant:_r,detect:Br,detectLimit:Fr,detectSeries:Ir,dir:Mr,doDuring:kn,doUntil:On,doWhilst:Ln,during:wn,each:En,eachLimit:An,eachOf:Fe,eachOfLimit:z,eachOfSeries:Or,eachSeries:Ur,ensureAsync:Tn,every:qr,everyLimit:zr,everySeries:Pr,filter:Vr,filterLimit:Dr,filterSeries:Rr,forever:Un,groupBy:$r,groupByLimit:Cr,groupBySeries:Wr,log:Nr,map:Ie,mapLimit:Ue,mapSeries:qe,mapValues:Qr,mapValuesLimit:qn,mapValuesSeries:Gr,memoize:Pn,nextTick:Hr,parallel:Dn,parallelLimit:Rn,priorityQueue:Kr,queue:Jr,race:Cn,reduce:dn,reduceRight:$n,reflect:Wn,reflectAll:Nn,reject:Xr,rejectLimit:Yr,rejectSeries:Zr,retry:Hn,retryable:nu,seq:mn,series:Jn,setImmediate:lt,some:tu,someLimit:eu,someSeries:ru,sortBy:Kn,timeout:Xn,times:ou,timesLimit:Zn,timesSeries:cu,transform:nt,tryEach:tt,unmemoize:et,until:ut,waterfall:fu,whilst:rt,all:qr,allLimit:zr,allSeries:Pr,any:tu,anyLimit:eu,anySeries:ru,find:Br,findLimit:Fr,findSeries:Ir,forEach:En,forEachSeries:Ur,forEachLimit:An,forEachOf:Fe,forEachOfSeries:Or,forEachOfLimit:z,inject:dn,foldl:dn,foldr:$n,select:Vr,selectLimit:Dr,selectSeries:Rr,wrapSync:i};n.default=au,n.apply=ot,n.applyEach=Me,n.applyEachSeries=ze,n.asyncify=i,n.auto=Ve,n.autoInject=sn,n.cargo=vn,n.compose=wr,n.concat=Ar,n.concatLimit=Er,n.concatSeries=Tr,n.constant=_r,n.detect=Br,n.detectLimit=Fr,n.detectSeries=Ir,n.dir=Mr,n.doDuring=kn,n.doUntil=On,n.doWhilst=Ln,n.during=wn,n.each=En,n.eachLimit=An,n.eachOf=Fe,n.eachOfLimit=z,n.eachOfSeries=Or,n.eachSeries=Ur,n.ensureAsync=Tn,n.every=qr,n.everyLimit=zr,n.everySeries=Pr,n.filter=Vr,n.filterLimit=Dr,n.filterSeries=Rr,n.forever=Un,n.groupBy=$r,n.groupByLimit=Cr,n.groupBySeries=Wr,n.log=Nr,n.map=Ie,n.mapLimit=Ue,n.mapSeries=qe,n.mapValues=Qr,n.mapValuesLimit=qn,n.mapValuesSeries=Gr,n.memoize=Pn,n.nextTick=Hr,n.parallel=Dn,n.parallelLimit=Rn,n.priorityQueue=Kr,n.queue=Jr,n.race=Cn,n.reduce=dn,n.reduceRight=$n,n.reflect=Wn,n.reflectAll=Nn,n.reject=Xr,n.rejectLimit=Yr,n.rejectSeries=Zr,n.retry=Hn,n.retryable=nu,n.seq=mn,n.series=Jn,n.setImmediate=lt,n.some=tu,n.someLimit=eu,n.someSeries=ru,n.sortBy=Kn,n.timeout=Xn,n.times=ou,n.timesLimit=Zn,n.timesSeries=cu,n.transform=nt,n.tryEach=tt,n.unmemoize=et,n.until=ut,n.waterfall=fu,n.whilst=rt,n.all=qr,n.allLimit=zr,n.allSeries=Pr,n.any=tu,n.anyLimit=eu,n.anySeries=ru,n.find=Br,n.findLimit=Fr,n.findSeries=Ir,n.forEach=En,n.forEachSeries=Ur,n.forEachLimit=An,n.forEachOf=Fe,n.forEachOfSeries=Or,n.forEachOfLimit=z,n.inject=dn,n.foldl=dn,n.foldr=$n,n.select=Vr,n.selectLimit=Dr,n.selectSeries=Rr,n.wrapSync=i,Object.defineProperty(n,\"__esModule\",{value:!0})});\n//# sourceMappingURL=async.min.map"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/dist/async.min.map",
    "content": "{\"version\":3,\"sources\":[\"build/dist/async.js\"],\"names\":[\"global\",\"factory\",\"exports\",\"module\",\"define\",\"amd\",\"async\",\"this\",\"slice\",\"arrayLike\",\"start\",\"newLen\",\"Math\",\"max\",\"length\",\"newArr\",\"Array\",\"idx\",\"isObject\",\"value\",\"type\",\"fallback\",\"fn\",\"setTimeout\",\"wrap\",\"defer\",\"args\",\"arguments\",\"apply\",\"asyncify\",\"func\",\"initialParams\",\"callback\",\"result\",\"e\",\"then\",\"invokeCallback\",\"err\",\"message\",\"Error\",\"error\",\"setImmediate$1\",\"rethrow\",\"isAsync\",\"supportsSymbol\",\"Symbol\",\"toStringTag\",\"wrapAsync\",\"asyncFn\",\"applyEach$1\",\"eachfn\",\"fns\",\"go\",\"that\",\"cb\",\"concat\",\"getRawTag\",\"isOwn\",\"hasOwnProperty\",\"call\",\"symToStringTag$1\",\"tag\",\"undefined\",\"unmasked\",\"nativeObjectToString\",\"objectToString\",\"nativeObjectToString$1\",\"baseGetTag\",\"undefinedTag\",\"nullTag\",\"symToStringTag\",\"Object\",\"isFunction\",\"funcTag\",\"genTag\",\"asyncTag\",\"proxyTag\",\"isLength\",\"MAX_SAFE_INTEGER\",\"isArrayLike\",\"noop\",\"once\",\"callFn\",\"baseTimes\",\"n\",\"iteratee\",\"index\",\"isObjectLike\",\"baseIsArguments\",\"argsTag\",\"stubFalse\",\"isIndex\",\"MAX_SAFE_INTEGER$1\",\"reIsUint\",\"test\",\"baseIsTypedArray\",\"typedArrayTags\",\"baseUnary\",\"arrayLikeKeys\",\"inherited\",\"isArr\",\"isArray\",\"isArg\",\"isArguments\",\"isBuff\",\"isBuffer\",\"isType\",\"isTypedArray\",\"skipIndexes\",\"String\",\"key\",\"hasOwnProperty$1\",\"push\",\"isPrototype\",\"Ctor\",\"constructor\",\"proto\",\"prototype\",\"objectProto$5\",\"overArg\",\"transform\",\"arg\",\"baseKeys\",\"object\",\"nativeKeys\",\"hasOwnProperty$3\",\"keys\",\"createArrayIterator\",\"coll\",\"i\",\"len\",\"createES2015Iterator\",\"iterator\",\"item\",\"next\",\"done\",\"createObjectIterator\",\"obj\",\"okeys\",\"getIterator\",\"onlyOnce\",\"_eachOfLimit\",\"limit\",\"iterateeCallback\",\"running\",\"breakLoop\",\"looping\",\"replenish\",\"elem\",\"nextElem\",\"eachOfLimit\",\"doLimit\",\"iterable\",\"eachOfArrayLike\",\"iteratorCallback\",\"completed\",\"doParallel\",\"eachOf\",\"_asyncMap\",\"arr\",\"results\",\"counter\",\"_iteratee\",\"_\",\"v\",\"doParallelLimit\",\"arrayEach\",\"array\",\"createBaseFor\",\"fromRight\",\"keysFunc\",\"props\",\"baseForOwn\",\"baseFor\",\"baseFindIndex\",\"predicate\",\"fromIndex\",\"baseIsNaN\",\"strictIndexOf\",\"baseIndexOf\",\"arrayMap\",\"isSymbol\",\"symbolTag\",\"baseToString\",\"symbolToString\",\"INFINITY\",\"baseSlice\",\"end\",\"castSlice\",\"charsEndIndex\",\"strSymbols\",\"chrSymbols\",\"charsStartIndex\",\"asciiToArray\",\"string\",\"split\",\"hasUnicode\",\"reHasUnicode\",\"unicodeToArray\",\"match\",\"reUnicode\",\"stringToArray\",\"toString\",\"trim\",\"chars\",\"guard\",\"replace\",\"reTrim\",\"join\",\"parseParams\",\"STRIP_COMMENTS\",\"FN_ARGS\",\"FN_ARG_SPLIT\",\"map\",\"FN_ARG\",\"autoInject\",\"tasks\",\"newTasks\",\"taskFn\",\"newTask\",\"taskCb\",\"newArgs\",\"params\",\"name\",\"fnIsAsync\",\"hasNoDeps\",\"pop\",\"auto\",\"DLL\",\"head\",\"tail\",\"setInitial\",\"dll\",\"node\",\"queue\",\"worker\",\"concurrency\",\"payload\",\"_insert\",\"data\",\"insertAtFront\",\"q\",\"started\",\"idle\",\"drain\",\"l\",\"_tasks\",\"unshift\",\"processingScheduled\",\"process\",\"_next\",\"numRunning\",\"task\",\"workersList\",\"shift\",\"splice\",\"buffer\",\"unsaturated\",\"_worker\",\"isProcessing\",\"saturated\",\"empty\",\"paused\",\"kill\",\"remove\",\"testFn\",\"min\",\"pause\",\"resume\",\"cargo\",\"reduce\",\"memo\",\"eachOfSeries\",\"x\",\"seq\",\"_functions\",\"newargs\",\"nextargs\",\"identity\",\"_createTester\",\"check\",\"getResult\",\"testResult\",\"testPassed\",\"_findGetResult\",\"consoleFunc\",\"console\",\"doDuring\",\"_test\",\"truth\",\"_fn\",\"doWhilst\",\"doUntil\",\"during\",\"_withoutIndex\",\"eachLimit\",\"eachLimit$1\",\"ensureAsync\",\"sync\",\"innerArgs\",\"notId\",\"baseProperty\",\"filterArray\",\"truthValues\",\"filterGeneric\",\"sort\",\"a\",\"b\",\"_filter\",\"filter\",\"forever\",\"errback\",\"mapValuesLimit\",\"newObj\",\"val\",\"has\",\"memoize\",\"hasher\",\"create\",\"queues\",\"memoized\",\"unmemoized\",\"_parallel\",\"parallelLimit\",\"parallelLimit$1\",\"race\",\"TypeError\",\"reduceRight\",\"reversed\",\"reverse\",\"reflect\",\"reflectCallback\",\"cbArg\",\"reflectAll\",\"reject$1\",\"constant$1\",\"retry\",\"opts\",\"parseTimes\",\"acc\",\"t\",\"times\",\"DEFAULT_TIMES\",\"intervalFunc\",\"interval\",\"DEFAULT_INTERVAL\",\"errorFilter\",\"retryAttempt\",\"_task\",\"attempt\",\"options\",\"series\",\"sortBy\",\"comparator\",\"left\",\"right\",\"criteria\",\"timeout\",\"milliseconds\",\"info\",\"timeoutCallback\",\"code\",\"timedOut\",\"timer\",\"clearTimeout\",\"baseRange\",\"step\",\"nativeMax\",\"nativeCeil\",\"timeLimit\",\"count\",\"mapLimit\",\"accumulator\",\"k\",\"tryEach\",\"eachSeries\",\"res\",\"unmemoize\",\"whilst\",\"until\",\"_defer\",\"callArgs\",\"hasSetImmediate\",\"setImmediate\",\"hasNextTick\",\"nextTick\",\"freeGlobal\",\"freeSelf\",\"self\",\"root\",\"Function\",\"Symbol$1\",\"objectProto\",\"objectProto$1\",\"iteratorSymbol\",\"objectProto$3\",\"hasOwnProperty$2\",\"propertyIsEnumerable\",\"freeExports\",\"nodeType\",\"freeModule\",\"moduleExports\",\"Buffer\",\"nativeIsBuffer\",\"argsTag$1\",\"arrayTag\",\"boolTag\",\"dateTag\",\"errorTag\",\"funcTag$1\",\"mapTag\",\"numberTag\",\"objectTag\",\"regexpTag\",\"setTag\",\"stringTag\",\"weakMapTag\",\"arrayBufferTag\",\"dataViewTag\",\"float32Tag\",\"float64Tag\",\"int8Tag\",\"int16Tag\",\"int32Tag\",\"uint8Tag\",\"uint8ClampedTag\",\"uint16Tag\",\"uint32Tag\",\"freeExports$1\",\"freeModule$1\",\"moduleExports$1\",\"freeProcess\",\"nodeUtil\",\"types\",\"require\",\"binding\",\"nodeIsTypedArray\",\"objectProto$2\",\"objectProto$4\",\"eachOfGeneric\",\"Infinity\",\"eachOfImplementation\",\"applyEach\",\"mapSeries\",\"applyEachSeries\",\"enqueueTask\",\"readyTasks\",\"runTask\",\"processQueue\",\"runningTasks\",\"run\",\"addListener\",\"taskName\",\"taskListeners\",\"listeners\",\"taskComplete\",\"hasError\",\"taskCallback\",\"safeResults\",\"rkey\",\"checkForDeadlocks\",\"currentTask\",\"readyToCheck\",\"getDependents\",\"dependent\",\"uncheckedDependencies\",\"numTasks\",\"keys$$1\",\"dependencies\",\"remainingDependencies\",\"dependencyName\",\"symbolProto\",\"rsAstralRange\",\"rsComboMarksRange\",\"reComboHalfMarksRange\",\"rsComboSymbolsRange\",\"rsComboRange\",\"rsVarRange\",\"rsZWJ\",\"RegExp\",\"rsAstralRange$1\",\"rsComboMarksRange$1\",\"reComboHalfMarksRange$1\",\"rsComboSymbolsRange$1\",\"rsComboRange$1\",\"rsVarRange$1\",\"rsAstral\",\"rsCombo\",\"rsFitz\",\"rsModifier\",\"rsNonAstral\",\"rsRegional\",\"rsSurrPair\",\"rsZWJ$1\",\"reOptMod\",\"rsOptVar\",\"rsOptJoin\",\"rsSeq\",\"rsSymbol\",\"removeLink\",\"prev\",\"insertAfter\",\"newNode\",\"insertBefore\",\"toArray\",\"curr\",\"_defer$1\",\"compose\",\"_concat\",\"concatLimit\",\"mapResults\",\"concatSeries\",\"constant\",\"values\",\"detect\",\"detectLimit\",\"detectSeries\",\"dir\",\"every\",\"everyLimit\",\"everySeries\",\"filterLimit\",\"filterSeries\",\"groupByLimit\",\"groupBy\",\"groupBySeries\",\"log\",\"mapValues\",\"mapValuesSeries\",\"queue$1\",\"items\",\"priorityQueue\",\"priority\",\"nextNode\",\"reject\",\"rejectLimit\",\"rejectSeries\",\"retryable\",\"some\",\"Boolean\",\"someLimit\",\"someSeries\",\"ceil\",\"timesSeries\",\"waterfall\",\"nextTask\",\"taskIndex\",\"each\",\"parallel\",\"timesLimit\",\"all\",\"allLimit\",\"allSeries\",\"any\",\"anyLimit\",\"anySeries\",\"find\",\"findLimit\",\"findSeries\",\"forEach\",\"forEachSeries\",\"forEachLimit\",\"forEachOf\",\"forEachOfSeries\",\"forEachOfLimit\",\"inject\",\"foldl\",\"foldr\",\"select\",\"selectLimit\",\"selectSeries\",\"wrapSync\",\"defineProperty\"],\"mappings\":\"CAAC,SAAUA,EAAQC,GACE,gBAAZC,UAA0C,mBAAXC,QAAyBF,EAAQC,SACrD,kBAAXE,SAAyBA,OAAOC,IAAMD,QAAQ,WAAYH,GAChEA,EAASD,EAAOM,MAAQN,EAAOM,YAChCC,KAAM,SAAWL,GAAW,YAE9B,SAASM,GAAMC,EAAWC,GACtBA,GAAc,CAGd,KAAI,GAFAC,GAASC,KAAKC,IAAIJ,EAAUK,OAASJ,EAAO,GAC5CK,EAASC,MAAML,GACXM,EAAM,EAAGA,EAAMN,EAAQM,IAC3BF,EAAOE,GAAOR,EAAUC,EAAQO,EAEpC,OAAOF,GAyFX,QAASG,GAASC,GAChB,GAAIC,SAAcD,EAClB,OAAgB,OAATA,IAA0B,UAARC,GAA4B,YAARA,GAM/C,QAASC,GAASC,GACdC,WAAWD,EAAI,GAGnB,QAASE,GAAKC,GACV,MAAO,UAAUH,GACb,GAAII,GAAOlB,EAAMmB,UAAW,EAC5BF,GAAM,WACFH,EAAGM,MAAM,KAAMF,MAyE3B,QAASG,GAASC,GACd,MAAOC,IAAc,SAAUL,EAAMM,GACjC,GAAIC,EACJ,KACIA,EAASH,EAAKF,MAAMrB,KAAMmB,GAC5B,MAAOQ,GACL,MAAOF,GAASE,GAGhBhB,EAASe,IAAkC,kBAAhBA,GAAOE,KAClCF,EAAOE,KAAK,SAAShB,GACjBiB,EAAeJ,EAAU,KAAMb,IAChC,SAASkB,GACRD,EAAeJ,EAAUK,EAAIC,QAAUD,EAAM,GAAIE,OAAMF,MAG3DL,EAAS,KAAMC,KAK3B,QAASG,GAAeJ,EAAUQ,EAAOrB,GACrC,IACIa,EAASQ,EAAOrB,GAClB,MAAOe,GACLO,GAAeC,EAASR,IAIhC,QAASQ,GAAQF,GACb,KAAMA,GAKV,QAASG,GAAQrB,GACb,MAAOsB,KAA6C,kBAA3BtB,EAAGuB,OAAOC,aAGvC,QAASC,GAAUC,GACf,MAAOL,GAAQK,GAAWnB,EAASmB,GAAWA,EAGlD,QAASC,GAAYC,GACjB,MAAO,UAASC,GACZ,GAAIzB,GAAOlB,EAAMmB,UAAW,GACxByB,EAAKrB,GAAc,SAASL,EAAMM,GAClC,GAAIqB,GAAO9C,IACX,OAAO2C,GAAOC,EAAK,SAAU7B,EAAIgC,GAC7BP,EAAUzB,GAAIM,MAAMyB,EAAM3B,EAAK6B,OAAOD,KACvCtB,IAEP,OAAIN,GAAKZ,OACEsC,EAAGxB,MAAMrB,KAAMmB,GAGf0B,GAwCnB,QAASI,GAAUrC,GACjB,GAAIsC,GAAQC,GAAeC,KAAKxC,EAAOyC,IACnCC,EAAM1C,EAAMyC,GAEhB,KACEzC,EAAMyC,IAAoBE,MAC1B,IAAIC,IAAW,EACf,MAAO7B,IAET,GAAID,GAAS+B,GAAqBL,KAAKxC,EAQvC,OAPI4C,KACEN,EACFtC,EAAMyC,IAAoBC,QAEnB1C,GAAMyC,KAGV3B,EAoBT,QAASgC,GAAe9C,GACtB,MAAO+C,IAAuBP,KAAKxC,GAiBrC,QAASgD,GAAWhD,GAClB,MAAa,OAATA,EACe2C,SAAV3C,EAAsBiD,GAAeC,GAEtCC,IAAkBA,KAAkBC,QAAOpD,GAC/CqC,EAAUrC,GACV8C,EAAe9C,GA0BrB,QAASqD,GAAWrD,GAClB,IAAKD,EAASC,GACZ,OAAO,CAIT,IAAI0C,GAAMM,EAAWhD,EACrB,OAAO0C,IAAOY,IAAWZ,GAAOa,IAAUb,GAAOc,IAAYd,GAAOe,GAgCtE,QAASC,GAAS1D,GAChB,MAAuB,gBAATA,IACZA,GAAQ,GAAMA,EAAQ,GAAK,GAAKA,GAAS2D,GA4B7C,QAASC,GAAY5D,GACnB,MAAgB,OAATA,GAAiB0D,EAAS1D,EAAML,UAAY0D,EAAWrD,GAmBhE,QAAS6D,MAIT,QAASC,GAAK3D,GACV,MAAO,YACH,GAAW,OAAPA,EAAJ,CACA,GAAI4D,GAAS5D,CACbA,GAAK,KACL4D,EAAOtD,MAAMrB,KAAMoB,aAmB3B,QAASwD,GAAUC,EAAGC,GAIpB,IAHA,GAAIC,IAAQ,EACRrD,EAASjB,MAAMoE,KAEVE,EAAQF,GACfnD,EAAOqD,GAASD,EAASC,EAE3B,OAAOrD,GA2BT,QAASsD,GAAapE,GACpB,MAAgB,OAATA,GAAiC,gBAATA,GAajC,QAASqE,GAAgBrE,GACvB,MAAOoE,GAAapE,IAAUgD,EAAWhD,IAAUsE,GAyErD,QAASC,KACP,OAAO,EAmDT,QAASC,GAAQxE,EAAOL,GACtB,GAAIM,SAAcD,EAGlB,OAFAL,GAAmB,MAAVA,EAAiB8E,GAAqB9E,IAEtCA,IACE,UAARM,GACU,UAARA,GAAoByE,GAASC,KAAK3E,KAChCA,GAAQ,GAAMA,EAAQ,GAAK,GAAKA,EAAQL,EAqDjD,QAASiF,GAAiB5E,GACxB,MAAOoE,GAAapE,IAClB0D,EAAS1D,EAAML,WAAakF,GAAe7B,EAAWhD,IAU1D,QAAS8E,GAAUnE,GACjB,MAAO,UAASX,GACd,MAAOW,GAAKX,IAmEhB,QAAS+E,GAAc/E,EAAOgF,GAC5B,GAAIC,GAAQC,GAAQlF,GAChBmF,GAASF,GAASG,GAAYpF,GAC9BqF,GAAUJ,IAAUE,GAASG,GAAStF,GACtCuF,GAAUN,IAAUE,IAAUE,GAAUG,GAAaxF,GACrDyF,EAAcR,GAASE,GAASE,GAAUE,EAC1CzE,EAAS2E,EAAczB,EAAUhE,EAAML,OAAQ+F,WAC/C/F,EAASmB,EAAOnB,MAEpB,KAAK,GAAIgG,KAAO3F,IACTgF,IAAaY,GAAiBpD,KAAKxC,EAAO2F,IACzCF,IAEQ,UAAPE,GAECN,IAAkB,UAAPM,GAA0B,UAAPA,IAE9BJ,IAAkB,UAAPI,GAA0B,cAAPA,GAA8B,cAAPA,IAEtDnB,EAAQmB,EAAKhG,KAElBmB,EAAO+E,KAAKF,EAGhB,OAAO7E,GAaT,QAASgF,GAAY9F,GACnB,GAAI+F,GAAO/F,GAASA,EAAMgG,YACtBC,EAAwB,kBAARF,IAAsBA,EAAKG,WAAcC,EAE7D,OAAOnG,KAAUiG,EAWnB,QAASG,GAAQzF,EAAM0F,GACrB,MAAO,UAASC,GACd,MAAO3F,GAAK0F,EAAUC,KAoB1B,QAASC,GAASC,GAChB,IAAKV,EAAYU,GACf,MAAOC,IAAWD,EAEpB,IAAI1F,KACJ,KAAK,GAAI6E,KAAOvC,QAAOoD,GACjBE,GAAiBlE,KAAKgE,EAAQb,IAAe,eAAPA,GACxC7E,EAAO+E,KAAKF,EAGhB,OAAO7E,GA+BT,QAAS6F,GAAKH,GACZ,MAAO5C,GAAY4C,GAAUzB,EAAcyB,GAAUD,EAASC,GAGhE,QAASI,GAAoBC,GACzB,GAAIC,IAAI,EACJC,EAAMF,EAAKlH,MACf,OAAO,YACH,QAASmH,EAAIC,GAAO/G,MAAO6G,EAAKC,GAAInB,IAAKmB,GAAK,MAItD,QAASE,GAAqBC,GAC1B,GAAIH,IAAI,CACR,OAAO,YACH,GAAII,GAAOD,EAASE,MACpB,OAAID,GAAKE,KACE,MACXN,KACQ9G,MAAOkH,EAAKlH,MAAO2F,IAAKmB,KAIxC,QAASO,GAAqBC,GAC1B,GAAIC,GAAQZ,EAAKW,GACbR,GAAI,EACJC,EAAMQ,EAAM5H,MAChB,OAAO,SAASwH,KACZ,GAAIxB,GAAM4B,IAAQT,EAClB,OAAY,cAARnB,EACOwB,IAEJL,EAAIC,GAAO/G,MAAOsH,EAAI3B,GAAMA,IAAKA,GAAO,MAIvD,QAASsB,GAASJ,GACd,GAAIjD,EAAYiD,GACZ,MAAOD,GAAoBC,EAG/B,IAAII,GAAWO,GAAYX,EAC3B,OAAOI,GAAWD,EAAqBC,GAAYI,EAAqBR,GAG5E,QAASY,GAAStH,GACd,MAAO,YACH,GAAW,OAAPA,EAAa,KAAM,IAAIiB,OAAM,+BACjC,IAAI2C,GAAS5D,CACbA,GAAK,KACL4D,EAAOtD,MAAMrB,KAAMoB,YAI3B,QAASkH,GAAaC,GAClB,MAAO,UAAUL,EAAKpD,EAAUrD,GAU5B,QAAS+G,GAAiB1G,EAAKlB,GAE3B,GADA6H,GAAW,EACP3G,EACAkG,GAAO,EACPvG,EAASK,OAER,CAAA,GAAIlB,IAAU8H,IAAcV,GAAQS,GAAW,EAEhD,MADAT,IAAO,EACAvG,EAAS,KAEVkH,IACNC,KAIR,QAASA,KAEL,IADAD,GAAU,EACHF,EAAUF,IAAUP,GAAM,CAC7B,GAAIa,GAAOC,GACX,IAAa,OAATD,EAKA,MAJAb,IAAO,OACHS,GAAW,GACXhH,EAAS,MAIjBgH,IAAW,EACX3D,EAAS+D,EAAKjI,MAAOiI,EAAKtC,IAAK8B,EAASG,IAE5CG,GAAU,EArCd,GADAlH,EAAWiD,EAAKjD,GAAYgD,GACxB8D,GAAS,IAAML,EACf,MAAOzG,GAAS,KAEpB,IAAIqH,GAAWjB,EAASK,GACpBF,GAAO,EACPS,EAAU,EACVE,GAAU,CAkCdC,MAwBR,QAASG,GAAYtB,EAAMc,EAAOzD,EAAUrD,GACxC6G,EAAaC,GAAOd,EAAMjF,EAAUsC,GAAWrD,GAGnD,QAASuH,GAAQjI,EAAIwH,GACjB,MAAO,UAAUU,EAAUnE,EAAUrD,GACjC,MAAOV,GAAGkI,EAAUV,EAAOzD,EAAUrD,IAK7C,QAASyH,GAAgBzB,EAAM3C,EAAUrD,GASrC,QAAS0H,GAAiBrH,EAAKlB,GACvBkB,EACAL,EAASK,KACCsH,IAAc7I,GAAWK,IAAU8H,IAC7CjH,EAAS,MAZjBA,EAAWiD,EAAKjD,GAAYgD,EAC5B,IAAIM,GAAQ,EACRqE,EAAY,EACZ7I,EAASkH,EAAKlH,MAalB,KAZe,IAAXA,GACAkB,EAAS,MAWNsD,EAAQxE,EAAQwE,IACnBD,EAAS2C,EAAK1C,GAAQA,EAAOsD,EAASc,IAmD9C,QAASE,GAAWtI,GAChB,MAAO,UAAUmH,EAAKpD,EAAUrD,GAC5B,MAAOV,GAAGuI,GAAQpB,EAAK1F,EAAUsC,GAAWrD,IAIpD,QAAS8H,GAAU5G,EAAQ6G,EAAK1E,EAAUrD,GACtCA,EAAWA,GAAYgD,EACvB+E,EAAMA,KACN,IAAIC,MACAC,EAAU,EACVC,EAAYnH,EAAUsC,EAE1BnC,GAAO6G,EAAK,SAAU5I,EAAOgJ,EAAGnI,GAC5B,GAAIsD,GAAQ2E,GACZC,GAAU/I,EAAO,SAAUkB,EAAK+H,GAC5BJ,EAAQ1E,GAAS8E,EACjBpI,EAASK,MAEd,SAAUA,GACTL,EAASK,EAAK2H,KA6EtB,QAASK,GAAgB/I,GACrB,MAAO,UAAUmH,EAAKK,EAAOzD,EAAUrD,GACnC,MAAOV,GAAGuH,EAAaC,GAAQL,EAAK1F,EAAUsC,GAAWrD,IA2EjE,QAASsI,GAAUC,EAAOlF,GAIxB,IAHA,GAAIC,IAAQ,EACRxE,EAAkB,MAATyJ,EAAgB,EAAIA,EAAMzJ,SAE9BwE,EAAQxE,GACXuE,EAASkF,EAAMjF,GAAQA,EAAOiF,MAAW,IAI/C,MAAOA,GAUT,QAASC,GAAcC,GACrB,MAAO,UAAS9C,EAAQtC,EAAUqF,GAMhC,IALA,GAAIpF,IAAQ,EACRkE,EAAWjF,OAAOoD,GAClBgD,EAAQD,EAAS/C,GACjB7G,EAAS6J,EAAM7J,OAEZA,KAAU,CACf,GAAIgG,GAAM6D,EAAMF,EAAY3J,IAAWwE,EACvC,IAAID,EAASmE,EAAS1C,GAAMA,EAAK0C,MAAc,EAC7C,MAGJ,MAAO7B,IAyBX,QAASiD,GAAWjD,EAAQtC,GAC1B,MAAOsC,IAAUkD,GAAQlD,EAAQtC,EAAUyC,GAc7C,QAASgD,GAAcP,EAAOQ,EAAWC,EAAWP,GAIlD,IAHA,GAAI3J,GAASyJ,EAAMzJ,OACfwE,EAAQ0F,GAAaP,EAAY,GAAI,GAEjCA,EAAYnF,MAAYA,EAAQxE,GACtC,GAAIiK,EAAUR,EAAMjF,GAAQA,EAAOiF,GACjC,MAAOjF,EAGX,QAAO,EAUT,QAAS2F,GAAU9J,GACjB,MAAOA,KAAUA,EAanB,QAAS+J,GAAcX,EAAOpJ,EAAO6J,GAInC,IAHA,GAAI1F,GAAQ0F,EAAY,EACpBlK,EAASyJ,EAAMzJ,SAEVwE,EAAQxE,GACf,GAAIyJ,EAAMjF,KAAWnE,EACnB,MAAOmE,EAGX,QAAO,EAYT,QAAS6F,GAAYZ,EAAOpJ,EAAO6J,GACjC,MAAO7J,KAAUA,EACb+J,EAAcX,EAAOpJ,EAAO6J,GAC5BF,EAAcP,EAAOU,EAAWD,GAkQtC,QAASI,GAASb,EAAOlF,GAKvB,IAJA,GAAIC,IAAQ,EACRxE,EAAkB,MAATyJ,EAAgB,EAAIA,EAAMzJ,OACnCmB,EAASjB,MAAMF,KAEVwE,EAAQxE,GACfmB,EAAOqD,GAASD,EAASkF,EAAMjF,GAAQA,EAAOiF,EAEhD,OAAOtI,GAuBT,QAASoJ,GAASlK,GAChB,MAAuB,gBAATA,IACXoE,EAAapE,IAAUgD,EAAWhD,IAAUmK,GAkBjD,QAASC,GAAapK,GAEpB,GAAoB,gBAATA,GACT,MAAOA,EAET,IAAIkF,GAAQlF,GAEV,MAAOiK,GAASjK,EAAOoK,GAAgB,EAEzC,IAAIF,EAASlK,GACX,MAAOqK,IAAiBA,GAAe7H,KAAKxC,GAAS,EAEvD,IAAIc,GAAUd,EAAQ,EACtB,OAAkB,KAAVc,GAAkB,EAAId,IAAWsK,GAAY,KAAOxJ,EAY9D,QAASyJ,GAAUnB,EAAO7J,EAAOiL,GAC/B,GAAIrG,IAAQ,EACRxE,EAASyJ,EAAMzJ,MAEfJ,GAAQ,IACVA,GAASA,EAAQI,EAAS,EAAKA,EAASJ,GAE1CiL,EAAMA,EAAM7K,EAASA,EAAS6K,EAC1BA,EAAM,IACRA,GAAO7K,GAETA,EAASJ,EAAQiL,EAAM,EAAMA,EAAMjL,IAAW,EAC9CA,KAAW,CAGX,KADA,GAAIuB,GAASjB,MAAMF,KACVwE,EAAQxE,GACfmB,EAAOqD,GAASiF,EAAMjF,EAAQ5E,EAEhC,OAAOuB,GAYT,QAAS2J,IAAUrB,EAAO7J,EAAOiL,GAC/B,GAAI7K,GAASyJ,EAAMzJ,MAEnB,OADA6K,GAAc7H,SAAR6H,EAAoB7K,EAAS6K,GAC1BjL,GAASiL,GAAO7K,EAAUyJ,EAAQmB,EAAUnB,EAAO7J,EAAOiL,GAYrE,QAASE,IAAcC,EAAYC,GAGjC,IAFA,GAAIzG,GAAQwG,EAAWhL,OAEhBwE,KAAW6F,EAAYY,EAAYD,EAAWxG,GAAQ,IAAK,IAClE,MAAOA,GAYT,QAAS0G,IAAgBF,EAAYC,GAInC,IAHA,GAAIzG,IAAQ,EACRxE,EAASgL,EAAWhL,SAEfwE,EAAQxE,GAAUqK,EAAYY,EAAYD,EAAWxG,GAAQ,IAAK,IAC3E,MAAOA,GAUT,QAAS2G,IAAaC,GACpB,MAAOA,GAAOC,MAAM,IAwBtB,QAASC,IAAWF,GAClB,MAAOG,IAAavG,KAAKoG,GAsC3B,QAASI,IAAeJ,GACtB,MAAOA,GAAOK,MAAMC,QAUtB,QAASC,IAAcP,GACrB,MAAOE,IAAWF,GACdI,GAAeJ,GACfD,GAAaC,GAwBnB,QAASQ,IAASvL,GAChB,MAAgB,OAATA,EAAgB,GAAKoK,EAAapK,GA4B3C,QAASwL,IAAKT,EAAQU,EAAOC,GAE3B,GADAX,EAASQ,GAASR,GACdA,IAAWW,GAAmB/I,SAAV8I,GACtB,MAAOV,GAAOY,QAAQC,GAAQ,GAEhC,KAAKb,KAAYU,EAAQrB,EAAaqB,IACpC,MAAOV,EAET,IAAIJ,GAAaW,GAAcP,GAC3BH,EAAaU,GAAcG,GAC3BlM,EAAQsL,GAAgBF,EAAYC,GACpCJ,EAAME,GAAcC,EAAYC,GAAc,CAElD,OAAOH,IAAUE,EAAYpL,EAAOiL,GAAKqB,KAAK,IAQhD,QAASC,IAAYnL,GAOjB,MANAA,GAAOA,EAAK4K,WAAWI,QAAQI,GAAgB,IAC/CpL,EAAOA,EAAKyK,MAAMY,IAAS,GAAGL,QAAQ,IAAK,IAC3ChL,EAAOA,EAAOA,EAAKqK,MAAMiB,OACzBtL,EAAOA,EAAKuL,IAAI,SAAU5F,GACtB,MAAOkF,IAAKlF,EAAIqF,QAAQQ,GAAQ,OAuFxC,QAASC,IAAWC,EAAOxL,GACvB,GAAIyL,KAEJ7C,GAAW4C,EAAO,SAAUE,EAAQ5G,GA2BhC,QAAS6G,GAAQ3D,EAAS4D,GACtB,GAAIC,GAAUzC,EAAS0C,EAAQ,SAAUC,GACrC,MAAO/D,GAAQ+D,IAEnBF,GAAQ7G,KAAK4G,GACb7K,EAAU2K,GAAQ9L,MAAM,KAAMiM,GA/BlC,GAAIC,GACAE,EAAYrL,EAAQ+K,GACpBO,GACED,GAA+B,IAAlBN,EAAO5M,QACrBkN,GAA+B,IAAlBN,EAAO5M,MAEzB,IAAIuF,GAAQqH,GACRI,EAASJ,EAAOlN,MAAM,GAAG,GACzBkN,EAASA,EAAOA,EAAO5M,OAAS,GAEhC2M,EAAS3G,GAAOgH,EAAOvK,OAAOuK,EAAOhN,OAAS,EAAI6M,EAAUD,OACzD,IAAIO,EAEPR,EAAS3G,GAAO4G,MACb,CAEH,GADAI,EAASb,GAAYS,GACC,IAAlBA,EAAO5M,SAAiBkN,GAA+B,IAAlBF,EAAOhN,OAC5C,KAAM,IAAIyB,OAAM,yDAIfyL,IAAWF,EAAOI,MAEvBT,EAAS3G,GAAOgH,EAAOvK,OAAOoK,MAYtCQ,GAAKV,EAAUzL,GAOnB,QAASoM,MACL7N,KAAK8N,KAAO9N,KAAK+N,KAAO,KACxB/N,KAAKO,OAAS,EAGlB,QAASyN,IAAWC,EAAKC,GACrBD,EAAI1N,OAAS,EACb0N,EAAIH,KAAOG,EAAIF,KAAOG,EA6E1B,QAASC,IAAMC,EAAQC,EAAaC,GAahC,QAASC,GAAQC,EAAMC,EAAehN,GAClC,GAAgB,MAAZA,GAAwC,kBAAbA,GAC3B,KAAM,IAAIO,OAAM,mCAMpB,IAJA0M,EAAEC,SAAU,EACP7I,GAAQ0I,KACTA,GAAQA,IAEQ,IAAhBA,EAAKjO,QAAgBmO,EAAEE,OAEvB,MAAO1M,IAAe,WAClBwM,EAAEG,SAIV,KAAK,GAAInH,GAAI,EAAGoH,EAAIN,EAAKjO,OAAQmH,EAAIoH,EAAGpH,IAAK,CACzC,GAAII,IACA0G,KAAMA,EAAK9G,GACXjG,SAAUA,GAAYgD,EAGtBgK,GACAC,EAAEK,OAAOC,QAAQlH,GAEjB4G,EAAEK,OAAOtI,KAAKqB,GAIjBmH,IACDA,GAAsB,EACtB/M,GAAe,WACX+M,GAAsB,EACtBP,EAAEQ,aAKd,QAASC,GAAMlC,GACX,MAAO,UAASnL,GACZsN,GAAc,CAEd,KAAK,GAAI1H,GAAI,EAAGoH,EAAI7B,EAAM1M,OAAQmH,EAAIoH,EAAGpH,IAAK,CAC1C,GAAI2H,GAAOpC,EAAMvF,GAEb3C,EAAQ6F,EAAY0E,EAAaD,EAAM,EAC7B,KAAVtK,EACAuK,EAAYC,QACLxK,EAAQ,GACfuK,EAAYE,OAAOzK,EAAO,GAG9BsK,EAAK5N,SAASJ,MAAMgO,EAAMjO,WAEf,MAAPU,GACA4M,EAAEzM,MAAMH,EAAKuN,EAAKb,MAItBY,GAAeV,EAAEL,YAAcK,EAAEe,QACjCf,EAAEgB,cAGFhB,EAAEE,QACFF,EAAEG,QAENH,EAAEQ,WA7EV,GAAmB,MAAfb,EACAA,EAAc,MAEb,IAAmB,IAAhBA,EACJ,KAAM,IAAIrM,OAAM,+BAGpB,IAAI2N,GAAUnN,EAAU4L,GACpBgB,EAAa,EACbE,KAEAL,GAAsB,EAsEtBW,GAAe,EACflB,GACAK,OAAQ,GAAIlB,IACZQ,YAAaA,EACbC,QAASA,EACTuB,UAAWpL,EACXiL,YAAYjL,EACZgL,OAAQpB,EAAc,EACtByB,MAAOrL,EACPoK,MAAOpK,EACPxC,MAAOwC,EACPkK,SAAS,EACToB,QAAQ,EACRtJ,KAAM,SAAU+H,EAAM/M,GAClB8M,EAAQC,GAAM,EAAO/M,IAEzBuO,KAAM,WACFtB,EAAEG,MAAQpK,EACViK,EAAEK,OAAOe,SAEbd,QAAS,SAAUR,EAAM/M,GACrB8M,EAAQC,GAAM,EAAM/M,IAExBwO,OAAQ,SAAUC,GACdxB,EAAEK,OAAOkB,OAAOC,IAEpBhB,QAAS,WAGL,IAAIU,EAAJ,CAIA,IADAA,GAAe,GACRlB,EAAEqB,QAAUX,EAAaV,EAAEL,aAAeK,EAAEK,OAAOxO,QAAO,CAC7D,GAAI0M,MAAYuB,KACZM,EAAIJ,EAAEK,OAAOxO,MACbmO,GAAEJ,UAASQ,EAAIzO,KAAK8P,IAAIrB,EAAGJ,EAAEJ,SACjC,KAAK,GAAI5G,GAAI,EAAGA,EAAIoH,EAAGpH,IAAK,CACxB,GAAIwG,GAAOQ,EAAEK,OAAOQ,OACpBtC,GAAMxG,KAAKyH,GACXoB,EAAY7I,KAAKyH,GACjBM,EAAK/H,KAAKyH,EAAKM,MAGnBY,GAAc,EAEU,IAApBV,EAAEK,OAAOxO,QACTmO,EAAEoB,QAGFV,IAAeV,EAAEL,aACjBK,EAAEmB,WAGN,IAAI9M,GAAKsF,EAAS8G,EAAMlC,GACxB0C,GAAQnB,EAAMzL,GAElB6M,GAAe,IAEnBrP,OAAQ,WACJ,MAAOmO,GAAEK,OAAOxO,QAEpBkI,QAAS,WACL,MAAO2G,IAEXE,YAAa,WACT,MAAOA,IAEXV,KAAM,WACF,MAAOF,GAAEK,OAAOxO,OAAS6O,IAAe,GAE5CgB,MAAO,WACH1B,EAAEqB,QAAS,GAEfM,OAAQ,WACA3B,EAAEqB,UAAW,IACjBrB,EAAEqB,QAAS,EACX7N,GAAewM,EAAEQ,WAGzB,OAAOR,GAgFX,QAAS4B,IAAMlC,EAAQE,GACnB,MAAOH,IAAMC,EAAQ,EAAGE,GA8D5B,QAASiC,IAAO9I,EAAM+I,EAAM1L,EAAUrD,GAClCA,EAAWiD,EAAKjD,GAAYgD,EAC5B,IAAIkF,GAAYnH,EAAUsC,EAC1B2L,IAAahJ,EAAM,SAASiJ,EAAGhJ,EAAGjG,GAC9BkI,EAAU6G,EAAME,EAAG,SAAS5O,EAAK+H,GAC7B2G,EAAO3G,EACPpI,EAASK,MAEd,SAASA,GACRL,EAASK,EAAK0O,KA0CtB,QAASG,MACL,GAAIC,GAAa/F,EAASzJ,UAAWoB,EACrC,OAAO,YACH,GAAIrB,GAAOlB,EAAMmB,WACb0B,EAAO9C,KAEP+C,EAAK5B,EAAKA,EAAKZ,OAAS,EACX,mBAANwC,GACP5B,EAAKwM,MAEL5K,EAAK0B,EAGT8L,GAAOK,EAAYzP,EAAM,SAAS0P,EAAS9P,EAAIgC,GAC3ChC,EAAGM,MAAMyB,EAAM+N,EAAQ7N,OAAO,SAASlB,GACnC,GAAIgP,GAAW7Q,EAAMmB,UAAW,EAChC2B,GAAGjB,EAAKgP,OAGhB,SAAShP,EAAK2H,GACV1G,EAAG1B,MAAMyB,GAAOhB,GAAKkB,OAAOyG,OAsMxC,QAASsH,IAASnQ,GAChB,MAAOA,GAGT,QAASoQ,IAAcC,EAAOC,GAC1B,MAAO,UAASvO,EAAQ6G,EAAK1E,EAAU/B,GACnCA,EAAKA,GAAM0B,CACX,IACI0M,GADAC,GAAa,CAEjBzO,GAAO6G,EAAK,SAAS5I,EAAOgJ,EAAGnI,GAC3BqD,EAASlE,EAAO,SAASkB,EAAKJ,GACtBI,EACAL,EAASK,GACFmP,EAAMvP,KAAYyP,GACzBC,GAAa,EACbD,EAAaD,GAAU,EAAMtQ,GAC7Ba,EAAS,KAAMiH,KAEfjH,OAGT,SAASK,GACJA,EACAiB,EAAGjB,GAEHiB,EAAG,KAAMqO,EAAaD,EAAaD,GAAU,OAM7D,QAASG,IAAexH,EAAG6G,GACvB,MAAOA,GAsFX,QAASY,IAAY9D,GACjB,MAAO,UAAUzM,GACb,GAAII,GAAOlB,EAAMmB,UAAW,EAC5BD,GAAKsF,KAAK,SAAU3E,GAChB,GAAIX,GAAOlB,EAAMmB,UAAW,EACL,iBAAZmQ,WACHzP,EACIyP,QAAQtP,OACRsP,QAAQtP,MAAMH,GAEXyP,QAAQ/D,IACfzD,EAAU5I,EAAM,SAAUuP,GACtBa,QAAQ/D,GAAMkD,QAK9BlO,EAAUzB,GAAIM,MAAM,KAAMF,IAuDlC,QAASqQ,IAASzQ,EAAIwE,EAAM9D,GAKxB,QAASsG,GAAKjG,GACV,GAAIA,EAAK,MAAOL,GAASK,EACzB,IAAIX,GAAOlB,EAAMmB,UAAW,EAC5BD,GAAKsF,KAAKwK,GACVQ,EAAMpQ,MAAMrB,KAAMmB,GAGtB,QAAS8P,GAAMnP,EAAK4P,GAChB,MAAI5P,GAAYL,EAASK,GACpB4P,MACLC,GAAI5J,GADetG,EAAS,MAbhCA,EAAW4G,EAAS5G,GAAYgD,EAChC,IAAIkN,GAAMnP,EAAUzB,GAChB0Q,EAAQjP,EAAU+C,EAetB0L,GAAM,MAAM,GA0BhB,QAASW,IAAS9M,EAAUS,EAAM9D,GAC9BA,EAAW4G,EAAS5G,GAAYgD,EAChC,IAAIkF,GAAYnH,EAAUsC,GACtBiD,EAAO,SAASjG,GAChB,GAAIA,EAAK,MAAOL,GAASK,EACzB,IAAIX,GAAOlB,EAAMmB,UAAW,EAC5B,OAAImE,GAAKlE,MAAMrB,KAAMmB,GAAcwI,EAAU5B,OAC7CtG,GAASJ,MAAM,MAAO,MAAM2B,OAAO7B,IAEvCwI,GAAU5B,GAuBd,QAAS8J,IAAQ/M,EAAUS,EAAM9D,GAC7BmQ,GAAS9M,EAAU,WACf,OAAQS,EAAKlE,MAAMrB,KAAMoB,YAC1BK,GAuCP,QAASqQ,IAAOvM,EAAMxE,EAAIU,GAKtB,QAASsG,GAAKjG,GACV,MAAIA,GAAYL,EAASK,OACzB2P,GAAMR,GAGV,QAASA,GAAMnP,EAAK4P,GAChB,MAAI5P,GAAYL,EAASK,GACpB4P,MACLC,GAAI5J,GADetG,EAAS,MAXhCA,EAAW4G,EAAS5G,GAAYgD,EAChC,IAAIkN,GAAMnP,EAAUzB,GAChB0Q,EAAQjP,EAAU+C,EAatBkM,GAAMR,GAGV,QAASc,IAAcjN,GACnB,MAAO,UAAUlE,EAAOmE,EAAOtD,GAC3B,MAAOqD,GAASlE,EAAOa,IA6D/B,QAASuQ,IAAUvK,EAAM3C,EAAUrD,GAC/B6H,GAAO7B,EAAMsK,GAAcvP,EAAUsC,IAAYrD,GAuBrD,QAASwQ,IAAYxK,EAAMc,EAAOzD,EAAUrD,GACxC6G,EAAaC,GAAOd,EAAMsK,GAAcvP,EAAUsC,IAAYrD,GA2DlE,QAASyQ,IAAYnR,GACjB,MAAIqB,GAAQrB,GAAYA,EACjBS,GAAc,SAAUL,EAAMM,GACjC,GAAI0Q,IAAO,CACXhR,GAAKsF,KAAK,WACN,GAAI2L,GAAYhR,SACZ+Q,GACAjQ,GAAe,WACXT,EAASJ,MAAM,KAAM+Q,KAGzB3Q,EAASJ,MAAM,KAAM+Q,KAG7BrR,EAAGM,MAAMrB,KAAMmB,GACfgR,GAAO,IAIf,QAASE,IAAMxI,GACX,OAAQA,EAmFZ,QAASyI,IAAa/L,GACpB,MAAO,UAASa,GACd,MAAiB,OAAVA,EAAiB7D,OAAY6D,EAAOb,IAI/C,QAASgM,IAAY5P,EAAQ6G,EAAK1E,EAAUrD,GACxC,GAAI+Q,GAAc,GAAI/R,OAAM+I,EAAIjJ,OAChCoC,GAAO6G,EAAK,SAAUkH,EAAG3L,EAAOtD,GAC5BqD,EAAS4L,EAAG,SAAU5O,EAAK+H,GACvB2I,EAAYzN,KAAW8E,EACvBpI,EAASK,MAEd,SAAUA,GACT,GAAIA,EAAK,MAAOL,GAASK,EAEzB,KAAK,GADD2H,MACK/B,EAAI,EAAGA,EAAI8B,EAAIjJ,OAAQmH,IACxB8K,EAAY9K,IAAI+B,EAAQhD,KAAK+C,EAAI9B,GAEzCjG,GAAS,KAAMgI,KAIvB,QAASgJ,IAAc9P,EAAQ8E,EAAM3C,EAAUrD,GAC3C,GAAIgI,KACJ9G,GAAO8E,EAAM,SAAUiJ,EAAG3L,EAAOtD,GAC7BqD,EAAS4L,EAAG,SAAU5O,EAAK+H,GACnB/H,EACAL,EAASK,IAEL+H,GACAJ,EAAQhD,MAAM1B,MAAOA,EAAOnE,MAAO8P,IAEvCjP,QAGT,SAAUK,GACLA,EACAL,EAASK,GAETL,EAAS,KAAMoJ,EAASpB,EAAQiJ,KAAK,SAAUC,EAAGC,GAC9C,MAAOD,GAAE5N,MAAQ6N,EAAE7N,QACnBuN,GAAa,aAK7B,QAASO,IAAQlQ,EAAQ8E,EAAM3C,EAAUrD,GACrC,GAAIqR,GAAStO,EAAYiD,GAAQ8K,GAAcE,EAC/CK,GAAOnQ,EAAQ8E,EAAMjF,EAAUsC,GAAWrD,GAAYgD,GAqG1D,QAASsO,IAAQhS,EAAIiS,GAIjB,QAASjL,GAAKjG,GACV,MAAIA,GAAYkG,EAAKlG,OACrBuN,GAAKtH,GALT,GAAIC,GAAOK,EAAS2K,GAAWvO,GAC3B4K,EAAO7M,EAAU0P,GAAYnR,GAMjCgH,KAiKJ,QAASkL,IAAe/K,EAAKK,EAAOzD,EAAUrD,GAC1CA,EAAWiD,EAAKjD,GAAYgD,EAC5B,IAAIyO,MACAvJ,EAAYnH,EAAUsC,EAC1BiE,GAAYb,EAAKK,EAAO,SAAS4K,EAAK5M,EAAKwB,GACvC4B,EAAUwJ,EAAK5M,EAAK,SAAUzE,EAAKJ,GAC/B,MAAII,GAAYiG,EAAKjG,IACrBoR,EAAO3M,GAAO7E,MACdqG,SAEL,SAAUjG,GACTL,EAASK,EAAKoR,KAwEtB,QAASE,IAAIlL,EAAK3B,GACd,MAAOA,KAAO2B,GAwClB,QAASmL,IAAQtS,EAAIuS,GACjB,GAAI9C,GAAOxM,OAAOuP,OAAO,MACrBC,EAASxP,OAAOuP,OAAO,KAC3BD,GAASA,GAAUvC,EACnB,IAAIY,GAAMnP,EAAUzB,GAChB0S,EAAWjS,GAAc,SAAkBL,EAAMM,GACjD,GAAI8E,GAAM+M,EAAOjS,MAAM,KAAMF,EACzBiS,IAAI5C,EAAMjK,GACVrE,GAAe,WACXT,EAASJ,MAAM,KAAMmP,EAAKjK,MAEvB6M,GAAII,EAAQjN,GACnBiN,EAAOjN,GAAKE,KAAKhF,IAEjB+R,EAAOjN,IAAQ9E,GACfkQ,EAAItQ,MAAM,KAAMF,EAAK6B,OAAO,WACxB,GAAI7B,GAAOlB,EAAMmB,UACjBoP,GAAKjK,GAAOpF,CACZ,IAAIuN,GAAI8E,EAAOjN,SACRiN,GAAOjN,EACd,KAAK,GAAImB,GAAI,EAAGoH,EAAIJ,EAAEnO,OAAQmH,EAAIoH,EAAGpH,IACjCgH,EAAEhH,GAAGrG,MAAM,KAAMF,QAOjC,OAFAsS,GAASjD,KAAOA,EAChBiD,EAASC,WAAa3S,EACf0S,EA8CX,QAASE,IAAUhR,EAAQsK,EAAOxL,GAC9BA,EAAWA,GAAYgD,CACvB,IAAIgF,GAAUjF,EAAYyI,QAE1BtK,GAAOsK,EAAO,SAAUoC,EAAM9I,EAAK9E,GAC/Be,EAAU6M,GAAM,SAAUvN,EAAKJ,GACvBN,UAAUb,OAAS,IACnBmB,EAASzB,EAAMmB,UAAW,IAE9BqI,EAAQlD,GAAO7E,EACfD,EAASK,MAEd,SAAUA,GACTL,EAASK,EAAK2H,KAyEtB,QAASmK,IAAc3G,EAAOxL,GAC1BkS,GAAUrK,GAAQ2D,EAAOxL,GAsB7B,QAASoS,IAAgB5G,EAAO1E,EAAO9G,GACnCkS,GAAUrL,EAAaC,GAAQ0E,EAAOxL,GA+N1C,QAASqS,IAAK7G,EAAOxL,GAEjB,GADAA,EAAWiD,EAAKjD,GAAYgD,IACvBqB,GAAQmH,GAAQ,MAAOxL,GAAS,GAAIsS,WAAU,wDACnD,KAAK9G,EAAM1M,OAAQ,MAAOkB,IAC1B,KAAK,GAAIiG,GAAI,EAAGoH,EAAI7B,EAAM1M,OAAQmH,EAAIoH,EAAGpH,IACrClF,EAAUyK,EAAMvF,IAAIjG,GA0B5B,QAASuS,IAAahK,EAAOwG,EAAM1L,EAAUrD,GACzC,GAAIwS,GAAWhU,EAAM+J,GAAOkK,SAC5B3D,IAAO0D,EAAUzD,EAAM1L,EAAUrD,GA0CrC,QAAS0S,IAAQpT,GACb,GAAI4Q,GAAMnP,EAAUzB,EACpB,OAAOS,IAAc,SAAmBL,EAAMiT,GAe1C,MAdAjT,GAAKsF,KAAK,SAAkBxE,EAAOoS,GAC/B,GAAIpS,EACAmS,EAAgB,MAAQnS,MAAOA,QAC5B,CACH,GAAIrB,EAEAA,GADAQ,UAAUb,QAAU,EACZ8T,EAEApU,EAAMmB,UAAW,GAE7BgT,EAAgB,MAAQxT,MAAOA,OAIhC+Q,EAAItQ,MAAMrB,KAAMmB,KAuE/B,QAASmT,IAAWrH,GAChB,GAAIxD,EASJ,OARI3D,IAAQmH,GACRxD,EAAUoB,EAASoC,EAAOkH,KAE1B1K,KACAY,EAAW4C,EAAO,SAASoC,EAAM9I,GAC7BkD,EAAQlD,GAAO4N,GAAQ/Q,KAAKpD,KAAMqP,MAGnC5F,EAGX,QAAS8K,IAAS5R,EAAQ6G,EAAK1E,EAAUrD,GACrCoR,GAAQlQ,EAAQ6G,EAAK,SAAS5I,EAAOmC,GACjC+B,EAASlE,EAAO,SAASkB,EAAK+H,GAC1B9G,EAAGjB,GAAM+H,MAEdpI,GA2FP,QAAS+S,IAAW5T,GAClB,MAAO,YACL,MAAOA,IAwFX,QAAS6T,IAAMC,EAAMrF,EAAM5N,GASvB,QAASkT,GAAWC,EAAKC,GACrB,GAAiB,gBAANA,GACPD,EAAIE,OAASD,EAAEC,OAASC,EAExBH,EAAII,aAAqC,kBAAfH,GAAEI,SACxBJ,EAAEI,SACFT,IAAYK,EAAEI,UAAYC,GAE9BN,EAAIO,YAAcN,EAAEM,gBACjB,CAAA,GAAiB,gBAANN,IAA+B,gBAANA,GAGvC,KAAM,IAAI7S,OAAM,oCAFhB4S,GAAIE,OAASD,GAAKE,GAqB1B,QAASK,KACLC,EAAM,SAASvT,GACPA,GAAOwT,IAAYC,EAAQT,QACI,kBAAvBS,GAAQJ,aACZI,EAAQJ,YAAYrT,IACxBd,WAAWoU,EAAcG,EAAQP,aAAaM,IAE9C7T,EAASJ,MAAM,KAAMD,aA9CjC,GAAI2T,GAAgB,EAChBG,EAAmB,EAEnBK,GACAT,MAAOC,EACPC,aAAcR,GAAWU,GA2B7B,IARI9T,UAAUb,OAAS,GAAqB,kBAATmU,IAC/BjT,EAAW4N,GAAQ5K,EACnB4K,EAAOqF,IAEPC,EAAWY,EAASb,GACpBjT,EAAWA,GAAYgD,GAGP,kBAAT4K,GACP,KAAM,IAAIrN,OAAM,oCAGpB,IAAIqT,GAAQ7S,EAAU6M,GAElBiG,EAAU,CAadF,KAgHJ,QAASI,IAAOvI,EAAOxL,GACnBkS,GAAUlD,GAAcxD,EAAOxL,GA+HnC,QAASgU,IAAQhO,EAAM3C,EAAUrD,GAY7B,QAASiU,GAAWC,EAAMC,GACtB,GAAIjD,GAAIgD,EAAKE,SAAUjD,EAAIgD,EAAMC,QACjC,OAAOlD,GAAIC,GAAI,EAAKD,EAAIC,EAAI,EAAI,EAbpC,GAAIjJ,GAAYnH,EAAUsC,EAC1BgI,IAAIrF,EAAM,SAAUiJ,EAAGjP,GACnBkI,EAAU+G,EAAG,SAAU5O,EAAK+T,GACxB,MAAI/T,GAAYL,EAASK,OACzBL,GAAS,MAAOb,MAAO8P,EAAGmF,SAAUA,OAEzC,SAAU/T,EAAK2H,GACd,MAAI3H,GAAYL,EAASK,OACzBL,GAAS,KAAMoJ,EAASpB,EAAQiJ,KAAKgD,GAAapD,GAAa,aAkDvE,QAASwD,IAAQrT,EAASsT,EAAcC,GACpC,GAAIjV,GAAKyB,EAAUC,EAEnB,OAAOjB,IAAc,SAAUL,EAAMM,GAIjC,QAASwU,KACL,GAAIzI,GAAO/K,EAAQ+K,MAAQ,YACvBvL,EAAS,GAAID,OAAM,sBAAwBwL,EAAO,eACtDvL,GAAMiU,KAAO,YACTF,IACA/T,EAAM+T,KAAOA,GAEjBG,GAAW,EACX1U,EAASQ,GAXb,GACImU,GADAD,GAAW,CAcfhV,GAAKsF,KAAK,WACD0P,IACD1U,EAASJ,MAAM,KAAMD,WACrBiV,aAAaD,MAKrBA,EAAQpV,WAAWiV,EAAiBF,GACpChV,EAAGM,MAAM,KAAMF,KAmBvB,QAASmV,IAAUnW,EAAOiL,EAAKmL,EAAMrM,GAKnC,IAJA,GAAInF,IAAQ,EACRxE,EAASiW,GAAUC,IAAYrL,EAAMjL,IAAUoW,GAAQ,IAAK,GAC5D7U,EAASjB,MAAMF,GAEZA,KACLmB,EAAOwI,EAAY3J,IAAWwE,GAAS5E,EACvCA,GAASoW,CAEX,OAAO7U,GAmBT,QAASgV,IAAUC,EAAOpO,EAAOzD,EAAUrD,GACvC,GAAIkI,GAAYnH,EAAUsC,EAC1B8R,IAASN,GAAU,EAAGK,EAAO,GAAIpO,EAAOoB,EAAWlI,GA+FvD,QAASwF,IAAWQ,EAAMoP,EAAa/R,EAAUrD,GACzCL,UAAUb,QAAU,IACpBkB,EAAWqD,EACXA,EAAW+R,EACXA,EAAc/Q,GAAQ2B,UAE1BhG,EAAWiD,EAAKjD,GAAYgD,EAC5B,IAAIkF,GAAYnH,EAAUsC,EAE1BwE,IAAO7B,EAAM,SAASoC,EAAGiN,EAAG/T,GACxB4G,EAAUkN,EAAahN,EAAGiN,EAAG/T,IAC9B,SAASjB,GACRL,EAASK,EAAK+U,KAyCtB,QAASE,IAAQ9J,EAAOxL,GACpB,GACIC,GADAO,EAAQ,IAEZR,GAAWA,GAAYgD,EACvBuS,GAAW/J,EAAO,SAASoC,EAAM5N,GAC7Be,EAAU6M,GAAM,SAAUvN,EAAKmV,GAEvBvV,EADAN,UAAUb,OAAS,EACVN,EAAMmB,UAAW,GAEjB6V,EAEbhV,EAAQH,EACRL,GAAUK,MAEf,WACCL,EAASQ,EAAOP,KAiBxB,QAASwV,IAAUnW,GACf,MAAO,YACH,OAAQA,EAAG2S,YAAc3S,GAAIM,MAAM,KAAMD,YAsCjD,QAAS+V,IAAO5R,EAAMT,EAAUrD,GAC5BA,EAAW4G,EAAS5G,GAAYgD,EAChC,IAAIkF,GAAYnH,EAAUsC,EAC1B,KAAKS,IAAQ,MAAO9D,GAAS,KAC7B,IAAIsG,GAAO,SAASjG,GAChB,GAAIA,EAAK,MAAOL,GAASK,EACzB,IAAIyD,IAAQ,MAAOoE,GAAU5B,EAC7B,IAAI5G,GAAOlB,EAAMmB,UAAW,EAC5BK,GAASJ,MAAM,MAAO,MAAM2B,OAAO7B,IAEvCwI,GAAU5B,GAyBd,QAASqP,IAAM7R,EAAMT,EAAUrD,GAC3B0V,GAAO,WACH,OAAQ5R,EAAKlE,MAAMrB,KAAMoB,YAC1B0D,EAAUrD,GA5kKjB,GA8DI4V,IA9DAhW,GAAQ,SAASN,GACjB,GAAII,GAAOlB,EAAMmB,UAAW,EAC5B,OAAO,YACH,GAAIkW,GAAWrX,EAAMmB,UACrB,OAAOL,GAAGM,MAAM,KAAMF,EAAK6B,OAAOsU,MAItC9V,GAAgB,SAAUT,GAC1B,MAAO,YACH,GAAII,GAAOlB,EAAMmB,WACbK,EAAWN,EAAKwM,KACpB5M,GAAGqC,KAAKpD,KAAMmB,EAAMM,KAkCxB8V,GAA0C,kBAAjBC,eAA+BA,aACxDC,GAAiC,gBAAZvI,UAAoD,kBAArBA,SAAQwI,QAkB5DL,IADAE,GACSC,aACFC,GACEvI,QAAQwI,SAER5W,CAGb,IAAIoB,IAAiBjB,EAAKoW,IA2FtBhV,GAAmC,kBAAXC,QA6BxBqV,GAA8B,gBAAVlY,SAAsBA,QAAUA,OAAOuE,SAAWA,QAAUvE,OAGhFmY,GAA0B,gBAARC,OAAoBA,MAAQA,KAAK7T,SAAWA,QAAU6T,KAGxEC,GAAOH,IAAcC,IAAYG,SAAS,iBAG1CC,GAAWF,GAAKxV,OAGhB2V,GAAcjU,OAAO8C,UAGrB3D,GAAiB8U,GAAY9U,eAO7BM,GAAuBwU,GAAY9L,SAGnC9I,GAAmB2U,GAAWA,GAASzV,YAAcgB,OA8BrD2U,GAAgBlU,OAAO8C,UAOvBnD,GAAyBuU,GAAc/L,SAcvCrI,GAAU,gBACVD,GAAe,qBAGfE,GAAiBiU,GAAWA,GAASzV,YAAcgB,OAmBnDa,GAAW,yBACXF,GAAU,oBACVC,GAAS,6BACTE,GAAW,iBA8BXE,GAAmB,iBAgEnBmE,MA2BAyP,GAAmC,kBAAX7V,SAAyBA,OAAOuF,SAExDO,GAAc,SAAUX,GACxB,MAAO0Q,KAAkB1Q,EAAK0Q,KAAmB1Q,EAAK0Q,OAmDtDjT,GAAU,qBAcVkT,GAAgBpU,OAAO8C,UAGvBuR,GAAmBD,GAAcjV,eAGjCmV,GAAuBF,GAAcE,qBAoBrCtS,GAAcf,EAAgB,WAAa,MAAO7D,eAAkB6D,EAAkB,SAASrE,GACjG,MAAOoE,GAAapE,IAAUyX,GAAiBjV,KAAKxC,EAAO,YACxD0X,GAAqBlV,KAAKxC,EAAO,WA0BlCkF,GAAUrF,MAAMqF,QAoBhByS,GAAgC,gBAAX5Y,IAAuBA,IAAYA,EAAQ6Y,UAAY7Y,EAG5E8Y,GAAaF,IAAgC,gBAAV3Y,SAAsBA,SAAWA,OAAO4Y,UAAY5Y,OAGvF8Y,GAAgBD,IAAcA,GAAW9Y,UAAY4Y,GAGrDI,GAASD,GAAgBZ,GAAKa,OAASpV,OAGvCqV,GAAiBD,GAASA,GAAOzS,SAAW3C,OAmB5C2C,GAAW0S,IAAkBzT,EAG7BE,GAAqB,iBAGrBC,GAAW,mBAqBXuT,GAAY,qBACZC,GAAW,iBACXC,GAAU,mBACVC,GAAU,gBACVC,GAAW,iBACXC,GAAY,oBACZC,GAAS,eACTC,GAAY,kBACZC,GAAY,kBACZC,GAAY,kBACZC,GAAS,eACTC,GAAY,kBACZC,GAAa,mBAEbC,GAAiB,uBACjBC,GAAc,oBACdC,GAAa,wBACbC,GAAa,wBACbC,GAAU,qBACVC,GAAW,sBACXC,GAAW,sBACXC,GAAW,sBACXC,GAAkB,6BAClBC,GAAY,uBACZC,GAAY,uBAGZ3U,KACJA,IAAemU,IAAcnU,GAAeoU,IAC5CpU,GAAeqU,IAAWrU,GAAesU,IACzCtU,GAAeuU,IAAYvU,GAAewU,IAC1CxU,GAAeyU,IAAmBzU,GAAe0U,IACjD1U,GAAe2U,KAAa,EAC5B3U,GAAeoT,IAAapT,GAAeqT,IAC3CrT,GAAeiU,IAAkBjU,GAAesT,IAChDtT,GAAekU,IAAelU,GAAeuT,IAC7CvT,GAAewT,IAAYxT,GAAeyT,IAC1CzT,GAAe0T,IAAU1T,GAAe2T,IACxC3T,GAAe4T,IAAa5T,GAAe6T,IAC3C7T,GAAe8T,IAAU9T,GAAe+T,IACxC/T,GAAegU,KAAc,CA4B7B,IAAIY,IAAkC,gBAAX1a,IAAuBA,IAAYA,EAAQ6Y,UAAY7Y,EAG9E2a,GAAeD,IAAkC,gBAAVza,SAAsBA,SAAWA,OAAO4Y,UAAY5Y,OAG3F2a,GAAkBD,IAAgBA,GAAa3a,UAAY0a,GAG3DG,GAAcD,IAAmB5C,GAAWzI,QAG5CuL,GAAY,WACd,IAEE,GAAIC,GAAQJ,IAAgBA,GAAaK,SAAWL,GAAaK,QAAQ,QAAQD,KAEjF,OAAIA,GACKA,EAIFF,IAAeA,GAAYI,SAAWJ,GAAYI,QAAQ,QACjE,MAAOjZ,QAIPkZ,GAAmBJ,IAAYA,GAASrU,aAmBxCA,GAAeyU,GAAmBnV,EAAUmV,IAAoBrV,EAGhEsV,GAAgB9W,OAAO8C,UAGvBN,GAAmBsU,GAAc3X,eAsCjC4D,GAAgB/C,OAAO8C,UA+BvBO,GAAaL,EAAQhD,OAAOuD,KAAMvD,QAGlC+W,GAAgB/W,OAAO8C,UAGvBQ,GAAmByT,GAAc5X,eA6MjC6X,GAAgBhS,EAAQD,EAAakS,EAAAA,GAyCrC3R,GAAS,SAAS7B,EAAM3C,EAAUrD,GAClC,GAAIyZ,GAAuB1W,EAAYiD,GAAQyB,EAAkB8R,EACjEE,GAAqBzT,EAAMjF,EAAUsC,GAAWrD,IA+DhDqL,GAAMzD,EAAWE,GAmCjB4R,GAAYzY,EAAYoK,IA2BxB8J,GAAW9M,EAAgBP,GAoB3B6R,GAAYpS,EAAQ4N,GAAU,GAqB9ByE,GAAkB3Y,EAAY0Y,IA0D9B9Q,GAAUL,IAoKV2D,GAAO,SAAUX,EAAOoB,EAAa5M,GAiErC,QAAS6Z,GAAY/U,EAAK8I,GACtBkM,EAAW9U,KAAK,WACZ+U,EAAQjV,EAAK8I,KAIrB,QAASoM,KACL,GAA0B,IAAtBF,EAAWhb,QAAiC,IAAjBmb,EAC3B,MAAOja,GAAS,KAAMgI,EAE1B,MAAM8R,EAAWhb,QAAUmb,EAAerN,GAAa,CACnD,GAAIsN,GAAMJ,EAAWhM,OACrBoM,MAKR,QAASC,GAAYC,EAAU9a,GAC3B,GAAI+a,GAAgBC,EAAUF,EACzBC,KACDA,EAAgBC,EAAUF,OAG9BC,EAAcrV,KAAK1F,GAGvB,QAASib,GAAaH,GAClB,GAAIC,GAAgBC,EAAUF,MAC9B9R,GAAU+R,EAAe,SAAU/a,GAC/BA,MAEJ0a,IAIJ,QAASD,GAAQjV,EAAK8I,GAClB,IAAI4M,EAAJ,CAEA,GAAIC,GAAe7T,EAAS,SAASvG,EAAKJ,GAKtC,GAJAga,IACIta,UAAUb,OAAS,IACnBmB,EAASzB,EAAMmB,UAAW,IAE1BU,EAAK,CACL,GAAIqa,KACJ9R,GAAWZ,EAAS,SAAS0J,EAAKiJ,GAC9BD,EAAYC,GAAQjJ,IAExBgJ,EAAY5V,GAAO7E,EACnBua,GAAW,EACXF,EAAY/X,OAAOuP,OAAO,MAE1B9R,EAASK,EAAKqa,OAEd1S,GAAQlD,GAAO7E,EACfsa,EAAazV,IAIrBmV,IACA,IAAIvO,GAAS3K,EAAU6M,EAAKA,EAAK9O,OAAS,GACtC8O,GAAK9O,OAAS,EACd4M,EAAO1D,EAASyS,GAEhB/O,EAAO+O,IAIf,QAASG,KAML,IAFA,GAAIC,GACA5S,EAAU,EACP6S,EAAahc,QAChB+b,EAAcC,EAAa5O,MAC3BjE,IACAK,EAAUyS,EAAcF,GAAc,SAAUG,GACD,MAArCC,EAAsBD,IACxBF,EAAa9V,KAAKgW,IAK9B,IAAI/S,IAAYiT,EACZ,KAAM,IAAI3a,OACN,iEAKZ,QAASwa,GAAcX,GACnB,GAAIna,KAMJ,OALA2I,GAAW4C,EAAO,SAAUoC,EAAM9I,GAC1BT,GAAQuJ,IAASzE,EAAYyE,EAAMwM,EAAU,IAAM,GACnDna,EAAO+E,KAAKF,KAGb7E,EAlKgB,kBAAhB2M,KAEP5M,EAAW4M,EACXA,EAAc,MAElB5M,EAAWiD,EAAKjD,GAAYgD,EAC5B,IAAImY,GAAUrV,EAAK0F,GACf0P,EAAWC,EAAQrc,MACvB,KAAKoc,EACD,MAAOlb,GAAS,KAEf4M,KACDA,EAAcsO,EAGlB,IAAIlT,MACAiS,EAAe,EACfO,GAAW,EAEXF,EAAY/X,OAAOuP,OAAO,MAE1BgI,KAGAgB,KAEAG,IAEJrS,GAAW4C,EAAO,SAAUoC,EAAM9I,GAC9B,IAAKT,GAAQuJ,GAIT,MAFAiM,GAAY/U,GAAM8I,QAClBkN,GAAa9V,KAAKF,EAItB,IAAIsW,GAAexN,EAAKpP,MAAM,EAAGoP,EAAK9O,OAAS,GAC3Cuc,EAAwBD,EAAatc,MACzC,OAA8B,KAA1Buc,GACAxB,EAAY/U,EAAK8I,OACjBkN,GAAa9V,KAAKF,KAGtBmW,EAAsBnW,GAAOuW,MAE7B/S,GAAU8S,EAAc,SAAUE,GAC9B,IAAK9P,EAAM8P,GACP,KAAM,IAAI/a,OAAM,oBAAsBuE,EAClC,oCACAwW,EAAiB,QACjBF,EAAapQ,KAAK,MAE1BmP,GAAYmB,EAAgB,WACxBD,IAC8B,IAA1BA,GACAxB,EAAY/U,EAAK8I,UAMjCgN,IACAZ,KA6HA1Q,GAAY,kBAyBZG,GAAW,EAAI,EAGf8R,GAAchF,GAAWA,GAASlR,UAAYvD,OAC9C0H,GAAiB+R,GAAcA,GAAY7Q,SAAW5I,OAoHtD0Z,GAAgB,kBAChBC,GAAoB,kBACpBC,GAAwB,kBACxBC,GAAsB,kBACtBC,GAAeH,GAAoBC,GAAwBC,GAC3DE,GAAa,iBAGbC,GAAQ,UAGRzR,GAAe0R,OAAO,IAAMD,GAAQN,GAAiBI,GAAeC,GAAa,KAcjFG,GAAkB,kBAClBC,GAAsB,kBACtBC,GAA0B,kBAC1BC,GAAwB,kBACxBC,GAAiBH,GAAsBC,GAA0BC,GACjEE,GAAe,iBAGfC,GAAW,IAAMN,GAAkB,IACnCO,GAAU,IAAMH,GAAiB,IACjCI,GAAS,2BACTC,GAAa,MAAQF,GAAU,IAAMC,GAAS,IAC9CE,GAAc,KAAOV,GAAkB,IACvCW,GAAa,kCACbC,GAAa,qCACbC,GAAU,UAGVC,GAAWL,GAAa,IACxBM,GAAW,IAAMV,GAAe,KAChCW,GAAY,MAAQH,GAAU,OAASH,GAAaC,GAAYC,IAAY5R,KAAK,KAAO,IAAM+R,GAAWD,GAAW,KACpHG,GAAQF,GAAWD,GAAWE,GAC9BE,GAAW,OAASR,GAAcH,GAAU,IAAKA,GAASI,GAAYC,GAAYN,IAAUtR,KAAK,KAAO,IAGxGR,GAAYuR,OAAOS,GAAS,MAAQA,GAAS,KAAOU,GAAWD,GAAO,KAoDtElS,GAAS,aAwCTI,GAAU,qDACVC,GAAe,IACfE,GAAS,eACTJ,GAAiB,kCAsJrBkB,IAAI/G,UAAU8X,WAAa,SAAS1Q,GAQhC,MAPIA,GAAK2Q,KAAM3Q,EAAK2Q,KAAK9W,KAAOmG,EAAKnG,KAChC/H,KAAK8N,KAAOI,EAAKnG,KAClBmG,EAAKnG,KAAMmG,EAAKnG,KAAK8W,KAAO3Q,EAAK2Q,KAChC7e,KAAK+N,KAAOG,EAAK2Q,KAEtB3Q,EAAK2Q,KAAO3Q,EAAKnG,KAAO,KACxB/H,KAAKO,QAAU,EACR2N,GAGXL,GAAI/G,UAAUgJ,MAAQ,WAClB,KAAM9P,KAAK8N,MAAM9N,KAAKuP,OACtB,OAAOvP,OAGX6N,GAAI/G,UAAUgY,YAAc,SAAS5Q,EAAM6Q,GACvCA,EAAQF,KAAO3Q,EACf6Q,EAAQhX,KAAOmG,EAAKnG,KAChBmG,EAAKnG,KAAMmG,EAAKnG,KAAK8W,KAAOE,EAC3B/e,KAAK+N,KAAOgR,EACjB7Q,EAAKnG,KAAOgX,EACZ/e,KAAKO,QAAU,GAGnBsN,GAAI/G,UAAUkY,aAAe,SAAS9Q,EAAM6Q,GACxCA,EAAQF,KAAO3Q,EAAK2Q,KACpBE,EAAQhX,KAAOmG,EACXA,EAAK2Q,KAAM3Q,EAAK2Q,KAAK9W,KAAOgX,EAC3B/e,KAAK8N,KAAOiR,EACjB7Q,EAAK2Q,KAAOE,EACZ/e,KAAKO,QAAU,GAGnBsN,GAAI/G,UAAUkI,QAAU,SAASd,GACzBlO,KAAK8N,KAAM9N,KAAKgf,aAAahf,KAAK8N,KAAMI,GACvCF,GAAWhO,KAAMkO,IAG1BL,GAAI/G,UAAUL,KAAO,SAASyH,GACtBlO,KAAK+N,KAAM/N,KAAK8e,YAAY9e,KAAK+N,KAAMG,GACtCF,GAAWhO,KAAMkO,IAG1BL,GAAI/G,UAAUyI,MAAQ,WAClB,MAAOvP,MAAK8N,MAAQ9N,KAAK4e,WAAW5e,KAAK8N,OAG7CD,GAAI/G,UAAU6G,IAAM,WAChB,MAAO3N,MAAK+N,MAAQ/N,KAAK4e,WAAW5e,KAAK+N,OAG7CF,GAAI/G,UAAUmY,QAAU,WAGpB,IAAI,GAFAzV,GAAM/I,MAAMT,KAAKO,QACjB2e,EAAOlf,KAAK8N,KACRpN,EAAM,EAAGA,EAAMV,KAAKO,OAAQG,IAChC8I,EAAI9I,GAAOwe,EAAK1Q,KAChB0Q,EAAOA,EAAKnX,IAEhB,OAAOyB,IAGXqE,GAAI/G,UAAUmJ,OAAS,SAAUC,GAE7B,IADA,GAAIgP,GAAOlf,KAAK8N,KACRoR,GAAM,CACV,GAAInX,GAAOmX,EAAKnX,IACZmI,GAAOgP,IACPlf,KAAK4e,WAAWM,GAEpBA,EAAOnX,EAEX,MAAO/H,MA0QX,IAi3CImf,IAj3CA1O,GAAezH,EAAQD,EAAa,GAyJpCqW,GAAU,WACV,MAAOzO,IAAItP,MAAM,KAAMpB,EAAMmB,WAAW8S,YAGxCmL,GAAU5e,MAAMqG,UAAU9D,OAoB1Bsc,GAAc,SAAS7X,EAAMc,EAAOzD,EAAUrD,GAC9CA,EAAWA,GAAYgD,CACvB,IAAIkF,GAAYnH,EAAUsC,EAC1B8R,IAASnP,EAAMc,EAAO,SAAS4K,EAAK1R,GAChCkI,EAAUwJ,EAAK,SAASrR,GACpB,MAAIA,GAAYL,EAASK,GAClBL,EAAS,KAAMxB,EAAMmB,UAAW,OAE5C,SAASU,EAAKyd,GAEb,IAAK,GADD7d,MACKgG,EAAI,EAAGA,EAAI6X,EAAWhf,OAAQmH,IAC/B6X,EAAW7X,KACXhG,EAAS2d,GAAQhe,MAAMK,EAAQ6d,EAAW7X,IAIlD,OAAOjG,GAASK,EAAKJ,MA6BzBsB,GAASgG,EAAQsW,GAAarE,EAAAA,GAoB9BuE,GAAexW,EAAQsW,GAAa,GA4CpCG,GAAW,WACX,GAAIC,GAASzf,EAAMmB,WACfD,GAAQ,MAAM6B,OAAO0c,EACzB,OAAO,YACH,GAAIje,GAAWL,UAAUA,UAAUb,OAAS,EAC5C,OAAOkB,GAASJ,MAAMrB,KAAMmB,KA0FhCwe,GAAStW,EAAW2H,GAAcD,GAAUM,KAwB5CuO,GAAc9V,EAAgBkH,GAAcD,GAAUM,KAsBtDwO,GAAe7W,EAAQ4W,GAAa,GAoDpCE,GAAMxO,GAAY,OA6QlB0F,GAAahO,EAAQiJ,GAAa,GAwFlC8N,GAAQ1W,EAAW2H,GAAcqB,GAAOA,KAsBxC2N,GAAalW,EAAgBkH,GAAcqB,GAAOA,KAqBlD4N,GAAcjX,EAAQgX,GAAY,GAwFlClN,GAASzJ,EAAWwJ,IAqBpBqN,GAAcpW,EAAgB+I,IAmB9BsN,GAAenX,EAAQkX,GAAa,GA6DpCE,GAAe,SAAS3Y,EAAMc,EAAOzD,EAAUrD,GAC/CA,EAAWA,GAAYgD,CACvB,IAAIkF,GAAYnH,EAAUsC,EAC1B8R,IAASnP,EAAMc,EAAO,SAAS4K,EAAK1R,GAChCkI,EAAUwJ,EAAK,SAASrR,EAAKyE,GACzB,MAAIzE,GAAYL,EAASK,GAClBL,EAAS,MAAO8E,IAAKA,EAAK4M,IAAKA,OAE3C,SAASrR,EAAKyd,GAKb,IAAK,GAJD7d,MAEAyB,EAAiBa,OAAO8C,UAAU3D,eAE7BuE,EAAI,EAAGA,EAAI6X,EAAWhf,OAAQmH,IACnC,GAAI6X,EAAW7X,GAAI,CACf,GAAInB,GAAMgZ,EAAW7X,GAAGnB,IACpB4M,EAAMoM,EAAW7X,GAAGyL,GAEpBhQ,GAAeC,KAAK1B,EAAQ6E,GAC5B7E,EAAO6E,GAAKE,KAAK0M,GAEjBzR,EAAO6E,IAAQ4M,GAK3B,MAAO1R,GAASK,EAAKJ,MAwCzB2e,GAAUrX,EAAQoX,GAAcnF,EAAAA,GAqBhCqF,GAAgBtX,EAAQoX,GAAc,GA6BtCG,GAAMjP,GAAY,OAmFlBkP,GAAYxX,EAAQiK,GAAgBgI,EAAAA,GAqBpCwF,GAAkBzX,EAAQiK,GAAgB,EA4G1CkM,IADA1H,GACWvI,QAAQwI,SACZH,GACIC,aAEA1W,CAGf,IAAI4W,IAAWzW,EAAKke,IA4NhBuB,GAAU,SAAUtS,EAAQC,GAC5B,GAAIsB,GAAUnN,EAAU4L,EACxB,OAAOD,IAAM,SAAUwS,EAAO5d,GAC1B4M,EAAQgR,EAAM,GAAI5d,IACnBsL,EAAa,IA0BhBuS,GAAgB,SAASxS,EAAQC,GAEjC,GAAIK,GAAIgS,GAAQtS,EAAQC,EA4CxB,OAzCAK,GAAEjI,KAAO,SAAS+H,EAAMqS,EAAUpf,GAE9B,GADgB,MAAZA,IAAkBA,EAAWgD,GACT,kBAAbhD,GACP,KAAM,IAAIO,OAAM,mCAMpB,IAJA0M,EAAEC,SAAU,EACP7I,GAAQ0I,KACTA,GAAQA,IAEQ,IAAhBA,EAAKjO,OAEL,MAAO2B,IAAe,WAClBwM,EAAEG,SAIVgS,GAAWA,GAAY,CAEvB,KADA,GAAIC,GAAWpS,EAAEK,OAAOjB,KACjBgT,GAAYD,GAAYC,EAASD,UACpCC,EAAWA,EAAS/Y,IAGxB,KAAK,GAAIL,GAAI,EAAGoH,EAAIN,EAAKjO,OAAQmH,EAAIoH,EAAGpH,IAAK,CACzC,GAAII,IACA0G,KAAMA,EAAK9G,GACXmZ,SAAUA,EACVpf,SAAUA,EAGVqf,GACApS,EAAEK,OAAOiQ,aAAa8B,EAAUhZ,GAEhC4G,EAAEK,OAAOtI,KAAKqB,GAGtB5F,GAAewM,EAAEQ,gBAIdR,GAAEM,QAEFN,GA0PPqS,GAAS1X,EAAWkL,IAqBpByM,GAAclX,EAAgByK,IAmB9B0M,GAAejY,EAAQgY,GAAa,GAkMpCE,GAAY,SAAUxM,EAAMrF,GACvBA,IACDA,EAAOqF,EACPA,EAAO,KAEX,IAAIW,GAAQ7S,EAAU6M,EACtB,OAAO7N,IAAc,SAAUL,EAAMM,GACjC,QAAS0L,GAAOpK,GACZsS,EAAMhU,MAAM,KAAMF,EAAK6B,OAAOD,IAG9B2R,EAAMD,GAAMC,EAAMvH,EAAQ1L,GACzBgT,GAAMtH,EAAQ1L,MAuGvB0f,GAAO9X,EAAW2H,GAAcoQ,QAASrQ,KAuBzCsQ,GAAYvX,EAAgBkH,GAAcoQ,QAASrQ,KAsBnDuQ,GAAatY,EAAQqY,GAAW,GA4IhC5K,GAAapW,KAAKkhB,KAClB/K,GAAYnW,KAAKC,IA8EjBwU,GAAQ9L,EAAQ0N,GAAWuE,EAAAA,GAgB3BuG,GAAcxY,EAAQ0N,GAAW,GA2QjC+K,GAAY,SAASxU,EAAOxL,GAM5B,QAASigB,GAASvgB,GACd,GAAIkO,GAAO7M,EAAUyK,EAAM0U,KAC3BxgB,GAAKsF,KAAK4B,EAASN,IACnBsH,EAAKhO,MAAM,KAAMF,GAGrB,QAAS4G,GAAKjG,GACV,MAAIA,IAAO6f,IAAc1U,EAAM1M,OACpBkB,EAASJ,MAAM,KAAMD,eAEhCsgB,GAASzhB,EAAMmB,UAAW,IAd9B,GADAK,EAAWiD,EAAKjD,GAAYgD,IACvBqB,GAAQmH,GAAQ,MAAOxL,GAAS,GAAIO,OAAM,6DAC/C,KAAKiL,EAAM1M,OAAQ,MAAOkB,IAC1B,IAAIkgB,GAAY,CAehBD,QAoEA3c,IACA1D,MAAOA,GACP8Z,UAAWA,GACXE,gBAAiBA,GACjB/Z,SAAUA,EACVsM,KAAMA,GACNZ,WAAYA,GACZsD,MAAOA,GACP8O,QAASA,GACTpc,OAAQA,GACRsc,YAAaA,GACbE,aAAcA,GACdC,SAAUA,GACVE,OAAQA,GACRC,YAAaA,GACbC,aAAcA,GACdC,IAAKA,GACLtO,SAAUA,GACVK,QAASA,GACTD,SAAUA,GACVE,OAAQA,GACR8P,KAAM5P,GACNA,UAAWC,GACX3I,OAAQA,GACRP,YAAaA,EACb0H,aAAcA,GACduG,WAAYA,GACZ9E,YAAaA,GACb6N,MAAOA,GACPC,WAAYA,GACZC,YAAaA,GACbnN,OAAQA,GACRoN,YAAaA,GACbC,aAAcA,GACdpN,QAASA,GACTsN,QAASA,GACTD,aAAcA,GACdE,cAAeA,GACfC,IAAKA,GACLzT,IAAKA,GACL8J,SAAUA,GACVwE,UAAWA,GACXoF,UAAWA,GACXvN,eAAgBA,GAChBwN,gBAAiBA,GACjBpN,QAASA,GACTqE,SAAUA,GACVmK,SAAUjO,GACVA,cAAeC,GACf+M,cAAeA,GACfzS,MAAOuS,GACP5M,KAAMA,GACNvD,OAAQA,GACRyD,YAAaA,GACbG,QAASA,GACTG,WAAYA,GACZyM,OAAQA,GACRC,YAAaA,GACbC,aAAcA,GACdxM,MAAOA,GACPyM,UAAWA,GACXvQ,IAAKA,GACL6E,OAAQA,GACRgC,aAActV,GACdif,KAAMA,GACNE,UAAWA,GACXC,WAAYA,GACZ7L,OAAQA,GACRK,QAASA,GACThB,MAAOA,GACPgN,WAAYpL,GACZ8K,YAAaA,GACbva,UAAWA,GACX8P,QAASA,GACTG,UAAWA,GACXE,MAAOA,GACPqK,UAAWA,GACXtK,OAAQA,GAGR4K,IAAKhC,GACLiC,SAAUhC,GACViC,UAAWhC,GACXiC,IAAKf,GACLgB,SAAUd,GACVe,UAAWd,GACXe,KAAM1C,GACN2C,UAAW1C,GACX2C,WAAY1C,GACZ2C,QAASxQ,GACTyQ,cAAezL,GACf0L,aAAczQ,GACd0Q,UAAWrZ,GACXsZ,gBAAiBnS,GACjBoS,eAAgB9Z,EAChB+Z,OAAQvS,GACRwS,MAAOxS,GACPyS,MAAOhP,GACPiP,OAAQnQ,GACRoQ,YAAahD,GACbiD,aAAchD,GACdiD,SAAU9hB,EAGd3B,GAAiB,QAAIoF,GACrBpF,EAAQ0B,MAAQA,GAChB1B,EAAQwb,UAAYA,GACpBxb,EAAQ0b,gBAAkBA,GAC1B1b,EAAQ2B,SAAWA,EACnB3B,EAAQiO,KAAOA,GACfjO,EAAQqN,WAAaA,GACrBrN,EAAQ2Q,MAAQA,GAChB3Q,EAAQyf,QAAUA,GAClBzf,EAAQqD,OAASA,GACjBrD,EAAQ2f,YAAcA,GACtB3f,EAAQ6f,aAAeA,GACvB7f,EAAQ8f,SAAWA,GACnB9f,EAAQggB,OAASA,GACjBhgB,EAAQigB,YAAcA,GACtBjgB,EAAQkgB,aAAeA,GACvBlgB,EAAQmgB,IAAMA,GACdngB,EAAQ6R,SAAWA,GACnB7R,EAAQkS,QAAUA,GAClBlS,EAAQiS,SAAWA,GACnBjS,EAAQmS,OAASA,GACjBnS,EAAQiiB,KAAO5P,GACfrS,EAAQqS,UAAYC,GACpBtS,EAAQ2J,OAASA,GACjB3J,EAAQoJ,YAAcA,EACtBpJ,EAAQ8Q,aAAeA,GACvB9Q,EAAQqX,WAAaA,GACrBrX,EAAQuS,YAAcA,GACtBvS,EAAQogB,MAAQA,GAChBpgB,EAAQqgB,WAAaA,GACrBrgB,EAAQsgB,YAAcA,GACtBtgB,EAAQmT,OAASA,GACjBnT,EAAQugB,YAAcA,GACtBvgB,EAAQwgB,aAAeA,GACvBxgB,EAAQoT,QAAUA,GAClBpT,EAAQ0gB,QAAUA,GAClB1gB,EAAQygB,aAAeA,GACvBzgB,EAAQ2gB,cAAgBA,GACxB3gB,EAAQ4gB,IAAMA,GACd5gB,EAAQmN,IAAMA,GACdnN,EAAQiX,SAAWA,GACnBjX,EAAQyb,UAAYA,GACpBzb,EAAQ6gB,UAAYA,GACpB7gB,EAAQsT,eAAiBA,GACzBtT,EAAQ8gB,gBAAkBA,GAC1B9gB,EAAQ0T,QAAUA,GAClB1T,EAAQ+X,SAAWA,GACnB/X,EAAQkiB,SAAWjO,GACnBjU,EAAQiU,cAAgBC,GACxBlU,EAAQihB,cAAgBA,GACxBjhB,EAAQwO,MAAQuS,GAChB/gB,EAAQmU,KAAOA,GACfnU,EAAQ4Q,OAASA,GACjB5Q,EAAQqU,YAAcA,GACtBrU,EAAQwU,QAAUA,GAClBxU,EAAQ2U,WAAaA,GACrB3U,EAAQohB,OAASA,GACjBphB,EAAQqhB,YAAcA,GACtBrhB,EAAQshB,aAAeA,GACvBthB,EAAQ8U,MAAQA,GAChB9U,EAAQuhB,UAAYA,GACpBvhB,EAAQgR,IAAMA,GACdhR,EAAQ6V,OAASA,GACjB7V,EAAQ6X,aAAetV,GACvBvC,EAAQwhB,KAAOA,GACfxhB,EAAQ0hB,UAAYA,GACpB1hB,EAAQ2hB,WAAaA,GACrB3hB,EAAQ8V,OAASA,GACjB9V,EAAQmW,QAAUA,GAClBnW,EAAQmV,MAAQA,GAChBnV,EAAQmiB,WAAapL,GACrB/W,EAAQ6hB,YAAcA,GACtB7hB,EAAQsH,UAAYA,GACpBtH,EAAQoX,QAAUA,GAClBpX,EAAQuX,UAAYA,GACpBvX,EAAQyX,MAAQA,GAChBzX,EAAQ8hB,UAAYA,GACpB9hB,EAAQwX,OAASA,GACjBxX,EAAQoiB,IAAMhC,GACdpgB,EAAQqiB,SAAWhC,GACnBrgB,EAAQsiB,UAAYhC,GACpBtgB,EAAQuiB,IAAMf,GACdxhB,EAAQwiB,SAAWd,GACnB1hB,EAAQyiB,UAAYd,GACpB3hB,EAAQ0iB,KAAO1C,GACfhgB,EAAQ2iB,UAAY1C,GACpBjgB,EAAQ4iB,WAAa1C,GACrBlgB,EAAQ6iB,QAAUxQ,GAClBrS,EAAQ8iB,cAAgBzL,GACxBrX,EAAQ+iB,aAAezQ,GACvBtS,EAAQgjB,UAAYrZ,GACpB3J,EAAQijB,gBAAkBnS,GAC1B9Q,EAAQkjB,eAAiB9Z,EACzBpJ,EAAQmjB,OAASvS,GACjB5Q,EAAQojB,MAAQxS,GAChB5Q,EAAQqjB,MAAQhP,GAChBrU,EAAQsjB,OAASnQ,GACjBnT,EAAQujB,YAAchD,GACtBvgB,EAAQwjB,aAAehD,GACvBxgB,EAAQyjB,SAAW9hB,EAEnB0C,OAAOqf,eAAe1jB,EAAS,cAAgBiB,OAAO\",\"file\":\"build/dist/async.min.js\"}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/doDuring.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = doDuring;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The post-check version of [`during`]{@link module:ControlFlow.during}. To reflect the difference in\n * the order of operations, the arguments `test` and `fn` are switched.\n *\n * Also a version of [`doWhilst`]{@link module:ControlFlow.doWhilst} with asynchronous `test` function.\n * @name doDuring\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.during]{@link module:ControlFlow.during}\n * @category Control Flow\n * @param {AsyncFunction} fn - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {AsyncFunction} test - asynchronous truth test to perform before each\n * execution of `fn`. Invoked with (...args, callback), where `...args` are the\n * non-error args from the previous callback of `fn`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `fn` has stopped. `callback`\n * will be passed an error if one occurred, otherwise `null`.\n */\nfunction doDuring(fn, test, callback) {\n    callback = (0, _onlyOnce2.default)(callback || _noop2.default);\n    var _fn = (0, _wrapAsync2.default)(fn);\n    var _test = (0, _wrapAsync2.default)(test);\n\n    function next(err /*, ...args*/) {\n        if (err) return callback(err);\n        var args = (0, _slice2.default)(arguments, 1);\n        args.push(check);\n        _test.apply(this, args);\n    };\n\n    function check(err, truth) {\n        if (err) return callback(err);\n        if (!truth) return callback(null);\n        _fn(next);\n    }\n\n    check(null, true);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/doUntil.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = doUntil;\n\nvar _doWhilst = require('./doWhilst');\n\nvar _doWhilst2 = _interopRequireDefault(_doWhilst);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the\n * argument ordering differs from `until`.\n *\n * @name doUntil\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.doWhilst]{@link module:ControlFlow.doWhilst}\n * @category Control Flow\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` fails. Invoked with (callback).\n * @param {Function} test - synchronous truth test to perform after each\n * execution of `iteratee`. Invoked with any non-error callback results of\n * `iteratee`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has passed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n */\nfunction doUntil(iteratee, test, callback) {\n    (0, _doWhilst2.default)(iteratee, function () {\n        return !test.apply(this, arguments);\n    }, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/doWhilst.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = doWhilst;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in\n * the order of operations, the arguments `test` and `iteratee` are switched.\n *\n * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n *\n * @name doWhilst\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {AsyncFunction} iteratee - A function which is called each time `test`\n * passes. Invoked with (callback).\n * @param {Function} test - synchronous truth test to perform after each\n * execution of `iteratee`. Invoked with any non-error callback results of\n * `iteratee`.\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `iteratee` has stopped.\n * `callback` will be passed an error and any arguments passed to the final\n * `iteratee`'s callback. Invoked with (err, [results]);\n */\nfunction doWhilst(iteratee, test, callback) {\n    callback = (0, _onlyOnce2.default)(callback || _noop2.default);\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    var next = function (err /*, ...args*/) {\n        if (err) return callback(err);\n        var args = (0, _slice2.default)(arguments, 1);\n        if (test.apply(this, args)) return _iteratee(next);\n        callback.apply(null, [null].concat(args));\n    };\n    _iteratee(next);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/during.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = during;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Like [`whilst`]{@link module:ControlFlow.whilst}, except the `test` is an asynchronous function that\n * is passed a callback in the form of `function (err, truth)`. If error is\n * passed to `test` or `fn`, the main callback is immediately called with the\n * value of the error.\n *\n * @name during\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {AsyncFunction} test - asynchronous truth test to perform before each\n * execution of `fn`. Invoked with (callback).\n * @param {AsyncFunction} fn - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `fn` has stopped. `callback`\n * will be passed an error, if one occurred, otherwise `null`.\n * @example\n *\n * var count = 0;\n *\n * async.during(\n *     function (callback) {\n *         return callback(null, count < 5);\n *     },\n *     function (callback) {\n *         count++;\n *         setTimeout(callback, 1000);\n *     },\n *     function (err) {\n *         // 5 seconds have passed\n *     }\n * );\n */\nfunction during(test, fn, callback) {\n    callback = (0, _onlyOnce2.default)(callback || _noop2.default);\n    var _fn = (0, _wrapAsync2.default)(fn);\n    var _test = (0, _wrapAsync2.default)(test);\n\n    function next(err) {\n        if (err) return callback(err);\n        _test(check);\n    }\n\n    function check(err, truth) {\n        if (err) return callback(err);\n        if (!truth) return callback(null);\n        _fn(next);\n    }\n\n    _test(check);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/each.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = eachLimit;\n\nvar _eachOf = require('./eachOf');\n\nvar _eachOf2 = _interopRequireDefault(_eachOf);\n\nvar _withoutIndex = require('./internal/withoutIndex');\n\nvar _withoutIndex2 = _interopRequireDefault(_withoutIndex);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Applies the function `iteratee` to each item in `coll`, in parallel.\n * The `iteratee` is called with an item from the list, and a callback for when\n * it has finished. If the `iteratee` passes an error to its `callback`, the\n * main `callback` (for the `each` function) is immediately called with the\n * error.\n *\n * Note, that since this function applies `iteratee` to each item in parallel,\n * there is no guarantee that the iteratee functions will complete in order.\n *\n * @name each\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEach\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to\n * each item in `coll`. Invoked with (item, callback).\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOf`.\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @example\n *\n * // assuming openFiles is an array of file names and saveFile is a function\n * // to save the modified contents of that file:\n *\n * async.each(openFiles, saveFile, function(err){\n *   // if any of the saves produced an error, err would equal that error\n * });\n *\n * // assuming openFiles is an array of file names\n * async.each(openFiles, function(file, callback) {\n *\n *     // Perform operation on file here.\n *     console.log('Processing file ' + file);\n *\n *     if( file.length > 32 ) {\n *       console.log('This file name is too long');\n *       callback('File name too long');\n *     } else {\n *       // Do work to process file here\n *       console.log('File processed');\n *       callback();\n *     }\n * }, function(err) {\n *     // if any of the file processing produced an error, err would equal that error\n *     if( err ) {\n *       // One of the iterations produced an error.\n *       // All processing will now stop.\n *       console.log('A file failed to process');\n *     } else {\n *       console.log('All files have been processed successfully');\n *     }\n * });\n */\nfunction eachLimit(coll, iteratee, callback) {\n  (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/eachLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = eachLimit;\n\nvar _eachOfLimit = require('./internal/eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _withoutIndex = require('./internal/withoutIndex');\n\nvar _withoutIndex2 = _interopRequireDefault(_withoutIndex);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\n *\n * @name eachLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfLimit`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nfunction eachLimit(coll, limit, iteratee, callback) {\n  (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/eachOf.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (coll, iteratee, callback) {\n    var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric;\n    eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback);\n};\n\nvar _isArrayLike = require('lodash/isArrayLike');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _breakLoop = require('./internal/breakLoop');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// eachOf implementation optimized for array-likes\nfunction eachOfArrayLike(coll, iteratee, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var index = 0,\n        completed = 0,\n        length = coll.length;\n    if (length === 0) {\n        callback(null);\n    }\n\n    function iteratorCallback(err, value) {\n        if (err) {\n            callback(err);\n        } else if (++completed === length || value === _breakLoop2.default) {\n            callback(null);\n        }\n    }\n\n    for (; index < length; index++) {\n        iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback));\n    }\n}\n\n// a generic version of eachOf which can handle array, object, and iterator cases.\nvar eachOfGeneric = (0, _doLimit2.default)(_eachOfLimit2.default, Infinity);\n\n/**\n * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument\n * to the iteratee.\n *\n * @name eachOf\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEachOf\n * @category Collection\n * @see [async.each]{@link module:Collections.each}\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each\n * item in `coll`.\n * The `key` is the item's key, or index in the case of an array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @example\n *\n * var obj = {dev: \"/dev.json\", test: \"/test.json\", prod: \"/prod.json\"};\n * var configs = {};\n *\n * async.forEachOf(obj, function (value, key, callback) {\n *     fs.readFile(__dirname + value, \"utf8\", function (err, data) {\n *         if (err) return callback(err);\n *         try {\n *             configs[key] = JSON.parse(data);\n *         } catch (e) {\n *             return callback(e);\n *         }\n *         callback();\n *     });\n * }, function (err) {\n *     if (err) console.error(err.message);\n *     // configs is now a map of JSON data\n *     doSomethingWith(configs);\n * });\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/eachOfLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = eachOfLimit;\n\nvar _eachOfLimit2 = require('./internal/eachOfLimit');\n\nvar _eachOfLimit3 = _interopRequireDefault(_eachOfLimit2);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name eachOfLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`. The `key` is the item's key, or index in the case of an\n * array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nfunction eachOfLimit(coll, limit, iteratee, callback) {\n  (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/eachOfSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time.\n *\n * @name eachOfSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Invoked with (err).\n */\nexports.default = (0, _doLimit2.default)(_eachOfLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/eachSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _eachLimit = require('./eachLimit');\n\nvar _eachLimit2 = _interopRequireDefault(_eachLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\n *\n * @name eachSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfSeries`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nexports.default = (0, _doLimit2.default)(_eachLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/ensureAsync.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = ensureAsync;\n\nvar _setImmediate = require('./internal/setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Wrap an async function and ensure it calls its callback on a later tick of\n * the event loop.  If the function already calls its callback on a next tick,\n * no extra deferral is added. This is useful for preventing stack overflows\n * (`RangeError: Maximum call stack size exceeded`) and generally keeping\n * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony)\n * contained. ES2017 `async` functions are returned as-is -- they are immune\n * to Zalgo's corrupting influences, as they always resolve on a later tick.\n *\n * @name ensureAsync\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - an async function, one that expects a node-style\n * callback as its last argument.\n * @returns {AsyncFunction} Returns a wrapped function with the exact same call\n * signature as the function passed in.\n * @example\n *\n * function sometimesAsync(arg, callback) {\n *     if (cache[arg]) {\n *         return callback(null, cache[arg]); // this would be synchronous!!\n *     } else {\n *         doSomeIO(arg, callback); // this IO would be asynchronous\n *     }\n * }\n *\n * // this has a risk of stack overflows if many results are cached in a row\n * async.mapSeries(args, sometimesAsync, done);\n *\n * // this will defer sometimesAsync's callback if necessary,\n * // preventing stack overflows\n * async.mapSeries(args, async.ensureAsync(sometimesAsync), done);\n */\nfunction ensureAsync(fn) {\n    if ((0, _wrapAsync.isAsync)(fn)) return fn;\n    return (0, _initialParams2.default)(function (args, callback) {\n        var sync = true;\n        args.push(function () {\n            var innerArgs = arguments;\n            if (sync) {\n                (0, _setImmediate2.default)(function () {\n                    callback.apply(null, innerArgs);\n                });\n            } else {\n                callback.apply(null, innerArgs);\n            }\n        });\n        fn.apply(this, args);\n        sync = false;\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/every.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _notId = require('./internal/notId');\n\nvar _notId2 = _interopRequireDefault(_notId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns `true` if every element in `coll` satisfies an async test. If any\n * iteratee call returns `false`, the main `callback` is immediately called.\n *\n * @name every\n * @static\n * @memberOf module:Collections\n * @method\n * @alias all\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n * @example\n *\n * async.every(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // if result is true then every file exists\n * });\n */\nexports.default = (0, _doParallel2.default)((0, _createTester2.default)(_notId2.default, _notId2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/everyLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _notId = require('./internal/notId');\n\nvar _notId2 = _interopRequireDefault(_notId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time.\n *\n * @name everyLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in parallel.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n */\nexports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_notId2.default, _notId2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/everySeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _everyLimit = require('./everyLimit');\n\nvar _everyLimit2 = _interopRequireDefault(_everyLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time.\n *\n * @name everySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.every]{@link module:Collections.every}\n * @alias allSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collection in series.\n * The iteratee must complete with a boolean result value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result will be either `true` or `false`\n * depending on the values of the async tests. Invoked with (err, result).\n */\nexports.default = (0, _doLimit2.default)(_everyLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/filter.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _filter = require('./internal/filter');\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns a new array of all the values in `coll` which pass an async truth\n * test. This operation is performed in parallel, but the results array will be\n * in the same order as the original.\n *\n * @name filter\n * @static\n * @memberOf module:Collections\n * @method\n * @alias select\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @example\n *\n * async.filter(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, results) {\n *     // results now equals an array of the existing files\n * });\n */\nexports.default = (0, _doParallel2.default)(_filter2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/filterLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _filter = require('./internal/filter');\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name filterLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nexports.default = (0, _doParallelLimit2.default)(_filter2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/filterSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _filterLimit = require('./filterLimit');\n\nvar _filterLimit2 = _interopRequireDefault(_filterLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time.\n *\n * @name filterSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results)\n */\nexports.default = (0, _doLimit2.default)(_filterLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/find.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _findGetResult = require('./internal/findGetResult');\n\nvar _findGetResult2 = _interopRequireDefault(_findGetResult);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns the first value in `coll` that passes an async truth test. The\n * `iteratee` is applied in parallel, meaning the first iteratee to return\n * `true` will fire the detect `callback` with that result. That means the\n * result might not be the first item in the original `coll` (in terms of order)\n * that passes the test.\n\n * If order within the original `coll` is important, then look at\n * [`detectSeries`]{@link module:Collections.detectSeries}.\n *\n * @name detect\n * @static\n * @memberOf module:Collections\n * @method\n * @alias find\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n * @example\n *\n * async.detect(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // result now equals the first file in the list that exists\n * });\n */\nexports.default = (0, _doParallel2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/findLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _findGetResult = require('./internal/findGetResult');\n\nvar _findGetResult2 = _interopRequireDefault(_findGetResult);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name detectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findLimit\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n */\nexports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(_identity2.default, _findGetResult2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/findSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _detectLimit = require('./detectLimit');\n\nvar _detectLimit2 = _interopRequireDefault(_detectLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time.\n *\n * @name detectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.detect]{@link module:Collections.detect}\n * @alias findSeries\n * @category Collections\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.\n * The iteratee must complete with a boolean value as its result.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\n * Result will be the first item in the array that passes the truth test\n * (iteratee) or the value `undefined` if none passed. Invoked with\n * (err, result).\n */\nexports.default = (0, _doLimit2.default)(_detectLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/foldl.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = reduce;\n\nvar _eachOfSeries = require('./eachOfSeries');\n\nvar _eachOfSeries2 = _interopRequireDefault(_eachOfSeries);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Reduces `coll` into a single value using an async `iteratee` to return each\n * successive step. `memo` is the initial state of the reduction. This function\n * only operates in series.\n *\n * For performance reasons, it may make sense to split a call to this function\n * into a parallel map, and then use the normal `Array.prototype.reduce` on the\n * results. This function is for situations where each step in the reduction\n * needs to be async; if you can get the data before reducing it, then it's\n * probably a good idea to do so.\n *\n * @name reduce\n * @static\n * @memberOf module:Collections\n * @method\n * @alias inject\n * @alias foldl\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n * @example\n *\n * async.reduce([1,2,3], 0, function(memo, item, callback) {\n *     // pointless async:\n *     process.nextTick(function() {\n *         callback(null, memo + item)\n *     });\n * }, function(err, result) {\n *     // result is now equal to the last value of memo, which is 6\n * });\n */\nfunction reduce(coll, memo, iteratee, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _eachOfSeries2.default)(coll, function (x, i, callback) {\n        _iteratee(memo, x, function (err, v) {\n            memo = v;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, memo);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/foldr.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = reduceRight;\n\nvar _reduce = require('./reduce');\n\nvar _reduce2 = _interopRequireDefault(_reduce);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order.\n *\n * @name reduceRight\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reduce]{@link module:Collections.reduce}\n * @alias foldr\n * @category Collection\n * @param {Array} array - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n */\nfunction reduceRight(array, memo, iteratee, callback) {\n  var reversed = (0, _slice2.default)(array).reverse();\n  (0, _reduce2.default)(reversed, memo, iteratee, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forEach.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = eachLimit;\n\nvar _eachOf = require('./eachOf');\n\nvar _eachOf2 = _interopRequireDefault(_eachOf);\n\nvar _withoutIndex = require('./internal/withoutIndex');\n\nvar _withoutIndex2 = _interopRequireDefault(_withoutIndex);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Applies the function `iteratee` to each item in `coll`, in parallel.\n * The `iteratee` is called with an item from the list, and a callback for when\n * it has finished. If the `iteratee` passes an error to its `callback`, the\n * main `callback` (for the `each` function) is immediately called with the\n * error.\n *\n * Note, that since this function applies `iteratee` to each item in parallel,\n * there is no guarantee that the iteratee functions will complete in order.\n *\n * @name each\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEach\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to\n * each item in `coll`. Invoked with (item, callback).\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOf`.\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @example\n *\n * // assuming openFiles is an array of file names and saveFile is a function\n * // to save the modified contents of that file:\n *\n * async.each(openFiles, saveFile, function(err){\n *   // if any of the saves produced an error, err would equal that error\n * });\n *\n * // assuming openFiles is an array of file names\n * async.each(openFiles, function(file, callback) {\n *\n *     // Perform operation on file here.\n *     console.log('Processing file ' + file);\n *\n *     if( file.length > 32 ) {\n *       console.log('This file name is too long');\n *       callback('File name too long');\n *     } else {\n *       // Do work to process file here\n *       console.log('File processed');\n *       callback();\n *     }\n * }, function(err) {\n *     // if any of the file processing produced an error, err would equal that error\n *     if( err ) {\n *       // One of the iterations produced an error.\n *       // All processing will now stop.\n *       console.log('A file failed to process');\n *     } else {\n *       console.log('All files have been processed successfully');\n *     }\n * });\n */\nfunction eachLimit(coll, iteratee, callback) {\n  (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forEachLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = eachLimit;\n\nvar _eachOfLimit = require('./internal/eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _withoutIndex = require('./internal/withoutIndex');\n\nvar _withoutIndex2 = _interopRequireDefault(_withoutIndex);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\n *\n * @name eachLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfLimit`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nfunction eachLimit(coll, limit, iteratee, callback) {\n  (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forEachOf.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (coll, iteratee, callback) {\n    var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric;\n    eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback);\n};\n\nvar _isArrayLike = require('lodash/isArrayLike');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _breakLoop = require('./internal/breakLoop');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// eachOf implementation optimized for array-likes\nfunction eachOfArrayLike(coll, iteratee, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var index = 0,\n        completed = 0,\n        length = coll.length;\n    if (length === 0) {\n        callback(null);\n    }\n\n    function iteratorCallback(err, value) {\n        if (err) {\n            callback(err);\n        } else if (++completed === length || value === _breakLoop2.default) {\n            callback(null);\n        }\n    }\n\n    for (; index < length; index++) {\n        iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback));\n    }\n}\n\n// a generic version of eachOf which can handle array, object, and iterator cases.\nvar eachOfGeneric = (0, _doLimit2.default)(_eachOfLimit2.default, Infinity);\n\n/**\n * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument\n * to the iteratee.\n *\n * @name eachOf\n * @static\n * @memberOf module:Collections\n * @method\n * @alias forEachOf\n * @category Collection\n * @see [async.each]{@link module:Collections.each}\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each\n * item in `coll`.\n * The `key` is the item's key, or index in the case of an array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @example\n *\n * var obj = {dev: \"/dev.json\", test: \"/test.json\", prod: \"/prod.json\"};\n * var configs = {};\n *\n * async.forEachOf(obj, function (value, key, callback) {\n *     fs.readFile(__dirname + value, \"utf8\", function (err, data) {\n *         if (err) return callback(err);\n *         try {\n *             configs[key] = JSON.parse(data);\n *         } catch (e) {\n *             return callback(e);\n *         }\n *         callback();\n *     });\n * }, function (err) {\n *     if (err) console.error(err.message);\n *     // configs is now a map of JSON data\n *     doSomethingWith(configs);\n * });\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forEachOfLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = eachOfLimit;\n\nvar _eachOfLimit2 = require('./internal/eachOfLimit');\n\nvar _eachOfLimit3 = _interopRequireDefault(_eachOfLimit2);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name eachOfLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`. The `key` is the item's key, or index in the case of an\n * array.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nfunction eachOfLimit(coll, limit, iteratee, callback) {\n  (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forEachOfSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time.\n *\n * @name eachOfSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.eachOf]{@link module:Collections.eachOf}\n * @alias forEachOfSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * Invoked with (item, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Invoked with (err).\n */\nexports.default = (0, _doLimit2.default)(_eachOfLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forEachSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _eachLimit = require('./eachLimit');\n\nvar _eachLimit2 = _interopRequireDefault(_eachLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\n *\n * @name eachSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfSeries`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n */\nexports.default = (0, _doLimit2.default)(_eachLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/forever.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = forever;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _ensureAsync = require('./ensureAsync');\n\nvar _ensureAsync2 = _interopRequireDefault(_ensureAsync);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Calls the asynchronous function `fn` with a callback parameter that allows it\n * to call itself again, in series, indefinitely.\n\n * If an error is passed to the callback then `errback` is called with the\n * error, and execution stops, otherwise it will never be called.\n *\n * @name forever\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} fn - an async function to call repeatedly.\n * Invoked with (next).\n * @param {Function} [errback] - when `fn` passes an error to it's callback,\n * this function will be called, and execution stops. Invoked with (err).\n * @example\n *\n * async.forever(\n *     function(next) {\n *         // next is suitable for passing to things that need a callback(err [, whatever]);\n *         // it will result in this function being called again.\n *     },\n *     function(err) {\n *         // if next is called with a value in its first parameter, it will appear\n *         // in here as 'err', and execution will stop.\n *     }\n * );\n */\nfunction forever(fn, errback) {\n    var done = (0, _onlyOnce2.default)(errback || _noop2.default);\n    var task = (0, _wrapAsync2.default)((0, _ensureAsync2.default)(fn));\n\n    function next(err) {\n        if (err) return done(err);\n        task(next);\n    }\n    next();\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/groupBy.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nvar _groupByLimit = require('./groupByLimit');\n\nvar _groupByLimit2 = _interopRequireDefault(_groupByLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns a new object, where each value corresponds to an array of items, from\n * `coll`, that returned the corresponding key. That is, the keys of the object\n * correspond to the values passed to the `iteratee` callback.\n *\n * Note: Since this function applies the `iteratee` to each item in parallel,\n * there is no guarantee that the `iteratee` functions will complete in order.\n * However, the values for each key in the `result` will be in the same order as\n * the original `coll`. For Objects, the values will roughly be in the order of\n * the original Objects' keys (but this can vary across JavaScript engines).\n *\n * @name groupBy\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n * @example\n *\n * async.groupBy(['userId1', 'userId2', 'userId3'], function(userId, callback) {\n *     db.findById(userId, function(err, user) {\n *         if (err) return callback(err);\n *         return callback(null, user.age);\n *     });\n * }, function(err, result) {\n *     // result is object containing the userIds grouped by age\n *     // e.g. { 30: ['userId1', 'userId3'], 42: ['userId2']};\n * });\n */\nexports.default = (0, _doLimit2.default)(_groupByLimit2.default, Infinity);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/groupByLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (coll, limit, iteratee, callback) {\n    callback = callback || _noop2.default;\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _mapLimit2.default)(coll, limit, function (val, callback) {\n        _iteratee(val, function (err, key) {\n            if (err) return callback(err);\n            return callback(null, { key: key, val: val });\n        });\n    }, function (err, mapResults) {\n        var result = {};\n        // from MDN, handle object having an `hasOwnProperty` prop\n        var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n        for (var i = 0; i < mapResults.length; i++) {\n            if (mapResults[i]) {\n                var key = mapResults[i].key;\n                var val = mapResults[i].val;\n\n                if (hasOwnProperty.call(result, key)) {\n                    result[key].push(val);\n                } else {\n                    result[key] = [val];\n                }\n            }\n        }\n\n        return callback(err, result);\n    });\n};\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _mapLimit = require('./mapLimit');\n\nvar _mapLimit2 = _interopRequireDefault(_mapLimit);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n;\n/**\n * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time.\n *\n * @name groupByLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.groupBy]{@link module:Collections.groupBy}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n */\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/groupBySeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nvar _groupByLimit = require('./groupByLimit');\n\nvar _groupByLimit2 = _interopRequireDefault(_groupByLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time.\n *\n * @name groupBySeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.groupBy]{@link module:Collections.groupBy}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a `key` to group the value under.\n * Invoked with (value, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Result is an `Object` whoses\n * properties are arrays of values which returned the corresponding key.\n */\nexports.default = (0, _doLimit2.default)(_groupByLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/index.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.wrapSync = exports.selectSeries = exports.selectLimit = exports.select = exports.foldr = exports.foldl = exports.inject = exports.forEachOfLimit = exports.forEachOfSeries = exports.forEachOf = exports.forEachLimit = exports.forEachSeries = exports.forEach = exports.findSeries = exports.findLimit = exports.find = exports.anySeries = exports.anyLimit = exports.any = exports.allSeries = exports.allLimit = exports.all = exports.whilst = exports.waterfall = exports.until = exports.unmemoize = exports.tryEach = exports.transform = exports.timesSeries = exports.timesLimit = exports.times = exports.timeout = exports.sortBy = exports.someSeries = exports.someLimit = exports.some = exports.setImmediate = exports.series = exports.seq = exports.retryable = exports.retry = exports.rejectSeries = exports.rejectLimit = exports.reject = exports.reflectAll = exports.reflect = exports.reduceRight = exports.reduce = exports.race = exports.queue = exports.priorityQueue = exports.parallelLimit = exports.parallel = exports.nextTick = exports.memoize = exports.mapValuesSeries = exports.mapValuesLimit = exports.mapValues = exports.mapSeries = exports.mapLimit = exports.map = exports.log = exports.groupBySeries = exports.groupByLimit = exports.groupBy = exports.forever = exports.filterSeries = exports.filterLimit = exports.filter = exports.everySeries = exports.everyLimit = exports.every = exports.ensureAsync = exports.eachSeries = exports.eachOfSeries = exports.eachOfLimit = exports.eachOf = exports.eachLimit = exports.each = exports.during = exports.doWhilst = exports.doUntil = exports.doDuring = exports.dir = exports.detectSeries = exports.detectLimit = exports.detect = exports.constant = exports.concatSeries = exports.concatLimit = exports.concat = exports.compose = exports.cargo = exports.autoInject = exports.auto = exports.asyncify = exports.applyEachSeries = exports.applyEach = exports.apply = undefined;\n\nvar _apply = require('./apply');\n\nvar _apply2 = _interopRequireDefault(_apply);\n\nvar _applyEach = require('./applyEach');\n\nvar _applyEach2 = _interopRequireDefault(_applyEach);\n\nvar _applyEachSeries = require('./applyEachSeries');\n\nvar _applyEachSeries2 = _interopRequireDefault(_applyEachSeries);\n\nvar _asyncify = require('./asyncify');\n\nvar _asyncify2 = _interopRequireDefault(_asyncify);\n\nvar _auto = require('./auto');\n\nvar _auto2 = _interopRequireDefault(_auto);\n\nvar _autoInject = require('./autoInject');\n\nvar _autoInject2 = _interopRequireDefault(_autoInject);\n\nvar _cargo = require('./cargo');\n\nvar _cargo2 = _interopRequireDefault(_cargo);\n\nvar _compose = require('./compose');\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _concat = require('./concat');\n\nvar _concat2 = _interopRequireDefault(_concat);\n\nvar _concatLimit = require('./concatLimit');\n\nvar _concatLimit2 = _interopRequireDefault(_concatLimit);\n\nvar _concatSeries = require('./concatSeries');\n\nvar _concatSeries2 = _interopRequireDefault(_concatSeries);\n\nvar _constant = require('./constant');\n\nvar _constant2 = _interopRequireDefault(_constant);\n\nvar _detect = require('./detect');\n\nvar _detect2 = _interopRequireDefault(_detect);\n\nvar _detectLimit = require('./detectLimit');\n\nvar _detectLimit2 = _interopRequireDefault(_detectLimit);\n\nvar _detectSeries = require('./detectSeries');\n\nvar _detectSeries2 = _interopRequireDefault(_detectSeries);\n\nvar _dir = require('./dir');\n\nvar _dir2 = _interopRequireDefault(_dir);\n\nvar _doDuring = require('./doDuring');\n\nvar _doDuring2 = _interopRequireDefault(_doDuring);\n\nvar _doUntil = require('./doUntil');\n\nvar _doUntil2 = _interopRequireDefault(_doUntil);\n\nvar _doWhilst = require('./doWhilst');\n\nvar _doWhilst2 = _interopRequireDefault(_doWhilst);\n\nvar _during = require('./during');\n\nvar _during2 = _interopRequireDefault(_during);\n\nvar _each = require('./each');\n\nvar _each2 = _interopRequireDefault(_each);\n\nvar _eachLimit = require('./eachLimit');\n\nvar _eachLimit2 = _interopRequireDefault(_eachLimit);\n\nvar _eachOf = require('./eachOf');\n\nvar _eachOf2 = _interopRequireDefault(_eachOf);\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _eachOfSeries = require('./eachOfSeries');\n\nvar _eachOfSeries2 = _interopRequireDefault(_eachOfSeries);\n\nvar _eachSeries = require('./eachSeries');\n\nvar _eachSeries2 = _interopRequireDefault(_eachSeries);\n\nvar _ensureAsync = require('./ensureAsync');\n\nvar _ensureAsync2 = _interopRequireDefault(_ensureAsync);\n\nvar _every = require('./every');\n\nvar _every2 = _interopRequireDefault(_every);\n\nvar _everyLimit = require('./everyLimit');\n\nvar _everyLimit2 = _interopRequireDefault(_everyLimit);\n\nvar _everySeries = require('./everySeries');\n\nvar _everySeries2 = _interopRequireDefault(_everySeries);\n\nvar _filter = require('./filter');\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _filterLimit = require('./filterLimit');\n\nvar _filterLimit2 = _interopRequireDefault(_filterLimit);\n\nvar _filterSeries = require('./filterSeries');\n\nvar _filterSeries2 = _interopRequireDefault(_filterSeries);\n\nvar _forever = require('./forever');\n\nvar _forever2 = _interopRequireDefault(_forever);\n\nvar _groupBy = require('./groupBy');\n\nvar _groupBy2 = _interopRequireDefault(_groupBy);\n\nvar _groupByLimit = require('./groupByLimit');\n\nvar _groupByLimit2 = _interopRequireDefault(_groupByLimit);\n\nvar _groupBySeries = require('./groupBySeries');\n\nvar _groupBySeries2 = _interopRequireDefault(_groupBySeries);\n\nvar _log = require('./log');\n\nvar _log2 = _interopRequireDefault(_log);\n\nvar _map = require('./map');\n\nvar _map2 = _interopRequireDefault(_map);\n\nvar _mapLimit = require('./mapLimit');\n\nvar _mapLimit2 = _interopRequireDefault(_mapLimit);\n\nvar _mapSeries = require('./mapSeries');\n\nvar _mapSeries2 = _interopRequireDefault(_mapSeries);\n\nvar _mapValues = require('./mapValues');\n\nvar _mapValues2 = _interopRequireDefault(_mapValues);\n\nvar _mapValuesLimit = require('./mapValuesLimit');\n\nvar _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit);\n\nvar _mapValuesSeries = require('./mapValuesSeries');\n\nvar _mapValuesSeries2 = _interopRequireDefault(_mapValuesSeries);\n\nvar _memoize = require('./memoize');\n\nvar _memoize2 = _interopRequireDefault(_memoize);\n\nvar _nextTick = require('./nextTick');\n\nvar _nextTick2 = _interopRequireDefault(_nextTick);\n\nvar _parallel = require('./parallel');\n\nvar _parallel2 = _interopRequireDefault(_parallel);\n\nvar _parallelLimit = require('./parallelLimit');\n\nvar _parallelLimit2 = _interopRequireDefault(_parallelLimit);\n\nvar _priorityQueue = require('./priorityQueue');\n\nvar _priorityQueue2 = _interopRequireDefault(_priorityQueue);\n\nvar _queue = require('./queue');\n\nvar _queue2 = _interopRequireDefault(_queue);\n\nvar _race = require('./race');\n\nvar _race2 = _interopRequireDefault(_race);\n\nvar _reduce = require('./reduce');\n\nvar _reduce2 = _interopRequireDefault(_reduce);\n\nvar _reduceRight = require('./reduceRight');\n\nvar _reduceRight2 = _interopRequireDefault(_reduceRight);\n\nvar _reflect = require('./reflect');\n\nvar _reflect2 = _interopRequireDefault(_reflect);\n\nvar _reflectAll = require('./reflectAll');\n\nvar _reflectAll2 = _interopRequireDefault(_reflectAll);\n\nvar _reject = require('./reject');\n\nvar _reject2 = _interopRequireDefault(_reject);\n\nvar _rejectLimit = require('./rejectLimit');\n\nvar _rejectLimit2 = _interopRequireDefault(_rejectLimit);\n\nvar _rejectSeries = require('./rejectSeries');\n\nvar _rejectSeries2 = _interopRequireDefault(_rejectSeries);\n\nvar _retry = require('./retry');\n\nvar _retry2 = _interopRequireDefault(_retry);\n\nvar _retryable = require('./retryable');\n\nvar _retryable2 = _interopRequireDefault(_retryable);\n\nvar _seq = require('./seq');\n\nvar _seq2 = _interopRequireDefault(_seq);\n\nvar _series = require('./series');\n\nvar _series2 = _interopRequireDefault(_series);\n\nvar _setImmediate = require('./setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _some = require('./some');\n\nvar _some2 = _interopRequireDefault(_some);\n\nvar _someLimit = require('./someLimit');\n\nvar _someLimit2 = _interopRequireDefault(_someLimit);\n\nvar _someSeries = require('./someSeries');\n\nvar _someSeries2 = _interopRequireDefault(_someSeries);\n\nvar _sortBy = require('./sortBy');\n\nvar _sortBy2 = _interopRequireDefault(_sortBy);\n\nvar _timeout = require('./timeout');\n\nvar _timeout2 = _interopRequireDefault(_timeout);\n\nvar _times = require('./times');\n\nvar _times2 = _interopRequireDefault(_times);\n\nvar _timesLimit = require('./timesLimit');\n\nvar _timesLimit2 = _interopRequireDefault(_timesLimit);\n\nvar _timesSeries = require('./timesSeries');\n\nvar _timesSeries2 = _interopRequireDefault(_timesSeries);\n\nvar _transform = require('./transform');\n\nvar _transform2 = _interopRequireDefault(_transform);\n\nvar _tryEach = require('./tryEach');\n\nvar _tryEach2 = _interopRequireDefault(_tryEach);\n\nvar _unmemoize = require('./unmemoize');\n\nvar _unmemoize2 = _interopRequireDefault(_unmemoize);\n\nvar _until = require('./until');\n\nvar _until2 = _interopRequireDefault(_until);\n\nvar _waterfall = require('./waterfall');\n\nvar _waterfall2 = _interopRequireDefault(_waterfall);\n\nvar _whilst = require('./whilst');\n\nvar _whilst2 = _interopRequireDefault(_whilst);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n  apply: _apply2.default,\n  applyEach: _applyEach2.default,\n  applyEachSeries: _applyEachSeries2.default,\n  asyncify: _asyncify2.default,\n  auto: _auto2.default,\n  autoInject: _autoInject2.default,\n  cargo: _cargo2.default,\n  compose: _compose2.default,\n  concat: _concat2.default,\n  concatLimit: _concatLimit2.default,\n  concatSeries: _concatSeries2.default,\n  constant: _constant2.default,\n  detect: _detect2.default,\n  detectLimit: _detectLimit2.default,\n  detectSeries: _detectSeries2.default,\n  dir: _dir2.default,\n  doDuring: _doDuring2.default,\n  doUntil: _doUntil2.default,\n  doWhilst: _doWhilst2.default,\n  during: _during2.default,\n  each: _each2.default,\n  eachLimit: _eachLimit2.default,\n  eachOf: _eachOf2.default,\n  eachOfLimit: _eachOfLimit2.default,\n  eachOfSeries: _eachOfSeries2.default,\n  eachSeries: _eachSeries2.default,\n  ensureAsync: _ensureAsync2.default,\n  every: _every2.default,\n  everyLimit: _everyLimit2.default,\n  everySeries: _everySeries2.default,\n  filter: _filter2.default,\n  filterLimit: _filterLimit2.default,\n  filterSeries: _filterSeries2.default,\n  forever: _forever2.default,\n  groupBy: _groupBy2.default,\n  groupByLimit: _groupByLimit2.default,\n  groupBySeries: _groupBySeries2.default,\n  log: _log2.default,\n  map: _map2.default,\n  mapLimit: _mapLimit2.default,\n  mapSeries: _mapSeries2.default,\n  mapValues: _mapValues2.default,\n  mapValuesLimit: _mapValuesLimit2.default,\n  mapValuesSeries: _mapValuesSeries2.default,\n  memoize: _memoize2.default,\n  nextTick: _nextTick2.default,\n  parallel: _parallel2.default,\n  parallelLimit: _parallelLimit2.default,\n  priorityQueue: _priorityQueue2.default,\n  queue: _queue2.default,\n  race: _race2.default,\n  reduce: _reduce2.default,\n  reduceRight: _reduceRight2.default,\n  reflect: _reflect2.default,\n  reflectAll: _reflectAll2.default,\n  reject: _reject2.default,\n  rejectLimit: _rejectLimit2.default,\n  rejectSeries: _rejectSeries2.default,\n  retry: _retry2.default,\n  retryable: _retryable2.default,\n  seq: _seq2.default,\n  series: _series2.default,\n  setImmediate: _setImmediate2.default,\n  some: _some2.default,\n  someLimit: _someLimit2.default,\n  someSeries: _someSeries2.default,\n  sortBy: _sortBy2.default,\n  timeout: _timeout2.default,\n  times: _times2.default,\n  timesLimit: _timesLimit2.default,\n  timesSeries: _timesSeries2.default,\n  transform: _transform2.default,\n  tryEach: _tryEach2.default,\n  unmemoize: _unmemoize2.default,\n  until: _until2.default,\n  waterfall: _waterfall2.default,\n  whilst: _whilst2.default,\n\n  // aliases\n  all: _every2.default,\n  allLimit: _everyLimit2.default,\n  allSeries: _everySeries2.default,\n  any: _some2.default,\n  anyLimit: _someLimit2.default,\n  anySeries: _someSeries2.default,\n  find: _detect2.default,\n  findLimit: _detectLimit2.default,\n  findSeries: _detectSeries2.default,\n  forEach: _each2.default,\n  forEachSeries: _eachSeries2.default,\n  forEachLimit: _eachLimit2.default,\n  forEachOf: _eachOf2.default,\n  forEachOfSeries: _eachOfSeries2.default,\n  forEachOfLimit: _eachOfLimit2.default,\n  inject: _reduce2.default,\n  foldl: _reduce2.default,\n  foldr: _reduceRight2.default,\n  select: _filter2.default,\n  selectLimit: _filterLimit2.default,\n  selectSeries: _filterSeries2.default,\n  wrapSync: _asyncify2.default\n}; /**\n    * An \"async function\" in the context of Async is an asynchronous function with\n    * a variable number of parameters, with the final parameter being a callback.\n    * (`function (arg1, arg2, ..., callback) {}`)\n    * The final callback is of the form `callback(err, results...)`, which must be\n    * called once the function is completed.  The callback should be called with a\n    * Error as its first argument to signal that an error occurred.\n    * Otherwise, if no error occurred, it should be called with `null` as the first\n    * argument, and any additional `result` arguments that may apply, to signal\n    * successful completion.\n    * The callback must be called exactly once, ideally on a later tick of the\n    * JavaScript event loop.\n    *\n    * This type of function is also referred to as a \"Node-style async function\",\n    * or a \"continuation passing-style function\" (CPS). Most of the methods of this\n    * library are themselves CPS/Node-style async functions, or functions that\n    * return CPS/Node-style async functions.\n    *\n    * Wherever we accept a Node-style async function, we also directly accept an\n    * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}.\n    * In this case, the `async` function will not be passed a final callback\n    * argument, and any thrown error will be used as the `err` argument of the\n    * implicit callback, and the return value will be used as the `result` value.\n    * (i.e. a `rejected` of the returned Promise becomes the `err` callback\n    * argument, and a `resolved` value becomes the `result`.)\n    *\n    * Note, due to JavaScript limitations, we can only detect native `async`\n    * functions and not transpilied implementations.\n    * Your environment must have `async`/`await` support for this to work.\n    * (e.g. Node > v7.6, or a recent version of a modern browser).\n    * If you are using `async` functions through a transpiler (e.g. Babel), you\n    * must still wrap the function with [asyncify]{@link module:Utils.asyncify},\n    * because the `async function` will be compiled to an ordinary function that\n    * returns a promise.\n    *\n    * @typedef {Function} AsyncFunction\n    * @static\n    */\n\n/**\n * Async is a utility module which provides straight-forward, powerful functions\n * for working with asynchronous JavaScript. Although originally designed for\n * use with [Node.js](http://nodejs.org) and installable via\n * `npm install --save async`, it can also be used directly in the browser.\n * @module async\n * @see AsyncFunction\n */\n\n/**\n * A collection of `async` functions for manipulating collections, such as\n * arrays and objects.\n * @module Collections\n */\n\n/**\n * A collection of `async` functions for controlling the flow through a script.\n * @module ControlFlow\n */\n\n/**\n * A collection of `async` utility functions.\n * @module Utils\n */\n\nexports.apply = _apply2.default;\nexports.applyEach = _applyEach2.default;\nexports.applyEachSeries = _applyEachSeries2.default;\nexports.asyncify = _asyncify2.default;\nexports.auto = _auto2.default;\nexports.autoInject = _autoInject2.default;\nexports.cargo = _cargo2.default;\nexports.compose = _compose2.default;\nexports.concat = _concat2.default;\nexports.concatLimit = _concatLimit2.default;\nexports.concatSeries = _concatSeries2.default;\nexports.constant = _constant2.default;\nexports.detect = _detect2.default;\nexports.detectLimit = _detectLimit2.default;\nexports.detectSeries = _detectSeries2.default;\nexports.dir = _dir2.default;\nexports.doDuring = _doDuring2.default;\nexports.doUntil = _doUntil2.default;\nexports.doWhilst = _doWhilst2.default;\nexports.during = _during2.default;\nexports.each = _each2.default;\nexports.eachLimit = _eachLimit2.default;\nexports.eachOf = _eachOf2.default;\nexports.eachOfLimit = _eachOfLimit2.default;\nexports.eachOfSeries = _eachOfSeries2.default;\nexports.eachSeries = _eachSeries2.default;\nexports.ensureAsync = _ensureAsync2.default;\nexports.every = _every2.default;\nexports.everyLimit = _everyLimit2.default;\nexports.everySeries = _everySeries2.default;\nexports.filter = _filter2.default;\nexports.filterLimit = _filterLimit2.default;\nexports.filterSeries = _filterSeries2.default;\nexports.forever = _forever2.default;\nexports.groupBy = _groupBy2.default;\nexports.groupByLimit = _groupByLimit2.default;\nexports.groupBySeries = _groupBySeries2.default;\nexports.log = _log2.default;\nexports.map = _map2.default;\nexports.mapLimit = _mapLimit2.default;\nexports.mapSeries = _mapSeries2.default;\nexports.mapValues = _mapValues2.default;\nexports.mapValuesLimit = _mapValuesLimit2.default;\nexports.mapValuesSeries = _mapValuesSeries2.default;\nexports.memoize = _memoize2.default;\nexports.nextTick = _nextTick2.default;\nexports.parallel = _parallel2.default;\nexports.parallelLimit = _parallelLimit2.default;\nexports.priorityQueue = _priorityQueue2.default;\nexports.queue = _queue2.default;\nexports.race = _race2.default;\nexports.reduce = _reduce2.default;\nexports.reduceRight = _reduceRight2.default;\nexports.reflect = _reflect2.default;\nexports.reflectAll = _reflectAll2.default;\nexports.reject = _reject2.default;\nexports.rejectLimit = _rejectLimit2.default;\nexports.rejectSeries = _rejectSeries2.default;\nexports.retry = _retry2.default;\nexports.retryable = _retryable2.default;\nexports.seq = _seq2.default;\nexports.series = _series2.default;\nexports.setImmediate = _setImmediate2.default;\nexports.some = _some2.default;\nexports.someLimit = _someLimit2.default;\nexports.someSeries = _someSeries2.default;\nexports.sortBy = _sortBy2.default;\nexports.timeout = _timeout2.default;\nexports.times = _times2.default;\nexports.timesLimit = _timesLimit2.default;\nexports.timesSeries = _timesSeries2.default;\nexports.transform = _transform2.default;\nexports.tryEach = _tryEach2.default;\nexports.unmemoize = _unmemoize2.default;\nexports.until = _until2.default;\nexports.waterfall = _waterfall2.default;\nexports.whilst = _whilst2.default;\nexports.all = _every2.default;\nexports.allLimit = _everyLimit2.default;\nexports.allSeries = _everySeries2.default;\nexports.any = _some2.default;\nexports.anyLimit = _someLimit2.default;\nexports.anySeries = _someSeries2.default;\nexports.find = _detect2.default;\nexports.findLimit = _detectLimit2.default;\nexports.findSeries = _detectSeries2.default;\nexports.forEach = _each2.default;\nexports.forEachSeries = _eachSeries2.default;\nexports.forEachLimit = _eachLimit2.default;\nexports.forEachOf = _eachOf2.default;\nexports.forEachOfSeries = _eachOfSeries2.default;\nexports.forEachOfLimit = _eachOfLimit2.default;\nexports.inject = _reduce2.default;\nexports.foldl = _reduce2.default;\nexports.foldr = _reduceRight2.default;\nexports.select = _filter2.default;\nexports.selectLimit = _filterLimit2.default;\nexports.selectSeries = _filterSeries2.default;\nexports.wrapSync = _asyncify2.default;"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/inject.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = reduce;\n\nvar _eachOfSeries = require('./eachOfSeries');\n\nvar _eachOfSeries2 = _interopRequireDefault(_eachOfSeries);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Reduces `coll` into a single value using an async `iteratee` to return each\n * successive step. `memo` is the initial state of the reduction. This function\n * only operates in series.\n *\n * For performance reasons, it may make sense to split a call to this function\n * into a parallel map, and then use the normal `Array.prototype.reduce` on the\n * results. This function is for situations where each step in the reduction\n * needs to be async; if you can get the data before reducing it, then it's\n * probably a good idea to do so.\n *\n * @name reduce\n * @static\n * @memberOf module:Collections\n * @method\n * @alias inject\n * @alias foldl\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n * @example\n *\n * async.reduce([1,2,3], 0, function(memo, item, callback) {\n *     // pointless async:\n *     process.nextTick(function() {\n *         callback(null, memo + item)\n *     });\n * }, function(err, result) {\n *     // result is now equal to the last value of memo, which is 6\n * });\n */\nfunction reduce(coll, memo, iteratee, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _eachOfSeries2.default)(coll, function (x, i, callback) {\n        _iteratee(memo, x, function (err, v) {\n            memo = v;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, memo);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/DoublyLinkedList.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = DLL;\n// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation\n// used for queues. This implementation assumes that the node provided by the user can be modified\n// to adjust the next and last properties. We implement only the minimal functionality\n// for queue support.\nfunction DLL() {\n    this.head = this.tail = null;\n    this.length = 0;\n}\n\nfunction setInitial(dll, node) {\n    dll.length = 1;\n    dll.head = dll.tail = node;\n}\n\nDLL.prototype.removeLink = function (node) {\n    if (node.prev) node.prev.next = node.next;else this.head = node.next;\n    if (node.next) node.next.prev = node.prev;else this.tail = node.prev;\n\n    node.prev = node.next = null;\n    this.length -= 1;\n    return node;\n};\n\nDLL.prototype.empty = function () {\n    while (this.head) this.shift();\n    return this;\n};\n\nDLL.prototype.insertAfter = function (node, newNode) {\n    newNode.prev = node;\n    newNode.next = node.next;\n    if (node.next) node.next.prev = newNode;else this.tail = newNode;\n    node.next = newNode;\n    this.length += 1;\n};\n\nDLL.prototype.insertBefore = function (node, newNode) {\n    newNode.prev = node.prev;\n    newNode.next = node;\n    if (node.prev) node.prev.next = newNode;else this.head = newNode;\n    node.prev = newNode;\n    this.length += 1;\n};\n\nDLL.prototype.unshift = function (node) {\n    if (this.head) this.insertBefore(this.head, node);else setInitial(this, node);\n};\n\nDLL.prototype.push = function (node) {\n    if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node);\n};\n\nDLL.prototype.shift = function () {\n    return this.head && this.removeLink(this.head);\n};\n\nDLL.prototype.pop = function () {\n    return this.tail && this.removeLink(this.tail);\n};\n\nDLL.prototype.toArray = function () {\n    var arr = Array(this.length);\n    var curr = this.head;\n    for (var idx = 0; idx < this.length; idx++) {\n        arr[idx] = curr.data;\n        curr = curr.next;\n    }\n    return arr;\n};\n\nDLL.prototype.remove = function (testFn) {\n    var curr = this.head;\n    while (!!curr) {\n        var next = curr.next;\n        if (testFn(curr)) {\n            this.removeLink(curr);\n        }\n        curr = next;\n    }\n    return this;\n};\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/applyEach.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = applyEach;\n\nvar _slice = require('./slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _initialParams = require('./initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction applyEach(eachfn) {\n    return function (fns /*, ...args*/) {\n        var args = (0, _slice2.default)(arguments, 1);\n        var go = (0, _initialParams2.default)(function (args, callback) {\n            var that = this;\n            return eachfn(fns, function (fn, cb) {\n                (0, _wrapAsync2.default)(fn).apply(that, args.concat(cb));\n            }, callback);\n        });\n        if (args.length) {\n            return go.apply(this, args);\n        } else {\n            return go;\n        }\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/breakLoop.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n// A temporary value used to identify if the loop should be broken.\n// See #1064, #1293\nexports.default = {};\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/consoleFunc.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = consoleFunc;\n\nvar _arrayEach = require('lodash/_arrayEach');\n\nvar _arrayEach2 = _interopRequireDefault(_arrayEach);\n\nvar _slice = require('./slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction consoleFunc(name) {\n    return function (fn /*, ...args*/) {\n        var args = (0, _slice2.default)(arguments, 1);\n        args.push(function (err /*, ...args*/) {\n            var args = (0, _slice2.default)(arguments, 1);\n            if (typeof console === 'object') {\n                if (err) {\n                    if (console.error) {\n                        console.error(err);\n                    }\n                } else if (console[name]) {\n                    (0, _arrayEach2.default)(args, function (x) {\n                        console[name](x);\n                    });\n                }\n            }\n        });\n        (0, _wrapAsync2.default)(fn).apply(null, args);\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/createTester.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _createTester;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _breakLoop = require('./breakLoop');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _createTester(check, getResult) {\n    return function (eachfn, arr, iteratee, cb) {\n        cb = cb || _noop2.default;\n        var testPassed = false;\n        var testResult;\n        eachfn(arr, function (value, _, callback) {\n            iteratee(value, function (err, result) {\n                if (err) {\n                    callback(err);\n                } else if (check(result) && !testResult) {\n                    testPassed = true;\n                    testResult = getResult(true, value);\n                    callback(null, _breakLoop2.default);\n                } else {\n                    callback();\n                }\n            });\n        }, function (err) {\n            if (err) {\n                cb(err);\n            } else {\n                cb(null, testPassed ? testResult : getResult(false));\n            }\n        });\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/doLimit.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = doLimit;\nfunction doLimit(fn, limit) {\n    return function (iterable, iteratee, callback) {\n        return fn(iterable, limit, iteratee, callback);\n    };\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/doParallel.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = doParallel;\n\nvar _eachOf = require('../eachOf');\n\nvar _eachOf2 = _interopRequireDefault(_eachOf);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction doParallel(fn) {\n    return function (obj, iteratee, callback) {\n        return fn(_eachOf2.default, obj, (0, _wrapAsync2.default)(iteratee), callback);\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/doParallelLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = doParallelLimit;\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction doParallelLimit(fn) {\n    return function (obj, limit, iteratee, callback) {\n        return fn((0, _eachOfLimit2.default)(limit), obj, (0, _wrapAsync2.default)(iteratee), callback);\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/eachOfLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _eachOfLimit;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _iterator = require('./iterator');\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _onlyOnce = require('./onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _breakLoop = require('./breakLoop');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _eachOfLimit(limit) {\n    return function (obj, iteratee, callback) {\n        callback = (0, _once2.default)(callback || _noop2.default);\n        if (limit <= 0 || !obj) {\n            return callback(null);\n        }\n        var nextElem = (0, _iterator2.default)(obj);\n        var done = false;\n        var running = 0;\n        var looping = false;\n\n        function iterateeCallback(err, value) {\n            running -= 1;\n            if (err) {\n                done = true;\n                callback(err);\n            } else if (value === _breakLoop2.default || done && running <= 0) {\n                done = true;\n                return callback(null);\n            } else if (!looping) {\n                replenish();\n            }\n        }\n\n        function replenish() {\n            looping = true;\n            while (running < limit && !done) {\n                var elem = nextElem();\n                if (elem === null) {\n                    done = true;\n                    if (running <= 0) {\n                        callback(null);\n                    }\n                    return;\n                }\n                running += 1;\n                iteratee(elem.value, elem.key, (0, _onlyOnce2.default)(iterateeCallback));\n            }\n            looping = false;\n        }\n\n        replenish();\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/filter.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _filter;\n\nvar _arrayMap = require('lodash/_arrayMap');\n\nvar _arrayMap2 = _interopRequireDefault(_arrayMap);\n\nvar _isArrayLike = require('lodash/isArrayLike');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _baseProperty = require('lodash/_baseProperty');\n\nvar _baseProperty2 = _interopRequireDefault(_baseProperty);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction filterArray(eachfn, arr, iteratee, callback) {\n    var truthValues = new Array(arr.length);\n    eachfn(arr, function (x, index, callback) {\n        iteratee(x, function (err, v) {\n            truthValues[index] = !!v;\n            callback(err);\n        });\n    }, function (err) {\n        if (err) return callback(err);\n        var results = [];\n        for (var i = 0; i < arr.length; i++) {\n            if (truthValues[i]) results.push(arr[i]);\n        }\n        callback(null, results);\n    });\n}\n\nfunction filterGeneric(eachfn, coll, iteratee, callback) {\n    var results = [];\n    eachfn(coll, function (x, index, callback) {\n        iteratee(x, function (err, v) {\n            if (err) {\n                callback(err);\n            } else {\n                if (v) {\n                    results.push({ index: index, value: x });\n                }\n                callback();\n            }\n        });\n    }, function (err) {\n        if (err) {\n            callback(err);\n        } else {\n            callback(null, (0, _arrayMap2.default)(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), (0, _baseProperty2.default)('value')));\n        }\n    });\n}\n\nfunction _filter(eachfn, coll, iteratee, callback) {\n    var filter = (0, _isArrayLike2.default)(coll) ? filterArray : filterGeneric;\n    filter(eachfn, coll, (0, _wrapAsync2.default)(iteratee), callback || _noop2.default);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/findGetResult.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _findGetResult;\nfunction _findGetResult(v, x) {\n    return x;\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/getIterator.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (coll) {\n    return iteratorSymbol && coll[iteratorSymbol] && coll[iteratorSymbol]();\n};\n\nvar iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator;\n\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/initialParams.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (fn) {\n    return function () /*...args, callback*/{\n        var args = (0, _slice2.default)(arguments);\n        var callback = args.pop();\n        fn.call(this, args, callback);\n    };\n};\n\nvar _slice = require('./slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/iterator.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = iterator;\n\nvar _isArrayLike = require('lodash/isArrayLike');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _getIterator = require('./getIterator');\n\nvar _getIterator2 = _interopRequireDefault(_getIterator);\n\nvar _keys = require('lodash/keys');\n\nvar _keys2 = _interopRequireDefault(_keys);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createArrayIterator(coll) {\n    var i = -1;\n    var len = coll.length;\n    return function next() {\n        return ++i < len ? { value: coll[i], key: i } : null;\n    };\n}\n\nfunction createES2015Iterator(iterator) {\n    var i = -1;\n    return function next() {\n        var item = iterator.next();\n        if (item.done) return null;\n        i++;\n        return { value: item.value, key: i };\n    };\n}\n\nfunction createObjectIterator(obj) {\n    var okeys = (0, _keys2.default)(obj);\n    var i = -1;\n    var len = okeys.length;\n    return function next() {\n        var key = okeys[++i];\n        if (key === '__proto__') {\n            return next();\n        }\n        return i < len ? { value: obj[key], key: key } : null;\n    };\n}\n\nfunction iterator(coll) {\n    if ((0, _isArrayLike2.default)(coll)) {\n        return createArrayIterator(coll);\n    }\n\n    var iterator = (0, _getIterator2.default)(coll);\n    return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/map.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _asyncMap;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncMap(eachfn, arr, iteratee, callback) {\n    callback = callback || _noop2.default;\n    arr = arr || [];\n    var results = [];\n    var counter = 0;\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n\n    eachfn(arr, function (value, _, callback) {\n        var index = counter++;\n        _iteratee(value, function (err, v) {\n            results[index] = v;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, results);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/notId.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = notId;\nfunction notId(v) {\n    return !v;\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/once.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = once;\nfunction once(fn) {\n    return function () {\n        if (fn === null) return;\n        var callFn = fn;\n        fn = null;\n        callFn.apply(this, arguments);\n    };\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/onlyOnce.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = onlyOnce;\nfunction onlyOnce(fn) {\n    return function () {\n        if (fn === null) throw new Error(\"Callback was already called.\");\n        var callFn = fn;\n        fn = null;\n        callFn.apply(this, arguments);\n    };\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/parallel.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _parallel;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _isArrayLike = require('lodash/isArrayLike');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _slice = require('./slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _parallel(eachfn, tasks, callback) {\n    callback = callback || _noop2.default;\n    var results = (0, _isArrayLike2.default)(tasks) ? [] : {};\n\n    eachfn(tasks, function (task, key, callback) {\n        (0, _wrapAsync2.default)(task)(function (err, result) {\n            if (arguments.length > 2) {\n                result = (0, _slice2.default)(arguments, 1);\n            }\n            results[key] = result;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, results);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/queue.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = queue;\n\nvar _baseIndexOf = require('lodash/_baseIndexOf');\n\nvar _baseIndexOf2 = _interopRequireDefault(_baseIndexOf);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _onlyOnce = require('./onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _setImmediate = require('./setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _DoublyLinkedList = require('./DoublyLinkedList');\n\nvar _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList);\n\nvar _wrapAsync = require('./wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction queue(worker, concurrency, payload) {\n    if (concurrency == null) {\n        concurrency = 1;\n    } else if (concurrency === 0) {\n        throw new Error('Concurrency must not be zero');\n    }\n\n    var _worker = (0, _wrapAsync2.default)(worker);\n    var numRunning = 0;\n    var workersList = [];\n\n    var processingScheduled = false;\n    function _insert(data, insertAtFront, callback) {\n        if (callback != null && typeof callback !== 'function') {\n            throw new Error('task callback must be a function');\n        }\n        q.started = true;\n        if (!(0, _isArray2.default)(data)) {\n            data = [data];\n        }\n        if (data.length === 0 && q.idle()) {\n            // call drain immediately if there are no tasks\n            return (0, _setImmediate2.default)(function () {\n                q.drain();\n            });\n        }\n\n        for (var i = 0, l = data.length; i < l; i++) {\n            var item = {\n                data: data[i],\n                callback: callback || _noop2.default\n            };\n\n            if (insertAtFront) {\n                q._tasks.unshift(item);\n            } else {\n                q._tasks.push(item);\n            }\n        }\n\n        if (!processingScheduled) {\n            processingScheduled = true;\n            (0, _setImmediate2.default)(function () {\n                processingScheduled = false;\n                q.process();\n            });\n        }\n    }\n\n    function _next(tasks) {\n        return function (err) {\n            numRunning -= 1;\n\n            for (var i = 0, l = tasks.length; i < l; i++) {\n                var task = tasks[i];\n\n                var index = (0, _baseIndexOf2.default)(workersList, task, 0);\n                if (index === 0) {\n                    workersList.shift();\n                } else if (index > 0) {\n                    workersList.splice(index, 1);\n                }\n\n                task.callback.apply(task, arguments);\n\n                if (err != null) {\n                    q.error(err, task.data);\n                }\n            }\n\n            if (numRunning <= q.concurrency - q.buffer) {\n                q.unsaturated();\n            }\n\n            if (q.idle()) {\n                q.drain();\n            }\n            q.process();\n        };\n    }\n\n    var isProcessing = false;\n    var q = {\n        _tasks: new _DoublyLinkedList2.default(),\n        concurrency: concurrency,\n        payload: payload,\n        saturated: _noop2.default,\n        unsaturated: _noop2.default,\n        buffer: concurrency / 4,\n        empty: _noop2.default,\n        drain: _noop2.default,\n        error: _noop2.default,\n        started: false,\n        paused: false,\n        push: function (data, callback) {\n            _insert(data, false, callback);\n        },\n        kill: function () {\n            q.drain = _noop2.default;\n            q._tasks.empty();\n        },\n        unshift: function (data, callback) {\n            _insert(data, true, callback);\n        },\n        remove: function (testFn) {\n            q._tasks.remove(testFn);\n        },\n        process: function () {\n            // Avoid trying to start too many processing operations. This can occur\n            // when callbacks resolve synchronously (#1267).\n            if (isProcessing) {\n                return;\n            }\n            isProcessing = true;\n            while (!q.paused && numRunning < q.concurrency && q._tasks.length) {\n                var tasks = [],\n                    data = [];\n                var l = q._tasks.length;\n                if (q.payload) l = Math.min(l, q.payload);\n                for (var i = 0; i < l; i++) {\n                    var node = q._tasks.shift();\n                    tasks.push(node);\n                    workersList.push(node);\n                    data.push(node.data);\n                }\n\n                numRunning += 1;\n\n                if (q._tasks.length === 0) {\n                    q.empty();\n                }\n\n                if (numRunning === q.concurrency) {\n                    q.saturated();\n                }\n\n                var cb = (0, _onlyOnce2.default)(_next(tasks));\n                _worker(data, cb);\n            }\n            isProcessing = false;\n        },\n        length: function () {\n            return q._tasks.length;\n        },\n        running: function () {\n            return numRunning;\n        },\n        workersList: function () {\n            return workersList;\n        },\n        idle: function () {\n            return q._tasks.length + numRunning === 0;\n        },\n        pause: function () {\n            q.paused = true;\n        },\n        resume: function () {\n            if (q.paused === false) {\n                return;\n            }\n            q.paused = false;\n            (0, _setImmediate2.default)(q.process);\n        }\n    };\n    return q;\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/reject.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = reject;\n\nvar _filter = require('./filter');\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction reject(eachfn, arr, iteratee, callback) {\n    (0, _filter2.default)(eachfn, arr, function (value, cb) {\n        iteratee(value, function (err, v) {\n            cb(err, !v);\n        });\n    }, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/setImmediate.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.hasNextTick = exports.hasSetImmediate = undefined;\nexports.fallback = fallback;\nexports.wrap = wrap;\n\nvar _slice = require('./slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar hasSetImmediate = exports.hasSetImmediate = typeof setImmediate === 'function' && setImmediate;\nvar hasNextTick = exports.hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';\n\nfunction fallback(fn) {\n    setTimeout(fn, 0);\n}\n\nfunction wrap(defer) {\n    return function (fn /*, ...args*/) {\n        var args = (0, _slice2.default)(arguments, 1);\n        defer(function () {\n            fn.apply(null, args);\n        });\n    };\n}\n\nvar _defer;\n\nif (hasSetImmediate) {\n    _defer = setImmediate;\n} else if (hasNextTick) {\n    _defer = process.nextTick;\n} else {\n    _defer = fallback;\n}\n\nexports.default = wrap(_defer);"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/slice.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = slice;\nfunction slice(arrayLike, start) {\n    start = start | 0;\n    var newLen = Math.max(arrayLike.length - start, 0);\n    var newArr = Array(newLen);\n    for (var idx = 0; idx < newLen; idx++) {\n        newArr[idx] = arrayLike[start + idx];\n    }\n    return newArr;\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/withoutIndex.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = _withoutIndex;\nfunction _withoutIndex(iteratee) {\n    return function (value, index, callback) {\n        return iteratee(value, callback);\n    };\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/internal/wrapAsync.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.isAsync = undefined;\n\nvar _asyncify = require('../asyncify');\n\nvar _asyncify2 = _interopRequireDefault(_asyncify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar supportsSymbol = typeof Symbol === 'function';\n\nfunction isAsync(fn) {\n    return supportsSymbol && fn[Symbol.toStringTag] === 'AsyncFunction';\n}\n\nfunction wrapAsync(asyncFn) {\n    return isAsync(asyncFn) ? (0, _asyncify2.default)(asyncFn) : asyncFn;\n}\n\nexports.default = wrapAsync;\nexports.isAsync = isAsync;"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/log.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _consoleFunc = require('./internal/consoleFunc');\n\nvar _consoleFunc2 = _interopRequireDefault(_consoleFunc);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Logs the result of an `async` function to the `console`. Only works in\n * Node.js or in browsers that support `console.log` and `console.error` (such\n * as FF and Chrome). If multiple arguments are returned from the async\n * function, `console.log` is called on each argument in order.\n *\n * @name log\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} function - The function you want to eventually apply\n * all arguments to.\n * @param {...*} arguments... - Any number of arguments to apply to the function.\n * @example\n *\n * // in a module\n * var hello = function(name, callback) {\n *     setTimeout(function() {\n *         callback(null, 'hello ' + name);\n *     }, 1000);\n * };\n *\n * // in the node repl\n * node> async.log(hello, 'world');\n * 'hello world'\n */\nexports.default = (0, _consoleFunc2.default)('log');\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/map.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _map = require('./internal/map');\n\nvar _map2 = _interopRequireDefault(_map);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Produces a new collection of values by mapping each value in `coll` through\n * the `iteratee` function. The `iteratee` is called with an item from `coll`\n * and a callback for when it has finished processing. Each of these callback\n * takes 2 arguments: an `error`, and the transformed item from `coll`. If\n * `iteratee` passes an error to its callback, the main `callback` (for the\n * `map` function) is immediately called with the error.\n *\n * Note, that since this function applies the `iteratee` to each item in\n * parallel, there is no guarantee that the `iteratee` functions will complete\n * in order. However, the results array will be in the same order as the\n * original `coll`.\n *\n * If `map` is passed an Object, the results will be an Array.  The results\n * will roughly be in the order of the original Objects' keys (but this can\n * vary across JavaScript engines).\n *\n * @name map\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an Array of the\n * transformed items from the `coll`. Invoked with (err, results).\n * @example\n *\n * async.map(['file1','file2','file3'], fs.stat, function(err, results) {\n *     // results is now an array of stats for each file\n * });\n */\nexports.default = (0, _doParallel2.default)(_map2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/mapLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _map = require('./internal/map');\n\nvar _map2 = _interopRequireDefault(_map);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time.\n *\n * @name mapLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an array of the\n * transformed items from the `coll`. Invoked with (err, results).\n */\nexports.default = (0, _doParallelLimit2.default)(_map2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/mapSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _mapLimit = require('./mapLimit');\n\nvar _mapLimit2 = _interopRequireDefault(_mapLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time.\n *\n * @name mapSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with the transformed item.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. Results is an array of the\n * transformed items from the `coll`. Invoked with (err, results).\n */\nexports.default = (0, _doLimit2.default)(_mapLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/mapValues.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _mapValuesLimit = require('./mapValuesLimit');\n\nvar _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A relative of [`map`]{@link module:Collections.map}, designed for use with objects.\n *\n * Produces a new Object by mapping each value of `obj` through the `iteratee`\n * function. The `iteratee` is called each `value` and `key` from `obj` and a\n * callback for when it has finished processing. Each of these callbacks takes\n * two arguments: an `error`, and the transformed item from `obj`. If `iteratee`\n * passes an error to its callback, the main `callback` (for the `mapValues`\n * function) is immediately called with the error.\n *\n * Note, the order of the keys in the result is not guaranteed.  The keys will\n * be roughly in the order they complete, (but this is very engine-specific)\n *\n * @name mapValues\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n * @example\n *\n * async.mapValues({\n *     f1: 'file1',\n *     f2: 'file2',\n *     f3: 'file3'\n * }, function (file, key, callback) {\n *   fs.stat(file, callback);\n * }, function(err, result) {\n *     // result is now a map of stats for each file, e.g.\n *     // {\n *     //     f1: [stats for file1],\n *     //     f2: [stats for file2],\n *     //     f3: [stats for file3]\n *     // }\n * });\n */\n\nexports.default = (0, _doLimit2.default)(_mapValuesLimit2.default, Infinity);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/mapValuesLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = mapValuesLimit;\n\nvar _eachOfLimit = require('./eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name mapValuesLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.mapValues]{@link module:Collections.mapValues}\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n */\nfunction mapValuesLimit(obj, limit, iteratee, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var newObj = {};\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _eachOfLimit2.default)(obj, limit, function (val, key, next) {\n        _iteratee(val, key, function (err, result) {\n            if (err) return next(err);\n            newObj[key] = result;\n            next();\n        });\n    }, function (err) {\n        callback(err, newObj);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/mapValuesSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _mapValuesLimit = require('./mapValuesLimit');\n\nvar _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time.\n *\n * @name mapValuesSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.mapValues]{@link module:Collections.mapValues}\n * @category Collection\n * @param {Object} obj - A collection to iterate over.\n * @param {AsyncFunction} iteratee - A function to apply to each value and key\n * in `coll`.\n * The iteratee should complete with the transformed value as its result.\n * Invoked with (value, key, callback).\n * @param {Function} [callback] - A callback which is called when all `iteratee`\n * functions have finished, or an error occurs. `result` is a new object consisting\n * of each key from `obj`, with each transformed value on the right-hand side.\n * Invoked with (err, result).\n */\nexports.default = (0, _doLimit2.default)(_mapValuesLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/memoize.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = memoize;\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _setImmediate = require('./internal/setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction has(obj, key) {\n    return key in obj;\n}\n\n/**\n * Caches the results of an async function. When creating a hash to store\n * function results against, the callback is omitted from the hash and an\n * optional hash function can be used.\n *\n * If no hash function is specified, the first argument is used as a hash key,\n * which may work reasonably if it is a string or a data type that converts to a\n * distinct string. Note that objects and arrays will not behave reasonably.\n * Neither will cases where the other arguments are significant. In such cases,\n * specify your own hash function.\n *\n * The cache of results is exposed as the `memo` property of the function\n * returned by `memoize`.\n *\n * @name memoize\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - The async function to proxy and cache results from.\n * @param {Function} hasher - An optional function for generating a custom hash\n * for storing results. It has all the arguments applied to it apart from the\n * callback, and must be synchronous.\n * @returns {AsyncFunction} a memoized version of `fn`\n * @example\n *\n * var slow_fn = function(name, callback) {\n *     // do something\n *     callback(null, result);\n * };\n * var fn = async.memoize(slow_fn);\n *\n * // fn can now be used as if it were slow_fn\n * fn('some name', function() {\n *     // callback\n * });\n */\nfunction memoize(fn, hasher) {\n    var memo = Object.create(null);\n    var queues = Object.create(null);\n    hasher = hasher || _identity2.default;\n    var _fn = (0, _wrapAsync2.default)(fn);\n    var memoized = (0, _initialParams2.default)(function memoized(args, callback) {\n        var key = hasher.apply(null, args);\n        if (has(memo, key)) {\n            (0, _setImmediate2.default)(function () {\n                callback.apply(null, memo[key]);\n            });\n        } else if (has(queues, key)) {\n            queues[key].push(callback);\n        } else {\n            queues[key] = [callback];\n            _fn.apply(null, args.concat(function () /*args*/{\n                var args = (0, _slice2.default)(arguments);\n                memo[key] = args;\n                var q = queues[key];\n                delete queues[key];\n                for (var i = 0, l = q.length; i < l; i++) {\n                    q[i].apply(null, args);\n                }\n            }));\n        }\n    });\n    memoized.memo = memo;\n    memoized.unmemoized = fn;\n    return memoized;\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/nextTick.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _setImmediate = require('./internal/setImmediate');\n\n/**\n * Calls `callback` on a later loop around the event loop. In Node.js this just\n * calls `process.nextTick`.  In the browser it will use `setImmediate` if\n * available, otherwise `setTimeout(callback, 0)`, which means other higher\n * priority events may precede the execution of `callback`.\n *\n * This is used internally for browser-compatibility purposes.\n *\n * @name nextTick\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.setImmediate]{@link module:Utils.setImmediate}\n * @category Util\n * @param {Function} callback - The function to call on a later loop around\n * the event loop. Invoked with (args...).\n * @param {...*} args... - any number of additional arguments to pass to the\n * callback on the next tick.\n * @example\n *\n * var call_order = [];\n * async.nextTick(function() {\n *     call_order.push('two');\n *     // call_order now equals ['one','two']\n * });\n * call_order.push('one');\n *\n * async.setImmediate(function (a, b, c) {\n *     // a, b, and c equal 1, 2, and 3\n * }, 1, 2, 3);\n */\nvar _defer;\n\nif (_setImmediate.hasNextTick) {\n    _defer = process.nextTick;\n} else if (_setImmediate.hasSetImmediate) {\n    _defer = setImmediate;\n} else {\n    _defer = _setImmediate.fallback;\n}\n\nexports.default = (0, _setImmediate.wrap)(_defer);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/package.json",
    "content": "{\n  \"name\": \"async\",\n  \"description\": \"Higher-order functions and common patterns for asynchronous code\",\n  \"version\": \"2.6.4\",\n  \"main\": \"dist/async.js\",\n  \"author\": \"Caolan McMahon\",\n  \"homepage\": \"https://caolan.github.io/async/\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/caolan/async.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/caolan/async/issues\"\n  },\n  \"keywords\": [\n    \"async\",\n    \"callback\",\n    \"module\",\n    \"utility\"\n  ],\n  \"dependencies\": {\n    \"lodash\": \"^4.17.14\"\n  },\n  \"devDependencies\": {\n    \"babel-cli\": \"^6.24.0\",\n    \"babel-core\": \"^6.26.3\",\n    \"babel-plugin-add-module-exports\": \"^0.2.1\",\n    \"babel-plugin-istanbul\": \"^2.0.1\",\n    \"babel-plugin-transform-es2015-modules-commonjs\": \"^6.26.2\",\n    \"babel-preset-es2015\": \"^6.3.13\",\n    \"babel-preset-es2017\": \"^6.22.0\",\n    \"babelify\": \"^8.0.0\",\n    \"benchmark\": \"^2.1.1\",\n    \"bluebird\": \"^3.4.6\",\n    \"browserify\": \"^16.2.2\",\n    \"chai\": \"^4.1.2\",\n    \"cheerio\": \"^0.22.0\",\n    \"coveralls\": \"^3.0.1\",\n    \"es6-promise\": \"^2.3.0\",\n    \"eslint\": \"^2.13.1\",\n    \"fs-extra\": \"^0.26.7\",\n    \"gh-pages-deploy\": \"^0.5.0\",\n    \"jsdoc\": \"^3.4.0\",\n    \"karma\": \"^2.0.2\",\n    \"karma-browserify\": \"^5.2.0\",\n    \"karma-firefox-launcher\": \"^1.1.0\",\n    \"karma-mocha\": \"^1.2.0\",\n    \"karma-mocha-reporter\": \"^2.2.0\",\n    \"mocha\": \"^5.2.0\",\n    \"native-promise-only\": \"^0.8.0-a\",\n    \"nyc\": \"^11.8.0\",\n    \"rimraf\": \"^2.5.0\",\n    \"rollup\": \"^0.36.3\",\n    \"rollup-plugin-node-resolve\": \"^2.0.0\",\n    \"rollup-plugin-npm\": \"^2.0.0\",\n    \"rsvp\": \"^3.0.18\",\n    \"semver\": \"^5.5.0\",\n    \"uglify-js\": \"~2.7.3\",\n    \"yargs\": \"^11.0.0\"\n  },\n  \"scripts\": {\n    \"coverage\": \"nyc npm run mocha-node-test -- --grep @nycinvalid --invert\",\n    \"coveralls\": \"npm run coverage && nyc report --reporter=text-lcov | coveralls\",\n    \"jsdoc\": \"jsdoc -c ./support/jsdoc/jsdoc.json && node support/jsdoc/jsdoc-fix-html.js\",\n    \"lint\": \"eslint lib/ mocha_test/ perf/memory.js perf/suites.js perf/benchmark.js support/build/ support/*.js karma.conf.js\",\n    \"mocha-browser-test\": \"karma start\",\n    \"mocha-node-test\": \"mocha mocha_test/ --compilers js:babel-core/register\",\n    \"mocha-test\": \"npm run mocha-node-test && npm run mocha-browser-test\",\n    \"test\": \"npm run lint && npm run mocha-node-test\"\n  },\n  \"license\": \"MIT\",\n  \"gh-pages-deploy\": {\n    \"staticpath\": \"docs\"\n  },\n  \"nyc\": {\n    \"exclude\": [\n      \"mocha_test\"\n    ]\n  }\n}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/parallel.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parallelLimit;\n\nvar _eachOf = require('./eachOf');\n\nvar _eachOf2 = _interopRequireDefault(_eachOf);\n\nvar _parallel = require('./internal/parallel');\n\nvar _parallel2 = _interopRequireDefault(_parallel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Run the `tasks` collection of functions in parallel, without waiting until\n * the previous function has completed. If any of the functions pass an error to\n * its callback, the main `callback` is immediately called with the value of the\n * error. Once the `tasks` have completed, the results are passed to the final\n * `callback` as an array.\n *\n * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about\n * parallel execution of code.  If your tasks do not use any timers or perform\n * any I/O, they will actually be executed in series.  Any synchronous setup\n * sections for each task will happen one after the other.  JavaScript remains\n * single-threaded.\n *\n * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the\n * execution of other tasks when a task fails.\n *\n * It is also possible to use an object instead of an array. Each property will\n * be run as a function and the results will be passed to the final `callback`\n * as an object instead of an array. This can be a more readable way of handling\n * results from {@link async.parallel}.\n *\n * @name parallel\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection of\n * [async functions]{@link AsyncFunction} to run.\n * Each async function can complete with any number of optional `result` values.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed successfully. This function gets a results array\n * (or object) containing all the result arguments passed to the task callbacks.\n * Invoked with (err, results).\n *\n * @example\n * async.parallel([\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'two');\n *         }, 100);\n *     }\n * ],\n * // optional callback\n * function(err, results) {\n *     // the results array will equal ['one','two'] even though\n *     // the second function had a shorter timeout.\n * });\n *\n * // an example using an object instead of an array\n * async.parallel({\n *     one: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 1);\n *         }, 200);\n *     },\n *     two: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 2);\n *         }, 100);\n *     }\n * }, function(err, results) {\n *     // results is now equals to: {one: 1, two: 2}\n * });\n */\nfunction parallelLimit(tasks, callback) {\n  (0, _parallel2.default)(_eachOf2.default, tasks, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/parallelLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parallelLimit;\n\nvar _eachOfLimit = require('./internal/eachOfLimit');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _parallel = require('./internal/parallel');\n\nvar _parallel2 = _interopRequireDefault(_parallel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name parallelLimit\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.parallel]{@link module:ControlFlow.parallel}\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection of\n * [async functions]{@link AsyncFunction} to run.\n * Each async function can complete with any number of optional `result` values.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed successfully. This function gets a results array\n * (or object) containing all the result arguments passed to the task callbacks.\n * Invoked with (err, results).\n */\nfunction parallelLimit(tasks, limit, callback) {\n  (0, _parallel2.default)((0, _eachOfLimit2.default)(limit), tasks, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/priorityQueue.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (worker, concurrency) {\n    // Start with a normal queue\n    var q = (0, _queue2.default)(worker, concurrency);\n\n    // Override push to accept second parameter representing priority\n    q.push = function (data, priority, callback) {\n        if (callback == null) callback = _noop2.default;\n        if (typeof callback !== 'function') {\n            throw new Error('task callback must be a function');\n        }\n        q.started = true;\n        if (!(0, _isArray2.default)(data)) {\n            data = [data];\n        }\n        if (data.length === 0) {\n            // call drain immediately if there are no tasks\n            return (0, _setImmediate2.default)(function () {\n                q.drain();\n            });\n        }\n\n        priority = priority || 0;\n        var nextNode = q._tasks.head;\n        while (nextNode && priority >= nextNode.priority) {\n            nextNode = nextNode.next;\n        }\n\n        for (var i = 0, l = data.length; i < l; i++) {\n            var item = {\n                data: data[i],\n                priority: priority,\n                callback: callback\n            };\n\n            if (nextNode) {\n                q._tasks.insertBefore(nextNode, item);\n            } else {\n                q._tasks.push(item);\n            }\n        }\n        (0, _setImmediate2.default)(q.process);\n    };\n\n    // Remove unshift function\n    delete q.unshift;\n\n    return q;\n};\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _setImmediate = require('./setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _queue = require('./queue');\n\nvar _queue2 = _interopRequireDefault(_queue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];\n\n/**\n * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and\n * completed in ascending priority order.\n *\n * @name priorityQueue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.queue]{@link module:ControlFlow.queue}\n * @category Control Flow\n * @param {AsyncFunction} worker - An async function for processing a queued task.\n * If you want to handle errors from an individual task, pass a callback to\n * `q.push()`.\n * Invoked with (task, callback).\n * @param {number} concurrency - An `integer` for determining how many `worker`\n * functions should be run in parallel.  If omitted, the concurrency defaults to\n * `1`.  If the concurrency is `0`, an error is thrown.\n * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are two\n * differences between `queue` and `priorityQueue` objects:\n * * `push(task, priority, [callback])` - `priority` should be a number. If an\n *   array of `tasks` is given, all tasks will be assigned the same priority.\n * * The `unshift` method was removed.\n */"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/queue.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (worker, concurrency) {\n  var _worker = (0, _wrapAsync2.default)(worker);\n  return (0, _queue2.default)(function (items, cb) {\n    _worker(items[0], cb);\n  }, concurrency, 1);\n};\n\nvar _queue = require('./internal/queue');\n\nvar _queue2 = _interopRequireDefault(_queue);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];\n\n/**\n * A queue of tasks for the worker function to complete.\n * @typedef {Object} QueueObject\n * @memberOf module:ControlFlow\n * @property {Function} length - a function returning the number of items\n * waiting to be processed. Invoke with `queue.length()`.\n * @property {boolean} started - a boolean indicating whether or not any\n * items have been pushed and processed by the queue.\n * @property {Function} running - a function returning the number of items\n * currently being processed. Invoke with `queue.running()`.\n * @property {Function} workersList - a function returning the array of items\n * currently being processed. Invoke with `queue.workersList()`.\n * @property {Function} idle - a function returning false if there are items\n * waiting or being processed, or true if not. Invoke with `queue.idle()`.\n * @property {number} concurrency - an integer for determining how many `worker`\n * functions should be run in parallel. This property can be changed after a\n * `queue` is created to alter the concurrency on-the-fly.\n * @property {Function} push - add a new task to the `queue`. Calls `callback`\n * once the `worker` has finished processing the task. Instead of a single task,\n * a `tasks` array can be submitted. The respective callback is used for every\n * task in the list. Invoke with `queue.push(task, [callback])`,\n * @property {Function} unshift - add a new task to the front of the `queue`.\n * Invoke with `queue.unshift(task, [callback])`.\n * @property {Function} remove - remove items from the queue that match a test\n * function.  The test function will be passed an object with a `data` property,\n * and a `priority` property, if this is a\n * [priorityQueue]{@link module:ControlFlow.priorityQueue} object.\n * Invoked with `queue.remove(testFn)`, where `testFn` is of the form\n * `function ({data, priority}) {}` and returns a Boolean.\n * @property {Function} saturated - a callback that is called when the number of\n * running workers hits the `concurrency` limit, and further tasks will be\n * queued.\n * @property {Function} unsaturated - a callback that is called when the number\n * of running workers is less than the `concurrency` & `buffer` limits, and\n * further tasks will not be queued.\n * @property {number} buffer - A minimum threshold buffer in order to say that\n * the `queue` is `unsaturated`.\n * @property {Function} empty - a callback that is called when the last item\n * from the `queue` is given to a `worker`.\n * @property {Function} drain - a callback that is called when the last item\n * from the `queue` has returned from the `worker`.\n * @property {Function} error - a callback that is called when a task errors.\n * Has the signature `function(error, task)`.\n * @property {boolean} paused - a boolean for determining whether the queue is\n * in a paused state.\n * @property {Function} pause - a function that pauses the processing of tasks\n * until `resume()` is called. Invoke with `queue.pause()`.\n * @property {Function} resume - a function that resumes the processing of\n * queued tasks when the queue is paused. Invoke with `queue.resume()`.\n * @property {Function} kill - a function that removes the `drain` callback and\n * empties remaining tasks from the queue forcing it to go idle. No more tasks\n * should be pushed to the queue after calling this function. Invoke with `queue.kill()`.\n */\n\n/**\n * Creates a `queue` object with the specified `concurrency`. Tasks added to the\n * `queue` are processed in parallel (up to the `concurrency` limit). If all\n * `worker`s are in progress, the task is queued until one becomes available.\n * Once a `worker` completes a `task`, that `task`'s callback is called.\n *\n * @name queue\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {AsyncFunction} worker - An async function for processing a queued task.\n * If you want to handle errors from an individual task, pass a callback to\n * `q.push()`. Invoked with (task, callback).\n * @param {number} [concurrency=1] - An `integer` for determining how many\n * `worker` functions should be run in parallel.  If omitted, the concurrency\n * defaults to `1`.  If the concurrency is `0`, an error is thrown.\n * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can\n * attached as certain properties to listen for specific events during the\n * lifecycle of the queue.\n * @example\n *\n * // create a queue object with concurrency 2\n * var q = async.queue(function(task, callback) {\n *     console.log('hello ' + task.name);\n *     callback();\n * }, 2);\n *\n * // assign a callback\n * q.drain = function() {\n *     console.log('all items have been processed');\n * };\n *\n * // add some items to the queue\n * q.push({name: 'foo'}, function(err) {\n *     console.log('finished processing foo');\n * });\n * q.push({name: 'bar'}, function (err) {\n *     console.log('finished processing bar');\n * });\n *\n * // add some items to the queue (batch-wise)\n * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {\n *     console.log('finished processing item');\n * });\n *\n * // add some items to the front of the queue\n * q.unshift({name: 'bar'}, function (err) {\n *     console.log('finished processing bar');\n * });\n */"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/race.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = race;\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Runs the `tasks` array of functions in parallel, without waiting until the\n * previous function has completed. Once any of the `tasks` complete or pass an\n * error to its callback, the main `callback` is immediately called. It's\n * equivalent to `Promise.race()`.\n *\n * @name race\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction}\n * to run. Each function can complete with an optional `result` value.\n * @param {Function} callback - A callback to run once any of the functions have\n * completed. This function gets an error or result from the first function that\n * completed. Invoked with (err, result).\n * @returns undefined\n * @example\n *\n * async.race([\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'two');\n *         }, 100);\n *     }\n * ],\n * // main callback\n * function(err, result) {\n *     // the result will be equal to 'two' as it finishes earlier\n * });\n */\nfunction race(tasks, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    if (!(0, _isArray2.default)(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));\n    if (!tasks.length) return callback();\n    for (var i = 0, l = tasks.length; i < l; i++) {\n        (0, _wrapAsync2.default)(tasks[i])(callback);\n    }\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/reduce.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = reduce;\n\nvar _eachOfSeries = require('./eachOfSeries');\n\nvar _eachOfSeries2 = _interopRequireDefault(_eachOfSeries);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Reduces `coll` into a single value using an async `iteratee` to return each\n * successive step. `memo` is the initial state of the reduction. This function\n * only operates in series.\n *\n * For performance reasons, it may make sense to split a call to this function\n * into a parallel map, and then use the normal `Array.prototype.reduce` on the\n * results. This function is for situations where each step in the reduction\n * needs to be async; if you can get the data before reducing it, then it's\n * probably a good idea to do so.\n *\n * @name reduce\n * @static\n * @memberOf module:Collections\n * @method\n * @alias inject\n * @alias foldl\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n * @example\n *\n * async.reduce([1,2,3], 0, function(memo, item, callback) {\n *     // pointless async:\n *     process.nextTick(function() {\n *         callback(null, memo + item)\n *     });\n * }, function(err, result) {\n *     // result is now equal to the last value of memo, which is 6\n * });\n */\nfunction reduce(coll, memo, iteratee, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _eachOfSeries2.default)(coll, function (x, i, callback) {\n        _iteratee(memo, x, function (err, v) {\n            memo = v;\n            callback(err);\n        });\n    }, function (err) {\n        callback(err, memo);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/reduceRight.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = reduceRight;\n\nvar _reduce = require('./reduce');\n\nvar _reduce2 = _interopRequireDefault(_reduce);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order.\n *\n * @name reduceRight\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reduce]{@link module:Collections.reduce}\n * @alias foldr\n * @category Collection\n * @param {Array} array - A collection to iterate over.\n * @param {*} memo - The initial state of the reduction.\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * array to produce the next step in the reduction.\n * The `iteratee` should complete with the next state of the reduction.\n * If the iteratee complete with an error, the reduction is stopped and the\n * main `callback` is immediately called with the error.\n * Invoked with (memo, item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\n * (err, result).\n */\nfunction reduceRight(array, memo, iteratee, callback) {\n  var reversed = (0, _slice2.default)(array).reverse();\n  (0, _reduce2.default)(reversed, memo, iteratee, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/reflect.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = reflect;\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Wraps the async function in another function that always completes with a\n * result object, even when it errors.\n *\n * The result object has either the property `error` or `value`.\n *\n * @name reflect\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} fn - The async function you want to wrap\n * @returns {Function} - A function that always passes null to it's callback as\n * the error. The second argument to the callback will be an `object` with\n * either an `error` or a `value` property.\n * @example\n *\n * async.parallel([\n *     async.reflect(function(callback) {\n *         // do some stuff ...\n *         callback(null, 'one');\n *     }),\n *     async.reflect(function(callback) {\n *         // do some more stuff but error ...\n *         callback('bad stuff happened');\n *     }),\n *     async.reflect(function(callback) {\n *         // do some more stuff ...\n *         callback(null, 'two');\n *     })\n * ],\n * // optional callback\n * function(err, results) {\n *     // values\n *     // results[0].value = 'one'\n *     // results[1].error = 'bad stuff happened'\n *     // results[2].value = 'two'\n * });\n */\nfunction reflect(fn) {\n    var _fn = (0, _wrapAsync2.default)(fn);\n    return (0, _initialParams2.default)(function reflectOn(args, reflectCallback) {\n        args.push(function callback(error, cbArg) {\n            if (error) {\n                reflectCallback(null, { error: error });\n            } else {\n                var value;\n                if (arguments.length <= 2) {\n                    value = cbArg;\n                } else {\n                    value = (0, _slice2.default)(arguments, 1);\n                }\n                reflectCallback(null, { value: value });\n            }\n        });\n\n        return _fn.apply(this, args);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/reflectAll.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = reflectAll;\n\nvar _reflect = require('./reflect');\n\nvar _reflect2 = _interopRequireDefault(_reflect);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _arrayMap2 = require('lodash/_arrayMap');\n\nvar _arrayMap3 = _interopRequireDefault(_arrayMap2);\n\nvar _baseForOwn = require('lodash/_baseForOwn');\n\nvar _baseForOwn2 = _interopRequireDefault(_baseForOwn);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A helper function that wraps an array or an object of functions with `reflect`.\n *\n * @name reflectAll\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.reflect]{@link module:Utils.reflect}\n * @category Util\n * @param {Array|Object|Iterable} tasks - The collection of\n * [async functions]{@link AsyncFunction} to wrap in `async.reflect`.\n * @returns {Array} Returns an array of async functions, each wrapped in\n * `async.reflect`\n * @example\n *\n * let tasks = [\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     function(callback) {\n *         // do some more stuff but error ...\n *         callback(new Error('bad stuff happened'));\n *     },\n *     function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'two');\n *         }, 100);\n *     }\n * ];\n *\n * async.parallel(async.reflectAll(tasks),\n * // optional callback\n * function(err, results) {\n *     // values\n *     // results[0].value = 'one'\n *     // results[1].error = Error('bad stuff happened')\n *     // results[2].value = 'two'\n * });\n *\n * // an example using an object instead of an array\n * let tasks = {\n *     one: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'one');\n *         }, 200);\n *     },\n *     two: function(callback) {\n *         callback('two');\n *     },\n *     three: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 'three');\n *         }, 100);\n *     }\n * };\n *\n * async.parallel(async.reflectAll(tasks),\n * // optional callback\n * function(err, results) {\n *     // values\n *     // results.one.value = 'one'\n *     // results.two.error = 'two'\n *     // results.three.value = 'three'\n * });\n */\nfunction reflectAll(tasks) {\n    var results;\n    if ((0, _isArray2.default)(tasks)) {\n        results = (0, _arrayMap3.default)(tasks, _reflect2.default);\n    } else {\n        results = {};\n        (0, _baseForOwn2.default)(tasks, function (task, key) {\n            results[key] = _reflect2.default.call(this, task);\n        });\n    }\n    return results;\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/reject.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reject = require('./internal/reject');\n\nvar _reject2 = _interopRequireDefault(_reject);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test.\n *\n * @name reject\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @example\n *\n * async.reject(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, results) {\n *     // results now equals an array of missing files\n *     createFiles(results);\n * });\n */\nexports.default = (0, _doParallel2.default)(_reject2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/rejectLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reject = require('./internal/reject');\n\nvar _reject2 = _interopRequireDefault(_reject);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name rejectLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reject]{@link module:Collections.reject}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nexports.default = (0, _doParallelLimit2.default)(_reject2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/rejectSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _rejectLimit = require('./rejectLimit');\n\nvar _rejectLimit2 = _interopRequireDefault(_rejectLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time.\n *\n * @name rejectSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.reject]{@link module:Collections.reject}\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - An async truth test to apply to each item in\n * `coll`.\n * The should complete with a boolean value as its `result`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nexports.default = (0, _doLimit2.default)(_rejectLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/retry.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = retry;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _constant = require('lodash/constant');\n\nvar _constant2 = _interopRequireDefault(_constant);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Attempts to get a successful response from `task` no more than `times` times\n * before returning an error. If the task is successful, the `callback` will be\n * passed the result of the successful task. If all attempts fail, the callback\n * will be passed the error and result (if any) of the final attempt.\n *\n * @name retry\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @see [async.retryable]{@link module:ControlFlow.retryable}\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an\n * object with `times` and `interval` or a number.\n * * `times` - The number of attempts to make before giving up.  The default\n *   is `5`.\n * * `interval` - The time to wait between retries, in milliseconds.  The\n *   default is `0`. The interval may also be specified as a function of the\n *   retry count (see example).\n * * `errorFilter` - An optional synchronous function that is invoked on\n *   erroneous result. If it returns `true` the retry attempts will continue;\n *   if the function returns `false` the retry flow is aborted with the current\n *   attempt's error and result being returned to the final callback.\n *   Invoked with (err).\n * * If `opts` is a number, the number specifies the number of times to retry,\n *   with the default interval of `0`.\n * @param {AsyncFunction} task - An async function to retry.\n * Invoked with (callback).\n * @param {Function} [callback] - An optional callback which is called when the\n * task has succeeded, or after the final failed attempt. It receives the `err`\n * and `result` arguments of the last attempt at completing the `task`. Invoked\n * with (err, results).\n *\n * @example\n *\n * // The `retry` function can be used as a stand-alone control flow by passing\n * // a callback, as shown below:\n *\n * // try calling apiMethod 3 times\n * async.retry(3, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod 3 times, waiting 200 ms between each retry\n * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod 10 times with exponential backoff\n * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds)\n * async.retry({\n *   times: 10,\n *   interval: function(retryCount) {\n *     return 50 * Math.pow(2, retryCount);\n *   }\n * }, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod the default 5 times no delay between each retry\n * async.retry(apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // try calling apiMethod only when error condition satisfies, all other\n * // errors will abort the retry control flow and return to final callback\n * async.retry({\n *   errorFilter: function(err) {\n *     return err.message === 'Temporary error'; // only retry on a specific error\n *   }\n * }, apiMethod, function(err, result) {\n *     // do something with the result\n * });\n *\n * // to retry individual methods that are not as reliable within other\n * // control flow functions, use the `retryable` wrapper:\n * async.auto({\n *     users: api.getUsers.bind(api),\n *     payments: async.retryable(3, api.getPayments.bind(api))\n * }, function(err, results) {\n *     // do something with the results\n * });\n *\n */\nfunction retry(opts, task, callback) {\n    var DEFAULT_TIMES = 5;\n    var DEFAULT_INTERVAL = 0;\n\n    var options = {\n        times: DEFAULT_TIMES,\n        intervalFunc: (0, _constant2.default)(DEFAULT_INTERVAL)\n    };\n\n    function parseTimes(acc, t) {\n        if (typeof t === 'object') {\n            acc.times = +t.times || DEFAULT_TIMES;\n\n            acc.intervalFunc = typeof t.interval === 'function' ? t.interval : (0, _constant2.default)(+t.interval || DEFAULT_INTERVAL);\n\n            acc.errorFilter = t.errorFilter;\n        } else if (typeof t === 'number' || typeof t === 'string') {\n            acc.times = +t || DEFAULT_TIMES;\n        } else {\n            throw new Error(\"Invalid arguments for async.retry\");\n        }\n    }\n\n    if (arguments.length < 3 && typeof opts === 'function') {\n        callback = task || _noop2.default;\n        task = opts;\n    } else {\n        parseTimes(options, opts);\n        callback = callback || _noop2.default;\n    }\n\n    if (typeof task !== 'function') {\n        throw new Error(\"Invalid arguments for async.retry\");\n    }\n\n    var _task = (0, _wrapAsync2.default)(task);\n\n    var attempt = 1;\n    function retryAttempt() {\n        _task(function (err) {\n            if (err && attempt++ < options.times && (typeof options.errorFilter != 'function' || options.errorFilter(err))) {\n                setTimeout(retryAttempt, options.intervalFunc(attempt));\n            } else {\n                callback.apply(null, arguments);\n            }\n        });\n    }\n\n    retryAttempt();\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/retryable.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (opts, task) {\n    if (!task) {\n        task = opts;\n        opts = null;\n    }\n    var _task = (0, _wrapAsync2.default)(task);\n    return (0, _initialParams2.default)(function (args, callback) {\n        function taskFn(cb) {\n            _task.apply(null, args.concat(cb));\n        }\n\n        if (opts) (0, _retry2.default)(opts, taskFn, callback);else (0, _retry2.default)(taskFn, callback);\n    });\n};\n\nvar _retry = require('./retry');\n\nvar _retry2 = _interopRequireDefault(_retry);\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];\n\n/**\n * A close relative of [`retry`]{@link module:ControlFlow.retry}.  This method\n * wraps a task and makes it retryable, rather than immediately calling it\n * with retries.\n *\n * @name retryable\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.retry]{@link module:ControlFlow.retry}\n * @category Control Flow\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional\n * options, exactly the same as from `retry`\n * @param {AsyncFunction} task - the asynchronous function to wrap.\n * This function will be passed any arguments passed to the returned wrapper.\n * Invoked with (...args, callback).\n * @returns {AsyncFunction} The wrapped function, which when invoked, will\n * retry on an error, based on the parameters specified in `opts`.\n * This function will accept the same parameters as `task`.\n * @example\n *\n * async.auto({\n *     dep1: async.retryable(3, getFromFlakyService),\n *     process: [\"dep1\", async.retryable(3, function (results, cb) {\n *         maybeProcessData(results.dep1, cb);\n *     })]\n * }, callback);\n */"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/select.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _filter = require('./internal/filter');\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns a new array of all the values in `coll` which pass an async truth\n * test. This operation is performed in parallel, but the results array will be\n * in the same order as the original.\n *\n * @name filter\n * @static\n * @memberOf module:Collections\n * @method\n * @alias select\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n * @example\n *\n * async.filter(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, results) {\n *     // results now equals an array of the existing files\n * });\n */\nexports.default = (0, _doParallel2.default)(_filter2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/selectLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _filter = require('./internal/filter');\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name filterLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results).\n */\nexports.default = (0, _doParallelLimit2.default)(_filter2.default);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/selectSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _filterLimit = require('./filterLimit');\n\nvar _filterLimit2 = _interopRequireDefault(_filterLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time.\n *\n * @name filterSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.filter]{@link module:Collections.filter}\n * @alias selectSeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\n * with a boolean argument once it has completed. Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Invoked with (err, results)\n */\nexports.default = (0, _doLimit2.default)(_filterLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/seq.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = seq;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _reduce = require('./reduce');\n\nvar _reduce2 = _interopRequireDefault(_reduce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nvar _arrayMap = require('lodash/_arrayMap');\n\nvar _arrayMap2 = _interopRequireDefault(_arrayMap);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Version of the compose function that is more natural to read. Each function\n * consumes the return value of the previous function. It is the equivalent of\n * [compose]{@link module:ControlFlow.compose} with the arguments reversed.\n *\n * Each function is executed with the `this` binding of the composed function.\n *\n * @name seq\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.compose]{@link module:ControlFlow.compose}\n * @category Control Flow\n * @param {...AsyncFunction} functions - the asynchronous functions to compose\n * @returns {Function} a function that composes the `functions` in order\n * @example\n *\n * // Requires lodash (or underscore), express3 and dresende's orm2.\n * // Part of an app, that fetches cats of the logged user.\n * // This example uses `seq` function to avoid overnesting and error\n * // handling clutter.\n * app.get('/cats', function(request, response) {\n *     var User = request.models.User;\n *     async.seq(\n *         _.bind(User.get, User),  // 'User.get' has signature (id, callback(err, data))\n *         function(user, fn) {\n *             user.getCats(fn);      // 'getCats' has signature (callback(err, data))\n *         }\n *     )(req.session.user_id, function (err, cats) {\n *         if (err) {\n *             console.error(err);\n *             response.json({ status: 'error', message: err.message });\n *         } else {\n *             response.json({ status: 'ok', message: 'Cats found', data: cats });\n *         }\n *     });\n * });\n */\nfunction seq() /*...functions*/{\n    var _functions = (0, _arrayMap2.default)(arguments, _wrapAsync2.default);\n    return function () /*...args*/{\n        var args = (0, _slice2.default)(arguments);\n        var that = this;\n\n        var cb = args[args.length - 1];\n        if (typeof cb == 'function') {\n            args.pop();\n        } else {\n            cb = _noop2.default;\n        }\n\n        (0, _reduce2.default)(_functions, args, function (newargs, fn, cb) {\n            fn.apply(that, newargs.concat(function (err /*, ...nextargs*/) {\n                var nextargs = (0, _slice2.default)(arguments, 1);\n                cb(err, nextargs);\n            }));\n        }, function (err, results) {\n            cb.apply(that, [err].concat(results));\n        });\n    };\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/series.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = series;\n\nvar _parallel = require('./internal/parallel');\n\nvar _parallel2 = _interopRequireDefault(_parallel);\n\nvar _eachOfSeries = require('./eachOfSeries');\n\nvar _eachOfSeries2 = _interopRequireDefault(_eachOfSeries);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Run the functions in the `tasks` collection in series, each one running once\n * the previous function has completed. If any functions in the series pass an\n * error to its callback, no more functions are run, and `callback` is\n * immediately called with the value of the error. Otherwise, `callback`\n * receives an array of results when `tasks` have completed.\n *\n * It is also possible to use an object instead of an array. Each property will\n * be run as a function, and the results will be passed to the final `callback`\n * as an object instead of an array. This can be a more readable way of handling\n *  results from {@link async.series}.\n *\n * **Note** that while many implementations preserve the order of object\n * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)\n * explicitly states that\n *\n * > The mechanics and order of enumerating the properties is not specified.\n *\n * So if you rely on the order in which your series of functions are executed,\n * and want this to work on all platforms, consider using an array.\n *\n * @name series\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection containing\n * [async functions]{@link AsyncFunction} to run in series.\n * Each function can complete with any number of optional `result` values.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed. This function gets a results array (or object)\n * containing all the result arguments passed to the `task` callbacks. Invoked\n * with (err, result).\n * @example\n * async.series([\n *     function(callback) {\n *         // do some stuff ...\n *         callback(null, 'one');\n *     },\n *     function(callback) {\n *         // do some more stuff ...\n *         callback(null, 'two');\n *     }\n * ],\n * // optional callback\n * function(err, results) {\n *     // results is now equal to ['one', 'two']\n * });\n *\n * async.series({\n *     one: function(callback) {\n *         setTimeout(function() {\n *             callback(null, 1);\n *         }, 200);\n *     },\n *     two: function(callback){\n *         setTimeout(function() {\n *             callback(null, 2);\n *         }, 100);\n *     }\n * }, function(err, results) {\n *     // results is now equal to: {one: 1, two: 2}\n * });\n */\nfunction series(tasks, callback) {\n  (0, _parallel2.default)(_eachOfSeries2.default, tasks, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/setImmediate.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _setImmediate = require('./internal/setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Calls `callback` on a later loop around the event loop. In Node.js this just\n * calls `setImmediate`.  In the browser it will use `setImmediate` if\n * available, otherwise `setTimeout(callback, 0)`, which means other higher\n * priority events may precede the execution of `callback`.\n *\n * This is used internally for browser-compatibility purposes.\n *\n * @name setImmediate\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.nextTick]{@link module:Utils.nextTick}\n * @category Util\n * @param {Function} callback - The function to call on a later loop around\n * the event loop. Invoked with (args...).\n * @param {...*} args... - any number of additional arguments to pass to the\n * callback on the next tick.\n * @example\n *\n * var call_order = [];\n * async.nextTick(function() {\n *     call_order.push('two');\n *     // call_order now equals ['one','two']\n * });\n * call_order.push('one');\n *\n * async.setImmediate(function (a, b, c) {\n *     // a, b, and c equal 1, 2, and 3\n * }, 1, 2, 3);\n */\nexports.default = _setImmediate2.default;\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/some.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallel = require('./internal/doParallel');\n\nvar _doParallel2 = _interopRequireDefault(_doParallel);\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns `true` if at least one element in the `coll` satisfies an async test.\n * If any iteratee call returns `true`, the main `callback` is immediately\n * called.\n *\n * @name some\n * @static\n * @memberOf module:Collections\n * @method\n * @alias any\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n * @example\n *\n * async.some(['file1','file2','file3'], function(filePath, callback) {\n *     fs.access(filePath, function(err) {\n *         callback(null, !err)\n *     });\n * }, function(err, result) {\n *     // if result is true then at least one of the files exists\n * });\n */\nexports.default = (0, _doParallel2.default)((0, _createTester2.default)(Boolean, _identity2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/someLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createTester = require('./internal/createTester');\n\nvar _createTester2 = _interopRequireDefault(_createTester);\n\nvar _doParallelLimit = require('./internal/doParallelLimit');\n\nvar _doParallelLimit2 = _interopRequireDefault(_doParallelLimit);\n\nvar _identity = require('lodash/identity');\n\nvar _identity2 = _interopRequireDefault(_identity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time.\n *\n * @name someLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anyLimit\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in parallel.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n */\nexports.default = (0, _doParallelLimit2.default)((0, _createTester2.default)(Boolean, _identity2.default));\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/someSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _someLimit = require('./someLimit');\n\nvar _someLimit2 = _interopRequireDefault(_someLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time.\n *\n * @name someSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.some]{@link module:Collections.some}\n * @alias anySeries\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async truth test to apply to each item\n * in the collections in series.\n * The iteratee should complete with a boolean `result` value.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called as soon as any\n * iteratee returns `true`, or after all the iteratee functions have finished.\n * Result will be either `true` or `false` depending on the values of the async\n * tests. Invoked with (err, result).\n */\nexports.default = (0, _doLimit2.default)(_someLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/sortBy.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = sortBy;\n\nvar _arrayMap = require('lodash/_arrayMap');\n\nvar _arrayMap2 = _interopRequireDefault(_arrayMap);\n\nvar _baseProperty = require('lodash/_baseProperty');\n\nvar _baseProperty2 = _interopRequireDefault(_baseProperty);\n\nvar _map = require('./map');\n\nvar _map2 = _interopRequireDefault(_map);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Sorts a list by the results of running each `coll` value through an async\n * `iteratee`.\n *\n * @name sortBy\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The iteratee should complete with a value to use as the sort criteria as\n * its `result`.\n * Invoked with (item, callback).\n * @param {Function} callback - A callback which is called after all the\n * `iteratee` functions have finished, or an error occurs. Results is the items\n * from the original `coll` sorted by the values returned by the `iteratee`\n * calls. Invoked with (err, results).\n * @example\n *\n * async.sortBy(['file1','file2','file3'], function(file, callback) {\n *     fs.stat(file, function(err, stats) {\n *         callback(err, stats.mtime);\n *     });\n * }, function(err, results) {\n *     // results is now the original array of files sorted by\n *     // modified date\n * });\n *\n * // By modifying the callback parameter the\n * // sorting order can be influenced:\n *\n * // ascending order\n * async.sortBy([1,9,3,5], function(x, callback) {\n *     callback(null, x);\n * }, function(err,result) {\n *     // result callback\n * });\n *\n * // descending order\n * async.sortBy([1,9,3,5], function(x, callback) {\n *     callback(null, x*-1);    //<- x*-1 instead of x, turns the order around\n * }, function(err,result) {\n *     // result callback\n * });\n */\nfunction sortBy(coll, iteratee, callback) {\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    (0, _map2.default)(coll, function (x, callback) {\n        _iteratee(x, function (err, criteria) {\n            if (err) return callback(err);\n            callback(null, { value: x, criteria: criteria });\n        });\n    }, function (err, results) {\n        if (err) return callback(err);\n        callback(null, (0, _arrayMap2.default)(results.sort(comparator), (0, _baseProperty2.default)('value')));\n    });\n\n    function comparator(left, right) {\n        var a = left.criteria,\n            b = right.criteria;\n        return a < b ? -1 : a > b ? 1 : 0;\n    }\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/timeout.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = timeout;\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Sets a time limit on an asynchronous function. If the function does not call\n * its callback within the specified milliseconds, it will be called with a\n * timeout error. The code property for the error object will be `'ETIMEDOUT'`.\n *\n * @name timeout\n * @static\n * @memberOf module:Utils\n * @method\n * @category Util\n * @param {AsyncFunction} asyncFn - The async function to limit in time.\n * @param {number} milliseconds - The specified time limit.\n * @param {*} [info] - Any variable you want attached (`string`, `object`, etc)\n * to timeout Error for more information..\n * @returns {AsyncFunction} Returns a wrapped function that can be used with any\n * of the control flow functions.\n * Invoke this function with the same parameters as you would `asyncFunc`.\n * @example\n *\n * function myFunction(foo, callback) {\n *     doAsyncTask(foo, function(err, data) {\n *         // handle errors\n *         if (err) return callback(err);\n *\n *         // do some stuff ...\n *\n *         // return processed data\n *         return callback(null, data);\n *     });\n * }\n *\n * var wrapped = async.timeout(myFunction, 1000);\n *\n * // call `wrapped` as you would `myFunction`\n * wrapped({ bar: 'bar' }, function(err, data) {\n *     // if `myFunction` takes < 1000 ms to execute, `err`\n *     // and `data` will have their expected values\n *\n *     // else `err` will be an Error with the code 'ETIMEDOUT'\n * });\n */\nfunction timeout(asyncFn, milliseconds, info) {\n    var fn = (0, _wrapAsync2.default)(asyncFn);\n\n    return (0, _initialParams2.default)(function (args, callback) {\n        var timedOut = false;\n        var timer;\n\n        function timeoutCallback() {\n            var name = asyncFn.name || 'anonymous';\n            var error = new Error('Callback function \"' + name + '\" timed out.');\n            error.code = 'ETIMEDOUT';\n            if (info) {\n                error.info = info;\n            }\n            timedOut = true;\n            callback(error);\n        }\n\n        args.push(function () {\n            if (!timedOut) {\n                callback.apply(null, arguments);\n                clearTimeout(timer);\n            }\n        });\n\n        // setup timer and call original function\n        timer = setTimeout(timeoutCallback, milliseconds);\n        fn.apply(null, args);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/times.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _timesLimit = require('./timesLimit');\n\nvar _timesLimit2 = _interopRequireDefault(_timesLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Calls the `iteratee` function `n` times, and accumulates results in the same\n * manner you would use with [map]{@link module:Collections.map}.\n *\n * @name times\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.map]{@link module:Collections.map}\n * @category Control Flow\n * @param {number} n - The number of times to run the function.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see {@link module:Collections.map}.\n * @example\n *\n * // Pretend this is some complicated async factory\n * var createUser = function(id, callback) {\n *     callback(null, {\n *         id: 'user' + id\n *     });\n * };\n *\n * // generate 5 users\n * async.times(5, function(n, next) {\n *     createUser(n, function(err, user) {\n *         next(err, user);\n *     });\n * }, function(err, users) {\n *     // we should now have 5 users\n * });\n */\nexports.default = (0, _doLimit2.default)(_timesLimit2.default, Infinity);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/timesLimit.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = timeLimit;\n\nvar _mapLimit = require('./mapLimit');\n\nvar _mapLimit2 = _interopRequireDefault(_mapLimit);\n\nvar _baseRange = require('lodash/_baseRange');\n\nvar _baseRange2 = _interopRequireDefault(_baseRange);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a\n * time.\n *\n * @name timesLimit\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.times]{@link module:ControlFlow.times}\n * @category Control Flow\n * @param {number} count - The number of times to run the function.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see [async.map]{@link module:Collections.map}.\n */\nfunction timeLimit(count, limit, iteratee, callback) {\n  var _iteratee = (0, _wrapAsync2.default)(iteratee);\n  (0, _mapLimit2.default)((0, _baseRange2.default)(0, count, 1), limit, _iteratee, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/timesSeries.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _timesLimit = require('./timesLimit');\n\nvar _timesLimit2 = _interopRequireDefault(_timesLimit);\n\nvar _doLimit = require('./internal/doLimit');\n\nvar _doLimit2 = _interopRequireDefault(_doLimit);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time.\n *\n * @name timesSeries\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.times]{@link module:ControlFlow.times}\n * @category Control Flow\n * @param {number} n - The number of times to run the function.\n * @param {AsyncFunction} iteratee - The async function to call `n` times.\n * Invoked with the iteration index and a callback: (n, next).\n * @param {Function} callback - see {@link module:Collections.map}.\n */\nexports.default = (0, _doLimit2.default)(_timesLimit2.default, 1);\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/transform.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = transform;\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _eachOf = require('./eachOf');\n\nvar _eachOf2 = _interopRequireDefault(_eachOf);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A relative of `reduce`.  Takes an Object or Array, and iterates over each\n * element in series, each step potentially mutating an `accumulator` value.\n * The type of the accumulator defaults to the type of collection passed in.\n *\n * @name transform\n * @static\n * @memberOf module:Collections\n * @method\n * @category Collection\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\n * @param {*} [accumulator] - The initial state of the transform.  If omitted,\n * it will default to an empty Object or Array, depending on the type of `coll`\n * @param {AsyncFunction} iteratee - A function applied to each item in the\n * collection that potentially modifies the accumulator.\n * Invoked with (accumulator, item, key, callback).\n * @param {Function} [callback] - A callback which is called after all the\n * `iteratee` functions have finished. Result is the transformed accumulator.\n * Invoked with (err, result).\n * @example\n *\n * async.transform([1,2,3], function(acc, item, index, callback) {\n *     // pointless async:\n *     process.nextTick(function() {\n *         acc.push(item * 2)\n *         callback(null)\n *     });\n * }, function(err, result) {\n *     // result is now equal to [2, 4, 6]\n * });\n *\n * @example\n *\n * async.transform({a: 1, b: 2, c: 3}, function (obj, val, key, callback) {\n *     setImmediate(function () {\n *         obj[key] = val * 2;\n *         callback();\n *     })\n * }, function (err, result) {\n *     // result is equal to {a: 2, b: 4, c: 6}\n * })\n */\nfunction transform(coll, accumulator, iteratee, callback) {\n    if (arguments.length <= 3) {\n        callback = iteratee;\n        iteratee = accumulator;\n        accumulator = (0, _isArray2.default)(coll) ? [] : {};\n    }\n    callback = (0, _once2.default)(callback || _noop2.default);\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n\n    (0, _eachOf2.default)(coll, function (v, k, cb) {\n        _iteratee(accumulator, v, k, cb);\n    }, function (err) {\n        callback(err, accumulator);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/tryEach.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = tryEach;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _eachSeries = require('./eachSeries');\n\nvar _eachSeries2 = _interopRequireDefault(_eachSeries);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * It runs each task in series but stops whenever any of the functions were\n * successful. If one of the tasks were successful, the `callback` will be\n * passed the result of the successful task. If all tasks fail, the callback\n * will be passed the error and result (if any) of the final attempt.\n *\n * @name tryEach\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array|Iterable|Object} tasks - A collection containing functions to\n * run, each function is passed a `callback(err, result)` it must call on\n * completion with an error `err` (which can be `null`) and an optional `result`\n * value.\n * @param {Function} [callback] - An optional callback which is called when one\n * of the tasks has succeeded, or all have failed. It receives the `err` and\n * `result` arguments of the last attempt at completing the `task`. Invoked with\n * (err, results).\n * @example\n * async.tryEach([\n *     function getDataFromFirstWebsite(callback) {\n *         // Try getting the data from the first website\n *         callback(err, data);\n *     },\n *     function getDataFromSecondWebsite(callback) {\n *         // First website failed,\n *         // Try getting the data from the backup website\n *         callback(err, data);\n *     }\n * ],\n * // optional callback\n * function(err, results) {\n *     Now do something with the data.\n * });\n *\n */\nfunction tryEach(tasks, callback) {\n    var error = null;\n    var result;\n    callback = callback || _noop2.default;\n    (0, _eachSeries2.default)(tasks, function (task, callback) {\n        (0, _wrapAsync2.default)(task)(function (err, res /*, ...args*/) {\n            if (arguments.length > 2) {\n                result = (0, _slice2.default)(arguments, 1);\n            } else {\n                result = res;\n            }\n            error = err;\n            callback(!err);\n        });\n    }, function () {\n        callback(error, result);\n    });\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/unmemoize.js",
    "content": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = unmemoize;\n/**\n * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original,\n * unmemoized form. Handy for testing.\n *\n * @name unmemoize\n * @static\n * @memberOf module:Utils\n * @method\n * @see [async.memoize]{@link module:Utils.memoize}\n * @category Util\n * @param {AsyncFunction} fn - the memoized function\n * @returns {AsyncFunction} a function that calls the original unmemoized function\n */\nfunction unmemoize(fn) {\n    return function () {\n        return (fn.unmemoized || fn).apply(null, arguments);\n    };\n}\nmodule.exports = exports[\"default\"];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/until.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = until;\n\nvar _whilst = require('./whilst');\n\nvar _whilst2 = _interopRequireDefault(_whilst);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when\n * stopped, or an error occurs. `callback` will be passed an error and any\n * arguments passed to the final `iteratee`'s callback.\n *\n * The inverse of [whilst]{@link module:ControlFlow.whilst}.\n *\n * @name until\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @see [async.whilst]{@link module:ControlFlow.whilst}\n * @category Control Flow\n * @param {Function} test - synchronous truth test to perform before each\n * execution of `iteratee`. Invoked with ().\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` fails. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has passed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n */\nfunction until(test, iteratee, callback) {\n    (0, _whilst2.default)(function () {\n        return !test.apply(this, arguments);\n    }, iteratee, callback);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/waterfall.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (tasks, callback) {\n    callback = (0, _once2.default)(callback || _noop2.default);\n    if (!(0, _isArray2.default)(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));\n    if (!tasks.length) return callback();\n    var taskIndex = 0;\n\n    function nextTask(args) {\n        var task = (0, _wrapAsync2.default)(tasks[taskIndex++]);\n        args.push((0, _onlyOnce2.default)(next));\n        task.apply(null, args);\n    }\n\n    function next(err /*, ...args*/) {\n        if (err || taskIndex === tasks.length) {\n            return callback.apply(null, arguments);\n        }\n        nextTask((0, _slice2.default)(arguments, 1));\n    }\n\n    nextTask([]);\n};\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _once = require('./internal/once');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];\n\n/**\n * Runs the `tasks` array of functions in series, each passing their results to\n * the next in the array. However, if any of the `tasks` pass an error to their\n * own callback, the next function is not executed, and the main `callback` is\n * immediately called with the error.\n *\n * @name waterfall\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Array} tasks - An array of [async functions]{@link AsyncFunction}\n * to run.\n * Each function should complete with any number of `result` values.\n * The `result` values will be passed as arguments, in order, to the next task.\n * @param {Function} [callback] - An optional callback to run once all the\n * functions have completed. This will be passed the results of the last task's\n * callback. Invoked with (err, [results]).\n * @returns undefined\n * @example\n *\n * async.waterfall([\n *     function(callback) {\n *         callback(null, 'one', 'two');\n *     },\n *     function(arg1, arg2, callback) {\n *         // arg1 now equals 'one' and arg2 now equals 'two'\n *         callback(null, 'three');\n *     },\n *     function(arg1, callback) {\n *         // arg1 now equals 'three'\n *         callback(null, 'done');\n *     }\n * ], function (err, result) {\n *     // result now equals 'done'\n * });\n *\n * // Or, with named functions:\n * async.waterfall([\n *     myFirstFunction,\n *     mySecondFunction,\n *     myLastFunction,\n * ], function (err, result) {\n *     // result now equals 'done'\n * });\n * function myFirstFunction(callback) {\n *     callback(null, 'one', 'two');\n * }\n * function mySecondFunction(arg1, arg2, callback) {\n *     // arg1 now equals 'one' and arg2 now equals 'two'\n *     callback(null, 'three');\n * }\n * function myLastFunction(arg1, callback) {\n *     // arg1 now equals 'three'\n *     callback(null, 'done');\n * }\n */"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/whilst.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = whilst;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _slice = require('./internal/slice');\n\nvar _slice2 = _interopRequireDefault(_slice);\n\nvar _onlyOnce = require('./internal/onlyOnce');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./internal/wrapAsync');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when\n * stopped, or an error occurs.\n *\n * @name whilst\n * @static\n * @memberOf module:ControlFlow\n * @method\n * @category Control Flow\n * @param {Function} test - synchronous truth test to perform before each\n * execution of `iteratee`. Invoked with ().\n * @param {AsyncFunction} iteratee - An async function which is called each time\n * `test` passes. Invoked with (callback).\n * @param {Function} [callback] - A callback which is called after the test\n * function has failed and repeated execution of `iteratee` has stopped. `callback`\n * will be passed an error and any arguments passed to the final `iteratee`'s\n * callback. Invoked with (err, [results]);\n * @returns undefined\n * @example\n *\n * var count = 0;\n * async.whilst(\n *     function() { return count < 5; },\n *     function(callback) {\n *         count++;\n *         setTimeout(function() {\n *             callback(null, count);\n *         }, 1000);\n *     },\n *     function (err, n) {\n *         // 5 seconds have passed, n = 5\n *     }\n * );\n */\nfunction whilst(test, iteratee, callback) {\n    callback = (0, _onlyOnce2.default)(callback || _noop2.default);\n    var _iteratee = (0, _wrapAsync2.default)(iteratee);\n    if (!test()) return callback(null);\n    var next = function (err /*, ...args*/) {\n        if (err) return callback(err);\n        if (test()) return _iteratee(next);\n        var args = (0, _slice2.default)(arguments, 1);\n        callback.apply(null, [null].concat(args));\n    };\n    _iteratee(next);\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/async/wrapSync.js",
    "content": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = asyncify;\n\nvar _isObject = require('lodash/isObject');\n\nvar _isObject2 = _interopRequireDefault(_isObject);\n\nvar _initialParams = require('./internal/initialParams');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _setImmediate = require('./internal/setImmediate');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Take a sync function and make it async, passing its return value to a\n * callback. This is useful for plugging sync functions into a waterfall,\n * series, or other async functions. Any arguments passed to the generated\n * function will be passed to the wrapped function (except for the final\n * callback argument). Errors thrown will be passed to the callback.\n *\n * If the function passed to `asyncify` returns a Promise, that promises's\n * resolved/rejected state will be used to call the callback, rather than simply\n * the synchronous return value.\n *\n * This also means you can asyncify ES2017 `async` functions.\n *\n * @name asyncify\n * @static\n * @memberOf module:Utils\n * @method\n * @alias wrapSync\n * @category Util\n * @param {Function} func - The synchronous function, or Promise-returning\n * function to convert to an {@link AsyncFunction}.\n * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be\n * invoked with `(args..., callback)`.\n * @example\n *\n * // passing a regular synchronous function\n * async.waterfall([\n *     async.apply(fs.readFile, filename, \"utf8\"),\n *     async.asyncify(JSON.parse),\n *     function (data, next) {\n *         // data is the result of parsing the text.\n *         // If there was a parsing error, it would have been caught.\n *     }\n * ], callback);\n *\n * // passing a function returning a promise\n * async.waterfall([\n *     async.apply(fs.readFile, filename, \"utf8\"),\n *     async.asyncify(function (contents) {\n *         return db.model.create(contents);\n *     }),\n *     function (model, next) {\n *         // `model` is the instantiated model object.\n *         // If there was an error, this function would be skipped.\n *     }\n * ], callback);\n *\n * // es2017 example, though `asyncify` is not needed if your JS environment\n * // supports async functions out of the box\n * var q = async.queue(async.asyncify(async function(file) {\n *     var intermediateStep = await processFile(file);\n *     return await somePromise(intermediateStep)\n * }));\n *\n * q.push(files);\n */\nfunction asyncify(func) {\n    return (0, _initialParams2.default)(function (args, callback) {\n        var result;\n        try {\n            result = func.apply(this, args);\n        } catch (e) {\n            return callback(e);\n        }\n        // if result is Promise object\n        if ((0, _isObject2.default)(result) && typeof result.then === 'function') {\n            result.then(function (value) {\n                invokeCallback(callback, null, value);\n            }, function (err) {\n                invokeCallback(callback, err.message ? err : new Error(err));\n            });\n        } else {\n            callback(null, result);\n        }\n    });\n}\n\nfunction invokeCallback(callback, error, value) {\n    try {\n        callback(error, value);\n    } catch (e) {\n        (0, _setImmediate2.default)(rethrow, e);\n    }\n}\n\nfunction rethrow(error) {\n    throw error;\n}\nmodule.exports = exports['default'];"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/basic-auth/HISTORY.md",
    "content": "2.0.1 / 2018-09-19\n==================\n\n  * deps: safe-buffer@5.1.2\n\n2.0.0 / 2017-09-12\n==================\n\n  * Drop support for Node.js below 0.8\n  * Remove `auth(ctx)` signature -- pass in header or `auth(ctx.req)`\n  * Use `safe-buffer` for improved Buffer API\n\n1.1.0 / 2016-11-18\n==================\n\n  * Add `auth.parse` for low-level string parsing\n\n1.0.4 / 2016-05-10\n==================\n\n  * Improve error message when `req` argument is not an object\n  * Improve error message when `req` missing `headers` property\n\n1.0.3 / 2015-07-01\n==================\n\n  * Fix regression accepting a Koa context\n\n1.0.2 / 2015-06-12\n==================\n\n  * Improve error message when `req` argument missing\n  * perf: enable strict mode\n  * perf: hoist regular expression\n  * perf: parse with regular expressions\n  * perf: remove argument reassignment\n\n1.0.1 / 2015-05-04\n==================\n\n  * Update readme\n\n1.0.0 / 2014-07-01\n==================\n\n  * Support empty password\n  * Support empty username\n\n0.0.1 / 2013-11-30\n==================\n\n  * Initial release\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/basic-auth/LICENSE",
    "content": "(The MIT License)\n\nCopyright (c) 2013 TJ Holowaychuk\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/basic-auth/README.md",
    "content": "# basic-auth\n\n[![NPM Version][npm-image]][npm-url]\n[![NPM Downloads][downloads-image]][downloads-url]\n[![Node.js Version][node-version-image]][node-version-url]\n[![Build Status][travis-image]][travis-url]\n[![Test Coverage][coveralls-image]][coveralls-url]\n\nGeneric basic auth Authorization header field parser for whatever.\n\n## Installation\n\nThis is a [Node.js](https://nodejs.org/en/) module available through the\n[npm registry](https://www.npmjs.com/). Installation is done using the\n[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):\n\n```\n$ npm install basic-auth\n```\n\n## API\n\n<!-- eslint-disable no-unused-vars -->\n\n```js\nvar auth = require('basic-auth')\n```\n\n### auth(req)\n\nGet the basic auth credentials from the given request. The `Authorization`\nheader is parsed and if the header is invalid, `undefined` is returned,\notherwise an object with `name` and `pass` properties.\n\n### auth.parse(string)\n\nParse a basic auth authorization header string. This will return an object\nwith `name` and `pass` properties, or `undefined` if the string is invalid.\n\n## Example\n\nPass a Node.js request object to the module export. If parsing fails\n`undefined` is returned, otherwise an object with `.name` and `.pass`.\n\n<!-- eslint-disable no-unused-vars, no-undef -->\n\n```js\nvar auth = require('basic-auth')\nvar user = auth(req)\n// => { name: 'something', pass: 'whatever' }\n```\n\nA header string from any other location can also be parsed with\n`auth.parse`, for example a `Proxy-Authorization` header:\n\n<!-- eslint-disable no-unused-vars, no-undef -->\n\n```js\nvar auth = require('basic-auth')\nvar user = auth.parse(req.getHeader('Proxy-Authorization'))\n```\n\n### With vanilla node.js http server\n\n```js\nvar http = require('http')\nvar auth = require('basic-auth')\nvar compare = require('tsscmp')\n\n// Create server\nvar server = http.createServer(function (req, res) {\n  var credentials = auth(req)\n\n  // Check credentials\n  // The \"check\" function will typically be against your user store\n  if (!credentials || !check(credentials.name, credentials.pass)) {\n    res.statusCode = 401\n    res.setHeader('WWW-Authenticate', 'Basic realm=\"example\"')\n    res.end('Access denied')\n  } else {\n    res.end('Access granted')\n  }\n})\n\n// Basic function to validate credentials for example\nfunction check (name, pass) {\n  var valid = true\n\n  // Simple method to prevent short-circut and use timing-safe compare\n  valid = compare(name, 'john') && valid\n  valid = compare(pass, 'secret') && valid\n\n  return valid\n}\n\n// Listen\nserver.listen(3000)\n```\n\n# License\n\n[MIT](LICENSE)\n\n[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/basic-auth/master\n[coveralls-url]: https://coveralls.io/r/jshttp/basic-auth?branch=master\n[downloads-image]: https://badgen.net/npm/dm/basic-auth\n[downloads-url]: https://npmjs.org/package/basic-auth\n[node-version-image]: https://badgen.net/npm/node/basic-auth\n[node-version-url]: https://nodejs.org/en/download\n[npm-image]: https://badgen.net/npm/v/basic-auth\n[npm-url]: https://npmjs.org/package/basic-auth\n[travis-image]: https://badgen.net/travis/jshttp/basic-auth/master\n[travis-url]: https://travis-ci.org/jshttp/basic-auth\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/basic-auth/index.js",
    "content": "/*!\n * basic-auth\n * Copyright(c) 2013 TJ Holowaychuk\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015-2016 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar Buffer = require('safe-buffer').Buffer\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = auth\nmodule.exports.parse = parse\n\n/**\n * RegExp for basic auth credentials\n *\n * credentials = auth-scheme 1*SP token68\n * auth-scheme = \"Basic\" ; case insensitive\n * token68     = 1*( ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\" / \"+\" / \"/\" ) *\"=\"\n * @private\n */\n\nvar CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/\n\n/**\n * RegExp for basic auth user/pass\n *\n * user-pass   = userid \":\" password\n * userid      = *<TEXT excluding \":\">\n * password    = *TEXT\n * @private\n */\n\nvar USER_PASS_REGEXP = /^([^:]*):(.*)$/\n\n/**\n * Parse the Authorization header field of a request.\n *\n * @param {object} req\n * @return {object} with .name and .pass\n * @public\n */\n\nfunction auth (req) {\n  if (!req) {\n    throw new TypeError('argument req is required')\n  }\n\n  if (typeof req !== 'object') {\n    throw new TypeError('argument req is required to be an object')\n  }\n\n  // get header\n  var header = getAuthorization(req)\n\n  // parse header\n  return parse(header)\n}\n\n/**\n * Decode base64 string.\n * @private\n */\n\nfunction decodeBase64 (str) {\n  return Buffer.from(str, 'base64').toString()\n}\n\n/**\n * Get the Authorization header from request object.\n * @private\n */\n\nfunction getAuthorization (req) {\n  if (!req.headers || typeof req.headers !== 'object') {\n    throw new TypeError('argument req is required to have headers property')\n  }\n\n  return req.headers.authorization\n}\n\n/**\n * Parse basic auth to object.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction parse (string) {\n  if (typeof string !== 'string') {\n    return undefined\n  }\n\n  // parse header\n  var match = CREDENTIALS_REGEXP.exec(string)\n\n  if (!match) {\n    return undefined\n  }\n\n  // decode user pass\n  var userPass = USER_PASS_REGEXP.exec(decodeBase64(match[1]))\n\n  if (!userPass) {\n    return undefined\n  }\n\n  // return credentials object\n  return new Credentials(userPass[1], userPass[2])\n}\n\n/**\n * Object to represent user credentials.\n * @private\n */\n\nfunction Credentials (name, pass) {\n  this.name = name\n  this.pass = pass\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/basic-auth/package.json",
    "content": "{\n  \"name\": \"basic-auth\",\n  \"description\": \"node.js basic auth parser\",\n  \"version\": \"2.0.1\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"basic\",\n    \"auth\",\n    \"authorization\",\n    \"basicauth\"\n  ],\n  \"repository\": \"jshttp/basic-auth\",\n  \"dependencies\": {\n    \"safe-buffer\": \"5.1.2\"\n  },\n  \"devDependencies\": {\n    \"eslint\": \"5.6.0\",\n    \"eslint-config-standard\": \"12.0.0\",\n    \"eslint-plugin-import\": \"2.14.0\",\n    \"eslint-plugin-markdown\": \"1.0.0-beta.6\",\n    \"eslint-plugin-node\": \"7.0.1\",\n    \"eslint-plugin-promise\": \"4.0.1\",\n    \"eslint-plugin-standard\": \"4.0.0\",\n    \"istanbul\": \"0.4.5\",\n    \"mocha\": \"5.2.0\"\n  },\n  \"files\": [\n    \"HISTORY.md\",\n    \"LICENSE\",\n    \"index.js\"\n  ],\n  \"engines\": {\n    \"node\": \">= 0.8\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint --plugin markdown --ext js,md .\",\n    \"test\": \"mocha --check-leaks --reporter spec --bail\",\n    \"test-cov\": \"istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/\",\n    \"test-travis\": \"istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/index.d.ts",
    "content": "/**\nBasic foreground colors.\n\n[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)\n*/\ndeclare type ForegroundColor =\n\t| 'black'\n\t| 'red'\n\t| 'green'\n\t| 'yellow'\n\t| 'blue'\n\t| 'magenta'\n\t| 'cyan'\n\t| 'white'\n\t| 'gray'\n\t| 'grey'\n\t| 'blackBright'\n\t| 'redBright'\n\t| 'greenBright'\n\t| 'yellowBright'\n\t| 'blueBright'\n\t| 'magentaBright'\n\t| 'cyanBright'\n\t| 'whiteBright';\n\n/**\nBasic background colors.\n\n[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)\n*/\ndeclare type BackgroundColor =\n\t| 'bgBlack'\n\t| 'bgRed'\n\t| 'bgGreen'\n\t| 'bgYellow'\n\t| 'bgBlue'\n\t| 'bgMagenta'\n\t| 'bgCyan'\n\t| 'bgWhite'\n\t| 'bgGray'\n\t| 'bgGrey'\n\t| 'bgBlackBright'\n\t| 'bgRedBright'\n\t| 'bgGreenBright'\n\t| 'bgYellowBright'\n\t| 'bgBlueBright'\n\t| 'bgMagentaBright'\n\t| 'bgCyanBright'\n\t| 'bgWhiteBright';\n\n/**\nBasic colors.\n\n[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)\n*/\ndeclare type Color = ForegroundColor | BackgroundColor;\n\ndeclare type Modifiers =\n\t| 'reset'\n\t| 'bold'\n\t| 'dim'\n\t| 'italic'\n\t| 'underline'\n\t| 'inverse'\n\t| 'hidden'\n\t| 'strikethrough'\n\t| 'visible';\n\ndeclare namespace chalk {\n\t/**\n\tLevels:\n\t- `0` - All colors disabled.\n\t- `1` - Basic 16 colors support.\n\t- `2` - ANSI 256 colors support.\n\t- `3` - Truecolor 16 million colors support.\n\t*/\n\ttype Level = 0 | 1 | 2 | 3;\n\n\tinterface Options {\n\t\t/**\n\t\tSpecify the color support for Chalk.\n\n\t\tBy default, color support is automatically detected based on the environment.\n\n\t\tLevels:\n\t\t- `0` - All colors disabled.\n\t\t- `1` - Basic 16 colors support.\n\t\t- `2` - ANSI 256 colors support.\n\t\t- `3` - Truecolor 16 million colors support.\n\t\t*/\n\t\tlevel?: Level;\n\t}\n\n\t/**\n\tReturn a new Chalk instance.\n\t*/\n\ttype Instance = new (options?: Options) => Chalk;\n\n\t/**\n\tDetect whether the terminal supports color.\n\t*/\n\tinterface ColorSupport {\n\t\t/**\n\t\tThe color level used by Chalk.\n\t\t*/\n\t\tlevel: Level;\n\n\t\t/**\n\t\tReturn whether Chalk supports basic 16 colors.\n\t\t*/\n\t\thasBasic: boolean;\n\n\t\t/**\n\t\tReturn whether Chalk supports ANSI 256 colors.\n\t\t*/\n\t\thas256: boolean;\n\n\t\t/**\n\t\tReturn whether Chalk supports Truecolor 16 million colors.\n\t\t*/\n\t\thas16m: boolean;\n\t}\n\n\tinterface ChalkFunction {\n\t\t/**\n\t\tUse a template string.\n\n\t\t@remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341))\n\n\t\t@example\n\t\t```\n\t\timport chalk = require('chalk');\n\n\t\tlog(chalk`\n\t\tCPU: {red ${cpu.totalPercent}%}\n\t\tRAM: {green ${ram.used / ram.total * 100}%}\n\t\tDISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}\n\t\t`);\n\t\t```\n\n\t\t@example\n\t\t```\n\t\timport chalk = require('chalk');\n\n\t\tlog(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`)\n\t\t```\n\t\t*/\n\t\t(text: TemplateStringsArray, ...placeholders: unknown[]): string;\n\n\t\t(...text: unknown[]): string;\n\t}\n\n\tinterface Chalk extends ChalkFunction {\n\t\t/**\n\t\tReturn a new Chalk instance.\n\t\t*/\n\t\tInstance: Instance;\n\n\t\t/**\n\t\tThe color support for Chalk.\n\n\t\tBy default, color support is automatically detected based on the environment.\n\n\t\tLevels:\n\t\t- `0` - All colors disabled.\n\t\t- `1` - Basic 16 colors support.\n\t\t- `2` - ANSI 256 colors support.\n\t\t- `3` - Truecolor 16 million colors support.\n\t\t*/\n\t\tlevel: Level;\n\n\t\t/**\n\t\tUse HEX value to set text color.\n\n\t\t@param color - Hexadecimal value representing the desired color.\n\n\t\t@example\n\t\t```\n\t\timport chalk = require('chalk');\n\n\t\tchalk.hex('#DEADED');\n\t\t```\n\t\t*/\n\t\thex(color: string): Chalk;\n\n\t\t/**\n\t\tUse keyword color value to set text color.\n\n\t\t@param color - Keyword value representing the desired color.\n\n\t\t@example\n\t\t```\n\t\timport chalk = require('chalk');\n\n\t\tchalk.keyword('orange');\n\t\t```\n\t\t*/\n\t\tkeyword(color: string): Chalk;\n\n\t\t/**\n\t\tUse RGB values to set text color.\n\t\t*/\n\t\trgb(red: number, green: number, blue: number): Chalk;\n\n\t\t/**\n\t\tUse HSL values to set text color.\n\t\t*/\n\t\thsl(hue: number, saturation: number, lightness: number): Chalk;\n\n\t\t/**\n\t\tUse HSV values to set text color.\n\t\t*/\n\t\thsv(hue: number, saturation: number, value: number): Chalk;\n\n\t\t/**\n\t\tUse HWB values to set text color.\n\t\t*/\n\t\thwb(hue: number, whiteness: number, blackness: number): Chalk;\n\n\t\t/**\n\t\tUse a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color.\n\n\t\t30 <= code && code < 38 || 90 <= code && code < 98\n\t\tFor example, 31 for red, 91 for redBright.\n\t\t*/\n\t\tansi(code: number): Chalk;\n\n\t\t/**\n\t\tUse a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.\n\t\t*/\n\t\tansi256(index: number): Chalk;\n\n\t\t/**\n\t\tUse HEX value to set background color.\n\n\t\t@param color - Hexadecimal value representing the desired color.\n\n\t\t@example\n\t\t```\n\t\timport chalk = require('chalk');\n\n\t\tchalk.bgHex('#DEADED');\n\t\t```\n\t\t*/\n\t\tbgHex(color: string): Chalk;\n\n\t\t/**\n\t\tUse keyword color value to set background color.\n\n\t\t@param color - Keyword value representing the desired color.\n\n\t\t@example\n\t\t```\n\t\timport chalk = require('chalk');\n\n\t\tchalk.bgKeyword('orange');\n\t\t```\n\t\t*/\n\t\tbgKeyword(color: string): Chalk;\n\n\t\t/**\n\t\tUse RGB values to set background color.\n\t\t*/\n\t\tbgRgb(red: number, green: number, blue: number): Chalk;\n\n\t\t/**\n\t\tUse HSL values to set background color.\n\t\t*/\n\t\tbgHsl(hue: number, saturation: number, lightness: number): Chalk;\n\n\t\t/**\n\t\tUse HSV values to set background color.\n\t\t*/\n\t\tbgHsv(hue: number, saturation: number, value: number): Chalk;\n\n\t\t/**\n\t\tUse HWB values to set background color.\n\t\t*/\n\t\tbgHwb(hue: number, whiteness: number, blackness: number): Chalk;\n\n\t\t/**\n\t\tUse a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color.\n\n\t\t30 <= code && code < 38 || 90 <= code && code < 98\n\t\tFor example, 31 for red, 91 for redBright.\n\t\tUse the foreground code, not the background code (for example, not 41, nor 101).\n\t\t*/\n\t\tbgAnsi(code: number): Chalk;\n\n\t\t/**\n\t\tUse a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color.\n\t\t*/\n\t\tbgAnsi256(index: number): Chalk;\n\n\t\t/**\n\t\tModifier: Resets the current color chain.\n\t\t*/\n\t\treadonly reset: Chalk;\n\n\t\t/**\n\t\tModifier: Make text bold.\n\t\t*/\n\t\treadonly bold: Chalk;\n\n\t\t/**\n\t\tModifier: Emitting only a small amount of light.\n\t\t*/\n\t\treadonly dim: Chalk;\n\n\t\t/**\n\t\tModifier: Make text italic. (Not widely supported)\n\t\t*/\n\t\treadonly italic: Chalk;\n\n\t\t/**\n\t\tModifier: Make text underline. (Not widely supported)\n\t\t*/\n\t\treadonly underline: Chalk;\n\n\t\t/**\n\t\tModifier: Inverse background and foreground colors.\n\t\t*/\n\t\treadonly inverse: Chalk;\n\n\t\t/**\n\t\tModifier: Prints the text, but makes it invisible.\n\t\t*/\n\t\treadonly hidden: Chalk;\n\n\t\t/**\n\t\tModifier: Puts a horizontal line through the center of the text. (Not widely supported)\n\t\t*/\n\t\treadonly strikethrough: Chalk;\n\n\t\t/**\n\t\tModifier: Prints the text only when Chalk has a color support level > 0.\n\t\tCan be useful for things that are purely cosmetic.\n\t\t*/\n\t\treadonly visible: Chalk;\n\n\t\treadonly black: Chalk;\n\t\treadonly red: Chalk;\n\t\treadonly green: Chalk;\n\t\treadonly yellow: Chalk;\n\t\treadonly blue: Chalk;\n\t\treadonly magenta: Chalk;\n\t\treadonly cyan: Chalk;\n\t\treadonly white: Chalk;\n\n\t\t/*\n\t\tAlias for `blackBright`.\n\t\t*/\n\t\treadonly gray: Chalk;\n\n\t\t/*\n\t\tAlias for `blackBright`.\n\t\t*/\n\t\treadonly grey: Chalk;\n\n\t\treadonly blackBright: Chalk;\n\t\treadonly redBright: Chalk;\n\t\treadonly greenBright: Chalk;\n\t\treadonly yellowBright: Chalk;\n\t\treadonly blueBright: Chalk;\n\t\treadonly magentaBright: Chalk;\n\t\treadonly cyanBright: Chalk;\n\t\treadonly whiteBright: Chalk;\n\n\t\treadonly bgBlack: Chalk;\n\t\treadonly bgRed: Chalk;\n\t\treadonly bgGreen: Chalk;\n\t\treadonly bgYellow: Chalk;\n\t\treadonly bgBlue: Chalk;\n\t\treadonly bgMagenta: Chalk;\n\t\treadonly bgCyan: Chalk;\n\t\treadonly bgWhite: Chalk;\n\n\t\t/*\n\t\tAlias for `bgBlackBright`.\n\t\t*/\n\t\treadonly bgGray: Chalk;\n\n\t\t/*\n\t\tAlias for `bgBlackBright`.\n\t\t*/\n\t\treadonly bgGrey: Chalk;\n\n\t\treadonly bgBlackBright: Chalk;\n\t\treadonly bgRedBright: Chalk;\n\t\treadonly bgGreenBright: Chalk;\n\t\treadonly bgYellowBright: Chalk;\n\t\treadonly bgBlueBright: Chalk;\n\t\treadonly bgMagentaBright: Chalk;\n\t\treadonly bgCyanBright: Chalk;\n\t\treadonly bgWhiteBright: Chalk;\n\t}\n}\n\n/**\nMain Chalk object that allows to chain styles together.\nCall the last one as a method with a string argument.\nOrder doesn't matter, and later styles take precedent in case of a conflict.\nThis simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.\n*/\ndeclare const chalk: chalk.Chalk & chalk.ChalkFunction & {\n\tsupportsColor: chalk.ColorSupport | false;\n\tLevel: chalk.Level;\n\tColor: Color;\n\tForegroundColor: ForegroundColor;\n\tBackgroundColor: BackgroundColor;\n\tModifiers: Modifiers;\n\tstderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false};\n};\n\nexport = chalk;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/license",
    "content": "MIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/package.json",
    "content": "{\n\t\"name\": \"chalk\",\n\t\"version\": \"4.1.2\",\n\t\"description\": \"Terminal string styling done right\",\n\t\"license\": \"MIT\",\n\t\"repository\": \"chalk/chalk\",\n\t\"funding\": \"https://github.com/chalk/chalk?sponsor=1\",\n\t\"main\": \"source\",\n\t\"engines\": {\n\t\t\"node\": \">=10\"\n\t},\n\t\"scripts\": {\n\t\t\"test\": \"xo && nyc ava && tsd\",\n\t\t\"bench\": \"matcha benchmark.js\"\n\t},\n\t\"files\": [\n\t\t\"source\",\n\t\t\"index.d.ts\"\n\t],\n\t\"keywords\": [\n\t\t\"color\",\n\t\t\"colour\",\n\t\t\"colors\",\n\t\t\"terminal\",\n\t\t\"console\",\n\t\t\"cli\",\n\t\t\"string\",\n\t\t\"str\",\n\t\t\"ansi\",\n\t\t\"style\",\n\t\t\"styles\",\n\t\t\"tty\",\n\t\t\"formatting\",\n\t\t\"rgb\",\n\t\t\"256\",\n\t\t\"shell\",\n\t\t\"xterm\",\n\t\t\"log\",\n\t\t\"logging\",\n\t\t\"command-line\",\n\t\t\"text\"\n\t],\n\t\"dependencies\": {\n\t\t\"ansi-styles\": \"^4.1.0\",\n\t\t\"supports-color\": \"^7.1.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"ava\": \"^2.4.0\",\n\t\t\"coveralls\": \"^3.0.7\",\n\t\t\"execa\": \"^4.0.0\",\n\t\t\"import-fresh\": \"^3.1.0\",\n\t\t\"matcha\": \"^0.7.0\",\n\t\t\"nyc\": \"^15.0.0\",\n\t\t\"resolve-from\": \"^5.0.0\",\n\t\t\"tsd\": \"^0.7.4\",\n\t\t\"xo\": \"^0.28.2\"\n\t},\n\t\"xo\": {\n\t\t\"rules\": {\n\t\t\t\"unicorn/prefer-string-slice\": \"off\",\n\t\t\t\"unicorn/prefer-includes\": \"off\",\n\t\t\t\"@typescript-eslint/member-ordering\": \"off\",\n\t\t\t\"no-redeclare\": \"off\",\n\t\t\t\"unicorn/string-content\": \"off\",\n\t\t\t\"unicorn/better-regex\": \"off\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/readme.md",
    "content": "<h1 align=\"center\">\n\t<br>\n\t<br>\n\t<img width=\"320\" src=\"media/logo.svg\" alt=\"Chalk\">\n\t<br>\n\t<br>\n\t<br>\n</h1>\n\n> Terminal string styling done right\n\n[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk)\n\n<img src=\"https://cdn.jsdelivr.net/gh/chalk/ansi-styles@8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg\" width=\"900\">\n\n<br>\n\n---\n\n<div align=\"center\">\n\t<p>\n\t\t<p>\n\t\t\t<sup>\n\t\t\t\tSindre Sorhus' open source work is supported by the community on <a href=\"https://github.com/sponsors/sindresorhus\">GitHub Sponsors</a> and <a href=\"https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15\">Dev</a>\n\t\t\t</sup>\n\t\t</p>\n\t\t<sup>Special thanks to:</sup>\n\t\t<br>\n\t\t<br>\n\t\t<a href=\"https://standardresume.co/tech\">\n\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/standard-resume-logo.svg\" width=\"160\"/>\n\t\t</a>\n\t\t<br>\n\t\t<br>\n\t\t<a href=\"https://retool.com/?utm_campaign=sindresorhus\">\n\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/retool-logo.svg\" width=\"230\"/>\n\t\t</a>\n\t\t<br>\n\t\t<br>\n\t\t<a href=\"https://doppler.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=chalk&utm_source=github\">\n\t\t\t<div>\n\t\t\t\t<img src=\"https://dashboard.doppler.com/imgs/logo-long.svg\" width=\"240\" alt=\"Doppler\">\n\t\t\t</div>\n\t\t\t<b>All your environment variables, in one place</b>\n\t\t\t<div>\n\t\t\t\t<span>Stop struggling with scattered API keys, hacking together home-brewed tools,</span>\n\t\t\t\t<br>\n\t\t\t\t<span>and avoiding access controls. Keep your team and servers in sync with Doppler.</span>\n\t\t\t</div>\n\t\t</a>\n\t\t<br>\n\t\t<a href=\"https://uibakery.io/?utm_source=chalk&utm_medium=sponsor&utm_campaign=github\">\n\t\t\t<div>\n\t\t\t\t<img src=\"https://sindresorhus.com/assets/thanks/uibakery-logo.jpg\" width=\"270\" alt=\"UI Bakery\">\n\t\t\t</div>\n\t\t</a>\n\t</p>\n</div>\n\n---\n\n<br>\n\n## Highlights\n\n- Expressive API\n- Highly performant\n- Ability to nest styles\n- [256/Truecolor color support](#256-and-truecolor-color-support)\n- Auto-detects color support\n- Doesn't extend `String.prototype`\n- Clean and focused\n- Actively maintained\n- [Used by ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020\n\n## Install\n\n```console\n$ npm install chalk\n```\n\n## Usage\n\n```js\nconst chalk = require('chalk');\n\nconsole.log(chalk.blue('Hello world!'));\n```\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nconst chalk = require('chalk');\nconst log = console.log;\n\n// Combine styled and normal strings\nlog(chalk.blue('Hello') + ' World' + chalk.red('!'));\n\n// Compose multiple styles using the chainable API\nlog(chalk.blue.bgRed.bold('Hello world!'));\n\n// Pass in multiple arguments\nlog(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));\n\n// Nest styles\nlog(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));\n\n// Nest styles of the same type even (color, underline, background)\nlog(chalk.green(\n\t'I am a green line ' +\n\tchalk.blue.underline.bold('with a blue substring') +\n\t' that becomes green again!'\n));\n\n// ES2015 template literal\nlog(`\nCPU: ${chalk.red('90%')}\nRAM: ${chalk.green('40%')}\nDISK: ${chalk.yellow('70%')}\n`);\n\n// ES2015 tagged template literal\nlog(chalk`\nCPU: {red ${cpu.totalPercent}%}\nRAM: {green ${ram.used / ram.total * 100}%}\nDISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}\n`);\n\n// Use RGB colors in terminal emulators that support it.\nlog(chalk.keyword('orange')('Yay for orange colored text!'));\nlog(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));\nlog(chalk.hex('#DEADED').bold('Bold gray!'));\n```\n\nEasily define your own themes:\n\n```js\nconst chalk = require('chalk');\n\nconst error = chalk.bold.red;\nconst warning = chalk.keyword('orange');\n\nconsole.log(error('Error!'));\nconsole.log(warning('Warning!'));\n```\n\nTake advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):\n\n```js\nconst name = 'Sindre';\nconsole.log(chalk.green('Hello %s'), name);\n//=> 'Hello Sindre'\n```\n\n## API\n\n### chalk.`<style>[.<style>...](string, [string...])`\n\nExample: `chalk.red.bold.underline('Hello', 'world');`\n\nChain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.\n\nMultiple arguments will be separated by space.\n\n### chalk.level\n\nSpecifies the level of color support.\n\nColor support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.\n\nIf you need to change this in a reusable module, create a new instance:\n\n```js\nconst ctx = new chalk.Instance({level: 0});\n```\n\n| Level | Description |\n| :---: | :--- |\n| `0` | All colors disabled |\n| `1` | Basic color support (16 colors) |\n| `2` | 256 color support |\n| `3` | Truecolor support (16 million colors) |\n\n### chalk.supportsColor\n\nDetect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.\n\nCan be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.\n\nExplicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.\n\n### chalk.stderr and chalk.stderr.supportsColor\n\n`chalk.stderr` contains a separate instance configured with color support detected for `stderr` stream instead of `stdout`. Override rules from `chalk.supportsColor` apply to this too. `chalk.stderr.supportsColor` is exposed for convenience.\n\n## Styles\n\n### Modifiers\n\n- `reset` - Resets the current color chain.\n- `bold` - Make text bold.\n- `dim` - Emitting only a small amount of light.\n- `italic` - Make text italic. *(Not widely supported)*\n- `underline` - Make text underline. *(Not widely supported)*\n- `inverse`- Inverse background and foreground colors.\n- `hidden` - Prints the text, but makes it invisible.\n- `strikethrough` - Puts a horizontal line through the center of the text. *(Not widely supported)*\n- `visible`- Prints the text only when Chalk has a color level > 0. Can be useful for things that are purely cosmetic.\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `blackBright` (alias: `gray`, `grey`)\n- `redBright`\n- `greenBright`\n- `yellowBright`\n- `blueBright`\n- `magentaBright`\n- `cyanBright`\n- `whiteBright`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n- `bgBlackBright` (alias: `bgGray`, `bgGrey`)\n- `bgRedBright`\n- `bgGreenBright`\n- `bgYellowBright`\n- `bgBlueBright`\n- `bgMagentaBright`\n- `bgCyanBright`\n- `bgWhiteBright`\n\n## Tagged template literal\n\nChalk can be used as a [tagged template literal](https://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals).\n\n```js\nconst chalk = require('chalk');\n\nconst miles = 18;\nconst calculateFeet = miles => miles * 5280;\n\nconsole.log(chalk`\n\tThere are {bold 5280 feet} in a mile.\n\tIn {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.\n`);\n```\n\nBlocks are delimited by an opening curly brace (`{`), a style, some content, and a closing curly brace (`}`).\n\nTemplate styles are chained exactly like normal Chalk styles. The following three statements are equivalent:\n\n```js\nconsole.log(chalk.bold.rgb(10, 100, 200)('Hello!'));\nconsole.log(chalk.bold.rgb(10, 100, 200)`Hello!`);\nconsole.log(chalk`{bold.rgb(10,100,200) Hello!}`);\n```\n\nNote that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters.\n\nAll interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped.\n\n## 256 and Truecolor color support\n\nChalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.\n\nColors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).\n\nExamples:\n\n- `chalk.hex('#DEADED').underline('Hello, world!')`\n- `chalk.keyword('orange')('Some orange text')`\n- `chalk.rgb(15, 100, 204).inverse('Hello!')`\n\nBackground versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `keyword` for foreground colors and `bgKeyword` for background colors).\n\n- `chalk.bgHex('#DEADED').underline('Hello, world!')`\n- `chalk.bgKeyword('orange')('Some orange text')`\n- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`\n\nThe following color models can be used:\n\n- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`\n- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`\n- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')`\n- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')`\n- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')`\n- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model) - Example: `chalk.hwb(32, 0, 50).bold('Orange!')`\n- [`ansi`](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) - Example: `chalk.ansi(31).bgAnsi(93)('red on yellowBright')`\n- [`ansi256`](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) - Example: `chalk.bgAnsi256(194)('Honeydew, more or less')`\n\n## Windows\n\nIf you're on Windows, do yourself a favor and use [Windows Terminal](https://github.com/microsoft/terminal) instead of `cmd.exe`.\n\n## Origin story\n\n[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.\n\n## chalk for enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of chalk and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-chalk?utm_source=npm-chalk&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n## Related\n\n- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module\n- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal\n- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color\n- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes\n- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes\n- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes\n- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models\n- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal\n- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings\n- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings\n- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/source/index.js",
    "content": "'use strict';\nconst ansiStyles = require('ansi-styles');\nconst {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');\nconst {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n} = require('./util');\n\nconst {isArray} = Array;\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m'\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nclass ChalkClass {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = {};\n\tapplyOptions(chalk, options);\n\n\tchalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);\n\n\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\tObject.setPrototypeOf(chalk.template, chalk);\n\n\tchalk.template.constructor = () => {\n\t\tthrow new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');\n\t};\n\n\tchalk.template.Instance = ChalkClass;\n\n\treturn chalk.template;\n};\n\nfunction Chalk(options) {\n\treturn chalkFactory(options);\n}\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this._styler, true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t}\n};\n\nconst usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nfor (const model of usedModels) {\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this._generator.level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis._generator.level = level;\n\t\t}\n\t}\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\tconst builder = (...arguments_) => {\n\t\tif (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {\n\t\t\t// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`\n\t\t\treturn applyStyle(builder, chalkTag(builder, ...arguments_));\n\t\t}\n\n\t\t// Single argument is hot path, implicit coercion is faster than anything\n\t\t// eslint-disable-next-line no-implicit-coercion\n\t\treturn applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\t};\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder._generator = self;\n\tbuilder._styler = _styler;\n\tbuilder._isEmpty = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self._isEmpty ? '' : string;\n\t}\n\n\tlet styler = self._styler;\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.indexOf('\\u001B') !== -1) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nlet template;\nconst chalkTag = (chalk, ...strings) => {\n\tconst [firstString] = strings;\n\n\tif (!isArray(firstString) || !isArray(firstString.raw)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn strings.join(' ');\n\t}\n\n\tconst arguments_ = strings.slice(1);\n\tconst parts = [firstString.raw[0]];\n\n\tfor (let i = 1; i < firstString.length; i++) {\n\t\tparts.push(\n\t\t\tString(arguments_[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'),\n\t\t\tString(firstString.raw[i])\n\t\t);\n\t}\n\n\tif (template === undefined) {\n\t\ttemplate = require('./templates');\n\t}\n\n\treturn template(chalk, parts.join(''));\n};\n\nObject.defineProperties(Chalk.prototype, styles);\n\nconst chalk = Chalk(); // eslint-disable-line new-cap\nchalk.supportsColor = stdoutColor;\nchalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap\nchalk.stderr.supportsColor = stderrColor;\n\nmodule.exports = chalk;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/source/templates.js",
    "content": "'use strict';\nconst TEMPLATE_REGEX = /(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tconst u = c[0] === 'u';\n\tconst bracket = c[1] === '{';\n\n\tif ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\tif (u && bracket) {\n\t\treturn String.fromCodePoint(parseInt(c.slice(2, -1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, arguments_) {\n\tconst results = [];\n\tconst chunks = arguments_.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tconst number = Number(chunk);\n\t\tif (!Number.isNaN(number)) {\n\t\t\tresults.push(number);\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const [styleName, styles] of Object.entries(enabled)) {\n\t\tif (!Array.isArray(styles)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!(styleName in current)) {\n\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t}\n\n\t\tcurrent = styles.length > 0 ? current[styleName](...styles) : current[styleName];\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, temporary) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttemporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {\n\t\tif (escapeCharacter) {\n\t\t\tchunk.push(unescape(escapeCharacter));\n\t\t} else if (style) {\n\t\t\tconst string = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(character);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMessage);\n\t}\n\n\treturn chunks.join('');\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/chalk/source/util.js",
    "content": "'use strict';\n\nconst stringReplaceAll = (string, substring, replacer) => {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.substr(endIndex, index - endIndex) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nconst stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nmodule.exports = {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/CHANGELOG.md",
    "content": "# 1.0.0 - 2016-01-07\n\n- Removed: unused speed test\n- Added: Automatic routing between previously unsupported conversions\n([#27](https://github.com/Qix-/color-convert/pull/27))\n- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions\n([#27](https://github.com/Qix-/color-convert/pull/27))\n- Removed: `convert()` class\n([#27](https://github.com/Qix-/color-convert/pull/27))\n- Changed: all functions to lookup dictionary\n([#27](https://github.com/Qix-/color-convert/pull/27))\n- Changed: `ansi` to `ansi256`\n([#27](https://github.com/Qix-/color-convert/pull/27))\n- Fixed: argument grouping for functions requiring only one argument\n([#27](https://github.com/Qix-/color-convert/pull/27))\n\n# 0.6.0 - 2015-07-23\n\n- Added: methods to handle\n[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:\n  - rgb2ansi16\n  - rgb2ansi\n  - hsl2ansi16\n  - hsl2ansi\n  - hsv2ansi16\n  - hsv2ansi\n  - hwb2ansi16\n  - hwb2ansi\n  - cmyk2ansi16\n  - cmyk2ansi\n  - keyword2ansi16\n  - keyword2ansi\n  - ansi162rgb\n  - ansi162hsl\n  - ansi162hsv\n  - ansi162hwb\n  - ansi162cmyk\n  - ansi162keyword\n  - ansi2rgb\n  - ansi2hsl\n  - ansi2hsv\n  - ansi2hwb\n  - ansi2cmyk\n  - ansi2keyword\n([#18](https://github.com/harthur/color-convert/pull/18))\n\n# 0.5.3 - 2015-06-02\n\n- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`\n([#15](https://github.com/harthur/color-convert/issues/15))\n\n---\n\nCheck out commit logs for older releases\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/LICENSE",
    "content": "Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/README.md",
    "content": "# color-convert\n\n[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)\n\nColor-convert is a color conversion library for JavaScript and node.\nIt converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):\n\n```js\nvar convert = require('color-convert');\n\nconvert.rgb.hsl(140, 200, 100);             // [96, 48, 59]\nconvert.keyword.rgb('blue');                // [0, 0, 255]\n\nvar rgbChannels = convert.rgb.channels;     // 3\nvar cmykChannels = convert.cmyk.channels;   // 4\nvar ansiChannels = convert.ansi16.channels; // 1\n```\n\n# Install\n\n```console\n$ npm install color-convert\n```\n\n# API\n\nSimply get the property of the _from_ and _to_ conversion that you're looking for.\n\nAll functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.\n\nAll 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).\n\n```js\nvar convert = require('color-convert');\n\n// Hex to LAB\nconvert.hex.lab('DEADBF');         // [ 76, 21, -2 ]\nconvert.hex.lab.raw('DEADBF');     // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]\n\n// RGB to CMYK\nconvert.rgb.cmyk(167, 255, 4);     // [ 35, 0, 98, 0 ]\nconvert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]\n```\n\n### Arrays\nAll functions that accept multiple arguments also support passing an array.\n\nNote that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)\n\n```js\nvar convert = require('color-convert');\n\nconvert.rgb.hex(123, 45, 67);      // '7B2D43'\nconvert.rgb.hex([123, 45, 67]);    // '7B2D43'\n```\n\n## Routing\n\nConversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).\n\nKeep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of \"direct\" (single-step) conversions, see [conversions.js](conversions.js).\n\n# Contribute\n\nIf there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.\n\n# License\nCopyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/conversions.js",
    "content": "/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v;  g = n;  b = wh; break;\n\t\tcase 1: r = n;  g = v;  b = wh; break;\n\t\tcase 2: r = wh; g = v;  b = n; break;\n\t\tcase 3: r = wh; g = n;  b = v; break;\n\t\tcase 4: r = n;  g = wh; b = v; break;\n\t\tcase 5: r = v;  g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/index.js",
    "content": "const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/package.json",
    "content": "{\n  \"name\": \"color-convert\",\n  \"description\": \"Plain color conversion functions\",\n  \"version\": \"2.0.1\",\n  \"author\": \"Heather Arthur <fayearthur@gmail.com>\",\n  \"license\": \"MIT\",\n  \"repository\": \"Qix-/color-convert\",\n  \"scripts\": {\n    \"pretest\": \"xo\",\n    \"test\": \"node test/basic.js\"\n  },\n  \"engines\": {\n    \"node\": \">=7.0.0\"\n  },\n  \"keywords\": [\n    \"color\",\n    \"colour\",\n    \"convert\",\n    \"converter\",\n    \"conversion\",\n    \"rgb\",\n    \"hsl\",\n    \"hsv\",\n    \"hwb\",\n    \"cmyk\",\n    \"ansi\",\n    \"ansi16\"\n  ],\n  \"files\": [\n    \"index.js\",\n    \"conversions.js\",\n    \"route.js\"\n  ],\n  \"xo\": {\n    \"rules\": {\n      \"default-case\": 0,\n      \"no-inline-comments\": 0,\n      \"operator-linebreak\": 0\n    }\n  },\n  \"devDependencies\": {\n    \"chalk\": \"^2.4.2\",\n    \"xo\": \"^0.24.0\"\n  },\n  \"dependencies\": {\n    \"color-name\": \"~1.1.4\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-convert/route.js",
    "content": "const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-name/LICENSE",
    "content": "The MIT License (MIT)\nCopyright (c) 2015 Dmitry Ivanov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-name/README.md",
    "content": "A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.\n\n[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)\n\n\n```js\nvar colors = require('color-name');\ncolors.red //[255,0,0]\n```\n\n<a href=\"LICENSE\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg\" width=\"120\"/></a>\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-name/index.js",
    "content": "'use strict'\n\nmodule.exports = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/color-name/package.json",
    "content": "{\n  \"name\": \"color-name\",\n  \"version\": \"1.1.4\",\n  \"description\": \"A list of color names and its values\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"test\": \"node test.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:colorjs/color-name.git\"\n  },\n  \"keywords\": [\n    \"color-name\",\n    \"color\",\n    \"color-keyword\",\n    \"keyword\"\n  ],\n  \"author\": \"DY <dfcreative@gmail.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/colorjs/color-name/issues\"\n  },\n  \"homepage\": \"https://github.com/colorjs/color-name\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/corser/.npmignore",
    "content": "example/\ntest/\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/corser/.travis.yml",
    "content": "language: node_js\nnode_js:\n - \"node\"\nsudo: false\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/corser/LICENSE",
    "content": "Copyright (C) 2012 Alexander Grüneberg\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/corser/README.md",
    "content": "Corser\n=======\n\n[![Project Status: Active - The project has reached a stable, usable state and is being actively developed.](http://www.repostatus.org/badges/0.1.0/active.svg)](http://www.repostatus.org/#active)\n[![Build Status](https://secure.travis-ci.org/agrueneberg/Corser.png)](http://travis-ci.org/agrueneberg/Corser)\n\nA highly configurable, middleware compatible implementation of [CORS](http://www.w3.org/TR/cors/) for [Node.js](http://nodejs.org/).\n\n\nChangelog\n---------\n\n### 2.0.1 (August 16, 2016)\n\n* Add workaround for [Chrome 52 sending empty `Access-Control-Request-Headers` header](https://bugs.chromium.org/p/chromium/issues/detail?id=633729).\n\n### 2.0.0 (March 22, 2014)\n\n* Preflight requests are automatically closed. If there is a need for handling `OPTIONS` requests, check the `endPreflightRequests` option.\n* The parameters of the callback function in dynamic origin checking are now `(err, matches)` instead of just `(matches)`.\n\n\nExamples\n--------\n\n### How to use Corser as a middleware in Express\n\nSee `example/express/` for a working example.\n\n    var express, corser, app;\n\n    express = require(\"express\");\n    corser = require(\"corser\");\n\n    app = express();\n\n    app.use(corser.create());\n\n    app.get(\"/\", function (req, res) {\n        res.writeHead(200);\n        res.end(\"Nice weather today, huh?\");\n    });\n\n    app.listen(1337);\n\n### How to use Corser as a middleware in Connect\n\nSee `example/connect/` for a working example.\n\n    var connect, corser, app;\n\n    connect = require(\"connect\");\n    corser = require(\"corser\");\n\n    app = connect();\n\n    app.use(corser.create());\n\n    app.use(function (req, res) {\n        res.writeHead(200);\n        res.end(\"Nice weather today, huh?\");\n    });\n\n    app.listen(1337);\n\n### How to use Corser with plain `http`\n\n    var http, corser, corserRequestListener;\n\n    http = require(\"http\");\n    corser = require(\"corser\");\n\n    // Create Corser request listener.\n    corserRequestListener = corser.create();\n\n    http.createServer(function (req, res) {\n        // Route req and res through the request listener.\n        corserRequestListener(req, res, function () {\n            res.writeHead(200);\n            res.end(\"Nice weather today, huh?\");\n        });\n    }).listen(1337);\n\n\nAPI\n---\n\n### Creating a Corser request listener\n\nCreating a Corser request listener that generates the appropriate response headers to enable CORS is as simple as:\n\n    corser.create()\n\nThis is the equivalent of setting a response header of `Access-Control-Allow-Origin: *`. If you want to restrict the origins, or allow more sophisticated request or response headers, you have to pass a configuration object to `corser.create`.\n\nCorser will automatically end preflight requests for you. A preflight request is a special `OPTIONS` request that the browser sends under certain conditions to negotiate with the server what methods, request headers and response headers are allowed for a CORS request. If you need to use the `OPTIONS` method for other stuff, just set `endPreflightRequests` to `false` and terminate those requests yourself:\n\n    var corserRequestListener;\n\n    corserRequestListener = corser.create({\n        endPreflightRequests: false\n    });\n\n    corserRequestListener(req, res, function () {\n        if (req.method === \"OPTIONS\") {\n            // End CORS preflight request.\n            res.writeHead(204);\n            res.end();\n        } else {\n            // Implement other HTTP methods.\n        }\n    });\n\n\n#### Configuration Object\n\nA configuration object with the following properties can be passed to `corser.create`.\n\n##### `origins`\n\nA case-sensitive whitelist of origins. Unless unbound, if the request comes from an origin that is not in this list, it will not be handled by CORS.\n\nTo allow for dynamic origin checking, a function `(origin, callback)` can be passed instead of an array. `origin` is the Origin header, `callback` is a function `(err, matches)`, where `matches` is a boolean flag that indicates whether the given Origin header matches or not.\n\nDefault: unbound, i.e. every origin is accepted.\n\n##### `methods`\n\nAn uppercase whitelist of methods. If the request uses a method that is not in this list, it will not be handled by CORS.\n\nSetting a value here will overwrite the list of default simple methods. To not lose them, concat the methods you want to add with `corser.simpleMethods`: `corser.simpleMethods.concat([\"PUT\", \"DELETE\"])`.\n\nDefault: simple methods (`GET`, `HEAD`, `POST`).\n\n##### `requestHeaders`\n\nA case-insensitive whitelist of request headers. If the request uses a request header that is not in this list, it will not be handled by CORS.\n\nSetting a value here will overwrite the list of default simple request headers. To not lose them, concat the request headers you want to add with `corser.simpleRequestHeaders`: `corser.simpleRequestHeaders.concat([\"Authorization\"])`.\n\nDefault: simple request headers (`Accept`, `Accept-Language`, `Content-Language`, `Content-Type`, `Last-Event-ID`).\n\n##### `responseHeaders`\n\nA case-insensitive whitelist of response headers. Any response header that is not in this list will be filtered out by the user-agent (the browser).\n\nSetting a value here will overwrite the list of default simple response headers. To not lose them, concat the response headers you want to add with `corser.simpleResponseHeaders`: `corser.simpleResponseHeaders.concat([\"ETag\"])`.\n\nDefault: simple response headers (`Cache-Control`, `Content-Language`, `Content-Type`, `Expires`, `Last-Modified`, `Pragma`).\n\n##### `supportsCredentials`\n\nA boolean that indicates if cookie credentials can be transferred as part of a CORS request. Currently, only a few HTML5 elements can benefit from this setting.\n\nDefault: `false`.\n\n##### `maxAge`\n\nAn integer that indicates the maximum amount of time in seconds that a preflight request is kept in the client-side preflight result cache.\n\nDefault: not set.\n\n##### `endPreflightRequests`\n\nA boolean that indicates if CORS preflight requests should be automatically closed.\n\nDefault: `true`.\n\n\nFAQ\n---\n\n### Ajax call returns `Origin X is not allowed by Access-Control-Allow-Origin`\n\nCheck if the `Origin` header of your request matches one of the origins provided in the `origins` property of the configuration object. If you didn't set any `origins` property, jump to the next question.\n\n\n### Ajax call still returns `Origin X is not allowed by Access-Control-Allow-Origin`\n\nYour request might use a non-simple method or one or more non-simple headers. According to the specification, the set of simple methods is `GET`, `HEAD`, and `POST`, and the set of simple request headers is `Accept`, `Accept-Language`, `Content-Language`, `Content-Type`, and `Last-Event-ID`. If your request uses **any** other method or header, you have to explicitly list them in the `methods` or `requestHeaders` property of the configuration object.\n\n\n#### Example\n\nYou want to allow requests that use an `X-Requested-With` header. Pass the following configuration object to `corser.create`:\n\n    corser.create({\n        requestHeaders: corser.simpleRequestHeaders.concat([\"X-Requested-With\"])\n    });\n\n\n### Getting a response header returns `Refused to get unsafe header \"X\"`\n\nYour browser blocks every non-simple response headers that was not explicitly allowed in the preflight request. The set of simple response headers is `Cache-Control`, `Content-Language`, `Content-Type`, `Expires`, `Last-Modified`, `Pragma`. If you want to access **any** other response header, you have to explicitly list them in the `responseHeaders` property of the configuration object.\n\n#### Example\n\nYou want to allow clients to read the `ETag` header of a response. Pass the following configuration object to `corser.create`:\n\n    corser.create({\n        responseHeaders: corser.simpleResponseHeaders.concat([\"ETag\"])\n    });\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/corser/lib/corser.js",
    "content": "/**\n * Specification: http://www.w3.org/TR/2012/WD-cors-20120403/\n * W3C Working Draft 3 April 2012\n */\n\"use strict\";\n\n/*jshint node:true */\n\nvar simpleMethods, simpleRequestHeaders, simpleResponseHeaders, toLowerCase, checkOriginMatch;\n\n// A method is said to be a simple method if it is a case-sensitive match for one of the following:\nObject.defineProperty(exports, \"simpleMethods\", {\n    get: function () {\n        return [\n            \"GET\",\n            \"HEAD\",\n            \"POST\"\n        ];\n    }\n});\nsimpleMethods = exports.simpleMethods;\n\n// A header is said to be a simple header if the header field name is an ASCII case-insensitive match for one of\n// the following:\nObject.defineProperty(exports, \"simpleRequestHeaders\", {\n    get: function () {\n        return [\n            \"accept\",\n            \"accept-language\",\n            \"content-language\",\n            \"content-type\"\n        ];\n    }\n});\nsimpleRequestHeaders = exports.simpleRequestHeaders;\n\n// A header is said to be a simple response header if the header field name is an ASCII case-insensitive\n// match for one of the following:\nObject.defineProperty(exports, \"simpleResponseHeaders\", {\n    get: function () {\n        return [\n            \"cache-control\",\n            \"content-language\",\n            \"content-type\",\n            \"expires\",\n            \"last-modified\",\n            \"pragma\"\n        ];\n    }\n});\nsimpleResponseHeaders = exports.simpleResponseHeaders;\n\ntoLowerCase = function (array) {\n    return array.map(function (el) {\n        return el.toLowerCase();\n    });\n};\n\ncheckOriginMatch = function (originHeader, origins, callback) {\n    if (typeof origins === \"function\") {\n        origins(originHeader, function (err, allow) {\n            callback(err, allow);\n        });\n    } else if (origins.length > 0) {\n        callback(null, origins.some(function (origin) {\n            return origin === originHeader;\n        }));\n    } else {\n        // Always matching is acceptable since the list of origins can be unbounded.\n        callback(null, true);\n    }\n};\n\nexports.create = function (options) {\n    options = options || {};\n    options.origins = options.origins || [];\n    options.methods = options.methods || simpleMethods;\n    if (options.hasOwnProperty(\"requestHeaders\") === true) {\n        options.requestHeaders = toLowerCase(options.requestHeaders);\n    } else {\n        options.requestHeaders = simpleRequestHeaders;\n    }\n    if (options.hasOwnProperty(\"responseHeaders\") === true) {\n        options.responseHeaders = toLowerCase(options.responseHeaders);\n    } else {\n        options.responseHeaders = simpleResponseHeaders;\n    }\n    options.maxAge = options.maxAge || null;\n    options.supportsCredentials = options.supportsCredentials || false;\n    if (options.hasOwnProperty(\"endPreflightRequests\") === false) {\n        options.endPreflightRequests = true;\n    }\n    return function (req, res, next) {\n        var methodMatches, headersMatch, requestMethod, requestHeaders, exposedHeaders, endPreflight;\n        // If the Origin header is not present terminate this set of steps.\n        if (!req.headers.hasOwnProperty(\"origin\")) {\n            // The request is outside the scope of the CORS specification. If there is no Origin header,\n            // it could be a same-origin request. Let's let the user-agent handle this situation.\n            next();\n        } else {\n            // If the value of the Origin header is not a case-sensitive match for any of the values in\n            // list of origins, do not set any additional headers and terminate this set of steps.\n            checkOriginMatch(req.headers.origin, options.origins, function (err, originMatches) {\n                if (err !== null) {\n                    next(err);\n                } else {\n                    if (typeof originMatches !== \"boolean\" || originMatches === false) {\n                        next();\n                    } else {\n                        // Respond to preflight request.\n                        if (req.method === \"OPTIONS\") {\n                            endPreflight = function () {\n                                if (options.endPreflightRequests === true) {\n                                    res.writeHead(204);\n                                    res.end();\n                                } else {\n                                    next();\n                                }\n                            };\n                            // If there is no Access-Control-Request-Method header or if parsing failed, do not set\n                            // any additional headers and terminate this set of steps.\n                            if (!req.headers.hasOwnProperty(\"access-control-request-method\")) {\n                                endPreflight();\n                            } else {\n                                requestMethod = req.headers[\"access-control-request-method\"];\n                                // If there are no Access-Control-Request-Headers headers let header field-names be the\n                                // empty list. If parsing failed do not set any additional headers and terminate this set\n                                // of steps.\n                                // Checking for an empty header is a workaround for a bug Chrome 52:\n                                // https://bugs.chromium.org/p/chromium/issues/detail?id=633729\n                                if (req.headers.hasOwnProperty(\"access-control-request-headers\") && req.headers[\"access-control-request-headers\"] !== \"\") {\n                                    requestHeaders = toLowerCase(req.headers[\"access-control-request-headers\"].split(/,\\s*/));\n                                } else {\n                                    requestHeaders = [];\n                                }\n                                // If method is not a case-sensitive match for any of the values in list of methods do not\n                                // set any additional headers and terminate this set of steps.\n                                methodMatches = options.methods.indexOf(requestMethod) !== -1;\n                                if (methodMatches === false) {\n                                    endPreflight();\n                                } else {\n                                    // If any of the header field-names is not a ASCII case-insensitive match for any of\n                                    // the values in list of headers do not set any additional headers and terminate this\n                                    // set of steps.\n                                    headersMatch = requestHeaders.every(function (requestHeader) {\n                                        // Browsers automatically add Origin to Access-Control-Request-Headers. However,\n                                        // Origin is not one of the simple request headers. Therefore, the header is\n                                        // accepted even if it is not in the list of request headers because CORS would\n                                        // not work without it.\n                                        if (requestHeader === \"origin\") {\n                                            return true;\n                                        } else {\n                                            if (options.requestHeaders.indexOf(requestHeader) !== -1) {\n                                                return true;\n                                            } else {\n                                                return false;\n                                            }\n                                        }\n                                    });\n                                    if (headersMatch === false) {\n                                        endPreflight();\n                                    } else {\n                                        if (options.supportsCredentials === true) {\n                                            // If the resource supports credentials add a single Access-Control-Allow-Origin\n                                            // header, with the value of the Origin header as value, and add a single\n                                            // Access-Control-Allow-Credentials header with the literal string \"true\"\n                                            // as value.\n                                            res.setHeader(\"Access-Control-Allow-Origin\", req.headers.origin);\n                                            res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n                                        } else {\n                                            // Otherwise, add a single Access-Control-Allow-Origin header, with either the\n                                            // value of the Origin header or the string \"*\" as value.\n                                            if (options.origins.length > 0 || typeof options.origins === \"function\") {\n                                                res.setHeader(\"Access-Control-Allow-Origin\", req.headers.origin);\n                                            } else {\n                                                res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n                                            }\n                                        }\n                                        // Optionally add a single Access-Control-Max-Age header with as value the amount\n                                        // of seconds the user agent is allowed to cache the result of the request.\n                                        if (options.maxAge !== null) {\n                                            res.setHeader(\"Access-Control-Max-Age\", options.maxAge);\n                                        }\n                                        // Add one or more Access-Control-Allow-Methods headers consisting of (a subset\n                                        // of) the list of methods.\n                                        res.setHeader(\"Access-Control-Allow-Methods\", options.methods.join(\",\"));\n                                        // Add one or more Access-Control-Allow-Headers headers consisting of (a subset\n                                        // of) the list of headers.\n                                        res.setHeader(\"Access-Control-Allow-Headers\", options.requestHeaders.join(\",\"));\n                                        // And out.\n                                        endPreflight();\n                                    }\n                                }\n                            }\n                        } else {\n                            if (options.supportsCredentials === true) {\n                                // If the resource supports credentials add a single Access-Control-Allow-Origin header,\n                                // with the value of the Origin header as value, and add a single\n                                // Access-Control-Allow-Credentials header with the literal string \"true\" as value.\n                                res.setHeader(\"Access-Control-Allow-Origin\", req.headers.origin);\n                                res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n                            } else {\n                                // Otherwise, add a single Access-Control-Allow-Origin header, with either the value of\n                                // the Origin header or the literal string \"*\" as value.\n                                // If the list of origins is empty, use \"*\" as value.\n                                if (options.origins.length > 0 || typeof options.origins === \"function\") {\n                                    res.setHeader(\"Access-Control-Allow-Origin\", req.headers.origin);\n                                } else {\n                                    res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n                                }\n                            }\n                            // If the list of exposed headers is not empty add one or more Access-Control-Expose-Headers\n                            // headers, with as values the header field names given in the list of exposed headers.\n                            exposedHeaders = options.responseHeaders.filter(function (optionsResponseHeader) {\n                                return simpleResponseHeaders.indexOf(optionsResponseHeader) === -1;\n                            });\n                            if (exposedHeaders.length > 0) {\n                                res.setHeader(\"Access-Control-Expose-Headers\", exposedHeaders.join(\",\"));\n                            }\n                            // And out.\n                            next();\n                        }\n                    }\n                }\n            });\n        }\n    };\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/corser/package.json",
    "content": "{\n    \"name\": \"corser\",\n    \"version\": \"2.0.1\",\n    \"description\": \"A highly configurable, middleware compatible implementation of CORS.\",\n    \"keywords\": [\"cors\", \"cross-origin resource sharing\", \"connect\", \"express\", \"middleware\"],\n    \"bugs\": \"https://github.com/agrueneberg/Corser/issues\",\n    \"license\": \"MIT\",\n    \"author\": \"Alexander Grüneberg <alexander.grueneberg@googlemail.com>\",\n    \"main\": \"./lib/corser.js\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/agrueneberg/Corser.git\"\n    },\n    \"scripts\": {\n        \"test\": \"./node_modules/.bin/mocha\"\n    },\n    \"devDependencies\": {\n        \"mocha\": \"1.3.x\",\n        \"expect.js\": \"0.1.x\"\n    },\n    \"engines\": {\n        \"node\": \">= 0.4.0\"\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/CHANGELOG.md",
    "content": "\n3.1.0 / 2017-09-26\n==================\n\n  * Add `DEBUG_HIDE_DATE` env var (#486)\n  * Remove ReDoS regexp in %o formatter (#504)\n  * Remove \"component\" from package.json\n  * Remove `component.json`\n  * Ignore package-lock.json\n  * Examples: fix colors printout\n  * Fix: browser detection\n  * Fix: spelling mistake (#496, @EdwardBetts)\n\n3.0.1 / 2017-08-24\n==================\n\n  * Fix: Disable colors in Edge and Internet Explorer (#489)\n\n3.0.0 / 2017-08-08\n==================\n\n  * Breaking: Remove DEBUG_FD (#406)\n  * Breaking: Use `Date#toISOString()` instead to `Date#toUTCString()` when output is not a TTY (#418)\n  * Breaking: Make millisecond timer namespace specific and allow 'always enabled' output (#408)\n  * Addition: document `enabled` flag (#465)\n  * Addition: add 256 colors mode (#481)\n  * Addition: `enabled()` updates existing debug instances, add `destroy()` function (#440)\n  * Update: component: update \"ms\" to v2.0.0\n  * Update: separate the Node and Browser tests in Travis-CI\n  * Update: refactor Readme, fixed documentation, added \"Namespace Colors\" section, redid screenshots\n  * Update: separate Node.js and web browser examples for organization\n  * Update: update \"browserify\" to v14.4.0\n  * Fix: fix Readme typo (#473)\n\n2.6.9 / 2017-09-22\n==================\n\n  * remove ReDoS regexp in %o formatter (#504)\n\n2.6.8 / 2017-05-18\n==================\n\n  * Fix: Check for undefined on browser globals (#462, @marbemac)\n\n2.6.7 / 2017-05-16\n==================\n\n  * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)\n  * Fix: Inline extend function in node implementation (#452, @dougwilson)\n  * Docs: Fix typo (#455, @msasad)\n\n2.6.5 / 2017-04-27\n==================\n  \n  * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)\n  * Misc: clean up browser reference checks (#447, @thebigredgeek)\n  * Misc: add npm-debug.log to .gitignore (@thebigredgeek)\n\n\n2.6.4 / 2017-04-20\n==================\n\n  * Fix: bug that would occur if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)\n  * Chore: ignore bower.json in npm installations. (#437, @joaovieira)\n  * Misc: update \"ms\" to v0.7.3 (@tootallnate)\n\n2.6.3 / 2017-03-13\n==================\n\n  * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)\n  * Docs: Changelog fix (@thebigredgeek)\n\n2.6.2 / 2017-03-10\n==================\n\n  * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)\n  * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)\n  * Docs: Add Slackin invite badge (@tootallnate)\n\n2.6.1 / 2017-02-10\n==================\n\n  * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error\n  * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)\n  * Fix: IE8 \"Expected identifier\" error (#414, @vgoma)\n  * Fix: Namespaces would not disable once enabled (#409, @musikov)\n\n2.6.0 / 2016-12-28\n==================\n\n  * Fix: added better null pointer checks for browser useColors (@thebigredgeek)\n  * Improvement: removed explicit `window.debug` export (#404, @tootallnate)\n  * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)\n\n2.5.2 / 2016-12-25\n==================\n\n  * Fix: reference error on window within webworkers (#393, @KlausTrainer)\n  * Docs: fixed README typo (#391, @lurch)\n  * Docs: added notice about v3 api discussion (@thebigredgeek)\n\n2.5.1 / 2016-12-20\n==================\n\n  * Fix: babel-core compatibility\n\n2.5.0 / 2016-12-20\n==================\n\n  * Fix: wrong reference in bower file (@thebigredgeek)\n  * Fix: webworker compatibility (@thebigredgeek)\n  * Fix: output formatting issue (#388, @kribblo)\n  * Fix: babel-loader compatibility (#383, @escwald)\n  * Misc: removed built asset from repo and publications (@thebigredgeek)\n  * Misc: moved source files to /src (#378, @yamikuronue)\n  * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)\n  * Test: coveralls integration (#378, @yamikuronue)\n  * Docs: simplified language in the opening paragraph (#373, @yamikuronue)\n\n2.4.5 / 2016-12-17\n==================\n\n  * Fix: `navigator` undefined in Rhino (#376, @jochenberger)\n  * Fix: custom log function (#379, @hsiliev)\n  * Improvement: bit of cleanup + linting fixes (@thebigredgeek)\n  * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)\n  * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)\n\n2.4.4 / 2016-12-14\n==================\n\n  * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)\n\n2.4.3 / 2016-12-14\n==================\n\n  * Fix: navigation.userAgent error for react native (#364, @escwald)\n\n2.4.2 / 2016-12-14\n==================\n\n  * Fix: browser colors (#367, @tootallnate)\n  * Misc: travis ci integration (@thebigredgeek)\n  * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)\n\n2.4.1 / 2016-12-13\n==================\n\n  * Fix: typo that broke the package (#356)\n\n2.4.0 / 2016-12-13\n==================\n\n  * Fix: bower.json references unbuilt src entry point (#342, @justmatt)\n  * Fix: revert \"handle regex special characters\" (@tootallnate)\n  * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)\n  * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)\n  * Improvement: allow colors in workers (#335, @botverse)\n  * Improvement: use same color for same namespace. (#338, @lchenay)\n\n2.3.3 / 2016-11-09\n==================\n\n  * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)\n  * Fix: Returning `localStorage` saved values (#331, Levi Thomason)\n  * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)\n\n2.3.2 / 2016-11-09\n==================\n\n  * Fix: be super-safe in index.js as well (@TooTallNate)\n  * Fix: should check whether process exists (Tom Newby)\n\n2.3.1 / 2016-11-09\n==================\n\n  * Fix: Added electron compatibility (#324, @paulcbetts)\n  * Improvement: Added performance optimizations (@tootallnate)\n  * Readme: Corrected PowerShell environment variable example (#252, @gimre)\n  * Misc: Removed yarn lock file from source control (#321, @fengmk2)\n\n2.3.0 / 2016-11-07\n==================\n\n  * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)\n  * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)\n  * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)\n  * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)\n  * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)\n  * Package: Update \"ms\" to 0.7.2 (#315, @DevSide)\n  * Package: removed superfluous version property from bower.json (#207 @kkirsche)\n  * Readme: fix USE_COLORS to DEBUG_COLORS\n  * Readme: Doc fixes for format string sugar (#269, @mlucool)\n  * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)\n  * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)\n  * Readme: better docs for browser support (#224, @matthewmueller)\n  * Tooling: Added yarn integration for development (#317, @thebigredgeek)\n  * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)\n  * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)\n  * Misc: Updated contributors (@thebigredgeek)\n\n2.2.0 / 2015-05-09\n==================\n\n  * package: update \"ms\" to v0.7.1 (#202, @dougwilson)\n  * README: add logging to file example (#193, @DanielOchoa)\n  * README: fixed a typo (#191, @amir-s)\n  * browser: expose `storage` (#190, @stephenmathieson)\n  * Makefile: add a `distclean` target (#189, @stephenmathieson)\n\n2.1.3 / 2015-03-13\n==================\n\n  * Updated stdout/stderr example (#186)\n  * Updated example/stdout.js to match debug current behaviour\n  * Renamed example/stderr.js to stdout.js\n  * Update Readme.md (#184)\n  * replace high intensity foreground color for bold (#182, #183)\n\n2.1.2 / 2015-03-01\n==================\n\n  * dist: recompile\n  * update \"ms\" to v0.7.0\n  * package: update \"browserify\" to v9.0.3\n  * component: fix \"ms.js\" repo location\n  * changed bower package name\n  * updated documentation about using debug in a browser\n  * fix: security error on safari (#167, #168, @yields)\n\n2.1.1 / 2014-12-29\n==================\n\n  * browser: use `typeof` to check for `console` existence\n  * browser: check for `console.log` truthiness (fix IE 8/9)\n  * browser: add support for Chrome apps\n  * Readme: added Windows usage remarks\n  * Add `bower.json` to properly support bower install\n\n2.1.0 / 2014-10-15\n==================\n\n  * node: implement `DEBUG_FD` env variable support\n  * package: update \"browserify\" to v6.1.0\n  * package: add \"license\" field to package.json (#135, @panuhorsmalahti)\n\n2.0.0 / 2014-09-01\n==================\n\n  * package: update \"browserify\" to v5.11.0\n  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)\n\n1.0.4 / 2014-07-15\n==================\n\n  * dist: recompile\n  * example: remove `console.info()` log usage\n  * example: add \"Content-Type\" UTF-8 header to browser example\n  * browser: place %c marker after the space character\n  * browser: reset the \"content\" color via `color: inherit`\n  * browser: add colors support for Firefox >= v31\n  * debug: prefer an instance `log()` function over the global one (#119)\n  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)\n\n1.0.3 / 2014-07-09\n==================\n\n  * Add support for multiple wildcards in namespaces (#122, @seegno)\n  * browser: fix lint\n\n1.0.2 / 2014-06-10\n==================\n\n  * browser: update color palette (#113, @gscottolson)\n  * common: make console logging function configurable (#108, @timoxley)\n  * node: fix %o colors on old node <= 0.8.x\n  * Makefile: find node path using shell/which (#109, @timoxley)\n\n1.0.1 / 2014-06-06\n==================\n\n  * browser: use `removeItem()` to clear localStorage\n  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)\n  * package: add \"contributors\" section\n  * node: fix comment typo\n  * README: list authors\n\n1.0.0 / 2014-06-04\n==================\n\n  * make ms diff be global, not be scope\n  * debug: ignore empty strings in enable()\n  * node: make DEBUG_COLORS able to disable coloring\n  * *: export the `colors` array\n  * npmignore: don't publish the `dist` dir\n  * Makefile: refactor to use browserify\n  * package: add \"browserify\" as a dev dependency\n  * Readme: add Web Inspector Colors section\n  * node: reset terminal color for the debug content\n  * node: map \"%o\" to `util.inspect()`\n  * browser: map \"%j\" to `JSON.stringify()`\n  * debug: add custom \"formatters\"\n  * debug: use \"ms\" module for humanizing the diff\n  * Readme: add \"bash\" syntax highlighting\n  * browser: add Firebug color support\n  * browser: add colors for WebKit browsers\n  * node: apply log to `console`\n  * rewrite: abstract common logic for Node & browsers\n  * add .jshintrc file\n\n0.8.1 / 2014-04-14\n==================\n\n  * package: re-add the \"component\" section\n\n0.8.0 / 2014-03-30\n==================\n\n  * add `enable()` method for nodejs. Closes #27\n  * change from stderr to stdout\n  * remove unnecessary index.js file\n\n0.7.4 / 2013-11-13\n==================\n\n  * remove \"browserify\" key from package.json (fixes something in browserify)\n\n0.7.3 / 2013-10-30\n==================\n\n  * fix: catch localStorage security error when cookies are blocked (Chrome)\n  * add debug(err) support. Closes #46\n  * add .browser prop to package.json. Closes #42\n\n0.7.2 / 2013-02-06\n==================\n\n  * fix package.json\n  * fix: Mobile Safari (private mode) is broken with debug\n  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript\n\n0.7.1 / 2013-02-05\n==================\n\n  * add repository URL to package.json\n  * add DEBUG_COLORED to force colored output\n  * add browserify support\n  * fix component. Closes #24\n\n0.7.0 / 2012-05-04\n==================\n\n  * Added .component to package.json\n  * Added debug.component.js build\n\n0.6.0 / 2012-03-16\n==================\n\n  * Added support for \"-\" prefix in DEBUG [Vinay Pulim]\n  * Added `.enabled` flag to the node version [TooTallNate]\n\n0.5.0 / 2012-02-02\n==================\n\n  * Added: humanize diffs. Closes #8\n  * Added `debug.disable()` to the CS variant\n  * Removed padding. Closes #10\n  * Fixed: persist client-side variant again. Closes #9\n\n0.4.0 / 2012-02-01\n==================\n\n  * Added browser variant support for older browsers [TooTallNate]\n  * Added `debug.enable('project:*')` to browser variant [TooTallNate]\n  * Added padding to diff (moved it to the right)\n\n0.3.0 / 2012-01-26\n==================\n\n  * Added millisecond diff when isatty, otherwise UTC string\n\n0.2.0 / 2012-01-22\n==================\n\n  * Added wildcard support\n\n0.1.0 / 2011-12-02\n==================\n\n  * Added: remove colors unless stderr isatty [TooTallNate]\n\n0.0.1 / 2010-01-03\n==================\n\n  * Initial release\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/LICENSE",
    "content": "(The MIT License)\n\nCopyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software \nand associated documentation files (the 'Software'), to deal in the Software without restriction, \nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, \nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/README.md",
    "content": "# debug\n[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug)  [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master)  [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)\n[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png\">\n\nA tiny JavaScript debugging utility modelled after Node.js core's debugging\ntechnique. Works in Node.js and web browsers.\n\n## Installation\n\n```bash\n$ npm install debug\n```\n\n## Usage\n\n`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.\n\nExample [_app.js_](./examples/node/app.js):\n\n```js\nvar debug = require('debug')('http')\n  , http = require('http')\n  , name = 'My App';\n\n// fake app\n\ndebug('booting %o', name);\n\nhttp.createServer(function(req, res){\n  debug(req.method + ' ' + req.url);\n  res.end('hello\\n');\n}).listen(3000, function(){\n  debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample [_worker.js_](./examples/node/worker.js):\n\n```js\nvar a = require('debug')('worker:a')\n  , b = require('debug')('worker:b');\n\nfunction work() {\n  a('doing lots of uninteresting work');\n  setTimeout(work, Math.random() * 1000);\n}\n\nwork();\n\nfunction workb() {\n  b('doing some work');\n  setTimeout(workb, Math.random() * 2000);\n}\n\nworkb();\n```\n\nThe `DEBUG` environment variable is then used to enable these based on space or\ncomma-delimited names.\n\nHere are some examples:\n\n<img width=\"647\" alt=\"screen shot 2017-08-08 at 12 53 04 pm\" src=\"https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png\">\n<img width=\"647\" alt=\"screen shot 2017-08-08 at 12 53 38 pm\" src=\"https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png\">\n<img width=\"647\" alt=\"screen shot 2017-08-08 at 12 53 25 pm\" src=\"https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png\">\n\n#### Windows command prompt notes\n\n##### CMD\n\nOn Windows the environment variable is set using the `set` command.\n\n```cmd\nset DEBUG=*,-not_this\n```\n\nExample:\n\n```cmd\nset DEBUG=* & node app.js\n```\n\n##### PowerShell (VS Code default)\n\nPowerShell uses different syntax to set environment variables.\n\n```cmd\n$env:DEBUG = \"*,-not_this\"\n```\n\nExample:\n\n```cmd\n$env:DEBUG='app';node app.js\n```\n\nThen, run the program to be debugged as usual.\n\nnpm script example:\n```js\n  \"windowsDebug\": \"@powershell -Command $env:DEBUG='*';node app.js\",\n```\n\n## Namespace Colors\n\nEvery debug instance has a color generated for it based on its namespace name.\nThis helps when visually parsing the debug output to identify which debug instance\na debug line belongs to.\n\n#### Node.js\n\nIn Node.js, colors are enabled when stderr is a TTY. You also _should_ install\nthe [`supports-color`](https://npmjs.org/supports-color) module alongside debug,\notherwise debug will only use a small handful of basic colors.\n\n<img width=\"521\" src=\"https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png\">\n\n#### Web Browser\n\nColors are also enabled on \"Web Inspectors\" that understand the `%c` formatting\noption. These are WebKit web inspectors, Firefox ([since version\n31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))\nand the Firebug plugin for Firefox (any version).\n\n<img width=\"524\" src=\"https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png\">\n\n\n## Millisecond diff\n\nWhen actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png\">\n\nWhen stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:\n\n<img width=\"647\" src=\"https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png\">\n\n\n## Conventions\n\nIf you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\".  If you append a \"*\" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable.  You can then use it for normal output as well as debug output.\n\n## Wildcards\n\nThe `*` character may be used as a wildcard. Suppose for example your library has\ndebuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\",\ninstead of listing all three with\n`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do\n`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\nYou can also exclude specific debuggers by prefixing them with a \"-\" character.\nFor example, `DEBUG=*,-connect:*` would include all debuggers except those\nstarting with \"connect:\".\n\n## Environment Variables\n\nWhen running through Node.js, you can set a few environment variables that will\nchange the behavior of the debug logging:\n\n| Name      | Purpose                                         |\n|-----------|-------------------------------------------------|\n| `DEBUG`   | Enables/disables specific debugging namespaces. |\n| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY).  |\n| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |\n| `DEBUG_DEPTH` | Object inspection depth.                    |\n| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |\n\n\n__Note:__ The environment variables beginning with `DEBUG_` end up being\nconverted into an Options object that gets used with `%o`/`%O` formatters.\nSee the Node.js documentation for\n[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)\nfor the complete list.\n\n## Formatters\n\nDebug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.\nBelow are the officially supported formatters:\n\n| Formatter | Representation |\n|-----------|----------------|\n| `%O`      | Pretty-print an Object on multiple lines. |\n| `%o`      | Pretty-print an Object all on a single line. |\n| `%s`      | String. |\n| `%d`      | Number (both integer and float). |\n| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |\n| `%%`      | Single percent sign ('%'). This does not consume an argument. |\n\n\n### Custom formatters\n\nYou can add custom formatters by extending the `debug.formatters` object.\nFor example, if you wanted to add support for rendering a Buffer as hex with\n`%h`, you could do something like:\n\n```js\nconst createDebug = require('debug')\ncreateDebug.formatters.h = (v) => {\n  return v.toString('hex')\n}\n\n// …elsewhere\nconst debug = createDebug('foo')\ndebug('this is hex: %h', new Buffer('hello world'))\n//   foo this is hex: 68656c6c6f20776f726c6421 +0ms\n```\n\n\n## Browser Support\n\nYou can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),\nor just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),\nif you don't want to build it yourself.\n\nDebug's enable state is currently persisted by `localStorage`.\nConsider the situation shown below where you have `worker:a` and `worker:b`,\nand wish to debug both. You can enable this using `localStorage.debug`:\n\n```js\nlocalStorage.debug = 'worker:*'\n```\n\nAnd then refresh the page.\n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n  a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n  b('doing some work');\n}, 1200);\n```\n\n\n## Output streams\n\n  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:\n\nExample [_stdout.js_](./examples/node/stdout.js):\n\n```js\nvar debug = require('debug');\nvar error = debug('app:error');\n\n// by default stderr is used\nerror('goes to stderr!');\n\nvar log = debug('app:log');\n// set this namespace to log via console.log\nlog.log = console.log.bind(console); // don't forget to bind to console!\nlog('goes to stdout');\nerror('still goes to stderr!');\n\n// set all output to go via console.info\n// overrides all per-namespace log settings\ndebug.log = console.info.bind(console);\nerror('now goes to stdout via console.info');\nlog('still goes to stdout, but via console.info now');\n```\n\n## Extend\nYou can simply extend debugger \n```js\nconst log = require('debug')('auth');\n\n//creates new debug instance with extended namespace\nconst logSign = log.extend('sign');\nconst logLogin = log.extend('login');\n\nlog('hello'); // auth hello\nlogSign('hello'); //auth:sign hello\nlogLogin('hello'); //auth:login hello\n```\n\n## Set dynamically\n\nYou can also enable debug dynamically by calling the `enable()` method :\n\n```js\nlet debug = require('debug');\n\nconsole.log(1, debug.enabled('test'));\n\ndebug.enable('test');\nconsole.log(2, debug.enabled('test'));\n\ndebug.disable();\nconsole.log(3, debug.enabled('test'));\n\n```\n\nprint :   \n```\n1 false\n2 true\n3 false\n```\n\nUsage :  \n`enable(namespaces)`  \n`namespaces` can include modes separated by a colon and wildcards.\n   \nNote that calling `enable()` completely overrides previously set DEBUG variable : \n\n```\n$ DEBUG=foo node -e 'var dbg = require(\"debug\"); dbg.enable(\"bar\"); console.log(dbg.enabled(\"foo\"))'\n=> false\n```\n\n## Checking whether a debug target is enabled\n\nAfter you've created a debug instance, you can determine whether or not it is\nenabled by checking the `enabled` property:\n\n```javascript\nconst debug = require('debug')('http');\n\nif (debug.enabled) {\n  // do stuff...\n}\n```\n\nYou can also manually toggle this property to force the debug instance to be\nenabled or disabled.\n\n\n## Authors\n\n - TJ Holowaychuk\n - Nathan Rajlich\n - Andrew Rhyne\n\n## Backers\n\nSupport us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]\n\n<a href=\"https://opencollective.com/debug/backer/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/10/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/11/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/12/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/13/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/14/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/15/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/15/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/16/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/17/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/18/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/19/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/20/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/21/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/22/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/23/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/24/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/24/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/25/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/25/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/26/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/26/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/27/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/27/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/28/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/28/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/backer/29/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/backer/29/avatar.svg\"></a>\n\n\n## Sponsors\n\nBecome a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]\n\n<a href=\"https://opencollective.com/debug/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/9/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/10/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/10/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/11/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/11/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/12/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/12/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/13/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/13/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/14/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/14/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/15/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/15/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/16/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/16/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/17/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/17/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/18/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/18/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/19/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/19/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/20/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/20/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/21/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/21/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/22/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/22/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/23/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/23/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/24/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/24/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/25/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/25/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/26/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/26/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/27/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/27/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/28/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/28/avatar.svg\"></a>\n<a href=\"https://opencollective.com/debug/sponsor/29/website\" target=\"_blank\"><img src=\"https://opencollective.com/debug/sponsor/29/avatar.svg\"></a>\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2014-2017 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/node.js",
    "content": "module.exports = require('./src/node');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/package.json",
    "content": "{\n  \"name\": \"debug\",\n  \"version\": \"3.2.7\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/visionmedia/debug.git\"\n  },\n  \"description\": \"small debugging utility\",\n  \"keywords\": [\n    \"debug\",\n    \"log\",\n    \"debugger\"\n  ],\n  \"files\": [\n    \"src\",\n    \"node.js\",\n    \"dist/debug.js\",\n    \"LICENSE\",\n    \"README.md\"\n  ],\n  \"author\": \"TJ Holowaychuk <tj@vision-media.ca>\",\n  \"contributors\": [\n    \"Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)\",\n    \"Andrew Rhyne <rhyneandrew@gmail.com>\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"ms\": \"^2.1.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.0.0\",\n    \"@babel/core\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"browserify\": \"14.4.0\",\n    \"chai\": \"^3.5.0\",\n    \"concurrently\": \"^3.1.0\",\n    \"coveralls\": \"^3.0.2\",\n    \"istanbul\": \"^0.4.5\",\n    \"karma\": \"^3.0.0\",\n    \"karma-chai\": \"^0.1.0\",\n    \"karma-mocha\": \"^1.3.0\",\n    \"karma-phantomjs-launcher\": \"^1.0.2\",\n    \"mocha\": \"^5.2.0\",\n    \"mocha-lcov-reporter\": \"^1.2.0\",\n    \"rimraf\": \"^2.5.4\",\n    \"xo\": \"^0.23.0\"\n  },\n  \"main\": \"./src/index.js\",\n  \"browser\": \"./src/browser.js\",\n  \"unpkg\": \"./dist/debug.js\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/src/browser.js",
    "content": "\"use strict\";\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n/**\n * Colors.\n */\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n// eslint-disable-next-line complexity\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n    return true;\n  } // Internet Explorer and Edge do not support colors.\n\n\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  } // Is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\n\n  return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773\n  typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?\n  // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n  typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker\n  typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n  args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);\n\n  if (!this.useColors) {\n    return;\n  }\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit'); // The final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function (match) {\n    if (match === '%%') {\n      return;\n    }\n\n    index++;\n\n    if (match === '%c') {\n      // We only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n  args.splice(lastC, 0, c);\n}\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\n\nfunction log() {\n  var _console;\n\n  // This hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return (typeof console === \"undefined\" ? \"undefined\" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);\n}\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n  try {\n    if (namespaces) {\n      exports.storage.setItem('debug', namespaces);\n    } else {\n      exports.storage.removeItem('debug');\n    }\n  } catch (error) {// Swallow\n    // XXX (@Qix-) should we be logging these?\n  }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n  var r;\n\n  try {\n    r = exports.storage.getItem('debug');\n  } catch (error) {} // Swallow\n  // XXX (@Qix-) should we be logging these?\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\n\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\n\nfunction localstorage() {\n  try {\n    // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n    // The Browser also has localStorage in the global context.\n    return localStorage;\n  } catch (error) {// Swallow\n    // XXX (@Qix-) should we be logging these?\n  }\n}\n\nmodule.exports = require('./common')(exports);\nvar formatters = module.exports.formatters;\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n  try {\n    return JSON.stringify(v);\n  } catch (error) {\n    return '[UnexpectedJSONParseError]: ' + error.message;\n  }\n};\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/src/common.js",
    "content": "\"use strict\";\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\nfunction setup(env) {\n  createDebug.debug = createDebug;\n  createDebug.default = createDebug;\n  createDebug.coerce = coerce;\n  createDebug.disable = disable;\n  createDebug.enable = enable;\n  createDebug.enabled = enabled;\n  createDebug.humanize = require('ms');\n  Object.keys(env).forEach(function (key) {\n    createDebug[key] = env[key];\n  });\n  /**\n  * Active `debug` instances.\n  */\n\n  createDebug.instances = [];\n  /**\n  * The currently active debug mode names, and names to skip.\n  */\n\n  createDebug.names = [];\n  createDebug.skips = [];\n  /**\n  * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n  *\n  * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n  */\n\n  createDebug.formatters = {};\n  /**\n  * Selects a color for a debug namespace\n  * @param {String} namespace The namespace string for the for the debug instance to be colored\n  * @return {Number|String} An ANSI color code for the given namespace\n  * @api private\n  */\n\n  function selectColor(namespace) {\n    var hash = 0;\n\n    for (var i = 0; i < namespace.length; i++) {\n      hash = (hash << 5) - hash + namespace.charCodeAt(i);\n      hash |= 0; // Convert to 32bit integer\n    }\n\n    return createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n  }\n\n  createDebug.selectColor = selectColor;\n  /**\n  * Create a debugger with the given `namespace`.\n  *\n  * @param {String} namespace\n  * @return {Function}\n  * @api public\n  */\n\n  function createDebug(namespace) {\n    var prevTime;\n\n    function debug() {\n      // Disabled?\n      if (!debug.enabled) {\n        return;\n      }\n\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      var self = debug; // Set `diff` timestamp\n\n      var curr = Number(new Date());\n      var ms = curr - (prevTime || curr);\n      self.diff = ms;\n      self.prev = prevTime;\n      self.curr = curr;\n      prevTime = curr;\n      args[0] = createDebug.coerce(args[0]);\n\n      if (typeof args[0] !== 'string') {\n        // Anything else let's inspect with %O\n        args.unshift('%O');\n      } // Apply any `formatters` transformations\n\n\n      var index = 0;\n      args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {\n        // If we encounter an escaped % then don't increase the array index\n        if (match === '%%') {\n          return match;\n        }\n\n        index++;\n        var formatter = createDebug.formatters[format];\n\n        if (typeof formatter === 'function') {\n          var val = args[index];\n          match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`\n\n          args.splice(index, 1);\n          index--;\n        }\n\n        return match;\n      }); // Apply env-specific formatting (colors, etc.)\n\n      createDebug.formatArgs.call(self, args);\n      var logFn = self.log || createDebug.log;\n      logFn.apply(self, args);\n    }\n\n    debug.namespace = namespace;\n    debug.enabled = createDebug.enabled(namespace);\n    debug.useColors = createDebug.useColors();\n    debug.color = selectColor(namespace);\n    debug.destroy = destroy;\n    debug.extend = extend; // Debug.formatArgs = formatArgs;\n    // debug.rawLog = rawLog;\n    // env-specific initialization logic for debug instances\n\n    if (typeof createDebug.init === 'function') {\n      createDebug.init(debug);\n    }\n\n    createDebug.instances.push(debug);\n    return debug;\n  }\n\n  function destroy() {\n    var index = createDebug.instances.indexOf(this);\n\n    if (index !== -1) {\n      createDebug.instances.splice(index, 1);\n      return true;\n    }\n\n    return false;\n  }\n\n  function extend(namespace, delimiter) {\n    return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n  }\n  /**\n  * Enables a debug mode by namespaces. This can include modes\n  * separated by a colon and wildcards.\n  *\n  * @param {String} namespaces\n  * @api public\n  */\n\n\n  function enable(namespaces) {\n    createDebug.save(namespaces);\n    createDebug.names = [];\n    createDebug.skips = [];\n    var i;\n    var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n    var len = split.length;\n\n    for (i = 0; i < len; i++) {\n      if (!split[i]) {\n        // ignore empty strings\n        continue;\n      }\n\n      namespaces = split[i].replace(/\\*/g, '.*?');\n\n      if (namespaces[0] === '-') {\n        createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n      } else {\n        createDebug.names.push(new RegExp('^' + namespaces + '$'));\n      }\n    }\n\n    for (i = 0; i < createDebug.instances.length; i++) {\n      var instance = createDebug.instances[i];\n      instance.enabled = createDebug.enabled(instance.namespace);\n    }\n  }\n  /**\n  * Disable debug output.\n  *\n  * @api public\n  */\n\n\n  function disable() {\n    createDebug.enable('');\n  }\n  /**\n  * Returns true if the given mode name is enabled, false otherwise.\n  *\n  * @param {String} name\n  * @return {Boolean}\n  * @api public\n  */\n\n\n  function enabled(name) {\n    if (name[name.length - 1] === '*') {\n      return true;\n    }\n\n    var i;\n    var len;\n\n    for (i = 0, len = createDebug.skips.length; i < len; i++) {\n      if (createDebug.skips[i].test(name)) {\n        return false;\n      }\n    }\n\n    for (i = 0, len = createDebug.names.length; i < len; i++) {\n      if (createDebug.names[i].test(name)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n  /**\n  * Coerce `val`.\n  *\n  * @param {Mixed} val\n  * @return {Mixed}\n  * @api private\n  */\n\n\n  function coerce(val) {\n    if (val instanceof Error) {\n      return val.stack || val.message;\n    }\n\n    return val;\n  }\n\n  createDebug.enable(createDebug.load());\n  return createDebug;\n}\n\nmodule.exports = setup;\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/src/index.js",
    "content": "\"use strict\";\n\n/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n  module.exports = require('./browser.js');\n} else {\n  module.exports = require('./node.js');\n}\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/debug/src/node.js",
    "content": "\"use strict\";\n\n/**\n * Module dependencies.\n */\nvar tty = require('tty');\n\nvar util = require('util');\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n  // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n  // eslint-disable-next-line import/no-extraneous-dependencies\n  var supportsColor = require('supports-color');\n\n  if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n    exports.colors = [20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221];\n  }\n} catch (error) {} // Swallow - we only care if `supports-color` is available; it doesn't have to be.\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\n\nexports.inspectOpts = Object.keys(process.env).filter(function (key) {\n  return /^debug_/i.test(key);\n}).reduce(function (obj, key) {\n  // Camel-case\n  var prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, function (_, k) {\n    return k.toUpperCase();\n  }); // Coerce string value into JS value\n\n  var val = process.env[key];\n\n  if (/^(yes|on|true|enabled)$/i.test(val)) {\n    val = true;\n  } else if (/^(no|off|false|disabled)$/i.test(val)) {\n    val = false;\n  } else if (val === 'null') {\n    val = null;\n  } else {\n    val = Number(val);\n  }\n\n  obj[prop] = val;\n  return obj;\n}, {});\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n  return 'colors' in exports.inspectOpts ? Boolean(exports.inspectOpts.colors) : tty.isatty(process.stderr.fd);\n}\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n  var name = this.namespace,\n      useColors = this.useColors;\n\n  if (useColors) {\n    var c = this.color;\n    var colorCode = \"\\x1B[3\" + (c < 8 ? c : '8;5;' + c);\n    var prefix = \"  \".concat(colorCode, \";1m\").concat(name, \" \\x1B[0m\");\n    args[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n    args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + \"\\x1B[0m\");\n  } else {\n    args[0] = getDate() + name + ' ' + args[0];\n  }\n}\n\nfunction getDate() {\n  if (exports.inspectOpts.hideDate) {\n    return '';\n  }\n\n  return new Date().toISOString() + ' ';\n}\n/**\n * Invokes `util.format()` with the specified arguments and writes to stderr.\n */\n\n\nfunction log() {\n  return process.stderr.write(util.format.apply(util, arguments) + '\\n');\n}\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n  if (namespaces) {\n    process.env.DEBUG = namespaces;\n  } else {\n    // If you set a process.env field to null or undefined, it gets cast to the\n    // string 'null' or 'undefined'. Just delete instead.\n    delete process.env.DEBUG;\n  }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n  return process.env.DEBUG;\n}\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\n\nfunction init(debug) {\n  debug.inspectOpts = {};\n  var keys = Object.keys(exports.inspectOpts);\n\n  for (var i = 0; i < keys.length; i++) {\n    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n  }\n}\n\nmodule.exports = require('./common')(exports);\nvar formatters = module.exports.formatters;\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n  this.inspectOpts.colors = this.useColors;\n  return util.inspect(v, this.inspectOpts)\n    .split('\\n')\n    .map(function (str) { return str.trim(); })\n    .join(' ');\n};\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\n\nformatters.O = function (v) {\n  this.inspectOpts.colors = this.useColors;\n  return util.inspect(v, this.inspectOpts);\n};\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Arnout Kazemier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/README.md",
    "content": "# EventEmitter3\n\n[![Version npm](https://img.shields.io/npm/v/eventemitter3.svg?style=flat-square)](https://www.npmjs.com/package/eventemitter3)[![Build Status](https://img.shields.io/travis/primus/eventemitter3/master.svg?style=flat-square)](https://travis-ci.org/primus/eventemitter3)[![Dependencies](https://img.shields.io/david/primus/eventemitter3.svg?style=flat-square)](https://david-dm.org/primus/eventemitter3)[![Coverage Status](https://img.shields.io/coveralls/primus/eventemitter3/master.svg?style=flat-square)](https://coveralls.io/r/primus/eventemitter3?branch=master)[![IRC channel](https://img.shields.io/badge/IRC-irc.freenode.net%23primus-00a8ff.svg?style=flat-square)](https://webchat.freenode.net/?channels=primus)\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/eventemitter3.svg)](https://saucelabs.com/u/eventemitter3)\n\nEventEmitter3 is a high performance EventEmitter. It has been micro-optimized\nfor various of code paths making this, one of, if not the fastest EventEmitter\navailable for Node.js and browsers. The module is API compatible with the\nEventEmitter that ships by default with Node.js but there are some slight\ndifferences:\n\n- Domain support has been removed.\n- We do not `throw` an error when you emit an `error` event and nobody is\n  listening.\n- The `newListener` and `removeListener` events have been removed as they\n  are useful only in some uncommon use-cases.\n- The `setMaxListeners`, `getMaxListeners`, `prependListener` and\n  `prependOnceListener` methods are not available.\n- Support for custom context for events so there is no need to use `fn.bind`.\n- The `removeListener` method removes all matching listeners, not only the\n  first.\n\nIt's a drop in replacement for existing EventEmitters, but just faster. Free\nperformance, who wouldn't want that? The EventEmitter is written in EcmaScript 3\nso it will work in the oldest browsers and node versions that you need to\nsupport.\n\n## Installation\n\n```bash\n$ npm install --save eventemitter3\n```\n\n## CDN\n\nRecommended CDN:\n\n```text\nhttps://unpkg.com/eventemitter3@latest/umd/eventemitter3.min.js\n```\n\n## Usage\n\nAfter installation the only thing you need to do is require the module:\n\n```js\nvar EventEmitter = require('eventemitter3');\n```\n\nAnd you're ready to create your own EventEmitter instances. For the API\ndocumentation, please follow the official Node.js documentation:\n\nhttp://nodejs.org/api/events.html\n\n### Contextual emits\n\nWe've upgraded the API of the `EventEmitter.on`, `EventEmitter.once` and\n`EventEmitter.removeListener` to accept an extra argument which is the `context`\nor `this` value that should be set for the emitted events. This means you no\nlonger have the overhead of an event that required `fn.bind` in order to get a\ncustom `this` value.\n\n```js\nvar EE = new EventEmitter()\n  , context = { foo: 'bar' };\n\nfunction emitted() {\n  console.log(this === context); // true\n}\n\nEE.once('event-name', emitted, context);\nEE.on('another-event', emitted, context);\nEE.removeListener('another-event', emitted, context);\n```\n\n### Tests and benchmarks\n\nThis module is well tested. You can run:\n\n- `npm test` to run the tests under Node.js.\n- `npm run test-browser` to run the tests in real browsers via Sauce Labs.\n\nWe also have a set of benchmarks to compare EventEmitter3 with some available\nalternatives. To run the benchmarks run `npm run benchmark`.\n\nTests and benchmarks are not included in the npm package. If you want to play\nwith them you have to clone the GitHub repository.\nNote that you will have to run an additional `npm i` in the benchmarks folder\nbefore `npm run benchmark`.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/index.d.ts",
    "content": "/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n */\ndeclare class EventEmitter<\n  EventTypes extends EventEmitter.ValidEventTypes = string | symbol,\n  Context extends any = any\n> {\n  static prefixed: string | boolean;\n\n  /**\n   * Return an array listing the events for which the emitter has registered\n   * listeners.\n   */\n  eventNames(): Array<EventEmitter.EventNames<EventTypes>>;\n\n  /**\n   * Return the listeners registered for a given event.\n   */\n  listeners<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T\n  ): Array<EventEmitter.EventListener<EventTypes, T>>;\n\n  /**\n   * Return the number of listeners listening to a given event.\n   */\n  listenerCount(event: EventEmitter.EventNames<EventTypes>): number;\n\n  /**\n   * Calls each of the listeners registered for a given event.\n   */\n  emit<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T,\n    ...args: EventEmitter.EventArgs<EventTypes, T>\n  ): boolean;\n\n  /**\n   * Add a listener for a given event.\n   */\n  on<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T,\n    fn: EventEmitter.EventListener<EventTypes, T>,\n    context?: Context\n  ): this;\n  addListener<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T,\n    fn: EventEmitter.EventListener<EventTypes, T>,\n    context?: Context\n  ): this;\n\n  /**\n   * Add a one-time listener for a given event.\n   */\n  once<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T,\n    fn: EventEmitter.EventListener<EventTypes, T>,\n    context?: Context\n  ): this;\n\n  /**\n   * Remove the listeners of a given event.\n   */\n  removeListener<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T,\n    fn?: EventEmitter.EventListener<EventTypes, T>,\n    context?: Context,\n    once?: boolean\n  ): this;\n  off<T extends EventEmitter.EventNames<EventTypes>>(\n    event: T,\n    fn?: EventEmitter.EventListener<EventTypes, T>,\n    context?: Context,\n    once?: boolean\n  ): this;\n\n  /**\n   * Remove all listeners, or those of the specified event.\n   */\n  removeAllListeners(event?: EventEmitter.EventNames<EventTypes>): this;\n}\n\ndeclare namespace EventEmitter {\n  export interface ListenerFn<Args extends any[] = any[]> {\n    (...args: Args): void;\n  }\n\n  export interface EventEmitterStatic {\n    new <\n      EventTypes extends ValidEventTypes = string | symbol,\n      Context = any\n    >(): EventEmitter<EventTypes, Context>;\n  }\n\n  /**\n   * `object` should be in either of the following forms:\n   * ```\n   * interface EventTypes {\n   *   'event-with-parameters': any[]\n   *   'event-with-example-handler': (...args: any[]) => void\n   * }\n   * ```\n   */\n  export type ValidEventTypes = string | symbol | object;\n\n  export type EventNames<T extends ValidEventTypes> = T extends string | symbol\n    ? T\n    : keyof T;\n\n  export type ArgumentMap<T extends object> = {\n    [K in keyof T]: T[K] extends (...args: any[]) => void\n      ? Parameters<T[K]>\n      : T[K] extends any[]\n      ? T[K]\n      : any[];\n  };\n\n  export type EventListener<\n    T extends ValidEventTypes,\n    K extends EventNames<T>\n  > = T extends string | symbol\n    ? (...args: any[]) => void\n    : (\n        ...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]\n      ) => void;\n\n  export type EventArgs<\n    T extends ValidEventTypes,\n    K extends EventNames<T>\n  > = Parameters<EventListener<T, K>>;\n\n  export const EventEmitter: EventEmitterStatic;\n}\n\nexport = EventEmitter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/index.js",
    "content": "'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/package.json",
    "content": "{\n  \"name\": \"eventemitter3\",\n  \"version\": \"4.0.7\",\n  \"description\": \"EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.\",\n  \"main\": \"index.js\",\n  \"typings\": \"index.d.ts\",\n  \"scripts\": {\n    \"browserify\": \"rm -rf umd && mkdir umd && browserify index.js -s EventEmitter3 -o umd/eventemitter3.js\",\n    \"minify\": \"uglifyjs umd/eventemitter3.js --source-map -cm -o umd/eventemitter3.min.js\",\n    \"benchmark\": \"find benchmarks/run -name '*.js' -exec benchmarks/start.sh {} \\\\;\",\n    \"test\": \"nyc --reporter=html --reporter=text mocha test/test.js\",\n    \"prepublishOnly\": \"npm run browserify && npm run minify\",\n    \"test-browser\": \"node test/browser.js\"\n  },\n  \"files\": [\n    \"index.js\",\n    \"index.d.ts\",\n    \"umd\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/primus/eventemitter3.git\"\n  },\n  \"keywords\": [\n    \"EventEmitter\",\n    \"EventEmitter2\",\n    \"EventEmitter3\",\n    \"Events\",\n    \"addEventListener\",\n    \"addListener\",\n    \"emit\",\n    \"emits\",\n    \"emitter\",\n    \"event\",\n    \"once\",\n    \"pub/sub\",\n    \"publish\",\n    \"reactor\",\n    \"subscribe\"\n  ],\n  \"author\": \"Arnout Kazemier\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/primus/eventemitter3/issues\"\n  },\n  \"devDependencies\": {\n    \"assume\": \"^2.2.0\",\n    \"browserify\": \"^16.5.0\",\n    \"mocha\": \"^8.0.1\",\n    \"nyc\": \"^15.1.0\",\n    \"pre-commit\": \"^1.2.0\",\n    \"sauce-browsers\": \"^2.0.0\",\n    \"sauce-test\": \"^1.3.3\",\n    \"uglify-js\": \"^3.9.0\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/umd/eventemitter3.js",
    "content": "(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.EventEmitter3 = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n\n},{}]},{},[1])(1)\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/umd/eventemitter3.min.js",
    "content": "!function(e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).EventEmitter3=e()}(function(){return function i(s,f,c){function u(t,e){if(!f[t]){if(!s[t]){var n=\"function\"==typeof require&&require;if(!e&&n)return n(t,!0);if(a)return a(t,!0);var r=new Error(\"Cannot find module '\"+t+\"'\");throw r.code=\"MODULE_NOT_FOUND\",r}var o=f[t]={exports:{}};s[t][0].call(o.exports,function(e){return u(s[t][1][e]||e)},o,o.exports,i,s,f,c)}return f[t].exports}for(var a=\"function\"==typeof require&&require,e=0;e<c.length;e++)u(c[e]);return u}({1:[function(e,t,n){\"use strict\";var r=Object.prototype.hasOwnProperty,v=\"~\";function o(){}function f(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function i(e,t,n,r,o){if(\"function\"!=typeof n)throw new TypeError(\"The listener must be a function\");var i=new f(n,r||e,o),s=v?v+t:t;return e._events[s]?e._events[s].fn?e._events[s]=[e._events[s],i]:e._events[s].push(i):(e._events[s]=i,e._eventsCount++),e}function u(e,t){0==--e._eventsCount?e._events=new o:delete e._events[t]}function s(){this._events=new o,this._eventsCount=0}Object.create&&(o.prototype=Object.create(null),(new o).__proto__||(v=!1)),s.prototype.eventNames=function(){var e,t,n=[];if(0===this._eventsCount)return n;for(t in e=this._events)r.call(e,t)&&n.push(v?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},s.prototype.listeners=function(e){var t=v?v+e:e,n=this._events[t];if(!n)return[];if(n.fn)return[n.fn];for(var r=0,o=n.length,i=new Array(o);r<o;r++)i[r]=n[r].fn;return i},s.prototype.listenerCount=function(e){var t=v?v+e:e,n=this._events[t];return n?n.fn?1:n.length:0},s.prototype.emit=function(e,t,n,r,o,i){var s=v?v+e:e;if(!this._events[s])return!1;var f,c=this._events[s],u=arguments.length;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),u){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,r),!0;case 5:return c.fn.call(c.context,t,n,r,o),!0;case 6:return c.fn.call(c.context,t,n,r,o,i),!0}for(p=1,f=new Array(u-1);p<u;p++)f[p-1]=arguments[p];c.fn.apply(c.context,f)}else for(var a,l=c.length,p=0;p<l;p++)switch(c[p].once&&this.removeListener(e,c[p].fn,void 0,!0),u){case 1:c[p].fn.call(c[p].context);break;case 2:c[p].fn.call(c[p].context,t);break;case 3:c[p].fn.call(c[p].context,t,n);break;case 4:c[p].fn.call(c[p].context,t,n,r);break;default:if(!f)for(a=1,f=new Array(u-1);a<u;a++)f[a-1]=arguments[a];c[p].fn.apply(c[p].context,f)}return!0},s.prototype.on=function(e,t,n){return i(this,e,t,n,!1)},s.prototype.once=function(e,t,n){return i(this,e,t,n,!0)},s.prototype.removeListener=function(e,t,n,r){var o=v?v+e:e;if(!this._events[o])return this;if(!t)return u(this,o),this;var i=this._events[o];if(i.fn)i.fn!==t||r&&!i.once||n&&i.context!==n||u(this,o);else{for(var s=0,f=[],c=i.length;s<c;s++)(i[s].fn!==t||r&&!i[s].once||n&&i[s].context!==n)&&f.push(i[s]);f.length?this._events[o]=1===f.length?f[0]:f:u(this,o)}return this},s.prototype.removeAllListeners=function(e){var t;return e?(t=v?v+e:e,this._events[t]&&u(this,t)):(this._events=new o,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=v,s.EventEmitter=s,void 0!==t&&(t.exports=s)},{}]},{},[1])(1)});"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/eventemitter3/umd/eventemitter3.min.js.map",
    "content": "{\"version\":3,\"sources\":[\"umd/eventemitter3.js\"],\"names\":[\"f\",\"exports\",\"module\",\"define\",\"amd\",\"window\",\"global\",\"self\",\"this\",\"EventEmitter3\",\"r\",\"e\",\"n\",\"t\",\"o\",\"i\",\"c\",\"require\",\"u\",\"a\",\"Error\",\"code\",\"p\",\"call\",\"length\",\"1\",\"has\",\"Object\",\"prototype\",\"hasOwnProperty\",\"prefix\",\"Events\",\"EE\",\"fn\",\"context\",\"once\",\"addListener\",\"emitter\",\"event\",\"TypeError\",\"listener\",\"evt\",\"_events\",\"push\",\"_eventsCount\",\"clearEvent\",\"EventEmitter\",\"create\",\"__proto__\",\"eventNames\",\"events\",\"name\",\"names\",\"slice\",\"getOwnPropertySymbols\",\"concat\",\"listeners\",\"handlers\",\"l\",\"ee\",\"Array\",\"listenerCount\",\"emit\",\"a1\",\"a2\",\"a3\",\"a4\",\"a5\",\"args\",\"len\",\"arguments\",\"removeListener\",\"undefined\",\"apply\",\"j\",\"on\",\"removeAllListeners\",\"off\",\"prefixed\"],\"mappings\":\"CAAA,SAAUA,GAAuB,iBAAVC,SAAoC,oBAATC,OAAsBA,OAAOD,QAAQD,IAA4B,mBAATG,QAAqBA,OAAOC,IAAKD,OAAO,GAAGH,IAAiC,oBAATK,OAAwBA,OAA+B,oBAATC,OAAwBA,OAA6B,oBAAPC,KAAsBA,KAAYC,MAAOC,cAAgBT,IAAlU,CAAyU,WAAqC,OAAmB,SAASU,EAAEC,EAAEC,EAAEC,GAAG,SAASC,EAAEC,EAAEf,GAAG,IAAIY,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,IAAIC,EAAE,mBAAmBC,SAASA,QAAQ,IAAIjB,GAAGgB,EAAE,OAAOA,EAAED,GAAE,GAAI,GAAGG,EAAE,OAAOA,EAAEH,GAAE,GAAI,IAAII,EAAE,IAAIC,MAAM,uBAAuBL,EAAE,KAAK,MAAMI,EAAEE,KAAK,mBAAmBF,EAAE,IAAIG,EAAEV,EAAEG,GAAG,CAACd,QAAQ,IAAIU,EAAEI,GAAG,GAAGQ,KAAKD,EAAErB,QAAQ,SAASS,GAAoB,OAAOI,EAAlBH,EAAEI,GAAG,GAAGL,IAAeA,IAAIY,EAAEA,EAAErB,QAAQS,EAAEC,EAAEC,EAAEC,GAAG,OAAOD,EAAEG,GAAGd,QAAQ,IAAI,IAAIiB,EAAE,mBAAmBD,SAASA,QAAQF,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,IAAI,OAAOD,EAA7b,CAA4c,CAACW,EAAE,CAAC,SAASR,EAAQf,EAAOD,gBAG71B,IAAIyB,EAAMC,OAAOC,UAAUC,eACvBC,EAAS,IASb,SAASC,KA4BT,SAASC,EAAGC,EAAIC,EAASC,GACvB3B,KAAKyB,GAAKA,EACVzB,KAAK0B,QAAUA,EACf1B,KAAK2B,KAAOA,IAAQ,EActB,SAASC,EAAYC,EAASC,EAAOL,EAAIC,EAASC,GAChD,GAAkB,mBAAPF,EACT,MAAM,IAAIM,UAAU,mCAGtB,IAAIC,EAAW,IAAIR,EAAGC,EAAIC,GAAWG,EAASF,GAC1CM,EAAMX,EAASA,EAASQ,EAAQA,EAMpC,OAJKD,EAAQK,QAAQD,GACXJ,EAAQK,QAAQD,GAAKR,GAC1BI,EAAQK,QAAQD,GAAO,CAACJ,EAAQK,QAAQD,GAAMD,GADhBH,EAAQK,QAAQD,GAAKE,KAAKH,IADlCH,EAAQK,QAAQD,GAAOD,EAAUH,EAAQO,gBAI7DP,EAUT,SAASQ,EAAWR,EAASI,GACI,KAAzBJ,EAAQO,aAAoBP,EAAQK,QAAU,IAAIX,SAC5CM,EAAQK,QAAQD,GAU9B,SAASK,IACPtC,KAAKkC,QAAU,IAAIX,EACnBvB,KAAKoC,aAAe,EAxElBjB,OAAOoB,SACThB,EAAOH,UAAYD,OAAOoB,OAAO,OAM5B,IAAIhB,GAASiB,YAAWlB,GAAS,IA2ExCgB,EAAalB,UAAUqB,WAAa,WAClC,IACIC,EACAC,EAFAC,EAAQ,GAIZ,GAA0B,IAAtB5C,KAAKoC,aAAoB,OAAOQ,EAEpC,IAAKD,KAASD,EAAS1C,KAAKkC,QACtBhB,EAAIH,KAAK2B,EAAQC,IAAOC,EAAMT,KAAKb,EAASqB,EAAKE,MAAM,GAAKF,GAGlE,OAAIxB,OAAO2B,sBACFF,EAAMG,OAAO5B,OAAO2B,sBAAsBJ,IAG5CE,GAUTN,EAAalB,UAAU4B,UAAY,SAAmBlB,GACpD,IAAIG,EAAMX,EAASA,EAASQ,EAAQA,EAChCmB,EAAWjD,KAAKkC,QAAQD,GAE5B,IAAKgB,EAAU,MAAO,GACtB,GAAIA,EAASxB,GAAI,MAAO,CAACwB,EAASxB,IAElC,IAAK,IAAIlB,EAAI,EAAG2C,EAAID,EAASjC,OAAQmC,EAAK,IAAIC,MAAMF,GAAI3C,EAAI2C,EAAG3C,IAC7D4C,EAAG5C,GAAK0C,EAAS1C,GAAGkB,GAGtB,OAAO0B,GAUTb,EAAalB,UAAUiC,cAAgB,SAAuBvB,GAC5D,IAAIG,EAAMX,EAASA,EAASQ,EAAQA,EAChCkB,EAAYhD,KAAKkC,QAAQD,GAE7B,OAAKe,EACDA,EAAUvB,GAAW,EAClBuB,EAAUhC,OAFM,GAYzBsB,EAAalB,UAAUkC,KAAO,SAAcxB,EAAOyB,EAAIC,EAAIC,EAAIC,EAAIC,GACjE,IAAI1B,EAAMX,EAASA,EAASQ,EAAQA,EAEpC,IAAK9B,KAAKkC,QAAQD,GAAM,OAAO,EAE/B,IAEI2B,EAFAZ,EAAYhD,KAAKkC,QAAQD,GACzB4B,EAAMC,UAAU9C,OAIpB,GAAIgC,EAAUvB,GAAI,CAGhB,OAFIuB,EAAUrB,MAAM3B,KAAK+D,eAAejC,EAAOkB,EAAUvB,QAAIuC,GAAW,GAEhEH,GACN,KAAK,EAAG,OAAOb,EAAUvB,GAAGV,KAAKiC,EAAUtB,UAAU,EACrD,KAAK,EAAG,OAAOsB,EAAUvB,GAAGV,KAAKiC,EAAUtB,QAAS6B,IAAK,EACzD,KAAK,EAAG,OAAOP,EAAUvB,GAAGV,KAAKiC,EAAUtB,QAAS6B,EAAIC,IAAK,EAC7D,KAAK,EAAG,OAAOR,EAAUvB,GAAGV,KAAKiC,EAAUtB,QAAS6B,EAAIC,EAAIC,IAAK,EACjE,KAAK,EAAG,OAAOT,EAAUvB,GAAGV,KAAKiC,EAAUtB,QAAS6B,EAAIC,EAAIC,EAAIC,IAAK,EACrE,KAAK,EAAG,OAAOV,EAAUvB,GAAGV,KAAKiC,EAAUtB,QAAS6B,EAAIC,EAAIC,EAAIC,EAAIC,IAAK,EAG3E,IAAKpD,EAAI,EAAGqD,EAAO,IAAIR,MAAMS,EAAK,GAAItD,EAAIsD,EAAKtD,IAC7CqD,EAAKrD,EAAI,GAAKuD,UAAUvD,GAG1ByC,EAAUvB,GAAGwC,MAAMjB,EAAUtB,QAASkC,QAKtC,IAHA,IACIM,EADAlD,EAASgC,EAAUhC,OAGlBT,EAAI,EAAGA,EAAIS,EAAQT,IAGtB,OAFIyC,EAAUzC,GAAGoB,MAAM3B,KAAK+D,eAAejC,EAAOkB,EAAUzC,GAAGkB,QAAIuC,GAAW,GAEtEH,GACN,KAAK,EAAGb,EAAUzC,GAAGkB,GAAGV,KAAKiC,EAAUzC,GAAGmB,SAAU,MACpD,KAAK,EAAGsB,EAAUzC,GAAGkB,GAAGV,KAAKiC,EAAUzC,GAAGmB,QAAS6B,GAAK,MACxD,KAAK,EAAGP,EAAUzC,GAAGkB,GAAGV,KAAKiC,EAAUzC,GAAGmB,QAAS6B,EAAIC,GAAK,MAC5D,KAAK,EAAGR,EAAUzC,GAAGkB,GAAGV,KAAKiC,EAAUzC,GAAGmB,QAAS6B,EAAIC,EAAIC,GAAK,MAChE,QACE,IAAKG,EAAM,IAAKM,EAAI,EAAGN,EAAO,IAAIR,MAAMS,EAAK,GAAIK,EAAIL,EAAKK,IACxDN,EAAKM,EAAI,GAAKJ,UAAUI,GAG1BlB,EAAUzC,GAAGkB,GAAGwC,MAAMjB,EAAUzC,GAAGmB,QAASkC,GAKpD,OAAO,GAYTtB,EAAalB,UAAU+C,GAAK,SAAYrC,EAAOL,EAAIC,GACjD,OAAOE,EAAY5B,KAAM8B,EAAOL,EAAIC,GAAS,IAY/CY,EAAalB,UAAUO,KAAO,SAAcG,EAAOL,EAAIC,GACrD,OAAOE,EAAY5B,KAAM8B,EAAOL,EAAIC,GAAS,IAa/CY,EAAalB,UAAU2C,eAAiB,SAAwBjC,EAAOL,EAAIC,EAASC,GAClF,IAAIM,EAAMX,EAASA,EAASQ,EAAQA,EAEpC,IAAK9B,KAAKkC,QAAQD,GAAM,OAAOjC,KAC/B,IAAKyB,EAEH,OADAY,EAAWrC,KAAMiC,GACVjC,KAGT,IAAIgD,EAAYhD,KAAKkC,QAAQD,GAE7B,GAAIe,EAAUvB,GAEVuB,EAAUvB,KAAOA,GACfE,IAAQqB,EAAUrB,MAClBD,GAAWsB,EAAUtB,UAAYA,GAEnCW,EAAWrC,KAAMiC,OAEd,CACL,IAAK,IAAI1B,EAAI,EAAGmC,EAAS,GAAI1B,EAASgC,EAAUhC,OAAQT,EAAIS,EAAQT,KAEhEyC,EAAUzC,GAAGkB,KAAOA,GACnBE,IAASqB,EAAUzC,GAAGoB,MACtBD,GAAWsB,EAAUzC,GAAGmB,UAAYA,IAErCgB,EAAOP,KAAKa,EAAUzC,IAOtBmC,EAAO1B,OAAQhB,KAAKkC,QAAQD,GAAyB,IAAlBS,EAAO1B,OAAe0B,EAAO,GAAKA,EACpEL,EAAWrC,KAAMiC,GAGxB,OAAOjC,MAUTsC,EAAalB,UAAUgD,mBAAqB,SAA4BtC,GACtE,IAAIG,EAUJ,OARIH,GACFG,EAAMX,EAASA,EAASQ,EAAQA,EAC5B9B,KAAKkC,QAAQD,IAAMI,EAAWrC,KAAMiC,KAExCjC,KAAKkC,QAAU,IAAIX,EACnBvB,KAAKoC,aAAe,GAGfpC,MAMTsC,EAAalB,UAAUiD,IAAM/B,EAAalB,UAAU2C,eACpDzB,EAAalB,UAAUQ,YAAcU,EAAalB,UAAU+C,GAK5D7B,EAAagC,SAAWhD,EAKxBgB,EAAaA,aAAeA,OAKxB,IAAuB5C,IACzBA,EAAOD,QAAU6C,IAGjB,KAAK,GAAG,CAAC,GAlV0W,CAkVtW\"}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/LICENSE",
    "content": "Copyright 2014–present Olivier Lalonde <olalonde@gmail.com>, James Talmage <james@talmage.io>, Ruben Verborgh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/README.md",
    "content": "## Follow Redirects\n\nDrop-in replacement for Node's `http` and `https` modules that automatically follows redirects.\n\n[![npm version](https://img.shields.io/npm/v/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects)\n[![Build Status](https://github.com/follow-redirects/follow-redirects/workflows/CI/badge.svg)](https://github.com/follow-redirects/follow-redirects/actions)\n[![Coverage Status](https://coveralls.io/repos/follow-redirects/follow-redirects/badge.svg?branch=master)](https://coveralls.io/r/follow-redirects/follow-redirects?branch=master)\n[![npm downloads](https://img.shields.io/npm/dm/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects)\n[![Sponsor on GitHub](https://img.shields.io/static/v1?label=Sponsor&message=%F0%9F%92%96&logo=GitHub)](https://github.com/sponsors/RubenVerborgh)\n\n`follow-redirects` provides [request](https://nodejs.org/api/http.html#http_http_request_options_callback) and [get](https://nodejs.org/api/http.html#http_http_get_options_callback)\n methods that behave identically to those found on the native [http](https://nodejs.org/api/http.html#http_http_request_options_callback) and [https](https://nodejs.org/api/https.html#https_https_request_options_callback)\n modules, with the exception that they will seamlessly follow redirects.\n\n```javascript\nconst { http, https } = require('follow-redirects');\n\nhttp.get('http://bit.ly/900913', response => {\n  response.on('data', chunk => {\n    console.log(chunk);\n  });\n}).on('error', err => {\n  console.error(err);\n});\n```\n\nYou can inspect the final redirected URL through the `responseUrl` property on the `response`.\nIf no redirection happened, `responseUrl` is the original request URL.\n\n```javascript\nconst request = https.request({\n  host: 'bitly.com',\n  path: '/UHfDGO',\n}, response => {\n  console.log(response.responseUrl);\n  // 'http://duckduckgo.com/robots.txt'\n});\nrequest.end();\n```\n\n## Options\n### Global options\nGlobal options are set directly on the `follow-redirects` module:\n\n```javascript\nconst followRedirects = require('follow-redirects');\nfollowRedirects.maxRedirects = 10;\nfollowRedirects.maxBodyLength = 20 * 1024 * 1024; // 20 MB\n```\n\nThe following global options are supported:\n\n- `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.\n\n- `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.\n\n### Per-request options\nPer-request options are set by passing an `options` object:\n\n```javascript\nconst url = require('url');\nconst { http, https } = require('follow-redirects');\n\nconst options = url.parse('http://bit.ly/900913');\noptions.maxRedirects = 10;\noptions.beforeRedirect = (options, response, request) => {\n  // Use this to adjust the request options upon redirecting,\n  // to inspect the latest response headers,\n  // or to cancel the request by throwing an error\n\n  // response.headers = the redirect response headers\n  // response.statusCode = the redirect response code (eg. 301, 307, etc.)\n\n  // request.url = the requested URL that resulted in a redirect\n  // request.headers = the headers in the request that resulted in a redirect\n  // request.method = the method of the request that resulted in a redirect\n  if (options.hostname === \"example.com\") {\n    options.auth = \"user:password\";\n  }\n};\nhttp.request(options);\n```\n\nIn addition to the [standard HTTP](https://nodejs.org/api/http.html#http_http_request_options_callback) and [HTTPS options](https://nodejs.org/api/https.html#https_https_request_options_callback),\nthe following per-request options are supported:\n- `followRedirects` (default: `true`) – whether redirects should be followed.\n\n- `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.\n\n- `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.\n\n- `beforeRedirect` (default: `undefined`) – optionally change the request `options` on redirects, or abort the request by throwing an error.\n\n- `agents` (default: `undefined`) – sets the `agent` option per protocol, since HTTP and HTTPS use different agents. Example value: `{ http: new http.Agent(), https: new https.Agent() }`\n\n- `trackRedirects` (default: `false`) – whether to store the redirected response details into the `redirects` array on the response object.\n\n\n### Advanced usage\nBy default, `follow-redirects` will use the Node.js default implementations\nof [`http`](https://nodejs.org/api/http.html)\nand [`https`](https://nodejs.org/api/https.html).\nTo enable features such as caching and/or intermediate request tracking,\nyou might instead want to wrap `follow-redirects` around custom protocol implementations:\n\n```javascript\nconst { http, https } = require('follow-redirects').wrap({\n  http: require('your-custom-http'),\n  https: require('your-custom-https'),\n});\n```\n\nSuch custom protocols only need an implementation of the `request` method.\n\n## Browser Usage\n\nDue to the way the browser works,\nthe `http` and `https` browser equivalents perform redirects by default.\n\nBy requiring `follow-redirects` this way:\n```javascript\nconst http = require('follow-redirects/http');\nconst https = require('follow-redirects/https');\n```\nyou can easily tell webpack and friends to replace\n`follow-redirect` by the built-in versions:\n\n```json\n{\n  \"follow-redirects/http\"  : \"http\",\n  \"follow-redirects/https\" : \"https\"\n}\n```\n\n## Contributing\n\nPull Requests are always welcome. Please [file an issue](https://github.com/follow-redirects/follow-redirects/issues)\n detailing your proposal before you invest your valuable time. Additional features and bug fixes should be accompanied\n by tests. You can run the test suite locally with a simple `npm test` command.\n\n## Debug Logging\n\n`follow-redirects` uses the excellent [debug](https://www.npmjs.com/package/debug) for logging. To turn on logging\n set the environment variable `DEBUG=follow-redirects` for debug output from just this module. When running the test\n suite it is sometimes advantageous to set `DEBUG=*` to see output from the express server as well.\n\n## Authors\n\n- [Ruben Verborgh](https://ruben.verborgh.org/)\n- [Olivier Lalonde](mailto:olalonde@gmail.com)\n- [James Talmage](mailto:james@talmage.io)\n\n## License\n\n[MIT License](https://github.com/follow-redirects/follow-redirects/blob/master/LICENSE)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/debug.js",
    "content": "var debug;\n\nmodule.exports = function () {\n  if (!debug) {\n    try {\n      /* eslint global-require: off */\n      debug = require(\"debug\")(\"follow-redirects\");\n    }\n    catch (error) { /* */ }\n    if (typeof debug !== \"function\") {\n      debug = function () { /* */ };\n    }\n  }\n  debug.apply(null, arguments);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/http.js",
    "content": "module.exports = require(\"./\").http;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/https.js",
    "content": "module.exports = require(\"./\").https;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/index.js",
    "content": "var url = require(\"url\");\nvar URL = url.URL;\nvar http = require(\"http\");\nvar https = require(\"https\");\nvar Writable = require(\"stream\").Writable;\nvar assert = require(\"assert\");\nvar debug = require(\"./debug\");\n\n// Create handlers that pass events from native requests\nvar events = [\"abort\", \"aborted\", \"connect\", \"error\", \"socket\", \"timeout\"];\nvar eventHandlers = Object.create(null);\nevents.forEach(function (event) {\n  eventHandlers[event] = function (arg1, arg2, arg3) {\n    this._redirectable.emit(event, arg1, arg2, arg3);\n  };\n});\n\nvar InvalidUrlError = createErrorType(\n  \"ERR_INVALID_URL\",\n  \"Invalid URL\",\n  TypeError\n);\n// Error types with codes\nvar RedirectionError = createErrorType(\n  \"ERR_FR_REDIRECTION_FAILURE\",\n  \"Redirected request failed\"\n);\nvar TooManyRedirectsError = createErrorType(\n  \"ERR_FR_TOO_MANY_REDIRECTS\",\n  \"Maximum number of redirects exceeded\"\n);\nvar MaxBodyLengthExceededError = createErrorType(\n  \"ERR_FR_MAX_BODY_LENGTH_EXCEEDED\",\n  \"Request body larger than maxBodyLength limit\"\n);\nvar WriteAfterEndError = createErrorType(\n  \"ERR_STREAM_WRITE_AFTER_END\",\n  \"write after end\"\n);\n\n// An HTTP(S) request that can be redirected\nfunction RedirectableRequest(options, responseCallback) {\n  // Initialize the request\n  Writable.call(this);\n  this._sanitizeOptions(options);\n  this._options = options;\n  this._ended = false;\n  this._ending = false;\n  this._redirectCount = 0;\n  this._redirects = [];\n  this._requestBodyLength = 0;\n  this._requestBodyBuffers = [];\n\n  // Attach a callback if passed\n  if (responseCallback) {\n    this.on(\"response\", responseCallback);\n  }\n\n  // React to responses of native requests\n  var self = this;\n  this._onNativeResponse = function (response) {\n    self._processResponse(response);\n  };\n\n  // Perform the first request\n  this._performRequest();\n}\nRedirectableRequest.prototype = Object.create(Writable.prototype);\n\nRedirectableRequest.prototype.abort = function () {\n  abortRequest(this._currentRequest);\n  this.emit(\"abort\");\n};\n\n// Writes buffered data to the current native request\nRedirectableRequest.prototype.write = function (data, encoding, callback) {\n  // Writing is not allowed if end has been called\n  if (this._ending) {\n    throw new WriteAfterEndError();\n  }\n\n  // Validate input and shift parameters if necessary\n  if (!isString(data) && !isBuffer(data)) {\n    throw new TypeError(\"data should be a string, Buffer or Uint8Array\");\n  }\n  if (isFunction(encoding)) {\n    callback = encoding;\n    encoding = null;\n  }\n\n  // Ignore empty buffers, since writing them doesn't invoke the callback\n  // https://github.com/nodejs/node/issues/22066\n  if (data.length === 0) {\n    if (callback) {\n      callback();\n    }\n    return;\n  }\n  // Only write when we don't exceed the maximum body length\n  if (this._requestBodyLength + data.length <= this._options.maxBodyLength) {\n    this._requestBodyLength += data.length;\n    this._requestBodyBuffers.push({ data: data, encoding: encoding });\n    this._currentRequest.write(data, encoding, callback);\n  }\n  // Error when we exceed the maximum body length\n  else {\n    this.emit(\"error\", new MaxBodyLengthExceededError());\n    this.abort();\n  }\n};\n\n// Ends the current native request\nRedirectableRequest.prototype.end = function (data, encoding, callback) {\n  // Shift parameters if necessary\n  if (isFunction(data)) {\n    callback = data;\n    data = encoding = null;\n  }\n  else if (isFunction(encoding)) {\n    callback = encoding;\n    encoding = null;\n  }\n\n  // Write data if needed and end\n  if (!data) {\n    this._ended = this._ending = true;\n    this._currentRequest.end(null, null, callback);\n  }\n  else {\n    var self = this;\n    var currentRequest = this._currentRequest;\n    this.write(data, encoding, function () {\n      self._ended = true;\n      currentRequest.end(null, null, callback);\n    });\n    this._ending = true;\n  }\n};\n\n// Sets a header value on the current native request\nRedirectableRequest.prototype.setHeader = function (name, value) {\n  this._options.headers[name] = value;\n  this._currentRequest.setHeader(name, value);\n};\n\n// Clears a header value on the current native request\nRedirectableRequest.prototype.removeHeader = function (name) {\n  delete this._options.headers[name];\n  this._currentRequest.removeHeader(name);\n};\n\n// Global timeout for all underlying requests\nRedirectableRequest.prototype.setTimeout = function (msecs, callback) {\n  var self = this;\n\n  // Destroys the socket on timeout\n  function destroyOnTimeout(socket) {\n    socket.setTimeout(msecs);\n    socket.removeListener(\"timeout\", socket.destroy);\n    socket.addListener(\"timeout\", socket.destroy);\n  }\n\n  // Sets up a timer to trigger a timeout event\n  function startTimer(socket) {\n    if (self._timeout) {\n      clearTimeout(self._timeout);\n    }\n    self._timeout = setTimeout(function () {\n      self.emit(\"timeout\");\n      clearTimer();\n    }, msecs);\n    destroyOnTimeout(socket);\n  }\n\n  // Stops a timeout from triggering\n  function clearTimer() {\n    // Clear the timeout\n    if (self._timeout) {\n      clearTimeout(self._timeout);\n      self._timeout = null;\n    }\n\n    // Clean up all attached listeners\n    self.removeListener(\"abort\", clearTimer);\n    self.removeListener(\"error\", clearTimer);\n    self.removeListener(\"response\", clearTimer);\n    if (callback) {\n      self.removeListener(\"timeout\", callback);\n    }\n    if (!self.socket) {\n      self._currentRequest.removeListener(\"socket\", startTimer);\n    }\n  }\n\n  // Attach callback if passed\n  if (callback) {\n    this.on(\"timeout\", callback);\n  }\n\n  // Start the timer if or when the socket is opened\n  if (this.socket) {\n    startTimer(this.socket);\n  }\n  else {\n    this._currentRequest.once(\"socket\", startTimer);\n  }\n\n  // Clean up on events\n  this.on(\"socket\", destroyOnTimeout);\n  this.on(\"abort\", clearTimer);\n  this.on(\"error\", clearTimer);\n  this.on(\"response\", clearTimer);\n\n  return this;\n};\n\n// Proxy all other public ClientRequest methods\n[\n  \"flushHeaders\", \"getHeader\",\n  \"setNoDelay\", \"setSocketKeepAlive\",\n].forEach(function (method) {\n  RedirectableRequest.prototype[method] = function (a, b) {\n    return this._currentRequest[method](a, b);\n  };\n});\n\n// Proxy all public ClientRequest properties\n[\"aborted\", \"connection\", \"socket\"].forEach(function (property) {\n  Object.defineProperty(RedirectableRequest.prototype, property, {\n    get: function () { return this._currentRequest[property]; },\n  });\n});\n\nRedirectableRequest.prototype._sanitizeOptions = function (options) {\n  // Ensure headers are always present\n  if (!options.headers) {\n    options.headers = {};\n  }\n\n  // Since http.request treats host as an alias of hostname,\n  // but the url module interprets host as hostname plus port,\n  // eliminate the host property to avoid confusion.\n  if (options.host) {\n    // Use hostname if set, because it has precedence\n    if (!options.hostname) {\n      options.hostname = options.host;\n    }\n    delete options.host;\n  }\n\n  // Complete the URL object when necessary\n  if (!options.pathname && options.path) {\n    var searchPos = options.path.indexOf(\"?\");\n    if (searchPos < 0) {\n      options.pathname = options.path;\n    }\n    else {\n      options.pathname = options.path.substring(0, searchPos);\n      options.search = options.path.substring(searchPos);\n    }\n  }\n};\n\n\n// Executes the next native request (initial or redirect)\nRedirectableRequest.prototype._performRequest = function () {\n  // Load the native protocol\n  var protocol = this._options.protocol;\n  var nativeProtocol = this._options.nativeProtocols[protocol];\n  if (!nativeProtocol) {\n    this.emit(\"error\", new TypeError(\"Unsupported protocol \" + protocol));\n    return;\n  }\n\n  // If specified, use the agent corresponding to the protocol\n  // (HTTP and HTTPS use different types of agents)\n  if (this._options.agents) {\n    var scheme = protocol.slice(0, -1);\n    this._options.agent = this._options.agents[scheme];\n  }\n\n  // Create the native request and set up its event handlers\n  var request = this._currentRequest =\n        nativeProtocol.request(this._options, this._onNativeResponse);\n  request._redirectable = this;\n  for (var event of events) {\n    request.on(event, eventHandlers[event]);\n  }\n\n  // RFC7230§5.3.1: When making a request directly to an origin server, […]\n  // a client MUST send only the absolute path […] as the request-target.\n  this._currentUrl = /^\\//.test(this._options.path) ?\n    url.format(this._options) :\n    // When making a request to a proxy, […]\n    // a client MUST send the target URI in absolute-form […].\n    this._options.path;\n\n  // End a redirected request\n  // (The first request must be ended explicitly with RedirectableRequest#end)\n  if (this._isRedirect) {\n    // Write the request entity and end\n    var i = 0;\n    var self = this;\n    var buffers = this._requestBodyBuffers;\n    (function writeNext(error) {\n      // Only write if this request has not been redirected yet\n      /* istanbul ignore else */\n      if (request === self._currentRequest) {\n        // Report any write errors\n        /* istanbul ignore if */\n        if (error) {\n          self.emit(\"error\", error);\n        }\n        // Write the next buffer if there are still left\n        else if (i < buffers.length) {\n          var buffer = buffers[i++];\n          /* istanbul ignore else */\n          if (!request.finished) {\n            request.write(buffer.data, buffer.encoding, writeNext);\n          }\n        }\n        // End the request if `end` has been called on us\n        else if (self._ended) {\n          request.end();\n        }\n      }\n    }());\n  }\n};\n\n// Processes a response from the current native request\nRedirectableRequest.prototype._processResponse = function (response) {\n  // Store the redirected response\n  var statusCode = response.statusCode;\n  if (this._options.trackRedirects) {\n    this._redirects.push({\n      url: this._currentUrl,\n      headers: response.headers,\n      statusCode: statusCode,\n    });\n  }\n\n  // RFC7231§6.4: The 3xx (Redirection) class of status code indicates\n  // that further action needs to be taken by the user agent in order to\n  // fulfill the request. If a Location header field is provided,\n  // the user agent MAY automatically redirect its request to the URI\n  // referenced by the Location field value,\n  // even if the specific status code is not understood.\n\n  // If the response is not a redirect; return it as-is\n  var location = response.headers.location;\n  if (!location || this._options.followRedirects === false ||\n      statusCode < 300 || statusCode >= 400) {\n    response.responseUrl = this._currentUrl;\n    response.redirects = this._redirects;\n    this.emit(\"response\", response);\n\n    // Clean up\n    this._requestBodyBuffers = [];\n    return;\n  }\n\n  // The response is a redirect, so abort the current request\n  abortRequest(this._currentRequest);\n  // Discard the remainder of the response to avoid waiting for data\n  response.destroy();\n\n  // RFC7231§6.4: A client SHOULD detect and intervene\n  // in cyclical redirections (i.e., \"infinite\" redirection loops).\n  if (++this._redirectCount > this._options.maxRedirects) {\n    this.emit(\"error\", new TooManyRedirectsError());\n    return;\n  }\n\n  // Store the request headers if applicable\n  var requestHeaders;\n  var beforeRedirect = this._options.beforeRedirect;\n  if (beforeRedirect) {\n    requestHeaders = Object.assign({\n      // The Host header was set by nativeProtocol.request\n      Host: response.req.getHeader(\"host\"),\n    }, this._options.headers);\n  }\n\n  // RFC7231§6.4: Automatic redirection needs to done with\n  // care for methods not known to be safe, […]\n  // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change\n  // the request method from POST to GET for the subsequent request.\n  var method = this._options.method;\n  if ((statusCode === 301 || statusCode === 302) && this._options.method === \"POST\" ||\n      // RFC7231§6.4.4: The 303 (See Other) status code indicates that\n      // the server is redirecting the user agent to a different resource […]\n      // A user agent can perform a retrieval request targeting that URI\n      // (a GET or HEAD request if using HTTP) […]\n      (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) {\n    this._options.method = \"GET\";\n    // Drop a possible entity and headers related to it\n    this._requestBodyBuffers = [];\n    removeMatchingHeaders(/^content-/i, this._options.headers);\n  }\n\n  // Drop the Host header, as the redirect might lead to a different host\n  var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers);\n\n  // If the redirect is relative, carry over the host of the last request\n  var currentUrlParts = url.parse(this._currentUrl);\n  var currentHost = currentHostHeader || currentUrlParts.host;\n  var currentUrl = /^\\w+:/.test(location) ? this._currentUrl :\n    url.format(Object.assign(currentUrlParts, { host: currentHost }));\n\n  // Determine the URL of the redirection\n  var redirectUrl;\n  try {\n    redirectUrl = url.resolve(currentUrl, location);\n  }\n  catch (cause) {\n    this.emit(\"error\", new RedirectionError({ cause: cause }));\n    return;\n  }\n\n  // Create the redirected request\n  debug(\"redirecting to\", redirectUrl);\n  this._isRedirect = true;\n  var redirectUrlParts = url.parse(redirectUrl);\n  Object.assign(this._options, redirectUrlParts);\n\n  // Drop confidential headers when redirecting to a less secure protocol\n  // or to a different domain that is not a superdomain\n  if (redirectUrlParts.protocol !== currentUrlParts.protocol &&\n     redirectUrlParts.protocol !== \"https:\" ||\n     redirectUrlParts.host !== currentHost &&\n     !isSubdomain(redirectUrlParts.host, currentHost)) {\n    removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers);\n  }\n\n  // Evaluate the beforeRedirect callback\n  if (isFunction(beforeRedirect)) {\n    var responseDetails = {\n      headers: response.headers,\n      statusCode: statusCode,\n    };\n    var requestDetails = {\n      url: currentUrl,\n      method: method,\n      headers: requestHeaders,\n    };\n    try {\n      beforeRedirect(this._options, responseDetails, requestDetails);\n    }\n    catch (err) {\n      this.emit(\"error\", err);\n      return;\n    }\n    this._sanitizeOptions(this._options);\n  }\n\n  // Perform the redirected request\n  try {\n    this._performRequest();\n  }\n  catch (cause) {\n    this.emit(\"error\", new RedirectionError({ cause: cause }));\n  }\n};\n\n// Wraps the key/value object of protocols with redirect functionality\nfunction wrap(protocols) {\n  // Default settings\n  var exports = {\n    maxRedirects: 21,\n    maxBodyLength: 10 * 1024 * 1024,\n  };\n\n  // Wrap each protocol\n  var nativeProtocols = {};\n  Object.keys(protocols).forEach(function (scheme) {\n    var protocol = scheme + \":\";\n    var nativeProtocol = nativeProtocols[protocol] = protocols[scheme];\n    var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol);\n\n    // Executes a request, following redirects\n    function request(input, options, callback) {\n      // Parse parameters\n      if (isString(input)) {\n        var parsed;\n        try {\n          parsed = urlToOptions(new URL(input));\n        }\n        catch (err) {\n          /* istanbul ignore next */\n          parsed = url.parse(input);\n        }\n        if (!isString(parsed.protocol)) {\n          throw new InvalidUrlError({ input });\n        }\n        input = parsed;\n      }\n      else if (URL && (input instanceof URL)) {\n        input = urlToOptions(input);\n      }\n      else {\n        callback = options;\n        options = input;\n        input = { protocol: protocol };\n      }\n      if (isFunction(options)) {\n        callback = options;\n        options = null;\n      }\n\n      // Set defaults\n      options = Object.assign({\n        maxRedirects: exports.maxRedirects,\n        maxBodyLength: exports.maxBodyLength,\n      }, input, options);\n      options.nativeProtocols = nativeProtocols;\n      if (!isString(options.host) && !isString(options.hostname)) {\n        options.hostname = \"::1\";\n      }\n\n      assert.equal(options.protocol, protocol, \"protocol mismatch\");\n      debug(\"options\", options);\n      return new RedirectableRequest(options, callback);\n    }\n\n    // Executes a GET request, following redirects\n    function get(input, options, callback) {\n      var wrappedRequest = wrappedProtocol.request(input, options, callback);\n      wrappedRequest.end();\n      return wrappedRequest;\n    }\n\n    // Expose the properties on the wrapped protocol\n    Object.defineProperties(wrappedProtocol, {\n      request: { value: request, configurable: true, enumerable: true, writable: true },\n      get: { value: get, configurable: true, enumerable: true, writable: true },\n    });\n  });\n  return exports;\n}\n\n/* istanbul ignore next */\nfunction noop() { /* empty */ }\n\n// from https://github.com/nodejs/node/blob/master/lib/internal/url.js\nfunction urlToOptions(urlObject) {\n  var options = {\n    protocol: urlObject.protocol,\n    hostname: urlObject.hostname.startsWith(\"[\") ?\n      /* istanbul ignore next */\n      urlObject.hostname.slice(1, -1) :\n      urlObject.hostname,\n    hash: urlObject.hash,\n    search: urlObject.search,\n    pathname: urlObject.pathname,\n    path: urlObject.pathname + urlObject.search,\n    href: urlObject.href,\n  };\n  if (urlObject.port !== \"\") {\n    options.port = Number(urlObject.port);\n  }\n  return options;\n}\n\nfunction removeMatchingHeaders(regex, headers) {\n  var lastValue;\n  for (var header in headers) {\n    if (regex.test(header)) {\n      lastValue = headers[header];\n      delete headers[header];\n    }\n  }\n  return (lastValue === null || typeof lastValue === \"undefined\") ?\n    undefined : String(lastValue).trim();\n}\n\nfunction createErrorType(code, message, baseClass) {\n  // Create constructor\n  function CustomError(properties) {\n    Error.captureStackTrace(this, this.constructor);\n    Object.assign(this, properties || {});\n    this.code = code;\n    this.message = this.cause ? message + \": \" + this.cause.message : message;\n  }\n\n  // Attach constructor and set default properties\n  CustomError.prototype = new (baseClass || Error)();\n  CustomError.prototype.constructor = CustomError;\n  CustomError.prototype.name = \"Error [\" + code + \"]\";\n  return CustomError;\n}\n\nfunction abortRequest(request) {\n  for (var event of events) {\n    request.removeListener(event, eventHandlers[event]);\n  }\n  request.on(\"error\", noop);\n  request.abort();\n}\n\nfunction isSubdomain(subdomain, domain) {\n  assert(isString(subdomain) && isString(domain));\n  var dot = subdomain.length - domain.length - 1;\n  return dot > 0 && subdomain[dot] === \".\" && subdomain.endsWith(domain);\n}\n\nfunction isString(value) {\n  return typeof value === \"string\" || value instanceof String;\n}\n\nfunction isFunction(value) {\n  return typeof value === \"function\";\n}\n\nfunction isBuffer(value) {\n  return typeof value === \"object\" && (\"length\" in value);\n}\n\n// Exports\nmodule.exports = wrap({ http: http, https: https });\nmodule.exports.wrap = wrap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/follow-redirects/package.json",
    "content": "{\n  \"name\": \"follow-redirects\",\n  \"version\": \"1.15.2\",\n  \"description\": \"HTTP and HTTPS modules that follow redirects.\",\n  \"license\": \"MIT\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"*.js\"\n  ],\n  \"engines\": {\n    \"node\": \">=4.0\"\n  },\n  \"scripts\": {\n    \"test\": \"npm run lint && npm run mocha\",\n    \"lint\": \"eslint *.js test\",\n    \"mocha\": \"nyc mocha\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:follow-redirects/follow-redirects.git\"\n  },\n  \"homepage\": \"https://github.com/follow-redirects/follow-redirects\",\n  \"bugs\": {\n    \"url\": \"https://github.com/follow-redirects/follow-redirects/issues\"\n  },\n  \"keywords\": [\n    \"http\",\n    \"https\",\n    \"url\",\n    \"redirect\",\n    \"client\",\n    \"location\",\n    \"utility\"\n  ],\n  \"author\": \"Ruben Verborgh <ruben@verborgh.org> (https://ruben.verborgh.org/)\",\n  \"contributors\": [\n    \"Olivier Lalonde <olalonde@gmail.com> (http://www.syskall.com)\",\n    \"James Talmage <james@talmage.io>\"\n  ],\n  \"funding\": [\n    {\n      \"type\": \"individual\",\n      \"url\": \"https://github.com/sponsors/RubenVerborgh\"\n    }\n  ],\n  \"peerDependenciesMeta\": {\n    \"debug\": {\n      \"optional\": true\n    }\n  },\n  \"devDependencies\": {\n    \"concat-stream\": \"^2.0.0\",\n    \"eslint\": \"^5.16.0\",\n    \"express\": \"^4.16.4\",\n    \"lolex\": \"^3.1.0\",\n    \"mocha\": \"^6.0.2\",\n    \"nyc\": \"^14.1.1\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/has-flag/index.d.ts",
    "content": "/**\nCheck if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag.\n\n@param flag - CLI flag to look for. The `--` prefix is optional.\n@param argv - CLI arguments. Default: `process.argv`.\n@returns Whether the flag exists.\n\n@example\n```\n// $ ts-node foo.ts -f --unicorn --foo=bar -- --rainbow\n\n// foo.ts\nimport hasFlag = require('has-flag');\n\nhasFlag('unicorn');\n//=> true\n\nhasFlag('--unicorn');\n//=> true\n\nhasFlag('f');\n//=> true\n\nhasFlag('-f');\n//=> true\n\nhasFlag('foo=bar');\n//=> true\n\nhasFlag('foo');\n//=> false\n\nhasFlag('rainbow');\n//=> false\n```\n*/\ndeclare function hasFlag(flag: string, argv?: string[]): boolean;\n\nexport = hasFlag;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/has-flag/index.js",
    "content": "'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/has-flag/license",
    "content": "MIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/has-flag/package.json",
    "content": "{\n\t\"name\": \"has-flag\",\n\t\"version\": \"4.0.0\",\n\t\"description\": \"Check if argv has a specific flag\",\n\t\"license\": \"MIT\",\n\t\"repository\": \"sindresorhus/has-flag\",\n\t\"author\": {\n\t\t\"name\": \"Sindre Sorhus\",\n\t\t\"email\": \"sindresorhus@gmail.com\",\n\t\t\"url\": \"sindresorhus.com\"\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=8\"\n\t},\n\t\"scripts\": {\n\t\t\"test\": \"xo && ava && tsd\"\n\t},\n\t\"files\": [\n\t\t\"index.js\",\n\t\t\"index.d.ts\"\n\t],\n\t\"keywords\": [\n\t\t\"has\",\n\t\t\"check\",\n\t\t\"detect\",\n\t\t\"contains\",\n\t\t\"find\",\n\t\t\"flag\",\n\t\t\"cli\",\n\t\t\"command-line\",\n\t\t\"argv\",\n\t\t\"process\",\n\t\t\"arg\",\n\t\t\"args\",\n\t\t\"argument\",\n\t\t\"arguments\",\n\t\t\"getopt\",\n\t\t\"minimist\",\n\t\t\"optimist\"\n\t],\n\t\"devDependencies\": {\n\t\t\"ava\": \"^1.4.1\",\n\t\t\"tsd\": \"^0.7.2\",\n\t\t\"xo\": \"^0.24.0\"\n\t}\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/has-flag/readme.md",
    "content": "# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag)\n\n> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag\n\nCorrectly stops looking after an `--` argument terminator.\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-has-flag?utm_source=npm-has-flag&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n\n---\n\n\n## Install\n\n```\n$ npm install has-flag\n```\n\n\n## Usage\n\n```js\n// foo.js\nconst hasFlag = require('has-flag');\n\nhasFlag('unicorn');\n//=> true\n\nhasFlag('--unicorn');\n//=> true\n\nhasFlag('f');\n//=> true\n\nhasFlag('-f');\n//=> true\n\nhasFlag('foo=bar');\n//=> true\n\nhasFlag('foo');\n//=> false\n\nhasFlag('rainbow');\n//=> false\n```\n\n```\n$ node foo.js -f --unicorn --foo=bar -- --rainbow\n```\n\n\n## API\n\n### hasFlag(flag, [argv])\n\nReturns a boolean for whether the flag exists.\n\n#### flag\n\nType: `string`\n\nCLI flag to look for. The `--` prefix is optional.\n\n#### argv\n\nType: `string[]`<br>\nDefault: `process.argv`\n\nCLI arguments.\n\n\n## Security\n\nTo report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.\n\n\n## License\n\nMIT © [Sindre Sorhus](https://sindresorhus.com)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/he/LICENSE-MIT.txt",
    "content": "Copyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/he/README.md",
    "content": "# he [![Build status](https://travis-ci.org/mathiasbynens/he.svg?branch=master)](https://travis-ci.org/mathiasbynens/he) [![Code coverage status](https://codecov.io/github/mathiasbynens/he/coverage.svg?branch=master)](https://codecov.io/github/mathiasbynens/he?branch=master) [![Dependency status](https://gemnasium.com/mathiasbynens/he.svg)](https://gemnasium.com/mathiasbynens/he)\n\n_he_ (for “HTML entities”) is a robust HTML entity encoder/decoder written in JavaScript. It supports [all standardized named character references as per HTML](https://html.spec.whatwg.org/multipage/syntax.html#named-character-references), handles [ambiguous ampersands](https://mathiasbynens.be/notes/ambiguous-ampersands) and other edge cases [just like a browser would](https://html.spec.whatwg.org/multipage/syntax.html#tokenizing-character-references), has an extensive test suite, and — contrary to many other JavaScript solutions — _he_ handles astral Unicode symbols just fine. [An online demo is available.](https://mothereff.in/html-entities)\n\n## Installation\n\nVia [npm](https://www.npmjs.com/):\n\n```bash\nnpm install he\n```\n\nVia [Bower](http://bower.io/):\n\n```bash\nbower install he\n```\n\nVia [Component](https://github.com/component/component):\n\n```bash\ncomponent install mathiasbynens/he\n```\n\nIn a browser:\n\n```html\n<script src=\"he.js\"></script>\n```\n\nIn [Node.js](https://nodejs.org/), [io.js](https://iojs.org/), [Narwhal](http://narwhaljs.org/), and [RingoJS](http://ringojs.org/):\n\n```js\nvar he = require('he');\n```\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('he.js');\n```\n\nUsing an AMD loader like [RequireJS](http://requirejs.org/):\n\n```js\nrequire(\n  {\n    'paths': {\n      'he': 'path/to/he'\n    }\n  },\n  ['he'],\n  function(he) {\n    console.log(he);\n  }\n);\n```\n\n## API\n\n### `he.version`\n\nA string representing the semantic version number.\n\n### `he.encode(text, options)`\n\nThis function takes a string of text and encodes (by default) any symbols that aren’t printable ASCII symbols and `&`, `<`, `>`, `\"`, `'`, and `` ` ``, replacing them with character references.\n\n```js\nhe.encode('foo © bar ≠ baz 𝌆 qux');\n// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'\n```\n\nAs long as the input string contains [allowed code points](https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream) only, the return value of this function is always valid HTML. Any [(invalid) code points that cannot be represented using a character reference](https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides) in the input are not encoded:\n\n```js\nhe.encode('foo \\0 bar');\n// → 'foo \\0 bar'\n```\n\nHowever, enabling [the `strict` option](https://github.com/mathiasbynens/he#strict) causes invalid code points to throw an exception. With `strict` enabled, `he.encode` either throws (if the input contains invalid code points) or returns a string of valid HTML.\n\nThe `options` object is optional. It recognizes the following properties:\n\n#### `useNamedReferences`\n\nThe default value for the `useNamedReferences` option is `false`. This means that `encode()` will not use any named character references (e.g. `&copy;`) in the output — hexadecimal escapes (e.g. `&#xA9;`) will be used instead. Set it to `true` to enable the use of named references.\n\n**Note that if compatibility with older browsers is a concern, this option should remain disabled.**\n\n```js\n// Using the global default setting (defaults to `false`):\nhe.encode('foo © bar ≠ baz 𝌆 qux');\n// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'\n\n// Passing an `options` object to `encode`, to explicitly disallow named references:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'useNamedReferences': false\n});\n// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'\n\n// Passing an `options` object to `encode`, to explicitly allow named references:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'useNamedReferences': true\n});\n// → 'foo &copy; bar &ne; baz &#x1D306; qux'\n```\n\n#### `decimal`\n\nThe default value for the `decimal` option is `false`. If the option is enabled, `encode` will generally use decimal escapes (e.g. `&#169;`) rather than hexadecimal escapes (e.g. `&#xA9;`). Beside of this replacement, the basic behavior remains the same when combined with other options. For example: if both options `useNamedReferences` and `decimal` are enabled, named references (e.g. `&copy;`) are used over decimal escapes. HTML entities without a named reference are encoded using decimal escapes.\n\n```js\n// Using the global default setting (defaults to `false`):\nhe.encode('foo © bar ≠ baz 𝌆 qux');\n// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'\n\n// Passing an `options` object to `encode`, to explicitly disable decimal escapes:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'decimal': false\n});\n// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'\n\n// Passing an `options` object to `encode`, to explicitly enable decimal escapes:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'decimal': true\n});\n// → 'foo &#169; bar &#8800; baz &#119558; qux'\n\n// Passing an `options` object to `encode`, to explicitly allow named references and decimal escapes:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'useNamedReferences': true,\n  'decimal': true\n});\n// → 'foo &copy; bar &ne; baz &#119558; qux'\n```\n\n#### `encodeEverything`\n\nThe default value for the `encodeEverything` option is `false`. This means that `encode()` will not use any character references for printable ASCII symbols that don’t need escaping. Set it to `true` to encode every symbol in the input string. When set to `true`, this option takes precedence over `allowUnsafeSymbols` (i.e. setting the latter to `true` in such a case has no effect).\n\n```js\n// Using the global default setting (defaults to `false`):\nhe.encode('foo © bar ≠ baz 𝌆 qux');\n// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'\n\n// Passing an `options` object to `encode`, to explicitly encode all symbols:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'encodeEverything': true\n});\n// → '&#x66;&#x6F;&#x6F;&#x20;&#xA9;&#x20;&#x62;&#x61;&#x72;&#x20;&#x2260;&#x20;&#x62;&#x61;&#x7A;&#x20;&#x1D306;&#x20;&#x71;&#x75;&#x78;'\n\n// This setting can be combined with the `useNamedReferences` option:\nhe.encode('foo © bar ≠ baz 𝌆 qux', {\n  'encodeEverything': true,\n  'useNamedReferences': true\n});\n// → '&#x66;&#x6F;&#x6F;&#x20;&copy;&#x20;&#x62;&#x61;&#x72;&#x20;&ne;&#x20;&#x62;&#x61;&#x7A;&#x20;&#x1D306;&#x20;&#x71;&#x75;&#x78;'\n```\n\n#### `strict`\n\nThe default value for the `strict` option is `false`. This means that `encode()` will encode any HTML text content you feed it, even if it contains any symbols that cause [parse errors](https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream). To throw an error when such invalid HTML is encountered, set the `strict` option to `true`. This option makes it possible to use _he_ as part of HTML parsers and HTML validators.\n\n```js\n// Using the global default setting (defaults to `false`, i.e. error-tolerant mode):\nhe.encode('\\x01');\n// → '&#x1;'\n\n// Passing an `options` object to `encode`, to explicitly enable error-tolerant mode:\nhe.encode('\\x01', {\n  'strict': false\n});\n// → '&#x1;'\n\n// Passing an `options` object to `encode`, to explicitly enable strict mode:\nhe.encode('\\x01', {\n  'strict': true\n});\n// → Parse error\n```\n\n#### `allowUnsafeSymbols`\n\nThe default value for the `allowUnsafeSymbols` option is `false`. This means that characters that are unsafe for use in HTML content (`&`, `<`, `>`, `\"`, `'`, and `` ` ``) will be encoded. When set to `true`, only non-ASCII characters will be encoded. If the `encodeEverything` option is set to `true`, this option will be ignored.\n\n```js\nhe.encode('foo © and & ampersand', {\n  'allowUnsafeSymbols': true\n});\n// → 'foo &#xA9; and & ampersand'\n```\n\n#### Overriding default `encode` options globally\n\nThe global default setting can be overridden by modifying the `he.encode.options` object. This saves you from passing in an `options` object for every call to `encode` if you want to use the non-default setting.\n\n```js\n// Read the global default setting:\nhe.encode.options.useNamedReferences;\n// → `false` by default\n\n// Override the global default setting:\nhe.encode.options.useNamedReferences = true;\n\n// Using the global default setting, which is now `true`:\nhe.encode('foo © bar ≠ baz 𝌆 qux');\n// → 'foo &copy; bar &ne; baz &#x1D306; qux'\n```\n\n### `he.decode(html, options)`\n\nThis function takes a string of HTML and decodes any named and numerical character references in it using [the algorithm described in section 12.2.4.69 of the HTML spec](https://html.spec.whatwg.org/multipage/syntax.html#tokenizing-character-references).\n\n```js\nhe.decode('foo &copy; bar &ne; baz &#x1D306; qux');\n// → 'foo © bar ≠ baz 𝌆 qux'\n```\n\nThe `options` object is optional. It recognizes the following properties:\n\n#### `isAttributeValue`\n\nThe default value for the `isAttributeValue` option is `false`. This means that `decode()` will decode the string as if it were used in [a text context in an HTML document](https://html.spec.whatwg.org/multipage/syntax.html#data-state). HTML has different rules for [parsing character references in attribute values](https://html.spec.whatwg.org/multipage/syntax.html#character-reference-in-attribute-value-state) — set this option to `true` to treat the input string as if it were used as an attribute value.\n\n```js\n// Using the global default setting (defaults to `false`, i.e. HTML text context):\nhe.decode('foo&ampbar');\n// → 'foo&bar'\n\n// Passing an `options` object to `decode`, to explicitly assume an HTML text context:\nhe.decode('foo&ampbar', {\n  'isAttributeValue': false\n});\n// → 'foo&bar'\n\n// Passing an `options` object to `decode`, to explicitly assume an HTML attribute value context:\nhe.decode('foo&ampbar', {\n  'isAttributeValue': true\n});\n// → 'foo&ampbar'\n```\n\n#### `strict`\n\nThe default value for the `strict` option is `false`. This means that `decode()` will decode any HTML text content you feed it, even if it contains any entities that cause [parse errors](https://html.spec.whatwg.org/multipage/syntax.html#tokenizing-character-references). To throw an error when such invalid HTML is encountered, set the `strict` option to `true`. This option makes it possible to use _he_ as part of HTML parsers and HTML validators.\n\n```js\n// Using the global default setting (defaults to `false`, i.e. error-tolerant mode):\nhe.decode('foo&ampbar');\n// → 'foo&bar'\n\n// Passing an `options` object to `decode`, to explicitly enable error-tolerant mode:\nhe.decode('foo&ampbar', {\n  'strict': false\n});\n// → 'foo&bar'\n\n// Passing an `options` object to `decode`, to explicitly enable strict mode:\nhe.decode('foo&ampbar', {\n  'strict': true\n});\n// → Parse error\n```\n\n#### Overriding default `decode` options globally\n\nThe global default settings for the `decode` function can be overridden by modifying the `he.decode.options` object. This saves you from passing in an `options` object for every call to `decode` if you want to use a non-default setting.\n\n```js\n// Read the global default setting:\nhe.decode.options.isAttributeValue;\n// → `false` by default\n\n// Override the global default setting:\nhe.decode.options.isAttributeValue = true;\n\n// Using the global default setting, which is now `true`:\nhe.decode('foo&ampbar');\n// → 'foo&ampbar'\n```\n\n### `he.escape(text)`\n\nThis function takes a string of text and escapes it for use in text contexts in XML or HTML documents. Only the following characters are escaped: `&`, `<`, `>`, `\"`, `'`, and `` ` ``.\n\n```js\nhe.escape('<img src=\\'x\\' onerror=\"prompt(1)\">');\n// → '&lt;img src=&#x27;x&#x27; onerror=&quot;prompt(1)&quot;&gt;'\n```\n\n### `he.unescape(html, options)`\n\n`he.unescape` is an alias for `he.decode`. It takes a string of HTML and decodes any named and numerical character references in it.\n\n### Using the `he` binary\n\nTo use the `he` binary in your shell, simply install _he_ globally using npm:\n\n```bash\nnpm install -g he\n```\n\nAfter that you will be able to encode/decode HTML entities from the command line:\n\n```bash\n$ he --encode 'föo ♥ bår 𝌆 baz'\nf&#xF6;o &#x2665; b&#xE5;r &#x1D306; baz\n\n$ he --encode --use-named-refs 'föo ♥ bår 𝌆 baz'\nf&ouml;o &hearts; b&aring;r &#x1D306; baz\n\n$ he --decode 'f&ouml;o &hearts; b&aring;r &#x1D306; baz'\nföo ♥ bår 𝌆 baz\n```\n\nRead a local text file, encode it for use in an HTML text context, and save the result to a new file:\n\n```bash\n$ he --encode < foo.txt > foo-escaped.html\n```\n\nOr do the same with an online text file:\n\n```bash\n$ curl -sL \"http://git.io/HnfEaw\" | he --encode > escaped.html\n```\n\nOr, the opposite — read a local file containing a snippet of HTML in a text context, decode it back to plain text, and save the result to a new file:\n\n```bash\n$ he --decode < foo-escaped.html > foo.txt\n```\n\nOr do the same with an online HTML snippet:\n\n```bash\n$ curl -sL \"http://git.io/HnfEaw\" | he --decode > decoded.txt\n```\n\nSee `he --help` for the full list of options.\n\n## Support\n\n_he_ has been tested in at least:\n\n* Chrome 27-50\n* Firefox 3-45\n* Safari 4-9\n* Opera 10-12, 15–37\n* IE 6–11\n* Edge\n* Narwhal 0.3.2\n* Node.js v0.10, v0.12, v4, v5\n* PhantomJS 1.9.0\n* Rhino 1.7RC4\n* RingoJS 0.8-0.11\n\n## Unit tests & code coverage\n\nAfter cloning this repository, run `npm install` to install the dependencies needed for he development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.\n\nOnce that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, and web browsers as well, use `grunt test`.\n\nTo generate the code coverage report, use `grunt cover`.\n\n## Acknowledgements\n\nThanks to [Simon Pieters](https://simon.html5.org/) ([@zcorpan](https://twitter.com/zcorpan)) for the many suggestions.\n\n## Author\n\n| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|\n| [Mathias Bynens](https://mathiasbynens.be/) |\n\n## License\n\n_he_ is available under the [MIT](https://mths.be/mit) license.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/he/bin/he",
    "content": "#!/usr/bin/env node\n(function() {\n\n\tvar fs = require('fs');\n\tvar he = require('../he.js');\n\tvar strings = process.argv.splice(2);\n\tvar stdin = process.stdin;\n\tvar data;\n\tvar timeout;\n\tvar action;\n\tvar options = {};\n\tvar log = console.log;\n\n\tvar main = function() {\n\t\tvar option = strings[0];\n\t\tvar count = 0;\n\n\t\tif (/^(?:-h|--help|undefined)$/.test(option)) {\n\t\t\tlog(\n\t\t\t\t'he v%s - https://mths.be/he',\n\t\t\t\the.version\n\t\t\t);\n\t\t\tlog([\n\t\t\t\t'\\nUsage:\\n',\n\t\t\t\t'\\the [--escape] string',\n\t\t\t\t'\\the [--encode] [--use-named-refs] [--everything] [--allow-unsafe] [--decimal] string',\n\t\t\t\t'\\the [--decode] [--attribute] [--strict] string',\n\t\t\t\t'\\the [-v | --version]',\n\t\t\t\t'\\the [-h | --help]',\n\t\t\t\t'\\nExamples:\\n',\n\t\t\t\t'\\the --escape \\\\<img\\\\ src\\\\=\\\\\\'x\\\\\\'\\\\ onerror\\\\=\\\\\"prompt\\\\(1\\\\)\\\\\"\\\\>',\n\t\t\t\t'\\techo \\'&copy; &#x1D306;\\' | he --decode'\n\t\t\t].join('\\n'));\n\t\t\treturn process.exit(option ? 0 : 1);\n\t\t}\n\n\t\tif (/^(?:-v|--version)$/.test(option)) {\n\t\t\tlog('v%s', he.version);\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tstrings.forEach(function(string) {\n\t\t\t// Process options\n\t\t\tif (string == '--escape') {\n\t\t\t\taction = 'escape';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--encode') {\n\t\t\t\taction = 'encode';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--use-named-refs') {\n\t\t\t\taction = 'encode';\n\t\t\t\toptions.useNamedReferences = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--everything') {\n\t\t\t\taction = 'encode';\n\t\t\t\toptions.encodeEverything = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--allow-unsafe') {\n\t\t\t\taction = 'encode';\n\t\t\t\toptions.allowUnsafeSymbols = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--decimal') {\n\t\t\t\taction = 'encode';\n\t\t\t\toptions.decimal = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--decode') {\n\t\t\t\taction = 'decode';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--attribute') {\n\t\t\t\taction = 'decode';\n\t\t\t\toptions.isAttributeValue = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (string == '--strict') {\n\t\t\t\taction = 'decode';\n\t\t\t\toptions.strict = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Process string(s)\n\t\t\tvar result;\n\t\t\tif (!action) {\n\t\t\t\tlog('Error: he requires at least one option and a string argument.');\n\t\t\t\tlog('Try `he --help` for more information.');\n\t\t\t\treturn process.exit(1);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tresult = he[action](string, options);\n\t\t\t\tlog(result);\n\t\t\t\tcount++;\n\t\t\t} catch(error) {\n\t\t\t\tlog(error.message + '\\n');\n\t\t\t\tlog('Error: failed to %s.', action);\n\t\t\t\tlog('If you think this is a bug in he, please report it:');\n\t\t\t\tlog('https://github.com/mathiasbynens/he/issues/new');\n\t\t\t\tlog(\n\t\t\t\t\t'\\nStack trace using he@%s:\\n',\n\t\t\t\t\the.version\n\t\t\t\t);\n\t\t\t\tlog(error.stack);\n\t\t\t\treturn process.exit(1);\n\t\t\t}\n\t\t});\n\t\tif (!count) {\n\t\t\tlog('Error: he requires a string argument.');\n\t\t\tlog('Try `he --help` for more information.');\n\t\t\treturn process.exit(1);\n\t\t}\n\t\t// Return with exit status 0 outside of the `forEach` loop, in case\n\t\t// multiple strings were passed in.\n\t\treturn process.exit(0);\n\t};\n\n\tif (stdin.isTTY) {\n\t\t// handle shell arguments\n\t\tmain();\n\t} else {\n\t\t// Either the script is called from within a non-TTY context, or `stdin`\n\t\t// content is being piped in.\n\t\tif (!process.stdout.isTTY) {\n\t\t\t// The script was called from a non-TTY context. This is a rather uncommon\n\t\t\t// use case we don’t actively support. However, we don’t want the script\n\t\t\t// to wait forever in such cases, so…\n\t\t\ttimeout = setTimeout(function() {\n\t\t\t\t// …if no piped data arrived after a whole minute, handle shell\n\t\t\t\t// arguments instead.\n\t\t\t\tmain();\n\t\t\t}, 60000);\n\t\t}\n\t\tdata = '';\n\t\tstdin.on('data', function(chunk) {\n\t\t\tclearTimeout(timeout);\n\t\t\tdata += chunk;\n\t\t});\n\t\tstdin.on('end', function() {\n\t\t\tstrings.push(data.trim());\n\t\t\tmain();\n\t\t});\n\t\tstdin.resume();\n\t}\n\n}());\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/he/he.js",
    "content": "/*! https://mths.be/he v1.2.0 by @mathias | MIT license */\n;(function(root) {\n\n\t// Detect free variables `exports`.\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`.\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`.\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t// All astral symbols.\n\tvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\t// All ASCII symbols (not just printable ASCII) except those listed in the\n\t// first column of the overrides table.\n\t// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides\n\tvar regexAsciiWhitelist = /[\\x01-\\x7F]/g;\n\t// All BMP symbols that are not ASCII newlines, printable ASCII symbols, or\n\t// code points listed in the first column of the overrides table on\n\t// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.\n\tvar regexBmpWhitelist = /[\\x01-\\t\\x0B\\f\\x0E-\\x1F\\x7F\\x81\\x8D\\x8F\\x90\\x9D\\xA0-\\uFFFF]/g;\n\n\tvar regexEncodeNonAscii = /<\\u20D2|=\\u20E5|>\\u20D2|\\u205F\\u200A|\\u219D\\u0338|\\u2202\\u0338|\\u2220\\u20D2|\\u2229\\uFE00|\\u222A\\uFE00|\\u223C\\u20D2|\\u223D\\u0331|\\u223E\\u0333|\\u2242\\u0338|\\u224B\\u0338|\\u224D\\u20D2|\\u224E\\u0338|\\u224F\\u0338|\\u2250\\u0338|\\u2261\\u20E5|\\u2264\\u20D2|\\u2265\\u20D2|\\u2266\\u0338|\\u2267\\u0338|\\u2268\\uFE00|\\u2269\\uFE00|\\u226A\\u0338|\\u226A\\u20D2|\\u226B\\u0338|\\u226B\\u20D2|\\u227F\\u0338|\\u2282\\u20D2|\\u2283\\u20D2|\\u228A\\uFE00|\\u228B\\uFE00|\\u228F\\u0338|\\u2290\\u0338|\\u2293\\uFE00|\\u2294\\uFE00|\\u22B4\\u20D2|\\u22B5\\u20D2|\\u22D8\\u0338|\\u22D9\\u0338|\\u22DA\\uFE00|\\u22DB\\uFE00|\\u22F5\\u0338|\\u22F9\\u0338|\\u2933\\u0338|\\u29CF\\u0338|\\u29D0\\u0338|\\u2A6D\\u0338|\\u2A70\\u0338|\\u2A7D\\u0338|\\u2A7E\\u0338|\\u2AA1\\u0338|\\u2AA2\\u0338|\\u2AAC\\uFE00|\\u2AAD\\uFE00|\\u2AAF\\u0338|\\u2AB0\\u0338|\\u2AC5\\u0338|\\u2AC6\\u0338|\\u2ACB\\uFE00|\\u2ACC\\uFE00|\\u2AFD\\u20E5|[\\xA0-\\u0113\\u0116-\\u0122\\u0124-\\u012B\\u012E-\\u014D\\u0150-\\u017E\\u0192\\u01B5\\u01F5\\u0237\\u02C6\\u02C7\\u02D8-\\u02DD\\u0311\\u0391-\\u03A1\\u03A3-\\u03A9\\u03B1-\\u03C9\\u03D1\\u03D2\\u03D5\\u03D6\\u03DC\\u03DD\\u03F0\\u03F1\\u03F5\\u03F6\\u0401-\\u040C\\u040E-\\u044F\\u0451-\\u045C\\u045E\\u045F\\u2002-\\u2005\\u2007-\\u2010\\u2013-\\u2016\\u2018-\\u201A\\u201C-\\u201E\\u2020-\\u2022\\u2025\\u2026\\u2030-\\u2035\\u2039\\u203A\\u203E\\u2041\\u2043\\u2044\\u204F\\u2057\\u205F-\\u2063\\u20AC\\u20DB\\u20DC\\u2102\\u2105\\u210A-\\u2113\\u2115-\\u211E\\u2122\\u2124\\u2127-\\u2129\\u212C\\u212D\\u212F-\\u2131\\u2133-\\u2138\\u2145-\\u2148\\u2153-\\u215E\\u2190-\\u219B\\u219D-\\u21A7\\u21A9-\\u21AE\\u21B0-\\u21B3\\u21B5-\\u21B7\\u21BA-\\u21DB\\u21DD\\u21E4\\u21E5\\u21F5\\u21FD-\\u2205\\u2207-\\u2209\\u220B\\u220C\\u220F-\\u2214\\u2216-\\u2218\\u221A\\u221D-\\u2238\\u223A-\\u2257\\u2259\\u225A\\u225C\\u225F-\\u2262\\u2264-\\u228B\\u228D-\\u229B\\u229D-\\u22A5\\u22A7-\\u22B0\\u22B2-\\u22BB\\u22BD-\\u22DB\\u22DE-\\u22E3\\u22E6-\\u22F7\\u22F9-\\u22FE\\u2305\\u2306\\u2308-\\u2310\\u2312\\u2313\\u2315\\u2316\\u231C-\\u231F\\u2322\\u2323\\u232D\\u232E\\u2336\\u233D\\u233F\\u237C\\u23B0\\u23B1\\u23B4-\\u23B6\\u23DC-\\u23DF\\u23E2\\u23E7\\u2423\\u24C8\\u2500\\u2502\\u250C\\u2510\\u2514\\u2518\\u251C\\u2524\\u252C\\u2534\\u253C\\u2550-\\u256C\\u2580\\u2584\\u2588\\u2591-\\u2593\\u25A1\\u25AA\\u25AB\\u25AD\\u25AE\\u25B1\\u25B3-\\u25B5\\u25B8\\u25B9\\u25BD-\\u25BF\\u25C2\\u25C3\\u25CA\\u25CB\\u25EC\\u25EF\\u25F8-\\u25FC\\u2605\\u2606\\u260E\\u2640\\u2642\\u2660\\u2663\\u2665\\u2666\\u266A\\u266D-\\u266F\\u2713\\u2717\\u2720\\u2736\\u2758\\u2772\\u2773\\u27C8\\u27C9\\u27E6-\\u27ED\\u27F5-\\u27FA\\u27FC\\u27FF\\u2902-\\u2905\\u290C-\\u2913\\u2916\\u2919-\\u2920\\u2923-\\u292A\\u2933\\u2935-\\u2939\\u293C\\u293D\\u2945\\u2948-\\u294B\\u294E-\\u2976\\u2978\\u2979\\u297B-\\u297F\\u2985\\u2986\\u298B-\\u2996\\u299A\\u299C\\u299D\\u29A4-\\u29B7\\u29B9\\u29BB\\u29BC\\u29BE-\\u29C5\\u29C9\\u29CD-\\u29D0\\u29DC-\\u29DE\\u29E3-\\u29E5\\u29EB\\u29F4\\u29F6\\u2A00-\\u2A02\\u2A04\\u2A06\\u2A0C\\u2A0D\\u2A10-\\u2A17\\u2A22-\\u2A27\\u2A29\\u2A2A\\u2A2D-\\u2A31\\u2A33-\\u2A3C\\u2A3F\\u2A40\\u2A42-\\u2A4D\\u2A50\\u2A53-\\u2A58\\u2A5A-\\u2A5D\\u2A5F\\u2A66\\u2A6A\\u2A6D-\\u2A75\\u2A77-\\u2A9A\\u2A9D-\\u2AA2\\u2AA4-\\u2AB0\\u2AB3-\\u2AC8\\u2ACB\\u2ACC\\u2ACF-\\u2ADB\\u2AE4\\u2AE6-\\u2AE9\\u2AEB-\\u2AF3\\u2AFD\\uFB00-\\uFB04]|\\uD835[\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDD6B]/g;\n\tvar encodeMap = {'\\xAD':'shy','\\u200C':'zwnj','\\u200D':'zwj','\\u200E':'lrm','\\u2063':'ic','\\u2062':'it','\\u2061':'af','\\u200F':'rlm','\\u200B':'ZeroWidthSpace','\\u2060':'NoBreak','\\u0311':'DownBreve','\\u20DB':'tdot','\\u20DC':'DotDot','\\t':'Tab','\\n':'NewLine','\\u2008':'puncsp','\\u205F':'MediumSpace','\\u2009':'thinsp','\\u200A':'hairsp','\\u2004':'emsp13','\\u2002':'ensp','\\u2005':'emsp14','\\u2003':'emsp','\\u2007':'numsp','\\xA0':'nbsp','\\u205F\\u200A':'ThickSpace','\\u203E':'oline','_':'lowbar','\\u2010':'dash','\\u2013':'ndash','\\u2014':'mdash','\\u2015':'horbar',',':'comma',';':'semi','\\u204F':'bsemi',':':'colon','\\u2A74':'Colone','!':'excl','\\xA1':'iexcl','?':'quest','\\xBF':'iquest','.':'period','\\u2025':'nldr','\\u2026':'mldr','\\xB7':'middot','\\'':'apos','\\u2018':'lsquo','\\u2019':'rsquo','\\u201A':'sbquo','\\u2039':'lsaquo','\\u203A':'rsaquo','\"':'quot','\\u201C':'ldquo','\\u201D':'rdquo','\\u201E':'bdquo','\\xAB':'laquo','\\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\\u2308':'lceil','\\u2309':'rceil','\\u230A':'lfloor','\\u230B':'rfloor','\\u2985':'lopar','\\u2986':'ropar','\\u298B':'lbrke','\\u298C':'rbrke','\\u298D':'lbrkslu','\\u298E':'rbrksld','\\u298F':'lbrksld','\\u2990':'rbrkslu','\\u2991':'langd','\\u2992':'rangd','\\u2993':'lparlt','\\u2994':'rpargt','\\u2995':'gtlPar','\\u2996':'ltrPar','\\u27E6':'lobrk','\\u27E7':'robrk','\\u27E8':'lang','\\u27E9':'rang','\\u27EA':'Lang','\\u27EB':'Rang','\\u27EC':'loang','\\u27ED':'roang','\\u2772':'lbbrk','\\u2773':'rbbrk','\\u2016':'Vert','\\xA7':'sect','\\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\\u2030':'permil','\\u2031':'pertenk','\\u2020':'dagger','\\u2021':'Dagger','\\u2022':'bull','\\u2043':'hybull','\\u2032':'prime','\\u2033':'Prime','\\u2034':'tprime','\\u2057':'qprime','\\u2035':'bprime','\\u2041':'caret','`':'grave','\\xB4':'acute','\\u02DC':'tilde','^':'Hat','\\xAF':'macr','\\u02D8':'breve','\\u02D9':'dot','\\xA8':'die','\\u02DA':'ring','\\u02DD':'dblac','\\xB8':'cedil','\\u02DB':'ogon','\\u02C6':'circ','\\u02C7':'caron','\\xB0':'deg','\\xA9':'copy','\\xAE':'reg','\\u2117':'copysr','\\u2118':'wp','\\u211E':'rx','\\u2127':'mho','\\u2129':'iiota','\\u2190':'larr','\\u219A':'nlarr','\\u2192':'rarr','\\u219B':'nrarr','\\u2191':'uarr','\\u2193':'darr','\\u2194':'harr','\\u21AE':'nharr','\\u2195':'varr','\\u2196':'nwarr','\\u2197':'nearr','\\u2198':'searr','\\u2199':'swarr','\\u219D':'rarrw','\\u219D\\u0338':'nrarrw','\\u219E':'Larr','\\u219F':'Uarr','\\u21A0':'Rarr','\\u21A1':'Darr','\\u21A2':'larrtl','\\u21A3':'rarrtl','\\u21A4':'mapstoleft','\\u21A5':'mapstoup','\\u21A6':'map','\\u21A7':'mapstodown','\\u21A9':'larrhk','\\u21AA':'rarrhk','\\u21AB':'larrlp','\\u21AC':'rarrlp','\\u21AD':'harrw','\\u21B0':'lsh','\\u21B1':'rsh','\\u21B2':'ldsh','\\u21B3':'rdsh','\\u21B5':'crarr','\\u21B6':'cularr','\\u21B7':'curarr','\\u21BA':'olarr','\\u21BB':'orarr','\\u21BC':'lharu','\\u21BD':'lhard','\\u21BE':'uharr','\\u21BF':'uharl','\\u21C0':'rharu','\\u21C1':'rhard','\\u21C2':'dharr','\\u21C3':'dharl','\\u21C4':'rlarr','\\u21C5':'udarr','\\u21C6':'lrarr','\\u21C7':'llarr','\\u21C8':'uuarr','\\u21C9':'rrarr','\\u21CA':'ddarr','\\u21CB':'lrhar','\\u21CC':'rlhar','\\u21D0':'lArr','\\u21CD':'nlArr','\\u21D1':'uArr','\\u21D2':'rArr','\\u21CF':'nrArr','\\u21D3':'dArr','\\u21D4':'iff','\\u21CE':'nhArr','\\u21D5':'vArr','\\u21D6':'nwArr','\\u21D7':'neArr','\\u21D8':'seArr','\\u21D9':'swArr','\\u21DA':'lAarr','\\u21DB':'rAarr','\\u21DD':'zigrarr','\\u21E4':'larrb','\\u21E5':'rarrb','\\u21F5':'duarr','\\u21FD':'loarr','\\u21FE':'roarr','\\u21FF':'hoarr','\\u2200':'forall','\\u2201':'comp','\\u2202':'part','\\u2202\\u0338':'npart','\\u2203':'exist','\\u2204':'nexist','\\u2205':'empty','\\u2207':'Del','\\u2208':'in','\\u2209':'notin','\\u220B':'ni','\\u220C':'notni','\\u03F6':'bepsi','\\u220F':'prod','\\u2210':'coprod','\\u2211':'sum','+':'plus','\\xB1':'pm','\\xF7':'div','\\xD7':'times','<':'lt','\\u226E':'nlt','<\\u20D2':'nvlt','=':'equals','\\u2260':'ne','=\\u20E5':'bne','\\u2A75':'Equal','>':'gt','\\u226F':'ngt','>\\u20D2':'nvgt','\\xAC':'not','|':'vert','\\xA6':'brvbar','\\u2212':'minus','\\u2213':'mp','\\u2214':'plusdo','\\u2044':'frasl','\\u2216':'setmn','\\u2217':'lowast','\\u2218':'compfn','\\u221A':'Sqrt','\\u221D':'prop','\\u221E':'infin','\\u221F':'angrt','\\u2220':'ang','\\u2220\\u20D2':'nang','\\u2221':'angmsd','\\u2222':'angsph','\\u2223':'mid','\\u2224':'nmid','\\u2225':'par','\\u2226':'npar','\\u2227':'and','\\u2228':'or','\\u2229':'cap','\\u2229\\uFE00':'caps','\\u222A':'cup','\\u222A\\uFE00':'cups','\\u222B':'int','\\u222C':'Int','\\u222D':'tint','\\u2A0C':'qint','\\u222E':'oint','\\u222F':'Conint','\\u2230':'Cconint','\\u2231':'cwint','\\u2232':'cwconint','\\u2233':'awconint','\\u2234':'there4','\\u2235':'becaus','\\u2236':'ratio','\\u2237':'Colon','\\u2238':'minusd','\\u223A':'mDDot','\\u223B':'homtht','\\u223C':'sim','\\u2241':'nsim','\\u223C\\u20D2':'nvsim','\\u223D':'bsim','\\u223D\\u0331':'race','\\u223E':'ac','\\u223E\\u0333':'acE','\\u223F':'acd','\\u2240':'wr','\\u2242':'esim','\\u2242\\u0338':'nesim','\\u2243':'sime','\\u2244':'nsime','\\u2245':'cong','\\u2247':'ncong','\\u2246':'simne','\\u2248':'ap','\\u2249':'nap','\\u224A':'ape','\\u224B':'apid','\\u224B\\u0338':'napid','\\u224C':'bcong','\\u224D':'CupCap','\\u226D':'NotCupCap','\\u224D\\u20D2':'nvap','\\u224E':'bump','\\u224E\\u0338':'nbump','\\u224F':'bumpe','\\u224F\\u0338':'nbumpe','\\u2250':'doteq','\\u2250\\u0338':'nedot','\\u2251':'eDot','\\u2252':'efDot','\\u2253':'erDot','\\u2254':'colone','\\u2255':'ecolon','\\u2256':'ecir','\\u2257':'cire','\\u2259':'wedgeq','\\u225A':'veeeq','\\u225C':'trie','\\u225F':'equest','\\u2261':'equiv','\\u2262':'nequiv','\\u2261\\u20E5':'bnequiv','\\u2264':'le','\\u2270':'nle','\\u2264\\u20D2':'nvle','\\u2265':'ge','\\u2271':'nge','\\u2265\\u20D2':'nvge','\\u2266':'lE','\\u2266\\u0338':'nlE','\\u2267':'gE','\\u2267\\u0338':'ngE','\\u2268\\uFE00':'lvnE','\\u2268':'lnE','\\u2269':'gnE','\\u2269\\uFE00':'gvnE','\\u226A':'ll','\\u226A\\u0338':'nLtv','\\u226A\\u20D2':'nLt','\\u226B':'gg','\\u226B\\u0338':'nGtv','\\u226B\\u20D2':'nGt','\\u226C':'twixt','\\u2272':'lsim','\\u2274':'nlsim','\\u2273':'gsim','\\u2275':'ngsim','\\u2276':'lg','\\u2278':'ntlg','\\u2277':'gl','\\u2279':'ntgl','\\u227A':'pr','\\u2280':'npr','\\u227B':'sc','\\u2281':'nsc','\\u227C':'prcue','\\u22E0':'nprcue','\\u227D':'sccue','\\u22E1':'nsccue','\\u227E':'prsim','\\u227F':'scsim','\\u227F\\u0338':'NotSucceedsTilde','\\u2282':'sub','\\u2284':'nsub','\\u2282\\u20D2':'vnsub','\\u2283':'sup','\\u2285':'nsup','\\u2283\\u20D2':'vnsup','\\u2286':'sube','\\u2288':'nsube','\\u2287':'supe','\\u2289':'nsupe','\\u228A\\uFE00':'vsubne','\\u228A':'subne','\\u228B\\uFE00':'vsupne','\\u228B':'supne','\\u228D':'cupdot','\\u228E':'uplus','\\u228F':'sqsub','\\u228F\\u0338':'NotSquareSubset','\\u2290':'sqsup','\\u2290\\u0338':'NotSquareSuperset','\\u2291':'sqsube','\\u22E2':'nsqsube','\\u2292':'sqsupe','\\u22E3':'nsqsupe','\\u2293':'sqcap','\\u2293\\uFE00':'sqcaps','\\u2294':'sqcup','\\u2294\\uFE00':'sqcups','\\u2295':'oplus','\\u2296':'ominus','\\u2297':'otimes','\\u2298':'osol','\\u2299':'odot','\\u229A':'ocir','\\u229B':'oast','\\u229D':'odash','\\u229E':'plusb','\\u229F':'minusb','\\u22A0':'timesb','\\u22A1':'sdotb','\\u22A2':'vdash','\\u22AC':'nvdash','\\u22A3':'dashv','\\u22A4':'top','\\u22A5':'bot','\\u22A7':'models','\\u22A8':'vDash','\\u22AD':'nvDash','\\u22A9':'Vdash','\\u22AE':'nVdash','\\u22AA':'Vvdash','\\u22AB':'VDash','\\u22AF':'nVDash','\\u22B0':'prurel','\\u22B2':'vltri','\\u22EA':'nltri','\\u22B3':'vrtri','\\u22EB':'nrtri','\\u22B4':'ltrie','\\u22EC':'nltrie','\\u22B4\\u20D2':'nvltrie','\\u22B5':'rtrie','\\u22ED':'nrtrie','\\u22B5\\u20D2':'nvrtrie','\\u22B6':'origof','\\u22B7':'imof','\\u22B8':'mumap','\\u22B9':'hercon','\\u22BA':'intcal','\\u22BB':'veebar','\\u22BD':'barvee','\\u22BE':'angrtvb','\\u22BF':'lrtri','\\u22C0':'Wedge','\\u22C1':'Vee','\\u22C2':'xcap','\\u22C3':'xcup','\\u22C4':'diam','\\u22C5':'sdot','\\u22C6':'Star','\\u22C7':'divonx','\\u22C8':'bowtie','\\u22C9':'ltimes','\\u22CA':'rtimes','\\u22CB':'lthree','\\u22CC':'rthree','\\u22CD':'bsime','\\u22CE':'cuvee','\\u22CF':'cuwed','\\u22D0':'Sub','\\u22D1':'Sup','\\u22D2':'Cap','\\u22D3':'Cup','\\u22D4':'fork','\\u22D5':'epar','\\u22D6':'ltdot','\\u22D7':'gtdot','\\u22D8':'Ll','\\u22D8\\u0338':'nLl','\\u22D9':'Gg','\\u22D9\\u0338':'nGg','\\u22DA\\uFE00':'lesg','\\u22DA':'leg','\\u22DB':'gel','\\u22DB\\uFE00':'gesl','\\u22DE':'cuepr','\\u22DF':'cuesc','\\u22E6':'lnsim','\\u22E7':'gnsim','\\u22E8':'prnsim','\\u22E9':'scnsim','\\u22EE':'vellip','\\u22EF':'ctdot','\\u22F0':'utdot','\\u22F1':'dtdot','\\u22F2':'disin','\\u22F3':'isinsv','\\u22F4':'isins','\\u22F5':'isindot','\\u22F5\\u0338':'notindot','\\u22F6':'notinvc','\\u22F7':'notinvb','\\u22F9':'isinE','\\u22F9\\u0338':'notinE','\\u22FA':'nisd','\\u22FB':'xnis','\\u22FC':'nis','\\u22FD':'notnivc','\\u22FE':'notnivb','\\u2305':'barwed','\\u2306':'Barwed','\\u230C':'drcrop','\\u230D':'dlcrop','\\u230E':'urcrop','\\u230F':'ulcrop','\\u2310':'bnot','\\u2312':'profline','\\u2313':'profsurf','\\u2315':'telrec','\\u2316':'target','\\u231C':'ulcorn','\\u231D':'urcorn','\\u231E':'dlcorn','\\u231F':'drcorn','\\u2322':'frown','\\u2323':'smile','\\u232D':'cylcty','\\u232E':'profalar','\\u2336':'topbot','\\u233D':'ovbar','\\u233F':'solbar','\\u237C':'angzarr','\\u23B0':'lmoust','\\u23B1':'rmoust','\\u23B4':'tbrk','\\u23B5':'bbrk','\\u23B6':'bbrktbrk','\\u23DC':'OverParenthesis','\\u23DD':'UnderParenthesis','\\u23DE':'OverBrace','\\u23DF':'UnderBrace','\\u23E2':'trpezium','\\u23E7':'elinters','\\u2423':'blank','\\u2500':'boxh','\\u2502':'boxv','\\u250C':'boxdr','\\u2510':'boxdl','\\u2514':'boxur','\\u2518':'boxul','\\u251C':'boxvr','\\u2524':'boxvl','\\u252C':'boxhd','\\u2534':'boxhu','\\u253C':'boxvh','\\u2550':'boxH','\\u2551':'boxV','\\u2552':'boxdR','\\u2553':'boxDr','\\u2554':'boxDR','\\u2555':'boxdL','\\u2556':'boxDl','\\u2557':'boxDL','\\u2558':'boxuR','\\u2559':'boxUr','\\u255A':'boxUR','\\u255B':'boxuL','\\u255C':'boxUl','\\u255D':'boxUL','\\u255E':'boxvR','\\u255F':'boxVr','\\u2560':'boxVR','\\u2561':'boxvL','\\u2562':'boxVl','\\u2563':'boxVL','\\u2564':'boxHd','\\u2565':'boxhD','\\u2566':'boxHD','\\u2567':'boxHu','\\u2568':'boxhU','\\u2569':'boxHU','\\u256A':'boxvH','\\u256B':'boxVh','\\u256C':'boxVH','\\u2580':'uhblk','\\u2584':'lhblk','\\u2588':'block','\\u2591':'blk14','\\u2592':'blk12','\\u2593':'blk34','\\u25A1':'squ','\\u25AA':'squf','\\u25AB':'EmptyVerySmallSquare','\\u25AD':'rect','\\u25AE':'marker','\\u25B1':'fltns','\\u25B3':'xutri','\\u25B4':'utrif','\\u25B5':'utri','\\u25B8':'rtrif','\\u25B9':'rtri','\\u25BD':'xdtri','\\u25BE':'dtrif','\\u25BF':'dtri','\\u25C2':'ltrif','\\u25C3':'ltri','\\u25CA':'loz','\\u25CB':'cir','\\u25EC':'tridot','\\u25EF':'xcirc','\\u25F8':'ultri','\\u25F9':'urtri','\\u25FA':'lltri','\\u25FB':'EmptySmallSquare','\\u25FC':'FilledSmallSquare','\\u2605':'starf','\\u2606':'star','\\u260E':'phone','\\u2640':'female','\\u2642':'male','\\u2660':'spades','\\u2663':'clubs','\\u2665':'hearts','\\u2666':'diams','\\u266A':'sung','\\u2713':'check','\\u2717':'cross','\\u2720':'malt','\\u2736':'sext','\\u2758':'VerticalSeparator','\\u27C8':'bsolhsub','\\u27C9':'suphsol','\\u27F5':'xlarr','\\u27F6':'xrarr','\\u27F7':'xharr','\\u27F8':'xlArr','\\u27F9':'xrArr','\\u27FA':'xhArr','\\u27FC':'xmap','\\u27FF':'dzigrarr','\\u2902':'nvlArr','\\u2903':'nvrArr','\\u2904':'nvHarr','\\u2905':'Map','\\u290C':'lbarr','\\u290D':'rbarr','\\u290E':'lBarr','\\u290F':'rBarr','\\u2910':'RBarr','\\u2911':'DDotrahd','\\u2912':'UpArrowBar','\\u2913':'DownArrowBar','\\u2916':'Rarrtl','\\u2919':'latail','\\u291A':'ratail','\\u291B':'lAtail','\\u291C':'rAtail','\\u291D':'larrfs','\\u291E':'rarrfs','\\u291F':'larrbfs','\\u2920':'rarrbfs','\\u2923':'nwarhk','\\u2924':'nearhk','\\u2925':'searhk','\\u2926':'swarhk','\\u2927':'nwnear','\\u2928':'toea','\\u2929':'tosa','\\u292A':'swnwar','\\u2933':'rarrc','\\u2933\\u0338':'nrarrc','\\u2935':'cudarrr','\\u2936':'ldca','\\u2937':'rdca','\\u2938':'cudarrl','\\u2939':'larrpl','\\u293C':'curarrm','\\u293D':'cularrp','\\u2945':'rarrpl','\\u2948':'harrcir','\\u2949':'Uarrocir','\\u294A':'lurdshar','\\u294B':'ldrushar','\\u294E':'LeftRightVector','\\u294F':'RightUpDownVector','\\u2950':'DownLeftRightVector','\\u2951':'LeftUpDownVector','\\u2952':'LeftVectorBar','\\u2953':'RightVectorBar','\\u2954':'RightUpVectorBar','\\u2955':'RightDownVectorBar','\\u2956':'DownLeftVectorBar','\\u2957':'DownRightVectorBar','\\u2958':'LeftUpVectorBar','\\u2959':'LeftDownVectorBar','\\u295A':'LeftTeeVector','\\u295B':'RightTeeVector','\\u295C':'RightUpTeeVector','\\u295D':'RightDownTeeVector','\\u295E':'DownLeftTeeVector','\\u295F':'DownRightTeeVector','\\u2960':'LeftUpTeeVector','\\u2961':'LeftDownTeeVector','\\u2962':'lHar','\\u2963':'uHar','\\u2964':'rHar','\\u2965':'dHar','\\u2966':'luruhar','\\u2967':'ldrdhar','\\u2968':'ruluhar','\\u2969':'rdldhar','\\u296A':'lharul','\\u296B':'llhard','\\u296C':'rharul','\\u296D':'lrhard','\\u296E':'udhar','\\u296F':'duhar','\\u2970':'RoundImplies','\\u2971':'erarr','\\u2972':'simrarr','\\u2973':'larrsim','\\u2974':'rarrsim','\\u2975':'rarrap','\\u2976':'ltlarr','\\u2978':'gtrarr','\\u2979':'subrarr','\\u297B':'suplarr','\\u297C':'lfisht','\\u297D':'rfisht','\\u297E':'ufisht','\\u297F':'dfisht','\\u299A':'vzigzag','\\u299C':'vangrt','\\u299D':'angrtvbd','\\u29A4':'ange','\\u29A5':'range','\\u29A6':'dwangle','\\u29A7':'uwangle','\\u29A8':'angmsdaa','\\u29A9':'angmsdab','\\u29AA':'angmsdac','\\u29AB':'angmsdad','\\u29AC':'angmsdae','\\u29AD':'angmsdaf','\\u29AE':'angmsdag','\\u29AF':'angmsdah','\\u29B0':'bemptyv','\\u29B1':'demptyv','\\u29B2':'cemptyv','\\u29B3':'raemptyv','\\u29B4':'laemptyv','\\u29B5':'ohbar','\\u29B6':'omid','\\u29B7':'opar','\\u29B9':'operp','\\u29BB':'olcross','\\u29BC':'odsold','\\u29BE':'olcir','\\u29BF':'ofcir','\\u29C0':'olt','\\u29C1':'ogt','\\u29C2':'cirscir','\\u29C3':'cirE','\\u29C4':'solb','\\u29C5':'bsolb','\\u29C9':'boxbox','\\u29CD':'trisb','\\u29CE':'rtriltri','\\u29CF':'LeftTriangleBar','\\u29CF\\u0338':'NotLeftTriangleBar','\\u29D0':'RightTriangleBar','\\u29D0\\u0338':'NotRightTriangleBar','\\u29DC':'iinfin','\\u29DD':'infintie','\\u29DE':'nvinfin','\\u29E3':'eparsl','\\u29E4':'smeparsl','\\u29E5':'eqvparsl','\\u29EB':'lozf','\\u29F4':'RuleDelayed','\\u29F6':'dsol','\\u2A00':'xodot','\\u2A01':'xoplus','\\u2A02':'xotime','\\u2A04':'xuplus','\\u2A06':'xsqcup','\\u2A0D':'fpartint','\\u2A10':'cirfnint','\\u2A11':'awint','\\u2A12':'rppolint','\\u2A13':'scpolint','\\u2A14':'npolint','\\u2A15':'pointint','\\u2A16':'quatint','\\u2A17':'intlarhk','\\u2A22':'pluscir','\\u2A23':'plusacir','\\u2A24':'simplus','\\u2A25':'plusdu','\\u2A26':'plussim','\\u2A27':'plustwo','\\u2A29':'mcomma','\\u2A2A':'minusdu','\\u2A2D':'loplus','\\u2A2E':'roplus','\\u2A2F':'Cross','\\u2A30':'timesd','\\u2A31':'timesbar','\\u2A33':'smashp','\\u2A34':'lotimes','\\u2A35':'rotimes','\\u2A36':'otimesas','\\u2A37':'Otimes','\\u2A38':'odiv','\\u2A39':'triplus','\\u2A3A':'triminus','\\u2A3B':'tritime','\\u2A3C':'iprod','\\u2A3F':'amalg','\\u2A40':'capdot','\\u2A42':'ncup','\\u2A43':'ncap','\\u2A44':'capand','\\u2A45':'cupor','\\u2A46':'cupcap','\\u2A47':'capcup','\\u2A48':'cupbrcap','\\u2A49':'capbrcup','\\u2A4A':'cupcup','\\u2A4B':'capcap','\\u2A4C':'ccups','\\u2A4D':'ccaps','\\u2A50':'ccupssm','\\u2A53':'And','\\u2A54':'Or','\\u2A55':'andand','\\u2A56':'oror','\\u2A57':'orslope','\\u2A58':'andslope','\\u2A5A':'andv','\\u2A5B':'orv','\\u2A5C':'andd','\\u2A5D':'ord','\\u2A5F':'wedbar','\\u2A66':'sdote','\\u2A6A':'simdot','\\u2A6D':'congdot','\\u2A6D\\u0338':'ncongdot','\\u2A6E':'easter','\\u2A6F':'apacir','\\u2A70':'apE','\\u2A70\\u0338':'napE','\\u2A71':'eplus','\\u2A72':'pluse','\\u2A73':'Esim','\\u2A77':'eDDot','\\u2A78':'equivDD','\\u2A79':'ltcir','\\u2A7A':'gtcir','\\u2A7B':'ltquest','\\u2A7C':'gtquest','\\u2A7D':'les','\\u2A7D\\u0338':'nles','\\u2A7E':'ges','\\u2A7E\\u0338':'nges','\\u2A7F':'lesdot','\\u2A80':'gesdot','\\u2A81':'lesdoto','\\u2A82':'gesdoto','\\u2A83':'lesdotor','\\u2A84':'gesdotol','\\u2A85':'lap','\\u2A86':'gap','\\u2A87':'lne','\\u2A88':'gne','\\u2A89':'lnap','\\u2A8A':'gnap','\\u2A8B':'lEg','\\u2A8C':'gEl','\\u2A8D':'lsime','\\u2A8E':'gsime','\\u2A8F':'lsimg','\\u2A90':'gsiml','\\u2A91':'lgE','\\u2A92':'glE','\\u2A93':'lesges','\\u2A94':'gesles','\\u2A95':'els','\\u2A96':'egs','\\u2A97':'elsdot','\\u2A98':'egsdot','\\u2A99':'el','\\u2A9A':'eg','\\u2A9D':'siml','\\u2A9E':'simg','\\u2A9F':'simlE','\\u2AA0':'simgE','\\u2AA1':'LessLess','\\u2AA1\\u0338':'NotNestedLessLess','\\u2AA2':'GreaterGreater','\\u2AA2\\u0338':'NotNestedGreaterGreater','\\u2AA4':'glj','\\u2AA5':'gla','\\u2AA6':'ltcc','\\u2AA7':'gtcc','\\u2AA8':'lescc','\\u2AA9':'gescc','\\u2AAA':'smt','\\u2AAB':'lat','\\u2AAC':'smte','\\u2AAC\\uFE00':'smtes','\\u2AAD':'late','\\u2AAD\\uFE00':'lates','\\u2AAE':'bumpE','\\u2AAF':'pre','\\u2AAF\\u0338':'npre','\\u2AB0':'sce','\\u2AB0\\u0338':'nsce','\\u2AB3':'prE','\\u2AB4':'scE','\\u2AB5':'prnE','\\u2AB6':'scnE','\\u2AB7':'prap','\\u2AB8':'scap','\\u2AB9':'prnap','\\u2ABA':'scnap','\\u2ABB':'Pr','\\u2ABC':'Sc','\\u2ABD':'subdot','\\u2ABE':'supdot','\\u2ABF':'subplus','\\u2AC0':'supplus','\\u2AC1':'submult','\\u2AC2':'supmult','\\u2AC3':'subedot','\\u2AC4':'supedot','\\u2AC5':'subE','\\u2AC5\\u0338':'nsubE','\\u2AC6':'supE','\\u2AC6\\u0338':'nsupE','\\u2AC7':'subsim','\\u2AC8':'supsim','\\u2ACB\\uFE00':'vsubnE','\\u2ACB':'subnE','\\u2ACC\\uFE00':'vsupnE','\\u2ACC':'supnE','\\u2ACF':'csub','\\u2AD0':'csup','\\u2AD1':'csube','\\u2AD2':'csupe','\\u2AD3':'subsup','\\u2AD4':'supsub','\\u2AD5':'subsub','\\u2AD6':'supsup','\\u2AD7':'suphsub','\\u2AD8':'supdsub','\\u2AD9':'forkv','\\u2ADA':'topfork','\\u2ADB':'mlcp','\\u2AE4':'Dashv','\\u2AE6':'Vdashl','\\u2AE7':'Barv','\\u2AE8':'vBar','\\u2AE9':'vBarv','\\u2AEB':'Vbar','\\u2AEC':'Not','\\u2AED':'bNot','\\u2AEE':'rnmid','\\u2AEF':'cirmid','\\u2AF0':'midcir','\\u2AF1':'topcir','\\u2AF2':'nhpar','\\u2AF3':'parsim','\\u2AFD':'parsl','\\u2AFD\\u20E5':'nparsl','\\u266D':'flat','\\u266E':'natur','\\u266F':'sharp','\\xA4':'curren','\\xA2':'cent','$':'dollar','\\xA3':'pound','\\xA5':'yen','\\u20AC':'euro','\\xB9':'sup1','\\xBD':'half','\\u2153':'frac13','\\xBC':'frac14','\\u2155':'frac15','\\u2159':'frac16','\\u215B':'frac18','\\xB2':'sup2','\\u2154':'frac23','\\u2156':'frac25','\\xB3':'sup3','\\xBE':'frac34','\\u2157':'frac35','\\u215C':'frac38','\\u2158':'frac45','\\u215A':'frac56','\\u215D':'frac58','\\u215E':'frac78','\\uD835\\uDCB6':'ascr','\\uD835\\uDD52':'aopf','\\uD835\\uDD1E':'afr','\\uD835\\uDD38':'Aopf','\\uD835\\uDD04':'Afr','\\uD835\\uDC9C':'Ascr','\\xAA':'ordf','\\xE1':'aacute','\\xC1':'Aacute','\\xE0':'agrave','\\xC0':'Agrave','\\u0103':'abreve','\\u0102':'Abreve','\\xE2':'acirc','\\xC2':'Acirc','\\xE5':'aring','\\xC5':'angst','\\xE4':'auml','\\xC4':'Auml','\\xE3':'atilde','\\xC3':'Atilde','\\u0105':'aogon','\\u0104':'Aogon','\\u0101':'amacr','\\u0100':'Amacr','\\xE6':'aelig','\\xC6':'AElig','\\uD835\\uDCB7':'bscr','\\uD835\\uDD53':'bopf','\\uD835\\uDD1F':'bfr','\\uD835\\uDD39':'Bopf','\\u212C':'Bscr','\\uD835\\uDD05':'Bfr','\\uD835\\uDD20':'cfr','\\uD835\\uDCB8':'cscr','\\uD835\\uDD54':'copf','\\u212D':'Cfr','\\uD835\\uDC9E':'Cscr','\\u2102':'Copf','\\u0107':'cacute','\\u0106':'Cacute','\\u0109':'ccirc','\\u0108':'Ccirc','\\u010D':'ccaron','\\u010C':'Ccaron','\\u010B':'cdot','\\u010A':'Cdot','\\xE7':'ccedil','\\xC7':'Ccedil','\\u2105':'incare','\\uD835\\uDD21':'dfr','\\u2146':'dd','\\uD835\\uDD55':'dopf','\\uD835\\uDCB9':'dscr','\\uD835\\uDC9F':'Dscr','\\uD835\\uDD07':'Dfr','\\u2145':'DD','\\uD835\\uDD3B':'Dopf','\\u010F':'dcaron','\\u010E':'Dcaron','\\u0111':'dstrok','\\u0110':'Dstrok','\\xF0':'eth','\\xD0':'ETH','\\u2147':'ee','\\u212F':'escr','\\uD835\\uDD22':'efr','\\uD835\\uDD56':'eopf','\\u2130':'Escr','\\uD835\\uDD08':'Efr','\\uD835\\uDD3C':'Eopf','\\xE9':'eacute','\\xC9':'Eacute','\\xE8':'egrave','\\xC8':'Egrave','\\xEA':'ecirc','\\xCA':'Ecirc','\\u011B':'ecaron','\\u011A':'Ecaron','\\xEB':'euml','\\xCB':'Euml','\\u0117':'edot','\\u0116':'Edot','\\u0119':'eogon','\\u0118':'Eogon','\\u0113':'emacr','\\u0112':'Emacr','\\uD835\\uDD23':'ffr','\\uD835\\uDD57':'fopf','\\uD835\\uDCBB':'fscr','\\uD835\\uDD09':'Ffr','\\uD835\\uDD3D':'Fopf','\\u2131':'Fscr','\\uFB00':'fflig','\\uFB03':'ffilig','\\uFB04':'ffllig','\\uFB01':'filig','fj':'fjlig','\\uFB02':'fllig','\\u0192':'fnof','\\u210A':'gscr','\\uD835\\uDD58':'gopf','\\uD835\\uDD24':'gfr','\\uD835\\uDCA2':'Gscr','\\uD835\\uDD3E':'Gopf','\\uD835\\uDD0A':'Gfr','\\u01F5':'gacute','\\u011F':'gbreve','\\u011E':'Gbreve','\\u011D':'gcirc','\\u011C':'Gcirc','\\u0121':'gdot','\\u0120':'Gdot','\\u0122':'Gcedil','\\uD835\\uDD25':'hfr','\\u210E':'planckh','\\uD835\\uDCBD':'hscr','\\uD835\\uDD59':'hopf','\\u210B':'Hscr','\\u210C':'Hfr','\\u210D':'Hopf','\\u0125':'hcirc','\\u0124':'Hcirc','\\u210F':'hbar','\\u0127':'hstrok','\\u0126':'Hstrok','\\uD835\\uDD5A':'iopf','\\uD835\\uDD26':'ifr','\\uD835\\uDCBE':'iscr','\\u2148':'ii','\\uD835\\uDD40':'Iopf','\\u2110':'Iscr','\\u2111':'Im','\\xED':'iacute','\\xCD':'Iacute','\\xEC':'igrave','\\xCC':'Igrave','\\xEE':'icirc','\\xCE':'Icirc','\\xEF':'iuml','\\xCF':'Iuml','\\u0129':'itilde','\\u0128':'Itilde','\\u0130':'Idot','\\u012F':'iogon','\\u012E':'Iogon','\\u012B':'imacr','\\u012A':'Imacr','\\u0133':'ijlig','\\u0132':'IJlig','\\u0131':'imath','\\uD835\\uDCBF':'jscr','\\uD835\\uDD5B':'jopf','\\uD835\\uDD27':'jfr','\\uD835\\uDCA5':'Jscr','\\uD835\\uDD0D':'Jfr','\\uD835\\uDD41':'Jopf','\\u0135':'jcirc','\\u0134':'Jcirc','\\u0237':'jmath','\\uD835\\uDD5C':'kopf','\\uD835\\uDCC0':'kscr','\\uD835\\uDD28':'kfr','\\uD835\\uDCA6':'Kscr','\\uD835\\uDD42':'Kopf','\\uD835\\uDD0E':'Kfr','\\u0137':'kcedil','\\u0136':'Kcedil','\\uD835\\uDD29':'lfr','\\uD835\\uDCC1':'lscr','\\u2113':'ell','\\uD835\\uDD5D':'lopf','\\u2112':'Lscr','\\uD835\\uDD0F':'Lfr','\\uD835\\uDD43':'Lopf','\\u013A':'lacute','\\u0139':'Lacute','\\u013E':'lcaron','\\u013D':'Lcaron','\\u013C':'lcedil','\\u013B':'Lcedil','\\u0142':'lstrok','\\u0141':'Lstrok','\\u0140':'lmidot','\\u013F':'Lmidot','\\uD835\\uDD2A':'mfr','\\uD835\\uDD5E':'mopf','\\uD835\\uDCC2':'mscr','\\uD835\\uDD10':'Mfr','\\uD835\\uDD44':'Mopf','\\u2133':'Mscr','\\uD835\\uDD2B':'nfr','\\uD835\\uDD5F':'nopf','\\uD835\\uDCC3':'nscr','\\u2115':'Nopf','\\uD835\\uDCA9':'Nscr','\\uD835\\uDD11':'Nfr','\\u0144':'nacute','\\u0143':'Nacute','\\u0148':'ncaron','\\u0147':'Ncaron','\\xF1':'ntilde','\\xD1':'Ntilde','\\u0146':'ncedil','\\u0145':'Ncedil','\\u2116':'numero','\\u014B':'eng','\\u014A':'ENG','\\uD835\\uDD60':'oopf','\\uD835\\uDD2C':'ofr','\\u2134':'oscr','\\uD835\\uDCAA':'Oscr','\\uD835\\uDD12':'Ofr','\\uD835\\uDD46':'Oopf','\\xBA':'ordm','\\xF3':'oacute','\\xD3':'Oacute','\\xF2':'ograve','\\xD2':'Ograve','\\xF4':'ocirc','\\xD4':'Ocirc','\\xF6':'ouml','\\xD6':'Ouml','\\u0151':'odblac','\\u0150':'Odblac','\\xF5':'otilde','\\xD5':'Otilde','\\xF8':'oslash','\\xD8':'Oslash','\\u014D':'omacr','\\u014C':'Omacr','\\u0153':'oelig','\\u0152':'OElig','\\uD835\\uDD2D':'pfr','\\uD835\\uDCC5':'pscr','\\uD835\\uDD61':'popf','\\u2119':'Popf','\\uD835\\uDD13':'Pfr','\\uD835\\uDCAB':'Pscr','\\uD835\\uDD62':'qopf','\\uD835\\uDD2E':'qfr','\\uD835\\uDCC6':'qscr','\\uD835\\uDCAC':'Qscr','\\uD835\\uDD14':'Qfr','\\u211A':'Qopf','\\u0138':'kgreen','\\uD835\\uDD2F':'rfr','\\uD835\\uDD63':'ropf','\\uD835\\uDCC7':'rscr','\\u211B':'Rscr','\\u211C':'Re','\\u211D':'Ropf','\\u0155':'racute','\\u0154':'Racute','\\u0159':'rcaron','\\u0158':'Rcaron','\\u0157':'rcedil','\\u0156':'Rcedil','\\uD835\\uDD64':'sopf','\\uD835\\uDCC8':'sscr','\\uD835\\uDD30':'sfr','\\uD835\\uDD4A':'Sopf','\\uD835\\uDD16':'Sfr','\\uD835\\uDCAE':'Sscr','\\u24C8':'oS','\\u015B':'sacute','\\u015A':'Sacute','\\u015D':'scirc','\\u015C':'Scirc','\\u0161':'scaron','\\u0160':'Scaron','\\u015F':'scedil','\\u015E':'Scedil','\\xDF':'szlig','\\uD835\\uDD31':'tfr','\\uD835\\uDCC9':'tscr','\\uD835\\uDD65':'topf','\\uD835\\uDCAF':'Tscr','\\uD835\\uDD17':'Tfr','\\uD835\\uDD4B':'Topf','\\u0165':'tcaron','\\u0164':'Tcaron','\\u0163':'tcedil','\\u0162':'Tcedil','\\u2122':'trade','\\u0167':'tstrok','\\u0166':'Tstrok','\\uD835\\uDCCA':'uscr','\\uD835\\uDD66':'uopf','\\uD835\\uDD32':'ufr','\\uD835\\uDD4C':'Uopf','\\uD835\\uDD18':'Ufr','\\uD835\\uDCB0':'Uscr','\\xFA':'uacute','\\xDA':'Uacute','\\xF9':'ugrave','\\xD9':'Ugrave','\\u016D':'ubreve','\\u016C':'Ubreve','\\xFB':'ucirc','\\xDB':'Ucirc','\\u016F':'uring','\\u016E':'Uring','\\xFC':'uuml','\\xDC':'Uuml','\\u0171':'udblac','\\u0170':'Udblac','\\u0169':'utilde','\\u0168':'Utilde','\\u0173':'uogon','\\u0172':'Uogon','\\u016B':'umacr','\\u016A':'Umacr','\\uD835\\uDD33':'vfr','\\uD835\\uDD67':'vopf','\\uD835\\uDCCB':'vscr','\\uD835\\uDD19':'Vfr','\\uD835\\uDD4D':'Vopf','\\uD835\\uDCB1':'Vscr','\\uD835\\uDD68':'wopf','\\uD835\\uDCCC':'wscr','\\uD835\\uDD34':'wfr','\\uD835\\uDCB2':'Wscr','\\uD835\\uDD4E':'Wopf','\\uD835\\uDD1A':'Wfr','\\u0175':'wcirc','\\u0174':'Wcirc','\\uD835\\uDD35':'xfr','\\uD835\\uDCCD':'xscr','\\uD835\\uDD69':'xopf','\\uD835\\uDD4F':'Xopf','\\uD835\\uDD1B':'Xfr','\\uD835\\uDCB3':'Xscr','\\uD835\\uDD36':'yfr','\\uD835\\uDCCE':'yscr','\\uD835\\uDD6A':'yopf','\\uD835\\uDCB4':'Yscr','\\uD835\\uDD1C':'Yfr','\\uD835\\uDD50':'Yopf','\\xFD':'yacute','\\xDD':'Yacute','\\u0177':'ycirc','\\u0176':'Ycirc','\\xFF':'yuml','\\u0178':'Yuml','\\uD835\\uDCCF':'zscr','\\uD835\\uDD37':'zfr','\\uD835\\uDD6B':'zopf','\\u2128':'Zfr','\\u2124':'Zopf','\\uD835\\uDCB5':'Zscr','\\u017A':'zacute','\\u0179':'Zacute','\\u017E':'zcaron','\\u017D':'Zcaron','\\u017C':'zdot','\\u017B':'Zdot','\\u01B5':'imped','\\xFE':'thorn','\\xDE':'THORN','\\u0149':'napos','\\u03B1':'alpha','\\u0391':'Alpha','\\u03B2':'beta','\\u0392':'Beta','\\u03B3':'gamma','\\u0393':'Gamma','\\u03B4':'delta','\\u0394':'Delta','\\u03B5':'epsi','\\u03F5':'epsiv','\\u0395':'Epsilon','\\u03DD':'gammad','\\u03DC':'Gammad','\\u03B6':'zeta','\\u0396':'Zeta','\\u03B7':'eta','\\u0397':'Eta','\\u03B8':'theta','\\u03D1':'thetav','\\u0398':'Theta','\\u03B9':'iota','\\u0399':'Iota','\\u03BA':'kappa','\\u03F0':'kappav','\\u039A':'Kappa','\\u03BB':'lambda','\\u039B':'Lambda','\\u03BC':'mu','\\xB5':'micro','\\u039C':'Mu','\\u03BD':'nu','\\u039D':'Nu','\\u03BE':'xi','\\u039E':'Xi','\\u03BF':'omicron','\\u039F':'Omicron','\\u03C0':'pi','\\u03D6':'piv','\\u03A0':'Pi','\\u03C1':'rho','\\u03F1':'rhov','\\u03A1':'Rho','\\u03C3':'sigma','\\u03A3':'Sigma','\\u03C2':'sigmaf','\\u03C4':'tau','\\u03A4':'Tau','\\u03C5':'upsi','\\u03A5':'Upsilon','\\u03D2':'Upsi','\\u03C6':'phi','\\u03D5':'phiv','\\u03A6':'Phi','\\u03C7':'chi','\\u03A7':'Chi','\\u03C8':'psi','\\u03A8':'Psi','\\u03C9':'omega','\\u03A9':'ohm','\\u0430':'acy','\\u0410':'Acy','\\u0431':'bcy','\\u0411':'Bcy','\\u0432':'vcy','\\u0412':'Vcy','\\u0433':'gcy','\\u0413':'Gcy','\\u0453':'gjcy','\\u0403':'GJcy','\\u0434':'dcy','\\u0414':'Dcy','\\u0452':'djcy','\\u0402':'DJcy','\\u0435':'iecy','\\u0415':'IEcy','\\u0451':'iocy','\\u0401':'IOcy','\\u0454':'jukcy','\\u0404':'Jukcy','\\u0436':'zhcy','\\u0416':'ZHcy','\\u0437':'zcy','\\u0417':'Zcy','\\u0455':'dscy','\\u0405':'DScy','\\u0438':'icy','\\u0418':'Icy','\\u0456':'iukcy','\\u0406':'Iukcy','\\u0457':'yicy','\\u0407':'YIcy','\\u0439':'jcy','\\u0419':'Jcy','\\u0458':'jsercy','\\u0408':'Jsercy','\\u043A':'kcy','\\u041A':'Kcy','\\u045C':'kjcy','\\u040C':'KJcy','\\u043B':'lcy','\\u041B':'Lcy','\\u0459':'ljcy','\\u0409':'LJcy','\\u043C':'mcy','\\u041C':'Mcy','\\u043D':'ncy','\\u041D':'Ncy','\\u045A':'njcy','\\u040A':'NJcy','\\u043E':'ocy','\\u041E':'Ocy','\\u043F':'pcy','\\u041F':'Pcy','\\u0440':'rcy','\\u0420':'Rcy','\\u0441':'scy','\\u0421':'Scy','\\u0442':'tcy','\\u0422':'Tcy','\\u045B':'tshcy','\\u040B':'TSHcy','\\u0443':'ucy','\\u0423':'Ucy','\\u045E':'ubrcy','\\u040E':'Ubrcy','\\u0444':'fcy','\\u0424':'Fcy','\\u0445':'khcy','\\u0425':'KHcy','\\u0446':'tscy','\\u0426':'TScy','\\u0447':'chcy','\\u0427':'CHcy','\\u045F':'dzcy','\\u040F':'DZcy','\\u0448':'shcy','\\u0428':'SHcy','\\u0449':'shchcy','\\u0429':'SHCHcy','\\u044A':'hardcy','\\u042A':'HARDcy','\\u044B':'ycy','\\u042B':'Ycy','\\u044C':'softcy','\\u042C':'SOFTcy','\\u044D':'ecy','\\u042D':'Ecy','\\u044E':'yucy','\\u042E':'YUcy','\\u044F':'yacy','\\u042F':'YAcy','\\u2135':'aleph','\\u2136':'beth','\\u2137':'gimel','\\u2138':'daleth'};\n\n\tvar regexEscape = /[\"&'<>`]/g;\n\tvar escapeMap = {\n\t\t'\"': '&quot;',\n\t\t'&': '&amp;',\n\t\t'\\'': '&#x27;',\n\t\t'<': '&lt;',\n\t\t// See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the\n\t\t// following is not strictly necessary unless it’s part of a tag or an\n\t\t// unquoted attribute value. We’re only escaping it to support those\n\t\t// situations, and for XML support.\n\t\t'>': '&gt;',\n\t\t// In Internet Explorer ≤ 8, the backtick character can be used\n\t\t// to break out of (un)quoted attribute values or HTML comments.\n\t\t// See http://html5sec.org/#102, http://html5sec.org/#108, and\n\t\t// http://html5sec.org/#133.\n\t\t'`': '&#x60;'\n\t};\n\n\tvar regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;\n\tvar regexInvalidRawCodePoint = /[\\0-\\x08\\x0B\\x0E-\\x1F\\x7F-\\x9F\\uFDD0-\\uFDEF\\uFFFE\\uFFFF]|[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n\tvar regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g;\n\tvar decodeMap = {'aacute':'\\xE1','Aacute':'\\xC1','abreve':'\\u0103','Abreve':'\\u0102','ac':'\\u223E','acd':'\\u223F','acE':'\\u223E\\u0333','acirc':'\\xE2','Acirc':'\\xC2','acute':'\\xB4','acy':'\\u0430','Acy':'\\u0410','aelig':'\\xE6','AElig':'\\xC6','af':'\\u2061','afr':'\\uD835\\uDD1E','Afr':'\\uD835\\uDD04','agrave':'\\xE0','Agrave':'\\xC0','alefsym':'\\u2135','aleph':'\\u2135','alpha':'\\u03B1','Alpha':'\\u0391','amacr':'\\u0101','Amacr':'\\u0100','amalg':'\\u2A3F','amp':'&','AMP':'&','and':'\\u2227','And':'\\u2A53','andand':'\\u2A55','andd':'\\u2A5C','andslope':'\\u2A58','andv':'\\u2A5A','ang':'\\u2220','ange':'\\u29A4','angle':'\\u2220','angmsd':'\\u2221','angmsdaa':'\\u29A8','angmsdab':'\\u29A9','angmsdac':'\\u29AA','angmsdad':'\\u29AB','angmsdae':'\\u29AC','angmsdaf':'\\u29AD','angmsdag':'\\u29AE','angmsdah':'\\u29AF','angrt':'\\u221F','angrtvb':'\\u22BE','angrtvbd':'\\u299D','angsph':'\\u2222','angst':'\\xC5','angzarr':'\\u237C','aogon':'\\u0105','Aogon':'\\u0104','aopf':'\\uD835\\uDD52','Aopf':'\\uD835\\uDD38','ap':'\\u2248','apacir':'\\u2A6F','ape':'\\u224A','apE':'\\u2A70','apid':'\\u224B','apos':'\\'','ApplyFunction':'\\u2061','approx':'\\u2248','approxeq':'\\u224A','aring':'\\xE5','Aring':'\\xC5','ascr':'\\uD835\\uDCB6','Ascr':'\\uD835\\uDC9C','Assign':'\\u2254','ast':'*','asymp':'\\u2248','asympeq':'\\u224D','atilde':'\\xE3','Atilde':'\\xC3','auml':'\\xE4','Auml':'\\xC4','awconint':'\\u2233','awint':'\\u2A11','backcong':'\\u224C','backepsilon':'\\u03F6','backprime':'\\u2035','backsim':'\\u223D','backsimeq':'\\u22CD','Backslash':'\\u2216','Barv':'\\u2AE7','barvee':'\\u22BD','barwed':'\\u2305','Barwed':'\\u2306','barwedge':'\\u2305','bbrk':'\\u23B5','bbrktbrk':'\\u23B6','bcong':'\\u224C','bcy':'\\u0431','Bcy':'\\u0411','bdquo':'\\u201E','becaus':'\\u2235','because':'\\u2235','Because':'\\u2235','bemptyv':'\\u29B0','bepsi':'\\u03F6','bernou':'\\u212C','Bernoullis':'\\u212C','beta':'\\u03B2','Beta':'\\u0392','beth':'\\u2136','between':'\\u226C','bfr':'\\uD835\\uDD1F','Bfr':'\\uD835\\uDD05','bigcap':'\\u22C2','bigcirc':'\\u25EF','bigcup':'\\u22C3','bigodot':'\\u2A00','bigoplus':'\\u2A01','bigotimes':'\\u2A02','bigsqcup':'\\u2A06','bigstar':'\\u2605','bigtriangledown':'\\u25BD','bigtriangleup':'\\u25B3','biguplus':'\\u2A04','bigvee':'\\u22C1','bigwedge':'\\u22C0','bkarow':'\\u290D','blacklozenge':'\\u29EB','blacksquare':'\\u25AA','blacktriangle':'\\u25B4','blacktriangledown':'\\u25BE','blacktriangleleft':'\\u25C2','blacktriangleright':'\\u25B8','blank':'\\u2423','blk12':'\\u2592','blk14':'\\u2591','blk34':'\\u2593','block':'\\u2588','bne':'=\\u20E5','bnequiv':'\\u2261\\u20E5','bnot':'\\u2310','bNot':'\\u2AED','bopf':'\\uD835\\uDD53','Bopf':'\\uD835\\uDD39','bot':'\\u22A5','bottom':'\\u22A5','bowtie':'\\u22C8','boxbox':'\\u29C9','boxdl':'\\u2510','boxdL':'\\u2555','boxDl':'\\u2556','boxDL':'\\u2557','boxdr':'\\u250C','boxdR':'\\u2552','boxDr':'\\u2553','boxDR':'\\u2554','boxh':'\\u2500','boxH':'\\u2550','boxhd':'\\u252C','boxhD':'\\u2565','boxHd':'\\u2564','boxHD':'\\u2566','boxhu':'\\u2534','boxhU':'\\u2568','boxHu':'\\u2567','boxHU':'\\u2569','boxminus':'\\u229F','boxplus':'\\u229E','boxtimes':'\\u22A0','boxul':'\\u2518','boxuL':'\\u255B','boxUl':'\\u255C','boxUL':'\\u255D','boxur':'\\u2514','boxuR':'\\u2558','boxUr':'\\u2559','boxUR':'\\u255A','boxv':'\\u2502','boxV':'\\u2551','boxvh':'\\u253C','boxvH':'\\u256A','boxVh':'\\u256B','boxVH':'\\u256C','boxvl':'\\u2524','boxvL':'\\u2561','boxVl':'\\u2562','boxVL':'\\u2563','boxvr':'\\u251C','boxvR':'\\u255E','boxVr':'\\u255F','boxVR':'\\u2560','bprime':'\\u2035','breve':'\\u02D8','Breve':'\\u02D8','brvbar':'\\xA6','bscr':'\\uD835\\uDCB7','Bscr':'\\u212C','bsemi':'\\u204F','bsim':'\\u223D','bsime':'\\u22CD','bsol':'\\\\','bsolb':'\\u29C5','bsolhsub':'\\u27C8','bull':'\\u2022','bullet':'\\u2022','bump':'\\u224E','bumpe':'\\u224F','bumpE':'\\u2AAE','bumpeq':'\\u224F','Bumpeq':'\\u224E','cacute':'\\u0107','Cacute':'\\u0106','cap':'\\u2229','Cap':'\\u22D2','capand':'\\u2A44','capbrcup':'\\u2A49','capcap':'\\u2A4B','capcup':'\\u2A47','capdot':'\\u2A40','CapitalDifferentialD':'\\u2145','caps':'\\u2229\\uFE00','caret':'\\u2041','caron':'\\u02C7','Cayleys':'\\u212D','ccaps':'\\u2A4D','ccaron':'\\u010D','Ccaron':'\\u010C','ccedil':'\\xE7','Ccedil':'\\xC7','ccirc':'\\u0109','Ccirc':'\\u0108','Cconint':'\\u2230','ccups':'\\u2A4C','ccupssm':'\\u2A50','cdot':'\\u010B','Cdot':'\\u010A','cedil':'\\xB8','Cedilla':'\\xB8','cemptyv':'\\u29B2','cent':'\\xA2','centerdot':'\\xB7','CenterDot':'\\xB7','cfr':'\\uD835\\uDD20','Cfr':'\\u212D','chcy':'\\u0447','CHcy':'\\u0427','check':'\\u2713','checkmark':'\\u2713','chi':'\\u03C7','Chi':'\\u03A7','cir':'\\u25CB','circ':'\\u02C6','circeq':'\\u2257','circlearrowleft':'\\u21BA','circlearrowright':'\\u21BB','circledast':'\\u229B','circledcirc':'\\u229A','circleddash':'\\u229D','CircleDot':'\\u2299','circledR':'\\xAE','circledS':'\\u24C8','CircleMinus':'\\u2296','CirclePlus':'\\u2295','CircleTimes':'\\u2297','cire':'\\u2257','cirE':'\\u29C3','cirfnint':'\\u2A10','cirmid':'\\u2AEF','cirscir':'\\u29C2','ClockwiseContourIntegral':'\\u2232','CloseCurlyDoubleQuote':'\\u201D','CloseCurlyQuote':'\\u2019','clubs':'\\u2663','clubsuit':'\\u2663','colon':':','Colon':'\\u2237','colone':'\\u2254','Colone':'\\u2A74','coloneq':'\\u2254','comma':',','commat':'@','comp':'\\u2201','compfn':'\\u2218','complement':'\\u2201','complexes':'\\u2102','cong':'\\u2245','congdot':'\\u2A6D','Congruent':'\\u2261','conint':'\\u222E','Conint':'\\u222F','ContourIntegral':'\\u222E','copf':'\\uD835\\uDD54','Copf':'\\u2102','coprod':'\\u2210','Coproduct':'\\u2210','copy':'\\xA9','COPY':'\\xA9','copysr':'\\u2117','CounterClockwiseContourIntegral':'\\u2233','crarr':'\\u21B5','cross':'\\u2717','Cross':'\\u2A2F','cscr':'\\uD835\\uDCB8','Cscr':'\\uD835\\uDC9E','csub':'\\u2ACF','csube':'\\u2AD1','csup':'\\u2AD0','csupe':'\\u2AD2','ctdot':'\\u22EF','cudarrl':'\\u2938','cudarrr':'\\u2935','cuepr':'\\u22DE','cuesc':'\\u22DF','cularr':'\\u21B6','cularrp':'\\u293D','cup':'\\u222A','Cup':'\\u22D3','cupbrcap':'\\u2A48','cupcap':'\\u2A46','CupCap':'\\u224D','cupcup':'\\u2A4A','cupdot':'\\u228D','cupor':'\\u2A45','cups':'\\u222A\\uFE00','curarr':'\\u21B7','curarrm':'\\u293C','curlyeqprec':'\\u22DE','curlyeqsucc':'\\u22DF','curlyvee':'\\u22CE','curlywedge':'\\u22CF','curren':'\\xA4','curvearrowleft':'\\u21B6','curvearrowright':'\\u21B7','cuvee':'\\u22CE','cuwed':'\\u22CF','cwconint':'\\u2232','cwint':'\\u2231','cylcty':'\\u232D','dagger':'\\u2020','Dagger':'\\u2021','daleth':'\\u2138','darr':'\\u2193','dArr':'\\u21D3','Darr':'\\u21A1','dash':'\\u2010','dashv':'\\u22A3','Dashv':'\\u2AE4','dbkarow':'\\u290F','dblac':'\\u02DD','dcaron':'\\u010F','Dcaron':'\\u010E','dcy':'\\u0434','Dcy':'\\u0414','dd':'\\u2146','DD':'\\u2145','ddagger':'\\u2021','ddarr':'\\u21CA','DDotrahd':'\\u2911','ddotseq':'\\u2A77','deg':'\\xB0','Del':'\\u2207','delta':'\\u03B4','Delta':'\\u0394','demptyv':'\\u29B1','dfisht':'\\u297F','dfr':'\\uD835\\uDD21','Dfr':'\\uD835\\uDD07','dHar':'\\u2965','dharl':'\\u21C3','dharr':'\\u21C2','DiacriticalAcute':'\\xB4','DiacriticalDot':'\\u02D9','DiacriticalDoubleAcute':'\\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\\u02DC','diam':'\\u22C4','diamond':'\\u22C4','Diamond':'\\u22C4','diamondsuit':'\\u2666','diams':'\\u2666','die':'\\xA8','DifferentialD':'\\u2146','digamma':'\\u03DD','disin':'\\u22F2','div':'\\xF7','divide':'\\xF7','divideontimes':'\\u22C7','divonx':'\\u22C7','djcy':'\\u0452','DJcy':'\\u0402','dlcorn':'\\u231E','dlcrop':'\\u230D','dollar':'$','dopf':'\\uD835\\uDD55','Dopf':'\\uD835\\uDD3B','dot':'\\u02D9','Dot':'\\xA8','DotDot':'\\u20DC','doteq':'\\u2250','doteqdot':'\\u2251','DotEqual':'\\u2250','dotminus':'\\u2238','dotplus':'\\u2214','dotsquare':'\\u22A1','doublebarwedge':'\\u2306','DoubleContourIntegral':'\\u222F','DoubleDot':'\\xA8','DoubleDownArrow':'\\u21D3','DoubleLeftArrow':'\\u21D0','DoubleLeftRightArrow':'\\u21D4','DoubleLeftTee':'\\u2AE4','DoubleLongLeftArrow':'\\u27F8','DoubleLongLeftRightArrow':'\\u27FA','DoubleLongRightArrow':'\\u27F9','DoubleRightArrow':'\\u21D2','DoubleRightTee':'\\u22A8','DoubleUpArrow':'\\u21D1','DoubleUpDownArrow':'\\u21D5','DoubleVerticalBar':'\\u2225','downarrow':'\\u2193','Downarrow':'\\u21D3','DownArrow':'\\u2193','DownArrowBar':'\\u2913','DownArrowUpArrow':'\\u21F5','DownBreve':'\\u0311','downdownarrows':'\\u21CA','downharpoonleft':'\\u21C3','downharpoonright':'\\u21C2','DownLeftRightVector':'\\u2950','DownLeftTeeVector':'\\u295E','DownLeftVector':'\\u21BD','DownLeftVectorBar':'\\u2956','DownRightTeeVector':'\\u295F','DownRightVector':'\\u21C1','DownRightVectorBar':'\\u2957','DownTee':'\\u22A4','DownTeeArrow':'\\u21A7','drbkarow':'\\u2910','drcorn':'\\u231F','drcrop':'\\u230C','dscr':'\\uD835\\uDCB9','Dscr':'\\uD835\\uDC9F','dscy':'\\u0455','DScy':'\\u0405','dsol':'\\u29F6','dstrok':'\\u0111','Dstrok':'\\u0110','dtdot':'\\u22F1','dtri':'\\u25BF','dtrif':'\\u25BE','duarr':'\\u21F5','duhar':'\\u296F','dwangle':'\\u29A6','dzcy':'\\u045F','DZcy':'\\u040F','dzigrarr':'\\u27FF','eacute':'\\xE9','Eacute':'\\xC9','easter':'\\u2A6E','ecaron':'\\u011B','Ecaron':'\\u011A','ecir':'\\u2256','ecirc':'\\xEA','Ecirc':'\\xCA','ecolon':'\\u2255','ecy':'\\u044D','Ecy':'\\u042D','eDDot':'\\u2A77','edot':'\\u0117','eDot':'\\u2251','Edot':'\\u0116','ee':'\\u2147','efDot':'\\u2252','efr':'\\uD835\\uDD22','Efr':'\\uD835\\uDD08','eg':'\\u2A9A','egrave':'\\xE8','Egrave':'\\xC8','egs':'\\u2A96','egsdot':'\\u2A98','el':'\\u2A99','Element':'\\u2208','elinters':'\\u23E7','ell':'\\u2113','els':'\\u2A95','elsdot':'\\u2A97','emacr':'\\u0113','Emacr':'\\u0112','empty':'\\u2205','emptyset':'\\u2205','EmptySmallSquare':'\\u25FB','emptyv':'\\u2205','EmptyVerySmallSquare':'\\u25AB','emsp':'\\u2003','emsp13':'\\u2004','emsp14':'\\u2005','eng':'\\u014B','ENG':'\\u014A','ensp':'\\u2002','eogon':'\\u0119','Eogon':'\\u0118','eopf':'\\uD835\\uDD56','Eopf':'\\uD835\\uDD3C','epar':'\\u22D5','eparsl':'\\u29E3','eplus':'\\u2A71','epsi':'\\u03B5','epsilon':'\\u03B5','Epsilon':'\\u0395','epsiv':'\\u03F5','eqcirc':'\\u2256','eqcolon':'\\u2255','eqsim':'\\u2242','eqslantgtr':'\\u2A96','eqslantless':'\\u2A95','Equal':'\\u2A75','equals':'=','EqualTilde':'\\u2242','equest':'\\u225F','Equilibrium':'\\u21CC','equiv':'\\u2261','equivDD':'\\u2A78','eqvparsl':'\\u29E5','erarr':'\\u2971','erDot':'\\u2253','escr':'\\u212F','Escr':'\\u2130','esdot':'\\u2250','esim':'\\u2242','Esim':'\\u2A73','eta':'\\u03B7','Eta':'\\u0397','eth':'\\xF0','ETH':'\\xD0','euml':'\\xEB','Euml':'\\xCB','euro':'\\u20AC','excl':'!','exist':'\\u2203','Exists':'\\u2203','expectation':'\\u2130','exponentiale':'\\u2147','ExponentialE':'\\u2147','fallingdotseq':'\\u2252','fcy':'\\u0444','Fcy':'\\u0424','female':'\\u2640','ffilig':'\\uFB03','fflig':'\\uFB00','ffllig':'\\uFB04','ffr':'\\uD835\\uDD23','Ffr':'\\uD835\\uDD09','filig':'\\uFB01','FilledSmallSquare':'\\u25FC','FilledVerySmallSquare':'\\u25AA','fjlig':'fj','flat':'\\u266D','fllig':'\\uFB02','fltns':'\\u25B1','fnof':'\\u0192','fopf':'\\uD835\\uDD57','Fopf':'\\uD835\\uDD3D','forall':'\\u2200','ForAll':'\\u2200','fork':'\\u22D4','forkv':'\\u2AD9','Fouriertrf':'\\u2131','fpartint':'\\u2A0D','frac12':'\\xBD','frac13':'\\u2153','frac14':'\\xBC','frac15':'\\u2155','frac16':'\\u2159','frac18':'\\u215B','frac23':'\\u2154','frac25':'\\u2156','frac34':'\\xBE','frac35':'\\u2157','frac38':'\\u215C','frac45':'\\u2158','frac56':'\\u215A','frac58':'\\u215D','frac78':'\\u215E','frasl':'\\u2044','frown':'\\u2322','fscr':'\\uD835\\uDCBB','Fscr':'\\u2131','gacute':'\\u01F5','gamma':'\\u03B3','Gamma':'\\u0393','gammad':'\\u03DD','Gammad':'\\u03DC','gap':'\\u2A86','gbreve':'\\u011F','Gbreve':'\\u011E','Gcedil':'\\u0122','gcirc':'\\u011D','Gcirc':'\\u011C','gcy':'\\u0433','Gcy':'\\u0413','gdot':'\\u0121','Gdot':'\\u0120','ge':'\\u2265','gE':'\\u2267','gel':'\\u22DB','gEl':'\\u2A8C','geq':'\\u2265','geqq':'\\u2267','geqslant':'\\u2A7E','ges':'\\u2A7E','gescc':'\\u2AA9','gesdot':'\\u2A80','gesdoto':'\\u2A82','gesdotol':'\\u2A84','gesl':'\\u22DB\\uFE00','gesles':'\\u2A94','gfr':'\\uD835\\uDD24','Gfr':'\\uD835\\uDD0A','gg':'\\u226B','Gg':'\\u22D9','ggg':'\\u22D9','gimel':'\\u2137','gjcy':'\\u0453','GJcy':'\\u0403','gl':'\\u2277','gla':'\\u2AA5','glE':'\\u2A92','glj':'\\u2AA4','gnap':'\\u2A8A','gnapprox':'\\u2A8A','gne':'\\u2A88','gnE':'\\u2269','gneq':'\\u2A88','gneqq':'\\u2269','gnsim':'\\u22E7','gopf':'\\uD835\\uDD58','Gopf':'\\uD835\\uDD3E','grave':'`','GreaterEqual':'\\u2265','GreaterEqualLess':'\\u22DB','GreaterFullEqual':'\\u2267','GreaterGreater':'\\u2AA2','GreaterLess':'\\u2277','GreaterSlantEqual':'\\u2A7E','GreaterTilde':'\\u2273','gscr':'\\u210A','Gscr':'\\uD835\\uDCA2','gsim':'\\u2273','gsime':'\\u2A8E','gsiml':'\\u2A90','gt':'>','Gt':'\\u226B','GT':'>','gtcc':'\\u2AA7','gtcir':'\\u2A7A','gtdot':'\\u22D7','gtlPar':'\\u2995','gtquest':'\\u2A7C','gtrapprox':'\\u2A86','gtrarr':'\\u2978','gtrdot':'\\u22D7','gtreqless':'\\u22DB','gtreqqless':'\\u2A8C','gtrless':'\\u2277','gtrsim':'\\u2273','gvertneqq':'\\u2269\\uFE00','gvnE':'\\u2269\\uFE00','Hacek':'\\u02C7','hairsp':'\\u200A','half':'\\xBD','hamilt':'\\u210B','hardcy':'\\u044A','HARDcy':'\\u042A','harr':'\\u2194','hArr':'\\u21D4','harrcir':'\\u2948','harrw':'\\u21AD','Hat':'^','hbar':'\\u210F','hcirc':'\\u0125','Hcirc':'\\u0124','hearts':'\\u2665','heartsuit':'\\u2665','hellip':'\\u2026','hercon':'\\u22B9','hfr':'\\uD835\\uDD25','Hfr':'\\u210C','HilbertSpace':'\\u210B','hksearow':'\\u2925','hkswarow':'\\u2926','hoarr':'\\u21FF','homtht':'\\u223B','hookleftarrow':'\\u21A9','hookrightarrow':'\\u21AA','hopf':'\\uD835\\uDD59','Hopf':'\\u210D','horbar':'\\u2015','HorizontalLine':'\\u2500','hscr':'\\uD835\\uDCBD','Hscr':'\\u210B','hslash':'\\u210F','hstrok':'\\u0127','Hstrok':'\\u0126','HumpDownHump':'\\u224E','HumpEqual':'\\u224F','hybull':'\\u2043','hyphen':'\\u2010','iacute':'\\xED','Iacute':'\\xCD','ic':'\\u2063','icirc':'\\xEE','Icirc':'\\xCE','icy':'\\u0438','Icy':'\\u0418','Idot':'\\u0130','iecy':'\\u0435','IEcy':'\\u0415','iexcl':'\\xA1','iff':'\\u21D4','ifr':'\\uD835\\uDD26','Ifr':'\\u2111','igrave':'\\xEC','Igrave':'\\xCC','ii':'\\u2148','iiiint':'\\u2A0C','iiint':'\\u222D','iinfin':'\\u29DC','iiota':'\\u2129','ijlig':'\\u0133','IJlig':'\\u0132','Im':'\\u2111','imacr':'\\u012B','Imacr':'\\u012A','image':'\\u2111','ImaginaryI':'\\u2148','imagline':'\\u2110','imagpart':'\\u2111','imath':'\\u0131','imof':'\\u22B7','imped':'\\u01B5','Implies':'\\u21D2','in':'\\u2208','incare':'\\u2105','infin':'\\u221E','infintie':'\\u29DD','inodot':'\\u0131','int':'\\u222B','Int':'\\u222C','intcal':'\\u22BA','integers':'\\u2124','Integral':'\\u222B','intercal':'\\u22BA','Intersection':'\\u22C2','intlarhk':'\\u2A17','intprod':'\\u2A3C','InvisibleComma':'\\u2063','InvisibleTimes':'\\u2062','iocy':'\\u0451','IOcy':'\\u0401','iogon':'\\u012F','Iogon':'\\u012E','iopf':'\\uD835\\uDD5A','Iopf':'\\uD835\\uDD40','iota':'\\u03B9','Iota':'\\u0399','iprod':'\\u2A3C','iquest':'\\xBF','iscr':'\\uD835\\uDCBE','Iscr':'\\u2110','isin':'\\u2208','isindot':'\\u22F5','isinE':'\\u22F9','isins':'\\u22F4','isinsv':'\\u22F3','isinv':'\\u2208','it':'\\u2062','itilde':'\\u0129','Itilde':'\\u0128','iukcy':'\\u0456','Iukcy':'\\u0406','iuml':'\\xEF','Iuml':'\\xCF','jcirc':'\\u0135','Jcirc':'\\u0134','jcy':'\\u0439','Jcy':'\\u0419','jfr':'\\uD835\\uDD27','Jfr':'\\uD835\\uDD0D','jmath':'\\u0237','jopf':'\\uD835\\uDD5B','Jopf':'\\uD835\\uDD41','jscr':'\\uD835\\uDCBF','Jscr':'\\uD835\\uDCA5','jsercy':'\\u0458','Jsercy':'\\u0408','jukcy':'\\u0454','Jukcy':'\\u0404','kappa':'\\u03BA','Kappa':'\\u039A','kappav':'\\u03F0','kcedil':'\\u0137','Kcedil':'\\u0136','kcy':'\\u043A','Kcy':'\\u041A','kfr':'\\uD835\\uDD28','Kfr':'\\uD835\\uDD0E','kgreen':'\\u0138','khcy':'\\u0445','KHcy':'\\u0425','kjcy':'\\u045C','KJcy':'\\u040C','kopf':'\\uD835\\uDD5C','Kopf':'\\uD835\\uDD42','kscr':'\\uD835\\uDCC0','Kscr':'\\uD835\\uDCA6','lAarr':'\\u21DA','lacute':'\\u013A','Lacute':'\\u0139','laemptyv':'\\u29B4','lagran':'\\u2112','lambda':'\\u03BB','Lambda':'\\u039B','lang':'\\u27E8','Lang':'\\u27EA','langd':'\\u2991','langle':'\\u27E8','lap':'\\u2A85','Laplacetrf':'\\u2112','laquo':'\\xAB','larr':'\\u2190','lArr':'\\u21D0','Larr':'\\u219E','larrb':'\\u21E4','larrbfs':'\\u291F','larrfs':'\\u291D','larrhk':'\\u21A9','larrlp':'\\u21AB','larrpl':'\\u2939','larrsim':'\\u2973','larrtl':'\\u21A2','lat':'\\u2AAB','latail':'\\u2919','lAtail':'\\u291B','late':'\\u2AAD','lates':'\\u2AAD\\uFE00','lbarr':'\\u290C','lBarr':'\\u290E','lbbrk':'\\u2772','lbrace':'{','lbrack':'[','lbrke':'\\u298B','lbrksld':'\\u298F','lbrkslu':'\\u298D','lcaron':'\\u013E','Lcaron':'\\u013D','lcedil':'\\u013C','Lcedil':'\\u013B','lceil':'\\u2308','lcub':'{','lcy':'\\u043B','Lcy':'\\u041B','ldca':'\\u2936','ldquo':'\\u201C','ldquor':'\\u201E','ldrdhar':'\\u2967','ldrushar':'\\u294B','ldsh':'\\u21B2','le':'\\u2264','lE':'\\u2266','LeftAngleBracket':'\\u27E8','leftarrow':'\\u2190','Leftarrow':'\\u21D0','LeftArrow':'\\u2190','LeftArrowBar':'\\u21E4','LeftArrowRightArrow':'\\u21C6','leftarrowtail':'\\u21A2','LeftCeiling':'\\u2308','LeftDoubleBracket':'\\u27E6','LeftDownTeeVector':'\\u2961','LeftDownVector':'\\u21C3','LeftDownVectorBar':'\\u2959','LeftFloor':'\\u230A','leftharpoondown':'\\u21BD','leftharpoonup':'\\u21BC','leftleftarrows':'\\u21C7','leftrightarrow':'\\u2194','Leftrightarrow':'\\u21D4','LeftRightArrow':'\\u2194','leftrightarrows':'\\u21C6','leftrightharpoons':'\\u21CB','leftrightsquigarrow':'\\u21AD','LeftRightVector':'\\u294E','LeftTee':'\\u22A3','LeftTeeArrow':'\\u21A4','LeftTeeVector':'\\u295A','leftthreetimes':'\\u22CB','LeftTriangle':'\\u22B2','LeftTriangleBar':'\\u29CF','LeftTriangleEqual':'\\u22B4','LeftUpDownVector':'\\u2951','LeftUpTeeVector':'\\u2960','LeftUpVector':'\\u21BF','LeftUpVectorBar':'\\u2958','LeftVector':'\\u21BC','LeftVectorBar':'\\u2952','leg':'\\u22DA','lEg':'\\u2A8B','leq':'\\u2264','leqq':'\\u2266','leqslant':'\\u2A7D','les':'\\u2A7D','lescc':'\\u2AA8','lesdot':'\\u2A7F','lesdoto':'\\u2A81','lesdotor':'\\u2A83','lesg':'\\u22DA\\uFE00','lesges':'\\u2A93','lessapprox':'\\u2A85','lessdot':'\\u22D6','lesseqgtr':'\\u22DA','lesseqqgtr':'\\u2A8B','LessEqualGreater':'\\u22DA','LessFullEqual':'\\u2266','LessGreater':'\\u2276','lessgtr':'\\u2276','LessLess':'\\u2AA1','lesssim':'\\u2272','LessSlantEqual':'\\u2A7D','LessTilde':'\\u2272','lfisht':'\\u297C','lfloor':'\\u230A','lfr':'\\uD835\\uDD29','Lfr':'\\uD835\\uDD0F','lg':'\\u2276','lgE':'\\u2A91','lHar':'\\u2962','lhard':'\\u21BD','lharu':'\\u21BC','lharul':'\\u296A','lhblk':'\\u2584','ljcy':'\\u0459','LJcy':'\\u0409','ll':'\\u226A','Ll':'\\u22D8','llarr':'\\u21C7','llcorner':'\\u231E','Lleftarrow':'\\u21DA','llhard':'\\u296B','lltri':'\\u25FA','lmidot':'\\u0140','Lmidot':'\\u013F','lmoust':'\\u23B0','lmoustache':'\\u23B0','lnap':'\\u2A89','lnapprox':'\\u2A89','lne':'\\u2A87','lnE':'\\u2268','lneq':'\\u2A87','lneqq':'\\u2268','lnsim':'\\u22E6','loang':'\\u27EC','loarr':'\\u21FD','lobrk':'\\u27E6','longleftarrow':'\\u27F5','Longleftarrow':'\\u27F8','LongLeftArrow':'\\u27F5','longleftrightarrow':'\\u27F7','Longleftrightarrow':'\\u27FA','LongLeftRightArrow':'\\u27F7','longmapsto':'\\u27FC','longrightarrow':'\\u27F6','Longrightarrow':'\\u27F9','LongRightArrow':'\\u27F6','looparrowleft':'\\u21AB','looparrowright':'\\u21AC','lopar':'\\u2985','lopf':'\\uD835\\uDD5D','Lopf':'\\uD835\\uDD43','loplus':'\\u2A2D','lotimes':'\\u2A34','lowast':'\\u2217','lowbar':'_','LowerLeftArrow':'\\u2199','LowerRightArrow':'\\u2198','loz':'\\u25CA','lozenge':'\\u25CA','lozf':'\\u29EB','lpar':'(','lparlt':'\\u2993','lrarr':'\\u21C6','lrcorner':'\\u231F','lrhar':'\\u21CB','lrhard':'\\u296D','lrm':'\\u200E','lrtri':'\\u22BF','lsaquo':'\\u2039','lscr':'\\uD835\\uDCC1','Lscr':'\\u2112','lsh':'\\u21B0','Lsh':'\\u21B0','lsim':'\\u2272','lsime':'\\u2A8D','lsimg':'\\u2A8F','lsqb':'[','lsquo':'\\u2018','lsquor':'\\u201A','lstrok':'\\u0142','Lstrok':'\\u0141','lt':'<','Lt':'\\u226A','LT':'<','ltcc':'\\u2AA6','ltcir':'\\u2A79','ltdot':'\\u22D6','lthree':'\\u22CB','ltimes':'\\u22C9','ltlarr':'\\u2976','ltquest':'\\u2A7B','ltri':'\\u25C3','ltrie':'\\u22B4','ltrif':'\\u25C2','ltrPar':'\\u2996','lurdshar':'\\u294A','luruhar':'\\u2966','lvertneqq':'\\u2268\\uFE00','lvnE':'\\u2268\\uFE00','macr':'\\xAF','male':'\\u2642','malt':'\\u2720','maltese':'\\u2720','map':'\\u21A6','Map':'\\u2905','mapsto':'\\u21A6','mapstodown':'\\u21A7','mapstoleft':'\\u21A4','mapstoup':'\\u21A5','marker':'\\u25AE','mcomma':'\\u2A29','mcy':'\\u043C','Mcy':'\\u041C','mdash':'\\u2014','mDDot':'\\u223A','measuredangle':'\\u2221','MediumSpace':'\\u205F','Mellintrf':'\\u2133','mfr':'\\uD835\\uDD2A','Mfr':'\\uD835\\uDD10','mho':'\\u2127','micro':'\\xB5','mid':'\\u2223','midast':'*','midcir':'\\u2AF0','middot':'\\xB7','minus':'\\u2212','minusb':'\\u229F','minusd':'\\u2238','minusdu':'\\u2A2A','MinusPlus':'\\u2213','mlcp':'\\u2ADB','mldr':'\\u2026','mnplus':'\\u2213','models':'\\u22A7','mopf':'\\uD835\\uDD5E','Mopf':'\\uD835\\uDD44','mp':'\\u2213','mscr':'\\uD835\\uDCC2','Mscr':'\\u2133','mstpos':'\\u223E','mu':'\\u03BC','Mu':'\\u039C','multimap':'\\u22B8','mumap':'\\u22B8','nabla':'\\u2207','nacute':'\\u0144','Nacute':'\\u0143','nang':'\\u2220\\u20D2','nap':'\\u2249','napE':'\\u2A70\\u0338','napid':'\\u224B\\u0338','napos':'\\u0149','napprox':'\\u2249','natur':'\\u266E','natural':'\\u266E','naturals':'\\u2115','nbsp':'\\xA0','nbump':'\\u224E\\u0338','nbumpe':'\\u224F\\u0338','ncap':'\\u2A43','ncaron':'\\u0148','Ncaron':'\\u0147','ncedil':'\\u0146','Ncedil':'\\u0145','ncong':'\\u2247','ncongdot':'\\u2A6D\\u0338','ncup':'\\u2A42','ncy':'\\u043D','Ncy':'\\u041D','ndash':'\\u2013','ne':'\\u2260','nearhk':'\\u2924','nearr':'\\u2197','neArr':'\\u21D7','nearrow':'\\u2197','nedot':'\\u2250\\u0338','NegativeMediumSpace':'\\u200B','NegativeThickSpace':'\\u200B','NegativeThinSpace':'\\u200B','NegativeVeryThinSpace':'\\u200B','nequiv':'\\u2262','nesear':'\\u2928','nesim':'\\u2242\\u0338','NestedGreaterGreater':'\\u226B','NestedLessLess':'\\u226A','NewLine':'\\n','nexist':'\\u2204','nexists':'\\u2204','nfr':'\\uD835\\uDD2B','Nfr':'\\uD835\\uDD11','nge':'\\u2271','ngE':'\\u2267\\u0338','ngeq':'\\u2271','ngeqq':'\\u2267\\u0338','ngeqslant':'\\u2A7E\\u0338','nges':'\\u2A7E\\u0338','nGg':'\\u22D9\\u0338','ngsim':'\\u2275','ngt':'\\u226F','nGt':'\\u226B\\u20D2','ngtr':'\\u226F','nGtv':'\\u226B\\u0338','nharr':'\\u21AE','nhArr':'\\u21CE','nhpar':'\\u2AF2','ni':'\\u220B','nis':'\\u22FC','nisd':'\\u22FA','niv':'\\u220B','njcy':'\\u045A','NJcy':'\\u040A','nlarr':'\\u219A','nlArr':'\\u21CD','nldr':'\\u2025','nle':'\\u2270','nlE':'\\u2266\\u0338','nleftarrow':'\\u219A','nLeftarrow':'\\u21CD','nleftrightarrow':'\\u21AE','nLeftrightarrow':'\\u21CE','nleq':'\\u2270','nleqq':'\\u2266\\u0338','nleqslant':'\\u2A7D\\u0338','nles':'\\u2A7D\\u0338','nless':'\\u226E','nLl':'\\u22D8\\u0338','nlsim':'\\u2274','nlt':'\\u226E','nLt':'\\u226A\\u20D2','nltri':'\\u22EA','nltrie':'\\u22EC','nLtv':'\\u226A\\u0338','nmid':'\\u2224','NoBreak':'\\u2060','NonBreakingSpace':'\\xA0','nopf':'\\uD835\\uDD5F','Nopf':'\\u2115','not':'\\xAC','Not':'\\u2AEC','NotCongruent':'\\u2262','NotCupCap':'\\u226D','NotDoubleVerticalBar':'\\u2226','NotElement':'\\u2209','NotEqual':'\\u2260','NotEqualTilde':'\\u2242\\u0338','NotExists':'\\u2204','NotGreater':'\\u226F','NotGreaterEqual':'\\u2271','NotGreaterFullEqual':'\\u2267\\u0338','NotGreaterGreater':'\\u226B\\u0338','NotGreaterLess':'\\u2279','NotGreaterSlantEqual':'\\u2A7E\\u0338','NotGreaterTilde':'\\u2275','NotHumpDownHump':'\\u224E\\u0338','NotHumpEqual':'\\u224F\\u0338','notin':'\\u2209','notindot':'\\u22F5\\u0338','notinE':'\\u22F9\\u0338','notinva':'\\u2209','notinvb':'\\u22F7','notinvc':'\\u22F6','NotLeftTriangle':'\\u22EA','NotLeftTriangleBar':'\\u29CF\\u0338','NotLeftTriangleEqual':'\\u22EC','NotLess':'\\u226E','NotLessEqual':'\\u2270','NotLessGreater':'\\u2278','NotLessLess':'\\u226A\\u0338','NotLessSlantEqual':'\\u2A7D\\u0338','NotLessTilde':'\\u2274','NotNestedGreaterGreater':'\\u2AA2\\u0338','NotNestedLessLess':'\\u2AA1\\u0338','notni':'\\u220C','notniva':'\\u220C','notnivb':'\\u22FE','notnivc':'\\u22FD','NotPrecedes':'\\u2280','NotPrecedesEqual':'\\u2AAF\\u0338','NotPrecedesSlantEqual':'\\u22E0','NotReverseElement':'\\u220C','NotRightTriangle':'\\u22EB','NotRightTriangleBar':'\\u29D0\\u0338','NotRightTriangleEqual':'\\u22ED','NotSquareSubset':'\\u228F\\u0338','NotSquareSubsetEqual':'\\u22E2','NotSquareSuperset':'\\u2290\\u0338','NotSquareSupersetEqual':'\\u22E3','NotSubset':'\\u2282\\u20D2','NotSubsetEqual':'\\u2288','NotSucceeds':'\\u2281','NotSucceedsEqual':'\\u2AB0\\u0338','NotSucceedsSlantEqual':'\\u22E1','NotSucceedsTilde':'\\u227F\\u0338','NotSuperset':'\\u2283\\u20D2','NotSupersetEqual':'\\u2289','NotTilde':'\\u2241','NotTildeEqual':'\\u2244','NotTildeFullEqual':'\\u2247','NotTildeTilde':'\\u2249','NotVerticalBar':'\\u2224','npar':'\\u2226','nparallel':'\\u2226','nparsl':'\\u2AFD\\u20E5','npart':'\\u2202\\u0338','npolint':'\\u2A14','npr':'\\u2280','nprcue':'\\u22E0','npre':'\\u2AAF\\u0338','nprec':'\\u2280','npreceq':'\\u2AAF\\u0338','nrarr':'\\u219B','nrArr':'\\u21CF','nrarrc':'\\u2933\\u0338','nrarrw':'\\u219D\\u0338','nrightarrow':'\\u219B','nRightarrow':'\\u21CF','nrtri':'\\u22EB','nrtrie':'\\u22ED','nsc':'\\u2281','nsccue':'\\u22E1','nsce':'\\u2AB0\\u0338','nscr':'\\uD835\\uDCC3','Nscr':'\\uD835\\uDCA9','nshortmid':'\\u2224','nshortparallel':'\\u2226','nsim':'\\u2241','nsime':'\\u2244','nsimeq':'\\u2244','nsmid':'\\u2224','nspar':'\\u2226','nsqsube':'\\u22E2','nsqsupe':'\\u22E3','nsub':'\\u2284','nsube':'\\u2288','nsubE':'\\u2AC5\\u0338','nsubset':'\\u2282\\u20D2','nsubseteq':'\\u2288','nsubseteqq':'\\u2AC5\\u0338','nsucc':'\\u2281','nsucceq':'\\u2AB0\\u0338','nsup':'\\u2285','nsupe':'\\u2289','nsupE':'\\u2AC6\\u0338','nsupset':'\\u2283\\u20D2','nsupseteq':'\\u2289','nsupseteqq':'\\u2AC6\\u0338','ntgl':'\\u2279','ntilde':'\\xF1','Ntilde':'\\xD1','ntlg':'\\u2278','ntriangleleft':'\\u22EA','ntrianglelefteq':'\\u22EC','ntriangleright':'\\u22EB','ntrianglerighteq':'\\u22ED','nu':'\\u03BD','Nu':'\\u039D','num':'#','numero':'\\u2116','numsp':'\\u2007','nvap':'\\u224D\\u20D2','nvdash':'\\u22AC','nvDash':'\\u22AD','nVdash':'\\u22AE','nVDash':'\\u22AF','nvge':'\\u2265\\u20D2','nvgt':'>\\u20D2','nvHarr':'\\u2904','nvinfin':'\\u29DE','nvlArr':'\\u2902','nvle':'\\u2264\\u20D2','nvlt':'<\\u20D2','nvltrie':'\\u22B4\\u20D2','nvrArr':'\\u2903','nvrtrie':'\\u22B5\\u20D2','nvsim':'\\u223C\\u20D2','nwarhk':'\\u2923','nwarr':'\\u2196','nwArr':'\\u21D6','nwarrow':'\\u2196','nwnear':'\\u2927','oacute':'\\xF3','Oacute':'\\xD3','oast':'\\u229B','ocir':'\\u229A','ocirc':'\\xF4','Ocirc':'\\xD4','ocy':'\\u043E','Ocy':'\\u041E','odash':'\\u229D','odblac':'\\u0151','Odblac':'\\u0150','odiv':'\\u2A38','odot':'\\u2299','odsold':'\\u29BC','oelig':'\\u0153','OElig':'\\u0152','ofcir':'\\u29BF','ofr':'\\uD835\\uDD2C','Ofr':'\\uD835\\uDD12','ogon':'\\u02DB','ograve':'\\xF2','Ograve':'\\xD2','ogt':'\\u29C1','ohbar':'\\u29B5','ohm':'\\u03A9','oint':'\\u222E','olarr':'\\u21BA','olcir':'\\u29BE','olcross':'\\u29BB','oline':'\\u203E','olt':'\\u29C0','omacr':'\\u014D','Omacr':'\\u014C','omega':'\\u03C9','Omega':'\\u03A9','omicron':'\\u03BF','Omicron':'\\u039F','omid':'\\u29B6','ominus':'\\u2296','oopf':'\\uD835\\uDD60','Oopf':'\\uD835\\uDD46','opar':'\\u29B7','OpenCurlyDoubleQuote':'\\u201C','OpenCurlyQuote':'\\u2018','operp':'\\u29B9','oplus':'\\u2295','or':'\\u2228','Or':'\\u2A54','orarr':'\\u21BB','ord':'\\u2A5D','order':'\\u2134','orderof':'\\u2134','ordf':'\\xAA','ordm':'\\xBA','origof':'\\u22B6','oror':'\\u2A56','orslope':'\\u2A57','orv':'\\u2A5B','oS':'\\u24C8','oscr':'\\u2134','Oscr':'\\uD835\\uDCAA','oslash':'\\xF8','Oslash':'\\xD8','osol':'\\u2298','otilde':'\\xF5','Otilde':'\\xD5','otimes':'\\u2297','Otimes':'\\u2A37','otimesas':'\\u2A36','ouml':'\\xF6','Ouml':'\\xD6','ovbar':'\\u233D','OverBar':'\\u203E','OverBrace':'\\u23DE','OverBracket':'\\u23B4','OverParenthesis':'\\u23DC','par':'\\u2225','para':'\\xB6','parallel':'\\u2225','parsim':'\\u2AF3','parsl':'\\u2AFD','part':'\\u2202','PartialD':'\\u2202','pcy':'\\u043F','Pcy':'\\u041F','percnt':'%','period':'.','permil':'\\u2030','perp':'\\u22A5','pertenk':'\\u2031','pfr':'\\uD835\\uDD2D','Pfr':'\\uD835\\uDD13','phi':'\\u03C6','Phi':'\\u03A6','phiv':'\\u03D5','phmmat':'\\u2133','phone':'\\u260E','pi':'\\u03C0','Pi':'\\u03A0','pitchfork':'\\u22D4','piv':'\\u03D6','planck':'\\u210F','planckh':'\\u210E','plankv':'\\u210F','plus':'+','plusacir':'\\u2A23','plusb':'\\u229E','pluscir':'\\u2A22','plusdo':'\\u2214','plusdu':'\\u2A25','pluse':'\\u2A72','PlusMinus':'\\xB1','plusmn':'\\xB1','plussim':'\\u2A26','plustwo':'\\u2A27','pm':'\\xB1','Poincareplane':'\\u210C','pointint':'\\u2A15','popf':'\\uD835\\uDD61','Popf':'\\u2119','pound':'\\xA3','pr':'\\u227A','Pr':'\\u2ABB','prap':'\\u2AB7','prcue':'\\u227C','pre':'\\u2AAF','prE':'\\u2AB3','prec':'\\u227A','precapprox':'\\u2AB7','preccurlyeq':'\\u227C','Precedes':'\\u227A','PrecedesEqual':'\\u2AAF','PrecedesSlantEqual':'\\u227C','PrecedesTilde':'\\u227E','preceq':'\\u2AAF','precnapprox':'\\u2AB9','precneqq':'\\u2AB5','precnsim':'\\u22E8','precsim':'\\u227E','prime':'\\u2032','Prime':'\\u2033','primes':'\\u2119','prnap':'\\u2AB9','prnE':'\\u2AB5','prnsim':'\\u22E8','prod':'\\u220F','Product':'\\u220F','profalar':'\\u232E','profline':'\\u2312','profsurf':'\\u2313','prop':'\\u221D','Proportion':'\\u2237','Proportional':'\\u221D','propto':'\\u221D','prsim':'\\u227E','prurel':'\\u22B0','pscr':'\\uD835\\uDCC5','Pscr':'\\uD835\\uDCAB','psi':'\\u03C8','Psi':'\\u03A8','puncsp':'\\u2008','qfr':'\\uD835\\uDD2E','Qfr':'\\uD835\\uDD14','qint':'\\u2A0C','qopf':'\\uD835\\uDD62','Qopf':'\\u211A','qprime':'\\u2057','qscr':'\\uD835\\uDCC6','Qscr':'\\uD835\\uDCAC','quaternions':'\\u210D','quatint':'\\u2A16','quest':'?','questeq':'\\u225F','quot':'\"','QUOT':'\"','rAarr':'\\u21DB','race':'\\u223D\\u0331','racute':'\\u0155','Racute':'\\u0154','radic':'\\u221A','raemptyv':'\\u29B3','rang':'\\u27E9','Rang':'\\u27EB','rangd':'\\u2992','range':'\\u29A5','rangle':'\\u27E9','raquo':'\\xBB','rarr':'\\u2192','rArr':'\\u21D2','Rarr':'\\u21A0','rarrap':'\\u2975','rarrb':'\\u21E5','rarrbfs':'\\u2920','rarrc':'\\u2933','rarrfs':'\\u291E','rarrhk':'\\u21AA','rarrlp':'\\u21AC','rarrpl':'\\u2945','rarrsim':'\\u2974','rarrtl':'\\u21A3','Rarrtl':'\\u2916','rarrw':'\\u219D','ratail':'\\u291A','rAtail':'\\u291C','ratio':'\\u2236','rationals':'\\u211A','rbarr':'\\u290D','rBarr':'\\u290F','RBarr':'\\u2910','rbbrk':'\\u2773','rbrace':'}','rbrack':']','rbrke':'\\u298C','rbrksld':'\\u298E','rbrkslu':'\\u2990','rcaron':'\\u0159','Rcaron':'\\u0158','rcedil':'\\u0157','Rcedil':'\\u0156','rceil':'\\u2309','rcub':'}','rcy':'\\u0440','Rcy':'\\u0420','rdca':'\\u2937','rdldhar':'\\u2969','rdquo':'\\u201D','rdquor':'\\u201D','rdsh':'\\u21B3','Re':'\\u211C','real':'\\u211C','realine':'\\u211B','realpart':'\\u211C','reals':'\\u211D','rect':'\\u25AD','reg':'\\xAE','REG':'\\xAE','ReverseElement':'\\u220B','ReverseEquilibrium':'\\u21CB','ReverseUpEquilibrium':'\\u296F','rfisht':'\\u297D','rfloor':'\\u230B','rfr':'\\uD835\\uDD2F','Rfr':'\\u211C','rHar':'\\u2964','rhard':'\\u21C1','rharu':'\\u21C0','rharul':'\\u296C','rho':'\\u03C1','Rho':'\\u03A1','rhov':'\\u03F1','RightAngleBracket':'\\u27E9','rightarrow':'\\u2192','Rightarrow':'\\u21D2','RightArrow':'\\u2192','RightArrowBar':'\\u21E5','RightArrowLeftArrow':'\\u21C4','rightarrowtail':'\\u21A3','RightCeiling':'\\u2309','RightDoubleBracket':'\\u27E7','RightDownTeeVector':'\\u295D','RightDownVector':'\\u21C2','RightDownVectorBar':'\\u2955','RightFloor':'\\u230B','rightharpoondown':'\\u21C1','rightharpoonup':'\\u21C0','rightleftarrows':'\\u21C4','rightleftharpoons':'\\u21CC','rightrightarrows':'\\u21C9','rightsquigarrow':'\\u219D','RightTee':'\\u22A2','RightTeeArrow':'\\u21A6','RightTeeVector':'\\u295B','rightthreetimes':'\\u22CC','RightTriangle':'\\u22B3','RightTriangleBar':'\\u29D0','RightTriangleEqual':'\\u22B5','RightUpDownVector':'\\u294F','RightUpTeeVector':'\\u295C','RightUpVector':'\\u21BE','RightUpVectorBar':'\\u2954','RightVector':'\\u21C0','RightVectorBar':'\\u2953','ring':'\\u02DA','risingdotseq':'\\u2253','rlarr':'\\u21C4','rlhar':'\\u21CC','rlm':'\\u200F','rmoust':'\\u23B1','rmoustache':'\\u23B1','rnmid':'\\u2AEE','roang':'\\u27ED','roarr':'\\u21FE','robrk':'\\u27E7','ropar':'\\u2986','ropf':'\\uD835\\uDD63','Ropf':'\\u211D','roplus':'\\u2A2E','rotimes':'\\u2A35','RoundImplies':'\\u2970','rpar':')','rpargt':'\\u2994','rppolint':'\\u2A12','rrarr':'\\u21C9','Rrightarrow':'\\u21DB','rsaquo':'\\u203A','rscr':'\\uD835\\uDCC7','Rscr':'\\u211B','rsh':'\\u21B1','Rsh':'\\u21B1','rsqb':']','rsquo':'\\u2019','rsquor':'\\u2019','rthree':'\\u22CC','rtimes':'\\u22CA','rtri':'\\u25B9','rtrie':'\\u22B5','rtrif':'\\u25B8','rtriltri':'\\u29CE','RuleDelayed':'\\u29F4','ruluhar':'\\u2968','rx':'\\u211E','sacute':'\\u015B','Sacute':'\\u015A','sbquo':'\\u201A','sc':'\\u227B','Sc':'\\u2ABC','scap':'\\u2AB8','scaron':'\\u0161','Scaron':'\\u0160','sccue':'\\u227D','sce':'\\u2AB0','scE':'\\u2AB4','scedil':'\\u015F','Scedil':'\\u015E','scirc':'\\u015D','Scirc':'\\u015C','scnap':'\\u2ABA','scnE':'\\u2AB6','scnsim':'\\u22E9','scpolint':'\\u2A13','scsim':'\\u227F','scy':'\\u0441','Scy':'\\u0421','sdot':'\\u22C5','sdotb':'\\u22A1','sdote':'\\u2A66','searhk':'\\u2925','searr':'\\u2198','seArr':'\\u21D8','searrow':'\\u2198','sect':'\\xA7','semi':';','seswar':'\\u2929','setminus':'\\u2216','setmn':'\\u2216','sext':'\\u2736','sfr':'\\uD835\\uDD30','Sfr':'\\uD835\\uDD16','sfrown':'\\u2322','sharp':'\\u266F','shchcy':'\\u0449','SHCHcy':'\\u0429','shcy':'\\u0448','SHcy':'\\u0428','ShortDownArrow':'\\u2193','ShortLeftArrow':'\\u2190','shortmid':'\\u2223','shortparallel':'\\u2225','ShortRightArrow':'\\u2192','ShortUpArrow':'\\u2191','shy':'\\xAD','sigma':'\\u03C3','Sigma':'\\u03A3','sigmaf':'\\u03C2','sigmav':'\\u03C2','sim':'\\u223C','simdot':'\\u2A6A','sime':'\\u2243','simeq':'\\u2243','simg':'\\u2A9E','simgE':'\\u2AA0','siml':'\\u2A9D','simlE':'\\u2A9F','simne':'\\u2246','simplus':'\\u2A24','simrarr':'\\u2972','slarr':'\\u2190','SmallCircle':'\\u2218','smallsetminus':'\\u2216','smashp':'\\u2A33','smeparsl':'\\u29E4','smid':'\\u2223','smile':'\\u2323','smt':'\\u2AAA','smte':'\\u2AAC','smtes':'\\u2AAC\\uFE00','softcy':'\\u044C','SOFTcy':'\\u042C','sol':'/','solb':'\\u29C4','solbar':'\\u233F','sopf':'\\uD835\\uDD64','Sopf':'\\uD835\\uDD4A','spades':'\\u2660','spadesuit':'\\u2660','spar':'\\u2225','sqcap':'\\u2293','sqcaps':'\\u2293\\uFE00','sqcup':'\\u2294','sqcups':'\\u2294\\uFE00','Sqrt':'\\u221A','sqsub':'\\u228F','sqsube':'\\u2291','sqsubset':'\\u228F','sqsubseteq':'\\u2291','sqsup':'\\u2290','sqsupe':'\\u2292','sqsupset':'\\u2290','sqsupseteq':'\\u2292','squ':'\\u25A1','square':'\\u25A1','Square':'\\u25A1','SquareIntersection':'\\u2293','SquareSubset':'\\u228F','SquareSubsetEqual':'\\u2291','SquareSuperset':'\\u2290','SquareSupersetEqual':'\\u2292','SquareUnion':'\\u2294','squarf':'\\u25AA','squf':'\\u25AA','srarr':'\\u2192','sscr':'\\uD835\\uDCC8','Sscr':'\\uD835\\uDCAE','ssetmn':'\\u2216','ssmile':'\\u2323','sstarf':'\\u22C6','star':'\\u2606','Star':'\\u22C6','starf':'\\u2605','straightepsilon':'\\u03F5','straightphi':'\\u03D5','strns':'\\xAF','sub':'\\u2282','Sub':'\\u22D0','subdot':'\\u2ABD','sube':'\\u2286','subE':'\\u2AC5','subedot':'\\u2AC3','submult':'\\u2AC1','subne':'\\u228A','subnE':'\\u2ACB','subplus':'\\u2ABF','subrarr':'\\u2979','subset':'\\u2282','Subset':'\\u22D0','subseteq':'\\u2286','subseteqq':'\\u2AC5','SubsetEqual':'\\u2286','subsetneq':'\\u228A','subsetneqq':'\\u2ACB','subsim':'\\u2AC7','subsub':'\\u2AD5','subsup':'\\u2AD3','succ':'\\u227B','succapprox':'\\u2AB8','succcurlyeq':'\\u227D','Succeeds':'\\u227B','SucceedsEqual':'\\u2AB0','SucceedsSlantEqual':'\\u227D','SucceedsTilde':'\\u227F','succeq':'\\u2AB0','succnapprox':'\\u2ABA','succneqq':'\\u2AB6','succnsim':'\\u22E9','succsim':'\\u227F','SuchThat':'\\u220B','sum':'\\u2211','Sum':'\\u2211','sung':'\\u266A','sup':'\\u2283','Sup':'\\u22D1','sup1':'\\xB9','sup2':'\\xB2','sup3':'\\xB3','supdot':'\\u2ABE','supdsub':'\\u2AD8','supe':'\\u2287','supE':'\\u2AC6','supedot':'\\u2AC4','Superset':'\\u2283','SupersetEqual':'\\u2287','suphsol':'\\u27C9','suphsub':'\\u2AD7','suplarr':'\\u297B','supmult':'\\u2AC2','supne':'\\u228B','supnE':'\\u2ACC','supplus':'\\u2AC0','supset':'\\u2283','Supset':'\\u22D1','supseteq':'\\u2287','supseteqq':'\\u2AC6','supsetneq':'\\u228B','supsetneqq':'\\u2ACC','supsim':'\\u2AC8','supsub':'\\u2AD4','supsup':'\\u2AD6','swarhk':'\\u2926','swarr':'\\u2199','swArr':'\\u21D9','swarrow':'\\u2199','swnwar':'\\u292A','szlig':'\\xDF','Tab':'\\t','target':'\\u2316','tau':'\\u03C4','Tau':'\\u03A4','tbrk':'\\u23B4','tcaron':'\\u0165','Tcaron':'\\u0164','tcedil':'\\u0163','Tcedil':'\\u0162','tcy':'\\u0442','Tcy':'\\u0422','tdot':'\\u20DB','telrec':'\\u2315','tfr':'\\uD835\\uDD31','Tfr':'\\uD835\\uDD17','there4':'\\u2234','therefore':'\\u2234','Therefore':'\\u2234','theta':'\\u03B8','Theta':'\\u0398','thetasym':'\\u03D1','thetav':'\\u03D1','thickapprox':'\\u2248','thicksim':'\\u223C','ThickSpace':'\\u205F\\u200A','thinsp':'\\u2009','ThinSpace':'\\u2009','thkap':'\\u2248','thksim':'\\u223C','thorn':'\\xFE','THORN':'\\xDE','tilde':'\\u02DC','Tilde':'\\u223C','TildeEqual':'\\u2243','TildeFullEqual':'\\u2245','TildeTilde':'\\u2248','times':'\\xD7','timesb':'\\u22A0','timesbar':'\\u2A31','timesd':'\\u2A30','tint':'\\u222D','toea':'\\u2928','top':'\\u22A4','topbot':'\\u2336','topcir':'\\u2AF1','topf':'\\uD835\\uDD65','Topf':'\\uD835\\uDD4B','topfork':'\\u2ADA','tosa':'\\u2929','tprime':'\\u2034','trade':'\\u2122','TRADE':'\\u2122','triangle':'\\u25B5','triangledown':'\\u25BF','triangleleft':'\\u25C3','trianglelefteq':'\\u22B4','triangleq':'\\u225C','triangleright':'\\u25B9','trianglerighteq':'\\u22B5','tridot':'\\u25EC','trie':'\\u225C','triminus':'\\u2A3A','TripleDot':'\\u20DB','triplus':'\\u2A39','trisb':'\\u29CD','tritime':'\\u2A3B','trpezium':'\\u23E2','tscr':'\\uD835\\uDCC9','Tscr':'\\uD835\\uDCAF','tscy':'\\u0446','TScy':'\\u0426','tshcy':'\\u045B','TSHcy':'\\u040B','tstrok':'\\u0167','Tstrok':'\\u0166','twixt':'\\u226C','twoheadleftarrow':'\\u219E','twoheadrightarrow':'\\u21A0','uacute':'\\xFA','Uacute':'\\xDA','uarr':'\\u2191','uArr':'\\u21D1','Uarr':'\\u219F','Uarrocir':'\\u2949','ubrcy':'\\u045E','Ubrcy':'\\u040E','ubreve':'\\u016D','Ubreve':'\\u016C','ucirc':'\\xFB','Ucirc':'\\xDB','ucy':'\\u0443','Ucy':'\\u0423','udarr':'\\u21C5','udblac':'\\u0171','Udblac':'\\u0170','udhar':'\\u296E','ufisht':'\\u297E','ufr':'\\uD835\\uDD32','Ufr':'\\uD835\\uDD18','ugrave':'\\xF9','Ugrave':'\\xD9','uHar':'\\u2963','uharl':'\\u21BF','uharr':'\\u21BE','uhblk':'\\u2580','ulcorn':'\\u231C','ulcorner':'\\u231C','ulcrop':'\\u230F','ultri':'\\u25F8','umacr':'\\u016B','Umacr':'\\u016A','uml':'\\xA8','UnderBar':'_','UnderBrace':'\\u23DF','UnderBracket':'\\u23B5','UnderParenthesis':'\\u23DD','Union':'\\u22C3','UnionPlus':'\\u228E','uogon':'\\u0173','Uogon':'\\u0172','uopf':'\\uD835\\uDD66','Uopf':'\\uD835\\uDD4C','uparrow':'\\u2191','Uparrow':'\\u21D1','UpArrow':'\\u2191','UpArrowBar':'\\u2912','UpArrowDownArrow':'\\u21C5','updownarrow':'\\u2195','Updownarrow':'\\u21D5','UpDownArrow':'\\u2195','UpEquilibrium':'\\u296E','upharpoonleft':'\\u21BF','upharpoonright':'\\u21BE','uplus':'\\u228E','UpperLeftArrow':'\\u2196','UpperRightArrow':'\\u2197','upsi':'\\u03C5','Upsi':'\\u03D2','upsih':'\\u03D2','upsilon':'\\u03C5','Upsilon':'\\u03A5','UpTee':'\\u22A5','UpTeeArrow':'\\u21A5','upuparrows':'\\u21C8','urcorn':'\\u231D','urcorner':'\\u231D','urcrop':'\\u230E','uring':'\\u016F','Uring':'\\u016E','urtri':'\\u25F9','uscr':'\\uD835\\uDCCA','Uscr':'\\uD835\\uDCB0','utdot':'\\u22F0','utilde':'\\u0169','Utilde':'\\u0168','utri':'\\u25B5','utrif':'\\u25B4','uuarr':'\\u21C8','uuml':'\\xFC','Uuml':'\\xDC','uwangle':'\\u29A7','vangrt':'\\u299C','varepsilon':'\\u03F5','varkappa':'\\u03F0','varnothing':'\\u2205','varphi':'\\u03D5','varpi':'\\u03D6','varpropto':'\\u221D','varr':'\\u2195','vArr':'\\u21D5','varrho':'\\u03F1','varsigma':'\\u03C2','varsubsetneq':'\\u228A\\uFE00','varsubsetneqq':'\\u2ACB\\uFE00','varsupsetneq':'\\u228B\\uFE00','varsupsetneqq':'\\u2ACC\\uFE00','vartheta':'\\u03D1','vartriangleleft':'\\u22B2','vartriangleright':'\\u22B3','vBar':'\\u2AE8','Vbar':'\\u2AEB','vBarv':'\\u2AE9','vcy':'\\u0432','Vcy':'\\u0412','vdash':'\\u22A2','vDash':'\\u22A8','Vdash':'\\u22A9','VDash':'\\u22AB','Vdashl':'\\u2AE6','vee':'\\u2228','Vee':'\\u22C1','veebar':'\\u22BB','veeeq':'\\u225A','vellip':'\\u22EE','verbar':'|','Verbar':'\\u2016','vert':'|','Vert':'\\u2016','VerticalBar':'\\u2223','VerticalLine':'|','VerticalSeparator':'\\u2758','VerticalTilde':'\\u2240','VeryThinSpace':'\\u200A','vfr':'\\uD835\\uDD33','Vfr':'\\uD835\\uDD19','vltri':'\\u22B2','vnsub':'\\u2282\\u20D2','vnsup':'\\u2283\\u20D2','vopf':'\\uD835\\uDD67','Vopf':'\\uD835\\uDD4D','vprop':'\\u221D','vrtri':'\\u22B3','vscr':'\\uD835\\uDCCB','Vscr':'\\uD835\\uDCB1','vsubne':'\\u228A\\uFE00','vsubnE':'\\u2ACB\\uFE00','vsupne':'\\u228B\\uFE00','vsupnE':'\\u2ACC\\uFE00','Vvdash':'\\u22AA','vzigzag':'\\u299A','wcirc':'\\u0175','Wcirc':'\\u0174','wedbar':'\\u2A5F','wedge':'\\u2227','Wedge':'\\u22C0','wedgeq':'\\u2259','weierp':'\\u2118','wfr':'\\uD835\\uDD34','Wfr':'\\uD835\\uDD1A','wopf':'\\uD835\\uDD68','Wopf':'\\uD835\\uDD4E','wp':'\\u2118','wr':'\\u2240','wreath':'\\u2240','wscr':'\\uD835\\uDCCC','Wscr':'\\uD835\\uDCB2','xcap':'\\u22C2','xcirc':'\\u25EF','xcup':'\\u22C3','xdtri':'\\u25BD','xfr':'\\uD835\\uDD35','Xfr':'\\uD835\\uDD1B','xharr':'\\u27F7','xhArr':'\\u27FA','xi':'\\u03BE','Xi':'\\u039E','xlarr':'\\u27F5','xlArr':'\\u27F8','xmap':'\\u27FC','xnis':'\\u22FB','xodot':'\\u2A00','xopf':'\\uD835\\uDD69','Xopf':'\\uD835\\uDD4F','xoplus':'\\u2A01','xotime':'\\u2A02','xrarr':'\\u27F6','xrArr':'\\u27F9','xscr':'\\uD835\\uDCCD','Xscr':'\\uD835\\uDCB3','xsqcup':'\\u2A06','xuplus':'\\u2A04','xutri':'\\u25B3','xvee':'\\u22C1','xwedge':'\\u22C0','yacute':'\\xFD','Yacute':'\\xDD','yacy':'\\u044F','YAcy':'\\u042F','ycirc':'\\u0177','Ycirc':'\\u0176','ycy':'\\u044B','Ycy':'\\u042B','yen':'\\xA5','yfr':'\\uD835\\uDD36','Yfr':'\\uD835\\uDD1C','yicy':'\\u0457','YIcy':'\\u0407','yopf':'\\uD835\\uDD6A','Yopf':'\\uD835\\uDD50','yscr':'\\uD835\\uDCCE','Yscr':'\\uD835\\uDCB4','yucy':'\\u044E','YUcy':'\\u042E','yuml':'\\xFF','Yuml':'\\u0178','zacute':'\\u017A','Zacute':'\\u0179','zcaron':'\\u017E','Zcaron':'\\u017D','zcy':'\\u0437','Zcy':'\\u0417','zdot':'\\u017C','Zdot':'\\u017B','zeetrf':'\\u2128','ZeroWidthSpace':'\\u200B','zeta':'\\u03B6','Zeta':'\\u0396','zfr':'\\uD835\\uDD37','Zfr':'\\u2128','zhcy':'\\u0436','ZHcy':'\\u0416','zigrarr':'\\u21DD','zopf':'\\uD835\\uDD6B','Zopf':'\\u2124','zscr':'\\uD835\\uDCCF','Zscr':'\\uD835\\uDCB5','zwj':'\\u200D','zwnj':'\\u200C'};\n\tvar decodeMapLegacy = {'aacute':'\\xE1','Aacute':'\\xC1','acirc':'\\xE2','Acirc':'\\xC2','acute':'\\xB4','aelig':'\\xE6','AElig':'\\xC6','agrave':'\\xE0','Agrave':'\\xC0','amp':'&','AMP':'&','aring':'\\xE5','Aring':'\\xC5','atilde':'\\xE3','Atilde':'\\xC3','auml':'\\xE4','Auml':'\\xC4','brvbar':'\\xA6','ccedil':'\\xE7','Ccedil':'\\xC7','cedil':'\\xB8','cent':'\\xA2','copy':'\\xA9','COPY':'\\xA9','curren':'\\xA4','deg':'\\xB0','divide':'\\xF7','eacute':'\\xE9','Eacute':'\\xC9','ecirc':'\\xEA','Ecirc':'\\xCA','egrave':'\\xE8','Egrave':'\\xC8','eth':'\\xF0','ETH':'\\xD0','euml':'\\xEB','Euml':'\\xCB','frac12':'\\xBD','frac14':'\\xBC','frac34':'\\xBE','gt':'>','GT':'>','iacute':'\\xED','Iacute':'\\xCD','icirc':'\\xEE','Icirc':'\\xCE','iexcl':'\\xA1','igrave':'\\xEC','Igrave':'\\xCC','iquest':'\\xBF','iuml':'\\xEF','Iuml':'\\xCF','laquo':'\\xAB','lt':'<','LT':'<','macr':'\\xAF','micro':'\\xB5','middot':'\\xB7','nbsp':'\\xA0','not':'\\xAC','ntilde':'\\xF1','Ntilde':'\\xD1','oacute':'\\xF3','Oacute':'\\xD3','ocirc':'\\xF4','Ocirc':'\\xD4','ograve':'\\xF2','Ograve':'\\xD2','ordf':'\\xAA','ordm':'\\xBA','oslash':'\\xF8','Oslash':'\\xD8','otilde':'\\xF5','Otilde':'\\xD5','ouml':'\\xF6','Ouml':'\\xD6','para':'\\xB6','plusmn':'\\xB1','pound':'\\xA3','quot':'\"','QUOT':'\"','raquo':'\\xBB','reg':'\\xAE','REG':'\\xAE','sect':'\\xA7','shy':'\\xAD','sup1':'\\xB9','sup2':'\\xB2','sup3':'\\xB3','szlig':'\\xDF','thorn':'\\xFE','THORN':'\\xDE','times':'\\xD7','uacute':'\\xFA','Uacute':'\\xDA','ucirc':'\\xFB','Ucirc':'\\xDB','ugrave':'\\xF9','Ugrave':'\\xD9','uml':'\\xA8','uuml':'\\xFC','Uuml':'\\xDC','yacute':'\\xFD','Yacute':'\\xDD','yen':'\\xA5','yuml':'\\xFF'};\n\tvar decodeMapNumeric = {'0':'\\uFFFD','128':'\\u20AC','130':'\\u201A','131':'\\u0192','132':'\\u201E','133':'\\u2026','134':'\\u2020','135':'\\u2021','136':'\\u02C6','137':'\\u2030','138':'\\u0160','139':'\\u2039','140':'\\u0152','142':'\\u017D','145':'\\u2018','146':'\\u2019','147':'\\u201C','148':'\\u201D','149':'\\u2022','150':'\\u2013','151':'\\u2014','152':'\\u02DC','153':'\\u2122','154':'\\u0161','155':'\\u203A','156':'\\u0153','158':'\\u017E','159':'\\u0178'};\n\tvar invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\tvar object = {};\n\tvar hasOwnProperty = object.hasOwnProperty;\n\tvar has = function(object, propertyName) {\n\t\treturn hasOwnProperty.call(object, propertyName);\n\t};\n\n\tvar contains = function(array, value) {\n\t\tvar index = -1;\n\t\tvar length = array.length;\n\t\twhile (++index < length) {\n\t\t\tif (array[index] == value) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\tvar merge = function(options, defaults) {\n\t\tif (!options) {\n\t\t\treturn defaults;\n\t\t}\n\t\tvar result = {};\n\t\tvar key;\n\t\tfor (key in defaults) {\n\t\t\t// A `hasOwnProperty` check is not needed here, since only recognized\n\t\t\t// option names are used anyway. Any others are ignored.\n\t\t\tresult[key] = has(options, key) ? options[key] : defaults[key];\n\t\t}\n\t\treturn result;\n\t};\n\n\t// Modified version of `ucs2encode`; see https://mths.be/punycode.\n\tvar codePointToSymbol = function(codePoint, strict) {\n\t\tvar output = '';\n\t\tif ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {\n\t\t\t// See issue #4:\n\t\t\t// “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is\n\t\t\t// greater than 0x10FFFF, then this is a parse error. Return a U+FFFD\n\t\t\t// REPLACEMENT CHARACTER.”\n\t\t\tif (strict) {\n\t\t\t\tparseError('character reference outside the permissible Unicode range');\n\t\t\t}\n\t\t\treturn '\\uFFFD';\n\t\t}\n\t\tif (has(decodeMapNumeric, codePoint)) {\n\t\t\tif (strict) {\n\t\t\t\tparseError('disallowed character reference');\n\t\t\t}\n\t\t\treturn decodeMapNumeric[codePoint];\n\t\t}\n\t\tif (strict && contains(invalidReferenceCodePoints, codePoint)) {\n\t\t\tparseError('disallowed character reference');\n\t\t}\n\t\tif (codePoint > 0xFFFF) {\n\t\t\tcodePoint -= 0x10000;\n\t\t\toutput += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);\n\t\t\tcodePoint = 0xDC00 | codePoint & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(codePoint);\n\t\treturn output;\n\t};\n\n\tvar hexEscape = function(codePoint) {\n\t\treturn '&#x' + codePoint.toString(16).toUpperCase() + ';';\n\t};\n\n\tvar decEscape = function(codePoint) {\n\t\treturn '&#' + codePoint + ';';\n\t};\n\n\tvar parseError = function(message) {\n\t\tthrow Error('Parse error: ' + message);\n\t};\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar encode = function(string, options) {\n\t\toptions = merge(options, encode.options);\n\t\tvar strict = options.strict;\n\t\tif (strict && regexInvalidRawCodePoint.test(string)) {\n\t\t\tparseError('forbidden code point');\n\t\t}\n\t\tvar encodeEverything = options.encodeEverything;\n\t\tvar useNamedReferences = options.useNamedReferences;\n\t\tvar allowUnsafeSymbols = options.allowUnsafeSymbols;\n\t\tvar escapeCodePoint = options.decimal ? decEscape : hexEscape;\n\n\t\tvar escapeBmpSymbol = function(symbol) {\n\t\t\treturn escapeCodePoint(symbol.charCodeAt(0));\n\t\t};\n\n\t\tif (encodeEverything) {\n\t\t\t// Encode ASCII symbols.\n\t\t\tstring = string.replace(regexAsciiWhitelist, function(symbol) {\n\t\t\t\t// Use named references if requested & possible.\n\t\t\t\tif (useNamedReferences && has(encodeMap, symbol)) {\n\t\t\t\t\treturn '&' + encodeMap[symbol] + ';';\n\t\t\t\t}\n\t\t\t\treturn escapeBmpSymbol(symbol);\n\t\t\t});\n\t\t\t// Shorten a few escapes that represent two symbols, of which at least one\n\t\t\t// is within the ASCII range.\n\t\t\tif (useNamedReferences) {\n\t\t\t\tstring = string\n\t\t\t\t\t.replace(/&gt;\\u20D2/g, '&nvgt;')\n\t\t\t\t\t.replace(/&lt;\\u20D2/g, '&nvlt;')\n\t\t\t\t\t.replace(/&#x66;&#x6A;/g, '&fjlig;');\n\t\t\t}\n\t\t\t// Encode non-ASCII symbols.\n\t\t\tif (useNamedReferences) {\n\t\t\t\t// Encode non-ASCII symbols that can be replaced with a named reference.\n\t\t\t\tstring = string.replace(regexEncodeNonAscii, function(string) {\n\t\t\t\t\t// Note: there is no need to check `has(encodeMap, string)` here.\n\t\t\t\t\treturn '&' + encodeMap[string] + ';';\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Note: any remaining non-ASCII symbols are handled outside of the `if`.\n\t\t} else if (useNamedReferences) {\n\t\t\t// Apply named character references.\n\t\t\t// Encode `<>\"'&` using named character references.\n\t\t\tif (!allowUnsafeSymbols) {\n\t\t\t\tstring = string.replace(regexEscape, function(string) {\n\t\t\t\t\treturn '&' + encodeMap[string] + ';'; // no need to check `has()` here\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Shorten escapes that represent two symbols, of which at least one is\n\t\t\t// `<>\"'&`.\n\t\t\tstring = string\n\t\t\t\t.replace(/&gt;\\u20D2/g, '&nvgt;')\n\t\t\t\t.replace(/&lt;\\u20D2/g, '&nvlt;');\n\t\t\t// Encode non-ASCII symbols that can be replaced with a named reference.\n\t\t\tstring = string.replace(regexEncodeNonAscii, function(string) {\n\t\t\t\t// Note: there is no need to check `has(encodeMap, string)` here.\n\t\t\t\treturn '&' + encodeMap[string] + ';';\n\t\t\t});\n\t\t} else if (!allowUnsafeSymbols) {\n\t\t\t// Encode `<>\"'&` using hexadecimal escapes, now that they’re not handled\n\t\t\t// using named character references.\n\t\t\tstring = string.replace(regexEscape, escapeBmpSymbol);\n\t\t}\n\t\treturn string\n\t\t\t// Encode astral symbols.\n\t\t\t.replace(regexAstralSymbols, function($0) {\n\t\t\t\t// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\t\t\t\tvar high = $0.charCodeAt(0);\n\t\t\t\tvar low = $0.charCodeAt(1);\n\t\t\t\tvar codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;\n\t\t\t\treturn escapeCodePoint(codePoint);\n\t\t\t})\n\t\t\t// Encode any remaining BMP symbols that are not printable ASCII symbols\n\t\t\t// using a hexadecimal escape.\n\t\t\t.replace(regexBmpWhitelist, escapeBmpSymbol);\n\t};\n\t// Expose default options (so they can be overridden globally).\n\tencode.options = {\n\t\t'allowUnsafeSymbols': false,\n\t\t'encodeEverything': false,\n\t\t'strict': false,\n\t\t'useNamedReferences': false,\n\t\t'decimal' : false\n\t};\n\n\tvar decode = function(html, options) {\n\t\toptions = merge(options, decode.options);\n\t\tvar strict = options.strict;\n\t\tif (strict && regexInvalidEntity.test(html)) {\n\t\t\tparseError('malformed character reference');\n\t\t}\n\t\treturn html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) {\n\t\t\tvar codePoint;\n\t\t\tvar semicolon;\n\t\t\tvar decDigits;\n\t\t\tvar hexDigits;\n\t\t\tvar reference;\n\t\t\tvar next;\n\n\t\t\tif ($1) {\n\t\t\t\treference = $1;\n\t\t\t\t// Note: there is no need to check `has(decodeMap, reference)`.\n\t\t\t\treturn decodeMap[reference];\n\t\t\t}\n\n\t\t\tif ($2) {\n\t\t\t\t// Decode named character references without trailing `;`, e.g. `&amp`.\n\t\t\t\t// This is only a parse error if it gets converted to `&`, or if it is\n\t\t\t\t// followed by `=` in an attribute context.\n\t\t\t\treference = $2;\n\t\t\t\tnext = $3;\n\t\t\t\tif (next && options.isAttributeValue) {\n\t\t\t\t\tif (strict && next == '=') {\n\t\t\t\t\t\tparseError('`&` did not start a character reference');\n\t\t\t\t\t}\n\t\t\t\t\treturn $0;\n\t\t\t\t} else {\n\t\t\t\t\tif (strict) {\n\t\t\t\t\t\tparseError(\n\t\t\t\t\t\t\t'named character reference was not terminated by a semicolon'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Note: there is no need to check `has(decodeMapLegacy, reference)`.\n\t\t\t\t\treturn decodeMapLegacy[reference] + (next || '');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($4) {\n\t\t\t\t// Decode decimal escapes, e.g. `&#119558;`.\n\t\t\t\tdecDigits = $4;\n\t\t\t\tsemicolon = $5;\n\t\t\t\tif (strict && !semicolon) {\n\t\t\t\t\tparseError('character reference was not terminated by a semicolon');\n\t\t\t\t}\n\t\t\t\tcodePoint = parseInt(decDigits, 10);\n\t\t\t\treturn codePointToSymbol(codePoint, strict);\n\t\t\t}\n\n\t\t\tif ($6) {\n\t\t\t\t// Decode hexadecimal escapes, e.g. `&#x1D306;`.\n\t\t\t\thexDigits = $6;\n\t\t\t\tsemicolon = $7;\n\t\t\t\tif (strict && !semicolon) {\n\t\t\t\t\tparseError('character reference was not terminated by a semicolon');\n\t\t\t\t}\n\t\t\t\tcodePoint = parseInt(hexDigits, 16);\n\t\t\t\treturn codePointToSymbol(codePoint, strict);\n\t\t\t}\n\n\t\t\t// If we’re still here, `if ($7)` is implied; it’s an ambiguous\n\t\t\t// ampersand for sure. https://mths.be/notes/ambiguous-ampersands\n\t\t\tif (strict) {\n\t\t\t\tparseError(\n\t\t\t\t\t'named character reference was not terminated by a semicolon'\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn $0;\n\t\t});\n\t};\n\t// Expose default options (so they can be overridden globally).\n\tdecode.options = {\n\t\t'isAttributeValue': false,\n\t\t'strict': false\n\t};\n\n\tvar escape = function(string) {\n\t\treturn string.replace(regexEscape, function($0) {\n\t\t\t// Note: there is no need to check `has(escapeMap, $0)` here.\n\t\t\treturn escapeMap[$0];\n\t\t});\n\t};\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar he = {\n\t\t'version': '1.2.0',\n\t\t'encode': encode,\n\t\t'decode': decode,\n\t\t'escape': escape,\n\t\t'unescape': decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn he;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = he;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (var key in he) {\n\t\t\t\thas(he, key) && (freeExports[key] = he[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.he = he;\n\t}\n\n}(this));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/he/man/he.1",
    "content": ".Dd April 5, 2016\n.Dt he 1\n.Sh NAME\n.Nm he\n.Nd encode/decode HTML entities just like a browser would\n.Sh SYNOPSIS\n.Nm\n.Op Fl -escape Ar string\n.br\n.Op Fl -encode Ar string\n.br\n.Op Fl -encode Fl -use-named-refs Fl -everything Fl -allow-unsafe Ar string\n.br\n.Op Fl -decode Ar string\n.br\n.Op Fl -decode Fl -attribute Ar string\n.br\n.Op Fl -decode Fl -strict Ar string\n.br\n.Op Fl v | -version\n.br\n.Op Fl h | -help\n.Sh DESCRIPTION\n.Nm\nencodes/decodes HTML entities in strings just like a browser would.\n.Sh OPTIONS\n.Bl -ohang -offset\n.It Sy \"--escape\"\nTake a string of text and escape it for use in text contexts in XML or HTML documents. Only the following characters are escaped: `&`, `<`, `>`, `\"`, and `'`.\n.It Sy \"--encode\"\nTake a string of text and encode any symbols that aren't printable ASCII symbols and that can be replaced with character references. For example, it would turn `©` into `&#xA9;`, but it wouldn't turn `+` into `&#x2B;` since there is no point in doing so. Additionally, it replaces any remaining non-ASCII symbols with a hexadecimal escape sequence (e.g. `&#x1D306;`). The return value of this function is always valid HTML.\n.It Sy \"--encode --use-named-refs\"\nEnable the use of named character references (like `&copy;`) in the output. If compatibility with older browsers is a concern, don't use this option.\n.It Sy \"--encode --everything\"\nEncode every symbol in the input string, even safe printable ASCII symbols.\n.It Sy \"--encode --allow-unsafe\"\nEncode non-ASCII characters only. This leaves unsafe HTML/XML symbols like `&`, `<`, `>`, `\"`, and `'` intact.\n.It Sy \"--encode --decimal\"\nUse decimal digits rather than hexadecimal digits for encoded character references, e.g. output `&#169;` instead of `&#xA9;`.\n.It Sy \"--decode\"\nTakes a string of HTML and decode any named and numerical character references in it using the algorithm described in the HTML spec.\n.It Sy \"--decode --attribute\"\nParse the input as if it was an HTML attribute value rather than a string in an HTML text content.\n.It Sy \"--decode --strict\"\nThrow an error if an invalid character reference is encountered.\n.It Sy \"-v, --version\"\nPrint he's version.\n.It Sy \"-h, --help\"\nShow the help screen.\n.El\n.Sh EXIT STATUS\nThe\n.Nm he\nutility exits with one of the following values:\n.Pp\n.Bl -tag -width flag -compact\n.It Li 0\n.Nm\ndid what it was instructed to do successfully; either it encoded/decoded the input and printed the result, or it printed the version or usage message.\n.It Li 1\n.Nm\nencountered an error.\n.El\n.Sh EXAMPLES\n.Bl -ohang -offset\n.It Sy \"he --escape '<script>alert(1)</script>'\"\nPrint an escaped version of the given string that is safe for use in HTML text contexts, escaping only `&`, `<`, `>`, `\"`, and `'`.\n.It Sy \"he --decode '&copy;&#x1D306;'\"\nPrint the decoded version of the given HTML string.\n.It Sy \"echo\\ '&copy;&#x1D306;'\\ |\\ he --decode\"\nPrint the decoded version of the HTML string that gets piped in.\n.El\n.Sh BUGS\nhe's bug tracker is located at <https://github.com/mathiasbynens/he/issues>.\n.Sh AUTHOR\nMathias Bynens <https://mathiasbynens.be/>\n.Sh WWW\n<https://mths.be/he>\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/he/package.json",
    "content": "{\n  \"name\": \"he\",\n  \"version\": \"1.2.0\",\n  \"description\": \"A robust HTML entities encoder/decoder with full Unicode support.\",\n  \"homepage\": \"https://mths.be/he\",\n  \"main\": \"he.js\",\n  \"bin\": \"bin/he\",\n  \"keywords\": [\n    \"string\",\n    \"entities\",\n    \"entity\",\n    \"html\",\n    \"encode\",\n    \"decode\",\n    \"unicode\"\n  ],\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"Mathias Bynens\",\n    \"url\": \"https://mathiasbynens.be/\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/mathiasbynens/he.git\"\n  },\n  \"bugs\": \"https://github.com/mathiasbynens/he/issues\",\n  \"files\": [\n    \"LICENSE-MIT.txt\",\n    \"he.js\",\n    \"bin/\",\n    \"man/\"\n  ],\n  \"directories\": {\n    \"bin\": \"bin\",\n    \"man\": \"man\",\n    \"test\": \"tests\"\n  },\n  \"scripts\": {\n    \"test\": \"node tests/tests.js\",\n    \"build\": \"grunt build\"\n  },\n  \"devDependencies\": {\n    \"codecov.io\": \"^0.1.6\",\n    \"grunt\": \"^0.4.5\",\n    \"grunt-cli\": \"^1.3.1\",\n    \"grunt-shell\": \"^1.1.1\",\n    \"grunt-template\": \"^0.2.3\",\n    \"istanbul\": \"^0.4.2\",\n    \"jsesc\": \"^1.0.0\",\n    \"lodash\": \"^4.8.2\",\n    \"qunit-extras\": \"^1.4.5\",\n    \"qunitjs\": \"~1.11.0\",\n    \"regenerate\": \"^1.2.1\",\n    \"regexgen\": \"^1.3.0\",\n    \"requirejs\": \"^2.1.22\",\n    \"sort-object\": \"^3.0.2\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/html-encoding-sniffer/LICENSE.txt",
    "content": "Copyright © Domenic Denicola <d@domenic.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/html-encoding-sniffer/README.md",
    "content": "# Determine the Encoding of a HTML Byte Stream\n\nThis package implements the HTML Standard's [encoding sniffing algorithm](https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm) in all its glory. The most interesting part of this is how it pre-scans the first 1024 bytes in order to search for certain `<meta charset>`-related patterns.\n\n```js\nconst htmlEncodingSniffer = require(\"html-encoding-sniffer\");\nconst fs = require(\"fs\");\n\nconst htmlBytes = fs.readFileSync(\"./html-page.html\");\nconst sniffedEncoding = htmlEncodingSniffer(htmlBytes);\n```\n\nThe passed bytes are given as a `Uint8Array`; the Node.js `Buffer` subclass of `Uint8Array` will also work, as shown above.\n\nThe returned value will be a canonical [encoding name](https://encoding.spec.whatwg.org/#names-and-labels) (not a label). You might then combine this with the [whatwg-encoding](https://github.com/jsdom/whatwg-encoding) package to decode the result:\n\n```js\nconst whatwgEncoding = require(\"whatwg-encoding\");\nconst htmlString = whatwgEncoding.decode(htmlBytes, sniffedEncoding);\n```\n\n## Options\n\nYou can pass two potential options to `htmlEncodingSniffer`:\n\n```js\nconst sniffedEncoding = htmlEncodingSniffer(htmlBytes, {\n  transportLayerEncodingLabel,\n  defaultEncoding\n});\n```\n\nThese represent two possible inputs into the [encoding sniffing algorithm](https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm):\n\n- `transportLayerEncodingLabel` is an encoding label that is obtained from the \"transport layer\" (probably a HTTP `Content-Type` header), which overrides everything but a BOM.\n- `defaultEncoding` is the ultimate fallback encoding used if no valid encoding is supplied by the transport layer, and no encoding is sniffed from the bytes. It defaults to `\"windows-1252\"`, as recommended by the algorithm's table of suggested defaults for \"All other locales\" (including the `en` locale).\n\n## Credits\n\nThis package was originally based on the excellent work of [@nicolashenry](https://github.com/nicolashenry), [in jsdom](https://github.com/tmpvar/jsdom/blob/16fd85618f2705d181232f6552125872a37164bc/lib/jsdom/living/helpers/encoding.js). It has since been pulled out into this separate package.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/html-encoding-sniffer/lib/html-encoding-sniffer.js",
    "content": "\"use strict\";\nconst whatwgEncoding = require(\"whatwg-encoding\");\n\n// https://html.spec.whatwg.org/#encoding-sniffing-algorithm\nmodule.exports = (uint8Array, { transportLayerEncodingLabel, defaultEncoding = \"windows-1252\" } = {}) => {\n  let encoding = whatwgEncoding.getBOMEncoding(uint8Array);\n\n  if (encoding === null && transportLayerEncodingLabel !== undefined) {\n    encoding = whatwgEncoding.labelToName(transportLayerEncodingLabel);\n  }\n\n  if (encoding === null) {\n    encoding = prescanMetaCharset(uint8Array);\n  }\n\n  if (encoding === null) {\n    encoding = defaultEncoding;\n  }\n\n  return encoding;\n};\n\n// https://html.spec.whatwg.org/multipage/syntax.html#prescan-a-byte-stream-to-determine-its-encoding\nfunction prescanMetaCharset(uint8Array) {\n  const l = Math.min(uint8Array.byteLength, 1024);\n  for (let i = 0; i < l; i++) {\n    let c = uint8Array[i];\n    if (c === 0x3C) {\n      // \"<\"\n      const c1 = uint8Array[i + 1];\n      const c2 = uint8Array[i + 2];\n      const c3 = uint8Array[i + 3];\n      const c4 = uint8Array[i + 4];\n      const c5 = uint8Array[i + 5];\n      // !-- (comment start)\n      if (c1 === 0x21 && c2 === 0x2D && c3 === 0x2D) {\n        i += 4;\n        for (; i < l; i++) {\n          c = uint8Array[i];\n          const cMinus1 = uint8Array[i - 1];\n          const cMinus2 = uint8Array[i - 2];\n          // --> (comment end)\n          if (c === 0x3E && cMinus1 === 0x2D && cMinus2 === 0x2D) {\n            break;\n          }\n        }\n      } else if ((c1 === 0x4D || c1 === 0x6D) &&\n         (c2 === 0x45 || c2 === 0x65) &&\n         (c3 === 0x54 || c3 === 0x74) &&\n         (c4 === 0x41 || c4 === 0x61) &&\n         (isSpaceCharacter(c5) || c5 === 0x2F)) {\n        // \"meta\" + space or /\n        i += 6;\n        const attributeList = new Set();\n        let gotPragma = false;\n        let needPragma = null;\n        let charset = null;\n\n        let attrRes;\n        do {\n          attrRes = getAttribute(uint8Array, i, l);\n          if (attrRes.attr && !attributeList.has(attrRes.attr.name)) {\n            attributeList.add(attrRes.attr.name);\n            if (attrRes.attr.name === \"http-equiv\") {\n              gotPragma = attrRes.attr.value === \"content-type\";\n            } else if (attrRes.attr.name === \"content\" && !charset) {\n              charset = extractCharacterEncodingFromMeta(attrRes.attr.value);\n              if (charset !== null) {\n                needPragma = true;\n              }\n            } else if (attrRes.attr.name === \"charset\") {\n              charset = whatwgEncoding.labelToName(attrRes.attr.value);\n              needPragma = false;\n            }\n          }\n          i = attrRes.i;\n        } while (attrRes.attr);\n\n        if (needPragma === null) {\n          continue;\n        }\n        if (needPragma === true && gotPragma === false) {\n          continue;\n        }\n        if (charset === null) {\n          continue;\n        }\n\n        if (charset === \"UTF-16LE\" || charset === \"UTF-16BE\") {\n          charset = \"UTF-8\";\n        }\n        if (charset === \"x-user-defined\") {\n          charset = \"windows-1252\";\n        }\n\n        return charset;\n      } else if ((c1 >= 0x41 && c1 <= 0x5A) || (c1 >= 0x61 && c1 <= 0x7A)) {\n        // a-z or A-Z\n        for (i += 2; i < l; i++) {\n          c = uint8Array[i];\n          // space or >\n          if (isSpaceCharacter(c) || c === 0x3E) {\n            break;\n          }\n        }\n        let attrRes;\n        do {\n          attrRes = getAttribute(uint8Array, i, l);\n          i = attrRes.i;\n        } while (attrRes.attr);\n      } else if (c1 === 0x21 || c1 === 0x2F || c1 === 0x3F) {\n        // ! or / or ?\n        for (i += 2; i < l; i++) {\n          c = uint8Array[i];\n          // >\n          if (c === 0x3E) {\n            break;\n          }\n        }\n      }\n    }\n  }\n  return null;\n}\n\n// https://html.spec.whatwg.org/multipage/syntax.html#concept-get-attributes-when-sniffing\nfunction getAttribute(uint8Array, i, l) {\n  for (; i < l; i++) {\n    let c = uint8Array[i];\n    // space or /\n    if (isSpaceCharacter(c) || c === 0x2F) {\n      continue;\n    }\n    // \">\"\n    if (c === 0x3E) {\n      break;\n    }\n    let name = \"\";\n    let value = \"\";\n    nameLoop:for (; i < l; i++) {\n      c = uint8Array[i];\n      // \"=\"\n      if (c === 0x3D && name !== \"\") {\n        i++;\n        break;\n      }\n      // space\n      if (isSpaceCharacter(c)) {\n        for (i++; i < l; i++) {\n          c = uint8Array[i];\n          // space\n          if (isSpaceCharacter(c)) {\n            continue;\n          }\n          // not \"=\"\n          if (c !== 0x3D) {\n            return { attr: { name, value }, i };\n          }\n\n          i++;\n          break nameLoop;\n        }\n        break;\n      }\n      // / or >\n      if (c === 0x2F || c === 0x3E) {\n        return { attr: { name, value }, i };\n      }\n      // A-Z\n      if (c >= 0x41 && c <= 0x5A) {\n        name += String.fromCharCode(c + 0x20); // lowercase\n      } else {\n        name += String.fromCharCode(c);\n      }\n    }\n    c = uint8Array[i];\n    // space\n    if (isSpaceCharacter(c)) {\n      for (i++; i < l; i++) {\n        c = uint8Array[i];\n        // space\n        if (isSpaceCharacter(c)) {\n          continue;\n        } else {\n          break;\n        }\n      }\n    }\n    // \" or '\n    if (c === 0x22 || c === 0x27) {\n      const quote = c;\n      for (i++; i < l; i++) {\n        c = uint8Array[i];\n\n        if (c === quote) {\n          i++;\n          return { attr: { name, value }, i };\n        }\n\n        // A-Z\n        if (c >= 0x41 && c <= 0x5A) {\n          value += String.fromCharCode(c + 0x20); // lowercase\n        } else {\n          value += String.fromCharCode(c);\n        }\n      }\n    }\n\n    // >\n    if (c === 0x3E) {\n      return { attr: { name, value }, i };\n    }\n\n    // A-Z\n    if (c >= 0x41 && c <= 0x5A) {\n      value += String.fromCharCode(c + 0x20); // lowercase\n    } else {\n      value += String.fromCharCode(c);\n    }\n\n    for (i++; i < l; i++) {\n      c = uint8Array[i];\n\n      // space or >\n      if (isSpaceCharacter(c) || c === 0x3E) {\n        return { attr: { name, value }, i };\n      }\n\n      // A-Z\n      if (c >= 0x41 && c <= 0x5A) {\n        value += String.fromCharCode(c + 0x20); // lowercase\n      } else {\n        value += String.fromCharCode(c);\n      }\n    }\n  }\n  return { i };\n}\n\nfunction extractCharacterEncodingFromMeta(string) {\n  let position = 0;\n\n  while (true) {\n    const indexOfCharset = string.substring(position).search(/charset/ui);\n\n    if (indexOfCharset === -1) {\n      return null;\n    }\n    let subPosition = position + indexOfCharset + \"charset\".length;\n\n    while (isSpaceCharacter(string[subPosition].charCodeAt(0))) {\n      ++subPosition;\n    }\n\n    if (string[subPosition] !== \"=\") {\n      position = subPosition - 1;\n      continue;\n    }\n\n    ++subPosition;\n\n    while (isSpaceCharacter(string[subPosition].charCodeAt(0))) {\n      ++subPosition;\n    }\n\n    position = subPosition;\n    break;\n  }\n\n  if (string[position] === \"\\\"\" || string[position] === \"'\") {\n    const nextIndex = string.indexOf(string[position], position + 1);\n\n    if (nextIndex !== -1) {\n      return whatwgEncoding.labelToName(string.substring(position + 1, nextIndex));\n    }\n\n    // It is an unmatched quotation mark\n    return null;\n  }\n\n  if (string.length === position + 1) {\n    return null;\n  }\n\n  const indexOfASCIIWhitespaceOrSemicolon = string.substring(position + 1).search(/\\x09|\\x0A|\\x0C|\\x0D|\\x20|;/u);\n  const end = indexOfASCIIWhitespaceOrSemicolon === -1 ?\n    string.length :\n    position + indexOfASCIIWhitespaceOrSemicolon + 1;\n\n  return whatwgEncoding.labelToName(string.substring(position, end));\n}\n\nfunction isSpaceCharacter(c) {\n  return c === 0x09 || c === 0x0A || c === 0x0C || c === 0x0D || c === 0x20;\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/html-encoding-sniffer/package.json",
    "content": "{\n  \"name\": \"html-encoding-sniffer\",\n  \"description\": \"Sniff the encoding from a HTML byte stream\",\n  \"keywords\": [\n    \"encoding\",\n    \"html\"\n  ],\n  \"version\": \"3.0.0\",\n  \"author\": \"Domenic Denicola <d@domenic.me> (https://domenic.me/)\",\n  \"license\": \"MIT\",\n  \"repository\": \"jsdom/html-encoding-sniffer\",\n  \"main\": \"lib/html-encoding-sniffer.js\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"test\": \"mocha\",\n    \"lint\": \"eslint .\"\n  },\n  \"dependencies\": {\n    \"whatwg-encoding\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@domenic/eslint-config\": \"^1.4.0\",\n    \"eslint\": \"^7.32.0\",\n    \"mocha\": \"^9.1.1\"\n  },\n  \"engines\": {\n    \"node\": \">=12\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/.auto-changelog",
    "content": "{\n  \"output\": \"CHANGELOG.md\",\n  \"template\": \"keepachangelog\",\n  \"unreleased\": true,\n  \"commitLimit\": false\n}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/.gitattributes",
    "content": "package-lock.json binary\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\nGenerated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).\n\n## [v1.18.1](https://github.com/http-party/node-http-proxy/compare/1.18.0...v1.18.1) - 2020-05-17\n\n### Merged\n\n- Skip sending the proxyReq event when the expect header is present [`#1447`](https://github.com/http-party/node-http-proxy/pull/1447)\n- Remove node6 support, add node12 to build [`#1397`](https://github.com/http-party/node-http-proxy/pull/1397)\n\n## [1.18.0](https://github.com/http-party/node-http-proxy/compare/1.17.0...1.18.0) - 2019-09-18\n\n### Merged\n\n- Added in auto-changelog module set to keepachangelog format [`#1373`](https://github.com/http-party/node-http-proxy/pull/1373)\n- fix 'Modify Response' readme section to avoid unnecessary array copying [`#1300`](https://github.com/http-party/node-http-proxy/pull/1300)\n- Fix incorrect target name for reverse proxy example [`#1135`](https://github.com/http-party/node-http-proxy/pull/1135)\n- Fix modify response middleware example [`#1139`](https://github.com/http-party/node-http-proxy/pull/1139)\n- [dist] Update dependency async to v3 [`#1359`](https://github.com/http-party/node-http-proxy/pull/1359)\n- Fix path to local http-proxy in examples. [`#1072`](https://github.com/http-party/node-http-proxy/pull/1072)\n- fix reverse-proxy example require path [`#1067`](https://github.com/http-party/node-http-proxy/pull/1067)\n- Update README.md [`#970`](https://github.com/http-party/node-http-proxy/pull/970)\n- [dist] Update dependency request to ~2.88.0 [SECURITY] [`#1357`](https://github.com/http-party/node-http-proxy/pull/1357)\n- [dist] Update dependency eventemitter3 to v4 [`#1365`](https://github.com/http-party/node-http-proxy/pull/1365)\n- [dist] Update dependency colors to v1 [`#1360`](https://github.com/http-party/node-http-proxy/pull/1360)\n- [dist] Update all non-major dependencies [`#1356`](https://github.com/http-party/node-http-proxy/pull/1356)\n- [dist] Update dependency agentkeepalive to v4 [`#1358`](https://github.com/http-party/node-http-proxy/pull/1358)\n- [dist] Update dependency nyc to v14 [`#1367`](https://github.com/http-party/node-http-proxy/pull/1367)\n- [dist] Update dependency concat-stream to v2 [`#1363`](https://github.com/http-party/node-http-proxy/pull/1363)\n- x-forwarded-host overwrite for mutli level proxies [`#1267`](https://github.com/http-party/node-http-proxy/pull/1267)\n- [refactor doc] Complete rename to http-party org. [`#1362`](https://github.com/http-party/node-http-proxy/pull/1362)\n- Highlight correct lines for createProxyServer [`#1117`](https://github.com/http-party/node-http-proxy/pull/1117)\n- Fix docs for rewrite options - 201 also handled [`#1147`](https://github.com/http-party/node-http-proxy/pull/1147)\n- Update .nyc_output [`#1339`](https://github.com/http-party/node-http-proxy/pull/1339)\n- Configure Renovate [`#1355`](https://github.com/http-party/node-http-proxy/pull/1355)\n- [examples] Restream body before proxying, support for Content-Type of application/x-www-form-urlencoded [`#1264`](https://github.com/http-party/node-http-proxy/pull/1264)\n\n### Commits\n\n- [dist] New test fixtures. [`7e4a0e5`](https://github.com/http-party/node-http-proxy/commit/7e4a0e511bc30c059216860153301de2cdd1e97f)\n- [dist] End of an era. [`a9b09cc`](https://github.com/http-party/node-http-proxy/commit/a9b09cce43f072db99fb5170030a05536177ccb7)\n- [dist] Version bump. 1.18.0 [`9bbe486`](https://github.com/http-party/node-http-proxy/commit/9bbe486c5efcc356fb4d189ef38eee275bbde345)\n- [fix] Latest versions. [`59c4403`](https://github.com/http-party/node-http-proxy/commit/59c4403e9dc15ab9b19ee2a3f4aecbfc6c3d94c4)\n- [fix test] Update tests. [`dd1d08b`](https://github.com/http-party/node-http-proxy/commit/dd1d08b6319d1def729554446a5b0176978a8dad)\n- [dist] Update dependency ws to v3 [SECURITY] [`b00911c`](https://github.com/http-party/node-http-proxy/commit/b00911c93740a00c5cfbacbb91565cb6912ed255)\n- [dist] .gitattributes all the things. [`fc93520`](https://github.com/http-party/node-http-proxy/commit/fc93520d741ec80be8ae31ca005f3e9c199e330e)\n- [dist] Regenerate package-lock.json. [`16d4f8a`](https://github.com/http-party/node-http-proxy/commit/16d4f8a95162b2e2e4ee6657c500f1208c044b2d)\n\n## [1.17.0](https://github.com/http-party/node-http-proxy/compare/1.16.2...1.17.0) - 2018-04-20\n\n### Merged\n\n- Fix overwriting of global options [`#1074`](https://github.com/http-party/node-http-proxy/pull/1074)\n- Update README.md [`#1131`](https://github.com/http-party/node-http-proxy/pull/1131)\n- Update README.md with CoC link [`#1120`](https://github.com/http-party/node-http-proxy/pull/1120)\n- Add Code Of Conduct [`#1119`](https://github.com/http-party/node-http-proxy/pull/1119)\n- [deps] Update eventemitter3 to version 2.0.x [`#1109`](https://github.com/http-party/node-http-proxy/pull/1109)\n\n### Fixed\n\n- Fix \"Can't set headers after they are sent\" errors [`#930`](https://github.com/http-party/node-http-proxy/issues/930)\n- Include websocket non-upgrade response [`#890`](https://github.com/http-party/node-http-proxy/issues/890)\n\n### Commits\n\n- Add followRedirects option [`c9a556c`](https://github.com/http-party/node-http-proxy/commit/c9a556cfa57c7ce0b877e16f2c2e1448d8cc278d)\n- [test] add test for selfHandleRequest and remove modifyResponse as selfHandleRequest is the only way that functionality works [`4a37175`](https://github.com/http-party/node-http-proxy/commit/4a37175a5296d2ea2da0fc15a3f8fe08599bb592)\n- Adding ability to set cookie path [`2c98416`](https://github.com/http-party/node-http-proxy/commit/2c98416ac2bf17bb5f515b9e10ee4485f5913846)\n- Updating docs and adding more tests. [`f5c2381`](https://github.com/http-party/node-http-proxy/commit/f5c2381395e01bf8d6655cc70e14032c8f0aaa67)\n- [dist] make tests work reliably, add package-lock.json [`09dcb98`](https://github.com/http-party/node-http-proxy/commit/09dcb984565dabb159a01a75a188b974f8c176ad)\n- add support for modify response [`e5c02b8`](https://github.com/http-party/node-http-proxy/commit/e5c02b8a8a902e204eee886acafbbfe46c4a3aef)\n- [wip] proper tests and reporting [`f4ff100`](https://github.com/http-party/node-http-proxy/commit/f4ff1006b9e71eb4185a3edf03333dbe514a84c9)\n- Add detail about \"buffer\" option [`6f88caf`](https://github.com/http-party/node-http-proxy/commit/6f88caf6e46d84a809910c591e138250b333b39f)\n- Add use case for proxy to HTTPS using a PKCS12 client certificate [`d2f9db8`](https://github.com/http-party/node-http-proxy/commit/d2f9db824136358a06dc3dd566644f3a016f24e2)\n- [test] for override method feature [`81d58c5`](https://github.com/http-party/node-http-proxy/commit/81d58c531be3f61efb56d2489a66c73a7b2325fe)\n- [dist] doc updates [`e94d529`](https://github.com/http-party/node-http-proxy/commit/e94d52973a26cf817a9de12d97e5ae603093f70d)\n- feat: 添加response自处理参数 [`89f9ef8`](https://github.com/http-party/node-http-proxy/commit/89f9ef87e0532d54d086719c5ace1a968a42e51b)\n- [dist][test] codecov config [`a4bccc3`](https://github.com/http-party/node-http-proxy/commit/a4bccc332d36d7db93db984674cd7e51b43a1b99)\n- Removing unnecessary check since this is a private API [`bc6a237`](https://github.com/http-party/node-http-proxy/commit/bc6a23709c37c65b5b16cc802d05cb57f099b0ce)\n- issue #953: stop using writeHead [`2c44039`](https://github.com/http-party/node-http-proxy/commit/2c44039a7c30b190043da654ee7e5aed0304e979)\n- [fix] move badges [`543636d`](https://github.com/http-party/node-http-proxy/commit/543636d0f662308ec8c9afdbf641f4036f002bfd)\n- fix small typos in README [`8231984`](https://github.com/http-party/node-http-proxy/commit/8231984fb02dca331b4ef77e089db50855eea4f5)\n- Added timeout option to docs [`107c187`](https://github.com/http-party/node-http-proxy/commit/107c18720c3906f9049cc14d075b31910c0ccf55)\n- [dist] document the feature [`d533a1b`](https://github.com/http-party/node-http-proxy/commit/d533a1be437b37fed5bd25f5e58298eea819f974)\n- [fix] slightly more tolerant [`de1b808`](https://github.com/http-party/node-http-proxy/commit/de1b80851ab1b1251b5eaeaf0beab164024f09b6)\n- Forgot 'i' flag when changing from regex shorthand to string. [`50f58b4`](https://github.com/http-party/node-http-proxy/commit/50f58b4cd9b4422a11512a6a065432159b5bc806)\n- Update common.js [`c5d8466`](https://github.com/http-party/node-http-proxy/commit/c5d846648304f2e36a172b25d9fb8300d8131f8c)\n- [fix] rm newline [`e6f24ba`](https://github.com/http-party/node-http-proxy/commit/e6f24ba6173c4fdd26089b3c729de5dbdd71ad74)\n- [dist] update package-lock.json [`abf882e`](https://github.com/http-party/node-http-proxy/commit/abf882e03c92cf1665d5b7d4dbdaf87feb50a677)\n\n## [1.16.2](https://github.com/http-party/node-http-proxy/compare/1.16.1...1.16.2) - 2016-12-06\n\n### Merged\n\n- [WIP] Revert default behavior of writeHeaders method [`#1104`](https://github.com/http-party/node-http-proxy/pull/1104)\n\n## [1.16.1](https://github.com/http-party/node-http-proxy/compare/1.16.0...1.16.1) - 2016-12-04\n\n### Commits\n\n- Enable proxy response to have multiple Set-Cookie raw headers #1101 [`8cb451f`](https://github.com/http-party/node-http-proxy/commit/8cb451f20cff0a19fc9576fc2558307fb17a5710)\n- [dist] Version bump. 1.16.1 [`ac1a01b`](https://github.com/http-party/node-http-proxy/commit/ac1a01b1f3caa3a2a9433341bf5e7a95072d6612)\n\n## [1.16.0](https://github.com/http-party/node-http-proxy/compare/1.15.2...1.16.0) - 2016-12-02\n\n### Merged\n\n- Fix newly introduced error in error handler for ECONNREFUSED in forward proxy [`#1100`](https://github.com/http-party/node-http-proxy/pull/1100)\n- Keep original letter case of response header keys [`#1098`](https://github.com/http-party/node-http-proxy/pull/1098)\n- Handle errors for forward request, add test case [`#1099`](https://github.com/http-party/node-http-proxy/pull/1099)\n\n### Commits\n\n- add node 6 to travis [`2f7f037`](https://github.com/http-party/node-http-proxy/commit/2f7f03778cfb94396acf0d778061ea197212fbb5)\n\n## [1.15.2](https://github.com/http-party/node-http-proxy/compare/1.15.1...1.15.2) - 2016-10-22\n\n### Merged\n\n- Add proxy-timeout option to documentation [`#1075`](https://github.com/http-party/node-http-proxy/pull/1075)\n\n### Commits\n\n- Do not rely on func.name (no scope) [`61c2889`](https://github.com/http-party/node-http-proxy/commit/61c28891093b256bbc0dae78e45e2c5f0acf2101)\n- Do not rely on func.name (no scope) [`d48f67e`](https://github.com/http-party/node-http-proxy/commit/d48f67eb90d8af66211093e91efdd6638859e0bf)\n- Expose full callback names [`220f5fb`](https://github.com/http-party/node-http-proxy/commit/220f5fb795d2977c5a68ae59d7db65089efed50c)\n- test case added [`f5217d6`](https://github.com/http-party/node-http-proxy/commit/f5217d6c20c164ed412a3b20f660786b6f88b35b)\n- [fix] style nits [`d0f1dfe`](https://github.com/http-party/node-http-proxy/commit/d0f1dfeb8277d46a057017cd888b50e85f6725d6)\n- With a comment [`fbc2668`](https://github.com/http-party/node-http-proxy/commit/fbc266809c289fbdb59d7944345816a858303c96)\n- Fix browserification [`8eddf45`](https://github.com/http-party/node-http-proxy/commit/8eddf45f2a043e4e1b3f6e33c304e68fe7e1c406)\n- not setting connection header in case of http2 as it is deprecated [`2d01edc`](https://github.com/http-party/node-http-proxy/commit/2d01edc5a5ace591784022b85860a3bbc48c5e12)\n\n## [1.15.1](https://github.com/http-party/node-http-proxy/compare/1.15.0...1.15.1) - 2016-09-14\n\n### Merged\n\n- Properly write response header optionally including statusMessage [`#1061`](https://github.com/http-party/node-http-proxy/pull/1061)\n\n### Commits\n\n- [dist] Version bump. 1.15.1 [`912cd3a`](https://github.com/http-party/node-http-proxy/commit/912cd3acaef484f7ea08affc9339250082e04058)\n\n## [1.15.0](https://github.com/http-party/node-http-proxy/compare/1.14.0...1.15.0) - 2016-09-14\n\n### Merged\n\n- Made it not to crash with omited Host http header [`#1050`](https://github.com/http-party/node-http-proxy/pull/1050)\n- README.md: fix typo: 'ingoing' should be 'incoming' [`#1060`](https://github.com/http-party/node-http-proxy/pull/1060)\n- Fix for Reason-Phrase being overwritten on proxy response. [`#1051`](https://github.com/http-party/node-http-proxy/pull/1051)\n- cookieDomainRewrite option [`#1009`](https://github.com/http-party/node-http-proxy/pull/1009)\n- Update ntlm-authentication.js [`#1025`](https://github.com/http-party/node-http-proxy/pull/1025)\n- Restream body before proxying [`#1027`](https://github.com/http-party/node-http-proxy/pull/1027)\n- Location rewriting for responses with status 201 [`#1024`](https://github.com/http-party/node-http-proxy/pull/1024)\n- #866 Copy CA from options into outbound proxy [`#1042`](https://github.com/http-party/node-http-proxy/pull/1042)\n\n### Fixed\n\n- Restream body before proxying (#1027) [`#955`](https://github.com/http-party/node-http-proxy/issues/955)\n\n### Commits\n\n- [dist] Version bump. 1.15.0 [`b98c75b`](https://github.com/http-party/node-http-proxy/commit/b98c75b1ff3ebdf7f78224eb0d9aa857af2db1d9)\n\n## [1.14.0](https://github.com/http-party/node-http-proxy/compare/1.13.3...1.14.0) - 2016-06-15\n\n### Merged\n\n- Emit disconnected event instead of error when ECONNRESET [`#966`](https://github.com/http-party/node-http-proxy/pull/966)\n- fix test for node 0.10 + socket.io-client@1.4.6 (engine.io-client@1.6.9) [`#1010`](https://github.com/http-party/node-http-proxy/pull/1010)\n\n### Commits\n\n- [dist] Version bump. 1.14.0 [`fcfb0b3`](https://github.com/http-party/node-http-proxy/commit/fcfb0b37f6ac61369565507446377f91d955cf29)\n\n## [1.13.3](https://github.com/http-party/node-http-proxy/compare/1.13.2...1.13.3) - 2016-05-16\n\n### Merged\n\n- fix browserify compatibility [`#975`](https://github.com/http-party/node-http-proxy/pull/975)\n- alter message error [`#998`](https://github.com/http-party/node-http-proxy/pull/998)\n- Sanitize header keys before setting them [`#997`](https://github.com/http-party/node-http-proxy/pull/997)\n- Update ntlm-authentication.js [`#989`](https://github.com/http-party/node-http-proxy/pull/989)\n- Add expected datatype to readme [`#983`](https://github.com/http-party/node-http-proxy/pull/983)\n- Update README [`#982`](https://github.com/http-party/node-http-proxy/pull/982)\n- Fix formatting of the `headers` option [`#974`](https://github.com/http-party/node-http-proxy/pull/974)\n- Set the x-forwarded-host flag when xfwd is enabled [`#967`](https://github.com/http-party/node-http-proxy/pull/967)\n\n### Fixed\n\n- Sanitize header keys before setting them (#997) [`#996`](https://github.com/http-party/node-http-proxy/issues/996)\n\n### Commits\n\n- [dist] Update LICENSE to reflect 2015 changes. [`f345a1a`](https://github.com/http-party/node-http-proxy/commit/f345a1ac2dde1884e72b952a685a0a1796059f14)\n- [dist] Version bump. 1.13.3 [`5082acc`](https://github.com/http-party/node-http-proxy/commit/5082acc067bbf287f503bbd5b776f798ab169db1)\n\n## [1.13.2](https://github.com/http-party/node-http-proxy/compare/1.13.1...1.13.2) - 2016-02-17\n\n### Merged\n\n- Fixed missing documentation: #options.headers [`#806`](https://github.com/http-party/node-http-proxy/pull/806)\n- #949 Proxy example using req instead res on README [`#950`](https://github.com/http-party/node-http-proxy/pull/950)\n- mocha: Use default reporter [`#962`](https://github.com/http-party/node-http-proxy/pull/962)\n- Remove \"transfer-encoding\" header if \"content-length\" is set to zero [`#961`](https://github.com/http-party/node-http-proxy/pull/961)\n\n### Commits\n\n- [dist] Version bump. 1.13.2 [`e1b2f4c`](https://github.com/http-party/node-http-proxy/commit/e1b2f4c31b34464431db251b3b6169689dadf518)\n\n## [1.13.1](https://github.com/http-party/node-http-proxy/compare/1.13.0...1.13.1) - 2016-02-02\n\n### Merged\n\n- README.md: summary to specify reverse proxy [`#932`](https://github.com/http-party/node-http-proxy/pull/932)\n- fix(common) urlJoin replace: \":/\" -&gt; \"http?s:/\" [`#947`](https://github.com/http-party/node-http-proxy/pull/947)\n- Update README.md [`#948`](https://github.com/http-party/node-http-proxy/pull/948)\n\n### Commits\n\n- [dist] Version bump. 1.13.1 [`9d9fa94`](https://github.com/http-party/node-http-proxy/commit/9d9fa940cff3aa6134c60732c23aea8171fc7296)\n\n## [1.13.0](https://github.com/http-party/node-http-proxy/compare/1.12.1...1.13.0) - 2016-01-26\n\n### Merged\n\n- Fix for #839 (Ignore path and the trailing slash) [`#934`](https://github.com/http-party/node-http-proxy/pull/934)\n- Update license year range to 2016 [`#943`](https://github.com/http-party/node-http-proxy/pull/943)\n\n### Commits\n\n- [dist] Version bump. 1.13.0 [`268994e`](https://github.com/http-party/node-http-proxy/commit/268994ea45d9f8737343001ab9542e03023a5c96)\n\n## [1.12.1](https://github.com/http-party/node-http-proxy/compare/1.12.0...1.12.1) - 2016-01-24\n\n### Merged\n\n- Bump version for npm publish [`#942`](https://github.com/http-party/node-http-proxy/pull/942)\n- Added check to passes/web-outgoing.js to make sure the header being s… [`#940`](https://github.com/http-party/node-http-proxy/pull/940)\n- Created reverse-proxy.js example. [`#825`](https://github.com/http-party/node-http-proxy/pull/825)\n- SSE example and test [`#922`](https://github.com/http-party/node-http-proxy/pull/922)\n- More structured readme [`#912`](https://github.com/http-party/node-http-proxy/pull/912)\n- Updated markdown docs to mention proxy rules module [`#910`](https://github.com/http-party/node-http-proxy/pull/910)\n- Add tests for forwarding of continuation frames [`#901`](https://github.com/http-party/node-http-proxy/pull/901)\n- Bump requires-port, server and ws [`#904`](https://github.com/http-party/node-http-proxy/pull/904)\n- [example] add an example for NTLM authentication [`#903`](https://github.com/http-party/node-http-proxy/pull/903)\n\n### Commits\n\n- Organized README more [`cd1d777`](https://github.com/http-party/node-http-proxy/commit/cd1d7776e8fb5d67e2c52b9ef27d8c932e7b72e2)\n- Add tests for testing forwarding of continuation frames [`64fa520`](https://github.com/http-party/node-http-proxy/commit/64fa52078913c6d4fe95673f182aac4924961e8b)\n- Added back to top helpers [`6106d4c`](https://github.com/http-party/node-http-proxy/commit/6106d4c32f7c7960f0391591661e6f0d229db52d)\n- [ci] use node 4.2 to test and do not allow failures [`f82ce18`](https://github.com/http-party/node-http-proxy/commit/f82ce18d2f187b085c2c4f49d857755d21c582b1)\n- [fix] bump requires-port, server and ws [`9ea1e89`](https://github.com/http-party/node-http-proxy/commit/9ea1e89a2fd9c392cd40265bdb13494a3614e290)\n- Updated markdown docs to mention proxy rules [`eea79ca`](https://github.com/http-party/node-http-proxy/commit/eea79cab53f27371cad387a524ee3aaefa742c48)\n- Fixed tests depending on ignorePath [`f9540de`](https://github.com/http-party/node-http-proxy/commit/f9540de7b13f41091be2dcb68d8f23be65ad3885)\n- Added check to passes/web-outgoing.js to make sure the header being set is not undefined, which should be the only falsey value that could accidently show up and break that call. This fixes windows NTLM auth issues behind http-proxy. [`3b39d2c`](https://github.com/http-party/node-http-proxy/commit/3b39d2c3dcb1785cc06043fcb226c652f554941e)\n- No longer appends / to path if ignorePath is set [`f2093b5`](https://github.com/http-party/node-http-proxy/commit/f2093b5313c855cd6309cc0ddebb31f369e525ed)\n- README.md: introduction to specify reverse proxy [`41414a5`](https://github.com/http-party/node-http-proxy/commit/41414a56a11ddfac3a337711ac4c64124eb62377)\n- Added note for appending trailing / when using ignorePath [`0cb1d3c`](https://github.com/http-party/node-http-proxy/commit/0cb1d3c68e793fed9aa4a7624c32a018e796aa95)\n\n## [1.12.0](https://github.com/http-party/node-http-proxy/compare/1.11.3...1.12.0) - 2015-10-22\n\n### Merged\n\n- Issue #896: provide a \"proxyReq\" event also for websocket connections. [`#897`](https://github.com/http-party/node-http-proxy/pull/897)\n\n### Commits\n\n- Provide a \"proxyReq\" event also for websocket connections. [`a05fc2d`](https://github.com/http-party/node-http-proxy/commit/a05fc2d1692d038f1eaad6d9b26c174039bc1949)\n- fixes after PR review [`9752652`](https://github.com/http-party/node-http-proxy/commit/9752652e76da3bcfb6a635620e4162518ca43203)\n- [dist] Version bump. 1.12.0 [`b5a6d0e`](https://github.com/http-party/node-http-proxy/commit/b5a6d0e58396363f4c457f6d1654614bdfcfcb73)\n\n## [1.11.3](https://github.com/http-party/node-http-proxy/compare/1.11.2...1.11.3) - 2015-10-19\n\n### Merged\n\n- Removed unspecified trailing slash in proxy url [`#893`](https://github.com/http-party/node-http-proxy/pull/893)\n- Updating the upgrading doc [`#892`](https://github.com/http-party/node-http-proxy/pull/892)\n\n### Commits\n\n- [dist] Update .travis.yml to be more modern. [`302d981`](https://github.com/http-party/node-http-proxy/commit/302d981dd2cf06dbf751b1f64e3dfea08d0f9476)\n- [dist] Version bump. 1.11.3 [`60baca5`](https://github.com/http-party/node-http-proxy/commit/60baca5aed4f45ef1d7b3f7edd909375853d344b)\n- docs: options.headers [`c86ae51`](https://github.com/http-party/node-http-proxy/commit/c86ae51bb9658309a9628f4f5182d4c45c803b84)\n\n## [1.11.2](https://github.com/http-party/node-http-proxy/compare/v1.11.1...1.11.2) - 2015-08-30\n\n### Merged\n\n- Update gzip-middleware.js [`#870`](https://github.com/http-party/node-http-proxy/pull/870)\n- Fix broken option list indentation [`#863`](https://github.com/http-party/node-http-proxy/pull/863)\n- Added missing configuration options [`#852`](https://github.com/http-party/node-http-proxy/pull/852)\n- Added installation instructions [`#823`](https://github.com/http-party/node-http-proxy/pull/823)\n- fixes comment [`#817`](https://github.com/http-party/node-http-proxy/pull/817)\n\n### Commits\n\n- Created reverse-proxy.js example. [`38864d0`](https://github.com/http-party/node-http-proxy/commit/38864d016794b9ff3d8d1d1cb81a730b40a1bf9c)\n- Added websocket set-cookie headers test [`855cebd`](https://github.com/http-party/node-http-proxy/commit/855cebdac4d33ef5f2fab4c4c78fdc07cdb61402)\n- [fix] make more functional [`cea0e86`](https://github.com/http-party/node-http-proxy/commit/cea0e8676b3e609828320bb03051eaf78cc43b54)\n- Modify the set-cookie header fix to work with node 0.10.x. [`da674ec`](https://github.com/http-party/node-http-proxy/commit/da674ec4df2b371f09e912f3b376c48581090a0f)\n- Use raw headers instead parsed. [`8bfd90c`](https://github.com/http-party/node-http-proxy/commit/8bfd90c4d9331fd129f17a788ef9fc733654b7e0)\n- Replaced Object.keys().map with for in loop. [`3d2350c`](https://github.com/http-party/node-http-proxy/commit/3d2350c54ff0fb9271f5fcfea1d23f22ad97c47c)\n- [dist] Version bump. 1.11.2 [`30e3b37`](https://github.com/http-party/node-http-proxy/commit/30e3b371de0116e40e15156394f31c7e0b0aa9f1)\n- Websocket key was unnecessary long. [`ca73208`](https://github.com/http-party/node-http-proxy/commit/ca732087498582df01ab78fb7da77912dab8f138)\n\n## [v1.11.1](https://github.com/http-party/node-http-proxy/compare/v1.11.0...v1.11.1) - 2015-04-22\n\n### Commits\n\n- [dist] Version bump. 1.11.1 [`7e6c66a`](https://github.com/http-party/node-http-proxy/commit/7e6c66a7e485a6c0ec3a1c567bbe800fdc56c9fd)\n- [fix] dont use bind in the one case we do [`d26ef56`](https://github.com/http-party/node-http-proxy/commit/d26ef56e1bc2a1232b06c01b4740e3bf35d63eda)\n- [dist] update to new version of EE3 [`607f96c`](https://github.com/http-party/node-http-proxy/commit/607f96c00cbda2a6b881b8ff1db05437dbf4ce77)\n- [fix] use the main export for EE3 [`18c77ca`](https://github.com/http-party/node-http-proxy/commit/18c77cafc7d5479502cf5c4d2b663d8f85cfd6d4)\n\n## [v1.11.0](https://github.com/http-party/node-http-proxy/compare/v1.10.1...v1.11.0) - 2015-04-20\n\n### Merged\n\n- [api] add an ignorePath option if you want to disregard the path of the ... [`#759`](https://github.com/http-party/node-http-proxy/pull/759)\n\n### Commits\n\n- [dist] Version bump. 1.11.0 [`934e6c4`](https://github.com/http-party/node-http-proxy/commit/934e6c4d54292a1b961452074e02fb5d45da729a)\n\n## [v1.10.1](https://github.com/http-party/node-http-proxy/compare/v1.10.0...v1.10.1) - 2015-04-02\n\n### Merged\n\n- Fix default port detection with node 0.12.x [`#799`](https://github.com/http-party/node-http-proxy/pull/799)\n\n### Commits\n\n- [dist] add semver and normalize package.json with --save-dev [`1b89bc9`](https://github.com/http-party/node-http-proxy/commit/1b89bc9a76c229070ff2572f7a0e1b969c4b4701)\n- fix protocol and default port detection on node 0.12.x, compatible with 0.10.x [`5f14bca`](https://github.com/http-party/node-http-proxy/commit/5f14bcaa704fe8a5e6f59d3a89722f22958cade9)\n- fix expected error message when node 0.12.x [`0ee314c`](https://github.com/http-party/node-http-proxy/commit/0ee314c436226391318b9a1b623cb3f7e8bf4df7)\n- force cipher AES128-GCM-SHA256 in https tests [`c33d161`](https://github.com/http-party/node-http-proxy/commit/c33d1616cdbd60587ca2eb326c48b8a87ac56092)\n- [fix] properly support iojs with test checking for HTTPS [`c6dfb04`](https://github.com/http-party/node-http-proxy/commit/c6dfb04a67f3b5ac9a402b7b08c1b8baf29f89e6)\n- [dist] Version bump. 1.10.1 [`0bd446c`](https://github.com/http-party/node-http-proxy/commit/0bd446c680e9991accfaa3a6a70e411fdac79164)\n- [ci] add 0.12 and iojs to travis [`a6ae6c4`](https://github.com/http-party/node-http-proxy/commit/a6ae6c499743ddade9db12b9f7404d980c79f683)\n\n## [v1.10.0](https://github.com/http-party/node-http-proxy/compare/v1.9.1...v1.10.0) - 2015-04-01\n\n### Merged\n\n- Fixes / additions to URL rewriting [`#787`](https://github.com/http-party/node-http-proxy/pull/787)\n\n### Commits\n\n- [dist] Version bump. 1.10.0 [`1dabda2`](https://github.com/http-party/node-http-proxy/commit/1dabda241f3b93eb9195134042e7a3b84fd0ef57)\n\n## [v1.9.1](https://github.com/http-party/node-http-proxy/compare/v1.9.0...v1.9.1) - 2015-04-01\n\n### Merged\n\n- Fix #747 [`#798`](https://github.com/http-party/node-http-proxy/pull/798)\n\n### Fixed\n\n- Merge pull request #798 from damonmcminn/master [`#747`](https://github.com/http-party/node-http-proxy/issues/747)\n- Fix https://github.com/nodejitsu/node-http-proxy/issues/747 [`#747`](https://github.com/nodejitsu/node-http-proxy/issues/747)\n\n### Commits\n\n- Add test for https://github.com/nodejitsu/node-http-proxy/issues/747 [`d145152`](https://github.com/http-party/node-http-proxy/commit/d145152655a69479348b0ebc726d4dc19720a12b)\n- [dist] Version bump. 1.9.1 [`21b30b7`](https://github.com/http-party/node-http-proxy/commit/21b30b754db4f6410c3d2052bc123b3fdae57c46)\n\n## [v1.9.0](https://github.com/http-party/node-http-proxy/compare/v1.8.1...v1.9.0) - 2015-03-12\n\n### Merged\n\n- Adding the nodejs0.12 auth option [`#792`](https://github.com/http-party/node-http-proxy/pull/792)\n- fix \"x-forwarded-proto\" in node 0.12 and iojs [`#789`](https://github.com/http-party/node-http-proxy/pull/789)\n- Add support for auto host rewriting and protocol rewriting [`#1`](https://github.com/http-party/node-http-proxy/pull/1)\n- changed highlighted part - very minor [`#756`](https://github.com/http-party/node-http-proxy/pull/756)\n- Update README.md for benchmarks [`#625`](https://github.com/http-party/node-http-proxy/pull/625)\n\n### Fixed\n\n- fix \"x-forwarded-proto\" in node 0.12 and iojs [`#772`](https://github.com/http-party/node-http-proxy/issues/772)\n- [api] add an ignorePath option if you want to disregard the path of the incoming request when proxying to the target server fixes #758 [`#758`](https://github.com/http-party/node-http-proxy/issues/758)\n\n### Commits\n\n- added auth header test [`df158bf`](https://github.com/http-party/node-http-proxy/commit/df158bfc53e35e62609d8169f3883f6dcf12b73c)\n- added auth header test [`ff1626f`](https://github.com/http-party/node-http-proxy/commit/ff1626f0719652c92895cf80f9aacc22ededadad)\n- refactor some tests for greater readability [`14415a5`](https://github.com/http-party/node-http-proxy/commit/14415a50741d1f258da884686455d87d68eb8121)\n- only rewrite redirect urls when it matches target [`26029ba`](https://github.com/http-party/node-http-proxy/commit/26029ba7ac948b5dc0befb2091cc9a5862d0641c)\n- auth header added [`ab5c3e5`](https://github.com/http-party/node-http-proxy/commit/ab5c3e5c819ca993e0616d178bc1d282af539508)\n- [dist] Version bump. 1.9.0 [`87a92a7`](https://github.com/http-party/node-http-proxy/commit/87a92a72802a27f817fcba87382d55831fd04ddb)\n- end of file line space [`e907d7b`](https://github.com/http-party/node-http-proxy/commit/e907d7bb2aa2825b43d9355cb1ee25bec47b15ad)\n- space instead of tabs [`7298510`](https://github.com/http-party/node-http-proxy/commit/7298510e9170d74ff057487085bc1e898f044177)\n- space instead of tabs [`63c9262`](https://github.com/http-party/node-http-proxy/commit/63c9262df5bd04d83432db44fce2a4d5b19a59ea)\n- auth header added tests [`f55ffa3`](https://github.com/http-party/node-http-proxy/commit/f55ffa356a259c09685c6b768a404e4b73f674ce)\n\n## [v1.8.1](https://github.com/http-party/node-http-proxy/compare/v1.8.0...v1.8.1) - 2014-12-17\n\n### Commits\n\n- Pass HTTPS client parameters. [`402ab05`](https://github.com/http-party/node-http-proxy/commit/402ab057340a29db7a521ff239c5e21ac0c12be8)\n- [dist] Version bump. 1.8.1 [`3311106`](https://github.com/http-party/node-http-proxy/commit/3311106c2c2346f3ac1ffe402b80bca3c7c59275)\n\n## [v1.8.0](https://github.com/http-party/node-http-proxy/compare/v1.7.3...v1.8.0) - 2014-12-17\n\n### Merged\n\n- Fix variables scope in test [`#752`](https://github.com/http-party/node-http-proxy/pull/752)\n- Fix typo [`#751`](https://github.com/http-party/node-http-proxy/pull/751)\n\n### Commits\n\n- Added websocket close event test [`8bff3dd`](https://github.com/http-party/node-http-proxy/commit/8bff3ddc1276e3ba18fd68c34d8982148cd21455)\n- Deprecated proxySocket event in favor to open event. [`c62610e`](https://github.com/http-party/node-http-proxy/commit/c62610e8e4d59e8ba4642370ff3fb933c6ddb4eb)\n- Update README.md [`05d18a4`](https://github.com/http-party/node-http-proxy/commit/05d18a4e1ba6c2de41b0b803cd1793357979384d)\n- [fix] style spacing wtf [`ea0a4de`](https://github.com/http-party/node-http-proxy/commit/ea0a4ded803b30144e442344ad5a38a0d34bb3ba)\n- [api] add close event in ws-incoming.js [`2653786`](https://github.com/http-party/node-http-proxy/commit/26537866b3ca522927aa4604a958f90774c0c0c0)\n- [minor] grammar [`f304861`](https://github.com/http-party/node-http-proxy/commit/f30486195cfa6cfcf6400ac445975d5adada72e4)\n- Changed proxyServer and destiny to local variables. [`8a8a894`](https://github.com/http-party/node-http-proxy/commit/8a8a894092ddbec8f0365ced0e94a75b1307ecf1)\n- [dist] Version bump. 1.8.0 [`f0db5b3`](https://github.com/http-party/node-http-proxy/commit/f0db5b3f708b0858f617d472dfdd0ba211b774ef)\n\n## [v1.7.3](https://github.com/http-party/node-http-proxy/compare/v1.7.2...v1.7.3) - 2014-12-09\n\n### Fixed\n\n- [fix] use simple regex instead of indexOf to check the protocol to support without the colon fixes #711 [`#711`](https://github.com/http-party/node-http-proxy/issues/711)\n\n### Commits\n\n- [test] show that we support protocol without the colon [`89f9ca1`](https://github.com/http-party/node-http-proxy/commit/89f9ca1e89d679b2b85a8f85b65e8b0878694207)\n- [dist] Version bump. 1.7.3 [`6a330ff`](https://github.com/http-party/node-http-proxy/commit/6a330ff904d02a41f9a1cac338a98da1849c54ca)\n\n## [v1.7.2](https://github.com/http-party/node-http-proxy/compare/v1.7.1...v1.7.2) - 2014-12-08\n\n### Merged\n\n- Fix grammar in README.md [`#749`](https://github.com/http-party/node-http-proxy/pull/749)\n\n### Fixed\n\n- [fix] properly include port in host header with changeOrigin in all cases fixes #750 [`#750`](https://github.com/http-party/node-http-proxy/issues/750)\n\n### Commits\n\n- [test] add tests for the changeOrigin cases in properly setting the host header [`71a06aa`](https://github.com/http-party/node-http-proxy/commit/71a06aab0249487ff650c8a47906cc8281561664)\n- [dist] pin down deps and add requires-port [`81874f7`](https://github.com/http-party/node-http-proxy/commit/81874f795b7df7929e03d9d4cb98a947b1ef114b)\n- [dist] Version bump. 1.7.2 [`2086e49`](https://github.com/http-party/node-http-proxy/commit/2086e4917c97f347f84c54b166799bc8db9f4162)\n\n## [v1.7.1](https://github.com/http-party/node-http-proxy/compare/v1.7.0...v1.7.1) - 2014-12-02\n\n### Merged\n\n- Adding harmon to the README [`#716`](https://github.com/http-party/node-http-proxy/pull/716)\n\n### Fixed\n\n- [fix] fix #738 [`#738`](https://github.com/http-party/node-http-proxy/issues/738)\n- [fix] simple fixes #748 #744 #746 [`#748`](https://github.com/http-party/node-http-proxy/issues/748)\n\n### Commits\n\n- [test] add proper failing test case for #738 [`410a8ce`](https://github.com/http-party/node-http-proxy/commit/410a8ce94ccea566a8e50daf3b78e633b82875cb)\n- [Bugfix] Allow for multiple ? in outgoing urls. [`70ed1c4`](https://github.com/http-party/node-http-proxy/commit/70ed1c4273bc64500e8bae9b60d7fd6a19135246)\n- [dist] Version bump. 1.7.1 [`56a7b77`](https://github.com/http-party/node-http-proxy/commit/56a7b77645b13d337c1a2f879460193d310454c8)\n\n## [v1.7.0](https://github.com/http-party/node-http-proxy/compare/v1.6.2...v1.7.0) - 2014-11-25\n\n### Merged\n\n- Allow optional redirect host rewriting. [`#741`](https://github.com/http-party/node-http-proxy/pull/741)\n- Set `Content-Length` header for OPTIONS requests [`#742`](https://github.com/http-party/node-http-proxy/pull/742)\n- copy headers instead of referencing them so they don't unexpectedly get overwritten [`#736`](https://github.com/http-party/node-http-proxy/pull/736)\n- Updated to support error callback on proxy.web and start/proxyReq/end co... [`#735`](https://github.com/http-party/node-http-proxy/pull/735)\n\n### Commits\n\n- :pencil: Add host rewrite docs and specs. [`add8133`](https://github.com/http-party/node-http-proxy/commit/add81338a90dae132f9e74fd5a5905fbcef030b7)\n- [minor] style consistency [`48ae5d8`](https://github.com/http-party/node-http-proxy/commit/48ae5d828c23d6f19c9e2dd8c922d88a09f5ed0f)\n- Updated to support error callback on proxy.web and start/proxyReq/end continue working. [`9ba8311`](https://github.com/http-party/node-http-proxy/commit/9ba8311343fd01b32505b8607ecf4294200f9dde)\n- style changes [`84036e9`](https://github.com/http-party/node-http-proxy/commit/84036e9ddd1d4d925006c5438b3bcc0f17ba7a48)\n- [fix] be defensive and ensure location is in headers before running url.parse() [`8d68ac0`](https://github.com/http-party/node-http-proxy/commit/8d68ac0e0fa3080b31580aa08e92a46cc1f27696)\n- [dist] Version bump. 1.7.0 [`276f65a`](https://github.com/http-party/node-http-proxy/commit/276f65a3b810ded01757ec4bfd4fe2b00a1e66a8)\n\n## [v1.6.2](https://github.com/http-party/node-http-proxy/compare/v1.6.1...v1.6.2) - 2014-11-11\n\n### Merged\n\n- do not modify the query string [`#733`](https://github.com/http-party/node-http-proxy/pull/733)\n\n### Commits\n\n- [fix] style changes [`7c5e40a`](https://github.com/http-party/node-http-proxy/commit/7c5e40a429fbc0c538f38d29d74acb633cb9b8d4)\n- [minor] this shouldnt be in var block [`3f19e6e`](https://github.com/http-party/node-http-proxy/commit/3f19e6e178e168a16beee74186691f3e0e54d517)\n- [dist] Version bump. 1.6.2 [`709b3e9`](https://github.com/http-party/node-http-proxy/commit/709b3e96560d619fab2617f9ddb902b4982b4103)\n\n## [v1.6.1](https://github.com/http-party/node-http-proxy/compare/v1.6.0...v1.6.1) - 2014-11-04\n\n### Merged\n\n- websocket needs to respect `options.secure` too [`#729`](https://github.com/http-party/node-http-proxy/pull/729)\n- changeOrigin option docs fix [`#724`](https://github.com/http-party/node-http-proxy/pull/724)\n\n### Commits\n\n- [dist] Version bump. 1.6.1 [`fa797fc`](https://github.com/http-party/node-http-proxy/commit/fa797fca900c10ebc848a2b445204b47da799483)\n\n## [v1.6.0](https://github.com/http-party/node-http-proxy/compare/v1.5.3...v1.6.0) - 2014-10-29\n\n### Merged\n\n- Added changeOrigin option with test and docs [`#723`](https://github.com/http-party/node-http-proxy/pull/723)\n- I presume you mean couchdb here [`#717`](https://github.com/http-party/node-http-proxy/pull/717)\n- update modify request body eg [`#712`](https://github.com/http-party/node-http-proxy/pull/712)\n\n### Commits\n\n- harmon notes [`9f684d0`](https://github.com/http-party/node-http-proxy/commit/9f684d0439174d889d7b9a4ef6e2353e09481b2d)\n- [dist] Version bump. 1.6.0 [`43641b0`](https://github.com/http-party/node-http-proxy/commit/43641b00b34ccc05bdf09f904695061d7c857aeb)\n\n## [v1.5.3](https://github.com/http-party/node-http-proxy/compare/v1.5.2...v1.5.3) - 2014-10-01\n\n### Merged\n\n- close socket if upstream request fails [`#709`](https://github.com/http-party/node-http-proxy/pull/709)\n\n### Commits\n\n- [dist] Version bump. 1.5.3 [`9577a0f`](https://github.com/http-party/node-http-proxy/commit/9577a0faf2b78af606168673407ac47a851c084c)\n\n## [v1.5.2](https://github.com/http-party/node-http-proxy/compare/v1.5.1...v1.5.2) - 2014-10-01\n\n### Merged\n\n- close websocket if proxyReq is closed before upgrade [`#708`](https://github.com/http-party/node-http-proxy/pull/708)\n\n### Commits\n\n- test closing upstream socket prior to upgrade [`7730548`](https://github.com/http-party/node-http-proxy/commit/77305489d9b88d283802477e155340e5dacfcc2c)\n- [dist] Version bump. 1.5.2 [`43c6f0c`](https://github.com/http-party/node-http-proxy/commit/43c6f0c7c06d25a670c410500a8623531df458b1)\n\n## [v1.5.1](https://github.com/http-party/node-http-proxy/compare/v1.5.0...v1.5.1) - 2014-09-30\n\n### Commits\n\n- [fix] do a check to make sure the server exists before we try and emit [`10a294a`](https://github.com/http-party/node-http-proxy/commit/10a294af4d4baac30b98ea9bec683a974443b83d)\n- [dist] Version bump. 1.5.1 [`f0bf741`](https://github.com/http-party/node-http-proxy/commit/f0bf7418156db2cb87a616b0a34bb1f028db9142)\n\n## [v1.5.0](https://github.com/http-party/node-http-proxy/compare/v1.4.3...v1.5.0) - 2014-09-30\n\n### Merged\n\n- exposing proxySocket on socket to support sniffing messages coming from proxy target [`#706`](https://github.com/http-party/node-http-proxy/pull/706)\n- Fixed misleading documentation [`#705`](https://github.com/http-party/node-http-proxy/pull/705)\n- Fix typo in README.md [`#702`](https://github.com/http-party/node-http-proxy/pull/702)\n- handle 'upgrade' in comma-separated connection header [`#691`](https://github.com/http-party/node-http-proxy/pull/691)\n\n### Commits\n\n- test new detection of connection: upgrade [`ec683b9`](https://github.com/http-party/node-http-proxy/commit/ec683b924b1ef8cbdd2cd2bfb7e141b502773163)\n- emitting proxySocket on proxyServer [`000eb53`](https://github.com/http-party/node-http-proxy/commit/000eb533de144cad01cfd97edf9ab6c350593d3c)\n- [fix] perf optimization so we have a precompiled regexp [`c0a796b`](https://github.com/http-party/node-http-proxy/commit/c0a796b3e31de4f22eef00d93164e7238d9aa3ba)\n- use regex to check for upgrade header [`65a21bc`](https://github.com/http-party/node-http-proxy/commit/65a21bce6dbbc6142a851dc959e237c0ef2b1091)\n- [dist] Version bump. 1.5.0 [`232258b`](https://github.com/http-party/node-http-proxy/commit/232258b6ec2229497fe557454a121d917968f5e8)\n- [minor] extra space [`e7d50b1`](https://github.com/http-party/node-http-proxy/commit/e7d50b1a376035a50c82db38605e99feb30afd36)\n\n## [v1.4.3](https://github.com/http-party/node-http-proxy/compare/v1.4.2...v1.4.3) - 2014-09-12\n\n### Merged\n\n- Urgent: Fix breaking bug on url joining resulting in paths like `///path`. [`#699`](https://github.com/http-party/node-http-proxy/pull/699)\n\n### Commits\n\n- [minor] Added missing JSDoc comments [`73e8a4c`](https://github.com/http-party/node-http-proxy/commit/73e8a4cdd576868bf61d0848cc51f083a75454f9)\n- Fix breaking bug on url joining resulting in paths like `///path`. [`73d865b`](https://github.com/http-party/node-http-proxy/commit/73d865bc9f8940f61c1ad4812f220920ead553b5)\n- [minor] Code style adjustment. [`3ab6e95`](https://github.com/http-party/node-http-proxy/commit/3ab6e9591e66c203647605b4f275d374472c9d5f)\n- Bump version v1.4.3 [`554f59c`](https://github.com/http-party/node-http-proxy/commit/554f59c5182d58b359df0159a29ff5ea35dd3830)\n- [ignore] Ignore npm-debug.log [`a934cb6`](https://github.com/http-party/node-http-proxy/commit/a934cb6a46298c380e9bc794f18873576cf73c4c)\n\n## [v1.4.2](https://github.com/http-party/node-http-proxy/compare/v1.4.1...v1.4.2) - 2014-09-12\n\n### Commits\n\n- [fix] ensure path works on windows because path.join doesnt like URLs [`ed73f06`](https://github.com/http-party/node-http-proxy/commit/ed73f06ed307ad2204e565781cc3154047941a8c)\n- [dist] Version bump. 1.4.2 [`df12aeb`](https://github.com/http-party/node-http-proxy/commit/df12aeb12de79de1157898d45f4347fd0037dd70)\n\n## [v1.4.1](https://github.com/http-party/node-http-proxy/compare/v1.3.1...v1.4.1) - 2014-09-11\n\n### Merged\n\n- Trimming contents of distributed npm package. [`#644`](https://github.com/http-party/node-http-proxy/pull/644)\n- Remove changelog - it was not maintained [`#669`](https://github.com/http-party/node-http-proxy/pull/669)\n- Removed duplicated imported dependencies [`#695`](https://github.com/http-party/node-http-proxy/pull/695)\n\n### Commits\n\n- [test] add test for prependPath option [`e44fabe`](https://github.com/http-party/node-http-proxy/commit/e44fabe58a233b367d42f26f15113e2022f71d7b)\n- [api] add prependPath option to go with path change [`9a534c6`](https://github.com/http-party/node-http-proxy/commit/9a534c6ff63d776140918bc839801d247affd18d)\n- [dist] Version bump. 1.4.1 [`d5c656b`](https://github.com/http-party/node-http-proxy/commit/d5c656bceb50dc9008ef223bc58b918adcf05352)\n- [dist] Version bump. 1.4.0 [`dceef40`](https://github.com/http-party/node-http-proxy/commit/dceef407a1130033679e7e836c6753b76187ce5f)\n\n## [v1.3.1](https://github.com/http-party/node-http-proxy/compare/v1.3.0...v1.3.1) - 2014-09-09\n\n### Merged\n\n- Allow proxy to maintain the original target path [`#693`](https://github.com/http-party/node-http-proxy/pull/693)\n- Clarify usable parameters for 'proxyRes' event [`#686`](https://github.com/http-party/node-http-proxy/pull/686)\n\n### Commits\n\n- fix tests for maintaining proxy path [`a65021d`](https://github.com/http-party/node-http-proxy/commit/a65021d52b0ee039486819b5a95f442229458776)\n- Fix proxy path [`511b7b3`](https://github.com/http-party/node-http-proxy/commit/511b7b3d4743636de9d9fbe8ff409730d221d273)\n- Clarify usable parameters for proxyRes event. [`49a0de1`](https://github.com/http-party/node-http-proxy/commit/49a0de1e7cdcec9b555695605ab914038f99d66b)\n- [dist] Version bump. 1.3.1 [`fc73828`](https://github.com/http-party/node-http-proxy/commit/fc73828035baf3cea3664560f8964f2a2a200d0a)\n- [ci] remove 0.11.x to avoid failing builds caused by TLS errors [`6b83ae4`](https://github.com/http-party/node-http-proxy/commit/6b83ae47bbf2d5eab8ac94b4d6130e09a21ac85b)\n\n## [v1.3.0](https://github.com/http-party/node-http-proxy/compare/v1.2.1...v1.3.0) - 2014-08-14\n\n### Merged\n\n- Added functionality to close proxy. [`#679`](https://github.com/http-party/node-http-proxy/pull/679)\n\n### Commits\n\n- [fix] cleanup and stylize close function [`261742a`](https://github.com/http-party/node-http-proxy/commit/261742a4295268ef93f45aa0f1e3a04208a2aed3)\n- updated close function for safety [`8be9d94`](https://github.com/http-party/node-http-proxy/commit/8be9d945d03169056bbf84d702292b5763b015dc)\n- [dist] Version bump. 1.3.0 [`05f0b89`](https://github.com/http-party/node-http-proxy/commit/05f0b891a610fb7779f90916fcd9ed750df818b2)\n\n## [v1.2.1](https://github.com/http-party/node-http-proxy/compare/v1.2.0...v1.2.1) - 2014-08-14\n\n### Commits\n\n- Added close method to proxy server. [`a3d0219`](https://github.com/http-party/node-http-proxy/commit/a3d02196c5e62cd58bc0ebe8a66afcdb905d96b3)\n- [fix] emit an error if proper URL is not passed in as a target [`37036dd`](https://github.com/http-party/node-http-proxy/commit/37036dd32565f72ad5777e47509293db18b60ed3)\n- [dist] Version bump. 1.2.1 [`0a6b424`](https://github.com/http-party/node-http-proxy/commit/0a6b424e2c3b6cef68362a71f0e56740b2605af7)\n\n## [v1.2.0](https://github.com/http-party/node-http-proxy/compare/v1.1.6...v1.2.0) - 2014-08-05\n\n### Merged\n\n- [api] Add event-based ability to modify pre-flight proxy requests. [`#673`](https://github.com/http-party/node-http-proxy/pull/673)\n\n### Commits\n\n- [dist] Version bump. 1.2.0 [`63c53a1`](https://github.com/http-party/node-http-proxy/commit/63c53a177217283ec14e4f7c2e891db48842ab4b)\n\n## [v1.1.6](https://github.com/http-party/node-http-proxy/compare/v1.1.5...v1.1.6) - 2014-07-17\n\n### Fixed\n\n- do proper checking for a pass not existing. fixes #671 [`#671`](https://github.com/http-party/node-http-proxy/issues/671)\n\n### Commits\n\n- Remove changelog - it was not maintained [`e336b52`](https://github.com/http-party/node-http-proxy/commit/e336b52629276e647abeee300d7091db44e5b885)\n- [dist] Version bump. 1.1.6 [`ed9e12b`](https://github.com/http-party/node-http-proxy/commit/ed9e12b0edb0fc206610e94bd696425619868474)\n\n## [v1.1.5](https://github.com/http-party/node-http-proxy/compare/v1.1.4...v1.1.5) - 2014-07-10\n\n### Merged\n\n- Fix simple-balancer example [`#666`](https://github.com/http-party/node-http-proxy/pull/666)\n- Added proxyTimeout option and two tests for timeout [`#658`](https://github.com/http-party/node-http-proxy/pull/658)\n\n### Fixed\n\n- Fix #657 [`#657`](https://github.com/http-party/node-http-proxy/issues/657)\n- Fix #657 [`#657`](https://github.com/http-party/node-http-proxy/issues/657)\n\n### Commits\n\n- Added targetTimeout option and two tests for timeout [`0f24351`](https://github.com/http-party/node-http-proxy/commit/0f243516e1c6737b95fba220a5028439264b5de6)\n- Change name targetTimeout to proxyTimeout [`7b79a74`](https://github.com/http-party/node-http-proxy/commit/7b79a7409ade7a8c79b2ae5761abc4843529063a)\n- Trimming contents of distributed npm package. [`431aba7`](https://github.com/http-party/node-http-proxy/commit/431aba79d8d521e228c1403aaf4fd4a26fba03c3)\n- [api] also emit the target on a proxy error [`d1baa36`](https://github.com/http-party/node-http-proxy/commit/d1baa3684e449610a2aae270816a7b8a907e588e)\n- [dist] Version bump. 1.1.5 [`7104a7c`](https://github.com/http-party/node-http-proxy/commit/7104a7c023073a49091969f825738c79ae036123)\n- fix balancer example [`9df4bc1`](https://github.com/http-party/node-http-proxy/commit/9df4bc1e1216a8e53675f0be16fb9081c11da225)\n\n## [v1.1.4](https://github.com/http-party/node-http-proxy/compare/v1.1.3...v1.1.4) - 2014-05-11\n\n### Merged\n\n- `proxyRes` event, provide access to the req and res objects [`#642`](https://github.com/http-party/node-http-proxy/pull/642)\n\n### Commits\n\n- Add a test for the proxyRes event [`1385635`](https://github.com/http-party/node-http-proxy/commit/1385635e18f081af759c8e088f2f6b0219df83db)\n- [dist] Version bump. 1.1.4 [`7cb98a4`](https://github.com/http-party/node-http-proxy/commit/7cb98a4e417312f01cf4432b52dbb3773aca60a0)\n- Add the req and res objects to the proxyRes event [`1213e46`](https://github.com/http-party/node-http-proxy/commit/1213e46b1b0975ad1d5c5d0aaeace40a0811118f)\n\n## [v1.1.3](https://github.com/http-party/node-http-proxy/compare/v1.1.2...v1.1.3) - 2014-05-11\n\n### Merged\n\n- Don't override connection header if Upgrading [`#640`](https://github.com/http-party/node-http-proxy/pull/640)\n\n### Commits\n\n- Adding test cases on preventing upgrade override [`8aa7c51`](https://github.com/http-party/node-http-proxy/commit/8aa7c519b15f734af7db34d2102781adbeae10aa)\n- Update README.md for benchmarks [`4947484`](https://github.com/http-party/node-http-proxy/commit/4947484806f839d5e0a1b615b56a1bc847b8f534)\n- [minor] style [`ccad177`](https://github.com/http-party/node-http-proxy/commit/ccad17795417de74bea2bcb6d6c559a4601af76d)\n- [dist] Version bump. 1.1.3 [`c472527`](https://github.com/http-party/node-http-proxy/commit/c472527ea60da8b2f737d5742bc61ad2772b7e0b)\n\n## [v1.1.2](https://github.com/http-party/node-http-proxy/compare/v1.1.1...v1.1.2) - 2014-04-14\n\n### Commits\n\n- [fix test] handle proxy error since we are properly aborting the proxy Request [`61c8734`](https://github.com/http-party/node-http-proxy/commit/61c8734e8b1115fab0e0db23fd8eeccbae61eee0)\n- [fix] handle error on incoming request as well and properly abort proxy if client request is aborted [`77a1cff`](https://github.com/http-party/node-http-proxy/commit/77a1cff9bcf697eab27819eef054024bdc0a2ba3)\n- [dist] Version bump. 1.1.2 [`c54278b`](https://github.com/http-party/node-http-proxy/commit/c54278bd3b00e82f4253393b6f6beb1d5a1b19e5)\n\n## [v1.1.1](https://github.com/http-party/node-http-proxy/compare/v1.1.0...v1.1.1) - 2014-04-11\n\n### Commits\n\n- [dist] Version bump. 1.1.1 [`d908e2a`](https://github.com/http-party/node-http-proxy/commit/d908e2ad61013ed1f6e2f80c4b67a6dce7d0f504)\n- [fix] let user make the decision on what to do with the buffer [`4f07dc2`](https://github.com/http-party/node-http-proxy/commit/4f07dc220d700ac90bd8405f7cb0724bdae4b430)\n\n## [v1.1.0](https://github.com/http-party/node-http-proxy/compare/v1.0.3...v1.1.0) - 2014-04-09\n\n### Merged\n\n- Update UPGRADING.md [`#616`](https://github.com/http-party/node-http-proxy/pull/616)\n\n### Fixed\n\n- [fix] always be an eventemitter for consistency fixes #606 [`#606`](https://github.com/http-party/node-http-proxy/issues/606)\n\n### Commits\n\n- [api] emit a start an an end event [`8b48a9f`](https://github.com/http-party/node-http-proxy/commit/8b48a9fdab01624f7249c53f25919b1295eefb10)\n- [dist] Version bump. 1.1.0 [`97ceeb3`](https://github.com/http-party/node-http-proxy/commit/97ceeb37d04e5d2195352365985165866323c4d7)\n- [minor] missing angle bracket [`eca765a`](https://github.com/http-party/node-http-proxy/commit/eca765a856164c077ff9128949019552cdaf9a67)\n\n## [v1.0.3](https://github.com/http-party/node-http-proxy/compare/v1.0.2...v1.0.3) - 2014-03-27\n\n### Merged\n\n- Fix for #591 [`#592`](https://github.com/http-party/node-http-proxy/pull/592)\n- Add Repository field to package.json [`#578`](https://github.com/http-party/node-http-proxy/pull/578)\n- Fix doc: option lines [`#575`](https://github.com/http-party/node-http-proxy/pull/575)\n\n### Fixed\n\n- [api] add toProxy method to allow absolute URLs to be sent when sending to another proxy fixes #603 [`#603`](https://github.com/http-party/node-http-proxy/issues/603)\n\n### Commits\n\n- [doc] update docs with toProxy option [`ece85b4`](https://github.com/http-party/node-http-proxy/commit/ece85b4e1ba379b3ed084bd8f606e285c14d4db3)\n- [fix] set connection to CLOSE in cases where the agent is false. [`89a22bc`](https://github.com/http-party/node-http-proxy/commit/89a22bc00396f069eeb054ce30891a204077d16d)\n- @xtreme-topher-bullock - update package.json to have proper repository key and formatting [`68fa17b`](https://github.com/http-party/node-http-proxy/commit/68fa17bbcaa73ae2d9539cba6f6ddff29f9e30d5)\n- [dist] Version bump. 1.0.3 [`07fceb7`](https://github.com/http-party/node-http-proxy/commit/07fceb7c7aed25a8991d0295db4b4a7e50d79cf9)\n- Add support for localAddress [`e633b0f`](https://github.com/http-party/node-http-proxy/commit/e633b0f7e4fd719d809eaeb4725e589f79c271ab)\n\n## [v1.0.2](https://github.com/http-party/node-http-proxy/compare/v1.0.1...v1.0.2) - 2014-01-28\n\n### Merged\n\n- Update README.md [`#566`](https://github.com/http-party/node-http-proxy/pull/566)\n- Fix argument order for ws stream pass [`#560`](https://github.com/http-party/node-http-proxy/pull/560)\n- Extend listen to enable IPv6 support. [`#558`](https://github.com/http-party/node-http-proxy/pull/558)\n- Fix before and after type check [`#556`](https://github.com/http-party/node-http-proxy/pull/556)\n\n### Fixed\n\n- Close outgoing ws if incoming ws emits error [`#559`](https://github.com/http-party/node-http-proxy/issues/559)\n- [fix] closes #555 [`#555`](https://github.com/http-party/node-http-proxy/issues/555)\n\n### Commits\n\n- [fix] replicate node core behavior and throw an error if the user does not add their own error listener [`daad470`](https://github.com/http-party/node-http-proxy/commit/daad4703f3a80014936c89f4d67affdc3246f478)\n- [dist] Version bump. 1.0.2 [`4bdc3e4`](https://github.com/http-party/node-http-proxy/commit/4bdc3e4f455b2749c03961404db74e3112a3e9e8)\n- [doc] Fix broken image in npm by using an absolute link [`8004f4e`](https://github.com/http-party/node-http-proxy/commit/8004f4e5fc0f535806e92ec4e1bd973a45367dac)\n\n## [v1.0.1](https://github.com/http-party/node-http-proxy/compare/v1.0.0...v1.0.1) - 2014-01-17\n\n### Fixed\n\n- [fix] closes #553 [`#553`](https://github.com/http-party/node-http-proxy/issues/553)\n\n### Commits\n\n- [dist] bump v1.0.1 [`68c5512`](https://github.com/http-party/node-http-proxy/commit/68c55123039369cdf8a55a64b36b719c96b672cf)\n- typo [`689459f`](https://github.com/http-party/node-http-proxy/commit/689459fe46885a1b3b8e32a4df55f2d1339143e5)\n\n## [v1.0.0](https://github.com/http-party/node-http-proxy/compare/v0.10.4...v1.0.0) - 2014-01-16\n\n### Merged\n\n- Http proxy 1.0 [`#552`](https://github.com/http-party/node-http-proxy/pull/552)\n- Caronte [`#551`](https://github.com/http-party/node-http-proxy/pull/551)\n- Only emit response if a valid server is present [`#549`](https://github.com/http-party/node-http-proxy/pull/549)\n- [fix] add `type` to before and after to grab correct `passes`, fixes #537 [`#539`](https://github.com/http-party/node-http-proxy/pull/539)\n- export the proxy itself from the main require [`#536`](https://github.com/http-party/node-http-proxy/pull/536)\n\n### Fixed\n\n- [fix] closes #547 [`#547`](https://github.com/http-party/node-http-proxy/issues/547)\n- Merge pull request #539 from nodejitsu/fix-before-after [`#537`](https://github.com/http-party/node-http-proxy/issues/537)\n- [fix] add `type` to before and after to grab correct `passes`, fixes #537 [`#537`](https://github.com/http-party/node-http-proxy/issues/537)\n\n### Commits\n\n- [nuke] old files [`a4ee8f9`](https://github.com/http-party/node-http-proxy/commit/a4ee8f9d82f71ef423c401b1f5e9f712b13cbc98)\n- [docs] upgrade UPGRADING.md [`e599151`](https://github.com/http-party/node-http-proxy/commit/e5991519dbc7838aa4b8aeb5077d1c1ec5a13813)\n- [api] export the httpProxy.Server as the main export but preserve the createServer factory [`182c76c`](https://github.com/http-party/node-http-proxy/commit/182c76cd2322d4d4c041c2a964d51db396c5c96b)\n- [fix] remove caronte [`d6d2d0c`](https://github.com/http-party/node-http-proxy/commit/d6d2d0c8821bba9888eee7c3881fc408b3b2008e)\n- [fix] ee3 error handling [`d23353d`](https://github.com/http-party/node-http-proxy/commit/d23353d980d8aa1b2606e3d36a83d27432952bef)\n- [fix] comments [`6fa23e1`](https://github.com/http-party/node-http-proxy/commit/6fa23e11f6dc0b9c09766b268611ade919bfaa08)\n\n## [v0.10.4](https://github.com/http-party/node-http-proxy/compare/v0.10.3...v0.10.4) - 2013-12-27\n\n### Merged\n\n- Update README.md [`#521`](https://github.com/http-party/node-http-proxy/pull/521)\n- Better examples [`#520`](https://github.com/http-party/node-http-proxy/pull/520)\n- Send path in req.path and not the url [`#416`](https://github.com/http-party/node-http-proxy/pull/416)\n- Fix websocket error handing [`#518`](https://github.com/http-party/node-http-proxy/pull/518)\n- attempting to fix links to 2 source locations in README.md [`#502`](https://github.com/http-party/node-http-proxy/pull/502)\n- [merge] rename codename to actual project name [`#492`](https://github.com/http-party/node-http-proxy/pull/492)\n- [merge] Added error handling example [`#484`](https://github.com/http-party/node-http-proxy/pull/484)\n- [merge] https & agent [`#482`](https://github.com/http-party/node-http-proxy/pull/482)\n- [merge] caronte tests [`#476`](https://github.com/http-party/node-http-proxy/pull/476)\n- FIX: ws error event [`#475`](https://github.com/http-party/node-http-proxy/pull/475)\n- Fix accidental write to global variable. [`#472`](https://github.com/http-party/node-http-proxy/pull/472)\n- [fix] 2 spelling mistakes [`#14`](https://github.com/http-party/node-http-proxy/pull/14)\n- [fix] add ability to proxy websockets over HTTPS [`#11`](https://github.com/http-party/node-http-proxy/pull/11)\n- Tests [`#3`](https://github.com/http-party/node-http-proxy/pull/3)\n\n### Fixed\n\n- determine x-forwarded-port from host header [`#341`](https://github.com/http-party/node-http-proxy/issues/341)\n- [fix] closes #529 [`#529`](https://github.com/http-party/node-http-proxy/issues/529)\n- [fix] fixes #341 [`#341`](https://github.com/http-party/node-http-proxy/issues/341)\n- [tests] https test pass, fix #511. Exposed the rejectUnauthorized flag [`#511`](https://github.com/http-party/node-http-proxy/issues/511)\n- [fix] pass proper options object that extend the global options and parse the per proxy args into options. fixes #510 [`#510`](https://github.com/http-party/node-http-proxy/issues/510)\n- [readme] add links to badges on readme, fix #483 [`#483`](https://github.com/http-party/node-http-proxy/issues/483)\n- [fix] pooled connections, closes #478 [`#478`](https://github.com/http-party/node-http-proxy/issues/478)\n- [fix] add 0.10 link, fixes #459 [`#459`](https://github.com/http-party/node-http-proxy/issues/459)\n- [fix] closes #473 [`#473`](https://github.com/http-party/node-http-proxy/issues/473)\n- [fix] add 0.10 compatibily.. closes #474 [`#474`](https://github.com/http-party/node-http-proxy/issues/474)\n- [fix] headers, closes #469 [`#469`](https://github.com/http-party/node-http-proxy/issues/469)\n- [fix] headers, fixes #467 [`#467`](https://github.com/http-party/node-http-proxy/issues/467)\n- [fix] yawnt baaaka .. fixes #8 [`#8`](https://github.com/http-party/node-http-proxy/issues/8)\n\n### Commits\n\n- [fix] more jshint intendation [`17399e7`](https://github.com/http-party/node-http-proxy/commit/17399e7c3ef9addf9dd8f7c628b273e693f128a1)\n- [fix] tests [`a255f98`](https://github.com/http-party/node-http-proxy/commit/a255f984fecf24c9290f3ad58d1b68e54a7509eb)\n- [minor] remove coverage [`335af81`](https://github.com/http-party/node-http-proxy/commit/335af81d0244e62ecb501690bd15bc5a04ec51a3)\n- [examples] updated websockets examples [`ed8c9ee`](https://github.com/http-party/node-http-proxy/commit/ed8c9eeba99d60f39f5c36c4f34ed1a781d2cfd8)\n- [tests] removed unused tests [`7e25bde`](https://github.com/http-party/node-http-proxy/commit/7e25bded27effc1b3d47121ce21465a4e2ec7c0b)\n- [tests] Added a test case for run all the examples [`bc236d7`](https://github.com/http-party/node-http-proxy/commit/bc236d7e95ef10bc17cf551eea2cd2fb9bf265eb)\n- [tests] drop the test of own streams, moved the usable tests [`dc9d7e5`](https://github.com/http-party/node-http-proxy/commit/dc9d7e5452c7d39ae1d242cb8021ca75e4f736d4)\n- [fix] default port [`d166354`](https://github.com/http-party/node-http-proxy/commit/d1663549ec070e7ae8bc45ffb148f40ee903192f)\n- [tests] added the ws passes test and the streams webscokets test [`8b3fe32`](https://github.com/http-party/node-http-proxy/commit/8b3fe32f6ae60ae067bc5e40cdc43015e689467f)\n- [refactor minor] s/caronte/http-proxy/ or s/caronte/httpProxy/ where appropriate. [`bb0d28c`](https://github.com/http-party/node-http-proxy/commit/bb0d28c58729e2cc70e8446f7fbf1113a6fa9310)\n- [examples] updated bodyDecoder middleware example [`c82ff2c`](https://github.com/http-party/node-http-proxy/commit/c82ff2c3c0c0165421fbc4e7e94fa3f59d59aa38)\n- [dist] first [`4d13156`](https://github.com/http-party/node-http-proxy/commit/4d131567211bcefc6ef0b0592d374fef7bd5abd8)\n- [examples] update forward and custom error examples [`b726116`](https://github.com/http-party/node-http-proxy/commit/b7261161343c3471201d6de36ba1030aced26425)\n- [refactor docs] add descriptions [`d05af4a`](https://github.com/http-party/node-http-proxy/commit/d05af4af60a5f3d308aa68bf09ab0cf9e5528c52)\n- [tests] make the tests run with the last refactor [`5bb83b9`](https://github.com/http-party/node-http-proxy/commit/5bb83b967edb514402698eecfe3db7ab5fe60b06)\n- [examples] deleted this examples [`bdeabb7`](https://github.com/http-party/node-http-proxy/commit/bdeabb767a537bcb9f98ef74f6efe9762a9b1c34)\n- websocket draft [`07551c6`](https://github.com/http-party/node-http-proxy/commit/07551c63e428551e5d6e52362efd9620a14c71b4)\n- [fix] naming [`2a59366`](https://github.com/http-party/node-http-proxy/commit/2a593664a5768c90d9b2edf4c298460416b38926)\n- [dist doc] Added documentation for consistent benchmarking of node-http-proxy [`f7f5fa7`](https://github.com/http-party/node-http-proxy/commit/f7f5fa727e8f1d3f4946e61ad03830dab1da01a5)\n- [examples] update old examples [`7e44d36`](https://github.com/http-party/node-http-proxy/commit/7e44d3669bbd1b13e6452f265d52b22396f68b5d)\n- [docs] more short examples to the Readme [`0393b5d`](https://github.com/http-party/node-http-proxy/commit/0393b5da990bb45e873bb80d87a0bc9e4dd6a477)\n- [examples] updated old proxy examples [`e02317c`](https://github.com/http-party/node-http-proxy/commit/e02317ce86ff2dabd496cf7e2741e219a22ac817)\n- [wip] Initial HTTPS-&gt;HTTP test, updated https-secure example. Work in progress, need to add more https tests [`33a2462`](https://github.com/http-party/node-http-proxy/commit/33a2462d28c7d1fa26b03bcf290242ff7cd83e7a)\n- [docs] readme [`886a870`](https://github.com/http-party/node-http-proxy/commit/886a8707078f59d0467b34686455bb5bdfadbc0c)\n- [examples] added error-handling using callbacks and HTTP-to-HTTPS examples [`d7064f2`](https://github.com/http-party/node-http-proxy/commit/d7064f2e1e149fe870cbb158932cb99f9f192fce)\n- [examples] updated old examples [`588327c`](https://github.com/http-party/node-http-proxy/commit/588327c2c4392618b515164989f08ef20a30842b)\n- stuff [`e45bfd6`](https://github.com/http-party/node-http-proxy/commit/e45bfd66a21a2470c5a4a4cc1d6095494bbc0f6b)\n- [doc] added some documentation to functions and comments to understand better the code [`5dcdf2b`](https://github.com/http-party/node-http-proxy/commit/5dcdf2b36c24a9584f044b7529265b9ac861d8c7)\n- Fixed issue where error callback would not invoke, including new test cases. Added req/res values to error events. [`0bfb9be`](https://github.com/http-party/node-http-proxy/commit/0bfb9be418926f2113489e92504038127d4c04bb)\n- [examples] updated balancer examples [`831a44b`](https://github.com/http-party/node-http-proxy/commit/831a44b3c8c3acf6c046c47703a07cd6362a0d1c)\n- socket.io stuff [`a74cd85`](https://github.com/http-party/node-http-proxy/commit/a74cd85c8a5aae2851acf7139648fefd6a02a57b)\n- [tests] move contributions of @mmoulton to correct place [`7c72f3b`](https://github.com/http-party/node-http-proxy/commit/7c72f3b407a084a896e420c23ababc3e9357feca)\n- [tests] this file is not necessary anymore [`881c7e6`](https://github.com/http-party/node-http-proxy/commit/881c7e62e0bef7b4b9f81b6fd121f7ad6641bd77)\n- [refactor] move to leaner architecture [`8273cb6`](https://github.com/http-party/node-http-proxy/commit/8273cb6461e4d33f36e583b0354d1bea038d0a56)\n- [fix] remove trailing whitespaces [`0aeaba7`](https://github.com/http-party/node-http-proxy/commit/0aeaba7fe6c51f150d0322eb90a77c1701ed88f5)\n- [test] added tests for web-outgoing.js [`16a4d9d`](https://github.com/http-party/node-http-proxy/commit/16a4d9da1136b79f40ad80482d3fd17dc74274b1)\n- [fix] some stuff start debugging proxystream [`d4f0da8`](https://github.com/http-party/node-http-proxy/commit/d4f0da898e5e8a2d6740e50a7fc34576435e1132)\n- [tests] now each test use a different port to avoid some slow opening and closing ports [`c75d06c`](https://github.com/http-party/node-http-proxy/commit/c75d06c5f92eb7c814deb49bb33cf9fffc632d97)\n- [tests] fixed inherits problem and listen for the correct event [`c65ffbb`](https://github.com/http-party/node-http-proxy/commit/c65ffbb976467dc1768983dcffe111d18e8f2db1)\n- [fix] ProxyStraem now works [`356f43d`](https://github.com/http-party/node-http-proxy/commit/356f43d719998d135e0fc404ac8508e330cf1e5b)\n- [examples] fix the copyright header of example files [`e592c53`](https://github.com/http-party/node-http-proxy/commit/e592c53d1a23b7920d603a9e9ac294fc0e841f6d)\n- [feature] start working on the new server [`b79bd29`](https://github.com/http-party/node-http-proxy/commit/b79bd29d5e984f34b9c07fbdc803aed83b3fd0bb)\n- ENH: updated examples [`f566a42`](https://github.com/http-party/node-http-proxy/commit/f566a42e511f4a6a8f3620f64e05df209e61b64f)\n- [examples] add example of gzip using the connect.compress() middleware [`2142c50`](https://github.com/http-party/node-http-proxy/commit/2142c506e08f56d52e1995da5506c3e032f19c3c)\n- [fix] refactor error handling [`601dbcb`](https://github.com/http-party/node-http-proxy/commit/601dbcbfe929af31995568b4f36b877245809058)\n- [tests] fixed according new refactor and added test to common.setupSocket() [`1cb967b`](https://github.com/http-party/node-http-proxy/commit/1cb967b90aaa5b9da57727b8acbd95108437797a)\n- [feature] websocket support [`79a14ac`](https://github.com/http-party/node-http-proxy/commit/79a14acfd2b2bf03f5ae2b334e7a37e619da6bb9)\n- keepalive sockets [`dad211e`](https://github.com/http-party/node-http-proxy/commit/dad211e71c9ac3b32eba1ea3755edb688053b9d3)\n- [tests] Using target field, tests now pass. We are missing the tests using forward field [`8085178`](https://github.com/http-party/node-http-proxy/commit/8085178dc2c24567adfb872a583863709ce60b5b)\n- [fix] callback as optional error handler [`c7924e0`](https://github.com/http-party/node-http-proxy/commit/c7924e01f92aeec07333273f0882c1dd5e9521ae)\n- ENH: added new https example, needs to be simplified before merge [`427d8d8`](https://github.com/http-party/node-http-proxy/commit/427d8d85369b0cd1d38afa0dd0f28ac98fa16001)\n- [test] proxystream test [`c961279`](https://github.com/http-party/node-http-proxy/commit/c9612798f1207a4c40b616608bf6274d79ad0e4d)\n- [lib] initial draft to websockets passes [`79f7f99`](https://github.com/http-party/node-http-proxy/commit/79f7f99528661162ae4153856888f078f666e017)\n- [fix] minor [`7599cee`](https://github.com/http-party/node-http-proxy/commit/7599cee3fd03a5ce645e313f35557a41c9ac1aee)\n- [tests] added HTTPS to HTTPS test [`31d919b`](https://github.com/http-party/node-http-proxy/commit/31d919b0a3d0b7f574e88fc5eed093c6b1a53548)\n- [feature] started working on error propagation, kinda sucks, gotta think it over [`9ab8749`](https://github.com/http-party/node-http-proxy/commit/9ab8749a9bec33b49c495975e8364336ad7be1a3)\n- [test] testing the onResponse proxy method [`27df8d7`](https://github.com/http-party/node-http-proxy/commit/27df8d72ad86d02cfce00a6e5c183d93dd50f97e)\n- [fix] remove duplicate [`10c0f11`](https://github.com/http-party/node-http-proxy/commit/10c0f11b68e39552051e508c7bf20d65d2d59177)\n- [tests] add more tests [`cedc5c4`](https://github.com/http-party/node-http-proxy/commit/cedc5c4bd2059585e1222ec4f03f09e8bcc808fc)\n- [docs] Update readme with more how to [`ae0faef`](https://github.com/http-party/node-http-proxy/commit/ae0faef5aa0080d742a9740f9cb38bfd54b7d97e)\n- [tests] added test for socket.io proxying [`10a0db4`](https://github.com/http-party/node-http-proxy/commit/10a0db4f0dd4594839f9098b9d67130085a067bc)\n- [tests] added test HTTPS to HTTP using own server [`bbe3bfd`](https://github.com/http-party/node-http-proxy/commit/bbe3bfdf98255b82a185a798ff9f29e74615b6ca)\n- [examples] update the error-handling example using the new error handle way [`a1b25a1`](https://github.com/http-party/node-http-proxy/commit/a1b25a123b4ff71e731f9beb27c5e078acfead65)\n- [fix] quote [`c4ddc4e`](https://github.com/http-party/node-http-proxy/commit/c4ddc4edd324d9910a11eea14561a0e3b953f29c)\n- ENH: updated README and added examples file. [`07091b5`](https://github.com/http-party/node-http-proxy/commit/07091b5077a40dfee29f6fd33ecb38d3fa25b801)\n- [test] passes/web.js (first 2 funcs) [`d40e4be`](https://github.com/http-party/node-http-proxy/commit/d40e4beb62381b962b6cf3254451de0a39f182b1)\n- [test] add test for forwardstream [`8fc3389`](https://github.com/http-party/node-http-proxy/commit/8fc33893672d26013c2b2ff396b777bcf1751527)\n- [tests] fixing tests, fixed some typos and changed how passes are stored [`a704213`](https://github.com/http-party/node-http-proxy/commit/a7042132c881656dd32f915d9b0b962f0ef92efb)\n- [test] added the lib/caronte/streams/forward.js initial test, one test pending [`2fac7b9`](https://github.com/http-party/node-http-proxy/commit/2fac7b9b009b12a940efb22de3af6db55ee686a9)\n- [api] add draft for proxystream [`4f24664`](https://github.com/http-party/node-http-proxy/commit/4f24664e8a50aa9b9a3ea155d067b85f94a8c81b)\n- [experiment] new api for proxying [`07cfa6b`](https://github.com/http-party/node-http-proxy/commit/07cfa6b981ff54d8d96eea6c9aa4b560ee3867ec)\n- [tests] the options got a problem and this test probe that timeout is not being set [`1d1ee88`](https://github.com/http-party/node-http-proxy/commit/1d1ee8858283d7c8984f1c1d6c5185b6822f9235)\n- new error propagation [`3a39e44`](https://github.com/http-party/node-http-proxy/commit/3a39e444ff68a74f6b586f0736bbd3f8a2511ca5)\n- [fix] docs [`ec981c5`](https://github.com/http-party/node-http-proxy/commit/ec981c5b74bf43dd36c8ca89833b751f59f01d38)\n- [examples] added concurrent proxy example [`04c1011`](https://github.com/http-party/node-http-proxy/commit/04c10113f7a3b568fb95b18f30e4aca3e059d961)\n- [fix] closes number #487 [`cde08fb`](https://github.com/http-party/node-http-proxy/commit/cde08fb2ee2df03c9457678d8e6776a5d89165b2)\n- [test] started writing tests [`16eacfa`](https://github.com/http-party/node-http-proxy/commit/16eacfa961d2a2d80534e95eba83010ed6ab01b4)\n- [tests] added tests for websockets [`02007ed`](https://github.com/http-party/node-http-proxy/commit/02007ed0fb38f798436ae5669bb18d4f27496667)\n- Revert \"[fix] fixed options and server reference to can access them from passes functions\" [`babdf53`](https://github.com/http-party/node-http-proxy/commit/babdf531fecd32f9af0963902909fcfa2cd374f1)\n- mm test file [`1a7bef0`](https://github.com/http-party/node-http-proxy/commit/1a7bef0cda58243416a263075dc6eb51f22b6dec)\n- [fix] fixed options and server reference to can access them from passes functions [`90fb01d`](https://github.com/http-party/node-http-proxy/commit/90fb01d38ac5af7ef395547b24e985b6f63b4abc)\n- [examples] added forward example [`7a3f6df`](https://github.com/http-party/node-http-proxy/commit/7a3f6dfbcc80ba32fa81004438c637e8d29eb029)\n- [docs] add UPGRADING.md [`db12f6c`](https://github.com/http-party/node-http-proxy/commit/db12f6c24e22c034c698457cc28ff60c990b55a5)\n- DOC: Added error handling example [`32a4088`](https://github.com/http-party/node-http-proxy/commit/32a40889cedfd6b0d92224aa921700a7b7271c68)\n- [examples] updated the modifyResponse-middleware example [`de3ff11`](https://github.com/http-party/node-http-proxy/commit/de3ff11656b4a847de3a63b28feed39b6c816480)\n- [test] test onError part, proxying to no where [`b85aa16`](https://github.com/http-party/node-http-proxy/commit/b85aa16e75401a223a947cde444d42cf7eeafb67)\n- ENH: updated agent options in `common.setupOutgoing` [`12cda56`](https://github.com/http-party/node-http-proxy/commit/12cda561afe534427a5f84da9d7e0beb64a8ecbc)\n- [fix] minor and short fixes [`e0faaaf`](https://github.com/http-party/node-http-proxy/commit/e0faaaf81152203b96f0313c68706468e7ee7357)\n- support websockets [`4a4607d`](https://github.com/http-party/node-http-proxy/commit/4a4607d075a912746386d1751fd6b0fc98cf6b20)\n- [test] COVERAGE [`004a46c`](https://github.com/http-party/node-http-proxy/commit/004a46c09df2f0f7b15d8e8f7119bc6039e0c01c)\n- [misc] add a LICENSE file [`584ce76`](https://github.com/http-party/node-http-proxy/commit/584ce76e7576c906e25cdd04a2e079f97bcf86ff)\n- ENH: updated https and agent option [`13741a8`](https://github.com/http-party/node-http-proxy/commit/13741a823f1c1c884d4a37e597e4b188598b0e25)\n- [fix] write connection header [`2c10f25`](https://github.com/http-party/node-http-proxy/commit/2c10f256b658bc0e906c20f29d94ab7eaf653055)\n- [fix] merge #495, thanks @glasser [`d0862af`](https://github.com/http-party/node-http-proxy/commit/d0862aff0c693366dcb11649b6abe1d011268953)\n- support forward [`8c8c455`](https://github.com/http-party/node-http-proxy/commit/8c8c455541f21ad9a9ac7ca19d1f37368206a2e2)\n- [tests] fix tests set correct host headers [`cfd417d`](https://github.com/http-party/node-http-proxy/commit/cfd417de2352b0f05535b979dc15abff60c1fb96)\n- [fix] Optimize fix for `x-forwarded-for-port`. [`2d42709`](https://github.com/http-party/node-http-proxy/commit/2d42709c3283637de16a49e815b03e63432bbd29)\n- ENH: updated readme with an example [`edd8e2f`](https://github.com/http-party/node-http-proxy/commit/edd8e2f04e4b39391b062fa6437d61b4ebde8748)\n- [doc] update README.md [`dcb873a`](https://github.com/http-party/node-http-proxy/commit/dcb873ad9992b1534615d59b8a0a70e8b87d7884)\n- [test] passes/web.js XHeaders func [`c02b721`](https://github.com/http-party/node-http-proxy/commit/c02b721321c455bc287c3fed6b9b21392ce2fc70)\n- [fix] fixed passes functions, now 'this' can be used and options are stored on 'this.options' [`9b3e1eb`](https://github.com/http-party/node-http-proxy/commit/9b3e1eb247df29d18ea299ff4ebb2f10eeb71269)\n- Revert \"[fix] fixed passes functions, now 'this' can be used and options are stored on 'this.options'\" [`5e130de`](https://github.com/http-party/node-http-proxy/commit/5e130de8548ad41b821da49299b4fd1c9536c5f0)\n- [minor] Remove duplicate dependencies and cleanup of the scripts [`a51b062`](https://github.com/http-party/node-http-proxy/commit/a51b0622780f48160001f9e74340f7d720cbfce6)\n- TEST: added agent and header tests [`39b0c46`](https://github.com/http-party/node-http-proxy/commit/39b0c46a6967fda5329760ad93a8ec01bc4a6f14)\n- [examples] fix styling and bad spaces [`6a6dfbb`](https://github.com/http-party/node-http-proxy/commit/6a6dfbb79dc156679f75dd519344d19a5b61613b)\n- ENH: added error events [`1b867a7`](https://github.com/http-party/node-http-proxy/commit/1b867a7f594f7dfe49fc17ff53451a353ec509d9)\n- [test] remove chunked on http1.0 [`ca09263`](https://github.com/http-party/node-http-proxy/commit/ca092635e7ac4d967b554e3b94a16a931946d464)\n- [tests] fix test to use the new way to pass options [`52ecd52`](https://github.com/http-party/node-http-proxy/commit/52ecd52ee5aa78603e44ba8d5ff9187410351622)\n- [examples] fixed https examples [`a467b7b`](https://github.com/http-party/node-http-proxy/commit/a467b7b4a9614a7cbfdc256524e1495616e3d4d9)\n- Revert \"[tests] fix test to use the new way to pass options\" [`2bf20d6`](https://github.com/http-party/node-http-proxy/commit/2bf20d61d53201e9820c5f9215e641fcf88f5172)\n- [fix] better code [`3d8e538`](https://github.com/http-party/node-http-proxy/commit/3d8e5383cd9d527825f95d9071a87865fcebca05)\n- [feature] implement _write and _read [`6a4294c`](https://github.com/http-party/node-http-proxy/commit/6a4294cbdfe85fa162969b1393032adc9d418441)\n- [fix] use the correct arguments order [`cc09ae6`](https://github.com/http-party/node-http-proxy/commit/cc09ae6a345cfde1689e1d8731c5822675c59d4d)\n- [fix] fix the correct order of arguments in ws-incoming passes [`02df9a3`](https://github.com/http-party/node-http-proxy/commit/02df9a33c5cce17ea32a892017acbe5ce57ab2e5)\n- [fix] write status [`e08d4ed`](https://github.com/http-party/node-http-proxy/commit/e08d4edad339d0f7f55900b3e6e6a0e770960215)\n- [fix] finished jshint fixes [`455f97e`](https://github.com/http-party/node-http-proxy/commit/455f97e14cb4929e0a3a5c746471e9c5e76436fc)\n- Update the README to describe middleware err handler. [`25bb3bf`](https://github.com/http-party/node-http-proxy/commit/25bb3bfa7012e0f975e10f0311cae8c39183fa41)\n- Prevent headers to be sent twice [`8332e74`](https://github.com/http-party/node-http-proxy/commit/8332e744202ed9de94288d8f1c822cd9fe788983)\n- [examples] added package.json with the dependencies needed by examples [`d85ccdd`](https://github.com/http-party/node-http-proxy/commit/d85ccdd333edcfc7551bcf8e0ffd7dc166e38e61)\n- [tests] added .travis.yml file [`0602500`](https://github.com/http-party/node-http-proxy/commit/06025002303f351f71d9e5f78a93895257f0d283)\n- [dist minor] 2 space indents next time @samalba [`7e8041d`](https://github.com/http-party/node-http-proxy/commit/7e8041d2b687b8375a1d0fe45270029c6e8ddee6)\n- [fix] naming [`8931009`](https://github.com/http-party/node-http-proxy/commit/893100972c22febbf133134394bc0bcef47d9e12)\n- Fix for #458. Host header may cause some sites not to be proxyable with changeOrigin enabled [`781c038`](https://github.com/http-party/node-http-proxy/commit/781c038f2b4d14a01cc9297e1e0dba6ce39dd6cb)\n- [docs] typos, typos everywhere... [`03880d8`](https://github.com/http-party/node-http-proxy/commit/03880d8d069e9e17ca7d7aea6eb760f6626a869c)\n- ENH: updated `ws` and `web` functions to use the global options object as a base [`268afe3`](https://github.com/http-party/node-http-proxy/commit/268afe34bb51448d511c9cd73c03e97d1c1baee0)\n- [fix] make @mmalecki a happy camper [`c9cd6d2`](https://github.com/http-party/node-http-proxy/commit/c9cd6d2ad324e0e6222932c8f29f27621071e045)\n- write [`f97c0c6`](https://github.com/http-party/node-http-proxy/commit/f97c0c6167371c5ff92e6361b1df02e3fd5506d7)\n- [fix] [`a9f9e21`](https://github.com/http-party/node-http-proxy/commit/a9f9e21eda2f8e912523e6b62abb0101c0353505)\n- [fix] coveralls.. will it work? [`f36cb4d`](https://github.com/http-party/node-http-proxy/commit/f36cb4d5a110fc86272e878278f103f313c86f56)\n- ENH: updated target and forward options so that a string may be specified [`ef946a7`](https://github.com/http-party/node-http-proxy/commit/ef946a7697b38b13178881b3d1ebde63681dd4a1)\n- added option for eventlistenerCount(max) [`8eb6780`](https://github.com/http-party/node-http-proxy/commit/8eb6780f8705caff13a5375446539b0621d497d7)\n- [fix] support buffer [`1204a35`](https://github.com/http-party/node-http-proxy/commit/1204a35e467c6c1855ba0dac8f55d79f899148a6)\n- DOC: updated readme with options [`1b5fb1d`](https://github.com/http-party/node-http-proxy/commit/1b5fb1d8fc21421b8383919d93e4149b586b211b)\n- ENH: added 'headers' to available options, to add or overwrite existing headers [`7d840d3`](https://github.com/http-party/node-http-proxy/commit/7d840d35151be1aac612798754af47368594781d)\n- [fix] move logo [`57abb7f`](https://github.com/http-party/node-http-proxy/commit/57abb7f26c14e281c3be07a8b84e3c79e066f59f)\n- FIX: tests. still need to add more tests tho [`a350fad`](https://github.com/http-party/node-http-proxy/commit/a350fadea6bace293131581487f8c66948009449)\n- [fix] move logo [`aaff196`](https://github.com/http-party/node-http-proxy/commit/aaff1966e4e2eb42c9890e57737f57a64e8d964a)\n- [docs] add travis build status [`6b61878`](https://github.com/http-party/node-http-proxy/commit/6b618787598a2a37850898dbdb3b4fe8f3c3414d)\n- [fix] do not send chunked responses to http1.0 clients [`8663ac1`](https://github.com/http-party/node-http-proxy/commit/8663ac1c43505f0081d906c3cd8e702d4b5ddeb0)\n- [dist] Bump dependencies. [`a81dd8d`](https://github.com/http-party/node-http-proxy/commit/a81dd8d53e1595cba9acf5cc3ca9517165dcc4aa)\n- [fix] readme [`4d3a4e1`](https://github.com/http-party/node-http-proxy/commit/4d3a4e1ee7370347898d1863ab73aa68ed345d8d)\n- [fix] proxying to https [`26c4c43`](https://github.com/http-party/node-http-proxy/commit/26c4c43a06263ec6721bc0e8a90644297d0cf217)\n- [fix] new logo [`ee3cc38`](https://github.com/http-party/node-http-proxy/commit/ee3cc380665a31ec6af28ddb73dfc543f430d3f8)\n- [fix] naming convention [`7d71a86`](https://github.com/http-party/node-http-proxy/commit/7d71a867a8bdc375f7577cec3905cca89bbf415c)\n- fix docs [`9243444`](https://github.com/http-party/node-http-proxy/commit/9243444ac006f73c00b0f1f78c4a77f342b0b4e4)\n- [fix] short circuit [`a6256ca`](https://github.com/http-party/node-http-proxy/commit/a6256cac1df1739e3da78fe5f0cf122ef7ce6b14)\n- [tests] this test is already in web-incoming tests [`920f1e7`](https://github.com/http-party/node-http-proxy/commit/920f1e7707aa1751577533cd368529f8a704d7af)\n- Emit middlewareError when on middleware error. [`bc12ca3`](https://github.com/http-party/node-http-proxy/commit/bc12ca39394f9aeed3e3047f59035ba48afa2885)\n- DOC: updated readme [`7ad5c0f`](https://github.com/http-party/node-http-proxy/commit/7ad5c0f993294c9e2e7650e15fbc62d11a2cb062)\n- [docs] add logo [`8b05626`](https://github.com/http-party/node-http-proxy/commit/8b05626eed5e45e72cf9b1f14a4c4dca1dd2ed0f)\n- [fix] making @stoke a happy camper [`34f16e7`](https://github.com/http-party/node-http-proxy/commit/34f16e74647095199f84ab61e10c8dafd60b505a)\n- [feature] add buffer support [`e3f8d5f`](https://github.com/http-party/node-http-proxy/commit/e3f8d5fdbe1ebc4f04188d95bbef768d09718d2c)\n- [Fix] 2 spelling mistakes [`5823842`](https://github.com/http-party/node-http-proxy/commit/58238421945bcc4236e280ebca7799b831ae29a4)\n- [fix] do not call .end [`6e77cd3`](https://github.com/http-party/node-http-proxy/commit/6e77cd390929842088ae9f6deb922a6627ddfecd)\n- attempting to fix link to valid options properties [`bbe2b27`](https://github.com/http-party/node-http-proxy/commit/bbe2b2788a7ee3c74fd44fe88b6dcf213264436f)\n- [fix] slimmer proxying [`031aa0f`](https://github.com/http-party/node-http-proxy/commit/031aa0fbf30bd377696c4efa508f6fc769bf1070)\n- [fix] use agent pool [`abf1d90`](https://github.com/http-party/node-http-proxy/commit/abf1d90fdf05a17ebe05a3e90d464a592e0aee69)\n- [tests] fix test using undefined url [`c4d56a5`](https://github.com/http-party/node-http-proxy/commit/c4d56a5faf1e89cdeb911f0ece0efe065eb58c45)\n- [fix] legacy [`162a42f`](https://github.com/http-party/node-http-proxy/commit/162a42f58f515c5418ccfac0b68f4c928103b1e1)\n- [tests] fixing minor typos [`b333e63`](https://github.com/http-party/node-http-proxy/commit/b333e63648aa67ea1b1aaf17ba684e5fc6f751a6)\n- Updated readme [`bd106d6`](https://github.com/http-party/node-http-proxy/commit/bd106d69f074a1c7018e685a4e144e23a17beb8c)\n- [misc] use the local mocha instead the global [`f1aeb05`](https://github.com/http-party/node-http-proxy/commit/f1aeb0500cde39b63e570323e0e478530d1222ab)\n- added unlimited listeners to the reverproxy event obj. [`1333c0c`](https://github.com/http-party/node-http-proxy/commit/1333c0cc62e7b590843f9b00326fe80137163c5e)\n- [tests] throw error when no options, ALL TESTS PASSING! YAY [`86750c7`](https://github.com/http-party/node-http-proxy/commit/86750c7e594c419dfae957aaf7e44e61e1d480e8)\n- ENH: updated example [`1c7ace2`](https://github.com/http-party/node-http-proxy/commit/1c7ace26c5a36fb63497f1ab67793c5b75495063)\n- [merge] PR #470 [`38e6d7c`](https://github.com/http-party/node-http-proxy/commit/38e6d7cd5449a7264dcf5244b3dfd07b2dda60e1)\n- [fix] remove stuff [`6a03e5f`](https://github.com/http-party/node-http-proxy/commit/6a03e5f7cf356416ea13584e279f5bfa3791c058)\n- [test][misc] remove node@0.8 to test on travis [`8eff1a1`](https://github.com/http-party/node-http-proxy/commit/8eff1a1f26bb739dfc5a1ad90b140ff2a18921d5)\n- merge with @cronopio [`0fb3381`](https://github.com/http-party/node-http-proxy/commit/0fb33810f5e70b714bd9868557d85a531b8e11e3)\n- [merge] text [`98f29bd`](https://github.com/http-party/node-http-proxy/commit/98f29bdcfca9b818ffe107b09578539fdf379c8a)\n- [fix] woops [`bd3df45`](https://github.com/http-party/node-http-proxy/commit/bd3df45010f282997cae3a699c7ecb885c01bdf8)\n- [test] Test on newer version of node [`ebbba73`](https://github.com/http-party/node-http-proxy/commit/ebbba73eda49563ade09f38bdc8aef13d1cf6c00)\n- new error propagation - follows [`1993faf`](https://github.com/http-party/node-http-proxy/commit/1993faf8a4227acda3423d46cf2cf13b4d9861e7)\n- [fix] minor typo [`5a1504f`](https://github.com/http-party/node-http-proxy/commit/5a1504f0764b7747b53cc0d92a69ff3093e85ade)\n- [fix] proxy to http(s) [`3c91ed3`](https://github.com/http-party/node-http-proxy/commit/3c91ed3d26d9af640d0c7a09fb9cdaf80ad673ca)\n- Put the arguments the right way around in the README. [`1457980`](https://github.com/http-party/node-http-proxy/commit/145798062e332ac2aed7f8e8e3240e38464c870a)\n- [fix] use some [`4480699`](https://github.com/http-party/node-http-proxy/commit/4480699d3a2a5080c051e7b8a100689fd1f58657)\n- [fix] layout [`d7078e2`](https://github.com/http-party/node-http-proxy/commit/d7078e2fdd16d23d0b5f8f1d8a7ab3e9011fea4f)\n- [docs] logo [`dd0f7b8`](https://github.com/http-party/node-http-proxy/commit/dd0f7b8876ae5b57fffab8857735b25b159f2bdb)\n- [fix] url [`0637322`](https://github.com/http-party/node-http-proxy/commit/0637322d96e54bbcf5a14bf009dd73314cada4ce)\n- [fix] opts [`adc5be0`](https://github.com/http-party/node-http-proxy/commit/adc5be020c7fff09a1c05ac771d5c5ab61002c23)\n- [docs] fix syntax highlighting [`da9de70`](https://github.com/http-party/node-http-proxy/commit/da9de7034a452d1281217a349bc9403fddcc2b7f)\n- [fix] typo [`275a519`](https://github.com/http-party/node-http-proxy/commit/275a5192fa257f78287a954b347e65023795487d)\n- [tests] fix code coverage, changed pattern on blanket options [`4090250`](https://github.com/http-party/node-http-proxy/commit/40902506af3361b642b8798350b48404fe0a4e78)\n- Put the arguments the right way around in emitter. [`7c8ecc8`](https://github.com/http-party/node-http-proxy/commit/7c8ecc8ea85b59fc16b55b9a142372b6ac168b2a)\n- [fix] link [`72a89ea`](https://github.com/http-party/node-http-proxy/commit/72a89eab8bafef3742d78e8de8631094f961f427)\n- [fix] space [`69f126b`](https://github.com/http-party/node-http-proxy/commit/69f126b34cbd190be8541a854d21f13bfb5a61bf)\n- [fix] tests [`8269eca`](https://github.com/http-party/node-http-proxy/commit/8269eca2bb34d08336b8889e06e53d3522fa79fe)\n- [fix] console [`18341d5`](https://github.com/http-party/node-http-proxy/commit/18341d559717e0a86f5ee4da024109e4b5a595a7)\n- Set travis to run `npm test` while we fix coveralss.io integration [`e2a5d51`](https://github.com/http-party/node-http-proxy/commit/e2a5d513cac3ebceff446787fa106c7f00caf785)\n- [fix] making @jcrugzz a happy camper [`2e7343d`](https://github.com/http-party/node-http-proxy/commit/2e7343d728a3187d48821b88ec2e2d4699bb2afe)\n- [fix] minor typo [`5d66ce1`](https://github.com/http-party/node-http-proxy/commit/5d66ce11bb7eef7e704a2de2c0ef3b5f754843e9)\n- [tests] tests fixed [`d60353f`](https://github.com/http-party/node-http-proxy/commit/d60353f80bbbcba128a2c51066e107365270e878)\n- [tests] disabled the examples-test by now [`d83fdf6`](https://github.com/http-party/node-http-proxy/commit/d83fdf69a1121bfcfba72bbffcd3105ae5852c56)\n- [fix] _ because it is unused [`590bb60`](https://github.com/http-party/node-http-proxy/commit/590bb604dae11223a0ae80469b59d6d341488f1f)\n- [tests] disable test, by now is not throwing without options [`a2b1f0a`](https://github.com/http-party/node-http-proxy/commit/a2b1f0a4c9079342db6255c5f92db4a0cb992707)\n- [fix] support target and forward [`961d2f9`](https://github.com/http-party/node-http-proxy/commit/961d2f9400b4cfd236c3c8ccbf401d37f8e871b8)\n- [dist] Version bump. 0.10.4 [`840f6d8`](https://github.com/http-party/node-http-proxy/commit/840f6d8d29dffc11d3726123c2d400940ca2bdda)\n- [fix] remove old reminescence [`4d65280`](https://github.com/http-party/node-http-proxy/commit/4d65280ea313438a94589bacf55f7a09cc107888)\n- [feature] add emit proxyRes [`dda6f7a`](https://github.com/http-party/node-http-proxy/commit/dda6f7a45a46d2bf63e482d0b47b7c36ae548546)\n- [docs] test badge [`1ceea3e`](https://github.com/http-party/node-http-proxy/commit/1ceea3e5f9b6232d60d673946bbccb7d8ccb4beb)\n- [tests] remove caronte and use http-proxy for file names [`c9f5772`](https://github.com/http-party/node-http-proxy/commit/c9f5772fc18226aca31471bc96c44a6dbff5cbea)\n- [logo] [`4c2f2f3`](https://github.com/http-party/node-http-proxy/commit/4c2f2f3b9a5ba65f97403e778a670f14301d52c1)\n\n## [v0.10.3](https://github.com/http-party/node-http-proxy/compare/v0.10.2...v0.10.3) - 2013-06-20\n\n### Merged\n\n- Pass default certs to SNICallback example [`#419`](https://github.com/http-party/node-http-proxy/pull/419)\n\n### Fixed\n\n- Pass default certs to SNICallback example [`#399`](https://github.com/http-party/node-http-proxy/issues/399)\n\n### Commits\n\n- [dist] Bump version to 0.10.3 [`2fd748f`](https://github.com/http-party/node-http-proxy/commit/2fd748fb61dac7de0daa50aabbface7033c6a222)\n- [fix] Respect `maxSockets` from `target` options in `RoutingProxy` [`e1d384e`](https://github.com/http-party/node-http-proxy/commit/e1d384e769e9f4adc5a06c516cfb721ff24b4b6d)\n- Send path in req.path and not the url [`0c75323`](https://github.com/http-party/node-http-proxy/commit/0c753234c0c85333f909bdbef034ffb6e192bad5)\n\n## [v0.10.2](https://github.com/http-party/node-http-proxy/compare/v0.10.1...v0.10.2) - 2013-04-21\n\n### Merged\n\n- Correct keep-alive responses to HTTP 1.0 clients [`#407`](https://github.com/http-party/node-http-proxy/pull/407)\n\n### Fixed\n\n- [minor] Style compliance. Fixes #402. [`#402`](https://github.com/http-party/node-http-proxy/issues/402)\n\n### Commits\n\n- Correct keep-alive responses to HTTP 1.0 clients. [`a29b5e8`](https://github.com/http-party/node-http-proxy/commit/a29b5e8e289c34c00d2b450e5fb9dd1969db4b97)\n- [minor] Strip trailing whitespace. [`7fc39d7`](https://github.com/http-party/node-http-proxy/commit/7fc39d77f47311b82c24ab05f8e1a45a2733305c)\n- Add headers on 'handshake' [`985025c`](https://github.com/http-party/node-http-proxy/commit/985025c90f3b2fafede64d8b17c318326f2423d9)\n- Don't test raw HTTP 1.0 requests over HTTPS. [`daf53bd`](https://github.com/http-party/node-http-proxy/commit/daf53bd753879223dc84a49c92d0efaf576c1fd3)\n- [dist] Version bump. 0.10.2 [`de0928f`](https://github.com/http-party/node-http-proxy/commit/de0928f616dd62165e8a22c00d091cabf31e1e87)\n\n## [v0.10.1](https://github.com/http-party/node-http-proxy/compare/v0.10.0...v0.10.1) - 2013-04-12\n\n### Merged\n\n- Fix for slab buffer retention, leading to large memory consumption [`#370`](https://github.com/http-party/node-http-proxy/pull/370)\n\n### Commits\n\n- [dist] Version bump. 0.10.1 [`9c13ad4`](https://github.com/http-party/node-http-proxy/commit/9c13ad46e416125373d6604f3954ec3df1f55449)\n\n## [v0.10.0](https://github.com/http-party/node-http-proxy/compare/v0.9.1...v0.10.0) - 2013-03-18\n\n### Merged\n\n- Change the emitter of the `proxyResponse` event [`#385`](https://github.com/http-party/node-http-proxy/pull/385)\n- Fixing a bug that generates an unexpected TypeError [`#383`](https://github.com/http-party/node-http-proxy/pull/383)\n- Mention Harmon used for response modifications in the readme [`#384`](https://github.com/http-party/node-http-proxy/pull/384)\n\n### Commits\n\n- [dist] Update CHANGELOG.md [`8665f3c`](https://github.com/http-party/node-http-proxy/commit/8665f3cc600feecbb4c8229699823149c69a144f)\n- Harmon messsage [`35ba0db`](https://github.com/http-party/node-http-proxy/commit/35ba0db554c6bace21b1bacfa8f5fb6df4228db0)\n- [fix breaking] Emit the `proxyResponse` event on the HttpProxy instance to reduce listener churn and reference counts. [`2620f06`](https://github.com/http-party/node-http-proxy/commit/2620f06e2db9a267945566f10837c4c2a5df753d)\n- [dist] Version bump. 0.10.0 [`71183bf`](https://github.com/http-party/node-http-proxy/commit/71183bf30bc2b9ad2eaf57c51980eeb0bc7edff0)\n- Fixing the if statement as it lead to 'TypeError: Parameter 'url' must be a string, not undefined' in certain cases [`c9b6895`](https://github.com/http-party/node-http-proxy/commit/c9b6895c5e14add6aba4f826a2173458a1896a5f)\n- Harmon messsage [`4e42354`](https://github.com/http-party/node-http-proxy/commit/4e42354e77d5731a383d516fc0b249d5d0eda745)\n\n## [v0.9.1](https://github.com/http-party/node-http-proxy/compare/v0.9.0...v0.9.1) - 2013-03-09\n\n### Commits\n\n- [dist doc] Updated CHANGELOG.md for `v0.9.1` [`ea5e214`](https://github.com/http-party/node-http-proxy/commit/ea5e214522d8ac34d1129b28ff188c0f232ce63f)\n- [dist] Version bump. 0.9.1 [`701dc69`](https://github.com/http-party/node-http-proxy/commit/701dc698e3eb39ca6836a02611d8dce750f4e212)\n- [breaking] Ensure that `webSocketProxyError` also receives the error to be consistent with `proxyError` events. [`c78356e`](https://github.com/http-party/node-http-proxy/commit/c78356e9cf27a21c57e4c98ef7dd3c22abe864c2)\n\n## [v0.9.0](https://github.com/http-party/node-http-proxy/compare/v0.8.7...v0.9.0) - 2013-03-09\n\n### Merged\n\n- If HTTP 1.1 is used and backend doesn't return 'Connection' header, expicitly  return Connection: keep-alive. [`#298`](https://github.com/http-party/node-http-proxy/pull/298)\n- add \"with custom server logic\" to the \"Proxying WebSockets\" section of the readme [`#332`](https://github.com/http-party/node-http-proxy/pull/332)\n- routing proxy 'this' reference bug? [`#365`](https://github.com/http-party/node-http-proxy/pull/365)\n- fixed issue #364 'proxyError' event emitted twice [`#374`](https://github.com/http-party/node-http-proxy/pull/374)\n- Misleading documentation for Websockets via .createServer [`#349`](https://github.com/http-party/node-http-proxy/pull/349)\n\n### Fixed\n\n- [api test] Manually merge #195 from @tglines since that fork was deleted. Update tests to use new macros. Fixes #195. Fixes #60. [`#195`](https://github.com/http-party/node-http-proxy/issues/195) [`#60`](https://github.com/http-party/node-http-proxy/issues/60)\n- [fix] Set \"content-length\" header to \"0\" if it is not already set on DELETE requests. Fixes #338. [`#338`](https://github.com/http-party/node-http-proxy/issues/338)\n- [fix] Do not use \"Transfer-Encoding: chunked\" header for proxied DELETE requests with no \"Content-Length\" header. Fixes #373. [`#373`](https://github.com/http-party/node-http-proxy/issues/373)\n- [fix] http-proxy should not modify the protocol in redirect request for external sites. Fixes #359. [`#359`](https://github.com/http-party/node-http-proxy/issues/359)\n- [fix] Emit `notFound` event when ProxyTable location does not exist. Fixes #355. Fixes #333. [`#355`](https://github.com/http-party/node-http-proxy/issues/355) [`#333`](https://github.com/http-party/node-http-proxy/issues/333)\n- [fix] Make options immutable in `RoutingProxy`. Fixes #248. [`#248`](https://github.com/http-party/node-http-proxy/issues/248)\n- [fix] Remove special case handling of `304` responses since it was fixed in 182dcd3. Fixes #322. [`#322`](https://github.com/http-party/node-http-proxy/issues/322)\n- [fix] Ensure `response.headers.location` is defined. Fixes #276. [`#276`](https://github.com/http-party/node-http-proxy/issues/276)\n\n### Commits\n\n- [minor] s/function(/function (/ s/){/) {/ [`9cecd97`](https://github.com/http-party/node-http-proxy/commit/9cecd97153ccce4f81c5eda35a49079e651fb27a)\n- working on x-forwarded-for [`1332409`](https://github.com/http-party/node-http-proxy/commit/133240937dc63aca0007388327837bc24808f79a)\n- Routing Proxy was not sending x-forward-*. Fixing It... [`916d44e`](https://github.com/http-party/node-http-proxy/commit/916d44e3d2a17bb9d5178f347ddad9796b988e05)\n- Added timeout option and test to test new timeout parameter, added requestFail assertion. [`89d43c2`](https://github.com/http-party/node-http-proxy/commit/89d43c20dd0dec1dda1fd70e57f3f250b9e3b431)\n- Add tests for headers bug fixes [`ecb5472`](https://github.com/http-party/node-http-proxy/commit/ecb547223f3f1d9bf551842c2026ee2f1a18638a)\n- Added simple round robin example with websocket support [`83fbd42`](https://github.com/http-party/node-http-proxy/commit/83fbd4250660f41de1ab2b5490a3bf58200ae148)\n- - support unix donain sockets and windows named pipes (socketPath) on node 0.8.x. On node 0.6.x the support was opaque via port, but on the new node, socketPath should be set explicitely. [`ffe74ed`](https://github.com/http-party/node-http-proxy/commit/ffe74ed299f81206b898147dbcc985519b2921f8)\n- pathnameOnly flag added.  Ignores hostname and applies routing table to the paths being requested. [`46b078a`](https://github.com/http-party/node-http-proxy/commit/46b078a98d10de7726a3bbca89121acc57ad7625)\n- [doc] added comments to pathnameOnly block. [`5e6be6c`](https://github.com/http-party/node-http-proxy/commit/5e6be6ccf5a39ff450e57d7b24e374a83569fa85)\n- remove offending code, final fix for issue #364 [`3b84e27`](https://github.com/http-party/node-http-proxy/commit/3b84e27ab4efd5ce3b8ac837d699d4ff6661c7e7)\n- memory leak fix in closing of the scokets [`2055d0c`](https://github.com/http-party/node-http-proxy/commit/2055d0c8ec16699ffb06adf6d64d9506920b2071)\n- Fix truncated chunked responses [`ef66833`](https://github.com/http-party/node-http-proxy/commit/ef66833c4d7f07ae9f42026f2bcc0fbca2440579)\n- Re-added previous description [`603106a`](https://github.com/http-party/node-http-proxy/commit/603106a13d28c0199fa4456cc9aee1692eb2588c)\n- pathnameOnly option documented in the Readme.md [`a1607c1`](https://github.com/http-party/node-http-proxy/commit/a1607c1684a7d7617e5148a0dca882eb08a9f03b)\n- [fix minor] Prevent crashes from attempting to remove listeners more than once when proxying websocket requests. [`a681493`](https://github.com/http-party/node-http-proxy/commit/a681493371ae63f026e869bf58b6fea682dc5de3)\n- Added comments [`64efa7f`](https://github.com/http-party/node-http-proxy/commit/64efa7f9291a2377a32e942a247700b71b107993)\n- Revert \"[fix minor] Prevent crashes from attempting to remove listeners more than once when proxying websocket requests.\" [`c6da760`](https://github.com/http-party/node-http-proxy/commit/c6da760ca9f375025229fe3fc174aca943362f38)\n- [doc dist] Update CHANGELOG.md for `v0.9.0`. [`133115c`](https://github.com/http-party/node-http-proxy/commit/133115c9760130dcef447efbd18c470c08795c90)\n- add support for loading CA bundles [`10f6b05`](https://github.com/http-party/node-http-proxy/commit/10f6b0577518bdfcb6b43c1f516dc988bdcade53)\n- problem: don't want to run my server as root to bind to privileged ports (e.g. 80, 443). [`2c36507`](https://github.com/http-party/node-http-proxy/commit/2c3650746cd90fed63b140a8d393e18bd35cd8f9)\n- Add 'proxyResponse' event so observer can modify response headers or abort response. [`3b86a7a`](https://github.com/http-party/node-http-proxy/commit/3b86a7aae3fc366c5fa8645285a4368dbac7a0dc)\n- [minor] Move private helper to end of file. [`476cbe7`](https://github.com/http-party/node-http-proxy/commit/476cbe741fc41b7f1eb269d841d922784e8b3c6b)\n- Fix for retaining large slab buffers in node core [`d2888c8`](https://github.com/http-party/node-http-proxy/commit/d2888c83f5eab3fb82425ef4fd51e62621bf2764)\n- [dist] Update `devDependencies` [`ad21310`](https://github.com/http-party/node-http-proxy/commit/ad213106d06cfc79004841f04b8e73fe7d7ef67a)\n- [minor] Small whitespace compliance. [`ea0587a`](https://github.com/http-party/node-http-proxy/commit/ea0587a8f98b1eedc38c66b69293ae091e24be6e)\n- [doc fix] Add undefined var in example. [`deca756`](https://github.com/http-party/node-http-proxy/commit/deca7565c51fd678354d26eaae7fe2481e36e2c3)\n- working on x-forwarded-for [`31fc94a`](https://github.com/http-party/node-http-proxy/commit/31fc94aa5e43c54033d5384caaf104eebf3889bd)\n- Allow event observers to access upstream response headers and data. [`4c130f5`](https://github.com/http-party/node-http-proxy/commit/4c130f5dac5f2cfbfc2618446b86244aff4cb04f)\n- [fix doc] Fix bad variable reference in `README.md`. [`440013c`](https://github.com/http-party/node-http-proxy/commit/440013c263a96c6681bfe92a8f56db93b58efa8d)\n- Change wording for handling websocket proxy events [`ee6bbe0`](https://github.com/http-party/node-http-proxy/commit/ee6bbe00244c90bd532b11ff1c796aea8c7372f8)\n- [dist] Version bump. 0.9.0 [`c68e038`](https://github.com/http-party/node-http-proxy/commit/c68e0389120d8530e578e20496d8ee091e69a580)\n- fix 'this' reference in routing proxy listener bindings [`15afc23`](https://github.com/http-party/node-http-proxy/commit/15afc23a275f3fa16653fff6179368122661a0af)\n- cleanning [`8d87399`](https://github.com/http-party/node-http-proxy/commit/8d8739999fcaf4cdd8f2471046f6f036c44dc8f7)\n- cleanning [`9672b99`](https://github.com/http-party/node-http-proxy/commit/9672b9927156a0dfe3ce4539f380aaf3172f6267)\n- Fix typo which slipped in during patch clean-up [`ba65a48`](https://github.com/http-party/node-http-proxy/commit/ba65a485fcf7230e85cee77f6eefcd17e46c8f86)\n- Remove data event that is not needed after-all. [`b1c4bd6`](https://github.com/http-party/node-http-proxy/commit/b1c4bd61e8ae5705d4cc97bf719c381554671967)\n\n## [v0.8.7](https://github.com/http-party/node-http-proxy/compare/v0.8.6...v0.8.7) - 2012-12-22\n\n### Commits\n\n- [fix] Handle errors on request object [`edfe869`](https://github.com/http-party/node-http-proxy/commit/edfe86915941e465a06c1d0a3330ee32e5834aa6)\n- [dist] Bump version to 0.8.7 [`26d3646`](https://github.com/http-party/node-http-proxy/commit/26d3646ff252129f35525ab0540a31f5617a31d2)\n- [fix] Don't remove `error` listener after response ends [`223eacd`](https://github.com/http-party/node-http-proxy/commit/223eacda85a4267f2860f6c46f7dedfa9db8c224)\n\n## [v0.8.6](https://github.com/http-party/node-http-proxy/compare/v0.8.5...v0.8.6) - 2012-12-21\n\n### Merged\n\n- http-proxy: 304 responses should emit 'end' too [`#337`](https://github.com/http-party/node-http-proxy/pull/337)\n\n### Commits\n\n- [bench] Remove silly \"benchmarks\" [`2bd9cd9`](https://github.com/http-party/node-http-proxy/commit/2bd9cd9adb6cea6763930468d22cb56fffab6218)\n- [bench] Add a benchmark for websockets throughput [`6797a27`](https://github.com/http-party/node-http-proxy/commit/6797a2705a309d19a655ab468bcc80ba2e43cf41)\n- [fix] Handle socket errors [`2a61ec8`](https://github.com/http-party/node-http-proxy/commit/2a61ec85bdaeed9a5fca2a117efb36a7f76becc4)\n- [dist] Update `devDependencies` [`b81d9b7`](https://github.com/http-party/node-http-proxy/commit/b81d9b71daa32a571384cff29d81227993299236)\n- [dist] Bump version to 0.8.6 [`6cd78f6`](https://github.com/http-party/node-http-proxy/commit/6cd78f6af9ca08b8797c409896eea2ae6bb6d835)\n- [bench] More exact size display [`7bc1a62`](https://github.com/http-party/node-http-proxy/commit/7bc1a628feab78f8931e9e6481737dd871debfeb)\n\n## [v0.8.5](https://github.com/http-party/node-http-proxy/compare/v0.8.4...v0.8.5) - 2012-11-16\n\n### Merged\n\n- lib: allow overriding maxSockets [`#323`](https://github.com/http-party/node-http-proxy/pull/323)\n\n### Fixed\n\n- [fix] Convert strings to numbers if possible in `.createServer` [`#321`](https://github.com/http-party/node-http-proxy/issues/321)\n\n### Commits\n\n- [test] Delete invalid core test [`886a395`](https://github.com/http-party/node-http-proxy/commit/886a395429f20163992ca76e7b0d059256f56ba6)\n- [test] Upgrade `common.js` from node core [`fefbf04`](https://github.com/http-party/node-http-proxy/commit/fefbf04ac03126858bdad07df7b10131a46e17d6)\n- add \"with custom server logic\" to the \"Proxying WebSockets\" section of the readme.md [`03dbe11`](https://github.com/http-party/node-http-proxy/commit/03dbe115c2b088737e5b9abcadf91a8298f56f1f)\n- [test] Kill child process when exiting test runner [`74ec175`](https://github.com/http-party/node-http-proxy/commit/74ec1757153c503ce57eb552031648fe79731d48)\n- [fix] Correctly kill test processes [`b8c27ed`](https://github.com/http-party/node-http-proxy/commit/b8c27ed565e416827b7c4bb123aa9ee119d008e6)\n- [test] Make global detection work with older node versions [`3531fd6`](https://github.com/http-party/node-http-proxy/commit/3531fd609a8ce156d27c27ca38ac912a73aebfeb)\n- [dist] Bump version to 0.8.5 [`22639b3`](https://github.com/http-party/node-http-proxy/commit/22639b378189ec78f9962dde64337df050e29a6f)\n- [test] Run core tests on `npm test` [`41c9a9c`](https://github.com/http-party/node-http-proxy/commit/41c9a9caad679221b8f1d4dcfb74f9b2bdb8270b)\n- [test] Stop testing on `node v0.9`, tests timeout [`9042665`](https://github.com/http-party/node-http-proxy/commit/9042665ea98a6587e1d6800e51d3c354c0a1b20a)\n\n## [v0.8.4](https://github.com/http-party/node-http-proxy/compare/v0.8.2...v0.8.4) - 2012-10-23\n\n### Merged\n\n- Events patch [`#320`](https://github.com/http-party/node-http-proxy/pull/320)\n-  documentation for options [`#315`](https://github.com/http-party/node-http-proxy/pull/315)\n- Added travis build status [`#308`](https://github.com/http-party/node-http-proxy/pull/308)\n- Fix installation instructions: s/http/https/ [`#302`](https://github.com/http-party/node-http-proxy/pull/302)\n- If supplied pass changeOrigin option through to HttpProxy instance if set in RoutingProxy [`#285`](https://github.com/http-party/node-http-proxy/pull/285)\n\n### Commits\n\n- [fix test] Fix examples to use newest version of socket.io and helpers. Added tests for ensuring that examples require as expected with no errors. [`fd648a5`](https://github.com/http-party/node-http-proxy/commit/fd648a529090cefc202613fff3fdfec9ba0e6a72)\n- [fix] spdy should look like https when forwarding (until we get a client) [`698b01d`](https://github.com/http-party/node-http-proxy/commit/698b01da8e1fe6195b00e5006032d262a0a86f4e)\n- [docs] options [`4c8e1d9`](https://github.com/http-party/node-http-proxy/commit/4c8e1d96a36523a548959415903bc669ebcc138d)\n- http-proxy: emit websocket:start [`5df6e7b`](https://github.com/http-party/node-http-proxy/commit/5df6e7bdb8d4685a18e94ff1bf117ce8eff8d1c9)\n- [fix] `destroy()` websockets in case of an error [`0d00b06`](https://github.com/http-party/node-http-proxy/commit/0d00b06af307dc5c70c36e89617a08486eb665e2)\n- [fix] Suppress EADDRINUSE errors from `test/examples-test.js` since we are just looking for require-time errors. Isolate tests to ensure idempotency of ports [`c4a7b15`](https://github.com/http-party/node-http-proxy/commit/c4a7b1584302fe12a8fc06b6774db5ff602c3607)\n- [docs] more options [`d4cb9da`](https://github.com/http-party/node-http-proxy/commit/d4cb9dad6ce36a823c9e8970e0bb3266d844e536)\n- If HTTP 1.1 is used and backend doesn't return 'Connection' header, explicitly [`850171c`](https://github.com/http-party/node-http-proxy/commit/850171cdc41cb93343f7c31f650ac908a8d2dacb)\n- [refactor] Pass all options to `Agent` constructor [`eafdc74`](https://github.com/http-party/node-http-proxy/commit/eafdc744b67b33b5ed3cfc80de84dafcd850bdd0)\n- Fix socket leaks when FIN packet isn't responded to [`24b8406`](https://github.com/http-party/node-http-proxy/commit/24b84068eac1c704d9f8df3dc833b976850c328f)\n- [fix] Partial fix for rejecting self-signed certs in tests [`2e7d8a8`](https://github.com/http-party/node-http-proxy/commit/2e7d8a88f4b470dcc9da1639fe2a69e03251036c)\n- [fix] Dont use `-i` when running vows because it supresses `--target=` and `--proxy=` CLI arguments [`1783ab0`](https://github.com/http-party/node-http-proxy/commit/1783ab0625743355eecc11f5cfd57469c429daa0)\n- [test] Add `node v0.9` testing, test all branches [`4f6387c`](https://github.com/http-party/node-http-proxy/commit/4f6387c17f55c23da4aac161cf2e5a4dd2a25c40)\n- [minor] Remove `setEncoding` on incoming socket [`812868d`](https://github.com/http-party/node-http-proxy/commit/812868ddfc720b6c4fd26603c2fe4d5ae68f2492)\n- [dist] v0.8.3 [`a89a5b8`](https://github.com/http-party/node-http-proxy/commit/a89a5b80889a56dd31634096bc6546b6b7b26da2)\n- [fix] Ignore npm version errors when installing dependencies for examples [`a454666`](https://github.com/http-party/node-http-proxy/commit/a454666e7a0465ed65b7bbd29cf1b0c6c126d153)\n- [fix] function [`213e03c`](https://github.com/http-party/node-http-proxy/commit/213e03c99844c5c984fbf857bae32095165a1e8f)\n- [dist] Bump version to 0.8.4 [`4d7e8a8`](https://github.com/http-party/node-http-proxy/commit/4d7e8a808d83d3db1b729820aba5f481ab3d18f4)\n- [minor doc] Correct comment [`cee27fe`](https://github.com/http-party/node-http-proxy/commit/cee27feeddf9b4db06917dfa9e59e6bcd7e14c27)\n\n## [v0.8.2](https://github.com/http-party/node-http-proxy/compare/v0.8.1...v0.8.2) - 2012-07-22\n\n### Merged\n\n- Add example for gzip middleware using a proxy table. [`#221`](https://github.com/http-party/node-http-proxy/pull/221)\n- Implement RoutingProxy.prototype.remove [`#246`](https://github.com/http-party/node-http-proxy/pull/246)\n- prefer `target.hostname` over `target.host` [`#235`](https://github.com/http-party/node-http-proxy/pull/235)\n- add \"Using two certificiates\" to the https section of the readme.md [`#275`](https://github.com/http-party/node-http-proxy/pull/275)\n- Add support for setting the host in the executable [`#268`](https://github.com/http-party/node-http-proxy/pull/268)\n- Hi! I fixed some calls to \"sys\" for you! [`#270`](https://github.com/http-party/node-http-proxy/pull/270)\n- Fix bug: x-forwarded-proto set incorrectly as httphttps or wswss [`#266`](https://github.com/http-party/node-http-proxy/pull/266)\n\n### Commits\n\n- [refactor] Rewrite tests to use saner vows idioms. Update tests to use latest socket.io [`4ae7a5b`](https://github.com/http-party/node-http-proxy/commit/4ae7a5b84011bb5b9ec3a36ded4c5e5b3330db80)\n- [dist] Remove out-dated docco docs [`2d75510`](https://github.com/http-party/node-http-proxy/commit/2d75510d827c770c30a7292c31ef0f2007da7086)\n- [refactor test] Finish removing old test code. [`e2dc7f9`](https://github.com/http-party/node-http-proxy/commit/e2dc7f96937e5d565fea16c9f56b9f5d3e427de2)\n- [dist] Complete JSHint compliance except for `too many var statements` [`36226da`](https://github.com/http-party/node-http-proxy/commit/36226daa2e4cbc65fae80d2d09fd64c0e7ce36ba)\n- [refactor test] Add support for `http*-to-http*` testing from CLI arguments [`828dbeb`](https://github.com/http-party/node-http-proxy/commit/828dbebcaaf11e338a7727bf9d2fff8bfbd3726e)\n- [fix api] Optimize lookups in the ProxyTable. Ensure that RoutingProxy can proxy to `https` by default. [`55286a7`](https://github.com/http-party/node-http-proxy/commit/55286a7c499c0fe267f75d8e8441ff89f1e65f99)\n- Whitespace fixes. [`04ce49c`](https://github.com/http-party/node-http-proxy/commit/04ce49c5b289acb6ad72303e9ac70c637ea490b2)\n- [refactor tests] Finished refactoring tests to support `ws*-to-ws*` tests based on CLI arguments [`7e854d7`](https://github.com/http-party/node-http-proxy/commit/7e854d778b89201f7cb933e8bbda66316b98b0b4)\n- [doc] Minor formatting updates to README.md [`6753951`](https://github.com/http-party/node-http-proxy/commit/67539519faf1f32073fdb562404bd897072e24ee)\n- [fix] Changed require('util') to require('util') for compatibility with node v0.8 [`bf7e328`](https://github.com/http-party/node-http-proxy/commit/bf7e328fb837de69455c42f41822b0caae2777b6)\n- [test] Add .travis.yml file for Travis CI. [`29e6e74`](https://github.com/http-party/node-http-proxy/commit/29e6e748f780629d05635eebb421e8ee1d125058)\n- Use changeOrigin for proxyRequest. [`0273958`](https://github.com/http-party/node-http-proxy/commit/0273958b0a5c7823c6212cb6ce6e4f801a215d3b)\n- adding support for setting the host [`06e78f2`](https://github.com/http-party/node-http-proxy/commit/06e78f27475165d023fd66afbe5dd626a6a548af)\n- match style requested by @cronopio [`415d4ed`](https://github.com/http-party/node-http-proxy/commit/415d4ed908e45332421d683eb45e0d6873b85ae7)\n- Fix bug: x-forwarded-proto set incorrectly [`0933f1c`](https://github.com/http-party/node-http-proxy/commit/0933f1c598c1b62a75e040c3ed3ccb262612d3c9)\n- [dist] Version bump. 0.8.2 [`13c34d0`](https://github.com/http-party/node-http-proxy/commit/13c34d09b2f8be14fbbe4be77c49b23066667f1b)\n\n## [v0.8.1](https://github.com/http-party/node-http-proxy/compare/v0.8.0...v0.8.1) - 2012-06-05\n\n### Merged\n\n- [misc] Updating the changelog. Close #137 [`#256`](https://github.com/http-party/node-http-proxy/pull/256)\n- Fix problem with req.url not being not properly replaced. [`#218`](https://github.com/http-party/node-http-proxy/pull/218)\n- Re-emit 'start', 'forward' and 'end' events in RoutingProxy, and fix some hanging issues. [`#216`](https://github.com/http-party/node-http-proxy/pull/216)\n- Fixes to make the websockets example work. [`#225`](https://github.com/http-party/node-http-proxy/pull/225)\n- [minor] Syntax error [`#222`](https://github.com/http-party/node-http-proxy/pull/222)\n- [docs] Making README links consistent with latest project structure. [`#208`](https://github.com/http-party/node-http-proxy/pull/208)\n- [docs] improved grammar [`#205`](https://github.com/http-party/node-http-proxy/pull/205)\n- proposed doc addition for #180 [`#189`](https://github.com/http-party/node-http-proxy/pull/189)\n\n### Fixed\n\n- Merge pull request #256 from nodejitsu/changelog [`#137`](https://github.com/http-party/node-http-proxy/issues/137)\n- [misc] Updating the changelog. Close #137 [`#137`](https://github.com/http-party/node-http-proxy/issues/137)\n\n### Commits\n\n- Whitespace fixes [`e9fd3f4`](https://github.com/http-party/node-http-proxy/commit/e9fd3f43d7e890f0164b5a03a34f196dd162d043)\n- Added example for gzip middleware using a ProxyTable. [`6201328`](https://github.com/http-party/node-http-proxy/commit/62013281b8a980c53a38362f10d746bfbf36c52e)\n- [examples] Added simple load balancer example [`fd7fcd8`](https://github.com/http-party/node-http-proxy/commit/fd7fcd8decbf0c7ab00cab84e151991e380b8fae)\n- [dist] Update author field for consistency [`27316e2`](https://github.com/http-party/node-http-proxy/commit/27316e22e8e7786252583cdb9131cfd8cacb07c1)\n- Add documentation for listening for proxy events to prevent a common mistake. [`4f2bc58`](https://github.com/http-party/node-http-proxy/commit/4f2bc58431c7f44d486ee8c1ee3136b3637f9405)\n- Fix RoutingProxy hanging when there is an error [`b26b434`](https://github.com/http-party/node-http-proxy/commit/b26b434e9fc501f7e0c4a966dbee6220c355bc7c)\n- prefer `target.hostname` over `target.host` [`c4d185d`](https://github.com/http-party/node-http-proxy/commit/c4d185dca9696c77d5c38d24d897c2679f6762a0)\n- [doc] Fix style in websockets example [`ed06af9`](https://github.com/http-party/node-http-proxy/commit/ed06af97efe406ea2533009be64a6b568f9d0601)\n- Add tests for remapping URL properly. [`5d839dd`](https://github.com/http-party/node-http-proxy/commit/5d839dd5f8890c6d2af96807b96d1bd5bb0f7276)\n- fixed comment typos in examples/http/proxy-https-to-http.js and proxy-https-to-https.js, lines 37 and 46 [`868f7e7`](https://github.com/http-party/node-http-proxy/commit/868f7e7a287c4709c541c077f3e2303f45b1f072)\n- [misc] changelog updated to version 0.8.1 [`e9a3a30`](https://github.com/http-party/node-http-proxy/commit/e9a3a3012c5507dff46afd3e5cececf43b1717ae)\n- Implement RoutingProxy.prototype.remove [`0532995`](https://github.com/http-party/node-http-proxy/commit/0532995dfa0be53d285c886a9922b8915f297d36)\n- Making README links consistent with latest project structure. [`7fa6599`](https://github.com/http-party/node-http-proxy/commit/7fa6599f4f2c92bb29bc5fc8a9ba06d704652c5e)\n- Address ticket #180 here since that problem is so hard to discover when you run into it. If there was an error, people would search for the error text, but there isn't. [`73e415a`](https://github.com/http-party/node-http-proxy/commit/73e415a22634bfc9e5993377902f67ac3212714a)\n- [tests] used socket.io 0.6.17 fixed version for tests [`45d67f4`](https://github.com/http-party/node-http-proxy/commit/45d67f42cba373db4f47765d6a3dd38a7d19dae6)\n- [fix] x-forwarded-proto sets properly [`ca37ad7`](https://github.com/http-party/node-http-proxy/commit/ca37ad74367764cca479a1af63bd7491dc79606b)\n- [doc] add missing {} to make an object [`843901e`](https://github.com/http-party/node-http-proxy/commit/843901eeeb24611ad24889f13edcbfd5dee4314d)\n- fix the broken english and clarified the sentence (I hope) [`e15db4f`](https://github.com/http-party/node-http-proxy/commit/e15db4fb50db3e2191f3ebd30e12eeed9c376bc2)\n- Re-emit 'start', 'forward' and 'end' events in RoutingProxy. [`99ee542`](https://github.com/http-party/node-http-proxy/commit/99ee54259eae70c0c680ee82efc7dd184313f182)\n- [doc] call listen() to get the server started [`4fc1ee8`](https://github.com/http-party/node-http-proxy/commit/4fc1ee85d35d9feb468f808ddd11aaf186eaedd4)\n- syntax error fixed [`5842d0e`](https://github.com/http-party/node-http-proxy/commit/5842d0ee7de875378d9b8ae240748dd2af567be9)\n- [dist] Version bump 0.8.1 [`81f6095`](https://github.com/http-party/node-http-proxy/commit/81f6095cf08f84a84ae2bbda7ca0315729638fe0)\n- finally removed hidden char [`4358a4c`](https://github.com/http-party/node-http-proxy/commit/4358a4c1225acf8c13536fd742b845166f3a65a6)\n- [minor fix] delete white space [`df650d1`](https://github.com/http-party/node-http-proxy/commit/df650d11dd0a47653a4905f871d8d3d6c327d600)\n\n## [v0.8.0](https://github.com/http-party/node-http-proxy/compare/v0.7.3...v0.8.0) - 2011-12-23\n\n### Merged\n\n- Fix issue where front-end is HTTPS, back-end is HTTP, and server issues a redirect. [`#165`](https://github.com/http-party/node-http-proxy/pull/165)\n- Modified the ad-hoc proxy lookup to use _getKey(), rather than the error-prone in-line method. [`#164`](https://github.com/http-party/node-http-proxy/pull/164)\n- Allows node-http-proxy to append new values to existing headers for incoming \"x-forward-for\",\"x-forward-proto\" and \"x-forward-port\" [`#163`](https://github.com/http-party/node-http-proxy/pull/163)\n- [fix] only set one drain listener while paused [`#136`](https://github.com/http-party/node-http-proxy/pull/136)\n- [docs] grammar correction [`#134`](https://github.com/http-party/node-http-proxy/pull/134)\n\n### Fixed\n\n- [fix] Avoid `Transfer-Encoding: chunked` for HTTP/1.0 client, closes #59. [`#59`](https://github.com/http-party/node-http-proxy/issues/59)\n\n### Commits\n\n- [refactor minor] Update vendor/websocket.js to be compatible with node@0.6.x [`ea7fea6`](https://github.com/http-party/node-http-proxy/commit/ea7fea627255ed34d39902438b55e740c7c9b08c)\n- [test] Add common.js file from core [`543f214`](https://github.com/http-party/node-http-proxy/commit/543f214361605cffdbee7b233029edf343c358c1)\n- [test] Add core `test-http-proxy` test [`feb324b`](https://github.com/http-party/node-http-proxy/commit/feb324b0d4c0a2307493b35be944ed08ffc9187a)\n- [test] Add core `test-http` test [`25a9e2d`](https://github.com/http-party/node-http-proxy/commit/25a9e2d217cabef07d6f161f5d6ded49342dbb2f)\n- [test] Add core `test-http-host-headers` test [`f298411`](https://github.com/http-party/node-http-proxy/commit/f298411f76a106791f34dd4d31ea033a7bdca9c7)\n- [test] Add core `test-http-extra-response` test [`c26ab5e`](https://github.com/http-party/node-http-proxy/commit/c26ab5e46ff2649f0ea6585f20d8f58b7d0cadef)\n- [test] Add core `test-http-set-cookies` test [`b3b5cce`](https://github.com/http-party/node-http-proxy/commit/b3b5cce3aee98a7fd5b50fb8e1bd6bd5e1c7512f)\n- [test] Add core `test-http-client-abort` test [`7bf8d4a`](https://github.com/http-party/node-http-proxy/commit/7bf8d4a7be668591b350144b4546559abf9a0b5f)\n- [test] Add core `test-http-client-upload` test [`7648fe5`](https://github.com/http-party/node-http-proxy/commit/7648fe50c1859597dc390e9e628db938372483e7)\n- [test] Add core `test-http-client-upload-buf` test [`5ac9878`](https://github.com/http-party/node-http-proxy/commit/5ac987857c934d07073b853f5243d2d8fc6d8c2b)\n- [test] Add core `test-http-upgrade-server2` test [`bc98c0d`](https://github.com/http-party/node-http-proxy/commit/bc98c0dbce154ef266eef83d3c2f737a2d60f0e6)\n- [test] Implement basic runner for multiple tests [`a4079c6`](https://github.com/http-party/node-http-proxy/commit/a4079c6a1c8b87334d12d47d67f060cbb1214696)\n- [test] Add core `test-http-upload-timeout` test [`60ff181`](https://github.com/http-party/node-http-proxy/commit/60ff181af9c22405d3822ce5955f178ab13de79d)\n- [test] Add core `test-http-status-code` test [`82060a5`](https://github.com/http-party/node-http-proxy/commit/82060a53430de05f2dc95450d8487bc8139544d5)\n- [test] Add core `test-http-many-keep-alive-connections` test [`4e1ca6e`](https://github.com/http-party/node-http-proxy/commit/4e1ca6e61899b11cad1b437cc9d9490b9d856665)\n- [test] Add core `test-http-chunked` test [`d7461f3`](https://github.com/http-party/node-http-proxy/commit/d7461f3206cca0691fbd438545ff325589770627)\n- [test] Add core `test-http-head-response-has-no-body-end` test [`13389db`](https://github.com/http-party/node-http-proxy/commit/13389db1bef38a7fc7ddc3ada479a608f033020c)\n- [test] Add core `test-http-server-multiheaders` test [`d7f15d0`](https://github.com/http-party/node-http-proxy/commit/d7f15d02f7477c76529fc76daddee5029079eb2d)\n- [test] Add core `test-http-multi-line-headers` test [`35d2088`](https://github.com/http-party/node-http-proxy/commit/35d2088c96bacb44b17755176b6e9451ed0299dd)\n- [test] Add core `test-http-head-response-has-no-body` test [`f79f3ad`](https://github.com/http-party/node-http-proxy/commit/f79f3adf0295ec5bb7fb9f6525b48ba5209d04c6)\n- [refactor] Improved event handler cleanup  [`9f92332`](https://github.com/http-party/node-http-proxy/commit/9f923325d08ac018a3325beaa9e0805b5eda61e6)\n- [fix minor] Correctly set x-forwarded-proto in WebSocket requests [`c81bae2`](https://github.com/http-party/node-http-proxy/commit/c81bae2fdde3bf0087fe71a39855c61c43ffb145)\n- Revert \"[refactor] Improved event handler cleanup \" [`c83d88e`](https://github.com/http-party/node-http-proxy/commit/c83d88ee88faac10b53cd4296165ed85f26036b4)\n- Allowing the common proxy headers' value to be appended in proxy chain scenarios. [`621f9b4`](https://github.com/http-party/node-http-proxy/commit/621f9b425a272421de98a674f1679f0c47912733)\n- [test] Add basic test runner [`87999d0`](https://github.com/http-party/node-http-proxy/commit/87999d028880dfccca349c9c44f9e66a613c4d38)\n- [examples] Add some hand-crafted middleware [`6e65c20`](https://github.com/http-party/node-http-proxy/commit/6e65c20017a2e1a87dc6d58e847bc6db16440f3c)\n- [test] Add core `test-http-malformed-request` test [`a635389`](https://github.com/http-party/node-http-proxy/commit/a6353897cdbe8c380d52a060f5e66784f67ad98e)\n- [example] Response modification middleware [`dd83199`](https://github.com/http-party/node-http-proxy/commit/dd8319972c1c2f9421a90a21dce9560fd5ca199f)\n- [test] Add core `test-http-head-request` test [`c0857f2`](https://github.com/http-party/node-http-proxy/commit/c0857f2d59c33d91cb3e0c131c44ec1667f592fa)\n- [test] Add core `test-http-response-close` test [`f1c0be3`](https://github.com/http-party/node-http-proxy/commit/f1c0be3f0bd2c5e87d44a37ba4f29aafd9903ad4)\n- [refactor] core proxy logic. all tests should be passing. [`63ac925`](https://github.com/http-party/node-http-proxy/commit/63ac9252606d23e2003696da1fb34a539abee7ca)\n- [test] Add core `test-http-contentLength0` test [`275109b`](https://github.com/http-party/node-http-proxy/commit/275109b2f8c8519c56ca9f456096d4002698fab1)\n- [test] Add core `test-http-client-abort2` test [`98bbe54`](https://github.com/http-party/node-http-proxy/commit/98bbe541e4fa581f1b9e2eadb821c0609da6ab81)\n- adding tests for url segment proxytable routing [`91e9bb9`](https://github.com/http-party/node-http-proxy/commit/91e9bb90709cc8a361066d6f6b8f51f58bfd7e36)\n- [test] Add core `test-http-eof-on-connect` test [`80c216d`](https://github.com/http-party/node-http-proxy/commit/80c216df0cc59b88c6934f795c03ea16a737af34)\n- [example] Replace `sys` usages with `util` [`8d701bb`](https://github.com/http-party/node-http-proxy/commit/8d701bb20b593c6cdf0ff1bc35cf83051b21a35e)\n- [refactor] Updates to support http2 from @mikeal [`5b52c89`](https://github.com/http-party/node-http-proxy/commit/5b52c896947db42ac01e6038c9170d8859d33aea)\n- [refactor] Listen for `socket` events since reverseProxy.socket is no longer set synchronously [`3828616`](https://github.com/http-party/node-http-proxy/commit/38286168161d4f4ad24d2ad95ccd8335e9ed08a4)\n- [test] Run tests in `test/core/simple` by default [`68cebbe`](https://github.com/http-party/node-http-proxy/commit/68cebbe0e79ea283eea8a1ca850ab462c66c611a)\n- simplify proxytable path segment rewrite logic [`c03a450`](https://github.com/http-party/node-http-proxy/commit/c03a450d9b952e1463ae2609303029e317ff5da2)\n- change proxytable routing to route one level shallower [`4d50915`](https://github.com/http-party/node-http-proxy/commit/4d50915373b6afaafc7857a3e9366e8e77315683)\n- [docs] Little explanation for test/core directory [`8ca5d83`](https://github.com/http-party/node-http-proxy/commit/8ca5d83497cc106a2456ff7f2ebe3db5c8634d69)\n- [minor] Allow user to set `colors.mode` [`48d4a8b`](https://github.com/http-party/node-http-proxy/commit/48d4a8b263faa9acda06651bceeff50881f21b26)\n- [minor] Indentation fix [`9e630da`](https://github.com/http-party/node-http-proxy/commit/9e630daf81d10485206ec136c3e1a07fe065ffeb)\n- [v0.6] `http.Agent` uses different structure for sockets [`86b4122`](https://github.com/http-party/node-http-proxy/commit/86b4122323ca32d455714b1149b99acce49a9e45)\n- [minor] Nicer output from test runner [`5c3d41b`](https://github.com/http-party/node-http-proxy/commit/5c3d41bf4e101d0250fb0b3db4a8dc078104dcad)\n- Modified the ad-hoc proxy lookup to use _getKey(), rather than the [`553e7fb`](https://github.com/http-party/node-http-proxy/commit/553e7fbc335a9befd166d472f057aa50452a9d40)\n- [fix] When client request is aborted, abort server request [`4d43d81`](https://github.com/http-party/node-http-proxy/commit/4d43d81e5c2d7c8088716d4fd574019f43ebb5ce)\n- Fixes memory leak when clients abort connections [`c98ccb4`](https://github.com/http-party/node-http-proxy/commit/c98ccb40e9fe5c5198a1605fa8835efc3ff1856c)\n- [fix test] Make test runner exit after test exits [`31a8c68`](https://github.com/http-party/node-http-proxy/commit/31a8c6800ddf8d91b477d980605a4c19284a1648)\n- [test dist] Run core tests on `npm test` [`8358ef8`](https://github.com/http-party/node-http-proxy/commit/8358ef8a2bdf817c8ed515be7bc9cec0a9b5f486)\n- don't add upgrade handler if a custom handler is passed in [`d6ea3a4`](https://github.com/http-party/node-http-proxy/commit/d6ea3a425c203695394eaba4ce8abd57f7809e98)\n- always emit end in 0.4 [`182dcd3`](https://github.com/http-party/node-http-proxy/commit/182dcd34555f361c1bb2b8d2777689e64ce32f87)\n- [fix] Fix incorrect depth check. [`3ab02f3`](https://github.com/http-party/node-http-proxy/commit/3ab02f3ad7f2c59d73c621695eb238233c16d09c)\n- [minor] Everybody loves Unicode [`38bd906`](https://github.com/http-party/node-http-proxy/commit/38bd906f2bc9322b156b92c47457bb7904f0d23a)\n- [test minor] Update copyright notice on test runner [`2ccc5c7`](https://github.com/http-party/node-http-proxy/commit/2ccc5c73eaef30ab5a2af7e456bfcc270583c460)\n- [minor] When running tests output only basename [`e109eba`](https://github.com/http-party/node-http-proxy/commit/e109eba9724494737021579938c1094c9dfbc8ee)\n- [dist] Version bump. 0.8.0 [`5055689`](https://github.com/http-party/node-http-proxy/commit/5055689a11f3b990f848bf2699e0111d9e708d5f)\n- Revert \"[dist] Adjusted engines field to allow for 0.6; version bump 0.7.7\" [`1e33434`](https://github.com/http-party/node-http-proxy/commit/1e33434fcc4772c233825b5aada7472113c0be50)\n- changeOrigin option: set the host header to the proxy destination [`f27d26f`](https://github.com/http-party/node-http-proxy/commit/f27d26f4515c900ea4cf1756ef279257a189e308)\n- [dist] Adjusted engines field to allow for 0.6; version bump 0.7.7 [`30dac89`](https://github.com/http-party/node-http-proxy/commit/30dac898f30a8508b4c4b4236e9438987f320167)\n- [fix] In routing proxy, match line beginning [`63dfc7f`](https://github.com/http-party/node-http-proxy/commit/63dfc7f1757fc9a1a9bceeb3b035e97be6504692)\n- [v0.6] Don't use `agent.appendMessage()` [`6655e01`](https://github.com/http-party/node-http-proxy/commit/6655e0164216449a97090651230266da8ced0150)\n- bump version 0.7.4 [`3dfba2b`](https://github.com/http-party/node-http-proxy/commit/3dfba2ba4591e0fcd65ff0bfd012b3ab749a0a02)\n- bump version 0.7.6 [`c5dc929`](https://github.com/http-party/node-http-proxy/commit/c5dc9295c711177c165bfb34c67407e1a5a0ed06)\n- Revert \"update outgoing.headers.host incase the destination does proxying\" [`2061c71`](https://github.com/http-party/node-http-proxy/commit/2061c713664b044852fdf67aa5e173e5c3b6d874)\n- update outgoing.headers.host incase the destination does proxying [`65b7872`](https://github.com/http-party/node-http-proxy/commit/65b7872e6ad433deae4de823c63629cb341bd649)\n- bump version 0.7.5 [`b4d41c3`](https://github.com/http-party/node-http-proxy/commit/b4d41c3628ade82792eb361b095ab014a88d537a)\n- [minor] Fix indent on timeout notice [`c4124da`](https://github.com/http-party/node-http-proxy/commit/c4124da4f25860497790fc06c97dde6e8985ab73)\n- [minor] Change test runner output order [`b76680b`](https://github.com/http-party/node-http-proxy/commit/b76680b045f69e03759bc119f4827f337a8f395d)\n- grammar correction [`729496d`](https://github.com/http-party/node-http-proxy/commit/729496d2898612969f5369e7f1c313cb4034f96c)\n- [dist] Test runner depends on `async` [`219b0ff`](https://github.com/http-party/node-http-proxy/commit/219b0ff8f8780cde4714267273b0a1637c84679f)\n- [test fix] Remove unnecessary console.log in tests/websocket/websocket-proxy-test.js [`f188f4f`](https://github.com/http-party/node-http-proxy/commit/f188f4ffd8c47b6312cd88c28de7e5ac63565047)\n- [test refactor] `test/core/{run =&gt; run-single}` [`004be38`](https://github.com/http-party/node-http-proxy/commit/004be38048792d6f1d3efb361a5e7e66d5dbee8d)\n\n## [v0.7.3](https://github.com/http-party/node-http-proxy/compare/v0.7.2...v0.7.3) - 2011-10-03\n\n### Commits\n\n- added what is necessary for having proxyError on Routing proxywq [`b7adf86`](https://github.com/http-party/node-http-proxy/commit/b7adf866b595f0d64a3ef6bde19271276450e723)\n- [dist] Version bump. 0.7.3 [`db185bb`](https://github.com/http-party/node-http-proxy/commit/db185bb303ce9c413b2abccbc885f8ec43b61202)\n\n## [v0.7.2](https://github.com/http-party/node-http-proxy/compare/v0.7.1...v0.7.2) - 2011-09-30\n\n### Merged\n\n- [fix] Examples have working require paths now. [`#118`](https://github.com/http-party/node-http-proxy/pull/118)\n\n### Commits\n\n- [fix] Fixed require paths in examples [`2e8d4c6`](https://github.com/http-party/node-http-proxy/commit/2e8d4c6e49e2e9b27443c0b9ae2b96331715402b)\n- [websockets] add latest websockets support [`45ef87e`](https://github.com/http-party/node-http-proxy/commit/45ef87e71bc9cccefe5fb6afc3121fb09b8efbc3)\n- [dist] Version bump. 0.7.2 [`ccccc45`](https://github.com/http-party/node-http-proxy/commit/ccccc45f11fbe535017b1806fad43578f143649d)\n\n## [v0.7.1](https://github.com/http-party/node-http-proxy/compare/v0.7.0...v0.7.1) - 2011-09-21\n\n### Merged\n\n- Readme fixes [`#114`](https://github.com/http-party/node-http-proxy/pull/114)\n- #107: Set x-forwarded-for header (amongst others) [`#110`](https://github.com/http-party/node-http-proxy/pull/110)\n- command line tool - make sure targetPort is an integer [`#109`](https://github.com/http-party/node-http-proxy/pull/109)\n\n### Fixed\n\n- [dist] Version bump v0.7.1, closes #107 #112 [`#107`](https://github.com/http-party/node-http-proxy/issues/107)\n\n### Commits\n\n- [test] Added a test for the \"x-forwarded-for\" header [`66e9820`](https://github.com/http-party/node-http-proxy/commit/66e982060c6c41ad7dfadce1403c8e13d267781a)\n- [docs] Updated examples in README.md for 0.7.x API. [`24ef919`](https://github.com/http-party/node-http-proxy/commit/24ef9194953c27fb11a8f1ceb499e5feca11c30c)\n- [examples] Updated examples to v0.7.x API. [`8fc8d96`](https://github.com/http-party/node-http-proxy/commit/8fc8d966c4681d514af00516b348105608e13382)\n- [examples] More fixes to examples. [`549360a`](https://github.com/http-party/node-http-proxy/commit/549360a462c134cc2b02301070209084ec94c393)\n- [fix] x-forwarded http headers should set properly. [`2677bb6`](https://github.com/http-party/node-http-proxy/commit/2677bb6c44244ea0b584db744955bedf7aee2c62)\n- [fix] connection.socket -&gt; socket for source of x-forwarded-for data [`1f33943`](https://github.com/http-party/node-http-proxy/commit/1f33943b231cdf2cb619977801c7b0d4e98ab6df)\n- Make sure the target port is an integer [`5ba25aa`](https://github.com/http-party/node-http-proxy/commit/5ba25aa3451f131b6c6c8892848a4f236f5b859e)\n\n## [v0.7.0](https://github.com/http-party/node-http-proxy/compare/v0.6.6...v0.7.0) - 2011-09-10\n\n### Fixed\n\n- [fix] Add `x-forward-*` headers for WebSocket requests. Closes #74 [`#74`](https://github.com/http-party/node-http-proxy/issues/74)\n- [doc] Document `setMaxSockets`. Fixes #81 [`#81`](https://github.com/http-party/node-http-proxy/issues/81)\n\n### Commits\n\n- [api test dist] Stubbed out the API for the higher-level `RoutingProxy` object to be exposed by `node-http-proxy` [`5927ecd`](https://github.com/http-party/node-http-proxy/commit/5927ecd62a082269c3b6a0ae4f5b4a673784bcdb)\n- [api] Finalized the RoutingProxy API [`f765f90`](https://github.com/http-party/node-http-proxy/commit/f765f90ec37defaa2b493f859a982add51e25b76)\n- [minor] Move private methods to the bottom of file(s) [`ec03d72`](https://github.com/http-party/node-http-proxy/commit/ec03d72c5d8749aee835f571869f69816be02265)\n- [test] Updated tests to reflect finalized API of the RoutingProxy [`734769f`](https://github.com/http-party/node-http-proxy/commit/734769fa9b2c3054d45e33c3e552af80ce3f4740)\n- [api doc] Rebuilt httpProxy.createServer() with the newer high-level RoutingProxy API [`598fe2e`](https://github.com/http-party/node-http-proxy/commit/598fe2e38def56518a1f0a8196b2fcb7f1bc569e)\n- [minor] Remove commented out debug statements. [`5575bcf`](https://github.com/http-party/node-http-proxy/commit/5575bcf60c87def74d1755b2e5cc73e085dbf8c3)\n- [doc] Updated examples [`13eaec5`](https://github.com/http-party/node-http-proxy/commit/13eaec55dc50e2aae164cb8adaa0f1a3c5a66c68)\n- Add flow control [`6a7fd14`](https://github.com/http-party/node-http-proxy/commit/6a7fd14bfa9f25694d75cf490e32817ff15a94fe)\n- Add flow control [`2b9e09b`](https://github.com/http-party/node-http-proxy/commit/2b9e09b00ac40e6c6de2b68754df7b8e8c1e3878)\n- Emit drain if it doesn't happen on its own in 100ms [`37e2541`](https://github.com/http-party/node-http-proxy/commit/37e25418916a31e4a513ee5866d6013858d579cf)\n- resume() can throw [`558a8a4`](https://github.com/http-party/node-http-proxy/commit/558a8a4f79716496dbdee13759c8641606458c05)\n- [fix] Memory leak hunting. [`ca1d12c`](https://github.com/http-party/node-http-proxy/commit/ca1d12cf1bbfbe98b5159f9c02e2f6c818a1c749)\n- Emit drain if it doesn't happen on its own in 100ms [`84be9f2`](https://github.com/http-party/node-http-proxy/commit/84be9f2c3a244c7dbfe2c6320fa26d85cf80ec31)\n- resume() can throw [`0c71119`](https://github.com/http-party/node-http-proxy/commit/0c71119ee58ee84068120be72308ecb28cb3e532)\n- [dist] Update examples/package.json to conform to nodejitsu style guidelines [`2937229`](https://github.com/http-party/node-http-proxy/commit/29372298208135f571538cc29dcc05f41f79b01c)\n- Fixed large DoS vector in the middleware implementation [`0e36912`](https://github.com/http-party/node-http-proxy/commit/0e36912906640fdb007e0492b75c3f6a7b580ec6)\n- [api] Added new `close()` method which cleans up sockets from HttpProxy instances [`0eae2a9`](https://github.com/http-party/node-http-proxy/commit/0eae2a913a2173d85478f8c9deec929388284ee2)\n- Fixed large DoS vector in the middleware implementation [`07c8d2e`](https://github.com/http-party/node-http-proxy/commit/07c8d2ee6017264c3d4deac9f42ca264a3740b48)\n- [minor] More contextual errors when middleware(s) error [`38315f6`](https://github.com/http-party/node-http-proxy/commit/38315f6b1f7b01bc6e55587878a57590135945c0)\n- [dist] Update scripts in package.json [`6e1ade0`](https://github.com/http-party/node-http-proxy/commit/6e1ade0bb8174b744abb58df72b098bd96134ca4)\n- [dist] Version bump. 0.7.0 [`0182ba3`](https://github.com/http-party/node-http-proxy/commit/0182ba37cd4c618cd50947ea2addef823349e49f)\n- [merge] Merge from significant internal refactor in v0.7.x. No external API changes [`f7010e5`](https://github.com/http-party/node-http-proxy/commit/f7010e5169ac23114b9b35da272e9a041743fbb9)\n- [minor] Small update to bin/node-http-proxy [`2cd8256`](https://github.com/http-party/node-http-proxy/commit/2cd8256c4d6089409f603655ea3b3a5ccf1fb065)\n- [dist] Update .gitignore [`6c1c554`](https://github.com/http-party/node-http-proxy/commit/6c1c5544515bf17f0e6ed3588e16ae1a75f8a25b)\n- [doc] Update README.md [`0ba5023`](https://github.com/http-party/node-http-proxy/commit/0ba5023e82fe8a08ed55194644d147c323368f41)\n- [doc] Drop version number from README.md. [`bdf48be`](https://github.com/http-party/node-http-proxy/commit/bdf48bea36eae441c775e9321ab6e17db470bf27)\n- [dist] Version bump. 0.7.0 [`00e34a1`](https://github.com/http-party/node-http-proxy/commit/00e34a10bd9ffca9e636b2e5aebb4f18ff6765ec)\n- [test] Whitespace fix [`3a4d312`](https://github.com/http-party/node-http-proxy/commit/3a4d312eda08e7a5cecb3c82b04023e22f368e2b)\n- [dist] Reorganize examples based on classification(s): http, websocket, or middleware [`81d6c31`](https://github.com/http-party/node-http-proxy/commit/81d6c318758231f77a52fab7de174fcc63b7a243)\n\n## [v0.6.6](https://github.com/http-party/node-http-proxy/compare/v0.6.5...v0.6.6) - 2011-08-31\n\n### Commits\n\n- Memory leak hunting. [`f4fcf93`](https://github.com/http-party/node-http-proxy/commit/f4fcf934030e84c15cceca620e974aafc35f1691)\n- [fix] Add guards to every throw-able res.end call [`e1c41d0`](https://github.com/http-party/node-http-proxy/commit/e1c41d06942b56f6cd65a079ae78b54456a8bbe1)\n- [fix] Only set `x-forward-*` headers if req.connection and req.connection.socket [`de4a6fe`](https://github.com/http-party/node-http-proxy/commit/de4a6fe8a5f78460b030e635e5f4a63312cd4a76)\n- [dist] Version bump. 0.6.6 [`967884c`](https://github.com/http-party/node-http-proxy/commit/967884c5de311f21b8405a5030730ef8db912531)\n\n## [v0.6.5](https://github.com/http-party/node-http-proxy/compare/v0.6.4...v0.6.5) - 2011-08-29\n\n### Commits\n\n- [fix] Use `req.connection` for all x-forward-* headers [`f6dc12a`](https://github.com/http-party/node-http-proxy/commit/f6dc12a971fdd892614b32d2a4fb2ff39ddc0e67)\n- [dist] Version bump. 0.6.5 [`7beead5`](https://github.com/http-party/node-http-proxy/commit/7beead54654bdc7f9ab4ed0c17000118a3e7b4fc)\n\n## [v0.6.4](https://github.com/http-party/node-http-proxy/compare/v0.6.3...v0.6.4) - 2011-08-28\n\n### Fixed\n\n- Fix #95 Don't look on req.connection if it's not set. [`#95`](https://github.com/http-party/node-http-proxy/issues/95)\n\n### Commits\n\n- [api breaking] Begin refactor to optimize node-http-proxy by managing one instance of HttpProxy per `host:port` location [`d2b0e43`](https://github.com/http-party/node-http-proxy/commit/d2b0e4399e8026d3e2ece78ac8fdb1def6649950)\n- [api test] Updated httpProxy.createServer() for new API exposed by simplified HttpProxy object. [`be4562d`](https://github.com/http-party/node-http-proxy/commit/be4562da9fafef8b26856f7f73f6c5a2c4e389b0)\n- [test fix] A few minor fixes to ensure basic WebSocket tests are working. Better scope tests by supported protocol [`daf9231`](https://github.com/http-party/node-http-proxy/commit/daf9231a66f10a25782d2227df1b1501099ac5d1)\n- [test] Updates for readability [`db10c4a`](https://github.com/http-party/node-http-proxy/commit/db10c4af918c3e4bc448163f4b9e9b9267145d47)\n- Add guards to every throw-able res.end call [`7bda25b`](https://github.com/http-party/node-http-proxy/commit/7bda25b1c60d082f0f2fd12fc61b45a33b74f13d)\n- [minor] Dont use `.bind()` [`340be42`](https://github.com/http-party/node-http-proxy/commit/340be42797e87fcc11859a771200075e7fe0c5f1)\n- [dist] Version bump. 0.6.4 [`216d46d`](https://github.com/http-party/node-http-proxy/commit/216d46dc81bda1aeb0feb1318e34f37bee38c8fb)\n\n## [v0.6.3](https://github.com/http-party/node-http-proxy/compare/v0.5.11...v0.6.3) - 2011-08-28\n\n### Merged\n\n- This adds a flag to ProxyRequest to disable the setting of x-forwarded-[for|port|proto] [`#73`](https://github.com/http-party/node-http-proxy/pull/73)\n\n### Fixed\n\n- Merge branch 'patch-1' of https://github.com/KimSchneider/node-http-proxy [`#80`](https://github.com/http-party/node-http-proxy/issues/80)\n\n### Commits\n\n- [minor] Style updates and whitespace cleaning for consistency [`f0917a3`](https://github.com/http-party/node-http-proxy/commit/f0917a3f97e8df2d58252f14c15ec54369c969ae)\n- [api] refactor out middlewares from examples. [`2cf4e0a`](https://github.com/http-party/node-http-proxy/commit/2cf4e0a9e6c78dfd093c098fc87100ae71bc9450)\n- [docs] add middleware examples (first draft) [`020290a`](https://github.com/http-party/node-http-proxy/commit/020290a162146c4996831f4f13d71c1dc949f508)\n- [fix] use routing table mhen proxying WebSockets. [`efa17ef`](https://github.com/http-party/node-http-proxy/commit/efa17ef6cf614b763fc3b76570a24e750e2ddd31)\n- Tested & fixed url middleware example, added comments. [`4cc18f4`](https://github.com/http-party/node-http-proxy/commit/4cc18f4217739b0bd1b3ac88287cc8a23d486b6b)\n- [minor] add middleware to node-http-proxy [`b54666f`](https://github.com/http-party/node-http-proxy/commit/b54666ff69c574d842ce1349700c6b6248484d24)\n- [minor] add middleware to node-http-proxy [`c773eed`](https://github.com/http-party/node-http-proxy/commit/c773eedeb6d0b22e2b41ab9215cfdc064a8095e3)\n- [minor] add url-proxying middleware example [`45f3df8`](https://github.com/http-party/node-http-proxy/commit/45f3df80937ffd5854727c91ea6b0e09cf77e160)\n- [fix] Removed bad example. [`2626308`](https://github.com/http-party/node-http-proxy/commit/2626308cd845982c82a284b0d0bc064090aaf116)\n- [minor] add example to test concurrency [`6ec8d6c`](https://github.com/http-party/node-http-proxy/commit/6ec8d6caace3797841c0447feb081aa7920aa0dd)\n- [minor] add example of using middleware to gzip response [`d3c0697`](https://github.com/http-party/node-http-proxy/commit/d3c06973a1bf1f1c54ca55a5d7f93b77133ef9a2)\n- support old (port,host) and (options) style when using middlewares [`7976de1`](https://github.com/http-party/node-http-proxy/commit/7976de1121a40f963e18ea0a4673d185f847df4c)\n- [minor] Added body decoder middleware example.  Needs fixing. [`8eaec35`](https://github.com/http-party/node-http-proxy/commit/8eaec3507456731c1138c0b8ebb4e51dedc7c300)\n- [minor dist] Use `pkginfo`. Minor updates to variable scoping in `.createServer()` [`5d0bbb3`](https://github.com/http-party/node-http-proxy/commit/5d0bbb38c3af14907567e2dc7c4f84a915b60ce5)\n- [doc] add comments to examples/url-middleware.js [`f6484de`](https://github.com/http-party/node-http-proxy/commit/f6484de4112463c74105db82d27f131d64478f1d)\n- Handle cases where res.write throws [`be3a0d8`](https://github.com/http-party/node-http-proxy/commit/be3a0d84a1e75b45bc1fc63fe63cdabd9844eb59)\n- [minor] code style changes [`8b48b7e`](https://github.com/http-party/node-http-proxy/commit/8b48b7e0af656fdbd6da2b16ec6365beec47c302)\n- [doc] note in readme about middleware [`b5d5eaa`](https://github.com/http-party/node-http-proxy/commit/b5d5eaababa276f7d197e4b6a8a771b364b73139)\n- Allow forwarding for x-forwarded-[for|port|proto] to enabled layering of http-proxies. [`404818b`](https://github.com/http-party/node-http-proxy/commit/404818b1dce9e77a917ce9f0c187772eb8c18042)\n- [style] tidy [`0f8fe8e`](https://github.com/http-party/node-http-proxy/commit/0f8fe8e2460fd27edfba44989b78aa6b8c9a38e2)\n- [fix] do not use middleware code if it's not needed [`2012588`](https://github.com/http-party/node-http-proxy/commit/20125889b362c61c85924810de446e1e7b18d079)\n- [minor] minor fixes to gzip middleware example [`caa1f49`](https://github.com/http-party/node-http-proxy/commit/caa1f494ab4effabad6d08272c3606c1d82005ea)\n- [minor] default enableXForwarded to true [`e3d95ec`](https://github.com/http-party/node-http-proxy/commit/e3d95ecab24700535184df32f3a97e8699099b7f)\n- Updating to enableXForwarded [`ee3506a`](https://github.com/http-party/node-http-proxy/commit/ee3506a8e7262f780eeada331898d42ca0e9838a)\n- [api] Expose adapted version of `stack` so it can be used with HttpProxy instances not created by `httpProxy.createServer()` [`5d6e6b9`](https://github.com/http-party/node-http-proxy/commit/5d6e6b9f78eb98b28db01490a36b23c1aade133f)\n- The number of maxSockets has to be set after the agent is created. Setting the property in the constructor does not work. [`2caa5d2`](https://github.com/http-party/node-http-proxy/commit/2caa5d2b0d55898c133a0bf3a0048ee969efb121)\n- [fix] Dont use res.* in proxyWebSocketRequest [`f7452bc`](https://github.com/http-party/node-http-proxy/commit/f7452bc42d963406f7ee19dfa353d72ce3252dd6)\n- [fix] fix syntax errors. close issue #86 [`b8f8499`](https://github.com/http-party/node-http-proxy/commit/b8f84994b0515e12c9d87f89f81a8601be47a6ff)\n- [api] merge middleware branch [`e6ff8d6`](https://github.com/http-party/node-http-proxy/commit/e6ff8d6597a977baf0caf4f69c75bfa93d7281f3)\n- [dist] Version bump. 0.6.3 [`1389b70`](https://github.com/http-party/node-http-proxy/commit/1389b706b5c1d857c571c2947b7c758b5cc70ca3)\n- merged [`5ba0f89`](https://github.com/http-party/node-http-proxy/commit/5ba0f89aa356b2e76f5cf64c16e8578d71c45d8a)\n- [fix] handler variable in createServer was global (!)  [`25c06a3`](https://github.com/http-party/node-http-proxy/commit/25c06a3a952068de6a24c643cb0c872f7b9a0846)\n- [dist] bump version 6.0 [`03475a5`](https://github.com/http-party/node-http-proxy/commit/03475a59445a1c1c1029d0673aafabe63af1e711)\n- [dist] bump version 0.6.2 [`d8068a8`](https://github.com/http-party/node-http-proxy/commit/d8068a832d437790ce8680b9b34a9f171d75786c)\n- [dist] bump version 5.12 [`5d33ad7`](https://github.com/http-party/node-http-proxy/commit/5d33ad711895b2afcbd6dd5e1c0449cee1ceae7b)\n- [dist] bump version 0.6.1 [`fea371d`](https://github.com/http-party/node-http-proxy/commit/fea371dc0a47dfb4f84427e5740e8756f4e5b285)\n- [fix] broken RegExp [`549bfea`](https://github.com/http-party/node-http-proxy/commit/549bfeac233888ec84edeec350ed5a7377f3773e)\n- [doc] add note on middleware to Using node-http-proxy section of the README [`5bf2d59`](https://github.com/http-party/node-http-proxy/commit/5bf2d59241a7695f43bb89e5cb41ade2ab7a0ad2)\n\n## [v0.5.11](https://github.com/http-party/node-http-proxy/compare/v0.5.10...v0.5.11) - 2011-06-26\n\n### Fixed\n\n- [api] Simplify the usage for the `.changeHeaders` option. Fixes #34 [`#34`](https://github.com/http-party/node-http-proxy/issues/34)\n\n### Commits\n\n- [api doc test] node-http-proxy now emits `websocket:*` on important WebSocket events. Added tests for these features and updated some code docs [`4f85ca0`](https://github.com/http-party/node-http-proxy/commit/4f85ca04e425a7d4df1e46c9cadd6026eeed32f6)\n- [doc] Updated docco docs [`f0649d8`](https://github.com/http-party/node-http-proxy/commit/f0649d8d6a9f84ac61d5f173c585fa4307ffb3c3)\n- [doc] Added examples/latent-websocket-proxy.js [`fcfe846`](https://github.com/http-party/node-http-proxy/commit/fcfe84626fff15be21ac83ccd69b96bf3ca1f7a2)\n- [doc] Added sample for custom error messages using the `proxyError` event [`4cdbf0e`](https://github.com/http-party/node-http-proxy/commit/4cdbf0e8729a0665904b577376240c00e56ad876)\n- [doc] Add examples/standalone-websocket-proxy.js [`1ee8ae7`](https://github.com/http-party/node-http-proxy/commit/1ee8ae710497e239716f72d45e2f61ead3995dc3)\n- [dist] Version bump. 0.5.11 [`baf0b9e`](https://github.com/http-party/node-http-proxy/commit/baf0b9e25af53e2738812ff78614cc12966e99e3)\n- [doc] Small update to code docs [`9d9509f`](https://github.com/http-party/node-http-proxy/commit/9d9509f791c4c566629c2e323259885f1c3db7ed)\n- [minor] Add missing space [`b608a02`](https://github.com/http-party/node-http-proxy/commit/b608a029f8aa26f1a74a917e0bec0ac37e4615a0)\n\n## [v0.5.10](https://github.com/http-party/node-http-proxy/compare/v0.5.9...v0.5.10) - 2011-06-13\n\n### Commits\n\n- [refactor] Manage our own internal list of Agent instances [`887c580`](https://github.com/http-party/node-http-proxy/commit/887c5808c90b7128c040e510e237ddb4d034fe3e)\n- [doc] Update docco docs for 0.5.9 [`b4ac4d4`](https://github.com/http-party/node-http-proxy/commit/b4ac4d441fe4fb84d463bd889a5ce8d7f4d596ca)\n- [test] Update tests to use `localhost` [`a1cdf00`](https://github.com/http-party/node-http-proxy/commit/a1cdf005b98c422c777c88a7d7baf2eeb91f732d)\n- [dist] Version bump. 0.5.10 [`7b574d3`](https://github.com/http-party/node-http-proxy/commit/7b574d3d3e52b09a6445c011b8f2ae0d78282111)\n- [doc] Bump version in README.md [`653c6ca`](https://github.com/http-party/node-http-proxy/commit/653c6ca1af607623b653d3148b1bb45a304aab87)\n\n## [v0.5.9](https://github.com/http-party/node-http-proxy/compare/v0.5.8...v0.5.9) - 2011-05-23\n\n### Commits\n\n- [fix] Change sec-websocket-location header when proxying WSS --&gt; WS. Added test coverage for this scenario [`028d204`](https://github.com/http-party/node-http-proxy/commit/028d2044e71d70b7bc21d339de29e2275c3be5c2)\n- [dist] Version bump. 0.5.9 [`57ca62c`](https://github.com/http-party/node-http-proxy/commit/57ca62c878c9a953f2344719556e05492ece3435)\n\n## [v0.5.8](https://github.com/http-party/node-http-proxy/compare/v0.5.7...v0.5.8) - 2011-05-21\n\n### Commits\n\n- [doc] Regenerate docco docs [`c5fd368`](https://github.com/http-party/node-http-proxy/commit/c5fd368a8d803b6ab47e32e744a6fd6a6ca5361f)\n- [doc] Update docco docs [`74120d8`](https://github.com/http-party/node-http-proxy/commit/74120d8988627bb0686d3a26cb8ec1408cc41287)\n- [doc] Update to v0.5.7 in code and README.md [`6fd272a`](https://github.com/http-party/node-http-proxy/commit/6fd272ac18240811d8a8a39c85ee483557c414b3)\n- [dist] Version bump. 0.5.8. Forwards compatible with new versions of nodejs [`76ecb51`](https://github.com/http-party/node-http-proxy/commit/76ecb51e7b41a23288f922c9c5df3ce40f67bf80)\n- [fix] Dont force `Connection: close` now that Keep-Alive is supported [`a86d18b`](https://github.com/http-party/node-http-proxy/commit/a86d18bc7f93d013df715d1f4d88e651846f645d)\n- [test] Update to vows description for web-socket-proxy-test.js [`a865fe6`](https://github.com/http-party/node-http-proxy/commit/a865fe662ff04a4badcc90ce2af80d2380c40a85)\n\n## [v0.5.7](https://github.com/http-party/node-http-proxy/compare/v0.5.6...v0.5.7) - 2011-05-19\n\n### Commits\n\n- [api] Add `x-forwarded-proto` and `x-forwarded-port` to proxied HTTP requests [`421895f`](https://github.com/http-party/node-http-proxy/commit/421895fa308d49628bbbb546d542efa96769c3f4)\n- [dist] Version bump. v0.5.7. Only good on node v0.4.7. See issue #48. [`0911c17`](https://github.com/http-party/node-http-proxy/commit/0911c1719e641c6e4342027e8d5d82c47c6f310e)\n- [fix] Set `x-forwarded-for` from req.connection.socket.remoteAddress if req.connection.remoteAddress is not defined [`e9b3ec9`](https://github.com/http-party/node-http-proxy/commit/e9b3ec9b1d0ebf427e138176b28af44f0f973670)\n\n## [v0.5.6](https://github.com/http-party/node-http-proxy/compare/v0.5.5...v0.5.6) - 2011-05-19\n\n### Commits\n\n- [fix doc] Add `error` handler to reverseProxy request when proxying WebSockets to prevent unhandled ParseError. Rename some variables in proxyWebSocketRequest to make the code more readable [`76580c2`](https://github.com/http-party/node-http-proxy/commit/76580c292a152c0007352a9d383f59e48993cd03)\n- [doc] Regenerate docco docs [`bd45216`](https://github.com/http-party/node-http-proxy/commit/bd45216bc9207e5016f394a4bfee2bdffcc669c7)\n- [api minor] Small refactor to emit `webSocketProxyError` from a single helper function on any of the various `error` events in the proxy chain [`5d2192e`](https://github.com/http-party/node-http-proxy/commit/5d2192e654f23e1b76e0b66554debe1590a3af64)\n- [api] Manual merge of #46: add custom `proxyError` event and enable production error handling. [`652cca3`](https://github.com/http-party/node-http-proxy/commit/652cca37ea321ec9d1d55125217df0214c8090b6)\n- [dist] Version bump. v0.5.6 Only good on node v0.4.7. See issue #48. [`f1c0f64`](https://github.com/http-party/node-http-proxy/commit/f1c0f641aa14dc3c267de37370a7369c3131c636)\n\n## [v0.5.5](https://github.com/http-party/node-http-proxy/compare/v0.5.4...v0.5.5) - 2011-05-19\n\n### Commits\n\n- [fix] Change variable references for Websockets, bugs found from using wsbench [`7bf0cae`](https://github.com/http-party/node-http-proxy/commit/7bf0caef9fae86a34719f04f7b9926095fb6a146)\n- [dist] Version bump. 0.5.5. Only good on node v0.4.7. See issue #48. [`acacc05`](https://github.com/http-party/node-http-proxy/commit/acacc0561f2efabc0a7859b9a410e954f2dca6fd)\n\n## [v0.5.4](https://github.com/http-party/node-http-proxy/compare/v0.5.3...v0.5.4) - 2011-05-19\n\n### Commits\n\n- [doc] Update docco docs [`faf2618`](https://github.com/http-party/node-http-proxy/commit/faf2618cf3b53a972779514842bc4264ec9541fa)\n- [doc] Update README.md to reflect the new HTTPS to HTTP proxy capabilities [`abc01bc`](https://github.com/http-party/node-http-proxy/commit/abc01bce293f7c1a88f9be08b0540407d2b0f4a1)\n- [doc test api] Improve node-http-proxy API to allow for HTTPS to HTTP proxying scenarios. Update tests accordingly. [`895f577`](https://github.com/http-party/node-http-proxy/commit/895f577744e3cbcbb5f479c4aacec5323bb001f7)\n- [doc] Update examples for HTTPS to HTTP proxying [`91737fa`](https://github.com/http-party/node-http-proxy/commit/91737fadb640f30d3cd959f29069537473207efd)\n- [dist] Version bump. 0.5.4. Only good on node v0.4.7. See issue #48. [`c04eec1`](https://github.com/http-party/node-http-proxy/commit/c04eec1c370ca0eb212c96c0896c27b349f7ea97)\n- [minor] Update README.md to conform to Github flavored markdown [`32a15dd`](https://github.com/http-party/node-http-proxy/commit/32a15dd79d860343453c38a7eef8339d7b99718b)\n- [minor] Update README.md to conform to Github flavored markdown [`521fe27`](https://github.com/http-party/node-http-proxy/commit/521fe271853632563143fb4b76c032f7afa7831a)\n\n## [v0.5.3](https://github.com/http-party/node-http-proxy/compare/v0.5.2...v0.5.3) - 2011-05-18\n\n### Commits\n\n- [test] Continued work around Origin mismatch tests [`44a8566`](https://github.com/http-party/node-http-proxy/commit/44a85664a80fd67e20bbc36d280816dbd1a796c5)\n- [doc] Regenerate docco docs [`9e36d2d`](https://github.com/http-party/node-http-proxy/commit/9e36d2d2e619be322bb73092db2a9d72ef6709e8)\n- [fix test api] Only change Origin headers in WebSocket requests when the `changeOrigin` option is set explicitly. Added tests to ensure Origin and sec-websocket-origin headers match when proxying websockets. [`9c6c4b9`](https://github.com/http-party/node-http-proxy/commit/9c6c4b908b7d6ce67144ba9d41702b5694254099)\n- [test] Improve websocket tests to inspect outgoing and incoming HTTP headers to test origin mismatch bugs [`6e679c8`](https://github.com/http-party/node-http-proxy/commit/6e679c8019e1eb62b2b1da48628f89b8046203fd)\n- [test] Refined tests to begin checking Origin == Sec-Websocket-Origin [`9ab54ab`](https://github.com/http-party/node-http-proxy/commit/9ab54ab47fc43d98f3182da9c41487f524933783)\n- [doc minor] Update docs and code docs for v0.5.3 release [`03b9087`](https://github.com/http-party/node-http-proxy/commit/03b908744612faed82d9233f3b6d4af70368cf3c)\n- [dist] Version bump. v0.5.3. Only good on node v0.4.7. See issue #48. [`d9fa261`](https://github.com/http-party/node-http-proxy/commit/d9fa261cdc97aee71279064e536a4a22edbe3b5b)\n\n## [v0.5.2](https://github.com/http-party/node-http-proxy/compare/v0.5.1...v0.5.2) - 2011-05-17\n\n### Merged\n\n- Readme: fix syntax error, reformat code blocks [`#52`](https://github.com/http-party/node-http-proxy/pull/52)\n\n### Commits\n\n- format markdown for syntax highlighting on GitHub [`28f6dc1`](https://github.com/http-party/node-http-proxy/commit/28f6dc153a7d9fa9b6a08637c90765cf3a07fd3e)\n- [doc] Regenerate docco docs [`a5e1e3e`](https://github.com/http-party/node-http-proxy/commit/a5e1e3e70d02f32ab86b711ec4b262df5955a1a9)\n- [test] Fix tests in https mode [`1ee6bef`](https://github.com/http-party/node-http-proxy/commit/1ee6beff6aa3087e332701fd3cfda70b4e968ce8)\n- [fix] Manage bookkeeping for incoming requests to the underlying sockets behind reverse proxied websocket events. Only use the appropriate variables in the closure scope of the `upgrade` event from this bookkeeping [`85223ea`](https://github.com/http-party/node-http-proxy/commit/85223ea0800ad63ea82783c9dc2dc4a0e3345ae8)\n- [minor] Fix syntax in examples/ [`ff82946`](https://github.com/http-party/node-http-proxy/commit/ff829467d33d326c588861a46acc2bf9adbdddd2)\n- add spacing around code blocks to fix README rendering [`ab8c264`](https://github.com/http-party/node-http-proxy/commit/ab8c264e6d729de81c93982f97875006e52240f0)\n- [dist] Use devDependencies in package.json [`e6c52d4`](https://github.com/http-party/node-http-proxy/commit/e6c52d431f8a32e11cd347fbabeb7a03d0d40790)\n- don't highlight non-javascript as javascript [`d5b9ba7`](https://github.com/http-party/node-http-proxy/commit/d5b9ba7180376b8a67b9cbfebe9acf7399cab3ed)\n- fix syntax error in README example [`332d2d7`](https://github.com/http-party/node-http-proxy/commit/332d2d780ab62ccc996157dacd2498c568816ffc)\n- [minor] Ignore npm modules and debug logs [`e90cbd6`](https://github.com/http-party/node-http-proxy/commit/e90cbd6f148633ef7d3e2de06aaabe1cc493cc37)\n- [dist] Include docco module as a dev dependency [`d08c2bb`](https://github.com/http-party/node-http-proxy/commit/d08c2bb525ec661c0c8e6539e28605972b1ae9b8)\n- [dist] Version bump. 0.5.2. Only good on node v0.4.7. See issue #48. [`360e79a`](https://github.com/http-party/node-http-proxy/commit/360e79a005d298f40f36ee0e25c34fe534311b09)\n\n## [v0.5.1](https://github.com/http-party/node-http-proxy/compare/v0.5.0...v0.5.1) - 2011-05-10\n\n### Commits\n\n- [dist] Version bump. 0.5.1. Only good on node v0.4.7. See issue #48. [`6c80177`](https://github.com/http-party/node-http-proxy/commit/6c8017734053bc683f32a2b9f0ba18ba0c014855)\n- Revert \"Fixed \"Invalid argument to getAgent\" when proxying HTTP\" [`40dc9de`](https://github.com/http-party/node-http-proxy/commit/40dc9dee2d1e617af7f85a056d281b4f220f2802)\n- [fix] Fix typo in bin/node-http-proxy [`57127a3`](https://github.com/http-party/node-http-proxy/commit/57127a367193bcf12be2b367e1e01cbc57d685fe)\n- Merged pull request #39 from timmattison/master. [`ac425d7`](https://github.com/http-party/node-http-proxy/commit/ac425d70ef63b847fe6eb17dbfc4b084d0dd2d20)\n- Fixed \"Invalid argument to getAgent\" when proxying HTTP [`642e158`](https://github.com/http-party/node-http-proxy/commit/642e15805dbd572835bb4fee9527e4f2da658833)\n\n## [v0.5.0](https://github.com/http-party/node-http-proxy/compare/v0.4.2...v0.5.0) - 2011-04-17\n\n### Commits\n\n- [doc] Breakout demo.js into files in example/. Add web-socket-proxy.js example [`6e4bf6a`](https://github.com/http-party/node-http-proxy/commit/6e4bf6a9cbc400fcd2be420649ce08936417dd83)\n- [api test doc] Improve HTTPS support. Update minor documentation. Change tests accordingly. [`bf68dc3`](https://github.com/http-party/node-http-proxy/commit/bf68dc30a5c508bc8f533f52c083206b87963811)\n- [api] Update WebSocket support to use http.Agent APIs [`b0b0183`](https://github.com/http-party/node-http-proxy/commit/b0b0183c2b54fa63bd2a6f9c92475c7f56d811a3)\n- [api] Update `.proxyRequest()` and `.proxyWebSocketRequest()` APIs to take an options hash instead of a set of arguments. Add HTTPS support. [`cfddd12`](https://github.com/http-party/node-http-proxy/commit/cfddd12e821bd6b07ff2dbf0aa543ddfc3664dca)\n- [doc api] Update README.md and CHANGELOG.md for v0.5.0. Update bin/node-http-proxy to read files specified in `config.https` [`212009d`](https://github.com/http-party/node-http-proxy/commit/212009df6b08de3c0c97a4e9ec43f60f6bf49ea6)\n- [test] Add WebSocket tests [`4d18ac1`](https://github.com/http-party/node-http-proxy/commit/4d18ac1ae611f84e5e0cc599234124d183d81ffd)\n- [doc] Regenerate docco docs [`c485c87`](https://github.com/http-party/node-http-proxy/commit/c485c8742c86b504823020d2cf6c1342a1bcce48)\n- [doc test] Small updates to README.md. Update to try require socket.io [`12064d8`](https://github.com/http-party/node-http-proxy/commit/12064d8e5debf674cd5d367e563b699f10a4325e)\n- [api] Remove winston logging in favor of custom events [`a89b397`](https://github.com/http-party/node-http-proxy/commit/a89b3976b25516db9b601c0327948f3d90fab006)\n- [doc] Update README.md [`bd6a262`](https://github.com/http-party/node-http-proxy/commit/bd6a2622ad67b8c7ec15868037a48048207ce0df)\n- [dist] Version bump. v0.5.0 [`ddf31b2`](https://github.com/http-party/node-http-proxy/commit/ddf31b22ec71ef9dacca9c178ee26b6314d9fdf4)\n- [api] Update `request` event to be consistent by emitting both `req` and `res`. Add `x-forwarded-for` header. [`a3cb527`](https://github.com/http-party/node-http-proxy/commit/a3cb527be5e42d5192400933bf32a361b8c707c4)\n- [api] Emit `end` event when done proxying [`5681fc1`](https://github.com/http-party/node-http-proxy/commit/5681fc1a28ff06dfa91d9bf5512c688235cafac4)\n- [minor] Small update to README.md [`40c51a7`](https://github.com/http-party/node-http-proxy/commit/40c51a703baaf050b35f60131d3e78b42e7b0858)\n- [dist] Move pgriess' websocket client into vendor/* [`7cbf447`](https://github.com/http-party/node-http-proxy/commit/7cbf44732068dc788d31432553b3bdfcfb39f743)\n\n## [v0.4.2](https://github.com/http-party/node-http-proxy/compare/v0.4.1...v0.4.2) - 2011-04-13\n\n### Commits\n\n- [dist] Version bump. 0.4.2. Remove `eyes` dependency. [`a5d88aa`](https://github.com/http-party/node-http-proxy/commit/a5d88aaacc209bdceaf0799e99ff82bdce1bdc10)\n\n## [v0.4.1](https://github.com/http-party/node-http-proxy/compare/v0.4.0...v0.4.1) - 2011-03-20\n\n### Commits\n\n- [dist] Version bump. 0.4.1. Fix package.json [`0d1a3fe`](https://github.com/http-party/node-http-proxy/commit/0d1a3fe99511dda1ac949536a9eb4a045db39979)\n\n## [v0.4.0](https://github.com/http-party/node-http-proxy/compare/v0.3.1...v0.4.0) - 2011-03-20\n\n### Commits\n\n- [api] Further work on refactor for node 0.4.0 [`e39a9f9`](https://github.com/http-party/node-http-proxy/commit/e39a9f93d2f9ab6ea769fad5e9dda25d022d8a1a)\n- [doc] Added docco generated literate coding documentation [`3bc7d16`](https://github.com/http-party/node-http-proxy/commit/3bc7d16adc48ad1aa1161bb02bd0c27d4fb20639)\n- [doc api test] Wrap things up for v0.4.0 release: Add hostnameOnly routing to ProxyTable, add more documentation, fix edge-cases until they can be further investigated in node.js core [`5715318`](https://github.com/http-party/node-http-proxy/commit/571531820e2233b0d2f7268a1d4db8510fcabf91)\n- [api] First pass at removing pool and working with node v0.4.0 [`9faa924`](https://github.com/http-party/node-http-proxy/commit/9faa924a29544cfd84c28cb1c45489f495e3806a)\n- [doc api test] Rename HttpProxy.pause to HttpProxy.resume. Update documentation and tests accordingly [`4110448`](https://github.com/http-party/node-http-proxy/commit/4110448046dd945afe3e092968d9382d573a369a)\n- [doc] Added more documentation [`973f19f`](https://github.com/http-party/node-http-proxy/commit/973f19fd5a14e3bfad5f67e54710a4076a469fe0)\n- [doc] Regenerate docco docs [`6c42f04`](https://github.com/http-party/node-http-proxy/commit/6c42f045241194061c3786ba5827aebf88070201)\n- [api] Force connection header to be `close` until keep-alive is replemented [`3fd3c96`](https://github.com/http-party/node-http-proxy/commit/3fd3c96fa05fda45c7ef9ff44594644ac54f4a1e)\n- [dist] Version bump. 0.4.0 [`cbb5fbc`](https://github.com/http-party/node-http-proxy/commit/cbb5fbccd0e65c51eba14e75ef44184714cc8971)\n- [api test] All tests are passing when run as individual files [`389159d`](https://github.com/http-party/node-http-proxy/commit/389159da1b91ab60b8de3c379d84e76c703e6b59)\n- [minor doc] Update demo and small fix to node-http-proxy [`d8c5406`](https://github.com/http-party/node-http-proxy/commit/d8c54063dc5961fa619f7c04fa2d225da9aa1439)\n- [fix] Fixed cli parsing issue when --argument=value is not used [`34cba38`](https://github.com/http-party/node-http-proxy/commit/34cba38c297d6dcb845e95b9e1ce0271da1631d2)\n- [test] Small update to proxy-table-test.js [`3588687`](https://github.com/http-party/node-http-proxy/commit/3588687874eb691fe59407a207d38efa418211d0)\n- [minor] Expose version on module [`1dd9b3b`](https://github.com/http-party/node-http-proxy/commit/1dd9b3b15088a3c4595faae64822969014a61d52)\n- [doc] Update to v0.3.1 in README.md [`8ef2e1f`](https://github.com/http-party/node-http-proxy/commit/8ef2e1fe33e0fca2b80c0d6474dba994e625f094)\n- [dist] Change package.json for npm version bump [`0e7f362`](https://github.com/http-party/node-http-proxy/commit/0e7f3626718ecf108f3cafa814b0f4ffb3e6faa2)\n\n## [v0.3.1](https://github.com/http-party/node-http-proxy/compare/v0.3.0...v0.3.1) - 2010-11-22\n\n### Commits\n\n- [api test doc] Updated tests. Added ProxyTable functionality [`bedc7a3`](https://github.com/http-party/node-http-proxy/commit/bedc7a3ae57d5ec07b372a550fa69772f9fbc19e)\n- [test] Simplified tests. Added tests for experimental websocket support [`8c3e993`](https://github.com/http-party/node-http-proxy/commit/8c3e993833e2a09376fdb5e7c847ff00b53e70d8)\n- [test doc api] Added forward proxy functionality with tests [`c06f4bf`](https://github.com/http-party/node-http-proxy/commit/c06f4bf7fe50f29677dc5a5aad596193fc893018)\n- [dist minor] Removed vendored pool. Changed all references of sys to util [`8251296`](https://github.com/http-party/node-http-proxy/commit/8251296d7f5c472ec523316e905d678042b043d3)\n- WebSocket proxy support, fixed 304 code halting [`7249ef3`](https://github.com/http-party/node-http-proxy/commit/7249ef3ee776c66acc95036dc76a2d08dc3f6350)\n- [api] pseduo-vendor pool until pull request is finalized [`7c2eb5d`](https://github.com/http-party/node-http-proxy/commit/7c2eb5de3531f20ea92c99dd8ab207d26be9dce8)\n- No-server fix [`f84880f`](https://github.com/http-party/node-http-proxy/commit/f84880fcd946e55585d8e901e5bc32933f629837)\n- [api test bin doc] Added bin script and simple logging [`00014d6`](https://github.com/http-party/node-http-proxy/commit/00014d624c052e7404ce96c7e06769440c4eae2a)\n- [debug] Removed pool as a dependency for stress test [`73381cf`](https://github.com/http-party/node-http-proxy/commit/73381cf71ae92b9ed1c2da5986aa7ca31a7cf2e8)\n- 'end' event becomes 'close', added more try-catch handling [`cd78af5`](https://github.com/http-party/node-http-proxy/commit/cd78af5feaa67c5005df921a8d1a61575a58fca2)\n- Added support of automatic websocket tunneling, added test for it [`56003b5`](https://github.com/http-party/node-http-proxy/commit/56003b527625b2d83a191f3172005c87856aa87d)\n- [debug] Better debug messages to try to determine if pool is slowly losing clients to forever busy [`dd1918d`](https://github.com/http-party/node-http-proxy/commit/dd1918dc360dc0f9553c35c82f3f0f93ac3bfb46)\n- [doc dist] Version bump. Added CHANGELOG.md [`de53d5e`](https://github.com/http-party/node-http-proxy/commit/de53d5eb2c3d671be0ad0e736a6435c3bf5f55f4)\n- Moved error handling to response.on('end'), fixed error handling in websocket's part [`7e61f0c`](https://github.com/http-party/node-http-proxy/commit/7e61f0cf5725dedf37b956545639c2d6129855d3)\n- [minor] Pushing hot-fix from Mikeal for vendored pool repo [`60791f3`](https://github.com/http-party/node-http-proxy/commit/60791f361f8a11f9d1bad2c6366bf0ce72b40f66)\n- [api] Integrated commits from donnerjack and worked on pool changes [`3bb458e`](https://github.com/http-party/node-http-proxy/commit/3bb458e115037bc27691705d255b0d2e2504a9f1)\n- [doc] Updated Copyright ... added Fedor [`9128a8c`](https://github.com/http-party/node-http-proxy/commit/9128a8c5a15d0f64a0bae946f3e741ea708bc56f)\n- [minor] Listen to error event on pool so we dont fail out unexpectedly anymore [`711258e`](https://github.com/http-party/node-http-proxy/commit/711258ef469d064cc0dbe0f0320ed1047ed0bd54)\n- adding more debugging messages [`5d54ea5`](https://github.com/http-party/node-http-proxy/commit/5d54ea58c93c26635e0de96871e824baffea34dd)\n- adding some debug messages for live testing [`4069a7e`](https://github.com/http-party/node-http-proxy/commit/4069a7e98c22a48bae7fd57ad5f315d0e5006dfc)\n- [minor] Listen to error events re-emitted by pool into the ClientRequest [`f8bff4c`](https://github.com/http-party/node-http-proxy/commit/f8bff4c618ab2a6b6185ac973cd0e21cea19c23a)\n- [minor] Updated max clients for pool [`32aaf74`](https://github.com/http-party/node-http-proxy/commit/32aaf74e95f8a39d847b352ca984145e7abe89a6)\n- [debug] Trying to repair pool busy client growth [`7b0ea85`](https://github.com/http-party/node-http-proxy/commit/7b0ea85e2ac58d5f711f64b855f746fb2423a276)\n- [debug] Roll back last commit ... connection = close was ineffective [`266e524`](https://github.com/http-party/node-http-proxy/commit/266e5246eacb4877bb6ab557e6e6b9b8434ad612)\n\n## [v0.3.0](https://github.com/http-party/node-http-proxy/compare/v0.2.0...v0.3.0) - 2010-09-10\n\n### Commits\n\n- [api] Revert to old 0.1.x codebase for bug testing and performance comparison [`66afb2a`](https://github.com/http-party/node-http-proxy/commit/66afb2a2a35a479512ce2601c89b82f13596fc9f)\n- [api test dist doc] Updated for 0.3.0 release [`a9084b9`](https://github.com/http-party/node-http-proxy/commit/a9084b923afa66c3004abec4951ff02e031631da)\n- [api] Object creation is cheap for HttpProxy, so lets take advantage [`9f0aeac`](https://github.com/http-party/node-http-proxy/commit/9f0aeacab1a632136f5905a0d03ad04be9f93f51)\n- [doc] Update contributors for 0.3.0 [`6d47d98`](https://github.com/http-party/node-http-proxy/commit/6d47d98f5345b7f335c3b93f8e4a31dd90235dda)\n\n## [v0.2.0](https://github.com/http-party/node-http-proxy/compare/v0.1.5...v0.2.0) - 2010-09-07\n\n### Commits\n\n- [dist] Version bump and update to README + LICENCE. Word to Mikeal for coming thru for 0.2.0 [`69c162d`](https://github.com/http-party/node-http-proxy/commit/69c162dc3da334b2ece0a19be5ea4c8da7e0fe87)\n- [api dist] Merge of branch 0.2.0 [`fd61828`](https://github.com/http-party/node-http-proxy/commit/fd618289338ca2d7595f695c0b8531b40145bbca)\n- [api] Completely refactored node-http-proxy with help from Mikeal [`1221939`](https://github.com/http-party/node-http-proxy/commit/1221939accf00467adb25f8908e991e984043c85)\n- [api minor debug] Remove debug code, set Connection header if not set [`6d08f24`](https://github.com/http-party/node-http-proxy/commit/6d08f24c863e071eb4a0d3ede15656e5e7c27c4b)\n- [debug] Added some debugging to figure out why AB wont complete a test with v0.2.0 [`9715ebd`](https://github.com/http-party/node-http-proxy/commit/9715ebd40bdbbe883eb383676d5b0df24968dd72)\n- [api] Integrated a little more from Mikeal to make our return headers consistent [`eb39018`](https://github.com/http-party/node-http-proxy/commit/eb39018fd0b5751dd90fabce905997e52f2ffecd)\n- [doc] Updated README.md [`f291efb`](https://github.com/http-party/node-http-proxy/commit/f291efbaa4360d6e7ff4004cc11f8df0d737c1d0)\n\n## v0.1.5 - 2010-09-02\n\n### Commits\n\n- [api] More changes for createServer api [`5d94ae2`](https://github.com/http-party/node-http-proxy/commit/5d94ae27bc2d56d1f817b0cf1dfdb01dcc376393)\n- added colors and asciimo [`d490b50`](https://github.com/http-party/node-http-proxy/commit/d490b50ada8c1024cb785335966b71d69fae3407)\n- [api] First commit of http-proxy [`30b68c1`](https://github.com/http-party/node-http-proxy/commit/30b68c153270619119ec36615bb54ee7a2816ecc)\n- updating demo [`c4b7c0d`](https://github.com/http-party/node-http-proxy/commit/c4b7c0d8a0cc5fd7f43257594bd0a71c7bd12a63)\n- initial release v0.1.0, sure to have many updates coming. [`85f7372`](https://github.com/http-party/node-http-proxy/commit/85f73723415ec54539721777e77d5d10de383469)\n- fleshing out demo [`994f748`](https://github.com/http-party/node-http-proxy/commit/994f7481ce07c15afa5ab993b79d920b8220be44)\n- [docs] added benchmarks [`bbed176`](https://github.com/http-party/node-http-proxy/commit/bbed17640f84e56aaea06c6d4eb7d04952957fce)\n- updated paths to use npm [`972c8c0`](https://github.com/http-party/node-http-proxy/commit/972c8c05274c72c7320291389f88b0694ac290ca)\n- added spark demo [`d0ad931`](https://github.com/http-party/node-http-proxy/commit/d0ad93176d8430301a8a42f8c2b817674ce7ba32)\n- [test] Updated tests to include support for latent requests [`095e86a`](https://github.com/http-party/node-http-proxy/commit/095e86aa653c1c8e07cd1403697e0e4b638b8294)\n- started to flesh out simple demo based on tests [`2fb5ffb`](https://github.com/http-party/node-http-proxy/commit/2fb5ffba7765462e95badd0f7243e65395a3fd2e)\n- added createServer but hated it, gonna remove [`b1eb13e`](https://github.com/http-party/node-http-proxy/commit/b1eb13eb70b67ea76f5ab720d566894677a53ca2)\n- [test] Updated node-http-proxy tests [`2f265a2`](https://github.com/http-party/node-http-proxy/commit/2f265a23e4a10971495d0bd7b324b7ba786e5065)\n- [api] Updated request hashes to use a unique identifier [`c887a75`](https://github.com/http-party/node-http-proxy/commit/c887a757623f5a3d7d1e0fafeb00b96731c89872)\n- [api] Updated http-proxy to work with vows [`ead7567`](https://github.com/http-party/node-http-proxy/commit/ead7567db8099264a2001fd876cded84bc4f111f)\n- [dist] Renamed node-proxy to node-http-proxy, updated package.json [`2f49810`](https://github.com/http-party/node-http-proxy/commit/2f49810ef86f49927991f32ae42605f1118b0c25)\n- updating docs, almost there [`6e651f4`](https://github.com/http-party/node-http-proxy/commit/6e651f420f4d1e15dbbf823a8e3b311e9533c805)\n- changed api to better reflect nodes api. updated demos, tests, docs [`bde98f4`](https://github.com/http-party/node-http-proxy/commit/bde98f489234fe22f49468011b7e342cd108603f)\n- updating docs [`341bbd4`](https://github.com/http-party/node-http-proxy/commit/341bbd404f3fd81e65197b3830c3fa9e544bc1e7)\n- fixed npm package, i think. bumped version 0.1.1 [`fca40da`](https://github.com/http-party/node-http-proxy/commit/fca40da694d8df17ed6140265e374c0ceabd1167)\n- updated demo [`b622702`](https://github.com/http-party/node-http-proxy/commit/b62270210e7ad3c54fd6b2c86bde9f9942328a67)\n- added readme [`d6a2f8a`](https://github.com/http-party/node-http-proxy/commit/d6a2f8aa7dae3f6721b9607a702c68b1ad7fc692)\n- [api] Corrected chain of argument passing [`da55777`](https://github.com/http-party/node-http-proxy/commit/da55777a92d100a5ddb7a8267e56ba26bd8c2270)\n- updated demo [`e9511ea`](https://github.com/http-party/node-http-proxy/commit/e9511eafdf9ada6a0ce6defb3c5f2299411633b1)\n- [deploy] Added package.json [`dce80b9`](https://github.com/http-party/node-http-proxy/commit/dce80b9b4546064da1943e0e396e19b41390588a)\n- updated readme [`76d0649`](https://github.com/http-party/node-http-proxy/commit/76d0649abcafd80509af922503c5544e646bcebb)\n- update to docs and package.json [`d15bba4`](https://github.com/http-party/node-http-proxy/commit/d15bba4c1d2cbdaf0af27f3adcaa1db9b534d968)\n- [minor] Removed eyes dependency [`eaeed83`](https://github.com/http-party/node-http-proxy/commit/eaeed8306d6dc6e1b30223cf6d59cda6d5bb76de)\n- merge [`93505a4`](https://github.com/http-party/node-http-proxy/commit/93505a422c688b7f41fdaf304270c893ef4cf09a)\n- fixed additional port / server mismatches for new api [`15c18b6`](https://github.com/http-party/node-http-proxy/commit/15c18b612d6cd5a1f3ae46b5590dda1fc586fb35)\n- [doc] added nodejitsu.com link to ReadMe. http-proxy is used in our front facing load-balancers. look for bugs...try to improve benchmarks.... ^_^ [`6661753`](https://github.com/http-party/node-http-proxy/commit/6661753f07dcf4e5ae684df4d1709f3c238346c9)\n- removed extra self, updated colors requirement, bumped to version 0.1.3 [`9bc5b6f`](https://github.com/http-party/node-http-proxy/commit/9bc5b6f8621fb2a37e84524c3e5b91aab9b45675)\n- fixed pathing issue, bumped version 0.1.3 [`ede6490`](https://github.com/http-party/node-http-proxy/commit/ede649037e08b615a8995179f46bc701550354d6)\n- updated docs [`07d96bb`](https://github.com/http-party/node-http-proxy/commit/07d96bb8887a7880a21a739e0a8f495698e7e79e)\n- updated docs [`1594367`](https://github.com/http-party/node-http-proxy/commit/15943675edef490d9b8732345a750bc5ab1f5d7e)\n- updated readme [`fb8c5ab`](https://github.com/http-party/node-http-proxy/commit/fb8c5abd3c2a722c1c18046dcf2fffea4fa7d050)\n- updated docs [`17b6c69`](https://github.com/http-party/node-http-proxy/commit/17b6c6998544572300fc9d4faa63af1aee4c3d88)\n- updated docs [`c8dd8c4`](https://github.com/http-party/node-http-proxy/commit/c8dd8c4e28e09f25c161980316b259d81d5a4e91)\n- updated package.json again [`ddba155`](https://github.com/http-party/node-http-proxy/commit/ddba155377942259554842f37de98c508130fe11)\n- initial release v0.1.0, sure to have many updates coming. [`6a1baa2`](https://github.com/http-party/node-http-proxy/commit/6a1baa25ccf9fc3a3fc4d1a4764c968993e48cab)\n- bumped to version 0.1.5 [`b195a16`](https://github.com/http-party/node-http-proxy/commit/b195a16406534912161671448a53d6633a1f2458)\n- updated readme [`9aa2216`](https://github.com/http-party/node-http-proxy/commit/9aa22162f139ab2fa6df6b11e2a96336ee1d2612)\n- added spark demo [`d408e39`](https://github.com/http-party/node-http-proxy/commit/d408e39ed6dbd44709d0164a95ad9bc67f76ba13)\n- bumped to version 0.1.4. improved on api [`82b8228`](https://github.com/http-party/node-http-proxy/commit/82b822827d35a54501068f9880111473e19c72f9)\n- initial release v0.1.0, sure to have many updates coming. [`1e04552`](https://github.com/http-party/node-http-proxy/commit/1e04552bd8f39e3dcba36bbf7fb36674e5c0c9ff)\n- updated readme [`0a2eaaa`](https://github.com/http-party/node-http-proxy/commit/0a2eaaa7db690f86aca8c0b952f745e806ad818c)\n- updating docs [`198000f`](https://github.com/http-party/node-http-proxy/commit/198000feefd525125a2031557b3556978a057bde)\n- [api] Added createServer api to node-http-proxy [`2e2b55f`](https://github.com/http-party/node-http-proxy/commit/2e2b55f113eb3bc81c43717c0db5de695fb694c1)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at <https://github.com/http-party/node-http-proxy>. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/LICENSE",
    "content": "\n  node-http-proxy\n\n  Copyright (c) 2010-2016 Charlie Robbins, Jarrett Cruger & the Contributors.\n\n  Permission is hereby granted, free of charge, to any person obtaining\n  a copy of this software and associated documentation files (the\n  \"Software\"), to deal in the Software without restriction, including\n  without limitation the rights to use, copy, modify, merge, publish,\n  distribute, sublicense, and/or sell copies of the Software, and to\n  permit persons to whom the Software is furnished to do so, subject to\n  the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://raw.github.com/http-party/node-http-proxy/master/doc/logo.png\"/>\n</p>\n\n# node-http-proxy [![Build Status](https://travis-ci.org/http-party/node-http-proxy.svg?branch=master)](https://travis-ci.org/http-party/node-http-proxy) [![codecov](https://codecov.io/gh/http-party/node-http-proxy/branch/master/graph/badge.svg)](https://codecov.io/gh/http-party/node-http-proxy)\n\n`node-http-proxy` is an HTTP programmable proxying library that supports\nwebsockets. It is suitable for implementing components such as reverse\nproxies and load balancers.\n\n### Table of Contents\n  * [Installation](#installation)\n  * [Upgrading from 0.8.x ?](#upgrading-from-08x-)\n  * [Core Concept](#core-concept)\n  * [Use Cases](#use-cases)\n    * [Setup a basic stand-alone proxy server](#setup-a-basic-stand-alone-proxy-server)\n    * [Setup a stand-alone proxy server with custom server logic](#setup-a-stand-alone-proxy-server-with-custom-server-logic)\n    * [Setup a stand-alone proxy server with proxy request header re-writing](#setup-a-stand-alone-proxy-server-with-proxy-request-header-re-writing)\n    * [Modify a response from a proxied server](#modify-a-response-from-a-proxied-server)\n    * [Setup a stand-alone proxy server with latency](#setup-a-stand-alone-proxy-server-with-latency)\n    * [Using HTTPS](#using-https)\n    * [Proxying WebSockets](#proxying-websockets)\n  * [Options](#options)\n  * [Listening for proxy events](#listening-for-proxy-events)\n  * [Shutdown](#shutdown)\n  * [Miscellaneous](#miscellaneous)\n    * [Test](#test)\n    * [ProxyTable API](#proxytable-api)\n    * [Logo](#logo)\n  * [Contributing and Issues](#contributing-and-issues)\n  * [License](#license)\n\n### Installation\n\n`npm install http-proxy --save`\n\n**[Back to top](#table-of-contents)**\n\n### Upgrading from 0.8.x ?\n\nClick [here](UPGRADING.md)\n\n**[Back to top](#table-of-contents)**\n\n### Core Concept\n\nA new proxy is created by calling `createProxyServer` and passing\nan `options` object as argument ([valid properties are available here](lib/http-proxy.js#L26-L42))\n\n```javascript\nvar httpProxy = require('http-proxy');\n\nvar proxy = httpProxy.createProxyServer(options); // See (†)\n```\n†Unless listen(..) is invoked on the object, this does not create a webserver. See below.\n\nAn object will be returned with four methods:\n\n* web `req, res, [options]` (used for proxying regular HTTP(S) requests)\n* ws `req, socket, head, [options]` (used for proxying WS(S) requests)\n* listen `port` (a function that wraps the object in a webserver, for your convenience)\n* close `[callback]` (a function that closes the inner webserver and stops listening on given port)\n\nIt is then possible to proxy requests by calling these functions\n\n```javascript\nhttp.createServer(function(req, res) {\n  proxy.web(req, res, { target: 'http://mytarget.com:8080' });\n});\n```\n\nErrors can be listened on either using the Event Emitter API\n\n```javascript\nproxy.on('error', function(e) {\n  ...\n});\n```\n\nor using the callback API\n\n```javascript\nproxy.web(req, res, { target: 'http://mytarget.com:8080' }, function(e) { ... });\n```\n\nWhen a request is proxied it follows two different pipelines ([available here](lib/http-proxy/passes))\nwhich apply transformations to both the `req` and `res` object.\nThe first pipeline (incoming) is responsible for the creation and manipulation of the stream that connects your client to the target.\nThe second pipeline (outgoing) is responsible for the creation and manipulation of the stream that, from your target, returns data\nto the client.\n\n**[Back to top](#table-of-contents)**\n\n### Use Cases\n\n#### Setup a basic stand-alone proxy server\n\n```js\nvar http = require('http'),\n    httpProxy = require('http-proxy');\n//\n// Create your proxy server and set the target in the options.\n//\nhttpProxy.createProxyServer({target:'http://localhost:9000'}).listen(8000); // See (†)\n\n//\n// Create your target server\n//\nhttp.createServer(function (req, res) {\n  res.writeHead(200, { 'Content-Type': 'text/plain' });\n  res.write('request successfully proxied!' + '\\n' + JSON.stringify(req.headers, true, 2));\n  res.end();\n}).listen(9000);\n```\n†Invoking listen(..) triggers the creation of a web server. Otherwise, just the proxy instance is created.\n\n**[Back to top](#table-of-contents)**\n\n#### Setup a stand-alone proxy server with custom server logic\nThis example shows how you can proxy a request using your own HTTP server\nand also you can put your own logic to handle the request.\n\n```js\nvar http = require('http'),\n    httpProxy = require('http-proxy');\n\n//\n// Create a proxy server with custom application logic\n//\nvar proxy = httpProxy.createProxyServer({});\n\n//\n// Create your custom server and just call `proxy.web()` to proxy\n// a web request to the target passed in the options\n// also you can use `proxy.ws()` to proxy a websockets request\n//\nvar server = http.createServer(function(req, res) {\n  // You can define here your custom logic to handle the request\n  // and then proxy the request.\n  proxy.web(req, res, { target: 'http://127.0.0.1:5050' });\n});\n\nconsole.log(\"listening on port 5050\")\nserver.listen(5050);\n```\n\n**[Back to top](#table-of-contents)**\n\n#### Setup a stand-alone proxy server with proxy request header re-writing\nThis example shows how you can proxy a request using your own HTTP server that\nmodifies the outgoing proxy request by adding a special header.\n\n```js\nvar http = require('http'),\n    httpProxy = require('http-proxy');\n\n//\n// Create a proxy server with custom application logic\n//\nvar proxy = httpProxy.createProxyServer({});\n\n// To modify the proxy connection before data is sent, you can listen\n// for the 'proxyReq' event. When the event is fired, you will receive\n// the following arguments:\n// (http.ClientRequest proxyReq, http.IncomingMessage req,\n//  http.ServerResponse res, Object options). This mechanism is useful when\n// you need to modify the proxy request before the proxy connection\n// is made to the target.\n//\nproxy.on('proxyReq', function(proxyReq, req, res, options) {\n  proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');\n});\n\nvar server = http.createServer(function(req, res) {\n  // You can define here your custom logic to handle the request\n  // and then proxy the request.\n  proxy.web(req, res, {\n    target: 'http://127.0.0.1:5050'\n  });\n});\n\nconsole.log(\"listening on port 5050\")\nserver.listen(5050);\n```\n\n**[Back to top](#table-of-contents)**\n\n#### Modify a response from a proxied server\nSometimes when you have received a HTML/XML document from the server of origin you would like to modify it before forwarding it on.\n\n[Harmon](https://github.com/No9/harmon) allows you to do this in a streaming style so as to keep the pressure on the proxy to a minimum.\n\n**[Back to top](#table-of-contents)**\n\n#### Setup a stand-alone proxy server with latency\n\n```js\nvar http = require('http'),\n    httpProxy = require('http-proxy');\n\n//\n// Create a proxy server with latency\n//\nvar proxy = httpProxy.createProxyServer();\n\n//\n// Create your server that makes an operation that waits a while\n// and then proxies the request\n//\nhttp.createServer(function (req, res) {\n  // This simulates an operation that takes 500ms to execute\n  setTimeout(function () {\n    proxy.web(req, res, {\n      target: 'http://localhost:9008'\n    });\n  }, 500);\n}).listen(8008);\n\n//\n// Create your target server\n//\nhttp.createServer(function (req, res) {\n  res.writeHead(200, { 'Content-Type': 'text/plain' });\n  res.write('request successfully proxied to: ' + req.url + '\\n' + JSON.stringify(req.headers, true, 2));\n  res.end();\n}).listen(9008);\n```\n\n**[Back to top](#table-of-contents)**\n\n#### Using HTTPS\nYou can activate the validation of a secure SSL certificate to the target connection (avoid self-signed certs), just set `secure: true` in the options.\n\n##### HTTPS -> HTTP\n\n```js\n//\n// Create the HTTPS proxy server in front of a HTTP server\n//\nhttpProxy.createServer({\n  target: {\n    host: 'localhost',\n    port: 9009\n  },\n  ssl: {\n    key: fs.readFileSync('valid-ssl-key.pem', 'utf8'),\n    cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8')\n  }\n}).listen(8009);\n```\n\n##### HTTPS -> HTTPS\n\n```js\n//\n// Create the proxy server listening on port 443\n//\nhttpProxy.createServer({\n  ssl: {\n    key: fs.readFileSync('valid-ssl-key.pem', 'utf8'),\n    cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8')\n  },\n  target: 'https://localhost:9010',\n  secure: true // Depends on your needs, could be false.\n}).listen(443);\n```\n\n##### HTTP -> HTTPS (using a PKCS12 client certificate)\n\n```js\n//\n// Create an HTTP proxy server with an HTTPS target\n//\nhttpProxy.createProxyServer({\n  target: {\n    protocol: 'https:',\n    host: 'my-domain-name',\n    port: 443,\n    pfx: fs.readFileSync('path/to/certificate.p12'),\n    passphrase: 'password',\n  },\n  changeOrigin: true,\n}).listen(8000);\n```\n\n**[Back to top](#table-of-contents)**\n\n#### Proxying WebSockets\nYou can activate the websocket support for the proxy using `ws:true` in the options.\n\n```js\n//\n// Create a proxy server for websockets\n//\nhttpProxy.createServer({\n  target: 'ws://localhost:9014',\n  ws: true\n}).listen(8014);\n```\n\nAlso you can proxy the websocket requests just calling the `ws(req, socket, head)` method.\n\n```js\n//\n// Setup our server to proxy standard HTTP requests\n//\nvar proxy = new httpProxy.createProxyServer({\n  target: {\n    host: 'localhost',\n    port: 9015\n  }\n});\nvar proxyServer = http.createServer(function (req, res) {\n  proxy.web(req, res);\n});\n\n//\n// Listen to the `upgrade` event and proxy the\n// WebSocket requests as well.\n//\nproxyServer.on('upgrade', function (req, socket, head) {\n  proxy.ws(req, socket, head);\n});\n\nproxyServer.listen(8015);\n```\n\n**[Back to top](#table-of-contents)**\n\n### Options\n\n`httpProxy.createProxyServer` supports the following options:\n\n*  **target**: url string to be parsed with the url module\n*  **forward**: url string to be parsed with the url module\n*  **agent**: object to be passed to http(s).request (see Node's [https agent](http://nodejs.org/api/https.html#https_class_https_agent) and [http agent](http://nodejs.org/api/http.html#http_class_http_agent) objects)\n*  **ssl**: object to be passed to https.createServer()\n*  **ws**: true/false, if you want to proxy websockets\n*  **xfwd**: true/false, adds x-forward headers\n*  **secure**: true/false, if you want to verify the SSL Certs\n*  **toProxy**: true/false, passes the absolute URL as the `path` (useful for proxying to proxies)\n*  **prependPath**: true/false, Default: true - specify whether you want to prepend the target's path to the proxy path\n*  **ignorePath**: true/false, Default: false - specify whether you want to ignore the proxy path of the incoming request (note: you will have to append / manually if required).\n*  **localAddress**: Local interface string to bind for outgoing connections\n*  **changeOrigin**: true/false, Default: false - changes the origin of the host header to the target URL\n*  **preserveHeaderKeyCase**: true/false, Default: false - specify whether you want to keep letter case of response header key\n*  **auth**: Basic authentication i.e. 'user:password' to compute an Authorization header.\n*  **hostRewrite**: rewrites the location hostname on (201/301/302/307/308) redirects.\n*  **autoRewrite**: rewrites the location host/port on (201/301/302/307/308) redirects based on requested host/port. Default: false.\n*  **protocolRewrite**: rewrites the location protocol on (201/301/302/307/308) redirects to 'http' or 'https'. Default: null.\n*  **cookieDomainRewrite**: rewrites domain of `set-cookie` headers. Possible values:\n   * `false` (default): disable cookie rewriting\n   * String: new domain, for example `cookieDomainRewrite: \"new.domain\"`. To remove the domain, use `cookieDomainRewrite: \"\"`.\n   * Object: mapping of domains to new domains, use `\"*\"` to match all domains.\n     For example keep one domain unchanged, rewrite one domain and remove other domains:\n     ```\n     cookieDomainRewrite: {\n       \"unchanged.domain\": \"unchanged.domain\",\n       \"old.domain\": \"new.domain\",\n       \"*\": \"\"\n     }\n     ```\n*  **cookiePathRewrite**: rewrites path of `set-cookie` headers. Possible values:\n   * `false` (default): disable cookie rewriting\n   * String: new path, for example `cookiePathRewrite: \"/newPath/\"`. To remove the path, use `cookiePathRewrite: \"\"`. To set path to root use `cookiePathRewrite: \"/\"`.\n   * Object: mapping of paths to new paths, use `\"*\"` to match all paths.\n     For example, to keep one path unchanged, rewrite one path and remove other paths:\n     ```\n     cookiePathRewrite: {\n       \"/unchanged.path/\": \"/unchanged.path/\",\n       \"/old.path/\": \"/new.path/\",\n       \"*\": \"\"\n     }\n     ```\n*  **headers**: object with extra headers to be added to target requests.\n*  **proxyTimeout**: timeout (in millis) for outgoing proxy requests\n*  **timeout**: timeout (in millis) for incoming requests\n*  **followRedirects**: true/false, Default: false - specify whether you want to follow redirects\n*  **selfHandleResponse** true/false, if set to true, none of the webOutgoing passes are called and it's your responsibility to appropriately return the response by listening and acting on the `proxyRes` event\n*  **buffer**: stream of data to send as the request body.  Maybe you have some middleware that consumes the request stream before proxying it on e.g.  If you read the body of a request into a field called 'req.rawbody' you could restream this field in the buffer option:\n\n    ```\n    'use strict';\n\n    const streamify = require('stream-array');\n    const HttpProxy = require('http-proxy');\n    const proxy = new HttpProxy();\n\n    module.exports = (req, res, next) => {\n\n      proxy.web(req, res, {\n        target: 'http://localhost:4003/',\n        buffer: streamify(req.rawBody)\n      }, next);\n\n    };\n    ```\n\n**NOTE:**\n`options.ws` and `options.ssl` are optional.\n`options.target` and `options.forward` cannot both be missing\n\nIf you are using the `proxyServer.listen` method, the following options are also applicable:\n\n *  **ssl**: object to be passed to https.createServer()\n *  **ws**: true/false, if you want to proxy websockets\n\n\n**[Back to top](#table-of-contents)**\n\n### Listening for proxy events\n\n* `error`: The error event is emitted if the request to the target fail. **We do not do any error handling of messages passed between client and proxy, and messages passed between proxy and target, so it is recommended that you listen on errors and handle them.**\n* `proxyReq`: This event is emitted before the data is sent. It gives you a chance to alter the proxyReq request object. Applies to \"web\" connections\n* `proxyReqWs`: This event is emitted before the data is sent. It gives you a chance to alter the proxyReq request object. Applies to \"websocket\" connections\n* `proxyRes`: This event is emitted if the request to the target got a response.\n* `open`: This event is emitted once the proxy websocket was created and piped into the target websocket.\n* `close`: This event is emitted once the proxy websocket was closed.\n* (DEPRECATED) `proxySocket`: Deprecated in favor of `open`.\n\n```js\nvar httpProxy = require('http-proxy');\n// Error example\n//\n// Http Proxy Server with bad target\n//\nvar proxy = httpProxy.createServer({\n  target:'http://localhost:9005'\n});\n\nproxy.listen(8005);\n\n//\n// Listen for the `error` event on `proxy`.\nproxy.on('error', function (err, req, res) {\n  res.writeHead(500, {\n    'Content-Type': 'text/plain'\n  });\n\n  res.end('Something went wrong. And we are reporting a custom error message.');\n});\n\n//\n// Listen for the `proxyRes` event on `proxy`.\n//\nproxy.on('proxyRes', function (proxyRes, req, res) {\n  console.log('RAW Response from the target', JSON.stringify(proxyRes.headers, true, 2));\n});\n\n//\n// Listen for the `open` event on `proxy`.\n//\nproxy.on('open', function (proxySocket) {\n  // listen for messages coming FROM the target here\n  proxySocket.on('data', hybiParseAndLogMessage);\n});\n\n//\n// Listen for the `close` event on `proxy`.\n//\nproxy.on('close', function (res, socket, head) {\n  // view disconnected websocket connections\n  console.log('Client disconnected');\n});\n```\n\n**[Back to top](#table-of-contents)**\n\n### Shutdown\n\n* When testing or running server within another program it may be necessary to close the proxy.\n* This will stop the proxy from accepting new connections.\n\n```js\nvar proxy = new httpProxy.createProxyServer({\n  target: {\n    host: 'localhost',\n    port: 1337\n  }\n});\n\nproxy.close();\n```\n\n**[Back to top](#table-of-contents)**\n\n### Miscellaneous\n\nIf you want to handle your own response after receiving the `proxyRes`, you can do\nso with `selfHandleResponse`. As you can see below, if you use this option, you\nare able to intercept and read the `proxyRes` but you must also make sure to\nreply to the `res` itself otherwise the original client will never receive any\ndata.\n\n### Modify response\n\n```js\n\n    var option = {\n      target: target,\n      selfHandleResponse : true\n    };\n    proxy.on('proxyRes', function (proxyRes, req, res) {\n        var body = [];\n        proxyRes.on('data', function (chunk) {\n            body.push(chunk);\n        });\n        proxyRes.on('end', function () {\n            body = Buffer.concat(body).toString();\n            console.log(\"res from proxied server:\", body);\n            res.end(\"my response to cli\");\n        });\n    });\n    proxy.web(req, res, option);\n\n\n```\n\n#### ProxyTable API\n\nA proxy table API is available through this add-on [module](https://github.com/donasaur/http-proxy-rules), which lets you define a set of rules to translate matching routes to target routes that the reverse proxy will talk to.\n\n#### Test\n\n```\n$ npm test\n```\n\n#### Logo\n\nLogo created by [Diego Pasquali](http://dribbble.com/diegopq)\n\n**[Back to top](#table-of-contents)**\n\n### Contributing and Issues\n\n* Read carefully our [Code Of Conduct](https://github.com/http-party/node-http-proxy/blob/master/CODE_OF_CONDUCT.md)\n* Search on Google/Github\n* If you can't find anything, open an issue\n* If you feel comfortable about fixing the issue, fork the repo\n* Commit to your local branch (which must be different from `master`)\n* Submit your Pull Request (be sure to include tests and update documentation)\n\n**[Back to top](#table-of-contents)**\n\n### License\n\n>The MIT License (MIT)\n>\n>Copyright (c) 2010 - 2016 Charlie Robbins, Jarrett Cruger & the Contributors.\n>\n>Permission is hereby granted, free of charge, to any person obtaining a copy\n>of this software and associated documentation files (the \"Software\"), to deal\n>in the Software without restriction, including without limitation the rights\n>to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n>copies of the Software, and to permit persons to whom the Software is\n>furnished to do so, subject to the following conditions:\n>\n>The above copyright notice and this permission notice shall be included in\n>all copies or substantial portions of the Software.\n>\n>THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n>FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n>AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n>LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n>OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n>THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/codecov.yml",
    "content": "coverage:\n  parsers:\n    javascript:\n      enable_partials: yes\n  status:\n    project:\n      default:\n        target: \"70%\"\n    patch:\n      enabled: false\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/index.js",
    "content": "/*!\n * Caron dimonio, con occhi di bragia\n * loro accennando, tutte le raccoglie;\n * batte col remo qualunque s’adagia \n *\n * Charon the demon, with the eyes of glede,\n * Beckoning to them, collects them all together,\n * Beats with his oar whoever lags behind\n *          \n *          Dante - The Divine Comedy (Canto III)\n */\n\nmodule.exports = require('./lib/http-proxy');"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/lib/http-proxy/common.js",
    "content": "var common   = exports,\n    url      = require('url'),\n    extend   = require('util')._extend,\n    required = require('requires-port');\n\nvar upgradeHeader = /(^|,)\\s*upgrade\\s*($|,)/i,\n    isSSL = /^https|wss/;\n\n/**\n * Simple Regex for testing if protocol is https\n */\ncommon.isSSL = isSSL;\n/**\n * Copies the right headers from `options` and `req` to\n * `outgoing` which is then used to fire the proxied\n * request.\n *\n * Examples:\n *\n *    common.setupOutgoing(outgoing, options, req)\n *    // => { host: ..., hostname: ...}\n *\n * @param {Object} Outgoing Base object to be filled with required properties\n * @param {Object} Options Config object passed to the proxy\n * @param {ClientRequest} Req Request Object\n * @param {String} Forward String to select forward or target\n * \n * @return {Object} Outgoing Object with all required properties set\n *\n * @api private\n */\n\ncommon.setupOutgoing = function(outgoing, options, req, forward) {\n  outgoing.port = options[forward || 'target'].port ||\n                  (isSSL.test(options[forward || 'target'].protocol) ? 443 : 80);\n\n  ['host', 'hostname', 'socketPath', 'pfx', 'key',\n    'passphrase', 'cert', 'ca', 'ciphers', 'secureProtocol'].forEach(\n    function(e) { outgoing[e] = options[forward || 'target'][e]; }\n  );\n\n  outgoing.method = options.method || req.method;\n  outgoing.headers = extend({}, req.headers);\n\n  if (options.headers){\n    extend(outgoing.headers, options.headers);\n  }\n\n  if (options.auth) {\n    outgoing.auth = options.auth;\n  }\n  \n  if (options.ca) {\n      outgoing.ca = options.ca;\n  }\n\n  if (isSSL.test(options[forward || 'target'].protocol)) {\n    outgoing.rejectUnauthorized = (typeof options.secure === \"undefined\") ? true : options.secure;\n  }\n\n\n  outgoing.agent = options.agent || false;\n  outgoing.localAddress = options.localAddress;\n\n  //\n  // Remark: If we are false and not upgrading, set the connection: close. This is the right thing to do\n  // as node core doesn't handle this COMPLETELY properly yet.\n  //\n  if (!outgoing.agent) {\n    outgoing.headers = outgoing.headers || {};\n    if (typeof outgoing.headers.connection !== 'string'\n        || !upgradeHeader.test(outgoing.headers.connection)\n       ) { outgoing.headers.connection = 'close'; }\n  }\n\n\n  // the final path is target path + relative path requested by user:\n  var target = options[forward || 'target'];\n  var targetPath = target && options.prependPath !== false\n    ? (target.path || '')\n    : '';\n\n  //\n  // Remark: Can we somehow not use url.parse as a perf optimization?\n  //\n  var outgoingPath = !options.toProxy\n    ? (url.parse(req.url).path || '')\n    : req.url;\n\n  //\n  // Remark: ignorePath will just straight up ignore whatever the request's\n  // path is. This can be labeled as FOOT-GUN material if you do not know what\n  // you are doing and are using conflicting options.\n  //\n  outgoingPath = !options.ignorePath ? outgoingPath : '';\n\n  outgoing.path = common.urlJoin(targetPath, outgoingPath);\n\n  if (options.changeOrigin) {\n    outgoing.headers.host =\n      required(outgoing.port, options[forward || 'target'].protocol) && !hasPort(outgoing.host)\n        ? outgoing.host + ':' + outgoing.port\n        : outgoing.host;\n  }\n  return outgoing;\n};\n\n/**\n * Set the proper configuration for sockets,\n * set no delay and set keep alive, also set\n * the timeout to 0.\n *\n * Examples:\n *\n *    common.setupSocket(socket)\n *    // => Socket\n *\n * @param {Socket} Socket instance to setup\n * \n * @return {Socket} Return the configured socket.\n *\n * @api private\n */\n\ncommon.setupSocket = function(socket) {\n  socket.setTimeout(0);\n  socket.setNoDelay(true);\n\n  socket.setKeepAlive(true, 0);\n\n  return socket;\n};\n\n/**\n * Get the port number from the host. Or guess it based on the connection type.\n *\n * @param {Request} req Incoming HTTP request.\n *\n * @return {String} The port number.\n *\n * @api private\n */\ncommon.getPort = function(req) {\n  var res = req.headers.host ? req.headers.host.match(/:(\\d+)/) : '';\n\n  return res ?\n    res[1] :\n    common.hasEncryptedConnection(req) ? '443' : '80';\n};\n\n/**\n * Check if the request has an encrypted connection.\n *\n * @param {Request} req Incoming HTTP request.\n *\n * @return {Boolean} Whether the connection is encrypted or not.\n *\n * @api private\n */\ncommon.hasEncryptedConnection = function(req) {\n  return Boolean(req.connection.encrypted || req.connection.pair);\n};\n\n/**\n * OS-agnostic join (doesn't break on URLs like path.join does on Windows)>\n *\n * @return {String} The generated path.\n *\n * @api private\n */\n\ncommon.urlJoin = function() {\n    //\n    // We do not want to mess with the query string. All we want to touch is the path.\n    //\n  var args = Array.prototype.slice.call(arguments),\n      lastIndex = args.length - 1,\n      last = args[lastIndex],\n      lastSegs = last.split('?'),\n      retSegs;\n\n  args[lastIndex] = lastSegs.shift();\n\n  //\n  // Join all strings, but remove empty strings so we don't get extra slashes from\n  // joining e.g. ['', 'am']\n  //\n  retSegs = [\n    args.filter(Boolean).join('/')\n        .replace(/\\/+/g, '/')\n        .replace('http:/', 'http://')\n        .replace('https:/', 'https://')\n  ];\n\n  // Only join the query string if it exists so we don't have trailing a '?'\n  // on every request\n\n  // Handle case where there could be multiple ? in the URL.\n  retSegs.push.apply(retSegs, lastSegs);\n\n  return retSegs.join('?')\n};\n\n/**\n * Rewrites or removes the domain of a cookie header\n *\n * @param {String|Array} Header\n * @param {Object} Config, mapping of domain to rewritten domain.\n *                 '*' key to match any domain, null value to remove the domain.\n *\n * @api private\n */\ncommon.rewriteCookieProperty = function rewriteCookieProperty(header, config, property) {\n  if (Array.isArray(header)) {\n    return header.map(function (headerElement) {\n      return rewriteCookieProperty(headerElement, config, property);\n    });\n  }\n  return header.replace(new RegExp(\"(;\\\\s*\" + property + \"=)([^;]+)\", 'i'), function(match, prefix, previousValue) {\n    var newValue;\n    if (previousValue in config) {\n      newValue = config[previousValue];\n    } else if ('*' in config) {\n      newValue = config['*'];\n    } else {\n      //no match, return previous value\n      return match;\n    }\n    if (newValue) {\n      //replace value\n      return prefix + newValue;\n    } else {\n      //remove value\n      return '';\n    }\n  });\n};\n\n/**\n * Check the host and see if it potentially has a port in it (keep it simple)\n *\n * @returns {Boolean} Whether we have one or not\n *\n * @api private\n */\nfunction hasPort(host) {\n  return !!~host.indexOf(':');\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/lib/http-proxy/index.js",
    "content": "var httpProxy = module.exports,\n    extend    = require('util')._extend,\n    parse_url = require('url').parse,\n    EE3       = require('eventemitter3'),\n    http      = require('http'),\n    https     = require('https'),\n    web       = require('./passes/web-incoming'),\n    ws        = require('./passes/ws-incoming');\n\nhttpProxy.Server = ProxyServer;\n\n/**\n * Returns a function that creates the loader for\n * either `ws` or `web`'s  passes.\n *\n * Examples:\n *\n *    httpProxy.createRightProxy('ws')\n *    // => [Function]\n *\n * @param {String} Type Either 'ws' or 'web'\n * \n * @return {Function} Loader Function that when called returns an iterator for the right passes\n *\n * @api private\n */\n\nfunction createRightProxy(type) {\n\n  return function(options) {\n    return function(req, res /*, [head], [opts] */) {\n      var passes = (type === 'ws') ? this.wsPasses : this.webPasses,\n          args = [].slice.call(arguments),\n          cntr = args.length - 1,\n          head, cbl;\n\n      /* optional args parse begin */\n      if(typeof args[cntr] === 'function') {\n        cbl = args[cntr];\n\n        cntr--;\n      }\n\n      var requestOptions = options;\n      if(\n        !(args[cntr] instanceof Buffer) &&\n        args[cntr] !== res\n      ) {\n        //Copy global options\n        requestOptions = extend({}, options);\n        //Overwrite with request options\n        extend(requestOptions, args[cntr]);\n\n        cntr--;\n      }\n\n      if(args[cntr] instanceof Buffer) {\n        head = args[cntr];\n      }\n\n      /* optional args parse end */\n\n      ['target', 'forward'].forEach(function(e) {\n        if (typeof requestOptions[e] === 'string')\n          requestOptions[e] = parse_url(requestOptions[e]);\n      });\n\n      if (!requestOptions.target && !requestOptions.forward) {\n        return this.emit('error', new Error('Must provide a proper URL as target'));\n      }\n\n      for(var i=0; i < passes.length; i++) {\n        /**\n         * Call of passes functions\n         * pass(req, res, options, head)\n         *\n         * In WebSockets case the `res` variable\n         * refer to the connection socket\n         * pass(req, socket, options, head)\n         */\n        if(passes[i](req, res, requestOptions, head, this, cbl)) { // passes can return a truthy value to halt the loop\n          break;\n        }\n      }\n    };\n  };\n}\nhttpProxy.createRightProxy = createRightProxy;\n\nfunction ProxyServer(options) {\n  EE3.call(this);\n\n  options = options || {};\n  options.prependPath = options.prependPath === false ? false : true;\n\n  this.web = this.proxyRequest           = createRightProxy('web')(options);\n  this.ws  = this.proxyWebsocketRequest  = createRightProxy('ws')(options);\n  this.options = options;\n\n  this.webPasses = Object.keys(web).map(function(pass) {\n    return web[pass];\n  });\n\n  this.wsPasses = Object.keys(ws).map(function(pass) {\n    return ws[pass];\n  });\n\n  this.on('error', this.onError, this);\n\n}\n\nrequire('util').inherits(ProxyServer, EE3);\n\nProxyServer.prototype.onError = function (err) {\n  //\n  // Remark: Replicate node core behavior using EE3\n  // so we force people to handle their own errors\n  //\n  if(this.listeners('error').length === 1) {\n    throw err;\n  }\n};\n\nProxyServer.prototype.listen = function(port, hostname) {\n  var self    = this,\n      closure = function(req, res) { self.web(req, res); };\n\n  this._server  = this.options.ssl ?\n    https.createServer(this.options.ssl, closure) :\n    http.createServer(closure);\n\n  if(this.options.ws) {\n    this._server.on('upgrade', function(req, socket, head) { self.ws(req, socket, head); });\n  }\n\n  this._server.listen(port, hostname);\n\n  return this;\n};\n\nProxyServer.prototype.close = function(callback) {\n  var self = this;\n  if (this._server) {\n    this._server.close(done);\n  }\n\n  // Wrap callback to nullify server after all open connections are closed.\n  function done() {\n    self._server = null;\n    if (callback) {\n      callback.apply(null, arguments);\n    }\n  };\n};\n\nProxyServer.prototype.before = function(type, passName, callback) {\n  if (type !== 'ws' && type !== 'web') {\n    throw new Error('type must be `web` or `ws`');\n  }\n  var passes = (type === 'ws') ? this.wsPasses : this.webPasses,\n      i = false;\n\n  passes.forEach(function(v, idx) {\n    if(v.name === passName) i = idx;\n  })\n\n  if(i === false) throw new Error('No such pass');\n\n  passes.splice(i, 0, callback);\n};\nProxyServer.prototype.after = function(type, passName, callback) {\n  if (type !== 'ws' && type !== 'web') {\n    throw new Error('type must be `web` or `ws`');\n  }\n  var passes = (type === 'ws') ? this.wsPasses : this.webPasses,\n      i = false;\n\n  passes.forEach(function(v, idx) {\n    if(v.name === passName) i = idx;\n  })\n\n  if(i === false) throw new Error('No such pass');\n\n  passes.splice(i++, 0, callback);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/lib/http-proxy/passes/web-incoming.js",
    "content": "var httpNative   = require('http'),\n    httpsNative  = require('https'),\n    web_o  = require('./web-outgoing'),\n    common = require('../common'),\n    followRedirects = require('follow-redirects');\n\nweb_o = Object.keys(web_o).map(function(pass) {\n  return web_o[pass];\n});\n\nvar nativeAgents = { http: httpNative, https: httpsNative };\n\n/*!\n * Array of passes.\n *\n * A `pass` is just a function that is executed on `req, res, options`\n * so that you can easily add new checks while still keeping the base\n * flexible.\n */\n\n\nmodule.exports = {\n\n  /**\n   * Sets `content-length` to '0' if request is of DELETE type.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {Object} Options Config object passed to the proxy\n   *\n   * @api private\n   */\n\n  deleteLength: function deleteLength(req, res, options) {\n    if((req.method === 'DELETE' || req.method === 'OPTIONS')\n       && !req.headers['content-length']) {\n      req.headers['content-length'] = '0';\n      delete req.headers['transfer-encoding'];\n    }\n  },\n\n  /**\n   * Sets timeout in request socket if it was specified in options.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {Object} Options Config object passed to the proxy\n   *\n   * @api private\n   */\n\n  timeout: function timeout(req, res, options) {\n    if(options.timeout) {\n      req.socket.setTimeout(options.timeout);\n    }\n  },\n\n  /**\n   * Sets `x-forwarded-*` headers if specified in config.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {Object} Options Config object passed to the proxy\n   *\n   * @api private\n   */\n\n  XHeaders: function XHeaders(req, res, options) {\n    if(!options.xfwd) return;\n\n    var encrypted = req.isSpdy || common.hasEncryptedConnection(req);\n    var values = {\n      for  : req.connection.remoteAddress || req.socket.remoteAddress,\n      port : common.getPort(req),\n      proto: encrypted ? 'https' : 'http'\n    };\n\n    ['for', 'port', 'proto'].forEach(function(header) {\n      req.headers['x-forwarded-' + header] =\n        (req.headers['x-forwarded-' + header] || '') +\n        (req.headers['x-forwarded-' + header] ? ',' : '') +\n        values[header];\n    });\n\n    req.headers['x-forwarded-host'] = req.headers['x-forwarded-host'] || req.headers['host'] || '';\n  },\n\n  /**\n   * Does the actual proxying. If `forward` is enabled fires up\n   * a ForwardStream, same happens for ProxyStream. The request\n   * just dies otherwise.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {Object} Options Config object passed to the proxy\n   *\n   * @api private\n   */\n\n  stream: function stream(req, res, options, _, server, clb) {\n\n    // And we begin!\n    server.emit('start', req, res, options.target || options.forward);\n\n    var agents = options.followRedirects ? followRedirects : nativeAgents;\n    var http = agents.http;\n    var https = agents.https;\n\n    if(options.forward) {\n      // If forward enable, so just pipe the request\n      var forwardReq = (options.forward.protocol === 'https:' ? https : http).request(\n        common.setupOutgoing(options.ssl || {}, options, req, 'forward')\n      );\n\n      // error handler (e.g. ECONNRESET, ECONNREFUSED)\n      // Handle errors on incoming request as well as it makes sense to\n      var forwardError = createErrorHandler(forwardReq, options.forward);\n      req.on('error', forwardError);\n      forwardReq.on('error', forwardError);\n\n      (options.buffer || req).pipe(forwardReq);\n      if(!options.target) { return res.end(); }\n    }\n\n    // Request initalization\n    var proxyReq = (options.target.protocol === 'https:' ? https : http).request(\n      common.setupOutgoing(options.ssl || {}, options, req)\n    );\n\n    // Enable developers to modify the proxyReq before headers are sent\n    proxyReq.on('socket', function(socket) {\n      if(server && !proxyReq.getHeader('expect')) {\n        server.emit('proxyReq', proxyReq, req, res, options);\n      }\n    });\n\n    // allow outgoing socket to timeout so that we could\n    // show an error page at the initial request\n    if(options.proxyTimeout) {\n      proxyReq.setTimeout(options.proxyTimeout, function() {\n         proxyReq.abort();\n      });\n    }\n\n    // Ensure we abort proxy if request is aborted\n    req.on('aborted', function () {\n      proxyReq.abort();\n    });\n\n    // handle errors in proxy and incoming request, just like for forward proxy\n    var proxyError = createErrorHandler(proxyReq, options.target);\n    req.on('error', proxyError);\n    proxyReq.on('error', proxyError);\n\n    function createErrorHandler(proxyReq, url) {\n      return function proxyError(err) {\n        if (req.socket.destroyed && err.code === 'ECONNRESET') {\n          server.emit('econnreset', err, req, res, url);\n          return proxyReq.abort();\n        }\n\n        if (clb) {\n          clb(err, req, res, url);\n        } else {\n          server.emit('error', err, req, res, url);\n        }\n      }\n    }\n\n    (options.buffer || req).pipe(proxyReq);\n\n    proxyReq.on('response', function(proxyRes) {\n      if(server) { server.emit('proxyRes', proxyRes, req, res); }\n\n      if(!res.headersSent && !options.selfHandleResponse) {\n        for(var i=0; i < web_o.length; i++) {\n          if(web_o[i](req, res, proxyRes, options)) { break; }\n        }\n      }\n\n      if (!res.finished) {\n        // Allow us to listen when the proxy has completed\n        proxyRes.on('end', function () {\n          if (server) server.emit('end', req, res, proxyRes);\n        });\n        // We pipe to the response unless its expected to be handled by the user\n        if (!options.selfHandleResponse) proxyRes.pipe(res);\n      } else {\n        if (server) server.emit('end', req, res, proxyRes);\n      }\n    });\n  }\n\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/lib/http-proxy/passes/web-outgoing.js",
    "content": "var url    = require('url'),\n    common = require('../common');\n\n\nvar redirectRegex = /^201|30(1|2|7|8)$/;\n\n/*!\n * Array of passes.\n *\n * A `pass` is just a function that is executed on `req, res, options`\n * so that you can easily add new checks while still keeping the base\n * flexible.\n */\n\nmodule.exports = { // <--\n\n  /**\n   * If is a HTTP 1.0 request, remove chunk headers\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {proxyResponse} Res Response object from the proxy request\n   *\n   * @api private\n   */\n  removeChunked: function removeChunked(req, res, proxyRes) {\n    if (req.httpVersion === '1.0') {\n      delete proxyRes.headers['transfer-encoding'];\n    }\n  },\n\n  /**\n   * If is a HTTP 1.0 request, set the correct connection header\n   * or if connection header not present, then use `keep-alive`\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {proxyResponse} Res Response object from the proxy request\n   *\n   * @api private\n   */\n  setConnection: function setConnection(req, res, proxyRes) {\n    if (req.httpVersion === '1.0') {\n      proxyRes.headers.connection = req.headers.connection || 'close';\n    } else if (req.httpVersion !== '2.0' && !proxyRes.headers.connection) {\n      proxyRes.headers.connection = req.headers.connection || 'keep-alive';\n    }\n  },\n\n  setRedirectHostRewrite: function setRedirectHostRewrite(req, res, proxyRes, options) {\n    if ((options.hostRewrite || options.autoRewrite || options.protocolRewrite)\n        && proxyRes.headers['location']\n        && redirectRegex.test(proxyRes.statusCode)) {\n      var target = url.parse(options.target);\n      var u = url.parse(proxyRes.headers['location']);\n\n      // make sure the redirected host matches the target host before rewriting\n      if (target.host != u.host) {\n        return;\n      }\n\n      if (options.hostRewrite) {\n        u.host = options.hostRewrite;\n      } else if (options.autoRewrite) {\n        u.host = req.headers['host'];\n      }\n      if (options.protocolRewrite) {\n        u.protocol = options.protocolRewrite;\n      }\n\n      proxyRes.headers['location'] = u.format();\n    }\n  },\n  /**\n   * Copy headers from proxyResponse to response\n   * set each header in response object.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {proxyResponse} Res Response object from the proxy request\n   * @param {Object} Options options.cookieDomainRewrite: Config to rewrite cookie domain\n   *\n   * @api private\n   */\n  writeHeaders: function writeHeaders(req, res, proxyRes, options) {\n    var rewriteCookieDomainConfig = options.cookieDomainRewrite,\n        rewriteCookiePathConfig = options.cookiePathRewrite,\n        preserveHeaderKeyCase = options.preserveHeaderKeyCase,\n        rawHeaderKeyMap,\n        setHeader = function(key, header) {\n          if (header == undefined) return;\n          if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {\n            header = common.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain');\n          }\n          if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {\n            header = common.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path');\n          }\n          res.setHeader(String(key).trim(), header);\n        };\n\n    if (typeof rewriteCookieDomainConfig === 'string') { //also test for ''\n      rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig };\n    }\n\n    if (typeof rewriteCookiePathConfig === 'string') { //also test for ''\n      rewriteCookiePathConfig = { '*': rewriteCookiePathConfig };\n    }\n\n    // message.rawHeaders is added in: v0.11.6\n    // https://nodejs.org/api/http.html#http_message_rawheaders\n    if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) {\n      rawHeaderKeyMap = {};\n      for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) {\n        var key = proxyRes.rawHeaders[i];\n        rawHeaderKeyMap[key.toLowerCase()] = key;\n      }\n    }\n\n    Object.keys(proxyRes.headers).forEach(function(key) {\n      var header = proxyRes.headers[key];\n      if (preserveHeaderKeyCase && rawHeaderKeyMap) {\n        key = rawHeaderKeyMap[key] || key;\n      }\n      setHeader(key, header);\n    });\n  },\n\n  /**\n   * Set the statusCode from the proxyResponse\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {IncomingMessage} Res Response object\n   * @param {proxyResponse} Res Response object from the proxy request\n   *\n   * @api private\n   */\n  writeStatusCode: function writeStatusCode(req, res, proxyRes) {\n    // From Node.js docs: response.writeHead(statusCode[, statusMessage][, headers])\n    if(proxyRes.statusMessage) {\n      res.statusCode = proxyRes.statusCode;\n      res.statusMessage = proxyRes.statusMessage;\n    } else {\n      res.statusCode = proxyRes.statusCode;\n    }\n  }\n\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/lib/http-proxy/passes/ws-incoming.js",
    "content": "var http   = require('http'),\n    https  = require('https'),\n    common = require('../common');\n\n/*!\n * Array of passes.\n *\n * A `pass` is just a function that is executed on `req, socket, options`\n * so that you can easily add new checks while still keeping the base\n * flexible.\n */\n\n/*\n * Websockets Passes\n *\n */\n\n\nmodule.exports = {\n  /**\n   * WebSocket requests must have the `GET` method and\n   * the `upgrade:websocket` header\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {Socket} Websocket\n   *\n   * @api private\n   */\n\n  checkMethodAndHeader : function checkMethodAndHeader(req, socket) {\n    if (req.method !== 'GET' || !req.headers.upgrade) {\n      socket.destroy();\n      return true;\n    }\n\n    if (req.headers.upgrade.toLowerCase() !== 'websocket') {\n      socket.destroy();\n      return true;\n    }\n  },\n\n  /**\n   * Sets `x-forwarded-*` headers if specified in config.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {Socket} Websocket\n   * @param {Object} Options Config object passed to the proxy\n   *\n   * @api private\n   */\n\n  XHeaders : function XHeaders(req, socket, options) {\n    if(!options.xfwd) return;\n\n    var values = {\n      for  : req.connection.remoteAddress || req.socket.remoteAddress,\n      port : common.getPort(req),\n      proto: common.hasEncryptedConnection(req) ? 'wss' : 'ws'\n    };\n\n    ['for', 'port', 'proto'].forEach(function(header) {\n      req.headers['x-forwarded-' + header] =\n        (req.headers['x-forwarded-' + header] || '') +\n        (req.headers['x-forwarded-' + header] ? ',' : '') +\n        values[header];\n    });\n  },\n\n  /**\n   * Does the actual proxying. Make the request and upgrade it\n   * send the Switching Protocols request and pipe the sockets.\n   *\n   * @param {ClientRequest} Req Request object\n   * @param {Socket} Websocket\n   * @param {Object} Options Config object passed to the proxy\n   *\n   * @api private\n   */\n  stream : function stream(req, socket, options, head, server, clb) {\n\n    var createHttpHeader = function(line, headers) {\n      return Object.keys(headers).reduce(function (head, key) {\n        var value = headers[key];\n\n        if (!Array.isArray(value)) {\n          head.push(key + ': ' + value);\n          return head;\n        }\n\n        for (var i = 0; i < value.length; i++) {\n          head.push(key + ': ' + value[i]);\n        }\n        return head;\n      }, [line])\n      .join('\\r\\n') + '\\r\\n\\r\\n';\n    }\n\n    common.setupSocket(socket);\n\n    if (head && head.length) socket.unshift(head);\n\n\n    var proxyReq = (common.isSSL.test(options.target.protocol) ? https : http).request(\n      common.setupOutgoing(options.ssl || {}, options, req)\n    );\n\n    // Enable developers to modify the proxyReq before headers are sent\n    if (server) { server.emit('proxyReqWs', proxyReq, req, socket, options, head); }\n\n    // Error Handler\n    proxyReq.on('error', onOutgoingError);\n    proxyReq.on('response', function (res) {\n      // if upgrade event isn't going to happen, close the socket\n      if (!res.upgrade) {\n        socket.write(createHttpHeader('HTTP/' + res.httpVersion + ' ' + res.statusCode + ' ' + res.statusMessage, res.headers));\n        res.pipe(socket);\n      }\n    });\n\n    proxyReq.on('upgrade', function(proxyRes, proxySocket, proxyHead) {\n      proxySocket.on('error', onOutgoingError);\n\n      // Allow us to listen when the websocket has completed\n      proxySocket.on('end', function () {\n        server.emit('close', proxyRes, proxySocket, proxyHead);\n      });\n\n      // The pipe below will end proxySocket if socket closes cleanly, but not\n      // if it errors (eg, vanishes from the net and starts returning\n      // EHOSTUNREACH). We need to do that explicitly.\n      socket.on('error', function () {\n        proxySocket.end();\n      });\n\n      common.setupSocket(proxySocket);\n\n      if (proxyHead && proxyHead.length) proxySocket.unshift(proxyHead);\n\n      //\n      // Remark: Handle writing the headers to the socket when switching protocols\n      // Also handles when a header is an array\n      //\n      socket.write(createHttpHeader('HTTP/1.1 101 Switching Protocols', proxyRes.headers));\n\n      proxySocket.pipe(socket).pipe(proxySocket);\n\n      server.emit('open', proxySocket);\n      server.emit('proxySocket', proxySocket);  //DEPRECATED.\n    });\n\n    return proxyReq.end(); // XXX: CHECK IF THIS IS THIS CORRECT\n\n    function onOutgoingError(err) {\n      if (clb) {\n        clb(err, req, socket);\n      } else {\n        server.emit('error', err, req, socket);\n      }\n      socket.end();\n    }\n  }\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/lib/http-proxy.js",
    "content": " // Use explicit /index.js to help browserify negociation in require '/lib/http-proxy' (!)\nvar ProxyServer = require('./http-proxy/index.js').Server;\n\n\n/**\n * Creates the proxy server.\n *\n * Examples:\n *\n *    httpProxy.createProxyServer({ .. }, 8000)\n *    // => '{ web: [Function], ws: [Function] ... }'\n *\n * @param {Object} Options Config object passed to the proxy\n *\n * @return {Object} Proxy Proxy object with handlers for `ws` and `web` requests\n *\n * @api public\n */\n\n\nfunction createProxyServer(options) {\n  /*\n   *  `options` is needed and it must have the following layout:\n   *\n   *  {\n   *    target : <url string to be parsed with the url module>\n   *    forward: <url string to be parsed with the url module>\n   *    agent  : <object to be passed to http(s).request>\n   *    ssl    : <object to be passed to https.createServer()>\n   *    ws     : <true/false, if you want to proxy websockets>\n   *    xfwd   : <true/false, adds x-forward headers>\n   *    secure : <true/false, verify SSL certificate>\n   *    toProxy: <true/false, explicitly specify if we are proxying to another proxy>\n   *    prependPath: <true/false, Default: true - specify whether you want to prepend the target's path to the proxy path>\n   *    ignorePath: <true/false, Default: false - specify whether you want to ignore the proxy path of the incoming request>\n   *    localAddress : <Local interface string to bind for outgoing connections>\n   *    changeOrigin: <true/false, Default: false - changes the origin of the host header to the target URL>\n   *    preserveHeaderKeyCase: <true/false, Default: false - specify whether you want to keep letter case of response header key >\n   *    auth   : Basic authentication i.e. 'user:password' to compute an Authorization header.\n   *    hostRewrite: rewrites the location hostname on (201/301/302/307/308) redirects, Default: null.\n   *    autoRewrite: rewrites the location host/port on (201/301/302/307/308) redirects based on requested host/port. Default: false.\n   *    protocolRewrite: rewrites the location protocol on (201/301/302/307/308) redirects to 'http' or 'https'. Default: null.\n   *  }\n   *\n   *  NOTE: `options.ws` and `options.ssl` are optional.\n   *    `options.target and `options.forward` cannot be\n   *    both missing\n   *  }\n   */\n\n  return new ProxyServer(options);\n}\n\n\nProxyServer.createProxyServer = createProxyServer;\nProxyServer.createServer      = createProxyServer;\nProxyServer.createProxy       = createProxyServer;\n\n\n\n\n/**\n * Export the proxy \"Server\" as the main export.\n */\nmodule.exports = ProxyServer;\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/package.json",
    "content": "{\n  \"name\": \"http-proxy\",\n  \"version\": \"1.18.1\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/http-party/node-http-proxy.git\"\n  },\n  \"description\": \"HTTP proxying for the masses\",\n  \"author\": \"Charlie Robbins <charlie.robbins@gmail.com>\",\n  \"maintainers\": [\n    \"jcrugzz <jcrugzz@gmail.com>\"\n  ],\n  \"main\": \"index.js\",\n  \"dependencies\": {\n    \"eventemitter3\": \"^4.0.0\",\n    \"requires-port\": \"^1.0.0\",\n    \"follow-redirects\": \"^1.0.0\"\n  },\n  \"devDependencies\": {\n    \"async\": \"^3.0.0\",\n    \"auto-changelog\": \"^1.15.0\",\n    \"concat-stream\": \"^2.0.0\",\n    \"expect.js\": \"~0.3.1\",\n    \"mocha\": \"^3.5.3\",\n    \"nyc\": \"^14.0.0\",\n    \"semver\": \"^5.0.3\",\n    \"socket.io\": \"^2.1.0\",\n    \"socket.io-client\": \"^2.1.0\",\n    \"sse\": \"0.0.8\",\n    \"ws\": \"^3.0.0\"\n  },\n  \"scripts\": {\n    \"mocha\": \"mocha test/*-test.js\",\n    \"test\": \"nyc --reporter=text --reporter=lcov npm run mocha\",\n    \"version\": \"auto-changelog -p && git add CHANGELOG.md\"\n  },\n  \"engines\": {\n    \"node\": \">=8.0.0\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/http-proxy/renovate.json",
    "content": "{\n  \"platform\": \"github\",\n  \"autodiscover\": false,\n  \"requireConfig\": true,\n  \"ignoreNpmrcFile\": true,\n  \"rangeStrategy\": \"replace\",\n  \"packageRules\": [\n    {\n      \"packagePatterns\": [\n        \"*\"\n      ],\n      \"minor\": {\n        \"groupName\": \"all non-major dependencies\",\n        \"groupSlug\": \"all-minor-patch\"\n      }\n    }\n  ],\n  \"commitMessagePrefix\": \"[dist]\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/.github/dependabot.yml",
    "content": "# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"npm\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    allow:\n      - dependency-type: production\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/Changelog.md",
    "content": "## 0.6.3 / 2021-05-23\n  * Fix HKSCS encoding to prefer Big5 codes if both Big5 and HKSCS codes are possible (#264)\n\n\n## 0.6.2 / 2020-07-08\n  * Support Uint8Array-s decoding without conversion to Buffers, plus fix an edge case.\n\n\n## 0.6.1 / 2020-06-28\n  * Support Uint8Array-s directly when decoding (#246, by @gyzerok)\n  * Unify package.json version ranges to be strictly semver-compatible (#241)\n  * Fix minor issue in UTF-32 decoder's endianness detection code.\n\n\n## 0.6.0 / 2020-06-08\n  * Updated 'gb18030' encoding to :2005 edition (see https://github.com/whatwg/encoding/issues/22).\n  * Removed `iconv.extendNodeEncodings()` mechanism. It was deprecated 5 years ago and didn't work \n    in recent Node versions.\n  * Reworked Streaming API behavior in browser environments to fix #204. Streaming API will be \n    excluded by default in browser packs, saving ~100Kb bundle size, unless enabled explicitly using \n    `iconv.enableStreamingAPI(require('stream'))`.\n  * Updates to development environment & tests:\n    * Added ./test/webpack private package to test complex new use cases that need custom environment. \n      It's tested as a separate job in Travis CI.\n    * Updated generation code for the new EUC-KR index file format from Encoding Standard.\n    * Removed Buffer() constructor in tests (#197 by @gabrielschulhof).\n\n\n## 0.5.2 / 2020-06-08\n  * Added `iconv.getEncoder()` and `iconv.getDecoder()` methods to typescript definitions (#229).\n  * Fixed semver version to 6.1.2 to support Node 8.x (by @tanandara).\n  * Capped iconv version to 2.x as 3.x has dropped support for older Node versions.\n  * Switched from instanbul to c8 for code coverage.\n\n\n## 0.5.1 / 2020-01-18\n\n  * Added cp720 encoding (#221, by @kr-deps)\n  * (minor) Changed Changelog.md formatting to use h2. \n\n\n## 0.5.0 / 2019-06-26\n\n  * Added UTF-32 encoding, both little-endian and big-endian variants (UTF-32LE, UTF32-BE). If endianness\n    is not provided for decoding, it's deduced automatically from the stream using a heuristic similar to\n    what we use in UTF-16. (great work in #216 by @kshetline)\n  * Several minor updates to README (#217 by @oldj, plus some more)\n  * Added Node versions 10 and 12 to Travis test harness.\n\n\n## 0.4.24 / 2018-08-22\n\n  * Added MIK encoding (#196, by @Ivan-Kalatchev)\n\n\n## 0.4.23 / 2018-05-07\n\n  * Fix deprecation warning in Node v10 due to the last usage of `new Buffer` (#185, by @felixbuenemann)\n  * Switched from NodeBuffer to Buffer in typings (#155 by @felixfbecker, #186 by @larssn)\n\n\n## 0.4.22 / 2018-05-05\n\n  * Use older semver style for dependencies to be compatible with Node version 0.10 (#182, by @dougwilson)\n  * Fix tests to accomodate fixes in Node v10 (#182, by @dougwilson)\n\n\n## 0.4.21 / 2018-04-06\n\n  * Fix encoding canonicalization (#156)\n  * Fix the paths in the \"browser\" field in package.json (#174 by @LMLB)\n  * Removed \"contributors\" section in package.json - see Git history instead.\n\n\n## 0.4.20 / 2018-04-06\n\n  * Updated `new Buffer()` usages with recommended replacements as it's being deprecated in Node v10 (#176, #178 by @ChALkeR)\n\n\n## 0.4.19 / 2017-09-09\n\n  * Fixed iso8859-1 codec regression in handling untranslatable characters (#162, caused by #147)\n  * Re-generated windows1255 codec, because it was updated in iconv project\n  * Fixed grammar in error message when iconv-lite is loaded with encoding other than utf8\n\n\n## 0.4.18 / 2017-06-13\n\n  * Fixed CESU-8 regression in Node v8.\n\n\n## 0.4.17 / 2017-04-22\n\n * Updated typescript definition file to support Angular 2 AoT mode (#153 by @larssn)\n\n\n## 0.4.16 / 2017-04-22\n\n * Added support for React Native (#150)\n * Changed iso8859-1 encoding to usine internal 'binary' encoding, as it's the same thing (#147 by @mscdex)\n * Fixed typo in Readme (#138 by @jiangzhuo)\n * Fixed build for Node v6.10+ by making correct version comparison\n * Added a warning if iconv-lite is loaded not as utf-8 (see #142)\n\n\n## 0.4.15 / 2016-11-21\n\n * Fixed typescript type definition (#137)\n\n\n## 0.4.14 / 2016-11-20\n\n * Preparation for v1.0\n * Added Node v6 and latest Node versions to Travis CI test rig\n * Deprecated Node v0.8 support\n * Typescript typings (@larssn)\n * Fix encoding of Euro character in GB 18030 (inspired by @lygstate)\n * Add ms prefix to dbcs windows encodings (@rokoroku)\n\n\n## 0.4.13 / 2015-10-01\n\n * Fix silly mistake in deprecation notice.\n\n\n## 0.4.12 / 2015-09-26\n\n * Node v4 support:\n   * Added CESU-8 decoding (#106)\n   * Added deprecation notice for `extendNodeEncodings`\n   * Added Travis tests for Node v4 and io.js latest (#105 by @Mithgol)\n\n\n## 0.4.11 / 2015-07-03\n\n * Added CESU-8 encoding.\n\n\n## 0.4.10 / 2015-05-26\n\n * Changed UTF-16 endianness heuristic to take into account any ASCII chars, not\n   just spaces. This should minimize the importance of \"default\" endianness.\n\n\n## 0.4.9 / 2015-05-24\n\n * Streamlined BOM handling: strip BOM by default, add BOM when encoding if \n   addBOM: true. Added docs to Readme.\n * UTF16 now uses UTF16-LE by default.\n * Fixed minor issue with big5 encoding.\n * Added io.js testing on Travis; updated node-iconv version to test against.\n   Now we just skip testing SBCS encodings that node-iconv doesn't support.\n * (internal refactoring) Updated codec interface to use classes.\n * Use strict mode in all files.\n\n\n## 0.4.8 / 2015-04-14\n \n * added alias UNICODE-1-1-UTF-7 for UTF-7 encoding (#94)\n\n\n## 0.4.7 / 2015-02-05\n\n * stop official support of Node.js v0.8. Should still work, but no guarantees.\n   reason: Packages needed for testing are hard to get on Travis CI.\n * work in environment where Object.prototype is monkey patched with enumerable \n   props (#89).\n\n\n## 0.4.6 / 2015-01-12\n \n * fix rare aliases of single-byte encodings (thanks @mscdex)\n * double the timeout for dbcs tests to make them less flaky on travis\n\n\n## 0.4.5 / 2014-11-20\n\n * fix windows-31j and x-sjis encoding support (@nleush)\n * minor fix: undefined variable reference when internal error happens\n\n\n## 0.4.4 / 2014-07-16\n\n * added encodings UTF-7 (RFC2152) and UTF-7-IMAP (RFC3501 Section 5.1.3)\n * fixed streaming base64 encoding\n\n\n## 0.4.3 / 2014-06-14\n\n * added encodings UTF-16BE and UTF-16 with BOM\n\n\n## 0.4.2 / 2014-06-12\n\n * don't throw exception if `extendNodeEncodings()` is called more than once\n\n\n## 0.4.1 / 2014-06-11\n\n * codepage 808 added\n\n\n## 0.4.0 / 2014-06-10\n\n * code is rewritten from scratch\n * all widespread encodings are supported\n * streaming interface added\n * browserify compatibility added\n * (optional) extend core primitive encodings to make usage even simpler\n * moved from vows to mocha as the testing framework\n\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/LICENSE",
    "content": "Copyright (c) 2011 Alexander Shtuchkin\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/README.md",
    "content": "## iconv-lite: Pure JS character encoding conversion\n\n * No need for native code compilation. Quick to install, works on Windows and in sandboxed environments like [Cloud9](http://c9.io).\n * Used in popular projects like [Express.js (body_parser)](https://github.com/expressjs/body-parser), \n   [Grunt](http://gruntjs.com/), [Nodemailer](http://www.nodemailer.com/), [Yeoman](http://yeoman.io/) and others.\n * Faster than [node-iconv](https://github.com/bnoordhuis/node-iconv) (see below for performance comparison).\n * Intuitive encode/decode API, including Streaming support.\n * In-browser usage via [browserify](https://github.com/substack/node-browserify) or [webpack](https://webpack.js.org/) (~180kb gzip compressed with Buffer shim included).\n * Typescript [type definition file](https://github.com/ashtuchkin/iconv-lite/blob/master/lib/index.d.ts) included.\n * React Native is supported (need to install `stream` module to enable Streaming API).\n * License: MIT.\n\n[![NPM Stats](https://nodei.co/npm/iconv-lite.png)](https://npmjs.org/package/iconv-lite/)  \n[![Build Status](https://travis-ci.org/ashtuchkin/iconv-lite.svg?branch=master)](https://travis-ci.org/ashtuchkin/iconv-lite)\n[![npm](https://img.shields.io/npm/v/iconv-lite.svg)](https://npmjs.org/package/iconv-lite/)\n[![npm downloads](https://img.shields.io/npm/dm/iconv-lite.svg)](https://npmjs.org/package/iconv-lite/)\n[![npm bundle size](https://img.shields.io/bundlephobia/min/iconv-lite.svg)](https://npmjs.org/package/iconv-lite/)\n\n## Usage\n### Basic API\n```javascript\nvar iconv = require('iconv-lite');\n\n// Convert from an encoded buffer to a js string.\nstr = iconv.decode(Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251');\n\n// Convert from a js string to an encoded buffer.\nbuf = iconv.encode(\"Sample input string\", 'win1251');\n\n// Check if encoding is supported\niconv.encodingExists(\"us-ascii\")\n```\n\n### Streaming API\n```javascript\n\n// Decode stream (from binary data stream to js strings)\nhttp.createServer(function(req, res) {\n    var converterStream = iconv.decodeStream('win1251');\n    req.pipe(converterStream);\n\n    converterStream.on('data', function(str) {\n        console.log(str); // Do something with decoded strings, chunk-by-chunk.\n    });\n});\n\n// Convert encoding streaming example\nfs.createReadStream('file-in-win1251.txt')\n    .pipe(iconv.decodeStream('win1251'))\n    .pipe(iconv.encodeStream('ucs2'))\n    .pipe(fs.createWriteStream('file-in-ucs2.txt'));\n\n// Sugar: all encode/decode streams have .collect(cb) method to accumulate data.\nhttp.createServer(function(req, res) {\n    req.pipe(iconv.decodeStream('win1251')).collect(function(err, body) {\n        assert(typeof body == 'string');\n        console.log(body); // full request body string\n    });\n});\n```\n\n## Supported encodings\n\n *  All node.js native encodings: utf8, ucs2 / utf16-le, ascii, binary, base64, hex.\n *  Additional unicode encodings: utf16, utf16-be, utf-7, utf-7-imap, utf32, utf32-le, and utf32-be.\n *  All widespread singlebyte encodings: Windows 125x family, ISO-8859 family, \n    IBM/DOS codepages, Macintosh family, KOI8 family, all others supported by iconv library. \n    Aliases like 'latin1', 'us-ascii' also supported.\n *  All widespread multibyte encodings: CP932, CP936, CP949, CP950, GB2312, GBK, GB18030, Big5, Shift_JIS, EUC-JP.\n\nSee [all supported encodings on wiki](https://github.com/ashtuchkin/iconv-lite/wiki/Supported-Encodings).\n\nMost singlebyte encodings are generated automatically from [node-iconv](https://github.com/bnoordhuis/node-iconv). Thank you Ben Noordhuis and libiconv authors!\n\nMultibyte encodings are generated from [Unicode.org mappings](http://www.unicode.org/Public/MAPPINGS/) and [WHATWG Encoding Standard mappings](http://encoding.spec.whatwg.org/). Thank you, respective authors!\n\n\n## Encoding/decoding speed\n\nComparison with node-iconv module (1000x256kb, on MacBook Pro, Core i5/2.6 GHz, Node v0.12.0). \nNote: your results may vary, so please always check on your hardware.\n\n    operation             iconv@2.1.4   iconv-lite@0.4.7\n    ----------------------------------------------------------\n    encode('win1251')     ~96 Mb/s      ~320 Mb/s\n    decode('win1251')     ~95 Mb/s      ~246 Mb/s\n\n## BOM handling\n\n * Decoding: BOM is stripped by default, unless overridden by passing `stripBOM: false` in options\n   (f.ex. `iconv.decode(buf, enc, {stripBOM: false})`).\n   A callback might also be given as a `stripBOM` parameter - it'll be called if BOM character was actually found.\n * If you want to detect UTF-8 BOM when decoding other encodings, use [node-autodetect-decoder-stream](https://github.com/danielgindi/node-autodetect-decoder-stream) module.\n * Encoding: No BOM added, unless overridden by `addBOM: true` option.\n\n## UTF-16 Encodings\n\nThis library supports UTF-16LE, UTF-16BE and UTF-16 encodings. First two are straightforward, but UTF-16 is trying to be\nsmart about endianness in the following ways:\n * Decoding: uses BOM and 'spaces heuristic' to determine input endianness. Default is UTF-16LE, but can be \n   overridden with `defaultEncoding: 'utf-16be'` option. Strips BOM unless `stripBOM: false`.\n * Encoding: uses UTF-16LE and writes BOM by default. Use `addBOM: false` to override.\n\n## UTF-32 Encodings\n\nThis library supports UTF-32LE, UTF-32BE and UTF-32 encodings. Like the UTF-16 encoding above, UTF-32 defaults to UTF-32LE, but uses BOM and 'spaces heuristics' to determine input endianness. \n * The default of UTF-32LE can be overridden with the `defaultEncoding: 'utf-32be'` option. Strips BOM unless `stripBOM: false`.\n * Encoding: uses UTF-32LE and writes BOM by default. Use `addBOM: false` to override. (`defaultEncoding: 'utf-32be'` can also be used here to change encoding.)\n\n## Other notes\n\nWhen decoding, be sure to supply a Buffer to decode() method, otherwise [bad things usually happen](https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding).  \nUntranslatable characters are set to � or ?. No transliteration is currently supported.  \nNode versions 0.10.31 and 0.11.13 are buggy, don't use them (see #65, #77).  \n\n## Testing\n\n```bash\n$ git clone git@github.com:ashtuchkin/iconv-lite.git\n$ cd iconv-lite\n$ npm install\n$ npm test\n    \n$ # To view performance:\n$ node test/performance.js\n\n$ # To view test coverage:\n$ npm run coverage\n$ open coverage/lcov-report/index.html\n```\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/dbcs-codec.js",
    "content": "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.\n// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.\n// To save memory and loading time, we read table files only when requested.\n\nexports._dbcs = DBCSCodec;\n\nvar UNASSIGNED = -1,\n    GB18030_CODE = -2,\n    SEQ_START  = -10,\n    NODE_START = -1000,\n    UNASSIGNED_NODE = new Array(0x100),\n    DEF_CHAR = -1;\n\nfor (var i = 0; i < 0x100; i++)\n    UNASSIGNED_NODE[i] = UNASSIGNED;\n\n\n// Class DBCSCodec reads and initializes mapping tables.\nfunction DBCSCodec(codecOptions, iconv) {\n    this.encodingName = codecOptions.encodingName;\n    if (!codecOptions)\n        throw new Error(\"DBCS codec is called without the data.\")\n    if (!codecOptions.table)\n        throw new Error(\"Encoding '\" + this.encodingName + \"' has no data.\");\n\n    // Load tables.\n    var mappingTable = codecOptions.table();\n\n\n    // Decode tables: MBCS -> Unicode.\n\n    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.\n    // Trie root is decodeTables[0].\n    // Values: >=  0 -> unicode character code. can be > 0xFFFF\n    //         == UNASSIGNED -> unknown/unassigned sequence.\n    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.\n    //         <= NODE_START -> index of the next node in our trie to process next byte.\n    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.\n    this.decodeTables = [];\n    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.\n\n    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. \n    this.decodeTableSeq = [];\n\n    // Actual mapping tables consist of chunks. Use them to fill up decode tables.\n    for (var i = 0; i < mappingTable.length; i++)\n        this._addDecodeChunk(mappingTable[i]);\n\n    // Load & create GB18030 tables when needed.\n    if (typeof codecOptions.gb18030 === 'function') {\n        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.\n\n        // Add GB18030 common decode nodes.\n        var commonThirdByteNodeIdx = this.decodeTables.length;\n        this.decodeTables.push(UNASSIGNED_NODE.slice(0));\n\n        var commonFourthByteNodeIdx = this.decodeTables.length;\n        this.decodeTables.push(UNASSIGNED_NODE.slice(0));\n\n        // Fill out the tree\n        var firstByteNode = this.decodeTables[0];\n        for (var i = 0x81; i <= 0xFE; i++) {\n            var secondByteNode = this.decodeTables[NODE_START - firstByteNode[i]];\n            for (var j = 0x30; j <= 0x39; j++) {\n                if (secondByteNode[j] === UNASSIGNED) {\n                    secondByteNode[j] = NODE_START - commonThirdByteNodeIdx;\n                } else if (secondByteNode[j] > NODE_START) {\n                    throw new Error(\"gb18030 decode tables conflict at byte 2\");\n                }\n\n                var thirdByteNode = this.decodeTables[NODE_START - secondByteNode[j]];\n                for (var k = 0x81; k <= 0xFE; k++) {\n                    if (thirdByteNode[k] === UNASSIGNED) {\n                        thirdByteNode[k] = NODE_START - commonFourthByteNodeIdx;\n                    } else if (thirdByteNode[k] === NODE_START - commonFourthByteNodeIdx) {\n                        continue;\n                    } else if (thirdByteNode[k] > NODE_START) {\n                        throw new Error(\"gb18030 decode tables conflict at byte 3\");\n                    }\n\n                    var fourthByteNode = this.decodeTables[NODE_START - thirdByteNode[k]];\n                    for (var l = 0x30; l <= 0x39; l++) {\n                        if (fourthByteNode[l] === UNASSIGNED)\n                            fourthByteNode[l] = GB18030_CODE;\n                    }\n                }\n            }\n        }\n    }\n\n    this.defaultCharUnicode = iconv.defaultCharUnicode;\n\n    \n    // Encode tables: Unicode -> DBCS.\n\n    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.\n    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.\n    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).\n    //         == UNASSIGNED -> no conversion found. Output a default char.\n    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.\n    this.encodeTable = [];\n    \n    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of\n    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key\n    // means end of sequence (needed when one sequence is a strict subsequence of another).\n    // Objects are kept separately from encodeTable to increase performance.\n    this.encodeTableSeq = [];\n\n    // Some chars can be decoded, but need not be encoded.\n    var skipEncodeChars = {};\n    if (codecOptions.encodeSkipVals)\n        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {\n            var val = codecOptions.encodeSkipVals[i];\n            if (typeof val === 'number')\n                skipEncodeChars[val] = true;\n            else\n                for (var j = val.from; j <= val.to; j++)\n                    skipEncodeChars[j] = true;\n        }\n        \n    // Use decode trie to recursively fill out encode tables.\n    this._fillEncodeTable(0, 0, skipEncodeChars);\n\n    // Add more encoding pairs when needed.\n    if (codecOptions.encodeAdd) {\n        for (var uChar in codecOptions.encodeAdd)\n            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))\n                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);\n    }\n\n    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];\n    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];\n    if (this.defCharSB === UNASSIGNED) this.defCharSB = \"?\".charCodeAt(0);\n}\n\nDBCSCodec.prototype.encoder = DBCSEncoder;\nDBCSCodec.prototype.decoder = DBCSDecoder;\n\n// Decoder helpers\nDBCSCodec.prototype._getDecodeTrieNode = function(addr) {\n    var bytes = [];\n    for (; addr > 0; addr >>>= 8)\n        bytes.push(addr & 0xFF);\n    if (bytes.length == 0)\n        bytes.push(0);\n\n    var node = this.decodeTables[0];\n    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.\n        var val = node[bytes[i]];\n\n        if (val == UNASSIGNED) { // Create new node.\n            node[bytes[i]] = NODE_START - this.decodeTables.length;\n            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));\n        }\n        else if (val <= NODE_START) { // Existing node.\n            node = this.decodeTables[NODE_START - val];\n        }\n        else\n            throw new Error(\"Overwrite byte in \" + this.encodingName + \", addr: \" + addr.toString(16));\n    }\n    return node;\n}\n\n\nDBCSCodec.prototype._addDecodeChunk = function(chunk) {\n    // First element of chunk is the hex mbcs code where we start.\n    var curAddr = parseInt(chunk[0], 16);\n\n    // Choose the decoding node where we'll write our chars.\n    var writeTable = this._getDecodeTrieNode(curAddr);\n    curAddr = curAddr & 0xFF;\n\n    // Write all other elements of the chunk to the table.\n    for (var k = 1; k < chunk.length; k++) {\n        var part = chunk[k];\n        if (typeof part === \"string\") { // String, write as-is.\n            for (var l = 0; l < part.length;) {\n                var code = part.charCodeAt(l++);\n                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate\n                    var codeTrail = part.charCodeAt(l++);\n                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)\n                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);\n                    else\n                        throw new Error(\"Incorrect surrogate pair in \"  + this.encodingName + \" at chunk \" + chunk[0]);\n                }\n                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)\n                    var len = 0xFFF - code + 2;\n                    var seq = [];\n                    for (var m = 0; m < len; m++)\n                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.\n\n                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;\n                    this.decodeTableSeq.push(seq);\n                }\n                else\n                    writeTable[curAddr++] = code; // Basic char\n            }\n        } \n        else if (typeof part === \"number\") { // Integer, meaning increasing sequence starting with prev character.\n            var charCode = writeTable[curAddr - 1] + 1;\n            for (var l = 0; l < part; l++)\n                writeTable[curAddr++] = charCode++;\n        }\n        else\n            throw new Error(\"Incorrect type '\" + typeof part + \"' given in \"  + this.encodingName + \" at chunk \" + chunk[0]);\n    }\n    if (curAddr > 0xFF)\n        throw new Error(\"Incorrect chunk in \"  + this.encodingName + \" at addr \" + chunk[0] + \": too long\" + curAddr);\n}\n\n// Encoder helpers\nDBCSCodec.prototype._getEncodeBucket = function(uCode) {\n    var high = uCode >> 8; // This could be > 0xFF because of astral characters.\n    if (this.encodeTable[high] === undefined)\n        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.\n    return this.encodeTable[high];\n}\n\nDBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {\n    var bucket = this._getEncodeBucket(uCode);\n    var low = uCode & 0xFF;\n    if (bucket[low] <= SEQ_START)\n        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.\n    else if (bucket[low] == UNASSIGNED)\n        bucket[low] = dbcsCode;\n}\n\nDBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {\n    \n    // Get the root of character tree according to first character of the sequence.\n    var uCode = seq[0];\n    var bucket = this._getEncodeBucket(uCode);\n    var low = uCode & 0xFF;\n\n    var node;\n    if (bucket[low] <= SEQ_START) {\n        // There's already a sequence with  - use it.\n        node = this.encodeTableSeq[SEQ_START-bucket[low]];\n    }\n    else {\n        // There was no sequence object - allocate a new one.\n        node = {};\n        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.\n        bucket[low] = SEQ_START - this.encodeTableSeq.length;\n        this.encodeTableSeq.push(node);\n    }\n\n    // Traverse the character tree, allocating new nodes as needed.\n    for (var j = 1; j < seq.length-1; j++) {\n        var oldVal = node[uCode];\n        if (typeof oldVal === 'object')\n            node = oldVal;\n        else {\n            node = node[uCode] = {}\n            if (oldVal !== undefined)\n                node[DEF_CHAR] = oldVal\n        }\n    }\n\n    // Set the leaf to given dbcsCode.\n    uCode = seq[seq.length-1];\n    node[uCode] = dbcsCode;\n}\n\nDBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {\n    var node = this.decodeTables[nodeIdx];\n    var hasValues = false;\n    var subNodeEmpty = {};\n    for (var i = 0; i < 0x100; i++) {\n        var uCode = node[i];\n        var mbCode = prefix + i;\n        if (skipEncodeChars[mbCode])\n            continue;\n\n        if (uCode >= 0) {\n            this._setEncodeChar(uCode, mbCode);\n            hasValues = true;\n        } else if (uCode <= NODE_START) {\n            var subNodeIdx = NODE_START - uCode;\n            if (!subNodeEmpty[subNodeIdx]) {  // Skip empty subtrees (they are too large in gb18030).\n                var newPrefix = (mbCode << 8) >>> 0;  // NOTE: '>>> 0' keeps 32-bit num positive.\n                if (this._fillEncodeTable(subNodeIdx, newPrefix, skipEncodeChars))\n                    hasValues = true;\n                else\n                    subNodeEmpty[subNodeIdx] = true;\n            }\n        } else if (uCode <= SEQ_START) {\n            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);\n            hasValues = true;\n        }\n    }\n    return hasValues;\n}\n\n\n\n// == Encoder ==================================================================\n\nfunction DBCSEncoder(options, codec) {\n    // Encoder state\n    this.leadSurrogate = -1;\n    this.seqObj = undefined;\n    \n    // Static data\n    this.encodeTable = codec.encodeTable;\n    this.encodeTableSeq = codec.encodeTableSeq;\n    this.defaultCharSingleByte = codec.defCharSB;\n    this.gb18030 = codec.gb18030;\n}\n\nDBCSEncoder.prototype.write = function(str) {\n    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),\n        leadSurrogate = this.leadSurrogate,\n        seqObj = this.seqObj, nextChar = -1,\n        i = 0, j = 0;\n\n    while (true) {\n        // 0. Get next character.\n        if (nextChar === -1) {\n            if (i == str.length) break;\n            var uCode = str.charCodeAt(i++);\n        }\n        else {\n            var uCode = nextChar;\n            nextChar = -1;    \n        }\n\n        // 1. Handle surrogates.\n        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.\n            if (uCode < 0xDC00) { // We've got lead surrogate.\n                if (leadSurrogate === -1) {\n                    leadSurrogate = uCode;\n                    continue;\n                } else {\n                    leadSurrogate = uCode;\n                    // Double lead surrogate found.\n                    uCode = UNASSIGNED;\n                }\n            } else { // We've got trail surrogate.\n                if (leadSurrogate !== -1) {\n                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);\n                    leadSurrogate = -1;\n                } else {\n                    // Incomplete surrogate pair - only trail surrogate found.\n                    uCode = UNASSIGNED;\n                }\n                \n            }\n        }\n        else if (leadSurrogate !== -1) {\n            // Incomplete surrogate pair - only lead surrogate found.\n            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.\n            leadSurrogate = -1;\n        }\n\n        // 2. Convert uCode character.\n        var dbcsCode = UNASSIGNED;\n        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence\n            var resCode = seqObj[uCode];\n            if (typeof resCode === 'object') { // Sequence continues.\n                seqObj = resCode;\n                continue;\n\n            } else if (typeof resCode == 'number') { // Sequence finished. Write it.\n                dbcsCode = resCode;\n\n            } else if (resCode == undefined) { // Current character is not part of the sequence.\n\n                // Try default character for this sequence\n                resCode = seqObj[DEF_CHAR];\n                if (resCode !== undefined) {\n                    dbcsCode = resCode; // Found. Write it.\n                    nextChar = uCode; // Current character will be written too in the next iteration.\n\n                } else {\n                    // TODO: What if we have no default? (resCode == undefined)\n                    // Then, we should write first char of the sequence as-is and try the rest recursively.\n                    // Didn't do it for now because no encoding has this situation yet.\n                    // Currently, just skip the sequence and write current char.\n                }\n            }\n            seqObj = undefined;\n        }\n        else if (uCode >= 0) {  // Regular character\n            var subtable = this.encodeTable[uCode >> 8];\n            if (subtable !== undefined)\n                dbcsCode = subtable[uCode & 0xFF];\n            \n            if (dbcsCode <= SEQ_START) { // Sequence start\n                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];\n                continue;\n            }\n\n            if (dbcsCode == UNASSIGNED && this.gb18030) {\n                // Use GB18030 algorithm to find character(s) to write.\n                var idx = findIdx(this.gb18030.uChars, uCode);\n                if (idx != -1) {\n                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);\n                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;\n                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;\n                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;\n                    newBuf[j++] = 0x30 + dbcsCode;\n                    continue;\n                }\n            }\n        }\n\n        // 3. Write dbcsCode character.\n        if (dbcsCode === UNASSIGNED)\n            dbcsCode = this.defaultCharSingleByte;\n        \n        if (dbcsCode < 0x100) {\n            newBuf[j++] = dbcsCode;\n        }\n        else if (dbcsCode < 0x10000) {\n            newBuf[j++] = dbcsCode >> 8;   // high byte\n            newBuf[j++] = dbcsCode & 0xFF; // low byte\n        }\n        else if (dbcsCode < 0x1000000) {\n            newBuf[j++] = dbcsCode >> 16;\n            newBuf[j++] = (dbcsCode >> 8) & 0xFF;\n            newBuf[j++] = dbcsCode & 0xFF;\n        } else {\n            newBuf[j++] = dbcsCode >>> 24;\n            newBuf[j++] = (dbcsCode >>> 16) & 0xFF;\n            newBuf[j++] = (dbcsCode >>> 8) & 0xFF;\n            newBuf[j++] = dbcsCode & 0xFF;\n        }\n    }\n\n    this.seqObj = seqObj;\n    this.leadSurrogate = leadSurrogate;\n    return newBuf.slice(0, j);\n}\n\nDBCSEncoder.prototype.end = function() {\n    if (this.leadSurrogate === -1 && this.seqObj === undefined)\n        return; // All clean. Most often case.\n\n    var newBuf = Buffer.alloc(10), j = 0;\n\n    if (this.seqObj) { // We're in the sequence.\n        var dbcsCode = this.seqObj[DEF_CHAR];\n        if (dbcsCode !== undefined) { // Write beginning of the sequence.\n            if (dbcsCode < 0x100) {\n                newBuf[j++] = dbcsCode;\n            }\n            else {\n                newBuf[j++] = dbcsCode >> 8;   // high byte\n                newBuf[j++] = dbcsCode & 0xFF; // low byte\n            }\n        } else {\n            // See todo above.\n        }\n        this.seqObj = undefined;\n    }\n\n    if (this.leadSurrogate !== -1) {\n        // Incomplete surrogate pair - only lead surrogate found.\n        newBuf[j++] = this.defaultCharSingleByte;\n        this.leadSurrogate = -1;\n    }\n    \n    return newBuf.slice(0, j);\n}\n\n// Export for testing\nDBCSEncoder.prototype.findIdx = findIdx;\n\n\n// == Decoder ==================================================================\n\nfunction DBCSDecoder(options, codec) {\n    // Decoder state\n    this.nodeIdx = 0;\n    this.prevBytes = [];\n\n    // Static data\n    this.decodeTables = codec.decodeTables;\n    this.decodeTableSeq = codec.decodeTableSeq;\n    this.defaultCharUnicode = codec.defaultCharUnicode;\n    this.gb18030 = codec.gb18030;\n}\n\nDBCSDecoder.prototype.write = function(buf) {\n    var newBuf = Buffer.alloc(buf.length*2),\n        nodeIdx = this.nodeIdx, \n        prevBytes = this.prevBytes, prevOffset = this.prevBytes.length,\n        seqStart = -this.prevBytes.length, // idx of the start of current parsed sequence.\n        uCode;\n\n    for (var i = 0, j = 0; i < buf.length; i++) {\n        var curByte = (i >= 0) ? buf[i] : prevBytes[i + prevOffset];\n\n        // Lookup in current trie node.\n        var uCode = this.decodeTables[nodeIdx][curByte];\n\n        if (uCode >= 0) { \n            // Normal character, just use it.\n        }\n        else if (uCode === UNASSIGNED) { // Unknown char.\n            // TODO: Callback with seq.\n            uCode = this.defaultCharUnicode.charCodeAt(0);\n            i = seqStart; // Skip one byte ('i' will be incremented by the for loop) and try to parse again.\n        }\n        else if (uCode === GB18030_CODE) {\n            if (i >= 3) {\n                var ptr = (buf[i-3]-0x81)*12600 + (buf[i-2]-0x30)*1260 + (buf[i-1]-0x81)*10 + (curByte-0x30);\n            } else {\n                var ptr = (prevBytes[i-3+prevOffset]-0x81)*12600 + \n                          (((i-2 >= 0) ? buf[i-2] : prevBytes[i-2+prevOffset])-0x30)*1260 + \n                          (((i-1 >= 0) ? buf[i-1] : prevBytes[i-1+prevOffset])-0x81)*10 + \n                          (curByte-0x30);\n            }\n            var idx = findIdx(this.gb18030.gbChars, ptr);\n            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];\n        }\n        else if (uCode <= NODE_START) { // Go to next trie node.\n            nodeIdx = NODE_START - uCode;\n            continue;\n        }\n        else if (uCode <= SEQ_START) { // Output a sequence of chars.\n            var seq = this.decodeTableSeq[SEQ_START - uCode];\n            for (var k = 0; k < seq.length - 1; k++) {\n                uCode = seq[k];\n                newBuf[j++] = uCode & 0xFF;\n                newBuf[j++] = uCode >> 8;\n            }\n            uCode = seq[seq.length-1];\n        }\n        else\n            throw new Error(\"iconv-lite internal error: invalid decoding table value \" + uCode + \" at \" + nodeIdx + \"/\" + curByte);\n\n        // Write the character to buffer, handling higher planes using surrogate pair.\n        if (uCode >= 0x10000) { \n            uCode -= 0x10000;\n            var uCodeLead = 0xD800 | (uCode >> 10);\n            newBuf[j++] = uCodeLead & 0xFF;\n            newBuf[j++] = uCodeLead >> 8;\n\n            uCode = 0xDC00 | (uCode & 0x3FF);\n        }\n        newBuf[j++] = uCode & 0xFF;\n        newBuf[j++] = uCode >> 8;\n\n        // Reset trie node.\n        nodeIdx = 0; seqStart = i+1;\n    }\n\n    this.nodeIdx = nodeIdx;\n    this.prevBytes = (seqStart >= 0)\n        ? Array.prototype.slice.call(buf, seqStart)\n        : prevBytes.slice(seqStart + prevOffset).concat(Array.prototype.slice.call(buf));\n\n    return newBuf.slice(0, j).toString('ucs2');\n}\n\nDBCSDecoder.prototype.end = function() {\n    var ret = '';\n\n    // Try to parse all remaining chars.\n    while (this.prevBytes.length > 0) {\n        // Skip 1 character in the buffer.\n        ret += this.defaultCharUnicode;\n        var bytesArr = this.prevBytes.slice(1);\n\n        // Parse remaining as usual.\n        this.prevBytes = [];\n        this.nodeIdx = 0;\n        if (bytesArr.length > 0)\n            ret += this.write(bytesArr);\n    }\n\n    this.prevBytes = [];\n    this.nodeIdx = 0;\n    return ret;\n}\n\n// Binary search for GB18030. Returns largest i such that table[i] <= val.\nfunction findIdx(table, val) {\n    if (table[0] > val)\n        return -1;\n\n    var l = 0, r = table.length;\n    while (l < r-1) { // always table[l] <= val < table[r]\n        var mid = l + ((r-l+1) >> 1);\n        if (table[mid] <= val)\n            l = mid;\n        else\n            r = mid;\n    }\n    return l;\n}\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/dbcs-data.js",
    "content": "\"use strict\";\n\n// Description of supported double byte encodings and aliases.\n// Tables are not require()-d until they are needed to speed up library load.\n// require()-s are direct to support Browserify.\n\nmodule.exports = {\n    \n    // == Japanese/ShiftJIS ====================================================\n    // All japanese encodings are based on JIS X set of standards:\n    // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.\n    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. \n    //              Has several variations in 1978, 1983, 1990 and 1997.\n    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.\n    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.\n    //              2 planes, first is superset of 0208, second - revised 0212.\n    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)\n\n    // Byte encodings are:\n    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte\n    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.\n    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.\n    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.\n    //               0x00-0x7F       - lower part of 0201\n    //               0x8E, 0xA1-0xDF - upper part of 0201\n    //               (0xA1-0xFE)x2   - 0208 plane (94x94).\n    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).\n    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.\n    //               Used as-is in ISO2022 family.\n    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, \n    //                0201-1976 Roman, 0208-1978, 0208-1983.\n    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.\n    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.\n    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.\n    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.\n    //\n    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.\n    //\n    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html\n\n    'shiftjis': {\n        type: '_dbcs',\n        table: function() { return require('./tables/shiftjis.json') },\n        encodeAdd: {'\\u00a5': 0x5C, '\\u203E': 0x7E},\n        encodeSkipVals: [{from: 0xED40, to: 0xF940}],\n    },\n    'csshiftjis': 'shiftjis',\n    'mskanji': 'shiftjis',\n    'sjis': 'shiftjis',\n    'windows31j': 'shiftjis',\n    'ms31j': 'shiftjis',\n    'xsjis': 'shiftjis',\n    'windows932': 'shiftjis',\n    'ms932': 'shiftjis',\n    '932': 'shiftjis',\n    'cp932': 'shiftjis',\n\n    'eucjp': {\n        type: '_dbcs',\n        table: function() { return require('./tables/eucjp.json') },\n        encodeAdd: {'\\u00a5': 0x5C, '\\u203E': 0x7E},\n    },\n\n    // TODO: KDDI extension to Shift_JIS\n    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.\n    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.\n\n\n    // == Chinese/GBK ==========================================================\n    // http://en.wikipedia.org/wiki/GBK\n    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder\n\n    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936\n    'gb2312': 'cp936',\n    'gb231280': 'cp936',\n    'gb23121980': 'cp936',\n    'csgb2312': 'cp936',\n    'csiso58gb231280': 'cp936',\n    'euccn': 'cp936',\n\n    // Microsoft's CP936 is a subset and approximation of GBK.\n    'windows936': 'cp936',\n    'ms936': 'cp936',\n    '936': 'cp936',\n    'cp936': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp936.json') },\n    },\n\n    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.\n    'gbk': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },\n    },\n    'xgbk': 'gbk',\n    'isoir58': 'gbk',\n\n    // GB18030 is an algorithmic extension of GBK.\n    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder\n    // http://icu-project.org/docs/papers/gb18030.html\n    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml\n    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0\n    'gb18030': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },\n        gb18030: function() { return require('./tables/gb18030-ranges.json') },\n        encodeSkipVals: [0x80],\n        encodeAdd: {'€': 0xA2E3},\n    },\n\n    'chinese': 'gb18030',\n\n\n    // == Korean ===============================================================\n    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.\n    'windows949': 'cp949',\n    'ms949': 'cp949',\n    '949': 'cp949',\n    'cp949': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp949.json') },\n    },\n\n    'cseuckr': 'cp949',\n    'csksc56011987': 'cp949',\n    'euckr': 'cp949',\n    'isoir149': 'cp949',\n    'korean': 'cp949',\n    'ksc56011987': 'cp949',\n    'ksc56011989': 'cp949',\n    'ksc5601': 'cp949',\n\n\n    // == Big5/Taiwan/Hong Kong ================================================\n    // There are lots of tables for Big5 and cp950. Please see the following links for history:\n    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html\n    // Variations, in roughly number of defined chars:\n    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT\n    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/\n    //  * Big5-2003 (Taiwan standard) almost superset of cp950.\n    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.\n    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. \n    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.\n    //    Plus, it has 4 combining sequences.\n    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299\n    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.\n    //    Implementations are not consistent within browsers; sometimes labeled as just big5.\n    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.\n    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31\n    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.\n    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt\n    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt\n    // \n    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder\n    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.\n\n    'windows950': 'cp950',\n    'ms950': 'cp950',\n    '950': 'cp950',\n    'cp950': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp950.json') },\n    },\n\n    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.\n    'big5': 'big5hkscs',\n    'big5hkscs': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },\n        encodeSkipVals: [\n            // Although Encoding Standard says we should avoid encoding to HKSCS area (See Step 1 of\n            // https://encoding.spec.whatwg.org/#index-big5-pointer), we still do it to increase compatibility with ICU.\n            // But if a single unicode point can be encoded both as HKSCS and regular Big5, we prefer the latter.\n            0x8e69, 0x8e6f, 0x8e7e, 0x8eab, 0x8eb4, 0x8ecd, 0x8ed0, 0x8f57, 0x8f69, 0x8f6e, 0x8fcb, 0x8ffe,\n            0x906d, 0x907a, 0x90c4, 0x90dc, 0x90f1, 0x91bf, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92d1, 0x9447, 0x94ca,\n            0x95d9, 0x96fc, 0x9975, 0x9b76, 0x9b78, 0x9b7b, 0x9bc6, 0x9bde, 0x9bec, 0x9bf6, 0x9c42, 0x9c53, 0x9c62,\n            0x9c68, 0x9c6b, 0x9c77, 0x9cbc, 0x9cbd, 0x9cd0, 0x9d57, 0x9d5a, 0x9dc4, 0x9def, 0x9dfb, 0x9ea9, 0x9eef,\n            0x9efd, 0x9f60, 0x9fcb, 0xa077, 0xa0dc, 0xa0df, 0x8fcc, 0x92c8, 0x9644, 0x96ed,\n\n            // Step 2 of https://encoding.spec.whatwg.org/#index-big5-pointer: Use last pointer for U+2550, U+255E, U+2561, U+256A, U+5341, or U+5345\n            0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa2cc, 0xa2ce,\n        ],\n    },\n\n    'cnbig5': 'big5hkscs',\n    'csbig5': 'big5hkscs',\n    'xxbig5': 'big5hkscs',\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/index.js",
    "content": "\"use strict\";\n\n// Update this array if you add/rename/remove files in this directory.\n// We support Browserify by skipping automatic module discovery and requiring modules directly.\nvar modules = [\n    require(\"./internal\"),\n    require(\"./utf32\"),\n    require(\"./utf16\"),\n    require(\"./utf7\"),\n    require(\"./sbcs-codec\"),\n    require(\"./sbcs-data\"),\n    require(\"./sbcs-data-generated\"),\n    require(\"./dbcs-codec\"),\n    require(\"./dbcs-data\"),\n];\n\n// Put all encoding/alias/codec definitions to single object and export it.\nfor (var i = 0; i < modules.length; i++) {\n    var module = modules[i];\n    for (var enc in module)\n        if (Object.prototype.hasOwnProperty.call(module, enc))\n            exports[enc] = module[enc];\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/internal.js",
    "content": "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Export Node.js internal encodings.\n\nmodule.exports = {\n    // Encodings\n    utf8:   { type: \"_internal\", bomAware: true},\n    cesu8:  { type: \"_internal\", bomAware: true},\n    unicode11utf8: \"utf8\",\n\n    ucs2:   { type: \"_internal\", bomAware: true},\n    utf16le: \"ucs2\",\n\n    binary: { type: \"_internal\" },\n    base64: { type: \"_internal\" },\n    hex:    { type: \"_internal\" },\n\n    // Codec.\n    _internal: InternalCodec,\n};\n\n//------------------------------------------------------------------------------\n\nfunction InternalCodec(codecOptions, iconv) {\n    this.enc = codecOptions.encodingName;\n    this.bomAware = codecOptions.bomAware;\n\n    if (this.enc === \"base64\")\n        this.encoder = InternalEncoderBase64;\n    else if (this.enc === \"cesu8\") {\n        this.enc = \"utf8\"; // Use utf8 for decoding.\n        this.encoder = InternalEncoderCesu8;\n\n        // Add decoder for versions of Node not supporting CESU-8\n        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') {\n            this.decoder = InternalDecoderCesu8;\n            this.defaultCharUnicode = iconv.defaultCharUnicode;\n        }\n    }\n}\n\nInternalCodec.prototype.encoder = InternalEncoder;\nInternalCodec.prototype.decoder = InternalDecoder;\n\n//------------------------------------------------------------------------------\n\n// We use node.js internal decoder. Its signature is the same as ours.\nvar StringDecoder = require('string_decoder').StringDecoder;\n\nif (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.\n    StringDecoder.prototype.end = function() {};\n\n\nfunction InternalDecoder(options, codec) {\n    this.decoder = new StringDecoder(codec.enc);\n}\n\nInternalDecoder.prototype.write = function(buf) {\n    if (!Buffer.isBuffer(buf)) {\n        buf = Buffer.from(buf);\n    }\n\n    return this.decoder.write(buf);\n}\n\nInternalDecoder.prototype.end = function() {\n    return this.decoder.end();\n}\n\n\n//------------------------------------------------------------------------------\n// Encoder is mostly trivial\n\nfunction InternalEncoder(options, codec) {\n    this.enc = codec.enc;\n}\n\nInternalEncoder.prototype.write = function(str) {\n    return Buffer.from(str, this.enc);\n}\n\nInternalEncoder.prototype.end = function() {\n}\n\n\n//------------------------------------------------------------------------------\n// Except base64 encoder, which must keep its state.\n\nfunction InternalEncoderBase64(options, codec) {\n    this.prevStr = '';\n}\n\nInternalEncoderBase64.prototype.write = function(str) {\n    str = this.prevStr + str;\n    var completeQuads = str.length - (str.length % 4);\n    this.prevStr = str.slice(completeQuads);\n    str = str.slice(0, completeQuads);\n\n    return Buffer.from(str, \"base64\");\n}\n\nInternalEncoderBase64.prototype.end = function() {\n    return Buffer.from(this.prevStr, \"base64\");\n}\n\n\n//------------------------------------------------------------------------------\n// CESU-8 encoder is also special.\n\nfunction InternalEncoderCesu8(options, codec) {\n}\n\nInternalEncoderCesu8.prototype.write = function(str) {\n    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;\n    for (var i = 0; i < str.length; i++) {\n        var charCode = str.charCodeAt(i);\n        // Naive implementation, but it works because CESU-8 is especially easy\n        // to convert from UTF-16 (which all JS strings are encoded in).\n        if (charCode < 0x80)\n            buf[bufIdx++] = charCode;\n        else if (charCode < 0x800) {\n            buf[bufIdx++] = 0xC0 + (charCode >>> 6);\n            buf[bufIdx++] = 0x80 + (charCode & 0x3f);\n        }\n        else { // charCode will always be < 0x10000 in javascript.\n            buf[bufIdx++] = 0xE0 + (charCode >>> 12);\n            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);\n            buf[bufIdx++] = 0x80 + (charCode & 0x3f);\n        }\n    }\n    return buf.slice(0, bufIdx);\n}\n\nInternalEncoderCesu8.prototype.end = function() {\n}\n\n//------------------------------------------------------------------------------\n// CESU-8 decoder is not implemented in Node v4.0+\n\nfunction InternalDecoderCesu8(options, codec) {\n    this.acc = 0;\n    this.contBytes = 0;\n    this.accBytes = 0;\n    this.defaultCharUnicode = codec.defaultCharUnicode;\n}\n\nInternalDecoderCesu8.prototype.write = function(buf) {\n    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, \n        res = '';\n    for (var i = 0; i < buf.length; i++) {\n        var curByte = buf[i];\n        if ((curByte & 0xC0) !== 0x80) { // Leading byte\n            if (contBytes > 0) { // Previous code is invalid\n                res += this.defaultCharUnicode;\n                contBytes = 0;\n            }\n\n            if (curByte < 0x80) { // Single-byte code\n                res += String.fromCharCode(curByte);\n            } else if (curByte < 0xE0) { // Two-byte code\n                acc = curByte & 0x1F;\n                contBytes = 1; accBytes = 1;\n            } else if (curByte < 0xF0) { // Three-byte code\n                acc = curByte & 0x0F;\n                contBytes = 2; accBytes = 1;\n            } else { // Four or more are not supported for CESU-8.\n                res += this.defaultCharUnicode;\n            }\n        } else { // Continuation byte\n            if (contBytes > 0) { // We're waiting for it.\n                acc = (acc << 6) | (curByte & 0x3f);\n                contBytes--; accBytes++;\n                if (contBytes === 0) {\n                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)\n                    if (accBytes === 2 && acc < 0x80 && acc > 0)\n                        res += this.defaultCharUnicode;\n                    else if (accBytes === 3 && acc < 0x800)\n                        res += this.defaultCharUnicode;\n                    else\n                        // Actually add character.\n                        res += String.fromCharCode(acc);\n                }\n            } else { // Unexpected continuation byte\n                res += this.defaultCharUnicode;\n            }\n        }\n    }\n    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;\n    return res;\n}\n\nInternalDecoderCesu8.prototype.end = function() {\n    var res = 0;\n    if (this.contBytes > 0)\n        res += this.defaultCharUnicode;\n    return res;\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/sbcs-codec.js",
    "content": "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that\n// correspond to encoded bytes (if 128 - then lower half is ASCII). \n\nexports._sbcs = SBCSCodec;\nfunction SBCSCodec(codecOptions, iconv) {\n    if (!codecOptions)\n        throw new Error(\"SBCS codec is called without the data.\")\n    \n    // Prepare char buffer for decoding.\n    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))\n        throw new Error(\"Encoding '\"+codecOptions.type+\"' has incorrect 'chars' (must be of len 128 or 256)\");\n    \n    if (codecOptions.chars.length === 128) {\n        var asciiString = \"\";\n        for (var i = 0; i < 128; i++)\n            asciiString += String.fromCharCode(i);\n        codecOptions.chars = asciiString + codecOptions.chars;\n    }\n\n    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');\n    \n    // Encoding buffer.\n    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));\n\n    for (var i = 0; i < codecOptions.chars.length; i++)\n        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;\n\n    this.encodeBuf = encodeBuf;\n}\n\nSBCSCodec.prototype.encoder = SBCSEncoder;\nSBCSCodec.prototype.decoder = SBCSDecoder;\n\n\nfunction SBCSEncoder(options, codec) {\n    this.encodeBuf = codec.encodeBuf;\n}\n\nSBCSEncoder.prototype.write = function(str) {\n    var buf = Buffer.alloc(str.length);\n    for (var i = 0; i < str.length; i++)\n        buf[i] = this.encodeBuf[str.charCodeAt(i)];\n    \n    return buf;\n}\n\nSBCSEncoder.prototype.end = function() {\n}\n\n\nfunction SBCSDecoder(options, codec) {\n    this.decodeBuf = codec.decodeBuf;\n}\n\nSBCSDecoder.prototype.write = function(buf) {\n    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.\n    var decodeBuf = this.decodeBuf;\n    var newBuf = Buffer.alloc(buf.length*2);\n    var idx1 = 0, idx2 = 0;\n    for (var i = 0; i < buf.length; i++) {\n        idx1 = buf[i]*2; idx2 = i*2;\n        newBuf[idx2] = decodeBuf[idx1];\n        newBuf[idx2+1] = decodeBuf[idx1+1];\n    }\n    return newBuf.toString('ucs2');\n}\n\nSBCSDecoder.prototype.end = function() {\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/sbcs-data-generated.js",
    "content": "\"use strict\";\n\n// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.\nmodule.exports = {\n  \"437\": \"cp437\",\n  \"737\": \"cp737\",\n  \"775\": \"cp775\",\n  \"850\": \"cp850\",\n  \"852\": \"cp852\",\n  \"855\": \"cp855\",\n  \"856\": \"cp856\",\n  \"857\": \"cp857\",\n  \"858\": \"cp858\",\n  \"860\": \"cp860\",\n  \"861\": \"cp861\",\n  \"862\": \"cp862\",\n  \"863\": \"cp863\",\n  \"864\": \"cp864\",\n  \"865\": \"cp865\",\n  \"866\": \"cp866\",\n  \"869\": \"cp869\",\n  \"874\": \"windows874\",\n  \"922\": \"cp922\",\n  \"1046\": \"cp1046\",\n  \"1124\": \"cp1124\",\n  \"1125\": \"cp1125\",\n  \"1129\": \"cp1129\",\n  \"1133\": \"cp1133\",\n  \"1161\": \"cp1161\",\n  \"1162\": \"cp1162\",\n  \"1163\": \"cp1163\",\n  \"1250\": \"windows1250\",\n  \"1251\": \"windows1251\",\n  \"1252\": \"windows1252\",\n  \"1253\": \"windows1253\",\n  \"1254\": \"windows1254\",\n  \"1255\": \"windows1255\",\n  \"1256\": \"windows1256\",\n  \"1257\": \"windows1257\",\n  \"1258\": \"windows1258\",\n  \"28591\": \"iso88591\",\n  \"28592\": \"iso88592\",\n  \"28593\": \"iso88593\",\n  \"28594\": \"iso88594\",\n  \"28595\": \"iso88595\",\n  \"28596\": \"iso88596\",\n  \"28597\": \"iso88597\",\n  \"28598\": \"iso88598\",\n  \"28599\": \"iso88599\",\n  \"28600\": \"iso885910\",\n  \"28601\": \"iso885911\",\n  \"28603\": \"iso885913\",\n  \"28604\": \"iso885914\",\n  \"28605\": \"iso885915\",\n  \"28606\": \"iso885916\",\n  \"windows874\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  },\n  \"win874\": \"windows874\",\n  \"cp874\": \"windows874\",\n  \"windows1250\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\"\n  },\n  \"win1250\": \"windows1250\",\n  \"cp1250\": \"windows1250\",\n  \"windows1251\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\"\n  },\n  \"win1251\": \"windows1251\",\n  \"cp1251\": \"windows1251\",\n  \"windows1252\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"win1252\": \"windows1252\",\n  \"cp1252\": \"windows1252\",\n  \"windows1253\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\"\n  },\n  \"win1253\": \"windows1253\",\n  \"cp1253\": \"windows1253\",\n  \"windows1254\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\"\n  },\n  \"win1254\": \"windows1254\",\n  \"cp1254\": \"windows1254\",\n  \"windows1255\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�\"\n  },\n  \"win1255\": \"windows1255\",\n  \"cp1255\": \"windows1255\",\n  \"windows1256\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے\"\n  },\n  \"win1256\": \"windows1256\",\n  \"cp1256\": \"windows1256\",\n  \"windows1257\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙\"\n  },\n  \"win1257\": \"windows1257\",\n  \"cp1257\": \"windows1257\",\n  \"windows1258\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\"\n  },\n  \"win1258\": \"windows1258\",\n  \"cp1258\": \"windows1258\",\n  \"iso88591\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"cp28591\": \"iso88591\",\n  \"iso88592\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\"\n  },\n  \"cp28592\": \"iso88592\",\n  \"iso88593\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙\"\n  },\n  \"cp28593\": \"iso88593\",\n  \"iso88594\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙\"\n  },\n  \"cp28594\": \"iso88594\",\n  \"iso88595\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ\"\n  },\n  \"cp28595\": \"iso88595\",\n  \"iso88596\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������\"\n  },\n  \"cp28596\": \"iso88596\",\n  \"iso88597\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\"\n  },\n  \"cp28597\": \"iso88597\",\n  \"iso88598\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�\"\n  },\n  \"cp28598\": \"iso88598\",\n  \"iso88599\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\"\n  },\n  \"cp28599\": \"iso88599\",\n  \"iso885910\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ\"\n  },\n  \"cp28600\": \"iso885910\",\n  \"iso885911\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  },\n  \"cp28601\": \"iso885911\",\n  \"iso885913\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’\"\n  },\n  \"cp28603\": \"iso885913\",\n  \"iso885914\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ\"\n  },\n  \"cp28604\": \"iso885914\",\n  \"iso885915\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"cp28605\": \"iso885915\",\n  \"iso885916\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ\"\n  },\n  \"cp28606\": \"iso885916\",\n  \"cp437\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm437\": \"cp437\",\n  \"csibm437\": \"cp437\",\n  \"cp737\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm737\": \"cp737\",\n  \"csibm737\": \"cp737\",\n  \"cp775\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ \"\n  },\n  \"ibm775\": \"cp775\",\n  \"csibm775\": \"cp775\",\n  \"cp850\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm850\": \"cp850\",\n  \"csibm850\": \"cp850\",\n  \"cp852\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘę¬źČş«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ \"\n  },\n  \"ibm852\": \"cp852\",\n  \"csibm852\": \"cp852\",\n  \"cp855\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ \"\n  },\n  \"ibm855\": \"cp855\",\n  \"csibm855\": \"cp855\",\n  \"cp856\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm856\": \"cp856\",\n  \"csibm856\": \"cp856\",\n  \"cp857\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞğ¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm857\": \"cp857\",\n  \"csibm857\": \"cp857\",\n  \"cp858\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm858\": \"cp858\",\n  \"csibm858\": \"cp858\",\n  \"cp860\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñÑªº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm860\": \"cp860\",\n  \"csibm860\": \"cp860\",\n  \"cp861\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm861\": \"cp861\",\n  \"csibm861\": \"cp861\",\n  \"cp862\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm862\": \"cp862\",\n  \"csibm862\": \"cp862\",\n  \"cp863\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm863\": \"cp863\",\n  \"csibm863\": \"cp863\",\n  \"cp864\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�\"\n  },\n  \"ibm864\": \"cp864\",\n  \"csibm864\": \"cp864\",\n  \"cp865\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñÑªº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm865\": \"cp865\",\n  \"csibm865\": \"cp865\",\n  \"cp866\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ \"\n  },\n  \"ibm866\": \"cp866\",\n  \"csibm866\": \"cp866\",\n  \"cp869\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ \"\n  },\n  \"ibm869\": \"cp869\",\n  \"csibm869\": \"cp869\",\n  \"cp922\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ\"\n  },\n  \"ibm922\": \"cp922\",\n  \"csibm922\": \"cp922\",\n  \"cp1046\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ﺈ×÷ﹱ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�\"\n  },\n  \"ibm1046\": \"cp1046\",\n  \"csibm1046\": \"cp1046\",\n  \"cp1124\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ\"\n  },\n  \"ibm1124\": \"cp1124\",\n  \"csibm1124\": \"cp1124\",\n  \"cp1125\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ \"\n  },\n  \"ibm1125\": \"cp1125\",\n  \"csibm1125\": \"cp1125\",\n  \"cp1129\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\"\n  },\n  \"ibm1129\": \"cp1129\",\n  \"csibm1129\": \"cp1129\",\n  \"cp1133\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�\"\n  },\n  \"ibm1133\": \"cp1133\",\n  \"csibm1133\": \"cp1133\",\n  \"cp1161\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ \"\n  },\n  \"ibm1161\": \"cp1161\",\n  \"csibm1161\": \"cp1161\",\n  \"cp1162\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€…‘’“”•–— กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  },\n  \"ibm1162\": \"cp1162\",\n  \"csibm1162\": \"cp1162\",\n  \"cp1163\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\"\n  },\n  \"ibm1163\": \"cp1163\",\n  \"csibm1163\": \"cp1163\",\n  \"maccroatian\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ\"\n  },\n  \"maccyrillic\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\"\n  },\n  \"macgreek\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�\"\n  },\n  \"maciceland\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macroman\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macromania\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macthai\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู﻿​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����\"\n  },\n  \"macturkish\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macukraine\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\"\n  },\n  \"koi8r\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"koi8u\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"koi8ru\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"koi8t\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"armscii8\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�\"\n  },\n  \"rk1048\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\"\n  },\n  \"tcvn\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000ÚỤ\\u0003ỪỬỮ\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010ỨỰỲỶỸÝỴ\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ\"\n  },\n  \"georgianacademy\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"georgianps\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"pt154\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\"\n  },\n  \"viscii\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001Ẳ\\u0003\\u0004ẴẪ\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013Ỷ\\u0015\\u0016\\u0017\\u0018Ỹ\\u001a\\u001b\\u001c\\u001dỴ\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ\"\n  },\n  \"iso646cn\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������\"\n  },\n  \"iso646jp\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������\"\n  },\n  \"hproman8\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�\"\n  },\n  \"macintosh\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"ascii\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"��������������������������������������������������������������������������������������������������������������������������������\"\n  },\n  \"tis620\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  }\n}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/sbcs-data.js",
    "content": "\"use strict\";\n\n// Manually added data to be used by sbcs codec in addition to generated one.\n\nmodule.exports = {\n    // Not supported by iconv, not sure why.\n    \"10029\": \"maccenteuro\",\n    \"maccenteuro\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ\"\n    },\n\n    \"808\": \"cp808\",\n    \"ibm808\": \"cp808\",\n    \"cp808\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ \"\n    },\n\n    \"mik\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n    },\n\n    \"cp720\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"\\x80\\x81éâ\\x84à\\x86çêëèïî\\x8d\\x8e\\x8f\\x90\\u0651\\u0652ô¤ـûùءآأؤ£إئابةتثجحخدذرزسشص«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ضطظعغفµقكلمنهوىي≡\\u064b\\u064c\\u064d\\u064e\\u064f\\u0650≈°∙·√ⁿ²■\\u00a0\"\n    },\n\n    // Aliases of generated encodings.\n    \"ascii8bit\": \"ascii\",\n    \"usascii\": \"ascii\",\n    \"ansix34\": \"ascii\",\n    \"ansix341968\": \"ascii\",\n    \"ansix341986\": \"ascii\",\n    \"csascii\": \"ascii\",\n    \"cp367\": \"ascii\",\n    \"ibm367\": \"ascii\",\n    \"isoir6\": \"ascii\",\n    \"iso646us\": \"ascii\",\n    \"iso646irv\": \"ascii\",\n    \"us\": \"ascii\",\n\n    \"latin1\": \"iso88591\",\n    \"latin2\": \"iso88592\",\n    \"latin3\": \"iso88593\",\n    \"latin4\": \"iso88594\",\n    \"latin5\": \"iso88599\",\n    \"latin6\": \"iso885910\",\n    \"latin7\": \"iso885913\",\n    \"latin8\": \"iso885914\",\n    \"latin9\": \"iso885915\",\n    \"latin10\": \"iso885916\",\n\n    \"csisolatin1\": \"iso88591\",\n    \"csisolatin2\": \"iso88592\",\n    \"csisolatin3\": \"iso88593\",\n    \"csisolatin4\": \"iso88594\",\n    \"csisolatincyrillic\": \"iso88595\",\n    \"csisolatinarabic\": \"iso88596\",\n    \"csisolatingreek\" : \"iso88597\",\n    \"csisolatinhebrew\": \"iso88598\",\n    \"csisolatin5\": \"iso88599\",\n    \"csisolatin6\": \"iso885910\",\n\n    \"l1\": \"iso88591\",\n    \"l2\": \"iso88592\",\n    \"l3\": \"iso88593\",\n    \"l4\": \"iso88594\",\n    \"l5\": \"iso88599\",\n    \"l6\": \"iso885910\",\n    \"l7\": \"iso885913\",\n    \"l8\": \"iso885914\",\n    \"l9\": \"iso885915\",\n    \"l10\": \"iso885916\",\n\n    \"isoir14\": \"iso646jp\",\n    \"isoir57\": \"iso646cn\",\n    \"isoir100\": \"iso88591\",\n    \"isoir101\": \"iso88592\",\n    \"isoir109\": \"iso88593\",\n    \"isoir110\": \"iso88594\",\n    \"isoir144\": \"iso88595\",\n    \"isoir127\": \"iso88596\",\n    \"isoir126\": \"iso88597\",\n    \"isoir138\": \"iso88598\",\n    \"isoir148\": \"iso88599\",\n    \"isoir157\": \"iso885910\",\n    \"isoir166\": \"tis620\",\n    \"isoir179\": \"iso885913\",\n    \"isoir199\": \"iso885914\",\n    \"isoir203\": \"iso885915\",\n    \"isoir226\": \"iso885916\",\n\n    \"cp819\": \"iso88591\",\n    \"ibm819\": \"iso88591\",\n\n    \"cyrillic\": \"iso88595\",\n\n    \"arabic\": \"iso88596\",\n    \"arabic8\": \"iso88596\",\n    \"ecma114\": \"iso88596\",\n    \"asmo708\": \"iso88596\",\n\n    \"greek\" : \"iso88597\",\n    \"greek8\" : \"iso88597\",\n    \"ecma118\" : \"iso88597\",\n    \"elot928\" : \"iso88597\",\n\n    \"hebrew\": \"iso88598\",\n    \"hebrew8\": \"iso88598\",\n\n    \"turkish\": \"iso88599\",\n    \"turkish8\": \"iso88599\",\n\n    \"thai\": \"iso885911\",\n    \"thai8\": \"iso885911\",\n\n    \"celtic\": \"iso885914\",\n    \"celtic8\": \"iso885914\",\n    \"isoceltic\": \"iso885914\",\n\n    \"tis6200\": \"tis620\",\n    \"tis62025291\": \"tis620\",\n    \"tis62025330\": \"tis620\",\n\n    \"10000\": \"macroman\",\n    \"10006\": \"macgreek\",\n    \"10007\": \"maccyrillic\",\n    \"10079\": \"maciceland\",\n    \"10081\": \"macturkish\",\n\n    \"cspc8codepage437\": \"cp437\",\n    \"cspc775baltic\": \"cp775\",\n    \"cspc850multilingual\": \"cp850\",\n    \"cspcp852\": \"cp852\",\n    \"cspc862latinhebrew\": \"cp862\",\n    \"cpgr\": \"cp869\",\n\n    \"msee\": \"cp1250\",\n    \"mscyrl\": \"cp1251\",\n    \"msansi\": \"cp1252\",\n    \"msgreek\": \"cp1253\",\n    \"msturk\": \"cp1254\",\n    \"mshebr\": \"cp1255\",\n    \"msarab\": \"cp1256\",\n    \"winbaltrim\": \"cp1257\",\n\n    \"cp20866\": \"koi8r\",\n    \"20866\": \"koi8r\",\n    \"ibm878\": \"koi8r\",\n    \"cskoi8r\": \"koi8r\",\n\n    \"cp21866\": \"koi8u\",\n    \"21866\": \"koi8u\",\n    \"ibm1168\": \"koi8u\",\n\n    \"strk10482002\": \"rk1048\",\n\n    \"tcvn5712\": \"tcvn\",\n    \"tcvn57121\": \"tcvn\",\n\n    \"gb198880\": \"iso646cn\",\n    \"cn\": \"iso646cn\",\n\n    \"csiso14jisc6220ro\": \"iso646jp\",\n    \"jisc62201969ro\": \"iso646jp\",\n    \"jp\": \"iso646jp\",\n\n    \"cshproman8\": \"hproman8\",\n    \"r8\": \"hproman8\",\n    \"roman8\": \"hproman8\",\n    \"xroman8\": \"hproman8\",\n    \"ibm1051\": \"hproman8\",\n\n    \"mac\": \"macintosh\",\n    \"csmacintosh\": \"macintosh\",\n};\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/big5-added.json",
    "content": "[\n[\"8740\",\"䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻\"],\n[\"8767\",\"綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬\"],\n[\"87a1\",\"𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋\"],\n[\"8840\",\"㇀\",4,\"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ\"],\n[\"88a1\",\"ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛\"],\n[\"8940\",\"𪎩𡅅\"],\n[\"8943\",\"攊\"],\n[\"8946\",\"丽滝鵎釟\"],\n[\"894c\",\"𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮\"],\n[\"89a1\",\"琑糼緍楆竉刧\"],\n[\"89ab\",\"醌碸酞肼\"],\n[\"89b0\",\"贋胶𠧧\"],\n[\"89b5\",\"肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁\"],\n[\"89c1\",\"溚舾甙\"],\n[\"89c5\",\"䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅\"],\n[\"8a40\",\"𧶄唥\"],\n[\"8a43\",\"𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓\"],\n[\"8a64\",\"𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕\"],\n[\"8a76\",\"䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯\"],\n[\"8aa1\",\"𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱\"],\n[\"8aac\",\"䠋𠆩㿺塳𢶍\"],\n[\"8ab2\",\"𤗈𠓼𦂗𠽌𠶖啹䂻䎺\"],\n[\"8abb\",\"䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃\"],\n[\"8ac9\",\"𪘁𠸉𢫏𢳉\"],\n[\"8ace\",\"𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻\"],\n[\"8adf\",\"𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌\"],\n[\"8af6\",\"𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭\"],\n[\"8b40\",\"𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹\"],\n[\"8b55\",\"𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑\"],\n[\"8ba1\",\"𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁\"],\n[\"8bde\",\"𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢\"],\n[\"8c40\",\"倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋\"],\n[\"8ca1\",\"𣏹椙橃𣱣泿\"],\n[\"8ca7\",\"爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚\"],\n[\"8cc9\",\"顨杫䉶圽\"],\n[\"8cce\",\"藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶\"],\n[\"8ce6\",\"峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻\"],\n[\"8d40\",\"𠮟\"],\n[\"8d42\",\"𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱\"],\n[\"8da1\",\"㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘\"],\n[\"8e40\",\"𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎\"],\n[\"8ea1\",\"繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛\"],\n[\"8f40\",\"蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖\"],\n[\"8fa1\",\"𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起\"],\n[\"9040\",\"趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛\"],\n[\"90a1\",\"𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜\"],\n[\"9140\",\"𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈\"],\n[\"91a1\",\"鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨\"],\n[\"9240\",\"𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘\"],\n[\"92a1\",\"働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃\"],\n[\"9340\",\"媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍\"],\n[\"93a1\",\"摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋\"],\n[\"9440\",\"銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻\"],\n[\"94a1\",\"㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡\"],\n[\"9540\",\"𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂\"],\n[\"95a1\",\"衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰\"],\n[\"9640\",\"桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸\"],\n[\"96a1\",\"𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉\"],\n[\"9740\",\"愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫\"],\n[\"97a1\",\"𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎\"],\n[\"9840\",\"𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦\"],\n[\"98a1\",\"咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃\"],\n[\"9940\",\"䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚\"],\n[\"99a1\",\"䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿\"],\n[\"9a40\",\"鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺\"],\n[\"9aa1\",\"黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪\"],\n[\"9b40\",\"𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌\"],\n[\"9b62\",\"𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎\"],\n[\"9ba1\",\"椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊\"],\n[\"9c40\",\"嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶\"],\n[\"9ca1\",\"㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏\"],\n[\"9d40\",\"𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁\"],\n[\"9da1\",\"辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢\"],\n[\"9e40\",\"𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺\"],\n[\"9ea1\",\"鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭\"],\n[\"9ead\",\"𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹\"],\n[\"9ec5\",\"㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲\"],\n[\"9ef5\",\"噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼\"],\n[\"9f40\",\"籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱\"],\n[\"9f4f\",\"凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰\"],\n[\"9fa1\",\"椬叚鰊鴂䰻陁榀傦畆𡝭駚剳\"],\n[\"9fae\",\"酙隁酜\"],\n[\"9fb2\",\"酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽\"],\n[\"9fc1\",\"𤤙盖鮝个𠳔莾衂\"],\n[\"9fc9\",\"届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳\"],\n[\"9fdb\",\"歒酼龥鮗頮颴骺麨麄煺笔\"],\n[\"9fe7\",\"毺蠘罸\"],\n[\"9feb\",\"嘠𪙊蹷齓\"],\n[\"9ff0\",\"跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇\"],\n[\"a040\",\"𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷\"],\n[\"a055\",\"𡠻𦸅\"],\n[\"a058\",\"詾𢔛\"],\n[\"a05b\",\"惽癧髗鵄鍮鮏蟵\"],\n[\"a063\",\"蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽\"],\n[\"a073\",\"坟慯抦戹拎㩜懢厪𣏵捤栂㗒\"],\n[\"a0a1\",\"嵗𨯂迚𨸹\"],\n[\"a0a6\",\"僙𡵆礆匲阸𠼻䁥\"],\n[\"a0ae\",\"矾\"],\n[\"a0b0\",\"糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦\"],\n[\"a0d4\",\"覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷\"],\n[\"a0e2\",\"罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫\"],\n[\"a3c0\",\"␀\",31,\"␡\"],\n[\"c6a1\",\"①\",9,\"⑴\",9,\"ⅰ\",9,\"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー［］✽ぁ\",23],\n[\"c740\",\"す\",58,\"ァアィイ\"],\n[\"c7a1\",\"ゥ\",81,\"А\",5,\"ЁЖ\",4],\n[\"c840\",\"Л\",26,\"ёж\",25,\"⇧↸↹㇏𠃌乚𠂊刂䒑\"],\n[\"c8a1\",\"龰冈龱𧘇\"],\n[\"c8cd\",\"￢￤＇＂㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣\"],\n[\"c8f5\",\"ʃɐɛɔɵœøŋʊɪ\"],\n[\"f9fe\",\"￭\"],\n[\"fa40\",\"𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸\"],\n[\"faa1\",\"鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍\"],\n[\"fb40\",\"𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙\"],\n[\"fba1\",\"𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂\"],\n[\"fc40\",\"廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷\"],\n[\"fca1\",\"𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝\"],\n[\"fd40\",\"𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀\"],\n[\"fda1\",\"𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎\"],\n[\"fe40\",\"鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌\"],\n[\"fea1\",\"𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/cp936.json",
    "content": "[\n[\"0\",\"\\u0000\",127,\"€\"],\n[\"8140\",\"丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪\",5,\"乲乴\",9,\"乿\",6,\"亇亊\"],\n[\"8180\",\"亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂\",6,\"伋伌伒\",4,\"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾\",4,\"佄佅佇\",5,\"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢\"],\n[\"8240\",\"侤侫侭侰\",4,\"侶\",8,\"俀俁係俆俇俈俉俋俌俍俒\",4,\"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿\",11],\n[\"8280\",\"個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯\",10,\"倻倽倿偀偁偂偄偅偆偉偊偋偍偐\",4,\"偖偗偘偙偛偝\",7,\"偦\",5,\"偭\",8,\"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎\",20,\"傤傦傪傫傭\",4,\"傳\",6,\"傼\"],\n[\"8340\",\"傽\",17,\"僐\",5,\"僗僘僙僛\",10,\"僨僩僪僫僯僰僱僲僴僶\",4,\"僼\",9,\"儈\"],\n[\"8380\",\"儉儊儌\",5,\"儓\",13,\"儢\",28,\"兂兇兊兌兎兏児兒兓兗兘兙兛兝\",4,\"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦\",4,\"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒\",5],\n[\"8440\",\"凘凙凚凜凞凟凢凣凥\",5,\"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄\",5,\"剋剎剏剒剓剕剗剘\"],\n[\"8480\",\"剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳\",9,\"剾劀劃\",4,\"劉\",6,\"劑劒劔\",6,\"劜劤劥劦劧劮劯劰労\",9,\"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務\",5,\"勠勡勢勣勥\",10,\"勱\",7,\"勻勼勽匁匂匃匄匇匉匊匋匌匎\"],\n[\"8540\",\"匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯\",9,\"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏\"],\n[\"8580\",\"厐\",4,\"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯\",6,\"厷厸厹厺厼厽厾叀參\",4,\"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝\",4,\"呣呥呧呩\",7,\"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡\"],\n[\"8640\",\"咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠\",4,\"哫哬哯哰哱哴\",5,\"哻哾唀唂唃唄唅唈唊\",4,\"唒唓唕\",5,\"唜唝唞唟唡唥唦\"],\n[\"8680\",\"唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋\",4,\"啑啒啓啔啗\",4,\"啝啞啟啠啢啣啨啩啫啯\",5,\"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠\",6,\"喨\",8,\"喲喴営喸喺喼喿\",4,\"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗\",4,\"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸\",4,\"嗿嘂嘃嘄嘅\"],\n[\"8740\",\"嘆嘇嘊嘋嘍嘐\",7,\"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀\",11,\"噏\",4,\"噕噖噚噛噝\",4],\n[\"8780\",\"噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽\",7,\"嚇\",6,\"嚐嚑嚒嚔\",14,\"嚤\",10,\"嚰\",6,\"嚸嚹嚺嚻嚽\",12,\"囋\",8,\"囕囖囘囙囜団囥\",5,\"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國\",6],\n[\"8840\",\"園\",9,\"圝圞圠圡圢圤圥圦圧圫圱圲圴\",4,\"圼圽圿坁坃坄坅坆坈坉坋坒\",4,\"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀\"],\n[\"8880\",\"垁垇垈垉垊垍\",4,\"垔\",6,\"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹\",8,\"埄\",6,\"埌埍埐埑埓埖埗埛埜埞埡埢埣埥\",7,\"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥\",4,\"堫\",4,\"報堲堳場堶\",7],\n[\"8940\",\"堾\",5,\"塅\",6,\"塎塏塐塒塓塕塖塗塙\",4,\"塟\",5,\"塦\",4,\"塭\",16,\"塿墂墄墆墇墈墊墋墌\"],\n[\"8980\",\"墍\",4,\"墔\",4,\"墛墜墝墠\",7,\"墪\",17,\"墽墾墿壀壂壃壄壆\",10,\"壒壓壔壖\",13,\"壥\",5,\"壭壯壱売壴壵壷壸壺\",7,\"夃夅夆夈\",4,\"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻\"],\n[\"8a40\",\"夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛\",4,\"奡奣奤奦\",12,\"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦\"],\n[\"8a80\",\"妧妬妭妰妱妳\",5,\"妺妼妽妿\",6,\"姇姈姉姌姍姎姏姕姖姙姛姞\",4,\"姤姦姧姩姪姫姭\",11,\"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪\",6,\"娳娵娷\",4,\"娽娾娿婁\",4,\"婇婈婋\",9,\"婖婗婘婙婛\",5],\n[\"8b40\",\"婡婣婤婥婦婨婩婫\",8,\"婸婹婻婼婽婾媀\",17,\"媓\",6,\"媜\",13,\"媫媬\"],\n[\"8b80\",\"媭\",4,\"媴媶媷媹\",4,\"媿嫀嫃\",5,\"嫊嫋嫍\",4,\"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬\",4,\"嫲\",22,\"嬊\",11,\"嬘\",25,\"嬳嬵嬶嬸\",7,\"孁\",6],\n[\"8c40\",\"孈\",7,\"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏\"],\n[\"8c80\",\"寑寔\",8,\"寠寢寣實寧審\",4,\"寯寱\",6,\"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧\",6,\"屰屲\",6,\"屻屼屽屾岀岃\",4,\"岉岊岋岎岏岒岓岕岝\",4,\"岤\",4],\n[\"8d40\",\"岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅\",5,\"峌\",5,\"峓\",5,\"峚\",6,\"峢峣峧峩峫峬峮峯峱\",9,\"峼\",4],\n[\"8d80\",\"崁崄崅崈\",5,\"崏\",4,\"崕崗崘崙崚崜崝崟\",4,\"崥崨崪崫崬崯\",4,\"崵\",7,\"崿\",7,\"嵈嵉嵍\",10,\"嵙嵚嵜嵞\",10,\"嵪嵭嵮嵰嵱嵲嵳嵵\",12,\"嶃\",21,\"嶚嶛嶜嶞嶟嶠\"],\n[\"8e40\",\"嶡\",21,\"嶸\",12,\"巆\",6,\"巎\",12,\"巜巟巠巣巤巪巬巭\"],\n[\"8e80\",\"巰巵巶巸\",4,\"巿帀帄帇帉帊帋帍帎帒帓帗帞\",7,\"帨\",4,\"帯帰帲\",4,\"帹帺帾帿幀幁幃幆\",5,\"幍\",6,\"幖\",4,\"幜幝幟幠幣\",14,\"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨\",4,\"庮\",4,\"庴庺庻庼庽庿\",6],\n[\"8f40\",\"廆廇廈廋\",5,\"廔廕廗廘廙廚廜\",11,\"廩廫\",8,\"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤\"],\n[\"8f80\",\"弨弫弬弮弰弲\",6,\"弻弽弾弿彁\",14,\"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢\",5,\"復徫徬徯\",5,\"徶徸徹徺徻徾\",4,\"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇\"],\n[\"9040\",\"怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰\",4,\"怶\",4,\"怽怾恀恄\",6,\"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀\"],\n[\"9080\",\"悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽\",7,\"惇惈惉惌\",4,\"惒惓惔惖惗惙惛惞惡\",4,\"惪惱惲惵惷惸惻\",4,\"愂愃愄愅愇愊愋愌愐\",4,\"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬\",18,\"慀\",6],\n[\"9140\",\"慇慉態慍慏慐慒慓慔慖\",6,\"慞慟慠慡慣慤慥慦慩\",6,\"慱慲慳慴慶慸\",18,\"憌憍憏\",4,\"憕\"],\n[\"9180\",\"憖\",6,\"憞\",8,\"憪憫憭\",9,\"憸\",5,\"憿懀懁懃\",4,\"應懌\",4,\"懓懕\",16,\"懧\",13,\"懶\",8,\"戀\",5,\"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸\",4,\"扂扄扅扆扊\"],\n[\"9240\",\"扏扐払扖扗扙扚扜\",6,\"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋\",5,\"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁\"],\n[\"9280\",\"拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳\",5,\"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖\",7,\"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙\",6,\"採掤掦掫掯掱掲掵掶掹掻掽掿揀\"],\n[\"9340\",\"揁揂揃揅揇揈揊揋揌揑揓揔揕揗\",6,\"揟揢揤\",4,\"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆\",4,\"損搎搑搒搕\",5,\"搝搟搢搣搤\"],\n[\"9380\",\"搥搧搨搩搫搮\",5,\"搵\",4,\"搻搼搾摀摂摃摉摋\",6,\"摓摕摖摗摙\",4,\"摟\",7,\"摨摪摫摬摮\",9,\"摻\",6,\"撃撆撈\",8,\"撓撔撗撘撚撛撜撝撟\",4,\"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆\",6,\"擏擑擓擔擕擖擙據\"],\n[\"9440\",\"擛擜擝擟擠擡擣擥擧\",24,\"攁\",7,\"攊\",7,\"攓\",4,\"攙\",8],\n[\"9480\",\"攢攣攤攦\",4,\"攬攭攰攱攲攳攷攺攼攽敀\",4,\"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數\",14,\"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱\",7,\"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘\",7,\"旡旣旤旪旫\"],\n[\"9540\",\"旲旳旴旵旸旹旻\",4,\"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷\",4,\"昽昿晀時晄\",6,\"晍晎晐晑晘\"],\n[\"9580\",\"晙晛晜晝晞晠晢晣晥晧晩\",4,\"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘\",4,\"暞\",8,\"暩\",4,\"暯\",4,\"暵暶暷暸暺暻暼暽暿\",25,\"曚曞\",7,\"曧曨曪\",5,\"曱曵曶書曺曻曽朁朂會\"],\n[\"9640\",\"朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠\",5,\"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗\",4,\"杝杢杣杤杦杧杫杬杮東杴杶\"],\n[\"9680\",\"杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹\",7,\"柂柅\",9,\"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵\",7,\"柾栁栂栃栄栆栍栐栒栔栕栘\",4,\"栞栟栠栢\",6,\"栫\",6,\"栴栵栶栺栻栿桇桋桍桏桒桖\",5],\n[\"9740\",\"桜桝桞桟桪桬\",7,\"桵桸\",8,\"梂梄梇\",7,\"梐梑梒梔梕梖梘\",9,\"梣梤梥梩梪梫梬梮梱梲梴梶梷梸\"],\n[\"9780\",\"梹\",6,\"棁棃\",5,\"棊棌棎棏棐棑棓棔棖棗棙棛\",4,\"棡棢棤\",9,\"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆\",4,\"椌椏椑椓\",11,\"椡椢椣椥\",7,\"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃\",16,\"楕楖楘楙楛楜楟\"],\n[\"9840\",\"楡楢楤楥楧楨楩楪楬業楯楰楲\",4,\"楺楻楽楾楿榁榃榅榊榋榌榎\",5,\"榖榗榙榚榝\",9,\"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽\"],\n[\"9880\",\"榾榿槀槂\",7,\"構槍槏槑槒槓槕\",5,\"槜槝槞槡\",11,\"槮槯槰槱槳\",9,\"槾樀\",9,\"樋\",11,\"標\",5,\"樠樢\",5,\"権樫樬樭樮樰樲樳樴樶\",6,\"樿\",4,\"橅橆橈\",7,\"橑\",6,\"橚\"],\n[\"9940\",\"橜\",4,\"橢橣橤橦\",10,\"橲\",6,\"橺橻橽橾橿檁檂檃檅\",8,\"檏檒\",4,\"檘\",7,\"檡\",5],\n[\"9980\",\"檧檨檪檭\",114,\"欥欦欨\",6],\n[\"9a40\",\"欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍\",11,\"歚\",7,\"歨歩歫\",13,\"歺歽歾歿殀殅殈\"],\n[\"9a80\",\"殌殎殏殐殑殔殕殗殘殙殜\",4,\"殢\",7,\"殫\",7,\"殶殸\",6,\"毀毃毄毆\",4,\"毌毎毐毑毘毚毜\",4,\"毢\",7,\"毬毭毮毰毱毲毴毶毷毸毺毻毼毾\",6,\"氈\",4,\"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋\",4,\"汑汒汓汖汘\"],\n[\"9b40\",\"汙汚汢汣汥汦汧汫\",4,\"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘\"],\n[\"9b80\",\"泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟\",5,\"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽\",4,\"涃涄涆涇涊涋涍涏涐涒涖\",4,\"涜涢涥涬涭涰涱涳涴涶涷涹\",5,\"淁淂淃淈淉淊\"],\n[\"9c40\",\"淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽\",7,\"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵\"],\n[\"9c80\",\"渶渷渹渻\",7,\"湅\",7,\"湏湐湑湒湕湗湙湚湜湝湞湠\",10,\"湬湭湯\",14,\"満溁溂溄溇溈溊\",4,\"溑\",6,\"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪\",5],\n[\"9d40\",\"滰滱滲滳滵滶滷滸滺\",7,\"漃漄漅漇漈漊\",4,\"漐漑漒漖\",9,\"漡漢漣漥漦漧漨漬漮漰漲漴漵漷\",6,\"漿潀潁潂\"],\n[\"9d80\",\"潃潄潅潈潉潊潌潎\",9,\"潙潚潛潝潟潠潡潣潤潥潧\",5,\"潯潰潱潳潵潶潷潹潻潽\",6,\"澅澆澇澊澋澏\",12,\"澝澞澟澠澢\",4,\"澨\",10,\"澴澵澷澸澺\",5,\"濁濃\",5,\"濊\",6,\"濓\",10,\"濟濢濣濤濥\"],\n[\"9e40\",\"濦\",7,\"濰\",32,\"瀒\",7,\"瀜\",6,\"瀤\",6],\n[\"9e80\",\"瀫\",9,\"瀶瀷瀸瀺\",17,\"灍灎灐\",13,\"灟\",11,\"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞\",12,\"炰炲炴炵炶為炾炿烄烅烆烇烉烋\",12,\"烚\"],\n[\"9f40\",\"烜烝烞烠烡烢烣烥烪烮烰\",6,\"烸烺烻烼烾\",10,\"焋\",4,\"焑焒焔焗焛\",10,\"焧\",7,\"焲焳焴\"],\n[\"9f80\",\"焵焷\",13,\"煆煇煈煉煋煍煏\",12,\"煝煟\",4,\"煥煩\",4,\"煯煰煱煴煵煶煷煹煻煼煾\",5,\"熅\",4,\"熋熌熍熎熐熑熒熓熕熖熗熚\",4,\"熡\",6,\"熩熪熫熭\",5,\"熴熶熷熸熺\",8,\"燄\",9,\"燏\",4],\n[\"a040\",\"燖\",9,\"燡燢燣燤燦燨\",5,\"燯\",9,\"燺\",11,\"爇\",19],\n[\"a080\",\"爛爜爞\",9,\"爩爫爭爮爯爲爳爴爺爼爾牀\",6,\"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅\",4,\"犌犎犐犑犓\",11,\"犠\",11,\"犮犱犲犳犵犺\",6,\"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛\"],\n[\"a1a1\",\"　、。·ˉˇ¨〃々—～‖…‘’“”〔〕〈\",7,\"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃＄¤￠￡‰§№☆★○●◎◇◆□■△▲※→←↑↓〓\"],\n[\"a2a1\",\"ⅰ\",9],\n[\"a2b1\",\"⒈\",19,\"⑴\",19,\"①\",9],\n[\"a2e5\",\"㈠\",9],\n[\"a2f1\",\"Ⅰ\",11],\n[\"a3a1\",\"！＂＃￥％\",88,\"￣\"],\n[\"a4a1\",\"ぁ\",82],\n[\"a5a1\",\"ァ\",85],\n[\"a6a1\",\"Α\",16,\"Σ\",6],\n[\"a6c1\",\"α\",16,\"σ\",6],\n[\"a6e0\",\"︵︶︹︺︿﹀︽︾﹁﹂﹃﹄\"],\n[\"a6ee\",\"︻︼︷︸︱\"],\n[\"a6f4\",\"︳︴\"],\n[\"a7a1\",\"А\",5,\"ЁЖ\",25],\n[\"a7d1\",\"а\",5,\"ёж\",25],\n[\"a840\",\"ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═\",35,\"▁\",6],\n[\"a880\",\"█\",7,\"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞\"],\n[\"a8a1\",\"āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ\"],\n[\"a8bd\",\"ńň\"],\n[\"a8c0\",\"ɡ\"],\n[\"a8c5\",\"ㄅ\",36],\n[\"a940\",\"〡\",8,\"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰￢￤\"],\n[\"a959\",\"℡㈱\"],\n[\"a95c\",\"‐\"],\n[\"a960\",\"ー゛゜ヽヾ〆ゝゞ﹉\",9,\"﹔﹕﹖﹗﹙\",8],\n[\"a980\",\"﹢\",4,\"﹨﹩﹪﹫\"],\n[\"a996\",\"〇\"],\n[\"a9a4\",\"─\",75],\n[\"aa40\",\"狜狝狟狢\",5,\"狪狫狵狶狹狽狾狿猀猂猄\",5,\"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀\",8],\n[\"aa80\",\"獉獊獋獌獎獏獑獓獔獕獖獘\",7,\"獡\",10,\"獮獰獱\"],\n[\"ab40\",\"獲\",11,\"獿\",4,\"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣\",5,\"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃\",4],\n[\"ab80\",\"珋珌珎珒\",6,\"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳\",4],\n[\"ac40\",\"珸\",10,\"琄琇琈琋琌琍琎琑\",8,\"琜\",5,\"琣琤琧琩琫琭琯琱琲琷\",4,\"琽琾琿瑀瑂\",11],\n[\"ac80\",\"瑎\",6,\"瑖瑘瑝瑠\",12,\"瑮瑯瑱\",4,\"瑸瑹瑺\"],\n[\"ad40\",\"瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑\",10,\"璝璟\",7,\"璪\",15,\"璻\",12],\n[\"ad80\",\"瓈\",9,\"瓓\",8,\"瓝瓟瓡瓥瓧\",6,\"瓰瓱瓲\"],\n[\"ae40\",\"瓳瓵瓸\",6,\"甀甁甂甃甅\",7,\"甎甐甒甔甕甖甗甛甝甞甠\",4,\"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘\"],\n[\"ae80\",\"畝\",7,\"畧畨畩畫\",6,\"畳畵當畷畺\",4,\"疀疁疂疄疅疇\"],\n[\"af40\",\"疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦\",4,\"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇\"],\n[\"af80\",\"瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄\"],\n[\"b040\",\"癅\",6,\"癎\",5,\"癕癗\",4,\"癝癟癠癡癢癤\",6,\"癬癭癮癰\",7,\"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛\"],\n[\"b080\",\"皜\",7,\"皥\",8,\"皯皰皳皵\",9,\"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥\"],\n[\"b140\",\"盄盇盉盋盌盓盕盙盚盜盝盞盠\",4,\"盦\",7,\"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎\",10,\"眛眜眝眞眡眣眤眥眧眪眫\"],\n[\"b180\",\"眬眮眰\",4,\"眹眻眽眾眿睂睄睅睆睈\",7,\"睒\",7,\"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳\"],\n[\"b240\",\"睝睞睟睠睤睧睩睪睭\",11,\"睺睻睼瞁瞂瞃瞆\",5,\"瞏瞐瞓\",11,\"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶\",4],\n[\"b280\",\"瞼瞾矀\",12,\"矎\",8,\"矘矙矚矝\",4,\"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖\"],\n[\"b340\",\"矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃\",5,\"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚\"],\n[\"b380\",\"硛硜硞\",11,\"硯\",7,\"硸硹硺硻硽\",6,\"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚\"],\n[\"b440\",\"碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨\",7,\"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚\",9],\n[\"b480\",\"磤磥磦磧磩磪磫磭\",4,\"磳磵磶磸磹磻\",5,\"礂礃礄礆\",6,\"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮\"],\n[\"b540\",\"礍\",5,\"礔\",9,\"礟\",4,\"礥\",14,\"礵\",4,\"礽礿祂祃祄祅祇祊\",8,\"祔祕祘祙祡祣\"],\n[\"b580\",\"祤祦祩祪祫祬祮祰\",6,\"祹祻\",4,\"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠\"],\n[\"b640\",\"禓\",6,\"禛\",11,\"禨\",10,\"禴\",4,\"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙\",5,\"秠秡秢秥秨秪\"],\n[\"b680\",\"秬秮秱\",6,\"秹秺秼秾秿稁稄稅稇稈稉稊稌稏\",4,\"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二\"],\n[\"b740\",\"稝稟稡稢稤\",14,\"稴稵稶稸稺稾穀\",5,\"穇\",9,\"穒\",4,\"穘\",16],\n[\"b780\",\"穩\",6,\"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服\"],\n[\"b840\",\"窣窤窧窩窪窫窮\",4,\"窴\",10,\"竀\",10,\"竌\",9,\"竗竘竚竛竜竝竡竢竤竧\",5,\"竮竰竱竲竳\"],\n[\"b880\",\"竴\",4,\"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹\"],\n[\"b940\",\"笯笰笲笴笵笶笷笹笻笽笿\",5,\"筆筈筊筍筎筓筕筗筙筜筞筟筡筣\",10,\"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆\",6,\"箎箏\"],\n[\"b980\",\"箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹\",7,\"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈\"],\n[\"ba40\",\"篅篈築篊篋篍篎篏篐篒篔\",4,\"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲\",4,\"篸篹篺篻篽篿\",7,\"簈簉簊簍簎簐\",5,\"簗簘簙\"],\n[\"ba80\",\"簚\",4,\"簠\",5,\"簨簩簫\",12,\"簹\",5,\"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖\"],\n[\"bb40\",\"籃\",9,\"籎\",36,\"籵\",5,\"籾\",9],\n[\"bb80\",\"粈粊\",6,\"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴\",4,\"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕\"],\n[\"bc40\",\"粿糀糂糃糄糆糉糋糎\",6,\"糘糚糛糝糞糡\",6,\"糩\",5,\"糰\",7,\"糹糺糼\",13,\"紋\",5],\n[\"bc80\",\"紑\",14,\"紡紣紤紥紦紨紩紪紬紭紮細\",6,\"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件\"],\n[\"bd40\",\"紷\",54,\"絯\",7],\n[\"bd80\",\"絸\",32,\"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸\"],\n[\"be40\",\"継\",12,\"綧\",6,\"綯\",42],\n[\"be80\",\"線\",32,\"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻\"],\n[\"bf40\",\"緻\",62],\n[\"bf80\",\"縺縼\",4,\"繂\",4,\"繈\",21,\"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀\"],\n[\"c040\",\"繞\",35,\"纃\",23,\"纜纝纞\"],\n[\"c080\",\"纮纴纻纼绖绤绬绹缊缐缞缷缹缻\",6,\"罃罆\",9,\"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐\"],\n[\"c140\",\"罖罙罛罜罝罞罠罣\",4,\"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂\",7,\"羋羍羏\",4,\"羕\",4,\"羛羜羠羢羣羥羦羨\",6,\"羱\"],\n[\"c180\",\"羳\",4,\"羺羻羾翀翂翃翄翆翇翈翉翋翍翏\",4,\"翖翗翙\",5,\"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿\"],\n[\"c240\",\"翤翧翨翪翫翬翭翯翲翴\",6,\"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫\",5,\"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗\"],\n[\"c280\",\"聙聛\",13,\"聫\",5,\"聲\",11,\"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫\"],\n[\"c340\",\"聾肁肂肅肈肊肍\",5,\"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇\",4,\"胏\",6,\"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋\"],\n[\"c380\",\"脌脕脗脙脛脜脝脟\",12,\"脭脮脰脳脴脵脷脹\",4,\"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸\"],\n[\"c440\",\"腀\",5,\"腇腉腍腎腏腒腖腗腘腛\",4,\"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃\",4,\"膉膋膌膍膎膐膒\",5,\"膙膚膞\",4,\"膤膥\"],\n[\"c480\",\"膧膩膫\",7,\"膴\",5,\"膼膽膾膿臄臅臇臈臉臋臍\",6,\"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁\"],\n[\"c540\",\"臔\",14,\"臤臥臦臨臩臫臮\",4,\"臵\",5,\"臽臿舃與\",4,\"舎舏舑舓舕\",5,\"舝舠舤舥舦舧舩舮舲舺舼舽舿\"],\n[\"c580\",\"艀艁艂艃艅艆艈艊艌艍艎艐\",7,\"艙艛艜艝艞艠\",7,\"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗\"],\n[\"c640\",\"艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸\"],\n[\"c680\",\"苺苼\",4,\"茊茋茍茐茒茓茖茘茙茝\",9,\"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐\"],\n[\"c740\",\"茾茿荁荂荄荅荈荊\",4,\"荓荕\",4,\"荝荢荰\",6,\"荹荺荾\",6,\"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡\",6,\"莬莭莮\"],\n[\"c780\",\"莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠\"],\n[\"c840\",\"菮華菳\",4,\"菺菻菼菾菿萀萂萅萇萈萉萊萐萒\",5,\"萙萚萛萞\",5,\"萩\",7,\"萲\",5,\"萹萺萻萾\",7,\"葇葈葉\"],\n[\"c880\",\"葊\",6,\"葒\",4,\"葘葝葞葟葠葢葤\",4,\"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁\"],\n[\"c940\",\"葽\",4,\"蒃蒄蒅蒆蒊蒍蒏\",7,\"蒘蒚蒛蒝蒞蒟蒠蒢\",12,\"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗\"],\n[\"c980\",\"蓘\",4,\"蓞蓡蓢蓤蓧\",4,\"蓭蓮蓯蓱\",10,\"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳\"],\n[\"ca40\",\"蔃\",8,\"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢\",8,\"蔭\",9,\"蔾\",4,\"蕄蕅蕆蕇蕋\",10],\n[\"ca80\",\"蕗蕘蕚蕛蕜蕝蕟\",4,\"蕥蕦蕧蕩\",8,\"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱\"],\n[\"cb40\",\"薂薃薆薈\",6,\"薐\",10,\"薝\",6,\"薥薦薧薩薫薬薭薱\",5,\"薸薺\",6,\"藂\",6,\"藊\",4,\"藑藒\"],\n[\"cb80\",\"藔藖\",5,\"藝\",6,\"藥藦藧藨藪\",14,\"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔\"],\n[\"cc40\",\"藹藺藼藽藾蘀\",4,\"蘆\",10,\"蘒蘓蘔蘕蘗\",15,\"蘨蘪\",13,\"蘹蘺蘻蘽蘾蘿虀\"],\n[\"cc80\",\"虁\",11,\"虒虓處\",4,\"虛虜虝號虠虡虣\",7,\"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃\"],\n[\"cd40\",\"虭虯虰虲\",6,\"蚃\",6,\"蚎\",4,\"蚔蚖\",5,\"蚞\",4,\"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻\",4,\"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜\"],\n[\"cd80\",\"蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威\"],\n[\"ce40\",\"蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀\",6,\"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚\",5,\"蝡蝢蝦\",7,\"蝯蝱蝲蝳蝵\"],\n[\"ce80\",\"蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎\",4,\"螔螕螖螘\",6,\"螠\",4,\"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺\"],\n[\"cf40\",\"螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁\",4,\"蟇蟈蟉蟌\",4,\"蟔\",6,\"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯\",9],\n[\"cf80\",\"蟺蟻蟼蟽蟿蠀蠁蠂蠄\",5,\"蠋\",7,\"蠔蠗蠘蠙蠚蠜\",4,\"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓\"],\n[\"d040\",\"蠤\",13,\"蠳\",5,\"蠺蠻蠽蠾蠿衁衂衃衆\",5,\"衎\",5,\"衕衖衘衚\",6,\"衦衧衪衭衯衱衳衴衵衶衸衹衺\"],\n[\"d080\",\"衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗\",4,\"袝\",4,\"袣袥\",5,\"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄\"],\n[\"d140\",\"袬袮袯袰袲\",4,\"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚\",4,\"裠裡裦裧裩\",6,\"裲裵裶裷裺裻製裿褀褁褃\",5],\n[\"d180\",\"褉褋\",4,\"褑褔\",4,\"褜\",4,\"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶\"],\n[\"d240\",\"褸\",8,\"襂襃襅\",24,\"襠\",5,\"襧\",19,\"襼\"],\n[\"d280\",\"襽襾覀覂覄覅覇\",26,\"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐\"],\n[\"d340\",\"覢\",30,\"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴\",6],\n[\"d380\",\"觻\",4,\"訁\",5,\"計\",21,\"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉\"],\n[\"d440\",\"訞\",31,\"訿\",8,\"詉\",21],\n[\"d480\",\"詟\",25,\"詺\",6,\"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧\"],\n[\"d540\",\"誁\",7,\"誋\",7,\"誔\",46],\n[\"d580\",\"諃\",32,\"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政\"],\n[\"d640\",\"諤\",34,\"謈\",27],\n[\"d680\",\"謤謥謧\",30,\"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑\"],\n[\"d740\",\"譆\",31,\"譧\",4,\"譭\",25],\n[\"d780\",\"讇\",24,\"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座\"],\n[\"d840\",\"谸\",8,\"豂豃豄豅豈豊豋豍\",7,\"豖豗豘豙豛\",5,\"豣\",6,\"豬\",6,\"豴豵豶豷豻\",6,\"貃貄貆貇\"],\n[\"d880\",\"貈貋貍\",6,\"貕貖貗貙\",20,\"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝\"],\n[\"d940\",\"貮\",62],\n[\"d980\",\"賭\",32,\"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼\"],\n[\"da40\",\"贎\",14,\"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸\",8,\"趂趃趆趇趈趉趌\",4,\"趒趓趕\",9,\"趠趡\"],\n[\"da80\",\"趢趤\",12,\"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺\"],\n[\"db40\",\"跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾\",6,\"踆踇踈踋踍踎踐踑踒踓踕\",7,\"踠踡踤\",4,\"踫踭踰踲踳踴踶踷踸踻踼踾\"],\n[\"db80\",\"踿蹃蹅蹆蹌\",4,\"蹓\",5,\"蹚\",11,\"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝\"],\n[\"dc40\",\"蹳蹵蹷\",4,\"蹽蹾躀躂躃躄躆躈\",6,\"躑躒躓躕\",6,\"躝躟\",11,\"躭躮躰躱躳\",6,\"躻\",7],\n[\"dc80\",\"軃\",10,\"軏\",21,\"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥\"],\n[\"dd40\",\"軥\",62],\n[\"dd80\",\"輤\",32,\"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺\"],\n[\"de40\",\"轅\",32,\"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆\"],\n[\"de80\",\"迉\",4,\"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖\"],\n[\"df40\",\"這逜連逤逥逧\",5,\"逰\",4,\"逷逹逺逽逿遀遃遅遆遈\",4,\"過達違遖遙遚遜\",5,\"遤遦遧適遪遫遬遯\",4,\"遶\",6,\"遾邁\"],\n[\"df80\",\"還邅邆邇邉邊邌\",4,\"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼\"],\n[\"e040\",\"郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅\",19,\"鄚鄛鄜\"],\n[\"e080\",\"鄝鄟鄠鄡鄤\",10,\"鄰鄲\",6,\"鄺\",8,\"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼\"],\n[\"e140\",\"酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀\",4,\"醆醈醊醎醏醓\",6,\"醜\",5,\"醤\",5,\"醫醬醰醱醲醳醶醷醸醹醻\"],\n[\"e180\",\"醼\",10,\"釈釋釐釒\",9,\"針\",8,\"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺\"],\n[\"e240\",\"釦\",62],\n[\"e280\",\"鈥\",32,\"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧\",5,\"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂\"],\n[\"e340\",\"鉆\",45,\"鉵\",16],\n[\"e380\",\"銆\",7,\"銏\",24,\"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾\"],\n[\"e440\",\"銨\",5,\"銯\",24,\"鋉\",31],\n[\"e480\",\"鋩\",32,\"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑\"],\n[\"e540\",\"錊\",51,\"錿\",10],\n[\"e580\",\"鍊\",31,\"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣\"],\n[\"e640\",\"鍬\",34,\"鎐\",27],\n[\"e680\",\"鎬\",29,\"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩\"],\n[\"e740\",\"鏎\",7,\"鏗\",54],\n[\"e780\",\"鐎\",32,\"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡\",6,\"缪缫缬缭缯\",4,\"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬\"],\n[\"e840\",\"鐯\",14,\"鐿\",43,\"鑬鑭鑮鑯\"],\n[\"e880\",\"鑰\",20,\"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹\"],\n[\"e940\",\"锧锳锽镃镈镋镕镚镠镮镴镵長\",7,\"門\",42],\n[\"e980\",\"閫\",32,\"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋\"],\n[\"ea40\",\"闌\",27,\"闬闿阇阓阘阛阞阠阣\",6,\"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗\"],\n[\"ea80\",\"陘陙陚陜陝陞陠陣陥陦陫陭\",4,\"陳陸\",12,\"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰\"],\n[\"eb40\",\"隌階隑隒隓隕隖隚際隝\",9,\"隨\",7,\"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖\",9,\"雡\",6,\"雫\"],\n[\"eb80\",\"雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗\",4,\"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻\"],\n[\"ec40\",\"霡\",8,\"霫霬霮霯霱霳\",4,\"霺霻霼霽霿\",18,\"靔靕靗靘靚靜靝靟靣靤靦靧靨靪\",7],\n[\"ec80\",\"靲靵靷\",4,\"靽\",7,\"鞆\",4,\"鞌鞎鞏鞐鞓鞕鞖鞗鞙\",4,\"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐\"],\n[\"ed40\",\"鞞鞟鞡鞢鞤\",6,\"鞬鞮鞰鞱鞳鞵\",46],\n[\"ed80\",\"韤韥韨韮\",4,\"韴韷\",23,\"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨\"],\n[\"ee40\",\"頏\",62],\n[\"ee80\",\"顎\",32,\"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶\",4,\"钼钽钿铄铈\",6,\"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪\"],\n[\"ef40\",\"顯\",5,\"颋颎颒颕颙颣風\",37,\"飏飐飔飖飗飛飜飝飠\",4],\n[\"ef80\",\"飥飦飩\",30,\"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒\",4,\"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤\",8,\"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔\"],\n[\"f040\",\"餈\",4,\"餎餏餑\",28,\"餯\",26],\n[\"f080\",\"饊\",9,\"饖\",12,\"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨\",4,\"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦\",6,\"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙\"],\n[\"f140\",\"馌馎馚\",10,\"馦馧馩\",47],\n[\"f180\",\"駙\",32,\"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃\"],\n[\"f240\",\"駺\",62],\n[\"f280\",\"騹\",32,\"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒\"],\n[\"f340\",\"驚\",17,\"驲骃骉骍骎骔骕骙骦骩\",6,\"骲骳骴骵骹骻骽骾骿髃髄髆\",4,\"髍髎髏髐髒體髕髖髗髙髚髛髜\"],\n[\"f380\",\"髝髞髠髢髣髤髥髧髨髩髪髬髮髰\",8,\"髺髼\",6,\"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋\"],\n[\"f440\",\"鬇鬉\",5,\"鬐鬑鬒鬔\",10,\"鬠鬡鬢鬤\",10,\"鬰鬱鬳\",7,\"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕\",5],\n[\"f480\",\"魛\",32,\"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤\"],\n[\"f540\",\"魼\",62],\n[\"f580\",\"鮻\",32,\"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜\"],\n[\"f640\",\"鯜\",62],\n[\"f680\",\"鰛\",32,\"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅\",5,\"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞\",5,\"鲥\",4,\"鲫鲭鲮鲰\",7,\"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋\"],\n[\"f740\",\"鰼\",62],\n[\"f780\",\"鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾\",4,\"鳈鳉鳑鳒鳚鳛鳠鳡鳌\",4,\"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄\"],\n[\"f840\",\"鳣\",62],\n[\"f880\",\"鴢\",32],\n[\"f940\",\"鵃\",62],\n[\"f980\",\"鶂\",32],\n[\"fa40\",\"鶣\",62],\n[\"fa80\",\"鷢\",32],\n[\"fb40\",\"鸃\",27,\"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴\",9,\"麀\"],\n[\"fb80\",\"麁麃麄麅麆麉麊麌\",5,\"麔\",8,\"麞麠\",5,\"麧麨麩麪\"],\n[\"fc40\",\"麫\",8,\"麵麶麷麹麺麼麿\",4,\"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰\",8,\"黺黽黿\",6],\n[\"fc80\",\"鼆\",4,\"鼌鼏鼑鼒鼔鼕鼖鼘鼚\",5,\"鼡鼣\",8,\"鼭鼮鼰鼱\"],\n[\"fd40\",\"鼲\",4,\"鼸鼺鼼鼿\",4,\"齅\",10,\"齒\",38],\n[\"fd80\",\"齹\",5,\"龁龂龍\",11,\"龜龝龞龡\",4,\"郎凉秊裏隣\"],\n[\"fe40\",\"兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/cp949.json",
    "content": "[\n[\"0\",\"\\u0000\",127],\n[\"8141\",\"갂갃갅갆갋\",4,\"갘갞갟갡갢갣갥\",6,\"갮갲갳갴\"],\n[\"8161\",\"갵갶갷갺갻갽갾갿걁\",9,\"걌걎\",5,\"걕\"],\n[\"8181\",\"걖걗걙걚걛걝\",18,\"걲걳걵걶걹걻\",4,\"겂겇겈겍겎겏겑겒겓겕\",6,\"겞겢\",5,\"겫겭겮겱\",6,\"겺겾겿곀곂곃곅곆곇곉곊곋곍\",7,\"곖곘\",7,\"곢곣곥곦곩곫곭곮곲곴곷\",4,\"곾곿괁괂괃괅괇\",4,\"괎괐괒괓\"],\n[\"8241\",\"괔괕괖괗괙괚괛괝괞괟괡\",7,\"괪괫괮\",5],\n[\"8261\",\"괶괷괹괺괻괽\",6,\"굆굈굊\",5,\"굑굒굓굕굖굗\"],\n[\"8281\",\"굙\",7,\"굢굤\",7,\"굮굯굱굲굷굸굹굺굾궀궃\",4,\"궊궋궍궎궏궑\",10,\"궞\",5,\"궥\",17,\"궸\",7,\"귂귃귅귆귇귉\",6,\"귒귔\",7,\"귝귞귟귡귢귣귥\",18],\n[\"8341\",\"귺귻귽귾긂\",5,\"긊긌긎\",5,\"긕\",7],\n[\"8361\",\"긝\",18,\"긲긳긵긶긹긻긼\"],\n[\"8381\",\"긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗\",4,\"깞깢깣깤깦깧깪깫깭깮깯깱\",6,\"깺깾\",5,\"꺆\",5,\"꺍\",46,\"꺿껁껂껃껅\",6,\"껎껒\",5,\"껚껛껝\",8],\n[\"8441\",\"껦껧껩껪껬껮\",5,\"껵껶껷껹껺껻껽\",8],\n[\"8461\",\"꼆꼉꼊꼋꼌꼎꼏꼑\",18],\n[\"8481\",\"꼤\",7,\"꼮꼯꼱꼳꼵\",6,\"꼾꽀꽄꽅꽆꽇꽊\",5,\"꽑\",10,\"꽞\",5,\"꽦\",18,\"꽺\",5,\"꾁꾂꾃꾅꾆꾇꾉\",6,\"꾒꾓꾔꾖\",5,\"꾝\",26,\"꾺꾻꾽꾾\"],\n[\"8541\",\"꾿꿁\",5,\"꿊꿌꿏\",4,\"꿕\",6,\"꿝\",4],\n[\"8561\",\"꿢\",5,\"꿪\",5,\"꿲꿳꿵꿶꿷꿹\",6,\"뀂뀃\"],\n[\"8581\",\"뀅\",6,\"뀍뀎뀏뀑뀒뀓뀕\",6,\"뀞\",9,\"뀩\",26,\"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞\",29,\"끾끿낁낂낃낅\",6,\"낎낐낒\",5,\"낛낝낞낣낤\"],\n[\"8641\",\"낥낦낧낪낰낲낶낷낹낺낻낽\",6,\"냆냊\",5,\"냒\"],\n[\"8661\",\"냓냕냖냗냙\",6,\"냡냢냣냤냦\",10],\n[\"8681\",\"냱\",22,\"넊넍넎넏넑넔넕넖넗넚넞\",4,\"넦넧넩넪넫넭\",6,\"넶넺\",5,\"녂녃녅녆녇녉\",6,\"녒녓녖녗녙녚녛녝녞녟녡\",22,\"녺녻녽녾녿놁놃\",4,\"놊놌놎놏놐놑놕놖놗놙놚놛놝\"],\n[\"8741\",\"놞\",9,\"놩\",15],\n[\"8761\",\"놹\",18,\"뇍뇎뇏뇑뇒뇓뇕\"],\n[\"8781\",\"뇖\",5,\"뇞뇠\",7,\"뇪뇫뇭뇮뇯뇱\",7,\"뇺뇼뇾\",5,\"눆눇눉눊눍\",6,\"눖눘눚\",5,\"눡\",18,\"눵\",6,\"눽\",26,\"뉙뉚뉛뉝뉞뉟뉡\",6,\"뉪\",4],\n[\"8841\",\"뉯\",4,\"뉶\",5,\"뉽\",6,\"늆늇늈늊\",4],\n[\"8861\",\"늏늒늓늕늖늗늛\",4,\"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷\"],\n[\"8881\",\"늸\",15,\"닊닋닍닎닏닑닓\",4,\"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉\",6,\"댒댖\",5,\"댝\",54,\"덗덙덚덝덠덡덢덣\"],\n[\"8941\",\"덦덨덪덬덭덯덲덳덵덶덷덹\",6,\"뎂뎆\",5,\"뎍\"],\n[\"8961\",\"뎎뎏뎑뎒뎓뎕\",10,\"뎢\",5,\"뎩뎪뎫뎭\"],\n[\"8981\",\"뎮\",21,\"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩\",18,\"돽\",18,\"됑\",6,\"됙됚됛됝됞됟됡\",6,\"됪됬\",7,\"됵\",15],\n[\"8a41\",\"둅\",10,\"둒둓둕둖둗둙\",6,\"둢둤둦\"],\n[\"8a61\",\"둧\",4,\"둭\",18,\"뒁뒂\"],\n[\"8a81\",\"뒃\",4,\"뒉\",19,\"뒞\",5,\"뒥뒦뒧뒩뒪뒫뒭\",7,\"뒶뒸뒺\",5,\"듁듂듃듅듆듇듉\",6,\"듑듒듓듔듖\",5,\"듞듟듡듢듥듧\",4,\"듮듰듲\",5,\"듹\",26,\"딖딗딙딚딝\"],\n[\"8b41\",\"딞\",5,\"딦딫\",4,\"딲딳딵딶딷딹\",6,\"땂땆\"],\n[\"8b61\",\"땇땈땉땊땎땏땑땒땓땕\",6,\"땞땢\",8],\n[\"8b81\",\"땫\",52,\"떢떣떥떦떧떩떬떭떮떯떲떶\",4,\"떾떿뗁뗂뗃뗅\",6,\"뗎뗒\",5,\"뗙\",18,\"뗭\",18],\n[\"8c41\",\"똀\",15,\"똒똓똕똖똗똙\",4],\n[\"8c61\",\"똞\",6,\"똦\",5,\"똭\",6,\"똵\",5],\n[\"8c81\",\"똻\",12,\"뙉\",26,\"뙥뙦뙧뙩\",50,\"뚞뚟뚡뚢뚣뚥\",5,\"뚭뚮뚯뚰뚲\",16],\n[\"8d41\",\"뛃\",16,\"뛕\",8],\n[\"8d61\",\"뛞\",17,\"뛱뛲뛳뛵뛶뛷뛹뛺\"],\n[\"8d81\",\"뛻\",4,\"뜂뜃뜄뜆\",33,\"뜪뜫뜭뜮뜱\",6,\"뜺뜼\",7,\"띅띆띇띉띊띋띍\",6,\"띖\",9,\"띡띢띣띥띦띧띩\",6,\"띲띴띶\",5,\"띾띿랁랂랃랅\",6,\"랎랓랔랕랚랛랝랞\"],\n[\"8e41\",\"랟랡\",6,\"랪랮\",5,\"랶랷랹\",8],\n[\"8e61\",\"럂\",4,\"럈럊\",19],\n[\"8e81\",\"럞\",13,\"럮럯럱럲럳럵\",6,\"럾렂\",4,\"렊렋렍렎렏렑\",6,\"렚렜렞\",5,\"렦렧렩렪렫렭\",6,\"렶렺\",5,\"롁롂롃롅\",11,\"롒롔\",7,\"롞롟롡롢롣롥\",6,\"롮롰롲\",5,\"롹롺롻롽\",7],\n[\"8f41\",\"뢅\",7,\"뢎\",17],\n[\"8f61\",\"뢠\",7,\"뢩\",6,\"뢱뢲뢳뢵뢶뢷뢹\",4],\n[\"8f81\",\"뢾뢿룂룄룆\",5,\"룍룎룏룑룒룓룕\",7,\"룞룠룢\",5,\"룪룫룭룮룯룱\",6,\"룺룼룾\",5,\"뤅\",18,\"뤙\",6,\"뤡\",26,\"뤾뤿륁륂륃륅\",6,\"륍륎륐륒\",5],\n[\"9041\",\"륚륛륝륞륟륡\",6,\"륪륬륮\",5,\"륶륷륹륺륻륽\"],\n[\"9061\",\"륾\",5,\"릆릈릋릌릏\",15],\n[\"9081\",\"릟\",12,\"릮릯릱릲릳릵\",6,\"릾맀맂\",5,\"맊맋맍맓\",4,\"맚맜맟맠맢맦맧맩맪맫맭\",6,\"맶맻\",4,\"먂\",5,\"먉\",11,\"먖\",33,\"먺먻먽먾먿멁멃멄멅멆\"],\n[\"9141\",\"멇멊멌멏멐멑멒멖멗멙멚멛멝\",6,\"멦멪\",5],\n[\"9161\",\"멲멳멵멶멷멹\",9,\"몆몈몉몊몋몍\",5],\n[\"9181\",\"몓\",20,\"몪몭몮몯몱몳\",4,\"몺몼몾\",5,\"뫅뫆뫇뫉\",14,\"뫚\",33,\"뫽뫾뫿묁묂묃묅\",7,\"묎묐묒\",5,\"묙묚묛묝묞묟묡\",6],\n[\"9241\",\"묨묪묬\",7,\"묷묹묺묿\",4,\"뭆뭈뭊뭋뭌뭎뭑뭒\"],\n[\"9261\",\"뭓뭕뭖뭗뭙\",7,\"뭢뭤\",7,\"뭭\",4],\n[\"9281\",\"뭲\",21,\"뮉뮊뮋뮍뮎뮏뮑\",18,\"뮥뮦뮧뮩뮪뮫뮭\",6,\"뮵뮶뮸\",7,\"믁믂믃믅믆믇믉\",6,\"믑믒믔\",35,\"믺믻믽믾밁\"],\n[\"9341\",\"밃\",4,\"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵\"],\n[\"9361\",\"밶밷밹\",6,\"뱂뱆뱇뱈뱊뱋뱎뱏뱑\",8],\n[\"9381\",\"뱚뱛뱜뱞\",37,\"벆벇벉벊벍벏\",4,\"벖벘벛\",4,\"벢벣벥벦벩\",6,\"벲벶\",5,\"벾벿볁볂볃볅\",7,\"볎볒볓볔볖볗볙볚볛볝\",22,\"볷볹볺볻볽\"],\n[\"9441\",\"볾\",5,\"봆봈봊\",5,\"봑봒봓봕\",8],\n[\"9461\",\"봞\",5,\"봥\",6,\"봭\",12],\n[\"9481\",\"봺\",5,\"뵁\",6,\"뵊뵋뵍뵎뵏뵑\",6,\"뵚\",9,\"뵥뵦뵧뵩\",22,\"붂붃붅붆붋\",4,\"붒붔붖붗붘붛붝\",6,\"붥\",10,\"붱\",6,\"붹\",24],\n[\"9541\",\"뷒뷓뷖뷗뷙뷚뷛뷝\",11,\"뷪\",5,\"뷱\"],\n[\"9561\",\"뷲뷳뷵뷶뷷뷹\",6,\"븁븂븄븆\",5,\"븎븏븑븒븓\"],\n[\"9581\",\"븕\",6,\"븞븠\",35,\"빆빇빉빊빋빍빏\",4,\"빖빘빜빝빞빟빢빣빥빦빧빩빫\",4,\"빲빶\",4,\"빾빿뺁뺂뺃뺅\",6,\"뺎뺒\",5,\"뺚\",13,\"뺩\",14],\n[\"9641\",\"뺸\",23,\"뻒뻓\"],\n[\"9661\",\"뻕뻖뻙\",6,\"뻡뻢뻦\",5,\"뻭\",8],\n[\"9681\",\"뻶\",10,\"뼂\",5,\"뼊\",13,\"뼚뼞\",33,\"뽂뽃뽅뽆뽇뽉\",6,\"뽒뽓뽔뽖\",44],\n[\"9741\",\"뾃\",16,\"뾕\",8],\n[\"9761\",\"뾞\",17,\"뾱\",7],\n[\"9781\",\"뾹\",11,\"뿆\",5,\"뿎뿏뿑뿒뿓뿕\",6,\"뿝뿞뿠뿢\",89,\"쀽쀾쀿\"],\n[\"9841\",\"쁀\",16,\"쁒\",5,\"쁙쁚쁛\"],\n[\"9861\",\"쁝쁞쁟쁡\",6,\"쁪\",15],\n[\"9881\",\"쁺\",21,\"삒삓삕삖삗삙\",6,\"삢삤삦\",5,\"삮삱삲삷\",4,\"삾샂샃샄샆샇샊샋샍샎샏샑\",6,\"샚샞\",5,\"샦샧샩샪샫샭\",6,\"샶샸샺\",5,\"섁섂섃섅섆섇섉\",6,\"섑섒섓섔섖\",5,\"섡섢섥섨섩섪섫섮\"],\n[\"9941\",\"섲섳섴섵섷섺섻섽섾섿셁\",6,\"셊셎\",5,\"셖셗\"],\n[\"9961\",\"셙셚셛셝\",6,\"셦셪\",5,\"셱셲셳셵셶셷셹셺셻\"],\n[\"9981\",\"셼\",8,\"솆\",5,\"솏솑솒솓솕솗\",4,\"솞솠솢솣솤솦솧솪솫솭솮솯솱\",11,\"솾\",5,\"쇅쇆쇇쇉쇊쇋쇍\",6,\"쇕쇖쇙\",6,\"쇡쇢쇣쇥쇦쇧쇩\",6,\"쇲쇴\",7,\"쇾쇿숁숂숃숅\",6,\"숎숐숒\",5,\"숚숛숝숞숡숢숣\"],\n[\"9a41\",\"숤숥숦숧숪숬숮숰숳숵\",16],\n[\"9a61\",\"쉆쉇쉉\",6,\"쉒쉓쉕쉖쉗쉙\",6,\"쉡쉢쉣쉤쉦\"],\n[\"9a81\",\"쉧\",4,\"쉮쉯쉱쉲쉳쉵\",6,\"쉾슀슂\",5,\"슊\",5,\"슑\",6,\"슙슚슜슞\",5,\"슦슧슩슪슫슮\",5,\"슶슸슺\",33,\"싞싟싡싢싥\",5,\"싮싰싲싳싴싵싷싺싽싾싿쌁\",6,\"쌊쌋쌎쌏\"],\n[\"9b41\",\"쌐쌑쌒쌖쌗쌙쌚쌛쌝\",6,\"쌦쌧쌪\",8],\n[\"9b61\",\"쌳\",17,\"썆\",7],\n[\"9b81\",\"썎\",25,\"썪썫썭썮썯썱썳\",4,\"썺썻썾\",5,\"쎅쎆쎇쎉쎊쎋쎍\",50,\"쏁\",22,\"쏚\"],\n[\"9c41\",\"쏛쏝쏞쏡쏣\",4,\"쏪쏫쏬쏮\",5,\"쏶쏷쏹\",5],\n[\"9c61\",\"쏿\",8,\"쐉\",6,\"쐑\",9],\n[\"9c81\",\"쐛\",8,\"쐥\",6,\"쐭쐮쐯쐱쐲쐳쐵\",6,\"쐾\",9,\"쑉\",26,\"쑦쑧쑩쑪쑫쑭\",6,\"쑶쑷쑸쑺\",5,\"쒁\",18,\"쒕\",6,\"쒝\",12],\n[\"9d41\",\"쒪\",13,\"쒹쒺쒻쒽\",8],\n[\"9d61\",\"쓆\",25],\n[\"9d81\",\"쓠\",8,\"쓪\",5,\"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂\",9,\"씍씎씏씑씒씓씕\",6,\"씝\",10,\"씪씫씭씮씯씱\",6,\"씺씼씾\",5,\"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩\",6,\"앲앶\",5,\"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔\"],\n[\"9e41\",\"얖얙얚얛얝얞얟얡\",7,\"얪\",9,\"얶\"],\n[\"9e61\",\"얷얺얿\",4,\"엋엍엏엒엓엕엖엗엙\",6,\"엢엤엦엧\"],\n[\"9e81\",\"엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑\",6,\"옚옝\",6,\"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉\",6,\"왒왖\",5,\"왞왟왡\",10,\"왭왮왰왲\",5,\"왺왻왽왾왿욁\",6,\"욊욌욎\",5,\"욖욗욙욚욛욝\",6,\"욦\"],\n[\"9f41\",\"욨욪\",5,\"욲욳욵욶욷욻\",4,\"웂웄웆\",5,\"웎\"],\n[\"9f61\",\"웏웑웒웓웕\",6,\"웞웟웢\",5,\"웪웫웭웮웯웱웲\"],\n[\"9f81\",\"웳\",4,\"웺웻웼웾\",5,\"윆윇윉윊윋윍\",6,\"윖윘윚\",5,\"윢윣윥윦윧윩\",6,\"윲윴윶윸윹윺윻윾윿읁읂읃읅\",4,\"읋읎읐읙읚읛읝읞읟읡\",6,\"읩읪읬\",7,\"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛\",4,\"잢잧\",4,\"잮잯잱잲잳잵잶잷\"],\n[\"a041\",\"잸잹잺잻잾쟂\",5,\"쟊쟋쟍쟏쟑\",6,\"쟙쟚쟛쟜\"],\n[\"a061\",\"쟞\",5,\"쟥쟦쟧쟩쟪쟫쟭\",13],\n[\"a081\",\"쟻\",4,\"젂젃젅젆젇젉젋\",4,\"젒젔젗\",4,\"젞젟젡젢젣젥\",6,\"젮젰젲\",5,\"젹젺젻젽젾젿졁\",6,\"졊졋졎\",5,\"졕\",26,\"졲졳졵졶졷졹졻\",4,\"좂좄좈좉좊좎\",5,\"좕\",7,\"좞좠좢좣좤\"],\n[\"a141\",\"좥좦좧좩\",18,\"좾좿죀죁\"],\n[\"a161\",\"죂죃죅죆죇죉죊죋죍\",6,\"죖죘죚\",5,\"죢죣죥\"],\n[\"a181\",\"죦\",14,\"죶\",5,\"죾죿줁줂줃줇\",4,\"줎　、。·‥…¨〃­―∥＼∼‘’“”〔〕〈\",9,\"±×÷≠≤≥∞∴°′″℃Å￠￡￥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨￢\"],\n[\"a241\",\"줐줒\",5,\"줙\",18],\n[\"a261\",\"줭\",6,\"줵\",18],\n[\"a281\",\"쥈\",7,\"쥒쥓쥕쥖쥗쥙\",6,\"쥢쥤\",7,\"쥭쥮쥯⇒⇔∀∃´～ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®\"],\n[\"a341\",\"쥱쥲쥳쥵\",6,\"쥽\",10,\"즊즋즍즎즏\"],\n[\"a361\",\"즑\",6,\"즚즜즞\",16],\n[\"a381\",\"즯\",16,\"짂짃짅짆짉짋\",4,\"짒짔짗짘짛！\",58,\"￦］\",32,\"￣\"],\n[\"a441\",\"짞짟짡짣짥짦짨짩짪짫짮짲\",5,\"짺짻짽짾짿쨁쨂쨃쨄\"],\n[\"a461\",\"쨅쨆쨇쨊쨎\",5,\"쨕쨖쨗쨙\",12],\n[\"a481\",\"쨦쨧쨨쨪\",28,\"ㄱ\",93],\n[\"a541\",\"쩇\",4,\"쩎쩏쩑쩒쩓쩕\",6,\"쩞쩢\",5,\"쩩쩪\"],\n[\"a561\",\"쩫\",17,\"쩾\",5,\"쪅쪆\"],\n[\"a581\",\"쪇\",16,\"쪙\",14,\"ⅰ\",9],\n[\"a5b0\",\"Ⅰ\",9],\n[\"a5c1\",\"Α\",16,\"Σ\",6],\n[\"a5e1\",\"α\",16,\"σ\",6],\n[\"a641\",\"쪨\",19,\"쪾쪿쫁쫂쫃쫅\"],\n[\"a661\",\"쫆\",5,\"쫎쫐쫒쫔쫕쫖쫗쫚\",5,\"쫡\",6],\n[\"a681\",\"쫨쫩쫪쫫쫭\",6,\"쫵\",18,\"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃\",7],\n[\"a741\",\"쬋\",4,\"쬑쬒쬓쬕쬖쬗쬙\",6,\"쬢\",7],\n[\"a761\",\"쬪\",22,\"쭂쭃쭄\"],\n[\"a781\",\"쭅쭆쭇쭊쭋쭍쭎쭏쭑\",6,\"쭚쭛쭜쭞\",5,\"쭥\",7,\"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙\",9,\"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰\",9,\"㎀\",4,\"㎺\",5,\"㎐\",4,\"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆\"],\n[\"a841\",\"쭭\",10,\"쭺\",14],\n[\"a861\",\"쮉\",18,\"쮝\",6],\n[\"a881\",\"쮤\",19,\"쮹\",11,\"ÆÐªĦ\"],\n[\"a8a6\",\"Ĳ\"],\n[\"a8a8\",\"ĿŁØŒºÞŦŊ\"],\n[\"a8b1\",\"㉠\",27,\"ⓐ\",25,\"①\",14,\"½⅓⅔¼¾⅛⅜⅝⅞\"],\n[\"a941\",\"쯅\",14,\"쯕\",10],\n[\"a961\",\"쯠쯡쯢쯣쯥쯦쯨쯪\",18],\n[\"a981\",\"쯽\",14,\"찎찏찑찒찓찕\",6,\"찞찟찠찣찤æđðħıĳĸŀłøœßþŧŋŉ㈀\",27,\"⒜\",25,\"⑴\",14,\"¹²³⁴ⁿ₁₂₃₄\"],\n[\"aa41\",\"찥찦찪찫찭찯찱\",6,\"찺찿\",4,\"챆챇챉챊챋챍챎\"],\n[\"aa61\",\"챏\",4,\"챖챚\",5,\"챡챢챣챥챧챩\",6,\"챱챲\"],\n[\"aa81\",\"챳챴챶\",29,\"ぁ\",82],\n[\"ab41\",\"첔첕첖첗첚첛첝첞첟첡\",6,\"첪첮\",5,\"첶첷첹\"],\n[\"ab61\",\"첺첻첽\",6,\"쳆쳈쳊\",5,\"쳑쳒쳓쳕\",5],\n[\"ab81\",\"쳛\",8,\"쳥\",6,\"쳭쳮쳯쳱\",12,\"ァ\",85],\n[\"ac41\",\"쳾쳿촀촂\",5,\"촊촋촍촎촏촑\",6,\"촚촜촞촟촠\"],\n[\"ac61\",\"촡촢촣촥촦촧촩촪촫촭\",11,\"촺\",4],\n[\"ac81\",\"촿\",28,\"쵝쵞쵟А\",5,\"ЁЖ\",25],\n[\"acd1\",\"а\",5,\"ёж\",25],\n[\"ad41\",\"쵡쵢쵣쵥\",6,\"쵮쵰쵲\",5,\"쵹\",7],\n[\"ad61\",\"춁\",6,\"춉\",10,\"춖춗춙춚춛춝춞춟\"],\n[\"ad81\",\"춠춡춢춣춦춨춪\",5,\"춱\",18,\"췅\"],\n[\"ae41\",\"췆\",5,\"췍췎췏췑\",16],\n[\"ae61\",\"췢\",5,\"췩췪췫췭췮췯췱\",6,\"췺췼췾\",4],\n[\"ae81\",\"츃츅츆츇츉츊츋츍\",6,\"츕츖츗츘츚\",5,\"츢츣츥츦츧츩츪츫\"],\n[\"af41\",\"츬츭츮츯츲츴츶\",19],\n[\"af61\",\"칊\",13,\"칚칛칝칞칢\",5,\"칪칬\"],\n[\"af81\",\"칮\",5,\"칶칷칹칺칻칽\",6,\"캆캈캊\",5,\"캒캓캕캖캗캙\"],\n[\"b041\",\"캚\",5,\"캢캦\",5,\"캮\",12],\n[\"b061\",\"캻\",5,\"컂\",19],\n[\"b081\",\"컖\",13,\"컦컧컩컪컭\",6,\"컶컺\",5,\"가각간갇갈갉갊감\",7,\"같\",4,\"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆\"],\n[\"b141\",\"켂켃켅켆켇켉\",6,\"켒켔켖\",5,\"켝켞켟켡켢켣\"],\n[\"b161\",\"켥\",6,\"켮켲\",5,\"켹\",11],\n[\"b181\",\"콅\",14,\"콖콗콙콚콛콝\",6,\"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸\"],\n[\"b241\",\"콭콮콯콲콳콵콶콷콹\",6,\"쾁쾂쾃쾄쾆\",5,\"쾍\"],\n[\"b261\",\"쾎\",18,\"쾢\",5,\"쾩\"],\n[\"b281\",\"쾪\",5,\"쾱\",18,\"쿅\",6,\"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙\"],\n[\"b341\",\"쿌\",19,\"쿢쿣쿥쿦쿧쿩\"],\n[\"b361\",\"쿪\",5,\"쿲쿴쿶\",5,\"쿽쿾쿿퀁퀂퀃퀅\",5],\n[\"b381\",\"퀋\",5,\"퀒\",5,\"퀙\",19,\"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫\",4,\"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝\"],\n[\"b441\",\"퀮\",5,\"퀶퀷퀹퀺퀻퀽\",6,\"큆큈큊\",5],\n[\"b461\",\"큑큒큓큕큖큗큙\",6,\"큡\",10,\"큮큯\"],\n[\"b481\",\"큱큲큳큵\",6,\"큾큿킀킂\",18,\"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫\",4,\"닳담답닷\",4,\"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥\"],\n[\"b541\",\"킕\",14,\"킦킧킩킪킫킭\",5],\n[\"b561\",\"킳킶킸킺\",5,\"탂탃탅탆탇탊\",5,\"탒탖\",4],\n[\"b581\",\"탛탞탟탡탢탣탥\",6,\"탮탲\",5,\"탹\",11,\"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸\"],\n[\"b641\",\"턅\",7,\"턎\",17],\n[\"b661\",\"턠\",15,\"턲턳턵턶턷턹턻턼턽턾\"],\n[\"b681\",\"턿텂텆\",5,\"텎텏텑텒텓텕\",6,\"텞텠텢\",5,\"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗\"],\n[\"b741\",\"텮\",13,\"텽\",6,\"톅톆톇톉톊\"],\n[\"b761\",\"톋\",20,\"톢톣톥톦톧\"],\n[\"b781\",\"톩\",6,\"톲톴톶톷톸톹톻톽톾톿퇁\",14,\"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩\"],\n[\"b841\",\"퇐\",7,\"퇙\",17],\n[\"b861\",\"퇫\",8,\"퇵퇶퇷퇹\",13],\n[\"b881\",\"툈툊\",5,\"툑\",24,\"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많\",4,\"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼\"],\n[\"b941\",\"툪툫툮툯툱툲툳툵\",6,\"툾퉀퉂\",5,\"퉉퉊퉋퉌\"],\n[\"b961\",\"퉍\",14,\"퉝\",6,\"퉥퉦퉧퉨\"],\n[\"b981\",\"퉩\",22,\"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바\",4,\"받\",4,\"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗\"],\n[\"ba41\",\"튍튎튏튒튓튔튖\",5,\"튝튞튟튡튢튣튥\",6,\"튭\"],\n[\"ba61\",\"튮튯튰튲\",5,\"튺튻튽튾틁틃\",4,\"틊틌\",5],\n[\"ba81\",\"틒틓틕틖틗틙틚틛틝\",6,\"틦\",9,\"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤\"],\n[\"bb41\",\"틻\",4,\"팂팄팆\",5,\"팏팑팒팓팕팗\",4,\"팞팢팣\"],\n[\"bb61\",\"팤팦팧팪팫팭팮팯팱\",6,\"팺팾\",5,\"퍆퍇퍈퍉\"],\n[\"bb81\",\"퍊\",31,\"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤\"],\n[\"bc41\",\"퍪\",17,\"퍾퍿펁펂펃펅펆펇\"],\n[\"bc61\",\"펈펉펊펋펎펒\",5,\"펚펛펝펞펟펡\",6,\"펪펬펮\"],\n[\"bc81\",\"펯\",4,\"펵펶펷펹펺펻펽\",6,\"폆폇폊\",5,\"폑\",5,\"샥샨샬샴샵샷샹섀섄섈섐섕서\",4,\"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭\"],\n[\"bd41\",\"폗폙\",7,\"폢폤\",7,\"폮폯폱폲폳폵폶폷\"],\n[\"bd61\",\"폸폹폺폻폾퐀퐂\",5,\"퐉\",13],\n[\"bd81\",\"퐗\",5,\"퐞\",25,\"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰\"],\n[\"be41\",\"퐸\",7,\"푁푂푃푅\",14],\n[\"be61\",\"푔\",7,\"푝푞푟푡푢푣푥\",7,\"푮푰푱푲\"],\n[\"be81\",\"푳\",4,\"푺푻푽푾풁풃\",4,\"풊풌풎\",5,\"풕\",8,\"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄\",6,\"엌엎\"],\n[\"bf41\",\"풞\",10,\"풪\",14],\n[\"bf61\",\"풹\",18,\"퓍퓎퓏퓑퓒퓓퓕\"],\n[\"bf81\",\"퓖\",5,\"퓝퓞퓠\",7,\"퓩퓪퓫퓭퓮퓯퓱\",6,\"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염\",5,\"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨\"],\n[\"c041\",\"퓾\",5,\"픅픆픇픉픊픋픍\",6,\"픖픘\",5],\n[\"c061\",\"픞\",25],\n[\"c081\",\"픸픹픺픻픾픿핁핂핃핅\",6,\"핎핐핒\",5,\"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응\",7,\"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊\"],\n[\"c141\",\"핤핦핧핪핬핮\",5,\"핶핷핹핺핻핽\",6,\"햆햊햋\"],\n[\"c161\",\"햌햍햎햏햑\",19,\"햦햧\"],\n[\"c181\",\"햨\",31,\"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓\"],\n[\"c241\",\"헊헋헍헎헏헑헓\",4,\"헚헜헞\",5,\"헦헧헩헪헫헭헮\"],\n[\"c261\",\"헯\",4,\"헶헸헺\",5,\"혂혃혅혆혇혉\",6,\"혒\"],\n[\"c281\",\"혖\",5,\"혝혞혟혡혢혣혥\",7,\"혮\",9,\"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻\"],\n[\"c341\",\"혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝\",4],\n[\"c361\",\"홢\",4,\"홨홪\",5,\"홲홳홵\",11],\n[\"c381\",\"횁횂횄횆\",5,\"횎횏횑횒횓횕\",7,\"횞횠횢\",5,\"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층\"],\n[\"c441\",\"횫횭횮횯횱\",7,\"횺횼\",7,\"훆훇훉훊훋\"],\n[\"c461\",\"훍훎훏훐훒훓훕훖훘훚\",5,\"훡훢훣훥훦훧훩\",4],\n[\"c481\",\"훮훯훱훲훳훴훶\",5,\"훾훿휁휂휃휅\",11,\"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼\"],\n[\"c541\",\"휕휖휗휚휛휝휞휟휡\",6,\"휪휬휮\",5,\"휶휷휹\"],\n[\"c561\",\"휺휻휽\",6,\"흅흆흈흊\",5,\"흒흓흕흚\",4],\n[\"c581\",\"흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵\",6,\"흾흿힀힂\",5,\"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜\"],\n[\"c641\",\"힍힎힏힑\",6,\"힚힜힞\",5],\n[\"c6a1\",\"퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁\"],\n[\"c7a1\",\"퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠\"],\n[\"c8a1\",\"혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝\"],\n[\"caa1\",\"伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕\"],\n[\"cba1\",\"匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢\"],\n[\"cca1\",\"瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械\"],\n[\"cda1\",\"棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜\"],\n[\"cea1\",\"科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾\"],\n[\"cfa1\",\"區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴\"],\n[\"d0a1\",\"鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣\"],\n[\"d1a1\",\"朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩\",5,\"那樂\",4,\"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉\"],\n[\"d2a1\",\"納臘蠟衲囊娘廊\",4,\"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧\",5,\"駑魯\",10,\"濃籠聾膿農惱牢磊腦賂雷尿壘\",7,\"嫩訥杻紐勒\",5,\"能菱陵尼泥匿溺多茶\"],\n[\"d3a1\",\"丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃\"],\n[\"d4a1\",\"棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅\"],\n[\"d5a1\",\"蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣\"],\n[\"d6a1\",\"煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼\"],\n[\"d7a1\",\"遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬\"],\n[\"d8a1\",\"立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅\"],\n[\"d9a1\",\"蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文\"],\n[\"daa1\",\"汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑\"],\n[\"dba1\",\"發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖\"],\n[\"dca1\",\"碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦\"],\n[\"dda1\",\"孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥\"],\n[\"dea1\",\"脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索\"],\n[\"dfa1\",\"傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署\"],\n[\"e0a1\",\"胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬\"],\n[\"e1a1\",\"聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁\"],\n[\"e2a1\",\"戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧\"],\n[\"e3a1\",\"嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁\"],\n[\"e4a1\",\"沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額\"],\n[\"e5a1\",\"櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬\"],\n[\"e6a1\",\"旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒\"],\n[\"e7a1\",\"簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳\"],\n[\"e8a1\",\"烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療\"],\n[\"e9a1\",\"窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓\"],\n[\"eaa1\",\"運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜\"],\n[\"eba1\",\"濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼\"],\n[\"eca1\",\"議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄\"],\n[\"eda1\",\"立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長\"],\n[\"eea1\",\"障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱\"],\n[\"efa1\",\"煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖\"],\n[\"f0a1\",\"靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫\"],\n[\"f1a1\",\"踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只\"],\n[\"f2a1\",\"咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯\"],\n[\"f3a1\",\"鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策\"],\n[\"f4a1\",\"責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢\"],\n[\"f5a1\",\"椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃\"],\n[\"f6a1\",\"贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託\"],\n[\"f7a1\",\"鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑\"],\n[\"f8a1\",\"阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃\"],\n[\"f9a1\",\"品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航\"],\n[\"faa1\",\"行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型\"],\n[\"fba1\",\"形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵\"],\n[\"fca1\",\"禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆\"],\n[\"fda1\",\"爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/cp950.json",
    "content": "[\n[\"0\",\"\\u0000\",127],\n[\"a140\",\"　，、。．‧；：？！︰…‥﹐﹑﹒·﹔﹕﹖﹗｜–︱—︳╴︴﹏（）︵︶｛｝︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚\"],\n[\"a1a1\",\"﹛﹜﹝﹞‘’“”〝〞‵′＃＆＊※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯￣＿ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡＋－×÷±√＜＞＝≦≧≠∞≒≡﹢\",4,\"～∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣／\"],\n[\"a240\",\"＼∕﹨＄￥〒￠￡％＠℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁\",7,\"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭\"],\n[\"a2a1\",\"╮╰╯═╞╪╡◢◣◥◤╱╲╳０\",9,\"Ⅰ\",9,\"〡\",8,\"十卄卅Ａ\",25,\"ａ\",21],\n[\"a340\",\"ｗｘｙｚΑ\",16,\"Σ\",6,\"α\",16,\"σ\",6,\"ㄅ\",10],\n[\"a3a1\",\"ㄐ\",25,\"˙ˉˊˇˋ\"],\n[\"a3e1\",\"€\"],\n[\"a440\",\"一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才\"],\n[\"a4a1\",\"丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙\"],\n[\"a540\",\"世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外\"],\n[\"a5a1\",\"央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全\"],\n[\"a640\",\"共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年\"],\n[\"a6a1\",\"式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣\"],\n[\"a740\",\"作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍\"],\n[\"a7a1\",\"均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠\"],\n[\"a840\",\"杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒\"],\n[\"a8a1\",\"芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵\"],\n[\"a940\",\"咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居\"],\n[\"a9a1\",\"屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊\"],\n[\"aa40\",\"昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠\"],\n[\"aaa1\",\"炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附\"],\n[\"ab40\",\"陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品\"],\n[\"aba1\",\"哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷\"],\n[\"ac40\",\"拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗\"],\n[\"aca1\",\"活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄\"],\n[\"ad40\",\"耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥\"],\n[\"ada1\",\"迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪\"],\n[\"ae40\",\"哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙\"],\n[\"aea1\",\"恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓\"],\n[\"af40\",\"浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷\"],\n[\"afa1\",\"砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃\"],\n[\"b040\",\"虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡\"],\n[\"b0a1\",\"陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀\"],\n[\"b140\",\"娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽\"],\n[\"b1a1\",\"情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺\"],\n[\"b240\",\"毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶\"],\n[\"b2a1\",\"瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼\"],\n[\"b340\",\"莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途\"],\n[\"b3a1\",\"部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠\"],\n[\"b440\",\"婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍\"],\n[\"b4a1\",\"插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋\"],\n[\"b540\",\"溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘\"],\n[\"b5a1\",\"窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁\"],\n[\"b640\",\"詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑\"],\n[\"b6a1\",\"間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼\"],\n[\"b740\",\"媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業\"],\n[\"b7a1\",\"楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督\"],\n[\"b840\",\"睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫\"],\n[\"b8a1\",\"腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊\"],\n[\"b940\",\"辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴\"],\n[\"b9a1\",\"飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇\"],\n[\"ba40\",\"愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢\"],\n[\"baa1\",\"滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬\"],\n[\"bb40\",\"罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤\"],\n[\"bba1\",\"說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜\"],\n[\"bc40\",\"劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂\"],\n[\"bca1\",\"慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃\"],\n[\"bd40\",\"瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯\"],\n[\"bda1\",\"翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞\"],\n[\"be40\",\"輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉\"],\n[\"bea1\",\"鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡\"],\n[\"bf40\",\"濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊\"],\n[\"bfa1\",\"縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚\"],\n[\"c040\",\"錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇\"],\n[\"c0a1\",\"嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬\"],\n[\"c140\",\"瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪\"],\n[\"c1a1\",\"薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁\"],\n[\"c240\",\"駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘\"],\n[\"c2a1\",\"癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦\"],\n[\"c340\",\"鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸\"],\n[\"c3a1\",\"獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類\"],\n[\"c440\",\"願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼\"],\n[\"c4a1\",\"纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴\"],\n[\"c540\",\"護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬\"],\n[\"c5a1\",\"禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒\"],\n[\"c640\",\"讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲\"],\n[\"c940\",\"乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕\"],\n[\"c9a1\",\"氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋\"],\n[\"ca40\",\"汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘\"],\n[\"caa1\",\"吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇\"],\n[\"cb40\",\"杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓\"],\n[\"cba1\",\"芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢\"],\n[\"cc40\",\"坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋\"],\n[\"cca1\",\"怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲\"],\n[\"cd40\",\"泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺\"],\n[\"cda1\",\"矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏\"],\n[\"ce40\",\"哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛\"],\n[\"cea1\",\"峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺\"],\n[\"cf40\",\"柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂\"],\n[\"cfa1\",\"洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀\"],\n[\"d040\",\"穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪\"],\n[\"d0a1\",\"苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱\"],\n[\"d140\",\"唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧\"],\n[\"d1a1\",\"恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤\"],\n[\"d240\",\"毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸\"],\n[\"d2a1\",\"牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐\"],\n[\"d340\",\"笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢\"],\n[\"d3a1\",\"荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐\"],\n[\"d440\",\"酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅\"],\n[\"d4a1\",\"唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏\"],\n[\"d540\",\"崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟\"],\n[\"d5a1\",\"捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉\"],\n[\"d640\",\"淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏\"],\n[\"d6a1\",\"痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟\"],\n[\"d740\",\"耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷\"],\n[\"d7a1\",\"蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪\"],\n[\"d840\",\"釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷\"],\n[\"d8a1\",\"堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔\"],\n[\"d940\",\"惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒\"],\n[\"d9a1\",\"晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞\"],\n[\"da40\",\"湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖\"],\n[\"daa1\",\"琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥\"],\n[\"db40\",\"罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳\"],\n[\"dba1\",\"菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺\"],\n[\"dc40\",\"軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈\"],\n[\"dca1\",\"隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆\"],\n[\"dd40\",\"媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤\"],\n[\"dda1\",\"搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼\"],\n[\"de40\",\"毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓\"],\n[\"dea1\",\"煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓\"],\n[\"df40\",\"稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯\"],\n[\"dfa1\",\"腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤\"],\n[\"e040\",\"觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿\"],\n[\"e0a1\",\"遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠\"],\n[\"e140\",\"凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠\"],\n[\"e1a1\",\"寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉\"],\n[\"e240\",\"榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊\"],\n[\"e2a1\",\"漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓\"],\n[\"e340\",\"禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞\"],\n[\"e3a1\",\"耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻\"],\n[\"e440\",\"裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍\"],\n[\"e4a1\",\"銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘\"],\n[\"e540\",\"噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉\"],\n[\"e5a1\",\"憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒\"],\n[\"e640\",\"澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙\"],\n[\"e6a1\",\"獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟\"],\n[\"e740\",\"膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢\"],\n[\"e7a1\",\"蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧\"],\n[\"e840\",\"踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓\"],\n[\"e8a1\",\"銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮\"],\n[\"e940\",\"噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺\"],\n[\"e9a1\",\"憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸\"],\n[\"ea40\",\"澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙\"],\n[\"eaa1\",\"瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘\"],\n[\"eb40\",\"蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠\"],\n[\"eba1\",\"諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌\"],\n[\"ec40\",\"錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕\"],\n[\"eca1\",\"魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎\"],\n[\"ed40\",\"檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶\"],\n[\"eda1\",\"瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞\"],\n[\"ee40\",\"蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞\"],\n[\"eea1\",\"謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜\"],\n[\"ef40\",\"鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰\"],\n[\"efa1\",\"鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶\"],\n[\"f040\",\"璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒\"],\n[\"f0a1\",\"臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧\"],\n[\"f140\",\"蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪\"],\n[\"f1a1\",\"鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰\"],\n[\"f240\",\"徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛\"],\n[\"f2a1\",\"礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕\"],\n[\"f340\",\"譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦\"],\n[\"f3a1\",\"鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲\"],\n[\"f440\",\"嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩\"],\n[\"f4a1\",\"禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿\"],\n[\"f540\",\"鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛\"],\n[\"f5a1\",\"鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥\"],\n[\"f640\",\"蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺\"],\n[\"f6a1\",\"騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚\"],\n[\"f740\",\"糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊\"],\n[\"f7a1\",\"驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾\"],\n[\"f840\",\"讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏\"],\n[\"f8a1\",\"齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚\"],\n[\"f940\",\"纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊\"],\n[\"f9a1\",\"龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/eucjp.json",
    "content": "[\n[\"0\",\"\\u0000\",127],\n[\"8ea1\",\"｡\",62],\n[\"a1a1\",\"　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈\",9,\"＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇\"],\n[\"a2a1\",\"◆□■△▲▽▼※〒→←↑↓〓\"],\n[\"a2ba\",\"∈∋⊆⊇⊂⊃∪∩\"],\n[\"a2ca\",\"∧∨￢⇒⇔∀∃\"],\n[\"a2dc\",\"∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬\"],\n[\"a2f2\",\"Å‰♯♭♪†‡¶\"],\n[\"a2fe\",\"◯\"],\n[\"a3b0\",\"０\",9],\n[\"a3c1\",\"Ａ\",25],\n[\"a3e1\",\"ａ\",25],\n[\"a4a1\",\"ぁ\",82],\n[\"a5a1\",\"ァ\",85],\n[\"a6a1\",\"Α\",16,\"Σ\",6],\n[\"a6c1\",\"α\",16,\"σ\",6],\n[\"a7a1\",\"А\",5,\"ЁЖ\",25],\n[\"a7d1\",\"а\",5,\"ёж\",25],\n[\"a8a1\",\"─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂\"],\n[\"ada1\",\"①\",19,\"Ⅰ\",9],\n[\"adc0\",\"㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡\"],\n[\"addf\",\"㍻〝〟№㏍℡㊤\",4,\"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪\"],\n[\"b0a1\",\"亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭\"],\n[\"b1a1\",\"院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応\"],\n[\"b2a1\",\"押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改\"],\n[\"b3a1\",\"魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱\"],\n[\"b4a1\",\"粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄\"],\n[\"b5a1\",\"機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京\"],\n[\"b6a1\",\"供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈\"],\n[\"b7a1\",\"掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲\"],\n[\"b8a1\",\"検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向\"],\n[\"b9a1\",\"后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込\"],\n[\"baa1\",\"此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷\"],\n[\"bba1\",\"察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時\"],\n[\"bca1\",\"次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周\"],\n[\"bda1\",\"宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償\"],\n[\"bea1\",\"勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾\"],\n[\"bfa1\",\"拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾\"],\n[\"c0a1\",\"澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線\"],\n[\"c1a1\",\"繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎\"],\n[\"c2a1\",\"臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只\"],\n[\"c3a1\",\"叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵\"],\n[\"c4a1\",\"帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓\"],\n[\"c5a1\",\"邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到\"],\n[\"c6a1\",\"董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入\"],\n[\"c7a1\",\"如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦\"],\n[\"c8a1\",\"函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美\"],\n[\"c9a1\",\"鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服\"],\n[\"caa1\",\"福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋\"],\n[\"cba1\",\"法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満\"],\n[\"cca1\",\"漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒\"],\n[\"cda1\",\"諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃\"],\n[\"cea1\",\"痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯\"],\n[\"cfa1\",\"蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕\"],\n[\"d0a1\",\"弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲\"],\n[\"d1a1\",\"僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨\"],\n[\"d2a1\",\"辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨\"],\n[\"d3a1\",\"咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉\"],\n[\"d4a1\",\"圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩\"],\n[\"d5a1\",\"奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓\"],\n[\"d6a1\",\"屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏\"],\n[\"d7a1\",\"廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚\"],\n[\"d8a1\",\"悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛\"],\n[\"d9a1\",\"戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼\"],\n[\"daa1\",\"據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼\"],\n[\"dba1\",\"曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍\"],\n[\"dca1\",\"棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣\"],\n[\"dda1\",\"檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾\"],\n[\"dea1\",\"沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌\"],\n[\"dfa1\",\"漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼\"],\n[\"e0a1\",\"燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱\"],\n[\"e1a1\",\"瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰\"],\n[\"e2a1\",\"癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬\"],\n[\"e3a1\",\"磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐\"],\n[\"e4a1\",\"筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆\"],\n[\"e5a1\",\"紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺\"],\n[\"e6a1\",\"罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋\"],\n[\"e7a1\",\"隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙\"],\n[\"e8a1\",\"茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈\"],\n[\"e9a1\",\"蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙\"],\n[\"eaa1\",\"蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞\"],\n[\"eba1\",\"襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫\"],\n[\"eca1\",\"譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊\"],\n[\"eda1\",\"蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸\"],\n[\"eea1\",\"遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮\"],\n[\"efa1\",\"錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞\"],\n[\"f0a1\",\"陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰\"],\n[\"f1a1\",\"顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷\"],\n[\"f2a1\",\"髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈\"],\n[\"f3a1\",\"鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠\"],\n[\"f4a1\",\"堯槇遙瑤凜熙\"],\n[\"f9a1\",\"纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德\"],\n[\"faa1\",\"忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱\"],\n[\"fba1\",\"犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚\"],\n[\"fca1\",\"釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑\"],\n[\"fcf1\",\"ⅰ\",9,\"￢￤＇＂\"],\n[\"8fa2af\",\"˘ˇ¸˙˝¯˛˚～΄΅\"],\n[\"8fa2c2\",\"¡¦¿\"],\n[\"8fa2eb\",\"ºª©®™¤№\"],\n[\"8fa6e1\",\"ΆΈΉΊΪ\"],\n[\"8fa6e7\",\"Ό\"],\n[\"8fa6e9\",\"ΎΫ\"],\n[\"8fa6ec\",\"Ώ\"],\n[\"8fa6f1\",\"άέήίϊΐόςύϋΰώ\"],\n[\"8fa7c2\",\"Ђ\",10,\"ЎЏ\"],\n[\"8fa7f2\",\"ђ\",10,\"ўџ\"],\n[\"8fa9a1\",\"ÆĐ\"],\n[\"8fa9a4\",\"Ħ\"],\n[\"8fa9a6\",\"Ĳ\"],\n[\"8fa9a8\",\"ŁĿ\"],\n[\"8fa9ab\",\"ŊØŒ\"],\n[\"8fa9af\",\"ŦÞ\"],\n[\"8fa9c1\",\"æđðħıĳĸłŀŉŋøœßŧþ\"],\n[\"8faaa1\",\"ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ\"],\n[\"8faaba\",\"ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ\"],\n[\"8faba1\",\"áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ\"],\n[\"8fabbd\",\"ġĥíìïîǐ\"],\n[\"8fabc5\",\"īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż\"],\n[\"8fb0a1\",\"丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄\"],\n[\"8fb1a1\",\"侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐\"],\n[\"8fb2a1\",\"傒傓傔傖傛傜傞\",4,\"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂\"],\n[\"8fb3a1\",\"凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋\"],\n[\"8fb4a1\",\"匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿\"],\n[\"8fb5a1\",\"咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒\"],\n[\"8fb6a1\",\"嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍\",5,\"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤\",4,\"囱囫园\"],\n[\"8fb7a1\",\"囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭\",4,\"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡\"],\n[\"8fb8a1\",\"堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭\"],\n[\"8fb9a1\",\"奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿\"],\n[\"8fbaa1\",\"嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖\",4,\"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩\"],\n[\"8fbba1\",\"屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤\"],\n[\"8fbca1\",\"巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪\",4,\"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧\"],\n[\"8fbda1\",\"彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐\",4,\"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷\"],\n[\"8fbea1\",\"悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐\",4,\"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥\"],\n[\"8fbfa1\",\"懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵\"],\n[\"8fc0a1\",\"捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿\"],\n[\"8fc1a1\",\"擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝\"],\n[\"8fc2a1\",\"昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝\"],\n[\"8fc3a1\",\"杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮\",4,\"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏\"],\n[\"8fc4a1\",\"棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲\"],\n[\"8fc5a1\",\"樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽\"],\n[\"8fc6a1\",\"歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖\"],\n[\"8fc7a1\",\"泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞\"],\n[\"8fc8a1\",\"湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊\"],\n[\"8fc9a1\",\"濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔\",4,\"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃\",4,\"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠\"],\n[\"8fcaa1\",\"煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻\"],\n[\"8fcba1\",\"狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽\"],\n[\"8fcca1\",\"珿琀琁琄琇琊琑琚琛琤琦琨\",9,\"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆\"],\n[\"8fcda1\",\"甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹\",5,\"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹\"],\n[\"8fcea1\",\"瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢\",6,\"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢\"],\n[\"8fcfa1\",\"睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳\"],\n[\"8fd0a1\",\"碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞\"],\n[\"8fd1a1\",\"秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰\"],\n[\"8fd2a1\",\"笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙\",5],\n[\"8fd3a1\",\"籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝\"],\n[\"8fd4a1\",\"綞綦綧綪綳綶綷綹緂\",4,\"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭\"],\n[\"8fd5a1\",\"罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮\"],\n[\"8fd6a1\",\"胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆\"],\n[\"8fd7a1\",\"艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸\"],\n[\"8fd8a1\",\"荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓\"],\n[\"8fd9a1\",\"蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏\",4,\"蕖蕙蕜\",6,\"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼\"],\n[\"8fdaa1\",\"藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠\",4,\"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣\"],\n[\"8fdba1\",\"蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃\",6,\"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵\"],\n[\"8fdca1\",\"蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊\",4,\"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺\"],\n[\"8fdda1\",\"襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔\",4,\"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳\"],\n[\"8fdea1\",\"誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂\",4,\"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆\"],\n[\"8fdfa1\",\"貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢\"],\n[\"8fe0a1\",\"踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁\"],\n[\"8fe1a1\",\"轃轇轏轑\",4,\"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃\"],\n[\"8fe2a1\",\"郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿\"],\n[\"8fe3a1\",\"釂釃釅釓釔釗釙釚釞釤釥釩釪釬\",5,\"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵\",4,\"鉻鉼鉽鉿銈銉銊銍銎銒銗\"],\n[\"8fe4a1\",\"銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿\",4,\"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶\"],\n[\"8fe5a1\",\"鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉\",4,\"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹\"],\n[\"8fe6a1\",\"镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂\"],\n[\"8fe7a1\",\"霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦\"],\n[\"8fe8a1\",\"頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱\",4,\"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵\"],\n[\"8fe9a1\",\"馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿\",4],\n[\"8feaa1\",\"鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪\",4,\"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸\"],\n[\"8feba1\",\"鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦\",4,\"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻\"],\n[\"8feca1\",\"鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵\"],\n[\"8feda1\",\"黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃\",4,\"齓齕齖齗齘齚齝齞齨齩齭\",4,\"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json",
    "content": "{\"uChars\":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],\"gbChars\":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/gbk-added.json",
    "content": "[\n[\"a140\",\"\",62],\n[\"a180\",\"\",32],\n[\"a240\",\"\",62],\n[\"a280\",\"\",32],\n[\"a2ab\",\"\",5],\n[\"a2e3\",\"€\"],\n[\"a2ef\",\"\"],\n[\"a2fd\",\"\"],\n[\"a340\",\"\",62],\n[\"a380\",\"\",31,\"　\"],\n[\"a440\",\"\",62],\n[\"a480\",\"\",32],\n[\"a4f4\",\"\",10],\n[\"a540\",\"\",62],\n[\"a580\",\"\",32],\n[\"a5f7\",\"\",7],\n[\"a640\",\"\",62],\n[\"a680\",\"\",32],\n[\"a6b9\",\"\",7],\n[\"a6d9\",\"\",6],\n[\"a6ec\",\"\"],\n[\"a6f3\",\"\"],\n[\"a6f6\",\"\",8],\n[\"a740\",\"\",62],\n[\"a780\",\"\",32],\n[\"a7c2\",\"\",14],\n[\"a7f2\",\"\",12],\n[\"a896\",\"\",10],\n[\"a8bc\",\"ḿ\"],\n[\"a8bf\",\"ǹ\"],\n[\"a8c1\",\"\"],\n[\"a8ea\",\"\",20],\n[\"a958\",\"\"],\n[\"a95b\",\"\"],\n[\"a95d\",\"\"],\n[\"a989\",\"〾⿰\",11],\n[\"a997\",\"\",12],\n[\"a9f0\",\"\",14],\n[\"aaa1\",\"\",93],\n[\"aba1\",\"\",93],\n[\"aca1\",\"\",93],\n[\"ada1\",\"\",93],\n[\"aea1\",\"\",93],\n[\"afa1\",\"\",93],\n[\"d7fa\",\"\",4],\n[\"f8a1\",\"\",93],\n[\"f9a1\",\"\",93],\n[\"faa1\",\"\",93],\n[\"fba1\",\"\",93],\n[\"fca1\",\"\",93],\n[\"fda1\",\"\",93],\n[\"fe50\",\"⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌\"],\n[\"fe80\",\"䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓\",6,\"䶮\",93],\n[\"8135f437\",\"\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/tables/shiftjis.json",
    "content": "[\n[\"0\",\"\\u0000\",128],\n[\"a1\",\"｡\",62],\n[\"8140\",\"　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈\",9,\"＋－±×\"],\n[\"8180\",\"÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓\"],\n[\"81b8\",\"∈∋⊆⊇⊂⊃∪∩\"],\n[\"81c8\",\"∧∨￢⇒⇔∀∃\"],\n[\"81da\",\"∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬\"],\n[\"81f0\",\"Å‰♯♭♪†‡¶\"],\n[\"81fc\",\"◯\"],\n[\"824f\",\"０\",9],\n[\"8260\",\"Ａ\",25],\n[\"8281\",\"ａ\",25],\n[\"829f\",\"ぁ\",82],\n[\"8340\",\"ァ\",62],\n[\"8380\",\"ム\",22],\n[\"839f\",\"Α\",16,\"Σ\",6],\n[\"83bf\",\"α\",16,\"σ\",6],\n[\"8440\",\"А\",5,\"ЁЖ\",25],\n[\"8470\",\"а\",5,\"ёж\",7],\n[\"8480\",\"о\",17],\n[\"849f\",\"─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂\"],\n[\"8740\",\"①\",19,\"Ⅰ\",9],\n[\"875f\",\"㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡\"],\n[\"877e\",\"㍻\"],\n[\"8780\",\"〝〟№㏍℡㊤\",4,\"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪\"],\n[\"889f\",\"亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭\"],\n[\"8940\",\"院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円\"],\n[\"8980\",\"園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改\"],\n[\"8a40\",\"魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫\"],\n[\"8a80\",\"橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄\"],\n[\"8b40\",\"機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救\"],\n[\"8b80\",\"朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈\"],\n[\"8c40\",\"掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨\"],\n[\"8c80\",\"劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向\"],\n[\"8d40\",\"后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降\"],\n[\"8d80\",\"項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷\"],\n[\"8e40\",\"察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止\"],\n[\"8e80\",\"死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周\"],\n[\"8f40\",\"宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳\"],\n[\"8f80\",\"準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾\"],\n[\"9040\",\"拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨\"],\n[\"9080\",\"逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線\"],\n[\"9140\",\"繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻\"],\n[\"9180\",\"操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只\"],\n[\"9240\",\"叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄\"],\n[\"9280\",\"逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓\"],\n[\"9340\",\"邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬\"],\n[\"9380\",\"凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入\"],\n[\"9440\",\"如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅\"],\n[\"9480\",\"楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美\"],\n[\"9540\",\"鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷\"],\n[\"9580\",\"斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋\"],\n[\"9640\",\"法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆\"],\n[\"9680\",\"摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒\"],\n[\"9740\",\"諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲\"],\n[\"9780\",\"沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯\"],\n[\"9840\",\"蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕\"],\n[\"989f\",\"弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲\"],\n[\"9940\",\"僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭\"],\n[\"9980\",\"凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨\"],\n[\"9a40\",\"咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸\"],\n[\"9a80\",\"噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩\"],\n[\"9b40\",\"奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀\"],\n[\"9b80\",\"它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏\"],\n[\"9c40\",\"廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠\"],\n[\"9c80\",\"怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛\"],\n[\"9d40\",\"戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫\"],\n[\"9d80\",\"捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼\"],\n[\"9e40\",\"曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎\"],\n[\"9e80\",\"梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣\"],\n[\"9f40\",\"檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯\"],\n[\"9f80\",\"麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌\"],\n[\"e040\",\"漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝\"],\n[\"e080\",\"烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱\"],\n[\"e140\",\"瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿\"],\n[\"e180\",\"痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬\"],\n[\"e240\",\"磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰\"],\n[\"e280\",\"窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆\"],\n[\"e340\",\"紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷\"],\n[\"e380\",\"縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋\"],\n[\"e440\",\"隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤\"],\n[\"e480\",\"艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈\"],\n[\"e540\",\"蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬\"],\n[\"e580\",\"蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞\"],\n[\"e640\",\"襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧\"],\n[\"e680\",\"諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊\"],\n[\"e740\",\"蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜\"],\n[\"e780\",\"轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮\"],\n[\"e840\",\"錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙\"],\n[\"e880\",\"閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰\"],\n[\"e940\",\"顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃\"],\n[\"e980\",\"騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈\"],\n[\"ea40\",\"鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯\"],\n[\"ea80\",\"黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙\"],\n[\"ed40\",\"纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏\"],\n[\"ed80\",\"塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱\"],\n[\"ee40\",\"犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙\"],\n[\"ee80\",\"蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑\"],\n[\"eeef\",\"ⅰ\",9,\"￢￤＇＂\"],\n[\"f040\",\"\",62],\n[\"f080\",\"\",124],\n[\"f140\",\"\",62],\n[\"f180\",\"\",124],\n[\"f240\",\"\",62],\n[\"f280\",\"\",124],\n[\"f340\",\"\",62],\n[\"f380\",\"\",124],\n[\"f440\",\"\",62],\n[\"f480\",\"\",124],\n[\"f540\",\"\",62],\n[\"f580\",\"\",124],\n[\"f640\",\"\",62],\n[\"f680\",\"\",124],\n[\"f740\",\"\",62],\n[\"f780\",\"\",124],\n[\"f840\",\"\",62],\n[\"f880\",\"\",124],\n[\"f940\",\"\"],\n[\"fa40\",\"ⅰ\",9,\"Ⅰ\",9,\"￢￤＇＂㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊\"],\n[\"fa80\",\"兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯\"],\n[\"fb40\",\"涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神\"],\n[\"fb80\",\"祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙\"],\n[\"fc40\",\"髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑\"]\n]\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/utf16.js",
    "content": "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js\n\n// == UTF16-BE codec. ==========================================================\n\nexports.utf16be = Utf16BECodec;\nfunction Utf16BECodec() {\n}\n\nUtf16BECodec.prototype.encoder = Utf16BEEncoder;\nUtf16BECodec.prototype.decoder = Utf16BEDecoder;\nUtf16BECodec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nfunction Utf16BEEncoder() {\n}\n\nUtf16BEEncoder.prototype.write = function(str) {\n    var buf = Buffer.from(str, 'ucs2');\n    for (var i = 0; i < buf.length; i += 2) {\n        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;\n    }\n    return buf;\n}\n\nUtf16BEEncoder.prototype.end = function() {\n}\n\n\n// -- Decoding\n\nfunction Utf16BEDecoder() {\n    this.overflowByte = -1;\n}\n\nUtf16BEDecoder.prototype.write = function(buf) {\n    if (buf.length == 0)\n        return '';\n\n    var buf2 = Buffer.alloc(buf.length + 1),\n        i = 0, j = 0;\n\n    if (this.overflowByte !== -1) {\n        buf2[0] = buf[0];\n        buf2[1] = this.overflowByte;\n        i = 1; j = 2;\n    }\n\n    for (; i < buf.length-1; i += 2, j+= 2) {\n        buf2[j] = buf[i+1];\n        buf2[j+1] = buf[i];\n    }\n\n    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;\n\n    return buf2.slice(0, j).toString('ucs2');\n}\n\nUtf16BEDecoder.prototype.end = function() {\n    this.overflowByte = -1;\n}\n\n\n// == UTF-16 codec =============================================================\n// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.\n// Defaults to UTF-16LE, as it's prevalent and default in Node.\n// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le\n// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});\n\n// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).\n\nexports.utf16 = Utf16Codec;\nfunction Utf16Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n}\n\nUtf16Codec.prototype.encoder = Utf16Encoder;\nUtf16Codec.prototype.decoder = Utf16Decoder;\n\n\n// -- Encoding (pass-through)\n\nfunction Utf16Encoder(options, codec) {\n    options = options || {};\n    if (options.addBOM === undefined)\n        options.addBOM = true;\n    this.encoder = codec.iconv.getEncoder('utf-16le', options);\n}\n\nUtf16Encoder.prototype.write = function(str) {\n    return this.encoder.write(str);\n}\n\nUtf16Encoder.prototype.end = function() {\n    return this.encoder.end();\n}\n\n\n// -- Decoding\n\nfunction Utf16Decoder(options, codec) {\n    this.decoder = null;\n    this.initialBufs = [];\n    this.initialBufsLen = 0;\n\n    this.options = options || {};\n    this.iconv = codec.iconv;\n}\n\nUtf16Decoder.prototype.write = function(buf) {\n    if (!this.decoder) {\n        // Codec is not chosen yet. Accumulate initial bytes.\n        this.initialBufs.push(buf);\n        this.initialBufsLen += buf.length;\n        \n        if (this.initialBufsLen < 16) // We need more bytes to use space heuristic (see below)\n            return '';\n\n        // We have enough bytes -> detect endianness.\n        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n\n        var resStr = '';\n        for (var i = 0; i < this.initialBufs.length; i++)\n            resStr += this.decoder.write(this.initialBufs[i]);\n\n        this.initialBufs.length = this.initialBufsLen = 0;\n        return resStr;\n    }\n\n    return this.decoder.write(buf);\n}\n\nUtf16Decoder.prototype.end = function() {\n    if (!this.decoder) {\n        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n\n        var resStr = '';\n        for (var i = 0; i < this.initialBufs.length; i++)\n            resStr += this.decoder.write(this.initialBufs[i]);\n\n        var trail = this.decoder.end();\n        if (trail)\n            resStr += trail;\n\n        this.initialBufs.length = this.initialBufsLen = 0;\n        return resStr;\n    }\n    return this.decoder.end();\n}\n\nfunction detectEncoding(bufs, defaultEncoding) {\n    var b = [];\n    var charsProcessed = 0;\n    var asciiCharsLE = 0, asciiCharsBE = 0; // Number of ASCII chars when decoded as LE or BE.\n\n    outer_loop:\n    for (var i = 0; i < bufs.length; i++) {\n        var buf = bufs[i];\n        for (var j = 0; j < buf.length; j++) {\n            b.push(buf[j]);\n            if (b.length === 2) {\n                if (charsProcessed === 0) {\n                    // Check BOM first.\n                    if (b[0] === 0xFF && b[1] === 0xFE) return 'utf-16le';\n                    if (b[0] === 0xFE && b[1] === 0xFF) return 'utf-16be';\n                }\n\n                if (b[0] === 0 && b[1] !== 0) asciiCharsBE++;\n                if (b[0] !== 0 && b[1] === 0) asciiCharsLE++;\n\n                b.length = 0;\n                charsProcessed++;\n\n                if (charsProcessed >= 100) {\n                    break outer_loop;\n                }\n            }\n        }\n    }\n\n    // Make decisions.\n    // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.\n    // So, we count ASCII as if it was LE or BE, and decide from that.\n    if (asciiCharsBE > asciiCharsLE) return 'utf-16be';\n    if (asciiCharsBE < asciiCharsLE) return 'utf-16le';\n\n    // Couldn't decide (likely all zeros or not enough data).\n    return defaultEncoding || 'utf-16le';\n}\n\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/utf32.js",
    "content": "'use strict';\n\nvar Buffer = require('safer-buffer').Buffer;\n\n// == UTF32-LE/BE codec. ==========================================================\n\nexports._utf32 = Utf32Codec;\n\nfunction Utf32Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n    this.bomAware = true;\n    this.isLE = codecOptions.isLE;\n}\n\nexports.utf32le = { type: '_utf32', isLE: true };\nexports.utf32be = { type: '_utf32', isLE: false };\n\n// Aliases\nexports.ucs4le = 'utf32le';\nexports.ucs4be = 'utf32be';\n\nUtf32Codec.prototype.encoder = Utf32Encoder;\nUtf32Codec.prototype.decoder = Utf32Decoder;\n\n// -- Encoding\n\nfunction Utf32Encoder(options, codec) {\n    this.isLE = codec.isLE;\n    this.highSurrogate = 0;\n}\n\nUtf32Encoder.prototype.write = function(str) {\n    var src = Buffer.from(str, 'ucs2');\n    var dst = Buffer.alloc(src.length * 2);\n    var write32 = this.isLE ? dst.writeUInt32LE : dst.writeUInt32BE;\n    var offset = 0;\n\n    for (var i = 0; i < src.length; i += 2) {\n        var code = src.readUInt16LE(i);\n        var isHighSurrogate = (0xD800 <= code && code < 0xDC00);\n        var isLowSurrogate = (0xDC00 <= code && code < 0xE000);\n\n        if (this.highSurrogate) {\n            if (isHighSurrogate || !isLowSurrogate) {\n                // There shouldn't be two high surrogates in a row, nor a high surrogate which isn't followed by a low\n                // surrogate. If this happens, keep the pending high surrogate as a stand-alone semi-invalid character\n                // (technically wrong, but expected by some applications, like Windows file names).\n                write32.call(dst, this.highSurrogate, offset);\n                offset += 4;\n            }\n            else {\n                // Create 32-bit value from high and low surrogates;\n                var codepoint = (((this.highSurrogate - 0xD800) << 10) | (code - 0xDC00)) + 0x10000;\n\n                write32.call(dst, codepoint, offset);\n                offset += 4;\n                this.highSurrogate = 0;\n\n                continue;\n            }\n        }\n\n        if (isHighSurrogate)\n            this.highSurrogate = code;\n        else {\n            // Even if the current character is a low surrogate, with no previous high surrogate, we'll\n            // encode it as a semi-invalid stand-alone character for the same reasons expressed above for\n            // unpaired high surrogates.\n            write32.call(dst, code, offset);\n            offset += 4;\n            this.highSurrogate = 0;\n        }\n    }\n\n    if (offset < dst.length)\n        dst = dst.slice(0, offset);\n\n    return dst;\n};\n\nUtf32Encoder.prototype.end = function() {\n    // Treat any leftover high surrogate as a semi-valid independent character.\n    if (!this.highSurrogate)\n        return;\n\n    var buf = Buffer.alloc(4);\n\n    if (this.isLE)\n        buf.writeUInt32LE(this.highSurrogate, 0);\n    else\n        buf.writeUInt32BE(this.highSurrogate, 0);\n\n    this.highSurrogate = 0;\n\n    return buf;\n};\n\n// -- Decoding\n\nfunction Utf32Decoder(options, codec) {\n    this.isLE = codec.isLE;\n    this.badChar = codec.iconv.defaultCharUnicode.charCodeAt(0);\n    this.overflow = [];\n}\n\nUtf32Decoder.prototype.write = function(src) {\n    if (src.length === 0)\n        return '';\n\n    var i = 0;\n    var codepoint = 0;\n    var dst = Buffer.alloc(src.length + 4);\n    var offset = 0;\n    var isLE = this.isLE;\n    var overflow = this.overflow;\n    var badChar = this.badChar;\n\n    if (overflow.length > 0) {\n        for (; i < src.length && overflow.length < 4; i++)\n            overflow.push(src[i]);\n        \n        if (overflow.length === 4) {\n            // NOTE: codepoint is a signed int32 and can be negative.\n            // NOTE: We copied this block from below to help V8 optimize it (it works with array, not buffer).\n            if (isLE) {\n                codepoint = overflow[i] | (overflow[i+1] << 8) | (overflow[i+2] << 16) | (overflow[i+3] << 24);\n            } else {\n                codepoint = overflow[i+3] | (overflow[i+2] << 8) | (overflow[i+1] << 16) | (overflow[i] << 24);\n            }\n            overflow.length = 0;\n\n            offset = _writeCodepoint(dst, offset, codepoint, badChar);\n        }\n    }\n\n    // Main loop. Should be as optimized as possible.\n    for (; i < src.length - 3; i += 4) {\n        // NOTE: codepoint is a signed int32 and can be negative.\n        if (isLE) {\n            codepoint = src[i] | (src[i+1] << 8) | (src[i+2] << 16) | (src[i+3] << 24);\n        } else {\n            codepoint = src[i+3] | (src[i+2] << 8) | (src[i+1] << 16) | (src[i] << 24);\n        }\n        offset = _writeCodepoint(dst, offset, codepoint, badChar);\n    }\n\n    // Keep overflowing bytes.\n    for (; i < src.length; i++) {\n        overflow.push(src[i]);\n    }\n\n    return dst.slice(0, offset).toString('ucs2');\n};\n\nfunction _writeCodepoint(dst, offset, codepoint, badChar) {\n    // NOTE: codepoint is signed int32 and can be negative. We keep it that way to help V8 with optimizations.\n    if (codepoint < 0 || codepoint > 0x10FFFF) {\n        // Not a valid Unicode codepoint\n        codepoint = badChar;\n    } \n\n    // Ephemeral Planes: Write high surrogate.\n    if (codepoint >= 0x10000) {\n        codepoint -= 0x10000;\n\n        var high = 0xD800 | (codepoint >> 10);\n        dst[offset++] = high & 0xff;\n        dst[offset++] = high >> 8;\n\n        // Low surrogate is written below.\n        var codepoint = 0xDC00 | (codepoint & 0x3FF);\n    }\n\n    // Write BMP char or low surrogate.\n    dst[offset++] = codepoint & 0xff;\n    dst[offset++] = codepoint >> 8;\n\n    return offset;\n};\n\nUtf32Decoder.prototype.end = function() {\n    this.overflow.length = 0;\n};\n\n// == UTF-32 Auto codec =============================================================\n// Decoder chooses automatically from UTF-32LE and UTF-32BE using BOM and space-based heuristic.\n// Defaults to UTF-32LE. http://en.wikipedia.org/wiki/UTF-32\n// Encoder/decoder default can be changed: iconv.decode(buf, 'utf32', {defaultEncoding: 'utf-32be'});\n\n// Encoder prepends BOM (which can be overridden with (addBOM: false}).\n\nexports.utf32 = Utf32AutoCodec;\nexports.ucs4 = 'utf32';\n\nfunction Utf32AutoCodec(options, iconv) {\n    this.iconv = iconv;\n}\n\nUtf32AutoCodec.prototype.encoder = Utf32AutoEncoder;\nUtf32AutoCodec.prototype.decoder = Utf32AutoDecoder;\n\n// -- Encoding\n\nfunction Utf32AutoEncoder(options, codec) {\n    options = options || {};\n\n    if (options.addBOM === undefined)\n        options.addBOM = true;\n\n    this.encoder = codec.iconv.getEncoder(options.defaultEncoding || 'utf-32le', options);\n}\n\nUtf32AutoEncoder.prototype.write = function(str) {\n    return this.encoder.write(str);\n};\n\nUtf32AutoEncoder.prototype.end = function() {\n    return this.encoder.end();\n};\n\n// -- Decoding\n\nfunction Utf32AutoDecoder(options, codec) {\n    this.decoder = null;\n    this.initialBufs = [];\n    this.initialBufsLen = 0;\n    this.options = options || {};\n    this.iconv = codec.iconv;\n}\n\nUtf32AutoDecoder.prototype.write = function(buf) {\n    if (!this.decoder) { \n        // Codec is not chosen yet. Accumulate initial bytes.\n        this.initialBufs.push(buf);\n        this.initialBufsLen += buf.length;\n\n        if (this.initialBufsLen < 32) // We need more bytes to use space heuristic (see below)\n            return '';\n\n        // We have enough bytes -> detect endianness.\n        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n\n        var resStr = '';\n        for (var i = 0; i < this.initialBufs.length; i++)\n            resStr += this.decoder.write(this.initialBufs[i]);\n\n        this.initialBufs.length = this.initialBufsLen = 0;\n        return resStr;\n    }\n\n    return this.decoder.write(buf);\n};\n\nUtf32AutoDecoder.prototype.end = function() {\n    if (!this.decoder) {\n        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n\n        var resStr = '';\n        for (var i = 0; i < this.initialBufs.length; i++)\n            resStr += this.decoder.write(this.initialBufs[i]);\n\n        var trail = this.decoder.end();\n        if (trail)\n            resStr += trail;\n\n        this.initialBufs.length = this.initialBufsLen = 0;\n        return resStr;\n    }\n\n    return this.decoder.end();\n};\n\nfunction detectEncoding(bufs, defaultEncoding) {\n    var b = [];\n    var charsProcessed = 0;\n    var invalidLE = 0, invalidBE = 0;   // Number of invalid chars when decoded as LE or BE.\n    var bmpCharsLE = 0, bmpCharsBE = 0; // Number of BMP chars when decoded as LE or BE.\n\n    outer_loop:\n    for (var i = 0; i < bufs.length; i++) {\n        var buf = bufs[i];\n        for (var j = 0; j < buf.length; j++) {\n            b.push(buf[j]);\n            if (b.length === 4) {\n                if (charsProcessed === 0) {\n                    // Check BOM first.\n                    if (b[0] === 0xFF && b[1] === 0xFE && b[2] === 0 && b[3] === 0) {\n                        return 'utf-32le';\n                    }\n                    if (b[0] === 0 && b[1] === 0 && b[2] === 0xFE && b[3] === 0xFF) {\n                        return 'utf-32be';\n                    }\n                }\n\n                if (b[0] !== 0 || b[1] > 0x10) invalidBE++;\n                if (b[3] !== 0 || b[2] > 0x10) invalidLE++;\n\n                if (b[0] === 0 && b[1] === 0 && (b[2] !== 0 || b[3] !== 0)) bmpCharsBE++;\n                if ((b[0] !== 0 || b[1] !== 0) && b[2] === 0 && b[3] === 0) bmpCharsLE++;\n\n                b.length = 0;\n                charsProcessed++;\n\n                if (charsProcessed >= 100) {\n                    break outer_loop;\n                }\n            }\n        }\n    }\n\n    // Make decisions.\n    if (bmpCharsBE - invalidBE > bmpCharsLE - invalidLE)  return 'utf-32be';\n    if (bmpCharsBE - invalidBE < bmpCharsLE - invalidLE)  return 'utf-32le';\n\n    // Couldn't decide (likely all zeros or not enough data).\n    return defaultEncoding || 'utf-32le';\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/encodings/utf7.js",
    "content": "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152\n// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3\n\nexports.utf7 = Utf7Codec;\nexports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7\nfunction Utf7Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n};\n\nUtf7Codec.prototype.encoder = Utf7Encoder;\nUtf7Codec.prototype.decoder = Utf7Decoder;\nUtf7Codec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nvar nonDirectChars = /[^A-Za-z0-9'\\(\\),-\\.\\/:\\? \\n\\r\\t]+/g;\n\nfunction Utf7Encoder(options, codec) {\n    this.iconv = codec.iconv;\n}\n\nUtf7Encoder.prototype.write = function(str) {\n    // Naive implementation.\n    // Non-direct chars are encoded as \"+<base64>-\"; single \"+\" char is encoded as \"+-\".\n    return Buffer.from(str.replace(nonDirectChars, function(chunk) {\n        return \"+\" + (chunk === '+' ? '' : \n            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) \n            + \"-\";\n    }.bind(this)));\n}\n\nUtf7Encoder.prototype.end = function() {\n}\n\n\n// -- Decoding\n\nfunction Utf7Decoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = '';\n}\n\nvar base64Regex = /[A-Za-z0-9\\/+]/;\nvar base64Chars = [];\nfor (var i = 0; i < 256; i++)\n    base64Chars[i] = base64Regex.test(String.fromCharCode(i));\n\nvar plusChar = '+'.charCodeAt(0), \n    minusChar = '-'.charCodeAt(0),\n    andChar = '&'.charCodeAt(0);\n\nUtf7Decoder.prototype.write = function(buf) {\n    var res = \"\", lastI = 0,\n        inBase64 = this.inBase64,\n        base64Accum = this.base64Accum;\n\n    // The decoder is more involved as we must handle chunks in stream.\n\n    for (var i = 0; i < buf.length; i++) {\n        if (!inBase64) { // We're in direct mode.\n            // Write direct chars until '+'\n            if (buf[i] == plusChar) {\n                res += this.iconv.decode(buf.slice(lastI, i), \"ascii\"); // Write direct chars.\n                lastI = i+1;\n                inBase64 = true;\n            }\n        } else { // We decode base64.\n            if (!base64Chars[buf[i]]) { // Base64 ended.\n                if (i == lastI && buf[i] == minusChar) {// \"+-\" -> \"+\"\n                    res += \"+\";\n                } else {\n                    var b64str = base64Accum + this.iconv.decode(buf.slice(lastI, i), \"ascii\");\n                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n                }\n\n                if (buf[i] != minusChar) // Minus is absorbed after base64.\n                    i--;\n\n                lastI = i+1;\n                inBase64 = false;\n                base64Accum = '';\n            }\n        }\n    }\n\n    if (!inBase64) {\n        res += this.iconv.decode(buf.slice(lastI), \"ascii\"); // Write direct chars.\n    } else {\n        var b64str = base64Accum + this.iconv.decode(buf.slice(lastI), \"ascii\");\n\n        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.\n        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.\n        b64str = b64str.slice(0, canBeDecoded);\n\n        res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n    }\n\n    this.inBase64 = inBase64;\n    this.base64Accum = base64Accum;\n\n    return res;\n}\n\nUtf7Decoder.prototype.end = function() {\n    var res = \"\";\n    if (this.inBase64 && this.base64Accum.length > 0)\n        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), \"utf16-be\");\n\n    this.inBase64 = false;\n    this.base64Accum = '';\n    return res;\n}\n\n\n// UTF-7-IMAP codec.\n// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)\n// Differences:\n//  * Base64 part is started by \"&\" instead of \"+\"\n//  * Direct characters are 0x20-0x7E, except \"&\" (0x26)\n//  * In Base64, \",\" is used instead of \"/\"\n//  * Base64 must not be used to represent direct characters.\n//  * No implicit shift back from Base64 (should always end with '-')\n//  * String must end in non-shifted position.\n//  * \"-&\" while in base64 is not allowed.\n\n\nexports.utf7imap = Utf7IMAPCodec;\nfunction Utf7IMAPCodec(codecOptions, iconv) {\n    this.iconv = iconv;\n};\n\nUtf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;\nUtf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;\nUtf7IMAPCodec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nfunction Utf7IMAPEncoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = Buffer.alloc(6);\n    this.base64AccumIdx = 0;\n}\n\nUtf7IMAPEncoder.prototype.write = function(str) {\n    var inBase64 = this.inBase64,\n        base64Accum = this.base64Accum,\n        base64AccumIdx = this.base64AccumIdx,\n        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;\n\n    for (var i = 0; i < str.length; i++) {\n        var uChar = str.charCodeAt(i);\n        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.\n            if (inBase64) {\n                if (base64AccumIdx > 0) {\n                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\\//g, ',').replace(/=+$/, ''), bufIdx);\n                    base64AccumIdx = 0;\n                }\n\n                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.\n                inBase64 = false;\n            }\n\n            if (!inBase64) {\n                buf[bufIdx++] = uChar; // Write direct character\n\n                if (uChar === andChar)  // Ampersand -> '&-'\n                    buf[bufIdx++] = minusChar;\n            }\n\n        } else { // Non-direct character\n            if (!inBase64) {\n                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.\n                inBase64 = true;\n            }\n            if (inBase64) {\n                base64Accum[base64AccumIdx++] = uChar >> 8;\n                base64Accum[base64AccumIdx++] = uChar & 0xFF;\n\n                if (base64AccumIdx == base64Accum.length) {\n                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\\//g, ','), bufIdx);\n                    base64AccumIdx = 0;\n                }\n            }\n        }\n    }\n\n    this.inBase64 = inBase64;\n    this.base64AccumIdx = base64AccumIdx;\n\n    return buf.slice(0, bufIdx);\n}\n\nUtf7IMAPEncoder.prototype.end = function() {\n    var buf = Buffer.alloc(10), bufIdx = 0;\n    if (this.inBase64) {\n        if (this.base64AccumIdx > 0) {\n            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\\//g, ',').replace(/=+$/, ''), bufIdx);\n            this.base64AccumIdx = 0;\n        }\n\n        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.\n        this.inBase64 = false;\n    }\n\n    return buf.slice(0, bufIdx);\n}\n\n\n// -- Decoding\n\nfunction Utf7IMAPDecoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = '';\n}\n\nvar base64IMAPChars = base64Chars.slice();\nbase64IMAPChars[','.charCodeAt(0)] = true;\n\nUtf7IMAPDecoder.prototype.write = function(buf) {\n    var res = \"\", lastI = 0,\n        inBase64 = this.inBase64,\n        base64Accum = this.base64Accum;\n\n    // The decoder is more involved as we must handle chunks in stream.\n    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).\n\n    for (var i = 0; i < buf.length; i++) {\n        if (!inBase64) { // We're in direct mode.\n            // Write direct chars until '&'\n            if (buf[i] == andChar) {\n                res += this.iconv.decode(buf.slice(lastI, i), \"ascii\"); // Write direct chars.\n                lastI = i+1;\n                inBase64 = true;\n            }\n        } else { // We decode base64.\n            if (!base64IMAPChars[buf[i]]) { // Base64 ended.\n                if (i == lastI && buf[i] == minusChar) { // \"&-\" -> \"&\"\n                    res += \"&\";\n                } else {\n                    var b64str = base64Accum + this.iconv.decode(buf.slice(lastI, i), \"ascii\").replace(/,/g, '/');\n                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n                }\n\n                if (buf[i] != minusChar) // Minus may be absorbed after base64.\n                    i--;\n\n                lastI = i+1;\n                inBase64 = false;\n                base64Accum = '';\n            }\n        }\n    }\n\n    if (!inBase64) {\n        res += this.iconv.decode(buf.slice(lastI), \"ascii\"); // Write direct chars.\n    } else {\n        var b64str = base64Accum + this.iconv.decode(buf.slice(lastI), \"ascii\").replace(/,/g, '/');\n\n        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.\n        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.\n        b64str = b64str.slice(0, canBeDecoded);\n\n        res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n    }\n\n    this.inBase64 = inBase64;\n    this.base64Accum = base64Accum;\n\n    return res;\n}\n\nUtf7IMAPDecoder.prototype.end = function() {\n    var res = \"\";\n    if (this.inBase64 && this.base64Accum.length > 0)\n        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), \"utf16-be\");\n\n    this.inBase64 = false;\n    this.base64Accum = '';\n    return res;\n}\n\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/lib/bom-handling.js",
    "content": "\"use strict\";\n\nvar BOMChar = '\\uFEFF';\n\nexports.PrependBOM = PrependBOMWrapper\nfunction PrependBOMWrapper(encoder, options) {\n    this.encoder = encoder;\n    this.addBOM = true;\n}\n\nPrependBOMWrapper.prototype.write = function(str) {\n    if (this.addBOM) {\n        str = BOMChar + str;\n        this.addBOM = false;\n    }\n\n    return this.encoder.write(str);\n}\n\nPrependBOMWrapper.prototype.end = function() {\n    return this.encoder.end();\n}\n\n\n//------------------------------------------------------------------------------\n\nexports.StripBOM = StripBOMWrapper;\nfunction StripBOMWrapper(decoder, options) {\n    this.decoder = decoder;\n    this.pass = false;\n    this.options = options || {};\n}\n\nStripBOMWrapper.prototype.write = function(buf) {\n    var res = this.decoder.write(buf);\n    if (this.pass || !res)\n        return res;\n\n    if (res[0] === BOMChar) {\n        res = res.slice(1);\n        if (typeof this.options.stripBOM === 'function')\n            this.options.stripBOM();\n    }\n\n    this.pass = true;\n    return res;\n}\n\nStripBOMWrapper.prototype.end = function() {\n    return this.decoder.end();\n}\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/lib/index.d.ts",
    "content": "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License.\n *  REQUIREMENT: This definition is dependent on the @types/node definition.\n *  Install with `npm install @types/node --save-dev`\n *--------------------------------------------------------------------------------------------*/\n\ndeclare module 'iconv-lite' {\n\t// Basic API\n\texport function decode(buffer: Buffer, encoding: string, options?: Options): string;\n\n\texport function encode(content: string, encoding: string, options?: Options): Buffer;\n\n\texport function encodingExists(encoding: string): boolean;\n\n\t// Stream API\n\texport function decodeStream(encoding: string, options?: Options): NodeJS.ReadWriteStream;\n\n\texport function encodeStream(encoding: string, options?: Options): NodeJS.ReadWriteStream;\n\n\t// Low-level stream APIs\n\texport function getEncoder(encoding: string, options?: Options): EncoderStream;\n\n\texport function getDecoder(encoding: string, options?: Options): DecoderStream;\n}\n\nexport interface Options {\n    stripBOM?: boolean;\n    addBOM?: boolean;\n    defaultEncoding?: string;\n}\n\nexport interface EncoderStream {\n\twrite(str: string): Buffer;\n\tend(): Buffer | undefined;\n}\n\nexport interface DecoderStream {\n\twrite(buf: Buffer): string;\n\tend(): string | undefined;\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/lib/index.js",
    "content": "\"use strict\";\n\nvar Buffer = require(\"safer-buffer\").Buffer;\n\nvar bomHandling = require(\"./bom-handling\"),\n    iconv = module.exports;\n\n// All codecs and aliases are kept here, keyed by encoding name/alias.\n// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.\niconv.encodings = null;\n\n// Characters emitted in case of error.\niconv.defaultCharUnicode = '�';\niconv.defaultCharSingleByte = '?';\n\n// Public API.\niconv.encode = function encode(str, encoding, options) {\n    str = \"\" + (str || \"\"); // Ensure string.\n\n    var encoder = iconv.getEncoder(encoding, options);\n\n    var res = encoder.write(str);\n    var trail = encoder.end();\n    \n    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;\n}\n\niconv.decode = function decode(buf, encoding, options) {\n    if (typeof buf === 'string') {\n        if (!iconv.skipDecodeWarning) {\n            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');\n            iconv.skipDecodeWarning = true;\n        }\n\n        buf = Buffer.from(\"\" + (buf || \"\"), \"binary\"); // Ensure buffer.\n    }\n\n    var decoder = iconv.getDecoder(encoding, options);\n\n    var res = decoder.write(buf);\n    var trail = decoder.end();\n\n    return trail ? (res + trail) : res;\n}\n\niconv.encodingExists = function encodingExists(enc) {\n    try {\n        iconv.getCodec(enc);\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\n// Legacy aliases to convert functions\niconv.toEncoding = iconv.encode;\niconv.fromEncoding = iconv.decode;\n\n// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.\niconv._codecDataCache = {};\niconv.getCodec = function getCodec(encoding) {\n    if (!iconv.encodings)\n        iconv.encodings = require(\"../encodings\"); // Lazy load all encoding definitions.\n    \n    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.\n    var enc = iconv._canonicalizeEncoding(encoding);\n\n    // Traverse iconv.encodings to find actual codec.\n    var codecOptions = {};\n    while (true) {\n        var codec = iconv._codecDataCache[enc];\n        if (codec)\n            return codec;\n\n        var codecDef = iconv.encodings[enc];\n\n        switch (typeof codecDef) {\n            case \"string\": // Direct alias to other encoding.\n                enc = codecDef;\n                break;\n\n            case \"object\": // Alias with options. Can be layered.\n                for (var key in codecDef)\n                    codecOptions[key] = codecDef[key];\n\n                if (!codecOptions.encodingName)\n                    codecOptions.encodingName = enc;\n                \n                enc = codecDef.type;\n                break;\n\n            case \"function\": // Codec itself.\n                if (!codecOptions.encodingName)\n                    codecOptions.encodingName = enc;\n\n                // The codec function must load all tables and return object with .encoder and .decoder methods.\n                // It'll be called only once (for each different options object).\n                codec = new codecDef(codecOptions, iconv);\n\n                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.\n                return codec;\n\n            default:\n                throw new Error(\"Encoding not recognized: '\" + encoding + \"' (searched as: '\"+enc+\"')\");\n        }\n    }\n}\n\niconv._canonicalizeEncoding = function(encoding) {\n    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.\n    return (''+encoding).toLowerCase().replace(/:\\d{4}$|[^0-9a-z]/g, \"\");\n}\n\niconv.getEncoder = function getEncoder(encoding, options) {\n    var codec = iconv.getCodec(encoding),\n        encoder = new codec.encoder(options, codec);\n\n    if (codec.bomAware && options && options.addBOM)\n        encoder = new bomHandling.PrependBOM(encoder, options);\n\n    return encoder;\n}\n\niconv.getDecoder = function getDecoder(encoding, options) {\n    var codec = iconv.getCodec(encoding),\n        decoder = new codec.decoder(options, codec);\n\n    if (codec.bomAware && !(options && options.stripBOM === false))\n        decoder = new bomHandling.StripBOM(decoder, options);\n\n    return decoder;\n}\n\n// Streaming API\n// NOTE: Streaming API naturally depends on 'stream' module from Node.js. Unfortunately in browser environments this module can add\n// up to 100Kb to the output bundle. To avoid unnecessary code bloat, we don't enable Streaming API in browser by default.\n// If you would like to enable it explicitly, please add the following code to your app:\n// > iconv.enableStreamingAPI(require('stream'));\niconv.enableStreamingAPI = function enableStreamingAPI(stream_module) {\n    if (iconv.supportsStreams)\n        return;\n\n    // Dependency-inject stream module to create IconvLite stream classes.\n    var streams = require(\"./streams\")(stream_module);\n\n    // Not public API yet, but expose the stream classes.\n    iconv.IconvLiteEncoderStream = streams.IconvLiteEncoderStream;\n    iconv.IconvLiteDecoderStream = streams.IconvLiteDecoderStream;\n\n    // Streaming API.\n    iconv.encodeStream = function encodeStream(encoding, options) {\n        return new iconv.IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);\n    }\n\n    iconv.decodeStream = function decodeStream(encoding, options) {\n        return new iconv.IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);\n    }\n\n    iconv.supportsStreams = true;\n}\n\n// Enable Streaming API automatically if 'stream' module is available and non-empty (the majority of environments).\nvar stream_module;\ntry {\n    stream_module = require(\"stream\");\n} catch (e) {}\n\nif (stream_module && stream_module.Transform) {\n    iconv.enableStreamingAPI(stream_module);\n\n} else {\n    // In rare cases where 'stream' module is not available by default, throw a helpful exception.\n    iconv.encodeStream = iconv.decodeStream = function() {\n        throw new Error(\"iconv-lite Streaming API is not enabled. Use iconv.enableStreamingAPI(require('stream')); to enable it.\");\n    };\n}\n\nif (\"Ā\" != \"\\u0100\") {\n    console.error(\"iconv-lite warning: js files use non-utf8 encoding. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.\");\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/lib/streams.js",
    "content": "\"use strict\";\n\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// NOTE: Due to 'stream' module being pretty large (~100Kb, significant in browser environments), \n// we opt to dependency-inject it instead of creating a hard dependency.\nmodule.exports = function(stream_module) {\n    var Transform = stream_module.Transform;\n\n    // == Encoder stream =======================================================\n\n    function IconvLiteEncoderStream(conv, options) {\n        this.conv = conv;\n        options = options || {};\n        options.decodeStrings = false; // We accept only strings, so we don't need to decode them.\n        Transform.call(this, options);\n    }\n\n    IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {\n        constructor: { value: IconvLiteEncoderStream }\n    });\n\n    IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {\n        if (typeof chunk != 'string')\n            return done(new Error(\"Iconv encoding stream needs strings as its input.\"));\n        try {\n            var res = this.conv.write(chunk);\n            if (res && res.length) this.push(res);\n            done();\n        }\n        catch (e) {\n            done(e);\n        }\n    }\n\n    IconvLiteEncoderStream.prototype._flush = function(done) {\n        try {\n            var res = this.conv.end();\n            if (res && res.length) this.push(res);\n            done();\n        }\n        catch (e) {\n            done(e);\n        }\n    }\n\n    IconvLiteEncoderStream.prototype.collect = function(cb) {\n        var chunks = [];\n        this.on('error', cb);\n        this.on('data', function(chunk) { chunks.push(chunk); });\n        this.on('end', function() {\n            cb(null, Buffer.concat(chunks));\n        });\n        return this;\n    }\n\n\n    // == Decoder stream =======================================================\n\n    function IconvLiteDecoderStream(conv, options) {\n        this.conv = conv;\n        options = options || {};\n        options.encoding = this.encoding = 'utf8'; // We output strings.\n        Transform.call(this, options);\n    }\n\n    IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {\n        constructor: { value: IconvLiteDecoderStream }\n    });\n\n    IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {\n        if (!Buffer.isBuffer(chunk) && !(chunk instanceof Uint8Array))\n            return done(new Error(\"Iconv decoding stream needs buffers as its input.\"));\n        try {\n            var res = this.conv.write(chunk);\n            if (res && res.length) this.push(res, this.encoding);\n            done();\n        }\n        catch (e) {\n            done(e);\n        }\n    }\n\n    IconvLiteDecoderStream.prototype._flush = function(done) {\n        try {\n            var res = this.conv.end();\n            if (res && res.length) this.push(res, this.encoding);                \n            done();\n        }\n        catch (e) {\n            done(e);\n        }\n    }\n\n    IconvLiteDecoderStream.prototype.collect = function(cb) {\n        var res = '';\n        this.on('error', cb);\n        this.on('data', function(chunk) { res += chunk; });\n        this.on('end', function() {\n            cb(null, res);\n        });\n        return this;\n    }\n\n    return {\n        IconvLiteEncoderStream: IconvLiteEncoderStream,\n        IconvLiteDecoderStream: IconvLiteDecoderStream,\n    };\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/iconv-lite/package.json",
    "content": "{\n    \"name\": \"iconv-lite\",\n    \"description\": \"Convert character encodings in pure javascript.\",\n    \"version\": \"0.6.3\",\n    \"license\": \"MIT\",\n    \"keywords\": [\n        \"iconv\",\n        \"convert\",\n        \"charset\",\n        \"icu\"\n    ],\n    \"author\": \"Alexander Shtuchkin <ashtuchkin@gmail.com>\",\n    \"main\": \"./lib/index.js\",\n    \"typings\": \"./lib/index.d.ts\",\n    \"homepage\": \"https://github.com/ashtuchkin/iconv-lite\",\n    \"bugs\": \"https://github.com/ashtuchkin/iconv-lite/issues\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git://github.com/ashtuchkin/iconv-lite.git\"\n    },\n    \"engines\": {\n        \"node\": \">=0.10.0\"\n    },\n    \"scripts\": {\n        \"coverage\": \"c8 _mocha --grep .\",\n        \"test\": \"mocha --reporter spec --grep .\"\n    },\n    \"browser\": {\n        \"stream\": false\n    },\n    \"devDependencies\": {\n        \"async\": \"^3.2.0\",\n        \"c8\": \"^7.2.0\",\n        \"errto\": \"^0.2.1\",\n        \"iconv\": \"^2.3.5\",\n        \"mocha\": \"^3.5.3\",\n        \"request\": \"^2.88.2\",\n        \"semver\": \"^6.3.0\",\n        \"unorm\": \"^1.6.0\"\n    },\n    \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/LICENSE",
    "content": "Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n\nBased on Underscore.js, copyright Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/lodash/lodash\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code displayed within the prose of the\ndocumentation.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nFiles located in the node_modules and vendor directories are externally\nmaintained libraries used by this software which have their own\nlicenses; we recommend you read them, as their terms may differ from the\nterms above.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/README.md",
    "content": "# lodash v4.17.21\n\nThe [Lodash](https://lodash.com/) library exported as [Node.js](https://nodejs.org/) modules.\n\n## Installation\n\nUsing npm:\n```shell\n$ npm i -g npm\n$ npm i --save lodash\n```\n\nIn Node.js:\n```js\n// Load the full build.\nvar _ = require('lodash');\n// Load the core build.\nvar _ = require('lodash/core');\n// Load the FP build for immutable auto-curried iteratee-first data-last methods.\nvar fp = require('lodash/fp');\n\n// Load method categories.\nvar array = require('lodash/array');\nvar object = require('lodash/fp/object');\n\n// Cherry-pick methods for smaller browserify/rollup/webpack bundles.\nvar at = require('lodash/at');\nvar curryN = require('lodash/fp/curryN');\n```\n\nSee the [package source](https://github.com/lodash/lodash/tree/4.17.21-npm) for more details.\n\n**Note:**<br>\nInstall [n_](https://www.npmjs.com/package/n_) for Lodash use in the Node.js < 6 REPL.\n\n## Support\n\nTested in Chrome 74-75, Firefox 66-67, IE 11, Edge 18, Safari 11-12, & Node.js 8-12.<br>\nAutomated [browser](https://saucelabs.com/u/lodash) & [CI](https://travis-ci.org/lodash/lodash/) test runs are available.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_DataView.js",
    "content": "var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Hash.js",
    "content": "var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_LazyWrapper.js",
    "content": "var baseCreate = require('./_baseCreate'),\n    baseLodash = require('./_baseLodash');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__dir__ = 1;\n  this.__filtered__ = false;\n  this.__iteratees__ = [];\n  this.__takeCount__ = MAX_ARRAY_LENGTH;\n  this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_ListCache.js",
    "content": "var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_LodashWrapper.js",
    "content": "var baseCreate = require('./_baseCreate'),\n    baseLodash = require('./_baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__chain__ = !!chainAll;\n  this.__index__ = 0;\n  this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Map.js",
    "content": "var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_MapCache.js",
    "content": "var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Promise.js",
    "content": "var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Set.js",
    "content": "var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_SetCache.js",
    "content": "var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Stack.js",
    "content": "var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Symbol.js",
    "content": "var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_Uint8Array.js",
    "content": "var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_WeakMap.js",
    "content": "var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_apply.js",
    "content": "/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayAggregator.js",
    "content": "/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    var value = array[index];\n    setter(accumulator, value, iteratee(value), array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayEach.js",
    "content": "/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayEachRight.js",
    "content": "/**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEachRight(array, iteratee) {\n  var length = array == null ? 0 : array.length;\n\n  while (length--) {\n    if (iteratee(array[length], length, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEachRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayEvery.js",
    "content": "/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n *  else `false`.\n */\nfunction arrayEvery(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (!predicate(array[index], index, array)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = arrayEvery;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayFilter.js",
    "content": "/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayIncludes.js",
    "content": "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayIncludesWith.js",
    "content": "/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayLikeKeys.js",
    "content": "var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayMap.js",
    "content": "/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayPush.js",
    "content": "/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayReduce.js",
    "content": "/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayReduce;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayReduceRight.js",
    "content": "/**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduceRight(array, iteratee, accumulator, initAccum) {\n  var length = array == null ? 0 : array.length;\n  if (initAccum && length) {\n    accumulator = array[--length];\n  }\n  while (length--) {\n    accumulator = iteratee(accumulator, array[length], length, array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayReduceRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arraySample.js",
    "content": "var baseRandom = require('./_baseRandom');\n\n/**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\nfunction arraySample(array) {\n  var length = array.length;\n  return length ? array[baseRandom(0, length - 1)] : undefined;\n}\n\nmodule.exports = arraySample;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arraySampleSize.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    copyArray = require('./_copyArray'),\n    shuffleSelf = require('./_shuffleSelf');\n\n/**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\nfunction arraySampleSize(array, n) {\n  return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n}\n\nmodule.exports = arraySampleSize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arrayShuffle.js",
    "content": "var copyArray = require('./_copyArray'),\n    shuffleSelf = require('./_shuffleSelf');\n\n/**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\nfunction arrayShuffle(array) {\n  return shuffleSelf(copyArray(array));\n}\n\nmodule.exports = arrayShuffle;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_arraySome.js",
    "content": "/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_asciiSize.js",
    "content": "var baseProperty = require('./_baseProperty');\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\nmodule.exports = asciiSize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_asciiToArray.js",
    "content": "/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n  return string.split('');\n}\n\nmodule.exports = asciiToArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_asciiWords.js",
    "content": "/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n  return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_assignMergeValue.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n  if ((value !== undefined && !eq(object[key], value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignMergeValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_assignValue.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_assocIndexOf.js",
    "content": "var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseAggregator.js",
    "content": "var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n  baseEach(collection, function(value, key, collection) {\n    setter(accumulator, value, iteratee(value), collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseAggregator;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseAssign.js",
    "content": "var copyObject = require('./_copyObject'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseAssignIn.js",
    "content": "var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseAssignValue.js",
    "content": "var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseAt.js",
    "content": "var get = require('./get');\n\n/**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\nfunction baseAt(object, paths) {\n  var index = -1,\n      length = paths.length,\n      result = Array(length),\n      skip = object == null;\n\n  while (++index < length) {\n    result[index] = skip ? undefined : get(object, paths[index]);\n  }\n  return result;\n}\n\nmodule.exports = baseAt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseClamp.js",
    "content": "/**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\nfunction baseClamp(number, lower, upper) {\n  if (number === number) {\n    if (upper !== undefined) {\n      number = number <= upper ? number : upper;\n    }\n    if (lower !== undefined) {\n      number = number >= lower ? number : lower;\n    }\n  }\n  return number;\n}\n\nmodule.exports = baseClamp;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseClone.js",
    "content": "var Stack = require('./_Stack'),\n    arrayEach = require('./_arrayEach'),\n    assignValue = require('./_assignValue'),\n    baseAssign = require('./_baseAssign'),\n    baseAssignIn = require('./_baseAssignIn'),\n    cloneBuffer = require('./_cloneBuffer'),\n    copyArray = require('./_copyArray'),\n    copySymbols = require('./_copySymbols'),\n    copySymbolsIn = require('./_copySymbolsIn'),\n    getAllKeys = require('./_getAllKeys'),\n    getAllKeysIn = require('./_getAllKeysIn'),\n    getTag = require('./_getTag'),\n    initCloneArray = require('./_initCloneArray'),\n    initCloneByTag = require('./_initCloneByTag'),\n    initCloneObject = require('./_initCloneObject'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isMap = require('./isMap'),\n    isObject = require('./isObject'),\n    isSet = require('./isSet'),\n    keys = require('./keys'),\n    keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseConforms.js",
    "content": "var baseConformsTo = require('./_baseConformsTo'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseConforms(source) {\n  var props = keys(source);\n  return function(object) {\n    return baseConformsTo(object, source, props);\n  };\n}\n\nmodule.exports = baseConforms;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseConformsTo.js",
    "content": "/**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\nfunction baseConformsTo(object, source, props) {\n  var length = props.length;\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (length--) {\n    var key = props[length],\n        predicate = source[key],\n        value = object[key];\n\n    if ((value === undefined && !(key in object)) || !predicate(value)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseConformsTo;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseCreate.js",
    "content": "var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseDelay.js",
    "content": "/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\nfunction baseDelay(func, wait, args) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  return setTimeout(function() { func.apply(undefined, args); }, wait);\n}\n\nmodule.exports = baseDelay;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseDifference.js",
    "content": "var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseEach.js",
    "content": "var baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseEachRight.js",
    "content": "var baseForOwnRight = require('./_baseForOwnRight'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEachRight = createBaseEach(baseForOwnRight, true);\n\nmodule.exports = baseEachRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseEvery.js",
    "content": "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n *  else `false`\n */\nfunction baseEvery(collection, predicate) {\n  var result = true;\n  baseEach(collection, function(value, index, collection) {\n    result = !!predicate(value, index, collection);\n    return result;\n  });\n  return result;\n}\n\nmodule.exports = baseEvery;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseExtremum.js",
    "content": "var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    var value = array[index],\n        current = iteratee(value);\n\n    if (current != null && (computed === undefined\n          ? (current === current && !isSymbol(current))\n          : comparator(current, computed)\n        )) {\n      var computed = current,\n          result = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseExtremum;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFill.js",
    "content": "var toInteger = require('./toInteger'),\n    toLength = require('./toLength');\n\n/**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\nfunction baseFill(array, value, start, end) {\n  var length = array.length;\n\n  start = toInteger(start);\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = (end === undefined || end > length) ? length : toInteger(end);\n  if (end < 0) {\n    end += length;\n  }\n  end = start > end ? 0 : toLength(end);\n  while (start < end) {\n    array[start++] = value;\n  }\n  return array;\n}\n\nmodule.exports = baseFill;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFilter.js",
    "content": "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n  var result = [];\n  baseEach(collection, function(value, index, collection) {\n    if (predicate(value, index, collection)) {\n      result.push(value);\n    }\n  });\n  return result;\n}\n\nmodule.exports = baseFilter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFindIndex.js",
    "content": "/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFindKey.js",
    "content": "/**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\nfunction baseFindKey(collection, predicate, eachFunc) {\n  var result;\n  eachFunc(collection, function(value, key, collection) {\n    if (predicate(value, key, collection)) {\n      result = key;\n      return false;\n    }\n  });\n  return result;\n}\n\nmodule.exports = baseFindKey;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFlatten.js",
    "content": "var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFor.js",
    "content": "var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseForOwn.js",
    "content": "var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseForOwnRight.js",
    "content": "var baseForRight = require('./_baseForRight'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwnRight(object, iteratee) {\n  return object && baseForRight(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwnRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseForRight.js",
    "content": "var createBaseFor = require('./_createBaseFor');\n\n/**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseForRight = createBaseFor(true);\n\nmodule.exports = baseForRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseFunctions.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    isFunction = require('./isFunction');\n\n/**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\nfunction baseFunctions(object, props) {\n  return arrayFilter(props, function(key) {\n    return isFunction(object[key]);\n  });\n}\n\nmodule.exports = baseFunctions;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseGet.js",
    "content": "var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseGetAllKeys.js",
    "content": "var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseGetTag.js",
    "content": "var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseGt.js",
    "content": "/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n *  else `false`.\n */\nfunction baseGt(value, other) {\n  return value > other;\n}\n\nmodule.exports = baseGt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseHas.js",
    "content": "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n  return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseHasIn.js",
    "content": "/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseInRange.js",
    "content": "/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\nfunction baseInRange(number, start, end) {\n  return number >= nativeMin(start, end) && number < nativeMax(start, end);\n}\n\nmodule.exports = baseInRange;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIndexOf.js",
    "content": "var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIndexOfWith.js",
    "content": "/**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOfWith(array, value, fromIndex, comparator) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (comparator(array[index], value)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseIndexOfWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIntersection.js",
    "content": "var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n  var includes = comparator ? arrayIncludesWith : arrayIncludes,\n      length = arrays[0].length,\n      othLength = arrays.length,\n      othIndex = othLength,\n      caches = Array(othLength),\n      maxLength = Infinity,\n      result = [];\n\n  while (othIndex--) {\n    var array = arrays[othIndex];\n    if (othIndex && iteratee) {\n      array = arrayMap(array, baseUnary(iteratee));\n    }\n    maxLength = nativeMin(array.length, maxLength);\n    caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n      ? new SetCache(othIndex && array)\n      : undefined;\n  }\n  array = arrays[0];\n\n  var index = -1,\n      seen = caches[0];\n\n  outer:\n  while (++index < length && result.length < maxLength) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (!(seen\n          ? cacheHas(seen, computed)\n          : includes(result, computed, comparator)\n        )) {\n      othIndex = othLength;\n      while (--othIndex) {\n        var cache = caches[othIndex];\n        if (!(cache\n              ? cacheHas(cache, computed)\n              : includes(arrays[othIndex], computed, comparator))\n            ) {\n          continue outer;\n        }\n      }\n      if (seen) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseIntersection;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseInverter.js",
    "content": "var baseForOwn = require('./_baseForOwn');\n\n/**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseInverter(object, setter, iteratee, accumulator) {\n  baseForOwn(object, function(value, key, object) {\n    setter(accumulator, iteratee(value), key, object);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseInverter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseInvoke.js",
    "content": "var apply = require('./_apply'),\n    castPath = require('./_castPath'),\n    last = require('./last'),\n    parent = require('./_parent'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\nfunction baseInvoke(object, path, args) {\n  path = castPath(path, object);\n  object = parent(object, path);\n  var func = object == null ? object : object[toKey(last(path))];\n  return func == null ? undefined : apply(func, object, args);\n}\n\nmodule.exports = baseInvoke;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsArguments.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsArrayBuffer.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\nvar arrayBufferTag = '[object ArrayBuffer]';\n\n/**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\nfunction baseIsArrayBuffer(value) {\n  return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n}\n\nmodule.exports = baseIsArrayBuffer;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsDate.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar dateTag = '[object Date]';\n\n/**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\nfunction baseIsDate(value) {\n  return isObjectLike(value) && baseGetTag(value) == dateTag;\n}\n\nmodule.exports = baseIsDate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsEqual.js",
    "content": "var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsEqualDeep.js",
    "content": "var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsMap.js",
    "content": "var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsMatch.js",
    "content": "var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsNaN.js",
    "content": "/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsNative.js",
    "content": "var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsRegExp.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n  return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsSet.js",
    "content": "var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIsTypedArray.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseIteratee.js",
    "content": "var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseKeys.js",
    "content": "var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseKeysIn.js",
    "content": "var isObject = require('./isObject'),\n    isPrototype = require('./_isPrototype'),\n    nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseLodash.js",
    "content": "/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n  // No operation performed.\n}\n\nmodule.exports = baseLodash;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseLt.js",
    "content": "/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n *  else `false`.\n */\nfunction baseLt(value, other) {\n  return value < other;\n}\n\nmodule.exports = baseLt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseMap.js",
    "content": "var baseEach = require('./_baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseMatches.js",
    "content": "var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseMatchesProperty.js",
    "content": "var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseMean.js",
    "content": "var baseSum = require('./_baseSum');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\nfunction baseMean(array, iteratee) {\n  var length = array == null ? 0 : array.length;\n  return length ? (baseSum(array, iteratee) / length) : NAN;\n}\n\nmodule.exports = baseMean;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseMerge.js",
    "content": "var Stack = require('./_Stack'),\n    assignMergeValue = require('./_assignMergeValue'),\n    baseFor = require('./_baseFor'),\n    baseMergeDeep = require('./_baseMergeDeep'),\n    isObject = require('./isObject'),\n    keysIn = require('./keysIn'),\n    safeGet = require('./_safeGet');\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n  if (object === source) {\n    return;\n  }\n  baseFor(source, function(srcValue, key) {\n    stack || (stack = new Stack);\n    if (isObject(srcValue)) {\n      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n    }\n    else {\n      var newValue = customizer\n        ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      if (newValue === undefined) {\n        newValue = srcValue;\n      }\n      assignMergeValue(object, key, newValue);\n    }\n  }, keysIn);\n}\n\nmodule.exports = baseMerge;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseMergeDeep.js",
    "content": "var assignMergeValue = require('./_assignMergeValue'),\n    cloneBuffer = require('./_cloneBuffer'),\n    cloneTypedArray = require('./_cloneTypedArray'),\n    copyArray = require('./_copyArray'),\n    initCloneObject = require('./_initCloneObject'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    isBuffer = require('./isBuffer'),\n    isFunction = require('./isFunction'),\n    isObject = require('./isObject'),\n    isPlainObject = require('./isPlainObject'),\n    isTypedArray = require('./isTypedArray'),\n    safeGet = require('./_safeGet'),\n    toPlainObject = require('./toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n  var objValue = safeGet(object, key),\n      srcValue = safeGet(source, key),\n      stacked = stack.get(srcValue);\n\n  if (stacked) {\n    assignMergeValue(object, key, stacked);\n    return;\n  }\n  var newValue = customizer\n    ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n    : undefined;\n\n  var isCommon = newValue === undefined;\n\n  if (isCommon) {\n    var isArr = isArray(srcValue),\n        isBuff = !isArr && isBuffer(srcValue),\n        isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n    newValue = srcValue;\n    if (isArr || isBuff || isTyped) {\n      if (isArray(objValue)) {\n        newValue = objValue;\n      }\n      else if (isArrayLikeObject(objValue)) {\n        newValue = copyArray(objValue);\n      }\n      else if (isBuff) {\n        isCommon = false;\n        newValue = cloneBuffer(srcValue, true);\n      }\n      else if (isTyped) {\n        isCommon = false;\n        newValue = cloneTypedArray(srcValue, true);\n      }\n      else {\n        newValue = [];\n      }\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      newValue = objValue;\n      if (isArguments(objValue)) {\n        newValue = toPlainObject(objValue);\n      }\n      else if (!isObject(objValue) || isFunction(objValue)) {\n        newValue = initCloneObject(srcValue);\n      }\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    stack.set(srcValue, newValue);\n    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n    stack['delete'](srcValue);\n  }\n  assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseNth.js",
    "content": "var isIndex = require('./_isIndex');\n\n/**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\nfunction baseNth(array, n) {\n  var length = array.length;\n  if (!length) {\n    return;\n  }\n  n += n < 0 ? length : 0;\n  return isIndex(n, length) ? array[n] : undefined;\n}\n\nmodule.exports = baseNth;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseOrderBy.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseGet = require('./_baseGet'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    baseSortBy = require('./_baseSortBy'),\n    baseUnary = require('./_baseUnary'),\n    compareMultiple = require('./_compareMultiple'),\n    identity = require('./identity'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n  if (iteratees.length) {\n    iteratees = arrayMap(iteratees, function(iteratee) {\n      if (isArray(iteratee)) {\n        return function(value) {\n          return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n        }\n      }\n      return iteratee;\n    });\n  } else {\n    iteratees = [identity];\n  }\n\n  var index = -1;\n  iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n  var result = baseMap(collection, function(value, key, collection) {\n    var criteria = arrayMap(iteratees, function(iteratee) {\n      return iteratee(value);\n    });\n    return { 'criteria': criteria, 'index': ++index, 'value': value };\n  });\n\n  return baseSortBy(result, function(object, other) {\n    return compareMultiple(object, other, orders);\n  });\n}\n\nmodule.exports = baseOrderBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_basePick.js",
    "content": "var basePickBy = require('./_basePickBy'),\n    hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n  return basePickBy(object, paths, function(value, path) {\n    return hasIn(object, path);\n  });\n}\n\nmodule.exports = basePick;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_basePickBy.js",
    "content": "var baseGet = require('./_baseGet'),\n    baseSet = require('./_baseSet'),\n    castPath = require('./_castPath');\n\n/**\n * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n  var index = -1,\n      length = paths.length,\n      result = {};\n\n  while (++index < length) {\n    var path = paths[index],\n        value = baseGet(object, path);\n\n    if (predicate(value, path)) {\n      baseSet(result, castPath(path, object), value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = basePickBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseProperty.js",
    "content": "/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_basePropertyDeep.js",
    "content": "var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_basePropertyOf.js",
    "content": "/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n  return function(key) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = basePropertyOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_basePullAll.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseIndexOf = require('./_baseIndexOf'),\n    baseIndexOfWith = require('./_baseIndexOfWith'),\n    baseUnary = require('./_baseUnary'),\n    copyArray = require('./_copyArray');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\nfunction basePullAll(array, values, iteratee, comparator) {\n  var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n      index = -1,\n      length = values.length,\n      seen = array;\n\n  if (array === values) {\n    values = copyArray(values);\n  }\n  if (iteratee) {\n    seen = arrayMap(array, baseUnary(iteratee));\n  }\n  while (++index < length) {\n    var fromIndex = 0,\n        value = values[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n      if (seen !== array) {\n        splice.call(seen, fromIndex, 1);\n      }\n      splice.call(array, fromIndex, 1);\n    }\n  }\n  return array;\n}\n\nmodule.exports = basePullAll;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_basePullAt.js",
    "content": "var baseUnset = require('./_baseUnset'),\n    isIndex = require('./_isIndex');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\nfunction basePullAt(array, indexes) {\n  var length = array ? indexes.length : 0,\n      lastIndex = length - 1;\n\n  while (length--) {\n    var index = indexes[length];\n    if (length == lastIndex || index !== previous) {\n      var previous = index;\n      if (isIndex(index)) {\n        splice.call(array, index, 1);\n      } else {\n        baseUnset(array, index);\n      }\n    }\n  }\n  return array;\n}\n\nmodule.exports = basePullAt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseRandom.js",
    "content": "/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n    nativeRandom = Math.random;\n\n/**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\nfunction baseRandom(lower, upper) {\n  return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n}\n\nmodule.exports = baseRandom;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseRange.js",
    "content": "/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n    nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n  var index = -1,\n      length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n      result = Array(length);\n\n  while (length--) {\n    result[fromRight ? length : ++index] = start;\n    start += step;\n  }\n  return result;\n}\n\nmodule.exports = baseRange;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseReduce.js",
    "content": "/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n *  `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n  eachFunc(collection, function(value, index, collection) {\n    accumulator = initAccum\n      ? (initAccum = false, value)\n      : iteratee(accumulator, value, index, collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseReduce;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseRepeat.js",
    "content": "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor;\n\n/**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\nfunction baseRepeat(string, n) {\n  var result = '';\n  if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n    return result;\n  }\n  // Leverage the exponentiation by squaring algorithm for a faster repeat.\n  // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n  do {\n    if (n % 2) {\n      result += string;\n    }\n    n = nativeFloor(n / 2);\n    if (n) {\n      string += string;\n    }\n  } while (n);\n\n  return result;\n}\n\nmodule.exports = baseRepeat;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseRest.js",
    "content": "var identity = require('./identity'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSample.js",
    "content": "var arraySample = require('./_arraySample'),\n    values = require('./values');\n\n/**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\nfunction baseSample(collection) {\n  return arraySample(values(collection));\n}\n\nmodule.exports = baseSample;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSampleSize.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    shuffleSelf = require('./_shuffleSelf'),\n    values = require('./values');\n\n/**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\nfunction baseSampleSize(collection, n) {\n  var array = values(collection);\n  return shuffleSelf(array, baseClamp(n, 0, array.length));\n}\n\nmodule.exports = baseSampleSize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSet.js",
    "content": "var assignValue = require('./_assignValue'),\n    castPath = require('./_castPath'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n  if (!isObject(object)) {\n    return object;\n  }\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      lastIndex = length - 1,\n      nested = object;\n\n  while (nested != null && ++index < length) {\n    var key = toKey(path[index]),\n        newValue = value;\n\n    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n      return object;\n    }\n\n    if (index != lastIndex) {\n      var objValue = nested[key];\n      newValue = customizer ? customizer(objValue, key, nested) : undefined;\n      if (newValue === undefined) {\n        newValue = isObject(objValue)\n          ? objValue\n          : (isIndex(path[index + 1]) ? [] : {});\n      }\n    }\n    assignValue(nested, key, newValue);\n    nested = nested[key];\n  }\n  return object;\n}\n\nmodule.exports = baseSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSetData.js",
    "content": "var identity = require('./identity'),\n    metaMap = require('./_metaMap');\n\n/**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar baseSetData = !metaMap ? identity : function(func, data) {\n  metaMap.set(func, data);\n  return func;\n};\n\nmodule.exports = baseSetData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSetToString.js",
    "content": "var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseShuffle.js",
    "content": "var shuffleSelf = require('./_shuffleSelf'),\n    values = require('./values');\n\n/**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\nfunction baseShuffle(collection) {\n  return shuffleSelf(values(collection));\n}\n\nmodule.exports = baseShuffle;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSlice.js",
    "content": "/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nmodule.exports = baseSlice;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSome.js",
    "content": "var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction baseSome(collection, predicate) {\n  var result;\n\n  baseEach(collection, function(value, index, collection) {\n    result = predicate(value, index, collection);\n    return !result;\n  });\n  return !!result;\n}\n\nmodule.exports = baseSome;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSortBy.js",
    "content": "/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n  var length = array.length;\n\n  array.sort(comparer);\n  while (length--) {\n    array[length] = array[length].value;\n  }\n  return array;\n}\n\nmodule.exports = baseSortBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSortedIndex.js",
    "content": "var baseSortedIndexBy = require('./_baseSortedIndexBy'),\n    identity = require('./identity'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n    HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n/**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n */\nfunction baseSortedIndex(array, value, retHighest) {\n  var low = 0,\n      high = array == null ? low : array.length;\n\n  if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n    while (low < high) {\n      var mid = (low + high) >>> 1,\n          computed = array[mid];\n\n      if (computed !== null && !isSymbol(computed) &&\n          (retHighest ? (computed <= value) : (computed < value))) {\n        low = mid + 1;\n      } else {\n        high = mid;\n      }\n    }\n    return high;\n  }\n  return baseSortedIndexBy(array, value, identity, retHighest);\n}\n\nmodule.exports = baseSortedIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSortedIndexBy.js",
    "content": "var isSymbol = require('./isSymbol');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n    MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n    nativeMin = Math.min;\n\n/**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n */\nfunction baseSortedIndexBy(array, value, iteratee, retHighest) {\n  var low = 0,\n      high = array == null ? 0 : array.length;\n  if (high === 0) {\n    return 0;\n  }\n\n  value = iteratee(value);\n  var valIsNaN = value !== value,\n      valIsNull = value === null,\n      valIsSymbol = isSymbol(value),\n      valIsUndefined = value === undefined;\n\n  while (low < high) {\n    var mid = nativeFloor((low + high) / 2),\n        computed = iteratee(array[mid]),\n        othIsDefined = computed !== undefined,\n        othIsNull = computed === null,\n        othIsReflexive = computed === computed,\n        othIsSymbol = isSymbol(computed);\n\n    if (valIsNaN) {\n      var setLow = retHighest || othIsReflexive;\n    } else if (valIsUndefined) {\n      setLow = othIsReflexive && (retHighest || othIsDefined);\n    } else if (valIsNull) {\n      setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n    } else if (valIsSymbol) {\n      setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n    } else if (othIsNull || othIsSymbol) {\n      setLow = false;\n    } else {\n      setLow = retHighest ? (computed <= value) : (computed < value);\n    }\n    if (setLow) {\n      low = mid + 1;\n    } else {\n      high = mid;\n    }\n  }\n  return nativeMin(high, MAX_ARRAY_INDEX);\n}\n\nmodule.exports = baseSortedIndexBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSortedUniq.js",
    "content": "var eq = require('./eq');\n\n/**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseSortedUniq(array, iteratee) {\n  var index = -1,\n      length = array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    if (!index || !eq(computed, seen)) {\n      var seen = computed;\n      result[resIndex++] = value === 0 ? 0 : value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseSortedUniq;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseSum.js",
    "content": "/**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\nfunction baseSum(array, iteratee) {\n  var result,\n      index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    var current = iteratee(array[index]);\n    if (current !== undefined) {\n      result = result === undefined ? current : (result + current);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseSum;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseTimes.js",
    "content": "/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseToNumber.js",
    "content": "var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\nfunction baseToNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  return +value;\n}\n\nmodule.exports = baseToNumber;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseToPairs.js",
    "content": "var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\nfunction baseToPairs(object, props) {\n  return arrayMap(props, function(key) {\n    return [key, object[key]];\n  });\n}\n\nmodule.exports = baseToPairs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseToString.js",
    "content": "var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseTrim.js",
    "content": "var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nmodule.exports = baseTrim;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseUnary.js",
    "content": "/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseUniq.js",
    "content": "var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseUnset.js",
    "content": "var castPath = require('./_castPath'),\n    last = require('./last'),\n    parent = require('./_parent'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\nfunction baseUnset(object, path) {\n  path = castPath(path, object);\n  object = parent(object, path);\n  return object == null || delete object[toKey(last(path))];\n}\n\nmodule.exports = baseUnset;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseUpdate.js",
    "content": "var baseGet = require('./_baseGet'),\n    baseSet = require('./_baseSet');\n\n/**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseUpdate(object, path, updater, customizer) {\n  return baseSet(object, path, updater(baseGet(object, path)), customizer);\n}\n\nmodule.exports = baseUpdate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseValues.js",
    "content": "var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  return arrayMap(props, function(key) {\n    return object[key];\n  });\n}\n\nmodule.exports = baseValues;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseWhile.js",
    "content": "var baseSlice = require('./_baseSlice');\n\n/**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseWhile(array, predicate, isDrop, fromRight) {\n  var length = array.length,\n      index = fromRight ? length : -1;\n\n  while ((fromRight ? index-- : ++index < length) &&\n    predicate(array[index], index, array)) {}\n\n  return isDrop\n    ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n    : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n}\n\nmodule.exports = baseWhile;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseWrapperValue.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    arrayPush = require('./_arrayPush'),\n    arrayReduce = require('./_arrayReduce');\n\n/**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\nfunction baseWrapperValue(value, actions) {\n  var result = value;\n  if (result instanceof LazyWrapper) {\n    result = result.value();\n  }\n  return arrayReduce(actions, function(result, action) {\n    return action.func.apply(action.thisArg, arrayPush([result], action.args));\n  }, result);\n}\n\nmodule.exports = baseWrapperValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseXor.js",
    "content": "var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseUniq = require('./_baseUniq');\n\n/**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\nfunction baseXor(arrays, iteratee, comparator) {\n  var length = arrays.length;\n  if (length < 2) {\n    return length ? baseUniq(arrays[0]) : [];\n  }\n  var index = -1,\n      result = Array(length);\n\n  while (++index < length) {\n    var array = arrays[index],\n        othIndex = -1;\n\n    while (++othIndex < length) {\n      if (othIndex != index) {\n        result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n      }\n    }\n  }\n  return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n}\n\nmodule.exports = baseXor;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_baseZipObject.js",
    "content": "/**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\nfunction baseZipObject(props, values, assignFunc) {\n  var index = -1,\n      length = props.length,\n      valsLength = values.length,\n      result = {};\n\n  while (++index < length) {\n    var value = index < valsLength ? values[index] : undefined;\n    assignFunc(result, props[index], value);\n  }\n  return result;\n}\n\nmodule.exports = baseZipObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cacheHas.js",
    "content": "/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_castArrayLikeObject.js",
    "content": "var isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n  return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_castFunction.js",
    "content": "var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n  return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_castPath.js",
    "content": "var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_castRest.js",
    "content": "var baseRest = require('./_baseRest');\n\n/**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nvar castRest = baseRest;\n\nmodule.exports = castRest;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_castSlice.js",
    "content": "var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n  var length = array.length;\n  end = end === undefined ? length : end;\n  return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_charsEndIndex.js",
    "content": "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\nfunction charsEndIndex(strSymbols, chrSymbols) {\n  var index = strSymbols.length;\n\n  while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n  return index;\n}\n\nmodule.exports = charsEndIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_charsStartIndex.js",
    "content": "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\nfunction charsStartIndex(strSymbols, chrSymbols) {\n  var index = -1,\n      length = strSymbols.length;\n\n  while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n  return index;\n}\n\nmodule.exports = charsStartIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cloneArrayBuffer.js",
    "content": "var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cloneBuffer.js",
    "content": "var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nmodule.exports = cloneBuffer;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cloneDataView.js",
    "content": "var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cloneRegExp.js",
    "content": "/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cloneSymbol.js",
    "content": "var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_cloneTypedArray.js",
    "content": "var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_compareAscending.js",
    "content": "var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n  if (value !== other) {\n    var valIsDefined = value !== undefined,\n        valIsNull = value === null,\n        valIsReflexive = value === value,\n        valIsSymbol = isSymbol(value);\n\n    var othIsDefined = other !== undefined,\n        othIsNull = other === null,\n        othIsReflexive = other === other,\n        othIsSymbol = isSymbol(other);\n\n    if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n        (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n        (valIsNull && othIsDefined && othIsReflexive) ||\n        (!valIsDefined && othIsReflexive) ||\n        !valIsReflexive) {\n      return 1;\n    }\n    if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n        (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n        (othIsNull && valIsDefined && valIsReflexive) ||\n        (!othIsDefined && valIsReflexive) ||\n        !othIsReflexive) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\nmodule.exports = compareAscending;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_compareMultiple.js",
    "content": "var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n  var index = -1,\n      objCriteria = object.criteria,\n      othCriteria = other.criteria,\n      length = objCriteria.length,\n      ordersLength = orders.length;\n\n  while (++index < length) {\n    var result = compareAscending(objCriteria[index], othCriteria[index]);\n    if (result) {\n      if (index >= ordersLength) {\n        return result;\n      }\n      var order = orders[index];\n      return result * (order == 'desc' ? -1 : 1);\n    }\n  }\n  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n  // that causes it, under certain circumstances, to provide the same value for\n  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n  // for more details.\n  //\n  // This also ensures a stable sort in V8 and other engines.\n  // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n  return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_composeArgs.js",
    "content": "/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgs(args, partials, holders, isCurried) {\n  var argsIndex = -1,\n      argsLength = args.length,\n      holdersLength = holders.length,\n      leftIndex = -1,\n      leftLength = partials.length,\n      rangeLength = nativeMax(argsLength - holdersLength, 0),\n      result = Array(leftLength + rangeLength),\n      isUncurried = !isCurried;\n\n  while (++leftIndex < leftLength) {\n    result[leftIndex] = partials[leftIndex];\n  }\n  while (++argsIndex < holdersLength) {\n    if (isUncurried || argsIndex < argsLength) {\n      result[holders[argsIndex]] = args[argsIndex];\n    }\n  }\n  while (rangeLength--) {\n    result[leftIndex++] = args[argsIndex++];\n  }\n  return result;\n}\n\nmodule.exports = composeArgs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_composeArgsRight.js",
    "content": "/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgsRight(args, partials, holders, isCurried) {\n  var argsIndex = -1,\n      argsLength = args.length,\n      holdersIndex = -1,\n      holdersLength = holders.length,\n      rightIndex = -1,\n      rightLength = partials.length,\n      rangeLength = nativeMax(argsLength - holdersLength, 0),\n      result = Array(rangeLength + rightLength),\n      isUncurried = !isCurried;\n\n  while (++argsIndex < rangeLength) {\n    result[argsIndex] = args[argsIndex];\n  }\n  var offset = argsIndex;\n  while (++rightIndex < rightLength) {\n    result[offset + rightIndex] = partials[rightIndex];\n  }\n  while (++holdersIndex < holdersLength) {\n    if (isUncurried || argsIndex < argsLength) {\n      result[offset + holders[holdersIndex]] = args[argsIndex++];\n    }\n  }\n  return result;\n}\n\nmodule.exports = composeArgsRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_copyArray.js",
    "content": "/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_copyObject.js",
    "content": "var assignValue = require('./_assignValue'),\n    baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nmodule.exports = copyObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_copySymbols.js",
    "content": "var copyObject = require('./_copyObject'),\n    getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_copySymbolsIn.js",
    "content": "var copyObject = require('./_copyObject'),\n    getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_coreJsData.js",
    "content": "var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_countHolders.js",
    "content": "/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\nfunction countHolders(array, placeholder) {\n  var length = array.length,\n      result = 0;\n\n  while (length--) {\n    if (array[length] === placeholder) {\n      ++result;\n    }\n  }\n  return result;\n}\n\nmodule.exports = countHolders;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createAggregator.js",
    "content": "var arrayAggregator = require('./_arrayAggregator'),\n    baseAggregator = require('./_baseAggregator'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n  return function(collection, iteratee) {\n    var func = isArray(collection) ? arrayAggregator : baseAggregator,\n        accumulator = initializer ? initializer() : {};\n\n    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n  };\n}\n\nmodule.exports = createAggregator;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createAssigner.js",
    "content": "var baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return baseRest(function(object, sources) {\n    var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined;\n\n    customizer = (assigner.length > 3 && typeof customizer == 'function')\n      ? (length--, customizer)\n      : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    object = Object(object);\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, index, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createBaseEach.js",
    "content": "var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createBaseFor.js",
    "content": "/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createBind.js",
    "content": "var createCtor = require('./_createCtor'),\n    root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createBind(func, bitmask, thisArg) {\n  var isBind = bitmask & WRAP_BIND_FLAG,\n      Ctor = createCtor(func);\n\n  function wrapper() {\n    var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n    return fn.apply(isBind ? thisArg : this, arguments);\n  }\n  return wrapper;\n}\n\nmodule.exports = createBind;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createCaseFirst.js",
    "content": "var castSlice = require('./_castSlice'),\n    hasUnicode = require('./_hasUnicode'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n  return function(string) {\n    string = toString(string);\n\n    var strSymbols = hasUnicode(string)\n      ? stringToArray(string)\n      : undefined;\n\n    var chr = strSymbols\n      ? strSymbols[0]\n      : string.charAt(0);\n\n    var trailing = strSymbols\n      ? castSlice(strSymbols, 1).join('')\n      : string.slice(1);\n\n    return chr[methodName]() + trailing;\n  };\n}\n\nmodule.exports = createCaseFirst;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createCompounder.js",
    "content": "var arrayReduce = require('./_arrayReduce'),\n    deburr = require('./deburr'),\n    words = require('./words');\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n  return function(string) {\n    return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n  };\n}\n\nmodule.exports = createCompounder;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createCtor.js",
    "content": "var baseCreate = require('./_baseCreate'),\n    isObject = require('./isObject');\n\n/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCtor(Ctor) {\n  return function() {\n    // Use a `switch` statement to work with class constructors. See\n    // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n    // for more details.\n    var args = arguments;\n    switch (args.length) {\n      case 0: return new Ctor;\n      case 1: return new Ctor(args[0]);\n      case 2: return new Ctor(args[0], args[1]);\n      case 3: return new Ctor(args[0], args[1], args[2]);\n      case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n    }\n    var thisBinding = baseCreate(Ctor.prototype),\n        result = Ctor.apply(thisBinding, args);\n\n    // Mimic the constructor's `return` behavior.\n    // See https://es5.github.io/#x13.2.2 for more details.\n    return isObject(result) ? result : thisBinding;\n  };\n}\n\nmodule.exports = createCtor;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createCurry.js",
    "content": "var apply = require('./_apply'),\n    createCtor = require('./_createCtor'),\n    createHybrid = require('./_createHybrid'),\n    createRecurry = require('./_createRecurry'),\n    getHolder = require('./_getHolder'),\n    replaceHolders = require('./_replaceHolders'),\n    root = require('./_root');\n\n/**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCurry(func, bitmask, arity) {\n  var Ctor = createCtor(func);\n\n  function wrapper() {\n    var length = arguments.length,\n        args = Array(length),\n        index = length,\n        placeholder = getHolder(wrapper);\n\n    while (index--) {\n      args[index] = arguments[index];\n    }\n    var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n      ? []\n      : replaceHolders(args, placeholder);\n\n    length -= holders.length;\n    if (length < arity) {\n      return createRecurry(\n        func, bitmask, createHybrid, wrapper.placeholder, undefined,\n        args, holders, undefined, undefined, arity - length);\n    }\n    var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n    return apply(fn, this, args);\n  }\n  return wrapper;\n}\n\nmodule.exports = createCurry;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createFind.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    isArrayLike = require('./isArrayLike'),\n    keys = require('./keys');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n  return function(collection, predicate, fromIndex) {\n    var iterable = Object(collection);\n    if (!isArrayLike(collection)) {\n      var iteratee = baseIteratee(predicate, 3);\n      collection = keys(collection);\n      predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n    }\n    var index = findIndexFunc(collection, predicate, fromIndex);\n    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n  };\n}\n\nmodule.exports = createFind;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createFlow.js",
    "content": "var LodashWrapper = require('./_LodashWrapper'),\n    flatRest = require('./_flatRest'),\n    getData = require('./_getData'),\n    getFuncName = require('./_getFuncName'),\n    isArray = require('./isArray'),\n    isLaziable = require('./_isLaziable');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_ARY_FLAG = 128,\n    WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\nfunction createFlow(fromRight) {\n  return flatRest(function(funcs) {\n    var length = funcs.length,\n        index = length,\n        prereq = LodashWrapper.prototype.thru;\n\n    if (fromRight) {\n      funcs.reverse();\n    }\n    while (index--) {\n      var func = funcs[index];\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n        var wrapper = new LodashWrapper([], true);\n      }\n    }\n    index = wrapper ? index : length;\n    while (++index < length) {\n      func = funcs[index];\n\n      var funcName = getFuncName(func),\n          data = funcName == 'wrapper' ? getData(func) : undefined;\n\n      if (data && isLaziable(data[0]) &&\n            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n            !data[4].length && data[9] == 1\n          ) {\n        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n      } else {\n        wrapper = (func.length == 1 && isLaziable(func))\n          ? wrapper[funcName]()\n          : wrapper.thru(func);\n      }\n    }\n    return function() {\n      var args = arguments,\n          value = args[0];\n\n      if (wrapper && args.length == 1 && isArray(value)) {\n        return wrapper.plant(value).value();\n      }\n      var index = 0,\n          result = length ? funcs[index].apply(this, args) : value;\n\n      while (++index < length) {\n        result = funcs[index].call(this, result);\n      }\n      return result;\n    };\n  });\n}\n\nmodule.exports = createFlow;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createHybrid.js",
    "content": "var composeArgs = require('./_composeArgs'),\n    composeArgsRight = require('./_composeArgsRight'),\n    countHolders = require('./_countHolders'),\n    createCtor = require('./_createCtor'),\n    createRecurry = require('./_createRecurry'),\n    getHolder = require('./_getHolder'),\n    reorder = require('./_reorder'),\n    replaceHolders = require('./_replaceHolders'),\n    root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_BIND_KEY_FLAG = 2,\n    WRAP_CURRY_FLAG = 8,\n    WRAP_CURRY_RIGHT_FLAG = 16,\n    WRAP_ARY_FLAG = 128,\n    WRAP_FLIP_FLAG = 512;\n\n/**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n *  the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n *  to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n  var isAry = bitmask & WRAP_ARY_FLAG,\n      isBind = bitmask & WRAP_BIND_FLAG,\n      isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n      isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n      isFlip = bitmask & WRAP_FLIP_FLAG,\n      Ctor = isBindKey ? undefined : createCtor(func);\n\n  function wrapper() {\n    var length = arguments.length,\n        args = Array(length),\n        index = length;\n\n    while (index--) {\n      args[index] = arguments[index];\n    }\n    if (isCurried) {\n      var placeholder = getHolder(wrapper),\n          holdersCount = countHolders(args, placeholder);\n    }\n    if (partials) {\n      args = composeArgs(args, partials, holders, isCurried);\n    }\n    if (partialsRight) {\n      args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n    }\n    length -= holdersCount;\n    if (isCurried && length < arity) {\n      var newHolders = replaceHolders(args, placeholder);\n      return createRecurry(\n        func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n        args, newHolders, argPos, ary, arity - length\n      );\n    }\n    var thisBinding = isBind ? thisArg : this,\n        fn = isBindKey ? thisBinding[func] : func;\n\n    length = args.length;\n    if (argPos) {\n      args = reorder(args, argPos);\n    } else if (isFlip && length > 1) {\n      args.reverse();\n    }\n    if (isAry && ary < length) {\n      args.length = ary;\n    }\n    if (this && this !== root && this instanceof wrapper) {\n      fn = Ctor || createCtor(fn);\n    }\n    return fn.apply(thisBinding, args);\n  }\n  return wrapper;\n}\n\nmodule.exports = createHybrid;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createInverter.js",
    "content": "var baseInverter = require('./_baseInverter');\n\n/**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\nfunction createInverter(setter, toIteratee) {\n  return function(object, iteratee) {\n    return baseInverter(object, setter, toIteratee(iteratee), {});\n  };\n}\n\nmodule.exports = createInverter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createMathOperation.js",
    "content": "var baseToNumber = require('./_baseToNumber'),\n    baseToString = require('./_baseToString');\n\n/**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\nfunction createMathOperation(operator, defaultValue) {\n  return function(value, other) {\n    var result;\n    if (value === undefined && other === undefined) {\n      return defaultValue;\n    }\n    if (value !== undefined) {\n      result = value;\n    }\n    if (other !== undefined) {\n      if (result === undefined) {\n        return other;\n      }\n      if (typeof value == 'string' || typeof other == 'string') {\n        value = baseToString(value);\n        other = baseToString(other);\n      } else {\n        value = baseToNumber(value);\n        other = baseToNumber(other);\n      }\n      result = operator(value, other);\n    }\n    return result;\n  };\n}\n\nmodule.exports = createMathOperation;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createOver.js",
    "content": "var apply = require('./_apply'),\n    arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    baseUnary = require('./_baseUnary'),\n    flatRest = require('./_flatRest');\n\n/**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\nfunction createOver(arrayFunc) {\n  return flatRest(function(iteratees) {\n    iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n    return baseRest(function(args) {\n      var thisArg = this;\n      return arrayFunc(iteratees, function(iteratee) {\n        return apply(iteratee, thisArg, args);\n      });\n    });\n  });\n}\n\nmodule.exports = createOver;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createPadding.js",
    "content": "var baseRepeat = require('./_baseRepeat'),\n    baseToString = require('./_baseToString'),\n    castSlice = require('./_castSlice'),\n    hasUnicode = require('./_hasUnicode'),\n    stringSize = require('./_stringSize'),\n    stringToArray = require('./_stringToArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil;\n\n/**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\nfunction createPadding(length, chars) {\n  chars = chars === undefined ? ' ' : baseToString(chars);\n\n  var charsLength = chars.length;\n  if (charsLength < 2) {\n    return charsLength ? baseRepeat(chars, length) : chars;\n  }\n  var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n  return hasUnicode(chars)\n    ? castSlice(stringToArray(result), 0, length).join('')\n    : result.slice(0, length);\n}\n\nmodule.exports = createPadding;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createPartial.js",
    "content": "var apply = require('./_apply'),\n    createCtor = require('./_createCtor'),\n    root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n *  the new function.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createPartial(func, bitmask, thisArg, partials) {\n  var isBind = bitmask & WRAP_BIND_FLAG,\n      Ctor = createCtor(func);\n\n  function wrapper() {\n    var argsIndex = -1,\n        argsLength = arguments.length,\n        leftIndex = -1,\n        leftLength = partials.length,\n        args = Array(leftLength + argsLength),\n        fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n    while (++leftIndex < leftLength) {\n      args[leftIndex] = partials[leftIndex];\n    }\n    while (argsLength--) {\n      args[leftIndex++] = arguments[++argsIndex];\n    }\n    return apply(fn, isBind ? thisArg : this, args);\n  }\n  return wrapper;\n}\n\nmodule.exports = createPartial;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createRange.js",
    "content": "var baseRange = require('./_baseRange'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toFinite = require('./toFinite');\n\n/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n  return function(start, end, step) {\n    if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n      end = step = undefined;\n    }\n    // Ensure the sign of `-0` is preserved.\n    start = toFinite(start);\n    if (end === undefined) {\n      end = start;\n      start = 0;\n    } else {\n      end = toFinite(end);\n    }\n    step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n    return baseRange(start, end, step, fromRight);\n  };\n}\n\nmodule.exports = createRange;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createRecurry.js",
    "content": "var isLaziable = require('./_isLaziable'),\n    setData = require('./_setData'),\n    setWrapToString = require('./_setWrapToString');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_BIND_KEY_FLAG = 2,\n    WRAP_CURRY_BOUND_FLAG = 4,\n    WRAP_CURRY_FLAG = 8,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n *  the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n  var isCurry = bitmask & WRAP_CURRY_FLAG,\n      newHolders = isCurry ? holders : undefined,\n      newHoldersRight = isCurry ? undefined : holders,\n      newPartials = isCurry ? partials : undefined,\n      newPartialsRight = isCurry ? undefined : partials;\n\n  bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n  bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n  if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n    bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n  }\n  var newData = [\n    func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n    newHoldersRight, argPos, ary, arity\n  ];\n\n  var result = wrapFunc.apply(undefined, newData);\n  if (isLaziable(func)) {\n    setData(result, newData);\n  }\n  result.placeholder = placeholder;\n  return setWrapToString(result, func, bitmask);\n}\n\nmodule.exports = createRecurry;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createRelationalOperation.js",
    "content": "var toNumber = require('./toNumber');\n\n/**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\nfunction createRelationalOperation(operator) {\n  return function(value, other) {\n    if (!(typeof value == 'string' && typeof other == 'string')) {\n      value = toNumber(value);\n      other = toNumber(other);\n    }\n    return operator(value, other);\n  };\n}\n\nmodule.exports = createRelationalOperation;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createRound.js",
    "content": "var root = require('./_root'),\n    toInteger = require('./toInteger'),\n    toNumber = require('./toNumber'),\n    toString = require('./toString');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsFinite = root.isFinite,\n    nativeMin = Math.min;\n\n/**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\nfunction createRound(methodName) {\n  var func = Math[methodName];\n  return function(number, precision) {\n    number = toNumber(number);\n    precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n    if (precision && nativeIsFinite(number)) {\n      // Shift with exponential notation to avoid floating-point issues.\n      // See [MDN](https://mdn.io/round#Examples) for more details.\n      var pair = (toString(number) + 'e').split('e'),\n          value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n      pair = (toString(value) + 'e').split('e');\n      return +(pair[0] + 'e' + (+pair[1] - precision));\n    }\n    return func(number);\n  };\n}\n\nmodule.exports = createRound;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createSet.js",
    "content": "var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createToPairs.js",
    "content": "var baseToPairs = require('./_baseToPairs'),\n    getTag = require('./_getTag'),\n    mapToArray = require('./_mapToArray'),\n    setToPairs = require('./_setToPairs');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\nfunction createToPairs(keysFunc) {\n  return function(object) {\n    var tag = getTag(object);\n    if (tag == mapTag) {\n      return mapToArray(object);\n    }\n    if (tag == setTag) {\n      return setToPairs(object);\n    }\n    return baseToPairs(object, keysFunc(object));\n  };\n}\n\nmodule.exports = createToPairs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_createWrap.js",
    "content": "var baseSetData = require('./_baseSetData'),\n    createBind = require('./_createBind'),\n    createCurry = require('./_createCurry'),\n    createHybrid = require('./_createHybrid'),\n    createPartial = require('./_createPartial'),\n    getData = require('./_getData'),\n    mergeData = require('./_mergeData'),\n    setData = require('./_setData'),\n    setWrapToString = require('./_setWrapToString'),\n    toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_BIND_KEY_FLAG = 2,\n    WRAP_CURRY_FLAG = 8,\n    WRAP_CURRY_RIGHT_FLAG = 16,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n *    1 - `_.bind`\n *    2 - `_.bindKey`\n *    4 - `_.curry` or `_.curryRight` of a bound function\n *    8 - `_.curry`\n *   16 - `_.curryRight`\n *   32 - `_.partial`\n *   64 - `_.partialRight`\n *  128 - `_.rearg`\n *  256 - `_.ary`\n *  512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n  var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n  if (!isBindKey && typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var length = partials ? partials.length : 0;\n  if (!length) {\n    bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n    partials = holders = undefined;\n  }\n  ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n  arity = arity === undefined ? arity : toInteger(arity);\n  length -= holders ? holders.length : 0;\n\n  if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n    var partialsRight = partials,\n        holdersRight = holders;\n\n    partials = holders = undefined;\n  }\n  var data = isBindKey ? undefined : getData(func);\n\n  var newData = [\n    func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n    argPos, ary, arity\n  ];\n\n  if (data) {\n    mergeData(newData, data);\n  }\n  func = newData[0];\n  bitmask = newData[1];\n  thisArg = newData[2];\n  partials = newData[3];\n  holders = newData[4];\n  arity = newData[9] = newData[9] === undefined\n    ? (isBindKey ? 0 : func.length)\n    : nativeMax(newData[9] - length, 0);\n\n  if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n    bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n  }\n  if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n    var result = createBind(func, bitmask, thisArg);\n  } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n    result = createCurry(func, bitmask, arity);\n  } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n    result = createPartial(func, bitmask, thisArg, partials);\n  } else {\n    result = createHybrid.apply(undefined, newData);\n  }\n  var setter = data ? baseSetData : setData;\n  return setWrapToString(setter(result, newData), func, bitmask);\n}\n\nmodule.exports = createWrap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_customDefaultsAssignIn.js",
    "content": "var eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction customDefaultsAssignIn(objValue, srcValue, key, object) {\n  if (objValue === undefined ||\n      (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n    return srcValue;\n  }\n  return objValue;\n}\n\nmodule.exports = customDefaultsAssignIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_customDefaultsMerge.js",
    "content": "var baseMerge = require('./_baseMerge'),\n    isObject = require('./isObject');\n\n/**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n * @returns {*} Returns the value to assign.\n */\nfunction customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n  if (isObject(objValue) && isObject(srcValue)) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    stack.set(srcValue, objValue);\n    baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n    stack['delete'](srcValue);\n  }\n  return objValue;\n}\n\nmodule.exports = customDefaultsMerge;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_customOmitClone.js",
    "content": "var isPlainObject = require('./isPlainObject');\n\n/**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\nfunction customOmitClone(value) {\n  return isPlainObject(value) ? undefined : value;\n}\n\nmodule.exports = customOmitClone;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_deburrLetter.js",
    "content": "var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n  // Latin-1 Supplement block.\n  '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n  '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n  '\\xc7': 'C',  '\\xe7': 'c',\n  '\\xd0': 'D',  '\\xf0': 'd',\n  '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n  '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n  '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n  '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n  '\\xd1': 'N',  '\\xf1': 'n',\n  '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n  '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n  '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n  '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n  '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n  '\\xc6': 'Ae', '\\xe6': 'ae',\n  '\\xde': 'Th', '\\xfe': 'th',\n  '\\xdf': 'ss',\n  // Latin Extended-A block.\n  '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n  '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n  '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n  '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n  '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n  '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n  '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n  '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n  '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n  '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n  '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n  '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n  '\\u0134': 'J',  '\\u0135': 'j',\n  '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n  '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n  '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n  '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n  '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n  '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n  '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n  '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n  '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n  '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n  '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n  '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n  '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n  '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n  '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n  '\\u0174': 'W',  '\\u0175': 'w',\n  '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n  '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n  '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n  '\\u0132': 'IJ', '\\u0133': 'ij',\n  '\\u0152': 'Oe', '\\u0153': 'oe',\n  '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nmodule.exports = deburrLetter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_defineProperty.js",
    "content": "var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_equalArrays.js",
    "content": "var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_equalByTag.js",
    "content": "var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_equalObjects.js",
    "content": "var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_escapeHtmlChar.js",
    "content": "var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map characters to HTML entities. */\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\n\n/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nvar escapeHtmlChar = basePropertyOf(htmlEscapes);\n\nmodule.exports = escapeHtmlChar;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_escapeStringChar.js",
    "content": "/** Used to escape characters for inclusion in compiled string literals. */\nvar stringEscapes = {\n  '\\\\': '\\\\',\n  \"'\": \"'\",\n  '\\n': 'n',\n  '\\r': 'r',\n  '\\u2028': 'u2028',\n  '\\u2029': 'u2029'\n};\n\n/**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nfunction escapeStringChar(chr) {\n  return '\\\\' + stringEscapes[chr];\n}\n\nmodule.exports = escapeStringChar;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_flatRest.js",
    "content": "var flatten = require('./flatten'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_freeGlobal.js",
    "content": "/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getAllKeys.js",
    "content": "var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getAllKeysIn.js",
    "content": "var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbolsIn = require('./_getSymbolsIn'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getData.js",
    "content": "var metaMap = require('./_metaMap'),\n    noop = require('./noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n  return metaMap.get(func);\n};\n\nmodule.exports = getData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getFuncName.js",
    "content": "var realNames = require('./_realNames');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n  var result = (func.name + ''),\n      array = realNames[result],\n      length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n  while (length--) {\n    var data = array[length],\n        otherFunc = data.func;\n    if (otherFunc == null || otherFunc == func) {\n      return data.name;\n    }\n  }\n  return result;\n}\n\nmodule.exports = getFuncName;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getHolder.js",
    "content": "/**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\nfunction getHolder(func) {\n  var object = func;\n  return object.placeholder;\n}\n\nmodule.exports = getHolder;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getMapData.js",
    "content": "var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getMatchData.js",
    "content": "var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getNative.js",
    "content": "var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getPrototype.js",
    "content": "var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getRawTag.js",
    "content": "var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getSymbols.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getSymbolsIn.js",
    "content": "var arrayPush = require('./_arrayPush'),\n    getPrototype = require('./_getPrototype'),\n    getSymbols = require('./_getSymbols'),\n    stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nmodule.exports = getSymbolsIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getTag.js",
    "content": "var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getValue.js",
    "content": "/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getView.js",
    "content": "/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n *  positions of the view.\n */\nfunction getView(start, end, transforms) {\n  var index = -1,\n      length = transforms.length;\n\n  while (++index < length) {\n    var data = transforms[index],\n        size = data.size;\n\n    switch (data.type) {\n      case 'drop':      start += size; break;\n      case 'dropRight': end -= size; break;\n      case 'take':      end = nativeMin(end, start + size); break;\n      case 'takeRight': start = nativeMax(start, end - size); break;\n    }\n  }\n  return { 'start': start, 'end': end };\n}\n\nmodule.exports = getView;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_getWrapDetails.js",
    "content": "/** Used to match wrap detail comments. */\nvar reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n    reSplitDetails = /,? & /;\n\n/**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\nfunction getWrapDetails(source) {\n  var match = source.match(reWrapDetails);\n  return match ? match[1].split(reSplitDetails) : [];\n}\n\nmodule.exports = getWrapDetails;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hasPath.js",
    "content": "var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hasUnicode.js",
    "content": "/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hasUnicodeWord.js",
    "content": "/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n  return reHasUnicodeWord.test(string);\n}\n\nmodule.exports = hasUnicodeWord;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hashClear.js",
    "content": "var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hashDelete.js",
    "content": "/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hashGet.js",
    "content": "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hashHas.js",
    "content": "var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_hashSet.js",
    "content": "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_initCloneArray.js",
    "content": "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_initCloneByTag.js",
    "content": "var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n    cloneDataView = require('./_cloneDataView'),\n    cloneRegExp = require('./_cloneRegExp'),\n    cloneSymbol = require('./_cloneSymbol'),\n    cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_initCloneObject.js",
    "content": "var baseCreate = require('./_baseCreate'),\n    getPrototype = require('./_getPrototype'),\n    isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nmodule.exports = initCloneObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_insertWrapDetails.js",
    "content": "/** Used to match wrap detail comments. */\nvar reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/;\n\n/**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\nfunction insertWrapDetails(source, details) {\n  var length = details.length;\n  if (!length) {\n    return source;\n  }\n  var lastIndex = length - 1;\n  details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n  details = details.join(length > 2 ? ', ' : ' ');\n  return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n}\n\nmodule.exports = insertWrapDetails;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isFlattenable.js",
    "content": "var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isIndex.js",
    "content": "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isIterateeCall.js",
    "content": "var eq = require('./eq'),\n    isArrayLike = require('./isArrayLike'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isKey.js",
    "content": "var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isKeyable.js",
    "content": "/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isLaziable.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    getData = require('./_getData'),\n    getFuncName = require('./_getFuncName'),\n    lodash = require('./wrapperLodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n *  else `false`.\n */\nfunction isLaziable(func) {\n  var funcName = getFuncName(func),\n      other = lodash[funcName];\n\n  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n    return false;\n  }\n  if (func === other) {\n    return true;\n  }\n  var data = getData(other);\n  return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isMaskable.js",
    "content": "var coreJsData = require('./_coreJsData'),\n    isFunction = require('./isFunction'),\n    stubFalse = require('./stubFalse');\n\n/**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\nvar isMaskable = coreJsData ? isFunction : stubFalse;\n\nmodule.exports = isMaskable;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isMasked.js",
    "content": "var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isPrototype.js",
    "content": "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_isStrictComparable.js",
    "content": "var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_iteratorToArray.js",
    "content": "/**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction iteratorToArray(iterator) {\n  var data,\n      result = [];\n\n  while (!(data = iterator.next()).done) {\n    result.push(data.value);\n  }\n  return result;\n}\n\nmodule.exports = iteratorToArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_lazyClone.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\nfunction lazyClone() {\n  var result = new LazyWrapper(this.__wrapped__);\n  result.__actions__ = copyArray(this.__actions__);\n  result.__dir__ = this.__dir__;\n  result.__filtered__ = this.__filtered__;\n  result.__iteratees__ = copyArray(this.__iteratees__);\n  result.__takeCount__ = this.__takeCount__;\n  result.__views__ = copyArray(this.__views__);\n  return result;\n}\n\nmodule.exports = lazyClone;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_lazyReverse.js",
    "content": "var LazyWrapper = require('./_LazyWrapper');\n\n/**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\nfunction lazyReverse() {\n  if (this.__filtered__) {\n    var result = new LazyWrapper(this);\n    result.__dir__ = -1;\n    result.__filtered__ = true;\n  } else {\n    result = this.clone();\n    result.__dir__ *= -1;\n  }\n  return result;\n}\n\nmodule.exports = lazyReverse;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_lazyValue.js",
    "content": "var baseWrapperValue = require('./_baseWrapperValue'),\n    getView = require('./_getView'),\n    isArray = require('./isArray');\n\n/** Used to indicate the type of lazy iteratees. */\nvar LAZY_FILTER_FLAG = 1,\n    LAZY_MAP_FLAG = 2;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\nfunction lazyValue() {\n  var array = this.__wrapped__.value(),\n      dir = this.__dir__,\n      isArr = isArray(array),\n      isRight = dir < 0,\n      arrLength = isArr ? array.length : 0,\n      view = getView(0, arrLength, this.__views__),\n      start = view.start,\n      end = view.end,\n      length = end - start,\n      index = isRight ? end : (start - 1),\n      iteratees = this.__iteratees__,\n      iterLength = iteratees.length,\n      resIndex = 0,\n      takeCount = nativeMin(length, this.__takeCount__);\n\n  if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n    return baseWrapperValue(array, this.__actions__);\n  }\n  var result = [];\n\n  outer:\n  while (length-- && resIndex < takeCount) {\n    index += dir;\n\n    var iterIndex = -1,\n        value = array[index];\n\n    while (++iterIndex < iterLength) {\n      var data = iteratees[iterIndex],\n          iteratee = data.iteratee,\n          type = data.type,\n          computed = iteratee(value);\n\n      if (type == LAZY_MAP_FLAG) {\n        value = computed;\n      } else if (!computed) {\n        if (type == LAZY_FILTER_FLAG) {\n          continue outer;\n        } else {\n          break outer;\n        }\n      }\n    }\n    result[resIndex++] = value;\n  }\n  return result;\n}\n\nmodule.exports = lazyValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_listCacheClear.js",
    "content": "/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_listCacheDelete.js",
    "content": "var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_listCacheGet.js",
    "content": "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_listCacheHas.js",
    "content": "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_listCacheSet.js",
    "content": "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mapCacheClear.js",
    "content": "var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mapCacheDelete.js",
    "content": "var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mapCacheGet.js",
    "content": "var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mapCacheHas.js",
    "content": "var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mapCacheSet.js",
    "content": "var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mapToArray.js",
    "content": "/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_matchesStrictComparable.js",
    "content": "/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_memoizeCapped.js",
    "content": "var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_mergeData.js",
    "content": "var composeArgs = require('./_composeArgs'),\n    composeArgsRight = require('./_composeArgsRight'),\n    replaceHolders = require('./_replaceHolders');\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_BIND_KEY_FLAG = 2,\n    WRAP_CURRY_BOUND_FLAG = 4,\n    WRAP_CURRY_FLAG = 8,\n    WRAP_ARY_FLAG = 128,\n    WRAP_REARG_FLAG = 256;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\nfunction mergeData(data, source) {\n  var bitmask = data[1],\n      srcBitmask = source[1],\n      newBitmask = bitmask | srcBitmask,\n      isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n  var isCombo =\n    ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n    ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n    ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n  // Exit early if metadata can't be merged.\n  if (!(isCommon || isCombo)) {\n    return data;\n  }\n  // Use source `thisArg` if available.\n  if (srcBitmask & WRAP_BIND_FLAG) {\n    data[2] = source[2];\n    // Set when currying a bound function.\n    newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n  }\n  // Compose partial arguments.\n  var value = source[3];\n  if (value) {\n    var partials = data[3];\n    data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n    data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n  }\n  // Compose partial right arguments.\n  value = source[5];\n  if (value) {\n    partials = data[5];\n    data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n    data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n  }\n  // Use source `argPos` if available.\n  value = source[7];\n  if (value) {\n    data[7] = value;\n  }\n  // Use source `ary` if it's smaller.\n  if (srcBitmask & WRAP_ARY_FLAG) {\n    data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n  }\n  // Use source `arity` if one is not provided.\n  if (data[9] == null) {\n    data[9] = source[9];\n  }\n  // Use source `func` and merge bitmasks.\n  data[0] = source[0];\n  data[1] = newBitmask;\n\n  return data;\n}\n\nmodule.exports = mergeData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_metaMap.js",
    "content": "var WeakMap = require('./_WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_nativeCreate.js",
    "content": "var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_nativeKeys.js",
    "content": "var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_nativeKeysIn.js",
    "content": "/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_nodeUtil.js",
    "content": "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_objectToString.js",
    "content": "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_overArg.js",
    "content": "/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_overRest.js",
    "content": "var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_parent.js",
    "content": "var baseGet = require('./_baseGet'),\n    baseSlice = require('./_baseSlice');\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\nmodule.exports = parent;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_reEscape.js",
    "content": "/** Used to match template delimiters. */\nvar reEscape = /<%-([\\s\\S]+?)%>/g;\n\nmodule.exports = reEscape;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_reEvaluate.js",
    "content": "/** Used to match template delimiters. */\nvar reEvaluate = /<%([\\s\\S]+?)%>/g;\n\nmodule.exports = reEvaluate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_reInterpolate.js",
    "content": "/** Used to match template delimiters. */\nvar reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\nmodule.exports = reInterpolate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_realNames.js",
    "content": "/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_reorder.js",
    "content": "var copyArray = require('./_copyArray'),\n    isIndex = require('./_isIndex');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\nfunction reorder(array, indexes) {\n  var arrLength = array.length,\n      length = nativeMin(indexes.length, arrLength),\n      oldArray = copyArray(array);\n\n  while (length--) {\n    var index = indexes[length];\n    array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n  }\n  return array;\n}\n\nmodule.exports = reorder;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_replaceHolders.js",
    "content": "/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\nfunction replaceHolders(array, placeholder) {\n  var index = -1,\n      length = array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (value === placeholder || value === PLACEHOLDER) {\n      array[index] = PLACEHOLDER;\n      result[resIndex++] = index;\n    }\n  }\n  return result;\n}\n\nmodule.exports = replaceHolders;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_root.js",
    "content": "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_safeGet.js",
    "content": "/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n  if (key === 'constructor' && typeof object[key] === 'function') {\n    return;\n  }\n\n  if (key == '__proto__') {\n    return;\n  }\n\n  return object[key];\n}\n\nmodule.exports = safeGet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setCacheAdd.js",
    "content": "/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setCacheHas.js",
    "content": "/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setData.js",
    "content": "var baseSetData = require('./_baseSetData'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar setData = shortOut(baseSetData);\n\nmodule.exports = setData;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setToArray.js",
    "content": "/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setToPairs.js",
    "content": "/**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\nfunction setToPairs(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = [value, value];\n  });\n  return result;\n}\n\nmodule.exports = setToPairs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setToString.js",
    "content": "var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_setWrapToString.js",
    "content": "var getWrapDetails = require('./_getWrapDetails'),\n    insertWrapDetails = require('./_insertWrapDetails'),\n    setToString = require('./_setToString'),\n    updateWrapDetails = require('./_updateWrapDetails');\n\n/**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\nfunction setWrapToString(wrapper, reference, bitmask) {\n  var source = (reference + '');\n  return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n}\n\nmodule.exports = setWrapToString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_shortOut.js",
    "content": "/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_shuffleSelf.js",
    "content": "var baseRandom = require('./_baseRandom');\n\n/**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\nfunction shuffleSelf(array, size) {\n  var index = -1,\n      length = array.length,\n      lastIndex = length - 1;\n\n  size = size === undefined ? length : size;\n  while (++index < size) {\n    var rand = baseRandom(index, lastIndex),\n        value = array[rand];\n\n    array[rand] = array[index];\n    array[index] = value;\n  }\n  array.length = size;\n  return array;\n}\n\nmodule.exports = shuffleSelf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stackClear.js",
    "content": "var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stackDelete.js",
    "content": "/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stackGet.js",
    "content": "/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stackHas.js",
    "content": "/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stackSet.js",
    "content": "var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_strictIndexOf.js",
    "content": "/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_strictLastIndexOf.js",
    "content": "/**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictLastIndexOf(array, value, fromIndex) {\n  var index = fromIndex + 1;\n  while (index--) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return index;\n}\n\nmodule.exports = strictLastIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stringSize.js",
    "content": "var asciiSize = require('./_asciiSize'),\n    hasUnicode = require('./_hasUnicode'),\n    unicodeSize = require('./_unicodeSize');\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n  return hasUnicode(string)\n    ? unicodeSize(string)\n    : asciiSize(string);\n}\n\nmodule.exports = stringSize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stringToArray.js",
    "content": "var asciiToArray = require('./_asciiToArray'),\n    hasUnicode = require('./_hasUnicode'),\n    unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n  return hasUnicode(string)\n    ? unicodeToArray(string)\n    : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_stringToPath.js",
    "content": "var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_toKey.js",
    "content": "var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_toSource.js",
    "content": "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_trimmedEndIndex.js",
    "content": "/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nmodule.exports = trimmedEndIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_unescapeHtmlChar.js",
    "content": "var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map HTML entities to characters. */\nvar htmlUnescapes = {\n  '&amp;': '&',\n  '&lt;': '<',\n  '&gt;': '>',\n  '&quot;': '\"',\n  '&#39;': \"'\"\n};\n\n/**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\nvar unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\nmodule.exports = unescapeHtmlChar;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_unicodeSize.js",
    "content": "/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n  var result = reUnicode.lastIndex = 0;\n  while (reUnicode.test(string)) {\n    ++result;\n  }\n  return result;\n}\n\nmodule.exports = unicodeSize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_unicodeToArray.js",
    "content": "/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n  return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_unicodeWords.js",
    "content": "/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsDingbatRange = '\\\\u2700-\\\\u27bf',\n    rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n    rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n    rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n    rsPunctuationRange = '\\\\u2000-\\\\u206f',\n    rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n    rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n    rsVarRange = '\\\\ufe0e\\\\ufe0f',\n    rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n    rsBreak = '[' + rsBreakRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsDigits = '\\\\d+',\n    rsDingbat = '[' + rsDingbatRange + ']',\n    rsLower = '[' + rsLowerRange + ']',\n    rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsUpper = '[' + rsUpperRange + ']',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n    rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n    rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n    rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n    reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n    rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n  rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n  rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n  rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n  rsUpper + '+' + rsOptContrUpper,\n  rsOrdUpper,\n  rsOrdLower,\n  rsDigits,\n  rsEmoji\n].join('|'), 'g');\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n  return string.match(reUnicodeWord) || [];\n}\n\nmodule.exports = unicodeWords;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_updateWrapDetails.js",
    "content": "var arrayEach = require('./_arrayEach'),\n    arrayIncludes = require('./_arrayIncludes');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_BIND_KEY_FLAG = 2,\n    WRAP_CURRY_FLAG = 8,\n    WRAP_CURRY_RIGHT_FLAG = 16,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_PARTIAL_RIGHT_FLAG = 64,\n    WRAP_ARY_FLAG = 128,\n    WRAP_REARG_FLAG = 256,\n    WRAP_FLIP_FLAG = 512;\n\n/** Used to associate wrap methods with their bit flags. */\nvar wrapFlags = [\n  ['ary', WRAP_ARY_FLAG],\n  ['bind', WRAP_BIND_FLAG],\n  ['bindKey', WRAP_BIND_KEY_FLAG],\n  ['curry', WRAP_CURRY_FLAG],\n  ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n  ['flip', WRAP_FLIP_FLAG],\n  ['partial', WRAP_PARTIAL_FLAG],\n  ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n  ['rearg', WRAP_REARG_FLAG]\n];\n\n/**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\nfunction updateWrapDetails(details, bitmask) {\n  arrayEach(wrapFlags, function(pair) {\n    var value = '_.' + pair[0];\n    if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n      details.push(value);\n    }\n  });\n  return details.sort();\n}\n\nmodule.exports = updateWrapDetails;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/_wrapperClone.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n  if (wrapper instanceof LazyWrapper) {\n    return wrapper.clone();\n  }\n  var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n  result.__actions__ = copyArray(wrapper.__actions__);\n  result.__index__  = wrapper.__index__;\n  result.__values__ = wrapper.__values__;\n  return result;\n}\n\nmodule.exports = wrapperClone;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/add.js",
    "content": "var createMathOperation = require('./_createMathOperation');\n\n/**\n * Adds two numbers.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {number} augend The first number in an addition.\n * @param {number} addend The second number in an addition.\n * @returns {number} Returns the total.\n * @example\n *\n * _.add(6, 4);\n * // => 10\n */\nvar add = createMathOperation(function(augend, addend) {\n  return augend + addend;\n}, 0);\n\nmodule.exports = add;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/after.js",
    "content": "var toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n *   console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n *   asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\nfunction after(n, func) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  n = toInteger(n);\n  return function() {\n    if (--n < 1) {\n      return func.apply(this, arguments);\n    }\n  };\n}\n\nmodule.exports = after;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/array.js",
    "content": "module.exports = {\n  'chunk': require('./chunk'),\n  'compact': require('./compact'),\n  'concat': require('./concat'),\n  'difference': require('./difference'),\n  'differenceBy': require('./differenceBy'),\n  'differenceWith': require('./differenceWith'),\n  'drop': require('./drop'),\n  'dropRight': require('./dropRight'),\n  'dropRightWhile': require('./dropRightWhile'),\n  'dropWhile': require('./dropWhile'),\n  'fill': require('./fill'),\n  'findIndex': require('./findIndex'),\n  'findLastIndex': require('./findLastIndex'),\n  'first': require('./first'),\n  'flatten': require('./flatten'),\n  'flattenDeep': require('./flattenDeep'),\n  'flattenDepth': require('./flattenDepth'),\n  'fromPairs': require('./fromPairs'),\n  'head': require('./head'),\n  'indexOf': require('./indexOf'),\n  'initial': require('./initial'),\n  'intersection': require('./intersection'),\n  'intersectionBy': require('./intersectionBy'),\n  'intersectionWith': require('./intersectionWith'),\n  'join': require('./join'),\n  'last': require('./last'),\n  'lastIndexOf': require('./lastIndexOf'),\n  'nth': require('./nth'),\n  'pull': require('./pull'),\n  'pullAll': require('./pullAll'),\n  'pullAllBy': require('./pullAllBy'),\n  'pullAllWith': require('./pullAllWith'),\n  'pullAt': require('./pullAt'),\n  'remove': require('./remove'),\n  'reverse': require('./reverse'),\n  'slice': require('./slice'),\n  'sortedIndex': require('./sortedIndex'),\n  'sortedIndexBy': require('./sortedIndexBy'),\n  'sortedIndexOf': require('./sortedIndexOf'),\n  'sortedLastIndex': require('./sortedLastIndex'),\n  'sortedLastIndexBy': require('./sortedLastIndexBy'),\n  'sortedLastIndexOf': require('./sortedLastIndexOf'),\n  'sortedUniq': require('./sortedUniq'),\n  'sortedUniqBy': require('./sortedUniqBy'),\n  'tail': require('./tail'),\n  'take': require('./take'),\n  'takeRight': require('./takeRight'),\n  'takeRightWhile': require('./takeRightWhile'),\n  'takeWhile': require('./takeWhile'),\n  'union': require('./union'),\n  'unionBy': require('./unionBy'),\n  'unionWith': require('./unionWith'),\n  'uniq': require('./uniq'),\n  'uniqBy': require('./uniqBy'),\n  'uniqWith': require('./uniqWith'),\n  'unzip': require('./unzip'),\n  'unzipWith': require('./unzipWith'),\n  'without': require('./without'),\n  'xor': require('./xor'),\n  'xorBy': require('./xorBy'),\n  'xorWith': require('./xorWith'),\n  'zip': require('./zip'),\n  'zipObject': require('./zipObject'),\n  'zipObjectDeep': require('./zipObjectDeep'),\n  'zipWith': require('./zipWith')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/ary.js",
    "content": "var createWrap = require('./_createWrap');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_ARY_FLAG = 128;\n\n/**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\nfunction ary(func, n, guard) {\n  n = guard ? undefined : n;\n  n = (func && n == null) ? func.length : n;\n  return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n}\n\nmodule.exports = ary;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/assign.js",
    "content": "var assignValue = require('./_assignValue'),\n    copyObject = require('./_copyObject'),\n    createAssigner = require('./_createAssigner'),\n    isArrayLike = require('./isArrayLike'),\n    isPrototype = require('./_isPrototype'),\n    keys = require('./keys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * function Bar() {\n *   this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n  if (isPrototype(source) || isArrayLike(source)) {\n    copyObject(source, keys(source), object);\n    return;\n  }\n  for (var key in source) {\n    if (hasOwnProperty.call(source, key)) {\n      assignValue(object, key, source[key]);\n    }\n  }\n});\n\nmodule.exports = assign;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/assignIn.js",
    "content": "var copyObject = require('./_copyObject'),\n    createAssigner = require('./_createAssigner'),\n    keysIn = require('./keysIn');\n\n/**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * function Bar() {\n *   this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\nvar assignIn = createAssigner(function(object, source) {\n  copyObject(source, keysIn(source), object);\n});\n\nmodule.exports = assignIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/assignInWith.js",
    "content": "var copyObject = require('./_copyObject'),\n    createAssigner = require('./_createAssigner'),\n    keysIn = require('./keysIn');\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n *   return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n  copyObject(source, keysIn(source), object, customizer);\n});\n\nmodule.exports = assignInWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/assignWith.js",
    "content": "var copyObject = require('./_copyObject'),\n    createAssigner = require('./_createAssigner'),\n    keys = require('./keys');\n\n/**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n *   return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n  copyObject(source, keys(source), object, customizer);\n});\n\nmodule.exports = assignWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/at.js",
    "content": "var baseAt = require('./_baseAt'),\n    flatRest = require('./_flatRest');\n\n/**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\nvar at = flatRest(baseAt);\n\nmodule.exports = at;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/attempt.js",
    "content": "var apply = require('./_apply'),\n    baseRest = require('./_baseRest'),\n    isError = require('./isError');\n\n/**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n *   return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n *   elements = [];\n * }\n */\nvar attempt = baseRest(function(func, args) {\n  try {\n    return apply(func, undefined, args);\n  } catch (e) {\n    return isError(e) ? e : new Error(e);\n  }\n});\n\nmodule.exports = attempt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/before.js",
    "content": "var toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\nfunction before(n, func) {\n  var result;\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  n = toInteger(n);\n  return function() {\n    if (--n > 0) {\n      result = func.apply(this, arguments);\n    }\n    if (n <= 1) {\n      func = undefined;\n    }\n    return result;\n  };\n}\n\nmodule.exports = before;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/bind.js",
    "content": "var baseRest = require('./_baseRest'),\n    createWrap = require('./_createWrap'),\n    getHolder = require('./_getHolder'),\n    replaceHolders = require('./_replaceHolders');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_PARTIAL_FLAG = 32;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n *   return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\nvar bind = baseRest(function(func, thisArg, partials) {\n  var bitmask = WRAP_BIND_FLAG;\n  if (partials.length) {\n    var holders = replaceHolders(partials, getHolder(bind));\n    bitmask |= WRAP_PARTIAL_FLAG;\n  }\n  return createWrap(func, bitmask, thisArg, partials, holders);\n});\n\n// Assign default placeholders.\nbind.placeholder = {};\n\nmodule.exports = bind;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/bindAll.js",
    "content": "var arrayEach = require('./_arrayEach'),\n    baseAssignValue = require('./_baseAssignValue'),\n    bind = require('./bind'),\n    flatRest = require('./_flatRest'),\n    toKey = require('./_toKey');\n\n/**\n * Binds methods of an object to the object itself, overwriting the existing\n * method.\n *\n * **Note:** This method doesn't set the \"length\" property of bound functions.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} methodNames The object method names to bind.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n *   'label': 'docs',\n *   'click': function() {\n *     console.log('clicked ' + this.label);\n *   }\n * };\n *\n * _.bindAll(view, ['click']);\n * jQuery(element).on('click', view.click);\n * // => Logs 'clicked docs' when clicked.\n */\nvar bindAll = flatRest(function(object, methodNames) {\n  arrayEach(methodNames, function(key) {\n    key = toKey(key);\n    baseAssignValue(object, key, bind(object[key], object));\n  });\n  return object;\n});\n\nmodule.exports = bindAll;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/bindKey.js",
    "content": "var baseRest = require('./_baseRest'),\n    createWrap = require('./_createWrap'),\n    getHolder = require('./_getHolder'),\n    replaceHolders = require('./_replaceHolders');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n    WRAP_BIND_KEY_FLAG = 2,\n    WRAP_PARTIAL_FLAG = 32;\n\n/**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n *   'user': 'fred',\n *   'greet': function(greeting, punctuation) {\n *     return greeting + ' ' + this.user + punctuation;\n *   }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n *   return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\nvar bindKey = baseRest(function(object, key, partials) {\n  var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n  if (partials.length) {\n    var holders = replaceHolders(partials, getHolder(bindKey));\n    bitmask |= WRAP_PARTIAL_FLAG;\n  }\n  return createWrap(key, bitmask, object, partials, holders);\n});\n\n// Assign default placeholders.\nbindKey.placeholder = {};\n\nmodule.exports = bindKey;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/camelCase.js",
    "content": "var capitalize = require('./capitalize'),\n    createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n  word = word.toLowerCase();\n  return result + (index ? capitalize(word) : word);\n});\n\nmodule.exports = camelCase;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/capitalize.js",
    "content": "var toString = require('./toString'),\n    upperFirst = require('./upperFirst');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n  return upperFirst(toString(string).toLowerCase());\n}\n\nmodule.exports = capitalize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/castArray.js",
    "content": "var isArray = require('./isArray');\n\n/**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\nfunction castArray() {\n  if (!arguments.length) {\n    return [];\n  }\n  var value = arguments[0];\n  return isArray(value) ? value : [value];\n}\n\nmodule.exports = castArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/ceil.js",
    "content": "var createRound = require('./_createRound');\n\n/**\n * Computes `number` rounded up to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round up.\n * @param {number} [precision=0] The precision to round up to.\n * @returns {number} Returns the rounded up number.\n * @example\n *\n * _.ceil(4.006);\n * // => 5\n *\n * _.ceil(6.004, 2);\n * // => 6.01\n *\n * _.ceil(6040, -2);\n * // => 6100\n */\nvar ceil = createRound('ceil');\n\nmodule.exports = ceil;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/chain.js",
    "content": "var lodash = require('./wrapperLodash');\n\n/**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'age': 36 },\n *   { 'user': 'fred',    'age': 40 },\n *   { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n *   .chain(users)\n *   .sortBy('age')\n *   .map(function(o) {\n *     return o.user + ' is ' + o.age;\n *   })\n *   .head()\n *   .value();\n * // => 'pebbles is 1'\n */\nfunction chain(value) {\n  var result = lodash(value);\n  result.__chain__ = true;\n  return result;\n}\n\nmodule.exports = chain;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/chunk.js",
    "content": "var baseSlice = require('./_baseSlice'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n    nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n  if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n    size = 1;\n  } else {\n    size = nativeMax(toInteger(size), 0);\n  }\n  var length = array == null ? 0 : array.length;\n  if (!length || size < 1) {\n    return [];\n  }\n  var index = 0,\n      resIndex = 0,\n      result = Array(nativeCeil(length / size));\n\n  while (index < length) {\n    result[resIndex++] = baseSlice(array, index, (index += size));\n  }\n  return result;\n}\n\nmodule.exports = chunk;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/clamp.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    toNumber = require('./toNumber');\n\n/**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\nfunction clamp(number, lower, upper) {\n  if (upper === undefined) {\n    upper = lower;\n    lower = undefined;\n  }\n  if (upper !== undefined) {\n    upper = toNumber(upper);\n    upper = upper === upper ? upper : 0;\n  }\n  if (lower !== undefined) {\n    lower = toNumber(lower);\n    lower = lower === lower ? lower : 0;\n  }\n  return baseClamp(toNumber(number), lower, upper);\n}\n\nmodule.exports = clamp;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/clone.js",
    "content": "var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n  return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = clone;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/cloneDeep.js",
    "content": "var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/cloneDeepWith.js",
    "content": "var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n *   if (_.isElement(value)) {\n *     return value.cloneNode(true);\n *   }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\nfunction cloneDeepWith(value, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n}\n\nmodule.exports = cloneDeepWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/cloneWith.js",
    "content": "var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n *   if (_.isElement(value)) {\n *     return value.cloneNode(false);\n *   }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\nfunction cloneWith(value, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n}\n\nmodule.exports = cloneWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/collection.js",
    "content": "module.exports = {\n  'countBy': require('./countBy'),\n  'each': require('./each'),\n  'eachRight': require('./eachRight'),\n  'every': require('./every'),\n  'filter': require('./filter'),\n  'find': require('./find'),\n  'findLast': require('./findLast'),\n  'flatMap': require('./flatMap'),\n  'flatMapDeep': require('./flatMapDeep'),\n  'flatMapDepth': require('./flatMapDepth'),\n  'forEach': require('./forEach'),\n  'forEachRight': require('./forEachRight'),\n  'groupBy': require('./groupBy'),\n  'includes': require('./includes'),\n  'invokeMap': require('./invokeMap'),\n  'keyBy': require('./keyBy'),\n  'map': require('./map'),\n  'orderBy': require('./orderBy'),\n  'partition': require('./partition'),\n  'reduce': require('./reduce'),\n  'reduceRight': require('./reduceRight'),\n  'reject': require('./reject'),\n  'sample': require('./sample'),\n  'sampleSize': require('./sampleSize'),\n  'shuffle': require('./shuffle'),\n  'size': require('./size'),\n  'some': require('./some'),\n  'sortBy': require('./sortBy')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/commit.js",
    "content": "var LodashWrapper = require('./_LodashWrapper');\n\n/**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\nfunction wrapperCommit() {\n  return new LodashWrapper(this.value(), this.__chain__);\n}\n\nmodule.exports = wrapperCommit;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/compact.js",
    "content": "/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (value) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = compact;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/concat.js",
    "content": "var arrayPush = require('./_arrayPush'),\n    baseFlatten = require('./_baseFlatten'),\n    copyArray = require('./_copyArray'),\n    isArray = require('./isArray');\n\n/**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\nfunction concat() {\n  var length = arguments.length;\n  if (!length) {\n    return [];\n  }\n  var args = Array(length - 1),\n      array = arguments[0],\n      index = length;\n\n  while (index--) {\n    args[index - 1] = arguments[index];\n  }\n  return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n}\n\nmodule.exports = concat;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/cond.js",
    "content": "var apply = require('./_apply'),\n    arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that iterates over `pairs` and invokes the corresponding\n * function of the first predicate to return truthy. The predicate-function\n * pairs are invoked with the `this` binding and arguments of the created\n * function.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Array} pairs The predicate-function pairs.\n * @returns {Function} Returns the new composite function.\n * @example\n *\n * var func = _.cond([\n *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n *   [_.stubTrue,                      _.constant('no match')]\n * ]);\n *\n * func({ 'a': 1, 'b': 2 });\n * // => 'matches A'\n *\n * func({ 'a': 0, 'b': 1 });\n * // => 'matches B'\n *\n * func({ 'a': '1', 'b': '2' });\n * // => 'no match'\n */\nfunction cond(pairs) {\n  var length = pairs == null ? 0 : pairs.length,\n      toIteratee = baseIteratee;\n\n  pairs = !length ? [] : arrayMap(pairs, function(pair) {\n    if (typeof pair[1] != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    return [toIteratee(pair[0]), pair[1]];\n  });\n\n  return baseRest(function(args) {\n    var index = -1;\n    while (++index < length) {\n      var pair = pairs[index];\n      if (apply(pair[0], this, args)) {\n        return apply(pair[1], this, args);\n      }\n    }\n  });\n}\n\nmodule.exports = cond;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/conforms.js",
    "content": "var baseClone = require('./_baseClone'),\n    baseConforms = require('./_baseConforms');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a function that invokes the predicate properties of `source` with\n * the corresponding property values of a given object, returning `true` if\n * all predicates return truthy, else `false`.\n *\n * **Note:** The created function is equivalent to `_.conformsTo` with\n * `source` partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n *   { 'a': 2, 'b': 1 },\n *   { 'a': 1, 'b': 2 }\n * ];\n *\n * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n * // => [{ 'a': 1, 'b': 2 }]\n */\nfunction conforms(source) {\n  return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n}\n\nmodule.exports = conforms;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/conformsTo.js",
    "content": "var baseConformsTo = require('./_baseConformsTo'),\n    keys = require('./keys');\n\n/**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\nfunction conformsTo(object, source) {\n  return source == null || baseConformsTo(object, source, keys(source));\n}\n\nmodule.exports = conformsTo;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/constant.js",
    "content": "/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/core.js",
    "content": "/**\n * @license\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash core -o ./dist/lodash.core.js`\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Error message constants. */\n  var FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_PARTIAL_FLAG = 32;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991;\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      numberTag = '[object Number]',\n      objectTag = '[object Object]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      stringTag = '[object String]';\n\n  /** Used to match HTML entities and HTML characters. */\n  var reUnescapedHtml = /[&<>\"']/g,\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    array.push.apply(array, values);\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return baseMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /** Used for built-in method references. */\n  var arrayProto = Array.prototype,\n      objectProto = Object.prototype;\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty = objectProto.hasOwnProperty;\n\n  /** Used to generate unique IDs. */\n  var idCounter = 0;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var nativeObjectToString = objectProto.toString;\n\n  /** Used to restore the original `_` reference in `_.noConflict`. */\n  var oldDash = root._;\n\n  /** Built-in value references. */\n  var objectCreate = Object.create,\n      propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeIsFinite = root.isFinite,\n      nativeKeys = overArg(Object.keys, Object),\n      nativeMax = Math.max;\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Creates a `lodash` object which wraps `value` to enable implicit method\n   * chain sequences. Methods that operate on and return arrays, collections,\n   * and functions can be chained together. Methods that retrieve a single value\n   * or may return a primitive value will automatically end the chain sequence\n   * and return the unwrapped value. Otherwise, the value must be unwrapped\n   * with `_#value`.\n   *\n   * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n   * enabled using `_.chain`.\n   *\n   * The execution of chained methods is lazy, that is, it's deferred until\n   * `_#value` is implicitly or explicitly called.\n   *\n   * Lazy evaluation allows several methods to support shortcut fusion.\n   * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n   * the creation of intermediate arrays and can greatly reduce the number of\n   * iteratee executions. Sections of a chain sequence qualify for shortcut\n   * fusion if the section is applied to an array and iteratees accept only\n   * one argument. The heuristic for whether a section qualifies for shortcut\n   * fusion is subject to change.\n   *\n   * Chaining is supported in custom builds as long as the `_#value` method is\n   * directly or indirectly included in the build.\n   *\n   * In addition to lodash methods, wrappers have `Array` and `String` methods.\n   *\n   * The wrapper `Array` methods are:\n   * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n   *\n   * The wrapper `String` methods are:\n   * `replace` and `split`\n   *\n   * The wrapper methods that support shortcut fusion are:\n   * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n   * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n   * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n   *\n   * The chainable wrapper methods are:\n   * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n   * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n   * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n   * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n   * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n   * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n   * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n   * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n   * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n   * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n   * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n   * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n   * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n   * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n   * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n   * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n   * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n   * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n   * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n   * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n   * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n   * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n   * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n   * `zipObject`, `zipObjectDeep`, and `zipWith`\n   *\n   * The wrapper methods that are **not** chainable by default are:\n   * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n   * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n   * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n   * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n   * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n   * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n   * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n   * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n   * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n   * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n   * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n   * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n   * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n   * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n   * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n   * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n   * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n   * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n   * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n   * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n   * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n   * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n   * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n   * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n   * `upperFirst`, `value`, and `words`\n   *\n   * @name _\n   * @constructor\n   * @category Seq\n   * @param {*} value The value to wrap in a `lodash` instance.\n   * @returns {Object} Returns the new `lodash` wrapper instance.\n   * @example\n   *\n   * function square(n) {\n   *   return n * n;\n   * }\n   *\n   * var wrapped = _([1, 2, 3]);\n   *\n   * // Returns an unwrapped value.\n   * wrapped.reduce(_.add);\n   * // => 6\n   *\n   * // Returns a wrapped value.\n   * var squares = wrapped.map(square);\n   *\n   * _.isArray(squares);\n   * // => false\n   *\n   * _.isArray(squares.value());\n   * // => true\n   */\n  function lodash(value) {\n    return value instanceof LodashWrapper\n      ? value\n      : new LodashWrapper(value);\n  }\n\n  /**\n   * The base implementation of `_.create` without support for assigning\n   * properties to the created object.\n   *\n   * @private\n   * @param {Object} proto The object to inherit from.\n   * @returns {Object} Returns the new object.\n   */\n  var baseCreate = (function() {\n    function object() {}\n    return function(proto) {\n      if (!isObject(proto)) {\n        return {};\n      }\n      if (objectCreate) {\n        return objectCreate(proto);\n      }\n      object.prototype = proto;\n      var result = new object;\n      object.prototype = undefined;\n      return result;\n    };\n  }());\n\n  /**\n   * The base constructor for creating `lodash` wrapper objects.\n   *\n   * @private\n   * @param {*} value The value to wrap.\n   * @param {boolean} [chainAll] Enable explicit method chain sequences.\n   */\n  function LodashWrapper(value, chainAll) {\n    this.__wrapped__ = value;\n    this.__actions__ = [];\n    this.__chain__ = !!chainAll;\n  }\n\n  LodashWrapper.prototype = baseCreate(lodash.prototype);\n  LodashWrapper.prototype.constructor = LodashWrapper;\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Assigns `value` to `key` of `object` if the existing value is not equivalent\n   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons.\n   *\n   * @private\n   * @param {Object} object The object to modify.\n   * @param {string} key The key of the property to assign.\n   * @param {*} value The value to assign.\n   */\n  function assignValue(object, key, value) {\n    var objValue = object[key];\n    if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n        (value === undefined && !(key in object))) {\n      baseAssignValue(object, key, value);\n    }\n  }\n\n  /**\n   * The base implementation of `assignValue` and `assignMergeValue` without\n   * value checks.\n   *\n   * @private\n   * @param {Object} object The object to modify.\n   * @param {string} key The key of the property to assign.\n   * @param {*} value The value to assign.\n   */\n  function baseAssignValue(object, key, value) {\n    object[key] = value;\n  }\n\n  /**\n   * The base implementation of `_.delay` and `_.defer` which accepts `args`\n   * to provide to `func`.\n   *\n   * @private\n   * @param {Function} func The function to delay.\n   * @param {number} wait The number of milliseconds to delay invocation.\n   * @param {Array} args The arguments to provide to `func`.\n   * @returns {number|Object} Returns the timer id or timeout object.\n   */\n  function baseDelay(func, wait, args) {\n    if (typeof func != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    return setTimeout(function() { func.apply(undefined, args); }, wait);\n  }\n\n  /**\n   * The base implementation of `_.forEach` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array|Object} Returns `collection`.\n   */\n  var baseEach = createBaseEach(baseForOwn);\n\n  /**\n   * The base implementation of `_.every` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`\n   */\n  function baseEvery(collection, predicate) {\n    var result = true;\n    baseEach(collection, function(value, index, collection) {\n      result = !!predicate(value, index, collection);\n      return result;\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of methods like `_.max` and `_.min` which accepts a\n   * `comparator` to determine the extremum value.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The iteratee invoked per iteration.\n   * @param {Function} comparator The comparator used to compare values.\n   * @returns {*} Returns the extremum value.\n   */\n  function baseExtremum(array, iteratee, comparator) {\n    var index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var value = array[index],\n          current = iteratee(value);\n\n      if (current != null && (computed === undefined\n            ? (current === current && !false)\n            : comparator(current, computed)\n          )) {\n        var computed = current,\n            result = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.filter` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function baseFilter(collection, predicate) {\n    var result = [];\n    baseEach(collection, function(value, index, collection) {\n      if (predicate(value, index, collection)) {\n        result.push(value);\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.flatten` with support for restricting flattening.\n   *\n   * @private\n   * @param {Array} array The array to flatten.\n   * @param {number} depth The maximum recursion depth.\n   * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n   * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n   * @param {Array} [result=[]] The initial result value.\n   * @returns {Array} Returns the new flattened array.\n   */\n  function baseFlatten(array, depth, predicate, isStrict, result) {\n    var index = -1,\n        length = array.length;\n\n    predicate || (predicate = isFlattenable);\n    result || (result = []);\n\n    while (++index < length) {\n      var value = array[index];\n      if (depth > 0 && predicate(value)) {\n        if (depth > 1) {\n          // Recursively flatten arrays (susceptible to call stack limits).\n          baseFlatten(value, depth - 1, predicate, isStrict, result);\n        } else {\n          arrayPush(result, value);\n        }\n      } else if (!isStrict) {\n        result[result.length] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `baseForOwn` which iterates over `object`\n   * properties returned by `keysFunc` and invokes `iteratee` for each property.\n   * Iteratee functions may exit iteration early by explicitly returning `false`.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {Function} keysFunc The function to get the keys of `object`.\n   * @returns {Object} Returns `object`.\n   */\n  var baseFor = createBaseFor();\n\n  /**\n   * The base implementation of `_.forOwn` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Object} Returns `object`.\n   */\n  function baseForOwn(object, iteratee) {\n    return object && baseFor(object, iteratee, keys);\n  }\n\n  /**\n   * The base implementation of `_.functions` which creates an array of\n   * `object` function property names filtered from `props`.\n   *\n   * @private\n   * @param {Object} object The object to inspect.\n   * @param {Array} props The property names to filter.\n   * @returns {Array} Returns the function names.\n   */\n  function baseFunctions(object, props) {\n    return baseFilter(props, function(key) {\n      return isFunction(object[key]);\n    });\n  }\n\n  /**\n   * The base implementation of `getTag` without fallbacks for buggy environments.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  function baseGetTag(value) {\n    return objectToString(value);\n  }\n\n  /**\n   * The base implementation of `_.gt` which doesn't coerce arguments.\n   *\n   * @private\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if `value` is greater than `other`,\n   *  else `false`.\n   */\n  function baseGt(value, other) {\n    return value > other;\n  }\n\n  /**\n   * The base implementation of `_.isArguments`.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   */\n  var baseIsArguments = noop;\n\n  /**\n   * The base implementation of `_.isDate` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n   */\n  function baseIsDate(value) {\n    return isObjectLike(value) && baseGetTag(value) == dateTag;\n  }\n\n  /**\n   * The base implementation of `_.isEqual` which supports partial comparisons\n   * and tracks traversed objects.\n   *\n   * @private\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @param {boolean} bitmask The bitmask flags.\n   *  1 - Unordered comparison\n   *  2 - Partial comparison\n   * @param {Function} [customizer] The function to customize comparisons.\n   * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   */\n  function baseIsEqual(value, other, bitmask, customizer, stack) {\n    if (value === other) {\n      return true;\n    }\n    if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n      return value !== value && other !== other;\n    }\n    return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n  }\n\n  /**\n   * A specialized version of `baseIsEqual` for arrays and objects which performs\n   * deep comparisons and tracks traversed objects enabling objects with circular\n   * references to be compared.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n    var objIsArr = isArray(object),\n        othIsArr = isArray(other),\n        objTag = objIsArr ? arrayTag : baseGetTag(object),\n        othTag = othIsArr ? arrayTag : baseGetTag(other);\n\n    objTag = objTag == argsTag ? objectTag : objTag;\n    othTag = othTag == argsTag ? objectTag : othTag;\n\n    var objIsObj = objTag == objectTag,\n        othIsObj = othTag == objectTag,\n        isSameTag = objTag == othTag;\n\n    stack || (stack = []);\n    var objStack = find(stack, function(entry) {\n      return entry[0] == object;\n    });\n    var othStack = find(stack, function(entry) {\n      return entry[0] == other;\n    });\n    if (objStack && othStack) {\n      return objStack[1] == other;\n    }\n    stack.push([object, other]);\n    stack.push([other, object]);\n    if (isSameTag && !objIsObj) {\n      var result = (objIsArr)\n        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      stack.pop();\n      return result;\n    }\n    if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n      if (objIsWrapped || othIsWrapped) {\n        var objUnwrapped = objIsWrapped ? object.value() : object,\n            othUnwrapped = othIsWrapped ? other.value() : other;\n\n        var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        stack.pop();\n        return result;\n      }\n    }\n    if (!isSameTag) {\n      return false;\n    }\n    var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    stack.pop();\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.isRegExp` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n   */\n  function baseIsRegExp(value) {\n    return isObjectLike(value) && baseGetTag(value) == regexpTag;\n  }\n\n  /**\n   * The base implementation of `_.iteratee`.\n   *\n   * @private\n   * @param {*} [value=_.identity] The value to convert to an iteratee.\n   * @returns {Function} Returns the iteratee.\n   */\n  function baseIteratee(func) {\n    if (typeof func == 'function') {\n      return func;\n    }\n    if (func == null) {\n      return identity;\n    }\n    return (typeof func == 'object' ? baseMatches : baseProperty)(func);\n  }\n\n  /**\n   * The base implementation of `_.lt` which doesn't coerce arguments.\n   *\n   * @private\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if `value` is less than `other`,\n   *  else `false`.\n   */\n  function baseLt(value, other) {\n    return value < other;\n  }\n\n  /**\n   * The base implementation of `_.map` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function baseMap(collection, iteratee) {\n    var index = -1,\n        result = isArrayLike(collection) ? Array(collection.length) : [];\n\n    baseEach(collection, function(value, key, collection) {\n      result[++index] = iteratee(value, key, collection);\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.matches` which doesn't clone `source`.\n   *\n   * @private\n   * @param {Object} source The object of property values to match.\n   * @returns {Function} Returns the new spec function.\n   */\n  function baseMatches(source) {\n    var props = nativeKeys(source);\n    return function(object) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length];\n        if (!(key in object &&\n              baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)\n            )) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  /**\n   * The base implementation of `_.pick` without support for individual\n   * property identifiers.\n   *\n   * @private\n   * @param {Object} object The source object.\n   * @param {string[]} paths The property paths to pick.\n   * @returns {Object} Returns the new object.\n   */\n  function basePick(object, props) {\n    object = Object(object);\n    return reduce(props, function(result, key) {\n      if (key in object) {\n        result[key] = object[key];\n      }\n      return result;\n    }, {});\n  }\n\n  /**\n   * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n   *\n   * @private\n   * @param {Function} func The function to apply a rest parameter to.\n   * @param {number} [start=func.length-1] The start position of the rest parameter.\n   * @returns {Function} Returns the new function.\n   */\n  function baseRest(func, start) {\n    return setToString(overRest(func, start, identity), func + '');\n  }\n\n  /**\n   * The base implementation of `_.slice` without an iteratee call guard.\n   *\n   * @private\n   * @param {Array} array The array to slice.\n   * @param {number} [start=0] The start position.\n   * @param {number} [end=array.length] The end position.\n   * @returns {Array} Returns the slice of `array`.\n   */\n  function baseSlice(array, start, end) {\n    var index = -1,\n        length = array.length;\n\n    if (start < 0) {\n      start = -start > length ? 0 : (length + start);\n    }\n    end = end > length ? length : end;\n    if (end < 0) {\n      end += length;\n    }\n    length = start > end ? 0 : ((end - start) >>> 0);\n    start >>>= 0;\n\n    var result = Array(length);\n    while (++index < length) {\n      result[index] = array[index + start];\n    }\n    return result;\n  }\n\n  /**\n   * Copies the values of `source` to `array`.\n   *\n   * @private\n   * @param {Array} source The array to copy values from.\n   * @param {Array} [array=[]] The array to copy values to.\n   * @returns {Array} Returns `array`.\n   */\n  function copyArray(source) {\n    return baseSlice(source, 0, source.length);\n  }\n\n  /**\n   * The base implementation of `_.some` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function baseSome(collection, predicate) {\n    var result;\n\n    baseEach(collection, function(value, index, collection) {\n      result = predicate(value, index, collection);\n      return !result;\n    });\n    return !!result;\n  }\n\n  /**\n   * The base implementation of `wrapperValue` which returns the result of\n   * performing a sequence of actions on the unwrapped `value`, where each\n   * successive action is supplied the return value of the previous.\n   *\n   * @private\n   * @param {*} value The unwrapped value.\n   * @param {Array} actions Actions to perform to resolve the unwrapped value.\n   * @returns {*} Returns the resolved value.\n   */\n  function baseWrapperValue(value, actions) {\n    var result = value;\n    return reduce(actions, function(result, action) {\n      return action.func.apply(action.thisArg, arrayPush([result], action.args));\n    }, result);\n  }\n\n  /**\n   * Compares values to sort them in ascending order.\n   *\n   * @private\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {number} Returns the sort order indicator for `value`.\n   */\n  function compareAscending(value, other) {\n    if (value !== other) {\n      var valIsDefined = value !== undefined,\n          valIsNull = value === null,\n          valIsReflexive = value === value,\n          valIsSymbol = false;\n\n      var othIsDefined = other !== undefined,\n          othIsNull = other === null,\n          othIsReflexive = other === other,\n          othIsSymbol = false;\n\n      if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n          (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n          (valIsNull && othIsDefined && othIsReflexive) ||\n          (!valIsDefined && othIsReflexive) ||\n          !valIsReflexive) {\n        return 1;\n      }\n      if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n          (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n          (othIsNull && valIsDefined && valIsReflexive) ||\n          (!othIsDefined && valIsReflexive) ||\n          !othIsReflexive) {\n        return -1;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * Copies properties of `source` to `object`.\n   *\n   * @private\n   * @param {Object} source The object to copy properties from.\n   * @param {Array} props The property identifiers to copy.\n   * @param {Object} [object={}] The object to copy properties to.\n   * @param {Function} [customizer] The function to customize copied values.\n   * @returns {Object} Returns `object`.\n   */\n  function copyObject(source, props, object, customizer) {\n    var isNew = !object;\n    object || (object = {});\n\n    var index = -1,\n        length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n\n      var newValue = customizer\n        ? customizer(object[key], source[key], key, object, source)\n        : undefined;\n\n      if (newValue === undefined) {\n        newValue = source[key];\n      }\n      if (isNew) {\n        baseAssignValue(object, key, newValue);\n      } else {\n        assignValue(object, key, newValue);\n      }\n    }\n    return object;\n  }\n\n  /**\n   * Creates a function like `_.assign`.\n   *\n   * @private\n   * @param {Function} assigner The function to assign values.\n   * @returns {Function} Returns the new assigner function.\n   */\n  function createAssigner(assigner) {\n    return baseRest(function(object, sources) {\n      var index = -1,\n          length = sources.length,\n          customizer = length > 1 ? sources[length - 1] : undefined;\n\n      customizer = (assigner.length > 3 && typeof customizer == 'function')\n        ? (length--, customizer)\n        : undefined;\n\n      object = Object(object);\n      while (++index < length) {\n        var source = sources[index];\n        if (source) {\n          assigner(object, source, index, customizer);\n        }\n      }\n      return object;\n    });\n  }\n\n  /**\n   * Creates a `baseEach` or `baseEachRight` function.\n   *\n   * @private\n   * @param {Function} eachFunc The function to iterate over a collection.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {Function} Returns the new base function.\n   */\n  function createBaseEach(eachFunc, fromRight) {\n    return function(collection, iteratee) {\n      if (collection == null) {\n        return collection;\n      }\n      if (!isArrayLike(collection)) {\n        return eachFunc(collection, iteratee);\n      }\n      var length = collection.length,\n          index = fromRight ? length : -1,\n          iterable = Object(collection);\n\n      while ((fromRight ? index-- : ++index < length)) {\n        if (iteratee(iterable[index], index, iterable) === false) {\n          break;\n        }\n      }\n      return collection;\n    };\n  }\n\n  /**\n   * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n   *\n   * @private\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {Function} Returns the new base function.\n   */\n  function createBaseFor(fromRight) {\n    return function(object, iteratee, keysFunc) {\n      var index = -1,\n          iterable = Object(object),\n          props = keysFunc(object),\n          length = props.length;\n\n      while (length--) {\n        var key = props[fromRight ? length : ++index];\n        if (iteratee(iterable[key], key, iterable) === false) {\n          break;\n        }\n      }\n      return object;\n    };\n  }\n\n  /**\n   * Creates a function that produces an instance of `Ctor` regardless of\n   * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n   *\n   * @private\n   * @param {Function} Ctor The constructor to wrap.\n   * @returns {Function} Returns the new wrapped function.\n   */\n  function createCtor(Ctor) {\n    return function() {\n      // Use a `switch` statement to work with class constructors. See\n      // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n      // for more details.\n      var args = arguments;\n      var thisBinding = baseCreate(Ctor.prototype),\n          result = Ctor.apply(thisBinding, args);\n\n      // Mimic the constructor's `return` behavior.\n      // See https://es5.github.io/#x13.2.2 for more details.\n      return isObject(result) ? result : thisBinding;\n    };\n  }\n\n  /**\n   * Creates a `_.find` or `_.findLast` function.\n   *\n   * @private\n   * @param {Function} findIndexFunc The function to find the collection index.\n   * @returns {Function} Returns the new find function.\n   */\n  function createFind(findIndexFunc) {\n    return function(collection, predicate, fromIndex) {\n      var iterable = Object(collection);\n      if (!isArrayLike(collection)) {\n        var iteratee = baseIteratee(predicate, 3);\n        collection = keys(collection);\n        predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n      }\n      var index = findIndexFunc(collection, predicate, fromIndex);\n      return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n    };\n  }\n\n  /**\n   * Creates a function that wraps `func` to invoke it with the `this` binding\n   * of `thisArg` and `partials` prepended to the arguments it receives.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} partials The arguments to prepend to those provided to\n   *  the new function.\n   * @returns {Function} Returns the new wrapped function.\n   */\n  function createPartial(func, bitmask, thisArg, partials) {\n    if (typeof func != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    var isBind = bitmask & WRAP_BIND_FLAG,\n        Ctor = createCtor(func);\n\n    function wrapper() {\n      var argsIndex = -1,\n          argsLength = arguments.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          args = Array(leftLength + argsLength),\n          fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n      while (++leftIndex < leftLength) {\n        args[leftIndex] = partials[leftIndex];\n      }\n      while (argsLength--) {\n        args[leftIndex++] = arguments[++argsIndex];\n      }\n      return fn.apply(isBind ? thisArg : this, args);\n    }\n    return wrapper;\n  }\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for arrays with support for\n   * partial deep comparisons.\n   *\n   * @private\n   * @param {Array} array The array to compare.\n   * @param {Array} other The other array to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `array` and `other` objects.\n   * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n   */\n  function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n        arrLength = array.length,\n        othLength = other.length;\n\n    if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n      return false;\n    }\n    // Check that cyclic values are equal.\n    var arrStacked = stack.get(array);\n    var othStacked = stack.get(other);\n    if (arrStacked && othStacked) {\n      return arrStacked == other && othStacked == array;\n    }\n    var index = -1,\n        result = true,\n        seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;\n\n    // Ignore non-index properties.\n    while (++index < arrLength) {\n      var arrValue = array[index],\n          othValue = other[index];\n\n      var compared;\n      if (compared !== undefined) {\n        if (compared) {\n          continue;\n        }\n        result = false;\n        break;\n      }\n      // Recursively compare arrays (susceptible to call stack limits).\n      if (seen) {\n        if (!baseSome(other, function(othValue, othIndex) {\n              if (!indexOf(seen, othIndex) &&\n                  (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                return seen.push(othIndex);\n              }\n            })) {\n          result = false;\n          break;\n        }\n      } else if (!(\n            arrValue === othValue ||\n              equalFunc(arrValue, othValue, bitmask, customizer, stack)\n          )) {\n        result = false;\n        break;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for comparing objects of\n   * the same `toStringTag`.\n   *\n   * **Note:** This function only supports comparing values with tags of\n   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {string} tag The `toStringTag` of the objects to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n    switch (tag) {\n\n      case boolTag:\n      case dateTag:\n      case numberTag:\n        // Coerce booleans to `1` or `0` and dates to milliseconds.\n        // Invalid dates are coerced to `NaN`.\n        return eq(+object, +other);\n\n      case errorTag:\n        return object.name == other.name && object.message == other.message;\n\n      case regexpTag:\n      case stringTag:\n        // Coerce regexes to strings and treat strings, primitives and objects,\n        // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n        // for more details.\n        return object == (other + '');\n\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for objects with support for\n   * partial deep comparisons.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n        objProps = keys(object),\n        objLength = objProps.length,\n        othProps = keys(other),\n        othLength = othProps.length;\n\n    if (objLength != othLength && !isPartial) {\n      return false;\n    }\n    var index = objLength;\n    while (index--) {\n      var key = objProps[index];\n      if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n        return false;\n      }\n    }\n    // Check that cyclic values are equal.\n    var objStacked = stack.get(object);\n    var othStacked = stack.get(other);\n    if (objStacked && othStacked) {\n      return objStacked == other && othStacked == object;\n    }\n    var result = true;\n\n    var skipCtor = isPartial;\n    while (++index < objLength) {\n      key = objProps[index];\n      var objValue = object[key],\n          othValue = other[key];\n\n      var compared;\n      // Recursively compare objects (susceptible to call stack limits).\n      if (!(compared === undefined\n            ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n            : compared\n          )) {\n        result = false;\n        break;\n      }\n      skipCtor || (skipCtor = key == 'constructor');\n    }\n    if (result && !skipCtor) {\n      var objCtor = object.constructor,\n          othCtor = other.constructor;\n\n      // Non `Object` object instances with different constructors are not equal.\n      if (objCtor != othCtor &&\n          ('constructor' in object && 'constructor' in other) &&\n          !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n            typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n        result = false;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `baseRest` which flattens the rest array.\n   *\n   * @private\n   * @param {Function} func The function to apply a rest parameter to.\n   * @returns {Function} Returns the new function.\n   */\n  function flatRest(func) {\n    return setToString(overRest(func, undefined, flatten), func + '');\n  }\n\n  /**\n   * Checks if `value` is a flattenable `arguments` object or array.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n   */\n  function isFlattenable(value) {\n    return isArray(value) || isArguments(value);\n  }\n\n  /**\n   * Checks if `value` is a valid array-like index.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n   */\n  function isIndex(value, length) {\n    var type = typeof value;\n    length = length == null ? MAX_SAFE_INTEGER : length;\n\n    return !!length &&\n      (type == 'number' ||\n        (type != 'symbol' && reIsUint.test(value))) &&\n          (value > -1 && value % 1 == 0 && value < length);\n  }\n\n  /**\n   * Checks if the given arguments are from an iteratee call.\n   *\n   * @private\n   * @param {*} value The potential iteratee value argument.\n   * @param {*} index The potential iteratee index or key argument.\n   * @param {*} object The potential iteratee object argument.\n   * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n   *  else `false`.\n   */\n  function isIterateeCall(value, index, object) {\n    if (!isObject(object)) {\n      return false;\n    }\n    var type = typeof index;\n    if (type == 'number'\n          ? (isArrayLike(object) && isIndex(index, object.length))\n          : (type == 'string' && index in object)\n        ) {\n      return eq(object[index], value);\n    }\n    return false;\n  }\n\n  /**\n   * This function is like\n   * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * except that it includes inherited enumerable properties.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function nativeKeysIn(object) {\n    var result = [];\n    if (object != null) {\n      for (var key in Object(object)) {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `value` to a string using `Object.prototype.toString`.\n   *\n   * @private\n   * @param {*} value The value to convert.\n   * @returns {string} Returns the converted string.\n   */\n  function objectToString(value) {\n    return nativeObjectToString.call(value);\n  }\n\n  /**\n   * A specialized version of `baseRest` which transforms the rest array.\n   *\n   * @private\n   * @param {Function} func The function to apply a rest parameter to.\n   * @param {number} [start=func.length-1] The start position of the rest parameter.\n   * @param {Function} transform The rest array transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overRest(func, start, transform) {\n    start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n    return function() {\n      var args = arguments,\n          index = -1,\n          length = nativeMax(args.length - start, 0),\n          array = Array(length);\n\n      while (++index < length) {\n        array[index] = args[start + index];\n      }\n      index = -1;\n      var otherArgs = Array(start + 1);\n      while (++index < start) {\n        otherArgs[index] = args[index];\n      }\n      otherArgs[start] = transform(array);\n      return func.apply(this, otherArgs);\n    };\n  }\n\n  /**\n   * Sets the `toString` method of `func` to return `string`.\n   *\n   * @private\n   * @param {Function} func The function to modify.\n   * @param {Function} string The `toString` result.\n   * @returns {Function} Returns `func`.\n   */\n  var setToString = identity;\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Creates an array with all falsey values removed. The values `false`, `null`,\n   * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to compact.\n   * @returns {Array} Returns the new array of filtered values.\n   * @example\n   *\n   * _.compact([0, 1, false, 2, '', 3]);\n   * // => [1, 2, 3]\n   */\n  function compact(array) {\n    return baseFilter(array, Boolean);\n  }\n\n  /**\n   * Creates a new array concatenating `array` with any additional arrays\n   * and/or values.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Array\n   * @param {Array} array The array to concatenate.\n   * @param {...*} [values] The values to concatenate.\n   * @returns {Array} Returns the new concatenated array.\n   * @example\n   *\n   * var array = [1];\n   * var other = _.concat(array, 2, [3], [[4]]);\n   *\n   * console.log(other);\n   * // => [1, 2, 3, [4]]\n   *\n   * console.log(array);\n   * // => [1]\n   */\n  function concat() {\n    var length = arguments.length;\n    if (!length) {\n      return [];\n    }\n    var args = Array(length - 1),\n        array = arguments[0],\n        index = length;\n\n    while (index--) {\n      args[index - 1] = arguments[index];\n    }\n    return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n  }\n\n  /**\n   * This method is like `_.find` except that it returns the index of the first\n   * element `predicate` returns truthy for instead of the element itself.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Array\n   * @param {Array} array The array to inspect.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the found element, else `-1`.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney',  'active': false },\n   *   { 'user': 'fred',    'active': false },\n   *   { 'user': 'pebbles', 'active': true }\n   * ];\n   *\n   * _.findIndex(users, function(o) { return o.user == 'barney'; });\n   * // => 0\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.findIndex(users, { 'user': 'fred', 'active': false });\n   * // => 1\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.findIndex(users, ['active', false]);\n   * // => 0\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.findIndex(users, 'active');\n   * // => 2\n   */\n  function findIndex(array, predicate, fromIndex) {\n    var length = array == null ? 0 : array.length;\n    if (!length) {\n      return -1;\n    }\n    var index = fromIndex == null ? 0 : toInteger(fromIndex);\n    if (index < 0) {\n      index = nativeMax(length + index, 0);\n    }\n    return baseFindIndex(array, baseIteratee(predicate, 3), index);\n  }\n\n  /**\n   * Flattens `array` a single level deep.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to flatten.\n   * @returns {Array} Returns the new flattened array.\n   * @example\n   *\n   * _.flatten([1, [2, [3, [4]], 5]]);\n   * // => [1, 2, [3, [4]], 5]\n   */\n  function flatten(array) {\n    var length = array == null ? 0 : array.length;\n    return length ? baseFlatten(array, 1) : [];\n  }\n\n  /**\n   * Recursively flattens `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Array\n   * @param {Array} array The array to flatten.\n   * @returns {Array} Returns the new flattened array.\n   * @example\n   *\n   * _.flattenDeep([1, [2, [3, [4]], 5]]);\n   * // => [1, 2, 3, 4, 5]\n   */\n  function flattenDeep(array) {\n    var length = array == null ? 0 : array.length;\n    return length ? baseFlatten(array, INFINITY) : [];\n  }\n\n  /**\n   * Gets the first element of `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @alias first\n   * @category Array\n   * @param {Array} array The array to query.\n   * @returns {*} Returns the first element of `array`.\n   * @example\n   *\n   * _.head([1, 2, 3]);\n   * // => 1\n   *\n   * _.head([]);\n   * // => undefined\n   */\n  function head(array) {\n    return (array && array.length) ? array[0] : undefined;\n  }\n\n  /**\n   * Gets the index at which the first occurrence of `value` is found in `array`\n   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons. If `fromIndex` is negative, it's used as the\n   * offset from the end of `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   * @example\n   *\n   * _.indexOf([1, 2, 1, 2], 2);\n   * // => 1\n   *\n   * // Search from the `fromIndex`.\n   * _.indexOf([1, 2, 1, 2], 2, 2);\n   * // => 3\n   */\n  function indexOf(array, value, fromIndex) {\n    var length = array == null ? 0 : array.length;\n    if (typeof fromIndex == 'number') {\n      fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n    } else {\n      fromIndex = 0;\n    }\n    var index = (fromIndex || 0) - 1,\n        isReflexive = value === value;\n\n    while (++index < length) {\n      var other = array[index];\n      if ((isReflexive ? other === value : other !== other)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Gets the last element of `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to query.\n   * @returns {*} Returns the last element of `array`.\n   * @example\n   *\n   * _.last([1, 2, 3]);\n   * // => 3\n   */\n  function last(array) {\n    var length = array == null ? 0 : array.length;\n    return length ? array[length - 1] : undefined;\n  }\n\n  /**\n   * Creates a slice of `array` from `start` up to, but not including, `end`.\n   *\n   * **Note:** This method is used instead of\n   * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n   * returned.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Array\n   * @param {Array} array The array to slice.\n   * @param {number} [start=0] The start position.\n   * @param {number} [end=array.length] The end position.\n   * @returns {Array} Returns the slice of `array`.\n   */\n  function slice(array, start, end) {\n    var length = array == null ? 0 : array.length;\n    start = start == null ? 0 : +start;\n    end = end === undefined ? length : +end;\n    return length ? baseSlice(array, start, end) : [];\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n   * chain sequences enabled. The result of such sequences must be unwrapped\n   * with `_#value`.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.3.0\n   * @category Seq\n   * @param {*} value The value to wrap.\n   * @returns {Object} Returns the new `lodash` wrapper instance.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney',  'age': 36 },\n   *   { 'user': 'fred',    'age': 40 },\n   *   { 'user': 'pebbles', 'age': 1 }\n   * ];\n   *\n   * var youngest = _\n   *   .chain(users)\n   *   .sortBy('age')\n   *   .map(function(o) {\n   *     return o.user + ' is ' + o.age;\n   *   })\n   *   .head()\n   *   .value();\n   * // => 'pebbles is 1'\n   */\n  function chain(value) {\n    var result = lodash(value);\n    result.__chain__ = true;\n    return result;\n  }\n\n  /**\n   * This method invokes `interceptor` and returns `value`. The interceptor\n   * is invoked with one argument; (value). The purpose of this method is to\n   * \"tap into\" a method chain sequence in order to modify intermediate results.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Seq\n   * @param {*} value The value to provide to `interceptor`.\n   * @param {Function} interceptor The function to invoke.\n   * @returns {*} Returns `value`.\n   * @example\n   *\n   * _([1, 2, 3])\n   *  .tap(function(array) {\n   *    // Mutate input array.\n   *    array.pop();\n   *  })\n   *  .reverse()\n   *  .value();\n   * // => [2, 1]\n   */\n  function tap(value, interceptor) {\n    interceptor(value);\n    return value;\n  }\n\n  /**\n   * This method is like `_.tap` except that it returns the result of `interceptor`.\n   * The purpose of this method is to \"pass thru\" values replacing intermediate\n   * results in a method chain sequence.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Seq\n   * @param {*} value The value to provide to `interceptor`.\n   * @param {Function} interceptor The function to invoke.\n   * @returns {*} Returns the result of `interceptor`.\n   * @example\n   *\n   * _('  abc  ')\n   *  .chain()\n   *  .trim()\n   *  .thru(function(value) {\n   *    return [value];\n   *  })\n   *  .value();\n   * // => ['abc']\n   */\n  function thru(value, interceptor) {\n    return interceptor(value);\n  }\n\n  /**\n   * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n   *\n   * @name chain\n   * @memberOf _\n   * @since 0.1.0\n   * @category Seq\n   * @returns {Object} Returns the new `lodash` wrapper instance.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36 },\n   *   { 'user': 'fred',   'age': 40 }\n   * ];\n   *\n   * // A sequence without explicit chaining.\n   * _(users).head();\n   * // => { 'user': 'barney', 'age': 36 }\n   *\n   * // A sequence with explicit chaining.\n   * _(users)\n   *   .chain()\n   *   .head()\n   *   .pick('user')\n   *   .value();\n   * // => { 'user': 'barney' }\n   */\n  function wrapperChain() {\n    return chain(this);\n  }\n\n  /**\n   * Executes the chain sequence to resolve the unwrapped value.\n   *\n   * @name value\n   * @memberOf _\n   * @since 0.1.0\n   * @alias toJSON, valueOf\n   * @category Seq\n   * @returns {*} Returns the resolved unwrapped value.\n   * @example\n   *\n   * _([1, 2, 3]).value();\n   * // => [1, 2, 3]\n   */\n  function wrapperValue() {\n    return baseWrapperValue(this.__wrapped__, this.__actions__);\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Checks if `predicate` returns truthy for **all** elements of `collection`.\n   * Iteration is stopped once `predicate` returns falsey. The predicate is\n   * invoked with three arguments: (value, index|key, collection).\n   *\n   * **Note:** This method returns `true` for\n   * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n   * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n   * elements of empty collections.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   * @example\n   *\n   * _.every([true, 1, null, 'yes'], Boolean);\n   * // => false\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36, 'active': false },\n   *   { 'user': 'fred',   'age': 40, 'active': false }\n   * ];\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.every(users, { 'user': 'barney', 'active': false });\n   * // => false\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.every(users, ['active', false]);\n   * // => true\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.every(users, 'active');\n   * // => false\n   */\n  function every(collection, predicate, guard) {\n    predicate = guard ? undefined : predicate;\n    return baseEvery(collection, baseIteratee(predicate));\n  }\n\n  /**\n   * Iterates over elements of `collection`, returning an array of all elements\n   * `predicate` returns truthy for. The predicate is invoked with three\n   * arguments: (value, index|key, collection).\n   *\n   * **Note:** Unlike `_.remove`, this method returns a new array.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   * @see _.reject\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36, 'active': true },\n   *   { 'user': 'fred',   'age': 40, 'active': false }\n   * ];\n   *\n   * _.filter(users, function(o) { return !o.active; });\n   * // => objects for ['fred']\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.filter(users, { 'age': 36, 'active': true });\n   * // => objects for ['barney']\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.filter(users, ['active', false]);\n   * // => objects for ['fred']\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.filter(users, 'active');\n   * // => objects for ['barney']\n   *\n   * // Combining several predicates using `_.overEvery` or `_.overSome`.\n   * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n   * // => objects for ['fred', 'barney']\n   */\n  function filter(collection, predicate) {\n    return baseFilter(collection, baseIteratee(predicate));\n  }\n\n  /**\n   * Iterates over elements of `collection`, returning the first element\n   * `predicate` returns truthy for. The predicate is invoked with three\n   * arguments: (value, index|key, collection).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {*} Returns the matched element, else `undefined`.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney',  'age': 36, 'active': true },\n   *   { 'user': 'fred',    'age': 40, 'active': false },\n   *   { 'user': 'pebbles', 'age': 1,  'active': true }\n   * ];\n   *\n   * _.find(users, function(o) { return o.age < 40; });\n   * // => object for 'barney'\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.find(users, { 'age': 1, 'active': true });\n   * // => object for 'pebbles'\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.find(users, ['active', false]);\n   * // => object for 'fred'\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.find(users, 'active');\n   * // => object for 'barney'\n   */\n  var find = createFind(findIndex);\n\n  /**\n   * Iterates over elements of `collection` and invokes `iteratee` for each element.\n   * The iteratee is invoked with three arguments: (value, index|key, collection).\n   * Iteratee functions may exit iteration early by explicitly returning `false`.\n   *\n   * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n   * property are iterated like arrays. To avoid this behavior use `_.forIn`\n   * or `_.forOwn` for object iteration.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @alias each\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @returns {Array|Object} Returns `collection`.\n   * @see _.forEachRight\n   * @example\n   *\n   * _.forEach([1, 2], function(value) {\n   *   console.log(value);\n   * });\n   * // => Logs `1` then `2`.\n   *\n   * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n   *   console.log(key);\n   * });\n   * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n   */\n  function forEach(collection, iteratee) {\n    return baseEach(collection, baseIteratee(iteratee));\n  }\n\n  /**\n   * Creates an array of values by running each element in `collection` thru\n   * `iteratee`. The iteratee is invoked with three arguments:\n   * (value, index|key, collection).\n   *\n   * Many lodash methods are guarded to work as iteratees for methods like\n   * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n   *\n   * The guarded methods are:\n   * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n   * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n   * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n   * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   * @example\n   *\n   * function square(n) {\n   *   return n * n;\n   * }\n   *\n   * _.map([4, 8], square);\n   * // => [16, 64]\n   *\n   * _.map({ 'a': 4, 'b': 8 }, square);\n   * // => [16, 64] (iteration order is not guaranteed)\n   *\n   * var users = [\n   *   { 'user': 'barney' },\n   *   { 'user': 'fred' }\n   * ];\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.map(users, 'user');\n   * // => ['barney', 'fred']\n   */\n  function map(collection, iteratee) {\n    return baseMap(collection, baseIteratee(iteratee));\n  }\n\n  /**\n   * Reduces `collection` to a value which is the accumulated result of running\n   * each element in `collection` thru `iteratee`, where each successive\n   * invocation is supplied the return value of the previous. If `accumulator`\n   * is not given, the first element of `collection` is used as the initial\n   * value. The iteratee is invoked with four arguments:\n   * (accumulator, value, index|key, collection).\n   *\n   * Many lodash methods are guarded to work as iteratees for methods like\n   * `_.reduce`, `_.reduceRight`, and `_.transform`.\n   *\n   * The guarded methods are:\n   * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n   * and `sortBy`\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @returns {*} Returns the accumulated value.\n   * @see _.reduceRight\n   * @example\n   *\n   * _.reduce([1, 2], function(sum, n) {\n   *   return sum + n;\n   * }, 0);\n   * // => 3\n   *\n   * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n   *   (result[value] || (result[value] = [])).push(key);\n   *   return result;\n   * }, {});\n   * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n   */\n  function reduce(collection, iteratee, accumulator) {\n    return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);\n  }\n\n  /**\n   * Gets the size of `collection` by returning its length for array-like\n   * values or the number of own enumerable string keyed properties for objects.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object|string} collection The collection to inspect.\n   * @returns {number} Returns the collection size.\n   * @example\n   *\n   * _.size([1, 2, 3]);\n   * // => 3\n   *\n   * _.size({ 'a': 1, 'b': 2 });\n   * // => 2\n   *\n   * _.size('pebbles');\n   * // => 7\n   */\n  function size(collection) {\n    if (collection == null) {\n      return 0;\n    }\n    collection = isArrayLike(collection) ? collection : nativeKeys(collection);\n    return collection.length;\n  }\n\n  /**\n   * Checks if `predicate` returns truthy for **any** element of `collection`.\n   * Iteration is stopped once `predicate` returns truthy. The predicate is\n   * invoked with three arguments: (value, index|key, collection).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   * @example\n   *\n   * _.some([null, 0, 'yes', false], Boolean);\n   * // => true\n   *\n   * var users = [\n   *   { 'user': 'barney', 'active': true },\n   *   { 'user': 'fred',   'active': false }\n   * ];\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.some(users, { 'user': 'barney', 'active': false });\n   * // => false\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.some(users, ['active', false]);\n   * // => true\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.some(users, 'active');\n   * // => true\n   */\n  function some(collection, predicate, guard) {\n    predicate = guard ? undefined : predicate;\n    return baseSome(collection, baseIteratee(predicate));\n  }\n\n  /**\n   * Creates an array of elements, sorted in ascending order by the results of\n   * running each element in a collection thru each iteratee. This method\n   * performs a stable sort, that is, it preserves the original sort order of\n   * equal elements. The iteratees are invoked with one argument: (value).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {...(Function|Function[])} [iteratees=[_.identity]]\n   *  The iteratees to sort by.\n   * @returns {Array} Returns the new sorted array.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'fred',   'age': 48 },\n   *   { 'user': 'barney', 'age': 36 },\n   *   { 'user': 'fred',   'age': 30 },\n   *   { 'user': 'barney', 'age': 34 }\n   * ];\n   *\n   * _.sortBy(users, [function(o) { return o.user; }]);\n   * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n   *\n   * _.sortBy(users, ['user', 'age']);\n   * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n   */\n  function sortBy(collection, iteratee) {\n    var index = 0;\n    iteratee = baseIteratee(iteratee);\n\n    return baseMap(baseMap(collection, function(value, key, collection) {\n      return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };\n    }).sort(function(object, other) {\n      return compareAscending(object.criteria, other.criteria) || (object.index - other.index);\n    }), baseProperty('value'));\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Creates a function that invokes `func`, with the `this` binding and arguments\n   * of the created function, while it's called less than `n` times. Subsequent\n   * calls to the created function return the result of the last `func` invocation.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Function\n   * @param {number} n The number of calls at which `func` is no longer invoked.\n   * @param {Function} func The function to restrict.\n   * @returns {Function} Returns the new restricted function.\n   * @example\n   *\n   * jQuery(element).on('click', _.before(5, addContactToList));\n   * // => Allows adding up to 4 contacts to the list.\n   */\n  function before(n, func) {\n    var result;\n    if (typeof func != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    n = toInteger(n);\n    return function() {\n      if (--n > 0) {\n        result = func.apply(this, arguments);\n      }\n      if (n <= 1) {\n        func = undefined;\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Creates a function that invokes `func` with the `this` binding of `thisArg`\n   * and `partials` prepended to the arguments it receives.\n   *\n   * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n   * may be used as a placeholder for partially applied arguments.\n   *\n   * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n   * property of bound functions.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to bind.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {...*} [partials] The arguments to be partially applied.\n   * @returns {Function} Returns the new bound function.\n   * @example\n   *\n   * function greet(greeting, punctuation) {\n   *   return greeting + ' ' + this.user + punctuation;\n   * }\n   *\n   * var object = { 'user': 'fred' };\n   *\n   * var bound = _.bind(greet, object, 'hi');\n   * bound('!');\n   * // => 'hi fred!'\n   *\n   * // Bound with placeholders.\n   * var bound = _.bind(greet, object, _, '!');\n   * bound('hi');\n   * // => 'hi fred!'\n   */\n  var bind = baseRest(function(func, thisArg, partials) {\n    return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);\n  });\n\n  /**\n   * Defers invoking the `func` until the current call stack has cleared. Any\n   * additional arguments are provided to `func` when it's invoked.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to defer.\n   * @param {...*} [args] The arguments to invoke `func` with.\n   * @returns {number} Returns the timer id.\n   * @example\n   *\n   * _.defer(function(text) {\n   *   console.log(text);\n   * }, 'deferred');\n   * // => Logs 'deferred' after one millisecond.\n   */\n  var defer = baseRest(function(func, args) {\n    return baseDelay(func, 1, args);\n  });\n\n  /**\n   * Invokes `func` after `wait` milliseconds. Any additional arguments are\n   * provided to `func` when it's invoked.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to delay.\n   * @param {number} wait The number of milliseconds to delay invocation.\n   * @param {...*} [args] The arguments to invoke `func` with.\n   * @returns {number} Returns the timer id.\n   * @example\n   *\n   * _.delay(function(text) {\n   *   console.log(text);\n   * }, 1000, 'later');\n   * // => Logs 'later' after one second.\n   */\n  var delay = baseRest(function(func, wait, args) {\n    return baseDelay(func, toNumber(wait) || 0, args);\n  });\n\n  /**\n   * Creates a function that negates the result of the predicate `func`. The\n   * `func` predicate is invoked with the `this` binding and arguments of the\n   * created function.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Function\n   * @param {Function} predicate The predicate to negate.\n   * @returns {Function} Returns the new negated function.\n   * @example\n   *\n   * function isEven(n) {\n   *   return n % 2 == 0;\n   * }\n   *\n   * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n   * // => [1, 3, 5]\n   */\n  function negate(predicate) {\n    if (typeof predicate != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    return function() {\n      var args = arguments;\n      return !predicate.apply(this, args);\n    };\n  }\n\n  /**\n   * Creates a function that is restricted to invoking `func` once. Repeat calls\n   * to the function return the value of the first invocation. The `func` is\n   * invoked with the `this` binding and arguments of the created function.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to restrict.\n   * @returns {Function} Returns the new restricted function.\n   * @example\n   *\n   * var initialize = _.once(createApplication);\n   * initialize();\n   * initialize();\n   * // => `createApplication` is invoked once\n   */\n  function once(func) {\n    return before(2, func);\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Creates a shallow clone of `value`.\n   *\n   * **Note:** This method is loosely based on the\n   * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n   * and supports cloning arrays, array buffers, booleans, date objects, maps,\n   * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n   * arrays. The own enumerable properties of `arguments` objects are cloned\n   * as plain objects. An empty object is returned for uncloneable values such\n   * as error objects, functions, DOM nodes, and WeakMaps.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to clone.\n   * @returns {*} Returns the cloned value.\n   * @see _.cloneDeep\n   * @example\n   *\n   * var objects = [{ 'a': 1 }, { 'b': 2 }];\n   *\n   * var shallow = _.clone(objects);\n   * console.log(shallow[0] === objects[0]);\n   * // => true\n   */\n  function clone(value) {\n    if (!isObject(value)) {\n      return value;\n    }\n    return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));\n  }\n\n  /**\n   * Performs a\n   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * comparison between two values to determine if they are equivalent.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   * var other = { 'a': 1 };\n   *\n   * _.eq(object, object);\n   * // => true\n   *\n   * _.eq(object, other);\n   * // => false\n   *\n   * _.eq('a', 'a');\n   * // => true\n   *\n   * _.eq('a', Object('a'));\n   * // => false\n   *\n   * _.eq(NaN, NaN);\n   * // => true\n   */\n  function eq(value, other) {\n    return value === other || (value !== value && other !== other);\n  }\n\n  /**\n   * Checks if `value` is likely an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArguments(function() { return arguments; }());\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n    return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n      !propertyIsEnumerable.call(value, 'callee');\n  };\n\n  /**\n   * Checks if `value` is classified as an `Array` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n   * @example\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   *\n   * _.isArray(document.body.children);\n   * // => false\n   *\n   * _.isArray('abc');\n   * // => false\n   *\n   * _.isArray(_.noop);\n   * // => false\n   */\n  var isArray = Array.isArray;\n\n  /**\n   * Checks if `value` is array-like. A value is considered array-like if it's\n   * not a function and has a `value.length` that's an integer greater than or\n   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n   * @example\n   *\n   * _.isArrayLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLike(document.body.children);\n   * // => true\n   *\n   * _.isArrayLike('abc');\n   * // => true\n   *\n   * _.isArrayLike(_.noop);\n   * // => false\n   */\n  function isArrayLike(value) {\n    return value != null && isLength(value.length) && !isFunction(value);\n  }\n\n  /**\n   * Checks if `value` is classified as a boolean primitive or object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n   * @example\n   *\n   * _.isBoolean(false);\n   * // => true\n   *\n   * _.isBoolean(null);\n   * // => false\n   */\n  function isBoolean(value) {\n    return value === true || value === false ||\n      (isObjectLike(value) && baseGetTag(value) == boolTag);\n  }\n\n  /**\n   * Checks if `value` is classified as a `Date` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n   * @example\n   *\n   * _.isDate(new Date);\n   * // => true\n   *\n   * _.isDate('Mon April 23 2012');\n   * // => false\n   */\n  var isDate = baseIsDate;\n\n  /**\n   * Checks if `value` is an empty object, collection, map, or set.\n   *\n   * Objects are considered empty if they have no own enumerable string keyed\n   * properties.\n   *\n   * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n   * jQuery-like collections are considered empty if they have a `length` of `0`.\n   * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n   * @example\n   *\n   * _.isEmpty(null);\n   * // => true\n   *\n   * _.isEmpty(true);\n   * // => true\n   *\n   * _.isEmpty(1);\n   * // => true\n   *\n   * _.isEmpty([1, 2, 3]);\n   * // => false\n   *\n   * _.isEmpty({ 'a': 1 });\n   * // => false\n   */\n  function isEmpty(value) {\n    if (isArrayLike(value) &&\n        (isArray(value) || isString(value) ||\n          isFunction(value.splice) || isArguments(value))) {\n      return !value.length;\n    }\n    return !nativeKeys(value).length;\n  }\n\n  /**\n   * Performs a deep comparison between two values to determine if they are\n   * equivalent.\n   *\n   * **Note:** This method supports comparing arrays, array buffers, booleans,\n   * date objects, error objects, maps, numbers, `Object` objects, regexes,\n   * sets, strings, symbols, and typed arrays. `Object` objects are compared\n   * by their own, not inherited, enumerable properties. Functions and DOM\n   * nodes are compared by strict equality, i.e. `===`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   * var other = { 'a': 1 };\n   *\n   * _.isEqual(object, other);\n   * // => true\n   *\n   * object === other;\n   * // => false\n   */\n  function isEqual(value, other) {\n    return baseIsEqual(value, other);\n  }\n\n  /**\n   * Checks if `value` is a finite primitive number.\n   *\n   * **Note:** This method is based on\n   * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n   * @example\n   *\n   * _.isFinite(3);\n   * // => true\n   *\n   * _.isFinite(Number.MIN_VALUE);\n   * // => true\n   *\n   * _.isFinite(Infinity);\n   * // => false\n   *\n   * _.isFinite('3');\n   * // => false\n   */\n  function isFinite(value) {\n    return typeof value == 'number' && nativeIsFinite(value);\n  }\n\n  /**\n   * Checks if `value` is classified as a `Function` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   *\n   * _.isFunction(/abc/);\n   * // => false\n   */\n  function isFunction(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n    // The use of `Object#toString` avoids issues with the `typeof` operator\n    // in Safari 9 which returns 'object' for typed arrays and other constructors.\n    var tag = baseGetTag(value);\n    return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n  }\n\n  /**\n   * Checks if `value` is a valid array-like length.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n   * @example\n   *\n   * _.isLength(3);\n   * // => true\n   *\n   * _.isLength(Number.MIN_VALUE);\n   * // => false\n   *\n   * _.isLength(Infinity);\n   * // => false\n   *\n   * _.isLength('3');\n   * // => false\n   */\n  function isLength(value) {\n    return typeof value == 'number' &&\n      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject(value) {\n    var type = typeof value;\n    return value != null && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike(value) {\n    return value != null && typeof value == 'object';\n  }\n\n  /**\n   * Checks if `value` is `NaN`.\n   *\n   * **Note:** This method is based on\n   * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n   * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n   * `undefined` and other non-number values.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   * @example\n   *\n   * _.isNaN(NaN);\n   * // => true\n   *\n   * _.isNaN(new Number(NaN));\n   * // => true\n   *\n   * isNaN(undefined);\n   * // => true\n   *\n   * _.isNaN(undefined);\n   * // => false\n   */\n  function isNaN(value) {\n    // An `NaN` primitive is the only value that is not equal to itself.\n    // Perform the `toStringTag` check first to avoid errors with some\n    // ActiveX objects in IE.\n    return isNumber(value) && value != +value;\n  }\n\n  /**\n   * Checks if `value` is `null`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n   * @example\n   *\n   * _.isNull(null);\n   * // => true\n   *\n   * _.isNull(void 0);\n   * // => false\n   */\n  function isNull(value) {\n    return value === null;\n  }\n\n  /**\n   * Checks if `value` is classified as a `Number` primitive or object.\n   *\n   * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n   * classified as numbers, use the `_.isFinite` method.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n   * @example\n   *\n   * _.isNumber(3);\n   * // => true\n   *\n   * _.isNumber(Number.MIN_VALUE);\n   * // => true\n   *\n   * _.isNumber(Infinity);\n   * // => true\n   *\n   * _.isNumber('3');\n   * // => false\n   */\n  function isNumber(value) {\n    return typeof value == 'number' ||\n      (isObjectLike(value) && baseGetTag(value) == numberTag);\n  }\n\n  /**\n   * Checks if `value` is classified as a `RegExp` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n   * @example\n   *\n   * _.isRegExp(/abc/);\n   * // => true\n   *\n   * _.isRegExp('/abc/');\n   * // => false\n   */\n  var isRegExp = baseIsRegExp;\n\n  /**\n   * Checks if `value` is classified as a `String` primitive or object.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n   * @example\n   *\n   * _.isString('abc');\n   * // => true\n   *\n   * _.isString(1);\n   * // => false\n   */\n  function isString(value) {\n    return typeof value == 'string' ||\n      (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n  }\n\n  /**\n   * Checks if `value` is `undefined`.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n   * @example\n   *\n   * _.isUndefined(void 0);\n   * // => true\n   *\n   * _.isUndefined(null);\n   * // => false\n   */\n  function isUndefined(value) {\n    return value === undefined;\n  }\n\n  /**\n   * Converts `value` to an array.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {Array} Returns the converted array.\n   * @example\n   *\n   * _.toArray({ 'a': 1, 'b': 2 });\n   * // => [1, 2]\n   *\n   * _.toArray('abc');\n   * // => ['a', 'b', 'c']\n   *\n   * _.toArray(1);\n   * // => []\n   *\n   * _.toArray(null);\n   * // => []\n   */\n  function toArray(value) {\n    if (!isArrayLike(value)) {\n      return values(value);\n    }\n    return value.length ? copyArray(value) : [];\n  }\n\n  /**\n   * Converts `value` to an integer.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {number} Returns the converted integer.\n   * @example\n   *\n   * _.toInteger(3.2);\n   * // => 3\n   *\n   * _.toInteger(Number.MIN_VALUE);\n   * // => 0\n   *\n   * _.toInteger(Infinity);\n   * // => 1.7976931348623157e+308\n   *\n   * _.toInteger('3.2');\n   * // => 3\n   */\n  var toInteger = Number;\n\n  /**\n   * Converts `value` to a number.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to process.\n   * @returns {number} Returns the number.\n   * @example\n   *\n   * _.toNumber(3.2);\n   * // => 3.2\n   *\n   * _.toNumber(Number.MIN_VALUE);\n   * // => 5e-324\n   *\n   * _.toNumber(Infinity);\n   * // => Infinity\n   *\n   * _.toNumber('3.2');\n   * // => 3.2\n   */\n  var toNumber = Number;\n\n  /**\n   * Converts `value` to a string. An empty string is returned for `null`\n   * and `undefined` values. The sign of `-0` is preserved.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {string} Returns the converted string.\n   * @example\n   *\n   * _.toString(null);\n   * // => ''\n   *\n   * _.toString(-0);\n   * // => '-0'\n   *\n   * _.toString([1, 2, 3]);\n   * // => '1,2,3'\n   */\n  function toString(value) {\n    if (typeof value == 'string') {\n      return value;\n    }\n    return value == null ? '' : (value + '');\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Assigns own enumerable string keyed properties of source objects to the\n   * destination object. Source objects are applied from left to right.\n   * Subsequent sources overwrite property assignments of previous sources.\n   *\n   * **Note:** This method mutates `object` and is loosely based on\n   * [`Object.assign`](https://mdn.io/Object/assign).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.10.0\n   * @category Object\n   * @param {Object} object The destination object.\n   * @param {...Object} [sources] The source objects.\n   * @returns {Object} Returns `object`.\n   * @see _.assignIn\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   * }\n   *\n   * function Bar() {\n   *   this.c = 3;\n   * }\n   *\n   * Foo.prototype.b = 2;\n   * Bar.prototype.d = 4;\n   *\n   * _.assign({ 'a': 0 }, new Foo, new Bar);\n   * // => { 'a': 1, 'c': 3 }\n   */\n  var assign = createAssigner(function(object, source) {\n    copyObject(source, nativeKeys(source), object);\n  });\n\n  /**\n   * This method is like `_.assign` except that it iterates over own and\n   * inherited source properties.\n   *\n   * **Note:** This method mutates `object`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @alias extend\n   * @category Object\n   * @param {Object} object The destination object.\n   * @param {...Object} [sources] The source objects.\n   * @returns {Object} Returns `object`.\n   * @see _.assign\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   * }\n   *\n   * function Bar() {\n   *   this.c = 3;\n   * }\n   *\n   * Foo.prototype.b = 2;\n   * Bar.prototype.d = 4;\n   *\n   * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n   * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n   */\n  var assignIn = createAssigner(function(object, source) {\n    copyObject(source, nativeKeysIn(source), object);\n  });\n\n  /**\n   * Creates an object that inherits from the `prototype` object. If a\n   * `properties` object is given, its own enumerable string keyed properties\n   * are assigned to the created object.\n   *\n   * @static\n   * @memberOf _\n   * @since 2.3.0\n   * @category Object\n   * @param {Object} prototype The object to inherit from.\n   * @param {Object} [properties] The properties to assign to the object.\n   * @returns {Object} Returns the new object.\n   * @example\n   *\n   * function Shape() {\n   *   this.x = 0;\n   *   this.y = 0;\n   * }\n   *\n   * function Circle() {\n   *   Shape.call(this);\n   * }\n   *\n   * Circle.prototype = _.create(Shape.prototype, {\n   *   'constructor': Circle\n   * });\n   *\n   * var circle = new Circle;\n   * circle instanceof Circle;\n   * // => true\n   *\n   * circle instanceof Shape;\n   * // => true\n   */\n  function create(prototype, properties) {\n    var result = baseCreate(prototype);\n    return properties == null ? result : assign(result, properties);\n  }\n\n  /**\n   * Assigns own and inherited enumerable string keyed properties of source\n   * objects to the destination object for all destination properties that\n   * resolve to `undefined`. Source objects are applied from left to right.\n   * Once a property is set, additional values of the same property are ignored.\n   *\n   * **Note:** This method mutates `object`.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The destination object.\n   * @param {...Object} [sources] The source objects.\n   * @returns {Object} Returns `object`.\n   * @see _.defaultsDeep\n   * @example\n   *\n   * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n   * // => { 'a': 1, 'b': 2 }\n   */\n  var defaults = baseRest(function(object, sources) {\n    object = Object(object);\n\n    var index = -1;\n    var length = sources.length;\n    var guard = length > 2 ? sources[2] : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      length = 1;\n    }\n\n    while (++index < length) {\n      var source = sources[index];\n      var props = keysIn(source);\n      var propsIndex = -1;\n      var propsLength = props.length;\n\n      while (++propsIndex < propsLength) {\n        var key = props[propsIndex];\n        var value = object[key];\n\n        if (value === undefined ||\n            (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n          object[key] = source[key];\n        }\n      }\n    }\n\n    return object;\n  });\n\n  /**\n   * Checks if `path` is a direct property of `object`.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path to check.\n   * @returns {boolean} Returns `true` if `path` exists, else `false`.\n   * @example\n   *\n   * var object = { 'a': { 'b': 2 } };\n   * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n   *\n   * _.has(object, 'a');\n   * // => true\n   *\n   * _.has(object, 'a.b');\n   * // => true\n   *\n   * _.has(object, ['a', 'b']);\n   * // => true\n   *\n   * _.has(other, 'a');\n   * // => false\n   */\n  function has(object, path) {\n    return object != null && hasOwnProperty.call(object, path);\n  }\n\n  /**\n   * Creates an array of the own enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects. See the\n   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * for more details.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keys(new Foo);\n   * // => ['a', 'b'] (iteration order is not guaranteed)\n   *\n   * _.keys('hi');\n   * // => ['0', '1']\n   */\n  var keys = nativeKeys;\n\n  /**\n   * Creates an array of the own and inherited enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keysIn(new Foo);\n   * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n   */\n  var keysIn = nativeKeysIn;\n\n  /**\n   * Creates an object composed of the picked `object` properties.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The source object.\n   * @param {...(string|string[])} [paths] The property paths to pick.\n   * @returns {Object} Returns the new object.\n   * @example\n   *\n   * var object = { 'a': 1, 'b': '2', 'c': 3 };\n   *\n   * _.pick(object, ['a', 'c']);\n   * // => { 'a': 1, 'c': 3 }\n   */\n  var pick = flatRest(function(object, paths) {\n    return object == null ? {} : basePick(object, paths);\n  });\n\n  /**\n   * This method is like `_.get` except that if the resolved value is a\n   * function it's invoked with the `this` binding of its parent object and\n   * its result is returned.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path of the property to resolve.\n   * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n   * @returns {*} Returns the resolved value.\n   * @example\n   *\n   * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n   *\n   * _.result(object, 'a[0].b.c1');\n   * // => 3\n   *\n   * _.result(object, 'a[0].b.c2');\n   * // => 4\n   *\n   * _.result(object, 'a[0].b.c3', 'default');\n   * // => 'default'\n   *\n   * _.result(object, 'a[0].b.c3', _.constant('default'));\n   * // => 'default'\n   */\n  function result(object, path, defaultValue) {\n    var value = object == null ? undefined : object[path];\n    if (value === undefined) {\n      value = defaultValue;\n    }\n    return isFunction(value) ? value.call(object) : value;\n  }\n\n  /**\n   * Creates an array of the own enumerable string keyed property values of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property values.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.values(new Foo);\n   * // => [1, 2] (iteration order is not guaranteed)\n   *\n   * _.values('hi');\n   * // => ['h', 'i']\n   */\n  function values(object) {\n    return object == null ? [] : baseValues(object, keys(object));\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n   * corresponding HTML entities.\n   *\n   * **Note:** No other characters are escaped. To escape additional\n   * characters use a third-party library like [_he_](https://mths.be/he).\n   *\n   * Though the \">\" character is escaped for symmetry, characters like\n   * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n   * unless they're part of a tag or unquoted attribute value. See\n   * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n   * (under \"semi-related fun fact\") for more details.\n   *\n   * When working with HTML you should always\n   * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n   * XSS vectors.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category String\n   * @param {string} [string=''] The string to escape.\n   * @returns {string} Returns the escaped string.\n   * @example\n   *\n   * _.escape('fred, barney, & pebbles');\n   * // => 'fred, barney, &amp; pebbles'\n   */\n  function escape(string) {\n    string = toString(string);\n    return (string && reHasUnescapedHtml.test(string))\n      ? string.replace(reUnescapedHtml, escapeHtmlChar)\n      : string;\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * This method returns the first argument it receives.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Util\n   * @param {*} value Any value.\n   * @returns {*} Returns `value`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   *\n   * console.log(_.identity(object) === object);\n   * // => true\n   */\n  function identity(value) {\n    return value;\n  }\n\n  /**\n   * Creates a function that invokes `func` with the arguments of the created\n   * function. If `func` is a property name, the created function returns the\n   * property value for a given element. If `func` is an array or object, the\n   * created function returns `true` for elements that contain the equivalent\n   * source properties, otherwise it returns `false`.\n   *\n   * @static\n   * @since 4.0.0\n   * @memberOf _\n   * @category Util\n   * @param {*} [func=_.identity] The value to convert to a callback.\n   * @returns {Function} Returns the callback.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36, 'active': true },\n   *   { 'user': 'fred',   'age': 40, 'active': false }\n   * ];\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n   * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.filter(users, _.iteratee(['user', 'fred']));\n   * // => [{ 'user': 'fred', 'age': 40 }]\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.map(users, _.iteratee('user'));\n   * // => ['barney', 'fred']\n   *\n   * // Create custom iteratee shorthands.\n   * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n   *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n   *     return func.test(string);\n   *   };\n   * });\n   *\n   * _.filter(['abc', 'def'], /ef/);\n   * // => ['def']\n   */\n  var iteratee = baseIteratee;\n\n  /**\n   * Creates a function that performs a partial deep comparison between a given\n   * object and `source`, returning `true` if the given object has equivalent\n   * property values, else `false`.\n   *\n   * **Note:** The created function is equivalent to `_.isMatch` with `source`\n   * partially applied.\n   *\n   * Partial comparisons will match empty array and empty object `source`\n   * values against any array or object value, respectively. See `_.isEqual`\n   * for a list of supported value comparisons.\n   *\n   * **Note:** Multiple values can be checked by combining several matchers\n   * using `_.overSome`\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Util\n   * @param {Object} source The object of property values to match.\n   * @returns {Function} Returns the new spec function.\n   * @example\n   *\n   * var objects = [\n   *   { 'a': 1, 'b': 2, 'c': 3 },\n   *   { 'a': 4, 'b': 5, 'c': 6 }\n   * ];\n   *\n   * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n   * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n   *\n   * // Checking for several possible values\n   * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n   * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n   */\n  function matches(source) {\n    return baseMatches(assign({}, source));\n  }\n\n  /**\n   * Adds all own enumerable string keyed function properties of a source\n   * object to the destination object. If `object` is a function, then methods\n   * are added to its prototype as well.\n   *\n   * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n   * avoid conflicts caused by modifying the original.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Util\n   * @param {Function|Object} [object=lodash] The destination object.\n   * @param {Object} source The object of functions to add.\n   * @param {Object} [options={}] The options object.\n   * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n   * @returns {Function|Object} Returns `object`.\n   * @example\n   *\n   * function vowels(string) {\n   *   return _.filter(string, function(v) {\n   *     return /[aeiou]/i.test(v);\n   *   });\n   * }\n   *\n   * _.mixin({ 'vowels': vowels });\n   * _.vowels('fred');\n   * // => ['e']\n   *\n   * _('fred').vowels().value();\n   * // => ['e']\n   *\n   * _.mixin({ 'vowels': vowels }, { 'chain': false });\n   * _('fred').vowels();\n   * // => ['e']\n   */\n  function mixin(object, source, options) {\n    var props = keys(source),\n        methodNames = baseFunctions(source, props);\n\n    if (options == null &&\n        !(isObject(source) && (methodNames.length || !props.length))) {\n      options = source;\n      source = object;\n      object = this;\n      methodNames = baseFunctions(source, keys(source));\n    }\n    var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n        isFunc = isFunction(object);\n\n    baseEach(methodNames, function(methodName) {\n      var func = source[methodName];\n      object[methodName] = func;\n      if (isFunc) {\n        object.prototype[methodName] = function() {\n          var chainAll = this.__chain__;\n          if (chain || chainAll) {\n            var result = object(this.__wrapped__),\n                actions = result.__actions__ = copyArray(this.__actions__);\n\n            actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n            result.__chain__ = chainAll;\n            return result;\n          }\n          return func.apply(object, arrayPush([this.value()], arguments));\n        };\n      }\n    });\n\n    return object;\n  }\n\n  /**\n   * Reverts the `_` variable to its previous value and returns a reference to\n   * the `lodash` function.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Util\n   * @returns {Function} Returns the `lodash` function.\n   * @example\n   *\n   * var lodash = _.noConflict();\n   */\n  function noConflict() {\n    if (root._ === this) {\n      root._ = oldDash;\n    }\n    return this;\n  }\n\n  /**\n   * This method returns `undefined`.\n   *\n   * @static\n   * @memberOf _\n   * @since 2.3.0\n   * @category Util\n   * @example\n   *\n   * _.times(2, _.noop);\n   * // => [undefined, undefined]\n   */\n  function noop() {\n    // No operation performed.\n  }\n\n  /**\n   * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Util\n   * @param {string} [prefix=''] The value to prefix the ID with.\n   * @returns {string} Returns the unique ID.\n   * @example\n   *\n   * _.uniqueId('contact_');\n   * // => 'contact_104'\n   *\n   * _.uniqueId();\n   * // => '105'\n   */\n  function uniqueId(prefix) {\n    var id = ++idCounter;\n    return toString(prefix) + id;\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * Computes the maximum value of `array`. If `array` is empty or falsey,\n   * `undefined` is returned.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Math\n   * @param {Array} array The array to iterate over.\n   * @returns {*} Returns the maximum value.\n   * @example\n   *\n   * _.max([4, 2, 8, 6]);\n   * // => 8\n   *\n   * _.max([]);\n   * // => undefined\n   */\n  function max(array) {\n    return (array && array.length)\n      ? baseExtremum(array, identity, baseGt)\n      : undefined;\n  }\n\n  /**\n   * Computes the minimum value of `array`. If `array` is empty or falsey,\n   * `undefined` is returned.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Math\n   * @param {Array} array The array to iterate over.\n   * @returns {*} Returns the minimum value.\n   * @example\n   *\n   * _.min([4, 2, 8, 6]);\n   * // => 2\n   *\n   * _.min([]);\n   * // => undefined\n   */\n  function min(array) {\n    return (array && array.length)\n      ? baseExtremum(array, identity, baseLt)\n      : undefined;\n  }\n\n  /*------------------------------------------------------------------------*/\n\n  // Add methods that return wrapped values in chain sequences.\n  lodash.assignIn = assignIn;\n  lodash.before = before;\n  lodash.bind = bind;\n  lodash.chain = chain;\n  lodash.compact = compact;\n  lodash.concat = concat;\n  lodash.create = create;\n  lodash.defaults = defaults;\n  lodash.defer = defer;\n  lodash.delay = delay;\n  lodash.filter = filter;\n  lodash.flatten = flatten;\n  lodash.flattenDeep = flattenDeep;\n  lodash.iteratee = iteratee;\n  lodash.keys = keys;\n  lodash.map = map;\n  lodash.matches = matches;\n  lodash.mixin = mixin;\n  lodash.negate = negate;\n  lodash.once = once;\n  lodash.pick = pick;\n  lodash.slice = slice;\n  lodash.sortBy = sortBy;\n  lodash.tap = tap;\n  lodash.thru = thru;\n  lodash.toArray = toArray;\n  lodash.values = values;\n\n  // Add aliases.\n  lodash.extend = assignIn;\n\n  // Add methods to `lodash.prototype`.\n  mixin(lodash, lodash);\n\n  /*------------------------------------------------------------------------*/\n\n  // Add methods that return unwrapped values in chain sequences.\n  lodash.clone = clone;\n  lodash.escape = escape;\n  lodash.every = every;\n  lodash.find = find;\n  lodash.forEach = forEach;\n  lodash.has = has;\n  lodash.head = head;\n  lodash.identity = identity;\n  lodash.indexOf = indexOf;\n  lodash.isArguments = isArguments;\n  lodash.isArray = isArray;\n  lodash.isBoolean = isBoolean;\n  lodash.isDate = isDate;\n  lodash.isEmpty = isEmpty;\n  lodash.isEqual = isEqual;\n  lodash.isFinite = isFinite;\n  lodash.isFunction = isFunction;\n  lodash.isNaN = isNaN;\n  lodash.isNull = isNull;\n  lodash.isNumber = isNumber;\n  lodash.isObject = isObject;\n  lodash.isRegExp = isRegExp;\n  lodash.isString = isString;\n  lodash.isUndefined = isUndefined;\n  lodash.last = last;\n  lodash.max = max;\n  lodash.min = min;\n  lodash.noConflict = noConflict;\n  lodash.noop = noop;\n  lodash.reduce = reduce;\n  lodash.result = result;\n  lodash.size = size;\n  lodash.some = some;\n  lodash.uniqueId = uniqueId;\n\n  // Add aliases.\n  lodash.each = forEach;\n  lodash.first = head;\n\n  mixin(lodash, (function() {\n    var source = {};\n    baseForOwn(lodash, function(func, methodName) {\n      if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n        source[methodName] = func;\n      }\n    });\n    return source;\n  }()), { 'chain': false });\n\n  /*------------------------------------------------------------------------*/\n\n  /**\n   * The semantic version number.\n   *\n   * @static\n   * @memberOf _\n   * @type {string}\n   */\n  lodash.VERSION = VERSION;\n\n  // Add `Array` methods to `lodash.prototype`.\n  baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n    var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],\n        chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n        retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);\n\n    lodash.prototype[methodName] = function() {\n      var args = arguments;\n      if (retUnwrapped && !this.__chain__) {\n        var value = this.value();\n        return func.apply(isArray(value) ? value : [], args);\n      }\n      return this[chainName](function(value) {\n        return func.apply(isArray(value) ? value : [], args);\n      });\n    };\n  });\n\n  // Add chain sequence methods to the `lodash` wrapper.\n  lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n  /*--------------------------------------------------------------------------*/\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = lodash;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return lodash;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = lodash)._ = lodash;\n    // Export for CommonJS support.\n    freeExports._ = lodash;\n  }\n  else {\n    // Export to the global object.\n    root._ = lodash;\n  }\n}.call(this));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/core.min.js",
    "content": "/**\n * @license\n * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE\n * Build: `lodash core -o ./dist/lodash.core.js`\n */\n;(function(){function n(n){return H(n)&&pn.call(n,\"callee\")&&!yn.call(n,\"callee\")}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?Z:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return j(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r){if(typeof n!=\"function\")throw new TypeError(\"Expected a function\");\nreturn setTimeout(function(){n.apply(Z,r)},t)}function f(n,t){var r=true;return mn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function a(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===Z?i===i:r(i,c)))var c=i,f=o}return f}function l(n,t){var r=[];return mn(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function p(n,r,e,u,o){var i=-1,c=n.length;for(e||(e=R),o||(o=[]);++i<c;){var f=n[i];0<r&&e(f)?1<r?p(f,r-1,e,u,o):t(o,f):u||(o[o.length]=f)}return o}function s(n,t){return n&&On(n,t,Dn);\n}function h(n,t){return l(t,function(t){return U(n[t])})}function v(n,t){return n>t}function b(n,t,r,e,u){return n===t||(null==n||null==t||!H(n)&&!H(t)?n!==n&&t!==t:y(n,t,r,e,b,u))}function y(n,t,r,e,u,o){var i=Nn(n),c=Nn(t),f=i?\"[object Array]\":hn.call(n),a=c?\"[object Array]\":hn.call(t),f=\"[object Arguments]\"==f?\"[object Object]\":f,a=\"[object Arguments]\"==a?\"[object Object]\":a,l=\"[object Object]\"==f,c=\"[object Object]\"==a,a=f==a;o||(o=[]);var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){\nreturn n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=T(n,t,r,e,u,o);else n:{switch(f){case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":r=J(+n,+t);break n;case\"[object Error]\":r=n.name==t.name&&n.message==t.message;break n;case\"[object RegExp]\":case\"[object String]\":r=n==t+\"\";break n}r=false}return o.pop(),r}return 1&r||(i=l&&pn.call(n,\"__wrapped__\"),f=c&&pn.call(t,\"__wrapped__\"),!i&&!f)?!!a&&(r=B(n,t,r,e,u,o),o.pop(),r):(i=i?n.value():n,f=f?t.value():t,\nr=u(i,f,r,e,o),o.pop(),r)}function g(n){return typeof n==\"function\"?n:null==n?X:(typeof n==\"object\"?d:r)(n)}function _(n,t){return n<t}function j(n,t){var r=-1,e=M(n)?Array(n.length):[];return mn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function d(n){var t=_n(n);return function(r){var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];if(!(u in r&&b(n[u],r[u],3)))return false}return true}}function m(n,t){return n=Object(n),C(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function O(n){return xn(I(n,void 0,X),n+\"\");\n}function x(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function A(n){return x(n,0,n.length)}function E(n,t){var r;return mn(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function w(n,r){return C(r,function(n,r){return r.func.apply(r.thisArg,t([n],r.args))},n)}function k(n,t,r){var e=!r;r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],c=Z;if(c===Z&&(c=n[i]),e)r[i]=c;else{var f=r,a=f[i];pn.call(f,i)&&J(a,c)&&(c!==Z||i in f)||(f[i]=c);\n}}return r}function N(n){return O(function(t,r){var e=-1,u=r.length,o=1<u?r[u-1]:Z,o=3<n.length&&typeof o==\"function\"?(u--,o):Z;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function F(n){return function(){var t=arguments,r=dn(n.prototype),t=n.apply(r,t);return V(t)?t:r}}function S(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==on&&this instanceof e?u:n;++c<f;)a[c]=r[c];for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!=\"function\")throw new TypeError(\"Expected a function\");\nvar u=F(n);return e}function T(n,t,r,e,u,o){var i=n.length,c=t.length;if(i!=c&&!(1&r&&c>i))return false;var c=o.get(n),f=o.get(t);if(c&&f)return c==t&&f==n;for(var c=-1,f=true,a=2&r?[]:Z;++c<i;){var l=n[c],p=t[c];if(void 0!==Z){f=false;break}if(a){if(!E(t,function(n,t){if(!P(a,t)&&(l===n||u(l,n,r,e,o)))return a.push(t)})){f=false;break}}else if(l!==p&&!u(l,p,r,e,o)){f=false;break}}return f}function B(n,t,r,e,u,o){var i=1&r,c=Dn(n),f=c.length,a=Dn(t).length;if(f!=a&&!i)return false;for(a=f;a--;){var l=c[a];if(!(i?l in t:pn.call(t,l)))return false;\n}var p=o.get(n),l=o.get(t);if(p&&l)return p==t&&l==n;for(p=true;++a<f;){var l=c[a],s=n[l],h=t[l];if(void 0!==Z||s!==h&&!u(s,h,r,e,o)){p=false;break}i||(i=\"constructor\"==l)}return p&&!i&&(r=n.constructor,e=t.constructor,r!=e&&\"constructor\"in n&&\"constructor\"in t&&!(typeof r==\"function\"&&r instanceof r&&typeof e==\"function\"&&e instanceof e)&&(p=false)),p}function R(t){return Nn(t)||n(t)}function D(n){var t=[];if(null!=n)for(var r in Object(n))t.push(r);return t}function I(n,t,r){return t=jn(t===Z?n.length-1:t,0),\nfunction(){for(var e=arguments,u=-1,o=jn(e.length-t,0),i=Array(o);++u<o;)i[u]=e[t+u];for(u=-1,o=Array(t+1);++u<t;)o[u]=e[u];return o[t]=r(i),n.apply(this,o)}}function $(n){return(null==n?0:n.length)?p(n,1):[]}function q(n){return n&&n.length?n[0]:Z}function P(n,t,r){var e=null==n?0:n.length;r=typeof r==\"number\"?0>r?jn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1}function z(n,t){return mn(n,g(t))}function C(n,t,r){return e(n,g(t),r,3>arguments.length,mn);\n}function G(n,t){var r;if(typeof t!=\"function\")throw new TypeError(\"Expected a function\");return n=Fn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function J(n,t){return n===t||n!==n&&t!==t}function M(n){var t;return(t=null!=n)&&(t=n.length,t=typeof t==\"number\"&&-1<t&&0==t%1&&9007199254740991>=t),t&&!U(n)}function U(n){return!!V(n)&&(n=hn.call(n),\"[object Function]\"==n||\"[object GeneratorFunction]\"==n||\"[object AsyncFunction]\"==n||\"[object Proxy]\"==n)}function V(n){var t=typeof n;\nreturn null!=n&&(\"object\"==t||\"function\"==t)}function H(n){return null!=n&&typeof n==\"object\"}function K(n){return typeof n==\"number\"||H(n)&&\"[object Number]\"==hn.call(n)}function L(n){return typeof n==\"string\"||!Nn(n)&&H(n)&&\"[object String]\"==hn.call(n)}function Q(n){return typeof n==\"string\"?n:null==n?\"\":n+\"\"}function W(n){return null==n?[]:u(n,Dn(n))}function X(n){return n}function Y(n,r,e){var u=Dn(r),o=h(r,u);null!=e||V(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=h(r,Dn(r)));var i=!(V(e)&&\"chain\"in e&&!e.chain),c=U(n);\nreturn mn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=A(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var Z,nn=1/0,tn=/[&<>\"']/g,rn=RegExp(tn.source),en=/^(?:0|[1-9]\\d*)$/,un=typeof self==\"object\"&&self&&self.Object===Object&&self,on=typeof global==\"object\"&&global&&global.Object===Object&&global||un||Function(\"return this\")(),cn=(un=typeof exports==\"object\"&&exports&&!exports.nodeType&&exports)&&typeof module==\"object\"&&module&&!module.nodeType&&module,fn=function(n){\nreturn function(t){return null==n?Z:n[t]}}({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}),an=Array.prototype,ln=Object.prototype,pn=ln.hasOwnProperty,sn=0,hn=ln.toString,vn=on._,bn=Object.create,yn=ln.propertyIsEnumerable,gn=on.isFinite,_n=function(n,t){return function(r){return n(t(r))}}(Object.keys,Object),jn=Math.max,dn=function(){function n(){}return function(t){return V(t)?bn?bn(t):(n.prototype=t,t=new n,n.prototype=Z,t):{}}}();i.prototype=dn(o.prototype),i.prototype.constructor=i;\nvar mn=function(n,t){return function(r,e){if(null==r)return r;if(!M(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(s),On=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}(),xn=X,An=function(n){return function(t,r,e){var u=Object(t);if(!M(t)){var o=g(r);t=Dn(t),r=function(n){return o(u[n],n,u)}}return r=n(t,r,e),-1<r?u[o?t[r]:r]:Z}}(function(n,t,r){var e=null==n?0:n.length;\nif(!e)return-1;r=null==r?0:Fn(r),0>r&&(r=jn(e+r,0));n:{for(t=g(t),e=n.length,r+=-1;++r<e;)if(t(n[r],r,n)){n=r;break n}n=-1}return n}),En=O(function(n,t,r){return S(n,t,r)}),wn=O(function(n,t){return c(n,1,t)}),kn=O(function(n,t,r){return c(n,Sn(t)||0,r)}),Nn=Array.isArray,Fn=Number,Sn=Number,Tn=N(function(n,t){k(t,_n(t),n)}),Bn=N(function(n,t){k(t,D(t),n)}),Rn=O(function(n,t){n=Object(n);var r,e=-1,u=t.length,o=2<u?t[2]:Z;if(r=o){r=t[0];var i=t[1];if(V(o)){var c=typeof i;if(\"number\"==c){if(c=M(o))var c=o.length,f=typeof i,c=null==c?9007199254740991:c,c=!!c&&(\"number\"==f||\"symbol\"!=f&&en.test(i))&&-1<i&&0==i%1&&i<c;\n}else c=\"string\"==c&&i in o;r=!!c&&J(o[i],r)}else r=false}for(r&&(u=1);++e<u;)for(o=t[e],r=In(o),i=-1,c=r.length;++i<c;){var f=r[i],a=n[f];(a===Z||J(a,ln[f])&&!pn.call(n,f))&&(n[f]=o[f])}return n}),Dn=_n,In=D,$n=function(n){return xn(I(n,Z,$),n+\"\")}(function(n,t){return null==n?{}:m(n,t)});o.assignIn=Bn,o.before=G,o.bind=En,o.chain=function(n){return n=o(n),n.__chain__=true,n},o.compact=function(n){return l(n,Boolean)},o.concat=function(){var n=arguments.length;if(!n)return[];for(var r=Array(n-1),e=arguments[0];n--;)r[n-1]=arguments[n];\nreturn t(Nn(e)?A(e):[e],p(r,1))},o.create=function(n,t){var r=dn(n);return null==t?r:Tn(r,t)},o.defaults=Rn,o.defer=wn,o.delay=kn,o.filter=function(n,t){return l(n,g(t))},o.flatten=$,o.flattenDeep=function(n){return(null==n?0:n.length)?p(n,nn):[]},o.iteratee=g,o.keys=Dn,o.map=function(n,t){return j(n,g(t))},o.matches=function(n){return d(Tn({},n))},o.mixin=Y,o.negate=function(n){if(typeof n!=\"function\")throw new TypeError(\"Expected a function\");return function(){return!n.apply(this,arguments)}},o.once=function(n){\nreturn G(2,n)},o.pick=$n,o.slice=function(n,t,r){var e=null==n?0:n.length;return r=r===Z?e:+r,e?x(n,null==t?0:+t,r):[]},o.sortBy=function(n,t){var e=0;return t=g(t),j(j(n,function(n,r,u){return{value:n,index:e++,criteria:t(n,r,u)}}).sort(function(n,t){var r;n:{r=n.criteria;var e=t.criteria;if(r!==e){var u=r!==Z,o=null===r,i=r===r,c=e!==Z,f=null===e,a=e===e;if(!f&&r>e||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&r<e||f&&u&&i||!c&&i||!a){r=-1;break n}}r=0}return r||n.index-t.index}),r(\"value\"))},o.tap=function(n,t){\nreturn t(n),n},o.thru=function(n,t){return t(n)},o.toArray=function(n){return M(n)?n.length?A(n):[]:W(n)},o.values=W,o.extend=Bn,Y(o,o),o.clone=function(n){return V(n)?Nn(n)?A(n):k(n,_n(n)):n},o.escape=function(n){return(n=Q(n))&&rn.test(n)?n.replace(tn,fn):n},o.every=function(n,t,r){return t=r?Z:t,f(n,g(t))},o.find=An,o.forEach=z,o.has=function(n,t){return null!=n&&pn.call(n,t)},o.head=q,o.identity=X,o.indexOf=P,o.isArguments=n,o.isArray=Nn,o.isBoolean=function(n){return true===n||false===n||H(n)&&\"[object Boolean]\"==hn.call(n);\n},o.isDate=function(n){return H(n)&&\"[object Date]\"==hn.call(n)},o.isEmpty=function(t){return M(t)&&(Nn(t)||L(t)||U(t.splice)||n(t))?!t.length:!_n(t).length},o.isEqual=function(n,t){return b(n,t)},o.isFinite=function(n){return typeof n==\"number\"&&gn(n)},o.isFunction=U,o.isNaN=function(n){return K(n)&&n!=+n},o.isNull=function(n){return null===n},o.isNumber=K,o.isObject=V,o.isRegExp=function(n){return H(n)&&\"[object RegExp]\"==hn.call(n)},o.isString=L,o.isUndefined=function(n){return n===Z},o.last=function(n){\nvar t=null==n?0:n.length;return t?n[t-1]:Z},o.max=function(n){return n&&n.length?a(n,X,v):Z},o.min=function(n){return n&&n.length?a(n,X,_):Z},o.noConflict=function(){return on._===this&&(on._=vn),this},o.noop=function(){},o.reduce=C,o.result=function(n,t,r){return t=null==n?Z:n[t],t===Z&&(t=r),U(t)?t.call(n):t},o.size=function(n){return null==n?0:(n=M(n)?n:_n(n),n.length)},o.some=function(n,t,r){return t=r?Z:t,E(n,g(t))},o.uniqueId=function(n){var t=++sn;return Q(n)+t},o.each=z,o.first=q,Y(o,function(){\nvar n={};return s(o,function(t,r){pn.call(o.prototype,r)||(n[r]=t)}),n}(),{chain:false}),o.VERSION=\"4.17.21\",mn(\"pop join replace reverse split push shift sort splice unshift\".split(\" \"),function(n){var t=(/^(?:replace|split)$/.test(n)?String.prototype:an)[n],r=/^(?:push|sort|unshift)$/.test(n)?\"tap\":\"thru\",e=/^(?:pop|join|replace|shift)$/.test(n);o.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Nn(u)?u:[],n)}return this[r](function(r){return t.apply(Nn(r)?r:[],n);\n})}}),o.prototype.toJSON=o.prototype.valueOf=o.prototype.value=function(){return w(this.__wrapped__,this.__actions__)},typeof define==\"function\"&&typeof define.amd==\"object\"&&define.amd?(on._=o, define(function(){return o})):cn?((cn.exports=o)._=o,un._=o):on._=o}).call(this);"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/countBy.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    createAggregator = require('./_createAggregator');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\nvar countBy = createAggregator(function(result, value, key) {\n  if (hasOwnProperty.call(result, key)) {\n    ++result[key];\n  } else {\n    baseAssignValue(result, key, 1);\n  }\n});\n\nmodule.exports = countBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/create.js",
    "content": "var baseAssign = require('./_baseAssign'),\n    baseCreate = require('./_baseCreate');\n\n/**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n *   this.x = 0;\n *   this.y = 0;\n * }\n *\n * function Circle() {\n *   Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n *   'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\nfunction create(prototype, properties) {\n  var result = baseCreate(prototype);\n  return properties == null ? result : baseAssign(result, properties);\n}\n\nmodule.exports = create;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/curry.js",
    "content": "var createWrap = require('./_createWrap');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8;\n\n/**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n *   return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\nfunction curry(func, arity, guard) {\n  arity = guard ? undefined : arity;\n  var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n  result.placeholder = curry.placeholder;\n  return result;\n}\n\n// Assign default placeholders.\ncurry.placeholder = {};\n\nmodule.exports = curry;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/curryRight.js",
    "content": "var createWrap = require('./_createWrap');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_RIGHT_FLAG = 16;\n\n/**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n *   return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\nfunction curryRight(func, arity, guard) {\n  arity = guard ? undefined : arity;\n  var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n  result.placeholder = curryRight.placeholder;\n  return result;\n}\n\n// Assign default placeholders.\ncurryRight.placeholder = {};\n\nmodule.exports = curryRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/date.js",
    "content": "module.exports = {\n  'now': require('./now')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/debounce.js",
    "content": "var isObject = require('./isObject'),\n    now = require('./now'),\n    toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nmodule.exports = debounce;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/deburr.js",
    "content": "var deburrLetter = require('./_deburrLetter'),\n    toString = require('./toString');\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n  string = toString(string);\n  return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nmodule.exports = deburr;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/defaultTo.js",
    "content": "/**\n * Checks `value` to determine whether a default value should be returned in\n * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n * or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Util\n * @param {*} value The value to check.\n * @param {*} defaultValue The default value.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * _.defaultTo(1, 10);\n * // => 1\n *\n * _.defaultTo(undefined, 10);\n * // => 10\n */\nfunction defaultTo(value, defaultValue) {\n  return (value == null || value !== value) ? defaultValue : value;\n}\n\nmodule.exports = defaultTo;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/defaults.js",
    "content": "var baseRest = require('./_baseRest'),\n    eq = require('./eq'),\n    isIterateeCall = require('./_isIterateeCall'),\n    keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n  object = Object(object);\n\n  var index = -1;\n  var length = sources.length;\n  var guard = length > 2 ? sources[2] : undefined;\n\n  if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n    length = 1;\n  }\n\n  while (++index < length) {\n    var source = sources[index];\n    var props = keysIn(source);\n    var propsIndex = -1;\n    var propsLength = props.length;\n\n    while (++propsIndex < propsLength) {\n      var key = props[propsIndex];\n      var value = object[key];\n\n      if (value === undefined ||\n          (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        object[key] = source[key];\n      }\n    }\n  }\n\n  return object;\n});\n\nmodule.exports = defaults;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/defaultsDeep.js",
    "content": "var apply = require('./_apply'),\n    baseRest = require('./_baseRest'),\n    customDefaultsMerge = require('./_customDefaultsMerge'),\n    mergeWith = require('./mergeWith');\n\n/**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\nvar defaultsDeep = baseRest(function(args) {\n  args.push(undefined, customDefaultsMerge);\n  return apply(mergeWith, undefined, args);\n});\n\nmodule.exports = defaultsDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/defer.js",
    "content": "var baseDelay = require('./_baseDelay'),\n    baseRest = require('./_baseRest');\n\n/**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n *   console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\nvar defer = baseRest(function(func, args) {\n  return baseDelay(func, 1, args);\n});\n\nmodule.exports = defer;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/delay.js",
    "content": "var baseDelay = require('./_baseDelay'),\n    baseRest = require('./_baseRest'),\n    toNumber = require('./toNumber');\n\n/**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n *   console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\nvar delay = baseRest(function(func, wait, args) {\n  return baseDelay(func, toNumber(wait) || 0, args);\n});\n\nmodule.exports = delay;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/difference.js",
    "content": "var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n    : [];\n});\n\nmodule.exports = difference;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/differenceBy.js",
    "content": "var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\nvar differenceBy = baseRest(function(array, values) {\n  var iteratee = last(values);\n  if (isArrayLikeObject(iteratee)) {\n    iteratee = undefined;\n  }\n  return isArrayLikeObject(array)\n    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2))\n    : [];\n});\n\nmodule.exports = differenceBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/differenceWith.js",
    "content": "var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\nvar differenceWith = baseRest(function(array, values) {\n  var comparator = last(values);\n  if (isArrayLikeObject(comparator)) {\n    comparator = undefined;\n  }\n  return isArrayLikeObject(array)\n    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n    : [];\n});\n\nmodule.exports = differenceWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/divide.js",
    "content": "var createMathOperation = require('./_createMathOperation');\n\n/**\n * Divide two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} dividend The first number in a division.\n * @param {number} divisor The second number in a division.\n * @returns {number} Returns the quotient.\n * @example\n *\n * _.divide(6, 4);\n * // => 1.5\n */\nvar divide = createMathOperation(function(dividend, divisor) {\n  return dividend / divisor;\n}, 1);\n\nmodule.exports = divide;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/drop.js",
    "content": "var baseSlice = require('./_baseSlice'),\n    toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction drop(array, n, guard) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return [];\n  }\n  n = (guard || n === undefined) ? 1 : toInteger(n);\n  return baseSlice(array, n < 0 ? 0 : n, length);\n}\n\nmodule.exports = drop;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/dropRight.js",
    "content": "var baseSlice = require('./_baseSlice'),\n    toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return [];\n  }\n  n = (guard || n === undefined) ? 1 : toInteger(n);\n  n = length - n;\n  return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nmodule.exports = dropRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/dropRightWhile.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseWhile = require('./_baseWhile');\n\n/**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': true },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\nfunction dropRightWhile(array, predicate) {\n  return (array && array.length)\n    ? baseWhile(array, baseIteratee(predicate, 3), true, true)\n    : [];\n}\n\nmodule.exports = dropRightWhile;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/dropWhile.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseWhile = require('./_baseWhile');\n\n/**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': false },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\nfunction dropWhile(array, predicate) {\n  return (array && array.length)\n    ? baseWhile(array, baseIteratee(predicate, 3), true)\n    : [];\n}\n\nmodule.exports = dropWhile;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/each.js",
    "content": "module.exports = require('./forEach');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/eachRight.js",
    "content": "module.exports = require('./forEachRight');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/endsWith.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    baseToString = require('./_baseToString'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n *  else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\nfunction endsWith(string, target, position) {\n  string = toString(string);\n  target = baseToString(target);\n\n  var length = string.length;\n  position = position === undefined\n    ? length\n    : baseClamp(toInteger(position), 0, length);\n\n  var end = position;\n  position -= target.length;\n  return position >= 0 && string.slice(position, end) == target;\n}\n\nmodule.exports = endsWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/entries.js",
    "content": "module.exports = require('./toPairs');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/entriesIn.js",
    "content": "module.exports = require('./toPairsIn');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/eq.js",
    "content": "/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/escape.js",
    "content": "var escapeHtmlChar = require('./_escapeHtmlChar'),\n    toString = require('./toString');\n\n/** Used to match HTML entities and HTML characters. */\nvar reUnescapedHtml = /[&<>\"']/g,\n    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, &amp; pebbles'\n */\nfunction escape(string) {\n  string = toString(string);\n  return (string && reHasUnescapedHtml.test(string))\n    ? string.replace(reUnescapedHtml, escapeHtmlChar)\n    : string;\n}\n\nmodule.exports = escape;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/escapeRegExp.js",
    "content": "var toString = require('./toString');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n    reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\nfunction escapeRegExp(string) {\n  string = toString(string);\n  return (string && reHasRegExpChar.test(string))\n    ? string.replace(reRegExpChar, '\\\\$&')\n    : string;\n}\n\nmodule.exports = escapeRegExp;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/every.js",
    "content": "var arrayEvery = require('./_arrayEvery'),\n    baseEvery = require('./_baseEvery'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n *  else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n *   { 'user': 'barney', 'age': 36, 'active': false },\n *   { 'user': 'fred',   'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n  var func = isArray(collection) ? arrayEvery : baseEvery;\n  if (guard && isIterateeCall(collection, predicate, guard)) {\n    predicate = undefined;\n  }\n  return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/extend.js",
    "content": "module.exports = require('./assignIn');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/extendWith.js",
    "content": "module.exports = require('./assignInWith');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fill.js",
    "content": "var baseFill = require('./_baseFill'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\nfunction fill(array, value, start, end) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return [];\n  }\n  if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n    start = 0;\n    end = length;\n  }\n  return baseFill(array, value, start, end);\n}\n\nmodule.exports = fill;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/filter.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    baseFilter = require('./_baseFilter'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n *   { 'user': 'barney', 'age': 36, 'active': true },\n *   { 'user': 'fred',   'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n  var func = isArray(collection) ? arrayFilter : baseFilter;\n  return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/find.js",
    "content": "var createFind = require('./_createFind'),\n    findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'age': 36, 'active': true },\n *   { 'user': 'fred',    'age': 40, 'active': false },\n *   { 'user': 'pebbles', 'age': 1,  'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/findIndex.js",
    "content": "var baseFindIndex = require('./_baseFindIndex'),\n    baseIteratee = require('./_baseIteratee'),\n    toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': false },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = fromIndex == null ? 0 : toInteger(fromIndex);\n  if (index < 0) {\n    index = nativeMax(length + index, 0);\n  }\n  return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/findKey.js",
    "content": "var baseFindKey = require('./_baseFindKey'),\n    baseForOwn = require('./_baseForOwn'),\n    baseIteratee = require('./_baseIteratee');\n\n/**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n *  else `undefined`.\n * @example\n *\n * var users = {\n *   'barney':  { 'age': 36, 'active': true },\n *   'fred':    { 'age': 40, 'active': false },\n *   'pebbles': { 'age': 1,  'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\nfunction findKey(object, predicate) {\n  return baseFindKey(object, baseIteratee(predicate, 3), baseForOwn);\n}\n\nmodule.exports = findKey;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/findLast.js",
    "content": "var createFind = require('./_createFind'),\n    findLastIndex = require('./findLastIndex');\n\n/**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n *   return n % 2 == 1;\n * });\n * // => 3\n */\nvar findLast = createFind(findLastIndex);\n\nmodule.exports = findLast;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/findLastIndex.js",
    "content": "var baseFindIndex = require('./_baseFindIndex'),\n    baseIteratee = require('./_baseIteratee'),\n    toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': true },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\nfunction findLastIndex(array, predicate, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = length - 1;\n  if (fromIndex !== undefined) {\n    index = toInteger(fromIndex);\n    index = fromIndex < 0\n      ? nativeMax(length + index, 0)\n      : nativeMin(index, length - 1);\n  }\n  return baseFindIndex(array, baseIteratee(predicate, 3), index, true);\n}\n\nmodule.exports = findLastIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/findLastKey.js",
    "content": "var baseFindKey = require('./_baseFindKey'),\n    baseForOwnRight = require('./_baseForOwnRight'),\n    baseIteratee = require('./_baseIteratee');\n\n/**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n *  else `undefined`.\n * @example\n *\n * var users = {\n *   'barney':  { 'age': 36, 'active': true },\n *   'fred':    { 'age': 40, 'active': false },\n *   'pebbles': { 'age': 1,  'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\nfunction findLastKey(object, predicate) {\n  return baseFindKey(object, baseIteratee(predicate, 3), baseForOwnRight);\n}\n\nmodule.exports = findLastKey;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/first.js",
    "content": "module.exports = require('./head');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flake.lock",
    "content": "{\n  \"nodes\": {\n    \"nixpkgs\": {\n      \"locked\": {\n        \"lastModified\": 1613582597,\n        \"narHash\": \"sha256-6LvipIvFuhyorHpUqK3HjySC5Y6gshXHFBhU9EJ4DoM=\",\n        \"path\": \"/nix/store/srvplqq673sqd9vyfhyc5w1p88y1gfm4-source\",\n        \"rev\": \"6b1057b452c55bb3b463f0d7055bc4ec3fd1f381\",\n        \"type\": \"path\"\n      },\n      \"original\": {\n        \"id\": \"nixpkgs\",\n        \"type\": \"indirect\"\n      }\n    },\n    \"root\": {\n      \"inputs\": {\n        \"nixpkgs\": \"nixpkgs\",\n        \"utils\": \"utils\"\n      }\n    },\n    \"utils\": {\n      \"locked\": {\n        \"lastModified\": 1610051610,\n        \"narHash\": \"sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=\",\n        \"owner\": \"numtide\",\n        \"repo\": \"flake-utils\",\n        \"rev\": \"3982c9903e93927c2164caa727cd3f6a0e6d14cc\",\n        \"type\": \"github\"\n      },\n      \"original\": {\n        \"owner\": \"numtide\",\n        \"repo\": \"flake-utils\",\n        \"type\": \"github\"\n      }\n    }\n  },\n  \"root\": \"root\",\n  \"version\": 7\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flake.nix",
    "content": "{\n  inputs = {\n    utils.url = \"github:numtide/flake-utils\";\n  };\n\n  outputs = { self, nixpkgs, utils }:\n    utils.lib.eachDefaultSystem (system:\n      let\n        pkgs = nixpkgs.legacyPackages.\"${system}\";\n      in rec {\n       devShell = pkgs.mkShell {\n          nativeBuildInputs = with pkgs; [\n            yarn\n            nodejs-14_x\n            nodePackages.typescript-language-server\n            nodePackages.eslint\n          ];\n        };\n      });\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flatMap.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n *   return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n  return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flatMapDeep.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    map = require('./map');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n *   return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMapDeep(collection, iteratee) {\n  return baseFlatten(map(collection, iteratee), INFINITY);\n}\n\nmodule.exports = flatMapDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flatMapDepth.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    map = require('./map'),\n    toInteger = require('./toInteger');\n\n/**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n *   return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\nfunction flatMapDepth(collection, iteratee, depth) {\n  depth = depth === undefined ? 1 : toInteger(depth);\n  return baseFlatten(map(collection, iteratee), depth);\n}\n\nmodule.exports = flatMapDepth;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flatten.js",
    "content": "var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flattenDeep.js",
    "content": "var baseFlatten = require('./_baseFlatten');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\nfunction flattenDeep(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, INFINITY) : [];\n}\n\nmodule.exports = flattenDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flattenDepth.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    toInteger = require('./toInteger');\n\n/**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\nfunction flattenDepth(array, depth) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return [];\n  }\n  depth = depth === undefined ? 1 : toInteger(depth);\n  return baseFlatten(array, depth);\n}\n\nmodule.exports = flattenDepth;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flip.js",
    "content": "var createWrap = require('./_createWrap');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_FLIP_FLAG = 512;\n\n/**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n *   return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\nfunction flip(func) {\n  return createWrap(func, WRAP_FLIP_FLAG);\n}\n\nmodule.exports = flip;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/floor.js",
    "content": "var createRound = require('./_createRound');\n\n/**\n * Computes `number` rounded down to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round down.\n * @param {number} [precision=0] The precision to round down to.\n * @returns {number} Returns the rounded down number.\n * @example\n *\n * _.floor(4.006);\n * // => 4\n *\n * _.floor(0.046, 2);\n * // => 0.04\n *\n * _.floor(4060, -2);\n * // => 4000\n */\nvar floor = createRound('floor');\n\nmodule.exports = floor;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flow.js",
    "content": "var createFlow = require('./_createFlow');\n\n/**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flow = createFlow();\n\nmodule.exports = flow;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/flowRight.js",
    "content": "var createFlow = require('./_createFlow');\n\n/**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flowRight = createFlow(true);\n\nmodule.exports = flowRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/forEach.js",
    "content": "var arrayEach = require('./_arrayEach'),\n    baseEach = require('./_baseEach'),\n    castFunction = require('./_castFunction'),\n    isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n *   console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n  var func = isArray(collection) ? arrayEach : baseEach;\n  return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/forEachRight.js",
    "content": "var arrayEachRight = require('./_arrayEachRight'),\n    baseEachRight = require('./_baseEachRight'),\n    castFunction = require('./_castFunction'),\n    isArray = require('./isArray');\n\n/**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n *   console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\nfunction forEachRight(collection, iteratee) {\n  var func = isArray(collection) ? arrayEachRight : baseEachRight;\n  return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEachRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/forIn.js",
    "content": "var baseFor = require('./_baseFor'),\n    castFunction = require('./_castFunction'),\n    keysIn = require('./keysIn');\n\n/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\nfunction forIn(object, iteratee) {\n  return object == null\n    ? object\n    : baseFor(object, castFunction(iteratee), keysIn);\n}\n\nmodule.exports = forIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/forInRight.js",
    "content": "var baseForRight = require('./_baseForRight'),\n    castFunction = require('./_castFunction'),\n    keysIn = require('./keysIn');\n\n/**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\nfunction forInRight(object, iteratee) {\n  return object == null\n    ? object\n    : baseForRight(object, castFunction(iteratee), keysIn);\n}\n\nmodule.exports = forInRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/forOwn.js",
    "content": "var baseForOwn = require('./_baseForOwn'),\n    castFunction = require('./_castFunction');\n\n/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forOwn(object, iteratee) {\n  return object && baseForOwn(object, castFunction(iteratee));\n}\n\nmodule.exports = forOwn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/forOwnRight.js",
    "content": "var baseForOwnRight = require('./_baseForOwnRight'),\n    castFunction = require('./_castFunction');\n\n/**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\nfunction forOwnRight(object, iteratee) {\n  return object && baseForOwnRight(object, castFunction(iteratee));\n}\n\nmodule.exports = forOwnRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/F.js",
    "content": "module.exports = require('./stubFalse');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/T.js",
    "content": "module.exports = require('./stubTrue');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/__.js",
    "content": "module.exports = require('./placeholder');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/_baseConvert.js",
    "content": "var mapping = require('./_mapping'),\n    fallbackHolder = require('./placeholder');\n\n/** Built-in value reference. */\nvar push = Array.prototype.push;\n\n/**\n * Creates a function, with an arity of `n`, that invokes `func` with the\n * arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} n The arity of the new function.\n * @returns {Function} Returns the new function.\n */\nfunction baseArity(func, n) {\n  return n == 2\n    ? function(a, b) { return func.apply(undefined, arguments); }\n    : function(a) { return func.apply(undefined, arguments); };\n}\n\n/**\n * Creates a function that invokes `func`, with up to `n` arguments, ignoring\n * any additional arguments.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @param {number} n The arity cap.\n * @returns {Function} Returns the new function.\n */\nfunction baseAry(func, n) {\n  return n == 2\n    ? function(a, b) { return func(a, b); }\n    : function(a) { return func(a); };\n}\n\n/**\n * Creates a clone of `array`.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the cloned array.\n */\nfunction cloneArray(array) {\n  var length = array ? array.length : 0,\n      result = Array(length);\n\n  while (length--) {\n    result[length] = array[length];\n  }\n  return result;\n}\n\n/**\n * Creates a function that clones a given object using the assignment `func`.\n *\n * @private\n * @param {Function} func The assignment function.\n * @returns {Function} Returns the new cloner function.\n */\nfunction createCloner(func) {\n  return function(object) {\n    return func({}, object);\n  };\n}\n\n/**\n * A specialized version of `_.spread` which flattens the spread array into\n * the arguments of the invoked `func`.\n *\n * @private\n * @param {Function} func The function to spread arguments over.\n * @param {number} start The start position of the spread.\n * @returns {Function} Returns the new function.\n */\nfunction flatSpread(func, start) {\n  return function() {\n    var length = arguments.length,\n        lastIndex = length - 1,\n        args = Array(length);\n\n    while (length--) {\n      args[length] = arguments[length];\n    }\n    var array = args[start],\n        otherArgs = args.slice(0, start);\n\n    if (array) {\n      push.apply(otherArgs, array);\n    }\n    if (start != lastIndex) {\n      push.apply(otherArgs, args.slice(start + 1));\n    }\n    return func.apply(this, otherArgs);\n  };\n}\n\n/**\n * Creates a function that wraps `func` and uses `cloner` to clone the first\n * argument it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} cloner The function to clone arguments.\n * @returns {Function} Returns the new immutable function.\n */\nfunction wrapImmutable(func, cloner) {\n  return function() {\n    var length = arguments.length;\n    if (!length) {\n      return;\n    }\n    var args = Array(length);\n    while (length--) {\n      args[length] = arguments[length];\n    }\n    var result = args[0] = cloner.apply(undefined, args);\n    func.apply(undefined, args);\n    return result;\n  };\n}\n\n/**\n * The base implementation of `convert` which accepts a `util` object of methods\n * required to perform conversions.\n *\n * @param {Object} util The util object.\n * @param {string} name The name of the function to convert.\n * @param {Function} func The function to convert.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.cap=true] Specify capping iteratee arguments.\n * @param {boolean} [options.curry=true] Specify currying.\n * @param {boolean} [options.fixed=true] Specify fixed arity.\n * @param {boolean} [options.immutable=true] Specify immutable operations.\n * @param {boolean} [options.rearg=true] Specify rearranging arguments.\n * @returns {Function|Object} Returns the converted function or object.\n */\nfunction baseConvert(util, name, func, options) {\n  var isLib = typeof name == 'function',\n      isObj = name === Object(name);\n\n  if (isObj) {\n    options = func;\n    func = name;\n    name = undefined;\n  }\n  if (func == null) {\n    throw new TypeError;\n  }\n  options || (options = {});\n\n  var config = {\n    'cap': 'cap' in options ? options.cap : true,\n    'curry': 'curry' in options ? options.curry : true,\n    'fixed': 'fixed' in options ? options.fixed : true,\n    'immutable': 'immutable' in options ? options.immutable : true,\n    'rearg': 'rearg' in options ? options.rearg : true\n  };\n\n  var defaultHolder = isLib ? func : fallbackHolder,\n      forceCurry = ('curry' in options) && options.curry,\n      forceFixed = ('fixed' in options) && options.fixed,\n      forceRearg = ('rearg' in options) && options.rearg,\n      pristine = isLib ? func.runInContext() : undefined;\n\n  var helpers = isLib ? func : {\n    'ary': util.ary,\n    'assign': util.assign,\n    'clone': util.clone,\n    'curry': util.curry,\n    'forEach': util.forEach,\n    'isArray': util.isArray,\n    'isError': util.isError,\n    'isFunction': util.isFunction,\n    'isWeakMap': util.isWeakMap,\n    'iteratee': util.iteratee,\n    'keys': util.keys,\n    'rearg': util.rearg,\n    'toInteger': util.toInteger,\n    'toPath': util.toPath\n  };\n\n  var ary = helpers.ary,\n      assign = helpers.assign,\n      clone = helpers.clone,\n      curry = helpers.curry,\n      each = helpers.forEach,\n      isArray = helpers.isArray,\n      isError = helpers.isError,\n      isFunction = helpers.isFunction,\n      isWeakMap = helpers.isWeakMap,\n      keys = helpers.keys,\n      rearg = helpers.rearg,\n      toInteger = helpers.toInteger,\n      toPath = helpers.toPath;\n\n  var aryMethodKeys = keys(mapping.aryMethod);\n\n  var wrappers = {\n    'castArray': function(castArray) {\n      return function() {\n        var value = arguments[0];\n        return isArray(value)\n          ? castArray(cloneArray(value))\n          : castArray.apply(undefined, arguments);\n      };\n    },\n    'iteratee': function(iteratee) {\n      return function() {\n        var func = arguments[0],\n            arity = arguments[1],\n            result = iteratee(func, arity),\n            length = result.length;\n\n        if (config.cap && typeof arity == 'number') {\n          arity = arity > 2 ? (arity - 2) : 1;\n          return (length && length <= arity) ? result : baseAry(result, arity);\n        }\n        return result;\n      };\n    },\n    'mixin': function(mixin) {\n      return function(source) {\n        var func = this;\n        if (!isFunction(func)) {\n          return mixin(func, Object(source));\n        }\n        var pairs = [];\n        each(keys(source), function(key) {\n          if (isFunction(source[key])) {\n            pairs.push([key, func.prototype[key]]);\n          }\n        });\n\n        mixin(func, Object(source));\n\n        each(pairs, function(pair) {\n          var value = pair[1];\n          if (isFunction(value)) {\n            func.prototype[pair[0]] = value;\n          } else {\n            delete func.prototype[pair[0]];\n          }\n        });\n        return func;\n      };\n    },\n    'nthArg': function(nthArg) {\n      return function(n) {\n        var arity = n < 0 ? 1 : (toInteger(n) + 1);\n        return curry(nthArg(n), arity);\n      };\n    },\n    'rearg': function(rearg) {\n      return function(func, indexes) {\n        var arity = indexes ? indexes.length : 0;\n        return curry(rearg(func, indexes), arity);\n      };\n    },\n    'runInContext': function(runInContext) {\n      return function(context) {\n        return baseConvert(util, runInContext(context), options);\n      };\n    }\n  };\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Casts `func` to a function with an arity capped iteratee if needed.\n   *\n   * @private\n   * @param {string} name The name of the function to inspect.\n   * @param {Function} func The function to inspect.\n   * @returns {Function} Returns the cast function.\n   */\n  function castCap(name, func) {\n    if (config.cap) {\n      var indexes = mapping.iterateeRearg[name];\n      if (indexes) {\n        return iterateeRearg(func, indexes);\n      }\n      var n = !isLib && mapping.iterateeAry[name];\n      if (n) {\n        return iterateeAry(func, n);\n      }\n    }\n    return func;\n  }\n\n  /**\n   * Casts `func` to a curried function if needed.\n   *\n   * @private\n   * @param {string} name The name of the function to inspect.\n   * @param {Function} func The function to inspect.\n   * @param {number} n The arity of `func`.\n   * @returns {Function} Returns the cast function.\n   */\n  function castCurry(name, func, n) {\n    return (forceCurry || (config.curry && n > 1))\n      ? curry(func, n)\n      : func;\n  }\n\n  /**\n   * Casts `func` to a fixed arity function if needed.\n   *\n   * @private\n   * @param {string} name The name of the function to inspect.\n   * @param {Function} func The function to inspect.\n   * @param {number} n The arity cap.\n   * @returns {Function} Returns the cast function.\n   */\n  function castFixed(name, func, n) {\n    if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {\n      var data = mapping.methodSpread[name],\n          start = data && data.start;\n\n      return start  === undefined ? ary(func, n) : flatSpread(func, start);\n    }\n    return func;\n  }\n\n  /**\n   * Casts `func` to an rearged function if needed.\n   *\n   * @private\n   * @param {string} name The name of the function to inspect.\n   * @param {Function} func The function to inspect.\n   * @param {number} n The arity of `func`.\n   * @returns {Function} Returns the cast function.\n   */\n  function castRearg(name, func, n) {\n    return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name]))\n      ? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n])\n      : func;\n  }\n\n  /**\n   * Creates a clone of `object` by `path`.\n   *\n   * @private\n   * @param {Object} object The object to clone.\n   * @param {Array|string} path The path to clone by.\n   * @returns {Object} Returns the cloned object.\n   */\n  function cloneByPath(object, path) {\n    path = toPath(path);\n\n    var index = -1,\n        length = path.length,\n        lastIndex = length - 1,\n        result = clone(Object(object)),\n        nested = result;\n\n    while (nested != null && ++index < length) {\n      var key = path[index],\n          value = nested[key];\n\n      if (value != null &&\n          !(isFunction(value) || isError(value) || isWeakMap(value))) {\n        nested[key] = clone(index == lastIndex ? value : Object(value));\n      }\n      nested = nested[key];\n    }\n    return result;\n  }\n\n  /**\n   * Converts `lodash` to an immutable auto-curried iteratee-first data-last\n   * version with conversion `options` applied.\n   *\n   * @param {Object} [options] The options object. See `baseConvert` for more details.\n   * @returns {Function} Returns the converted `lodash`.\n   */\n  function convertLib(options) {\n    return _.runInContext.convert(options)(undefined);\n  }\n\n  /**\n   * Create a converter function for `func` of `name`.\n   *\n   * @param {string} name The name of the function to convert.\n   * @param {Function} func The function to convert.\n   * @returns {Function} Returns the new converter function.\n   */\n  function createConverter(name, func) {\n    var realName = mapping.aliasToReal[name] || name,\n        methodName = mapping.remap[realName] || realName,\n        oldOptions = options;\n\n    return function(options) {\n      var newUtil = isLib ? pristine : helpers,\n          newFunc = isLib ? pristine[methodName] : func,\n          newOptions = assign(assign({}, oldOptions), options);\n\n      return baseConvert(newUtil, realName, newFunc, newOptions);\n    };\n  }\n\n  /**\n   * Creates a function that wraps `func` to invoke its iteratee, with up to `n`\n   * arguments, ignoring any additional arguments.\n   *\n   * @private\n   * @param {Function} func The function to cap iteratee arguments for.\n   * @param {number} n The arity cap.\n   * @returns {Function} Returns the new function.\n   */\n  function iterateeAry(func, n) {\n    return overArg(func, function(func) {\n      return typeof func == 'function' ? baseAry(func, n) : func;\n    });\n  }\n\n  /**\n   * Creates a function that wraps `func` to invoke its iteratee with arguments\n   * arranged according to the specified `indexes` where the argument value at\n   * the first index is provided as the first argument, the argument value at\n   * the second index is provided as the second argument, and so on.\n   *\n   * @private\n   * @param {Function} func The function to rearrange iteratee arguments for.\n   * @param {number[]} indexes The arranged argument indexes.\n   * @returns {Function} Returns the new function.\n   */\n  function iterateeRearg(func, indexes) {\n    return overArg(func, function(func) {\n      var n = indexes.length;\n      return baseArity(rearg(baseAry(func, n), indexes), n);\n    });\n  }\n\n  /**\n   * Creates a function that invokes `func` with its first argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function() {\n      var length = arguments.length;\n      if (!length) {\n        return func();\n      }\n      var args = Array(length);\n      while (length--) {\n        args[length] = arguments[length];\n      }\n      var index = config.rearg ? 0 : (length - 1);\n      args[index] = transform(args[index]);\n      return func.apply(undefined, args);\n    };\n  }\n\n  /**\n   * Creates a function that wraps `func` and applys the conversions\n   * rules by `name`.\n   *\n   * @private\n   * @param {string} name The name of the function to wrap.\n   * @param {Function} func The function to wrap.\n   * @returns {Function} Returns the converted function.\n   */\n  function wrap(name, func, placeholder) {\n    var result,\n        realName = mapping.aliasToReal[name] || name,\n        wrapped = func,\n        wrapper = wrappers[realName];\n\n    if (wrapper) {\n      wrapped = wrapper(func);\n    }\n    else if (config.immutable) {\n      if (mapping.mutate.array[realName]) {\n        wrapped = wrapImmutable(func, cloneArray);\n      }\n      else if (mapping.mutate.object[realName]) {\n        wrapped = wrapImmutable(func, createCloner(func));\n      }\n      else if (mapping.mutate.set[realName]) {\n        wrapped = wrapImmutable(func, cloneByPath);\n      }\n    }\n    each(aryMethodKeys, function(aryKey) {\n      each(mapping.aryMethod[aryKey], function(otherName) {\n        if (realName == otherName) {\n          var data = mapping.methodSpread[realName],\n              afterRearg = data && data.afterRearg;\n\n          result = afterRearg\n            ? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey)\n            : castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey);\n\n          result = castCap(realName, result);\n          result = castCurry(realName, result, aryKey);\n          return false;\n        }\n      });\n      return !result;\n    });\n\n    result || (result = wrapped);\n    if (result == func) {\n      result = forceCurry ? curry(result, 1) : function() {\n        return func.apply(this, arguments);\n      };\n    }\n    result.convert = createConverter(realName, func);\n    result.placeholder = func.placeholder = placeholder;\n\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  if (!isObj) {\n    return wrap(name, func, defaultHolder);\n  }\n  var _ = func;\n\n  // Convert methods by ary cap.\n  var pairs = [];\n  each(aryMethodKeys, function(aryKey) {\n    each(mapping.aryMethod[aryKey], function(key) {\n      var func = _[mapping.remap[key] || key];\n      if (func) {\n        pairs.push([key, wrap(key, func, _)]);\n      }\n    });\n  });\n\n  // Convert remaining methods.\n  each(keys(_), function(key) {\n    var func = _[key];\n    if (typeof func == 'function') {\n      var length = pairs.length;\n      while (length--) {\n        if (pairs[length][0] == key) {\n          return;\n        }\n      }\n      func.convert = createConverter(key, func);\n      pairs.push([key, func]);\n    }\n  });\n\n  // Assign to `_` leaving `_.prototype` unchanged to allow chaining.\n  each(pairs, function(pair) {\n    _[pair[0]] = pair[1];\n  });\n\n  _.convert = convertLib;\n  _.placeholder = _;\n\n  // Assign aliases.\n  each(keys(_), function(key) {\n    each(mapping.realToAlias[key] || [], function(alias) {\n      _[alias] = _[key];\n    });\n  });\n\n  return _;\n}\n\nmodule.exports = baseConvert;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/_convertBrowser.js",
    "content": "var baseConvert = require('./_baseConvert');\n\n/**\n * Converts `lodash` to an immutable auto-curried iteratee-first data-last\n * version with conversion `options` applied.\n *\n * @param {Function} lodash The lodash function to convert.\n * @param {Object} [options] The options object. See `baseConvert` for more details.\n * @returns {Function} Returns the converted `lodash`.\n */\nfunction browserConvert(lodash, options) {\n  return baseConvert(lodash, lodash, options);\n}\n\nif (typeof _ == 'function' && typeof _.runInContext == 'function') {\n  _ = browserConvert(_.runInContext());\n}\nmodule.exports = browserConvert;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/_falseOptions.js",
    "content": "module.exports = {\n  'cap': false,\n  'curry': false,\n  'fixed': false,\n  'immutable': false,\n  'rearg': false\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/_mapping.js",
    "content": "/** Used to map aliases to their real names. */\nexports.aliasToReal = {\n\n  // Lodash aliases.\n  'each': 'forEach',\n  'eachRight': 'forEachRight',\n  'entries': 'toPairs',\n  'entriesIn': 'toPairsIn',\n  'extend': 'assignIn',\n  'extendAll': 'assignInAll',\n  'extendAllWith': 'assignInAllWith',\n  'extendWith': 'assignInWith',\n  'first': 'head',\n\n  // Methods that are curried variants of others.\n  'conforms': 'conformsTo',\n  'matches': 'isMatch',\n  'property': 'get',\n\n  // Ramda aliases.\n  '__': 'placeholder',\n  'F': 'stubFalse',\n  'T': 'stubTrue',\n  'all': 'every',\n  'allPass': 'overEvery',\n  'always': 'constant',\n  'any': 'some',\n  'anyPass': 'overSome',\n  'apply': 'spread',\n  'assoc': 'set',\n  'assocPath': 'set',\n  'complement': 'negate',\n  'compose': 'flowRight',\n  'contains': 'includes',\n  'dissoc': 'unset',\n  'dissocPath': 'unset',\n  'dropLast': 'dropRight',\n  'dropLastWhile': 'dropRightWhile',\n  'equals': 'isEqual',\n  'identical': 'eq',\n  'indexBy': 'keyBy',\n  'init': 'initial',\n  'invertObj': 'invert',\n  'juxt': 'over',\n  'omitAll': 'omit',\n  'nAry': 'ary',\n  'path': 'get',\n  'pathEq': 'matchesProperty',\n  'pathOr': 'getOr',\n  'paths': 'at',\n  'pickAll': 'pick',\n  'pipe': 'flow',\n  'pluck': 'map',\n  'prop': 'get',\n  'propEq': 'matchesProperty',\n  'propOr': 'getOr',\n  'props': 'at',\n  'symmetricDifference': 'xor',\n  'symmetricDifferenceBy': 'xorBy',\n  'symmetricDifferenceWith': 'xorWith',\n  'takeLast': 'takeRight',\n  'takeLastWhile': 'takeRightWhile',\n  'unapply': 'rest',\n  'unnest': 'flatten',\n  'useWith': 'overArgs',\n  'where': 'conformsTo',\n  'whereEq': 'isMatch',\n  'zipObj': 'zipObject'\n};\n\n/** Used to map ary to method names. */\nexports.aryMethod = {\n  '1': [\n    'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',\n    'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',\n    'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',\n    'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',\n    'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',\n    'uniqueId', 'words', 'zipAll'\n  ],\n  '2': [\n    'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',\n    'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',\n    'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',\n    'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',\n    'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',\n    'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',\n    'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',\n    'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',\n    'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',\n    'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',\n    'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',\n    'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',\n    'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',\n    'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',\n    'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',\n    'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',\n    'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',\n    'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',\n    'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',\n    'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',\n    'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',\n    'zipObjectDeep'\n  ],\n  '3': [\n    'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',\n    'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',\n    'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',\n    'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',\n    'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',\n    'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',\n    'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',\n    'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',\n    'xorWith', 'zipWith'\n  ],\n  '4': [\n    'fill', 'setWith', 'updateWith'\n  ]\n};\n\n/** Used to map ary to rearg configs. */\nexports.aryRearg = {\n  '2': [1, 0],\n  '3': [2, 0, 1],\n  '4': [3, 2, 0, 1]\n};\n\n/** Used to map method names to their iteratee ary. */\nexports.iterateeAry = {\n  'dropRightWhile': 1,\n  'dropWhile': 1,\n  'every': 1,\n  'filter': 1,\n  'find': 1,\n  'findFrom': 1,\n  'findIndex': 1,\n  'findIndexFrom': 1,\n  'findKey': 1,\n  'findLast': 1,\n  'findLastFrom': 1,\n  'findLastIndex': 1,\n  'findLastIndexFrom': 1,\n  'findLastKey': 1,\n  'flatMap': 1,\n  'flatMapDeep': 1,\n  'flatMapDepth': 1,\n  'forEach': 1,\n  'forEachRight': 1,\n  'forIn': 1,\n  'forInRight': 1,\n  'forOwn': 1,\n  'forOwnRight': 1,\n  'map': 1,\n  'mapKeys': 1,\n  'mapValues': 1,\n  'partition': 1,\n  'reduce': 2,\n  'reduceRight': 2,\n  'reject': 1,\n  'remove': 1,\n  'some': 1,\n  'takeRightWhile': 1,\n  'takeWhile': 1,\n  'times': 1,\n  'transform': 2\n};\n\n/** Used to map method names to iteratee rearg configs. */\nexports.iterateeRearg = {\n  'mapKeys': [1],\n  'reduceRight': [1, 0]\n};\n\n/** Used to map method names to rearg configs. */\nexports.methodRearg = {\n  'assignInAllWith': [1, 0],\n  'assignInWith': [1, 2, 0],\n  'assignAllWith': [1, 0],\n  'assignWith': [1, 2, 0],\n  'differenceBy': [1, 2, 0],\n  'differenceWith': [1, 2, 0],\n  'getOr': [2, 1, 0],\n  'intersectionBy': [1, 2, 0],\n  'intersectionWith': [1, 2, 0],\n  'isEqualWith': [1, 2, 0],\n  'isMatchWith': [2, 1, 0],\n  'mergeAllWith': [1, 0],\n  'mergeWith': [1, 2, 0],\n  'padChars': [2, 1, 0],\n  'padCharsEnd': [2, 1, 0],\n  'padCharsStart': [2, 1, 0],\n  'pullAllBy': [2, 1, 0],\n  'pullAllWith': [2, 1, 0],\n  'rangeStep': [1, 2, 0],\n  'rangeStepRight': [1, 2, 0],\n  'setWith': [3, 1, 2, 0],\n  'sortedIndexBy': [2, 1, 0],\n  'sortedLastIndexBy': [2, 1, 0],\n  'unionBy': [1, 2, 0],\n  'unionWith': [1, 2, 0],\n  'updateWith': [3, 1, 2, 0],\n  'xorBy': [1, 2, 0],\n  'xorWith': [1, 2, 0],\n  'zipWith': [1, 2, 0]\n};\n\n/** Used to map method names to spread configs. */\nexports.methodSpread = {\n  'assignAll': { 'start': 0 },\n  'assignAllWith': { 'start': 0 },\n  'assignInAll': { 'start': 0 },\n  'assignInAllWith': { 'start': 0 },\n  'defaultsAll': { 'start': 0 },\n  'defaultsDeepAll': { 'start': 0 },\n  'invokeArgs': { 'start': 2 },\n  'invokeArgsMap': { 'start': 2 },\n  'mergeAll': { 'start': 0 },\n  'mergeAllWith': { 'start': 0 },\n  'partial': { 'start': 1 },\n  'partialRight': { 'start': 1 },\n  'without': { 'start': 1 },\n  'zipAll': { 'start': 0 }\n};\n\n/** Used to identify methods which mutate arrays or objects. */\nexports.mutate = {\n  'array': {\n    'fill': true,\n    'pull': true,\n    'pullAll': true,\n    'pullAllBy': true,\n    'pullAllWith': true,\n    'pullAt': true,\n    'remove': true,\n    'reverse': true\n  },\n  'object': {\n    'assign': true,\n    'assignAll': true,\n    'assignAllWith': true,\n    'assignIn': true,\n    'assignInAll': true,\n    'assignInAllWith': true,\n    'assignInWith': true,\n    'assignWith': true,\n    'defaults': true,\n    'defaultsAll': true,\n    'defaultsDeep': true,\n    'defaultsDeepAll': true,\n    'merge': true,\n    'mergeAll': true,\n    'mergeAllWith': true,\n    'mergeWith': true,\n  },\n  'set': {\n    'set': true,\n    'setWith': true,\n    'unset': true,\n    'update': true,\n    'updateWith': true\n  }\n};\n\n/** Used to map real names to their aliases. */\nexports.realToAlias = (function() {\n  var hasOwnProperty = Object.prototype.hasOwnProperty,\n      object = exports.aliasToReal,\n      result = {};\n\n  for (var key in object) {\n    var value = object[key];\n    if (hasOwnProperty.call(result, value)) {\n      result[value].push(key);\n    } else {\n      result[value] = [key];\n    }\n  }\n  return result;\n}());\n\n/** Used to map method names to other names. */\nexports.remap = {\n  'assignAll': 'assign',\n  'assignAllWith': 'assignWith',\n  'assignInAll': 'assignIn',\n  'assignInAllWith': 'assignInWith',\n  'curryN': 'curry',\n  'curryRightN': 'curryRight',\n  'defaultsAll': 'defaults',\n  'defaultsDeepAll': 'defaultsDeep',\n  'findFrom': 'find',\n  'findIndexFrom': 'findIndex',\n  'findLastFrom': 'findLast',\n  'findLastIndexFrom': 'findLastIndex',\n  'getOr': 'get',\n  'includesFrom': 'includes',\n  'indexOfFrom': 'indexOf',\n  'invokeArgs': 'invoke',\n  'invokeArgsMap': 'invokeMap',\n  'lastIndexOfFrom': 'lastIndexOf',\n  'mergeAll': 'merge',\n  'mergeAllWith': 'mergeWith',\n  'padChars': 'pad',\n  'padCharsEnd': 'padEnd',\n  'padCharsStart': 'padStart',\n  'propertyOf': 'get',\n  'rangeStep': 'range',\n  'rangeStepRight': 'rangeRight',\n  'restFrom': 'rest',\n  'spreadFrom': 'spread',\n  'trimChars': 'trim',\n  'trimCharsEnd': 'trimEnd',\n  'trimCharsStart': 'trimStart',\n  'zipAll': 'zip'\n};\n\n/** Used to track methods that skip fixing their arity. */\nexports.skipFixed = {\n  'castArray': true,\n  'flow': true,\n  'flowRight': true,\n  'iteratee': true,\n  'mixin': true,\n  'rearg': true,\n  'runInContext': true\n};\n\n/** Used to track methods that skip rearranging arguments. */\nexports.skipRearg = {\n  'add': true,\n  'assign': true,\n  'assignIn': true,\n  'bind': true,\n  'bindKey': true,\n  'concat': true,\n  'difference': true,\n  'divide': true,\n  'eq': true,\n  'gt': true,\n  'gte': true,\n  'isEqual': true,\n  'lt': true,\n  'lte': true,\n  'matchesProperty': true,\n  'merge': true,\n  'multiply': true,\n  'overArgs': true,\n  'partial': true,\n  'partialRight': true,\n  'propertyOf': true,\n  'random': true,\n  'range': true,\n  'rangeRight': true,\n  'subtract': true,\n  'zip': true,\n  'zipObject': true,\n  'zipObjectDeep': true\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/_util.js",
    "content": "module.exports = {\n  'ary': require('../ary'),\n  'assign': require('../_baseAssign'),\n  'clone': require('../clone'),\n  'curry': require('../curry'),\n  'forEach': require('../_arrayEach'),\n  'isArray': require('../isArray'),\n  'isError': require('../isError'),\n  'isFunction': require('../isFunction'),\n  'isWeakMap': require('../isWeakMap'),\n  'iteratee': require('../iteratee'),\n  'keys': require('../_baseKeys'),\n  'rearg': require('../rearg'),\n  'toInteger': require('../toInteger'),\n  'toPath': require('../toPath')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/add.js",
    "content": "var convert = require('./convert'),\n    func = convert('add', require('../add'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/after.js",
    "content": "var convert = require('./convert'),\n    func = convert('after', require('../after'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/all.js",
    "content": "module.exports = require('./every');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/allPass.js",
    "content": "module.exports = require('./overEvery');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/always.js",
    "content": "module.exports = require('./constant');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/any.js",
    "content": "module.exports = require('./some');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/anyPass.js",
    "content": "module.exports = require('./overSome');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/apply.js",
    "content": "module.exports = require('./spread');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/array.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../array'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/ary.js",
    "content": "var convert = require('./convert'),\n    func = convert('ary', require('../ary'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assign.js",
    "content": "var convert = require('./convert'),\n    func = convert('assign', require('../assign'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignAll', require('../assign'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignAllWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignAllWith', require('../assignWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignIn', require('../assignIn'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignInAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignInAll', require('../assignIn'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignInAllWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignInAllWith', require('../assignInWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignInWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignInWith', require('../assignInWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assignWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('assignWith', require('../assignWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assoc.js",
    "content": "module.exports = require('./set');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/assocPath.js",
    "content": "module.exports = require('./set');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/at.js",
    "content": "var convert = require('./convert'),\n    func = convert('at', require('../at'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/attempt.js",
    "content": "var convert = require('./convert'),\n    func = convert('attempt', require('../attempt'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/before.js",
    "content": "var convert = require('./convert'),\n    func = convert('before', require('../before'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/bind.js",
    "content": "var convert = require('./convert'),\n    func = convert('bind', require('../bind'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/bindAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('bindAll', require('../bindAll'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/bindKey.js",
    "content": "var convert = require('./convert'),\n    func = convert('bindKey', require('../bindKey'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/camelCase.js",
    "content": "var convert = require('./convert'),\n    func = convert('camelCase', require('../camelCase'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/capitalize.js",
    "content": "var convert = require('./convert'),\n    func = convert('capitalize', require('../capitalize'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/castArray.js",
    "content": "var convert = require('./convert'),\n    func = convert('castArray', require('../castArray'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/ceil.js",
    "content": "var convert = require('./convert'),\n    func = convert('ceil', require('../ceil'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/chain.js",
    "content": "var convert = require('./convert'),\n    func = convert('chain', require('../chain'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/chunk.js",
    "content": "var convert = require('./convert'),\n    func = convert('chunk', require('../chunk'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/clamp.js",
    "content": "var convert = require('./convert'),\n    func = convert('clamp', require('../clamp'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/clone.js",
    "content": "var convert = require('./convert'),\n    func = convert('clone', require('../clone'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/cloneDeep.js",
    "content": "var convert = require('./convert'),\n    func = convert('cloneDeep', require('../cloneDeep'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/cloneDeepWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('cloneDeepWith', require('../cloneDeepWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/cloneWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('cloneWith', require('../cloneWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/collection.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../collection'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/commit.js",
    "content": "var convert = require('./convert'),\n    func = convert('commit', require('../commit'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/compact.js",
    "content": "var convert = require('./convert'),\n    func = convert('compact', require('../compact'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/complement.js",
    "content": "module.exports = require('./negate');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/compose.js",
    "content": "module.exports = require('./flowRight');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/concat.js",
    "content": "var convert = require('./convert'),\n    func = convert('concat', require('../concat'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/cond.js",
    "content": "var convert = require('./convert'),\n    func = convert('cond', require('../cond'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/conforms.js",
    "content": "module.exports = require('./conformsTo');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/conformsTo.js",
    "content": "var convert = require('./convert'),\n    func = convert('conformsTo', require('../conformsTo'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/constant.js",
    "content": "var convert = require('./convert'),\n    func = convert('constant', require('../constant'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/contains.js",
    "content": "module.exports = require('./includes');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/convert.js",
    "content": "var baseConvert = require('./_baseConvert'),\n    util = require('./_util');\n\n/**\n * Converts `func` of `name` to an immutable auto-curried iteratee-first data-last\n * version with conversion `options` applied. If `name` is an object its methods\n * will be converted.\n *\n * @param {string} name The name of the function to wrap.\n * @param {Function} [func] The function to wrap.\n * @param {Object} [options] The options object. See `baseConvert` for more details.\n * @returns {Function|Object} Returns the converted function or object.\n */\nfunction convert(name, func, options) {\n  return baseConvert(util, name, func, options);\n}\n\nmodule.exports = convert;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/countBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('countBy', require('../countBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/create.js",
    "content": "var convert = require('./convert'),\n    func = convert('create', require('../create'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/curry.js",
    "content": "var convert = require('./convert'),\n    func = convert('curry', require('../curry'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/curryN.js",
    "content": "var convert = require('./convert'),\n    func = convert('curryN', require('../curry'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/curryRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('curryRight', require('../curryRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/curryRightN.js",
    "content": "var convert = require('./convert'),\n    func = convert('curryRightN', require('../curryRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/date.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../date'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/debounce.js",
    "content": "var convert = require('./convert'),\n    func = convert('debounce', require('../debounce'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/deburr.js",
    "content": "var convert = require('./convert'),\n    func = convert('deburr', require('../deburr'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/defaultTo.js",
    "content": "var convert = require('./convert'),\n    func = convert('defaultTo', require('../defaultTo'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/defaults.js",
    "content": "var convert = require('./convert'),\n    func = convert('defaults', require('../defaults'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/defaultsAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('defaultsAll', require('../defaults'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/defaultsDeep.js",
    "content": "var convert = require('./convert'),\n    func = convert('defaultsDeep', require('../defaultsDeep'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/defaultsDeepAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('defaultsDeepAll', require('../defaultsDeep'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/defer.js",
    "content": "var convert = require('./convert'),\n    func = convert('defer', require('../defer'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/delay.js",
    "content": "var convert = require('./convert'),\n    func = convert('delay', require('../delay'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/difference.js",
    "content": "var convert = require('./convert'),\n    func = convert('difference', require('../difference'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/differenceBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('differenceBy', require('../differenceBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/differenceWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('differenceWith', require('../differenceWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dissoc.js",
    "content": "module.exports = require('./unset');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dissocPath.js",
    "content": "module.exports = require('./unset');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/divide.js",
    "content": "var convert = require('./convert'),\n    func = convert('divide', require('../divide'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/drop.js",
    "content": "var convert = require('./convert'),\n    func = convert('drop', require('../drop'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dropLast.js",
    "content": "module.exports = require('./dropRight');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dropLastWhile.js",
    "content": "module.exports = require('./dropRightWhile');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dropRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('dropRight', require('../dropRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dropRightWhile.js",
    "content": "var convert = require('./convert'),\n    func = convert('dropRightWhile', require('../dropRightWhile'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/dropWhile.js",
    "content": "var convert = require('./convert'),\n    func = convert('dropWhile', require('../dropWhile'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/each.js",
    "content": "module.exports = require('./forEach');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/eachRight.js",
    "content": "module.exports = require('./forEachRight');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/endsWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('endsWith', require('../endsWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/entries.js",
    "content": "module.exports = require('./toPairs');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/entriesIn.js",
    "content": "module.exports = require('./toPairsIn');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/eq.js",
    "content": "var convert = require('./convert'),\n    func = convert('eq', require('../eq'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/equals.js",
    "content": "module.exports = require('./isEqual');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/escape.js",
    "content": "var convert = require('./convert'),\n    func = convert('escape', require('../escape'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/escapeRegExp.js",
    "content": "var convert = require('./convert'),\n    func = convert('escapeRegExp', require('../escapeRegExp'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/every.js",
    "content": "var convert = require('./convert'),\n    func = convert('every', require('../every'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/extend.js",
    "content": "module.exports = require('./assignIn');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/extendAll.js",
    "content": "module.exports = require('./assignInAll');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/extendAllWith.js",
    "content": "module.exports = require('./assignInAllWith');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/extendWith.js",
    "content": "module.exports = require('./assignInWith');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/fill.js",
    "content": "var convert = require('./convert'),\n    func = convert('fill', require('../fill'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/filter.js",
    "content": "var convert = require('./convert'),\n    func = convert('filter', require('../filter'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/find.js",
    "content": "var convert = require('./convert'),\n    func = convert('find', require('../find'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('findFrom', require('../find'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findIndex.js",
    "content": "var convert = require('./convert'),\n    func = convert('findIndex', require('../findIndex'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findIndexFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('findIndexFrom', require('../findIndex'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findKey.js",
    "content": "var convert = require('./convert'),\n    func = convert('findKey', require('../findKey'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findLast.js",
    "content": "var convert = require('./convert'),\n    func = convert('findLast', require('../findLast'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findLastFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('findLastFrom', require('../findLast'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findLastIndex.js",
    "content": "var convert = require('./convert'),\n    func = convert('findLastIndex', require('../findLastIndex'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findLastIndexFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('findLastIndexFrom', require('../findLastIndex'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/findLastKey.js",
    "content": "var convert = require('./convert'),\n    func = convert('findLastKey', require('../findLastKey'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/first.js",
    "content": "module.exports = require('./head');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flatMap.js",
    "content": "var convert = require('./convert'),\n    func = convert('flatMap', require('../flatMap'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flatMapDeep.js",
    "content": "var convert = require('./convert'),\n    func = convert('flatMapDeep', require('../flatMapDeep'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flatMapDepth.js",
    "content": "var convert = require('./convert'),\n    func = convert('flatMapDepth', require('../flatMapDepth'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flatten.js",
    "content": "var convert = require('./convert'),\n    func = convert('flatten', require('../flatten'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flattenDeep.js",
    "content": "var convert = require('./convert'),\n    func = convert('flattenDeep', require('../flattenDeep'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flattenDepth.js",
    "content": "var convert = require('./convert'),\n    func = convert('flattenDepth', require('../flattenDepth'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flip.js",
    "content": "var convert = require('./convert'),\n    func = convert('flip', require('../flip'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/floor.js",
    "content": "var convert = require('./convert'),\n    func = convert('floor', require('../floor'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flow.js",
    "content": "var convert = require('./convert'),\n    func = convert('flow', require('../flow'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/flowRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('flowRight', require('../flowRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/forEach.js",
    "content": "var convert = require('./convert'),\n    func = convert('forEach', require('../forEach'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/forEachRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('forEachRight', require('../forEachRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/forIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('forIn', require('../forIn'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/forInRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('forInRight', require('../forInRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/forOwn.js",
    "content": "var convert = require('./convert'),\n    func = convert('forOwn', require('../forOwn'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/forOwnRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('forOwnRight', require('../forOwnRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/fromPairs.js",
    "content": "var convert = require('./convert'),\n    func = convert('fromPairs', require('../fromPairs'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/function.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../function'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/functions.js",
    "content": "var convert = require('./convert'),\n    func = convert('functions', require('../functions'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/functionsIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('functionsIn', require('../functionsIn'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/get.js",
    "content": "var convert = require('./convert'),\n    func = convert('get', require('../get'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/getOr.js",
    "content": "var convert = require('./convert'),\n    func = convert('getOr', require('../get'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/groupBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('groupBy', require('../groupBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/gt.js",
    "content": "var convert = require('./convert'),\n    func = convert('gt', require('../gt'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/gte.js",
    "content": "var convert = require('./convert'),\n    func = convert('gte', require('../gte'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/has.js",
    "content": "var convert = require('./convert'),\n    func = convert('has', require('../has'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/hasIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('hasIn', require('../hasIn'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/head.js",
    "content": "var convert = require('./convert'),\n    func = convert('head', require('../head'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/identical.js",
    "content": "module.exports = require('./eq');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/identity.js",
    "content": "var convert = require('./convert'),\n    func = convert('identity', require('../identity'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/inRange.js",
    "content": "var convert = require('./convert'),\n    func = convert('inRange', require('../inRange'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/includes.js",
    "content": "var convert = require('./convert'),\n    func = convert('includes', require('../includes'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/includesFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('includesFrom', require('../includes'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/indexBy.js",
    "content": "module.exports = require('./keyBy');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/indexOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('indexOf', require('../indexOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/indexOfFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('indexOfFrom', require('../indexOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/init.js",
    "content": "module.exports = require('./initial');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/initial.js",
    "content": "var convert = require('./convert'),\n    func = convert('initial', require('../initial'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/intersection.js",
    "content": "var convert = require('./convert'),\n    func = convert('intersection', require('../intersection'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/intersectionBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('intersectionBy', require('../intersectionBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/intersectionWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('intersectionWith', require('../intersectionWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invert.js",
    "content": "var convert = require('./convert'),\n    func = convert('invert', require('../invert'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invertBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('invertBy', require('../invertBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invertObj.js",
    "content": "module.exports = require('./invert');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invoke.js",
    "content": "var convert = require('./convert'),\n    func = convert('invoke', require('../invoke'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invokeArgs.js",
    "content": "var convert = require('./convert'),\n    func = convert('invokeArgs', require('../invoke'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invokeArgsMap.js",
    "content": "var convert = require('./convert'),\n    func = convert('invokeArgsMap', require('../invokeMap'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/invokeMap.js",
    "content": "var convert = require('./convert'),\n    func = convert('invokeMap', require('../invokeMap'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isArguments.js",
    "content": "var convert = require('./convert'),\n    func = convert('isArguments', require('../isArguments'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isArray.js",
    "content": "var convert = require('./convert'),\n    func = convert('isArray', require('../isArray'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isArrayBuffer.js",
    "content": "var convert = require('./convert'),\n    func = convert('isArrayBuffer', require('../isArrayBuffer'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isArrayLike.js",
    "content": "var convert = require('./convert'),\n    func = convert('isArrayLike', require('../isArrayLike'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isArrayLikeObject.js",
    "content": "var convert = require('./convert'),\n    func = convert('isArrayLikeObject', require('../isArrayLikeObject'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isBoolean.js",
    "content": "var convert = require('./convert'),\n    func = convert('isBoolean', require('../isBoolean'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isBuffer.js",
    "content": "var convert = require('./convert'),\n    func = convert('isBuffer', require('../isBuffer'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isDate.js",
    "content": "var convert = require('./convert'),\n    func = convert('isDate', require('../isDate'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isElement.js",
    "content": "var convert = require('./convert'),\n    func = convert('isElement', require('../isElement'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isEmpty.js",
    "content": "var convert = require('./convert'),\n    func = convert('isEmpty', require('../isEmpty'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isEqual.js",
    "content": "var convert = require('./convert'),\n    func = convert('isEqual', require('../isEqual'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isEqualWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('isEqualWith', require('../isEqualWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isError.js",
    "content": "var convert = require('./convert'),\n    func = convert('isError', require('../isError'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isFinite.js",
    "content": "var convert = require('./convert'),\n    func = convert('isFinite', require('../isFinite'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isFunction.js",
    "content": "var convert = require('./convert'),\n    func = convert('isFunction', require('../isFunction'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isInteger.js",
    "content": "var convert = require('./convert'),\n    func = convert('isInteger', require('../isInteger'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isLength.js",
    "content": "var convert = require('./convert'),\n    func = convert('isLength', require('../isLength'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isMap.js",
    "content": "var convert = require('./convert'),\n    func = convert('isMap', require('../isMap'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isMatch.js",
    "content": "var convert = require('./convert'),\n    func = convert('isMatch', require('../isMatch'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isMatchWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('isMatchWith', require('../isMatchWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isNaN.js",
    "content": "var convert = require('./convert'),\n    func = convert('isNaN', require('../isNaN'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isNative.js",
    "content": "var convert = require('./convert'),\n    func = convert('isNative', require('../isNative'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isNil.js",
    "content": "var convert = require('./convert'),\n    func = convert('isNil', require('../isNil'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isNull.js",
    "content": "var convert = require('./convert'),\n    func = convert('isNull', require('../isNull'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isNumber.js",
    "content": "var convert = require('./convert'),\n    func = convert('isNumber', require('../isNumber'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isObject.js",
    "content": "var convert = require('./convert'),\n    func = convert('isObject', require('../isObject'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isObjectLike.js",
    "content": "var convert = require('./convert'),\n    func = convert('isObjectLike', require('../isObjectLike'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isPlainObject.js",
    "content": "var convert = require('./convert'),\n    func = convert('isPlainObject', require('../isPlainObject'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isRegExp.js",
    "content": "var convert = require('./convert'),\n    func = convert('isRegExp', require('../isRegExp'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isSafeInteger.js",
    "content": "var convert = require('./convert'),\n    func = convert('isSafeInteger', require('../isSafeInteger'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isSet.js",
    "content": "var convert = require('./convert'),\n    func = convert('isSet', require('../isSet'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isString.js",
    "content": "var convert = require('./convert'),\n    func = convert('isString', require('../isString'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isSymbol.js",
    "content": "var convert = require('./convert'),\n    func = convert('isSymbol', require('../isSymbol'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isTypedArray.js",
    "content": "var convert = require('./convert'),\n    func = convert('isTypedArray', require('../isTypedArray'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isUndefined.js",
    "content": "var convert = require('./convert'),\n    func = convert('isUndefined', require('../isUndefined'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isWeakMap.js",
    "content": "var convert = require('./convert'),\n    func = convert('isWeakMap', require('../isWeakMap'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/isWeakSet.js",
    "content": "var convert = require('./convert'),\n    func = convert('isWeakSet', require('../isWeakSet'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/iteratee.js",
    "content": "var convert = require('./convert'),\n    func = convert('iteratee', require('../iteratee'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/join.js",
    "content": "var convert = require('./convert'),\n    func = convert('join', require('../join'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/juxt.js",
    "content": "module.exports = require('./over');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/kebabCase.js",
    "content": "var convert = require('./convert'),\n    func = convert('kebabCase', require('../kebabCase'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/keyBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('keyBy', require('../keyBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/keys.js",
    "content": "var convert = require('./convert'),\n    func = convert('keys', require('../keys'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/keysIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('keysIn', require('../keysIn'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lang.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../lang'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/last.js",
    "content": "var convert = require('./convert'),\n    func = convert('last', require('../last'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lastIndexOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('lastIndexOf', require('../lastIndexOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lastIndexOfFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('lastIndexOfFrom', require('../lastIndexOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lowerCase.js",
    "content": "var convert = require('./convert'),\n    func = convert('lowerCase', require('../lowerCase'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lowerFirst.js",
    "content": "var convert = require('./convert'),\n    func = convert('lowerFirst', require('../lowerFirst'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lt.js",
    "content": "var convert = require('./convert'),\n    func = convert('lt', require('../lt'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/lte.js",
    "content": "var convert = require('./convert'),\n    func = convert('lte', require('../lte'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/map.js",
    "content": "var convert = require('./convert'),\n    func = convert('map', require('../map'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mapKeys.js",
    "content": "var convert = require('./convert'),\n    func = convert('mapKeys', require('../mapKeys'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mapValues.js",
    "content": "var convert = require('./convert'),\n    func = convert('mapValues', require('../mapValues'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/matches.js",
    "content": "module.exports = require('./isMatch');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/matchesProperty.js",
    "content": "var convert = require('./convert'),\n    func = convert('matchesProperty', require('../matchesProperty'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/math.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../math'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/max.js",
    "content": "var convert = require('./convert'),\n    func = convert('max', require('../max'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/maxBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('maxBy', require('../maxBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mean.js",
    "content": "var convert = require('./convert'),\n    func = convert('mean', require('../mean'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/meanBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('meanBy', require('../meanBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/memoize.js",
    "content": "var convert = require('./convert'),\n    func = convert('memoize', require('../memoize'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/merge.js",
    "content": "var convert = require('./convert'),\n    func = convert('merge', require('../merge'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mergeAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('mergeAll', require('../merge'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mergeAllWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('mergeAllWith', require('../mergeWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mergeWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('mergeWith', require('../mergeWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/method.js",
    "content": "var convert = require('./convert'),\n    func = convert('method', require('../method'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/methodOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('methodOf', require('../methodOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/min.js",
    "content": "var convert = require('./convert'),\n    func = convert('min', require('../min'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/minBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('minBy', require('../minBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/mixin.js",
    "content": "var convert = require('./convert'),\n    func = convert('mixin', require('../mixin'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/multiply.js",
    "content": "var convert = require('./convert'),\n    func = convert('multiply', require('../multiply'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/nAry.js",
    "content": "module.exports = require('./ary');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/negate.js",
    "content": "var convert = require('./convert'),\n    func = convert('negate', require('../negate'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/next.js",
    "content": "var convert = require('./convert'),\n    func = convert('next', require('../next'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/noop.js",
    "content": "var convert = require('./convert'),\n    func = convert('noop', require('../noop'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/now.js",
    "content": "var convert = require('./convert'),\n    func = convert('now', require('../now'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/nth.js",
    "content": "var convert = require('./convert'),\n    func = convert('nth', require('../nth'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/nthArg.js",
    "content": "var convert = require('./convert'),\n    func = convert('nthArg', require('../nthArg'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/number.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../number'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/object.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../object'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/omit.js",
    "content": "var convert = require('./convert'),\n    func = convert('omit', require('../omit'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/omitAll.js",
    "content": "module.exports = require('./omit');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/omitBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('omitBy', require('../omitBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/once.js",
    "content": "var convert = require('./convert'),\n    func = convert('once', require('../once'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/orderBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('orderBy', require('../orderBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/over.js",
    "content": "var convert = require('./convert'),\n    func = convert('over', require('../over'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/overArgs.js",
    "content": "var convert = require('./convert'),\n    func = convert('overArgs', require('../overArgs'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/overEvery.js",
    "content": "var convert = require('./convert'),\n    func = convert('overEvery', require('../overEvery'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/overSome.js",
    "content": "var convert = require('./convert'),\n    func = convert('overSome', require('../overSome'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pad.js",
    "content": "var convert = require('./convert'),\n    func = convert('pad', require('../pad'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/padChars.js",
    "content": "var convert = require('./convert'),\n    func = convert('padChars', require('../pad'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/padCharsEnd.js",
    "content": "var convert = require('./convert'),\n    func = convert('padCharsEnd', require('../padEnd'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/padCharsStart.js",
    "content": "var convert = require('./convert'),\n    func = convert('padCharsStart', require('../padStart'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/padEnd.js",
    "content": "var convert = require('./convert'),\n    func = convert('padEnd', require('../padEnd'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/padStart.js",
    "content": "var convert = require('./convert'),\n    func = convert('padStart', require('../padStart'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/parseInt.js",
    "content": "var convert = require('./convert'),\n    func = convert('parseInt', require('../parseInt'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/partial.js",
    "content": "var convert = require('./convert'),\n    func = convert('partial', require('../partial'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/partialRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('partialRight', require('../partialRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/partition.js",
    "content": "var convert = require('./convert'),\n    func = convert('partition', require('../partition'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/path.js",
    "content": "module.exports = require('./get');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pathEq.js",
    "content": "module.exports = require('./matchesProperty');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pathOr.js",
    "content": "module.exports = require('./getOr');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/paths.js",
    "content": "module.exports = require('./at');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pick.js",
    "content": "var convert = require('./convert'),\n    func = convert('pick', require('../pick'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pickAll.js",
    "content": "module.exports = require('./pick');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pickBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('pickBy', require('../pickBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pipe.js",
    "content": "module.exports = require('./flow');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/placeholder.js",
    "content": "/**\n * The default argument placeholder value for methods.\n *\n * @type {Object}\n */\nmodule.exports = {};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/plant.js",
    "content": "var convert = require('./convert'),\n    func = convert('plant', require('../plant'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pluck.js",
    "content": "module.exports = require('./map');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/prop.js",
    "content": "module.exports = require('./get');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/propEq.js",
    "content": "module.exports = require('./matchesProperty');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/propOr.js",
    "content": "module.exports = require('./getOr');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/property.js",
    "content": "module.exports = require('./get');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/propertyOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('propertyOf', require('../get'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/props.js",
    "content": "module.exports = require('./at');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pull.js",
    "content": "var convert = require('./convert'),\n    func = convert('pull', require('../pull'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pullAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('pullAll', require('../pullAll'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pullAllBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('pullAllBy', require('../pullAllBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pullAllWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('pullAllWith', require('../pullAllWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/pullAt.js",
    "content": "var convert = require('./convert'),\n    func = convert('pullAt', require('../pullAt'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/random.js",
    "content": "var convert = require('./convert'),\n    func = convert('random', require('../random'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/range.js",
    "content": "var convert = require('./convert'),\n    func = convert('range', require('../range'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/rangeRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('rangeRight', require('../rangeRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/rangeStep.js",
    "content": "var convert = require('./convert'),\n    func = convert('rangeStep', require('../range'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/rangeStepRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('rangeStepRight', require('../rangeRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/rearg.js",
    "content": "var convert = require('./convert'),\n    func = convert('rearg', require('../rearg'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/reduce.js",
    "content": "var convert = require('./convert'),\n    func = convert('reduce', require('../reduce'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/reduceRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('reduceRight', require('../reduceRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/reject.js",
    "content": "var convert = require('./convert'),\n    func = convert('reject', require('../reject'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/remove.js",
    "content": "var convert = require('./convert'),\n    func = convert('remove', require('../remove'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/repeat.js",
    "content": "var convert = require('./convert'),\n    func = convert('repeat', require('../repeat'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/replace.js",
    "content": "var convert = require('./convert'),\n    func = convert('replace', require('../replace'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/rest.js",
    "content": "var convert = require('./convert'),\n    func = convert('rest', require('../rest'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/restFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('restFrom', require('../rest'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/result.js",
    "content": "var convert = require('./convert'),\n    func = convert('result', require('../result'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/reverse.js",
    "content": "var convert = require('./convert'),\n    func = convert('reverse', require('../reverse'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/round.js",
    "content": "var convert = require('./convert'),\n    func = convert('round', require('../round'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sample.js",
    "content": "var convert = require('./convert'),\n    func = convert('sample', require('../sample'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sampleSize.js",
    "content": "var convert = require('./convert'),\n    func = convert('sampleSize', require('../sampleSize'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/seq.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../seq'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/set.js",
    "content": "var convert = require('./convert'),\n    func = convert('set', require('../set'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/setWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('setWith', require('../setWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/shuffle.js",
    "content": "var convert = require('./convert'),\n    func = convert('shuffle', require('../shuffle'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/size.js",
    "content": "var convert = require('./convert'),\n    func = convert('size', require('../size'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/slice.js",
    "content": "var convert = require('./convert'),\n    func = convert('slice', require('../slice'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/snakeCase.js",
    "content": "var convert = require('./convert'),\n    func = convert('snakeCase', require('../snakeCase'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/some.js",
    "content": "var convert = require('./convert'),\n    func = convert('some', require('../some'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortBy', require('../sortBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedIndex.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedIndex', require('../sortedIndex'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedIndexBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedIndexBy', require('../sortedIndexBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedIndexOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedIndexOf', require('../sortedIndexOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedLastIndex.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedLastIndex', require('../sortedLastIndex'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedLastIndexBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedLastIndexBy', require('../sortedLastIndexBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedLastIndexOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedLastIndexOf', require('../sortedLastIndexOf'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedUniq.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedUniq', require('../sortedUniq'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sortedUniqBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('sortedUniqBy', require('../sortedUniqBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/split.js",
    "content": "var convert = require('./convert'),\n    func = convert('split', require('../split'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/spread.js",
    "content": "var convert = require('./convert'),\n    func = convert('spread', require('../spread'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/spreadFrom.js",
    "content": "var convert = require('./convert'),\n    func = convert('spreadFrom', require('../spread'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/startCase.js",
    "content": "var convert = require('./convert'),\n    func = convert('startCase', require('../startCase'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/startsWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('startsWith', require('../startsWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/string.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../string'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/stubArray.js",
    "content": "var convert = require('./convert'),\n    func = convert('stubArray', require('../stubArray'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/stubFalse.js",
    "content": "var convert = require('./convert'),\n    func = convert('stubFalse', require('../stubFalse'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/stubObject.js",
    "content": "var convert = require('./convert'),\n    func = convert('stubObject', require('../stubObject'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/stubString.js",
    "content": "var convert = require('./convert'),\n    func = convert('stubString', require('../stubString'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/stubTrue.js",
    "content": "var convert = require('./convert'),\n    func = convert('stubTrue', require('../stubTrue'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/subtract.js",
    "content": "var convert = require('./convert'),\n    func = convert('subtract', require('../subtract'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sum.js",
    "content": "var convert = require('./convert'),\n    func = convert('sum', require('../sum'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/sumBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('sumBy', require('../sumBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/symmetricDifference.js",
    "content": "module.exports = require('./xor');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/symmetricDifferenceBy.js",
    "content": "module.exports = require('./xorBy');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/symmetricDifferenceWith.js",
    "content": "module.exports = require('./xorWith');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/tail.js",
    "content": "var convert = require('./convert'),\n    func = convert('tail', require('../tail'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/take.js",
    "content": "var convert = require('./convert'),\n    func = convert('take', require('../take'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/takeLast.js",
    "content": "module.exports = require('./takeRight');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/takeLastWhile.js",
    "content": "module.exports = require('./takeRightWhile');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/takeRight.js",
    "content": "var convert = require('./convert'),\n    func = convert('takeRight', require('../takeRight'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/takeRightWhile.js",
    "content": "var convert = require('./convert'),\n    func = convert('takeRightWhile', require('../takeRightWhile'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/takeWhile.js",
    "content": "var convert = require('./convert'),\n    func = convert('takeWhile', require('../takeWhile'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/tap.js",
    "content": "var convert = require('./convert'),\n    func = convert('tap', require('../tap'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/template.js",
    "content": "var convert = require('./convert'),\n    func = convert('template', require('../template'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/templateSettings.js",
    "content": "var convert = require('./convert'),\n    func = convert('templateSettings', require('../templateSettings'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/throttle.js",
    "content": "var convert = require('./convert'),\n    func = convert('throttle', require('../throttle'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/thru.js",
    "content": "var convert = require('./convert'),\n    func = convert('thru', require('../thru'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/times.js",
    "content": "var convert = require('./convert'),\n    func = convert('times', require('../times'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toArray.js",
    "content": "var convert = require('./convert'),\n    func = convert('toArray', require('../toArray'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toFinite.js",
    "content": "var convert = require('./convert'),\n    func = convert('toFinite', require('../toFinite'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toInteger.js",
    "content": "var convert = require('./convert'),\n    func = convert('toInteger', require('../toInteger'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toIterator.js",
    "content": "var convert = require('./convert'),\n    func = convert('toIterator', require('../toIterator'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toJSON.js",
    "content": "var convert = require('./convert'),\n    func = convert('toJSON', require('../toJSON'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toLength.js",
    "content": "var convert = require('./convert'),\n    func = convert('toLength', require('../toLength'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toLower.js",
    "content": "var convert = require('./convert'),\n    func = convert('toLower', require('../toLower'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toNumber.js",
    "content": "var convert = require('./convert'),\n    func = convert('toNumber', require('../toNumber'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toPairs.js",
    "content": "var convert = require('./convert'),\n    func = convert('toPairs', require('../toPairs'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toPairsIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('toPairsIn', require('../toPairsIn'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toPath.js",
    "content": "var convert = require('./convert'),\n    func = convert('toPath', require('../toPath'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toPlainObject.js",
    "content": "var convert = require('./convert'),\n    func = convert('toPlainObject', require('../toPlainObject'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toSafeInteger.js",
    "content": "var convert = require('./convert'),\n    func = convert('toSafeInteger', require('../toSafeInteger'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toString.js",
    "content": "var convert = require('./convert'),\n    func = convert('toString', require('../toString'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/toUpper.js",
    "content": "var convert = require('./convert'),\n    func = convert('toUpper', require('../toUpper'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/transform.js",
    "content": "var convert = require('./convert'),\n    func = convert('transform', require('../transform'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/trim.js",
    "content": "var convert = require('./convert'),\n    func = convert('trim', require('../trim'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/trimChars.js",
    "content": "var convert = require('./convert'),\n    func = convert('trimChars', require('../trim'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/trimCharsEnd.js",
    "content": "var convert = require('./convert'),\n    func = convert('trimCharsEnd', require('../trimEnd'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/trimCharsStart.js",
    "content": "var convert = require('./convert'),\n    func = convert('trimCharsStart', require('../trimStart'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/trimEnd.js",
    "content": "var convert = require('./convert'),\n    func = convert('trimEnd', require('../trimEnd'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/trimStart.js",
    "content": "var convert = require('./convert'),\n    func = convert('trimStart', require('../trimStart'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/truncate.js",
    "content": "var convert = require('./convert'),\n    func = convert('truncate', require('../truncate'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unapply.js",
    "content": "module.exports = require('./rest');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unary.js",
    "content": "var convert = require('./convert'),\n    func = convert('unary', require('../unary'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unescape.js",
    "content": "var convert = require('./convert'),\n    func = convert('unescape', require('../unescape'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/union.js",
    "content": "var convert = require('./convert'),\n    func = convert('union', require('../union'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unionBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('unionBy', require('../unionBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unionWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('unionWith', require('../unionWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/uniq.js",
    "content": "var convert = require('./convert'),\n    func = convert('uniq', require('../uniq'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/uniqBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('uniqBy', require('../uniqBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/uniqWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('uniqWith', require('../uniqWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/uniqueId.js",
    "content": "var convert = require('./convert'),\n    func = convert('uniqueId', require('../uniqueId'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unnest.js",
    "content": "module.exports = require('./flatten');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unset.js",
    "content": "var convert = require('./convert'),\n    func = convert('unset', require('../unset'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unzip.js",
    "content": "var convert = require('./convert'),\n    func = convert('unzip', require('../unzip'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/unzipWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('unzipWith', require('../unzipWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/update.js",
    "content": "var convert = require('./convert'),\n    func = convert('update', require('../update'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/updateWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('updateWith', require('../updateWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/upperCase.js",
    "content": "var convert = require('./convert'),\n    func = convert('upperCase', require('../upperCase'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/upperFirst.js",
    "content": "var convert = require('./convert'),\n    func = convert('upperFirst', require('../upperFirst'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/useWith.js",
    "content": "module.exports = require('./overArgs');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/util.js",
    "content": "var convert = require('./convert');\nmodule.exports = convert(require('../util'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/value.js",
    "content": "var convert = require('./convert'),\n    func = convert('value', require('../value'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/valueOf.js",
    "content": "var convert = require('./convert'),\n    func = convert('valueOf', require('../valueOf'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/values.js",
    "content": "var convert = require('./convert'),\n    func = convert('values', require('../values'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/valuesIn.js",
    "content": "var convert = require('./convert'),\n    func = convert('valuesIn', require('../valuesIn'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/where.js",
    "content": "module.exports = require('./conformsTo');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/whereEq.js",
    "content": "module.exports = require('./isMatch');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/without.js",
    "content": "var convert = require('./convert'),\n    func = convert('without', require('../without'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/words.js",
    "content": "var convert = require('./convert'),\n    func = convert('words', require('../words'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/wrap.js",
    "content": "var convert = require('./convert'),\n    func = convert('wrap', require('../wrap'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/wrapperAt.js",
    "content": "var convert = require('./convert'),\n    func = convert('wrapperAt', require('../wrapperAt'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/wrapperChain.js",
    "content": "var convert = require('./convert'),\n    func = convert('wrapperChain', require('../wrapperChain'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/wrapperLodash.js",
    "content": "var convert = require('./convert'),\n    func = convert('wrapperLodash', require('../wrapperLodash'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/wrapperReverse.js",
    "content": "var convert = require('./convert'),\n    func = convert('wrapperReverse', require('../wrapperReverse'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/wrapperValue.js",
    "content": "var convert = require('./convert'),\n    func = convert('wrapperValue', require('../wrapperValue'), require('./_falseOptions'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/xor.js",
    "content": "var convert = require('./convert'),\n    func = convert('xor', require('../xor'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/xorBy.js",
    "content": "var convert = require('./convert'),\n    func = convert('xorBy', require('../xorBy'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/xorWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('xorWith', require('../xorWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/zip.js",
    "content": "var convert = require('./convert'),\n    func = convert('zip', require('../zip'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/zipAll.js",
    "content": "var convert = require('./convert'),\n    func = convert('zipAll', require('../zip'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/zipObj.js",
    "content": "module.exports = require('./zipObject');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/zipObject.js",
    "content": "var convert = require('./convert'),\n    func = convert('zipObject', require('../zipObject'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/zipObjectDeep.js",
    "content": "var convert = require('./convert'),\n    func = convert('zipObjectDeep', require('../zipObjectDeep'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp/zipWith.js",
    "content": "var convert = require('./convert'),\n    func = convert('zipWith', require('../zipWith'));\n\nfunc.placeholder = require('./placeholder');\nmodule.exports = func;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fp.js",
    "content": "var _ = require('./lodash.min').runInContext();\nmodule.exports = require('./fp/_baseConvert')(_, _);\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/fromPairs.js",
    "content": "/**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\nfunction fromPairs(pairs) {\n  var index = -1,\n      length = pairs == null ? 0 : pairs.length,\n      result = {};\n\n  while (++index < length) {\n    var pair = pairs[index];\n    result[pair[0]] = pair[1];\n  }\n  return result;\n}\n\nmodule.exports = fromPairs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/function.js",
    "content": "module.exports = {\n  'after': require('./after'),\n  'ary': require('./ary'),\n  'before': require('./before'),\n  'bind': require('./bind'),\n  'bindKey': require('./bindKey'),\n  'curry': require('./curry'),\n  'curryRight': require('./curryRight'),\n  'debounce': require('./debounce'),\n  'defer': require('./defer'),\n  'delay': require('./delay'),\n  'flip': require('./flip'),\n  'memoize': require('./memoize'),\n  'negate': require('./negate'),\n  'once': require('./once'),\n  'overArgs': require('./overArgs'),\n  'partial': require('./partial'),\n  'partialRight': require('./partialRight'),\n  'rearg': require('./rearg'),\n  'rest': require('./rest'),\n  'spread': require('./spread'),\n  'throttle': require('./throttle'),\n  'unary': require('./unary'),\n  'wrap': require('./wrap')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/functions.js",
    "content": "var baseFunctions = require('./_baseFunctions'),\n    keys = require('./keys');\n\n/**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n *   this.a = _.constant('a');\n *   this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\nfunction functions(object) {\n  return object == null ? [] : baseFunctions(object, keys(object));\n}\n\nmodule.exports = functions;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/functionsIn.js",
    "content": "var baseFunctions = require('./_baseFunctions'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n *   this.a = _.constant('a');\n *   this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\nfunction functionsIn(object) {\n  return object == null ? [] : baseFunctions(object, keysIn(object));\n}\n\nmodule.exports = functionsIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/get.js",
    "content": "var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/groupBy.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    createAggregator = require('./_createAggregator');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n  if (hasOwnProperty.call(result, key)) {\n    result[key].push(value);\n  } else {\n    baseAssignValue(result, key, [value]);\n  }\n});\n\nmodule.exports = groupBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/gt.js",
    "content": "var baseGt = require('./_baseGt'),\n    createRelationalOperation = require('./_createRelationalOperation');\n\n/**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n *  else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\nvar gt = createRelationalOperation(baseGt);\n\nmodule.exports = gt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/gte.js",
    "content": "var createRelationalOperation = require('./_createRelationalOperation');\n\n/**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n *  `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\nvar gte = createRelationalOperation(function(value, other) {\n  return value >= other;\n});\n\nmodule.exports = gte;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/has.js",
    "content": "var baseHas = require('./_baseHas'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n  return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/hasIn.js",
    "content": "var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/head.js",
    "content": "/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n  return (array && array.length) ? array[0] : undefined;\n}\n\nmodule.exports = head;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/identity.js",
    "content": "/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/inRange.js",
    "content": "var baseInRange = require('./_baseInRange'),\n    toFinite = require('./toFinite'),\n    toNumber = require('./toNumber');\n\n/**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\nfunction inRange(number, start, end) {\n  start = toFinite(start);\n  if (end === undefined) {\n    end = start;\n    start = 0;\n  } else {\n    end = toFinite(end);\n  }\n  number = toNumber(number);\n  return baseInRange(number, start, end);\n}\n\nmodule.exports = inRange;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/includes.js",
    "content": "var baseIndexOf = require('./_baseIndexOf'),\n    isArrayLike = require('./isArrayLike'),\n    isString = require('./isString'),\n    toInteger = require('./toInteger'),\n    values = require('./values');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n  collection = isArrayLike(collection) ? collection : values(collection);\n  fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n  var length = collection.length;\n  if (fromIndex < 0) {\n    fromIndex = nativeMax(length + fromIndex, 0);\n  }\n  return isString(collection)\n    ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n    : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/index.js",
    "content": "module.exports = require('./lodash');"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/indexOf.js",
    "content": "var baseIndexOf = require('./_baseIndexOf'),\n    toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\nfunction indexOf(array, value, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = fromIndex == null ? 0 : toInteger(fromIndex);\n  if (index < 0) {\n    index = nativeMax(length + index, 0);\n  }\n  return baseIndexOf(array, value, index);\n}\n\nmodule.exports = indexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/initial.js",
    "content": "var baseSlice = require('./_baseSlice');\n\n/**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\nfunction initial(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseSlice(array, 0, -1) : [];\n}\n\nmodule.exports = initial;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/intersection.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseIntersection = require('./_baseIntersection'),\n    baseRest = require('./_baseRest'),\n    castArrayLikeObject = require('./_castArrayLikeObject');\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n  var mapped = arrayMap(arrays, castArrayLikeObject);\n  return (mapped.length && mapped[0] === arrays[0])\n    ? baseIntersection(mapped)\n    : [];\n});\n\nmodule.exports = intersection;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/intersectionBy.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseIntersection = require('./_baseIntersection'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    castArrayLikeObject = require('./_castArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\nvar intersectionBy = baseRest(function(arrays) {\n  var iteratee = last(arrays),\n      mapped = arrayMap(arrays, castArrayLikeObject);\n\n  if (iteratee === last(mapped)) {\n    iteratee = undefined;\n  } else {\n    mapped.pop();\n  }\n  return (mapped.length && mapped[0] === arrays[0])\n    ? baseIntersection(mapped, baseIteratee(iteratee, 2))\n    : [];\n});\n\nmodule.exports = intersectionBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/intersectionWith.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseIntersection = require('./_baseIntersection'),\n    baseRest = require('./_baseRest'),\n    castArrayLikeObject = require('./_castArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\nvar intersectionWith = baseRest(function(arrays) {\n  var comparator = last(arrays),\n      mapped = arrayMap(arrays, castArrayLikeObject);\n\n  comparator = typeof comparator == 'function' ? comparator : undefined;\n  if (comparator) {\n    mapped.pop();\n  }\n  return (mapped.length && mapped[0] === arrays[0])\n    ? baseIntersection(mapped, undefined, comparator)\n    : [];\n});\n\nmodule.exports = intersectionWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/invert.js",
    "content": "var constant = require('./constant'),\n    createInverter = require('./_createInverter'),\n    identity = require('./identity');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\nvar invert = createInverter(function(result, value, key) {\n  if (value != null &&\n      typeof value.toString != 'function') {\n    value = nativeObjectToString.call(value);\n  }\n\n  result[value] = key;\n}, constant(identity));\n\nmodule.exports = invert;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/invertBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    createInverter = require('./_createInverter');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n *   return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\nvar invertBy = createInverter(function(result, value, key) {\n  if (value != null &&\n      typeof value.toString != 'function') {\n    value = nativeObjectToString.call(value);\n  }\n\n  if (hasOwnProperty.call(result, value)) {\n    result[value].push(key);\n  } else {\n    result[value] = [key];\n  }\n}, baseIteratee);\n\nmodule.exports = invertBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/invoke.js",
    "content": "var baseInvoke = require('./_baseInvoke'),\n    baseRest = require('./_baseRest');\n\n/**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\nvar invoke = baseRest(baseInvoke);\n\nmodule.exports = invoke;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/invokeMap.js",
    "content": "var apply = require('./_apply'),\n    baseEach = require('./_baseEach'),\n    baseInvoke = require('./_baseInvoke'),\n    baseRest = require('./_baseRest'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n *  the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\nvar invokeMap = baseRest(function(collection, path, args) {\n  var index = -1,\n      isFunc = typeof path == 'function',\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value) {\n    result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n  });\n  return result;\n});\n\nmodule.exports = invokeMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isArguments.js",
    "content": "var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isArray.js",
    "content": "/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isArrayBuffer.js",
    "content": "var baseIsArrayBuffer = require('./_baseIsArrayBuffer'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer;\n\n/**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\nvar isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\nmodule.exports = isArrayBuffer;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isArrayLike.js",
    "content": "var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isArrayLikeObject.js",
    "content": "var isArrayLike = require('./isArrayLike'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isBoolean.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]';\n\n/**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\nfunction isBoolean(value) {\n  return value === true || value === false ||\n    (isObjectLike(value) && baseGetTag(value) == boolTag);\n}\n\nmodule.exports = isBoolean;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isBuffer.js",
    "content": "var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isDate.js",
    "content": "var baseIsDate = require('./_baseIsDate'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsDate = nodeUtil && nodeUtil.isDate;\n\n/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\nvar isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\nmodule.exports = isDate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isElement.js",
    "content": "var isObjectLike = require('./isObjectLike'),\n    isPlainObject = require('./isPlainObject');\n\n/**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */\nfunction isElement(value) {\n  return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n}\n\nmodule.exports = isElement;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isEmpty.js",
    "content": "var baseKeys = require('./_baseKeys'),\n    getTag = require('./_getTag'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isBuffer = require('./isBuffer'),\n    isPrototype = require('./_isPrototype'),\n    isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n  if (value == null) {\n    return true;\n  }\n  if (isArrayLike(value) &&\n      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n        isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n    return !value.length;\n  }\n  var tag = getTag(value);\n  if (tag == mapTag || tag == setTag) {\n    return !value.size;\n  }\n  if (isPrototype(value)) {\n    return !baseKeys(value).length;\n  }\n  for (var key in value) {\n    if (hasOwnProperty.call(value, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = isEmpty;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isEqual.js",
    "content": "var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isEqualWith.js",
    "content": "var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n *   return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n *   if (isGreeting(objValue) && isGreeting(othValue)) {\n *     return true;\n *   }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\nfunction isEqualWith(value, other, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  var result = customizer ? customizer(value, other) : undefined;\n  return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n}\n\nmodule.exports = isEqualWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isError.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike'),\n    isPlainObject = require('./isPlainObject');\n\n/** `Object#toString` result references. */\nvar domExcTag = '[object DOMException]',\n    errorTag = '[object Error]';\n\n/**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\nfunction isError(value) {\n  if (!isObjectLike(value)) {\n    return false;\n  }\n  var tag = baseGetTag(value);\n  return tag == errorTag || tag == domExcTag ||\n    (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n}\n\nmodule.exports = isError;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isFinite.js",
    "content": "var root = require('./_root');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsFinite = root.isFinite;\n\n/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\nfunction isFinite(value) {\n  return typeof value == 'number' && nativeIsFinite(value);\n}\n\nmodule.exports = isFinite;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isFunction.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isInteger.js",
    "content": "var toInteger = require('./toInteger');\n\n/**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\nfunction isInteger(value) {\n  return typeof value == 'number' && value == toInteger(value);\n}\n\nmodule.exports = isInteger;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isLength.js",
    "content": "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isMap.js",
    "content": "var baseIsMap = require('./_baseIsMap'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isMatch.js",
    "content": "var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData');\n\n/**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\nfunction isMatch(object, source) {\n  return object === source || baseIsMatch(object, source, getMatchData(source));\n}\n\nmodule.exports = isMatch;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isMatchWith.js",
    "content": "var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData');\n\n/**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n *   return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n *     return true;\n *   }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\nfunction isMatchWith(object, source, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  return baseIsMatch(object, source, getMatchData(source), customizer);\n}\n\nmodule.exports = isMatchWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isNaN.js",
    "content": "var isNumber = require('./isNumber');\n\n/**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\nfunction isNaN(value) {\n  // An `NaN` primitive is the only value that is not equal to itself.\n  // Perform the `toStringTag` check first to avoid errors with some\n  // ActiveX objects in IE.\n  return isNumber(value) && value != +value;\n}\n\nmodule.exports = isNaN;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isNative.js",
    "content": "var baseIsNative = require('./_baseIsNative'),\n    isMaskable = require('./_isMaskable');\n\n/** Error message constants. */\nvar CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.';\n\n/**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n  if (isMaskable(value)) {\n    throw new Error(CORE_ERROR_TEXT);\n  }\n  return baseIsNative(value);\n}\n\nmodule.exports = isNative;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isNil.js",
    "content": "/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n  return value == null;\n}\n\nmodule.exports = isNil;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isNull.js",
    "content": "/**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\nfunction isNull(value) {\n  return value === null;\n}\n\nmodule.exports = isNull;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isNumber.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n  return typeof value == 'number' ||\n    (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isObject.js",
    "content": "/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isObjectLike.js",
    "content": "/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isPlainObject.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    getPrototype = require('./_getPrototype'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isRegExp.js",
    "content": "var baseIsRegExp = require('./_baseIsRegExp'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isSafeInteger.js",
    "content": "var isInteger = require('./isInteger');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\nfunction isSafeInteger(value) {\n  return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isSafeInteger;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isSet.js",
    "content": "var baseIsSet = require('./_baseIsSet'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isString.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isArray = require('./isArray'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' ||\n    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isSymbol.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isTypedArray.js",
    "content": "var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isUndefined.js",
    "content": "/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n  return value === undefined;\n}\n\nmodule.exports = isUndefined;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isWeakMap.js",
    "content": "var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar weakMapTag = '[object WeakMap]';\n\n/**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\nfunction isWeakMap(value) {\n  return isObjectLike(value) && getTag(value) == weakMapTag;\n}\n\nmodule.exports = isWeakMap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/isWeakSet.js",
    "content": "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar weakSetTag = '[object WeakSet]';\n\n/**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\nfunction isWeakSet(value) {\n  return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n}\n\nmodule.exports = isWeakSet;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/iteratee.js",
    "content": "var baseClone = require('./_baseClone'),\n    baseIteratee = require('./_baseIteratee');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a function that invokes `func` with the arguments of the created\n * function. If `func` is a property name, the created function returns the\n * property value for a given element. If `func` is an array or object, the\n * created function returns `true` for elements that contain the equivalent\n * source properties, otherwise it returns `false`.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Util\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n *   { 'user': 'barney', 'age': 36, 'active': true },\n *   { 'user': 'fred',   'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, _.iteratee(['user', 'fred']));\n * // => [{ 'user': 'fred', 'age': 40 }]\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, _.iteratee('user'));\n * // => ['barney', 'fred']\n *\n * // Create custom iteratee shorthands.\n * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n *     return func.test(string);\n *   };\n * });\n *\n * _.filter(['abc', 'def'], /ef/);\n * // => ['def']\n */\nfunction iteratee(func) {\n  return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n}\n\nmodule.exports = iteratee;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/join.js",
    "content": "/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeJoin = arrayProto.join;\n\n/**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\nfunction join(array, separator) {\n  return array == null ? '' : nativeJoin.call(array, separator);\n}\n\nmodule.exports = join;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/kebabCase.js",
    "content": "var createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\nvar kebabCase = createCompounder(function(result, word, index) {\n  return result + (index ? '-' : '') + word.toLowerCase();\n});\n\nmodule.exports = kebabCase;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/keyBy.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    createAggregator = require('./_createAggregator');\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n *   { 'dir': 'left', 'code': 97 },\n *   { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n *   return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\nvar keyBy = createAggregator(function(result, value, key) {\n  baseAssignValue(result, key, value);\n});\n\nmodule.exports = keyBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/keys.js",
    "content": "var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/keysIn.js",
    "content": "var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeysIn = require('./_baseKeysIn'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lang.js",
    "content": "module.exports = {\n  'castArray': require('./castArray'),\n  'clone': require('./clone'),\n  'cloneDeep': require('./cloneDeep'),\n  'cloneDeepWith': require('./cloneDeepWith'),\n  'cloneWith': require('./cloneWith'),\n  'conformsTo': require('./conformsTo'),\n  'eq': require('./eq'),\n  'gt': require('./gt'),\n  'gte': require('./gte'),\n  'isArguments': require('./isArguments'),\n  'isArray': require('./isArray'),\n  'isArrayBuffer': require('./isArrayBuffer'),\n  'isArrayLike': require('./isArrayLike'),\n  'isArrayLikeObject': require('./isArrayLikeObject'),\n  'isBoolean': require('./isBoolean'),\n  'isBuffer': require('./isBuffer'),\n  'isDate': require('./isDate'),\n  'isElement': require('./isElement'),\n  'isEmpty': require('./isEmpty'),\n  'isEqual': require('./isEqual'),\n  'isEqualWith': require('./isEqualWith'),\n  'isError': require('./isError'),\n  'isFinite': require('./isFinite'),\n  'isFunction': require('./isFunction'),\n  'isInteger': require('./isInteger'),\n  'isLength': require('./isLength'),\n  'isMap': require('./isMap'),\n  'isMatch': require('./isMatch'),\n  'isMatchWith': require('./isMatchWith'),\n  'isNaN': require('./isNaN'),\n  'isNative': require('./isNative'),\n  'isNil': require('./isNil'),\n  'isNull': require('./isNull'),\n  'isNumber': require('./isNumber'),\n  'isObject': require('./isObject'),\n  'isObjectLike': require('./isObjectLike'),\n  'isPlainObject': require('./isPlainObject'),\n  'isRegExp': require('./isRegExp'),\n  'isSafeInteger': require('./isSafeInteger'),\n  'isSet': require('./isSet'),\n  'isString': require('./isString'),\n  'isSymbol': require('./isSymbol'),\n  'isTypedArray': require('./isTypedArray'),\n  'isUndefined': require('./isUndefined'),\n  'isWeakMap': require('./isWeakMap'),\n  'isWeakSet': require('./isWeakSet'),\n  'lt': require('./lt'),\n  'lte': require('./lte'),\n  'toArray': require('./toArray'),\n  'toFinite': require('./toFinite'),\n  'toInteger': require('./toInteger'),\n  'toLength': require('./toLength'),\n  'toNumber': require('./toNumber'),\n  'toPlainObject': require('./toPlainObject'),\n  'toSafeInteger': require('./toSafeInteger'),\n  'toString': require('./toString')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/last.js",
    "content": "/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lastIndexOf.js",
    "content": "var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictLastIndexOf = require('./_strictLastIndexOf'),\n    toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\nfunction lastIndexOf(array, value, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = length;\n  if (fromIndex !== undefined) {\n    index = toInteger(fromIndex);\n    index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n  }\n  return value === value\n    ? strictLastIndexOf(array, value, index)\n    : baseFindIndex(array, baseIsNaN, index, true);\n}\n\nmodule.exports = lastIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lodash.js",
    "content": "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lodash.min.js",
    "content": "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function r(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&t(n[r],r,n)!==!1;);return n}function e(n,t){for(var r=null==n?0:n.length;r--&&t(n[r],r,n)!==!1;);return n}function u(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return!1;\nreturn!0}function i(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function o(n,t){return!!(null==n?0:n.length)&&y(n,t,0)>-1}function f(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return!0;return!1}function c(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function a(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function l(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);\nreturn r}function s(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function h(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return!0;return!1}function p(n){return n.split(\"\")}function _(n){return n.match($t)||[]}function v(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function g(n,t,r,e){for(var u=n.length,i=r+(e?1:-1);e?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function y(n,t,r){return t===t?Z(n,t,r):g(n,b,r)}function d(n,t,r,e){\nfor(var u=r-1,i=n.length;++u<i;)if(e(n[u],t))return u;return-1}function b(n){return n!==n}function w(n,t){var r=null==n?0:n.length;return r?k(n,t)/r:Cn}function m(n){return function(t){return null==t?X:t[n]}}function x(n){return function(t){return null==n?X:n[t]}}function j(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function A(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==X&&(r=r===X?i:r+i);\n}return r}function O(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function I(n,t){return c(t,function(t){return[t,n[t]]})}function R(n){return n?n.slice(0,H(n)+1).replace(Lt,\"\"):n}function z(n){return function(t){return n(t)}}function E(n,t){return c(t,function(t){return n[t]})}function S(n,t){return n.has(t)}function W(n,t){for(var r=-1,e=n.length;++r<e&&y(t,n[r],0)>-1;);return r}function L(n,t){for(var r=n.length;r--&&y(t,n[r],0)>-1;);return r}function C(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;\nreturn e}function U(n){return\"\\\\\"+Yr[n]}function B(n,t){return null==n?X:n[t]}function T(n){return Nr.test(n)}function $(n){return Pr.test(n)}function D(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function F(n,t){return function(r){return n(t(r))}}function N(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&o!==cn||(n[r]=cn,i[u++]=r)}return i}function P(n){var t=-1,r=Array(n.size);\nreturn n.forEach(function(n){r[++t]=n}),r}function q(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function Z(n,t,r){for(var e=r-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function K(n,t,r){for(var e=r+1;e--;)if(n[e]===t)return e;return e}function V(n){return T(n)?J(n):_e(n)}function G(n){return T(n)?Y(n):p(n)}function H(n){for(var t=n.length;t--&&Ct.test(n.charAt(t)););return t}function J(n){for(var t=Mr.lastIndex=0;Mr.test(n);)++t;return t}function Y(n){return n.match(Mr)||[];\n}function Q(n){return n.match(Fr)||[]}var X,nn=\"4.17.21\",tn=200,rn=\"Unsupported core-js use. Try https://npms.io/search?q=ponyfill.\",en=\"Expected a function\",un=\"Invalid `variable` option passed into `_.template`\",on=\"__lodash_hash_undefined__\",fn=500,cn=\"__lodash_placeholder__\",an=1,ln=2,sn=4,hn=1,pn=2,_n=1,vn=2,gn=4,yn=8,dn=16,bn=32,wn=64,mn=128,xn=256,jn=512,An=30,kn=\"...\",On=800,In=16,Rn=1,zn=2,En=3,Sn=1/0,Wn=9007199254740991,Ln=1.7976931348623157e308,Cn=NaN,Un=4294967295,Bn=Un-1,Tn=Un>>>1,$n=[[\"ary\",mn],[\"bind\",_n],[\"bindKey\",vn],[\"curry\",yn],[\"curryRight\",dn],[\"flip\",jn],[\"partial\",bn],[\"partialRight\",wn],[\"rearg\",xn]],Dn=\"[object Arguments]\",Mn=\"[object Array]\",Fn=\"[object AsyncFunction]\",Nn=\"[object Boolean]\",Pn=\"[object Date]\",qn=\"[object DOMException]\",Zn=\"[object Error]\",Kn=\"[object Function]\",Vn=\"[object GeneratorFunction]\",Gn=\"[object Map]\",Hn=\"[object Number]\",Jn=\"[object Null]\",Yn=\"[object Object]\",Qn=\"[object Promise]\",Xn=\"[object Proxy]\",nt=\"[object RegExp]\",tt=\"[object Set]\",rt=\"[object String]\",et=\"[object Symbol]\",ut=\"[object Undefined]\",it=\"[object WeakMap]\",ot=\"[object WeakSet]\",ft=\"[object ArrayBuffer]\",ct=\"[object DataView]\",at=\"[object Float32Array]\",lt=\"[object Float64Array]\",st=\"[object Int8Array]\",ht=\"[object Int16Array]\",pt=\"[object Int32Array]\",_t=\"[object Uint8Array]\",vt=\"[object Uint8ClampedArray]\",gt=\"[object Uint16Array]\",yt=\"[object Uint32Array]\",dt=/\\b__p \\+= '';/g,bt=/\\b(__p \\+=) '' \\+/g,wt=/(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g,mt=/&(?:amp|lt|gt|quot|#39);/g,xt=/[&<>\"']/g,jt=RegExp(mt.source),At=RegExp(xt.source),kt=/<%-([\\s\\S]+?)%>/g,Ot=/<%([\\s\\S]+?)%>/g,It=/<%=([\\s\\S]+?)%>/g,Rt=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,zt=/^\\w*$/,Et=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,St=/[\\\\^$.*+?()[\\]{}|]/g,Wt=RegExp(St.source),Lt=/^\\s+/,Ct=/\\s/,Ut=/\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,Bt=/\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,Tt=/,? & /,$t=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,Dt=/[()=,{}\\[\\]\\/\\s]/,Mt=/\\\\(\\\\)?/g,Ft=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,Nt=/\\w*$/,Pt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Zt=/^\\[object .+?Constructor\\]$/,Kt=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\\d*)$/,Gt=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,Ht=/($^)/,Jt=/['\\n\\r\\u2028\\u2029\\\\]/g,Yt=\"\\\\ud800-\\\\udfff\",Qt=\"\\\\u0300-\\\\u036f\",Xt=\"\\\\ufe20-\\\\ufe2f\",nr=\"\\\\u20d0-\\\\u20ff\",tr=Qt+Xt+nr,rr=\"\\\\u2700-\\\\u27bf\",er=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",ur=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\",ir=\"\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\",or=\"\\\\u2000-\\\\u206f\",fr=\" \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",cr=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",ar=\"\\\\ufe0e\\\\ufe0f\",lr=ur+ir+or+fr,sr=\"['\\u2019]\",hr=\"[\"+Yt+\"]\",pr=\"[\"+lr+\"]\",_r=\"[\"+tr+\"]\",vr=\"\\\\d+\",gr=\"[\"+rr+\"]\",yr=\"[\"+er+\"]\",dr=\"[^\"+Yt+lr+vr+rr+er+cr+\"]\",br=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",wr=\"(?:\"+_r+\"|\"+br+\")\",mr=\"[^\"+Yt+\"]\",xr=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",jr=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Ar=\"[\"+cr+\"]\",kr=\"\\\\u200d\",Or=\"(?:\"+yr+\"|\"+dr+\")\",Ir=\"(?:\"+Ar+\"|\"+dr+\")\",Rr=\"(?:\"+sr+\"(?:d|ll|m|re|s|t|ve))?\",zr=\"(?:\"+sr+\"(?:D|LL|M|RE|S|T|VE))?\",Er=wr+\"?\",Sr=\"[\"+ar+\"]?\",Wr=\"(?:\"+kr+\"(?:\"+[mr,xr,jr].join(\"|\")+\")\"+Sr+Er+\")*\",Lr=\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",Cr=\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",Ur=Sr+Er+Wr,Br=\"(?:\"+[gr,xr,jr].join(\"|\")+\")\"+Ur,Tr=\"(?:\"+[mr+_r+\"?\",_r,xr,jr,hr].join(\"|\")+\")\",$r=RegExp(sr,\"g\"),Dr=RegExp(_r,\"g\"),Mr=RegExp(br+\"(?=\"+br+\")|\"+Tr+Ur,\"g\"),Fr=RegExp([Ar+\"?\"+yr+\"+\"+Rr+\"(?=\"+[pr,Ar,\"$\"].join(\"|\")+\")\",Ir+\"+\"+zr+\"(?=\"+[pr,Ar+Or,\"$\"].join(\"|\")+\")\",Ar+\"?\"+Or+\"+\"+Rr,Ar+\"+\"+zr,Cr,Lr,vr,Br].join(\"|\"),\"g\"),Nr=RegExp(\"[\"+kr+Yt+tr+ar+\"]\"),Pr=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,qr=[\"Array\",\"Buffer\",\"DataView\",\"Date\",\"Error\",\"Float32Array\",\"Float64Array\",\"Function\",\"Int8Array\",\"Int16Array\",\"Int32Array\",\"Map\",\"Math\",\"Object\",\"Promise\",\"RegExp\",\"Set\",\"String\",\"Symbol\",\"TypeError\",\"Uint8Array\",\"Uint8ClampedArray\",\"Uint16Array\",\"Uint32Array\",\"WeakMap\",\"_\",\"clearTimeout\",\"isFinite\",\"parseInt\",\"setTimeout\"],Zr=-1,Kr={};\nKr[at]=Kr[lt]=Kr[st]=Kr[ht]=Kr[pt]=Kr[_t]=Kr[vt]=Kr[gt]=Kr[yt]=!0,Kr[Dn]=Kr[Mn]=Kr[ft]=Kr[Nn]=Kr[ct]=Kr[Pn]=Kr[Zn]=Kr[Kn]=Kr[Gn]=Kr[Hn]=Kr[Yn]=Kr[nt]=Kr[tt]=Kr[rt]=Kr[it]=!1;var Vr={};Vr[Dn]=Vr[Mn]=Vr[ft]=Vr[ct]=Vr[Nn]=Vr[Pn]=Vr[at]=Vr[lt]=Vr[st]=Vr[ht]=Vr[pt]=Vr[Gn]=Vr[Hn]=Vr[Yn]=Vr[nt]=Vr[tt]=Vr[rt]=Vr[et]=Vr[_t]=Vr[vt]=Vr[gt]=Vr[yt]=!0,Vr[Zn]=Vr[Kn]=Vr[it]=!1;var Gr={\"\\xc0\":\"A\",\"\\xc1\":\"A\",\"\\xc2\":\"A\",\"\\xc3\":\"A\",\"\\xc4\":\"A\",\"\\xc5\":\"A\",\"\\xe0\":\"a\",\"\\xe1\":\"a\",\"\\xe2\":\"a\",\"\\xe3\":\"a\",\"\\xe4\":\"a\",\"\\xe5\":\"a\",\n\"\\xc7\":\"C\",\"\\xe7\":\"c\",\"\\xd0\":\"D\",\"\\xf0\":\"d\",\"\\xc8\":\"E\",\"\\xc9\":\"E\",\"\\xca\":\"E\",\"\\xcb\":\"E\",\"\\xe8\":\"e\",\"\\xe9\":\"e\",\"\\xea\":\"e\",\"\\xeb\":\"e\",\"\\xcc\":\"I\",\"\\xcd\":\"I\",\"\\xce\":\"I\",\"\\xcf\":\"I\",\"\\xec\":\"i\",\"\\xed\":\"i\",\"\\xee\":\"i\",\"\\xef\":\"i\",\"\\xd1\":\"N\",\"\\xf1\":\"n\",\"\\xd2\":\"O\",\"\\xd3\":\"O\",\"\\xd4\":\"O\",\"\\xd5\":\"O\",\"\\xd6\":\"O\",\"\\xd8\":\"O\",\"\\xf2\":\"o\",\"\\xf3\":\"o\",\"\\xf4\":\"o\",\"\\xf5\":\"o\",\"\\xf6\":\"o\",\"\\xf8\":\"o\",\"\\xd9\":\"U\",\"\\xda\":\"U\",\"\\xdb\":\"U\",\"\\xdc\":\"U\",\"\\xf9\":\"u\",\"\\xfa\":\"u\",\"\\xfb\":\"u\",\"\\xfc\":\"u\",\"\\xdd\":\"Y\",\"\\xfd\":\"y\",\"\\xff\":\"y\",\"\\xc6\":\"Ae\",\n\"\\xe6\":\"ae\",\"\\xde\":\"Th\",\"\\xfe\":\"th\",\"\\xdf\":\"ss\",\"\\u0100\":\"A\",\"\\u0102\":\"A\",\"\\u0104\":\"A\",\"\\u0101\":\"a\",\"\\u0103\":\"a\",\"\\u0105\":\"a\",\"\\u0106\":\"C\",\"\\u0108\":\"C\",\"\\u010a\":\"C\",\"\\u010c\":\"C\",\"\\u0107\":\"c\",\"\\u0109\":\"c\",\"\\u010b\":\"c\",\"\\u010d\":\"c\",\"\\u010e\":\"D\",\"\\u0110\":\"D\",\"\\u010f\":\"d\",\"\\u0111\":\"d\",\"\\u0112\":\"E\",\"\\u0114\":\"E\",\"\\u0116\":\"E\",\"\\u0118\":\"E\",\"\\u011a\":\"E\",\"\\u0113\":\"e\",\"\\u0115\":\"e\",\"\\u0117\":\"e\",\"\\u0119\":\"e\",\"\\u011b\":\"e\",\"\\u011c\":\"G\",\"\\u011e\":\"G\",\"\\u0120\":\"G\",\"\\u0122\":\"G\",\"\\u011d\":\"g\",\"\\u011f\":\"g\",\"\\u0121\":\"g\",\n\"\\u0123\":\"g\",\"\\u0124\":\"H\",\"\\u0126\":\"H\",\"\\u0125\":\"h\",\"\\u0127\":\"h\",\"\\u0128\":\"I\",\"\\u012a\":\"I\",\"\\u012c\":\"I\",\"\\u012e\":\"I\",\"\\u0130\":\"I\",\"\\u0129\":\"i\",\"\\u012b\":\"i\",\"\\u012d\":\"i\",\"\\u012f\":\"i\",\"\\u0131\":\"i\",\"\\u0134\":\"J\",\"\\u0135\":\"j\",\"\\u0136\":\"K\",\"\\u0137\":\"k\",\"\\u0138\":\"k\",\"\\u0139\":\"L\",\"\\u013b\":\"L\",\"\\u013d\":\"L\",\"\\u013f\":\"L\",\"\\u0141\":\"L\",\"\\u013a\":\"l\",\"\\u013c\":\"l\",\"\\u013e\":\"l\",\"\\u0140\":\"l\",\"\\u0142\":\"l\",\"\\u0143\":\"N\",\"\\u0145\":\"N\",\"\\u0147\":\"N\",\"\\u014a\":\"N\",\"\\u0144\":\"n\",\"\\u0146\":\"n\",\"\\u0148\":\"n\",\"\\u014b\":\"n\",\"\\u014c\":\"O\",\n\"\\u014e\":\"O\",\"\\u0150\":\"O\",\"\\u014d\":\"o\",\"\\u014f\":\"o\",\"\\u0151\":\"o\",\"\\u0154\":\"R\",\"\\u0156\":\"R\",\"\\u0158\":\"R\",\"\\u0155\":\"r\",\"\\u0157\":\"r\",\"\\u0159\":\"r\",\"\\u015a\":\"S\",\"\\u015c\":\"S\",\"\\u015e\":\"S\",\"\\u0160\":\"S\",\"\\u015b\":\"s\",\"\\u015d\":\"s\",\"\\u015f\":\"s\",\"\\u0161\":\"s\",\"\\u0162\":\"T\",\"\\u0164\":\"T\",\"\\u0166\":\"T\",\"\\u0163\":\"t\",\"\\u0165\":\"t\",\"\\u0167\":\"t\",\"\\u0168\":\"U\",\"\\u016a\":\"U\",\"\\u016c\":\"U\",\"\\u016e\":\"U\",\"\\u0170\":\"U\",\"\\u0172\":\"U\",\"\\u0169\":\"u\",\"\\u016b\":\"u\",\"\\u016d\":\"u\",\"\\u016f\":\"u\",\"\\u0171\":\"u\",\"\\u0173\":\"u\",\"\\u0174\":\"W\",\"\\u0175\":\"w\",\n\"\\u0176\":\"Y\",\"\\u0177\":\"y\",\"\\u0178\":\"Y\",\"\\u0179\":\"Z\",\"\\u017b\":\"Z\",\"\\u017d\":\"Z\",\"\\u017a\":\"z\",\"\\u017c\":\"z\",\"\\u017e\":\"z\",\"\\u0132\":\"IJ\",\"\\u0133\":\"ij\",\"\\u0152\":\"Oe\",\"\\u0153\":\"oe\",\"\\u0149\":\"'n\",\"\\u017f\":\"s\"},Hr={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},Jr={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&#39;\":\"'\"},Yr={\"\\\\\":\"\\\\\",\"'\":\"'\",\"\\n\":\"n\",\"\\r\":\"r\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},Qr=parseFloat,Xr=parseInt,ne=\"object\"==typeof global&&global&&global.Object===Object&&global,te=\"object\"==typeof self&&self&&self.Object===Object&&self,re=ne||te||Function(\"return this\")(),ee=\"object\"==typeof exports&&exports&&!exports.nodeType&&exports,ue=ee&&\"object\"==typeof module&&module&&!module.nodeType&&module,ie=ue&&ue.exports===ee,oe=ie&&ne.process,fe=function(){\ntry{var n=ue&&ue.require&&ue.require(\"util\").types;return n?n:oe&&oe.binding&&oe.binding(\"util\")}catch(n){}}(),ce=fe&&fe.isArrayBuffer,ae=fe&&fe.isDate,le=fe&&fe.isMap,se=fe&&fe.isRegExp,he=fe&&fe.isSet,pe=fe&&fe.isTypedArray,_e=m(\"length\"),ve=x(Gr),ge=x(Hr),ye=x(Jr),de=function p(x){function Z(n){if(cc(n)&&!bh(n)&&!(n instanceof Ct)){if(n instanceof Y)return n;if(bl.call(n,\"__wrapped__\"))return eo(n)}return new Y(n)}function J(){}function Y(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,\nthis.__index__=0,this.__values__=X}function Ct(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Un,this.__views__=[]}function $t(){var n=new Ct(this.__wrapped__);return n.__actions__=Tu(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Tu(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Tu(this.__views__),n}function Yt(){if(this.__filtered__){var n=new Ct(this);n.__dir__=-1,\nn.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n}function Qt(){var n=this.__wrapped__.value(),t=this.__dir__,r=bh(n),e=t<0,u=r?n.length:0,i=Oi(0,u,this.__views__),o=i.start,f=i.end,c=f-o,a=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=Hl(c,this.__takeCount__);if(!r||!e&&u==c&&p==c)return wu(n,this.__actions__);var _=[];n:for(;c--&&h<p;){a+=t;for(var v=-1,g=n[a];++v<s;){var y=l[v],d=y.iteratee,b=y.type,w=d(g);if(b==zn)g=w;else if(!w){if(b==Rn)continue n;break n}}_[h++]=g}return _}function Xt(n){\nvar t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function nr(){this.__data__=is?is(null):{},this.size=0}function tr(n){var t=this.has(n)&&delete this.__data__[n];return this.size-=t?1:0,t}function rr(n){var t=this.__data__;if(is){var r=t[n];return r===on?X:r}return bl.call(t,n)?t[n]:X}function er(n){var t=this.__data__;return is?t[n]!==X:bl.call(t,n)}function ur(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=is&&t===X?on:t,this}function ir(n){\nvar t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function or(){this.__data__=[],this.size=0}function fr(n){var t=this.__data__,r=Wr(t,n);return!(r<0)&&(r==t.length-1?t.pop():Ll.call(t,r,1),--this.size,!0)}function cr(n){var t=this.__data__,r=Wr(t,n);return r<0?X:t[r][1]}function ar(n){return Wr(this.__data__,n)>-1}function lr(n,t){var r=this.__data__,e=Wr(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this}function sr(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){\nvar e=n[t];this.set(e[0],e[1])}}function hr(){this.size=0,this.__data__={hash:new Xt,map:new(ts||ir),string:new Xt}}function pr(n){var t=xi(this,n).delete(n);return this.size-=t?1:0,t}function _r(n){return xi(this,n).get(n)}function vr(n){return xi(this,n).has(n)}function gr(n,t){var r=xi(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this}function yr(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new sr;++t<r;)this.add(n[t])}function dr(n){return this.__data__.set(n,on),this}function br(n){\nreturn this.__data__.has(n)}function wr(n){this.size=(this.__data__=new ir(n)).size}function mr(){this.__data__=new ir,this.size=0}function xr(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r}function jr(n){return this.__data__.get(n)}function Ar(n){return this.__data__.has(n)}function kr(n,t){var r=this.__data__;if(r instanceof ir){var e=r.__data__;if(!ts||e.length<tn-1)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new sr(e)}return r.set(n,t),this.size=r.size,this}function Or(n,t){\nvar r=bh(n),e=!r&&dh(n),u=!r&&!e&&mh(n),i=!r&&!e&&!u&&Oh(n),o=r||e||u||i,f=o?O(n.length,hl):[],c=f.length;for(var a in n)!t&&!bl.call(n,a)||o&&(\"length\"==a||u&&(\"offset\"==a||\"parent\"==a)||i&&(\"buffer\"==a||\"byteLength\"==a||\"byteOffset\"==a)||Ci(a,c))||f.push(a);return f}function Ir(n){var t=n.length;return t?n[tu(0,t-1)]:X}function Rr(n,t){return Xi(Tu(n),Mr(t,0,n.length))}function zr(n){return Xi(Tu(n))}function Er(n,t,r){(r===X||Gf(n[t],r))&&(r!==X||t in n)||Br(n,t,r)}function Sr(n,t,r){var e=n[t];\nbl.call(n,t)&&Gf(e,r)&&(r!==X||t in n)||Br(n,t,r)}function Wr(n,t){for(var r=n.length;r--;)if(Gf(n[r][0],t))return r;return-1}function Lr(n,t,r,e){return ys(n,function(n,u,i){t(e,n,r(n),i)}),e}function Cr(n,t){return n&&$u(t,Pc(t),n)}function Ur(n,t){return n&&$u(t,qc(t),n)}function Br(n,t,r){\"__proto__\"==t&&Tl?Tl(n,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):n[t]=r}function Tr(n,t){for(var r=-1,e=t.length,u=il(e),i=null==n;++r<e;)u[r]=i?X:Mc(n,t[r]);return u}function Mr(n,t,r){return n===n&&(r!==X&&(n=n<=r?n:r),\nt!==X&&(n=n>=t?n:t)),n}function Fr(n,t,e,u,i,o){var f,c=t&an,a=t&ln,l=t&sn;if(e&&(f=i?e(n,u,i,o):e(n)),f!==X)return f;if(!fc(n))return n;var s=bh(n);if(s){if(f=zi(n),!c)return Tu(n,f)}else{var h=zs(n),p=h==Kn||h==Vn;if(mh(n))return Iu(n,c);if(h==Yn||h==Dn||p&&!i){if(f=a||p?{}:Ei(n),!c)return a?Mu(n,Ur(f,n)):Du(n,Cr(f,n))}else{if(!Vr[h])return i?n:{};f=Si(n,h,c)}}o||(o=new wr);var _=o.get(n);if(_)return _;o.set(n,f),kh(n)?n.forEach(function(r){f.add(Fr(r,t,e,r,n,o))}):jh(n)&&n.forEach(function(r,u){\nf.set(u,Fr(r,t,e,u,n,o))});var v=l?a?di:yi:a?qc:Pc,g=s?X:v(n);return r(g||n,function(r,u){g&&(u=r,r=n[u]),Sr(f,u,Fr(r,t,e,u,n,o))}),f}function Nr(n){var t=Pc(n);return function(r){return Pr(r,n,t)}}function Pr(n,t,r){var e=r.length;if(null==n)return!e;for(n=ll(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===X&&!(u in n)||!i(o))return!1}return!0}function Gr(n,t,r){if(\"function\"!=typeof n)throw new pl(en);return Ws(function(){n.apply(X,r)},t)}function Hr(n,t,r,e){var u=-1,i=o,a=!0,l=n.length,s=[],h=t.length;\nif(!l)return s;r&&(t=c(t,z(r))),e?(i=f,a=!1):t.length>=tn&&(i=S,a=!1,t=new yr(t));n:for(;++u<l;){var p=n[u],_=null==r?p:r(p);if(p=e||0!==p?p:0,a&&_===_){for(var v=h;v--;)if(t[v]===_)continue n;s.push(p)}else i(t,_,e)||s.push(p)}return s}function Jr(n,t){var r=!0;return ys(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Yr(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===X?o===o&&!bc(o):r(o,f)))var f=o,c=i}return c}function ne(n,t,r,e){var u=n.length;for(r=kc(r),r<0&&(r=-r>u?0:u+r),\ne=e===X||e>u?u:kc(e),e<0&&(e+=u),e=r>e?0:Oc(e);r<e;)n[r++]=t;return n}function te(n,t){var r=[];return ys(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function ee(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=Li),u||(u=[]);++i<o;){var f=n[i];t>0&&r(f)?t>1?ee(f,t-1,r,e,u):a(u,f):e||(u[u.length]=f)}return u}function ue(n,t){return n&&bs(n,t,Pc)}function oe(n,t){return n&&ws(n,t,Pc)}function fe(n,t){return i(t,function(t){return uc(n[t])})}function _e(n,t){t=ku(t,n);for(var r=0,e=t.length;null!=n&&r<e;)n=n[no(t[r++])];\nreturn r&&r==e?n:X}function de(n,t,r){var e=t(n);return bh(n)?e:a(e,r(n))}function we(n){return null==n?n===X?ut:Jn:Bl&&Bl in ll(n)?ki(n):Ki(n)}function me(n,t){return n>t}function xe(n,t){return null!=n&&bl.call(n,t)}function je(n,t){return null!=n&&t in ll(n)}function Ae(n,t,r){return n>=Hl(t,r)&&n<Gl(t,r)}function ke(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=il(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,z(t))),s=Hl(p.length,s),l[a]=!r&&(t||u>=120&&p.length>=120)?new yr(a&&p):X}p=n[0];\nvar _=-1,v=l[0];n:for(;++_<u&&h.length<s;){var g=p[_],y=t?t(g):g;if(g=r||0!==g?g:0,!(v?S(v,y):e(h,y,r))){for(a=i;--a;){var d=l[a];if(!(d?S(d,y):e(n[a],y,r)))continue n}v&&v.push(y),h.push(g)}}return h}function Oe(n,t,r,e){return ue(n,function(n,u,i){t(e,r(n),u,i)}),e}function Ie(t,r,e){r=ku(r,t),t=Gi(t,r);var u=null==t?t:t[no(jo(r))];return null==u?X:n(u,t,e)}function Re(n){return cc(n)&&we(n)==Dn}function ze(n){return cc(n)&&we(n)==ft}function Ee(n){return cc(n)&&we(n)==Pn}function Se(n,t,r,e,u){\nreturn n===t||(null==n||null==t||!cc(n)&&!cc(t)?n!==n&&t!==t:We(n,t,r,e,Se,u))}function We(n,t,r,e,u,i){var o=bh(n),f=bh(t),c=o?Mn:zs(n),a=f?Mn:zs(t);c=c==Dn?Yn:c,a=a==Dn?Yn:a;var l=c==Yn,s=a==Yn,h=c==a;if(h&&mh(n)){if(!mh(t))return!1;o=!0,l=!1}if(h&&!l)return i||(i=new wr),o||Oh(n)?pi(n,t,r,e,u,i):_i(n,t,c,r,e,u,i);if(!(r&hn)){var p=l&&bl.call(n,\"__wrapped__\"),_=s&&bl.call(t,\"__wrapped__\");if(p||_){var v=p?n.value():n,g=_?t.value():t;return i||(i=new wr),u(v,g,r,e,i)}}return!!h&&(i||(i=new wr),vi(n,t,r,e,u,i));\n}function Le(n){return cc(n)&&zs(n)==Gn}function Ce(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=ll(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++u<i;){f=r[u];var c=f[0],a=n[c],l=f[1];if(o&&f[2]){if(a===X&&!(c in n))return!1}else{var s=new wr;if(e)var h=e(a,l,c,n,t,s);if(!(h===X?Se(l,a,hn|pn,e,s):h))return!1}}return!0}function Ue(n){return!(!fc(n)||Di(n))&&(uc(n)?kl:Zt).test(to(n))}function Be(n){return cc(n)&&we(n)==nt}function Te(n){return cc(n)&&zs(n)==tt;\n}function $e(n){return cc(n)&&oc(n.length)&&!!Kr[we(n)]}function De(n){return\"function\"==typeof n?n:null==n?La:\"object\"==typeof n?bh(n)?Ze(n[0],n[1]):qe(n):Fa(n)}function Me(n){if(!Mi(n))return Vl(n);var t=[];for(var r in ll(n))bl.call(n,r)&&\"constructor\"!=r&&t.push(r);return t}function Fe(n){if(!fc(n))return Zi(n);var t=Mi(n),r=[];for(var e in n)(\"constructor\"!=e||!t&&bl.call(n,e))&&r.push(e);return r}function Ne(n,t){return n<t}function Pe(n,t){var r=-1,e=Hf(n)?il(n.length):[];return ys(n,function(n,u,i){\ne[++r]=t(n,u,i)}),e}function qe(n){var t=ji(n);return 1==t.length&&t[0][2]?Ni(t[0][0],t[0][1]):function(r){return r===n||Ce(r,n,t)}}function Ze(n,t){return Bi(n)&&Fi(t)?Ni(no(n),t):function(r){var e=Mc(r,n);return e===X&&e===t?Nc(r,n):Se(t,e,hn|pn)}}function Ke(n,t,r,e,u){n!==t&&bs(t,function(i,o){if(u||(u=new wr),fc(i))Ve(n,t,o,r,Ke,e,u);else{var f=e?e(Ji(n,o),i,o+\"\",n,t,u):X;f===X&&(f=i),Er(n,o,f)}},qc)}function Ve(n,t,r,e,u,i,o){var f=Ji(n,r),c=Ji(t,r),a=o.get(c);if(a)return Er(n,r,a),X;var l=i?i(f,c,r+\"\",n,t,o):X,s=l===X;\nif(s){var h=bh(c),p=!h&&mh(c),_=!h&&!p&&Oh(c);l=c,h||p||_?bh(f)?l=f:Jf(f)?l=Tu(f):p?(s=!1,l=Iu(c,!0)):_?(s=!1,l=Wu(c,!0)):l=[]:gc(c)||dh(c)?(l=f,dh(f)?l=Rc(f):fc(f)&&!uc(f)||(l=Ei(c))):s=!1}s&&(o.set(c,l),u(l,c,e,i,o),o.delete(c)),Er(n,r,l)}function Ge(n,t){var r=n.length;if(r)return t+=t<0?r:0,Ci(t,r)?n[t]:X}function He(n,t,r){t=t.length?c(t,function(n){return bh(n)?function(t){return _e(t,1===n.length?n[0]:n)}:n}):[La];var e=-1;return t=c(t,z(mi())),A(Pe(n,function(n,r,u){return{criteria:c(t,function(t){\nreturn t(n)}),index:++e,value:n}}),function(n,t){return Cu(n,t,r)})}function Je(n,t){return Ye(n,t,function(t,r){return Nc(n,r)})}function Ye(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],f=_e(n,o);r(f,o)&&fu(i,ku(o,n),f)}return i}function Qe(n){return function(t){return _e(t,n)}}function Xe(n,t,r,e){var u=e?d:y,i=-1,o=t.length,f=n;for(n===t&&(t=Tu(t)),r&&(f=c(n,z(r)));++i<o;)for(var a=0,l=t[i],s=r?r(l):l;(a=u(f,s,a,e))>-1;)f!==n&&Ll.call(f,a,1),Ll.call(n,a,1);return n}function nu(n,t){for(var r=n?t.length:0,e=r-1;r--;){\nvar u=t[r];if(r==e||u!==i){var i=u;Ci(u)?Ll.call(n,u,1):yu(n,u)}}return n}function tu(n,t){return n+Nl(Ql()*(t-n+1))}function ru(n,t,r,e){for(var u=-1,i=Gl(Fl((t-n)/(r||1)),0),o=il(i);i--;)o[e?i:++u]=n,n+=r;return o}function eu(n,t){var r=\"\";if(!n||t<1||t>Wn)return r;do t%2&&(r+=n),t=Nl(t/2),t&&(n+=n);while(t);return r}function uu(n,t){return Ls(Vi(n,t,La),n+\"\")}function iu(n){return Ir(ra(n))}function ou(n,t){var r=ra(n);return Xi(r,Mr(t,0,r.length))}function fu(n,t,r,e){if(!fc(n))return n;t=ku(t,n);\nfor(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var c=no(t[u]),a=r;if(\"__proto__\"===c||\"constructor\"===c||\"prototype\"===c)return n;if(u!=o){var l=f[c];a=e?e(l,c,f):X,a===X&&(a=fc(l)?l:Ci(t[u+1])?[]:{})}Sr(f,c,a),f=f[c]}return n}function cu(n){return Xi(ra(n))}function au(n,t,r){var e=-1,u=n.length;t<0&&(t=-t>u?0:u+t),r=r>u?u:r,r<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=il(u);++e<u;)i[e]=n[e+t];return i}function lu(n,t){var r;return ys(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function su(n,t,r){\nvar e=0,u=null==n?e:n.length;if(\"number\"==typeof t&&t===t&&u<=Tn){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!bc(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return hu(n,t,La,r)}function hu(n,t,r,e){var u=0,i=null==n?0:n.length;if(0===i)return 0;t=r(t);for(var o=t!==t,f=null===t,c=bc(t),a=t===X;u<i;){var l=Nl((u+i)/2),s=r(n[l]),h=s!==X,p=null===s,_=s===s,v=bc(s);if(o)var g=e||_;else g=a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):!p&&!v&&(e?s<=t:s<t);g?u=l+1:i=l}return Hl(i,Bn)}function pu(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){\nvar o=n[r],f=t?t(o):o;if(!r||!Gf(f,c)){var c=f;i[u++]=0===o?0:o}}return i}function _u(n){return\"number\"==typeof n?n:bc(n)?Cn:+n}function vu(n){if(\"string\"==typeof n)return n;if(bh(n))return c(n,vu)+\"\";if(bc(n))return vs?vs.call(n):\"\";var t=n+\"\";return\"0\"==t&&1/n==-Sn?\"-0\":t}function gu(n,t,r){var e=-1,u=o,i=n.length,c=!0,a=[],l=a;if(r)c=!1,u=f;else if(i>=tn){var s=t?null:ks(n);if(s)return P(s);c=!1,u=S,l=new yr}else l=t?[]:a;n:for(;++e<i;){var h=n[e],p=t?t(h):h;if(h=r||0!==h?h:0,c&&p===p){for(var _=l.length;_--;)if(l[_]===p)continue n;\nt&&l.push(p),a.push(h)}else u(l,p,r)||(l!==a&&l.push(p),a.push(h))}return a}function yu(n,t){return t=ku(t,n),n=Gi(n,t),null==n||delete n[no(jo(t))]}function du(n,t,r,e){return fu(n,t,r(_e(n,t)),e)}function bu(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?au(n,e?0:i,e?i+1:u):au(n,e?i+1:0,e?u:i)}function wu(n,t){var r=n;return r instanceof Ct&&(r=r.value()),l(t,function(n,t){return t.func.apply(t.thisArg,a([n],t.args))},r)}function mu(n,t,r){var e=n.length;if(e<2)return e?gu(n[0]):[];\nfor(var u=-1,i=il(e);++u<e;)for(var o=n[u],f=-1;++f<e;)f!=u&&(i[u]=Hr(i[u]||o,n[f],t,r));return gu(ee(i,1),t,r)}function xu(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;){r(o,n[e],e<i?t[e]:X)}return o}function ju(n){return Jf(n)?n:[]}function Au(n){return\"function\"==typeof n?n:La}function ku(n,t){return bh(n)?n:Bi(n,t)?[n]:Cs(Ec(n))}function Ou(n,t,r){var e=n.length;return r=r===X?e:r,!t&&r>=e?n:au(n,t,r)}function Iu(n,t){if(t)return n.slice();var r=n.length,e=zl?zl(r):new n.constructor(r);\nreturn n.copy(e),e}function Ru(n){var t=new n.constructor(n.byteLength);return new Rl(t).set(new Rl(n)),t}function zu(n,t){return new n.constructor(t?Ru(n.buffer):n.buffer,n.byteOffset,n.byteLength)}function Eu(n){var t=new n.constructor(n.source,Nt.exec(n));return t.lastIndex=n.lastIndex,t}function Su(n){return _s?ll(_s.call(n)):{}}function Wu(n,t){return new n.constructor(t?Ru(n.buffer):n.buffer,n.byteOffset,n.length)}function Lu(n,t){if(n!==t){var r=n!==X,e=null===n,u=n===n,i=bc(n),o=t!==X,f=null===t,c=t===t,a=bc(t);\nif(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&n<t||a&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!c)return-1}return 0}function Cu(n,t,r){for(var e=-1,u=n.criteria,i=t.criteria,o=u.length,f=r.length;++e<o;){var c=Lu(u[e],i[e]);if(c){if(e>=f)return c;return c*(\"desc\"==r[e]?-1:1)}}return n.index-t.index}function Uu(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,c=t.length,a=Gl(i-o,0),l=il(c+a),s=!e;++f<c;)l[f]=t[f];for(;++u<o;)(s||u<i)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];return l;\n}function Bu(n,t,r,e){for(var u=-1,i=n.length,o=-1,f=r.length,c=-1,a=t.length,l=Gl(i-f,0),s=il(l+a),h=!e;++u<l;)s[u]=n[u];for(var p=u;++c<a;)s[p+c]=t[c];for(;++o<f;)(h||u<i)&&(s[p+r[o]]=n[u++]);return s}function Tu(n,t){var r=-1,e=n.length;for(t||(t=il(e));++r<e;)t[r]=n[r];return t}function $u(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var f=t[i],c=e?e(r[f],n[f],f,r,n):X;c===X&&(c=n[f]),u?Br(r,f,c):Sr(r,f,c)}return r}function Du(n,t){return $u(n,Is(n),t)}function Mu(n,t){return $u(n,Rs(n),t);\n}function Fu(n,r){return function(e,u){var i=bh(e)?t:Lr,o=r?r():{};return i(e,n,mi(u,2),o)}}function Nu(n){return uu(function(t,r){var e=-1,u=r.length,i=u>1?r[u-1]:X,o=u>2?r[2]:X;for(i=n.length>3&&\"function\"==typeof i?(u--,i):X,o&&Ui(r[0],r[1],o)&&(i=u<3?X:i,u=1),t=ll(t);++e<u;){var f=r[e];f&&n(t,f,e,i)}return t})}function Pu(n,t){return function(r,e){if(null==r)return r;if(!Hf(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=ll(r);(t?i--:++i<u)&&e(o[i],i,o)!==!1;);return r}}function qu(n){return function(t,r,e){\nfor(var u=-1,i=ll(t),o=e(t),f=o.length;f--;){var c=o[n?f:++u];if(r(i[c],c,i)===!1)break}return t}}function Zu(n,t,r){function e(){return(this&&this!==re&&this instanceof e?i:n).apply(u?r:this,arguments)}var u=t&_n,i=Gu(n);return e}function Ku(n){return function(t){t=Ec(t);var r=T(t)?G(t):X,e=r?r[0]:t.charAt(0),u=r?Ou(r,1).join(\"\"):t.slice(1);return e[n]()+u}}function Vu(n){return function(t){return l(Ra(ca(t).replace($r,\"\")),n,\"\")}}function Gu(n){return function(){var t=arguments;switch(t.length){\ncase 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=gs(n.prototype),e=n.apply(r,t);return fc(e)?e:r}}function Hu(t,r,e){function u(){for(var o=arguments.length,f=il(o),c=o,a=wi(u);c--;)f[c]=arguments[c];var l=o<3&&f[0]!==a&&f[o-1]!==a?[]:N(f,a);\nreturn o-=l.length,o<e?oi(t,r,Qu,u.placeholder,X,f,l,X,X,e-o):n(this&&this!==re&&this instanceof u?i:t,this,f)}var i=Gu(t);return u}function Ju(n){return function(t,r,e){var u=ll(t);if(!Hf(t)){var i=mi(r,3);t=Pc(t),r=function(n){return i(u[n],n,u)}}var o=n(t,r,e);return o>-1?u[i?t[o]:o]:X}}function Yu(n){return gi(function(t){var r=t.length,e=r,u=Y.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if(\"function\"!=typeof i)throw new pl(en);if(u&&!o&&\"wrapper\"==bi(i))var o=new Y([],!0)}for(e=o?e:r;++e<r;){\ni=t[e];var f=bi(i),c=\"wrapper\"==f?Os(i):X;o=c&&$i(c[0])&&c[1]==(mn|yn|bn|xn)&&!c[4].length&&1==c[9]?o[bi(c[0])].apply(o,c[3]):1==i.length&&$i(i)?o[f]():o.thru(i)}return function(){var n=arguments,e=n[0];if(o&&1==n.length&&bh(e))return o.plant(e).value();for(var u=0,i=r?t[u].apply(this,n):e;++u<r;)i=t[u].call(this,i);return i}})}function Qu(n,t,r,e,u,i,o,f,c,a){function l(){for(var y=arguments.length,d=il(y),b=y;b--;)d[b]=arguments[b];if(_)var w=wi(l),m=C(d,w);if(e&&(d=Uu(d,e,u,_)),i&&(d=Bu(d,i,o,_)),\ny-=m,_&&y<a){return oi(n,t,Qu,l.placeholder,r,d,N(d,w),f,c,a-y)}var x=h?r:this,j=p?x[n]:n;return y=d.length,f?d=Hi(d,f):v&&y>1&&d.reverse(),s&&c<y&&(d.length=c),this&&this!==re&&this instanceof l&&(j=g||Gu(j)),j.apply(x,d)}var s=t&mn,h=t&_n,p=t&vn,_=t&(yn|dn),v=t&jn,g=p?X:Gu(n);return l}function Xu(n,t){return function(r,e){return Oe(r,n,t(e),{})}}function ni(n,t){return function(r,e){var u;if(r===X&&e===X)return t;if(r!==X&&(u=r),e!==X){if(u===X)return e;\"string\"==typeof r||\"string\"==typeof e?(r=vu(r),\ne=vu(e)):(r=_u(r),e=_u(e)),u=n(r,e)}return u}}function ti(t){return gi(function(r){return r=c(r,z(mi())),uu(function(e){var u=this;return t(r,function(t){return n(t,u,e)})})})}function ri(n,t){t=t===X?\" \":vu(t);var r=t.length;if(r<2)return r?eu(t,n):t;var e=eu(t,Fl(n/V(t)));return T(t)?Ou(G(e),0,n).join(\"\"):e.slice(0,n)}function ei(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=il(l+c),h=this&&this!==re&&this instanceof i?f:t;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++r];\nreturn n(h,o?e:this,s)}var o=r&_n,f=Gu(t);return i}function ui(n){return function(t,r,e){return e&&\"number\"!=typeof e&&Ui(t,r,e)&&(r=e=X),t=Ac(t),r===X?(r=t,t=0):r=Ac(r),e=e===X?t<r?1:-1:Ac(e),ru(t,r,e,n)}}function ii(n){return function(t,r){return\"string\"==typeof t&&\"string\"==typeof r||(t=Ic(t),r=Ic(r)),n(t,r)}}function oi(n,t,r,e,u,i,o,f,c,a){var l=t&yn,s=l?o:X,h=l?X:o,p=l?i:X,_=l?X:i;t|=l?bn:wn,t&=~(l?wn:bn),t&gn||(t&=~(_n|vn));var v=[n,t,u,p,s,_,h,f,c,a],g=r.apply(X,v);return $i(n)&&Ss(g,v),g.placeholder=e,\nYi(g,n,t)}function fi(n){var t=al[n];return function(n,r){if(n=Ic(n),r=null==r?0:Hl(kc(r),292),r&&Zl(n)){var e=(Ec(n)+\"e\").split(\"e\");return e=(Ec(t(e[0]+\"e\"+(+e[1]+r)))+\"e\").split(\"e\"),+(e[0]+\"e\"+(+e[1]-r))}return t(n)}}function ci(n){return function(t){var r=zs(t);return r==Gn?M(t):r==tt?q(t):I(t,n(t))}}function ai(n,t,r,e,u,i,o,f){var c=t&vn;if(!c&&\"function\"!=typeof n)throw new pl(en);var a=e?e.length:0;if(a||(t&=~(bn|wn),e=u=X),o=o===X?o:Gl(kc(o),0),f=f===X?f:kc(f),a-=u?u.length:0,t&wn){var l=e,s=u;\ne=u=X}var h=c?X:Os(n),p=[n,t,r,e,u,l,s,i,o,f];if(h&&qi(p,h),n=p[0],t=p[1],r=p[2],e=p[3],u=p[4],f=p[9]=p[9]===X?c?0:n.length:Gl(p[9]-a,0),!f&&t&(yn|dn)&&(t&=~(yn|dn)),t&&t!=_n)_=t==yn||t==dn?Hu(n,t,f):t!=bn&&t!=(_n|bn)||u.length?Qu.apply(X,p):ei(n,t,r,e);else var _=Zu(n,t,r);return Yi((h?ms:Ss)(_,p),n,t)}function li(n,t,r,e){return n===X||Gf(n,gl[r])&&!bl.call(e,r)?t:n}function si(n,t,r,e,u,i){return fc(n)&&fc(t)&&(i.set(t,n),Ke(n,t,X,si,i),i.delete(t)),n}function hi(n){return gc(n)?X:n}function pi(n,t,r,e,u,i){\nvar o=r&hn,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return!1;var a=i.get(n),l=i.get(t);if(a&&l)return a==t&&l==n;var s=-1,p=!0,_=r&pn?new yr:X;for(i.set(n,t),i.set(t,n);++s<f;){var v=n[s],g=t[s];if(e)var y=o?e(g,v,s,t,n,i):e(v,g,s,n,t,i);if(y!==X){if(y)continue;p=!1;break}if(_){if(!h(t,function(n,t){if(!S(_,t)&&(v===n||u(v,n,r,e,i)))return _.push(t)})){p=!1;break}}else if(v!==g&&!u(v,g,r,e,i)){p=!1;break}}return i.delete(n),i.delete(t),p}function _i(n,t,r,e,u,i,o){switch(r){case ct:if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)return!1;\nn=n.buffer,t=t.buffer;case ft:return!(n.byteLength!=t.byteLength||!i(new Rl(n),new Rl(t)));case Nn:case Pn:case Hn:return Gf(+n,+t);case Zn:return n.name==t.name&&n.message==t.message;case nt:case rt:return n==t+\"\";case Gn:var f=M;case tt:var c=e&hn;if(f||(f=P),n.size!=t.size&&!c)return!1;var a=o.get(n);if(a)return a==t;e|=pn,o.set(n,t);var l=pi(f(n),f(t),e,u,i,o);return o.delete(n),l;case et:if(_s)return _s.call(n)==_s.call(t)}return!1}function vi(n,t,r,e,u,i){var o=r&hn,f=yi(n),c=f.length;if(c!=yi(t).length&&!o)return!1;\nfor(var a=c;a--;){var l=f[a];if(!(o?l in t:bl.call(t,l)))return!1}var s=i.get(n),h=i.get(t);if(s&&h)return s==t&&h==n;var p=!0;i.set(n,t),i.set(t,n);for(var _=o;++a<c;){l=f[a];var v=n[l],g=t[l];if(e)var y=o?e(g,v,l,t,n,i):e(v,g,l,n,t,i);if(!(y===X?v===g||u(v,g,r,e,i):y)){p=!1;break}_||(_=\"constructor\"==l)}if(p&&!_){var d=n.constructor,b=t.constructor;d!=b&&\"constructor\"in n&&\"constructor\"in t&&!(\"function\"==typeof d&&d instanceof d&&\"function\"==typeof b&&b instanceof b)&&(p=!1)}return i.delete(n),\ni.delete(t),p}function gi(n){return Ls(Vi(n,X,_o),n+\"\")}function yi(n){return de(n,Pc,Is)}function di(n){return de(n,qc,Rs)}function bi(n){for(var t=n.name+\"\",r=fs[t],e=bl.call(fs,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function wi(n){return(bl.call(Z,\"placeholder\")?Z:n).placeholder}function mi(){var n=Z.iteratee||Ca;return n=n===Ca?De:n,arguments.length?n(arguments[0],arguments[1]):n}function xi(n,t){var r=n.__data__;return Ti(t)?r[\"string\"==typeof t?\"string\":\"hash\"]:r.map;\n}function ji(n){for(var t=Pc(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,Fi(u)]}return t}function Ai(n,t){var r=B(n,t);return Ue(r)?r:X}function ki(n){var t=bl.call(n,Bl),r=n[Bl];try{n[Bl]=X;var e=!0}catch(n){}var u=xl.call(n);return e&&(t?n[Bl]=r:delete n[Bl]),u}function Oi(n,t,r){for(var e=-1,u=r.length;++e<u;){var i=r[e],o=i.size;switch(i.type){case\"drop\":n+=o;break;case\"dropRight\":t-=o;break;case\"take\":t=Hl(t,n+o);break;case\"takeRight\":n=Gl(n,t-o)}}return{start:n,end:t}}function Ii(n){var t=n.match(Bt);\nreturn t?t[1].split(Tt):[]}function Ri(n,t,r){t=ku(t,n);for(var e=-1,u=t.length,i=!1;++e<u;){var o=no(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:(u=null==n?0:n.length,!!u&&oc(u)&&Ci(o,u)&&(bh(n)||dh(n)))}function zi(n){var t=n.length,r=new n.constructor(t);return t&&\"string\"==typeof n[0]&&bl.call(n,\"index\")&&(r.index=n.index,r.input=n.input),r}function Ei(n){return\"function\"!=typeof n.constructor||Mi(n)?{}:gs(El(n))}function Si(n,t,r){var e=n.constructor;switch(t){case ft:return Ru(n);\ncase Nn:case Pn:return new e(+n);case ct:return zu(n,r);case at:case lt:case st:case ht:case pt:case _t:case vt:case gt:case yt:return Wu(n,r);case Gn:return new e;case Hn:case rt:return new e(n);case nt:return Eu(n);case tt:return new e;case et:return Su(n)}}function Wi(n,t){var r=t.length;if(!r)return n;var e=r-1;return t[e]=(r>1?\"& \":\"\")+t[e],t=t.join(r>2?\", \":\" \"),n.replace(Ut,\"{\\n/* [wrapped with \"+t+\"] */\\n\")}function Li(n){return bh(n)||dh(n)||!!(Cl&&n&&n[Cl])}function Ci(n,t){var r=typeof n;\nreturn t=null==t?Wn:t,!!t&&(\"number\"==r||\"symbol\"!=r&&Vt.test(n))&&n>-1&&n%1==0&&n<t}function Ui(n,t,r){if(!fc(r))return!1;var e=typeof t;return!!(\"number\"==e?Hf(r)&&Ci(t,r.length):\"string\"==e&&t in r)&&Gf(r[t],n)}function Bi(n,t){if(bh(n))return!1;var r=typeof n;return!(\"number\"!=r&&\"symbol\"!=r&&\"boolean\"!=r&&null!=n&&!bc(n))||(zt.test(n)||!Rt.test(n)||null!=t&&n in ll(t))}function Ti(n){var t=typeof n;return\"string\"==t||\"number\"==t||\"symbol\"==t||\"boolean\"==t?\"__proto__\"!==n:null===n}function $i(n){\nvar t=bi(n),r=Z[t];if(\"function\"!=typeof r||!(t in Ct.prototype))return!1;if(n===r)return!0;var e=Os(r);return!!e&&n===e[0]}function Di(n){return!!ml&&ml in n}function Mi(n){var t=n&&n.constructor;return n===(\"function\"==typeof t&&t.prototype||gl)}function Fi(n){return n===n&&!fc(n)}function Ni(n,t){return function(r){return null!=r&&(r[n]===t&&(t!==X||n in ll(r)))}}function Pi(n){var t=Cf(n,function(n){return r.size===fn&&r.clear(),n}),r=t.cache;return t}function qi(n,t){var r=n[1],e=t[1],u=r|e,i=u<(_n|vn|mn),o=e==mn&&r==yn||e==mn&&r==xn&&n[7].length<=t[8]||e==(mn|xn)&&t[7].length<=t[8]&&r==yn;\nif(!i&&!o)return n;e&_n&&(n[2]=t[2],u|=r&_n?0:gn);var f=t[3];if(f){var c=n[3];n[3]=c?Uu(c,f,t[4]):f,n[4]=c?N(n[3],cn):t[4]}return f=t[5],f&&(c=n[5],n[5]=c?Bu(c,f,t[6]):f,n[6]=c?N(n[5],cn):t[6]),f=t[7],f&&(n[7]=f),e&mn&&(n[8]=null==n[8]?t[8]:Hl(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],n[1]=u,n}function Zi(n){var t=[];if(null!=n)for(var r in ll(n))t.push(r);return t}function Ki(n){return xl.call(n)}function Vi(t,r,e){return r=Gl(r===X?t.length-1:r,0),function(){for(var u=arguments,i=-1,o=Gl(u.length-r,0),f=il(o);++i<o;)f[i]=u[r+i];\ni=-1;for(var c=il(r+1);++i<r;)c[i]=u[i];return c[r]=e(f),n(t,this,c)}}function Gi(n,t){return t.length<2?n:_e(n,au(t,0,-1))}function Hi(n,t){for(var r=n.length,e=Hl(t.length,r),u=Tu(n);e--;){var i=t[e];n[e]=Ci(i,r)?u[i]:X}return n}function Ji(n,t){if((\"constructor\"!==t||\"function\"!=typeof n[t])&&\"__proto__\"!=t)return n[t]}function Yi(n,t,r){var e=t+\"\";return Ls(n,Wi(e,ro(Ii(e),r)))}function Qi(n){var t=0,r=0;return function(){var e=Jl(),u=In-(e-r);if(r=e,u>0){if(++t>=On)return arguments[0]}else t=0;\nreturn n.apply(X,arguments)}}function Xi(n,t){var r=-1,e=n.length,u=e-1;for(t=t===X?e:t;++r<t;){var i=tu(r,u),o=n[i];n[i]=n[r],n[r]=o}return n.length=t,n}function no(n){if(\"string\"==typeof n||bc(n))return n;var t=n+\"\";return\"0\"==t&&1/n==-Sn?\"-0\":t}function to(n){if(null!=n){try{return dl.call(n)}catch(n){}try{return n+\"\"}catch(n){}}return\"\"}function ro(n,t){return r($n,function(r){var e=\"_.\"+r[0];t&r[1]&&!o(n,e)&&n.push(e)}),n.sort()}function eo(n){if(n instanceof Ct)return n.clone();var t=new Y(n.__wrapped__,n.__chain__);\nreturn t.__actions__=Tu(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function uo(n,t,r){t=(r?Ui(n,t,r):t===X)?1:Gl(kc(t),0);var e=null==n?0:n.length;if(!e||t<1)return[];for(var u=0,i=0,o=il(Fl(e/t));u<e;)o[i++]=au(n,u,u+=t);return o}function io(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u}function oo(){var n=arguments.length;if(!n)return[];for(var t=il(n-1),r=arguments[0],e=n;e--;)t[e-1]=arguments[e];return a(bh(r)?Tu(r):[r],ee(t,1));\n}function fo(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),au(n,t<0?0:t,e)):[]}function co(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),t=e-t,au(n,0,t<0?0:t)):[]}function ao(n,t){return n&&n.length?bu(n,mi(t,3),!0,!0):[]}function lo(n,t){return n&&n.length?bu(n,mi(t,3),!0):[]}function so(n,t,r,e){var u=null==n?0:n.length;return u?(r&&\"number\"!=typeof r&&Ui(n,t,r)&&(r=0,e=u),ne(n,t,r,e)):[]}function ho(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:kc(r);\nreturn u<0&&(u=Gl(e+u,0)),g(n,mi(t,3),u)}function po(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==X&&(u=kc(r),u=r<0?Gl(e+u,0):Hl(u,e-1)),g(n,mi(t,3),u,!0)}function _o(n){return(null==n?0:n.length)?ee(n,1):[]}function vo(n){return(null==n?0:n.length)?ee(n,Sn):[]}function go(n,t){return(null==n?0:n.length)?(t=t===X?1:kc(t),ee(n,t)):[]}function yo(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e}function bo(n){return n&&n.length?n[0]:X}function wo(n,t,r){\nvar e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:kc(r);return u<0&&(u=Gl(e+u,0)),y(n,t,u)}function mo(n){return(null==n?0:n.length)?au(n,0,-1):[]}function xo(n,t){return null==n?\"\":Kl.call(n,t)}function jo(n){var t=null==n?0:n.length;return t?n[t-1]:X}function Ao(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;return r!==X&&(u=kc(r),u=u<0?Gl(e+u,0):Hl(u,e-1)),t===t?K(n,t,u):g(n,b,u,!0)}function ko(n,t){return n&&n.length?Ge(n,kc(t)):X}function Oo(n,t){return n&&n.length&&t&&t.length?Xe(n,t):n;\n}function Io(n,t,r){return n&&n.length&&t&&t.length?Xe(n,t,mi(r,2)):n}function Ro(n,t,r){return n&&n.length&&t&&t.length?Xe(n,t,X,r):n}function zo(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=mi(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return nu(n,u),r}function Eo(n){return null==n?n:Xl.call(n)}function So(n,t,r){var e=null==n?0:n.length;return e?(r&&\"number\"!=typeof r&&Ui(n,t,r)?(t=0,r=e):(t=null==t?0:kc(t),r=r===X?e:kc(r)),au(n,t,r)):[]}function Wo(n,t){\nreturn su(n,t)}function Lo(n,t,r){return hu(n,t,mi(r,2))}function Co(n,t){var r=null==n?0:n.length;if(r){var e=su(n,t);if(e<r&&Gf(n[e],t))return e}return-1}function Uo(n,t){return su(n,t,!0)}function Bo(n,t,r){return hu(n,t,mi(r,2),!0)}function To(n,t){if(null==n?0:n.length){var r=su(n,t,!0)-1;if(Gf(n[r],t))return r}return-1}function $o(n){return n&&n.length?pu(n):[]}function Do(n,t){return n&&n.length?pu(n,mi(t,2)):[]}function Mo(n){var t=null==n?0:n.length;return t?au(n,1,t):[]}function Fo(n,t,r){\nreturn n&&n.length?(t=r||t===X?1:kc(t),au(n,0,t<0?0:t)):[]}function No(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),t=e-t,au(n,t<0?0:t,e)):[]}function Po(n,t){return n&&n.length?bu(n,mi(t,3),!1,!0):[]}function qo(n,t){return n&&n.length?bu(n,mi(t,3)):[]}function Zo(n){return n&&n.length?gu(n):[]}function Ko(n,t){return n&&n.length?gu(n,mi(t,2)):[]}function Vo(n,t){return t=\"function\"==typeof t?t:X,n&&n.length?gu(n,X,t):[]}function Go(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){\nif(Jf(n))return t=Gl(n.length,t),!0}),O(t,function(t){return c(n,m(t))})}function Ho(t,r){if(!t||!t.length)return[];var e=Go(t);return null==r?e:c(e,function(t){return n(r,X,t)})}function Jo(n,t){return xu(n||[],t||[],Sr)}function Yo(n,t){return xu(n||[],t||[],fu)}function Qo(n){var t=Z(n);return t.__chain__=!0,t}function Xo(n,t){return t(n),n}function nf(n,t){return t(n)}function tf(){return Qo(this)}function rf(){return new Y(this.value(),this.__chain__)}function ef(){this.__values__===X&&(this.__values__=jc(this.value()));\nvar n=this.__index__>=this.__values__.length;return{done:n,value:n?X:this.__values__[this.__index__++]}}function uf(){return this}function of(n){for(var t,r=this;r instanceof J;){var e=eo(r);e.__index__=0,e.__values__=X,t?u.__wrapped__=e:t=e;var u=e;r=r.__wrapped__}return u.__wrapped__=n,t}function ff(){var n=this.__wrapped__;if(n instanceof Ct){var t=n;return this.__actions__.length&&(t=new Ct(this)),t=t.reverse(),t.__actions__.push({func:nf,args:[Eo],thisArg:X}),new Y(t,this.__chain__)}return this.thru(Eo);\n}function cf(){return wu(this.__wrapped__,this.__actions__)}function af(n,t,r){var e=bh(n)?u:Jr;return r&&Ui(n,t,r)&&(t=X),e(n,mi(t,3))}function lf(n,t){return(bh(n)?i:te)(n,mi(t,3))}function sf(n,t){return ee(yf(n,t),1)}function hf(n,t){return ee(yf(n,t),Sn)}function pf(n,t,r){return r=r===X?1:kc(r),ee(yf(n,t),r)}function _f(n,t){return(bh(n)?r:ys)(n,mi(t,3))}function vf(n,t){return(bh(n)?e:ds)(n,mi(t,3))}function gf(n,t,r,e){n=Hf(n)?n:ra(n),r=r&&!e?kc(r):0;var u=n.length;return r<0&&(r=Gl(u+r,0)),\ndc(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&y(n,t,r)>-1}function yf(n,t){return(bh(n)?c:Pe)(n,mi(t,3))}function df(n,t,r,e){return null==n?[]:(bh(t)||(t=null==t?[]:[t]),r=e?X:r,bh(r)||(r=null==r?[]:[r]),He(n,t,r))}function bf(n,t,r){var e=bh(n)?l:j,u=arguments.length<3;return e(n,mi(t,4),r,u,ys)}function wf(n,t,r){var e=bh(n)?s:j,u=arguments.length<3;return e(n,mi(t,4),r,u,ds)}function mf(n,t){return(bh(n)?i:te)(n,Uf(mi(t,3)))}function xf(n){return(bh(n)?Ir:iu)(n)}function jf(n,t,r){return t=(r?Ui(n,t,r):t===X)?1:kc(t),\n(bh(n)?Rr:ou)(n,t)}function Af(n){return(bh(n)?zr:cu)(n)}function kf(n){if(null==n)return 0;if(Hf(n))return dc(n)?V(n):n.length;var t=zs(n);return t==Gn||t==tt?n.size:Me(n).length}function Of(n,t,r){var e=bh(n)?h:lu;return r&&Ui(n,t,r)&&(t=X),e(n,mi(t,3))}function If(n,t){if(\"function\"!=typeof t)throw new pl(en);return n=kc(n),function(){if(--n<1)return t.apply(this,arguments)}}function Rf(n,t,r){return t=r?X:t,t=n&&null==t?n.length:t,ai(n,mn,X,X,X,X,t)}function zf(n,t){var r;if(\"function\"!=typeof t)throw new pl(en);\nreturn n=kc(n),function(){return--n>0&&(r=t.apply(this,arguments)),n<=1&&(t=X),r}}function Ef(n,t,r){t=r?X:t;var e=ai(n,yn,X,X,X,X,X,t);return e.placeholder=Ef.placeholder,e}function Sf(n,t,r){t=r?X:t;var e=ai(n,dn,X,X,X,X,X,t);return e.placeholder=Sf.placeholder,e}function Wf(n,t,r){function e(t){var r=h,e=p;return h=p=X,d=t,v=n.apply(e,r)}function u(n){return d=n,g=Ws(f,t),b?e(n):v}function i(n){var r=n-y,e=n-d,u=t-r;return w?Hl(u,_-e):u}function o(n){var r=n-y,e=n-d;return y===X||r>=t||r<0||w&&e>=_;\n}function f(){var n=fh();return o(n)?c(n):(g=Ws(f,i(n)),X)}function c(n){return g=X,m&&h?e(n):(h=p=X,v)}function a(){g!==X&&As(g),d=0,h=y=p=g=X}function l(){return g===X?v:c(fh())}function s(){var n=fh(),r=o(n);if(h=arguments,p=this,y=n,r){if(g===X)return u(y);if(w)return As(g),g=Ws(f,t),e(y)}return g===X&&(g=Ws(f,t)),v}var h,p,_,v,g,y,d=0,b=!1,w=!1,m=!0;if(\"function\"!=typeof n)throw new pl(en);return t=Ic(t)||0,fc(r)&&(b=!!r.leading,w=\"maxWait\"in r,_=w?Gl(Ic(r.maxWait)||0,t):_,m=\"trailing\"in r?!!r.trailing:m),\ns.cancel=a,s.flush=l,s}function Lf(n){return ai(n,jn)}function Cf(n,t){if(\"function\"!=typeof n||null!=t&&\"function\"!=typeof t)throw new pl(en);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(Cf.Cache||sr),r}function Uf(n){if(\"function\"!=typeof n)throw new pl(en);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:\nreturn!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function Bf(n){return zf(2,n)}function Tf(n,t){if(\"function\"!=typeof n)throw new pl(en);return t=t===X?t:kc(t),uu(n,t)}function $f(t,r){if(\"function\"!=typeof t)throw new pl(en);return r=null==r?0:Gl(kc(r),0),uu(function(e){var u=e[r],i=Ou(e,0,r);return u&&a(i,u),n(t,this,i)})}function Df(n,t,r){var e=!0,u=!0;if(\"function\"!=typeof n)throw new pl(en);return fc(r)&&(e=\"leading\"in r?!!r.leading:e,u=\"trailing\"in r?!!r.trailing:u),\nWf(n,t,{leading:e,maxWait:t,trailing:u})}function Mf(n){return Rf(n,1)}function Ff(n,t){return ph(Au(t),n)}function Nf(){if(!arguments.length)return[];var n=arguments[0];return bh(n)?n:[n]}function Pf(n){return Fr(n,sn)}function qf(n,t){return t=\"function\"==typeof t?t:X,Fr(n,sn,t)}function Zf(n){return Fr(n,an|sn)}function Kf(n,t){return t=\"function\"==typeof t?t:X,Fr(n,an|sn,t)}function Vf(n,t){return null==t||Pr(n,t,Pc(t))}function Gf(n,t){return n===t||n!==n&&t!==t}function Hf(n){return null!=n&&oc(n.length)&&!uc(n);\n}function Jf(n){return cc(n)&&Hf(n)}function Yf(n){return n===!0||n===!1||cc(n)&&we(n)==Nn}function Qf(n){return cc(n)&&1===n.nodeType&&!gc(n)}function Xf(n){if(null==n)return!0;if(Hf(n)&&(bh(n)||\"string\"==typeof n||\"function\"==typeof n.splice||mh(n)||Oh(n)||dh(n)))return!n.length;var t=zs(n);if(t==Gn||t==tt)return!n.size;if(Mi(n))return!Me(n).length;for(var r in n)if(bl.call(n,r))return!1;return!0}function nc(n,t){return Se(n,t)}function tc(n,t,r){r=\"function\"==typeof r?r:X;var e=r?r(n,t):X;return e===X?Se(n,t,X,r):!!e;\n}function rc(n){if(!cc(n))return!1;var t=we(n);return t==Zn||t==qn||\"string\"==typeof n.message&&\"string\"==typeof n.name&&!gc(n)}function ec(n){return\"number\"==typeof n&&Zl(n)}function uc(n){if(!fc(n))return!1;var t=we(n);return t==Kn||t==Vn||t==Fn||t==Xn}function ic(n){return\"number\"==typeof n&&n==kc(n)}function oc(n){return\"number\"==typeof n&&n>-1&&n%1==0&&n<=Wn}function fc(n){var t=typeof n;return null!=n&&(\"object\"==t||\"function\"==t)}function cc(n){return null!=n&&\"object\"==typeof n}function ac(n,t){\nreturn n===t||Ce(n,t,ji(t))}function lc(n,t,r){return r=\"function\"==typeof r?r:X,Ce(n,t,ji(t),r)}function sc(n){return vc(n)&&n!=+n}function hc(n){if(Es(n))throw new fl(rn);return Ue(n)}function pc(n){return null===n}function _c(n){return null==n}function vc(n){return\"number\"==typeof n||cc(n)&&we(n)==Hn}function gc(n){if(!cc(n)||we(n)!=Yn)return!1;var t=El(n);if(null===t)return!0;var r=bl.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof r&&r instanceof r&&dl.call(r)==jl}function yc(n){\nreturn ic(n)&&n>=-Wn&&n<=Wn}function dc(n){return\"string\"==typeof n||!bh(n)&&cc(n)&&we(n)==rt}function bc(n){return\"symbol\"==typeof n||cc(n)&&we(n)==et}function wc(n){return n===X}function mc(n){return cc(n)&&zs(n)==it}function xc(n){return cc(n)&&we(n)==ot}function jc(n){if(!n)return[];if(Hf(n))return dc(n)?G(n):Tu(n);if(Ul&&n[Ul])return D(n[Ul]());var t=zs(n);return(t==Gn?M:t==tt?P:ra)(n)}function Ac(n){if(!n)return 0===n?n:0;if(n=Ic(n),n===Sn||n===-Sn){return(n<0?-1:1)*Ln}return n===n?n:0}function kc(n){\nvar t=Ac(n),r=t%1;return t===t?r?t-r:t:0}function Oc(n){return n?Mr(kc(n),0,Un):0}function Ic(n){if(\"number\"==typeof n)return n;if(bc(n))return Cn;if(fc(n)){var t=\"function\"==typeof n.valueOf?n.valueOf():n;n=fc(t)?t+\"\":t}if(\"string\"!=typeof n)return 0===n?n:+n;n=R(n);var r=qt.test(n);return r||Kt.test(n)?Xr(n.slice(2),r?2:8):Pt.test(n)?Cn:+n}function Rc(n){return $u(n,qc(n))}function zc(n){return n?Mr(kc(n),-Wn,Wn):0===n?n:0}function Ec(n){return null==n?\"\":vu(n)}function Sc(n,t){var r=gs(n);return null==t?r:Cr(r,t);\n}function Wc(n,t){return v(n,mi(t,3),ue)}function Lc(n,t){return v(n,mi(t,3),oe)}function Cc(n,t){return null==n?n:bs(n,mi(t,3),qc)}function Uc(n,t){return null==n?n:ws(n,mi(t,3),qc)}function Bc(n,t){return n&&ue(n,mi(t,3))}function Tc(n,t){return n&&oe(n,mi(t,3))}function $c(n){return null==n?[]:fe(n,Pc(n))}function Dc(n){return null==n?[]:fe(n,qc(n))}function Mc(n,t,r){var e=null==n?X:_e(n,t);return e===X?r:e}function Fc(n,t){return null!=n&&Ri(n,t,xe)}function Nc(n,t){return null!=n&&Ri(n,t,je);\n}function Pc(n){return Hf(n)?Or(n):Me(n)}function qc(n){return Hf(n)?Or(n,!0):Fe(n)}function Zc(n,t){var r={};return t=mi(t,3),ue(n,function(n,e,u){Br(r,t(n,e,u),n)}),r}function Kc(n,t){var r={};return t=mi(t,3),ue(n,function(n,e,u){Br(r,e,t(n,e,u))}),r}function Vc(n,t){return Gc(n,Uf(mi(t)))}function Gc(n,t){if(null==n)return{};var r=c(di(n),function(n){return[n]});return t=mi(t),Ye(n,r,function(n,r){return t(n,r[0])})}function Hc(n,t,r){t=ku(t,n);var e=-1,u=t.length;for(u||(u=1,n=X);++e<u;){var i=null==n?X:n[no(t[e])];\ni===X&&(e=u,i=r),n=uc(i)?i.call(n):i}return n}function Jc(n,t,r){return null==n?n:fu(n,t,r)}function Yc(n,t,r,e){return e=\"function\"==typeof e?e:X,null==n?n:fu(n,t,r,e)}function Qc(n,t,e){var u=bh(n),i=u||mh(n)||Oh(n);if(t=mi(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:fc(n)&&uc(o)?gs(El(n)):{}}return(i?r:ue)(n,function(n,r,u){return t(e,n,r,u)}),e}function Xc(n,t){return null==n||yu(n,t)}function na(n,t,r){return null==n?n:du(n,t,Au(r))}function ta(n,t,r,e){return e=\"function\"==typeof e?e:X,\nnull==n?n:du(n,t,Au(r),e)}function ra(n){return null==n?[]:E(n,Pc(n))}function ea(n){return null==n?[]:E(n,qc(n))}function ua(n,t,r){return r===X&&(r=t,t=X),r!==X&&(r=Ic(r),r=r===r?r:0),t!==X&&(t=Ic(t),t=t===t?t:0),Mr(Ic(n),t,r)}function ia(n,t,r){return t=Ac(t),r===X?(r=t,t=0):r=Ac(r),n=Ic(n),Ae(n,t,r)}function oa(n,t,r){if(r&&\"boolean\"!=typeof r&&Ui(n,t,r)&&(t=r=X),r===X&&(\"boolean\"==typeof t?(r=t,t=X):\"boolean\"==typeof n&&(r=n,n=X)),n===X&&t===X?(n=0,t=1):(n=Ac(n),t===X?(t=n,n=0):t=Ac(t)),n>t){\nvar e=n;n=t,t=e}if(r||n%1||t%1){var u=Ql();return Hl(n+u*(t-n+Qr(\"1e-\"+((u+\"\").length-1))),t)}return tu(n,t)}function fa(n){return Qh(Ec(n).toLowerCase())}function ca(n){return n=Ec(n),n&&n.replace(Gt,ve).replace(Dr,\"\")}function aa(n,t,r){n=Ec(n),t=vu(t);var e=n.length;r=r===X?e:Mr(kc(r),0,e);var u=r;return r-=t.length,r>=0&&n.slice(r,u)==t}function la(n){return n=Ec(n),n&&At.test(n)?n.replace(xt,ge):n}function sa(n){return n=Ec(n),n&&Wt.test(n)?n.replace(St,\"\\\\$&\"):n}function ha(n,t,r){n=Ec(n),t=kc(t);\nvar e=t?V(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return ri(Nl(u),r)+n+ri(Fl(u),r)}function pa(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;return t&&e<t?n+ri(t-e,r):n}function _a(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;return t&&e<t?ri(t-e,r)+n:n}function va(n,t,r){return r||null==t?t=0:t&&(t=+t),Yl(Ec(n).replace(Lt,\"\"),t||0)}function ga(n,t,r){return t=(r?Ui(n,t,r):t===X)?1:kc(t),eu(Ec(n),t)}function ya(){var n=arguments,t=Ec(n[0]);return n.length<3?t:t.replace(n[1],n[2])}function da(n,t,r){return r&&\"number\"!=typeof r&&Ui(n,t,r)&&(t=r=X),\n(r=r===X?Un:r>>>0)?(n=Ec(n),n&&(\"string\"==typeof t||null!=t&&!Ah(t))&&(t=vu(t),!t&&T(n))?Ou(G(n),0,r):n.split(t,r)):[]}function ba(n,t,r){return n=Ec(n),r=null==r?0:Mr(kc(r),0,n.length),t=vu(t),n.slice(r,r+t.length)==t}function wa(n,t,r){var e=Z.templateSettings;r&&Ui(n,t,r)&&(t=X),n=Ec(n),t=Sh({},t,e,li);var u,i,o=Sh({},t.imports,e.imports,li),f=Pc(o),c=E(o,f),a=0,l=t.interpolate||Ht,s=\"__p += '\",h=sl((t.escape||Ht).source+\"|\"+l.source+\"|\"+(l===It?Ft:Ht).source+\"|\"+(t.evaluate||Ht).source+\"|$\",\"g\"),p=\"//# sourceURL=\"+(bl.call(t,\"sourceURL\")?(t.sourceURL+\"\").replace(/\\s/g,\" \"):\"lodash.templateSources[\"+ ++Zr+\"]\")+\"\\n\";\nn.replace(h,function(t,r,e,o,f,c){return e||(e=o),s+=n.slice(a,c).replace(Jt,U),r&&(u=!0,s+=\"' +\\n__e(\"+r+\") +\\n'\"),f&&(i=!0,s+=\"';\\n\"+f+\";\\n__p += '\"),e&&(s+=\"' +\\n((__t = (\"+e+\")) == null ? '' : __t) +\\n'\"),a=c+t.length,t}),s+=\"';\\n\";var _=bl.call(t,\"variable\")&&t.variable;if(_){if(Dt.test(_))throw new fl(un)}else s=\"with (obj) {\\n\"+s+\"\\n}\\n\";s=(i?s.replace(dt,\"\"):s).replace(bt,\"$1\").replace(wt,\"$1;\"),s=\"function(\"+(_||\"obj\")+\") {\\n\"+(_?\"\":\"obj || (obj = {});\\n\")+\"var __t, __p = ''\"+(u?\", __e = _.escape\":\"\")+(i?\", __j = Array.prototype.join;\\nfunction print() { __p += __j.call(arguments, '') }\\n\":\";\\n\")+s+\"return __p\\n}\";\nvar v=Xh(function(){return cl(f,p+\"return \"+s).apply(X,c)});if(v.source=s,rc(v))throw v;return v}function ma(n){return Ec(n).toLowerCase()}function xa(n){return Ec(n).toUpperCase()}function ja(n,t,r){if(n=Ec(n),n&&(r||t===X))return R(n);if(!n||!(t=vu(t)))return n;var e=G(n),u=G(t);return Ou(e,W(e,u),L(e,u)+1).join(\"\")}function Aa(n,t,r){if(n=Ec(n),n&&(r||t===X))return n.slice(0,H(n)+1);if(!n||!(t=vu(t)))return n;var e=G(n);return Ou(e,0,L(e,G(t))+1).join(\"\")}function ka(n,t,r){if(n=Ec(n),n&&(r||t===X))return n.replace(Lt,\"\");\nif(!n||!(t=vu(t)))return n;var e=G(n);return Ou(e,W(e,G(t))).join(\"\")}function Oa(n,t){var r=An,e=kn;if(fc(t)){var u=\"separator\"in t?t.separator:u;r=\"length\"in t?kc(t.length):r,e=\"omission\"in t?vu(t.omission):e}n=Ec(n);var i=n.length;if(T(n)){var o=G(n);i=o.length}if(r>=i)return n;var f=r-V(e);if(f<1)return e;var c=o?Ou(o,0,f).join(\"\"):n.slice(0,f);if(u===X)return c+e;if(o&&(f+=c.length-f),Ah(u)){if(n.slice(f).search(u)){var a,l=c;for(u.global||(u=sl(u.source,Ec(Nt.exec(u))+\"g\")),u.lastIndex=0;a=u.exec(l);)var s=a.index;\nc=c.slice(0,s===X?f:s)}}else if(n.indexOf(vu(u),f)!=f){var h=c.lastIndexOf(u);h>-1&&(c=c.slice(0,h))}return c+e}function Ia(n){return n=Ec(n),n&&jt.test(n)?n.replace(mt,ye):n}function Ra(n,t,r){return n=Ec(n),t=r?X:t,t===X?$(n)?Q(n):_(n):n.match(t)||[]}function za(t){var r=null==t?0:t.length,e=mi();return t=r?c(t,function(n){if(\"function\"!=typeof n[1])throw new pl(en);return[e(n[0]),n[1]]}):[],uu(function(e){for(var u=-1;++u<r;){var i=t[u];if(n(i[0],this,e))return n(i[1],this,e)}})}function Ea(n){\nreturn Nr(Fr(n,an))}function Sa(n){return function(){return n}}function Wa(n,t){return null==n||n!==n?t:n}function La(n){return n}function Ca(n){return De(\"function\"==typeof n?n:Fr(n,an))}function Ua(n){return qe(Fr(n,an))}function Ba(n,t){return Ze(n,Fr(t,an))}function Ta(n,t,e){var u=Pc(t),i=fe(t,u);null!=e||fc(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=fe(t,Pc(t)));var o=!(fc(e)&&\"chain\"in e&&!e.chain),f=uc(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;\nif(o||t){var r=n(this.__wrapped__);return(r.__actions__=Tu(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function $a(){return re._===this&&(re._=Al),this}function Da(){}function Ma(n){return n=kc(n),uu(function(t){return Ge(t,n)})}function Fa(n){return Bi(n)?m(no(n)):Qe(n)}function Na(n){return function(t){return null==n?X:_e(n,t)}}function Pa(){return[]}function qa(){return!1}function Za(){return{}}function Ka(){return\"\";\n}function Va(){return!0}function Ga(n,t){if(n=kc(n),n<1||n>Wn)return[];var r=Un,e=Hl(n,Un);t=mi(t),n-=Un;for(var u=O(e,t);++r<n;)t(r);return u}function Ha(n){return bh(n)?c(n,no):bc(n)?[n]:Tu(Cs(Ec(n)))}function Ja(n){var t=++wl;return Ec(n)+t}function Ya(n){return n&&n.length?Yr(n,La,me):X}function Qa(n,t){return n&&n.length?Yr(n,mi(t,2),me):X}function Xa(n){return w(n,La)}function nl(n,t){return w(n,mi(t,2))}function tl(n){return n&&n.length?Yr(n,La,Ne):X}function rl(n,t){return n&&n.length?Yr(n,mi(t,2),Ne):X;\n}function el(n){return n&&n.length?k(n,La):0}function ul(n,t){return n&&n.length?k(n,mi(t,2)):0}x=null==x?re:be.defaults(re.Object(),x,be.pick(re,qr));var il=x.Array,ol=x.Date,fl=x.Error,cl=x.Function,al=x.Math,ll=x.Object,sl=x.RegExp,hl=x.String,pl=x.TypeError,_l=il.prototype,vl=cl.prototype,gl=ll.prototype,yl=x[\"__core-js_shared__\"],dl=vl.toString,bl=gl.hasOwnProperty,wl=0,ml=function(){var n=/[^.]+$/.exec(yl&&yl.keys&&yl.keys.IE_PROTO||\"\");return n?\"Symbol(src)_1.\"+n:\"\"}(),xl=gl.toString,jl=dl.call(ll),Al=re._,kl=sl(\"^\"+dl.call(bl).replace(St,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),Ol=ie?x.Buffer:X,Il=x.Symbol,Rl=x.Uint8Array,zl=Ol?Ol.allocUnsafe:X,El=F(ll.getPrototypeOf,ll),Sl=ll.create,Wl=gl.propertyIsEnumerable,Ll=_l.splice,Cl=Il?Il.isConcatSpreadable:X,Ul=Il?Il.iterator:X,Bl=Il?Il.toStringTag:X,Tl=function(){\ntry{var n=Ai(ll,\"defineProperty\");return n({},\"\",{}),n}catch(n){}}(),$l=x.clearTimeout!==re.clearTimeout&&x.clearTimeout,Dl=ol&&ol.now!==re.Date.now&&ol.now,Ml=x.setTimeout!==re.setTimeout&&x.setTimeout,Fl=al.ceil,Nl=al.floor,Pl=ll.getOwnPropertySymbols,ql=Ol?Ol.isBuffer:X,Zl=x.isFinite,Kl=_l.join,Vl=F(ll.keys,ll),Gl=al.max,Hl=al.min,Jl=ol.now,Yl=x.parseInt,Ql=al.random,Xl=_l.reverse,ns=Ai(x,\"DataView\"),ts=Ai(x,\"Map\"),rs=Ai(x,\"Promise\"),es=Ai(x,\"Set\"),us=Ai(x,\"WeakMap\"),is=Ai(ll,\"create\"),os=us&&new us,fs={},cs=to(ns),as=to(ts),ls=to(rs),ss=to(es),hs=to(us),ps=Il?Il.prototype:X,_s=ps?ps.valueOf:X,vs=ps?ps.toString:X,gs=function(){\nfunction n(){}return function(t){if(!fc(t))return{};if(Sl)return Sl(t);n.prototype=t;var r=new n;return n.prototype=X,r}}();Z.templateSettings={escape:kt,evaluate:Ot,interpolate:It,variable:\"\",imports:{_:Z}},Z.prototype=J.prototype,Z.prototype.constructor=Z,Y.prototype=gs(J.prototype),Y.prototype.constructor=Y,Ct.prototype=gs(J.prototype),Ct.prototype.constructor=Ct,Xt.prototype.clear=nr,Xt.prototype.delete=tr,Xt.prototype.get=rr,Xt.prototype.has=er,Xt.prototype.set=ur,ir.prototype.clear=or,ir.prototype.delete=fr,\nir.prototype.get=cr,ir.prototype.has=ar,ir.prototype.set=lr,sr.prototype.clear=hr,sr.prototype.delete=pr,sr.prototype.get=_r,sr.prototype.has=vr,sr.prototype.set=gr,yr.prototype.add=yr.prototype.push=dr,yr.prototype.has=br,wr.prototype.clear=mr,wr.prototype.delete=xr,wr.prototype.get=jr,wr.prototype.has=Ar,wr.prototype.set=kr;var ys=Pu(ue),ds=Pu(oe,!0),bs=qu(),ws=qu(!0),ms=os?function(n,t){return os.set(n,t),n}:La,xs=Tl?function(n,t){return Tl(n,\"toString\",{configurable:!0,enumerable:!1,value:Sa(t),\nwritable:!0})}:La,js=uu,As=$l||function(n){return re.clearTimeout(n)},ks=es&&1/P(new es([,-0]))[1]==Sn?function(n){return new es(n)}:Da,Os=os?function(n){return os.get(n)}:Da,Is=Pl?function(n){return null==n?[]:(n=ll(n),i(Pl(n),function(t){return Wl.call(n,t)}))}:Pa,Rs=Pl?function(n){for(var t=[];n;)a(t,Is(n)),n=El(n);return t}:Pa,zs=we;(ns&&zs(new ns(new ArrayBuffer(1)))!=ct||ts&&zs(new ts)!=Gn||rs&&zs(rs.resolve())!=Qn||es&&zs(new es)!=tt||us&&zs(new us)!=it)&&(zs=function(n){var t=we(n),r=t==Yn?n.constructor:X,e=r?to(r):\"\";\nif(e)switch(e){case cs:return ct;case as:return Gn;case ls:return Qn;case ss:return tt;case hs:return it}return t});var Es=yl?uc:qa,Ss=Qi(ms),Ws=Ml||function(n,t){return re.setTimeout(n,t)},Ls=Qi(xs),Cs=Pi(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(\"\"),n.replace(Et,function(n,r,e,u){t.push(e?u.replace(Mt,\"$1\"):r||n)}),t}),Us=uu(function(n,t){return Jf(n)?Hr(n,ee(t,1,Jf,!0)):[]}),Bs=uu(function(n,t){var r=jo(t);return Jf(r)&&(r=X),Jf(n)?Hr(n,ee(t,1,Jf,!0),mi(r,2)):[]}),Ts=uu(function(n,t){\nvar r=jo(t);return Jf(r)&&(r=X),Jf(n)?Hr(n,ee(t,1,Jf,!0),X,r):[]}),$s=uu(function(n){var t=c(n,ju);return t.length&&t[0]===n[0]?ke(t):[]}),Ds=uu(function(n){var t=jo(n),r=c(n,ju);return t===jo(r)?t=X:r.pop(),r.length&&r[0]===n[0]?ke(r,mi(t,2)):[]}),Ms=uu(function(n){var t=jo(n),r=c(n,ju);return t=\"function\"==typeof t?t:X,t&&r.pop(),r.length&&r[0]===n[0]?ke(r,X,t):[]}),Fs=uu(Oo),Ns=gi(function(n,t){var r=null==n?0:n.length,e=Tr(n,t);return nu(n,c(t,function(n){return Ci(n,r)?+n:n}).sort(Lu)),e}),Ps=uu(function(n){\nreturn gu(ee(n,1,Jf,!0))}),qs=uu(function(n){var t=jo(n);return Jf(t)&&(t=X),gu(ee(n,1,Jf,!0),mi(t,2))}),Zs=uu(function(n){var t=jo(n);return t=\"function\"==typeof t?t:X,gu(ee(n,1,Jf,!0),X,t)}),Ks=uu(function(n,t){return Jf(n)?Hr(n,t):[]}),Vs=uu(function(n){return mu(i(n,Jf))}),Gs=uu(function(n){var t=jo(n);return Jf(t)&&(t=X),mu(i(n,Jf),mi(t,2))}),Hs=uu(function(n){var t=jo(n);return t=\"function\"==typeof t?t:X,mu(i(n,Jf),X,t)}),Js=uu(Go),Ys=uu(function(n){var t=n.length,r=t>1?n[t-1]:X;return r=\"function\"==typeof r?(n.pop(),\nr):X,Ho(n,r)}),Qs=gi(function(n){var t=n.length,r=t?n[0]:0,e=this.__wrapped__,u=function(t){return Tr(t,n)};return!(t>1||this.__actions__.length)&&e instanceof Ct&&Ci(r)?(e=e.slice(r,+r+(t?1:0)),e.__actions__.push({func:nf,args:[u],thisArg:X}),new Y(e,this.__chain__).thru(function(n){return t&&!n.length&&n.push(X),n})):this.thru(u)}),Xs=Fu(function(n,t,r){bl.call(n,r)?++n[r]:Br(n,r,1)}),nh=Ju(ho),th=Ju(po),rh=Fu(function(n,t,r){bl.call(n,r)?n[r].push(t):Br(n,r,[t])}),eh=uu(function(t,r,e){var u=-1,i=\"function\"==typeof r,o=Hf(t)?il(t.length):[];\nreturn ys(t,function(t){o[++u]=i?n(r,t,e):Ie(t,r,e)}),o}),uh=Fu(function(n,t,r){Br(n,r,t)}),ih=Fu(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),oh=uu(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Ui(n,t[0],t[1])?t=[]:r>2&&Ui(t[0],t[1],t[2])&&(t=[t[0]]),He(n,ee(t,1),[])}),fh=Dl||function(){return re.Date.now()},ch=uu(function(n,t,r){var e=_n;if(r.length){var u=N(r,wi(ch));e|=bn}return ai(n,e,t,r,u)}),ah=uu(function(n,t,r){var e=_n|vn;if(r.length){var u=N(r,wi(ah));e|=bn;\n}return ai(t,e,n,r,u)}),lh=uu(function(n,t){return Gr(n,1,t)}),sh=uu(function(n,t,r){return Gr(n,Ic(t)||0,r)});Cf.Cache=sr;var hh=js(function(t,r){r=1==r.length&&bh(r[0])?c(r[0],z(mi())):c(ee(r,1),z(mi()));var e=r.length;return uu(function(u){for(var i=-1,o=Hl(u.length,e);++i<o;)u[i]=r[i].call(this,u[i]);return n(t,this,u)})}),ph=uu(function(n,t){return ai(n,bn,X,t,N(t,wi(ph)))}),_h=uu(function(n,t){return ai(n,wn,X,t,N(t,wi(_h)))}),vh=gi(function(n,t){return ai(n,xn,X,X,X,t)}),gh=ii(me),yh=ii(function(n,t){\nreturn n>=t}),dh=Re(function(){return arguments}())?Re:function(n){return cc(n)&&bl.call(n,\"callee\")&&!Wl.call(n,\"callee\")},bh=il.isArray,wh=ce?z(ce):ze,mh=ql||qa,xh=ae?z(ae):Ee,jh=le?z(le):Le,Ah=se?z(se):Be,kh=he?z(he):Te,Oh=pe?z(pe):$e,Ih=ii(Ne),Rh=ii(function(n,t){return n<=t}),zh=Nu(function(n,t){if(Mi(t)||Hf(t))return $u(t,Pc(t),n),X;for(var r in t)bl.call(t,r)&&Sr(n,r,t[r])}),Eh=Nu(function(n,t){$u(t,qc(t),n)}),Sh=Nu(function(n,t,r,e){$u(t,qc(t),n,e)}),Wh=Nu(function(n,t,r,e){$u(t,Pc(t),n,e);\n}),Lh=gi(Tr),Ch=uu(function(n,t){n=ll(n);var r=-1,e=t.length,u=e>2?t[2]:X;for(u&&Ui(t[0],t[1],u)&&(e=1);++r<e;)for(var i=t[r],o=qc(i),f=-1,c=o.length;++f<c;){var a=o[f],l=n[a];(l===X||Gf(l,gl[a])&&!bl.call(n,a))&&(n[a]=i[a])}return n}),Uh=uu(function(t){return t.push(X,si),n(Mh,X,t)}),Bh=Xu(function(n,t,r){null!=t&&\"function\"!=typeof t.toString&&(t=xl.call(t)),n[t]=r},Sa(La)),Th=Xu(function(n,t,r){null!=t&&\"function\"!=typeof t.toString&&(t=xl.call(t)),bl.call(n,t)?n[t].push(r):n[t]=[r]},mi),$h=uu(Ie),Dh=Nu(function(n,t,r){\nKe(n,t,r)}),Mh=Nu(function(n,t,r,e){Ke(n,t,r,e)}),Fh=gi(function(n,t){var r={};if(null==n)return r;var e=!1;t=c(t,function(t){return t=ku(t,n),e||(e=t.length>1),t}),$u(n,di(n),r),e&&(r=Fr(r,an|ln|sn,hi));for(var u=t.length;u--;)yu(r,t[u]);return r}),Nh=gi(function(n,t){return null==n?{}:Je(n,t)}),Ph=ci(Pc),qh=ci(qc),Zh=Vu(function(n,t,r){return t=t.toLowerCase(),n+(r?fa(t):t)}),Kh=Vu(function(n,t,r){return n+(r?\"-\":\"\")+t.toLowerCase()}),Vh=Vu(function(n,t,r){return n+(r?\" \":\"\")+t.toLowerCase()}),Gh=Ku(\"toLowerCase\"),Hh=Vu(function(n,t,r){\nreturn n+(r?\"_\":\"\")+t.toLowerCase()}),Jh=Vu(function(n,t,r){return n+(r?\" \":\"\")+Qh(t)}),Yh=Vu(function(n,t,r){return n+(r?\" \":\"\")+t.toUpperCase()}),Qh=Ku(\"toUpperCase\"),Xh=uu(function(t,r){try{return n(t,X,r)}catch(n){return rc(n)?n:new fl(n)}}),np=gi(function(n,t){return r(t,function(t){t=no(t),Br(n,t,ch(n[t],n))}),n}),tp=Yu(),rp=Yu(!0),ep=uu(function(n,t){return function(r){return Ie(r,n,t)}}),up=uu(function(n,t){return function(r){return Ie(n,r,t)}}),ip=ti(c),op=ti(u),fp=ti(h),cp=ui(),ap=ui(!0),lp=ni(function(n,t){\nreturn n+t},0),sp=fi(\"ceil\"),hp=ni(function(n,t){return n/t},1),pp=fi(\"floor\"),_p=ni(function(n,t){return n*t},1),vp=fi(\"round\"),gp=ni(function(n,t){return n-t},0);return Z.after=If,Z.ary=Rf,Z.assign=zh,Z.assignIn=Eh,Z.assignInWith=Sh,Z.assignWith=Wh,Z.at=Lh,Z.before=zf,Z.bind=ch,Z.bindAll=np,Z.bindKey=ah,Z.castArray=Nf,Z.chain=Qo,Z.chunk=uo,Z.compact=io,Z.concat=oo,Z.cond=za,Z.conforms=Ea,Z.constant=Sa,Z.countBy=Xs,Z.create=Sc,Z.curry=Ef,Z.curryRight=Sf,Z.debounce=Wf,Z.defaults=Ch,Z.defaultsDeep=Uh,\nZ.defer=lh,Z.delay=sh,Z.difference=Us,Z.differenceBy=Bs,Z.differenceWith=Ts,Z.drop=fo,Z.dropRight=co,Z.dropRightWhile=ao,Z.dropWhile=lo,Z.fill=so,Z.filter=lf,Z.flatMap=sf,Z.flatMapDeep=hf,Z.flatMapDepth=pf,Z.flatten=_o,Z.flattenDeep=vo,Z.flattenDepth=go,Z.flip=Lf,Z.flow=tp,Z.flowRight=rp,Z.fromPairs=yo,Z.functions=$c,Z.functionsIn=Dc,Z.groupBy=rh,Z.initial=mo,Z.intersection=$s,Z.intersectionBy=Ds,Z.intersectionWith=Ms,Z.invert=Bh,Z.invertBy=Th,Z.invokeMap=eh,Z.iteratee=Ca,Z.keyBy=uh,Z.keys=Pc,Z.keysIn=qc,\nZ.map=yf,Z.mapKeys=Zc,Z.mapValues=Kc,Z.matches=Ua,Z.matchesProperty=Ba,Z.memoize=Cf,Z.merge=Dh,Z.mergeWith=Mh,Z.method=ep,Z.methodOf=up,Z.mixin=Ta,Z.negate=Uf,Z.nthArg=Ma,Z.omit=Fh,Z.omitBy=Vc,Z.once=Bf,Z.orderBy=df,Z.over=ip,Z.overArgs=hh,Z.overEvery=op,Z.overSome=fp,Z.partial=ph,Z.partialRight=_h,Z.partition=ih,Z.pick=Nh,Z.pickBy=Gc,Z.property=Fa,Z.propertyOf=Na,Z.pull=Fs,Z.pullAll=Oo,Z.pullAllBy=Io,Z.pullAllWith=Ro,Z.pullAt=Ns,Z.range=cp,Z.rangeRight=ap,Z.rearg=vh,Z.reject=mf,Z.remove=zo,Z.rest=Tf,\nZ.reverse=Eo,Z.sampleSize=jf,Z.set=Jc,Z.setWith=Yc,Z.shuffle=Af,Z.slice=So,Z.sortBy=oh,Z.sortedUniq=$o,Z.sortedUniqBy=Do,Z.split=da,Z.spread=$f,Z.tail=Mo,Z.take=Fo,Z.takeRight=No,Z.takeRightWhile=Po,Z.takeWhile=qo,Z.tap=Xo,Z.throttle=Df,Z.thru=nf,Z.toArray=jc,Z.toPairs=Ph,Z.toPairsIn=qh,Z.toPath=Ha,Z.toPlainObject=Rc,Z.transform=Qc,Z.unary=Mf,Z.union=Ps,Z.unionBy=qs,Z.unionWith=Zs,Z.uniq=Zo,Z.uniqBy=Ko,Z.uniqWith=Vo,Z.unset=Xc,Z.unzip=Go,Z.unzipWith=Ho,Z.update=na,Z.updateWith=ta,Z.values=ra,Z.valuesIn=ea,\nZ.without=Ks,Z.words=Ra,Z.wrap=Ff,Z.xor=Vs,Z.xorBy=Gs,Z.xorWith=Hs,Z.zip=Js,Z.zipObject=Jo,Z.zipObjectDeep=Yo,Z.zipWith=Ys,Z.entries=Ph,Z.entriesIn=qh,Z.extend=Eh,Z.extendWith=Sh,Ta(Z,Z),Z.add=lp,Z.attempt=Xh,Z.camelCase=Zh,Z.capitalize=fa,Z.ceil=sp,Z.clamp=ua,Z.clone=Pf,Z.cloneDeep=Zf,Z.cloneDeepWith=Kf,Z.cloneWith=qf,Z.conformsTo=Vf,Z.deburr=ca,Z.defaultTo=Wa,Z.divide=hp,Z.endsWith=aa,Z.eq=Gf,Z.escape=la,Z.escapeRegExp=sa,Z.every=af,Z.find=nh,Z.findIndex=ho,Z.findKey=Wc,Z.findLast=th,Z.findLastIndex=po,\nZ.findLastKey=Lc,Z.floor=pp,Z.forEach=_f,Z.forEachRight=vf,Z.forIn=Cc,Z.forInRight=Uc,Z.forOwn=Bc,Z.forOwnRight=Tc,Z.get=Mc,Z.gt=gh,Z.gte=yh,Z.has=Fc,Z.hasIn=Nc,Z.head=bo,Z.identity=La,Z.includes=gf,Z.indexOf=wo,Z.inRange=ia,Z.invoke=$h,Z.isArguments=dh,Z.isArray=bh,Z.isArrayBuffer=wh,Z.isArrayLike=Hf,Z.isArrayLikeObject=Jf,Z.isBoolean=Yf,Z.isBuffer=mh,Z.isDate=xh,Z.isElement=Qf,Z.isEmpty=Xf,Z.isEqual=nc,Z.isEqualWith=tc,Z.isError=rc,Z.isFinite=ec,Z.isFunction=uc,Z.isInteger=ic,Z.isLength=oc,Z.isMap=jh,\nZ.isMatch=ac,Z.isMatchWith=lc,Z.isNaN=sc,Z.isNative=hc,Z.isNil=_c,Z.isNull=pc,Z.isNumber=vc,Z.isObject=fc,Z.isObjectLike=cc,Z.isPlainObject=gc,Z.isRegExp=Ah,Z.isSafeInteger=yc,Z.isSet=kh,Z.isString=dc,Z.isSymbol=bc,Z.isTypedArray=Oh,Z.isUndefined=wc,Z.isWeakMap=mc,Z.isWeakSet=xc,Z.join=xo,Z.kebabCase=Kh,Z.last=jo,Z.lastIndexOf=Ao,Z.lowerCase=Vh,Z.lowerFirst=Gh,Z.lt=Ih,Z.lte=Rh,Z.max=Ya,Z.maxBy=Qa,Z.mean=Xa,Z.meanBy=nl,Z.min=tl,Z.minBy=rl,Z.stubArray=Pa,Z.stubFalse=qa,Z.stubObject=Za,Z.stubString=Ka,\nZ.stubTrue=Va,Z.multiply=_p,Z.nth=ko,Z.noConflict=$a,Z.noop=Da,Z.now=fh,Z.pad=ha,Z.padEnd=pa,Z.padStart=_a,Z.parseInt=va,Z.random=oa,Z.reduce=bf,Z.reduceRight=wf,Z.repeat=ga,Z.replace=ya,Z.result=Hc,Z.round=vp,Z.runInContext=p,Z.sample=xf,Z.size=kf,Z.snakeCase=Hh,Z.some=Of,Z.sortedIndex=Wo,Z.sortedIndexBy=Lo,Z.sortedIndexOf=Co,Z.sortedLastIndex=Uo,Z.sortedLastIndexBy=Bo,Z.sortedLastIndexOf=To,Z.startCase=Jh,Z.startsWith=ba,Z.subtract=gp,Z.sum=el,Z.sumBy=ul,Z.template=wa,Z.times=Ga,Z.toFinite=Ac,Z.toInteger=kc,\nZ.toLength=Oc,Z.toLower=ma,Z.toNumber=Ic,Z.toSafeInteger=zc,Z.toString=Ec,Z.toUpper=xa,Z.trim=ja,Z.trimEnd=Aa,Z.trimStart=ka,Z.truncate=Oa,Z.unescape=Ia,Z.uniqueId=Ja,Z.upperCase=Yh,Z.upperFirst=Qh,Z.each=_f,Z.eachRight=vf,Z.first=bo,Ta(Z,function(){var n={};return ue(Z,function(t,r){bl.call(Z.prototype,r)||(n[r]=t)}),n}(),{chain:!1}),Z.VERSION=nn,r([\"bind\",\"bindKey\",\"curry\",\"curryRight\",\"partial\",\"partialRight\"],function(n){Z[n].placeholder=Z}),r([\"drop\",\"take\"],function(n,t){Ct.prototype[n]=function(r){\nr=r===X?1:Gl(kc(r),0);var e=this.__filtered__&&!t?new Ct(this):this.clone();return e.__filtered__?e.__takeCount__=Hl(r,e.__takeCount__):e.__views__.push({size:Hl(r,Un),type:n+(e.__dir__<0?\"Right\":\"\")}),e},Ct.prototype[n+\"Right\"]=function(t){return this.reverse()[n](t).reverse()}}),r([\"filter\",\"map\",\"takeWhile\"],function(n,t){var r=t+1,e=r==Rn||r==En;Ct.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:mi(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r([\"head\",\"last\"],function(n,t){\nvar r=\"take\"+(t?\"Right\":\"\");Ct.prototype[n]=function(){return this[r](1).value()[0]}}),r([\"initial\",\"tail\"],function(n,t){var r=\"drop\"+(t?\"\":\"Right\");Ct.prototype[n]=function(){return this.__filtered__?new Ct(this):this[r](1)}}),Ct.prototype.compact=function(){return this.filter(La)},Ct.prototype.find=function(n){return this.filter(n).head()},Ct.prototype.findLast=function(n){return this.reverse().find(n)},Ct.prototype.invokeMap=uu(function(n,t){return\"function\"==typeof n?new Ct(this):this.map(function(r){\nreturn Ie(r,n,t)})}),Ct.prototype.reject=function(n){return this.filter(Uf(mi(n)))},Ct.prototype.slice=function(n,t){n=kc(n);var r=this;return r.__filtered__&&(n>0||t<0)?new Ct(r):(n<0?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==X&&(t=kc(t),r=t<0?r.dropRight(-t):r.take(t-n)),r)},Ct.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ct.prototype.toArray=function(){return this.take(Un)},ue(Ct.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=Z[e?\"take\"+(\"last\"==t?\"Right\":\"\"):t],i=e||/^find/.test(t);\nu&&(Z.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ct,c=o[0],l=f||bh(t),s=function(n){var t=u.apply(Z,a([n],o));return e&&h?t[0]:t};l&&r&&\"function\"==typeof c&&1!=c.length&&(f=l=!1);var h=this.__chain__,p=!!this.__actions__.length,_=i&&!h,v=f&&!p;if(!i&&l){t=v?t:new Ct(this);var g=n.apply(t,o);return g.__actions__.push({func:nf,args:[s],thisArg:X}),new Y(g,h)}return _&&v?n.apply(this,o):(g=this.thru(s),_?e?g.value()[0]:g.value():g)})}),r([\"pop\",\"push\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){\nvar t=_l[n],r=/^(?:push|sort|unshift)$/.test(n)?\"tap\":\"thru\",e=/^(?:pop|shift)$/.test(n);Z.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(bh(u)?u:[],n)}return this[r](function(r){return t.apply(bh(r)?r:[],n)})}}),ue(Ct.prototype,function(n,t){var r=Z[t];if(r){var e=r.name+\"\";bl.call(fs,e)||(fs[e]=[]),fs[e].push({name:t,func:r})}}),fs[Qu(X,vn).name]=[{name:\"wrapper\",func:X}],Ct.prototype.clone=$t,Ct.prototype.reverse=Yt,Ct.prototype.value=Qt,Z.prototype.at=Qs,\nZ.prototype.chain=tf,Z.prototype.commit=rf,Z.prototype.next=ef,Z.prototype.plant=of,Z.prototype.reverse=ff,Z.prototype.toJSON=Z.prototype.valueOf=Z.prototype.value=cf,Z.prototype.first=Z.prototype.head,Ul&&(Z.prototype[Ul]=uf),Z},be=de();\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd?(re._=be,define(function(){return be})):ue?((ue.exports=be)._=be,ee._=be):re._=be}).call(this);"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lowerCase.js",
    "content": "var createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\nvar lowerCase = createCompounder(function(result, word, index) {\n  return result + (index ? ' ' : '') + word.toLowerCase();\n});\n\nmodule.exports = lowerCase;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lowerFirst.js",
    "content": "var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\nvar lowerFirst = createCaseFirst('toLowerCase');\n\nmodule.exports = lowerFirst;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lt.js",
    "content": "var baseLt = require('./_baseLt'),\n    createRelationalOperation = require('./_createRelationalOperation');\n\n/**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n *  else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\nvar lt = createRelationalOperation(baseLt);\n\nmodule.exports = lt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/lte.js",
    "content": "var createRelationalOperation = require('./_createRelationalOperation');\n\n/**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n *  `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\nvar lte = createRelationalOperation(function(value, other) {\n  return value <= other;\n});\n\nmodule.exports = lte;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/map.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n  var func = isArray(collection) ? arrayMap : baseMap;\n  return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/mapKeys.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    baseForOwn = require('./_baseForOwn'),\n    baseIteratee = require('./_baseIteratee');\n\n/**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n *   return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\nfunction mapKeys(object, iteratee) {\n  var result = {};\n  iteratee = baseIteratee(iteratee, 3);\n\n  baseForOwn(object, function(value, key, object) {\n    baseAssignValue(result, iteratee(value, key, object), value);\n  });\n  return result;\n}\n\nmodule.exports = mapKeys;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/mapValues.js",
    "content": "var baseAssignValue = require('./_baseAssignValue'),\n    baseForOwn = require('./_baseForOwn'),\n    baseIteratee = require('./_baseIteratee');\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n *   'fred':    { 'user': 'fred',    'age': 40 },\n *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n  var result = {};\n  iteratee = baseIteratee(iteratee, 3);\n\n  baseForOwn(object, function(value, key, object) {\n    baseAssignValue(result, key, iteratee(value, key, object));\n  });\n  return result;\n}\n\nmodule.exports = mapValues;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/matches.js",
    "content": "var baseClone = require('./_baseClone'),\n    baseMatches = require('./_baseMatches');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a function that performs a partial deep comparison between a given\n * object and `source`, returning `true` if the given object has equivalent\n * property values, else `false`.\n *\n * **Note:** The created function is equivalent to `_.isMatch` with `source`\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n *   { 'a': 1, 'b': 2, 'c': 3 },\n *   { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */\nfunction matches(source) {\n  return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n}\n\nmodule.exports = matches;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/matchesProperty.js",
    "content": "var baseClone = require('./_baseClone'),\n    baseMatchesProperty = require('./_baseMatchesProperty');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1;\n\n/**\n * Creates a function that performs a partial deep comparison between the\n * value at `path` of a given object to `srcValue`, returning `true` if the\n * object value is equivalent, else `false`.\n *\n * **Note:** Partial comparisons will match empty array and empty object\n * `srcValue` values against any array or object value, respectively. See\n * `_.isEqual` for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n *   { 'a': 1, 'b': 2, 'c': 3 },\n *   { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.find(objects, _.matchesProperty('a', 4));\n * // => { 'a': 4, 'b': 5, 'c': 6 }\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */\nfunction matchesProperty(path, srcValue) {\n  return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n}\n\nmodule.exports = matchesProperty;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/math.js",
    "content": "module.exports = {\n  'add': require('./add'),\n  'ceil': require('./ceil'),\n  'divide': require('./divide'),\n  'floor': require('./floor'),\n  'max': require('./max'),\n  'maxBy': require('./maxBy'),\n  'mean': require('./mean'),\n  'meanBy': require('./meanBy'),\n  'min': require('./min'),\n  'minBy': require('./minBy'),\n  'multiply': require('./multiply'),\n  'round': require('./round'),\n  'subtract': require('./subtract'),\n  'sum': require('./sum'),\n  'sumBy': require('./sumBy')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/max.js",
    "content": "var baseExtremum = require('./_baseExtremum'),\n    baseGt = require('./_baseGt'),\n    identity = require('./identity');\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n  return (array && array.length)\n    ? baseExtremum(array, identity, baseGt)\n    : undefined;\n}\n\nmodule.exports = max;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/maxBy.js",
    "content": "var baseExtremum = require('./_baseExtremum'),\n    baseGt = require('./_baseGt'),\n    baseIteratee = require('./_baseIteratee');\n\n/**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\nfunction maxBy(array, iteratee) {\n  return (array && array.length)\n    ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt)\n    : undefined;\n}\n\nmodule.exports = maxBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/mean.js",
    "content": "var baseMean = require('./_baseMean'),\n    identity = require('./identity');\n\n/**\n * Computes the mean of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the mean.\n * @example\n *\n * _.mean([4, 2, 8, 6]);\n * // => 5\n */\nfunction mean(array) {\n  return baseMean(array, identity);\n}\n\nmodule.exports = mean;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/meanBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseMean = require('./_baseMean');\n\n/**\n * This method is like `_.mean` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be averaged.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the mean.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.meanBy(objects, function(o) { return o.n; });\n * // => 5\n *\n * // The `_.property` iteratee shorthand.\n * _.meanBy(objects, 'n');\n * // => 5\n */\nfunction meanBy(array, iteratee) {\n  return baseMean(array, baseIteratee(iteratee, 2));\n}\n\nmodule.exports = meanBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/memoize.js",
    "content": "var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/merge.js",
    "content": "var baseMerge = require('./_baseMerge'),\n    createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n *   'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n *   'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n  baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/mergeWith.js",
    "content": "var baseMerge = require('./_baseMerge'),\n    createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n *   if (_.isArray(objValue)) {\n *     return objValue.concat(srcValue);\n *   }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\nvar mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n  baseMerge(object, source, srcIndex, customizer);\n});\n\nmodule.exports = mergeWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/method.js",
    "content": "var baseInvoke = require('./_baseInvoke'),\n    baseRest = require('./_baseRest');\n\n/**\n * Creates a function that invokes the method at `path` of a given object.\n * Any additional arguments are provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': _.constant(2) } },\n *   { 'a': { 'b': _.constant(1) } }\n * ];\n *\n * _.map(objects, _.method('a.b'));\n * // => [2, 1]\n *\n * _.map(objects, _.method(['a', 'b']));\n * // => [2, 1]\n */\nvar method = baseRest(function(path, args) {\n  return function(object) {\n    return baseInvoke(object, path, args);\n  };\n});\n\nmodule.exports = method;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/methodOf.js",
    "content": "var baseInvoke = require('./_baseInvoke'),\n    baseRest = require('./_baseRest');\n\n/**\n * The opposite of `_.method`; this method creates a function that invokes\n * the method at a given path of `object`. Any additional arguments are\n * provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Object} object The object to query.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var array = _.times(3, _.constant),\n *     object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n * // => [2, 0]\n */\nvar methodOf = baseRest(function(object, args) {\n  return function(path) {\n    return baseInvoke(object, path, args);\n  };\n});\n\nmodule.exports = methodOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/min.js",
    "content": "var baseExtremum = require('./_baseExtremum'),\n    baseLt = require('./_baseLt'),\n    identity = require('./identity');\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n  return (array && array.length)\n    ? baseExtremum(array, identity, baseLt)\n    : undefined;\n}\n\nmodule.exports = min;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/minBy.js",
    "content": "var baseExtremum = require('./_baseExtremum'),\n    baseIteratee = require('./_baseIteratee'),\n    baseLt = require('./_baseLt');\n\n/**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\nfunction minBy(array, iteratee) {\n  return (array && array.length)\n    ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)\n    : undefined;\n}\n\nmodule.exports = minBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/mixin.js",
    "content": "var arrayEach = require('./_arrayEach'),\n    arrayPush = require('./_arrayPush'),\n    baseFunctions = require('./_baseFunctions'),\n    copyArray = require('./_copyArray'),\n    isFunction = require('./isFunction'),\n    isObject = require('./isObject'),\n    keys = require('./keys');\n\n/**\n * Adds all own enumerable string keyed function properties of a source\n * object to the destination object. If `object` is a function, then methods\n * are added to its prototype as well.\n *\n * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n * avoid conflicts caused by modifying the original.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Function|Object} [object=lodash] The destination object.\n * @param {Object} source The object of functions to add.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n * @returns {Function|Object} Returns `object`.\n * @example\n *\n * function vowels(string) {\n *   return _.filter(string, function(v) {\n *     return /[aeiou]/i.test(v);\n *   });\n * }\n *\n * _.mixin({ 'vowels': vowels });\n * _.vowels('fred');\n * // => ['e']\n *\n * _('fred').vowels().value();\n * // => ['e']\n *\n * _.mixin({ 'vowels': vowels }, { 'chain': false });\n * _('fred').vowels();\n * // => ['e']\n */\nfunction mixin(object, source, options) {\n  var props = keys(source),\n      methodNames = baseFunctions(source, props);\n\n  var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n      isFunc = isFunction(object);\n\n  arrayEach(methodNames, function(methodName) {\n    var func = source[methodName];\n    object[methodName] = func;\n    if (isFunc) {\n      object.prototype[methodName] = function() {\n        var chainAll = this.__chain__;\n        if (chain || chainAll) {\n          var result = object(this.__wrapped__),\n              actions = result.__actions__ = copyArray(this.__actions__);\n\n          actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n          result.__chain__ = chainAll;\n          return result;\n        }\n        return func.apply(object, arrayPush([this.value()], arguments));\n      };\n    }\n  });\n\n  return object;\n}\n\nmodule.exports = mixin;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/multiply.js",
    "content": "var createMathOperation = require('./_createMathOperation');\n\n/**\n * Multiply two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} multiplier The first number in a multiplication.\n * @param {number} multiplicand The second number in a multiplication.\n * @returns {number} Returns the product.\n * @example\n *\n * _.multiply(6, 4);\n * // => 24\n */\nvar multiply = createMathOperation(function(multiplier, multiplicand) {\n  return multiplier * multiplicand;\n}, 1);\n\nmodule.exports = multiply;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/negate.js",
    "content": "/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n *   return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n  if (typeof predicate != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  return function() {\n    var args = arguments;\n    switch (args.length) {\n      case 0: return !predicate.call(this);\n      case 1: return !predicate.call(this, args[0]);\n      case 2: return !predicate.call(this, args[0], args[1]);\n      case 3: return !predicate.call(this, args[0], args[1], args[2]);\n    }\n    return !predicate.apply(this, args);\n  };\n}\n\nmodule.exports = negate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/next.js",
    "content": "var toArray = require('./toArray');\n\n/**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\nfunction wrapperNext() {\n  if (this.__values__ === undefined) {\n    this.__values__ = toArray(this.value());\n  }\n  var done = this.__index__ >= this.__values__.length,\n      value = done ? undefined : this.__values__[this.__index__++];\n\n  return { 'done': done, 'value': value };\n}\n\nmodule.exports = wrapperNext;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/noop.js",
    "content": "/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/now.js",
    "content": "var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\nmodule.exports = now;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/nth.js",
    "content": "var baseNth = require('./_baseNth'),\n    toInteger = require('./toInteger');\n\n/**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\nfunction nth(array, n) {\n  return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n}\n\nmodule.exports = nth;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/nthArg.js",
    "content": "var baseNth = require('./_baseNth'),\n    baseRest = require('./_baseRest'),\n    toInteger = require('./toInteger');\n\n/**\n * Creates a function that gets the argument at index `n`. If `n` is negative,\n * the nth argument from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [n=0] The index of the argument to return.\n * @returns {Function} Returns the new pass-thru function.\n * @example\n *\n * var func = _.nthArg(1);\n * func('a', 'b', 'c', 'd');\n * // => 'b'\n *\n * var func = _.nthArg(-2);\n * func('a', 'b', 'c', 'd');\n * // => 'c'\n */\nfunction nthArg(n) {\n  n = toInteger(n);\n  return baseRest(function(args) {\n    return baseNth(args, n);\n  });\n}\n\nmodule.exports = nthArg;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/number.js",
    "content": "module.exports = {\n  'clamp': require('./clamp'),\n  'inRange': require('./inRange'),\n  'random': require('./random')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/object.js",
    "content": "module.exports = {\n  'assign': require('./assign'),\n  'assignIn': require('./assignIn'),\n  'assignInWith': require('./assignInWith'),\n  'assignWith': require('./assignWith'),\n  'at': require('./at'),\n  'create': require('./create'),\n  'defaults': require('./defaults'),\n  'defaultsDeep': require('./defaultsDeep'),\n  'entries': require('./entries'),\n  'entriesIn': require('./entriesIn'),\n  'extend': require('./extend'),\n  'extendWith': require('./extendWith'),\n  'findKey': require('./findKey'),\n  'findLastKey': require('./findLastKey'),\n  'forIn': require('./forIn'),\n  'forInRight': require('./forInRight'),\n  'forOwn': require('./forOwn'),\n  'forOwnRight': require('./forOwnRight'),\n  'functions': require('./functions'),\n  'functionsIn': require('./functionsIn'),\n  'get': require('./get'),\n  'has': require('./has'),\n  'hasIn': require('./hasIn'),\n  'invert': require('./invert'),\n  'invertBy': require('./invertBy'),\n  'invoke': require('./invoke'),\n  'keys': require('./keys'),\n  'keysIn': require('./keysIn'),\n  'mapKeys': require('./mapKeys'),\n  'mapValues': require('./mapValues'),\n  'merge': require('./merge'),\n  'mergeWith': require('./mergeWith'),\n  'omit': require('./omit'),\n  'omitBy': require('./omitBy'),\n  'pick': require('./pick'),\n  'pickBy': require('./pickBy'),\n  'result': require('./result'),\n  'set': require('./set'),\n  'setWith': require('./setWith'),\n  'toPairs': require('./toPairs'),\n  'toPairsIn': require('./toPairsIn'),\n  'transform': require('./transform'),\n  'unset': require('./unset'),\n  'update': require('./update'),\n  'updateWith': require('./updateWith'),\n  'values': require('./values'),\n  'valuesIn': require('./valuesIn')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/omit.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseClone = require('./_baseClone'),\n    baseUnset = require('./_baseUnset'),\n    castPath = require('./_castPath'),\n    copyObject = require('./_copyObject'),\n    customOmitClone = require('./_customOmitClone'),\n    flatRest = require('./_flatRest'),\n    getAllKeysIn = require('./_getAllKeysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\nvar omit = flatRest(function(object, paths) {\n  var result = {};\n  if (object == null) {\n    return result;\n  }\n  var isDeep = false;\n  paths = arrayMap(paths, function(path) {\n    path = castPath(path, object);\n    isDeep || (isDeep = path.length > 1);\n    return path;\n  });\n  copyObject(object, getAllKeysIn(object), result);\n  if (isDeep) {\n    result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n  }\n  var length = paths.length;\n  while (length--) {\n    baseUnset(result, paths[length]);\n  }\n  return result;\n});\n\nmodule.exports = omit;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/omitBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    negate = require('./negate'),\n    pickBy = require('./pickBy');\n\n/**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\nfunction omitBy(object, predicate) {\n  return pickBy(object, negate(baseIteratee(predicate)));\n}\n\nmodule.exports = omitBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/once.js",
    "content": "var before = require('./before');\n\n/**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\nfunction once(func) {\n  return before(2, func);\n}\n\nmodule.exports = once;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/orderBy.js",
    "content": "var baseOrderBy = require('./_baseOrderBy'),\n    isArray = require('./isArray');\n\n/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n *  The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n *   { 'user': 'fred',   'age': 48 },\n *   { 'user': 'barney', 'age': 34 },\n *   { 'user': 'fred',   'age': 40 },\n *   { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\nfunction orderBy(collection, iteratees, orders, guard) {\n  if (collection == null) {\n    return [];\n  }\n  if (!isArray(iteratees)) {\n    iteratees = iteratees == null ? [] : [iteratees];\n  }\n  orders = guard ? undefined : orders;\n  if (!isArray(orders)) {\n    orders = orders == null ? [] : [orders];\n  }\n  return baseOrderBy(collection, iteratees, orders);\n}\n\nmodule.exports = orderBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/over.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    createOver = require('./_createOver');\n\n/**\n * Creates a function that invokes `iteratees` with the arguments it receives\n * and returns their results.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n *  The iteratees to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.over([Math.max, Math.min]);\n *\n * func(1, 2, 3, 4);\n * // => [4, 1]\n */\nvar over = createOver(arrayMap);\n\nmodule.exports = over;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/overArgs.js",
    "content": "var apply = require('./_apply'),\n    arrayMap = require('./_arrayMap'),\n    baseFlatten = require('./_baseFlatten'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    baseUnary = require('./_baseUnary'),\n    castRest = require('./_castRest'),\n    isArray = require('./isArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n *  The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n *   return n * 2;\n * }\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n *   return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\nvar overArgs = castRest(function(func, transforms) {\n  transforms = (transforms.length == 1 && isArray(transforms[0]))\n    ? arrayMap(transforms[0], baseUnary(baseIteratee))\n    : arrayMap(baseFlatten(transforms, 1), baseUnary(baseIteratee));\n\n  var funcsLength = transforms.length;\n  return baseRest(function(args) {\n    var index = -1,\n        length = nativeMin(args.length, funcsLength);\n\n    while (++index < length) {\n      args[index] = transforms[index].call(this, args[index]);\n    }\n    return apply(func, this, args);\n  });\n});\n\nmodule.exports = overArgs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/overEvery.js",
    "content": "var arrayEvery = require('./_arrayEvery'),\n    createOver = require('./_createOver');\n\n/**\n * Creates a function that checks if **all** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n *  The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overEvery([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => false\n *\n * func(NaN);\n * // => false\n */\nvar overEvery = createOver(arrayEvery);\n\nmodule.exports = overEvery;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/overSome.js",
    "content": "var arraySome = require('./_arraySome'),\n    createOver = require('./_createOver');\n\n/**\n * Creates a function that checks if **any** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n *  The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overSome([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => true\n *\n * func(NaN);\n * // => false\n *\n * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n */\nvar overSome = createOver(arraySome);\n\nmodule.exports = overSome;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/package.json",
    "content": "{\n  \"name\": \"lodash\",\n  \"version\": \"4.17.21\",\n  \"description\": \"Lodash modular utilities.\",\n  \"keywords\": \"modules, stdlib, util\",\n  \"homepage\": \"https://lodash.com/\",\n  \"repository\": \"lodash/lodash\",\n  \"icon\": \"https://lodash.com/icon.svg\",\n  \"license\": \"MIT\",\n  \"main\": \"lodash.js\",\n  \"author\": \"John-David Dalton <john.david.dalton@gmail.com>\",\n  \"contributors\": [\n    \"John-David Dalton <john.david.dalton@gmail.com>\",\n    \"Mathias Bynens <mathias@qiwi.be>\"\n  ],\n  \"scripts\": { \"test\": \"echo \\\"See https://travis-ci.org/lodash-archive/lodash-cli for testing details.\\\"\" }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pad.js",
    "content": "var createPadding = require('./_createPadding'),\n    stringSize = require('./_stringSize'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n    nativeFloor = Math.floor;\n\n/**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => '  abc   '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\nfunction pad(string, length, chars) {\n  string = toString(string);\n  length = toInteger(length);\n\n  var strLength = length ? stringSize(string) : 0;\n  if (!length || strLength >= length) {\n    return string;\n  }\n  var mid = (length - strLength) / 2;\n  return (\n    createPadding(nativeFloor(mid), chars) +\n    string +\n    createPadding(nativeCeil(mid), chars)\n  );\n}\n\nmodule.exports = pad;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/padEnd.js",
    "content": "var createPadding = require('./_createPadding'),\n    stringSize = require('./_stringSize'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc   '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\nfunction padEnd(string, length, chars) {\n  string = toString(string);\n  length = toInteger(length);\n\n  var strLength = length ? stringSize(string) : 0;\n  return (length && strLength < length)\n    ? (string + createPadding(length - strLength, chars))\n    : string;\n}\n\nmodule.exports = padEnd;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/padStart.js",
    "content": "var createPadding = require('./_createPadding'),\n    stringSize = require('./_stringSize'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => '   abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\nfunction padStart(string, length, chars) {\n  string = toString(string);\n  length = toInteger(length);\n\n  var strLength = length ? stringSize(string) : 0;\n  return (length && strLength < length)\n    ? (createPadding(length - strLength, chars) + string)\n    : string;\n}\n\nmodule.exports = padStart;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/parseInt.js",
    "content": "var root = require('./_root'),\n    toString = require('./toString');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeParseInt = root.parseInt;\n\n/**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\nfunction parseInt(string, radix, guard) {\n  if (guard || radix == null) {\n    radix = 0;\n  } else if (radix) {\n    radix = +radix;\n  }\n  return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n}\n\nmodule.exports = parseInt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/partial.js",
    "content": "var baseRest = require('./_baseRest'),\n    createWrap = require('./_createWrap'),\n    getHolder = require('./_getHolder'),\n    replaceHolders = require('./_replaceHolders');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_PARTIAL_FLAG = 32;\n\n/**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n *   return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\nvar partial = baseRest(function(func, partials) {\n  var holders = replaceHolders(partials, getHolder(partial));\n  return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n});\n\n// Assign default placeholders.\npartial.placeholder = {};\n\nmodule.exports = partial;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/partialRight.js",
    "content": "var baseRest = require('./_baseRest'),\n    createWrap = require('./_createWrap'),\n    getHolder = require('./_getHolder'),\n    replaceHolders = require('./_replaceHolders');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n *   return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\nvar partialRight = baseRest(function(func, partials) {\n  var holders = replaceHolders(partials, getHolder(partialRight));\n  return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n});\n\n// Assign default placeholders.\npartialRight.placeholder = {};\n\nmodule.exports = partialRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/partition.js",
    "content": "var createAggregator = require('./_createAggregator');\n\n/**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'age': 36, 'active': false },\n *   { 'user': 'fred',    'age': 40, 'active': true },\n *   { 'user': 'pebbles', 'age': 1,  'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\nvar partition = createAggregator(function(result, value, key) {\n  result[key ? 0 : 1].push(value);\n}, function() { return [[], []]; });\n\nmodule.exports = partition;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pick.js",
    "content": "var basePick = require('./_basePick'),\n    flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n  return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pickBy.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    basePickBy = require('./_basePickBy'),\n    getAllKeysIn = require('./_getAllKeysIn');\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\nfunction pickBy(object, predicate) {\n  if (object == null) {\n    return {};\n  }\n  var props = arrayMap(getAllKeysIn(object), function(prop) {\n    return [prop];\n  });\n  predicate = baseIteratee(predicate);\n  return basePickBy(object, props, function(value, path) {\n    return predicate(value, path[0]);\n  });\n}\n\nmodule.exports = pickBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/plant.js",
    "content": "var baseLodash = require('./_baseLodash'),\n    wrapperClone = require('./_wrapperClone');\n\n/**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\nfunction wrapperPlant(value) {\n  var result,\n      parent = this;\n\n  while (parent instanceof baseLodash) {\n    var clone = wrapperClone(parent);\n    clone.__index__ = 0;\n    clone.__values__ = undefined;\n    if (result) {\n      previous.__wrapped__ = clone;\n    } else {\n      result = clone;\n    }\n    var previous = clone;\n    parent = parent.__wrapped__;\n  }\n  previous.__wrapped__ = value;\n  return result;\n}\n\nmodule.exports = wrapperPlant;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/property.js",
    "content": "var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/propertyOf.js",
    "content": "var baseGet = require('./_baseGet');\n\n/**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n *     object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */\nfunction propertyOf(object) {\n  return function(path) {\n    return object == null ? undefined : baseGet(object, path);\n  };\n}\n\nmodule.exports = propertyOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pull.js",
    "content": "var baseRest = require('./_baseRest'),\n    pullAll = require('./pullAll');\n\n/**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\nvar pull = baseRest(pullAll);\n\nmodule.exports = pull;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pullAll.js",
    "content": "var basePullAll = require('./_basePullAll');\n\n/**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\nfunction pullAll(array, values) {\n  return (array && array.length && values && values.length)\n    ? basePullAll(array, values)\n    : array;\n}\n\nmodule.exports = pullAll;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pullAllBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    basePullAll = require('./_basePullAll');\n\n/**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\nfunction pullAllBy(array, values, iteratee) {\n  return (array && array.length && values && values.length)\n    ? basePullAll(array, values, baseIteratee(iteratee, 2))\n    : array;\n}\n\nmodule.exports = pullAllBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pullAllWith.js",
    "content": "var basePullAll = require('./_basePullAll');\n\n/**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\nfunction pullAllWith(array, values, comparator) {\n  return (array && array.length && values && values.length)\n    ? basePullAll(array, values, undefined, comparator)\n    : array;\n}\n\nmodule.exports = pullAllWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/pullAt.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    baseAt = require('./_baseAt'),\n    basePullAt = require('./_basePullAt'),\n    compareAscending = require('./_compareAscending'),\n    flatRest = require('./_flatRest'),\n    isIndex = require('./_isIndex');\n\n/**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\nvar pullAt = flatRest(function(array, indexes) {\n  var length = array == null ? 0 : array.length,\n      result = baseAt(array, indexes);\n\n  basePullAt(array, arrayMap(indexes, function(index) {\n    return isIndex(index, length) ? +index : index;\n  }).sort(compareAscending));\n\n  return result;\n});\n\nmodule.exports = pullAt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/random.js",
    "content": "var baseRandom = require('./_baseRandom'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toFinite = require('./toFinite');\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseFloat = parseFloat;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min,\n    nativeRandom = Math.random;\n\n/**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\nfunction random(lower, upper, floating) {\n  if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n    upper = floating = undefined;\n  }\n  if (floating === undefined) {\n    if (typeof upper == 'boolean') {\n      floating = upper;\n      upper = undefined;\n    }\n    else if (typeof lower == 'boolean') {\n      floating = lower;\n      lower = undefined;\n    }\n  }\n  if (lower === undefined && upper === undefined) {\n    lower = 0;\n    upper = 1;\n  }\n  else {\n    lower = toFinite(lower);\n    if (upper === undefined) {\n      upper = lower;\n      lower = 0;\n    } else {\n      upper = toFinite(upper);\n    }\n  }\n  if (lower > upper) {\n    var temp = lower;\n    lower = upper;\n    upper = temp;\n  }\n  if (floating || lower % 1 || upper % 1) {\n    var rand = nativeRandom();\n    return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n  }\n  return baseRandom(lower, upper);\n}\n\nmodule.exports = random;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/range.js",
    "content": "var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/rangeRight.js",
    "content": "var createRange = require('./_createRange');\n\n/**\n * This method is like `_.range` except that it populates values in\n * descending order.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.range\n * @example\n *\n * _.rangeRight(4);\n * // => [3, 2, 1, 0]\n *\n * _.rangeRight(-4);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 5);\n * // => [4, 3, 2, 1]\n *\n * _.rangeRight(0, 20, 5);\n * // => [15, 10, 5, 0]\n *\n * _.rangeRight(0, -4, -1);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.rangeRight(0);\n * // => []\n */\nvar rangeRight = createRange(true);\n\nmodule.exports = rangeRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/rearg.js",
    "content": "var createWrap = require('./_createWrap'),\n    flatRest = require('./_flatRest');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n *   return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\nvar rearg = flatRest(function(func, indexes) {\n  return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n});\n\nmodule.exports = rearg;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/reduce.js",
    "content": "var arrayReduce = require('./_arrayReduce'),\n    baseEach = require('./_baseEach'),\n    baseIteratee = require('./_baseIteratee'),\n    baseReduce = require('./_baseReduce'),\n    isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n *   return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n *   (result[value] || (result[value] = [])).push(key);\n *   return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n  var func = isArray(collection) ? arrayReduce : baseReduce,\n      initAccum = arguments.length < 3;\n\n  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/reduceRight.js",
    "content": "var arrayReduceRight = require('./_arrayReduceRight'),\n    baseEachRight = require('./_baseEachRight'),\n    baseIteratee = require('./_baseIteratee'),\n    baseReduce = require('./_baseReduce'),\n    isArray = require('./isArray');\n\n/**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n *   return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\nfunction reduceRight(collection, iteratee, accumulator) {\n  var func = isArray(collection) ? arrayReduceRight : baseReduce,\n      initAccum = arguments.length < 3;\n\n  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n}\n\nmodule.exports = reduceRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/reject.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    baseFilter = require('./_baseFilter'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray'),\n    negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n *   { 'user': 'barney', 'age': 36, 'active': false },\n *   { 'user': 'fred',   'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n  var func = isArray(collection) ? arrayFilter : baseFilter;\n  return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/release.md",
    "content": "npm run build\nnpm run doc\nnpm i\ngit clone --depth=10 --branch=master git@github.com:lodash-archive/lodash-cli.git ./node_modules/lodash-cli\nmkdir -p ./node_modules/lodash-cli/node_modules/lodash; cd $_; cp ../../../../lodash.js ./lodash.js; cp ../../../../package.json ./package.json\ncd ../../; npm i --production; cd ../../\nnode ./node_modules/lodash-cli/bin/lodash core exports=node -o ./npm-package/core.js\nnode ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./npm-package\ncp lodash.js npm-package/lodash.js\ncp dist/lodash.min.js npm-package/lodash.min.js\ncp LICENSE npm-package/LICENSE\n\n1. Clone two repos\nBump lodash version in package.json, readme, package=locak, lodash.js\nnpm run build\nnpm run doc\n\n2. update mappings in ldoash-cli\n3. copy ldoash into lodash-cli node modules and package json.\n\nnode ./node_modules/lodash-cli/bin/lodash core exports=node -o ./npm-package/core.js\nnode ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./npm-package\n\n\n\n1. Clone the two repositories:\n```sh\n$ git clone https://github.com/lodash/lodash.git\n$ git clone https://github.com/bnjmnt4n/lodash-cli.git\n```\n2. Update lodash-cli to accomdate changes in lodash source. This can typically involve adding new function dependency mappings in lib/mappings.js. Sometimes, additional changes might be needed for more involved functions.\n3. In the lodash repository, update references to the lodash version in README.md, lodash.js, package.jsona nd package-lock.json\n4. Run:\n```sh\nnpm run build\nnpm run doc\nnode ../lodash-cli/bin/lodash core -o ./dist/lodash.core.js\n```\n5. Add a commit and tag the release\nmkdir ../lodash-temp\ncp lodash.js dist/lodash.min.js dist/lodash.core.js dist/lodash.core.min.js ../lodash-temp/\nnode ../lodash-cli/bin/lodash modularize exports=node -o .\ncp ../lodash-temp/lodash.core.js core.js\ncp ../lodash-temp/lodash.core.min.js core.min.js\ncp ../lodash-temp/lodash.js lodash.js\ncp ../lodash-temp/lodash.min.js lodash.min.js\n\n❯ node ../lodash-cli/bin/lodash modularize exports=es -o .\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/remove.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    basePullAt = require('./_basePullAt');\n\n/**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n *   return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\nfunction remove(array, predicate) {\n  var result = [];\n  if (!(array && array.length)) {\n    return result;\n  }\n  var index = -1,\n      indexes = [],\n      length = array.length;\n\n  predicate = baseIteratee(predicate, 3);\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result.push(value);\n      indexes.push(index);\n    }\n  }\n  basePullAt(array, indexes);\n  return result;\n}\n\nmodule.exports = remove;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/repeat.js",
    "content": "var baseRepeat = require('./_baseRepeat'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\nfunction repeat(string, n, guard) {\n  if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n    n = 1;\n  } else {\n    n = toInteger(n);\n  }\n  return baseRepeat(toString(string), n);\n}\n\nmodule.exports = repeat;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/replace.js",
    "content": "var toString = require('./toString');\n\n/**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\nfunction replace() {\n  var args = arguments,\n      string = toString(args[0]);\n\n  return args.length < 3 ? string : string.replace(args[1], args[2]);\n}\n\nmodule.exports = replace;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/rest.js",
    "content": "var baseRest = require('./_baseRest'),\n    toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n *   return what + ' ' + _.initial(names).join(', ') +\n *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  start = start === undefined ? start : toInteger(start);\n  return baseRest(func, start);\n}\n\nmodule.exports = rest;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/result.js",
    "content": "var castPath = require('./_castPath'),\n    isFunction = require('./isFunction'),\n    toKey = require('./_toKey');\n\n/**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\nfunction result(object, path, defaultValue) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length;\n\n  // Ensure the loop is entered when path is empty.\n  if (!length) {\n    length = 1;\n    object = undefined;\n  }\n  while (++index < length) {\n    var value = object == null ? undefined : object[toKey(path[index])];\n    if (value === undefined) {\n      index = length;\n      value = defaultValue;\n    }\n    object = isFunction(value) ? value.call(object) : value;\n  }\n  return object;\n}\n\nmodule.exports = result;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/reverse.js",
    "content": "/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeReverse = arrayProto.reverse;\n\n/**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\nfunction reverse(array) {\n  return array == null ? array : nativeReverse.call(array);\n}\n\nmodule.exports = reverse;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/round.js",
    "content": "var createRound = require('./_createRound');\n\n/**\n * Computes `number` rounded to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round.\n * @param {number} [precision=0] The precision to round to.\n * @returns {number} Returns the rounded number.\n * @example\n *\n * _.round(4.006);\n * // => 4\n *\n * _.round(4.006, 2);\n * // => 4.01\n *\n * _.round(4060, -2);\n * // => 4100\n */\nvar round = createRound('round');\n\nmodule.exports = round;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sample.js",
    "content": "var arraySample = require('./_arraySample'),\n    baseSample = require('./_baseSample'),\n    isArray = require('./isArray');\n\n/**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\nfunction sample(collection) {\n  var func = isArray(collection) ? arraySample : baseSample;\n  return func(collection);\n}\n\nmodule.exports = sample;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sampleSize.js",
    "content": "var arraySampleSize = require('./_arraySampleSize'),\n    baseSampleSize = require('./_baseSampleSize'),\n    isArray = require('./isArray'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toInteger = require('./toInteger');\n\n/**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\nfunction sampleSize(collection, n, guard) {\n  if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n    n = 1;\n  } else {\n    n = toInteger(n);\n  }\n  var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n  return func(collection, n);\n}\n\nmodule.exports = sampleSize;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/seq.js",
    "content": "module.exports = {\n  'at': require('./wrapperAt'),\n  'chain': require('./chain'),\n  'commit': require('./commit'),\n  'lodash': require('./wrapperLodash'),\n  'next': require('./next'),\n  'plant': require('./plant'),\n  'reverse': require('./wrapperReverse'),\n  'tap': require('./tap'),\n  'thru': require('./thru'),\n  'toIterator': require('./toIterator'),\n  'toJSON': require('./toJSON'),\n  'value': require('./wrapperValue'),\n  'valueOf': require('./valueOf'),\n  'wrapperChain': require('./wrapperChain')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/set.js",
    "content": "var baseSet = require('./_baseSet');\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n  return object == null ? object : baseSet(object, path, value);\n}\n\nmodule.exports = set;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/setWith.js",
    "content": "var baseSet = require('./_baseSet');\n\n/**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\nfunction setWith(object, path, value, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  return object == null ? object : baseSet(object, path, value, customizer);\n}\n\nmodule.exports = setWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/shuffle.js",
    "content": "var arrayShuffle = require('./_arrayShuffle'),\n    baseShuffle = require('./_baseShuffle'),\n    isArray = require('./isArray');\n\n/**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\nfunction shuffle(collection) {\n  var func = isArray(collection) ? arrayShuffle : baseShuffle;\n  return func(collection);\n}\n\nmodule.exports = shuffle;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/size.js",
    "content": "var baseKeys = require('./_baseKeys'),\n    getTag = require('./_getTag'),\n    isArrayLike = require('./isArrayLike'),\n    isString = require('./isString'),\n    stringSize = require('./_stringSize');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\nfunction size(collection) {\n  if (collection == null) {\n    return 0;\n  }\n  if (isArrayLike(collection)) {\n    return isString(collection) ? stringSize(collection) : collection.length;\n  }\n  var tag = getTag(collection);\n  if (tag == mapTag || tag == setTag) {\n    return collection.size;\n  }\n  return baseKeys(collection).length;\n}\n\nmodule.exports = size;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/slice.js",
    "content": "var baseSlice = require('./_baseSlice'),\n    isIterateeCall = require('./_isIterateeCall'),\n    toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction slice(array, start, end) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return [];\n  }\n  if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n    start = 0;\n    end = length;\n  }\n  else {\n    start = start == null ? 0 : toInteger(start);\n    end = end === undefined ? length : toInteger(end);\n  }\n  return baseSlice(array, start, end);\n}\n\nmodule.exports = slice;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/snakeCase.js",
    "content": "var createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\nvar snakeCase = createCompounder(function(result, word, index) {\n  return result + (index ? '_' : '') + word.toLowerCase();\n});\n\nmodule.exports = snakeCase;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/some.js",
    "content": "var arraySome = require('./_arraySome'),\n    baseIteratee = require('./_baseIteratee'),\n    baseSome = require('./_baseSome'),\n    isArray = require('./isArray'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n *   { 'user': 'barney', 'active': true },\n *   { 'user': 'fred',   'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n  var func = isArray(collection) ? arraySome : baseSome;\n  if (guard && isIterateeCall(collection, predicate, guard)) {\n    predicate = undefined;\n  }\n  return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = some;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortBy.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    baseOrderBy = require('./_baseOrderBy'),\n    baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n *  The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n *   { 'user': 'fred',   'age': 48 },\n *   { 'user': 'barney', 'age': 36 },\n *   { 'user': 'fred',   'age': 30 },\n *   { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n  if (collection == null) {\n    return [];\n  }\n  var length = iteratees.length;\n  if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n    iteratees = [];\n  } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n    iteratees = [iteratees[0]];\n  }\n  return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedIndex.js",
    "content": "var baseSortedIndex = require('./_baseSortedIndex');\n\n/**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\nfunction sortedIndex(array, value) {\n  return baseSortedIndex(array, value);\n}\n\nmodule.exports = sortedIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedIndexBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseSortedIndexBy = require('./_baseSortedIndexBy');\n\n/**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\nfunction sortedIndexBy(array, value, iteratee) {\n  return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2));\n}\n\nmodule.exports = sortedIndexBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedIndexOf.js",
    "content": "var baseSortedIndex = require('./_baseSortedIndex'),\n    eq = require('./eq');\n\n/**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\nfunction sortedIndexOf(array, value) {\n  var length = array == null ? 0 : array.length;\n  if (length) {\n    var index = baseSortedIndex(array, value);\n    if (index < length && eq(array[index], value)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = sortedIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedLastIndex.js",
    "content": "var baseSortedIndex = require('./_baseSortedIndex');\n\n/**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\nfunction sortedLastIndex(array, value) {\n  return baseSortedIndex(array, value, true);\n}\n\nmodule.exports = sortedLastIndex;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedLastIndexBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseSortedIndexBy = require('./_baseSortedIndexBy');\n\n/**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\nfunction sortedLastIndexBy(array, value, iteratee) {\n  return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2), true);\n}\n\nmodule.exports = sortedLastIndexBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedLastIndexOf.js",
    "content": "var baseSortedIndex = require('./_baseSortedIndex'),\n    eq = require('./eq');\n\n/**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\nfunction sortedLastIndexOf(array, value) {\n  var length = array == null ? 0 : array.length;\n  if (length) {\n    var index = baseSortedIndex(array, value, true) - 1;\n    if (eq(array[index], value)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = sortedLastIndexOf;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedUniq.js",
    "content": "var baseSortedUniq = require('./_baseSortedUniq');\n\n/**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\nfunction sortedUniq(array) {\n  return (array && array.length)\n    ? baseSortedUniq(array)\n    : [];\n}\n\nmodule.exports = sortedUniq;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sortedUniqBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseSortedUniq = require('./_baseSortedUniq');\n\n/**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\nfunction sortedUniqBy(array, iteratee) {\n  return (array && array.length)\n    ? baseSortedUniq(array, baseIteratee(iteratee, 2))\n    : [];\n}\n\nmodule.exports = sortedUniqBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/split.js",
    "content": "var baseToString = require('./_baseToString'),\n    castSlice = require('./_castSlice'),\n    hasUnicode = require('./_hasUnicode'),\n    isIterateeCall = require('./_isIterateeCall'),\n    isRegExp = require('./isRegExp'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\nfunction split(string, separator, limit) {\n  if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n    separator = limit = undefined;\n  }\n  limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n  if (!limit) {\n    return [];\n  }\n  string = toString(string);\n  if (string && (\n        typeof separator == 'string' ||\n        (separator != null && !isRegExp(separator))\n      )) {\n    separator = baseToString(separator);\n    if (!separator && hasUnicode(string)) {\n      return castSlice(stringToArray(string), 0, limit);\n    }\n  }\n  return string.split(separator, limit);\n}\n\nmodule.exports = split;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/spread.js",
    "content": "var apply = require('./_apply'),\n    arrayPush = require('./_arrayPush'),\n    baseRest = require('./_baseRest'),\n    castSlice = require('./_castSlice'),\n    toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n *   return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n *   Promise.resolve(40),\n *   Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n *   return x + y;\n * }));\n * // => a Promise of 76\n */\nfunction spread(func, start) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  start = start == null ? 0 : nativeMax(toInteger(start), 0);\n  return baseRest(function(args) {\n    var array = args[start],\n        otherArgs = castSlice(args, 0, start);\n\n    if (array) {\n      arrayPush(otherArgs, array);\n    }\n    return apply(func, this, otherArgs);\n  });\n}\n\nmodule.exports = spread;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/startCase.js",
    "content": "var createCompounder = require('./_createCompounder'),\n    upperFirst = require('./upperFirst');\n\n/**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\nvar startCase = createCompounder(function(result, word, index) {\n  return result + (index ? ' ' : '') + upperFirst(word);\n});\n\nmodule.exports = startCase;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/startsWith.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    baseToString = require('./_baseToString'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n *  else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\nfunction startsWith(string, target, position) {\n  string = toString(string);\n  position = position == null\n    ? 0\n    : baseClamp(toInteger(position), 0, string.length);\n\n  target = baseToString(target);\n  return string.slice(position, position + target.length) == target;\n}\n\nmodule.exports = startsWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/string.js",
    "content": "module.exports = {\n  'camelCase': require('./camelCase'),\n  'capitalize': require('./capitalize'),\n  'deburr': require('./deburr'),\n  'endsWith': require('./endsWith'),\n  'escape': require('./escape'),\n  'escapeRegExp': require('./escapeRegExp'),\n  'kebabCase': require('./kebabCase'),\n  'lowerCase': require('./lowerCase'),\n  'lowerFirst': require('./lowerFirst'),\n  'pad': require('./pad'),\n  'padEnd': require('./padEnd'),\n  'padStart': require('./padStart'),\n  'parseInt': require('./parseInt'),\n  'repeat': require('./repeat'),\n  'replace': require('./replace'),\n  'snakeCase': require('./snakeCase'),\n  'split': require('./split'),\n  'startCase': require('./startCase'),\n  'startsWith': require('./startsWith'),\n  'template': require('./template'),\n  'templateSettings': require('./templateSettings'),\n  'toLower': require('./toLower'),\n  'toUpper': require('./toUpper'),\n  'trim': require('./trim'),\n  'trimEnd': require('./trimEnd'),\n  'trimStart': require('./trimStart'),\n  'truncate': require('./truncate'),\n  'unescape': require('./unescape'),\n  'upperCase': require('./upperCase'),\n  'upperFirst': require('./upperFirst'),\n  'words': require('./words')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/stubArray.js",
    "content": "/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/stubFalse.js",
    "content": "/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/stubObject.js",
    "content": "/**\n * This method returns a new empty object.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Object} Returns the new empty object.\n * @example\n *\n * var objects = _.times(2, _.stubObject);\n *\n * console.log(objects);\n * // => [{}, {}]\n *\n * console.log(objects[0] === objects[1]);\n * // => false\n */\nfunction stubObject() {\n  return {};\n}\n\nmodule.exports = stubObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/stubString.js",
    "content": "/**\n * This method returns an empty string.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {string} Returns the empty string.\n * @example\n *\n * _.times(2, _.stubString);\n * // => ['', '']\n */\nfunction stubString() {\n  return '';\n}\n\nmodule.exports = stubString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/stubTrue.js",
    "content": "/**\n * This method returns `true`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `true`.\n * @example\n *\n * _.times(2, _.stubTrue);\n * // => [true, true]\n */\nfunction stubTrue() {\n  return true;\n}\n\nmodule.exports = stubTrue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/subtract.js",
    "content": "var createMathOperation = require('./_createMathOperation');\n\n/**\n * Subtract two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {number} minuend The first number in a subtraction.\n * @param {number} subtrahend The second number in a subtraction.\n * @returns {number} Returns the difference.\n * @example\n *\n * _.subtract(6, 4);\n * // => 2\n */\nvar subtract = createMathOperation(function(minuend, subtrahend) {\n  return minuend - subtrahend;\n}, 0);\n\nmodule.exports = subtract;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sum.js",
    "content": "var baseSum = require('./_baseSum'),\n    identity = require('./identity');\n\n/**\n * Computes the sum of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 2, 8, 6]);\n * // => 20\n */\nfunction sum(array) {\n  return (array && array.length)\n    ? baseSum(array, identity)\n    : 0;\n}\n\nmodule.exports = sum;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/sumBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseSum = require('./_baseSum');\n\n/**\n * This method is like `_.sum` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be summed.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the sum.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.sumBy(objects, function(o) { return o.n; });\n * // => 20\n *\n * // The `_.property` iteratee shorthand.\n * _.sumBy(objects, 'n');\n * // => 20\n */\nfunction sumBy(array, iteratee) {\n  return (array && array.length)\n    ? baseSum(array, baseIteratee(iteratee, 2))\n    : 0;\n}\n\nmodule.exports = sumBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/tail.js",
    "content": "var baseSlice = require('./_baseSlice');\n\n/**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\nfunction tail(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseSlice(array, 1, length) : [];\n}\n\nmodule.exports = tail;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/take.js",
    "content": "var baseSlice = require('./_baseSlice'),\n    toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\nfunction take(array, n, guard) {\n  if (!(array && array.length)) {\n    return [];\n  }\n  n = (guard || n === undefined) ? 1 : toInteger(n);\n  return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nmodule.exports = take;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/takeRight.js",
    "content": "var baseSlice = require('./_baseSlice'),\n    toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\nfunction takeRight(array, n, guard) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return [];\n  }\n  n = (guard || n === undefined) ? 1 : toInteger(n);\n  n = length - n;\n  return baseSlice(array, n < 0 ? 0 : n, length);\n}\n\nmodule.exports = takeRight;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/takeRightWhile.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseWhile = require('./_baseWhile');\n\n/**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': true },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\nfunction takeRightWhile(array, predicate) {\n  return (array && array.length)\n    ? baseWhile(array, baseIteratee(predicate, 3), false, true)\n    : [];\n}\n\nmodule.exports = takeRightWhile;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/takeWhile.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseWhile = require('./_baseWhile');\n\n/**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': false },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\nfunction takeWhile(array, predicate) {\n  return (array && array.length)\n    ? baseWhile(array, baseIteratee(predicate, 3))\n    : [];\n}\n\nmodule.exports = takeWhile;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/tap.js",
    "content": "/**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n *  .tap(function(array) {\n *    // Mutate input array.\n *    array.pop();\n *  })\n *  .reverse()\n *  .value();\n * // => [2, 1]\n */\nfunction tap(value, interceptor) {\n  interceptor(value);\n  return value;\n}\n\nmodule.exports = tap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/template.js",
    "content": "var assignInWith = require('./assignInWith'),\n    attempt = require('./attempt'),\n    baseValues = require('./_baseValues'),\n    customDefaultsAssignIn = require('./_customDefaultsAssignIn'),\n    escapeStringChar = require('./_escapeStringChar'),\n    isError = require('./isError'),\n    isIterateeCall = require('./_isIterateeCall'),\n    keys = require('./keys'),\n    reInterpolate = require('./_reInterpolate'),\n    templateSettings = require('./templateSettings'),\n    toString = require('./toString');\n\n/** Error message constants. */\nvar INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n/** Used to match empty string literals in compiled template source. */\nvar reEmptyStringLeading = /\\b__p \\+= '';/g,\n    reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n    reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n/**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - \"(),\" (modification of function parameters)\n * - \"=\" (default value)\n * - \"[]{}\" (destructuring of function parameters)\n * - \"/\" (beginning of a comment)\n * - whitespace\n */\nvar reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n/**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\nvar reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n/** Used to ensure capturing order of template delimiters. */\nvar reNoMatch = /($^)/;\n\n/** Used to match unescaped characters in compiled string literals. */\nvar reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n *  The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n *  The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n *  An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n *  The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='templateSources[n]']\n *  The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n *  The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b>&lt;script&gt;</b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * //   var __t, __p = '';\n * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * //   return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n *   var JST = {\\\n *     \"main\": ' + _.template(mainText).source + '\\\n *   };\\\n * ');\n */\nfunction template(string, options, guard) {\n  // Based on John Resig's `tmpl` implementation\n  // (http://ejohn.org/blog/javascript-micro-templating/)\n  // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n  var settings = templateSettings.imports._.templateSettings || templateSettings;\n\n  if (guard && isIterateeCall(string, options, guard)) {\n    options = undefined;\n  }\n  string = toString(string);\n  options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n  var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n      importsKeys = keys(imports),\n      importsValues = baseValues(imports, importsKeys);\n\n  var isEscaping,\n      isEvaluating,\n      index = 0,\n      interpolate = options.interpolate || reNoMatch,\n      source = \"__p += '\";\n\n  // Compile the regexp to match each delimiter.\n  var reDelimiters = RegExp(\n    (options.escape || reNoMatch).source + '|' +\n    interpolate.source + '|' +\n    (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n    (options.evaluate || reNoMatch).source + '|$'\n  , 'g');\n\n  // Use a sourceURL for easier debugging.\n  // The sourceURL gets injected into the source that's eval-ed, so be careful\n  // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n  // and escape the comment, thus injecting code that gets evaled.\n  var sourceURL = hasOwnProperty.call(options, 'sourceURL')\n    ? ('//# sourceURL=' +\n       (options.sourceURL + '').replace(/\\s/g, ' ') +\n       '\\n')\n    : '';\n\n  string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n    interpolateValue || (interpolateValue = esTemplateValue);\n\n    // Escape characters that can't be included in string literals.\n    source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n    // Replace delimiters with snippets.\n    if (escapeValue) {\n      isEscaping = true;\n      source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n    }\n    if (evaluateValue) {\n      isEvaluating = true;\n      source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n    }\n    if (interpolateValue) {\n      source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n    }\n    index = offset + match.length;\n\n    // The JS engine embedded in Adobe products needs `match` returned in\n    // order to produce the correct `offset` value.\n    return match;\n  });\n\n  source += \"';\\n\";\n\n  // If `variable` is not specified wrap a with-statement around the generated\n  // code to add the data object to the top of the scope chain.\n  var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n  if (!variable) {\n    source = 'with (obj) {\\n' + source + '\\n}\\n';\n  }\n  // Throw an error if a forbidden character was found in `variable`, to prevent\n  // potential command injection attacks.\n  else if (reForbiddenIdentifierChars.test(variable)) {\n    throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n  }\n\n  // Cleanup code by stripping empty strings.\n  source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n    .replace(reEmptyStringMiddle, '$1')\n    .replace(reEmptyStringTrailing, '$1;');\n\n  // Frame code as the function body.\n  source = 'function(' + (variable || 'obj') + ') {\\n' +\n    (variable\n      ? ''\n      : 'obj || (obj = {});\\n'\n    ) +\n    \"var __t, __p = ''\" +\n    (isEscaping\n       ? ', __e = _.escape'\n       : ''\n    ) +\n    (isEvaluating\n      ? ', __j = Array.prototype.join;\\n' +\n        \"function print() { __p += __j.call(arguments, '') }\\n\"\n      : ';\\n'\n    ) +\n    source +\n    'return __p\\n}';\n\n  var result = attempt(function() {\n    return Function(importsKeys, sourceURL + 'return ' + source)\n      .apply(undefined, importsValues);\n  });\n\n  // Provide the compiled function's source by its `toString` method or\n  // the `source` property as a convenience for inlining compiled templates.\n  result.source = source;\n  if (isError(result)) {\n    throw result;\n  }\n  return result;\n}\n\nmodule.exports = template;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/templateSettings.js",
    "content": "var escape = require('./escape'),\n    reEscape = require('./_reEscape'),\n    reEvaluate = require('./_reEvaluate'),\n    reInterpolate = require('./_reInterpolate');\n\n/**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\nvar templateSettings = {\n\n  /**\n   * Used to detect `data` property values to be HTML-escaped.\n   *\n   * @memberOf _.templateSettings\n   * @type {RegExp}\n   */\n  'escape': reEscape,\n\n  /**\n   * Used to detect code to be evaluated.\n   *\n   * @memberOf _.templateSettings\n   * @type {RegExp}\n   */\n  'evaluate': reEvaluate,\n\n  /**\n   * Used to detect `data` property values to inject.\n   *\n   * @memberOf _.templateSettings\n   * @type {RegExp}\n   */\n  'interpolate': reInterpolate,\n\n  /**\n   * Used to reference the data object in the template text.\n   *\n   * @memberOf _.templateSettings\n   * @type {string}\n   */\n  'variable': '',\n\n  /**\n   * Used to import variables into the compiled template.\n   *\n   * @memberOf _.templateSettings\n   * @type {Object}\n   */\n  'imports': {\n\n    /**\n     * A reference to the `lodash` function.\n     *\n     * @memberOf _.templateSettings.imports\n     * @type {Function}\n     */\n    '_': { 'escape': escape }\n  }\n};\n\nmodule.exports = templateSettings;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/throttle.js",
    "content": "var debounce = require('./debounce'),\n    isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\nmodule.exports = throttle;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/thru.js",
    "content": "/**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _('  abc  ')\n *  .chain()\n *  .trim()\n *  .thru(function(value) {\n *    return [value];\n *  })\n *  .value();\n * // => ['abc']\n */\nfunction thru(value, interceptor) {\n  return interceptor(value);\n}\n\nmodule.exports = thru;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/times.js",
    "content": "var baseTimes = require('./_baseTimes'),\n    castFunction = require('./_castFunction'),\n    toInteger = require('./toInteger');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Invokes the iteratee `n` times, returning an array of the results of\n * each invocation. The iteratee is invoked with one argument; (index).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.times(3, String);\n * // => ['0', '1', '2']\n *\n *  _.times(4, _.constant(0));\n * // => [0, 0, 0, 0]\n */\nfunction times(n, iteratee) {\n  n = toInteger(n);\n  if (n < 1 || n > MAX_SAFE_INTEGER) {\n    return [];\n  }\n  var index = MAX_ARRAY_LENGTH,\n      length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n  iteratee = castFunction(iteratee);\n  n -= MAX_ARRAY_LENGTH;\n\n  var result = baseTimes(length, iteratee);\n  while (++index < n) {\n    iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = times;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toArray.js",
    "content": "var Symbol = require('./_Symbol'),\n    copyArray = require('./_copyArray'),\n    getTag = require('./_getTag'),\n    isArrayLike = require('./isArrayLike'),\n    isString = require('./isString'),\n    iteratorToArray = require('./_iteratorToArray'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray'),\n    stringToArray = require('./_stringToArray'),\n    values = require('./values');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/** Built-in value references. */\nvar symIterator = Symbol ? Symbol.iterator : undefined;\n\n/**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\nfunction toArray(value) {\n  if (!value) {\n    return [];\n  }\n  if (isArrayLike(value)) {\n    return isString(value) ? stringToArray(value) : copyArray(value);\n  }\n  if (symIterator && value[symIterator]) {\n    return iteratorToArray(value[symIterator]());\n  }\n  var tag = getTag(value),\n      func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n  return func(value);\n}\n\nmodule.exports = toArray;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toFinite.js",
    "content": "var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n    MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n  if (!value) {\n    return value === 0 ? value : 0;\n  }\n  value = toNumber(value);\n  if (value === INFINITY || value === -INFINITY) {\n    var sign = (value < 0 ? -1 : 1);\n    return sign * MAX_INTEGER;\n  }\n  return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toInteger.js",
    "content": "var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n  var result = toFinite(value),\n      remainder = result % 1;\n\n  return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toIterator.js",
    "content": "/**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\nfunction wrapperToIterator() {\n  return this;\n}\n\nmodule.exports = wrapperToIterator;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toJSON.js",
    "content": "module.exports = require('./wrapperValue');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toLength.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    toInteger = require('./toInteger');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\nfunction toLength(value) {\n  return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n}\n\nmodule.exports = toLength;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toLower.js",
    "content": "var toString = require('./toString');\n\n/**\n * Converts `string`, as a whole, to lower case just like\n * [String#toLowerCase](https://mdn.io/toLowerCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.toLower('--Foo-Bar--');\n * // => '--foo-bar--'\n *\n * _.toLower('fooBar');\n * // => 'foobar'\n *\n * _.toLower('__FOO_BAR__');\n * // => '__foo_bar__'\n */\nfunction toLower(value) {\n  return toString(value).toLowerCase();\n}\n\nmodule.exports = toLower;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toNumber.js",
    "content": "var baseTrim = require('./_baseTrim'),\n    isObject = require('./isObject'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = baseTrim(value);\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toPairs.js",
    "content": "var createToPairs = require('./_createToPairs'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\nvar toPairs = createToPairs(keys);\n\nmodule.exports = toPairs;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toPairsIn.js",
    "content": "var createToPairs = require('./_createToPairs'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\nvar toPairsIn = createToPairs(keysIn);\n\nmodule.exports = toPairsIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toPath.js",
    "content": "var arrayMap = require('./_arrayMap'),\n    copyArray = require('./_copyArray'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol'),\n    stringToPath = require('./_stringToPath'),\n    toKey = require('./_toKey'),\n    toString = require('./toString');\n\n/**\n * Converts `value` to a property path array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {*} value The value to convert.\n * @returns {Array} Returns the new property path array.\n * @example\n *\n * _.toPath('a.b.c');\n * // => ['a', 'b', 'c']\n *\n * _.toPath('a[0].b.c');\n * // => ['a', '0', 'b', 'c']\n */\nfunction toPath(value) {\n  if (isArray(value)) {\n    return arrayMap(value, toKey);\n  }\n  return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n}\n\nmodule.exports = toPath;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toPlainObject.js",
    "content": "var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toSafeInteger.js",
    "content": "var baseClamp = require('./_baseClamp'),\n    toInteger = require('./toInteger');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\nfunction toSafeInteger(value) {\n  return value\n    ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n    : (value === 0 ? value : 0);\n}\n\nmodule.exports = toSafeInteger;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toString.js",
    "content": "var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/toUpper.js",
    "content": "var toString = require('./toString');\n\n/**\n * Converts `string`, as a whole, to upper case just like\n * [String#toUpperCase](https://mdn.io/toUpperCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.toUpper('--foo-bar--');\n * // => '--FOO-BAR--'\n *\n * _.toUpper('fooBar');\n * // => 'FOOBAR'\n *\n * _.toUpper('__foo_bar__');\n * // => '__FOO_BAR__'\n */\nfunction toUpper(value) {\n  return toString(value).toUpperCase();\n}\n\nmodule.exports = toUpper;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/transform.js",
    "content": "var arrayEach = require('./_arrayEach'),\n    baseCreate = require('./_baseCreate'),\n    baseForOwn = require('./_baseForOwn'),\n    baseIteratee = require('./_baseIteratee'),\n    getPrototype = require('./_getPrototype'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isFunction = require('./isFunction'),\n    isObject = require('./isObject'),\n    isTypedArray = require('./isTypedArray');\n\n/**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n *   result.push(n *= n);\n *   return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n *   (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\nfunction transform(object, iteratee, accumulator) {\n  var isArr = isArray(object),\n      isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n  iteratee = baseIteratee(iteratee, 4);\n  if (accumulator == null) {\n    var Ctor = object && object.constructor;\n    if (isArrLike) {\n      accumulator = isArr ? new Ctor : [];\n    }\n    else if (isObject(object)) {\n      accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n    }\n    else {\n      accumulator = {};\n    }\n  }\n  (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n    return iteratee(accumulator, value, index, object);\n  });\n  return accumulator;\n}\n\nmodule.exports = transform;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/trim.js",
    "content": "var baseToString = require('./_baseToString'),\n    baseTrim = require('./_baseTrim'),\n    castSlice = require('./_castSlice'),\n    charsEndIndex = require('./_charsEndIndex'),\n    charsStartIndex = require('./_charsStartIndex'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString');\n\n/**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim('  abc  ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map(['  foo  ', '  bar  '], _.trim);\n * // => ['foo', 'bar']\n */\nfunction trim(string, chars, guard) {\n  string = toString(string);\n  if (string && (guard || chars === undefined)) {\n    return baseTrim(string);\n  }\n  if (!string || !(chars = baseToString(chars))) {\n    return string;\n  }\n  var strSymbols = stringToArray(string),\n      chrSymbols = stringToArray(chars),\n      start = charsStartIndex(strSymbols, chrSymbols),\n      end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n  return castSlice(strSymbols, start, end).join('');\n}\n\nmodule.exports = trim;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/trimEnd.js",
    "content": "var baseToString = require('./_baseToString'),\n    castSlice = require('./_castSlice'),\n    charsEndIndex = require('./_charsEndIndex'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString'),\n    trimmedEndIndex = require('./_trimmedEndIndex');\n\n/**\n * Removes trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimEnd('  abc  ');\n * // => '  abc'\n *\n * _.trimEnd('-_-abc-_-', '_-');\n * // => '-_-abc'\n */\nfunction trimEnd(string, chars, guard) {\n  string = toString(string);\n  if (string && (guard || chars === undefined)) {\n    return string.slice(0, trimmedEndIndex(string) + 1);\n  }\n  if (!string || !(chars = baseToString(chars))) {\n    return string;\n  }\n  var strSymbols = stringToArray(string),\n      end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n  return castSlice(strSymbols, 0, end).join('');\n}\n\nmodule.exports = trimEnd;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/trimStart.js",
    "content": "var baseToString = require('./_baseToString'),\n    castSlice = require('./_castSlice'),\n    charsStartIndex = require('./_charsStartIndex'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart('  abc  ');\n * // => 'abc  '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\nfunction trimStart(string, chars, guard) {\n  string = toString(string);\n  if (string && (guard || chars === undefined)) {\n    return string.replace(reTrimStart, '');\n  }\n  if (!string || !(chars = baseToString(chars))) {\n    return string;\n  }\n  var strSymbols = stringToArray(string),\n      start = charsStartIndex(strSymbols, stringToArray(chars));\n\n  return castSlice(strSymbols, start).join('');\n}\n\nmodule.exports = trimStart;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/truncate.js",
    "content": "var baseToString = require('./_baseToString'),\n    castSlice = require('./_castSlice'),\n    hasUnicode = require('./_hasUnicode'),\n    isObject = require('./isObject'),\n    isRegExp = require('./isRegExp'),\n    stringSize = require('./_stringSize'),\n    stringToArray = require('./_stringToArray'),\n    toInteger = require('./toInteger'),\n    toString = require('./toString');\n\n/** Used as default options for `_.truncate`. */\nvar DEFAULT_TRUNC_LENGTH = 30,\n    DEFAULT_TRUNC_OMISSION = '...';\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n *   'length': 24,\n *   'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n *   'length': 24,\n *   'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n *   'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\nfunction truncate(string, options) {\n  var length = DEFAULT_TRUNC_LENGTH,\n      omission = DEFAULT_TRUNC_OMISSION;\n\n  if (isObject(options)) {\n    var separator = 'separator' in options ? options.separator : separator;\n    length = 'length' in options ? toInteger(options.length) : length;\n    omission = 'omission' in options ? baseToString(options.omission) : omission;\n  }\n  string = toString(string);\n\n  var strLength = string.length;\n  if (hasUnicode(string)) {\n    var strSymbols = stringToArray(string);\n    strLength = strSymbols.length;\n  }\n  if (length >= strLength) {\n    return string;\n  }\n  var end = length - stringSize(omission);\n  if (end < 1) {\n    return omission;\n  }\n  var result = strSymbols\n    ? castSlice(strSymbols, 0, end).join('')\n    : string.slice(0, end);\n\n  if (separator === undefined) {\n    return result + omission;\n  }\n  if (strSymbols) {\n    end += (result.length - end);\n  }\n  if (isRegExp(separator)) {\n    if (string.slice(end).search(separator)) {\n      var match,\n          substring = result;\n\n      if (!separator.global) {\n        separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n      }\n      separator.lastIndex = 0;\n      while ((match = separator.exec(substring))) {\n        var newEnd = match.index;\n      }\n      result = result.slice(0, newEnd === undefined ? end : newEnd);\n    }\n  } else if (string.indexOf(baseToString(separator), end) != end) {\n    var index = result.lastIndexOf(separator);\n    if (index > -1) {\n      result = result.slice(0, index);\n    }\n  }\n  return result + omission;\n}\n\nmodule.exports = truncate;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unary.js",
    "content": "var ary = require('./ary');\n\n/**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\nfunction unary(func) {\n  return ary(func, 1);\n}\n\nmodule.exports = unary;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unescape.js",
    "content": "var toString = require('./toString'),\n    unescapeHtmlChar = require('./_unescapeHtmlChar');\n\n/** Used to match HTML entities and HTML characters. */\nvar reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n    reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\nfunction unescape(string) {\n  string = toString(string);\n  return (string && reHasEscapedHtml.test(string))\n    ? string.replace(reEscapedHtml, unescapeHtmlChar)\n    : string;\n}\n\nmodule.exports = unescape;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/union.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    baseRest = require('./_baseRest'),\n    baseUniq = require('./_baseUniq'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unionBy.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    baseUniq = require('./_baseUniq'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nvar unionBy = baseRest(function(arrays) {\n  var iteratee = last(arrays);\n  if (isArrayLikeObject(iteratee)) {\n    iteratee = undefined;\n  }\n  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));\n});\n\nmodule.exports = unionBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unionWith.js",
    "content": "var baseFlatten = require('./_baseFlatten'),\n    baseRest = require('./_baseRest'),\n    baseUniq = require('./_baseUniq'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\nvar unionWith = baseRest(function(arrays) {\n  var comparator = last(arrays);\n  comparator = typeof comparator == 'function' ? comparator : undefined;\n  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n});\n\nmodule.exports = unionWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/uniq.js",
    "content": "var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n  return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/uniqBy.js",
    "content": "var baseIteratee = require('./_baseIteratee'),\n    baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/uniqWith.js",
    "content": "var baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\nfunction uniqWith(array, comparator) {\n  comparator = typeof comparator == 'function' ? comparator : undefined;\n  return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n}\n\nmodule.exports = uniqWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/uniqueId.js",
    "content": "var toString = require('./toString');\n\n/** Used to generate unique IDs. */\nvar idCounter = 0;\n\n/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\nfunction uniqueId(prefix) {\n  var id = ++idCounter;\n  return toString(prefix) + id;\n}\n\nmodule.exports = uniqueId;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unset.js",
    "content": "var baseUnset = require('./_baseUnset');\n\n/**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\nfunction unset(object, path) {\n  return object == null ? true : baseUnset(object, path);\n}\n\nmodule.exports = unset;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unzip.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    arrayMap = require('./_arrayMap'),\n    baseProperty = require('./_baseProperty'),\n    baseTimes = require('./_baseTimes'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\nfunction unzip(array) {\n  if (!(array && array.length)) {\n    return [];\n  }\n  var length = 0;\n  array = arrayFilter(array, function(group) {\n    if (isArrayLikeObject(group)) {\n      length = nativeMax(group.length, length);\n      return true;\n    }\n  });\n  return baseTimes(length, function(index) {\n    return arrayMap(array, baseProperty(index));\n  });\n}\n\nmodule.exports = unzip;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/unzipWith.js",
    "content": "var apply = require('./_apply'),\n    arrayMap = require('./_arrayMap'),\n    unzip = require('./unzip');\n\n/**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n *  regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\nfunction unzipWith(array, iteratee) {\n  if (!(array && array.length)) {\n    return [];\n  }\n  var result = unzip(array);\n  if (iteratee == null) {\n    return result;\n  }\n  return arrayMap(result, function(group) {\n    return apply(iteratee, undefined, group);\n  });\n}\n\nmodule.exports = unzipWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/update.js",
    "content": "var baseUpdate = require('./_baseUpdate'),\n    castFunction = require('./_castFunction');\n\n/**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\nfunction update(object, path, updater) {\n  return object == null ? object : baseUpdate(object, path, castFunction(updater));\n}\n\nmodule.exports = update;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/updateWith.js",
    "content": "var baseUpdate = require('./_baseUpdate'),\n    castFunction = require('./_castFunction');\n\n/**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\nfunction updateWith(object, path, updater, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n}\n\nmodule.exports = updateWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/upperCase.js",
    "content": "var createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string`, as space separated words, to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.upperCase('--foo-bar');\n * // => 'FOO BAR'\n *\n * _.upperCase('fooBar');\n * // => 'FOO BAR'\n *\n * _.upperCase('__foo_bar__');\n * // => 'FOO BAR'\n */\nvar upperCase = createCompounder(function(result, word, index) {\n  return result + (index ? ' ' : '') + word.toUpperCase();\n});\n\nmodule.exports = upperCase;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/upperFirst.js",
    "content": "var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/util.js",
    "content": "module.exports = {\n  'attempt': require('./attempt'),\n  'bindAll': require('./bindAll'),\n  'cond': require('./cond'),\n  'conforms': require('./conforms'),\n  'constant': require('./constant'),\n  'defaultTo': require('./defaultTo'),\n  'flow': require('./flow'),\n  'flowRight': require('./flowRight'),\n  'identity': require('./identity'),\n  'iteratee': require('./iteratee'),\n  'matches': require('./matches'),\n  'matchesProperty': require('./matchesProperty'),\n  'method': require('./method'),\n  'methodOf': require('./methodOf'),\n  'mixin': require('./mixin'),\n  'noop': require('./noop'),\n  'nthArg': require('./nthArg'),\n  'over': require('./over'),\n  'overEvery': require('./overEvery'),\n  'overSome': require('./overSome'),\n  'property': require('./property'),\n  'propertyOf': require('./propertyOf'),\n  'range': require('./range'),\n  'rangeRight': require('./rangeRight'),\n  'stubArray': require('./stubArray'),\n  'stubFalse': require('./stubFalse'),\n  'stubObject': require('./stubObject'),\n  'stubString': require('./stubString'),\n  'stubTrue': require('./stubTrue'),\n  'times': require('./times'),\n  'toPath': require('./toPath'),\n  'uniqueId': require('./uniqueId')\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/value.js",
    "content": "module.exports = require('./wrapperValue');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/valueOf.js",
    "content": "module.exports = require('./wrapperValue');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/values.js",
    "content": "var baseValues = require('./_baseValues'),\n    keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n  return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/valuesIn.js",
    "content": "var baseValues = require('./_baseValues'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\nfunction valuesIn(object) {\n  return object == null ? [] : baseValues(object, keysIn(object));\n}\n\nmodule.exports = valuesIn;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/without.js",
    "content": "var baseDifference = require('./_baseDifference'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, values)\n    : [];\n});\n\nmodule.exports = without;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/words.js",
    "content": "var asciiWords = require('./_asciiWords'),\n    hasUnicodeWord = require('./_hasUnicodeWord'),\n    toString = require('./toString'),\n    unicodeWords = require('./_unicodeWords');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n  string = toString(string);\n  pattern = guard ? undefined : pattern;\n\n  if (pattern === undefined) {\n    return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n  }\n  return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/wrap.js",
    "content": "var castFunction = require('./_castFunction'),\n    partial = require('./partial');\n\n/**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n *   return '<p>' + func(text) + '</p>';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '<p>fred, barney, &amp; pebbles</p>'\n */\nfunction wrap(value, wrapper) {\n  return partial(castFunction(wrapper), value);\n}\n\nmodule.exports = wrap;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/wrapperAt.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    baseAt = require('./_baseAt'),\n    flatRest = require('./_flatRest'),\n    isIndex = require('./_isIndex'),\n    thru = require('./thru');\n\n/**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\nvar wrapperAt = flatRest(function(paths) {\n  var length = paths.length,\n      start = length ? paths[0] : 0,\n      value = this.__wrapped__,\n      interceptor = function(object) { return baseAt(object, paths); };\n\n  if (length > 1 || this.__actions__.length ||\n      !(value instanceof LazyWrapper) || !isIndex(start)) {\n    return this.thru(interceptor);\n  }\n  value = value.slice(start, +start + (length ? 1 : 0));\n  value.__actions__.push({\n    'func': thru,\n    'args': [interceptor],\n    'thisArg': undefined\n  });\n  return new LodashWrapper(value, this.__chain__).thru(function(array) {\n    if (length && !array.length) {\n      array.push(undefined);\n    }\n    return array;\n  });\n});\n\nmodule.exports = wrapperAt;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/wrapperChain.js",
    "content": "var chain = require('./chain');\n\n/**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n *   { 'user': 'barney', 'age': 36 },\n *   { 'user': 'fred',   'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n *   .chain()\n *   .head()\n *   .pick('user')\n *   .value();\n * // => { 'user': 'barney' }\n */\nfunction wrapperChain() {\n  return chain(this);\n}\n\nmodule.exports = wrapperChain;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/wrapperLodash.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    baseLodash = require('./_baseLodash'),\n    isArray = require('./isArray'),\n    isObjectLike = require('./isObjectLike'),\n    wrapperClone = require('./_wrapperClone');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n    if (value instanceof LodashWrapper) {\n      return value;\n    }\n    if (hasOwnProperty.call(value, '__wrapped__')) {\n      return wrapperClone(value);\n    }\n  }\n  return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/wrapperReverse.js",
    "content": "var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    reverse = require('./reverse'),\n    thru = require('./thru');\n\n/**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\nfunction wrapperReverse() {\n  var value = this.__wrapped__;\n  if (value instanceof LazyWrapper) {\n    var wrapped = value;\n    if (this.__actions__.length) {\n      wrapped = new LazyWrapper(this);\n    }\n    wrapped = wrapped.reverse();\n    wrapped.__actions__.push({\n      'func': thru,\n      'args': [reverse],\n      'thisArg': undefined\n    });\n    return new LodashWrapper(wrapped, this.__chain__);\n  }\n  return this.thru(reverse);\n}\n\nmodule.exports = wrapperReverse;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/wrapperValue.js",
    "content": "var baseWrapperValue = require('./_baseWrapperValue');\n\n/**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\nfunction wrapperValue() {\n  return baseWrapperValue(this.__wrapped__, this.__actions__);\n}\n\nmodule.exports = wrapperValue;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/xor.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    baseRest = require('./_baseRest'),\n    baseXor = require('./_baseXor'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\nvar xor = baseRest(function(arrays) {\n  return baseXor(arrayFilter(arrays, isArrayLikeObject));\n});\n\nmodule.exports = xor;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/xorBy.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    baseXor = require('./_baseXor'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\nvar xorBy = baseRest(function(arrays) {\n  var iteratee = last(arrays);\n  if (isArrayLikeObject(iteratee)) {\n    iteratee = undefined;\n  }\n  return baseXor(arrayFilter(arrays, isArrayLikeObject), baseIteratee(iteratee, 2));\n});\n\nmodule.exports = xorBy;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/xorWith.js",
    "content": "var arrayFilter = require('./_arrayFilter'),\n    baseRest = require('./_baseRest'),\n    baseXor = require('./_baseXor'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\nvar xorWith = baseRest(function(arrays) {\n  var comparator = last(arrays);\n  comparator = typeof comparator == 'function' ? comparator : undefined;\n  return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n});\n\nmodule.exports = xorWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/zip.js",
    "content": "var baseRest = require('./_baseRest'),\n    unzip = require('./unzip');\n\n/**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\nvar zip = baseRest(unzip);\n\nmodule.exports = zip;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/zipObject.js",
    "content": "var assignValue = require('./_assignValue'),\n    baseZipObject = require('./_baseZipObject');\n\n/**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\nfunction zipObject(props, values) {\n  return baseZipObject(props || [], values || [], assignValue);\n}\n\nmodule.exports = zipObject;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/zipObjectDeep.js",
    "content": "var baseSet = require('./_baseSet'),\n    baseZipObject = require('./_baseZipObject');\n\n/**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\nfunction zipObjectDeep(props, values) {\n  return baseZipObject(props || [], values || [], baseSet);\n}\n\nmodule.exports = zipObjectDeep;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/lodash/zipWith.js",
    "content": "var baseRest = require('./_baseRest'),\n    unzipWith = require('./unzipWith');\n\n/**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n *  grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n *   return a + b + c;\n * });\n * // => [111, 222]\n */\nvar zipWith = baseRest(function(arrays) {\n  var length = arrays.length,\n      iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n  iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n  return unzipWith(arrays, iteratee);\n});\n\nmodule.exports = zipWith;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/.npmignore",
    "content": ""
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/CHANGELOG.md",
    "content": "# Changelog\n\n## v1.6.0 (24/11/2017)\n*No changelog for this release.*\n\n---\n\n## v2.0.4 (24/11/2017)\n- [**closed**] Switch to mime-score module for resolving extension contention issues. [#182](https://github.com/broofa/node-mime/issues/182)\n- [**closed**] Update mime-db to 1.31.0 in v1.x branch [#181](https://github.com/broofa/node-mime/issues/181)\n\n---\n\n## v1.5.0 (22/11/2017)\n- [**closed**] need ES5 version ready in npm package [#179](https://github.com/broofa/node-mime/issues/179)\n- [**closed**] mime-db no trace of iWork - pages / numbers / etc. [#178](https://github.com/broofa/node-mime/issues/178)\n- [**closed**] How it works in brownser ? [#176](https://github.com/broofa/node-mime/issues/176)\n- [**closed**] Missing `./Mime` [#175](https://github.com/broofa/node-mime/issues/175)\n- [**closed**] Vulnerable Regular Expression [#167](https://github.com/broofa/node-mime/issues/167)\n\n---\n\n## v2.0.3 (25/09/2017)\n*No changelog for this release.*\n\n---\n\n## v1.4.1 (25/09/2017)\n- [**closed**] Issue when bundling with webpack [#172](https://github.com/broofa/node-mime/issues/172)\n\n---\n\n## v2.0.2 (15/09/2017)\n- [**V2**] fs.readFileSync is not a function [#165](https://github.com/broofa/node-mime/issues/165)\n- [**closed**] The extension for video/quicktime should map to .mov, not .qt [#164](https://github.com/broofa/node-mime/issues/164)\n- [**V2**] [v2 Feedback request] Mime class API [#163](https://github.com/broofa/node-mime/issues/163)\n- [**V2**] [v2 Feedback request] Resolving conflicts over extensions [#162](https://github.com/broofa/node-mime/issues/162)\n- [**V2**] Allow callers to load module with official, full, or no defined types.  [#161](https://github.com/broofa/node-mime/issues/161)\n- [**V2**] Use \"facets\" to resolve extension conflicts [#160](https://github.com/broofa/node-mime/issues/160)\n- [**V2**] Remove fs and path dependencies [#152](https://github.com/broofa/node-mime/issues/152)\n- [**V2**] Default content-type should not be application/octet-stream [#139](https://github.com/broofa/node-mime/issues/139)\n- [**V2**] reset mime-types [#124](https://github.com/broofa/node-mime/issues/124)\n- [**V2**] Extensionless paths should return null or false [#113](https://github.com/broofa/node-mime/issues/113)\n\n---\n\n## v2.0.1 (14/09/2017)\n- [**closed**] Changelog for v2.0 does not mention breaking changes [#171](https://github.com/broofa/node-mime/issues/171)\n- [**closed**] MIME breaking with 'class' declaration as it is without 'use strict mode' [#170](https://github.com/broofa/node-mime/issues/170)\n\n---\n\n## v2.0.0 (12/09/2017)\n- [**closed**] woff and woff2 [#168](https://github.com/broofa/node-mime/issues/168)\n\n---\n\n## v1.4.0 (28/08/2017)\n- [**closed**] support for ac3 voc files [#159](https://github.com/broofa/node-mime/issues/159)\n- [**closed**] Help understanding change from application/xml to text/xml [#158](https://github.com/broofa/node-mime/issues/158)\n- [**closed**] no longer able to override mimetype [#157](https://github.com/broofa/node-mime/issues/157)\n- [**closed**] application/vnd.adobe.photoshop [#147](https://github.com/broofa/node-mime/issues/147)\n- [**closed**] Directories should appear as something other than application/octet-stream [#135](https://github.com/broofa/node-mime/issues/135)\n- [**closed**] requested features [#131](https://github.com/broofa/node-mime/issues/131)\n- [**closed**] Make types.json loading optional? [#129](https://github.com/broofa/node-mime/issues/129)\n- [**closed**] Cannot find module './types.json' [#120](https://github.com/broofa/node-mime/issues/120)\n- [**V2**] .wav files show up as \"audio/x-wav\" instead of \"audio/x-wave\" [#118](https://github.com/broofa/node-mime/issues/118)\n- [**closed**] Don't be a pain in the ass for node community [#108](https://github.com/broofa/node-mime/issues/108)\n- [**closed**] don't make default_type global [#78](https://github.com/broofa/node-mime/issues/78)\n- [**closed**] mime.extension() fails if the content-type is parameterized [#74](https://github.com/broofa/node-mime/issues/74)\n\n---\n\n## v1.3.6 (11/05/2017)\n- [**closed**] .md should be text/markdown as of March 2016 [#154](https://github.com/broofa/node-mime/issues/154)\n- [**closed**] Error while installing mime [#153](https://github.com/broofa/node-mime/issues/153)\n- [**closed**] application/manifest+json [#149](https://github.com/broofa/node-mime/issues/149)\n- [**closed**] Dynamic adaptive streaming over HTTP (DASH) file extension typo [#141](https://github.com/broofa/node-mime/issues/141)\n- [**closed**] charsets image/png undefined [#140](https://github.com/broofa/node-mime/issues/140)\n- [**closed**] Mime-db dependency out of date [#130](https://github.com/broofa/node-mime/issues/130)\n- [**closed**] how to support plist？ [#126](https://github.com/broofa/node-mime/issues/126)\n- [**closed**] how does .types file format look like? [#123](https://github.com/broofa/node-mime/issues/123)\n- [**closed**] Feature: support for expanding MIME patterns [#121](https://github.com/broofa/node-mime/issues/121)\n- [**closed**] DEBUG_MIME doesn't work [#117](https://github.com/broofa/node-mime/issues/117)\n\n---\n\n## v1.3.4 (06/02/2015)\n*No changelog for this release.*\n\n---\n\n## v1.3.3 (06/02/2015)\n*No changelog for this release.*\n\n---\n\n## v1.3.1 (05/02/2015)\n- [**closed**] Consider adding support for Handlebars .hbs file ending [#111](https://github.com/broofa/node-mime/issues/111)\n- [**closed**] Consider adding support for hjson. [#110](https://github.com/broofa/node-mime/issues/110)\n- [**closed**] Add mime type for Opus audio files [#94](https://github.com/broofa/node-mime/issues/94)\n- [**closed**] Consider making the `Requesting New Types` information more visible [#77](https://github.com/broofa/node-mime/issues/77)\n\n---\n\n## v1.3.0 (05/02/2015)\n- [**closed**] Add common name? [#114](https://github.com/broofa/node-mime/issues/114)\n- [**closed**] application/x-yaml [#104](https://github.com/broofa/node-mime/issues/104)\n- [**closed**] Add mime type for WOFF file format 2.0 [#102](https://github.com/broofa/node-mime/issues/102)\n- [**closed**] application/x-msi for .msi [#99](https://github.com/broofa/node-mime/issues/99)\n- [**closed**] Add mimetype for gettext translation files [#98](https://github.com/broofa/node-mime/issues/98)\n- [**closed**] collaborators [#88](https://github.com/broofa/node-mime/issues/88)\n- [**closed**] getting errot in installation of mime module...any1 can help? [#87](https://github.com/broofa/node-mime/issues/87)\n- [**closed**] should application/json's charset be utf8? [#86](https://github.com/broofa/node-mime/issues/86)\n- [**closed**] Add \"license\" and \"licenses\" to package.json [#81](https://github.com/broofa/node-mime/issues/81)\n- [**closed**] lookup with extension-less file on Windows returns wrong type [#68](https://github.com/broofa/node-mime/issues/68)\n\n---\n\n## v1.2.11 (15/08/2013)\n- [**closed**] Update mime.types [#65](https://github.com/broofa/node-mime/issues/65)\n- [**closed**] Publish a new version [#63](https://github.com/broofa/node-mime/issues/63)\n- [**closed**] README should state upfront that \"application/octet-stream\" is default for unknown extension [#55](https://github.com/broofa/node-mime/issues/55)\n- [**closed**] Suggested improvement to the charset API [#52](https://github.com/broofa/node-mime/issues/52)\n\n---\n\n## v1.2.10 (25/07/2013)\n- [**closed**] Mime type for woff files should be application/font-woff and not application/x-font-woff [#62](https://github.com/broofa/node-mime/issues/62)\n- [**closed**] node.types in conflict with mime.types [#51](https://github.com/broofa/node-mime/issues/51)\n\n---\n\n## v1.2.9 (17/01/2013)\n- [**closed**] Please update \"mime\" NPM [#49](https://github.com/broofa/node-mime/issues/49)\n- [**closed**] Please add semicolon [#46](https://github.com/broofa/node-mime/issues/46)\n- [**closed**] parse full mime types [#43](https://github.com/broofa/node-mime/issues/43)\n\n---\n\n## v1.2.8 (10/01/2013)\n- [**closed**] /js directory mime is application/javascript. Is it correct? [#47](https://github.com/broofa/node-mime/issues/47)\n- [**closed**] Add mime types for lua code. [#45](https://github.com/broofa/node-mime/issues/45)\n\n---\n\n## v1.2.7 (19/10/2012)\n- [**closed**] cannot install 1.2.7 via npm [#41](https://github.com/broofa/node-mime/issues/41)\n- [**closed**] Transfer ownership to @broofa [#36](https://github.com/broofa/node-mime/issues/36)\n- [**closed**] it's wrong to set charset to UTF-8 for text [#30](https://github.com/broofa/node-mime/issues/30)\n- [**closed**] Allow multiple instances of MIME types container [#27](https://github.com/broofa/node-mime/issues/27)\n\n---\n\n## v1.2.5 (16/02/2012)\n- [**closed**] When looking up a types, check hasOwnProperty [#23](https://github.com/broofa/node-mime/issues/23)\n- [**closed**] Bump version to 1.2.2 [#18](https://github.com/broofa/node-mime/issues/18)\n- [**closed**] No license [#16](https://github.com/broofa/node-mime/issues/16)\n- [**closed**] Some types missing that are used by html5/css3 [#13](https://github.com/broofa/node-mime/issues/13)\n- [**closed**] npm install fails for 1.2.1 [#12](https://github.com/broofa/node-mime/issues/12)\n- [**closed**] image/pjpeg + image/x-png [#10](https://github.com/broofa/node-mime/issues/10)\n- [**closed**] symlink [#8](https://github.com/broofa/node-mime/issues/8)\n- [**closed**] gzip [#2](https://github.com/broofa/node-mime/issues/2)\n- [**closed**] ALL CAPS filenames return incorrect mime type [#1](https://github.com/broofa/node-mime/issues/1)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2010 Benjamin Thomas, Robert Kieffer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/README.md",
    "content": "# mime\n\nComprehensive MIME type mapping API based on mime-db module.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n    npm install mime\n\n## Contributing / Testing\n\n    npm run test\n\n## Command Line\n\n    mime [path_string]\n\nE.g.\n\n    > mime scripts/jquery.js\n    application/javascript\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.\n\n```js\nvar mime = require('mime');\n\nmime.lookup('/path/to/file.txt');         // => 'text/plain'\nmime.lookup('file.txt');                  // => 'text/plain'\nmime.lookup('.TXT');                      // => 'text/plain'\nmime.lookup('htm');                       // => 'text/html'\n```\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n```js\nmime.extension('text/html');                 // => 'html'\nmime.extension('application/octet-stream');  // => 'bin'\n```\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n```js\nmime.charsets.lookup('text/plain');        // => 'UTF-8'\n```\n\n(The logic for charset lookups is pretty rudimentary.  Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nCustom type mappings can be added on a per-project basis via the following APIs.\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n```js\nmime.define({\n    'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n    'application/x-my-type': ['x-mt', 'x-mtt'],\n    // etc ...\n});\n\nmime.lookup('x-sft');                 // => 'text/x-some-format'\n```\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n```js\nmime.extension('text/x-some-format'); // => 'x-sf'\n```\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n```js\nmime.load('./my_project.types');\n```\nThe .types file format is simple -  See the `types` dir for examples.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/cli.js",
    "content": "#!/usr/bin/env node\n\nvar mime = require('./mime.js');\nvar file = process.argv[2];\nvar type = mime.lookup(file);\n\nprocess.stdout.write(type + '\\n');\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/mime.js",
    "content": "var path = require('path');\nvar fs = require('fs');\n\nfunction Mime() {\n  // Map of extension -> mime type\n  this.types = Object.create(null);\n\n  // Map of mime type -> extension\n  this.extensions = Object.create(null);\n}\n\n/**\n * Define mimetype -> extension mappings.  Each key is a mime-type that maps\n * to an array of extensions associated with the type.  The first extension is\n * used as the default extension for the type.\n *\n * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});\n *\n * @param map (Object) type definitions\n */\nMime.prototype.define = function (map) {\n  for (var type in map) {\n    var exts = map[type];\n    for (var i = 0; i < exts.length; i++) {\n      if (process.env.DEBUG_MIME && this.types[exts[i]]) {\n        console.warn((this._loading || \"define()\").replace(/.*\\//, ''), 'changes \"' + exts[i] + '\" extension type from ' +\n          this.types[exts[i]] + ' to ' + type);\n      }\n\n      this.types[exts[i]] = type;\n    }\n\n    // Default extension is the first one we encounter\n    if (!this.extensions[type]) {\n      this.extensions[type] = exts[0];\n    }\n  }\n};\n\n/**\n * Load an Apache2-style \".types\" file\n *\n * This may be called multiple times (it's expected).  Where files declare\n * overlapping types/extensions, the last file wins.\n *\n * @param file (String) path of file to load.\n */\nMime.prototype.load = function(file) {\n  this._loading = file;\n  // Read file and split into lines\n  var map = {},\n      content = fs.readFileSync(file, 'ascii'),\n      lines = content.split(/[\\r\\n]+/);\n\n  lines.forEach(function(line) {\n    // Clean up whitespace/comments, and split into fields\n    var fields = line.replace(/\\s*#.*|^\\s*|\\s*$/g, '').split(/\\s+/);\n    map[fields.shift()] = fields;\n  });\n\n  this.define(map);\n\n  this._loading = null;\n};\n\n/**\n * Lookup a mime type based on extension\n */\nMime.prototype.lookup = function(path, fallback) {\n  var ext = path.replace(/^.*[\\.\\/\\\\]/, '').toLowerCase();\n\n  return this.types[ext] || fallback || this.default_type;\n};\n\n/**\n * Return file extension associated with a mime type\n */\nMime.prototype.extension = function(mimeType) {\n  var type = mimeType.match(/^\\s*([^;\\s]*)(?:;|\\s|$)/)[1].toLowerCase();\n  return this.extensions[type];\n};\n\n// Default instance\nvar mime = new Mime();\n\n// Define built-in types\nmime.define(require('./types.json'));\n\n// Default type\nmime.default_type = mime.lookup('bin');\n\n//\n// Additional API specific to the default instance\n//\n\nmime.Mime = Mime;\n\n/**\n * Lookup a charset based on mime type.\n */\nmime.charsets = {\n  lookup: function(mimeType, fallback) {\n    // Assume text types are utf8\n    return (/^text\\/|^application\\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback;\n  }\n};\n\nmodule.exports = mime;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/package.json",
    "content": "{\n  \"author\": {\n    \"name\": \"Robert Kieffer\",\n    \"url\": \"http://github.com/broofa\",\n    \"email\": \"robert@broofa.com\"\n  },\n  \"bin\": {\n    \"mime\": \"cli.js\"\n  },\n  \"engines\": {\n    \"node\": \">=4\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Benjamin Thomas\",\n      \"url\": \"http://github.com/bentomas\",\n      \"email\": \"benjamin@benjaminthomas.org\"\n    }\n  ],\n  \"description\": \"A comprehensive library for mime-type mapping\",\n  \"license\": \"MIT\",\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"github-release-notes\": \"0.13.1\",\n    \"mime-db\": \"1.31.0\",\n    \"mime-score\": \"1.1.0\"\n  },\n  \"scripts\": {\n    \"prepare\": \"node src/build.js\",\n    \"changelog\": \"gren changelog --tags=all --generate --override\",\n    \"test\": \"node src/test.js\"\n  },\n  \"keywords\": [\n    \"util\",\n    \"mime\"\n  ],\n  \"main\": \"mime.js\",\n  \"name\": \"mime\",\n  \"repository\": {\n    \"url\": \"https://github.com/broofa/node-mime\",\n    \"type\": \"git\"\n  },\n  \"version\": \"1.6.0\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/src/build.js",
    "content": "#!/usr/bin/env node\n\n'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\nconst mimeScore = require('mime-score');\n\nlet db = require('mime-db');\nlet chalk = require('chalk');\n\nconst STANDARD_FACET_SCORE = 900;\n\nconst byExtension = {};\n\n// Clear out any conflict extensions in mime-db\nfor (let type in db) {\n  let entry = db[type];\n  entry.type = type;\n\n  if (!entry.extensions) continue;\n\n  entry.extensions.forEach(ext => {\n    if (ext in byExtension) {\n      const e0 = entry;\n      const e1 = byExtension[ext];\n      e0.pri = mimeScore(e0.type, e0.source);\n      e1.pri = mimeScore(e1.type, e1.source);\n\n      let drop = e0.pri < e1.pri ? e0 : e1;\n      let keep = e0.pri >= e1.pri ? e0 : e1;\n      drop.extensions = drop.extensions.filter(e => e !== ext);\n\n      console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`);\n    }\n    byExtension[ext] = entry;\n  });\n}\n\nfunction writeTypesFile(types, path) {\n  fs.writeFileSync(path, JSON.stringify(types));\n}\n\n// Segregate into standard and non-standard types based on facet per\n// https://tools.ietf.org/html/rfc6838#section-3.1\nconst types = {};\n\nObject.keys(db).sort().forEach(k => {\n  const entry = db[k];\n  types[entry.type] = entry.extensions;\n});\n\nwriteTypesFile(types, path.join(__dirname, '..', 'types.json'));\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/src/test.js",
    "content": "/**\n * Usage: node test.js\n */\n\nvar mime = require('../mime');\nvar assert = require('assert');\nvar path = require('path');\n\n//\n// Test mime lookups\n//\n\nassert.equal('text/plain', mime.lookup('text.txt'));     // normal file\nassert.equal('text/plain', mime.lookup('TEXT.TXT'));     // uppercase\nassert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file\nassert.equal('text/plain', mime.lookup('.text.txt'));    // hidden file\nassert.equal('text/plain', mime.lookup('.txt'));         // nameless\nassert.equal('text/plain', mime.lookup('txt'));          // extension-only\nassert.equal('text/plain', mime.lookup('/txt'));         // extension-less ()\nassert.equal('text/plain', mime.lookup('\\\\txt'));        // Windows, extension-less\nassert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized\nassert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default\n\n//\n// Test extensions\n//\n\nassert.equal('txt', mime.extension(mime.types.text));\nassert.equal('html', mime.extension(mime.types.htm));\nassert.equal('bin', mime.extension('application/octet-stream'));\nassert.equal('bin', mime.extension('application/octet-stream '));\nassert.equal('html', mime.extension(' text/html; charset=UTF-8'));\nassert.equal('html', mime.extension('text/html; charset=UTF-8 '));\nassert.equal('html', mime.extension('text/html; charset=UTF-8'));\nassert.equal('html', mime.extension('text/html ; charset=UTF-8'));\nassert.equal('html', mime.extension('text/html;charset=UTF-8'));\nassert.equal('html', mime.extension('text/Html;charset=UTF-8'));\nassert.equal(undefined, mime.extension('unrecognized'));\n\n//\n// Test node.types lookups\n//\n\nassert.equal('font/woff', mime.lookup('file.woff'));\nassert.equal('application/octet-stream', mime.lookup('file.buffer'));\n// TODO: Uncomment once #157 is resolved\n// assert.equal('audio/mp4', mime.lookup('file.m4a'));\nassert.equal('font/otf', mime.lookup('file.otf'));\n\n//\n// Test charsets\n//\n\nassert.equal('UTF-8', mime.charsets.lookup('text/plain'));\nassert.equal('UTF-8', mime.charsets.lookup(mime.types.js));\nassert.equal('UTF-8', mime.charsets.lookup(mime.types.json));\nassert.equal(undefined, mime.charsets.lookup(mime.types.bin));\nassert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));\n\nconsole.log('\\nAll tests passed');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mime/types.json",
    "content": "{\"application/andrew-inset\":[\"ez\"],\"application/applixware\":[\"aw\"],\"application/atom+xml\":[\"atom\"],\"application/atomcat+xml\":[\"atomcat\"],\"application/atomsvc+xml\":[\"atomsvc\"],\"application/bdoc\":[\"bdoc\"],\"application/ccxml+xml\":[\"ccxml\"],\"application/cdmi-capability\":[\"cdmia\"],\"application/cdmi-container\":[\"cdmic\"],\"application/cdmi-domain\":[\"cdmid\"],\"application/cdmi-object\":[\"cdmio\"],\"application/cdmi-queue\":[\"cdmiq\"],\"application/cu-seeme\":[\"cu\"],\"application/dash+xml\":[\"mpd\"],\"application/davmount+xml\":[\"davmount\"],\"application/docbook+xml\":[\"dbk\"],\"application/dssc+der\":[\"dssc\"],\"application/dssc+xml\":[\"xdssc\"],\"application/ecmascript\":[\"ecma\"],\"application/emma+xml\":[\"emma\"],\"application/epub+zip\":[\"epub\"],\"application/exi\":[\"exi\"],\"application/font-tdpfr\":[\"pfr\"],\"application/font-woff\":[],\"application/font-woff2\":[],\"application/geo+json\":[\"geojson\"],\"application/gml+xml\":[\"gml\"],\"application/gpx+xml\":[\"gpx\"],\"application/gxf\":[\"gxf\"],\"application/gzip\":[\"gz\"],\"application/hyperstudio\":[\"stk\"],\"application/inkml+xml\":[\"ink\",\"inkml\"],\"application/ipfix\":[\"ipfix\"],\"application/java-archive\":[\"jar\",\"war\",\"ear\"],\"application/java-serialized-object\":[\"ser\"],\"application/java-vm\":[\"class\"],\"application/javascript\":[\"js\",\"mjs\"],\"application/json\":[\"json\",\"map\"],\"application/json5\":[\"json5\"],\"application/jsonml+json\":[\"jsonml\"],\"application/ld+json\":[\"jsonld\"],\"application/lost+xml\":[\"lostxml\"],\"application/mac-binhex40\":[\"hqx\"],\"application/mac-compactpro\":[\"cpt\"],\"application/mads+xml\":[\"mads\"],\"application/manifest+json\":[\"webmanifest\"],\"application/marc\":[\"mrc\"],\"application/marcxml+xml\":[\"mrcx\"],\"application/mathematica\":[\"ma\",\"nb\",\"mb\"],\"application/mathml+xml\":[\"mathml\"],\"application/mbox\":[\"mbox\"],\"application/mediaservercontrol+xml\":[\"mscml\"],\"application/metalink+xml\":[\"metalink\"],\"application/metalink4+xml\":[\"meta4\"],\"application/mets+xml\":[\"mets\"],\"application/mods+xml\":[\"mods\"],\"application/mp21\":[\"m21\",\"mp21\"],\"application/mp4\":[\"mp4s\",\"m4p\"],\"application/msword\":[\"doc\",\"dot\"],\"application/mxf\":[\"mxf\"],\"application/octet-stream\":[\"bin\",\"dms\",\"lrf\",\"mar\",\"so\",\"dist\",\"distz\",\"pkg\",\"bpk\",\"dump\",\"elc\",\"deploy\",\"exe\",\"dll\",\"deb\",\"dmg\",\"iso\",\"img\",\"msi\",\"msp\",\"msm\",\"buffer\"],\"application/oda\":[\"oda\"],\"application/oebps-package+xml\":[\"opf\"],\"application/ogg\":[\"ogx\"],\"application/omdoc+xml\":[\"omdoc\"],\"application/onenote\":[\"onetoc\",\"onetoc2\",\"onetmp\",\"onepkg\"],\"application/oxps\":[\"oxps\"],\"application/patch-ops-error+xml\":[\"xer\"],\"application/pdf\":[\"pdf\"],\"application/pgp-encrypted\":[\"pgp\"],\"application/pgp-signature\":[\"asc\",\"sig\"],\"application/pics-rules\":[\"prf\"],\"application/pkcs10\":[\"p10\"],\"application/pkcs7-mime\":[\"p7m\",\"p7c\"],\"application/pkcs7-signature\":[\"p7s\"],\"application/pkcs8\":[\"p8\"],\"application/pkix-attr-cert\":[\"ac\"],\"application/pkix-cert\":[\"cer\"],\"application/pkix-crl\":[\"crl\"],\"application/pkix-pkipath\":[\"pkipath\"],\"application/pkixcmp\":[\"pki\"],\"application/pls+xml\":[\"pls\"],\"application/postscript\":[\"ai\",\"eps\",\"ps\"],\"application/prs.cww\":[\"cww\"],\"application/pskc+xml\":[\"pskcxml\"],\"application/raml+yaml\":[\"raml\"],\"application/rdf+xml\":[\"rdf\"],\"application/reginfo+xml\":[\"rif\"],\"application/relax-ng-compact-syntax\":[\"rnc\"],\"application/resource-lists+xml\":[\"rl\"],\"application/resource-lists-diff+xml\":[\"rld\"],\"application/rls-services+xml\":[\"rs\"],\"application/rpki-ghostbusters\":[\"gbr\"],\"application/rpki-manifest\":[\"mft\"],\"application/rpki-roa\":[\"roa\"],\"application/rsd+xml\":[\"rsd\"],\"application/rss+xml\":[\"rss\"],\"application/rtf\":[\"rtf\"],\"application/sbml+xml\":[\"sbml\"],\"application/scvp-cv-request\":[\"scq\"],\"application/scvp-cv-response\":[\"scs\"],\"application/scvp-vp-request\":[\"spq\"],\"application/scvp-vp-response\":[\"spp\"],\"application/sdp\":[\"sdp\"],\"application/set-payment-initiation\":[\"setpay\"],\"application/set-registration-initiation\":[\"setreg\"],\"application/shf+xml\":[\"shf\"],\"application/smil+xml\":[\"smi\",\"smil\"],\"application/sparql-query\":[\"rq\"],\"application/sparql-results+xml\":[\"srx\"],\"application/srgs\":[\"gram\"],\"application/srgs+xml\":[\"grxml\"],\"application/sru+xml\":[\"sru\"],\"application/ssdl+xml\":[\"ssdl\"],\"application/ssml+xml\":[\"ssml\"],\"application/tei+xml\":[\"tei\",\"teicorpus\"],\"application/thraud+xml\":[\"tfi\"],\"application/timestamped-data\":[\"tsd\"],\"application/vnd.3gpp.pic-bw-large\":[\"plb\"],\"application/vnd.3gpp.pic-bw-small\":[\"psb\"],\"application/vnd.3gpp.pic-bw-var\":[\"pvb\"],\"application/vnd.3gpp2.tcap\":[\"tcap\"],\"application/vnd.3m.post-it-notes\":[\"pwn\"],\"application/vnd.accpac.simply.aso\":[\"aso\"],\"application/vnd.accpac.simply.imp\":[\"imp\"],\"application/vnd.acucobol\":[\"acu\"],\"application/vnd.acucorp\":[\"atc\",\"acutc\"],\"application/vnd.adobe.air-application-installer-package+zip\":[\"air\"],\"application/vnd.adobe.formscentral.fcdt\":[\"fcdt\"],\"application/vnd.adobe.fxp\":[\"fxp\",\"fxpl\"],\"application/vnd.adobe.xdp+xml\":[\"xdp\"],\"application/vnd.adobe.xfdf\":[\"xfdf\"],\"application/vnd.ahead.space\":[\"ahead\"],\"application/vnd.airzip.filesecure.azf\":[\"azf\"],\"application/vnd.airzip.filesecure.azs\":[\"azs\"],\"application/vnd.amazon.ebook\":[\"azw\"],\"application/vnd.americandynamics.acc\":[\"acc\"],\"application/vnd.amiga.ami\":[\"ami\"],\"application/vnd.android.package-archive\":[\"apk\"],\"application/vnd.anser-web-certificate-issue-initiation\":[\"cii\"],\"application/vnd.anser-web-funds-transfer-initiation\":[\"fti\"],\"application/vnd.antix.game-component\":[\"atx\"],\"application/vnd.apple.installer+xml\":[\"mpkg\"],\"application/vnd.apple.mpegurl\":[\"m3u8\"],\"application/vnd.apple.pkpass\":[\"pkpass\"],\"application/vnd.aristanetworks.swi\":[\"swi\"],\"application/vnd.astraea-software.iota\":[\"iota\"],\"application/vnd.audiograph\":[\"aep\"],\"application/vnd.blueice.multipass\":[\"mpm\"],\"application/vnd.bmi\":[\"bmi\"],\"application/vnd.businessobjects\":[\"rep\"],\"application/vnd.chemdraw+xml\":[\"cdxml\"],\"application/vnd.chipnuts.karaoke-mmd\":[\"mmd\"],\"application/vnd.cinderella\":[\"cdy\"],\"application/vnd.claymore\":[\"cla\"],\"application/vnd.cloanto.rp9\":[\"rp9\"],\"application/vnd.clonk.c4group\":[\"c4g\",\"c4d\",\"c4f\",\"c4p\",\"c4u\"],\"application/vnd.cluetrust.cartomobile-config\":[\"c11amc\"],\"application/vnd.cluetrust.cartomobile-config-pkg\":[\"c11amz\"],\"application/vnd.commonspace\":[\"csp\"],\"application/vnd.contact.cmsg\":[\"cdbcmsg\"],\"application/vnd.cosmocaller\":[\"cmc\"],\"application/vnd.crick.clicker\":[\"clkx\"],\"application/vnd.crick.clicker.keyboard\":[\"clkk\"],\"application/vnd.crick.clicker.palette\":[\"clkp\"],\"application/vnd.crick.clicker.template\":[\"clkt\"],\"application/vnd.crick.clicker.wordbank\":[\"clkw\"],\"application/vnd.criticaltools.wbs+xml\":[\"wbs\"],\"application/vnd.ctc-posml\":[\"pml\"],\"application/vnd.cups-ppd\":[\"ppd\"],\"application/vnd.curl.car\":[\"car\"],\"application/vnd.curl.pcurl\":[\"pcurl\"],\"application/vnd.dart\":[\"dart\"],\"application/vnd.data-vision.rdz\":[\"rdz\"],\"application/vnd.dece.data\":[\"uvf\",\"uvvf\",\"uvd\",\"uvvd\"],\"application/vnd.dece.ttml+xml\":[\"uvt\",\"uvvt\"],\"application/vnd.dece.unspecified\":[\"uvx\",\"uvvx\"],\"application/vnd.dece.zip\":[\"uvz\",\"uvvz\"],\"application/vnd.denovo.fcselayout-link\":[\"fe_launch\"],\"application/vnd.dna\":[\"dna\"],\"application/vnd.dolby.mlp\":[\"mlp\"],\"application/vnd.dpgraph\":[\"dpg\"],\"application/vnd.dreamfactory\":[\"dfac\"],\"application/vnd.ds-keypoint\":[\"kpxx\"],\"application/vnd.dvb.ait\":[\"ait\"],\"application/vnd.dvb.service\":[\"svc\"],\"application/vnd.dynageo\":[\"geo\"],\"application/vnd.ecowin.chart\":[\"mag\"],\"application/vnd.enliven\":[\"nml\"],\"application/vnd.epson.esf\":[\"esf\"],\"application/vnd.epson.msf\":[\"msf\"],\"application/vnd.epson.quickanime\":[\"qam\"],\"application/vnd.epson.salt\":[\"slt\"],\"application/vnd.epson.ssf\":[\"ssf\"],\"application/vnd.eszigno3+xml\":[\"es3\",\"et3\"],\"application/vnd.ezpix-album\":[\"ez2\"],\"application/vnd.ezpix-package\":[\"ez3\"],\"application/vnd.fdf\":[\"fdf\"],\"application/vnd.fdsn.mseed\":[\"mseed\"],\"application/vnd.fdsn.seed\":[\"seed\",\"dataless\"],\"application/vnd.flographit\":[\"gph\"],\"application/vnd.fluxtime.clip\":[\"ftc\"],\"application/vnd.framemaker\":[\"fm\",\"frame\",\"maker\",\"book\"],\"application/vnd.frogans.fnc\":[\"fnc\"],\"application/vnd.frogans.ltf\":[\"ltf\"],\"application/vnd.fsc.weblaunch\":[\"fsc\"],\"application/vnd.fujitsu.oasys\":[\"oas\"],\"application/vnd.fujitsu.oasys2\":[\"oa2\"],\"application/vnd.fujitsu.oasys3\":[\"oa3\"],\"application/vnd.fujitsu.oasysgp\":[\"fg5\"],\"application/vnd.fujitsu.oasysprs\":[\"bh2\"],\"application/vnd.fujixerox.ddd\":[\"ddd\"],\"application/vnd.fujixerox.docuworks\":[\"xdw\"],\"application/vnd.fujixerox.docuworks.binder\":[\"xbd\"],\"application/vnd.fuzzysheet\":[\"fzs\"],\"application/vnd.genomatix.tuxedo\":[\"txd\"],\"application/vnd.geogebra.file\":[\"ggb\"],\"application/vnd.geogebra.tool\":[\"ggt\"],\"application/vnd.geometry-explorer\":[\"gex\",\"gre\"],\"application/vnd.geonext\":[\"gxt\"],\"application/vnd.geoplan\":[\"g2w\"],\"application/vnd.geospace\":[\"g3w\"],\"application/vnd.gmx\":[\"gmx\"],\"application/vnd.google-apps.document\":[\"gdoc\"],\"application/vnd.google-apps.presentation\":[\"gslides\"],\"application/vnd.google-apps.spreadsheet\":[\"gsheet\"],\"application/vnd.google-earth.kml+xml\":[\"kml\"],\"application/vnd.google-earth.kmz\":[\"kmz\"],\"application/vnd.grafeq\":[\"gqf\",\"gqs\"],\"application/vnd.groove-account\":[\"gac\"],\"application/vnd.groove-help\":[\"ghf\"],\"application/vnd.groove-identity-message\":[\"gim\"],\"application/vnd.groove-injector\":[\"grv\"],\"application/vnd.groove-tool-message\":[\"gtm\"],\"application/vnd.groove-tool-template\":[\"tpl\"],\"application/vnd.groove-vcard\":[\"vcg\"],\"application/vnd.hal+xml\":[\"hal\"],\"application/vnd.handheld-entertainment+xml\":[\"zmm\"],\"application/vnd.hbci\":[\"hbci\"],\"application/vnd.hhe.lesson-player\":[\"les\"],\"application/vnd.hp-hpgl\":[\"hpgl\"],\"application/vnd.hp-hpid\":[\"hpid\"],\"application/vnd.hp-hps\":[\"hps\"],\"application/vnd.hp-jlyt\":[\"jlt\"],\"application/vnd.hp-pcl\":[\"pcl\"],\"application/vnd.hp-pclxl\":[\"pclxl\"],\"application/vnd.hydrostatix.sof-data\":[\"sfd-hdstx\"],\"application/vnd.ibm.minipay\":[\"mpy\"],\"application/vnd.ibm.modcap\":[\"afp\",\"listafp\",\"list3820\"],\"application/vnd.ibm.rights-management\":[\"irm\"],\"application/vnd.ibm.secure-container\":[\"sc\"],\"application/vnd.iccprofile\":[\"icc\",\"icm\"],\"application/vnd.igloader\":[\"igl\"],\"application/vnd.immervision-ivp\":[\"ivp\"],\"application/vnd.immervision-ivu\":[\"ivu\"],\"application/vnd.insors.igm\":[\"igm\"],\"application/vnd.intercon.formnet\":[\"xpw\",\"xpx\"],\"application/vnd.intergeo\":[\"i2g\"],\"application/vnd.intu.qbo\":[\"qbo\"],\"application/vnd.intu.qfx\":[\"qfx\"],\"application/vnd.ipunplugged.rcprofile\":[\"rcprofile\"],\"application/vnd.irepository.package+xml\":[\"irp\"],\"application/vnd.is-xpr\":[\"xpr\"],\"application/vnd.isac.fcs\":[\"fcs\"],\"application/vnd.jam\":[\"jam\"],\"application/vnd.jcp.javame.midlet-rms\":[\"rms\"],\"application/vnd.jisp\":[\"jisp\"],\"application/vnd.joost.joda-archive\":[\"joda\"],\"application/vnd.kahootz\":[\"ktz\",\"ktr\"],\"application/vnd.kde.karbon\":[\"karbon\"],\"application/vnd.kde.kchart\":[\"chrt\"],\"application/vnd.kde.kformula\":[\"kfo\"],\"application/vnd.kde.kivio\":[\"flw\"],\"application/vnd.kde.kontour\":[\"kon\"],\"application/vnd.kde.kpresenter\":[\"kpr\",\"kpt\"],\"application/vnd.kde.kspread\":[\"ksp\"],\"application/vnd.kde.kword\":[\"kwd\",\"kwt\"],\"application/vnd.kenameaapp\":[\"htke\"],\"application/vnd.kidspiration\":[\"kia\"],\"application/vnd.kinar\":[\"kne\",\"knp\"],\"application/vnd.koan\":[\"skp\",\"skd\",\"skt\",\"skm\"],\"application/vnd.kodak-descriptor\":[\"sse\"],\"application/vnd.las.las+xml\":[\"lasxml\"],\"application/vnd.llamagraphics.life-balance.desktop\":[\"lbd\"],\"application/vnd.llamagraphics.life-balance.exchange+xml\":[\"lbe\"],\"application/vnd.lotus-1-2-3\":[\"123\"],\"application/vnd.lotus-approach\":[\"apr\"],\"application/vnd.lotus-freelance\":[\"pre\"],\"application/vnd.lotus-notes\":[\"nsf\"],\"application/vnd.lotus-organizer\":[\"org\"],\"application/vnd.lotus-screencam\":[\"scm\"],\"application/vnd.lotus-wordpro\":[\"lwp\"],\"application/vnd.macports.portpkg\":[\"portpkg\"],\"application/vnd.mcd\":[\"mcd\"],\"application/vnd.medcalcdata\":[\"mc1\"],\"application/vnd.mediastation.cdkey\":[\"cdkey\"],\"application/vnd.mfer\":[\"mwf\"],\"application/vnd.mfmp\":[\"mfm\"],\"application/vnd.micrografx.flo\":[\"flo\"],\"application/vnd.micrografx.igx\":[\"igx\"],\"application/vnd.mif\":[\"mif\"],\"application/vnd.mobius.daf\":[\"daf\"],\"application/vnd.mobius.dis\":[\"dis\"],\"application/vnd.mobius.mbk\":[\"mbk\"],\"application/vnd.mobius.mqy\":[\"mqy\"],\"application/vnd.mobius.msl\":[\"msl\"],\"application/vnd.mobius.plc\":[\"plc\"],\"application/vnd.mobius.txf\":[\"txf\"],\"application/vnd.mophun.application\":[\"mpn\"],\"application/vnd.mophun.certificate\":[\"mpc\"],\"application/vnd.mozilla.xul+xml\":[\"xul\"],\"application/vnd.ms-artgalry\":[\"cil\"],\"application/vnd.ms-cab-compressed\":[\"cab\"],\"application/vnd.ms-excel\":[\"xls\",\"xlm\",\"xla\",\"xlc\",\"xlt\",\"xlw\"],\"application/vnd.ms-excel.addin.macroenabled.12\":[\"xlam\"],\"application/vnd.ms-excel.sheet.binary.macroenabled.12\":[\"xlsb\"],\"application/vnd.ms-excel.sheet.macroenabled.12\":[\"xlsm\"],\"application/vnd.ms-excel.template.macroenabled.12\":[\"xltm\"],\"application/vnd.ms-fontobject\":[\"eot\"],\"application/vnd.ms-htmlhelp\":[\"chm\"],\"application/vnd.ms-ims\":[\"ims\"],\"application/vnd.ms-lrm\":[\"lrm\"],\"application/vnd.ms-officetheme\":[\"thmx\"],\"application/vnd.ms-outlook\":[\"msg\"],\"application/vnd.ms-pki.seccat\":[\"cat\"],\"application/vnd.ms-pki.stl\":[\"stl\"],\"application/vnd.ms-powerpoint\":[\"ppt\",\"pps\",\"pot\"],\"application/vnd.ms-powerpoint.addin.macroenabled.12\":[\"ppam\"],\"application/vnd.ms-powerpoint.presentation.macroenabled.12\":[\"pptm\"],\"application/vnd.ms-powerpoint.slide.macroenabled.12\":[\"sldm\"],\"application/vnd.ms-powerpoint.slideshow.macroenabled.12\":[\"ppsm\"],\"application/vnd.ms-powerpoint.template.macroenabled.12\":[\"potm\"],\"application/vnd.ms-project\":[\"mpp\",\"mpt\"],\"application/vnd.ms-word.document.macroenabled.12\":[\"docm\"],\"application/vnd.ms-word.template.macroenabled.12\":[\"dotm\"],\"application/vnd.ms-works\":[\"wps\",\"wks\",\"wcm\",\"wdb\"],\"application/vnd.ms-wpl\":[\"wpl\"],\"application/vnd.ms-xpsdocument\":[\"xps\"],\"application/vnd.mseq\":[\"mseq\"],\"application/vnd.musician\":[\"mus\"],\"application/vnd.muvee.style\":[\"msty\"],\"application/vnd.mynfc\":[\"taglet\"],\"application/vnd.neurolanguage.nlu\":[\"nlu\"],\"application/vnd.nitf\":[\"ntf\",\"nitf\"],\"application/vnd.noblenet-directory\":[\"nnd\"],\"application/vnd.noblenet-sealer\":[\"nns\"],\"application/vnd.noblenet-web\":[\"nnw\"],\"application/vnd.nokia.n-gage.data\":[\"ngdat\"],\"application/vnd.nokia.n-gage.symbian.install\":[\"n-gage\"],\"application/vnd.nokia.radio-preset\":[\"rpst\"],\"application/vnd.nokia.radio-presets\":[\"rpss\"],\"application/vnd.novadigm.edm\":[\"edm\"],\"application/vnd.novadigm.edx\":[\"edx\"],\"application/vnd.novadigm.ext\":[\"ext\"],\"application/vnd.oasis.opendocument.chart\":[\"odc\"],\"application/vnd.oasis.opendocument.chart-template\":[\"otc\"],\"application/vnd.oasis.opendocument.database\":[\"odb\"],\"application/vnd.oasis.opendocument.formula\":[\"odf\"],\"application/vnd.oasis.opendocument.formula-template\":[\"odft\"],\"application/vnd.oasis.opendocument.graphics\":[\"odg\"],\"application/vnd.oasis.opendocument.graphics-template\":[\"otg\"],\"application/vnd.oasis.opendocument.image\":[\"odi\"],\"application/vnd.oasis.opendocument.image-template\":[\"oti\"],\"application/vnd.oasis.opendocument.presentation\":[\"odp\"],\"application/vnd.oasis.opendocument.presentation-template\":[\"otp\"],\"application/vnd.oasis.opendocument.spreadsheet\":[\"ods\"],\"application/vnd.oasis.opendocument.spreadsheet-template\":[\"ots\"],\"application/vnd.oasis.opendocument.text\":[\"odt\"],\"application/vnd.oasis.opendocument.text-master\":[\"odm\"],\"application/vnd.oasis.opendocument.text-template\":[\"ott\"],\"application/vnd.oasis.opendocument.text-web\":[\"oth\"],\"application/vnd.olpc-sugar\":[\"xo\"],\"application/vnd.oma.dd2+xml\":[\"dd2\"],\"application/vnd.openofficeorg.extension\":[\"oxt\"],\"application/vnd.openxmlformats-officedocument.presentationml.presentation\":[\"pptx\"],\"application/vnd.openxmlformats-officedocument.presentationml.slide\":[\"sldx\"],\"application/vnd.openxmlformats-officedocument.presentationml.slideshow\":[\"ppsx\"],\"application/vnd.openxmlformats-officedocument.presentationml.template\":[\"potx\"],\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":[\"xlsx\"],\"application/vnd.openxmlformats-officedocument.spreadsheetml.template\":[\"xltx\"],\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":[\"docx\"],\"application/vnd.openxmlformats-officedocument.wordprocessingml.template\":[\"dotx\"],\"application/vnd.osgeo.mapguide.package\":[\"mgp\"],\"application/vnd.osgi.dp\":[\"dp\"],\"application/vnd.osgi.subsystem\":[\"esa\"],\"application/vnd.palm\":[\"pdb\",\"pqa\",\"oprc\"],\"application/vnd.pawaafile\":[\"paw\"],\"application/vnd.pg.format\":[\"str\"],\"application/vnd.pg.osasli\":[\"ei6\"],\"application/vnd.picsel\":[\"efif\"],\"application/vnd.pmi.widget\":[\"wg\"],\"application/vnd.pocketlearn\":[\"plf\"],\"application/vnd.powerbuilder6\":[\"pbd\"],\"application/vnd.previewsystems.box\":[\"box\"],\"application/vnd.proteus.magazine\":[\"mgz\"],\"application/vnd.publishare-delta-tree\":[\"qps\"],\"application/vnd.pvi.ptid1\":[\"ptid\"],\"application/vnd.quark.quarkxpress\":[\"qxd\",\"qxt\",\"qwd\",\"qwt\",\"qxl\",\"qxb\"],\"application/vnd.realvnc.bed\":[\"bed\"],\"application/vnd.recordare.musicxml\":[\"mxl\"],\"application/vnd.recordare.musicxml+xml\":[\"musicxml\"],\"application/vnd.rig.cryptonote\":[\"cryptonote\"],\"application/vnd.rim.cod\":[\"cod\"],\"application/vnd.rn-realmedia\":[\"rm\"],\"application/vnd.rn-realmedia-vbr\":[\"rmvb\"],\"application/vnd.route66.link66+xml\":[\"link66\"],\"application/vnd.sailingtracker.track\":[\"st\"],\"application/vnd.seemail\":[\"see\"],\"application/vnd.sema\":[\"sema\"],\"application/vnd.semd\":[\"semd\"],\"application/vnd.semf\":[\"semf\"],\"application/vnd.shana.informed.formdata\":[\"ifm\"],\"application/vnd.shana.informed.formtemplate\":[\"itp\"],\"application/vnd.shana.informed.interchange\":[\"iif\"],\"application/vnd.shana.informed.package\":[\"ipk\"],\"application/vnd.simtech-mindmapper\":[\"twd\",\"twds\"],\"application/vnd.smaf\":[\"mmf\"],\"application/vnd.smart.teacher\":[\"teacher\"],\"application/vnd.solent.sdkm+xml\":[\"sdkm\",\"sdkd\"],\"application/vnd.spotfire.dxp\":[\"dxp\"],\"application/vnd.spotfire.sfs\":[\"sfs\"],\"application/vnd.stardivision.calc\":[\"sdc\"],\"application/vnd.stardivision.draw\":[\"sda\"],\"application/vnd.stardivision.impress\":[\"sdd\"],\"application/vnd.stardivision.math\":[\"smf\"],\"application/vnd.stardivision.writer\":[\"sdw\",\"vor\"],\"application/vnd.stardivision.writer-global\":[\"sgl\"],\"application/vnd.stepmania.package\":[\"smzip\"],\"application/vnd.stepmania.stepchart\":[\"sm\"],\"application/vnd.sun.wadl+xml\":[\"wadl\"],\"application/vnd.sun.xml.calc\":[\"sxc\"],\"application/vnd.sun.xml.calc.template\":[\"stc\"],\"application/vnd.sun.xml.draw\":[\"sxd\"],\"application/vnd.sun.xml.draw.template\":[\"std\"],\"application/vnd.sun.xml.impress\":[\"sxi\"],\"application/vnd.sun.xml.impress.template\":[\"sti\"],\"application/vnd.sun.xml.math\":[\"sxm\"],\"application/vnd.sun.xml.writer\":[\"sxw\"],\"application/vnd.sun.xml.writer.global\":[\"sxg\"],\"application/vnd.sun.xml.writer.template\":[\"stw\"],\"application/vnd.sus-calendar\":[\"sus\",\"susp\"],\"application/vnd.svd\":[\"svd\"],\"application/vnd.symbian.install\":[\"sis\",\"sisx\"],\"application/vnd.syncml+xml\":[\"xsm\"],\"application/vnd.syncml.dm+wbxml\":[\"bdm\"],\"application/vnd.syncml.dm+xml\":[\"xdm\"],\"application/vnd.tao.intent-module-archive\":[\"tao\"],\"application/vnd.tcpdump.pcap\":[\"pcap\",\"cap\",\"dmp\"],\"application/vnd.tmobile-livetv\":[\"tmo\"],\"application/vnd.trid.tpt\":[\"tpt\"],\"application/vnd.triscape.mxs\":[\"mxs\"],\"application/vnd.trueapp\":[\"tra\"],\"application/vnd.ufdl\":[\"ufd\",\"ufdl\"],\"application/vnd.uiq.theme\":[\"utz\"],\"application/vnd.umajin\":[\"umj\"],\"application/vnd.unity\":[\"unityweb\"],\"application/vnd.uoml+xml\":[\"uoml\"],\"application/vnd.vcx\":[\"vcx\"],\"application/vnd.visio\":[\"vsd\",\"vst\",\"vss\",\"vsw\"],\"application/vnd.visionary\":[\"vis\"],\"application/vnd.vsf\":[\"vsf\"],\"application/vnd.wap.wbxml\":[\"wbxml\"],\"application/vnd.wap.wmlc\":[\"wmlc\"],\"application/vnd.wap.wmlscriptc\":[\"wmlsc\"],\"application/vnd.webturbo\":[\"wtb\"],\"application/vnd.wolfram.player\":[\"nbp\"],\"application/vnd.wordperfect\":[\"wpd\"],\"application/vnd.wqd\":[\"wqd\"],\"application/vnd.wt.stf\":[\"stf\"],\"application/vnd.xara\":[\"xar\"],\"application/vnd.xfdl\":[\"xfdl\"],\"application/vnd.yamaha.hv-dic\":[\"hvd\"],\"application/vnd.yamaha.hv-script\":[\"hvs\"],\"application/vnd.yamaha.hv-voice\":[\"hvp\"],\"application/vnd.yamaha.openscoreformat\":[\"osf\"],\"application/vnd.yamaha.openscoreformat.osfpvg+xml\":[\"osfpvg\"],\"application/vnd.yamaha.smaf-audio\":[\"saf\"],\"application/vnd.yamaha.smaf-phrase\":[\"spf\"],\"application/vnd.yellowriver-custom-menu\":[\"cmp\"],\"application/vnd.zul\":[\"zir\",\"zirz\"],\"application/vnd.zzazz.deck+xml\":[\"zaz\"],\"application/voicexml+xml\":[\"vxml\"],\"application/wasm\":[\"wasm\"],\"application/widget\":[\"wgt\"],\"application/winhlp\":[\"hlp\"],\"application/wsdl+xml\":[\"wsdl\"],\"application/wspolicy+xml\":[\"wspolicy\"],\"application/x-7z-compressed\":[\"7z\"],\"application/x-abiword\":[\"abw\"],\"application/x-ace-compressed\":[\"ace\"],\"application/x-apple-diskimage\":[],\"application/x-arj\":[\"arj\"],\"application/x-authorware-bin\":[\"aab\",\"x32\",\"u32\",\"vox\"],\"application/x-authorware-map\":[\"aam\"],\"application/x-authorware-seg\":[\"aas\"],\"application/x-bcpio\":[\"bcpio\"],\"application/x-bdoc\":[],\"application/x-bittorrent\":[\"torrent\"],\"application/x-blorb\":[\"blb\",\"blorb\"],\"application/x-bzip\":[\"bz\"],\"application/x-bzip2\":[\"bz2\",\"boz\"],\"application/x-cbr\":[\"cbr\",\"cba\",\"cbt\",\"cbz\",\"cb7\"],\"application/x-cdlink\":[\"vcd\"],\"application/x-cfs-compressed\":[\"cfs\"],\"application/x-chat\":[\"chat\"],\"application/x-chess-pgn\":[\"pgn\"],\"application/x-chrome-extension\":[\"crx\"],\"application/x-cocoa\":[\"cco\"],\"application/x-conference\":[\"nsc\"],\"application/x-cpio\":[\"cpio\"],\"application/x-csh\":[\"csh\"],\"application/x-debian-package\":[\"udeb\"],\"application/x-dgc-compressed\":[\"dgc\"],\"application/x-director\":[\"dir\",\"dcr\",\"dxr\",\"cst\",\"cct\",\"cxt\",\"w3d\",\"fgd\",\"swa\"],\"application/x-doom\":[\"wad\"],\"application/x-dtbncx+xml\":[\"ncx\"],\"application/x-dtbook+xml\":[\"dtb\"],\"application/x-dtbresource+xml\":[\"res\"],\"application/x-dvi\":[\"dvi\"],\"application/x-envoy\":[\"evy\"],\"application/x-eva\":[\"eva\"],\"application/x-font-bdf\":[\"bdf\"],\"application/x-font-ghostscript\":[\"gsf\"],\"application/x-font-linux-psf\":[\"psf\"],\"application/x-font-pcf\":[\"pcf\"],\"application/x-font-snf\":[\"snf\"],\"application/x-font-type1\":[\"pfa\",\"pfb\",\"pfm\",\"afm\"],\"application/x-freearc\":[\"arc\"],\"application/x-futuresplash\":[\"spl\"],\"application/x-gca-compressed\":[\"gca\"],\"application/x-glulx\":[\"ulx\"],\"application/x-gnumeric\":[\"gnumeric\"],\"application/x-gramps-xml\":[\"gramps\"],\"application/x-gtar\":[\"gtar\"],\"application/x-hdf\":[\"hdf\"],\"application/x-httpd-php\":[\"php\"],\"application/x-install-instructions\":[\"install\"],\"application/x-iso9660-image\":[],\"application/x-java-archive-diff\":[\"jardiff\"],\"application/x-java-jnlp-file\":[\"jnlp\"],\"application/x-latex\":[\"latex\"],\"application/x-lua-bytecode\":[\"luac\"],\"application/x-lzh-compressed\":[\"lzh\",\"lha\"],\"application/x-makeself\":[\"run\"],\"application/x-mie\":[\"mie\"],\"application/x-mobipocket-ebook\":[\"prc\",\"mobi\"],\"application/x-ms-application\":[\"application\"],\"application/x-ms-shortcut\":[\"lnk\"],\"application/x-ms-wmd\":[\"wmd\"],\"application/x-ms-wmz\":[\"wmz\"],\"application/x-ms-xbap\":[\"xbap\"],\"application/x-msaccess\":[\"mdb\"],\"application/x-msbinder\":[\"obd\"],\"application/x-mscardfile\":[\"crd\"],\"application/x-msclip\":[\"clp\"],\"application/x-msdos-program\":[],\"application/x-msdownload\":[\"com\",\"bat\"],\"application/x-msmediaview\":[\"mvb\",\"m13\",\"m14\"],\"application/x-msmetafile\":[\"wmf\",\"emf\",\"emz\"],\"application/x-msmoney\":[\"mny\"],\"application/x-mspublisher\":[\"pub\"],\"application/x-msschedule\":[\"scd\"],\"application/x-msterminal\":[\"trm\"],\"application/x-mswrite\":[\"wri\"],\"application/x-netcdf\":[\"nc\",\"cdf\"],\"application/x-ns-proxy-autoconfig\":[\"pac\"],\"application/x-nzb\":[\"nzb\"],\"application/x-perl\":[\"pl\",\"pm\"],\"application/x-pilot\":[],\"application/x-pkcs12\":[\"p12\",\"pfx\"],\"application/x-pkcs7-certificates\":[\"p7b\",\"spc\"],\"application/x-pkcs7-certreqresp\":[\"p7r\"],\"application/x-rar-compressed\":[\"rar\"],\"application/x-redhat-package-manager\":[\"rpm\"],\"application/x-research-info-systems\":[\"ris\"],\"application/x-sea\":[\"sea\"],\"application/x-sh\":[\"sh\"],\"application/x-shar\":[\"shar\"],\"application/x-shockwave-flash\":[\"swf\"],\"application/x-silverlight-app\":[\"xap\"],\"application/x-sql\":[\"sql\"],\"application/x-stuffit\":[\"sit\"],\"application/x-stuffitx\":[\"sitx\"],\"application/x-subrip\":[\"srt\"],\"application/x-sv4cpio\":[\"sv4cpio\"],\"application/x-sv4crc\":[\"sv4crc\"],\"application/x-t3vm-image\":[\"t3\"],\"application/x-tads\":[\"gam\"],\"application/x-tar\":[\"tar\"],\"application/x-tcl\":[\"tcl\",\"tk\"],\"application/x-tex\":[\"tex\"],\"application/x-tex-tfm\":[\"tfm\"],\"application/x-texinfo\":[\"texinfo\",\"texi\"],\"application/x-tgif\":[\"obj\"],\"application/x-ustar\":[\"ustar\"],\"application/x-virtualbox-hdd\":[\"hdd\"],\"application/x-virtualbox-ova\":[\"ova\"],\"application/x-virtualbox-ovf\":[\"ovf\"],\"application/x-virtualbox-vbox\":[\"vbox\"],\"application/x-virtualbox-vbox-extpack\":[\"vbox-extpack\"],\"application/x-virtualbox-vdi\":[\"vdi\"],\"application/x-virtualbox-vhd\":[\"vhd\"],\"application/x-virtualbox-vmdk\":[\"vmdk\"],\"application/x-wais-source\":[\"src\"],\"application/x-web-app-manifest+json\":[\"webapp\"],\"application/x-x509-ca-cert\":[\"der\",\"crt\",\"pem\"],\"application/x-xfig\":[\"fig\"],\"application/x-xliff+xml\":[\"xlf\"],\"application/x-xpinstall\":[\"xpi\"],\"application/x-xz\":[\"xz\"],\"application/x-zmachine\":[\"z1\",\"z2\",\"z3\",\"z4\",\"z5\",\"z6\",\"z7\",\"z8\"],\"application/xaml+xml\":[\"xaml\"],\"application/xcap-diff+xml\":[\"xdf\"],\"application/xenc+xml\":[\"xenc\"],\"application/xhtml+xml\":[\"xhtml\",\"xht\"],\"application/xml\":[\"xml\",\"xsl\",\"xsd\",\"rng\"],\"application/xml-dtd\":[\"dtd\"],\"application/xop+xml\":[\"xop\"],\"application/xproc+xml\":[\"xpl\"],\"application/xslt+xml\":[\"xslt\"],\"application/xspf+xml\":[\"xspf\"],\"application/xv+xml\":[\"mxml\",\"xhvml\",\"xvml\",\"xvm\"],\"application/yang\":[\"yang\"],\"application/yin+xml\":[\"yin\"],\"application/zip\":[\"zip\"],\"audio/3gpp\":[],\"audio/adpcm\":[\"adp\"],\"audio/basic\":[\"au\",\"snd\"],\"audio/midi\":[\"mid\",\"midi\",\"kar\",\"rmi\"],\"audio/mp3\":[],\"audio/mp4\":[\"m4a\",\"mp4a\"],\"audio/mpeg\":[\"mpga\",\"mp2\",\"mp2a\",\"mp3\",\"m2a\",\"m3a\"],\"audio/ogg\":[\"oga\",\"ogg\",\"spx\"],\"audio/s3m\":[\"s3m\"],\"audio/silk\":[\"sil\"],\"audio/vnd.dece.audio\":[\"uva\",\"uvva\"],\"audio/vnd.digital-winds\":[\"eol\"],\"audio/vnd.dra\":[\"dra\"],\"audio/vnd.dts\":[\"dts\"],\"audio/vnd.dts.hd\":[\"dtshd\"],\"audio/vnd.lucent.voice\":[\"lvp\"],\"audio/vnd.ms-playready.media.pya\":[\"pya\"],\"audio/vnd.nuera.ecelp4800\":[\"ecelp4800\"],\"audio/vnd.nuera.ecelp7470\":[\"ecelp7470\"],\"audio/vnd.nuera.ecelp9600\":[\"ecelp9600\"],\"audio/vnd.rip\":[\"rip\"],\"audio/wav\":[\"wav\"],\"audio/wave\":[],\"audio/webm\":[\"weba\"],\"audio/x-aac\":[\"aac\"],\"audio/x-aiff\":[\"aif\",\"aiff\",\"aifc\"],\"audio/x-caf\":[\"caf\"],\"audio/x-flac\":[\"flac\"],\"audio/x-m4a\":[],\"audio/x-matroska\":[\"mka\"],\"audio/x-mpegurl\":[\"m3u\"],\"audio/x-ms-wax\":[\"wax\"],\"audio/x-ms-wma\":[\"wma\"],\"audio/x-pn-realaudio\":[\"ram\",\"ra\"],\"audio/x-pn-realaudio-plugin\":[\"rmp\"],\"audio/x-realaudio\":[],\"audio/x-wav\":[],\"audio/xm\":[\"xm\"],\"chemical/x-cdx\":[\"cdx\"],\"chemical/x-cif\":[\"cif\"],\"chemical/x-cmdf\":[\"cmdf\"],\"chemical/x-cml\":[\"cml\"],\"chemical/x-csml\":[\"csml\"],\"chemical/x-xyz\":[\"xyz\"],\"font/collection\":[\"ttc\"],\"font/otf\":[\"otf\"],\"font/ttf\":[\"ttf\"],\"font/woff\":[\"woff\"],\"font/woff2\":[\"woff2\"],\"image/apng\":[\"apng\"],\"image/bmp\":[\"bmp\"],\"image/cgm\":[\"cgm\"],\"image/g3fax\":[\"g3\"],\"image/gif\":[\"gif\"],\"image/ief\":[\"ief\"],\"image/jp2\":[\"jp2\",\"jpg2\"],\"image/jpeg\":[\"jpeg\",\"jpg\",\"jpe\"],\"image/jpm\":[\"jpm\"],\"image/jpx\":[\"jpx\",\"jpf\"],\"image/ktx\":[\"ktx\"],\"image/png\":[\"png\"],\"image/prs.btif\":[\"btif\"],\"image/sgi\":[\"sgi\"],\"image/svg+xml\":[\"svg\",\"svgz\"],\"image/tiff\":[\"tiff\",\"tif\"],\"image/vnd.adobe.photoshop\":[\"psd\"],\"image/vnd.dece.graphic\":[\"uvi\",\"uvvi\",\"uvg\",\"uvvg\"],\"image/vnd.djvu\":[\"djvu\",\"djv\"],\"image/vnd.dvb.subtitle\":[],\"image/vnd.dwg\":[\"dwg\"],\"image/vnd.dxf\":[\"dxf\"],\"image/vnd.fastbidsheet\":[\"fbs\"],\"image/vnd.fpx\":[\"fpx\"],\"image/vnd.fst\":[\"fst\"],\"image/vnd.fujixerox.edmics-mmr\":[\"mmr\"],\"image/vnd.fujixerox.edmics-rlc\":[\"rlc\"],\"image/vnd.ms-modi\":[\"mdi\"],\"image/vnd.ms-photo\":[\"wdp\"],\"image/vnd.net-fpx\":[\"npx\"],\"image/vnd.wap.wbmp\":[\"wbmp\"],\"image/vnd.xiff\":[\"xif\"],\"image/webp\":[\"webp\"],\"image/x-3ds\":[\"3ds\"],\"image/x-cmu-raster\":[\"ras\"],\"image/x-cmx\":[\"cmx\"],\"image/x-freehand\":[\"fh\",\"fhc\",\"fh4\",\"fh5\",\"fh7\"],\"image/x-icon\":[\"ico\"],\"image/x-jng\":[\"jng\"],\"image/x-mrsid-image\":[\"sid\"],\"image/x-ms-bmp\":[],\"image/x-pcx\":[\"pcx\"],\"image/x-pict\":[\"pic\",\"pct\"],\"image/x-portable-anymap\":[\"pnm\"],\"image/x-portable-bitmap\":[\"pbm\"],\"image/x-portable-graymap\":[\"pgm\"],\"image/x-portable-pixmap\":[\"ppm\"],\"image/x-rgb\":[\"rgb\"],\"image/x-tga\":[\"tga\"],\"image/x-xbitmap\":[\"xbm\"],\"image/x-xpixmap\":[\"xpm\"],\"image/x-xwindowdump\":[\"xwd\"],\"message/rfc822\":[\"eml\",\"mime\"],\"model/gltf+json\":[\"gltf\"],\"model/gltf-binary\":[\"glb\"],\"model/iges\":[\"igs\",\"iges\"],\"model/mesh\":[\"msh\",\"mesh\",\"silo\"],\"model/vnd.collada+xml\":[\"dae\"],\"model/vnd.dwf\":[\"dwf\"],\"model/vnd.gdl\":[\"gdl\"],\"model/vnd.gtw\":[\"gtw\"],\"model/vnd.mts\":[\"mts\"],\"model/vnd.vtu\":[\"vtu\"],\"model/vrml\":[\"wrl\",\"vrml\"],\"model/x3d+binary\":[\"x3db\",\"x3dbz\"],\"model/x3d+vrml\":[\"x3dv\",\"x3dvz\"],\"model/x3d+xml\":[\"x3d\",\"x3dz\"],\"text/cache-manifest\":[\"appcache\",\"manifest\"],\"text/calendar\":[\"ics\",\"ifb\"],\"text/coffeescript\":[\"coffee\",\"litcoffee\"],\"text/css\":[\"css\"],\"text/csv\":[\"csv\"],\"text/hjson\":[\"hjson\"],\"text/html\":[\"html\",\"htm\",\"shtml\"],\"text/jade\":[\"jade\"],\"text/jsx\":[\"jsx\"],\"text/less\":[\"less\"],\"text/markdown\":[\"markdown\",\"md\"],\"text/mathml\":[\"mml\"],\"text/n3\":[\"n3\"],\"text/plain\":[\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\",\"in\",\"ini\"],\"text/prs.lines.tag\":[\"dsc\"],\"text/richtext\":[\"rtx\"],\"text/rtf\":[],\"text/sgml\":[\"sgml\",\"sgm\"],\"text/slim\":[\"slim\",\"slm\"],\"text/stylus\":[\"stylus\",\"styl\"],\"text/tab-separated-values\":[\"tsv\"],\"text/troff\":[\"t\",\"tr\",\"roff\",\"man\",\"me\",\"ms\"],\"text/turtle\":[\"ttl\"],\"text/uri-list\":[\"uri\",\"uris\",\"urls\"],\"text/vcard\":[\"vcard\"],\"text/vnd.curl\":[\"curl\"],\"text/vnd.curl.dcurl\":[\"dcurl\"],\"text/vnd.curl.mcurl\":[\"mcurl\"],\"text/vnd.curl.scurl\":[\"scurl\"],\"text/vnd.dvb.subtitle\":[\"sub\"],\"text/vnd.fly\":[\"fly\"],\"text/vnd.fmi.flexstor\":[\"flx\"],\"text/vnd.graphviz\":[\"gv\"],\"text/vnd.in3d.3dml\":[\"3dml\"],\"text/vnd.in3d.spot\":[\"spot\"],\"text/vnd.sun.j2me.app-descriptor\":[\"jad\"],\"text/vnd.wap.wml\":[\"wml\"],\"text/vnd.wap.wmlscript\":[\"wmls\"],\"text/vtt\":[\"vtt\"],\"text/x-asm\":[\"s\",\"asm\"],\"text/x-c\":[\"c\",\"cc\",\"cxx\",\"cpp\",\"h\",\"hh\",\"dic\"],\"text/x-component\":[\"htc\"],\"text/x-fortran\":[\"f\",\"for\",\"f77\",\"f90\"],\"text/x-handlebars-template\":[\"hbs\"],\"text/x-java-source\":[\"java\"],\"text/x-lua\":[\"lua\"],\"text/x-markdown\":[\"mkd\"],\"text/x-nfo\":[\"nfo\"],\"text/x-opml\":[\"opml\"],\"text/x-org\":[],\"text/x-pascal\":[\"p\",\"pas\"],\"text/x-processing\":[\"pde\"],\"text/x-sass\":[\"sass\"],\"text/x-scss\":[\"scss\"],\"text/x-setext\":[\"etx\"],\"text/x-sfv\":[\"sfv\"],\"text/x-suse-ymp\":[\"ymp\"],\"text/x-uuencode\":[\"uu\"],\"text/x-vcalendar\":[\"vcs\"],\"text/x-vcard\":[\"vcf\"],\"text/xml\":[],\"text/yaml\":[\"yaml\",\"yml\"],\"video/3gpp\":[\"3gp\",\"3gpp\"],\"video/3gpp2\":[\"3g2\"],\"video/h261\":[\"h261\"],\"video/h263\":[\"h263\"],\"video/h264\":[\"h264\"],\"video/jpeg\":[\"jpgv\"],\"video/jpm\":[\"jpgm\"],\"video/mj2\":[\"mj2\",\"mjp2\"],\"video/mp2t\":[\"ts\"],\"video/mp4\":[\"mp4\",\"mp4v\",\"mpg4\"],\"video/mpeg\":[\"mpeg\",\"mpg\",\"mpe\",\"m1v\",\"m2v\"],\"video/ogg\":[\"ogv\"],\"video/quicktime\":[\"qt\",\"mov\"],\"video/vnd.dece.hd\":[\"uvh\",\"uvvh\"],\"video/vnd.dece.mobile\":[\"uvm\",\"uvvm\"],\"video/vnd.dece.pd\":[\"uvp\",\"uvvp\"],\"video/vnd.dece.sd\":[\"uvs\",\"uvvs\"],\"video/vnd.dece.video\":[\"uvv\",\"uvvv\"],\"video/vnd.dvb.file\":[\"dvb\"],\"video/vnd.fvt\":[\"fvt\"],\"video/vnd.mpegurl\":[\"mxu\",\"m4u\"],\"video/vnd.ms-playready.media.pyv\":[\"pyv\"],\"video/vnd.uvvu.mp4\":[\"uvu\",\"uvvu\"],\"video/vnd.vivo\":[\"viv\"],\"video/webm\":[\"webm\"],\"video/x-f4v\":[\"f4v\"],\"video/x-fli\":[\"fli\"],\"video/x-flv\":[\"flv\"],\"video/x-m4v\":[\"m4v\"],\"video/x-matroska\":[\"mkv\",\"mk3d\",\"mks\"],\"video/x-mng\":[\"mng\"],\"video/x-ms-asf\":[\"asf\",\"asx\"],\"video/x-ms-vob\":[\"vob\"],\"video/x-ms-wm\":[\"wm\"],\"video/x-ms-wmv\":[\"wmv\"],\"video/x-ms-wmx\":[\"wmx\"],\"video/x-ms-wvx\":[\"wvx\"],\"video/x-msvideo\":[\"avi\"],\"video/x-sgi-movie\":[\"movie\"],\"video/x-smv\":[\"smv\"],\"x-conference/x-cooltalk\":[\"ice\"]}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/.eslintrc",
    "content": "{\n\t\"root\": true,\n\n\t\"extends\": \"@ljharb/eslint-config/node/0.4\",\n\n\t\"rules\": {\n\t\t\"array-element-newline\": 0,\n\t\t\"complexity\": 0,\n\t\t\"func-style\": [2, \"declaration\"],\n\t\t\"max-lines-per-function\": 0,\n\t\t\"max-nested-callbacks\": 1,\n\t\t\"max-statements-per-line\": 1,\n\t\t\"max-statements\": 0,\n\t\t\"multiline-comment-style\": 0,\n\t\t\"no-continue\": 1,\n\t\t\"no-param-reassign\": 1,\n\t\t\"no-restricted-syntax\": 1,\n\t\t\"object-curly-newline\": 0,\n\t},\n\n\t\"overrides\": [\n\t\t{\n\t\t\t\"files\": \"test/**\",\n\t\t\t\"rules\": {\n\t\t\t\t\"camelcase\": 0,\n\t\t\t},\n\t\t},\n\t]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/.github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: [ljharb]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: npm/minimist\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/.nycrc",
    "content": "{\n\t\"all\": true,\n\t\"check-coverage\": false,\n\t\"reporter\": [\"text-summary\", \"text\", \"html\", \"json\"],\n\t\"lines\": 86,\n\t\"statements\": 85.93,\n\t\"functions\": 82.43,\n\t\"branches\": 76.06,\n\t\"exclude\": [\n\t\t\"coverage\",\n\t\t\"example\",\n\t\t\"test\"\n\t]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [v1.2.8](https://github.com/minimistjs/minimist/compare/v1.2.7...v1.2.8) - 2023-02-09\n\n### Merged\n\n- [Fix] Fix long option followed by single dash [`#17`](https://github.com/minimistjs/minimist/pull/17)\n- [Tests] Remove duplicate test [`#12`](https://github.com/minimistjs/minimist/pull/12)\n- [Fix] opt.string works with multiple aliases [`#10`](https://github.com/minimistjs/minimist/pull/10)\n\n### Fixed\n\n- [Fix] Fix long option followed by single dash (#17) [`#15`](https://github.com/minimistjs/minimist/issues/15)\n- [Tests] Remove duplicate test (#12) [`#8`](https://github.com/minimistjs/minimist/issues/8)\n- [Fix] Fix long option followed by single dash [`#15`](https://github.com/minimistjs/minimist/issues/15)\n- [Fix] opt.string works with multiple aliases (#10) [`#9`](https://github.com/minimistjs/minimist/issues/9)\n- [Fix] Fix handling of short option with non-trivial equals [`#5`](https://github.com/minimistjs/minimist/issues/5)\n- [Tests] Remove duplicate test [`#8`](https://github.com/minimistjs/minimist/issues/8)\n- [Fix] opt.string works with multiple aliases [`#9`](https://github.com/minimistjs/minimist/issues/9)\n\n### Commits\n\n- Merge tag 'v0.2.3' [`a026794`](https://github.com/minimistjs/minimist/commit/a0267947c7870fc5847cf2d437fbe33f392767da)\n- [eslint] fix indentation and whitespace [`5368ca4`](https://github.com/minimistjs/minimist/commit/5368ca4147e974138a54cc0dc4cea8f756546b70)\n- [eslint] fix indentation and whitespace [`e5f5067`](https://github.com/minimistjs/minimist/commit/e5f5067259ceeaf0b098d14bec910f87e58708c7)\n- [eslint] more cleanup [`62fde7d`](https://github.com/minimistjs/minimist/commit/62fde7d935f83417fb046741531a9e2346a36976)\n- [eslint] more cleanup [`36ac5d0`](https://github.com/minimistjs/minimist/commit/36ac5d0d95e4947d074e5737d94814034ca335d1)\n- [meta] add `auto-changelog` [`73923d2`](https://github.com/minimistjs/minimist/commit/73923d223553fca08b1ba77e3fbc2a492862ae4c)\n- [actions] add reusable workflows [`d80727d`](https://github.com/minimistjs/minimist/commit/d80727df77bfa9e631044d7f16368d8f09242c91)\n- [eslint] add eslint; rules to enable later are warnings [`48bc06a`](https://github.com/minimistjs/minimist/commit/48bc06a1b41f00e9cdf183db34f7a51ba70e98d4)\n- [eslint] fix indentation [`34b0f1c`](https://github.com/minimistjs/minimist/commit/34b0f1ccaa45183c3c4f06a91f9b405180a6f982)\n- [readme] rename and add badges [`5df0fe4`](https://github.com/minimistjs/minimist/commit/5df0fe49211bd09a3636f8686a7cb3012c3e98f0)\n- [Dev Deps] switch from `covert` to `nyc` [`a48b128`](https://github.com/minimistjs/minimist/commit/a48b128fdb8d427dfb20a15273f83e38d97bef07)\n- [Dev Deps] update `covert`, `tape`; remove unnecessary `tap` [`f0fb958`](https://github.com/minimistjs/minimist/commit/f0fb958e9a1fe980cdffc436a211b0bda58f621b)\n- [meta] create FUNDING.yml; add `funding` in package.json [`3639e0c`](https://github.com/minimistjs/minimist/commit/3639e0c819359a366387e425ab6eabf4c78d3caa)\n- [meta] use `npmignore` to autogenerate an npmignore file [`be2e038`](https://github.com/minimistjs/minimist/commit/be2e038c342d8333b32f0fde67a0026b79c8150e)\n- Only apps should have lockfiles [`282b570`](https://github.com/minimistjs/minimist/commit/282b570e7489d01b03f2d6d3dabf79cd3e5f84cf)\n- isConstructorOrProto adapted from PR [`ef9153f`](https://github.com/minimistjs/minimist/commit/ef9153fc52b6cea0744b2239921c5dcae4697f11)\n- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`098873c`](https://github.com/minimistjs/minimist/commit/098873c213cdb7c92e55ae1ef5aa1af3a8192a79)\n- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`3124ed3`](https://github.com/minimistjs/minimist/commit/3124ed3e46306301ebb3c834874ce0241555c2c4)\n- [meta] add `safe-publish-latest` [`4b927de`](https://github.com/minimistjs/minimist/commit/4b927de696d561c636b4f43bf49d4597cb36d6d6)\n- [Tests] add `aud` in `posttest` [`b32d9bd`](https://github.com/minimistjs/minimist/commit/b32d9bd0ab340f4e9f8c3a97ff2a4424f25fab8c)\n- [meta] update repo URLs [`f9fdfc0`](https://github.com/minimistjs/minimist/commit/f9fdfc032c54884d9a9996a390c63cd0719bbe1a)\n- [actions] Avoid 0.6 tests due to build failures [`ba92fe6`](https://github.com/minimistjs/minimist/commit/ba92fe6ebbdc0431cca9a2ea8f27beb492f5e4ec)\n- [Dev Deps] update `tape` [`950eaa7`](https://github.com/minimistjs/minimist/commit/950eaa74f112e04d23e9c606c67472c46739b473)\n- [Dev Deps] add missing `npmignore` dev dep [`3226afa`](https://github.com/minimistjs/minimist/commit/3226afaf09e9d127ca369742437fe6e88f752d6b)\n- Merge tag 'v0.2.2' [`980d7ac`](https://github.com/minimistjs/minimist/commit/980d7ac61a0b4bd552711251ac107d506b23e41f)\n\n## [v1.2.7](https://github.com/minimistjs/minimist/compare/v1.2.6...v1.2.7) - 2022-10-10\n\n### Commits\n\n- [meta] add `auto-changelog` [`0ebf4eb`](https://github.com/minimistjs/minimist/commit/0ebf4ebcd5f7787a5524d31a849ef41316b83c3c)\n- [actions] add reusable workflows [`e115b63`](https://github.com/minimistjs/minimist/commit/e115b63fa9d3909f33b00a2db647ff79068388de)\n- [eslint] add eslint; rules to enable later are warnings [`f58745b`](https://github.com/minimistjs/minimist/commit/f58745b9bb84348e1be72af7dbba5840c7c13013)\n- [Dev Deps] switch from `covert` to `nyc` [`ab03356`](https://github.com/minimistjs/minimist/commit/ab033567b9c8b31117cb026dc7f1e592ce455c65)\n- [readme] rename and add badges [`236f4a0`](https://github.com/minimistjs/minimist/commit/236f4a07e4ebe5ee44f1496ec6974991ab293ffd)\n- [meta] create FUNDING.yml; add `funding` in package.json [`783a49b`](https://github.com/minimistjs/minimist/commit/783a49bfd47e8335d3098a8cac75662cf71eb32a)\n- [meta] use `npmignore` to autogenerate an npmignore file [`f81ece6`](https://github.com/minimistjs/minimist/commit/f81ece6aaec2fa14e69ff4f1e0407a8c4e2635a2)\n- Only apps should have lockfiles [`56cad44`](https://github.com/minimistjs/minimist/commit/56cad44c7f879b9bb5ec18fcc349308024a89bfc)\n- [Dev Deps] update `covert`, `tape`; remove unnecessary `tap` [`49c5f9f`](https://github.com/minimistjs/minimist/commit/49c5f9fb7e6a92db9eb340cc679de92fb3aacded)\n- [Tests] add `aud` in `posttest` [`228ae93`](https://github.com/minimistjs/minimist/commit/228ae938f3cd9db9dfd8bd7458b076a7b2aef280)\n- [meta] add `safe-publish-latest` [`01fc23f`](https://github.com/minimistjs/minimist/commit/01fc23f5104f85c75059972e01dd33796ab529ff)\n- [meta] update repo URLs [`6b164c7`](https://github.com/minimistjs/minimist/commit/6b164c7d68e0b6bf32f894699effdfb7c63041dd)\n\n## [v1.2.6](https://github.com/minimistjs/minimist/compare/v1.2.5...v1.2.6) - 2022-03-21\n\n### Commits\n\n- test from prototype pollution PR [`bc8ecee`](https://github.com/minimistjs/minimist/commit/bc8ecee43875261f4f17eb20b1243d3ed15e70eb)\n- isConstructorOrProto adapted from PR [`c2b9819`](https://github.com/minimistjs/minimist/commit/c2b981977fa834b223b408cfb860f933c9811e4d)\n- security notice for additional prototype pollution issue [`ef88b93`](https://github.com/minimistjs/minimist/commit/ef88b9325f77b5ee643ccfc97e2ebda577e4c4e2)\n\n## [v1.2.5](https://github.com/minimistjs/minimist/compare/v1.2.4...v1.2.5) - 2020-03-12\n\n## [v1.2.4](https://github.com/minimistjs/minimist/compare/v1.2.3...v1.2.4) - 2020-03-11\n\n### Commits\n\n- security notice [`4cf1354`](https://github.com/minimistjs/minimist/commit/4cf1354839cb972e38496d35e12f806eea92c11f)\n- additional test for constructor prototype pollution [`1043d21`](https://github.com/minimistjs/minimist/commit/1043d212c3caaf871966e710f52cfdf02f9eea4b)\n\n## [v1.2.3](https://github.com/minimistjs/minimist/compare/v1.2.2...v1.2.3) - 2020-03-10\n\n### Commits\n\n- more failing proto pollution tests [`13c01a5`](https://github.com/minimistjs/minimist/commit/13c01a5327736903704984b7f65616b8476850cc)\n- even more aggressive checks for protocol pollution [`38a4d1c`](https://github.com/minimistjs/minimist/commit/38a4d1caead72ef99e824bb420a2528eec03d9ab)\n\n## [v1.2.2](https://github.com/minimistjs/minimist/compare/v1.2.1...v1.2.2) - 2020-03-10\n\n### Commits\n\n- failing test for protocol pollution [`0efed03`](https://github.com/minimistjs/minimist/commit/0efed0340ec8433638758f7ca0c77cb20a0bfbab)\n- cleanup [`67d3722`](https://github.com/minimistjs/minimist/commit/67d3722413448d00a62963d2d30c34656a92d7e2)\n- console.dir -&gt; console.log [`47acf72`](https://github.com/minimistjs/minimist/commit/47acf72c715a630bf9ea013867f47f1dd69dfc54)\n- don't assign onto __proto__ [`63e7ed0`](https://github.com/minimistjs/minimist/commit/63e7ed05aa4b1889ec2f3b196426db4500cbda94)\n\n## [v1.2.1](https://github.com/minimistjs/minimist/compare/v1.2.0...v1.2.1) - 2020-03-10\n\n### Merged\n\n- move the `opts['--']` example back where it belongs [`#63`](https://github.com/minimistjs/minimist/pull/63)\n\n### Commits\n\n- add test [`6be5dae`](https://github.com/minimistjs/minimist/commit/6be5dae35a32a987bcf4137fcd6c19c5200ee909)\n- fix bad boolean regexp [`ac3fc79`](https://github.com/minimistjs/minimist/commit/ac3fc796e63b95128fdbdf67ea7fad71bd59aa76)\n\n## [v1.2.0](https://github.com/minimistjs/minimist/compare/v1.1.3...v1.2.0) - 2015-08-24\n\n### Commits\n\n- failing -k=v short test [`63416b8`](https://github.com/minimistjs/minimist/commit/63416b8cd1d0d70e4714564cce465a36e4dd26d7)\n- kv short fix [`6bbe145`](https://github.com/minimistjs/minimist/commit/6bbe14529166245e86424f220a2321442fe88dc3)\n- failing kv short test [`f72ab7f`](https://github.com/minimistjs/minimist/commit/f72ab7f4572adc52902c9b6873cc969192f01b10)\n- fixed kv test [`f5a48c3`](https://github.com/minimistjs/minimist/commit/f5a48c3e50e40ca54f00c8e84de4b4d6e9897fa8)\n- enforce space between arg key and value [`86b321a`](https://github.com/minimistjs/minimist/commit/86b321affe648a8e016c095a4f0efa9d9074f502)\n\n## [v1.1.3](https://github.com/minimistjs/minimist/compare/v1.1.2...v1.1.3) - 2015-08-06\n\n### Commits\n\n- add failing test - boolean alias array [`0fa3c5b`](https://github.com/minimistjs/minimist/commit/0fa3c5b3dd98551ddecf5392831b4c21211743fc)\n- fix boolean values with multiple aliases [`9c0a6e7`](https://github.com/minimistjs/minimist/commit/9c0a6e7de25a273b11bbf9a7464f0bd833779795)\n\n## [v1.1.2](https://github.com/minimistjs/minimist/compare/v1.1.1...v1.1.2) - 2015-07-22\n\n### Commits\n\n- Convert boolean arguments to boolean values [`8f3dc27`](https://github.com/minimistjs/minimist/commit/8f3dc27cf833f1d54671b6d0bcb55c2fe19672a9)\n- use non-ancient npm, node 0.12 and iojs [`61ed1d0`](https://github.com/minimistjs/minimist/commit/61ed1d034b9ec7282764ce76f3992b1a0b4906ae)\n- an older npm for 0.8 [`25cf778`](https://github.com/minimistjs/minimist/commit/25cf778b1220e7838a526832ad6972f75244054f)\n\n## [v1.1.1](https://github.com/minimistjs/minimist/compare/v1.1.0...v1.1.1) - 2015-03-10\n\n### Commits\n\n- check that they type of a value is a boolean, not just that it is currently set to a boolean [`6863198`](https://github.com/minimistjs/minimist/commit/6863198e36139830ff1f20ffdceaddd93f2c1db9)\n- upgrade tape, fix type issues from old tape version [`806712d`](https://github.com/minimistjs/minimist/commit/806712df91604ed02b8e39aa372b84aea659ee34)\n- test for setting a boolean to a null default [`8c444fe`](https://github.com/minimistjs/minimist/commit/8c444fe89384ded7d441c120915ea60620b01dd3)\n- if the previous value was a boolean, without an default (or with an alias) don't make an array either [`e5f419a`](https://github.com/minimistjs/minimist/commit/e5f419a3b5b3bc3f9e5ac71b7040621af70ed2dd)\n\n## [v1.1.0](https://github.com/minimistjs/minimist/compare/v1.0.0...v1.1.0) - 2014-08-10\n\n### Commits\n\n- add support for handling \"unknown\" options not registered with the parser. [`6f3cc5d`](https://github.com/minimistjs/minimist/commit/6f3cc5d4e84524932a6ef2ce3592acc67cdd4383)\n- reformat package.json [`02ed371`](https://github.com/minimistjs/minimist/commit/02ed37115194d3697ff358e8e25e5e66bab1d9f8)\n- coverage script [`e5531ba`](https://github.com/minimistjs/minimist/commit/e5531ba0479da3b8138d3d8cac545d84ccb1c8df)\n- extra fn to get 100% coverage again [`a6972da`](https://github.com/minimistjs/minimist/commit/a6972da89e56bf77642f8ec05a13b6558db93498)\n\n## [v1.0.0](https://github.com/minimistjs/minimist/compare/v0.2.3...v1.0.0) - 2014-08-10\n\n### Commits\n\n- added stopEarly option [`471c7e4`](https://github.com/minimistjs/minimist/commit/471c7e4a7e910fc7ad8f9df850a186daf32c64e9)\n- fix list [`fef6ae7`](https://github.com/minimistjs/minimist/commit/fef6ae79c38b9dc1c49569abb7cd04eb965eac5e)\n\n## [v0.2.3](https://github.com/minimistjs/minimist/compare/v0.2.2...v0.2.3) - 2023-02-09\n\n### Merged\n\n- [Fix] Fix long option followed by single dash [`#17`](https://github.com/minimistjs/minimist/pull/17)\n- [Tests] Remove duplicate test [`#12`](https://github.com/minimistjs/minimist/pull/12)\n- [Fix] opt.string works with multiple aliases [`#10`](https://github.com/minimistjs/minimist/pull/10)\n\n### Fixed\n\n- [Fix] Fix long option followed by single dash (#17) [`#15`](https://github.com/minimistjs/minimist/issues/15)\n- [Tests] Remove duplicate test (#12) [`#8`](https://github.com/minimistjs/minimist/issues/8)\n- [Fix] opt.string works with multiple aliases (#10) [`#9`](https://github.com/minimistjs/minimist/issues/9)\n\n### Commits\n\n- [eslint] fix indentation and whitespace [`e5f5067`](https://github.com/minimistjs/minimist/commit/e5f5067259ceeaf0b098d14bec910f87e58708c7)\n- [eslint] more cleanup [`36ac5d0`](https://github.com/minimistjs/minimist/commit/36ac5d0d95e4947d074e5737d94814034ca335d1)\n- [eslint] fix indentation [`34b0f1c`](https://github.com/minimistjs/minimist/commit/34b0f1ccaa45183c3c4f06a91f9b405180a6f982)\n- isConstructorOrProto adapted from PR [`ef9153f`](https://github.com/minimistjs/minimist/commit/ef9153fc52b6cea0744b2239921c5dcae4697f11)\n- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`098873c`](https://github.com/minimistjs/minimist/commit/098873c213cdb7c92e55ae1ef5aa1af3a8192a79)\n- [Dev Deps] add missing `npmignore` dev dep [`3226afa`](https://github.com/minimistjs/minimist/commit/3226afaf09e9d127ca369742437fe6e88f752d6b)\n\n## [v0.2.2](https://github.com/minimistjs/minimist/compare/v0.2.1...v0.2.2) - 2022-10-10\n\n### Commits\n\n- [meta] add `auto-changelog` [`73923d2`](https://github.com/minimistjs/minimist/commit/73923d223553fca08b1ba77e3fbc2a492862ae4c)\n- [actions] add reusable workflows [`d80727d`](https://github.com/minimistjs/minimist/commit/d80727df77bfa9e631044d7f16368d8f09242c91)\n- [eslint] add eslint; rules to enable later are warnings [`48bc06a`](https://github.com/minimistjs/minimist/commit/48bc06a1b41f00e9cdf183db34f7a51ba70e98d4)\n- [readme] rename and add badges [`5df0fe4`](https://github.com/minimistjs/minimist/commit/5df0fe49211bd09a3636f8686a7cb3012c3e98f0)\n- [Dev Deps] switch from `covert` to `nyc` [`a48b128`](https://github.com/minimistjs/minimist/commit/a48b128fdb8d427dfb20a15273f83e38d97bef07)\n- [Dev Deps] update `covert`, `tape`; remove unnecessary `tap` [`f0fb958`](https://github.com/minimistjs/minimist/commit/f0fb958e9a1fe980cdffc436a211b0bda58f621b)\n- [meta] create FUNDING.yml; add `funding` in package.json [`3639e0c`](https://github.com/minimistjs/minimist/commit/3639e0c819359a366387e425ab6eabf4c78d3caa)\n- [meta] use `npmignore` to autogenerate an npmignore file [`be2e038`](https://github.com/minimistjs/minimist/commit/be2e038c342d8333b32f0fde67a0026b79c8150e)\n- Only apps should have lockfiles [`282b570`](https://github.com/minimistjs/minimist/commit/282b570e7489d01b03f2d6d3dabf79cd3e5f84cf)\n- [meta] add `safe-publish-latest` [`4b927de`](https://github.com/minimistjs/minimist/commit/4b927de696d561c636b4f43bf49d4597cb36d6d6)\n- [Tests] add `aud` in `posttest` [`b32d9bd`](https://github.com/minimistjs/minimist/commit/b32d9bd0ab340f4e9f8c3a97ff2a4424f25fab8c)\n- [meta] update repo URLs [`f9fdfc0`](https://github.com/minimistjs/minimist/commit/f9fdfc032c54884d9a9996a390c63cd0719bbe1a)\n\n## [v0.2.1](https://github.com/minimistjs/minimist/compare/v0.2.0...v0.2.1) - 2020-03-12\n\n## [v0.2.0](https://github.com/minimistjs/minimist/compare/v0.1.0...v0.2.0) - 2014-06-19\n\n### Commits\n\n- support all-boolean mode [`450a97f`](https://github.com/minimistjs/minimist/commit/450a97f6e2bc85c7a4a13185c19a818d9a5ebe69)\n\n## [v0.1.0](https://github.com/minimistjs/minimist/compare/v0.0.10...v0.1.0) - 2014-05-12\n\n### Commits\n\n- Provide a mechanism to segregate -- arguments [`ce4a1e6`](https://github.com/minimistjs/minimist/commit/ce4a1e63a7e8d5ab88d2a3768adefa6af98a445a)\n- documented argv['--'] [`14db0e6`](https://github.com/minimistjs/minimist/commit/14db0e6dbc6d2b9e472adaa54dad7004b364634f)\n- Adding a test-case for notFlags segregation [`715c1e3`](https://github.com/minimistjs/minimist/commit/715c1e3714be223f998f6c537af6b505f0236c16)\n\n## [v0.0.10](https://github.com/minimistjs/minimist/compare/v0.0.9...v0.0.10) - 2014-05-11\n\n### Commits\n\n- dedicated boolean test [`46e448f`](https://github.com/minimistjs/minimist/commit/46e448f9f513cfeb2bcc8b688b9b47ba1e515c2b)\n- dedicated num test [`9bf2d36`](https://github.com/minimistjs/minimist/commit/9bf2d36f1d3b8795be90b8f7de0a937f098aa394)\n- aliased values treated as strings [`1ab743b`](https://github.com/minimistjs/minimist/commit/1ab743bad4484d69f1259bed42f9531de01119de)\n- cover the case of already numbers, at 100% coverage [`b2bb044`](https://github.com/minimistjs/minimist/commit/b2bb04436599d77a2ce029e8e555e25b3aa55d13)\n- another test for higher coverage [`3662624`](https://github.com/minimistjs/minimist/commit/3662624be976d5489d486a856849c048d13be903)\n\n## [v0.0.9](https://github.com/minimistjs/minimist/compare/v0.0.8...v0.0.9) - 2014-05-08\n\n### Commits\n\n- Eliminate `longest` fn. [`824f642`](https://github.com/minimistjs/minimist/commit/824f642038d1b02ede68b6261d1d65163390929a)\n\n## [v0.0.8](https://github.com/minimistjs/minimist/compare/v0.0.7...v0.0.8) - 2014-02-20\n\n### Commits\n\n- return '' if flag is string and empty [`fa63ed4`](https://github.com/minimistjs/minimist/commit/fa63ed4651a4ef4eefddce34188e0d98d745a263)\n- handle joined single letters [`66c248f`](https://github.com/minimistjs/minimist/commit/66c248f0241d4d421d193b022e9e365f11178534)\n\n## [v0.0.7](https://github.com/minimistjs/minimist/compare/v0.0.6...v0.0.7) - 2014-02-08\n\n### Commits\n\n- another swap of .test for .match [`d1da408`](https://github.com/minimistjs/minimist/commit/d1da40819acbe846d89a5c02721211e3c1260dde)\n\n## [v0.0.6](https://github.com/minimistjs/minimist/compare/v0.0.5...v0.0.6) - 2014-02-08\n\n### Commits\n\n- use .test() instead of .match() to not crash on non-string values in the arguments array [`7e0d1ad`](https://github.com/minimistjs/minimist/commit/7e0d1add8c9e5b9b20a4d3d0f9a94d824c578da1)\n\n## [v0.0.5](https://github.com/minimistjs/minimist/compare/v0.0.4...v0.0.5) - 2013-09-18\n\n### Commits\n\n- Improve '--' handling. [`b11822c`](https://github.com/minimistjs/minimist/commit/b11822c09cc9d2460f30384d12afc0b953c037a4)\n\n## [v0.0.4](https://github.com/minimistjs/minimist/compare/v0.0.3...v0.0.4) - 2013-09-17\n\n## [v0.0.3](https://github.com/minimistjs/minimist/compare/v0.0.2...v0.0.3) - 2013-09-12\n\n### Commits\n\n- failing test for single dash preceeding a double dash [`b465514`](https://github.com/minimistjs/minimist/commit/b465514b82c9ae28972d714facd951deb2ad762b)\n- fix for the dot test [`6a095f1`](https://github.com/minimistjs/minimist/commit/6a095f1d364c8fab2d6753d2291a0649315d297a)\n\n## [v0.0.2](https://github.com/minimistjs/minimist/compare/v0.0.1...v0.0.2) - 2013-08-28\n\n### Commits\n\n- allow dotted aliases & defaults [`321c33e`](https://github.com/minimistjs/minimist/commit/321c33e755485faaeb44eeb1c05d33b2e0a5a7c4)\n- use a better version of ff [`e40f611`](https://github.com/minimistjs/minimist/commit/e40f61114cf7be6f7947f7b3eed345853a67dbbb)\n\n## [v0.0.1](https://github.com/minimistjs/minimist/compare/v0.0.0...v0.0.1) - 2013-06-25\n\n### Commits\n\n- remove trailing commas [`6ff0fa0`](https://github.com/minimistjs/minimist/commit/6ff0fa055064f15dbe06d50b89d5173a6796e1db)\n\n## v0.0.0 - 2013-06-25\n\n### Commits\n\n- half of the parse test ported [`3079326`](https://github.com/minimistjs/minimist/commit/307932601325087de6cf94188eb798ffc4f3088a)\n- stripped down code and a passing test from optimist [`7cced88`](https://github.com/minimistjs/minimist/commit/7cced88d82e399d1a03ed23eb667f04d3f320d10)\n- ported parse tests completely over [`9448754`](https://github.com/minimistjs/minimist/commit/944875452e0820df6830b1408c26a0f7d3e1db04)\n- docs, package.json [`a5bf46a`](https://github.com/minimistjs/minimist/commit/a5bf46ac9bb3bd114a9c340276c62c1091e538d5)\n- move more short tests into short.js [`503edb5`](https://github.com/minimistjs/minimist/commit/503edb5c41d89c0d40831ee517154fc13b0f18b9)\n- default bool test was wrong, not the code [`1b9f5db`](https://github.com/minimistjs/minimist/commit/1b9f5db4741b49962846081b68518de824992097)\n- passing long tests ripped out of parse.js [`7972c4a`](https://github.com/minimistjs/minimist/commit/7972c4aff1f4803079e1668006658e2a761a0428)\n- badges [`84c0370`](https://github.com/minimistjs/minimist/commit/84c037063664d42878aace715fe6572ce01b6f3b)\n- all the tests now ported, some failures [`64239ed`](https://github.com/minimistjs/minimist/commit/64239edfe92c711c4eb0da254fcdfad2a5fdb605)\n- failing short test [`f8a5341`](https://github.com/minimistjs/minimist/commit/f8a534112dd1138d2fad722def56a848480c446f)\n- fixed the numeric test [`6b034f3`](https://github.com/minimistjs/minimist/commit/6b034f37c79342c60083ed97fd222e16928aac51)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/LICENSE",
    "content": "This software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/README.md",
    "content": "# minimist <sup>[![Version Badge][npm-version-svg]][package-url]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nparse argument options\n\nThis module is the guts of optimist's argument parser without all the\nfanciful decoration.\n\n# example\n\n``` js\nvar argv = require('minimist')(process.argv.slice(2));\nconsole.log(argv);\n```\n\n```\n$ node example/parse.js -a beep -b boop\n{ _: [], a: 'beep', b: 'boop' }\n```\n\n```\n$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz\n{\n\t_: ['foo', 'bar', 'baz'],\n\tx: 3,\n\ty: 4,\n\tn: 5,\n\ta: true,\n\tb: true,\n\tc: true,\n\tbeep: 'boop'\n}\n```\n\n# security\n\nPrevious versions had a prototype pollution bug that could cause privilege\nescalation in some circumstances when handling untrusted user input.\n\nPlease use version 1.2.6 or later:\n\n* https://security.snyk.io/vuln/SNYK-JS-MINIMIST-2429795 (version <=1.2.5)\n* https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 (version <=1.2.3)\n\n# methods\n\n``` js\nvar parseArgs = require('minimist')\n```\n\n## var argv = parseArgs(args, opts={})\n\nReturn an argument object `argv` populated with the array arguments from `args`.\n\n`argv._` contains all the arguments that didn't have an option associated with\nthem.\n\nNumeric-looking arguments will be returned as numbers unless `opts.string` or\n`opts.boolean` is set for that argument name.\n\nAny arguments after `'--'` will not be parsed and will end up in `argv._`.\n\noptions can be:\n\n* `opts.string` - a string or array of strings argument names to always treat as\nstrings\n* `opts.boolean` - a boolean, string or array of strings to always treat as\nbooleans. if `true` will treat all double hyphenated arguments without equal signs\nas boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`)\n* `opts.alias` - an object mapping string names to strings or arrays of string\nargument names to use as aliases\n* `opts.default` - an object mapping string argument names to default values\n* `opts.stopEarly` - when true, populate `argv._` with everything after the\nfirst non-option\n* `opts['--']` - when true, populate `argv._` with everything before the `--`\nand `argv['--']` with everything after the `--`. Here's an example:\n\n  ```\n  > require('./')('one two three -- four five --six'.split(' '), { '--': true })\n  {\n    _: ['one', 'two', 'three'],\n    '--': ['four', 'five', '--six']\n  }\n  ```\n\n  Note that with `opts['--']` set, parsing for arguments still stops after the\n  `--`.\n\n* `opts.unknown` - a function which is invoked with a command line parameter not\ndefined in the `opts` configuration object. If the function returns `false`, the\nunknown option is not added to `argv`.\n\n# install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install minimist\n```\n\n# license\n\nMIT\n\n[package-url]: https://npmjs.org/package/minimist\n[npm-version-svg]: https://versionbadg.es/minimistjs/minimist.svg\n[npm-badge-png]: https://nodei.co/npm/minimist.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/minimist.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/minimist.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=minimist\n[codecov-image]: https://codecov.io/gh/minimistjs/minimist/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/minimistjs/minimist/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/minimistjs/minimist\n[actions-url]: https://github.com/minimistjs/minimist/actions\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/example/parse.js",
    "content": "'use strict';\n\nvar argv = require('../')(process.argv.slice(2));\nconsole.log(argv);\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/index.js",
    "content": "'use strict';\n\nfunction hasKey(obj, keys) {\n\tvar o = obj;\n\tkeys.slice(0, -1).forEach(function (key) {\n\t\to = o[key] || {};\n\t});\n\n\tvar key = keys[keys.length - 1];\n\treturn key in o;\n}\n\nfunction isNumber(x) {\n\tif (typeof x === 'number') { return true; }\n\tif ((/^0x[0-9a-f]+$/i).test(x)) { return true; }\n\treturn (/^[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(e[-+]?\\d+)?$/).test(x);\n}\n\nfunction isConstructorOrProto(obj, key) {\n\treturn (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';\n}\n\nmodule.exports = function (args, opts) {\n\tif (!opts) { opts = {}; }\n\n\tvar flags = {\n\t\tbools: {},\n\t\tstrings: {},\n\t\tunknownFn: null,\n\t};\n\n\tif (typeof opts.unknown === 'function') {\n\t\tflags.unknownFn = opts.unknown;\n\t}\n\n\tif (typeof opts.boolean === 'boolean' && opts.boolean) {\n\t\tflags.allBools = true;\n\t} else {\n\t\t[].concat(opts.boolean).filter(Boolean).forEach(function (key) {\n\t\t\tflags.bools[key] = true;\n\t\t});\n\t}\n\n\tvar aliases = {};\n\n\tfunction aliasIsBoolean(key) {\n\t\treturn aliases[key].some(function (x) {\n\t\t\treturn flags.bools[x];\n\t\t});\n\t}\n\n\tObject.keys(opts.alias || {}).forEach(function (key) {\n\t\taliases[key] = [].concat(opts.alias[key]);\n\t\taliases[key].forEach(function (x) {\n\t\t\taliases[x] = [key].concat(aliases[key].filter(function (y) {\n\t\t\t\treturn x !== y;\n\t\t\t}));\n\t\t});\n\t});\n\n\t[].concat(opts.string).filter(Boolean).forEach(function (key) {\n\t\tflags.strings[key] = true;\n\t\tif (aliases[key]) {\n\t\t\t[].concat(aliases[key]).forEach(function (k) {\n\t\t\t\tflags.strings[k] = true;\n\t\t\t});\n\t\t}\n\t});\n\n\tvar defaults = opts.default || {};\n\n\tvar argv = { _: [] };\n\n\tfunction argDefined(key, arg) {\n\t\treturn (flags.allBools && (/^--[^=]+$/).test(arg))\n\t\t\t|| flags.strings[key]\n\t\t\t|| flags.bools[key]\n\t\t\t|| aliases[key];\n\t}\n\n\tfunction setKey(obj, keys, value) {\n\t\tvar o = obj;\n\t\tfor (var i = 0; i < keys.length - 1; i++) {\n\t\t\tvar key = keys[i];\n\t\t\tif (isConstructorOrProto(o, key)) { return; }\n\t\t\tif (o[key] === undefined) { o[key] = {}; }\n\t\t\tif (\n\t\t\t\to[key] === Object.prototype\n\t\t\t\t|| o[key] === Number.prototype\n\t\t\t\t|| o[key] === String.prototype\n\t\t\t) {\n\t\t\t\to[key] = {};\n\t\t\t}\n\t\t\tif (o[key] === Array.prototype) { o[key] = []; }\n\t\t\to = o[key];\n\t\t}\n\n\t\tvar lastKey = keys[keys.length - 1];\n\t\tif (isConstructorOrProto(o, lastKey)) { return; }\n\t\tif (\n\t\t\to === Object.prototype\n\t\t\t|| o === Number.prototype\n\t\t\t|| o === String.prototype\n\t\t) {\n\t\t\to = {};\n\t\t}\n\t\tif (o === Array.prototype) { o = []; }\n\t\tif (o[lastKey] === undefined || flags.bools[lastKey] || typeof o[lastKey] === 'boolean') {\n\t\t\to[lastKey] = value;\n\t\t} else if (Array.isArray(o[lastKey])) {\n\t\t\to[lastKey].push(value);\n\t\t} else {\n\t\t\to[lastKey] = [o[lastKey], value];\n\t\t}\n\t}\n\n\tfunction setArg(key, val, arg) {\n\t\tif (arg && flags.unknownFn && !argDefined(key, arg)) {\n\t\t\tif (flags.unknownFn(arg) === false) { return; }\n\t\t}\n\n\t\tvar value = !flags.strings[key] && isNumber(val)\n\t\t\t? Number(val)\n\t\t\t: val;\n\t\tsetKey(argv, key.split('.'), value);\n\n\t\t(aliases[key] || []).forEach(function (x) {\n\t\t\tsetKey(argv, x.split('.'), value);\n\t\t});\n\t}\n\n\tObject.keys(flags.bools).forEach(function (key) {\n\t\tsetArg(key, defaults[key] === undefined ? false : defaults[key]);\n\t});\n\n\tvar notFlags = [];\n\n\tif (args.indexOf('--') !== -1) {\n\t\tnotFlags = args.slice(args.indexOf('--') + 1);\n\t\targs = args.slice(0, args.indexOf('--'));\n\t}\n\n\tfor (var i = 0; i < args.length; i++) {\n\t\tvar arg = args[i];\n\t\tvar key;\n\t\tvar next;\n\n\t\tif ((/^--.+=/).test(arg)) {\n\t\t\t// Using [\\s\\S] instead of . because js doesn't support the\n\t\t\t// 'dotall' regex modifier. See:\n\t\t\t// http://stackoverflow.com/a/1068308/13216\n\t\t\tvar m = arg.match(/^--([^=]+)=([\\s\\S]*)$/);\n\t\t\tkey = m[1];\n\t\t\tvar value = m[2];\n\t\t\tif (flags.bools[key]) {\n\t\t\t\tvalue = value !== 'false';\n\t\t\t}\n\t\t\tsetArg(key, value, arg);\n\t\t} else if ((/^--no-.+/).test(arg)) {\n\t\t\tkey = arg.match(/^--no-(.+)/)[1];\n\t\t\tsetArg(key, false, arg);\n\t\t} else if ((/^--.+/).test(arg)) {\n\t\t\tkey = arg.match(/^--(.+)/)[1];\n\t\t\tnext = args[i + 1];\n\t\t\tif (\n\t\t\t\tnext !== undefined\n\t\t\t\t&& !(/^(-|--)[^-]/).test(next)\n\t\t\t\t&& !flags.bools[key]\n\t\t\t\t&& !flags.allBools\n\t\t\t\t&& (aliases[key] ? !aliasIsBoolean(key) : true)\n\t\t\t) {\n\t\t\t\tsetArg(key, next, arg);\n\t\t\t\ti += 1;\n\t\t\t} else if ((/^(true|false)$/).test(next)) {\n\t\t\t\tsetArg(key, next === 'true', arg);\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tsetArg(key, flags.strings[key] ? '' : true, arg);\n\t\t\t}\n\t\t} else if ((/^-[^-]+/).test(arg)) {\n\t\t\tvar letters = arg.slice(1, -1).split('');\n\n\t\t\tvar broken = false;\n\t\t\tfor (var j = 0; j < letters.length; j++) {\n\t\t\t\tnext = arg.slice(j + 2);\n\n\t\t\t\tif (next === '-') {\n\t\t\t\t\tsetArg(letters[j], next, arg);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ((/[A-Za-z]/).test(letters[j]) && next[0] === '=') {\n\t\t\t\t\tsetArg(letters[j], next.slice(1), arg);\n\t\t\t\t\tbroken = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(/[A-Za-z]/).test(letters[j])\n\t\t\t\t\t&& (/-?\\d+(\\.\\d*)?(e-?\\d+)?$/).test(next)\n\t\t\t\t) {\n\t\t\t\t\tsetArg(letters[j], next, arg);\n\t\t\t\t\tbroken = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (letters[j + 1] && letters[j + 1].match(/\\W/)) {\n\t\t\t\t\tsetArg(letters[j], arg.slice(j + 2), arg);\n\t\t\t\t\tbroken = true;\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tsetArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tkey = arg.slice(-1)[0];\n\t\t\tif (!broken && key !== '-') {\n\t\t\t\tif (\n\t\t\t\t\targs[i + 1]\n\t\t\t\t\t&& !(/^(-|--)[^-]/).test(args[i + 1])\n\t\t\t\t\t&& !flags.bools[key]\n\t\t\t\t\t&& (aliases[key] ? !aliasIsBoolean(key) : true)\n\t\t\t\t) {\n\t\t\t\t\tsetArg(key, args[i + 1], arg);\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (args[i + 1] && (/^(true|false)$/).test(args[i + 1])) {\n\t\t\t\t\tsetArg(key, args[i + 1] === 'true', arg);\n\t\t\t\t\ti += 1;\n\t\t\t\t} else {\n\t\t\t\t\tsetArg(key, flags.strings[key] ? '' : true, arg);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (!flags.unknownFn || flags.unknownFn(arg) !== false) {\n\t\t\t\targv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg));\n\t\t\t}\n\t\t\tif (opts.stopEarly) {\n\t\t\t\targv._.push.apply(argv._, args.slice(i + 1));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tObject.keys(defaults).forEach(function (k) {\n\t\tif (!hasKey(argv, k.split('.'))) {\n\t\t\tsetKey(argv, k.split('.'), defaults[k]);\n\n\t\t\t(aliases[k] || []).forEach(function (x) {\n\t\t\t\tsetKey(argv, x.split('.'), defaults[k]);\n\t\t\t});\n\t\t}\n\t});\n\n\tif (opts['--']) {\n\t\targv['--'] = notFlags.slice();\n\t} else {\n\t\tnotFlags.forEach(function (k) {\n\t\t\targv._.push(k);\n\t\t});\n\t}\n\n\treturn argv;\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/package.json",
    "content": "{\n\t\"name\": \"minimist\",\n\t\"version\": \"1.2.8\",\n\t\"description\": \"parse argument options\",\n\t\"main\": \"index.js\",\n\t\"devDependencies\": {\n\t\t\"@ljharb/eslint-config\": \"^21.0.1\",\n\t\t\"aud\": \"^2.0.2\",\n\t\t\"auto-changelog\": \"^2.4.0\",\n\t\t\"eslint\": \"=8.8.0\",\n\t\t\"in-publish\": \"^2.0.1\",\n\t\t\"npmignore\": \"^0.3.0\",\n\t\t\"nyc\": \"^10.3.2\",\n\t\t\"safe-publish-latest\": \"^2.0.0\",\n\t\t\"tape\": \"^5.6.3\"\n\t},\n\t\"scripts\": {\n\t\t\"prepack\": \"npmignore --auto --commentLines=auto\",\n\t\t\"prepublishOnly\": \"safe-publish-latest\",\n\t\t\"prepublish\": \"not-in-publish || npm run prepublishOnly\",\n\t\t\"lint\": \"eslint --ext=js,mjs .\",\n\t\t\"pretest\": \"npm run lint\",\n\t\t\"tests-only\": \"nyc tape 'test/**/*.js'\",\n\t\t\"test\": \"npm run tests-only\",\n\t\t\"posttest\": \"aud --production\",\n\t\t\"version\": \"auto-changelog && git add CHANGELOG.md\",\n\t\t\"postversion\": \"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \\\"v$(node -e \\\"console.log(require('./package.json').version)\\\")\\\"\"\n\t},\n\t\"testling\": {\n\t\t\"files\": \"test/*.js\",\n\t\t\"browsers\": [\n\t\t\t\"ie/6..latest\",\n\t\t\t\"ff/5\",\n\t\t\t\"firefox/latest\",\n\t\t\t\"chrome/10\",\n\t\t\t\"chrome/latest\",\n\t\t\t\"safari/5.1\",\n\t\t\t\"safari/latest\",\n\t\t\t\"opera/12\"\n\t\t]\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git://github.com/minimistjs/minimist.git\"\n\t},\n\t\"homepage\": \"https://github.com/minimistjs/minimist\",\n\t\"keywords\": [\n\t\t\"argv\",\n\t\t\"getopt\",\n\t\t\"parser\",\n\t\t\"optimist\"\n\t],\n\t\"author\": {\n\t\t\"name\": \"James Halliday\",\n\t\t\"email\": \"mail@substack.net\",\n\t\t\"url\": \"http://substack.net\"\n\t},\n\t\"funding\": {\n\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t},\n\t\"license\": \"MIT\",\n\t\"auto-changelog\": {\n\t\t\"output\": \"CHANGELOG.md\",\n\t\t\"template\": \"keepachangelog\",\n\t\t\"unreleased\": false,\n\t\t\"commitLimit\": false,\n\t\t\"backfillLimit\": false,\n\t\t\"hideCredit\": true\n\t},\n\t\"publishConfig\": {\n\t\t\"ignore\": [\n\t\t\t\".github/workflows\"\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/all_bool.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('flag boolean true (default all --args to boolean)', function (t) {\n\tvar argv = parse(['moo', '--honk', 'cow'], {\n\t\tboolean: true,\n\t});\n\n\tt.deepEqual(argv, {\n\t\thonk: true,\n\t\t_: ['moo', 'cow'],\n\t});\n\n\tt.deepEqual(typeof argv.honk, 'boolean');\n\tt.end();\n});\n\ntest('flag boolean true only affects double hyphen arguments without equals signs', function (t) {\n\tvar argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], {\n\t\tboolean: true,\n\t});\n\n\tt.deepEqual(argv, {\n\t\thonk: true,\n\t\ttacos: 'good',\n\t\tp: 55,\n\t\t_: ['moo', 'cow'],\n\t});\n\n\tt.deepEqual(typeof argv.honk, 'boolean');\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/bool.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('flag boolean default false', function (t) {\n\tvar argv = parse(['moo'], {\n\t\tboolean: ['t', 'verbose'],\n\t\tdefault: { verbose: false, t: false },\n\t});\n\n\tt.deepEqual(argv, {\n\t\tverbose: false,\n\t\tt: false,\n\t\t_: ['moo'],\n\t});\n\n\tt.deepEqual(typeof argv.verbose, 'boolean');\n\tt.deepEqual(typeof argv.t, 'boolean');\n\tt.end();\n\n});\n\ntest('boolean groups', function (t) {\n\tvar argv = parse(['-x', '-z', 'one', 'two', 'three'], {\n\t\tboolean: ['x', 'y', 'z'],\n\t});\n\n\tt.deepEqual(argv, {\n\t\tx: true,\n\t\ty: false,\n\t\tz: true,\n\t\t_: ['one', 'two', 'three'],\n\t});\n\n\tt.deepEqual(typeof argv.x, 'boolean');\n\tt.deepEqual(typeof argv.y, 'boolean');\n\tt.deepEqual(typeof argv.z, 'boolean');\n\tt.end();\n});\ntest('boolean and alias with chainable api', function (t) {\n\tvar aliased = ['-h', 'derp'];\n\tvar regular = ['--herp', 'derp'];\n\tvar aliasedArgv = parse(aliased, {\n\t\tboolean: 'herp',\n\t\talias: { h: 'herp' },\n\t});\n\tvar propertyArgv = parse(regular, {\n\t\tboolean: 'herp',\n\t\talias: { h: 'herp' },\n\t});\n\tvar expected = {\n\t\therp: true,\n\t\th: true,\n\t\t_: ['derp'],\n\t};\n\n\tt.same(aliasedArgv, expected);\n\tt.same(propertyArgv, expected);\n\tt.end();\n});\n\ntest('boolean and alias with options hash', function (t) {\n\tvar aliased = ['-h', 'derp'];\n\tvar regular = ['--herp', 'derp'];\n\tvar opts = {\n\t\talias: { h: 'herp' },\n\t\tboolean: 'herp',\n\t};\n\tvar aliasedArgv = parse(aliased, opts);\n\tvar propertyArgv = parse(regular, opts);\n\tvar expected = {\n\t\therp: true,\n\t\th: true,\n\t\t_: ['derp'],\n\t};\n\tt.same(aliasedArgv, expected);\n\tt.same(propertyArgv, expected);\n\tt.end();\n});\n\ntest('boolean and alias array with options hash', function (t) {\n\tvar aliased = ['-h', 'derp'];\n\tvar regular = ['--herp', 'derp'];\n\tvar alt = ['--harp', 'derp'];\n\tvar opts = {\n\t\talias: { h: ['herp', 'harp'] },\n\t\tboolean: 'h',\n\t};\n\tvar aliasedArgv = parse(aliased, opts);\n\tvar propertyArgv = parse(regular, opts);\n\tvar altPropertyArgv = parse(alt, opts);\n\tvar expected = {\n\t\tharp: true,\n\t\therp: true,\n\t\th: true,\n\t\t_: ['derp'],\n\t};\n\tt.same(aliasedArgv, expected);\n\tt.same(propertyArgv, expected);\n\tt.same(altPropertyArgv, expected);\n\tt.end();\n});\n\ntest('boolean and alias using explicit true', function (t) {\n\tvar aliased = ['-h', 'true'];\n\tvar regular = ['--herp', 'true'];\n\tvar opts = {\n\t\talias: { h: 'herp' },\n\t\tboolean: 'h',\n\t};\n\tvar aliasedArgv = parse(aliased, opts);\n\tvar propertyArgv = parse(regular, opts);\n\tvar expected = {\n\t\therp: true,\n\t\th: true,\n\t\t_: [],\n\t};\n\n\tt.same(aliasedArgv, expected);\n\tt.same(propertyArgv, expected);\n\tt.end();\n});\n\n// regression, see https://github.com/substack/node-optimist/issues/71\ntest('boolean and --x=true', function (t) {\n\tvar parsed = parse(['--boool', '--other=true'], {\n\t\tboolean: 'boool',\n\t});\n\n\tt.same(parsed.boool, true);\n\tt.same(parsed.other, 'true');\n\n\tparsed = parse(['--boool', '--other=false'], {\n\t\tboolean: 'boool',\n\t});\n\n\tt.same(parsed.boool, true);\n\tt.same(parsed.other, 'false');\n\tt.end();\n});\n\ntest('boolean --boool=true', function (t) {\n\tvar parsed = parse(['--boool=true'], {\n\t\tdefault: {\n\t\t\tboool: false,\n\t\t},\n\t\tboolean: ['boool'],\n\t});\n\n\tt.same(parsed.boool, true);\n\tt.end();\n});\n\ntest('boolean --boool=false', function (t) {\n\tvar parsed = parse(['--boool=false'], {\n\t\tdefault: {\n\t\t\tboool: true,\n\t\t},\n\t\tboolean: ['boool'],\n\t});\n\n\tt.same(parsed.boool, false);\n\tt.end();\n});\n\ntest('boolean using something similar to true', function (t) {\n\tvar opts = { boolean: 'h' };\n\tvar result = parse(['-h', 'true.txt'], opts);\n\tvar expected = {\n\t\th: true,\n\t\t_: ['true.txt'],\n\t};\n\n\tt.same(result, expected);\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/dash.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('-', function (t) {\n\tt.plan(6);\n\tt.deepEqual(parse(['-n', '-']), { n: '-', _: [] });\n\tt.deepEqual(parse(['--nnn', '-']), { nnn: '-', _: [] });\n\tt.deepEqual(parse(['-']), { _: ['-'] });\n\tt.deepEqual(parse(['-f-']), { f: '-', _: [] });\n\tt.deepEqual(\n\t\tparse(['-b', '-'], { boolean: 'b' }),\n\t\t{ b: true, _: ['-'] }\n\t);\n\tt.deepEqual(\n\t\tparse(['-s', '-'], { string: 's' }),\n\t\t{ s: '-', _: [] }\n\t);\n});\n\ntest('-a -- b', function (t) {\n\tt.plan(2);\n\tt.deepEqual(parse(['-a', '--', 'b']), { a: true, _: ['b'] });\n\tt.deepEqual(parse(['--a', '--', 'b']), { a: true, _: ['b'] });\n});\n\ntest('move arguments after the -- into their own `--` array', function (t) {\n\tt.plan(1);\n\tt.deepEqual(\n\t\tparse(['--name', 'John', 'before', '--', 'after'], { '--': true }),\n\t\t{ name: 'John', _: ['before'], '--': ['after'] }\n\t);\n});\n\ntest('--- option value', function (t) {\n\t// A multi-dash value is largely an edge case, but check the behaviour is as expected,\n\t// and in particular the same for short option and long option (as made consistent in Jan 2023).\n\tt.plan(2);\n\tt.deepEqual(parse(['-n', '---']), { n: '---', _: [] });\n\tt.deepEqual(parse(['--nnn', '---']), { nnn: '---', _: [] });\n});\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/default_bool.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar parse = require('../');\n\ntest('boolean default true', function (t) {\n\tvar argv = parse([], {\n\t\tboolean: 'sometrue',\n\t\tdefault: { sometrue: true },\n\t});\n\tt.equal(argv.sometrue, true);\n\tt.end();\n});\n\ntest('boolean default false', function (t) {\n\tvar argv = parse([], {\n\t\tboolean: 'somefalse',\n\t\tdefault: { somefalse: false },\n\t});\n\tt.equal(argv.somefalse, false);\n\tt.end();\n});\n\ntest('boolean default to null', function (t) {\n\tvar argv = parse([], {\n\t\tboolean: 'maybe',\n\t\tdefault: { maybe: null },\n\t});\n\tt.equal(argv.maybe, null);\n\n\tvar argvLong = parse(['--maybe'], {\n\t\tboolean: 'maybe',\n\t\tdefault: { maybe: null },\n\t});\n\tt.equal(argvLong.maybe, true);\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/dotted.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('dotted alias', function (t) {\n\tvar argv = parse(['--a.b', '22'], { default: { 'a.b': 11 }, alias: { 'a.b': 'aa.bb' } });\n\tt.equal(argv.a.b, 22);\n\tt.equal(argv.aa.bb, 22);\n\tt.end();\n});\n\ntest('dotted default', function (t) {\n\tvar argv = parse('', { default: { 'a.b': 11 }, alias: { 'a.b': 'aa.bb' } });\n\tt.equal(argv.a.b, 11);\n\tt.equal(argv.aa.bb, 11);\n\tt.end();\n});\n\ntest('dotted default with no alias', function (t) {\n\tvar argv = parse('', { default: { 'a.b': 11 } });\n\tt.equal(argv.a.b, 11);\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/kv_short.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('short -k=v', function (t) {\n\tt.plan(1);\n\n\tvar argv = parse(['-b=123']);\n\tt.deepEqual(argv, { b: 123, _: [] });\n});\n\ntest('multi short -k=v', function (t) {\n\tt.plan(1);\n\n\tvar argv = parse(['-a=whatever', '-b=robots']);\n\tt.deepEqual(argv, { a: 'whatever', b: 'robots', _: [] });\n});\n\ntest('short with embedded equals -k=a=b', function (t) {\n\tt.plan(1);\n\n\tvar argv = parse(['-k=a=b']);\n\tt.deepEqual(argv, { k: 'a=b', _: [] });\n});\n\ntest('short with later equals like -ab=c', function (t) {\n\tt.plan(1);\n\n\tvar argv = parse(['-ab=c']);\n\tt.deepEqual(argv, { a: true, b: 'c', _: [] });\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/long.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar parse = require('../');\n\ntest('long opts', function (t) {\n\tt.deepEqual(\n\t\tparse(['--bool']),\n\t\t{ bool: true, _: [] },\n\t\t'long boolean'\n\t);\n\tt.deepEqual(\n\t\tparse(['--pow', 'xixxle']),\n\t\t{ pow: 'xixxle', _: [] },\n\t\t'long capture sp'\n\t);\n\tt.deepEqual(\n\t\tparse(['--pow=xixxle']),\n\t\t{ pow: 'xixxle', _: [] },\n\t\t'long capture eq'\n\t);\n\tt.deepEqual(\n\t\tparse(['--host', 'localhost', '--port', '555']),\n\t\t{ host: 'localhost', port: 555, _: [] },\n\t\t'long captures sp'\n\t);\n\tt.deepEqual(\n\t\tparse(['--host=localhost', '--port=555']),\n\t\t{ host: 'localhost', port: 555, _: [] },\n\t\t'long captures eq'\n\t);\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/num.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('nums', function (t) {\n\tvar argv = parse([\n\t\t'-x', '1234',\n\t\t'-y', '5.67',\n\t\t'-z', '1e7',\n\t\t'-w', '10f',\n\t\t'--hex', '0xdeadbeef',\n\t\t'789',\n\t]);\n\tt.deepEqual(argv, {\n\t\tx: 1234,\n\t\ty: 5.67,\n\t\tz: 1e7,\n\t\tw: '10f',\n\t\thex: 0xdeadbeef,\n\t\t_: [789],\n\t});\n\tt.deepEqual(typeof argv.x, 'number');\n\tt.deepEqual(typeof argv.y, 'number');\n\tt.deepEqual(typeof argv.z, 'number');\n\tt.deepEqual(typeof argv.w, 'string');\n\tt.deepEqual(typeof argv.hex, 'number');\n\tt.deepEqual(typeof argv._[0], 'number');\n\tt.end();\n});\n\ntest('already a number', function (t) {\n\tvar argv = parse(['-x', 1234, 789]);\n\tt.deepEqual(argv, { x: 1234, _: [789] });\n\tt.deepEqual(typeof argv.x, 'number');\n\tt.deepEqual(typeof argv._[0], 'number');\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/parse.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('parse args', function (t) {\n\tt.deepEqual(\n\t\tparse(['--no-moo']),\n\t\t{ moo: false, _: [] },\n\t\t'no'\n\t);\n\tt.deepEqual(\n\t\tparse(['-v', 'a', '-v', 'b', '-v', 'c']),\n\t\t{ v: ['a', 'b', 'c'], _: [] },\n\t\t'multi'\n\t);\n\tt.end();\n});\n\ntest('comprehensive', function (t) {\n\tt.deepEqual(\n\t\tparse([\n\t\t\t'--name=meowmers', 'bare', '-cats', 'woo',\n\t\t\t'-h', 'awesome', '--multi=quux',\n\t\t\t'--key', 'value',\n\t\t\t'-b', '--bool', '--no-meep', '--multi=baz',\n\t\t\t'--', '--not-a-flag', 'eek',\n\t\t]),\n\t\t{\n\t\t\tc: true,\n\t\t\ta: true,\n\t\t\tt: true,\n\t\t\ts: 'woo',\n\t\t\th: 'awesome',\n\t\t\tb: true,\n\t\t\tbool: true,\n\t\t\tkey: 'value',\n\t\t\tmulti: ['quux', 'baz'],\n\t\t\tmeep: false,\n\t\t\tname: 'meowmers',\n\t\t\t_: ['bare', '--not-a-flag', 'eek'],\n\t\t}\n\t);\n\tt.end();\n});\n\ntest('flag boolean', function (t) {\n\tvar argv = parse(['-t', 'moo'], { boolean: 't' });\n\tt.deepEqual(argv, { t: true, _: ['moo'] });\n\tt.deepEqual(typeof argv.t, 'boolean');\n\tt.end();\n});\n\ntest('flag boolean value', function (t) {\n\tvar argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {\n\t\tboolean: ['t', 'verbose'],\n\t\tdefault: { verbose: true },\n\t});\n\n\tt.deepEqual(argv, {\n\t\tverbose: false,\n\t\tt: true,\n\t\t_: ['moo'],\n\t});\n\n\tt.deepEqual(typeof argv.verbose, 'boolean');\n\tt.deepEqual(typeof argv.t, 'boolean');\n\tt.end();\n});\n\ntest('newlines in params', function (t) {\n\tvar args = parse(['-s', 'X\\nX']);\n\tt.deepEqual(args, { _: [], s: 'X\\nX' });\n\n\t// reproduce in bash:\n\t// VALUE=\"new\n\t// line\"\n\t// node program.js --s=\"$VALUE\"\n\targs = parse(['--s=X\\nX']);\n\tt.deepEqual(args, { _: [], s: 'X\\nX' });\n\tt.end();\n});\n\ntest('strings', function (t) {\n\tvar s = parse(['-s', '0001234'], { string: 's' }).s;\n\tt.equal(s, '0001234');\n\tt.equal(typeof s, 'string');\n\n\tvar x = parse(['-x', '56'], { string: 'x' }).x;\n\tt.equal(x, '56');\n\tt.equal(typeof x, 'string');\n\tt.end();\n});\n\ntest('stringArgs', function (t) {\n\tvar s = parse(['  ', '  '], { string: '_' })._;\n\tt.same(s.length, 2);\n\tt.same(typeof s[0], 'string');\n\tt.same(s[0], '  ');\n\tt.same(typeof s[1], 'string');\n\tt.same(s[1], '  ');\n\tt.end();\n});\n\ntest('empty strings', function (t) {\n\tvar s = parse(['-s'], { string: 's' }).s;\n\tt.equal(s, '');\n\tt.equal(typeof s, 'string');\n\n\tvar str = parse(['--str'], { string: 'str' }).str;\n\tt.equal(str, '');\n\tt.equal(typeof str, 'string');\n\n\tvar letters = parse(['-art'], {\n\t\tstring: ['a', 't'],\n\t});\n\n\tt.equal(letters.a, '');\n\tt.equal(letters.r, true);\n\tt.equal(letters.t, '');\n\n\tt.end();\n});\n\ntest('string and alias', function (t) {\n\tvar x = parse(['--str', '000123'], {\n\t\tstring: 's',\n\t\talias: { s: 'str' },\n\t});\n\n\tt.equal(x.str, '000123');\n\tt.equal(typeof x.str, 'string');\n\tt.equal(x.s, '000123');\n\tt.equal(typeof x.s, 'string');\n\n\tvar y = parse(['-s', '000123'], {\n\t\tstring: 'str',\n\t\talias: { str: 's' },\n\t});\n\n\tt.equal(y.str, '000123');\n\tt.equal(typeof y.str, 'string');\n\tt.equal(y.s, '000123');\n\tt.equal(typeof y.s, 'string');\n\n\tvar z = parse(['-s123'], {\n\t\talias: { str: ['s', 'S'] },\n\t\tstring: ['str'],\n\t});\n\n\tt.deepEqual(\n\t\tz,\n\t\t{ _: [], s: '123', S: '123', str: '123' },\n\t\t'opt.string works with multiple aliases'\n\t);\n\tt.end();\n});\n\ntest('slashBreak', function (t) {\n\tt.same(\n\t\tparse(['-I/foo/bar/baz']),\n\t\t{ I: '/foo/bar/baz', _: [] }\n\t);\n\tt.same(\n\t\tparse(['-xyz/foo/bar/baz']),\n\t\t{ x: true, y: true, z: '/foo/bar/baz', _: [] }\n\t);\n\tt.end();\n});\n\ntest('alias', function (t) {\n\tvar argv = parse(['-f', '11', '--zoom', '55'], {\n\t\talias: { z: 'zoom' },\n\t});\n\tt.equal(argv.zoom, 55);\n\tt.equal(argv.z, argv.zoom);\n\tt.equal(argv.f, 11);\n\tt.end();\n});\n\ntest('multiAlias', function (t) {\n\tvar argv = parse(['-f', '11', '--zoom', '55'], {\n\t\talias: { z: ['zm', 'zoom'] },\n\t});\n\tt.equal(argv.zoom, 55);\n\tt.equal(argv.z, argv.zoom);\n\tt.equal(argv.z, argv.zm);\n\tt.equal(argv.f, 11);\n\tt.end();\n});\n\ntest('nested dotted objects', function (t) {\n\tvar argv = parse([\n\t\t'--foo.bar', '3', '--foo.baz', '4',\n\t\t'--foo.quux.quibble', '5', '--foo.quux.o_O',\n\t\t'--beep.boop',\n\t]);\n\n\tt.same(argv.foo, {\n\t\tbar: 3,\n\t\tbaz: 4,\n\t\tquux: {\n\t\t\tquibble: 5,\n\t\t\to_O: true,\n\t\t},\n\t});\n\tt.same(argv.beep, { boop: true });\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/parse_modified.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('parse with modifier functions', function (t) {\n\tt.plan(1);\n\n\tvar argv = parse(['-b', '123'], { boolean: 'b' });\n\tt.deepEqual(argv, { b: true, _: [123] });\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/proto.js",
    "content": "'use strict';\n\n/* eslint no-proto: 0 */\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('proto pollution', function (t) {\n\tvar argv = parse(['--__proto__.x', '123']);\n\tt.equal({}.x, undefined);\n\tt.equal(argv.__proto__.x, undefined);\n\tt.equal(argv.x, undefined);\n\tt.end();\n});\n\ntest('proto pollution (array)', function (t) {\n\tvar argv = parse(['--x', '4', '--x', '5', '--x.__proto__.z', '789']);\n\tt.equal({}.z, undefined);\n\tt.deepEqual(argv.x, [4, 5]);\n\tt.equal(argv.x.z, undefined);\n\tt.equal(argv.x.__proto__.z, undefined);\n\tt.end();\n});\n\ntest('proto pollution (number)', function (t) {\n\tvar argv = parse(['--x', '5', '--x.__proto__.z', '100']);\n\tt.equal({}.z, undefined);\n\tt.equal((4).z, undefined);\n\tt.equal(argv.x, 5);\n\tt.equal(argv.x.z, undefined);\n\tt.end();\n});\n\ntest('proto pollution (string)', function (t) {\n\tvar argv = parse(['--x', 'abc', '--x.__proto__.z', 'def']);\n\tt.equal({}.z, undefined);\n\tt.equal('...'.z, undefined);\n\tt.equal(argv.x, 'abc');\n\tt.equal(argv.x.z, undefined);\n\tt.end();\n});\n\ntest('proto pollution (constructor)', function (t) {\n\tvar argv = parse(['--constructor.prototype.y', '123']);\n\tt.equal({}.y, undefined);\n\tt.equal(argv.y, undefined);\n\tt.end();\n});\n\ntest('proto pollution (constructor function)', function (t) {\n\tvar argv = parse(['--_.concat.constructor.prototype.y', '123']);\n\tfunction fnToBeTested() {}\n\tt.equal(fnToBeTested.y, undefined);\n\tt.equal(argv.y, undefined);\n\tt.end();\n});\n\n// powered by snyk - https://github.com/backstage/backstage/issues/10343\ntest('proto pollution (constructor function) snyk', function (t) {\n\tvar argv = parse('--_.constructor.constructor.prototype.foo bar'.split(' '));\n\tt.equal(function () {}.foo, undefined);\n\tt.equal(argv.y, undefined);\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/short.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('numeric short args', function (t) {\n\tt.plan(2);\n\tt.deepEqual(parse(['-n123']), { n: 123, _: [] });\n\tt.deepEqual(\n\t\tparse(['-123', '456']),\n\t\t{ 1: true, 2: true, 3: 456, _: [] }\n\t);\n});\n\ntest('short', function (t) {\n\tt.deepEqual(\n\t\tparse(['-b']),\n\t\t{ b: true, _: [] },\n\t\t'short boolean'\n\t);\n\tt.deepEqual(\n\t\tparse(['foo', 'bar', 'baz']),\n\t\t{ _: ['foo', 'bar', 'baz'] },\n\t\t'bare'\n\t);\n\tt.deepEqual(\n\t\tparse(['-cats']),\n\t\t{ c: true, a: true, t: true, s: true, _: [] },\n\t\t'group'\n\t);\n\tt.deepEqual(\n\t\tparse(['-cats', 'meow']),\n\t\t{ c: true, a: true, t: true, s: 'meow', _: [] },\n\t\t'short group next'\n\t);\n\tt.deepEqual(\n\t\tparse(['-h', 'localhost']),\n\t\t{ h: 'localhost', _: [] },\n\t\t'short capture'\n\t);\n\tt.deepEqual(\n\t\tparse(['-h', 'localhost', '-p', '555']),\n\t\t{ h: 'localhost', p: 555, _: [] },\n\t\t'short captures'\n\t);\n\tt.end();\n});\n\ntest('mixed short bool and capture', function (t) {\n\tt.same(\n\t\tparse(['-h', 'localhost', '-fp', '555', 'script.js']),\n\t\t{\n\t\t\tf: true, p: 555, h: 'localhost',\n\t\t\t_: ['script.js'],\n\t\t}\n\t);\n\tt.end();\n});\n\ntest('short and long', function (t) {\n\tt.deepEqual(\n\t\tparse(['-h', 'localhost', '-fp', '555', 'script.js']),\n\t\t{\n\t\t\tf: true, p: 555, h: 'localhost',\n\t\t\t_: ['script.js'],\n\t\t}\n\t);\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/stop_early.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('stops parsing on the first non-option when stopEarly is set', function (t) {\n\tvar argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], {\n\t\tstopEarly: true,\n\t});\n\n\tt.deepEqual(argv, {\n\t\taaa: 'bbb',\n\t\t_: ['ccc', '--ddd'],\n\t});\n\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/unknown.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('boolean and alias is not unknown', function (t) {\n\tvar unknown = [];\n\tfunction unknownFn(arg) {\n\t\tunknown.push(arg);\n\t\treturn false;\n\t}\n\tvar aliased = ['-h', 'true', '--derp', 'true'];\n\tvar regular = ['--herp', 'true', '-d', 'true'];\n\tvar opts = {\n\t\talias: { h: 'herp' },\n\t\tboolean: 'h',\n\t\tunknown: unknownFn,\n\t};\n\tparse(aliased, opts);\n\tparse(regular, opts);\n\n\tt.same(unknown, ['--derp', '-d']);\n\tt.end();\n});\n\ntest('flag boolean true any double hyphen argument is not unknown', function (t) {\n\tvar unknown = [];\n\tfunction unknownFn(arg) {\n\t\tunknown.push(arg);\n\t\treturn false;\n\t}\n\tvar argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], {\n\t\tboolean: true,\n\t\tunknown: unknownFn,\n\t});\n\tt.same(unknown, ['--tacos=good', 'cow', '-p']);\n\tt.same(argv, {\n\t\thonk: true,\n\t\t_: [],\n\t});\n\tt.end();\n});\n\ntest('string and alias is not unknown', function (t) {\n\tvar unknown = [];\n\tfunction unknownFn(arg) {\n\t\tunknown.push(arg);\n\t\treturn false;\n\t}\n\tvar aliased = ['-h', 'hello', '--derp', 'goodbye'];\n\tvar regular = ['--herp', 'hello', '-d', 'moon'];\n\tvar opts = {\n\t\talias: { h: 'herp' },\n\t\tstring: 'h',\n\t\tunknown: unknownFn,\n\t};\n\tparse(aliased, opts);\n\tparse(regular, opts);\n\n\tt.same(unknown, ['--derp', '-d']);\n\tt.end();\n});\n\ntest('default and alias is not unknown', function (t) {\n\tvar unknown = [];\n\tfunction unknownFn(arg) {\n\t\tunknown.push(arg);\n\t\treturn false;\n\t}\n\tvar aliased = ['-h', 'hello'];\n\tvar regular = ['--herp', 'hello'];\n\tvar opts = {\n\t\tdefault: { h: 'bar' },\n\t\talias: { h: 'herp' },\n\t\tunknown: unknownFn,\n\t};\n\tparse(aliased, opts);\n\tparse(regular, opts);\n\n\tt.same(unknown, []);\n\tt.end();\n\tunknownFn(); // exercise fn for 100% coverage\n});\n\ntest('value following -- is not unknown', function (t) {\n\tvar unknown = [];\n\tfunction unknownFn(arg) {\n\t\tunknown.push(arg);\n\t\treturn false;\n\t}\n\tvar aliased = ['--bad', '--', 'good', 'arg'];\n\tvar opts = {\n\t\t'--': true,\n\t\tunknown: unknownFn,\n\t};\n\tvar argv = parse(aliased, opts);\n\n\tt.same(unknown, ['--bad']);\n\tt.same(argv, {\n\t\t'--': ['good', 'arg'],\n\t\t_: [],\n\t});\n\tt.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/minimist/test/whitespace.js",
    "content": "'use strict';\n\nvar parse = require('../');\nvar test = require('tape');\n\ntest('whitespace should be whitespace', function (t) {\n\tt.plan(1);\n\tvar x = parse(['-x', '\\t']).x;\n\tt.equal(x, '\\t');\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mkdirp/LICENSE",
    "content": "Copyright 2010 James Halliday (mail@substack.net)\n\nThis project is free software released under the MIT/X11 license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mkdirp/bin/cmd.js",
    "content": "#!/usr/bin/env node\n\nvar mkdirp = require('../');\nvar minimist = require('minimist');\nvar fs = require('fs');\n\nvar argv = minimist(process.argv.slice(2), {\n    alias: { m: 'mode', h: 'help' },\n    string: [ 'mode' ]\n});\nif (argv.help) {\n    fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout);\n    return;\n}\n\nvar paths = argv._.slice();\nvar mode = argv.mode ? parseInt(argv.mode, 8) : undefined;\n\n(function next () {\n    if (paths.length === 0) return;\n    var p = paths.shift();\n    \n    if (mode === undefined) mkdirp(p, cb)\n    else mkdirp(p, mode, cb)\n    \n    function cb (err) {\n        if (err) {\n            console.error(err.message);\n            process.exit(1);\n        }\n        else next();\n    }\n})();\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mkdirp/bin/usage.txt",
    "content": "usage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n  Create each supplied directory including any necessary parent directories that\n  don't yet exist.\n  \n  If the directory already exists, do nothing.\n\nOPTIONS are:\n\n  -m, --mode   If a directory needs to be created, set the mode as an octal\n               permission string.\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mkdirp/index.js",
    "content": "var path = require('path');\nvar fs = require('fs');\nvar _0777 = parseInt('0777', 8);\n\nmodule.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;\n\nfunction mkdirP (p, opts, f, made) {\n    if (typeof opts === 'function') {\n        f = opts;\n        opts = {};\n    }\n    else if (!opts || typeof opts !== 'object') {\n        opts = { mode: opts };\n    }\n    \n    var mode = opts.mode;\n    var xfs = opts.fs || fs;\n    \n    if (mode === undefined) {\n        mode = _0777\n    }\n    if (!made) made = null;\n    \n    var cb = f || /* istanbul ignore next */ function () {};\n    p = path.resolve(p);\n    \n    xfs.mkdir(p, mode, function (er) {\n        if (!er) {\n            made = made || p;\n            return cb(null, made);\n        }\n        switch (er.code) {\n            case 'ENOENT':\n                /* istanbul ignore if */\n                if (path.dirname(p) === p) return cb(er);\n                mkdirP(path.dirname(p), opts, function (er, made) {\n                    /* istanbul ignore if */\n                    if (er) cb(er, made);\n                    else mkdirP(p, opts, cb, made);\n                });\n                break;\n\n            // In the case of any other error, just see if there's a dir\n            // there already.  If so, then hooray!  If not, then something\n            // is borked.\n            default:\n                xfs.stat(p, function (er2, stat) {\n                    // if the stat fails, then that's super weird.\n                    // let the original error be the failure reason.\n                    if (er2 || !stat.isDirectory()) cb(er, made)\n                    else cb(null, made);\n                });\n                break;\n        }\n    });\n}\n\nmkdirP.sync = function sync (p, opts, made) {\n    if (!opts || typeof opts !== 'object') {\n        opts = { mode: opts };\n    }\n    \n    var mode = opts.mode;\n    var xfs = opts.fs || fs;\n    \n    if (mode === undefined) {\n        mode = _0777\n    }\n    if (!made) made = null;\n\n    p = path.resolve(p);\n\n    try {\n        xfs.mkdirSync(p, mode);\n        made = made || p;\n    }\n    catch (err0) {\n        switch (err0.code) {\n            case 'ENOENT' :\n                made = sync(path.dirname(p), opts, made);\n                sync(p, opts, made);\n                break;\n\n            // In the case of any other error, just see if there's a dir\n            // there already.  If so, then hooray!  If not, then something\n            // is borked.\n            default:\n                var stat;\n                try {\n                    stat = xfs.statSync(p);\n                }\n                catch (err1) /* istanbul ignore next */ {\n                    throw err0;\n                }\n                /* istanbul ignore if */\n                if (!stat.isDirectory()) throw err0;\n                break;\n        }\n    }\n\n    return made;\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mkdirp/package.json",
    "content": "{\n  \"name\": \"mkdirp\",\n  \"description\": \"Recursively mkdir, like `mkdir -p`\",\n  \"version\": \"0.5.6\",\n  \"publishConfig\": {\n    \"tag\": \"legacy\"\n  },\n  \"author\": \"James Halliday <mail@substack.net> (http://substack.net)\",\n  \"main\": \"index.js\",\n  \"keywords\": [\n    \"mkdir\",\n    \"directory\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/substack/node-mkdirp.git\"\n  },\n  \"scripts\": {\n    \"test\": \"tap test/*.js\"\n  },\n  \"dependencies\": {\n    \"minimist\": \"^1.2.6\"\n  },\n  \"devDependencies\": {\n    \"tap\": \"^16.0.1\"\n  },\n  \"bin\": \"bin/cmd.js\",\n  \"license\": \"MIT\",\n  \"files\": [\n    \"bin\",\n    \"index.js\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/mkdirp/readme.markdown",
    "content": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n    \nmkdirp('/tmp/foo/bar/baz', function (err) {\n    if (err) console.error(err)\n    else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n  Create each supplied directory including any necessary parent directories that\n  don't yet exist.\n  \n  If the directory already exists, do nothing.\n\nOPTIONS are:\n\n  -m, --mode   If a directory needs to be created, set the mode as an octal\n               permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ms/index.js",
    "content": "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ms/license.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2020 Vercel, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ms/package.json",
    "content": "{\n  \"name\": \"ms\",\n  \"version\": \"2.1.3\",\n  \"description\": \"Tiny millisecond conversion utility\",\n  \"repository\": \"vercel/ms\",\n  \"main\": \"./index\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"precommit\": \"lint-staged\",\n    \"lint\": \"eslint lib/* bin/*\",\n    \"test\": \"mocha tests.js\"\n  },\n  \"eslintConfig\": {\n    \"extends\": \"eslint:recommended\",\n    \"env\": {\n      \"node\": true,\n      \"es6\": true\n    }\n  },\n  \"lint-staged\": {\n    \"*.js\": [\n      \"npm run lint\",\n      \"prettier --single-quote --write\",\n      \"git add\"\n    ]\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"eslint\": \"4.18.2\",\n    \"expect.js\": \"0.3.1\",\n    \"husky\": \"0.14.3\",\n    \"lint-staged\": \"5.0.0\",\n    \"mocha\": \"4.0.1\",\n    \"prettier\": \"2.0.5\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/ms/readme.md",
    "content": "# ms\n\n![CI](https://github.com/vercel/ms/workflows/CI/badge.svg)\n\nUse this package to easily convert various time formats to milliseconds.\n\n## Examples\n\n```js\nms('2 days')  // 172800000\nms('1d')      // 86400000\nms('10h')     // 36000000\nms('2.5 hrs') // 9000000\nms('2h')      // 7200000\nms('1m')      // 60000\nms('5s')      // 5000\nms('1y')      // 31557600000\nms('100')     // 100\nms('-3 days') // -259200000\nms('-1h')     // -3600000\nms('-200')    // -200\n```\n\n### Convert from Milliseconds\n\n```js\nms(60000)             // \"1m\"\nms(2 * 60000)         // \"2m\"\nms(-3 * 60000)        // \"-3m\"\nms(ms('10 hours'))    // \"10h\"\n```\n\n### Time Format Written-Out\n\n```js\nms(60000, { long: true })             // \"1 minute\"\nms(2 * 60000, { long: true })         // \"2 minutes\"\nms(-3 * 60000, { long: true })        // \"-3 minutes\"\nms(ms('10 hours'), { long: true })    // \"10 hours\"\n```\n\n## Features\n\n- Works both in [Node.js](https://nodejs.org) and in the browser\n- If a number is supplied to `ms`, a string with a unit is returned\n- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)\n- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned\n\n## Related Packages\n\n- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.\n\n## Caught a Bug?\n\n1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device\n2. Link the package to the global module directory: `npm link`\n3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!\n\nAs always, you can run the tests using: `npm test`\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/opener/LICENSE.txt",
    "content": "Dual licensed under WTFPL and MIT:\n\n---\n\nCopyright © 2012–2020 Domenic Denicola <d@domenic.me>\n\nThis work is free. You can redistribute it and/or modify it under the\nterms of the Do What The Fuck You Want To Public License, Version 2,\nas published by Sam Hocevar. See below for more details.\n\n        DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n                    Version 2, December 2004\n\n Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>\n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. You just DO WHAT THE FUCK YOU WANT TO.\n\n---\n\nThe MIT License (MIT)\n\nCopyright © 2012–2020 Domenic Denicola <d@domenic.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/opener/README.md",
    "content": "# It Opens Stuff\n\nThat is, in your desktop environment. This will make *actual windows pop up*, with stuff in them:\n\n```bash\nnpm install opener -g\n\nopener http://google.com\nopener ./my-file.txt\nopener firefox\nopener npm run lint\n```\n\nAlso if you want to use it programmatically you can do that too:\n\n```js\nvar opener = require(\"opener\");\n\nopener(\"http://google.com\");\nopener(\"./my-file.txt\");\nopener(\"firefox\");\nopener(\"npm run lint\");\n```\n\nPlus, it returns the child process created, so you can do things like let your script exit while the window stays open:\n\n```js\nvar editor = opener(\"documentation.odt\");\neditor.unref();\n// These other unrefs may be necessary if your OS's opener process\n// exits before the process it started is complete.\neditor.stdin.unref();\neditor.stdout.unref();\neditor.stderr.unref();\n```\n\n## Use It for Good\n\nLike opening the user's browser with a test harness in your package's test script:\n\n```json\n{\n    \"scripts\": {\n        \"test\": \"opener ./test/runner.html\"\n    },\n    \"devDependencies\": {\n        \"opener\": \"*\"\n    }\n}\n```\n\n## Why\n\nBecause Windows has `start`, Macs have `open`, and *nix has `xdg-open`. At least [according to some person on StackOverflow](http://stackoverflow.com/q/1480971/3191). And I like things that work on all three. Like Node.js. And Opener.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/opener/bin/opener-bin.js",
    "content": "#!/usr/bin/env node\n\"use strict\";\n\nvar opener = require(\"..\");\n\nopener(process.argv.slice(2), function (error) {\n    if (error) {\n        throw error;\n    }\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/opener/lib/opener.js",
    "content": "\"use strict\";\nvar childProcess = require(\"child_process\");\nvar os = require(\"os\");\n\nmodule.exports = function opener(args, options, callback) {\n    var platform = process.platform;\n\n    // Attempt to detect Windows Subystem for Linux (WSL). WSL  itself as Linux (which works in most cases), but in\n    // this specific case we need to treat it as actually being Windows. The \"Windows-way\" of opening things through\n    // cmd.exe works just fine here, whereas using xdg-open does not, since there is no X Windows in WSL.\n    if (platform === \"linux\" && os.release().indexOf(\"Microsoft\") !== -1) {\n        platform = \"win32\";\n    }\n\n    // http://stackoverflow.com/q/1480971/3191, but see below for Windows.\n    var command;\n    switch (platform) {\n        case \"win32\": {\n            command = \"cmd.exe\";\n            break;\n        }\n        case \"darwin\": {\n            command = \"open\";\n            break;\n        }\n        default: {\n            command = \"xdg-open\";\n            break;\n        }\n    }\n\n    if (typeof args === \"string\") {\n        args = [args];\n    }\n\n    if (typeof options === \"function\") {\n        callback = options;\n        options = {};\n    }\n\n    if (options && typeof options === \"object\" && options.command) {\n        if (platform === \"win32\") {\n            // *always* use cmd on windows\n            args = [options.command].concat(args);\n        } else {\n            command = options.command;\n        }\n    }\n\n    if (platform === \"win32\") {\n        // On Windows, we really want to use the \"start\" command. But, the rules regarding arguments with spaces, and\n        // escaping them with quotes, can get really arcane. So the easiest way to deal with this is to pass off the\n        // responsibility to \"cmd /c\", which has that logic built in.\n        //\n        // Furthermore, if \"cmd /c\" double-quoted the first parameter, then \"start\" will interpret it as a window title,\n        // so we need to add a dummy empty-string window title: http://stackoverflow.com/a/154090/3191\n        //\n        // Additionally, on Windows ampersand and caret need to be escaped when passed to \"start\"\n        args = args.map(function (value) {\n            return value.replace(/[&^]/g, \"^$&\");\n        });\n        args = [\"/c\", \"start\", \"\\\"\\\"\"].concat(args);\n    }\n\n    return childProcess.execFile(command, args, options, callback);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/opener/package.json",
    "content": "{\n    \"name\": \"opener\",\n    \"description\": \"Opens stuff, like webpages and files and executables, cross-platform\",\n    \"version\": \"1.5.2\",\n    \"author\": \"Domenic Denicola <d@domenic.me> (https://domenic.me/)\",\n    \"license\": \"(WTFPL OR MIT)\",\n    \"repository\": \"domenic/opener\",\n    \"main\": \"lib/opener.js\",\n    \"bin\": \"bin/opener-bin.js\",\n    \"files\": [\n        \"lib/\",\n        \"bin/\"\n    ],\n    \"scripts\": {\n        \"lint\": \"eslint .\"\n    },\n    \"devDependencies\": {\n        \"eslint\": \"^7.7.0\"\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/portfinder/LICENSE",
    "content": "node-portfinder\n\nCopyright (c) 2012 Charlie Robbins\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "templates/bin/node/http-server/node_modules/portfinder/README.md",
    "content": "# node-portfinder [![CI](https://github.com/http-party/node-portfinder/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/http-party/node-portfinder/actions/workflows/ci.yml)\n\n## Installation\n\n``` bash\n  $ npm install portfinder\n```\n\n## Usage\nThe `portfinder` module has a simple interface:\n\n``` js\n  var portfinder = require('portfinder');\n\n  portfinder.getPort(function (err, port) {\n    //\n    // `port` is guaranteed to be a free port\n    // in this scope.\n    //\n  });\n```\n\nOr with promise (if `Promise`s are supported) :\n\n``` js\n  const portfinder = require('portfinder');\n\n  portfinder.getPortPromise()\n    .then((port) => {\n        //\n        // `port` is guaranteed to be a free port\n        // in this scope.\n        //\n    })\n    .catch((err) => {\n        //\n        // Could not get a free port, `err` contains the reason.\n        //\n    });\n```\n\nIf `portfinder.getPortPromise()` is called on a Node version without Promise (<4), it will throw an Error unless [Bluebird](http://bluebirdjs.com/docs/getting-started.html) or any Promise pollyfill is used.\n\n### Ports search scope\n\nBy default `portfinder` will start searching from `8000` and scan until maximum port number (`65535`) is reached.\n\nYou can change this globally by setting:\n\n```js\nportfinder.setBasePort(3000);    // default: 8000\nportfinder.setHighestPort(3333); // default: 65535\n```\n\nor by passing optional options object on each invocation:\n\n```js\nportfinder.getPort({\n    port: 3000,    // minimum port\n    stopPort: 3333 // maximum port\n}, callback);\n```\n\n## Run Tests\n``` bash\n  $ npm test\n```\n\n#### Author: [Charlie Robbins][0]\n#### Author/Maintainer: [Erik Trom][1]\n#### License: MIT/X11\n[0]: http://nodejitsu.com\n[1]: https://github.com/eriktrom\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/portfinder/lib/portfinder.d.ts",
    "content": "/**\n * portfinder.js typescript definitions.\n *\n * (C) 2011, Charlie Robbins\n */\n\ntype PortfinderCallback = (err: Error, port: number) => void;\n\ninterface PortFinderOptions {\n  /**\n   * Host to find available port on.\n   */\n  host?: string;\n  /**\n   * search start port (equals to port when not provided)\n   * This exists because getPort and getPortPromise mutates port state in\n   * recursive calls and doesn't have a way to retrieve begininng port while\n   * searching.\n   */\n  startPort?: number;\n  /**\n   * Minimum port (takes precedence over `basePort`).\n   */\n  port?: number;\n  /**\n   * Maximum port\n   */\n  stopPort?: number;\n}\n\n/**\n * The lowest port to begin any port search from.\n */\nexport let basePort: number;\n\n/**\n * Set the lowest port to begin any port search from.\n */\nexport function setBasePort(port: number): void;\n\n/**\n * The highest port to end any port search from.\n */\nexport let highestPort: number;\n\n/**\n * Set the higheset port to end any port search from.\n */\nexport function setHighestPort(port: number): void;\n\n/**\n * Responds with a unbound port on the current machine.\n */\nexport function getPort(callback: PortfinderCallback): void;\nexport function getPort(options: PortFinderOptions, callback: PortfinderCallback): void;\n\nexport function getPorts(count: number, options: PortFinderOptions, callback: (err: Error, ports: Array<number>) => void): void;\n\n/**\n * Responds a promise of an unbound port on the current machine.\n */\nexport function getPortPromise(options?: PortFinderOptions): Promise<number>;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/portfinder/lib/portfinder.js",
    "content": "/*\n * portfinder.js: A simple tool to find an open port on the current machine.\n *\n * (C) 2011, Charlie Robbins\n *\n */\n\n\"use strict\";\n\nvar fs = require('fs'),\n    os = require('os'),\n    net = require('net'),\n    path = require('path'),\n    _async = require('async'),\n    debug = require('debug'),\n    mkdirp = require('mkdirp').mkdirp;\n\nvar debugTestPort = debug('portfinder:testPort'),\n    debugGetPort = debug('portfinder:getPort'),\n    debugDefaultHosts = debug('portfinder:defaultHosts');\n\nvar internals = {};\n\ninternals.testPort = function(options, callback) {\n  if (!callback) {\n    callback = options;\n    options = {};\n  }\n\n  options.server = options.server  || net.createServer(function () {\n    //\n    // Create an empty listener for the port testing server.\n    //\n  });\n\n  debugTestPort(\"entered testPort(): trying\", options.host, \"port\", options.port);\n\n  function onListen () {\n    debugTestPort(\"done w/ testPort(): OK\", options.host, \"port\", options.port);\n\n    options.server.removeListener('error', onError);\n    options.server.close();\n    callback(null, options.port);\n  }\n\n  function onError (err) {\n    debugTestPort(\"done w/ testPort(): failed\", options.host, \"w/ port\", options.port, \"with error\", err.code);\n\n    options.server.removeListener('listening', onListen);\n\n    if (!(err.code == 'EADDRINUSE' || err.code == 'EACCES')) {\n      return callback(err);\n    }\n\n    var nextPort = exports.nextPort(options.port);\n\n    if (nextPort > exports.highestPort) {\n      return callback(new Error('No open ports available'));\n    }\n\n    internals.testPort({\n      port: nextPort,\n      host: options.host,\n      server: options.server\n    }, callback);\n  }\n\n  options.server.once('error', onError);\n  options.server.once('listening', onListen);\n\n  if (options.host) {\n    options.server.listen(options.port, options.host);\n  } else {\n    /*\n      Judgement of service without host\n      example:\n        express().listen(options.port)\n    */\n    options.server.listen(options.port);\n  }\n};\n\n//\n// ### @basePort {Number}\n// The lowest port to begin any port search from\n//\nexports.basePort = 8000;\n\n//\n// ### function setBasePort (port)\n// #### @port {Number} The new base port\n//\nexports.setBasePort = function (port) {\n  exports.basePort = port;\n}\n\n//\n// ### @highestPort {Number}\n// Largest port number is an unsigned short 2**16 -1=65335\n//\nexports.highestPort = 65535;\n\n//\n// ### function setHighestPort (port)\n// #### @port {Number} The new highest port\n//\nexports.setHighestPort = function (port) {\n  exports.highestPort = port;\n}\n\n//\n// ### @basePath {string}\n// Default path to begin any socket search from\n//\nexports.basePath = '/tmp/portfinder'\n\n//\n// ### function getPort (options, callback)\n// #### @options {Object} Settings to use when finding the necessary port\n// #### @callback {function} Continuation to respond to when complete.\n// Responds with a unbound port on the current machine.\n//\nexports.getPort = function (options, callback) {\n  if (!callback) {\n    callback = options;\n    options = {};\n\n  }\n\n  options.port   = Number(options.port) || Number(exports.basePort);\n  options.host   = options.host    || null;\n  options.stopPort = Number(options.stopPort) || Number(exports.highestPort);\n\n  if(!options.startPort) {\n    options.startPort = Number(options.port);\n    if(options.startPort < 0) {\n      throw Error('Provided options.startPort(' + options.startPort + ') is less than 0, which are cannot be bound.');\n    }\n    if(options.stopPort < options.startPort) {\n      throw Error('Provided options.stopPort(' + options.stopPort + 'is less than options.startPort (' + options.startPort + ')');\n    }\n  }\n\n  if (options.host) {\n    if (exports._defaultHosts.indexOf(options.host) !== -1) {\n      exports._defaultHosts.push(options.host)\n    }\n  }\n\n  var openPorts = [], currentHost;\n  return _async.eachSeries(exports._defaultHosts, function(host, next) {\n    debugGetPort(\"in eachSeries() iteration callback: host is\", host);\n\n    return internals.testPort({ host: host, port: options.port }, function(err, port) {\n      if (err) {\n        debugGetPort(\"in eachSeries() iteration callback testPort() callback\", \"with an err:\", err.code);\n        currentHost = host;\n        return next(err);\n      } else {\n        debugGetPort(\"in eachSeries() iteration callback testPort() callback\",\n                    \"with a success for port\", port);\n        openPorts.push(port);\n        return next();\n      }\n    });\n  }, function(err) {\n\n    if (err) {\n      debugGetPort(\"in eachSeries() result callback: err is\", err);\n      // If we get EADDRNOTAVAIL it means the host is not bindable, so remove it\n      // from exports._defaultHosts and start over. For ubuntu, we use EINVAL for the same\n      if (err.code === 'EADDRNOTAVAIL' || err.code === 'EINVAL') {\n        if (options.host === currentHost) {\n          // if bad address matches host given by user, tell them\n          //\n          // NOTE: We may need to one day handle `my-non-existent-host.local` if users\n          // report frustration with passing in hostnames that DONT map to bindable\n          // hosts, without showing them a good error.\n          var msg = 'Provided host ' + options.host + ' could NOT be bound. Please provide a different host address or hostname';\n          return callback(Error(msg));\n        } else {\n          var idx = exports._defaultHosts.indexOf(currentHost);\n          exports._defaultHosts.splice(idx, 1);\n          return exports.getPort(options, callback);\n        }\n      } else {\n        // error is not accounted for, file ticket, handle special case\n        return callback(err);\n      }\n    }\n\n    // sort so we can compare first host to last host\n    openPorts.sort(function(a, b) {\n      return a - b;\n    });\n\n    debugGetPort(\"in eachSeries() result callback: openPorts is\", openPorts);\n\n    if (openPorts[0] === openPorts[openPorts.length-1]) {\n      // if first === last, we found an open port\n      if(openPorts[0] <= options.stopPort) {\n        return callback(null, openPorts[0]);\n      }\n      else {\n        var msg = 'No open ports found in between '+ options.startPort + ' and ' + options.stopPort;\n        return callback(Error(msg));\n      }\n    } else {\n      // otherwise, try again, using sorted port, aka, highest open for >= 1 host\n      return exports.getPort({ port: openPorts.pop(), host: options.host, startPort: options.startPort, stopPort: options.stopPort }, callback);\n    }\n\n  });\n};\n\n//\n// ### function getPortPromise (options)\n// #### @options {Object} Settings to use when finding the necessary port\n// Responds a promise to an unbound port on the current machine.\n//\nexports.getPortPromise = function (options) {\n  if (typeof Promise !== 'function') {\n    throw Error('Native promise support is not available in this version of node.' +\n      'Please install a polyfill and assign Promise to global.Promise before calling this method');\n  }\n  if (!options) {\n    options = {};\n  }\n  return new Promise(function(resolve, reject) {\n    exports.getPort(options, function(err, port) {\n      if (err) {\n        return reject(err);\n      }\n      resolve(port);\n    });\n  });\n}\n\n//\n// ### function getPorts (count, options, callback)\n// #### @count {Number} The number of ports to find\n// #### @options {Object} Settings to use when finding the necessary port\n// #### @callback {function} Continuation to respond to when complete.\n// Responds with an array of unbound ports on the current machine.\n//\nexports.getPorts = function (count, options, callback) {\n  if (!callback) {\n    callback = options;\n    options = {};\n  }\n\n  var lastPort = null;\n  _async.timesSeries(count, function(index, asyncCallback) {\n    if (lastPort) {\n      options.port = exports.nextPort(lastPort);\n    }\n\n    exports.getPort(options, function (err, port) {\n      if (err) {\n        asyncCallback(err);\n      } else {\n        lastPort = port;\n        asyncCallback(null, port);\n      }\n    });\n  }, callback);\n};\n\n//\n// ### function getSocket (options, callback)\n// #### @options {Object} Settings to use when finding the necessary port\n// #### @callback {function} Continuation to respond to when complete.\n// Responds with a unbound socket using the specified directory and base\n// name on the current machine.\n//\nexports.getSocket = function (options, callback) {\n  if (!callback) {\n    callback = options;\n    options = {};\n  }\n\n  options.mod  = options.mod    || parseInt(755, 8);\n  options.path = options.path   || exports.basePath + '.sock';\n\n  //\n  // Tests the specified socket\n  //\n  function testSocket () {\n    fs.stat(options.path, function (err) {\n      //\n      // If file we're checking doesn't exist (thus, stating it emits ENOENT),\n      // we should be OK with listening on this socket.\n      //\n      if (err) {\n        if (err.code == 'ENOENT') {\n          callback(null, options.path);\n        }\n        else {\n          callback(err);\n        }\n      }\n      else {\n        //\n        // This file exists, so it isn't possible to listen on it. Lets try\n        // next socket.\n        //\n        options.path = exports.nextSocket(options.path);\n        exports.getSocket(options, callback);\n      }\n    });\n  }\n\n  //\n  // Create the target `dir` then test connection\n  // against the socket.\n  //\n  function createAndTestSocket (dir) {\n    mkdirp(dir, options.mod, function (err) {\n      if (err) {\n        return callback(err);\n      }\n\n      options.exists = true;\n      testSocket();\n    });\n  }\n\n  //\n  // Check if the parent directory of the target\n  // socket path exists. If it does, test connection\n  // against the socket. Otherwise, create the directory\n  // then test connection.\n  //\n  function checkAndTestSocket () {\n    var dir = path.dirname(options.path);\n\n    fs.stat(dir, function (err, stats) {\n      if (err || !stats.isDirectory()) {\n        return createAndTestSocket(dir);\n      }\n\n      options.exists = true;\n      testSocket();\n    });\n  }\n\n  //\n  // If it has been explicitly stated that the\n  // target `options.path` already exists, then\n  // simply test the socket.\n  //\n  return options.exists\n    ? testSocket()\n    : checkAndTestSocket();\n};\n\n//\n// ### function nextPort (port)\n// #### @port {Number} Port to increment from.\n// Gets the next port in sequence from the\n// specified `port`.\n//\nexports.nextPort = function (port) {\n  return port + 1;\n};\n\n//\n// ### function nextSocket (socketPath)\n// #### @socketPath {string} Path to increment from\n// Gets the next socket path in sequence from the\n// specified `socketPath`.\n//\nexports.nextSocket = function (socketPath) {\n  var dir = path.dirname(socketPath),\n      name = path.basename(socketPath, '.sock'),\n      match = name.match(/^([a-zA-z]+)(\\d*)$/i),\n      index = parseInt(match[2]),\n      base = match[1];\n  if (isNaN(index)) {\n    index = 0;\n  }\n\n  index += 1;\n  return path.join(dir, base + index + '.sock');\n};\n\n/**\n * @desc List of internal hostnames provided by your machine. A user\n *       provided hostname may also be provided when calling portfinder.getPort,\n *       which would then be added to the default hosts we lookup and return here.\n *\n * @return {array}\n *\n * Long Form Explantion:\n *\n *    - Input: (os.networkInterfaces() w/ MacOS 10.11.5+ and running a VM)\n *\n *        { lo0:\n *         [ { address: '::1',\n *             netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',\n *             family: 'IPv6',\n *             mac: '00:00:00:00:00:00',\n *             scopeid: 0,\n *             internal: true },\n *           { address: '127.0.0.1',\n *             netmask: '255.0.0.0',\n *             family: 'IPv4',\n *             mac: '00:00:00:00:00:00',\n *             internal: true },\n *           { address: 'fe80::1',\n *             netmask: 'ffff:ffff:ffff:ffff::',\n *             family: 'IPv6',\n *             mac: '00:00:00:00:00:00',\n *             scopeid: 1,\n *             internal: true } ],\n *        en0:\n *         [ { address: 'fe80::a299:9bff:fe17:766d',\n *             netmask: 'ffff:ffff:ffff:ffff::',\n *             family: 'IPv6',\n *             mac: 'a0:99:9b:17:76:6d',\n *             scopeid: 4,\n *             internal: false },\n *           { address: '10.0.1.22',\n *             netmask: '255.255.255.0',\n *             family: 'IPv4',\n *             mac: 'a0:99:9b:17:76:6d',\n *             internal: false } ],\n *        awdl0:\n *         [ { address: 'fe80::48a8:37ff:fe34:aaef',\n *             netmask: 'ffff:ffff:ffff:ffff::',\n *             family: 'IPv6',\n *             mac: '4a:a8:37:34:aa:ef',\n *             scopeid: 8,\n *             internal: false } ],\n *        vnic0:\n *         [ { address: '10.211.55.2',\n *             netmask: '255.255.255.0',\n *             family: 'IPv4',\n *             mac: '00:1c:42:00:00:08',\n *             internal: false } ],\n *        vnic1:\n *         [ { address: '10.37.129.2',\n *             netmask: '255.255.255.0',\n *             family: 'IPv4',\n *             mac: '00:1c:42:00:00:09',\n *             internal: false } ] }\n *\n *    - Output:\n *\n *         [\n *          '0.0.0.0',\n *          '::1',\n *          '127.0.0.1',\n *          'fe80::1',\n *          '10.0.1.22',\n *          'fe80::48a8:37ff:fe34:aaef',\n *          '10.211.55.2',\n *          '10.37.129.2'\n *         ]\n *\n *     Note we export this so we can use it in our tests, otherwise this API is private\n */\nexports._defaultHosts = (function() {\n  var interfaces = {};\n  try{\n    interfaces = os.networkInterfaces();\n  }\n  catch(e) {\n    // As of October 2016, Windows Subsystem for Linux (WSL) does not support\n    // the os.networkInterfaces() call and throws instead. For this platform,\n    // assume 0.0.0.0 as the only address\n    //\n    // - https://github.com/Microsoft/BashOnWindows/issues/468\n    //\n    // - Workaround is a mix of good work from the community:\n    //   - https://github.com/http-party/node-portfinder/commit/8d7e30a648ff5034186551fa8a6652669dec2f2f\n    //   - https://github.com/yarnpkg/yarn/pull/772/files\n    if (e.syscall === 'uv_interface_addresses') {\n      // swallow error because we're just going to use defaults\n      // documented @ https://github.com/nodejs/node/blob/4b65a65e75f48ff447cabd5500ce115fb5ad4c57/doc/api/net.md#L231\n    } else {\n      throw e;\n    }\n  }\n\n  var interfaceNames = Object.keys(interfaces),\n      hiddenButImportantHost = '0.0.0.0', // !important - dont remove, hence the naming :)\n      results = [hiddenButImportantHost];\n  for (var i = 0; i < interfaceNames.length; i++) {\n    var _interface = interfaces[interfaceNames[i]];\n    for (var j = 0; j < _interface.length; j++) {\n      var curr = _interface[j];\n      results.push(curr.address);\n    }\n  }\n\n  // add null value, For createServer function, do not use host.\n  results.push(null);\n\n  debugDefaultHosts(\"exports._defaultHosts is: %o\", results);\n\n  return results;\n}());\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/portfinder/package.json",
    "content": "{\n  \"name\": \"portfinder\",\n  \"description\": \"A simple tool to find an open port on the current machine\",\n  \"version\": \"1.0.32\",\n  \"author\": \"Charlie Robbins <charlie.robbins@gmail.com>\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:http-party/node-portfinder.git\"\n  },\n  \"keywords\": [\n    \"http\",\n    \"ports\",\n    \"utilities\"\n  ],\n  \"files\": [\n    \"lib\"\n  ],\n  \"dependencies\": {\n    \"async\": \"^2.6.4\",\n    \"debug\": \"^3.2.7\",\n    \"mkdirp\": \"^0.5.6\"\n  },\n  \"devDependencies\": {\n    \"vows\": \"^0.8.3\"\n  },\n  \"main\": \"./lib/portfinder\",\n  \"types\": \"./lib/portfinder.d.ts\",\n  \"scripts\": {\n    \"test\": \"vows test/*-test.js --spec\"\n  },\n  \"engines\": {\n    \"node\": \">= 0.12.0\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/.editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nmax_line_length = 160\nquote_type = single\n\n[test/*]\nmax_line_length = off\n\n[LICENSE.md]\nindent_size = off\n\n[*.md]\nmax_line_length = off\n\n[*.json]\nmax_line_length = off\n\n[Makefile]\nmax_line_length = off\n\n[CHANGELOG.md]\nindent_style = space\nindent_size = 2\n\n[LICENSE]\nindent_size = 2\nmax_line_length = off\n\n[coverage/**/*]\nindent_size = off\nindent_style = off\nindent = off\nmax_line_length = off\n\n[.nycrc]\nindent_style = tab\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/.eslintrc",
    "content": "{\n    \"root\": true,\n\n    \"extends\": \"@ljharb\",\n\n    \"ignorePatterns\": [\n        \"dist/\",\n    ],\n\n    \"rules\": {\n        \"complexity\": 0,\n        \"consistent-return\": 1,\n        \"func-name-matching\": 0,\n        \"id-length\": [2, { \"min\": 1, \"max\": 25, \"properties\": \"never\" }],\n        \"indent\": [2, 4],\n        \"max-lines-per-function\": 0,\n        \"max-params\": [2, 12],\n        \"max-statements\": [2, 45],\n        \"multiline-comment-style\": 0,\n        \"no-continue\": 1,\n        \"no-magic-numbers\": 0,\n        \"no-param-reassign\": 1,\n        \"no-restricted-syntax\": [2, \"BreakStatement\", \"DebuggerStatement\", \"ForInStatement\", \"LabeledStatement\", \"WithStatement\"],\n    },\n\n    \"overrides\": [\n        {\n            \"files\": \"test/**\",\n            \"rules\": {\n                \"max-lines-per-function\": 0,\n                \"max-statements\": 0,\n                \"no-extend-native\": 0,\n                \"function-paren-newline\": 0,\n            },\n        },\n    ],\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/.github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: [ljharb]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: npm/qs\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with a single custom sponsorship URL\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/.nycrc",
    "content": "{\n\t\"all\": true,\n\t\"check-coverage\": false,\n\t\"reporter\": [\"text-summary\", \"text\", \"html\", \"json\"],\n\t\"lines\": 86,\n\t\"statements\": 85.93,\n\t\"functions\": 82.43,\n\t\"branches\": 76.06,\n\t\"exclude\": [\n\t\t\"coverage\",\n\t\t\"dist\"\n\t]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/CHANGELOG.md",
    "content": "## **6.5.3**\n- [Fix] `parse`: ignore `__proto__` keys (#428)\n- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source\n- [Fix] correctly parse nested arrays\n- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279)\n- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided\n- [Fix] when `parseArrays` is false, properly handle keys ending in `[]`\n- [Fix] fix for an impossible situation: when the formatter is called with a non-string value\n- [Fix] `utils.merge`: avoid a crash with a null target and an array source\n- [Refactor] `utils`: reduce observable [[Get]]s\n- [Refactor] use cached `Array.isArray`\n- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269)\n- [Refactor] `parse`: only need to reassign the var once\n- [Robustness] `stringify`: avoid relying on a global `undefined` (#427)\n- [readme] remove travis badge; add github actions/codecov badges; update URLs\n- [Docs] Clean up license text so it’s properly detected as BSD-3-Clause\n- [Docs] Clarify the need for \"arrayLimit\" option\n- [meta] fix README.md (#399)\n- [meta] add FUNDING.yml\n- [actions] backport actions from main\n- [Tests] always use `String(x)` over `x.toString()`\n- [Tests] remove nonexistent tape option\n- [Dev Deps] backport from main\n\n## **6.5.2**\n- [Fix] use `safer-buffer` instead of `Buffer` constructor\n- [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230)\n- [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify`\n\n## **6.5.1**\n- [Fix] Fix parsing & compacting very deep objects (#224)\n- [Refactor] name utils functions\n- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`\n- [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node\n- [Tests] Use precise dist for Node.js 0.6 runtime (#225)\n- [Tests] make 0.6 required, now that it’s passing\n- [Tests] on `node` `v8.2`; fix npm on node 0.6\n\n## **6.5.0**\n- [New] add `utils.assign`\n- [New] pass default encoder/decoder to custom encoder/decoder functions (#206)\n- [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213)\n- [Fix] Handle stringifying empty objects with addQueryPrefix (#217)\n- [Fix] do not mutate `options` argument (#207)\n- [Refactor] `parse`: cache index to reuse in else statement (#182)\n- [Docs] add various badges to readme (#208)\n- [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape`\n- [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4\n- [Tests] add `editorconfig-tools`\n\n## **6.4.0**\n- [New] `qs.stringify`: add `encodeValuesOnly` option\n- [Fix] follow `allowPrototypes` option during merge (#201, #201)\n- [Fix] support keys starting with brackets (#202, #200)\n- [Fix] chmod a-x\n- [Dev Deps] update `eslint`\n- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds\n- [eslint] reduce warnings\n\n## **6.3.2**\n- [Fix] follow `allowPrototypes` option during merge (#201, #200)\n- [Dev Deps] update `eslint`\n- [Fix] chmod a-x\n- [Fix] support keys starting with brackets (#202, #200)\n- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds\n\n## **6.3.1**\n- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!)\n- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape`\n- [Tests] on all node minors; improve test matrix\n- [Docs] document stringify option `allowDots` (#195)\n- [Docs] add empty object and array values example (#195)\n- [Docs] Fix minor inconsistency/typo (#192)\n- [Docs] document stringify option `sort` (#191)\n- [Refactor] `stringify`: throw faster with an invalid encoder\n- [Refactor] remove unnecessary escapes (#184)\n- Remove contributing.md, since `qs` is no longer part of `hapi` (#183)\n\n## **6.3.0**\n- [New] Add support for RFC 1738 (#174, #173)\n- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159)\n- [Fix] ensure `utils.merge` handles merging two arrays\n- [Refactor] only constructors should be capitalized\n- [Refactor] capitalized var names are for constructors only\n- [Refactor] avoid using a sparse array\n- [Robustness] `formats`: cache `String#replace`\n- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest`\n- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix\n- [Tests] flesh out arrayLimit/arrayFormat tests (#107)\n- [Tests] skip Object.create tests when null objects are not available\n- [Tests] Turn on eslint for test files (#175)\n\n## **6.2.3**\n- [Fix] follow `allowPrototypes` option during merge (#201, #200)\n- [Fix] chmod a-x\n- [Fix] support keys starting with brackets (#202, #200)\n- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds\n\n## **6.2.2**\n- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties\n\n## **6.2.1**\n- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values\n- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call`\n- [Tests] remove `parallelshell` since it does not reliably report failures\n- [Tests] up to `node` `v6.3`, `v5.12`\n- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv`\n\n## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed)\n- [New] pass Buffers to the encoder/decoder directly (#161)\n- [New] add \"encoder\" and \"decoder\" options, for custom param encoding/decoding (#160)\n- [Fix] fix compacting of nested sparse arrays (#150)\n\n## **6.1.2\n- [Fix] follow `allowPrototypes` option during merge (#201, #200)\n- [Fix] chmod a-x\n- [Fix] support keys starting with brackets (#202, #200)\n- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds\n\n## **6.1.1**\n- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties\n\n## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed)\n- [New] allowDots option for `stringify` (#151)\n- [Fix] \"sort\" option should work at a depth of 3 or more (#151)\n- [Fix] Restore `dist` directory; will be removed in v7 (#148)\n\n## **6.0.4**\n- [Fix] follow `allowPrototypes` option during merge (#201, #200)\n- [Fix] chmod a-x\n- [Fix] support keys starting with brackets (#202, #200)\n- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds\n\n## **6.0.3**\n- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties\n- [Fix] Restore `dist` directory; will be removed in v7 (#148)\n\n## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed)\n- Revert ES6 requirement and restore support for node down to v0.8.\n\n## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed)\n- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json\n\n## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed)\n- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4\n\n## **5.2.1**\n- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values\n\n## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed)\n- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string\n\n## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed)\n- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional\n- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify\n\n## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed)\n- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false\n- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm\n\n## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed)\n- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional\n\n## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed)\n- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable \"Transform dot notation to bracket notation\"\n\n## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed)\n- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties\n- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost\n- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing\n- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object\n- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option\n- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects.\n- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47\n- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986\n- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign\n- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute\n\n## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed)\n- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object #<Object> is not a function\n\n## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed)\n- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option\n\n## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed)\n- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57\n- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader\n\n## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed)\n- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object\n\n## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed)\n- [**#52**](https://github.com/ljharb/qs/issues/52) Return \"undefined\" and \"false\" instead of throwing \"TypeError\".\n\n## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed)\n- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46\n\n## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed)\n- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer?\n- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45\n- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39\n\n## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed)\n- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number\n\n## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed)\n- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array\n- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x\n\n## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed)\n- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value\n- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty\n- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver?\n\n## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed)\n- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31\n- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects\n\n## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed)\n- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present\n- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays\n- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge\n- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters?\n\n## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed)\n- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter\n\n## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed)\n- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit?\n- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit\n- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20\n\n## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed)\n- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values\n\n## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed)\n- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters\n- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block\n\n## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed)\n- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument\n- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed\n\n## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed)\n- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted\n- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null\n- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README\n\n## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed)\n- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/LICENSE.md",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors)\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/README.md",
    "content": "# qs <sup>[![Version Badge][2]][1]</sup>\n\n[![github actions][actions-image]][actions-url]\n[![coverage][codecov-image]][codecov-url]\n[![dependency status][deps-svg]][deps-url]\n[![dev dependency status][dev-deps-svg]][dev-deps-url]\n[![License][license-image]][license-url]\n[![Downloads][downloads-image]][downloads-url]\n\n[![npm badge][npm-badge-png]][package-url]\n\nA querystring parsing and stringifying library with some added security.\n\nLead Maintainer: [Jordan Harband](https://github.com/ljharb)\n\nThe **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring).\n\n## Usage\n\n```javascript\nvar qs = require('qs');\nvar assert = require('assert');\n\nvar obj = qs.parse('a=c');\nassert.deepEqual(obj, { a: 'c' });\n\nvar str = qs.stringify(obj);\nassert.equal(str, 'a=c');\n```\n\n### Parsing Objects\n\n[](#preventEval)\n```javascript\nqs.parse(string, [options]);\n```\n\n**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`.\nFor example, the string `'foo[bar]=baz'` converts to:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar]=baz'), {\n    foo: {\n        bar: 'baz'\n    }\n});\n```\n\nWhen using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:\n\n```javascript\nvar nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true });\nassert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } });\n```\n\nBy default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.\n\n```javascript\nvar protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true });\nassert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } });\n```\n\nURI encoded strings work too:\n\n```javascript\nassert.deepEqual(qs.parse('a%5Bb%5D=c'), {\n    a: { b: 'c' }\n});\n```\n\nYou can also nest your objects, like `'foo[bar][baz]=foobarbaz'`:\n\n```javascript\nassert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), {\n    foo: {\n        bar: {\n            baz: 'foobarbaz'\n        }\n    }\n});\n```\n\nBy default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like\n`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be:\n\n```javascript\nvar expected = {\n    a: {\n        b: {\n            c: {\n                d: {\n                    e: {\n                        f: {\n                            '[g][h][i]': 'j'\n                        }\n                    }\n                }\n            }\n        }\n    }\n};\nvar string = 'a[b][c][d][e][f][g][h][i]=j';\nassert.deepEqual(qs.parse(string), expected);\n```\n\nThis depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`:\n\n```javascript\nvar deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });\nassert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });\n```\n\nThe depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number.\n\nFor similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option:\n\n```javascript\nvar limited = qs.parse('a=b&c=d', { parameterLimit: 1 });\nassert.deepEqual(limited, { a: 'b' });\n```\n\nTo bypass the leading question mark, use `ignoreQueryPrefix`:\n\n```javascript\nvar prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });\nassert.deepEqual(prefixed, { a: 'b', c: 'd' });\n```\n\nAn optional delimiter can also be passed:\n\n```javascript\nvar delimited = qs.parse('a=b;c=d', { delimiter: ';' });\nassert.deepEqual(delimited, { a: 'b', c: 'd' });\n```\n\nDelimiters can be a regular expression too:\n\n```javascript\nvar regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });\nassert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });\n```\n\nOption `allowDots` can be used to enable dot notation:\n\n```javascript\nvar withDots = qs.parse('a.b=c', { allowDots: true });\nassert.deepEqual(withDots, { a: { b: 'c' } });\n```\n\n### Parsing Arrays\n\n**qs** can also parse arrays using a similar `[]` notation:\n\n```javascript\nvar withArray = qs.parse('a[]=b&a[]=c');\nassert.deepEqual(withArray, { a: ['b', 'c'] });\n```\n\nYou may specify an index as well:\n\n```javascript\nvar withIndexes = qs.parse('a[1]=c&a[0]=b');\nassert.deepEqual(withIndexes, { a: ['b', 'c'] });\n```\n\nNote that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number\nto create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving\ntheir order:\n\n```javascript\nvar noSparse = qs.parse('a[1]=b&a[15]=c');\nassert.deepEqual(noSparse, { a: ['b', 'c'] });\n```\n\nNote that an empty string is also a value, and will be preserved:\n\n```javascript\nvar withEmptyString = qs.parse('a[]=&a[]=b');\nassert.deepEqual(withEmptyString, { a: ['', 'b'] });\n\nvar withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');\nassert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });\n```\n\n**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will\ninstead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array.\n\n```javascript\nvar withMaxIndex = qs.parse('a[100]=b');\nassert.deepEqual(withMaxIndex, { a: { '100': 'b' } });\n```\n\nThis limit can be overridden by passing an `arrayLimit` option:\n\n```javascript\nvar withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });\nassert.deepEqual(withArrayLimit, { a: { '1': 'b' } });\n```\n\nTo disable array parsing entirely, set `parseArrays` to `false`.\n\n```javascript\nvar noParsingArrays = qs.parse('a[]=b', { parseArrays: false });\nassert.deepEqual(noParsingArrays, { a: { '0': 'b' } });\n```\n\nIf you mix notations, **qs** will merge the two items into an object:\n\n```javascript\nvar mixedNotation = qs.parse('a[0]=b&a[b]=c');\nassert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });\n```\n\nYou can also create arrays of objects:\n\n```javascript\nvar arraysOfObjects = qs.parse('a[][b]=c');\nassert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });\n```\n\n### Stringifying\n\n[](#preventEval)\n```javascript\nqs.stringify(object, [options]);\n```\n\nWhen stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b' }), 'a=b');\nassert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n```\n\nThis encoding can be disabled by setting the `encode` option to `false`:\n\n```javascript\nvar unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });\nassert.equal(unencoded, 'a[b]=c');\n```\n\nEncoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`:\n```javascript\nvar encodedValues = qs.stringify(\n    { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n    { encodeValuesOnly: true }\n);\nassert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');\n```\n\nThis encoding can also be replaced by a custom encoding method set as `encoder` option:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {\n    // Passed in values `a`, `b`, `c`\n    return // Return encoded string\n}})\n```\n\n_(Note: the `encoder` option does not apply if `encode` is `false`)_\n\nAnalogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str) {\n    // Passed in values `x`, `z`\n    return // Return decoded string\n}})\n```\n\nYou can encode keys and values using different logic by using the type argument provided to the encoder:\n\n```javascript\nvar encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {\n    if (type === 'key') {\n        return // Encoded key\n    } else if (type === 'value') {\n        return // Encoded value\n    }\n}})\n```\n\nThe type argument is also provided to the decoder:\n\n```javascript\nvar decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) {\n    if (type === 'key') {\n        return // Decoded key\n    } else if (type === 'value') {\n        return // Decoded value\n    }\n}})\n```\n\nExamples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.\n\nWhen arrays are stringified, by default they are given explicit indices:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] });\n// 'a[0]=b&a[1]=c&a[2]=d'\n```\n\nYou may override this by setting the `indices` option to `false`:\n\n```javascript\nqs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });\n// 'a=b&a=c&a=d'\n```\n\nYou may use the `arrayFormat` option to specify the format of the output array:\n\n```javascript\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })\n// 'a[0]=b&a[1]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })\n// 'a[]=b&a[]=c'\nqs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })\n// 'a=b&a=c'\n```\n\nWhen objects are stringified, by default they use bracket notation:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } });\n// 'a[b][c]=d&a[b][e]=f'\n```\n\nYou may override this to use dot notation by setting the `allowDots` option to `true`:\n\n```javascript\nqs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });\n// 'a.b.c=d&a.b.e=f'\n```\n\nEmpty strings and null values will omit the value, but the equals sign (=) remains in place:\n\n```javascript\nassert.equal(qs.stringify({ a: '' }), 'a=');\n```\n\nKey with no values (such as an empty object or array) will return nothing:\n\n```javascript\nassert.equal(qs.stringify({ a: [] }), '');\nassert.equal(qs.stringify({ a: {} }), '');\nassert.equal(qs.stringify({ a: [{}] }), '');\nassert.equal(qs.stringify({ a: { b: []} }), '');\nassert.equal(qs.stringify({ a: { b: {}} }), '');\n```\n\nProperties that are set to `undefined` will be omitted entirely:\n\n```javascript\nassert.equal(qs.stringify({ a: null, b: undefined }), 'a=');\n```\n\nThe query string may optionally be prepended with a question mark:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');\n```\n\nThe delimiter may be overridden with stringify as well:\n\n```javascript\nassert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n```\n\nIf you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option:\n\n```javascript\nvar date = new Date(7);\nassert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));\nassert.equal(\n    qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),\n    'a=7'\n);\n```\n\nYou may use the `sort` option to affect the order of parameter keys:\n\n```javascript\nfunction alphabeticalSort(a, b) {\n    return a.localeCompare(b);\n}\nassert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');\n```\n\nFinally, you can use the `filter` option to restrict which keys will be included in the stringified output.\nIf you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you\npass an array, it will be used to select properties and array indices for stringification:\n\n```javascript\nfunction filterFunc(prefix, value) {\n    if (prefix == 'b') {\n        // Return an `undefined` value to omit a property.\n        return;\n    }\n    if (prefix == 'e[f]') {\n        return value.getTime();\n    }\n    if (prefix == 'e[g][0]') {\n        return value * 2;\n    }\n    return value;\n}\nqs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });\n// 'a=b&c=d&e[f]=123&e[g][0]=4'\nqs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });\n// 'a=b&e=f'\nqs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });\n// 'a[0]=b&a[2]=d'\n```\n\n### Handling of `null` values\n\nBy default, `null` values are treated like empty strings:\n\n```javascript\nvar withNull = qs.stringify({ a: null, b: '' });\nassert.equal(withNull, 'a=&b=');\n```\n\nParsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings.\n\n```javascript\nvar equalsInsensitive = qs.parse('a&b=');\nassert.deepEqual(equalsInsensitive, { a: '', b: '' });\n```\n\nTo distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null`\nvalues have no `=` sign:\n\n```javascript\nvar strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });\nassert.equal(strictNull, 'a&b=');\n```\n\nTo parse values without `=` back to `null` use the `strictNullHandling` flag:\n\n```javascript\nvar parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });\nassert.deepEqual(parsedStrictNull, { a: null, b: '' });\n```\n\nTo completely skip rendering keys with `null` values, use the `skipNulls` flag:\n\n```javascript\nvar nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });\nassert.equal(nullsSkipped, 'a=b');\n```\n\n### Dealing with special character sets\n\nBy default the encoding and decoding of characters is done in `utf-8`. If you\nwish to encode querystrings to a different character set (i.e.\n[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the\n[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library:\n\n```javascript\nvar encoder = require('qs-iconv/encoder')('shift_jis');\nvar shiftJISEncoded = qs.stringify({ a: 'こんにちは！' }, { encoder: encoder });\nassert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I');\n```\n\nThis also works for decoding of query strings:\n\n```javascript\nvar decoder = require('qs-iconv/decoder')('shift_jis');\nvar obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder });\nassert.deepEqual(obj, { a: 'こんにちは！' });\n```\n\n### RFC 3986 and RFC 1738 space encoding\n\nRFC3986 used as default option and encodes ' ' to *%20* which is backward compatible.\nIn the same time, output can be stringified as per RFC1738 with ' ' equal to '+'.\n\n```\nassert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c');\nassert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c');\n```\n\n## Security\n\nPlease email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.\n\n## qs for enterprise\n\nAvailable as part of the Tidelift Subscription\n\nThe maintainers of qs and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n[package-url]: https://npmjs.org/package/qs\n[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg\n[deps-svg]: https://david-dm.org/ljharb/qs.svg\n[deps-url]: https://david-dm.org/ljharb/qs\n[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg\n[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies\n[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true\n[license-image]: https://img.shields.io/npm/l/qs.svg\n[license-url]: LICENSE\n[downloads-image]: https://img.shields.io/npm/dm/qs.svg\n[downloads-url]: https://npm-stat.com/charts.html?package=qs\n[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg\n[codecov-url]: https://app.codecov.io/gh/ljharb/qs/\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs\n[actions-url]: https://github.com/ljharb/qs/actions\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/bower.json",
    "content": "{\n    \"name\": \"qs\",\n    \"main\": \"dist/qs.js\",\n    \"homepage\": \"https://github.com/hapijs/qs\",\n    \"authors\": [\n        \"Nathan LaFreniere <quitlahok@gmail.com>\"\n    ],\n    \"description\": \"A querystring parser that supports nesting and arrays, with a depth limit\",\n    \"keywords\": [\n        \"querystring\",\n        \"qs\"\n    ],\n    \"license\": \"BSD-3-Clause\",\n    \"ignore\": [\n        \"**/.*\",\n        \"node_modules\",\n        \"bower_components\",\n        \"test\",\n        \"tests\"\n    ]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/component.json",
    "content": "{\n    \"name\": \"qs\",\n    \"repository\": \"ljharb/qs\",\n    \"description\": \"query-string parser / stringifier with nesting support\",\n    \"version\": \"6.5.3\",\n    \"keywords\": [\"querystring\", \"query\", \"parser\"],\n    \"main\": \"lib/index.js\",\n    \"scripts\": [\n        \"lib/index.js\",\n        \"lib/parse.js\",\n        \"lib/stringify.js\",\n        \"lib/utils.js\"\n    ],\n    \"license\": \"BSD-3-Clause\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/dist/qs.js",
    "content": "(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n    'default': 'RFC3986',\n    formatters: {\n        RFC1738: function (value) {\n            return replace.call(value, percentTwenties, '+');\n        },\n        RFC3986: function (value) {\n            return String(value);\n        }\n    },\n    RFC1738: 'RFC1738',\n    RFC3986: 'RFC3986'\n};\n\n},{}],2:[function(require,module,exports){\n'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n    formats: formats,\n    parse: parse,\n    stringify: stringify\n};\n\n},{\"./formats\":1,\"./parse\":3,\"./stringify\":4}],3:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n    allowDots: false,\n    allowPrototypes: false,\n    arrayLimit: 20,\n    decoder: utils.decode,\n    delimiter: '&',\n    depth: 5,\n    parameterLimit: 1000,\n    plainObjects: false,\n    strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n    var obj = {};\n    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n    var parts = cleanStr.split(options.delimiter, limit);\n\n    for (var i = 0; i < parts.length; ++i) {\n        var part = parts[i];\n\n        var bracketEqualsPos = part.indexOf(']=');\n        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n        var key, val;\n        if (pos === -1) {\n            key = options.decoder(part, defaults.decoder);\n            val = options.strictNullHandling ? null : '';\n        } else {\n            key = options.decoder(part.slice(0, pos), defaults.decoder);\n            val = options.decoder(part.slice(pos + 1), defaults.decoder);\n        }\n        if (has.call(obj, key)) {\n            obj[key] = [].concat(obj[key]).concat(val);\n        } else {\n            obj[key] = val;\n        }\n    }\n\n    return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n    var leaf = val;\n\n    for (var i = chain.length - 1; i >= 0; --i) {\n        var obj;\n        var root = chain[i];\n\n        if (root === '[]' && options.parseArrays) {\n            obj = [].concat(leaf);\n        } else {\n            obj = options.plainObjects ? Object.create(null) : {};\n            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n            var index = parseInt(cleanRoot, 10);\n            if (!options.parseArrays && cleanRoot === '') {\n                obj = { 0: leaf };\n            } else if (\n                !isNaN(index)\n                && root !== cleanRoot\n                && String(index) === cleanRoot\n                && index >= 0\n                && (options.parseArrays && index <= options.arrayLimit)\n            ) {\n                obj = [];\n                obj[index] = leaf;\n            } else if (cleanRoot !== '__proto__') {\n                obj[cleanRoot] = leaf;\n            }\n        }\n\n        leaf = obj;\n    }\n\n    return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n    if (!givenKey) {\n        return;\n    }\n\n    // Transform dot notation to bracket notation\n    var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n    // The regex chunks\n\n    var brackets = /(\\[[^[\\]]*])/;\n    var child = /(\\[[^[\\]]*])/g;\n\n    // Get the parent\n\n    var segment = brackets.exec(key);\n    var parent = segment ? key.slice(0, segment.index) : key;\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (parent) {\n        // If we aren't using plain objects, optionally prefix keys\n        // that would overwrite object prototype properties\n        if (!options.plainObjects && has.call(Object.prototype, parent)) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n\n        keys.push(parent);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n        i += 1;\n        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n        keys.push(segment[1]);\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n        throw new TypeError('Decoder has to be a function.');\n    }\n\n    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n    options.parseArrays = options.parseArrays !== false;\n    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n    if (str === '' || str === null || typeof str === 'undefined') {\n        return options.plainObjects ? Object.create(null) : {};\n    }\n\n    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n    var obj = options.plainObjects ? Object.create(null) : {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var newObj = parseKeys(key, tempObj[key], options);\n        obj = utils.merge(obj, newObj, options);\n    }\n\n    return utils.compact(obj);\n};\n\n},{\"./utils\":5}],4:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\n\nvar arrayPrefixGenerators = {\n    brackets: function brackets(prefix) {\n        return prefix + '[]';\n    },\n    indices: function indices(prefix, key) {\n        return prefix + '[' + key + ']';\n    },\n    repeat: function repeat(prefix) {\n        return prefix;\n    }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n    delimiter: '&',\n    encode: true,\n    encoder: utils.encode,\n    encodeValuesOnly: false,\n    serializeDate: function serializeDate(date) {\n        return toISO.call(date);\n    },\n    skipNulls: false,\n    strictNullHandling: false\n};\n\nvar stringify = function stringify(\n    object,\n    prefix,\n    generateArrayPrefix,\n    strictNullHandling,\n    skipNulls,\n    encoder,\n    filter,\n    sort,\n    allowDots,\n    serializeDate,\n    formatter,\n    encodeValuesOnly\n) {\n    var obj = object;\n    if (typeof filter === 'function') {\n        obj = filter(prefix, obj);\n    } else if (obj instanceof Date) {\n        obj = serializeDate(obj);\n    }\n\n    if (obj === null) {\n        if (strictNullHandling) {\n            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n        }\n\n        obj = '';\n    }\n\n    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n        if (encoder) {\n            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n        }\n        return [formatter(prefix) + '=' + formatter(String(obj))];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys;\n    if (isArray(filter)) {\n        objKeys = filter;\n    } else {\n        var keys = Object.keys(obj);\n        objKeys = sort ? keys.sort(sort) : keys;\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        if (isArray(obj)) {\n            pushToArray(values, stringify(\n                obj[key],\n                generateArrayPrefix(prefix, key),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        } else {\n            pushToArray(values, stringify(\n                obj[key],\n                prefix + (allowDots ? '.' + key : '[' + key + ']'),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        }\n    }\n\n    return values;\n};\n\nmodule.exports = function (object, opts) {\n    var obj = object;\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.encoder !== null && typeof options.encoder !== 'undefined' && typeof options.encoder !== 'function') {\n        throw new TypeError('Encoder has to be a function.');\n    }\n\n    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n    var sort = typeof options.sort === 'function' ? options.sort : null;\n    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n    if (typeof options.format === 'undefined') {\n        options.format = formats['default'];\n    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n        throw new TypeError('Unknown format option provided.');\n    }\n    var formatter = formats.formatters[options.format];\n    var objKeys;\n    var filter;\n\n    if (typeof options.filter === 'function') {\n        filter = options.filter;\n        obj = filter('', obj);\n    } else if (isArray(options.filter)) {\n        filter = options.filter;\n        objKeys = filter;\n    }\n\n    var keys = [];\n\n    if (typeof obj !== 'object' || obj === null) {\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    } else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    } else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n    if (!objKeys) {\n        objKeys = Object.keys(obj);\n    }\n\n    if (sort) {\n        objKeys.sort(sort);\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n        pushToArray(keys, stringify(\n            obj[key],\n            key,\n            generateArrayPrefix,\n            strictNullHandling,\n            skipNulls,\n            encode ? encoder : null,\n            filter,\n            sort,\n            allowDots,\n            serializeDate,\n            formatter,\n            encodeValuesOnly\n        ));\n    }\n\n    var joined = keys.join(delimiter);\n    var prefix = options.addQueryPrefix === true ? '?' : '';\n\n    return joined.length > 0 ? prefix + joined : '';\n};\n\n},{\"./formats\":1,\"./utils\":5}],5:[function(require,module,exports){\n'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n    var array = [];\n    for (var i = 0; i < 256; ++i) {\n        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n    }\n\n    return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n    var obj;\n\n    while (queue.length) {\n        var item = queue.pop();\n        obj = item.obj[item.prop];\n\n        if (Array.isArray(obj)) {\n            var compacted = [];\n\n            for (var j = 0; j < obj.length; ++j) {\n                if (typeof obj[j] !== 'undefined') {\n                    compacted.push(obj[j]);\n                }\n            }\n\n            item.obj[item.prop] = compacted;\n        }\n    }\n\n    return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n    var obj = options && options.plainObjects ? Object.create(null) : {};\n    for (var i = 0; i < source.length; ++i) {\n        if (typeof source[i] !== 'undefined') {\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\nvar merge = function merge(target, source, options) {\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        } else if (target && typeof target === 'object') {\n            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {\n                target[source] = true;\n            }\n        } else {\n            return [target, source];\n        }\n\n        return target;\n    }\n\n    if (!target || typeof target !== 'object') {\n        return [target].concat(source);\n    }\n\n    var mergeTarget = target;\n    if (Array.isArray(target) && !Array.isArray(source)) {\n        mergeTarget = arrayToObject(target, options);\n    }\n\n    if (Array.isArray(target) && Array.isArray(source)) {\n        source.forEach(function (item, i) {\n            if (has.call(target, i)) {\n                var targetItem = target[i];\n                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n                    target[i] = merge(targetItem, item, options);\n                } else {\n                    target.push(item);\n                }\n            } else {\n                target[i] = item;\n            }\n        });\n        return target;\n    }\n\n    return Object.keys(source).reduce(function (acc, key) {\n        var value = source[key];\n\n        if (has.call(acc, key)) {\n            acc[key] = merge(acc[key], value, options);\n        } else {\n            acc[key] = value;\n        }\n        return acc;\n    }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n    return Object.keys(source).reduce(function (acc, key) {\n        acc[key] = source[key];\n        return acc;\n    }, target);\n};\n\nvar decode = function (str) {\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\nvar encode = function encode(str) {\n    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n    // It has been adapted here for stricter adherence to RFC 3986\n    if (str.length === 0) {\n        return str;\n    }\n\n    var string = typeof str === 'string' ? str : String(str);\n\n    var out = '';\n    for (var i = 0; i < string.length; ++i) {\n        var c = string.charCodeAt(i);\n\n        if (\n            c === 0x2D // -\n            || c === 0x2E // .\n            || c === 0x5F // _\n            || c === 0x7E // ~\n            || (c >= 0x30 && c <= 0x39) // 0-9\n            || (c >= 0x41 && c <= 0x5A) // a-z\n            || (c >= 0x61 && c <= 0x7A) // A-Z\n        ) {\n            out += string.charAt(i);\n            continue;\n        }\n\n        if (c < 0x80) {\n            out = out + hexTable[c];\n            continue;\n        }\n\n        if (c < 0x800) {\n            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        if (c < 0xD800 || c >= 0xE000) {\n            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        i += 1;\n        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n        /* eslint operator-linebreak: [2, \"before\"] */\n        out += hexTable[0xF0 | (c >> 18)]\n            + hexTable[0x80 | ((c >> 12) & 0x3F)]\n            + hexTable[0x80 | ((c >> 6) & 0x3F)]\n            + hexTable[0x80 | (c & 0x3F)];\n    }\n\n    return out;\n};\n\nvar compact = function compact(value) {\n    var queue = [{ obj: { o: value }, prop: 'o' }];\n    var refs = [];\n\n    for (var i = 0; i < queue.length; ++i) {\n        var item = queue[i];\n        var obj = item.obj[item.prop];\n\n        var keys = Object.keys(obj);\n        for (var j = 0; j < keys.length; ++j) {\n            var key = keys[j];\n            var val = obj[key];\n            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n                queue.push({ obj: obj, prop: key });\n                refs.push(val);\n            }\n        }\n    }\n\n    return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n    if (obj === null || typeof obj === 'undefined') {\n        return false;\n    }\n\n    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n    arrayToObject: arrayToObject,\n    assign: assign,\n    compact: compact,\n    decode: decode,\n    encode: encode,\n    isBuffer: isBuffer,\n    isRegExp: isRegExp,\n    merge: merge\n};\n\n},{}]},{},[2])(2)\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/lib/formats.js",
    "content": "'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n    'default': 'RFC3986',\n    formatters: {\n        RFC1738: function (value) {\n            return replace.call(value, percentTwenties, '+');\n        },\n        RFC3986: function (value) {\n            return String(value);\n        }\n    },\n    RFC1738: 'RFC1738',\n    RFC3986: 'RFC3986'\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/lib/index.js",
    "content": "'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n    formats: formats,\n    parse: parse,\n    stringify: stringify\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/lib/parse.js",
    "content": "'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n    allowDots: false,\n    allowPrototypes: false,\n    arrayLimit: 20,\n    decoder: utils.decode,\n    delimiter: '&',\n    depth: 5,\n    parameterLimit: 1000,\n    plainObjects: false,\n    strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n    var obj = {};\n    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n    var parts = cleanStr.split(options.delimiter, limit);\n\n    for (var i = 0; i < parts.length; ++i) {\n        var part = parts[i];\n\n        var bracketEqualsPos = part.indexOf(']=');\n        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n        var key, val;\n        if (pos === -1) {\n            key = options.decoder(part, defaults.decoder);\n            val = options.strictNullHandling ? null : '';\n        } else {\n            key = options.decoder(part.slice(0, pos), defaults.decoder);\n            val = options.decoder(part.slice(pos + 1), defaults.decoder);\n        }\n        if (has.call(obj, key)) {\n            obj[key] = [].concat(obj[key]).concat(val);\n        } else {\n            obj[key] = val;\n        }\n    }\n\n    return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n    var leaf = val;\n\n    for (var i = chain.length - 1; i >= 0; --i) {\n        var obj;\n        var root = chain[i];\n\n        if (root === '[]' && options.parseArrays) {\n            obj = [].concat(leaf);\n        } else {\n            obj = options.plainObjects ? Object.create(null) : {};\n            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n            var index = parseInt(cleanRoot, 10);\n            if (!options.parseArrays && cleanRoot === '') {\n                obj = { 0: leaf };\n            } else if (\n                !isNaN(index)\n                && root !== cleanRoot\n                && String(index) === cleanRoot\n                && index >= 0\n                && (options.parseArrays && index <= options.arrayLimit)\n            ) {\n                obj = [];\n                obj[index] = leaf;\n            } else if (cleanRoot !== '__proto__') {\n                obj[cleanRoot] = leaf;\n            }\n        }\n\n        leaf = obj;\n    }\n\n    return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n    if (!givenKey) {\n        return;\n    }\n\n    // Transform dot notation to bracket notation\n    var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n    // The regex chunks\n\n    var brackets = /(\\[[^[\\]]*])/;\n    var child = /(\\[[^[\\]]*])/g;\n\n    // Get the parent\n\n    var segment = brackets.exec(key);\n    var parent = segment ? key.slice(0, segment.index) : key;\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (parent) {\n        // If we aren't using plain objects, optionally prefix keys\n        // that would overwrite object prototype properties\n        if (!options.plainObjects && has.call(Object.prototype, parent)) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n\n        keys.push(parent);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n        i += 1;\n        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n        keys.push(segment[1]);\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n        throw new TypeError('Decoder has to be a function.');\n    }\n\n    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n    options.parseArrays = options.parseArrays !== false;\n    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n    if (str === '' || str === null || typeof str === 'undefined') {\n        return options.plainObjects ? Object.create(null) : {};\n    }\n\n    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n    var obj = options.plainObjects ? Object.create(null) : {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var newObj = parseKeys(key, tempObj[key], options);\n        obj = utils.merge(obj, newObj, options);\n    }\n\n    return utils.compact(obj);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/lib/stringify.js",
    "content": "'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\n\nvar arrayPrefixGenerators = {\n    brackets: function brackets(prefix) {\n        return prefix + '[]';\n    },\n    indices: function indices(prefix, key) {\n        return prefix + '[' + key + ']';\n    },\n    repeat: function repeat(prefix) {\n        return prefix;\n    }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n    delimiter: '&',\n    encode: true,\n    encoder: utils.encode,\n    encodeValuesOnly: false,\n    serializeDate: function serializeDate(date) {\n        return toISO.call(date);\n    },\n    skipNulls: false,\n    strictNullHandling: false\n};\n\nvar stringify = function stringify(\n    object,\n    prefix,\n    generateArrayPrefix,\n    strictNullHandling,\n    skipNulls,\n    encoder,\n    filter,\n    sort,\n    allowDots,\n    serializeDate,\n    formatter,\n    encodeValuesOnly\n) {\n    var obj = object;\n    if (typeof filter === 'function') {\n        obj = filter(prefix, obj);\n    } else if (obj instanceof Date) {\n        obj = serializeDate(obj);\n    }\n\n    if (obj === null) {\n        if (strictNullHandling) {\n            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n        }\n\n        obj = '';\n    }\n\n    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n        if (encoder) {\n            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n        }\n        return [formatter(prefix) + '=' + formatter(String(obj))];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys;\n    if (isArray(filter)) {\n        objKeys = filter;\n    } else {\n        var keys = Object.keys(obj);\n        objKeys = sort ? keys.sort(sort) : keys;\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        if (isArray(obj)) {\n            pushToArray(values, stringify(\n                obj[key],\n                generateArrayPrefix(prefix, key),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        } else {\n            pushToArray(values, stringify(\n                obj[key],\n                prefix + (allowDots ? '.' + key : '[' + key + ']'),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        }\n    }\n\n    return values;\n};\n\nmodule.exports = function (object, opts) {\n    var obj = object;\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.encoder !== null && typeof options.encoder !== 'undefined' && typeof options.encoder !== 'function') {\n        throw new TypeError('Encoder has to be a function.');\n    }\n\n    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n    var sort = typeof options.sort === 'function' ? options.sort : null;\n    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n    if (typeof options.format === 'undefined') {\n        options.format = formats['default'];\n    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n        throw new TypeError('Unknown format option provided.');\n    }\n    var formatter = formats.formatters[options.format];\n    var objKeys;\n    var filter;\n\n    if (typeof options.filter === 'function') {\n        filter = options.filter;\n        obj = filter('', obj);\n    } else if (isArray(options.filter)) {\n        filter = options.filter;\n        objKeys = filter;\n    }\n\n    var keys = [];\n\n    if (typeof obj !== 'object' || obj === null) {\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    } else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    } else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n    if (!objKeys) {\n        objKeys = Object.keys(obj);\n    }\n\n    if (sort) {\n        objKeys.sort(sort);\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n        pushToArray(keys, stringify(\n            obj[key],\n            key,\n            generateArrayPrefix,\n            strictNullHandling,\n            skipNulls,\n            encode ? encoder : null,\n            filter,\n            sort,\n            allowDots,\n            serializeDate,\n            formatter,\n            encodeValuesOnly\n        ));\n    }\n\n    var joined = keys.join(delimiter);\n    var prefix = options.addQueryPrefix === true ? '?' : '';\n\n    return joined.length > 0 ? prefix + joined : '';\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/lib/utils.js",
    "content": "'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n    var array = [];\n    for (var i = 0; i < 256; ++i) {\n        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n    }\n\n    return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n    var obj;\n\n    while (queue.length) {\n        var item = queue.pop();\n        obj = item.obj[item.prop];\n\n        if (Array.isArray(obj)) {\n            var compacted = [];\n\n            for (var j = 0; j < obj.length; ++j) {\n                if (typeof obj[j] !== 'undefined') {\n                    compacted.push(obj[j]);\n                }\n            }\n\n            item.obj[item.prop] = compacted;\n        }\n    }\n\n    return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n    var obj = options && options.plainObjects ? Object.create(null) : {};\n    for (var i = 0; i < source.length; ++i) {\n        if (typeof source[i] !== 'undefined') {\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\nvar merge = function merge(target, source, options) {\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        } else if (target && typeof target === 'object') {\n            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {\n                target[source] = true;\n            }\n        } else {\n            return [target, source];\n        }\n\n        return target;\n    }\n\n    if (!target || typeof target !== 'object') {\n        return [target].concat(source);\n    }\n\n    var mergeTarget = target;\n    if (Array.isArray(target) && !Array.isArray(source)) {\n        mergeTarget = arrayToObject(target, options);\n    }\n\n    if (Array.isArray(target) && Array.isArray(source)) {\n        source.forEach(function (item, i) {\n            if (has.call(target, i)) {\n                var targetItem = target[i];\n                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n                    target[i] = merge(targetItem, item, options);\n                } else {\n                    target.push(item);\n                }\n            } else {\n                target[i] = item;\n            }\n        });\n        return target;\n    }\n\n    return Object.keys(source).reduce(function (acc, key) {\n        var value = source[key];\n\n        if (has.call(acc, key)) {\n            acc[key] = merge(acc[key], value, options);\n        } else {\n            acc[key] = value;\n        }\n        return acc;\n    }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n    return Object.keys(source).reduce(function (acc, key) {\n        acc[key] = source[key];\n        return acc;\n    }, target);\n};\n\nvar decode = function (str) {\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\nvar encode = function encode(str) {\n    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n    // It has been adapted here for stricter adherence to RFC 3986\n    if (str.length === 0) {\n        return str;\n    }\n\n    var string = typeof str === 'string' ? str : String(str);\n\n    var out = '';\n    for (var i = 0; i < string.length; ++i) {\n        var c = string.charCodeAt(i);\n\n        if (\n            c === 0x2D // -\n            || c === 0x2E // .\n            || c === 0x5F // _\n            || c === 0x7E // ~\n            || (c >= 0x30 && c <= 0x39) // 0-9\n            || (c >= 0x41 && c <= 0x5A) // a-z\n            || (c >= 0x61 && c <= 0x7A) // A-Z\n        ) {\n            out += string.charAt(i);\n            continue;\n        }\n\n        if (c < 0x80) {\n            out = out + hexTable[c];\n            continue;\n        }\n\n        if (c < 0x800) {\n            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        if (c < 0xD800 || c >= 0xE000) {\n            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        i += 1;\n        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n        /* eslint operator-linebreak: [2, \"before\"] */\n        out += hexTable[0xF0 | (c >> 18)]\n            + hexTable[0x80 | ((c >> 12) & 0x3F)]\n            + hexTable[0x80 | ((c >> 6) & 0x3F)]\n            + hexTable[0x80 | (c & 0x3F)];\n    }\n\n    return out;\n};\n\nvar compact = function compact(value) {\n    var queue = [{ obj: { o: value }, prop: 'o' }];\n    var refs = [];\n\n    for (var i = 0; i < queue.length; ++i) {\n        var item = queue[i];\n        var obj = item.obj[item.prop];\n\n        var keys = Object.keys(obj);\n        for (var j = 0; j < keys.length; ++j) {\n            var key = keys[j];\n            var val = obj[key];\n            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n                queue.push({ obj: obj, prop: key });\n                refs.push(val);\n            }\n        }\n    }\n\n    return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n    if (obj === null || typeof obj === 'undefined') {\n        return false;\n    }\n\n    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n    arrayToObject: arrayToObject,\n    assign: assign,\n    compact: compact,\n    decode: decode,\n    encode: encode,\n    isBuffer: isBuffer,\n    isRegExp: isRegExp,\n    merge: merge\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/package.json",
    "content": "{\n    \"name\": \"qs\",\n    \"description\": \"A querystring parser that supports nesting and arrays, with a depth limit\",\n    \"homepage\": \"https://github.com/ljharb/qs\",\n    \"version\": \"6.5.3\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/ljharb/qs.git\"\n    },\n    \"main\": \"lib/index.js\",\n    \"contributors\": [\n        {\n            \"name\": \"Jordan Harband\",\n            \"email\": \"ljharb@gmail.com\",\n            \"url\": \"http://ljharb.codes\"\n        }\n    ],\n    \"keywords\": [\n        \"querystring\",\n        \"qs\"\n    ],\n    \"engines\": {\n        \"node\": \">=0.6\"\n    },\n    \"devDependencies\": {\n        \"@ljharb/eslint-config\": \"^20.1.0\",\n        \"aud\": \"^1.1.5\",\n        \"browserify\": \"^16.5.2\",\n        \"eclint\": \"^2.8.1\",\n        \"eslint\": \"^8.6.0\",\n        \"evalmd\": \"^0.0.17\",\n        \"iconv-lite\": \"^0.4.24\",\n        \"in-publish\": \"^2.0.1\",\n        \"mkdirp\": \"^0.5.1\",\n        \"nyc\": \"^10.3.2\",\n        \"qs-iconv\": \"^1.0.4\",\n        \"safe-publish-latest\": \"^2.0.0\",\n        \"safer-buffer\": \"^2.1.2\",\n        \"tape\": \"^5.4.0\"\n    },\n    \"scripts\": {\n        \"prepublishOnly\": \"safe-publish-latest && npm run dist\",\n        \"prepublish\": \"not-in-publish || npm run prepublishOnly\",\n        \"pretest\": \"npm run --silent readme && npm run --silent lint\",\n        \"test\": \"npm run --silent tests-only\",\n        \"tests-only\": \"nyc tape 'test/**/*.js'\",\n        \"posttest\": \"aud --production\",\n        \"readme\": \"evalmd README.md\",\n        \"postlint\": \"eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\\\.git')\",\n        \"lint\": \"eslint --ext=js,mjs .\",\n        \"dist\": \"mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js\"\n    },\n    \"license\": \"BSD-3-Clause\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/test/index.js",
    "content": "'use strict';\n\nrequire('./parse');\n\nrequire('./stringify');\n\nrequire('./utils');\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/test/parse.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar qs = require('../');\nvar utils = require('../lib/utils');\nvar iconv = require('iconv-lite');\nvar SaferBuffer = require('safer-buffer').Buffer;\n\ntest('parse()', function (t) {\n    t.test('parses a simple string', function (st) {\n        st.deepEqual(qs.parse('0=foo'), { 0: 'foo' });\n        st.deepEqual(qs.parse('foo=c++'), { foo: 'c  ' });\n        st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } });\n        st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } });\n        st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } });\n        st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null });\n        st.deepEqual(qs.parse('foo'), { foo: '' });\n        st.deepEqual(qs.parse('foo='), { foo: '' });\n        st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' });\n        st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' });\n        st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' });\n        st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' });\n        st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' });\n        st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null });\n        st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' });\n        st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), {\n            cht: 'p3',\n            chd: 't:60,40',\n            chs: '250x100',\n            chl: 'Hello|World'\n        });\n        st.end();\n    });\n\n    t.test('allows enabling dot notation', function (st) {\n        st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' });\n        st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } });\n        st.end();\n    });\n\n    t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string');\n    t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string');\n    t.deepEqual(\n        qs.parse('a[b][c][d][e][f][g][h]=i'),\n        { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } },\n        'defaults to a depth of 5'\n    );\n\n    t.test('only parses one level when depth = 1', function (st) {\n        st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } });\n        st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } });\n        st.end();\n    });\n\n    t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array');\n\n    t.test('parses an explicit array', function (st) {\n        st.deepEqual(qs.parse('a[]=b'), { a: ['b'] });\n        st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] });\n        st.end();\n    });\n\n    t.test('parses a mix of simple and explicit arrays', function (st) {\n        st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] });\n\n        st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] });\n\n        st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] });\n\n        st.end();\n    });\n\n    t.test('parses a nested array', function (st) {\n        st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } });\n        st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } });\n        st.end();\n    });\n\n    t.test('allows to specify array indices', function (st) {\n        st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] });\n        st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] });\n        st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] });\n        st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } });\n        st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] });\n        st.end();\n    });\n\n    t.test('limits specific array indices to arrayLimit', function (st) {\n        st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] });\n        st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } });\n        st.end();\n    });\n\n    t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number');\n\n    t.test('supports encoded = signs', function (st) {\n        st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' });\n        st.end();\n    });\n\n    t.test('is ok with url encoded strings', function (st) {\n        st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } });\n        st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } });\n        st.end();\n    });\n\n    t.test('allows brackets in the value', function (st) {\n        st.deepEqual(qs.parse('pets=[\"tobi\"]'), { pets: '[\"tobi\"]' });\n        st.deepEqual(qs.parse('operators=[\">=\", \"<=\"]'), { operators: '[\">=\", \"<=\"]' });\n        st.end();\n    });\n\n    t.test('allows empty values', function (st) {\n        st.deepEqual(qs.parse(''), {});\n        st.deepEqual(qs.parse(null), {});\n        st.deepEqual(qs.parse(undefined), {});\n        st.end();\n    });\n\n    t.test('transforms arrays to objects', function (st) {\n        st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } });\n        st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } });\n        st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } });\n        st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } });\n        st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } });\n        st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] });\n\n        st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } });\n        st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } });\n        st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } });\n        st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } });\n        st.end();\n    });\n\n    t.test('transforms arrays to objects (dot notation)', function (st) {\n        st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } });\n        st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } });\n        st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } });\n        st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] });\n        st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] });\n        st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } });\n        st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } });\n        st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } });\n        st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } });\n        st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] });\n        st.end();\n    });\n\n    t.test('correctly prunes undefined values when converting an array to an object', function (st) {\n        st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } });\n        st.end();\n    });\n\n    t.test('supports malformed uri characters', function (st) {\n        st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null });\n        st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' });\n        st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' });\n        st.end();\n    });\n\n    t.test('doesn\\'t produce empty keys', function (st) {\n        st.deepEqual(qs.parse('_r=1&'), { _r: '1' });\n        st.end();\n    });\n\n    t.test('cannot access Object prototype', function (st) {\n        qs.parse('constructor[prototype][bad]=bad');\n        qs.parse('bad[constructor][prototype][bad]=bad');\n        st.equal(typeof Object.prototype.bad, 'undefined');\n        st.end();\n    });\n\n    t.test('parses arrays of objects', function (st) {\n        st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] });\n        st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] });\n        st.end();\n    });\n\n    t.test('allows for empty strings in arrays', function (st) {\n        st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] });\n\n        st.deepEqual(\n            qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }),\n            { a: ['b', null, 'c', ''] },\n            'with arrayLimit 20 + array indices: null then empty string works'\n        );\n        st.deepEqual(\n            qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }),\n            { a: ['b', null, 'c', ''] },\n            'with arrayLimit 0 + array brackets: null then empty string works'\n        );\n\n        st.deepEqual(\n            qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }),\n            { a: ['b', '', 'c', null] },\n            'with arrayLimit 20 + array indices: empty string then null works'\n        );\n        st.deepEqual(\n            qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }),\n            { a: ['b', '', 'c', null] },\n            'with arrayLimit 0 + array brackets: empty string then null works'\n        );\n\n        st.deepEqual(\n            qs.parse('a[]=&a[]=b&a[]=c'),\n            { a: ['', 'b', 'c'] },\n            'array brackets: empty strings work'\n        );\n        st.end();\n    });\n\n    t.test('compacts sparse arrays', function (st) {\n        st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] });\n        st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] });\n        st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] });\n        st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] });\n        st.end();\n    });\n\n    t.test('parses semi-parsed strings', function (st) {\n        st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } });\n        st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } });\n        st.end();\n    });\n\n    t.test('parses buffers correctly', function (st) {\n        var b = SaferBuffer.from('test');\n        st.deepEqual(qs.parse({ a: b }), { a: b });\n        st.end();\n    });\n\n    t.test('parses jquery-param strings', function (st) {\n        // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8'\n        var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8';\n        var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] };\n        st.deepEqual(qs.parse(encoded), expected);\n        st.end();\n    });\n\n    t.test('continues parsing when no parent is found', function (st) {\n        st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' });\n        st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' });\n        st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' });\n        st.end();\n    });\n\n    t.test('does not error when parsing a very long array', function (st) {\n        var str = 'a[]=a';\n        while (Buffer.byteLength(str) < 128 * 1024) {\n            str = str + '&' + str;\n        }\n\n        st.doesNotThrow(function () {\n            qs.parse(str);\n        });\n\n        st.end();\n    });\n\n    t.test('should not throw when a native prototype has an enumerable property', function (st) {\n        Object.prototype.crash = '';\n        Array.prototype.crash = '';\n        st.doesNotThrow(qs.parse.bind(null, 'a=b'));\n        st.deepEqual(qs.parse('a=b'), { a: 'b' });\n        st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c'));\n        st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] });\n        delete Object.prototype.crash;\n        delete Array.prototype.crash;\n        st.end();\n    });\n\n    t.test('parses a string with an alternative string delimiter', function (st) {\n        st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' });\n        st.end();\n    });\n\n    t.test('parses a string with an alternative RegExp delimiter', function (st) {\n        st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' });\n        st.end();\n    });\n\n    t.test('does not use non-splittable objects as delimiters', function (st) {\n        st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' });\n        st.end();\n    });\n\n    t.test('allows overriding parameter limit', function (st) {\n        st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' });\n        st.end();\n    });\n\n    t.test('allows setting the parameter limit to Infinity', function (st) {\n        st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' });\n        st.end();\n    });\n\n    t.test('allows overriding array limit', function (st) {\n        st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } });\n        st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } });\n        st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } });\n        st.end();\n    });\n\n    t.test('allows disabling array parsing', function (st) {\n        var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false });\n        st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } });\n        st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array');\n\n        var emptyBrackets = qs.parse('a[]=b', { parseArrays: false });\n        st.deepEqual(emptyBrackets, { a: { 0: 'b' } });\n        st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array');\n\n        st.end();\n    });\n\n    t.test('allows for query string prefix', function (st) {\n        st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' });\n        st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' });\n        st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' });\n        st.end();\n    });\n\n    t.test('parses an object', function (st) {\n        var input = {\n            'user[name]': { 'pop[bob]': 3 },\n            'user[email]': null\n        };\n\n        var expected = {\n            user: {\n                name: { 'pop[bob]': 3 },\n                email: null\n            }\n        };\n\n        var result = qs.parse(input);\n\n        st.deepEqual(result, expected);\n        st.end();\n    });\n\n    t.test('parses an object in dot notation', function (st) {\n        var input = {\n            'user.name': { 'pop[bob]': 3 },\n            'user.email.': null\n        };\n\n        var expected = {\n            user: {\n                name: { 'pop[bob]': 3 },\n                email: null\n            }\n        };\n\n        var result = qs.parse(input, { allowDots: true });\n\n        st.deepEqual(result, expected);\n        st.end();\n    });\n\n    t.test('parses an object and not child values', function (st) {\n        var input = {\n            'user[name]': { 'pop[bob]': { test: 3 } },\n            'user[email]': null\n        };\n\n        var expected = {\n            user: {\n                name: { 'pop[bob]': { test: 3 } },\n                email: null\n            }\n        };\n\n        var result = qs.parse(input);\n\n        st.deepEqual(result, expected);\n        st.end();\n    });\n\n    t.test('does not blow up when Buffer global is missing', function (st) {\n        var tempBuffer = global.Buffer;\n        delete global.Buffer;\n        var result = qs.parse('a=b&c=d');\n        global.Buffer = tempBuffer;\n        st.deepEqual(result, { a: 'b', c: 'd' });\n        st.end();\n    });\n\n    t.test('does not crash when parsing circular references', function (st) {\n        var a = {};\n        a.b = a;\n\n        var parsed;\n\n        st.doesNotThrow(function () {\n            parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a });\n        });\n\n        st.equal('foo' in parsed, true, 'parsed has \"foo\" property');\n        st.equal('bar' in parsed.foo, true);\n        st.equal('baz' in parsed.foo, true);\n        st.equal(parsed.foo.bar, 'baz');\n        st.deepEqual(parsed.foo.baz, a);\n        st.end();\n    });\n\n    t.test('does not crash when parsing deep objects', function (st) {\n        var parsed;\n        var str = 'foo';\n\n        for (var i = 0; i < 5000; i++) {\n            str += '[p]';\n        }\n\n        str += '=bar';\n\n        st.doesNotThrow(function () {\n            parsed = qs.parse(str, { depth: 5000 });\n        });\n\n        st.equal('foo' in parsed, true, 'parsed has \"foo\" property');\n\n        var depth = 0;\n        var ref = parsed.foo;\n        while ((ref = ref.p)) {\n            depth += 1;\n        }\n\n        st.equal(depth, 5000, 'parsed is 5000 properties deep');\n\n        st.end();\n    });\n\n    t.test('parses null objects correctly', { skip: !Object.create }, function (st) {\n        var a = Object.create(null);\n        a.b = 'c';\n\n        st.deepEqual(qs.parse(a), { b: 'c' });\n        var result = qs.parse({ a: a });\n        st.equal('a' in result, true, 'result has \"a\" property');\n        st.deepEqual(result.a, a);\n        st.end();\n    });\n\n    t.test('parses dates correctly', function (st) {\n        var now = new Date();\n        st.deepEqual(qs.parse({ a: now }), { a: now });\n        st.end();\n    });\n\n    t.test('parses regular expressions correctly', function (st) {\n        var re = /^test$/;\n        st.deepEqual(qs.parse({ a: re }), { a: re });\n        st.end();\n    });\n\n    t.test('does not allow overwriting prototype properties', function (st) {\n        st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {});\n        st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {});\n\n        st.deepEqual(\n            qs.parse('toString', { allowPrototypes: false }),\n            {},\n            'bare \"toString\" results in {}'\n        );\n\n        st.end();\n    });\n\n    t.test('can allow overwriting prototype properties', function (st) {\n        st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } });\n        st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' });\n\n        st.deepEqual(\n            qs.parse('toString', { allowPrototypes: true }),\n            { toString: '' },\n            'bare \"toString\" results in { toString: \"\" }'\n        );\n\n        st.end();\n    });\n\n    t.test('params starting with a closing bracket', function (st) {\n        st.deepEqual(qs.parse(']=toString'), { ']': 'toString' });\n        st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' });\n        st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' });\n        st.end();\n    });\n\n    t.test('params starting with a starting bracket', function (st) {\n        st.deepEqual(qs.parse('[=toString'), { '[': 'toString' });\n        st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' });\n        st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' });\n        st.end();\n    });\n\n    t.test('add keys to objects', function (st) {\n        st.deepEqual(\n            qs.parse('a[b]=c&a=d'),\n            { a: { b: 'c', d: true } },\n            'can add keys to objects'\n        );\n\n        st.deepEqual(\n            qs.parse('a[b]=c&a=toString'),\n            { a: { b: 'c' } },\n            'can not overwrite prototype'\n        );\n\n        st.deepEqual(\n            qs.parse('a[b]=c&a=toString', { allowPrototypes: true }),\n            { a: { b: 'c', toString: true } },\n            'can overwrite prototype with allowPrototypes true'\n        );\n\n        st.deepEqual(\n            qs.parse('a[b]=c&a=toString', { plainObjects: true }),\n            { __proto__: null, a: { __proto__: null, b: 'c', toString: true } },\n            'can overwrite prototype with plainObjects true'\n        );\n\n        st.end();\n    });\n\n    t.test('dunder proto is ignored', function (st) {\n        var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42';\n        var result = qs.parse(payload, { allowPrototypes: true });\n\n        st.deepEqual(\n            result,\n            {\n                categories: {\n                    length: '42'\n                }\n            },\n            'silent [[Prototype]] payload'\n        );\n\n        var plainResult = qs.parse(payload, { allowPrototypes: true, plainObjects: true });\n\n        st.deepEqual(\n            plainResult,\n            {\n                __proto__: null,\n                categories: {\n                    __proto__: null,\n                    length: '42'\n                }\n            },\n            'silent [[Prototype]] payload: plain objects'\n        );\n\n        var query = qs.parse('categories[__proto__]=cats&categories[__proto__]=dogs&categories[some][json]=toInject', { allowPrototypes: true });\n\n        st.notOk(Array.isArray(query.categories), 'is not an array');\n        st.notOk(query.categories instanceof Array, 'is not instanceof an array');\n        st.deepEqual(query.categories, { some: { json: 'toInject' } });\n        st.equal(JSON.stringify(query.categories), '{\"some\":{\"json\":\"toInject\"}}', 'stringifies as a non-array');\n\n        st.deepEqual(\n            qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true }),\n            {\n                foo: {\n                    bar: 'stuffs'\n                }\n            },\n            'hidden values'\n        );\n\n        st.deepEqual(\n            qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true, plainObjects: true }),\n            {\n                __proto__: null,\n                foo: {\n                    __proto__: null,\n                    bar: 'stuffs'\n                }\n            },\n            'hidden values: plain objects'\n        );\n\n        st.end();\n    });\n\n    t.test('can return null objects', { skip: !Object.create }, function (st) {\n        var expected = Object.create(null);\n        expected.a = Object.create(null);\n        expected.a.b = 'c';\n        expected.a.hasOwnProperty = 'd';\n        st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected);\n        st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null));\n        var expectedArray = Object.create(null);\n        expectedArray.a = Object.create(null);\n        expectedArray.a[0] = 'b';\n        expectedArray.a.c = 'd';\n        st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray);\n        st.end();\n    });\n\n    t.test('can parse with custom encoding', function (st) {\n        st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', {\n            decoder: function (str) {\n                var reg = /%([0-9A-F]{2})/ig;\n                var result = [];\n                var parts = reg.exec(str);\n                while (parts) {\n                    result.push(parseInt(parts[1], 16));\n                    parts = reg.exec(str);\n                }\n                return String(iconv.decode(SaferBuffer.from(result), 'shift_jis'));\n            }\n        }), { 県: '大阪府' });\n        st.end();\n    });\n\n    t.test('receives the default decoder as a second argument', function (st) {\n        st.plan(1);\n        qs.parse('a', {\n            decoder: function (str, defaultDecoder) {\n                st.equal(defaultDecoder, utils.decode);\n            }\n        });\n        st.end();\n    });\n\n    t.test('throws error with wrong decoder', function (st) {\n        st['throws'](function () {\n            qs.parse({}, { decoder: 'string' });\n        }, new TypeError('Decoder has to be a function.'));\n        st.end();\n    });\n\n    t.test('does not mutate the options argument', function (st) {\n        var options = {};\n        qs.parse('a[b]=true', options);\n        st.deepEqual(options, {});\n        st.end();\n    });\n\n    t.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/test/stringify.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar qs = require('../');\nvar utils = require('../lib/utils');\nvar iconv = require('iconv-lite');\nvar SaferBuffer = require('safer-buffer').Buffer;\n\ntest('stringify()', function (t) {\n    t.test('stringifies a querystring object', function (st) {\n        st.equal(qs.stringify({ a: 'b' }), 'a=b');\n        st.equal(qs.stringify({ a: 1 }), 'a=1');\n        st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2');\n        st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z');\n        st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC');\n        st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80');\n        st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90');\n        st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7');\n        st.end();\n    });\n\n    t.test('stringifies falsy values', function (st) {\n        st.equal(qs.stringify(undefined), '');\n        st.equal(qs.stringify(null), '');\n        st.equal(qs.stringify(null, { strictNullHandling: true }), '');\n        st.equal(qs.stringify(false), '');\n        st.equal(qs.stringify(0), '');\n        st.end();\n    });\n\n    t.test('adds query prefix', function (st) {\n        st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b');\n        st.end();\n    });\n\n    t.test('with query prefix, outputs blank string given an empty object', function (st) {\n        st.equal(qs.stringify({}, { addQueryPrefix: true }), '');\n        st.end();\n    });\n\n    t.test('stringifies nested falsy values', function (st) {\n        st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D=');\n        st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D');\n        st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false');\n        st.end();\n    });\n\n    t.test('stringifies a nested object', function (st) {\n        st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n        st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e');\n        st.end();\n    });\n\n    t.test('stringifies a nested object with dots notation', function (st) {\n        st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c');\n        st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e');\n        st.end();\n    });\n\n    t.test('stringifies an array value', function (st) {\n        st.equal(\n            qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }),\n            'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d',\n            'indices => indices'\n        );\n        st.equal(\n            qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }),\n            'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d',\n            'brackets => brackets'\n        );\n        st.equal(\n            qs.stringify({ a: ['b', 'c', 'd'] }),\n            'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d',\n            'default => indices'\n        );\n        st.end();\n    });\n\n    t.test('omits nulls when asked', function (st) {\n        st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b');\n        st.end();\n    });\n\n    t.test('omits nested nulls when asked', function (st) {\n        st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c');\n        st.end();\n    });\n\n    t.test('omits array indices when asked', function (st) {\n        st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d');\n        st.end();\n    });\n\n    t.test('stringifies a nested array value', function (st) {\n        st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');\n        st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d');\n        st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');\n        st.end();\n    });\n\n    t.test('stringifies a nested array value with dots notation', function (st) {\n        st.equal(\n            qs.stringify(\n                { a: { b: ['c', 'd'] } },\n                { allowDots: true, encode: false, arrayFormat: 'indices' }\n            ),\n            'a.b[0]=c&a.b[1]=d',\n            'indices: stringifies with dots + indices'\n        );\n        st.equal(\n            qs.stringify(\n                { a: { b: ['c', 'd'] } },\n                { allowDots: true, encode: false, arrayFormat: 'brackets' }\n            ),\n            'a.b[]=c&a.b[]=d',\n            'brackets: stringifies with dots + brackets'\n        );\n        st.equal(\n            qs.stringify(\n                { a: { b: ['c', 'd'] } },\n                { allowDots: true, encode: false }\n            ),\n            'a.b[0]=c&a.b[1]=d',\n            'default: stringifies with dots + indices'\n        );\n        st.end();\n    });\n\n    t.test('stringifies an object inside an array', function (st) {\n        st.equal(\n            qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }),\n            'a%5B0%5D%5Bb%5D=c',\n            'indices => brackets'\n        );\n        st.equal(\n            qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }),\n            'a%5B%5D%5Bb%5D=c',\n            'brackets => brackets'\n        );\n        st.equal(\n            qs.stringify({ a: [{ b: 'c' }] }),\n            'a%5B0%5D%5Bb%5D=c',\n            'default => indices'\n        );\n\n        st.equal(\n            qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }),\n            'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1',\n            'indices => indices'\n        );\n\n        st.equal(\n            qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }),\n            'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1',\n            'brackets => brackets'\n        );\n\n        st.equal(\n            qs.stringify({ a: [{ b: { c: [1] } }] }),\n            'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1',\n            'default => indices'\n        );\n\n        st.end();\n    });\n\n    t.test('stringifies an array with mixed objects and primitives', function (st) {\n        st.equal(\n            qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }),\n            'a[0][b]=1&a[1]=2&a[2]=3',\n            'indices => indices'\n        );\n        st.equal(\n            qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }),\n            'a[][b]=1&a[]=2&a[]=3',\n            'brackets => brackets'\n        );\n        st.equal(\n            qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }),\n            'a[0][b]=1&a[1]=2&a[2]=3',\n            'default => indices'\n        );\n\n        st.end();\n    });\n\n    t.test('stringifies an object inside an array with dots notation', function (st) {\n        st.equal(\n            qs.stringify(\n                { a: [{ b: 'c' }] },\n                { allowDots: true, encode: false, arrayFormat: 'indices' }\n            ),\n            'a[0].b=c',\n            'indices => indices'\n        );\n        st.equal(\n            qs.stringify(\n                { a: [{ b: 'c' }] },\n                { allowDots: true, encode: false, arrayFormat: 'brackets' }\n            ),\n            'a[].b=c',\n            'brackets => brackets'\n        );\n        st.equal(\n            qs.stringify(\n                { a: [{ b: 'c' }] },\n                { allowDots: true, encode: false }\n            ),\n            'a[0].b=c',\n            'default => indices'\n        );\n\n        st.equal(\n            qs.stringify(\n                { a: [{ b: { c: [1] } }] },\n                { allowDots: true, encode: false, arrayFormat: 'indices' }\n            ),\n            'a[0].b.c[0]=1',\n            'indices => indices'\n        );\n        st.equal(\n            qs.stringify(\n                { a: [{ b: { c: [1] } }] },\n                { allowDots: true, encode: false, arrayFormat: 'brackets' }\n            ),\n            'a[].b.c[]=1',\n            'brackets => brackets'\n        );\n        st.equal(\n            qs.stringify(\n                { a: [{ b: { c: [1] } }] },\n                { allowDots: true, encode: false }\n            ),\n            'a[0].b.c[0]=1',\n            'default => indices'\n        );\n\n        st.end();\n    });\n\n    t.test('does not omit object keys when indices = false', function (st) {\n        st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c');\n        st.end();\n    });\n\n    t.test('uses indices notation for arrays when indices=true', function (st) {\n        st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c');\n        st.end();\n    });\n\n    t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) {\n        st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c');\n        st.end();\n    });\n\n    t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) {\n        st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c');\n        st.end();\n    });\n\n    t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) {\n        st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c');\n        st.end();\n    });\n\n    t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) {\n        st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c');\n        st.end();\n    });\n\n    t.test('stringifies a complicated object', function (st) {\n        st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e');\n        st.end();\n    });\n\n    t.test('stringifies an empty value', function (st) {\n        st.equal(qs.stringify({ a: '' }), 'a=');\n        st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a');\n\n        st.equal(qs.stringify({ a: '', b: '' }), 'a=&b=');\n        st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b=');\n\n        st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D=');\n        st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D');\n        st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D=');\n\n        st.end();\n    });\n\n    t.test('stringifies a null object', { skip: !Object.create }, function (st) {\n        var obj = Object.create(null);\n        obj.a = 'b';\n        st.equal(qs.stringify(obj), 'a=b');\n        st.end();\n    });\n\n    t.test('returns an empty string for invalid input', function (st) {\n        st.equal(qs.stringify(undefined), '');\n        st.equal(qs.stringify(false), '');\n        st.equal(qs.stringify(null), '');\n        st.equal(qs.stringify(''), '');\n        st.end();\n    });\n\n    t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) {\n        var obj = { a: Object.create(null) };\n\n        obj.a.b = 'c';\n        st.equal(qs.stringify(obj), 'a%5Bb%5D=c');\n        st.end();\n    });\n\n    t.test('drops keys with a value of undefined', function (st) {\n        st.equal(qs.stringify({ a: undefined }), '');\n\n        st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D');\n        st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D=');\n        st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D=');\n        st.end();\n    });\n\n    t.test('url encodes values', function (st) {\n        st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\n        st.end();\n    });\n\n    t.test('stringifies a date', function (st) {\n        var now = new Date();\n        var str = 'a=' + encodeURIComponent(now.toISOString());\n        st.equal(qs.stringify({ a: now }), str);\n        st.end();\n    });\n\n    t.test('stringifies the weird object from qs', function (st) {\n        st.equal(qs.stringify({ 'my weird field': '~q1!2\"\\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F');\n        st.end();\n    });\n\n    t.test('skips properties that are part of the object prototype', function (st) {\n        Object.prototype.crash = 'test';\n        st.equal(qs.stringify({ a: 'b' }), 'a=b');\n        st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');\n        delete Object.prototype.crash;\n        st.end();\n    });\n\n    t.test('stringifies boolean values', function (st) {\n        st.equal(qs.stringify({ a: true }), 'a=true');\n        st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true');\n        st.equal(qs.stringify({ b: false }), 'b=false');\n        st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false');\n        st.end();\n    });\n\n    t.test('stringifies buffer values', function (st) {\n        st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test');\n        st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test');\n        st.end();\n    });\n\n    t.test('stringifies an object using an alternative delimiter', function (st) {\n        st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');\n        st.end();\n    });\n\n    t.test('doesn\\'t blow up when Buffer global is missing', function (st) {\n        var tempBuffer = global.Buffer;\n        delete global.Buffer;\n        var result = qs.stringify({ a: 'b', c: 'd' });\n        global.Buffer = tempBuffer;\n        st.equal(result, 'a=b&c=d');\n        st.end();\n    });\n\n    t.test('selects properties when filter=array', function (st) {\n        st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b');\n        st.equal(qs.stringify({ a: 1 }, { filter: [] }), '');\n\n        st.equal(\n            qs.stringify(\n                { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' },\n                { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' }\n            ),\n            'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3',\n            'indices => indices'\n        );\n        st.equal(\n            qs.stringify(\n                { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' },\n                { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' }\n            ),\n            'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3',\n            'brackets => brackets'\n        );\n        st.equal(\n            qs.stringify(\n                { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' },\n                { filter: ['a', 'b', 0, 2] }\n            ),\n            'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3',\n            'default => indices'\n        );\n\n        st.end();\n    });\n\n    t.test('supports custom representations when filter=function', function (st) {\n        var calls = 0;\n        var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } };\n        var filterFunc = function (prefix, value) {\n            calls += 1;\n            if (calls === 1) {\n                st.equal(prefix, '', 'prefix is empty');\n                st.equal(value, obj);\n            } else if (prefix === 'c') {\n                return void 0;\n            } else if (value instanceof Date) {\n                st.equal(prefix, 'e[f]');\n                return value.getTime();\n            }\n            return value;\n        };\n\n        st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000');\n        st.equal(calls, 5);\n        st.end();\n    });\n\n    t.test('can disable uri encoding', function (st) {\n        st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b');\n        st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c');\n        st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c');\n        st.end();\n    });\n\n    t.test('can sort the keys', function (st) {\n        var sort = function (a, b) {\n            return a.localeCompare(b);\n        };\n        st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y');\n        st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a');\n        st.end();\n    });\n\n    t.test('can sort the keys at depth 3 or more too', function (st) {\n        var sort = function (a, b) {\n            return a.localeCompare(b);\n        };\n        st.equal(\n            qs.stringify(\n                { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' },\n                { sort: sort, encode: false }\n            ),\n            'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb'\n        );\n        st.equal(\n            qs.stringify(\n                { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' },\n                { sort: null, encode: false }\n            ),\n            'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b'\n        );\n        st.end();\n    });\n\n    t.test('can stringify with custom encoding', function (st) {\n        st.equal(qs.stringify({ 県: '大阪府', '': '' }, {\n            encoder: function (str) {\n                if (str.length === 0) {\n                    return '';\n                }\n                var buf = iconv.encode(str, 'shiftjis');\n                var result = [];\n                for (var i = 0; i < buf.length; ++i) {\n                    result.push(buf.readUInt8(i).toString(16));\n                }\n                return '%' + result.join('%');\n            }\n        }), '%8c%a7=%91%e5%8d%e3%95%7b&=');\n        st.end();\n    });\n\n    t.test('receives the default encoder as a second argument', function (st) {\n        st.plan(2);\n        qs.stringify({ a: 1 }, {\n            encoder: function (str, defaultEncoder) {\n                st.equal(defaultEncoder, utils.encode);\n            }\n        });\n        st.end();\n    });\n\n    t.test('throws error with wrong encoder', function (st) {\n        st['throws'](function () {\n            qs.stringify({}, { encoder: 'string' });\n        }, new TypeError('Encoder has to be a function.'));\n        st.end();\n    });\n\n    t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) {\n        st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, {\n            encoder: function (buffer) {\n                if (typeof buffer === 'string') {\n                    return buffer;\n                }\n                return String.fromCharCode(buffer.readUInt8(0) + 97);\n            }\n        }), 'a=b');\n\n        st.equal(qs.stringify({ a: SaferBuffer.from('a b') }, {\n            encoder: function (buffer) {\n                return buffer;\n            }\n        }), 'a=a b');\n        st.end();\n    });\n\n    t.test('serializeDate option', function (st) {\n        var date = new Date();\n        st.equal(\n            qs.stringify({ a: date }),\n            'a=' + date.toISOString().replace(/:/g, '%3A'),\n            'default is toISOString'\n        );\n\n        var mutatedDate = new Date();\n        mutatedDate.toISOString = function () {\n            throw new SyntaxError();\n        };\n        st['throws'](function () {\n            mutatedDate.toISOString();\n        }, SyntaxError);\n        st.equal(\n            qs.stringify({ a: mutatedDate }),\n            'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'),\n            'toISOString works even when method is not locally present'\n        );\n\n        var specificDate = new Date(6);\n        st.equal(\n            qs.stringify(\n                { a: specificDate },\n                { serializeDate: function (d) { return d.getTime() * 7; } }\n            ),\n            'a=42',\n            'custom serializeDate function called'\n        );\n\n        st.end();\n    });\n\n    t.test('RFC 1738 spaces serialization', function (st) {\n        st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c');\n        st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d');\n        st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC1738 }), 'a+b=a+b');\n        st.end();\n    });\n\n    t.test('RFC 3986 spaces serialization', function (st) {\n        st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c');\n        st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d');\n        st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC3986 }), 'a%20b=a%20b');\n        st.end();\n    });\n\n    t.test('Backward compatibility to RFC 3986', function (st) {\n        st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');\n        st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }), 'a%20b=a%20b');\n        st.end();\n    });\n\n    t.test('Edge cases and unknown formats', function (st) {\n        ['UFO1234', false, 1234, null, {}, []].forEach(\n            function (format) {\n                st['throws'](\n                    function () {\n                        qs.stringify({ a: 'b c' }, { format: format });\n                    },\n                    new TypeError('Unknown format option provided.')\n                );\n            }\n        );\n        st.end();\n    });\n\n    t.test('encodeValuesOnly', function (st) {\n        st.equal(\n            qs.stringify(\n                { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },\n                { encodeValuesOnly: true }\n            ),\n            'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'\n        );\n        st.equal(\n            qs.stringify(\n                { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] }\n            ),\n            'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h'\n        );\n        st.end();\n    });\n\n    t.test('encodeValuesOnly - strictNullHandling', function (st) {\n        st.equal(\n            qs.stringify(\n                { a: { b: null } },\n                { encodeValuesOnly: true, strictNullHandling: true }\n            ),\n            'a[b]'\n        );\n        st.end();\n    });\n\n    t.test('does not mutate the options argument', function (st) {\n        var options = {};\n        qs.stringify({}, options);\n        st.deepEqual(options, {});\n        st.end();\n    });\n\n    t.test('strictNullHandling works with custom filter', function (st) {\n        var filter = function (prefix, value) {\n            return value;\n        };\n\n        var options = { strictNullHandling: true, filter: filter };\n        st.equal(qs.stringify({ key: null }, options), 'key');\n        st.end();\n    });\n\n    t.test('strictNullHandling works with null serializeDate', function (st) {\n        var serializeDate = function () {\n            return null;\n        };\n        var options = { strictNullHandling: true, serializeDate: serializeDate };\n        var date = new Date();\n        st.equal(qs.stringify({ key: date }, options), 'key');\n        st.end();\n    });\n\n    t.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/qs/test/utils.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar utils = require('../lib/utils');\n\ntest('merge()', function (t) {\n    t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null');\n\n    t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array');\n\n    t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key');\n\n    var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } });\n    t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array');\n\n    var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } });\n    t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array');\n\n    var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' });\n    t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array');\n\n    var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] });\n    t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] });\n\n    var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar');\n    t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true });\n\n    t.test(\n        'avoids invoking array setters unnecessarily',\n        { skip: typeof Object.defineProperty !== 'function' },\n        function (st) {\n            var setCount = 0;\n            var getCount = 0;\n            var observed = [];\n            Object.defineProperty(observed, 0, {\n                get: function () {\n                    getCount += 1;\n                    return { bar: 'baz' };\n                },\n                set: function () { setCount += 1; }\n            });\n            utils.merge(observed, [null]);\n            st.equal(setCount, 0);\n            st.equal(getCount, 1);\n            observed[0] = observed[0]; // eslint-disable-line no-self-assign\n            st.equal(setCount, 1);\n            st.equal(getCount, 2);\n            st.end();\n        }\n    );\n\n    t.end();\n});\n\ntest('assign()', function (t) {\n    var target = { a: 1, b: 2 };\n    var source = { b: 3, c: 4 };\n    var result = utils.assign(target, source);\n\n    t.equal(result, target, 'returns the target');\n    t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged');\n    t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched');\n\n    t.end();\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/.npmignore",
    "content": "node_modules\ncoverage\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/.travis.yml",
    "content": "sudo: false\nlanguage: node_js\nnode_js:\n  - \"4\"\n  - \"iojs\"\n  - \"0.12\"\n  - \"0.10\"\nscript:\n  - \"npm run test-travis\"\nafter_script:\n  - \"npm install coveralls@2 && cat coverage/lcov.info | coveralls\"\nmatrix:\n  fast_finish: true\nnotifications:\n  irc:\n    channels:\n      - \"irc.freenode.org#unshift\"\n    on_success: change\n    on_failure: change\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Unshift.io, Arnout Kazemier,  the Contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/README.md",
    "content": "# requires-port\n\n[![Made by unshift](https://img.shields.io/badge/made%20by-unshift-00ffcc.svg?style=flat-square)](http://unshift.io)[![Version npm](http://img.shields.io/npm/v/requires-port.svg?style=flat-square)](http://browsenpm.org/package/requires-port)[![Build Status](http://img.shields.io/travis/unshiftio/requires-port/master.svg?style=flat-square)](https://travis-ci.org/unshiftio/requires-port)[![Dependencies](https://img.shields.io/david/unshiftio/requires-port.svg?style=flat-square)](https://david-dm.org/unshiftio/requires-port)[![Coverage Status](http://img.shields.io/coveralls/unshiftio/requires-port/master.svg?style=flat-square)](https://coveralls.io/r/unshiftio/requires-port?branch=master)[![IRC channel](http://img.shields.io/badge/IRC-irc.freenode.net%23unshift-00a8ff.svg?style=flat-square)](http://webchat.freenode.net/?channels=unshift)\n\nThe module name says it all, check if a protocol requires a given port.\n\n## Installation\n\nThis module is intended to be used with browserify or Node.js and is distributed\nin the public npm registry. To install it simply run the following command from\nyour CLI:\n\n```j\nnpm install --save requires-port\n```\n\n## Usage\n\nThe module exports it self as function and requires 2 arguments:\n\n1. The port number, can be a string or number.\n2. Protocol, can be `http`, `http:` or even `https://yomoma.com`. We just split\n   it at `:` and use the first result. We currently accept the following\n   protocols:\n   - `http`\n   - `https`\n   - `ws`\n   - `wss`\n   - `ftp`\n   - `gopher`\n   - `file`\n\nIt returns a boolean that indicates if protocol requires this port to be added\nto your URL.\n\n```js\n'use strict';\n\nvar required = require('requires-port');\n\nconsole.log(required('8080', 'http')) // true\nconsole.log(required('80', 'http'))   // false\n```\n\n# License\n\nMIT\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/index.js",
    "content": "'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n  protocol = protocol.split(':')[0];\n  port = +port;\n\n  if (!port) return false;\n\n  switch (protocol) {\n    case 'http':\n    case 'ws':\n    return port !== 80;\n\n    case 'https':\n    case 'wss':\n    return port !== 443;\n\n    case 'ftp':\n    return port !== 21;\n\n    case 'gopher':\n    return port !== 70;\n\n    case 'file':\n    return false;\n  }\n\n  return port !== 0;\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/package.json",
    "content": "{\n  \"name\": \"requires-port\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Check if a protocol requires a certain port number to be added to an URL.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"100%\": \"istanbul check-coverage --statements 100 --functions 100 --lines 100 --branches 100\",\n    \"test-travis\": \"istanbul cover _mocha --report lcovonly -- test.js\",\n    \"coverage\": \"istanbul cover _mocha -- test.js\",\n    \"watch\": \"mocha --watch test.js\",\n    \"test\": \"mocha test.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/unshiftio/requires-port\"\n  },\n  \"keywords\": [\n    \"port\",\n    \"require\",\n    \"http\",\n    \"https\",\n    \"ws\",\n    \"wss\",\n    \"gopher\",\n    \"file\",\n    \"ftp\",\n    \"requires\",\n    \"requried\",\n    \"portnumber\",\n    \"url\",\n    \"parsing\",\n    \"validation\",\n    \"cows\"\n  ],\n  \"author\": \"Arnout Kazemier\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/unshiftio/requires-port/issues\"\n  },\n  \"homepage\": \"https://github.com/unshiftio/requires-port\",\n  \"devDependencies\": {\n    \"assume\": \"1.3.x\",\n    \"istanbul\": \"0.4.x\",\n    \"mocha\": \"2.3.x\",\n    \"pre-commit\": \"1.1.x\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/requires-port/test.js",
    "content": "describe('requires-port', function () {\n  'use strict';\n\n  var assume = require('assume')\n    , required = require('./');\n\n  it('is exported as a function', function () {\n    assume(required).is.a('function');\n  });\n\n  it('does not require empty ports', function () {\n    assume(required('', 'http')).false();\n    assume(required('', 'wss')).false();\n    assume(required('', 'ws')).false();\n    assume(required('', 'cowsack')).false();\n  });\n\n  it('assumes true for unknown protocols',function () {\n    assume(required('808', 'foo')).true();\n    assume(required('80', 'bar')).true();\n  });\n\n  it('never requires port numbers for file', function () {\n    assume(required(8080, 'file')).false();\n  });\n\n  it('does not require port 80 for http', function () {\n    assume(required('80', 'http')).false();\n    assume(required(80, 'http')).false();\n    assume(required(80, 'http://')).false();\n    assume(required(80, 'http://www.google.com')).false();\n\n    assume(required('8080', 'http')).true();\n    assume(required(8080, 'http')).true();\n    assume(required(8080, 'http://')).true();\n    assume(required(8080, 'http://www.google.com')).true();\n  });\n\n  it('does not require port 80 for ws', function () {\n    assume(required('80', 'ws')).false();\n    assume(required(80, 'ws')).false();\n    assume(required(80, 'ws://')).false();\n    assume(required(80, 'ws://www.google.com')).false();\n\n    assume(required('8080', 'ws')).true();\n    assume(required(8080, 'ws')).true();\n    assume(required(8080, 'ws://')).true();\n    assume(required(8080, 'ws://www.google.com')).true();\n  });\n\n  it('does not require port 443 for https', function () {\n    assume(required('443', 'https')).false();\n    assume(required(443, 'https')).false();\n    assume(required(443, 'https://')).false();\n    assume(required(443, 'https://www.google.com')).false();\n\n    assume(required('8080', 'https')).true();\n    assume(required(8080, 'https')).true();\n    assume(required(8080, 'https://')).true();\n    assume(required(8080, 'https://www.google.com')).true();\n  });\n\n  it('does not require port 443 for wss', function () {\n    assume(required('443', 'wss')).false();\n    assume(required(443, 'wss')).false();\n    assume(required(443, 'wss://')).false();\n    assume(required(443, 'wss://www.google.com')).false();\n\n    assume(required('8080', 'wss')).true();\n    assume(required(8080, 'wss')).true();\n    assume(required(8080, 'wss://')).true();\n    assume(required(8080, 'wss://www.google.com')).true();\n  });\n\n  it('does not require port 21 for ftp', function () {\n    assume(required('21', 'ftp')).false();\n    assume(required(21, 'ftp')).false();\n    assume(required(21, 'ftp://')).false();\n    assume(required(21, 'ftp://www.google.com')).false();\n\n    assume(required('8080', 'ftp')).true();\n    assume(required(8080, 'ftp')).true();\n    assume(required(8080, 'ftp://')).true();\n    assume(required(8080, 'ftp://www.google.com')).true();\n  });\n\n  it('does not require port 70 for gopher', function () {\n    assume(required('70', 'gopher')).false();\n    assume(required(70, 'gopher')).false();\n    assume(required(70, 'gopher://')).false();\n    assume(required(70, 'gopher://www.google.com')).false();\n\n    assume(required('8080', 'gopher')).true();\n    assume(required(8080, 'gopher')).true();\n    assume(required(8080, 'gopher://')).true();\n    assume(required(8080, 'gopher://www.google.com')).true();\n  });\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safe-buffer/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Feross Aboukhadijeh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safe-buffer/README.md",
    "content": "# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]\n\n[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg\n[travis-url]: https://travis-ci.org/feross/safe-buffer\n[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg\n[npm-url]: https://npmjs.org/package/safe-buffer\n[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg\n[downloads-url]: https://npmjs.org/package/safe-buffer\n[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg\n[standard-url]: https://standardjs.com\n\n#### Safer Node.js Buffer API\n\n**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`,\n`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.**\n\n**Uses the built-in implementation when available.**\n\n## install\n\n```\nnpm install safe-buffer\n```\n\n## usage\n\nThe goal of this package is to provide a safe replacement for the node.js `Buffer`.\n\nIt's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to\nthe top of your node.js modules:\n\n```js\nvar Buffer = require('safe-buffer').Buffer\n\n// Existing buffer code will continue to work without issues:\n\nnew Buffer('hey', 'utf8')\nnew Buffer([1, 2, 3], 'utf8')\nnew Buffer(obj)\nnew Buffer(16) // create an uninitialized buffer (potentially unsafe)\n\n// But you can use these new explicit APIs to make clear what you want:\n\nBuffer.from('hey', 'utf8') // convert from many types to a Buffer\nBuffer.alloc(16) // create a zero-filled buffer (safe)\nBuffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe)\n```\n\n## api\n\n### Class Method: Buffer.from(array)\n<!-- YAML\nadded: v3.0.0\n-->\n\n* `array` {Array}\n\nAllocates a new `Buffer` using an `array` of octets.\n\n```js\nconst buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]);\n  // creates a new Buffer containing ASCII bytes\n  // ['b','u','f','f','e','r']\n```\n\nA `TypeError` will be thrown if `array` is not an `Array`.\n\n### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])\n<!-- YAML\nadded: v5.10.0\n-->\n\n* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or\n  a `new ArrayBuffer()`\n* `byteOffset` {Number} Default: `0`\n* `length` {Number} Default: `arrayBuffer.length - byteOffset`\n\nWhen passed a reference to the `.buffer` property of a `TypedArray` instance,\nthe newly created `Buffer` will share the same allocated memory as the\nTypedArray.\n\n```js\nconst arr = new Uint16Array(2);\narr[0] = 5000;\narr[1] = 4000;\n\nconst buf = Buffer.from(arr.buffer); // shares the memory with arr;\n\nconsole.log(buf);\n  // Prints: <Buffer 88 13 a0 0f>\n\n// changing the TypedArray changes the Buffer also\narr[1] = 6000;\n\nconsole.log(buf);\n  // Prints: <Buffer 88 13 70 17>\n```\n\nThe optional `byteOffset` and `length` arguments specify a memory range within\nthe `arrayBuffer` that will be shared by the `Buffer`.\n\n```js\nconst ab = new ArrayBuffer(10);\nconst buf = Buffer.from(ab, 0, 2);\nconsole.log(buf.length);\n  // Prints: 2\n```\n\nA `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`.\n\n### Class Method: Buffer.from(buffer)\n<!-- YAML\nadded: v3.0.0\n-->\n\n* `buffer` {Buffer}\n\nCopies the passed `buffer` data onto a new `Buffer` instance.\n\n```js\nconst buf1 = Buffer.from('buffer');\nconst buf2 = Buffer.from(buf1);\n\nbuf1[0] = 0x61;\nconsole.log(buf1.toString());\n  // 'auffer'\nconsole.log(buf2.toString());\n  // 'buffer' (copy is not changed)\n```\n\nA `TypeError` will be thrown if `buffer` is not a `Buffer`.\n\n### Class Method: Buffer.from(str[, encoding])\n<!-- YAML\nadded: v5.10.0\n-->\n\n* `str` {String} String to encode.\n* `encoding` {String} Encoding to use, Default: `'utf8'`\n\nCreates a new `Buffer` containing the given JavaScript string `str`. If\nprovided, the `encoding` parameter identifies the character encoding.\nIf not provided, `encoding` defaults to `'utf8'`.\n\n```js\nconst buf1 = Buffer.from('this is a tést');\nconsole.log(buf1.toString());\n  // prints: this is a tést\nconsole.log(buf1.toString('ascii'));\n  // prints: this is a tC)st\n\nconst buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');\nconsole.log(buf2.toString());\n  // prints: this is a tést\n```\n\nA `TypeError` will be thrown if `str` is not a string.\n\n### Class Method: Buffer.alloc(size[, fill[, encoding]])\n<!-- YAML\nadded: v5.10.0\n-->\n\n* `size` {Number}\n* `fill` {Value} Default: `undefined`\n* `encoding` {String} Default: `utf8`\n\nAllocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the\n`Buffer` will be *zero-filled*.\n\n```js\nconst buf = Buffer.alloc(5);\nconsole.log(buf);\n  // <Buffer 00 00 00 00 00>\n```\n\nThe `size` must be less than or equal to the value of\n`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is\n`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will\nbe created if a `size` less than or equal to 0 is specified.\n\nIf `fill` is specified, the allocated `Buffer` will be initialized by calling\n`buf.fill(fill)`. See [`buf.fill()`][] for more information.\n\n```js\nconst buf = Buffer.alloc(5, 'a');\nconsole.log(buf);\n  // <Buffer 61 61 61 61 61>\n```\n\nIf both `fill` and `encoding` are specified, the allocated `Buffer` will be\ninitialized by calling `buf.fill(fill, encoding)`. For example:\n\n```js\nconst buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');\nconsole.log(buf);\n  // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>\n```\n\nCalling `Buffer.alloc(size)` can be significantly slower than the alternative\n`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance\ncontents will *never contain sensitive data*.\n\nA `TypeError` will be thrown if `size` is not a number.\n\n### Class Method: Buffer.allocUnsafe(size)\n<!-- YAML\nadded: v5.10.0\n-->\n\n* `size` {Number}\n\nAllocates a new *non-zero-filled* `Buffer` of `size` bytes.  The `size` must\nbe less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit\narchitectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is\nthrown. A zero-length Buffer will be created if a `size` less than or equal to\n0 is specified.\n\nThe underlying memory for `Buffer` instances created in this way is *not\ninitialized*. The contents of the newly created `Buffer` are unknown and\n*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such\n`Buffer` instances to zeroes.\n\n```js\nconst buf = Buffer.allocUnsafe(5);\nconsole.log(buf);\n  // <Buffer 78 e0 82 02 01>\n  // (octets will be different, every time)\nbuf.fill(0);\nconsole.log(buf);\n  // <Buffer 00 00 00 00 00>\n```\n\nA `TypeError` will be thrown if `size` is not a number.\n\nNote that the `Buffer` module pre-allocates an internal `Buffer` instance of\nsize `Buffer.poolSize` that is used as a pool for the fast allocation of new\n`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated\n`new Buffer(size)` constructor) only when `size` is less than or equal to\n`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default\nvalue of `Buffer.poolSize` is `8192` but can be modified.\n\nUse of this pre-allocated internal memory pool is a key difference between\ncalling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.\nSpecifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer\npool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal\nBuffer pool if `size` is less than or equal to half `Buffer.poolSize`. The\ndifference is subtle but can be important when an application requires the\nadditional performance that `Buffer.allocUnsafe(size)` provides.\n\n### Class Method: Buffer.allocUnsafeSlow(size)\n<!-- YAML\nadded: v5.10.0\n-->\n\n* `size` {Number}\n\nAllocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes.  The\n`size` must be less than or equal to the value of\n`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is\n`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will\nbe created if a `size` less than or equal to 0 is specified.\n\nThe underlying memory for `Buffer` instances created in this way is *not\ninitialized*. The contents of the newly created `Buffer` are unknown and\n*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such\n`Buffer` instances to zeroes.\n\nWhen using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,\nallocations under 4KB are, by default, sliced from a single pre-allocated\n`Buffer`. This allows applications to avoid the garbage collection overhead of\ncreating many individually allocated Buffers. This approach improves both\nperformance and memory usage by eliminating the need to track and cleanup as\nmany `Persistent` objects.\n\nHowever, in the case where a developer may need to retain a small chunk of\nmemory from a pool for an indeterminate amount of time, it may be appropriate\nto create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then\ncopy out the relevant bits.\n\n```js\n// need to keep around a few small chunks of memory\nconst store = [];\n\nsocket.on('readable', () => {\n  const data = socket.read();\n  // allocate for retained data\n  const sb = Buffer.allocUnsafeSlow(10);\n  // copy the data into the new allocation\n  data.copy(sb, 0, 0, 10);\n  store.push(sb);\n});\n```\n\nUse of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after*\na developer has observed undue memory retention in their applications.\n\nA `TypeError` will be thrown if `size` is not a number.\n\n### All the Rest\n\nThe rest of the `Buffer` API is exactly the same as in node.js.\n[See the docs](https://nodejs.org/api/buffer.html).\n\n\n## Related links\n\n- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660)\n- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4)\n\n## Why is `Buffer` unsafe?\n\nToday, the node.js `Buffer` constructor is overloaded to handle many different argument\ntypes like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.),\n`ArrayBuffer`, and also `Number`.\n\nThe API is optimized for convenience: you can throw any type at it, and it will try to do\nwhat you want.\n\nBecause the Buffer constructor is so powerful, you often see code like this:\n\n```js\n// Convert UTF-8 strings to hex\nfunction toHex (str) {\n  return new Buffer(str).toString('hex')\n}\n```\n\n***But what happens if `toHex` is called with a `Number` argument?***\n\n### Remote Memory Disclosure\n\nIf an attacker can make your program call the `Buffer` constructor with a `Number`\nargument, then they can make it allocate uninitialized memory from the node.js process.\nThis could potentially disclose TLS private keys, user data, or database passwords.\n\nWhen the `Buffer` constructor is passed a `Number` argument, it returns an\n**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like\nthis, you **MUST** overwrite the contents before returning it to the user.\n\nFrom the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size):\n\n> `new Buffer(size)`\n>\n> - `size` Number\n>\n> The underlying memory for `Buffer` instances created in this way is not initialized.\n> **The contents of a newly created `Buffer` are unknown and could contain sensitive\n> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes.\n\n(Emphasis our own.)\n\nWhenever the programmer intended to create an uninitialized `Buffer` you often see code\nlike this:\n\n```js\nvar buf = new Buffer(16)\n\n// Immediately overwrite the uninitialized buffer with data from another buffer\nfor (var i = 0; i < buf.length; i++) {\n  buf[i] = otherBuf[i]\n}\n```\n\n\n### Would this ever be a problem in real code?\n\nYes. It's surprisingly common to forget to check the type of your variables in a\ndynamically-typed language like JavaScript.\n\nUsually the consequences of assuming the wrong type is that your program crashes with an\nuncaught exception. But the failure mode for forgetting to check the type of arguments to\nthe `Buffer` constructor is more catastrophic.\n\nHere's an example of a vulnerable service that takes a JSON payload and converts it to\nhex:\n\n```js\n// Take a JSON payload {str: \"some string\"} and convert it to hex\nvar server = http.createServer(function (req, res) {\n  var data = ''\n  req.setEncoding('utf8')\n  req.on('data', function (chunk) {\n    data += chunk\n  })\n  req.on('end', function () {\n    var body = JSON.parse(data)\n    res.end(new Buffer(body.str).toString('hex'))\n  })\n})\n\nserver.listen(8080)\n```\n\nIn this example, an http client just has to send:\n\n```json\n{\n  \"str\": 1000\n}\n```\n\nand it will get back 1,000 bytes of uninitialized memory from the server.\n\nThis is a very serious bug. It's similar in severity to the\n[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process\nmemory by remote attackers.\n\n\n### Which real-world packages were vulnerable?\n\n#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht)\n\n[Mathias Buus](https://github.com/mafintosh) and I\n([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages,\n[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow\nanyone on the internet to send a series of messages to a user of `bittorrent-dht` and get\nthem to reveal 20 bytes at a time of uninitialized memory from the node.js process.\n\nHere's\n[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8)\nthat fixed it. We released a new fixed version, created a\n[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all\nvulnerable versions on npm so users will get a warning to upgrade to a newer version.\n\n#### [`ws`](https://www.npmjs.com/package/ws)\n\nThat got us wondering if there were other vulnerable packages. Sure enough, within a short\nperiod of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the\nmost popular WebSocket implementation in node.js.\n\nIf certain APIs were called with `Number` parameters instead of `String` or `Buffer` as\nexpected, then uninitialized server memory would be disclosed to the remote peer.\n\nThese were the vulnerable methods:\n\n```js\nsocket.send(number)\nsocket.ping(number)\nsocket.pong(number)\n```\n\nHere's a vulnerable socket server with some echo functionality:\n\n```js\nserver.on('connection', function (socket) {\n  socket.on('message', function (message) {\n    message = JSON.parse(message)\n    if (message.type === 'echo') {\n      socket.send(message.data) // send back the user's message\n    }\n  })\n})\n```\n\n`socket.send(number)` called on the server, will disclose server memory.\n\nHere's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue\nwas fixed, with a more detailed explanation. Props to\n[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the\n[Node Security Project disclosure](https://nodesecurity.io/advisories/67).\n\n\n### What's the solution?\n\nIt's important that node.js offers a fast way to get memory otherwise performance-critical\napplications would needlessly get a lot slower.\n\nBut we need a better way to *signal our intent* as programmers. **When we want\nuninitialized memory, we should request it explicitly.**\n\nSensitive functionality should not be packed into a developer-friendly API that loosely\naccepts many different types. This type of API encourages the lazy practice of passing\nvariables in without checking the type very carefully.\n\n#### A new API: `Buffer.allocUnsafe(number)`\n\nThe functionality of creating buffers with uninitialized memory should be part of another\nAPI. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that\nfrequently gets user input of all sorts of different types passed into it.\n\n```js\nvar buf = Buffer.allocUnsafe(16) // careful, uninitialized memory!\n\n// Immediately overwrite the uninitialized buffer with data from another buffer\nfor (var i = 0; i < buf.length; i++) {\n  buf[i] = otherBuf[i]\n}\n```\n\n\n### How do we fix node.js core?\n\nWe sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as\n`semver-major`) which defends against one case:\n\n```js\nvar str = 16\nnew Buffer(str, 'utf8')\n```\n\nIn this situation, it's implied that the programmer intended the first argument to be a\nstring, since they passed an encoding as a second argument. Today, node.js will allocate\nuninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not\nwhat the programmer intended.\n\nBut this is only a partial solution, since if the programmer does `new Buffer(variable)`\n(without an `encoding` parameter) there's no way to know what they intended. If `variable`\nis sometimes a number, then uninitialized memory will sometimes be returned.\n\n### What's the real long-term fix?\n\nWe could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when\nwe need uninitialized memory. But that would break 1000s of packages.\n\n~~We believe the best solution is to:~~\n\n~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~\n\n~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~\n\n#### Update\n\nWe now support adding three new APIs:\n\n- `Buffer.from(value)` - convert from any type to a buffer\n- `Buffer.alloc(size)` - create a zero-filled buffer\n- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size\n\nThis solves the core problem that affected `ws` and `bittorrent-dht` which is\n`Buffer(variable)` getting tricked into taking a number argument.\n\nThis way, existing code continues working and the impact on the npm ecosystem will be\nminimal. Over time, npm maintainers can migrate performance-critical code to use\n`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`.\n\n\n### Conclusion\n\nWe think there's a serious design issue with the `Buffer` API as it exists today. It\npromotes insecure software by putting high-risk functionality into a convenient API\nwith friendly \"developer ergonomics\".\n\nThis wasn't merely a theoretical exercise because we found the issue in some of the\nmost popular npm packages.\n\nFortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of\n`buffer`.\n\n```js\nvar Buffer = require('safe-buffer').Buffer\n```\n\nEventually, we hope that node.js core can switch to this new, safer behavior. We believe\nthe impact on the ecosystem would be minimal since it's not a breaking change.\nWell-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while\nolder, insecure packages would magically become safe from this attack vector.\n\n\n## links\n\n- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514)\n- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67)\n- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68)\n\n\n## credit\n\nThe original issues in `bittorrent-dht`\n([disclosure](https://nodesecurity.io/advisories/68)) and\n`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by\n[Mathias Buus](https://github.com/mafintosh) and\n[Feross Aboukhadijeh](http://feross.org/).\n\nThanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues\nand for his work running the [Node Security Project](https://nodesecurity.io/).\n\nThanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and\nauditing the code.\n\n\n## license\n\nMIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org)\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safe-buffer/index.d.ts",
    "content": "declare module \"safe-buffer\" {\n  export class Buffer {\n    length: number\n    write(string: string, offset?: number, length?: number, encoding?: string): number;\n    toString(encoding?: string, start?: number, end?: number): string;\n    toJSON(): { type: 'Buffer', data: any[] };\n    equals(otherBuffer: Buffer): boolean;\n    compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;\n    copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;\n    slice(start?: number, end?: number): Buffer;\n    writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;\n    writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;\n    writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;\n    writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;\n    readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number;\n    readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number;\n    readIntLE(offset: number, byteLength: number, noAssert?: boolean): number;\n    readIntBE(offset: number, byteLength: number, noAssert?: boolean): number;\n    readUInt8(offset: number, noAssert?: boolean): number;\n    readUInt16LE(offset: number, noAssert?: boolean): number;\n    readUInt16BE(offset: number, noAssert?: boolean): number;\n    readUInt32LE(offset: number, noAssert?: boolean): number;\n    readUInt32BE(offset: number, noAssert?: boolean): number;\n    readInt8(offset: number, noAssert?: boolean): number;\n    readInt16LE(offset: number, noAssert?: boolean): number;\n    readInt16BE(offset: number, noAssert?: boolean): number;\n    readInt32LE(offset: number, noAssert?: boolean): number;\n    readInt32BE(offset: number, noAssert?: boolean): number;\n    readFloatLE(offset: number, noAssert?: boolean): number;\n    readFloatBE(offset: number, noAssert?: boolean): number;\n    readDoubleLE(offset: number, noAssert?: boolean): number;\n    readDoubleBE(offset: number, noAssert?: boolean): number;\n    swap16(): Buffer;\n    swap32(): Buffer;\n    swap64(): Buffer;\n    writeUInt8(value: number, offset: number, noAssert?: boolean): number;\n    writeUInt16LE(value: number, offset: number, noAssert?: boolean): number;\n    writeUInt16BE(value: number, offset: number, noAssert?: boolean): number;\n    writeUInt32LE(value: number, offset: number, noAssert?: boolean): number;\n    writeUInt32BE(value: number, offset: number, noAssert?: boolean): number;\n    writeInt8(value: number, offset: number, noAssert?: boolean): number;\n    writeInt16LE(value: number, offset: number, noAssert?: boolean): number;\n    writeInt16BE(value: number, offset: number, noAssert?: boolean): number;\n    writeInt32LE(value: number, offset: number, noAssert?: boolean): number;\n    writeInt32BE(value: number, offset: number, noAssert?: boolean): number;\n    writeFloatLE(value: number, offset: number, noAssert?: boolean): number;\n    writeFloatBE(value: number, offset: number, noAssert?: boolean): number;\n    writeDoubleLE(value: number, offset: number, noAssert?: boolean): number;\n    writeDoubleBE(value: number, offset: number, noAssert?: boolean): number;\n    fill(value: any, offset?: number, end?: number): this;\n    indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;\n    lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;\n    includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean;\n\n    /**\n     * Allocates a new buffer containing the given {str}.\n     *\n     * @param str String to store in buffer.\n     * @param encoding encoding to use, optional.  Default is 'utf8'\n     */\n     constructor (str: string, encoding?: string);\n    /**\n     * Allocates a new buffer of {size} octets.\n     *\n     * @param size count of octets to allocate.\n     */\n    constructor (size: number);\n    /**\n     * Allocates a new buffer containing the given {array} of octets.\n     *\n     * @param array The octets to store.\n     */\n    constructor (array: Uint8Array);\n    /**\n     * Produces a Buffer backed by the same allocated memory as\n     * the given {ArrayBuffer}.\n     *\n     *\n     * @param arrayBuffer The ArrayBuffer with which to share memory.\n     */\n    constructor (arrayBuffer: ArrayBuffer);\n    /**\n     * Allocates a new buffer containing the given {array} of octets.\n     *\n     * @param array The octets to store.\n     */\n    constructor (array: any[]);\n    /**\n     * Copies the passed {buffer} data onto a new {Buffer} instance.\n     *\n     * @param buffer The buffer to copy.\n     */\n    constructor (buffer: Buffer);\n    prototype: Buffer;\n    /**\n     * Allocates a new Buffer using an {array} of octets.\n     *\n     * @param array\n     */\n    static from(array: any[]): Buffer;\n    /**\n     * When passed a reference to the .buffer property of a TypedArray instance,\n     * the newly created Buffer will share the same allocated memory as the TypedArray.\n     * The optional {byteOffset} and {length} arguments specify a memory range\n     * within the {arrayBuffer} that will be shared by the Buffer.\n     *\n     * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer()\n     * @param byteOffset\n     * @param length\n     */\n    static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;\n    /**\n     * Copies the passed {buffer} data onto a new Buffer instance.\n     *\n     * @param buffer\n     */\n    static from(buffer: Buffer): Buffer;\n    /**\n     * Creates a new Buffer containing the given JavaScript string {str}.\n     * If provided, the {encoding} parameter identifies the character encoding.\n     * If not provided, {encoding} defaults to 'utf8'.\n     *\n     * @param str\n     */\n    static from(str: string, encoding?: string): Buffer;\n    /**\n     * Returns true if {obj} is a Buffer\n     *\n     * @param obj object to test.\n     */\n    static isBuffer(obj: any): obj is Buffer;\n    /**\n     * Returns true if {encoding} is a valid encoding argument.\n     * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex'\n     *\n     * @param encoding string to test.\n     */\n    static isEncoding(encoding: string): boolean;\n    /**\n     * Gives the actual byte length of a string. encoding defaults to 'utf8'.\n     * This is not the same as String.prototype.length since that returns the number of characters in a string.\n     *\n     * @param string string to test.\n     * @param encoding encoding used to evaluate (defaults to 'utf8')\n     */\n    static byteLength(string: string, encoding?: string): number;\n    /**\n     * Returns a buffer which is the result of concatenating all the buffers in the list together.\n     *\n     * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer.\n     * If the list has exactly one item, then the first item of the list is returned.\n     * If the list has more than one item, then a new Buffer is created.\n     *\n     * @param list An array of Buffer objects to concatenate\n     * @param totalLength Total length of the buffers when concatenated.\n     *   If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly.\n     */\n    static concat(list: Buffer[], totalLength?: number): Buffer;\n    /**\n     * The same as buf1.compare(buf2).\n     */\n    static compare(buf1: Buffer, buf2: Buffer): number;\n    /**\n     * Allocates a new buffer of {size} octets.\n     *\n     * @param size count of octets to allocate.\n     * @param fill if specified, buffer will be initialized by calling buf.fill(fill).\n     *    If parameter is omitted, buffer will be filled with zeros.\n     * @param encoding encoding used for call to buf.fill while initalizing\n     */\n    static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer;\n    /**\n     * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents\n     * of the newly created Buffer are unknown and may contain sensitive data.\n     *\n     * @param size count of octets to allocate\n     */\n    static allocUnsafe(size: number): Buffer;\n    /**\n     * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents\n     * of the newly created Buffer are unknown and may contain sensitive data.\n     *\n     * @param size count of octets to allocate\n     */\n    static allocUnsafeSlow(size: number): Buffer;\n  }\n}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safe-buffer/index.js",
    "content": "/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safe-buffer/package.json",
    "content": "{\n  \"name\": \"safe-buffer\",\n  \"description\": \"Safer Node.js Buffer API\",\n  \"version\": \"5.1.2\",\n  \"author\": {\n    \"name\": \"Feross Aboukhadijeh\",\n    \"email\": \"feross@feross.org\",\n    \"url\": \"http://feross.org\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/feross/safe-buffer/issues\"\n  },\n  \"devDependencies\": {\n    \"standard\": \"*\",\n    \"tape\": \"^4.0.0\"\n  },\n  \"homepage\": \"https://github.com/feross/safe-buffer\",\n  \"keywords\": [\n    \"buffer\",\n    \"buffer allocate\",\n    \"node security\",\n    \"safe\",\n    \"safe-buffer\",\n    \"security\",\n    \"uninitialized\"\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"index.js\",\n  \"types\": \"index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/feross/safe-buffer.git\"\n  },\n  \"scripts\": {\n    \"test\": \"standard && tape test/*.js\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Nikita Skovoroda <chalkerx@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/Porting-Buffer.md",
    "content": "# Porting to the Buffer.from/Buffer.alloc API\n\n<a id=\"overview\"></a>\n## Overview\n\n- [Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.](#variant-1) (*recommended*)\n- [Variant 2: Use a polyfill](#variant-2)\n- [Variant 3: manual detection, with safeguards](#variant-3)\n\n### Finding problematic bits of code using grep\n\nJust run `grep -nrE '[^a-zA-Z](Slow)?Buffer\\s*\\(' --exclude-dir node_modules`.\n\nIt will find all the potentially unsafe places in your own code (with some considerably unlikely\nexceptions).\n\n### Finding problematic bits of code using Node.js 8\n\nIf you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code:\n\n- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js.\n- `--trace-deprecation` does the same thing, but only for deprecation warnings.\n- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8.\n\nYou can set these flags using an environment variable:\n\n```console\n$ export NODE_OPTIONS='--trace-warnings --pending-deprecation'\n$ cat example.js\n'use strict';\nconst foo = new Buffer('foo');\n$ node example.js\n(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead.\n    at showFlaggedDeprecation (buffer.js:127:13)\n    at new Buffer (buffer.js:148:3)\n    at Object.<anonymous> (/path/to/example.js:2:13)\n    [... more stack trace lines ...]\n```\n\n### Finding problematic bits of code using linters\n\nEslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)\nor\n[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)\nalso find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets.\n\nThere is a drawback, though, that it doesn't always\n[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is\noverriden e.g. with a polyfill, so recommended is a combination of this and some other method\ndescribed above.\n\n<a id=\"variant-1\"></a>\n## Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.\n\nThis is the recommended solution nowadays that would imply only minimal overhead.\n\nThe Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible.\n\nWhat you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way:\n\n- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`.\n- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`).\n- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`.\n\nNote that `Buffer.alloc()` is also _faster_ on the current Node.js versions than\n`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling.\n\nEnabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)\nor\n[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)\nis recommended to avoid accidential unsafe Buffer API usage.\n\nThere is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005)\nfor automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`.\nNote that it currently only works with cases where the arguments are literals or where the\nconstructor is invoked with two arguments.\n\n_If you currently support those older Node.js versions and dropping them would be a semver-major change\nfor you, or if you support older branches of your packages, consider using [Variant 2](#variant-2)\nor [Variant 3](#variant-3) on older branches, so people using those older branches will also receive\nthe fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and\nyour users will not observe a runtime deprecation warning when running your code on Node.js 10._\n\n<a id=\"variant-2\"></a>\n## Variant 2: Use a polyfill\n\nUtilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older\nNode.js versions.\n\nYou would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill\n`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api.\n\nMake sure that you do not use old `new Buffer` API — in any files where the line above is added,\nusing old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though.\n\nAlternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or\n[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) —\nthose are great, the only downsides being 4 deps in the tree and slightly more code changes to\nmigrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only\n`Buffer.from` polyfilled — `buffer-from` alone which comes with no extra dependencies.\n\n_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) — it also\nprovides a polyfill, but takes a different approach which has\n[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you\nto also use the older `new Buffer()` API in your code, though — but that's arguably a benefit, as\nit is problematic, can cause issues in your code, and will start emitting runtime deprecation\nwarnings starting with Node.js 10._\n\nNote that in either case, it is important that you also remove all calls to the old Buffer\nAPI manually — just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides\na polyfill for the new API. I have seen people doing that mistake.\n\nEnabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)\nor\n[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)\nis recommended.\n\n_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._\n\n<a id=\"variant-3\"></a>\n## Variant 3 — manual detection, with safeguards\n\nThis is useful if you create Buffer instances in only a few places (e.g. one), or you have your own\nwrapper around them.\n\n### Buffer(0)\n\nThis special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which\nreturns the same result all the way down to Node.js 0.8.x.\n\n### Buffer(notNumber)\n\nBefore:\n\n```js\nvar buf = new Buffer(notNumber, encoding);\n```\n\nAfter:\n\n```js\nvar buf;\nif (Buffer.from && Buffer.from !== Uint8Array.from) {\n  buf = Buffer.from(notNumber, encoding);\n} else {\n  if (typeof notNumber === 'number')\n    throw new Error('The \"size\" argument must be of type number.');\n  buf = new Buffer(notNumber, encoding);\n}\n```\n\n`encoding` is optional.\n\nNote that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not\nhard-coded) and _is not caused by the deprecation of Buffer constructor_ — it's exactly _why_ the\nBuffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous\nsecurity issues — situations when unsanitized user input could end up in the `Buffer(arg)` create\nproblems ranging from DoS to leaking sensitive information to the attacker from the process memory.\n\nWhen `notNumber` argument is hardcoded (e.g. literal `\"abc\"` or `[0,1,2]`), the `typeof` check can\nbe omitted.\n\nAlso note that using TypeScript does not fix this problem for you — when libs written in\n`TypeScript` are used from JS, or when user input ends up there — it behaves exactly as pure JS, as\nall type checks are translation-time only and are not present in the actual JS code which TS\ncompiles to.\n\n### Buffer(number)\n\nFor Node.js 0.10.x (and below) support:\n\n```js\nvar buf;\nif (Buffer.alloc) {\n  buf = Buffer.alloc(number);\n} else {\n  buf = new Buffer(number);\n  buf.fill(0);\n}\n```\n\nOtherwise (Node.js ≥ 0.12.x):\n\n```js\nconst buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0);\n```\n\n## Regarding Buffer.allocUnsafe\n\nBe extra cautious when using `Buffer.allocUnsafe`:\n * Don't use it if you don't have a good reason to\n   * e.g. you probably won't ever see a performance difference for small buffers, in fact, those\n     might be even faster with `Buffer.alloc()`,\n   * if your code is not in the hot code path — you also probably won't notice a difference,\n   * keep in mind that zero-filling minimizes the potential risks.\n * If you use it, make sure that you never return the buffer in a partially-filled state,\n   * if you are writing to it sequentially — always truncate it to the actuall written length\n\nErrors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues,\nranged from undefined behaviour of your code to sensitive data (user input, passwords, certs)\nleaking to the remote attacker.\n\n_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js\nversion (and lacking type checks also adds DoS to the list of potential problems)._\n\n<a id=\"faq\"></a>\n## FAQ\n\n<a id=\"design-flaws\"></a>\n### What is wrong with the `Buffer` constructor?\n\nThe `Buffer` constructor could be used to create a buffer in many different ways:\n\n- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained\n  *arbitrary memory* for performance reasons, which could include anything ranging from\n  program source code to passwords and encryption keys.\n- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of\n  the string `'abc'`. A second argument could specify another encoding: For example,\n  `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original\n  sequence of bytes that it represents.\n- There are several other combinations of arguments.\n\nThis meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell\nwhat exactly the contents of the generated buffer are* without knowing the type of `foo`.\n\nSometimes, the value of `foo` comes from an external source. For example, this function\ncould be exposed as a service on a web server, converting a UTF-8 string into its Base64 form:\n\n```\nfunction stringToBase64(req, res) {\n  // The request body should have the format of `{ string: 'foobar' }`\n  const rawBytes = new Buffer(req.body.string)\n  const encoded = rawBytes.toString('base64')\n  res.end({ encoded: encoded })\n}\n```\n\nNote that this code does *not* validate the type of `req.body.string`:\n\n- `req.body.string` is expected to be a string. If this is the case, all goes well.\n- `req.body.string` is controlled by the client that sends the request.\n- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes:\n  - Before Node.js 8, the content would be uninitialized\n  - After Node.js 8, the content would be `50` bytes with the value `0`\n\nBecause of the missing type check, an attacker could intentionally send a number\nas part of the request. Using this, they can either:\n\n- Read uninitialized memory. This **will** leak passwords, encryption keys and other\n  kinds of sensitive information. (Information leak)\n- Force the program to allocate a large amount of memory. For example, when specifying\n  `500000000` as the input value, each request will allocate 500MB of memory.\n  This can be used to either exhaust the memory available of a program completely\n  and make it crash, or slow it down significantly. (Denial of Service)\n\nBoth of these scenarios are considered serious security issues in a real-world\nweb server context.\n\nwhen using `Buffer.from(req.body.string)` instead, passing a number will always\nthrow an exception instead, giving a controlled behaviour that can always be\nhandled by the program.\n\n<a id=\"ecosystem-usage\"></a>\n### The `Buffer()` constructor has been deprecated for a while. Is this really an issue?\n\nSurveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still\nwidely used. This includes new code, and overall usage of such code has actually been\n*increasing*.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/Readme.md",
    "content": "# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url]\n\n[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master\n[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer\n[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg\n[npm-url]: https://npmjs.org/package/safer-buffer\n[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg\n[standard-url]: https://standardjs.com\n[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg\n[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md\n\nModern Buffer API polyfill without footguns, working on Node.js from 0.8 to current.\n\n## How to use?\n\nFirst, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API.\n\nThen, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use\n`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new\nBuffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._\n\nAlso, see the\n[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide.\n\n## Do I need it?\n\nHopefully, not — dropping support for outdated Node.js versions should be fine nowdays, and that\nis the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()`\nthough.\n\nSee the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md)\nfor a better description.\n\n## Why not [safe-buffer](https://npmjs.com/safe-buffer)?\n\n_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and\nitself contains footguns._\n\n`safe-buffer` could be used safely to get the new API while still keeping support for older\nNode.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API\nI found out that `safe-buffer` is itself causing problems in some cases.\n\nFor example, consider the following snippet:\n\n```console\n$ cat example.unsafe.js\nconsole.log(Buffer(20))\n$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js\n<Buffer 0a 00 00 00 00 00 00 00 28 13 de 02 00 00 00 00 05 00 00 00>\n$ standard example.unsafe.js\nstandard: Use JavaScript Standard Style (https://standardjs.com)\n  /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead.\n```\n\nThis is allocates and writes to console an uninitialized chunk of memory.\n[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people\nto avoid using unsafe API.\n\nLet's now throw in `safe-buffer`!\n\n```console\n$ cat example.safe-buffer.js\nconst Buffer = require('safe-buffer').Buffer\nconsole.log(Buffer(20))\n$ standard example.safe-buffer.js\n$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js\n<Buffer 08 00 00 00 00 00 00 00 28 58 01 82 fe 7f 00 00 00 00 00 00>\n```\n\nSee the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior\nremains identiсal to what we had before, and when launched on Node.js 6.x LTS — this dumps out\nchunks of uninitialized memory.\n_And this code will still emit runtime warnings on Node.js 10.x and above._\n\nThat was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or\nemitting warnings on it, but that significantly diverges from `safe-buffer` design. After some\ndiscussion, it was decided to move my approach into a separate package, and _this is that separate\npackage_.\n\nThis footgun is not imaginary — I observed top-downloaded packages doing that kind of thing,\n«fixing» the lint warning by blindly including `safe-buffer` without any actual changes.\n\nAlso in some cases, even if the API _was_ migrated to use of safe Buffer API — a random pull request\ncan bring unsafe Buffer API usage back to the codebase by adding new calls — and that could go\nunnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even\npass CI. _I also observed that being done in popular packages._\n\nSome examples:\n * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31)\n   (a module with 548 759 downloads/month),\n * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61)\n   (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)),\n * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c)\n   (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)),\n * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec)\n   (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)),\n * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1)\n   (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)).\n * And there are a lot more over the ecosystem.\n\nI filed a PR at\n[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to\npartially fix that (for cases when that lint rule is used), but it is a semver-major change for\nlinter rules and presets, so it would take significant time for that to reach actual setups.\n_It also hasn't been released yet (2018-03-20)._\n\nAlso, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake.\nIt still supports it with an explicit concern barier, by placing it under\n`require('safer-buffer/dangereous')`.\n\n## But isn't throwing bad?\n\nNot really. It's an error that could be noticed and fixed early, instead of causing havoc later like\nunguarded `new Buffer()` calls that end up receiving user input can do.\n\nThis package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so\nit is really simple to keep track of things and make sure that you don't mix old API usage with that.\nAlso, CI should hint anything that you might have missed.\n\nNew commits, if tested, won't land new usage of unsafe Buffer API this way.\n_Node.js 10.x also deals with that by printing a runtime depecation warning._\n\n### Would it affect third-party modules?\n\nNo, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`.\nDon't do that.\n\n### But I don't want throwing…\n\nThat is also fine!\n\nAlso, it could be better in some cases when you don't comprehensive enough test coverage.\n\nIn that case — just don't override `Buffer` and use\n`var SaferBuffer = require('safer-buffer').Buffer` instead.\n\nThat way, everything using `Buffer` natively would still work, but there would be two drawbacks:\n\n* `Buffer.from`/`Buffer.alloc` won't be polyfilled — use `SaferBuffer.from` and\n  `SaferBuffer.alloc` instead.\n* You are still open to accidentally using the insecure deprecated API — use a linter to catch that.\n\nNote that using a linter to catch accidential `Buffer` constructor usage in this case is strongly\nrecommended. `Buffer` is not overriden in this usecase, so linters won't get confused.\n\n## «Without footguns»?\n\nWell, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property\non older versions and duping things from there. You shouldn't do that in your code, probabably.\n\nThe intention is to remove the most significant footguns that affect lots of packages in the\necosystem, and to do it in the proper way.\n\nAlso, this package doesn't protect against security issues affecting some Node.js versions, so for\nusage in your own production code, it is still recommended to update to a Node.js version\n[supported by upstream](https://github.com/nodejs/release#release-schedule).\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/dangerous.js",
    "content": "/* eslint-disable node/no-deprecated-api */\n\n'use strict'\n\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\nvar safer = require('./safer.js')\nvar Safer = safer.Buffer\n\nvar dangerous = {}\n\nvar key\n\nfor (key in safer) {\n  if (!safer.hasOwnProperty(key)) continue\n  dangerous[key] = safer[key]\n}\n\nvar Dangereous = dangerous.Buffer = {}\n\n// Copy Safer API\nfor (key in Safer) {\n  if (!Safer.hasOwnProperty(key)) continue\n  Dangereous[key] = Safer[key]\n}\n\n// Copy those missing unsafe methods, if they are present\nfor (key in Buffer) {\n  if (!Buffer.hasOwnProperty(key)) continue\n  if (Dangereous.hasOwnProperty(key)) continue\n  Dangereous[key] = Buffer[key]\n}\n\nif (!Dangereous.allocUnsafe) {\n  Dangereous.allocUnsafe = function (size) {\n    if (typeof size !== 'number') {\n      throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n    }\n    if (size < 0 || size >= 2 * (1 << 30)) {\n      throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n    }\n    return Buffer(size)\n  }\n}\n\nif (!Dangereous.allocUnsafeSlow) {\n  Dangereous.allocUnsafeSlow = function (size) {\n    if (typeof size !== 'number') {\n      throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n    }\n    if (size < 0 || size >= 2 * (1 << 30)) {\n      throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n    }\n    return buffer.SlowBuffer(size)\n  }\n}\n\nmodule.exports = dangerous\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/package.json",
    "content": "{\n  \"name\": \"safer-buffer\",\n  \"version\": \"2.1.2\",\n  \"description\": \"Modern Buffer API polyfill without footguns\",\n  \"main\": \"safer.js\",\n  \"scripts\": {\n    \"browserify-test\": \"browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js\",\n    \"test\": \"standard && tape tests.js\"\n  },\n  \"author\": {\n    \"name\": \"Nikita Skovoroda\",\n    \"email\": \"chalkerx@gmail.com\",\n    \"url\": \"https://github.com/ChALkeR\"\n  },\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/ChALkeR/safer-buffer.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/ChALkeR/safer-buffer/issues\"\n  },\n  \"devDependencies\": {\n    \"standard\": \"^11.0.1\",\n    \"tape\": \"^4.9.0\"\n  },\n  \"files\": [\n    \"Porting-Buffer.md\",\n    \"Readme.md\",\n    \"tests.js\",\n    \"dangerous.js\",\n    \"safer.js\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/safer.js",
    "content": "/* eslint-disable node/no-deprecated-api */\n\n'use strict'\n\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\nvar safer = {}\n\nvar key\n\nfor (key in buffer) {\n  if (!buffer.hasOwnProperty(key)) continue\n  if (key === 'SlowBuffer' || key === 'Buffer') continue\n  safer[key] = buffer[key]\n}\n\nvar Safer = safer.Buffer = {}\nfor (key in Buffer) {\n  if (!Buffer.hasOwnProperty(key)) continue\n  if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue\n  Safer[key] = Buffer[key]\n}\n\nsafer.Buffer.prototype = Buffer.prototype\n\nif (!Safer.from || Safer.from === Uint8Array.from) {\n  Safer.from = function (value, encodingOrOffset, length) {\n    if (typeof value === 'number') {\n      throw new TypeError('The \"value\" argument must not be of type number. Received type ' + typeof value)\n    }\n    if (value && typeof value.length === 'undefined') {\n      throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)\n    }\n    return Buffer(value, encodingOrOffset, length)\n  }\n}\n\nif (!Safer.alloc) {\n  Safer.alloc = function (size, fill, encoding) {\n    if (typeof size !== 'number') {\n      throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n    }\n    if (size < 0 || size >= 2 * (1 << 30)) {\n      throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n    }\n    var buf = Buffer(size)\n    if (!fill || fill.length === 0) {\n      buf.fill(0)\n    } else if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n    return buf\n  }\n}\n\nif (!safer.kStringMaxLength) {\n  try {\n    safer.kStringMaxLength = process.binding('buffer').kStringMaxLength\n  } catch (e) {\n    // we can't determine kStringMaxLength in environments where process.binding\n    // is unsupported, so let's not set it\n  }\n}\n\nif (!safer.constants) {\n  safer.constants = {\n    MAX_LENGTH: safer.kMaxLength\n  }\n  if (safer.kStringMaxLength) {\n    safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength\n  }\n}\n\nmodule.exports = safer\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/safer-buffer/tests.js",
    "content": "/* eslint-disable node/no-deprecated-api */\n\n'use strict'\n\nvar test = require('tape')\n\nvar buffer = require('buffer')\n\nvar index = require('./')\nvar safer = require('./safer')\nvar dangerous = require('./dangerous')\n\n/* Inheritance tests */\n\ntest('Default is Safer', function (t) {\n  t.equal(index, safer)\n  t.notEqual(safer, dangerous)\n  t.notEqual(index, dangerous)\n  t.end()\n})\n\ntest('Is not a function', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.equal(typeof impl, 'object')\n    t.equal(typeof impl.Buffer, 'object')\n  });\n  [buffer].forEach(function (impl) {\n    t.equal(typeof impl, 'object')\n    t.equal(typeof impl.Buffer, 'function')\n  })\n  t.end()\n})\n\ntest('Constructor throws', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.throws(function () { impl.Buffer() })\n    t.throws(function () { impl.Buffer(0) })\n    t.throws(function () { impl.Buffer('a') })\n    t.throws(function () { impl.Buffer('a', 'utf-8') })\n    t.throws(function () { return new impl.Buffer() })\n    t.throws(function () { return new impl.Buffer(0) })\n    t.throws(function () { return new impl.Buffer('a') })\n    t.throws(function () { return new impl.Buffer('a', 'utf-8') })\n  })\n  t.end()\n})\n\ntest('Safe methods exist', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.equal(typeof impl.Buffer.alloc, 'function', 'alloc')\n    t.equal(typeof impl.Buffer.from, 'function', 'from')\n  })\n  t.end()\n})\n\ntest('Unsafe methods exist only in Dangerous', function (t) {\n  [index, safer].forEach(function (impl) {\n    t.equal(typeof impl.Buffer.allocUnsafe, 'undefined')\n    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined')\n  });\n  [dangerous].forEach(function (impl) {\n    t.equal(typeof impl.Buffer.allocUnsafe, 'function')\n    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function')\n  })\n  t.end()\n})\n\ntest('Generic methods/properties are defined and equal', function (t) {\n  ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) {\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl.Buffer[method], buffer.Buffer[method], method)\n      t.notEqual(typeof impl.Buffer[method], 'undefined', method)\n    })\n  })\n  t.end()\n})\n\ntest('Built-in buffer static methods/properties are inherited', function (t) {\n  Object.keys(buffer).forEach(function (method) {\n    if (method === 'SlowBuffer' || method === 'Buffer') return;\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl[method], buffer[method], method)\n      t.notEqual(typeof impl[method], 'undefined', method)\n    })\n  })\n  t.end()\n})\n\ntest('Built-in Buffer static methods/properties are inherited', function (t) {\n  Object.keys(buffer.Buffer).forEach(function (method) {\n    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl.Buffer[method], buffer.Buffer[method], method)\n      t.notEqual(typeof impl.Buffer[method], 'undefined', method)\n    })\n  })\n  t.end()\n})\n\ntest('.prototype property of Buffer is inherited', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype')\n    t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype')\n  })\n  t.end()\n})\n\ntest('All Safer methods are present in Dangerous', function (t) {\n  Object.keys(safer).forEach(function (method) {\n    if (method === 'Buffer') return;\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl[method], safer[method], method)\n      if (method !== 'kStringMaxLength') {\n        t.notEqual(typeof impl[method], 'undefined', method)\n      }\n    })\n  })\n  Object.keys(safer.Buffer).forEach(function (method) {\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl.Buffer[method], safer.Buffer[method], method)\n      t.notEqual(typeof impl.Buffer[method], 'undefined', method)\n    })\n  })\n  t.end()\n})\n\ntest('Safe methods from Dangerous methods are present in Safer', function (t) {\n  Object.keys(dangerous).forEach(function (method) {\n    if (method === 'Buffer') return;\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl[method], dangerous[method], method)\n      if (method !== 'kStringMaxLength') {\n        t.notEqual(typeof impl[method], 'undefined', method)\n      }\n    })\n  })\n  Object.keys(dangerous.Buffer).forEach(function (method) {\n    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;\n    [index, safer, dangerous].forEach(function (impl) {\n      t.equal(impl.Buffer[method], dangerous.Buffer[method], method)\n      t.notEqual(typeof impl.Buffer[method], 'undefined', method)\n    })\n  })\n  t.end()\n})\n\n/* Behaviour tests */\n\ntest('Methods return Buffers', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0)))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10)))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10)))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64')))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3])))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3]))))\n    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([])))\n  });\n  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {\n    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0)))\n    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10)))\n  })\n  t.end()\n})\n\ntest('Constructor is buffer.Buffer', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer)\n    t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer)\n    t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer)\n    t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from('').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from('string').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer)\n    t.equal(impl.Buffer.from([]).constructor, buffer.Buffer)\n  });\n  [0, 10, 100].forEach(function (arg) {\n    t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer)\n    t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor)\n  })\n  t.end()\n})\n\ntest('Invalid calls throw', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.throws(function () { impl.Buffer.from(0) })\n    t.throws(function () { impl.Buffer.from(10) })\n    t.throws(function () { impl.Buffer.from(10, 'utf-8') })\n    t.throws(function () { impl.Buffer.from('string', 'invalid encoding') })\n    t.throws(function () { impl.Buffer.from(-10) })\n    t.throws(function () { impl.Buffer.from(1e90) })\n    t.throws(function () { impl.Buffer.from(Infinity) })\n    t.throws(function () { impl.Buffer.from(-Infinity) })\n    t.throws(function () { impl.Buffer.from(NaN) })\n    t.throws(function () { impl.Buffer.from(null) })\n    t.throws(function () { impl.Buffer.from(undefined) })\n    t.throws(function () { impl.Buffer.from() })\n    t.throws(function () { impl.Buffer.from({}) })\n    t.throws(function () { impl.Buffer.alloc('') })\n    t.throws(function () { impl.Buffer.alloc('string') })\n    t.throws(function () { impl.Buffer.alloc('string', 'utf-8') })\n    t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') })\n    t.throws(function () { impl.Buffer.alloc(-10) })\n    t.throws(function () { impl.Buffer.alloc(1e90) })\n    t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) })\n    t.throws(function () { impl.Buffer.alloc(Infinity) })\n    t.throws(function () { impl.Buffer.alloc(-Infinity) })\n    t.throws(function () { impl.Buffer.alloc(null) })\n    t.throws(function () { impl.Buffer.alloc(undefined) })\n    t.throws(function () { impl.Buffer.alloc() })\n    t.throws(function () { impl.Buffer.alloc([]) })\n    t.throws(function () { impl.Buffer.alloc([0, 42, 3]) })\n    t.throws(function () { impl.Buffer.alloc({}) })\n  });\n  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {\n    t.throws(function () { dangerous.Buffer[method]('') })\n    t.throws(function () { dangerous.Buffer[method]('string') })\n    t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') })\n    t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) })\n    t.throws(function () { dangerous.Buffer[method](Infinity) })\n    if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) {\n      t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0')\n    } else {\n      t.throws(function () { dangerous.Buffer[method](-10) })\n      t.throws(function () { dangerous.Buffer[method](-1e90) })\n      t.throws(function () { dangerous.Buffer[method](-Infinity) })\n    }\n    t.throws(function () { dangerous.Buffer[method](null) })\n    t.throws(function () { dangerous.Buffer[method](undefined) })\n    t.throws(function () { dangerous.Buffer[method]() })\n    t.throws(function () { dangerous.Buffer[method]([]) })\n    t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) })\n    t.throws(function () { dangerous.Buffer[method]({}) })\n  })\n  t.end()\n})\n\ntest('Buffers have appropriate lengths', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.equal(impl.Buffer.alloc(0).length, 0)\n    t.equal(impl.Buffer.alloc(10).length, 10)\n    t.equal(impl.Buffer.from('').length, 0)\n    t.equal(impl.Buffer.from('string').length, 6)\n    t.equal(impl.Buffer.from('string', 'utf-8').length, 6)\n    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11)\n    t.equal(impl.Buffer.from([0, 42, 3]).length, 3)\n    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3)\n    t.equal(impl.Buffer.from([]).length, 0)\n  });\n  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {\n    t.equal(dangerous.Buffer[method](0).length, 0)\n    t.equal(dangerous.Buffer[method](10).length, 10)\n  })\n  t.end()\n})\n\ntest('Buffers have appropriate lengths (2)', function (t) {\n  t.equal(index.Buffer.alloc, safer.Buffer.alloc)\n  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)\n  var ok = true;\n  [ safer.Buffer.alloc,\n    dangerous.Buffer.allocUnsafe,\n    dangerous.Buffer.allocUnsafeSlow\n  ].forEach(function (method) {\n    for (var i = 0; i < 1e2; i++) {\n      var length = Math.round(Math.random() * 1e5)\n      var buf = method(length)\n      if (!buffer.Buffer.isBuffer(buf)) ok = false\n      if (buf.length !== length) ok = false\n    }\n  })\n  t.ok(ok)\n  t.end()\n})\n\ntest('.alloc(size) is zero-filled and has correct length', function (t) {\n  t.equal(index.Buffer.alloc, safer.Buffer.alloc)\n  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)\n  var ok = true\n  for (var i = 0; i < 1e2; i++) {\n    var length = Math.round(Math.random() * 2e6)\n    var buf = index.Buffer.alloc(length)\n    if (!buffer.Buffer.isBuffer(buf)) ok = false\n    if (buf.length !== length) ok = false\n    var j\n    for (j = 0; j < length; j++) {\n      if (buf[j] !== 0) ok = false\n    }\n    buf.fill(1)\n    for (j = 0; j < length; j++) {\n      if (buf[j] !== 1) ok = false\n    }\n  }\n  t.ok(ok)\n  t.end()\n})\n\ntest('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) {\n  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {\n    var ok = true\n    for (var i = 0; i < 1e2; i++) {\n      var length = Math.round(Math.random() * 2e6)\n      var buf = dangerous.Buffer[method](length)\n      if (!buffer.Buffer.isBuffer(buf)) ok = false\n      if (buf.length !== length) ok = false\n      buf.fill(0, 0, length)\n      var j\n      for (j = 0; j < length; j++) {\n        if (buf[j] !== 0) ok = false\n      }\n      buf.fill(1, 0, length)\n      for (j = 0; j < length; j++) {\n        if (buf[j] !== 1) ok = false\n      }\n    }\n    t.ok(ok, method)\n  })\n  t.end()\n})\n\ntest('.alloc(size, fill) is `fill`-filled', function (t) {\n  t.equal(index.Buffer.alloc, safer.Buffer.alloc)\n  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)\n  var ok = true\n  for (var i = 0; i < 1e2; i++) {\n    var length = Math.round(Math.random() * 2e6)\n    var fill = Math.round(Math.random() * 255)\n    var buf = index.Buffer.alloc(length, fill)\n    if (!buffer.Buffer.isBuffer(buf)) ok = false\n    if (buf.length !== length) ok = false\n    for (var j = 0; j < length; j++) {\n      if (buf[j] !== fill) ok = false\n    }\n  }\n  t.ok(ok)\n  t.end()\n})\n\ntest('.alloc(size, fill) is `fill`-filled', function (t) {\n  t.equal(index.Buffer.alloc, safer.Buffer.alloc)\n  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)\n  var ok = true\n  for (var i = 0; i < 1e2; i++) {\n    var length = Math.round(Math.random() * 2e6)\n    var fill = Math.round(Math.random() * 255)\n    var buf = index.Buffer.alloc(length, fill)\n    if (!buffer.Buffer.isBuffer(buf)) ok = false\n    if (buf.length !== length) ok = false\n    for (var j = 0; j < length; j++) {\n      if (buf[j] !== fill) ok = false\n    }\n  }\n  t.ok(ok)\n  t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97))\n  t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98))\n\n  var tmp = new buffer.Buffer(2)\n  tmp.fill('ok')\n  if (tmp[1] === tmp[0]) {\n    // Outdated Node.js\n    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo'))\n  } else {\n    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko'))\n  }\n  t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok'))\n\n  t.end()\n})\n\ntest('safer.Buffer.from returns results same as Buffer constructor', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.deepEqual(impl.Buffer.from(''), new buffer.Buffer(''))\n    t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string'))\n    t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8'))\n    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64'))\n    t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3]))\n    t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3])))\n    t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([]))\n  })\n  t.end()\n})\n\ntest('safer.Buffer.from returns consistent results', function (t) {\n  [index, safer, dangerous].forEach(function (impl) {\n    t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0))\n    t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0))\n    t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0))\n    t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string'))\n    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103]))\n    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string')))\n    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree'))\n    t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree'))\n  })\n  t.end()\n})\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/secure-compare/.npmignore",
    "content": "node_modules\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/secure-compare/README.md",
    "content": "# secure-compare\n\nConstant-time comparison algorithm to prevent timing attacks for Node.js.\nCopied from [cryptiles](https://github.com/hapijs/cryptiles) by [C J Silverio](https://github.com/ceejbot).\n\n\n### Installation\n\n```\n$ npm install secure-compare --save\n```\n\n\n### Usage\n\n```javascript\nvar compare = require('secure-compare');\n\ncompare('hello world', 'hello world').should.equal(true);\ncompare('你好世界', '你好世界').should.equal(true);\n\ncompare('hello', 'not hello').should.equal(false);\n```\n\n\n### Tests\n\n```\n$ npm test\n```\n\n\n### License\n\nsecure-compare is released under the MIT license.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/secure-compare/index.js",
    "content": "/**\n * Expose secure-compare\n */\n\nmodule.exports = compare;\n\n\n/**\n * Secure compare\n */\n\nfunction compare (a, b) {\n  if (typeof a !== 'string' || typeof b !== 'string') return false;\n  \n  var mismatch = a.length === b.length ? 0 : 1;\n  if (mismatch) {\n    b = a;\n  }\n  \n  for (var i = 0, il = a.length; i < il; ++i) {\n    mismatch |= (a.charCodeAt(i) ^ b.charCodeAt(i));\n  }\n  \n  return mismatch === 0;\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/secure-compare/package.json",
    "content": "{\n  \"name\": \"secure-compare\",\n  \"version\": \"3.0.1\",\n  \"description\": \"Securely compare two strings, copied from cryptiles\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"./node_modules/.bin/mocha test\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/vdemedes/secure-compare.git\"\n  },\n  \"keywords\": [\n    \"secure\",\n    \"compare\"\n  ],\n  \"author\": \"Vadim Demedes <vdemedes@gmail.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/vdemedes/secure-compare/issues\"\n  },\n  \"homepage\": \"https://github.com/vdemedes/secure-compare\",\n  \"devDependencies\": {\n    \"chai\": \"^2.2.0\",\n    \"mocha\": \"^2.2.1\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/secure-compare/test.js",
    "content": "/**\n * Dependencies\n */\n\nvar compare = require('./');\n\nrequire('chai').should();\n\n\n/**\n * Tests\n */\n\ndescribe ('secure-compare', function () {\n  it ('compare', function () {\n    compare('abc', 'abc').should.equal(true);\n    compare('abc', 'ab').should.equal(false);\n  });\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/supports-color/browser.js",
    "content": "'use strict';\nmodule.exports = {\n\tstdout: false,\n\tstderr: false\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/supports-color/index.js",
    "content": "'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/supports-color/license",
    "content": "MIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/supports-color/package.json",
    "content": "{\n\t\"name\": \"supports-color\",\n\t\"version\": \"7.2.0\",\n\t\"description\": \"Detect whether a terminal supports color\",\n\t\"license\": \"MIT\",\n\t\"repository\": \"chalk/supports-color\",\n\t\"author\": {\n\t\t\"name\": \"Sindre Sorhus\",\n\t\t\"email\": \"sindresorhus@gmail.com\",\n\t\t\"url\": \"sindresorhus.com\"\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=8\"\n\t},\n\t\"scripts\": {\n\t\t\"test\": \"xo && ava\"\n\t},\n\t\"files\": [\n\t\t\"index.js\",\n\t\t\"browser.js\"\n\t],\n\t\"keywords\": [\n\t\t\"color\",\n\t\t\"colour\",\n\t\t\"colors\",\n\t\t\"terminal\",\n\t\t\"console\",\n\t\t\"cli\",\n\t\t\"ansi\",\n\t\t\"styles\",\n\t\t\"tty\",\n\t\t\"rgb\",\n\t\t\"256\",\n\t\t\"shell\",\n\t\t\"xterm\",\n\t\t\"command-line\",\n\t\t\"support\",\n\t\t\"supports\",\n\t\t\"capability\",\n\t\t\"detect\",\n\t\t\"truecolor\",\n\t\t\"16m\"\n\t],\n\t\"dependencies\": {\n\t\t\"has-flag\": \"^4.0.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"ava\": \"^1.4.1\",\n\t\t\"import-fresh\": \"^3.0.0\",\n\t\t\"xo\": \"^0.24.0\"\n\t},\n\t\"browser\": \"browser.js\"\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/supports-color/readme.md",
    "content": "# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)\n\n> Detect whether a terminal supports color\n\n\n## Install\n\n```\n$ npm install supports-color\n```\n\n\n## Usage\n\n```js\nconst supportsColor = require('supports-color');\n\nif (supportsColor.stdout) {\n\tconsole.log('Terminal stdout supports color');\n}\n\nif (supportsColor.stdout.has256) {\n\tconsole.log('Terminal stdout supports 256 colors');\n}\n\nif (supportsColor.stderr.has16m) {\n\tconsole.log('Terminal stderr supports 16 million colors (truecolor)');\n}\n```\n\n\n## API\n\nReturns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported.\n\nThe `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag:\n\n- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors)\n- `.level = 2` and `.has256 = true`: 256 color support\n- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors)\n\n\n## Info\n\nIt obeys the `--color` and `--no-color` CLI flags.\n\nFor situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.\n\nExplicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.\n\n\n## Related\n\n- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n\n\n## Maintainers\n\n- [Sindre Sorhus](https://github.com/sindresorhus)\n- [Josh Junon](https://github.com/qix-)\n\n\n---\n\n<div align=\"center\">\n\t<b>\n\t\t<a href=\"https://tidelift.com/subscription/pkg/npm-supports-color?utm_source=npm-supports-color&utm_medium=referral&utm_campaign=readme\">Get professional support for this package with a Tidelift subscription</a>\n\t</b>\n\t<br>\n\t<sub>\n\t\tTidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.\n\t</sub>\n</div>\n\n---\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/.gitattributes",
    "content": "package-lock.json binary\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"0.10\"\n  - \"0.12\"\n  - \"4\"\n  - \"6\"\n\nnotifications:\n  email:\n    - travis@nodejitsu.com\n  irc: \"irc.freenode.org#nodejitsu\"\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/CHANGELOG.md",
    "content": "\n0.3.4 / 2012-07-24\n==================\n\n  * Added SPDY support\n  * Added http redirect utility function\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/LICENSE",
    "content": "Copyright (c) 2010 Charlie Robbins & the Contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/README.md",
    "content": "\n<img src=\"https://github.com/flatiron/union/raw/master/union.png\" />\n\n# Synopsis\nA hybrid streaming middleware kernel backwards compatible with connect.\n\n# Motivation\nThe advantage to streaming middlewares is that they do not require buffering the entire stream in order to execute their function.\n\n# Status\n\n[![Build Status](https://secure.travis-ci.org/flatiron/union.png)](http://travis-ci.org/flatiron/union)\n\n# Installation\nThere are a few ways to use `union`. Install the library using npm. You can add it to your `package.json` file as a dependancy\n\n```bash\n  $ [sudo] npm install union\n```\n\n## Usage\nUnion's request handling is [connect](https://github.com/senchalabs/connect)-compatible, meaning that all existing connect middlewares should work out-of-the-box with union.\n\n**(Union 0.3.x is compatible with connect >= 2.1.0)**\n\nIn addition, the response object passed to middlewares listens for a \"next\" event, which is equivalent to calling `next()`. Flatiron middlewares are written in this manner, meaning they are not reverse-compatible with connect.\n\n### A simple case\n\n``` js\nvar fs = require('fs'),\n    union = require('../lib'),\n    director = require('director');\n\nvar router = new director.http.Router();\n\nvar server = union.createServer({\n  before: [\n    function (req, res) {\n      var found = router.dispatch(req, res);\n      if (!found) {\n        res.emit('next');\n      }\n    }\n  ]\n});\n\nrouter.get(/foo/, function () {\n  this.res.writeHead(200, { 'Content-Type': 'text/plain' })\n  this.res.end('hello world\\n');\n});\n\nrouter.post(/foo/, { stream: true }, function () {\n  var req = this.req,\n      res = this.res,\n      writeStream;\n\n  writeStream = fs.createWriteStream(Date.now() + '-foo.txt');\n  req.pipe(writeStream);\n\n  writeStream.on('close', function () {\n    res.writeHead(200, { 'Content-Type': 'text/plain' });\n    res.end('wrote to a stream!');\n  });\n});\n\nserver.listen(9090);\nconsole.log('union with director running on 9090');\n```\n\nTo demonstrate the code, we use [director](https://github.com/flatiron/director). A light-weight, Client AND Server side URL-Router for Node.js and Single Page Apps!\n\n### A case with connect\n\nCode based on connect\n\n```js\nvar connect = require('connect')\n  , http = require('http');\n\nvar app = connect()\n  .use(connect.favicon())\n  .use(connect.logger('dev'))\n  .use(connect.static('public'))\n  .use(connect.directory('public'))\n  .use(connect.cookieParser('my secret here'))\n  .use(connect.session())\n  .use(function (req, res) {\n    res.end('Hello from Connect!\\n');\n  });\n\nhttp.createServer(app).listen(3000);\n```\n\nCode based on union\n\n```js\nvar connect = require('connect')\n  , union = require('union');\n\nvar server = union.createServer({\n  buffer: false,\n  before: [\n    connect.favicon(),\n    connect.logger('dev'),\n    connect.static('public'),\n    connect.directory('public'),\n    connect.cookieParser('my secret here'),\n    connect.session(),\n    function (req, res) {\n      res.end('Hello from Connect!\\n');\n    },\n  ]\n}).listen(3000);\n```\n\n### SPDY enabled server example\n\n# API\n\n## union Static Members\n\n### createServer(options)\nThe `options` object is required. Options include:\n\nSpecification\n\n```\n  function createServer(options)\n\n  @param options {Object}\n  An object literal that represents the configuration for the server.\n\n    @option before {Array}\n    The `before` value is an array of middlewares, which are used to route and serve incoming\n    requests. For instance, in the example, `favicon` is a middleware which handles requests\n    for `/favicon.ico`.\n\n    @option after {Array}\n    The `after` value is an array of functions that return stream filters,\n    which are applied after the request handlers in `options.before`.\n    Stream filters inherit from `union.ResponseStream`, which implements the\n    Node.js core streams api with a bunch of other goodies.\n\n    @option limit {Object}\n    (optional) A value, passed to internal instantiations of `union.BufferedStream`.\n\n    @option https {Object}\n    (optional) A value that specifies the certificate and key necessary to create an instance of\n    `https.Server`.\n\n    @option spdy {Object}\n    (optional) A value that specifies the certificate and key necessary to create an instance of\n    `spdy.Server`.\n\n    @option headers {Object}\n    (optional) An object representing a set of headers to set in every outgoing response\n```\n\nExample\n\n```js\nvar server = union.createServer({\n  before: [\n    favicon('./favicon.png'),\n    function (req, res) {\n      var found = router.dispatch(req, res);\n      if (!found) {\n        res.emit('next');\n      }\n    }\n  ]\n});\n```\n\nAn example of the `https` or `spdy` option.\n\n``` js\n{\n  cert: 'path/to/cert.pem',\n  key: 'path/to/key.pem',\n  ca: 'path/to/ca.pem'\n}\n```\n\nAn example of the `headers` option.\n\n``` js\n{\n  'x-powered-by': 'your-sweet-application v10.9.8'\n}\n```\n\n## Error Handling\nError handler is similiar to middlware but takes an extra argument for error at the beginning.\n\n```js\nvar handle = function (err, req, res) {\n  res.statusCode = err.status;\n  res.end(req.headers);\n};\n\nvar server = union.createServer({\n  onError: handle,\n  before: [\n    favicon('./favicon.png'),\n    function (req, res) {\n      var found = router.dispatch(req, res);\n      if (!found) {\n        res.emit('next');\n      }\n    }\n  ]\n});\n```\n\n## BufferedStream Constructor\nThis constructor inherits from `Stream` and can buffer data up to `limit` bytes. It also implements `pause` and `resume` methods.\n\nSpecification\n\n```\n  function BufferedStream(limit)\n\n  @param limit {Number}\n  the limit for which the stream can be buffered\n```\n\nExample\n\n```js\nvar bs = union.BufferedStream(n);\n```\n\n## HttpStream Constructor\nThis constructor inherits from `union.BufferedStream` and returns a stream with these extra properties:\n\nSpecification\n\n```\n  function HttpStream()\n```\n\nExample\n\n```js\nvar hs = union.HttpStream();\n```\n\n## HttpStream Instance Members\n\n### url\nThe url from the request.\n\nExample\n\n```js\nhttpStream.url = '';\n```\n\n### headers\nThe HTTP headers associated with the stream.\n\nExample\n\n```js\nhttpStream.headers = '';\n```\n\n### method\nThe HTTP method (\"GET\", \"POST\", etc).\n\nExample\n\n```js\nhttpStream.method = 'POST';\n```\n\n### query\nThe querystring associated with the stream (if applicable).\n\nExample\n\n```js\nhttpStream.query = '';\n```\n\n## ResponseStream Constructor\nThis constructor inherits from `union.HttpStream`, and is additionally writeable. Union supplies this constructor as a basic response stream middleware from which to inherit.\n\nSpecification\n\n```\n  function ResponseStream()\n```\n\nExample\n\n```js\nvar rs = union.ResponseStream();\n```\n\n# Tests\n\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n# Licence\n\n(The MIT License)\n\nCopyright (c) 2010-2012 Charlie Robbins & the Contributors\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/after/index.js",
    "content": "var fs = require('fs'),\n    path = require('path'),\n    union = require('../../lib');\n\nvar server = union.createServer({\n  before: [ function (req,res) {\n    if (req.url === \"/foo\") {\n      res.text(201, \"foo\");\n    }\n  } ],\n  after: [\n    function LoggerStream() {\n        var stream   = new union.ResponseStream();\n\n        stream.once(\"pipe\", function (req) {\n          console.log({res: this.res.statusCode, method: this.req.method});\n        });\n\n        return stream;\n    }\n  ]\n});\n\nserver.listen(9080);\nconsole.log('union running on 9080');\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/simple/middleware/favicon.js",
    "content": "\n/*!\n * Connect - favicon\n * Copyright(c) 2010 Sencha Inc.\n * Copyright(c) 2011 TJ Holowaychuk\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar crypto = require('crypto')\n  , fs = require('fs');\n\n/**\n * Favicon cache.\n */\n\nvar icon;\n\n/**\n * Return md5 hash of the given string and optional encoding,\n * defaulting to hex.\n *\n *     utils.md5('wahoo');\n *     // => \"e493298061761236c96b02ea6aa8a2ad\"\n *\n * @param {String} str\n * @param {String} encoding\n * @return {String}\n * @api public\n */\n\nexports.md5 = function (str, encoding) {\n  return crypto\n    .createHash('md5')\n    .update(str)\n    .digest(encoding || 'hex');\n};\n\n/**\n * By default serves the connect favicon, or the favicon\n * located by the given `path`.\n *\n * Options:\n *\n *   - `maxAge`  cache-control max-age directive, defaulting to 1 day\n *\n * Examples:\n *\n *     connect.createServer(\n *       connect.favicon()\n *     );\n *\n *     connect.createServer(\n *       connect.favicon(__dirname + '/public/favicon.ico')\n *     );\n *\n * @param {String} path\n * @param {Object} options\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function favicon(path, options) {\n  var options = options || {}\n    , path = path || __dirname + '/../public/favicon.ico'\n    , maxAge = options.maxAge || 86400000;\n\n  return function favicon(req, res, next) {\n    if ('/favicon.ico' == req.url) {\n      if (icon) {\n        res.writeHead(200, icon.headers);\n        res.end(icon.body);\n      } else {\n        fs.readFile(path, function (err, buf) {\n          if (err) return next(err);\n          icon = {\n            headers: {\n                'Content-Type': 'image/x-icon'\n              , 'Content-Length': buf.length\n              , 'ETag': '\"' + exports.md5(buf) + '\"'\n              , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)\n            },\n            body: buf\n          };\n          res.writeHead(200, icon.headers);\n          res.end(icon.body);\n        });\n      }\n    } else {\n      next();\n    }\n  };\n};"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/simple/middleware/gzip-decode.js",
    "content": "var spawn = require('child_process').spawn,\n    util = require('util'),\n    RequestStream = require('../../lib').RequestStream;\n\nvar GzipDecode = module.exports = function GzipDecoder(options) {\n  RequestStream.call(this, options);\n\n  this.on('pipe', this.decode);\n}\n\nutil.inherits(GzipDecode, RequestStream);\n\nGzipDecode.prototype.decode = function (source) {\n  this.decoder = spawn('gunzip');\n  this.decoder.stdout.on('data', this._onGunzipData.bind(this));\n  this.decoder.stdout.on('end', this._onGunzipEnd.bind(this));\n  source.pipe(this.decoder);\n}\n\nGzipDecoderStack.prototype._onGunzipData = function (chunk) {\n  this.emit('data', chunk);\n}\n\nGzipDecoderStack.prototype._onGunzipEnd = function () {\n  this.emit('end');\n}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/simple/middleware/gzip-encode.js",
    "content": "var spawn = require('child_process').spawn,\n    util = require('util'),\n    ResponseStream = require('../../lib').ResponseStream;\n    \n/**\n * Accepts a writable stream, i.e. fs.WriteStream, and returns a StreamStack\n * whose 'write()' calls are transparently sent to a 'gzip' process before\n * being written to the target stream.\n */\nvar GzipEncode = module.exports = function GzipEncode(options) {\n  ResponseStream.call(this, options);\n\n  if (compression) {\n    process.assert(compression >= 1 && compression <= 9);\n    this.compression = compression;\n  }\n\n  this.on('pipe', this.encode);\n}\n\nutil.inherits(GzipEncode, ResponseStream);\n\nGzipEncode.prototype.encode = function (source) {\n  this.source = source;\n};\n\nGzipEncode.prototype.pipe = function (dest) {\n  if (!this.source) {\n    throw new Error('GzipEncode is only pipeable once it has been piped to');\n  }\n  \n  this.encoder = spawn('gzip', ['-'+this.compression]);\n  this.encoder.stdout.pipe(dest);\n  this.encoder.stdin.pipe(this.source);\n};\n\ninherits(GzipEncoderStack, StreamStack);\nexports.GzipEncoderStack = GzipEncoderStack;\n\nGzipEncoderStack.prototype.compression = 6;"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/simple/simple.js",
    "content": "var fs = require('fs'),\n    path = require('path'),\n    union = require('../../lib'),\n    director = require('director'),\n    favicon = require('./middleware/favicon');\n\nvar router = new director.http.Router();\n\nvar server = union.createServer({\n  before: [\n    favicon(path.join(__dirname, 'favicon.png')),\n    function (req, res) {\n      var found = router.dispatch(req, res);\n      if (!found) {\n        res.emit('next');\n      }\n    }\n  ]\n});\n\nrouter.get('/foo', function () {\n  this.res.writeHead(200, { 'Content-Type': 'text/plain' });\n  this.res.end('hello world\\n');\n});\n\nrouter.post('/foo', { stream: true }, function () {\n  var req = this.req,\n      res = this.res,\n      writeStream;\n\n  writeStream = fs.createWriteStream(__dirname + '/' + Date.now() + '-foo.txt');\n  req.pipe(writeStream);\n\n  writeStream.on('close', function () {\n    res.writeHead(200, { 'Content-Type': 'text/plain' });\n    res.end('wrote to a stream!');\n  });\n});\n\nrouter.get('/redirect', function () {\n  this.res.redirect('http://www.google.com');\n});\n\nrouter.get('/custom_redirect', function () {\n  this.res.redirect('/foo', 301);\n});\n\nrouter.get('/async', function () {\n  var self = this;\n  process.nextTick(function () {\n    self.req.on('end', function () {\n      self.res.end();\n    })\n    self.req.buffer = false;\n  });\n});\n\nserver.listen(9090);\nconsole.log('union with director running on 9090');\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/simple/spdy.js",
    "content": "// In order to run this example you need to\n// generate local ssl certificate\nvar union = require('../../lib'),\n    director = require('director');\n\nvar router = new director.http.Router();\n\nvar server = union.createServer({\n  before: [\n    function (req, res) {\n      var found = router.dispatch(req, res);\n      if (!found) {\n        res.emit('next');\n      }\n    }\n  ],\n  spdy :{\n    key: './certs/privatekey.pem',\n    cert: './certs/certificate.pem'\n  }\n});\n\nrouter.get(/foo/, function () {\n  this.res.writeHead(200, { 'Content-Type': 'text/plain' })\n  this.res.end('hello world\\n');\n});\n\nserver.listen(9090, function () {\n  console.log('union with director running on 9090 with SPDY');\n});"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/socketio/README",
    "content": "This folder contains an example of how to use Union with Socket.io.\n\nFirst, you'll want to install both Union and Socket.io. Run this\ncommand in the folder you placed these two files:\n\nnpm install union socket.io\n\nYou can run the server like so:\n\nnode server.js\n\nNow open up your web browser to http://localhost and see the results\nin the console!\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/socketio/index.html",
    "content": "<script src=\"/socket.io/socket.io.js\"></script>\n<script>\n  var socket = io.connect('http://localhost');\n  socket.on('news', function (data) {\n    console.log(data);\n    socket.emit('my other event', { my: 'data' });\n  });\n</script>"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/examples/socketio/server.js",
    "content": "var fs = require('fs'),\n    union = require('union');\n\nvar server = union.createServer({\n  before: [\n    function (req, res) {\n      fs.readFile(__dirname + '/index.html',\n\t  function (err, data) {\n\t\tif (err) {\n\t\t  res.writeHead(500);\n\t\t  return res.end('Error loading index.html');\n\t\t}\n\n\t\tres.writeHead(200);\n\t\tres.end(data);\n\t  });\n    }\n  ]\n});\n\nserver.listen(9090);\n\nvar io = require('socket.io').listen(server);\n\nio.sockets.on('connection', function (socket) {\n  socket.emit('news', {hello: 'world'});\n  socket.on('my other event', function (data) {\n    console.log(data);\n  });\n});"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/buffered-stream.js",
    "content": "/*\n * buffered-stream.js: A simple(r) Stream which is partially buffered into memory.\n *\n * (C) 2010, Mikeal Rogers\n *\n * Adapted for Flatiron\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar events = require('events'),\n    fs = require('fs'),\n    stream = require('stream'),\n    util = require('util');\n\n//\n// ### function BufferedStream (limit)\n// #### @limit {number} **Optional** Size of the buffer to limit\n// Constructor function for the BufferedStream object responsible for\n// maintaining a stream interface which can also persist to memory\n// temporarily.\n//\n\nvar BufferedStream = module.exports = function (limit) {\n  events.EventEmitter.call(this);\n\n  if (typeof limit === 'undefined') {\n    limit = Infinity;\n  }\n\n  this.limit = limit;\n  this.size = 0;\n  this.chunks = [];\n  this.writable = true;\n  this.readable = true;\n  this._buffer = true;\n};\n\nutil.inherits(BufferedStream, stream.Stream);\n\nObject.defineProperty(BufferedStream.prototype, 'buffer', {\n  get: function () {\n    return this._buffer;\n  },\n  set: function (value) {\n    if (!value && this.chunks) {\n      var self = this;\n      this.chunks.forEach(function (c) { self.emit('data', c) });\n      if (this.ended) this.emit('end');\n      this.size = 0;\n      delete this.chunks;\n    }\n\n    this._buffer = value;\n  }\n});\n\nBufferedStream.prototype.pipe = function () {\n  var self = this,\n      dest;\n\n  if (self.resume) {\n    self.resume();\n  }\n\n  dest = stream.Stream.prototype.pipe.apply(self, arguments);\n\n  //\n  // just incase you are piping to two streams, do not emit data twice.\n  // note: you can pipe twice, but you need to pipe both streams in the same tick.\n  // (this is normal for streams)\n  //\n  if (this.piped) {\n    return dest;\n  }\n\n  process.nextTick(function () {\n    if (self.chunks) {\n      self.chunks.forEach(function (c) { self.emit('data', c) });\n      self.size = 0;\n      delete self.chunks;\n    }\n\n    if (!self.readable) {\n      if (self.ended) {\n        self.emit('end');\n      }\n      else if (self.closed) {\n        self.emit('close');\n      }\n    }\n  });\n\n  this.piped = true;\n\n  return dest;\n};\n\nBufferedStream.prototype.write = function (chunk) {\n  if (!this.chunks || this.piped) {\n    this.emit('data', chunk);\n    return;\n  }\n\n  this.chunks.push(chunk);\n  this.size += chunk.length;\n  if (this.limit < this.size) {\n    this.pause();\n  }\n};\n\nBufferedStream.prototype.end = function () {\n  this.readable = false;\n  this.ended = true;\n  this.emit('end');\n};\n\nBufferedStream.prototype.destroy = function () {\n  this.readable = false;\n  this.writable = false;\n  delete this.chunks;\n};\n\nBufferedStream.prototype.close = function () {\n  this.readable = false;\n  this.closed = true;\n};\n\nif (!stream.Stream.prototype.pause) {\n  BufferedStream.prototype.pause = function () {\n    this.emit('pause');\n  };\n}\n\nif (!stream.Stream.prototype.resume) {\n  BufferedStream.prototype.resume = function () {\n    this.emit('resume');\n  };\n}\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/core.js",
    "content": "/*\n * core.js: Core functionality for the Flatiron HTTP (with SPDY support) plugin.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar http = require('http'),\n    https = require('https'),\n    fs = require('fs'),\n    stream = require('stream'),\n    HttpStream = require('./http-stream'),\n    RoutingStream = require('./routing-stream');\n\nvar core = exports;\n\ncore.createServer = function (options) {\n  var isArray = Array.isArray(options.after),\n      credentials;\n\n  if (!options) {\n    throw new Error('options is required to create a server');\n  }\n\n  function requestHandler(req, res) {\n    var routingStream = new RoutingStream({\n      before: options.before,\n      buffer: options.buffer,\n      //\n      // Remark: without new after is a huge memory leak that\n      // pipes to every single open connection\n      //\n      after: isArray && options.after.map(function (After) {\n        return new After;\n      }),\n      request: req,\n      response: res,\n      limit: options.limit,\n      headers: options.headers\n    });\n\n    routingStream.on('error', function (err) {\n      var fn = options.onError || core.errorHandler;\n      fn(err, routingStream, routingStream.target, function () {\n        routingStream.target.emit('next');\n      });\n    });\n\n    req.pipe(routingStream);\n  }\n\n  //\n  // both https and spdy requires same params\n  //\n  if (options.https || options.spdy) {\n    if (options.https && options.spdy) {\n      throw new Error('You shouldn\\'t be using https and spdy simultaneously.');\n    }\n\n    var serverOptions,\n        credentials,\n        key = !options.spdy\n          ? 'https'\n          : 'spdy';\n\n    serverOptions = options[key];\n    if (!serverOptions.key || !serverOptions.cert) {\n      throw new Error('Both options.' + key + '.`key` and options.' + key + '.`cert` are required.');\n    }\n\n    credentials = {\n      key:  fs.readFileSync(serverOptions.key),\n      cert: fs.readFileSync(serverOptions.cert)\n    };\n\n    if (serverOptions.ca) {\n      serverOptions.ca = !Array.isArray(serverOptions.ca)\n        ? [serverOptions.ca]\n        : serverOptions.ca\n\n      credentials.ca = serverOptions.ca.map(function (ca) {\n        return fs.readFileSync(ca);\n      });\n    }\n\n    if (options.spdy) {\n      // spdy is optional so we require module here rather than on top\n      var spdy = require('spdy');\n      return spdy.createServer(credentials, requestHandler);\n    }\n\n    return https.createServer(credentials, requestHandler);\n  }\n\n  return http.createServer(requestHandler);\n};\n\ncore.errorHandler = function error(err, req, res) {\n  if (err) {\n    (this.res || res).writeHead(err.status || 500, err.headers || { \"Content-Type\": \"text/plain\" });\n    (this.res || res).end(err.message + \"\\n\");\n    return;\n  }\n\n  (this.res || res).writeHead(404, {\"Content-Type\": \"text/plain\"});\n  (this.res || res).end(\"Not Found\\n\");\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/http-stream.js",
    "content": "/*\n * http-stream.js: Idomatic buffered stream which pipes additional HTTP information.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar url = require('url'),\n    util = require('util'),\n    qs = require('qs'),\n    BufferedStream = require('./buffered-stream');\n\nvar HttpStream = module.exports = function (options) {\n  options = options || {};\n  BufferedStream.call(this, options.limit);\n\n  if (options.buffer === false) {\n    this.buffer = false;\n  }\n\n  this.on('pipe', this.pipeState);\n};\n\nutil.inherits(HttpStream, BufferedStream);\n\n//\n// ### function pipeState (source)\n// #### @source {ServerRequest|HttpStream} Source stream piping to this instance\n// Pipes additional HTTP metadata from the `source` HTTP stream (either concrete or\n// abstract) to this instance. e.g. url, headers, query, etc.\n//\n// Remark: Is there anything else we wish to pipe?\n//\nHttpStream.prototype.pipeState = function (source) {\n  this.headers = source.headers;\n  this.trailers = source.trailers;\n  this.method = source.method;\n\n  if (source.url) {\n    this.url = this.originalUrl = source.url;\n  }\n\n  if (source.query) {\n    this.query = source.query;\n  }\n  else if (source.url) {\n    this.query = ~source.url.indexOf('?')\n      ? qs.parse(url.parse(source.url).query)\n      : {};\n  }\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/index.js",
    "content": "/*\n * index.js: Top-level plugin exposing HTTP features in flatiron\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar union = exports;\n\n//\n// Expose version information\n//\nexports.version = require('../package.json').version;\n\n//\n// Expose core union components\n//\nunion.BufferedStream = require('./buffered-stream');\nunion.HttpStream     = require('./http-stream');\nunion.ResponseStream = require('./response-stream');\nunion.RoutingStream  = require('./routing-stream');\nunion.createServer   = require('./core').createServer;\nunion.errorHandler   = require('./core').errorHandler;\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/request-stream.js",
    "content": "/*\n * http-stream.js: Idomatic buffered stream which pipes additional HTTP information.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar url = require('url'),\n    util = require('util'),\n    qs = require('qs'),\n    HttpStream = require('./http-stream');\n\nvar RequestStream = module.exports = function (options) {\n  options = options || {};\n  HttpStream.call(this, options);\n\n  this.on('pipe', this.pipeRequest);\n  this.request = options.request;\n};\n\nutil.inherits(RequestStream, HttpStream);\n\n//\n// ### function pipeRequest (source)\n// #### @source {ServerRequest|HttpStream} Source stream piping to this instance\n// Pipes additional HTTP request metadata from the `source` HTTP stream (either concrete or\n// abstract) to this instance. e.g. url, headers, query, etc.\n//\n// Remark: Is there anything else we wish to pipe?\n//\nRequestStream.prototype.pipeRequest = function (source) {\n  this.url = this.originalUrl = source.url;\n  this.method = source.method;\n  this.httpVersion = source.httpVersion;\n  this.httpVersionMajor = source.httpVersionMajor;\n  this.httpVersionMinor = source.httpVersionMinor;\n  this.setEncoding = source.setEncoding;\n  this.connection = source.connection;\n  this.socket = source.socket;\n\n  if (source.query) {\n    this.query = source.query;\n  }\n  else {\n    this.query = ~source.url.indexOf('?')\n      ? qs.parse(url.parse(source.url).query)\n      : {};\n  }\n};\n\n// http.serverRequest methods\n['setEncoding'].forEach(function (method) {\n  RequestStream.prototype[method] = function () {\n    return this.request[method].apply(this.request, arguments);\n  };\n});\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/response-stream.js",
    "content": "/*\n * response-stream.js: A Stream focused on writing any relevant information to\n * a raw http.ServerResponse object.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar util = require('util'),\n    HttpStream = require('./http-stream');\n\nvar STATUS_CODES = require('http').STATUS_CODES;\n\n//\n// ### function ResponseStream (options)\n//\n//\nvar ResponseStream = module.exports = function (options) {\n  var self = this,\n      key;\n\n  options = options || {};\n  HttpStream.call(this, options);\n\n  this.writeable = true;\n  this.response = options.response;\n\n  if (options.headers) {\n    for (key in options.headers) {\n      this.response.setHeader(key, options.headers[key]);\n    }\n  }\n\n  //\n  // Proxy `statusCode` changes to the actual `response.statusCode`.\n  //\n  Object.defineProperty(this, 'statusCode', {\n    get: function () {\n      return self.response.statusCode;\n    },\n    set: function (value) {\n      self.response.statusCode = value;\n    },\n    enumerable: true,\n    configurable: true\n  });\n\n  if (this.response) {\n    this._headers = this.response._headers = this.response._headers || {};\n\n    // Patch to node core\n    this.response._headerNames = this.response._headerNames || {};\n\n    //\n    // Proxy to emit \"header\" event\n    //\n    this._renderHeaders = this.response._renderHeaders;\n    this.response._renderHeaders = function () {\n      if (!self._emittedHeader) {\n        self._emittedHeader = true;\n        self.headerSent = true;\n        self._header = true;\n        self.emit('header');\n      }\n\n      return self._renderHeaders.call(self.response);\n    };\n  }\n};\n\nutil.inherits(ResponseStream, HttpStream);\n\nResponseStream.prototype.writeHead = function (statusCode, statusMessage, headers) {\n  if (typeof statusMessage === 'string') {\n    this.response.statusMessage = statusMessage;\n  } else {\n    this.response.statusMessage = this.response.statusMessage\n      || STATUS_CODES[statusCode] || 'unknown';\n    headers = statusMessage;\n  }\n\n  this.response.statusCode = statusCode;\n\n  if (headers) {\n    var keys = Object.keys(headers);\n    for (var i = 0; i < keys.length; i++) {\n      var k = keys[i];\n      if (k) this.response.setHeader(k, headers[k]);\n    }\n  }\n};\n\n//\n// Create pass-thru for the necessary\n// `http.ServerResponse` methods.\n//\n['setHeader', 'getHeader', 'removeHeader', '_implicitHeader', 'addTrailers'].forEach(function (method) {\n  ResponseStream.prototype[method] = function () {\n    return this.response[method].apply(this.response, arguments);\n  };\n});\n\nResponseStream.prototype.json = function (obj) {\n  if (!this.response.writable) {\n    return;\n  }\n\n  if (typeof obj === 'number') {\n    this.response.statusCode = obj;\n    obj = arguments[1];\n  }\n\n  this.modified = true;\n\n  if (!this.response._header && this.response.getHeader('content-type') !== 'application/json') {\n    this.response.setHeader('content-type', 'application/json');\n  }\n\n  this.end(obj ? JSON.stringify(obj) : '');\n};\n\nResponseStream.prototype.html = function (str) {\n  if (!this.response.writable) {\n    return;\n  }\n\n  if (typeof str === 'number') {\n    this.response.statusCode = str;\n    str = arguments[1];\n  }\n\n  this.modified = true;\n\n  if (!this.response._header && this.response.getHeader('content-type') !== 'text/html') {\n    this.response.setHeader('content-type', 'text/html');\n  }\n\n  this.end(str ? str: '');\n};\n\nResponseStream.prototype.text = function (str) {\n  if (!this.response.writable) {\n    return;\n  }\n\n  if (typeof str === 'number') {\n    this.response.statusCode = str;\n    str = arguments[1];\n  }\n\n  this.modified = true;\n\n  if (!this.response._header && this.response.getHeader('content-type') !== 'text/plain') {\n    this.response.setHeader('content-type', 'text/plain');\n  }\n\n  this.end(str ? str: '');\n};\n\nResponseStream.prototype.end = function (data) {\n  if (data && this.writable) {\n    this.emit('data', data);\n  }\n\n  this.modified = true;\n  this.emit('end');\n};\n\nResponseStream.prototype.pipe = function () {\n  var self = this, \n      dest;\n\n  self.dest = dest = HttpStream.prototype.pipe.apply(self, arguments);\n  \n  dest.on('drain', function() {\n    self.emit('drain')\n  })\n  return dest;\n};\n\nResponseStream.prototype.write = function (data) {\n  this.modified = true;\n\n  if (this.writable) {\n    return this.dest.write(data);\n  }\n};\n\nResponseStream.prototype.redirect = function (path, status) {\n  var url = '';\n\n  if (~path.indexOf('://')) {\n    url = path;\n  } else {\n    url += this.req.connection.encrypted ? 'https://' : 'http://';\n    url += this.req.headers.host;\n    url += (path[0] === '/') ? path : '/' + path;\n  }\n\n  this.res.writeHead(status || 302, { 'Location': url });\n  this.end();\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/lib/routing-stream.js",
    "content": "/*\n * routing-stream.js: A Stream focused on connecting an arbitrary RequestStream and\n * ResponseStream through a given Router.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar util = require('util'),\n    union = require('./index'),\n    RequestStream = require('./request-stream'),\n    ResponseStream = require('./response-stream');\n\n//\n// ### function RoutingStream (options)\n//\n//\nvar RoutingStream = module.exports = function (options) {\n  options = options || {};\n  RequestStream.call(this, options);\n\n  this.before = options.before || [];\n  this.after = options.after || [];\n  this.response = options.response || options.res;\n  this.headers = options.headers || {\n    'x-powered-by': 'union ' + union.version\n  };\n\n  this.target = new ResponseStream({\n    response: this.response,\n    headers: this.headers\n  });\n\n  this.once('pipe', this.route);\n};\n\nutil.inherits(RoutingStream, RequestStream);\n\n//\n// Called when this instance is piped to **by another stream**\n//\nRoutingStream.prototype.route = function (req) {\n  //\n  // When a `RoutingStream` is piped to:\n  //\n  // 1. Setup the pipe-chain between the `after` middleware, the abstract response\n  //    and the concrete response.\n  // 2. Attempt to dispatch to the `before` middleware, which represent things such as\n  //    favicon, static files, application routing.\n  // 3. If no match is found then pipe to the 404Stream\n  //\n  var self = this,\n      after,\n      error,\n      i;\n\n  //\n  // Don't allow `this.target` to be writable on HEAD requests\n  //\n  this.target.writable = req.method !== 'HEAD';\n\n  //\n  // 1. Setup the pipe-chain between the `after` middleware, the abstract response\n  //    and the concrete response.\n  //\n  after = [this.target].concat(this.after, this.response);\n  for (i = 0; i < after.length - 1; i++) {\n    //\n    // attach req and res to all streams\n    //\n    after[i].req     = req;\n    after[i + 1].req = req;\n    after[i].res     = this.response;\n    after[i + 1].res = this.response;\n    after[i].pipe(after[i + 1]);\n\n    //\n    // prevent multiple responses and memory leaks\n    //\n    after[i].on('error', this.onError);\n  }\n\n  //\n  // Helper function for dispatching to the 404 stream.\n  //\n  function notFound() {\n    error = new Error('Not found');\n    error.status = 404;\n    self.onError(error);\n  }\n\n  //\n  // 2. Attempt to dispatch to the `before` middleware, which represent things such as\n  //    favicon, static files, application routing.\n  //\n  (function dispatch(i) {\n    if (self.target.modified) {\n      return;\n    }\n    else if (++i === self.before.length) {\n      //\n      // 3. If no match is found then pipe to the 404Stream\n      //\n      return notFound();\n    }\n\n    self.target.once('next', dispatch.bind(null, i));\n    if (self.before[i].length === 3) {\n      self.before[i](self, self.target, function (err) {\n        if (err) {\n          self.onError(err);\n        } else {\n          self.target.emit('next');\n        }\n      });\n    }\n    else {\n      self.before[i](self, self.target);\n    }\n  })(-1);\n};\n\nRoutingStream.prototype.onError = function (err) {\n  this.emit('error', err);\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/package.json",
    "content": "{\n  \"name\": \"union\",\n  \"description\": \"A hybrid buffered / streaming middleware kernel backwards compatible with connect.\",\n  \"version\": \"0.5.0\",\n  \"author\": \"Charlie Robbins <charlie.robbins@gmail.com>\",\n  \"maintainers\": [\n    \"dscape <nuno@nodejitsu.com>\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"http://github.com/flatiron/union.git\"\n  },\n  \"dependencies\": {\n    \"qs\": \"^6.4.0\"\n  },\n  \"devDependencies\": {\n    \"ecstatic\": \"0.5.x\",\n    \"director\": \"1.x.x\",\n    \"request\": \"2.29.x\",\n    \"vows\": \"0.8.0\",\n    \"connect\": \"2.22.x\"\n  },\n  \"scripts\": {\n    \"test\": \"vows test/*-test.js --spec -i\"\n  },\n  \"main\": \"./lib\",\n  \"engines\": {\n    \"node\": \">= 0.8.0\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/after-test.js",
    "content": "var assert = require('assert'),\n    vows = require('vows'),\n    request = require('request'),\n    union = require('../');\n\nfunction stream_callback(cb) {\n  return function () {\n    var stream   = new union.ResponseStream();\n\n    stream.once(\"pipe\", function (req) {\n      return cb ? cb(null,req) : undefined;\n    });\n\n    return stream;\n  };\n}\n\nvows.describe('union/after').addBatch({\n  'When using `union`': {\n    'a union server with after middleware': {\n      topic: function () {\n        var self = this;\n\n        union.createServer({\n          after: [ stream_callback(), stream_callback(self.callback) ]\n        }).listen(9000, function () {\n          request.get('http://localhost:9000');\n        });\n      },\n      'should preserve the request until the last call': function (req) {\n        assert.equal(req.req.httpVersion, '1.1');\n        assert.equal(req.req.url, '/');\n        assert.equal(req.req.method, 'GET');\n      }\n    }\n  }\n}).export(module);"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/body-parser-test.js",
    "content": "/*\n * simple-test.js: Simple tests for basic streaming and non-streaming HTTP requests with union.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar assert = require('assert'),\n    connect = require('connect'),\n    request = require('request'),\n    vows = require('vows'),\n    union = require('../');\n\nvows.describe('union/body-parser').addBatch({\n  \"When using union with connect body parsing via urlencoded() or json()\": {\n    topic: function () {\n      union.createServer({\n        buffer: false,\n        before: [\n          connect.urlencoded(),\n          connect.json(),\n          function (req, res) {\n            res.end(JSON.stringify(req.body, true, 2));\n          }\n        ]\n      }).listen(8082, this.callback);\n    },\n    \"a request to /\": {\n      topic: function () {\n        request.post({\n          uri: 'http://localhost:8082/',\n          headers: {\n            'content-type': 'application/json'\n          },\n          body: JSON.stringify({ a: \"foo\", b: \"bar\" })\n        }, this.callback);\n      },\n      \"should respond with a body-decoded object\": function (err, res, body) {\n        assert.isNull(err);\n        assert.equal(res.statusCode, 200);\n        assert.deepEqual(\n          JSON.parse(body),\n          { a: 'foo', b: 'bar' }\n        );\n      }\n    }\n  }\n}).export(module);\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/double-write-test.js",
    "content": "/*\n * simple-test.js: Simple tests for basic streaming and non-streaming HTTP requests with union.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar assert = require('assert'),\n    fs = require('fs'),\n    path = require('path'),\n    request = require('request'),\n    vows = require('vows'),\n    union = require('../lib/index'),\n    macros = require('./helpers/macros');\n\nvar doubleWrite = false,\n    server;\n\nserver = union.createServer({\n  before: [\n    function (req, res) {\n      res.json(200, { 'hello': 'world' });\n      res.emit('next');\n    },\n    function (req, res) {\n      doubleWrite = true;\n      res.json(200, { 'hello': 'world' });\n      res.emit('next');\n    }\n  ]\n});\n\n\nvows.describe('union/double-write').addBatch({\n  \"When using union\": {\n    \"an http server which attempts to write to the response twice\": {\n      topic: function () {\n        server.listen(9091, this.callback);\n      },\n      \"a GET request to `/foo`\": {\n        topic: function () {\n          request({ uri: 'http://localhost:9091/foo' }, this.callback);\n        },\n        \"it should respond with `{ 'hello': 'world' }`\": function (err, res, body) {\n          macros.assertValidResponse(err, res);\n          assert.deepEqual(JSON.parse(body), { 'hello': 'world' });\n        },\n        \"it should not write to the response twice\": function () {\n          assert.isFalse(doubleWrite);\n        }\n      }\n    }\n  }\n}).addBatch({\n  \"When the tests are over\": {\n    \"the server should close\": function () {\n      server.close();\n    }\n  }\n}).export(module);\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/ecstatic-test.js",
    "content": "/*\n * simple-test.js: Simple tests for basic streaming and non-streaming HTTP requests with union.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar assert = require('assert'),\n    ecstatic = require('ecstatic')(__dirname + '/fixtures/static'),\n    request = require('request'),\n    vows = require('vows'),\n    union = require('../');\n\nvows.describe('union/ecstatic').addBatch({\n  \"When using union with ecstatic\": {\n    topic: function () {\n      union.createServer({\n        before: [\n          ecstatic\n        ]\n      }).listen(18082, this.callback);\n    },\n    \"a request to /some-file.txt\": {\n      topic: function () {\n        request({ uri: 'http://localhost:18082/some-file.txt' }, this.callback);\n      },\n      \"should respond with `hello world`\": function (err, res, body) {\n        assert.isNull(err);\n        assert.equal(body, 'hello world\\n');\n      }\n    },\n    \"a request to /404.txt (which does not exist)\": {\n      topic: function () {\n        request({ uri: 'http://localhost:18082/404.txt' }, this.callback);\n      },\n      \"should respond with 404 status code\": function (err, res, body) {\n        assert.isNull(err);\n        assert.equal(res.statusCode, 404);\n      }\n    }\n  }\n}).export(module);\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/fixtures/index.js",
    "content": ""
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/fixtures/static/some-file.txt",
    "content": "hello world\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/header-test.js",
    "content": "// var assert = require('assert'),\n//     request = require('request'),\n//     vows = require('vows'),\n//     union = require('../');\n\n// vows.describe('union/header').addBatch({\n//   'When using `union`': {\n//     'with a server that responds with a header': {\n//       topic: function () {\n//         var callback = this.callback;\n//         var server = union.createServer({\n//           before: [\n//             function (req, res) {\n//               res.on('header', function () {\n//                 callback(null, res);\n//               });\n//               res.writeHead(200, { 'content-type': 'text' });\n//               res.end();\n//             }\n//           ]\n//         });\n//         server.listen(9092, function () {\n//           request('http://localhost:9092/');\n//         });\n//       },\n//       'it should have proper `headerSent` set': function (err, res) {\n//         assert.isNull(err);\n//         assert.isTrue(res.headerSent);\n//       },\n//       'it should have proper `_emittedHeader` set': function (err, res) {\n//         assert.isNull(err);\n//         assert.isTrue(res._emittedHeader);\n//       }\n//     }\n//   }\n// }).export(module);\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/helpers/index.js",
    "content": ""
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/helpers/macros.js",
    "content": "/*\n * macros.js: Simple test macros\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar assert = require('assert');\n\nvar macros = exports;\n\nmacros.assertValidResponse = function (err, res) {\n  assert.isTrue(!err);\n  assert.equal(res.statusCode, 200);\n};\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/prop-test.js",
    "content": "var assert = require('assert'),\n    request = require('request'),\n    vows = require('vows'),\n    union = require('../');\n\nvows.describe('union/properties').addBatch({\n  'When using `union`': {\n    'with a server that responds to requests': {\n      topic: function () {\n        var callback = this.callback;\n        var server = union.createServer({\n          before: [\n            function (req, res) {\n              callback(null, req, res);\n\n              res.writeHead(200, { 'content-type': 'text' });\n              res.end();\n            }\n          ]\n        });\n        server.listen(9092, function () {\n          request('http://localhost:9092/');\n        });\n      },\n      'the `req` should have a proper `httpVersion` set': function (err, req) {\n        assert.isNull(err);\n        assert.equal(req.httpVersion, '1.1');\n      },\n      'the `req` should have a proper `httpVersionMajor` set': function (err, req) {\n        assert.isNull(err);\n        assert.equal(req.httpVersionMajor, 1);\n      },\n      'the `req` should have a proper `httpVersionMinor` set': function (err, req) {\n        assert.isNull(err);\n        assert.equal(req.httpVersionMinor, 1);\n      },\n      'the `req` should have proper `socket` reference set': function (err, req) {\n        var net = require('net');\n\n        assert.isNull(err);\n        assert.isTrue(req.socket instanceof net.Socket);\n      }\n    }\n  }\n}).export(module);\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/simple-test.js",
    "content": "/*\n * simple-test.js: Simple tests for basic streaming and non-streaming HTTP requests with union.\n *\n * (C) 2011, Charlie Robbins & the Contributors\n * MIT LICENSE\n *\n */\n\nvar assert = require('assert'),\n    fs = require('fs'),\n    path = require('path'),\n    spawn = require('child_process').spawn,\n    request = require('request'),\n    vows = require('vows'),\n    macros = require('./helpers/macros');\n\nvar examplesDir = path.join(__dirname, '..', 'examples', 'simple'),\n    simpleScript = path.join(examplesDir, 'simple.js'),\n    pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')),\n    fooURI = 'http://localhost:9090/foo',\n    server;\n\nvows.describe('union/simple').addBatch({\n  \"When using union\": {\n    \"a simple http server\": {\n      topic: function () {\n        server = spawn(process.argv[0], [simpleScript]);\n        server.stdout.on('data', this.callback.bind(this, null));\n      },\n      \"a GET request to `/foo`\": {\n        topic: function () {\n          request({ uri: fooURI }, this.callback);\n        },\n        \"it should respond with `hello world`\": function (err, res, body) {\n          macros.assertValidResponse(err, res);\n          assert.equal(body, 'hello world\\n');\n        },\n        \"it should respond with 'x-powered-by': 'union <version>'\": function (err, res, body) {\n          assert.isNull(err);\n          assert.equal(res.headers['x-powered-by'], 'union ' + pkg.version);\n        }\n      },\n      \"a POST request to `/foo`\": {\n        topic: function () {\n          request.post({ uri: fooURI }, this.callback);\n        },\n        \"it should respond with `wrote to a stream!`\": function (err, res, body) {\n          macros.assertValidResponse(err, res);\n          assert.equal(body, 'wrote to a stream!');\n        }\n      },\n      \"a GET request to `/redirect`\": {\n        topic: function () {\n          request.get({\n            url: 'http://localhost:9090/redirect',\n            followRedirect: false\n          }, this.callback);\n        },\n        \"it should redirect to `http://www.google.com`\": function (err, res, body) {\n          assert.equal(res.statusCode, 302);\n          assert.equal(res.headers.location, \"http://www.google.com\");\n        }\n      },\n      \"a GET request to `/custom_redirect`\": {\n        topic: function () {\n          request.get({\n            url: 'http://localhost:9090/custom_redirect',\n            followRedirect: false\n          }, this.callback);\n        },\n        \"it should redirect to `/foo`\": function (err, res, body) {\n          assert.equal(res.statusCode, 301);\n          assert.equal(res.headers.location, \"http://localhost:9090/foo\");\n        }\n      },\n      \"a GET request to `/async`\": {\n        topic: function () {\n          request.get({\n            url: 'http://localhost:9090/async',\n            timeout: 500\n          }, this.callback);\n        },\n        \"it should not timeout\": function (err, res, body) {\n          assert.ifError(err);\n          assert.equal(res.statusCode, 200);\n        }\n      }\n    }\n  }\n}).addBatch({\n  \"When the tests are over\": {\n    \"the server should close\": function () {\n      server.kill();\n    }\n  }\n}).export(module);\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/status-code-test.js",
    "content": "var assert = require('assert'),\n    request = require('request'),\n    vows = require('vows'),\n    union = require('../');\n\nvows.describe('union/status-code').addBatch({\n  'When using `union`': {\n    'with a server setting `res.statusCode`': {\n      topic: function () {\n        var server = union.createServer({\n          before: [\n            function (req, res) {\n              res.statusCode = 404;\n              res.end();\n            }\n          ]\n        });\n        server.listen(9091, this.callback);\n      },\n      'and sending a request': {\n        topic: function () {\n          request('http://localhost:9091/', this.callback);\n        },\n        'it should have proper `statusCode` set': function (err, res, body) {\n          assert.isTrue(!err);\n          assert.equal(res.statusCode, 404);\n        }\n      }\n    }\n  }\n}).export(module);\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/union/test/streaming-test.js",
    "content": "var assert = require('assert'),\n    fs = require('fs'),\n    path = require('path'),\n    request = require('request'),\n    vows = require('vows'),\n    union = require('../');\n\nvows.describe('union/streaming').addBatch({\n  'When using `union`': {\n    'a simple union server': {\n      topic: function () {\n        var self = this;\n\n        union.createServer({\n          buffer: false,\n          before: [\n            function (req, res, next) {\n              var chunks = '';\n\n              req.on('data', function (chunk) {\n                chunks += chunk;\n              });\n\n              req.on('end', function () {\n                self.callback(null, chunks);\n              });\n            }\n          ]\n        }).listen(9000, function () {\n          request.post('http://localhost:9000').write('hello world');\n        });\n      },\n      'should receive complete POST data': function (chunks) {\n        assert.equal(chunks, 'hello world');\n      }\n    },\n    \"a simple pipe to a file\": {\n      topic: function () {\n        var self = this;\n\n        union.createServer({\n          before: [\n            function (req, res, next) {\n              var filename = path.join(__dirname, 'fixtures', 'pipe-write-test.txt'),\n                  writeStream = fs.createWriteStream(filename);\n\n              req.pipe(writeStream);\n              writeStream.on('close', function () {\n                res.writeHead(200);\n                fs.createReadStream(filename).pipe(res);\n              });\n            }\n          ]\n        }).listen(9044, function () {\n          request({\n            method: 'POST',\n            uri: 'http://localhost:9044',\n            body: 'hello world'\n          }, self.callback);\n        });\n      },\n      'should receive complete POST data': function (err, res, body) {\n        assert.equal(body, 'hello world');\n      }\n    }\n  }\n}).export(module);\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"5\"\n  - \"4\"\n  - \"0.12\"  "
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/CHANGELOG.md",
    "content": "## 4.0.0 - 2018-02-02\n\n - Ignore empty string arguments and throw an exception for non-string. Closes #36, #18 ([da05242f381bfe1ae09d00b708cfdbdb93c1a85d](https://github.com/jfromaniello/url-join/commit/da05242f381bfe1ae09d00b708cfdbdb93c1a85d)), closes [#36](https://github.com/jfromaniello/url-join/issues/36) [#18](https://github.com/jfromaniello/url-join/issues/18)\n\n\n\n## 3.0.0 - 2018-01-12\n\n - add new test ([d65d7c1696cb53b53ceabadf1a77917196967b4c](https://github.com/jfromaniello/url-join/commit/d65d7c1696cb53b53ceabadf1a77917196967b4c))\n - Fixed to handle the colon in non-protocol separation role in the first part. ([9212db75f805031a9cc06120b5dd08a6cdd805e4](https://github.com/jfromaniello/url-join/commit/9212db75f805031a9cc06120b5dd08a6cdd805e4))\n\n\n\n## 2.0.5 - 2018-01-10\n\n - revert to previous behavior #30 ([b6943343af7bd723cbca266388e84e036543577d](https://github.com/jfromaniello/url-join/commit/b6943343af7bd723cbca266388e84e036543577d)), closes [#30](https://github.com/jfromaniello/url-join/issues/30)\n\n\n\n## 2.0.4 - 2018-01-10\n\n - fix bower.json ([9677895a4afe51d8a1d670980bc6fede71252e9a](https://github.com/jfromaniello/url-join/commit/9677895a4afe51d8a1d670980bc6fede71252e9a))\n\n\n\n## 2.0.3 - 2018-01-09\n\n - 2.0.3 ([7b7806b21cf81a3476e39ddb8a6f51272a276186](https://github.com/jfromaniello/url-join/commit/7b7806b21cf81a3476e39ddb8a6f51272a276186))\n - Added a test for simple paths for issue #21 ([be99b10a707b4d22aac015d19eb087fff46d4270](https://github.com/jfromaniello/url-join/commit/be99b10a707b4d22aac015d19eb087fff46d4270)), closes [#21](https://github.com/jfromaniello/url-join/issues/21)\n - Added some new tests for cases that fail. ([f1afbd62c3149476a9ef099ba523e85fb4839732](https://github.com/jfromaniello/url-join/commit/f1afbd62c3149476a9ef099ba523e85fb4839732))\n - Passes all the tests with these changes. ([8cde667f400fa83efc7ed5c2437c7cb25c7d7600](https://github.com/jfromaniello/url-join/commit/8cde667f400fa83efc7ed5c2437c7cb25c7d7600))\n - The protocol slashes should be normalized also when the protocol is not alone in the first argument. ([0ce1239c60f7bbb625d4ccbf1fcf044f37488bd8](https://github.com/jfromaniello/url-join/commit/0ce1239c60f7bbb625d4ccbf1fcf044f37488bd8))\n\n\n\n## 2.0.2 - 2017-05-18\n\n - fix: remove consecutives slashes ([33639364ef186e257b8424620017b9d1ba225539](https://github.com/jfromaniello/url-join/commit/33639364ef186e257b8424620017b9d1ba225539))\n\n\n\n## 2.0.1 - 2017-04-12\n\n - update mocha and bower.json ([ebd3665028b2408d405f9a31f8479e91c4ef52c1](https://github.com/jfromaniello/url-join/commit/ebd3665028b2408d405f9a31f8479e91c4ef52c1))\n - feat: add test ([46d3387141e5d2f751da699e02d57fc36bfe37a8](https://github.com/jfromaniello/url-join/commit/46d3387141e5d2f751da699e02d57fc36bfe37a8))\n - fix: ignore encoded url when removing consecusive slashes ([711add4e8af8fc97390adef14b9a4722cac5e70a](https://github.com/jfromaniello/url-join/commit/711add4e8af8fc97390adef14b9a4722cac5e70a))\n\n\n\n## 2.0.0 - 2017-04-11\n\n - Add a LICENSE file ([ffd3b2253470cee648152c55dd51c1bf4e688a60](https://github.com/jfromaniello/url-join/commit/ffd3b2253470cee648152c55dd51c1bf4e688a60))\n - change copyright year ([9f67671dd8ab23b4d2da6ae775efdf66d594eac3](https://github.com/jfromaniello/url-join/commit/9f67671dd8ab23b4d2da6ae775efdf66d594eac3))\n - refactor: use local startsWith function ([a1e1214644cd187f2584b79b4241ac3b8c9b9f1b](https://github.com/jfromaniello/url-join/commit/a1e1214644cd187f2584b79b4241ac3b8c9b9f1b))\n - fix: split logic for files ([d7053a99aa40b0c2f4802819f7e0643be8889ac4](https://github.com/jfromaniello/url-join/commit/d7053a99aa40b0c2f4802819f7e0643be8889ac4))\n - feat: add file protocol support ([48ebe0d84e8e2eca3a02fe5e3259cdd294e519dc](https://github.com/jfromaniello/url-join/commit/48ebe0d84e8e2eca3a02fe5e3259cdd294e519dc))\n\n\n\n## 1.1.0 - 2016-04-05\n\n - add .travis.yml ([c75e7507f72fd4be101b64bb44539fd249842cc0](https://github.com/jfromaniello/url-join/commit/c75e7507f72fd4be101b64bb44539fd249842cc0))\n - added new syntax to allow options, fixed #! urls ([b8e5d8372c55187cdd9c6fa5e02830f76858347e](https://github.com/jfromaniello/url-join/commit/b8e5d8372c55187cdd9c6fa5e02830f76858347e))\n - added travis, updated version in bower.json ([5a58405d89298e693e8f97a74b14324d83a8a87a](https://github.com/jfromaniello/url-join/commit/5a58405d89298e693e8f97a74b14324d83a8a87a))\n - fixed query string handling, closes #9, closes #4 ([e190fe28282287204dbe7877979f18b4570042f9](https://github.com/jfromaniello/url-join/commit/e190fe28282287204dbe7877979f18b4570042f9)), closes [#9](https://github.com/jfromaniello/url-join/issues/9) [#4](https://github.com/jfromaniello/url-join/issues/4)\n\n\n\n## 1.0.0 - 2016-03-23\n\n\n\n\n## 0.1.0 - 2016-03-23\n\n - 0.1.0 ([2db128d268dfd531f1af6c9bd0543458387e94cd](https://github.com/jfromaniello/url-join/commit/2db128d268dfd531f1af6c9bd0543458387e94cd))\n - add support for AMD and windows['url-join'] ([b02169596877a1e6cd518f1b0d711f38c721fb02](https://github.com/jfromaniello/url-join/commit/b02169596877a1e6cd518f1b0d711f38c721fb02))\n - added comments, fixed leading // ([3f72b6ea6fa84c4b254d0c656815a5df6b89a10a](https://github.com/jfromaniello/url-join/commit/3f72b6ea6fa84c4b254d0c656815a5df6b89a10a))\n - added test for leading // ([baac627b2052e1d9b5c05e48c8dc6a05a80e08fa](https://github.com/jfromaniello/url-join/commit/baac627b2052e1d9b5c05e48c8dc6a05a80e08fa))\n - bower init ([650dcfe72eee854108dd0832963553eae5ede7c5](https://github.com/jfromaniello/url-join/commit/650dcfe72eee854108dd0832963553eae5ede7c5))\n - initial ([af68a208966de3d4be757c9d0f4a918c6dfa360e](https://github.com/jfromaniello/url-join/commit/af68a208966de3d4be757c9d0f4a918c6dfa360e))\n - minor ([dde2dc6815f9a0476d7aade1d6848cbc5f3a14a4](https://github.com/jfromaniello/url-join/commit/dde2dc6815f9a0476d7aade1d6848cbc5f3a14a4))\n - minor ([4d9d8ee16591da2092739a172145f968f71598dc](https://github.com/jfromaniello/url-join/commit/4d9d8ee16591da2092739a172145f968f71598dc))\n - minor ([9ed0161497ee7d7d1b4b04d1735483a6216fe2c6](https://github.com/jfromaniello/url-join/commit/9ed0161497ee7d7d1b4b04d1735483a6216fe2c6))\n - simplify normalize function ([d6886a362828eacc028c6167b9ae0efd8b2fbfc8](https://github.com/jfromaniello/url-join/commit/d6886a362828eacc028c6167b9ae0efd8b2fbfc8))\n\n\n\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2015 José F. Romaniello\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/README.md",
    "content": "Join all arguments together and normalize the resulting url.\n\n## Install\n\n~~~\nnpm install url-join\n~~~\n\n## Usage\n\n~~~javascript\nvar urljoin = require('url-join');\n\nvar fullUrl = urljoin('http://www.google.com', 'a', '/b/cd', '?foo=123');\n\nconsole.log(fullUrl);\n\n~~~\n\nPrints:\n\n~~~\n'http://www.google.com/a/b/cd?foo=123'\n~~~\n\n## Browser and AMD\n\nIt also works in the browser, you can either include ```lib/url-join.js``` in your page:\n\n~~~html\n<script src=\"url-join.js\"></script>\n<script type=\"text/javascript\">\n\turljoin('http://blabla.com', 'foo?a=1')\n</script>\n~~~\n\nOr using an AMD module system like requirejs:\n\n~~~javascript\ndefine(['path/url-join.js'], function (urljoin) {\n  urljoin('http://blabla.com', 'foo?a=1');\n});\n~~~\n\n## License\n\nMIT\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/bin/changelog",
    "content": "#!/usr/bin/env node\n\nvar changelog = require('conventional-changelog');\nvar semver_regex = /\\bv?(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*)(?:-[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?\\b/ig;\n\nconst commitPartial = ` - {{header}}\n\n{{~!-- commit hash --}} {{#if @root.linkReferences}}([{{hash}}]({{#if @root.host}}{{@root.host}}/{{/if}}{{#if @root.owner}}{{@root.owner}}/{{/if}}{{@root.repository}}/{{@root.commit}}/{{hash}})){{else}}{{hash~}}{{/if}}\n\n{{~!-- commit references --}}{{#if references}}, closes{{~#each references}} {{#if @root.linkReferences}}[{{#if this.owner}}{{this.owner}}/{{/if}}{{this.repository}}#{{this.issue}}]({{#if @root.host}}{{@root.host}}/{{/if}}{{#if this.repository}}{{#if this.owner}}{{this.owner}}/{{/if}}{{this.repository}}{{else}}{{#if @root.owner}}{{@root.owner}}/{{/if}}{{@root.repository}}{{/if}}/{{@root.issue}}/{{this.issue}}){{else}}{{#if this.owner}}{{this.owner}}/{{/if}}{{this.repository}}#{{this.issue}}{{/if}}{{/each}}{{/if}}\n`;\n\nconst headerPartial = `## {{version}}{{#if title}} \"{{title}}\"{{/if}}{{#if date}} - {{date}}{{/if}}\n`;\n\nchangelog({\n  releaseCount: 19,\n  // preset: 'jshint'\n}, null, null, null, {\n  transform: function (commit) {\n    if (commit.header && semver_regex.exec(commit.header)) {\n      return null;\n    }\n    return commit;\n  },\n  commitPartial: commitPartial,\n  headerPartial: headerPartial\n}).pipe(process.stdout);\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/lib/url-join.js",
    "content": "(function (name, context, definition) {\n  if (typeof module !== 'undefined' && module.exports) module.exports = definition();\n  else if (typeof define === 'function' && define.amd) define(definition);\n  else context[name] = definition();\n})('urljoin', this, function () {\n\n  function normalize (strArray) {\n    var resultArray = [];\n    if (strArray.length === 0) { return ''; }\n\n    if (typeof strArray[0] !== 'string') {\n      throw new TypeError('Url must be a string. Received ' + strArray[0]);\n    }\n\n    // If the first part is a plain protocol, we combine it with the next part.\n    if (strArray[0].match(/^[^/:]+:\\/*$/) && strArray.length > 1) {\n      var first = strArray.shift();\n      strArray[0] = first + strArray[0];\n    }\n\n    // There must be two or three slashes in the file protocol, two slashes in anything else.\n    if (strArray[0].match(/^file:\\/\\/\\//)) {\n      strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1:///');\n    } else {\n      strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1://');\n    }\n\n    for (var i = 0; i < strArray.length; i++) {\n      var component = strArray[i];\n\n      if (typeof component !== 'string') {\n        throw new TypeError('Url must be a string. Received ' + component);\n      }\n\n      if (component === '') { continue; }\n\n      if (i > 0) {\n        // Removing the starting slashes for each component but the first.\n        component = component.replace(/^[\\/]+/, '');\n      }\n      if (i < strArray.length - 1) {\n        // Removing the ending slashes for each component but the last.\n        component = component.replace(/[\\/]+$/, '');\n      } else {\n        // For the last component we will combine multiple slashes to a single one.\n        component = component.replace(/[\\/]+$/, '/');\n      }\n\n      resultArray.push(component);\n\n    }\n\n    var str = resultArray.join('/');\n    // Each input component is now separated by a single slash except the possible first plain protocol part.\n\n    // remove trailing slash before parameters or hash\n    str = str.replace(/\\/(\\?|&|#[^!])/g, '$1');\n\n    // replace ? in parameters with &\n    var parts = str.split('?');\n    str = parts.shift() + (parts.length > 0 ? '?': '') + parts.join('&');\n\n    return str;\n  }\n\n  return function () {\n    var input;\n\n    if (typeof arguments[0] === 'object') {\n      input = arguments[0];\n    } else {\n      input = [].slice.call(arguments);\n    }\n\n    return normalize(input);\n  };\n\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/package.json",
    "content": "{\n  \"name\": \"url-join\",\n  \"version\": \"4.0.1\",\n  \"description\": \"Join urls and normalize as in path.join.\",\n  \"main\": \"lib/url-join.js\",\n  \"scripts\": {\n    \"test\": \"mocha --require should\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/jfromaniello/url-join.git\"\n  },\n  \"keywords\": [\n    \"url\",\n    \"join\"\n  ],\n  \"author\": \"José F. Romaniello <jfromaniello@gmail.com> (http://joseoncode.com)\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"conventional-changelog\": \"^1.1.10\",\n    \"mocha\": \"^3.2.0\",\n    \"should\": \"~1.2.1\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/url-join/test/tests.js",
    "content": "var urljoin = require('../lib/url-join');\nvar assert = require('assert');\n\ndescribe('url join', function () {\n  it('should work for simple case', function () {\n    urljoin('http://www.google.com/', 'foo/bar', '?test=123')\n      .should.eql('http://www.google.com/foo/bar?test=123');\n  });\n\n  it('should work for simple case with new syntax', function () {\n    urljoin(['http://www.google.com/', 'foo/bar', '?test=123'])\n      .should.eql('http://www.google.com/foo/bar?test=123');\n  });\n\n  it('should work for hashbang urls', function () {\n    urljoin(['http://www.google.com', '#!', 'foo/bar', '?test=123'])\n      .should.eql('http://www.google.com/#!/foo/bar?test=123');\n  });\n\n  it('should be able to join protocol', function () {\n    urljoin('http:', 'www.google.com/', 'foo/bar', '?test=123')\n      .should.eql('http://www.google.com/foo/bar?test=123');\n  });\n\n  it('should be able to join protocol with slashes', function () {\n    urljoin('http://', 'www.google.com/', 'foo/bar', '?test=123')\n      .should.eql('http://www.google.com/foo/bar?test=123');\n  });\n\n  it('should remove extra slashes', function () {\n    urljoin('http:', 'www.google.com///', 'foo/bar', '?test=123')\n      .should.eql('http://www.google.com/foo/bar?test=123');\n  });\n\n  it('should not remove extra slashes in an encoded URL', function () {\n    urljoin('http:', 'www.google.com///', 'foo/bar', '?url=http%3A//Ftest.com')\n      .should.eql('http://www.google.com/foo/bar?url=http%3A//Ftest.com');\n\n    urljoin('http://a.com/23d04b3/', '/b/c.html')\n      .should.eql('http://a.com/23d04b3/b/c.html')\n      .should.not.eql('http://a.com/23d04b3//b/c.html');\n  });\n\n  it('should support anchors in urls', function () {\n    urljoin('http:', 'www.google.com///', 'foo/bar', '?test=123', '#faaaaa')\n      .should.eql('http://www.google.com/foo/bar?test=123#faaaaa');\n  });\n\n  it('should support protocol-relative urls', function () {\n    urljoin('//www.google.com', 'foo/bar', '?test=123')\n      .should.eql('//www.google.com/foo/bar?test=123')\n  });\n\n  it('should support file protocol urls', function () {\n    urljoin('file:/', 'android_asset', 'foo/bar')\n      .should.eql('file://android_asset/foo/bar')\n\n    urljoin('file:', '/android_asset', 'foo/bar')\n      .should.eql('file://android_asset/foo/bar')\n  });\n\n  it('should support absolute file protocol urls', function () {\n    urljoin('file:', '///android_asset', 'foo/bar')\n      .should.eql('file:///android_asset/foo/bar')\n\n    urljoin('file:///', 'android_asset', 'foo/bar')\n      .should.eql('file:///android_asset/foo/bar')\n\n    urljoin('file:///', '//android_asset', 'foo/bar')\n      .should.eql('file:///android_asset/foo/bar')\n\n    urljoin('file:///android_asset', 'foo/bar')\n      .should.eql('file:///android_asset/foo/bar')\n  });\n\n  it('should merge multiple query params properly', function () {\n    urljoin('http:', 'www.google.com///', 'foo/bar', '?test=123', '?key=456')\n      .should.eql('http://www.google.com/foo/bar?test=123&key=456');\n\n    urljoin('http:', 'www.google.com///', 'foo/bar', '?test=123', '?boom=value', '&key=456')\n      .should.eql('http://www.google.com/foo/bar?test=123&boom=value&key=456');\n\n    urljoin('http://example.org/x', '?a=1', '?b=2', '?c=3', '?d=4')\n      .should.eql('http://example.org/x?a=1&b=2&c=3&d=4');\n  });\n\n  it('should merge slashes in paths correctly', function () {\n    urljoin('http://example.org', 'a//', 'b//', 'A//', 'B//')\n      .should.eql('http://example.org/a/b/A/B/');\n  });\n\n  it('should merge colons in paths correctly', function () {\n    urljoin('http://example.org/', ':foo:', 'bar')\n      .should.eql('http://example.org/:foo:/bar');\n  });\n\n  it('should merge just a simple path without URL correctly', function() {\n    urljoin('/', 'test')\n      .should.eql('/test');\n  });\n\n  it('should fail with segments that are not string', function() {\n    assert.throws(() => urljoin(true),\n                  /Url must be a string. Received true/);\n    assert.throws(() => urljoin('http://blabla.com/', 1),\n                  /Url must be a string. Received 1/);\n    assert.throws(() => urljoin('http://blabla.com/', undefined, 'test'),\n                  /Url must be a string. Received undefined/);\n    assert.throws(() => urljoin('http://blabla.com/', null, 'test'),\n                  /Url must be a string. Received null/);\n    assert.throws(() => urljoin('http://blabla.com/', { foo: 123 }, 'test'),\n                  /Url must be a string. Received \\[object Object\\]/);\n  });\n\n  it('should merge a path with colon properly', function(){\n    urljoin('/users/:userId', '/cars/:carId')\n      .should.eql('/users/:userId/cars/:carId');\n  });\n\n  it('should merge slashes in protocol correctly', function () {\n    urljoin('http://example.org', 'a')\n      .should.eql('http://example.org/a');\n    urljoin('http:', '//example.org', 'a')\n      .should.eql('http://example.org/a');\n    urljoin('http:///example.org', 'a')\n      .should.eql('http://example.org/a');\n    urljoin('file:///example.org', 'a')\n      .should.eql('file:///example.org/a');\n\n    urljoin('file:example.org', 'a')\n      .should.eql('file://example.org/a');\n\n    urljoin('file:/', 'example.org', 'a')\n      .should.eql('file://example.org/a');\n    urljoin('file:', '/example.org', 'a')\n      .should.eql('file://example.org/a');\n    urljoin('file:', '//example.org', 'a')\n      .should.eql('file://example.org/a');\n  });\n\n  it('should skip empty strings', function() {\n    urljoin('http://foobar.com', '', 'test')\n      .should.eql('http://foobar.com/test');\n    urljoin('', 'http://foobar.com', '', 'test')\n      .should.eql('http://foobar.com/test');\n  });\n\n  it('should return an empty string if no arguments are supplied', function() {\n    urljoin().should.eql('');\n  });\n});\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/whatwg-encoding/LICENSE.txt",
    "content": "Copyright © Domenic Denicola <d@domenic.me>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/whatwg-encoding/README.md",
    "content": "# Decode According to the WHATWG Encoding Standard\n\nThis package provides a thin layer on top of [iconv-lite](https://github.com/ashtuchkin/iconv-lite) which makes it expose some of the same primitives as the [Encoding Standard](https://encoding.spec.whatwg.org/).\n\n```js\nconst whatwgEncoding = require(\"whatwg-encoding\");\n\nconsole.assert(whatwgEncoding.labelToName(\"latin1\") === \"windows-1252\");\nconsole.assert(whatwgEncoding.labelToName(\"  CYRILLic \") === \"ISO-8859-5\");\n\nconsole.assert(whatwgEncoding.isSupported(\"IBM866\") === true);\n\n// Not supported by the Encoding Standard\nconsole.assert(whatwgEncoding.isSupported(\"UTF-32\") === false);\n\n// In the Encoding Standard, but this package can't decode it\nconsole.assert(whatwgEncoding.isSupported(\"x-mac-cyrillic\") === false);\n\nconsole.assert(whatwgEncoding.getBOMEncoding(new Uint8Array([0xFE, 0xFF])) === \"UTF-16BE\");\nconsole.assert(whatwgEncoding.getBOMEncoding(new Uint8Array([0x48, 0x69])) === null);\n\nconsole.assert(whatwgEncoding.decode(new Uint8Array([0x48, 0x69]), \"UTF-8\") === \"Hi\");\n```\n\n## API\n\n- `decode(uint8Array, fallbackEncodingName)`: performs the [decode](https://encoding.spec.whatwg.org/#decode) algorithm (in which any BOM will override the passed fallback encoding), and returns the resulting string\n- `labelToName(label)`: performs the [get an encoding](https://encoding.spec.whatwg.org/#concept-encoding-get) algorithm and returns the resulting encoding's name, or `null` for failure\n- `isSupported(name)`: returns whether the encoding is one of [the encodings](https://encoding.spec.whatwg.org/#names-and-labels) of the Encoding Standard, _and_ is an encoding that this package can decode (via iconv-lite)\n- `getBOMEncoding(uint8Array)`: sniffs the first 2–3 bytes of the supplied `Uint8Array`, returning one of the encoding names `\"UTF-8\"`, `\"UTF-16LE\"`, or `\"UTF-16BE\"` if the appropriate BOM is present, or `null` if no BOM is present\n\n## Unsupported encodings\n\nSince we rely on iconv-lite, we are limited to support only the encodings that they support. Currently we are missing support for:\n\n- ISO-2022-JP\n- ISO-8859-8-I\n- replacement\n- x-mac-cyrillic\n- x-user-defined\n\nPassing these encoding names will return `false` when calling `isSupported`, and passing any of the possible labels for these encodings to `labelToName` will return `null`.\n\n## Credits\n\nThis package was originally based on the excellent work of [@nicolashenry](https://github.com/nicolashenry), [in jsdom](https://github.com/tmpvar/jsdom/blob/7ce11776ce161e8d5921a7a183585327400f786b/lib/jsdom/living/helpers/encoding.js). It has since been pulled out into this separate package.\n\n## Alternatives\n\nIf you are looking for a JavaScript implementation of the Encoding Standard's `TextEncoder` and `TextDecoder` APIs, you'll want [@inexorabletash](https://github.com/inexorabletash)'s [text-encoding](https://github.com/inexorabletash/text-encoding) package. Node.js also has them [built-in](https://nodejs.org/dist/latest/docs/api/globals.html#globals_textdecoder).\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/whatwg-encoding/lib/labels-to-names.json",
    "content": "{\n  \"866\": \"IBM866\",\n  \"unicode-1-1-utf-8\": \"UTF-8\",\n  \"unicode11utf8\": \"UTF-8\",\n  \"unicode20utf8\": \"UTF-8\",\n  \"utf-8\": \"UTF-8\",\n  \"utf8\": \"UTF-8\",\n  \"x-unicode20utf8\": \"UTF-8\",\n  \"cp866\": \"IBM866\",\n  \"csibm866\": \"IBM866\",\n  \"ibm866\": \"IBM866\",\n  \"csisolatin2\": \"ISO-8859-2\",\n  \"iso-8859-2\": \"ISO-8859-2\",\n  \"iso-ir-101\": \"ISO-8859-2\",\n  \"iso8859-2\": \"ISO-8859-2\",\n  \"iso88592\": \"ISO-8859-2\",\n  \"iso_8859-2\": \"ISO-8859-2\",\n  \"iso_8859-2:1987\": \"ISO-8859-2\",\n  \"l2\": \"ISO-8859-2\",\n  \"latin2\": \"ISO-8859-2\",\n  \"csisolatin3\": \"ISO-8859-3\",\n  \"iso-8859-3\": \"ISO-8859-3\",\n  \"iso-ir-109\": \"ISO-8859-3\",\n  \"iso8859-3\": \"ISO-8859-3\",\n  \"iso88593\": \"ISO-8859-3\",\n  \"iso_8859-3\": \"ISO-8859-3\",\n  \"iso_8859-3:1988\": \"ISO-8859-3\",\n  \"l3\": \"ISO-8859-3\",\n  \"latin3\": \"ISO-8859-3\",\n  \"csisolatin4\": \"ISO-8859-4\",\n  \"iso-8859-4\": \"ISO-8859-4\",\n  \"iso-ir-110\": \"ISO-8859-4\",\n  \"iso8859-4\": \"ISO-8859-4\",\n  \"iso88594\": \"ISO-8859-4\",\n  \"iso_8859-4\": \"ISO-8859-4\",\n  \"iso_8859-4:1988\": \"ISO-8859-4\",\n  \"l4\": \"ISO-8859-4\",\n  \"latin4\": \"ISO-8859-4\",\n  \"csisolatincyrillic\": \"ISO-8859-5\",\n  \"cyrillic\": \"ISO-8859-5\",\n  \"iso-8859-5\": \"ISO-8859-5\",\n  \"iso-ir-144\": \"ISO-8859-5\",\n  \"iso8859-5\": \"ISO-8859-5\",\n  \"iso88595\": \"ISO-8859-5\",\n  \"iso_8859-5\": \"ISO-8859-5\",\n  \"iso_8859-5:1988\": \"ISO-8859-5\",\n  \"arabic\": \"ISO-8859-6\",\n  \"asmo-708\": \"ISO-8859-6\",\n  \"csiso88596e\": \"ISO-8859-6\",\n  \"csiso88596i\": \"ISO-8859-6\",\n  \"csisolatinarabic\": \"ISO-8859-6\",\n  \"ecma-114\": \"ISO-8859-6\",\n  \"iso-8859-6\": \"ISO-8859-6\",\n  \"iso-8859-6-e\": \"ISO-8859-6\",\n  \"iso-8859-6-i\": \"ISO-8859-6\",\n  \"iso-ir-127\": \"ISO-8859-6\",\n  \"iso8859-6\": \"ISO-8859-6\",\n  \"iso88596\": \"ISO-8859-6\",\n  \"iso_8859-6\": \"ISO-8859-6\",\n  \"iso_8859-6:1987\": \"ISO-8859-6\",\n  \"csisolatingreek\": \"ISO-8859-7\",\n  \"ecma-118\": \"ISO-8859-7\",\n  \"elot_928\": \"ISO-8859-7\",\n  \"greek\": \"ISO-8859-7\",\n  \"greek8\": \"ISO-8859-7\",\n  \"iso-8859-7\": \"ISO-8859-7\",\n  \"iso-ir-126\": \"ISO-8859-7\",\n  \"iso8859-7\": \"ISO-8859-7\",\n  \"iso88597\": \"ISO-8859-7\",\n  \"iso_8859-7\": \"ISO-8859-7\",\n  \"iso_8859-7:1987\": \"ISO-8859-7\",\n  \"sun_eu_greek\": \"ISO-8859-7\",\n  \"csiso88598e\": \"ISO-8859-8\",\n  \"csisolatinhebrew\": \"ISO-8859-8\",\n  \"hebrew\": \"ISO-8859-8\",\n  \"iso-8859-8\": \"ISO-8859-8\",\n  \"iso-8859-8-e\": \"ISO-8859-8\",\n  \"iso-ir-138\": \"ISO-8859-8\",\n  \"iso8859-8\": \"ISO-8859-8\",\n  \"iso88598\": \"ISO-8859-8\",\n  \"iso_8859-8\": \"ISO-8859-8\",\n  \"iso_8859-8:1988\": \"ISO-8859-8\",\n  \"visual\": \"ISO-8859-8\",\n  \"csisolatin6\": \"ISO-8859-10\",\n  \"iso-8859-10\": \"ISO-8859-10\",\n  \"iso-ir-157\": \"ISO-8859-10\",\n  \"iso8859-10\": \"ISO-8859-10\",\n  \"iso885910\": \"ISO-8859-10\",\n  \"l6\": \"ISO-8859-10\",\n  \"latin6\": \"ISO-8859-10\",\n  \"iso-8859-13\": \"ISO-8859-13\",\n  \"iso8859-13\": \"ISO-8859-13\",\n  \"iso885913\": \"ISO-8859-13\",\n  \"iso-8859-14\": \"ISO-8859-14\",\n  \"iso8859-14\": \"ISO-8859-14\",\n  \"iso885914\": \"ISO-8859-14\",\n  \"csisolatin9\": \"ISO-8859-15\",\n  \"iso-8859-15\": \"ISO-8859-15\",\n  \"iso8859-15\": \"ISO-8859-15\",\n  \"iso885915\": \"ISO-8859-15\",\n  \"iso_8859-15\": \"ISO-8859-15\",\n  \"l9\": \"ISO-8859-15\",\n  \"iso-8859-16\": \"ISO-8859-16\",\n  \"cskoi8r\": \"KOI8-R\",\n  \"koi\": \"KOI8-R\",\n  \"koi8\": \"KOI8-R\",\n  \"koi8-r\": \"KOI8-R\",\n  \"koi8_r\": \"KOI8-R\",\n  \"koi8-ru\": \"KOI8-U\",\n  \"koi8-u\": \"KOI8-U\",\n  \"csmacintosh\": \"macintosh\",\n  \"mac\": \"macintosh\",\n  \"macintosh\": \"macintosh\",\n  \"x-mac-roman\": \"macintosh\",\n  \"dos-874\": \"windows-874\",\n  \"iso-8859-11\": \"windows-874\",\n  \"iso8859-11\": \"windows-874\",\n  \"iso885911\": \"windows-874\",\n  \"tis-620\": \"windows-874\",\n  \"windows-874\": \"windows-874\",\n  \"cp1250\": \"windows-1250\",\n  \"windows-1250\": \"windows-1250\",\n  \"x-cp1250\": \"windows-1250\",\n  \"cp1251\": \"windows-1251\",\n  \"windows-1251\": \"windows-1251\",\n  \"x-cp1251\": \"windows-1251\",\n  \"ansi_x3.4-1968\": \"windows-1252\",\n  \"ascii\": \"windows-1252\",\n  \"cp1252\": \"windows-1252\",\n  \"cp819\": \"windows-1252\",\n  \"csisolatin1\": \"windows-1252\",\n  \"ibm819\": \"windows-1252\",\n  \"iso-8859-1\": \"windows-1252\",\n  \"iso-ir-100\": \"windows-1252\",\n  \"iso8859-1\": \"windows-1252\",\n  \"iso88591\": \"windows-1252\",\n  \"iso_8859-1\": \"windows-1252\",\n  \"iso_8859-1:1987\": \"windows-1252\",\n  \"l1\": \"windows-1252\",\n  \"latin1\": \"windows-1252\",\n  \"us-ascii\": \"windows-1252\",\n  \"windows-1252\": \"windows-1252\",\n  \"x-cp1252\": \"windows-1252\",\n  \"cp1253\": \"windows-1253\",\n  \"windows-1253\": \"windows-1253\",\n  \"x-cp1253\": \"windows-1253\",\n  \"cp1254\": \"windows-1254\",\n  \"csisolatin5\": \"windows-1254\",\n  \"iso-8859-9\": \"windows-1254\",\n  \"iso-ir-148\": \"windows-1254\",\n  \"iso8859-9\": \"windows-1254\",\n  \"iso88599\": \"windows-1254\",\n  \"iso_8859-9\": \"windows-1254\",\n  \"iso_8859-9:1989\": \"windows-1254\",\n  \"l5\": \"windows-1254\",\n  \"latin5\": \"windows-1254\",\n  \"windows-1254\": \"windows-1254\",\n  \"x-cp1254\": \"windows-1254\",\n  \"cp1255\": \"windows-1255\",\n  \"windows-1255\": \"windows-1255\",\n  \"x-cp1255\": \"windows-1255\",\n  \"cp1256\": \"windows-1256\",\n  \"windows-1256\": \"windows-1256\",\n  \"x-cp1256\": \"windows-1256\",\n  \"cp1257\": \"windows-1257\",\n  \"windows-1257\": \"windows-1257\",\n  \"x-cp1257\": \"windows-1257\",\n  \"cp1258\": \"windows-1258\",\n  \"windows-1258\": \"windows-1258\",\n  \"x-cp1258\": \"windows-1258\",\n  \"chinese\": \"GBK\",\n  \"csgb2312\": \"GBK\",\n  \"csiso58gb231280\": \"GBK\",\n  \"gb2312\": \"GBK\",\n  \"gb_2312\": \"GBK\",\n  \"gb_2312-80\": \"GBK\",\n  \"gbk\": \"GBK\",\n  \"iso-ir-58\": \"GBK\",\n  \"x-gbk\": \"GBK\",\n  \"gb18030\": \"gb18030\",\n  \"big5\": \"Big5\",\n  \"big5-hkscs\": \"Big5\",\n  \"cn-big5\": \"Big5\",\n  \"csbig5\": \"Big5\",\n  \"x-x-big5\": \"Big5\",\n  \"cseucpkdfmtjapanese\": \"EUC-JP\",\n  \"euc-jp\": \"EUC-JP\",\n  \"x-euc-jp\": \"EUC-JP\",\n  \"csshiftjis\": \"Shift_JIS\",\n  \"ms932\": \"Shift_JIS\",\n  \"ms_kanji\": \"Shift_JIS\",\n  \"shift-jis\": \"Shift_JIS\",\n  \"shift_jis\": \"Shift_JIS\",\n  \"sjis\": \"Shift_JIS\",\n  \"windows-31j\": \"Shift_JIS\",\n  \"x-sjis\": \"Shift_JIS\",\n  \"cseuckr\": \"EUC-KR\",\n  \"csksc56011987\": \"EUC-KR\",\n  \"euc-kr\": \"EUC-KR\",\n  \"iso-ir-149\": \"EUC-KR\",\n  \"korean\": \"EUC-KR\",\n  \"ks_c_5601-1987\": \"EUC-KR\",\n  \"ks_c_5601-1989\": \"EUC-KR\",\n  \"ksc5601\": \"EUC-KR\",\n  \"ksc_5601\": \"EUC-KR\",\n  \"windows-949\": \"EUC-KR\",\n  \"unicodefffe\": \"UTF-16BE\",\n  \"utf-16be\": \"UTF-16BE\",\n  \"csunicode\": \"UTF-16LE\",\n  \"iso-10646-ucs-2\": \"UTF-16LE\",\n  \"ucs-2\": \"UTF-16LE\",\n  \"unicode\": \"UTF-16LE\",\n  \"unicodefeff\": \"UTF-16LE\",\n  \"utf-16\": \"UTF-16LE\",\n  \"utf-16le\": \"UTF-16LE\"\n}"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/whatwg-encoding/lib/supported-names.json",
    "content": "[\n  \"UTF-8\",\n  \"IBM866\",\n  \"ISO-8859-2\",\n  \"ISO-8859-3\",\n  \"ISO-8859-4\",\n  \"ISO-8859-5\",\n  \"ISO-8859-6\",\n  \"ISO-8859-7\",\n  \"ISO-8859-8\",\n  \"ISO-8859-10\",\n  \"ISO-8859-13\",\n  \"ISO-8859-14\",\n  \"ISO-8859-15\",\n  \"ISO-8859-16\",\n  \"KOI8-R\",\n  \"KOI8-U\",\n  \"macintosh\",\n  \"windows-874\",\n  \"windows-1250\",\n  \"windows-1251\",\n  \"windows-1252\",\n  \"windows-1253\",\n  \"windows-1254\",\n  \"windows-1255\",\n  \"windows-1256\",\n  \"windows-1257\",\n  \"windows-1258\",\n  \"GBK\",\n  \"gb18030\",\n  \"Big5\",\n  \"EUC-JP\",\n  \"Shift_JIS\",\n  \"EUC-KR\",\n  \"UTF-16BE\",\n  \"UTF-16LE\"\n]"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/whatwg-encoding/lib/whatwg-encoding.js",
    "content": "\"use strict\";\nconst iconvLite = require(\"iconv-lite\");\nconst supportedNames = require(\"./supported-names.json\");\nconst labelsToNames = require(\"./labels-to-names.json\");\n\nconst supportedNamesSet = new Set(supportedNames);\n\n// https://encoding.spec.whatwg.org/#concept-encoding-get\nexports.labelToName = label => {\n  label = String(label).trim().toLowerCase();\n\n  return labelsToNames[label] || null;\n};\n\n// https://encoding.spec.whatwg.org/#decode\nexports.decode = (uint8Array, fallbackEncodingName) => {\n  let encoding = fallbackEncodingName;\n  if (!exports.isSupported(encoding)) {\n    throw new RangeError(`\"${encoding}\" is not a supported encoding name`);\n  }\n\n  const bomEncoding = exports.getBOMEncoding(uint8Array);\n  if (bomEncoding !== null) {\n    encoding = bomEncoding;\n  }\n\n  // iconv-lite will strip BOMs for us, so no need to do the stuff the spec does\n\n  return iconvLite.decode(uint8Array, encoding);\n};\n\n// https://github.com/whatwg/html/issues/1910#issuecomment-254017369\nexports.getBOMEncoding = uint8Array => {\n  if (uint8Array[0] === 0xFE && uint8Array[1] === 0xFF) {\n    return \"UTF-16BE\";\n  } else if (uint8Array[0] === 0xFF && uint8Array[1] === 0xFE) {\n    return \"UTF-16LE\";\n  } else if (uint8Array[0] === 0xEF && uint8Array[1] === 0xBB && uint8Array[2] === 0xBF) {\n    return \"UTF-8\";\n  }\n\n  return null;\n};\n\nexports.isSupported = name => {\n  return supportedNamesSet.has(String(name));\n};\n"
  },
  {
    "path": "templates/bin/node/http-server/node_modules/whatwg-encoding/package.json",
    "content": "{\n  \"name\": \"whatwg-encoding\",\n  \"description\": \"Decode strings according to the WHATWG Encoding Standard\",\n  \"keywords\": [\n    \"encoding\",\n    \"whatwg\"\n  ],\n  \"version\": \"2.0.0\",\n  \"author\": \"Domenic Denicola <d@domenic.me> (https://domenic.me/)\",\n  \"license\": \"MIT\",\n  \"repository\": \"jsdom/whatwg-encoding\",\n  \"main\": \"lib/whatwg-encoding.js\",\n  \"files\": [\n    \"lib/\"\n  ],\n  \"scripts\": {\n    \"test\": \"mocha\",\n    \"lint\": \"eslint .\",\n    \"prepare\": \"node scripts/update.js\"\n  },\n  \"dependencies\": {\n    \"iconv-lite\": \"0.6.3\"\n  },\n  \"devDependencies\": {\n    \"@domenic/eslint-config\": \"^1.3.0\",\n    \"eslint\": \"^7.32.0\",\n    \"minipass-fetch\": \"^1.4.1\",\n    \"mocha\": \"^9.1.1\"\n  },\n  \"engines\": {\n    \"node\": \">=12\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/http-server/package.json",
    "content": "{\n  \"name\": \"http-server\",\n  \"version\": \"14.1.1\",\n  \"description\": \"A simple zero-configuration command-line http server\",\n  \"main\": \"./lib/http-server\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/http-party/http-server.git\"\n  },\n  \"keywords\": [\n    \"cli\",\n    \"command\",\n    \"static\",\n    \"http\",\n    \"https\",\n    \"http-server\",\n    \"https-server\",\n    \"server\"\n  ],\n  \"scripts\": {\n    \"start\": \"node ./bin/http-server\",\n    \"test\": \"tap --reporter=spec test/*.test.js\",\n    \"test-watch\": \"tap --reporter=spec --watch test/*.test.js\"\n  },\n  \"files\": [\n    \"lib\",\n    \"bin\",\n    \"doc\"\n  ],\n  \"man\": \"./doc/http-server.1\",\n  \"engines\": {\n    \"node\": \">=12\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Charlie Robbins\",\n      \"email\": \"charlie.robbins@gmail.com\"\n    },\n    {\n      \"name\": \"Marak Squires\",\n      \"email\": \"marak.squires@gmail.com\"\n    },\n    {\n      \"name\": \"Charlie McConnell\",\n      \"email\": \"charlie@charlieistheman.com\"\n    },\n    {\n      \"name\": \"Joshua Holbrook\",\n      \"email\": \"josh.holbrook@gmail.com\"\n    },\n    {\n      \"name\": \"Maciej Małecki\",\n      \"email\": \"maciej.malecki@notimplemented.org\"\n    },\n    {\n      \"name\": \"Matthew Bergman\",\n      \"email\": \"mzbphoto@gmail.com\"\n    },\n    {\n      \"name\": \"brad dunbar\",\n      \"email\": \"dunbarb2@gmail.com\"\n    },\n    {\n      \"name\": \"Dominic Tarr\"\n    },\n    {\n      \"name\": \"Travis Person\",\n      \"email\": \"travis.person@gmail.com\"\n    },\n    {\n      \"name\": \"Jinkwon Lee\",\n      \"email\": \"master@bdyne.net\"\n    },\n    {\n      \"name\": \"BigBlueHat\",\n      \"email\": \"byoung@bigbluehat.com\"\n    },\n    {\n      \"name\": \"Daniel Dalton\",\n      \"email\": \"daltond2@hawkmail.newpaltz.edu\"\n    },\n    {\n      \"name\": \"Jade Michael Thornton\",\n      \"email\": \"jademichael@jmthornton.net\"\n    }\n  ],\n  \"dependencies\": {\n    \"basic-auth\": \"^2.0.1\",\n    \"chalk\": \"^4.1.2\",\n    \"corser\": \"^2.0.1\",\n    \"he\": \"^1.2.0\",\n    \"html-encoding-sniffer\": \"^3.0.0\",\n    \"http-proxy\": \"^1.18.1\",\n    \"mime\": \"^1.6.0\",\n    \"minimist\": \"^1.2.6\",\n    \"opener\": \"^1.5.1\",\n    \"portfinder\": \"^1.0.28\",\n    \"secure-compare\": \"3.0.1\",\n    \"union\": \"~0.5.0\",\n    \"url-join\": \"^4.0.1\"\n  },\n  \"devDependencies\": {\n    \"eol\": \"^0.9.1\",\n    \"eslint\": \"^4.19.1\",\n    \"eslint-config-populist\": \"^4.2.0\",\n    \"express\": \"^4.17.1\",\n    \"request\": \"^2.88.2\",\n    \"tap\": \"^14.11.0\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/http-party/http-server/issues\"\n  },\n  \"license\": \"MIT\",\n  \"preferGlobal\": true,\n  \"bin\": {\n    \"http-server\": \"./bin/http-server\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/CHANGELOG.md",
    "content": "# Changelog\n\n## v5.17.4\n\n - Fix crash when trying to negate a class (`!class{}`)\n - Avoid outputting comments between `yield`/`await` and its argument\n - Fix detection of left-hand-side of assignment, to avoid optimizing it like any other expression in some edge cases\n\n## v5.17.3\n\n - Fix issue with trimming a static class property's contents accessing the class as `this`.\n\n## v5.17.2\n - Be less conservative when detecting use-before-definition of `var` in hoisted functions.\n - Support unusual (but perfectly valid) initializers of for-in and for-of loops.\n - Fix issue where hoisted function would be dropped if it was after a `continue` statement\n\n## v5.17.1\n - Fix evaluating `.length` when the source array might've been mutated\n\n## v5.17.0\n - Drop vestigial `= undefined` default argument in IIFE calls (#1366)\n - Evaluate known arrays' `.length` property when statically determinable\n - Add `@__KEY__` annotation to mangle string literals (#1365)\n\n## v5.16.9\n - Fix parentheses in output of optional chains (`a?.b`) (#1374)\n - More documentation on source maps (#1368)\n - New `lhs_constants` option, allowing to stop Terser from swapping comparison operands (#1361)\n\n## v5.16.8\n\n - Become even less conservative around function definitions for `reduce_vars`\n - Fix parsing context of `import.meta` expressions such that method calls are allowed\n\n## v5.16.6\n\n - Become less conservative with analyzing function definitions for `reduce_vars`\n - Parse `import.meta` as a real AST node and not an `object.property`\n\n## v5.16.5\n\n - Correctly handle AST transform functions that mutate children arrays\n - Don't mutate the options object passed to Terser (#1342)\n - Do not treat BigInt like a number\n\n## v5.16.4\n\n - Keep `(defaultArg = undefined) => ...`, because default args don't count for function length\n - Prevent inlining variables into `?.` optional chains\n - Avoid removing unused arguments while transforming\n - Optimize iterating AST node lists\n - Make sure `catch` and `finally` aren't children of `try` in the AST\n - Use modern unicode property escapes (`\\p{...}`) to parse identifiers when available\n\n## v5.16.3\n\n - Ensure function definitions, don't assume the values of variables defined after them.\n\n## v5.16.2\n\n - Fix sourcemaps with non-ascii characters (#1318)\n - Support string module name and export * as (#1336)\n - Do not move `let` out of `for` initializers, as it can change scoping\n - Fix a corner case that would generate the invalid syntax `if (something) let x` (\"let\" in braceless if body)\n - Knowledge of more native object properties (#1330)\n - Got rid of Travis (#1323)\n - Added semi-secret `asObject` sourcemap option to typescript defs (#1321)\n\n## v5.16.1\n\n - Properly handle references in destructurings (`const { [reference]: val } = ...`)\n - Allow parsing of `.#privatefield` in nested classes\n - Do not evaluate operations that return large strings if that would make the output code larger\n - Make `collapse_vars` handle block scope correctly\n - Internal improvements: Typos (#1311), more tests, small-scale refactoring\n\n## v5.16.0\n\n - Disallow private fields in object bodies (#1011)\n - Parse `#privatefield in object` (#1279)\n - Compress `#privatefield in object`\n\n## v5.15.1\n\n - Fixed missing parentheses around optional chains\n - Avoid bare `let` or `const` as the bodies of `if` statements (#1253)\n - Small internal fixes (#1271)\n - Avoid inlining a class twice and creating two equivalent but `!==` classes.\n\n## v5.15.0\n - Basic support for ES2022 class static initializer blocks.\n - Add `AudioWorkletNode` constructor options to domprops list (#1230)\n - Make identity function inliner not inline `id(...expandedArgs)`\n\n## v5.14.2\n\n - Security fix for RegExps that should not be evaluated (regexp DDOS)\n - Source maps improvements (#1211)\n - Performance improvements in long property access evaluation (#1213)\n\n## v5.14.1\n - keep_numbers option added to TypeScript defs (#1208)\n - Fixed parsing of nested template strings (#1204)\n\n## v5.14.0\n - Switched to @jridgewell/source-map for sourcemap generation (#1190, #1181)\n - Fixed source maps with non-terminated segments (#1106)\n - Enabled typescript types to be imported from the package (#1194)\n - Extra DOM props have been added (#1191)\n - Delete the AST while generating code, as a means to save RAM\n\n## v5.13.1\n - Removed self-assignments (`varname=varname`) (closes #1081)\n - Separated inlining code (for inlining things into references, or removing IIFEs)\n - Allow multiple identifiers with the same name in `var` destructuring (eg `var { a, a } = x`) (#1176)\n\n## v5.13.0\n\n - All calls to eval() were removed (#1171, #1184)\n - `source-map` was updated to 0.8.0-beta.0 (#1164)\n - NavigatorUAData was added to domprops to avoid property mangling (#1166)\n\n## v5.12.1\n\n - Fixed an issue with function definitions inside blocks (#1155)\n - Fixed parens of `new` in some situations (closes #1159)\n\n## v5.12.0\n\n - `TERSER_DEBUG_DIR` environment variable\n - @copyright comments are now preserved with the comments=\"some\" option (#1153)\n\n## v5.11.0\n\n - Unicode code point escapes (`\\u{abcde}`) are not emitted inside RegExp literals anymore (#1147)\n - acorn is now a regular dependency\n\n## v5.10.0\n\n - Massive optimization to max_line_len (#1109)\n - Basic support for import assertions\n - Marked ES2022 Object.hasOwn as a pure function\n - Fix `delete optional?.property`\n - New CI/CD pipeline with github actions (#1057)\n - Fix reordering of switch branches (#1092), (#1084)\n - Fix error when creating a class property called `get`\n - Acorn dependency is now an optional peerDependency\n - Fix mangling collision with exported variables (#1072)\n - Fix an issue with `return someVariable = (async () => { ... })()` (#1073)\n\n## v5.9.0\n\n - Collapsing switch cases with the same bodies (even if they're not next to each other) (#1070).\n - Fix evaluation of optional chain expressions (#1062)\n - Fix mangling collision in ESM exports (#1063)\n - Fix issue with mutating function objects after a second pass (#1047)\n - Fix for inlining object spread `{ ...obj }` (#1071)\n - Typescript typings fix (#1069)\n\n## v5.8.0\n\n - Fixed shadowing variables while moving code in some cases (#1065)\n - Stop mangling computed & quoted properties when keep_quoted is enabled.\n - Fix for mangling private getter/setter and .#private access (#1060, #1068)\n - Array.from has a new optimization when the unsafe option is set (#737)\n - Mangle/propmangle let you generate your own identifiers through the nth_identifier option (#1061)\n - More optimizations to switch statements (#1044)\n\n## v5.7.2\n\n - Fixed issues with compressing functions defined in `global_defs` option (#1036)\n - New recipe for using Terser in gulp was added to RECIPES.md (#1035)\n - Fixed issues with `??` and `?.` (#1045)\n - Future reserved words such as `package` no longer require you to disable strict mode to be used as names.\n - Refactored huge compressor file into multiple more focused files.\n - Avoided unparenthesized `in` operator in some for loops (it breaks parsing because of for..in loops)\n - Improved documentation (#1021, #1025)\n - More type definitions (#1021)\n\n## v5.7.1\n\n - Avoided collapsing assignments together if it would place a chain assignment on the left hand side, which is invalid syntax (`a?.b = c`)\n - Removed undefined from object expansions (`{ ...void 0 }` -> `{}`)\n - Fix crash when checking if something is nullish or undefined (#1009)\n - Fixed comparison of private class properties (#1015)\n - Minor performance improvements (#993)\n - Fixed scope of function defs in strict mode (they are block scoped)\n\n## v5.7.0\n\n - Several compile-time evaluation and inlining fixes\n - Allow `reduce_funcs` to be disabled again.\n - Add `spidermonkey` options to parse and format (#974)\n - Accept `{get = \"default val\"}` and `{set = \"default val\"}` in destructuring arguments.\n - Change package.json export map to help require.resolve (#971)\n - Improve docs\n - Fix `export default` of an anonymous class with `extends`\n\n## v5.6.1\n\n - Mark assignments to the `.prototype` of a class as pure\n - Parenthesize `await` on the left of `**` (while accepting legacy non-parenthesised input)\n - Avoided outputting NUL bytes in optimized RegExps, to stop the output from breaking other tools\n - Added `exports` to domprops (#939)\n - Fixed a crash when spreading `...this`\n - Fixed the computed size of arrow functions, which improves their inlining\n\n## v5.6.0\n\n - Added top-level await\n - Beautify option has been removed in #895\n - Private properties, getters and setters have been added in #913 and some more commits\n - Docs improvements: #896, #903, #916\n\n## v5.5.1\n\n - Fixed object properties with unicode surrogates on safari.\n\n## v5.5.0\n\n - Fixed crash when inlining uninitialized variable into template string.\n - The sourcemap for dist was removed for being too large.\n\n## v5.4.0\n\n - Logical assignment\n - Change `let x = undefined` to just `let x`\n - Removed some optimizations for template strings, placing them behind `unsafe` options. Reason: adding strings is not equivalent to template strings, due to valueOf differences.\n - The AST_Token class was slimmed down in order to use less memory.\n\n## v5.3.8\n\n - Restore node 13 support\n\n## v5.3.7\n\nHotfix release, fixes package.json \"engines\" syntax\n\n## v5.3.6\n\n - Fixed parentheses when outputting `??` mixed with `||` and `&&`\n - Improved hygiene of the symbol generator\n\n## v5.3.5\n\n - Avoid moving named functions into default exports.\n - Enabled transform() for chain expressions. This allows AST transformers to reach inside chain expressions.\n\n## v5.3.4\n\n - Fixed a crash when hoisting (with `hoist_vars`) a destructuring variable declaration\n\n## v5.3.3\n\n - `source-map` library has been updated, bringing memory usage and CPU time improvements when reading input source maps (the SourceMapConsumer is now WASM based).\n - The `wrap_func_args` option now also wraps arrow functions, as opposed to only function expressions.\n\n## v5.3.2\n\n - Prevented spread operations from being expanded when the expanded array/object contains getters, setters, or array holes.\n - Fixed _very_ slow self-recursion in some cases of removing extraneous parentheses from `+` operations.\n\n## v5.3.1\n\n - An issue with destructuring declarations when `pure_getters` is enabled has been fixed\n - Fixed a crash when chain expressions need to be shallowly compared\n - Made inlining functions more conservative to make sure a function that contains a reference to itself isn't moved into a place that can create multiple instances of itself.\n\n## v5.3.0\n\n - Fixed a crash when compressing object spreads in some cases\n - Fixed compiletime evaluation of optional chains (caused typeof a?.b to always return \"object\")\n - domprops has been updated to contain every single possible prop\n\n## v5.2.1\n\n - The parse step now doesn't accept an `ecma` option, so that all ES code is accepted.\n - Optional dotted chains now accept keywords, just like dotted expressions (`foo?.default`)\n\n## v5.2.0\n\n - Optional chaining syntax is now supported.\n - Consecutive await expressions don't have unnecessary parens\n - Taking the variable name's length (after mangling) into consideration when deciding to inline\n\n## v5.1.0\n\n - `import.meta` is now supported\n - Typescript typings have been improved\n\n## v5.0.0\n\n - `in` operator now taken into account during property mangle.\n - Fixed infinite loop in face of a reference loop in some situations.\n - Kept exports and imports around even if there's something which will throw before them.\n - The main exported bundle for commonjs, dist/bundle.min.js is no longer minified.\n\n## v5.0.0-beta.0\n\n - BREAKING: `minify()` is now async and rejects a promise instead of returning an error.\n - BREAKING: Internal AST is no longer exposed, so that it can be improved without releasing breaking changes.\n - BREAKING: Lowest supported node version is 10\n - BREAKING: There are no more warnings being emitted\n - Module is now distributed as a dual package - You can `import` and `require()` too.\n - Inline improvements were made\n\n\n-----\n\n## v4.8.1 (backport)\n\n - Security fix for RegExps that should not be evaluated (regexp DDOS)\n\n## v4.8.0\n\n - Support for numeric separators (`million = 1_000_000`) was added.\n - Assigning properties to a class is now assumed to be pure.\n - Fixed bug where `yield` wasn't considered a valid property key in generators.\n\n## v4.7.0\n\n - A bug was fixed where an arrow function would have the wrong size\n - `arguments` object is now considered safe to retrieve properties from (useful for `length`, or `0`) even when `pure_getters` is not set.\n - Fixed erroneous `const` declarations without value (which is invalid) in some corner cases when using `collapse_vars`.\n\n## v4.6.13\n\n - Fixed issue where ES5 object properties were being turned into ES6 object properties due to more lax unicode rules.\n - Fixed parsing of BigInt with lowercase `e` in them.\n\n## v4.6.12\n\n - Fixed subtree comparison code, making it see that `[1,[2, 3]]` is different from `[1, 2, [3]]`\n - Printing of unicode identifiers has been improved\n\n## v4.6.11\n\n - Read unused classes' properties and method keys, to figure out if they use other variables.\n - Prevent inlining into block scopes when there are name collisions\n - Functions are no longer inlined into parameter defaults, because they live in their own special scope.\n - When inlining identity functions, take into account the fact they may be used to drop `this` in function calls.\n - Nullish coalescing operator (`x ?? y`), plus basic optimization for it.\n - Template literals in binary expressions such as `+` have been further optimized\n\n## v4.6.10\n\n - Do not use reduce_vars when classes are present\n\n## v4.6.9\n\n - Check if block scopes actually exist in blocks\n\n## v4.6.8\n\n - Take into account \"executed bits\" of classes like static properties or computed keys, when checking if a class evaluation might throw or have side effects.\n\n## v4.6.7\n\n - Some new performance gains through a `AST_Node.size()` method which measures a node's source code length without printing it to a string first.\n - An issue with setting `--comments` to `false` in the CLI has been fixed.\n - Fixed some issues with inlining\n - `unsafe_symbols` compress option was added, which turns `Symbol(\"name\")` into just `Symbol()`\n - Brought back compress performance improvement through the `AST_Node.equivalent_to(other)` method (which was reverted in v4.6.6).\n\n## v4.6.6\n\n(hotfix release)\n\n - Reverted code to 4.6.4 to allow for more time to investigate an issue.\n\n## v4.6.5 (REVERTED)\n\n - Improved compress performance through using a new method to see if two nodes are equivalent, instead of printing them to a string.\n\n## v4.6.4\n\n - The `\"some\"` value in the `comments` output option now preserves `@lic` and other important comments when using `//`\n - `</script>` is now better escaped in regex, and in comments, when using the `inline_script` output option\n - Fixed an issue when transforming `new RegExp` into `/.../` when slashes are included in the source\n - `AST_Node.prototype.constructor` now exists, allowing for easier debugging of crashes\n - Multiple if statements with the same consequents are now collapsed\n - Typescript typings improvements\n - Optimizations while looking for surrogate pairs in strings\n\n## v4.6.3\n\n - Annotations such as `/*#__NOINLINE__*/` and `/*#__PURE__*/` may now be preserved using the `preserve_annotations` output option\n - A TypeScript definition update for the `keep_quoted` output option.\n\n## v4.6.2\n\n - A bug where functions were inlined into other functions with scope conflicts has been fixed.\n - `/*#__NOINLINE__*/` annotation fixed for more use cases where inlining happens.\n\n## v4.6.1\n\n - Fixed an issue where a class is duplicated by reduce_vars when there's a recursive reference to the class.\n\n## v4.6.0\n\n - Fixed issues with recursive class references.\n - BigInt evaluation has been prevented, stopping Terser from evaluating BigInts like it would do regular numbers.\n - Class property support has been added\n\n## v4.5.1\n\n(hotfix release)\n\n - Fixed issue where `() => ({})[something]` was not parenthesised correctly.\n\n## v4.5.0\n\n - Inlining has been improved\n - An issue where keep_fnames combined with functions declared through variables was causing name shadowing has been fixed\n - You can now set the ES version through their year\n - The output option `keep_numbers` has been added, which prevents Terser from turning `1000` into `1e3` and such\n - Internal small optimisations and refactors\n\n## v4.4.3\n\n - Number and BigInt parsing has been fixed\n - `/*#__INLINE__*/` annotation fixed for arrow functions with non-block bodies.\n - Functional tests have been added, using [this repository](https://github.com/terser/terser-functional-tests).\n - A memory leak, where the entire AST lives on after compression, has been plugged.\n\n## v4.4.2\n\n - Fixed a problem with inlining identity functions\n\n## v4.4.1\n\n*note:* This introduced a feature, therefore it should have been a minor release.\n\n - Fixed a crash when `unsafe` was enabled.\n - An issue has been fixed where `let` statements might be collapsed out of their scope.\n - Some error messages have been improved by adding quotes around variable names.\n\n## v4.4.0\n\n - Added `/*#__INLINE__*/` and `/*#__NOINLINE__*/` annotations for calls. If a call has one of these, it either forces or forbids inlining.\n\n## v4.3.11\n\n - Fixed a problem where `window` was considered safe to access, even though there are situations where it isn't (Node.js, workers...)\n - Fixed an error where `++` and `--` were considered side-effect free\n - `Number(x)` now needs both `unsafe` and and `unsafe_math` to be compressed into `+x` because `x` might be a `BigInt`\n - `keep_fnames` now correctly supports regexes when the function is in a variable declaration\n\n## v4.3.10\n\n - Fixed syntax error when repeated semicolons were encountered in classes\n - Fixed invalid output caused by the creation of empty sequences internally\n - Scopes are now updated when scopes are inlined into them\n\n## v4.3.9\n - Fixed issue with mangle's `keep_fnames` option, introduced when adding code to keep variable names of anonymous functions\n\n## v4.3.8\n\n - Typescript typings fix\n\n## v4.3.7\n\n - Parsing of regex options in the CLI (which broke in v4.3.5) was fixed.\n - typescript definition updates\n\n## v4.3.6\n\n(crash hotfix)\n\n## v4.3.5\n\n - Fixed an issue with DOS line endings strings separated by `\\` and a new line.\n - Improved fix for the output size regression related to unused references within the extends section of a class.\n - Variable names of anonymous functions (eg: `const x = () => { ... }` or `var func = function () {...}`) are now preserved when keep_fnames is true.\n - Fixed performance degradation introduced for large payloads in v4.2.0\n\n## v4.3.4\n\n - Fixed a regression where the output size was increased when unused classes were referred to in the extends clause of a class.\n - Small typescript typings fixes.\n - Comments with `@preserve`, `@license`, `@cc_on` as well as comments starting with `/*!` and `/**!` are now preserved by default.\n\n## v4.3.3\n\n - Fixed a problem where parsing template strings would mix up octal notation and a slash followed by a zero representing a null character.\n - Started accepting the name `async` in destructuring arguments with default value.\n - Now Terser takes into account side effects inside class `extends` clauses.\n - Added parens whenever there's a comment between a return statement and the returned value, to prevent issues with ASI.\n - Stopped using raw RegExp objects, since the spec is going to continue to evolve. This ensures Terser is able to process new, unknown RegExp flags and features. This is a breaking change in the AST node AST_RegExp.\n\n## v4.3.2\n\n - Typescript typing fix\n - Ensure that functions can't be inlined, by reduce_vars, into places where they're accessing variables with the same name, but from somewhere else.\n\n## v4.3.1\n\n - Fixed an issue from 4.3.0 where any block scope within a for loop erroneously had its parent set to the function scopee\n - Fixed an issue where compressing IIFEs with argument expansions would result in some parameters becoming undefined\n - addEventListener options argument's properties are now part of the DOM properties list.\n\n## v4.3.0\n\n - Do not drop computed object keys with side effects\n - Functions passed to other functions in calls are now wrapped in parentheses by default, which speeds up loading most modules\n - Objects with computed properties are now less likely to be hoisted\n - Speed and memory efficiency optimizations\n - Fixed scoping issues with `try` and `switch`\n\n## v4.2.1\n\n - Minor refactors\n - Fixed a bug similar to #369 in collapse_vars\n - Functions can no longer be inlined into a place where they're going to be compared with themselves.\n - reduce_funcs option is now legacy, as using reduce_vars without reduce_funcs caused some weird corner cases. As a result, it is now implied in reduce_vars and can't be turned off without turning off reduce_vars.\n - Bug which would cause a random stack overflow has now been fixed.\n\n## v4.2.0\n\n - When the source map URL is `inline`, don't write it to a file.\n - Fixed output parens when a lambda literal is the tag on a tagged template string.\n - The `mangle.properties.undeclared` option was added. This enables the property mangler to mangle properties of variables which can be found in the name cache, but whose properties are not known to this Terser run.\n - The v8 bug where the toString and source representations of regexes like `RegExp(\"\\\\\\n\")` includes an actual newline is now fixed.\n - Now we're guaranteed to not have duplicate comments in the output\n - Domprops updates\n\n## v4.1.4\n\n - Fixed a crash when inlining a function into somewhere else when it has interdependent, non-removable variables.\n\n## v4.1.3\n\n - Several issues with the `reduce_vars` option were fixed.\n - Starting this version, we only have a dist/bundle.min.js\n\n## v4.1.2\n\n - The hotfix was hotfixed\n\n## v4.1.1\n\n - Fixed a bug where toplevel scopes were being mixed up with lambda scopes\n\n## v4.1.0\n\n - Internal functions were replaced by `Object.assign`, `Array.prototype.some`, `Array.prototype.find` and `Array.prototype.every`.\n - A serious issue where some ESM-native code was broken was fixed.\n - Performance improvements were made.\n - Support for BigInt was added.\n - Inline efficiency was improved. Functions are now being inlined more proactively instead of being inlined only after another Compressor pass.\n\n## v4.0.2\n\n(Hotfix release. Reverts unmapped segments PR [#342](https://github.com/terser/terser/pull/342), which will be put back on Terser when the upstream issue is resolved)\n\n## v4.0.1\n\n - Collisions between the arguments of inlined functions and names in the outer scope are now being avoided while inlining\n - Unmapped segments are now preserved when compressing a file which has source maps\n - Default values of functions are now correctly converted from Mozilla AST to Terser AST\n - JSON ⊂ ECMAScript spec (if you don't know what this is you don't need to)\n - Export AST_* classes to library users\n - Fixed issue with `collapse_vars` when functions are created with the same name as a variable which already exists\n - Added `MutationObserverInit` (Object with options for initialising a mutation observer) properties to the DOM property list\n - Custom `Error` subclasses are now internally used instead of old-school Error inheritance hacks.\n - Documentation fixes\n - Performance optimizations\n\n## v4.0.0\n\n - **breaking change**: The `variables` property of all scopes has become a standard JavaScript `Map` as opposed to the old bespoke `Dictionary` object.\n - Typescript definitions were fixed\n - `terser --help` was fixed\n - The public interface was cleaned up\n - Fixed optimisation of `Array` and `new Array`\n - Added the `keep_quoted=strict` mode to mangle_props, which behaves more like Google Closure Compiler by mangling all unquoted property names, instead of reserving quoted property names automatically.\n - Fixed parent functions' parameters being shadowed in some cases\n - Allowed Terser to run in a situation where there are custom functions attached to Object.prototype\n - And more bug fixes, optimisations and internal changes\n\n## v3.17.0\n\n - More DOM properties added to --mangle-properties's DOM property list\n - Closed issue where if 2 functions had the same argument name, Terser would not inline them together properly\n - Fixed issue with `hasOwnProperty.call`\n - You can now list files to minify in a Terser config file\n - Started replacing `new Array(<number>)` with an array literal\n - Started using ES6 capabilities like `Set` and the `includes` method for strings and arrays\n\n## v3.16.1\n\n - Fixed issue where Terser being imported with `import` would cause it not to work due to the `__esModule` property. (PR #254 was submitted, which was nice, but since it wasn't a pure commonJS approach I decided to go with my own solution)\n\n## v3.16.0\n\n - No longer leaves names like Array or Object or window as a SimpleStatement (statement which is just a single expression).\n - Add support for sections sourcemaps (IndexedSourceMapConsumer)\n - Drops node.js v4 and starts using commonJS\n - Is now built with rollup\n\n## v3.15.0\n\n - Inlined spread syntax (`[...[1, 2, 3], 4, 5] => [1, 2, 3, 4, 5]`) in arrays and objects.\n - Fixed typo in compressor warning\n - Fixed inline source map input bug\n - Fixed parsing of template literals with unnecessary escapes (Like `\\\\a`)\n"
  },
  {
    "path": "templates/bin/node/terser/LICENSE",
    "content": "Terser is released under the BSD license:\n\nCopyright 2012-2018 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n    * Redistributions of source code must retain the above\n      copyright notice, this list of conditions and the following\n      disclaimer.\n\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials\n      provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\nTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n"
  },
  {
    "path": "templates/bin/node/terser/PATRONS.md",
    "content": "# Our patrons\n\nThese are the first-tier patrons from Patreon (notice: **The Terser Patreon is shutting down in favor of opencollective**). My appreciation goes to everyone on this list for supporting the project!\n\n * 38elements\n * Alan Orozco\n * Aria Buckles\n * CKEditor\n * Mariusz Nowak\n * Nakshatra Mukhopadhyay\n * Philippe Léger\n * Piotrek Koszuliński\n * Serhiy Shyyko\n * Viktor Hubert\n * 龙腾道\n"
  },
  {
    "path": "templates/bin/node/terser/README.md",
    "content": "<h1><img src=\"https://terser.org/img/terser-banner-logo.png\" alt=\"Terser\" width=\"400\"></h1>\n\n  [![NPM Version][npm-image]][npm-url]\n  [![NPM Downloads][downloads-image]][downloads-url]\n  [![CI pipeline][ci-image]][ci-url]\n  [![Opencollective financial contributors][opencollective-contributors]][opencollective-url]\n\nA JavaScript mangler/compressor toolkit for ES6+.\n\n*note*: <s>You can support this project on patreon: [link]</s> **The Terser Patreon is shutting down in favor of opencollective**. Check out [PATRONS.md](https://github.com/terser/terser/blob/master/PATRONS.md) for our first-tier patrons.\n\nTerser recommends you use RollupJS to bundle your modules, as that produces smaller code overall.\n\n*Beautification* has been undocumented and is *being removed* from terser, we recommend you use [prettier](https://npmjs.com/package/prettier).\n\nFind the changelog in [CHANGELOG.md](https://github.com/terser/terser/blob/master/CHANGELOG.md)\n\n\n\n[npm-image]: https://img.shields.io/npm/v/terser.svg\n[npm-url]: https://npmjs.org/package/terser\n[downloads-image]: https://img.shields.io/npm/dm/terser.svg\n[downloads-url]: https://npmjs.org/package/terser\n[ci-image]: https://github.com/terser/terser/actions/workflows/ci.yml/badge.svg\n[ci-url]: https://github.com/terser/terser/actions/workflows/ci.yml\n[opencollective-contributors]: https://opencollective.com/terser/tiers/badge.svg\n[opencollective-url]: https://opencollective.com/terser\n\nWhy choose terser?\n------------------\n\n`uglify-es` is [no longer maintained](https://github.com/mishoo/UglifyJS2/issues/3156#issuecomment-392943058) and `uglify-js` does not support ES6+.\n\n**`terser`** is a fork of `uglify-es` that mostly retains API and CLI compatibility\nwith `uglify-es` and `uglify-js@3`.\n\nInstall\n-------\n\nFirst make sure you have installed the latest version of [node.js](http://nodejs.org/)\n(You may need to restart your computer after this step).\n\nFrom NPM for use as a command line app:\n\n    npm install terser -g\n\nFrom NPM for programmatic use:\n\n    npm install terser\n\n# Command line usage\n\n<!-- CLI_USAGE:START -->\n\n    terser [input files] [options]\n\nTerser can take multiple input files.  It's recommended that you pass the\ninput files first, then pass the options.  Terser will parse input files\nin sequence and apply any compression options.  The files are parsed in the\nsame global scope, that is, a reference from a file to some\nvariable/function declared in another file will be matched properly.\n\nCommand line arguments that take options (like --parse, --compress, --mangle and\n--format) can take in a comma-separated list of default option overrides. For\ninstance:\n\n    terser input.js --compress ecma=2015,computed_props=false\n\nIf no input file is specified, Terser will read from STDIN.\n\nIf you wish to pass your options before the input files, separate the two with\na double dash to prevent input files being used as option arguments:\n\n    terser --compress --mangle -- input.js\n\n### Command line options\n\n```\n    -h, --help                  Print usage information.\n                                `--help options` for details on available options.\n    -V, --version               Print version number.\n    -p, --parse <options>       Specify parser options:\n                                `acorn`  Use Acorn for parsing.\n                                `bare_returns`  Allow return outside of functions.\n                                                Useful when minifying CommonJS\n                                                modules and Userscripts that may\n                                                be anonymous function wrapped (IIFE)\n                                                by the .user.js engine `caller`.\n                                `expression`  Parse a single expression, rather than\n                                              a program (for parsing JSON).\n                                `spidermonkey`  Assume input files are SpiderMonkey\n                                                AST format (as JSON).\n    -c, --compress [options]    Enable compressor/specify compressor options:\n                                `pure_funcs`  List of functions that can be safely\n                                              removed when their return values are\n                                              not used.\n    -m, --mangle [options]      Mangle names/specify mangler options:\n                                `reserved`  List of names that should not be mangled.\n    --mangle-props [options]    Mangle properties/specify mangler options:\n                                `builtins`  Mangle property names that overlaps\n                                            with standard JavaScript globals and DOM\n                                            API props.\n                                `debug`  Add debug prefix and suffix.\n                                `keep_quoted`  Only mangle unquoted properties, quoted\n                                               properties are automatically reserved.\n                                               `strict` disables quoted properties\n                                               being automatically reserved.\n                                `regex`  Only mangle matched property names.\n                                `reserved`  List of names that should not be mangled.\n    -f, --format [options]      Specify format options.\n                                `preamble`  Preamble to prepend to the output. You\n                                            can use this to insert a comment, for\n                                            example for licensing information.\n                                            This will not be parsed, but the source\n                                            map will adjust for its presence.\n                                `quote_style`  Quote style:\n                                               0 - auto\n                                               1 - single\n                                               2 - double\n                                               3 - original\n                                `wrap_iife`  Wrap IIFEs in parenthesis. Note: you may\n                                             want to disable `negate_iife` under\n                                             compressor options.\n                                `wrap_func_args`  Wrap function arguments in parenthesis.\n    -o, --output <file>         Output file path (default STDOUT). Specify `ast` or\n                                `spidermonkey` to write Terser or SpiderMonkey AST\n                                as JSON to STDOUT respectively.\n    --comments [filter]         Preserve copyright comments in the output. By\n                                default this works like Google Closure, keeping\n                                JSDoc-style comments that contain e.g. \"@license\",\n                                or start with \"!\". You can optionally pass one of the\n                                following arguments to this flag:\n                                - \"all\" to keep all comments\n                                - `false` to omit comments in the output\n                                - a valid JS RegExp like `/foo/` or `/^!/` to\n                                keep only matching comments.\n                                Note that currently not *all* comments can be\n                                kept when compression is on, because of dead\n                                code removal or cascading statements into\n                                sequences.\n    --config-file <file>        Read `minify()` options from JSON file.\n    -d, --define <expr>[=value] Global definitions.\n    --ecma <version>            Specify ECMAScript release: 5, 2015, 2016, etc.\n    -e, --enclose [arg[:value]] Embed output in a big function with configurable\n                                arguments and values.\n    --ie8                       Support non-standard Internet Explorer 8.\n                                Equivalent to setting `ie8: true` in `minify()`\n                                for `compress`, `mangle` and `format` options.\n                                By default Terser will not try to be IE-proof.\n    --keep-classnames           Do not mangle/drop class names.\n    --keep-fnames               Do not mangle/drop function names.  Useful for\n                                code relying on Function.prototype.name.\n    --module                    Input is an ES6 module. If `compress` or `mangle` is\n                                enabled then the `toplevel` option will be enabled.\n    --name-cache <file>         File to hold mangled name mappings.\n    --safari10                  Support non-standard Safari 10/11.\n                                Equivalent to setting `safari10: true` in `minify()`\n                                for `mangle` and `format` options.\n                                By default `terser` will not work around\n                                Safari 10/11 bugs.\n    --source-map [options]      Enable source map/specify source map options:\n                                `base`  Path to compute relative paths from input files.\n                                `content`  Input source map, useful if you're compressing\n                                           JS that was generated from some other original\n                                           code. Specify \"inline\" if the source map is\n                                           included within the sources.\n                                `filename`  Name and/or location of the output source.\n                                `includeSources`  Pass this flag if you want to include\n                                                  the content of source files in the\n                                                  source map as sourcesContent property.\n                                `root`  Path to the original source to be included in\n                                        the source map.\n                                `url`  If specified, path to the source map to append in\n                                       `//# sourceMappingURL`.\n    --timings                   Display operations run time on STDERR.\n    --toplevel                  Compress and/or mangle variables in top level scope.\n    --wrap <name>               Embed everything in a big function, making the\n                                “exports” and “global” variables available. You\n                                need to pass an argument to this option to\n                                specify the name that your module will take\n                                when included in, say, a browser.\n```\n\nSpecify `--output` (`-o`) to declare the output file.  Otherwise the output\ngoes to STDOUT.\n\n## CLI source map options\n\nTerser can generate a source map file, which is highly useful for\ndebugging your compressed JavaScript.  To get a source map, pass\n`--source-map --output output.js` (source map will be written out to\n`output.js.map`).\n\nAdditional options:\n\n- `--source-map \"filename='<NAME>'\"` to specify the name of the source map.\n\n- `--source-map \"root='<URL>'\"` to pass the URL where the original files can be found.\n\n- `--source-map \"url='<URL>'\"` to specify the URL where the source map can be found.\n  Otherwise Terser assumes HTTP `X-SourceMap` is being used and will omit the\n  `//# sourceMappingURL=` directive.\n\nFor example:\n\n    terser js/file1.js js/file2.js \\\n             -o foo.min.js -c -m \\\n             --source-map \"root='http://foo.com/src',url='foo.min.js.map'\"\n\nThe above will compress and mangle `file1.js` and `file2.js`, will drop the\noutput in `foo.min.js` and the source map in `foo.min.js.map`.  The source\nmapping will refer to `http://foo.com/src/js/file1.js` and\n`http://foo.com/src/js/file2.js` (in fact it will list `http://foo.com/src`\nas the source map root, and the original files as `js/file1.js` and\n`js/file2.js`).\n\n### Composed source map\n\nWhen you're compressing JS code that was output by a compiler such as\nCoffeeScript, mapping to the JS code won't be too helpful.  Instead, you'd\nlike to map back to the original code (i.e. CoffeeScript).  Terser has an\noption to take an input source map.  Assuming you have a mapping from\nCoffeeScript → compiled JS, Terser can generate a map from CoffeeScript →\ncompressed JS by mapping every token in the compiled JS to its original\nlocation.\n\nTo use this feature pass `--source-map \"content='/path/to/input/source.map'\"`\nor `--source-map \"content=inline\"` if the source map is included inline with\nthe sources.\n\n## CLI compress options\n\nYou need to pass `--compress` (`-c`) to enable the compressor.  Optionally\nyou can pass a comma-separated list of [compress options](#compress-options).\n\nOptions are in the form `foo=bar`, or just `foo` (the latter implies\na boolean option that you want to set `true`; it's effectively a\nshortcut for `foo=true`).\n\nExample:\n\n    terser file.js -c toplevel,sequences=false\n\n## CLI mangle options\n\nTo enable the mangler you need to pass `--mangle` (`-m`).  The following\n(comma-separated) options are supported:\n\n- `toplevel` (default `false`) -- mangle names declared in the top level scope.\n\n- `eval` (default `false`) -- mangle names visible in scopes where `eval` or `with` are used.\n\nWhen mangling is enabled but you want to prevent certain names from being\nmangled, you can declare those names with `--mangle reserved` — pass a\ncomma-separated list of names.  For example:\n\n    terser ... -m reserved=['$','require','exports']\n\nto prevent the `require`, `exports` and `$` names from being changed.\n\n### CLI mangling property names (`--mangle-props`)\n\n**Note:** THIS **WILL** BREAK YOUR CODE. A good rule of thumb is not to use this unless you know exactly what you're doing and how this works and read this section until the end.\n\nMangling property names is a separate step, different from variable name mangling.  Pass\n`--mangle-props` to enable it. The least dangerous\nway to use this is to use the `regex` option like so:\n\n```\nterser example.js -c -m --mangle-props regex=/_$/\n```\n\nThis will mangle all properties that end with an\nunderscore. So you can use it to mangle internal methods.\n\nBy default, it will mangle all properties in the\ninput code with the exception of built in DOM properties and properties\nin core JavaScript classes, which is what will break your code if you don't:\n\n1. Control all the code you're mangling\n2. Avoid using a module bundler, as they usually will call Terser on each file individually, making it impossible to pass mangled objects between modules.\n3. Avoid calling functions like `defineProperty` or `hasOwnProperty`, because they refer to object properties using strings and will break your code if you don't know what you are doing.\n\nAn example:\n\n```javascript\n// example.js\nvar x = {\n    baz_: 0,\n    foo_: 1,\n    calc: function() {\n        return this.foo_ + this.baz_;\n    }\n};\nx.bar_ = 2;\nx[\"baz_\"] = 3;\nconsole.log(x.calc());\n```\nMangle all properties (except for JavaScript `builtins`) (**very** unsafe):\n```bash\n$ terser example.js -c passes=2 -m --mangle-props\n```\n```javascript\nvar x={o:3,t:1,i:function(){return this.t+this.o},s:2};console.log(x.i());\n```\nMangle all properties except for `reserved` properties (still very unsafe):\n```bash\n$ terser example.js -c passes=2 -m --mangle-props reserved=[foo_,bar_]\n```\n```javascript\nvar x={o:3,foo_:1,t:function(){return this.foo_+this.o},bar_:2};console.log(x.t());\n```\nMangle all properties matching a `regex` (not as unsafe but still unsafe):\n```bash\n$ terser example.js -c passes=2 -m --mangle-props regex=/_$/\n```\n```javascript\nvar x={o:3,t:1,calc:function(){return this.t+this.o},i:2};console.log(x.calc());\n```\n\nCombining mangle properties options:\n```bash\n$ terser example.js -c passes=2 -m --mangle-props regex=/_$/,reserved=[bar_]\n```\n```javascript\nvar x={o:3,t:1,calc:function(){return this.t+this.o},bar_:2};console.log(x.calc());\n```\n\nIn order for this to be of any use, we avoid mangling standard JS names and DOM\nAPI properties by default (`--mangle-props builtins` to override).\n\nA regular expression can be used to define which property names should be\nmangled.  For example, `--mangle-props regex=/^_/` will only mangle property\nnames that start with an underscore.\n\nWhen you compress multiple files using this option, in order for them to\nwork together in the end we need to ensure somehow that one property gets\nmangled to the same name in all of them.  For this, pass `--name-cache filename.json`\nand Terser will maintain these mappings in a file which can then be reused.\nIt should be initially empty.  Example:\n\n```bash\n$ rm -f /tmp/cache.json  # start fresh\n$ terser file1.js file2.js --mangle-props --name-cache /tmp/cache.json -o part1.js\n$ terser file3.js file4.js --mangle-props --name-cache /tmp/cache.json -o part2.js\n```\n\nNow, `part1.js` and `part2.js` will be consistent with each other in terms\nof mangled property names.\n\nUsing the name cache is not necessary if you compress all your files in a\nsingle call to Terser.\n\n### Mangling unquoted names (`--mangle-props keep_quoted`)\n\nUsing quoted property name (`o[\"foo\"]`) reserves the property name (`foo`)\nso that it is not mangled throughout the entire script even when used in an\nunquoted style (`o.foo`). Example:\n\n```javascript\n// stuff.js\nvar o = {\n    \"foo\": 1,\n    bar: 3\n};\no.foo += o.bar;\nconsole.log(o.foo);\n```\n```bash\n$ terser stuff.js --mangle-props keep_quoted -c -m\n```\n```javascript\nvar o={foo:1,o:3};o.foo+=o.o,console.log(o.foo);\n```\n\n### Debugging property name mangling\n\nYou can also pass `--mangle-props debug` in order to mangle property names\nwithout completely obscuring them. For example the property `o.foo`\nwould mangle to `o._$foo$_` with this option. This allows property mangling\nof a large codebase while still being able to debug the code and identify\nwhere mangling is breaking things.\n\n```bash\n$ terser stuff.js --mangle-props debug -c -m\n```\n```javascript\nvar o={_$foo$_:1,_$bar$_:3};o._$foo$_+=o._$bar$_,console.log(o._$foo$_);\n```\n\nYou can also pass a custom suffix using `--mangle-props debug=XYZ`. This would then\nmangle `o.foo` to `o._$foo$XYZ_`. You can change this each time you compile a\nscript to identify how a property got mangled. One technique is to pass a\nrandom number on every compile to simulate mangling changing with different\ninputs (e.g. as you update the input script with new properties), and to help\nidentify mistakes like writing mangled keys to storage.\n\n<!-- CLI_USAGE:END -->\n\n# API Reference\n\n<!-- API_REFERENCE:START -->\n\nAssuming installation via NPM, you can load Terser in your application\nlike this:\n\n```javascript\nconst { minify } = require(\"terser\");\n```\n\nOr,\n\n```javascript\nimport { minify } from \"terser\";\n```\n\nBrowser loading is also supported:\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/source-map@0.7.3/dist/source-map.js\"></script>\n<script src=\"https://cdn.jsdelivr.net/npm/terser/dist/bundle.min.js\"></script>\n```\n\nThere is a single async high level function, **`async minify(code, options)`**,\nwhich will perform all minification [phases](#minify-options) in a configurable\nmanner. By default `minify()` will enable [`compress`](#compress-options)\nand [`mangle`](#mangle-options). Example:\n```javascript\nvar code = \"function add(first, second) { return first + second; }\";\nvar result = await minify(code, { sourceMap: true });\nconsole.log(result.code);  // minified output: function add(n,d){return n+d}\nconsole.log(result.map);  // source map\n```\n\nYou can `minify` more than one JavaScript file at a time by using an object\nfor the first argument where the keys are file names and the values are source\ncode:\n```javascript\nvar code = {\n    \"file1.js\": \"function add(first, second) { return first + second; }\",\n    \"file2.js\": \"console.log(add(1 + 2, 3 + 4));\"\n};\nvar result = await minify(code);\nconsole.log(result.code);\n// function add(d,n){return d+n}console.log(add(3,7));\n```\n\nThe `toplevel` option:\n```javascript\nvar code = {\n    \"file1.js\": \"function add(first, second) { return first + second; }\",\n    \"file2.js\": \"console.log(add(1 + 2, 3 + 4));\"\n};\nvar options = { toplevel: true };\nvar result = await minify(code, options);\nconsole.log(result.code);\n// console.log(3+7);\n```\n\nThe `nameCache` option:\n```javascript\nvar options = {\n    mangle: {\n        toplevel: true,\n    },\n    nameCache: {}\n};\nvar result1 = await minify({\n    \"file1.js\": \"function add(first, second) { return first + second; }\"\n}, options);\nvar result2 = await minify({\n    \"file2.js\": \"console.log(add(1 + 2, 3 + 4));\"\n}, options);\nconsole.log(result1.code);\n// function n(n,r){return n+r}\nconsole.log(result2.code);\n// console.log(n(3,7));\n```\n\nYou may persist the name cache to the file system in the following way:\n```javascript\nvar cacheFileName = \"/tmp/cache.json\";\nvar options = {\n    mangle: {\n        properties: true,\n    },\n    nameCache: JSON.parse(fs.readFileSync(cacheFileName, \"utf8\"))\n};\nfs.writeFileSync(\"part1.js\", await minify({\n    \"file1.js\": fs.readFileSync(\"file1.js\", \"utf8\"),\n    \"file2.js\": fs.readFileSync(\"file2.js\", \"utf8\")\n}, options).code, \"utf8\");\nfs.writeFileSync(\"part2.js\", await minify({\n    \"file3.js\": fs.readFileSync(\"file3.js\", \"utf8\"),\n    \"file4.js\": fs.readFileSync(\"file4.js\", \"utf8\")\n}, options).code, \"utf8\");\nfs.writeFileSync(cacheFileName, JSON.stringify(options.nameCache), \"utf8\");\n```\n\nAn example of a combination of `minify()` options:\n```javascript\nvar code = {\n    \"file1.js\": \"function add(first, second) { return first + second; }\",\n    \"file2.js\": \"console.log(add(1 + 2, 3 + 4));\"\n};\nvar options = {\n    toplevel: true,\n    compress: {\n        global_defs: {\n            \"@console.log\": \"alert\"\n        },\n        passes: 2\n    },\n    format: {\n        preamble: \"/* minified */\"\n    }\n};\nvar result = await minify(code, options);\nconsole.log(result.code);\n// /* minified */\n// alert(10);\"\n```\n\nAn error example:\n```javascript\ntry {\n    const result = await minify({\"foo.js\" : \"if (0) else console.log(1);\"});\n    // Do something with result\n} catch (error) {\n    const { message, filename, line, col, pos } = error;\n    // Do something with error\n}\n```\n\n## Minify options\n\n- `ecma` (default `undefined`) - pass `5`, `2015`, `2016`, etc to override\n  `compress` and `format`'s `ecma` options.\n\n- `enclose` (default `false`) - pass `true`, or a string in the format\n  of `\"args[:values]\"`, where `args` and `values` are comma-separated\n  argument names and values, respectively, to embed the output in a big\n  function with the configurable arguments and values.\n\n- `parse` (default `{}`) — pass an object if you wish to specify some\n  additional [parse options](#parse-options).\n\n- `compress` (default `{}`) — pass `false` to skip compressing entirely.\n  Pass an object to specify custom [compress options](#compress-options).\n\n- `mangle` (default `true`) — pass `false` to skip mangling names, or pass\n  an object to specify [mangle options](#mangle-options) (see below).\n\n  - `mangle.properties` (default `false`) — a subcategory of the mangle option.\n    Pass an object to specify custom [mangle property options](#mangle-properties-options).\n\n- `module` (default `false`) — Use when minifying an ES6 module. \"use strict\"\n  is implied and names can be mangled on the top scope. If `compress` or\n  `mangle` is enabled then the `toplevel` option will be enabled.\n\n- `format` or `output` (default `null`) — pass an object if you wish to specify\n  additional [format options](#format-options).  The defaults are optimized\n  for best compression.\n\n- `sourceMap` (default `false`) - pass an object if you wish to specify\n  [source map options](#source-map-options).\n\n- `toplevel` (default `false`) - set to `true` if you wish to enable top level\n  variable and function name mangling and to drop unused variables and functions.\n\n- `nameCache` (default `null`) - pass an empty object `{}` or a previously\n  used `nameCache` object if you wish to cache mangled variable and\n  property names across multiple invocations of `minify()`. Note: this is\n  a read/write property. `minify()` will read the name cache state of this\n  object and update it during minification so that it may be\n  reused or externally persisted by the user.\n\n- `ie8` (default `false`) - set to `true` to support IE8.\n\n- `keep_classnames` (default: `undefined`) - pass `true` to prevent discarding or mangling\n  of class names. Pass a regular expression to only keep class names matching that regex.\n\n- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling\n  of function names. Pass a regular expression to only keep function names matching that regex.\n  Useful for code relying on `Function.prototype.name`. If the top level minify option\n  `keep_classnames` is `undefined` it will be overridden with the value of the top level\n  minify option `keep_fnames`.\n\n- `safari10` (default: `false`) - pass `true` to work around Safari 10/11 bugs in\n  loop scoping and `await`. See `safari10` options in [`mangle`](#mangle-options)\n  and [`format`](#format-options) for details.\n\n## Minify options structure\n\n```javascript\n{\n    parse: {\n        // parse options\n    },\n    compress: {\n        // compress options\n    },\n    mangle: {\n        // mangle options\n\n        properties: {\n            // mangle property options\n        }\n    },\n    format: {\n        // format options (can also use `output` for backwards compatibility)\n    },\n    sourceMap: {\n        // source map options\n    },\n    ecma: 5, // specify one of: 5, 2015, 2016, etc.\n    enclose: false, // or specify true, or \"args:values\"\n    keep_classnames: false,\n    keep_fnames: false,\n    ie8: false,\n    module: false,\n    nameCache: null, // or specify a name cache object\n    safari10: false,\n    toplevel: false\n}\n```\n\n### Source map options\n\nTo generate a source map:\n```javascript\nvar result = await minify({\"file1.js\": \"var a = function() {};\"}, {\n    sourceMap: {\n        filename: \"out.js\",\n        url: \"out.js.map\"\n    }\n});\nconsole.log(result.code); // minified output\nconsole.log(result.map);  // source map\n```\n\nNote that the source map is not saved in a file, it's just returned in\n`result.map`.  The value passed for `sourceMap.url` is only used to set\n`//# sourceMappingURL=out.js.map` in `result.code`. The value of\n`filename` is only used to set `file` attribute (see [the spec][sm-spec])\nin source map file.\n\nYou can set option `sourceMap.url` to be `\"inline\"` and source map will\nbe appended to code.\n\nYou can also specify sourceRoot property to be included in source map:\n```javascript\nvar result = await minify({\"file1.js\": \"var a = function() {};\"}, {\n    sourceMap: {\n        root: \"http://example.com/src\",\n        url: \"out.js.map\"\n    }\n});\n```\n\nIf you're compressing compiled JavaScript and have a source map for it, you\ncan use `sourceMap.content`:\n```javascript\nvar result = await minify({\"compiled.js\": \"compiled code\"}, {\n    sourceMap: {\n        content: \"content from compiled.js.map\",\n        url: \"minified.js.map\"\n    }\n});\n// same as before, it returns `code` and `map`\n```\n\nIf you're using the `X-SourceMap` header instead, you can just omit `sourceMap.url`.\n\nIf you happen to need the source map as a raw object, set `sourceMap.asObject` to `true`.\n\n## Parse options\n\n- `bare_returns` (default `false`) -- support top level `return` statements\n\n- `html5_comments` (default `true`)\n\n- `shebang` (default `true`) -- support `#!command` as the first line\n\n- `spidermonkey` (default `false`) -- accept a Spidermonkey (Mozilla) AST\n\n## Compress options\n\n- `defaults` (default: `true`) -- Pass `false` to disable most default\n  enabled `compress` transforms. Useful when you only want to enable a few\n  `compress` options while disabling the rest.\n\n- `arrows` (default: `true`) -- Class and object literal methods are converted\n  will also be converted to arrow expressions if the resultant code is shorter:\n  `m(){return x}` becomes `m:()=>x`. To do this to regular ES5 functions which\n  don't use `this` or `arguments`, see `unsafe_arrows`.\n\n- `arguments` (default: `false`) -- replace `arguments[index]` with function\n  parameter name whenever possible.\n\n- `booleans` (default: `true`) -- various optimizations for boolean context,\n  for example `!!a ? b : c → a ? b : c`\n\n- `booleans_as_integers` (default: `false`) -- Turn booleans into 0 and 1, also\n  makes comparisons with booleans use `==` and `!=` instead of `===` and `!==`.\n\n- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables,\n  side effects permitting.\n\n- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes,\n  e.g. `!(a <= b) → a > b` (only when `unsafe_comps`), attempts to negate binary\n  nodes, e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc. Note: `comparisons`\n  works best with `lhs_constants` enabled.\n\n- `computed_props` (default: `true`) -- Transforms constant computed properties\n  into regular ones: `{[\"computed\"]: 1}` is converted to `{computed: 1}`.\n\n- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional\n  expressions\n\n- `dead_code` (default: `true`) -- remove unreachable code\n\n- `directives` (default: `true`) -- remove redundant or non-standard directives\n\n- `drop_console` (default: `false`) -- Pass `true` to discard calls to\n  `console.*` functions. If you wish to drop a specific function call\n  such as `console.info` and/or retain side effects from function arguments\n  after dropping the function call then use `pure_funcs` instead.\n\n- `drop_debugger` (default: `true`) -- remove `debugger;` statements\n\n- `ecma` (default: `5`) -- Pass `2015` or greater to enable `compress` options that\n  will transform ES5 code into smaller ES6+ equivalent forms.\n\n- `evaluate` (default: `true`) -- attempt to evaluate constant expressions\n\n- `expression` (default: `false`) -- Pass `true` to preserve completion values\n  from terminal statements without `return`, e.g. in bookmarklets.\n\n- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation)\n\n- `hoist_funs` (default: `false`) -- hoist function declarations\n\n- `hoist_props` (default: `true`) -- hoist properties from constant object and\n  array literals into regular variables subject to a set of constraints. For example:\n  `var o={p:1, q:2}; f(o.p, o.q);` is converted to `f(1, 2);`. Note: `hoist_props`\n  works best with `mangle` enabled, the `compress` option `passes` set to `2` or higher,\n  and the `compress` option `toplevel` enabled.\n\n- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false`\n  by default because it seems to increase the size of the output in general)\n\n- `if_return` (default: `true`) -- optimizations for if/return and if/continue\n\n- `inline` (default: `true`) -- inline calls to function with simple/`return` statement:\n  - `false` -- same as `0`\n  - `0` -- disabled inlining\n  - `1` -- inline simple functions\n  - `2` -- inline functions with arguments\n  - `3` -- inline functions with arguments and variables\n  - `true` -- same as `3`\n\n- `join_vars` (default: `true`) -- join consecutive `var`, `let` and `const` statements\n\n- `keep_classnames` (default: `false`) -- Pass `true` to prevent the compressor from\n  discarding class names. Pass a regular expression to only keep class names matching\n  that regex. See also: the `keep_classnames` [mangle option](#mangle-options).\n\n- `keep_fargs` (default: `true`) -- Prevents the compressor from discarding unused\n  function arguments.  You need this for code which relies on `Function.length`.\n\n- `keep_fnames` (default: `false`) -- Pass `true` to prevent the\n  compressor from discarding function names. Pass a regular expression to only keep\n  function names matching that regex. Useful for code relying on `Function.prototype.name`.\n  See also: the `keep_fnames` [mangle option](#mangle-options).\n\n- `keep_infinity` (default: `false`) -- Pass `true` to prevent `Infinity` from\n  being compressed into `1/0`, which may cause performance issues on Chrome.\n\n- `lhs_constants` (default: `true`) -- Moves constant values to the left-hand side\n  of binary nodes. `foo == 42 → 42 == foo`\n\n- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops\n  when we can statically determine the condition.\n\n- `module` (default `false`) -- Pass `true` when compressing an ES6 module. Strict\n  mode is implied and the `toplevel` option as well.\n\n- `negate_iife` (default: `true`) -- negate \"Immediately-Called Function Expressions\"\n  where the return value is discarded, to avoid the parens that the\n  code generator would insert.\n\n- `passes` (default: `1`) -- The maximum number of times to run compress.\n  In some cases more than one pass leads to further compressed code.  Keep in\n  mind more passes will take more time.\n\n- `properties` (default: `true`) -- rewrite property access using the dot notation, for\n  example `foo[\"bar\"] → foo.bar`\n\n- `pure_funcs` (default: `null`) -- You can pass an array of names and\n  Terser will assume that those functions do not produce side\n  effects.  DANGER: will not check if the name is redefined in scope.\n  An example case here, for instance `var q = Math.floor(a/b)`.  If\n  variable `q` is not used elsewhere, Terser will drop it, but will\n  still keep the `Math.floor(a/b)`, not knowing what it does.  You can\n  pass `pure_funcs: [ 'Math.floor' ]` to let it know that this\n  function won't produce any side effect, in which case the whole\n  statement would get discarded.  The current implementation adds some\n  overhead (compression will be slower).\n\n- `pure_getters` (default: `\"strict\"`) -- If you pass `true` for\n  this, Terser will assume that object property access\n  (e.g. `foo.bar` or `foo[\"bar\"]`) doesn't have any side effects.\n  Specify `\"strict\"` to treat `foo.bar` as side-effect-free only when\n  `foo` is certain to not throw, i.e. not `null` or `undefined`.\n\n- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and\n  used as constant values.\n\n- `reduce_funcs` (default: `true`) -- Inline single-use functions when\n  possible. Depends on `reduce_vars` being enabled.  Disabling this option\n  sometimes improves performance of the output code.\n\n- `sequences` (default: `true`) -- join consecutive simple statements using the\n  comma operator.  May be set to a positive integer to specify the maximum number\n  of consecutive comma sequences that will be generated. If this option is set to\n  `true` then the default `sequences` limit is `200`. Set option to `false` or `0`\n  to disable. The smallest `sequences` length is `2`. A `sequences` value of `1`\n  is grandfathered to be equivalent to `true` and as such means `200`. On rare\n  occasions the default sequences limit leads to very slow compress times in which\n  case a value of `20` or less is recommended.\n\n- `side_effects` (default: `true`) -- Remove expressions which have no side effects\n  and whose results aren't used.\n\n- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches\n\n- `toplevel` (default: `false`) -- drop unreferenced functions (`\"funcs\"`) and/or\n  variables (`\"vars\"`) in the top level scope (`false` by default, `true` to drop\n  both unreferenced functions and variables)\n\n- `top_retain` (default: `null`) -- prevent specific toplevel functions and\n  variables from `unused` removal (can be array, comma-separated, RegExp or\n  function. Implies `toplevel`)\n\n- `typeofs` (default: `true`) -- Transforms `typeof foo == \"undefined\"` into\n  `foo === void 0`.  Note: recommend to set this value to `false` for IE10 and\n  earlier versions due to known issues.\n\n- `unsafe` (default: `false`) -- apply \"unsafe\" transformations\n  ([details](#the-unsafe-compress-option)).\n\n- `unsafe_arrows` (default: `false`) -- Convert ES5 style anonymous function\n  expressions to arrow functions if the function body does not reference `this`.\n  Note: it is not always safe to perform this conversion if code relies on the\n  the function having a `prototype`, which arrow functions lack.\n  This transform requires that the `ecma` compress option is set to `2015` or greater.\n\n- `unsafe_comps` (default: `false`) -- Reverse `<` and `<=` to `>` and `>=` to\n  allow improved compression. This might be unsafe when an at least one of two\n  operands is an object with computed values due the use of methods like `get`,\n  or `valueOf`. This could cause change in execution order after operands in the\n  comparison are switching. Compression only works if both `comparisons` and\n  `unsafe_comps` are both set to true.\n\n- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`\n  when both `args` and `code` are string literals.\n\n- `unsafe_math` (default: `false`) -- optimize numerical expressions like\n  `2 * x * 3` into `6 * x`, which may give imprecise floating point results.\n\n- `unsafe_symbols` (default: `false`) -- removes keys from native Symbol\n  declarations, e.g `Symbol(\"kDog\")` becomes `Symbol()`.\n\n- `unsafe_methods` (default: false) -- Converts `{ m: function(){} }` to\n  `{ m(){} }`. `ecma` must be set to `6` or greater to enable this transform.\n  If `unsafe_methods` is a RegExp then key/value pairs with keys matching the\n  RegExp will be converted to concise methods.\n  Note: if enabled there is a risk of getting a \"`<method name>` is not a\n  constructor\" TypeError should any code try to `new` the former function.\n\n- `unsafe_proto` (default: `false`) -- optimize expressions like\n  `Array.prototype.slice.call(a)` into `[].slice.call(a)`\n\n- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with\n  `RegExp` values the same way as if they are constants.\n\n- `unsafe_undefined` (default: `false`) -- substitute `void 0` if there is a\n  variable named `undefined` in scope (variable name will be mangled, typically\n  reduced to a single character)\n\n- `unused` (default: `true`) -- drop unreferenced functions and variables (simple\n  direct variable assignments do not count as references unless set to `\"keep_assign\"`)\n\n## Mangle options\n\n- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes\n  where `eval` or `with` are used.\n\n- `keep_classnames` (default `false`) -- Pass `true` to not mangle class names.\n  Pass a regular expression to only keep class names matching that regex.\n  See also: the `keep_classnames` [compress option](#compress-options).\n\n- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.\n  Pass a regular expression to only keep function names matching that regex.\n  Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`\n  [compress option](#compress-options).\n\n- `module` (default `false`) -- Pass `true` an ES6 modules, where the toplevel\n  scope is not the global scope. Implies `toplevel`.\n\n- `nth_identifier` (default: an internal mangler that weights based on character\n  frequency analysis) -- Pass an object with a `get(n)` function that converts an\n  ordinal into the nth most favored (usually shortest) identifier.\n  Optionally also provide `reset()`, `sort()`, and `consider(chars, delta)` to\n  use character frequency analysis of the source code.\n\n- `reserved` (default `[]`) -- Pass an array of identifiers that should be\n  excluded from mangling. Example: `[\"foo\", \"bar\"]`.\n\n- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the\n  top level scope.\n\n- `safari10` (default `false`) -- Pass `true` to work around the Safari 10 loop\n  iterator [bug](https://bugs.webkit.org/show_bug.cgi?id=171041)\n  \"Cannot declare a let variable twice\".\n  See also: the `safari10` [format option](#format-options).\n\nExamples:\n\n```javascript\n// test.js\nvar globalVar;\nfunction funcName(firstLongName, anotherLongName) {\n    var myVariable = firstLongName +  anotherLongName;\n}\n```\n```javascript\nvar code = fs.readFileSync(\"test.js\", \"utf8\");\n\nawait minify(code).code;\n// 'function funcName(a,n){}var globalVar;'\n\nawait minify(code, { mangle: { reserved: ['firstLongName'] } }).code;\n// 'function funcName(firstLongName,a){}var globalVar;'\n\nawait minify(code, { mangle: { toplevel: true } }).code;\n// 'function n(n,a){}var a;'\n```\n\n### Mangle properties options\n\n- `builtins` (default: `false`) — Use `true` to allow the mangling of builtin\n  DOM properties. Not recommended to override this setting.\n\n- `debug` (default: `false`) — Mangle names with the original name still present.\n  Pass an empty string `\"\"` to enable, or a non-empty string to set the debug suffix.\n\n- `keep_quoted` (default: `false`) — How quoting properties (`{\"prop\": ...}` and `obj[\"prop\"]`) controls what gets mangled.\n  - `\"strict\"` (recommended) -- `obj.prop` is mangled.\n  - `false` -- `obj[\"prop\"]` is mangled.\n  - `true` -- `obj.prop` is mangled unless there is `obj[\"prop\"]` elsewhere in the code.\n\n- `nth_identifer` (default: an internal mangler that weights based on character\n  frequency analysis) -- Pass an object with a `get(n)` function that converts an\n  ordinal into the nth most favored (usually shortest) identifier.\n  Optionally also provide `reset()`, `sort()`, and `consider(chars, delta)` to\n  use character frequency analysis of the source code.\n\n- `regex` (default: `null`) — Pass a [RegExp literal or pattern string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) to only mangle property matching the regular expression.\n\n- `reserved` (default: `[]`) — Do not mangle property names listed in the\n  `reserved` array.\n\n- `undeclared` (default: `false`) - Mangle those names when they are accessed\n  as properties of known top level variables but their declarations are never\n  found in input code. May be useful when only minifying parts of a project.\n  See [#397](https://github.com/terser/terser/issues/397) for more details.\n\n\n## Format options\n\nThese options control the format of Terser's output code. Previously known\nas \"output options\".\n\n- `ascii_only` (default `false`) -- escape Unicode characters in strings and\n  regexps (affects directives with non-ascii characters becoming invalid)\n\n- `beautify` (default `false`) -- (DEPRECATED) whether to beautify the output.\n  When using the legacy `-b` CLI flag, this is set to true by default.\n\n- `braces` (default `false`) -- always insert braces in `if`, `for`,\n  `do`, `while` or `with` statements, even if their body is a single\n  statement.\n\n- `comments` (default `\"some\"`) -- by default it keeps JSDoc-style comments\n  that contain \"@license\", \"@copyright\", \"@preserve\" or start with `!`, pass `true`\n  or `\"all\"` to preserve all comments, `false` to omit comments in the output,\n  a regular expression string (e.g. `/^!/`) or a function.\n\n- `ecma` (default `5`) -- set desired EcmaScript standard version for output.\n  Set `ecma` to `2015` or greater to emit shorthand object properties - i.e.:\n  `{a}` instead of `{a: a}`.  The `ecma` option will only change the output in\n  direct control of the beautifier. Non-compatible features in your input will\n  still be output as is. For example: an `ecma` setting of `5` will **not**\n  convert modern code to ES5.\n\n- `indent_level` (default `4`)\n\n- `indent_start` (default `0`) -- prefix all lines by that many spaces\n\n- `inline_script` (default `true`) -- escape HTML comments and the slash in\n  occurrences of `</script>` in strings\n\n- `keep_numbers` (default `false`) -- keep number literals as it was in original code\n (disables optimizations like converting `1000000` into `1e6`)\n\n- `keep_quoted_props` (default `false`) -- when turned on, prevents stripping\n  quotes from property names in object literals.\n\n- `max_line_len` (default `false`) -- maximum line length (for minified code)\n\n- `preamble` (default `null`) -- when passed it must be a string and\n  it will be prepended to the output literally.  The source map will\n  adjust for this text.  Can be used to insert a comment containing\n  licensing information, for example.\n\n- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal\n  objects\n\n- `quote_style` (default `0`) -- preferred quote style for strings (affects\n  quoted property names and directives as well):\n  - `0` -- prefers double quotes, switches to single quotes when there are\n    more double quotes in the string itself. `0` is best for gzip size.\n  - `1` -- always use single quotes\n  - `2` -- always use double quotes\n  - `3` -- always use the original quotes\n\n- `preserve_annotations` -- (default `false`) -- Preserve [Terser annotations](#annotations) in the output.\n\n- `safari10` (default `false`) -- set this option to `true` to work around\n  the [Safari 10/11 await bug](https://bugs.webkit.org/show_bug.cgi?id=176685).\n  See also: the `safari10` [mangle option](#mangle-options).\n\n- `semicolons` (default `true`) -- separate statements with semicolons.  If\n  you pass `false` then whenever possible we will use a newline instead of a\n  semicolon, leading to more readable output of minified code (size before\n  gzip could be smaller; size after gzip insignificantly larger).\n\n- `shebang` (default `true`) -- preserve shebang `#!` in preamble (bash scripts)\n\n- `spidermonkey` (default `false`) -- produce a Spidermonkey (Mozilla) AST\n\n- `webkit` (default `false`) -- enable workarounds for WebKit bugs.\n  PhantomJS users should set this option to `true`.\n\n- `wrap_iife` (default `false`) -- pass `true` to wrap immediately invoked\n  function expressions. See\n  [#640](https://github.com/mishoo/UglifyJS2/issues/640) for more details.\n\n- `wrap_func_args` (default `true`) -- pass `false` if you do not want to wrap\n  function expressions that are passed as arguments, in parenthesis. See\n  [OptimizeJS](https://github.com/nolanlawson/optimize-js) for more details.\n\n# Miscellaneous\n\n### Keeping copyright notices or other comments\n\nYou can pass `--comments` to retain certain comments in the output.  By\ndefault it will keep comments starting with \"!\" and JSDoc-style comments that\ncontain \"@preserve\", \"@copyright\", \"@license\" or \"@cc_on\" (conditional compilation for IE).\nYou can pass `--comments all` to keep all the comments, or a valid JavaScript regexp to\nkeep only comments that match this regexp.  For example `--comments /^!/`\nwill keep comments like `/*! Copyright Notice */`.\n\nNote, however, that there might be situations where comments are lost.  For\nexample:\n```javascript\nfunction f() {\n    /** @preserve Foo Bar */\n    function g() {\n        // this function is never called\n    }\n    return something();\n}\n```\n\nEven though it has \"@preserve\", the comment will be lost because the inner\nfunction `g` (which is the AST node to which the comment is attached to) is\ndiscarded by the compressor as not referenced.\n\nThe safest comments where to place copyright information (or other info that\nneeds to be kept in the output) are comments attached to toplevel nodes.\n\n### The `unsafe` `compress` option\n\nIt enables some transformations that *might* break code logic in certain\ncontrived cases, but should be fine for most code.  It assumes that standard\nbuilt-in ECMAScript functions and classes have not been altered or replaced.\nYou might want to try it on your own code; it should reduce the minified size.\nSome examples of the optimizations made when this option is enabled:\n\n- `new Array(1, 2, 3)` or `Array(1, 2, 3)` → `[ 1, 2, 3 ]`\n- `Array.from([1, 2, 3])` → `[1, 2, 3]`\n- `new Object()` → `{}`\n- `String(exp)` or `exp.toString()` → `\"\" + exp`\n- `new Object/RegExp/Function/Error/Array (...)` → we discard the `new`\n- `\"foo bar\".substr(4)` → `\"bar\"`\n\n### Conditional compilation\n\nYou can use the `--define` (`-d`) switch in order to declare global\nvariables that Terser will assume to be constants (unless defined in\nscope).  For example if you pass `--define DEBUG=false` then, coupled with\ndead code removal Terser will discard the following from the output:\n```javascript\nif (DEBUG) {\n    console.log(\"debug stuff\");\n}\n```\n\nYou can specify nested constants in the form of `--define env.DEBUG=false`.\n\nAnother way of doing that is to declare your globals as constants in a\nseparate file and include it into the build.  For example you can have a\n`build/defines.js` file with the following:\n```javascript\nvar DEBUG = false;\nvar PRODUCTION = true;\n// etc.\n```\n\nand build your code like this:\n\n    terser build/defines.js js/foo.js js/bar.js... -c\n\nTerser will notice the constants and, since they cannot be altered, it\nwill evaluate references to them to the value itself and drop unreachable\ncode as usual.  The build will contain the `const` declarations if you use\nthem. If you are targeting < ES6 environments which does not support `const`,\nusing `var` with `reduce_vars` (enabled by default) should suffice.\n\n### Conditional compilation API\n\nYou can also use conditional compilation via the programmatic API. With the difference that the\nproperty name is `global_defs` and is a compressor property:\n\n```javascript\nvar result = await minify(fs.readFileSync(\"input.js\", \"utf8\"), {\n    compress: {\n        dead_code: true,\n        global_defs: {\n            DEBUG: false\n        }\n    }\n});\n```\n\nTo replace an identifier with an arbitrary non-constant expression it is\nnecessary to prefix the `global_defs` key with `\"@\"` to instruct Terser\nto parse the value as an expression:\n```javascript\nawait minify(\"alert('hello');\", {\n    compress: {\n        global_defs: {\n            \"@alert\": \"console.log\"\n        }\n    }\n}).code;\n// returns: 'console.log(\"hello\");'\n```\n\nOtherwise it would be replaced as string literal:\n```javascript\nawait minify(\"alert('hello');\", {\n    compress: {\n        global_defs: {\n            \"alert\": \"console.log\"\n        }\n    }\n}).code;\n// returns: '\"console.log\"(\"hello\");'\n```\n\n### Annotations\n\nAnnotations in Terser are a way to tell it to treat a certain function call differently. The following annotations are available:\n\n * `/*@__INLINE__*/` - forces a function to be inlined somewhere.\n * `/*@__NOINLINE__*/` - Makes sure the called function is not inlined into the call site.\n * `/*@__PURE__*/` - Marks a function call as pure. That means, it can safely be dropped.\n * `/*@__KEY__*/` - Marks a string literal as a property to also mangle it when mangling properties.\n\nYou can use either a `@` sign at the start, or a `#`.\n\nHere are some examples on how to use them:\n\n```javascript\n/*@__INLINE__*/\nfunction_always_inlined_here()\n\n/*#__NOINLINE__*/\nfunction_cant_be_inlined_into_here()\n\nconst x = /*#__PURE__*/i_am_dropped_if_x_is_not_used()\n\nfunction lookup(object, key) { return object[key]; }\nlookup({ i_will_be_mangled_too: \"bar\" }, /*@__KEY__*/ \"i_will_be_mangled_too\");\n```\n\n### ESTree / SpiderMonkey AST\n\nTerser has its own abstract syntax tree format; for\n[practical reasons](http://lisperator.net/blog/uglifyjs-why-not-switching-to-spidermonkey-ast/)\nwe can't easily change to using the SpiderMonkey AST internally.  However,\nTerser now has a converter which can import a SpiderMonkey AST.\n\nFor example [Acorn][acorn] is a super-fast parser that produces a\nSpiderMonkey AST.  It has a small CLI utility that parses one file and dumps\nthe AST in JSON on the standard output.  To use Terser to mangle and\ncompress that:\n\n    acorn file.js | terser -p spidermonkey -m -c\n\nThe `-p spidermonkey` option tells Terser that all input files are not\nJavaScript, but JS code described in SpiderMonkey AST in JSON.  Therefore we\ndon't use our own parser in this case, but just transform that AST into our\ninternal AST.\n\n`spidermonkey` is also available in `minify` as `parse` and `format` options to\naccept and/or produce a spidermonkey AST.\n\n### Use Acorn for parsing\n\nMore for fun, I added the `-p acorn` option which will use Acorn to do all\nthe parsing.  If you pass this option, Terser will `require(\"acorn\")`.\n\nAcorn is really fast (e.g. 250ms instead of 380ms on some 650K code), but\nconverting the SpiderMonkey tree that Acorn produces takes another 150ms so\nin total it's a bit more than just using Terser's own parser.\n\n[acorn]: https://github.com/ternjs/acorn\n[sm-spec]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k\n\n### Terser Fast Minify Mode\n\nIt's not well known, but whitespace removal and symbol mangling accounts\nfor 95% of the size reduction in minified code for most JavaScript - not\nelaborate code transforms. One can simply disable `compress` to speed up\nTerser builds by 3 to 4 times.\n\n| d3.js | size | gzip size | time (s) |\n|   --- | ---: |      ---: |     ---: |\n| original                                    | 451,131 | 108,733 |     - |\n| terser@3.7.5 mangle=false, compress=false   | 316,600 |  85,245 |  0.82 |\n| terser@3.7.5 mangle=true, compress=false    | 220,216 |  72,730 |  1.45 |\n| terser@3.7.5 mangle=true, compress=true     | 212,046 |  70,954 |  5.87 |\n| babili@0.1.4                                | 210,713 |  72,140 | 12.64 |\n| babel-minify@0.4.3                          | 210,321 |  72,242 | 48.67 |\n| babel-minify@0.5.0-alpha.01eac1c3           | 210,421 |  72,238 | 14.17 |\n\nTo enable fast minify mode from the CLI use:\n```\nterser file.js -m\n```\nTo enable fast minify mode with the API use:\n```js\nawait minify(code, { compress: false, mangle: true });\n```\n\n#### Source maps and debugging\n\nVarious `compress` transforms that simplify, rearrange, inline and remove code\nare known to have an adverse effect on debugging with source maps. This is\nexpected as code is optimized and mappings are often simply not possible as\nsome code no longer exists. For highest fidelity in source map debugging\ndisable the `compress` option and just use `mangle`.\n\nWhen debugging, make sure you enable the **\"map scopes\"** feature to map mangled variable names back to their original names.  \nWithout this, all variable values will be `undefined`. See https://github.com/terser/terser/issues/1367 for more details.\n<br/><br/>\n\n![image](https://user-images.githubusercontent.com/27283110/230441652-ac5cf6b0-5dc5-4ffc-9d8b-bd02875484f4.png)\n\n### Compiler assumptions\n\nTo allow for better optimizations, the compiler makes various assumptions:\n\n- `.toString()` and `.valueOf()` don't have side effects, and for built-in\n  objects they have not been overridden.\n- `undefined`, `NaN` and `Infinity` have not been externally redefined.\n- `arguments.callee`, `arguments.caller` and `Function.prototype.caller` are not used.\n- The code doesn't expect the contents of `Function.prototype.toString()` or\n  `Error.prototype.stack` to be anything in particular.\n- Getting and setting properties on a plain object does not cause other side effects\n  (using `.watch()` or `Proxy`).\n- Object properties can be added, removed and modified (not prevented with\n  `Object.defineProperty()`, `Object.defineProperties()`, `Object.freeze()`,\n  `Object.preventExtensions()` or `Object.seal()`).\n- `document.all` is not `== null`\n- Assigning properties to a class doesn't have side effects and does not throw.\n\n### Build Tools and Adaptors using Terser\n\nhttps://www.npmjs.com/browse/depended/terser\n\n### Replacing `uglify-es` with `terser` in a project using `yarn`\n\nA number of JS bundlers and uglify wrappers are still using buggy versions\nof `uglify-es` and have not yet upgraded to `terser`. If you are using `yarn`\nyou can add the following alias to your project's `package.json` file:\n\n```js\n  \"resolutions\": {\n    \"uglify-es\": \"npm:terser\"\n  }\n```\n\nto use `terser` instead of `uglify-es` in all deeply nested dependencies\nwithout changing any code.\n\nNote: for this change to take effect you must run the following commands\nto remove the existing `yarn` lock file and reinstall all packages:\n\n```\n$ rm -rf node_modules yarn.lock\n$ yarn\n```\n\n<!-- API_REFERENCE:END -->\n\n# Reporting issues\n\nIn the terser CLI we use [source-map-support](https://npmjs.com/source-map-support) to produce good error stacks. In your own app, you're expected to enable source-map-support (read their docs) to have nice stack traces that will help you write good issues.\n\n## Obtaining the source code given to Terser\n\nBecause users often don't control the call to `await minify()` or its arguments, Terser provides a `TERSER_DEBUG_DIR` environment variable to make terser output some debug logs. If you're using a bundler or a project that includes a bundler and are not sure what went wrong with your code, pass that variable like so:\n\n```\n$ TERSER_DEBUG_DIR=/path/to/logs command-that-uses-terser\n$ ls /path/to/logs\nterser-debug-123456.log\n```\n\nIf you're not sure how to set an environment variable on your shell (the above example works in bash), you can try using cross-env:\n\n```\n> npx cross-env TERSER_DEBUG_DIR=/path/to/logs command-that-uses-terser\n```\n\n# README.md Patrons:\n\n*note*: <s>You can support this project on patreon: [link]</s> **The Terser Patreon is shutting down in favor of opencollective**. Check out [PATRONS.md](https://github.com/terser/terser/blob/master/PATRONS.md) for our first-tier patrons.\n\nThese are the second-tier patrons. Great thanks for your support!\n\n * CKEditor ![](https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/15452278/f8548dcf48d740619071e8d614459280/1?token-time=2145916800&token-hash=SIQ54PhIPHv3M7CVz9LxS8_8v4sOw4H304HaXsXj8MM%3D)\n * 38elements ![](https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12501844/88e7fc5dd62d45c6a5626533bbd48cfb/1?token-time=2145916800&token-hash=c3AsQ5T0IQWic0zKxFHu-bGGQJkXQFvafvJ4bPerFR4%3D)\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/terser/terser/graphs/contributors\"><img src=\"https://opencollective.com/terser/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/terser/contribute)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/terser\"><img src=\"https://opencollective.com/terser/individuals.svg?width=890\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/terser/contribute)]\n\n<a href=\"https://opencollective.com/terser/organization/0/website\"><img src=\"https://opencollective.com/terser/organization/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/1/website\"><img src=\"https://opencollective.com/terser/organization/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/2/website\"><img src=\"https://opencollective.com/terser/organization/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/3/website\"><img src=\"https://opencollective.com/terser/organization/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/4/website\"><img src=\"https://opencollective.com/terser/organization/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/5/website\"><img src=\"https://opencollective.com/terser/organization/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/6/website\"><img src=\"https://opencollective.com/terser/organization/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/7/website\"><img src=\"https://opencollective.com/terser/organization/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/8/website\"><img src=\"https://opencollective.com/terser/organization/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/terser/organization/9/website\"><img src=\"https://opencollective.com/terser/organization/9/avatar.svg\"></a>\n"
  },
  {
    "path": "templates/bin/node/terser/bin/package.json",
    "content": "{\n  \"name\": \"bin\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"main\": \"terser\",\n  \"type\": \"commonjs\",\n  \"author\": \"\",\n  \"license\": \"BSD-2-Clause\",\n  \"description\": \"A package to hold the Terser bin bundle as commonjs while keeping the rest of it ESM.\"\n}\n"
  },
  {
    "path": "templates/bin/node/terser/bin/terser",
    "content": "#!/usr/bin/env node\n\n\"use strict\";\n\nrequire(\"../tools/exit.cjs\");\n\ntry {\n    require(\"source-map-support\").install();\n} catch (err) {}\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst program = require(\"commander\");\n\nconst packageJson = require(\"../package.json\");\nconst { _run_cli: run_cli } = require(\"..\");\n\nrun_cli({ program, packageJson, fs, path }).catch((error) => {\n    console.error(error);\n    process.exitCode = 1;\n});\n"
  },
  {
    "path": "templates/bin/node/terser/bin/uglifyjs",
    "content": "#!/usr/bin/env node\n// -*- js -*-\n/* eslint-env node */\n\n\"use strict\";\n\nprocess.stderr.write( \"DEPRECATION WARNING: uglifyjs binary will soon be discontinued!\\n\");\nprocess.stderr.write(\"Please use \\\"terser\\\" instead.\\n\\n\");\n\nrequire(\"./terser\");\n"
  },
  {
    "path": "templates/bin/node/terser/dist/.gitkeep",
    "content": ""
  },
  {
    "path": "templates/bin/node/terser/dist/package.json",
    "content": "{\n  \"name\": \"dist\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"main\": \"bundle.min.js\",\n  \"type\": \"commonjs\",\n  \"author\": \"\",\n  \"license\": \"BSD-2-Clause\",\n  \"description\": \"A package to hold the Terser dist bundle as commonjs while keeping the rest of it ESM. Nothing to see here.\"\n}\n"
  },
  {
    "path": "templates/bin/node/terser/lib/ast.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    HOP,\n    MAP,\n    noop\n} from \"./utils/index.js\";\nimport { parse } from \"./parse.js\";\n\nfunction DEFNODE(type, props, ctor, methods, base = AST_Node) {\n    if (!props) props = [];\n    else props = props.split(/\\s+/);\n    var self_props = props;\n    if (base && base.PROPS)\n        props = props.concat(base.PROPS);\n    const proto = base && Object.create(base.prototype);\n    if (proto) {\n        ctor.prototype = proto;\n        ctor.BASE = base;\n    }\n    if (base) base.SUBCLASSES.push(ctor);\n    ctor.prototype.CTOR = ctor;\n    ctor.prototype.constructor = ctor;\n    ctor.PROPS = props || null;\n    ctor.SELF_PROPS = self_props;\n    ctor.SUBCLASSES = [];\n    if (type) {\n        ctor.prototype.TYPE = ctor.TYPE = type;\n    }\n    if (methods) for (let i in methods) if (HOP(methods, i)) {\n        if (i[0] === \"$\") {\n            ctor[i.substr(1)] = methods[i];\n        } else {\n            ctor.prototype[i] = methods[i];\n        }\n    }\n    ctor.DEFMETHOD = function(name, method) {\n        this.prototype[name] = method;\n    };\n    return ctor;\n}\n\nconst has_tok_flag = (tok, flag) => Boolean(tok.flags & flag);\nconst set_tok_flag = (tok, flag, truth) => {\n    if (truth) {\n        tok.flags |= flag;\n    } else {\n        tok.flags &= ~flag;\n    }\n};\n\nconst TOK_FLAG_NLB          = 0b0001;\nconst TOK_FLAG_QUOTE_SINGLE = 0b0010;\nconst TOK_FLAG_QUOTE_EXISTS = 0b0100;\nconst TOK_FLAG_TEMPLATE_END = 0b1000;\n\nclass AST_Token {\n    constructor(type, value, line, col, pos, nlb, comments_before, comments_after, file) {\n        this.flags = (nlb ? 1 : 0);\n\n        this.type = type;\n        this.value = value;\n        this.line = line;\n        this.col = col;\n        this.pos = pos;\n        this.comments_before = comments_before;\n        this.comments_after = comments_after;\n        this.file = file;\n\n        Object.seal(this);\n    }\n\n    // Return a string summary of the token for node.js console.log\n    [Symbol.for(\"nodejs.util.inspect.custom\")](_depth, options) {\n        const special = str => options.stylize(str, \"special\");\n        const quote = typeof this.value === \"string\" && this.value.includes(\"`\") ? \"'\" : \"`\";\n        const value = `${quote}${this.value}${quote}`;\n        return `${special(\"[AST_Token\")} ${value} at ${this.line}:${this.col}${special(\"]\")}`;\n    }\n\n    get nlb() {\n        return has_tok_flag(this, TOK_FLAG_NLB);\n    }\n\n    set nlb(new_nlb) {\n        set_tok_flag(this, TOK_FLAG_NLB, new_nlb);\n    }\n\n    get quote() {\n        return !has_tok_flag(this, TOK_FLAG_QUOTE_EXISTS)\n            ? \"\"\n            : (has_tok_flag(this, TOK_FLAG_QUOTE_SINGLE) ? \"'\" : '\"');\n    }\n\n    set quote(quote_type) {\n        set_tok_flag(this, TOK_FLAG_QUOTE_SINGLE, quote_type === \"'\");\n        set_tok_flag(this, TOK_FLAG_QUOTE_EXISTS, !!quote_type);\n    }\n\n    get template_end() {\n        return has_tok_flag(this, TOK_FLAG_TEMPLATE_END);\n    }\n\n    set template_end(new_template_end) {\n        set_tok_flag(this, TOK_FLAG_TEMPLATE_END, new_template_end);\n    }\n}\n\nvar AST_Node = DEFNODE(\"Node\", \"start end\", function AST_Node(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    _clone: function(deep) {\n        if (deep) {\n            var self = this.clone();\n            return self.transform(new TreeTransformer(function(node) {\n                if (node !== self) {\n                    return node.clone(true);\n                }\n            }));\n        }\n        return new this.CTOR(this);\n    },\n    clone: function(deep) {\n        return this._clone(deep);\n    },\n    $documentation: \"Base class of all AST nodes\",\n    $propdoc: {\n        start: \"[AST_Token] The first token of this node\",\n        end: \"[AST_Token] The last token of this node\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this);\n    },\n    walk: function(visitor) {\n        return this._walk(visitor); // not sure the indirection will be any help\n    },\n    _children_backwards: () => {}\n}, null);\n\n/* -----[ statements ]----- */\n\nvar AST_Statement = DEFNODE(\"Statement\", null, function AST_Statement(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class of all statements\",\n});\n\nvar AST_Debugger = DEFNODE(\"Debugger\", null, function AST_Debugger(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Represents a debugger statement\",\n}, AST_Statement);\n\nvar AST_Directive = DEFNODE(\"Directive\", \"value quote\", function AST_Directive(props) {\n    if (props) {\n        this.value = props.value;\n        this.quote = props.quote;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Represents a directive, like \\\"use strict\\\";\",\n    $propdoc: {\n        value: \"[string] The value of this directive as a plain string (it's not an AST_String!)\",\n        quote: \"[string] the original quote character\"\n    },\n}, AST_Statement);\n\nvar AST_SimpleStatement = DEFNODE(\"SimpleStatement\", \"body\", function AST_SimpleStatement(props) {\n    if (props) {\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A statement consisting of an expression, i.e. a = 1 + 2\",\n    $propdoc: {\n        body: \"[AST_Node] an expression node (should not be instanceof AST_Statement)\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.body._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.body);\n    }\n}, AST_Statement);\n\nfunction walk_body(node, visitor) {\n    const body = node.body;\n    for (var i = 0, len = body.length; i < len; i++) {\n        body[i]._walk(visitor);\n    }\n}\n\nfunction clone_block_scope(deep) {\n    var clone = this._clone(deep);\n    if (this.block_scope) {\n        clone.block_scope = this.block_scope.clone();\n    }\n    return clone;\n}\n\nvar AST_Block = DEFNODE(\"Block\", \"body block_scope\", function AST_Block(props) {\n    if (props) {\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A body of statements (usually braced)\",\n    $propdoc: {\n        body: \"[AST_Statement*] an array of statements\",\n        block_scope: \"[AST_Scope] the block scope\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            walk_body(this, visitor);\n        });\n    },\n    _children_backwards(push) {\n        let i = this.body.length;\n        while (i--) push(this.body[i]);\n    },\n    clone: clone_block_scope\n}, AST_Statement);\n\nvar AST_BlockStatement = DEFNODE(\"BlockStatement\", null, function AST_BlockStatement(props) {\n    if (props) {\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A block statement\",\n}, AST_Block);\n\nvar AST_EmptyStatement = DEFNODE(\"EmptyStatement\", null, function AST_EmptyStatement(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The empty statement (empty block or simply a semicolon)\"\n}, AST_Statement);\n\nvar AST_StatementWithBody = DEFNODE(\"StatementWithBody\", \"body\", function AST_StatementWithBody(props) {\n    if (props) {\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`\",\n    $propdoc: {\n        body: \"[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement\"\n    }\n}, AST_Statement);\n\nvar AST_LabeledStatement = DEFNODE(\"LabeledStatement\", \"label\", function AST_LabeledStatement(props) {\n    if (props) {\n        this.label = props.label;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Statement with a label\",\n    $propdoc: {\n        label: \"[AST_Label] a label definition\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.label._walk(visitor);\n            this.body._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.body);\n        push(this.label);\n    },\n    clone: function(deep) {\n        var node = this._clone(deep);\n        if (deep) {\n            var label = node.label;\n            var def = this.label;\n            node.walk(new TreeWalker(function(node) {\n                if (node instanceof AST_LoopControl\n                    && node.label && node.label.thedef === def) {\n                    node.label.thedef = label;\n                    label.references.push(node);\n                }\n            }));\n        }\n        return node;\n    }\n}, AST_StatementWithBody);\n\nvar AST_IterationStatement = DEFNODE(\n    \"IterationStatement\",\n    \"block_scope\",\n    function AST_IterationStatement(props) {\n        if (props) {\n            this.block_scope = props.block_scope;\n            this.body = props.body;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"Internal class.  All loops inherit from it.\",\n        $propdoc: {\n            block_scope: \"[AST_Scope] the block scope for this iteration statement.\"\n        },\n        clone: clone_block_scope\n    },\n    AST_StatementWithBody\n);\n\nvar AST_DWLoop = DEFNODE(\"DWLoop\", \"condition\", function AST_DWLoop(props) {\n    if (props) {\n        this.condition = props.condition;\n        this.block_scope = props.block_scope;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for do/while statements\",\n    $propdoc: {\n        condition: \"[AST_Node] the loop condition.  Should not be instanceof AST_Statement\"\n    }\n}, AST_IterationStatement);\n\nvar AST_Do = DEFNODE(\"Do\", null, function AST_Do(props) {\n    if (props) {\n        this.condition = props.condition;\n        this.block_scope = props.block_scope;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `do` statement\",\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.body._walk(visitor);\n            this.condition._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.condition);\n        push(this.body);\n    }\n}, AST_DWLoop);\n\nvar AST_While = DEFNODE(\"While\", null, function AST_While(props) {\n    if (props) {\n        this.condition = props.condition;\n        this.block_scope = props.block_scope;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `while` statement\",\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.condition._walk(visitor);\n            this.body._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.body);\n        push(this.condition);\n    },\n}, AST_DWLoop);\n\nvar AST_For = DEFNODE(\"For\", \"init condition step\", function AST_For(props) {\n    if (props) {\n        this.init = props.init;\n        this.condition = props.condition;\n        this.step = props.step;\n        this.block_scope = props.block_scope;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `for` statement\",\n    $propdoc: {\n        init: \"[AST_Node?] the `for` initialization code, or null if empty\",\n        condition: \"[AST_Node?] the `for` termination clause, or null if empty\",\n        step: \"[AST_Node?] the `for` update clause, or null if empty\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            if (this.init) this.init._walk(visitor);\n            if (this.condition) this.condition._walk(visitor);\n            if (this.step) this.step._walk(visitor);\n            this.body._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.body);\n        if (this.step) push(this.step);\n        if (this.condition) push(this.condition);\n        if (this.init) push(this.init);\n    },\n}, AST_IterationStatement);\n\nvar AST_ForIn = DEFNODE(\"ForIn\", \"init object\", function AST_ForIn(props) {\n    if (props) {\n        this.init = props.init;\n        this.object = props.object;\n        this.block_scope = props.block_scope;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `for ... in` statement\",\n    $propdoc: {\n        init: \"[AST_Node] the `for/in` initialization code\",\n        object: \"[AST_Node] the object that we're looping through\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.init._walk(visitor);\n            this.object._walk(visitor);\n            this.body._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.body);\n        if (this.object) push(this.object);\n        if (this.init) push(this.init);\n    },\n}, AST_IterationStatement);\n\nvar AST_ForOf = DEFNODE(\"ForOf\", \"await\", function AST_ForOf(props) {\n    if (props) {\n        this.await = props.await;\n        this.init = props.init;\n        this.object = props.object;\n        this.block_scope = props.block_scope;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `for ... of` statement\",\n}, AST_ForIn);\n\nvar AST_With = DEFNODE(\"With\", \"expression\", function AST_With(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `with` statement\",\n    $propdoc: {\n        expression: \"[AST_Node] the `with` expression\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n            this.body._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.body);\n        push(this.expression);\n    },\n}, AST_StatementWithBody);\n\n/* -----[ scope and functions ]----- */\n\nvar AST_Scope = DEFNODE(\n    \"Scope\",\n    \"variables uses_with uses_eval parent_scope enclosed cname\",\n    function AST_Scope(props) {\n        if (props) {\n            this.variables = props.variables;\n            this.uses_with = props.uses_with;\n            this.uses_eval = props.uses_eval;\n            this.parent_scope = props.parent_scope;\n            this.enclosed = props.enclosed;\n            this.cname = props.cname;\n            this.body = props.body;\n            this.block_scope = props.block_scope;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"Base class for all statements introducing a lexical scope\",\n        $propdoc: {\n            variables: \"[Map/S] a map of name -> SymbolDef for all variables/functions defined in this scope\",\n            uses_with: \"[boolean/S] tells whether this scope uses the `with` statement\",\n            uses_eval: \"[boolean/S] tells whether this scope contains a direct call to the global `eval`\",\n            parent_scope: \"[AST_Scope?/S] link to the parent scope\",\n            enclosed: \"[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes\",\n            cname: \"[integer/S] current index for mangling variables (used internally by the mangler)\",\n        },\n        get_defun_scope: function() {\n            var self = this;\n            while (self.is_block_scope()) {\n                self = self.parent_scope;\n            }\n            return self;\n        },\n        clone: function(deep, toplevel) {\n            var node = this._clone(deep);\n            if (deep && this.variables && toplevel && !this._block_scope) {\n                node.figure_out_scope({}, {\n                    toplevel: toplevel,\n                    parent_scope: this.parent_scope\n                });\n            } else {\n                if (this.variables) node.variables = new Map(this.variables);\n                if (this.enclosed) node.enclosed = this.enclosed.slice();\n                if (this._block_scope) node._block_scope = this._block_scope;\n            }\n            return node;\n        },\n        pinned: function() {\n            return this.uses_eval || this.uses_with;\n        }\n    },\n    AST_Block\n);\n\nvar AST_Toplevel = DEFNODE(\"Toplevel\", \"globals\", function AST_Toplevel(props) {\n    if (props) {\n        this.globals = props.globals;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The toplevel scope\",\n    $propdoc: {\n        globals: \"[Map/S] a map of name -> SymbolDef for all undeclared names\",\n    },\n    wrap_commonjs: function(name) {\n        var body = this.body;\n        var wrapped_tl = \"(function(exports){'$ORIG';})(typeof \" + name + \"=='undefined'?(\" + name + \"={}):\" + name + \");\";\n        wrapped_tl = parse(wrapped_tl);\n        wrapped_tl = wrapped_tl.transform(new TreeTransformer(function(node) {\n            if (node instanceof AST_Directive && node.value == \"$ORIG\") {\n                return MAP.splice(body);\n            }\n        }));\n        return wrapped_tl;\n    },\n    wrap_enclose: function(args_values) {\n        if (typeof args_values != \"string\") args_values = \"\";\n        var index = args_values.indexOf(\":\");\n        if (index < 0) index = args_values.length;\n        var body = this.body;\n        return parse([\n            \"(function(\",\n            args_values.slice(0, index),\n            '){\"$ORIG\"})(',\n            args_values.slice(index + 1),\n            \")\"\n        ].join(\"\")).transform(new TreeTransformer(function(node) {\n            if (node instanceof AST_Directive && node.value == \"$ORIG\") {\n                return MAP.splice(body);\n            }\n        }));\n    }\n}, AST_Scope);\n\nvar AST_Expansion = DEFNODE(\"Expansion\", \"expression\", function AST_Expansion(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An expandible argument, such as ...rest, a splat, such as [1,2,...all], or an expansion in a variable declaration, such as var [first, ...rest] = list\",\n    $propdoc: {\n        expression: \"[AST_Node] the thing to be expanded\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression.walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.expression);\n    },\n});\n\nvar AST_Lambda = DEFNODE(\n    \"Lambda\",\n    \"name argnames uses_arguments is_generator async\",\n    function AST_Lambda(props) {\n        if (props) {\n            this.name = props.name;\n            this.argnames = props.argnames;\n            this.uses_arguments = props.uses_arguments;\n            this.is_generator = props.is_generator;\n            this.async = props.async;\n            this.variables = props.variables;\n            this.uses_with = props.uses_with;\n            this.uses_eval = props.uses_eval;\n            this.parent_scope = props.parent_scope;\n            this.enclosed = props.enclosed;\n            this.cname = props.cname;\n            this.body = props.body;\n            this.block_scope = props.block_scope;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"Base class for functions\",\n        $propdoc: {\n            name: \"[AST_SymbolDeclaration?] the name of this function\",\n            argnames: \"[AST_SymbolFunarg|AST_Destructuring|AST_Expansion|AST_DefaultAssign*] array of function arguments, destructurings, or expanding arguments\",\n            uses_arguments: \"[boolean/S] tells whether this function accesses the arguments array\",\n            is_generator: \"[boolean] is this a generator method\",\n            async: \"[boolean] is this method async\",\n        },\n        args_as_names: function () {\n            var out = [];\n            for (var i = 0; i < this.argnames.length; i++) {\n                if (this.argnames[i] instanceof AST_Destructuring) {\n                    out.push(...this.argnames[i].all_symbols());\n                } else {\n                    out.push(this.argnames[i]);\n                }\n            }\n            return out;\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                if (this.name) this.name._walk(visitor);\n                var argnames = this.argnames;\n                for (var i = 0, len = argnames.length; i < len; i++) {\n                    argnames[i]._walk(visitor);\n                }\n                walk_body(this, visitor);\n            });\n        },\n        _children_backwards(push) {\n            let i = this.body.length;\n            while (i--) push(this.body[i]);\n\n            i = this.argnames.length;\n            while (i--) push(this.argnames[i]);\n\n            if (this.name) push(this.name);\n        },\n        is_braceless() {\n            return this.body[0] instanceof AST_Return && this.body[0].value;\n        },\n        // Default args and expansion don't count, so .argnames.length doesn't cut it\n        length_property() {\n            let length = 0;\n\n            for (const arg of this.argnames) {\n                if (arg instanceof AST_SymbolFunarg || arg instanceof AST_Destructuring) {\n                    length++;\n                }\n            }\n\n            return length;\n        }\n    },\n    AST_Scope\n);\n\nvar AST_Accessor = DEFNODE(\"Accessor\", null, function AST_Accessor(props) {\n    if (props) {\n        this.name = props.name;\n        this.argnames = props.argnames;\n        this.uses_arguments = props.uses_arguments;\n        this.is_generator = props.is_generator;\n        this.async = props.async;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A setter/getter function.  The `name` property is always null.\"\n}, AST_Lambda);\n\nvar AST_Function = DEFNODE(\"Function\", null, function AST_Function(props) {\n    if (props) {\n        this.name = props.name;\n        this.argnames = props.argnames;\n        this.uses_arguments = props.uses_arguments;\n        this.is_generator = props.is_generator;\n        this.async = props.async;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A function expression\"\n}, AST_Lambda);\n\nvar AST_Arrow = DEFNODE(\"Arrow\", null, function AST_Arrow(props) {\n    if (props) {\n        this.name = props.name;\n        this.argnames = props.argnames;\n        this.uses_arguments = props.uses_arguments;\n        this.is_generator = props.is_generator;\n        this.async = props.async;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An ES6 Arrow function ((a) => b)\"\n}, AST_Lambda);\n\nvar AST_Defun = DEFNODE(\"Defun\", null, function AST_Defun(props) {\n    if (props) {\n        this.name = props.name;\n        this.argnames = props.argnames;\n        this.uses_arguments = props.uses_arguments;\n        this.is_generator = props.is_generator;\n        this.async = props.async;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A function definition\"\n}, AST_Lambda);\n\n/* -----[ DESTRUCTURING ]----- */\nvar AST_Destructuring = DEFNODE(\"Destructuring\", \"names is_array\", function AST_Destructuring(props) {\n    if (props) {\n        this.names = props.names;\n        this.is_array = props.is_array;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A destructuring of several names. Used in destructuring assignment and with destructuring function argument names\",\n    $propdoc: {\n        \"names\": \"[AST_Node*] Array of properties or elements\",\n        \"is_array\": \"[Boolean] Whether the destructuring represents an object or array\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.names.forEach(function(name) {\n                name._walk(visitor);\n            });\n        });\n    },\n    _children_backwards(push) {\n        let i = this.names.length;\n        while (i--) push(this.names[i]);\n    },\n    all_symbols: function() {\n        var out = [];\n        walk(this, node => {\n            if (node instanceof AST_SymbolDeclaration) {\n                out.push(node);\n            }\n            if (node instanceof AST_Lambda) {\n                return true;\n            }\n        });\n        return out;\n    }\n});\n\nvar AST_PrefixedTemplateString = DEFNODE(\n    \"PrefixedTemplateString\",\n    \"template_string prefix\",\n    function AST_PrefixedTemplateString(props) {\n        if (props) {\n            this.template_string = props.template_string;\n            this.prefix = props.prefix;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"A templatestring with a prefix, such as String.raw`foobarbaz`\",\n        $propdoc: {\n            template_string: \"[AST_TemplateString] The template string\",\n            prefix: \"[AST_Node] The prefix, which will get called.\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function () {\n                this.prefix._walk(visitor);\n                this.template_string._walk(visitor);\n            });\n        },\n        _children_backwards(push) {\n            push(this.template_string);\n            push(this.prefix);\n        },\n    }\n);\n\nvar AST_TemplateString = DEFNODE(\"TemplateString\", \"segments\", function AST_TemplateString(props) {\n    if (props) {\n        this.segments = props.segments;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A template string literal\",\n    $propdoc: {\n        segments: \"[AST_Node*] One or more segments, starting with AST_TemplateSegment. AST_Node may follow AST_TemplateSegment, but each AST_Node must be followed by AST_TemplateSegment.\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.segments.forEach(function(seg) {\n                seg._walk(visitor);\n            });\n        });\n    },\n    _children_backwards(push) {\n        let i = this.segments.length;\n        while (i--) push(this.segments[i]);\n    }\n});\n\nvar AST_TemplateSegment = DEFNODE(\"TemplateSegment\", \"value raw\", function AST_TemplateSegment(props) {\n    if (props) {\n        this.value = props.value;\n        this.raw = props.raw;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A segment of a template string literal\",\n    $propdoc: {\n        value: \"Content of the segment\",\n        raw: \"Raw source of the segment\",\n    }\n});\n\n/* -----[ JUMPS ]----- */\n\nvar AST_Jump = DEFNODE(\"Jump\", null, function AST_Jump(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)\"\n}, AST_Statement);\n\n/** Base class for “exits” (`return` and `throw`) */\nvar AST_Exit = DEFNODE(\"Exit\", \"value\", function AST_Exit(props) {\n    if (props) {\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for “exits” (`return` and `throw`)\",\n    $propdoc: {\n        value: \"[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, this.value && function() {\n            this.value._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.value) push(this.value);\n    },\n}, AST_Jump);\n\nvar AST_Return = DEFNODE(\"Return\", null, function AST_Return(props) {\n    if (props) {\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `return` statement\"\n}, AST_Exit);\n\nvar AST_Throw = DEFNODE(\"Throw\", null, function AST_Throw(props) {\n    if (props) {\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `throw` statement\"\n}, AST_Exit);\n\nvar AST_LoopControl = DEFNODE(\"LoopControl\", \"label\", function AST_LoopControl(props) {\n    if (props) {\n        this.label = props.label;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for loop control statements (`break` and `continue`)\",\n    $propdoc: {\n        label: \"[AST_LabelRef?] the label, or null if none\",\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, this.label && function() {\n            this.label._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.label) push(this.label);\n    },\n}, AST_Jump);\n\nvar AST_Break = DEFNODE(\"Break\", null, function AST_Break(props) {\n    if (props) {\n        this.label = props.label;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `break` statement\"\n}, AST_LoopControl);\n\nvar AST_Continue = DEFNODE(\"Continue\", null, function AST_Continue(props) {\n    if (props) {\n        this.label = props.label;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `continue` statement\"\n}, AST_LoopControl);\n\nvar AST_Await = DEFNODE(\"Await\", \"expression\", function AST_Await(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An `await` statement\",\n    $propdoc: {\n        expression: \"[AST_Node] the mandatory expression being awaited\",\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.expression);\n    },\n});\n\nvar AST_Yield = DEFNODE(\"Yield\", \"expression is_star\", function AST_Yield(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.is_star = props.is_star;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `yield` statement\",\n    $propdoc: {\n        expression: \"[AST_Node?] the value returned or thrown by this statement; could be null (representing undefined) but only when is_star is set to false\",\n        is_star: \"[Boolean] Whether this is a yield or yield* statement\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, this.expression && function() {\n            this.expression._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.expression) push(this.expression);\n    }\n});\n\n/* -----[ IF ]----- */\n\nvar AST_If = DEFNODE(\"If\", \"condition alternative\", function AST_If(props) {\n    if (props) {\n        this.condition = props.condition;\n        this.alternative = props.alternative;\n        this.body = props.body;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `if` statement\",\n    $propdoc: {\n        condition: \"[AST_Node] the `if` condition\",\n        alternative: \"[AST_Statement?] the `else` part, or null if not present\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.condition._walk(visitor);\n            this.body._walk(visitor);\n            if (this.alternative) this.alternative._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.alternative) {\n            push(this.alternative);\n        }\n        push(this.body);\n        push(this.condition);\n    }\n}, AST_StatementWithBody);\n\n/* -----[ SWITCH ]----- */\n\nvar AST_Switch = DEFNODE(\"Switch\", \"expression\", function AST_Switch(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `switch` statement\",\n    $propdoc: {\n        expression: \"[AST_Node] the `switch` “discriminant”\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n            walk_body(this, visitor);\n        });\n    },\n    _children_backwards(push) {\n        let i = this.body.length;\n        while (i--) push(this.body[i]);\n        push(this.expression);\n    }\n}, AST_Block);\n\nvar AST_SwitchBranch = DEFNODE(\"SwitchBranch\", null, function AST_SwitchBranch(props) {\n    if (props) {\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for `switch` branches\",\n}, AST_Block);\n\nvar AST_Default = DEFNODE(\"Default\", null, function AST_Default(props) {\n    if (props) {\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `default` switch branch\",\n}, AST_SwitchBranch);\n\nvar AST_Case = DEFNODE(\"Case\", \"expression\", function AST_Case(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `case` switch branch\",\n    $propdoc: {\n        expression: \"[AST_Node] the `case` expression\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n            walk_body(this, visitor);\n        });\n    },\n    _children_backwards(push) {\n        let i = this.body.length;\n        while (i--) push(this.body[i]);\n        push(this.expression);\n    },\n}, AST_SwitchBranch);\n\n/* -----[ EXCEPTIONS ]----- */\n\nvar AST_Try = DEFNODE(\"Try\", \"body bcatch bfinally\", function AST_Try(props) {\n    if (props) {\n        this.body = props.body;\n        this.bcatch = props.bcatch;\n        this.bfinally = props.bfinally;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `try` statement\",\n    $propdoc: {\n        body: \"[AST_TryBlock] the try block\",\n        bcatch: \"[AST_Catch?] the catch block, or null if not present\",\n        bfinally: \"[AST_Finally?] the finally block, or null if not present\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.body._walk(visitor);\n            if (this.bcatch) this.bcatch._walk(visitor);\n            if (this.bfinally) this.bfinally._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.bfinally) push(this.bfinally);\n        if (this.bcatch) push(this.bcatch);\n        push(this.body);\n    },\n}, AST_Statement);\n\nvar AST_TryBlock = DEFNODE(\"TryBlock\", null, function AST_TryBlock(props) {\n    if (props) {\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `try` block of a try statement\"\n}, AST_Block);\n\nvar AST_Catch = DEFNODE(\"Catch\", \"argname\", function AST_Catch(props) {\n    if (props) {\n        this.argname = props.argname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `catch` node; only makes sense as part of a `try` statement\",\n    $propdoc: {\n        argname: \"[AST_SymbolCatch|AST_Destructuring|AST_Expansion|AST_DefaultAssign] symbol for the exception\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            if (this.argname) this.argname._walk(visitor);\n            walk_body(this, visitor);\n        });\n    },\n    _children_backwards(push) {\n        let i = this.body.length;\n        while (i--) push(this.body[i]);\n        if (this.argname) push(this.argname);\n    },\n}, AST_Block);\n\nvar AST_Finally = DEFNODE(\"Finally\", null, function AST_Finally(props) {\n    if (props) {\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `finally` node; only makes sense as part of a `try` statement\"\n}, AST_Block);\n\n/* -----[ VAR/CONST ]----- */\n\nvar AST_Definitions = DEFNODE(\"Definitions\", \"definitions\", function AST_Definitions(props) {\n    if (props) {\n        this.definitions = props.definitions;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for `var` or `const` nodes (variable declarations/initializations)\",\n    $propdoc: {\n        definitions: \"[AST_VarDef*] array of variable definitions\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            var definitions = this.definitions;\n            for (var i = 0, len = definitions.length; i < len; i++) {\n                definitions[i]._walk(visitor);\n            }\n        });\n    },\n    _children_backwards(push) {\n        let i = this.definitions.length;\n        while (i--) push(this.definitions[i]);\n    },\n}, AST_Statement);\n\nvar AST_Var = DEFNODE(\"Var\", null, function AST_Var(props) {\n    if (props) {\n        this.definitions = props.definitions;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `var` statement\"\n}, AST_Definitions);\n\nvar AST_Let = DEFNODE(\"Let\", null, function AST_Let(props) {\n    if (props) {\n        this.definitions = props.definitions;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `let` statement\"\n}, AST_Definitions);\n\nvar AST_Const = DEFNODE(\"Const\", null, function AST_Const(props) {\n    if (props) {\n        this.definitions = props.definitions;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A `const` statement\"\n}, AST_Definitions);\n\nvar AST_VarDef = DEFNODE(\"VarDef\", \"name value\", function AST_VarDef(props) {\n    if (props) {\n        this.name = props.name;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A variable declaration; only appears in a AST_Definitions node\",\n    $propdoc: {\n        name: \"[AST_Destructuring|AST_SymbolConst|AST_SymbolLet|AST_SymbolVar] name of the variable\",\n        value: \"[AST_Node?] initializer, or null of there's no initializer\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.name._walk(visitor);\n            if (this.value) this.value._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.value) push(this.value);\n        push(this.name);\n    },\n    declarations_as_names() {\n        if (this.name instanceof AST_SymbolDeclaration) {\n            return [this];\n        } else {\n            return this.name.all_symbols();\n        }\n    }\n});\n\nvar AST_NameMapping = DEFNODE(\"NameMapping\", \"foreign_name name\", function AST_NameMapping(props) {\n    if (props) {\n        this.foreign_name = props.foreign_name;\n        this.name = props.name;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The part of the export/import statement that declare names from a module.\",\n    $propdoc: {\n        foreign_name: \"[AST_SymbolExportForeign|AST_SymbolImportForeign] The name being exported/imported (as specified in the module)\",\n        name: \"[AST_SymbolExport|AST_SymbolImport] The name as it is visible to this module.\"\n    },\n    _walk: function (visitor) {\n        return visitor._visit(this, function() {\n            this.foreign_name._walk(visitor);\n            this.name._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.name);\n        push(this.foreign_name);\n    },\n});\n\nvar AST_Import = DEFNODE(\n    \"Import\",\n    \"imported_name imported_names module_name assert_clause\",\n    function AST_Import(props) {\n        if (props) {\n            this.imported_name = props.imported_name;\n            this.imported_names = props.imported_names;\n            this.module_name = props.module_name;\n            this.assert_clause = props.assert_clause;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"An `import` statement\",\n        $propdoc: {\n            imported_name: \"[AST_SymbolImport] The name of the variable holding the module's default export.\",\n            imported_names: \"[AST_NameMapping*] The names of non-default imported variables\",\n            module_name: \"[AST_String] String literal describing where this module came from\",\n            assert_clause: \"[AST_Object?] The import assertion\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                if (this.imported_name) {\n                    this.imported_name._walk(visitor);\n                }\n                if (this.imported_names) {\n                    this.imported_names.forEach(function(name_import) {\n                        name_import._walk(visitor);\n                    });\n                }\n                this.module_name._walk(visitor);\n            });\n        },\n        _children_backwards(push) {\n            push(this.module_name);\n            if (this.imported_names) {\n                let i = this.imported_names.length;\n                while (i--) push(this.imported_names[i]);\n            }\n            if (this.imported_name) push(this.imported_name);\n        },\n    }\n);\n\nvar AST_ImportMeta = DEFNODE(\"ImportMeta\", null, function AST_ImportMeta(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A reference to import.meta\",\n});\n\nvar AST_Export = DEFNODE(\n    \"Export\",\n    \"exported_definition exported_value is_default exported_names module_name assert_clause\",\n    function AST_Export(props) {\n        if (props) {\n            this.exported_definition = props.exported_definition;\n            this.exported_value = props.exported_value;\n            this.is_default = props.is_default;\n            this.exported_names = props.exported_names;\n            this.module_name = props.module_name;\n            this.assert_clause = props.assert_clause;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"An `export` statement\",\n        $propdoc: {\n            exported_definition: \"[AST_Defun|AST_Definitions|AST_DefClass?] An exported definition\",\n            exported_value: \"[AST_Node?] An exported value\",\n            exported_names: \"[AST_NameMapping*?] List of exported names\",\n            module_name: \"[AST_String?] Name of the file to load exports from\",\n            is_default: \"[Boolean] Whether this is the default exported value of this module\",\n            assert_clause: \"[AST_Object?] The import assertion\"\n        },\n        _walk: function (visitor) {\n            return visitor._visit(this, function () {\n                if (this.exported_definition) {\n                    this.exported_definition._walk(visitor);\n                }\n                if (this.exported_value) {\n                    this.exported_value._walk(visitor);\n                }\n                if (this.exported_names) {\n                    this.exported_names.forEach(function(name_export) {\n                        name_export._walk(visitor);\n                    });\n                }\n                if (this.module_name) {\n                    this.module_name._walk(visitor);\n                }\n            });\n        },\n        _children_backwards(push) {\n            if (this.module_name) push(this.module_name);\n            if (this.exported_names) {\n                let i = this.exported_names.length;\n                while (i--) push(this.exported_names[i]);\n            }\n            if (this.exported_value) push(this.exported_value);\n            if (this.exported_definition) push(this.exported_definition);\n        }\n    },\n    AST_Statement\n);\n\n/* -----[ OTHER ]----- */\n\nvar AST_Call = DEFNODE(\n    \"Call\",\n    \"expression args optional _annotations\",\n    function AST_Call(props) {\n        if (props) {\n            this.expression = props.expression;\n            this.args = props.args;\n            this.optional = props.optional;\n            this._annotations = props._annotations;\n            this.start = props.start;\n            this.end = props.end;\n            this.initialize();\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"A function call expression\",\n        $propdoc: {\n            expression: \"[AST_Node] expression to invoke as function\",\n            args: \"[AST_Node*] array of arguments\",\n            optional: \"[boolean] whether this is an optional call (IE ?.() )\",\n            _annotations: \"[number] bitfield containing information about the call\"\n        },\n        initialize() {\n            if (this._annotations == null) this._annotations = 0;\n        },\n        _walk(visitor) {\n            return visitor._visit(this, function() {\n                var args = this.args;\n                for (var i = 0, len = args.length; i < len; i++) {\n                    args[i]._walk(visitor);\n                }\n                this.expression._walk(visitor);  // TODO why do we need to crawl this last?\n            });\n        },\n        _children_backwards(push) {\n            let i = this.args.length;\n            while (i--) push(this.args[i]);\n            push(this.expression);\n        },\n    }\n);\n\nvar AST_New = DEFNODE(\"New\", null, function AST_New(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.args = props.args;\n        this.optional = props.optional;\n        this._annotations = props._annotations;\n        this.start = props.start;\n        this.end = props.end;\n        this.initialize();\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An object instantiation.  Derives from a function call since it has exactly the same properties\"\n}, AST_Call);\n\nvar AST_Sequence = DEFNODE(\"Sequence\", \"expressions\", function AST_Sequence(props) {\n    if (props) {\n        this.expressions = props.expressions;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A sequence expression (comma-separated expressions)\",\n    $propdoc: {\n        expressions: \"[AST_Node*] array of expressions (at least two)\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expressions.forEach(function(node) {\n                node._walk(visitor);\n            });\n        });\n    },\n    _children_backwards(push) {\n        let i = this.expressions.length;\n        while (i--) push(this.expressions[i]);\n    },\n});\n\nvar AST_PropAccess = DEFNODE(\n    \"PropAccess\",\n    \"expression property optional\",\n    function AST_PropAccess(props) {\n        if (props) {\n            this.expression = props.expression;\n            this.property = props.property;\n            this.optional = props.optional;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"Base class for property access expressions, i.e. `a.foo` or `a[\\\"foo\\\"]`\",\n        $propdoc: {\n            expression: \"[AST_Node] the “container” expression\",\n            property: \"[AST_Node|string] the property to access.  For AST_Dot & AST_DotHash this is always a plain string, while for AST_Sub it's an arbitrary AST_Node\",\n\n            optional: \"[boolean] whether this is an optional property access (IE ?.)\"\n        }\n    }\n);\n\nvar AST_Dot = DEFNODE(\"Dot\", \"quote\", function AST_Dot(props) {\n    if (props) {\n        this.quote = props.quote;\n        this.expression = props.expression;\n        this.property = props.property;\n        this.optional = props.optional;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A dotted property access expression\",\n    $propdoc: {\n        quote: \"[string] the original quote character when transformed from AST_Sub\",\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.expression);\n    },\n}, AST_PropAccess);\n\nvar AST_DotHash = DEFNODE(\"DotHash\", \"\", function AST_DotHash(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.property = props.property;\n        this.optional = props.optional;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A dotted property access to a private property\",\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.expression);\n    },\n}, AST_PropAccess);\n\nvar AST_Sub = DEFNODE(\"Sub\", null, function AST_Sub(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.property = props.property;\n        this.optional = props.optional;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Index-style property access, i.e. `a[\\\"foo\\\"]`\",\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n            this.property._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.property);\n        push(this.expression);\n    },\n}, AST_PropAccess);\n\nvar AST_Chain = DEFNODE(\"Chain\", \"expression\", function AST_Chain(props) {\n    if (props) {\n        this.expression = props.expression;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A chain expression like a?.b?.(c)?.[d]\",\n    $propdoc: {\n        expression: \"[AST_Call|AST_Dot|AST_DotHash|AST_Sub] chain element.\"\n    },\n    _walk: function (visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.expression);\n    },\n});\n\nvar AST_Unary = DEFNODE(\"Unary\", \"operator expression\", function AST_Unary(props) {\n    if (props) {\n        this.operator = props.operator;\n        this.expression = props.expression;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for unary expressions\",\n    $propdoc: {\n        operator: \"[string] the operator\",\n        expression: \"[AST_Node] expression that this unary operator applies to\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.expression._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.expression);\n    },\n});\n\nvar AST_UnaryPrefix = DEFNODE(\"UnaryPrefix\", null, function AST_UnaryPrefix(props) {\n    if (props) {\n        this.operator = props.operator;\n        this.expression = props.expression;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Unary prefix expression, i.e. `typeof i` or `++i`\"\n}, AST_Unary);\n\nvar AST_UnaryPostfix = DEFNODE(\"UnaryPostfix\", null, function AST_UnaryPostfix(props) {\n    if (props) {\n        this.operator = props.operator;\n        this.expression = props.expression;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Unary postfix expression, i.e. `i++`\"\n}, AST_Unary);\n\nvar AST_Binary = DEFNODE(\"Binary\", \"operator left right\", function AST_Binary(props) {\n    if (props) {\n        this.operator = props.operator;\n        this.left = props.left;\n        this.right = props.right;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Binary expression, i.e. `a + b`\",\n    $propdoc: {\n        left: \"[AST_Node] left-hand side expression\",\n        operator: \"[string] the operator\",\n        right: \"[AST_Node] right-hand side expression\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.left._walk(visitor);\n            this.right._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.right);\n        push(this.left);\n    },\n});\n\nvar AST_Conditional = DEFNODE(\n    \"Conditional\",\n    \"condition consequent alternative\",\n    function AST_Conditional(props) {\n        if (props) {\n            this.condition = props.condition;\n            this.consequent = props.consequent;\n            this.alternative = props.alternative;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"Conditional expression using the ternary operator, i.e. `a ? b : c`\",\n        $propdoc: {\n            condition: \"[AST_Node]\",\n            consequent: \"[AST_Node]\",\n            alternative: \"[AST_Node]\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.condition._walk(visitor);\n                this.consequent._walk(visitor);\n                this.alternative._walk(visitor);\n            });\n        },\n        _children_backwards(push) {\n            push(this.alternative);\n            push(this.consequent);\n            push(this.condition);\n        },\n    }\n);\n\nvar AST_Assign = DEFNODE(\"Assign\", \"logical\", function AST_Assign(props) {\n    if (props) {\n        this.logical = props.logical;\n        this.operator = props.operator;\n        this.left = props.left;\n        this.right = props.right;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An assignment expression — `a = b + 5`\",\n    $propdoc: {\n        logical: \"Whether it's a logical assignment\"\n    }\n}, AST_Binary);\n\nvar AST_DefaultAssign = DEFNODE(\"DefaultAssign\", null, function AST_DefaultAssign(props) {\n    if (props) {\n        this.operator = props.operator;\n        this.left = props.left;\n        this.right = props.right;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A default assignment expression like in `(a = 3) => a`\"\n}, AST_Binary);\n\n/* -----[ LITERALS ]----- */\n\nvar AST_Array = DEFNODE(\"Array\", \"elements\", function AST_Array(props) {\n    if (props) {\n        this.elements = props.elements;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An array literal\",\n    $propdoc: {\n        elements: \"[AST_Node*] array of elements\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            var elements = this.elements;\n            for (var i = 0, len = elements.length; i < len; i++) {\n                elements[i]._walk(visitor);\n            }\n        });\n    },\n    _children_backwards(push) {\n        let i = this.elements.length;\n        while (i--) push(this.elements[i]);\n    },\n});\n\nvar AST_Object = DEFNODE(\"Object\", \"properties\", function AST_Object(props) {\n    if (props) {\n        this.properties = props.properties;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An object literal\",\n    $propdoc: {\n        properties: \"[AST_ObjectProperty*] array of properties\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            var properties = this.properties;\n            for (var i = 0, len = properties.length; i < len; i++) {\n                properties[i]._walk(visitor);\n            }\n        });\n    },\n    _children_backwards(push) {\n        let i = this.properties.length;\n        while (i--) push(this.properties[i]);\n    },\n});\n\nvar AST_ObjectProperty = DEFNODE(\"ObjectProperty\", \"key value\", function AST_ObjectProperty(props) {\n    if (props) {\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for literal object properties\",\n    $propdoc: {\n        key: \"[string|AST_Node] property name. For ObjectKeyVal this is a string. For getters, setters and computed property this is an AST_Node.\",\n        value: \"[AST_Node] property value.  For getters and setters this is an AST_Accessor.\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            if (this.key instanceof AST_Node)\n                this.key._walk(visitor);\n            this.value._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.value);\n        if (this.key instanceof AST_Node) push(this.key);\n    }\n});\n\nvar AST_ObjectKeyVal = DEFNODE(\"ObjectKeyVal\", \"quote\", function AST_ObjectKeyVal(props) {\n    if (props) {\n        this.quote = props.quote;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A key: value object property\",\n    $propdoc: {\n        quote: \"[string] the original quote character\"\n    },\n    computed_key() {\n        return this.key instanceof AST_Node;\n    }\n}, AST_ObjectProperty);\n\nvar AST_PrivateSetter = DEFNODE(\"PrivateSetter\", \"static\", function AST_PrivateSetter(props) {\n    if (props) {\n        this.static = props.static;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $propdoc: {\n        static: \"[boolean] whether this is a static private setter\"\n    },\n    $documentation: \"A private setter property\",\n    computed_key() {\n        return false;\n    }\n}, AST_ObjectProperty);\n\nvar AST_PrivateGetter = DEFNODE(\"PrivateGetter\", \"static\", function AST_PrivateGetter(props) {\n    if (props) {\n        this.static = props.static;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $propdoc: {\n        static: \"[boolean] whether this is a static private getter\"\n    },\n    $documentation: \"A private getter property\",\n    computed_key() {\n        return false;\n    }\n}, AST_ObjectProperty);\n\nvar AST_ObjectSetter = DEFNODE(\"ObjectSetter\", \"quote static\", function AST_ObjectSetter(props) {\n    if (props) {\n        this.quote = props.quote;\n        this.static = props.static;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $propdoc: {\n        quote: \"[string|undefined] the original quote character, if any\",\n        static: \"[boolean] whether this is a static setter (classes only)\"\n    },\n    $documentation: \"An object setter property\",\n    computed_key() {\n        return !(this.key instanceof AST_SymbolMethod);\n    }\n}, AST_ObjectProperty);\n\nvar AST_ObjectGetter = DEFNODE(\"ObjectGetter\", \"quote static\", function AST_ObjectGetter(props) {\n    if (props) {\n        this.quote = props.quote;\n        this.static = props.static;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $propdoc: {\n        quote: \"[string|undefined] the original quote character, if any\",\n        static: \"[boolean] whether this is a static getter (classes only)\"\n    },\n    $documentation: \"An object getter property\",\n    computed_key() {\n        return !(this.key instanceof AST_SymbolMethod);\n    }\n}, AST_ObjectProperty);\n\nvar AST_ConciseMethod = DEFNODE(\n    \"ConciseMethod\",\n    \"quote static is_generator async\",\n    function AST_ConciseMethod(props) {\n        if (props) {\n            this.quote = props.quote;\n            this.static = props.static;\n            this.is_generator = props.is_generator;\n            this.async = props.async;\n            this.key = props.key;\n            this.value = props.value;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $propdoc: {\n            quote: \"[string|undefined] the original quote character, if any\",\n            static: \"[boolean] is this method static (classes only)\",\n            is_generator: \"[boolean] is this a generator method\",\n            async: \"[boolean] is this method async\",\n        },\n        $documentation: \"An ES6 concise method inside an object or class\",\n        computed_key() {\n            return !(this.key instanceof AST_SymbolMethod);\n        }\n    },\n    AST_ObjectProperty\n);\n\nvar AST_PrivateMethod = DEFNODE(\"PrivateMethod\", \"\", function AST_PrivateMethod(props) {\n    if (props) {\n        this.quote = props.quote;\n        this.static = props.static;\n        this.is_generator = props.is_generator;\n        this.async = props.async;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A private class method inside a class\",\n}, AST_ConciseMethod);\n\nvar AST_Class = DEFNODE(\"Class\", \"name extends properties\", function AST_Class(props) {\n    if (props) {\n        this.name = props.name;\n        this.extends = props.extends;\n        this.properties = props.properties;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $propdoc: {\n        name: \"[AST_SymbolClass|AST_SymbolDefClass?] optional class name.\",\n        extends: \"[AST_Node]? optional parent class\",\n        properties: \"[AST_ObjectProperty*] array of properties\"\n    },\n    $documentation: \"An ES6 class\",\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            if (this.name) {\n                this.name._walk(visitor);\n            }\n            if (this.extends) {\n                this.extends._walk(visitor);\n            }\n            this.properties.forEach((prop) => prop._walk(visitor));\n        });\n    },\n    _children_backwards(push) {\n        let i = this.properties.length;\n        while (i--) push(this.properties[i]);\n        if (this.extends) push(this.extends);\n        if (this.name) push(this.name);\n    },\n}, AST_Scope /* TODO a class might have a scope but it's not a scope */);\n\nvar AST_ClassProperty = DEFNODE(\"ClassProperty\", \"static quote\", function AST_ClassProperty(props) {\n    if (props) {\n        this.static = props.static;\n        this.quote = props.quote;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A class property\",\n    $propdoc: {\n        static: \"[boolean] whether this is a static key\",\n        quote: \"[string] which quote is being used\"\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            if (this.key instanceof AST_Node)\n                this.key._walk(visitor);\n            if (this.value instanceof AST_Node)\n                this.value._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        if (this.value instanceof AST_Node) push(this.value);\n        if (this.key instanceof AST_Node) push(this.key);\n    },\n    computed_key() {\n        return !(this.key instanceof AST_SymbolClassProperty);\n    }\n}, AST_ObjectProperty);\n\nvar AST_ClassPrivateProperty = DEFNODE(\"ClassPrivateProperty\", \"\", function AST_ClassPrivateProperty(props) {\n    if (props) {\n        this.static = props.static;\n        this.quote = props.quote;\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A class property for a private property\",\n}, AST_ClassProperty);\n\nvar AST_PrivateIn = DEFNODE(\"PrivateIn\", \"key value\", function AST_PrivateIn(props) {\n    if (props) {\n        this.key = props.key;\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"An `in` binop when the key is private, eg #x in this\",\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            this.key._walk(visitor);\n            this.value._walk(visitor);\n        });\n    },\n    _children_backwards(push) {\n        push(this.value);\n        push(this.key);\n    },\n});\n\nvar AST_DefClass = DEFNODE(\"DefClass\", null, function AST_DefClass(props) {\n    if (props) {\n        this.name = props.name;\n        this.extends = props.extends;\n        this.properties = props.properties;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A class definition\",\n}, AST_Class);\n\nvar AST_ClassStaticBlock = DEFNODE(\"ClassStaticBlock\", \"body block_scope\", function AST_ClassStaticBlock (props) {\n    this.body = props.body;\n    this.block_scope = props.block_scope;\n    this.start = props.start;\n    this.end = props.end;\n}, {\n    $documentation: \"A block containing statements to be executed in the context of the class\",\n    $propdoc: {\n        body: \"[AST_Statement*] an array of statements\",\n    },\n    _walk: function(visitor) {\n        return visitor._visit(this, function() {\n            walk_body(this, visitor);\n        });\n    },\n    _children_backwards(push) {\n        let i = this.body.length;\n        while (i--) push(this.body[i]);\n    },\n    clone: clone_block_scope,\n}, AST_Scope);\n\nvar AST_ClassExpression = DEFNODE(\"ClassExpression\", null, function AST_ClassExpression(props) {\n    if (props) {\n        this.name = props.name;\n        this.extends = props.extends;\n        this.properties = props.properties;\n        this.variables = props.variables;\n        this.uses_with = props.uses_with;\n        this.uses_eval = props.uses_eval;\n        this.parent_scope = props.parent_scope;\n        this.enclosed = props.enclosed;\n        this.cname = props.cname;\n        this.body = props.body;\n        this.block_scope = props.block_scope;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A class expression.\"\n}, AST_Class);\n\nvar AST_Symbol = DEFNODE(\"Symbol\", \"scope name thedef\", function AST_Symbol(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $propdoc: {\n        name: \"[string] name of this symbol\",\n        scope: \"[AST_Scope/S] the current scope (not necessarily the definition scope)\",\n        thedef: \"[SymbolDef/S] the definition of this symbol\"\n    },\n    $documentation: \"Base class for all symbols\"\n});\n\nvar AST_NewTarget = DEFNODE(\"NewTarget\", null, function AST_NewTarget(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A reference to new.target\"\n});\n\nvar AST_SymbolDeclaration = DEFNODE(\"SymbolDeclaration\", \"init\", function AST_SymbolDeclaration(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A declaration symbol (symbol in var/const, function name or argument, symbol in catch)\",\n}, AST_Symbol);\n\nvar AST_SymbolVar = DEFNODE(\"SymbolVar\", null, function AST_SymbolVar(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol defining a variable\",\n}, AST_SymbolDeclaration);\n\nvar AST_SymbolBlockDeclaration = DEFNODE(\n    \"SymbolBlockDeclaration\",\n    null,\n    function AST_SymbolBlockDeclaration(props) {\n        if (props) {\n            this.init = props.init;\n            this.scope = props.scope;\n            this.name = props.name;\n            this.thedef = props.thedef;\n            this.start = props.start;\n            this.end = props.end;\n        }\n\n        this.flags = 0;\n    },\n    {\n        $documentation: \"Base class for block-scoped declaration symbols\"\n    },\n    AST_SymbolDeclaration\n);\n\nvar AST_SymbolConst = DEFNODE(\"SymbolConst\", null, function AST_SymbolConst(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A constant declaration\"\n}, AST_SymbolBlockDeclaration);\n\nvar AST_SymbolLet = DEFNODE(\"SymbolLet\", null, function AST_SymbolLet(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A block-scoped `let` declaration\"\n}, AST_SymbolBlockDeclaration);\n\nvar AST_SymbolFunarg = DEFNODE(\"SymbolFunarg\", null, function AST_SymbolFunarg(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol naming a function argument\",\n}, AST_SymbolVar);\n\nvar AST_SymbolDefun = DEFNODE(\"SymbolDefun\", null, function AST_SymbolDefun(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol defining a function\",\n}, AST_SymbolDeclaration);\n\nvar AST_SymbolMethod = DEFNODE(\"SymbolMethod\", null, function AST_SymbolMethod(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol in an object defining a method\",\n}, AST_Symbol);\n\nvar AST_SymbolClassProperty = DEFNODE(\"SymbolClassProperty\", null, function AST_SymbolClassProperty(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol for a class property\",\n}, AST_Symbol);\n\nvar AST_SymbolLambda = DEFNODE(\"SymbolLambda\", null, function AST_SymbolLambda(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol naming a function expression\",\n}, AST_SymbolDeclaration);\n\nvar AST_SymbolDefClass = DEFNODE(\"SymbolDefClass\", null, function AST_SymbolDefClass(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol naming a class's name in a class declaration. Lexically scoped to its containing scope, and accessible within the class.\"\n}, AST_SymbolBlockDeclaration);\n\nvar AST_SymbolClass = DEFNODE(\"SymbolClass\", null, function AST_SymbolClass(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol naming a class's name. Lexically scoped to the class.\"\n}, AST_SymbolDeclaration);\n\nvar AST_SymbolCatch = DEFNODE(\"SymbolCatch\", null, function AST_SymbolCatch(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol naming the exception in catch\",\n}, AST_SymbolBlockDeclaration);\n\nvar AST_SymbolImport = DEFNODE(\"SymbolImport\", null, function AST_SymbolImport(props) {\n    if (props) {\n        this.init = props.init;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol referring to an imported name\",\n}, AST_SymbolBlockDeclaration);\n\nvar AST_SymbolImportForeign = DEFNODE(\"SymbolImportForeign\", null, function AST_SymbolImportForeign(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.quote = props.quote;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A symbol imported from a module, but it is defined in the other module, and its real name is irrelevant for this module's purposes\",\n}, AST_Symbol);\n\nvar AST_Label = DEFNODE(\"Label\", \"references\", function AST_Label(props) {\n    if (props) {\n        this.references = props.references;\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n        this.initialize();\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol naming a label (declaration)\",\n    $propdoc: {\n        references: \"[AST_LoopControl*] a list of nodes referring to this label\"\n    },\n    initialize: function() {\n        this.references = [];\n        this.thedef = this;\n    }\n}, AST_Symbol);\n\nvar AST_SymbolRef = DEFNODE(\"SymbolRef\", null, function AST_SymbolRef(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Reference to some symbol (not definition/declaration)\",\n}, AST_Symbol);\n\nvar AST_SymbolExport = DEFNODE(\"SymbolExport\", null, function AST_SymbolExport(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.quote = props.quote;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Symbol referring to a name to export\",\n}, AST_SymbolRef);\n\nvar AST_SymbolExportForeign = DEFNODE(\"SymbolExportForeign\", null, function AST_SymbolExportForeign(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.quote = props.quote;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A symbol exported from this module, but it is used in the other module, and its real name is irrelevant for this module's purposes\",\n}, AST_Symbol);\n\nvar AST_LabelRef = DEFNODE(\"LabelRef\", null, function AST_LabelRef(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Reference to a label symbol\",\n}, AST_Symbol);\n\nvar AST_SymbolPrivateProperty = DEFNODE(\"SymbolPrivateProperty\", null, function AST_SymbolPrivateProperty(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A symbol that refers to a private property\",\n}, AST_Symbol);\n\nvar AST_This = DEFNODE(\"This\", null, function AST_This(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `this` symbol\",\n}, AST_Symbol);\n\nvar AST_Super = DEFNODE(\"Super\", null, function AST_Super(props) {\n    if (props) {\n        this.scope = props.scope;\n        this.name = props.name;\n        this.thedef = props.thedef;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `super` symbol\",\n}, AST_This);\n\nvar AST_Constant = DEFNODE(\"Constant\", null, function AST_Constant(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for all constants\",\n    getValue: function() {\n        return this.value;\n    }\n});\n\nvar AST_String = DEFNODE(\"String\", \"value quote\", function AST_String(props) {\n    if (props) {\n        this.value = props.value;\n        this.quote = props.quote;\n        this.start = props.start;\n        this.end = props.end;\n        this._annotations = props._annotations;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A string literal\",\n    $propdoc: {\n        value: \"[string] the contents of this string\",\n        quote: \"[string] the original quote character\"\n    }\n}, AST_Constant);\n\nvar AST_Number = DEFNODE(\"Number\", \"value raw\", function AST_Number(props) {\n    if (props) {\n        this.value = props.value;\n        this.raw = props.raw;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A number literal\",\n    $propdoc: {\n        value: \"[number] the numeric value\",\n        raw: \"[string] numeric value as string\"\n    }\n}, AST_Constant);\n\nvar AST_BigInt = DEFNODE(\"BigInt\", \"value\", function AST_BigInt(props) {\n    if (props) {\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A big int literal\",\n    $propdoc: {\n        value: \"[string] big int value\"\n    }\n}, AST_Constant);\n\nvar AST_RegExp = DEFNODE(\"RegExp\", \"value\", function AST_RegExp(props) {\n    if (props) {\n        this.value = props.value;\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A regexp literal\",\n    $propdoc: {\n        value: \"[RegExp] the actual regexp\",\n    }\n}, AST_Constant);\n\nvar AST_Atom = DEFNODE(\"Atom\", null, function AST_Atom(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for atoms\",\n}, AST_Constant);\n\nvar AST_Null = DEFNODE(\"Null\", null, function AST_Null(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `null` atom\",\n    value: null\n}, AST_Atom);\n\nvar AST_NaN = DEFNODE(\"NaN\", null, function AST_NaN(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The impossible value\",\n    value: 0/0\n}, AST_Atom);\n\nvar AST_Undefined = DEFNODE(\"Undefined\", null, function AST_Undefined(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `undefined` value\",\n    value: (function() {}())\n}, AST_Atom);\n\nvar AST_Hole = DEFNODE(\"Hole\", null, function AST_Hole(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"A hole in an array\",\n    value: (function() {}())\n}, AST_Atom);\n\nvar AST_Infinity = DEFNODE(\"Infinity\", null, function AST_Infinity(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `Infinity` value\",\n    value: 1/0\n}, AST_Atom);\n\nvar AST_Boolean = DEFNODE(\"Boolean\", null, function AST_Boolean(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"Base class for booleans\",\n}, AST_Atom);\n\nvar AST_False = DEFNODE(\"False\", null, function AST_False(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `false` atom\",\n    value: false\n}, AST_Boolean);\n\nvar AST_True = DEFNODE(\"True\", null, function AST_True(props) {\n    if (props) {\n        this.start = props.start;\n        this.end = props.end;\n    }\n\n    this.flags = 0;\n}, {\n    $documentation: \"The `true` atom\",\n    value: true\n}, AST_Boolean);\n\n/* -----[ Walk function ]---- */\n\n/**\n * Walk nodes in depth-first search fashion.\n * Callback can return `walk_abort` symbol to stop iteration.\n * It can also return `true` to stop iteration just for child nodes.\n * Iteration can be stopped and continued by passing the `to_visit` argument,\n * which is given to the callback in the second argument.\n **/\nfunction walk(node, cb, to_visit = [node]) {\n    const push = to_visit.push.bind(to_visit);\n    while (to_visit.length) {\n        const node = to_visit.pop();\n        const ret = cb(node, to_visit);\n\n        if (ret) {\n            if (ret === walk_abort) return true;\n            continue;\n        }\n\n        node._children_backwards(push);\n    }\n    return false;\n}\n\n/**\n * Walks an AST node and its children.\n *\n * {cb} can return `walk_abort` to interrupt the walk.\n *\n * @param node\n * @param cb {(node, info: { parent: (nth) => any }) => (boolean | undefined)}\n *\n * @returns {boolean} whether the walk was aborted\n *\n * @example\n * const found_some_cond = walk_parent(my_ast_node, (node, { parent }) => {\n *   if (some_cond(node, parent())) return walk_abort\n * });\n */\nfunction walk_parent(node, cb, initial_stack) {\n    const to_visit = [node];\n    const push = to_visit.push.bind(to_visit);\n    const stack = initial_stack ? initial_stack.slice() : [];\n    const parent_pop_indices = [];\n\n    let current;\n\n    const info = {\n        parent: (n = 0) => {\n            if (n === -1) {\n                return current;\n            }\n\n            // [ p1 p0 ] [ 1 0 ]\n            if (initial_stack && n >= stack.length) {\n                n -= stack.length;\n                return initial_stack[\n                    initial_stack.length - (n + 1)\n                ];\n            }\n\n            return stack[stack.length - (1 + n)];\n        },\n    };\n\n    while (to_visit.length) {\n        current = to_visit.pop();\n\n        while (\n            parent_pop_indices.length &&\n            to_visit.length == parent_pop_indices[parent_pop_indices.length - 1]\n        ) {\n            stack.pop();\n            parent_pop_indices.pop();\n        }\n\n        const ret = cb(current, info);\n\n        if (ret) {\n            if (ret === walk_abort) return true;\n            continue;\n        }\n\n        const visit_length = to_visit.length;\n\n        current._children_backwards(push);\n\n        // Push only if we're going to traverse the children\n        if (to_visit.length > visit_length) {\n            stack.push(current);\n            parent_pop_indices.push(visit_length - 1);\n        }\n    }\n\n    return false;\n}\n\nconst walk_abort = Symbol(\"abort walk\");\n\n/* -----[ TreeWalker ]----- */\n\nclass TreeWalker {\n    constructor(callback) {\n        this.visit = callback;\n        this.stack = [];\n        this.directives = Object.create(null);\n    }\n\n    _visit(node, descend) {\n        this.push(node);\n        var ret = this.visit(node, descend ? function() {\n            descend.call(node);\n        } : noop);\n        if (!ret && descend) {\n            descend.call(node);\n        }\n        this.pop();\n        return ret;\n    }\n\n    parent(n) {\n        return this.stack[this.stack.length - 2 - (n || 0)];\n    }\n\n    push(node) {\n        if (node instanceof AST_Lambda) {\n            this.directives = Object.create(this.directives);\n        } else if (node instanceof AST_Directive && !this.directives[node.value]) {\n            this.directives[node.value] = node;\n        } else if (node instanceof AST_Class) {\n            this.directives = Object.create(this.directives);\n            if (!this.directives[\"use strict\"]) {\n                this.directives[\"use strict\"] = node;\n            }\n        }\n        this.stack.push(node);\n    }\n\n    pop() {\n        var node = this.stack.pop();\n        if (node instanceof AST_Lambda || node instanceof AST_Class) {\n            this.directives = Object.getPrototypeOf(this.directives);\n        }\n    }\n\n    self() {\n        return this.stack[this.stack.length - 1];\n    }\n\n    find_parent(type) {\n        var stack = this.stack;\n        for (var i = stack.length; --i >= 0;) {\n            var x = stack[i];\n            if (x instanceof type) return x;\n        }\n    }\n\n    find_scope() {\n        var stack = this.stack;\n        for (var i = stack.length; --i >= 0;) {\n            const p = stack[i];\n            if (p instanceof AST_Toplevel) return p;\n            if (p instanceof AST_Lambda) return p;\n            if (p.block_scope) return p.block_scope;\n        }\n    }\n\n    has_directive(type) {\n        var dir = this.directives[type];\n        if (dir) return dir;\n        var node = this.stack[this.stack.length - 1];\n        if (node instanceof AST_Scope && node.body) {\n            for (var i = 0; i < node.body.length; ++i) {\n                var st = node.body[i];\n                if (!(st instanceof AST_Directive)) break;\n                if (st.value == type) return st;\n            }\n        }\n    }\n\n    loopcontrol_target(node) {\n        var stack = this.stack;\n        if (node.label) for (var i = stack.length; --i >= 0;) {\n            var x = stack[i];\n            if (x instanceof AST_LabeledStatement && x.label.name == node.label.name)\n                return x.body;\n        } else for (var i = stack.length; --i >= 0;) {\n            var x = stack[i];\n            if (x instanceof AST_IterationStatement\n                || node instanceof AST_Break && x instanceof AST_Switch)\n                return x;\n        }\n    }\n}\n\n// Tree transformer helpers.\nclass TreeTransformer extends TreeWalker {\n    constructor(before, after) {\n        super();\n        this.before = before;\n        this.after = after;\n    }\n}\n\nconst _PURE     = 0b00000001;\nconst _INLINE   = 0b00000010;\nconst _NOINLINE = 0b00000100;\nconst _KEY      = 0b00001000;\n\nexport {\n    AST_Accessor,\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_Atom,\n    AST_Await,\n    AST_BigInt,\n    AST_Binary,\n    AST_Block,\n    AST_BlockStatement,\n    AST_Boolean,\n    AST_Break,\n    AST_Call,\n    AST_Case,\n    AST_Catch,\n    AST_Chain,\n    AST_Class,\n    AST_ClassExpression,\n    AST_ClassPrivateProperty,\n    AST_PrivateIn,\n    AST_ClassProperty,\n    AST_ClassStaticBlock,\n    AST_ConciseMethod,\n    AST_Conditional,\n    AST_Const,\n    AST_Constant,\n    AST_Continue,\n    AST_Debugger,\n    AST_Default,\n    AST_DefaultAssign,\n    AST_DefClass,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DotHash,\n    AST_DWLoop,\n    AST_EmptyStatement,\n    AST_Exit,\n    AST_Expansion,\n    AST_Export,\n    AST_False,\n    AST_Finally,\n    AST_For,\n    AST_ForIn,\n    AST_ForOf,\n    AST_Function,\n    AST_Hole,\n    AST_If,\n    AST_Import,\n    AST_ImportMeta,\n    AST_Infinity,\n    AST_IterationStatement,\n    AST_Jump,\n    AST_Label,\n    AST_LabeledStatement,\n    AST_LabelRef,\n    AST_Lambda,\n    AST_Let,\n    AST_LoopControl,\n    AST_NameMapping,\n    AST_NaN,\n    AST_New,\n    AST_NewTarget,\n    AST_Node,\n    AST_Null,\n    AST_Number,\n    AST_Object,\n    AST_ObjectGetter,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_ObjectSetter,\n    AST_PrefixedTemplateString,\n    AST_PrivateGetter,\n    AST_PrivateMethod,\n    AST_PrivateSetter,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Return,\n    AST_Scope,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Statement,\n    AST_StatementWithBody,\n    AST_String,\n    AST_Sub,\n    AST_Super,\n    AST_Switch,\n    AST_SwitchBranch,\n    AST_Symbol,\n    AST_SymbolBlockDeclaration,\n    AST_SymbolCatch,\n    AST_SymbolClass,\n    AST_SymbolClassProperty,\n    AST_SymbolConst,\n    AST_SymbolDeclaration,\n    AST_SymbolDefClass,\n    AST_SymbolDefun,\n    AST_SymbolExport,\n    AST_SymbolExportForeign,\n    AST_SymbolFunarg,\n    AST_SymbolImport,\n    AST_SymbolImportForeign,\n    AST_SymbolLambda,\n    AST_SymbolLet,\n    AST_SymbolMethod,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_SymbolPrivateProperty,\n    AST_This,\n    AST_Throw,\n    AST_Token,\n    AST_Toplevel,\n    AST_True,\n    AST_Try,\n    AST_TryBlock,\n    AST_Unary,\n    AST_UnaryPostfix,\n    AST_UnaryPrefix,\n    AST_Undefined,\n    AST_Var,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n\n    // Walkers\n    TreeTransformer,\n    TreeWalker,\n    walk,\n    walk_abort,\n    walk_body,\n    walk_parent,\n\n    // annotations\n    _INLINE,\n    _NOINLINE,\n    _PURE,\n    _KEY,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/cli.js",
    "content": "import { minify, _default_options } from \"../main.js\";\nimport { parse } from \"./parse.js\";\nimport {\n    AST_Assign,\n    AST_Array,\n    AST_Constant,\n    AST_Node,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Sequence,\n    AST_Symbol,\n    AST_Token,\n    walk\n} from \"./ast.js\";\nimport { OutputStream } from \"./output.js\";\n\nexport async function run_cli({ program, packageJson, fs, path }) {\n    const skip_keys = new Set([ \"cname\", \"parent_scope\", \"scope\", \"uses_eval\", \"uses_with\" ]);\n    var files = {};\n    var options = {\n        compress: false,\n        mangle: false\n    };\n    const default_options = await _default_options();\n    program.version(packageJson.name + \" \" + packageJson.version);\n    program.parseArgv = program.parse;\n    program.parse = undefined;\n\n    if (process.argv.includes(\"ast\")) program.helpInformation = describe_ast;\n    else if (process.argv.includes(\"options\")) program.helpInformation = function() {\n        var text = [];\n        for (var option in default_options) {\n            text.push(\"--\" + (option === \"sourceMap\" ? \"source-map\" : option) + \" options:\");\n            text.push(format_object(default_options[option]));\n            text.push(\"\");\n        }\n        return text.join(\"\\n\");\n    };\n\n    program.option(\"-p, --parse <options>\", \"Specify parser options.\", parse_js());\n    program.option(\"-c, --compress [options]\", \"Enable compressor/specify compressor options.\", parse_js());\n    program.option(\"-m, --mangle [options]\", \"Mangle names/specify mangler options.\", parse_js());\n    program.option(\"--mangle-props [options]\", \"Mangle properties/specify mangler options.\", parse_js());\n    program.option(\"-f, --format [options]\", \"Format options.\", parse_js());\n    program.option(\"-b, --beautify [options]\", \"Alias for --format.\", parse_js());\n    program.option(\"-o, --output <file>\", \"Output file (default STDOUT).\");\n    program.option(\"--comments [filter]\", \"Preserve copyright comments in the output.\");\n    program.option(\"--config-file <file>\", \"Read minify() options from JSON file.\");\n    program.option(\"-d, --define <expr>[=value]\", \"Global definitions.\", parse_js(\"define\"));\n    program.option(\"--ecma <version>\", \"Specify ECMAScript release: 5, 2015, 2016 or 2017...\");\n    program.option(\"-e, --enclose [arg[,...][:value[,...]]]\", \"Embed output in a big function with configurable arguments and values.\");\n    program.option(\"--ie8\", \"Support non-standard Internet Explorer 8.\");\n    program.option(\"--keep-classnames\", \"Do not mangle/drop class names.\");\n    program.option(\"--keep-fnames\", \"Do not mangle/drop function names. Useful for code relying on Function.prototype.name.\");\n    program.option(\"--module\", \"Input is an ES6 module\");\n    program.option(\"--name-cache <file>\", \"File to hold mangled name mappings.\");\n    program.option(\"--rename\", \"Force symbol expansion.\");\n    program.option(\"--no-rename\", \"Disable symbol expansion.\");\n    program.option(\"--safari10\", \"Support non-standard Safari 10.\");\n    program.option(\"--source-map [options]\", \"Enable source map/specify source map options.\", parse_js());\n    program.option(\"--timings\", \"Display operations run time on STDERR.\");\n    program.option(\"--toplevel\", \"Compress and/or mangle variables in toplevel scope.\");\n    program.option(\"--wrap <name>\", \"Embed everything as a function with “exports” corresponding to “name” globally.\");\n    program.arguments(\"[files...]\").parseArgv(process.argv);\n    if (program.configFile) {\n        options = JSON.parse(read_file(program.configFile));\n    }\n    if (!program.output && program.sourceMap && program.sourceMap.url != \"inline\") {\n        fatal(\"ERROR: cannot write source map to STDOUT\");\n    }\n\n    [\n        \"compress\",\n        \"enclose\",\n        \"ie8\",\n        \"mangle\",\n        \"module\",\n        \"safari10\",\n        \"sourceMap\",\n        \"toplevel\",\n        \"wrap\"\n    ].forEach(function(name) {\n        if (name in program) {\n            options[name] = program[name];\n        }\n    });\n\n    if (\"ecma\" in program) {\n        if (program.ecma != (program.ecma | 0)) fatal(\"ERROR: ecma must be an integer\");\n        const ecma = program.ecma | 0;\n        if (ecma > 5 && ecma < 2015)\n            options.ecma = ecma + 2009;\n        else\n            options.ecma = ecma;\n    }\n    if (program.format || program.beautify) {\n        const chosenOption = program.format || program.beautify;\n        options.format = typeof chosenOption === \"object\" ? chosenOption : {};\n    }\n    if (program.comments) {\n        if (typeof options.format != \"object\") options.format = {};\n        options.format.comments = typeof program.comments == \"string\" ? (program.comments == \"false\" ? false : program.comments) : \"some\";\n    }\n    if (program.define) {\n        if (typeof options.compress != \"object\") options.compress = {};\n        if (typeof options.compress.global_defs != \"object\") options.compress.global_defs = {};\n        for (var expr in program.define) {\n            options.compress.global_defs[expr] = program.define[expr];\n        }\n    }\n    if (program.keepClassnames) {\n        options.keep_classnames = true;\n    }\n    if (program.keepFnames) {\n        options.keep_fnames = true;\n    }\n    if (program.mangleProps) {\n        if (program.mangleProps.domprops) {\n            delete program.mangleProps.domprops;\n        } else {\n            if (typeof program.mangleProps != \"object\") program.mangleProps = {};\n            if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];\n        }\n        if (typeof options.mangle != \"object\") options.mangle = {};\n        options.mangle.properties = program.mangleProps;\n    }\n    if (program.nameCache) {\n        options.nameCache = JSON.parse(read_file(program.nameCache, \"{}\"));\n    }\n    if (program.output == \"ast\") {\n        options.format = {\n            ast: true,\n            code: false\n        };\n    }\n    if (program.parse) {\n        if (!program.parse.acorn && !program.parse.spidermonkey) {\n            options.parse = program.parse;\n        } else if (program.sourceMap && program.sourceMap.content == \"inline\") {\n            fatal(\"ERROR: inline source map only works with built-in parser\");\n        }\n    }\n    if (~program.rawArgs.indexOf(\"--rename\")) {\n        options.rename = true;\n    } else if (!program.rename) {\n        options.rename = false;\n    }\n\n    let convert_path = name => name;\n    if (typeof program.sourceMap == \"object\" && \"base\" in program.sourceMap) {\n        convert_path = function() {\n            var base = program.sourceMap.base;\n            delete options.sourceMap.base;\n            return function(name) {\n                return path.relative(base, name);\n            };\n        }();\n    }\n\n    let filesList;\n    if (options.files && options.files.length) {\n        filesList = options.files;\n\n        delete options.files;\n    } else if (program.args.length) {\n        filesList = program.args;\n    }\n\n    if (filesList) {\n        simple_glob(filesList).forEach(function(name) {\n            files[convert_path(name)] = read_file(name);\n        });\n    } else {\n        await new Promise((resolve) => {\n            var chunks = [];\n            process.stdin.setEncoding(\"utf8\");\n            process.stdin.on(\"data\", function(chunk) {\n                chunks.push(chunk);\n            }).on(\"end\", function() {\n                files = [ chunks.join(\"\") ];\n                resolve();\n            });\n            process.stdin.resume();\n        });\n    }\n\n    await run_cli();\n\n    function convert_ast(fn) {\n        return AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null));\n    }\n\n    async function run_cli() {\n        var content = program.sourceMap && program.sourceMap.content;\n        if (content && content !== \"inline\") {\n            options.sourceMap.content = read_file(content, content);\n        }\n        if (program.timings) options.timings = true;\n\n        try {\n            if (program.parse) {\n                if (program.parse.acorn) {\n                    files = convert_ast(function(toplevel, name) {\n                        return require(\"acorn\").parse(files[name], {\n                            ecmaVersion: 2018,\n                            locations: true,\n                            program: toplevel,\n                            sourceFile: name,\n                            sourceType: options.module || program.parse.module ? \"module\" : \"script\"\n                        });\n                    });\n                } else if (program.parse.spidermonkey) {\n                    files = convert_ast(function(toplevel, name) {\n                        var obj = JSON.parse(files[name]);\n                        if (!toplevel) return obj;\n                        toplevel.body = toplevel.body.concat(obj.body);\n                        return toplevel;\n                    });\n                }\n            }\n        } catch (ex) {\n            fatal(ex);\n        }\n\n        let result;\n        try {\n            result = await minify(files, options, fs);\n        } catch (ex) {\n            if (ex.name == \"SyntaxError\") {\n                print_error(\"Parse error at \" + ex.filename + \":\" + ex.line + \",\" + ex.col);\n                var col = ex.col;\n                var lines = files[ex.filename].split(/\\r?\\n/);\n                var line = lines[ex.line - 1];\n                if (!line && !col) {\n                    line = lines[ex.line - 2];\n                    col = line.length;\n                }\n                if (line) {\n                    var limit = 70;\n                    if (col > limit) {\n                        line = line.slice(col - limit);\n                        col = limit;\n                    }\n                    print_error(line.slice(0, 80));\n                    print_error(line.slice(0, col).replace(/\\S/g, \" \") + \"^\");\n                }\n            }\n            if (ex.defs) {\n                print_error(\"Supported options:\");\n                print_error(format_object(ex.defs));\n            }\n            fatal(ex);\n            return;\n        }\n\n        if (program.output == \"ast\") {\n            if (!options.compress && !options.mangle) {\n                result.ast.figure_out_scope({});\n            }\n            console.log(JSON.stringify(result.ast, function(key, value) {\n                if (value) switch (key) {\n                  case \"thedef\":\n                    return symdef(value);\n                  case \"enclosed\":\n                    return value.length ? value.map(symdef) : undefined;\n                  case \"variables\":\n                  case \"globals\":\n                    return value.size ? collect_from_map(value, symdef) : undefined;\n                }\n                if (skip_keys.has(key)) return;\n                if (value instanceof AST_Token) return;\n                if (value instanceof Map) return;\n                if (value instanceof AST_Node) {\n                    var result = {\n                        _class: \"AST_\" + value.TYPE\n                    };\n                    if (value.block_scope) {\n                        result.variables = value.block_scope.variables;\n                        result.enclosed = value.block_scope.enclosed;\n                    }\n                    value.CTOR.PROPS.forEach(function(prop) {\n                        if (prop !== \"block_scope\") {\n                            result[prop] = value[prop];\n                        }\n                    });\n                    return result;\n                }\n                return value;\n            }, 2));\n        } else if (program.output == \"spidermonkey\") {\n            try {\n                const minified = await minify(\n                    result.code,\n                    {\n                        compress: false,\n                        mangle: false,\n                        format: {\n                            ast: true,\n                            code: false\n                        }\n                    },\n                    fs\n                );\n                console.log(JSON.stringify(minified.ast.to_mozilla_ast(), null, 2));\n            } catch (ex) {\n                fatal(ex);\n                return;\n            }\n        } else if (program.output) {\n            fs.writeFileSync(program.output, result.code);\n            if (options.sourceMap && options.sourceMap.url !== \"inline\" && result.map) {\n                fs.writeFileSync(program.output + \".map\", result.map);\n            }\n        } else {\n            console.log(result.code);\n        }\n        if (program.nameCache) {\n            fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache));\n        }\n        if (result.timings) for (var phase in result.timings) {\n            print_error(\"- \" + phase + \": \" + result.timings[phase].toFixed(3) + \"s\");\n        }\n    }\n\n    function fatal(message) {\n        if (message instanceof Error) message = message.stack.replace(/^\\S*?Error:/, \"ERROR:\");\n        print_error(message);\n        process.exit(1);\n    }\n\n    // A file glob function that only supports \"*\" and \"?\" wildcards in the basename.\n    // Example: \"foo/bar/*baz??.*.js\"\n    // Argument `glob` may be a string or an array of strings.\n    // Returns an array of strings. Garbage in, garbage out.\n    function simple_glob(glob) {\n        if (Array.isArray(glob)) {\n            return [].concat.apply([], glob.map(simple_glob));\n        }\n        if (glob && glob.match(/[*?]/)) {\n            var dir = path.dirname(glob);\n            try {\n                var entries = fs.readdirSync(dir);\n            } catch (ex) {}\n            if (entries) {\n                var pattern = \"^\" + path.basename(glob)\n                    .replace(/[.+^$[\\]\\\\(){}]/g, \"\\\\$&\")\n                    .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n                    .replace(/\\?/g, \"[^/\\\\\\\\]\") + \"$\";\n                var mod = process.platform === \"win32\" ? \"i\" : \"\";\n                var rx = new RegExp(pattern, mod);\n                var results = entries.filter(function(name) {\n                    return rx.test(name);\n                }).map(function(name) {\n                    return path.join(dir, name);\n                });\n                if (results.length) return results;\n            }\n        }\n        return [ glob ];\n    }\n\n    function read_file(path, default_value) {\n        try {\n            return fs.readFileSync(path, \"utf8\");\n        } catch (ex) {\n            if ((ex.code == \"ENOENT\" || ex.code == \"ENAMETOOLONG\") && default_value != null) return default_value;\n            fatal(ex);\n        }\n    }\n\n    function parse_js(flag) {\n        return function(value, options) {\n            options = options || {};\n            try {\n                walk(parse(value, { expression: true }), node => {\n                    if (node instanceof AST_Assign) {\n                        var name = node.left.print_to_string();\n                        var value = node.right;\n                        if (flag) {\n                            options[name] = value;\n                        } else if (value instanceof AST_Array) {\n                            options[name] = value.elements.map(to_string);\n                        } else if (value instanceof AST_RegExp) {\n                            value = value.value;\n                            options[name] = new RegExp(value.source, value.flags);\n                        } else {\n                            options[name] = to_string(value);\n                        }\n                        return true;\n                    }\n                    if (node instanceof AST_Symbol || node instanceof AST_PropAccess) {\n                        var name = node.print_to_string();\n                        options[name] = true;\n                        return true;\n                    }\n                    if (!(node instanceof AST_Sequence)) throw node;\n\n                    function to_string(value) {\n                        return value instanceof AST_Constant ? value.getValue() : value.print_to_string({\n                            quote_keys: true\n                        });\n                    }\n                });\n            } catch(ex) {\n                if (flag) {\n                    fatal(\"Error parsing arguments for '\" + flag + \"': \" + value);\n                } else {\n                    options[value] = null;\n                }\n            }\n            return options;\n        };\n    }\n\n    function symdef(def) {\n        var ret = (1e6 + def.id) + \" \" + def.name;\n        if (def.mangled_name) ret += \" \" + def.mangled_name;\n        return ret;\n    }\n\n    function collect_from_map(map, callback) {\n        var result = [];\n        map.forEach(function (def) {\n            result.push(callback(def));\n        });\n        return result;\n    }\n\n    function format_object(obj) {\n        var lines = [];\n        var padding = \"\";\n        Object.keys(obj).map(function(name) {\n            if (padding.length < name.length) padding = Array(name.length + 1).join(\" \");\n            return [ name, JSON.stringify(obj[name]) ];\n        }).forEach(function(tokens) {\n            lines.push(\"  \" + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);\n        });\n        return lines.join(\"\\n\");\n    }\n\n    function print_error(msg) {\n        process.stderr.write(msg);\n        process.stderr.write(\"\\n\");\n    }\n\n    function describe_ast() {\n        var out = OutputStream({ beautify: true });\n        function doitem(ctor) {\n            out.print(\"AST_\" + ctor.TYPE);\n            const props = ctor.SELF_PROPS.filter(prop => !/^\\$/.test(prop));\n\n            if (props.length > 0) {\n                out.space();\n                out.with_parens(function() {\n                    props.forEach(function(prop, i) {\n                        if (i) out.space();\n                        out.print(prop);\n                    });\n                });\n            }\n\n            if (ctor.documentation) {\n                out.space();\n                out.print_string(ctor.documentation);\n            }\n\n            if (ctor.SUBCLASSES.length > 0) {\n                out.space();\n                out.with_block(function() {\n                    ctor.SUBCLASSES.forEach(function(ctor) {\n                        out.indent();\n                        doitem(ctor);\n                        out.newline();\n                    });\n                });\n            }\n        }\n        doitem(AST_Node);\n        return out + \"\\n\";\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/common.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Array,\n    AST_Arrow,\n    AST_BlockStatement,\n    AST_Call,\n    AST_Chain,\n    AST_Class,\n    AST_Const,\n    AST_Constant,\n    AST_DefClass,\n    AST_Defun,\n    AST_EmptyStatement,\n    AST_Export,\n    AST_False,\n    AST_Function,\n    AST_Import,\n    AST_Infinity,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_Let,\n    AST_LoopControl,\n    AST_NaN,\n    AST_Node,\n    AST_Null,\n    AST_Number,\n    AST_Object,\n    AST_ObjectKeyVal,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Scope,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Statement,\n    AST_String,\n    AST_SymbolRef,\n    AST_True,\n    AST_UnaryPrefix,\n    AST_Undefined,\n\n    TreeWalker,\n    walk,\n    walk_abort,\n    walk_parent,\n} from \"../ast.js\";\nimport { make_node, regexp_source_fix, string_template, makePredicate } from \"../utils/index.js\";\nimport { first_in_statement } from \"../utils/first_in_statement.js\";\nimport { has_flag, TOP } from \"./compressor-flags.js\";\n\nexport function merge_sequence(array, node) {\n    if (node instanceof AST_Sequence) {\n        array.push(...node.expressions);\n    } else {\n        array.push(node);\n    }\n    return array;\n}\n\nexport function make_sequence(orig, expressions) {\n    if (expressions.length == 1) return expressions[0];\n    if (expressions.length == 0) throw new Error(\"trying to create a sequence with length zero!\");\n    return make_node(AST_Sequence, orig, {\n        expressions: expressions.reduce(merge_sequence, [])\n    });\n}\n\nexport function make_node_from_constant(val, orig) {\n    switch (typeof val) {\n      case \"string\":\n        return make_node(AST_String, orig, {\n            value: val\n        });\n      case \"number\":\n        if (isNaN(val)) return make_node(AST_NaN, orig);\n        if (isFinite(val)) {\n            return 1 / val < 0 ? make_node(AST_UnaryPrefix, orig, {\n                operator: \"-\",\n                expression: make_node(AST_Number, orig, { value: -val })\n            }) : make_node(AST_Number, orig, { value: val });\n        }\n        return val < 0 ? make_node(AST_UnaryPrefix, orig, {\n            operator: \"-\",\n            expression: make_node(AST_Infinity, orig)\n        }) : make_node(AST_Infinity, orig);\n      case \"boolean\":\n        return make_node(val ? AST_True : AST_False, orig);\n      case \"undefined\":\n        return make_node(AST_Undefined, orig);\n      default:\n        if (val === null) {\n            return make_node(AST_Null, orig, { value: null });\n        }\n        if (val instanceof RegExp) {\n            return make_node(AST_RegExp, orig, {\n                value: {\n                    source: regexp_source_fix(val.source),\n                    flags: val.flags\n                }\n            });\n        }\n        throw new Error(string_template(\"Can't handle constant of type: {type}\", {\n            type: typeof val\n        }));\n    }\n}\n\nexport function best_of_expression(ast1, ast2) {\n    return ast1.size() > ast2.size() ? ast2 : ast1;\n}\n\nexport function best_of_statement(ast1, ast2) {\n    return best_of_expression(\n        make_node(AST_SimpleStatement, ast1, {\n            body: ast1\n        }),\n        make_node(AST_SimpleStatement, ast2, {\n            body: ast2\n        })\n    ).body;\n}\n\n/** Find which node is smaller, and return that */\nexport function best_of(compressor, ast1, ast2) {\n    if (first_in_statement(compressor)) {\n        return best_of_statement(ast1, ast2);\n    } else {\n        return best_of_expression(ast1, ast2);\n    }\n}\n\n/** Simplify an object property's key, if possible */\nexport function get_simple_key(key) {\n    if (key instanceof AST_Constant) {\n        return key.getValue();\n    }\n    if (key instanceof AST_UnaryPrefix\n        && key.operator == \"void\"\n        && key.expression instanceof AST_Constant) {\n        return;\n    }\n    return key;\n}\n\nexport function read_property(obj, key) {\n    key = get_simple_key(key);\n    if (key instanceof AST_Node) return;\n\n    var value;\n    if (obj instanceof AST_Array) {\n        var elements = obj.elements;\n        if (key == \"length\") return make_node_from_constant(elements.length, obj);\n        if (typeof key == \"number\" && key in elements) value = elements[key];\n    } else if (obj instanceof AST_Object) {\n        key = \"\" + key;\n        var props = obj.properties;\n        for (var i = props.length; --i >= 0;) {\n            var prop = props[i];\n            if (!(prop instanceof AST_ObjectKeyVal)) return;\n            if (!value && props[i].key === key) value = props[i].value;\n        }\n    }\n\n    return value instanceof AST_SymbolRef && value.fixed_value() || value;\n}\n\nexport function has_break_or_continue(loop, parent) {\n    var found = false;\n    var tw = new TreeWalker(function(node) {\n        if (found || node instanceof AST_Scope) return true;\n        if (node instanceof AST_LoopControl && tw.loopcontrol_target(node) === loop) {\n            return found = true;\n        }\n    });\n    if (parent instanceof AST_LabeledStatement) tw.push(parent);\n    tw.push(loop);\n    loop.body.walk(tw);\n    return found;\n}\n\n// we shouldn't compress (1,func)(something) to\n// func(something) because that changes the meaning of\n// the func (becomes lexical instead of global).\nexport function maintain_this_binding(parent, orig, val) {\n    if (\n        parent instanceof AST_UnaryPrefix && parent.operator == \"delete\"\n        || parent instanceof AST_Call && parent.expression === orig\n            && (\n                val instanceof AST_Chain\n                || val instanceof AST_PropAccess\n                || val instanceof AST_SymbolRef && val.name == \"eval\"\n            )\n    ) {\n        const zero = make_node(AST_Number, orig, { value: 0 });\n        return make_sequence(orig, [ zero, val ]);\n    } else {\n        return val;\n    }\n}\n\nexport function is_func_expr(node) {\n    return node instanceof AST_Arrow || node instanceof AST_Function;\n}\n\n/**\n * Used to determine whether the node can benefit from negation.\n * Not the case with arrow functions (you need an extra set of parens). */\nexport function is_iife_call(node) {\n    if (node.TYPE != \"Call\") return false;\n    return node.expression instanceof AST_Function || is_iife_call(node.expression);\n}\n\nexport function is_empty(thing) {\n    if (thing === null) return true;\n    if (thing instanceof AST_EmptyStatement) return true;\n    if (thing instanceof AST_BlockStatement) return thing.body.length == 0;\n    return false;\n}\n\nexport const identifier_atom = makePredicate(\"Infinity NaN undefined\");\nexport function is_identifier_atom(node) {\n    return node instanceof AST_Infinity\n        || node instanceof AST_NaN\n        || node instanceof AST_Undefined;\n}\n\n/** Check if this is a SymbolRef node which has one def of a certain AST type */\nexport function is_ref_of(ref, type) {\n    if (!(ref instanceof AST_SymbolRef)) return false;\n    var orig = ref.definition().orig;\n    for (var i = orig.length; --i >= 0;) {\n        if (orig[i] instanceof type) return true;\n    }\n}\n\n/**Can we turn { block contents... } into just the block contents ?\n * Not if one of these is inside.\n **/\nexport function can_be_evicted_from_block(node) {\n    return !(\n        node instanceof AST_DefClass ||\n        node instanceof AST_Defun ||\n        node instanceof AST_Let ||\n        node instanceof AST_Const ||\n        node instanceof AST_Export ||\n        node instanceof AST_Import\n    );\n}\n\nexport function as_statement_array(thing) {\n    if (thing === null) return [];\n    if (thing instanceof AST_BlockStatement) return thing.body;\n    if (thing instanceof AST_EmptyStatement) return [];\n    if (thing instanceof AST_Statement) return [ thing ];\n    throw new Error(\"Can't convert thing to statement array\");\n}\n\nexport function is_reachable(scope_node, defs) {\n    const find_ref = node => {\n        if (node instanceof AST_SymbolRef && defs.includes(node.definition())) {\n            return walk_abort;\n        }\n    };\n\n    return walk_parent(scope_node, (node, info) => {\n        if (node instanceof AST_Scope && node !== scope_node) {\n            var parent = info.parent();\n\n            if (\n                parent instanceof AST_Call\n                && parent.expression === node\n                // Async/Generators aren't guaranteed to sync evaluate all of\n                // their body steps, so it's possible they close over the variable.\n                && !(node.async || node.is_generator)\n            ) {\n                return;\n            }\n\n            if (walk(node, find_ref)) return walk_abort;\n\n            return true;\n        }\n    });\n}\n\n/** Check if a ref refers to the name of a function/class it's defined within */\nexport function is_recursive_ref(compressor, def) {\n    var node;\n    for (var i = 0; node = compressor.parent(i); i++) {\n        if (node instanceof AST_Lambda || node instanceof AST_Class) {\n            var name = node.name;\n            if (name && name.definition() === def) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\n// TODO this only works with AST_Defun, shouldn't it work for other ways of defining functions?\nexport function retain_top_func(fn, compressor) {\n    return compressor.top_retain\n        && fn instanceof AST_Defun\n        && has_flag(fn, TOP)\n        && fn.name\n        && compressor.top_retain(fn.name);\n}\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/compressor-flags.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n// bitfield flags to be stored in node.flags.\n// These are set and unset during compression, and store information in the node without requiring multiple fields.\nexport const UNUSED = 0b00000001;\nexport const TRUTHY = 0b00000010;\nexport const FALSY = 0b00000100;\nexport const UNDEFINED = 0b00001000;\nexport const INLINED = 0b00010000;\n\n// Nodes to which values are ever written. Used when keep_assign is part of the unused option string.\nexport const WRITE_ONLY = 0b00100000;\n\n// information specific to a single compression pass\nexport const SQUEEZED = 0b0000000100000000;\nexport const OPTIMIZED = 0b0000001000000000;\nexport const TOP = 0b0000010000000000;\nexport const CLEAR_BETWEEN_PASSES = SQUEEZED | OPTIMIZED | TOP;\n\nexport const has_flag = (node, flag) => node.flags & flag;\nexport const set_flag = (node, flag) => { node.flags |= flag; };\nexport const clear_flag = (node, flag) => { node.flags &= ~flag; };\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/drop-side-effect-free.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Accessor,\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_Binary,\n    AST_Call,\n    AST_Chain,\n    AST_Class,\n    AST_ClassStaticBlock,\n    AST_ClassProperty,\n    AST_ConciseMethod,\n    AST_Conditional,\n    AST_Constant,\n    AST_Dot,\n    AST_Expansion,\n    AST_Function,\n    AST_Node,\n    AST_Number,\n    AST_Object,\n    AST_ObjectGetter,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_ObjectSetter,\n    AST_PropAccess,\n    AST_Scope,\n    AST_Sequence,\n    AST_Sub,\n    AST_SymbolRef,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_This,\n    AST_Unary,\n} from \"../ast.js\";\nimport { make_node, return_null, return_this } from \"../utils/index.js\";\nimport { first_in_statement } from \"../utils/first_in_statement.js\";\n\nimport { pure_prop_access_globals } from \"./native-objects.js\";\nimport { lazy_op, unary_side_effects, is_nullish_shortcircuited } from \"./inference.js\";\nimport { WRITE_ONLY, set_flag, clear_flag } from \"./compressor-flags.js\";\nimport { make_sequence, is_func_expr, is_iife_call } from \"./common.js\";\n\n// AST_Node#drop_side_effect_free() gets called when we don't care about the value,\n// only about side effects. We'll be defining this method for each node type in this module\n//\n// Examples:\n// foo++ -> foo++\n// 1 + func() -> func()\n// 10 -> (nothing)\n// knownPureFunc(foo++) -> foo++\n\nfunction def_drop_side_effect_free(node, func) {\n    node.DEFMETHOD(\"drop_side_effect_free\", func);\n}\n\n// Drop side-effect-free elements from an array of expressions.\n// Returns an array of expressions with side-effects or null\n// if all elements were dropped. Note: original array may be\n// returned if nothing changed.\nfunction trim(nodes, compressor, first_in_statement) {\n    var len = nodes.length;\n    if (!len)  return null;\n\n    var ret = [], changed = false;\n    for (var i = 0; i < len; i++) {\n        var node = nodes[i].drop_side_effect_free(compressor, first_in_statement);\n        changed |= node !== nodes[i];\n        if (node) {\n            ret.push(node);\n            first_in_statement = false;\n        }\n    }\n    return changed ? ret.length ? ret : null : nodes;\n}\n\ndef_drop_side_effect_free(AST_Node, return_this);\ndef_drop_side_effect_free(AST_Constant, return_null);\ndef_drop_side_effect_free(AST_This, return_null);\n\ndef_drop_side_effect_free(AST_Call, function (compressor, first_in_statement) {\n    if (is_nullish_shortcircuited(this, compressor)) {\n        return this.expression.drop_side_effect_free(compressor, first_in_statement);\n    }\n\n    if (!this.is_callee_pure(compressor)) {\n        if (this.expression.is_call_pure(compressor)) {\n            var exprs = this.args.slice();\n            exprs.unshift(this.expression.expression);\n            exprs = trim(exprs, compressor, first_in_statement);\n            return exprs && make_sequence(this, exprs);\n        }\n        if (is_func_expr(this.expression)\n            && (!this.expression.name || !this.expression.name.definition().references.length)) {\n            var node = this.clone();\n            node.expression.process_expression(false, compressor);\n            return node;\n        }\n        return this;\n    }\n\n    var args = trim(this.args, compressor, first_in_statement);\n    return args && make_sequence(this, args);\n});\n\ndef_drop_side_effect_free(AST_Accessor, return_null);\n\ndef_drop_side_effect_free(AST_Function, return_null);\n\ndef_drop_side_effect_free(AST_Arrow, return_null);\n\ndef_drop_side_effect_free(AST_Class, function (compressor) {\n    const with_effects = [];\n    const trimmed_extends = this.extends && this.extends.drop_side_effect_free(compressor);\n    if (trimmed_extends)\n        with_effects.push(trimmed_extends);\n    for (const prop of this.properties) {\n        if (prop instanceof AST_ClassStaticBlock) {\n            if (prop.body.some(stat => stat.has_side_effects(compressor))) {\n                return this;\n            } else {\n                continue;\n            }\n        }\n\n        if (\n            prop instanceof AST_ClassProperty\n            && prop.static\n            && prop.value.has_side_effects(compressor)\n            && prop.contains_this()\n        ) {\n            return this;\n        }\n\n        const trimmed_prop = prop.drop_side_effect_free(compressor);\n        if (trimmed_prop)\n            with_effects.push(trimmed_prop);\n    }\n    if (!with_effects.length)\n        return null;\n    return make_sequence(this, with_effects);\n});\n\ndef_drop_side_effect_free(AST_Binary, function (compressor, first_in_statement) {\n    var right = this.right.drop_side_effect_free(compressor);\n    if (!right)\n        return this.left.drop_side_effect_free(compressor, first_in_statement);\n    if (lazy_op.has(this.operator)) {\n        if (right === this.right)\n            return this;\n        var node = this.clone();\n        node.right = right;\n        return node;\n    } else {\n        var left = this.left.drop_side_effect_free(compressor, first_in_statement);\n        if (!left)\n            return this.right.drop_side_effect_free(compressor, first_in_statement);\n        return make_sequence(this, [left, right]);\n    }\n});\n\ndef_drop_side_effect_free(AST_Assign, function (compressor) {\n    if (this.logical)\n        return this;\n\n    var left = this.left;\n    if (left.has_side_effects(compressor)\n        || compressor.has_directive(\"use strict\")\n        && left instanceof AST_PropAccess\n        && left.expression.is_constant()) {\n        return this;\n    }\n    set_flag(this, WRITE_ONLY);\n    while (left instanceof AST_PropAccess) {\n        left = left.expression;\n    }\n    if (left.is_constant_expression(compressor.find_parent(AST_Scope))) {\n        return this.right.drop_side_effect_free(compressor);\n    }\n    return this;\n});\n\ndef_drop_side_effect_free(AST_Conditional, function (compressor) {\n    var consequent = this.consequent.drop_side_effect_free(compressor);\n    var alternative = this.alternative.drop_side_effect_free(compressor);\n    if (consequent === this.consequent && alternative === this.alternative)\n        return this;\n    if (!consequent)\n        return alternative ? make_node(AST_Binary, this, {\n            operator: \"||\",\n            left: this.condition,\n            right: alternative\n        }) : this.condition.drop_side_effect_free(compressor);\n    if (!alternative)\n        return make_node(AST_Binary, this, {\n            operator: \"&&\",\n            left: this.condition,\n            right: consequent\n        });\n    var node = this.clone();\n    node.consequent = consequent;\n    node.alternative = alternative;\n    return node;\n});\n\ndef_drop_side_effect_free(AST_Unary, function (compressor, first_in_statement) {\n    if (unary_side_effects.has(this.operator)) {\n        if (!this.expression.has_side_effects(compressor)) {\n            set_flag(this, WRITE_ONLY);\n        } else {\n            clear_flag(this, WRITE_ONLY);\n        }\n        return this;\n    }\n    if (this.operator == \"typeof\" && this.expression instanceof AST_SymbolRef)\n        return null;\n    var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);\n    if (first_in_statement && expression && is_iife_call(expression)) {\n        if (expression === this.expression && this.operator == \"!\")\n            return this;\n        return expression.negate(compressor, first_in_statement);\n    }\n    return expression;\n});\n\ndef_drop_side_effect_free(AST_SymbolRef, function (compressor) {\n    const safe_access = this.is_declared(compressor)\n        || pure_prop_access_globals.has(this.name);\n    return safe_access ? null : this;\n});\n\ndef_drop_side_effect_free(AST_Object, function (compressor, first_in_statement) {\n    var values = trim(this.properties, compressor, first_in_statement);\n    return values && make_sequence(this, values);\n});\n\ndef_drop_side_effect_free(AST_ObjectProperty, function (compressor, first_in_statement) {\n    const computed_key = this instanceof AST_ObjectKeyVal && this.key instanceof AST_Node;\n    const key = computed_key && this.key.drop_side_effect_free(compressor, first_in_statement);\n    const value = this.value && this.value.drop_side_effect_free(compressor, first_in_statement);\n    if (key && value) {\n        return make_sequence(this, [key, value]);\n    }\n    return key || value;\n});\n\ndef_drop_side_effect_free(AST_ClassProperty, function (compressor) {\n    const key = this.computed_key() && this.key.drop_side_effect_free(compressor);\n\n    const value = this.static && this.value\n        && this.value.drop_side_effect_free(compressor);\n\n    if (key && value)\n        return make_sequence(this, [key, value]);\n    return key || value || null;\n});\n\ndef_drop_side_effect_free(AST_ConciseMethod, function () {\n    return this.computed_key() ? this.key : null;\n});\n\ndef_drop_side_effect_free(AST_ObjectGetter, function () {\n    return this.computed_key() ? this.key : null;\n});\n\ndef_drop_side_effect_free(AST_ObjectSetter, function () {\n    return this.computed_key() ? this.key : null;\n});\n\ndef_drop_side_effect_free(AST_Array, function (compressor, first_in_statement) {\n    var values = trim(this.elements, compressor, first_in_statement);\n    return values && make_sequence(this, values);\n});\n\ndef_drop_side_effect_free(AST_Dot, function (compressor, first_in_statement) {\n    if (is_nullish_shortcircuited(this, compressor)) {\n        return this.expression.drop_side_effect_free(compressor, first_in_statement);\n    }\n    if (this.expression.may_throw_on_access(compressor)) return this;\n\n    return this.expression.drop_side_effect_free(compressor, first_in_statement);\n});\n\ndef_drop_side_effect_free(AST_Sub, function (compressor, first_in_statement) {\n    if (is_nullish_shortcircuited(this, compressor)) {\n        return this.expression.drop_side_effect_free(compressor, first_in_statement);\n    }\n    if (this.expression.may_throw_on_access(compressor)) return this;\n\n    var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);\n    if (!expression)\n        return this.property.drop_side_effect_free(compressor, first_in_statement);\n    var property = this.property.drop_side_effect_free(compressor);\n    if (!property)\n        return expression;\n    return make_sequence(this, [expression, property]);\n});\n\ndef_drop_side_effect_free(AST_Chain, function (compressor, first_in_statement) {\n    return this.expression.drop_side_effect_free(compressor, first_in_statement);\n});\n\ndef_drop_side_effect_free(AST_Sequence, function (compressor) {\n    var last = this.tail_node();\n    var expr = last.drop_side_effect_free(compressor);\n    if (expr === last)\n        return this;\n    var expressions = this.expressions.slice(0, -1);\n    if (expr)\n        expressions.push(expr);\n    if (!expressions.length) {\n        return make_node(AST_Number, this, { value: 0 });\n    }\n    return make_sequence(this, expressions);\n});\n\ndef_drop_side_effect_free(AST_Expansion, function (compressor, first_in_statement) {\n    return this.expression.drop_side_effect_free(compressor, first_in_statement);\n});\n\ndef_drop_side_effect_free(AST_TemplateSegment, return_null);\n\ndef_drop_side_effect_free(AST_TemplateString, function (compressor) {\n    var values = trim(this.segments, compressor, first_in_statement);\n    return values && make_sequence(this, values);\n});\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/drop-unused.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Accessor,\n    AST_Assign,\n    AST_BlockStatement,\n    AST_Class,\n    AST_ClassExpression,\n    AST_DefaultAssign,\n    AST_DefClass,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_EmptyStatement,\n    AST_Expansion,\n    AST_Export,\n    AST_For,\n    AST_ForIn,\n    AST_Function,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_Number,\n    AST_Scope,\n    AST_SimpleStatement,\n    AST_SymbolBlockDeclaration,\n    AST_SymbolCatch,\n    AST_SymbolDeclaration,\n    AST_SymbolFunarg,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_Toplevel,\n    AST_Unary,\n    AST_Var,\n\n    TreeTransformer,\n    TreeWalker,\n    walk,\n\n    _INLINE,\n    _NOINLINE,\n    _PURE\n} from \"../ast.js\";\nimport {\n    keep_name,\n    make_node,\n    map_add,\n    MAP,\n    remove,\n    return_false,\n} from \"../utils/index.js\";\nimport { SymbolDef } from \"../scope.js\";\n\nimport {\n    WRITE_ONLY,\n    UNUSED,\n\n    has_flag,\n    set_flag,\n} from \"./compressor-flags.js\";\nimport {\n    make_sequence,\n    maintain_this_binding,\n    is_empty,\n    is_ref_of,\n    can_be_evicted_from_block,\n} from \"./common.js\";\n\nconst r_keep_assign = /keep_assign/;\n\n/** Drop unused variables from this scope */\nAST_Scope.DEFMETHOD(\"drop_unused\", function(compressor) {\n    if (!compressor.option(\"unused\")) return;\n    if (compressor.has_directive(\"use asm\")) return;\n    var self = this;\n    if (self.pinned()) return;\n    var drop_funcs = !(self instanceof AST_Toplevel) || compressor.toplevel.funcs;\n    var drop_vars = !(self instanceof AST_Toplevel) || compressor.toplevel.vars;\n    const assign_as_unused = r_keep_assign.test(compressor.option(\"unused\")) ? return_false : function(node) {\n        if (node instanceof AST_Assign\n            && !node.logical\n            && (has_flag(node, WRITE_ONLY) || node.operator == \"=\")\n        ) {\n            return node.left;\n        }\n        if (node instanceof AST_Unary && has_flag(node, WRITE_ONLY)) {\n            return node.expression;\n        }\n    };\n    var in_use_ids = new Map();\n    var fixed_ids = new Map();\n    if (self instanceof AST_Toplevel && compressor.top_retain) {\n        self.variables.forEach(function(def) {\n            if (compressor.top_retain(def) && !in_use_ids.has(def.id)) {\n                in_use_ids.set(def.id, def);\n            }\n        });\n    }\n    var var_defs_by_id = new Map();\n    var initializations = new Map();\n    // pass 1: find out which symbols are directly used in\n    // this scope (not in nested scopes).\n    var scope = this;\n    var tw = new TreeWalker(function(node, descend) {\n        if (node instanceof AST_Lambda && node.uses_arguments && !tw.has_directive(\"use strict\")) {\n            node.argnames.forEach(function(argname) {\n                if (!(argname instanceof AST_SymbolDeclaration)) return;\n                var def = argname.definition();\n                if (!in_use_ids.has(def.id)) {\n                    in_use_ids.set(def.id, def);\n                }\n            });\n        }\n        if (node === self) return;\n        if (node instanceof AST_Defun || node instanceof AST_DefClass) {\n            var node_def = node.name.definition();\n            const in_export = tw.parent() instanceof AST_Export;\n            if (in_export || !drop_funcs && scope === self) {\n                if (node_def.global && !in_use_ids.has(node_def.id)) {\n                    in_use_ids.set(node_def.id, node_def);\n                }\n            }\n            if (node instanceof AST_DefClass) {\n                if (\n                    node.extends\n                    && (node.extends.has_side_effects(compressor)\n                    || node.extends.may_throw(compressor))\n                ) {\n                    node.extends.walk(tw);\n                }\n                for (const prop of node.properties) {\n                    if (\n                        prop.has_side_effects(compressor) ||\n                        prop.may_throw(compressor)\n                    ) {\n                        prop.walk(tw);\n                    }\n                }\n            }\n            map_add(initializations, node_def.id, node);\n            return true; // don't go in nested scopes\n        }\n        if (node instanceof AST_SymbolFunarg && scope === self) {\n            map_add(var_defs_by_id, node.definition().id, node);\n        }\n        if (node instanceof AST_Definitions && scope === self) {\n            const in_export = tw.parent() instanceof AST_Export;\n            node.definitions.forEach(function(def) {\n                if (def.name instanceof AST_SymbolVar) {\n                    map_add(var_defs_by_id, def.name.definition().id, def);\n                }\n                if (in_export || !drop_vars) {\n                    walk(def.name, node => {\n                        if (node instanceof AST_SymbolDeclaration) {\n                            const def = node.definition();\n                            if (def.global && !in_use_ids.has(def.id)) {\n                                in_use_ids.set(def.id, def);\n                            }\n                        }\n                    });\n                }\n                if (def.name instanceof AST_Destructuring) {\n                    def.walk(tw);\n                }\n                if (def.name instanceof AST_SymbolDeclaration && def.value) {\n                    var node_def = def.name.definition();\n                    map_add(initializations, node_def.id, def.value);\n                    if (!node_def.chained && def.name.fixed_value() === def.value) {\n                        fixed_ids.set(node_def.id, def);\n                    }\n                    if (def.value.has_side_effects(compressor)) {\n                        def.value.walk(tw);\n                    }\n                }\n            });\n            return true;\n        }\n        return scan_ref_scoped(node, descend);\n    });\n    self.walk(tw);\n    // pass 2: for every used symbol we need to walk its\n    // initialization code to figure out if it uses other\n    // symbols (that may not be in_use).\n    tw = new TreeWalker(scan_ref_scoped);\n    in_use_ids.forEach(function (def) {\n        var init = initializations.get(def.id);\n        if (init) init.forEach(function(init) {\n            init.walk(tw);\n        });\n    });\n    // pass 3: we should drop declarations not in_use\n    var tt = new TreeTransformer(\n        function before(node, descend, in_list) {\n            var parent = tt.parent();\n            if (drop_vars) {\n                const sym = assign_as_unused(node);\n                if (sym instanceof AST_SymbolRef) {\n                    var def = sym.definition();\n                    var in_use = in_use_ids.has(def.id);\n                    if (node instanceof AST_Assign) {\n                        if (!in_use || fixed_ids.has(def.id) && fixed_ids.get(def.id) !== node) {\n                            return maintain_this_binding(parent, node, node.right.transform(tt));\n                        }\n                    } else if (!in_use) return in_list ? MAP.skip : make_node(AST_Number, node, {\n                        value: 0\n                    });\n                }\n            }\n            if (scope !== self) return;\n            var def;\n            if (node.name\n                && (node instanceof AST_ClassExpression\n                    && !keep_name(compressor.option(\"keep_classnames\"), (def = node.name.definition()).name)\n                || node instanceof AST_Function\n                    && !keep_name(compressor.option(\"keep_fnames\"), (def = node.name.definition()).name))) {\n                // any declarations with same name will overshadow\n                // name of this anonymous function and can therefore\n                // never be used anywhere\n                if (!in_use_ids.has(def.id) || def.orig.length > 1) node.name = null;\n            }\n            if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {\n                var trim = !compressor.option(\"keep_fargs\");\n                for (var a = node.argnames, i = a.length; --i >= 0;) {\n                    var sym = a[i];\n                    if (sym instanceof AST_Expansion) {\n                        sym = sym.expression;\n                    }\n                    if (sym instanceof AST_DefaultAssign) {\n                        sym = sym.left;\n                    }\n                    // Do not drop destructuring arguments.\n                    // They constitute a type assertion of sorts\n                    if (\n                        !(sym instanceof AST_Destructuring)\n                        && !in_use_ids.has(sym.definition().id)\n                    ) {\n                        set_flag(sym, UNUSED);\n                        if (trim) {\n                            a.pop();\n                        }\n                    } else {\n                        trim = false;\n                    }\n                }\n            }\n            if ((node instanceof AST_Defun || node instanceof AST_DefClass) && node !== self) {\n                const def = node.name.definition();\n                const keep = def.global && !drop_funcs || in_use_ids.has(def.id);\n                // Class \"extends\" and static blocks may have side effects\n                const has_side_effects = !keep\n                    && node instanceof AST_Class\n                    && node.has_side_effects(compressor);\n                if (!keep && !has_side_effects) {\n                    def.eliminated++;\n                    return in_list ? MAP.skip : make_node(AST_EmptyStatement, node);\n                }\n            }\n            if (node instanceof AST_Definitions && !(parent instanceof AST_ForIn && parent.init === node)) {\n                var drop_block = !(parent instanceof AST_Toplevel) && !(node instanceof AST_Var);\n                // place uninitialized names at the start\n                var body = [], head = [], tail = [];\n                // for unused names whose initialization has\n                // side effects, we can cascade the init. code\n                // into the next one, or next statement.\n                var side_effects = [];\n                node.definitions.forEach(function(def) {\n                    if (def.value) def.value = def.value.transform(tt);\n                    var is_destructure = def.name instanceof AST_Destructuring;\n                    var sym = is_destructure\n                        ? new SymbolDef(null, { name: \"<destructure>\" }) /* fake SymbolDef */\n                        : def.name.definition();\n                    if (drop_block && sym.global) return tail.push(def);\n                    if (!(drop_vars || drop_block)\n                        || is_destructure\n                            && (def.name.names.length\n                                || def.name.is_array\n                                || compressor.option(\"pure_getters\") != true)\n                        || in_use_ids.has(sym.id)\n                    ) {\n                        if (def.value && fixed_ids.has(sym.id) && fixed_ids.get(sym.id) !== def) {\n                            def.value = def.value.drop_side_effect_free(compressor);\n                        }\n                        if (def.name instanceof AST_SymbolVar) {\n                            var var_defs = var_defs_by_id.get(sym.id);\n                            if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) {\n                                if (def.value) {\n                                    var ref = make_node(AST_SymbolRef, def.name, def.name);\n                                    sym.references.push(ref);\n                                    var assign = make_node(AST_Assign, def, {\n                                        operator: \"=\",\n                                        logical: false,\n                                        left: ref,\n                                        right: def.value\n                                    });\n                                    if (fixed_ids.get(sym.id) === def) {\n                                        fixed_ids.set(sym.id, assign);\n                                    }\n                                    side_effects.push(assign.transform(tt));\n                                }\n                                remove(var_defs, def);\n                                sym.eliminated++;\n                                return;\n                            }\n                        }\n                        if (def.value) {\n                            if (side_effects.length > 0) {\n                                if (tail.length > 0) {\n                                    side_effects.push(def.value);\n                                    def.value = make_sequence(def.value, side_effects);\n                                } else {\n                                    body.push(make_node(AST_SimpleStatement, node, {\n                                        body: make_sequence(node, side_effects)\n                                    }));\n                                }\n                                side_effects = [];\n                            }\n                            tail.push(def);\n                        } else {\n                            head.push(def);\n                        }\n                    } else if (sym.orig[0] instanceof AST_SymbolCatch) {\n                        var value = def.value && def.value.drop_side_effect_free(compressor);\n                        if (value) side_effects.push(value);\n                        def.value = null;\n                        head.push(def);\n                    } else {\n                        var value = def.value && def.value.drop_side_effect_free(compressor);\n                        if (value) {\n                            side_effects.push(value);\n                        }\n                        sym.eliminated++;\n                    }\n                });\n                if (head.length > 0 || tail.length > 0) {\n                    node.definitions = head.concat(tail);\n                    body.push(node);\n                }\n                if (side_effects.length > 0) {\n                    body.push(make_node(AST_SimpleStatement, node, {\n                        body: make_sequence(node, side_effects)\n                    }));\n                }\n                switch (body.length) {\n                  case 0:\n                    return in_list ? MAP.skip : make_node(AST_EmptyStatement, node);\n                  case 1:\n                    return body[0];\n                  default:\n                    return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, {\n                        body: body\n                    });\n                }\n            }\n            // certain combination of unused name + side effect leads to:\n            //    https://github.com/mishoo/UglifyJS2/issues/44\n            //    https://github.com/mishoo/UglifyJS2/issues/1830\n            //    https://github.com/mishoo/UglifyJS2/issues/1838\n            // that's an invalid AST.\n            // We fix it at this stage by moving the `var` outside the `for`.\n            if (node instanceof AST_For) {\n                descend(node, this);\n                var block;\n                if (node.init instanceof AST_BlockStatement) {\n                    block = node.init;\n                    node.init = block.body.pop();\n                    block.body.push(node);\n                }\n                if (node.init instanceof AST_SimpleStatement) {\n                    node.init = node.init.body;\n                } else if (is_empty(node.init)) {\n                    node.init = null;\n                }\n                return !block ? node : in_list ? MAP.splice(block.body) : block;\n            }\n            if (node instanceof AST_LabeledStatement\n                && node.body instanceof AST_For\n            ) {\n                descend(node, this);\n                if (node.body instanceof AST_BlockStatement) {\n                    var block = node.body;\n                    node.body = block.body.pop();\n                    block.body.push(node);\n                    return in_list ? MAP.splice(block.body) : block;\n                }\n                return node;\n            }\n            if (node instanceof AST_BlockStatement) {\n                descend(node, this);\n                if (in_list && node.body.every(can_be_evicted_from_block)) {\n                    return MAP.splice(node.body);\n                }\n                return node;\n            }\n            if (node instanceof AST_Scope) {\n                const save_scope = scope;\n                scope = node;\n                descend(node, this);\n                scope = save_scope;\n                return node;\n            }\n        }\n    );\n\n    self.transform(tt);\n\n    function scan_ref_scoped(node, descend) {\n        var node_def;\n        const sym = assign_as_unused(node);\n        if (sym instanceof AST_SymbolRef\n            && !is_ref_of(node.left, AST_SymbolBlockDeclaration)\n            && self.variables.get(sym.name) === (node_def = sym.definition())\n        ) {\n            if (node instanceof AST_Assign) {\n                node.right.walk(tw);\n                if (!node_def.chained && node.left.fixed_value() === node.right) {\n                    fixed_ids.set(node_def.id, node);\n                }\n            }\n            return true;\n        }\n        if (node instanceof AST_SymbolRef) {\n            node_def = node.definition();\n            if (!in_use_ids.has(node_def.id)) {\n                in_use_ids.set(node_def.id, node_def);\n                if (node_def.orig[0] instanceof AST_SymbolCatch) {\n                    const redef = node_def.scope.is_block_scope()\n                        && node_def.scope.get_defun_scope().variables.get(node_def.name);\n                    if (redef) in_use_ids.set(redef.id, redef);\n                }\n            }\n            return true;\n        }\n        if (node instanceof AST_Scope) {\n            var save_scope = scope;\n            scope = node;\n            descend();\n            scope = save_scope;\n            return true;\n        }\n    }\n});\n\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/evaluate.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    HOP,\n    makePredicate,\n    return_this,\n    string_template,\n    regexp_source_fix,\n    regexp_is_safe,\n} from \"../utils/index.js\";\nimport {\n    AST_Array,\n    AST_BigInt,\n    AST_Binary,\n    AST_Call,\n    AST_Chain,\n    AST_Class,\n    AST_Conditional,\n    AST_Constant,\n    AST_Dot,\n    AST_Expansion,\n    AST_Function,\n    AST_Lambda,\n    AST_New,\n    AST_Node,\n    AST_Object,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Statement,\n    AST_Symbol,\n    AST_SymbolRef,\n    AST_TemplateString,\n    AST_UnaryPrefix,\n    AST_With,\n} from \"../ast.js\";\nimport { is_undeclared_ref} from \"./inference.js\";\nimport { is_pure_native_value, is_pure_native_fn, is_pure_native_method } from \"./native-objects.js\";\n\n// methods to evaluate a constant expression\n\nfunction def_eval(node, func) {\n    node.DEFMETHOD(\"_eval\", func);\n}\n\n// Used to propagate a nullish short-circuit signal upwards through the chain.\nexport const nullish = Symbol(\"This AST_Chain is nullish\");\n\n// If the node has been successfully reduced to a constant,\n// then its value is returned; otherwise the element itself\n// is returned.\n// They can be distinguished as constant value is never a\n// descendant of AST_Node.\nAST_Node.DEFMETHOD(\"evaluate\", function (compressor) {\n    if (!compressor.option(\"evaluate\"))\n        return this;\n    var val = this._eval(compressor, 1);\n    if (!val || val instanceof RegExp)\n        return val;\n    if (typeof val == \"function\" || typeof val == \"object\" || val == nullish)\n        return this;\n\n    // Evaluated strings can be larger than the original expression\n    if (typeof val === \"string\") {\n        const unevaluated_size = this.size(compressor);\n        if (val.length + 2 > unevaluated_size) return this;\n    }\n\n    return val;\n});\n\nvar unaryPrefix = makePredicate(\"! ~ - + void\");\nAST_Node.DEFMETHOD(\"is_constant\", function () {\n    // Accomodate when compress option evaluate=false\n    // as well as the common constant expressions !0 and -1\n    if (this instanceof AST_Constant) {\n        return !(this instanceof AST_RegExp);\n    } else {\n        return this instanceof AST_UnaryPrefix\n            && this.expression instanceof AST_Constant\n            && unaryPrefix.has(this.operator);\n    }\n});\n\ndef_eval(AST_Statement, function () {\n    throw new Error(string_template(\"Cannot evaluate a statement [{file}:{line},{col}]\", this.start));\n});\n\ndef_eval(AST_Lambda, return_this);\ndef_eval(AST_Class, return_this);\ndef_eval(AST_Node, return_this);\ndef_eval(AST_Constant, function () {\n    return this.getValue();\n});\n\ndef_eval(AST_BigInt, return_this);\n\ndef_eval(AST_RegExp, function (compressor) {\n    let evaluated = compressor.evaluated_regexps.get(this.value);\n    if (evaluated === undefined && regexp_is_safe(this.value.source)) {\n        try {\n            const { source, flags } = this.value;\n            evaluated = new RegExp(source, flags);\n        } catch (e) {\n            evaluated = null;\n        }\n        compressor.evaluated_regexps.set(this.value, evaluated);\n    }\n    return evaluated || this;\n});\n\ndef_eval(AST_TemplateString, function () {\n    if (this.segments.length !== 1) return this;\n    return this.segments[0].value;\n});\n\ndef_eval(AST_Function, function (compressor) {\n    if (compressor.option(\"unsafe\")) {\n        var fn = function () { };\n        fn.node = this;\n        fn.toString = () => this.print_to_string();\n        return fn;\n    }\n    return this;\n});\n\ndef_eval(AST_Array, function (compressor, depth) {\n    if (compressor.option(\"unsafe\")) {\n        var elements = [];\n        for (var i = 0, len = this.elements.length; i < len; i++) {\n            var element = this.elements[i];\n            var value = element._eval(compressor, depth);\n            if (element === value)\n                return this;\n            elements.push(value);\n        }\n        return elements;\n    }\n    return this;\n});\n\ndef_eval(AST_Object, function (compressor, depth) {\n    if (compressor.option(\"unsafe\")) {\n        var val = {};\n        for (var i = 0, len = this.properties.length; i < len; i++) {\n            var prop = this.properties[i];\n            if (prop instanceof AST_Expansion)\n                return this;\n            var key = prop.key;\n            if (key instanceof AST_Symbol) {\n                key = key.name;\n            } else if (key instanceof AST_Node) {\n                key = key._eval(compressor, depth);\n                if (key === prop.key)\n                    return this;\n            }\n            if (typeof Object.prototype[key] === \"function\") {\n                return this;\n            }\n            if (prop.value instanceof AST_Function)\n                continue;\n            val[key] = prop.value._eval(compressor, depth);\n            if (val[key] === prop.value)\n                return this;\n        }\n        return val;\n    }\n    return this;\n});\n\nvar non_converting_unary = makePredicate(\"! typeof void\");\ndef_eval(AST_UnaryPrefix, function (compressor, depth) {\n    var e = this.expression;\n    // Function would be evaluated to an array and so typeof would\n    // incorrectly return 'object'. Hence making is a special case.\n    if (compressor.option(\"typeofs\")\n        && this.operator == \"typeof\"\n        && (e instanceof AST_Lambda\n            || e instanceof AST_SymbolRef\n            && e.fixed_value() instanceof AST_Lambda)) {\n        return typeof function () { };\n    }\n    if (!non_converting_unary.has(this.operator))\n        depth++;\n    e = e._eval(compressor, depth);\n    if (e === this.expression)\n        return this;\n    switch (this.operator) {\n        case \"!\": return !e;\n        case \"typeof\":\n            // typeof <RegExp> returns \"object\" or \"function\" on different platforms\n            // so cannot evaluate reliably\n            if (e instanceof RegExp)\n                return this;\n            return typeof e;\n        case \"void\": return void e;\n        case \"~\": return ~e;\n        case \"-\": return -e;\n        case \"+\": return +e;\n    }\n    return this;\n});\n\nvar non_converting_binary = makePredicate(\"&& || ?? === !==\");\nconst identity_comparison = makePredicate(\"== != === !==\");\nconst has_identity = value => typeof value === \"object\"\n    || typeof value === \"function\"\n    || typeof value === \"symbol\";\n\ndef_eval(AST_Binary, function (compressor, depth) {\n    if (!non_converting_binary.has(this.operator))\n        depth++;\n\n    var left = this.left._eval(compressor, depth);\n    if (left === this.left)\n        return this;\n    var right = this.right._eval(compressor, depth);\n    if (right === this.right)\n        return this;\n    var result;\n\n    if (left != null\n        && right != null\n        && identity_comparison.has(this.operator)\n        && has_identity(left)\n        && has_identity(right)\n        && typeof left === typeof right) {\n        // Do not compare by reference\n        return this;\n    }\n\n    switch (this.operator) {\n        case \"&&\": result = left && right; break;\n        case \"||\": result = left || right; break;\n        case \"??\": result = left != null ? left : right; break;\n        case \"|\": result = left | right; break;\n        case \"&\": result = left & right; break;\n        case \"^\": result = left ^ right; break;\n        case \"+\": result = left + right; break;\n        case \"*\": result = left * right; break;\n        case \"**\": result = Math.pow(left, right); break;\n        case \"/\": result = left / right; break;\n        case \"%\": result = left % right; break;\n        case \"-\": result = left - right; break;\n        case \"<<\": result = left << right; break;\n        case \">>\": result = left >> right; break;\n        case \">>>\": result = left >>> right; break;\n        case \"==\": result = left == right; break;\n        case \"===\": result = left === right; break;\n        case \"!=\": result = left != right; break;\n        case \"!==\": result = left !== right; break;\n        case \"<\": result = left < right; break;\n        case \"<=\": result = left <= right; break;\n        case \">\": result = left > right; break;\n        case \">=\": result = left >= right; break;\n        default:\n            return this;\n    }\n    if (isNaN(result) && compressor.find_parent(AST_With)) {\n        // leave original expression as is\n        return this;\n    }\n    return result;\n});\n\ndef_eval(AST_Conditional, function (compressor, depth) {\n    var condition = this.condition._eval(compressor, depth);\n    if (condition === this.condition)\n        return this;\n    var node = condition ? this.consequent : this.alternative;\n    var value = node._eval(compressor, depth);\n    return value === node ? this : value;\n});\n\n// Set of AST_SymbolRef which are currently being evaluated.\n// Avoids infinite recursion of ._eval()\nconst reentrant_ref_eval = new Set();\ndef_eval(AST_SymbolRef, function (compressor, depth) {\n    if (reentrant_ref_eval.has(this))\n        return this;\n\n    var fixed = this.fixed_value();\n    if (!fixed)\n        return this;\n\n    reentrant_ref_eval.add(this);\n    const value = fixed._eval(compressor, depth);\n    reentrant_ref_eval.delete(this);\n\n    if (value === fixed)\n        return this;\n\n    if (value && typeof value == \"object\") {\n        var escaped = this.definition().escaped;\n        if (escaped && depth > escaped)\n            return this;\n    }\n    return value;\n});\n\nconst global_objs = { Array, Math, Number, Object, String };\n\nconst regexp_flags = new Set([\n    \"dotAll\",\n    \"global\",\n    \"ignoreCase\",\n    \"multiline\",\n    \"sticky\",\n    \"unicode\",\n]);\n\ndef_eval(AST_PropAccess, function (compressor, depth) {\n    let obj = this.expression._eval(compressor, depth + 1);\n    if (obj === nullish || (this.optional && obj == null)) return nullish;\n\n    // `.length` of strings and arrays is always safe\n    if (this.property === \"length\") {\n        if (typeof obj === \"string\") {\n            return obj.length;\n        }\n\n        const is_spreadless_array =\n            obj instanceof AST_Array\n            && obj.elements.every(el => !(el instanceof AST_Expansion));\n\n        if (\n            is_spreadless_array\n            && obj.elements.every(el => !el.has_side_effects(compressor))\n        ) {\n            return obj.elements.length;\n        }\n    }\n\n    if (compressor.option(\"unsafe\")) {\n        var key = this.property;\n        if (key instanceof AST_Node) {\n            key = key._eval(compressor, depth);\n            if (key === this.property)\n                return this;\n        }\n\n        var exp = this.expression;\n        if (is_undeclared_ref(exp)) {\n            var aa;\n            var first_arg = exp.name === \"hasOwnProperty\"\n                && key === \"call\"\n                && (aa = compressor.parent() && compressor.parent().args)\n                && (aa && aa[0]\n                    && aa[0].evaluate(compressor));\n\n            first_arg = first_arg instanceof AST_Dot ? first_arg.expression : first_arg;\n\n            if (first_arg == null || first_arg.thedef && first_arg.thedef.undeclared) {\n                return this.clone();\n            }\n            if (!is_pure_native_value(exp.name, key))\n                return this;\n            obj = global_objs[exp.name];\n        } else {\n            if (obj instanceof RegExp) {\n                if (key == \"source\") {\n                    return regexp_source_fix(obj.source);\n                } else if (key == \"flags\" || regexp_flags.has(key)) {\n                    return obj[key];\n                }\n            }\n            if (!obj || obj === exp || !HOP(obj, key))\n                return this;\n\n            if (typeof obj == \"function\")\n                switch (key) {\n                    case \"name\":\n                        return obj.node.name ? obj.node.name.name : \"\";\n                    case \"length\":\n                        return obj.node.length_property();\n                    default:\n                        return this;\n                }\n        }\n        return obj[key];\n    }\n    return this;\n});\n\ndef_eval(AST_Chain, function (compressor, depth) {\n    const evaluated = this.expression._eval(compressor, depth);\n    return evaluated === nullish\n        ? undefined\n        : evaluated === this.expression\n          ? this\n          : evaluated;\n});\n\ndef_eval(AST_Call, function (compressor, depth) {\n    var exp = this.expression;\n\n    const callee = exp._eval(compressor, depth);\n    if (callee === nullish || (this.optional && callee == null)) return nullish;\n\n    if (compressor.option(\"unsafe\") && exp instanceof AST_PropAccess) {\n        var key = exp.property;\n        if (key instanceof AST_Node) {\n            key = key._eval(compressor, depth);\n            if (key === exp.property)\n                return this;\n        }\n        var val;\n        var e = exp.expression;\n        if (is_undeclared_ref(e)) {\n            var first_arg = e.name === \"hasOwnProperty\" &&\n                key === \"call\" &&\n                (this.args[0] && this.args[0].evaluate(compressor));\n\n            first_arg = first_arg instanceof AST_Dot ? first_arg.expression : first_arg;\n\n            if ((first_arg == null || first_arg.thedef && first_arg.thedef.undeclared)) {\n                return this.clone();\n            }\n            if (!is_pure_native_fn(e.name, key)) return this;\n            val = global_objs[e.name];\n        } else {\n            val = e._eval(compressor, depth + 1);\n            if (val === e || !val)\n                return this;\n            if (!is_pure_native_method(val.constructor.name, key))\n                return this;\n        }\n        var args = [];\n        for (var i = 0, len = this.args.length; i < len; i++) {\n            var arg = this.args[i];\n            var value = arg._eval(compressor, depth);\n            if (arg === value)\n                return this;\n            if (arg instanceof AST_Lambda)\n                return this;\n            args.push(value);\n        }\n        try {\n            return val[key].apply(val, args);\n        } catch (ex) {\n            // We don't really care\n        }\n    }\n    return this;\n});\n\n// Also a subclass of AST_Call\ndef_eval(AST_New, return_this);\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/index.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Accessor,\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_BigInt,\n    AST_Binary,\n    AST_Block,\n    AST_BlockStatement,\n    AST_Boolean,\n    AST_Break,\n    AST_Call,\n    AST_Catch,\n    AST_Chain,\n    AST_Class,\n    AST_ClassProperty,\n    AST_ClassStaticBlock,\n    AST_ConciseMethod,\n    AST_Conditional,\n    AST_Const,\n    AST_Constant,\n    AST_Debugger,\n    AST_Default,\n    AST_DefaultAssign,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DWLoop,\n    AST_EmptyStatement,\n    AST_Exit,\n    AST_Expansion,\n    AST_Export,\n    AST_False,\n    AST_For,\n    AST_ForIn,\n    AST_Function,\n    AST_Hole,\n    AST_If,\n    AST_Import,\n    AST_Infinity,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_Let,\n    AST_NaN,\n    AST_New,\n    AST_Node,\n    AST_Null,\n    AST_Number,\n    AST_Object,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_PrefixedTemplateString,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Return,\n    AST_Scope,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Statement,\n    AST_String,\n    AST_Sub,\n    AST_Switch,\n    AST_SwitchBranch,\n    AST_Symbol,\n    AST_SymbolClassProperty,\n    AST_SymbolDeclaration,\n    AST_SymbolDefun,\n    AST_SymbolExport,\n    AST_SymbolFunarg,\n    AST_SymbolLambda,\n    AST_SymbolLet,\n    AST_SymbolMethod,\n    AST_SymbolRef,\n    AST_TemplateString,\n    AST_This,\n    AST_Toplevel,\n    AST_True,\n    AST_Try,\n    AST_Unary,\n    AST_UnaryPostfix,\n    AST_UnaryPrefix,\n    AST_Undefined,\n    AST_Var,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n\n    TreeTransformer,\n    TreeWalker,\n    walk,\n    walk_abort,\n\n    _INLINE,\n    _NOINLINE,\n    _PURE\n} from \"../ast.js\";\nimport {\n    defaults,\n    HOP,\n    make_node,\n    makePredicate,\n    MAP,\n    remove,\n    return_false,\n    return_true,\n    regexp_source_fix,\n    has_annotation,\n    regexp_is_safe,\n} from \"../utils/index.js\";\nimport { first_in_statement } from \"../utils/first_in_statement.js\";\nimport { equivalent_to } from \"../equivalent-to.js\";\nimport {\n    is_basic_identifier_string,\n    JS_Parse_Error,\n    parse,\n    PRECEDENCE,\n} from \"../parse.js\";\nimport { OutputStream } from \"../output.js\";\nimport { base54, format_mangler_options } from \"../scope.js\";\nimport \"../size.js\";\n\nimport \"./evaluate.js\";\nimport \"./drop-side-effect-free.js\";\nimport \"./drop-unused.js\";\nimport \"./reduce-vars.js\";\nimport {\n    is_undeclared_ref,\n    lazy_op,\n    is_nullish,\n    is_undefined,\n    is_lhs,\n    aborts,\n} from \"./inference.js\";\nimport {\n    SQUEEZED,\n    OPTIMIZED,\n    CLEAR_BETWEEN_PASSES,\n    TOP,\n    UNDEFINED,\n    UNUSED,\n    TRUTHY,\n    FALSY,\n\n    has_flag,\n    set_flag,\n    clear_flag,\n} from \"./compressor-flags.js\";\nimport {\n    make_sequence,\n    best_of,\n    best_of_expression,\n    make_node_from_constant,\n    merge_sequence,\n    get_simple_key,\n    has_break_or_continue,\n    maintain_this_binding,\n    is_empty,\n    is_identifier_atom,\n    is_reachable,\n    can_be_evicted_from_block,\n    as_statement_array,\n    retain_top_func,\n    is_func_expr,\n} from \"./common.js\";\nimport { tighten_body, trim_unreachable_code } from \"./tighten-body.js\";\nimport { inline_into_symbolref, inline_into_call } from \"./inline.js\";\n\nclass Compressor extends TreeWalker {\n    constructor(options, { false_by_default = false, mangle_options = false }) {\n        super();\n        if (options.defaults !== undefined && !options.defaults) false_by_default = true;\n        this.options = defaults(options, {\n            arguments     : false,\n            arrows        : !false_by_default,\n            booleans      : !false_by_default,\n            booleans_as_integers : false,\n            collapse_vars : !false_by_default,\n            comparisons   : !false_by_default,\n            computed_props: !false_by_default,\n            conditionals  : !false_by_default,\n            dead_code     : !false_by_default,\n            defaults      : true,\n            directives    : !false_by_default,\n            drop_console  : false,\n            drop_debugger : !false_by_default,\n            ecma          : 5,\n            evaluate      : !false_by_default,\n            expression    : false,\n            global_defs   : false,\n            hoist_funs    : false,\n            hoist_props   : !false_by_default,\n            hoist_vars    : false,\n            ie8           : false,\n            if_return     : !false_by_default,\n            inline        : !false_by_default,\n            join_vars     : !false_by_default,\n            keep_classnames: false,\n            keep_fargs    : true,\n            keep_fnames   : false,\n            keep_infinity : false,\n            lhs_constants : !false_by_default,\n            loops         : !false_by_default,\n            module        : false,\n            negate_iife   : !false_by_default,\n            passes        : 1,\n            properties    : !false_by_default,\n            pure_getters  : !false_by_default && \"strict\",\n            pure_funcs    : null,\n            reduce_funcs  : !false_by_default,\n            reduce_vars   : !false_by_default,\n            sequences     : !false_by_default,\n            side_effects  : !false_by_default,\n            switches      : !false_by_default,\n            top_retain    : null,\n            toplevel      : !!(options && options[\"top_retain\"]),\n            typeofs       : !false_by_default,\n            unsafe        : false,\n            unsafe_arrows : false,\n            unsafe_comps  : false,\n            unsafe_Function: false,\n            unsafe_math   : false,\n            unsafe_symbols: false,\n            unsafe_methods: false,\n            unsafe_proto  : false,\n            unsafe_regexp : false,\n            unsafe_undefined: false,\n            unused        : !false_by_default,\n            warnings      : false  // legacy\n        }, true);\n        var global_defs = this.options[\"global_defs\"];\n        if (typeof global_defs == \"object\") for (var key in global_defs) {\n            if (key[0] === \"@\" && HOP(global_defs, key)) {\n                global_defs[key.slice(1)] = parse(global_defs[key], {\n                    expression: true\n                });\n            }\n        }\n        if (this.options[\"inline\"] === true) this.options[\"inline\"] = 3;\n        var pure_funcs = this.options[\"pure_funcs\"];\n        if (typeof pure_funcs == \"function\") {\n            this.pure_funcs = pure_funcs;\n        } else {\n            this.pure_funcs = pure_funcs ? function(node) {\n                return !pure_funcs.includes(node.expression.print_to_string());\n            } : return_true;\n        }\n        var top_retain = this.options[\"top_retain\"];\n        if (top_retain instanceof RegExp) {\n            this.top_retain = function(def) {\n                return top_retain.test(def.name);\n            };\n        } else if (typeof top_retain == \"function\") {\n            this.top_retain = top_retain;\n        } else if (top_retain) {\n            if (typeof top_retain == \"string\") {\n                top_retain = top_retain.split(/,/);\n            }\n            this.top_retain = function(def) {\n                return top_retain.includes(def.name);\n            };\n        }\n        if (this.options[\"module\"]) {\n            this.directives[\"use strict\"] = true;\n            this.options[\"toplevel\"] = true;\n        }\n        var toplevel = this.options[\"toplevel\"];\n        this.toplevel = typeof toplevel == \"string\" ? {\n            funcs: /funcs/.test(toplevel),\n            vars: /vars/.test(toplevel)\n        } : {\n            funcs: toplevel,\n            vars: toplevel\n        };\n        var sequences = this.options[\"sequences\"];\n        this.sequences_limit = sequences == 1 ? 800 : sequences | 0;\n        this.evaluated_regexps = new Map();\n        this._toplevel = undefined;\n        this.mangle_options = mangle_options\n            ? format_mangler_options(mangle_options)\n            : mangle_options;\n    }\n\n    option(key) {\n        return this.options[key];\n    }\n\n    exposed(def) {\n        if (def.export) return true;\n        if (def.global) for (var i = 0, len = def.orig.length; i < len; i++)\n            if (!this.toplevel[def.orig[i] instanceof AST_SymbolDefun ? \"funcs\" : \"vars\"])\n                return true;\n        return false;\n    }\n\n    in_boolean_context() {\n        if (!this.option(\"booleans\")) return false;\n        var self = this.self();\n        for (var i = 0, p; p = this.parent(i); i++) {\n            if (p instanceof AST_SimpleStatement\n                || p instanceof AST_Conditional && p.condition === self\n                || p instanceof AST_DWLoop && p.condition === self\n                || p instanceof AST_For && p.condition === self\n                || p instanceof AST_If && p.condition === self\n                || p instanceof AST_UnaryPrefix && p.operator == \"!\" && p.expression === self) {\n                return true;\n            }\n            if (\n                p instanceof AST_Binary\n                    && (\n                        p.operator == \"&&\"\n                        || p.operator == \"||\"\n                        || p.operator == \"??\"\n                    )\n                || p instanceof AST_Conditional\n                || p.tail_node() === self\n            ) {\n                self = p;\n            } else {\n                return false;\n            }\n        }\n    }\n\n    get_toplevel() {\n        return this._toplevel;\n    }\n\n    compress(toplevel) {\n        toplevel = toplevel.resolve_defines(this);\n        this._toplevel = toplevel;\n        if (this.option(\"expression\")) {\n            this._toplevel.process_expression(true);\n        }\n        var passes = +this.options.passes || 1;\n        var min_count = 1 / 0;\n        var stopping = false;\n        var nth_identifier = this.mangle_options && this.mangle_options.nth_identifier || base54;\n        var mangle = { ie8: this.option(\"ie8\"), nth_identifier: nth_identifier };\n        for (var pass = 0; pass < passes; pass++) {\n            this._toplevel.figure_out_scope(mangle);\n            if (pass === 0 && this.option(\"drop_console\")) {\n                // must be run before reduce_vars and compress pass\n                this._toplevel = this._toplevel.drop_console();\n            }\n            if (pass > 0 || this.option(\"reduce_vars\")) {\n                this._toplevel.reset_opt_flags(this);\n            }\n            this._toplevel = this._toplevel.transform(this);\n            if (passes > 1) {\n                let count = 0;\n                walk(this._toplevel, () => { count++; });\n                if (count < min_count) {\n                    min_count = count;\n                    stopping = false;\n                } else if (stopping) {\n                    break;\n                } else {\n                    stopping = true;\n                }\n            }\n        }\n        if (this.option(\"expression\")) {\n            this._toplevel.process_expression(false);\n        }\n        toplevel = this._toplevel;\n        this._toplevel = undefined;\n        return toplevel;\n    }\n\n    before(node, descend) {\n        if (has_flag(node, SQUEEZED)) return node;\n        var was_scope = false;\n        if (node instanceof AST_Scope) {\n            node = node.hoist_properties(this);\n            node = node.hoist_declarations(this);\n            was_scope = true;\n        }\n        // Before https://github.com/mishoo/UglifyJS2/pull/1602 AST_Node.optimize()\n        // would call AST_Node.transform() if a different instance of AST_Node is\n        // produced after def_optimize().\n        // This corrupts TreeWalker.stack, which cause AST look-ups to malfunction.\n        // Migrate and defer all children's AST_Node.transform() to below, which\n        // will now happen after this parent AST_Node has been properly substituted\n        // thus gives a consistent AST snapshot.\n        descend(node, this);\n        // Existing code relies on how AST_Node.optimize() worked, and omitting the\n        // following replacement call would result in degraded efficiency of both\n        // output and performance.\n        descend(node, this);\n        var opt = node.optimize(this);\n        if (was_scope && opt instanceof AST_Scope) {\n            opt.drop_unused(this);\n            descend(opt, this);\n        }\n        if (opt === node) set_flag(opt, SQUEEZED);\n        return opt;\n    }\n\n    /** Alternative to plain is_lhs() which doesn't work within .optimize() */\n    is_lhs() {\n        const self = this.stack[this.stack.length - 1];\n        const parent = this.stack[this.stack.length - 2];\n        return is_lhs(self, parent);\n    }\n}\n\nfunction def_optimize(node, optimizer) {\n    node.DEFMETHOD(\"optimize\", function(compressor) {\n        var self = this;\n        if (has_flag(self, OPTIMIZED)) return self;\n        if (compressor.has_directive(\"use asm\")) return self;\n        var opt = optimizer(self, compressor);\n        set_flag(opt, OPTIMIZED);\n        return opt;\n    });\n}\n\ndef_optimize(AST_Node, function(self) {\n    return self;\n});\n\nAST_Toplevel.DEFMETHOD(\"drop_console\", function() {\n    return this.transform(new TreeTransformer(function(self) {\n        if (self.TYPE == \"Call\") {\n            var exp = self.expression;\n            if (exp instanceof AST_PropAccess) {\n                var name = exp.expression;\n                while (name.expression) {\n                    name = name.expression;\n                }\n                if (is_undeclared_ref(name) && name.name == \"console\") {\n                    return make_node(AST_Undefined, self);\n                }\n            }\n        }\n    }));\n});\n\nAST_Node.DEFMETHOD(\"equivalent_to\", function(node) {\n    return equivalent_to(this, node);\n});\n\nAST_Scope.DEFMETHOD(\"process_expression\", function(insert, compressor) {\n    var self = this;\n    var tt = new TreeTransformer(function(node) {\n        if (insert && node instanceof AST_SimpleStatement) {\n            return make_node(AST_Return, node, {\n                value: node.body\n            });\n        }\n        if (!insert && node instanceof AST_Return) {\n            if (compressor) {\n                var value = node.value && node.value.drop_side_effect_free(compressor, true);\n                return value\n                    ? make_node(AST_SimpleStatement, node, { body: value })\n                    : make_node(AST_EmptyStatement, node);\n            }\n            return make_node(AST_SimpleStatement, node, {\n                body: node.value || make_node(AST_UnaryPrefix, node, {\n                    operator: \"void\",\n                    expression: make_node(AST_Number, node, {\n                        value: 0\n                    })\n                })\n            });\n        }\n        if (node instanceof AST_Class || node instanceof AST_Lambda && node !== self) {\n            return node;\n        }\n        if (node instanceof AST_Block) {\n            var index = node.body.length - 1;\n            if (index >= 0) {\n                node.body[index] = node.body[index].transform(tt);\n            }\n        } else if (node instanceof AST_If) {\n            node.body = node.body.transform(tt);\n            if (node.alternative) {\n                node.alternative = node.alternative.transform(tt);\n            }\n        } else if (node instanceof AST_With) {\n            node.body = node.body.transform(tt);\n        }\n        return node;\n    });\n    self.transform(tt);\n});\n\nAST_Toplevel.DEFMETHOD(\"reset_opt_flags\", function(compressor) {\n    const self = this;\n    const reduce_vars = compressor.option(\"reduce_vars\");\n\n    const preparation = new TreeWalker(function(node, descend) {\n        clear_flag(node, CLEAR_BETWEEN_PASSES);\n        if (reduce_vars) {\n            if (compressor.top_retain\n                && node instanceof AST_Defun  // Only functions are retained\n                && preparation.parent() === self\n            ) {\n                set_flag(node, TOP);\n            }\n            return node.reduce_vars(preparation, descend, compressor);\n        }\n    });\n    // Stack of look-up tables to keep track of whether a `SymbolDef` has been\n    // properly assigned before use:\n    // - `push()` & `pop()` when visiting conditional branches\n    preparation.safe_ids = Object.create(null);\n    preparation.in_loop = null;\n    preparation.loop_ids = new Map();\n    preparation.defs_to_safe_ids = new Map();\n    self.walk(preparation);\n});\n\nAST_Symbol.DEFMETHOD(\"fixed_value\", function() {\n    var fixed = this.thedef.fixed;\n    if (!fixed || fixed instanceof AST_Node) return fixed;\n    return fixed();\n});\n\nAST_SymbolRef.DEFMETHOD(\"is_immutable\", function() {\n    var orig = this.definition().orig;\n    return orig.length == 1 && orig[0] instanceof AST_SymbolLambda;\n});\n\nfunction find_variable(compressor, name) {\n    var scope, i = 0;\n    while (scope = compressor.parent(i++)) {\n        if (scope instanceof AST_Scope) break;\n        if (scope instanceof AST_Catch && scope.argname) {\n            scope = scope.argname.definition().scope;\n            break;\n        }\n    }\n    return scope.find_variable(name);\n}\n\nvar global_names = makePredicate(\"Array Boolean clearInterval clearTimeout console Date decodeURI decodeURIComponent encodeURI encodeURIComponent Error escape eval EvalError Function isFinite isNaN JSON Math Number parseFloat parseInt RangeError ReferenceError RegExp Object setInterval setTimeout String SyntaxError TypeError unescape URIError\");\nAST_SymbolRef.DEFMETHOD(\"is_declared\", function(compressor) {\n    return !this.definition().undeclared\n        || compressor.option(\"unsafe\") && global_names.has(this.name);\n});\n\n/* -----[ optimizers ]----- */\n\nvar directives = new Set([\"use asm\", \"use strict\"]);\ndef_optimize(AST_Directive, function(self, compressor) {\n    if (compressor.option(\"directives\")\n        && (!directives.has(self.value) || compressor.has_directive(self.value) !== self)) {\n        return make_node(AST_EmptyStatement, self);\n    }\n    return self;\n});\n\ndef_optimize(AST_Debugger, function(self, compressor) {\n    if (compressor.option(\"drop_debugger\"))\n        return make_node(AST_EmptyStatement, self);\n    return self;\n});\n\ndef_optimize(AST_LabeledStatement, function(self, compressor) {\n    if (self.body instanceof AST_Break\n        && compressor.loopcontrol_target(self.body) === self.body) {\n        return make_node(AST_EmptyStatement, self);\n    }\n    return self.label.references.length == 0 ? self.body : self;\n});\n\ndef_optimize(AST_Block, function(self, compressor) {\n    tighten_body(self.body, compressor);\n    return self;\n});\n\nfunction can_be_extracted_from_if_block(node) {\n    return !(\n        node instanceof AST_Const\n        || node instanceof AST_Let\n        || node instanceof AST_Class\n    );\n}\n\ndef_optimize(AST_BlockStatement, function(self, compressor) {\n    tighten_body(self.body, compressor);\n    switch (self.body.length) {\n      case 1:\n        if (!compressor.has_directive(\"use strict\")\n            && compressor.parent() instanceof AST_If\n            && can_be_extracted_from_if_block(self.body[0])\n            || can_be_evicted_from_block(self.body[0])) {\n            return self.body[0];\n        }\n        break;\n      case 0: return make_node(AST_EmptyStatement, self);\n    }\n    return self;\n});\n\nfunction opt_AST_Lambda(self, compressor) {\n    tighten_body(self.body, compressor);\n    if (compressor.option(\"side_effects\")\n        && self.body.length == 1\n        && self.body[0] === compressor.has_directive(\"use strict\")) {\n        self.body.length = 0;\n    }\n    return self;\n}\ndef_optimize(AST_Lambda, opt_AST_Lambda);\n\nAST_Scope.DEFMETHOD(\"hoist_declarations\", function(compressor) {\n    var self = this;\n    if (compressor.has_directive(\"use asm\")) return self;\n    // Hoisting makes no sense in an arrow func\n    if (!Array.isArray(self.body)) return self;\n\n    var hoist_funs = compressor.option(\"hoist_funs\");\n    var hoist_vars = compressor.option(\"hoist_vars\");\n\n    if (hoist_funs || hoist_vars) {\n        var dirs = [];\n        var hoisted = [];\n        var vars = new Map(), vars_found = 0, var_decl = 0;\n        // let's count var_decl first, we seem to waste a lot of\n        // space if we hoist `var` when there's only one.\n        walk(self, node => {\n            if (node instanceof AST_Scope && node !== self)\n                return true;\n            if (node instanceof AST_Var) {\n                ++var_decl;\n                return true;\n            }\n        });\n        hoist_vars = hoist_vars && var_decl > 1;\n        var tt = new TreeTransformer(\n            function before(node) {\n                if (node !== self) {\n                    if (node instanceof AST_Directive) {\n                        dirs.push(node);\n                        return make_node(AST_EmptyStatement, node);\n                    }\n                    if (hoist_funs && node instanceof AST_Defun\n                        && !(tt.parent() instanceof AST_Export)\n                        && tt.parent() === self) {\n                        hoisted.push(node);\n                        return make_node(AST_EmptyStatement, node);\n                    }\n                    if (\n                        hoist_vars\n                        && node instanceof AST_Var\n                        && !node.definitions.some(def => def.name instanceof AST_Destructuring)\n                    ) {\n                        node.definitions.forEach(function(def) {\n                            vars.set(def.name.name, def);\n                            ++vars_found;\n                        });\n                        var seq = node.to_assignments(compressor);\n                        var p = tt.parent();\n                        if (p instanceof AST_ForIn && p.init === node) {\n                            if (seq == null) {\n                                var def = node.definitions[0].name;\n                                return make_node(AST_SymbolRef, def, def);\n                            }\n                            return seq;\n                        }\n                        if (p instanceof AST_For && p.init === node) {\n                            return seq;\n                        }\n                        if (!seq) return make_node(AST_EmptyStatement, node);\n                        return make_node(AST_SimpleStatement, node, {\n                            body: seq\n                        });\n                    }\n                    if (node instanceof AST_Scope)\n                        return node; // to avoid descending in nested scopes\n                }\n            }\n        );\n        self = self.transform(tt);\n        if (vars_found > 0) {\n            // collect only vars which don't show up in self's arguments list\n            var defs = [];\n            const is_lambda = self instanceof AST_Lambda;\n            const args_as_names = is_lambda ? self.args_as_names() : null;\n            vars.forEach((def, name) => {\n                if (is_lambda && args_as_names.some((x) => x.name === def.name.name)) {\n                    vars.delete(name);\n                } else {\n                    def = def.clone();\n                    def.value = null;\n                    defs.push(def);\n                    vars.set(name, def);\n                }\n            });\n            if (defs.length > 0) {\n                // try to merge in assignments\n                for (var i = 0; i < self.body.length;) {\n                    if (self.body[i] instanceof AST_SimpleStatement) {\n                        var expr = self.body[i].body, sym, assign;\n                        if (expr instanceof AST_Assign\n                            && expr.operator == \"=\"\n                            && (sym = expr.left) instanceof AST_Symbol\n                            && vars.has(sym.name)\n                        ) {\n                            var def = vars.get(sym.name);\n                            if (def.value) break;\n                            def.value = expr.right;\n                            remove(defs, def);\n                            defs.push(def);\n                            self.body.splice(i, 1);\n                            continue;\n                        }\n                        if (expr instanceof AST_Sequence\n                            && (assign = expr.expressions[0]) instanceof AST_Assign\n                            && assign.operator == \"=\"\n                            && (sym = assign.left) instanceof AST_Symbol\n                            && vars.has(sym.name)\n                        ) {\n                            var def = vars.get(sym.name);\n                            if (def.value) break;\n                            def.value = assign.right;\n                            remove(defs, def);\n                            defs.push(def);\n                            self.body[i].body = make_sequence(expr, expr.expressions.slice(1));\n                            continue;\n                        }\n                    }\n                    if (self.body[i] instanceof AST_EmptyStatement) {\n                        self.body.splice(i, 1);\n                        continue;\n                    }\n                    if (self.body[i] instanceof AST_BlockStatement) {\n                        self.body.splice(i, 1, ...self.body[i].body);\n                        continue;\n                    }\n                    break;\n                }\n                defs = make_node(AST_Var, self, {\n                    definitions: defs\n                });\n                hoisted.push(defs);\n            }\n        }\n        self.body = dirs.concat(hoisted, self.body);\n    }\n    return self;\n});\n\nAST_Scope.DEFMETHOD(\"hoist_properties\", function(compressor) {\n    var self = this;\n    if (!compressor.option(\"hoist_props\") || compressor.has_directive(\"use asm\")) return self;\n    var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;\n    var defs_by_id = new Map();\n    var hoister = new TreeTransformer(function(node, descend) {\n        if (node instanceof AST_VarDef) {\n            const sym = node.name;\n            let def;\n            let value;\n            if (sym.scope === self\n                && (def = sym.definition()).escaped != 1\n                && !def.assignments\n                && !def.direct_access\n                && !def.single_use\n                && !compressor.exposed(def)\n                && !top_retain(def)\n                && (value = sym.fixed_value()) === node.value\n                && value instanceof AST_Object\n                && !value.properties.some(prop =>\n                    prop instanceof AST_Expansion || prop.computed_key()\n                )\n            ) {\n                descend(node, this);\n                const defs = new Map();\n                const assignments = [];\n                value.properties.forEach(({ key, value }) => {\n                    const scope = hoister.find_scope();\n                    const symbol = self.create_symbol(sym.CTOR, {\n                        source: sym,\n                        scope,\n                        conflict_scopes: new Set([\n                            scope,\n                            ...sym.definition().references.map(ref => ref.scope)\n                        ]),\n                        tentative_name: sym.name + \"_\" + key\n                    });\n\n                    defs.set(String(key), symbol.definition());\n\n                    assignments.push(make_node(AST_VarDef, node, {\n                        name: symbol,\n                        value\n                    }));\n                });\n                defs_by_id.set(def.id, defs);\n                return MAP.splice(assignments);\n            }\n        } else if (node instanceof AST_PropAccess\n            && node.expression instanceof AST_SymbolRef\n        ) {\n            const defs = defs_by_id.get(node.expression.definition().id);\n            if (defs) {\n                const def = defs.get(String(get_simple_key(node.property)));\n                const sym = make_node(AST_SymbolRef, node, {\n                    name: def.name,\n                    scope: node.expression.scope,\n                    thedef: def\n                });\n                sym.reference({});\n                return sym;\n            }\n        }\n    });\n    return self.transform(hoister);\n});\n\ndef_optimize(AST_SimpleStatement, function(self, compressor) {\n    if (compressor.option(\"side_effects\")) {\n        var body = self.body;\n        var node = body.drop_side_effect_free(compressor, true);\n        if (!node) {\n            return make_node(AST_EmptyStatement, self);\n        }\n        if (node !== body) {\n            return make_node(AST_SimpleStatement, self, { body: node });\n        }\n    }\n    return self;\n});\n\ndef_optimize(AST_While, function(self, compressor) {\n    return compressor.option(\"loops\") ? make_node(AST_For, self, self).optimize(compressor) : self;\n});\n\ndef_optimize(AST_Do, function(self, compressor) {\n    if (!compressor.option(\"loops\")) return self;\n    var cond = self.condition.tail_node().evaluate(compressor);\n    if (!(cond instanceof AST_Node)) {\n        if (cond) return make_node(AST_For, self, {\n            body: make_node(AST_BlockStatement, self.body, {\n                body: [\n                    self.body,\n                    make_node(AST_SimpleStatement, self.condition, {\n                        body: self.condition\n                    })\n                ]\n            })\n        }).optimize(compressor);\n        if (!has_break_or_continue(self, compressor.parent())) {\n            return make_node(AST_BlockStatement, self.body, {\n                body: [\n                    self.body,\n                    make_node(AST_SimpleStatement, self.condition, {\n                        body: self.condition\n                    })\n                ]\n            }).optimize(compressor);\n        }\n    }\n    return self;\n});\n\nfunction if_break_in_loop(self, compressor) {\n    var first = self.body instanceof AST_BlockStatement ? self.body.body[0] : self.body;\n    if (compressor.option(\"dead_code\") && is_break(first)) {\n        var body = [];\n        if (self.init instanceof AST_Statement) {\n            body.push(self.init);\n        } else if (self.init) {\n            body.push(make_node(AST_SimpleStatement, self.init, {\n                body: self.init\n            }));\n        }\n        if (self.condition) {\n            body.push(make_node(AST_SimpleStatement, self.condition, {\n                body: self.condition\n            }));\n        }\n        trim_unreachable_code(compressor, self.body, body);\n        return make_node(AST_BlockStatement, self, {\n            body: body\n        });\n    }\n    if (first instanceof AST_If) {\n        if (is_break(first.body)) {\n            if (self.condition) {\n                self.condition = make_node(AST_Binary, self.condition, {\n                    left: self.condition,\n                    operator: \"&&\",\n                    right: first.condition.negate(compressor),\n                });\n            } else {\n                self.condition = first.condition.negate(compressor);\n            }\n            drop_it(first.alternative);\n        } else if (is_break(first.alternative)) {\n            if (self.condition) {\n                self.condition = make_node(AST_Binary, self.condition, {\n                    left: self.condition,\n                    operator: \"&&\",\n                    right: first.condition,\n                });\n            } else {\n                self.condition = first.condition;\n            }\n            drop_it(first.body);\n        }\n    }\n    return self;\n\n    function is_break(node) {\n        return node instanceof AST_Break\n            && compressor.loopcontrol_target(node) === compressor.self();\n    }\n\n    function drop_it(rest) {\n        rest = as_statement_array(rest);\n        if (self.body instanceof AST_BlockStatement) {\n            self.body = self.body.clone();\n            self.body.body = rest.concat(self.body.body.slice(1));\n            self.body = self.body.transform(compressor);\n        } else {\n            self.body = make_node(AST_BlockStatement, self.body, {\n                body: rest\n            }).transform(compressor);\n        }\n        self = if_break_in_loop(self, compressor);\n    }\n}\n\ndef_optimize(AST_For, function(self, compressor) {\n    if (!compressor.option(\"loops\")) return self;\n    if (compressor.option(\"side_effects\") && self.init) {\n        self.init = self.init.drop_side_effect_free(compressor);\n    }\n    if (self.condition) {\n        var cond = self.condition.evaluate(compressor);\n        if (!(cond instanceof AST_Node)) {\n            if (cond) self.condition = null;\n            else if (!compressor.option(\"dead_code\")) {\n                var orig = self.condition;\n                self.condition = make_node_from_constant(cond, self.condition);\n                self.condition = best_of_expression(self.condition.transform(compressor), orig);\n            }\n        }\n        if (compressor.option(\"dead_code\")) {\n            if (cond instanceof AST_Node) cond = self.condition.tail_node().evaluate(compressor);\n            if (!cond) {\n                var body = [];\n                trim_unreachable_code(compressor, self.body, body);\n                if (self.init instanceof AST_Statement) {\n                    body.push(self.init);\n                } else if (self.init) {\n                    body.push(make_node(AST_SimpleStatement, self.init, {\n                        body: self.init\n                    }));\n                }\n                body.push(make_node(AST_SimpleStatement, self.condition, {\n                    body: self.condition\n                }));\n                return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor);\n            }\n        }\n    }\n    return if_break_in_loop(self, compressor);\n});\n\ndef_optimize(AST_If, function(self, compressor) {\n    if (is_empty(self.alternative)) self.alternative = null;\n\n    if (!compressor.option(\"conditionals\")) return self;\n    // if condition can be statically determined, drop\n    // one of the blocks.  note, statically determined implies\n    // “has no side effects”; also it doesn't work for cases like\n    // `x && true`, though it probably should.\n    var cond = self.condition.evaluate(compressor);\n    if (!compressor.option(\"dead_code\") && !(cond instanceof AST_Node)) {\n        var orig = self.condition;\n        self.condition = make_node_from_constant(cond, orig);\n        self.condition = best_of_expression(self.condition.transform(compressor), orig);\n    }\n    if (compressor.option(\"dead_code\")) {\n        if (cond instanceof AST_Node) cond = self.condition.tail_node().evaluate(compressor);\n        if (!cond) {\n            var body = [];\n            trim_unreachable_code(compressor, self.body, body);\n            body.push(make_node(AST_SimpleStatement, self.condition, {\n                body: self.condition\n            }));\n            if (self.alternative) body.push(self.alternative);\n            return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor);\n        } else if (!(cond instanceof AST_Node)) {\n            var body = [];\n            body.push(make_node(AST_SimpleStatement, self.condition, {\n                body: self.condition\n            }));\n            body.push(self.body);\n            if (self.alternative) {\n                trim_unreachable_code(compressor, self.alternative, body);\n            }\n            return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor);\n        }\n    }\n    var negated = self.condition.negate(compressor);\n    var self_condition_length = self.condition.size();\n    var negated_length = negated.size();\n    var negated_is_best = negated_length < self_condition_length;\n    if (self.alternative && negated_is_best) {\n        negated_is_best = false; // because we already do the switch here.\n        // no need to swap values of self_condition_length and negated_length\n        // here because they are only used in an equality comparison later on.\n        self.condition = negated;\n        var tmp = self.body;\n        self.body = self.alternative || make_node(AST_EmptyStatement, self);\n        self.alternative = tmp;\n    }\n    if (is_empty(self.body) && is_empty(self.alternative)) {\n        return make_node(AST_SimpleStatement, self.condition, {\n            body: self.condition.clone()\n        }).optimize(compressor);\n    }\n    if (self.body instanceof AST_SimpleStatement\n        && self.alternative instanceof AST_SimpleStatement) {\n        return make_node(AST_SimpleStatement, self, {\n            body: make_node(AST_Conditional, self, {\n                condition   : self.condition,\n                consequent  : self.body.body,\n                alternative : self.alternative.body\n            })\n        }).optimize(compressor);\n    }\n    if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) {\n        if (self_condition_length === negated_length && !negated_is_best\n            && self.condition instanceof AST_Binary && self.condition.operator == \"||\") {\n            // although the code length of self.condition and negated are the same,\n            // negated does not require additional surrounding parentheses.\n            // see https://github.com/mishoo/UglifyJS2/issues/979\n            negated_is_best = true;\n        }\n        if (negated_is_best) return make_node(AST_SimpleStatement, self, {\n            body: make_node(AST_Binary, self, {\n                operator : \"||\",\n                left     : negated,\n                right    : self.body.body\n            })\n        }).optimize(compressor);\n        return make_node(AST_SimpleStatement, self, {\n            body: make_node(AST_Binary, self, {\n                operator : \"&&\",\n                left     : self.condition,\n                right    : self.body.body\n            })\n        }).optimize(compressor);\n    }\n    if (self.body instanceof AST_EmptyStatement\n        && self.alternative instanceof AST_SimpleStatement) {\n        return make_node(AST_SimpleStatement, self, {\n            body: make_node(AST_Binary, self, {\n                operator : \"||\",\n                left     : self.condition,\n                right    : self.alternative.body\n            })\n        }).optimize(compressor);\n    }\n    if (self.body instanceof AST_Exit\n        && self.alternative instanceof AST_Exit\n        && self.body.TYPE == self.alternative.TYPE) {\n        return make_node(self.body.CTOR, self, {\n            value: make_node(AST_Conditional, self, {\n                condition   : self.condition,\n                consequent  : self.body.value || make_node(AST_Undefined, self.body),\n                alternative : self.alternative.value || make_node(AST_Undefined, self.alternative)\n            }).transform(compressor)\n        }).optimize(compressor);\n    }\n    if (self.body instanceof AST_If\n        && !self.body.alternative\n        && !self.alternative) {\n        self = make_node(AST_If, self, {\n            condition: make_node(AST_Binary, self.condition, {\n                operator: \"&&\",\n                left: self.condition,\n                right: self.body.condition\n            }),\n            body: self.body.body,\n            alternative: null\n        });\n    }\n    if (aborts(self.body)) {\n        if (self.alternative) {\n            var alt = self.alternative;\n            self.alternative = null;\n            return make_node(AST_BlockStatement, self, {\n                body: [ self, alt ]\n            }).optimize(compressor);\n        }\n    }\n    if (aborts(self.alternative)) {\n        var body = self.body;\n        self.body = self.alternative;\n        self.condition = negated_is_best ? negated : self.condition.negate(compressor);\n        self.alternative = null;\n        return make_node(AST_BlockStatement, self, {\n            body: [ self, body ]\n        }).optimize(compressor);\n    }\n    return self;\n});\n\ndef_optimize(AST_Switch, function(self, compressor) {\n    if (!compressor.option(\"switches\")) return self;\n    var branch;\n    var value = self.expression.evaluate(compressor);\n    if (!(value instanceof AST_Node)) {\n        var orig = self.expression;\n        self.expression = make_node_from_constant(value, orig);\n        self.expression = best_of_expression(self.expression.transform(compressor), orig);\n    }\n    if (!compressor.option(\"dead_code\")) return self;\n    if (value instanceof AST_Node) {\n        value = self.expression.tail_node().evaluate(compressor);\n    }\n    var decl = [];\n    var body = [];\n    var default_branch;\n    var exact_match;\n    for (var i = 0, len = self.body.length; i < len && !exact_match; i++) {\n        branch = self.body[i];\n        if (branch instanceof AST_Default) {\n            if (!default_branch) {\n                default_branch = branch;\n            } else {\n                eliminate_branch(branch, body[body.length - 1]);\n            }\n        } else if (!(value instanceof AST_Node)) {\n            var exp = branch.expression.evaluate(compressor);\n            if (!(exp instanceof AST_Node) && exp !== value) {\n                eliminate_branch(branch, body[body.length - 1]);\n                continue;\n            }\n            if (exp instanceof AST_Node) exp = branch.expression.tail_node().evaluate(compressor);\n            if (exp === value) {\n                exact_match = branch;\n                if (default_branch) {\n                    var default_index = body.indexOf(default_branch);\n                    body.splice(default_index, 1);\n                    eliminate_branch(default_branch, body[default_index - 1]);\n                    default_branch = null;\n                }\n            }\n        }\n        body.push(branch);\n    }\n    while (i < len) eliminate_branch(self.body[i++], body[body.length - 1]);\n    self.body = body;\n\n    let default_or_exact = default_branch || exact_match;\n    default_branch = null;\n    exact_match = null;\n\n    // group equivalent branches so they will be located next to each other,\n    // that way the next micro-optimization will merge them.\n    // ** bail micro-optimization if not a simple switch case with breaks\n    if (body.every((branch, i) =>\n        (branch === default_or_exact || branch.expression instanceof AST_Constant)\n        && (branch.body.length === 0 || aborts(branch) || body.length - 1 === i))\n    ) {\n        for (let i = 0; i < body.length; i++) {\n            const branch = body[i];\n            for (let j = i + 1; j < body.length; j++) {\n                const next = body[j];\n                if (next.body.length === 0) continue;\n                const last_branch = j === (body.length - 1);\n                const equivalentBranch = branches_equivalent(next, branch, false);\n                if (equivalentBranch || (last_branch && branches_equivalent(next, branch, true))) {\n                    if (!equivalentBranch && last_branch) {\n                        next.body.push(make_node(AST_Break));\n                    }\n\n                    // let's find previous siblings with inert fallthrough...\n                    let x = j - 1;\n                    let fallthroughDepth = 0;\n                    while (x > i) {\n                        if (is_inert_body(body[x--])) {\n                            fallthroughDepth++;\n                        } else {\n                            break;\n                        }\n                    }\n\n                    const plucked = body.splice(j - fallthroughDepth, 1 + fallthroughDepth);\n                    body.splice(i + 1, 0, ...plucked);\n                    i += plucked.length;\n                }\n            }\n        }\n    }\n\n    // merge equivalent branches in a row\n    for (let i = 0; i < body.length; i++) {\n        let branch = body[i];\n        if (branch.body.length === 0) continue;\n        if (!aborts(branch)) continue;\n\n        for (let j = i + 1; j < body.length; i++, j++) {\n            let next = body[j];\n            if (next.body.length === 0) continue;\n            if (\n                branches_equivalent(next, branch, false)\n                || (j === body.length - 1 && branches_equivalent(next, branch, true))\n            ) {\n                branch.body = [];\n                branch = next;\n                continue;\n            }\n            break;\n        }\n    }\n\n    // Prune any empty branches at the end of the switch statement.\n    {\n        let i = body.length - 1;\n        for (; i >= 0; i--) {\n            let bbody = body[i].body;\n            if (is_break(bbody[bbody.length - 1], compressor)) bbody.pop();\n            if (!is_inert_body(body[i])) break;\n        }\n        // i now points to the index of a branch that contains a body. By incrementing, it's\n        // pointing to the first branch that's empty.\n        i++;\n        if (!default_or_exact || body.indexOf(default_or_exact) >= i) {\n            // The default behavior is to do nothing. We can take advantage of that to\n            // remove all case expressions that are side-effect free that also do\n            // nothing, since they'll default to doing nothing. But we can't remove any\n            // case expressions before one that would side-effect, since they may cause\n            // the side-effect to be skipped.\n            for (let j = body.length - 1; j >= i; j--) {\n                let branch = body[j];\n                if (branch === default_or_exact) {\n                    default_or_exact = null;\n                    body.pop();\n                } else if (!branch.expression.has_side_effects(compressor)) {\n                    body.pop();\n                } else {\n                    break;\n                }\n            }\n        }\n    }\n\n\n    // Prune side-effect free branches that fall into default.\n    DEFAULT: if (default_or_exact) {\n        let default_index = body.indexOf(default_or_exact);\n        let default_body_index = default_index;\n        for (; default_body_index < body.length - 1; default_body_index++) {\n            if (!is_inert_body(body[default_body_index])) break;\n        }\n        if (default_body_index < body.length - 1) {\n            break DEFAULT;\n        }\n\n        let side_effect_index = body.length - 1;\n        for (; side_effect_index >= 0; side_effect_index--) {\n            let branch = body[side_effect_index];\n            if (branch === default_or_exact) continue;\n            if (branch.expression.has_side_effects(compressor)) break;\n        }\n        // If the default behavior comes after any side-effect case expressions,\n        // then we can fold all side-effect free cases into the default branch.\n        // If the side-effect case is after the default, then any side-effect\n        // free cases could prevent the side-effect from occurring.\n        if (default_body_index > side_effect_index) {\n            let prev_body_index = default_index - 1;\n            for (; prev_body_index >= 0; prev_body_index--) {\n                if (!is_inert_body(body[prev_body_index])) break;\n            }\n            let before = Math.max(side_effect_index, prev_body_index) + 1;\n            let after = default_index;\n            if (side_effect_index > default_index) {\n                // If the default falls into the same body as a side-effect\n                // case, then we need preserve that case and only prune the\n                // cases after it.\n                after = side_effect_index;\n                body[side_effect_index].body = body[default_body_index].body;\n            } else {\n                // The default will be the last branch.\n                default_or_exact.body = body[default_body_index].body;\n            }\n\n            // Prune everything after the default (or last side-effect case)\n            // until the next case with a body.\n            body.splice(after + 1, default_body_index - after);\n            // Prune everything before the default that falls into it.\n            body.splice(before, default_index - before);\n        }\n    }\n\n    // See if we can remove the switch entirely if all cases (the default) fall into the same case body.\n    DEFAULT: if (default_or_exact) {\n        let i = body.findIndex(branch => !is_inert_body(branch));\n        let caseBody;\n        // `i` is equal to one of the following:\n        // - `-1`, there is no body in the switch statement.\n        // - `body.length - 1`, all cases fall into the same body.\n        // - anything else, there are multiple bodies in the switch.\n        if (i === body.length - 1) {\n            // All cases fall into the case body.\n            let branch = body[i];\n            if (has_nested_break(self)) break DEFAULT;\n\n            // This is the last case body, and we've already pruned any breaks, so it's\n            // safe to hoist.\n            caseBody = make_node(AST_BlockStatement, branch, {\n                body: branch.body\n            });\n            branch.body = [];\n        } else if (i !== -1) {\n            // If there are multiple bodies, then we cannot optimize anything.\n            break DEFAULT;\n        }\n\n        let sideEffect = body.find(branch => {\n            return (\n                branch !== default_or_exact\n                && branch.expression.has_side_effects(compressor)\n            );\n        });\n        // If no cases cause a side-effect, we can eliminate the switch entirely.\n        if (!sideEffect) {\n            return make_node(AST_BlockStatement, self, {\n                body: decl.concat(\n                    statement(self.expression),\n                    default_or_exact.expression ? statement(default_or_exact.expression) : [],\n                    caseBody || []\n                )\n            }).optimize(compressor);\n        }\n\n        // If we're this far, either there was no body or all cases fell into the same body.\n        // If there was no body, then we don't need a default branch (because the default is\n        // do nothing). If there was a body, we'll extract it to after the switch, so the\n        // switch's new default is to do nothing and we can still prune it.\n        const default_index = body.indexOf(default_or_exact);\n        body.splice(default_index, 1);\n        default_or_exact = null;\n\n        if (caseBody) {\n            // Recurse into switch statement one more time so that we can append the case body\n            // outside of the switch. This recursion will only happen once since we've pruned\n            // the default case.\n            return make_node(AST_BlockStatement, self, {\n                body: decl.concat(self, caseBody)\n            }).optimize(compressor);\n        }\n        // If we fall here, there is a default branch somewhere, there are no case bodies,\n        // and there's a side-effect somewhere. Just let the below paths take care of it.\n    }\n\n    if (body.length > 0) {\n        body[0].body = decl.concat(body[0].body);\n    }\n\n    if (body.length == 0) {\n        return make_node(AST_BlockStatement, self, {\n            body: decl.concat(statement(self.expression))\n        }).optimize(compressor);\n    }\n    if (body.length == 1 && !has_nested_break(self)) {\n        // This is the last case body, and we've already pruned any breaks, so it's\n        // safe to hoist.\n        let branch = body[0];\n        return make_node(AST_If, self, {\n            condition: make_node(AST_Binary, self, {\n                operator: \"===\",\n                left: self.expression,\n                right: branch.expression,\n            }),\n            body: make_node(AST_BlockStatement, branch, {\n                body: branch.body\n            }),\n            alternative: null\n        }).optimize(compressor);\n    }\n    if (body.length === 2 && default_or_exact && !has_nested_break(self)) {\n        let branch = body[0] === default_or_exact ? body[1] : body[0];\n        let exact_exp = default_or_exact.expression && statement(default_or_exact.expression);\n        if (aborts(body[0])) {\n            // Only the first branch body could have a break (at the last statement)\n            let first = body[0];\n            if (is_break(first.body[first.body.length - 1], compressor)) {\n                first.body.pop();\n            }\n            return make_node(AST_If, self, {\n                condition: make_node(AST_Binary, self, {\n                    operator: \"===\",\n                    left: self.expression,\n                    right: branch.expression,\n                }),\n                body: make_node(AST_BlockStatement, branch, {\n                    body: branch.body\n                }),\n                alternative: make_node(AST_BlockStatement, default_or_exact, {\n                    body: [].concat(\n                        exact_exp || [],\n                        default_or_exact.body\n                    )\n                })\n            }).optimize(compressor);\n        }\n        let operator = \"===\";\n        let consequent = make_node(AST_BlockStatement, branch, {\n            body: branch.body,\n        });\n        let always = make_node(AST_BlockStatement, default_or_exact, {\n            body: [].concat(\n                exact_exp || [],\n                default_or_exact.body\n            )\n        });\n        if (body[0] === default_or_exact) {\n            operator = \"!==\";\n            let tmp = always;\n            always = consequent;\n            consequent = tmp;\n        }\n        return make_node(AST_BlockStatement, self, {\n            body: [\n                make_node(AST_If, self, {\n                    condition: make_node(AST_Binary, self, {\n                        operator: operator,\n                        left: self.expression,\n                        right: branch.expression,\n                    }),\n                    body: consequent,\n                    alternative: null\n                })\n            ].concat(always)\n        }).optimize(compressor);\n    }\n    return self;\n\n    function eliminate_branch(branch, prev) {\n        if (prev && !aborts(prev)) {\n            prev.body = prev.body.concat(branch.body);\n        } else {\n            trim_unreachable_code(compressor, branch, decl);\n        }\n    }\n    function branches_equivalent(branch, prev, insertBreak) {\n        let bbody = branch.body;\n        let pbody = prev.body;\n        if (insertBreak) {\n            bbody = bbody.concat(make_node(AST_Break));\n        }\n        if (bbody.length !== pbody.length) return false;\n        let bblock = make_node(AST_BlockStatement, branch, { body: bbody });\n        let pblock = make_node(AST_BlockStatement, prev, { body: pbody });\n        return bblock.equivalent_to(pblock);\n    }\n    function statement(expression) {\n        return make_node(AST_SimpleStatement, expression, {\n            body: expression\n        });\n    }\n    function has_nested_break(root) {\n        let has_break = false;\n        let tw = new TreeWalker(node => {\n            if (has_break) return true;\n            if (node instanceof AST_Lambda) return true;\n            if (node instanceof AST_SimpleStatement) return true;\n            if (!is_break(node, tw)) return;\n            let parent = tw.parent();\n            if (\n                parent instanceof AST_SwitchBranch\n                && parent.body[parent.body.length - 1] === node\n            ) {\n                return;\n            }\n            has_break = true;\n        });\n        root.walk(tw);\n        return has_break;\n    }\n    function is_break(node, stack) {\n        return node instanceof AST_Break\n            && stack.loopcontrol_target(node) === self;\n    }\n    function is_inert_body(branch) {\n        return !aborts(branch) && !make_node(AST_BlockStatement, branch, {\n            body: branch.body\n        }).has_side_effects(compressor);\n    }\n});\n\ndef_optimize(AST_Try, function(self, compressor) {\n    if (self.bcatch && self.bfinally && self.bfinally.body.every(is_empty)) self.bfinally = null;\n\n    if (compressor.option(\"dead_code\") && self.body.body.every(is_empty)) {\n        var body = [];\n        if (self.bcatch) {\n            trim_unreachable_code(compressor, self.bcatch, body);\n        }\n        if (self.bfinally) body.push(...self.bfinally.body);\n        return make_node(AST_BlockStatement, self, {\n            body: body\n        }).optimize(compressor);\n    }\n    return self;\n});\n\nAST_Definitions.DEFMETHOD(\"to_assignments\", function(compressor) {\n    var reduce_vars = compressor.option(\"reduce_vars\");\n    var assignments = [];\n\n    for (const def of this.definitions) {\n        if (def.value) {\n            var name = make_node(AST_SymbolRef, def.name, def.name);\n            assignments.push(make_node(AST_Assign, def, {\n                operator : \"=\",\n                logical: false,\n                left     : name,\n                right    : def.value\n            }));\n            if (reduce_vars) name.definition().fixed = false;\n        }\n        const thedef = def.name.definition();\n        thedef.eliminated++;\n        thedef.replaced--;\n    }\n\n    if (assignments.length == 0) return null;\n    return make_sequence(this, assignments);\n});\n\ndef_optimize(AST_Definitions, function(self) {\n    if (self.definitions.length == 0) {\n        return make_node(AST_EmptyStatement, self);\n    }\n    return self;\n});\n\ndef_optimize(AST_VarDef, function(self, compressor) {\n    if (\n        self.name instanceof AST_SymbolLet\n        && self.value != null\n        && is_undefined(self.value, compressor)\n    ) {\n        self.value = null;\n    }\n    return self;\n});\n\ndef_optimize(AST_Import, function(self) {\n    return self;\n});\n\ndef_optimize(AST_Call, function(self, compressor) {\n    var exp = self.expression;\n    var fn = exp;\n    inline_array_like_spread(self.args);\n    var simple_args = self.args.every((arg) =>\n        !(arg instanceof AST_Expansion)\n    );\n\n    if (compressor.option(\"reduce_vars\")\n        && fn instanceof AST_SymbolRef\n        && !has_annotation(self, _NOINLINE)\n    ) {\n        const fixed = fn.fixed_value();\n        if (!retain_top_func(fixed, compressor)) {\n            fn = fixed;\n        }\n    }\n\n    var is_func = fn instanceof AST_Lambda;\n\n    if (is_func && fn.pinned()) return self;\n\n    if (compressor.option(\"unused\")\n        && simple_args\n        && is_func\n        && !fn.uses_arguments) {\n        var pos = 0, last = 0;\n        for (var i = 0, len = self.args.length; i < len; i++) {\n            if (fn.argnames[i] instanceof AST_Expansion) {\n                if (has_flag(fn.argnames[i].expression, UNUSED)) while (i < len) {\n                    var node = self.args[i++].drop_side_effect_free(compressor);\n                    if (node) {\n                        self.args[pos++] = node;\n                    }\n                } else while (i < len) {\n                    self.args[pos++] = self.args[i++];\n                }\n                last = pos;\n                break;\n            }\n            var trim = i >= fn.argnames.length;\n            if (trim || has_flag(fn.argnames[i], UNUSED)) {\n                var node = self.args[i].drop_side_effect_free(compressor);\n                if (node) {\n                    self.args[pos++] = node;\n                } else if (!trim) {\n                    self.args[pos++] = make_node(AST_Number, self.args[i], {\n                        value: 0\n                    });\n                    continue;\n                }\n            } else {\n                self.args[pos++] = self.args[i];\n            }\n            last = pos;\n        }\n        self.args.length = last;\n    }\n\n    if (compressor.option(\"unsafe\")) {\n        if (exp instanceof AST_Dot && exp.start.value === \"Array\" && exp.property === \"from\" && self.args.length === 1) {\n            const [argument] = self.args;\n            if (argument instanceof AST_Array) {\n                return make_node(AST_Array, argument, {\n                    elements: argument.elements\n                }).optimize(compressor);\n            }\n        }\n        if (is_undeclared_ref(exp)) switch (exp.name) {\n          case \"Array\":\n            if (self.args.length != 1) {\n                return make_node(AST_Array, self, {\n                    elements: self.args\n                }).optimize(compressor);\n            } else if (self.args[0] instanceof AST_Number && self.args[0].value <= 11) {\n                const elements = [];\n                for (let i = 0; i < self.args[0].value; i++) elements.push(new AST_Hole);\n                return new AST_Array({ elements });\n            }\n            break;\n          case \"Object\":\n            if (self.args.length == 0) {\n                return make_node(AST_Object, self, {\n                    properties: []\n                });\n            }\n            break;\n          case \"String\":\n            if (self.args.length == 0) return make_node(AST_String, self, {\n                value: \"\"\n            });\n            if (self.args.length <= 1) return make_node(AST_Binary, self, {\n                left: self.args[0],\n                operator: \"+\",\n                right: make_node(AST_String, self, { value: \"\" })\n            }).optimize(compressor);\n            break;\n          case \"Number\":\n            if (self.args.length == 0) return make_node(AST_Number, self, {\n                value: 0\n            });\n            if (self.args.length == 1 && compressor.option(\"unsafe_math\")) {\n                return make_node(AST_UnaryPrefix, self, {\n                    expression: self.args[0],\n                    operator: \"+\"\n                }).optimize(compressor);\n            }\n            break;\n          case \"Symbol\":\n            if (self.args.length == 1 && self.args[0] instanceof AST_String && compressor.option(\"unsafe_symbols\"))\n                self.args.length = 0;\n                break;\n          case \"Boolean\":\n            if (self.args.length == 0) return make_node(AST_False, self);\n            if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, {\n                expression: make_node(AST_UnaryPrefix, self, {\n                    expression: self.args[0],\n                    operator: \"!\"\n                }),\n                operator: \"!\"\n            }).optimize(compressor);\n            break;\n          case \"RegExp\":\n            var params = [];\n            if (self.args.length >= 1\n                && self.args.length <= 2\n                && self.args.every((arg) => {\n                    var value = arg.evaluate(compressor);\n                    params.push(value);\n                    return arg !== value;\n                })\n                && regexp_is_safe(params[0])\n            ) {\n                let [ source, flags ] = params;\n                source = regexp_source_fix(new RegExp(source).source);\n                const rx = make_node(AST_RegExp, self, {\n                    value: { source, flags }\n                });\n                if (rx._eval(compressor) !== rx) {\n                    return rx;\n                }\n            }\n            break;\n        } else if (exp instanceof AST_Dot) switch(exp.property) {\n          case \"toString\":\n            if (self.args.length == 0 && !exp.expression.may_throw_on_access(compressor)) {\n                return make_node(AST_Binary, self, {\n                    left: make_node(AST_String, self, { value: \"\" }),\n                    operator: \"+\",\n                    right: exp.expression\n                }).optimize(compressor);\n            }\n            break;\n          case \"join\":\n            if (exp.expression instanceof AST_Array) EXIT: {\n                var separator;\n                if (self.args.length > 0) {\n                    separator = self.args[0].evaluate(compressor);\n                    if (separator === self.args[0]) break EXIT; // not a constant\n                }\n                var elements = [];\n                var consts = [];\n                for (var i = 0, len = exp.expression.elements.length; i < len; i++) {\n                    var el = exp.expression.elements[i];\n                    if (el instanceof AST_Expansion) break EXIT;\n                    var value = el.evaluate(compressor);\n                    if (value !== el) {\n                        consts.push(value);\n                    } else {\n                        if (consts.length > 0) {\n                            elements.push(make_node(AST_String, self, {\n                                value: consts.join(separator)\n                            }));\n                            consts.length = 0;\n                        }\n                        elements.push(el);\n                    }\n                }\n                if (consts.length > 0) {\n                    elements.push(make_node(AST_String, self, {\n                        value: consts.join(separator)\n                    }));\n                }\n                if (elements.length == 0) return make_node(AST_String, self, { value: \"\" });\n                if (elements.length == 1) {\n                    if (elements[0].is_string(compressor)) {\n                        return elements[0];\n                    }\n                    return make_node(AST_Binary, elements[0], {\n                        operator : \"+\",\n                        left     : make_node(AST_String, self, { value: \"\" }),\n                        right    : elements[0]\n                    });\n                }\n                if (separator == \"\") {\n                    var first;\n                    if (elements[0].is_string(compressor)\n                        || elements[1].is_string(compressor)) {\n                        first = elements.shift();\n                    } else {\n                        first = make_node(AST_String, self, { value: \"\" });\n                    }\n                    return elements.reduce(function(prev, el) {\n                        return make_node(AST_Binary, el, {\n                            operator : \"+\",\n                            left     : prev,\n                            right    : el\n                        });\n                    }, first).optimize(compressor);\n                }\n                // need this awkward cloning to not affect original element\n                // best_of will decide which one to get through.\n                var node = self.clone();\n                node.expression = node.expression.clone();\n                node.expression.expression = node.expression.expression.clone();\n                node.expression.expression.elements = elements;\n                return best_of(compressor, self, node);\n            }\n            break;\n          case \"charAt\":\n            if (exp.expression.is_string(compressor)) {\n                var arg = self.args[0];\n                var index = arg ? arg.evaluate(compressor) : 0;\n                if (index !== arg) {\n                    return make_node(AST_Sub, exp, {\n                        expression: exp.expression,\n                        property: make_node_from_constant(index | 0, arg || exp)\n                    }).optimize(compressor);\n                }\n            }\n            break;\n          case \"apply\":\n            if (self.args.length == 2 && self.args[1] instanceof AST_Array) {\n                var args = self.args[1].elements.slice();\n                args.unshift(self.args[0]);\n                return make_node(AST_Call, self, {\n                    expression: make_node(AST_Dot, exp, {\n                        expression: exp.expression,\n                        optional: false,\n                        property: \"call\"\n                    }),\n                    args: args\n                }).optimize(compressor);\n            }\n            break;\n          case \"call\":\n            var func = exp.expression;\n            if (func instanceof AST_SymbolRef) {\n                func = func.fixed_value();\n            }\n            if (func instanceof AST_Lambda && !func.contains_this()) {\n                return (self.args.length ? make_sequence(this, [\n                    self.args[0],\n                    make_node(AST_Call, self, {\n                        expression: exp.expression,\n                        args: self.args.slice(1)\n                    })\n                ]) : make_node(AST_Call, self, {\n                    expression: exp.expression,\n                    args: []\n                })).optimize(compressor);\n            }\n            break;\n        }\n    }\n\n    if (compressor.option(\"unsafe_Function\")\n        && is_undeclared_ref(exp)\n        && exp.name == \"Function\") {\n        // new Function() => function(){}\n        if (self.args.length == 0) return make_node(AST_Function, self, {\n            argnames: [],\n            body: []\n        }).optimize(compressor);\n        var nth_identifier = compressor.mangle_options && compressor.mangle_options.nth_identifier || base54;\n        if (self.args.every((x) => x instanceof AST_String)) {\n            // quite a corner-case, but we can handle it:\n            //   https://github.com/mishoo/UglifyJS2/issues/203\n            // if the code argument is a constant, then we can minify it.\n            try {\n                var code = \"n(function(\" + self.args.slice(0, -1).map(function(arg) {\n                    return arg.value;\n                }).join(\",\") + \"){\" + self.args[self.args.length - 1].value + \"})\";\n                var ast = parse(code);\n                var mangle = { ie8: compressor.option(\"ie8\"), nth_identifier: nth_identifier };\n                ast.figure_out_scope(mangle);\n                var comp = new Compressor(compressor.options, {\n                    mangle_options: compressor.mangle_options\n                });\n                ast = ast.transform(comp);\n                ast.figure_out_scope(mangle);\n                ast.compute_char_frequency(mangle);\n                ast.mangle_names(mangle);\n                var fun;\n                walk(ast, node => {\n                    if (is_func_expr(node)) {\n                        fun = node;\n                        return walk_abort;\n                    }\n                });\n                var code = OutputStream();\n                AST_BlockStatement.prototype._codegen.call(fun, fun, code);\n                self.args = [\n                    make_node(AST_String, self, {\n                        value: fun.argnames.map(function(arg) {\n                            return arg.print_to_string();\n                        }).join(\",\")\n                    }),\n                    make_node(AST_String, self.args[self.args.length - 1], {\n                        value: code.get().replace(/^{|}$/g, \"\")\n                    })\n                ];\n                return self;\n            } catch (ex) {\n                if (!(ex instanceof JS_Parse_Error)) {\n                    throw ex;\n                }\n\n                // Otherwise, it crashes at runtime. Or maybe it's nonstandard syntax.\n            }\n        }\n    }\n\n    return inline_into_call(self, fn, compressor);\n});\n\ndef_optimize(AST_New, function(self, compressor) {\n    if (\n        compressor.option(\"unsafe\") &&\n        is_undeclared_ref(self.expression) &&\n        [\"Object\", \"RegExp\", \"Function\", \"Error\", \"Array\"].includes(self.expression.name)\n    ) return make_node(AST_Call, self, self).transform(compressor);\n    return self;\n});\n\ndef_optimize(AST_Sequence, function(self, compressor) {\n    if (!compressor.option(\"side_effects\")) return self;\n    var expressions = [];\n    filter_for_side_effects();\n    var end = expressions.length - 1;\n    trim_right_for_undefined();\n    if (end == 0) {\n        self = maintain_this_binding(compressor.parent(), compressor.self(), expressions[0]);\n        if (!(self instanceof AST_Sequence)) self = self.optimize(compressor);\n        return self;\n    }\n    self.expressions = expressions;\n    return self;\n\n    function filter_for_side_effects() {\n        var first = first_in_statement(compressor);\n        var last = self.expressions.length - 1;\n        self.expressions.forEach(function(expr, index) {\n            if (index < last) expr = expr.drop_side_effect_free(compressor, first);\n            if (expr) {\n                merge_sequence(expressions, expr);\n                first = false;\n            }\n        });\n    }\n\n    function trim_right_for_undefined() {\n        while (end > 0 && is_undefined(expressions[end], compressor)) end--;\n        if (end < expressions.length - 1) {\n            expressions[end] = make_node(AST_UnaryPrefix, self, {\n                operator   : \"void\",\n                expression : expressions[end]\n            });\n            expressions.length = end + 1;\n        }\n    }\n});\n\nAST_Unary.DEFMETHOD(\"lift_sequences\", function(compressor) {\n    if (compressor.option(\"sequences\")) {\n        if (this.expression instanceof AST_Sequence) {\n            var x = this.expression.expressions.slice();\n            var e = this.clone();\n            e.expression = x.pop();\n            x.push(e);\n            return make_sequence(this, x).optimize(compressor);\n        }\n    }\n    return this;\n});\n\ndef_optimize(AST_UnaryPostfix, function(self, compressor) {\n    return self.lift_sequences(compressor);\n});\n\ndef_optimize(AST_UnaryPrefix, function(self, compressor) {\n    var e = self.expression;\n    if (\n        self.operator == \"delete\" &&\n        !(\n            e instanceof AST_SymbolRef ||\n            e instanceof AST_PropAccess ||\n            e instanceof AST_Chain ||\n            is_identifier_atom(e)\n        )\n    ) {\n        return make_sequence(self, [e, make_node(AST_True, self)]).optimize(compressor);\n    }\n    var seq = self.lift_sequences(compressor);\n    if (seq !== self) {\n        return seq;\n    }\n    if (compressor.option(\"side_effects\") && self.operator == \"void\") {\n        e = e.drop_side_effect_free(compressor);\n        if (e) {\n            self.expression = e;\n            return self;\n        } else {\n            return make_node(AST_Undefined, self).optimize(compressor);\n        }\n    }\n    if (compressor.in_boolean_context()) {\n        switch (self.operator) {\n          case \"!\":\n            if (e instanceof AST_UnaryPrefix && e.operator == \"!\") {\n                // !!foo ==> foo, if we're in boolean context\n                return e.expression;\n            }\n            if (e instanceof AST_Binary) {\n                self = best_of(compressor, self, e.negate(compressor, first_in_statement(compressor)));\n            }\n            break;\n          case \"typeof\":\n            // typeof always returns a non-empty string, thus it's\n            // always true in booleans\n            // And we don't need to check if it's undeclared, because in typeof, that's OK\n            return (e instanceof AST_SymbolRef ? make_node(AST_True, self) : make_sequence(self, [\n                e,\n                make_node(AST_True, self)\n            ])).optimize(compressor);\n        }\n    }\n    if (self.operator == \"-\" && e instanceof AST_Infinity) {\n        e = e.transform(compressor);\n    }\n    if (e instanceof AST_Binary\n        && (self.operator == \"+\" || self.operator == \"-\")\n        && (e.operator == \"*\" || e.operator == \"/\" || e.operator == \"%\")) {\n        return make_node(AST_Binary, self, {\n            operator: e.operator,\n            left: make_node(AST_UnaryPrefix, e.left, {\n                operator: self.operator,\n                expression: e.left\n            }),\n            right: e.right\n        });\n    }\n    // avoids infinite recursion of numerals\n    if (self.operator != \"-\"\n        || !(e instanceof AST_Number || e instanceof AST_Infinity || e instanceof AST_BigInt)) {\n        var ev = self.evaluate(compressor);\n        if (ev !== self) {\n            ev = make_node_from_constant(ev, self).optimize(compressor);\n            return best_of(compressor, ev, self);\n        }\n    }\n    return self;\n});\n\nAST_Binary.DEFMETHOD(\"lift_sequences\", function(compressor) {\n    if (compressor.option(\"sequences\")) {\n        if (this.left instanceof AST_Sequence) {\n            var x = this.left.expressions.slice();\n            var e = this.clone();\n            e.left = x.pop();\n            x.push(e);\n            return make_sequence(this, x).optimize(compressor);\n        }\n        if (this.right instanceof AST_Sequence && !this.left.has_side_effects(compressor)) {\n            var assign = this.operator == \"=\" && this.left instanceof AST_SymbolRef;\n            var x = this.right.expressions;\n            var last = x.length - 1;\n            for (var i = 0; i < last; i++) {\n                if (!assign && x[i].has_side_effects(compressor)) break;\n            }\n            if (i == last) {\n                x = x.slice();\n                var e = this.clone();\n                e.right = x.pop();\n                x.push(e);\n                return make_sequence(this, x).optimize(compressor);\n            } else if (i > 0) {\n                var e = this.clone();\n                e.right = make_sequence(this.right, x.slice(i));\n                x = x.slice(0, i);\n                x.push(e);\n                return make_sequence(this, x).optimize(compressor);\n            }\n        }\n    }\n    return this;\n});\n\nvar commutativeOperators = makePredicate(\"== === != !== * & | ^\");\nfunction is_object(node) {\n    return node instanceof AST_Array\n        || node instanceof AST_Lambda\n        || node instanceof AST_Object\n        || node instanceof AST_Class;\n}\n\ndef_optimize(AST_Binary, function(self, compressor) {\n    function reversible() {\n        return self.left.is_constant()\n            || self.right.is_constant()\n            || !self.left.has_side_effects(compressor)\n                && !self.right.has_side_effects(compressor);\n    }\n    function reverse(op) {\n        if (reversible()) {\n            if (op) self.operator = op;\n            var tmp = self.left;\n            self.left = self.right;\n            self.right = tmp;\n        }\n    }\n    if (compressor.option(\"lhs_constants\") && commutativeOperators.has(self.operator)) {\n        if (self.right.is_constant()\n            && !self.left.is_constant()) {\n            // if right is a constant, whatever side effects the\n            // left side might have could not influence the\n            // result.  hence, force switch.\n\n            if (!(self.left instanceof AST_Binary\n                  && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) {\n                reverse();\n            }\n        }\n    }\n    self = self.lift_sequences(compressor);\n    if (compressor.option(\"comparisons\")) switch (self.operator) {\n      case \"===\":\n      case \"!==\":\n        var is_strict_comparison = true;\n        if ((self.left.is_string(compressor) && self.right.is_string(compressor)) ||\n            (self.left.is_number(compressor) && self.right.is_number(compressor)) ||\n            (self.left.is_boolean() && self.right.is_boolean()) ||\n            self.left.equivalent_to(self.right)) {\n            self.operator = self.operator.substr(0, 2);\n        }\n        // XXX: intentionally falling down to the next case\n      case \"==\":\n      case \"!=\":\n        // void 0 == x => null == x\n        if (!is_strict_comparison && is_undefined(self.left, compressor)) {\n            self.left = make_node(AST_Null, self.left);\n        // x == void 0 => x == null\n        } else if (!is_strict_comparison && is_undefined(self.right, compressor)) {\n            self.right = make_node(AST_Null, self.right);\n        } else if (compressor.option(\"typeofs\")\n            // \"undefined\" == typeof x => undefined === x\n            && self.left instanceof AST_String\n            && self.left.value == \"undefined\"\n            && self.right instanceof AST_UnaryPrefix\n            && self.right.operator == \"typeof\") {\n            var expr = self.right.expression;\n            if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor)\n                : !(expr instanceof AST_PropAccess && compressor.option(\"ie8\"))) {\n                self.right = expr;\n                self.left = make_node(AST_Undefined, self.left).optimize(compressor);\n                if (self.operator.length == 2) self.operator += \"=\";\n            }\n        } else if (compressor.option(\"typeofs\")\n            // typeof x === \"undefined\" => x === undefined\n            && self.left instanceof AST_UnaryPrefix\n            && self.left.operator == \"typeof\"\n            && self.right instanceof AST_String\n            && self.right.value == \"undefined\") {\n            var expr = self.left.expression;\n            if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor)\n                : !(expr instanceof AST_PropAccess && compressor.option(\"ie8\"))) {\n                self.left = expr;\n                self.right = make_node(AST_Undefined, self.right).optimize(compressor);\n                if (self.operator.length == 2) self.operator += \"=\";\n            }\n        } else if (self.left instanceof AST_SymbolRef\n            // obj !== obj => false\n            && self.right instanceof AST_SymbolRef\n            && self.left.definition() === self.right.definition()\n            && is_object(self.left.fixed_value())) {\n            return make_node(self.operator[0] == \"=\" ? AST_True : AST_False, self);\n        }\n        break;\n      case \"&&\":\n      case \"||\":\n        var lhs = self.left;\n        if (lhs.operator == self.operator) {\n            lhs = lhs.right;\n        }\n        if (lhs instanceof AST_Binary\n            && lhs.operator == (self.operator == \"&&\" ? \"!==\" : \"===\")\n            && self.right instanceof AST_Binary\n            && lhs.operator == self.right.operator\n            && (is_undefined(lhs.left, compressor) && self.right.left instanceof AST_Null\n                || lhs.left instanceof AST_Null && is_undefined(self.right.left, compressor))\n            && !lhs.right.has_side_effects(compressor)\n            && lhs.right.equivalent_to(self.right.right)) {\n            var combined = make_node(AST_Binary, self, {\n                operator: lhs.operator.slice(0, -1),\n                left: make_node(AST_Null, self),\n                right: lhs.right\n            });\n            if (lhs !== self.left) {\n                combined = make_node(AST_Binary, self, {\n                    operator: self.operator,\n                    left: self.left.left,\n                    right: combined\n                });\n            }\n            return combined;\n        }\n        break;\n    }\n    if (self.operator == \"+\" && compressor.in_boolean_context()) {\n        var ll = self.left.evaluate(compressor);\n        var rr = self.right.evaluate(compressor);\n        if (ll && typeof ll == \"string\") {\n            return make_sequence(self, [\n                self.right,\n                make_node(AST_True, self)\n            ]).optimize(compressor);\n        }\n        if (rr && typeof rr == \"string\") {\n            return make_sequence(self, [\n                self.left,\n                make_node(AST_True, self)\n            ]).optimize(compressor);\n        }\n    }\n    if (compressor.option(\"comparisons\") && self.is_boolean()) {\n        if (!(compressor.parent() instanceof AST_Binary)\n            || compressor.parent() instanceof AST_Assign) {\n            var negated = make_node(AST_UnaryPrefix, self, {\n                operator: \"!\",\n                expression: self.negate(compressor, first_in_statement(compressor))\n            });\n            self = best_of(compressor, self, negated);\n        }\n        if (compressor.option(\"unsafe_comps\")) {\n            switch (self.operator) {\n              case \"<\": reverse(\">\"); break;\n              case \"<=\": reverse(\">=\"); break;\n            }\n        }\n    }\n    if (self.operator == \"+\") {\n        if (self.right instanceof AST_String\n            && self.right.getValue() == \"\"\n            && self.left.is_string(compressor)) {\n            return self.left;\n        }\n        if (self.left instanceof AST_String\n            && self.left.getValue() == \"\"\n            && self.right.is_string(compressor)) {\n            return self.right;\n        }\n        if (self.left instanceof AST_Binary\n            && self.left.operator == \"+\"\n            && self.left.left instanceof AST_String\n            && self.left.left.getValue() == \"\"\n            && self.right.is_string(compressor)) {\n            self.left = self.left.right;\n            return self;\n        }\n    }\n    if (compressor.option(\"evaluate\")) {\n        switch (self.operator) {\n          case \"&&\":\n            var ll = has_flag(self.left, TRUTHY)\n                ? true\n                : has_flag(self.left, FALSY)\n                    ? false\n                    : self.left.evaluate(compressor);\n            if (!ll) {\n                return maintain_this_binding(compressor.parent(), compressor.self(), self.left).optimize(compressor);\n            } else if (!(ll instanceof AST_Node)) {\n                return make_sequence(self, [ self.left, self.right ]).optimize(compressor);\n            }\n            var rr = self.right.evaluate(compressor);\n            if (!rr) {\n                if (compressor.in_boolean_context()) {\n                    return make_sequence(self, [\n                        self.left,\n                        make_node(AST_False, self)\n                    ]).optimize(compressor);\n                } else {\n                    set_flag(self, FALSY);\n                }\n            } else if (!(rr instanceof AST_Node)) {\n                var parent = compressor.parent();\n                if (parent.operator == \"&&\" && parent.left === compressor.self() || compressor.in_boolean_context()) {\n                    return self.left.optimize(compressor);\n                }\n            }\n            // x || false && y ---> x ? y : false\n            if (self.left.operator == \"||\") {\n                var lr = self.left.right.evaluate(compressor);\n                if (!lr) return make_node(AST_Conditional, self, {\n                    condition: self.left.left,\n                    consequent: self.right,\n                    alternative: self.left.right\n                }).optimize(compressor);\n            }\n            break;\n          case \"||\":\n            var ll = has_flag(self.left, TRUTHY)\n              ? true\n              : has_flag(self.left, FALSY)\n                ? false\n                : self.left.evaluate(compressor);\n            if (!ll) {\n                return make_sequence(self, [ self.left, self.right ]).optimize(compressor);\n            } else if (!(ll instanceof AST_Node)) {\n                return maintain_this_binding(compressor.parent(), compressor.self(), self.left).optimize(compressor);\n            }\n            var rr = self.right.evaluate(compressor);\n            if (!rr) {\n                var parent = compressor.parent();\n                if (parent.operator == \"||\" && parent.left === compressor.self() || compressor.in_boolean_context()) {\n                    return self.left.optimize(compressor);\n                }\n            } else if (!(rr instanceof AST_Node)) {\n                if (compressor.in_boolean_context()) {\n                    return make_sequence(self, [\n                        self.left,\n                        make_node(AST_True, self)\n                    ]).optimize(compressor);\n                } else {\n                    set_flag(self, TRUTHY);\n                }\n            }\n            if (self.left.operator == \"&&\") {\n                var lr = self.left.right.evaluate(compressor);\n                if (lr && !(lr instanceof AST_Node)) return make_node(AST_Conditional, self, {\n                    condition: self.left.left,\n                    consequent: self.left.right,\n                    alternative: self.right\n                }).optimize(compressor);\n            }\n            break;\n          case \"??\":\n            if (is_nullish(self.left, compressor)) {\n                return self.right;\n            }\n\n            var ll = self.left.evaluate(compressor);\n            if (!(ll instanceof AST_Node)) {\n                // if we know the value for sure we can simply compute right away.\n                return ll == null ? self.right : self.left;\n            }\n\n            if (compressor.in_boolean_context()) {\n                const rr = self.right.evaluate(compressor);\n                if (!(rr instanceof AST_Node) && !rr) {\n                    return self.left;\n                }\n            }\n        }\n        var associative = true;\n        switch (self.operator) {\n          case \"+\":\n            // (x + \"foo\") + \"bar\" => x + \"foobar\"\n            if (self.right instanceof AST_Constant\n                && self.left instanceof AST_Binary\n                && self.left.operator == \"+\"\n                && self.left.is_string(compressor)) {\n                var binary = make_node(AST_Binary, self, {\n                    operator: \"+\",\n                    left: self.left.right,\n                    right: self.right,\n                });\n                var r = binary.optimize(compressor);\n                if (binary !== r) {\n                    self = make_node(AST_Binary, self, {\n                        operator: \"+\",\n                        left: self.left.left,\n                        right: r\n                    });\n                }\n            }\n            // (x + \"foo\") + (\"bar\" + y) => (x + \"foobar\") + y\n            if (self.left instanceof AST_Binary\n                && self.left.operator == \"+\"\n                && self.left.is_string(compressor)\n                && self.right instanceof AST_Binary\n                && self.right.operator == \"+\"\n                && self.right.is_string(compressor)) {\n                var binary = make_node(AST_Binary, self, {\n                    operator: \"+\",\n                    left: self.left.right,\n                    right: self.right.left,\n                });\n                var m = binary.optimize(compressor);\n                if (binary !== m) {\n                    self = make_node(AST_Binary, self, {\n                        operator: \"+\",\n                        left: make_node(AST_Binary, self.left, {\n                            operator: \"+\",\n                            left: self.left.left,\n                            right: m\n                        }),\n                        right: self.right.right\n                    });\n                }\n            }\n            // a + -b => a - b\n            if (self.right instanceof AST_UnaryPrefix\n                && self.right.operator == \"-\"\n                && self.left.is_number(compressor)) {\n                self = make_node(AST_Binary, self, {\n                    operator: \"-\",\n                    left: self.left,\n                    right: self.right.expression\n                });\n                break;\n            }\n            // -a + b => b - a\n            if (self.left instanceof AST_UnaryPrefix\n                && self.left.operator == \"-\"\n                && reversible()\n                && self.right.is_number(compressor)) {\n                self = make_node(AST_Binary, self, {\n                    operator: \"-\",\n                    left: self.right,\n                    right: self.left.expression\n                });\n                break;\n            }\n            // `foo${bar}baz` + 1 => `foo${bar}baz1`\n            if (self.left instanceof AST_TemplateString) {\n                var l = self.left;\n                var r = self.right.evaluate(compressor);\n                if (r != self.right) {\n                    l.segments[l.segments.length - 1].value += String(r);\n                    return l;\n                }\n            }\n            // 1 + `foo${bar}baz` => `1foo${bar}baz`\n            if (self.right instanceof AST_TemplateString) {\n                var r = self.right;\n                var l = self.left.evaluate(compressor);\n                if (l != self.left) {\n                    r.segments[0].value = String(l) + r.segments[0].value;\n                    return r;\n                }\n            }\n            // `1${bar}2` + `foo${bar}baz` => `1${bar}2foo${bar}baz`\n            if (self.left instanceof AST_TemplateString\n                && self.right instanceof AST_TemplateString) {\n                var l = self.left;\n                var segments = l.segments;\n                var r = self.right;\n                segments[segments.length - 1].value += r.segments[0].value;\n                for (var i = 1; i < r.segments.length; i++) {\n                    segments.push(r.segments[i]);\n                }\n                return l;\n            }\n          case \"*\":\n            associative = compressor.option(\"unsafe_math\");\n          case \"&\":\n          case \"|\":\n          case \"^\":\n            // a + +b => +b + a\n            if (self.left.is_number(compressor)\n                && self.right.is_number(compressor)\n                && reversible()\n                && !(self.left instanceof AST_Binary\n                    && self.left.operator != self.operator\n                    && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) {\n                var reversed = make_node(AST_Binary, self, {\n                    operator: self.operator,\n                    left: self.right,\n                    right: self.left\n                });\n                if (self.right instanceof AST_Constant\n                    && !(self.left instanceof AST_Constant)) {\n                    self = best_of(compressor, reversed, self);\n                } else {\n                    self = best_of(compressor, self, reversed);\n                }\n            }\n            if (associative && self.is_number(compressor)) {\n                // a + (b + c) => (a + b) + c\n                if (self.right instanceof AST_Binary\n                    && self.right.operator == self.operator) {\n                    self = make_node(AST_Binary, self, {\n                        operator: self.operator,\n                        left: make_node(AST_Binary, self.left, {\n                            operator: self.operator,\n                            left: self.left,\n                            right: self.right.left,\n                            start: self.left.start,\n                            end: self.right.left.end\n                        }),\n                        right: self.right.right\n                    });\n                }\n                // (n + 2) + 3 => 5 + n\n                // (2 * n) * 3 => 6 + n\n                if (self.right instanceof AST_Constant\n                    && self.left instanceof AST_Binary\n                    && self.left.operator == self.operator) {\n                    if (self.left.left instanceof AST_Constant) {\n                        self = make_node(AST_Binary, self, {\n                            operator: self.operator,\n                            left: make_node(AST_Binary, self.left, {\n                                operator: self.operator,\n                                left: self.left.left,\n                                right: self.right,\n                                start: self.left.left.start,\n                                end: self.right.end\n                            }),\n                            right: self.left.right\n                        });\n                    } else if (self.left.right instanceof AST_Constant) {\n                        self = make_node(AST_Binary, self, {\n                            operator: self.operator,\n                            left: make_node(AST_Binary, self.left, {\n                                operator: self.operator,\n                                left: self.left.right,\n                                right: self.right,\n                                start: self.left.right.start,\n                                end: self.right.end\n                            }),\n                            right: self.left.left\n                        });\n                    }\n                }\n                // (a | 1) | (2 | d) => (3 | a) | b\n                if (self.left instanceof AST_Binary\n                    && self.left.operator == self.operator\n                    && self.left.right instanceof AST_Constant\n                    && self.right instanceof AST_Binary\n                    && self.right.operator == self.operator\n                    && self.right.left instanceof AST_Constant) {\n                    self = make_node(AST_Binary, self, {\n                        operator: self.operator,\n                        left: make_node(AST_Binary, self.left, {\n                            operator: self.operator,\n                            left: make_node(AST_Binary, self.left.left, {\n                                operator: self.operator,\n                                left: self.left.right,\n                                right: self.right.left,\n                                start: self.left.right.start,\n                                end: self.right.left.end\n                            }),\n                            right: self.left.left\n                        }),\n                        right: self.right.right\n                    });\n                }\n            }\n        }\n    }\n    // x && (y && z)  ==>  x && y && z\n    // x || (y || z)  ==>  x || y || z\n    // x + (\"y\" + z)  ==>  x + \"y\" + z\n    // \"x\" + (y + \"z\")==>  \"x\" + y + \"z\"\n    if (self.right instanceof AST_Binary\n        && self.right.operator == self.operator\n        && (lazy_op.has(self.operator)\n            || (self.operator == \"+\"\n                && (self.right.left.is_string(compressor)\n                    || (self.left.is_string(compressor)\n                        && self.right.right.is_string(compressor)))))\n    ) {\n        self.left = make_node(AST_Binary, self.left, {\n            operator : self.operator,\n            left     : self.left.transform(compressor),\n            right    : self.right.left.transform(compressor)\n        });\n        self.right = self.right.right.transform(compressor);\n        return self.transform(compressor);\n    }\n    var ev = self.evaluate(compressor);\n    if (ev !== self) {\n        ev = make_node_from_constant(ev, self).optimize(compressor);\n        return best_of(compressor, ev, self);\n    }\n    return self;\n});\n\ndef_optimize(AST_SymbolExport, function(self) {\n    return self;\n});\n\ndef_optimize(AST_SymbolRef, function(self, compressor) {\n    if (\n        !compressor.option(\"ie8\")\n        && is_undeclared_ref(self)\n        && !compressor.find_parent(AST_With)\n    ) {\n        switch (self.name) {\n          case \"undefined\":\n            return make_node(AST_Undefined, self).optimize(compressor);\n          case \"NaN\":\n            return make_node(AST_NaN, self).optimize(compressor);\n          case \"Infinity\":\n            return make_node(AST_Infinity, self).optimize(compressor);\n        }\n    }\n\n    if (compressor.option(\"reduce_vars\") && !compressor.is_lhs()) {\n        return inline_into_symbolref(self, compressor);\n    } else {\n        return self;\n    }\n});\n\nfunction is_atomic(lhs, self) {\n    return lhs instanceof AST_SymbolRef || lhs.TYPE === self.TYPE;\n}\n\ndef_optimize(AST_Undefined, function(self, compressor) {\n    if (compressor.option(\"unsafe_undefined\")) {\n        var undef = find_variable(compressor, \"undefined\");\n        if (undef) {\n            var ref = make_node(AST_SymbolRef, self, {\n                name   : \"undefined\",\n                scope  : undef.scope,\n                thedef : undef\n            });\n            set_flag(ref, UNDEFINED);\n            return ref;\n        }\n    }\n    var lhs = compressor.is_lhs();\n    if (lhs && is_atomic(lhs, self)) return self;\n    return make_node(AST_UnaryPrefix, self, {\n        operator: \"void\",\n        expression: make_node(AST_Number, self, {\n            value: 0\n        })\n    });\n});\n\ndef_optimize(AST_Infinity, function(self, compressor) {\n    var lhs = compressor.is_lhs();\n    if (lhs && is_atomic(lhs, self)) return self;\n    if (\n        compressor.option(\"keep_infinity\")\n        && !(lhs && !is_atomic(lhs, self))\n        && !find_variable(compressor, \"Infinity\")\n    ) {\n        return self;\n    }\n    return make_node(AST_Binary, self, {\n        operator: \"/\",\n        left: make_node(AST_Number, self, {\n            value: 1\n        }),\n        right: make_node(AST_Number, self, {\n            value: 0\n        })\n    });\n});\n\ndef_optimize(AST_NaN, function(self, compressor) {\n    var lhs = compressor.is_lhs();\n    if (lhs && !is_atomic(lhs, self)\n        || find_variable(compressor, \"NaN\")) {\n        return make_node(AST_Binary, self, {\n            operator: \"/\",\n            left: make_node(AST_Number, self, {\n                value: 0\n            }),\n            right: make_node(AST_Number, self, {\n                value: 0\n            })\n        });\n    }\n    return self;\n});\n\nconst ASSIGN_OPS = makePredicate(\"+ - / * % >> << >>> | ^ &\");\nconst ASSIGN_OPS_COMMUTATIVE = makePredicate(\"* | ^ &\");\ndef_optimize(AST_Assign, function(self, compressor) {\n    if (self.logical) {\n        return self.lift_sequences(compressor);\n    }\n\n    var def;\n    // x = x ---> x\n    if (\n        self.operator === \"=\"\n        && self.left instanceof AST_SymbolRef\n        && self.left.name !== \"arguments\"\n        && !(def = self.left.definition()).undeclared\n        && self.right.equivalent_to(self.left)\n    ) {\n        return self.right;\n    }\n\n    if (compressor.option(\"dead_code\")\n        && self.left instanceof AST_SymbolRef\n        && (def = self.left.definition()).scope === compressor.find_parent(AST_Lambda)) {\n        var level = 0, node, parent = self;\n        do {\n            node = parent;\n            parent = compressor.parent(level++);\n            if (parent instanceof AST_Exit) {\n                if (in_try(level, parent)) break;\n                if (is_reachable(def.scope, [ def ])) break;\n                if (self.operator == \"=\") return self.right;\n                def.fixed = false;\n                return make_node(AST_Binary, self, {\n                    operator: self.operator.slice(0, -1),\n                    left: self.left,\n                    right: self.right\n                }).optimize(compressor);\n            }\n        } while (parent instanceof AST_Binary && parent.right === node\n            || parent instanceof AST_Sequence && parent.tail_node() === node);\n    }\n    self = self.lift_sequences(compressor);\n\n    if (self.operator == \"=\" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) {\n        // x = expr1 OP expr2\n        if (self.right.left instanceof AST_SymbolRef\n            && self.right.left.name == self.left.name\n            && ASSIGN_OPS.has(self.right.operator)) {\n            // x = x - 2  --->  x -= 2\n            self.operator = self.right.operator + \"=\";\n            self.right = self.right.right;\n        } else if (self.right.right instanceof AST_SymbolRef\n            && self.right.right.name == self.left.name\n            && ASSIGN_OPS_COMMUTATIVE.has(self.right.operator)\n            && !self.right.left.has_side_effects(compressor)) {\n            // x = 2 & x  --->  x &= 2\n            self.operator = self.right.operator + \"=\";\n            self.right = self.right.left;\n        }\n    }\n    return self;\n\n    function in_try(level, node) {\n        function may_assignment_throw() {\n            const right = self.right;\n            self.right = make_node(AST_Null, right);\n            const may_throw = node.may_throw(compressor);\n            self.right = right;\n\n            return may_throw;\n        }\n\n        var stop_at = self.left.definition().scope.get_defun_scope();\n        var parent;\n        while ((parent = compressor.parent(level++)) !== stop_at) {\n            if (parent instanceof AST_Try) {\n                if (parent.bfinally) return true;\n                if (parent.bcatch && may_assignment_throw()) return true;\n            }\n        }\n    }\n});\n\ndef_optimize(AST_DefaultAssign, function(self, compressor) {\n    if (!compressor.option(\"evaluate\")) {\n        return self;\n    }\n    var evaluateRight = self.right.evaluate(compressor);\n\n    // `[x = undefined] = foo` ---> `[x] = foo`\n    // `(arg = undefined) => ...` ---> `(arg) => ...` (unless `keep_fargs`)\n    // `((arg = undefined) => ...)()` ---> `((arg) => ...)()`\n    let lambda, iife;\n    if (evaluateRight === undefined) {\n        if (\n            (lambda = compressor.parent()) instanceof AST_Lambda\n                ? (\n                    compressor.option(\"keep_fargs\") === false\n                    || (iife = compressor.parent(1)).TYPE === \"Call\"\n                        && iife.expression === lambda\n                )\n                : true\n        ) {\n            self = self.left;\n        }\n    } else if (evaluateRight !== self.right) {\n        evaluateRight = make_node_from_constant(evaluateRight, self.right);\n        self.right = best_of_expression(evaluateRight, self.right);\n    }\n\n    return self;\n});\n\nfunction is_nullish_check(check, check_subject, compressor) {\n    if (check_subject.may_throw(compressor)) return false;\n\n    let nullish_side;\n\n    // foo == null\n    if (\n        check instanceof AST_Binary\n        && check.operator === \"==\"\n        // which side is nullish?\n        && (\n            (nullish_side = is_nullish(check.left, compressor) && check.left)\n            || (nullish_side = is_nullish(check.right, compressor) && check.right)\n        )\n        // is the other side the same as the check_subject\n        && (\n            nullish_side === check.left\n                ? check.right\n                : check.left\n        ).equivalent_to(check_subject)\n    ) {\n        return true;\n    }\n\n    // foo === null || foo === undefined\n    if (check instanceof AST_Binary && check.operator === \"||\") {\n        let null_cmp;\n        let undefined_cmp;\n\n        const find_comparison = cmp => {\n            if (!(\n                cmp instanceof AST_Binary\n                && (cmp.operator === \"===\" || cmp.operator === \"==\")\n            )) {\n                return false;\n            }\n\n            let found = 0;\n            let defined_side;\n\n            if (cmp.left instanceof AST_Null) {\n                found++;\n                null_cmp = cmp;\n                defined_side = cmp.right;\n            }\n            if (cmp.right instanceof AST_Null) {\n                found++;\n                null_cmp = cmp;\n                defined_side = cmp.left;\n            }\n            if (is_undefined(cmp.left, compressor)) {\n                found++;\n                undefined_cmp = cmp;\n                defined_side = cmp.right;\n            }\n            if (is_undefined(cmp.right, compressor)) {\n                found++;\n                undefined_cmp = cmp;\n                defined_side = cmp.left;\n            }\n\n            if (found !== 1) {\n                return false;\n            }\n\n            if (!defined_side.equivalent_to(check_subject)) {\n                return false;\n            }\n\n            return true;\n        };\n\n        if (!find_comparison(check.left)) return false;\n        if (!find_comparison(check.right)) return false;\n\n        if (null_cmp && undefined_cmp && null_cmp !== undefined_cmp) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\ndef_optimize(AST_Conditional, function(self, compressor) {\n    if (!compressor.option(\"conditionals\")) return self;\n    // This looks like lift_sequences(), should probably be under \"sequences\"\n    if (self.condition instanceof AST_Sequence) {\n        var expressions = self.condition.expressions.slice();\n        self.condition = expressions.pop();\n        expressions.push(self);\n        return make_sequence(self, expressions);\n    }\n    var cond = self.condition.evaluate(compressor);\n    if (cond !== self.condition) {\n        if (cond) {\n            return maintain_this_binding(compressor.parent(), compressor.self(), self.consequent);\n        } else {\n            return maintain_this_binding(compressor.parent(), compressor.self(), self.alternative);\n        }\n    }\n    var negated = cond.negate(compressor, first_in_statement(compressor));\n    if (best_of(compressor, cond, negated) === negated) {\n        self = make_node(AST_Conditional, self, {\n            condition: negated,\n            consequent: self.alternative,\n            alternative: self.consequent\n        });\n    }\n    var condition = self.condition;\n    var consequent = self.consequent;\n    var alternative = self.alternative;\n    // x?x:y --> x||y\n    if (condition instanceof AST_SymbolRef\n        && consequent instanceof AST_SymbolRef\n        && condition.definition() === consequent.definition()) {\n        return make_node(AST_Binary, self, {\n            operator: \"||\",\n            left: condition,\n            right: alternative\n        });\n    }\n    // if (foo) exp = something; else exp = something_else;\n    //                   |\n    //                   v\n    // exp = foo ? something : something_else;\n    if (\n        consequent instanceof AST_Assign\n        && alternative instanceof AST_Assign\n        && consequent.operator === alternative.operator\n        && consequent.logical === alternative.logical\n        && consequent.left.equivalent_to(alternative.left)\n        && (!self.condition.has_side_effects(compressor)\n            || consequent.operator == \"=\"\n                && !consequent.left.has_side_effects(compressor))\n    ) {\n        return make_node(AST_Assign, self, {\n            operator: consequent.operator,\n            left: consequent.left,\n            logical: consequent.logical,\n            right: make_node(AST_Conditional, self, {\n                condition: self.condition,\n                consequent: consequent.right,\n                alternative: alternative.right\n            })\n        });\n    }\n    // x ? y(a) : y(b) --> y(x ? a : b)\n    var arg_index;\n    if (consequent instanceof AST_Call\n        && alternative.TYPE === consequent.TYPE\n        && consequent.args.length > 0\n        && consequent.args.length == alternative.args.length\n        && consequent.expression.equivalent_to(alternative.expression)\n        && !self.condition.has_side_effects(compressor)\n        && !consequent.expression.has_side_effects(compressor)\n        && typeof (arg_index = single_arg_diff()) == \"number\") {\n        var node = consequent.clone();\n        node.args[arg_index] = make_node(AST_Conditional, self, {\n            condition: self.condition,\n            consequent: consequent.args[arg_index],\n            alternative: alternative.args[arg_index]\n        });\n        return node;\n    }\n    // a ? b : c ? b : d --> (a || c) ? b : d\n    if (alternative instanceof AST_Conditional\n        && consequent.equivalent_to(alternative.consequent)) {\n        return make_node(AST_Conditional, self, {\n            condition: make_node(AST_Binary, self, {\n                operator: \"||\",\n                left: condition,\n                right: alternative.condition\n            }),\n            consequent: consequent,\n            alternative: alternative.alternative\n        }).optimize(compressor);\n    }\n\n    // a == null ? b : a -> a ?? b\n    if (\n        compressor.option(\"ecma\") >= 2020 &&\n        is_nullish_check(condition, alternative, compressor)\n    ) {\n        return make_node(AST_Binary, self, {\n            operator: \"??\",\n            left: alternative,\n            right: consequent\n        }).optimize(compressor);\n    }\n\n    // a ? b : (c, b) --> (a || c), b\n    if (alternative instanceof AST_Sequence\n        && consequent.equivalent_to(alternative.expressions[alternative.expressions.length - 1])) {\n        return make_sequence(self, [\n            make_node(AST_Binary, self, {\n                operator: \"||\",\n                left: condition,\n                right: make_sequence(self, alternative.expressions.slice(0, -1))\n            }),\n            consequent\n        ]).optimize(compressor);\n    }\n    // a ? b : (c && b) --> (a || c) && b\n    if (alternative instanceof AST_Binary\n        && alternative.operator == \"&&\"\n        && consequent.equivalent_to(alternative.right)) {\n        return make_node(AST_Binary, self, {\n            operator: \"&&\",\n            left: make_node(AST_Binary, self, {\n                operator: \"||\",\n                left: condition,\n                right: alternative.left\n            }),\n            right: consequent\n        }).optimize(compressor);\n    }\n    // x?y?z:a:a --> x&&y?z:a\n    if (consequent instanceof AST_Conditional\n        && consequent.alternative.equivalent_to(alternative)) {\n        return make_node(AST_Conditional, self, {\n            condition: make_node(AST_Binary, self, {\n                left: self.condition,\n                operator: \"&&\",\n                right: consequent.condition\n            }),\n            consequent: consequent.consequent,\n            alternative: alternative\n        });\n    }\n    // x ? y : y --> x, y\n    if (consequent.equivalent_to(alternative)) {\n        return make_sequence(self, [\n            self.condition,\n            consequent\n        ]).optimize(compressor);\n    }\n    // x ? y || z : z --> x && y || z\n    if (consequent instanceof AST_Binary\n        && consequent.operator == \"||\"\n        && consequent.right.equivalent_to(alternative)) {\n        return make_node(AST_Binary, self, {\n            operator: \"||\",\n            left: make_node(AST_Binary, self, {\n                operator: \"&&\",\n                left: self.condition,\n                right: consequent.left\n            }),\n            right: alternative\n        }).optimize(compressor);\n    }\n\n    const in_bool = compressor.in_boolean_context();\n    if (is_true(self.consequent)) {\n        if (is_false(self.alternative)) {\n            // c ? true : false ---> !!c\n            return booleanize(self.condition);\n        }\n        // c ? true : x ---> !!c || x\n        return make_node(AST_Binary, self, {\n            operator: \"||\",\n            left: booleanize(self.condition),\n            right: self.alternative\n        });\n    }\n    if (is_false(self.consequent)) {\n        if (is_true(self.alternative)) {\n            // c ? false : true ---> !c\n            return booleanize(self.condition.negate(compressor));\n        }\n        // c ? false : x ---> !c && x\n        return make_node(AST_Binary, self, {\n            operator: \"&&\",\n            left: booleanize(self.condition.negate(compressor)),\n            right: self.alternative\n        });\n    }\n    if (is_true(self.alternative)) {\n        // c ? x : true ---> !c || x\n        return make_node(AST_Binary, self, {\n            operator: \"||\",\n            left: booleanize(self.condition.negate(compressor)),\n            right: self.consequent\n        });\n    }\n    if (is_false(self.alternative)) {\n        // c ? x : false ---> !!c && x\n        return make_node(AST_Binary, self, {\n            operator: \"&&\",\n            left: booleanize(self.condition),\n            right: self.consequent\n        });\n    }\n\n    return self;\n\n    function booleanize(node) {\n        if (node.is_boolean()) return node;\n        // !!expression\n        return make_node(AST_UnaryPrefix, node, {\n            operator: \"!\",\n            expression: node.negate(compressor)\n        });\n    }\n\n    // AST_True or !0\n    function is_true(node) {\n        return node instanceof AST_True\n            || in_bool\n                && node instanceof AST_Constant\n                && node.getValue()\n            || (node instanceof AST_UnaryPrefix\n                && node.operator == \"!\"\n                && node.expression instanceof AST_Constant\n                && !node.expression.getValue());\n    }\n    // AST_False or !1\n    function is_false(node) {\n        return node instanceof AST_False\n            || in_bool\n                && node instanceof AST_Constant\n                && !node.getValue()\n            || (node instanceof AST_UnaryPrefix\n                && node.operator == \"!\"\n                && node.expression instanceof AST_Constant\n                && node.expression.getValue());\n    }\n\n    function single_arg_diff() {\n        var a = consequent.args;\n        var b = alternative.args;\n        for (var i = 0, len = a.length; i < len; i++) {\n            if (a[i] instanceof AST_Expansion) return;\n            if (!a[i].equivalent_to(b[i])) {\n                if (b[i] instanceof AST_Expansion) return;\n                for (var j = i + 1; j < len; j++) {\n                    if (a[j] instanceof AST_Expansion) return;\n                    if (!a[j].equivalent_to(b[j])) return;\n                }\n                return i;\n            }\n        }\n    }\n});\n\ndef_optimize(AST_Boolean, function(self, compressor) {\n    if (compressor.in_boolean_context()) return make_node(AST_Number, self, {\n        value: +self.value\n    });\n    var p = compressor.parent();\n    if (compressor.option(\"booleans_as_integers\")) {\n        if (p instanceof AST_Binary && (p.operator == \"===\" || p.operator == \"!==\")) {\n            p.operator = p.operator.replace(/=$/, \"\");\n        }\n        return make_node(AST_Number, self, {\n            value: +self.value\n        });\n    }\n    if (compressor.option(\"booleans\")) {\n        if (p instanceof AST_Binary && (p.operator == \"==\"\n                                        || p.operator == \"!=\")) {\n            return make_node(AST_Number, self, {\n                value: +self.value\n            });\n        }\n        return make_node(AST_UnaryPrefix, self, {\n            operator: \"!\",\n            expression: make_node(AST_Number, self, {\n                value: 1 - self.value\n            })\n        });\n    }\n    return self;\n});\n\nfunction safe_to_flatten(value, compressor) {\n    if (value instanceof AST_SymbolRef) {\n        value = value.fixed_value();\n    }\n    if (!value) return false;\n    if (!(value instanceof AST_Lambda || value instanceof AST_Class)) return true;\n    if (!(value instanceof AST_Lambda && value.contains_this())) return true;\n    return compressor.parent() instanceof AST_New;\n}\n\nAST_PropAccess.DEFMETHOD(\"flatten_object\", function(key, compressor) {\n    if (!compressor.option(\"properties\")) return;\n    if (key === \"__proto__\") return;\n\n    var arrows = compressor.option(\"unsafe_arrows\") && compressor.option(\"ecma\") >= 2015;\n    var expr = this.expression;\n    if (expr instanceof AST_Object) {\n        var props = expr.properties;\n\n        for (var i = props.length; --i >= 0;) {\n            var prop = props[i];\n\n            if (\"\" + (prop instanceof AST_ConciseMethod ? prop.key.name : prop.key) == key) {\n                const all_props_flattenable = props.every((p) =>\n                    (p instanceof AST_ObjectKeyVal\n                        || arrows && p instanceof AST_ConciseMethod && !p.is_generator\n                    )\n                    && !p.computed_key()\n                );\n\n                if (!all_props_flattenable) return;\n                if (!safe_to_flatten(prop.value, compressor)) return;\n\n                return make_node(AST_Sub, this, {\n                    expression: make_node(AST_Array, expr, {\n                        elements: props.map(function(prop) {\n                            var v = prop.value;\n                            if (v instanceof AST_Accessor) {\n                                v = make_node(AST_Function, v, v);\n                            }\n\n                            var k = prop.key;\n                            if (k instanceof AST_Node && !(k instanceof AST_SymbolMethod)) {\n                                return make_sequence(prop, [ k, v ]);\n                            }\n\n                            return v;\n                        })\n                    }),\n                    property: make_node(AST_Number, this, {\n                        value: i\n                    })\n                });\n            }\n        }\n    }\n});\n\ndef_optimize(AST_Sub, function(self, compressor) {\n    var expr = self.expression;\n    var prop = self.property;\n    if (compressor.option(\"properties\")) {\n        var key = prop.evaluate(compressor);\n        if (key !== prop) {\n            if (typeof key == \"string\") {\n                if (key == \"undefined\") {\n                    key = undefined;\n                } else {\n                    var value = parseFloat(key);\n                    if (value.toString() == key) {\n                        key = value;\n                    }\n                }\n            }\n            prop = self.property = best_of_expression(\n                prop,\n                make_node_from_constant(key, prop).transform(compressor)\n            );\n            var property = \"\" + key;\n            if (is_basic_identifier_string(property)\n                && property.length <= prop.size() + 1) {\n                return make_node(AST_Dot, self, {\n                    expression: expr,\n                    optional: self.optional,\n                    property: property,\n                    quote: prop.quote,\n                }).optimize(compressor);\n            }\n        }\n    }\n    var fn;\n    OPT_ARGUMENTS: if (compressor.option(\"arguments\")\n        && expr instanceof AST_SymbolRef\n        && expr.name == \"arguments\"\n        && expr.definition().orig.length == 1\n        && (fn = expr.scope) instanceof AST_Lambda\n        && fn.uses_arguments\n        && !(fn instanceof AST_Arrow)\n        && prop instanceof AST_Number) {\n        var index = prop.getValue();\n        var params = new Set();\n        var argnames = fn.argnames;\n        for (var n = 0; n < argnames.length; n++) {\n            if (!(argnames[n] instanceof AST_SymbolFunarg)) {\n                break OPT_ARGUMENTS; // destructuring parameter - bail\n            }\n            var param = argnames[n].name;\n            if (params.has(param)) {\n                break OPT_ARGUMENTS; // duplicate parameter - bail\n            }\n            params.add(param);\n        }\n        var argname = fn.argnames[index];\n        if (argname && compressor.has_directive(\"use strict\")) {\n            var def = argname.definition();\n            if (!compressor.option(\"reduce_vars\") || def.assignments || def.orig.length > 1) {\n                argname = null;\n            }\n        } else if (!argname && !compressor.option(\"keep_fargs\") && index < fn.argnames.length + 5) {\n            while (index >= fn.argnames.length) {\n                argname = fn.create_symbol(AST_SymbolFunarg, {\n                    source: fn,\n                    scope: fn,\n                    tentative_name: \"argument_\" + fn.argnames.length,\n                });\n                fn.argnames.push(argname);\n            }\n        }\n        if (argname) {\n            var sym = make_node(AST_SymbolRef, self, argname);\n            sym.reference({});\n            clear_flag(argname, UNUSED);\n            return sym;\n        }\n    }\n    if (compressor.is_lhs()) return self;\n    if (key !== prop) {\n        var sub = self.flatten_object(property, compressor);\n        if (sub) {\n            expr = self.expression = sub.expression;\n            prop = self.property = sub.property;\n        }\n    }\n    if (compressor.option(\"properties\") && compressor.option(\"side_effects\")\n        && prop instanceof AST_Number && expr instanceof AST_Array) {\n        var index = prop.getValue();\n        var elements = expr.elements;\n        var retValue = elements[index];\n        FLATTEN: if (safe_to_flatten(retValue, compressor)) {\n            var flatten = true;\n            var values = [];\n            for (var i = elements.length; --i > index;) {\n                var value = elements[i].drop_side_effect_free(compressor);\n                if (value) {\n                    values.unshift(value);\n                    if (flatten && value.has_side_effects(compressor)) flatten = false;\n                }\n            }\n            if (retValue instanceof AST_Expansion) break FLATTEN;\n            retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue;\n            if (!flatten) values.unshift(retValue);\n            while (--i >= 0) {\n                var value = elements[i];\n                if (value instanceof AST_Expansion) break FLATTEN;\n                value = value.drop_side_effect_free(compressor);\n                if (value) values.unshift(value);\n                else index--;\n            }\n            if (flatten) {\n                values.push(retValue);\n                return make_sequence(self, values).optimize(compressor);\n            } else return make_node(AST_Sub, self, {\n                expression: make_node(AST_Array, expr, {\n                    elements: values\n                }),\n                property: make_node(AST_Number, prop, {\n                    value: index\n                })\n            });\n        }\n    }\n    var ev = self.evaluate(compressor);\n    if (ev !== self) {\n        ev = make_node_from_constant(ev, self).optimize(compressor);\n        return best_of(compressor, ev, self);\n    }\n    return self;\n});\n\ndef_optimize(AST_Chain, function (self, compressor) {\n    if (is_nullish(self.expression, compressor)) {\n        let parent = compressor.parent();\n        // It's valid to delete a nullish optional chain, but if we optimized\n        // this to `delete undefined` then it would appear to be a syntax error\n        // when we try to optimize the delete. Thankfully, `delete 0` is fine.\n        if (parent instanceof AST_UnaryPrefix && parent.operator === \"delete\") {\n            return make_node_from_constant(0, self);\n        }\n        return make_node(AST_Undefined, self);\n    }\n    return self;\n});\n\ndef_optimize(AST_Dot, function(self, compressor) {\n    const parent = compressor.parent();\n    if (compressor.is_lhs()) return self;\n    if (compressor.option(\"unsafe_proto\")\n        && self.expression instanceof AST_Dot\n        && self.expression.property == \"prototype\") {\n        var exp = self.expression.expression;\n        if (is_undeclared_ref(exp)) switch (exp.name) {\n          case \"Array\":\n            self.expression = make_node(AST_Array, self.expression, {\n                elements: []\n            });\n            break;\n          case \"Function\":\n            self.expression = make_node(AST_Function, self.expression, {\n                argnames: [],\n                body: []\n            });\n            break;\n          case \"Number\":\n            self.expression = make_node(AST_Number, self.expression, {\n                value: 0\n            });\n            break;\n          case \"Object\":\n            self.expression = make_node(AST_Object, self.expression, {\n                properties: []\n            });\n            break;\n          case \"RegExp\":\n            self.expression = make_node(AST_RegExp, self.expression, {\n                value: { source: \"t\", flags: \"\" }\n            });\n            break;\n          case \"String\":\n            self.expression = make_node(AST_String, self.expression, {\n                value: \"\"\n            });\n            break;\n        }\n    }\n    if (!(parent instanceof AST_Call) || !has_annotation(parent, _NOINLINE)) {\n        const sub = self.flatten_object(self.property, compressor);\n        if (sub) return sub.optimize(compressor);\n    }\n\n    if (self.expression instanceof AST_PropAccess\n        && parent instanceof AST_PropAccess) {\n        return self;\n    }\n\n    let ev = self.evaluate(compressor);\n    if (ev !== self) {\n        ev = make_node_from_constant(ev, self).optimize(compressor);\n        return best_of(compressor, ev, self);\n    }\n    return self;\n});\n\nfunction literals_in_boolean_context(self, compressor) {\n    if (compressor.in_boolean_context()) {\n        return best_of(compressor, self, make_sequence(self, [\n            self,\n            make_node(AST_True, self)\n        ]).optimize(compressor));\n    }\n    return self;\n}\n\nfunction inline_array_like_spread(elements) {\n    for (var i = 0; i < elements.length; i++) {\n        var el = elements[i];\n        if (el instanceof AST_Expansion) {\n            var expr = el.expression;\n            if (\n                expr instanceof AST_Array\n                && !expr.elements.some(elm => elm instanceof AST_Hole)\n            ) {\n                elements.splice(i, 1, ...expr.elements);\n                // Step back one, as the element at i is now new.\n                i--;\n            }\n            // In array-like spread, spreading a non-iterable value is TypeError.\n            // We therefore can’t optimize anything else, unlike with object spread.\n        }\n    }\n}\n\ndef_optimize(AST_Array, function(self, compressor) {\n    var optimized = literals_in_boolean_context(self, compressor);\n    if (optimized !== self) {\n        return optimized;\n    }\n    inline_array_like_spread(self.elements);\n    return self;\n});\n\nfunction inline_object_prop_spread(props, compressor) {\n    for (var i = 0; i < props.length; i++) {\n        var prop = props[i];\n        if (prop instanceof AST_Expansion) {\n            const expr = prop.expression;\n            if (\n                expr instanceof AST_Object\n                && expr.properties.every(prop => prop instanceof AST_ObjectKeyVal)\n            ) {\n                props.splice(i, 1, ...expr.properties);\n                // Step back one, as the property at i is now new.\n                i--;\n            } else if (expr instanceof AST_Constant\n                && !(expr instanceof AST_String)) {\n                // Unlike array-like spread, in object spread, spreading a\n                // non-iterable value silently does nothing; it is thus safe\n                // to remove. AST_String is the only iterable AST_Constant.\n                props.splice(i, 1);\n                i--;\n            } else if (is_nullish(expr, compressor)) {\n                // Likewise, null and undefined can be silently removed.\n                props.splice(i, 1);\n                i--;\n            }\n        }\n    }\n}\n\ndef_optimize(AST_Object, function(self, compressor) {\n    var optimized = literals_in_boolean_context(self, compressor);\n    if (optimized !== self) {\n        return optimized;\n    }\n    inline_object_prop_spread(self.properties, compressor);\n    return self;\n});\n\ndef_optimize(AST_RegExp, literals_in_boolean_context);\n\ndef_optimize(AST_Return, function(self, compressor) {\n    if (self.value && is_undefined(self.value, compressor)) {\n        self.value = null;\n    }\n    return self;\n});\n\ndef_optimize(AST_Arrow, opt_AST_Lambda);\n\ndef_optimize(AST_Function, function(self, compressor) {\n    self = opt_AST_Lambda(self, compressor);\n    if (compressor.option(\"unsafe_arrows\")\n        && compressor.option(\"ecma\") >= 2015\n        && !self.name\n        && !self.is_generator\n        && !self.uses_arguments\n        && !self.pinned()) {\n        const uses_this = walk(self, node => {\n            if (node instanceof AST_This) return walk_abort;\n        });\n        if (!uses_this) return make_node(AST_Arrow, self, self).optimize(compressor);\n    }\n    return self;\n});\n\ndef_optimize(AST_Class, function(self) {\n    // HACK to avoid compress failure.\n    // AST_Class is not really an AST_Scope/AST_Block as it lacks a body.\n    return self;\n});\n\ndef_optimize(AST_ClassStaticBlock, function(self, compressor) {\n    tighten_body(self.body, compressor);\n    return self;\n});\n\ndef_optimize(AST_Yield, function(self, compressor) {\n    if (self.expression && !self.is_star && is_undefined(self.expression, compressor)) {\n        self.expression = null;\n    }\n    return self;\n});\n\ndef_optimize(AST_TemplateString, function(self, compressor) {\n    if (\n        !compressor.option(\"evaluate\")\n        || compressor.parent() instanceof AST_PrefixedTemplateString\n    ) {\n        return self;\n    }\n\n    var segments = [];\n    for (var i = 0; i < self.segments.length; i++) {\n        var segment = self.segments[i];\n        if (segment instanceof AST_Node) {\n            var result = segment.evaluate(compressor);\n            // Evaluate to constant value\n            // Constant value shorter than ${segment}\n            if (result !== segment && (result + \"\").length <= segment.size() + \"${}\".length) {\n                // There should always be a previous and next segment if segment is a node\n                segments[segments.length - 1].value = segments[segments.length - 1].value + result + self.segments[++i].value;\n                continue;\n            }\n            // `before ${`innerBefore ${any} innerAfter`} after` => `before innerBefore ${any} innerAfter after`\n            // TODO:\n            // `before ${'test' + foo} after` => `before innerBefore ${any} innerAfter after`\n            // `before ${foo + 'test} after` => `before innerBefore ${any} innerAfter after`\n            if (segment instanceof AST_TemplateString) {\n                var inners = segment.segments;\n                segments[segments.length - 1].value += inners[0].value;\n                for (var j = 1; j < inners.length; j++) {\n                    segment = inners[j];\n                    segments.push(segment);\n                }\n                continue;\n            }\n        }\n        segments.push(segment);\n    }\n    self.segments = segments;\n\n    // `foo` => \"foo\"\n    if (segments.length == 1) {\n        return make_node(AST_String, self, segments[0]);\n    }\n\n    if (\n        segments.length === 3\n        && segments[1] instanceof AST_Node\n        && (\n            segments[1].is_string(compressor)\n            || segments[1].is_number(compressor)\n            || is_nullish(segments[1], compressor)\n            || compressor.option(\"unsafe\")\n        )\n    ) {\n        // `foo${bar}` => \"foo\" + bar\n        if (segments[2].value === \"\") {\n            return make_node(AST_Binary, self, {\n                operator: \"+\",\n                left: make_node(AST_String, self, {\n                    value: segments[0].value,\n                }),\n                right: segments[1],\n            });\n        }\n        // `${bar}baz` => bar + \"baz\"\n        if (segments[0].value === \"\") {\n            return make_node(AST_Binary, self, {\n                operator: \"+\",\n                left: segments[1],\n                right: make_node(AST_String, self, {\n                    value: segments[2].value,\n                }),\n            });\n        }\n    }\n    return self;\n});\n\ndef_optimize(AST_PrefixedTemplateString, function(self) {\n    return self;\n});\n\n// [\"p\"]:1 ---> p:1\n// [42]:1 ---> 42:1\nfunction lift_key(self, compressor) {\n    if (!compressor.option(\"computed_props\")) return self;\n    // save a comparison in the typical case\n    if (!(self.key instanceof AST_Constant)) return self;\n    // allow certain acceptable props as not all AST_Constants are true constants\n    if (self.key instanceof AST_String || self.key instanceof AST_Number) {\n        if (self.key.value === \"__proto__\") return self;\n        if (self.key.value == \"constructor\"\n            && compressor.parent() instanceof AST_Class) return self;\n        if (self instanceof AST_ObjectKeyVal) {\n            self.quote = self.key.quote;\n            self.key = self.key.value;\n        } else if (self instanceof AST_ClassProperty) {\n            self.quote = self.key.quote;\n            self.key = make_node(AST_SymbolClassProperty, self.key, {\n                name: self.key.value\n            });\n        } else {\n            self.quote = self.key.quote;\n            self.key = make_node(AST_SymbolMethod, self.key, {\n                name: self.key.value\n            });\n        }\n    }\n    return self;\n}\n\ndef_optimize(AST_ObjectProperty, lift_key);\n\ndef_optimize(AST_ConciseMethod, function(self, compressor) {\n    lift_key(self, compressor);\n    // p(){return x;} ---> p:()=>x\n    if (compressor.option(\"arrows\")\n        && compressor.parent() instanceof AST_Object\n        && !self.is_generator\n        && !self.value.uses_arguments\n        && !self.value.pinned()\n        && self.value.body.length == 1\n        && self.value.body[0] instanceof AST_Return\n        && self.value.body[0].value\n        && !self.value.contains_this()) {\n        var arrow = make_node(AST_Arrow, self.value, self.value);\n        arrow.async = self.async;\n        arrow.is_generator = self.is_generator;\n        return make_node(AST_ObjectKeyVal, self, {\n            key: self.key instanceof AST_SymbolMethod ? self.key.name : self.key,\n            value: arrow,\n            quote: self.quote,\n        });\n    }\n    return self;\n});\n\ndef_optimize(AST_ObjectKeyVal, function(self, compressor) {\n    lift_key(self, compressor);\n    // p:function(){} ---> p(){}\n    // p:function*(){} ---> *p(){}\n    // p:async function(){} ---> async p(){}\n    // p:()=>{} ---> p(){}\n    // p:async()=>{} ---> async p(){}\n    var unsafe_methods = compressor.option(\"unsafe_methods\");\n    if (unsafe_methods\n        && compressor.option(\"ecma\") >= 2015\n        && (!(unsafe_methods instanceof RegExp) || unsafe_methods.test(self.key + \"\"))) {\n        var key = self.key;\n        var value = self.value;\n        var is_arrow_with_block = value instanceof AST_Arrow\n            && Array.isArray(value.body)\n            && !value.contains_this();\n        if ((is_arrow_with_block || value instanceof AST_Function) && !value.name) {\n            return make_node(AST_ConciseMethod, self, {\n                async: value.async,\n                is_generator: value.is_generator,\n                key: key instanceof AST_Node ? key : make_node(AST_SymbolMethod, self, {\n                    name: key,\n                }),\n                value: make_node(AST_Accessor, value, value),\n                quote: self.quote,\n            });\n        }\n    }\n    return self;\n});\n\ndef_optimize(AST_Destructuring, function(self, compressor) {\n    if (compressor.option(\"pure_getters\") == true\n        && compressor.option(\"unused\")\n        && !self.is_array\n        && Array.isArray(self.names)\n        && !is_destructuring_export_decl(compressor)\n        && !(self.names[self.names.length - 1] instanceof AST_Expansion)) {\n        var keep = [];\n        for (var i = 0; i < self.names.length; i++) {\n            var elem = self.names[i];\n            if (!(elem instanceof AST_ObjectKeyVal\n                && typeof elem.key == \"string\"\n                && elem.value instanceof AST_SymbolDeclaration\n                && !should_retain(compressor, elem.value.definition()))) {\n                keep.push(elem);\n            }\n        }\n        if (keep.length != self.names.length) {\n            self.names = keep;\n        }\n    }\n    return self;\n\n    function is_destructuring_export_decl(compressor) {\n        var ancestors = [/^VarDef$/, /^(Const|Let|Var)$/, /^Export$/];\n        for (var a = 0, p = 0, len = ancestors.length; a < len; p++) {\n            var parent = compressor.parent(p);\n            if (!parent) return false;\n            if (a === 0 && parent.TYPE == \"Destructuring\") continue;\n            if (!ancestors[a].test(parent.TYPE)) {\n                return false;\n            }\n            a++;\n        }\n        return true;\n    }\n\n    function should_retain(compressor, def) {\n        if (def.references.length) return true;\n        if (!def.global) return false;\n        if (compressor.toplevel.vars) {\n             if (compressor.top_retain) {\n                 return compressor.top_retain(def);\n             }\n             return false;\n        }\n        return true;\n    }\n});\n\nexport {\n    Compressor,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/inference.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n  AST_Array,\n  AST_Arrow,\n  AST_Assign,\n  AST_BigInt,\n  AST_Binary,\n  AST_Block,\n  AST_BlockStatement,\n  AST_Call,\n  AST_Case,\n  AST_Chain,\n  AST_Class,\n  AST_DefClass,\n  AST_ClassStaticBlock,\n  AST_ClassProperty,\n  AST_ConciseMethod,\n  AST_Conditional,\n  AST_Constant,\n  AST_Definitions,\n  AST_Dot,\n  AST_EmptyStatement,\n  AST_Expansion,\n  AST_False,\n  AST_ForIn,\n  AST_Function,\n  AST_If,\n  AST_Import,\n  AST_ImportMeta,\n  AST_Jump,\n  AST_LabeledStatement,\n  AST_Lambda,\n  AST_New,\n  AST_Node,\n  AST_Null,\n  AST_Number,\n  AST_Object,\n  AST_ObjectGetter,\n  AST_ObjectKeyVal,\n  AST_ObjectProperty,\n  AST_ObjectSetter,\n  AST_PropAccess,\n  AST_RegExp,\n  AST_Return,\n  AST_Scope,\n  AST_Sequence,\n  AST_SimpleStatement,\n  AST_Statement,\n  AST_String,\n  AST_Sub,\n  AST_Switch,\n  AST_SwitchBranch,\n  AST_SymbolClassProperty,\n  AST_SymbolDeclaration,\n  AST_SymbolRef,\n  AST_TemplateSegment,\n  AST_TemplateString,\n  AST_This,\n  AST_Toplevel,\n  AST_True,\n  AST_Try,\n  AST_Unary,\n  AST_UnaryPostfix,\n  AST_UnaryPrefix,\n  AST_Undefined,\n  AST_VarDef,\n\n  TreeTransformer,\n  walk,\n  walk_abort,\n\n  _PURE\n} from \"../ast.js\";\nimport {\n    makePredicate,\n    return_true,\n    return_false,\n    return_null,\n    return_this,\n    make_node,\n    member,\n    noop,\n    has_annotation,\n    HOP\n} from \"../utils/index.js\";\nimport { make_node_from_constant, make_sequence, best_of_expression, read_property } from \"./common.js\";\n\nimport { INLINED, UNDEFINED, has_flag } from \"./compressor-flags.js\";\nimport { pure_prop_access_globals, is_pure_native_fn, is_pure_native_method } from \"./native-objects.js\";\n\n// Functions and methods to infer certain facts about expressions\n// It's not always possible to be 100% sure about something just by static analysis,\n// so `true` means yes, and `false` means maybe\n\nexport const is_undeclared_ref = (node) =>\n    node instanceof AST_SymbolRef && node.definition().undeclared;\n\nexport const lazy_op = makePredicate(\"&& || ??\");\nexport const unary_side_effects = makePredicate(\"delete ++ --\");\n\n// methods to determine whether an expression has a boolean result type\n(function(def_is_boolean) {\n    const unary_bool = makePredicate(\"! delete\");\n    const binary_bool = makePredicate(\"in instanceof == != === !== < <= >= >\");\n    def_is_boolean(AST_Node, return_false);\n    def_is_boolean(AST_UnaryPrefix, function() {\n        return unary_bool.has(this.operator);\n    });\n    def_is_boolean(AST_Binary, function() {\n        return binary_bool.has(this.operator)\n            || lazy_op.has(this.operator)\n                && this.left.is_boolean()\n                && this.right.is_boolean();\n    });\n    def_is_boolean(AST_Conditional, function() {\n        return this.consequent.is_boolean() && this.alternative.is_boolean();\n    });\n    def_is_boolean(AST_Assign, function() {\n        return this.operator == \"=\" && this.right.is_boolean();\n    });\n    def_is_boolean(AST_Sequence, function() {\n        return this.tail_node().is_boolean();\n    });\n    def_is_boolean(AST_True, return_true);\n    def_is_boolean(AST_False, return_true);\n})(function(node, func) {\n    node.DEFMETHOD(\"is_boolean\", func);\n});\n\n// methods to determine if an expression has a numeric result type\n(function(def_is_number) {\n    def_is_number(AST_Node, return_false);\n    def_is_number(AST_Number, return_true);\n    const unary = makePredicate(\"+ - ~ ++ --\");\n    def_is_number(AST_Unary, function() {\n        return unary.has(this.operator) && !(this.expression instanceof AST_BigInt);\n    });\n    const numeric_ops = makePredicate(\"- * / % & | ^ << >> >>>\");\n    def_is_number(AST_Binary, function(compressor) {\n        return numeric_ops.has(this.operator) || this.operator == \"+\"\n            && this.left.is_number(compressor)\n            && this.right.is_number(compressor);\n    });\n    def_is_number(AST_Assign, function(compressor) {\n        return numeric_ops.has(this.operator.slice(0, -1))\n            || this.operator == \"=\" && this.right.is_number(compressor);\n    });\n    def_is_number(AST_Sequence, function(compressor) {\n        return this.tail_node().is_number(compressor);\n    });\n    def_is_number(AST_Conditional, function(compressor) {\n        return this.consequent.is_number(compressor) && this.alternative.is_number(compressor);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"is_number\", func);\n});\n\n// methods to determine if an expression has a string result type\n(function(def_is_string) {\n    def_is_string(AST_Node, return_false);\n    def_is_string(AST_String, return_true);\n    def_is_string(AST_TemplateString, return_true);\n    def_is_string(AST_UnaryPrefix, function() {\n        return this.operator == \"typeof\";\n    });\n    def_is_string(AST_Binary, function(compressor) {\n        return this.operator == \"+\" &&\n            (this.left.is_string(compressor) || this.right.is_string(compressor));\n    });\n    def_is_string(AST_Assign, function(compressor) {\n        return (this.operator == \"=\" || this.operator == \"+=\") && this.right.is_string(compressor);\n    });\n    def_is_string(AST_Sequence, function(compressor) {\n        return this.tail_node().is_string(compressor);\n    });\n    def_is_string(AST_Conditional, function(compressor) {\n        return this.consequent.is_string(compressor) && this.alternative.is_string(compressor);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"is_string\", func);\n});\n\nexport function is_undefined(node, compressor) {\n    return (\n        has_flag(node, UNDEFINED)\n        || node instanceof AST_Undefined\n        || node instanceof AST_UnaryPrefix\n            && node.operator == \"void\"\n            && !node.expression.has_side_effects(compressor)\n    );\n}\n\n// Is the node explicitly null or undefined.\nfunction is_null_or_undefined(node, compressor) {\n    let fixed;\n    return (\n        node instanceof AST_Null\n        || is_undefined(node, compressor)\n        || (\n            node instanceof AST_SymbolRef\n            && (fixed = node.definition().fixed) instanceof AST_Node\n            && is_nullish(fixed, compressor)\n        )\n    );\n}\n\n// Find out if this expression is optionally chained from a base-point that we\n// can statically analyze as null or undefined.\nexport function is_nullish_shortcircuited(node, compressor) {\n    if (node instanceof AST_PropAccess || node instanceof AST_Call) {\n        return (\n            (node.optional && is_null_or_undefined(node.expression, compressor))\n            || is_nullish_shortcircuited(node.expression, compressor)\n        );\n    }\n    if (node instanceof AST_Chain) return is_nullish_shortcircuited(node.expression, compressor);\n    return false;\n}\n\n// Find out if something is == null, or can short circuit into nullish.\n// Used to optimize ?. and ??\nexport function is_nullish(node, compressor) {\n    if (is_null_or_undefined(node, compressor)) return true;\n    return is_nullish_shortcircuited(node, compressor);\n}\n\n// Determine if expression might cause side effects\n// If there's a possibility that a node may change something when it's executed, this returns true\n(function(def_has_side_effects) {\n    def_has_side_effects(AST_Node, return_true);\n\n    def_has_side_effects(AST_EmptyStatement, return_false);\n    def_has_side_effects(AST_Constant, return_false);\n    def_has_side_effects(AST_This, return_false);\n\n    function any(list, compressor) {\n        for (var i = list.length; --i >= 0;)\n            if (list[i].has_side_effects(compressor))\n                return true;\n        return false;\n    }\n\n    def_has_side_effects(AST_Block, function(compressor) {\n        return any(this.body, compressor);\n    });\n    def_has_side_effects(AST_Call, function(compressor) {\n        if (\n            !this.is_callee_pure(compressor)\n            && (!this.expression.is_call_pure(compressor)\n                || this.expression.has_side_effects(compressor))\n        ) {\n            return true;\n        }\n        return any(this.args, compressor);\n    });\n    def_has_side_effects(AST_Switch, function(compressor) {\n        return this.expression.has_side_effects(compressor)\n            || any(this.body, compressor);\n    });\n    def_has_side_effects(AST_Case, function(compressor) {\n        return this.expression.has_side_effects(compressor)\n            || any(this.body, compressor);\n    });\n    def_has_side_effects(AST_Try, function(compressor) {\n        return this.body.has_side_effects(compressor)\n            || this.bcatch && this.bcatch.has_side_effects(compressor)\n            || this.bfinally && this.bfinally.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_If, function(compressor) {\n        return this.condition.has_side_effects(compressor)\n            || this.body && this.body.has_side_effects(compressor)\n            || this.alternative && this.alternative.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_ImportMeta, return_false);\n    def_has_side_effects(AST_LabeledStatement, function(compressor) {\n        return this.body.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_SimpleStatement, function(compressor) {\n        return this.body.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Lambda, return_false);\n    def_has_side_effects(AST_Class, function (compressor) {\n        if (this.extends && this.extends.has_side_effects(compressor)) {\n            return true;\n        }\n        return any(this.properties, compressor);\n    });\n    def_has_side_effects(AST_ClassStaticBlock, function(compressor) {\n        return any(this.body, compressor);\n    });\n    def_has_side_effects(AST_Binary, function(compressor) {\n        return this.left.has_side_effects(compressor)\n            || this.right.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Assign, return_true);\n    def_has_side_effects(AST_Conditional, function(compressor) {\n        return this.condition.has_side_effects(compressor)\n            || this.consequent.has_side_effects(compressor)\n            || this.alternative.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Unary, function(compressor) {\n        return unary_side_effects.has(this.operator)\n            || this.expression.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_SymbolRef, function(compressor) {\n        return !this.is_declared(compressor) && !pure_prop_access_globals.has(this.name);\n    });\n    def_has_side_effects(AST_SymbolClassProperty, return_false);\n    def_has_side_effects(AST_SymbolDeclaration, return_false);\n    def_has_side_effects(AST_Object, function(compressor) {\n        return any(this.properties, compressor);\n    });\n    def_has_side_effects(AST_ObjectProperty, function(compressor) {\n        return (\n            this.computed_key() && this.key.has_side_effects(compressor)\n            || this.value && this.value.has_side_effects(compressor)\n        );\n    });\n    def_has_side_effects(AST_ClassProperty, function(compressor) {\n        return (\n            this.computed_key() && this.key.has_side_effects(compressor)\n            || this.static && this.value && this.value.has_side_effects(compressor)\n        );\n    });\n    def_has_side_effects(AST_ConciseMethod, function(compressor) {\n        return this.computed_key() && this.key.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_ObjectGetter, function(compressor) {\n        return this.computed_key() && this.key.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_ObjectSetter, function(compressor) {\n        return this.computed_key() && this.key.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Array, function(compressor) {\n        return any(this.elements, compressor);\n    });\n    def_has_side_effects(AST_Dot, function(compressor) {\n        if (is_nullish(this, compressor)) return false;\n        return !this.optional && this.expression.may_throw_on_access(compressor)\n            || this.expression.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Sub, function(compressor) {\n        if (is_nullish(this, compressor)) return false;\n\n        return !this.optional && this.expression.may_throw_on_access(compressor)\n            || this.expression.has_side_effects(compressor)\n            || this.property.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Chain, function (compressor) {\n        return this.expression.has_side_effects(compressor);\n    });\n    def_has_side_effects(AST_Sequence, function(compressor) {\n        return any(this.expressions, compressor);\n    });\n    def_has_side_effects(AST_Definitions, function(compressor) {\n        return any(this.definitions, compressor);\n    });\n    def_has_side_effects(AST_VarDef, function() {\n        return this.value;\n    });\n    def_has_side_effects(AST_TemplateSegment, return_false);\n    def_has_side_effects(AST_TemplateString, function(compressor) {\n        return any(this.segments, compressor);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"has_side_effects\", func);\n});\n\n// determine if expression may throw\n(function(def_may_throw) {\n    def_may_throw(AST_Node, return_true);\n\n    def_may_throw(AST_Constant, return_false);\n    def_may_throw(AST_EmptyStatement, return_false);\n    def_may_throw(AST_Lambda, return_false);\n    def_may_throw(AST_SymbolDeclaration, return_false);\n    def_may_throw(AST_This, return_false);\n    def_may_throw(AST_ImportMeta, return_false);\n\n    function any(list, compressor) {\n        for (var i = list.length; --i >= 0;)\n            if (list[i].may_throw(compressor))\n                return true;\n        return false;\n    }\n\n    def_may_throw(AST_Class, function(compressor) {\n        if (this.extends && this.extends.may_throw(compressor)) return true;\n        return any(this.properties, compressor);\n    });\n    def_may_throw(AST_ClassStaticBlock, function (compressor) {\n        return any(this.body, compressor);\n    });\n\n    def_may_throw(AST_Array, function(compressor) {\n        return any(this.elements, compressor);\n    });\n    def_may_throw(AST_Assign, function(compressor) {\n        if (this.right.may_throw(compressor)) return true;\n        if (!compressor.has_directive(\"use strict\")\n            && this.operator == \"=\"\n            && this.left instanceof AST_SymbolRef) {\n            return false;\n        }\n        return this.left.may_throw(compressor);\n    });\n    def_may_throw(AST_Binary, function(compressor) {\n        return this.left.may_throw(compressor)\n            || this.right.may_throw(compressor);\n    });\n    def_may_throw(AST_Block, function(compressor) {\n        return any(this.body, compressor);\n    });\n    def_may_throw(AST_Call, function(compressor) {\n        if (is_nullish(this, compressor)) return false;\n        if (any(this.args, compressor)) return true;\n        if (this.is_callee_pure(compressor)) return false;\n        if (this.expression.may_throw(compressor)) return true;\n        return !(this.expression instanceof AST_Lambda)\n            || any(this.expression.body, compressor);\n    });\n    def_may_throw(AST_Case, function(compressor) {\n        return this.expression.may_throw(compressor)\n            || any(this.body, compressor);\n    });\n    def_may_throw(AST_Conditional, function(compressor) {\n        return this.condition.may_throw(compressor)\n            || this.consequent.may_throw(compressor)\n            || this.alternative.may_throw(compressor);\n    });\n    def_may_throw(AST_Definitions, function(compressor) {\n        return any(this.definitions, compressor);\n    });\n    def_may_throw(AST_If, function(compressor) {\n        return this.condition.may_throw(compressor)\n            || this.body && this.body.may_throw(compressor)\n            || this.alternative && this.alternative.may_throw(compressor);\n    });\n    def_may_throw(AST_LabeledStatement, function(compressor) {\n        return this.body.may_throw(compressor);\n    });\n    def_may_throw(AST_Object, function(compressor) {\n        return any(this.properties, compressor);\n    });\n    def_may_throw(AST_ObjectProperty, function(compressor) {\n        // TODO key may throw too\n        return this.value ? this.value.may_throw(compressor) : false;\n    });\n    def_may_throw(AST_ClassProperty, function(compressor) {\n        return (\n            this.computed_key() && this.key.may_throw(compressor)\n            || this.static && this.value && this.value.may_throw(compressor)\n        );\n    });\n    def_may_throw(AST_ConciseMethod, function(compressor) {\n        return this.computed_key() && this.key.may_throw(compressor);\n    });\n    def_may_throw(AST_ObjectGetter, function(compressor) {\n        return this.computed_key() && this.key.may_throw(compressor);\n    });\n    def_may_throw(AST_ObjectSetter, function(compressor) {\n        return this.computed_key() && this.key.may_throw(compressor);\n    });\n    def_may_throw(AST_Return, function(compressor) {\n        return this.value && this.value.may_throw(compressor);\n    });\n    def_may_throw(AST_Sequence, function(compressor) {\n        return any(this.expressions, compressor);\n    });\n    def_may_throw(AST_SimpleStatement, function(compressor) {\n        return this.body.may_throw(compressor);\n    });\n    def_may_throw(AST_Dot, function(compressor) {\n        if (is_nullish(this, compressor)) return false;\n        return !this.optional && this.expression.may_throw_on_access(compressor)\n            || this.expression.may_throw(compressor);\n    });\n    def_may_throw(AST_Sub, function(compressor) {\n        if (is_nullish(this, compressor)) return false;\n        return !this.optional && this.expression.may_throw_on_access(compressor)\n            || this.expression.may_throw(compressor)\n            || this.property.may_throw(compressor);\n    });\n    def_may_throw(AST_Chain, function(compressor) {\n        return this.expression.may_throw(compressor);\n    });\n    def_may_throw(AST_Switch, function(compressor) {\n        return this.expression.may_throw(compressor)\n            || any(this.body, compressor);\n    });\n    def_may_throw(AST_SymbolRef, function(compressor) {\n        return !this.is_declared(compressor) && !pure_prop_access_globals.has(this.name);\n    });\n    def_may_throw(AST_SymbolClassProperty, return_false);\n    def_may_throw(AST_Try, function(compressor) {\n        return this.bcatch ? this.bcatch.may_throw(compressor) : this.body.may_throw(compressor)\n            || this.bfinally && this.bfinally.may_throw(compressor);\n    });\n    def_may_throw(AST_Unary, function(compressor) {\n        if (this.operator == \"typeof\" && this.expression instanceof AST_SymbolRef)\n            return false;\n        return this.expression.may_throw(compressor);\n    });\n    def_may_throw(AST_VarDef, function(compressor) {\n        if (!this.value) return false;\n        return this.value.may_throw(compressor);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"may_throw\", func);\n});\n\n// determine if expression is constant\n(function(def_is_constant_expression) {\n    function all_refs_local(scope) {\n        let result = true;\n        walk(this, node => {\n            if (node instanceof AST_SymbolRef) {\n                if (has_flag(this, INLINED)) {\n                    result = false;\n                    return walk_abort;\n                }\n                var def = node.definition();\n                if (\n                    member(def, this.enclosed)\n                    && !this.variables.has(def.name)\n                ) {\n                    if (scope) {\n                        var scope_def = scope.find_variable(node);\n                        if (def.undeclared ? !scope_def : scope_def === def) {\n                            result = \"f\";\n                            return true;\n                        }\n                    }\n                    result = false;\n                    return walk_abort;\n                }\n                return true;\n            }\n            if (node instanceof AST_This && this instanceof AST_Arrow) {\n                result = false;\n                return walk_abort;\n            }\n        });\n        return result;\n    }\n\n    def_is_constant_expression(AST_Node, return_false);\n    def_is_constant_expression(AST_Constant, return_true);\n    def_is_constant_expression(AST_Class, function(scope) {\n        if (this.extends && !this.extends.is_constant_expression(scope)) {\n            return false;\n        }\n\n        for (const prop of this.properties) {\n            if (prop.computed_key() && !prop.key.is_constant_expression(scope)) {\n                return false;\n            }\n            if (prop.static && prop.value && !prop.value.is_constant_expression(scope)) {\n                return false;\n            }\n            if (prop instanceof AST_ClassStaticBlock) {\n                return false;\n            }\n        }\n\n        return all_refs_local.call(this, scope);\n    });\n    def_is_constant_expression(AST_Lambda, all_refs_local);\n    def_is_constant_expression(AST_Unary, function() {\n        return this.expression.is_constant_expression();\n    });\n    def_is_constant_expression(AST_Binary, function() {\n        return this.left.is_constant_expression()\n            && this.right.is_constant_expression();\n    });\n    def_is_constant_expression(AST_Array, function() {\n        return this.elements.every((l) => l.is_constant_expression());\n    });\n    def_is_constant_expression(AST_Object, function() {\n        return this.properties.every((l) => l.is_constant_expression());\n    });\n    def_is_constant_expression(AST_ObjectProperty, function() {\n        return !!(!(this.key instanceof AST_Node) && this.value && this.value.is_constant_expression());\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"is_constant_expression\", func);\n});\n\n\n// may_throw_on_access()\n// returns true if this node may be null, undefined or contain `AST_Accessor`\n(function(def_may_throw_on_access) {\n    AST_Node.DEFMETHOD(\"may_throw_on_access\", function(compressor) {\n        return !compressor.option(\"pure_getters\")\n            || this._dot_throw(compressor);\n    });\n\n    function is_strict(compressor) {\n        return /strict/.test(compressor.option(\"pure_getters\"));\n    }\n\n    def_may_throw_on_access(AST_Node, is_strict);\n    def_may_throw_on_access(AST_Null, return_true);\n    def_may_throw_on_access(AST_Undefined, return_true);\n    def_may_throw_on_access(AST_Constant, return_false);\n    def_may_throw_on_access(AST_Array, return_false);\n    def_may_throw_on_access(AST_Object, function(compressor) {\n        if (!is_strict(compressor)) return false;\n        for (var i = this.properties.length; --i >=0;)\n            if (this.properties[i]._dot_throw(compressor)) return true;\n        return false;\n    });\n    // Do not be as strict with classes as we are with objects.\n    // Hopefully the community is not going to abuse static getters and setters.\n    // https://github.com/terser/terser/issues/724#issuecomment-643655656\n    def_may_throw_on_access(AST_Class, return_false);\n    def_may_throw_on_access(AST_ObjectProperty, return_false);\n    def_may_throw_on_access(AST_ObjectGetter, return_true);\n    def_may_throw_on_access(AST_Expansion, function(compressor) {\n        return this.expression._dot_throw(compressor);\n    });\n    def_may_throw_on_access(AST_Function, return_false);\n    def_may_throw_on_access(AST_Arrow, return_false);\n    def_may_throw_on_access(AST_UnaryPostfix, return_false);\n    def_may_throw_on_access(AST_UnaryPrefix, function() {\n        return this.operator == \"void\";\n    });\n    def_may_throw_on_access(AST_Binary, function(compressor) {\n        return (this.operator == \"&&\" || this.operator == \"||\" || this.operator == \"??\")\n            && (this.left._dot_throw(compressor) || this.right._dot_throw(compressor));\n    });\n    def_may_throw_on_access(AST_Assign, function(compressor) {\n        if (this.logical) return true;\n\n        return this.operator == \"=\"\n            && this.right._dot_throw(compressor);\n    });\n    def_may_throw_on_access(AST_Conditional, function(compressor) {\n        return this.consequent._dot_throw(compressor)\n            || this.alternative._dot_throw(compressor);\n    });\n    def_may_throw_on_access(AST_Dot, function(compressor) {\n        if (!is_strict(compressor)) return false;\n\n        if (this.property == \"prototype\") {\n            return !(\n                this.expression instanceof AST_Function\n                || this.expression instanceof AST_Class\n            );\n        }\n        return true;\n    });\n    def_may_throw_on_access(AST_Chain, function(compressor) {\n        return this.expression._dot_throw(compressor);\n    });\n    def_may_throw_on_access(AST_Sequence, function(compressor) {\n        return this.tail_node()._dot_throw(compressor);\n    });\n    def_may_throw_on_access(AST_SymbolRef, function(compressor) {\n        if (this.name === \"arguments\" && this.scope instanceof AST_Lambda) return false;\n        if (has_flag(this, UNDEFINED)) return true;\n        if (!is_strict(compressor)) return false;\n        if (is_undeclared_ref(this) && this.is_declared(compressor)) return false;\n        if (this.is_immutable()) return false;\n        var fixed = this.fixed_value();\n        return !fixed || fixed._dot_throw(compressor);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"_dot_throw\", func);\n});\n\nexport function is_lhs(node, parent) {\n    if (parent instanceof AST_Unary && unary_side_effects.has(parent.operator)) return parent.expression;\n    if (parent instanceof AST_Assign && parent.left === node) return node;\n    if (parent instanceof AST_ForIn && parent.init === node) return node;\n}\n\n(function(def_find_defs) {\n    function to_node(value, orig) {\n        if (value instanceof AST_Node) {\n            if (!(value instanceof AST_Constant)) {\n                // Value may be a function, an array including functions and even a complex assign / block expression,\n                // so it should never be shared in different places.\n                // Otherwise wrong information may be used in the compression phase\n                value = value.clone(true);\n            }\n            return make_node(value.CTOR, orig, value);\n        }\n        if (Array.isArray(value)) return make_node(AST_Array, orig, {\n            elements: value.map(function(value) {\n                return to_node(value, orig);\n            })\n        });\n        if (value && typeof value == \"object\") {\n            var props = [];\n            for (var key in value) if (HOP(value, key)) {\n                props.push(make_node(AST_ObjectKeyVal, orig, {\n                    key: key,\n                    value: to_node(value[key], orig)\n                }));\n            }\n            return make_node(AST_Object, orig, {\n                properties: props\n            });\n        }\n        return make_node_from_constant(value, orig);\n    }\n\n    AST_Toplevel.DEFMETHOD(\"resolve_defines\", function(compressor) {\n        if (!compressor.option(\"global_defs\")) return this;\n        this.figure_out_scope({ ie8: compressor.option(\"ie8\") });\n        return this.transform(new TreeTransformer(function(node) {\n            var def = node._find_defs(compressor, \"\");\n            if (!def) return;\n            var level = 0, child = node, parent;\n            while (parent = this.parent(level++)) {\n                if (!(parent instanceof AST_PropAccess)) break;\n                if (parent.expression !== child) break;\n                child = parent;\n            }\n            if (is_lhs(child, parent)) {\n                return;\n            }\n            return def;\n        }));\n    });\n    def_find_defs(AST_Node, noop);\n    def_find_defs(AST_Chain, function(compressor, suffix) {\n        return this.expression._find_defs(compressor, suffix);\n    });\n    def_find_defs(AST_Dot, function(compressor, suffix) {\n        return this.expression._find_defs(compressor, \".\" + this.property + suffix);\n    });\n    def_find_defs(AST_SymbolDeclaration, function() {\n        if (!this.global()) return;\n    });\n    def_find_defs(AST_SymbolRef, function(compressor, suffix) {\n        if (!this.global()) return;\n        var defines = compressor.option(\"global_defs\");\n        var name = this.name + suffix;\n        if (HOP(defines, name)) return to_node(defines[name], this);\n    });\n    def_find_defs(AST_ImportMeta, function(compressor, suffix) {\n        var defines = compressor.option(\"global_defs\");\n        var name = \"import.meta\" + suffix;\n        if (HOP(defines, name)) return to_node(defines[name], this);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"_find_defs\", func);\n});\n\n// method to negate an expression\n(function(def_negate) {\n    function basic_negation(exp) {\n        return make_node(AST_UnaryPrefix, exp, {\n            operator: \"!\",\n            expression: exp\n        });\n    }\n    function best(orig, alt, first_in_statement) {\n        var negated = basic_negation(orig);\n        if (first_in_statement) {\n            var stat = make_node(AST_SimpleStatement, alt, {\n                body: alt\n            });\n            return best_of_expression(negated, stat) === stat ? alt : negated;\n        }\n        return best_of_expression(negated, alt);\n    }\n    def_negate(AST_Node, function() {\n        return basic_negation(this);\n    });\n    def_negate(AST_Statement, function() {\n        throw new Error(\"Cannot negate a statement\");\n    });\n    def_negate(AST_Function, function() {\n        return basic_negation(this);\n    });\n    def_negate(AST_Class, function() {\n        return basic_negation(this);\n    });\n    def_negate(AST_Arrow, function() {\n        return basic_negation(this);\n    });\n    def_negate(AST_UnaryPrefix, function() {\n        if (this.operator == \"!\")\n            return this.expression;\n        return basic_negation(this);\n    });\n    def_negate(AST_Sequence, function(compressor) {\n        var expressions = this.expressions.slice();\n        expressions.push(expressions.pop().negate(compressor));\n        return make_sequence(this, expressions);\n    });\n    def_negate(AST_Conditional, function(compressor, first_in_statement) {\n        var self = this.clone();\n        self.consequent = self.consequent.negate(compressor);\n        self.alternative = self.alternative.negate(compressor);\n        return best(this, self, first_in_statement);\n    });\n    def_negate(AST_Binary, function(compressor, first_in_statement) {\n        var self = this.clone(), op = this.operator;\n        if (compressor.option(\"unsafe_comps\")) {\n            switch (op) {\n              case \"<=\" : self.operator = \">\"  ; return self;\n              case \"<\"  : self.operator = \">=\" ; return self;\n              case \">=\" : self.operator = \"<\"  ; return self;\n              case \">\"  : self.operator = \"<=\" ; return self;\n            }\n        }\n        switch (op) {\n          case \"==\" : self.operator = \"!=\"; return self;\n          case \"!=\" : self.operator = \"==\"; return self;\n          case \"===\": self.operator = \"!==\"; return self;\n          case \"!==\": self.operator = \"===\"; return self;\n          case \"&&\":\n            self.operator = \"||\";\n            self.left = self.left.negate(compressor, first_in_statement);\n            self.right = self.right.negate(compressor);\n            return best(this, self, first_in_statement);\n          case \"||\":\n            self.operator = \"&&\";\n            self.left = self.left.negate(compressor, first_in_statement);\n            self.right = self.right.negate(compressor);\n            return best(this, self, first_in_statement);\n        }\n        return basic_negation(this);\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"negate\", function(compressor, first_in_statement) {\n        return func.call(this, compressor, first_in_statement);\n    });\n});\n\n// Is the callee of this function pure?\nvar global_pure_fns = makePredicate(\"Boolean decodeURI decodeURIComponent Date encodeURI encodeURIComponent Error escape EvalError isFinite isNaN Number Object parseFloat parseInt RangeError ReferenceError String SyntaxError TypeError unescape URIError\");\nAST_Call.DEFMETHOD(\"is_callee_pure\", function(compressor) {\n    if (compressor.option(\"unsafe\")) {\n        var expr = this.expression;\n        var first_arg = (this.args && this.args[0] && this.args[0].evaluate(compressor));\n        if (\n            expr.expression && expr.expression.name === \"hasOwnProperty\" &&\n            (first_arg == null || first_arg.thedef && first_arg.thedef.undeclared)\n        ) {\n            return false;\n        }\n        if (is_undeclared_ref(expr) && global_pure_fns.has(expr.name)) return true;\n        if (\n            expr instanceof AST_Dot\n            && is_undeclared_ref(expr.expression)\n            && is_pure_native_fn(expr.expression.name, expr.property)\n        ) {\n            return true;\n        }\n    }\n    return !!has_annotation(this, _PURE) || !compressor.pure_funcs(this);\n});\n\n// If I call this, is it a pure function?\nAST_Node.DEFMETHOD(\"is_call_pure\", return_false);\nAST_Dot.DEFMETHOD(\"is_call_pure\", function(compressor) {\n    if (!compressor.option(\"unsafe\")) return;\n    const expr = this.expression;\n\n    let native_obj;\n    if (expr instanceof AST_Array) {\n        native_obj = \"Array\";\n    } else if (expr.is_boolean()) {\n        native_obj = \"Boolean\";\n    } else if (expr.is_number(compressor)) {\n        native_obj = \"Number\";\n    } else if (expr instanceof AST_RegExp) {\n        native_obj = \"RegExp\";\n    } else if (expr.is_string(compressor)) {\n        native_obj = \"String\";\n    } else if (!this.may_throw_on_access(compressor)) {\n        native_obj = \"Object\";\n    }\n    return native_obj != null && is_pure_native_method(native_obj, this.property);\n});\n\n// tell me if a statement aborts\nexport const aborts = (thing) => thing && thing.aborts();\n\n(function(def_aborts) {\n    def_aborts(AST_Statement, return_null);\n    def_aborts(AST_Jump, return_this);\n    function block_aborts() {\n        for (var i = 0; i < this.body.length; i++) {\n            if (aborts(this.body[i])) {\n                return this.body[i];\n            }\n        }\n        return null;\n    }\n    def_aborts(AST_Import, return_null);\n    def_aborts(AST_BlockStatement, block_aborts);\n    def_aborts(AST_SwitchBranch, block_aborts);\n    def_aborts(AST_DefClass, function () {\n        for (const prop of this.properties) {\n            if (prop instanceof AST_ClassStaticBlock) {\n                if (prop.aborts()) return prop;\n            }\n        }\n        return null;\n    });\n    def_aborts(AST_ClassStaticBlock, block_aborts);\n    def_aborts(AST_If, function() {\n        return this.alternative && aborts(this.body) && aborts(this.alternative) && this;\n    });\n})(function(node, func) {\n    node.DEFMETHOD(\"aborts\", func);\n});\n\nAST_Node.DEFMETHOD(\"contains_this\", function() {\n    return walk(this, node => {\n        if (node instanceof AST_This) return walk_abort;\n        if (\n            node !== this\n            && node instanceof AST_Scope\n            && !(node instanceof AST_Arrow)\n        ) {\n            return true;\n        }\n    });\n});\n\nexport function is_modified(compressor, tw, node, value, level, immutable) {\n    var parent = tw.parent(level);\n    var lhs = is_lhs(node, parent);\n    if (lhs) return lhs;\n    if (!immutable\n        && parent instanceof AST_Call\n        && parent.expression === node\n        && !(value instanceof AST_Arrow)\n        && !(value instanceof AST_Class)\n        && !parent.is_callee_pure(compressor)\n        && (!(value instanceof AST_Function)\n            || !(parent instanceof AST_New) && value.contains_this())) {\n        return true;\n    }\n    if (parent instanceof AST_Array) {\n        return is_modified(compressor, tw, parent, parent, level + 1);\n    }\n    if (parent instanceof AST_ObjectKeyVal && node === parent.value) {\n        var obj = tw.parent(level + 1);\n        return is_modified(compressor, tw, obj, obj, level + 2);\n    }\n    if (parent instanceof AST_PropAccess && parent.expression === node) {\n        var prop = read_property(value, parent.property);\n        return !immutable && is_modified(compressor, tw, parent, prop, level + 1);\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/inline.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Array,\n    AST_Assign,\n    AST_Block,\n    AST_Call,\n    AST_Catch,\n    AST_Class,\n    AST_ClassExpression,\n    AST_DefaultAssign,\n    AST_DefClass,\n    AST_Defun,\n    AST_Destructuring,\n    AST_EmptyStatement,\n    AST_Expansion,\n    AST_Export,\n    AST_Function,\n    AST_IterationStatement,\n    AST_Lambda,\n    AST_Node,\n    AST_Number,\n    AST_Object,\n    AST_ObjectKeyVal,\n    AST_PropAccess,\n    AST_Return,\n    AST_Scope,\n    AST_SimpleStatement,\n    AST_Statement,\n    AST_SymbolDefun,\n    AST_SymbolFunarg,\n    AST_SymbolLambda,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_This,\n    AST_Toplevel,\n    AST_UnaryPrefix,\n    AST_Undefined,\n    AST_Var,\n    AST_VarDef,\n\n    walk,\n\n    _INLINE,\n    _NOINLINE,\n    _PURE\n} from \"../ast.js\";\nimport { make_node, has_annotation } from \"../utils/index.js\";\nimport \"../size.js\";\n\nimport \"./evaluate.js\";\nimport \"./drop-side-effect-free.js\";\nimport \"./reduce-vars.js\";\nimport {\n    SQUEEZED,\n    INLINED,\n    UNUSED,\n\n    has_flag,\n    set_flag,\n} from \"./compressor-flags.js\";\nimport {\n    make_sequence,\n    best_of,\n    make_node_from_constant,\n    identifier_atom,\n    is_empty,\n    is_func_expr,\n    is_iife_call,\n    is_reachable,\n    is_recursive_ref,\n    retain_top_func,\n} from \"./common.js\";\n\n/**\n * Module that contains the inlining logic.\n *\n * @module\n *\n * The stars of the show are `inline_into_symbolref` and `inline_into_call`.\n */\n\nfunction within_array_or_object_literal(compressor) {\n    var node, level = 0;\n    while (node = compressor.parent(level++)) {\n        if (node instanceof AST_Statement) return false;\n        if (node instanceof AST_Array\n            || node instanceof AST_ObjectKeyVal\n            || node instanceof AST_Object) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction scope_encloses_variables_in_this_scope(scope, pulled_scope) {\n    for (const enclosed of pulled_scope.enclosed) {\n        if (pulled_scope.variables.has(enclosed.name)) {\n            continue;\n        }\n        const looked_up = scope.find_variable(enclosed.name);\n        if (looked_up) {\n            if (looked_up === enclosed) continue;\n            return true;\n        }\n    }\n    return false;\n}\n\nexport function inline_into_symbolref(self, compressor) {\n    const parent = compressor.parent();\n\n    const def = self.definition();\n    const nearest_scope = compressor.find_scope();\n    if (compressor.top_retain && def.global && compressor.top_retain(def)) {\n        def.fixed = false;\n        def.single_use = false;\n        return self;\n    }\n\n    let fixed = self.fixed_value();\n    let single_use = def.single_use\n        && !(parent instanceof AST_Call\n            && (parent.is_callee_pure(compressor))\n                || has_annotation(parent, _NOINLINE))\n        && !(parent instanceof AST_Export\n            && fixed instanceof AST_Lambda\n            && fixed.name);\n\n    if (single_use && fixed instanceof AST_Node) {\n        single_use =\n            !fixed.has_side_effects(compressor)\n            && !fixed.may_throw(compressor);\n    }\n\n    if (single_use && (fixed instanceof AST_Lambda || fixed instanceof AST_Class)) {\n        if (retain_top_func(fixed, compressor)) {\n            single_use = false;\n        } else if (def.scope !== self.scope\n            && (def.escaped == 1\n                || has_flag(fixed, INLINED)\n                || within_array_or_object_literal(compressor)\n                || !compressor.option(\"reduce_funcs\"))) {\n            single_use = false;\n        } else if (is_recursive_ref(compressor, def)) {\n            single_use = false;\n        } else if (def.scope !== self.scope || def.orig[0] instanceof AST_SymbolFunarg) {\n            single_use = fixed.is_constant_expression(self.scope);\n            if (single_use == \"f\") {\n                var scope = self.scope;\n                do {\n                    if (scope instanceof AST_Defun || is_func_expr(scope)) {\n                        set_flag(scope, INLINED);\n                    }\n                } while (scope = scope.parent_scope);\n            }\n        }\n    }\n\n    if (single_use && (fixed instanceof AST_Lambda || fixed instanceof AST_Class)) {\n        single_use =\n            def.scope === self.scope\n                && !scope_encloses_variables_in_this_scope(nearest_scope, fixed)\n            || parent instanceof AST_Call\n                && parent.expression === self\n                && !scope_encloses_variables_in_this_scope(nearest_scope, fixed)\n                && !(fixed.name && fixed.name.definition().recursive_refs > 0);\n    }\n\n    if (single_use && fixed) {\n        if (fixed instanceof AST_DefClass) {\n            set_flag(fixed, SQUEEZED);\n            fixed = make_node(AST_ClassExpression, fixed, fixed);\n        }\n        if (fixed instanceof AST_Defun) {\n            set_flag(fixed, SQUEEZED);\n            fixed = make_node(AST_Function, fixed, fixed);\n        }\n        if (def.recursive_refs > 0 && fixed.name instanceof AST_SymbolDefun) {\n            const defun_def = fixed.name.definition();\n            let lambda_def = fixed.variables.get(fixed.name.name);\n            let name = lambda_def && lambda_def.orig[0];\n            if (!(name instanceof AST_SymbolLambda)) {\n                name = make_node(AST_SymbolLambda, fixed.name, fixed.name);\n                name.scope = fixed;\n                fixed.name = name;\n                lambda_def = fixed.def_function(name);\n            }\n            walk(fixed, node => {\n                if (node instanceof AST_SymbolRef && node.definition() === defun_def) {\n                    node.thedef = lambda_def;\n                    lambda_def.references.push(node);\n                }\n            });\n        }\n        if (\n            (fixed instanceof AST_Lambda || fixed instanceof AST_Class)\n            && fixed.parent_scope !== nearest_scope\n        ) {\n            fixed = fixed.clone(true, compressor.get_toplevel());\n\n            nearest_scope.add_child_scope(fixed);\n        }\n        return fixed.optimize(compressor);\n    }\n\n    // multiple uses\n    if (fixed) {\n        let replace;\n\n        if (fixed instanceof AST_This) {\n            if (!(def.orig[0] instanceof AST_SymbolFunarg)\n                && def.references.every((ref) =>\n                    def.scope === ref.scope\n                )) {\n                replace = fixed;\n            }\n        } else {\n            var ev = fixed.evaluate(compressor);\n            if (\n                ev !== fixed\n                && (compressor.option(\"unsafe_regexp\") || !(ev instanceof RegExp))\n            ) {\n                replace = make_node_from_constant(ev, fixed);\n            }\n        }\n\n        if (replace) {\n            const name_length = self.size(compressor);\n            const replace_size = replace.size(compressor);\n\n            let overhead = 0;\n            if (compressor.option(\"unused\") && !compressor.exposed(def)) {\n                overhead =\n                    (name_length + 2 + replace_size) /\n                    (def.references.length - def.assignments);\n            }\n\n            if (replace_size <= name_length + overhead) {\n                return replace;\n            }\n        }\n    }\n\n    return self;\n}\n\nexport function inline_into_call(self, fn, compressor) {\n    var exp = self.expression;\n    var simple_args = self.args.every((arg) => !(arg instanceof AST_Expansion));\n\n    if (compressor.option(\"reduce_vars\")\n        && fn instanceof AST_SymbolRef\n        && !has_annotation(self, _NOINLINE)\n    ) {\n        const fixed = fn.fixed_value();\n        if (!retain_top_func(fixed, compressor)) {\n            fn = fixed;\n        }\n    }\n\n    var is_func = fn instanceof AST_Lambda;\n\n    var stat = is_func && fn.body[0];\n    var is_regular_func = is_func && !fn.is_generator && !fn.async;\n    var can_inline = is_regular_func && compressor.option(\"inline\") && !self.is_callee_pure(compressor);\n    if (can_inline && stat instanceof AST_Return) {\n        let returned = stat.value;\n        if (!returned || returned.is_constant_expression()) {\n            if (returned) {\n                returned = returned.clone(true);\n            } else {\n                returned = make_node(AST_Undefined, self);\n            }\n            const args = self.args.concat(returned);\n            return make_sequence(self, args).optimize(compressor);\n        }\n\n        // optimize identity function\n        if (\n            fn.argnames.length === 1\n            && (fn.argnames[0] instanceof AST_SymbolFunarg)\n            && self.args.length < 2\n            && !(self.args[0] instanceof AST_Expansion)\n            && returned instanceof AST_SymbolRef\n            && returned.name === fn.argnames[0].name\n        ) {\n            const replacement =\n                (self.args[0] || make_node(AST_Undefined)).optimize(compressor);\n\n            let parent;\n            if (\n                replacement instanceof AST_PropAccess\n                && (parent = compressor.parent()) instanceof AST_Call\n                && parent.expression === self\n            ) {\n                // identity function was being used to remove `this`, like in\n                //\n                // id(bag.no_this)(...)\n                //\n                // Replace with a larger but more effish (0, bag.no_this) wrapper.\n\n                return make_sequence(self, [\n                    make_node(AST_Number, self, { value: 0 }),\n                    replacement\n                ]);\n            }\n            // replace call with first argument or undefined if none passed\n            return replacement;\n        }\n    }\n\n    if (can_inline) {\n        var scope, in_loop, level = -1;\n        let def;\n        let returned_value;\n        let nearest_scope;\n        if (simple_args\n            && !fn.uses_arguments\n            && !(compressor.parent() instanceof AST_Class)\n            && !(fn.name && fn instanceof AST_Function)\n            && (returned_value = can_flatten_body(stat))\n            && (exp === fn\n                || has_annotation(self, _INLINE)\n                || compressor.option(\"unused\")\n                    && (def = exp.definition()).references.length == 1\n                    && !is_recursive_ref(compressor, def)\n                    && fn.is_constant_expression(exp.scope))\n            && !has_annotation(self, _PURE | _NOINLINE)\n            && !fn.contains_this()\n            && can_inject_symbols()\n            && (nearest_scope = compressor.find_scope())\n            && !scope_encloses_variables_in_this_scope(nearest_scope, fn)\n            && !(function in_default_assign() {\n                    // Due to the fact function parameters have their own scope\n                    // which can't use `var something` in the function body within,\n                    // we simply don't inline into DefaultAssign.\n                    let i = 0;\n                    let p;\n                    while ((p = compressor.parent(i++))) {\n                        if (p instanceof AST_DefaultAssign) return true;\n                        if (p instanceof AST_Block) break;\n                    }\n                    return false;\n                })()\n            && !(scope instanceof AST_Class)\n        ) {\n            set_flag(fn, SQUEEZED);\n            nearest_scope.add_child_scope(fn);\n            return make_sequence(self, flatten_fn(returned_value)).optimize(compressor);\n        }\n    }\n\n    if (can_inline && has_annotation(self, _INLINE)) {\n        set_flag(fn, SQUEEZED);\n        fn = make_node(fn.CTOR === AST_Defun ? AST_Function : fn.CTOR, fn, fn);\n        fn = fn.clone(true);\n        fn.figure_out_scope({}, {\n            parent_scope: compressor.find_scope(),\n            toplevel: compressor.get_toplevel()\n        });\n\n        return make_node(AST_Call, self, {\n            expression: fn,\n            args: self.args,\n        }).optimize(compressor);\n    }\n\n    const can_drop_this_call = is_regular_func && compressor.option(\"side_effects\") && fn.body.every(is_empty);\n    if (can_drop_this_call) {\n        var args = self.args.concat(make_node(AST_Undefined, self));\n        return make_sequence(self, args).optimize(compressor);\n    }\n\n    if (compressor.option(\"negate_iife\")\n        && compressor.parent() instanceof AST_SimpleStatement\n        && is_iife_call(self)) {\n        return self.negate(compressor, true);\n    }\n\n    var ev = self.evaluate(compressor);\n    if (ev !== self) {\n        ev = make_node_from_constant(ev, self).optimize(compressor);\n        return best_of(compressor, ev, self);\n    }\n\n    return self;\n\n    function return_value(stat) {\n        if (!stat) return make_node(AST_Undefined, self);\n        if (stat instanceof AST_Return) {\n            if (!stat.value) return make_node(AST_Undefined, self);\n            return stat.value.clone(true);\n        }\n        if (stat instanceof AST_SimpleStatement) {\n            return make_node(AST_UnaryPrefix, stat, {\n                operator: \"void\",\n                expression: stat.body.clone(true)\n            });\n        }\n    }\n\n    function can_flatten_body(stat) {\n        var body = fn.body;\n        var len = body.length;\n        if (compressor.option(\"inline\") < 3) {\n            return len == 1 && return_value(stat);\n        }\n        stat = null;\n        for (var i = 0; i < len; i++) {\n            var line = body[i];\n            if (line instanceof AST_Var) {\n                if (stat && !line.definitions.every((var_def) =>\n                    !var_def.value\n                )) {\n                    return false;\n                }\n            } else if (stat) {\n                return false;\n            } else if (!(line instanceof AST_EmptyStatement)) {\n                stat = line;\n            }\n        }\n        return return_value(stat);\n    }\n\n    function can_inject_args(block_scoped, safe_to_inject) {\n        for (var i = 0, len = fn.argnames.length; i < len; i++) {\n            var arg = fn.argnames[i];\n            if (arg instanceof AST_DefaultAssign) {\n                if (has_flag(arg.left, UNUSED)) continue;\n                return false;\n            }\n            if (arg instanceof AST_Destructuring) return false;\n            if (arg instanceof AST_Expansion) {\n                if (has_flag(arg.expression, UNUSED)) continue;\n                return false;\n            }\n            if (has_flag(arg, UNUSED)) continue;\n            if (!safe_to_inject\n                || block_scoped.has(arg.name)\n                || identifier_atom.has(arg.name)\n                || scope.conflicting_def(arg.name)) {\n                return false;\n            }\n            if (in_loop) in_loop.push(arg.definition());\n        }\n        return true;\n    }\n\n    function can_inject_vars(block_scoped, safe_to_inject) {\n        var len = fn.body.length;\n        for (var i = 0; i < len; i++) {\n            var stat = fn.body[i];\n            if (!(stat instanceof AST_Var)) continue;\n            if (!safe_to_inject) return false;\n            for (var j = stat.definitions.length; --j >= 0;) {\n                var name = stat.definitions[j].name;\n                if (name instanceof AST_Destructuring\n                    || block_scoped.has(name.name)\n                    || identifier_atom.has(name.name)\n                    || scope.conflicting_def(name.name)) {\n                    return false;\n                }\n                if (in_loop) in_loop.push(name.definition());\n            }\n        }\n        return true;\n    }\n\n    function can_inject_symbols() {\n        var block_scoped = new Set();\n        do {\n            scope = compressor.parent(++level);\n            if (scope.is_block_scope() && scope.block_scope) {\n                // TODO this is sometimes undefined during compression.\n                // But it should always have a value!\n                scope.block_scope.variables.forEach(function (variable) {\n                    block_scoped.add(variable.name);\n                });\n            }\n            if (scope instanceof AST_Catch) {\n                // TODO can we delete? AST_Catch is a block scope.\n                if (scope.argname) {\n                    block_scoped.add(scope.argname.name);\n                }\n            } else if (scope instanceof AST_IterationStatement) {\n                in_loop = [];\n            } else if (scope instanceof AST_SymbolRef) {\n                if (scope.fixed_value() instanceof AST_Scope) return false;\n            }\n        } while (!(scope instanceof AST_Scope));\n\n        var safe_to_inject = !(scope instanceof AST_Toplevel) || compressor.toplevel.vars;\n        var inline = compressor.option(\"inline\");\n        if (!can_inject_vars(block_scoped, inline >= 3 && safe_to_inject)) return false;\n        if (!can_inject_args(block_scoped, inline >= 2 && safe_to_inject)) return false;\n        return !in_loop || in_loop.length == 0 || !is_reachable(fn, in_loop);\n    }\n\n    function append_var(decls, expressions, name, value) {\n        var def = name.definition();\n\n        // Name already exists, only when a function argument had the same name\n        const already_appended = scope.variables.has(name.name);\n        if (!already_appended) {\n            scope.variables.set(name.name, def);\n            scope.enclosed.push(def);\n            decls.push(make_node(AST_VarDef, name, {\n                name: name,\n                value: null\n            }));\n        }\n\n        var sym = make_node(AST_SymbolRef, name, name);\n        def.references.push(sym);\n        if (value) expressions.push(make_node(AST_Assign, self, {\n            operator: \"=\",\n            logical: false,\n            left: sym,\n            right: value.clone()\n        }));\n    }\n\n    function flatten_args(decls, expressions) {\n        var len = fn.argnames.length;\n        for (var i = self.args.length; --i >= len;) {\n            expressions.push(self.args[i]);\n        }\n        for (i = len; --i >= 0;) {\n            var name = fn.argnames[i];\n            var value = self.args[i];\n            if (has_flag(name, UNUSED) || !name.name || scope.conflicting_def(name.name)) {\n                if (value) expressions.push(value);\n            } else {\n                var symbol = make_node(AST_SymbolVar, name, name);\n                name.definition().orig.push(symbol);\n                if (!value && in_loop) value = make_node(AST_Undefined, self);\n                append_var(decls, expressions, symbol, value);\n            }\n        }\n        decls.reverse();\n        expressions.reverse();\n    }\n\n    function flatten_vars(decls, expressions) {\n        var pos = expressions.length;\n        for (var i = 0, lines = fn.body.length; i < lines; i++) {\n            var stat = fn.body[i];\n            if (!(stat instanceof AST_Var)) continue;\n            for (var j = 0, defs = stat.definitions.length; j < defs; j++) {\n                var var_def = stat.definitions[j];\n                var name = var_def.name;\n                append_var(decls, expressions, name, var_def.value);\n                if (in_loop && fn.argnames.every((argname) =>\n                    argname.name != name.name\n                )) {\n                    var def = fn.variables.get(name.name);\n                    var sym = make_node(AST_SymbolRef, name, name);\n                    def.references.push(sym);\n                    expressions.splice(pos++, 0, make_node(AST_Assign, var_def, {\n                        operator: \"=\",\n                        logical: false,\n                        left: sym,\n                        right: make_node(AST_Undefined, name)\n                    }));\n                }\n            }\n        }\n    }\n\n    function flatten_fn(returned_value) {\n        var decls = [];\n        var expressions = [];\n        flatten_args(decls, expressions);\n        flatten_vars(decls, expressions);\n        expressions.push(returned_value);\n\n        if (decls.length) {\n            const i = scope.body.indexOf(compressor.parent(level - 1)) + 1;\n            scope.body.splice(i, 0, make_node(AST_Var, fn, {\n                definitions: decls\n            }));\n        }\n\n        return expressions.map(exp => exp.clone(true));\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/native-objects.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport { makePredicate } from \"../utils/index.js\";\n\n// Lists of native methods, useful for `unsafe` option which assumes they exist.\n// Note: Lots of methods and functions are missing here, in case they aren't pure\n// or not available in all JS environments.\n\nfunction make_nested_lookup(obj) {\n    const out = new Map();\n    for (var key of Object.keys(obj)) {\n        out.set(key, makePredicate(obj[key]));\n    }\n\n    const does_have = (global_name, fname) => {\n        const inner_map = out.get(global_name);\n        return inner_map != null && inner_map.has(fname);\n    };\n    return does_have;\n}\n\n// Objects which are safe to access without throwing or causing a side effect.\n// Usually we'd check the `unsafe` option first but these are way too common for that\nexport const pure_prop_access_globals = new Set([\n    \"Number\",\n    \"String\",\n    \"Array\",\n    \"Object\",\n    \"Function\",\n    \"Promise\",\n]);\n\nconst object_methods = [\n    \"constructor\",\n    \"toString\",\n    \"valueOf\",\n];\n\nexport const is_pure_native_method = make_nested_lookup({\n    Array: [\n        \"at\",\n        \"flat\",\n        \"includes\",\n        \"indexOf\",\n        \"join\",\n        \"lastIndexOf\",\n        \"slice\",\n        ...object_methods,\n    ],\n    Boolean: object_methods,\n    Function: object_methods,\n    Number: [\n        \"toExponential\",\n        \"toFixed\",\n        \"toPrecision\",\n        ...object_methods,\n    ],\n    Object: object_methods,\n    RegExp: [\n        \"test\",\n        ...object_methods,\n    ],\n    String: [\n        \"at\",\n        \"charAt\",\n        \"charCodeAt\",\n        \"charPointAt\",\n        \"concat\",\n        \"endsWith\",\n        \"fromCharCode\",\n        \"fromCodePoint\",\n        \"includes\",\n        \"indexOf\",\n        \"italics\",\n        \"lastIndexOf\",\n        \"localeCompare\",\n        \"match\",\n        \"matchAll\",\n        \"normalize\",\n        \"padStart\",\n        \"padEnd\",\n        \"repeat\",\n        \"replace\",\n        \"replaceAll\",\n        \"search\",\n        \"slice\",\n        \"split\",\n        \"startsWith\",\n        \"substr\",\n        \"substring\",\n        \"repeat\",\n        \"toLocaleLowerCase\",\n        \"toLocaleUpperCase\",\n        \"toLowerCase\",\n        \"toUpperCase\",\n        \"trim\",\n        \"trimEnd\",\n        \"trimStart\",\n        ...object_methods,\n    ],\n});\n\nexport const is_pure_native_fn = make_nested_lookup({\n    Array: [\n        \"isArray\",\n    ],\n    Math: [\n        \"abs\",\n        \"acos\",\n        \"asin\",\n        \"atan\",\n        \"ceil\",\n        \"cos\",\n        \"exp\",\n        \"floor\",\n        \"log\",\n        \"round\",\n        \"sin\",\n        \"sqrt\",\n        \"tan\",\n        \"atan2\",\n        \"pow\",\n        \"max\",\n        \"min\",\n    ],\n    Number: [\n        \"isFinite\",\n        \"isNaN\",\n    ],\n    Object: [\n        \"create\",\n        \"getOwnPropertyDescriptor\",\n        \"getOwnPropertyNames\",\n        \"getPrototypeOf\",\n        \"isExtensible\",\n        \"isFrozen\",\n        \"isSealed\",\n        \"hasOwn\",\n        \"keys\",\n    ],\n    String: [\n        \"fromCharCode\",\n    ],\n});\n\n// Known numeric values which come with JS environments\nexport const is_pure_native_value = make_nested_lookup({\n    Math: [\n        \"E\",\n        \"LN10\",\n        \"LN2\",\n        \"LOG2E\",\n        \"LOG10E\",\n        \"PI\",\n        \"SQRT1_2\",\n        \"SQRT2\",\n    ],\n    Number: [\n        \"MAX_VALUE\",\n        \"MIN_VALUE\",\n        \"NaN\",\n        \"NEGATIVE_INFINITY\",\n        \"POSITIVE_INFINITY\",\n    ],\n});\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/reduce-vars.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Accessor,\n    AST_Array,\n    AST_Assign,\n    AST_Await,\n    AST_Binary,\n    AST_Block,\n    AST_Call,\n    AST_Case,\n    AST_Chain,\n    AST_Class,\n    AST_ClassStaticBlock,\n    AST_ClassExpression,\n    AST_Conditional,\n    AST_Default,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Do,\n    AST_Exit,\n    AST_Expansion,\n    AST_For,\n    AST_ForIn,\n    AST_If,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_New,\n    AST_Node,\n    AST_Number,\n    AST_ObjectKeyVal,\n    AST_PropAccess,\n    AST_Scope,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Symbol,\n    AST_SymbolCatch,\n    AST_SymbolConst,\n    AST_SymbolDeclaration,\n    AST_SymbolDefun,\n    AST_SymbolFunarg,\n    AST_SymbolLambda,\n    AST_SymbolRef,\n    AST_This,\n    AST_Toplevel,\n    AST_Try,\n    AST_Unary,\n    AST_UnaryPrefix,\n    AST_Undefined,\n    AST_VarDef,\n    AST_While,\n    AST_Yield,\n\n    walk,\n    walk_parent,\n    walk_abort,\n    walk_body,\n\n    _INLINE,\n    _NOINLINE,\n    _PURE\n} from \"../ast.js\";\nimport { HOP, make_node, noop } from \"../utils/index.js\";\n\nimport { lazy_op, is_modified, is_lhs } from \"./inference.js\";\nimport { INLINED, clear_flag } from \"./compressor-flags.js\";\nimport { read_property, has_break_or_continue, is_recursive_ref } from \"./common.js\";\n\n/**\n * Define the method AST_Node#reduce_vars, which goes through the AST in\n * execution order to perform basic flow analysis\n */\nfunction def_reduce_vars(node, func) {\n    node.DEFMETHOD(\"reduce_vars\", func);\n}\n\ndef_reduce_vars(AST_Node, noop);\n\n/** Clear definition properties */\nfunction reset_def(compressor, def) {\n    def.assignments = 0;\n    def.chained = false;\n    def.direct_access = false;\n    def.escaped = 0;\n    def.recursive_refs = 0;\n    def.references = [];\n    def.single_use = undefined;\n    if (\n        def.scope.pinned()\n        || (def.orig[0] instanceof AST_SymbolFunarg && def.scope.uses_arguments)\n    ) {\n        def.fixed = false;\n    } else if (def.orig[0] instanceof AST_SymbolConst || !compressor.exposed(def)) {\n        def.fixed = def.init;\n    } else {\n        def.fixed = false;\n    }\n}\n\nfunction reset_variables(tw, compressor, node) {\n    node.variables.forEach(function(def) {\n        reset_def(compressor, def);\n        if (def.fixed === null) {\n            tw.defs_to_safe_ids.set(def.id, tw.safe_ids);\n            mark(tw, def, true);\n        } else if (def.fixed) {\n            tw.loop_ids.set(def.id, tw.in_loop);\n            mark(tw, def, true);\n        }\n    });\n}\n\nfunction reset_block_variables(compressor, node) {\n    if (node.block_scope) node.block_scope.variables.forEach((def) => {\n        reset_def(compressor, def);\n    });\n}\n\nfunction push(tw) {\n    tw.safe_ids = Object.create(tw.safe_ids);\n}\n\nfunction pop(tw) {\n    tw.safe_ids = Object.getPrototypeOf(tw.safe_ids);\n}\n\nfunction mark(tw, def, safe) {\n    tw.safe_ids[def.id] = safe;\n}\n\nfunction safe_to_read(tw, def) {\n    if (def.single_use == \"m\") return false;\n    if (tw.safe_ids[def.id]) {\n        if (def.fixed == null) {\n            var orig = def.orig[0];\n            if (orig instanceof AST_SymbolFunarg || orig.name == \"arguments\") return false;\n            def.fixed = make_node(AST_Undefined, orig);\n        }\n        return true;\n    }\n    return def.fixed instanceof AST_Defun;\n}\n\nfunction safe_to_assign(tw, def, scope, value) {\n    if (def.fixed === undefined) return true;\n    let def_safe_ids;\n    if (def.fixed === null\n        && (def_safe_ids = tw.defs_to_safe_ids.get(def.id))\n    ) {\n        def_safe_ids[def.id] = false;\n        tw.defs_to_safe_ids.delete(def.id);\n        return true;\n    }\n    if (!HOP(tw.safe_ids, def.id)) return false;\n    if (!safe_to_read(tw, def)) return false;\n    if (def.fixed === false) return false;\n    if (def.fixed != null && (!value || def.references.length > def.assignments)) return false;\n    if (def.fixed instanceof AST_Defun) {\n        return value instanceof AST_Node && def.fixed.parent_scope === scope;\n    }\n    return def.orig.every((sym) => {\n        return !(sym instanceof AST_SymbolConst\n            || sym instanceof AST_SymbolDefun\n            || sym instanceof AST_SymbolLambda);\n    });\n}\n\nfunction ref_once(tw, compressor, def) {\n    return compressor.option(\"unused\")\n        && !def.scope.pinned()\n        && def.references.length - def.recursive_refs == 1\n        && tw.loop_ids.get(def.id) === tw.in_loop;\n}\n\nfunction is_immutable(value) {\n    if (!value) return false;\n    return value.is_constant()\n        || value instanceof AST_Lambda\n        || value instanceof AST_This;\n}\n\n// A definition \"escapes\" when its value can leave the point of use.\n// Example: `a = b || c`\n// In this example, \"b\" and \"c\" are escaping, because they're going into \"a\"\n//\n// def.escaped is != 0 when it escapes.\n//\n// When greater than 1, it means that N chained properties will be read off\n// of that def before an escape occurs. This is useful for evaluating\n// property accesses, where you need to know when to stop.\nfunction mark_escaped(tw, d, scope, node, value, level = 0, depth = 1) {\n    var parent = tw.parent(level);\n    if (value) {\n        if (value.is_constant()) return;\n        if (value instanceof AST_ClassExpression) return;\n    }\n\n    if (\n        parent instanceof AST_Assign && (parent.operator === \"=\" || parent.logical) && node === parent.right\n        || parent instanceof AST_Call && (node !== parent.expression || parent instanceof AST_New)\n        || parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope\n        || parent instanceof AST_VarDef && node === parent.value\n        || parent instanceof AST_Yield && node === parent.value && node.scope !== d.scope\n    ) {\n        if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;\n        if (!d.escaped || d.escaped > depth) d.escaped = depth;\n        return;\n    } else if (\n        parent instanceof AST_Array\n        || parent instanceof AST_Await\n        || parent instanceof AST_Binary && lazy_op.has(parent.operator)\n        || parent instanceof AST_Conditional && node !== parent.condition\n        || parent instanceof AST_Expansion\n        || parent instanceof AST_Sequence && node === parent.tail_node()\n    ) {\n        mark_escaped(tw, d, scope, parent, parent, level + 1, depth);\n    } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) {\n        var obj = tw.parent(level + 1);\n\n        mark_escaped(tw, d, scope, obj, obj, level + 2, depth);\n    } else if (parent instanceof AST_PropAccess && node === parent.expression) {\n        value = read_property(value, parent.property);\n\n        mark_escaped(tw, d, scope, parent, value, level + 1, depth + 1);\n        if (value) return;\n    }\n\n    if (level > 0) return;\n    if (parent instanceof AST_Sequence && node !== parent.tail_node()) return;\n    if (parent instanceof AST_SimpleStatement) return;\n\n    d.direct_access = true;\n}\n\nconst suppress = node => walk(node, node => {\n    if (!(node instanceof AST_Symbol)) return;\n    var d = node.definition();\n    if (!d) return;\n    if (node instanceof AST_SymbolRef) d.references.push(node);\n    d.fixed = false;\n});\n\ndef_reduce_vars(AST_Accessor, function(tw, descend, compressor) {\n    push(tw);\n    reset_variables(tw, compressor, this);\n    descend();\n    pop(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_Assign, function(tw, descend, compressor) {\n    var node = this;\n    if (node.left instanceof AST_Destructuring) {\n        suppress(node.left);\n        return;\n    }\n\n    const finish_walk = () => {\n        if (node.logical) {\n            node.left.walk(tw);\n\n            push(tw);\n            node.right.walk(tw);\n            pop(tw);\n\n            return true;\n        }\n    };\n\n    var sym = node.left;\n    if (!(sym instanceof AST_SymbolRef)) return finish_walk();\n\n    var def = sym.definition();\n    var safe = safe_to_assign(tw, def, sym.scope, node.right);\n    def.assignments++;\n    if (!safe) return finish_walk();\n\n    var fixed = def.fixed;\n    if (!fixed && node.operator != \"=\" && !node.logical) return finish_walk();\n\n    var eq = node.operator == \"=\";\n    var value = eq ? node.right : node;\n    if (is_modified(compressor, tw, node, value, 0)) return finish_walk();\n\n    def.references.push(sym);\n\n    if (!node.logical) {\n        if (!eq) def.chained = true;\n\n        def.fixed = eq ? function() {\n            return node.right;\n        } : function() {\n            return make_node(AST_Binary, node, {\n                operator: node.operator.slice(0, -1),\n                left: fixed instanceof AST_Node ? fixed : fixed(),\n                right: node.right\n            });\n        };\n    }\n\n    if (node.logical) {\n        mark(tw, def, false);\n        push(tw);\n        node.right.walk(tw);\n        pop(tw);\n        return true;\n    }\n\n    mark(tw, def, false);\n    node.right.walk(tw);\n    mark(tw, def, true);\n\n    mark_escaped(tw, def, sym.scope, node, value, 0, 1);\n\n    return true;\n});\n\ndef_reduce_vars(AST_Binary, function(tw) {\n    if (!lazy_op.has(this.operator)) return;\n    this.left.walk(tw);\n    push(tw);\n    this.right.walk(tw);\n    pop(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_Block, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n});\n\ndef_reduce_vars(AST_Case, function(tw) {\n    push(tw);\n    this.expression.walk(tw);\n    pop(tw);\n    push(tw);\n    walk_body(this, tw);\n    pop(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_Class, function(tw, descend) {\n    clear_flag(this, INLINED);\n    push(tw);\n    descend();\n    pop(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_ClassStaticBlock, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n});\n\ndef_reduce_vars(AST_Conditional, function(tw) {\n    this.condition.walk(tw);\n    push(tw);\n    this.consequent.walk(tw);\n    pop(tw);\n    push(tw);\n    this.alternative.walk(tw);\n    pop(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_Chain, function(tw, descend) {\n    // Chains' conditions apply left-to-right, cumulatively.\n    // If we walk normally we don't go in that order because we would pop before pushing again\n    // Solution: AST_PropAccess and AST_Call push when they are optional, and never pop.\n    // Then we pop everything when they are done being walked.\n    const safe_ids = tw.safe_ids;\n\n    descend();\n\n    // Unroll back to start\n    tw.safe_ids = safe_ids;\n    return true;\n});\n\ndef_reduce_vars(AST_Call, function (tw) {\n    this.expression.walk(tw);\n\n    if (this.optional) {\n        // Never pop -- it's popped at AST_Chain above\n        push(tw);\n    }\n\n    for (const arg of this.args) arg.walk(tw);\n\n    return true;\n});\n\ndef_reduce_vars(AST_PropAccess, function (tw) {\n    if (!this.optional) return;\n\n    this.expression.walk(tw);\n\n    // Never pop -- it's popped at AST_Chain above\n    push(tw);\n\n    if (this.property instanceof AST_Node) this.property.walk(tw);\n\n    return true;\n});\n\ndef_reduce_vars(AST_Default, function(tw, descend) {\n    push(tw);\n    descend();\n    pop(tw);\n    return true;\n});\n\nfunction mark_lambda(tw, descend, compressor) {\n    clear_flag(this, INLINED);\n    push(tw);\n    reset_variables(tw, compressor, this);\n\n    var iife;\n    if (!this.name\n        && !this.uses_arguments\n        && !this.pinned()\n        && (iife = tw.parent()) instanceof AST_Call\n        && iife.expression === this\n        && !iife.args.some(arg => arg instanceof AST_Expansion)\n        && this.argnames.every(arg_name => arg_name instanceof AST_Symbol)\n    ) {\n        // Virtually turn IIFE parameters into variable definitions:\n        //   (function(a,b) {...})(c,d) => (function() {var a=c,b=d; ...})()\n        // So existing transformation rules can work on them.\n        this.argnames.forEach((arg, i) => {\n            if (!arg.definition) return;\n            var d = arg.definition();\n            // Avoid setting fixed when there's more than one origin for a variable value\n            if (d.orig.length > 1) return;\n            if (d.fixed === undefined && (!this.uses_arguments || tw.has_directive(\"use strict\"))) {\n                d.fixed = function() {\n                    return iife.args[i] || make_node(AST_Undefined, iife);\n                };\n                tw.loop_ids.set(d.id, tw.in_loop);\n                mark(tw, d, true);\n            } else {\n                d.fixed = false;\n            }\n        });\n    }\n\n    descend();\n    pop(tw);\n\n    handle_defined_after_hoist(this);\n\n    return true;\n}\n\n/**\n * It's possible for a hoisted function to use something that's not defined yet. Example:\n *\n * hoisted();\n * var defined_after = true;\n * function hoisted() {\n *   // use defined_after\n * }\n *\n * This function is called on the parent to handle this issue.\n */\nfunction handle_defined_after_hoist(parent) {\n    const defuns = [];\n    walk(parent, node => {\n        if (node === parent) return;\n        if (node instanceof AST_Defun) defuns.push(node);\n        if (\n            node instanceof AST_Scope\n            || node instanceof AST_SimpleStatement\n        ) return true;\n    });\n\n    for (const defun of defuns) {\n        const fname_def = defun.name.definition();\n        const found_self_ref_in_other_defuns = defuns.some(\n            d => d !== defun && d.enclosed.indexOf(fname_def) !== -1\n        );\n\n        for (const def of defun.enclosed) {\n            if (\n                def.fixed === false\n                || def === fname_def\n                || def.scope.get_defun_scope() !== parent\n            ) {\n                continue;\n            }\n\n            // defun is hoisted, so always safe\n            if (\n                def.assignments === 0\n                && def.orig.length === 1\n                && def.orig[0] instanceof AST_SymbolDefun\n            ) {\n                continue;\n            }\n\n            if (found_self_ref_in_other_defuns) {\n                def.fixed = false;\n                continue;\n            }\n\n            // Detect `call_defun(); var used_in_defun = X`\n            // Because `used_in_defun` is not certainly X when it's defined after.\n            let found_defun_ref = false;\n            let found_def_after_defun = false;\n            walk_parent(parent, (node, info) => {\n                if (node === defun) return true;\n\n                // Step 1: find `call_defun()` or other refs to the defun\n                if (\n                    !found_defun_ref\n                    && node.thedef === fname_def\n                    && node instanceof AST_Symbol\n                ) {\n                    found_defun_ref = true;\n                }\n\n                // Step 2: if Step 1 occurred, find a var the defun uses\n                if (\n                    found_defun_ref\n                    && node.thedef === def\n                    && (node instanceof AST_SymbolDeclaration\n                        || is_lhs(node, info))\n                ) {\n                    found_def_after_defun = true;\n                    return walk_abort;\n                }\n            });\n\n            if (found_def_after_defun) {\n                def.fixed = false;\n            }\n        }\n    }\n}\n\ndef_reduce_vars(AST_Lambda, mark_lambda);\n\ndef_reduce_vars(AST_Do, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n    const saved_loop = tw.in_loop;\n    tw.in_loop = this;\n    push(tw);\n    this.body.walk(tw);\n    if (has_break_or_continue(this)) {\n        pop(tw);\n        push(tw);\n    }\n    this.condition.walk(tw);\n    pop(tw);\n    tw.in_loop = saved_loop;\n    return true;\n});\n\ndef_reduce_vars(AST_For, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n    if (this.init) this.init.walk(tw);\n    const saved_loop = tw.in_loop;\n    tw.in_loop = this;\n    push(tw);\n    if (this.condition) this.condition.walk(tw);\n    this.body.walk(tw);\n    if (this.step) {\n        if (has_break_or_continue(this)) {\n            pop(tw);\n            push(tw);\n        }\n        this.step.walk(tw);\n    }\n    pop(tw);\n    tw.in_loop = saved_loop;\n    return true;\n});\n\ndef_reduce_vars(AST_ForIn, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n    suppress(this.init);\n    this.object.walk(tw);\n    const saved_loop = tw.in_loop;\n    tw.in_loop = this;\n    push(tw);\n    this.body.walk(tw);\n    pop(tw);\n    tw.in_loop = saved_loop;\n    return true;\n});\n\ndef_reduce_vars(AST_If, function(tw) {\n    this.condition.walk(tw);\n    push(tw);\n    this.body.walk(tw);\n    pop(tw);\n    if (this.alternative) {\n        push(tw);\n        this.alternative.walk(tw);\n        pop(tw);\n    }\n    return true;\n});\n\ndef_reduce_vars(AST_LabeledStatement, function(tw) {\n    push(tw);\n    this.body.walk(tw);\n    pop(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_SymbolCatch, function() {\n    this.definition().fixed = false;\n});\n\ndef_reduce_vars(AST_SymbolRef, function(tw, descend, compressor) {\n    var d = this.definition();\n    d.references.push(this);\n    if (d.references.length == 1\n        && !d.fixed\n        && d.orig[0] instanceof AST_SymbolDefun) {\n        tw.loop_ids.set(d.id, tw.in_loop);\n    }\n    var fixed_value;\n    if (d.fixed === undefined || !safe_to_read(tw, d)) {\n        d.fixed = false;\n    } else if (d.fixed) {\n        fixed_value = this.fixed_value();\n        if (\n            fixed_value instanceof AST_Lambda\n            && is_recursive_ref(tw, d)\n        ) {\n            d.recursive_refs++;\n        } else if (fixed_value\n            && !compressor.exposed(d)\n            && ref_once(tw, compressor, d)\n        ) {\n            d.single_use =\n                fixed_value instanceof AST_Lambda && !fixed_value.pinned()\n                || fixed_value instanceof AST_Class\n                || d.scope === this.scope && fixed_value.is_constant_expression();\n        } else {\n            d.single_use = false;\n        }\n        if (is_modified(compressor, tw, this, fixed_value, 0, is_immutable(fixed_value))) {\n            if (d.single_use) {\n                d.single_use = \"m\";\n            } else {\n                d.fixed = false;\n            }\n        }\n    }\n    mark_escaped(tw, d, this.scope, this, fixed_value, 0, 1);\n});\n\ndef_reduce_vars(AST_Toplevel, function(tw, descend, compressor) {\n    this.globals.forEach(function(def) {\n        reset_def(compressor, def);\n    });\n    reset_variables(tw, compressor, this);\n    descend();\n    handle_defined_after_hoist(this);\n    return true;\n});\n\ndef_reduce_vars(AST_Try, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n    push(tw);\n    this.body.walk(tw);\n    pop(tw);\n    if (this.bcatch) {\n        push(tw);\n        this.bcatch.walk(tw);\n        pop(tw);\n    }\n    if (this.bfinally) this.bfinally.walk(tw);\n    return true;\n});\n\ndef_reduce_vars(AST_Unary, function(tw) {\n    var node = this;\n    if (node.operator !== \"++\" && node.operator !== \"--\") return;\n    var exp = node.expression;\n    if (!(exp instanceof AST_SymbolRef)) return;\n    var def = exp.definition();\n    var safe = safe_to_assign(tw, def, exp.scope, true);\n    def.assignments++;\n    if (!safe) return;\n    var fixed = def.fixed;\n    if (!fixed) return;\n    def.references.push(exp);\n    def.chained = true;\n    def.fixed = function() {\n        return make_node(AST_Binary, node, {\n            operator: node.operator.slice(0, -1),\n            left: make_node(AST_UnaryPrefix, node, {\n                operator: \"+\",\n                expression: fixed instanceof AST_Node ? fixed : fixed()\n            }),\n            right: make_node(AST_Number, node, {\n                value: 1\n            })\n        });\n    };\n    mark(tw, def, true);\n    return true;\n});\n\ndef_reduce_vars(AST_VarDef, function(tw, descend) {\n    var node = this;\n    if (node.name instanceof AST_Destructuring) {\n        suppress(node.name);\n        return;\n    }\n    var d = node.name.definition();\n    if (node.value) {\n        if (safe_to_assign(tw, d, node.name.scope, node.value)) {\n            d.fixed = function() {\n                return node.value;\n            };\n            tw.loop_ids.set(d.id, tw.in_loop);\n            mark(tw, d, false);\n            descend();\n            mark(tw, d, true);\n            return true;\n        } else {\n            d.fixed = false;\n        }\n    }\n});\n\ndef_reduce_vars(AST_While, function(tw, descend, compressor) {\n    reset_block_variables(compressor, this);\n    const saved_loop = tw.in_loop;\n    tw.in_loop = this;\n    push(tw);\n    descend();\n    pop(tw);\n    tw.in_loop = saved_loop;\n    return true;\n});\n"
  },
  {
    "path": "templates/bin/node/terser/lib/compress/tighten-body.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport {\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_Await,\n    AST_Binary,\n    AST_Block,\n    AST_BlockStatement,\n    AST_Break,\n    AST_Call,\n    AST_Case,\n    AST_Chain,\n    AST_Class,\n    AST_Conditional,\n    AST_Const,\n    AST_Constant,\n    AST_Continue,\n    AST_Debugger,\n    AST_Default,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Dot,\n    AST_DWLoop,\n    AST_EmptyStatement,\n    AST_Exit,\n    AST_Expansion,\n    AST_Export,\n    AST_For,\n    AST_ForIn,\n    AST_If,\n    AST_Import,\n    AST_IterationStatement,\n    AST_Lambda,\n    AST_Let,\n    AST_LoopControl,\n    AST_Node,\n    AST_Number,\n    AST_Object,\n    AST_ObjectKeyVal,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Return,\n    AST_Scope,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Sub,\n    AST_Switch,\n    AST_Symbol,\n    AST_SymbolConst,\n    AST_SymbolDeclaration,\n    AST_SymbolDefun,\n    AST_SymbolFunarg,\n    AST_SymbolLambda,\n    AST_SymbolLet,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_This,\n    AST_Try,\n    AST_TryBlock,\n    AST_Unary,\n    AST_UnaryPostfix,\n    AST_UnaryPrefix,\n    AST_Undefined,\n    AST_Var,\n    AST_VarDef,\n    AST_With,\n    AST_Yield,\n\n    TreeTransformer,\n    TreeWalker,\n    walk,\n    walk_abort,\n\n    _NOINLINE\n} from \"../ast.js\";\nimport {\n    make_node,\n    MAP,\n    member,\n    remove,\n    has_annotation\n} from \"../utils/index.js\";\n\nimport { pure_prop_access_globals } from \"./native-objects.js\";\nimport {\n    lazy_op,\n    unary_side_effects,\n    is_modified,\n    is_lhs,\n    aborts\n} from \"./inference.js\";\nimport { WRITE_ONLY, clear_flag } from \"./compressor-flags.js\";\nimport {\n    make_sequence,\n    merge_sequence,\n    maintain_this_binding,\n    is_func_expr,\n    is_identifier_atom,\n    is_ref_of,\n    can_be_evicted_from_block,\n    as_statement_array,\n} from \"./common.js\";\n\nfunction loop_body(x) {\n    if (x instanceof AST_IterationStatement) {\n        return x.body instanceof AST_BlockStatement ? x.body : x;\n    }\n    return x;\n}\n\nfunction is_lhs_read_only(lhs) {\n    if (lhs instanceof AST_This) return true;\n    if (lhs instanceof AST_SymbolRef) return lhs.definition().orig[0] instanceof AST_SymbolLambda;\n    if (lhs instanceof AST_PropAccess) {\n        lhs = lhs.expression;\n        if (lhs instanceof AST_SymbolRef) {\n            if (lhs.is_immutable()) return false;\n            lhs = lhs.fixed_value();\n        }\n        if (!lhs) return true;\n        if (lhs instanceof AST_RegExp) return false;\n        if (lhs instanceof AST_Constant) return true;\n        return is_lhs_read_only(lhs);\n    }\n    return false;\n}\n\n/** var a = 1 --> var a*/\nfunction remove_initializers(var_statement) {\n    var decls = [];\n    var_statement.definitions.forEach(function(def) {\n        if (def.name instanceof AST_SymbolDeclaration) {\n            def.value = null;\n            decls.push(def);\n        } else {\n            def.declarations_as_names().forEach(name => {\n                decls.push(make_node(AST_VarDef, def, {\n                    name,\n                    value: null\n                }));\n            });\n        }\n    });\n    return decls.length ? make_node(AST_Var, var_statement, { definitions: decls }) : null;\n}\n\n/** Called on code which we know is unreachable, to keep elements that affect outside of it. */\nexport function trim_unreachable_code(compressor, stat, target) {\n    walk(stat, node => {\n        if (node instanceof AST_Var) {\n            const no_initializers = remove_initializers(node);\n            if (no_initializers) target.push(no_initializers);\n            return true;\n        }\n        if (\n            node instanceof AST_Defun\n            && (node === stat || !compressor.has_directive(\"use strict\"))\n        ) {\n            target.push(node === stat ? node : make_node(AST_Var, node, {\n                definitions: [\n                    make_node(AST_VarDef, node, {\n                        name: make_node(AST_SymbolVar, node.name, node.name),\n                        value: null\n                    })\n                ]\n            }));\n            return true;\n        }\n        if (node instanceof AST_Export || node instanceof AST_Import) {\n            target.push(node);\n            return true;\n        }\n        if (node instanceof AST_Scope) {\n            return true;\n        }\n    });\n}\n\n/** Tighten a bunch of statements together, and perform statement-level optimization. */\nexport function tighten_body(statements, compressor) {\n    const nearest_scope = compressor.find_scope();\n    const defun_scope = nearest_scope.get_defun_scope();\n    const { in_loop, in_try } = find_loop_scope_try();\n\n    var CHANGED, max_iter = 10;\n    do {\n        CHANGED = false;\n        eliminate_spurious_blocks(statements);\n        if (compressor.option(\"dead_code\")) {\n            eliminate_dead_code(statements, compressor);\n        }\n        if (compressor.option(\"if_return\")) {\n            handle_if_return(statements, compressor);\n        }\n        if (compressor.sequences_limit > 0) {\n            sequencesize(statements, compressor);\n            sequencesize_2(statements, compressor);\n        }\n        if (compressor.option(\"join_vars\")) {\n            join_consecutive_vars(statements);\n        }\n        if (compressor.option(\"collapse_vars\")) {\n            collapse(statements, compressor);\n        }\n    } while (CHANGED && max_iter-- > 0);\n\n    function find_loop_scope_try() {\n        var node = compressor.self(), level = 0, in_loop = false, in_try = false;\n        do {\n            if (node instanceof AST_IterationStatement) {\n                in_loop = true;\n            } else if (node instanceof AST_Scope) {\n                break;\n            } else if (node instanceof AST_TryBlock) {\n                in_try = true;\n            }\n        } while (node = compressor.parent(level++));\n\n        return { in_loop, in_try };\n    }\n\n    // Search from right to left for assignment-like expressions:\n    // - `var a = x;`\n    // - `a = x;`\n    // - `++a`\n    // For each candidate, scan from left to right for first usage, then try\n    // to fold assignment into the site for compression.\n    // Will not attempt to collapse assignments into or past code blocks\n    // which are not sequentially executed, e.g. loops and conditionals.\n    function collapse(statements, compressor) {\n        if (nearest_scope.pinned() || defun_scope.pinned())\n            return statements;\n        var args;\n        var candidates = [];\n        var stat_index = statements.length;\n        var scanner = new TreeTransformer(function (node) {\n            if (abort)\n                return node;\n            // Skip nodes before `candidate` as quickly as possible\n            if (!hit) {\n                if (node !== hit_stack[hit_index])\n                    return node;\n                hit_index++;\n                if (hit_index < hit_stack.length)\n                    return handle_custom_scan_order(node);\n                hit = true;\n                stop_after = find_stop(node, 0);\n                if (stop_after === node)\n                    abort = true;\n                return node;\n            }\n            // Stop immediately if these node types are encountered\n            var parent = scanner.parent();\n            if (node instanceof AST_Assign\n                    && (node.logical || node.operator != \"=\" && lhs.equivalent_to(node.left))\n                || node instanceof AST_Await\n                || node instanceof AST_Call && lhs instanceof AST_PropAccess && lhs.equivalent_to(node.expression)\n                ||\n                    (node instanceof AST_Call || node instanceof AST_PropAccess)\n                    && node.optional\n                || node instanceof AST_Debugger\n                || node instanceof AST_Destructuring\n                || node instanceof AST_Expansion\n                    && node.expression instanceof AST_Symbol\n                    && (\n                        node.expression instanceof AST_This\n                        || node.expression.definition().references.length > 1\n                    )\n                || node instanceof AST_IterationStatement && !(node instanceof AST_For)\n                || node instanceof AST_LoopControl\n                || node instanceof AST_Try\n                || node instanceof AST_With\n                || node instanceof AST_Yield\n                || node instanceof AST_Export\n                || node instanceof AST_Class\n                || parent instanceof AST_For && node !== parent.init\n                || !replace_all\n                    && (\n                        node instanceof AST_SymbolRef\n                        && !node.is_declared(compressor)\n                        && !pure_prop_access_globals.has(node)\n                    )\n                || node instanceof AST_SymbolRef\n                    && parent instanceof AST_Call\n                    && has_annotation(parent, _NOINLINE)\n            ) {\n                abort = true;\n                return node;\n            }\n            // Stop only if candidate is found within conditional branches\n            if (!stop_if_hit && (!lhs_local || !replace_all)\n                && (parent instanceof AST_Binary && lazy_op.has(parent.operator) && parent.left !== node\n                    || parent instanceof AST_Conditional && parent.condition !== node\n                    || parent instanceof AST_If && parent.condition !== node)) {\n                stop_if_hit = parent;\n            }\n            // Replace variable with assignment when found\n            if (\n                can_replace\n                && !(node instanceof AST_SymbolDeclaration)\n                && lhs.equivalent_to(node)\n                && !shadows(scanner.find_scope() || nearest_scope, lvalues)\n            ) {\n                if (stop_if_hit) {\n                    abort = true;\n                    return node;\n                }\n                if (is_lhs(node, parent)) {\n                    if (value_def)\n                        replaced++;\n                    return node;\n                } else {\n                    replaced++;\n                    if (value_def && candidate instanceof AST_VarDef)\n                        return node;\n                }\n                CHANGED = abort = true;\n                if (candidate instanceof AST_UnaryPostfix) {\n                    return make_node(AST_UnaryPrefix, candidate, candidate);\n                }\n                if (candidate instanceof AST_VarDef) {\n                    var def = candidate.name.definition();\n                    var value = candidate.value;\n                    if (def.references.length - def.replaced == 1 && !compressor.exposed(def)) {\n                        def.replaced++;\n                        if (funarg && is_identifier_atom(value)) {\n                            return value.transform(compressor);\n                        } else {\n                            return maintain_this_binding(parent, node, value);\n                        }\n                    }\n                    return make_node(AST_Assign, candidate, {\n                        operator: \"=\",\n                        logical: false,\n                        left: make_node(AST_SymbolRef, candidate.name, candidate.name),\n                        right: value\n                    });\n                }\n                clear_flag(candidate, WRITE_ONLY);\n                return candidate;\n            }\n            // These node types have child nodes that execute sequentially,\n            // but are otherwise not safe to scan into or beyond them.\n            var sym;\n            if (node instanceof AST_Call\n                || node instanceof AST_Exit\n                && (side_effects || lhs instanceof AST_PropAccess || may_modify(lhs))\n                || node instanceof AST_PropAccess\n                && (side_effects || node.expression.may_throw_on_access(compressor))\n                || node instanceof AST_SymbolRef\n                && ((lvalues.has(node.name) && lvalues.get(node.name).modified) || side_effects && may_modify(node))\n                || node instanceof AST_VarDef && node.value\n                && (lvalues.has(node.name.name) || side_effects && may_modify(node.name))\n                || (sym = is_lhs(node.left, node))\n                && (sym instanceof AST_PropAccess || lvalues.has(sym.name))\n                || may_throw\n                && (in_try ? node.has_side_effects(compressor) : side_effects_external(node))) {\n                stop_after = node;\n                if (node instanceof AST_Scope)\n                    abort = true;\n            }\n            return handle_custom_scan_order(node);\n        }, function (node) {\n            if (abort)\n                return;\n            if (stop_after === node)\n                abort = true;\n            if (stop_if_hit === node)\n                stop_if_hit = null;\n        });\n\n        var multi_replacer = new TreeTransformer(function (node) {\n            if (abort)\n                return node;\n            // Skip nodes before `candidate` as quickly as possible\n            if (!hit) {\n                if (node !== hit_stack[hit_index])\n                    return node;\n                hit_index++;\n                if (hit_index < hit_stack.length)\n                    return;\n                hit = true;\n                return node;\n            }\n            // Replace variable when found\n            if (node instanceof AST_SymbolRef\n                && node.name == def.name) {\n                if (!--replaced)\n                    abort = true;\n                if (is_lhs(node, multi_replacer.parent()))\n                    return node;\n                def.replaced++;\n                value_def.replaced--;\n                return candidate.value;\n            }\n            // Skip (non-executed) functions and (leading) default case in switch statements\n            if (node instanceof AST_Default || node instanceof AST_Scope)\n                return node;\n        });\n\n        while (--stat_index >= 0) {\n            // Treat parameters as collapsible in IIFE, i.e.\n            //   function(a, b){ ... }(x());\n            // would be translated into equivalent assignments:\n            //   var a = x(), b = undefined;\n            if (stat_index == 0 && compressor.option(\"unused\"))\n                extract_args();\n            // Find collapsible assignments\n            var hit_stack = [];\n            extract_candidates(statements[stat_index]);\n            while (candidates.length > 0) {\n                hit_stack = candidates.pop();\n                var hit_index = 0;\n                var candidate = hit_stack[hit_stack.length - 1];\n                var value_def = null;\n                var stop_after = null;\n                var stop_if_hit = null;\n                var lhs = get_lhs(candidate);\n                if (!lhs || is_lhs_read_only(lhs) || lhs.has_side_effects(compressor))\n                    continue;\n                // Locate symbols which may execute code outside of scanning range\n                var lvalues = get_lvalues(candidate);\n                var lhs_local = is_lhs_local(lhs);\n                if (lhs instanceof AST_SymbolRef) {\n                    lvalues.set(lhs.name, { def: lhs.definition(), modified: false });\n                }\n                var side_effects = value_has_side_effects(candidate);\n                var replace_all = replace_all_symbols();\n                var may_throw = candidate.may_throw(compressor);\n                var funarg = candidate.name instanceof AST_SymbolFunarg;\n                var hit = funarg;\n                var abort = false, replaced = 0, can_replace = !args || !hit;\n                if (!can_replace) {\n                    for (\n                        let j = compressor.self().argnames.lastIndexOf(candidate.name) + 1;\n                        !abort && j < args.length;\n                        j++\n                    ) {\n                        args[j].transform(scanner);\n                    }\n                    can_replace = true;\n                }\n                for (var i = stat_index; !abort && i < statements.length; i++) {\n                    statements[i].transform(scanner);\n                }\n                if (value_def) {\n                    var def = candidate.name.definition();\n                    if (abort && def.references.length - def.replaced > replaced)\n                        replaced = false;\n                    else {\n                        abort = false;\n                        hit_index = 0;\n                        hit = funarg;\n                        for (var i = stat_index; !abort && i < statements.length; i++) {\n                            statements[i].transform(multi_replacer);\n                        }\n                        value_def.single_use = false;\n                    }\n                }\n                if (replaced && !remove_candidate(candidate))\n                    statements.splice(stat_index, 1);\n            }\n        }\n\n        function handle_custom_scan_order(node) {\n            // Skip (non-executed) functions\n            if (node instanceof AST_Scope)\n                return node;\n\n            // Scan case expressions first in a switch statement\n            if (node instanceof AST_Switch) {\n                node.expression = node.expression.transform(scanner);\n                for (var i = 0, len = node.body.length; !abort && i < len; i++) {\n                    var branch = node.body[i];\n                    if (branch instanceof AST_Case) {\n                        if (!hit) {\n                            if (branch !== hit_stack[hit_index])\n                                continue;\n                            hit_index++;\n                        }\n                        branch.expression = branch.expression.transform(scanner);\n                        if (!replace_all)\n                            break;\n                    }\n                }\n                abort = true;\n                return node;\n            }\n        }\n\n        function redefined_within_scope(def, scope) {\n            if (def.global)\n                return false;\n            let cur_scope = def.scope;\n            while (cur_scope && cur_scope !== scope) {\n                if (cur_scope.variables.has(def.name)) {\n                    return true;\n                }\n                cur_scope = cur_scope.parent_scope;\n            }\n            return false;\n        }\n\n        function has_overlapping_symbol(fn, arg, fn_strict) {\n            var found = false, scan_this = !(fn instanceof AST_Arrow);\n            arg.walk(new TreeWalker(function (node, descend) {\n                if (found)\n                    return true;\n                if (node instanceof AST_SymbolRef && (fn.variables.has(node.name) || redefined_within_scope(node.definition(), fn))) {\n                    var s = node.definition().scope;\n                    if (s !== defun_scope)\n                        while (s = s.parent_scope) {\n                            if (s === defun_scope)\n                                return true;\n                        }\n                    return found = true;\n                }\n                if ((fn_strict || scan_this) && node instanceof AST_This) {\n                    return found = true;\n                }\n                if (node instanceof AST_Scope && !(node instanceof AST_Arrow)) {\n                    var prev = scan_this;\n                    scan_this = false;\n                    descend();\n                    scan_this = prev;\n                    return true;\n                }\n            }));\n            return found;\n        }\n\n        function extract_args() {\n            var iife, fn = compressor.self();\n            if (is_func_expr(fn)\n                && !fn.name\n                && !fn.uses_arguments\n                && !fn.pinned()\n                && (iife = compressor.parent()) instanceof AST_Call\n                && iife.expression === fn\n                && iife.args.every((arg) => !(arg instanceof AST_Expansion))) {\n                var fn_strict = compressor.has_directive(\"use strict\");\n                if (fn_strict && !member(fn_strict, fn.body))\n                    fn_strict = false;\n                var len = fn.argnames.length;\n                args = iife.args.slice(len);\n                var names = new Set();\n                for (var i = len; --i >= 0;) {\n                    var sym = fn.argnames[i];\n                    var arg = iife.args[i];\n                    // The following two line fix is a duplicate of the fix at\n                    // https://github.com/terser/terser/commit/011d3eb08cefe6922c7d1bdfa113fc4aeaca1b75\n                    // This might mean that these two pieces of code (one here in collapse_vars and another in reduce_vars\n                    // Might be doing the exact same thing.\n                    const def = sym.definition && sym.definition();\n                    const is_reassigned = def && def.orig.length > 1;\n                    if (is_reassigned)\n                        continue;\n                    args.unshift(make_node(AST_VarDef, sym, {\n                        name: sym,\n                        value: arg\n                    }));\n                    if (names.has(sym.name))\n                        continue;\n                    names.add(sym.name);\n                    if (sym instanceof AST_Expansion) {\n                        var elements = iife.args.slice(i);\n                        if (elements.every((arg) => !has_overlapping_symbol(fn, arg, fn_strict)\n                        )) {\n                            candidates.unshift([make_node(AST_VarDef, sym, {\n                                name: sym.expression,\n                                value: make_node(AST_Array, iife, {\n                                    elements: elements\n                                })\n                            })]);\n                        }\n                    } else {\n                        if (!arg) {\n                            arg = make_node(AST_Undefined, sym).transform(compressor);\n                        } else if (arg instanceof AST_Lambda && arg.pinned()\n                            || has_overlapping_symbol(fn, arg, fn_strict)) {\n                            arg = null;\n                        }\n                        if (arg)\n                            candidates.unshift([make_node(AST_VarDef, sym, {\n                                name: sym,\n                                value: arg\n                            })]);\n                    }\n                }\n            }\n        }\n\n        function extract_candidates(expr) {\n            hit_stack.push(expr);\n            if (expr instanceof AST_Assign) {\n                if (!expr.left.has_side_effects(compressor)\n                    && !(expr.right instanceof AST_Chain)) {\n                    candidates.push(hit_stack.slice());\n                }\n                extract_candidates(expr.right);\n            } else if (expr instanceof AST_Binary) {\n                extract_candidates(expr.left);\n                extract_candidates(expr.right);\n            } else if (expr instanceof AST_Call && !has_annotation(expr, _NOINLINE)) {\n                extract_candidates(expr.expression);\n                expr.args.forEach(extract_candidates);\n            } else if (expr instanceof AST_Case) {\n                extract_candidates(expr.expression);\n            } else if (expr instanceof AST_Conditional) {\n                extract_candidates(expr.condition);\n                extract_candidates(expr.consequent);\n                extract_candidates(expr.alternative);\n            } else if (expr instanceof AST_Definitions) {\n                var len = expr.definitions.length;\n                // limit number of trailing variable definitions for consideration\n                var i = len - 200;\n                if (i < 0)\n                    i = 0;\n                for (; i < len; i++) {\n                    extract_candidates(expr.definitions[i]);\n                }\n            } else if (expr instanceof AST_DWLoop) {\n                extract_candidates(expr.condition);\n                if (!(expr.body instanceof AST_Block)) {\n                    extract_candidates(expr.body);\n                }\n            } else if (expr instanceof AST_Exit) {\n                if (expr.value)\n                    extract_candidates(expr.value);\n            } else if (expr instanceof AST_For) {\n                if (expr.init)\n                    extract_candidates(expr.init);\n                if (expr.condition)\n                    extract_candidates(expr.condition);\n                if (expr.step)\n                    extract_candidates(expr.step);\n                if (!(expr.body instanceof AST_Block)) {\n                    extract_candidates(expr.body);\n                }\n            } else if (expr instanceof AST_ForIn) {\n                extract_candidates(expr.object);\n                if (!(expr.body instanceof AST_Block)) {\n                    extract_candidates(expr.body);\n                }\n            } else if (expr instanceof AST_If) {\n                extract_candidates(expr.condition);\n                if (!(expr.body instanceof AST_Block)) {\n                    extract_candidates(expr.body);\n                }\n                if (expr.alternative && !(expr.alternative instanceof AST_Block)) {\n                    extract_candidates(expr.alternative);\n                }\n            } else if (expr instanceof AST_Sequence) {\n                expr.expressions.forEach(extract_candidates);\n            } else if (expr instanceof AST_SimpleStatement) {\n                extract_candidates(expr.body);\n            } else if (expr instanceof AST_Switch) {\n                extract_candidates(expr.expression);\n                expr.body.forEach(extract_candidates);\n            } else if (expr instanceof AST_Unary) {\n                if (expr.operator == \"++\" || expr.operator == \"--\") {\n                    candidates.push(hit_stack.slice());\n                }\n            } else if (expr instanceof AST_VarDef) {\n                if (expr.value && !(expr.value instanceof AST_Chain)) {\n                    candidates.push(hit_stack.slice());\n                    extract_candidates(expr.value);\n                }\n            }\n            hit_stack.pop();\n        }\n\n        function find_stop(node, level, write_only) {\n            var parent = scanner.parent(level);\n            if (parent instanceof AST_Assign) {\n                if (write_only\n                    && !parent.logical\n                    && !(parent.left instanceof AST_PropAccess\n                        || lvalues.has(parent.left.name))) {\n                    return find_stop(parent, level + 1, write_only);\n                }\n                return node;\n            }\n            if (parent instanceof AST_Binary) {\n                if (write_only && (!lazy_op.has(parent.operator) || parent.left === node)) {\n                    return find_stop(parent, level + 1, write_only);\n                }\n                return node;\n            }\n            if (parent instanceof AST_Call)\n                return node;\n            if (parent instanceof AST_Case)\n                return node;\n            if (parent instanceof AST_Conditional) {\n                if (write_only && parent.condition === node) {\n                    return find_stop(parent, level + 1, write_only);\n                }\n                return node;\n            }\n            if (parent instanceof AST_Definitions) {\n                return find_stop(parent, level + 1, true);\n            }\n            if (parent instanceof AST_Exit) {\n                return write_only ? find_stop(parent, level + 1, write_only) : node;\n            }\n            if (parent instanceof AST_If) {\n                if (write_only && parent.condition === node) {\n                    return find_stop(parent, level + 1, write_only);\n                }\n                return node;\n            }\n            if (parent instanceof AST_IterationStatement)\n                return node;\n            if (parent instanceof AST_Sequence) {\n                return find_stop(parent, level + 1, parent.tail_node() !== node);\n            }\n            if (parent instanceof AST_SimpleStatement) {\n                return find_stop(parent, level + 1, true);\n            }\n            if (parent instanceof AST_Switch)\n                return node;\n            if (parent instanceof AST_VarDef)\n                return node;\n            return null;\n        }\n\n        function mangleable_var(var_def) {\n            var value = var_def.value;\n            if (!(value instanceof AST_SymbolRef))\n                return;\n            if (value.name == \"arguments\")\n                return;\n            var def = value.definition();\n            if (def.undeclared)\n                return;\n            return value_def = def;\n        }\n\n        function get_lhs(expr) {\n            if (expr instanceof AST_Assign && expr.logical) {\n                return false;\n            } else if (expr instanceof AST_VarDef && expr.name instanceof AST_SymbolDeclaration) {\n                var def = expr.name.definition();\n                if (!member(expr.name, def.orig))\n                    return;\n                var referenced = def.references.length - def.replaced;\n                if (!referenced)\n                    return;\n                var declared = def.orig.length - def.eliminated;\n                if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg)\n                    || (referenced > 1 ? mangleable_var(expr) : !compressor.exposed(def))) {\n                    return make_node(AST_SymbolRef, expr.name, expr.name);\n                }\n            } else {\n                const lhs = expr instanceof AST_Assign\n                    ? expr.left\n                    : expr.expression;\n                return !is_ref_of(lhs, AST_SymbolConst)\n                    && !is_ref_of(lhs, AST_SymbolLet) && lhs;\n            }\n        }\n\n        function get_rvalue(expr) {\n            if (expr instanceof AST_Assign) {\n                return expr.right;\n            } else {\n                return expr.value;\n            }\n        }\n\n        function get_lvalues(expr) {\n            var lvalues = new Map();\n            if (expr instanceof AST_Unary)\n                return lvalues;\n            var tw = new TreeWalker(function (node) {\n                var sym = node;\n                while (sym instanceof AST_PropAccess)\n                    sym = sym.expression;\n                if (sym instanceof AST_SymbolRef) {\n                    const prev = lvalues.get(sym.name);\n                    if (!prev || !prev.modified) {\n                        lvalues.set(sym.name, {\n                            def: sym.definition(),\n                            modified: is_modified(compressor, tw, node, node, 0)\n                        });\n                    }\n                }\n            });\n            get_rvalue(expr).walk(tw);\n            return lvalues;\n        }\n\n        function remove_candidate(expr) {\n            if (expr.name instanceof AST_SymbolFunarg) {\n                var iife = compressor.parent(), argnames = compressor.self().argnames;\n                var index = argnames.indexOf(expr.name);\n                if (index < 0) {\n                    iife.args.length = Math.min(iife.args.length, argnames.length - 1);\n                } else {\n                    var args = iife.args;\n                    if (args[index])\n                        args[index] = make_node(AST_Number, args[index], {\n                            value: 0\n                        });\n                }\n                return true;\n            }\n            var found = false;\n            return statements[stat_index].transform(new TreeTransformer(function (node, descend, in_list) {\n                if (found)\n                    return node;\n                if (node === expr || node.body === expr) {\n                    found = true;\n                    if (node instanceof AST_VarDef) {\n                        node.value = node.name instanceof AST_SymbolConst\n                            ? make_node(AST_Undefined, node.value) // `const` always needs value.\n                            : null;\n                        return node;\n                    }\n                    return in_list ? MAP.skip : null;\n                }\n            }, function (node) {\n                if (node instanceof AST_Sequence)\n                    switch (node.expressions.length) {\n                        case 0: return null;\n                        case 1: return node.expressions[0];\n                    }\n            }));\n        }\n\n        function is_lhs_local(lhs) {\n            while (lhs instanceof AST_PropAccess)\n                lhs = lhs.expression;\n            return lhs instanceof AST_SymbolRef\n                && lhs.definition().scope.get_defun_scope() === defun_scope\n                && !(in_loop\n                    && (lvalues.has(lhs.name)\n                        || candidate instanceof AST_Unary\n                        || (candidate instanceof AST_Assign\n                            && !candidate.logical\n                            && candidate.operator != \"=\")));\n        }\n\n        function value_has_side_effects(expr) {\n            if (expr instanceof AST_Unary)\n                return unary_side_effects.has(expr.operator);\n            return get_rvalue(expr).has_side_effects(compressor);\n        }\n\n        function replace_all_symbols() {\n            if (side_effects)\n                return false;\n            if (value_def)\n                return true;\n            if (lhs instanceof AST_SymbolRef) {\n                var def = lhs.definition();\n                if (def.references.length - def.replaced == (candidate instanceof AST_VarDef ? 1 : 2)) {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        function may_modify(sym) {\n            if (!sym.definition)\n                return true; // AST_Destructuring\n            var def = sym.definition();\n            if (def.orig.length == 1 && def.orig[0] instanceof AST_SymbolDefun)\n                return false;\n            if (def.scope.get_defun_scope() !== defun_scope)\n                return true;\n            return def.references.some((ref) =>\n                ref.scope.get_defun_scope() !== defun_scope\n            );\n        }\n\n        function side_effects_external(node, lhs) {\n            if (node instanceof AST_Assign)\n                return side_effects_external(node.left, true);\n            if (node instanceof AST_Unary)\n                return side_effects_external(node.expression, true);\n            if (node instanceof AST_VarDef)\n                return node.value && side_effects_external(node.value);\n            if (lhs) {\n                if (node instanceof AST_Dot)\n                    return side_effects_external(node.expression, true);\n                if (node instanceof AST_Sub)\n                    return side_effects_external(node.expression, true);\n                if (node instanceof AST_SymbolRef)\n                    return node.definition().scope.get_defun_scope() !== defun_scope;\n            }\n            return false;\n        }\n\n        /**\n         * Will any of the pulled-in lvalues shadow a variable in newScope or parents?\n         * similar to scope_encloses_variables_in_this_scope */\n        function shadows(my_scope, lvalues) {\n            for (const { def } of lvalues.values()) {\n                const looked_up = my_scope.find_variable(def.name);\n                if (looked_up) {\n                    if (looked_up === def) continue;\n                    return true;\n                }\n            }\n            return false;\n        }\n    }\n\n    function eliminate_spurious_blocks(statements) {\n        var seen_dirs = [];\n        for (var i = 0; i < statements.length;) {\n            var stat = statements[i];\n            if (stat instanceof AST_BlockStatement && stat.body.every(can_be_evicted_from_block)) {\n                CHANGED = true;\n                eliminate_spurious_blocks(stat.body);\n                statements.splice(i, 1, ...stat.body);\n                i += stat.body.length;\n            } else if (stat instanceof AST_EmptyStatement) {\n                CHANGED = true;\n                statements.splice(i, 1);\n            } else if (stat instanceof AST_Directive) {\n                if (seen_dirs.indexOf(stat.value) < 0) {\n                    i++;\n                    seen_dirs.push(stat.value);\n                } else {\n                    CHANGED = true;\n                    statements.splice(i, 1);\n                }\n            } else\n                i++;\n        }\n    }\n\n    function handle_if_return(statements, compressor) {\n        var self = compressor.self();\n        var multiple_if_returns = has_multiple_if_returns(statements);\n        var in_lambda = self instanceof AST_Lambda;\n        for (var i = statements.length; --i >= 0;) {\n            var stat = statements[i];\n            var j = next_index(i);\n            var next = statements[j];\n\n            if (in_lambda && !next && stat instanceof AST_Return) {\n                if (!stat.value) {\n                    CHANGED = true;\n                    statements.splice(i, 1);\n                    continue;\n                }\n                if (stat.value instanceof AST_UnaryPrefix && stat.value.operator == \"void\") {\n                    CHANGED = true;\n                    statements[i] = make_node(AST_SimpleStatement, stat, {\n                        body: stat.value.expression\n                    });\n                    continue;\n                }\n            }\n\n            if (stat instanceof AST_If) {\n                let ab, new_else;\n\n                ab = aborts(stat.body);\n                if (\n                    can_merge_flow(ab)\n                    && (new_else = as_statement_array_with_return(stat.body, ab))\n                ) {\n                    if (ab.label) {\n                        remove(ab.label.thedef.references, ab);\n                    }\n                    CHANGED = true;\n                    stat = stat.clone();\n                    stat.condition = stat.condition.negate(compressor);\n                    stat.body = make_node(AST_BlockStatement, stat, {\n                        body: as_statement_array(stat.alternative).concat(extract_functions())\n                    });\n                    stat.alternative = make_node(AST_BlockStatement, stat, {\n                        body: new_else\n                    });\n                    statements[i] = stat.transform(compressor);\n                    continue;\n                }\n\n                ab = aborts(stat.alternative);\n                if (\n                    can_merge_flow(ab)\n                    && (new_else = as_statement_array_with_return(stat.alternative, ab))\n                ) {\n                    if (ab.label) {\n                        remove(ab.label.thedef.references, ab);\n                    }\n                    CHANGED = true;\n                    stat = stat.clone();\n                    stat.body = make_node(AST_BlockStatement, stat.body, {\n                        body: as_statement_array(stat.body).concat(extract_functions())\n                    });\n                    stat.alternative = make_node(AST_BlockStatement, stat.alternative, {\n                        body: new_else\n                    });\n                    statements[i] = stat.transform(compressor);\n                    continue;\n                }\n            }\n\n            if (stat instanceof AST_If && stat.body instanceof AST_Return) {\n                var value = stat.body.value;\n                //---\n                // pretty silly case, but:\n                // if (foo()) return; return; ==> foo(); return;\n                if (!value && !stat.alternative\n                    && (in_lambda && !next || next instanceof AST_Return && !next.value)) {\n                    CHANGED = true;\n                    statements[i] = make_node(AST_SimpleStatement, stat.condition, {\n                        body: stat.condition\n                    });\n                    continue;\n                }\n                //---\n                // if (foo()) return x; return y; ==> return foo() ? x : y;\n                if (value && !stat.alternative && next instanceof AST_Return && next.value) {\n                    CHANGED = true;\n                    stat = stat.clone();\n                    stat.alternative = next;\n                    statements[i] = stat.transform(compressor);\n                    statements.splice(j, 1);\n                    continue;\n                }\n                //---\n                // if (foo()) return x; [ return ; ] ==> return foo() ? x : undefined;\n                if (value && !stat.alternative\n                    && (!next && in_lambda && multiple_if_returns\n                        || next instanceof AST_Return)) {\n                    CHANGED = true;\n                    stat = stat.clone();\n                    stat.alternative = next || make_node(AST_Return, stat, {\n                        value: null\n                    });\n                    statements[i] = stat.transform(compressor);\n                    if (next)\n                        statements.splice(j, 1);\n                    continue;\n                }\n                //---\n                // if (a) return b; if (c) return d; e; ==> return a ? b : c ? d : void e;\n                //\n                // if sequences is not enabled, this can lead to an endless loop (issue #866).\n                // however, with sequences on this helps producing slightly better output for\n                // the example code.\n                var prev = statements[prev_index(i)];\n                if (compressor.option(\"sequences\") && in_lambda && !stat.alternative\n                    && prev instanceof AST_If && prev.body instanceof AST_Return\n                    && next_index(j) == statements.length && next instanceof AST_SimpleStatement) {\n                    CHANGED = true;\n                    stat = stat.clone();\n                    stat.alternative = make_node(AST_BlockStatement, next, {\n                        body: [\n                            next,\n                            make_node(AST_Return, next, {\n                                value: null\n                            })\n                        ]\n                    });\n                    statements[i] = stat.transform(compressor);\n                    statements.splice(j, 1);\n                    continue;\n                }\n            }\n        }\n\n        function has_multiple_if_returns(statements) {\n            var n = 0;\n            for (var i = statements.length; --i >= 0;) {\n                var stat = statements[i];\n                if (stat instanceof AST_If && stat.body instanceof AST_Return) {\n                    if (++n > 1)\n                        return true;\n                }\n            }\n            return false;\n        }\n\n        function is_return_void(value) {\n            return !value || value instanceof AST_UnaryPrefix && value.operator == \"void\";\n        }\n\n        function can_merge_flow(ab) {\n            if (!ab)\n                return false;\n            for (var j = i + 1, len = statements.length; j < len; j++) {\n                var stat = statements[j];\n                if (stat instanceof AST_Const || stat instanceof AST_Let)\n                    return false;\n            }\n            var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab) : null;\n            return ab instanceof AST_Return && in_lambda && is_return_void(ab.value)\n                || ab instanceof AST_Continue && self === loop_body(lct)\n                || ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct;\n        }\n\n        function extract_functions() {\n            var tail = statements.slice(i + 1);\n            statements.length = i + 1;\n            return tail.filter(function (stat) {\n                if (stat instanceof AST_Defun) {\n                    statements.push(stat);\n                    return false;\n                }\n                return true;\n            });\n        }\n\n        function as_statement_array_with_return(node, ab) {\n            var body = as_statement_array(node);\n            if (ab !== body[body.length - 1]) {\n                return undefined;\n            }\n            body = body.slice(0, -1);\n            if (ab.value) {\n                body.push(make_node(AST_SimpleStatement, ab.value, {\n                    body: ab.value.expression\n                }));\n            }\n            return body;\n        }\n\n        function next_index(i) {\n            for (var j = i + 1, len = statements.length; j < len; j++) {\n                var stat = statements[j];\n                if (!(stat instanceof AST_Var && declarations_only(stat))) {\n                    break;\n                }\n            }\n            return j;\n        }\n\n        function prev_index(i) {\n            for (var j = i; --j >= 0;) {\n                var stat = statements[j];\n                if (!(stat instanceof AST_Var && declarations_only(stat))) {\n                    break;\n                }\n            }\n            return j;\n        }\n    }\n\n    function eliminate_dead_code(statements, compressor) {\n        var has_quit;\n        var self = compressor.self();\n        for (var i = 0, n = 0, len = statements.length; i < len; i++) {\n            var stat = statements[i];\n            if (stat instanceof AST_LoopControl) {\n                var lct = compressor.loopcontrol_target(stat);\n                if (stat instanceof AST_Break\n                    && !(lct instanceof AST_IterationStatement)\n                    && loop_body(lct) === self\n                    || stat instanceof AST_Continue\n                    && loop_body(lct) === self) {\n                    if (stat.label) {\n                        remove(stat.label.thedef.references, stat);\n                    }\n                } else {\n                    statements[n++] = stat;\n                }\n            } else {\n                statements[n++] = stat;\n            }\n            if (aborts(stat)) {\n                has_quit = statements.slice(i + 1);\n                break;\n            }\n        }\n        statements.length = n;\n        CHANGED = n != len;\n        if (has_quit)\n            has_quit.forEach(function (stat) {\n                trim_unreachable_code(compressor, stat, statements);\n            });\n    }\n\n    function declarations_only(node) {\n        return node.definitions.every((var_def) => !var_def.value);\n    }\n\n    function sequencesize(statements, compressor) {\n        if (statements.length < 2)\n            return;\n        var seq = [], n = 0;\n        function push_seq() {\n            if (!seq.length)\n                return;\n            var body = make_sequence(seq[0], seq);\n            statements[n++] = make_node(AST_SimpleStatement, body, { body: body });\n            seq = [];\n        }\n        for (var i = 0, len = statements.length; i < len; i++) {\n            var stat = statements[i];\n            if (stat instanceof AST_SimpleStatement) {\n                if (seq.length >= compressor.sequences_limit)\n                    push_seq();\n                var body = stat.body;\n                if (seq.length > 0)\n                    body = body.drop_side_effect_free(compressor);\n                if (body)\n                    merge_sequence(seq, body);\n            } else if (stat instanceof AST_Definitions && declarations_only(stat)\n                || stat instanceof AST_Defun) {\n                statements[n++] = stat;\n            } else {\n                push_seq();\n                statements[n++] = stat;\n            }\n        }\n        push_seq();\n        statements.length = n;\n        if (n != len)\n            CHANGED = true;\n    }\n\n    function to_simple_statement(block, decls) {\n        if (!(block instanceof AST_BlockStatement))\n            return block;\n        var stat = null;\n        for (var i = 0, len = block.body.length; i < len; i++) {\n            var line = block.body[i];\n            if (line instanceof AST_Var && declarations_only(line)) {\n                decls.push(line);\n            } else if (stat || line instanceof AST_Const || line instanceof AST_Let) {\n                return false;\n            } else {\n                stat = line;\n            }\n        }\n        return stat;\n    }\n\n    function sequencesize_2(statements, compressor) {\n        function cons_seq(right) {\n            n--;\n            CHANGED = true;\n            var left = prev.body;\n            return make_sequence(left, [left, right]).transform(compressor);\n        }\n        var n = 0, prev;\n        for (var i = 0; i < statements.length; i++) {\n            var stat = statements[i];\n            if (prev) {\n                if (stat instanceof AST_Exit) {\n                    stat.value = cons_seq(stat.value || make_node(AST_Undefined, stat).transform(compressor));\n                } else if (stat instanceof AST_For) {\n                    if (!(stat.init instanceof AST_Definitions)) {\n                        const abort = walk(prev.body, node => {\n                            if (node instanceof AST_Scope)\n                                return true;\n                            if (node instanceof AST_Binary\n                                && node.operator === \"in\") {\n                                return walk_abort;\n                            }\n                        });\n                        if (!abort) {\n                            if (stat.init)\n                                stat.init = cons_seq(stat.init);\n                            else {\n                                stat.init = prev.body;\n                                n--;\n                                CHANGED = true;\n                            }\n                        }\n                    }\n                } else if (stat instanceof AST_ForIn) {\n                    if (!(stat.init instanceof AST_Const) && !(stat.init instanceof AST_Let)) {\n                        stat.object = cons_seq(stat.object);\n                    }\n                } else if (stat instanceof AST_If) {\n                    stat.condition = cons_seq(stat.condition);\n                } else if (stat instanceof AST_Switch) {\n                    stat.expression = cons_seq(stat.expression);\n                } else if (stat instanceof AST_With) {\n                    stat.expression = cons_seq(stat.expression);\n                }\n            }\n            if (compressor.option(\"conditionals\") && stat instanceof AST_If) {\n                var decls = [];\n                var body = to_simple_statement(stat.body, decls);\n                var alt = to_simple_statement(stat.alternative, decls);\n                if (body !== false && alt !== false && decls.length > 0) {\n                    var len = decls.length;\n                    decls.push(make_node(AST_If, stat, {\n                        condition: stat.condition,\n                        body: body || make_node(AST_EmptyStatement, stat.body),\n                        alternative: alt\n                    }));\n                    decls.unshift(n, 1);\n                    [].splice.apply(statements, decls);\n                    i += len;\n                    n += len + 1;\n                    prev = null;\n                    CHANGED = true;\n                    continue;\n                }\n            }\n            statements[n++] = stat;\n            prev = stat instanceof AST_SimpleStatement ? stat : null;\n        }\n        statements.length = n;\n    }\n\n    function join_object_assignments(defn, body) {\n        if (!(defn instanceof AST_Definitions))\n            return;\n        var def = defn.definitions[defn.definitions.length - 1];\n        if (!(def.value instanceof AST_Object))\n            return;\n        var exprs;\n        if (body instanceof AST_Assign && !body.logical) {\n            exprs = [body];\n        } else if (body instanceof AST_Sequence) {\n            exprs = body.expressions.slice();\n        }\n        if (!exprs)\n            return;\n        var trimmed = false;\n        do {\n            var node = exprs[0];\n            if (!(node instanceof AST_Assign))\n                break;\n            if (node.operator != \"=\")\n                break;\n            if (!(node.left instanceof AST_PropAccess))\n                break;\n            var sym = node.left.expression;\n            if (!(sym instanceof AST_SymbolRef))\n                break;\n            if (def.name.name != sym.name)\n                break;\n            if (!node.right.is_constant_expression(nearest_scope))\n                break;\n            var prop = node.left.property;\n            if (prop instanceof AST_Node) {\n                prop = prop.evaluate(compressor);\n            }\n            if (prop instanceof AST_Node)\n                break;\n            prop = \"\" + prop;\n            var diff = compressor.option(\"ecma\") < 2015\n                && compressor.has_directive(\"use strict\") ? function (node) {\n                    return node.key != prop && (node.key && node.key.name != prop);\n                } : function (node) {\n                    return node.key && node.key.name != prop;\n                };\n            if (!def.value.properties.every(diff))\n                break;\n            var p = def.value.properties.filter(function (p) { return p.key === prop; })[0];\n            if (!p) {\n                def.value.properties.push(make_node(AST_ObjectKeyVal, node, {\n                    key: prop,\n                    value: node.right\n                }));\n            } else {\n                p.value = new AST_Sequence({\n                    start: p.start,\n                    expressions: [p.value.clone(), node.right.clone()],\n                    end: p.end\n                });\n            }\n            exprs.shift();\n            trimmed = true;\n        } while (exprs.length);\n        return trimmed && exprs;\n    }\n\n    function join_consecutive_vars(statements) {\n        var defs;\n        for (var i = 0, j = -1, len = statements.length; i < len; i++) {\n            var stat = statements[i];\n            var prev = statements[j];\n            if (stat instanceof AST_Definitions) {\n                if (prev && prev.TYPE == stat.TYPE) {\n                    prev.definitions = prev.definitions.concat(stat.definitions);\n                    CHANGED = true;\n                } else if (defs && defs.TYPE == stat.TYPE && declarations_only(stat)) {\n                    defs.definitions = defs.definitions.concat(stat.definitions);\n                    CHANGED = true;\n                } else {\n                    statements[++j] = stat;\n                    defs = stat;\n                }\n            } else if (stat instanceof AST_Exit) {\n                stat.value = extract_object_assignments(stat.value);\n            } else if (stat instanceof AST_For) {\n                var exprs = join_object_assignments(prev, stat.init);\n                if (exprs) {\n                    CHANGED = true;\n                    stat.init = exprs.length ? make_sequence(stat.init, exprs) : null;\n                    statements[++j] = stat;\n                } else if (\n                    prev instanceof AST_Var\n                    && (!stat.init || stat.init.TYPE == prev.TYPE)\n                ) {\n                    if (stat.init) {\n                        prev.definitions = prev.definitions.concat(stat.init.definitions);\n                    }\n                    stat.init = prev;\n                    statements[j] = stat;\n                    CHANGED = true;\n                } else if (\n                    defs instanceof AST_Var\n                    && stat.init instanceof AST_Var\n                    && declarations_only(stat.init)\n                ) {\n                    defs.definitions = defs.definitions.concat(stat.init.definitions);\n                    stat.init = null;\n                    statements[++j] = stat;\n                    CHANGED = true;\n                } else {\n                    statements[++j] = stat;\n                }\n            } else if (stat instanceof AST_ForIn) {\n                stat.object = extract_object_assignments(stat.object);\n            } else if (stat instanceof AST_If) {\n                stat.condition = extract_object_assignments(stat.condition);\n            } else if (stat instanceof AST_SimpleStatement) {\n                var exprs = join_object_assignments(prev, stat.body);\n                if (exprs) {\n                    CHANGED = true;\n                    if (!exprs.length)\n                        continue;\n                    stat.body = make_sequence(stat.body, exprs);\n                }\n                statements[++j] = stat;\n            } else if (stat instanceof AST_Switch) {\n                stat.expression = extract_object_assignments(stat.expression);\n            } else if (stat instanceof AST_With) {\n                stat.expression = extract_object_assignments(stat.expression);\n            } else {\n                statements[++j] = stat;\n            }\n        }\n        statements.length = j + 1;\n\n        function extract_object_assignments(value) {\n            statements[++j] = stat;\n            var exprs = join_object_assignments(prev, value);\n            if (exprs) {\n                CHANGED = true;\n                if (exprs.length) {\n                    return make_sequence(value, exprs);\n                } else if (value instanceof AST_Sequence) {\n                    return value.tail_node().left;\n                } else {\n                    return value.left;\n                }\n            }\n            return value;\n        }\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/lib/equivalent-to.js",
    "content": "import {\n    AST_Array,\n    AST_Atom,\n    AST_Await,\n    AST_BigInt,\n    AST_Binary,\n    AST_Block,\n    AST_Call,\n    AST_Catch,\n    AST_Chain,\n    AST_Class,\n    AST_ClassProperty,\n    AST_ConciseMethod,\n    AST_Conditional,\n    AST_Debugger,\n    AST_Definitions,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DotHash,\n    AST_EmptyStatement,\n    AST_Expansion,\n    AST_Export,\n    AST_Finally,\n    AST_For,\n    AST_ForIn,\n    AST_ForOf,\n    AST_If,\n    AST_Import,\n    AST_ImportMeta,\n    AST_Jump,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_LoopControl,\n    AST_NameMapping,\n    AST_NewTarget,\n    AST_Node,\n    AST_Number,\n    AST_Object,\n    AST_ObjectGetter,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_ObjectSetter,\n    AST_PrefixedTemplateString,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_String,\n    AST_Super,\n    AST_Switch,\n    AST_SwitchBranch,\n    AST_Symbol,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_This,\n    AST_Toplevel,\n    AST_Try,\n    AST_Unary,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield\n} from \"./ast.js\";\n\nconst shallow_cmp = (node1, node2) => {\n    return (\n        node1 === null && node2 === null\n        || node1.TYPE === node2.TYPE && node1.shallow_cmp(node2)\n    );\n};\n\nexport const equivalent_to = (tree1, tree2) => {\n    if (!shallow_cmp(tree1, tree2)) return false;\n    const walk_1_state = [tree1];\n    const walk_2_state = [tree2];\n\n    const walk_1_push = walk_1_state.push.bind(walk_1_state);\n    const walk_2_push = walk_2_state.push.bind(walk_2_state);\n\n    while (walk_1_state.length && walk_2_state.length) {\n        const node_1 = walk_1_state.pop();\n        const node_2 = walk_2_state.pop();\n\n        if (!shallow_cmp(node_1, node_2)) return false;\n\n        node_1._children_backwards(walk_1_push);\n        node_2._children_backwards(walk_2_push);\n\n        if (walk_1_state.length !== walk_2_state.length) {\n            // Different number of children\n            return false;\n        }\n    }\n\n    return walk_1_state.length == 0 && walk_2_state.length == 0;\n};\n\nconst pass_through = () => true;\n\nAST_Node.prototype.shallow_cmp = function () {\n    throw new Error(\"did not find a shallow_cmp function for \" + this.constructor.name);\n};\n\nAST_Debugger.prototype.shallow_cmp = pass_through;\n\nAST_Directive.prototype.shallow_cmp = function(other) {\n    return this.value === other.value;\n};\n\nAST_SimpleStatement.prototype.shallow_cmp = pass_through;\n\nAST_Block.prototype.shallow_cmp = pass_through;\n\nAST_EmptyStatement.prototype.shallow_cmp = pass_through;\n\nAST_LabeledStatement.prototype.shallow_cmp = function(other) {\n    return this.label.name === other.label.name;\n};\n\nAST_Do.prototype.shallow_cmp = pass_through;\n\nAST_While.prototype.shallow_cmp = pass_through;\n\nAST_For.prototype.shallow_cmp = function(other) {\n    return (this.init == null ? other.init == null : this.init === other.init) && (this.condition == null ? other.condition == null : this.condition === other.condition) && (this.step == null ? other.step == null : this.step === other.step);\n};\n\nAST_ForIn.prototype.shallow_cmp = pass_through;\n\nAST_ForOf.prototype.shallow_cmp = pass_through;\n\nAST_With.prototype.shallow_cmp = pass_through;\n\nAST_Toplevel.prototype.shallow_cmp = pass_through;\n\nAST_Expansion.prototype.shallow_cmp = pass_through;\n\nAST_Lambda.prototype.shallow_cmp = function(other) {\n    return this.is_generator === other.is_generator && this.async === other.async;\n};\n\nAST_Destructuring.prototype.shallow_cmp = function(other) {\n    return this.is_array === other.is_array;\n};\n\nAST_PrefixedTemplateString.prototype.shallow_cmp = pass_through;\n\nAST_TemplateString.prototype.shallow_cmp = pass_through;\n\nAST_TemplateSegment.prototype.shallow_cmp = function(other) {\n    return this.value === other.value;\n};\n\nAST_Jump.prototype.shallow_cmp = pass_through;\n\nAST_LoopControl.prototype.shallow_cmp = pass_through;\n\nAST_Await.prototype.shallow_cmp = pass_through;\n\nAST_Yield.prototype.shallow_cmp = function(other) {\n    return this.is_star === other.is_star;\n};\n\nAST_If.prototype.shallow_cmp = function(other) {\n    return this.alternative == null ? other.alternative == null : this.alternative === other.alternative;\n};\n\nAST_Switch.prototype.shallow_cmp = pass_through;\n\nAST_SwitchBranch.prototype.shallow_cmp = pass_through;\n\nAST_Try.prototype.shallow_cmp = function(other) {\n    return (this.body === other.body) && (this.bcatch == null ? other.bcatch == null : this.bcatch === other.bcatch) && (this.bfinally == null ? other.bfinally == null : this.bfinally === other.bfinally);\n};\n\nAST_Catch.prototype.shallow_cmp = function(other) {\n    return this.argname == null ? other.argname == null : this.argname === other.argname;\n};\n\nAST_Finally.prototype.shallow_cmp = pass_through;\n\nAST_Definitions.prototype.shallow_cmp = pass_through;\n\nAST_VarDef.prototype.shallow_cmp = function(other) {\n    return this.value == null ? other.value == null : this.value === other.value;\n};\n\nAST_NameMapping.prototype.shallow_cmp = pass_through;\n\nAST_Import.prototype.shallow_cmp = function(other) {\n    return (this.imported_name == null ? other.imported_name == null : this.imported_name === other.imported_name) && (this.imported_names == null ? other.imported_names == null : this.imported_names === other.imported_names);\n};\n\nAST_ImportMeta.prototype.shallow_cmp = pass_through;\n\nAST_Export.prototype.shallow_cmp = function(other) {\n    return (this.exported_definition == null ? other.exported_definition == null : this.exported_definition === other.exported_definition) && (this.exported_value == null ? other.exported_value == null : this.exported_value === other.exported_value) && (this.exported_names == null ? other.exported_names == null : this.exported_names === other.exported_names) && this.module_name === other.module_name && this.is_default === other.is_default;\n};\n\nAST_Call.prototype.shallow_cmp = pass_through;\n\nAST_Sequence.prototype.shallow_cmp = pass_through;\n\nAST_PropAccess.prototype.shallow_cmp = pass_through;\n\nAST_Chain.prototype.shallow_cmp = pass_through;\n\nAST_Dot.prototype.shallow_cmp = function(other) {\n    return this.property === other.property;\n};\n\nAST_DotHash.prototype.shallow_cmp = function(other) {\n    return this.property === other.property;\n};\n\nAST_Unary.prototype.shallow_cmp = function(other) {\n    return this.operator === other.operator;\n};\n\nAST_Binary.prototype.shallow_cmp = function(other) {\n    return this.operator === other.operator;\n};\n\nAST_Conditional.prototype.shallow_cmp = pass_through;\n\nAST_Array.prototype.shallow_cmp = pass_through;\n\nAST_Object.prototype.shallow_cmp = pass_through;\n\nAST_ObjectProperty.prototype.shallow_cmp = pass_through;\n\nAST_ObjectKeyVal.prototype.shallow_cmp = function(other) {\n    return this.key === other.key;\n};\n\nAST_ObjectSetter.prototype.shallow_cmp = function(other) {\n    return this.static === other.static;\n};\n\nAST_ObjectGetter.prototype.shallow_cmp = function(other) {\n    return this.static === other.static;\n};\n\nAST_ConciseMethod.prototype.shallow_cmp = function(other) {\n    return this.static === other.static && this.is_generator === other.is_generator && this.async === other.async;\n};\n\nAST_Class.prototype.shallow_cmp = function(other) {\n    return (this.name == null ? other.name == null : this.name === other.name) && (this.extends == null ? other.extends == null : this.extends === other.extends);\n};\n\nAST_ClassProperty.prototype.shallow_cmp = function(other) {\n    return this.static === other.static;\n};\n\nAST_Symbol.prototype.shallow_cmp = function(other) {\n    return this.name === other.name;\n};\n\nAST_NewTarget.prototype.shallow_cmp = pass_through;\n\nAST_This.prototype.shallow_cmp = pass_through;\n\nAST_Super.prototype.shallow_cmp = pass_through;\n\nAST_String.prototype.shallow_cmp = function(other) {\n    return this.value === other.value;\n};\n\nAST_Number.prototype.shallow_cmp = function(other) {\n    return this.value === other.value;\n};\n\nAST_BigInt.prototype.shallow_cmp = function(other) {\n    return this.value === other.value;\n};\n\nAST_RegExp.prototype.shallow_cmp = function (other) {\n    return (\n        this.value.flags === other.value.flags\n        && this.value.source === other.value.source\n    );\n};\n\nAST_Atom.prototype.shallow_cmp = pass_through;\n"
  },
  {
    "path": "templates/bin/node/terser/lib/minify.js",
    "content": "\"use strict\";\n/* eslint-env browser, es6, node */\n\nimport {\n    defaults,\n    map_from_object,\n    map_to_object,\n    HOP,\n} from \"./utils/index.js\";\nimport { AST_Toplevel, AST_Node, walk, AST_Scope } from \"./ast.js\";\nimport { parse } from \"./parse.js\";\nimport { OutputStream } from \"./output.js\";\nimport { Compressor } from \"./compress/index.js\";\nimport { base54 } from \"./scope.js\";\nimport { SourceMap } from \"./sourcemap.js\";\nimport {\n    mangle_properties,\n    mangle_private_properties,\n    reserve_quoted_keys,\n} from \"./propmangle.js\";\n\n// to/from base64 functions\n// Prefer built-in Buffer, if available, then use hack\n// https://developer.mozilla.org/en-US/docs/Glossary/Base64#The_Unicode_Problem\nvar to_ascii = typeof Buffer !== \"undefined\"\n    ? (b64) => Buffer.from(b64, \"base64\").toString()\n    : (b64) => decodeURIComponent(escape(atob(b64)));\nvar to_base64 = typeof Buffer !== \"undefined\"\n    ? (str) => Buffer.from(str).toString(\"base64\")\n    : (str) => btoa(unescape(encodeURIComponent(str)));\n\nfunction read_source_map(code) {\n    var match = /(?:^|[^.])\\/\\/# sourceMappingURL=data:application\\/json(;[\\w=-]*)?;base64,([+/0-9A-Za-z]*=*)\\s*$/.exec(code);\n    if (!match) {\n        console.warn(\"inline source map not found\");\n        return null;\n    }\n    return to_ascii(match[2]);\n}\n\nfunction set_shorthand(name, options, keys) {\n    if (options[name]) {\n        keys.forEach(function(key) {\n            if (options[key]) {\n                if (typeof options[key] != \"object\") options[key] = {};\n                if (!(name in options[key])) options[key][name] = options[name];\n            }\n        });\n    }\n}\n\nfunction init_cache(cache) {\n    if (!cache) return;\n    if (!(\"props\" in cache)) {\n        cache.props = new Map();\n    } else if (!(cache.props instanceof Map)) {\n        cache.props = map_from_object(cache.props);\n    }\n}\n\nfunction cache_to_json(cache) {\n    return {\n        props: map_to_object(cache.props)\n    };\n}\n\nfunction log_input(files, options, fs, debug_folder) {\n    if (!(fs && fs.writeFileSync && fs.mkdirSync)) {\n        return;\n    }\n\n    try {\n        fs.mkdirSync(debug_folder);\n    } catch (e) {\n        if (e.code !== \"EEXIST\") throw e;\n    }\n\n    const log_path = `${debug_folder}/terser-debug-${(Math.random() * 9999999) | 0}.log`;\n\n    options = options || {};\n\n    const options_str = JSON.stringify(options, (_key, thing) => {\n        if (typeof thing === \"function\") return \"[Function \" + thing.toString() + \"]\";\n        if (thing instanceof RegExp) return \"[RegExp \" + thing.toString() + \"]\";\n        return thing;\n    }, 4);\n\n    const files_str = (file) => {\n        if (typeof file === \"object\" && options.parse && options.parse.spidermonkey) {\n            return JSON.stringify(file, null, 2);\n        } else if (typeof file === \"object\") {\n            return Object.keys(file)\n                .map((key) => key + \": \" + files_str(file[key]))\n                .join(\"\\n\\n\");\n        } else if (typeof file === \"string\") {\n            return \"```\\n\" + file + \"\\n```\";\n        } else {\n            return file; // What do?\n        }\n    };\n\n    fs.writeFileSync(log_path, \"Options: \\n\" + options_str + \"\\n\\nInput files:\\n\\n\" + files_str(files) + \"\\n\");\n}\n\nasync function minify(files, options, _fs_module) {\n    if (\n        _fs_module\n        && typeof process === \"object\"\n        && process.env\n        && typeof process.env.TERSER_DEBUG_DIR === \"string\"\n    ) {\n        log_input(files, options, _fs_module, process.env.TERSER_DEBUG_DIR);\n    }\n\n    options = defaults(options, {\n        compress: {},\n        ecma: undefined,\n        enclose: false,\n        ie8: false,\n        keep_classnames: undefined,\n        keep_fnames: false,\n        mangle: {},\n        module: false,\n        nameCache: null,\n        output: null,\n        format: null,\n        parse: {},\n        rename: undefined,\n        safari10: false,\n        sourceMap: false,\n        spidermonkey: false,\n        timings: false,\n        toplevel: false,\n        warnings: false,\n        wrap: false,\n    }, true);\n\n    var timings = options.timings && {\n        start: Date.now()\n    };\n    if (options.keep_classnames === undefined) {\n        options.keep_classnames = options.keep_fnames;\n    }\n    if (options.rename === undefined) {\n        options.rename = options.compress && options.mangle;\n    }\n    if (options.output && options.format) {\n        throw new Error(\"Please only specify either output or format option, preferrably format.\");\n    }\n    options.format = options.format || options.output || {};\n    set_shorthand(\"ecma\", options, [ \"parse\", \"compress\", \"format\" ]);\n    set_shorthand(\"ie8\", options, [ \"compress\", \"mangle\", \"format\" ]);\n    set_shorthand(\"keep_classnames\", options, [ \"compress\", \"mangle\" ]);\n    set_shorthand(\"keep_fnames\", options, [ \"compress\", \"mangle\" ]);\n    set_shorthand(\"module\", options, [ \"parse\", \"compress\", \"mangle\" ]);\n    set_shorthand(\"safari10\", options, [ \"mangle\", \"format\" ]);\n    set_shorthand(\"toplevel\", options, [ \"compress\", \"mangle\" ]);\n    set_shorthand(\"warnings\", options, [ \"compress\" ]); // legacy\n    var quoted_props;\n    if (options.mangle) {\n        options.mangle = defaults(options.mangle, {\n            cache: options.nameCache && (options.nameCache.vars || {}),\n            eval: false,\n            ie8: false,\n            keep_classnames: false,\n            keep_fnames: false,\n            module: false,\n            nth_identifier: base54,\n            properties: false,\n            reserved: [],\n            safari10: false,\n            toplevel: false,\n        }, true);\n        if (options.mangle.properties) {\n            if (typeof options.mangle.properties != \"object\") {\n                options.mangle.properties = {};\n            }\n            if (options.mangle.properties.keep_quoted) {\n                quoted_props = options.mangle.properties.reserved;\n                if (!Array.isArray(quoted_props)) quoted_props = [];\n                options.mangle.properties.reserved = quoted_props;\n            }\n            if (options.nameCache && !(\"cache\" in options.mangle.properties)) {\n                options.mangle.properties.cache = options.nameCache.props || {};\n            }\n        }\n        init_cache(options.mangle.cache);\n        init_cache(options.mangle.properties.cache);\n    }\n    if (options.sourceMap) {\n        options.sourceMap = defaults(options.sourceMap, {\n            asObject: false,\n            content: null,\n            filename: null,\n            includeSources: false,\n            root: null,\n            url: null,\n        }, true);\n    }\n\n    // -- Parse phase --\n    if (timings) timings.parse = Date.now();\n    var toplevel;\n    if (files instanceof AST_Toplevel) {\n        toplevel = files;\n    } else {\n        if (typeof files == \"string\" || (options.parse.spidermonkey && !Array.isArray(files))) {\n            files = [ files ];\n        }\n        options.parse = options.parse || {};\n        options.parse.toplevel = null;\n\n        if (options.parse.spidermonkey) {\n            options.parse.toplevel = AST_Node.from_mozilla_ast(Object.keys(files).reduce(function(toplevel, name) {\n                if (!toplevel) return files[name];\n                toplevel.body = toplevel.body.concat(files[name].body);\n                return toplevel;\n            }, null));\n        } else {\n            delete options.parse.spidermonkey;\n\n            for (var name in files) if (HOP(files, name)) {\n                options.parse.filename = name;\n                options.parse.toplevel = parse(files[name], options.parse);\n                if (options.sourceMap && options.sourceMap.content == \"inline\") {\n                    if (Object.keys(files).length > 1)\n                        throw new Error(\"inline source map only works with singular input\");\n                    options.sourceMap.content = read_source_map(files[name]);\n                }\n            }\n        }\n\n        toplevel = options.parse.toplevel;\n    }\n    if (quoted_props && options.mangle.properties.keep_quoted !== \"strict\") {\n        reserve_quoted_keys(toplevel, quoted_props);\n    }\n    if (options.wrap) {\n        toplevel = toplevel.wrap_commonjs(options.wrap);\n    }\n    if (options.enclose) {\n        toplevel = toplevel.wrap_enclose(options.enclose);\n    }\n    if (timings) timings.rename = Date.now();\n    // disable rename on harmony due to expand_names bug in for-of loops\n    // https://github.com/mishoo/UglifyJS2/issues/2794\n    if (0 && options.rename) {\n        toplevel.figure_out_scope(options.mangle);\n        toplevel.expand_names(options.mangle);\n    }\n\n    // -- Compress phase --\n    if (timings) timings.compress = Date.now();\n    if (options.compress) {\n        toplevel = new Compressor(options.compress, {\n            mangle_options: options.mangle\n        }).compress(toplevel);\n    }\n\n    // -- Mangle phase --\n    if (timings) timings.scope = Date.now();\n    if (options.mangle) toplevel.figure_out_scope(options.mangle);\n    if (timings) timings.mangle = Date.now();\n    if (options.mangle) {\n        toplevel.compute_char_frequency(options.mangle);\n        toplevel.mangle_names(options.mangle);\n        toplevel = mangle_private_properties(toplevel, options.mangle);\n    }\n    if (timings) timings.properties = Date.now();\n    if (options.mangle && options.mangle.properties) {\n        toplevel = mangle_properties(toplevel, options.mangle.properties);\n    }\n\n    // Format phase\n    if (timings) timings.format = Date.now();\n    var result = {};\n    if (options.format.ast) {\n        result.ast = toplevel;\n    }\n    if (options.format.spidermonkey) {\n        result.ast = toplevel.to_mozilla_ast();\n    }\n    let format_options;\n    if (!HOP(options.format, \"code\") || options.format.code) {\n        // Make a shallow copy so that we can modify without mutating the user's input.\n        format_options = {...options.format};\n        if (!format_options.ast) {\n            // Destroy stuff to save RAM. (unless the deprecated `ast` option is on)\n            format_options._destroy_ast = true;\n\n            walk(toplevel, node => {\n                if (node instanceof AST_Scope) {\n                    node.variables = undefined;\n                    node.enclosed = undefined;\n                    node.parent_scope = undefined;\n                }\n                if (node.block_scope) {\n                    node.block_scope.variables = undefined;\n                    node.block_scope.enclosed = undefined;\n                    node.parent_scope = undefined;\n                }\n            });\n        }\n\n        if (options.sourceMap) {\n            if (options.sourceMap.includeSources && files instanceof AST_Toplevel) {\n                throw new Error(\"original source content unavailable\");\n            }\n            format_options.source_map = await SourceMap({\n                file: options.sourceMap.filename,\n                orig: options.sourceMap.content,\n                root: options.sourceMap.root,\n                files: options.sourceMap.includeSources ? files : null,\n            });\n        }\n        delete format_options.ast;\n        delete format_options.code;\n        delete format_options.spidermonkey;\n        var stream = OutputStream(format_options);\n        toplevel.print(stream);\n        result.code = stream.get();\n        if (options.sourceMap) {\n            Object.defineProperty(result, \"map\", {\n                configurable: true,\n                enumerable: true,\n                get() {\n                    const map = format_options.source_map.getEncoded();\n                    return (result.map = options.sourceMap.asObject ? map : JSON.stringify(map));\n                },\n                set(value) {\n                    Object.defineProperty(result, \"map\", {\n                        value,\n                        writable: true,\n                    });\n                }\n            });\n            result.decoded_map = format_options.source_map.getDecoded();\n            if (options.sourceMap.url == \"inline\") {\n                var sourceMap = typeof result.map === \"object\" ? JSON.stringify(result.map) : result.map;\n                result.code += \"\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,\" + to_base64(sourceMap);\n            } else if (options.sourceMap.url) {\n                result.code += \"\\n//# sourceMappingURL=\" + options.sourceMap.url;\n            }\n        }\n    }\n    if (options.nameCache && options.mangle) {\n        if (options.mangle.cache) options.nameCache.vars = cache_to_json(options.mangle.cache);\n        if (options.mangle.properties && options.mangle.properties.cache) {\n            options.nameCache.props = cache_to_json(options.mangle.properties.cache);\n        }\n    }\n    if (format_options && format_options.source_map) {\n        format_options.source_map.destroy();\n    }\n    if (timings) {\n        timings.end = Date.now();\n        result.timings = {\n            parse: 1e-3 * (timings.rename - timings.parse),\n            rename: 1e-3 * (timings.compress - timings.rename),\n            compress: 1e-3 * (timings.scope - timings.compress),\n            scope: 1e-3 * (timings.mangle - timings.scope),\n            mangle: 1e-3 * (timings.properties - timings.mangle),\n            properties: 1e-3 * (timings.format - timings.properties),\n            format: 1e-3 * (timings.end - timings.format),\n            total: 1e-3 * (timings.end - timings.start)\n        };\n    }\n    return result;\n}\n\nexport {\n  minify,\n  to_ascii,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/mozilla-ast.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\nimport { make_node } from \"./utils/index.js\";\nimport {\n    AST_Accessor,\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_Atom,\n    AST_Await,\n    AST_BigInt,\n    AST_Binary,\n    AST_Block,\n    AST_BlockStatement,\n    AST_Boolean,\n    AST_Break,\n    AST_Call,\n    AST_Case,\n    AST_Catch,\n    AST_Chain,\n    AST_Class,\n    AST_ClassStaticBlock,\n    AST_ClassExpression,\n    AST_ClassProperty,\n    AST_ClassPrivateProperty,\n    AST_ConciseMethod,\n    AST_Conditional,\n    AST_Const,\n    AST_Constant,\n    AST_Continue,\n    AST_Debugger,\n    AST_Default,\n    AST_DefaultAssign,\n    AST_DefClass,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DotHash,\n    AST_EmptyStatement,\n    AST_Expansion,\n    AST_Export,\n    AST_False,\n    AST_Finally,\n    AST_For,\n    AST_ForIn,\n    AST_ForOf,\n    AST_Function,\n    AST_Hole,\n    AST_If,\n    AST_Import,\n    AST_ImportMeta,\n    AST_Label,\n    AST_LabeledStatement,\n    AST_LabelRef,\n    AST_Lambda,\n    AST_Let,\n    AST_NameMapping,\n    AST_New,\n    AST_NewTarget,\n    AST_Node,\n    AST_Null,\n    AST_Number,\n    AST_Object,\n    AST_ObjectGetter,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_ObjectSetter,\n    AST_PrefixedTemplateString,\n    AST_PrivateGetter,\n    AST_PrivateMethod,\n    AST_PrivateSetter,\n    AST_PrivateIn,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Return,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Statement,\n    AST_String,\n    AST_Sub,\n    AST_Super,\n    AST_Switch,\n    AST_SwitchBranch,\n    AST_Symbol,\n    AST_SymbolCatch,\n    AST_SymbolClass,\n    AST_SymbolClassProperty,\n    AST_SymbolPrivateProperty,\n    AST_SymbolConst,\n    AST_SymbolDefClass,\n    AST_SymbolDefun,\n    AST_SymbolExport,\n    AST_SymbolExportForeign,\n    AST_SymbolFunarg,\n    AST_SymbolImport,\n    AST_SymbolImportForeign,\n    AST_SymbolLambda,\n    AST_SymbolLet,\n    AST_SymbolMethod,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_This,\n    AST_Throw,\n    AST_Token,\n    AST_Toplevel,\n    AST_True,\n    AST_Try,\n    AST_TryBlock,\n    AST_Unary,\n    AST_UnaryPostfix,\n    AST_UnaryPrefix,\n    AST_Var,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n} from \"./ast.js\";\nimport { is_basic_identifier_string } from \"./parse.js\";\n\n(function() {\n\n    var normalize_directives = function(body) {\n        var in_directive = true;\n\n        for (var i = 0; i < body.length; i++) {\n            if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {\n                body[i] = new AST_Directive({\n                    start: body[i].start,\n                    end: body[i].end,\n                    value: body[i].body.value\n                });\n            } else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) {\n                in_directive = false;\n            }\n        }\n\n        return body;\n    };\n\n    const assert_clause_from_moz = (assertions) => {\n        if (assertions && assertions.length > 0) {\n            return new AST_Object({\n                start: my_start_token(assertions),\n                end: my_end_token(assertions),\n                properties: assertions.map((assertion_kv) =>\n                    new AST_ObjectKeyVal({\n                        start: my_start_token(assertion_kv),\n                        end: my_end_token(assertion_kv),\n                        key: assertion_kv.key.name || assertion_kv.key.value,\n                        value: from_moz(assertion_kv.value)\n                    })\n                )\n            });\n        }\n        return null;\n    };\n\n    var MOZ_TO_ME = {\n        Program: function(M) {\n            return new AST_Toplevel({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                body: normalize_directives(M.body.map(from_moz))\n            });\n        },\n\n        ArrayPattern: function(M) {\n            return new AST_Destructuring({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                names: M.elements.map(function(elm) {\n                    if (elm === null) {\n                        return new AST_Hole();\n                    }\n                    return from_moz(elm);\n                }),\n                is_array: true\n            });\n        },\n\n        ObjectPattern: function(M) {\n            return new AST_Destructuring({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                names: M.properties.map(from_moz),\n                is_array: false\n            });\n        },\n\n        AssignmentPattern: function(M) {\n            return new AST_DefaultAssign({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                left: from_moz(M.left),\n                operator: \"=\",\n                right: from_moz(M.right)\n            });\n        },\n\n        SpreadElement: function(M) {\n            return new AST_Expansion({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.argument)\n            });\n        },\n\n        RestElement: function(M) {\n            return new AST_Expansion({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.argument)\n            });\n        },\n\n        TemplateElement: function(M) {\n            return new AST_TemplateSegment({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                value: M.value.cooked,\n                raw: M.value.raw\n            });\n        },\n\n        TemplateLiteral: function(M) {\n            var segments = [];\n            for (var i = 0; i < M.quasis.length; i++) {\n                segments.push(from_moz(M.quasis[i]));\n                if (M.expressions[i]) {\n                    segments.push(from_moz(M.expressions[i]));\n                }\n            }\n            return new AST_TemplateString({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                segments: segments\n            });\n        },\n\n        TaggedTemplateExpression: function(M) {\n            return new AST_PrefixedTemplateString({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                template_string: from_moz(M.quasi),\n                prefix: from_moz(M.tag)\n            });\n        },\n\n        FunctionDeclaration: function(M) {\n            return new AST_Defun({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                name: from_moz(M.id),\n                argnames: M.params.map(from_moz),\n                is_generator: M.generator,\n                async: M.async,\n                body: normalize_directives(from_moz(M.body).body)\n            });\n        },\n\n        FunctionExpression: function(M) {\n            return new AST_Function({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                name: from_moz(M.id),\n                argnames: M.params.map(from_moz),\n                is_generator: M.generator,\n                async: M.async,\n                body: normalize_directives(from_moz(M.body).body)\n            });\n        },\n\n        ArrowFunctionExpression: function(M) {\n            const body = M.body.type === \"BlockStatement\"\n                ? from_moz(M.body).body\n                : [make_node(AST_Return, {}, { value: from_moz(M.body) })];\n            return new AST_Arrow({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                argnames: M.params.map(from_moz),\n                body,\n                async: M.async,\n            });\n        },\n\n        ExpressionStatement: function(M) {\n            return new AST_SimpleStatement({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                body: from_moz(M.expression)\n            });\n        },\n\n        TryStatement: function(M) {\n            var handlers = M.handlers || [M.handler];\n            if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) {\n                throw new Error(\"Multiple catch clauses are not supported.\");\n            }\n            return new AST_Try({\n                start    : my_start_token(M),\n                end      : my_end_token(M),\n                body     : new AST_TryBlock(from_moz(M.block)),\n                bcatch   : from_moz(handlers[0]),\n                bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null\n            });\n        },\n\n        Property: function(M) {\n            var key = M.key;\n            var args = {\n                start    : my_start_token(key || M.value),\n                end      : my_end_token(M.value),\n                key      : key.type == \"Identifier\" ? key.name : key.value,\n                value    : from_moz(M.value)\n            };\n            if (M.computed) {\n                args.key = from_moz(M.key);\n            }\n            if (M.method) {\n                args.is_generator = M.value.generator;\n                args.async = M.value.async;\n                if (!M.computed) {\n                    args.key = new AST_SymbolMethod({ name: args.key });\n                } else {\n                    args.key = from_moz(M.key);\n                }\n                return new AST_ConciseMethod(args);\n            }\n            if (M.kind == \"init\") {\n                if (key.type != \"Identifier\" && key.type != \"Literal\") {\n                    args.key = from_moz(key);\n                }\n                return new AST_ObjectKeyVal(args);\n            }\n            if (typeof args.key === \"string\" || typeof args.key === \"number\") {\n                args.key = new AST_SymbolMethod({\n                    name: args.key\n                });\n            }\n            args.value = new AST_Accessor(args.value);\n            if (M.kind == \"get\") return new AST_ObjectGetter(args);\n            if (M.kind == \"set\") return new AST_ObjectSetter(args);\n            if (M.kind == \"method\") {\n                args.async = M.value.async;\n                args.is_generator = M.value.generator;\n                args.quote = M.computed ? \"\\\"\" : null;\n                return new AST_ConciseMethod(args);\n            }\n        },\n\n        MethodDefinition: function(M) {\n            var args = {\n                start    : my_start_token(M),\n                end      : my_end_token(M),\n                key      : M.computed ? from_moz(M.key) : new AST_SymbolMethod({ name: M.key.name || M.key.value }),\n                value    : from_moz(M.value),\n                static   : M.static,\n            };\n            if (M.kind == \"get\") {\n                return new AST_ObjectGetter(args);\n            }\n            if (M.kind == \"set\") {\n                return new AST_ObjectSetter(args);\n            }\n            args.is_generator = M.value.generator;\n            args.async = M.value.async;\n            return new AST_ConciseMethod(args);\n        },\n\n        FieldDefinition: function(M) {\n            let key;\n            if (M.computed) {\n                key = from_moz(M.key);\n            } else {\n                if (M.key.type !== \"Identifier\") throw new Error(\"Non-Identifier key in FieldDefinition\");\n                key = from_moz(M.key);\n            }\n            return new AST_ClassProperty({\n                start    : my_start_token(M),\n                end      : my_end_token(M),\n                key,\n                value    : from_moz(M.value),\n                static   : M.static,\n            });\n        },\n\n        PropertyDefinition: function(M) {\n            let key;\n            if (M.computed) {\n                key = from_moz(M.key);\n            } else {\n                if (M.key.type !== \"Identifier\" && M.key.type !== \"PrivateIdentifier\") {\n                    throw new Error(\"Non-Identifier key in PropertyDefinition\");\n                }\n                key = from_moz(M.key);\n            }\n\n            return new AST_ClassProperty({\n                start    : my_start_token(M),\n                end      : my_end_token(M),\n                key,\n                value    : from_moz(M.value),\n                static   : M.static,\n            });\n        },\n\n        StaticBlock: function(M) {\n            return new AST_ClassStaticBlock({\n                start : my_start_token(M),\n                end   : my_end_token(M),\n                body  : M.body.map(from_moz),\n            });\n        },\n\n        ArrayExpression: function(M) {\n            return new AST_Array({\n                start    : my_start_token(M),\n                end      : my_end_token(M),\n                elements : M.elements.map(function(elem) {\n                    return elem === null ? new AST_Hole() : from_moz(elem);\n                })\n            });\n        },\n\n        ObjectExpression: function(M) {\n            return new AST_Object({\n                start      : my_start_token(M),\n                end        : my_end_token(M),\n                properties : M.properties.map(function(prop) {\n                    if (prop.type === \"SpreadElement\") {\n                        return from_moz(prop);\n                    }\n                    prop.type = \"Property\";\n                    return from_moz(prop);\n                })\n            });\n        },\n\n        SequenceExpression: function(M) {\n            return new AST_Sequence({\n                start      : my_start_token(M),\n                end        : my_end_token(M),\n                expressions: M.expressions.map(from_moz)\n            });\n        },\n\n        MemberExpression: function(M) {\n            return new (M.computed ? AST_Sub : AST_Dot)({\n                start      : my_start_token(M),\n                end        : my_end_token(M),\n                property   : M.computed ? from_moz(M.property) : M.property.name,\n                expression : from_moz(M.object),\n                optional   : M.optional || false\n            });\n        },\n\n        ChainExpression: function(M) {\n            return new AST_Chain({\n                start      : my_start_token(M),\n                end        : my_end_token(M),\n                expression : from_moz(M.expression)\n            });\n        },\n\n        SwitchCase: function(M) {\n            return new (M.test ? AST_Case : AST_Default)({\n                start      : my_start_token(M),\n                end        : my_end_token(M),\n                expression : from_moz(M.test),\n                body       : M.consequent.map(from_moz)\n            });\n        },\n\n        VariableDeclaration: function(M) {\n            return new (M.kind === \"const\" ? AST_Const :\n                        M.kind === \"let\" ? AST_Let : AST_Var)({\n                start       : my_start_token(M),\n                end         : my_end_token(M),\n                definitions : M.declarations.map(from_moz)\n            });\n        },\n\n        ImportDeclaration: function(M) {\n            var imported_name = null;\n            var imported_names = null;\n            M.specifiers.forEach(function (specifier) {\n                if (specifier.type === \"ImportSpecifier\" || specifier.type === \"ImportNamespaceSpecifier\") {\n                    if (!imported_names) { imported_names = []; }\n                    imported_names.push(from_moz(specifier));\n                } else if (specifier.type === \"ImportDefaultSpecifier\") {\n                    imported_name = from_moz(specifier);\n                }\n            });\n            return new AST_Import({\n                start       : my_start_token(M),\n                end         : my_end_token(M),\n                imported_name: imported_name,\n                imported_names : imported_names,\n                module_name : from_moz(M.source),\n                assert_clause: assert_clause_from_moz(M.assertions)\n            });\n        },\n\n        ImportSpecifier: function(M) {\n            return new AST_NameMapping({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                foreign_name: from_moz(M.imported),\n                name: from_moz(M.local)\n            });\n        },\n\n        ImportDefaultSpecifier: function(M) {\n            return from_moz(M.local);\n        },\n\n        ImportNamespaceSpecifier: function(M) {\n            return new AST_NameMapping({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                foreign_name: new AST_SymbolImportForeign({ name: \"*\" }),\n                name: from_moz(M.local)\n            });\n        },\n\n        ExportAllDeclaration: function(M) {\n            var foreign_name = M.exported == null ? \n                new AST_SymbolExportForeign({ name: \"*\" }) :\n                from_moz(M.exported);\n            return new AST_Export({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                exported_names: [\n                    new AST_NameMapping({\n                        name: new AST_SymbolExportForeign({ name: \"*\" }),\n                        foreign_name: foreign_name\n                    })\n                ],\n                module_name: from_moz(M.source),\n                assert_clause: assert_clause_from_moz(M.assertions)\n            });\n        },\n\n        ExportNamedDeclaration: function(M) {\n            return new AST_Export({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                exported_definition: from_moz(M.declaration),\n                exported_names: M.specifiers && M.specifiers.length ? M.specifiers.map(function (specifier) {\n                    return from_moz(specifier);\n                }) : null,\n                module_name: from_moz(M.source),\n                assert_clause: assert_clause_from_moz(M.assertions)\n            });\n        },\n\n        ExportDefaultDeclaration: function(M) {\n            return new AST_Export({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                exported_value: from_moz(M.declaration),\n                is_default: true\n            });\n        },\n\n        ExportSpecifier: function(M) {\n            return new AST_NameMapping({\n                foreign_name: from_moz(M.exported),\n                name: from_moz(M.local)\n            });\n        },\n\n        Literal: function(M) {\n            var val = M.value, args = {\n                start  : my_start_token(M),\n                end    : my_end_token(M)\n            };\n            var rx = M.regex;\n            if (rx && rx.pattern) {\n                // RegExpLiteral as per ESTree AST spec\n                args.value = {\n                    source: rx.pattern,\n                    flags: rx.flags\n                };\n                return new AST_RegExp(args);\n            } else if (rx) {\n                // support legacy RegExp\n                const rx_source = M.raw || val;\n                const match = rx_source.match(/^\\/(.*)\\/(\\w*)$/);\n                if (!match) throw new Error(\"Invalid regex source \" + rx_source);\n                const [_, source, flags] = match;\n                args.value = { source, flags };\n                return new AST_RegExp(args);\n            }\n            if (val === null) return new AST_Null(args);\n            switch (typeof val) {\n              case \"string\":\n                args.quote = \"\\\"\";\n                var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];\n                if (p.type == \"ImportSpecifier\") {\n                    args.name = val;\n                    return new AST_SymbolImportForeign(args);\n                } else if (p.type == \"ExportSpecifier\") {\n                    args.name = val;\n                    if (M == p.exported) {\n                        return new AST_SymbolExportForeign(args);\n                    } else {\n                        return new AST_SymbolExport(args);\n                    }\n                } else if (p.type == \"ExportAllDeclaration\" && M == p.exported) {\n                    args.name = val;\n                    return new AST_SymbolExportForeign(args);\n                }\n                args.value = val;\n                return new AST_String(args);\n              case \"number\":\n                args.value = val;\n                args.raw = M.raw || val.toString();\n                return new AST_Number(args);\n              case \"boolean\":\n                return new (val ? AST_True : AST_False)(args);\n            }\n        },\n\n        MetaProperty: function(M) {\n            if (M.meta.name === \"new\" && M.property.name === \"target\") {\n                return new AST_NewTarget({\n                    start: my_start_token(M),\n                    end: my_end_token(M)\n                });\n            } else if (M.meta.name === \"import\" && M.property.name === \"meta\") {\n                return new AST_ImportMeta({\n                    start: my_start_token(M),\n                    end: my_end_token(M)\n                });\n            }\n        },\n\n        Identifier: function(M) {\n            var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];\n            return new (  p.type == \"LabeledStatement\" ? AST_Label\n                        : p.type == \"VariableDeclarator\" && p.id === M ? (p.kind == \"const\" ? AST_SymbolConst : p.kind == \"let\" ? AST_SymbolLet : AST_SymbolVar)\n                        : /Import.*Specifier/.test(p.type) ? (p.local === M ? AST_SymbolImport : AST_SymbolImportForeign)\n                        : p.type == \"ExportSpecifier\" ? (p.local === M ? AST_SymbolExport : AST_SymbolExportForeign)\n                        : p.type == \"FunctionExpression\" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)\n                        : p.type == \"FunctionDeclaration\" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)\n                        : p.type == \"ArrowFunctionExpression\" ? (p.params.includes(M)) ? AST_SymbolFunarg : AST_SymbolRef\n                        : p.type == \"ClassExpression\" ? (p.id === M ? AST_SymbolClass : AST_SymbolRef)\n                        : p.type == \"Property\" ? (p.key === M && p.computed || p.value === M ? AST_SymbolRef : AST_SymbolMethod)\n                        : p.type == \"PropertyDefinition\" || p.type === \"FieldDefinition\" ? (p.key === M && p.computed || p.value === M ? AST_SymbolRef : AST_SymbolClassProperty)\n                        : p.type == \"ClassDeclaration\" ? (p.id === M ? AST_SymbolDefClass : AST_SymbolRef)\n                        : p.type == \"MethodDefinition\" ? (p.computed ? AST_SymbolRef : AST_SymbolMethod)\n                        : p.type == \"CatchClause\" ? AST_SymbolCatch\n                        : p.type == \"BreakStatement\" || p.type == \"ContinueStatement\" ? AST_LabelRef\n                        : AST_SymbolRef)({\n                            start : my_start_token(M),\n                            end   : my_end_token(M),\n                            name  : M.name\n                        });\n        },\n\n        BigIntLiteral(M) {\n            return new AST_BigInt({\n                start : my_start_token(M),\n                end   : my_end_token(M),\n                value : M.value\n            });\n        },\n\n        EmptyStatement: function(M) {\n            return new AST_EmptyStatement({\n                start: my_start_token(M),\n                end: my_end_token(M)\n            });\n        },\n\n        BlockStatement: function(M) {\n            return new AST_BlockStatement({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                body: M.body.map(from_moz)\n            });\n        },\n\n        IfStatement: function(M) {\n            return new AST_If({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                condition: from_moz(M.test),\n                body: from_moz(M.consequent),\n                alternative: from_moz(M.alternate)\n            });\n        },\n\n        LabeledStatement: function(M) {\n            return new AST_LabeledStatement({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                label: from_moz(M.label),\n                body: from_moz(M.body)\n            });\n        },\n\n        BreakStatement: function(M) {\n            return new AST_Break({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                label: from_moz(M.label)\n            });\n        },\n\n        ContinueStatement: function(M) {\n            return new AST_Continue({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                label: from_moz(M.label)\n            });\n        },\n\n        WithStatement: function(M) {\n            return new AST_With({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.object),\n                body: from_moz(M.body)\n            });\n        },\n\n        SwitchStatement: function(M) {\n            return new AST_Switch({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.discriminant),\n                body: M.cases.map(from_moz)\n            });\n        },\n\n        ReturnStatement: function(M) {\n            return new AST_Return({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                value: from_moz(M.argument)\n            });\n        },\n\n        ThrowStatement: function(M) {\n            return new AST_Throw({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                value: from_moz(M.argument)\n            });\n        },\n\n        WhileStatement: function(M) {\n            return new AST_While({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                condition: from_moz(M.test),\n                body: from_moz(M.body)\n            });\n        },\n\n        DoWhileStatement: function(M) {\n            return new AST_Do({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                condition: from_moz(M.test),\n                body: from_moz(M.body)\n            });\n        },\n\n        ForStatement: function(M) {\n            return new AST_For({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                init: from_moz(M.init),\n                condition: from_moz(M.test),\n                step: from_moz(M.update),\n                body: from_moz(M.body)\n            });\n        },\n\n        ForInStatement: function(M) {\n            return new AST_ForIn({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                init: from_moz(M.left),\n                object: from_moz(M.right),\n                body: from_moz(M.body)\n            });\n        },\n\n        ForOfStatement: function(M) {\n            return new AST_ForOf({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                init: from_moz(M.left),\n                object: from_moz(M.right),\n                body: from_moz(M.body),\n                await: M.await\n            });\n        },\n\n        AwaitExpression: function(M) {\n            return new AST_Await({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.argument)\n            });\n        },\n\n        YieldExpression: function(M) {\n            return new AST_Yield({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.argument),\n                is_star: M.delegate\n            });\n        },\n\n        DebuggerStatement: function(M) {\n            return new AST_Debugger({\n                start: my_start_token(M),\n                end: my_end_token(M)\n            });\n        },\n\n        VariableDeclarator: function(M) {\n            return new AST_VarDef({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                name: from_moz(M.id),\n                value: from_moz(M.init)\n            });\n        },\n\n        CatchClause: function(M) {\n            return new AST_Catch({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                argname: from_moz(M.param),\n                body: from_moz(M.body).body\n            });\n        },\n\n        ThisExpression: function(M) {\n            return new AST_This({\n                start: my_start_token(M),\n                end: my_end_token(M)\n            });\n        },\n\n        Super: function(M) {\n            return new AST_Super({\n                start: my_start_token(M),\n                end: my_end_token(M)\n            });\n        },\n\n        BinaryExpression: function(M) {\n            if (M.left.type === \"PrivateIdentifier\") {\n                return new AST_PrivateIn({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    key: new AST_SymbolPrivateProperty({\n                        start: my_start_token(M.left),\n                        end: my_end_token(M.left),\n                        name: M.left.name\n                    }),\n                    value: from_moz(M.right),\n                });\n            }\n            return new AST_Binary({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                operator: M.operator,\n                left: from_moz(M.left),\n                right: from_moz(M.right)\n            });\n        },\n\n        LogicalExpression: function(M) {\n            return new AST_Binary({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                operator: M.operator,\n                left: from_moz(M.left),\n                right: from_moz(M.right)\n            });\n        },\n\n        AssignmentExpression: function(M) {\n            return new AST_Assign({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                operator: M.operator,\n                left: from_moz(M.left),\n                right: from_moz(M.right)\n            });\n        },\n\n        ConditionalExpression: function(M) {\n            return new AST_Conditional({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                condition: from_moz(M.test),\n                consequent: from_moz(M.consequent),\n                alternative: from_moz(M.alternate)\n            });\n        },\n\n        NewExpression: function(M) {\n            return new AST_New({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.callee),\n                args: M.arguments.map(from_moz)\n            });\n        },\n\n        CallExpression: function(M) {\n            return new AST_Call({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                expression: from_moz(M.callee),\n                optional: M.optional,\n                args: M.arguments.map(from_moz)\n            });\n        }\n    };\n\n    MOZ_TO_ME.UpdateExpression =\n    MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) {\n        var prefix = \"prefix\" in M ? M.prefix\n            : M.type == \"UnaryExpression\" ? true : false;\n        return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({\n            start      : my_start_token(M),\n            end        : my_end_token(M),\n            operator   : M.operator,\n            expression : from_moz(M.argument)\n        });\n    };\n\n    MOZ_TO_ME.ClassDeclaration =\n    MOZ_TO_ME.ClassExpression = function From_Moz_Class(M) {\n        return new (M.type === \"ClassDeclaration\" ? AST_DefClass : AST_ClassExpression)({\n            start    : my_start_token(M),\n            end      : my_end_token(M),\n            name     : from_moz(M.id),\n            extends  : from_moz(M.superClass),\n            properties: M.body.body.map(from_moz)\n        });\n    };\n\n    def_to_moz(AST_EmptyStatement, function To_Moz_EmptyStatement() {\n        return {\n            type: \"EmptyStatement\"\n        };\n    });\n    def_to_moz(AST_BlockStatement, function To_Moz_BlockStatement(M) {\n        return {\n            type: \"BlockStatement\",\n            body: M.body.map(to_moz)\n        };\n    });\n    def_to_moz(AST_If, function To_Moz_IfStatement(M) {\n        return {\n            type: \"IfStatement\",\n            test: to_moz(M.condition),\n            consequent: to_moz(M.body),\n            alternate: to_moz(M.alternative)\n        };\n    });\n    def_to_moz(AST_LabeledStatement, function To_Moz_LabeledStatement(M) {\n        return {\n            type: \"LabeledStatement\",\n            label: to_moz(M.label),\n            body: to_moz(M.body)\n        };\n    });\n    def_to_moz(AST_Break, function To_Moz_BreakStatement(M) {\n        return {\n            type: \"BreakStatement\",\n            label: to_moz(M.label)\n        };\n    });\n    def_to_moz(AST_Continue, function To_Moz_ContinueStatement(M) {\n        return {\n            type: \"ContinueStatement\",\n            label: to_moz(M.label)\n        };\n    });\n    def_to_moz(AST_With, function To_Moz_WithStatement(M) {\n        return {\n            type: \"WithStatement\",\n            object: to_moz(M.expression),\n            body: to_moz(M.body)\n        };\n    });\n    def_to_moz(AST_Switch, function To_Moz_SwitchStatement(M) {\n        return {\n            type: \"SwitchStatement\",\n            discriminant: to_moz(M.expression),\n            cases: M.body.map(to_moz)\n        };\n    });\n    def_to_moz(AST_Return, function To_Moz_ReturnStatement(M) {\n        return {\n            type: \"ReturnStatement\",\n            argument: to_moz(M.value)\n        };\n    });\n    def_to_moz(AST_Throw, function To_Moz_ThrowStatement(M) {\n        return {\n            type: \"ThrowStatement\",\n            argument: to_moz(M.value)\n        };\n    });\n    def_to_moz(AST_While, function To_Moz_WhileStatement(M) {\n        return {\n            type: \"WhileStatement\",\n            test: to_moz(M.condition),\n            body: to_moz(M.body)\n        };\n    });\n    def_to_moz(AST_Do, function To_Moz_DoWhileStatement(M) {\n        return {\n            type: \"DoWhileStatement\",\n            test: to_moz(M.condition),\n            body: to_moz(M.body)\n        };\n    });\n    def_to_moz(AST_For, function To_Moz_ForStatement(M) {\n        return {\n            type: \"ForStatement\",\n            init: to_moz(M.init),\n            test: to_moz(M.condition),\n            update: to_moz(M.step),\n            body: to_moz(M.body)\n        };\n    });\n    def_to_moz(AST_ForIn, function To_Moz_ForInStatement(M) {\n        return {\n            type: \"ForInStatement\",\n            left: to_moz(M.init),\n            right: to_moz(M.object),\n            body: to_moz(M.body)\n        };\n    });\n    def_to_moz(AST_ForOf, function To_Moz_ForOfStatement(M) {\n        return {\n            type: \"ForOfStatement\",\n            left: to_moz(M.init),\n            right: to_moz(M.object),\n            body: to_moz(M.body),\n            await: M.await\n        };\n    });\n    def_to_moz(AST_Await, function To_Moz_AwaitExpression(M) {\n        return {\n            type: \"AwaitExpression\",\n            argument: to_moz(M.expression)\n        };\n    });\n    def_to_moz(AST_Yield, function To_Moz_YieldExpression(M) {\n        return {\n            type: \"YieldExpression\",\n            argument: to_moz(M.expression),\n            delegate: M.is_star\n        };\n    });\n    def_to_moz(AST_Debugger, function To_Moz_DebuggerStatement() {\n        return {\n            type: \"DebuggerStatement\"\n        };\n    });\n    def_to_moz(AST_VarDef, function To_Moz_VariableDeclarator(M) {\n        return {\n            type: \"VariableDeclarator\",\n            id: to_moz(M.name),\n            init: to_moz(M.value)\n        };\n    });\n    def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {\n        return {\n            type: \"CatchClause\",\n            param: to_moz(M.argname),\n            body: to_moz_block(M)\n        };\n    });\n\n    def_to_moz(AST_This, function To_Moz_ThisExpression() {\n        return {\n            type: \"ThisExpression\"\n        };\n    });\n    def_to_moz(AST_Super, function To_Moz_Super() {\n        return {\n            type: \"Super\"\n        };\n    });\n    def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {\n        return {\n            type: \"BinaryExpression\",\n            operator: M.operator,\n            left: to_moz(M.left),\n            right: to_moz(M.right)\n        };\n    });\n    def_to_moz(AST_Binary, function To_Moz_LogicalExpression(M) {\n        return {\n            type: \"LogicalExpression\",\n            operator: M.operator,\n            left: to_moz(M.left),\n            right: to_moz(M.right)\n        };\n    });\n    def_to_moz(AST_Assign, function To_Moz_AssignmentExpression(M) {\n        return {\n            type: \"AssignmentExpression\",\n            operator: M.operator,\n            left: to_moz(M.left),\n            right: to_moz(M.right)\n        };\n    });\n    def_to_moz(AST_Conditional, function To_Moz_ConditionalExpression(M) {\n        return {\n            type: \"ConditionalExpression\",\n            test: to_moz(M.condition),\n            consequent: to_moz(M.consequent),\n            alternate: to_moz(M.alternative)\n        };\n    });\n    def_to_moz(AST_New, function To_Moz_NewExpression(M) {\n        return {\n            type: \"NewExpression\",\n            callee: to_moz(M.expression),\n            arguments: M.args.map(to_moz)\n        };\n    });\n    def_to_moz(AST_Call, function To_Moz_CallExpression(M) {\n        return {\n            type: \"CallExpression\",\n            callee: to_moz(M.expression),\n            optional: M.optional,\n            arguments: M.args.map(to_moz)\n        };\n    });\n\n    def_to_moz(AST_Toplevel, function To_Moz_Program(M) {\n        return to_moz_scope(\"Program\", M);\n    });\n\n    def_to_moz(AST_Expansion, function To_Moz_Spread(M) {\n        return {\n            type: to_moz_in_destructuring() ? \"RestElement\" : \"SpreadElement\",\n            argument: to_moz(M.expression)\n        };\n    });\n\n    def_to_moz(AST_PrefixedTemplateString, function To_Moz_TaggedTemplateExpression(M) {\n        return {\n            type: \"TaggedTemplateExpression\",\n            tag: to_moz(M.prefix),\n            quasi: to_moz(M.template_string)\n        };\n    });\n\n    def_to_moz(AST_TemplateString, function To_Moz_TemplateLiteral(M) {\n        var quasis = [];\n        var expressions = [];\n        for (var i = 0; i < M.segments.length; i++) {\n            if (i % 2 !== 0) {\n                expressions.push(to_moz(M.segments[i]));\n            } else {\n                quasis.push({\n                    type: \"TemplateElement\",\n                    value: {\n                        raw: M.segments[i].raw,\n                        cooked: M.segments[i].value\n                    },\n                    tail: i === M.segments.length - 1\n                });\n            }\n        }\n        return {\n            type: \"TemplateLiteral\",\n            quasis: quasis,\n            expressions: expressions\n        };\n    });\n\n    def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {\n        return {\n            type: \"FunctionDeclaration\",\n            id: to_moz(M.name),\n            params: M.argnames.map(to_moz),\n            generator: M.is_generator,\n            async: M.async,\n            body: to_moz_scope(\"BlockStatement\", M)\n        };\n    });\n\n    def_to_moz(AST_Function, function To_Moz_FunctionExpression(M, parent) {\n        var is_generator = parent.is_generator !== undefined ?\n            parent.is_generator : M.is_generator;\n        return {\n            type: \"FunctionExpression\",\n            id: to_moz(M.name),\n            params: M.argnames.map(to_moz),\n            generator: is_generator,\n            async: M.async,\n            body: to_moz_scope(\"BlockStatement\", M)\n        };\n    });\n\n    def_to_moz(AST_Arrow, function To_Moz_ArrowFunctionExpression(M) {\n        var body = {\n            type: \"BlockStatement\",\n            body: M.body.map(to_moz)\n        };\n        return {\n            type: \"ArrowFunctionExpression\",\n            params: M.argnames.map(to_moz),\n            async: M.async,\n            body: body\n        };\n    });\n\n    def_to_moz(AST_Destructuring, function To_Moz_ObjectPattern(M) {\n        if (M.is_array) {\n            return {\n                type: \"ArrayPattern\",\n                elements: M.names.map(to_moz)\n            };\n        }\n        return {\n            type: \"ObjectPattern\",\n            properties: M.names.map(to_moz)\n        };\n    });\n\n    def_to_moz(AST_Directive, function To_Moz_Directive(M) {\n        return {\n            type: \"ExpressionStatement\",\n            expression: {\n                type: \"Literal\",\n                value: M.value,\n                raw: M.print_to_string()\n            },\n            directive: M.value\n        };\n    });\n\n    def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) {\n        return {\n            type: \"ExpressionStatement\",\n            expression: to_moz(M.body)\n        };\n    });\n\n    def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) {\n        return {\n            type: \"SwitchCase\",\n            test: to_moz(M.expression),\n            consequent: M.body.map(to_moz)\n        };\n    });\n\n    def_to_moz(AST_Try, function To_Moz_TryStatement(M) {\n        return {\n            type: \"TryStatement\",\n            block: to_moz_block(M.body),\n            handler: to_moz(M.bcatch),\n            guardedHandlers: [],\n            finalizer: to_moz(M.bfinally)\n        };\n    });\n\n    def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {\n        return {\n            type: \"CatchClause\",\n            param: to_moz(M.argname),\n            guard: null,\n            body: to_moz_block(M)\n        };\n    });\n\n    def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {\n        return {\n            type: \"VariableDeclaration\",\n            kind:\n                M instanceof AST_Const ? \"const\" :\n                M instanceof AST_Let ? \"let\" : \"var\",\n            declarations: M.definitions.map(to_moz)\n        };\n    });\n\n    const assert_clause_to_moz = assert_clause => {\n        const assertions = [];\n        if (assert_clause) {\n            for (const { key, value } of assert_clause.properties) {\n                const key_moz = is_basic_identifier_string(key)\n                    ? { type: \"Identifier\", name: key }\n                    : { type: \"Literal\", value: key, raw: JSON.stringify(key) };\n                assertions.push({\n                    type: \"ImportAttribute\",\n                    key: key_moz,\n                    value: to_moz(value)\n                });\n            }\n        }\n        return assertions;\n    };\n\n    def_to_moz(AST_Export, function To_Moz_ExportDeclaration(M) {\n        if (M.exported_names) {\n            var first_exported = M.exported_names[0];\n            var first_exported_name = first_exported.name;\n            if (first_exported_name.name === \"*\" && !first_exported_name.quote) {\n                var foreign_name = first_exported.foreign_name;\n                var exported = foreign_name.name === \"*\" && !foreign_name.quote\n                    ? null\n                    : to_moz(foreign_name);\n                return {\n                    type: \"ExportAllDeclaration\",\n                    source: to_moz(M.module_name),\n                    exported: exported,\n                    assertions: assert_clause_to_moz(M.assert_clause)\n                };\n            }\n            return {\n                type: \"ExportNamedDeclaration\",\n                specifiers: M.exported_names.map(function (name_mapping) {\n                    return {\n                        type: \"ExportSpecifier\",\n                        exported: to_moz(name_mapping.foreign_name),\n                        local: to_moz(name_mapping.name)\n                    };\n                }),\n                declaration: to_moz(M.exported_definition),\n                source: to_moz(M.module_name),\n                assertions: assert_clause_to_moz(M.assert_clause)\n            };\n        }\n        return {\n            type: M.is_default ? \"ExportDefaultDeclaration\" : \"ExportNamedDeclaration\",\n            declaration: to_moz(M.exported_value || M.exported_definition)\n        };\n    });\n\n    def_to_moz(AST_Import, function To_Moz_ImportDeclaration(M) {\n        var specifiers = [];\n        if (M.imported_name) {\n            specifiers.push({\n                type: \"ImportDefaultSpecifier\",\n                local: to_moz(M.imported_name)\n            });\n        }\n        if (M.imported_names) {\n            var first_imported_foreign_name = M.imported_names[0].foreign_name;\n            if (first_imported_foreign_name.name === \"*\" && !first_imported_foreign_name.quote) {\n                specifiers.push({\n                    type: \"ImportNamespaceSpecifier\",\n                    local: to_moz(M.imported_names[0].name)\n                });\n            } else {\n                M.imported_names.forEach(function(name_mapping) {\n                    specifiers.push({\n                        type: \"ImportSpecifier\",\n                        local: to_moz(name_mapping.name),\n                        imported: to_moz(name_mapping.foreign_name)\n                    });\n                });\n            }\n        }\n        return {\n            type: \"ImportDeclaration\",\n            specifiers: specifiers,\n            source: to_moz(M.module_name),\n            assertions: assert_clause_to_moz(M.assert_clause)\n        };\n    });\n\n    def_to_moz(AST_ImportMeta, function To_Moz_MetaProperty() {\n        return {\n            type: \"MetaProperty\",\n            meta: {\n                type: \"Identifier\",\n                name: \"import\"\n            },\n            property: {\n                type: \"Identifier\",\n                name: \"meta\"\n            }\n        };\n    });\n\n    def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {\n        return {\n            type: \"SequenceExpression\",\n            expressions: M.expressions.map(to_moz)\n        };\n    });\n\n    def_to_moz(AST_DotHash, function To_Moz_PrivateMemberExpression(M) {\n        return {\n            type: \"MemberExpression\",\n            object: to_moz(M.expression),\n            computed: false,\n            property: {\n                type: \"PrivateIdentifier\",\n                name: M.property\n            },\n            optional: M.optional\n        };\n    });\n\n    def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) {\n        var isComputed = M instanceof AST_Sub;\n        return {\n            type: \"MemberExpression\",\n            object: to_moz(M.expression),\n            computed: isComputed,\n            property: isComputed ? to_moz(M.property) : {type: \"Identifier\", name: M.property},\n            optional: M.optional\n        };\n    });\n\n    def_to_moz(AST_Chain, function To_Moz_ChainExpression(M) {\n        return {\n            type: \"ChainExpression\",\n            expression: to_moz(M.expression)\n        };\n    });\n\n    def_to_moz(AST_Unary, function To_Moz_Unary(M) {\n        return {\n            type: M.operator == \"++\" || M.operator == \"--\" ? \"UpdateExpression\" : \"UnaryExpression\",\n            operator: M.operator,\n            prefix: M instanceof AST_UnaryPrefix,\n            argument: to_moz(M.expression)\n        };\n    });\n\n    def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {\n        if (M.operator == \"=\" && to_moz_in_destructuring()) {\n            return {\n                type: \"AssignmentPattern\",\n                left: to_moz(M.left),\n                right: to_moz(M.right)\n            };\n        }\n\n        const type = M.operator == \"&&\" || M.operator == \"||\" || M.operator === \"??\"\n            ? \"LogicalExpression\"\n            : \"BinaryExpression\";\n\n        return {\n            type,\n            left: to_moz(M.left),\n            operator: M.operator,\n            right: to_moz(M.right)\n        };\n    });\n\n    def_to_moz(AST_PrivateIn, function To_Moz_BinaryExpression_PrivateIn(M) {\n        return {\n            type: \"BinaryExpression\",\n            left: { type: \"PrivateIdentifier\", name: M.key.name },\n            operator: \"in\",\n            right: to_moz(M.value),\n        };\n    });\n\n    def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) {\n        return {\n            type: \"ArrayExpression\",\n            elements: M.elements.map(to_moz)\n        };\n    });\n\n    def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {\n        return {\n            type: \"ObjectExpression\",\n            properties: M.properties.map(to_moz)\n        };\n    });\n\n    def_to_moz(AST_ObjectProperty, function To_Moz_Property(M, parent) {\n        var key = M.key instanceof AST_Node ? to_moz(M.key) : {\n            type: \"Identifier\",\n            value: M.key\n        };\n        if (typeof M.key === \"number\") {\n            key = {\n                type: \"Literal\",\n                value: Number(M.key)\n            };\n        }\n        if (typeof M.key === \"string\") {\n            key = {\n                type: \"Identifier\",\n                name: M.key\n            };\n        }\n        var kind;\n        var string_or_num = typeof M.key === \"string\" || typeof M.key === \"number\";\n        var computed = string_or_num ? false : !(M.key instanceof AST_Symbol) || M.key instanceof AST_SymbolRef;\n        if (M instanceof AST_ObjectKeyVal) {\n            kind = \"init\";\n            computed = !string_or_num;\n        } else\n        if (M instanceof AST_ObjectGetter) {\n            kind = \"get\";\n        } else\n        if (M instanceof AST_ObjectSetter) {\n            kind = \"set\";\n        }\n        if (M instanceof AST_PrivateGetter || M instanceof AST_PrivateSetter) {\n            const kind = M instanceof AST_PrivateGetter ? \"get\" : \"set\";\n            return {\n                type: \"MethodDefinition\",\n                computed: false,\n                kind: kind,\n                static: M.static,\n                key: {\n                    type: \"PrivateIdentifier\",\n                    name: M.key.name\n                },\n                value: to_moz(M.value)\n            };\n        }\n        if (M instanceof AST_ClassPrivateProperty) {\n            return {\n                type: \"PropertyDefinition\",\n                key: {\n                    type: \"PrivateIdentifier\",\n                    name: M.key.name\n                },\n                value: to_moz(M.value),\n                computed: false,\n                static: M.static\n            };\n        }\n        if (M instanceof AST_ClassProperty) {\n            return {\n                type: \"PropertyDefinition\",\n                key,\n                value: to_moz(M.value),\n                computed,\n                static: M.static\n            };\n        }\n        if (parent instanceof AST_Class) {\n            return {\n                type: \"MethodDefinition\",\n                computed: computed,\n                kind: kind,\n                static: M.static,\n                key: to_moz(M.key),\n                value: to_moz(M.value)\n            };\n        }\n        return {\n            type: \"Property\",\n            computed: computed,\n            kind: kind,\n            key: key,\n            value: to_moz(M.value)\n        };\n    });\n\n    def_to_moz(AST_ConciseMethod, function To_Moz_MethodDefinition(M, parent) {\n        if (parent instanceof AST_Object) {\n            return {\n                type: \"Property\",\n                computed: !(M.key instanceof AST_Symbol) || M.key instanceof AST_SymbolRef,\n                kind: \"init\",\n                method: true,\n                shorthand: false,\n                key: to_moz(M.key),\n                value: to_moz(M.value)\n            };\n        }\n\n        const key = M instanceof AST_PrivateMethod\n            ? {\n                type: \"PrivateIdentifier\",\n                name: M.key.name\n            }\n            : to_moz(M.key);\n\n        return {\n            type: \"MethodDefinition\",\n            kind: M.key === \"constructor\" ? \"constructor\" : \"method\",\n            key,\n            value: to_moz(M.value),\n            computed: !(M.key instanceof AST_Symbol) || M.key instanceof AST_SymbolRef,\n            static: M.static,\n        };\n    });\n\n    def_to_moz(AST_Class, function To_Moz_Class(M) {\n        var type = M instanceof AST_ClassExpression ? \"ClassExpression\" : \"ClassDeclaration\";\n        return {\n            type: type,\n            superClass: to_moz(M.extends),\n            id: M.name ? to_moz(M.name) : null,\n            body: {\n                type: \"ClassBody\",\n                body: M.properties.map(to_moz)\n            }\n        };\n    });\n\n    def_to_moz(AST_ClassStaticBlock, function To_Moz_StaticBlock(M) {\n        return {\n            type: \"StaticBlock\",\n            body: M.body.map(to_moz),\n        };\n    });\n\n    def_to_moz(AST_NewTarget, function To_Moz_MetaProperty() {\n        return {\n            type: \"MetaProperty\",\n            meta: {\n                type: \"Identifier\",\n                name: \"new\"\n            },\n            property: {\n                type: \"Identifier\",\n                name: \"target\"\n            }\n        };\n    });\n\n    def_to_moz(AST_Symbol, function To_Moz_Identifier(M, parent) {\n        if (\n            (M instanceof AST_SymbolMethod && parent.quote) ||\n            ((\n                M instanceof AST_SymbolImportForeign ||\n                M instanceof AST_SymbolExportForeign ||\n                M instanceof AST_SymbolExport\n                ) && M.quote)\n         ) {\n            return {\n                type: \"Literal\",\n                value: M.name\n            };\n        }\n        var def = M.definition();\n        return {\n            type: \"Identifier\",\n            name: def ? def.mangled_name || def.name : M.name\n        };\n    });\n\n    def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {\n        const pattern = M.value.source;\n        const flags = M.value.flags;\n        return {\n            type: \"Literal\",\n            value: null,\n            raw: M.print_to_string(),\n            regex: { pattern, flags }\n        };\n    });\n\n    def_to_moz(AST_Constant, function To_Moz_Literal(M) {\n        var value = M.value;\n        return {\n            type: \"Literal\",\n            value: value,\n            raw: M.raw || M.print_to_string()\n        };\n    });\n\n    def_to_moz(AST_Atom, function To_Moz_Atom(M) {\n        return {\n            type: \"Identifier\",\n            name: String(M.value)\n        };\n    });\n\n    def_to_moz(AST_BigInt, M => ({\n        type: \"BigIntLiteral\",\n        value: M.value\n    }));\n\n    AST_Boolean.DEFMETHOD(\"to_mozilla_ast\", AST_Constant.prototype.to_mozilla_ast);\n    AST_Null.DEFMETHOD(\"to_mozilla_ast\", AST_Constant.prototype.to_mozilla_ast);\n    AST_Hole.DEFMETHOD(\"to_mozilla_ast\", function To_Moz_ArrayHole() { return null; });\n\n    AST_Block.DEFMETHOD(\"to_mozilla_ast\", AST_BlockStatement.prototype.to_mozilla_ast);\n    AST_Lambda.DEFMETHOD(\"to_mozilla_ast\", AST_Function.prototype.to_mozilla_ast);\n\n    /* -----[ tools ]----- */\n\n    function my_start_token(moznode) {\n        var loc = moznode.loc, start = loc && loc.start;\n        var range = moznode.range;\n        return new AST_Token(\n            \"\",\n            \"\",\n            start && start.line || 0,\n            start && start.column || 0,\n            range ? range [0] : moznode.start,\n            false,\n            [],\n            [],\n            loc && loc.source,\n        );\n    }\n\n    function my_end_token(moznode) {\n        var loc = moznode.loc, end = loc && loc.end;\n        var range = moznode.range;\n        return new AST_Token(\n            \"\",\n            \"\",\n            end && end.line || 0,\n            end && end.column || 0,\n            range ? range [0] : moznode.end,\n            false,\n            [],\n            [],\n            loc && loc.source,\n        );\n    }\n\n    var FROM_MOZ_STACK = null;\n\n    function from_moz(node) {\n        FROM_MOZ_STACK.push(node);\n        var ret = node != null ? MOZ_TO_ME[node.type](node) : null;\n        FROM_MOZ_STACK.pop();\n        return ret;\n    }\n\n    AST_Node.from_mozilla_ast = function(node) {\n        var save_stack = FROM_MOZ_STACK;\n        FROM_MOZ_STACK = [];\n        var ast = from_moz(node);\n        FROM_MOZ_STACK = save_stack;\n        return ast;\n    };\n\n    function set_moz_loc(mynode, moznode) {\n        var start = mynode.start;\n        var end = mynode.end;\n        if (!(start && end)) {\n            return moznode;\n        }\n        if (start.pos != null && end.endpos != null) {\n            moznode.range = [start.pos, end.endpos];\n        }\n        if (start.line) {\n            moznode.loc = {\n                start: {line: start.line, column: start.col},\n                end: end.endline ? {line: end.endline, column: end.endcol} : null\n            };\n            if (start.file) {\n                moznode.loc.source = start.file;\n            }\n        }\n        return moznode;\n    }\n\n    function def_to_moz(mytype, handler) {\n        mytype.DEFMETHOD(\"to_mozilla_ast\", function(parent) {\n            return set_moz_loc(this, handler(this, parent));\n        });\n    }\n\n    var TO_MOZ_STACK = null;\n\n    function to_moz(node) {\n        if (TO_MOZ_STACK === null) { TO_MOZ_STACK = []; }\n        TO_MOZ_STACK.push(node);\n        var ast = node != null ? node.to_mozilla_ast(TO_MOZ_STACK[TO_MOZ_STACK.length - 2]) : null;\n        TO_MOZ_STACK.pop();\n        if (TO_MOZ_STACK.length === 0) { TO_MOZ_STACK = null; }\n        return ast;\n    }\n\n    function to_moz_in_destructuring() {\n        var i = TO_MOZ_STACK.length;\n        while (i--) {\n            if (TO_MOZ_STACK[i] instanceof AST_Destructuring) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    function to_moz_block(node) {\n        return {\n            type: \"BlockStatement\",\n            body: node.body.map(to_moz)\n        };\n    }\n\n    function to_moz_scope(type, node) {\n        var body = node.body.map(to_moz);\n        if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {\n            body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));\n        }\n        return {\n            type: type,\n            body: body\n        };\n    }\n})();\n"
  },
  {
    "path": "templates/bin/node/terser/lib/output.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n\nimport {\n    defaults,\n    makePredicate,\n    noop,\n    regexp_source_fix,\n    sort_regexp_flags,\n    return_false,\n    return_true,\n} from \"./utils/index.js\";\nimport { first_in_statement, left_is_object } from \"./utils/first_in_statement.js\";\nimport {\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_Await,\n    AST_BigInt,\n    AST_Binary,\n    AST_BlockStatement,\n    AST_Break,\n    AST_Call,\n    AST_Case,\n    AST_Catch,\n    AST_Chain,\n    AST_Class,\n    AST_ClassExpression,\n    AST_ClassPrivateProperty,\n    AST_ClassProperty,\n    AST_ClassStaticBlock,\n    AST_ConciseMethod,\n    AST_PrivateGetter,\n    AST_PrivateMethod,\n    AST_SymbolPrivateProperty,\n    AST_PrivateSetter,\n    AST_PrivateIn,\n    AST_Conditional,\n    AST_Const,\n    AST_Constant,\n    AST_Continue,\n    AST_Debugger,\n    AST_Default,\n    AST_DefaultAssign,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DotHash,\n    AST_EmptyStatement,\n    AST_Exit,\n    AST_Expansion,\n    AST_Export,\n    AST_Finally,\n    AST_For,\n    AST_ForIn,\n    AST_ForOf,\n    AST_Function,\n    AST_Hole,\n    AST_If,\n    AST_Import,\n    AST_ImportMeta,\n    AST_Jump,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_Let,\n    AST_LoopControl,\n    AST_NameMapping,\n    AST_New,\n    AST_NewTarget,\n    AST_Node,\n    AST_Number,\n    AST_Object,\n    AST_ObjectGetter,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_ObjectSetter,\n    AST_PrefixedTemplateString,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Return,\n    AST_Scope,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Statement,\n    AST_StatementWithBody,\n    AST_String,\n    AST_Sub,\n    AST_Super,\n    AST_Switch,\n    AST_SwitchBranch,\n    AST_Symbol,\n    AST_SymbolClassProperty,\n    AST_SymbolMethod,\n    AST_SymbolRef,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_This,\n    AST_Throw,\n    AST_Toplevel,\n    AST_Try,\n    AST_TryBlock,\n    AST_Unary,\n    AST_UnaryPostfix,\n    AST_UnaryPrefix,\n    AST_Var,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n    TreeWalker,\n    walk,\n    walk_abort\n} from \"./ast.js\";\nimport {\n    get_full_char_code,\n    get_full_char,\n    is_identifier_char,\n    is_basic_identifier_string,\n    is_identifier_string,\n    PRECEDENCE,\n    ALL_RESERVED_WORDS,\n} from \"./parse.js\";\n\nconst EXPECT_DIRECTIVE = /^$|[;{][\\s\\n]*$/;\nconst CODE_LINE_BREAK = 10;\nconst CODE_SPACE = 32;\n\nconst r_annotation = /[@#]__(PURE|INLINE|NOINLINE)__/g;\n\nfunction is_some_comments(comment) {\n    // multiline comment\n    return (\n        (comment.type === \"comment2\" || comment.type === \"comment1\")\n        && /@preserve|@copyright|@lic|@cc_on|^\\**!/i.test(comment.value)\n    );\n}\n\nclass Rope {\n    constructor() {\n        this.committed = \"\";\n        this.current = \"\";\n    }\n\n    append(str) {\n        this.current += str;\n    }\n\n    insertAt(char, index) {\n        const { committed, current } = this;\n        if (index < committed.length) {\n            this.committed = committed.slice(0, index) + char + committed.slice(index);\n        } else if (index === committed.length) {\n            this.committed += char;\n        } else {\n            index -= committed.length;\n            this.committed += current.slice(0, index) + char;\n            this.current = current.slice(index);\n        }\n    }\n\n    charAt(index) {\n        const { committed } = this;\n        if (index < committed.length) return committed[index];\n        return this.current[index - committed.length];\n    }\n\n    curLength() {\n        return this.current.length;\n    }\n\n    length() {\n        return this.committed.length + this.current.length;\n    }\n\n    toString() {\n        return this.committed + this.current;\n    }\n}\n\nfunction OutputStream(options) {\n\n    var readonly = !options;\n    options = defaults(options, {\n        ascii_only           : false,\n        beautify             : false,\n        braces               : false,\n        comments             : \"some\",\n        ecma                 : 5,\n        ie8                  : false,\n        indent_level         : 4,\n        indent_start         : 0,\n        inline_script        : true,\n        keep_numbers         : false,\n        keep_quoted_props    : false,\n        max_line_len         : false,\n        preamble             : null,\n        preserve_annotations : false,\n        quote_keys           : false,\n        quote_style          : 0,\n        safari10             : false,\n        semicolons           : true,\n        shebang              : true,\n        shorthand            : undefined,\n        source_map           : null,\n        webkit               : false,\n        width                : 80,\n        wrap_iife            : false,\n        wrap_func_args       : true,\n\n        _destroy_ast         : false\n    }, true);\n\n    if (options.shorthand === undefined)\n        options.shorthand = options.ecma > 5;\n\n    // Convert comment option to RegExp if necessary and set up comments filter\n    var comment_filter = return_false; // Default case, throw all comments away\n    if (options.comments) {\n        let comments = options.comments;\n        if (typeof options.comments === \"string\" && /^\\/.*\\/[a-zA-Z]*$/.test(options.comments)) {\n            var regex_pos = options.comments.lastIndexOf(\"/\");\n            comments = new RegExp(\n                options.comments.substr(1, regex_pos - 1),\n                options.comments.substr(regex_pos + 1)\n            );\n        }\n        if (comments instanceof RegExp) {\n            comment_filter = function(comment) {\n                return comment.type != \"comment5\" && comments.test(comment.value);\n            };\n        } else if (typeof comments === \"function\") {\n            comment_filter = function(comment) {\n                return comment.type != \"comment5\" && comments(this, comment);\n            };\n        } else if (comments === \"some\") {\n            comment_filter = is_some_comments;\n        } else { // NOTE includes \"all\" option\n            comment_filter = return_true;\n        }\n    }\n\n    var indentation = 0;\n    var current_col = 0;\n    var current_line = 1;\n    var current_pos = 0;\n    var OUTPUT = new Rope();\n    let printed_comments = new Set();\n\n    var to_utf8 = options.ascii_only ? function(str, identifier = false, regexp = false) {\n        if (options.ecma >= 2015 && !options.safari10 && !regexp) {\n            str = str.replace(/[\\ud800-\\udbff][\\udc00-\\udfff]/g, function(ch) {\n                var code = get_full_char_code(ch, 0).toString(16);\n                return \"\\\\u{\" + code + \"}\";\n            });\n        }\n        return str.replace(/[\\u0000-\\u001f\\u007f-\\uffff]/g, function(ch) {\n            var code = ch.charCodeAt(0).toString(16);\n            if (code.length <= 2 && !identifier) {\n                while (code.length < 2) code = \"0\" + code;\n                return \"\\\\x\" + code;\n            } else {\n                while (code.length < 4) code = \"0\" + code;\n                return \"\\\\u\" + code;\n            }\n        });\n    } : function(str) {\n        return str.replace(/[\\ud800-\\udbff][\\udc00-\\udfff]|([\\ud800-\\udbff]|[\\udc00-\\udfff])/g, function(match, lone) {\n            if (lone) {\n                return \"\\\\u\" + lone.charCodeAt(0).toString(16);\n            }\n            return match;\n        });\n    };\n\n    function make_string(str, quote) {\n        var dq = 0, sq = 0;\n        str = str.replace(/[\\\\\\b\\f\\n\\r\\v\\t\\x22\\x27\\u2028\\u2029\\0\\ufeff]/g,\n          function(s, i) {\n            switch (s) {\n              case '\"': ++dq; return '\"';\n              case \"'\": ++sq; return \"'\";\n              case \"\\\\\": return \"\\\\\\\\\";\n              case \"\\n\": return \"\\\\n\";\n              case \"\\r\": return \"\\\\r\";\n              case \"\\t\": return \"\\\\t\";\n              case \"\\b\": return \"\\\\b\";\n              case \"\\f\": return \"\\\\f\";\n              case \"\\x0B\": return options.ie8 ? \"\\\\x0B\" : \"\\\\v\";\n              case \"\\u2028\": return \"\\\\u2028\";\n              case \"\\u2029\": return \"\\\\u2029\";\n              case \"\\ufeff\": return \"\\\\ufeff\";\n              case \"\\0\":\n                  return /[0-9]/.test(get_full_char(str, i+1)) ? \"\\\\x00\" : \"\\\\0\";\n            }\n            return s;\n        });\n        function quote_single() {\n            return \"'\" + str.replace(/\\x27/g, \"\\\\'\") + \"'\";\n        }\n        function quote_double() {\n            return '\"' + str.replace(/\\x22/g, '\\\\\"') + '\"';\n        }\n        function quote_template() {\n            return \"`\" + str.replace(/`/g, \"\\\\`\") + \"`\";\n        }\n        str = to_utf8(str);\n        if (quote === \"`\") return quote_template();\n        switch (options.quote_style) {\n          case 1:\n            return quote_single();\n          case 2:\n            return quote_double();\n          case 3:\n            return quote == \"'\" ? quote_single() : quote_double();\n          default:\n            return dq > sq ? quote_single() : quote_double();\n        }\n    }\n\n    function encode_string(str, quote) {\n        var ret = make_string(str, quote);\n        if (options.inline_script) {\n            ret = ret.replace(/<\\x2f(script)([>\\/\\t\\n\\f\\r ])/gi, \"<\\\\/$1$2\");\n            ret = ret.replace(/\\x3c!--/g, \"\\\\x3c!--\");\n            ret = ret.replace(/--\\x3e/g, \"--\\\\x3e\");\n        }\n        return ret;\n    }\n\n    function make_name(name) {\n        name = name.toString();\n        name = to_utf8(name, true);\n        return name;\n    }\n\n    function make_indent(back) {\n        return \" \".repeat(options.indent_start + indentation - back * options.indent_level);\n    }\n\n    /* -----[ beautification/minification ]----- */\n\n    var has_parens = false;\n    var might_need_space = false;\n    var might_need_semicolon = false;\n    var might_add_newline = 0;\n    var need_newline_indented = false;\n    var need_space = false;\n    var newline_insert = -1;\n    var last = \"\";\n    var mapping_token, mapping_name, mappings = options.source_map && [];\n\n    var do_add_mapping = mappings ? function() {\n        mappings.forEach(function(mapping) {\n            try {\n                let { name, token } = mapping;\n                if (token.type == \"name\" || token.type === \"privatename\") {\n                    name = token.value;\n                } else if (name instanceof AST_Symbol) {\n                    name = token.type === \"string\" ? token.value : name.name;\n                }\n                options.source_map.add(\n                    mapping.token.file,\n                    mapping.line, mapping.col,\n                    mapping.token.line, mapping.token.col,\n                    is_basic_identifier_string(name) ? name : undefined\n                );\n            } catch(ex) {\n                // Ignore bad mapping\n            }\n        });\n        mappings = [];\n    } : noop;\n\n    var ensure_line_len = options.max_line_len ? function() {\n        if (current_col > options.max_line_len) {\n            if (might_add_newline) {\n                OUTPUT.insertAt(\"\\n\", might_add_newline);\n                const curLength = OUTPUT.curLength();\n                if (mappings) {\n                    var delta = curLength - current_col;\n                    mappings.forEach(function(mapping) {\n                        mapping.line++;\n                        mapping.col += delta;\n                    });\n                }\n                current_line++;\n                current_pos++;\n                current_col = curLength;\n            }\n        }\n        if (might_add_newline) {\n            might_add_newline = 0;\n            do_add_mapping();\n        }\n    } : noop;\n\n    var requireSemicolonChars = makePredicate(\"( [ + * / - , . `\");\n\n    function print(str) {\n        str = String(str);\n        var ch = get_full_char(str, 0);\n        if (need_newline_indented && ch) {\n            need_newline_indented = false;\n            if (ch !== \"\\n\") {\n                print(\"\\n\");\n                indent();\n            }\n        }\n        if (need_space && ch) {\n            need_space = false;\n            if (!/[\\s;})]/.test(ch)) {\n                space();\n            }\n        }\n        newline_insert = -1;\n        var prev = last.charAt(last.length - 1);\n        if (might_need_semicolon) {\n            might_need_semicolon = false;\n\n            if (prev === \":\" && ch === \"}\" || (!ch || !\";}\".includes(ch)) && prev !== \";\") {\n                if (options.semicolons || requireSemicolonChars.has(ch)) {\n                    OUTPUT.append(\";\");\n                    current_col++;\n                    current_pos++;\n                } else {\n                    ensure_line_len();\n                    if (current_col > 0) {\n                        OUTPUT.append(\"\\n\");\n                        current_pos++;\n                        current_line++;\n                        current_col = 0;\n                    }\n\n                    if (/^\\s+$/.test(str)) {\n                        // reset the semicolon flag, since we didn't print one\n                        // now and might still have to later\n                        might_need_semicolon = true;\n                    }\n                }\n\n                if (!options.beautify)\n                    might_need_space = false;\n            }\n        }\n\n        if (might_need_space) {\n            if ((is_identifier_char(prev)\n                    && (is_identifier_char(ch) || ch == \"\\\\\"))\n                || (ch == \"/\" && ch == prev)\n                || ((ch == \"+\" || ch == \"-\") && ch == last)\n            ) {\n                OUTPUT.append(\" \");\n                current_col++;\n                current_pos++;\n            }\n            might_need_space = false;\n        }\n\n        if (mapping_token) {\n            mappings.push({\n                token: mapping_token,\n                name: mapping_name,\n                line: current_line,\n                col: current_col\n            });\n            mapping_token = false;\n            if (!might_add_newline) do_add_mapping();\n        }\n\n        OUTPUT.append(str);\n        has_parens = str[str.length - 1] == \"(\";\n        current_pos += str.length;\n        var a = str.split(/\\r?\\n/), n = a.length - 1;\n        current_line += n;\n        current_col += a[0].length;\n        if (n > 0) {\n            ensure_line_len();\n            current_col = a[n].length;\n        }\n        last = str;\n    }\n\n    var star = function() {\n        print(\"*\");\n    };\n\n    var space = options.beautify ? function() {\n        print(\" \");\n    } : function() {\n        might_need_space = true;\n    };\n\n    var indent = options.beautify ? function(half) {\n        if (options.beautify) {\n            print(make_indent(half ? 0.5 : 0));\n        }\n    } : noop;\n\n    var with_indent = options.beautify ? function(col, cont) {\n        if (col === true) col = next_indent();\n        var save_indentation = indentation;\n        indentation = col;\n        var ret = cont();\n        indentation = save_indentation;\n        return ret;\n    } : function(col, cont) { return cont(); };\n\n    var newline = options.beautify ? function() {\n        if (newline_insert < 0) return print(\"\\n\");\n        if (OUTPUT.charAt(newline_insert) != \"\\n\") {\n            OUTPUT.insertAt(\"\\n\", newline_insert);\n            current_pos++;\n            current_line++;\n        }\n        newline_insert++;\n    } : options.max_line_len ? function() {\n        ensure_line_len();\n        might_add_newline = OUTPUT.length();\n    } : noop;\n\n    var semicolon = options.beautify ? function() {\n        print(\";\");\n    } : function() {\n        might_need_semicolon = true;\n    };\n\n    function force_semicolon() {\n        might_need_semicolon = false;\n        print(\";\");\n    }\n\n    function next_indent() {\n        return indentation + options.indent_level;\n    }\n\n    function with_block(cont) {\n        var ret;\n        print(\"{\");\n        newline();\n        with_indent(next_indent(), function() {\n            ret = cont();\n        });\n        indent();\n        print(\"}\");\n        return ret;\n    }\n\n    function with_parens(cont) {\n        print(\"(\");\n        //XXX: still nice to have that for argument lists\n        //var ret = with_indent(current_col, cont);\n        var ret = cont();\n        print(\")\");\n        return ret;\n    }\n\n    function with_square(cont) {\n        print(\"[\");\n        //var ret = with_indent(current_col, cont);\n        var ret = cont();\n        print(\"]\");\n        return ret;\n    }\n\n    function comma() {\n        print(\",\");\n        space();\n    }\n\n    function colon() {\n        print(\":\");\n        space();\n    }\n\n    var add_mapping = mappings ? function(token, name) {\n        mapping_token = token;\n        mapping_name = name;\n    } : noop;\n\n    function get() {\n        if (might_add_newline) {\n            ensure_line_len();\n        }\n        return OUTPUT.toString();\n    }\n\n    function has_nlb() {\n        const output = OUTPUT.toString();\n        let n = output.length - 1;\n        while (n >= 0) {\n            const code = output.charCodeAt(n);\n            if (code === CODE_LINE_BREAK) {\n                return true;\n            }\n\n            if (code !== CODE_SPACE) {\n                return false;\n            }\n            n--;\n        }\n        return true;\n    }\n\n    function filter_comment(comment) {\n        if (!options.preserve_annotations) {\n            comment = comment.replace(r_annotation, \" \");\n        }\n        if (/^\\s*$/.test(comment)) {\n            return \"\";\n        }\n        return comment.replace(/(<\\s*\\/\\s*)(script)/i, \"<\\\\/$2\");\n    }\n\n    function prepend_comments(node) {\n        var self = this;\n        var start = node.start;\n        if (!start) return;\n        var printed_comments = self.printed_comments;\n\n        // There cannot be a newline between return/yield and its value.\n        const keyword_with_value = \n            node instanceof AST_Exit && node.value\n            || (node instanceof AST_Await || node instanceof AST_Yield)\n                && node.expression;\n\n        if (\n            start.comments_before\n            && printed_comments.has(start.comments_before)\n        ) {\n            if (keyword_with_value) {\n                start.comments_before = [];\n            } else {\n                return;\n            }\n        }\n\n        var comments = start.comments_before;\n        if (!comments) {\n            comments = start.comments_before = [];\n        }\n        printed_comments.add(comments);\n\n        if (keyword_with_value) {\n            var tw = new TreeWalker(function(node) {\n                var parent = tw.parent();\n                if (parent instanceof AST_Exit\n                    || parent instanceof AST_Await\n                    || parent instanceof AST_Yield\n                    || parent instanceof AST_Binary && parent.left === node\n                    || parent.TYPE == \"Call\" && parent.expression === node\n                    || parent instanceof AST_Conditional && parent.condition === node\n                    || parent instanceof AST_Dot && parent.expression === node\n                    || parent instanceof AST_Sequence && parent.expressions[0] === node\n                    || parent instanceof AST_Sub && parent.expression === node\n                    || parent instanceof AST_UnaryPostfix) {\n                    if (!node.start) return;\n                    var text = node.start.comments_before;\n                    if (text && !printed_comments.has(text)) {\n                        printed_comments.add(text);\n                        comments = comments.concat(text);\n                    }\n                } else {\n                    return true;\n                }\n            });\n            tw.push(node);\n            keyword_with_value.walk(tw);\n        }\n\n        if (current_pos == 0) {\n            if (comments.length > 0 && options.shebang && comments[0].type === \"comment5\"\n                && !printed_comments.has(comments[0])) {\n                print(\"#!\" + comments.shift().value + \"\\n\");\n                indent();\n            }\n            var preamble = options.preamble;\n            if (preamble) {\n                print(preamble.replace(/\\r\\n?|[\\n\\u2028\\u2029]|\\s*$/g, \"\\n\"));\n            }\n        }\n\n        comments = comments.filter(comment_filter, node).filter(c => !printed_comments.has(c));\n        if (comments.length == 0) return;\n        var last_nlb = has_nlb();\n        comments.forEach(function(c, i) {\n            printed_comments.add(c);\n            if (!last_nlb) {\n                if (c.nlb) {\n                    print(\"\\n\");\n                    indent();\n                    last_nlb = true;\n                } else if (i > 0) {\n                    space();\n                }\n            }\n\n            if (/comment[134]/.test(c.type)) {\n                var value = filter_comment(c.value);\n                if (value) {\n                    print(\"//\" + value + \"\\n\");\n                    indent();\n                }\n                last_nlb = true;\n            } else if (c.type == \"comment2\") {\n                var value = filter_comment(c.value);\n                if (value) {\n                    print(\"/*\" + value + \"*/\");\n                }\n                last_nlb = false;\n            }\n        });\n        if (!last_nlb) {\n            if (start.nlb) {\n                print(\"\\n\");\n                indent();\n            } else {\n                space();\n            }\n        }\n    }\n\n    function append_comments(node, tail) {\n        var self = this;\n        var token = node.end;\n        if (!token) return;\n        var printed_comments = self.printed_comments;\n        var comments = token[tail ? \"comments_before\" : \"comments_after\"];\n        if (!comments || printed_comments.has(comments)) return;\n        if (!(node instanceof AST_Statement || comments.every((c) =>\n            !/comment[134]/.test(c.type)\n        ))) return;\n        printed_comments.add(comments);\n        var insert = OUTPUT.length();\n        comments.filter(comment_filter, node).forEach(function(c, i) {\n            if (printed_comments.has(c)) return;\n            printed_comments.add(c);\n            need_space = false;\n            if (need_newline_indented) {\n                print(\"\\n\");\n                indent();\n                need_newline_indented = false;\n            } else if (c.nlb && (i > 0 || !has_nlb())) {\n                print(\"\\n\");\n                indent();\n            } else if (i > 0 || !tail) {\n                space();\n            }\n            if (/comment[134]/.test(c.type)) {\n                const value = filter_comment(c.value);\n                if (value) {\n                    print(\"//\" + value);\n                }\n                need_newline_indented = true;\n            } else if (c.type == \"comment2\") {\n                const value = filter_comment(c.value);\n                if (value) {\n                    print(\"/*\" + value + \"*/\");\n                }\n                need_space = true;\n            }\n        });\n        if (OUTPUT.length() > insert) newline_insert = insert;\n    }\n\n    /**\n     * When output.option(\"_destroy_ast\") is enabled, destroy the function.\n     * Call this after printing it.\n     */\n    const gc_scope =\n      options[\"_destroy_ast\"]\n        ? function gc_scope(scope) {\n            scope.body.length = 0;\n            scope.argnames.length = 0;\n        }\n        : noop;\n\n    var stack = [];\n    return {\n        get             : get,\n        toString        : get,\n        indent          : indent,\n        in_directive    : false,\n        use_asm         : null,\n        active_scope    : null,\n        indentation     : function() { return indentation; },\n        current_width   : function() { return current_col - indentation; },\n        should_break    : function() { return options.width && this.current_width() >= options.width; },\n        has_parens      : function() { return has_parens; },\n        newline         : newline,\n        print           : print,\n        star            : star,\n        space           : space,\n        comma           : comma,\n        colon           : colon,\n        last            : function() { return last; },\n        semicolon       : semicolon,\n        force_semicolon : force_semicolon,\n        to_utf8         : to_utf8,\n        print_name      : function(name) { print(make_name(name)); },\n        print_string    : function(str, quote, escape_directive) {\n            var encoded = encode_string(str, quote);\n            if (escape_directive === true && !encoded.includes(\"\\\\\")) {\n                // Insert semicolons to break directive prologue\n                if (!EXPECT_DIRECTIVE.test(OUTPUT.toString())) {\n                    force_semicolon();\n                }\n                force_semicolon();\n            }\n            print(encoded);\n        },\n        print_template_string_chars: function(str) {\n            var encoded = encode_string(str, \"`\").replace(/\\${/g, \"\\\\${\");\n            return print(encoded.substr(1, encoded.length - 2));\n        },\n        encode_string   : encode_string,\n        next_indent     : next_indent,\n        with_indent     : with_indent,\n        with_block      : with_block,\n        with_parens     : with_parens,\n        with_square     : with_square,\n        add_mapping     : add_mapping,\n        option          : function(opt) { return options[opt]; },\n        gc_scope,\n        printed_comments: printed_comments,\n        prepend_comments: readonly ? noop : prepend_comments,\n        append_comments : readonly || comment_filter === return_false ? noop : append_comments,\n        line            : function() { return current_line; },\n        col             : function() { return current_col; },\n        pos             : function() { return current_pos; },\n        push_node       : function(node) { stack.push(node); },\n        pop_node        : function() { return stack.pop(); },\n        parent          : function(n) {\n            return stack[stack.length - 2 - (n || 0)];\n        }\n    };\n\n}\n\n/* -----[ code generators ]----- */\n\n(function() {\n\n    /* -----[ utils ]----- */\n\n    function DEFPRINT(nodetype, generator) {\n        nodetype.DEFMETHOD(\"_codegen\", generator);\n    }\n\n    AST_Node.DEFMETHOD(\"print\", function(output, force_parens) {\n        var self = this, generator = self._codegen;\n        if (self instanceof AST_Scope) {\n            output.active_scope = self;\n        } else if (!output.use_asm && self instanceof AST_Directive && self.value == \"use asm\") {\n            output.use_asm = output.active_scope;\n        }\n        function doit() {\n            output.prepend_comments(self);\n            self.add_source_map(output);\n            generator(self, output);\n            output.append_comments(self);\n        }\n        output.push_node(self);\n        if (force_parens || self.needs_parens(output)) {\n            output.with_parens(doit);\n        } else {\n            doit();\n        }\n        output.pop_node();\n        if (self === output.use_asm) {\n            output.use_asm = null;\n        }\n    });\n    AST_Node.DEFMETHOD(\"_print\", AST_Node.prototype.print);\n\n    AST_Node.DEFMETHOD(\"print_to_string\", function(options) {\n        var output = OutputStream(options);\n        this.print(output);\n        return output.get();\n    });\n\n    /* -----[ PARENTHESES ]----- */\n\n    function PARENS(nodetype, func) {\n        if (Array.isArray(nodetype)) {\n            nodetype.forEach(function(nodetype) {\n                PARENS(nodetype, func);\n            });\n        } else {\n            nodetype.DEFMETHOD(\"needs_parens\", func);\n        }\n    }\n\n    PARENS(AST_Node, return_false);\n\n    // a function expression needs parens around it when it's provably\n    // the first token to appear in a statement.\n    PARENS(AST_Function, function(output) {\n        if (!output.has_parens() && first_in_statement(output)) {\n            return true;\n        }\n\n        if (output.option(\"webkit\")) {\n            var p = output.parent();\n            if (p instanceof AST_PropAccess && p.expression === this) {\n                return true;\n            }\n        }\n\n        if (output.option(\"wrap_iife\")) {\n            var p = output.parent();\n            if (p instanceof AST_Call && p.expression === this) {\n                return true;\n            }\n        }\n\n        if (output.option(\"wrap_func_args\")) {\n            var p = output.parent();\n            if (p instanceof AST_Call && p.args.includes(this)) {\n                return true;\n            }\n        }\n\n        return false;\n    });\n\n    PARENS(AST_Arrow, function(output) {\n        var p = output.parent();\n\n        if (\n            output.option(\"wrap_func_args\")\n            && p instanceof AST_Call\n            && p.args.includes(this)\n        ) {\n            return true;\n        }\n        return p instanceof AST_PropAccess && p.expression === this;\n    });\n\n    // same goes for an object literal (as in AST_Function), because\n    // otherwise {...} would be interpreted as a block of code.\n    PARENS(AST_Object, function(output) {\n        return !output.has_parens() && first_in_statement(output);\n    });\n\n    PARENS(AST_ClassExpression, first_in_statement);\n\n    PARENS(AST_Unary, function(output) {\n        var p = output.parent();\n        return p instanceof AST_PropAccess && p.expression === this\n            || p instanceof AST_Call && p.expression === this\n            || p instanceof AST_Binary\n                && p.operator === \"**\"\n                && this instanceof AST_UnaryPrefix\n                && p.left === this\n                && this.operator !== \"++\"\n                && this.operator !== \"--\";\n    });\n\n    PARENS(AST_Await, function(output) {\n        var p = output.parent();\n        return p instanceof AST_PropAccess && p.expression === this\n            || p instanceof AST_Call && p.expression === this\n            || p instanceof AST_Binary && p.operator === \"**\" && p.left === this\n            || output.option(\"safari10\") && p instanceof AST_UnaryPrefix;\n    });\n\n    PARENS(AST_Sequence, function(output) {\n        var p = output.parent();\n        return p instanceof AST_Call                          // (foo, bar)() or foo(1, (2, 3), 4)\n            || p instanceof AST_Unary                         // !(foo, bar, baz)\n            || p instanceof AST_Binary                        // 1 + (2, 3) + 4 ==> 8\n            || p instanceof AST_VarDef                        // var a = (1, 2), b = a + a; ==> b == 4\n            || p instanceof AST_PropAccess                    // (1, {foo:2}).foo or (1, {foo:2})[\"foo\"] ==> 2\n            || p instanceof AST_Array                         // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ]\n            || p instanceof AST_ObjectProperty                // { foo: (1, 2) }.foo ==> 2\n            || p instanceof AST_Conditional                   /* (false, true) ? (a = 10, b = 20) : (c = 30)\n                                                               * ==> 20 (side effect, set a := 10 and b := 20) */\n            || p instanceof AST_Arrow                         // x => (x, x)\n            || p instanceof AST_DefaultAssign                 // x => (x = (0, function(){}))\n            || p instanceof AST_Expansion                     // [...(a, b)]\n            || p instanceof AST_ForOf && this === p.object    // for (e of (foo, bar)) {}\n            || p instanceof AST_Yield                         // yield (foo, bar)\n            || p instanceof AST_Export                        // export default (foo, bar)\n        ;\n    });\n\n    PARENS(AST_Binary, function(output) {\n        var p = output.parent();\n        // (foo && bar)()\n        if (p instanceof AST_Call && p.expression === this)\n            return true;\n        // typeof (foo && bar)\n        if (p instanceof AST_Unary)\n            return true;\n        // (foo && bar)[\"prop\"], (foo && bar).prop\n        if (p instanceof AST_PropAccess && p.expression === this)\n            return true;\n        // this deals with precedence: 3 * (2 + 1)\n        if (p instanceof AST_Binary) {\n            const po = p.operator;\n            const so = this.operator;\n\n            if (so === \"??\" && (po === \"||\" || po === \"&&\")) {\n                return true;\n            }\n\n            if (po === \"??\" && (so === \"||\" || so === \"&&\")) {\n                return true;\n            }\n\n            const pp = PRECEDENCE[po];\n            const sp = PRECEDENCE[so];\n            if (pp > sp\n                || (pp == sp\n                    && (this === p.right || po == \"**\"))) {\n                return true;\n            }\n        }\n    });\n\n    PARENS(AST_Yield, function(output) {\n        var p = output.parent();\n        // (yield 1) + (yield 2)\n        // a = yield 3\n        if (p instanceof AST_Binary && p.operator !== \"=\")\n            return true;\n        // (yield 1)()\n        // new (yield 1)()\n        if (p instanceof AST_Call && p.expression === this)\n            return true;\n        // (yield 1) ? yield 2 : yield 3\n        if (p instanceof AST_Conditional && p.condition === this)\n            return true;\n        // -(yield 4)\n        if (p instanceof AST_Unary)\n            return true;\n        // (yield x).foo\n        // (yield x)['foo']\n        if (p instanceof AST_PropAccess && p.expression === this)\n            return true;\n    });\n\n    PARENS(AST_Chain, function(output) {\n        var p = output.parent();\n        if (!(p instanceof AST_Call || p instanceof AST_PropAccess)) return false;\n        return p.expression === this;\n    });\n\n    PARENS(AST_PropAccess, function(output) {\n        var p = output.parent();\n        if (p instanceof AST_New && p.expression === this) {\n            // i.e. new (foo.bar().baz)\n            //\n            // if there's one call into this subtree, then we need\n            // parens around it too, otherwise the call will be\n            // interpreted as passing the arguments to the upper New\n            // expression.\n            return walk(this, node => {\n                if (node instanceof AST_Scope) return true;\n                if (node instanceof AST_Call) {\n                    return walk_abort;  // makes walk() return true.\n                }\n            });\n        }\n    });\n\n    PARENS(AST_Call, function(output) {\n        var p = output.parent(), p1;\n        if (p instanceof AST_New && p.expression === this\n            || p instanceof AST_Export && p.is_default && this.expression instanceof AST_Function)\n            return true;\n\n        // workaround for Safari bug.\n        // https://bugs.webkit.org/show_bug.cgi?id=123506\n        return this.expression instanceof AST_Function\n            && p instanceof AST_PropAccess\n            && p.expression === this\n            && (p1 = output.parent(1)) instanceof AST_Assign\n            && p1.left === p;\n    });\n\n    PARENS(AST_New, function(output) {\n        var p = output.parent();\n        if (this.args.length === 0\n            && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)[\"getTime\"]()\n                || p instanceof AST_Call && p.expression === this\n                || p instanceof AST_PrefixedTemplateString && p.prefix === this)) // (new foo)(bar)\n            return true;\n    });\n\n    PARENS(AST_Number, function(output) {\n        var p = output.parent();\n        if (p instanceof AST_PropAccess && p.expression === this) {\n            var value = this.getValue();\n            if (value < 0 || /^0/.test(make_num(value))) {\n                return true;\n            }\n        }\n    });\n\n    PARENS(AST_BigInt, function(output) {\n        var p = output.parent();\n        if (p instanceof AST_PropAccess && p.expression === this) {\n            var value = this.getValue();\n            if (value.startsWith(\"-\")) {\n                return true;\n            }\n        }\n    });\n\n    PARENS([ AST_Assign, AST_Conditional ], function(output) {\n        var p = output.parent();\n        // !(a = false) → true\n        if (p instanceof AST_Unary)\n            return true;\n        // 1 + (a = 2) + 3 → 6, side effect setting a = 2\n        if (p instanceof AST_Binary && !(p instanceof AST_Assign))\n            return true;\n        // (a = func)() —or— new (a = Object)()\n        if (p instanceof AST_Call && p.expression === this)\n            return true;\n        // (a = foo) ? bar : baz\n        if (p instanceof AST_Conditional && p.condition === this)\n            return true;\n        // (a = foo)[\"prop\"] —or— (a = foo).prop\n        if (p instanceof AST_PropAccess && p.expression === this)\n            return true;\n        // ({a, b} = {a: 1, b: 2}), a destructuring assignment\n        if (this instanceof AST_Assign && this.left instanceof AST_Destructuring && this.left.is_array === false)\n            return true;\n    });\n\n    /* -----[ PRINTERS ]----- */\n\n    DEFPRINT(AST_Directive, function(self, output) {\n        output.print_string(self.value, self.quote);\n        output.semicolon();\n    });\n\n    DEFPRINT(AST_Expansion, function (self, output) {\n        output.print(\"...\");\n        self.expression.print(output);\n    });\n\n    DEFPRINT(AST_Destructuring, function (self, output) {\n        output.print(self.is_array ? \"[\" : \"{\");\n        var len = self.names.length;\n        self.names.forEach(function (name, i) {\n            if (i > 0) output.comma();\n            name.print(output);\n            // If the final element is a hole, we need to make sure it\n            // doesn't look like a trailing comma, by inserting an actual\n            // trailing comma.\n            if (i == len - 1 && name instanceof AST_Hole) output.comma();\n        });\n        output.print(self.is_array ? \"]\" : \"}\");\n    });\n\n    DEFPRINT(AST_Debugger, function(self, output) {\n        output.print(\"debugger\");\n        output.semicolon();\n    });\n\n    /* -----[ statements ]----- */\n\n    function display_body(body, is_toplevel, output, allow_directives) {\n        var last = body.length - 1;\n        output.in_directive = allow_directives;\n        body.forEach(function(stmt, i) {\n            if (output.in_directive === true && !(stmt instanceof AST_Directive ||\n                stmt instanceof AST_EmptyStatement ||\n                (stmt instanceof AST_SimpleStatement && stmt.body instanceof AST_String)\n            )) {\n                output.in_directive = false;\n            }\n            if (!(stmt instanceof AST_EmptyStatement)) {\n                output.indent();\n                stmt.print(output);\n                if (!(i == last && is_toplevel)) {\n                    output.newline();\n                    if (is_toplevel) output.newline();\n                }\n            }\n            if (output.in_directive === true &&\n                stmt instanceof AST_SimpleStatement &&\n                stmt.body instanceof AST_String\n            ) {\n                output.in_directive = false;\n            }\n        });\n        output.in_directive = false;\n    }\n\n    AST_StatementWithBody.DEFMETHOD(\"_do_print_body\", function(output) {\n        print_maybe_braced_body(this.body, output);\n    });\n\n    DEFPRINT(AST_Statement, function(self, output) {\n        self.body.print(output);\n        output.semicolon();\n    });\n    DEFPRINT(AST_Toplevel, function(self, output) {\n        display_body(self.body, true, output, true);\n        output.print(\"\");\n    });\n    DEFPRINT(AST_LabeledStatement, function(self, output) {\n        self.label.print(output);\n        output.colon();\n        self.body.print(output);\n    });\n    DEFPRINT(AST_SimpleStatement, function(self, output) {\n        self.body.print(output);\n        output.semicolon();\n    });\n    function print_braced_empty(self, output) {\n        output.print(\"{\");\n        output.with_indent(output.next_indent(), function() {\n            output.append_comments(self, true);\n        });\n        output.add_mapping(self.end);\n        output.print(\"}\");\n    }\n    function print_braced(self, output, allow_directives) {\n        if (self.body.length > 0) {\n            output.with_block(function() {\n                display_body(self.body, false, output, allow_directives);\n                output.add_mapping(self.end);\n            });\n        } else print_braced_empty(self, output);\n    }\n    DEFPRINT(AST_BlockStatement, function(self, output) {\n        print_braced(self, output);\n    });\n    DEFPRINT(AST_EmptyStatement, function(self, output) {\n        output.semicolon();\n    });\n    DEFPRINT(AST_Do, function(self, output) {\n        output.print(\"do\");\n        output.space();\n        make_block(self.body, output);\n        output.space();\n        output.print(\"while\");\n        output.space();\n        output.with_parens(function() {\n            self.condition.print(output);\n        });\n        output.semicolon();\n    });\n    DEFPRINT(AST_While, function(self, output) {\n        output.print(\"while\");\n        output.space();\n        output.with_parens(function() {\n            self.condition.print(output);\n        });\n        output.space();\n        self._do_print_body(output);\n    });\n    DEFPRINT(AST_For, function(self, output) {\n        output.print(\"for\");\n        output.space();\n        output.with_parens(function() {\n            if (self.init) {\n                if (self.init instanceof AST_Definitions) {\n                    self.init.print(output);\n                } else {\n                    parenthesize_for_noin(self.init, output, true);\n                }\n                output.print(\";\");\n                output.space();\n            } else {\n                output.print(\";\");\n            }\n            if (self.condition) {\n                self.condition.print(output);\n                output.print(\";\");\n                output.space();\n            } else {\n                output.print(\";\");\n            }\n            if (self.step) {\n                self.step.print(output);\n            }\n        });\n        output.space();\n        self._do_print_body(output);\n    });\n    DEFPRINT(AST_ForIn, function(self, output) {\n        output.print(\"for\");\n        if (self.await) {\n            output.space();\n            output.print(\"await\");\n        }\n        output.space();\n        output.with_parens(function() {\n            self.init.print(output);\n            output.space();\n            output.print(self instanceof AST_ForOf ? \"of\" : \"in\");\n            output.space();\n            self.object.print(output);\n        });\n        output.space();\n        self._do_print_body(output);\n    });\n    DEFPRINT(AST_With, function(self, output) {\n        output.print(\"with\");\n        output.space();\n        output.with_parens(function() {\n            self.expression.print(output);\n        });\n        output.space();\n        self._do_print_body(output);\n    });\n\n    /* -----[ functions ]----- */\n    AST_Lambda.DEFMETHOD(\"_do_print\", function(output, nokeyword) {\n        var self = this;\n        if (!nokeyword) {\n            if (self.async) {\n                output.print(\"async\");\n                output.space();\n            }\n            output.print(\"function\");\n            if (self.is_generator) {\n                output.star();\n            }\n            if (self.name) {\n                output.space();\n            }\n        }\n        if (self.name instanceof AST_Symbol) {\n            self.name.print(output);\n        } else if (nokeyword && self.name instanceof AST_Node) {\n            output.with_square(function() {\n                self.name.print(output); // Computed method name\n            });\n        }\n        output.with_parens(function() {\n            self.argnames.forEach(function(arg, i) {\n                if (i) output.comma();\n                arg.print(output);\n            });\n        });\n        output.space();\n        print_braced(self, output, true);\n    });\n    DEFPRINT(AST_Lambda, function(self, output) {\n        self._do_print(output);\n        output.gc_scope(self);\n    });\n\n    DEFPRINT(AST_PrefixedTemplateString, function(self, output) {\n        var tag = self.prefix;\n        var parenthesize_tag = tag instanceof AST_Lambda\n            || tag instanceof AST_Binary\n            || tag instanceof AST_Conditional\n            || tag instanceof AST_Sequence\n            || tag instanceof AST_Unary\n            || tag instanceof AST_Dot && tag.expression instanceof AST_Object;\n        if (parenthesize_tag) output.print(\"(\");\n        self.prefix.print(output);\n        if (parenthesize_tag) output.print(\")\");\n        self.template_string.print(output);\n    });\n    DEFPRINT(AST_TemplateString, function(self, output) {\n        var is_tagged = output.parent() instanceof AST_PrefixedTemplateString;\n\n        output.print(\"`\");\n        for (var i = 0; i < self.segments.length; i++) {\n            if (!(self.segments[i] instanceof AST_TemplateSegment)) {\n                output.print(\"${\");\n                self.segments[i].print(output);\n                output.print(\"}\");\n            } else if (is_tagged) {\n                output.print(self.segments[i].raw);\n            } else {\n                output.print_template_string_chars(self.segments[i].value);\n            }\n        }\n        output.print(\"`\");\n    });\n    DEFPRINT(AST_TemplateSegment, function(self, output) {\n        output.print_template_string_chars(self.value);\n    });\n\n    AST_Arrow.DEFMETHOD(\"_do_print\", function(output) {\n        var self = this;\n        var parent = output.parent();\n        var needs_parens = (parent instanceof AST_Binary && !(parent instanceof AST_Assign)) ||\n            parent instanceof AST_Unary ||\n            (parent instanceof AST_Call && self === parent.expression);\n        if (needs_parens) { output.print(\"(\"); }\n        if (self.async) {\n            output.print(\"async\");\n            output.space();\n        }\n        if (self.argnames.length === 1 && self.argnames[0] instanceof AST_Symbol) {\n            self.argnames[0].print(output);\n        } else {\n            output.with_parens(function() {\n                self.argnames.forEach(function(arg, i) {\n                    if (i) output.comma();\n                    arg.print(output);\n                });\n            });\n        }\n        output.space();\n        output.print(\"=>\");\n        output.space();\n        const first_statement = self.body[0];\n        if (\n            self.body.length === 1\n            && first_statement instanceof AST_Return\n        ) {\n            const returned = first_statement.value;\n            if (!returned) {\n                output.print(\"{}\");\n            } else if (left_is_object(returned)) {\n                output.print(\"(\");\n                returned.print(output);\n                output.print(\")\");\n            } else {\n                returned.print(output);\n            }\n        } else {\n            print_braced(self, output);\n        }\n        if (needs_parens) { output.print(\")\"); }\n        output.gc_scope(self);\n    });\n\n    /* -----[ exits ]----- */\n    AST_Exit.DEFMETHOD(\"_do_print\", function(output, kind) {\n        output.print(kind);\n        if (this.value) {\n            output.space();\n            const comments = this.value.start.comments_before;\n            if (comments && comments.length && !output.printed_comments.has(comments)) {\n                output.print(\"(\");\n                this.value.print(output);\n                output.print(\")\");\n            } else {\n                this.value.print(output);\n            }\n        }\n        output.semicolon();\n    });\n    DEFPRINT(AST_Return, function(self, output) {\n        self._do_print(output, \"return\");\n    });\n    DEFPRINT(AST_Throw, function(self, output) {\n        self._do_print(output, \"throw\");\n    });\n\n    /* -----[ yield ]----- */\n\n    DEFPRINT(AST_Yield, function(self, output) {\n        var star = self.is_star ? \"*\" : \"\";\n        output.print(\"yield\" + star);\n        if (self.expression) {\n            output.space();\n            self.expression.print(output);\n        }\n    });\n\n    DEFPRINT(AST_Await, function(self, output) {\n        output.print(\"await\");\n        output.space();\n        var e = self.expression;\n        var parens = !(\n               e instanceof AST_Call\n            || e instanceof AST_SymbolRef\n            || e instanceof AST_PropAccess\n            || e instanceof AST_Unary\n            || e instanceof AST_Constant\n            || e instanceof AST_Await\n            || e instanceof AST_Object\n        );\n        if (parens) output.print(\"(\");\n        self.expression.print(output);\n        if (parens) output.print(\")\");\n    });\n\n    /* -----[ loop control ]----- */\n    AST_LoopControl.DEFMETHOD(\"_do_print\", function(output, kind) {\n        output.print(kind);\n        if (this.label) {\n            output.space();\n            this.label.print(output);\n        }\n        output.semicolon();\n    });\n    DEFPRINT(AST_Break, function(self, output) {\n        self._do_print(output, \"break\");\n    });\n    DEFPRINT(AST_Continue, function(self, output) {\n        self._do_print(output, \"continue\");\n    });\n\n    /* -----[ if ]----- */\n    function make_then(self, output) {\n        var b = self.body;\n        if (output.option(\"braces\")\n            || output.option(\"ie8\") && b instanceof AST_Do)\n            return make_block(b, output);\n        // The squeezer replaces \"block\"-s that contain only a single\n        // statement with the statement itself; technically, the AST\n        // is correct, but this can create problems when we output an\n        // IF having an ELSE clause where the THEN clause ends in an\n        // IF *without* an ELSE block (then the outer ELSE would refer\n        // to the inner IF).  This function checks for this case and\n        // adds the block braces if needed.\n        if (!b) return output.force_semicolon();\n        while (true) {\n            if (b instanceof AST_If) {\n                if (!b.alternative) {\n                    make_block(self.body, output);\n                    return;\n                }\n                b = b.alternative;\n            } else if (b instanceof AST_StatementWithBody) {\n                b = b.body;\n            } else break;\n        }\n        print_maybe_braced_body(self.body, output);\n    }\n    DEFPRINT(AST_If, function(self, output) {\n        output.print(\"if\");\n        output.space();\n        output.with_parens(function() {\n            self.condition.print(output);\n        });\n        output.space();\n        if (self.alternative) {\n            make_then(self, output);\n            output.space();\n            output.print(\"else\");\n            output.space();\n            if (self.alternative instanceof AST_If)\n                self.alternative.print(output);\n            else\n                print_maybe_braced_body(self.alternative, output);\n        } else {\n            self._do_print_body(output);\n        }\n    });\n\n    /* -----[ switch ]----- */\n    DEFPRINT(AST_Switch, function(self, output) {\n        output.print(\"switch\");\n        output.space();\n        output.with_parens(function() {\n            self.expression.print(output);\n        });\n        output.space();\n        var last = self.body.length - 1;\n        if (last < 0) print_braced_empty(self, output);\n        else output.with_block(function() {\n            self.body.forEach(function(branch, i) {\n                output.indent(true);\n                branch.print(output);\n                if (i < last && branch.body.length > 0)\n                    output.newline();\n            });\n        });\n    });\n    AST_SwitchBranch.DEFMETHOD(\"_do_print_body\", function(output) {\n        output.newline();\n        this.body.forEach(function(stmt) {\n            output.indent();\n            stmt.print(output);\n            output.newline();\n        });\n    });\n    DEFPRINT(AST_Default, function(self, output) {\n        output.print(\"default:\");\n        self._do_print_body(output);\n    });\n    DEFPRINT(AST_Case, function(self, output) {\n        output.print(\"case\");\n        output.space();\n        self.expression.print(output);\n        output.print(\":\");\n        self._do_print_body(output);\n    });\n\n    /* -----[ exceptions ]----- */\n    DEFPRINT(AST_Try, function(self, output) {\n        output.print(\"try\");\n        output.space();\n        self.body.print(output);\n        if (self.bcatch) {\n            output.space();\n            self.bcatch.print(output);\n        }\n        if (self.bfinally) {\n            output.space();\n            self.bfinally.print(output);\n        }\n    });\n    DEFPRINT(AST_TryBlock, function(self, output) {\n        print_braced(self, output);\n    });\n    DEFPRINT(AST_Catch, function(self, output) {\n        output.print(\"catch\");\n        if (self.argname) {\n            output.space();\n            output.with_parens(function() {\n                self.argname.print(output);\n            });\n        }\n        output.space();\n        print_braced(self, output);\n    });\n    DEFPRINT(AST_Finally, function(self, output) {\n        output.print(\"finally\");\n        output.space();\n        print_braced(self, output);\n    });\n\n    /* -----[ var/const ]----- */\n    AST_Definitions.DEFMETHOD(\"_do_print\", function(output, kind) {\n        output.print(kind);\n        output.space();\n        this.definitions.forEach(function(def, i) {\n            if (i) output.comma();\n            def.print(output);\n        });\n        var p = output.parent();\n        var in_for = p instanceof AST_For || p instanceof AST_ForIn;\n        var output_semicolon = !in_for || p && p.init !== this;\n        if (output_semicolon)\n            output.semicolon();\n    });\n    DEFPRINT(AST_Let, function(self, output) {\n        self._do_print(output, \"let\");\n    });\n    DEFPRINT(AST_Var, function(self, output) {\n        self._do_print(output, \"var\");\n    });\n    DEFPRINT(AST_Const, function(self, output) {\n        self._do_print(output, \"const\");\n    });\n    DEFPRINT(AST_Import, function(self, output) {\n        output.print(\"import\");\n        output.space();\n        if (self.imported_name) {\n            self.imported_name.print(output);\n        }\n        if (self.imported_name && self.imported_names) {\n            output.print(\",\");\n            output.space();\n        }\n        if (self.imported_names) {\n            if (self.imported_names.length === 1 &&\n                self.imported_names[0].foreign_name.name === \"*\" &&\n                !self.imported_names[0].foreign_name.quote) {\n                self.imported_names[0].print(output);\n            } else {\n                output.print(\"{\");\n                self.imported_names.forEach(function (name_import, i) {\n                    output.space();\n                    name_import.print(output);\n                    if (i < self.imported_names.length - 1) {\n                        output.print(\",\");\n                    }\n                });\n                output.space();\n                output.print(\"}\");\n            }\n        }\n        if (self.imported_name || self.imported_names) {\n            output.space();\n            output.print(\"from\");\n            output.space();\n        }\n        self.module_name.print(output);\n        if (self.assert_clause) {\n            output.print(\"assert\");\n            self.assert_clause.print(output);\n        }\n        output.semicolon();\n    });\n    DEFPRINT(AST_ImportMeta, function(self, output) {\n        output.print(\"import.meta\");\n    });\n\n    DEFPRINT(AST_NameMapping, function(self, output) {\n        var is_import = output.parent() instanceof AST_Import;\n        var definition = self.name.definition();\n        var foreign_name = self.foreign_name;\n        var names_are_different =\n            (definition && definition.mangled_name || self.name.name) !==\n            foreign_name.name;\n        if (!names_are_different &&\n            foreign_name.name === \"*\" &&\n            foreign_name.quote != self.name.quote) {\n                // export * as \"*\"\n            names_are_different = true;\n        }\n        var foreign_name_is_name = foreign_name.quote == null;\n        if (names_are_different) {\n            if (is_import) {\n                if (foreign_name_is_name) {\n                    output.print(foreign_name.name);\n                } else {\n                    output.print_string(foreign_name.name, foreign_name.quote);\n                }\n            } else {\n                if (self.name.quote == null) {\n                    self.name.print(output);\n                } else {\n                    output.print_string(self.name.name, self.name.quote);\n                }\n                \n            }\n            output.space();\n            output.print(\"as\");\n            output.space();\n            if (is_import) {\n                self.name.print(output);\n            } else {\n                if (foreign_name_is_name) {\n                    output.print(foreign_name.name);\n                } else {\n                    output.print_string(foreign_name.name, foreign_name.quote);\n                }\n            }\n        } else {\n            if (self.name.quote == null) {\n                self.name.print(output);\n            } else {\n                output.print_string(self.name.name, self.name.quote);\n            }\n        }\n    });\n\n    DEFPRINT(AST_Export, function(self, output) {\n        output.print(\"export\");\n        output.space();\n        if (self.is_default) {\n            output.print(\"default\");\n            output.space();\n        }\n        if (self.exported_names) {\n            if (self.exported_names.length === 1 &&\n                self.exported_names[0].name.name === \"*\" &&\n                !self.exported_names[0].name.quote) {\n                    self.exported_names[0].print(output);\n            } else {\n                output.print(\"{\");\n                self.exported_names.forEach(function(name_export, i) {\n                    output.space();\n                    name_export.print(output);\n                    if (i < self.exported_names.length - 1) {\n                        output.print(\",\");\n                    }\n                });\n                output.space();\n                output.print(\"}\");\n            }\n        } else if (self.exported_value) {\n            self.exported_value.print(output);\n        } else if (self.exported_definition) {\n            self.exported_definition.print(output);\n            if (self.exported_definition instanceof AST_Definitions) return;\n        }\n        if (self.module_name) {\n            output.space();\n            output.print(\"from\");\n            output.space();\n            self.module_name.print(output);\n        }\n        if (self.assert_clause) {\n            output.print(\"assert\");\n            self.assert_clause.print(output);\n        }\n        if (self.exported_value\n                && !(self.exported_value instanceof AST_Defun ||\n                    self.exported_value instanceof AST_Function ||\n                    self.exported_value instanceof AST_Class)\n            || self.module_name\n            || self.exported_names\n        ) {\n            output.semicolon();\n        }\n    });\n\n    function parenthesize_for_noin(node, output, noin) {\n        var parens = false;\n        // need to take some precautions here:\n        //    https://github.com/mishoo/UglifyJS2/issues/60\n        if (noin) {\n            parens = walk(node, node => {\n                // Don't go into scopes -- except arrow functions:\n                // https://github.com/terser/terser/issues/1019#issuecomment-877642607\n                if (node instanceof AST_Scope && !(node instanceof AST_Arrow)) {\n                    return true;\n                }\n                if (\n                    node instanceof AST_Binary && node.operator == \"in\"\n                    || node instanceof AST_PrivateIn\n                ) {\n                    return walk_abort;  // makes walk() return true\n                }\n            });\n        }\n        node.print(output, parens);\n    }\n\n    DEFPRINT(AST_VarDef, function(self, output) {\n        self.name.print(output);\n        if (self.value) {\n            output.space();\n            output.print(\"=\");\n            output.space();\n            var p = output.parent(1);\n            var noin = p instanceof AST_For || p instanceof AST_ForIn;\n            parenthesize_for_noin(self.value, output, noin);\n        }\n    });\n\n    /* -----[ other expressions ]----- */\n    DEFPRINT(AST_Call, function(self, output) {\n        self.expression.print(output);\n        if (self instanceof AST_New && self.args.length === 0)\n            return;\n        if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {\n            output.add_mapping(self.start);\n        }\n        if (self.optional) output.print(\"?.\");\n        output.with_parens(function() {\n            self.args.forEach(function(expr, i) {\n                if (i) output.comma();\n                expr.print(output);\n            });\n        });\n    });\n    DEFPRINT(AST_New, function(self, output) {\n        output.print(\"new\");\n        output.space();\n        AST_Call.prototype._codegen(self, output);\n    });\n\n    AST_Sequence.DEFMETHOD(\"_do_print\", function(output) {\n        this.expressions.forEach(function(node, index) {\n            if (index > 0) {\n                output.comma();\n                if (output.should_break()) {\n                    output.newline();\n                    output.indent();\n                }\n            }\n            node.print(output);\n        });\n    });\n    DEFPRINT(AST_Sequence, function(self, output) {\n        self._do_print(output);\n        // var p = output.parent();\n        // if (p instanceof AST_Statement) {\n        //     output.with_indent(output.next_indent(), function(){\n        //         self._do_print(output);\n        //     });\n        // } else {\n        //     self._do_print(output);\n        // }\n    });\n    DEFPRINT(AST_Dot, function(self, output) {\n        var expr = self.expression;\n        expr.print(output);\n        var prop = self.property;\n        var print_computed = ALL_RESERVED_WORDS.has(prop)\n            ? output.option(\"ie8\")\n            : !is_identifier_string(\n                prop,\n                output.option(\"ecma\") >= 2015 || output.option(\"safari10\")\n            );\n\n        if (self.optional) output.print(\"?.\");\n\n        if (print_computed) {\n            output.print(\"[\");\n            output.add_mapping(self.end);\n            output.print_string(prop);\n            output.print(\"]\");\n        } else {\n            if (expr instanceof AST_Number && expr.getValue() >= 0) {\n                if (!/[xa-f.)]/i.test(output.last())) {\n                    output.print(\".\");\n                }\n            }\n            if (!self.optional) output.print(\".\");\n            // the name after dot would be mapped about here.\n            output.add_mapping(self.end);\n            output.print_name(prop);\n        }\n    });\n    DEFPRINT(AST_DotHash, function(self, output) {\n        var expr = self.expression;\n        expr.print(output);\n        var prop = self.property;\n\n        if (self.optional) output.print(\"?\");\n        output.print(\".#\");\n        output.add_mapping(self.end);\n        output.print_name(prop);\n    });\n    DEFPRINT(AST_Sub, function(self, output) {\n        self.expression.print(output);\n        if (self.optional) output.print(\"?.\");\n        output.print(\"[\");\n        self.property.print(output);\n        output.print(\"]\");\n    });\n    DEFPRINT(AST_Chain, function(self, output) {\n        self.expression.print(output);\n    });\n    DEFPRINT(AST_UnaryPrefix, function(self, output) {\n        var op = self.operator;\n        output.print(op);\n        if (/^[a-z]/i.test(op)\n            || (/[+-]$/.test(op)\n                && self.expression instanceof AST_UnaryPrefix\n                && /^[+-]/.test(self.expression.operator))) {\n            output.space();\n        }\n        self.expression.print(output);\n    });\n    DEFPRINT(AST_UnaryPostfix, function(self, output) {\n        self.expression.print(output);\n        output.print(self.operator);\n    });\n    DEFPRINT(AST_Binary, function(self, output) {\n        var op = self.operator;\n        self.left.print(output);\n        if (op[0] == \">\" /* \">>\" \">>>\" \">\" \">=\" */\n            && self.left instanceof AST_UnaryPostfix\n            && self.left.operator == \"--\") {\n            // space is mandatory to avoid outputting -->\n            output.print(\" \");\n        } else {\n            // the space is optional depending on \"beautify\"\n            output.space();\n        }\n        output.print(op);\n        if ((op == \"<\" || op == \"<<\")\n            && self.right instanceof AST_UnaryPrefix\n            && self.right.operator == \"!\"\n            && self.right.expression instanceof AST_UnaryPrefix\n            && self.right.expression.operator == \"--\") {\n            // space is mandatory to avoid outputting <!--\n            output.print(\" \");\n        } else {\n            // the space is optional depending on \"beautify\"\n            output.space();\n        }\n        self.right.print(output);\n    });\n    DEFPRINT(AST_Conditional, function(self, output) {\n        self.condition.print(output);\n        output.space();\n        output.print(\"?\");\n        output.space();\n        self.consequent.print(output);\n        output.space();\n        output.colon();\n        self.alternative.print(output);\n    });\n\n    /* -----[ literals ]----- */\n    DEFPRINT(AST_Array, function(self, output) {\n        output.with_square(function() {\n            var a = self.elements, len = a.length;\n            if (len > 0) output.space();\n            a.forEach(function(exp, i) {\n                if (i) output.comma();\n                exp.print(output);\n                // If the final element is a hole, we need to make sure it\n                // doesn't look like a trailing comma, by inserting an actual\n                // trailing comma.\n                if (i === len - 1 && exp instanceof AST_Hole)\n                  output.comma();\n            });\n            if (len > 0) output.space();\n        });\n    });\n    DEFPRINT(AST_Object, function(self, output) {\n        if (self.properties.length > 0) output.with_block(function() {\n            self.properties.forEach(function(prop, i) {\n                if (i) {\n                    output.print(\",\");\n                    output.newline();\n                }\n                output.indent();\n                prop.print(output);\n            });\n            output.newline();\n        });\n        else print_braced_empty(self, output);\n    });\n    DEFPRINT(AST_Class, function(self, output) {\n        output.print(\"class\");\n        output.space();\n        if (self.name) {\n            self.name.print(output);\n            output.space();\n        }\n        if (self.extends) {\n            var parens = (\n                   !(self.extends instanceof AST_SymbolRef)\n                && !(self.extends instanceof AST_PropAccess)\n                && !(self.extends instanceof AST_ClassExpression)\n                && !(self.extends instanceof AST_Function)\n            );\n            output.print(\"extends\");\n            if (parens) {\n                output.print(\"(\");\n            } else {\n                output.space();\n            }\n            self.extends.print(output);\n            if (parens) {\n                output.print(\")\");\n            } else {\n                output.space();\n            }\n        }\n        if (self.properties.length > 0) output.with_block(function() {\n            self.properties.forEach(function(prop, i) {\n                if (i) {\n                    output.newline();\n                }\n                output.indent();\n                prop.print(output);\n            });\n            output.newline();\n        });\n        else output.print(\"{}\");\n    });\n    DEFPRINT(AST_NewTarget, function(self, output) {\n        output.print(\"new.target\");\n    });\n\n    function print_property_name(key, quote, output) {\n        if (output.option(\"quote_keys\")) {\n            return output.print_string(key);\n        }\n        if (\"\" + +key == key && key >= 0) {\n            if (output.option(\"keep_numbers\")) {\n                return output.print(key);\n            }\n            return output.print(make_num(key));\n        }\n        var print_string = ALL_RESERVED_WORDS.has(key)\n            ? output.option(\"ie8\")\n            : (\n                output.option(\"ecma\") < 2015 || output.option(\"safari10\")\n                    ? !is_basic_identifier_string(key)\n                    : !is_identifier_string(key, true)\n            );\n        if (print_string || (quote && output.option(\"keep_quoted_props\"))) {\n            return output.print_string(key, quote);\n        }\n        return output.print_name(key);\n    }\n\n    DEFPRINT(AST_ObjectKeyVal, function(self, output) {\n        function get_name(self) {\n            var def = self.definition();\n            return def ? def.mangled_name || def.name : self.name;\n        }\n\n        var allowShortHand = output.option(\"shorthand\");\n        if (allowShortHand &&\n            self.value instanceof AST_Symbol &&\n            is_identifier_string(\n                self.key,\n                output.option(\"ecma\") >= 2015 || output.option(\"safari10\")\n            ) &&\n            get_name(self.value) === self.key &&\n            !ALL_RESERVED_WORDS.has(self.key)\n        ) {\n            print_property_name(self.key, self.quote, output);\n\n        } else if (allowShortHand &&\n            self.value instanceof AST_DefaultAssign &&\n            self.value.left instanceof AST_Symbol &&\n            is_identifier_string(\n                self.key,\n                output.option(\"ecma\") >= 2015 || output.option(\"safari10\")\n            ) &&\n            get_name(self.value.left) === self.key\n        ) {\n            print_property_name(self.key, self.quote, output);\n            output.space();\n            output.print(\"=\");\n            output.space();\n            self.value.right.print(output);\n        } else {\n            if (!(self.key instanceof AST_Node)) {\n                print_property_name(self.key, self.quote, output);\n            } else {\n                output.with_square(function() {\n                    self.key.print(output);\n                });\n            }\n            output.colon();\n            self.value.print(output);\n        }\n    });\n    DEFPRINT(AST_ClassPrivateProperty, (self, output) => {\n        if (self.static) {\n            output.print(\"static\");\n            output.space();\n        }\n\n        output.print(\"#\");\n        \n        print_property_name(self.key.name, self.quote, output);\n\n        if (self.value) {\n            output.print(\"=\");\n            self.value.print(output);\n        }\n\n        output.semicolon();\n    });\n    DEFPRINT(AST_ClassProperty, (self, output) => {\n        if (self.static) {\n            output.print(\"static\");\n            output.space();\n        }\n\n        if (self.key instanceof AST_SymbolClassProperty) {\n            print_property_name(self.key.name, self.quote, output);\n        } else {\n            output.print(\"[\");\n            self.key.print(output);\n            output.print(\"]\");\n        }\n\n        if (self.value) {\n            output.print(\"=\");\n            self.value.print(output);\n        }\n\n        output.semicolon();\n    });\n    AST_ObjectProperty.DEFMETHOD(\"_print_getter_setter\", function(type, is_private, output) {\n        var self = this;\n        if (self.static) {\n            output.print(\"static\");\n            output.space();\n        }\n        if (type) {\n            output.print(type);\n            output.space();\n        }\n        if (self.key instanceof AST_SymbolMethod) {\n            if (is_private) output.print(\"#\");\n            print_property_name(self.key.name, self.quote, output);\n        } else {\n            output.with_square(function() {\n                self.key.print(output);\n            });\n        }\n        self.value._do_print(output, true);\n    });\n    DEFPRINT(AST_ObjectSetter, function(self, output) {\n        self._print_getter_setter(\"set\", false, output);\n    });\n    DEFPRINT(AST_ObjectGetter, function(self, output) {\n        self._print_getter_setter(\"get\", false, output);\n    });\n    DEFPRINT(AST_PrivateSetter, function(self, output) {\n        self._print_getter_setter(\"set\", true, output);\n    });\n    DEFPRINT(AST_PrivateGetter, function(self, output) {\n        self._print_getter_setter(\"get\", true, output);\n    });\n    DEFPRINT(AST_PrivateMethod, function(self, output) {\n        var type;\n        if (self.is_generator && self.async) {\n            type = \"async*\";\n        } else if (self.is_generator) {\n            type = \"*\";\n        } else if (self.async) {\n            type = \"async\";\n        }\n        self._print_getter_setter(type, true, output);\n    });\n    DEFPRINT(AST_PrivateIn, function(self, output) {\n        self.key.print(output);\n        output.space();\n        output.print(\"in\");\n        output.space();\n        self.value.print(output);\n    });\n    DEFPRINT(AST_SymbolPrivateProperty, function(self, output) {\n        output.print(\"#\" + self.name);\n    });\n    DEFPRINT(AST_ConciseMethod, function(self, output) {\n        var type;\n        if (self.is_generator && self.async) {\n            type = \"async*\";\n        } else if (self.is_generator) {\n            type = \"*\";\n        } else if (self.async) {\n            type = \"async\";\n        }\n        self._print_getter_setter(type, false, output);\n    });\n    DEFPRINT(AST_ClassStaticBlock, function (self, output) {\n        output.print(\"static\");\n        output.space();\n        print_braced(self, output);\n    });\n    AST_Symbol.DEFMETHOD(\"_do_print\", function(output) {\n        var def = this.definition();\n        output.print_name(def ? def.mangled_name || def.name : this.name);\n    });\n    DEFPRINT(AST_Symbol, function (self, output) {\n        self._do_print(output);\n    });\n    DEFPRINT(AST_Hole, noop);\n    DEFPRINT(AST_This, function(self, output) {\n        output.print(\"this\");\n    });\n    DEFPRINT(AST_Super, function(self, output) {\n        output.print(\"super\");\n    });\n    DEFPRINT(AST_Constant, function(self, output) {\n        output.print(self.getValue());\n    });\n    DEFPRINT(AST_String, function(self, output) {\n        output.print_string(self.getValue(), self.quote, output.in_directive);\n    });\n    DEFPRINT(AST_Number, function(self, output) {\n        if ((output.option(\"keep_numbers\") || output.use_asm) && self.raw) {\n            output.print(self.raw);\n        } else {\n            output.print(make_num(self.getValue()));\n        }\n    });\n    DEFPRINT(AST_BigInt, function(self, output) {\n        output.print(self.getValue() + \"n\");\n    });\n\n    const r_slash_script = /(<\\s*\\/\\s*script)/i;\n    const slash_script_replace = (_, $1) => $1.replace(\"/\", \"\\\\/\");\n    DEFPRINT(AST_RegExp, function(self, output) {\n        let { source, flags } = self.getValue();\n        source = regexp_source_fix(source);\n        flags = flags ? sort_regexp_flags(flags) : \"\";\n        source = source.replace(r_slash_script, slash_script_replace);\n\n        output.print(output.to_utf8(`/${source}/${flags}`, false, true));\n\n        const parent = output.parent();\n        if (\n            parent instanceof AST_Binary\n            && /^\\w/.test(parent.operator)\n            && parent.left === self\n        ) {\n            output.print(\" \");\n        }\n    });\n\n    /** if, for, while, may or may not have braces surrounding its body */\n    function print_maybe_braced_body(stat, output) {\n        if (output.option(\"braces\")) {\n            make_block(stat, output);\n        } else {\n            if (!stat || stat instanceof AST_EmptyStatement)\n                output.force_semicolon();\n            else if (stat instanceof AST_Let || stat instanceof AST_Const || stat instanceof AST_Class)\n                make_block(stat, output);\n            else\n                stat.print(output);\n        }\n    }\n\n    function best_of(a) {\n        var best = a[0], len = best.length;\n        for (var i = 1; i < a.length; ++i) {\n            if (a[i].length < len) {\n                best = a[i];\n                len = best.length;\n            }\n        }\n        return best;\n    }\n\n    function make_num(num) {\n        var str = num.toString(10).replace(/^0\\./, \".\").replace(\"e+\", \"e\");\n        var candidates = [ str ];\n        if (Math.floor(num) === num) {\n            if (num < 0) {\n                candidates.push(\"-0x\" + (-num).toString(16).toLowerCase());\n            } else {\n                candidates.push(\"0x\" + num.toString(16).toLowerCase());\n            }\n        }\n        var match, len, digits;\n        if (match = /^\\.0+/.exec(str)) {\n            len = match[0].length;\n            digits = str.slice(len);\n            candidates.push(digits + \"e-\" + (digits.length + len - 1));\n        } else if (match = /0+$/.exec(str)) {\n            len = match[0].length;\n            candidates.push(str.slice(0, -len) + \"e\" + len);\n        } else if (match = /^(\\d)\\.(\\d+)e(-?\\d+)$/.exec(str)) {\n            candidates.push(match[1] + match[2] + \"e\" + (match[3] - match[2].length));\n        }\n        return best_of(candidates);\n    }\n\n    function make_block(stmt, output) {\n        if (!stmt || stmt instanceof AST_EmptyStatement)\n            output.print(\"{}\");\n        else if (stmt instanceof AST_BlockStatement)\n            stmt.print(output);\n        else output.with_block(function() {\n            output.indent();\n            stmt.print(output);\n            output.newline();\n        });\n    }\n\n    /* -----[ source map generators ]----- */\n\n    function DEFMAP(nodetype, generator) {\n        nodetype.forEach(function(nodetype) {\n            nodetype.DEFMETHOD(\"add_source_map\", generator);\n        });\n    }\n\n    DEFMAP([\n        // We could easily add info for ALL nodes, but it seems to me that\n        // would be quite wasteful, hence this noop in the base class.\n        AST_Node,\n        // since the label symbol will mark it\n        AST_LabeledStatement,\n        AST_Toplevel,\n    ], noop);\n\n    // XXX: I'm not exactly sure if we need it for all of these nodes,\n    // or if we should add even more.\n    DEFMAP([\n        AST_Array,\n        AST_BlockStatement,\n        AST_Catch,\n        AST_Class,\n        AST_Constant,\n        AST_Debugger,\n        AST_Definitions,\n        AST_Directive,\n        AST_Finally,\n        AST_Jump,\n        AST_Lambda,\n        AST_New,\n        AST_Object,\n        AST_StatementWithBody,\n        AST_Symbol,\n        AST_Switch,\n        AST_SwitchBranch,\n        AST_TemplateString,\n        AST_TemplateSegment,\n        AST_Try,\n    ], function(output) {\n        output.add_mapping(this.start);\n    });\n\n    DEFMAP([\n        AST_ObjectGetter,\n        AST_ObjectSetter,\n        AST_PrivateGetter,\n        AST_PrivateSetter,\n    ], function(output) {\n        output.add_mapping(this.key.end, this.key.name);\n    });\n\n    DEFMAP([ AST_ObjectProperty ], function(output) {\n        output.add_mapping(this.start, this.key);\n    });\n})();\n\nexport {\n    OutputStream,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/parse.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n    Parser based on parse-js (http://marijn.haverbeke.nl/parse-js/).\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n\nimport {\n    characters,\n    defaults,\n    makePredicate,\n    set_annotation,\n} from \"./utils/index.js\";\nimport {\n    AST_Accessor,\n    AST_Array,\n    AST_Arrow,\n    AST_Assign,\n    AST_Await,\n    AST_BigInt,\n    AST_Binary,\n    AST_BlockStatement,\n    AST_Break,\n    AST_Call,\n    AST_Case,\n    AST_Catch,\n    AST_Chain,\n    AST_ClassExpression,\n    AST_ClassPrivateProperty,\n    AST_ClassProperty,\n    AST_ClassStaticBlock,\n    AST_ConciseMethod,\n    AST_PrivateIn,\n    AST_PrivateGetter,\n    AST_PrivateMethod,\n    AST_PrivateSetter,\n    AST_Conditional,\n    AST_Const,\n    AST_Continue,\n    AST_Debugger,\n    AST_Default,\n    AST_DefaultAssign,\n    AST_DefClass,\n    AST_Definitions,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DotHash,\n    AST_EmptyStatement,\n    AST_Expansion,\n    AST_Export,\n    AST_False,\n    AST_Finally,\n    AST_For,\n    AST_ForIn,\n    AST_ForOf,\n    AST_Function,\n    AST_Hole,\n    AST_If,\n    AST_Import,\n    AST_ImportMeta,\n    AST_IterationStatement,\n    AST_Label,\n    AST_LabeledStatement,\n    AST_LabelRef,\n    AST_Let,\n    AST_NameMapping,\n    AST_New,\n    AST_NewTarget,\n    AST_Node,\n    AST_Null,\n    AST_Number,\n    AST_Object,\n    AST_ObjectGetter,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_ObjectSetter,\n    AST_PrefixedTemplateString,\n    AST_PropAccess,\n    AST_RegExp,\n    AST_Return,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_String,\n    AST_Sub,\n    AST_Super,\n    AST_Switch,\n    AST_SymbolCatch,\n    AST_SymbolClass,\n    AST_SymbolClassProperty,\n    AST_SymbolConst,\n    AST_SymbolDeclaration,\n    AST_SymbolDefClass,\n    AST_SymbolDefun,\n    AST_SymbolExport,\n    AST_SymbolExportForeign,\n    AST_SymbolFunarg,\n    AST_SymbolImport,\n    AST_SymbolImportForeign,\n    AST_SymbolLambda,\n    AST_SymbolLet,\n    AST_SymbolMethod,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_This,\n    AST_SymbolPrivateProperty,\n    AST_Throw,\n    AST_Token,\n    AST_Toplevel,\n    AST_True,\n    AST_Try,\n    AST_TryBlock,\n    AST_UnaryPostfix,\n    AST_UnaryPrefix,\n    AST_Var,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n    _INLINE,\n    _NOINLINE,\n    _PURE,\n    _KEY\n} from \"./ast.js\";\n\nvar LATEST_RAW = \"\";  // Only used for numbers and template strings\nvar TEMPLATE_RAWS = new Map();  // Raw template strings\n\nvar KEYWORDS = \"break case catch class const continue debugger default delete do else export extends finally for function if in instanceof let new return switch throw try typeof var void while with\";\nvar KEYWORDS_ATOM = \"false null true\";\nvar RESERVED_WORDS = \"enum import super this \" + KEYWORDS_ATOM + \" \" + KEYWORDS;\nvar ALL_RESERVED_WORDS = \"implements interface package private protected public static \" + RESERVED_WORDS;\nvar KEYWORDS_BEFORE_EXPRESSION = \"return new delete throw else case yield await\";\n\nKEYWORDS = makePredicate(KEYWORDS);\nRESERVED_WORDS = makePredicate(RESERVED_WORDS);\nKEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION);\nKEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM);\nALL_RESERVED_WORDS = makePredicate(ALL_RESERVED_WORDS);\n\nvar OPERATOR_CHARS = makePredicate(characters(\"+-*&%=<>!?|~^\"));\n\nvar RE_NUM_LITERAL = /[0-9a-f]/i;\nvar RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;\nvar RE_OCT_NUMBER = /^0[0-7]+$/;\nvar RE_ES6_OCT_NUMBER = /^0o[0-7]+$/i;\nvar RE_BIN_NUMBER = /^0b[01]+$/i;\nvar RE_DEC_NUMBER = /^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i;\nvar RE_BIG_INT = /^(0[xob])?[0-9a-f]+n$/i;\n\nvar OPERATORS = makePredicate([\n    \"in\",\n    \"instanceof\",\n    \"typeof\",\n    \"new\",\n    \"void\",\n    \"delete\",\n    \"++\",\n    \"--\",\n    \"+\",\n    \"-\",\n    \"!\",\n    \"~\",\n    \"&\",\n    \"|\",\n    \"^\",\n    \"*\",\n    \"**\",\n    \"/\",\n    \"%\",\n    \">>\",\n    \"<<\",\n    \">>>\",\n    \"<\",\n    \">\",\n    \"<=\",\n    \">=\",\n    \"==\",\n    \"===\",\n    \"!=\",\n    \"!==\",\n    \"?\",\n    \"=\",\n    \"+=\",\n    \"-=\",\n    \"||=\",\n    \"&&=\",\n    \"??=\",\n    \"/=\",\n    \"*=\",\n    \"**=\",\n    \"%=\",\n    \">>=\",\n    \"<<=\",\n    \">>>=\",\n    \"|=\",\n    \"^=\",\n    \"&=\",\n    \"&&\",\n    \"??\",\n    \"||\",\n]);\n\nvar WHITESPACE_CHARS = makePredicate(characters(\" \\u00a0\\n\\r\\t\\f\\u000b\\u200b\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\uFEFF\"));\n\nvar NEWLINE_CHARS = makePredicate(characters(\"\\n\\r\\u2028\\u2029\"));\n\nvar PUNC_AFTER_EXPRESSION = makePredicate(characters(\";]),:\"));\n\nvar PUNC_BEFORE_EXPRESSION = makePredicate(characters(\"[{(,;:\"));\n\nvar PUNC_CHARS = makePredicate(characters(\"[]{}(),;:\"));\n\n/* -----[ Tokenizer ]----- */\n\n// surrogate safe regexps adapted from https://github.com/mathiasbynens/unicode-8.0.0/tree/89b412d8a71ecca9ed593d9e9fa073ab64acfebe/Binary_Property\nvar UNICODE = {\n    ID_Start: /[$A-Z_a-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]/,\n    ID_Continue: /(?:[$0-9A-Z_a-z\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B4\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF])+/,\n};\n\ntry {\n    UNICODE = {\n        // https://262.ecma-international.org/13.0/#prod-IdentifierStartChar\n        // $, _, ID_Start\n        ID_Start: new RegExp(\"[_$\\\\p{ID_Start}]\", \"u\"),\n        // https://262.ecma-international.org/13.0/#prod-IdentifierPartChar\n        // $, zero-width-joiner, zero-width-non-joiner, ID_Continue\n        ID_Continue: new RegExp(\"[$\\\\u200C\\\\u200D\\\\p{ID_Continue}]+\", \"u\"),\n    };\n} catch(e) {\n    // Could not use modern JS \\p{...}. UNICODE is already defined above so let's continue\n}\n\nfunction get_full_char(str, pos) {\n    if (is_surrogate_pair_head(str.charCodeAt(pos))) {\n        if (is_surrogate_pair_tail(str.charCodeAt(pos + 1))) {\n            return str.charAt(pos) + str.charAt(pos + 1);\n        }\n    } else if (is_surrogate_pair_tail(str.charCodeAt(pos))) {\n        if (is_surrogate_pair_head(str.charCodeAt(pos - 1))) {\n            return str.charAt(pos - 1) + str.charAt(pos);\n        }\n    }\n    return str.charAt(pos);\n}\n\nfunction get_full_char_code(str, pos) {\n    // https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates\n    if (is_surrogate_pair_head(str.charCodeAt(pos))) {\n        return 0x10000 + (str.charCodeAt(pos) - 0xd800 << 10) + str.charCodeAt(pos + 1) - 0xdc00;\n    }\n    return str.charCodeAt(pos);\n}\n\nfunction get_full_char_length(str) {\n    var surrogates = 0;\n\n    for (var i = 0; i < str.length; i++) {\n        if (is_surrogate_pair_head(str.charCodeAt(i)) && is_surrogate_pair_tail(str.charCodeAt(i + 1))) {\n            surrogates++;\n            i++;\n        }\n    }\n\n    return str.length - surrogates;\n}\n\nfunction from_char_code(code) {\n    // Based on https://github.com/mathiasbynens/String.fromCodePoint/blob/master/fromcodepoint.js\n    if (code > 0xFFFF) {\n        code -= 0x10000;\n        return (String.fromCharCode((code >> 10) + 0xD800) +\n            String.fromCharCode((code % 0x400) + 0xDC00));\n    }\n    return String.fromCharCode(code);\n}\n\nfunction is_surrogate_pair_head(code) {\n    return code >= 0xd800 && code <= 0xdbff;\n}\n\nfunction is_surrogate_pair_tail(code) {\n    return code >= 0xdc00 && code <= 0xdfff;\n}\n\nfunction is_digit(code) {\n    return code >= 48 && code <= 57;\n}\n\nfunction is_identifier_start(ch) {\n    return UNICODE.ID_Start.test(ch);\n}\n\nfunction is_identifier_char(ch) {\n    return UNICODE.ID_Continue.test(ch);\n}\n\nconst BASIC_IDENT = /^[a-z_$][a-z0-9_$]*$/i;\n\nfunction is_basic_identifier_string(str) {\n    return BASIC_IDENT.test(str);\n}\n\nfunction is_identifier_string(str, allow_surrogates) {\n    if (BASIC_IDENT.test(str)) {\n        return true;\n    }\n    if (!allow_surrogates && /[\\ud800-\\udfff]/.test(str)) {\n        return false;\n    }\n    var match = UNICODE.ID_Start.exec(str);\n    if (!match || match.index !== 0) {\n        return false;\n    }\n\n    str = str.slice(match[0].length);\n    if (!str) {\n        return true;\n    }\n\n    match = UNICODE.ID_Continue.exec(str);\n    return !!match && match[0].length === str.length;\n}\n\nfunction parse_js_number(num, allow_e = true) {\n    if (!allow_e && num.includes(\"e\")) {\n        return NaN;\n    }\n    if (RE_HEX_NUMBER.test(num)) {\n        return parseInt(num.substr(2), 16);\n    } else if (RE_OCT_NUMBER.test(num)) {\n        return parseInt(num.substr(1), 8);\n    } else if (RE_ES6_OCT_NUMBER.test(num)) {\n        return parseInt(num.substr(2), 8);\n    } else if (RE_BIN_NUMBER.test(num)) {\n        return parseInt(num.substr(2), 2);\n    } else if (RE_DEC_NUMBER.test(num)) {\n        return parseFloat(num);\n    } else {\n        var val = parseFloat(num);\n        if (val == num) return val;\n    }\n}\n\nclass JS_Parse_Error extends Error {\n    constructor(message, filename, line, col, pos) {\n        super();\n\n        this.name = \"SyntaxError\";\n        this.message = message;\n        this.filename = filename;\n        this.line = line;\n        this.col = col;\n        this.pos = pos;\n    }\n}\n\nfunction js_error(message, filename, line, col, pos) {\n    throw new JS_Parse_Error(message, filename, line, col, pos);\n}\n\nfunction is_token(token, type, val) {\n    return token.type == type && (val == null || token.value == val);\n}\n\nvar EX_EOF = {};\n\nfunction tokenizer($TEXT, filename, html5_comments, shebang) {\n    var S = {\n        text            : $TEXT,\n        filename        : filename,\n        pos             : 0,\n        tokpos          : 0,\n        line            : 1,\n        tokline         : 0,\n        col             : 0,\n        tokcol          : 0,\n        newline_before  : false,\n        regex_allowed   : false,\n        brace_counter   : 0,\n        template_braces : [],\n        comments_before : [],\n        directives      : {},\n        directive_stack : []\n    };\n\n    function peek() { return get_full_char(S.text, S.pos); }\n\n    // Used because parsing ?. involves a lookahead for a digit\n    function is_option_chain_op() {\n        const must_be_dot = S.text.charCodeAt(S.pos + 1) === 46;\n        if (!must_be_dot) return false;\n\n        const cannot_be_digit = S.text.charCodeAt(S.pos + 2);\n        return cannot_be_digit < 48 || cannot_be_digit > 57;\n    }\n\n    function next(signal_eof, in_string) {\n        var ch = get_full_char(S.text, S.pos++);\n        if (signal_eof && !ch)\n            throw EX_EOF;\n        if (NEWLINE_CHARS.has(ch)) {\n            S.newline_before = S.newline_before || !in_string;\n            ++S.line;\n            S.col = 0;\n            if (ch == \"\\r\" && peek() == \"\\n\") {\n                // treat a \\r\\n sequence as a single \\n\n                ++S.pos;\n                ch = \"\\n\";\n            }\n        } else {\n            if (ch.length > 1) {\n                ++S.pos;\n                ++S.col;\n            }\n            ++S.col;\n        }\n        return ch;\n    }\n\n    function forward(i) {\n        while (i--) next();\n    }\n\n    function looking_at(str) {\n        return S.text.substr(S.pos, str.length) == str;\n    }\n\n    function find_eol() {\n        var text = S.text;\n        for (var i = S.pos, n = S.text.length; i < n; ++i) {\n            var ch = text[i];\n            if (NEWLINE_CHARS.has(ch))\n                return i;\n        }\n        return -1;\n    }\n\n    function find(what, signal_eof) {\n        var pos = S.text.indexOf(what, S.pos);\n        if (signal_eof && pos == -1) throw EX_EOF;\n        return pos;\n    }\n\n    function start_token() {\n        S.tokline = S.line;\n        S.tokcol = S.col;\n        S.tokpos = S.pos;\n    }\n\n    var prev_was_dot = false;\n    var previous_token = null;\n    function token(type, value, is_comment) {\n        S.regex_allowed = ((type == \"operator\" && !UNARY_POSTFIX.has(value)) ||\n                           (type == \"keyword\" && KEYWORDS_BEFORE_EXPRESSION.has(value)) ||\n                           (type == \"punc\" && PUNC_BEFORE_EXPRESSION.has(value))) ||\n                           (type == \"arrow\");\n        if (type == \"punc\" && (value == \".\" || value == \"?.\")) {\n            prev_was_dot = true;\n        } else if (!is_comment) {\n            prev_was_dot = false;\n        }\n        const line     = S.tokline;\n        const col      = S.tokcol;\n        const pos      = S.tokpos;\n        const nlb      = S.newline_before;\n        const file     = filename;\n        let comments_before = [];\n        let comments_after  = [];\n\n        if (!is_comment) {\n            comments_before = S.comments_before;\n            comments_after = S.comments_before = [];\n        }\n        S.newline_before = false;\n        const tok = new AST_Token(type, value, line, col, pos, nlb, comments_before, comments_after, file);\n\n        if (!is_comment) previous_token = tok;\n        return tok;\n    }\n\n    function skip_whitespace() {\n        while (WHITESPACE_CHARS.has(peek()))\n            next();\n    }\n\n    function read_while(pred) {\n        var ret = \"\", ch, i = 0;\n        while ((ch = peek()) && pred(ch, i++))\n            ret += next();\n        return ret;\n    }\n\n    function parse_error(err) {\n        js_error(err, filename, S.tokline, S.tokcol, S.tokpos);\n    }\n\n    function read_num(prefix) {\n        var has_e = false, after_e = false, has_x = false, has_dot = prefix == \".\", is_big_int = false, numeric_separator = false;\n        var num = read_while(function(ch, i) {\n            if (is_big_int) return false;\n\n            var code = ch.charCodeAt(0);\n            switch (code) {\n              case 95: // _\n                return (numeric_separator = true);\n              case 98: case 66: // bB\n                return (has_x = true); // Can occur in hex sequence, don't return false yet\n              case 111: case 79: // oO\n              case 120: case 88: // xX\n                return has_x ? false : (has_x = true);\n              case 101: case 69: // eE\n                return has_x ? true : has_e ? false : (has_e = after_e = true);\n              case 45: // -\n                return after_e || (i == 0 && !prefix);\n              case 43: // +\n                return after_e;\n              case (after_e = false, 46): // .\n                return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;\n            }\n\n            if (ch === \"n\") {\n                is_big_int = true;\n\n                return true;\n            }\n\n            return RE_NUM_LITERAL.test(ch);\n        });\n        if (prefix) num = prefix + num;\n\n        LATEST_RAW = num;\n\n        if (RE_OCT_NUMBER.test(num) && next_token.has_directive(\"use strict\")) {\n            parse_error(\"Legacy octal literals are not allowed in strict mode\");\n        }\n        if (numeric_separator) {\n            if (num.endsWith(\"_\")) {\n                parse_error(\"Numeric separators are not allowed at the end of numeric literals\");\n            } else if (num.includes(\"__\")) {\n                parse_error(\"Only one underscore is allowed as numeric separator\");\n            }\n            num = num.replace(/_/g, \"\");\n        }\n        if (num.endsWith(\"n\")) {\n            const without_n = num.slice(0, -1);\n            const allow_e = RE_HEX_NUMBER.test(without_n);\n            const valid = parse_js_number(without_n, allow_e);\n            if (!has_dot && RE_BIG_INT.test(num) && !isNaN(valid))\n                return token(\"big_int\", without_n);\n            parse_error(\"Invalid or unexpected token\");\n        }\n        var valid = parse_js_number(num);\n        if (!isNaN(valid)) {\n            return token(\"num\", valid);\n        } else {\n            parse_error(\"Invalid syntax: \" + num);\n        }\n    }\n\n    function is_octal(ch) {\n        return ch >= \"0\" && ch <= \"7\";\n    }\n\n    function read_escaped_char(in_string, strict_hex, template_string) {\n        var ch = next(true, in_string);\n        switch (ch.charCodeAt(0)) {\n          case 110 : return \"\\n\";\n          case 114 : return \"\\r\";\n          case 116 : return \"\\t\";\n          case 98  : return \"\\b\";\n          case 118 : return \"\\u000b\"; // \\v\n          case 102 : return \"\\f\";\n          case 120 : return String.fromCharCode(hex_bytes(2, strict_hex)); // \\x\n          case 117 : // \\u\n            if (peek() == \"{\") {\n                next(true);\n                if (peek() === \"}\")\n                    parse_error(\"Expecting hex-character between {}\");\n                while (peek() == \"0\") next(true); // No significance\n                var result, length = find(\"}\", true) - S.pos;\n                // Avoid 32 bit integer overflow (1 << 32 === 1)\n                // We know first character isn't 0 and thus out of range anyway\n                if (length > 6 || (result = hex_bytes(length, strict_hex)) > 0x10FFFF) {\n                    parse_error(\"Unicode reference out of bounds\");\n                }\n                next(true);\n                return from_char_code(result);\n            }\n            return String.fromCharCode(hex_bytes(4, strict_hex));\n          case 10  : return \"\"; // newline\n          case 13  :            // \\r\n            if (peek() == \"\\n\") { // DOS newline\n                next(true, in_string);\n                return \"\";\n            }\n        }\n        if (is_octal(ch)) {\n            if (template_string && strict_hex) {\n                const represents_null_character = ch === \"0\" && !is_octal(peek());\n                if (!represents_null_character) {\n                    parse_error(\"Octal escape sequences are not allowed in template strings\");\n                }\n            }\n            return read_octal_escape_sequence(ch, strict_hex);\n        }\n        return ch;\n    }\n\n    function read_octal_escape_sequence(ch, strict_octal) {\n        // Read\n        var p = peek();\n        if (p >= \"0\" && p <= \"7\") {\n            ch += next(true);\n            if (ch[0] <= \"3\" && (p = peek()) >= \"0\" && p <= \"7\")\n                ch += next(true);\n        }\n\n        // Parse\n        if (ch === \"0\") return \"\\0\";\n        if (ch.length > 0 && next_token.has_directive(\"use strict\") && strict_octal)\n            parse_error(\"Legacy octal escape sequences are not allowed in strict mode\");\n        return String.fromCharCode(parseInt(ch, 8));\n    }\n\n    function hex_bytes(n, strict_hex) {\n        var num = 0;\n        for (; n > 0; --n) {\n            if (!strict_hex && isNaN(parseInt(peek(), 16))) {\n                return parseInt(num, 16) || \"\";\n            }\n            var digit = next(true);\n            if (isNaN(parseInt(digit, 16)))\n                parse_error(\"Invalid hex-character pattern in string\");\n            num += digit;\n        }\n        return parseInt(num, 16);\n    }\n\n    var read_string = with_eof_error(\"Unterminated string constant\", function() {\n        const start_pos = S.pos;\n        var quote = next(), ret = [];\n        for (;;) {\n            var ch = next(true, true);\n            if (ch == \"\\\\\") ch = read_escaped_char(true, true);\n            else if (ch == \"\\r\" || ch == \"\\n\") parse_error(\"Unterminated string constant\");\n            else if (ch == quote) break;\n            ret.push(ch);\n        }\n        var tok = token(\"string\", ret.join(\"\"));\n        LATEST_RAW = S.text.slice(start_pos, S.pos);\n        tok.quote = quote;\n        return tok;\n    });\n\n    var read_template_characters = with_eof_error(\"Unterminated template\", function(begin) {\n        if (begin) {\n            S.template_braces.push(S.brace_counter);\n        }\n        var content = \"\", raw = \"\", ch, tok;\n        next(true, true);\n        while ((ch = next(true, true)) != \"`\") {\n            if (ch == \"\\r\") {\n                if (peek() == \"\\n\") ++S.pos;\n                ch = \"\\n\";\n            } else if (ch == \"$\" && peek() == \"{\") {\n                next(true, true);\n                S.brace_counter++;\n                tok = token(begin ? \"template_head\" : \"template_substitution\", content);\n                TEMPLATE_RAWS.set(tok, raw);\n                tok.template_end = false;\n                return tok;\n            }\n\n            raw += ch;\n            if (ch == \"\\\\\") {\n                var tmp = S.pos;\n                var prev_is_tag = previous_token && (previous_token.type === \"name\" || previous_token.type === \"punc\" && (previous_token.value === \")\" || previous_token.value === \"]\"));\n                ch = read_escaped_char(true, !prev_is_tag, true);\n                raw += S.text.substr(tmp, S.pos - tmp);\n            }\n\n            content += ch;\n        }\n        S.template_braces.pop();\n        tok = token(begin ? \"template_head\" : \"template_substitution\", content);\n        TEMPLATE_RAWS.set(tok, raw);\n        tok.template_end = true;\n        return tok;\n    });\n\n    function skip_line_comment(type) {\n        var regex_allowed = S.regex_allowed;\n        var i = find_eol(), ret;\n        if (i == -1) {\n            ret = S.text.substr(S.pos);\n            S.pos = S.text.length;\n        } else {\n            ret = S.text.substring(S.pos, i);\n            S.pos = i;\n        }\n        S.col = S.tokcol + (S.pos - S.tokpos);\n        S.comments_before.push(token(type, ret, true));\n        S.regex_allowed = regex_allowed;\n        return next_token;\n    }\n\n    var skip_multiline_comment = with_eof_error(\"Unterminated multiline comment\", function() {\n        var regex_allowed = S.regex_allowed;\n        var i = find(\"*/\", true);\n        var text = S.text.substring(S.pos, i).replace(/\\r\\n|\\r|\\u2028|\\u2029/g, \"\\n\");\n        // update stream position\n        forward(get_full_char_length(text) /* text length doesn't count \\r\\n as 2 char while S.pos - i does */ + 2);\n        S.comments_before.push(token(\"comment2\", text, true));\n        S.newline_before = S.newline_before || text.includes(\"\\n\");\n        S.regex_allowed = regex_allowed;\n        return next_token;\n    });\n\n    var read_name = with_eof_error(\"Unterminated identifier name\", function() {\n        var name = [], ch, escaped = false;\n        var read_escaped_identifier_char = function() {\n            escaped = true;\n            next();\n            if (peek() !== \"u\") {\n                parse_error(\"Expecting UnicodeEscapeSequence -- uXXXX or u{XXXX}\");\n            }\n            return read_escaped_char(false, true);\n        };\n\n        // Read first character (ID_Start)\n        if ((ch = peek()) === \"\\\\\") {\n            ch = read_escaped_identifier_char();\n            if (!is_identifier_start(ch)) {\n                parse_error(\"First identifier char is an invalid identifier char\");\n            }\n        } else if (is_identifier_start(ch)) {\n            next();\n        } else {\n            return \"\";\n        }\n\n        name.push(ch);\n\n        // Read ID_Continue\n        while ((ch = peek()) != null) {\n            if ((ch = peek()) === \"\\\\\") {\n                ch = read_escaped_identifier_char();\n                if (!is_identifier_char(ch)) {\n                    parse_error(\"Invalid escaped identifier char\");\n                }\n            } else {\n                if (!is_identifier_char(ch)) {\n                    break;\n                }\n                next();\n            }\n            name.push(ch);\n        }\n        const name_str = name.join(\"\");\n        if (RESERVED_WORDS.has(name_str) && escaped) {\n            parse_error(\"Escaped characters are not allowed in keywords\");\n        }\n        return name_str;\n    });\n\n    var read_regexp = with_eof_error(\"Unterminated regular expression\", function(source) {\n        var prev_backslash = false, ch, in_class = false;\n        while ((ch = next(true))) if (NEWLINE_CHARS.has(ch)) {\n            parse_error(\"Unexpected line terminator\");\n        } else if (prev_backslash) {\n            source += \"\\\\\" + ch;\n            prev_backslash = false;\n        } else if (ch == \"[\") {\n            in_class = true;\n            source += ch;\n        } else if (ch == \"]\" && in_class) {\n            in_class = false;\n            source += ch;\n        } else if (ch == \"/\" && !in_class) {\n            break;\n        } else if (ch == \"\\\\\") {\n            prev_backslash = true;\n        } else {\n            source += ch;\n        }\n        const flags = read_name();\n        return token(\"regexp\", \"/\" + source + \"/\" + flags);\n    });\n\n    function read_operator(prefix) {\n        function grow(op) {\n            if (!peek()) return op;\n            var bigger = op + peek();\n            if (OPERATORS.has(bigger)) {\n                next();\n                return grow(bigger);\n            } else {\n                return op;\n            }\n        }\n        return token(\"operator\", grow(prefix || next()));\n    }\n\n    function handle_slash() {\n        next();\n        switch (peek()) {\n          case \"/\":\n            next();\n            return skip_line_comment(\"comment1\");\n          case \"*\":\n            next();\n            return skip_multiline_comment();\n        }\n        return S.regex_allowed ? read_regexp(\"\") : read_operator(\"/\");\n    }\n\n    function handle_eq_sign() {\n        next();\n        if (peek() === \">\") {\n            next();\n            return token(\"arrow\", \"=>\");\n        } else {\n            return read_operator(\"=\");\n        }\n    }\n\n    function handle_dot() {\n        next();\n        if (is_digit(peek().charCodeAt(0))) {\n            return read_num(\".\");\n        }\n        if (peek() === \".\") {\n            next();  // Consume second dot\n            next();  // Consume third dot\n            return token(\"expand\", \"...\");\n        }\n\n        return token(\"punc\", \".\");\n    }\n\n    function read_word() {\n        var word = read_name();\n        if (prev_was_dot) return token(\"name\", word);\n        return KEYWORDS_ATOM.has(word) ? token(\"atom\", word)\n            : !KEYWORDS.has(word) ? token(\"name\", word)\n            : OPERATORS.has(word) ? token(\"operator\", word)\n            : token(\"keyword\", word);\n    }\n\n    function read_private_word() {\n        next();\n        return token(\"privatename\", read_name());\n    }\n\n    function with_eof_error(eof_error, cont) {\n        return function(x) {\n            try {\n                return cont(x);\n            } catch(ex) {\n                if (ex === EX_EOF) parse_error(eof_error);\n                else throw ex;\n            }\n        };\n    }\n\n    function next_token(force_regexp) {\n        if (force_regexp != null)\n            return read_regexp(force_regexp);\n        if (shebang && S.pos == 0 && looking_at(\"#!\")) {\n            start_token();\n            forward(2);\n            skip_line_comment(\"comment5\");\n        }\n        for (;;) {\n            skip_whitespace();\n            start_token();\n            if (html5_comments) {\n                if (looking_at(\"<!--\")) {\n                    forward(4);\n                    skip_line_comment(\"comment3\");\n                    continue;\n                }\n                if (looking_at(\"-->\") && S.newline_before) {\n                    forward(3);\n                    skip_line_comment(\"comment4\");\n                    continue;\n                }\n            }\n            var ch = peek();\n            if (!ch) return token(\"eof\");\n            var code = ch.charCodeAt(0);\n            switch (code) {\n              case 34: case 39: return read_string();\n              case 46: return handle_dot();\n              case 47: {\n                  var tok = handle_slash();\n                  if (tok === next_token) continue;\n                  return tok;\n              }\n              case 61: return handle_eq_sign();\n              case 63: {\n                  if (!is_option_chain_op()) break;  // Handled below\n\n                  next(); // ?\n                  next(); // .\n\n                  return token(\"punc\", \"?.\");\n              }\n              case 96: return read_template_characters(true);\n              case 123:\n                S.brace_counter++;\n                break;\n              case 125:\n                S.brace_counter--;\n                if (S.template_braces.length > 0\n                    && S.template_braces[S.template_braces.length - 1] === S.brace_counter)\n                    return read_template_characters(false);\n                break;\n            }\n            if (is_digit(code)) return read_num();\n            if (PUNC_CHARS.has(ch)) return token(\"punc\", next());\n            if (OPERATOR_CHARS.has(ch)) return read_operator();\n            if (code == 92 || is_identifier_start(ch)) return read_word();\n            if (code == 35) return read_private_word();\n            break;\n        }\n        parse_error(\"Unexpected character '\" + ch + \"'\");\n    }\n\n    next_token.next = next;\n    next_token.peek = peek;\n\n    next_token.context = function(nc) {\n        if (nc) S = nc;\n        return S;\n    };\n\n    next_token.add_directive = function(directive) {\n        S.directive_stack[S.directive_stack.length - 1].push(directive);\n\n        if (S.directives[directive] === undefined) {\n            S.directives[directive] = 1;\n        } else {\n            S.directives[directive]++;\n        }\n    };\n\n    next_token.push_directives_stack = function() {\n        S.directive_stack.push([]);\n    };\n\n    next_token.pop_directives_stack = function() {\n        var directives = S.directive_stack[S.directive_stack.length - 1];\n\n        for (var i = 0; i < directives.length; i++) {\n            S.directives[directives[i]]--;\n        }\n\n        S.directive_stack.pop();\n    };\n\n    next_token.has_directive = function(directive) {\n        return S.directives[directive] > 0;\n    };\n\n    return next_token;\n\n}\n\n/* -----[ Parser (constants) ]----- */\n\nvar UNARY_PREFIX = makePredicate([\n    \"typeof\",\n    \"void\",\n    \"delete\",\n    \"--\",\n    \"++\",\n    \"!\",\n    \"~\",\n    \"-\",\n    \"+\"\n]);\n\nvar UNARY_POSTFIX = makePredicate([ \"--\", \"++\" ]);\n\nvar ASSIGNMENT = makePredicate([ \"=\", \"+=\", \"-=\", \"??=\", \"&&=\", \"||=\", \"/=\", \"*=\", \"**=\", \"%=\", \">>=\", \"<<=\", \">>>=\", \"|=\", \"^=\", \"&=\" ]);\n\nvar LOGICAL_ASSIGNMENT = makePredicate([ \"??=\", \"&&=\", \"||=\" ]);\n\nvar PRECEDENCE = (function(a, ret) {\n    for (var i = 0; i < a.length; ++i) {\n        var b = a[i];\n        for (var j = 0; j < b.length; ++j) {\n            ret[b[j]] = i + 1;\n        }\n    }\n    return ret;\n})(\n    [\n        [\"||\"],\n        [\"??\"],\n        [\"&&\"],\n        [\"|\"],\n        [\"^\"],\n        [\"&\"],\n        [\"==\", \"===\", \"!=\", \"!==\"],\n        [\"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"],\n        [\">>\", \"<<\", \">>>\"],\n        [\"+\", \"-\"],\n        [\"*\", \"/\", \"%\"],\n        [\"**\"]\n    ],\n    {}\n);\n\nvar ATOMIC_START_TOKEN = makePredicate([ \"atom\", \"num\", \"big_int\", \"string\", \"regexp\", \"name\"]);\n\n/* -----[ Parser ]----- */\n\nfunction parse($TEXT, options) {\n    // maps start tokens to count of comments found outside of their parens\n    // Example: /* I count */ ( /* I don't */ foo() )\n    // Useful because comments_before property of call with parens outside\n    // contains both comments inside and outside these parens. Used to find the\n    // right #__PURE__ comments for an expression\n    const outer_comments_before_counts = new WeakMap();\n\n    options = defaults(options, {\n        bare_returns   : false,\n        ecma           : null,  // Legacy\n        expression     : false,\n        filename       : null,\n        html5_comments : true,\n        module         : false,\n        shebang        : true,\n        strict         : false,\n        toplevel       : null,\n    }, true);\n\n    var S = {\n        input         : (typeof $TEXT == \"string\"\n                         ? tokenizer($TEXT, options.filename,\n                                     options.html5_comments, options.shebang)\n                         : $TEXT),\n        token         : null,\n        prev          : null,\n        peeked        : null,\n        in_function   : 0,\n        in_async      : -1,\n        in_generator  : -1,\n        in_directives : true,\n        in_loop       : 0,\n        labels        : []\n    };\n\n    S.token = next();\n\n    function is(type, value) {\n        return is_token(S.token, type, value);\n    }\n\n    function peek() { return S.peeked || (S.peeked = S.input()); }\n\n    function next() {\n        S.prev = S.token;\n\n        if (!S.peeked) peek();\n        S.token = S.peeked;\n        S.peeked = null;\n        S.in_directives = S.in_directives && (\n            S.token.type == \"string\" || is(\"punc\", \";\")\n        );\n        return S.token;\n    }\n\n    function prev() {\n        return S.prev;\n    }\n\n    function croak(msg, line, col, pos) {\n        var ctx = S.input.context();\n        js_error(msg,\n                 ctx.filename,\n                 line != null ? line : ctx.tokline,\n                 col != null ? col : ctx.tokcol,\n                 pos != null ? pos : ctx.tokpos);\n    }\n\n    function token_error(token, msg) {\n        croak(msg, token.line, token.col);\n    }\n\n    function unexpected(token) {\n        if (token == null)\n            token = S.token;\n        token_error(token, \"Unexpected token: \" + token.type + \" (\" + token.value + \")\");\n    }\n\n    function expect_token(type, val) {\n        if (is(type, val)) {\n            return next();\n        }\n        token_error(S.token, \"Unexpected token \" + S.token.type + \" «\" + S.token.value + \"»\" + \", expected \" + type + \" «\" + val + \"»\");\n    }\n\n    function expect(punc) { return expect_token(\"punc\", punc); }\n\n    function has_newline_before(token) {\n        return token.nlb || !token.comments_before.every((comment) => !comment.nlb);\n    }\n\n    function can_insert_semicolon() {\n        return !options.strict\n            && (is(\"eof\") || is(\"punc\", \"}\") || has_newline_before(S.token));\n    }\n\n    function is_in_generator() {\n        return S.in_generator === S.in_function;\n    }\n\n    function is_in_async() {\n        return S.in_async === S.in_function;\n    }\n\n    function can_await() {\n        return (\n            S.in_async === S.in_function\n            || S.in_function === 0 && S.input.has_directive(\"use strict\")\n        );\n    }\n\n    function semicolon(optional) {\n        if (is(\"punc\", \";\")) next();\n        else if (!optional && !can_insert_semicolon()) unexpected();\n    }\n\n    function parenthesised() {\n        expect(\"(\");\n        var exp = expression(true);\n        expect(\")\");\n        return exp;\n    }\n\n    function embed_tokens(parser) {\n        return function _embed_tokens_wrapper(...args) {\n            const start = S.token;\n            const expr = parser(...args);\n            expr.start = start;\n            expr.end = prev();\n            return expr;\n        };\n    }\n\n    function handle_regexp() {\n        if (is(\"operator\", \"/\") || is(\"operator\", \"/=\")) {\n            S.peeked = null;\n            S.token = S.input(S.token.value.substr(1)); // force regexp\n        }\n    }\n\n    var statement = embed_tokens(function statement(is_export_default, is_for_body, is_if_body) {\n        handle_regexp();\n        switch (S.token.type) {\n          case \"string\":\n            if (S.in_directives) {\n                var token = peek();\n                if (!LATEST_RAW.includes(\"\\\\\")\n                    && (is_token(token, \"punc\", \";\")\n                        || is_token(token, \"punc\", \"}\")\n                        || has_newline_before(token)\n                        || is_token(token, \"eof\"))) {\n                    S.input.add_directive(S.token.value);\n                } else {\n                    S.in_directives = false;\n                }\n            }\n            var dir = S.in_directives, stat = simple_statement();\n            return dir && stat.body instanceof AST_String ? new AST_Directive(stat.body) : stat;\n          case \"template_head\":\n          case \"num\":\n          case \"big_int\":\n          case \"regexp\":\n          case \"operator\":\n          case \"atom\":\n            return simple_statement();\n\n          case \"name\":\n          case \"privatename\":\n            if(is(\"privatename\") && !S.in_class)\n                croak(\"Private field must be used in an enclosing class\");\n\n            if (S.token.value == \"async\" && is_token(peek(), \"keyword\", \"function\")) {\n                next();\n                next();\n                if (is_for_body) {\n                    croak(\"functions are not allowed as the body of a loop\");\n                }\n                return function_(AST_Defun, false, true, is_export_default);\n            }\n            if (S.token.value == \"import\" && !is_token(peek(), \"punc\", \"(\") && !is_token(peek(), \"punc\", \".\")) {\n                next();\n                var node = import_statement();\n                semicolon();\n                return node;\n            }\n            return is_token(peek(), \"punc\", \":\")\n                ? labeled_statement()\n                : simple_statement();\n\n          case \"punc\":\n            switch (S.token.value) {\n              case \"{\":\n                return new AST_BlockStatement({\n                    start : S.token,\n                    body  : block_(),\n                    end   : prev()\n                });\n              case \"[\":\n              case \"(\":\n                return simple_statement();\n              case \";\":\n                S.in_directives = false;\n                next();\n                return new AST_EmptyStatement();\n              default:\n                unexpected();\n            }\n\n          case \"keyword\":\n            switch (S.token.value) {\n              case \"break\":\n                next();\n                return break_cont(AST_Break);\n\n              case \"continue\":\n                next();\n                return break_cont(AST_Continue);\n\n              case \"debugger\":\n                next();\n                semicolon();\n                return new AST_Debugger();\n\n              case \"do\":\n                next();\n                var body = in_loop(statement);\n                expect_token(\"keyword\", \"while\");\n                var condition = parenthesised();\n                semicolon(true);\n                return new AST_Do({\n                    body      : body,\n                    condition : condition\n                });\n\n              case \"while\":\n                next();\n                return new AST_While({\n                    condition : parenthesised(),\n                    body      : in_loop(function() { return statement(false, true); })\n                });\n\n              case \"for\":\n                next();\n                return for_();\n\n              case \"class\":\n                next();\n                if (is_for_body) {\n                    croak(\"classes are not allowed as the body of a loop\");\n                }\n                if (is_if_body) {\n                    croak(\"classes are not allowed as the body of an if\");\n                }\n                return class_(AST_DefClass, is_export_default);\n\n              case \"function\":\n                next();\n                if (is_for_body) {\n                    croak(\"functions are not allowed as the body of a loop\");\n                }\n                return function_(AST_Defun, false, false, is_export_default);\n\n              case \"if\":\n                next();\n                return if_();\n\n              case \"return\":\n                if (S.in_function == 0 && !options.bare_returns)\n                    croak(\"'return' outside of function\");\n                next();\n                var value = null;\n                if (is(\"punc\", \";\")) {\n                    next();\n                } else if (!can_insert_semicolon()) {\n                    value = expression(true);\n                    semicolon();\n                }\n                return new AST_Return({\n                    value: value\n                });\n\n              case \"switch\":\n                next();\n                return new AST_Switch({\n                    expression : parenthesised(),\n                    body       : in_loop(switch_body_)\n                });\n\n              case \"throw\":\n                next();\n                if (has_newline_before(S.token))\n                    croak(\"Illegal newline after 'throw'\");\n                var value = expression(true);\n                semicolon();\n                return new AST_Throw({\n                    value: value\n                });\n\n              case \"try\":\n                next();\n                return try_();\n\n              case \"var\":\n                next();\n                var node = var_();\n                semicolon();\n                return node;\n\n              case \"let\":\n                next();\n                var node = let_();\n                semicolon();\n                return node;\n\n              case \"const\":\n                next();\n                var node = const_();\n                semicolon();\n                return node;\n\n              case \"with\":\n                if (S.input.has_directive(\"use strict\")) {\n                    croak(\"Strict mode may not include a with statement\");\n                }\n                next();\n                return new AST_With({\n                    expression : parenthesised(),\n                    body       : statement()\n                });\n\n              case \"export\":\n                if (!is_token(peek(), \"punc\", \"(\")) {\n                    next();\n                    var node = export_statement();\n                    if (is(\"punc\", \";\")) semicolon();\n                    return node;\n                }\n            }\n        }\n        unexpected();\n    });\n\n    function labeled_statement() {\n        var label = as_symbol(AST_Label);\n        if (label.name === \"await\" && is_in_async()) {\n            token_error(S.prev, \"await cannot be used as label inside async function\");\n        }\n        if (S.labels.some((l) => l.name === label.name)) {\n            // ECMA-262, 12.12: An ECMAScript program is considered\n            // syntactically incorrect if it contains a\n            // LabelledStatement that is enclosed by a\n            // LabelledStatement with the same Identifier as label.\n            croak(\"Label \" + label.name + \" defined twice\");\n        }\n        expect(\":\");\n        S.labels.push(label);\n        var stat = statement();\n        S.labels.pop();\n        if (!(stat instanceof AST_IterationStatement)) {\n            // check for `continue` that refers to this label.\n            // those should be reported as syntax errors.\n            // https://github.com/mishoo/UglifyJS2/issues/287\n            label.references.forEach(function(ref) {\n                if (ref instanceof AST_Continue) {\n                    ref = ref.label.start;\n                    croak(\"Continue label `\" + label.name + \"` refers to non-IterationStatement.\",\n                          ref.line, ref.col, ref.pos);\n                }\n            });\n        }\n        return new AST_LabeledStatement({ body: stat, label: label });\n    }\n\n    function simple_statement(tmp) {\n        return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) });\n    }\n\n    function break_cont(type) {\n        var label = null, ldef;\n        if (!can_insert_semicolon()) {\n            label = as_symbol(AST_LabelRef, true);\n        }\n        if (label != null) {\n            ldef = S.labels.find((l) => l.name === label.name);\n            if (!ldef)\n                croak(\"Undefined label \" + label.name);\n            label.thedef = ldef;\n        } else if (S.in_loop == 0)\n            croak(type.TYPE + \" not inside a loop or switch\");\n        semicolon();\n        var stat = new type({ label: label });\n        if (ldef) ldef.references.push(stat);\n        return stat;\n    }\n\n    function for_() {\n        var for_await_error = \"`for await` invalid in this context\";\n        var await_tok = S.token;\n        if (await_tok.type == \"name\" && await_tok.value == \"await\") {\n            if (!can_await()) {\n                token_error(await_tok, for_await_error);\n            }\n            next();\n        } else {\n            await_tok = false;\n        }\n        expect(\"(\");\n        var init = null;\n        if (!is(\"punc\", \";\")) {\n            init =\n                is(\"keyword\", \"var\") ? (next(), var_(true)) :\n                is(\"keyword\", \"let\") ? (next(), let_(true)) :\n                is(\"keyword\", \"const\") ? (next(), const_(true)) :\n                                       expression(true, true);\n            var is_in = is(\"operator\", \"in\");\n            var is_of = is(\"name\", \"of\");\n            if (await_tok && !is_of) {\n                token_error(await_tok, for_await_error);\n            }\n            if (is_in || is_of) {\n                if (init instanceof AST_Definitions) {\n                    if (init.definitions.length > 1)\n                        token_error(init.start, \"Only one variable declaration allowed in for..in loop\");\n                } else if (!(is_assignable(init) || (init = to_destructuring(init)) instanceof AST_Destructuring)) {\n                    token_error(init.start, \"Invalid left-hand side in for..in loop\");\n                }\n                next();\n                if (is_in) {\n                    return for_in(init);\n                } else {\n                    return for_of(init, !!await_tok);\n                }\n            }\n        } else if (await_tok) {\n            token_error(await_tok, for_await_error);\n        }\n        return regular_for(init);\n    }\n\n    function regular_for(init) {\n        expect(\";\");\n        var test = is(\"punc\", \";\") ? null : expression(true);\n        expect(\";\");\n        var step = is(\"punc\", \")\") ? null : expression(true);\n        expect(\")\");\n        return new AST_For({\n            init      : init,\n            condition : test,\n            step      : step,\n            body      : in_loop(function() { return statement(false, true); })\n        });\n    }\n\n    function for_of(init, is_await) {\n        var lhs = init instanceof AST_Definitions ? init.definitions[0].name : null;\n        var obj = expression(true);\n        expect(\")\");\n        return new AST_ForOf({\n            await  : is_await,\n            init   : init,\n            name   : lhs,\n            object : obj,\n            body   : in_loop(function() { return statement(false, true); })\n        });\n    }\n\n    function for_in(init) {\n        var obj = expression(true);\n        expect(\")\");\n        return new AST_ForIn({\n            init   : init,\n            object : obj,\n            body   : in_loop(function() { return statement(false, true); })\n        });\n    }\n\n    var arrow_function = function(start, argnames, is_async) {\n        if (has_newline_before(S.token)) {\n            croak(\"Unexpected newline before arrow (=>)\");\n        }\n\n        expect_token(\"arrow\", \"=>\");\n\n        var body = _function_body(is(\"punc\", \"{\"), false, is_async);\n\n        var end =\n            body instanceof Array && body.length ? body[body.length - 1].end :\n            body instanceof Array ? start :\n                body.end;\n\n        return new AST_Arrow({\n            start    : start,\n            end      : end,\n            async    : is_async,\n            argnames : argnames,\n            body     : body\n        });\n    };\n\n    var function_ = function(ctor, is_generator_property, is_async, is_export_default) {\n        var in_statement = ctor === AST_Defun;\n        var is_generator = is(\"operator\", \"*\");\n        if (is_generator) {\n            next();\n        }\n\n        var name = is(\"name\") ? as_symbol(in_statement ? AST_SymbolDefun : AST_SymbolLambda) : null;\n        if (in_statement && !name) {\n            if (is_export_default) {\n                ctor = AST_Function;\n            } else {\n                unexpected();\n            }\n        }\n\n        if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration))\n            unexpected(prev());\n\n        var args = [];\n        var body = _function_body(true, is_generator || is_generator_property, is_async, name, args);\n        return new ctor({\n            start : args.start,\n            end   : body.end,\n            is_generator: is_generator,\n            async : is_async,\n            name  : name,\n            argnames: args,\n            body  : body\n        });\n    };\n\n    class UsedParametersTracker {\n        constructor(is_parameter, strict, duplicates_ok = false) {\n            this.is_parameter = is_parameter;\n            this.duplicates_ok = duplicates_ok;\n            this.parameters = new Set();\n            this.duplicate = null;\n            this.default_assignment = false;\n            this.spread = false;\n            this.strict_mode = !!strict;\n        }\n        add_parameter(token) {\n            if (this.parameters.has(token.value)) {\n                if (this.duplicate === null) {\n                    this.duplicate = token;\n                }\n                this.check_strict();\n            } else {\n                this.parameters.add(token.value);\n                if (this.is_parameter) {\n                    switch (token.value) {\n                      case \"arguments\":\n                      case \"eval\":\n                      case \"yield\":\n                        if (this.strict_mode) {\n                            token_error(token, \"Unexpected \" + token.value + \" identifier as parameter inside strict mode\");\n                        }\n                        break;\n                      default:\n                        if (RESERVED_WORDS.has(token.value)) {\n                            unexpected();\n                        }\n                    }\n                }\n            }\n        }\n        mark_default_assignment(token) {\n            if (this.default_assignment === false) {\n                this.default_assignment = token;\n            }\n        }\n        mark_spread(token) {\n            if (this.spread === false) {\n                this.spread = token;\n            }\n        }\n        mark_strict_mode() {\n            this.strict_mode = true;\n        }\n        is_strict() {\n            return this.default_assignment !== false || this.spread !== false || this.strict_mode;\n        }\n        check_strict() {\n            if (this.is_strict() && this.duplicate !== null && !this.duplicates_ok) {\n                token_error(this.duplicate, \"Parameter \" + this.duplicate.value + \" was used already\");\n            }\n        }\n    }\n\n    function parameters(params) {\n        var used_parameters = new UsedParametersTracker(true, S.input.has_directive(\"use strict\"));\n\n        expect(\"(\");\n\n        while (!is(\"punc\", \")\")) {\n            var param = parameter(used_parameters);\n            params.push(param);\n\n            if (!is(\"punc\", \")\")) {\n                expect(\",\");\n            }\n\n            if (param instanceof AST_Expansion) {\n                break;\n            }\n        }\n\n        next();\n    }\n\n    function parameter(used_parameters, symbol_type) {\n        var param;\n        var expand = false;\n        if (used_parameters === undefined) {\n            used_parameters = new UsedParametersTracker(true, S.input.has_directive(\"use strict\"));\n        }\n        if (is(\"expand\", \"...\")) {\n            expand = S.token;\n            used_parameters.mark_spread(S.token);\n            next();\n        }\n        param = binding_element(used_parameters, symbol_type);\n\n        if (is(\"operator\", \"=\") && expand === false) {\n            used_parameters.mark_default_assignment(S.token);\n            next();\n            param = new AST_DefaultAssign({\n                start: param.start,\n                left: param,\n                operator: \"=\",\n                right: expression(false),\n                end: S.token\n            });\n        }\n\n        if (expand !== false) {\n            if (!is(\"punc\", \")\")) {\n                unexpected();\n            }\n            param = new AST_Expansion({\n                start: expand,\n                expression: param,\n                end: expand\n            });\n        }\n        used_parameters.check_strict();\n\n        return param;\n    }\n\n    function binding_element(used_parameters, symbol_type) {\n        var elements = [];\n        var first = true;\n        var is_expand = false;\n        var expand_token;\n        var first_token = S.token;\n        if (used_parameters === undefined) {\n            const strict = S.input.has_directive(\"use strict\");\n            const duplicates_ok = symbol_type === AST_SymbolVar;\n            used_parameters = new UsedParametersTracker(false, strict, duplicates_ok);\n        }\n        symbol_type = symbol_type === undefined ? AST_SymbolFunarg : symbol_type;\n        if (is(\"punc\", \"[\")) {\n            next();\n            while (!is(\"punc\", \"]\")) {\n                if (first) {\n                    first = false;\n                } else {\n                    expect(\",\");\n                }\n\n                if (is(\"expand\", \"...\")) {\n                    is_expand = true;\n                    expand_token = S.token;\n                    used_parameters.mark_spread(S.token);\n                    next();\n                }\n                if (is(\"punc\")) {\n                    switch (S.token.value) {\n                      case \",\":\n                        elements.push(new AST_Hole({\n                            start: S.token,\n                            end: S.token\n                        }));\n                        continue;\n                      case \"]\": // Trailing comma after last element\n                        break;\n                      case \"[\":\n                      case \"{\":\n                        elements.push(binding_element(used_parameters, symbol_type));\n                        break;\n                      default:\n                        unexpected();\n                    }\n                } else if (is(\"name\")) {\n                    used_parameters.add_parameter(S.token);\n                    elements.push(as_symbol(symbol_type));\n                } else {\n                    croak(\"Invalid function parameter\");\n                }\n                if (is(\"operator\", \"=\") && is_expand === false) {\n                    used_parameters.mark_default_assignment(S.token);\n                    next();\n                    elements[elements.length - 1] = new AST_DefaultAssign({\n                        start: elements[elements.length - 1].start,\n                        left: elements[elements.length - 1],\n                        operator: \"=\",\n                        right: expression(false),\n                        end: S.token\n                    });\n                }\n                if (is_expand) {\n                    if (!is(\"punc\", \"]\")) {\n                        croak(\"Rest element must be last element\");\n                    }\n                    elements[elements.length - 1] = new AST_Expansion({\n                        start: expand_token,\n                        expression: elements[elements.length - 1],\n                        end: expand_token\n                    });\n                }\n            }\n            expect(\"]\");\n            used_parameters.check_strict();\n            return new AST_Destructuring({\n                start: first_token,\n                names: elements,\n                is_array: true,\n                end: prev()\n            });\n        } else if (is(\"punc\", \"{\")) {\n            next();\n            while (!is(\"punc\", \"}\")) {\n                if (first) {\n                    first = false;\n                } else {\n                    expect(\",\");\n                }\n                if (is(\"expand\", \"...\")) {\n                    is_expand = true;\n                    expand_token = S.token;\n                    used_parameters.mark_spread(S.token);\n                    next();\n                }\n                if (is(\"name\") && (is_token(peek(), \"punc\") || is_token(peek(), \"operator\")) && [\",\", \"}\", \"=\"].includes(peek().value)) {\n                    used_parameters.add_parameter(S.token);\n                    var start = prev();\n                    var value = as_symbol(symbol_type);\n                    if (is_expand) {\n                        elements.push(new AST_Expansion({\n                            start: expand_token,\n                            expression: value,\n                            end: value.end,\n                        }));\n                    } else {\n                        elements.push(new AST_ObjectKeyVal({\n                            start: start,\n                            key: value.name,\n                            value: value,\n                            end: value.end,\n                        }));\n                    }\n                } else if (is(\"punc\", \"}\")) {\n                    continue; // Allow trailing hole\n                } else {\n                    var property_token = S.token;\n                    var property = as_property_name();\n                    if (property === null) {\n                        unexpected(prev());\n                    } else if (prev().type === \"name\" && !is(\"punc\", \":\")) {\n                        elements.push(new AST_ObjectKeyVal({\n                            start: prev(),\n                            key: property,\n                            value: new symbol_type({\n                                start: prev(),\n                                name: property,\n                                end: prev()\n                            }),\n                            end: prev()\n                        }));\n                    } else {\n                        expect(\":\");\n                        elements.push(new AST_ObjectKeyVal({\n                            start: property_token,\n                            quote: property_token.quote,\n                            key: property,\n                            value: binding_element(used_parameters, symbol_type),\n                            end: prev()\n                        }));\n                    }\n                }\n                if (is_expand) {\n                    if (!is(\"punc\", \"}\")) {\n                        croak(\"Rest element must be last element\");\n                    }\n                } else if (is(\"operator\", \"=\")) {\n                    used_parameters.mark_default_assignment(S.token);\n                    next();\n                    elements[elements.length - 1].value = new AST_DefaultAssign({\n                        start: elements[elements.length - 1].value.start,\n                        left: elements[elements.length - 1].value,\n                        operator: \"=\",\n                        right: expression(false),\n                        end: S.token\n                    });\n                }\n            }\n            expect(\"}\");\n            used_parameters.check_strict();\n            return new AST_Destructuring({\n                start: first_token,\n                names: elements,\n                is_array: false,\n                end: prev()\n            });\n        } else if (is(\"name\")) {\n            used_parameters.add_parameter(S.token);\n            return as_symbol(symbol_type);\n        } else {\n            croak(\"Invalid function parameter\");\n        }\n    }\n\n    function params_or_seq_(allow_arrows, maybe_sequence) {\n        var spread_token;\n        var invalid_sequence;\n        var trailing_comma;\n        var a = [];\n        expect(\"(\");\n        while (!is(\"punc\", \")\")) {\n            if (spread_token) unexpected(spread_token);\n            if (is(\"expand\", \"...\")) {\n                spread_token = S.token;\n                if (maybe_sequence) invalid_sequence = S.token;\n                next();\n                a.push(new AST_Expansion({\n                    start: prev(),\n                    expression: expression(),\n                    end: S.token,\n                }));\n            } else {\n                a.push(expression());\n            }\n            if (!is(\"punc\", \")\")) {\n                expect(\",\");\n                if (is(\"punc\", \")\")) {\n                    trailing_comma = prev();\n                    if (maybe_sequence) invalid_sequence = trailing_comma;\n                }\n            }\n        }\n        expect(\")\");\n        if (allow_arrows && is(\"arrow\", \"=>\")) {\n            if (spread_token && trailing_comma) unexpected(trailing_comma);\n        } else if (invalid_sequence) {\n            unexpected(invalid_sequence);\n        }\n        return a;\n    }\n\n    function _function_body(block, generator, is_async, name, args) {\n        var loop = S.in_loop;\n        var labels = S.labels;\n        var current_generator = S.in_generator;\n        var current_async = S.in_async;\n        ++S.in_function;\n        if (generator)\n            S.in_generator = S.in_function;\n        if (is_async)\n            S.in_async = S.in_function;\n        if (args) parameters(args);\n        if (block)\n            S.in_directives = true;\n        S.in_loop = 0;\n        S.labels = [];\n        if (block) {\n            S.input.push_directives_stack();\n            var a = block_();\n            if (name) _verify_symbol(name);\n            if (args) args.forEach(_verify_symbol);\n            S.input.pop_directives_stack();\n        } else {\n            var a = [new AST_Return({\n                start: S.token,\n                value: expression(false),\n                end: S.token\n            })];\n        }\n        --S.in_function;\n        S.in_loop = loop;\n        S.labels = labels;\n        S.in_generator = current_generator;\n        S.in_async = current_async;\n        return a;\n    }\n\n    function _await_expression() {\n        // Previous token must be \"await\" and not be interpreted as an identifier\n        if (!can_await()) {\n            croak(\"Unexpected await expression outside async function\",\n                S.prev.line, S.prev.col, S.prev.pos);\n        }\n        // the await expression is parsed as a unary expression in Babel\n        return new AST_Await({\n            start: prev(),\n            end: S.token,\n            expression : maybe_unary(true),\n        });\n    }\n\n    function _yield_expression() {\n        // Previous token must be keyword yield and not be interpret as an identifier\n        if (!is_in_generator()) {\n            croak(\"Unexpected yield expression outside generator function\",\n                S.prev.line, S.prev.col, S.prev.pos);\n        }\n        var start = S.token;\n        var star = false;\n        var has_expression = true;\n\n        // Attempt to get expression or star (and then the mandatory expression)\n        // behind yield on the same line.\n        //\n        // If nothing follows on the same line of the yieldExpression,\n        // it should default to the value `undefined` for yield to return.\n        // In that case, the `undefined` stored as `null` in ast.\n        //\n        // Note 1: It isn't allowed for yield* to close without an expression\n        // Note 2: If there is a nlb between yield and star, it is interpret as\n        //         yield <explicit undefined> <inserted automatic semicolon> *\n        if (can_insert_semicolon() ||\n            (is(\"punc\") && PUNC_AFTER_EXPRESSION.has(S.token.value))) {\n            has_expression = false;\n\n        } else if (is(\"operator\", \"*\")) {\n            star = true;\n            next();\n        }\n\n        return new AST_Yield({\n            start      : start,\n            is_star    : star,\n            expression : has_expression ? expression() : null,\n            end        : prev()\n        });\n    }\n\n    function if_() {\n        var cond = parenthesised(), body = statement(false, false, true), belse = null;\n        if (is(\"keyword\", \"else\")) {\n            next();\n            belse = statement(false, false, true);\n        }\n        return new AST_If({\n            condition   : cond,\n            body        : body,\n            alternative : belse\n        });\n    }\n\n    function block_() {\n        expect(\"{\");\n        var a = [];\n        while (!is(\"punc\", \"}\")) {\n            if (is(\"eof\")) unexpected();\n            a.push(statement());\n        }\n        next();\n        return a;\n    }\n\n    function switch_body_() {\n        expect(\"{\");\n        var a = [], cur = null, branch = null, tmp;\n        while (!is(\"punc\", \"}\")) {\n            if (is(\"eof\")) unexpected();\n            if (is(\"keyword\", \"case\")) {\n                if (branch) branch.end = prev();\n                cur = [];\n                branch = new AST_Case({\n                    start      : (tmp = S.token, next(), tmp),\n                    expression : expression(true),\n                    body       : cur\n                });\n                a.push(branch);\n                expect(\":\");\n            } else if (is(\"keyword\", \"default\")) {\n                if (branch) branch.end = prev();\n                cur = [];\n                branch = new AST_Default({\n                    start : (tmp = S.token, next(), expect(\":\"), tmp),\n                    body  : cur\n                });\n                a.push(branch);\n            } else {\n                if (!cur) unexpected();\n                cur.push(statement());\n            }\n        }\n        if (branch) branch.end = prev();\n        next();\n        return a;\n    }\n\n    function try_() {\n        var body, bcatch = null, bfinally = null;\n        body = new AST_TryBlock({\n            start : S.token,\n            body  : block_(),\n            end   : prev(),\n        });\n        if (is(\"keyword\", \"catch\")) {\n            var start = S.token;\n            next();\n            if (is(\"punc\", \"{\")) {\n                var name = null;\n            } else {\n                expect(\"(\");\n                var name = parameter(undefined, AST_SymbolCatch);\n                expect(\")\");\n            }\n            bcatch = new AST_Catch({\n                start   : start,\n                argname : name,\n                body    : block_(),\n                end     : prev()\n            });\n        }\n        if (is(\"keyword\", \"finally\")) {\n            var start = S.token;\n            next();\n            bfinally = new AST_Finally({\n                start : start,\n                body  : block_(),\n                end   : prev()\n            });\n        }\n        if (!bcatch && !bfinally)\n            croak(\"Missing catch/finally blocks\");\n        return new AST_Try({\n            body     : body,\n            bcatch   : bcatch,\n            bfinally : bfinally\n        });\n    }\n\n    /**\n     * var\n     *   vardef1 = 2,\n     *   vardef2 = 3;\n     */\n    function vardefs(no_in, kind) {\n        var var_defs = [];\n        var def;\n        for (;;) {\n            var sym_type =\n                kind === \"var\" ? AST_SymbolVar :\n                kind === \"const\" ? AST_SymbolConst :\n                kind === \"let\" ? AST_SymbolLet : null;\n            // var { a } = b\n            if (is(\"punc\", \"{\") || is(\"punc\", \"[\")) {\n                def = new AST_VarDef({\n                    start: S.token,\n                    name: binding_element(undefined, sym_type),\n                    value: is(\"operator\", \"=\") ? (expect_token(\"operator\", \"=\"), expression(false, no_in)) : null,\n                    end: prev()\n                });\n            } else {\n                def = new AST_VarDef({\n                    start : S.token,\n                    name  : as_symbol(sym_type),\n                    value : is(\"operator\", \"=\")\n                        ? (next(), expression(false, no_in))\n                        : !no_in && kind === \"const\"\n                            ? croak(\"Missing initializer in const declaration\") : null,\n                    end   : prev()\n                });\n                if (def.name.name == \"import\") croak(\"Unexpected token: import\");\n            }\n            var_defs.push(def);\n            if (!is(\"punc\", \",\"))\n                break;\n            next();\n        }\n        return var_defs;\n    }\n\n    var var_ = function(no_in) {\n        return new AST_Var({\n            start       : prev(),\n            definitions : vardefs(no_in, \"var\"),\n            end         : prev()\n        });\n    };\n\n    var let_ = function(no_in) {\n        return new AST_Let({\n            start       : prev(),\n            definitions : vardefs(no_in, \"let\"),\n            end         : prev()\n        });\n    };\n\n    var const_ = function(no_in) {\n        return new AST_Const({\n            start       : prev(),\n            definitions : vardefs(no_in, \"const\"),\n            end         : prev()\n        });\n    };\n\n    var new_ = function(allow_calls) {\n        var start = S.token;\n        expect_token(\"operator\", \"new\");\n        if (is(\"punc\", \".\")) {\n            next();\n            expect_token(\"name\", \"target\");\n            return subscripts(new AST_NewTarget({\n                start : start,\n                end   : prev()\n            }), allow_calls);\n        }\n        var newexp = expr_atom(false), args;\n        if (is(\"punc\", \"(\")) {\n            next();\n            args = expr_list(\")\", true);\n        } else {\n            args = [];\n        }\n        var call = new AST_New({\n            start      : start,\n            expression : newexp,\n            args       : args,\n            end        : prev()\n        });\n        annotate(call);\n        return subscripts(call, allow_calls);\n    };\n\n    function as_atom_node() {\n        var tok = S.token, ret;\n        switch (tok.type) {\n          case \"name\":\n            ret = _make_symbol(AST_SymbolRef);\n            break;\n          case \"num\":\n            ret = new AST_Number({\n                start: tok,\n                end: tok,\n                value: tok.value,\n                raw: LATEST_RAW\n            });\n            break;\n          case \"big_int\":\n            ret = new AST_BigInt({ start: tok, end: tok, value: tok.value });\n            break;\n          case \"string\":\n            ret = new AST_String({\n                start : tok,\n                end   : tok,\n                value : tok.value,\n                quote : tok.quote\n            });\n            annotate(ret);            \n            break;\n          case \"regexp\":\n            const [_, source, flags] = tok.value.match(/^\\/(.*)\\/(\\w*)$/);\n\n            ret = new AST_RegExp({ start: tok, end: tok, value: { source, flags } });\n            break;\n          case \"atom\":\n            switch (tok.value) {\n              case \"false\":\n                ret = new AST_False({ start: tok, end: tok });\n                break;\n              case \"true\":\n                ret = new AST_True({ start: tok, end: tok });\n                break;\n              case \"null\":\n                ret = new AST_Null({ start: tok, end: tok });\n                break;\n            }\n            break;\n        }\n        next();\n        return ret;\n    }\n\n    function to_fun_args(ex, default_seen_above) {\n        var insert_default = function(ex, default_value) {\n            if (default_value) {\n                return new AST_DefaultAssign({\n                    start: ex.start,\n                    left: ex,\n                    operator: \"=\",\n                    right: default_value,\n                    end: default_value.end\n                });\n            }\n            return ex;\n        };\n        if (ex instanceof AST_Object) {\n            return insert_default(new AST_Destructuring({\n                start: ex.start,\n                end: ex.end,\n                is_array: false,\n                names: ex.properties.map(prop => to_fun_args(prop))\n            }), default_seen_above);\n        } else if (ex instanceof AST_ObjectKeyVal) {\n            ex.value = to_fun_args(ex.value);\n            return insert_default(ex, default_seen_above);\n        } else if (ex instanceof AST_Hole) {\n            return ex;\n        } else if (ex instanceof AST_Destructuring) {\n            ex.names = ex.names.map(name => to_fun_args(name));\n            return insert_default(ex, default_seen_above);\n        } else if (ex instanceof AST_SymbolRef) {\n            return insert_default(new AST_SymbolFunarg({\n                name: ex.name,\n                start: ex.start,\n                end: ex.end\n            }), default_seen_above);\n        } else if (ex instanceof AST_Expansion) {\n            ex.expression = to_fun_args(ex.expression);\n            return insert_default(ex, default_seen_above);\n        } else if (ex instanceof AST_Array) {\n            return insert_default(new AST_Destructuring({\n                start: ex.start,\n                end: ex.end,\n                is_array: true,\n                names: ex.elements.map(elm => to_fun_args(elm))\n            }), default_seen_above);\n        } else if (ex instanceof AST_Assign) {\n            return insert_default(to_fun_args(ex.left, ex.right), default_seen_above);\n        } else if (ex instanceof AST_DefaultAssign) {\n            ex.left = to_fun_args(ex.left);\n            return ex;\n        } else {\n            croak(\"Invalid function parameter\", ex.start.line, ex.start.col);\n        }\n    }\n\n    var expr_atom = function(allow_calls, allow_arrows) {\n        if (is(\"operator\", \"new\")) {\n            return new_(allow_calls);\n        }\n        if (is(\"name\", \"import\") && is_token(peek(), \"punc\", \".\")) {\n            return import_meta(allow_calls);\n        }\n        var start = S.token;\n        var peeked;\n        var async = is(\"name\", \"async\")\n            && (peeked = peek()).value != \"[\"\n            && peeked.type != \"arrow\"\n            && as_atom_node();\n        if (is(\"punc\")) {\n            switch (S.token.value) {\n              case \"(\":\n                if (async && !allow_calls) break;\n                var exprs = params_or_seq_(allow_arrows, !async);\n                if (allow_arrows && is(\"arrow\", \"=>\")) {\n                    return arrow_function(start, exprs.map(e => to_fun_args(e)), !!async);\n                }\n                var ex = async ? new AST_Call({\n                    expression: async,\n                    args: exprs\n                }) : exprs.length == 1 ? exprs[0] : new AST_Sequence({\n                    expressions: exprs\n                });\n                if (ex.start) {\n                    const outer_comments_before = start.comments_before.length;\n                    outer_comments_before_counts.set(start, outer_comments_before);\n                    ex.start.comments_before.unshift(...start.comments_before);\n                    start.comments_before = ex.start.comments_before;\n                    if (outer_comments_before == 0 && start.comments_before.length > 0) {\n                        var comment = start.comments_before[0];\n                        if (!comment.nlb) {\n                            comment.nlb = start.nlb;\n                            start.nlb = false;\n                        }\n                    }\n                    start.comments_after = ex.start.comments_after;\n                }\n                ex.start = start;\n                var end = prev();\n                if (ex.end) {\n                    end.comments_before = ex.end.comments_before;\n                    ex.end.comments_after.push(...end.comments_after);\n                    end.comments_after = ex.end.comments_after;\n                }\n                ex.end = end;\n                if (ex instanceof AST_Call) annotate(ex);\n                return subscripts(ex, allow_calls);\n              case \"[\":\n                return subscripts(array_(), allow_calls);\n              case \"{\":\n                return subscripts(object_or_destructuring_(), allow_calls);\n            }\n            if (!async) unexpected();\n        }\n        if (allow_arrows && is(\"name\") && is_token(peek(), \"arrow\")) {\n            var param = new AST_SymbolFunarg({\n                name: S.token.value,\n                start: start,\n                end: start,\n            });\n            next();\n            return arrow_function(start, [param], !!async);\n        }\n        if (is(\"keyword\", \"function\")) {\n            next();\n            var func = function_(AST_Function, false, !!async);\n            func.start = start;\n            func.end = prev();\n            return subscripts(func, allow_calls);\n        }\n        if (async) return subscripts(async, allow_calls);\n        if (is(\"keyword\", \"class\")) {\n            next();\n            var cls = class_(AST_ClassExpression);\n            cls.start = start;\n            cls.end = prev();\n            return subscripts(cls, allow_calls);\n        }\n        if (is(\"template_head\")) {\n            return subscripts(template_string(), allow_calls);\n        }\n        if (is(\"privatename\")) {\n            if(!S.in_class) {\n                croak(\"Private field must be used in an enclosing class\");\n            }\n\n            const start = S.token;\n            const key = new AST_SymbolPrivateProperty({\n                start,\n                name: start.value,\n                end: start\n            });\n            next();\n            expect_token(\"operator\", \"in\");\n\n            const private_in = new AST_PrivateIn({\n                start,\n                key,\n                value: subscripts(as_atom_node(), allow_calls),\n                end: prev()\n            });\n\n            return subscripts(private_in, allow_calls);\n        }\n        if (ATOMIC_START_TOKEN.has(S.token.type)) {\n            return subscripts(as_atom_node(), allow_calls);\n        }\n        unexpected();\n    };\n\n    function template_string() {\n        var segments = [], start = S.token;\n\n        segments.push(new AST_TemplateSegment({\n            start: S.token,\n            raw: TEMPLATE_RAWS.get(S.token),\n            value: S.token.value,\n            end: S.token\n        }));\n\n        while (!S.token.template_end) {\n            next();\n            handle_regexp();\n            segments.push(expression(true));\n\n            segments.push(new AST_TemplateSegment({\n                start: S.token,\n                raw: TEMPLATE_RAWS.get(S.token),\n                value: S.token.value,\n                end: S.token\n            }));\n        }\n        next();\n\n        return new AST_TemplateString({\n            start: start,\n            segments: segments,\n            end: S.token\n        });\n    }\n\n    function expr_list(closing, allow_trailing_comma, allow_empty) {\n        var first = true, a = [];\n        while (!is(\"punc\", closing)) {\n            if (first) first = false; else expect(\",\");\n            if (allow_trailing_comma && is(\"punc\", closing)) break;\n            if (is(\"punc\", \",\") && allow_empty) {\n                a.push(new AST_Hole({ start: S.token, end: S.token }));\n            } else if (is(\"expand\", \"...\")) {\n                next();\n                a.push(new AST_Expansion({start: prev(), expression: expression(),end: S.token}));\n            } else {\n                a.push(expression(false));\n            }\n        }\n        next();\n        return a;\n    }\n\n    var array_ = embed_tokens(function() {\n        expect(\"[\");\n        return new AST_Array({\n            elements: expr_list(\"]\", !options.strict, true)\n        });\n    });\n\n    var create_accessor = embed_tokens((is_generator, is_async) => {\n        return function_(AST_Accessor, is_generator, is_async);\n    });\n\n    var object_or_destructuring_ = embed_tokens(function object_or_destructuring_() {\n        var start = S.token, first = true, a = [];\n        expect(\"{\");\n        while (!is(\"punc\", \"}\")) {\n            if (first) first = false; else expect(\",\");\n            if (!options.strict && is(\"punc\", \"}\"))\n                // allow trailing comma\n                break;\n\n            start = S.token;\n            if (start.type == \"expand\") {\n                next();\n                a.push(new AST_Expansion({\n                    start: start,\n                    expression: expression(false),\n                    end: prev(),\n                }));\n                continue;\n            }\n            if(is(\"privatename\")) {\n                croak(\"private fields are not allowed in an object\");\n            }\n            var name = as_property_name();\n            var value;\n\n            // Check property and fetch value\n            if (!is(\"punc\", \":\")) {\n                var concise = concise_method_or_getset(name, start);\n                if (concise) {\n                    a.push(concise);\n                    continue;\n                }\n\n                value = new AST_SymbolRef({\n                    start: prev(),\n                    name: name,\n                    end: prev()\n                });\n            } else if (name === null) {\n                unexpected(prev());\n            } else {\n                next(); // `:` - see first condition\n                value = expression(false);\n            }\n\n            // Check for default value and alter value accordingly if necessary\n            if (is(\"operator\", \"=\")) {\n                next();\n                value = new AST_Assign({\n                    start: start,\n                    left: value,\n                    operator: \"=\",\n                    right: expression(false),\n                    logical: false,\n                    end: prev()\n                });\n            }\n\n            // Create property\n            a.push(new AST_ObjectKeyVal({\n                start: start,\n                quote: start.quote,\n                key: name instanceof AST_Node ? name : \"\" + name,\n                value: value,\n                end: prev()\n            }));\n        }\n        next();\n        return new AST_Object({ properties: a });\n    });\n\n    function class_(KindOfClass, is_export_default) {\n        var start, method, class_name, extends_, a = [];\n\n        S.input.push_directives_stack(); // Push directive stack, but not scope stack\n        S.input.add_directive(\"use strict\");\n\n        if (S.token.type == \"name\" && S.token.value != \"extends\") {\n            class_name = as_symbol(KindOfClass === AST_DefClass ? AST_SymbolDefClass : AST_SymbolClass);\n        }\n\n        if (KindOfClass === AST_DefClass && !class_name) {\n            if (is_export_default) {\n                KindOfClass = AST_ClassExpression;\n            } else {\n                unexpected();\n            }\n        }\n\n        if (S.token.value == \"extends\") {\n            next();\n            extends_ = expression(true);\n        }\n\n        expect(\"{\");\n        // mark in class feild,\n        const save_in_class = S.in_class;\n        S.in_class = true;\n        while (is(\"punc\", \";\")) { next(); }  // Leading semicolons are okay in class bodies.\n        while (!is(\"punc\", \"}\")) {\n            start = S.token;\n            method = concise_method_or_getset(as_property_name(), start, true);\n            if (!method) { unexpected(); }\n            a.push(method);\n            while (is(\"punc\", \";\")) { next(); }\n        }\n        // mark in class feild,\n        S.in_class = save_in_class;\n\n        S.input.pop_directives_stack();\n\n        next();\n\n        return new KindOfClass({\n            start: start,\n            name: class_name,\n            extends: extends_,\n            properties: a,\n            end: prev(),\n        });\n    }\n\n    function concise_method_or_getset(name, start, is_class) {\n        const get_symbol_ast = (name, SymbolClass = AST_SymbolMethod) => {\n            if (typeof name === \"string\" || typeof name === \"number\") {\n                return new SymbolClass({\n                    start,\n                    name: \"\" + name,\n                    end: prev()\n                });\n            } else if (name === null) {\n                unexpected();\n            }\n            return name;\n        };\n\n        const is_not_method_start = () =>\n            !is(\"punc\", \"(\") && !is(\"punc\", \",\") && !is(\"punc\", \"}\") && !is(\"punc\", \";\") && !is(\"operator\", \"=\");\n\n        var is_async = false;\n        var is_static = false;\n        var is_generator = false;\n        var is_private = false;\n        var accessor_type = null;\n\n        if (is_class && name === \"static\" && is_not_method_start()) {\n            const static_block = class_static_block();\n            if (static_block != null) {\n                return static_block;\n            }\n            is_static = true;\n            name = as_property_name();\n        }\n        if (name === \"async\" && is_not_method_start()) {\n            is_async = true;\n            name = as_property_name();\n        }\n        if (prev().type === \"operator\" && prev().value === \"*\") {\n            is_generator = true;\n            name = as_property_name();\n        }\n        if ((name === \"get\" || name === \"set\") && is_not_method_start()) {\n            accessor_type = name;\n            name = as_property_name();\n        }\n        if (prev().type === \"privatename\") {\n            is_private = true;\n        }\n\n        const property_token = prev();\n\n        if (accessor_type != null) {\n            if (!is_private) {\n                const AccessorClass = accessor_type === \"get\"\n                    ? AST_ObjectGetter\n                    : AST_ObjectSetter;\n\n                name = get_symbol_ast(name);\n                return new AccessorClass({\n                    start,\n                    static: is_static,\n                    key: name,\n                    quote: name instanceof AST_SymbolMethod ? property_token.quote : undefined,\n                    value: create_accessor(),\n                    end: prev()\n                });\n            } else {\n                const AccessorClass = accessor_type === \"get\"\n                    ? AST_PrivateGetter\n                    : AST_PrivateSetter;\n\n                return new AccessorClass({\n                    start,\n                    static: is_static,\n                    key: get_symbol_ast(name),\n                    value: create_accessor(),\n                    end: prev(),\n                });\n            }\n        }\n\n        if (is(\"punc\", \"(\")) {\n            name = get_symbol_ast(name);\n            const AST_MethodVariant = is_private\n                ? AST_PrivateMethod\n                : AST_ConciseMethod;\n            var node = new AST_MethodVariant({\n                start       : start,\n                static      : is_static,\n                is_generator: is_generator,\n                async       : is_async,\n                key         : name,\n                quote       : name instanceof AST_SymbolMethod ?\n                              property_token.quote : undefined,\n                value       : create_accessor(is_generator, is_async),\n                end         : prev()\n            });\n            return node;\n        }\n\n        if (is_class) {\n            const key = get_symbol_ast(name, AST_SymbolClassProperty);\n            const quote = key instanceof AST_SymbolClassProperty\n                ? property_token.quote\n                : undefined;\n            const AST_ClassPropertyVariant = is_private\n                ? AST_ClassPrivateProperty\n                : AST_ClassProperty;\n            if (is(\"operator\", \"=\")) {\n                next();\n                return new AST_ClassPropertyVariant({\n                    start,\n                    static: is_static,\n                    quote,\n                    key,\n                    value: expression(false),\n                    end: prev()\n                });\n            } else if (\n                is(\"name\")\n                || is(\"privatename\")\n                || is(\"operator\", \"*\")\n                || is(\"punc\", \";\")\n                || is(\"punc\", \"}\")\n            ) {\n                return new AST_ClassPropertyVariant({\n                    start,\n                    static: is_static,\n                    quote,\n                    key,\n                    end: prev()\n                });\n            }\n        }\n    }\n\n    function class_static_block() {\n        if (!is(\"punc\", \"{\")) {\n            return null;\n        }\n\n        const start = S.token;\n        const body = [];\n\n        next();\n\n        while (!is(\"punc\", \"}\")) {\n            body.push(statement());\n        }\n\n        next();\n\n        return new AST_ClassStaticBlock({ start, body, end: prev() });\n    }\n\n    function maybe_import_assertion() {\n        if (is(\"name\", \"assert\") && !has_newline_before(S.token)) {\n            next();\n            return object_or_destructuring_();\n        }\n        return null;\n    }\n\n    function import_statement() {\n        var start = prev();\n\n        var imported_name;\n        var imported_names;\n        if (is(\"name\")) {\n            imported_name = as_symbol(AST_SymbolImport);\n        }\n\n        if (is(\"punc\", \",\")) {\n            next();\n        }\n\n        imported_names = map_names(true);\n\n        if (imported_names || imported_name) {\n            expect_token(\"name\", \"from\");\n        }\n        var mod_str = S.token;\n        if (mod_str.type !== \"string\") {\n            unexpected();\n        }\n        next();\n\n        const assert_clause = maybe_import_assertion();\n\n        return new AST_Import({\n            start,\n            imported_name,\n            imported_names,\n            module_name: new AST_String({\n                start: mod_str,\n                value: mod_str.value,\n                quote: mod_str.quote,\n                end: mod_str,\n            }),\n            assert_clause,\n            end: S.token,\n        });\n    }\n\n    function import_meta(allow_calls) {\n        var start = S.token;\n        expect_token(\"name\", \"import\");\n        expect_token(\"punc\", \".\");\n        expect_token(\"name\", \"meta\");\n        return subscripts(new AST_ImportMeta({\n            start: start,\n            end: prev()\n        }), allow_calls);\n    }\n\n    function map_name(is_import) {\n        function make_symbol(type, quote) {\n            return new type({\n                name: as_property_name(),\n                quote: quote || undefined,\n                start: prev(),\n                end: prev()\n            });\n        }\n\n        var foreign_type = is_import ? AST_SymbolImportForeign : AST_SymbolExportForeign;\n        var type = is_import ? AST_SymbolImport : AST_SymbolExport;\n        var start = S.token;\n        var foreign_name;\n        var name;\n\n        if (is_import) {\n            foreign_name = make_symbol(foreign_type, start.quote);\n        } else {\n            name = make_symbol(type, start.quote);\n        }\n        if (is(\"name\", \"as\")) {\n            next();  // The \"as\" word\n            if (is_import) {\n                name = make_symbol(type);\n            } else {\n                foreign_name = make_symbol(foreign_type, S.token.quote);\n            }\n        } else if (is_import) {\n            name = new type(foreign_name);\n        } else {\n            foreign_name = new foreign_type(name);\n        }\n\n        return new AST_NameMapping({\n            start: start,\n            foreign_name: foreign_name,\n            name: name,\n            end: prev(),\n        });\n    }\n\n    function map_nameAsterisk(is_import, import_or_export_foreign_name) {\n        var foreign_type = is_import ? AST_SymbolImportForeign : AST_SymbolExportForeign;\n        var type = is_import ? AST_SymbolImport : AST_SymbolExport;\n        var start = S.token;\n        var name, foreign_name;\n        var end = prev();\n\n        if (is_import) {\n            name = import_or_export_foreign_name;\n        } else {\n            foreign_name = import_or_export_foreign_name;\n        }\n\n        name = name || new type({\n            start: start,\n            name: \"*\",\n            end: end,\n        });\n\n        foreign_name = foreign_name || new foreign_type({\n            start: start,\n            name: \"*\",\n            end: end,\n        });\n\n        return new AST_NameMapping({\n            start: start,\n            foreign_name: foreign_name,\n            name: name,\n            end: end,\n        });\n    }\n\n    function map_names(is_import) {\n        var names;\n        if (is(\"punc\", \"{\")) {\n            next();\n            names = [];\n            while (!is(\"punc\", \"}\")) {\n                names.push(map_name(is_import));\n                if (is(\"punc\", \",\")) {\n                    next();\n                }\n            }\n            next();\n        } else if (is(\"operator\", \"*\")) {\n            var name;\n            next();\n            if (is(\"name\", \"as\")) {\n                next();  // The \"as\" word\n                name = is_import ? as_symbol(AST_SymbolImport) : as_symbol_or_string(AST_SymbolExportForeign);\n            }\n            names = [map_nameAsterisk(is_import, name)];\n        }\n        return names;\n    }\n\n    function export_statement() {\n        var start = S.token;\n        var is_default;\n        var exported_names;\n\n        if (is(\"keyword\", \"default\")) {\n            is_default = true;\n            next();\n        } else if (exported_names = map_names(false)) {\n            if (is(\"name\", \"from\")) {\n                next();\n\n                var mod_str = S.token;\n                if (mod_str.type !== \"string\") {\n                    unexpected();\n                }\n                next();\n\n                const assert_clause = maybe_import_assertion();\n\n                return new AST_Export({\n                    start: start,\n                    is_default: is_default,\n                    exported_names: exported_names,\n                    module_name: new AST_String({\n                        start: mod_str,\n                        value: mod_str.value,\n                        quote: mod_str.quote,\n                        end: mod_str,\n                    }),\n                    end: prev(),\n                    assert_clause\n                });\n            } else {\n                return new AST_Export({\n                    start: start,\n                    is_default: is_default,\n                    exported_names: exported_names,\n                    end: prev(),\n                });\n            }\n        }\n\n        var node;\n        var exported_value;\n        var exported_definition;\n        if (is(\"punc\", \"{\")\n            || is_default\n                && (is(\"keyword\", \"class\") || is(\"keyword\", \"function\"))\n                && is_token(peek(), \"punc\")) {\n            exported_value = expression(false);\n            semicolon();\n        } else if ((node = statement(is_default)) instanceof AST_Definitions && is_default) {\n            unexpected(node.start);\n        } else if (\n            node instanceof AST_Definitions\n            || node instanceof AST_Defun\n            || node instanceof AST_DefClass\n        ) {\n            exported_definition = node;\n        } else if (\n            node instanceof AST_ClassExpression\n            || node instanceof AST_Function\n        ) {\n            exported_value = node;\n        } else if (node instanceof AST_SimpleStatement) {\n            exported_value = node.body;\n        } else {\n            unexpected(node.start);\n        }\n\n        return new AST_Export({\n            start: start,\n            is_default: is_default,\n            exported_value: exported_value,\n            exported_definition: exported_definition,\n            end: prev(),\n            assert_clause: null\n        });\n    }\n\n    function as_property_name() {\n        var tmp = S.token;\n        switch (tmp.type) {\n          case \"punc\":\n            if (tmp.value === \"[\") {\n                next();\n                var ex = expression(false);\n                expect(\"]\");\n                return ex;\n            } else unexpected(tmp);\n          case \"operator\":\n            if (tmp.value === \"*\") {\n                next();\n                return null;\n            }\n            if (![\"delete\", \"in\", \"instanceof\", \"new\", \"typeof\", \"void\"].includes(tmp.value)) {\n                unexpected(tmp);\n            }\n            /* falls through */\n          case \"name\":\n          case \"privatename\":\n          case \"string\":\n          case \"num\":\n          case \"big_int\":\n          case \"keyword\":\n          case \"atom\":\n            next();\n            return tmp.value;\n          default:\n            unexpected(tmp);\n        }\n    }\n\n    function as_name() {\n        var tmp = S.token;\n        if (tmp.type != \"name\" && tmp.type != \"privatename\") unexpected();\n        next();\n        return tmp.value;\n    }\n\n    function _make_symbol(type) {\n        var name = S.token.value;\n        return new (name == \"this\" ? AST_This :\n                    name == \"super\" ? AST_Super :\n                    type)({\n            name  : String(name),\n            start : S.token,\n            end   : S.token\n        });\n    }\n\n    function _verify_symbol(sym) {\n        var name = sym.name;\n        if (is_in_generator() && name == \"yield\") {\n            token_error(sym.start, \"Yield cannot be used as identifier inside generators\");\n        }\n        if (S.input.has_directive(\"use strict\")) {\n            if (name == \"yield\") {\n                token_error(sym.start, \"Unexpected yield identifier inside strict mode\");\n            }\n            if (sym instanceof AST_SymbolDeclaration && (name == \"arguments\" || name == \"eval\")) {\n                token_error(sym.start, \"Unexpected \" + name + \" in strict mode\");\n            }\n        }\n    }\n\n    function as_symbol(type, noerror) {\n        if (!is(\"name\")) {\n            if (!noerror) croak(\"Name expected\");\n            return null;\n        }\n        var sym = _make_symbol(type);\n        _verify_symbol(sym);\n        next();\n        return sym;\n    }\n\n    function as_symbol_or_string(type) {\n        if (!is(\"name\")) {\n            if (!is(\"string\")) {\n                croak(\"Name or string expected\");\n            }\n            var tok = S.token;\n            var ret = new type({\n                start : tok,\n                end   : tok,\n                name : tok.value,\n                quote : tok.quote\n            });\n            next();\n            return ret;\n        }\n        var sym = _make_symbol(type);\n        _verify_symbol(sym);\n        next();\n        return sym;\n    }\n\n    // Annotate AST_Call, AST_Lambda or AST_New with the special comments\n    function annotate(node) {\n        var start = node.start;\n        var comments = start.comments_before;\n        const comments_outside_parens = outer_comments_before_counts.get(start);\n        var i = comments_outside_parens != null ? comments_outside_parens : comments.length;\n        while (--i >= 0) {\n            var comment = comments[i];\n            if (/[@#]__/.test(comment.value)) {\n                if (/[@#]__PURE__/.test(comment.value)) {\n                    set_annotation(node, _PURE);\n                    break;\n                }\n                if (/[@#]__INLINE__/.test(comment.value)) {\n                    set_annotation(node, _INLINE);\n                    break;\n                }\n                if (/[@#]__NOINLINE__/.test(comment.value)) {\n                    set_annotation(node, _NOINLINE);\n                    break;\n                }\n                if (/[@#]__KEY__/.test(comment.value)) {\n                    set_annotation(node, _KEY);\n                    break;\n                }\n            }\n        }\n    }\n\n    var subscripts = function(expr, allow_calls, is_chain) {\n        var start = expr.start;\n        if (is(\"punc\", \".\")) {\n            next();\n            if(is(\"privatename\") && !S.in_class) \n                croak(\"Private field must be used in an enclosing class\");\n            const AST_DotVariant = is(\"privatename\") ? AST_DotHash : AST_Dot;\n            return subscripts(new AST_DotVariant({\n                start      : start,\n                expression : expr,\n                optional   : false,\n                property   : as_name(),\n                end        : prev()\n            }), allow_calls, is_chain);\n        }\n        if (is(\"punc\", \"[\")) {\n            next();\n            var prop = expression(true);\n            expect(\"]\");\n            return subscripts(new AST_Sub({\n                start      : start,\n                expression : expr,\n                optional   : false,\n                property   : prop,\n                end        : prev()\n            }), allow_calls, is_chain);\n        }\n        if (allow_calls && is(\"punc\", \"(\")) {\n            next();\n            var call = new AST_Call({\n                start      : start,\n                expression : expr,\n                optional   : false,\n                args       : call_args(),\n                end        : prev()\n            });\n            annotate(call);\n            return subscripts(call, true, is_chain);\n        }\n\n        if (is(\"punc\", \"?.\")) {\n            next();\n\n            let chain_contents;\n\n            if (allow_calls && is(\"punc\", \"(\")) {\n                next();\n\n                const call = new AST_Call({\n                    start,\n                    optional: true,\n                    expression: expr,\n                    args: call_args(),\n                    end: prev()\n                });\n                annotate(call);\n\n                chain_contents = subscripts(call, true, true);\n            } else if (is(\"name\") || is(\"privatename\")) {\n                if(is(\"privatename\") && !S.in_class) \n                    croak(\"Private field must be used in an enclosing class\");\n                const AST_DotVariant = is(\"privatename\") ? AST_DotHash : AST_Dot;\n                chain_contents = subscripts(new AST_DotVariant({\n                    start,\n                    expression: expr,\n                    optional: true,\n                    property: as_name(),\n                    end: prev()\n                }), allow_calls, true);\n            } else if (is(\"punc\", \"[\")) {\n                next();\n                const property = expression(true);\n                expect(\"]\");\n                chain_contents = subscripts(new AST_Sub({\n                    start,\n                    expression: expr,\n                    optional: true,\n                    property,\n                    end: prev()\n                }), allow_calls, true);\n            }\n\n            if (!chain_contents) unexpected();\n\n            if (chain_contents instanceof AST_Chain) return chain_contents;\n\n            return new AST_Chain({\n                start,\n                expression: chain_contents,\n                end: prev()\n            });\n        }\n\n        if (is(\"template_head\")) {\n            if (is_chain) {\n                // a?.b`c` is a syntax error\n                unexpected();\n            }\n\n            return subscripts(new AST_PrefixedTemplateString({\n                start: start,\n                prefix: expr,\n                template_string: template_string(),\n                end: prev()\n            }), allow_calls);\n        }\n        return expr;\n    };\n\n    function call_args() {\n        var args = [];\n        while (!is(\"punc\", \")\")) {\n            if (is(\"expand\", \"...\")) {\n                next();\n                args.push(new AST_Expansion({\n                    start: prev(),\n                    expression: expression(false),\n                    end: prev()\n                }));\n            } else {\n                args.push(expression(false));\n            }\n            if (!is(\"punc\", \")\")) {\n                expect(\",\");\n            }\n        }\n        next();\n        return args;\n    }\n\n    var maybe_unary = function(allow_calls, allow_arrows) {\n        var start = S.token;\n        if (start.type == \"name\" && start.value == \"await\" && can_await()) {\n            next();\n            return _await_expression();\n        }\n        if (is(\"operator\") && UNARY_PREFIX.has(start.value)) {\n            next();\n            handle_regexp();\n            var ex = make_unary(AST_UnaryPrefix, start, maybe_unary(allow_calls));\n            ex.start = start;\n            ex.end = prev();\n            return ex;\n        }\n        var val = expr_atom(allow_calls, allow_arrows);\n        while (is(\"operator\") && UNARY_POSTFIX.has(S.token.value) && !has_newline_before(S.token)) {\n            if (val instanceof AST_Arrow) unexpected();\n            val = make_unary(AST_UnaryPostfix, S.token, val);\n            val.start = start;\n            val.end = S.token;\n            next();\n        }\n        return val;\n    };\n\n    function make_unary(ctor, token, expr) {\n        var op = token.value;\n        switch (op) {\n          case \"++\":\n          case \"--\":\n            if (!is_assignable(expr))\n                croak(\"Invalid use of \" + op + \" operator\", token.line, token.col, token.pos);\n            break;\n          case \"delete\":\n            if (expr instanceof AST_SymbolRef && S.input.has_directive(\"use strict\"))\n                croak(\"Calling delete on expression not allowed in strict mode\", expr.start.line, expr.start.col, expr.start.pos);\n            break;\n        }\n        return new ctor({ operator: op, expression: expr });\n    }\n\n    var expr_op = function(left, min_prec, no_in) {\n        var op = is(\"operator\") ? S.token.value : null;\n        if (op == \"in\" && no_in) op = null;\n        if (op == \"**\" && left instanceof AST_UnaryPrefix\n            /* unary token in front not allowed - parenthesis required */\n            && !is_token(left.start, \"punc\", \"(\")\n            && left.operator !== \"--\" && left.operator !== \"++\")\n                unexpected(left.start);\n        var prec = op != null ? PRECEDENCE[op] : null;\n        if (prec != null && (prec > min_prec || (op === \"**\" && min_prec === prec))) {\n            next();\n            var right = expr_op(maybe_unary(true), prec, no_in);\n            return expr_op(new AST_Binary({\n                start    : left.start,\n                left     : left,\n                operator : op,\n                right    : right,\n                end      : right.end\n            }), min_prec, no_in);\n        }\n        return left;\n    };\n\n    function expr_ops(no_in) {\n        return expr_op(maybe_unary(true, true), 0, no_in);\n    }\n\n    var maybe_conditional = function(no_in) {\n        var start = S.token;\n        var expr = expr_ops(no_in);\n        if (is(\"operator\", \"?\")) {\n            next();\n            var yes = expression(false);\n            expect(\":\");\n            return new AST_Conditional({\n                start       : start,\n                condition   : expr,\n                consequent  : yes,\n                alternative : expression(false, no_in),\n                end         : prev()\n            });\n        }\n        return expr;\n    };\n\n    function is_assignable(expr) {\n        return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;\n    }\n\n    function to_destructuring(node) {\n        if (node instanceof AST_Object) {\n            node = new AST_Destructuring({\n                start: node.start,\n                names: node.properties.map(to_destructuring),\n                is_array: false,\n                end: node.end\n            });\n        } else if (node instanceof AST_Array) {\n            var names = [];\n\n            for (var i = 0; i < node.elements.length; i++) {\n                // Only allow expansion as last element\n                if (node.elements[i] instanceof AST_Expansion) {\n                    if (i + 1 !== node.elements.length) {\n                        token_error(node.elements[i].start, \"Spread must the be last element in destructuring array\");\n                    }\n                    node.elements[i].expression = to_destructuring(node.elements[i].expression);\n                }\n\n                names.push(to_destructuring(node.elements[i]));\n            }\n\n            node = new AST_Destructuring({\n                start: node.start,\n                names: names,\n                is_array: true,\n                end: node.end\n            });\n        } else if (node instanceof AST_ObjectProperty) {\n            node.value = to_destructuring(node.value);\n        } else if (node instanceof AST_Assign) {\n            node = new AST_DefaultAssign({\n                start: node.start,\n                left: node.left,\n                operator: \"=\",\n                right: node.right,\n                end: node.end\n            });\n        }\n        return node;\n    }\n\n    // In ES6, AssignmentExpression can also be an ArrowFunction\n    var maybe_assign = function(no_in) {\n        handle_regexp();\n        var start = S.token;\n\n        if (start.type == \"name\" && start.value == \"yield\") {\n            if (is_in_generator()) {\n                next();\n                return _yield_expression();\n            } else if (S.input.has_directive(\"use strict\")) {\n                token_error(S.token, \"Unexpected yield identifier inside strict mode\");\n            }\n        }\n\n        var left = maybe_conditional(no_in);\n        var val = S.token.value;\n\n        if (is(\"operator\") && ASSIGNMENT.has(val)) {\n            if (is_assignable(left) || (left = to_destructuring(left)) instanceof AST_Destructuring) {\n                next();\n\n                return new AST_Assign({\n                    start    : start,\n                    left     : left,\n                    operator : val,\n                    right    : maybe_assign(no_in),\n                    logical  : LOGICAL_ASSIGNMENT.has(val),\n                    end      : prev()\n                });\n            }\n            croak(\"Invalid assignment\");\n        }\n        return left;\n    };\n\n    var expression = function(commas, no_in) {\n        var start = S.token;\n        var exprs = [];\n        while (true) {\n            exprs.push(maybe_assign(no_in));\n            if (!commas || !is(\"punc\", \",\")) break;\n            next();\n            commas = true;\n        }\n        return exprs.length == 1 ? exprs[0] : new AST_Sequence({\n            start       : start,\n            expressions : exprs,\n            end         : peek()\n        });\n    };\n\n    function in_loop(cont) {\n        ++S.in_loop;\n        var ret = cont();\n        --S.in_loop;\n        return ret;\n    }\n\n    if (options.expression) {\n        return expression(true);\n    }\n\n    return (function parse_toplevel() {\n        var start = S.token;\n        var body = [];\n        S.input.push_directives_stack();\n        if (options.module) S.input.add_directive(\"use strict\");\n        while (!is(\"eof\")) {\n            body.push(statement());\n        }\n        S.input.pop_directives_stack();\n        var end = prev();\n        var toplevel = options.toplevel;\n        if (toplevel) {\n            toplevel.body = toplevel.body.concat(body);\n            toplevel.end = end;\n        } else {\n            toplevel = new AST_Toplevel({ start: start, body: body, end: end });\n        }\n        TEMPLATE_RAWS = new Map();\n        return toplevel;\n    })();\n\n}\n\nexport {\n    get_full_char_code,\n    get_full_char,\n    is_identifier_char,\n    is_basic_identifier_string,\n    is_identifier_string,\n    is_surrogate_pair_head,\n    is_surrogate_pair_tail,\n    js_error,\n    JS_Parse_Error,\n    parse,\n    PRECEDENCE,\n    ALL_RESERVED_WORDS,\n    tokenizer,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/propmangle.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n/* global global, self */\n\nimport {\n    defaults,\n    push_uniq,\n    has_annotation,\n    clear_annotation,\n} from \"./utils/index.js\";\nimport { base54 } from \"./scope.js\";\nimport {\n    AST_Binary,\n    AST_Call,\n    AST_ClassPrivateProperty,\n    AST_Conditional,\n    AST_Dot,\n    AST_DotHash,\n    AST_ObjectKeyVal,\n    AST_ObjectProperty,\n    AST_PrivateMethod,\n    AST_PrivateGetter,\n    AST_PrivateSetter,\n    AST_PrivateIn,\n    AST_Sequence,\n    AST_String,\n    AST_Sub,\n    TreeTransformer,\n    TreeWalker,\n    _KEY,\n} from \"./ast.js\";\nimport { domprops } from \"../tools/domprops.js\";\n\nfunction find_builtins(reserved) {\n    domprops.forEach(add);\n\n    // Compatibility fix for some standard defined globals not defined on every js environment\n    var new_globals = [\"Symbol\", \"Map\", \"Promise\", \"Proxy\", \"Reflect\", \"Set\", \"WeakMap\", \"WeakSet\"];\n    var objects = {};\n    var global_ref = typeof global === \"object\" ? global : self;\n\n    new_globals.forEach(function (new_global) {\n        objects[new_global] = global_ref[new_global] || function() {};\n    });\n\n    [\n        \"null\",\n        \"true\",\n        \"false\",\n        \"NaN\",\n        \"Infinity\",\n        \"-Infinity\",\n        \"undefined\",\n    ].forEach(add);\n    [ Object, Array, Function, Number,\n      String, Boolean, Error, Math,\n      Date, RegExp, objects.Symbol, ArrayBuffer,\n      DataView, decodeURI, decodeURIComponent,\n      encodeURI, encodeURIComponent, eval, EvalError,\n      Float32Array, Float64Array, Int8Array, Int16Array,\n      Int32Array, isFinite, isNaN, JSON, objects.Map, parseFloat,\n      parseInt, objects.Promise, objects.Proxy, RangeError, ReferenceError,\n      objects.Reflect, objects.Set, SyntaxError, TypeError, Uint8Array,\n      Uint8ClampedArray, Uint16Array, Uint32Array, URIError,\n      objects.WeakMap, objects.WeakSet\n    ].forEach(function(ctor) {\n        Object.getOwnPropertyNames(ctor).map(add);\n        if (ctor.prototype) {\n            Object.getOwnPropertyNames(ctor.prototype).map(add);\n        }\n    });\n    function add(name) {\n        reserved.add(name);\n    }\n}\n\nfunction reserve_quoted_keys(ast, reserved) {\n    function add(name) {\n        push_uniq(reserved, name);\n    }\n\n    ast.walk(new TreeWalker(function(node) {\n        if (node instanceof AST_ObjectKeyVal && node.quote) {\n            add(node.key);\n        } else if (node instanceof AST_ObjectProperty && node.quote) {\n            add(node.key.name);\n        } else if (node instanceof AST_Sub) {\n            addStrings(node.property, add);\n        }\n    }));\n}\n\nfunction addStrings(node, add) {\n    node.walk(new TreeWalker(function(node) {\n        if (node instanceof AST_Sequence) {\n            addStrings(node.tail_node(), add);\n        } else if (node instanceof AST_String) {\n            add(node.value);\n        } else if (node instanceof AST_Conditional) {\n            addStrings(node.consequent, add);\n            addStrings(node.alternative, add);\n        }\n        return true;\n    }));\n}\n\nfunction mangle_private_properties(ast, options) {\n    var cprivate = -1;\n    var private_cache = new Map();\n    var nth_identifier = options.nth_identifier || base54;\n\n    ast =  ast.transform(new TreeTransformer(function(node) {\n        if (\n            node instanceof AST_ClassPrivateProperty\n            || node instanceof AST_PrivateMethod\n            || node instanceof AST_PrivateGetter\n            || node instanceof AST_PrivateSetter\n            || node instanceof AST_PrivateIn\n        ) {\n            node.key.name = mangle_private(node.key.name);\n        } else if (node instanceof AST_DotHash) {\n            node.property = mangle_private(node.property);\n        }\n    }));\n    return ast;\n\n    function mangle_private(name) {\n        let mangled = private_cache.get(name);\n        if (!mangled) {\n            mangled = nth_identifier.get(++cprivate);\n            private_cache.set(name, mangled);\n        }\n\n        return mangled;\n    }\n}\n\nfunction mangle_properties(ast, options) {\n    options = defaults(options, {\n        builtins: false,\n        cache: null,\n        debug: false,\n        keep_quoted: false,\n        nth_identifier: base54,\n        only_cache: false,\n        regex: null,\n        reserved: null,\n        undeclared: false,\n    }, true);\n\n    var nth_identifier = options.nth_identifier;\n\n    var reserved_option = options.reserved;\n    if (!Array.isArray(reserved_option)) reserved_option = [reserved_option];\n    var reserved = new Set(reserved_option);\n    if (!options.builtins) find_builtins(reserved);\n\n    var cname = -1;\n\n    var cache;\n    if (options.cache) {\n        cache = options.cache.props;\n    } else {\n        cache = new Map();\n    }\n\n    var regex = options.regex && new RegExp(options.regex);\n\n    // note debug is either false (disabled), or a string of the debug suffix to use (enabled).\n    // note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'\n    // the same as passing an empty string.\n    var debug = options.debug !== false;\n    var debug_name_suffix;\n    if (debug) {\n        debug_name_suffix = (options.debug === true ? \"\" : options.debug);\n    }\n\n    var names_to_mangle = new Set();\n    var unmangleable = new Set();\n    // Track each already-mangled name to prevent nth_identifier from generating\n    // the same name.\n    cache.forEach((mangled_name) => unmangleable.add(mangled_name));\n\n    var keep_quoted = !!options.keep_quoted;\n\n    // step 1: find candidates to mangle\n    ast.walk(new TreeWalker(function(node) {\n        if (\n            node instanceof AST_ClassPrivateProperty\n            || node instanceof AST_PrivateMethod\n            || node instanceof AST_PrivateGetter\n            || node instanceof AST_PrivateSetter\n            || node instanceof AST_DotHash\n        ) {\n            // handled by mangle_private_properties\n        } else if (node instanceof AST_ObjectKeyVal) {\n            if (typeof node.key == \"string\" && (!keep_quoted || !node.quote)) {\n                add(node.key);\n            }\n        } else if (node instanceof AST_ObjectProperty) {\n            // setter or getter, since KeyVal is handled above\n            if (!keep_quoted || !node.quote) {\n                add(node.key.name);\n            }\n        } else if (node instanceof AST_Dot) {\n            var declared = !!options.undeclared;\n            if (!declared) {\n                var root = node;\n                while (root.expression) {\n                    root = root.expression;\n                }\n                declared = !(root.thedef && root.thedef.undeclared);\n            }\n            if (declared &&\n                (!keep_quoted || !node.quote)) {\n                add(node.property);\n            }\n        } else if (node instanceof AST_Sub) {\n            if (!keep_quoted) {\n                addStrings(node.property, add);\n            }\n        } else if (node instanceof AST_Call\n            && node.expression.print_to_string() == \"Object.defineProperty\") {\n            addStrings(node.args[1], add);\n        } else if (node instanceof AST_Binary && node.operator === \"in\") {\n            addStrings(node.left, add);\n        } else if (node instanceof AST_String && has_annotation(node, _KEY)) {\n            add(node.value);\n        }\n    }));\n\n    // step 2: transform the tree, renaming properties\n    return ast.transform(new TreeTransformer(function(node) {\n        if (\n            node instanceof AST_ClassPrivateProperty\n            || node instanceof AST_PrivateMethod\n            || node instanceof AST_PrivateGetter\n            || node instanceof AST_PrivateSetter\n            || node instanceof AST_DotHash\n        ) {\n            // handled by mangle_private_properties\n        } else if (node instanceof AST_ObjectKeyVal) {\n            if (typeof node.key == \"string\" && (!keep_quoted || !node.quote)) {\n                node.key = mangle(node.key);\n            }\n        } else if (node instanceof AST_ObjectProperty) {\n            // setter, getter, method or class field\n            if (!keep_quoted || !node.quote) {\n                node.key.name = mangle(node.key.name);\n            }\n        } else if (node instanceof AST_Dot) {\n            if (!keep_quoted || !node.quote) {\n                node.property = mangle(node.property);\n            }\n        } else if (!keep_quoted && node instanceof AST_Sub) {\n            node.property = mangleStrings(node.property);\n        } else if (node instanceof AST_Call\n            && node.expression.print_to_string() == \"Object.defineProperty\") {\n            node.args[1] = mangleStrings(node.args[1]);\n        } else if (node instanceof AST_Binary && node.operator === \"in\") {\n            node.left = mangleStrings(node.left);\n        } else if (node instanceof AST_String && has_annotation(node, _KEY)) {\n            // Clear _KEY annotation to prevent double mangling\n            clear_annotation(node, _KEY);\n            node.value = mangle(node.value);\n        }\n    }));\n\n    // only function declarations after this line\n\n    function can_mangle(name) {\n        if (unmangleable.has(name)) return false;\n        if (reserved.has(name)) return false;\n        if (options.only_cache) {\n            return cache.has(name);\n        }\n        if (/^-?[0-9]+(\\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;\n        return true;\n    }\n\n    function should_mangle(name) {\n        if (regex && !regex.test(name)) return false;\n        if (reserved.has(name)) return false;\n        return cache.has(name)\n            || names_to_mangle.has(name);\n    }\n\n    function add(name) {\n        if (can_mangle(name))\n            names_to_mangle.add(name);\n\n        if (!should_mangle(name)) {\n            unmangleable.add(name);\n        }\n    }\n\n    function mangle(name) {\n        if (!should_mangle(name)) {\n            return name;\n        }\n\n        var mangled = cache.get(name);\n        if (!mangled) {\n            if (debug) {\n                // debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.\n                var debug_mangled = \"_$\" + name + \"$\" + debug_name_suffix + \"_\";\n\n                if (can_mangle(debug_mangled)) {\n                    mangled = debug_mangled;\n                }\n            }\n\n            // either debug mode is off, or it is on and we could not use the mangled name\n            if (!mangled) {\n                do {\n                    mangled = nth_identifier.get(++cname);\n                } while (!can_mangle(mangled));\n            }\n\n            cache.set(name, mangled);\n        }\n        return mangled;\n    }\n\n    function mangleStrings(node) {\n        return node.transform(new TreeTransformer(function(node) {\n            if (node instanceof AST_Sequence) {\n                var last = node.expressions.length - 1;\n                node.expressions[last] = mangleStrings(node.expressions[last]);\n            } else if (node instanceof AST_String) {\n                // Clear _KEY annotation to prevent double mangling\n                clear_annotation(node, _KEY);\n                node.value = mangle(node.value);\n            } else if (node instanceof AST_Conditional) {\n                node.consequent = mangleStrings(node.consequent);\n                node.alternative = mangleStrings(node.alternative);\n            }\n            return node;\n        }));\n    }\n}\n\nexport {\n    reserve_quoted_keys,\n    mangle_properties,\n    mangle_private_properties,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/scope.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n\nimport {\n    defaults,\n    keep_name,\n    mergeSort,\n    push_uniq,\n    make_node,\n    return_false,\n    return_this,\n    return_true,\n    string_template,\n} from \"./utils/index.js\";\nimport {\n    AST_Arrow,\n    AST_Block,\n    AST_Call,\n    AST_Class,\n    AST_Conditional,\n    AST_DefClass,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Dot,\n    AST_DotHash,\n    AST_Export,\n    AST_For,\n    AST_ForIn,\n    AST_ForOf,\n    AST_Function,\n    AST_Import,\n    AST_IterationStatement,\n    AST_Label,\n    AST_LabeledStatement,\n    AST_LabelRef,\n    AST_Lambda,\n    AST_LoopControl,\n    AST_NameMapping,\n    AST_Node,\n    AST_Scope,\n    AST_Sequence,\n    AST_String,\n    AST_Sub,\n    AST_Switch,\n    AST_SwitchBranch,\n    AST_Symbol,\n    AST_SymbolBlockDeclaration,\n    AST_SymbolCatch,\n    AST_SymbolClass,\n    AST_SymbolConst,\n    AST_SymbolDefClass,\n    AST_SymbolDefun,\n    AST_SymbolExport,\n    AST_SymbolFunarg,\n    AST_SymbolImport,\n    AST_SymbolLambda,\n    AST_SymbolLet,\n    AST_SymbolMethod,\n    AST_SymbolRef,\n    AST_SymbolVar,\n    AST_Toplevel,\n    AST_VarDef,\n    AST_With,\n    TreeWalker,\n    walk,\n    walk_abort\n} from \"./ast.js\";\nimport {\n    ALL_RESERVED_WORDS,\n    js_error,\n} from \"./parse.js\";\n\nconst MASK_EXPORT_DONT_MANGLE = 1 << 0;\nconst MASK_EXPORT_WANT_MANGLE = 1 << 1;\n\nlet function_defs = null;\nlet unmangleable_names = null;\n/**\n * When defined, there is a function declaration somewhere that's inside of a block.\n * See https://tc39.es/ecma262/multipage/additional-ecmascript-features-for-web-browsers.html#sec-block-level-function-declarations-web-legacy-compatibility-semantics\n*/\nlet scopes_with_block_defuns = null;\n\nclass SymbolDef {\n    constructor(scope, orig, init) {\n        this.name = orig.name;\n        this.orig = [ orig ];\n        this.init = init;\n        this.eliminated = 0;\n        this.assignments = 0;\n        this.scope = scope;\n        this.replaced = 0;\n        this.global = false;\n        this.export = 0;\n        this.mangled_name = null;\n        this.undeclared = false;\n        this.id = SymbolDef.next_id++;\n        this.chained = false;\n        this.direct_access = false;\n        this.escaped = 0;\n        this.recursive_refs = 0;\n        this.references = [];\n        this.should_replace = undefined;\n        this.single_use = false;\n        this.fixed = false;\n        Object.seal(this);\n    }\n    fixed_value() {\n        if (!this.fixed || this.fixed instanceof AST_Node) return this.fixed;\n        return this.fixed();\n    }\n    unmangleable(options) {\n        if (!options) options = {};\n\n        if (\n            function_defs &&\n            function_defs.has(this.id) &&\n            keep_name(options.keep_fnames, this.orig[0].name)\n        ) return true;\n\n        return this.global && !options.toplevel\n            || (this.export & MASK_EXPORT_DONT_MANGLE)\n            || this.undeclared\n            || !options.eval && this.scope.pinned()\n            || (this.orig[0] instanceof AST_SymbolLambda\n                  || this.orig[0] instanceof AST_SymbolDefun) && keep_name(options.keep_fnames, this.orig[0].name)\n            || this.orig[0] instanceof AST_SymbolMethod\n            || (this.orig[0] instanceof AST_SymbolClass\n                  || this.orig[0] instanceof AST_SymbolDefClass) && keep_name(options.keep_classnames, this.orig[0].name);\n    }\n    mangle(options) {\n        const cache = options.cache && options.cache.props;\n        if (this.global && cache && cache.has(this.name)) {\n            this.mangled_name = cache.get(this.name);\n        } else if (!this.mangled_name && !this.unmangleable(options)) {\n            var s = this.scope;\n            var sym = this.orig[0];\n            if (options.ie8 && sym instanceof AST_SymbolLambda)\n                s = s.parent_scope;\n            const redefinition = redefined_catch_def(this);\n            this.mangled_name = redefinition\n                ? redefinition.mangled_name || redefinition.name\n                : s.next_mangled(options, this);\n            if (this.global && cache) {\n                cache.set(this.name, this.mangled_name);\n            }\n        }\n    }\n}\n\nSymbolDef.next_id = 1;\n\nfunction redefined_catch_def(def) {\n    if (def.orig[0] instanceof AST_SymbolCatch\n        && def.scope.is_block_scope()\n    ) {\n        return def.scope.get_defun_scope().variables.get(def.name);\n    }\n}\n\nAST_Scope.DEFMETHOD(\"figure_out_scope\", function(options, { parent_scope = null, toplevel = this } = {}) {\n    options = defaults(options, {\n        cache: null,\n        ie8: false,\n        safari10: false,\n    });\n\n    if (!(toplevel instanceof AST_Toplevel)) {\n        throw new Error(\"Invalid toplevel scope\");\n    }\n\n    // pass 1: setup scope chaining and handle definitions\n    var scope = this.parent_scope = parent_scope;\n    var labels = new Map();\n    var defun = null;\n    var in_destructuring = null;\n    var for_scopes = [];\n    var tw = new TreeWalker((node, descend) => {\n        if (node.is_block_scope()) {\n            const save_scope = scope;\n            node.block_scope = scope = new AST_Scope(node);\n            scope._block_scope = true;\n            scope.init_scope_vars(save_scope);\n            scope.uses_with = save_scope.uses_with;\n            scope.uses_eval = save_scope.uses_eval;\n\n            if (options.safari10) {\n                if (node instanceof AST_For || node instanceof AST_ForIn || node instanceof AST_ForOf) {\n                    for_scopes.push(scope);\n                }\n            }\n\n            if (node instanceof AST_Switch) {\n                // XXX: HACK! Ensure the switch expression gets the correct scope (the parent scope) and the body gets the contained scope\n                // AST_Switch has a scope within the body, but it itself \"is a block scope\"\n                // This means the switched expression has to belong to the outer scope\n                // while the body inside belongs to the switch itself.\n                // This is pretty nasty and warrants an AST change\n                const the_block_scope = scope;\n                scope = save_scope;\n                node.expression.walk(tw);\n                scope = the_block_scope;\n                for (let i = 0; i < node.body.length; i++) {\n                    node.body[i].walk(tw);\n                }\n            } else {\n                descend();\n            }\n            scope = save_scope;\n            return true;\n        }\n        if (node instanceof AST_Destructuring) {\n            const save_destructuring = in_destructuring;\n            in_destructuring = node;\n            descend();\n            in_destructuring = save_destructuring;\n            return true;\n        }\n        if (node instanceof AST_Scope) {\n            node.init_scope_vars(scope);\n            var save_scope = scope;\n            var save_defun = defun;\n            var save_labels = labels;\n            defun = scope = node;\n            labels = new Map();\n            descend();\n            scope = save_scope;\n            defun = save_defun;\n            labels = save_labels;\n            return true;        // don't descend again in TreeWalker\n        }\n        if (node instanceof AST_LabeledStatement) {\n            var l = node.label;\n            if (labels.has(l.name)) {\n                throw new Error(string_template(\"Label {name} defined twice\", l));\n            }\n            labels.set(l.name, l);\n            descend();\n            labels.delete(l.name);\n            return true;        // no descend again\n        }\n        if (node instanceof AST_With) {\n            for (var s = scope; s; s = s.parent_scope)\n                s.uses_with = true;\n            return;\n        }\n        if (node instanceof AST_Symbol) {\n            node.scope = scope;\n        }\n        if (node instanceof AST_Label) {\n            node.thedef = node;\n            node.references = [];\n        }\n        if (node instanceof AST_SymbolLambda) {\n            defun.def_function(node, node.name == \"arguments\" ? undefined : defun);\n        } else if (node instanceof AST_SymbolDefun) {\n            // Careful here, the scope where this should be defined is\n            // the parent scope.  The reason is that we enter a new\n            // scope when we encounter the AST_Defun node (which is\n            // instanceof AST_Scope) but we get to the symbol a bit\n            // later.\n            const closest_scope = defun.parent_scope;\n\n            // In strict mode, function definitions are block-scoped\n            node.scope = tw.directives[\"use strict\"]\n                ? closest_scope\n                : closest_scope.get_defun_scope();\n\n            mark_export(node.scope.def_function(node, defun), 1);\n        } else if (node instanceof AST_SymbolClass) {\n            mark_export(defun.def_variable(node, defun), 1);\n        } else if (node instanceof AST_SymbolImport) {\n            scope.def_variable(node);\n        } else if (node instanceof AST_SymbolDefClass) {\n            // This deals with the name of the class being available\n            // inside the class.\n            mark_export((node.scope = defun.parent_scope).def_function(node, defun), 1);\n        } else if (\n            node instanceof AST_SymbolVar\n            || node instanceof AST_SymbolLet\n            || node instanceof AST_SymbolConst\n            || node instanceof AST_SymbolCatch\n        ) {\n            var def;\n            if (node instanceof AST_SymbolBlockDeclaration) {\n                def = scope.def_variable(node, null);\n            } else {\n                def = defun.def_variable(node, node.TYPE == \"SymbolVar\" ? null : undefined);\n            }\n            if (!def.orig.every((sym) => {\n                if (sym === node) return true;\n                if (node instanceof AST_SymbolBlockDeclaration) {\n                    return sym instanceof AST_SymbolLambda;\n                }\n                return !(sym instanceof AST_SymbolLet || sym instanceof AST_SymbolConst);\n            })) {\n                js_error(\n                    `\"${node.name}\" is redeclared`,\n                    node.start.file,\n                    node.start.line,\n                    node.start.col,\n                    node.start.pos\n                );\n            }\n            if (!(node instanceof AST_SymbolFunarg)) mark_export(def, 2);\n            if (defun !== scope) {\n                node.mark_enclosed();\n                var def = scope.find_variable(node);\n                if (node.thedef !== def) {\n                    node.thedef = def;\n                    node.reference();\n                }\n            }\n        } else if (node instanceof AST_LabelRef) {\n            var sym = labels.get(node.name);\n            if (!sym) throw new Error(string_template(\"Undefined label {name} [{line},{col}]\", {\n                name: node.name,\n                line: node.start.line,\n                col: node.start.col\n            }));\n            node.thedef = sym;\n        }\n        if (!(scope instanceof AST_Toplevel) && (node instanceof AST_Export || node instanceof AST_Import)) {\n            js_error(\n                `\"${node.TYPE}\" statement may only appear at the top level`,\n                node.start.file,\n                node.start.line,\n                node.start.col,\n                node.start.pos\n            );\n        }\n    });\n    this.walk(tw);\n\n    function mark_export(def, level) {\n        if (in_destructuring) {\n            var i = 0;\n            do {\n                level++;\n            } while (tw.parent(i++) !== in_destructuring);\n        }\n        var node = tw.parent(level);\n        if (def.export = node instanceof AST_Export ? MASK_EXPORT_DONT_MANGLE : 0) {\n            var exported = node.exported_definition;\n            if ((exported instanceof AST_Defun || exported instanceof AST_DefClass) && node.is_default) {\n                def.export = MASK_EXPORT_WANT_MANGLE;\n            }\n        }\n    }\n\n    // pass 2: find back references and eval\n    const is_toplevel = this instanceof AST_Toplevel;\n    if (is_toplevel) {\n        this.globals = new Map();\n    }\n\n    var tw = new TreeWalker(node => {\n        if (node instanceof AST_LoopControl && node.label) {\n            node.label.thedef.references.push(node);\n            return true;\n        }\n        if (node instanceof AST_SymbolRef) {\n            var name = node.name;\n            if (name == \"eval\" && tw.parent() instanceof AST_Call) {\n                for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {\n                    s.uses_eval = true;\n                }\n            }\n            var sym;\n            if (tw.parent() instanceof AST_NameMapping && tw.parent(1).module_name\n                || !(sym = node.scope.find_variable(name))) {\n\n                sym = toplevel.def_global(node);\n                if (node instanceof AST_SymbolExport) sym.export = MASK_EXPORT_DONT_MANGLE;\n            } else if (sym.scope instanceof AST_Lambda && name == \"arguments\") {\n                sym.scope.get_defun_scope().uses_arguments = true;\n            }\n            node.thedef = sym;\n            node.reference();\n            if (node.scope.is_block_scope()\n                && !(sym.orig[0] instanceof AST_SymbolBlockDeclaration)) {\n                node.scope = node.scope.get_defun_scope();\n            }\n            return true;\n        }\n        // ensure mangling works if catch reuses a scope variable\n        var def;\n        if (node instanceof AST_SymbolCatch && (def = redefined_catch_def(node.definition()))) {\n            var s = node.scope;\n            while (s) {\n                push_uniq(s.enclosed, def);\n                if (s === def.scope) break;\n                s = s.parent_scope;\n            }\n        }\n    });\n    this.walk(tw);\n\n    // pass 3: work around IE8 and Safari catch scope bugs\n    if (options.ie8 || options.safari10) {\n        walk(this, node => {\n            if (node instanceof AST_SymbolCatch) {\n                var name = node.name;\n                var refs = node.thedef.references;\n                var scope = node.scope.get_defun_scope();\n                var def = scope.find_variable(name)\n                    || toplevel.globals.get(name)\n                    || scope.def_variable(node);\n                refs.forEach(function(ref) {\n                    ref.thedef = def;\n                    ref.reference();\n                });\n                node.thedef = def;\n                node.reference();\n                return true;\n            }\n        });\n    }\n\n    // pass 4: add symbol definitions to loop scopes\n    // Safari/Webkit bug workaround - loop init let variable shadowing argument.\n    // https://github.com/mishoo/UglifyJS2/issues/1753\n    // https://bugs.webkit.org/show_bug.cgi?id=171041\n    if (options.safari10) {\n        for (const scope of for_scopes) {\n            scope.parent_scope.variables.forEach(function(def) {\n                push_uniq(scope.enclosed, def);\n            });\n        }\n    }\n});\n\nAST_Toplevel.DEFMETHOD(\"def_global\", function(node) {\n    var globals = this.globals, name = node.name;\n    if (globals.has(name)) {\n        return globals.get(name);\n    } else {\n        var g = new SymbolDef(this, node);\n        g.undeclared = true;\n        g.global = true;\n        globals.set(name, g);\n        return g;\n    }\n});\n\nAST_Scope.DEFMETHOD(\"init_scope_vars\", function(parent_scope) {\n    this.variables = new Map();         // map name to AST_SymbolVar (variables defined in this scope; includes functions)\n    this.uses_with = false;             // will be set to true if this or some nested scope uses the `with` statement\n    this.uses_eval = false;             // will be set to true if this or nested scope uses the global `eval`\n    this.parent_scope = parent_scope;   // the parent scope\n    this.enclosed = [];                 // a list of variables from this or outer scope(s) that are referenced from this or inner scopes\n    this.cname = -1;                    // the current index for mangling functions/variables\n});\n\nAST_Scope.DEFMETHOD(\"conflicting_def\", function (name) {\n    return (\n        this.enclosed.find(def => def.name === name)\n        || this.variables.has(name)\n        || (this.parent_scope && this.parent_scope.conflicting_def(name))\n    );\n});\n\nAST_Scope.DEFMETHOD(\"conflicting_def_shallow\", function (name) {\n    return (\n        this.enclosed.find(def => def.name === name)\n        || this.variables.has(name)\n    );\n});\n\nAST_Scope.DEFMETHOD(\"add_child_scope\", function (scope) {\n    // `scope` is going to be moved into `this` right now.\n    // Update the required scopes' information\n\n    if (scope.parent_scope === this) return;\n\n    scope.parent_scope = this;\n\n    // Propagate to this.uses_arguments from arrow functions\n    if ((scope instanceof AST_Arrow) && !this.uses_arguments) {\n        this.uses_arguments = walk(scope, node => {\n            if (\n                node instanceof AST_SymbolRef\n                && node.scope instanceof AST_Lambda\n                && node.name === \"arguments\"\n            ) {\n                return walk_abort;\n            }\n\n            if (node instanceof AST_Lambda && !(node instanceof AST_Arrow)) {\n                return true;\n            }\n        });\n    }\n\n    this.uses_with = this.uses_with || scope.uses_with;\n    this.uses_eval = this.uses_eval || scope.uses_eval;\n\n    const scope_ancestry = (() => {\n        const ancestry = [];\n        let cur = this;\n        do {\n            ancestry.push(cur);\n        } while ((cur = cur.parent_scope));\n        ancestry.reverse();\n        return ancestry;\n    })();\n\n    const new_scope_enclosed_set = new Set(scope.enclosed);\n    const to_enclose = [];\n    for (const scope_topdown of scope_ancestry) {\n        to_enclose.forEach(e => push_uniq(scope_topdown.enclosed, e));\n        for (const def of scope_topdown.variables.values()) {\n            if (new_scope_enclosed_set.has(def)) {\n                push_uniq(to_enclose, def);\n                push_uniq(scope_topdown.enclosed, def);\n            }\n        }\n    }\n});\n\nfunction find_scopes_visible_from(scopes) {\n    const found_scopes = new Set();\n\n    for (const scope of new Set(scopes)) {\n        (function bubble_up(scope) {\n            if (scope == null || found_scopes.has(scope)) return;\n\n            found_scopes.add(scope);\n\n            bubble_up(scope.parent_scope);\n        })(scope);\n    }\n\n    return [...found_scopes];\n}\n\n// Creates a symbol during compression\nAST_Scope.DEFMETHOD(\"create_symbol\", function(SymClass, {\n    source,\n    tentative_name,\n    scope,\n    conflict_scopes = [scope],\n    init = null\n} = {}) {\n    let symbol_name;\n\n    conflict_scopes = find_scopes_visible_from(conflict_scopes);\n\n    if (tentative_name) {\n        // Implement hygiene (no new names are conflicting with existing names)\n        tentative_name =\n            symbol_name =\n            tentative_name.replace(/(?:^[^a-z_$]|[^a-z0-9_$])/ig, \"_\");\n\n        let i = 0;\n        while (conflict_scopes.find(s => s.conflicting_def_shallow(symbol_name))) {\n            symbol_name = tentative_name + \"$\" + i++;\n        }\n    }\n\n    if (!symbol_name) {\n        throw new Error(\"No symbol name could be generated in create_symbol()\");\n    }\n\n    const symbol = make_node(SymClass, source, {\n        name: symbol_name,\n        scope\n    });\n\n    this.def_variable(symbol, init || null);\n\n    symbol.mark_enclosed();\n\n    return symbol;\n});\n\n\nAST_Node.DEFMETHOD(\"is_block_scope\", return_false);\nAST_Class.DEFMETHOD(\"is_block_scope\", return_false);\nAST_Lambda.DEFMETHOD(\"is_block_scope\", return_false);\nAST_Toplevel.DEFMETHOD(\"is_block_scope\", return_false);\nAST_SwitchBranch.DEFMETHOD(\"is_block_scope\", return_false);\nAST_Block.DEFMETHOD(\"is_block_scope\", return_true);\nAST_Scope.DEFMETHOD(\"is_block_scope\", function () {\n    return this._block_scope || false;\n});\nAST_IterationStatement.DEFMETHOD(\"is_block_scope\", return_true);\n\nAST_Lambda.DEFMETHOD(\"init_scope_vars\", function() {\n    AST_Scope.prototype.init_scope_vars.apply(this, arguments);\n    this.uses_arguments = false;\n    this.def_variable(new AST_SymbolFunarg({\n        name: \"arguments\",\n        start: this.start,\n        end: this.end\n    }));\n});\n\nAST_Arrow.DEFMETHOD(\"init_scope_vars\", function() {\n    AST_Scope.prototype.init_scope_vars.apply(this, arguments);\n    this.uses_arguments = false;\n});\n\nAST_Symbol.DEFMETHOD(\"mark_enclosed\", function() {\n    var def = this.definition();\n    var s = this.scope;\n    while (s) {\n        push_uniq(s.enclosed, def);\n        if (s === def.scope) break;\n        s = s.parent_scope;\n    }\n});\n\nAST_Symbol.DEFMETHOD(\"reference\", function() {\n    this.definition().references.push(this);\n    this.mark_enclosed();\n});\n\nAST_Scope.DEFMETHOD(\"find_variable\", function(name) {\n    if (name instanceof AST_Symbol) name = name.name;\n    return this.variables.get(name)\n        || (this.parent_scope && this.parent_scope.find_variable(name));\n});\n\nAST_Scope.DEFMETHOD(\"def_function\", function(symbol, init) {\n    var def = this.def_variable(symbol, init);\n    if (!def.init || def.init instanceof AST_Defun) def.init = init;\n    return def;\n});\n\nAST_Scope.DEFMETHOD(\"def_variable\", function(symbol, init) {\n    var def = this.variables.get(symbol.name);\n    if (def) {\n        def.orig.push(symbol);\n        if (def.init && (def.scope !== symbol.scope || def.init instanceof AST_Function)) {\n            def.init = init;\n        }\n    } else {\n        def = new SymbolDef(this, symbol, init);\n        this.variables.set(symbol.name, def);\n        def.global = !this.parent_scope;\n    }\n    return symbol.thedef = def;\n});\n\nfunction next_mangled(scope, options) {\n    let defun_scope;\n    if (\n        scopes_with_block_defuns\n        && (defun_scope = scope.get_defun_scope())\n        && scopes_with_block_defuns.has(defun_scope)\n    ) {\n        scope = defun_scope;\n    }\n\n    var ext = scope.enclosed;\n    var nth_identifier = options.nth_identifier;\n    out: while (true) {\n        var m = nth_identifier.get(++scope.cname);\n        if (ALL_RESERVED_WORDS.has(m)) continue; // skip over \"do\"\n\n        // https://github.com/mishoo/UglifyJS2/issues/242 -- do not\n        // shadow a name reserved from mangling.\n        if (options.reserved.has(m)) continue;\n\n        // Functions with short names might collide with base54 output\n        // and therefore cause collisions when keep_fnames is true.\n        if (unmangleable_names && unmangleable_names.has(m)) continue out;\n\n        // we must ensure that the mangled name does not shadow a name\n        // from some parent scope that is referenced in this or in\n        // inner scopes.\n        for (let i = ext.length; --i >= 0;) {\n            const def = ext[i];\n            const name = def.mangled_name || (def.unmangleable(options) && def.name);\n            if (m == name) continue out;\n        }\n        return m;\n    }\n}\n\nAST_Scope.DEFMETHOD(\"next_mangled\", function(options) {\n    return next_mangled(this, options);\n});\n\nAST_Toplevel.DEFMETHOD(\"next_mangled\", function(options) {\n    let name;\n    const mangled_names = this.mangled_names;\n    do {\n        name = next_mangled(this, options);\n    } while (mangled_names.has(name));\n    return name;\n});\n\nAST_Function.DEFMETHOD(\"next_mangled\", function(options, def) {\n    // #179, #326\n    // in Safari strict mode, something like (function x(x){...}) is a syntax error;\n    // a function expression's argument cannot shadow the function expression's name\n\n    var tricky_def = def.orig[0] instanceof AST_SymbolFunarg && this.name && this.name.definition();\n\n    // the function's mangled_name is null when keep_fnames is true\n    var tricky_name = tricky_def ? tricky_def.mangled_name || tricky_def.name : null;\n\n    while (true) {\n        var name = next_mangled(this, options);\n        if (!tricky_name || tricky_name != name)\n            return name;\n    }\n});\n\nAST_Symbol.DEFMETHOD(\"unmangleable\", function(options) {\n    var def = this.definition();\n    return !def || def.unmangleable(options);\n});\n\n// labels are always mangleable\nAST_Label.DEFMETHOD(\"unmangleable\", return_false);\n\nAST_Symbol.DEFMETHOD(\"unreferenced\", function() {\n    return !this.definition().references.length && !this.scope.pinned();\n});\n\nAST_Symbol.DEFMETHOD(\"definition\", function() {\n    return this.thedef;\n});\n\nAST_Symbol.DEFMETHOD(\"global\", function() {\n    return this.thedef.global;\n});\n\n/**\n * Format the mangler options (if any) into their appropriate types\n */\nexport function format_mangler_options(options) {\n    options = defaults(options, {\n        eval        : false,\n        nth_identifier : base54,\n        ie8         : false,\n        keep_classnames: false,\n        keep_fnames : false,\n        module      : false,\n        reserved    : [],\n        toplevel    : false,\n    });\n    if (options.module) options.toplevel = true;\n    if (!Array.isArray(options.reserved)\n        && !(options.reserved instanceof Set)\n    ) {\n        options.reserved = [];\n    }\n    options.reserved = new Set(options.reserved);\n    // Never mangle arguments\n    options.reserved.add(\"arguments\");\n    return options;\n}\n\nAST_Toplevel.DEFMETHOD(\"mangle_names\", function(options) {\n    options = format_mangler_options(options);\n    var nth_identifier = options.nth_identifier;\n\n    // We only need to mangle declaration nodes.  Special logic wired\n    // into the code generator will display the mangled name if it's\n    // present (and for AST_SymbolRef-s it'll use the mangled name of\n    // the AST_SymbolDeclaration that it points to).\n    var lname = -1;\n    var to_mangle = [];\n\n    if (options.keep_fnames) {\n        function_defs = new Set();\n    }\n\n    const mangled_names = this.mangled_names = new Set();\n    unmangleable_names = new Set();\n\n    if (options.cache) {\n        this.globals.forEach(collect);\n        if (options.cache.props) {\n            options.cache.props.forEach(function(mangled_name) {\n                mangled_names.add(mangled_name);\n            });\n        }\n    }\n\n    var tw = new TreeWalker(function(node, descend) {\n        if (node instanceof AST_LabeledStatement) {\n            // lname is incremented when we get to the AST_Label\n            var save_nesting = lname;\n            descend();\n            lname = save_nesting;\n            return true;        // don't descend again in TreeWalker\n        }\n        if (\n            node instanceof AST_Defun\n            && !(tw.parent() instanceof AST_Scope)\n        ) {\n            scopes_with_block_defuns = scopes_with_block_defuns || new Set();\n            scopes_with_block_defuns.add(node.parent_scope.get_defun_scope());\n        }\n        if (node instanceof AST_Scope) {\n            node.variables.forEach(collect);\n            return;\n        }\n        if (node.is_block_scope()) {\n            node.block_scope.variables.forEach(collect);\n            return;\n        }\n        if (\n            function_defs\n            && node instanceof AST_VarDef\n            && node.value instanceof AST_Lambda\n            && !node.value.name\n            && keep_name(options.keep_fnames, node.name.name)\n        ) {\n            function_defs.add(node.name.definition().id);\n            return;\n        }\n        if (node instanceof AST_Label) {\n            let name;\n            do {\n                name = nth_identifier.get(++lname);\n            } while (ALL_RESERVED_WORDS.has(name));\n            node.mangled_name = name;\n            return true;\n        }\n        if (!(options.ie8 || options.safari10) && node instanceof AST_SymbolCatch) {\n            to_mangle.push(node.definition());\n            return;\n        }\n    });\n\n    this.walk(tw);\n\n    if (options.keep_fnames || options.keep_classnames) {\n        // Collect a set of short names which are unmangleable,\n        // for use in avoiding collisions in next_mangled.\n        to_mangle.forEach(def => {\n            if (def.name.length < 6 && def.unmangleable(options)) {\n                unmangleable_names.add(def.name);\n            }\n        });\n    }\n\n    to_mangle.forEach(def => { def.mangle(options); });\n\n    function_defs = null;\n    unmangleable_names = null;\n    scopes_with_block_defuns = null;\n\n    function collect(symbol) {\n        if (symbol.export & MASK_EXPORT_DONT_MANGLE) {\n            unmangleable_names.add(symbol.name);\n        } else if (!options.reserved.has(symbol.name)) {\n            to_mangle.push(symbol);\n        }\n    }\n});\n\nAST_Toplevel.DEFMETHOD(\"find_colliding_names\", function(options) {\n    const cache = options.cache && options.cache.props;\n    const avoid = new Set();\n    options.reserved.forEach(to_avoid);\n    this.globals.forEach(add_def);\n    this.walk(new TreeWalker(function(node) {\n        if (node instanceof AST_Scope) node.variables.forEach(add_def);\n        if (node instanceof AST_SymbolCatch) add_def(node.definition());\n    }));\n    return avoid;\n\n    function to_avoid(name) {\n        avoid.add(name);\n    }\n\n    function add_def(def) {\n        var name = def.name;\n        if (def.global && cache && cache.has(name)) name = cache.get(name);\n        else if (!def.unmangleable(options)) return;\n        to_avoid(name);\n    }\n});\n\nAST_Toplevel.DEFMETHOD(\"expand_names\", function(options) {\n    options = format_mangler_options(options);\n    var nth_identifier = options.nth_identifier;\n    if (nth_identifier.reset && nth_identifier.sort) {\n        nth_identifier.reset();\n        nth_identifier.sort();\n    }\n    var avoid = this.find_colliding_names(options);\n    var cname = 0;\n    this.globals.forEach(rename);\n    this.walk(new TreeWalker(function(node) {\n        if (node instanceof AST_Scope) node.variables.forEach(rename);\n        if (node instanceof AST_SymbolCatch) rename(node.definition());\n    }));\n\n    function next_name() {\n        var name;\n        do {\n            name = nth_identifier.get(cname++);\n        } while (avoid.has(name) || ALL_RESERVED_WORDS.has(name));\n        return name;\n    }\n\n    function rename(def) {\n        if (def.global && options.cache) return;\n        if (def.unmangleable(options)) return;\n        if (options.reserved.has(def.name)) return;\n        const redefinition = redefined_catch_def(def);\n        const name = def.name = redefinition ? redefinition.name : next_name();\n        def.orig.forEach(function(sym) {\n            sym.name = name;\n        });\n        def.references.forEach(function(sym) {\n            sym.name = name;\n        });\n    }\n});\n\nAST_Node.DEFMETHOD(\"tail_node\", return_this);\nAST_Sequence.DEFMETHOD(\"tail_node\", function() {\n    return this.expressions[this.expressions.length - 1];\n});\n\nAST_Toplevel.DEFMETHOD(\"compute_char_frequency\", function(options) {\n    options = format_mangler_options(options);\n    var nth_identifier = options.nth_identifier;\n    if (!nth_identifier.reset || !nth_identifier.consider || !nth_identifier.sort) {\n        // If the identifier mangler is invariant, skip computing character frequency.\n        return;\n    }\n    nth_identifier.reset();\n\n    try {\n        AST_Node.prototype.print = function(stream, force_parens) {\n            this._print(stream, force_parens);\n            if (this instanceof AST_Symbol && !this.unmangleable(options)) {\n                nth_identifier.consider(this.name, -1);\n            } else if (options.properties) {\n                if (this instanceof AST_DotHash) {\n                    nth_identifier.consider(\"#\" + this.property, -1);\n                } else if (this instanceof AST_Dot) {\n                    nth_identifier.consider(this.property, -1);\n                } else if (this instanceof AST_Sub) {\n                    skip_string(this.property);\n                }\n            }\n        };\n        nth_identifier.consider(this.print_to_string(), 1);\n    } finally {\n        AST_Node.prototype.print = AST_Node.prototype._print;\n    }\n    nth_identifier.sort();\n\n    function skip_string(node) {\n        if (node instanceof AST_String) {\n            nth_identifier.consider(node.value, -1);\n        } else if (node instanceof AST_Conditional) {\n            skip_string(node.consequent);\n            skip_string(node.alternative);\n        } else if (node instanceof AST_Sequence) {\n            skip_string(node.tail_node());\n        }\n    }\n});\n\nconst base54 = (() => {\n    const leading = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_\".split(\"\");\n    const digits = \"0123456789\".split(\"\");\n    let chars;\n    let frequency;\n    function reset() {\n        frequency = new Map();\n        leading.forEach(function(ch) {\n            frequency.set(ch, 0);\n        });\n        digits.forEach(function(ch) {\n            frequency.set(ch, 0);\n        });\n    }\n    function consider(str, delta) {\n        for (var i = str.length; --i >= 0;) {\n            frequency.set(str[i], frequency.get(str[i]) + delta);\n        }\n    }\n    function compare(a, b) {\n        return frequency.get(b) - frequency.get(a);\n    }\n    function sort() {\n        chars = mergeSort(leading, compare).concat(mergeSort(digits, compare));\n    }\n    // Ensure this is in a usable initial state.\n    reset();\n    sort();\n    function base54(num) {\n        var ret = \"\", base = 54;\n        num++;\n        do {\n            num--;\n            ret += chars[num % base];\n            num = Math.floor(num / base);\n            base = 64;\n        } while (num > 0);\n        return ret;\n    }\n\n    return {\n        get: base54,\n        consider,\n        reset,\n        sort\n    };\n})();\n\nexport {\n    base54,\n    SymbolDef,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/size.js",
    "content": "import {\n    AST_Accessor,\n    AST_Array,\n    AST_Arrow,\n    AST_Await,\n    AST_BigInt,\n    AST_Binary,\n    AST_Block,\n    AST_Break,\n    AST_Call,\n    AST_Case,\n    AST_Class,\n    AST_ClassStaticBlock,\n    AST_ClassPrivateProperty,\n    AST_ClassProperty,\n    AST_ConciseMethod,\n    AST_Conditional,\n    AST_Const,\n    AST_Continue,\n    AST_Debugger,\n    AST_Default,\n    AST_Defun,\n    AST_Destructuring,\n    AST_Directive,\n    AST_Do,\n    AST_Dot,\n    AST_DotHash,\n    AST_EmptyStatement,\n    AST_Expansion,\n    AST_Export,\n    AST_False,\n    AST_For,\n    AST_ForIn,\n    AST_Function,\n    AST_Hole,\n    AST_If,\n    AST_Import,\n    AST_ImportMeta,\n    AST_Infinity,\n    AST_LabeledStatement,\n    AST_Let,\n    AST_NameMapping,\n    AST_NaN,\n    AST_New,\n    AST_NewTarget,\n    AST_Node,\n    AST_Null,\n    AST_Number,\n    AST_Object,\n    AST_ObjectKeyVal,\n    AST_ObjectGetter,\n    AST_ObjectSetter,\n    AST_PrivateGetter,\n    AST_PrivateMethod,\n    AST_PrivateSetter,\n    AST_PrivateIn,\n    AST_RegExp,\n    AST_Return,\n    AST_Sequence,\n    AST_String,\n    AST_Sub,\n    AST_Super,\n    AST_Switch,\n    AST_Symbol,\n    AST_SymbolClassProperty,\n    AST_SymbolExportForeign,\n    AST_SymbolImportForeign,\n    AST_SymbolRef,\n    AST_SymbolDeclaration,\n    AST_TemplateSegment,\n    AST_TemplateString,\n    AST_This,\n    AST_Throw,\n    AST_Toplevel,\n    AST_True,\n    AST_Try,\n    AST_Catch,\n    AST_Finally,\n    AST_Unary,\n    AST_Undefined,\n    AST_Var,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n    walk_parent\n} from \"./ast.js\";\nimport { first_in_statement } from \"./utils/first_in_statement.js\";\n\nlet mangle_options = undefined;\nAST_Node.prototype.size = function (compressor, stack) {\n    mangle_options = compressor && compressor.mangle_options;\n\n    let size = 0;\n    walk_parent(this, (node, info) => {\n        size += node._size(info);\n\n        // Braceless arrow functions have fake \"return\" statements\n        if (node instanceof AST_Arrow && node.is_braceless()) {\n            size += node.body[0].value._size(info);\n            return true;\n        }\n    }, stack || (compressor && compressor.stack));\n\n    // just to save a bit of memory\n    mangle_options = undefined;\n\n    return size;\n};\n\nAST_Node.prototype._size = () => 0;\n\nAST_Debugger.prototype._size = () => 8;\n\nAST_Directive.prototype._size = function () {\n    // TODO string encoding stuff\n    return 2 + this.value.length;\n};\n\n/** Count commas/semicolons necessary to show a list of expressions/statements */\nconst list_overhead = (array) => array.length && array.length - 1;\n\nAST_Block.prototype._size = function () {\n    return 2 + list_overhead(this.body);\n};\n\nAST_Toplevel.prototype._size = function() {\n    return list_overhead(this.body);\n};\n\nAST_EmptyStatement.prototype._size = () => 1;\n\nAST_LabeledStatement.prototype._size = () => 2;  // x:\n\nAST_Do.prototype._size = () => 9;\n\nAST_While.prototype._size = () => 7;\n\nAST_For.prototype._size = () => 8;\n\nAST_ForIn.prototype._size = () => 8;\n// AST_ForOf inherits ^\n\nAST_With.prototype._size = () => 6;\n\nAST_Expansion.prototype._size = () => 3;\n\nconst lambda_modifiers = func =>\n    (func.is_generator ? 1 : 0) + (func.async ? 6 : 0);\n\nAST_Accessor.prototype._size = function () {\n    return lambda_modifiers(this) + 4 + list_overhead(this.argnames) + list_overhead(this.body);\n};\n\nAST_Function.prototype._size = function (info) {\n    const first = !!first_in_statement(info);\n    return (first * 2) + lambda_modifiers(this) + 12 + list_overhead(this.argnames) + list_overhead(this.body);\n};\n\nAST_Defun.prototype._size = function () {\n    return lambda_modifiers(this) + 13 + list_overhead(this.argnames) + list_overhead(this.body);\n};\n\nAST_Arrow.prototype._size = function () {\n    let args_and_arrow = 2 + list_overhead(this.argnames);\n\n    if (\n        !(\n            this.argnames.length === 1\n            && this.argnames[0] instanceof AST_Symbol\n        )\n    ) {\n        args_and_arrow += 2; // parens around the args\n    }\n\n    const body_overhead = this.is_braceless() ? 0 : list_overhead(this.body) + 2;\n\n    return lambda_modifiers(this) + args_and_arrow + body_overhead;\n};\n\nAST_Destructuring.prototype._size = () => 2;\n\nAST_TemplateString.prototype._size = function () {\n    return 2 + (Math.floor(this.segments.length / 2) * 3);  /* \"${}\" */\n};\n\nAST_TemplateSegment.prototype._size = function () {\n    return this.value.length;\n};\n\nAST_Return.prototype._size = function () {\n    return this.value ? 7 : 6;\n};\n\nAST_Throw.prototype._size = () => 6;\n\nAST_Break.prototype._size = function () {\n    return this.label ? 6 : 5;\n};\n\nAST_Continue.prototype._size = function () {\n    return this.label ? 9 : 8;\n};\n\nAST_If.prototype._size = () => 4;\n\nAST_Switch.prototype._size = function () {\n    return 8 + list_overhead(this.body);\n};\n\nAST_Case.prototype._size = function () {\n    return 5 + list_overhead(this.body);\n};\n\nAST_Default.prototype._size = function () {\n    return 8 + list_overhead(this.body);\n};\n\nAST_Try.prototype._size = () => 3;\n\nAST_Catch.prototype._size = function () {\n    let size = 7 + list_overhead(this.body);\n    if (this.argname) {\n        size += 2;\n    }\n    return size;\n};\n\nAST_Finally.prototype._size = function () {\n    return 7 + list_overhead(this.body);\n};\n\nAST_Var.prototype._size = function () {\n    return 4 + list_overhead(this.definitions);\n};\n\nAST_Let.prototype._size = function () {\n    return 4 + list_overhead(this.definitions);\n};\n\nAST_Const.prototype._size = function () {\n    return 6 + list_overhead(this.definitions);\n};\n\nAST_VarDef.prototype._size = function () {\n    return this.value ? 1 : 0;\n};\n\nAST_NameMapping.prototype._size = function () {\n    // foreign name isn't mangled\n    return this.name ? 4 : 0;\n};\n\nAST_Import.prototype._size = function () {\n    // import\n    let size = 6;\n\n    if (this.imported_name) size += 1;\n\n    // from\n    if (this.imported_name || this.imported_names) size += 5;\n\n    // braces, and the commas\n    if (this.imported_names) {\n        size += 2 + list_overhead(this.imported_names);\n    }\n\n    return size;\n};\n\nAST_ImportMeta.prototype._size = () => 11;\n\nAST_Export.prototype._size = function () {\n    let size = 7 + (this.is_default ? 8 : 0);\n\n    if (this.exported_value) {\n        size += this.exported_value._size();\n    }\n\n    if (this.exported_names) {\n        // Braces and commas\n        size += 2 + list_overhead(this.exported_names);\n    }\n\n    if (this.module_name) {\n        // \"from \"\n        size += 5;\n    }\n\n    return size;\n};\n\nAST_Call.prototype._size = function () {\n    if (this.optional) {\n        return 4 + list_overhead(this.args);\n    }\n    return 2 + list_overhead(this.args);\n};\n\nAST_New.prototype._size = function () {\n    return 6 + list_overhead(this.args);\n};\n\nAST_Sequence.prototype._size = function () {\n    return list_overhead(this.expressions);\n};\n\nAST_Dot.prototype._size = function () {\n    if (this.optional) {\n        return this.property.length + 2;\n    }\n    return this.property.length + 1;\n};\n\nAST_DotHash.prototype._size = function () {\n    if (this.optional) {\n        return this.property.length + 3;\n    }\n    return this.property.length + 2;\n};\n\nAST_Sub.prototype._size = function () {\n    return this.optional ? 4 : 2;\n};\n\nAST_Unary.prototype._size = function () {\n    if (this.operator === \"typeof\") return 7;\n    if (this.operator === \"void\") return 5;\n    return this.operator.length;\n};\n\nAST_Binary.prototype._size = function (info) {\n    if (this.operator === \"in\") return 4;\n\n    let size = this.operator.length;\n\n    if (\n        (this.operator === \"+\" || this.operator === \"-\")\n        && this.right instanceof AST_Unary && this.right.operator === this.operator\n    ) {\n        // 1+ +a > needs space between the +\n        size += 1;\n    }\n\n    if (this.needs_parens(info)) {\n        size += 2;\n    }\n\n    return size;\n};\n\nAST_Conditional.prototype._size = () => 3;\n\nAST_Array.prototype._size = function () {\n    return 2 + list_overhead(this.elements);\n};\n\nAST_Object.prototype._size = function (info) {\n    let base = 2;\n    if (first_in_statement(info)) {\n        base += 2; // parens\n    }\n    return base + list_overhead(this.properties);\n};\n\n/*#__INLINE__*/\nconst key_size = key =>\n    typeof key === \"string\" ? key.length : 0;\n\nAST_ObjectKeyVal.prototype._size = function () {\n    return key_size(this.key) + 1;\n};\n\n/*#__INLINE__*/\nconst static_size = is_static => is_static ? 7 : 0;\n\nAST_ObjectGetter.prototype._size = function () {\n    return 5 + static_size(this.static) + key_size(this.key);\n};\n\nAST_ObjectSetter.prototype._size = function () {\n    return 5 + static_size(this.static) + key_size(this.key);\n};\n\nAST_ConciseMethod.prototype._size = function () {\n    return static_size(this.static) + key_size(this.key) + lambda_modifiers(this);\n};\n\nAST_PrivateMethod.prototype._size = function () {\n    return AST_ConciseMethod.prototype._size.call(this) + 1;\n};\n\nAST_PrivateGetter.prototype._size = AST_PrivateSetter.prototype._size = function () {\n    return AST_ConciseMethod.prototype._size.call(this) + 4;\n};\n\nAST_PrivateIn.prototype._size = function () {\n    return 5; // \"#\", and \" in \"\n};\n\nAST_Class.prototype._size = function () {\n    return (\n        (this.name ? 8 : 7)\n        + (this.extends ? 8 : 0)\n    );\n};\n\nAST_ClassStaticBlock.prototype._size = function () {\n    // \"class{}\" + semicolons\n    return 7 + list_overhead(this.body);\n};\n\nAST_ClassProperty.prototype._size = function () {\n    return (\n        static_size(this.static)\n        + (typeof this.key === \"string\" ? this.key.length + 2 : 0)\n        + (this.value ? 1 : 0)\n    );\n};\n\nAST_ClassPrivateProperty.prototype._size = function () {\n    return AST_ClassProperty.prototype._size.call(this) + 1;\n};\n\nAST_Symbol.prototype._size = function () {\n    if (!(mangle_options && this.thedef && !this.thedef.unmangleable(mangle_options))) {\n        return this.name.length;\n    } else {\n        return 1;\n    }\n};\n\n// TODO take propmangle into account\nAST_SymbolClassProperty.prototype._size = function () {\n    return this.name.length;\n};\n\nAST_SymbolRef.prototype._size = AST_SymbolDeclaration.prototype._size = function () {\n    if (this.name === \"arguments\") return 9;\n\n    return AST_Symbol.prototype._size.call(this);\n};\n\nAST_NewTarget.prototype._size = () => 10;\n\nAST_SymbolImportForeign.prototype._size = function () {\n    return this.name.length;\n};\n\nAST_SymbolExportForeign.prototype._size = function () {\n    return this.name.length;\n};\n\nAST_This.prototype._size = () => 4;\n\nAST_Super.prototype._size = () => 5;\n\nAST_String.prototype._size = function () {\n    return this.value.length + 2;\n};\n\nAST_Number.prototype._size = function () {\n    const { value } = this;\n    if (value === 0) return 1;\n    if (value > 0 && Math.floor(value) === value) {\n        return Math.floor(Math.log10(value) + 1);\n    }\n    return value.toString().length;\n};\n\nAST_BigInt.prototype._size = function () {\n    return this.value.length;\n};\n\nAST_RegExp.prototype._size = function () {\n    return this.value.toString().length;\n};\n\nAST_Null.prototype._size = () => 4;\n\nAST_NaN.prototype._size = () => 3;\n\nAST_Undefined.prototype._size = () => 6; // \"void 0\"\n\nAST_Hole.prototype._size = () => 0;  // comma is taken into account by list_overhead()\n\nAST_Infinity.prototype._size = () => 8;\n\nAST_True.prototype._size = () => 4;\n\nAST_False.prototype._size = () => 5;\n\nAST_Await.prototype._size = () => 6;\n\nAST_Yield.prototype._size = () => 6;\n"
  },
  {
    "path": "templates/bin/node/terser/lib/sourcemap.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n\nimport {SourceMapConsumer, SourceMapGenerator} from \"@jridgewell/source-map\";\nimport {defaults, HOP} from \"./utils/index.js\";\n\n// a small wrapper around source-map and @jridgewell/source-map\nasync function SourceMap(options) {\n    options = defaults(options, {\n        file : null,\n        root : null,\n        orig : null,\n        files: {},\n    });\n\n    var orig_map;\n    var generator = new SourceMapGenerator({\n        file       : options.file,\n        sourceRoot : options.root\n    });\n\n    let sourcesContent = {__proto__: null};\n    let files = options.files;\n    for (var name in files) if (HOP(files, name)) {\n        sourcesContent[name] = files[name];\n    }\n    if (options.orig) {\n        // We support both @jridgewell/source-map (which has a sync\n        // SourceMapConsumer) and source-map (which has an async\n        // SourceMapConsumer).\n        orig_map = await new SourceMapConsumer(options.orig);\n        if (orig_map.sourcesContent) {\n            orig_map.sources.forEach(function(source, i) {\n                var content = orig_map.sourcesContent[i];\n                if (content) {\n                    sourcesContent[source] = content;\n                }\n            });\n        }\n    }\n\n    function add(source, gen_line, gen_col, orig_line, orig_col, name) {\n        let generatedPos = { line: gen_line, column: gen_col };\n\n        if (orig_map) {\n            var info = orig_map.originalPositionFor({\n                line: orig_line,\n                column: orig_col\n            });\n            if (info.source === null) {\n                generator.addMapping({\n                    generated: generatedPos,\n                    original: null,\n                    source: null,\n                    name: null\n                });\n                return;\n            }\n            source = info.source;\n            orig_line = info.line;\n            orig_col = info.column;\n            name = info.name || name;\n        }\n        generator.addMapping({\n            generated : generatedPos,\n            original  : { line: orig_line, column: orig_col },\n            source    : source,\n            name      : name\n        });\n        generator.setSourceContent(source, sourcesContent[source]);\n    }\n\n    function clean(map) {\n        const allNull = map.sourcesContent && map.sourcesContent.every(c => c == null);\n        if (allNull) delete map.sourcesContent;\n        if (map.file === undefined) delete map.file;\n        if (map.sourceRoot === undefined) delete map.sourceRoot;\n        return map;\n    }\n\n    function getDecoded() {\n        if (!generator.toDecodedMap) return null;\n        return clean(generator.toDecodedMap());\n    }\n\n    function getEncoded() {\n        return clean(generator.toJSON());\n    }\n\n    function destroy() {\n        // @jridgewell/source-map's SourceMapConsumer does not need to be\n        // manually freed.\n        if (orig_map && orig_map.destroy) orig_map.destroy();\n    }\n\n    return {\n        add,\n        getDecoded,\n        getEncoded,\n        destroy,\n    };\n}\n\nexport {\n    SourceMap,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/lib/transform.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n\nimport {\n    AST_Array,\n    AST_Await,\n    AST_Binary,\n    AST_PrivateIn,\n    AST_Block,\n    AST_Call,\n    AST_Case,\n    AST_Catch,\n    AST_Chain,\n    AST_Class,\n    AST_ClassStaticBlock,\n    AST_Conditional,\n    AST_Definitions,\n    AST_Destructuring,\n    AST_Do,\n    AST_Exit,\n    AST_Expansion,\n    AST_Export,\n    AST_For,\n    AST_ForIn,\n    AST_If,\n    AST_Import,\n    AST_LabeledStatement,\n    AST_Lambda,\n    AST_LoopControl,\n    AST_NameMapping,\n    AST_Node,\n    AST_Number,\n    AST_Object,\n    AST_ObjectProperty,\n    AST_PrefixedTemplateString,\n    AST_PropAccess,\n    AST_Sequence,\n    AST_SimpleStatement,\n    AST_Sub,\n    AST_Switch,\n    AST_TemplateString,\n    AST_Try,\n    AST_Unary,\n    AST_VarDef,\n    AST_While,\n    AST_With,\n    AST_Yield,\n} from \"./ast.js\";\nimport {\n    MAP as do_list,\n    noop,\n} from \"./utils/index.js\";\n\nfunction def_transform(node, descend) {\n    node.DEFMETHOD(\"transform\", function(tw, in_list) {\n        let transformed = undefined;\n        tw.push(this);\n        if (tw.before) transformed = tw.before(this, descend, in_list);\n        if (transformed === undefined) {\n            transformed = this;\n            descend(transformed, tw);\n            if (tw.after) {\n                const after_ret = tw.after(transformed, in_list);\n                if (after_ret !== undefined) transformed = after_ret;\n            }\n        }\n        tw.pop();\n        return transformed;\n    });\n}\n\ndef_transform(AST_Node, noop);\n\ndef_transform(AST_LabeledStatement, function(self, tw) {\n    self.label = self.label.transform(tw);\n    self.body = self.body.transform(tw);\n});\n\ndef_transform(AST_SimpleStatement, function(self, tw) {\n    self.body = self.body.transform(tw);\n});\n\ndef_transform(AST_Block, function(self, tw) {\n    self.body = do_list(self.body, tw);\n});\n\ndef_transform(AST_Do, function(self, tw) {\n    self.body = self.body.transform(tw);\n    self.condition = self.condition.transform(tw);\n});\n\ndef_transform(AST_While, function(self, tw) {\n    self.condition = self.condition.transform(tw);\n    self.body = self.body.transform(tw);\n});\n\ndef_transform(AST_For, function(self, tw) {\n    if (self.init) self.init = self.init.transform(tw);\n    if (self.condition) self.condition = self.condition.transform(tw);\n    if (self.step) self.step = self.step.transform(tw);\n    self.body = self.body.transform(tw);\n});\n\ndef_transform(AST_ForIn, function(self, tw) {\n    self.init = self.init.transform(tw);\n    self.object = self.object.transform(tw);\n    self.body = self.body.transform(tw);\n});\n\ndef_transform(AST_With, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n    self.body = self.body.transform(tw);\n});\n\ndef_transform(AST_Exit, function(self, tw) {\n    if (self.value) self.value = self.value.transform(tw);\n});\n\ndef_transform(AST_LoopControl, function(self, tw) {\n    if (self.label) self.label = self.label.transform(tw);\n});\n\ndef_transform(AST_If, function(self, tw) {\n    self.condition = self.condition.transform(tw);\n    self.body = self.body.transform(tw);\n    if (self.alternative) self.alternative = self.alternative.transform(tw);\n});\n\ndef_transform(AST_Switch, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n    self.body = do_list(self.body, tw);\n});\n\ndef_transform(AST_Case, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n    self.body = do_list(self.body, tw);\n});\n\ndef_transform(AST_Try, function(self, tw) {\n    self.body = self.body.transform(tw);\n    if (self.bcatch) self.bcatch = self.bcatch.transform(tw);\n    if (self.bfinally) self.bfinally = self.bfinally.transform(tw);\n});\n\ndef_transform(AST_Catch, function(self, tw) {\n    if (self.argname) self.argname = self.argname.transform(tw);\n    self.body = do_list(self.body, tw);\n});\n\ndef_transform(AST_Definitions, function(self, tw) {\n    self.definitions = do_list(self.definitions, tw);\n});\n\ndef_transform(AST_VarDef, function(self, tw) {\n    self.name = self.name.transform(tw);\n    if (self.value) self.value = self.value.transform(tw);\n});\n\ndef_transform(AST_Destructuring, function(self, tw) {\n    self.names = do_list(self.names, tw);\n});\n\ndef_transform(AST_Lambda, function(self, tw) {\n    if (self.name) self.name = self.name.transform(tw);\n    self.argnames = do_list(self.argnames, tw, /* allow_splicing */ false);\n    if (self.body instanceof AST_Node) {\n        self.body = self.body.transform(tw);\n    } else {\n        self.body = do_list(self.body, tw);\n    }\n});\n\ndef_transform(AST_Call, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n    self.args = do_list(self.args, tw, /* allow_splicing */ false);\n});\n\ndef_transform(AST_Sequence, function(self, tw) {\n    const result = do_list(self.expressions, tw);\n    self.expressions = result.length\n        ? result\n        : [new AST_Number({ value: 0 })];\n});\n\ndef_transform(AST_PropAccess, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n});\n\ndef_transform(AST_Sub, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n    self.property = self.property.transform(tw);\n});\n\ndef_transform(AST_Chain, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n});\n\ndef_transform(AST_Yield, function(self, tw) {\n    if (self.expression) self.expression = self.expression.transform(tw);\n});\n\ndef_transform(AST_Await, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n});\n\ndef_transform(AST_Unary, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n});\n\ndef_transform(AST_Binary, function(self, tw) {\n    self.left = self.left.transform(tw);\n    self.right = self.right.transform(tw);\n});\n\ndef_transform(AST_PrivateIn, function(self, tw) {\n    self.key = self.key.transform(tw);\n    self.value = self.value.transform(tw);\n});\n\ndef_transform(AST_Conditional, function(self, tw) {\n    self.condition = self.condition.transform(tw);\n    self.consequent = self.consequent.transform(tw);\n    self.alternative = self.alternative.transform(tw);\n});\n\ndef_transform(AST_Array, function(self, tw) {\n    self.elements = do_list(self.elements, tw);\n});\n\ndef_transform(AST_Object, function(self, tw) {\n    self.properties = do_list(self.properties, tw);\n});\n\ndef_transform(AST_ObjectProperty, function(self, tw) {\n    if (self.key instanceof AST_Node) {\n        self.key = self.key.transform(tw);\n    }\n    if (self.value) self.value = self.value.transform(tw);\n});\n\ndef_transform(AST_Class, function(self, tw) {\n    if (self.name) self.name = self.name.transform(tw);\n    if (self.extends) self.extends = self.extends.transform(tw);\n    self.properties = do_list(self.properties, tw);\n});\n\ndef_transform(AST_ClassStaticBlock, function(self, tw) {\n    self.body = do_list(self.body, tw);\n});\n\ndef_transform(AST_Expansion, function(self, tw) {\n    self.expression = self.expression.transform(tw);\n});\n\ndef_transform(AST_NameMapping, function(self, tw) {\n    self.foreign_name = self.foreign_name.transform(tw);\n    self.name = self.name.transform(tw);\n});\n\ndef_transform(AST_Import, function(self, tw) {\n    if (self.imported_name) self.imported_name = self.imported_name.transform(tw);\n    if (self.imported_names) do_list(self.imported_names, tw);\n    self.module_name = self.module_name.transform(tw);\n});\n\ndef_transform(AST_Export, function(self, tw) {\n    if (self.exported_definition) self.exported_definition = self.exported_definition.transform(tw);\n    if (self.exported_value) self.exported_value = self.exported_value.transform(tw);\n    if (self.exported_names) do_list(self.exported_names, tw);\n    if (self.module_name) self.module_name = self.module_name.transform(tw);\n});\n\ndef_transform(AST_TemplateString, function(self, tw) {\n    self.segments = do_list(self.segments, tw);\n});\n\ndef_transform(AST_PrefixedTemplateString, function(self, tw) {\n    self.prefix = self.prefix.transform(tw);\n    self.template_string = self.template_string.transform(tw);\n});\n\n"
  },
  {
    "path": "templates/bin/node/terser/lib/utils/first_in_statement.js",
    "content": "import {\n    AST_Binary,\n    AST_Conditional,\n    AST_Chain,\n    AST_Dot,\n    AST_Object,\n    AST_Sequence,\n    AST_Statement,\n    AST_Sub,\n    AST_UnaryPostfix,\n    AST_PrefixedTemplateString\n} from \"../ast.js\";\n\n// return true if the node at the top of the stack (that means the\n// innermost node in the current output) is lexically the first in\n// a statement.\nfunction first_in_statement(stack) {\n    let node = stack.parent(-1);\n    for (let i = 0, p; p = stack.parent(i); i++) {\n        if (p instanceof AST_Statement && p.body === node)\n            return true;\n        if ((p instanceof AST_Sequence && p.expressions[0] === node) ||\n            (p.TYPE === \"Call\" && p.expression === node) ||\n            (p instanceof AST_PrefixedTemplateString && p.prefix === node) ||\n            (p instanceof AST_Dot && p.expression === node) ||\n            (p instanceof AST_Sub && p.expression === node) ||\n            (p instanceof AST_Chain && p.expression === node) ||\n            (p instanceof AST_Conditional && p.condition === node) ||\n            (p instanceof AST_Binary && p.left === node) ||\n            (p instanceof AST_UnaryPostfix && p.expression === node)\n        ) {\n            node = p;\n        } else {\n            return false;\n        }\n    }\n}\n\n// Returns whether the leftmost item in the expression is an object\nfunction left_is_object(node) {\n    if (node instanceof AST_Object) return true;\n    if (node instanceof AST_Sequence) return left_is_object(node.expressions[0]);\n    if (node.TYPE === \"Call\") return left_is_object(node.expression);\n    if (node instanceof AST_PrefixedTemplateString) return left_is_object(node.prefix);\n    if (node instanceof AST_Dot || node instanceof AST_Sub) return left_is_object(node.expression);\n    if (node instanceof AST_Chain) return left_is_object(node.expression);\n    if (node instanceof AST_Conditional) return left_is_object(node.condition);\n    if (node instanceof AST_Binary) return left_is_object(node.left);\n    if (node instanceof AST_UnaryPostfix) return left_is_object(node.expression);\n    return false;\n}\n\nexport { first_in_statement, left_is_object };\n"
  },
  {
    "path": "templates/bin/node/terser/lib/utils/index.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n  https://github.com/mishoo/UglifyJS2\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n\"use strict\";\n\nimport { AST_Node } from \"../ast.js\";\n\nfunction characters(str) {\n    return str.split(\"\");\n}\n\nfunction member(name, array) {\n    return array.includes(name);\n}\n\nclass DefaultsError extends Error {\n    constructor(msg, defs) {\n        super();\n\n        this.name = \"DefaultsError\";\n        this.message = msg;\n        this.defs = defs;\n    }\n}\n\nfunction defaults(args, defs, croak) {\n    if (args === true) {\n        args = {};\n    } else if (args != null && typeof args === \"object\") {\n        args = {...args};\n    }\n\n    const ret = args || {};\n\n    if (croak) for (const i in ret) if (HOP(ret, i) && !HOP(defs, i)) {\n        throw new DefaultsError(\"`\" + i + \"` is not a supported option\", defs);\n    }\n\n    for (const i in defs) if (HOP(defs, i)) {\n        if (!args || !HOP(args, i)) {\n            ret[i] = defs[i];\n        } else if (i === \"ecma\") {\n            let ecma = args[i] | 0;\n            if (ecma > 5 && ecma < 2015) ecma += 2009;\n            ret[i] = ecma;\n        } else {\n            ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];\n        }\n    }\n\n    return ret;\n}\n\nfunction noop() {}\nfunction return_false() { return false; }\nfunction return_true() { return true; }\nfunction return_this() { return this; }\nfunction return_null() { return null; }\n\nvar MAP = (function() {\n    function MAP(a, tw, allow_splicing = true) {\n        const new_a = [];\n\n        for (let i = 0; i < a.length; ++i) {\n            let item = a[i];\n            let ret = item.transform(tw, allow_splicing);\n\n            if (ret instanceof AST_Node) {\n                new_a.push(ret);\n            } else if (ret instanceof Splice) {\n                new_a.push(...ret.v);\n            }\n        }\n\n        return new_a;\n    }\n\n    MAP.splice = function(val) { return new Splice(val); };\n    MAP.skip = {};\n    function Splice(val) { this.v = val; }\n    return MAP;\n})();\n\nfunction make_node(ctor, orig, props) {\n    if (!props) props = {};\n    if (orig) {\n        if (!props.start) props.start = orig.start;\n        if (!props.end) props.end = orig.end;\n    }\n    return new ctor(props);\n}\n\nfunction push_uniq(array, el) {\n    if (!array.includes(el))\n        array.push(el);\n}\n\nfunction string_template(text, props) {\n    return text.replace(/{(.+?)}/g, function(str, p) {\n        return props && props[p];\n    });\n}\n\nfunction remove(array, el) {\n    for (var i = array.length; --i >= 0;) {\n        if (array[i] === el) array.splice(i, 1);\n    }\n}\n\nfunction mergeSort(array, cmp) {\n    if (array.length < 2) return array.slice();\n    function merge(a, b) {\n        var r = [], ai = 0, bi = 0, i = 0;\n        while (ai < a.length && bi < b.length) {\n            cmp(a[ai], b[bi]) <= 0\n                ? r[i++] = a[ai++]\n                : r[i++] = b[bi++];\n        }\n        if (ai < a.length) r.push.apply(r, a.slice(ai));\n        if (bi < b.length) r.push.apply(r, b.slice(bi));\n        return r;\n    }\n    function _ms(a) {\n        if (a.length <= 1)\n            return a;\n        var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m);\n        left = _ms(left);\n        right = _ms(right);\n        return merge(left, right);\n    }\n    return _ms(array);\n}\n\nfunction makePredicate(words) {\n    if (!Array.isArray(words)) words = words.split(\" \");\n\n    return new Set(words.sort());\n}\n\nfunction map_add(map, key, value) {\n    if (map.has(key)) {\n        map.get(key).push(value);\n    } else {\n        map.set(key, [ value ]);\n    }\n}\n\nfunction map_from_object(obj) {\n    var map = new Map();\n    for (var key in obj) {\n        if (HOP(obj, key) && key.charAt(0) === \"$\") {\n            map.set(key.substr(1), obj[key]);\n        }\n    }\n    return map;\n}\n\nfunction map_to_object(map) {\n    var obj = Object.create(null);\n    map.forEach(function (value, key) {\n        obj[\"$\" + key] = value;\n    });\n    return obj;\n}\n\nfunction HOP(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nfunction keep_name(keep_setting, name) {\n    return keep_setting === true\n        || (keep_setting instanceof RegExp && keep_setting.test(name));\n}\n\nvar lineTerminatorEscape = {\n    \"\\0\": \"0\",\n    \"\\n\": \"n\",\n    \"\\r\": \"r\",\n    \"\\u2028\": \"u2028\",\n    \"\\u2029\": \"u2029\",\n};\nfunction regexp_source_fix(source) {\n    // V8 does not escape line terminators in regexp patterns in node 12\n    // We'll also remove literal \\0\n    return source.replace(/[\\0\\n\\r\\u2028\\u2029]/g, function (match, offset) {\n        var escaped = source[offset - 1] == \"\\\\\"\n            && (source[offset - 2] != \"\\\\\"\n            || /(?:^|[^\\\\])(?:\\\\{2})*$/.test(source.slice(0, offset - 1)));\n        return (escaped ? \"\" : \"\\\\\") + lineTerminatorEscape[match];\n    });\n}\n\n// Subset of regexps that is not going to cause regexp based DDOS\n// https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS\nconst re_safe_regexp = /^[\\\\/|\\0\\s\\w^$.[\\]()]*$/;\n\n/** Check if the regexp is safe for Terser to create without risking a RegExp DOS */\nexport const regexp_is_safe = (source) => re_safe_regexp.test(source);\n\nconst all_flags = \"dgimsuy\";\nfunction sort_regexp_flags(flags) {\n    const existing_flags = new Set(flags.split(\"\"));\n    let out = \"\";\n    for (const flag of all_flags) {\n        if (existing_flags.has(flag)) {\n            out += flag;\n            existing_flags.delete(flag);\n        }\n    }\n    if (existing_flags.size) {\n        // Flags Terser doesn't know about\n        existing_flags.forEach(flag => { out += flag; });\n    }\n    return out;\n}\n\nfunction has_annotation(node, annotation) {\n    return node._annotations & annotation;\n}\n\nfunction set_annotation(node, annotation) {\n    node._annotations |= annotation;\n}\n\nfunction clear_annotation(node, annotation) {\n    node._annotations &= ~annotation;\n}\n\nexport {\n    characters,\n    defaults,\n    HOP,\n    keep_name,\n    make_node,\n    makePredicate,\n    map_add,\n    map_from_object,\n    map_to_object,\n    MAP,\n    member,\n    mergeSort,\n    noop,\n    push_uniq,\n    regexp_source_fix,\n    remove,\n    return_false,\n    return_null,\n    return_this,\n    return_true,\n    sort_regexp_flags,\n    string_template,\n    has_annotation,\n    set_annotation,\n    clear_annotation,\n};\n"
  },
  {
    "path": "templates/bin/node/terser/main.js",
    "content": "import \"./lib/transform.js\";\nimport \"./lib/mozilla-ast.js\";\nimport { minify } from \"./lib/minify.js\";\n\nexport { minify } from \"./lib/minify.js\";\nexport { run_cli as _run_cli } from \"./lib/cli.js\";\n\nexport async function _default_options() {\n    const defs = {};\n\n    Object.keys(infer_options({ 0: 0 })).forEach((component) => {\n        const options = infer_options({\n            [component]: {0: 0}\n        });\n\n        if (options) defs[component] = options;\n    });\n    return defs;\n}\n\nasync function infer_options(options) {\n    try {\n        await minify(\"\", options);\n    } catch (error) {\n        return error.defs;\n    }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/.package-lock.json",
    "content": "{\n  \"name\": \"terser\",\n  \"version\": \"5.17.4\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.3\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/set-array\": \"^1.0.1\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n        \"@jridgewell/trace-mapping\": \"^0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.0\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/set-array\": {\n      \"version\": \"1.1.2\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/source-map\": {\n      \"version\": \"0.3.3\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.9\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.4.14\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz\",\n      \"integrity\": \"sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==\"\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.18\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"1.4.14\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.8.2\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/buffer-from\": {\n      \"version\": \"1.1.2\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/commander\": {\n      \"version\": \"2.20.3\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/source-map-support\": {\n      \"version\": \"0.5.21\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-from\": \"^1.0.0\",\n        \"source-map\": \"^0.6.0\"\n      }\n    },\n    \"node_modules/source-map-support/node_modules/source-map\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n      \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/LICENSE",
    "content": "Copyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/README.md",
    "content": "# @jridgewell/gen-mapping\n\n> Generate source maps\n\n`gen-mapping` allows you to generate a source map during transpilation or minification.\nWith a source map, you're able to trace the original location in the source file, either in Chrome's\nDevTools or using a library like [`@jridgewell/trace-mapping`][trace-mapping].\n\nYou may already be familiar with the [`source-map`][source-map] package's `SourceMapGenerator`. This\nprovides the same `addMapping` and `setSourceContent` API.\n\n## Installation\n\n```sh\nnpm install @jridgewell/gen-mapping\n```\n\n## Usage\n\n```typescript\nimport { GenMapping, addMapping, setSourceContent, toEncodedMap, toDecodedMap } from '@jridgewell/gen-mapping';\n\nconst map = new GenMapping({\n  file: 'output.js',\n  sourceRoot: 'https://example.com/',\n});\n\nsetSourceContent(map, 'input.js', `function foo() {}`);\n\naddMapping(map, {\n  // Lines start at line 1, columns at column 0.\n  generated: { line: 1, column: 0 },\n  source: 'input.js',\n  original: { line: 1, column: 0 },\n});\n\naddMapping(map, {\n  generated: { line: 1, column: 9 },\n  source: 'input.js',\n  original: { line: 1, column: 9 },\n  name: 'foo',\n});\n\nassert.deepEqual(toDecodedMap(map), {\n  version: 3,\n  file: 'output.js',\n  names: ['foo'],\n  sourceRoot: 'https://example.com/',\n  sources: ['input.js'],\n  sourcesContent: ['function foo() {}'],\n  mappings: [\n    [ [0, 0, 0, 0], [9, 0, 0, 9, 0] ]\n  ],\n});\n\nassert.deepEqual(toEncodedMap(map), {\n  version: 3,\n  file: 'output.js',\n  names: ['foo'],\n  sourceRoot: 'https://example.com/',\n  sources: ['input.js'],\n  sourcesContent: ['function foo() {}'],\n  mappings: 'AAAA,SAASA',\n});\n```\n\n### Smaller Sourcemaps\n\nNot everything needs to be added to a sourcemap, and needless markings can cause signficantly\nlarger file sizes. `gen-mapping` exposes `maybeAddSegment`/`maybeAddMapping` APIs that will\nintelligently determine if this marking adds useful information. If not, the marking will be\nskipped.\n\n```typescript\nimport { maybeAddMapping } from '@jridgewell/gen-mapping';\n\nconst map = new GenMapping();\n\n// Adding a sourceless marking at the beginning of a line isn't useful.\nmaybeAddMapping(map, {\n  generated: { line: 1, column: 0 },\n});\n\n// Adding a new source marking is useful.\nmaybeAddMapping(map, {\n  generated: { line: 1, column: 0 },\n  source: 'input.js',\n  original: { line: 1, column: 0 },\n});\n\n// But adding another marking pointing to the exact same original location isn't, even if the\n// generated column changed.\nmaybeAddMapping(map, {\n  generated: { line: 1, column: 9 },\n  source: 'input.js',\n  original: { line: 1, column: 0 },\n});\n\nassert.deepEqual(toEncodedMap(map), {\n  version: 3,\n  names: [],\n  sources: ['input.js'],\n  sourcesContent: [null],\n  mappings: 'AAAA',\n});\n```\n\n## Benchmarks\n\n```\nnode v18.0.0\n\namp.js.map\nMemory Usage:\ngen-mapping: addSegment      5852872 bytes\ngen-mapping: addMapping      7716042 bytes\nsource-map-js                6143250 bytes\nsource-map-0.6.1             6124102 bytes\nsource-map-0.8.0             6121173 bytes\nSmallest memory usage is gen-mapping: addSegment\n\nAdding speed:\ngen-mapping:      addSegment x 441 ops/sec ±2.07% (90 runs sampled)\ngen-mapping:      addMapping x 350 ops/sec ±2.40% (86 runs sampled)\nsource-map-js:    addMapping x 169 ops/sec ±2.42% (80 runs sampled)\nsource-map-0.6.1: addMapping x 167 ops/sec ±2.56% (80 runs sampled)\nsource-map-0.8.0: addMapping x 168 ops/sec ±2.52% (80 runs sampled)\nFastest is gen-mapping:      addSegment\n\nGenerate speed:\ngen-mapping:      decoded output x 150,824,370 ops/sec ±0.07% (102 runs sampled)\ngen-mapping:      encoded output x 663 ops/sec ±0.22% (98 runs sampled)\nsource-map-js:    encoded output x 197 ops/sec ±0.45% (84 runs sampled)\nsource-map-0.6.1: encoded output x 198 ops/sec ±0.33% (85 runs sampled)\nsource-map-0.8.0: encoded output x 197 ops/sec ±0.06% (93 runs sampled)\nFastest is gen-mapping:      decoded output\n\n\n***\n\n\nbabel.min.js.map\nMemory Usage:\ngen-mapping: addSegment     37578063 bytes\ngen-mapping: addMapping     37212897 bytes\nsource-map-js               47638527 bytes\nsource-map-0.6.1            47690503 bytes\nsource-map-0.8.0            47470188 bytes\nSmallest memory usage is gen-mapping: addMapping\n\nAdding speed:\ngen-mapping:      addSegment x 31.05 ops/sec ±8.31% (43 runs sampled)\ngen-mapping:      addMapping x 29.83 ops/sec ±7.36% (51 runs sampled)\nsource-map-js:    addMapping x 20.73 ops/sec ±6.22% (38 runs sampled)\nsource-map-0.6.1: addMapping x 20.03 ops/sec ±10.51% (38 runs sampled)\nsource-map-0.8.0: addMapping x 19.30 ops/sec ±8.27% (37 runs sampled)\nFastest is gen-mapping:      addSegment\n\nGenerate speed:\ngen-mapping:      decoded output x 381,379,234 ops/sec ±0.29% (96 runs sampled)\ngen-mapping:      encoded output x 95.15 ops/sec ±2.98% (72 runs sampled)\nsource-map-js:    encoded output x 15.20 ops/sec ±7.41% (33 runs sampled)\nsource-map-0.6.1: encoded output x 16.36 ops/sec ±10.46% (31 runs sampled)\nsource-map-0.8.0: encoded output x 16.06 ops/sec ±6.45% (31 runs sampled)\nFastest is gen-mapping:      decoded output\n\n\n***\n\n\npreact.js.map\nMemory Usage:\ngen-mapping: addSegment       416247 bytes\ngen-mapping: addMapping       419824 bytes\nsource-map-js                1024619 bytes\nsource-map-0.6.1             1146004 bytes\nsource-map-0.8.0             1113250 bytes\nSmallest memory usage is gen-mapping: addSegment\n\nAdding speed:\ngen-mapping:      addSegment x 13,755 ops/sec ±0.15% (98 runs sampled)\ngen-mapping:      addMapping x 13,013 ops/sec ±0.11% (101 runs sampled)\nsource-map-js:    addMapping x 4,564 ops/sec ±0.21% (98 runs sampled)\nsource-map-0.6.1: addMapping x 4,562 ops/sec ±0.11% (99 runs sampled)\nsource-map-0.8.0: addMapping x 4,593 ops/sec ±0.11% (100 runs sampled)\nFastest is gen-mapping:      addSegment\n\nGenerate speed:\ngen-mapping:      decoded output x 379,864,020 ops/sec ±0.23% (93 runs sampled)\ngen-mapping:      encoded output x 14,368 ops/sec ±4.07% (82 runs sampled)\nsource-map-js:    encoded output x 5,261 ops/sec ±0.21% (99 runs sampled)\nsource-map-0.6.1: encoded output x 5,124 ops/sec ±0.58% (99 runs sampled)\nsource-map-0.8.0: encoded output x 5,434 ops/sec ±0.33% (96 runs sampled)\nFastest is gen-mapping:      decoded output\n\n\n***\n\n\nreact.js.map\nMemory Usage:\ngen-mapping: addSegment       975096 bytes\ngen-mapping: addMapping      1102981 bytes\nsource-map-js                2918836 bytes\nsource-map-0.6.1             2885435 bytes\nsource-map-0.8.0             2874336 bytes\nSmallest memory usage is gen-mapping: addSegment\n\nAdding speed:\ngen-mapping:      addSegment x 4,772 ops/sec ±0.15% (100 runs sampled)\ngen-mapping:      addMapping x 4,456 ops/sec ±0.13% (97 runs sampled)\nsource-map-js:    addMapping x 1,618 ops/sec ±0.24% (97 runs sampled)\nsource-map-0.6.1: addMapping x 1,622 ops/sec ±0.12% (99 runs sampled)\nsource-map-0.8.0: addMapping x 1,631 ops/sec ±0.12% (100 runs sampled)\nFastest is gen-mapping:      addSegment\n\nGenerate speed:\ngen-mapping:      decoded output x 379,107,695 ops/sec ±0.07% (99 runs sampled)\ngen-mapping:      encoded output x 5,421 ops/sec ±1.60% (89 runs sampled)\nsource-map-js:    encoded output x 2,113 ops/sec ±1.81% (98 runs sampled)\nsource-map-0.6.1: encoded output x 2,126 ops/sec ±0.10% (100 runs sampled)\nsource-map-0.8.0: encoded output x 2,176 ops/sec ±0.39% (98 runs sampled)\nFastest is gen-mapping:      decoded output\n```\n\n[source-map]: https://www.npmjs.com/package/source-map\n[trace-mapping]: https://github.com/jridgewell/trace-mapping\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs",
    "content": "import { SetArray, put } from '@jridgewell/set-array';\nimport { encode } from '@jridgewell/sourcemap-codec';\nimport { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';\n\nconst COLUMN = 0;\nconst SOURCES_INDEX = 1;\nconst SOURCE_LINE = 2;\nconst SOURCE_COLUMN = 3;\nconst NAMES_INDEX = 4;\n\nconst NO_NAME = -1;\n/**\n * A low-level API to associate a generated position with an original source position. Line and\n * column here are 0-based, unlike `addMapping`.\n */\nlet addSegment;\n/**\n * A high-level API to associate a generated position with an original source position. Line is\n * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\n */\nlet addMapping;\n/**\n * Same as `addSegment`, but will only add the segment if it generates useful information in the\n * resulting map. This only works correctly if segments are added **in order**, meaning you should\n * not add a segment with a lower generated line/column than one that came before.\n */\nlet maybeAddSegment;\n/**\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\n * not add a mapping with a lower generated line/column than one that came before.\n */\nlet maybeAddMapping;\n/**\n * Adds/removes the content of the source file to the source map.\n */\nlet setSourceContent;\n/**\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nlet toDecodedMap;\n/**\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nlet toEncodedMap;\n/**\n * Constructs a new GenMapping, using the already present mappings of the input.\n */\nlet fromMap;\n/**\n * Returns an array of high-level mapping objects for every recorded segment, which could then be\n * passed to the `source-map` library.\n */\nlet allMappings;\n// This split declaration is only so that terser can elminiate the static initialization block.\nlet addSegmentInternal;\n/**\n * Provides the state to generate a sourcemap.\n */\nclass GenMapping {\n    constructor({ file, sourceRoot } = {}) {\n        this._names = new SetArray();\n        this._sources = new SetArray();\n        this._sourcesContent = [];\n        this._mappings = [];\n        this.file = file;\n        this.sourceRoot = sourceRoot;\n    }\n}\n(() => {\n    addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\n        return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);\n    };\n    maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\n        return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);\n    };\n    addMapping = (map, mapping) => {\n        return addMappingInternal(false, map, mapping);\n    };\n    maybeAddMapping = (map, mapping) => {\n        return addMappingInternal(true, map, mapping);\n    };\n    setSourceContent = (map, source, content) => {\n        const { _sources: sources, _sourcesContent: sourcesContent } = map;\n        sourcesContent[put(sources, source)] = content;\n    };\n    toDecodedMap = (map) => {\n        const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n        removeEmptyFinalLines(mappings);\n        return {\n            version: 3,\n            file: file || undefined,\n            names: names.array,\n            sourceRoot: sourceRoot || undefined,\n            sources: sources.array,\n            sourcesContent,\n            mappings,\n        };\n    };\n    toEncodedMap = (map) => {\n        const decoded = toDecodedMap(map);\n        return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });\n    };\n    allMappings = (map) => {\n        const out = [];\n        const { _mappings: mappings, _sources: sources, _names: names } = map;\n        for (let i = 0; i < mappings.length; i++) {\n            const line = mappings[i];\n            for (let j = 0; j < line.length; j++) {\n                const seg = line[j];\n                const generated = { line: i + 1, column: seg[COLUMN] };\n                let source = undefined;\n                let original = undefined;\n                let name = undefined;\n                if (seg.length !== 1) {\n                    source = sources.array[seg[SOURCES_INDEX]];\n                    original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };\n                    if (seg.length === 5)\n                        name = names.array[seg[NAMES_INDEX]];\n                }\n                out.push({ generated, source, original, name });\n            }\n        }\n        return out;\n    };\n    fromMap = (input) => {\n        const map = new TraceMap(input);\n        const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });\n        putAll(gen._names, map.names);\n        putAll(gen._sources, map.sources);\n        gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);\n        gen._mappings = decodedMappings(map);\n        return gen;\n    };\n    // Internal helpers\n    addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\n        const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n        const line = getLine(mappings, genLine);\n        const index = getColumnIndex(line, genColumn);\n        if (!source) {\n            if (skipable && skipSourceless(line, index))\n                return;\n            return insert(line, index, [genColumn]);\n        }\n        const sourcesIndex = put(sources, source);\n        const namesIndex = name ? put(names, name) : NO_NAME;\n        if (sourcesIndex === sourcesContent.length)\n            sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;\n        if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\n            return;\n        }\n        return insert(line, index, name\n            ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\n            : [genColumn, sourcesIndex, sourceLine, sourceColumn]);\n    };\n})();\nfunction getLine(mappings, index) {\n    for (let i = mappings.length; i <= index; i++) {\n        mappings[i] = [];\n    }\n    return mappings[index];\n}\nfunction getColumnIndex(line, genColumn) {\n    let index = line.length;\n    for (let i = index - 1; i >= 0; index = i--) {\n        const current = line[i];\n        if (genColumn >= current[COLUMN])\n            break;\n    }\n    return index;\n}\nfunction insert(array, index, value) {\n    for (let i = array.length; i > index; i--) {\n        array[i] = array[i - 1];\n    }\n    array[index] = value;\n}\nfunction removeEmptyFinalLines(mappings) {\n    const { length } = mappings;\n    let len = length;\n    for (let i = len - 1; i >= 0; len = i, i--) {\n        if (mappings[i].length > 0)\n            break;\n    }\n    if (len < length)\n        mappings.length = len;\n}\nfunction putAll(strarr, array) {\n    for (let i = 0; i < array.length; i++)\n        put(strarr, array[i]);\n}\nfunction skipSourceless(line, index) {\n    // The start of a line is already sourceless, so adding a sourceless segment to the beginning\n    // doesn't generate any useful information.\n    if (index === 0)\n        return true;\n    const prev = line[index - 1];\n    // If the previous segment is also sourceless, then adding another sourceless segment doesn't\n    // genrate any new information. Else, this segment will end the source/named segment and point to\n    // a sourceless position, which is useful.\n    return prev.length === 1;\n}\nfunction skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {\n    // A source/named segment at the start of a line gives position at that genColumn\n    if (index === 0)\n        return false;\n    const prev = line[index - 1];\n    // If the previous segment is sourceless, then we're transitioning to a source.\n    if (prev.length === 1)\n        return false;\n    // If the previous segment maps to the exact same source position, then this segment doesn't\n    // provide any new position information.\n    return (sourcesIndex === prev[SOURCES_INDEX] &&\n        sourceLine === prev[SOURCE_LINE] &&\n        sourceColumn === prev[SOURCE_COLUMN] &&\n        namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));\n}\nfunction addMappingInternal(skipable, map, mapping) {\n    const { generated, source, original, name, content } = mapping;\n    if (!source) {\n        return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);\n    }\n    const s = source;\n    return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);\n}\n\nexport { GenMapping, addMapping, addSegment, allMappings, fromMap, maybeAddMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap };\n//# sourceMappingURL=gen-mapping.mjs.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map",
    "content": "{\"version\":3,\"file\":\"gen-mapping.mjs\",\"sources\":[\"../src/sourcemap-segment.ts\",\"../src/gen-mapping.ts\"],\"sourcesContent\":[\"type GeneratedColumn = number;\\ntype SourcesIndex = number;\\ntype SourceLine = number;\\ntype SourceColumn = number;\\ntype NamesIndex = number;\\n\\nexport type SourceMapSegment =\\n  | [GeneratedColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];\\n\\nexport const COLUMN = 0;\\nexport const SOURCES_INDEX = 1;\\nexport const SOURCE_LINE = 2;\\nexport const SOURCE_COLUMN = 3;\\nexport const NAMES_INDEX = 4;\\n\",\"import { SetArray, put } from '@jridgewell/set-array';\\nimport { encode } from '@jridgewell/sourcemap-codec';\\nimport { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';\\n\\nimport {\\n  COLUMN,\\n  SOURCES_INDEX,\\n  SOURCE_LINE,\\n  SOURCE_COLUMN,\\n  NAMES_INDEX,\\n} from './sourcemap-segment';\\n\\nimport type { SourceMapInput } from '@jridgewell/trace-mapping';\\nimport type { SourceMapSegment } from './sourcemap-segment';\\nimport type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types';\\n\\nexport type { DecodedSourceMap, EncodedSourceMap, Mapping };\\n\\nexport type Options = {\\n  file?: string | null;\\n  sourceRoot?: string | null;\\n};\\n\\nconst NO_NAME = -1;\\n\\n/**\\n * A low-level API to associate a generated position with an original source position. Line and\\n * column here are 0-based, unlike `addMapping`.\\n */\\nexport let addSegment: {\\n  (\\n    map: GenMapping,\\n    genLine: number,\\n    genColumn: number,\\n    source?: null,\\n    sourceLine?: null,\\n    sourceColumn?: null,\\n    name?: null,\\n    content?: null,\\n  ): void;\\n  (\\n    map: GenMapping,\\n    genLine: number,\\n    genColumn: number,\\n    source: string,\\n    sourceLine: number,\\n    sourceColumn: number,\\n    name?: null,\\n    content?: string | null,\\n  ): void;\\n  (\\n    map: GenMapping,\\n    genLine: number,\\n    genColumn: number,\\n    source: string,\\n    sourceLine: number,\\n    sourceColumn: number,\\n    name: string,\\n    content?: string | null,\\n  ): void;\\n};\\n\\n/**\\n * A high-level API to associate a generated position with an original source position. Line is\\n * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\\n */\\nexport let addMapping: {\\n  (\\n    map: GenMapping,\\n    mapping: {\\n      generated: Pos;\\n      source?: null;\\n      original?: null;\\n      name?: null;\\n      content?: null;\\n    },\\n  ): void;\\n  (\\n    map: GenMapping,\\n    mapping: {\\n      generated: Pos;\\n      source: string;\\n      original: Pos;\\n      name?: null;\\n      content?: string | null;\\n    },\\n  ): void;\\n  (\\n    map: GenMapping,\\n    mapping: {\\n      generated: Pos;\\n      source: string;\\n      original: Pos;\\n      name: string;\\n      content?: string | null;\\n    },\\n  ): void;\\n};\\n\\n/**\\n * Same as `addSegment`, but will only add the segment if it generates useful information in the\\n * resulting map. This only works correctly if segments are added **in order**, meaning you should\\n * not add a segment with a lower generated line/column than one that came before.\\n */\\nexport let maybeAddSegment: typeof addSegment;\\n\\n/**\\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\\n * not add a mapping with a lower generated line/column than one that came before.\\n */\\nexport let maybeAddMapping: typeof addMapping;\\n\\n/**\\n * Adds/removes the content of the source file to the source map.\\n */\\nexport let setSourceContent: (map: GenMapping, source: string, content: string | null) => void;\\n\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let toDecodedMap: (map: GenMapping) => DecodedSourceMap;\\n\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let toEncodedMap: (map: GenMapping) => EncodedSourceMap;\\n\\n/**\\n * Constructs a new GenMapping, using the already present mappings of the input.\\n */\\nexport let fromMap: (input: SourceMapInput) => GenMapping;\\n\\n/**\\n * Returns an array of high-level mapping objects for every recorded segment, which could then be\\n * passed to the `source-map` library.\\n */\\nexport let allMappings: (map: GenMapping) => Mapping[];\\n\\n// This split declaration is only so that terser can elminiate the static initialization block.\\nlet addSegmentInternal: <S extends string | null | undefined>(\\n  skipable: boolean,\\n  map: GenMapping,\\n  genLine: number,\\n  genColumn: number,\\n  source: S,\\n  sourceLine: S extends string ? number : null | undefined,\\n  sourceColumn: S extends string ? number : null | undefined,\\n  name: S extends string ? string | null | undefined : null | undefined,\\n  content: S extends string ? string | null | undefined : null | undefined,\\n) => void;\\n\\n/**\\n * Provides the state to generate a sourcemap.\\n */\\nexport class GenMapping {\\n  private _names = new SetArray();\\n  private _sources = new SetArray();\\n  private _sourcesContent: (string | null)[] = [];\\n  private _mappings: SourceMapSegment[][] = [];\\n  declare file: string | null | undefined;\\n  declare sourceRoot: string | null | undefined;\\n\\n  constructor({ file, sourceRoot }: Options = {}) {\\n    this.file = file;\\n    this.sourceRoot = sourceRoot;\\n  }\\n\\n  static {\\n    addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\\n      return addSegmentInternal(\\n        false,\\n        map,\\n        genLine,\\n        genColumn,\\n        source,\\n        sourceLine,\\n        sourceColumn,\\n        name,\\n        content,\\n      );\\n    };\\n\\n    maybeAddSegment = (\\n      map,\\n      genLine,\\n      genColumn,\\n      source,\\n      sourceLine,\\n      sourceColumn,\\n      name,\\n      content,\\n    ) => {\\n      return addSegmentInternal(\\n        true,\\n        map,\\n        genLine,\\n        genColumn,\\n        source,\\n        sourceLine,\\n        sourceColumn,\\n        name,\\n        content,\\n      );\\n    };\\n\\n    addMapping = (map, mapping) => {\\n      return addMappingInternal(false, map, mapping as Parameters<typeof addMappingInternal>[2]);\\n    };\\n\\n    maybeAddMapping = (map, mapping) => {\\n      return addMappingInternal(true, map, mapping as Parameters<typeof addMappingInternal>[2]);\\n    };\\n\\n    setSourceContent = (map, source, content) => {\\n      const { _sources: sources, _sourcesContent: sourcesContent } = map;\\n      sourcesContent[put(sources, source)] = content;\\n    };\\n\\n    toDecodedMap = (map) => {\\n      const {\\n        file,\\n        sourceRoot,\\n        _mappings: mappings,\\n        _sources: sources,\\n        _sourcesContent: sourcesContent,\\n        _names: names,\\n      } = map;\\n      removeEmptyFinalLines(mappings);\\n\\n      return {\\n        version: 3,\\n        file: file || undefined,\\n        names: names.array,\\n        sourceRoot: sourceRoot || undefined,\\n        sources: sources.array,\\n        sourcesContent,\\n        mappings,\\n      };\\n    };\\n\\n    toEncodedMap = (map) => {\\n      const decoded = toDecodedMap(map);\\n      return {\\n        ...decoded,\\n        mappings: encode(decoded.mappings as SourceMapSegment[][]),\\n      };\\n    };\\n\\n    allMappings = (map) => {\\n      const out: Mapping[] = [];\\n      const { _mappings: mappings, _sources: sources, _names: names } = map;\\n\\n      for (let i = 0; i < mappings.length; i++) {\\n        const line = mappings[i];\\n        for (let j = 0; j < line.length; j++) {\\n          const seg = line[j];\\n\\n          const generated = { line: i + 1, column: seg[COLUMN] };\\n          let source: string | undefined = undefined;\\n          let original: Pos | undefined = undefined;\\n          let name: string | undefined = undefined;\\n\\n          if (seg.length !== 1) {\\n            source = sources.array[seg[SOURCES_INDEX]];\\n            original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };\\n\\n            if (seg.length === 5) name = names.array[seg[NAMES_INDEX]];\\n          }\\n\\n          out.push({ generated, source, original, name } as Mapping);\\n        }\\n      }\\n\\n      return out;\\n    };\\n\\n    fromMap = (input) => {\\n      const map = new TraceMap(input);\\n      const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });\\n\\n      putAll(gen._names, map.names);\\n      putAll(gen._sources, map.sources as string[]);\\n      gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);\\n      gen._mappings = decodedMappings(map) as GenMapping['_mappings'];\\n\\n      return gen;\\n    };\\n\\n    // Internal helpers\\n    addSegmentInternal = (\\n      skipable,\\n      map,\\n      genLine,\\n      genColumn,\\n      source,\\n      sourceLine,\\n      sourceColumn,\\n      name,\\n      content,\\n    ) => {\\n      const {\\n        _mappings: mappings,\\n        _sources: sources,\\n        _sourcesContent: sourcesContent,\\n        _names: names,\\n      } = map;\\n      const line = getLine(mappings, genLine);\\n      const index = getColumnIndex(line, genColumn);\\n\\n      if (!source) {\\n        if (skipable && skipSourceless(line, index)) return;\\n        return insert(line, index, [genColumn]);\\n      }\\n\\n      // Sigh, TypeScript can't figure out sourceLine and sourceColumn aren't nullish if source\\n      // isn't nullish.\\n      assert<number>(sourceLine);\\n      assert<number>(sourceColumn);\\n\\n      const sourcesIndex = put(sources, source);\\n      const namesIndex = name ? put(names, name) : NO_NAME;\\n      if (sourcesIndex === sourcesContent.length) sourcesContent[sourcesIndex] = content ?? null;\\n\\n      if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\\n        return;\\n      }\\n\\n      return insert(\\n        line,\\n        index,\\n        name\\n          ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\\n          : [genColumn, sourcesIndex, sourceLine, sourceColumn],\\n      );\\n    };\\n  }\\n}\\n\\nfunction assert<T>(_val: unknown): asserts _val is T {\\n  // noop.\\n}\\n\\nfunction getLine(mappings: SourceMapSegment[][], index: number): SourceMapSegment[] {\\n  for (let i = mappings.length; i <= index; i++) {\\n    mappings[i] = [];\\n  }\\n  return mappings[index];\\n}\\n\\nfunction getColumnIndex(line: SourceMapSegment[], genColumn: number): number {\\n  let index = line.length;\\n  for (let i = index - 1; i >= 0; index = i--) {\\n    const current = line[i];\\n    if (genColumn >= current[COLUMN]) break;\\n  }\\n  return index;\\n}\\n\\nfunction insert<T>(array: T[], index: number, value: T) {\\n  for (let i = array.length; i > index; i--) {\\n    array[i] = array[i - 1];\\n  }\\n  array[index] = value;\\n}\\n\\nfunction removeEmptyFinalLines(mappings: SourceMapSegment[][]) {\\n  const { length } = mappings;\\n  let len = length;\\n  for (let i = len - 1; i >= 0; len = i, i--) {\\n    if (mappings[i].length > 0) break;\\n  }\\n  if (len < length) mappings.length = len;\\n}\\n\\nfunction putAll(strarr: SetArray, array: string[]) {\\n  for (let i = 0; i < array.length; i++) put(strarr, array[i]);\\n}\\n\\nfunction skipSourceless(line: SourceMapSegment[], index: number): boolean {\\n  // The start of a line is already sourceless, so adding a sourceless segment to the beginning\\n  // doesn't generate any useful information.\\n  if (index === 0) return true;\\n\\n  const prev = line[index - 1];\\n  // If the previous segment is also sourceless, then adding another sourceless segment doesn't\\n  // genrate any new information. Else, this segment will end the source/named segment and point to\\n  // a sourceless position, which is useful.\\n  return prev.length === 1;\\n}\\n\\nfunction skipSource(\\n  line: SourceMapSegment[],\\n  index: number,\\n  sourcesIndex: number,\\n  sourceLine: number,\\n  sourceColumn: number,\\n  namesIndex: number,\\n): boolean {\\n  // A source/named segment at the start of a line gives position at that genColumn\\n  if (index === 0) return false;\\n\\n  const prev = line[index - 1];\\n\\n  // If the previous segment is sourceless, then we're transitioning to a source.\\n  if (prev.length === 1) return false;\\n\\n  // If the previous segment maps to the exact same source position, then this segment doesn't\\n  // provide any new position information.\\n  return (\\n    sourcesIndex === prev[SOURCES_INDEX] &&\\n    sourceLine === prev[SOURCE_LINE] &&\\n    sourceColumn === prev[SOURCE_COLUMN] &&\\n    namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME)\\n  );\\n}\\n\\nfunction addMappingInternal<S extends string | null | undefined>(\\n  skipable: boolean,\\n  map: GenMapping,\\n  mapping: {\\n    generated: Pos;\\n    source: S;\\n    original: S extends string ? Pos : null | undefined;\\n    name: S extends string ? string | null | undefined : null | undefined;\\n    content: S extends string ? string | null | undefined : null | undefined;\\n  },\\n) {\\n  const { generated, source, original, name, content } = mapping;\\n  if (!source) {\\n    return addSegmentInternal(\\n      skipable,\\n      map,\\n      generated.line - 1,\\n      generated.column,\\n      null,\\n      null,\\n      null,\\n      null,\\n      null,\\n    );\\n  }\\n  const s: string = source;\\n  assert<Pos>(original);\\n  return addSegmentInternal(\\n    skipable,\\n    map,\\n    generated.line - 1,\\n    generated.column,\\n    s,\\n    original.line - 1,\\n    original.column,\\n    name,\\n    content,\\n  );\\n}\\n\"],\"names\":[],\"mappings\":\";;;;AAWO,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC;;ACQ5B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;AAEnB;;;AAGG;AACQ,IAAA,WA+BT;AAEF;;;AAGG;AACQ,IAAA,WA+BT;AAEF;;;;AAIG;AACQ,IAAA,gBAAmC;AAE9C;;;;AAIG;AACQ,IAAA,gBAAmC;AAE9C;;AAEG;AACQ,IAAA,iBAAoF;AAE/F;;;AAGG;AACQ,IAAA,aAAoD;AAE/D;;;AAGG;AACQ,IAAA,aAAoD;AAE/D;;AAEG;AACQ,IAAA,QAA+C;AAE1D;;;AAGG;AACQ,IAAA,YAA4C;AAEvD;AACA,IAAI,kBAUK,CAAC;AAEV;;AAEG;MACU,UAAU,CAAA;AAQrB,IAAA,WAAA,CAAY,EAAE,IAAI,EAAE,UAAU,KAAc,EAAE,EAAA;AAPtC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;AACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAe,CAAA,eAAA,GAAsB,EAAE,CAAC;QACxC,IAAS,CAAA,SAAA,GAAyB,EAAE,CAAC;AAK3C,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AA2KF,CAAA;AAzKC,CAAA,MAAA;AACE,IAAA,UAAU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,KAAI;QACxF,OAAO,kBAAkB,CACvB,KAAK,EACL,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,CACR,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,eAAe,GAAG,CAChB,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,KACL;QACF,OAAO,kBAAkB,CACvB,IAAI,EACJ,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,CACR,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,UAAU,GAAG,CAAC,GAAG,EAAE,OAAO,KAAI;QAC5B,OAAO,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAmD,CAAC,CAAC;AAC7F,KAAC,CAAC;AAEF,IAAA,eAAe,GAAG,CAAC,GAAG,EAAE,OAAO,KAAI;QACjC,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAmD,CAAC,CAAC;AAC5F,KAAC,CAAC;IAEF,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,KAAI;QAC1C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QACnE,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;AACjD,KAAC,CAAC;AAEF,IAAA,YAAY,GAAG,CAAC,GAAG,KAAI;QACrB,MAAM,EACJ,IAAI,EACJ,UAAU,EACV,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,MAAM,EAAE,KAAK,GACd,GAAG,GAAG,CAAC;QACR,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEhC,OAAO;AACL,YAAA,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,IAAI,IAAI,SAAS;YACvB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,UAAU,IAAI,SAAS;YACnC,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,cAAc;YACd,QAAQ;SACT,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,YAAY,GAAG,CAAC,GAAG,KAAI;AACrB,QAAA,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,OAAO,CACV,EAAA,EAAA,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAgC,CAAC,EAC1D,CAAA,CAAA;AACJ,KAAC,CAAC;AAEF,IAAA,WAAW,GAAG,CAAC,GAAG,KAAI;QACpB,MAAM,GAAG,GAAc,EAAE,CAAC;AAC1B,QAAA,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;AAEtE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpB,gBAAA,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,IAAI,MAAM,GAAuB,SAAS,CAAC;gBAC3C,IAAI,QAAQ,GAAoB,SAAS,CAAC;gBAC1C,IAAI,IAAI,GAAuB,SAAS,CAAC;AAEzC,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpB,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3C,oBAAA,QAAQ,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;AAEtE,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;wBAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5D,iBAAA;AAED,gBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAa,CAAC,CAAC;AAC5D,aAAA;AACF,SAAA;AAED,QAAA,OAAO,GAAG,CAAC;AACb,KAAC,CAAC;AAEF,IAAA,OAAO,GAAG,CAAC,KAAK,KAAI;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAE3E,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAmB,CAAC,CAAC;AAC9C,QAAA,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AACxE,QAAA,GAAG,CAAC,SAAS,GAAG,eAAe,CAAC,GAAG,CAA4B,CAAC;AAEhE,QAAA,OAAO,GAAG,CAAC;AACb,KAAC,CAAC;;IAGF,kBAAkB,GAAG,CACnB,QAAQ,EACR,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,KACL;AACF,QAAA,MAAM,EACJ,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,MAAM,EAAE,KAAK,GACd,GAAG,GAAG,CAAC;QACR,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;gBAAE,OAAO;YACpD,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AACzC,SAAA;QAOD,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;AACrD,QAAA,IAAI,YAAY,KAAK,cAAc,CAAC,MAAM;YAAE,cAAc,CAAC,YAAY,CAAC,GAAG,OAAO,KAAP,IAAA,IAAA,OAAO,KAAP,KAAA,CAAA,GAAA,OAAO,GAAI,IAAI,CAAC;AAE3F,QAAA,IAAI,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;YAC3F,OAAO;AACR,SAAA;AAED,QAAA,OAAO,MAAM,CACX,IAAI,EACJ,KAAK,EACL,IAAI;cACA,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;cAC/D,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CACxD,CAAC;AACJ,KAAC,CAAC;AACJ,CAAC,GAAA,CAAA;AAOH,SAAS,OAAO,CAAC,QAA8B,EAAE,KAAa,EAAA;AAC5D,IAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;AAC7C,QAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAClB,KAAA;AACD,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,IAAwB,EAAE,SAAiB,EAAA;AACjE,IAAA,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;AACxB,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;AAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,QAAA,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM;AACzC,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAI,KAAU,EAAE,KAAa,EAAE,KAAQ,EAAA;AACpD,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,KAAA;AACD,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAA8B,EAAA;AAC3D,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAC5B,IAAI,GAAG,GAAG,MAAM,CAAC;AACjB,IAAA,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1C,QAAA,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM;AACnC,KAAA;IACD,IAAI,GAAG,GAAG,MAAM;AAAE,QAAA,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,MAAM,CAAC,MAAgB,EAAE,KAAe,EAAA;AAC/C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,cAAc,CAAC,IAAwB,EAAE,KAAa,EAAA;;;IAG7D,IAAI,KAAK,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;;;AAI7B,IAAA,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CACjB,IAAwB,EACxB,KAAa,EACb,YAAoB,EACpB,UAAkB,EAClB,YAAoB,EACpB,UAAkB,EAAA;;IAGlB,IAAI,KAAK,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC;IAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;AAG7B,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC;;;AAIpC,IAAA,QACE,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;AACpC,QAAA,UAAU,KAAK,IAAI,CAAC,WAAW,CAAC;AAChC,QAAA,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;QACpC,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,EAChE;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAiB,EACjB,GAAe,EACf,OAMC,EAAA;AAED,IAAA,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,kBAAkB,CACvB,QAAQ,EACR,GAAG,EACH,SAAS,CAAC,IAAI,GAAG,CAAC,EAClB,SAAS,CAAC,MAAM,EAChB,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC;AACH,KAAA;IACD,MAAM,CAAC,GAAW,MAAM,CAAC;AAEzB,IAAA,OAAO,kBAAkB,CACvB,QAAQ,EACR,GAAG,EACH,SAAS,CAAC,IAAI,GAAG,CAAC,EAClB,SAAS,CAAC,MAAM,EAChB,CAAC,EACD,QAAQ,CAAC,IAAI,GAAG,CAAC,EACjB,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,OAAO,CACR,CAAC;AACJ;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@jridgewell/set-array'), require('@jridgewell/sourcemap-codec'), require('@jridgewell/trace-mapping')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@jridgewell/set-array', '@jridgewell/sourcemap-codec', '@jridgewell/trace-mapping'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.genMapping = {}, global.setArray, global.sourcemapCodec, global.traceMapping));\n})(this, (function (exports, setArray, sourcemapCodec, traceMapping) { 'use strict';\n\n    const COLUMN = 0;\n    const SOURCES_INDEX = 1;\n    const SOURCE_LINE = 2;\n    const SOURCE_COLUMN = 3;\n    const NAMES_INDEX = 4;\n\n    const NO_NAME = -1;\n    /**\n     * A low-level API to associate a generated position with an original source position. Line and\n     * column here are 0-based, unlike `addMapping`.\n     */\n    exports.addSegment = void 0;\n    /**\n     * A high-level API to associate a generated position with an original source position. Line is\n     * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\n     */\n    exports.addMapping = void 0;\n    /**\n     * Same as `addSegment`, but will only add the segment if it generates useful information in the\n     * resulting map. This only works correctly if segments are added **in order**, meaning you should\n     * not add a segment with a lower generated line/column than one that came before.\n     */\n    exports.maybeAddSegment = void 0;\n    /**\n     * Same as `addMapping`, but will only add the mapping if it generates useful information in the\n     * resulting map. This only works correctly if mappings are added **in order**, meaning you should\n     * not add a mapping with a lower generated line/column than one that came before.\n     */\n    exports.maybeAddMapping = void 0;\n    /**\n     * Adds/removes the content of the source file to the source map.\n     */\n    exports.setSourceContent = void 0;\n    /**\n     * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n     * a sourcemap, or to JSON.stringify.\n     */\n    exports.toDecodedMap = void 0;\n    /**\n     * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n     * a sourcemap, or to JSON.stringify.\n     */\n    exports.toEncodedMap = void 0;\n    /**\n     * Constructs a new GenMapping, using the already present mappings of the input.\n     */\n    exports.fromMap = void 0;\n    /**\n     * Returns an array of high-level mapping objects for every recorded segment, which could then be\n     * passed to the `source-map` library.\n     */\n    exports.allMappings = void 0;\n    // This split declaration is only so that terser can elminiate the static initialization block.\n    let addSegmentInternal;\n    /**\n     * Provides the state to generate a sourcemap.\n     */\n    class GenMapping {\n        constructor({ file, sourceRoot } = {}) {\n            this._names = new setArray.SetArray();\n            this._sources = new setArray.SetArray();\n            this._sourcesContent = [];\n            this._mappings = [];\n            this.file = file;\n            this.sourceRoot = sourceRoot;\n        }\n    }\n    (() => {\n        exports.addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\n            return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);\n        };\n        exports.maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\n            return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);\n        };\n        exports.addMapping = (map, mapping) => {\n            return addMappingInternal(false, map, mapping);\n        };\n        exports.maybeAddMapping = (map, mapping) => {\n            return addMappingInternal(true, map, mapping);\n        };\n        exports.setSourceContent = (map, source, content) => {\n            const { _sources: sources, _sourcesContent: sourcesContent } = map;\n            sourcesContent[setArray.put(sources, source)] = content;\n        };\n        exports.toDecodedMap = (map) => {\n            const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n            removeEmptyFinalLines(mappings);\n            return {\n                version: 3,\n                file: file || undefined,\n                names: names.array,\n                sourceRoot: sourceRoot || undefined,\n                sources: sources.array,\n                sourcesContent,\n                mappings,\n            };\n        };\n        exports.toEncodedMap = (map) => {\n            const decoded = exports.toDecodedMap(map);\n            return Object.assign(Object.assign({}, decoded), { mappings: sourcemapCodec.encode(decoded.mappings) });\n        };\n        exports.allMappings = (map) => {\n            const out = [];\n            const { _mappings: mappings, _sources: sources, _names: names } = map;\n            for (let i = 0; i < mappings.length; i++) {\n                const line = mappings[i];\n                for (let j = 0; j < line.length; j++) {\n                    const seg = line[j];\n                    const generated = { line: i + 1, column: seg[COLUMN] };\n                    let source = undefined;\n                    let original = undefined;\n                    let name = undefined;\n                    if (seg.length !== 1) {\n                        source = sources.array[seg[SOURCES_INDEX]];\n                        original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };\n                        if (seg.length === 5)\n                            name = names.array[seg[NAMES_INDEX]];\n                    }\n                    out.push({ generated, source, original, name });\n                }\n            }\n            return out;\n        };\n        exports.fromMap = (input) => {\n            const map = new traceMapping.TraceMap(input);\n            const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });\n            putAll(gen._names, map.names);\n            putAll(gen._sources, map.sources);\n            gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);\n            gen._mappings = traceMapping.decodedMappings(map);\n            return gen;\n        };\n        // Internal helpers\n        addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\n            const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n            const line = getLine(mappings, genLine);\n            const index = getColumnIndex(line, genColumn);\n            if (!source) {\n                if (skipable && skipSourceless(line, index))\n                    return;\n                return insert(line, index, [genColumn]);\n            }\n            const sourcesIndex = setArray.put(sources, source);\n            const namesIndex = name ? setArray.put(names, name) : NO_NAME;\n            if (sourcesIndex === sourcesContent.length)\n                sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;\n            if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\n                return;\n            }\n            return insert(line, index, name\n                ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\n                : [genColumn, sourcesIndex, sourceLine, sourceColumn]);\n        };\n    })();\n    function getLine(mappings, index) {\n        for (let i = mappings.length; i <= index; i++) {\n            mappings[i] = [];\n        }\n        return mappings[index];\n    }\n    function getColumnIndex(line, genColumn) {\n        let index = line.length;\n        for (let i = index - 1; i >= 0; index = i--) {\n            const current = line[i];\n            if (genColumn >= current[COLUMN])\n                break;\n        }\n        return index;\n    }\n    function insert(array, index, value) {\n        for (let i = array.length; i > index; i--) {\n            array[i] = array[i - 1];\n        }\n        array[index] = value;\n    }\n    function removeEmptyFinalLines(mappings) {\n        const { length } = mappings;\n        let len = length;\n        for (let i = len - 1; i >= 0; len = i, i--) {\n            if (mappings[i].length > 0)\n                break;\n        }\n        if (len < length)\n            mappings.length = len;\n    }\n    function putAll(strarr, array) {\n        for (let i = 0; i < array.length; i++)\n            setArray.put(strarr, array[i]);\n    }\n    function skipSourceless(line, index) {\n        // The start of a line is already sourceless, so adding a sourceless segment to the beginning\n        // doesn't generate any useful information.\n        if (index === 0)\n            return true;\n        const prev = line[index - 1];\n        // If the previous segment is also sourceless, then adding another sourceless segment doesn't\n        // genrate any new information. Else, this segment will end the source/named segment and point to\n        // a sourceless position, which is useful.\n        return prev.length === 1;\n    }\n    function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {\n        // A source/named segment at the start of a line gives position at that genColumn\n        if (index === 0)\n            return false;\n        const prev = line[index - 1];\n        // If the previous segment is sourceless, then we're transitioning to a source.\n        if (prev.length === 1)\n            return false;\n        // If the previous segment maps to the exact same source position, then this segment doesn't\n        // provide any new position information.\n        return (sourcesIndex === prev[SOURCES_INDEX] &&\n            sourceLine === prev[SOURCE_LINE] &&\n            sourceColumn === prev[SOURCE_COLUMN] &&\n            namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));\n    }\n    function addMappingInternal(skipable, map, mapping) {\n        const { generated, source, original, name, content } = mapping;\n        if (!source) {\n            return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);\n        }\n        const s = source;\n        return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);\n    }\n\n    exports.GenMapping = GenMapping;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=gen-mapping.umd.js.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map",
    "content": "{\"version\":3,\"file\":\"gen-mapping.umd.js\",\"sources\":[\"../src/sourcemap-segment.ts\",\"../src/gen-mapping.ts\"],\"sourcesContent\":[\"type GeneratedColumn = number;\\ntype SourcesIndex = number;\\ntype SourceLine = number;\\ntype SourceColumn = number;\\ntype NamesIndex = number;\\n\\nexport type SourceMapSegment =\\n  | [GeneratedColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];\\n\\nexport const COLUMN = 0;\\nexport const SOURCES_INDEX = 1;\\nexport const SOURCE_LINE = 2;\\nexport const SOURCE_COLUMN = 3;\\nexport const NAMES_INDEX = 4;\\n\",\"import { SetArray, put } from '@jridgewell/set-array';\\nimport { encode } from '@jridgewell/sourcemap-codec';\\nimport { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';\\n\\nimport {\\n  COLUMN,\\n  SOURCES_INDEX,\\n  SOURCE_LINE,\\n  SOURCE_COLUMN,\\n  NAMES_INDEX,\\n} from './sourcemap-segment';\\n\\nimport type { SourceMapInput } from '@jridgewell/trace-mapping';\\nimport type { SourceMapSegment } from './sourcemap-segment';\\nimport type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types';\\n\\nexport type { DecodedSourceMap, EncodedSourceMap, Mapping };\\n\\nexport type Options = {\\n  file?: string | null;\\n  sourceRoot?: string | null;\\n};\\n\\nconst NO_NAME = -1;\\n\\n/**\\n * A low-level API to associate a generated position with an original source position. Line and\\n * column here are 0-based, unlike `addMapping`.\\n */\\nexport let addSegment: {\\n  (\\n    map: GenMapping,\\n    genLine: number,\\n    genColumn: number,\\n    source?: null,\\n    sourceLine?: null,\\n    sourceColumn?: null,\\n    name?: null,\\n    content?: null,\\n  ): void;\\n  (\\n    map: GenMapping,\\n    genLine: number,\\n    genColumn: number,\\n    source: string,\\n    sourceLine: number,\\n    sourceColumn: number,\\n    name?: null,\\n    content?: string | null,\\n  ): void;\\n  (\\n    map: GenMapping,\\n    genLine: number,\\n    genColumn: number,\\n    source: string,\\n    sourceLine: number,\\n    sourceColumn: number,\\n    name: string,\\n    content?: string | null,\\n  ): void;\\n};\\n\\n/**\\n * A high-level API to associate a generated position with an original source position. Line is\\n * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\\n */\\nexport let addMapping: {\\n  (\\n    map: GenMapping,\\n    mapping: {\\n      generated: Pos;\\n      source?: null;\\n      original?: null;\\n      name?: null;\\n      content?: null;\\n    },\\n  ): void;\\n  (\\n    map: GenMapping,\\n    mapping: {\\n      generated: Pos;\\n      source: string;\\n      original: Pos;\\n      name?: null;\\n      content?: string | null;\\n    },\\n  ): void;\\n  (\\n    map: GenMapping,\\n    mapping: {\\n      generated: Pos;\\n      source: string;\\n      original: Pos;\\n      name: string;\\n      content?: string | null;\\n    },\\n  ): void;\\n};\\n\\n/**\\n * Same as `addSegment`, but will only add the segment if it generates useful information in the\\n * resulting map. This only works correctly if segments are added **in order**, meaning you should\\n * not add a segment with a lower generated line/column than one that came before.\\n */\\nexport let maybeAddSegment: typeof addSegment;\\n\\n/**\\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\\n * not add a mapping with a lower generated line/column than one that came before.\\n */\\nexport let maybeAddMapping: typeof addMapping;\\n\\n/**\\n * Adds/removes the content of the source file to the source map.\\n */\\nexport let setSourceContent: (map: GenMapping, source: string, content: string | null) => void;\\n\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let toDecodedMap: (map: GenMapping) => DecodedSourceMap;\\n\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let toEncodedMap: (map: GenMapping) => EncodedSourceMap;\\n\\n/**\\n * Constructs a new GenMapping, using the already present mappings of the input.\\n */\\nexport let fromMap: (input: SourceMapInput) => GenMapping;\\n\\n/**\\n * Returns an array of high-level mapping objects for every recorded segment, which could then be\\n * passed to the `source-map` library.\\n */\\nexport let allMappings: (map: GenMapping) => Mapping[];\\n\\n// This split declaration is only so that terser can elminiate the static initialization block.\\nlet addSegmentInternal: <S extends string | null | undefined>(\\n  skipable: boolean,\\n  map: GenMapping,\\n  genLine: number,\\n  genColumn: number,\\n  source: S,\\n  sourceLine: S extends string ? number : null | undefined,\\n  sourceColumn: S extends string ? number : null | undefined,\\n  name: S extends string ? string | null | undefined : null | undefined,\\n  content: S extends string ? string | null | undefined : null | undefined,\\n) => void;\\n\\n/**\\n * Provides the state to generate a sourcemap.\\n */\\nexport class GenMapping {\\n  private _names = new SetArray();\\n  private _sources = new SetArray();\\n  private _sourcesContent: (string | null)[] = [];\\n  private _mappings: SourceMapSegment[][] = [];\\n  declare file: string | null | undefined;\\n  declare sourceRoot: string | null | undefined;\\n\\n  constructor({ file, sourceRoot }: Options = {}) {\\n    this.file = file;\\n    this.sourceRoot = sourceRoot;\\n  }\\n\\n  static {\\n    addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {\\n      return addSegmentInternal(\\n        false,\\n        map,\\n        genLine,\\n        genColumn,\\n        source,\\n        sourceLine,\\n        sourceColumn,\\n        name,\\n        content,\\n      );\\n    };\\n\\n    maybeAddSegment = (\\n      map,\\n      genLine,\\n      genColumn,\\n      source,\\n      sourceLine,\\n      sourceColumn,\\n      name,\\n      content,\\n    ) => {\\n      return addSegmentInternal(\\n        true,\\n        map,\\n        genLine,\\n        genColumn,\\n        source,\\n        sourceLine,\\n        sourceColumn,\\n        name,\\n        content,\\n      );\\n    };\\n\\n    addMapping = (map, mapping) => {\\n      return addMappingInternal(false, map, mapping as Parameters<typeof addMappingInternal>[2]);\\n    };\\n\\n    maybeAddMapping = (map, mapping) => {\\n      return addMappingInternal(true, map, mapping as Parameters<typeof addMappingInternal>[2]);\\n    };\\n\\n    setSourceContent = (map, source, content) => {\\n      const { _sources: sources, _sourcesContent: sourcesContent } = map;\\n      sourcesContent[put(sources, source)] = content;\\n    };\\n\\n    toDecodedMap = (map) => {\\n      const {\\n        file,\\n        sourceRoot,\\n        _mappings: mappings,\\n        _sources: sources,\\n        _sourcesContent: sourcesContent,\\n        _names: names,\\n      } = map;\\n      removeEmptyFinalLines(mappings);\\n\\n      return {\\n        version: 3,\\n        file: file || undefined,\\n        names: names.array,\\n        sourceRoot: sourceRoot || undefined,\\n        sources: sources.array,\\n        sourcesContent,\\n        mappings,\\n      };\\n    };\\n\\n    toEncodedMap = (map) => {\\n      const decoded = toDecodedMap(map);\\n      return {\\n        ...decoded,\\n        mappings: encode(decoded.mappings as SourceMapSegment[][]),\\n      };\\n    };\\n\\n    allMappings = (map) => {\\n      const out: Mapping[] = [];\\n      const { _mappings: mappings, _sources: sources, _names: names } = map;\\n\\n      for (let i = 0; i < mappings.length; i++) {\\n        const line = mappings[i];\\n        for (let j = 0; j < line.length; j++) {\\n          const seg = line[j];\\n\\n          const generated = { line: i + 1, column: seg[COLUMN] };\\n          let source: string | undefined = undefined;\\n          let original: Pos | undefined = undefined;\\n          let name: string | undefined = undefined;\\n\\n          if (seg.length !== 1) {\\n            source = sources.array[seg[SOURCES_INDEX]];\\n            original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };\\n\\n            if (seg.length === 5) name = names.array[seg[NAMES_INDEX]];\\n          }\\n\\n          out.push({ generated, source, original, name } as Mapping);\\n        }\\n      }\\n\\n      return out;\\n    };\\n\\n    fromMap = (input) => {\\n      const map = new TraceMap(input);\\n      const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });\\n\\n      putAll(gen._names, map.names);\\n      putAll(gen._sources, map.sources as string[]);\\n      gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);\\n      gen._mappings = decodedMappings(map) as GenMapping['_mappings'];\\n\\n      return gen;\\n    };\\n\\n    // Internal helpers\\n    addSegmentInternal = (\\n      skipable,\\n      map,\\n      genLine,\\n      genColumn,\\n      source,\\n      sourceLine,\\n      sourceColumn,\\n      name,\\n      content,\\n    ) => {\\n      const {\\n        _mappings: mappings,\\n        _sources: sources,\\n        _sourcesContent: sourcesContent,\\n        _names: names,\\n      } = map;\\n      const line = getLine(mappings, genLine);\\n      const index = getColumnIndex(line, genColumn);\\n\\n      if (!source) {\\n        if (skipable && skipSourceless(line, index)) return;\\n        return insert(line, index, [genColumn]);\\n      }\\n\\n      // Sigh, TypeScript can't figure out sourceLine and sourceColumn aren't nullish if source\\n      // isn't nullish.\\n      assert<number>(sourceLine);\\n      assert<number>(sourceColumn);\\n\\n      const sourcesIndex = put(sources, source);\\n      const namesIndex = name ? put(names, name) : NO_NAME;\\n      if (sourcesIndex === sourcesContent.length) sourcesContent[sourcesIndex] = content ?? null;\\n\\n      if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\\n        return;\\n      }\\n\\n      return insert(\\n        line,\\n        index,\\n        name\\n          ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\\n          : [genColumn, sourcesIndex, sourceLine, sourceColumn],\\n      );\\n    };\\n  }\\n}\\n\\nfunction assert<T>(_val: unknown): asserts _val is T {\\n  // noop.\\n}\\n\\nfunction getLine(mappings: SourceMapSegment[][], index: number): SourceMapSegment[] {\\n  for (let i = mappings.length; i <= index; i++) {\\n    mappings[i] = [];\\n  }\\n  return mappings[index];\\n}\\n\\nfunction getColumnIndex(line: SourceMapSegment[], genColumn: number): number {\\n  let index = line.length;\\n  for (let i = index - 1; i >= 0; index = i--) {\\n    const current = line[i];\\n    if (genColumn >= current[COLUMN]) break;\\n  }\\n  return index;\\n}\\n\\nfunction insert<T>(array: T[], index: number, value: T) {\\n  for (let i = array.length; i > index; i--) {\\n    array[i] = array[i - 1];\\n  }\\n  array[index] = value;\\n}\\n\\nfunction removeEmptyFinalLines(mappings: SourceMapSegment[][]) {\\n  const { length } = mappings;\\n  let len = length;\\n  for (let i = len - 1; i >= 0; len = i, i--) {\\n    if (mappings[i].length > 0) break;\\n  }\\n  if (len < length) mappings.length = len;\\n}\\n\\nfunction putAll(strarr: SetArray, array: string[]) {\\n  for (let i = 0; i < array.length; i++) put(strarr, array[i]);\\n}\\n\\nfunction skipSourceless(line: SourceMapSegment[], index: number): boolean {\\n  // The start of a line is already sourceless, so adding a sourceless segment to the beginning\\n  // doesn't generate any useful information.\\n  if (index === 0) return true;\\n\\n  const prev = line[index - 1];\\n  // If the previous segment is also sourceless, then adding another sourceless segment doesn't\\n  // genrate any new information. Else, this segment will end the source/named segment and point to\\n  // a sourceless position, which is useful.\\n  return prev.length === 1;\\n}\\n\\nfunction skipSource(\\n  line: SourceMapSegment[],\\n  index: number,\\n  sourcesIndex: number,\\n  sourceLine: number,\\n  sourceColumn: number,\\n  namesIndex: number,\\n): boolean {\\n  // A source/named segment at the start of a line gives position at that genColumn\\n  if (index === 0) return false;\\n\\n  const prev = line[index - 1];\\n\\n  // If the previous segment is sourceless, then we're transitioning to a source.\\n  if (prev.length === 1) return false;\\n\\n  // If the previous segment maps to the exact same source position, then this segment doesn't\\n  // provide any new position information.\\n  return (\\n    sourcesIndex === prev[SOURCES_INDEX] &&\\n    sourceLine === prev[SOURCE_LINE] &&\\n    sourceColumn === prev[SOURCE_COLUMN] &&\\n    namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME)\\n  );\\n}\\n\\nfunction addMappingInternal<S extends string | null | undefined>(\\n  skipable: boolean,\\n  map: GenMapping,\\n  mapping: {\\n    generated: Pos;\\n    source: S;\\n    original: S extends string ? Pos : null | undefined;\\n    name: S extends string ? string | null | undefined : null | undefined;\\n    content: S extends string ? string | null | undefined : null | undefined;\\n  },\\n) {\\n  const { generated, source, original, name, content } = mapping;\\n  if (!source) {\\n    return addSegmentInternal(\\n      skipable,\\n      map,\\n      generated.line - 1,\\n      generated.column,\\n      null,\\n      null,\\n      null,\\n      null,\\n      null,\\n    );\\n  }\\n  const s: string = source;\\n  assert<Pos>(original);\\n  return addSegmentInternal(\\n    skipable,\\n    map,\\n    generated.line - 1,\\n    generated.column,\\n    s,\\n    original.line - 1,\\n    original.column,\\n    name,\\n    content,\\n  );\\n}\\n\"],\"names\":[\"addSegment\",\"addMapping\",\"maybeAddSegment\",\"maybeAddMapping\",\"setSourceContent\",\"toDecodedMap\",\"toEncodedMap\",\"fromMap\",\"allMappings\",\"SetArray\",\"put\",\"encode\",\"TraceMap\",\"decodedMappings\"],\"mappings\":\";;;;;;IAWO,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC;;ICQ5B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;IAEnB;;;IAGG;AACQA,gCA+BT;IAEF;;;IAGG;AACQC,gCA+BT;IAEF;;;;IAIG;AACQC,qCAAmC;IAE9C;;;;IAIG;AACQC,qCAAmC;IAE9C;;IAEG;AACQC,sCAAoF;IAE/F;;;IAGG;AACQC,kCAAoD;IAE/D;;;IAGG;AACQC,kCAAoD;IAE/D;;IAEG;AACQC,6BAA+C;IAE1D;;;IAGG;AACQC,iCAA4C;IAEvD;IACA,IAAI,kBAUK,CAAC;IAEV;;IAEG;UACU,UAAU,CAAA;IAQrB,IAAA,WAAA,CAAY,EAAE,IAAI,EAAE,UAAU,KAAc,EAAE,EAAA;IAPtC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAIC,iBAAQ,EAAE,CAAC;IACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAIA,iBAAQ,EAAE,CAAC;YAC1B,IAAe,CAAA,eAAA,GAAsB,EAAE,CAAC;YACxC,IAAS,CAAA,SAAA,GAAyB,EAAE,CAAC;IAK3C,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;SAC9B;IA2KF,CAAA;IAzKC,CAAA,MAAA;IACE,IAAAT,kBAAU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,KAAI;YACxF,OAAO,kBAAkB,CACvB,KAAK,EACL,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,CACR,CAAC;IACJ,KAAC,CAAC;IAEF,IAAAE,uBAAe,GAAG,CAChB,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,KACL;YACF,OAAO,kBAAkB,CACvB,IAAI,EACJ,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,CACR,CAAC;IACJ,KAAC,CAAC;IAEF,IAAAD,kBAAU,GAAG,CAAC,GAAG,EAAE,OAAO,KAAI;YAC5B,OAAO,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAmD,CAAC,CAAC;IAC7F,KAAC,CAAC;IAEF,IAAAE,uBAAe,GAAG,CAAC,GAAG,EAAE,OAAO,KAAI;YACjC,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAmD,CAAC,CAAC;IAC5F,KAAC,CAAC;QAEFC,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,KAAI;YAC1C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;YACnE,cAAc,CAACM,YAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;IACjD,KAAC,CAAC;IAEF,IAAAL,oBAAY,GAAG,CAAC,GAAG,KAAI;YACrB,MAAM,EACJ,IAAI,EACJ,UAAU,EACV,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,MAAM,EAAE,KAAK,GACd,GAAG,GAAG,CAAC;YACR,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAEhC,OAAO;IACL,YAAA,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,IAAI,IAAI,SAAS;gBACvB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EAAE,UAAU,IAAI,SAAS;gBACnC,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,cAAc;gBACd,QAAQ;aACT,CAAC;IACJ,KAAC,CAAC;IAEF,IAAAC,oBAAY,GAAG,CAAC,GAAG,KAAI;IACrB,QAAA,MAAM,OAAO,GAAGD,oBAAY,CAAC,GAAG,CAAC,CAAC;YAClC,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,OAAO,CACV,EAAA,EAAA,QAAQ,EAAEM,qBAAM,CAAC,OAAO,CAAC,QAAgC,CAAC,EAC1D,CAAA,CAAA;IACJ,KAAC,CAAC;IAEF,IAAAH,mBAAW,GAAG,CAAC,GAAG,KAAI;YACpB,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,QAAA,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAEtE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACxC,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACzB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,gBAAA,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvD,IAAI,MAAM,GAAuB,SAAS,CAAC;oBAC3C,IAAI,QAAQ,GAAoB,SAAS,CAAC;oBAC1C,IAAI,IAAI,GAAuB,SAAS,CAAC;IAEzC,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;wBACpB,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3C,oBAAA,QAAQ,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IAEtE,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;4BAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5D,iBAAA;IAED,gBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAa,CAAC,CAAC;IAC5D,aAAA;IACF,SAAA;IAED,QAAA,OAAO,GAAG,CAAC;IACb,KAAC,CAAC;IAEF,IAAAD,eAAO,GAAG,CAAC,KAAK,KAAI;IAClB,QAAA,MAAM,GAAG,GAAG,IAAIK,qBAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,QAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAE3E,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAmB,CAAC,CAAC;IAC9C,QAAA,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACxE,QAAA,GAAG,CAAC,SAAS,GAAGC,4BAAe,CAAC,GAAG,CAA4B,CAAC;IAEhE,QAAA,OAAO,GAAG,CAAC;IACb,KAAC,CAAC;;QAGF,kBAAkB,GAAG,CACnB,QAAQ,EACR,GAAG,EACH,OAAO,EACP,SAAS,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,OAAO,KACL;IACF,QAAA,MAAM,EACJ,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,MAAM,EAAE,KAAK,GACd,GAAG,GAAG,CAAC;YACR,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAE9C,IAAI,CAAC,MAAM,EAAE;IACX,YAAA,IAAI,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;oBAAE,OAAO;gBACpD,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,SAAA;YAOD,MAAM,YAAY,GAAGH,YAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAGA,YAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;IACrD,QAAA,IAAI,YAAY,KAAK,cAAc,CAAC,MAAM;gBAAE,cAAc,CAAC,YAAY,CAAC,GAAG,OAAO,KAAP,IAAA,IAAA,OAAO,KAAP,KAAA,CAAA,GAAA,OAAO,GAAI,IAAI,CAAC;IAE3F,QAAA,IAAI,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;gBAC3F,OAAO;IACR,SAAA;IAED,QAAA,OAAO,MAAM,CACX,IAAI,EACJ,KAAK,EACL,IAAI;kBACA,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;kBAC/D,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CACxD,CAAC;IACJ,KAAC,CAAC;IACJ,CAAC,GAAA,CAAA;IAOH,SAAS,OAAO,CAAC,QAA8B,EAAE,KAAa,EAAA;IAC5D,IAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;IAC7C,QAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAClB,KAAA;IACD,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,SAAS,cAAc,CAAC,IAAwB,EAAE,SAAiB,EAAA;IACjE,IAAA,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IACxB,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;IAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,QAAA,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;gBAAE,MAAM;IACzC,KAAA;IACD,IAAA,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,MAAM,CAAI,KAAU,EAAE,KAAa,EAAE,KAAQ,EAAA;IACpD,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YACzC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAA;IACD,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,SAAS,qBAAqB,CAAC,QAA8B,EAAA;IAC3D,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAC5B,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,IAAA,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IAC1C,QAAA,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM;IACnC,KAAA;QACD,IAAI,GAAG,GAAG,MAAM;IAAE,QAAA,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;IAC1C,CAAC;IAED,SAAS,MAAM,CAAC,MAAgB,EAAE,KAAe,EAAA;IAC/C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;YAAEA,YAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS,cAAc,CAAC,IAAwB,EAAE,KAAa,EAAA;;;QAG7D,IAAI,KAAK,KAAK,CAAC;IAAE,QAAA,OAAO,IAAI,CAAC;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;;;IAI7B,IAAA,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,UAAU,CACjB,IAAwB,EACxB,KAAa,EACb,YAAoB,EACpB,UAAkB,EAClB,YAAoB,EACpB,UAAkB,EAAA;;QAGlB,IAAI,KAAK,KAAK,CAAC;IAAE,QAAA,OAAO,KAAK,CAAC;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;;IAG7B,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;IAAE,QAAA,OAAO,KAAK,CAAC;;;IAIpC,IAAA,QACE,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;IACpC,QAAA,UAAU,KAAK,IAAI,CAAC,WAAW,CAAC;IAChC,QAAA,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;YACpC,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,EAChE;IACJ,CAAC;IAED,SAAS,kBAAkB,CACzB,QAAiB,EACjB,GAAe,EACf,OAMC,EAAA;IAED,IAAA,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC/D,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,kBAAkB,CACvB,QAAQ,EACR,GAAG,EACH,SAAS,CAAC,IAAI,GAAG,CAAC,EAClB,SAAS,CAAC,MAAM,EAChB,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC;IACH,KAAA;QACD,MAAM,CAAC,GAAW,MAAM,CAAC;IAEzB,IAAA,OAAO,kBAAkB,CACvB,QAAQ,EACR,GAAG,EACH,SAAS,CAAC,IAAI,GAAG,CAAC,EAClB,SAAS,CAAC,MAAM,EAChB,CAAC,EACD,QAAQ,CAAC,IAAI,GAAG,CAAC,EACjB,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,OAAO,CACR,CAAC;IACJ;;;;;;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts",
    "content": "import type { SourceMapInput } from '@jridgewell/trace-mapping';\nimport type { DecodedSourceMap, EncodedSourceMap, Pos, Mapping } from './types';\nexport type { DecodedSourceMap, EncodedSourceMap, Mapping };\nexport declare type Options = {\n    file?: string | null;\n    sourceRoot?: string | null;\n};\n/**\n * A low-level API to associate a generated position with an original source position. Line and\n * column here are 0-based, unlike `addMapping`.\n */\nexport declare let addSegment: {\n    (map: GenMapping, genLine: number, genColumn: number, source?: null, sourceLine?: null, sourceColumn?: null, name?: null, content?: null): void;\n    (map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name?: null, content?: string | null): void;\n    (map: GenMapping, genLine: number, genColumn: number, source: string, sourceLine: number, sourceColumn: number, name: string, content?: string | null): void;\n};\n/**\n * A high-level API to associate a generated position with an original source position. Line is\n * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\n */\nexport declare let addMapping: {\n    (map: GenMapping, mapping: {\n        generated: Pos;\n        source?: null;\n        original?: null;\n        name?: null;\n        content?: null;\n    }): void;\n    (map: GenMapping, mapping: {\n        generated: Pos;\n        source: string;\n        original: Pos;\n        name?: null;\n        content?: string | null;\n    }): void;\n    (map: GenMapping, mapping: {\n        generated: Pos;\n        source: string;\n        original: Pos;\n        name: string;\n        content?: string | null;\n    }): void;\n};\n/**\n * Same as `addSegment`, but will only add the segment if it generates useful information in the\n * resulting map. This only works correctly if segments are added **in order**, meaning you should\n * not add a segment with a lower generated line/column than one that came before.\n */\nexport declare let maybeAddSegment: typeof addSegment;\n/**\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\n * not add a mapping with a lower generated line/column than one that came before.\n */\nexport declare let maybeAddMapping: typeof addMapping;\n/**\n * Adds/removes the content of the source file to the source map.\n */\nexport declare let setSourceContent: (map: GenMapping, source: string, content: string | null) => void;\n/**\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nexport declare let toDecodedMap: (map: GenMapping) => DecodedSourceMap;\n/**\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nexport declare let toEncodedMap: (map: GenMapping) => EncodedSourceMap;\n/**\n * Constructs a new GenMapping, using the already present mappings of the input.\n */\nexport declare let fromMap: (input: SourceMapInput) => GenMapping;\n/**\n * Returns an array of high-level mapping objects for every recorded segment, which could then be\n * passed to the `source-map` library.\n */\nexport declare let allMappings: (map: GenMapping) => Mapping[];\n/**\n * Provides the state to generate a sourcemap.\n */\nexport declare class GenMapping {\n    private _names;\n    private _sources;\n    private _sourcesContent;\n    private _mappings;\n    file: string | null | undefined;\n    sourceRoot: string | null | undefined;\n    constructor({ file, sourceRoot }?: Options);\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts",
    "content": "declare type GeneratedColumn = number;\ndeclare type SourcesIndex = number;\ndeclare type SourceLine = number;\ndeclare type SourceColumn = number;\ndeclare type NamesIndex = number;\nexport declare type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];\nexport declare const COLUMN = 0;\nexport declare const SOURCES_INDEX = 1;\nexport declare const SOURCE_LINE = 2;\nexport declare const SOURCE_COLUMN = 3;\nexport declare const NAMES_INDEX = 4;\nexport {};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts",
    "content": "import type { SourceMapSegment } from './sourcemap-segment';\nexport interface SourceMapV3 {\n    file?: string | null;\n    names: readonly string[];\n    sourceRoot?: string;\n    sources: readonly (string | null)[];\n    sourcesContent?: readonly (string | null)[];\n    version: 3;\n}\nexport interface EncodedSourceMap extends SourceMapV3 {\n    mappings: string;\n}\nexport interface DecodedSourceMap extends SourceMapV3 {\n    mappings: readonly SourceMapSegment[][];\n}\nexport interface Pos {\n    line: number;\n    column: number;\n}\nexport declare type Mapping = {\n    generated: Pos;\n    source: undefined;\n    original: undefined;\n    name: undefined;\n} | {\n    generated: Pos;\n    source: string;\n    original: Pos;\n    name: string;\n} | {\n    generated: Pos;\n    source: string;\n    original: Pos;\n    name: undefined;\n};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/gen-mapping/package.json",
    "content": "{\n  \"name\": \"@jridgewell/gen-mapping\",\n  \"version\": \"0.3.3\",\n  \"description\": \"Generate source maps\",\n  \"keywords\": [\n    \"source\",\n    \"map\"\n  ],\n  \"author\": \"Justin Ridgewell <justin@ridgewell.name>\",\n  \"license\": \"MIT\",\n  \"repository\": \"https://github.com/jridgewell/gen-mapping\",\n  \"main\": \"dist/gen-mapping.umd.js\",\n  \"module\": \"dist/gen-mapping.mjs\",\n  \"types\": \"dist/types/gen-mapping.d.ts\",\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./dist/types/gen-mapping.d.ts\",\n        \"browser\": \"./dist/gen-mapping.umd.js\",\n        \"require\": \"./dist/gen-mapping.umd.js\",\n        \"import\": \"./dist/gen-mapping.mjs\"\n      },\n      \"./dist/gen-mapping.umd.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"engines\": {\n    \"node\": \">=6.0.0\"\n  },\n  \"scripts\": {\n    \"benchmark\": \"run-s build:rollup benchmark:*\",\n    \"benchmark:install\": \"cd benchmark && npm install\",\n    \"benchmark:only\": \"node benchmark/index.mjs\",\n    \"prebuild\": \"rm -rf dist\",\n    \"build\": \"run-s -n build:*\",\n    \"build:rollup\": \"rollup -c rollup.config.js\",\n    \"build:ts\": \"tsc --project tsconfig.build.json\",\n    \"lint\": \"run-s -n lint:*\",\n    \"lint:prettier\": \"npm run test:lint:prettier -- --write\",\n    \"lint:ts\": \"npm run test:lint:ts -- --fix\",\n    \"pretest\": \"run-s build:rollup\",\n    \"test\": \"run-s -n test:lint test:coverage\",\n    \"test:debug\": \"mocha --inspect-brk\",\n    \"test:lint\": \"run-s -n test:lint:*\",\n    \"test:lint:prettier\": \"prettier --check '{src,test}/**/*.ts'\",\n    \"test:lint:ts\": \"eslint '{src,test}/**/*.ts'\",\n    \"test:only\": \"mocha\",\n    \"test:coverage\": \"c8 mocha\",\n    \"test:watch\": \"run-p 'build:rollup -- --watch' 'test:only -- --watch'\",\n    \"prepublishOnly\": \"npm run preversion\",\n    \"preversion\": \"run-s test build\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-typescript\": \"8.3.2\",\n    \"@types/mocha\": \"9.1.1\",\n    \"@types/node\": \"17.0.29\",\n    \"@typescript-eslint/eslint-plugin\": \"5.21.0\",\n    \"@typescript-eslint/parser\": \"5.21.0\",\n    \"benchmark\": \"2.1.4\",\n    \"c8\": \"7.11.2\",\n    \"eslint\": \"8.14.0\",\n    \"eslint-config-prettier\": \"8.5.0\",\n    \"mocha\": \"9.2.2\",\n    \"npm-run-all\": \"4.1.5\",\n    \"prettier\": \"2.6.2\",\n    \"rollup\": \"2.70.2\",\n    \"typescript\": \"4.6.3\"\n  },\n  \"dependencies\": {\n    \"@jridgewell/set-array\": \"^1.0.1\",\n    \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n    \"@jridgewell/trace-mapping\": \"^0.3.9\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/LICENSE",
    "content": "Copyright 2019 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/README.md",
    "content": "# @jridgewell/resolve-uri\n\n> Resolve a URI relative to an optional base URI\n\nResolve any combination of absolute URIs, protocol-realtive URIs, absolute paths, or relative paths.\n\n## Installation\n\n```sh\nnpm install @jridgewell/resolve-uri\n```\n\n## Usage\n\n```typescript\nfunction resolve(input: string, base?: string): string;\n```\n\n```js\nimport resolve from '@jridgewell/resolve-uri';\n\nresolve('foo', 'https://example.com'); // => 'https://example.com/foo'\n```\n\n| Input                 | Base                    | Resolution                     | Explanation                                                  |\n|-----------------------|-------------------------|--------------------------------|--------------------------------------------------------------|\n| `https://example.com` | _any_                   | `https://example.com/`         | Input is normalized only                                     |\n| `//example.com`       | `https://base.com/`     | `https://example.com/`         | Input inherits the base's protocol                           |\n| `//example.com`       | _rest_                  | `//example.com/`               | Input is normalized only                                     |\n| `/example`            | `https://base.com/`     | `https://base.com/example`     | Input inherits the base's origin                             |\n| `/example`            | `//base.com/`           | `//base.com/example`           | Input inherits the base's host and remains protocol relative |\n| `/example`            | _rest_                  | `/example`                     | Input is normalized only                                     |\n| `example`             | `https://base.com/dir/` | `https://base.com/dir/example` | Input is joined with the base                                |\n| `example`             | `https://base.com/file` | `https://base.com/example`     | Input is joined with the base without its file               |\n| `example`             | `//base.com/dir/`       | `//base.com/dir/example`       | Input is joined with the base's last directory               |\n| `example`             | `//base.com/file`       | `//base.com/example`           | Input is joined with the base without its file               |\n| `example`             | `/base/dir/`            | `/base/dir/example`            | Input is joined with the base's last directory               |\n| `example`             | `/base/file`            | `/base/example`                | Input is joined with the base without its file               |\n| `example`             | `base/dir/`             | `base/dir/example`             | Input is joined with the base's last directory               |\n| `example`             | `base/file`             | `base/example`                 | Input is joined with the base without its file               |\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs",
    "content": "// Matches the scheme of a URL, eg \"http://\"\nconst schemeRegex = /^[\\w+.-]+:\\/\\//;\n/**\n * Matches the parts of a URL:\n * 1. Scheme, including \":\", guaranteed.\n * 2. User/password, including \"@\", optional.\n * 3. Host, guaranteed.\n * 4. Port, including \":\", optional.\n * 5. Path, including \"/\", optional.\n * 6. Query, including \"?\", optional.\n * 7. Hash, including \"#\", optional.\n */\nconst urlRegex = /^([\\w+.-]+:)\\/\\/([^@/#?]*@)?([^:/#?]*)(:\\d+)?(\\/[^#?]*)?(\\?[^#]*)?(#.*)?/;\n/**\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\n *\n * 1. Host, optional.\n * 2. Path, which may include \"/\", guaranteed.\n * 3. Query, including \"?\", optional.\n * 4. Hash, including \"#\", optional.\n */\nconst fileRegex = /^file:(?:\\/\\/((?![a-z]:)[^/#?]*)?)?(\\/?[^#?]*)(\\?[^#]*)?(#.*)?/i;\nvar UrlType;\n(function (UrlType) {\n    UrlType[UrlType[\"Empty\"] = 1] = \"Empty\";\n    UrlType[UrlType[\"Hash\"] = 2] = \"Hash\";\n    UrlType[UrlType[\"Query\"] = 3] = \"Query\";\n    UrlType[UrlType[\"RelativePath\"] = 4] = \"RelativePath\";\n    UrlType[UrlType[\"AbsolutePath\"] = 5] = \"AbsolutePath\";\n    UrlType[UrlType[\"SchemeRelative\"] = 6] = \"SchemeRelative\";\n    UrlType[UrlType[\"Absolute\"] = 7] = \"Absolute\";\n})(UrlType || (UrlType = {}));\nfunction isAbsoluteUrl(input) {\n    return schemeRegex.test(input);\n}\nfunction isSchemeRelativeUrl(input) {\n    return input.startsWith('//');\n}\nfunction isAbsolutePath(input) {\n    return input.startsWith('/');\n}\nfunction isFileUrl(input) {\n    return input.startsWith('file:');\n}\nfunction isRelative(input) {\n    return /^[.?#]/.test(input);\n}\nfunction parseAbsoluteUrl(input) {\n    const match = urlRegex.exec(input);\n    return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');\n}\nfunction parseFileUrl(input) {\n    const match = fileRegex.exec(input);\n    const path = match[2];\n    return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');\n}\nfunction makeUrl(scheme, user, host, port, path, query, hash) {\n    return {\n        scheme,\n        user,\n        host,\n        port,\n        path,\n        query,\n        hash,\n        type: UrlType.Absolute,\n    };\n}\nfunction parseUrl(input) {\n    if (isSchemeRelativeUrl(input)) {\n        const url = parseAbsoluteUrl('http:' + input);\n        url.scheme = '';\n        url.type = UrlType.SchemeRelative;\n        return url;\n    }\n    if (isAbsolutePath(input)) {\n        const url = parseAbsoluteUrl('http://foo.com' + input);\n        url.scheme = '';\n        url.host = '';\n        url.type = UrlType.AbsolutePath;\n        return url;\n    }\n    if (isFileUrl(input))\n        return parseFileUrl(input);\n    if (isAbsoluteUrl(input))\n        return parseAbsoluteUrl(input);\n    const url = parseAbsoluteUrl('http://foo.com/' + input);\n    url.scheme = '';\n    url.host = '';\n    url.type = input\n        ? input.startsWith('?')\n            ? UrlType.Query\n            : input.startsWith('#')\n                ? UrlType.Hash\n                : UrlType.RelativePath\n        : UrlType.Empty;\n    return url;\n}\nfunction stripPathFilename(path) {\n    // If a path ends with a parent directory \"..\", then it's a relative path with excess parent\n    // paths. It's not a file, so we can't strip it.\n    if (path.endsWith('/..'))\n        return path;\n    const index = path.lastIndexOf('/');\n    return path.slice(0, index + 1);\n}\nfunction mergePaths(url, base) {\n    normalizePath(base, base.type);\n    // If the path is just a \"/\", then it was an empty path to begin with (remember, we're a relative\n    // path).\n    if (url.path === '/') {\n        url.path = base.path;\n    }\n    else {\n        // Resolution happens relative to the base path's directory, not the file.\n        url.path = stripPathFilename(base.path) + url.path;\n    }\n}\n/**\n * The path can have empty directories \"//\", unneeded parents \"foo/..\", or current directory\n * \"foo/.\". We need to normalize to a standard representation.\n */\nfunction normalizePath(url, type) {\n    const rel = type <= UrlType.RelativePath;\n    const pieces = url.path.split('/');\n    // We need to preserve the first piece always, so that we output a leading slash. The item at\n    // pieces[0] is an empty string.\n    let pointer = 1;\n    // Positive is the number of real directories we've output, used for popping a parent directory.\n    // Eg, \"foo/bar/..\" will have a positive 2, and we can decrement to be left with just \"foo\".\n    let positive = 0;\n    // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \"foo/\" will\n    // generate `[\"foo\", \"\"]` pieces). And, if we pop a parent directory. But once we encounter a\n    // real directory, we won't need to append, unless the other conditions happen again.\n    let addTrailingSlash = false;\n    for (let i = 1; i < pieces.length; i++) {\n        const piece = pieces[i];\n        // An empty directory, could be a trailing slash, or just a double \"//\" in the path.\n        if (!piece) {\n            addTrailingSlash = true;\n            continue;\n        }\n        // If we encounter a real directory, then we don't need to append anymore.\n        addTrailingSlash = false;\n        // A current directory, which we can always drop.\n        if (piece === '.')\n            continue;\n        // A parent directory, we need to see if there are any real directories we can pop. Else, we\n        // have an excess of parents, and we'll need to keep the \"..\".\n        if (piece === '..') {\n            if (positive) {\n                addTrailingSlash = true;\n                positive--;\n                pointer--;\n            }\n            else if (rel) {\n                // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\n                // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\n                pieces[pointer++] = piece;\n            }\n            continue;\n        }\n        // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\n        // any popped or dropped directories.\n        pieces[pointer++] = piece;\n        positive++;\n    }\n    let path = '';\n    for (let i = 1; i < pointer; i++) {\n        path += '/' + pieces[i];\n    }\n    if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\n        path += '/';\n    }\n    url.path = path;\n}\n/**\n * Attempts to resolve `input` URL/path relative to `base`.\n */\nfunction resolve(input, base) {\n    if (!input && !base)\n        return '';\n    const url = parseUrl(input);\n    let inputType = url.type;\n    if (base && inputType !== UrlType.Absolute) {\n        const baseUrl = parseUrl(base);\n        const baseType = baseUrl.type;\n        switch (inputType) {\n            case UrlType.Empty:\n                url.hash = baseUrl.hash;\n            // fall through\n            case UrlType.Hash:\n                url.query = baseUrl.query;\n            // fall through\n            case UrlType.Query:\n            case UrlType.RelativePath:\n                mergePaths(url, baseUrl);\n            // fall through\n            case UrlType.AbsolutePath:\n                // The host, user, and port are joined, you can't copy one without the others.\n                url.user = baseUrl.user;\n                url.host = baseUrl.host;\n                url.port = baseUrl.port;\n            // fall through\n            case UrlType.SchemeRelative:\n                // The input doesn't have a schema at least, so we need to copy at least that over.\n                url.scheme = baseUrl.scheme;\n        }\n        if (baseType > inputType)\n            inputType = baseType;\n    }\n    normalizePath(url, inputType);\n    const queryHash = url.query + url.hash;\n    switch (inputType) {\n        // This is impossible, because of the empty checks at the start of the function.\n        // case UrlType.Empty:\n        case UrlType.Hash:\n        case UrlType.Query:\n            return queryHash;\n        case UrlType.RelativePath: {\n            // The first char is always a \"/\", and we need it to be relative.\n            const path = url.path.slice(1);\n            if (!path)\n                return queryHash || '.';\n            if (isRelative(base || input) && !isRelative(path)) {\n                // If base started with a leading \".\", or there is no base and input started with a \".\",\n                // then we need to ensure that the relative path starts with a \".\". We don't know if\n                // relative starts with a \"..\", though, so check before prepending.\n                return './' + path + queryHash;\n            }\n            return path + queryHash;\n        }\n        case UrlType.AbsolutePath:\n            return url.path + queryHash;\n        default:\n            return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;\n    }\n}\n\nexport { resolve as default };\n//# sourceMappingURL=resolve-uri.mjs.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map",
    "content": "{\"version\":3,\"file\":\"resolve-uri.mjs\",\"sources\":[\"../src/resolve-uri.ts\"],\"sourcesContent\":[\"// Matches the scheme of a URL, eg \\\"http://\\\"\\nconst schemeRegex = /^[\\\\w+.-]+:\\\\/\\\\//;\\n\\n/**\\n * Matches the parts of a URL:\\n * 1. Scheme, including \\\":\\\", guaranteed.\\n * 2. User/password, including \\\"@\\\", optional.\\n * 3. Host, guaranteed.\\n * 4. Port, including \\\":\\\", optional.\\n * 5. Path, including \\\"/\\\", optional.\\n * 6. Query, including \\\"?\\\", optional.\\n * 7. Hash, including \\\"#\\\", optional.\\n */\\nconst urlRegex = /^([\\\\w+.-]+:)\\\\/\\\\/([^@/#?]*@)?([^:/#?]*)(:\\\\d+)?(\\\\/[^#?]*)?(\\\\?[^#]*)?(#.*)?/;\\n\\n/**\\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\\n *\\n * 1. Host, optional.\\n * 2. Path, which may include \\\"/\\\", guaranteed.\\n * 3. Query, including \\\"?\\\", optional.\\n * 4. Hash, including \\\"#\\\", optional.\\n */\\nconst fileRegex = /^file:(?:\\\\/\\\\/((?![a-z]:)[^/#?]*)?)?(\\\\/?[^#?]*)(\\\\?[^#]*)?(#.*)?/i;\\n\\ntype Url = {\\n  scheme: string;\\n  user: string;\\n  host: string;\\n  port: string;\\n  path: string;\\n  query: string;\\n  hash: string;\\n  type: UrlType;\\n};\\n\\nenum UrlType {\\n  Empty = 1,\\n  Hash = 2,\\n  Query = 3,\\n  RelativePath = 4,\\n  AbsolutePath = 5,\\n  SchemeRelative = 6,\\n  Absolute = 7,\\n}\\n\\nfunction isAbsoluteUrl(input: string): boolean {\\n  return schemeRegex.test(input);\\n}\\n\\nfunction isSchemeRelativeUrl(input: string): boolean {\\n  return input.startsWith('//');\\n}\\n\\nfunction isAbsolutePath(input: string): boolean {\\n  return input.startsWith('/');\\n}\\n\\nfunction isFileUrl(input: string): boolean {\\n  return input.startsWith('file:');\\n}\\n\\nfunction isRelative(input: string): boolean {\\n  return /^[.?#]/.test(input);\\n}\\n\\nfunction parseAbsoluteUrl(input: string): Url {\\n  const match = urlRegex.exec(input)!;\\n  return makeUrl(\\n    match[1],\\n    match[2] || '',\\n    match[3],\\n    match[4] || '',\\n    match[5] || '/',\\n    match[6] || '',\\n    match[7] || '',\\n  );\\n}\\n\\nfunction parseFileUrl(input: string): Url {\\n  const match = fileRegex.exec(input)!;\\n  const path = match[2];\\n  return makeUrl(\\n    'file:',\\n    '',\\n    match[1] || '',\\n    '',\\n    isAbsolutePath(path) ? path : '/' + path,\\n    match[3] || '',\\n    match[4] || '',\\n  );\\n}\\n\\nfunction makeUrl(\\n  scheme: string,\\n  user: string,\\n  host: string,\\n  port: string,\\n  path: string,\\n  query: string,\\n  hash: string,\\n): Url {\\n  return {\\n    scheme,\\n    user,\\n    host,\\n    port,\\n    path,\\n    query,\\n    hash,\\n    type: UrlType.Absolute,\\n  };\\n}\\n\\nfunction parseUrl(input: string): Url {\\n  if (isSchemeRelativeUrl(input)) {\\n    const url = parseAbsoluteUrl('http:' + input);\\n    url.scheme = '';\\n    url.type = UrlType.SchemeRelative;\\n    return url;\\n  }\\n\\n  if (isAbsolutePath(input)) {\\n    const url = parseAbsoluteUrl('http://foo.com' + input);\\n    url.scheme = '';\\n    url.host = '';\\n    url.type = UrlType.AbsolutePath;\\n    return url;\\n  }\\n\\n  if (isFileUrl(input)) return parseFileUrl(input);\\n\\n  if (isAbsoluteUrl(input)) return parseAbsoluteUrl(input);\\n\\n  const url = parseAbsoluteUrl('http://foo.com/' + input);\\n  url.scheme = '';\\n  url.host = '';\\n  url.type = input\\n    ? input.startsWith('?')\\n      ? UrlType.Query\\n      : input.startsWith('#')\\n      ? UrlType.Hash\\n      : UrlType.RelativePath\\n    : UrlType.Empty;\\n  return url;\\n}\\n\\nfunction stripPathFilename(path: string): string {\\n  // If a path ends with a parent directory \\\"..\\\", then it's a relative path with excess parent\\n  // paths. It's not a file, so we can't strip it.\\n  if (path.endsWith('/..')) return path;\\n  const index = path.lastIndexOf('/');\\n  return path.slice(0, index + 1);\\n}\\n\\nfunction mergePaths(url: Url, base: Url) {\\n  normalizePath(base, base.type);\\n\\n  // If the path is just a \\\"/\\\", then it was an empty path to begin with (remember, we're a relative\\n  // path).\\n  if (url.path === '/') {\\n    url.path = base.path;\\n  } else {\\n    // Resolution happens relative to the base path's directory, not the file.\\n    url.path = stripPathFilename(base.path) + url.path;\\n  }\\n}\\n\\n/**\\n * The path can have empty directories \\\"//\\\", unneeded parents \\\"foo/..\\\", or current directory\\n * \\\"foo/.\\\". We need to normalize to a standard representation.\\n */\\nfunction normalizePath(url: Url, type: UrlType) {\\n  const rel = type <= UrlType.RelativePath;\\n  const pieces = url.path.split('/');\\n\\n  // We need to preserve the first piece always, so that we output a leading slash. The item at\\n  // pieces[0] is an empty string.\\n  let pointer = 1;\\n\\n  // Positive is the number of real directories we've output, used for popping a parent directory.\\n  // Eg, \\\"foo/bar/..\\\" will have a positive 2, and we can decrement to be left with just \\\"foo\\\".\\n  let positive = 0;\\n\\n  // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \\\"foo/\\\" will\\n  // generate `[\\\"foo\\\", \\\"\\\"]` pieces). And, if we pop a parent directory. But once we encounter a\\n  // real directory, we won't need to append, unless the other conditions happen again.\\n  let addTrailingSlash = false;\\n\\n  for (let i = 1; i < pieces.length; i++) {\\n    const piece = pieces[i];\\n\\n    // An empty directory, could be a trailing slash, or just a double \\\"//\\\" in the path.\\n    if (!piece) {\\n      addTrailingSlash = true;\\n      continue;\\n    }\\n\\n    // If we encounter a real directory, then we don't need to append anymore.\\n    addTrailingSlash = false;\\n\\n    // A current directory, which we can always drop.\\n    if (piece === '.') continue;\\n\\n    // A parent directory, we need to see if there are any real directories we can pop. Else, we\\n    // have an excess of parents, and we'll need to keep the \\\"..\\\".\\n    if (piece === '..') {\\n      if (positive) {\\n        addTrailingSlash = true;\\n        positive--;\\n        pointer--;\\n      } else if (rel) {\\n        // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\\n        // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\\n        pieces[pointer++] = piece;\\n      }\\n      continue;\\n    }\\n\\n    // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\\n    // any popped or dropped directories.\\n    pieces[pointer++] = piece;\\n    positive++;\\n  }\\n\\n  let path = '';\\n  for (let i = 1; i < pointer; i++) {\\n    path += '/' + pieces[i];\\n  }\\n  if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\\n    path += '/';\\n  }\\n  url.path = path;\\n}\\n\\n/**\\n * Attempts to resolve `input` URL/path relative to `base`.\\n */\\nexport default function resolve(input: string, base: string | undefined): string {\\n  if (!input && !base) return '';\\n\\n  const url = parseUrl(input);\\n  let inputType = url.type;\\n\\n  if (base && inputType !== UrlType.Absolute) {\\n    const baseUrl = parseUrl(base);\\n    const baseType = baseUrl.type;\\n\\n    switch (inputType) {\\n      case UrlType.Empty:\\n        url.hash = baseUrl.hash;\\n      // fall through\\n\\n      case UrlType.Hash:\\n        url.query = baseUrl.query;\\n      // fall through\\n\\n      case UrlType.Query:\\n      case UrlType.RelativePath:\\n        mergePaths(url, baseUrl);\\n      // fall through\\n\\n      case UrlType.AbsolutePath:\\n        // The host, user, and port are joined, you can't copy one without the others.\\n        url.user = baseUrl.user;\\n        url.host = baseUrl.host;\\n        url.port = baseUrl.port;\\n      // fall through\\n\\n      case UrlType.SchemeRelative:\\n        // The input doesn't have a schema at least, so we need to copy at least that over.\\n        url.scheme = baseUrl.scheme;\\n    }\\n    if (baseType > inputType) inputType = baseType;\\n  }\\n\\n  normalizePath(url, inputType);\\n\\n  const queryHash = url.query + url.hash;\\n  switch (inputType) {\\n    // This is impossible, because of the empty checks at the start of the function.\\n    // case UrlType.Empty:\\n\\n    case UrlType.Hash:\\n    case UrlType.Query:\\n      return queryHash;\\n\\n    case UrlType.RelativePath: {\\n      // The first char is always a \\\"/\\\", and we need it to be relative.\\n      const path = url.path.slice(1);\\n\\n      if (!path) return queryHash || '.';\\n\\n      if (isRelative(base || input) && !isRelative(path)) {\\n        // If base started with a leading \\\".\\\", or there is no base and input started with a \\\".\\\",\\n        // then we need to ensure that the relative path starts with a \\\".\\\". We don't know if\\n        // relative starts with a \\\"..\\\", though, so check before prepending.\\n        return './' + path + queryHash;\\n      }\\n\\n      return path + queryHash;\\n    }\\n\\n    case UrlType.AbsolutePath:\\n      return url.path + queryHash;\\n\\n    default:\\n      return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;\\n  }\\n}\\n\"],\"names\":[],\"mappings\":\"AAAA;AACA,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC;;;;;;;;;;AAUA,MAAM,QAAQ,GAAG,0EAA0E,CAAC;AAE5F;;;;;;;;;AASA,MAAM,SAAS,GAAG,iEAAiE,CAAC;AAapF,IAAK,OAQJ;AARD,WAAK,OAAO;IACV,uCAAS,CAAA;IACT,qCAAQ,CAAA;IACR,uCAAS,CAAA;IACT,qDAAgB,CAAA;IAChB,qDAAgB,CAAA;IAChB,yDAAkB,CAAA;IAClB,6CAAY,CAAA;AACd,CAAC,EARI,OAAO,KAAP,OAAO,QAQX;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;IACpC,OAAO,OAAO,CACZ,KAAK,CAAC,CAAC,CAAC,EACR,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,EACR,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EACf,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACf,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,OAAO,CACZ,OAAO,EACP,EAAE,EACF,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,EAAE,EACF,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,EACxC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACf,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CACd,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,KAAa,EACb,IAAY;IAEZ,OAAO;QACL,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,QAAQ;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;QAC9C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;QAClC,OAAO,GAAG,CAAC;KACZ;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;QACzB,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;QACvD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;QAChC,OAAO,GAAG,CAAC;KACZ;IAED,IAAI,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEzD,MAAM,GAAG,GAAG,gBAAgB,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;IACxD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,IAAI,GAAG,KAAK;UACZ,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;cACnB,OAAO,CAAC,KAAK;cACb,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;kBACrB,OAAO,CAAC,IAAI;kBACZ,OAAO,CAAC,YAAY;UACtB,OAAO,CAAC,KAAK,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;;;IAGrC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ,EAAE,IAAS;IACrC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;;IAI/B,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;QACpB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;KACtB;SAAM;;QAEL,GAAG,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;KACpD;AACH,CAAC;AAED;;;;AAIA,SAAS,aAAa,CAAC,GAAQ,EAAE,IAAa;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;;IAInC,IAAI,OAAO,GAAG,CAAC,CAAC;;;IAIhB,IAAI,QAAQ,GAAG,CAAC,CAAC;;;;IAKjB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;;QAGxB,IAAI,CAAC,KAAK,EAAE;YACV,gBAAgB,GAAG,IAAI,CAAC;YACxB,SAAS;SACV;;QAGD,gBAAgB,GAAG,KAAK,CAAC;;QAGzB,IAAI,KAAK,KAAK,GAAG;YAAE,SAAS;;;QAI5B,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,IAAI,QAAQ,EAAE;gBACZ,gBAAgB,GAAG,IAAI,CAAC;gBACxB,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,CAAC;aACX;iBAAM,IAAI,GAAG,EAAE;;;gBAGd,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;aAC3B;YACD,SAAS;SACV;;;QAID,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;QAC1B,QAAQ,EAAE,CAAC;KACZ;IAED,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;QAChC,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;KACzB;IACD,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;QACxD,IAAI,IAAI,GAAG,CAAC;KACb;IACD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AAClB,CAAC;AAED;;;SAGwB,OAAO,CAAC,KAAa,EAAE,IAAwB;IACrE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;IAEzB,IAAI,IAAI,IAAI,SAAS,KAAK,OAAO,CAAC,QAAQ,EAAE;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;QAE9B,QAAQ,SAAS;YACf,KAAK,OAAO,CAAC,KAAK;gBAChB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;YAG1B,KAAK,OAAO,CAAC,IAAI;gBACf,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;;YAG5B,KAAK,OAAO,CAAC,KAAK,CAAC;YACnB,KAAK,OAAO,CAAC,YAAY;gBACvB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;;YAG3B,KAAK,OAAO,CAAC,YAAY;;gBAEvB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBACxB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBACxB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;YAG1B,KAAK,OAAO,CAAC,cAAc;;gBAEzB,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;SAC/B;QACD,IAAI,QAAQ,GAAG,SAAS;YAAE,SAAS,GAAG,QAAQ,CAAC;KAChD;IAED,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;IACvC,QAAQ,SAAS;;;QAIf,KAAK,OAAO,CAAC,IAAI,CAAC;QAClB,KAAK,OAAO,CAAC,KAAK;YAChB,OAAO,SAAS,CAAC;QAEnB,KAAK,OAAO,CAAC,YAAY,EAAE;;YAEzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,CAAC,IAAI;gBAAE,OAAO,SAAS,IAAI,GAAG,CAAC;YAEnC,IAAI,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;;;;gBAIlD,OAAO,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;aAChC;YAED,OAAO,IAAI,GAAG,SAAS,CAAC;SACzB;QAED,KAAK,OAAO,CAAC,YAAY;YACvB,OAAO,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;QAE9B;YACE,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;KACpF;AACH;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.resolveURI = factory());\n})(this, (function () { 'use strict';\n\n    // Matches the scheme of a URL, eg \"http://\"\n    const schemeRegex = /^[\\w+.-]+:\\/\\//;\n    /**\n     * Matches the parts of a URL:\n     * 1. Scheme, including \":\", guaranteed.\n     * 2. User/password, including \"@\", optional.\n     * 3. Host, guaranteed.\n     * 4. Port, including \":\", optional.\n     * 5. Path, including \"/\", optional.\n     * 6. Query, including \"?\", optional.\n     * 7. Hash, including \"#\", optional.\n     */\n    const urlRegex = /^([\\w+.-]+:)\\/\\/([^@/#?]*@)?([^:/#?]*)(:\\d+)?(\\/[^#?]*)?(\\?[^#]*)?(#.*)?/;\n    /**\n     * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\n     * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\n     *\n     * 1. Host, optional.\n     * 2. Path, which may include \"/\", guaranteed.\n     * 3. Query, including \"?\", optional.\n     * 4. Hash, including \"#\", optional.\n     */\n    const fileRegex = /^file:(?:\\/\\/((?![a-z]:)[^/#?]*)?)?(\\/?[^#?]*)(\\?[^#]*)?(#.*)?/i;\n    var UrlType;\n    (function (UrlType) {\n        UrlType[UrlType[\"Empty\"] = 1] = \"Empty\";\n        UrlType[UrlType[\"Hash\"] = 2] = \"Hash\";\n        UrlType[UrlType[\"Query\"] = 3] = \"Query\";\n        UrlType[UrlType[\"RelativePath\"] = 4] = \"RelativePath\";\n        UrlType[UrlType[\"AbsolutePath\"] = 5] = \"AbsolutePath\";\n        UrlType[UrlType[\"SchemeRelative\"] = 6] = \"SchemeRelative\";\n        UrlType[UrlType[\"Absolute\"] = 7] = \"Absolute\";\n    })(UrlType || (UrlType = {}));\n    function isAbsoluteUrl(input) {\n        return schemeRegex.test(input);\n    }\n    function isSchemeRelativeUrl(input) {\n        return input.startsWith('//');\n    }\n    function isAbsolutePath(input) {\n        return input.startsWith('/');\n    }\n    function isFileUrl(input) {\n        return input.startsWith('file:');\n    }\n    function isRelative(input) {\n        return /^[.?#]/.test(input);\n    }\n    function parseAbsoluteUrl(input) {\n        const match = urlRegex.exec(input);\n        return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');\n    }\n    function parseFileUrl(input) {\n        const match = fileRegex.exec(input);\n        const path = match[2];\n        return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');\n    }\n    function makeUrl(scheme, user, host, port, path, query, hash) {\n        return {\n            scheme,\n            user,\n            host,\n            port,\n            path,\n            query,\n            hash,\n            type: UrlType.Absolute,\n        };\n    }\n    function parseUrl(input) {\n        if (isSchemeRelativeUrl(input)) {\n            const url = parseAbsoluteUrl('http:' + input);\n            url.scheme = '';\n            url.type = UrlType.SchemeRelative;\n            return url;\n        }\n        if (isAbsolutePath(input)) {\n            const url = parseAbsoluteUrl('http://foo.com' + input);\n            url.scheme = '';\n            url.host = '';\n            url.type = UrlType.AbsolutePath;\n            return url;\n        }\n        if (isFileUrl(input))\n            return parseFileUrl(input);\n        if (isAbsoluteUrl(input))\n            return parseAbsoluteUrl(input);\n        const url = parseAbsoluteUrl('http://foo.com/' + input);\n        url.scheme = '';\n        url.host = '';\n        url.type = input\n            ? input.startsWith('?')\n                ? UrlType.Query\n                : input.startsWith('#')\n                    ? UrlType.Hash\n                    : UrlType.RelativePath\n            : UrlType.Empty;\n        return url;\n    }\n    function stripPathFilename(path) {\n        // If a path ends with a parent directory \"..\", then it's a relative path with excess parent\n        // paths. It's not a file, so we can't strip it.\n        if (path.endsWith('/..'))\n            return path;\n        const index = path.lastIndexOf('/');\n        return path.slice(0, index + 1);\n    }\n    function mergePaths(url, base) {\n        normalizePath(base, base.type);\n        // If the path is just a \"/\", then it was an empty path to begin with (remember, we're a relative\n        // path).\n        if (url.path === '/') {\n            url.path = base.path;\n        }\n        else {\n            // Resolution happens relative to the base path's directory, not the file.\n            url.path = stripPathFilename(base.path) + url.path;\n        }\n    }\n    /**\n     * The path can have empty directories \"//\", unneeded parents \"foo/..\", or current directory\n     * \"foo/.\". We need to normalize to a standard representation.\n     */\n    function normalizePath(url, type) {\n        const rel = type <= UrlType.RelativePath;\n        const pieces = url.path.split('/');\n        // We need to preserve the first piece always, so that we output a leading slash. The item at\n        // pieces[0] is an empty string.\n        let pointer = 1;\n        // Positive is the number of real directories we've output, used for popping a parent directory.\n        // Eg, \"foo/bar/..\" will have a positive 2, and we can decrement to be left with just \"foo\".\n        let positive = 0;\n        // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \"foo/\" will\n        // generate `[\"foo\", \"\"]` pieces). And, if we pop a parent directory. But once we encounter a\n        // real directory, we won't need to append, unless the other conditions happen again.\n        let addTrailingSlash = false;\n        for (let i = 1; i < pieces.length; i++) {\n            const piece = pieces[i];\n            // An empty directory, could be a trailing slash, or just a double \"//\" in the path.\n            if (!piece) {\n                addTrailingSlash = true;\n                continue;\n            }\n            // If we encounter a real directory, then we don't need to append anymore.\n            addTrailingSlash = false;\n            // A current directory, which we can always drop.\n            if (piece === '.')\n                continue;\n            // A parent directory, we need to see if there are any real directories we can pop. Else, we\n            // have an excess of parents, and we'll need to keep the \"..\".\n            if (piece === '..') {\n                if (positive) {\n                    addTrailingSlash = true;\n                    positive--;\n                    pointer--;\n                }\n                else if (rel) {\n                    // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\n                    // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\n                    pieces[pointer++] = piece;\n                }\n                continue;\n            }\n            // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\n            // any popped or dropped directories.\n            pieces[pointer++] = piece;\n            positive++;\n        }\n        let path = '';\n        for (let i = 1; i < pointer; i++) {\n            path += '/' + pieces[i];\n        }\n        if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\n            path += '/';\n        }\n        url.path = path;\n    }\n    /**\n     * Attempts to resolve `input` URL/path relative to `base`.\n     */\n    function resolve(input, base) {\n        if (!input && !base)\n            return '';\n        const url = parseUrl(input);\n        let inputType = url.type;\n        if (base && inputType !== UrlType.Absolute) {\n            const baseUrl = parseUrl(base);\n            const baseType = baseUrl.type;\n            switch (inputType) {\n                case UrlType.Empty:\n                    url.hash = baseUrl.hash;\n                // fall through\n                case UrlType.Hash:\n                    url.query = baseUrl.query;\n                // fall through\n                case UrlType.Query:\n                case UrlType.RelativePath:\n                    mergePaths(url, baseUrl);\n                // fall through\n                case UrlType.AbsolutePath:\n                    // The host, user, and port are joined, you can't copy one without the others.\n                    url.user = baseUrl.user;\n                    url.host = baseUrl.host;\n                    url.port = baseUrl.port;\n                // fall through\n                case UrlType.SchemeRelative:\n                    // The input doesn't have a schema at least, so we need to copy at least that over.\n                    url.scheme = baseUrl.scheme;\n            }\n            if (baseType > inputType)\n                inputType = baseType;\n        }\n        normalizePath(url, inputType);\n        const queryHash = url.query + url.hash;\n        switch (inputType) {\n            // This is impossible, because of the empty checks at the start of the function.\n            // case UrlType.Empty:\n            case UrlType.Hash:\n            case UrlType.Query:\n                return queryHash;\n            case UrlType.RelativePath: {\n                // The first char is always a \"/\", and we need it to be relative.\n                const path = url.path.slice(1);\n                if (!path)\n                    return queryHash || '.';\n                if (isRelative(base || input) && !isRelative(path)) {\n                    // If base started with a leading \".\", or there is no base and input started with a \".\",\n                    // then we need to ensure that the relative path starts with a \".\". We don't know if\n                    // relative starts with a \"..\", though, so check before prepending.\n                    return './' + path + queryHash;\n                }\n                return path + queryHash;\n            }\n            case UrlType.AbsolutePath:\n                return url.path + queryHash;\n            default:\n                return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;\n        }\n    }\n\n    return resolve;\n\n}));\n//# sourceMappingURL=resolve-uri.umd.js.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map",
    "content": "{\"version\":3,\"file\":\"resolve-uri.umd.js\",\"sources\":[\"../src/resolve-uri.ts\"],\"sourcesContent\":[\"// Matches the scheme of a URL, eg \\\"http://\\\"\\nconst schemeRegex = /^[\\\\w+.-]+:\\\\/\\\\//;\\n\\n/**\\n * Matches the parts of a URL:\\n * 1. Scheme, including \\\":\\\", guaranteed.\\n * 2. User/password, including \\\"@\\\", optional.\\n * 3. Host, guaranteed.\\n * 4. Port, including \\\":\\\", optional.\\n * 5. Path, including \\\"/\\\", optional.\\n * 6. Query, including \\\"?\\\", optional.\\n * 7. Hash, including \\\"#\\\", optional.\\n */\\nconst urlRegex = /^([\\\\w+.-]+:)\\\\/\\\\/([^@/#?]*@)?([^:/#?]*)(:\\\\d+)?(\\\\/[^#?]*)?(\\\\?[^#]*)?(#.*)?/;\\n\\n/**\\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\\n *\\n * 1. Host, optional.\\n * 2. Path, which may include \\\"/\\\", guaranteed.\\n * 3. Query, including \\\"?\\\", optional.\\n * 4. Hash, including \\\"#\\\", optional.\\n */\\nconst fileRegex = /^file:(?:\\\\/\\\\/((?![a-z]:)[^/#?]*)?)?(\\\\/?[^#?]*)(\\\\?[^#]*)?(#.*)?/i;\\n\\ntype Url = {\\n  scheme: string;\\n  user: string;\\n  host: string;\\n  port: string;\\n  path: string;\\n  query: string;\\n  hash: string;\\n  type: UrlType;\\n};\\n\\nenum UrlType {\\n  Empty = 1,\\n  Hash = 2,\\n  Query = 3,\\n  RelativePath = 4,\\n  AbsolutePath = 5,\\n  SchemeRelative = 6,\\n  Absolute = 7,\\n}\\n\\nfunction isAbsoluteUrl(input: string): boolean {\\n  return schemeRegex.test(input);\\n}\\n\\nfunction isSchemeRelativeUrl(input: string): boolean {\\n  return input.startsWith('//');\\n}\\n\\nfunction isAbsolutePath(input: string): boolean {\\n  return input.startsWith('/');\\n}\\n\\nfunction isFileUrl(input: string): boolean {\\n  return input.startsWith('file:');\\n}\\n\\nfunction isRelative(input: string): boolean {\\n  return /^[.?#]/.test(input);\\n}\\n\\nfunction parseAbsoluteUrl(input: string): Url {\\n  const match = urlRegex.exec(input)!;\\n  return makeUrl(\\n    match[1],\\n    match[2] || '',\\n    match[3],\\n    match[4] || '',\\n    match[5] || '/',\\n    match[6] || '',\\n    match[7] || '',\\n  );\\n}\\n\\nfunction parseFileUrl(input: string): Url {\\n  const match = fileRegex.exec(input)!;\\n  const path = match[2];\\n  return makeUrl(\\n    'file:',\\n    '',\\n    match[1] || '',\\n    '',\\n    isAbsolutePath(path) ? path : '/' + path,\\n    match[3] || '',\\n    match[4] || '',\\n  );\\n}\\n\\nfunction makeUrl(\\n  scheme: string,\\n  user: string,\\n  host: string,\\n  port: string,\\n  path: string,\\n  query: string,\\n  hash: string,\\n): Url {\\n  return {\\n    scheme,\\n    user,\\n    host,\\n    port,\\n    path,\\n    query,\\n    hash,\\n    type: UrlType.Absolute,\\n  };\\n}\\n\\nfunction parseUrl(input: string): Url {\\n  if (isSchemeRelativeUrl(input)) {\\n    const url = parseAbsoluteUrl('http:' + input);\\n    url.scheme = '';\\n    url.type = UrlType.SchemeRelative;\\n    return url;\\n  }\\n\\n  if (isAbsolutePath(input)) {\\n    const url = parseAbsoluteUrl('http://foo.com' + input);\\n    url.scheme = '';\\n    url.host = '';\\n    url.type = UrlType.AbsolutePath;\\n    return url;\\n  }\\n\\n  if (isFileUrl(input)) return parseFileUrl(input);\\n\\n  if (isAbsoluteUrl(input)) return parseAbsoluteUrl(input);\\n\\n  const url = parseAbsoluteUrl('http://foo.com/' + input);\\n  url.scheme = '';\\n  url.host = '';\\n  url.type = input\\n    ? input.startsWith('?')\\n      ? UrlType.Query\\n      : input.startsWith('#')\\n      ? UrlType.Hash\\n      : UrlType.RelativePath\\n    : UrlType.Empty;\\n  return url;\\n}\\n\\nfunction stripPathFilename(path: string): string {\\n  // If a path ends with a parent directory \\\"..\\\", then it's a relative path with excess parent\\n  // paths. It's not a file, so we can't strip it.\\n  if (path.endsWith('/..')) return path;\\n  const index = path.lastIndexOf('/');\\n  return path.slice(0, index + 1);\\n}\\n\\nfunction mergePaths(url: Url, base: Url) {\\n  normalizePath(base, base.type);\\n\\n  // If the path is just a \\\"/\\\", then it was an empty path to begin with (remember, we're a relative\\n  // path).\\n  if (url.path === '/') {\\n    url.path = base.path;\\n  } else {\\n    // Resolution happens relative to the base path's directory, not the file.\\n    url.path = stripPathFilename(base.path) + url.path;\\n  }\\n}\\n\\n/**\\n * The path can have empty directories \\\"//\\\", unneeded parents \\\"foo/..\\\", or current directory\\n * \\\"foo/.\\\". We need to normalize to a standard representation.\\n */\\nfunction normalizePath(url: Url, type: UrlType) {\\n  const rel = type <= UrlType.RelativePath;\\n  const pieces = url.path.split('/');\\n\\n  // We need to preserve the first piece always, so that we output a leading slash. The item at\\n  // pieces[0] is an empty string.\\n  let pointer = 1;\\n\\n  // Positive is the number of real directories we've output, used for popping a parent directory.\\n  // Eg, \\\"foo/bar/..\\\" will have a positive 2, and we can decrement to be left with just \\\"foo\\\".\\n  let positive = 0;\\n\\n  // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \\\"foo/\\\" will\\n  // generate `[\\\"foo\\\", \\\"\\\"]` pieces). And, if we pop a parent directory. But once we encounter a\\n  // real directory, we won't need to append, unless the other conditions happen again.\\n  let addTrailingSlash = false;\\n\\n  for (let i = 1; i < pieces.length; i++) {\\n    const piece = pieces[i];\\n\\n    // An empty directory, could be a trailing slash, or just a double \\\"//\\\" in the path.\\n    if (!piece) {\\n      addTrailingSlash = true;\\n      continue;\\n    }\\n\\n    // If we encounter a real directory, then we don't need to append anymore.\\n    addTrailingSlash = false;\\n\\n    // A current directory, which we can always drop.\\n    if (piece === '.') continue;\\n\\n    // A parent directory, we need to see if there are any real directories we can pop. Else, we\\n    // have an excess of parents, and we'll need to keep the \\\"..\\\".\\n    if (piece === '..') {\\n      if (positive) {\\n        addTrailingSlash = true;\\n        positive--;\\n        pointer--;\\n      } else if (rel) {\\n        // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\\n        // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\\n        pieces[pointer++] = piece;\\n      }\\n      continue;\\n    }\\n\\n    // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\\n    // any popped or dropped directories.\\n    pieces[pointer++] = piece;\\n    positive++;\\n  }\\n\\n  let path = '';\\n  for (let i = 1; i < pointer; i++) {\\n    path += '/' + pieces[i];\\n  }\\n  if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\\n    path += '/';\\n  }\\n  url.path = path;\\n}\\n\\n/**\\n * Attempts to resolve `input` URL/path relative to `base`.\\n */\\nexport default function resolve(input: string, base: string | undefined): string {\\n  if (!input && !base) return '';\\n\\n  const url = parseUrl(input);\\n  let inputType = url.type;\\n\\n  if (base && inputType !== UrlType.Absolute) {\\n    const baseUrl = parseUrl(base);\\n    const baseType = baseUrl.type;\\n\\n    switch (inputType) {\\n      case UrlType.Empty:\\n        url.hash = baseUrl.hash;\\n      // fall through\\n\\n      case UrlType.Hash:\\n        url.query = baseUrl.query;\\n      // fall through\\n\\n      case UrlType.Query:\\n      case UrlType.RelativePath:\\n        mergePaths(url, baseUrl);\\n      // fall through\\n\\n      case UrlType.AbsolutePath:\\n        // The host, user, and port are joined, you can't copy one without the others.\\n        url.user = baseUrl.user;\\n        url.host = baseUrl.host;\\n        url.port = baseUrl.port;\\n      // fall through\\n\\n      case UrlType.SchemeRelative:\\n        // The input doesn't have a schema at least, so we need to copy at least that over.\\n        url.scheme = baseUrl.scheme;\\n    }\\n    if (baseType > inputType) inputType = baseType;\\n  }\\n\\n  normalizePath(url, inputType);\\n\\n  const queryHash = url.query + url.hash;\\n  switch (inputType) {\\n    // This is impossible, because of the empty checks at the start of the function.\\n    // case UrlType.Empty:\\n\\n    case UrlType.Hash:\\n    case UrlType.Query:\\n      return queryHash;\\n\\n    case UrlType.RelativePath: {\\n      // The first char is always a \\\"/\\\", and we need it to be relative.\\n      const path = url.path.slice(1);\\n\\n      if (!path) return queryHash || '.';\\n\\n      if (isRelative(base || input) && !isRelative(path)) {\\n        // If base started with a leading \\\".\\\", or there is no base and input started with a \\\".\\\",\\n        // then we need to ensure that the relative path starts with a \\\".\\\". We don't know if\\n        // relative starts with a \\\"..\\\", though, so check before prepending.\\n        return './' + path + queryHash;\\n      }\\n\\n      return path + queryHash;\\n    }\\n\\n    case UrlType.AbsolutePath:\\n      return url.path + queryHash;\\n\\n    default:\\n      return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;\\n  }\\n}\\n\"],\"names\":[],\"mappings\":\";;;;;;IAAA;IACA,MAAM,WAAW,GAAG,gBAAgB,CAAC;IAErC;;;;;;;;;;IAUA,MAAM,QAAQ,GAAG,0EAA0E,CAAC;IAE5F;;;;;;;;;IASA,MAAM,SAAS,GAAG,iEAAiE,CAAC;IAapF,IAAK,OAQJ;IARD,WAAK,OAAO;QACV,uCAAS,CAAA;QACT,qCAAQ,CAAA;QACR,uCAAS,CAAA;QACT,qDAAgB,CAAA;QAChB,qDAAgB,CAAA;QAChB,yDAAkB,CAAA;QAClB,6CAAY,CAAA;IACd,CAAC,EARI,OAAO,KAAP,OAAO,QAQX;IAED,SAAS,aAAa,CAAC,KAAa;QAClC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,mBAAmB,CAAC,KAAa;QACxC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,SAAS,cAAc,CAAC,KAAa;QACnC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS,SAAS,CAAC,KAAa;QAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,UAAU,CAAC,KAAa;QAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,gBAAgB,CAAC,KAAa;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACpC,OAAO,OAAO,CACZ,KAAK,CAAC,CAAC,CAAC,EACR,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,EACR,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EACf,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACf,CAAC;IACJ,CAAC;IAED,SAAS,YAAY,CAAC,KAAa;QACjC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,OAAO,CACZ,OAAO,EACP,EAAE,EACF,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,EAAE,EACF,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,EACxC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EACd,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACf,CAAC;IACJ,CAAC;IAED,SAAS,OAAO,CACd,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,KAAa,EACb,IAAY;QAEZ,OAAO;YACL,MAAM;YACN,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,QAAQ;SACvB,CAAC;IACJ,CAAC;IAED,SAAS,QAAQ,CAAC,KAAa;QAC7B,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;YAC9B,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;YAC9C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;YAClC,OAAO,GAAG,CAAC;SACZ;QAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;YACzB,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;YACvD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;YAChC,OAAO,GAAG,CAAC;SACZ;QAED,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEzD,MAAM,GAAG,GAAG,gBAAgB,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;QACxD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,GAAG,KAAK;cACZ,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;kBACnB,OAAO,CAAC,KAAK;kBACb,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;sBACrB,OAAO,CAAC,IAAI;sBACZ,OAAO,CAAC,YAAY;cACtB,OAAO,CAAC,KAAK,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,iBAAiB,CAAC,IAAY;;;QAGrC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,UAAU,CAAC,GAAQ,EAAE,IAAS;QACrC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;;QAI/B,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YACpB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;SACtB;aAAM;;YAEL,GAAG,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;SACpD;IACH,CAAC;IAED;;;;IAIA,SAAS,aAAa,CAAC,GAAQ,EAAE,IAAa;QAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;;QAInC,IAAI,OAAO,GAAG,CAAC,CAAC;;;QAIhB,IAAI,QAAQ,GAAG,CAAC,CAAC;;;;QAKjB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;;YAGxB,IAAI,CAAC,KAAK,EAAE;gBACV,gBAAgB,GAAG,IAAI,CAAC;gBACxB,SAAS;aACV;;YAGD,gBAAgB,GAAG,KAAK,CAAC;;YAGzB,IAAI,KAAK,KAAK,GAAG;gBAAE,SAAS;;;YAI5B,IAAI,KAAK,KAAK,IAAI,EAAE;gBAClB,IAAI,QAAQ,EAAE;oBACZ,gBAAgB,GAAG,IAAI,CAAC;oBACxB,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,CAAC;iBACX;qBAAM,IAAI,GAAG,EAAE;;;oBAGd,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;iBAC3B;gBACD,SAAS;aACV;;;YAID,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;YAC1B,QAAQ,EAAE,CAAC;SACZ;QAED,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;YAChC,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;SACzB;QACD,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;YACxD,IAAI,IAAI,GAAG,CAAC;SACb;QACD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED;;;aAGwB,OAAO,CAAC,KAAa,EAAE,IAAwB;QACrE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;QAEzB,IAAI,IAAI,IAAI,SAAS,KAAK,OAAO,CAAC,QAAQ,EAAE;YAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAE9B,QAAQ,SAAS;gBACf,KAAK,OAAO,CAAC,KAAK;oBAChB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;gBAG1B,KAAK,OAAO,CAAC,IAAI;oBACf,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;;gBAG5B,KAAK,OAAO,CAAC,KAAK,CAAC;gBACnB,KAAK,OAAO,CAAC,YAAY;oBACvB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;;gBAG3B,KAAK,OAAO,CAAC,YAAY;;oBAEvB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;oBACxB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;oBACxB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;gBAG1B,KAAK,OAAO,CAAC,cAAc;;oBAEzB,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;aAC/B;YACD,IAAI,QAAQ,GAAG,SAAS;gBAAE,SAAS,GAAG,QAAQ,CAAC;SAChD;QAED,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE9B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;QACvC,QAAQ,SAAS;;;YAIf,KAAK,OAAO,CAAC,IAAI,CAAC;YAClB,KAAK,OAAO,CAAC,KAAK;gBAChB,OAAO,SAAS,CAAC;YAEnB,KAAK,OAAO,CAAC,YAAY,EAAE;;gBAEzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE/B,IAAI,CAAC,IAAI;oBAAE,OAAO,SAAS,IAAI,GAAG,CAAC;gBAEnC,IAAI,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;;;;oBAIlD,OAAO,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;iBAChC;gBAED,OAAO,IAAI,GAAG,SAAS,CAAC;aACzB;YAED,KAAK,OAAO,CAAC,YAAY;gBACvB,OAAO,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;YAE9B;gBACE,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;SACpF;IACH;;;;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts",
    "content": "/**\n * Attempts to resolve `input` URL/path relative to `base`.\n */\nexport default function resolve(input: string, base: string | undefined): string;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/resolve-uri/package.json",
    "content": "{\n  \"name\": \"@jridgewell/resolve-uri\",\n  \"version\": \"3.1.0\",\n  \"description\": \"Resolve a URI relative to an optional base URI\",\n  \"keywords\": [\n    \"resolve\",\n    \"uri\",\n    \"url\",\n    \"path\"\n  ],\n  \"author\": \"Justin Ridgewell <justin@ridgewell.name>\",\n  \"license\": \"MIT\",\n  \"repository\": \"https://github.com/jridgewell/resolve-uri\",\n  \"main\": \"dist/resolve-uri.umd.js\",\n  \"module\": \"dist/resolve-uri.mjs\",\n  \"typings\": \"dist/types/resolve-uri.d.ts\",\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./dist/types/resolve-uri.d.ts\",\n        \"browser\": \"./dist/resolve-uri.umd.js\",\n        \"require\": \"./dist/resolve-uri.umd.js\",\n        \"import\": \"./dist/resolve-uri.mjs\"\n      },\n      \"./dist/resolve-uri.umd.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"engines\": {\n    \"node\": \">=6.0.0\"\n  },\n  \"scripts\": {\n    \"prebuild\": \"rm -rf dist\",\n    \"build\": \"run-s -n build:*\",\n    \"build:rollup\": \"rollup -c rollup.config.js\",\n    \"build:ts\": \"tsc --project tsconfig.build.json\",\n    \"lint\": \"run-s -n lint:*\",\n    \"lint:prettier\": \"npm run test:lint:prettier -- --write\",\n    \"lint:ts\": \"npm run test:lint:ts -- --fix\",\n    \"pretest\": \"run-s build:rollup\",\n    \"test\": \"run-s -n test:lint test:only\",\n    \"test:debug\": \"mocha --inspect-brk\",\n    \"test:lint\": \"run-s -n test:lint:*\",\n    \"test:lint:prettier\": \"prettier --check '{src,test}/**/*.ts'\",\n    \"test:lint:ts\": \"eslint '{src,test}/**/*.ts'\",\n    \"test:only\": \"mocha\",\n    \"test:coverage\": \"c8 mocha\",\n    \"test:watch\": \"mocha --watch\",\n    \"prepublishOnly\": \"npm run preversion\",\n    \"preversion\": \"run-s test build\"\n  },\n  \"devDependencies\": {\n    \"@jridgewell/resolve-uri-latest\": \"npm:@jridgewell/resolve-uri@*\",\n    \"@rollup/plugin-typescript\": \"8.3.0\",\n    \"@typescript-eslint/eslint-plugin\": \"5.10.0\",\n    \"@typescript-eslint/parser\": \"5.10.0\",\n    \"c8\": \"7.11.0\",\n    \"eslint\": \"8.7.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"mocha\": \"9.2.0\",\n    \"npm-run-all\": \"4.1.5\",\n    \"prettier\": \"2.5.1\",\n    \"rollup\": \"2.66.0\",\n    \"typescript\": \"4.5.5\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/LICENSE",
    "content": "Copyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/README.md",
    "content": "# @jridgewell/set-array\n\n> Like a Set, but provides the index of the `key` in the backing array\n\nThis is designed to allow synchronizing a second array with the contents of the backing array, like\nhow in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`, and there\nare never duplicates.\n\n## Installation\n\n```sh\nnpm install @jridgewell/set-array\n```\n\n## Usage\n\n```js\nimport { SetArray, get, put, pop } from '@jridgewell/set-array';\n\nconst sa = new SetArray();\n\nlet index = put(sa, 'first');\nassert.strictEqual(index, 0);\n\nindex = put(sa, 'second');\nassert.strictEqual(index, 1);\n\nassert.deepEqual(sa.array, [ 'first', 'second' ]);\n\nindex = get(sa, 'first');\nassert.strictEqual(index, 0);\n\npop(sa);\nindex = get(sa, 'second');\nassert.strictEqual(index, undefined);\nassert.deepEqual(sa.array, [ 'first' ]);\n```\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/dist/set-array.mjs",
    "content": "/**\n * Gets the index associated with `key` in the backing array, if it is already present.\n */\nlet get;\n/**\n * Puts `key` into the backing array, if it is not already present. Returns\n * the index of the `key` in the backing array.\n */\nlet put;\n/**\n * Pops the last added item out of the SetArray.\n */\nlet pop;\n/**\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n * index of the `key` in the backing array.\n *\n * This is designed to allow synchronizing a second array with the contents of the backing array,\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n * and there are never duplicates.\n */\nclass SetArray {\n    constructor() {\n        this._indexes = { __proto__: null };\n        this.array = [];\n    }\n}\n(() => {\n    get = (strarr, key) => strarr._indexes[key];\n    put = (strarr, key) => {\n        // The key may or may not be present. If it is present, it's a number.\n        const index = get(strarr, key);\n        if (index !== undefined)\n            return index;\n        const { array, _indexes: indexes } = strarr;\n        return (indexes[key] = array.push(key) - 1);\n    };\n    pop = (strarr) => {\n        const { array, _indexes: indexes } = strarr;\n        if (array.length === 0)\n            return;\n        const last = array.pop();\n        indexes[last] = undefined;\n    };\n})();\n\nexport { SetArray, get, pop, put };\n//# sourceMappingURL=set-array.mjs.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/dist/set-array.mjs.map",
    "content": "{\"version\":3,\"file\":\"set-array.mjs\",\"sources\":[\"../src/set-array.ts\"],\"sourcesContent\":[\"/**\\n * Gets the index associated with `key` in the backing array, if it is already present.\\n */\\nexport let get: (strarr: SetArray, key: string) => number | undefined;\\n\\n/**\\n * Puts `key` into the backing array, if it is not already present. Returns\\n * the index of the `key` in the backing array.\\n */\\nexport let put: (strarr: SetArray, key: string) => number;\\n\\n/**\\n * Pops the last added item out of the SetArray.\\n */\\nexport let pop: (strarr: SetArray) => void;\\n\\n/**\\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\\n * index of the `key` in the backing array.\\n *\\n * This is designed to allow synchronizing a second array with the contents of the backing array,\\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\\n * and there are never duplicates.\\n */\\nexport class SetArray {\\n  private declare _indexes: { [key: string]: number | undefined };\\n  declare array: readonly string[];\\n\\n  constructor() {\\n    this._indexes = { __proto__: null } as any;\\n    this.array = [];\\n  }\\n\\n  static {\\n    get = (strarr, key) => strarr._indexes[key];\\n\\n    put = (strarr, key) => {\\n      // The key may or may not be present. If it is present, it's a number.\\n      const index = get(strarr, key);\\n      if (index !== undefined) return index;\\n\\n      const { array, _indexes: indexes } = strarr;\\n\\n      return (indexes[key] = (array as string[]).push(key) - 1);\\n    };\\n\\n    pop = (strarr) => {\\n      const { array, _indexes: indexes } = strarr;\\n      if (array.length === 0) return;\\n\\n      const last = (array as string[]).pop()!;\\n      indexes[last] = undefined;\\n    };\\n  }\\n}\\n\"],\"names\":[],\"mappings\":\"AAAA;;;IAGW,IAA2D;AAEtE;;;;IAIW,IAA+C;AAE1D;;;IAGW,IAAgC;AAE3C;;;;;;;;MAQa,QAAQ;IAInB;QACE,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,IAAI,EAAS,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;KACjB;CAuBF;AArBC;IACE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE5C,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG;;QAEhB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAE5C,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAI,KAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;KAC3D,CAAC;IAEF,GAAG,GAAG,CAAC,MAAM;QACX,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/B,MAAM,IAAI,GAAI,KAAkB,CAAC,GAAG,EAAG,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;KAC3B,CAAC;AACJ,CAAC,GAAA;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/dist/set-array.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.setArray = {}));\n})(this, (function (exports) { 'use strict';\n\n    /**\n     * Gets the index associated with `key` in the backing array, if it is already present.\n     */\n    exports.get = void 0;\n    /**\n     * Puts `key` into the backing array, if it is not already present. Returns\n     * the index of the `key` in the backing array.\n     */\n    exports.put = void 0;\n    /**\n     * Pops the last added item out of the SetArray.\n     */\n    exports.pop = void 0;\n    /**\n     * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n     * index of the `key` in the backing array.\n     *\n     * This is designed to allow synchronizing a second array with the contents of the backing array,\n     * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n     * and there are never duplicates.\n     */\n    class SetArray {\n        constructor() {\n            this._indexes = { __proto__: null };\n            this.array = [];\n        }\n    }\n    (() => {\n        exports.get = (strarr, key) => strarr._indexes[key];\n        exports.put = (strarr, key) => {\n            // The key may or may not be present. If it is present, it's a number.\n            const index = exports.get(strarr, key);\n            if (index !== undefined)\n                return index;\n            const { array, _indexes: indexes } = strarr;\n            return (indexes[key] = array.push(key) - 1);\n        };\n        exports.pop = (strarr) => {\n            const { array, _indexes: indexes } = strarr;\n            if (array.length === 0)\n                return;\n            const last = array.pop();\n            indexes[last] = undefined;\n        };\n    })();\n\n    exports.SetArray = SetArray;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=set-array.umd.js.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/dist/set-array.umd.js.map",
    "content": "{\"version\":3,\"file\":\"set-array.umd.js\",\"sources\":[\"../src/set-array.ts\"],\"sourcesContent\":[\"/**\\n * Gets the index associated with `key` in the backing array, if it is already present.\\n */\\nexport let get: (strarr: SetArray, key: string) => number | undefined;\\n\\n/**\\n * Puts `key` into the backing array, if it is not already present. Returns\\n * the index of the `key` in the backing array.\\n */\\nexport let put: (strarr: SetArray, key: string) => number;\\n\\n/**\\n * Pops the last added item out of the SetArray.\\n */\\nexport let pop: (strarr: SetArray) => void;\\n\\n/**\\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\\n * index of the `key` in the backing array.\\n *\\n * This is designed to allow synchronizing a second array with the contents of the backing array,\\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\\n * and there are never duplicates.\\n */\\nexport class SetArray {\\n  private declare _indexes: { [key: string]: number | undefined };\\n  declare array: readonly string[];\\n\\n  constructor() {\\n    this._indexes = { __proto__: null } as any;\\n    this.array = [];\\n  }\\n\\n  static {\\n    get = (strarr, key) => strarr._indexes[key];\\n\\n    put = (strarr, key) => {\\n      // The key may or may not be present. If it is present, it's a number.\\n      const index = get(strarr, key);\\n      if (index !== undefined) return index;\\n\\n      const { array, _indexes: indexes } = strarr;\\n\\n      return (indexes[key] = (array as string[]).push(key) - 1);\\n    };\\n\\n    pop = (strarr) => {\\n      const { array, _indexes: indexes } = strarr;\\n      if (array.length === 0) return;\\n\\n      const last = (array as string[]).pop()!;\\n      indexes[last] = undefined;\\n    };\\n  }\\n}\\n\"],\"names\":[\"get\",\"put\",\"pop\"],\"mappings\":\";;;;;;IAAA;;;AAGWA,yBAA2D;IAEtE;;;;AAIWC,yBAA+C;IAE1D;;;AAGWC,yBAAgC;IAE3C;;;;;;;;UAQa,QAAQ;QAInB;YACE,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,IAAI,EAAS,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SACjB;KAuBF;IArBC;QACEF,WAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE5CC,WAAG,GAAG,CAAC,MAAM,EAAE,GAAG;;YAEhB,MAAM,KAAK,GAAGD,WAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEtC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAE5C,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAI,KAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;SAC3D,CAAC;QAEFE,WAAG,GAAG,CAAC,MAAM;YACX,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAE/B,MAAM,IAAI,GAAI,KAAkB,CAAC,GAAG,EAAG,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;SAC3B,CAAC;IACJ,CAAC,GAAA;;;;;;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/dist/types/set-array.d.ts",
    "content": "/**\n * Gets the index associated with `key` in the backing array, if it is already present.\n */\nexport declare let get: (strarr: SetArray, key: string) => number | undefined;\n/**\n * Puts `key` into the backing array, if it is not already present. Returns\n * the index of the `key` in the backing array.\n */\nexport declare let put: (strarr: SetArray, key: string) => number;\n/**\n * Pops the last added item out of the SetArray.\n */\nexport declare let pop: (strarr: SetArray) => void;\n/**\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n * index of the `key` in the backing array.\n *\n * This is designed to allow synchronizing a second array with the contents of the backing array,\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n * and there are never duplicates.\n */\nexport declare class SetArray {\n    private _indexes;\n    array: readonly string[];\n    constructor();\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/package.json",
    "content": "{\n  \"name\": \"@jridgewell/set-array\",\n  \"version\": \"1.1.2\",\n  \"description\": \"Like a Set, but provides the index of the `key` in the backing array\",\n  \"keywords\": [],\n  \"author\": \"Justin Ridgewell <justin@ridgewell.name>\",\n  \"license\": \"MIT\",\n  \"repository\": \"https://github.com/jridgewell/set-array\",\n  \"main\": \"dist/set-array.umd.js\",\n  \"module\": \"dist/set-array.mjs\",\n  \"typings\": \"dist/types/set-array.d.ts\",\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./dist/types/set-array.d.ts\",\n        \"browser\": \"./dist/set-array.umd.js\",\n        \"require\": \"./dist/set-array.umd.js\",\n        \"import\": \"./dist/set-array.mjs\"\n      },\n      \"./dist/set-array.umd.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\",\n    \"src\"\n  ],\n  \"engines\": {\n    \"node\": \">=6.0.0\"\n  },\n  \"scripts\": {\n    \"prebuild\": \"rm -rf dist\",\n    \"build\": \"run-s -n build:*\",\n    \"build:rollup\": \"rollup -c rollup.config.js\",\n    \"build:ts\": \"tsc --project tsconfig.build.json\",\n    \"lint\": \"run-s -n lint:*\",\n    \"lint:prettier\": \"npm run test:lint:prettier -- --write\",\n    \"lint:ts\": \"npm run test:lint:ts -- --fix\",\n    \"pretest\": \"run-s build:rollup\",\n    \"test\": \"run-s -n test:lint test:only\",\n    \"test:debug\": \"mocha --inspect-brk\",\n    \"test:lint\": \"run-s -n test:lint:*\",\n    \"test:lint:prettier\": \"prettier --check '{src,test}/**/*.ts'\",\n    \"test:lint:ts\": \"eslint '{src,test}/**/*.ts'\",\n    \"test:only\": \"mocha\",\n    \"test:coverage\": \"c8 mocha\",\n    \"test:watch\": \"mocha --watch\",\n    \"prepublishOnly\": \"npm run preversion\",\n    \"preversion\": \"run-s test build\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-typescript\": \"8.3.0\",\n    \"@types/mocha\": \"9.1.1\",\n    \"@types/node\": \"17.0.29\",\n    \"@typescript-eslint/eslint-plugin\": \"5.10.0\",\n    \"@typescript-eslint/parser\": \"5.10.0\",\n    \"c8\": \"7.11.0\",\n    \"eslint\": \"8.7.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"mocha\": \"9.2.0\",\n    \"npm-run-all\": \"4.1.5\",\n    \"prettier\": \"2.5.1\",\n    \"rollup\": \"2.66.0\",\n    \"typescript\": \"4.5.5\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/set-array/src/set-array.ts",
    "content": "/**\n * Gets the index associated with `key` in the backing array, if it is already present.\n */\nexport let get: (strarr: SetArray, key: string) => number | undefined;\n\n/**\n * Puts `key` into the backing array, if it is not already present. Returns\n * the index of the `key` in the backing array.\n */\nexport let put: (strarr: SetArray, key: string) => number;\n\n/**\n * Pops the last added item out of the SetArray.\n */\nexport let pop: (strarr: SetArray) => void;\n\n/**\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n * index of the `key` in the backing array.\n *\n * This is designed to allow synchronizing a second array with the contents of the backing array,\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n * and there are never duplicates.\n */\nexport class SetArray {\n  private declare _indexes: { [key: string]: number | undefined };\n  declare array: readonly string[];\n\n  constructor() {\n    this._indexes = { __proto__: null } as any;\n    this.array = [];\n  }\n\n  static {\n    get = (strarr, key) => strarr._indexes[key];\n\n    put = (strarr, key) => {\n      // The key may or may not be present. If it is present, it's a number.\n      const index = get(strarr, key);\n      if (index !== undefined) return index;\n\n      const { array, _indexes: indexes } = strarr;\n\n      return (indexes[key] = (array as string[]).push(key) - 1);\n    };\n\n    pop = (strarr) => {\n      const { array, _indexes: indexes } = strarr;\n      if (array.length === 0) return;\n\n      const last = (array as string[]).pop()!;\n      indexes[last] = undefined;\n    };\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/LICENSE",
    "content": "Copyright 2019 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/README.md",
    "content": "# @jridgewell/source-map\n\n> Packages `@jridgewell/trace-mapping` and `@jridgewell/gen-mapping` into the familiar source-map API\n\nThis isn't the full API, but it's the core functionality. This wraps\n[@jridgewell/trace-mapping][trace-mapping] and [@jridgewell/gen-mapping][gen-mapping]\nimplementations.\n\n## Installation\n\n```sh\nnpm install @jridgewell/source-map\n```\n\n## Usage\n\nTODO\n\n### SourceMapConsumer\n\n```typescript\nimport { SourceMapConsumer } from '@jridgewell/source-map';\nconst smc = new SourceMapConsumer({\n  version: 3,\n  names: ['foo'],\n  sources: ['input.js'],\n  mappings: 'AAAAA',\n});\n```\n\n#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)\n\n```typescript\nconst smc = new SourceMapConsumer(map);\nsmc.originalPositionFor({ line: 1, column: 0 });\n```\n\n### SourceMapGenerator\n\n```typescript\nimport { SourceMapGenerator } from '@jridgewell/source-map';\nconst smg = new SourceMapGenerator({\n  file: 'output.js',\n  sourceRoot: 'https://example.com/',\n});\n```\n\n#### SourceMapGenerator.prototype.addMapping(mapping)\n\n```typescript\nconst smg = new SourceMapGenerator();\nsmg.addMapping({\n  generated: { line: 1, column: 0 },\n  source: 'input.js',\n  original: { line: 1, column: 0 },\n  name: 'foo',\n});\n```\n\n#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)\n\n```typescript\nconst smg = new SourceMapGenerator();\nsmg.setSourceContent('input.js', 'foobar');\n```\n\n#### SourceMapGenerator.prototype.toJSON()\n\n```typescript\nconst smg = new SourceMapGenerator();\nsmg.toJSON(); // { version: 3, names: [], sources: [], mappings: '' }\n```\n\n#### SourceMapGenerator.prototype.toDecodedMap()\n\n```typescript\nconst smg = new SourceMapGenerator();\nsmg.toDecodedMap(); // { version: 3, names: [], sources: [], mappings: [] }\n```\n\n[trace-mapping]: https://github.com/jridgewell/trace-mapping/\n[gen-mapping]: https://github.com/jridgewell/gen-mapping/\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/dist/source-map.mjs",
    "content": "const comma = ','.charCodeAt(0);\nconst semicolon = ';'.charCodeAt(0);\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst intToChar = new Uint8Array(64); // 64 possible chars.\nconst charToInteger = new Uint8Array(128); // z is 122 in ASCII\nfor (let i = 0; i < chars.length; i++) {\n    const c = chars.charCodeAt(i);\n    charToInteger[c] = i;\n    intToChar[i] = c;\n}\n// Provide a fallback for older environments.\nconst td = typeof TextDecoder !== 'undefined'\n    ? new TextDecoder()\n    : typeof Buffer !== 'undefined'\n        ? {\n            decode(buf) {\n                const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n                return out.toString();\n            },\n        }\n        : {\n            decode(buf) {\n                let out = '';\n                for (let i = 0; i < buf.length; i++) {\n                    out += String.fromCharCode(buf[i]);\n                }\n                return out;\n            },\n        };\nfunction decode(mappings) {\n    const state = new Int32Array(5);\n    const decoded = [];\n    let line = [];\n    let sorted = true;\n    let lastCol = 0;\n    for (let i = 0; i < mappings.length;) {\n        const c = mappings.charCodeAt(i);\n        if (c === comma) {\n            i++;\n        }\n        else if (c === semicolon) {\n            state[0] = lastCol = 0;\n            if (!sorted)\n                sort(line);\n            sorted = true;\n            decoded.push(line);\n            line = [];\n            i++;\n        }\n        else {\n            i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn\n            const col = state[0];\n            if (col < lastCol)\n                sorted = false;\n            lastCol = col;\n            if (!hasMoreSegments(mappings, i)) {\n                line.push([col]);\n                continue;\n            }\n            i = decodeInteger(mappings, i, state, 1); // sourceFileIndex\n            i = decodeInteger(mappings, i, state, 2); // sourceCodeLine\n            i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn\n            if (!hasMoreSegments(mappings, i)) {\n                line.push([col, state[1], state[2], state[3]]);\n                continue;\n            }\n            i = decodeInteger(mappings, i, state, 4); // nameIndex\n            line.push([col, state[1], state[2], state[3], state[4]]);\n        }\n    }\n    if (!sorted)\n        sort(line);\n    decoded.push(line);\n    return decoded;\n}\nfunction decodeInteger(mappings, pos, state, j) {\n    let value = 0;\n    let shift = 0;\n    let integer = 0;\n    do {\n        const c = mappings.charCodeAt(pos++);\n        integer = charToInteger[c];\n        value |= (integer & 31) << shift;\n        shift += 5;\n    } while (integer & 32);\n    const shouldNegate = value & 1;\n    value >>>= 1;\n    if (shouldNegate) {\n        value = -0x80000000 | -value;\n    }\n    state[j] += value;\n    return pos;\n}\nfunction hasMoreSegments(mappings, i) {\n    if (i >= mappings.length)\n        return false;\n    const c = mappings.charCodeAt(i);\n    if (c === comma || c === semicolon)\n        return false;\n    return true;\n}\nfunction sort(line) {\n    line.sort(sortComparator$1);\n}\nfunction sortComparator$1(a, b) {\n    return a[0] - b[0];\n}\nfunction encode(decoded) {\n    const state = new Int32Array(5);\n    let buf = new Uint8Array(1024);\n    let pos = 0;\n    for (let i = 0; i < decoded.length; i++) {\n        const line = decoded[i];\n        if (i > 0) {\n            buf = reserve(buf, pos, 1);\n            buf[pos++] = semicolon;\n        }\n        if (line.length === 0)\n            continue;\n        state[0] = 0;\n        for (let j = 0; j < line.length; j++) {\n            const segment = line[j];\n            // We can push up to 5 ints, each int can take at most 7 chars, and we\n            // may push a comma.\n            buf = reserve(buf, pos, 36);\n            if (j > 0)\n                buf[pos++] = comma;\n            pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn\n            if (segment.length === 1)\n                continue;\n            pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex\n            pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine\n            pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn\n            if (segment.length === 4)\n                continue;\n            pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex\n        }\n    }\n    return td.decode(buf.subarray(0, pos));\n}\nfunction reserve(buf, pos, count) {\n    if (buf.length > pos + count)\n        return buf;\n    const swap = new Uint8Array(buf.length * 2);\n    swap.set(buf);\n    return swap;\n}\nfunction encodeInteger(buf, pos, state, segment, j) {\n    const next = segment[j];\n    let num = next - state[j];\n    state[j] = next;\n    num = num < 0 ? (-num << 1) | 1 : num << 1;\n    do {\n        let clamped = num & 0b011111;\n        num >>>= 5;\n        if (num > 0)\n            clamped |= 0b100000;\n        buf[pos++] = intToChar[clamped];\n    } while (num > 0);\n    return pos;\n}\n\n// Matches the scheme of a URL, eg \"http://\"\nconst schemeRegex = /^[\\w+.-]+:\\/\\//;\n/**\n * Matches the parts of a URL:\n * 1. Scheme, including \":\", guaranteed.\n * 2. User/password, including \"@\", optional.\n * 3. Host, guaranteed.\n * 4. Port, including \":\", optional.\n * 5. Path, including \"/\", optional.\n */\nconst urlRegex = /^([\\w+.-]+:)\\/\\/([^@/#?]*@)?([^:/#?]*)(:\\d+)?(\\/[^#?]*)?/;\n/**\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\n *\n * 1. Host, optional.\n * 2. Path, which may inclue \"/\", guaranteed.\n */\nconst fileRegex = /^file:(?:\\/\\/((?![a-z]:)[^/]*)?)?(\\/?.*)/i;\nfunction isAbsoluteUrl(input) {\n    return schemeRegex.test(input);\n}\nfunction isSchemeRelativeUrl(input) {\n    return input.startsWith('//');\n}\nfunction isAbsolutePath(input) {\n    return input.startsWith('/');\n}\nfunction isFileUrl(input) {\n    return input.startsWith('file:');\n}\nfunction parseAbsoluteUrl(input) {\n    const match = urlRegex.exec(input);\n    return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');\n}\nfunction parseFileUrl(input) {\n    const match = fileRegex.exec(input);\n    const path = match[2];\n    return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);\n}\nfunction makeUrl(scheme, user, host, port, path) {\n    return {\n        scheme,\n        user,\n        host,\n        port,\n        path,\n        relativePath: false,\n    };\n}\nfunction parseUrl(input) {\n    if (isSchemeRelativeUrl(input)) {\n        const url = parseAbsoluteUrl('http:' + input);\n        url.scheme = '';\n        return url;\n    }\n    if (isAbsolutePath(input)) {\n        const url = parseAbsoluteUrl('http://foo.com' + input);\n        url.scheme = '';\n        url.host = '';\n        return url;\n    }\n    if (isFileUrl(input))\n        return parseFileUrl(input);\n    if (isAbsoluteUrl(input))\n        return parseAbsoluteUrl(input);\n    const url = parseAbsoluteUrl('http://foo.com/' + input);\n    url.scheme = '';\n    url.host = '';\n    url.relativePath = true;\n    return url;\n}\nfunction stripPathFilename(path) {\n    // If a path ends with a parent directory \"..\", then it's a relative path with excess parent\n    // paths. It's not a file, so we can't strip it.\n    if (path.endsWith('/..'))\n        return path;\n    const index = path.lastIndexOf('/');\n    return path.slice(0, index + 1);\n}\nfunction mergePaths(url, base) {\n    // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.\n    if (!url.relativePath)\n        return;\n    normalizePath(base);\n    // If the path is just a \"/\", then it was an empty path to begin with (remember, we're a relative\n    // path).\n    if (url.path === '/') {\n        url.path = base.path;\n    }\n    else {\n        // Resolution happens relative to the base path's directory, not the file.\n        url.path = stripPathFilename(base.path) + url.path;\n    }\n    // If the base path is absolute, then our path is now absolute too.\n    url.relativePath = base.relativePath;\n}\n/**\n * The path can have empty directories \"//\", unneeded parents \"foo/..\", or current directory\n * \"foo/.\". We need to normalize to a standard representation.\n */\nfunction normalizePath(url) {\n    const { relativePath } = url;\n    const pieces = url.path.split('/');\n    // We need to preserve the first piece always, so that we output a leading slash. The item at\n    // pieces[0] is an empty string.\n    let pointer = 1;\n    // Positive is the number of real directories we've output, used for popping a parent directory.\n    // Eg, \"foo/bar/..\" will have a positive 2, and we can decrement to be left with just \"foo\".\n    let positive = 0;\n    // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \"foo/\" will\n    // generate `[\"foo\", \"\"]` pieces). And, if we pop a parent directory. But once we encounter a\n    // real directory, we won't need to append, unless the other conditions happen again.\n    let addTrailingSlash = false;\n    for (let i = 1; i < pieces.length; i++) {\n        const piece = pieces[i];\n        // An empty directory, could be a trailing slash, or just a double \"//\" in the path.\n        if (!piece) {\n            addTrailingSlash = true;\n            continue;\n        }\n        // If we encounter a real directory, then we don't need to append anymore.\n        addTrailingSlash = false;\n        // A current directory, which we can always drop.\n        if (piece === '.')\n            continue;\n        // A parent directory, we need to see if there are any real directories we can pop. Else, we\n        // have an excess of parents, and we'll need to keep the \"..\".\n        if (piece === '..') {\n            if (positive) {\n                addTrailingSlash = true;\n                positive--;\n                pointer--;\n            }\n            else if (relativePath) {\n                // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\n                // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\n                pieces[pointer++] = piece;\n            }\n            continue;\n        }\n        // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\n        // any popped or dropped directories.\n        pieces[pointer++] = piece;\n        positive++;\n    }\n    let path = '';\n    for (let i = 1; i < pointer; i++) {\n        path += '/' + pieces[i];\n    }\n    if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\n        path += '/';\n    }\n    url.path = path;\n}\n/**\n * Attempts to resolve `input` URL/path relative to `base`.\n */\nfunction resolve$1(input, base) {\n    if (!input && !base)\n        return '';\n    const url = parseUrl(input);\n    // If we have a base, and the input isn't already an absolute URL, then we need to merge.\n    if (base && !url.scheme) {\n        const baseUrl = parseUrl(base);\n        url.scheme = baseUrl.scheme;\n        // If there's no host, then we were just a path.\n        if (!url.host) {\n            // The host, user, and port are joined, you can't copy one without the others.\n            url.user = baseUrl.user;\n            url.host = baseUrl.host;\n            url.port = baseUrl.port;\n        }\n        mergePaths(url, baseUrl);\n    }\n    normalizePath(url);\n    // If the input (and base, if there was one) are both relative, then we need to output a relative.\n    if (url.relativePath) {\n        // The first char is always a \"/\".\n        const path = url.path.slice(1);\n        if (!path)\n            return '.';\n        // If base started with a leading \".\", or there is no base and input started with a \".\", then we\n        // need to ensure that the relative path starts with a \".\". We don't know if relative starts\n        // with a \"..\", though, so check before prepending.\n        const keepRelative = (base || input).startsWith('.');\n        return !keepRelative || path.startsWith('.') ? path : './' + path;\n    }\n    // If there's no host (and no scheme/user/port), then we need to output an absolute path.\n    if (!url.scheme && !url.host)\n        return url.path;\n    // We're outputting either an absolute URL, or a protocol relative one.\n    return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;\n}\n\nfunction resolve(input, base) {\n    // The base is always treated as a directory, if it's not empty.\n    // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\n    // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\n    if (base && !base.endsWith('/'))\n        base += '/';\n    return resolve$1(input, base);\n}\n\n/**\n * Removes everything after the last \"/\", but leaves the slash.\n */\nfunction stripFilename(path) {\n    if (!path)\n        return '';\n    const index = path.lastIndexOf('/');\n    return path.slice(0, index + 1);\n}\n\nconst COLUMN$1 = 0;\nconst SOURCES_INDEX$1 = 1;\nconst SOURCE_LINE$1 = 2;\nconst SOURCE_COLUMN$1 = 3;\nconst NAMES_INDEX$1 = 4;\n\nfunction maybeSort(mappings, owned) {\n    const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\n    if (unsortedIndex === mappings.length)\n        return mappings;\n    // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\n    // not, we do not want to modify the consumer's input array.\n    if (!owned)\n        mappings = mappings.slice();\n    for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\n        mappings[i] = sortSegments(mappings[i], owned);\n    }\n    return mappings;\n}\nfunction nextUnsortedSegmentLine(mappings, start) {\n    for (let i = start; i < mappings.length; i++) {\n        if (!isSorted(mappings[i]))\n            return i;\n    }\n    return mappings.length;\n}\nfunction isSorted(line) {\n    for (let j = 1; j < line.length; j++) {\n        if (line[j][COLUMN$1] < line[j - 1][COLUMN$1]) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction sortSegments(line, owned) {\n    if (!owned)\n        line = line.slice();\n    return line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n    return a[COLUMN$1] - b[COLUMN$1];\n}\n\nlet found = false;\n/**\n * A binary search implementation that returns the index if a match is found.\n * If no match is found, then the left-index (the index associated with the item that comes just\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\n * the next index:\n *\n * ```js\n * const array = [1, 3];\n * const needle = 2;\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\n *\n * assert.equal(index, 0);\n * array.splice(index + 1, 0, needle);\n * assert.deepEqual(array, [1, 2, 3]);\n * ```\n */\nfunction binarySearch(haystack, needle, low, high) {\n    while (low <= high) {\n        const mid = low + ((high - low) >> 1);\n        const cmp = haystack[mid][COLUMN$1] - needle;\n        if (cmp === 0) {\n            found = true;\n            return mid;\n        }\n        if (cmp < 0) {\n            low = mid + 1;\n        }\n        else {\n            high = mid - 1;\n        }\n    }\n    found = false;\n    return low - 1;\n}\nfunction upperBound(haystack, needle, index) {\n    for (let i = index + 1; i < haystack.length; i++, index++) {\n        if (haystack[i][COLUMN$1] !== needle)\n            break;\n    }\n    return index;\n}\nfunction lowerBound(haystack, needle, index) {\n    for (let i = index - 1; i >= 0; i--, index--) {\n        if (haystack[i][COLUMN$1] !== needle)\n            break;\n    }\n    return index;\n}\nfunction memoizedState() {\n    return {\n        lastKey: -1,\n        lastNeedle: -1,\n        lastIndex: -1,\n    };\n}\n/**\n * This overly complicated beast is just to record the last tested line/column and the resulting\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\n */\nfunction memoizedBinarySearch(haystack, needle, state, key) {\n    const { lastKey, lastNeedle, lastIndex } = state;\n    let low = 0;\n    let high = haystack.length - 1;\n    if (key === lastKey) {\n        if (needle === lastNeedle) {\n            found = lastIndex !== -1 && haystack[lastIndex][COLUMN$1] === needle;\n            return lastIndex;\n        }\n        if (needle >= lastNeedle) {\n            // lastIndex may be -1 if the previous needle was not found.\n            low = lastIndex === -1 ? 0 : lastIndex;\n        }\n        else {\n            high = lastIndex;\n        }\n    }\n    state.lastKey = key;\n    state.lastNeedle = needle;\n    return (state.lastIndex = binarySearch(haystack, needle, low, high));\n}\n\nconst AnyMap = function (map, mapUrl) {\n    const parsed = typeof map === 'string' ? JSON.parse(map) : map;\n    if (!('sections' in parsed))\n        return new TraceMap(parsed, mapUrl);\n    const mappings = [];\n    const sources = [];\n    const sourcesContent = [];\n    const names = [];\n    const { sections } = parsed;\n    let i = 0;\n    for (; i < sections.length - 1; i++) {\n        const no = sections[i + 1].offset;\n        addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);\n    }\n    if (sections.length > 0) {\n        addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);\n    }\n    const joined = {\n        version: 3,\n        file: parsed.file,\n        names,\n        sources,\n        sourcesContent,\n        mappings,\n    };\n    return presortedDecodedMap(joined);\n};\nfunction addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {\n    const map = AnyMap(section.map, mapUrl);\n    const { line: lineOffset, column: columnOffset } = section.offset;\n    const sourcesOffset = sources.length;\n    const namesOffset = names.length;\n    const decoded = decodedMappings(map);\n    const { resolvedSources } = map;\n    append(sources, resolvedSources);\n    append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));\n    append(names, map.names);\n    // If this section jumps forwards several lines, we need to add lines to the output mappings catch up.\n    for (let i = mappings.length; i <= lineOffset; i++)\n        mappings.push([]);\n    // We can only add so many lines before we step into the range that the next section's map\n    // controls. When we get to the last line, then we'll start checking the segments to see if\n    // they've crossed into the column range.\n    const stopI = stopLine - lineOffset;\n    const len = Math.min(decoded.length, stopI + 1);\n    for (let i = 0; i < len; i++) {\n        const line = decoded[i];\n        // On the 0th loop, the line will already exist due to a previous section, or the line catch up\n        // loop above.\n        const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);\n        // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\n        // map can be multiple lines), it doesn't.\n        const cOffset = i === 0 ? columnOffset : 0;\n        for (let j = 0; j < line.length; j++) {\n            const seg = line[j];\n            const column = cOffset + seg[COLUMN$1];\n            // If this segment steps into the column range that the next section's map controls, we need\n            // to stop early.\n            if (i === stopI && column >= stopColumn)\n                break;\n            if (seg.length === 1) {\n                out.push([column]);\n                continue;\n            }\n            const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX$1];\n            const sourceLine = seg[SOURCE_LINE$1];\n            const sourceColumn = seg[SOURCE_COLUMN$1];\n            if (seg.length === 4) {\n                out.push([column, sourcesIndex, sourceLine, sourceColumn]);\n                continue;\n            }\n            out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX$1]]);\n        }\n    }\n}\nfunction append(arr, other) {\n    for (let i = 0; i < other.length; i++)\n        arr.push(other[i]);\n}\n// Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of\n// equal length to the sources. This is because the sources and sourcesContent are paired arrays,\n// where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined\n// sourcemap would desynchronize the sources/contents.\nfunction fillSourcesContent(len) {\n    const sourcesContent = [];\n    for (let i = 0; i < len; i++)\n        sourcesContent[i] = null;\n    return sourcesContent;\n}\n\nconst INVALID_ORIGINAL_MAPPING = Object.freeze({\n    source: null,\n    line: null,\n    column: null,\n    name: null,\n});\nObject.freeze({\n    line: null,\n    column: null,\n});\nconst LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\nconst COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\nconst LEAST_UPPER_BOUND = -1;\nconst GREATEST_LOWER_BOUND = 1;\n/**\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\n */\nlet decodedMappings;\n/**\n * A higher-level API to find the source/line/column associated with a generated line/column\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\n * `source-map` library.\n */\nlet originalPositionFor;\n/**\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\n * maps.\n */\nlet presortedDecodedMap;\nclass TraceMap {\n    constructor(map, mapUrl) {\n        this._decodedMemo = memoizedState();\n        this._bySources = undefined;\n        this._bySourceMemos = undefined;\n        const isString = typeof map === 'string';\n        if (!isString && map.constructor === TraceMap)\n            return map;\n        const parsed = (isString ? JSON.parse(map) : map);\n        const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\n        this.version = version;\n        this.file = file;\n        this.names = names;\n        this.sourceRoot = sourceRoot;\n        this.sources = sources;\n        this.sourcesContent = sourcesContent;\n        if (sourceRoot || mapUrl) {\n            const from = resolve(sourceRoot || '', stripFilename(mapUrl));\n            this.resolvedSources = sources.map((s) => resolve(s || '', from));\n        }\n        else {\n            this.resolvedSources = sources.map((s) => s || '');\n        }\n        const { mappings } = parsed;\n        if (typeof mappings === 'string') {\n            this._encoded = mappings;\n            this._decoded = undefined;\n        }\n        else {\n            this._encoded = undefined;\n            this._decoded = maybeSort(mappings, isString);\n        }\n    }\n}\n(() => {\n    decodedMappings = (map) => {\n        return (map._decoded || (map._decoded = decode(map._encoded)));\n    };\n    originalPositionFor = (map, { line, column, bias }) => {\n        line--;\n        if (line < 0)\n            throw new Error(LINE_GTR_ZERO);\n        if (column < 0)\n            throw new Error(COL_GTR_EQ_ZERO);\n        const decoded = decodedMappings(map);\n        // It's common for parent source maps to have pointers to lines that have no\n        // mapping (like a \"//# sourceMappingURL=\") at the end of the child file.\n        if (line >= decoded.length)\n            return INVALID_ORIGINAL_MAPPING;\n        const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);\n        if (segment == null)\n            return INVALID_ORIGINAL_MAPPING;\n        if (segment.length == 1)\n            return INVALID_ORIGINAL_MAPPING;\n        const { names, resolvedSources } = map;\n        return {\n            source: resolvedSources[segment[SOURCES_INDEX$1]],\n            line: segment[SOURCE_LINE$1] + 1,\n            column: segment[SOURCE_COLUMN$1],\n            name: segment.length === 5 ? names[segment[NAMES_INDEX$1]] : null,\n        };\n    };\n    presortedDecodedMap = (map, mapUrl) => {\n        const clone = Object.assign({}, map);\n        clone.mappings = [];\n        const tracer = new TraceMap(clone, mapUrl);\n        tracer._decoded = map.mappings;\n        return tracer;\n    };\n})();\nfunction traceSegmentInternal(segments, memo, line, column, bias) {\n    let index = memoizedBinarySearch(segments, column, memo, line);\n    if (found) {\n        index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\n    }\n    else if (bias === LEAST_UPPER_BOUND)\n        index++;\n    if (index === -1 || index === segments.length)\n        return null;\n    return segments[index];\n}\n\n/**\n * Gets the index associated with `key` in the backing array, if it is already present.\n */\nlet get;\n/**\n * Puts `key` into the backing array, if it is not already present. Returns\n * the index of the `key` in the backing array.\n */\nlet put;\n/**\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n * index of the `key` in the backing array.\n *\n * This is designed to allow synchronizing a second array with the contents of the backing array,\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n * and there are never duplicates.\n */\nclass SetArray {\n    constructor() {\n        this._indexes = { __proto__: null };\n        this.array = [];\n    }\n}\n(() => {\n    get = (strarr, key) => strarr._indexes[key];\n    put = (strarr, key) => {\n        // The key may or may not be present. If it is present, it's a number.\n        const index = get(strarr, key);\n        if (index !== undefined)\n            return index;\n        const { array, _indexes: indexes } = strarr;\n        return (indexes[key] = array.push(key) - 1);\n    };\n})();\n\nconst COLUMN = 0;\nconst SOURCES_INDEX = 1;\nconst SOURCE_LINE = 2;\nconst SOURCE_COLUMN = 3;\nconst NAMES_INDEX = 4;\n\nconst NO_NAME = -1;\n/**\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\n * not add a mapping with a lower generated line/column than one that came before.\n */\nlet maybeAddMapping;\n/**\n * Adds/removes the content of the source file to the source map.\n */\nlet setSourceContent;\n/**\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nlet toDecodedMap;\n/**\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nlet toEncodedMap;\n// This split declaration is only so that terser can elminiate the static initialization block.\nlet addSegmentInternal;\n/**\n * Provides the state to generate a sourcemap.\n */\nclass GenMapping {\n    constructor({ file, sourceRoot } = {}) {\n        this._names = new SetArray();\n        this._sources = new SetArray();\n        this._sourcesContent = [];\n        this._mappings = [];\n        this.file = file;\n        this.sourceRoot = sourceRoot;\n    }\n}\n(() => {\n    maybeAddMapping = (map, mapping) => {\n        return addMappingInternal(true, map, mapping);\n    };\n    setSourceContent = (map, source, content) => {\n        const { _sources: sources, _sourcesContent: sourcesContent } = map;\n        sourcesContent[put(sources, source)] = content;\n    };\n    toDecodedMap = (map) => {\n        const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n        removeEmptyFinalLines(mappings);\n        return {\n            version: 3,\n            file: file || undefined,\n            names: names.array,\n            sourceRoot: sourceRoot || undefined,\n            sources: sources.array,\n            sourcesContent,\n            mappings,\n        };\n    };\n    toEncodedMap = (map) => {\n        const decoded = toDecodedMap(map);\n        return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });\n    };\n    // Internal helpers\n    addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\n        const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n        const line = getLine(mappings, genLine);\n        const index = getColumnIndex(line, genColumn);\n        if (!source) {\n            if (skipable && skipSourceless(line, index))\n                return;\n            return insert(line, index, [genColumn]);\n        }\n        const sourcesIndex = put(sources, source);\n        const namesIndex = name ? put(names, name) : NO_NAME;\n        if (sourcesIndex === sourcesContent.length)\n            sourcesContent[sourcesIndex] = null;\n        if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\n            return;\n        }\n        return insert(line, index, name\n            ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\n            : [genColumn, sourcesIndex, sourceLine, sourceColumn]);\n    };\n})();\nfunction getLine(mappings, index) {\n    for (let i = mappings.length; i <= index; i++) {\n        mappings[i] = [];\n    }\n    return mappings[index];\n}\nfunction getColumnIndex(line, genColumn) {\n    let index = line.length;\n    for (let i = index - 1; i >= 0; index = i--) {\n        const current = line[i];\n        if (genColumn >= current[COLUMN])\n            break;\n    }\n    return index;\n}\nfunction insert(array, index, value) {\n    for (let i = array.length; i > index; i--) {\n        array[i] = array[i - 1];\n    }\n    array[index] = value;\n}\nfunction removeEmptyFinalLines(mappings) {\n    const { length } = mappings;\n    let len = length;\n    for (let i = len - 1; i >= 0; len = i, i--) {\n        if (mappings[i].length > 0)\n            break;\n    }\n    if (len < length)\n        mappings.length = len;\n}\nfunction skipSourceless(line, index) {\n    // The start of a line is already sourceless, so adding a sourceless segment to the beginning\n    // doesn't generate any useful information.\n    if (index === 0)\n        return true;\n    const prev = line[index - 1];\n    // If the previous segment is also sourceless, then adding another sourceless segment doesn't\n    // genrate any new information. Else, this segment will end the source/named segment and point to\n    // a sourceless position, which is useful.\n    return prev.length === 1;\n}\nfunction skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {\n    // A source/named segment at the start of a line gives position at that genColumn\n    if (index === 0)\n        return false;\n    const prev = line[index - 1];\n    // If the previous segment is sourceless, then we're transitioning to a source.\n    if (prev.length === 1)\n        return false;\n    // If the previous segment maps to the exact same source position, then this segment doesn't\n    // provide any new position information.\n    return (sourcesIndex === prev[SOURCES_INDEX] &&\n        sourceLine === prev[SOURCE_LINE] &&\n        sourceColumn === prev[SOURCE_COLUMN] &&\n        namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));\n}\nfunction addMappingInternal(skipable, map, mapping) {\n    const { generated, source, original, name } = mapping;\n    if (!source) {\n        return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);\n    }\n    const s = source;\n    return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);\n}\n\nclass SourceMapConsumer {\n    constructor(map, mapUrl) {\n        const trace = (this._map = new AnyMap(map, mapUrl));\n        this.file = trace.file;\n        this.names = trace.names;\n        this.sourceRoot = trace.sourceRoot;\n        this.sources = trace.resolvedSources;\n        this.sourcesContent = trace.sourcesContent;\n    }\n    originalPositionFor(needle) {\n        return originalPositionFor(this._map, needle);\n    }\n    destroy() {\n        // noop.\n    }\n}\nclass SourceMapGenerator {\n    constructor(opts) {\n        this._map = new GenMapping(opts);\n    }\n    addMapping(mapping) {\n        maybeAddMapping(this._map, mapping);\n    }\n    setSourceContent(source, content) {\n        setSourceContent(this._map, source, content);\n    }\n    toJSON() {\n        return toEncodedMap(this._map);\n    }\n    toDecodedMap() {\n        return toDecodedMap(this._map);\n    }\n}\n\nexport { SourceMapConsumer, SourceMapGenerator };\n//# sourceMappingURL=source-map.mjs.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/dist/source-map.mjs.map",
    "content": "{\"version\":3,\"file\":\"source-map.mjs\",\"sources\":[\"../node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs\",\"../node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs\",\"../node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs\",\"../node_modules/@jridgewell/set-array/dist/set-array.mjs\",\"../node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs\",\"../../src/source-map.ts\"],\"sourcesContent\":[\"const comma = ','.charCodeAt(0);\\nconst semicolon = ';'.charCodeAt(0);\\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\\nconst intToChar = new Uint8Array(64); // 64 possible chars.\\nconst charToInteger = new Uint8Array(128); // z is 122 in ASCII\\nfor (let i = 0; i < chars.length; i++) {\\n    const c = chars.charCodeAt(i);\\n    charToInteger[c] = i;\\n    intToChar[i] = c;\\n}\\n// Provide a fallback for older environments.\\nconst td = typeof TextDecoder !== 'undefined'\\n    ? new TextDecoder()\\n    : typeof Buffer !== 'undefined'\\n        ? {\\n            decode(buf) {\\n                const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\\n                return out.toString();\\n            },\\n        }\\n        : {\\n            decode(buf) {\\n                let out = '';\\n                for (let i = 0; i < buf.length; i++) {\\n                    out += String.fromCharCode(buf[i]);\\n                }\\n                return out;\\n            },\\n        };\\nfunction decode(mappings) {\\n    const state = new Int32Array(5);\\n    const decoded = [];\\n    let line = [];\\n    let sorted = true;\\n    let lastCol = 0;\\n    for (let i = 0; i < mappings.length;) {\\n        const c = mappings.charCodeAt(i);\\n        if (c === comma) {\\n            i++;\\n        }\\n        else if (c === semicolon) {\\n            state[0] = lastCol = 0;\\n            if (!sorted)\\n                sort(line);\\n            sorted = true;\\n            decoded.push(line);\\n            line = [];\\n            i++;\\n        }\\n        else {\\n            i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn\\n            const col = state[0];\\n            if (col < lastCol)\\n                sorted = false;\\n            lastCol = col;\\n            if (!hasMoreSegments(mappings, i)) {\\n                line.push([col]);\\n                continue;\\n            }\\n            i = decodeInteger(mappings, i, state, 1); // sourceFileIndex\\n            i = decodeInteger(mappings, i, state, 2); // sourceCodeLine\\n            i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn\\n            if (!hasMoreSegments(mappings, i)) {\\n                line.push([col, state[1], state[2], state[3]]);\\n                continue;\\n            }\\n            i = decodeInteger(mappings, i, state, 4); // nameIndex\\n            line.push([col, state[1], state[2], state[3], state[4]]);\\n        }\\n    }\\n    if (!sorted)\\n        sort(line);\\n    decoded.push(line);\\n    return decoded;\\n}\\nfunction decodeInteger(mappings, pos, state, j) {\\n    let value = 0;\\n    let shift = 0;\\n    let integer = 0;\\n    do {\\n        const c = mappings.charCodeAt(pos++);\\n        integer = charToInteger[c];\\n        value |= (integer & 31) << shift;\\n        shift += 5;\\n    } while (integer & 32);\\n    const shouldNegate = value & 1;\\n    value >>>= 1;\\n    if (shouldNegate) {\\n        value = -0x80000000 | -value;\\n    }\\n    state[j] += value;\\n    return pos;\\n}\\nfunction hasMoreSegments(mappings, i) {\\n    if (i >= mappings.length)\\n        return false;\\n    const c = mappings.charCodeAt(i);\\n    if (c === comma || c === semicolon)\\n        return false;\\n    return true;\\n}\\nfunction sort(line) {\\n    line.sort(sortComparator);\\n}\\nfunction sortComparator(a, b) {\\n    return a[0] - b[0];\\n}\\nfunction encode(decoded) {\\n    const state = new Int32Array(5);\\n    let buf = new Uint8Array(1024);\\n    let pos = 0;\\n    for (let i = 0; i < decoded.length; i++) {\\n        const line = decoded[i];\\n        if (i > 0) {\\n            buf = reserve(buf, pos, 1);\\n            buf[pos++] = semicolon;\\n        }\\n        if (line.length === 0)\\n            continue;\\n        state[0] = 0;\\n        for (let j = 0; j < line.length; j++) {\\n            const segment = line[j];\\n            // We can push up to 5 ints, each int can take at most 7 chars, and we\\n            // may push a comma.\\n            buf = reserve(buf, pos, 36);\\n            if (j > 0)\\n                buf[pos++] = comma;\\n            pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn\\n            if (segment.length === 1)\\n                continue;\\n            pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex\\n            pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine\\n            pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn\\n            if (segment.length === 4)\\n                continue;\\n            pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex\\n        }\\n    }\\n    return td.decode(buf.subarray(0, pos));\\n}\\nfunction reserve(buf, pos, count) {\\n    if (buf.length > pos + count)\\n        return buf;\\n    const swap = new Uint8Array(buf.length * 2);\\n    swap.set(buf);\\n    return swap;\\n}\\nfunction encodeInteger(buf, pos, state, segment, j) {\\n    const next = segment[j];\\n    let num = next - state[j];\\n    state[j] = next;\\n    num = num < 0 ? (-num << 1) | 1 : num << 1;\\n    do {\\n        let clamped = num & 0b011111;\\n        num >>>= 5;\\n        if (num > 0)\\n            clamped |= 0b100000;\\n        buf[pos++] = intToChar[clamped];\\n    } while (num > 0);\\n    return pos;\\n}\\n\\nexport { decode, encode };\\n//# sourceMappingURL=sourcemap-codec.mjs.map\\n\",\"// Matches the scheme of a URL, eg \\\"http://\\\"\\nconst schemeRegex = /^[\\\\w+.-]+:\\\\/\\\\//;\\n/**\\n * Matches the parts of a URL:\\n * 1. Scheme, including \\\":\\\", guaranteed.\\n * 2. User/password, including \\\"@\\\", optional.\\n * 3. Host, guaranteed.\\n * 4. Port, including \\\":\\\", optional.\\n * 5. Path, including \\\"/\\\", optional.\\n */\\nconst urlRegex = /^([\\\\w+.-]+:)\\\\/\\\\/([^@/#?]*@)?([^:/#?]*)(:\\\\d+)?(\\\\/[^#?]*)?/;\\n/**\\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\\n *\\n * 1. Host, optional.\\n * 2. Path, which may inclue \\\"/\\\", guaranteed.\\n */\\nconst fileRegex = /^file:(?:\\\\/\\\\/((?![a-z]:)[^/]*)?)?(\\\\/?.*)/i;\\nfunction isAbsoluteUrl(input) {\\n    return schemeRegex.test(input);\\n}\\nfunction isSchemeRelativeUrl(input) {\\n    return input.startsWith('//');\\n}\\nfunction isAbsolutePath(input) {\\n    return input.startsWith('/');\\n}\\nfunction isFileUrl(input) {\\n    return input.startsWith('file:');\\n}\\nfunction parseAbsoluteUrl(input) {\\n    const match = urlRegex.exec(input);\\n    return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');\\n}\\nfunction parseFileUrl(input) {\\n    const match = fileRegex.exec(input);\\n    const path = match[2];\\n    return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);\\n}\\nfunction makeUrl(scheme, user, host, port, path) {\\n    return {\\n        scheme,\\n        user,\\n        host,\\n        port,\\n        path,\\n        relativePath: false,\\n    };\\n}\\nfunction parseUrl(input) {\\n    if (isSchemeRelativeUrl(input)) {\\n        const url = parseAbsoluteUrl('http:' + input);\\n        url.scheme = '';\\n        return url;\\n    }\\n    if (isAbsolutePath(input)) {\\n        const url = parseAbsoluteUrl('http://foo.com' + input);\\n        url.scheme = '';\\n        url.host = '';\\n        return url;\\n    }\\n    if (isFileUrl(input))\\n        return parseFileUrl(input);\\n    if (isAbsoluteUrl(input))\\n        return parseAbsoluteUrl(input);\\n    const url = parseAbsoluteUrl('http://foo.com/' + input);\\n    url.scheme = '';\\n    url.host = '';\\n    url.relativePath = true;\\n    return url;\\n}\\nfunction stripPathFilename(path) {\\n    // If a path ends with a parent directory \\\"..\\\", then it's a relative path with excess parent\\n    // paths. It's not a file, so we can't strip it.\\n    if (path.endsWith('/..'))\\n        return path;\\n    const index = path.lastIndexOf('/');\\n    return path.slice(0, index + 1);\\n}\\nfunction mergePaths(url, base) {\\n    // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.\\n    if (!url.relativePath)\\n        return;\\n    normalizePath(base);\\n    // If the path is just a \\\"/\\\", then it was an empty path to begin with (remember, we're a relative\\n    // path).\\n    if (url.path === '/') {\\n        url.path = base.path;\\n    }\\n    else {\\n        // Resolution happens relative to the base path's directory, not the file.\\n        url.path = stripPathFilename(base.path) + url.path;\\n    }\\n    // If the base path is absolute, then our path is now absolute too.\\n    url.relativePath = base.relativePath;\\n}\\n/**\\n * The path can have empty directories \\\"//\\\", unneeded parents \\\"foo/..\\\", or current directory\\n * \\\"foo/.\\\". We need to normalize to a standard representation.\\n */\\nfunction normalizePath(url) {\\n    const { relativePath } = url;\\n    const pieces = url.path.split('/');\\n    // We need to preserve the first piece always, so that we output a leading slash. The item at\\n    // pieces[0] is an empty string.\\n    let pointer = 1;\\n    // Positive is the number of real directories we've output, used for popping a parent directory.\\n    // Eg, \\\"foo/bar/..\\\" will have a positive 2, and we can decrement to be left with just \\\"foo\\\".\\n    let positive = 0;\\n    // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \\\"foo/\\\" will\\n    // generate `[\\\"foo\\\", \\\"\\\"]` pieces). And, if we pop a parent directory. But once we encounter a\\n    // real directory, we won't need to append, unless the other conditions happen again.\\n    let addTrailingSlash = false;\\n    for (let i = 1; i < pieces.length; i++) {\\n        const piece = pieces[i];\\n        // An empty directory, could be a trailing slash, or just a double \\\"//\\\" in the path.\\n        if (!piece) {\\n            addTrailingSlash = true;\\n            continue;\\n        }\\n        // If we encounter a real directory, then we don't need to append anymore.\\n        addTrailingSlash = false;\\n        // A current directory, which we can always drop.\\n        if (piece === '.')\\n            continue;\\n        // A parent directory, we need to see if there are any real directories we can pop. Else, we\\n        // have an excess of parents, and we'll need to keep the \\\"..\\\".\\n        if (piece === '..') {\\n            if (positive) {\\n                addTrailingSlash = true;\\n                positive--;\\n                pointer--;\\n            }\\n            else if (relativePath) {\\n                // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\\n                // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\\n                pieces[pointer++] = piece;\\n            }\\n            continue;\\n        }\\n        // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\\n        // any popped or dropped directories.\\n        pieces[pointer++] = piece;\\n        positive++;\\n    }\\n    let path = '';\\n    for (let i = 1; i < pointer; i++) {\\n        path += '/' + pieces[i];\\n    }\\n    if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\\n        path += '/';\\n    }\\n    url.path = path;\\n}\\n/**\\n * Attempts to resolve `input` URL/path relative to `base`.\\n */\\nfunction resolve(input, base) {\\n    if (!input && !base)\\n        return '';\\n    const url = parseUrl(input);\\n    // If we have a base, and the input isn't already an absolute URL, then we need to merge.\\n    if (base && !url.scheme) {\\n        const baseUrl = parseUrl(base);\\n        url.scheme = baseUrl.scheme;\\n        // If there's no host, then we were just a path.\\n        if (!url.host) {\\n            // The host, user, and port are joined, you can't copy one without the others.\\n            url.user = baseUrl.user;\\n            url.host = baseUrl.host;\\n            url.port = baseUrl.port;\\n        }\\n        mergePaths(url, baseUrl);\\n    }\\n    normalizePath(url);\\n    // If the input (and base, if there was one) are both relative, then we need to output a relative.\\n    if (url.relativePath) {\\n        // The first char is always a \\\"/\\\".\\n        const path = url.path.slice(1);\\n        if (!path)\\n            return '.';\\n        // If base started with a leading \\\".\\\", or there is no base and input started with a \\\".\\\", then we\\n        // need to ensure that the relative path starts with a \\\".\\\". We don't know if relative starts\\n        // with a \\\"..\\\", though, so check before prepending.\\n        const keepRelative = (base || input).startsWith('.');\\n        return !keepRelative || path.startsWith('.') ? path : './' + path;\\n    }\\n    // If there's no host (and no scheme/user/port), then we need to output an absolute path.\\n    if (!url.scheme && !url.host)\\n        return url.path;\\n    // We're outputting either an absolute URL, or a protocol relative one.\\n    return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;\\n}\\n\\nexport { resolve as default };\\n//# sourceMappingURL=resolve-uri.mjs.map\\n\",\"import { encode, decode } from '@jridgewell/sourcemap-codec';\\nimport resolveUri from '@jridgewell/resolve-uri';\\n\\nfunction resolve(input, base) {\\n    // The base is always treated as a directory, if it's not empty.\\n    // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\\n    // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\\n    if (base && !base.endsWith('/'))\\n        base += '/';\\n    return resolveUri(input, base);\\n}\\n\\n/**\\n * Removes everything after the last \\\"/\\\", but leaves the slash.\\n */\\nfunction stripFilename(path) {\\n    if (!path)\\n        return '';\\n    const index = path.lastIndexOf('/');\\n    return path.slice(0, index + 1);\\n}\\n\\nconst COLUMN = 0;\\nconst SOURCES_INDEX = 1;\\nconst SOURCE_LINE = 2;\\nconst SOURCE_COLUMN = 3;\\nconst NAMES_INDEX = 4;\\nconst REV_GENERATED_LINE = 1;\\nconst REV_GENERATED_COLUMN = 2;\\n\\nfunction maybeSort(mappings, owned) {\\n    const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\\n    if (unsortedIndex === mappings.length)\\n        return mappings;\\n    // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\\n    // not, we do not want to modify the consumer's input array.\\n    if (!owned)\\n        mappings = mappings.slice();\\n    for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\\n        mappings[i] = sortSegments(mappings[i], owned);\\n    }\\n    return mappings;\\n}\\nfunction nextUnsortedSegmentLine(mappings, start) {\\n    for (let i = start; i < mappings.length; i++) {\\n        if (!isSorted(mappings[i]))\\n            return i;\\n    }\\n    return mappings.length;\\n}\\nfunction isSorted(line) {\\n    for (let j = 1; j < line.length; j++) {\\n        if (line[j][COLUMN] < line[j - 1][COLUMN]) {\\n            return false;\\n        }\\n    }\\n    return true;\\n}\\nfunction sortSegments(line, owned) {\\n    if (!owned)\\n        line = line.slice();\\n    return line.sort(sortComparator);\\n}\\nfunction sortComparator(a, b) {\\n    return a[COLUMN] - b[COLUMN];\\n}\\n\\nlet found = false;\\n/**\\n * A binary search implementation that returns the index if a match is found.\\n * If no match is found, then the left-index (the index associated with the item that comes just\\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\\n * the next index:\\n *\\n * ```js\\n * const array = [1, 3];\\n * const needle = 2;\\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\\n *\\n * assert.equal(index, 0);\\n * array.splice(index + 1, 0, needle);\\n * assert.deepEqual(array, [1, 2, 3]);\\n * ```\\n */\\nfunction binarySearch(haystack, needle, low, high) {\\n    while (low <= high) {\\n        const mid = low + ((high - low) >> 1);\\n        const cmp = haystack[mid][COLUMN] - needle;\\n        if (cmp === 0) {\\n            found = true;\\n            return mid;\\n        }\\n        if (cmp < 0) {\\n            low = mid + 1;\\n        }\\n        else {\\n            high = mid - 1;\\n        }\\n    }\\n    found = false;\\n    return low - 1;\\n}\\nfunction upperBound(haystack, needle, index) {\\n    for (let i = index + 1; i < haystack.length; i++, index++) {\\n        if (haystack[i][COLUMN] !== needle)\\n            break;\\n    }\\n    return index;\\n}\\nfunction lowerBound(haystack, needle, index) {\\n    for (let i = index - 1; i >= 0; i--, index--) {\\n        if (haystack[i][COLUMN] !== needle)\\n            break;\\n    }\\n    return index;\\n}\\nfunction memoizedState() {\\n    return {\\n        lastKey: -1,\\n        lastNeedle: -1,\\n        lastIndex: -1,\\n    };\\n}\\n/**\\n * This overly complicated beast is just to record the last tested line/column and the resulting\\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\\n */\\nfunction memoizedBinarySearch(haystack, needle, state, key) {\\n    const { lastKey, lastNeedle, lastIndex } = state;\\n    let low = 0;\\n    let high = haystack.length - 1;\\n    if (key === lastKey) {\\n        if (needle === lastNeedle) {\\n            found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;\\n            return lastIndex;\\n        }\\n        if (needle >= lastNeedle) {\\n            // lastIndex may be -1 if the previous needle was not found.\\n            low = lastIndex === -1 ? 0 : lastIndex;\\n        }\\n        else {\\n            high = lastIndex;\\n        }\\n    }\\n    state.lastKey = key;\\n    state.lastNeedle = needle;\\n    return (state.lastIndex = binarySearch(haystack, needle, low, high));\\n}\\n\\n// Rebuilds the original source files, with mappings that are ordered by source line/column instead\\n// of generated line/column.\\nfunction buildBySources(decoded, memos) {\\n    const sources = memos.map(buildNullArray);\\n    for (let i = 0; i < decoded.length; i++) {\\n        const line = decoded[i];\\n        for (let j = 0; j < line.length; j++) {\\n            const seg = line[j];\\n            if (seg.length === 1)\\n                continue;\\n            const sourceIndex = seg[SOURCES_INDEX];\\n            const sourceLine = seg[SOURCE_LINE];\\n            const sourceColumn = seg[SOURCE_COLUMN];\\n            const originalSource = sources[sourceIndex];\\n            const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));\\n            const memo = memos[sourceIndex];\\n            // The binary search either found a match, or it found the left-index just before where the\\n            // segment should go. Either way, we want to insert after that. And there may be multiple\\n            // generated segments associated with an original location, so there may need to move several\\n            // indexes before we find where we need to insert.\\n            const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));\\n            insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);\\n        }\\n    }\\n    return sources;\\n}\\nfunction insert(array, index, value) {\\n    for (let i = array.length; i > index; i--) {\\n        array[i] = array[i - 1];\\n    }\\n    array[index] = value;\\n}\\n// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like\\n// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.\\n// Numeric properties on objects are magically sorted in ascending order by the engine regardless of\\n// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending\\n// order when iterating with for-in.\\nfunction buildNullArray() {\\n    return { __proto__: null };\\n}\\n\\nconst AnyMap = function (map, mapUrl) {\\n    const parsed = typeof map === 'string' ? JSON.parse(map) : map;\\n    if (!('sections' in parsed))\\n        return new TraceMap(parsed, mapUrl);\\n    const mappings = [];\\n    const sources = [];\\n    const sourcesContent = [];\\n    const names = [];\\n    const { sections } = parsed;\\n    let i = 0;\\n    for (; i < sections.length - 1; i++) {\\n        const no = sections[i + 1].offset;\\n        addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);\\n    }\\n    if (sections.length > 0) {\\n        addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);\\n    }\\n    const joined = {\\n        version: 3,\\n        file: parsed.file,\\n        names,\\n        sources,\\n        sourcesContent,\\n        mappings,\\n    };\\n    return presortedDecodedMap(joined);\\n};\\nfunction addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {\\n    const map = AnyMap(section.map, mapUrl);\\n    const { line: lineOffset, column: columnOffset } = section.offset;\\n    const sourcesOffset = sources.length;\\n    const namesOffset = names.length;\\n    const decoded = decodedMappings(map);\\n    const { resolvedSources } = map;\\n    append(sources, resolvedSources);\\n    append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));\\n    append(names, map.names);\\n    // If this section jumps forwards several lines, we need to add lines to the output mappings catch up.\\n    for (let i = mappings.length; i <= lineOffset; i++)\\n        mappings.push([]);\\n    // We can only add so many lines before we step into the range that the next section's map\\n    // controls. When we get to the last line, then we'll start checking the segments to see if\\n    // they've crossed into the column range.\\n    const stopI = stopLine - lineOffset;\\n    const len = Math.min(decoded.length, stopI + 1);\\n    for (let i = 0; i < len; i++) {\\n        const line = decoded[i];\\n        // On the 0th loop, the line will already exist due to a previous section, or the line catch up\\n        // loop above.\\n        const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);\\n        // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\\n        // map can be multiple lines), it doesn't.\\n        const cOffset = i === 0 ? columnOffset : 0;\\n        for (let j = 0; j < line.length; j++) {\\n            const seg = line[j];\\n            const column = cOffset + seg[COLUMN];\\n            // If this segment steps into the column range that the next section's map controls, we need\\n            // to stop early.\\n            if (i === stopI && column >= stopColumn)\\n                break;\\n            if (seg.length === 1) {\\n                out.push([column]);\\n                continue;\\n            }\\n            const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];\\n            const sourceLine = seg[SOURCE_LINE];\\n            const sourceColumn = seg[SOURCE_COLUMN];\\n            if (seg.length === 4) {\\n                out.push([column, sourcesIndex, sourceLine, sourceColumn]);\\n                continue;\\n            }\\n            out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);\\n        }\\n    }\\n}\\nfunction append(arr, other) {\\n    for (let i = 0; i < other.length; i++)\\n        arr.push(other[i]);\\n}\\n// Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of\\n// equal length to the sources. This is because the sources and sourcesContent are paired arrays,\\n// where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined\\n// sourcemap would desynchronize the sources/contents.\\nfunction fillSourcesContent(len) {\\n    const sourcesContent = [];\\n    for (let i = 0; i < len; i++)\\n        sourcesContent[i] = null;\\n    return sourcesContent;\\n}\\n\\nconst INVALID_ORIGINAL_MAPPING = Object.freeze({\\n    source: null,\\n    line: null,\\n    column: null,\\n    name: null,\\n});\\nconst INVALID_GENERATED_MAPPING = Object.freeze({\\n    line: null,\\n    column: null,\\n});\\nconst LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\\nconst COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\\nconst LEAST_UPPER_BOUND = -1;\\nconst GREATEST_LOWER_BOUND = 1;\\n/**\\n * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\\n */\\nlet encodedMappings;\\n/**\\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\\n */\\nlet decodedMappings;\\n/**\\n * A low-level API to find the segment associated with a generated line/column (think, from a\\n * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\\n */\\nlet traceSegment;\\n/**\\n * A higher-level API to find the source/line/column associated with a generated line/column\\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\\n * `source-map` library.\\n */\\nlet originalPositionFor;\\n/**\\n * Finds the source/line/column directly after the mapping returned by originalPositionFor, provided\\n * the found mapping is from the same source and line as the originalPositionFor mapping.\\n *\\n * Eg, in the code `let id = 1`, `originalPositionAfter` could find the mapping associated with `1`\\n * using the same needle that would return `id` when calling `originalPositionFor`.\\n */\\nlet generatedPositionFor;\\n/**\\n * Iterates each mapping in generated position order.\\n */\\nlet eachMapping;\\n/**\\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\\n * maps.\\n */\\nlet presortedDecodedMap;\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet decodedMap;\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet encodedMap;\\nclass TraceMap {\\n    constructor(map, mapUrl) {\\n        this._decodedMemo = memoizedState();\\n        this._bySources = undefined;\\n        this._bySourceMemos = undefined;\\n        const isString = typeof map === 'string';\\n        if (!isString && map.constructor === TraceMap)\\n            return map;\\n        const parsed = (isString ? JSON.parse(map) : map);\\n        const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\\n        this.version = version;\\n        this.file = file;\\n        this.names = names;\\n        this.sourceRoot = sourceRoot;\\n        this.sources = sources;\\n        this.sourcesContent = sourcesContent;\\n        if (sourceRoot || mapUrl) {\\n            const from = resolve(sourceRoot || '', stripFilename(mapUrl));\\n            this.resolvedSources = sources.map((s) => resolve(s || '', from));\\n        }\\n        else {\\n            this.resolvedSources = sources.map((s) => s || '');\\n        }\\n        const { mappings } = parsed;\\n        if (typeof mappings === 'string') {\\n            this._encoded = mappings;\\n            this._decoded = undefined;\\n        }\\n        else {\\n            this._encoded = undefined;\\n            this._decoded = maybeSort(mappings, isString);\\n        }\\n    }\\n}\\n(() => {\\n    encodedMappings = (map) => {\\n        var _a;\\n        return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = encode(map._decoded)));\\n    };\\n    decodedMappings = (map) => {\\n        return (map._decoded || (map._decoded = decode(map._encoded)));\\n    };\\n    traceSegment = (map, line, column) => {\\n        const decoded = decodedMappings(map);\\n        // It's common for parent source maps to have pointers to lines that have no\\n        // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n        if (line >= decoded.length)\\n            return null;\\n        return traceSegmentInternal(decoded[line], map._decodedMemo, line, column, GREATEST_LOWER_BOUND);\\n    };\\n    originalPositionFor = (map, { line, column, bias }) => {\\n        line--;\\n        if (line < 0)\\n            throw new Error(LINE_GTR_ZERO);\\n        if (column < 0)\\n            throw new Error(COL_GTR_EQ_ZERO);\\n        const decoded = decodedMappings(map);\\n        // It's common for parent source maps to have pointers to lines that have no\\n        // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n        if (line >= decoded.length)\\n            return INVALID_ORIGINAL_MAPPING;\\n        const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);\\n        if (segment == null)\\n            return INVALID_ORIGINAL_MAPPING;\\n        if (segment.length == 1)\\n            return INVALID_ORIGINAL_MAPPING;\\n        const { names, resolvedSources } = map;\\n        return {\\n            source: resolvedSources[segment[SOURCES_INDEX]],\\n            line: segment[SOURCE_LINE] + 1,\\n            column: segment[SOURCE_COLUMN],\\n            name: segment.length === 5 ? names[segment[NAMES_INDEX]] : null,\\n        };\\n    };\\n    generatedPositionFor = (map, { source, line, column, bias }) => {\\n        line--;\\n        if (line < 0)\\n            throw new Error(LINE_GTR_ZERO);\\n        if (column < 0)\\n            throw new Error(COL_GTR_EQ_ZERO);\\n        const { sources, resolvedSources } = map;\\n        let sourceIndex = sources.indexOf(source);\\n        if (sourceIndex === -1)\\n            sourceIndex = resolvedSources.indexOf(source);\\n        if (sourceIndex === -1)\\n            return INVALID_GENERATED_MAPPING;\\n        const generated = (map._bySources || (map._bySources = buildBySources(decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));\\n        const memos = map._bySourceMemos;\\n        const segments = generated[sourceIndex][line];\\n        if (segments == null)\\n            return INVALID_GENERATED_MAPPING;\\n        const segment = traceSegmentInternal(segments, memos[sourceIndex], line, column, bias || GREATEST_LOWER_BOUND);\\n        if (segment == null)\\n            return INVALID_GENERATED_MAPPING;\\n        return {\\n            line: segment[REV_GENERATED_LINE] + 1,\\n            column: segment[REV_GENERATED_COLUMN],\\n        };\\n    };\\n    eachMapping = (map, cb) => {\\n        const decoded = decodedMappings(map);\\n        const { names, resolvedSources } = map;\\n        for (let i = 0; i < decoded.length; i++) {\\n            const line = decoded[i];\\n            for (let j = 0; j < line.length; j++) {\\n                const seg = line[j];\\n                const generatedLine = i + 1;\\n                const generatedColumn = seg[0];\\n                let source = null;\\n                let originalLine = null;\\n                let originalColumn = null;\\n                let name = null;\\n                if (seg.length !== 1) {\\n                    source = resolvedSources[seg[1]];\\n                    originalLine = seg[2] + 1;\\n                    originalColumn = seg[3];\\n                }\\n                if (seg.length === 5)\\n                    name = names[seg[4]];\\n                cb({\\n                    generatedLine,\\n                    generatedColumn,\\n                    source,\\n                    originalLine,\\n                    originalColumn,\\n                    name,\\n                });\\n            }\\n        }\\n    };\\n    presortedDecodedMap = (map, mapUrl) => {\\n        const clone = Object.assign({}, map);\\n        clone.mappings = [];\\n        const tracer = new TraceMap(clone, mapUrl);\\n        tracer._decoded = map.mappings;\\n        return tracer;\\n    };\\n    decodedMap = (map) => {\\n        return {\\n            version: 3,\\n            file: map.file,\\n            names: map.names,\\n            sourceRoot: map.sourceRoot,\\n            sources: map.sources,\\n            sourcesContent: map.sourcesContent,\\n            mappings: decodedMappings(map),\\n        };\\n    };\\n    encodedMap = (map) => {\\n        return {\\n            version: 3,\\n            file: map.file,\\n            names: map.names,\\n            sourceRoot: map.sourceRoot,\\n            sources: map.sources,\\n            sourcesContent: map.sourcesContent,\\n            mappings: encodedMappings(map),\\n        };\\n    };\\n})();\\nfunction traceSegmentInternal(segments, memo, line, column, bias) {\\n    let index = memoizedBinarySearch(segments, column, memo, line);\\n    if (found) {\\n        index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\\n    }\\n    else if (bias === LEAST_UPPER_BOUND)\\n        index++;\\n    if (index === -1 || index === segments.length)\\n        return null;\\n    return segments[index];\\n}\\n\\nexport { AnyMap, GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap, decodedMap, decodedMappings, eachMapping, encodedMap, encodedMappings, generatedPositionFor, originalPositionFor, presortedDecodedMap, traceSegment };\\n//# sourceMappingURL=trace-mapping.mjs.map\\n\",\"/**\\n * Gets the index associated with `key` in the backing array, if it is already present.\\n */\\nlet get;\\n/**\\n * Puts `key` into the backing array, if it is not already present. Returns\\n * the index of the `key` in the backing array.\\n */\\nlet put;\\n/**\\n * Pops the last added item out of the SetArray.\\n */\\nlet pop;\\n/**\\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\\n * index of the `key` in the backing array.\\n *\\n * This is designed to allow synchronizing a second array with the contents of the backing array,\\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\\n * and there are never duplicates.\\n */\\nclass SetArray {\\n    constructor() {\\n        this._indexes = { __proto__: null };\\n        this.array = [];\\n    }\\n}\\n(() => {\\n    get = (strarr, key) => strarr._indexes[key];\\n    put = (strarr, key) => {\\n        // The key may or may not be present. If it is present, it's a number.\\n        const index = get(strarr, key);\\n        if (index !== undefined)\\n            return index;\\n        const { array, _indexes: indexes } = strarr;\\n        return (indexes[key] = array.push(key) - 1);\\n    };\\n    pop = (strarr) => {\\n        const { array, _indexes: indexes } = strarr;\\n        if (array.length === 0)\\n            return;\\n        const last = array.pop();\\n        indexes[last] = undefined;\\n    };\\n})();\\n\\nexport { SetArray, get, pop, put };\\n//# sourceMappingURL=set-array.mjs.map\\n\",\"import { SetArray, put } from '@jridgewell/set-array';\\nimport { encode } from '@jridgewell/sourcemap-codec';\\nimport { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';\\n\\nconst COLUMN = 0;\\nconst SOURCES_INDEX = 1;\\nconst SOURCE_LINE = 2;\\nconst SOURCE_COLUMN = 3;\\nconst NAMES_INDEX = 4;\\n\\nconst NO_NAME = -1;\\n/**\\n * A low-level API to associate a generated position with an original source position. Line and\\n * column here are 0-based, unlike `addMapping`.\\n */\\nlet addSegment;\\n/**\\n * A high-level API to associate a generated position with an original source position. Line is\\n * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\\n */\\nlet addMapping;\\n/**\\n * Same as `addSegment`, but will only add the segment if it generates useful information in the\\n * resulting map. This only works correctly if segments are added **in order**, meaning you should\\n * not add a segment with a lower generated line/column than one that came before.\\n */\\nlet maybeAddSegment;\\n/**\\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\\n * not add a mapping with a lower generated line/column than one that came before.\\n */\\nlet maybeAddMapping;\\n/**\\n * Adds/removes the content of the source file to the source map.\\n */\\nlet setSourceContent;\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet toDecodedMap;\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet toEncodedMap;\\n/**\\n * Constructs a new GenMapping, using the already present mappings of the input.\\n */\\nlet fromMap;\\n/**\\n * Returns an array of high-level mapping objects for every recorded segment, which could then be\\n * passed to the `source-map` library.\\n */\\nlet allMappings;\\n// This split declaration is only so that terser can elminiate the static initialization block.\\nlet addSegmentInternal;\\n/**\\n * Provides the state to generate a sourcemap.\\n */\\nclass GenMapping {\\n    constructor({ file, sourceRoot } = {}) {\\n        this._names = new SetArray();\\n        this._sources = new SetArray();\\n        this._sourcesContent = [];\\n        this._mappings = [];\\n        this.file = file;\\n        this.sourceRoot = sourceRoot;\\n    }\\n}\\n(() => {\\n    addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\\n        return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name);\\n    };\\n    maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\\n        return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name);\\n    };\\n    addMapping = (map, mapping) => {\\n        return addMappingInternal(false, map, mapping);\\n    };\\n    maybeAddMapping = (map, mapping) => {\\n        return addMappingInternal(true, map, mapping);\\n    };\\n    setSourceContent = (map, source, content) => {\\n        const { _sources: sources, _sourcesContent: sourcesContent } = map;\\n        sourcesContent[put(sources, source)] = content;\\n    };\\n    toDecodedMap = (map) => {\\n        const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\\n        removeEmptyFinalLines(mappings);\\n        return {\\n            version: 3,\\n            file: file || undefined,\\n            names: names.array,\\n            sourceRoot: sourceRoot || undefined,\\n            sources: sources.array,\\n            sourcesContent,\\n            mappings,\\n        };\\n    };\\n    toEncodedMap = (map) => {\\n        const decoded = toDecodedMap(map);\\n        return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });\\n    };\\n    allMappings = (map) => {\\n        const out = [];\\n        const { _mappings: mappings, _sources: sources, _names: names } = map;\\n        for (let i = 0; i < mappings.length; i++) {\\n            const line = mappings[i];\\n            for (let j = 0; j < line.length; j++) {\\n                const seg = line[j];\\n                const generated = { line: i + 1, column: seg[COLUMN] };\\n                let source = undefined;\\n                let original = undefined;\\n                let name = undefined;\\n                if (seg.length !== 1) {\\n                    source = sources.array[seg[SOURCES_INDEX]];\\n                    original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };\\n                    if (seg.length === 5)\\n                        name = names.array[seg[NAMES_INDEX]];\\n                }\\n                out.push({ generated, source, original, name });\\n            }\\n        }\\n        return out;\\n    };\\n    fromMap = (input) => {\\n        const map = new TraceMap(input);\\n        const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });\\n        putAll(gen._names, map.names);\\n        putAll(gen._sources, map.sources);\\n        gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);\\n        gen._mappings = decodedMappings(map);\\n        return gen;\\n    };\\n    // Internal helpers\\n    addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\\n        const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\\n        const line = getLine(mappings, genLine);\\n        const index = getColumnIndex(line, genColumn);\\n        if (!source) {\\n            if (skipable && skipSourceless(line, index))\\n                return;\\n            return insert(line, index, [genColumn]);\\n        }\\n        const sourcesIndex = put(sources, source);\\n        const namesIndex = name ? put(names, name) : NO_NAME;\\n        if (sourcesIndex === sourcesContent.length)\\n            sourcesContent[sourcesIndex] = null;\\n        if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\\n            return;\\n        }\\n        return insert(line, index, name\\n            ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\\n            : [genColumn, sourcesIndex, sourceLine, sourceColumn]);\\n    };\\n})();\\nfunction getLine(mappings, index) {\\n    for (let i = mappings.length; i <= index; i++) {\\n        mappings[i] = [];\\n    }\\n    return mappings[index];\\n}\\nfunction getColumnIndex(line, genColumn) {\\n    let index = line.length;\\n    for (let i = index - 1; i >= 0; index = i--) {\\n        const current = line[i];\\n        if (genColumn >= current[COLUMN])\\n            break;\\n    }\\n    return index;\\n}\\nfunction insert(array, index, value) {\\n    for (let i = array.length; i > index; i--) {\\n        array[i] = array[i - 1];\\n    }\\n    array[index] = value;\\n}\\nfunction removeEmptyFinalLines(mappings) {\\n    const { length } = mappings;\\n    let len = length;\\n    for (let i = len - 1; i >= 0; len = i, i--) {\\n        if (mappings[i].length > 0)\\n            break;\\n    }\\n    if (len < length)\\n        mappings.length = len;\\n}\\nfunction putAll(strarr, array) {\\n    for (let i = 0; i < array.length; i++)\\n        put(strarr, array[i]);\\n}\\nfunction skipSourceless(line, index) {\\n    // The start of a line is already sourceless, so adding a sourceless segment to the beginning\\n    // doesn't generate any useful information.\\n    if (index === 0)\\n        return true;\\n    const prev = line[index - 1];\\n    // If the previous segment is also sourceless, then adding another sourceless segment doesn't\\n    // genrate any new information. Else, this segment will end the source/named segment and point to\\n    // a sourceless position, which is useful.\\n    return prev.length === 1;\\n}\\nfunction skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {\\n    // A source/named segment at the start of a line gives position at that genColumn\\n    if (index === 0)\\n        return false;\\n    const prev = line[index - 1];\\n    // If the previous segment is sourceless, then we're transitioning to a source.\\n    if (prev.length === 1)\\n        return false;\\n    // If the previous segment maps to the exact same source position, then this segment doesn't\\n    // provide any new position information.\\n    return (sourcesIndex === prev[SOURCES_INDEX] &&\\n        sourceLine === prev[SOURCE_LINE] &&\\n        sourceColumn === prev[SOURCE_COLUMN] &&\\n        namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));\\n}\\nfunction addMappingInternal(skipable, map, mapping) {\\n    const { generated, source, original, name } = mapping;\\n    if (!source) {\\n        return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);\\n    }\\n    const s = source;\\n    return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);\\n}\\n\\nexport { GenMapping, addMapping, addSegment, allMappings, fromMap, maybeAddMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap };\\n//# sourceMappingURL=gen-mapping.mjs.map\\n\",\"import { AnyMap, originalPositionFor } from '@jridgewell/trace-mapping';\\nimport {\\n  GenMapping,\\n  maybeAddMapping,\\n  toDecodedMap,\\n  toEncodedMap,\\n  setSourceContent,\\n} from '@jridgewell/gen-mapping';\\n\\nimport type { TraceMap, SectionedSourceMapInput } from '@jridgewell/trace-mapping';\\nexport type { TraceMap, SectionedSourceMapInput };\\n\\nimport type { Mapping, EncodedSourceMap, DecodedSourceMap } from '@jridgewell/gen-mapping';\\nexport type { Mapping, EncodedSourceMap, DecodedSourceMap };\\n\\nexport class SourceMapConsumer {\\n  private declare _map: TraceMap;\\n  declare file: TraceMap['file'];\\n  declare names: TraceMap['names'];\\n  declare sourceRoot: TraceMap['sourceRoot'];\\n  declare sources: TraceMap['sources'];\\n  declare sourcesContent: TraceMap['sourcesContent'];\\n\\n  constructor(map: ConstructorParameters<typeof AnyMap>[0], mapUrl: Parameters<typeof AnyMap>[1]) {\\n    const trace = (this._map = new AnyMap(map, mapUrl));\\n\\n    this.file = trace.file;\\n    this.names = trace.names;\\n    this.sourceRoot = trace.sourceRoot;\\n    this.sources = trace.resolvedSources;\\n    this.sourcesContent = trace.sourcesContent;\\n  }\\n\\n  originalPositionFor(\\n    needle: Parameters<typeof originalPositionFor>[1],\\n  ): ReturnType<typeof originalPositionFor> {\\n    return originalPositionFor(this._map, needle);\\n  }\\n\\n  destroy() {\\n    // noop.\\n  }\\n}\\n\\nexport class SourceMapGenerator {\\n  private declare _map: GenMapping;\\n\\n  constructor(opts: ConstructorParameters<typeof GenMapping>[0]) {\\n    this._map = new GenMapping(opts);\\n  }\\n\\n  addMapping(mapping: Parameters<typeof maybeAddMapping>[1]): ReturnType<typeof maybeAddMapping> {\\n    maybeAddMapping(this._map, mapping);\\n  }\\n\\n  setSourceContent(\\n    source: Parameters<typeof setSourceContent>[1],\\n    content: Parameters<typeof setSourceContent>[2],\\n  ): ReturnType<typeof setSourceContent> {\\n    setSourceContent(this._map, source, content);\\n  }\\n\\n  toJSON(): ReturnType<typeof toEncodedMap> {\\n    return toEncodedMap(this._map);\\n  }\\n\\n  toDecodedMap(): ReturnType<typeof toDecodedMap> {\\n    return toDecodedMap(this._map);\\n  }\\n}\\n\"],\"names\":[\"sortComparator\",\"resolve\",\"resolveUri\",\"COLUMN\",\"SOURCES_INDEX\",\"SOURCE_LINE\",\"SOURCE_COLUMN\",\"NAMES_INDEX\"],\"mappings\":\"AAAA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACpC,MAAM,KAAK,GAAG,kEAAkE,CAAC;AACjF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAClC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzB,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AACD;AACA,MAAM,EAAE,GAAG,OAAO,WAAW,KAAK,WAAW;AAC7C,MAAM,IAAI,WAAW,EAAE;AACvB,MAAM,OAAO,MAAM,KAAK,WAAW;AACnC,UAAU;AACV,YAAY,MAAM,CAAC,GAAG,EAAE;AACxB,gBAAgB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;AACpF,gBAAgB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACtC,aAAa;AACb,SAAS;AACT,UAAU;AACV,YAAY,MAAM,CAAC,GAAG,EAAE;AACxB,gBAAgB,IAAI,GAAG,GAAG,EAAE,CAAC;AAC7B,gBAAgB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrD,oBAAoB,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,iBAAiB;AACjB,gBAAgB,OAAO,GAAG,CAAC;AAC3B,aAAa;AACb,SAAS,CAAC;AACV,SAAS,MAAM,CAAC,QAAQ,EAAE;AAC1B,IAAI,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AACpC,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC;AACvB,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;AAClB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;AACpB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG;AAC1C,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACzC,QAAQ,IAAI,CAAC,KAAK,KAAK,EAAE;AACzB,YAAY,CAAC,EAAE,CAAC;AAChB,SAAS;AACT,aAAa,IAAI,CAAC,KAAK,SAAS,EAAE;AAClC,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;AACnC,YAAY,IAAI,CAAC,MAAM;AACvB,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,YAAY,MAAM,GAAG,IAAI,CAAC;AAC1B,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,YAAY,IAAI,GAAG,EAAE,CAAC;AACtB,YAAY,CAAC,EAAE,CAAC;AAChB,SAAS;AACT,aAAa;AACb,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrD,YAAY,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,YAAY,IAAI,GAAG,GAAG,OAAO;AAC7B,gBAAgB,MAAM,GAAG,KAAK,CAAC;AAC/B,YAAY,OAAO,GAAG,GAAG,CAAC;AAC1B,YAAY,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;AAC/C,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,gBAAgB,SAAS;AACzB,aAAa;AACb,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrD,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrD,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrD,YAAY,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;AAC/C,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,gBAAgB,SAAS;AACzB,aAAa;AACb,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrD,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,SAAS;AACT,KAAK;AACL,IAAI,IAAI,CAAC,MAAM;AACf,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvB,IAAI,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,SAAS,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;AAChD,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;AAClB,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;AAClB,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;AACpB,IAAI,GAAG;AACP,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7C,QAAQ,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AACnC,QAAQ,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,KAAK,CAAC;AACzC,QAAQ,KAAK,IAAI,CAAC,CAAC;AACnB,KAAK,QAAQ,OAAO,GAAG,EAAE,EAAE;AAC3B,IAAI,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;AACnC,IAAI,KAAK,MAAM,CAAC,CAAC;AACjB,IAAI,IAAI,YAAY,EAAE;AACtB,QAAQ,KAAK,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC;AACrC,KAAK;AACL,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AACtB,IAAI,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,eAAe,CAAC,QAAQ,EAAE,CAAC,EAAE;AACtC,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM;AAC5B,QAAQ,OAAO,KAAK,CAAC;AACrB,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,SAAS;AACtC,QAAQ,OAAO,KAAK,CAAC;AACrB,IAAI,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,IAAI,CAAC,IAAI,EAAE;AACpB,IAAI,IAAI,CAAC,IAAI,CAACA,gBAAc,CAAC,CAAC;AAC9B,CAAC;AACD,SAASA,gBAAc,CAAC,CAAC,EAAE,CAAC,EAAE;AAC9B,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AACD,SAAS,MAAM,CAAC,OAAO,EAAE;AACzB,IAAI,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AACpC,IAAI,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AACnC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;AAChB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC7C,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE;AACnB,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACvC,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;AACnC,SAAS;AACT,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAC7B,YAAY,SAAS;AACrB,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC;AACA;AACA,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AACxC,YAAY,IAAI,CAAC,GAAG,CAAC;AACrB,gBAAgB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;AACnC,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7D,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AACpC,gBAAgB,SAAS;AACzB,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7D,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7D,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7D,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AACpC,gBAAgB,SAAS;AACzB,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7D,SAAS;AACT,KAAK;AACL,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;AAClC,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK;AAChC,QAAQ,OAAO,GAAG,CAAC;AACnB,IAAI,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClB,IAAI,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AACpD,IAAI,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5B,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACpB,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAC/C,IAAI,GAAG;AACP,QAAQ,IAAI,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC;AACrC,QAAQ,GAAG,MAAM,CAAC,CAAC;AACnB,QAAQ,IAAI,GAAG,GAAG,CAAC;AACnB,YAAY,OAAO,IAAI,QAAQ,CAAC;AAChC,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AACxC,KAAK,QAAQ,GAAG,GAAG,CAAC,EAAE;AACtB,IAAI,OAAO,GAAG,CAAC;AACf;;AChKA;AACA,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,0DAA0D,CAAC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS,GAAG,2CAA2C,CAAC;AAC9D,SAAS,aAAa,CAAC,KAAK,EAAE;AAC9B,IAAI,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AACD,SAAS,mBAAmB,CAAC,KAAK,EAAE;AACpC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AACD,SAAS,cAAc,CAAC,KAAK,EAAE;AAC/B,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AACD,SAAS,SAAS,CAAC,KAAK,EAAE;AAC1B,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AACD,SAAS,gBAAgB,CAAC,KAAK,EAAE;AACjC,IAAI,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AACxF,CAAC;AACD,SAAS,YAAY,CAAC,KAAK,EAAE;AAC7B,IAAI,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,IAAI,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;AAC9F,CAAC;AACD,SAAS,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AACjD,IAAI,OAAO;AACX,QAAQ,MAAM;AACd,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,YAAY,EAAE,KAAK;AAC3B,KAAK,CAAC;AACN,CAAC;AACD,SAAS,QAAQ,CAAC,KAAK,EAAE;AACzB,IAAI,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;AACpC,QAAQ,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;AACtD,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;AACxB,QAAQ,OAAO,GAAG,CAAC;AACnB,KAAK;AACL,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;AAC/B,QAAQ,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;AAC/D,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;AACxB,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACtB,QAAQ,OAAO,GAAG,CAAC;AACnB,KAAK;AACL,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC;AACxB,QAAQ,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC;AAC5B,QAAQ,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACvC,IAAI,MAAM,GAAG,GAAG,gBAAgB,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;AAC5D,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;AACpB,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAClB,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;AAC5B,IAAI,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,iBAAiB,CAAC,IAAI,EAAE;AACjC;AACA;AACA,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5B,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACxC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AACD,SAAS,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE;AAC/B;AACA,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY;AACzB,QAAQ,OAAO;AACf,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AACxB;AACA;AACA,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;AAC1B,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AAC7B,KAAK;AACL,SAAS;AACT;AACA,QAAQ,GAAG,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;AAC3D,KAAK;AACL;AACA,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;AACzC,CAAC;AACD;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,GAAG,EAAE;AAC5B,IAAI,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;AACjC,IAAI,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvC;AACA;AACA,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;AACpB;AACA;AACA,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;AACrB;AACA;AACA;AACA,IAAI,IAAI,gBAAgB,GAAG,KAAK,CAAC;AACjC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAChC;AACA,QAAQ,IAAI,CAAC,KAAK,EAAE;AACpB,YAAY,gBAAgB,GAAG,IAAI,CAAC;AACpC,YAAY,SAAS;AACrB,SAAS;AACT;AACA,QAAQ,gBAAgB,GAAG,KAAK,CAAC;AACjC;AACA,QAAQ,IAAI,KAAK,KAAK,GAAG;AACzB,YAAY,SAAS;AACrB;AACA;AACA,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC5B,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,gBAAgB,GAAG,IAAI,CAAC;AACxC,gBAAgB,QAAQ,EAAE,CAAC;AAC3B,gBAAgB,OAAO,EAAE,CAAC;AAC1B,aAAa;AACb,iBAAiB,IAAI,YAAY,EAAE;AACnC;AACA;AACA,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;AAC1C,aAAa;AACb,YAAY,SAAS;AACrB,SAAS;AACT;AACA;AACA,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;AAClC,QAAQ,QAAQ,EAAE,CAAC;AACnB,KAAK;AACL,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;AAClB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;AACtC,QAAQ,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAChC,KAAK;AACL,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;AAC9D,QAAQ,IAAI,IAAI,GAAG,CAAC;AACpB,KAAK;AACL,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AACpB,CAAC;AACD;AACA;AACA;AACA,SAASC,SAAO,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;AACvB,QAAQ,OAAO,EAAE,CAAC;AAClB,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChC;AACA,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AAC7B,QAAQ,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvC,QAAQ,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AACpC;AACA,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;AACvB;AACA,YAAY,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AACpC,YAAY,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AACpC,YAAY,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AACpC,SAAS;AACT,QAAQ,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,KAAK;AACL,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AACvB;AACA,IAAI,IAAI,GAAG,CAAC,YAAY,EAAE;AAC1B;AACA,QAAQ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvC,QAAQ,IAAI,CAAC,IAAI;AACjB,YAAY,OAAO,GAAG,CAAC;AACvB;AACA;AACA;AACA,QAAQ,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7D,QAAQ,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1E,KAAK;AACL;AACA,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI;AAChC,QAAQ,OAAO,GAAG,CAAC,IAAI,CAAC;AACxB;AACA,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACzE;;AC9LA,SAAS,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B;AACA;AACA;AACA,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AACnC,QAAQ,IAAI,IAAI,GAAG,CAAC;AACpB,IAAI,OAAOC,SAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AACD;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,IAAI,EAAE;AAC7B,IAAI,IAAI,CAAC,IAAI;AACb,QAAQ,OAAO,EAAE,CAAC;AAClB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACxC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AACD;AACA,MAAMC,QAAM,GAAG,CAAC,CAAC;AACjB,MAAMC,eAAa,GAAG,CAAC,CAAC;AACxB,MAAMC,aAAW,GAAG,CAAC,CAAC;AACtB,MAAMC,eAAa,GAAG,CAAC,CAAC;AACxB,MAAMC,aAAW,GAAG,CAAC,CAAC;AAGtB;AACA,SAAS,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE;AACpC,IAAI,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC/D,IAAI,IAAI,aAAa,KAAK,QAAQ,CAAC,MAAM;AACzC,QAAQ,OAAO,QAAQ,CAAC;AACxB;AACA;AACA,IAAI,IAAI,CAAC,KAAK;AACd,QAAQ,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AACpC,IAAI,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;AACnG,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACvD,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC;AACpB,CAAC;AACD,SAAS,uBAAuB,CAAC,QAAQ,EAAE,KAAK,EAAE;AAClD,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClD,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClC,YAAY,OAAO,CAAC,CAAC;AACrB,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC,MAAM,CAAC;AAC3B,CAAC;AACD,SAAS,QAAQ,CAAC,IAAI,EAAE;AACxB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAACJ,QAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAACA,QAAM,CAAC,EAAE;AACnD,YAAY,OAAO,KAAK,CAAC;AACzB,SAAS;AACT,KAAK;AACL,IAAI,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;AACnC,IAAI,IAAI,CAAC,KAAK;AACd,QAAQ,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC5B,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACrC,CAAC;AACD,SAAS,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE;AAC9B,IAAI,OAAO,CAAC,CAACA,QAAM,CAAC,GAAG,CAAC,CAACA,QAAM,CAAC,CAAC;AACjC,CAAC;AACD;AACA,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;AACnD,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE;AACxB,QAAQ,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;AAC9C,QAAQ,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAACA,QAAM,CAAC,GAAG,MAAM,CAAC;AACnD,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE;AACvB,YAAY,KAAK,GAAG,IAAI,CAAC;AACzB,YAAY,OAAO,GAAG,CAAC;AACvB,SAAS;AACT,QAAQ,IAAI,GAAG,GAAG,CAAC,EAAE;AACrB,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAC1B,SAAS;AACT,aAAa;AACb,YAAY,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;AAC3B,SAAS;AACT,KAAK;AACL,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC;AACnB,CAAC;AACD,SAAS,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7C,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;AAC/D,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAACA,QAAM,CAAC,KAAK,MAAM;AAC1C,YAAY,MAAM;AAClB,KAAK;AACL,IAAI,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,SAAS,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7C,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;AAClD,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAACA,QAAM,CAAC,KAAK,MAAM;AAC1C,YAAY,MAAM;AAClB,KAAK;AACL,IAAI,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,SAAS,aAAa,GAAG;AACzB,IAAI,OAAO;AACX,QAAQ,OAAO,EAAE,CAAC,CAAC;AACnB,QAAQ,UAAU,EAAE,CAAC,CAAC;AACtB,QAAQ,SAAS,EAAE,CAAC,CAAC;AACrB,KAAK,CAAC;AACN,CAAC;AACD;AACA;AACA;AACA;AACA,SAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;AAC5D,IAAI,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;AACrD,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;AAChB,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACnC,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE;AACzB,QAAQ,IAAI,MAAM,KAAK,UAAU,EAAE;AACnC,YAAY,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAACA,QAAM,CAAC,KAAK,MAAM,CAAC;AAC/E,YAAY,OAAO,SAAS,CAAC;AAC7B,SAAS;AACT,QAAQ,IAAI,MAAM,IAAI,UAAU,EAAE;AAClC;AACA,YAAY,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AACnD,SAAS;AACT,aAAa;AACb,YAAY,IAAI,GAAG,SAAS,CAAC;AAC7B,SAAS;AACT,KAAK;AACL,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACxB,IAAI,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;AAC9B,IAAI,QAAQ,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;AACzE,CAAC;AA0CD;AACA,MAAM,MAAM,GAAG,UAAU,GAAG,EAAE,MAAM,EAAE;AACtC,IAAI,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACnE,IAAI,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC;AAC/B,QAAQ,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC;AACvB,IAAI,MAAM,cAAc,GAAG,EAAE,CAAC;AAC9B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;AACrB,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;AAChC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,IAAI,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACzC,QAAQ,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1C,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACtG,KAAK;AACL,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtG,KAAK;AACL,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,OAAO,EAAE,CAAC;AAClB,QAAQ,IAAI,EAAE,MAAM,CAAC,IAAI;AACzB,QAAQ,KAAK;AACb,QAAQ,OAAO;AACf,QAAQ,cAAc;AACtB,QAAQ,QAAQ;AAChB,KAAK,CAAC;AACN,IAAI,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC;AACF,SAAS,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE;AACrG,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5C,IAAI,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AACtE,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;AACzC,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AACrC,IAAI,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AACzC,IAAI,MAAM,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;AACpC,IAAI,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACrC,IAAI,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7F,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B;AACA,IAAI,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE;AACtD,QAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B;AACA;AACA;AACA,IAAI,MAAM,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;AACxC,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AACpD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAClC,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAChC;AACA;AACA,QAAQ,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACrF;AACA;AACA,QAAQ,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;AACnD,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,YAAY,MAAM,MAAM,GAAG,OAAO,GAAG,GAAG,CAACA,QAAM,CAAC,CAAC;AACjD;AACA;AACA,YAAY,IAAI,CAAC,KAAK,KAAK,IAAI,MAAM,IAAI,UAAU;AACnD,gBAAgB,MAAM;AACtB,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,gBAAgB,SAAS;AACzB,aAAa;AACb,YAAY,MAAM,YAAY,GAAG,aAAa,GAAG,GAAG,CAACC,eAAa,CAAC,CAAC;AACpE,YAAY,MAAM,UAAU,GAAG,GAAG,CAACC,aAAW,CAAC,CAAC;AAChD,YAAY,MAAM,YAAY,GAAG,GAAG,CAACC,eAAa,CAAC,CAAC;AACpD,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AAC3E,gBAAgB,SAAS;AACzB,aAAa;AACb,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,GAAG,CAACC,aAAW,CAAC,CAAC,CAAC,CAAC;AACvG,SAAS;AACT,KAAK;AACL,CAAC;AACD,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE;AAC5B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;AACzC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AACD;AACA;AACA;AACA;AACA,SAAS,kBAAkB,CAAC,GAAG,EAAE;AACjC,IAAI,MAAM,cAAc,GAAG,EAAE,CAAC;AAC9B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;AAChC,QAAQ,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjC,IAAI,OAAO,cAAc,CAAC;AAC1B,CAAC;AACD;AACA,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/C,IAAI,MAAM,EAAE,IAAI;AAChB,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,MAAM,EAAE,IAAI;AAChB,IAAI,IAAI,EAAE,IAAI;AACd,CAAC,CAAC,CAAC;AAC+B,MAAM,CAAC,MAAM,CAAC;AAChD,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,MAAM,EAAE,IAAI;AAChB,CAAC,EAAE;AACH,MAAM,aAAa,GAAG,uDAAuD,CAAC;AAC9E,MAAM,eAAe,GAAG,yEAAyE,CAAC;AAClG,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC;AAC7B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAK/B;AACA;AACA;AACA,IAAI,eAAe,CAAC;AAMpB;AACA;AACA;AACA;AACA;AACA,IAAI,mBAAmB,CAAC;AAaxB;AACA;AACA;AACA;AACA,IAAI,mBAAmB,CAAC;AAWxB,MAAM,QAAQ,CAAC;AACf,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE;AAC7B,QAAQ,IAAI,CAAC,YAAY,GAAG,aAAa,EAAE,CAAC;AAC5C,QAAQ,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AACpC,QAAQ,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;AACxC,QAAQ,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC;AACjD,QAAQ,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,WAAW,KAAK,QAAQ;AACrD,YAAY,OAAO,GAAG,CAAC;AACvB,QAAQ,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAC1D,QAAQ,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AACrF,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/B,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACzB,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B,QAAQ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AACrC,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/B,QAAQ,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AAC7C,QAAQ,IAAI,UAAU,IAAI,MAAM,EAAE;AAClC,YAAY,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E,YAAY,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9E,SAAS;AACT,aAAa;AACb,YAAY,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/D,SAAS;AACT,QAAQ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;AACpC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC1C,YAAY,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACrC,YAAY,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;AACtC,SAAS;AACT,aAAa;AACb,YAAY,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;AACtC,YAAY,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC1D,SAAS;AACT,KAAK;AACL,CAAC;AACD,CAAC,MAAM;AAKP,IAAI,eAAe,GAAG,CAAC,GAAG,KAAK;AAC/B,QAAQ,QAAQ,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE;AACvE,KAAK,CAAC;AASN,IAAI,mBAAmB,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;AAC3D,QAAQ,IAAI,EAAE,CAAC;AACf,QAAQ,IAAI,IAAI,GAAG,CAAC;AACpB,YAAY,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAC3C,QAAQ,IAAI,MAAM,GAAG,CAAC;AACtB,YAAY,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AAC7C,QAAQ,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AAC7C;AACA;AACA,QAAQ,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;AAClC,YAAY,OAAO,wBAAwB,CAAC;AAC5C,QAAQ,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,oBAAoB,CAAC,CAAC;AAC1H,QAAQ,IAAI,OAAO,IAAI,IAAI;AAC3B,YAAY,OAAO,wBAAwB,CAAC;AAC5C,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;AAC/B,YAAY,OAAO,wBAAwB,CAAC;AAC5C,QAAQ,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;AAC/C,QAAQ,OAAO;AACf,YAAY,MAAM,EAAE,eAAe,CAAC,OAAO,CAACH,eAAa,CAAC,CAAC;AAC3D,YAAY,IAAI,EAAE,OAAO,CAACC,aAAW,CAAC,GAAG,CAAC;AAC1C,YAAY,MAAM,EAAE,OAAO,CAACC,eAAa,CAAC;AAC1C,YAAY,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAACC,aAAW,CAAC,CAAC,GAAG,IAAI;AAC3E,SAAS,CAAC;AACV,KAAK,CAAC;AAyDN,IAAI,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK;AAC3C,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC7C,QAAQ,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;AAC5B,QAAQ,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnD,QAAQ,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AACvC,QAAQ,OAAO,MAAM,CAAC;AACtB,KAAK,CAAC;AAuBN,CAAC,GAAG,CAAC;AACL,SAAS,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAClE,IAAI,IAAI,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnE,IAAI,IAAI,KAAK,EAAE;AACf,QAAQ,KAAK,GAAG,CAAC,IAAI,KAAK,iBAAiB,GAAG,UAAU,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAChG,KAAK;AACL,SAAS,IAAI,IAAI,KAAK,iBAAiB;AACvC,QAAQ,KAAK,EAAE,CAAC;AAChB,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM;AACjD,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3B;;AC9fA;AACA;AACA;AACA,IAAI,GAAG,CAAC;AACR;AACA;AACA;AACA;AACA,IAAI,GAAG,CAAC;AAKR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,CAAC;AACf,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC5C,QAAQ,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AACxB,KAAK;AACL,CAAC;AACD,CAAC,MAAM;AACP,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChD,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK;AAC3B;AACA,QAAQ,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACvC,QAAQ,IAAI,KAAK,KAAK,SAAS;AAC/B,YAAY,OAAO,KAAK,CAAC;AACzB,QAAQ,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;AACpD,QAAQ,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACpD,KAAK,CAAC;AAQN,CAAC,GAAG;;ACxCJ,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB;AACA,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;AAiBnB;AACA;AACA;AACA;AACA;AACA,IAAI,eAAe,CAAC;AACpB;AACA;AACA;AACA,IAAI,gBAAgB,CAAC;AACrB;AACA;AACA;AACA;AACA,IAAI,YAAY,CAAC;AACjB;AACA;AACA;AACA;AACA,IAAI,YAAY,CAAC;AAUjB;AACA,IAAI,kBAAkB,CAAC;AACvB;AACA;AACA;AACA,MAAM,UAAU,CAAC;AACjB,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE;AAC3C,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;AACrC,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AACvC,QAAQ,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAClC,QAAQ,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AAC5B,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACzB,QAAQ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AACrC,KAAK;AACL,CAAC;AACD,CAAC,MAAM;AAUP,IAAI,eAAe,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK;AACxC,QAAQ,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACtD,KAAK,CAAC;AACN,IAAI,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK;AACjD,QAAQ,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;AAC3E,QAAQ,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;AACvD,KAAK,CAAC;AACN,IAAI,YAAY,GAAG,CAAC,GAAG,KAAK;AAC5B,QAAQ,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC;AAClI,QAAQ,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACxC,QAAQ,OAAO;AACf,YAAY,OAAO,EAAE,CAAC;AACtB,YAAY,IAAI,EAAE,IAAI,IAAI,SAAS;AACnC,YAAY,KAAK,EAAE,KAAK,CAAC,KAAK;AAC9B,YAAY,UAAU,EAAE,UAAU,IAAI,SAAS;AAC/C,YAAY,OAAO,EAAE,OAAO,CAAC,KAAK;AAClC,YAAY,cAAc;AAC1B,YAAY,QAAQ;AACpB,SAAS,CAAC;AACV,KAAK,CAAC;AACN,IAAI,YAAY,GAAG,CAAC,GAAG,KAAK;AAC5B,QAAQ,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AAC1C,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjG,KAAK,CAAC;AAgCN;AACA,IAAI,kBAAkB,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,KAAK;AACxG,QAAQ,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC;AAChH,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,QAAQ,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACtD,QAAQ,IAAI,CAAC,MAAM,EAAE;AACrB,YAAY,IAAI,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;AACvD,gBAAgB,OAAO;AACvB,YAAY,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,SAAS;AACT,QAAQ,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,QAAQ,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;AAC7D,QAAQ,IAAI,YAAY,KAAK,cAAc,CAAC,MAAM;AAClD,YAAY,cAAc,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;AAChD,QAAQ,IAAI,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;AACrG,YAAY,OAAO;AACnB,SAAS;AACT,QAAQ,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI;AACvC,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;AAC7E,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AACnE,KAAK,CAAC;AACN,CAAC,GAAG,CAAC;AACL,SAAS,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;AAClC,IAAI,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;AACnD,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACzB,KAAK;AACL,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AACD,SAAS,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE;AACzC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;AAC5B,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;AACjD,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;AACxC,YAAY,MAAM;AAClB,KAAK;AACL,IAAI,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,SAAS,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACrC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC/C,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,KAAK;AACL,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACzB,CAAC;AACD,SAAS,qBAAqB,CAAC,QAAQ,EAAE;AACzC,IAAI,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;AAChC,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC;AACrB,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAChD,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;AAClC,YAAY,MAAM;AAClB,KAAK;AACL,IAAI,IAAI,GAAG,GAAG,MAAM;AACpB,QAAQ,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;AAC9B,CAAC;AAKD,SAAS,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE;AACrC;AACA;AACA,IAAI,IAAI,KAAK,KAAK,CAAC;AACnB,QAAQ,OAAO,IAAI,CAAC;AACpB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACjC;AACA;AACA;AACA,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AACD,SAAS,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE;AACrF;AACA,IAAI,IAAI,KAAK,KAAK,CAAC;AACnB,QAAQ,OAAO,KAAK,CAAC;AACrB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACjC;AACA,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AACzB,QAAQ,OAAO,KAAK,CAAC;AACrB;AACA;AACA,IAAI,QAAQ,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;AAChD,QAAQ,UAAU,KAAK,IAAI,CAAC,WAAW,CAAC;AACxC,QAAQ,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;AAC5C,QAAQ,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,EAAE;AAC1E,CAAC;AACD,SAAS,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE;AACpD,IAAI,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;AAC1D,IAAI,IAAI,CAAC,MAAM,EAAE;AACjB,QAAQ,OAAO,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/G,KAAK;AACL,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC;AACrB,IAAI,OAAO,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChI;;MCnNa,iBAAiB;IAQ5B,YAAY,GAA4C,EAAE,MAAoC;QAC5F,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;KAC5C;IAED,mBAAmB,CACjB,MAAiD;QAEjD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KAC/C;IAED,OAAO;;KAEN;CACF;MAEY,kBAAkB;IAG7B,YAAY,IAAiD;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;KAClC;IAED,UAAU,CAAC,OAA8C;QACvD,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KACrC;IAED,gBAAgB,CACd,MAA8C,EAC9C,OAA+C;QAE/C,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C;IAED,MAAM;QACJ,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAChC;IAED,YAAY;QACV,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAChC;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/dist/source-map.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sourceMap = {}));\n})(this, (function (exports) { 'use strict';\n\n    const comma = ','.charCodeAt(0);\n    const semicolon = ';'.charCodeAt(0);\n    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n    const intToChar = new Uint8Array(64); // 64 possible chars.\n    const charToInteger = new Uint8Array(128); // z is 122 in ASCII\n    for (let i = 0; i < chars.length; i++) {\n        const c = chars.charCodeAt(i);\n        charToInteger[c] = i;\n        intToChar[i] = c;\n    }\n    // Provide a fallback for older environments.\n    const td = typeof TextDecoder !== 'undefined'\n        ? new TextDecoder()\n        : typeof Buffer !== 'undefined'\n            ? {\n                decode(buf) {\n                    const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n                    return out.toString();\n                },\n            }\n            : {\n                decode(buf) {\n                    let out = '';\n                    for (let i = 0; i < buf.length; i++) {\n                        out += String.fromCharCode(buf[i]);\n                    }\n                    return out;\n                },\n            };\n    function decode(mappings) {\n        const state = new Int32Array(5);\n        const decoded = [];\n        let line = [];\n        let sorted = true;\n        let lastCol = 0;\n        for (let i = 0; i < mappings.length;) {\n            const c = mappings.charCodeAt(i);\n            if (c === comma) {\n                i++;\n            }\n            else if (c === semicolon) {\n                state[0] = lastCol = 0;\n                if (!sorted)\n                    sort(line);\n                sorted = true;\n                decoded.push(line);\n                line = [];\n                i++;\n            }\n            else {\n                i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn\n                const col = state[0];\n                if (col < lastCol)\n                    sorted = false;\n                lastCol = col;\n                if (!hasMoreSegments(mappings, i)) {\n                    line.push([col]);\n                    continue;\n                }\n                i = decodeInteger(mappings, i, state, 1); // sourceFileIndex\n                i = decodeInteger(mappings, i, state, 2); // sourceCodeLine\n                i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn\n                if (!hasMoreSegments(mappings, i)) {\n                    line.push([col, state[1], state[2], state[3]]);\n                    continue;\n                }\n                i = decodeInteger(mappings, i, state, 4); // nameIndex\n                line.push([col, state[1], state[2], state[3], state[4]]);\n            }\n        }\n        if (!sorted)\n            sort(line);\n        decoded.push(line);\n        return decoded;\n    }\n    function decodeInteger(mappings, pos, state, j) {\n        let value = 0;\n        let shift = 0;\n        let integer = 0;\n        do {\n            const c = mappings.charCodeAt(pos++);\n            integer = charToInteger[c];\n            value |= (integer & 31) << shift;\n            shift += 5;\n        } while (integer & 32);\n        const shouldNegate = value & 1;\n        value >>>= 1;\n        if (shouldNegate) {\n            value = -0x80000000 | -value;\n        }\n        state[j] += value;\n        return pos;\n    }\n    function hasMoreSegments(mappings, i) {\n        if (i >= mappings.length)\n            return false;\n        const c = mappings.charCodeAt(i);\n        if (c === comma || c === semicolon)\n            return false;\n        return true;\n    }\n    function sort(line) {\n        line.sort(sortComparator$1);\n    }\n    function sortComparator$1(a, b) {\n        return a[0] - b[0];\n    }\n    function encode(decoded) {\n        const state = new Int32Array(5);\n        let buf = new Uint8Array(1024);\n        let pos = 0;\n        for (let i = 0; i < decoded.length; i++) {\n            const line = decoded[i];\n            if (i > 0) {\n                buf = reserve(buf, pos, 1);\n                buf[pos++] = semicolon;\n            }\n            if (line.length === 0)\n                continue;\n            state[0] = 0;\n            for (let j = 0; j < line.length; j++) {\n                const segment = line[j];\n                // We can push up to 5 ints, each int can take at most 7 chars, and we\n                // may push a comma.\n                buf = reserve(buf, pos, 36);\n                if (j > 0)\n                    buf[pos++] = comma;\n                pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn\n                if (segment.length === 1)\n                    continue;\n                pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex\n                pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine\n                pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn\n                if (segment.length === 4)\n                    continue;\n                pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex\n            }\n        }\n        return td.decode(buf.subarray(0, pos));\n    }\n    function reserve(buf, pos, count) {\n        if (buf.length > pos + count)\n            return buf;\n        const swap = new Uint8Array(buf.length * 2);\n        swap.set(buf);\n        return swap;\n    }\n    function encodeInteger(buf, pos, state, segment, j) {\n        const next = segment[j];\n        let num = next - state[j];\n        state[j] = next;\n        num = num < 0 ? (-num << 1) | 1 : num << 1;\n        do {\n            let clamped = num & 0b011111;\n            num >>>= 5;\n            if (num > 0)\n                clamped |= 0b100000;\n            buf[pos++] = intToChar[clamped];\n        } while (num > 0);\n        return pos;\n    }\n\n    // Matches the scheme of a URL, eg \"http://\"\n    const schemeRegex = /^[\\w+.-]+:\\/\\//;\n    /**\n     * Matches the parts of a URL:\n     * 1. Scheme, including \":\", guaranteed.\n     * 2. User/password, including \"@\", optional.\n     * 3. Host, guaranteed.\n     * 4. Port, including \":\", optional.\n     * 5. Path, including \"/\", optional.\n     */\n    const urlRegex = /^([\\w+.-]+:)\\/\\/([^@/#?]*@)?([^:/#?]*)(:\\d+)?(\\/[^#?]*)?/;\n    /**\n     * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\n     * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\n     *\n     * 1. Host, optional.\n     * 2. Path, which may inclue \"/\", guaranteed.\n     */\n    const fileRegex = /^file:(?:\\/\\/((?![a-z]:)[^/]*)?)?(\\/?.*)/i;\n    function isAbsoluteUrl(input) {\n        return schemeRegex.test(input);\n    }\n    function isSchemeRelativeUrl(input) {\n        return input.startsWith('//');\n    }\n    function isAbsolutePath(input) {\n        return input.startsWith('/');\n    }\n    function isFileUrl(input) {\n        return input.startsWith('file:');\n    }\n    function parseAbsoluteUrl(input) {\n        const match = urlRegex.exec(input);\n        return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');\n    }\n    function parseFileUrl(input) {\n        const match = fileRegex.exec(input);\n        const path = match[2];\n        return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);\n    }\n    function makeUrl(scheme, user, host, port, path) {\n        return {\n            scheme,\n            user,\n            host,\n            port,\n            path,\n            relativePath: false,\n        };\n    }\n    function parseUrl(input) {\n        if (isSchemeRelativeUrl(input)) {\n            const url = parseAbsoluteUrl('http:' + input);\n            url.scheme = '';\n            return url;\n        }\n        if (isAbsolutePath(input)) {\n            const url = parseAbsoluteUrl('http://foo.com' + input);\n            url.scheme = '';\n            url.host = '';\n            return url;\n        }\n        if (isFileUrl(input))\n            return parseFileUrl(input);\n        if (isAbsoluteUrl(input))\n            return parseAbsoluteUrl(input);\n        const url = parseAbsoluteUrl('http://foo.com/' + input);\n        url.scheme = '';\n        url.host = '';\n        url.relativePath = true;\n        return url;\n    }\n    function stripPathFilename(path) {\n        // If a path ends with a parent directory \"..\", then it's a relative path with excess parent\n        // paths. It's not a file, so we can't strip it.\n        if (path.endsWith('/..'))\n            return path;\n        const index = path.lastIndexOf('/');\n        return path.slice(0, index + 1);\n    }\n    function mergePaths(url, base) {\n        // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.\n        if (!url.relativePath)\n            return;\n        normalizePath(base);\n        // If the path is just a \"/\", then it was an empty path to begin with (remember, we're a relative\n        // path).\n        if (url.path === '/') {\n            url.path = base.path;\n        }\n        else {\n            // Resolution happens relative to the base path's directory, not the file.\n            url.path = stripPathFilename(base.path) + url.path;\n        }\n        // If the base path is absolute, then our path is now absolute too.\n        url.relativePath = base.relativePath;\n    }\n    /**\n     * The path can have empty directories \"//\", unneeded parents \"foo/..\", or current directory\n     * \"foo/.\". We need to normalize to a standard representation.\n     */\n    function normalizePath(url) {\n        const { relativePath } = url;\n        const pieces = url.path.split('/');\n        // We need to preserve the first piece always, so that we output a leading slash. The item at\n        // pieces[0] is an empty string.\n        let pointer = 1;\n        // Positive is the number of real directories we've output, used for popping a parent directory.\n        // Eg, \"foo/bar/..\" will have a positive 2, and we can decrement to be left with just \"foo\".\n        let positive = 0;\n        // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \"foo/\" will\n        // generate `[\"foo\", \"\"]` pieces). And, if we pop a parent directory. But once we encounter a\n        // real directory, we won't need to append, unless the other conditions happen again.\n        let addTrailingSlash = false;\n        for (let i = 1; i < pieces.length; i++) {\n            const piece = pieces[i];\n            // An empty directory, could be a trailing slash, or just a double \"//\" in the path.\n            if (!piece) {\n                addTrailingSlash = true;\n                continue;\n            }\n            // If we encounter a real directory, then we don't need to append anymore.\n            addTrailingSlash = false;\n            // A current directory, which we can always drop.\n            if (piece === '.')\n                continue;\n            // A parent directory, we need to see if there are any real directories we can pop. Else, we\n            // have an excess of parents, and we'll need to keep the \"..\".\n            if (piece === '..') {\n                if (positive) {\n                    addTrailingSlash = true;\n                    positive--;\n                    pointer--;\n                }\n                else if (relativePath) {\n                    // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\n                    // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\n                    pieces[pointer++] = piece;\n                }\n                continue;\n            }\n            // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\n            // any popped or dropped directories.\n            pieces[pointer++] = piece;\n            positive++;\n        }\n        let path = '';\n        for (let i = 1; i < pointer; i++) {\n            path += '/' + pieces[i];\n        }\n        if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\n            path += '/';\n        }\n        url.path = path;\n    }\n    /**\n     * Attempts to resolve `input` URL/path relative to `base`.\n     */\n    function resolve$1(input, base) {\n        if (!input && !base)\n            return '';\n        const url = parseUrl(input);\n        // If we have a base, and the input isn't already an absolute URL, then we need to merge.\n        if (base && !url.scheme) {\n            const baseUrl = parseUrl(base);\n            url.scheme = baseUrl.scheme;\n            // If there's no host, then we were just a path.\n            if (!url.host) {\n                // The host, user, and port are joined, you can't copy one without the others.\n                url.user = baseUrl.user;\n                url.host = baseUrl.host;\n                url.port = baseUrl.port;\n            }\n            mergePaths(url, baseUrl);\n        }\n        normalizePath(url);\n        // If the input (and base, if there was one) are both relative, then we need to output a relative.\n        if (url.relativePath) {\n            // The first char is always a \"/\".\n            const path = url.path.slice(1);\n            if (!path)\n                return '.';\n            // If base started with a leading \".\", or there is no base and input started with a \".\", then we\n            // need to ensure that the relative path starts with a \".\". We don't know if relative starts\n            // with a \"..\", though, so check before prepending.\n            const keepRelative = (base || input).startsWith('.');\n            return !keepRelative || path.startsWith('.') ? path : './' + path;\n        }\n        // If there's no host (and no scheme/user/port), then we need to output an absolute path.\n        if (!url.scheme && !url.host)\n            return url.path;\n        // We're outputting either an absolute URL, or a protocol relative one.\n        return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;\n    }\n\n    function resolve(input, base) {\n        // The base is always treated as a directory, if it's not empty.\n        // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\n        // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\n        if (base && !base.endsWith('/'))\n            base += '/';\n        return resolve$1(input, base);\n    }\n\n    /**\n     * Removes everything after the last \"/\", but leaves the slash.\n     */\n    function stripFilename(path) {\n        if (!path)\n            return '';\n        const index = path.lastIndexOf('/');\n        return path.slice(0, index + 1);\n    }\n\n    const COLUMN$1 = 0;\n    const SOURCES_INDEX$1 = 1;\n    const SOURCE_LINE$1 = 2;\n    const SOURCE_COLUMN$1 = 3;\n    const NAMES_INDEX$1 = 4;\n\n    function maybeSort(mappings, owned) {\n        const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\n        if (unsortedIndex === mappings.length)\n            return mappings;\n        // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\n        // not, we do not want to modify the consumer's input array.\n        if (!owned)\n            mappings = mappings.slice();\n        for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\n            mappings[i] = sortSegments(mappings[i], owned);\n        }\n        return mappings;\n    }\n    function nextUnsortedSegmentLine(mappings, start) {\n        for (let i = start; i < mappings.length; i++) {\n            if (!isSorted(mappings[i]))\n                return i;\n        }\n        return mappings.length;\n    }\n    function isSorted(line) {\n        for (let j = 1; j < line.length; j++) {\n            if (line[j][COLUMN$1] < line[j - 1][COLUMN$1]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    function sortSegments(line, owned) {\n        if (!owned)\n            line = line.slice();\n        return line.sort(sortComparator);\n    }\n    function sortComparator(a, b) {\n        return a[COLUMN$1] - b[COLUMN$1];\n    }\n\n    let found = false;\n    /**\n     * A binary search implementation that returns the index if a match is found.\n     * If no match is found, then the left-index (the index associated with the item that comes just\n     * before the desired index) is returned. To maintain proper sort order, a splice would happen at\n     * the next index:\n     *\n     * ```js\n     * const array = [1, 3];\n     * const needle = 2;\n     * const index = binarySearch(array, needle, (item, needle) => item - needle);\n     *\n     * assert.equal(index, 0);\n     * array.splice(index + 1, 0, needle);\n     * assert.deepEqual(array, [1, 2, 3]);\n     * ```\n     */\n    function binarySearch(haystack, needle, low, high) {\n        while (low <= high) {\n            const mid = low + ((high - low) >> 1);\n            const cmp = haystack[mid][COLUMN$1] - needle;\n            if (cmp === 0) {\n                found = true;\n                return mid;\n            }\n            if (cmp < 0) {\n                low = mid + 1;\n            }\n            else {\n                high = mid - 1;\n            }\n        }\n        found = false;\n        return low - 1;\n    }\n    function upperBound(haystack, needle, index) {\n        for (let i = index + 1; i < haystack.length; i++, index++) {\n            if (haystack[i][COLUMN$1] !== needle)\n                break;\n        }\n        return index;\n    }\n    function lowerBound(haystack, needle, index) {\n        for (let i = index - 1; i >= 0; i--, index--) {\n            if (haystack[i][COLUMN$1] !== needle)\n                break;\n        }\n        return index;\n    }\n    function memoizedState() {\n        return {\n            lastKey: -1,\n            lastNeedle: -1,\n            lastIndex: -1,\n        };\n    }\n    /**\n     * This overly complicated beast is just to record the last tested line/column and the resulting\n     * index, allowing us to skip a few tests if mappings are monotonically increasing.\n     */\n    function memoizedBinarySearch(haystack, needle, state, key) {\n        const { lastKey, lastNeedle, lastIndex } = state;\n        let low = 0;\n        let high = haystack.length - 1;\n        if (key === lastKey) {\n            if (needle === lastNeedle) {\n                found = lastIndex !== -1 && haystack[lastIndex][COLUMN$1] === needle;\n                return lastIndex;\n            }\n            if (needle >= lastNeedle) {\n                // lastIndex may be -1 if the previous needle was not found.\n                low = lastIndex === -1 ? 0 : lastIndex;\n            }\n            else {\n                high = lastIndex;\n            }\n        }\n        state.lastKey = key;\n        state.lastNeedle = needle;\n        return (state.lastIndex = binarySearch(haystack, needle, low, high));\n    }\n\n    const AnyMap = function (map, mapUrl) {\n        const parsed = typeof map === 'string' ? JSON.parse(map) : map;\n        if (!('sections' in parsed))\n            return new TraceMap(parsed, mapUrl);\n        const mappings = [];\n        const sources = [];\n        const sourcesContent = [];\n        const names = [];\n        const { sections } = parsed;\n        let i = 0;\n        for (; i < sections.length - 1; i++) {\n            const no = sections[i + 1].offset;\n            addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);\n        }\n        if (sections.length > 0) {\n            addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);\n        }\n        const joined = {\n            version: 3,\n            file: parsed.file,\n            names,\n            sources,\n            sourcesContent,\n            mappings,\n        };\n        return presortedDecodedMap(joined);\n    };\n    function addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {\n        const map = AnyMap(section.map, mapUrl);\n        const { line: lineOffset, column: columnOffset } = section.offset;\n        const sourcesOffset = sources.length;\n        const namesOffset = names.length;\n        const decoded = decodedMappings(map);\n        const { resolvedSources } = map;\n        append(sources, resolvedSources);\n        append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));\n        append(names, map.names);\n        // If this section jumps forwards several lines, we need to add lines to the output mappings catch up.\n        for (let i = mappings.length; i <= lineOffset; i++)\n            mappings.push([]);\n        // We can only add so many lines before we step into the range that the next section's map\n        // controls. When we get to the last line, then we'll start checking the segments to see if\n        // they've crossed into the column range.\n        const stopI = stopLine - lineOffset;\n        const len = Math.min(decoded.length, stopI + 1);\n        for (let i = 0; i < len; i++) {\n            const line = decoded[i];\n            // On the 0th loop, the line will already exist due to a previous section, or the line catch up\n            // loop above.\n            const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);\n            // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\n            // map can be multiple lines), it doesn't.\n            const cOffset = i === 0 ? columnOffset : 0;\n            for (let j = 0; j < line.length; j++) {\n                const seg = line[j];\n                const column = cOffset + seg[COLUMN$1];\n                // If this segment steps into the column range that the next section's map controls, we need\n                // to stop early.\n                if (i === stopI && column >= stopColumn)\n                    break;\n                if (seg.length === 1) {\n                    out.push([column]);\n                    continue;\n                }\n                const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX$1];\n                const sourceLine = seg[SOURCE_LINE$1];\n                const sourceColumn = seg[SOURCE_COLUMN$1];\n                if (seg.length === 4) {\n                    out.push([column, sourcesIndex, sourceLine, sourceColumn]);\n                    continue;\n                }\n                out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX$1]]);\n            }\n        }\n    }\n    function append(arr, other) {\n        for (let i = 0; i < other.length; i++)\n            arr.push(other[i]);\n    }\n    // Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of\n    // equal length to the sources. This is because the sources and sourcesContent are paired arrays,\n    // where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined\n    // sourcemap would desynchronize the sources/contents.\n    function fillSourcesContent(len) {\n        const sourcesContent = [];\n        for (let i = 0; i < len; i++)\n            sourcesContent[i] = null;\n        return sourcesContent;\n    }\n\n    const INVALID_ORIGINAL_MAPPING = Object.freeze({\n        source: null,\n        line: null,\n        column: null,\n        name: null,\n    });\n    Object.freeze({\n        line: null,\n        column: null,\n    });\n    const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\n    const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\n    const LEAST_UPPER_BOUND = -1;\n    const GREATEST_LOWER_BOUND = 1;\n    /**\n     * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\n     */\n    let decodedMappings;\n    /**\n     * A higher-level API to find the source/line/column associated with a generated line/column\n     * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\n     * `source-map` library.\n     */\n    let originalPositionFor;\n    /**\n     * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\n     * maps.\n     */\n    let presortedDecodedMap;\n    class TraceMap {\n        constructor(map, mapUrl) {\n            this._decodedMemo = memoizedState();\n            this._bySources = undefined;\n            this._bySourceMemos = undefined;\n            const isString = typeof map === 'string';\n            if (!isString && map.constructor === TraceMap)\n                return map;\n            const parsed = (isString ? JSON.parse(map) : map);\n            const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\n            this.version = version;\n            this.file = file;\n            this.names = names;\n            this.sourceRoot = sourceRoot;\n            this.sources = sources;\n            this.sourcesContent = sourcesContent;\n            if (sourceRoot || mapUrl) {\n                const from = resolve(sourceRoot || '', stripFilename(mapUrl));\n                this.resolvedSources = sources.map((s) => resolve(s || '', from));\n            }\n            else {\n                this.resolvedSources = sources.map((s) => s || '');\n            }\n            const { mappings } = parsed;\n            if (typeof mappings === 'string') {\n                this._encoded = mappings;\n                this._decoded = undefined;\n            }\n            else {\n                this._encoded = undefined;\n                this._decoded = maybeSort(mappings, isString);\n            }\n        }\n    }\n    (() => {\n        decodedMappings = (map) => {\n            return (map._decoded || (map._decoded = decode(map._encoded)));\n        };\n        originalPositionFor = (map, { line, column, bias }) => {\n            line--;\n            if (line < 0)\n                throw new Error(LINE_GTR_ZERO);\n            if (column < 0)\n                throw new Error(COL_GTR_EQ_ZERO);\n            const decoded = decodedMappings(map);\n            // It's common for parent source maps to have pointers to lines that have no\n            // mapping (like a \"//# sourceMappingURL=\") at the end of the child file.\n            if (line >= decoded.length)\n                return INVALID_ORIGINAL_MAPPING;\n            const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);\n            if (segment == null)\n                return INVALID_ORIGINAL_MAPPING;\n            if (segment.length == 1)\n                return INVALID_ORIGINAL_MAPPING;\n            const { names, resolvedSources } = map;\n            return {\n                source: resolvedSources[segment[SOURCES_INDEX$1]],\n                line: segment[SOURCE_LINE$1] + 1,\n                column: segment[SOURCE_COLUMN$1],\n                name: segment.length === 5 ? names[segment[NAMES_INDEX$1]] : null,\n            };\n        };\n        presortedDecodedMap = (map, mapUrl) => {\n            const clone = Object.assign({}, map);\n            clone.mappings = [];\n            const tracer = new TraceMap(clone, mapUrl);\n            tracer._decoded = map.mappings;\n            return tracer;\n        };\n    })();\n    function traceSegmentInternal(segments, memo, line, column, bias) {\n        let index = memoizedBinarySearch(segments, column, memo, line);\n        if (found) {\n            index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\n        }\n        else if (bias === LEAST_UPPER_BOUND)\n            index++;\n        if (index === -1 || index === segments.length)\n            return null;\n        return segments[index];\n    }\n\n    /**\n     * Gets the index associated with `key` in the backing array, if it is already present.\n     */\n    let get;\n    /**\n     * Puts `key` into the backing array, if it is not already present. Returns\n     * the index of the `key` in the backing array.\n     */\n    let put;\n    /**\n     * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\n     * index of the `key` in the backing array.\n     *\n     * This is designed to allow synchronizing a second array with the contents of the backing array,\n     * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\n     * and there are never duplicates.\n     */\n    class SetArray {\n        constructor() {\n            this._indexes = { __proto__: null };\n            this.array = [];\n        }\n    }\n    (() => {\n        get = (strarr, key) => strarr._indexes[key];\n        put = (strarr, key) => {\n            // The key may or may not be present. If it is present, it's a number.\n            const index = get(strarr, key);\n            if (index !== undefined)\n                return index;\n            const { array, _indexes: indexes } = strarr;\n            return (indexes[key] = array.push(key) - 1);\n        };\n    })();\n\n    const COLUMN = 0;\n    const SOURCES_INDEX = 1;\n    const SOURCE_LINE = 2;\n    const SOURCE_COLUMN = 3;\n    const NAMES_INDEX = 4;\n\n    const NO_NAME = -1;\n    /**\n     * Same as `addMapping`, but will only add the mapping if it generates useful information in the\n     * resulting map. This only works correctly if mappings are added **in order**, meaning you should\n     * not add a mapping with a lower generated line/column than one that came before.\n     */\n    let maybeAddMapping;\n    /**\n     * Adds/removes the content of the source file to the source map.\n     */\n    let setSourceContent;\n    /**\n     * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n     * a sourcemap, or to JSON.stringify.\n     */\n    let toDecodedMap;\n    /**\n     * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n     * a sourcemap, or to JSON.stringify.\n     */\n    let toEncodedMap;\n    // This split declaration is only so that terser can elminiate the static initialization block.\n    let addSegmentInternal;\n    /**\n     * Provides the state to generate a sourcemap.\n     */\n    class GenMapping {\n        constructor({ file, sourceRoot } = {}) {\n            this._names = new SetArray();\n            this._sources = new SetArray();\n            this._sourcesContent = [];\n            this._mappings = [];\n            this.file = file;\n            this.sourceRoot = sourceRoot;\n        }\n    }\n    (() => {\n        maybeAddMapping = (map, mapping) => {\n            return addMappingInternal(true, map, mapping);\n        };\n        setSourceContent = (map, source, content) => {\n            const { _sources: sources, _sourcesContent: sourcesContent } = map;\n            sourcesContent[put(sources, source)] = content;\n        };\n        toDecodedMap = (map) => {\n            const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n            removeEmptyFinalLines(mappings);\n            return {\n                version: 3,\n                file: file || undefined,\n                names: names.array,\n                sourceRoot: sourceRoot || undefined,\n                sources: sources.array,\n                sourcesContent,\n                mappings,\n            };\n        };\n        toEncodedMap = (map) => {\n            const decoded = toDecodedMap(map);\n            return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });\n        };\n        // Internal helpers\n        addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\n            const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\n            const line = getLine(mappings, genLine);\n            const index = getColumnIndex(line, genColumn);\n            if (!source) {\n                if (skipable && skipSourceless(line, index))\n                    return;\n                return insert(line, index, [genColumn]);\n            }\n            const sourcesIndex = put(sources, source);\n            const namesIndex = name ? put(names, name) : NO_NAME;\n            if (sourcesIndex === sourcesContent.length)\n                sourcesContent[sourcesIndex] = null;\n            if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\n                return;\n            }\n            return insert(line, index, name\n                ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\n                : [genColumn, sourcesIndex, sourceLine, sourceColumn]);\n        };\n    })();\n    function getLine(mappings, index) {\n        for (let i = mappings.length; i <= index; i++) {\n            mappings[i] = [];\n        }\n        return mappings[index];\n    }\n    function getColumnIndex(line, genColumn) {\n        let index = line.length;\n        for (let i = index - 1; i >= 0; index = i--) {\n            const current = line[i];\n            if (genColumn >= current[COLUMN])\n                break;\n        }\n        return index;\n    }\n    function insert(array, index, value) {\n        for (let i = array.length; i > index; i--) {\n            array[i] = array[i - 1];\n        }\n        array[index] = value;\n    }\n    function removeEmptyFinalLines(mappings) {\n        const { length } = mappings;\n        let len = length;\n        for (let i = len - 1; i >= 0; len = i, i--) {\n            if (mappings[i].length > 0)\n                break;\n        }\n        if (len < length)\n            mappings.length = len;\n    }\n    function skipSourceless(line, index) {\n        // The start of a line is already sourceless, so adding a sourceless segment to the beginning\n        // doesn't generate any useful information.\n        if (index === 0)\n            return true;\n        const prev = line[index - 1];\n        // If the previous segment is also sourceless, then adding another sourceless segment doesn't\n        // genrate any new information. Else, this segment will end the source/named segment and point to\n        // a sourceless position, which is useful.\n        return prev.length === 1;\n    }\n    function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {\n        // A source/named segment at the start of a line gives position at that genColumn\n        if (index === 0)\n            return false;\n        const prev = line[index - 1];\n        // If the previous segment is sourceless, then we're transitioning to a source.\n        if (prev.length === 1)\n            return false;\n        // If the previous segment maps to the exact same source position, then this segment doesn't\n        // provide any new position information.\n        return (sourcesIndex === prev[SOURCES_INDEX] &&\n            sourceLine === prev[SOURCE_LINE] &&\n            sourceColumn === prev[SOURCE_COLUMN] &&\n            namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));\n    }\n    function addMappingInternal(skipable, map, mapping) {\n        const { generated, source, original, name } = mapping;\n        if (!source) {\n            return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);\n        }\n        const s = source;\n        return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);\n    }\n\n    class SourceMapConsumer {\n        constructor(map, mapUrl) {\n            const trace = (this._map = new AnyMap(map, mapUrl));\n            this.file = trace.file;\n            this.names = trace.names;\n            this.sourceRoot = trace.sourceRoot;\n            this.sources = trace.resolvedSources;\n            this.sourcesContent = trace.sourcesContent;\n        }\n        originalPositionFor(needle) {\n            return originalPositionFor(this._map, needle);\n        }\n        destroy() {\n            // noop.\n        }\n    }\n    class SourceMapGenerator {\n        constructor(opts) {\n            this._map = new GenMapping(opts);\n        }\n        addMapping(mapping) {\n            maybeAddMapping(this._map, mapping);\n        }\n        setSourceContent(source, content) {\n            setSourceContent(this._map, source, content);\n        }\n        toJSON() {\n            return toEncodedMap(this._map);\n        }\n        toDecodedMap() {\n            return toDecodedMap(this._map);\n        }\n    }\n\n    exports.SourceMapConsumer = SourceMapConsumer;\n    exports.SourceMapGenerator = SourceMapGenerator;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=source-map.umd.js.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/dist/source-map.umd.js.map",
    "content": "{\"version\":3,\"file\":\"source-map.umd.js\",\"sources\":[\"../node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs\",\"../node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs\",\"../node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs\",\"../node_modules/@jridgewell/set-array/dist/set-array.mjs\",\"../node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs\",\"../../src/source-map.ts\"],\"sourcesContent\":[\"const comma = ','.charCodeAt(0);\\nconst semicolon = ';'.charCodeAt(0);\\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\\nconst intToChar = new Uint8Array(64); // 64 possible chars.\\nconst charToInteger = new Uint8Array(128); // z is 122 in ASCII\\nfor (let i = 0; i < chars.length; i++) {\\n    const c = chars.charCodeAt(i);\\n    charToInteger[c] = i;\\n    intToChar[i] = c;\\n}\\n// Provide a fallback for older environments.\\nconst td = typeof TextDecoder !== 'undefined'\\n    ? new TextDecoder()\\n    : typeof Buffer !== 'undefined'\\n        ? {\\n            decode(buf) {\\n                const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\\n                return out.toString();\\n            },\\n        }\\n        : {\\n            decode(buf) {\\n                let out = '';\\n                for (let i = 0; i < buf.length; i++) {\\n                    out += String.fromCharCode(buf[i]);\\n                }\\n                return out;\\n            },\\n        };\\nfunction decode(mappings) {\\n    const state = new Int32Array(5);\\n    const decoded = [];\\n    let line = [];\\n    let sorted = true;\\n    let lastCol = 0;\\n    for (let i = 0; i < mappings.length;) {\\n        const c = mappings.charCodeAt(i);\\n        if (c === comma) {\\n            i++;\\n        }\\n        else if (c === semicolon) {\\n            state[0] = lastCol = 0;\\n            if (!sorted)\\n                sort(line);\\n            sorted = true;\\n            decoded.push(line);\\n            line = [];\\n            i++;\\n        }\\n        else {\\n            i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn\\n            const col = state[0];\\n            if (col < lastCol)\\n                sorted = false;\\n            lastCol = col;\\n            if (!hasMoreSegments(mappings, i)) {\\n                line.push([col]);\\n                continue;\\n            }\\n            i = decodeInteger(mappings, i, state, 1); // sourceFileIndex\\n            i = decodeInteger(mappings, i, state, 2); // sourceCodeLine\\n            i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn\\n            if (!hasMoreSegments(mappings, i)) {\\n                line.push([col, state[1], state[2], state[3]]);\\n                continue;\\n            }\\n            i = decodeInteger(mappings, i, state, 4); // nameIndex\\n            line.push([col, state[1], state[2], state[3], state[4]]);\\n        }\\n    }\\n    if (!sorted)\\n        sort(line);\\n    decoded.push(line);\\n    return decoded;\\n}\\nfunction decodeInteger(mappings, pos, state, j) {\\n    let value = 0;\\n    let shift = 0;\\n    let integer = 0;\\n    do {\\n        const c = mappings.charCodeAt(pos++);\\n        integer = charToInteger[c];\\n        value |= (integer & 31) << shift;\\n        shift += 5;\\n    } while (integer & 32);\\n    const shouldNegate = value & 1;\\n    value >>>= 1;\\n    if (shouldNegate) {\\n        value = -0x80000000 | -value;\\n    }\\n    state[j] += value;\\n    return pos;\\n}\\nfunction hasMoreSegments(mappings, i) {\\n    if (i >= mappings.length)\\n        return false;\\n    const c = mappings.charCodeAt(i);\\n    if (c === comma || c === semicolon)\\n        return false;\\n    return true;\\n}\\nfunction sort(line) {\\n    line.sort(sortComparator);\\n}\\nfunction sortComparator(a, b) {\\n    return a[0] - b[0];\\n}\\nfunction encode(decoded) {\\n    const state = new Int32Array(5);\\n    let buf = new Uint8Array(1024);\\n    let pos = 0;\\n    for (let i = 0; i < decoded.length; i++) {\\n        const line = decoded[i];\\n        if (i > 0) {\\n            buf = reserve(buf, pos, 1);\\n            buf[pos++] = semicolon;\\n        }\\n        if (line.length === 0)\\n            continue;\\n        state[0] = 0;\\n        for (let j = 0; j < line.length; j++) {\\n            const segment = line[j];\\n            // We can push up to 5 ints, each int can take at most 7 chars, and we\\n            // may push a comma.\\n            buf = reserve(buf, pos, 36);\\n            if (j > 0)\\n                buf[pos++] = comma;\\n            pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn\\n            if (segment.length === 1)\\n                continue;\\n            pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex\\n            pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine\\n            pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn\\n            if (segment.length === 4)\\n                continue;\\n            pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex\\n        }\\n    }\\n    return td.decode(buf.subarray(0, pos));\\n}\\nfunction reserve(buf, pos, count) {\\n    if (buf.length > pos + count)\\n        return buf;\\n    const swap = new Uint8Array(buf.length * 2);\\n    swap.set(buf);\\n    return swap;\\n}\\nfunction encodeInteger(buf, pos, state, segment, j) {\\n    const next = segment[j];\\n    let num = next - state[j];\\n    state[j] = next;\\n    num = num < 0 ? (-num << 1) | 1 : num << 1;\\n    do {\\n        let clamped = num & 0b011111;\\n        num >>>= 5;\\n        if (num > 0)\\n            clamped |= 0b100000;\\n        buf[pos++] = intToChar[clamped];\\n    } while (num > 0);\\n    return pos;\\n}\\n\\nexport { decode, encode };\\n//# sourceMappingURL=sourcemap-codec.mjs.map\\n\",\"// Matches the scheme of a URL, eg \\\"http://\\\"\\nconst schemeRegex = /^[\\\\w+.-]+:\\\\/\\\\//;\\n/**\\n * Matches the parts of a URL:\\n * 1. Scheme, including \\\":\\\", guaranteed.\\n * 2. User/password, including \\\"@\\\", optional.\\n * 3. Host, guaranteed.\\n * 4. Port, including \\\":\\\", optional.\\n * 5. Path, including \\\"/\\\", optional.\\n */\\nconst urlRegex = /^([\\\\w+.-]+:)\\\\/\\\\/([^@/#?]*@)?([^:/#?]*)(:\\\\d+)?(\\\\/[^#?]*)?/;\\n/**\\n * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start\\n * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).\\n *\\n * 1. Host, optional.\\n * 2. Path, which may inclue \\\"/\\\", guaranteed.\\n */\\nconst fileRegex = /^file:(?:\\\\/\\\\/((?![a-z]:)[^/]*)?)?(\\\\/?.*)/i;\\nfunction isAbsoluteUrl(input) {\\n    return schemeRegex.test(input);\\n}\\nfunction isSchemeRelativeUrl(input) {\\n    return input.startsWith('//');\\n}\\nfunction isAbsolutePath(input) {\\n    return input.startsWith('/');\\n}\\nfunction isFileUrl(input) {\\n    return input.startsWith('file:');\\n}\\nfunction parseAbsoluteUrl(input) {\\n    const match = urlRegex.exec(input);\\n    return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');\\n}\\nfunction parseFileUrl(input) {\\n    const match = fileRegex.exec(input);\\n    const path = match[2];\\n    return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);\\n}\\nfunction makeUrl(scheme, user, host, port, path) {\\n    return {\\n        scheme,\\n        user,\\n        host,\\n        port,\\n        path,\\n        relativePath: false,\\n    };\\n}\\nfunction parseUrl(input) {\\n    if (isSchemeRelativeUrl(input)) {\\n        const url = parseAbsoluteUrl('http:' + input);\\n        url.scheme = '';\\n        return url;\\n    }\\n    if (isAbsolutePath(input)) {\\n        const url = parseAbsoluteUrl('http://foo.com' + input);\\n        url.scheme = '';\\n        url.host = '';\\n        return url;\\n    }\\n    if (isFileUrl(input))\\n        return parseFileUrl(input);\\n    if (isAbsoluteUrl(input))\\n        return parseAbsoluteUrl(input);\\n    const url = parseAbsoluteUrl('http://foo.com/' + input);\\n    url.scheme = '';\\n    url.host = '';\\n    url.relativePath = true;\\n    return url;\\n}\\nfunction stripPathFilename(path) {\\n    // If a path ends with a parent directory \\\"..\\\", then it's a relative path with excess parent\\n    // paths. It's not a file, so we can't strip it.\\n    if (path.endsWith('/..'))\\n        return path;\\n    const index = path.lastIndexOf('/');\\n    return path.slice(0, index + 1);\\n}\\nfunction mergePaths(url, base) {\\n    // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.\\n    if (!url.relativePath)\\n        return;\\n    normalizePath(base);\\n    // If the path is just a \\\"/\\\", then it was an empty path to begin with (remember, we're a relative\\n    // path).\\n    if (url.path === '/') {\\n        url.path = base.path;\\n    }\\n    else {\\n        // Resolution happens relative to the base path's directory, not the file.\\n        url.path = stripPathFilename(base.path) + url.path;\\n    }\\n    // If the base path is absolute, then our path is now absolute too.\\n    url.relativePath = base.relativePath;\\n}\\n/**\\n * The path can have empty directories \\\"//\\\", unneeded parents \\\"foo/..\\\", or current directory\\n * \\\"foo/.\\\". We need to normalize to a standard representation.\\n */\\nfunction normalizePath(url) {\\n    const { relativePath } = url;\\n    const pieces = url.path.split('/');\\n    // We need to preserve the first piece always, so that we output a leading slash. The item at\\n    // pieces[0] is an empty string.\\n    let pointer = 1;\\n    // Positive is the number of real directories we've output, used for popping a parent directory.\\n    // Eg, \\\"foo/bar/..\\\" will have a positive 2, and we can decrement to be left with just \\\"foo\\\".\\n    let positive = 0;\\n    // We need to keep a trailing slash if we encounter an empty directory (eg, splitting \\\"foo/\\\" will\\n    // generate `[\\\"foo\\\", \\\"\\\"]` pieces). And, if we pop a parent directory. But once we encounter a\\n    // real directory, we won't need to append, unless the other conditions happen again.\\n    let addTrailingSlash = false;\\n    for (let i = 1; i < pieces.length; i++) {\\n        const piece = pieces[i];\\n        // An empty directory, could be a trailing slash, or just a double \\\"//\\\" in the path.\\n        if (!piece) {\\n            addTrailingSlash = true;\\n            continue;\\n        }\\n        // If we encounter a real directory, then we don't need to append anymore.\\n        addTrailingSlash = false;\\n        // A current directory, which we can always drop.\\n        if (piece === '.')\\n            continue;\\n        // A parent directory, we need to see if there are any real directories we can pop. Else, we\\n        // have an excess of parents, and we'll need to keep the \\\"..\\\".\\n        if (piece === '..') {\\n            if (positive) {\\n                addTrailingSlash = true;\\n                positive--;\\n                pointer--;\\n            }\\n            else if (relativePath) {\\n                // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute\\n                // URL, protocol relative URL, or an absolute path, we don't need to keep excess.\\n                pieces[pointer++] = piece;\\n            }\\n            continue;\\n        }\\n        // We've encountered a real directory. Move it to the next insertion pointer, which accounts for\\n        // any popped or dropped directories.\\n        pieces[pointer++] = piece;\\n        positive++;\\n    }\\n    let path = '';\\n    for (let i = 1; i < pointer; i++) {\\n        path += '/' + pieces[i];\\n    }\\n    if (!path || (addTrailingSlash && !path.endsWith('/..'))) {\\n        path += '/';\\n    }\\n    url.path = path;\\n}\\n/**\\n * Attempts to resolve `input` URL/path relative to `base`.\\n */\\nfunction resolve(input, base) {\\n    if (!input && !base)\\n        return '';\\n    const url = parseUrl(input);\\n    // If we have a base, and the input isn't already an absolute URL, then we need to merge.\\n    if (base && !url.scheme) {\\n        const baseUrl = parseUrl(base);\\n        url.scheme = baseUrl.scheme;\\n        // If there's no host, then we were just a path.\\n        if (!url.host) {\\n            // The host, user, and port are joined, you can't copy one without the others.\\n            url.user = baseUrl.user;\\n            url.host = baseUrl.host;\\n            url.port = baseUrl.port;\\n        }\\n        mergePaths(url, baseUrl);\\n    }\\n    normalizePath(url);\\n    // If the input (and base, if there was one) are both relative, then we need to output a relative.\\n    if (url.relativePath) {\\n        // The first char is always a \\\"/\\\".\\n        const path = url.path.slice(1);\\n        if (!path)\\n            return '.';\\n        // If base started with a leading \\\".\\\", or there is no base and input started with a \\\".\\\", then we\\n        // need to ensure that the relative path starts with a \\\".\\\". We don't know if relative starts\\n        // with a \\\"..\\\", though, so check before prepending.\\n        const keepRelative = (base || input).startsWith('.');\\n        return !keepRelative || path.startsWith('.') ? path : './' + path;\\n    }\\n    // If there's no host (and no scheme/user/port), then we need to output an absolute path.\\n    if (!url.scheme && !url.host)\\n        return url.path;\\n    // We're outputting either an absolute URL, or a protocol relative one.\\n    return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;\\n}\\n\\nexport { resolve as default };\\n//# sourceMappingURL=resolve-uri.mjs.map\\n\",\"import { encode, decode } from '@jridgewell/sourcemap-codec';\\nimport resolveUri from '@jridgewell/resolve-uri';\\n\\nfunction resolve(input, base) {\\n    // The base is always treated as a directory, if it's not empty.\\n    // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\\n    // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\\n    if (base && !base.endsWith('/'))\\n        base += '/';\\n    return resolveUri(input, base);\\n}\\n\\n/**\\n * Removes everything after the last \\\"/\\\", but leaves the slash.\\n */\\nfunction stripFilename(path) {\\n    if (!path)\\n        return '';\\n    const index = path.lastIndexOf('/');\\n    return path.slice(0, index + 1);\\n}\\n\\nconst COLUMN = 0;\\nconst SOURCES_INDEX = 1;\\nconst SOURCE_LINE = 2;\\nconst SOURCE_COLUMN = 3;\\nconst NAMES_INDEX = 4;\\nconst REV_GENERATED_LINE = 1;\\nconst REV_GENERATED_COLUMN = 2;\\n\\nfunction maybeSort(mappings, owned) {\\n    const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\\n    if (unsortedIndex === mappings.length)\\n        return mappings;\\n    // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\\n    // not, we do not want to modify the consumer's input array.\\n    if (!owned)\\n        mappings = mappings.slice();\\n    for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\\n        mappings[i] = sortSegments(mappings[i], owned);\\n    }\\n    return mappings;\\n}\\nfunction nextUnsortedSegmentLine(mappings, start) {\\n    for (let i = start; i < mappings.length; i++) {\\n        if (!isSorted(mappings[i]))\\n            return i;\\n    }\\n    return mappings.length;\\n}\\nfunction isSorted(line) {\\n    for (let j = 1; j < line.length; j++) {\\n        if (line[j][COLUMN] < line[j - 1][COLUMN]) {\\n            return false;\\n        }\\n    }\\n    return true;\\n}\\nfunction sortSegments(line, owned) {\\n    if (!owned)\\n        line = line.slice();\\n    return line.sort(sortComparator);\\n}\\nfunction sortComparator(a, b) {\\n    return a[COLUMN] - b[COLUMN];\\n}\\n\\nlet found = false;\\n/**\\n * A binary search implementation that returns the index if a match is found.\\n * If no match is found, then the left-index (the index associated with the item that comes just\\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\\n * the next index:\\n *\\n * ```js\\n * const array = [1, 3];\\n * const needle = 2;\\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\\n *\\n * assert.equal(index, 0);\\n * array.splice(index + 1, 0, needle);\\n * assert.deepEqual(array, [1, 2, 3]);\\n * ```\\n */\\nfunction binarySearch(haystack, needle, low, high) {\\n    while (low <= high) {\\n        const mid = low + ((high - low) >> 1);\\n        const cmp = haystack[mid][COLUMN] - needle;\\n        if (cmp === 0) {\\n            found = true;\\n            return mid;\\n        }\\n        if (cmp < 0) {\\n            low = mid + 1;\\n        }\\n        else {\\n            high = mid - 1;\\n        }\\n    }\\n    found = false;\\n    return low - 1;\\n}\\nfunction upperBound(haystack, needle, index) {\\n    for (let i = index + 1; i < haystack.length; i++, index++) {\\n        if (haystack[i][COLUMN] !== needle)\\n            break;\\n    }\\n    return index;\\n}\\nfunction lowerBound(haystack, needle, index) {\\n    for (let i = index - 1; i >= 0; i--, index--) {\\n        if (haystack[i][COLUMN] !== needle)\\n            break;\\n    }\\n    return index;\\n}\\nfunction memoizedState() {\\n    return {\\n        lastKey: -1,\\n        lastNeedle: -1,\\n        lastIndex: -1,\\n    };\\n}\\n/**\\n * This overly complicated beast is just to record the last tested line/column and the resulting\\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\\n */\\nfunction memoizedBinarySearch(haystack, needle, state, key) {\\n    const { lastKey, lastNeedle, lastIndex } = state;\\n    let low = 0;\\n    let high = haystack.length - 1;\\n    if (key === lastKey) {\\n        if (needle === lastNeedle) {\\n            found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;\\n            return lastIndex;\\n        }\\n        if (needle >= lastNeedle) {\\n            // lastIndex may be -1 if the previous needle was not found.\\n            low = lastIndex === -1 ? 0 : lastIndex;\\n        }\\n        else {\\n            high = lastIndex;\\n        }\\n    }\\n    state.lastKey = key;\\n    state.lastNeedle = needle;\\n    return (state.lastIndex = binarySearch(haystack, needle, low, high));\\n}\\n\\n// Rebuilds the original source files, with mappings that are ordered by source line/column instead\\n// of generated line/column.\\nfunction buildBySources(decoded, memos) {\\n    const sources = memos.map(buildNullArray);\\n    for (let i = 0; i < decoded.length; i++) {\\n        const line = decoded[i];\\n        for (let j = 0; j < line.length; j++) {\\n            const seg = line[j];\\n            if (seg.length === 1)\\n                continue;\\n            const sourceIndex = seg[SOURCES_INDEX];\\n            const sourceLine = seg[SOURCE_LINE];\\n            const sourceColumn = seg[SOURCE_COLUMN];\\n            const originalSource = sources[sourceIndex];\\n            const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));\\n            const memo = memos[sourceIndex];\\n            // The binary search either found a match, or it found the left-index just before where the\\n            // segment should go. Either way, we want to insert after that. And there may be multiple\\n            // generated segments associated with an original location, so there may need to move several\\n            // indexes before we find where we need to insert.\\n            const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));\\n            insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);\\n        }\\n    }\\n    return sources;\\n}\\nfunction insert(array, index, value) {\\n    for (let i = array.length; i > index; i--) {\\n        array[i] = array[i - 1];\\n    }\\n    array[index] = value;\\n}\\n// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like\\n// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.\\n// Numeric properties on objects are magically sorted in ascending order by the engine regardless of\\n// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending\\n// order when iterating with for-in.\\nfunction buildNullArray() {\\n    return { __proto__: null };\\n}\\n\\nconst AnyMap = function (map, mapUrl) {\\n    const parsed = typeof map === 'string' ? JSON.parse(map) : map;\\n    if (!('sections' in parsed))\\n        return new TraceMap(parsed, mapUrl);\\n    const mappings = [];\\n    const sources = [];\\n    const sourcesContent = [];\\n    const names = [];\\n    const { sections } = parsed;\\n    let i = 0;\\n    for (; i < sections.length - 1; i++) {\\n        const no = sections[i + 1].offset;\\n        addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);\\n    }\\n    if (sections.length > 0) {\\n        addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);\\n    }\\n    const joined = {\\n        version: 3,\\n        file: parsed.file,\\n        names,\\n        sources,\\n        sourcesContent,\\n        mappings,\\n    };\\n    return presortedDecodedMap(joined);\\n};\\nfunction addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {\\n    const map = AnyMap(section.map, mapUrl);\\n    const { line: lineOffset, column: columnOffset } = section.offset;\\n    const sourcesOffset = sources.length;\\n    const namesOffset = names.length;\\n    const decoded = decodedMappings(map);\\n    const { resolvedSources } = map;\\n    append(sources, resolvedSources);\\n    append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));\\n    append(names, map.names);\\n    // If this section jumps forwards several lines, we need to add lines to the output mappings catch up.\\n    for (let i = mappings.length; i <= lineOffset; i++)\\n        mappings.push([]);\\n    // We can only add so many lines before we step into the range that the next section's map\\n    // controls. When we get to the last line, then we'll start checking the segments to see if\\n    // they've crossed into the column range.\\n    const stopI = stopLine - lineOffset;\\n    const len = Math.min(decoded.length, stopI + 1);\\n    for (let i = 0; i < len; i++) {\\n        const line = decoded[i];\\n        // On the 0th loop, the line will already exist due to a previous section, or the line catch up\\n        // loop above.\\n        const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);\\n        // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\\n        // map can be multiple lines), it doesn't.\\n        const cOffset = i === 0 ? columnOffset : 0;\\n        for (let j = 0; j < line.length; j++) {\\n            const seg = line[j];\\n            const column = cOffset + seg[COLUMN];\\n            // If this segment steps into the column range that the next section's map controls, we need\\n            // to stop early.\\n            if (i === stopI && column >= stopColumn)\\n                break;\\n            if (seg.length === 1) {\\n                out.push([column]);\\n                continue;\\n            }\\n            const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];\\n            const sourceLine = seg[SOURCE_LINE];\\n            const sourceColumn = seg[SOURCE_COLUMN];\\n            if (seg.length === 4) {\\n                out.push([column, sourcesIndex, sourceLine, sourceColumn]);\\n                continue;\\n            }\\n            out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);\\n        }\\n    }\\n}\\nfunction append(arr, other) {\\n    for (let i = 0; i < other.length; i++)\\n        arr.push(other[i]);\\n}\\n// Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of\\n// equal length to the sources. This is because the sources and sourcesContent are paired arrays,\\n// where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined\\n// sourcemap would desynchronize the sources/contents.\\nfunction fillSourcesContent(len) {\\n    const sourcesContent = [];\\n    for (let i = 0; i < len; i++)\\n        sourcesContent[i] = null;\\n    return sourcesContent;\\n}\\n\\nconst INVALID_ORIGINAL_MAPPING = Object.freeze({\\n    source: null,\\n    line: null,\\n    column: null,\\n    name: null,\\n});\\nconst INVALID_GENERATED_MAPPING = Object.freeze({\\n    line: null,\\n    column: null,\\n});\\nconst LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\\nconst COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\\nconst LEAST_UPPER_BOUND = -1;\\nconst GREATEST_LOWER_BOUND = 1;\\n/**\\n * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\\n */\\nlet encodedMappings;\\n/**\\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\\n */\\nlet decodedMappings;\\n/**\\n * A low-level API to find the segment associated with a generated line/column (think, from a\\n * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\\n */\\nlet traceSegment;\\n/**\\n * A higher-level API to find the source/line/column associated with a generated line/column\\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\\n * `source-map` library.\\n */\\nlet originalPositionFor;\\n/**\\n * Finds the source/line/column directly after the mapping returned by originalPositionFor, provided\\n * the found mapping is from the same source and line as the originalPositionFor mapping.\\n *\\n * Eg, in the code `let id = 1`, `originalPositionAfter` could find the mapping associated with `1`\\n * using the same needle that would return `id` when calling `originalPositionFor`.\\n */\\nlet generatedPositionFor;\\n/**\\n * Iterates each mapping in generated position order.\\n */\\nlet eachMapping;\\n/**\\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\\n * maps.\\n */\\nlet presortedDecodedMap;\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet decodedMap;\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet encodedMap;\\nclass TraceMap {\\n    constructor(map, mapUrl) {\\n        this._decodedMemo = memoizedState();\\n        this._bySources = undefined;\\n        this._bySourceMemos = undefined;\\n        const isString = typeof map === 'string';\\n        if (!isString && map.constructor === TraceMap)\\n            return map;\\n        const parsed = (isString ? JSON.parse(map) : map);\\n        const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\\n        this.version = version;\\n        this.file = file;\\n        this.names = names;\\n        this.sourceRoot = sourceRoot;\\n        this.sources = sources;\\n        this.sourcesContent = sourcesContent;\\n        if (sourceRoot || mapUrl) {\\n            const from = resolve(sourceRoot || '', stripFilename(mapUrl));\\n            this.resolvedSources = sources.map((s) => resolve(s || '', from));\\n        }\\n        else {\\n            this.resolvedSources = sources.map((s) => s || '');\\n        }\\n        const { mappings } = parsed;\\n        if (typeof mappings === 'string') {\\n            this._encoded = mappings;\\n            this._decoded = undefined;\\n        }\\n        else {\\n            this._encoded = undefined;\\n            this._decoded = maybeSort(mappings, isString);\\n        }\\n    }\\n}\\n(() => {\\n    encodedMappings = (map) => {\\n        var _a;\\n        return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = encode(map._decoded)));\\n    };\\n    decodedMappings = (map) => {\\n        return (map._decoded || (map._decoded = decode(map._encoded)));\\n    };\\n    traceSegment = (map, line, column) => {\\n        const decoded = decodedMappings(map);\\n        // It's common for parent source maps to have pointers to lines that have no\\n        // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n        if (line >= decoded.length)\\n            return null;\\n        return traceSegmentInternal(decoded[line], map._decodedMemo, line, column, GREATEST_LOWER_BOUND);\\n    };\\n    originalPositionFor = (map, { line, column, bias }) => {\\n        line--;\\n        if (line < 0)\\n            throw new Error(LINE_GTR_ZERO);\\n        if (column < 0)\\n            throw new Error(COL_GTR_EQ_ZERO);\\n        const decoded = decodedMappings(map);\\n        // It's common for parent source maps to have pointers to lines that have no\\n        // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n        if (line >= decoded.length)\\n            return INVALID_ORIGINAL_MAPPING;\\n        const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);\\n        if (segment == null)\\n            return INVALID_ORIGINAL_MAPPING;\\n        if (segment.length == 1)\\n            return INVALID_ORIGINAL_MAPPING;\\n        const { names, resolvedSources } = map;\\n        return {\\n            source: resolvedSources[segment[SOURCES_INDEX]],\\n            line: segment[SOURCE_LINE] + 1,\\n            column: segment[SOURCE_COLUMN],\\n            name: segment.length === 5 ? names[segment[NAMES_INDEX]] : null,\\n        };\\n    };\\n    generatedPositionFor = (map, { source, line, column, bias }) => {\\n        line--;\\n        if (line < 0)\\n            throw new Error(LINE_GTR_ZERO);\\n        if (column < 0)\\n            throw new Error(COL_GTR_EQ_ZERO);\\n        const { sources, resolvedSources } = map;\\n        let sourceIndex = sources.indexOf(source);\\n        if (sourceIndex === -1)\\n            sourceIndex = resolvedSources.indexOf(source);\\n        if (sourceIndex === -1)\\n            return INVALID_GENERATED_MAPPING;\\n        const generated = (map._bySources || (map._bySources = buildBySources(decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));\\n        const memos = map._bySourceMemos;\\n        const segments = generated[sourceIndex][line];\\n        if (segments == null)\\n            return INVALID_GENERATED_MAPPING;\\n        const segment = traceSegmentInternal(segments, memos[sourceIndex], line, column, bias || GREATEST_LOWER_BOUND);\\n        if (segment == null)\\n            return INVALID_GENERATED_MAPPING;\\n        return {\\n            line: segment[REV_GENERATED_LINE] + 1,\\n            column: segment[REV_GENERATED_COLUMN],\\n        };\\n    };\\n    eachMapping = (map, cb) => {\\n        const decoded = decodedMappings(map);\\n        const { names, resolvedSources } = map;\\n        for (let i = 0; i < decoded.length; i++) {\\n            const line = decoded[i];\\n            for (let j = 0; j < line.length; j++) {\\n                const seg = line[j];\\n                const generatedLine = i + 1;\\n                const generatedColumn = seg[0];\\n                let source = null;\\n                let originalLine = null;\\n                let originalColumn = null;\\n                let name = null;\\n                if (seg.length !== 1) {\\n                    source = resolvedSources[seg[1]];\\n                    originalLine = seg[2] + 1;\\n                    originalColumn = seg[3];\\n                }\\n                if (seg.length === 5)\\n                    name = names[seg[4]];\\n                cb({\\n                    generatedLine,\\n                    generatedColumn,\\n                    source,\\n                    originalLine,\\n                    originalColumn,\\n                    name,\\n                });\\n            }\\n        }\\n    };\\n    presortedDecodedMap = (map, mapUrl) => {\\n        const clone = Object.assign({}, map);\\n        clone.mappings = [];\\n        const tracer = new TraceMap(clone, mapUrl);\\n        tracer._decoded = map.mappings;\\n        return tracer;\\n    };\\n    decodedMap = (map) => {\\n        return {\\n            version: 3,\\n            file: map.file,\\n            names: map.names,\\n            sourceRoot: map.sourceRoot,\\n            sources: map.sources,\\n            sourcesContent: map.sourcesContent,\\n            mappings: decodedMappings(map),\\n        };\\n    };\\n    encodedMap = (map) => {\\n        return {\\n            version: 3,\\n            file: map.file,\\n            names: map.names,\\n            sourceRoot: map.sourceRoot,\\n            sources: map.sources,\\n            sourcesContent: map.sourcesContent,\\n            mappings: encodedMappings(map),\\n        };\\n    };\\n})();\\nfunction traceSegmentInternal(segments, memo, line, column, bias) {\\n    let index = memoizedBinarySearch(segments, column, memo, line);\\n    if (found) {\\n        index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\\n    }\\n    else if (bias === LEAST_UPPER_BOUND)\\n        index++;\\n    if (index === -1 || index === segments.length)\\n        return null;\\n    return segments[index];\\n}\\n\\nexport { AnyMap, GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap, decodedMap, decodedMappings, eachMapping, encodedMap, encodedMappings, generatedPositionFor, originalPositionFor, presortedDecodedMap, traceSegment };\\n//# sourceMappingURL=trace-mapping.mjs.map\\n\",\"/**\\n * Gets the index associated with `key` in the backing array, if it is already present.\\n */\\nlet get;\\n/**\\n * Puts `key` into the backing array, if it is not already present. Returns\\n * the index of the `key` in the backing array.\\n */\\nlet put;\\n/**\\n * Pops the last added item out of the SetArray.\\n */\\nlet pop;\\n/**\\n * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the\\n * index of the `key` in the backing array.\\n *\\n * This is designed to allow synchronizing a second array with the contents of the backing array,\\n * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,\\n * and there are never duplicates.\\n */\\nclass SetArray {\\n    constructor() {\\n        this._indexes = { __proto__: null };\\n        this.array = [];\\n    }\\n}\\n(() => {\\n    get = (strarr, key) => strarr._indexes[key];\\n    put = (strarr, key) => {\\n        // The key may or may not be present. If it is present, it's a number.\\n        const index = get(strarr, key);\\n        if (index !== undefined)\\n            return index;\\n        const { array, _indexes: indexes } = strarr;\\n        return (indexes[key] = array.push(key) - 1);\\n    };\\n    pop = (strarr) => {\\n        const { array, _indexes: indexes } = strarr;\\n        if (array.length === 0)\\n            return;\\n        const last = array.pop();\\n        indexes[last] = undefined;\\n    };\\n})();\\n\\nexport { SetArray, get, pop, put };\\n//# sourceMappingURL=set-array.mjs.map\\n\",\"import { SetArray, put } from '@jridgewell/set-array';\\nimport { encode } from '@jridgewell/sourcemap-codec';\\nimport { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';\\n\\nconst COLUMN = 0;\\nconst SOURCES_INDEX = 1;\\nconst SOURCE_LINE = 2;\\nconst SOURCE_COLUMN = 3;\\nconst NAMES_INDEX = 4;\\n\\nconst NO_NAME = -1;\\n/**\\n * A low-level API to associate a generated position with an original source position. Line and\\n * column here are 0-based, unlike `addMapping`.\\n */\\nlet addSegment;\\n/**\\n * A high-level API to associate a generated position with an original source position. Line is\\n * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.\\n */\\nlet addMapping;\\n/**\\n * Same as `addSegment`, but will only add the segment if it generates useful information in the\\n * resulting map. This only works correctly if segments are added **in order**, meaning you should\\n * not add a segment with a lower generated line/column than one that came before.\\n */\\nlet maybeAddSegment;\\n/**\\n * Same as `addMapping`, but will only add the mapping if it generates useful information in the\\n * resulting map. This only works correctly if mappings are added **in order**, meaning you should\\n * not add a mapping with a lower generated line/column than one that came before.\\n */\\nlet maybeAddMapping;\\n/**\\n * Adds/removes the content of the source file to the source map.\\n */\\nlet setSourceContent;\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet toDecodedMap;\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nlet toEncodedMap;\\n/**\\n * Constructs a new GenMapping, using the already present mappings of the input.\\n */\\nlet fromMap;\\n/**\\n * Returns an array of high-level mapping objects for every recorded segment, which could then be\\n * passed to the `source-map` library.\\n */\\nlet allMappings;\\n// This split declaration is only so that terser can elminiate the static initialization block.\\nlet addSegmentInternal;\\n/**\\n * Provides the state to generate a sourcemap.\\n */\\nclass GenMapping {\\n    constructor({ file, sourceRoot } = {}) {\\n        this._names = new SetArray();\\n        this._sources = new SetArray();\\n        this._sourcesContent = [];\\n        this._mappings = [];\\n        this.file = file;\\n        this.sourceRoot = sourceRoot;\\n    }\\n}\\n(() => {\\n    addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\\n        return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name);\\n    };\\n    maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\\n        return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name);\\n    };\\n    addMapping = (map, mapping) => {\\n        return addMappingInternal(false, map, mapping);\\n    };\\n    maybeAddMapping = (map, mapping) => {\\n        return addMappingInternal(true, map, mapping);\\n    };\\n    setSourceContent = (map, source, content) => {\\n        const { _sources: sources, _sourcesContent: sourcesContent } = map;\\n        sourcesContent[put(sources, source)] = content;\\n    };\\n    toDecodedMap = (map) => {\\n        const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\\n        removeEmptyFinalLines(mappings);\\n        return {\\n            version: 3,\\n            file: file || undefined,\\n            names: names.array,\\n            sourceRoot: sourceRoot || undefined,\\n            sources: sources.array,\\n            sourcesContent,\\n            mappings,\\n        };\\n    };\\n    toEncodedMap = (map) => {\\n        const decoded = toDecodedMap(map);\\n        return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });\\n    };\\n    allMappings = (map) => {\\n        const out = [];\\n        const { _mappings: mappings, _sources: sources, _names: names } = map;\\n        for (let i = 0; i < mappings.length; i++) {\\n            const line = mappings[i];\\n            for (let j = 0; j < line.length; j++) {\\n                const seg = line[j];\\n                const generated = { line: i + 1, column: seg[COLUMN] };\\n                let source = undefined;\\n                let original = undefined;\\n                let name = undefined;\\n                if (seg.length !== 1) {\\n                    source = sources.array[seg[SOURCES_INDEX]];\\n                    original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };\\n                    if (seg.length === 5)\\n                        name = names.array[seg[NAMES_INDEX]];\\n                }\\n                out.push({ generated, source, original, name });\\n            }\\n        }\\n        return out;\\n    };\\n    fromMap = (input) => {\\n        const map = new TraceMap(input);\\n        const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });\\n        putAll(gen._names, map.names);\\n        putAll(gen._sources, map.sources);\\n        gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);\\n        gen._mappings = decodedMappings(map);\\n        return gen;\\n    };\\n    // Internal helpers\\n    addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {\\n        const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;\\n        const line = getLine(mappings, genLine);\\n        const index = getColumnIndex(line, genColumn);\\n        if (!source) {\\n            if (skipable && skipSourceless(line, index))\\n                return;\\n            return insert(line, index, [genColumn]);\\n        }\\n        const sourcesIndex = put(sources, source);\\n        const namesIndex = name ? put(names, name) : NO_NAME;\\n        if (sourcesIndex === sourcesContent.length)\\n            sourcesContent[sourcesIndex] = null;\\n        if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {\\n            return;\\n        }\\n        return insert(line, index, name\\n            ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\\n            : [genColumn, sourcesIndex, sourceLine, sourceColumn]);\\n    };\\n})();\\nfunction getLine(mappings, index) {\\n    for (let i = mappings.length; i <= index; i++) {\\n        mappings[i] = [];\\n    }\\n    return mappings[index];\\n}\\nfunction getColumnIndex(line, genColumn) {\\n    let index = line.length;\\n    for (let i = index - 1; i >= 0; index = i--) {\\n        const current = line[i];\\n        if (genColumn >= current[COLUMN])\\n            break;\\n    }\\n    return index;\\n}\\nfunction insert(array, index, value) {\\n    for (let i = array.length; i > index; i--) {\\n        array[i] = array[i - 1];\\n    }\\n    array[index] = value;\\n}\\nfunction removeEmptyFinalLines(mappings) {\\n    const { length } = mappings;\\n    let len = length;\\n    for (let i = len - 1; i >= 0; len = i, i--) {\\n        if (mappings[i].length > 0)\\n            break;\\n    }\\n    if (len < length)\\n        mappings.length = len;\\n}\\nfunction putAll(strarr, array) {\\n    for (let i = 0; i < array.length; i++)\\n        put(strarr, array[i]);\\n}\\nfunction skipSourceless(line, index) {\\n    // The start of a line is already sourceless, so adding a sourceless segment to the beginning\\n    // doesn't generate any useful information.\\n    if (index === 0)\\n        return true;\\n    const prev = line[index - 1];\\n    // If the previous segment is also sourceless, then adding another sourceless segment doesn't\\n    // genrate any new information. Else, this segment will end the source/named segment and point to\\n    // a sourceless position, which is useful.\\n    return prev.length === 1;\\n}\\nfunction skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {\\n    // A source/named segment at the start of a line gives position at that genColumn\\n    if (index === 0)\\n        return false;\\n    const prev = line[index - 1];\\n    // If the previous segment is sourceless, then we're transitioning to a source.\\n    if (prev.length === 1)\\n        return false;\\n    // If the previous segment maps to the exact same source position, then this segment doesn't\\n    // provide any new position information.\\n    return (sourcesIndex === prev[SOURCES_INDEX] &&\\n        sourceLine === prev[SOURCE_LINE] &&\\n        sourceColumn === prev[SOURCE_COLUMN] &&\\n        namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));\\n}\\nfunction addMappingInternal(skipable, map, mapping) {\\n    const { generated, source, original, name } = mapping;\\n    if (!source) {\\n        return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);\\n    }\\n    const s = source;\\n    return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);\\n}\\n\\nexport { GenMapping, addMapping, addSegment, allMappings, fromMap, maybeAddMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap };\\n//# sourceMappingURL=gen-mapping.mjs.map\\n\",\"import { AnyMap, originalPositionFor } from '@jridgewell/trace-mapping';\\nimport {\\n  GenMapping,\\n  maybeAddMapping,\\n  toDecodedMap,\\n  toEncodedMap,\\n  setSourceContent,\\n} from '@jridgewell/gen-mapping';\\n\\nimport type { TraceMap, SectionedSourceMapInput } from '@jridgewell/trace-mapping';\\nexport type { TraceMap, SectionedSourceMapInput };\\n\\nimport type { Mapping, EncodedSourceMap, DecodedSourceMap } from '@jridgewell/gen-mapping';\\nexport type { Mapping, EncodedSourceMap, DecodedSourceMap };\\n\\nexport class SourceMapConsumer {\\n  private declare _map: TraceMap;\\n  declare file: TraceMap['file'];\\n  declare names: TraceMap['names'];\\n  declare sourceRoot: TraceMap['sourceRoot'];\\n  declare sources: TraceMap['sources'];\\n  declare sourcesContent: TraceMap['sourcesContent'];\\n\\n  constructor(map: ConstructorParameters<typeof AnyMap>[0], mapUrl: Parameters<typeof AnyMap>[1]) {\\n    const trace = (this._map = new AnyMap(map, mapUrl));\\n\\n    this.file = trace.file;\\n    this.names = trace.names;\\n    this.sourceRoot = trace.sourceRoot;\\n    this.sources = trace.resolvedSources;\\n    this.sourcesContent = trace.sourcesContent;\\n  }\\n\\n  originalPositionFor(\\n    needle: Parameters<typeof originalPositionFor>[1],\\n  ): ReturnType<typeof originalPositionFor> {\\n    return originalPositionFor(this._map, needle);\\n  }\\n\\n  destroy() {\\n    // noop.\\n  }\\n}\\n\\nexport class SourceMapGenerator {\\n  private declare _map: GenMapping;\\n\\n  constructor(opts: ConstructorParameters<typeof GenMapping>[0]) {\\n    this._map = new GenMapping(opts);\\n  }\\n\\n  addMapping(mapping: Parameters<typeof maybeAddMapping>[1]): ReturnType<typeof maybeAddMapping> {\\n    maybeAddMapping(this._map, mapping);\\n  }\\n\\n  setSourceContent(\\n    source: Parameters<typeof setSourceContent>[1],\\n    content: Parameters<typeof setSourceContent>[2],\\n  ): ReturnType<typeof setSourceContent> {\\n    setSourceContent(this._map, source, content);\\n  }\\n\\n  toJSON(): ReturnType<typeof toEncodedMap> {\\n    return toEncodedMap(this._map);\\n  }\\n\\n  toDecodedMap(): ReturnType<typeof toDecodedMap> {\\n    return toDecodedMap(this._map);\\n  }\\n}\\n\"],\"names\":[\"sortComparator\",\"resolve\",\"resolveUri\",\"COLUMN\",\"SOURCES_INDEX\",\"SOURCE_LINE\",\"SOURCE_COLUMN\",\"NAMES_INDEX\"],\"mappings\":\";;;;;;IAAA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,kEAAkE,CAAC;IACjF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACvC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD;IACA,MAAM,EAAE,GAAG,OAAO,WAAW,KAAK,WAAW;IAC7C,MAAM,IAAI,WAAW,EAAE;IACvB,MAAM,OAAO,MAAM,KAAK,WAAW;IACnC,UAAU;IACV,YAAY,MAAM,CAAC,GAAG,EAAE;IACxB,gBAAgB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACpF,gBAAgB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACtC,aAAa;IACb,SAAS;IACT,UAAU;IACV,YAAY,MAAM,CAAC,GAAG,EAAE;IACxB,gBAAgB,IAAI,GAAG,GAAG,EAAE,CAAC;IAC7B,gBAAgB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACrD,oBAAoB,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,iBAAiB;IACjB,gBAAgB,OAAO,GAAG,CAAC;IAC3B,aAAa;IACb,SAAS,CAAC;IACV,SAAS,MAAM,CAAC,QAAQ,EAAE;IAC1B,IAAI,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC;IACvB,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;IAClB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;IACpB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG;IAC1C,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzC,QAAQ,IAAI,CAAC,KAAK,KAAK,EAAE;IACzB,YAAY,CAAC,EAAE,CAAC;IAChB,SAAS;IACT,aAAa,IAAI,CAAC,KAAK,SAAS,EAAE;IAClC,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IACnC,YAAY,IAAI,CAAC,MAAM;IACvB,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,YAAY,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,YAAY,IAAI,GAAG,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC;IAChB,SAAS;IACT,aAAa;IACb,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,YAAY,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,YAAY,IAAI,GAAG,GAAG,OAAO;IAC7B,gBAAgB,MAAM,GAAG,KAAK,CAAC;IAC/B,YAAY,OAAO,GAAG,GAAG,CAAC;IAC1B,YAAY,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAC/C,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,gBAAgB,SAAS;IACzB,aAAa;IACb,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,YAAY,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAC/C,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,gBAAgB,SAAS;IACzB,aAAa;IACb,YAAY,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,SAAS;IACT,KAAK;IACL,IAAI,IAAI,CAAC,MAAM;IACf,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,SAAS,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;IAChD,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;IACpB,IAAI,GAAG;IACP,QAAQ,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,QAAQ,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,KAAK,CAAC;IACzC,QAAQ,KAAK,IAAI,CAAC,CAAC;IACnB,KAAK,QAAQ,OAAO,GAAG,EAAE,EAAE;IAC3B,IAAI,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,MAAM,CAAC,CAAC;IACjB,IAAI,IAAI,YAAY,EAAE;IACtB,QAAQ,KAAK,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC;IACrC,KAAK;IACL,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACtB,IAAI,OAAO,GAAG,CAAC;IACf,CAAC;IACD,SAAS,eAAe,CAAC,QAAQ,EAAE,CAAC,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM;IAC5B,QAAQ,OAAO,KAAK,CAAC;IACrB,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,SAAS;IACtC,QAAQ,OAAO,KAAK,CAAC;IACrB,IAAI,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,SAAS,IAAI,CAAC,IAAI,EAAE;IACpB,IAAI,IAAI,CAAC,IAAI,CAACA,gBAAc,CAAC,CAAC;IAC9B,CAAC;IACD,SAASA,gBAAc,CAAC,CAAC,EAAE,CAAC,EAAE;IAC9B,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,SAAS,MAAM,CAAC,OAAO,EAAE;IACzB,IAAI,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC7C,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE;IACnB,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACvC,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;IACnC,SAAS;IACT,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;IAC7B,YAAY,SAAS;IACrB,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC9C,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC;IACA;IACA,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,YAAY,IAAI,CAAC,GAAG,CAAC;IACrB,gBAAgB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;IACnC,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;IACpC,gBAAgB,SAAS;IACzB,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;IACpC,gBAAgB,SAAS;IACzB,YAAY,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,SAAS;IACT,KAAK;IACL,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;IAClC,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK;IAChC,QAAQ,OAAO,GAAG,CAAC;IACnB,IAAI,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,SAAS,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACpD,IAAI,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACpB,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC/C,IAAI,GAAG;IACP,QAAQ,IAAI,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC;IACrC,QAAQ,GAAG,MAAM,CAAC,CAAC;IACnB,QAAQ,IAAI,GAAG,GAAG,CAAC;IACnB,YAAY,OAAO,IAAI,QAAQ,CAAC;IAChC,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACxC,KAAK,QAAQ,GAAG,GAAG,CAAC,EAAE;IACtB,IAAI,OAAO,GAAG,CAAC;IACf;;IChKA;IACA,MAAM,WAAW,GAAG,gBAAgB,CAAC;IACrC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAM,QAAQ,GAAG,0DAA0D,CAAC;IAC5E;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAM,SAAS,GAAG,2CAA2C,CAAC;IAC9D,SAAS,aAAa,CAAC,KAAK,EAAE;IAC9B,IAAI,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,SAAS,mBAAmB,CAAC,KAAK,EAAE;IACpC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,SAAS,cAAc,CAAC,KAAK,EAAE;IAC/B,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,SAAS,SAAS,CAAC,KAAK,EAAE;IAC1B,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,SAAS,gBAAgB,CAAC,KAAK,EAAE;IACjC,IAAI,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,SAAS,YAAY,CAAC,KAAK,EAAE;IAC7B,IAAI,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC9F,CAAC;IACD,SAAS,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACjD,IAAI,OAAO;IACX,QAAQ,MAAM;IACd,QAAQ,IAAI;IACZ,QAAQ,IAAI;IACZ,QAAQ,IAAI;IACZ,QAAQ,IAAI;IACZ,QAAQ,YAAY,EAAE,KAAK;IAC3B,KAAK,CAAC;IACN,CAAC;IACD,SAAS,QAAQ,CAAC,KAAK,EAAE;IACzB,IAAI,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;IACpC,QAAQ,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;IACtD,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IACxB,QAAQ,OAAO,GAAG,CAAC;IACnB,KAAK;IACL,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;IAC/B,QAAQ,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;IAC/D,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IACxB,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACtB,QAAQ,OAAO,GAAG,CAAC;IACnB,KAAK;IACL,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC;IACxB,QAAQ,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC;IAC5B,QAAQ,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,MAAM,GAAG,GAAG,gBAAgB,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;IAC5D,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IACpB,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAClB,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC;IACf,CAAC;IACD,SAAS,iBAAiB,CAAC,IAAI,EAAE;IACjC;IACA;IACA,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC5B,QAAQ,OAAO,IAAI,CAAC;IACpB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,SAAS,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE;IAC/B;IACA,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY;IACzB,QAAQ,OAAO;IACf,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACxB;IACA;IACA,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;IAC1B,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAC7B,KAAK;IACL,SAAS;IACT;IACA,QAAQ,GAAG,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IAC3D,KAAK;IACL;IACA,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACzC,CAAC;IACD;IACA;IACA;IACA;IACA,SAAS,aAAa,CAAC,GAAG,EAAE;IAC5B,IAAI,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IACjC,IAAI,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC;IACA;IACA,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;IACpB;IACA;IACA,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;IACrB;IACA;IACA;IACA,IAAI,IAAI,gBAAgB,GAAG,KAAK,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC5C,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC;IACA,QAAQ,IAAI,CAAC,KAAK,EAAE;IACpB,YAAY,gBAAgB,GAAG,IAAI,CAAC;IACpC,YAAY,SAAS;IACrB,SAAS;IACT;IACA,QAAQ,gBAAgB,GAAG,KAAK,CAAC;IACjC;IACA,QAAQ,IAAI,KAAK,KAAK,GAAG;IACzB,YAAY,SAAS;IACrB;IACA;IACA,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;IAC5B,YAAY,IAAI,QAAQ,EAAE;IAC1B,gBAAgB,gBAAgB,GAAG,IAAI,CAAC;IACxC,gBAAgB,QAAQ,EAAE,CAAC;IAC3B,gBAAgB,OAAO,EAAE,CAAC;IAC1B,aAAa;IACb,iBAAiB,IAAI,YAAY,EAAE;IACnC;IACA;IACA,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;IAC1C,aAAa;IACb,YAAY,SAAS;IACrB,SAAS;IACT;IACA;IACA,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;IACnB,KAAK;IACL,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;IACtC,QAAQ,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK;IACL,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;IAC9D,QAAQ,IAAI,IAAI,GAAG,CAAC;IACpB,KAAK;IACL,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,CAAC;IACD;IACA;IACA;IACA,SAASC,SAAO,CAAC,KAAK,EAAE,IAAI,EAAE;IAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;IACvB,QAAQ,OAAO,EAAE,CAAC;IAClB,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC;IACA,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;IAC7B,QAAQ,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACpC;IACA,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;IACvB;IACA,YAAY,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,YAAY,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,YAAY,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACpC,SAAS;IACT,QAAQ,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK;IACL,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB;IACA,IAAI,IAAI,GAAG,CAAC,YAAY,EAAE;IAC1B;IACA,QAAQ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,QAAQ,IAAI,CAAC,IAAI;IACjB,YAAY,OAAO,GAAG,CAAC;IACvB;IACA;IACA;IACA,QAAQ,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7D,QAAQ,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1E,KAAK;IACL;IACA,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI;IAChC,QAAQ,OAAO,GAAG,CAAC,IAAI,CAAC;IACxB;IACA,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE;;IC9LA,SAAS,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE;IAC9B;IACA;IACA;IACA,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IACnC,QAAQ,IAAI,IAAI,GAAG,CAAC;IACpB,IAAI,OAAOC,SAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;AACD;IACA;IACA;IACA;IACA,SAAS,aAAa,CAAC,IAAI,EAAE;IAC7B,IAAI,IAAI,CAAC,IAAI;IACb,QAAQ,OAAO,EAAE,CAAC;IAClB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;AACD;IACA,MAAMC,QAAM,GAAG,CAAC,CAAC;IACjB,MAAMC,eAAa,GAAG,CAAC,CAAC;IACxB,MAAMC,aAAW,GAAG,CAAC,CAAC;IACtB,MAAMC,eAAa,GAAG,CAAC,CAAC;IACxB,MAAMC,aAAW,GAAG,CAAC,CAAC;AAGtB;IACA,SAAS,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE;IACpC,IAAI,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,aAAa,KAAK,QAAQ,CAAC,MAAM;IACzC,QAAQ,OAAO,QAAQ,CAAC;IACxB;IACA;IACA,IAAI,IAAI,CAAC,KAAK;IACd,QAAQ,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IACpC,IAAI,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IACnG,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvD,KAAK;IACL,IAAI,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,SAAS,uBAAuB,CAAC,QAAQ,EAAE,KAAK,EAAE;IAClD,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAClD,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClC,YAAY,OAAO,CAAC,CAAC;IACrB,KAAK;IACL,IAAI,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,SAAS,QAAQ,CAAC,IAAI,EAAE;IACxB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC1C,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAACJ,QAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAACA,QAAM,CAAC,EAAE;IACnD,YAAY,OAAO,KAAK,CAAC;IACzB,SAAS;IACT,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;IACnC,IAAI,IAAI,CAAC,KAAK;IACd,QAAQ,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC;IACD,SAAS,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE;IAC9B,IAAI,OAAO,CAAC,CAACA,QAAM,CAAC,GAAG,CAAC,CAACA,QAAM,CAAC,CAAC;IACjC,CAAC;AACD;IACA,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;IACnD,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE;IACxB,QAAQ,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IAC9C,QAAQ,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAACA,QAAM,CAAC,GAAG,MAAM,CAAC;IACnD,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE;IACvB,YAAY,KAAK,GAAG,IAAI,CAAC;IACzB,YAAY,OAAO,GAAG,CAAC;IACvB,SAAS;IACT,QAAQ,IAAI,GAAG,GAAG,CAAC,EAAE;IACrB,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1B,SAAS;IACT,aAAa;IACb,YAAY,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IAC3B,SAAS;IACT,KAAK;IACL,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,SAAS,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAC7C,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;IAC/D,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAACA,QAAM,CAAC,KAAK,MAAM;IAC1C,YAAY,MAAM;IAClB,KAAK;IACL,IAAI,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,SAAS,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAC7C,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;IAClD,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAACA,QAAM,CAAC,KAAK,MAAM;IAC1C,YAAY,MAAM;IAClB,KAAK;IACL,IAAI,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,SAAS,aAAa,GAAG;IACzB,IAAI,OAAO;IACX,QAAQ,OAAO,EAAE,CAAC,CAAC;IACnB,QAAQ,UAAU,EAAE,CAAC,CAAC;IACtB,QAAQ,SAAS,EAAE,CAAC,CAAC;IACrB,KAAK,CAAC;IACN,CAAC;IACD;IACA;IACA;IACA;IACA,SAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;IAC5D,IAAI,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACrD,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE;IACzB,QAAQ,IAAI,MAAM,KAAK,UAAU,EAAE;IACnC,YAAY,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAACA,QAAM,CAAC,KAAK,MAAM,CAAC;IAC/E,YAAY,OAAO,SAAS,CAAC;IAC7B,SAAS;IACT,QAAQ,IAAI,MAAM,IAAI,UAAU,EAAE;IAClC;IACA,YAAY,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACnD,SAAS;IACT,aAAa;IACb,YAAY,IAAI,GAAG,SAAS,CAAC;IAC7B,SAAS;IACT,KAAK;IACL,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IACxB,IAAI,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAC9B,IAAI,QAAQ,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IACzE,CAAC;AA0CD;IACA,MAAM,MAAM,GAAG,UAAU,GAAG,EAAE,MAAM,EAAE;IACtC,IAAI,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACnE,IAAI,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC;IAC/B,QAAQ,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;IACxB,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,cAAc,GAAG,EAAE,CAAC;IAC9B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IACzC,QAAQ,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACtG,KAAK;IACL,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;IAC7B,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtG,KAAK;IACL,IAAI,MAAM,MAAM,GAAG;IACnB,QAAQ,OAAO,EAAE,CAAC;IAClB,QAAQ,IAAI,EAAE,MAAM,CAAC,IAAI;IACzB,QAAQ,KAAK;IACb,QAAQ,OAAO;IACf,QAAQ,cAAc;IACtB,QAAQ,QAAQ;IAChB,KAAK,CAAC;IACN,IAAI,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,SAAS,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE;IACrG,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACtE,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IACzC,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IACrC,IAAI,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;IACpC,IAAI,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B;IACA,IAAI,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE;IACtD,QAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B;IACA;IACA;IACA,IAAI,MAAM,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxC,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;IAClC,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC;IACA;IACA,QAAQ,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrF;IACA;IACA,QAAQ,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;IACnD,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC9C,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,YAAY,MAAM,MAAM,GAAG,OAAO,GAAG,GAAG,CAACA,QAAM,CAAC,CAAC;IACjD;IACA;IACA,YAAY,IAAI,CAAC,KAAK,KAAK,IAAI,MAAM,IAAI,UAAU;IACnD,gBAAgB,MAAM;IACtB,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;IAClC,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnC,gBAAgB,SAAS;IACzB,aAAa;IACb,YAAY,MAAM,YAAY,GAAG,aAAa,GAAG,GAAG,CAACC,eAAa,CAAC,CAAC;IACpE,YAAY,MAAM,UAAU,GAAG,GAAG,CAACC,aAAW,CAAC,CAAC;IAChD,YAAY,MAAM,YAAY,GAAG,GAAG,CAACC,eAAa,CAAC,CAAC;IACpD,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;IAClC,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAC3E,gBAAgB,SAAS;IACzB,aAAa;IACb,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,GAAG,CAACC,aAAW,CAAC,CAAC,CAAC,CAAC;IACvG,SAAS;IACT,KAAK;IACL,CAAC;IACD,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE;IAC5B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;IACzC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD;IACA;IACA;IACA;IACA,SAAS,kBAAkB,CAAC,GAAG,EAAE;IACjC,IAAI,MAAM,cAAc,GAAG,EAAE,CAAC;IAC9B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;IAChC,QAAQ,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjC,IAAI,OAAO,cAAc,CAAC;IAC1B,CAAC;AACD;IACA,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,IAAI,MAAM,EAAE,IAAI;IAChB,IAAI,IAAI,EAAE,IAAI;IACd,IAAI,MAAM,EAAE,IAAI;IAChB,IAAI,IAAI,EAAE,IAAI;IACd,CAAC,CAAC,CAAC;IAC+B,MAAM,CAAC,MAAM,CAAC;IAChD,IAAI,IAAI,EAAE,IAAI;IACd,IAAI,MAAM,EAAE,IAAI;IAChB,CAAC,EAAE;IACH,MAAM,aAAa,GAAG,uDAAuD,CAAC;IAC9E,MAAM,eAAe,GAAG,yEAAyE,CAAC;IAClG,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC;IAC7B,MAAM,oBAAoB,GAAG,CAAC,CAAC;IAK/B;IACA;IACA;IACA,IAAI,eAAe,CAAC;IAMpB;IACA;IACA;IACA;IACA;IACA,IAAI,mBAAmB,CAAC;IAaxB;IACA;IACA;IACA;IACA,IAAI,mBAAmB,CAAC;IAWxB,MAAM,QAAQ,CAAC;IACf,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE;IAC7B,QAAQ,IAAI,CAAC,YAAY,GAAG,aAAa,EAAE,CAAC;IAC5C,QAAQ,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IACpC,QAAQ,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IACxC,QAAQ,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC;IACjD,QAAQ,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,WAAW,KAAK,QAAQ;IACrD,YAAY,OAAO,GAAG,CAAC;IACvB,QAAQ,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1D,QAAQ,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IACrF,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3B,QAAQ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACrC,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,QAAQ,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IAC7C,QAAQ,IAAI,UAAU,IAAI,MAAM,EAAE;IAClC,YAAY,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,YAAY,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9E,SAAS;IACT,aAAa;IACb,YAAY,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,SAAS;IACT,QAAQ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACpC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;IAC1C,YAAY,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACrC,YAAY,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IACtC,SAAS;IACT,aAAa;IACb,YAAY,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IACtC,YAAY,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1D,SAAS;IACT,KAAK;IACL,CAAC;IACD,CAAC,MAAM;IAKP,IAAI,eAAe,GAAG,CAAC,GAAG,KAAK;IAC/B,QAAQ,QAAQ,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE;IACvE,KAAK,CAAC;IASN,IAAI,mBAAmB,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;IAC3D,QAAQ,IAAI,EAAE,CAAC;IACf,QAAQ,IAAI,IAAI,GAAG,CAAC;IACpB,YAAY,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3C,QAAQ,IAAI,MAAM,GAAG,CAAC;IACtB,YAAY,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAC7C,QAAQ,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC7C;IACA;IACA,QAAQ,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;IAClC,YAAY,OAAO,wBAAwB,CAAC;IAC5C,QAAQ,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,oBAAoB,CAAC,CAAC;IAC1H,QAAQ,IAAI,OAAO,IAAI,IAAI;IAC3B,YAAY,OAAO,wBAAwB,CAAC;IAC5C,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;IAC/B,YAAY,OAAO,wBAAwB,CAAC;IAC5C,QAAQ,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;IAC/C,QAAQ,OAAO;IACf,YAAY,MAAM,EAAE,eAAe,CAAC,OAAO,CAACH,eAAa,CAAC,CAAC;IAC3D,YAAY,IAAI,EAAE,OAAO,CAACC,aAAW,CAAC,GAAG,CAAC;IAC1C,YAAY,MAAM,EAAE,OAAO,CAACC,eAAa,CAAC;IAC1C,YAAY,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAACC,aAAW,CAAC,CAAC,GAAG,IAAI;IAC3E,SAAS,CAAC;IACV,KAAK,CAAC;IAyDN,IAAI,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK;IAC3C,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7C,QAAQ,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC5B,QAAQ,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IACvC,QAAQ,OAAO,MAAM,CAAC;IACtB,KAAK,CAAC;IAuBN,CAAC,GAAG,CAAC;IACL,SAAS,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAClE,IAAI,IAAI,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,EAAE;IACf,QAAQ,KAAK,GAAG,CAAC,IAAI,KAAK,iBAAiB,GAAG,UAAU,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAChG,KAAK;IACL,SAAS,IAAI,IAAI,KAAK,iBAAiB;IACvC,QAAQ,KAAK,EAAE,CAAC;IAChB,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM;IACjD,QAAQ,OAAO,IAAI,CAAC;IACpB,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3B;;IC9fA;IACA;IACA;IACA,IAAI,GAAG,CAAC;IACR;IACA;IACA;IACA;IACA,IAAI,GAAG,CAAC;IAKR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAM,QAAQ,CAAC;IACf,IAAI,WAAW,GAAG;IAClB,QAAQ,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5C,QAAQ,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACxB,KAAK;IACL,CAAC;IACD,CAAC,MAAM;IACP,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK;IAC3B;IACA,QAAQ,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,QAAQ,IAAI,KAAK,KAAK,SAAS;IAC/B,YAAY,OAAO,KAAK,CAAC;IACzB,QAAQ,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACpD,QAAQ,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;IACpD,KAAK,CAAC;IAQN,CAAC,GAAG;;ICxCJ,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB;IACA,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;IAiBnB;IACA;IACA;IACA;IACA;IACA,IAAI,eAAe,CAAC;IACpB;IACA;IACA;IACA,IAAI,gBAAgB,CAAC;IACrB;IACA;IACA;IACA;IACA,IAAI,YAAY,CAAC;IACjB;IACA;IACA;IACA;IACA,IAAI,YAAY,CAAC;IAUjB;IACA,IAAI,kBAAkB,CAAC;IACvB;IACA;IACA;IACA,MAAM,UAAU,CAAC;IACjB,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE;IAC3C,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACrC,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IACvC,QAAQ,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAClC,QAAQ,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IAC5B,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACrC,KAAK;IACL,CAAC;IACD,CAAC,MAAM;IAUP,IAAI,eAAe,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK;IACxC,QAAQ,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACtD,KAAK,CAAC;IACN,IAAI,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK;IACjD,QAAQ,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;IAC3E,QAAQ,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;IACvD,KAAK,CAAC;IACN,IAAI,YAAY,GAAG,CAAC,GAAG,KAAK;IAC5B,QAAQ,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC;IAClI,QAAQ,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,OAAO;IACf,YAAY,OAAO,EAAE,CAAC;IACtB,YAAY,IAAI,EAAE,IAAI,IAAI,SAAS;IACnC,YAAY,KAAK,EAAE,KAAK,CAAC,KAAK;IAC9B,YAAY,UAAU,EAAE,UAAU,IAAI,SAAS;IAC/C,YAAY,OAAO,EAAE,OAAO,CAAC,KAAK;IAClC,YAAY,cAAc;IAC1B,YAAY,QAAQ;IACpB,SAAS,CAAC;IACV,KAAK,CAAC;IACN,IAAI,YAAY,GAAG,CAAC,GAAG,KAAK;IAC5B,QAAQ,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1C,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjG,KAAK,CAAC;IAgCN;IACA,IAAI,kBAAkB,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,KAAK;IACxG,QAAQ,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC;IAChH,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,QAAQ,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtD,QAAQ,IAAI,CAAC,MAAM,EAAE;IACrB,YAAY,IAAI,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;IACvD,gBAAgB,OAAO;IACvB,YAAY,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,SAAS;IACT,QAAQ,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;IAC7D,QAAQ,IAAI,YAAY,KAAK,cAAc,CAAC,MAAM;IAClD,YAAY,cAAc,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,IAAI,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;IACrG,YAAY,OAAO;IACnB,SAAS;IACT,QAAQ,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI;IACvC,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;IAC7E,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC;IACN,CAAC,GAAG,CAAC;IACL,SAAS,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;IAClC,IAAI,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;IACnD,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,KAAK;IACL,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,SAAS,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE;IACzC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;IACjD,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IACxC,YAAY,MAAM;IAClB,KAAK;IACL,IAAI,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,SAAS,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACrC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/C,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,KAAK;IACL,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,SAAS,qBAAqB,CAAC,QAAQ,EAAE;IACzC,IAAI,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAChC,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC;IACrB,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IAChD,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;IAClC,YAAY,MAAM;IAClB,KAAK;IACL,IAAI,IAAI,GAAG,GAAG,MAAM;IACpB,QAAQ,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;IAC9B,CAAC;IAKD,SAAS,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE;IACrC;IACA;IACA,IAAI,IAAI,KAAK,KAAK,CAAC;IACnB,QAAQ,OAAO,IAAI,CAAC;IACpB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC;IACA;IACA;IACA,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,SAAS,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE;IACrF;IACA,IAAI,IAAI,KAAK,KAAK,CAAC;IACnB,QAAQ,OAAO,KAAK,CAAC;IACrB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC;IACA,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;IACzB,QAAQ,OAAO,KAAK,CAAC;IACrB;IACA;IACA,IAAI,QAAQ,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;IAChD,QAAQ,UAAU,KAAK,IAAI,CAAC,WAAW,CAAC;IACxC,QAAQ,YAAY,KAAK,IAAI,CAAC,aAAa,CAAC;IAC5C,QAAQ,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,EAAE;IAC1E,CAAC;IACD,SAAS,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE;IACpD,IAAI,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC1D,IAAI,IAAI,CAAC,MAAM,EAAE;IACjB,QAAQ,OAAO,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/G,KAAK;IACL,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC;IACrB,IAAI,OAAO,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChI;;UCnNa,iBAAiB;QAQ5B,YAAY,GAA4C,EAAE,MAAoC;YAC5F,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YAEpD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC;YACrC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;SAC5C;QAED,mBAAmB,CACjB,MAAiD;YAEjD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SAC/C;QAED,OAAO;;SAEN;KACF;UAEY,kBAAkB;QAG7B,YAAY,IAAiD;YAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;SAClC;QAED,UAAU,CAAC,OAA8C;YACvD,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACrC;QAED,gBAAgB,CACd,MAA8C,EAC9C,OAA+C;YAE/C,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SAC9C;QAED,MAAM;YACJ,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChC;QAED,YAAY;YACV,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChC;;;;;;;;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/dist/types/source-map.d.ts",
    "content": "import { AnyMap, originalPositionFor } from '@jridgewell/trace-mapping';\nimport { GenMapping, maybeAddMapping, toDecodedMap, toEncodedMap, setSourceContent } from '@jridgewell/gen-mapping';\nimport type { TraceMap, SectionedSourceMapInput } from '@jridgewell/trace-mapping';\nexport type { TraceMap, SectionedSourceMapInput };\nimport type { Mapping, EncodedSourceMap, DecodedSourceMap } from '@jridgewell/gen-mapping';\nexport type { Mapping, EncodedSourceMap, DecodedSourceMap };\nexport declare class SourceMapConsumer {\n    private _map;\n    file: TraceMap['file'];\n    names: TraceMap['names'];\n    sourceRoot: TraceMap['sourceRoot'];\n    sources: TraceMap['sources'];\n    sourcesContent: TraceMap['sourcesContent'];\n    constructor(map: ConstructorParameters<typeof AnyMap>[0], mapUrl: Parameters<typeof AnyMap>[1]);\n    originalPositionFor(needle: Parameters<typeof originalPositionFor>[1]): ReturnType<typeof originalPositionFor>;\n    destroy(): void;\n}\nexport declare class SourceMapGenerator {\n    private _map;\n    constructor(opts: ConstructorParameters<typeof GenMapping>[0]);\n    addMapping(mapping: Parameters<typeof maybeAddMapping>[1]): ReturnType<typeof maybeAddMapping>;\n    setSourceContent(source: Parameters<typeof setSourceContent>[1], content: Parameters<typeof setSourceContent>[2]): ReturnType<typeof setSourceContent>;\n    toJSON(): ReturnType<typeof toEncodedMap>;\n    toDecodedMap(): ReturnType<typeof toDecodedMap>;\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/source-map/package.json",
    "content": "{\n  \"name\": \"@jridgewell/source-map\",\n  \"version\": \"0.3.3\",\n  \"description\": \"Packages @jridgewell/trace-mapping and @jridgewell/gen-mapping into the familiar source-map API\",\n  \"keywords\": [\n    \"sourcemap\",\n    \"source\",\n    \"map\"\n  ],\n  \"author\": \"Justin Ridgewell <justin@ridgewell.name>\",\n  \"license\": \"MIT\",\n  \"repository\": \"https://github.com/jridgewell/source-map\",\n  \"main\": \"dist/source-map.umd.js\",\n  \"module\": \"dist/source-map.mjs\",\n  \"types\": \"dist/types/source-map.d.ts\",\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./dist/types/source-map.d.ts\",\n        \"browser\": \"./dist/source-map.umd.js\",\n        \"require\": \"./dist/source-map.umd.js\",\n        \"import\": \"./dist/source-map.mjs\"\n      },\n      \"./dist/source-map.umd.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"prebuild\": \"rm -rf dist\",\n    \"build\": \"run-s -n build:*\",\n    \"build:rollup\": \"rollup -c rollup.config.js\",\n    \"build:ts\": \"tsc --project tsconfig.build.json\",\n    \"lint\": \"run-s -n lint:*\",\n    \"lint:prettier\": \"npm run test:lint:prettier -- --write\",\n    \"lint:ts\": \"npm run test:lint:ts -- --fix\",\n    \"pretest\": \"run-s build:rollup\",\n    \"test\": \"run-s -n test:lint test:only\",\n    \"test:debug\": \"mocha --inspect-brk\",\n    \"test:lint\": \"run-s -n test:lint:*\",\n    \"test:lint:prettier\": \"prettier --check '{src,test}/**/*.ts'\",\n    \"test:lint:ts\": \"eslint '{src,test}/**/*.ts'\",\n    \"test:only\": \"mocha\",\n    \"test:coverage\": \"c8 mocha\",\n    \"test:watch\": \"mocha --watch\",\n    \"prepublishOnly\": \"npm run preversion\",\n    \"preversion\": \"run-s test build\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-node-resolve\": \"13.2.1\",\n    \"@rollup/plugin-typescript\": \"8.3.0\",\n    \"@types/mocha\": \"9.1.1\",\n    \"@types/node\": \"17.0.30\",\n    \"@typescript-eslint/eslint-plugin\": \"5.10.0\",\n    \"@typescript-eslint/parser\": \"5.10.0\",\n    \"c8\": \"7.11.0\",\n    \"eslint\": \"8.7.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"mocha\": \"9.2.0\",\n    \"npm-run-all\": \"4.1.5\",\n    \"prettier\": \"2.5.1\",\n    \"rollup\": \"2.66.0\",\n    \"typescript\": \"4.5.5\"\n  },\n  \"dependencies\": {\n    \"@jridgewell/gen-mapping\": \"^0.3.0\",\n    \"@jridgewell/trace-mapping\": \"^0.3.9\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/LICENSE",
    "content": "The MIT License\n\nCopyright (c) 2015 Rich Harris\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/README.md",
    "content": "# sourcemap-codec\n\nEncode/decode the `mappings` property of a [sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit).\n\n\n## Why?\n\nSourcemaps are difficult to generate and manipulate, because the `mappings` property – the part that actually links the generated code back to the original source – is encoded using an obscure method called [Variable-length quantity](https://en.wikipedia.org/wiki/Variable-length_quantity). On top of that, each segment in the mapping contains offsets rather than absolute indices, which means that you can't look at a segment in isolation – you have to understand the whole sourcemap.\n\nThis package makes the process slightly easier.\n\n\n## Installation\n\n```bash\nnpm install sourcemap-codec\n```\n\n\n## Usage\n\n```js\nimport { encode, decode } from 'sourcemap-codec';\n\nvar decoded = decode( ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' );\n\nassert.deepEqual( decoded, [\n\t// the first line (of the generated code) has no mappings,\n\t// as shown by the starting semi-colon (which separates lines)\n\t[],\n\n\t// the second line contains four (comma-separated) segments\n\t[\n\t\t// segments are encoded as you'd expect:\n\t\t// [ generatedCodeColumn, sourceIndex, sourceCodeLine, sourceCodeColumn, nameIndex ]\n\n\t\t// i.e. the first segment begins at column 2, and maps back to the second column\n\t\t// of the second line (both zero-based) of the 0th source, and uses the 0th\n\t\t// name in the `map.names` array\n\t\t[ 2, 0, 2, 2, 0 ],\n\n\t\t// the remaining segments are 4-length rather than 5-length,\n\t\t// because they don't map a name\n\t\t[ 4, 0, 2, 4 ],\n\t\t[ 6, 0, 2, 5 ],\n\t\t[ 7, 0, 2, 7 ]\n\t],\n\n\t// the final line contains two segments\n\t[\n\t\t[ 2, 1, 10, 19 ],\n\t\t[ 12, 1, 11, 20 ]\n\t]\n]);\n\nvar encoded = encode( decoded );\nassert.equal( encoded, ';EAEEA,EAAE,EAAC,CAAE;ECQY,UACC' );\n```\n\n## Benchmarks\n\n```\nnode v18.0.0\n\namp.js.map - 45120 segments\n\nDecode Memory Usage:\n@jridgewell/sourcemap-codec       5479160 bytes\nsourcemap-codec                   5659336 bytes\nsource-map-0.6.1                 17144440 bytes\nsource-map-0.8.0                  6867424 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nDecode speed:\ndecode: @jridgewell/sourcemap-codec x 502 ops/sec ±1.03% (90 runs sampled)\ndecode: sourcemap-codec x 445 ops/sec ±0.97% (92 runs sampled)\ndecode: source-map-0.6.1 x 36.01 ops/sec ±1.64% (49 runs sampled)\ndecode: source-map-0.8.0 x 367 ops/sec ±0.04% (95 runs sampled)\nFastest is decode: @jridgewell/sourcemap-codec\n\nEncode Memory Usage:\n@jridgewell/sourcemap-codec       1261620 bytes\nsourcemap-codec                   9119248 bytes\nsource-map-0.6.1                  8968560 bytes\nsource-map-0.8.0                  8952952 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nEncode speed:\nencode: @jridgewell/sourcemap-codec x 738 ops/sec ±0.42% (98 runs sampled)\nencode: sourcemap-codec x 238 ops/sec ±0.73% (88 runs sampled)\nencode: source-map-0.6.1 x 162 ops/sec ±0.43% (84 runs sampled)\nencode: source-map-0.8.0 x 191 ops/sec ±0.34% (90 runs sampled)\nFastest is encode: @jridgewell/sourcemap-codec\n\n\n***\n\n\nbabel.min.js.map - 347793 segments\n\nDecode Memory Usage:\n@jridgewell/sourcemap-codec      35338184 bytes\nsourcemap-codec                  35922736 bytes\nsource-map-0.6.1                 62366360 bytes\nsource-map-0.8.0                 44337416 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nDecode speed:\ndecode: @jridgewell/sourcemap-codec x 40.35 ops/sec ±4.47% (54 runs sampled)\ndecode: sourcemap-codec x 36.76 ops/sec ±3.67% (51 runs sampled)\ndecode: source-map-0.6.1 x 4.44 ops/sec ±2.15% (16 runs sampled)\ndecode: source-map-0.8.0 x 59.35 ops/sec ±0.05% (78 runs sampled)\nFastest is decode: source-map-0.8.0\n\nEncode Memory Usage:\n@jridgewell/sourcemap-codec       7212604 bytes\nsourcemap-codec                  21421456 bytes\nsource-map-0.6.1                 25286888 bytes\nsource-map-0.8.0                 25498744 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nEncode speed:\nencode: @jridgewell/sourcemap-codec x 112 ops/sec ±0.13% (84 runs sampled)\nencode: sourcemap-codec x 30.23 ops/sec ±2.76% (53 runs sampled)\nencode: source-map-0.6.1 x 19.43 ops/sec ±3.70% (37 runs sampled)\nencode: source-map-0.8.0 x 19.40 ops/sec ±3.26% (37 runs sampled)\nFastest is encode: @jridgewell/sourcemap-codec\n\n\n***\n\n\npreact.js.map - 1992 segments\n\nDecode Memory Usage:\n@jridgewell/sourcemap-codec        500272 bytes\nsourcemap-codec                    516864 bytes\nsource-map-0.6.1                  1596672 bytes\nsource-map-0.8.0                   517272 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nDecode speed:\ndecode: @jridgewell/sourcemap-codec x 16,137 ops/sec ±0.17% (99 runs sampled)\ndecode: sourcemap-codec x 12,139 ops/sec ±0.13% (99 runs sampled)\ndecode: source-map-0.6.1 x 1,264 ops/sec ±0.12% (100 runs sampled)\ndecode: source-map-0.8.0 x 9,894 ops/sec ±0.08% (101 runs sampled)\nFastest is decode: @jridgewell/sourcemap-codec\n\nEncode Memory Usage:\n@jridgewell/sourcemap-codec        321026 bytes\nsourcemap-codec                    830832 bytes\nsource-map-0.6.1                   586608 bytes\nsource-map-0.8.0                   586680 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nEncode speed:\nencode: @jridgewell/sourcemap-codec x 19,876 ops/sec ±0.78% (95 runs sampled)\nencode: sourcemap-codec x 6,983 ops/sec ±0.15% (100 runs sampled)\nencode: source-map-0.6.1 x 5,070 ops/sec ±0.12% (102 runs sampled)\nencode: source-map-0.8.0 x 5,641 ops/sec ±0.17% (100 runs sampled)\nFastest is encode: @jridgewell/sourcemap-codec\n\n\n***\n\n\nreact.js.map - 5726 segments\n\nDecode Memory Usage:\n@jridgewell/sourcemap-codec        734848 bytes\nsourcemap-codec                    954200 bytes\nsource-map-0.6.1                  2276432 bytes\nsource-map-0.8.0                   955488 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nDecode speed:\ndecode: @jridgewell/sourcemap-codec x 5,723 ops/sec ±0.12% (98 runs sampled)\ndecode: sourcemap-codec x 4,555 ops/sec ±0.09% (101 runs sampled)\ndecode: source-map-0.6.1 x 437 ops/sec ±0.11% (93 runs sampled)\ndecode: source-map-0.8.0 x 3,441 ops/sec ±0.15% (100 runs sampled)\nFastest is decode: @jridgewell/sourcemap-codec\n\nEncode Memory Usage:\n@jridgewell/sourcemap-codec        638672 bytes\nsourcemap-codec                   1109840 bytes\nsource-map-0.6.1                  1321224 bytes\nsource-map-0.8.0                  1324448 bytes\nSmallest memory usage is @jridgewell/sourcemap-codec\n\nEncode speed:\nencode: @jridgewell/sourcemap-codec x 6,801 ops/sec ±0.48% (98 runs sampled)\nencode: sourcemap-codec x 2,533 ops/sec ±0.13% (101 runs sampled)\nencode: source-map-0.6.1 x 2,248 ops/sec ±0.08% (100 runs sampled)\nencode: source-map-0.8.0 x 2,303 ops/sec ±0.15% (100 runs sampled)\nFastest is encode: @jridgewell/sourcemap-codec\n```\n\n# License\n\nMIT\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs",
    "content": "const comma = ','.charCodeAt(0);\nconst semicolon = ';'.charCodeAt(0);\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst intToChar = new Uint8Array(64); // 64 possible chars.\nconst charToInt = new Uint8Array(128); // z is 122 in ASCII\nfor (let i = 0; i < chars.length; i++) {\n    const c = chars.charCodeAt(i);\n    intToChar[i] = c;\n    charToInt[c] = i;\n}\n// Provide a fallback for older environments.\nconst td = typeof TextDecoder !== 'undefined'\n    ? /* #__PURE__ */ new TextDecoder()\n    : typeof Buffer !== 'undefined'\n        ? {\n            decode(buf) {\n                const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n                return out.toString();\n            },\n        }\n        : {\n            decode(buf) {\n                let out = '';\n                for (let i = 0; i < buf.length; i++) {\n                    out += String.fromCharCode(buf[i]);\n                }\n                return out;\n            },\n        };\nfunction decode(mappings) {\n    const state = new Int32Array(5);\n    const decoded = [];\n    let index = 0;\n    do {\n        const semi = indexOf(mappings, index);\n        const line = [];\n        let sorted = true;\n        let lastCol = 0;\n        state[0] = 0;\n        for (let i = index; i < semi; i++) {\n            let seg;\n            i = decodeInteger(mappings, i, state, 0); // genColumn\n            const col = state[0];\n            if (col < lastCol)\n                sorted = false;\n            lastCol = col;\n            if (hasMoreVlq(mappings, i, semi)) {\n                i = decodeInteger(mappings, i, state, 1); // sourcesIndex\n                i = decodeInteger(mappings, i, state, 2); // sourceLine\n                i = decodeInteger(mappings, i, state, 3); // sourceColumn\n                if (hasMoreVlq(mappings, i, semi)) {\n                    i = decodeInteger(mappings, i, state, 4); // namesIndex\n                    seg = [col, state[1], state[2], state[3], state[4]];\n                }\n                else {\n                    seg = [col, state[1], state[2], state[3]];\n                }\n            }\n            else {\n                seg = [col];\n            }\n            line.push(seg);\n        }\n        if (!sorted)\n            sort(line);\n        decoded.push(line);\n        index = semi + 1;\n    } while (index <= mappings.length);\n    return decoded;\n}\nfunction indexOf(mappings, index) {\n    const idx = mappings.indexOf(';', index);\n    return idx === -1 ? mappings.length : idx;\n}\nfunction decodeInteger(mappings, pos, state, j) {\n    let value = 0;\n    let shift = 0;\n    let integer = 0;\n    do {\n        const c = mappings.charCodeAt(pos++);\n        integer = charToInt[c];\n        value |= (integer & 31) << shift;\n        shift += 5;\n    } while (integer & 32);\n    const shouldNegate = value & 1;\n    value >>>= 1;\n    if (shouldNegate) {\n        value = -0x80000000 | -value;\n    }\n    state[j] += value;\n    return pos;\n}\nfunction hasMoreVlq(mappings, i, length) {\n    if (i >= length)\n        return false;\n    return mappings.charCodeAt(i) !== comma;\n}\nfunction sort(line) {\n    line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n    return a[0] - b[0];\n}\nfunction encode(decoded) {\n    const state = new Int32Array(5);\n    const bufLength = 1024 * 16;\n    const subLength = bufLength - 36;\n    const buf = new Uint8Array(bufLength);\n    const sub = buf.subarray(0, subLength);\n    let pos = 0;\n    let out = '';\n    for (let i = 0; i < decoded.length; i++) {\n        const line = decoded[i];\n        if (i > 0) {\n            if (pos === bufLength) {\n                out += td.decode(buf);\n                pos = 0;\n            }\n            buf[pos++] = semicolon;\n        }\n        if (line.length === 0)\n            continue;\n        state[0] = 0;\n        for (let j = 0; j < line.length; j++) {\n            const segment = line[j];\n            // We can push up to 5 ints, each int can take at most 7 chars, and we\n            // may push a comma.\n            if (pos > subLength) {\n                out += td.decode(sub);\n                buf.copyWithin(0, subLength, pos);\n                pos -= subLength;\n            }\n            if (j > 0)\n                buf[pos++] = comma;\n            pos = encodeInteger(buf, pos, state, segment, 0); // genColumn\n            if (segment.length === 1)\n                continue;\n            pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex\n            pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine\n            pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn\n            if (segment.length === 4)\n                continue;\n            pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex\n        }\n    }\n    return out + td.decode(buf.subarray(0, pos));\n}\nfunction encodeInteger(buf, pos, state, segment, j) {\n    const next = segment[j];\n    let num = next - state[j];\n    state[j] = next;\n    num = num < 0 ? (-num << 1) | 1 : num << 1;\n    do {\n        let clamped = num & 0b011111;\n        num >>>= 5;\n        if (num > 0)\n            clamped |= 0b100000;\n        buf[pos++] = intToChar[clamped];\n    } while (num > 0);\n    return pos;\n}\n\nexport { decode, encode };\n//# sourceMappingURL=sourcemap-codec.mjs.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map",
    "content": "{\"version\":3,\"file\":\"sourcemap-codec.mjs\",\"sources\":[\"../src/sourcemap-codec.ts\"],\"sourcesContent\":[null],\"names\":[],\"mappings\":\"AAOA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACpC,MAAM,KAAK,GAAG,kEAAkE,CAAC;AACjF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;AACrC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9B,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAClB;AAED;AACA,MAAM,EAAE,GACN,OAAO,WAAW,KAAK,WAAW;sBACd,IAAI,WAAW,EAAE;MACjC,OAAO,MAAM,KAAK,WAAW;UAC7B;YACE,MAAM,CAAC,GAAe;gBACpB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;gBACpE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;aACvB;SACF;UACD;YACE,MAAM,CAAC,GAAe;gBACpB,IAAI,GAAG,GAAG,EAAE,CAAC;gBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBACpC;gBACD,OAAO,GAAG,CAAC;aACZ;SACF,CAAC;SAEQ,MAAM,CAAC,QAAgB;IACrC,MAAM,KAAK,GAA6C,IAAI,UAAU,CAAC,CAAC,CAAQ,CAAC;IACjF,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,GAAG;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEb,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,GAAqB,CAAC;YAE1B,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,GAAG,GAAG,OAAO;gBAAE,MAAM,GAAG,KAAK,CAAC;YAClC,OAAO,GAAG,GAAG,CAAC;YAEd,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;gBACjC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBAEzC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;oBACjC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;oBACzC,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBACrD;qBAAM;oBACL,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3C;aACF;iBAAM;gBACL,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;aACb;YAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAChB;QAED,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;KAClB,QAAQ,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;IAEnC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,KAAa;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAuB,EAAE,CAAS;IACtF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,GAAG;QACD,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QACrC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,KAAK,CAAC;QACjC,KAAK,IAAI,CAAC,CAAC;KACZ,QAAQ,OAAO,GAAG,EAAE,EAAE;IAEvB,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC;IAEb,IAAI,YAAY,EAAE;QAChB,KAAK,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC;KAC9B;IAED,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,CAAS,EAAE,MAAc;IAC7D,IAAI,CAAC,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC;AAC1C,CAAC;AAED,SAAS,IAAI,CAAC,IAAwB;IACpC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,CAAmB,EAAE,CAAmB;IAC9D,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;SAIe,MAAM,CAAC,OAAoC;IACzD,MAAM,KAAK,GAA6C,IAAI,UAAU,CAAC,CAAC,CAAQ,CAAC;IACjF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,IAAI,GAAG,KAAK,SAAS,EAAE;gBACrB,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,GAAG,GAAG,CAAC,CAAC;aACT;YACD,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;SACxB;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEhC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;;;YAGxB,IAAI,GAAG,GAAG,SAAS,EAAE;gBACnB,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBAClC,GAAG,IAAI,SAAS,CAAC;aAClB;YACD,IAAI,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;YAE9B,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACjD,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACjD,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;SAClD;KACF;IAED,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CACpB,GAAe,EACf,GAAW,EACX,KAAuB,EACvB,OAAyB,EACzB,CAAS;IAET,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEhB,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC3C,GAAG;QACD,IAAI,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC7B,GAAG,MAAM,CAAC,CAAC;QACX,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,QAAQ,CAAC;QACjC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;KACjC,QAAQ,GAAG,GAAG,CAAC,EAAE;IAElB,OAAO,GAAG,CAAC;AACb;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sourcemapCodec = {}));\n})(this, (function (exports) { 'use strict';\n\n    const comma = ','.charCodeAt(0);\n    const semicolon = ';'.charCodeAt(0);\n    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n    const intToChar = new Uint8Array(64); // 64 possible chars.\n    const charToInt = new Uint8Array(128); // z is 122 in ASCII\n    for (let i = 0; i < chars.length; i++) {\n        const c = chars.charCodeAt(i);\n        intToChar[i] = c;\n        charToInt[c] = i;\n    }\n    // Provide a fallback for older environments.\n    const td = typeof TextDecoder !== 'undefined'\n        ? /* #__PURE__ */ new TextDecoder()\n        : typeof Buffer !== 'undefined'\n            ? {\n                decode(buf) {\n                    const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n                    return out.toString();\n                },\n            }\n            : {\n                decode(buf) {\n                    let out = '';\n                    for (let i = 0; i < buf.length; i++) {\n                        out += String.fromCharCode(buf[i]);\n                    }\n                    return out;\n                },\n            };\n    function decode(mappings) {\n        const state = new Int32Array(5);\n        const decoded = [];\n        let index = 0;\n        do {\n            const semi = indexOf(mappings, index);\n            const line = [];\n            let sorted = true;\n            let lastCol = 0;\n            state[0] = 0;\n            for (let i = index; i < semi; i++) {\n                let seg;\n                i = decodeInteger(mappings, i, state, 0); // genColumn\n                const col = state[0];\n                if (col < lastCol)\n                    sorted = false;\n                lastCol = col;\n                if (hasMoreVlq(mappings, i, semi)) {\n                    i = decodeInteger(mappings, i, state, 1); // sourcesIndex\n                    i = decodeInteger(mappings, i, state, 2); // sourceLine\n                    i = decodeInteger(mappings, i, state, 3); // sourceColumn\n                    if (hasMoreVlq(mappings, i, semi)) {\n                        i = decodeInteger(mappings, i, state, 4); // namesIndex\n                        seg = [col, state[1], state[2], state[3], state[4]];\n                    }\n                    else {\n                        seg = [col, state[1], state[2], state[3]];\n                    }\n                }\n                else {\n                    seg = [col];\n                }\n                line.push(seg);\n            }\n            if (!sorted)\n                sort(line);\n            decoded.push(line);\n            index = semi + 1;\n        } while (index <= mappings.length);\n        return decoded;\n    }\n    function indexOf(mappings, index) {\n        const idx = mappings.indexOf(';', index);\n        return idx === -1 ? mappings.length : idx;\n    }\n    function decodeInteger(mappings, pos, state, j) {\n        let value = 0;\n        let shift = 0;\n        let integer = 0;\n        do {\n            const c = mappings.charCodeAt(pos++);\n            integer = charToInt[c];\n            value |= (integer & 31) << shift;\n            shift += 5;\n        } while (integer & 32);\n        const shouldNegate = value & 1;\n        value >>>= 1;\n        if (shouldNegate) {\n            value = -0x80000000 | -value;\n        }\n        state[j] += value;\n        return pos;\n    }\n    function hasMoreVlq(mappings, i, length) {\n        if (i >= length)\n            return false;\n        return mappings.charCodeAt(i) !== comma;\n    }\n    function sort(line) {\n        line.sort(sortComparator);\n    }\n    function sortComparator(a, b) {\n        return a[0] - b[0];\n    }\n    function encode(decoded) {\n        const state = new Int32Array(5);\n        const bufLength = 1024 * 16;\n        const subLength = bufLength - 36;\n        const buf = new Uint8Array(bufLength);\n        const sub = buf.subarray(0, subLength);\n        let pos = 0;\n        let out = '';\n        for (let i = 0; i < decoded.length; i++) {\n            const line = decoded[i];\n            if (i > 0) {\n                if (pos === bufLength) {\n                    out += td.decode(buf);\n                    pos = 0;\n                }\n                buf[pos++] = semicolon;\n            }\n            if (line.length === 0)\n                continue;\n            state[0] = 0;\n            for (let j = 0; j < line.length; j++) {\n                const segment = line[j];\n                // We can push up to 5 ints, each int can take at most 7 chars, and we\n                // may push a comma.\n                if (pos > subLength) {\n                    out += td.decode(sub);\n                    buf.copyWithin(0, subLength, pos);\n                    pos -= subLength;\n                }\n                if (j > 0)\n                    buf[pos++] = comma;\n                pos = encodeInteger(buf, pos, state, segment, 0); // genColumn\n                if (segment.length === 1)\n                    continue;\n                pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex\n                pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine\n                pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn\n                if (segment.length === 4)\n                    continue;\n                pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex\n            }\n        }\n        return out + td.decode(buf.subarray(0, pos));\n    }\n    function encodeInteger(buf, pos, state, segment, j) {\n        const next = segment[j];\n        let num = next - state[j];\n        state[j] = next;\n        num = num < 0 ? (-num << 1) | 1 : num << 1;\n        do {\n            let clamped = num & 0b011111;\n            num >>>= 5;\n            if (num > 0)\n                clamped |= 0b100000;\n            buf[pos++] = intToChar[clamped];\n        } while (num > 0);\n        return pos;\n    }\n\n    exports.decode = decode;\n    exports.encode = encode;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=sourcemap-codec.umd.js.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map",
    "content": "{\"version\":3,\"file\":\"sourcemap-codec.umd.js\",\"sources\":[\"../src/sourcemap-codec.ts\"],\"sourcesContent\":[null],\"names\":[],\"mappings\":\";;;;;;IAOA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,kEAAkE,CAAC;IACjF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;KAClB;IAED;IACA,MAAM,EAAE,GACN,OAAO,WAAW,KAAK,WAAW;0BACd,IAAI,WAAW,EAAE;UACjC,OAAO,MAAM,KAAK,WAAW;cAC7B;gBACE,MAAM,CAAC,GAAe;oBACpB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;oBACpE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACvB;aACF;cACD;gBACE,MAAM,CAAC,GAAe;oBACpB,IAAI,GAAG,GAAG,EAAE,CAAC;oBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBACnC,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;qBACpC;oBACD,OAAO,GAAG,CAAC;iBACZ;aACF,CAAC;aAEQ,MAAM,CAAC,QAAgB;QACrC,MAAM,KAAK,GAA6C,IAAI,UAAU,CAAC,CAAC,CAAQ,CAAC;QACjF,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,IAAI,GAAkB,EAAE,CAAC;YAC/B,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEb,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;gBACjC,IAAI,GAAqB,CAAC;gBAE1B,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,GAAG,GAAG,OAAO;oBAAE,MAAM,GAAG,KAAK,CAAC;gBAClC,OAAO,GAAG,GAAG,CAAC;gBAEd,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;oBACjC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;oBACzC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;oBACzC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;oBAEzC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;wBACjC,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;wBACzC,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;qBACrD;yBAAM;wBACL,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC3C;iBACF;qBAAM;oBACL,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;iBACb;gBAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAChB;YAED,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;SAClB,QAAQ,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;QAEnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,OAAO,CAAC,QAAgB,EAAE,KAAa;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;IAC5C,CAAC;IAED,SAAS,aAAa,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAuB,EAAE,CAAS;QACtF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,GAAG;YACD,MAAM,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YACrC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,KAAK,CAAC;YACjC,KAAK,IAAI,CAAC,CAAC;SACZ,QAAQ,OAAO,GAAG,EAAE,EAAE;QAEvB,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC;QAEb,IAAI,YAAY,EAAE;YAChB,KAAK,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC;SAC9B;QAED,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,UAAU,CAAC,QAAgB,EAAE,CAAS,EAAE,MAAc;QAC7D,IAAI,CAAC,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC;IAC1C,CAAC;IAED,SAAS,IAAI,CAAC,IAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IAED,SAAS,cAAc,CAAC,CAAmB,EAAE,CAAmB;QAC9D,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;aAIe,MAAM,CAAC,OAAoC;QACzD,MAAM,KAAK,GAA6C,IAAI,UAAU,CAAC,CAAC,CAAQ,CAAC;QACjF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,GAAG,GAAG,EAAE,CAAC;QAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,EAAE;gBACT,IAAI,GAAG,KAAK,SAAS,EAAE;oBACrB,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACtB,GAAG,GAAG,CAAC,CAAC;iBACT;gBACD,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;aACxB;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEhC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;;;gBAGxB,IAAI,GAAG,GAAG,SAAS,EAAE;oBACnB,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACtB,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;oBAClC,GAAG,IAAI,SAAS,CAAC;iBAClB;gBACD,IAAI,CAAC,GAAG,CAAC;oBAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;gBAE9B,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACnC,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjD,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjD,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACnC,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;aAClD;SACF;QAED,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS,aAAa,CACpB,GAAe,EACf,GAAW,EACX,KAAuB,EACvB,OAAyB,EACzB,CAAS;QAET,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAEhB,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3C,GAAG;YACD,IAAI,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC;YAC7B,GAAG,MAAM,CAAC,CAAC;YACX,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,QAAQ,CAAC;YACjC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;SACjC,QAAQ,GAAG,GAAG,CAAC,EAAE;QAElB,OAAO,GAAG,CAAC;IACb;;;;;;;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/dist/types/sourcemap-codec.d.ts",
    "content": "export declare type SourceMapSegment = [number] | [number, number, number, number] | [number, number, number, number, number];\nexport declare type SourceMapLine = SourceMapSegment[];\nexport declare type SourceMapMappings = SourceMapLine[];\nexport declare function decode(mappings: string): SourceMapMappings;\nexport declare function encode(decoded: SourceMapMappings): string;\nexport declare function encode(decoded: Readonly<SourceMapMappings>): string;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/package.json",
    "content": "{\n  \"name\": \"@jridgewell/sourcemap-codec\",\n  \"version\": \"1.4.14\",\n  \"description\": \"Encode/decode sourcemap mappings\",\n  \"keywords\": [\n    \"sourcemap\",\n    \"vlq\"\n  ],\n  \"main\": \"dist/sourcemap-codec.umd.js\",\n  \"module\": \"dist/sourcemap-codec.mjs\",\n  \"typings\": \"dist/types/sourcemap-codec.d.ts\",\n  \"files\": [\n    \"dist\",\n    \"src\"\n  ],\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./dist/types/sourcemap-codec.d.ts\",\n        \"browser\": \"./dist/sourcemap-codec.umd.js\",\n        \"import\": \"./dist/sourcemap-codec.mjs\",\n        \"require\": \"./dist/sourcemap-codec.umd.js\"\n      },\n      \"./dist/sourcemap-codec.umd.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"scripts\": {\n    \"benchmark\": \"run-s build:rollup benchmark:*\",\n    \"benchmark:install\": \"cd benchmark && npm install\",\n    \"benchmark:only\": \"node --expose-gc benchmark/index.js\",\n    \"build\": \"run-s -n build:*\",\n    \"build:rollup\": \"rollup -c rollup.config.js\",\n    \"build:ts\": \"tsc --project tsconfig.build.json\",\n    \"lint\": \"run-s -n lint:*\",\n    \"lint:prettier\": \"npm run test:lint:prettier -- --write\",\n    \"lint:ts\": \"npm run test:lint:ts -- --fix\",\n    \"prebuild\": \"rm -rf dist\",\n    \"prepublishOnly\": \"npm run preversion\",\n    \"preversion\": \"run-s test build\",\n    \"pretest\": \"run-s build:rollup\",\n    \"test\": \"run-s -n test:lint test:only\",\n    \"test:debug\": \"mocha --inspect-brk\",\n    \"test:lint\": \"run-s -n test:lint:*\",\n    \"test:lint:prettier\": \"prettier --check '{src,test}/**/*.ts'\",\n    \"test:lint:ts\": \"eslint '{src,test}/**/*.ts'\",\n    \"test:only\": \"mocha\",\n    \"test:coverage\": \"c8 mocha\",\n    \"test:watch\": \"mocha --watch\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jridgewell/sourcemap-codec.git\"\n  },\n  \"author\": \"Rich Harris\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@rollup/plugin-typescript\": \"8.3.0\",\n    \"@types/node\": \"17.0.15\",\n    \"@typescript-eslint/eslint-plugin\": \"5.10.0\",\n    \"@typescript-eslint/parser\": \"5.10.0\",\n    \"benchmark\": \"2.1.4\",\n    \"c8\": \"7.11.2\",\n    \"eslint\": \"8.7.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"mocha\": \"9.2.0\",\n    \"npm-run-all\": \"4.1.5\",\n    \"prettier\": \"2.5.1\",\n    \"rollup\": \"2.64.0\",\n    \"source-map\": \"0.6.1\",\n    \"source-map-js\": \"1.0.2\",\n    \"sourcemap-codec\": \"1.4.8\",\n    \"typescript\": \"4.5.4\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts",
    "content": "export type SourceMapSegment =\n  | [number]\n  | [number, number, number, number]\n  | [number, number, number, number, number];\nexport type SourceMapLine = SourceMapSegment[];\nexport type SourceMapMappings = SourceMapLine[];\n\nconst comma = ','.charCodeAt(0);\nconst semicolon = ';'.charCodeAt(0);\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst intToChar = new Uint8Array(64); // 64 possible chars.\nconst charToInt = new Uint8Array(128); // z is 122 in ASCII\n\nfor (let i = 0; i < chars.length; i++) {\n  const c = chars.charCodeAt(i);\n  intToChar[i] = c;\n  charToInt[c] = i;\n}\n\n// Provide a fallback for older environments.\nconst td =\n  typeof TextDecoder !== 'undefined'\n    ? /* #__PURE__ */ new TextDecoder()\n    : typeof Buffer !== 'undefined'\n    ? {\n        decode(buf: Uint8Array) {\n          const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n          return out.toString();\n        },\n      }\n    : {\n        decode(buf: Uint8Array) {\n          let out = '';\n          for (let i = 0; i < buf.length; i++) {\n            out += String.fromCharCode(buf[i]);\n          }\n          return out;\n        },\n      };\n\nexport function decode(mappings: string): SourceMapMappings {\n  const state: [number, number, number, number, number] = new Int32Array(5) as any;\n  const decoded: SourceMapMappings = [];\n\n  let index = 0;\n  do {\n    const semi = indexOf(mappings, index);\n    const line: SourceMapLine = [];\n    let sorted = true;\n    let lastCol = 0;\n    state[0] = 0;\n\n    for (let i = index; i < semi; i++) {\n      let seg: SourceMapSegment;\n\n      i = decodeInteger(mappings, i, state, 0); // genColumn\n      const col = state[0];\n      if (col < lastCol) sorted = false;\n      lastCol = col;\n\n      if (hasMoreVlq(mappings, i, semi)) {\n        i = decodeInteger(mappings, i, state, 1); // sourcesIndex\n        i = decodeInteger(mappings, i, state, 2); // sourceLine\n        i = decodeInteger(mappings, i, state, 3); // sourceColumn\n\n        if (hasMoreVlq(mappings, i, semi)) {\n          i = decodeInteger(mappings, i, state, 4); // namesIndex\n          seg = [col, state[1], state[2], state[3], state[4]];\n        } else {\n          seg = [col, state[1], state[2], state[3]];\n        }\n      } else {\n        seg = [col];\n      }\n\n      line.push(seg);\n    }\n\n    if (!sorted) sort(line);\n    decoded.push(line);\n    index = semi + 1;\n  } while (index <= mappings.length);\n\n  return decoded;\n}\n\nfunction indexOf(mappings: string, index: number): number {\n  const idx = mappings.indexOf(';', index);\n  return idx === -1 ? mappings.length : idx;\n}\n\nfunction decodeInteger(mappings: string, pos: number, state: SourceMapSegment, j: number): number {\n  let value = 0;\n  let shift = 0;\n  let integer = 0;\n\n  do {\n    const c = mappings.charCodeAt(pos++);\n    integer = charToInt[c];\n    value |= (integer & 31) << shift;\n    shift += 5;\n  } while (integer & 32);\n\n  const shouldNegate = value & 1;\n  value >>>= 1;\n\n  if (shouldNegate) {\n    value = -0x80000000 | -value;\n  }\n\n  state[j] += value;\n  return pos;\n}\n\nfunction hasMoreVlq(mappings: string, i: number, length: number): boolean {\n  if (i >= length) return false;\n  return mappings.charCodeAt(i) !== comma;\n}\n\nfunction sort(line: SourceMapSegment[]) {\n  line.sort(sortComparator);\n}\n\nfunction sortComparator(a: SourceMapSegment, b: SourceMapSegment): number {\n  return a[0] - b[0];\n}\n\nexport function encode(decoded: SourceMapMappings): string;\nexport function encode(decoded: Readonly<SourceMapMappings>): string;\nexport function encode(decoded: Readonly<SourceMapMappings>): string {\n  const state: [number, number, number, number, number] = new Int32Array(5) as any;\n  const bufLength = 1024 * 16;\n  const subLength = bufLength - 36;\n  const buf = new Uint8Array(bufLength);\n  const sub = buf.subarray(0, subLength);\n  let pos = 0;\n  let out = '';\n\n  for (let i = 0; i < decoded.length; i++) {\n    const line = decoded[i];\n    if (i > 0) {\n      if (pos === bufLength) {\n        out += td.decode(buf);\n        pos = 0;\n      }\n      buf[pos++] = semicolon;\n    }\n    if (line.length === 0) continue;\n\n    state[0] = 0;\n\n    for (let j = 0; j < line.length; j++) {\n      const segment = line[j];\n      // We can push up to 5 ints, each int can take at most 7 chars, and we\n      // may push a comma.\n      if (pos > subLength) {\n        out += td.decode(sub);\n        buf.copyWithin(0, subLength, pos);\n        pos -= subLength;\n      }\n      if (j > 0) buf[pos++] = comma;\n\n      pos = encodeInteger(buf, pos, state, segment, 0); // genColumn\n\n      if (segment.length === 1) continue;\n      pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex\n      pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine\n      pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn\n\n      if (segment.length === 4) continue;\n      pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex\n    }\n  }\n\n  return out + td.decode(buf.subarray(0, pos));\n}\n\nfunction encodeInteger(\n  buf: Uint8Array,\n  pos: number,\n  state: SourceMapSegment,\n  segment: SourceMapSegment,\n  j: number,\n): number {\n  const next = segment[j];\n  let num = next - state[j];\n  state[j] = next;\n\n  num = num < 0 ? (-num << 1) | 1 : num << 1;\n  do {\n    let clamped = num & 0b011111;\n    num >>>= 5;\n    if (num > 0) clamped |= 0b100000;\n    buf[pos++] = intToChar[clamped];\n  } while (num > 0);\n\n  return pos;\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/LICENSE",
    "content": "Copyright 2022 Justin Ridgewell <justin@ridgewell.name>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/README.md",
    "content": "# @jridgewell/trace-mapping\n\n> Trace the original position through a source map\n\n`trace-mapping` allows you to take the line and column of an output file and trace it to the\noriginal location in the source file through a source map.\n\nYou may already be familiar with the [`source-map`][source-map] package's `SourceMapConsumer`. This\nprovides the same `originalPositionFor` and `generatedPositionFor` API, without requiring WASM.\n\n## Installation\n\n```sh\nnpm install @jridgewell/trace-mapping\n```\n\n## Usage\n\n```typescript\nimport {\n  TraceMap,\n  originalPositionFor,\n  generatedPositionFor,\n  sourceContentFor,\n} from '@jridgewell/trace-mapping';\n\nconst tracer = new TraceMap({\n  version: 3,\n  sources: ['input.js'],\n  sourcesContent: ['content of input.js'],\n  names: ['foo'],\n  mappings: 'KAyCIA',\n});\n\n// Lines start at line 1, columns at column 0.\nconst traced = originalPositionFor(tracer, { line: 1, column: 5 });\nassert.deepEqual(traced, {\n  source: 'input.js',\n  line: 42,\n  column: 4,\n  name: 'foo',\n});\n\nconst content = sourceContentFor(tracer, traced.source);\nassert.strictEqual(content, 'content for input.js');\n\nconst generated = generatedPositionFor(tracer, {\n  source: 'input.js',\n  line: 42,\n  column: 4,\n});\nassert.deepEqual(generated, {\n  line: 1,\n  column: 5,\n});\n```\n\nWe also provide a lower level API to get the actual segment that matches our line and column. Unlike\n`originalPositionFor`, `traceSegment` uses a 0-base for `line`:\n\n```typescript\nimport { traceSegment } from '@jridgewell/trace-mapping';\n\n// line is 0-base.\nconst traced = traceSegment(tracer, /* line */ 0, /* column */ 5);\n\n// Segments are [outputColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]\n// Again, line is 0-base and so is sourceLine\nassert.deepEqual(traced, [5, 0, 41, 4, 0]);\n```\n\n### SectionedSourceMaps\n\nThe sourcemap spec defines a special `sections` field that's designed to handle concatenation of\noutput code with associated sourcemaps. This type of sourcemap is rarely used (no major build tool\nproduces it), but if you are hand coding a concatenation you may need it. We provide an `AnyMap`\nhelper that can receive either a regular sourcemap or a `SectionedSourceMap` and returns a\n`TraceMap` instance:\n\n```typescript\nimport { AnyMap } from '@jridgewell/trace-mapping';\nconst fooOutput = 'foo';\nconst barOutput = 'bar';\nconst output = [fooOutput, barOutput].join('\\n');\n\nconst sectioned = new AnyMap({\n  version: 3,\n  sections: [\n    {\n      // 0-base line and column\n      offset: { line: 0, column: 0 },\n      // fooOutput's sourcemap\n      map: {\n        version: 3,\n        sources: ['foo.js'],\n        names: ['foo'],\n        mappings: 'AAAAA',\n      },\n    },\n    {\n      // barOutput's sourcemap will not affect the first line, only the second\n      offset: { line: 1, column: 0 },\n      map: {\n        version: 3,\n        sources: ['bar.js'],\n        names: ['bar'],\n        mappings: 'AAAAA',\n      },\n    },\n  ],\n});\n\nconst traced = originalPositionFor(sectioned, {\n  line: 2,\n  column: 0,\n});\n\nassert.deepEqual(traced, {\n  source: 'bar.js',\n  line: 1,\n  column: 0,\n  name: 'bar',\n});\n```\n\n## Benchmarks\n\n```\nnode v18.0.0\n\namp.js.map - 45120 segments\n\nMemory Usage:\ntrace-mapping decoded         562400 bytes\ntrace-mapping encoded        5706544 bytes\nsource-map-js               10717664 bytes\nsource-map-0.6.1            17446384 bytes\nsource-map-0.8.0             9701757 bytes\nSmallest memory usage is trace-mapping decoded\n\nInit speed:\ntrace-mapping:    decoded JSON input x 180 ops/sec ±0.34% (85 runs sampled)\ntrace-mapping:    encoded JSON input x 364 ops/sec ±1.77% (89 runs sampled)\ntrace-mapping:    decoded Object input x 3,116 ops/sec ±0.50% (96 runs sampled)\ntrace-mapping:    encoded Object input x 410 ops/sec ±2.62% (85 runs sampled)\nsource-map-js:    encoded Object input x 84.23 ops/sec ±0.91% (73 runs sampled)\nsource-map-0.6.1: encoded Object input x 37.21 ops/sec ±2.08% (51 runs sampled)\nFastest is trace-mapping:    decoded Object input\n\nTrace speed:\ntrace-mapping:    decoded originalPositionFor x 3,952,212 ops/sec ±0.17% (98 runs sampled)\ntrace-mapping:    encoded originalPositionFor x 3,487,468 ops/sec ±1.58% (90 runs sampled)\nsource-map-js:    encoded originalPositionFor x 827,730 ops/sec ±0.78% (97 runs sampled)\nsource-map-0.6.1: encoded originalPositionFor x 748,991 ops/sec ±0.53% (94 runs sampled)\nsource-map-0.8.0: encoded originalPositionFor x 2,532,894 ops/sec ±0.57% (95 runs sampled)\nFastest is trace-mapping:    decoded originalPositionFor\n\n\n***\n\n\nbabel.min.js.map - 347793 segments\n\nMemory Usage:\ntrace-mapping decoded          89832 bytes\ntrace-mapping encoded       35474640 bytes\nsource-map-js               51257176 bytes\nsource-map-0.6.1            63515664 bytes\nsource-map-0.8.0            42933752 bytes\nSmallest memory usage is trace-mapping decoded\n\nInit speed:\ntrace-mapping:    decoded JSON input x 15.41 ops/sec ±8.65% (34 runs sampled)\ntrace-mapping:    encoded JSON input x 28.20 ops/sec ±12.87% (42 runs sampled)\ntrace-mapping:    decoded Object input x 964 ops/sec ±0.36% (99 runs sampled)\ntrace-mapping:    encoded Object input x 31.77 ops/sec ±13.79% (45 runs sampled)\nsource-map-js:    encoded Object input x 6.45 ops/sec ±5.16% (21 runs sampled)\nsource-map-0.6.1: encoded Object input x 4.07 ops/sec ±5.24% (15 runs sampled)\nFastest is trace-mapping:    decoded Object input\n\nTrace speed:\ntrace-mapping:    decoded originalPositionFor x 7,183,038 ops/sec ±0.58% (95 runs sampled)\ntrace-mapping:    encoded originalPositionFor x 5,192,185 ops/sec ±0.41% (100 runs sampled)\nsource-map-js:    encoded originalPositionFor x 4,259,489 ops/sec ±0.79% (94 runs sampled)\nsource-map-0.6.1: encoded originalPositionFor x 3,742,629 ops/sec ±0.71% (95 runs sampled)\nsource-map-0.8.0: encoded originalPositionFor x 6,270,211 ops/sec ±0.64% (94 runs sampled)\nFastest is trace-mapping:    decoded originalPositionFor\n\n\n***\n\n\npreact.js.map - 1992 segments\n\nMemory Usage:\ntrace-mapping decoded          37128 bytes\ntrace-mapping encoded         247280 bytes\nsource-map-js                1143536 bytes\nsource-map-0.6.1             1290992 bytes\nsource-map-0.8.0               96544 bytes\nSmallest memory usage is trace-mapping decoded\n\nInit speed:\ntrace-mapping:    decoded JSON input x 3,483 ops/sec ±0.30% (98 runs sampled)\ntrace-mapping:    encoded JSON input x 6,092 ops/sec ±0.18% (97 runs sampled)\ntrace-mapping:    decoded Object input x 249,076 ops/sec ±0.24% (98 runs sampled)\ntrace-mapping:    encoded Object input x 14,555 ops/sec ±0.48% (100 runs sampled)\nsource-map-js:    encoded Object input x 2,447 ops/sec ±0.36% (99 runs sampled)\nsource-map-0.6.1: encoded Object input x 1,201 ops/sec ±0.57% (96 runs sampled)\nFastest is trace-mapping:    decoded Object input\n\nTrace speed:\ntrace-mapping:    decoded originalPositionFor x 7,620,192 ops/sec ±0.09% (99 runs sampled)\ntrace-mapping:    encoded originalPositionFor x 6,872,554 ops/sec ±0.30% (97 runs sampled)\nsource-map-js:    encoded originalPositionFor x 2,489,570 ops/sec ±0.35% (94 runs sampled)\nsource-map-0.6.1: encoded originalPositionFor x 1,698,633 ops/sec ±0.28% (98 runs sampled)\nsource-map-0.8.0: encoded originalPositionFor x 4,015,644 ops/sec ±0.22% (98 runs sampled)\nFastest is trace-mapping:    decoded originalPositionFor\n\n\n***\n\n\nreact.js.map - 5726 segments\n\nMemory Usage:\ntrace-mapping decoded          16176 bytes\ntrace-mapping encoded         681552 bytes\nsource-map-js                2418352 bytes\nsource-map-0.6.1             2443672 bytes\nsource-map-0.8.0              111768 bytes\nSmallest memory usage is trace-mapping decoded\n\nInit speed:\ntrace-mapping:    decoded JSON input x 1,720 ops/sec ±0.34% (98 runs sampled)\ntrace-mapping:    encoded JSON input x 4,406 ops/sec ±0.35% (100 runs sampled)\ntrace-mapping:    decoded Object input x 92,122 ops/sec ±0.10% (99 runs sampled)\ntrace-mapping:    encoded Object input x 5,385 ops/sec ±0.37% (99 runs sampled)\nsource-map-js:    encoded Object input x 794 ops/sec ±0.40% (98 runs sampled)\nsource-map-0.6.1: encoded Object input x 416 ops/sec ±0.54% (91 runs sampled)\nFastest is trace-mapping:    decoded Object input\n\nTrace speed:\ntrace-mapping:    decoded originalPositionFor x 32,759,519 ops/sec ±0.33% (100 runs sampled)\ntrace-mapping:    encoded originalPositionFor x 31,116,306 ops/sec ±0.33% (97 runs sampled)\nsource-map-js:    encoded originalPositionFor x 17,458,435 ops/sec ±0.44% (97 runs sampled)\nsource-map-0.6.1: encoded originalPositionFor x 12,687,097 ops/sec ±0.43% (95 runs sampled)\nsource-map-0.8.0: encoded originalPositionFor x 23,538,275 ops/sec ±0.38% (95 runs sampled)\nFastest is trace-mapping:    decoded originalPositionFor\n```\n\n[source-map]: https://www.npmjs.com/package/source-map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs",
    "content": "import { encode, decode } from '@jridgewell/sourcemap-codec';\nimport resolveUri from '@jridgewell/resolve-uri';\n\nfunction resolve(input, base) {\n    // The base is always treated as a directory, if it's not empty.\n    // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\n    // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\n    if (base && !base.endsWith('/'))\n        base += '/';\n    return resolveUri(input, base);\n}\n\n/**\n * Removes everything after the last \"/\", but leaves the slash.\n */\nfunction stripFilename(path) {\n    if (!path)\n        return '';\n    const index = path.lastIndexOf('/');\n    return path.slice(0, index + 1);\n}\n\nconst COLUMN = 0;\nconst SOURCES_INDEX = 1;\nconst SOURCE_LINE = 2;\nconst SOURCE_COLUMN = 3;\nconst NAMES_INDEX = 4;\nconst REV_GENERATED_LINE = 1;\nconst REV_GENERATED_COLUMN = 2;\n\nfunction maybeSort(mappings, owned) {\n    const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\n    if (unsortedIndex === mappings.length)\n        return mappings;\n    // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\n    // not, we do not want to modify the consumer's input array.\n    if (!owned)\n        mappings = mappings.slice();\n    for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\n        mappings[i] = sortSegments(mappings[i], owned);\n    }\n    return mappings;\n}\nfunction nextUnsortedSegmentLine(mappings, start) {\n    for (let i = start; i < mappings.length; i++) {\n        if (!isSorted(mappings[i]))\n            return i;\n    }\n    return mappings.length;\n}\nfunction isSorted(line) {\n    for (let j = 1; j < line.length; j++) {\n        if (line[j][COLUMN] < line[j - 1][COLUMN]) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction sortSegments(line, owned) {\n    if (!owned)\n        line = line.slice();\n    return line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n    return a[COLUMN] - b[COLUMN];\n}\n\nlet found = false;\n/**\n * A binary search implementation that returns the index if a match is found.\n * If no match is found, then the left-index (the index associated with the item that comes just\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\n * the next index:\n *\n * ```js\n * const array = [1, 3];\n * const needle = 2;\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\n *\n * assert.equal(index, 0);\n * array.splice(index + 1, 0, needle);\n * assert.deepEqual(array, [1, 2, 3]);\n * ```\n */\nfunction binarySearch(haystack, needle, low, high) {\n    while (low <= high) {\n        const mid = low + ((high - low) >> 1);\n        const cmp = haystack[mid][COLUMN] - needle;\n        if (cmp === 0) {\n            found = true;\n            return mid;\n        }\n        if (cmp < 0) {\n            low = mid + 1;\n        }\n        else {\n            high = mid - 1;\n        }\n    }\n    found = false;\n    return low - 1;\n}\nfunction upperBound(haystack, needle, index) {\n    for (let i = index + 1; i < haystack.length; index = i++) {\n        if (haystack[i][COLUMN] !== needle)\n            break;\n    }\n    return index;\n}\nfunction lowerBound(haystack, needle, index) {\n    for (let i = index - 1; i >= 0; index = i--) {\n        if (haystack[i][COLUMN] !== needle)\n            break;\n    }\n    return index;\n}\nfunction memoizedState() {\n    return {\n        lastKey: -1,\n        lastNeedle: -1,\n        lastIndex: -1,\n    };\n}\n/**\n * This overly complicated beast is just to record the last tested line/column and the resulting\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\n */\nfunction memoizedBinarySearch(haystack, needle, state, key) {\n    const { lastKey, lastNeedle, lastIndex } = state;\n    let low = 0;\n    let high = haystack.length - 1;\n    if (key === lastKey) {\n        if (needle === lastNeedle) {\n            found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;\n            return lastIndex;\n        }\n        if (needle >= lastNeedle) {\n            // lastIndex may be -1 if the previous needle was not found.\n            low = lastIndex === -1 ? 0 : lastIndex;\n        }\n        else {\n            high = lastIndex;\n        }\n    }\n    state.lastKey = key;\n    state.lastNeedle = needle;\n    return (state.lastIndex = binarySearch(haystack, needle, low, high));\n}\n\n// Rebuilds the original source files, with mappings that are ordered by source line/column instead\n// of generated line/column.\nfunction buildBySources(decoded, memos) {\n    const sources = memos.map(buildNullArray);\n    for (let i = 0; i < decoded.length; i++) {\n        const line = decoded[i];\n        for (let j = 0; j < line.length; j++) {\n            const seg = line[j];\n            if (seg.length === 1)\n                continue;\n            const sourceIndex = seg[SOURCES_INDEX];\n            const sourceLine = seg[SOURCE_LINE];\n            const sourceColumn = seg[SOURCE_COLUMN];\n            const originalSource = sources[sourceIndex];\n            const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));\n            const memo = memos[sourceIndex];\n            // The binary search either found a match, or it found the left-index just before where the\n            // segment should go. Either way, we want to insert after that. And there may be multiple\n            // generated segments associated with an original location, so there may need to move several\n            // indexes before we find where we need to insert.\n            const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));\n            insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);\n        }\n    }\n    return sources;\n}\nfunction insert(array, index, value) {\n    for (let i = array.length; i > index; i--) {\n        array[i] = array[i - 1];\n    }\n    array[index] = value;\n}\n// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like\n// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.\n// Numeric properties on objects are magically sorted in ascending order by the engine regardless of\n// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending\n// order when iterating with for-in.\nfunction buildNullArray() {\n    return { __proto__: null };\n}\n\nconst AnyMap = function (map, mapUrl) {\n    const parsed = typeof map === 'string' ? JSON.parse(map) : map;\n    if (!('sections' in parsed))\n        return new TraceMap(parsed, mapUrl);\n    const mappings = [];\n    const sources = [];\n    const sourcesContent = [];\n    const names = [];\n    recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);\n    const joined = {\n        version: 3,\n        file: parsed.file,\n        names,\n        sources,\n        sourcesContent,\n        mappings,\n    };\n    return presortedDecodedMap(joined);\n};\nfunction recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {\n    const { sections } = input;\n    for (let i = 0; i < sections.length; i++) {\n        const { map, offset } = sections[i];\n        let sl = stopLine;\n        let sc = stopColumn;\n        if (i + 1 < sections.length) {\n            const nextOffset = sections[i + 1].offset;\n            sl = Math.min(stopLine, lineOffset + nextOffset.line);\n            if (sl === stopLine) {\n                sc = Math.min(stopColumn, columnOffset + nextOffset.column);\n            }\n            else if (sl < stopLine) {\n                sc = columnOffset + nextOffset.column;\n            }\n        }\n        addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);\n    }\n}\nfunction addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {\n    if ('sections' in input)\n        return recurse(...arguments);\n    const map = new TraceMap(input, mapUrl);\n    const sourcesOffset = sources.length;\n    const namesOffset = names.length;\n    const decoded = decodedMappings(map);\n    const { resolvedSources, sourcesContent: contents } = map;\n    append(sources, resolvedSources);\n    append(names, map.names);\n    if (contents)\n        append(sourcesContent, contents);\n    else\n        for (let i = 0; i < resolvedSources.length; i++)\n            sourcesContent.push(null);\n    for (let i = 0; i < decoded.length; i++) {\n        const lineI = lineOffset + i;\n        // We can only add so many lines before we step into the range that the next section's map\n        // controls. When we get to the last line, then we'll start checking the segments to see if\n        // they've crossed into the column range. But it may not have any columns that overstep, so we\n        // still need to check that we don't overstep lines, too.\n        if (lineI > stopLine)\n            return;\n        // The out line may already exist in mappings (if we're continuing the line started by a\n        // previous section). Or, we may have jumped ahead several lines to start this section.\n        const out = getLine(mappings, lineI);\n        // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\n        // map can be multiple lines), it doesn't.\n        const cOffset = i === 0 ? columnOffset : 0;\n        const line = decoded[i];\n        for (let j = 0; j < line.length; j++) {\n            const seg = line[j];\n            const column = cOffset + seg[COLUMN];\n            // If this segment steps into the column range that the next section's map controls, we need\n            // to stop early.\n            if (lineI === stopLine && column >= stopColumn)\n                return;\n            if (seg.length === 1) {\n                out.push([column]);\n                continue;\n            }\n            const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];\n            const sourceLine = seg[SOURCE_LINE];\n            const sourceColumn = seg[SOURCE_COLUMN];\n            out.push(seg.length === 4\n                ? [column, sourcesIndex, sourceLine, sourceColumn]\n                : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);\n        }\n    }\n}\nfunction append(arr, other) {\n    for (let i = 0; i < other.length; i++)\n        arr.push(other[i]);\n}\nfunction getLine(arr, index) {\n    for (let i = arr.length; i <= index; i++)\n        arr[i] = [];\n    return arr[index];\n}\n\nconst LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\nconst COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\nconst LEAST_UPPER_BOUND = -1;\nconst GREATEST_LOWER_BOUND = 1;\n/**\n * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\n */\nlet encodedMappings;\n/**\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\n */\nlet decodedMappings;\n/**\n * A low-level API to find the segment associated with a generated line/column (think, from a\n * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\n */\nlet traceSegment;\n/**\n * A higher-level API to find the source/line/column associated with a generated line/column\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\n * `source-map` library.\n */\nlet originalPositionFor;\n/**\n * Finds the generated line/column position of the provided source/line/column source position.\n */\nlet generatedPositionFor;\n/**\n * Finds all generated line/column positions of the provided source/line/column source position.\n */\nlet allGeneratedPositionsFor;\n/**\n * Iterates each mapping in generated position order.\n */\nlet eachMapping;\n/**\n * Retrieves the source content for a particular source, if its found. Returns null if not.\n */\nlet sourceContentFor;\n/**\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\n * maps.\n */\nlet presortedDecodedMap;\n/**\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nlet decodedMap;\n/**\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nlet encodedMap;\nclass TraceMap {\n    constructor(map, mapUrl) {\n        const isString = typeof map === 'string';\n        if (!isString && map._decodedMemo)\n            return map;\n        const parsed = (isString ? JSON.parse(map) : map);\n        const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\n        this.version = version;\n        this.file = file;\n        this.names = names;\n        this.sourceRoot = sourceRoot;\n        this.sources = sources;\n        this.sourcesContent = sourcesContent;\n        const from = resolve(sourceRoot || '', stripFilename(mapUrl));\n        this.resolvedSources = sources.map((s) => resolve(s || '', from));\n        const { mappings } = parsed;\n        if (typeof mappings === 'string') {\n            this._encoded = mappings;\n            this._decoded = undefined;\n        }\n        else {\n            this._encoded = undefined;\n            this._decoded = maybeSort(mappings, isString);\n        }\n        this._decodedMemo = memoizedState();\n        this._bySources = undefined;\n        this._bySourceMemos = undefined;\n    }\n}\n(() => {\n    encodedMappings = (map) => {\n        var _a;\n        return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = encode(map._decoded)));\n    };\n    decodedMappings = (map) => {\n        return (map._decoded || (map._decoded = decode(map._encoded)));\n    };\n    traceSegment = (map, line, column) => {\n        const decoded = decodedMappings(map);\n        // It's common for parent source maps to have pointers to lines that have no\n        // mapping (like a \"//# sourceMappingURL=\") at the end of the child file.\n        if (line >= decoded.length)\n            return null;\n        const segments = decoded[line];\n        const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);\n        return index === -1 ? null : segments[index];\n    };\n    originalPositionFor = (map, { line, column, bias }) => {\n        line--;\n        if (line < 0)\n            throw new Error(LINE_GTR_ZERO);\n        if (column < 0)\n            throw new Error(COL_GTR_EQ_ZERO);\n        const decoded = decodedMappings(map);\n        // It's common for parent source maps to have pointers to lines that have no\n        // mapping (like a \"//# sourceMappingURL=\") at the end of the child file.\n        if (line >= decoded.length)\n            return OMapping(null, null, null, null);\n        const segments = decoded[line];\n        const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);\n        if (index === -1)\n            return OMapping(null, null, null, null);\n        const segment = segments[index];\n        if (segment.length === 1)\n            return OMapping(null, null, null, null);\n        const { names, resolvedSources } = map;\n        return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);\n    };\n    allGeneratedPositionsFor = (map, { source, line, column, bias }) => {\n        // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.\n        return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);\n    };\n    generatedPositionFor = (map, { source, line, column, bias }) => {\n        return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);\n    };\n    eachMapping = (map, cb) => {\n        const decoded = decodedMappings(map);\n        const { names, resolvedSources } = map;\n        for (let i = 0; i < decoded.length; i++) {\n            const line = decoded[i];\n            for (let j = 0; j < line.length; j++) {\n                const seg = line[j];\n                const generatedLine = i + 1;\n                const generatedColumn = seg[0];\n                let source = null;\n                let originalLine = null;\n                let originalColumn = null;\n                let name = null;\n                if (seg.length !== 1) {\n                    source = resolvedSources[seg[1]];\n                    originalLine = seg[2] + 1;\n                    originalColumn = seg[3];\n                }\n                if (seg.length === 5)\n                    name = names[seg[4]];\n                cb({\n                    generatedLine,\n                    generatedColumn,\n                    source,\n                    originalLine,\n                    originalColumn,\n                    name,\n                });\n            }\n        }\n    };\n    sourceContentFor = (map, source) => {\n        const { sources, resolvedSources, sourcesContent } = map;\n        if (sourcesContent == null)\n            return null;\n        let index = sources.indexOf(source);\n        if (index === -1)\n            index = resolvedSources.indexOf(source);\n        return index === -1 ? null : sourcesContent[index];\n    };\n    presortedDecodedMap = (map, mapUrl) => {\n        const tracer = new TraceMap(clone(map, []), mapUrl);\n        tracer._decoded = map.mappings;\n        return tracer;\n    };\n    decodedMap = (map) => {\n        return clone(map, decodedMappings(map));\n    };\n    encodedMap = (map) => {\n        return clone(map, encodedMappings(map));\n    };\n    function generatedPosition(map, source, line, column, bias, all) {\n        line--;\n        if (line < 0)\n            throw new Error(LINE_GTR_ZERO);\n        if (column < 0)\n            throw new Error(COL_GTR_EQ_ZERO);\n        const { sources, resolvedSources } = map;\n        let sourceIndex = sources.indexOf(source);\n        if (sourceIndex === -1)\n            sourceIndex = resolvedSources.indexOf(source);\n        if (sourceIndex === -1)\n            return all ? [] : GMapping(null, null);\n        const generated = (map._bySources || (map._bySources = buildBySources(decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));\n        const segments = generated[sourceIndex][line];\n        if (segments == null)\n            return all ? [] : GMapping(null, null);\n        const memo = map._bySourceMemos[sourceIndex];\n        if (all)\n            return sliceGeneratedPositions(segments, memo, line, column, bias);\n        const index = traceSegmentInternal(segments, memo, line, column, bias);\n        if (index === -1)\n            return GMapping(null, null);\n        const segment = segments[index];\n        return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);\n    }\n})();\nfunction clone(map, mappings) {\n    return {\n        version: map.version,\n        file: map.file,\n        names: map.names,\n        sourceRoot: map.sourceRoot,\n        sources: map.sources,\n        sourcesContent: map.sourcesContent,\n        mappings,\n    };\n}\nfunction OMapping(source, line, column, name) {\n    return { source, line, column, name };\n}\nfunction GMapping(line, column) {\n    return { line, column };\n}\nfunction traceSegmentInternal(segments, memo, line, column, bias) {\n    let index = memoizedBinarySearch(segments, column, memo, line);\n    if (found) {\n        index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\n    }\n    else if (bias === LEAST_UPPER_BOUND)\n        index++;\n    if (index === -1 || index === segments.length)\n        return -1;\n    return index;\n}\nfunction sliceGeneratedPositions(segments, memo, line, column, bias) {\n    let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);\n    // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in\n    // insertion order) segment that matched. Even if we did respect the bias when tracing, we would\n    // still need to call `lowerBound()` to find the first segment, which is slower than just looking\n    // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the\n    // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to\n    // match LEAST_UPPER_BOUND.\n    if (!found && bias === LEAST_UPPER_BOUND)\n        min++;\n    if (min === -1 || min === segments.length)\n        return [];\n    // We may have found the segment that started at an earlier column. If this is the case, then we\n    // need to slice all generated segments that match _that_ column, because all such segments span\n    // to our desired column.\n    const matchedColumn = found ? column : segments[min][COLUMN];\n    // The binary search is not guaranteed to find the lower bound when a match wasn't found.\n    if (!found)\n        min = lowerBound(segments, matchedColumn, min);\n    const max = upperBound(segments, matchedColumn, min);\n    const result = [];\n    for (; min <= max; min++) {\n        const segment = segments[min];\n        result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));\n    }\n    return result;\n}\n\nexport { AnyMap, GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap, allGeneratedPositionsFor, decodedMap, decodedMappings, eachMapping, encodedMap, encodedMappings, generatedPositionFor, originalPositionFor, presortedDecodedMap, sourceContentFor, traceSegment };\n//# sourceMappingURL=trace-mapping.mjs.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map",
    "content": "{\"version\":3,\"file\":\"trace-mapping.mjs\",\"sources\":[\"../src/resolve.ts\",\"../src/strip-filename.ts\",\"../src/sourcemap-segment.ts\",\"../src/sort.ts\",\"../src/binary-search.ts\",\"../src/by-source.ts\",\"../src/any-map.ts\",\"../src/trace-mapping.ts\"],\"sourcesContent\":[\"import resolveUri from '@jridgewell/resolve-uri';\\n\\nexport default function resolve(input: string, base: string | undefined): string {\\n  // The base is always treated as a directory, if it's not empty.\\n  // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\\n  // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\\n  if (base && !base.endsWith('/')) base += '/';\\n\\n  return resolveUri(input, base);\\n}\\n\",\"/**\\n * Removes everything after the last \\\"/\\\", but leaves the slash.\\n */\\nexport default function stripFilename(path: string | undefined | null): string {\\n  if (!path) return '';\\n  const index = path.lastIndexOf('/');\\n  return path.slice(0, index + 1);\\n}\\n\",\"type GeneratedColumn = number;\\ntype SourcesIndex = number;\\ntype SourceLine = number;\\ntype SourceColumn = number;\\ntype NamesIndex = number;\\n\\ntype GeneratedLine = number;\\n\\nexport type SourceMapSegment =\\n  | [GeneratedColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];\\n\\nexport type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn];\\n\\nexport const COLUMN = 0;\\nexport const SOURCES_INDEX = 1;\\nexport const SOURCE_LINE = 2;\\nexport const SOURCE_COLUMN = 3;\\nexport const NAMES_INDEX = 4;\\n\\nexport const REV_GENERATED_LINE = 1;\\nexport const REV_GENERATED_COLUMN = 2;\\n\",\"import { COLUMN } from './sourcemap-segment';\\n\\nimport type { SourceMapSegment } from './sourcemap-segment';\\n\\nexport default function maybeSort(\\n  mappings: SourceMapSegment[][],\\n  owned: boolean,\\n): SourceMapSegment[][] {\\n  const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\\n  if (unsortedIndex === mappings.length) return mappings;\\n\\n  // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\\n  // not, we do not want to modify the consumer's input array.\\n  if (!owned) mappings = mappings.slice();\\n\\n  for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\\n    mappings[i] = sortSegments(mappings[i], owned);\\n  }\\n  return mappings;\\n}\\n\\nfunction nextUnsortedSegmentLine(mappings: SourceMapSegment[][], start: number): number {\\n  for (let i = start; i < mappings.length; i++) {\\n    if (!isSorted(mappings[i])) return i;\\n  }\\n  return mappings.length;\\n}\\n\\nfunction isSorted(line: SourceMapSegment[]): boolean {\\n  for (let j = 1; j < line.length; j++) {\\n    if (line[j][COLUMN] < line[j - 1][COLUMN]) {\\n      return false;\\n    }\\n  }\\n  return true;\\n}\\n\\nfunction sortSegments(line: SourceMapSegment[], owned: boolean): SourceMapSegment[] {\\n  if (!owned) line = line.slice();\\n  return line.sort(sortComparator);\\n}\\n\\nfunction sortComparator(a: SourceMapSegment, b: SourceMapSegment): number {\\n  return a[COLUMN] - b[COLUMN];\\n}\\n\",\"import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment';\\nimport { COLUMN } from './sourcemap-segment';\\n\\nexport type MemoState = {\\n  lastKey: number;\\n  lastNeedle: number;\\n  lastIndex: number;\\n};\\n\\nexport let found = false;\\n\\n/**\\n * A binary search implementation that returns the index if a match is found.\\n * If no match is found, then the left-index (the index associated with the item that comes just\\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\\n * the next index:\\n *\\n * ```js\\n * const array = [1, 3];\\n * const needle = 2;\\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\\n *\\n * assert.equal(index, 0);\\n * array.splice(index + 1, 0, needle);\\n * assert.deepEqual(array, [1, 2, 3]);\\n * ```\\n */\\nexport function binarySearch(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  low: number,\\n  high: number,\\n): number {\\n  while (low <= high) {\\n    const mid = low + ((high - low) >> 1);\\n    const cmp = haystack[mid][COLUMN] - needle;\\n\\n    if (cmp === 0) {\\n      found = true;\\n      return mid;\\n    }\\n\\n    if (cmp < 0) {\\n      low = mid + 1;\\n    } else {\\n      high = mid - 1;\\n    }\\n  }\\n\\n  found = false;\\n  return low - 1;\\n}\\n\\nexport function upperBound(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  index: number,\\n): number {\\n  for (let i = index + 1; i < haystack.length; index = i++) {\\n    if (haystack[i][COLUMN] !== needle) break;\\n  }\\n  return index;\\n}\\n\\nexport function lowerBound(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  index: number,\\n): number {\\n  for (let i = index - 1; i >= 0; index = i--) {\\n    if (haystack[i][COLUMN] !== needle) break;\\n  }\\n  return index;\\n}\\n\\nexport function memoizedState(): MemoState {\\n  return {\\n    lastKey: -1,\\n    lastNeedle: -1,\\n    lastIndex: -1,\\n  };\\n}\\n\\n/**\\n * This overly complicated beast is just to record the last tested line/column and the resulting\\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\\n */\\nexport function memoizedBinarySearch(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  state: MemoState,\\n  key: number,\\n): number {\\n  const { lastKey, lastNeedle, lastIndex } = state;\\n\\n  let low = 0;\\n  let high = haystack.length - 1;\\n  if (key === lastKey) {\\n    if (needle === lastNeedle) {\\n      found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;\\n      return lastIndex;\\n    }\\n\\n    if (needle >= lastNeedle) {\\n      // lastIndex may be -1 if the previous needle was not found.\\n      low = lastIndex === -1 ? 0 : lastIndex;\\n    } else {\\n      high = lastIndex;\\n    }\\n  }\\n  state.lastKey = key;\\n  state.lastNeedle = needle;\\n\\n  return (state.lastIndex = binarySearch(haystack, needle, low, high));\\n}\\n\",\"import { COLUMN, SOURCES_INDEX, SOURCE_LINE, SOURCE_COLUMN } from './sourcemap-segment';\\nimport { memoizedBinarySearch, upperBound } from './binary-search';\\n\\nimport type { ReverseSegment, SourceMapSegment } from './sourcemap-segment';\\nimport type { MemoState } from './binary-search';\\n\\nexport type Source = {\\n  __proto__: null;\\n  [line: number]: Exclude<ReverseSegment, [number]>[];\\n};\\n\\n// Rebuilds the original source files, with mappings that are ordered by source line/column instead\\n// of generated line/column.\\nexport default function buildBySources(\\n  decoded: readonly SourceMapSegment[][],\\n  memos: MemoState[],\\n): Source[] {\\n  const sources: Source[] = memos.map(buildNullArray);\\n\\n  for (let i = 0; i < decoded.length; i++) {\\n    const line = decoded[i];\\n    for (let j = 0; j < line.length; j++) {\\n      const seg = line[j];\\n      if (seg.length === 1) continue;\\n\\n      const sourceIndex = seg[SOURCES_INDEX];\\n      const sourceLine = seg[SOURCE_LINE];\\n      const sourceColumn = seg[SOURCE_COLUMN];\\n      const originalSource = sources[sourceIndex];\\n      const originalLine = (originalSource[sourceLine] ||= []);\\n      const memo = memos[sourceIndex];\\n\\n      // The binary search either found a match, or it found the left-index just before where the\\n      // segment should go. Either way, we want to insert after that. And there may be multiple\\n      // generated segments associated with an original location, so there may need to move several\\n      // indexes before we find where we need to insert.\\n      const index = upperBound(\\n        originalLine,\\n        sourceColumn,\\n        memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine),\\n      );\\n\\n      insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);\\n    }\\n  }\\n\\n  return sources;\\n}\\n\\nfunction insert<T>(array: T[], index: number, value: T) {\\n  for (let i = array.length; i > index; i--) {\\n    array[i] = array[i - 1];\\n  }\\n  array[index] = value;\\n}\\n\\n// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like\\n// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.\\n// Numeric properties on objects are magically sorted in ascending order by the engine regardless of\\n// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending\\n// order when iterating with for-in.\\nfunction buildNullArray<T extends { __proto__: null }>(): T {\\n  return { __proto__: null } as T;\\n}\\n\",\"import { TraceMap, presortedDecodedMap, decodedMappings } from './trace-mapping';\\nimport {\\n  COLUMN,\\n  SOURCES_INDEX,\\n  SOURCE_LINE,\\n  SOURCE_COLUMN,\\n  NAMES_INDEX,\\n} from './sourcemap-segment';\\n\\nimport type {\\n  Section,\\n  SectionedSourceMap,\\n  DecodedSourceMap,\\n  SectionedSourceMapInput,\\n  Ro,\\n} from './types';\\nimport type { SourceMapSegment } from './sourcemap-segment';\\n\\ntype AnyMap = {\\n  new (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;\\n  (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;\\n};\\n\\nexport const AnyMap: AnyMap = function (map, mapUrl) {\\n  const parsed =\\n    typeof map === 'string' ? (JSON.parse(map) as Exclude<SectionedSourceMapInput, string>) : map;\\n\\n  if (!('sections' in parsed)) return new TraceMap(parsed, mapUrl);\\n\\n  const mappings: SourceMapSegment[][] = [];\\n  const sources: string[] = [];\\n  const sourcesContent: (string | null)[] = [];\\n  const names: string[] = [];\\n\\n  recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);\\n\\n  const joined: DecodedSourceMap = {\\n    version: 3,\\n    file: parsed.file,\\n    names,\\n    sources,\\n    sourcesContent,\\n    mappings,\\n  };\\n\\n  return presortedDecodedMap(joined);\\n} as AnyMap;\\n\\nfunction recurse(\\n  input: Ro<SectionedSourceMap>,\\n  mapUrl: string | null | undefined,\\n  mappings: SourceMapSegment[][],\\n  sources: string[],\\n  sourcesContent: (string | null)[],\\n  names: string[],\\n  lineOffset: number,\\n  columnOffset: number,\\n  stopLine: number,\\n  stopColumn: number,\\n) {\\n  const { sections } = input;\\n  for (let i = 0; i < sections.length; i++) {\\n    const { map, offset } = sections[i];\\n\\n    let sl = stopLine;\\n    let sc = stopColumn;\\n    if (i + 1 < sections.length) {\\n      const nextOffset = sections[i + 1].offset;\\n      sl = Math.min(stopLine, lineOffset + nextOffset.line);\\n\\n      if (sl === stopLine) {\\n        sc = Math.min(stopColumn, columnOffset + nextOffset.column);\\n      } else if (sl < stopLine) {\\n        sc = columnOffset + nextOffset.column;\\n      }\\n    }\\n\\n    addSection(\\n      map,\\n      mapUrl,\\n      mappings,\\n      sources,\\n      sourcesContent,\\n      names,\\n      lineOffset + offset.line,\\n      columnOffset + offset.column,\\n      sl,\\n      sc,\\n    );\\n  }\\n}\\n\\nfunction addSection(\\n  input: Ro<Section['map']>,\\n  mapUrl: string | null | undefined,\\n  mappings: SourceMapSegment[][],\\n  sources: string[],\\n  sourcesContent: (string | null)[],\\n  names: string[],\\n  lineOffset: number,\\n  columnOffset: number,\\n  stopLine: number,\\n  stopColumn: number,\\n) {\\n  if ('sections' in input) return recurse(...(arguments as unknown as Parameters<typeof recurse>));\\n\\n  const map = new TraceMap(input, mapUrl);\\n  const sourcesOffset = sources.length;\\n  const namesOffset = names.length;\\n  const decoded = decodedMappings(map);\\n  const { resolvedSources, sourcesContent: contents } = map;\\n\\n  append(sources, resolvedSources);\\n  append(names, map.names);\\n  if (contents) append(sourcesContent, contents);\\n  else for (let i = 0; i < resolvedSources.length; i++) sourcesContent.push(null);\\n\\n  for (let i = 0; i < decoded.length; i++) {\\n    const lineI = lineOffset + i;\\n\\n    // We can only add so many lines before we step into the range that the next section's map\\n    // controls. When we get to the last line, then we'll start checking the segments to see if\\n    // they've crossed into the column range. But it may not have any columns that overstep, so we\\n    // still need to check that we don't overstep lines, too.\\n    if (lineI > stopLine) return;\\n\\n    // The out line may already exist in mappings (if we're continuing the line started by a\\n    // previous section). Or, we may have jumped ahead several lines to start this section.\\n    const out = getLine(mappings, lineI);\\n    // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\\n    // map can be multiple lines), it doesn't.\\n    const cOffset = i === 0 ? columnOffset : 0;\\n\\n    const line = decoded[i];\\n    for (let j = 0; j < line.length; j++) {\\n      const seg = line[j];\\n      const column = cOffset + seg[COLUMN];\\n\\n      // If this segment steps into the column range that the next section's map controls, we need\\n      // to stop early.\\n      if (lineI === stopLine && column >= stopColumn) return;\\n\\n      if (seg.length === 1) {\\n        out.push([column]);\\n        continue;\\n      }\\n\\n      const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];\\n      const sourceLine = seg[SOURCE_LINE];\\n      const sourceColumn = seg[SOURCE_COLUMN];\\n      out.push(\\n        seg.length === 4\\n          ? [column, sourcesIndex, sourceLine, sourceColumn]\\n          : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]],\\n      );\\n    }\\n  }\\n}\\n\\nfunction append<T>(arr: T[], other: T[]) {\\n  for (let i = 0; i < other.length; i++) arr.push(other[i]);\\n}\\n\\nfunction getLine<T>(arr: T[][], index: number): T[] {\\n  for (let i = arr.length; i <= index; i++) arr[i] = [];\\n  return arr[index];\\n}\\n\",\"import { encode, decode } from '@jridgewell/sourcemap-codec';\\n\\nimport resolve from './resolve';\\nimport stripFilename from './strip-filename';\\nimport maybeSort from './sort';\\nimport buildBySources from './by-source';\\nimport {\\n  memoizedState,\\n  memoizedBinarySearch,\\n  upperBound,\\n  lowerBound,\\n  found as bsFound,\\n} from './binary-search';\\nimport {\\n  COLUMN,\\n  SOURCES_INDEX,\\n  SOURCE_LINE,\\n  SOURCE_COLUMN,\\n  NAMES_INDEX,\\n  REV_GENERATED_LINE,\\n  REV_GENERATED_COLUMN,\\n} from './sourcemap-segment';\\n\\nimport type { SourceMapSegment, ReverseSegment } from './sourcemap-segment';\\nimport type {\\n  SourceMapV3,\\n  DecodedSourceMap,\\n  EncodedSourceMap,\\n  InvalidOriginalMapping,\\n  OriginalMapping,\\n  InvalidGeneratedMapping,\\n  GeneratedMapping,\\n  SourceMapInput,\\n  Needle,\\n  SourceNeedle,\\n  SourceMap,\\n  EachMapping,\\n  Bias,\\n} from './types';\\nimport type { Source } from './by-source';\\nimport type { MemoState } from './binary-search';\\n\\nexport type { SourceMapSegment } from './sourcemap-segment';\\nexport type {\\n  SourceMapInput,\\n  SectionedSourceMapInput,\\n  DecodedSourceMap,\\n  EncodedSourceMap,\\n  SectionedSourceMap,\\n  InvalidOriginalMapping,\\n  OriginalMapping as Mapping,\\n  OriginalMapping,\\n  InvalidGeneratedMapping,\\n  GeneratedMapping,\\n  EachMapping,\\n} from './types';\\n\\nconst LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\\nconst COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\\n\\nexport const LEAST_UPPER_BOUND = -1;\\nexport const GREATEST_LOWER_BOUND = 1;\\n\\n/**\\n * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\\n */\\nexport let encodedMappings: (map: TraceMap) => EncodedSourceMap['mappings'];\\n\\n/**\\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\\n */\\nexport let decodedMappings: (map: TraceMap) => Readonly<DecodedSourceMap['mappings']>;\\n\\n/**\\n * A low-level API to find the segment associated with a generated line/column (think, from a\\n * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\\n */\\nexport let traceSegment: (\\n  map: TraceMap,\\n  line: number,\\n  column: number,\\n) => Readonly<SourceMapSegment> | null;\\n\\n/**\\n * A higher-level API to find the source/line/column associated with a generated line/column\\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\\n * `source-map` library.\\n */\\nexport let originalPositionFor: (\\n  map: TraceMap,\\n  needle: Needle,\\n) => OriginalMapping | InvalidOriginalMapping;\\n\\n/**\\n * Finds the generated line/column position of the provided source/line/column source position.\\n */\\nexport let generatedPositionFor: (\\n  map: TraceMap,\\n  needle: SourceNeedle,\\n) => GeneratedMapping | InvalidGeneratedMapping;\\n\\n/**\\n * Finds all generated line/column positions of the provided source/line/column source position.\\n */\\nexport let allGeneratedPositionsFor: (map: TraceMap, needle: SourceNeedle) => GeneratedMapping[];\\n\\n/**\\n * Iterates each mapping in generated position order.\\n */\\nexport let eachMapping: (map: TraceMap, cb: (mapping: EachMapping) => void) => void;\\n\\n/**\\n * Retrieves the source content for a particular source, if its found. Returns null if not.\\n */\\nexport let sourceContentFor: (map: TraceMap, source: string) => string | null;\\n\\n/**\\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\\n * maps.\\n */\\nexport let presortedDecodedMap: (map: DecodedSourceMap, mapUrl?: string) => TraceMap;\\n\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let decodedMap: (\\n  map: TraceMap,\\n) => Omit<DecodedSourceMap, 'mappings'> & { mappings: readonly SourceMapSegment[][] };\\n\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let encodedMap: (map: TraceMap) => EncodedSourceMap;\\n\\nexport { AnyMap } from './any-map';\\n\\nexport class TraceMap implements SourceMap {\\n  declare version: SourceMapV3['version'];\\n  declare file: SourceMapV3['file'];\\n  declare names: SourceMapV3['names'];\\n  declare sourceRoot: SourceMapV3['sourceRoot'];\\n  declare sources: SourceMapV3['sources'];\\n  declare sourcesContent: SourceMapV3['sourcesContent'];\\n\\n  declare resolvedSources: string[];\\n  private declare _encoded: string | undefined;\\n\\n  private declare _decoded: SourceMapSegment[][] | undefined;\\n  private declare _decodedMemo: MemoState;\\n\\n  private declare _bySources: Source[] | undefined;\\n  private declare _bySourceMemos: MemoState[] | undefined;\\n\\n  constructor(map: SourceMapInput, mapUrl?: string | null) {\\n    const isString = typeof map === 'string';\\n\\n    if (!isString && (map as unknown as { _decodedMemo: any })._decodedMemo) return map as TraceMap;\\n\\n    const parsed = (isString ? JSON.parse(map) : map) as DecodedSourceMap | EncodedSourceMap;\\n\\n    const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\\n    this.version = version;\\n    this.file = file;\\n    this.names = names;\\n    this.sourceRoot = sourceRoot;\\n    this.sources = sources;\\n    this.sourcesContent = sourcesContent;\\n\\n    const from = resolve(sourceRoot || '', stripFilename(mapUrl));\\n    this.resolvedSources = sources.map((s) => resolve(s || '', from));\\n\\n    const { mappings } = parsed;\\n    if (typeof mappings === 'string') {\\n      this._encoded = mappings;\\n      this._decoded = undefined;\\n    } else {\\n      this._encoded = undefined;\\n      this._decoded = maybeSort(mappings, isString);\\n    }\\n\\n    this._decodedMemo = memoizedState();\\n    this._bySources = undefined;\\n    this._bySourceMemos = undefined;\\n  }\\n\\n  static {\\n    encodedMappings = (map) => {\\n      return (map._encoded ??= encode(map._decoded!));\\n    };\\n\\n    decodedMappings = (map) => {\\n      return (map._decoded ||= decode(map._encoded!));\\n    };\\n\\n    traceSegment = (map, line, column) => {\\n      const decoded = decodedMappings(map);\\n\\n      // It's common for parent source maps to have pointers to lines that have no\\n      // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n      if (line >= decoded.length) return null;\\n\\n      const segments = decoded[line];\\n      const index = traceSegmentInternal(\\n        segments,\\n        map._decodedMemo,\\n        line,\\n        column,\\n        GREATEST_LOWER_BOUND,\\n      );\\n\\n      return index === -1 ? null : segments[index];\\n    };\\n\\n    originalPositionFor = (map, { line, column, bias }) => {\\n      line--;\\n      if (line < 0) throw new Error(LINE_GTR_ZERO);\\n      if (column < 0) throw new Error(COL_GTR_EQ_ZERO);\\n\\n      const decoded = decodedMappings(map);\\n\\n      // It's common for parent source maps to have pointers to lines that have no\\n      // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n      if (line >= decoded.length) return OMapping(null, null, null, null);\\n\\n      const segments = decoded[line];\\n      const index = traceSegmentInternal(\\n        segments,\\n        map._decodedMemo,\\n        line,\\n        column,\\n        bias || GREATEST_LOWER_BOUND,\\n      );\\n\\n      if (index === -1) return OMapping(null, null, null, null);\\n\\n      const segment = segments[index];\\n      if (segment.length === 1) return OMapping(null, null, null, null);\\n\\n      const { names, resolvedSources } = map;\\n      return OMapping(\\n        resolvedSources[segment[SOURCES_INDEX]],\\n        segment[SOURCE_LINE] + 1,\\n        segment[SOURCE_COLUMN],\\n        segment.length === 5 ? names[segment[NAMES_INDEX]] : null,\\n      );\\n    };\\n\\n    allGeneratedPositionsFor = (map, { source, line, column, bias }) => {\\n      // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.\\n      return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);\\n    };\\n\\n    generatedPositionFor = (map, { source, line, column, bias }) => {\\n      return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);\\n    };\\n\\n    eachMapping = (map, cb) => {\\n      const decoded = decodedMappings(map);\\n      const { names, resolvedSources } = map;\\n\\n      for (let i = 0; i < decoded.length; i++) {\\n        const line = decoded[i];\\n        for (let j = 0; j < line.length; j++) {\\n          const seg = line[j];\\n\\n          const generatedLine = i + 1;\\n          const generatedColumn = seg[0];\\n          let source = null;\\n          let originalLine = null;\\n          let originalColumn = null;\\n          let name = null;\\n          if (seg.length !== 1) {\\n            source = resolvedSources[seg[1]];\\n            originalLine = seg[2] + 1;\\n            originalColumn = seg[3];\\n          }\\n          if (seg.length === 5) name = names[seg[4]];\\n\\n          cb({\\n            generatedLine,\\n            generatedColumn,\\n            source,\\n            originalLine,\\n            originalColumn,\\n            name,\\n          } as EachMapping);\\n        }\\n      }\\n    };\\n\\n    sourceContentFor = (map, source) => {\\n      const { sources, resolvedSources, sourcesContent } = map;\\n      if (sourcesContent == null) return null;\\n\\n      let index = sources.indexOf(source);\\n      if (index === -1) index = resolvedSources.indexOf(source);\\n\\n      return index === -1 ? null : sourcesContent[index];\\n    };\\n\\n    presortedDecodedMap = (map, mapUrl) => {\\n      const tracer = new TraceMap(clone(map, []), mapUrl);\\n      tracer._decoded = map.mappings;\\n      return tracer;\\n    };\\n\\n    decodedMap = (map) => {\\n      return clone(map, decodedMappings(map));\\n    };\\n\\n    encodedMap = (map) => {\\n      return clone(map, encodedMappings(map));\\n    };\\n\\n    function generatedPosition(\\n      map: TraceMap,\\n      source: string,\\n      line: number,\\n      column: number,\\n      bias: Bias,\\n      all: false,\\n    ): GeneratedMapping | InvalidGeneratedMapping;\\n    function generatedPosition(\\n      map: TraceMap,\\n      source: string,\\n      line: number,\\n      column: number,\\n      bias: Bias,\\n      all: true,\\n    ): GeneratedMapping[];\\n    function generatedPosition(\\n      map: TraceMap,\\n      source: string,\\n      line: number,\\n      column: number,\\n      bias: Bias,\\n      all: boolean,\\n    ): GeneratedMapping | InvalidGeneratedMapping | GeneratedMapping[] {\\n      line--;\\n      if (line < 0) throw new Error(LINE_GTR_ZERO);\\n      if (column < 0) throw new Error(COL_GTR_EQ_ZERO);\\n\\n      const { sources, resolvedSources } = map;\\n      let sourceIndex = sources.indexOf(source);\\n      if (sourceIndex === -1) sourceIndex = resolvedSources.indexOf(source);\\n      if (sourceIndex === -1) return all ? [] : GMapping(null, null);\\n\\n      const generated = (map._bySources ||= buildBySources(\\n        decodedMappings(map),\\n        (map._bySourceMemos = sources.map(memoizedState)),\\n      ));\\n\\n      const segments = generated[sourceIndex][line];\\n      if (segments == null) return all ? [] : GMapping(null, null);\\n\\n      const memo = map._bySourceMemos![sourceIndex];\\n\\n      if (all) return sliceGeneratedPositions(segments, memo, line, column, bias);\\n\\n      const index = traceSegmentInternal(segments, memo, line, column, bias);\\n      if (index === -1) return GMapping(null, null);\\n\\n      const segment = segments[index];\\n      return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);\\n    }\\n  }\\n}\\n\\nfunction clone<T extends string | readonly SourceMapSegment[][]>(\\n  map: TraceMap | DecodedSourceMap | EncodedSourceMap,\\n  mappings: T,\\n): T extends string ? EncodedSourceMap : DecodedSourceMap {\\n  return {\\n    version: map.version,\\n    file: map.file,\\n    names: map.names,\\n    sourceRoot: map.sourceRoot,\\n    sources: map.sources,\\n    sourcesContent: map.sourcesContent,\\n    mappings,\\n  } as any;\\n}\\n\\nfunction OMapping(source: null, line: null, column: null, name: null): InvalidOriginalMapping;\\nfunction OMapping(\\n  source: string,\\n  line: number,\\n  column: number,\\n  name: string | null,\\n): OriginalMapping;\\nfunction OMapping(\\n  source: string | null,\\n  line: number | null,\\n  column: number | null,\\n  name: string | null,\\n): OriginalMapping | InvalidOriginalMapping {\\n  return { source, line, column, name } as any;\\n}\\n\\nfunction GMapping(line: null, column: null): InvalidGeneratedMapping;\\nfunction GMapping(line: number, column: number): GeneratedMapping;\\nfunction GMapping(\\n  line: number | null,\\n  column: number | null,\\n): GeneratedMapping | InvalidGeneratedMapping {\\n  return { line, column } as any;\\n}\\n\\nfunction traceSegmentInternal(\\n  segments: SourceMapSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): number;\\nfunction traceSegmentInternal(\\n  segments: ReverseSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): number;\\nfunction traceSegmentInternal(\\n  segments: SourceMapSegment[] | ReverseSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): number {\\n  let index = memoizedBinarySearch(segments, column, memo, line);\\n  if (bsFound) {\\n    index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\\n  } else if (bias === LEAST_UPPER_BOUND) index++;\\n\\n  if (index === -1 || index === segments.length) return -1;\\n  return index;\\n}\\n\\nfunction sliceGeneratedPositions(\\n  segments: ReverseSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): GeneratedMapping[] {\\n  let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);\\n\\n  // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in\\n  // insertion order) segment that matched. Even if we did respect the bias when tracing, we would\\n  // still need to call `lowerBound()` to find the first segment, which is slower than just looking\\n  // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the\\n  // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to\\n  // match LEAST_UPPER_BOUND.\\n  if (!bsFound && bias === LEAST_UPPER_BOUND) min++;\\n\\n  if (min === -1 || min === segments.length) return [];\\n\\n  // We may have found the segment that started at an earlier column. If this is the case, then we\\n  // need to slice all generated segments that match _that_ column, because all such segments span\\n  // to our desired column.\\n  const matchedColumn = bsFound ? column : segments[min][COLUMN];\\n\\n  // The binary search is not guaranteed to find the lower bound when a match wasn't found.\\n  if (!bsFound) min = lowerBound(segments, matchedColumn, min);\\n  const max = upperBound(segments, matchedColumn, min);\\n\\n  const result = [];\\n  for (; min <= max; min++) {\\n    const segment = segments[min];\\n    result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));\\n  }\\n  return result;\\n}\\n\"],\"names\":[\"bsFound\"],\"mappings\":\";;;AAEc,SAAU,OAAO,CAAC,KAAa,EAAE,IAAwB,EAAA;;;;IAIrE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,IAAI,GAAG,CAAC;AAE7C,IAAA,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACjC;;ACTA;;AAEG;AACqB,SAAA,aAAa,CAAC,IAA+B,EAAA;AACnE,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAClC;;ACQO,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,oBAAoB,GAAG,CAAC;;AClBvB,SAAU,SAAS,CAC/B,QAA8B,EAC9B,KAAc,EAAA;IAEd,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC3D,IAAA,IAAI,aAAa,KAAK,QAAQ,CAAC,MAAM;AAAE,QAAA,OAAO,QAAQ,CAAC;;;AAIvD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;AAC7F,QAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAChD,KAAA;AACD,IAAA,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAA8B,EAAE,KAAa,EAAA;AAC5E,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;AACtC,KAAA;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAwB,EAAA;AACxC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;AACzC,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AACF,KAAA;AACD,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAwB,EAAE,KAAc,EAAA;AAC5D,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAChC,IAAA,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,CAAmB,EAAE,CAAmB,EAAA;IAC9D,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/B;;ACnCO,IAAI,KAAK,GAAG,KAAK,CAAC;AAEzB;;;;;;;;;;;;;;;AAeG;AACG,SAAU,YAAY,CAC1B,QAA+C,EAC/C,MAAc,EACd,GAAW,EACX,IAAY,EAAA;IAEZ,OAAO,GAAG,IAAI,IAAI,EAAE;AAClB,QAAA,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAE3C,IAAI,GAAG,KAAK,CAAC,EAAE;YACb,KAAK,GAAG,IAAI,CAAC;AACb,YAAA,OAAO,GAAG,CAAC;AACZ,SAAA;QAED,IAAI,GAAG,GAAG,CAAC,EAAE;AACX,YAAA,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AACf,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;AAChB,SAAA;AACF,KAAA;IAED,KAAK,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,GAAG,CAAC,CAAC;AACjB,CAAC;SAEe,UAAU,CACxB,QAA+C,EAC/C,MAAc,EACd,KAAa,EAAA;AAEb,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;QACxD,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM;YAAE,MAAM;AAC3C,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;SAEe,UAAU,CACxB,QAA+C,EAC/C,MAAc,EACd,KAAa,EAAA;AAEb,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;QAC3C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM;YAAE,MAAM;AAC3C,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;SAEe,aAAa,GAAA;IAC3B,OAAO;QACL,OAAO,EAAE,CAAC,CAAC;QACX,UAAU,EAAE,CAAC,CAAC;QACd,SAAS,EAAE,CAAC,CAAC;KACd,CAAC;AACJ,CAAC;AAED;;;AAGG;AACG,SAAU,oBAAoB,CAClC,QAA+C,EAC/C,MAAc,EACd,KAAgB,EAChB,GAAW,EAAA;IAEX,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,OAAO,EAAE;QACnB,IAAI,MAAM,KAAK,UAAU,EAAE;AACzB,YAAA,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;AACnE,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;QAED,IAAI,MAAM,IAAI,UAAU,EAAE;;AAExB,YAAA,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AACxC,SAAA;AAAM,aAAA;YACL,IAAI,GAAG,SAAS,CAAC;AAClB,SAAA;AACF,KAAA;AACD,IAAA,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACpB,IAAA,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;AAE1B,IAAA,QAAQ,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;AACvE;;ACvGA;AACA;AACc,SAAU,cAAc,CACpC,OAAsC,EACtC,KAAkB,EAAA;IAElB,MAAM,OAAO,GAAa,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEpD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;AAE/B,YAAA,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;AACvC,YAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;AACpC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;AACxC,YAAA,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAC5C,YAAA,MAAM,YAAY,IAAI,cAAc,CAAC,UAAU,CAAzB,KAAA,cAAc,CAAC,UAAU,CAAM,GAAA,EAAE,EAAC,CAAC;AACzD,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;;;;;AAMhC,YAAA,MAAM,KAAK,GAAG,UAAU,CACtB,YAAY,EACZ,YAAY,EACZ,oBAAoB,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,CACnE,CAAC;YAEF,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpF,SAAA;AACF,KAAA;AAED,IAAA,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAI,KAAU,EAAE,KAAa,EAAE,KAAQ,EAAA;AACpD,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,KAAA;AACD,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACvB,CAAC;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,cAAc,GAAA;AACrB,IAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAO,CAAC;AAClC;;ACxCa,MAAA,MAAM,GAAW,UAAU,GAAG,EAAE,MAAM,EAAA;AACjD,IAAA,MAAM,MAAM,GACV,OAAO,GAAG,KAAK,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8C,GAAG,GAAG,CAAC;AAEhG,IAAA,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC;AAAE,QAAA,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAsB,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE5F,IAAA,MAAM,MAAM,GAAqB;AAC/B,QAAA,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK;QACL,OAAO;QACP,cAAc;QACd,QAAQ;KACT,CAAC;AAEF,IAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,EAAY;AAEZ,SAAS,OAAO,CACd,KAA6B,EAC7B,MAAiC,EACjC,QAA8B,EAC9B,OAAiB,EACjB,cAAiC,EACjC,KAAe,EACf,UAAkB,EAClB,YAAoB,EACpB,QAAgB,EAChB,UAAkB,EAAA;AAElB,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;AAC3B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEpC,IAAI,EAAE,GAAG,QAAQ,CAAC;QAClB,IAAI,EAAE,GAAG,UAAU,CAAC;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;YAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1C,YAAA,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAEtD,IAAI,EAAE,KAAK,QAAQ,EAAE;AACnB,gBAAA,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAC7D,aAAA;iBAAM,IAAI,EAAE,GAAG,QAAQ,EAAE;AACxB,gBAAA,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;AACvC,aAAA;AACF,SAAA;AAED,QAAA,UAAU,CACR,GAAG,EACH,MAAM,EACN,QAAQ,EACR,OAAO,EACP,cAAc,EACd,KAAK,EACL,UAAU,GAAG,MAAM,CAAC,IAAI,EACxB,YAAY,GAAG,MAAM,CAAC,MAAM,EAC5B,EAAE,EACF,EAAE,CACH,CAAC;AACH,KAAA;AACH,CAAC;AAED,SAAS,UAAU,CACjB,KAAyB,EACzB,MAAiC,EACjC,QAA8B,EAC9B,OAAiB,EACjB,cAAiC,EACjC,KAAe,EACf,UAAkB,EAClB,YAAoB,EACpB,QAAgB,EAChB,UAAkB,EAAA;IAElB,IAAI,UAAU,IAAI,KAAK;AAAE,QAAA,OAAO,OAAO,CAAC,GAAI,SAAmD,CAAC,CAAC;IAEjG,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACxC,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;AACrC,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AACjC,IAAA,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;AAE1D,IAAA,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACjC,IAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACzB,IAAA,IAAI,QAAQ;AAAE,QAAA,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhF,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,QAAA,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;;;;;QAM7B,IAAI,KAAK,GAAG,QAAQ;YAAE,OAAO;;;QAI7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;;;AAGrC,QAAA,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;AAE3C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;;;AAIrC,YAAA,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,UAAU;gBAAE,OAAO;AAEvD,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,gBAAA,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnB,SAAS;AACV,aAAA;YAED,MAAM,YAAY,GAAG,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;AACxD,YAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;AACpC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;AACxC,YAAA,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,MAAM,KAAK,CAAC;kBACZ,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC;AAClD,kBAAE,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CACrF,CAAC;AACH,SAAA;AACF,KAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAI,GAAQ,EAAE,KAAU,EAAA;AACrC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,OAAO,CAAI,GAAU,EAAE,KAAa,EAAA;AAC3C,IAAA,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE;AAAE,QAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACtD,IAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;AACpB;;AC7GA,MAAM,aAAa,GAAG,uDAAuD,CAAC;AAC9E,MAAM,eAAe,GAAG,yEAAyE,CAAC;AAErF,MAAA,iBAAiB,GAAG,CAAC,EAAE;AAC7B,MAAM,oBAAoB,GAAG,EAAE;AAEtC;;AAEG;AACQ,IAAA,gBAAiE;AAE5E;;AAEG;AACQ,IAAA,gBAA2E;AAEtF;;;AAGG;AACQ,IAAA,aAI4B;AAEvC;;;;AAIG;AACQ,IAAA,oBAGmC;AAE9C;;AAEG;AACQ,IAAA,qBAGqC;AAEhD;;AAEG;AACQ,IAAA,yBAAsF;AAEjG;;AAEG;AACQ,IAAA,YAAyE;AAEpF;;AAEG;AACQ,IAAA,iBAAmE;AAE9E;;;AAGG;AACQ,IAAA,oBAA0E;AAErF;;;AAGG;AACQ,IAAA,WAE2E;AAEtF;;;AAGG;AACQ,IAAA,WAAgD;MAI9C,QAAQ,CAAA;IAiBnB,WAAY,CAAA,GAAmB,EAAE,MAAsB,EAAA;AACrD,QAAA,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC;AAEzC,QAAA,IAAI,CAAC,QAAQ,IAAK,GAAwC,CAAC,YAAY;AAAE,YAAA,OAAO,GAAe,CAAC;AAEhG,QAAA,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAwC,CAAC;AAEzF,QAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC7E,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AAErC,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AAElE,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;AAC5B,QAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;AAC3B,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/C,SAAA;AAED,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;KACjC;AAuLF,CAAA;AArLC,CAAA,MAAA;AACE,IAAA,eAAe,GAAG,CAAC,GAAG,KAAI;;AACxB,QAAA,cAAQ,GAAG,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,IAAZ,GAAG,CAAC,QAAQ,GAAK,MAAM,CAAC,GAAG,CAAC,QAAS,CAAC,GAAE;AAClD,KAAC,CAAC;AAEF,IAAA,eAAe,GAAG,CAAC,GAAG,KAAI;AACxB,QAAA,QAAQ,GAAG,CAAC,QAAQ,KAAZ,GAAG,CAAC,QAAQ,GAAK,MAAM,CAAC,GAAG,CAAC,QAAS,CAAC,GAAE;AAClD,KAAC,CAAC;IAEF,YAAY,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,KAAI;AACnC,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;;;AAIrC,QAAA,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC;AAExC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAChC,QAAQ,EACR,GAAG,CAAC,YAAY,EAChB,IAAI,EACJ,MAAM,EACN,oBAAoB,CACrB,CAAC;AAEF,QAAA,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/C,KAAC,CAAC;AAEF,IAAA,mBAAmB,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAI;AACpD,QAAA,IAAI,EAAE,CAAC;QACP,IAAI,IAAI,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,MAAM,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AAEjD,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;;;AAIrC,QAAA,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEpE,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAChC,QAAQ,EACR,GAAG,CAAC,YAAY,EAChB,IAAI,EACJ,MAAM,EACN,IAAI,IAAI,oBAAoB,CAC7B,CAAC;QAEF,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE1D,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChC,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAElE,QAAA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;AACvC,QAAA,OAAO,QAAQ,CACb,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EACvC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EACxB,OAAO,CAAC,aAAa,CAAC,EACtB,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAC1D,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,wBAAwB,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAI;;AAEjE,QAAA,OAAO,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,iBAAiB,EAAE,IAAI,CAAC,CAAC;AACvF,KAAC,CAAC;AAEF,IAAA,oBAAoB,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAI;AAC7D,QAAA,OAAO,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,oBAAoB,EAAE,KAAK,CAAC,CAAC;AAC3F,KAAC,CAAC;AAEF,IAAA,WAAW,GAAG,CAAC,GAAG,EAAE,EAAE,KAAI;AACxB,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;AAEvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpB,gBAAA,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,gBAAA,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,MAAM,GAAG,IAAI,CAAC;gBAClB,IAAI,YAAY,GAAG,IAAI,CAAC;gBACxB,IAAI,cAAc,GAAG,IAAI,CAAC;gBAC1B,IAAI,IAAI,GAAG,IAAI,CAAC;AAChB,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpB,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,oBAAA,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1B,oBAAA,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,iBAAA;AACD,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3C,gBAAA,EAAE,CAAC;oBACD,aAAa;oBACb,eAAe;oBACf,MAAM;oBACN,YAAY;oBACZ,cAAc;oBACd,IAAI;AACU,iBAAA,CAAC,CAAC;AACnB,aAAA;AACF,SAAA;AACH,KAAC,CAAC;AAEF,IAAA,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAI;QACjC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QACzD,IAAI,cAAc,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC;QAExC,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,CAAC,CAAC;AAAE,YAAA,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAE1D,QAAA,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AACrD,KAAC,CAAC;AAEF,IAAA,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAI;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACpD,QAAA,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AAC/B,QAAA,OAAO,MAAM,CAAC;AAChB,KAAC,CAAC;AAEF,IAAA,UAAU,GAAG,CAAC,GAAG,KAAI;QACnB,OAAO,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,KAAC,CAAC;AAEF,IAAA,UAAU,GAAG,CAAC,GAAG,KAAI;QACnB,OAAO,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,KAAC,CAAC;AAkBF,IAAA,SAAS,iBAAiB,CACxB,GAAa,EACb,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAU,EACV,GAAY,EAAA;AAEZ,QAAA,IAAI,EAAE,CAAC;QACP,IAAI,IAAI,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,MAAM,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AAEjD,QAAA,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;QACzC,IAAI,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,WAAW,KAAK,CAAC,CAAC;AAAE,YAAA,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,WAAW,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE/D,QAAA,MAAM,SAAS,IAAI,GAAG,CAAC,UAAU,KAAd,GAAG,CAAC,UAAU,GAAK,cAAc,CAClD,eAAe,CAAC,GAAG,CAAC,GACnB,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EACjD,EAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,QAAQ,IAAI,IAAI;AAAE,YAAA,OAAO,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,GAAG,CAAC,cAAe,CAAC,WAAW,CAAC,CAAC;AAE9C,QAAA,IAAI,GAAG;AAAE,YAAA,OAAO,uBAAuB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAE5E,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACvE,IAAI,KAAK,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9C,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChC,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;KACjF;AACH,CAAC,GAAA,CAAA;AAGH,SAAS,KAAK,CACZ,GAAmD,EACnD,QAAW,EAAA;IAEX,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,QAAQ;KACF,CAAC;AACX,CAAC;AASD,SAAS,QAAQ,CACf,MAAqB,EACrB,IAAmB,EACnB,MAAqB,EACrB,IAAmB,EAAA;IAEnB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAS,CAAC;AAC/C,CAAC;AAID,SAAS,QAAQ,CACf,IAAmB,EACnB,MAAqB,EAAA;AAErB,IAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAS,CAAC;AACjC,CAAC;AAgBD,SAAS,oBAAoB,CAC3B,QAA+C,EAC/C,IAAe,EACf,IAAY,EACZ,MAAc,EACd,IAAU,EAAA;AAEV,IAAA,IAAI,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/D,IAAA,IAAIA,KAAO,EAAE;QACX,KAAK,GAAG,CAAC,IAAI,KAAK,iBAAiB,GAAG,UAAU,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACzF,KAAA;SAAM,IAAI,IAAI,KAAK,iBAAiB;AAAE,QAAA,KAAK,EAAE,CAAC;IAE/C,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,CAAC;AACzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAC9B,QAA0B,EAC1B,IAAe,EACf,IAAY,EACZ,MAAc,EACd,IAAU,EAAA;AAEV,IAAA,IAAI,GAAG,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;;;;;;;AAQnF,IAAA,IAAI,CAACA,KAAO,IAAI,IAAI,KAAK,iBAAiB;AAAE,QAAA,GAAG,EAAE,CAAC;IAElD,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,MAAM;AAAE,QAAA,OAAO,EAAE,CAAC;;;;AAKrD,IAAA,MAAM,aAAa,GAAGA,KAAO,GAAG,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;;AAG/D,IAAA,IAAI,CAACA,KAAO;QAAE,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,IAAA,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9B,QAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;AACvF,KAAA;AACD,IAAA,OAAO,MAAM,CAAC;AAChB;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@jridgewell/sourcemap-codec'), require('@jridgewell/resolve-uri')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@jridgewell/sourcemap-codec', '@jridgewell/resolve-uri'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.traceMapping = {}, global.sourcemapCodec, global.resolveURI));\n})(this, (function (exports, sourcemapCodec, resolveUri) { 'use strict';\n\n    function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\n    var resolveUri__default = /*#__PURE__*/_interopDefaultLegacy(resolveUri);\n\n    function resolve(input, base) {\n        // The base is always treated as a directory, if it's not empty.\n        // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\n        // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\n        if (base && !base.endsWith('/'))\n            base += '/';\n        return resolveUri__default[\"default\"](input, base);\n    }\n\n    /**\n     * Removes everything after the last \"/\", but leaves the slash.\n     */\n    function stripFilename(path) {\n        if (!path)\n            return '';\n        const index = path.lastIndexOf('/');\n        return path.slice(0, index + 1);\n    }\n\n    const COLUMN = 0;\n    const SOURCES_INDEX = 1;\n    const SOURCE_LINE = 2;\n    const SOURCE_COLUMN = 3;\n    const NAMES_INDEX = 4;\n    const REV_GENERATED_LINE = 1;\n    const REV_GENERATED_COLUMN = 2;\n\n    function maybeSort(mappings, owned) {\n        const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\n        if (unsortedIndex === mappings.length)\n            return mappings;\n        // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\n        // not, we do not want to modify the consumer's input array.\n        if (!owned)\n            mappings = mappings.slice();\n        for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\n            mappings[i] = sortSegments(mappings[i], owned);\n        }\n        return mappings;\n    }\n    function nextUnsortedSegmentLine(mappings, start) {\n        for (let i = start; i < mappings.length; i++) {\n            if (!isSorted(mappings[i]))\n                return i;\n        }\n        return mappings.length;\n    }\n    function isSorted(line) {\n        for (let j = 1; j < line.length; j++) {\n            if (line[j][COLUMN] < line[j - 1][COLUMN]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    function sortSegments(line, owned) {\n        if (!owned)\n            line = line.slice();\n        return line.sort(sortComparator);\n    }\n    function sortComparator(a, b) {\n        return a[COLUMN] - b[COLUMN];\n    }\n\n    let found = false;\n    /**\n     * A binary search implementation that returns the index if a match is found.\n     * If no match is found, then the left-index (the index associated with the item that comes just\n     * before the desired index) is returned. To maintain proper sort order, a splice would happen at\n     * the next index:\n     *\n     * ```js\n     * const array = [1, 3];\n     * const needle = 2;\n     * const index = binarySearch(array, needle, (item, needle) => item - needle);\n     *\n     * assert.equal(index, 0);\n     * array.splice(index + 1, 0, needle);\n     * assert.deepEqual(array, [1, 2, 3]);\n     * ```\n     */\n    function binarySearch(haystack, needle, low, high) {\n        while (low <= high) {\n            const mid = low + ((high - low) >> 1);\n            const cmp = haystack[mid][COLUMN] - needle;\n            if (cmp === 0) {\n                found = true;\n                return mid;\n            }\n            if (cmp < 0) {\n                low = mid + 1;\n            }\n            else {\n                high = mid - 1;\n            }\n        }\n        found = false;\n        return low - 1;\n    }\n    function upperBound(haystack, needle, index) {\n        for (let i = index + 1; i < haystack.length; index = i++) {\n            if (haystack[i][COLUMN] !== needle)\n                break;\n        }\n        return index;\n    }\n    function lowerBound(haystack, needle, index) {\n        for (let i = index - 1; i >= 0; index = i--) {\n            if (haystack[i][COLUMN] !== needle)\n                break;\n        }\n        return index;\n    }\n    function memoizedState() {\n        return {\n            lastKey: -1,\n            lastNeedle: -1,\n            lastIndex: -1,\n        };\n    }\n    /**\n     * This overly complicated beast is just to record the last tested line/column and the resulting\n     * index, allowing us to skip a few tests if mappings are monotonically increasing.\n     */\n    function memoizedBinarySearch(haystack, needle, state, key) {\n        const { lastKey, lastNeedle, lastIndex } = state;\n        let low = 0;\n        let high = haystack.length - 1;\n        if (key === lastKey) {\n            if (needle === lastNeedle) {\n                found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;\n                return lastIndex;\n            }\n            if (needle >= lastNeedle) {\n                // lastIndex may be -1 if the previous needle was not found.\n                low = lastIndex === -1 ? 0 : lastIndex;\n            }\n            else {\n                high = lastIndex;\n            }\n        }\n        state.lastKey = key;\n        state.lastNeedle = needle;\n        return (state.lastIndex = binarySearch(haystack, needle, low, high));\n    }\n\n    // Rebuilds the original source files, with mappings that are ordered by source line/column instead\n    // of generated line/column.\n    function buildBySources(decoded, memos) {\n        const sources = memos.map(buildNullArray);\n        for (let i = 0; i < decoded.length; i++) {\n            const line = decoded[i];\n            for (let j = 0; j < line.length; j++) {\n                const seg = line[j];\n                if (seg.length === 1)\n                    continue;\n                const sourceIndex = seg[SOURCES_INDEX];\n                const sourceLine = seg[SOURCE_LINE];\n                const sourceColumn = seg[SOURCE_COLUMN];\n                const originalSource = sources[sourceIndex];\n                const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));\n                const memo = memos[sourceIndex];\n                // The binary search either found a match, or it found the left-index just before where the\n                // segment should go. Either way, we want to insert after that. And there may be multiple\n                // generated segments associated with an original location, so there may need to move several\n                // indexes before we find where we need to insert.\n                const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));\n                insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);\n            }\n        }\n        return sources;\n    }\n    function insert(array, index, value) {\n        for (let i = array.length; i > index; i--) {\n            array[i] = array[i - 1];\n        }\n        array[index] = value;\n    }\n    // Null arrays allow us to use ordered index keys without actually allocating contiguous memory like\n    // a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.\n    // Numeric properties on objects are magically sorted in ascending order by the engine regardless of\n    // the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending\n    // order when iterating with for-in.\n    function buildNullArray() {\n        return { __proto__: null };\n    }\n\n    const AnyMap = function (map, mapUrl) {\n        const parsed = typeof map === 'string' ? JSON.parse(map) : map;\n        if (!('sections' in parsed))\n            return new TraceMap(parsed, mapUrl);\n        const mappings = [];\n        const sources = [];\n        const sourcesContent = [];\n        const names = [];\n        recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);\n        const joined = {\n            version: 3,\n            file: parsed.file,\n            names,\n            sources,\n            sourcesContent,\n            mappings,\n        };\n        return exports.presortedDecodedMap(joined);\n    };\n    function recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {\n        const { sections } = input;\n        for (let i = 0; i < sections.length; i++) {\n            const { map, offset } = sections[i];\n            let sl = stopLine;\n            let sc = stopColumn;\n            if (i + 1 < sections.length) {\n                const nextOffset = sections[i + 1].offset;\n                sl = Math.min(stopLine, lineOffset + nextOffset.line);\n                if (sl === stopLine) {\n                    sc = Math.min(stopColumn, columnOffset + nextOffset.column);\n                }\n                else if (sl < stopLine) {\n                    sc = columnOffset + nextOffset.column;\n                }\n            }\n            addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);\n        }\n    }\n    function addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {\n        if ('sections' in input)\n            return recurse(...arguments);\n        const map = new TraceMap(input, mapUrl);\n        const sourcesOffset = sources.length;\n        const namesOffset = names.length;\n        const decoded = exports.decodedMappings(map);\n        const { resolvedSources, sourcesContent: contents } = map;\n        append(sources, resolvedSources);\n        append(names, map.names);\n        if (contents)\n            append(sourcesContent, contents);\n        else\n            for (let i = 0; i < resolvedSources.length; i++)\n                sourcesContent.push(null);\n        for (let i = 0; i < decoded.length; i++) {\n            const lineI = lineOffset + i;\n            // We can only add so many lines before we step into the range that the next section's map\n            // controls. When we get to the last line, then we'll start checking the segments to see if\n            // they've crossed into the column range. But it may not have any columns that overstep, so we\n            // still need to check that we don't overstep lines, too.\n            if (lineI > stopLine)\n                return;\n            // The out line may already exist in mappings (if we're continuing the line started by a\n            // previous section). Or, we may have jumped ahead several lines to start this section.\n            const out = getLine(mappings, lineI);\n            // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\n            // map can be multiple lines), it doesn't.\n            const cOffset = i === 0 ? columnOffset : 0;\n            const line = decoded[i];\n            for (let j = 0; j < line.length; j++) {\n                const seg = line[j];\n                const column = cOffset + seg[COLUMN];\n                // If this segment steps into the column range that the next section's map controls, we need\n                // to stop early.\n                if (lineI === stopLine && column >= stopColumn)\n                    return;\n                if (seg.length === 1) {\n                    out.push([column]);\n                    continue;\n                }\n                const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];\n                const sourceLine = seg[SOURCE_LINE];\n                const sourceColumn = seg[SOURCE_COLUMN];\n                out.push(seg.length === 4\n                    ? [column, sourcesIndex, sourceLine, sourceColumn]\n                    : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);\n            }\n        }\n    }\n    function append(arr, other) {\n        for (let i = 0; i < other.length; i++)\n            arr.push(other[i]);\n    }\n    function getLine(arr, index) {\n        for (let i = arr.length; i <= index; i++)\n            arr[i] = [];\n        return arr[index];\n    }\n\n    const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\n    const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\n    const LEAST_UPPER_BOUND = -1;\n    const GREATEST_LOWER_BOUND = 1;\n    /**\n     * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\n     */\n    exports.encodedMappings = void 0;\n    /**\n     * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\n     */\n    exports.decodedMappings = void 0;\n    /**\n     * A low-level API to find the segment associated with a generated line/column (think, from a\n     * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\n     */\n    exports.traceSegment = void 0;\n    /**\n     * A higher-level API to find the source/line/column associated with a generated line/column\n     * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\n     * `source-map` library.\n     */\n    exports.originalPositionFor = void 0;\n    /**\n     * Finds the generated line/column position of the provided source/line/column source position.\n     */\n    exports.generatedPositionFor = void 0;\n    /**\n     * Finds all generated line/column positions of the provided source/line/column source position.\n     */\n    exports.allGeneratedPositionsFor = void 0;\n    /**\n     * Iterates each mapping in generated position order.\n     */\n    exports.eachMapping = void 0;\n    /**\n     * Retrieves the source content for a particular source, if its found. Returns null if not.\n     */\n    exports.sourceContentFor = void 0;\n    /**\n     * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\n     * maps.\n     */\n    exports.presortedDecodedMap = void 0;\n    /**\n     * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n     * a sourcemap, or to JSON.stringify.\n     */\n    exports.decodedMap = void 0;\n    /**\n     * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n     * a sourcemap, or to JSON.stringify.\n     */\n    exports.encodedMap = void 0;\n    class TraceMap {\n        constructor(map, mapUrl) {\n            const isString = typeof map === 'string';\n            if (!isString && map._decodedMemo)\n                return map;\n            const parsed = (isString ? JSON.parse(map) : map);\n            const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\n            this.version = version;\n            this.file = file;\n            this.names = names;\n            this.sourceRoot = sourceRoot;\n            this.sources = sources;\n            this.sourcesContent = sourcesContent;\n            const from = resolve(sourceRoot || '', stripFilename(mapUrl));\n            this.resolvedSources = sources.map((s) => resolve(s || '', from));\n            const { mappings } = parsed;\n            if (typeof mappings === 'string') {\n                this._encoded = mappings;\n                this._decoded = undefined;\n            }\n            else {\n                this._encoded = undefined;\n                this._decoded = maybeSort(mappings, isString);\n            }\n            this._decodedMemo = memoizedState();\n            this._bySources = undefined;\n            this._bySourceMemos = undefined;\n        }\n    }\n    (() => {\n        exports.encodedMappings = (map) => {\n            var _a;\n            return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = sourcemapCodec.encode(map._decoded)));\n        };\n        exports.decodedMappings = (map) => {\n            return (map._decoded || (map._decoded = sourcemapCodec.decode(map._encoded)));\n        };\n        exports.traceSegment = (map, line, column) => {\n            const decoded = exports.decodedMappings(map);\n            // It's common for parent source maps to have pointers to lines that have no\n            // mapping (like a \"//# sourceMappingURL=\") at the end of the child file.\n            if (line >= decoded.length)\n                return null;\n            const segments = decoded[line];\n            const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);\n            return index === -1 ? null : segments[index];\n        };\n        exports.originalPositionFor = (map, { line, column, bias }) => {\n            line--;\n            if (line < 0)\n                throw new Error(LINE_GTR_ZERO);\n            if (column < 0)\n                throw new Error(COL_GTR_EQ_ZERO);\n            const decoded = exports.decodedMappings(map);\n            // It's common for parent source maps to have pointers to lines that have no\n            // mapping (like a \"//# sourceMappingURL=\") at the end of the child file.\n            if (line >= decoded.length)\n                return OMapping(null, null, null, null);\n            const segments = decoded[line];\n            const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);\n            if (index === -1)\n                return OMapping(null, null, null, null);\n            const segment = segments[index];\n            if (segment.length === 1)\n                return OMapping(null, null, null, null);\n            const { names, resolvedSources } = map;\n            return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);\n        };\n        exports.allGeneratedPositionsFor = (map, { source, line, column, bias }) => {\n            // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.\n            return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);\n        };\n        exports.generatedPositionFor = (map, { source, line, column, bias }) => {\n            return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);\n        };\n        exports.eachMapping = (map, cb) => {\n            const decoded = exports.decodedMappings(map);\n            const { names, resolvedSources } = map;\n            for (let i = 0; i < decoded.length; i++) {\n                const line = decoded[i];\n                for (let j = 0; j < line.length; j++) {\n                    const seg = line[j];\n                    const generatedLine = i + 1;\n                    const generatedColumn = seg[0];\n                    let source = null;\n                    let originalLine = null;\n                    let originalColumn = null;\n                    let name = null;\n                    if (seg.length !== 1) {\n                        source = resolvedSources[seg[1]];\n                        originalLine = seg[2] + 1;\n                        originalColumn = seg[3];\n                    }\n                    if (seg.length === 5)\n                        name = names[seg[4]];\n                    cb({\n                        generatedLine,\n                        generatedColumn,\n                        source,\n                        originalLine,\n                        originalColumn,\n                        name,\n                    });\n                }\n            }\n        };\n        exports.sourceContentFor = (map, source) => {\n            const { sources, resolvedSources, sourcesContent } = map;\n            if (sourcesContent == null)\n                return null;\n            let index = sources.indexOf(source);\n            if (index === -1)\n                index = resolvedSources.indexOf(source);\n            return index === -1 ? null : sourcesContent[index];\n        };\n        exports.presortedDecodedMap = (map, mapUrl) => {\n            const tracer = new TraceMap(clone(map, []), mapUrl);\n            tracer._decoded = map.mappings;\n            return tracer;\n        };\n        exports.decodedMap = (map) => {\n            return clone(map, exports.decodedMappings(map));\n        };\n        exports.encodedMap = (map) => {\n            return clone(map, exports.encodedMappings(map));\n        };\n        function generatedPosition(map, source, line, column, bias, all) {\n            line--;\n            if (line < 0)\n                throw new Error(LINE_GTR_ZERO);\n            if (column < 0)\n                throw new Error(COL_GTR_EQ_ZERO);\n            const { sources, resolvedSources } = map;\n            let sourceIndex = sources.indexOf(source);\n            if (sourceIndex === -1)\n                sourceIndex = resolvedSources.indexOf(source);\n            if (sourceIndex === -1)\n                return all ? [] : GMapping(null, null);\n            const generated = (map._bySources || (map._bySources = buildBySources(exports.decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));\n            const segments = generated[sourceIndex][line];\n            if (segments == null)\n                return all ? [] : GMapping(null, null);\n            const memo = map._bySourceMemos[sourceIndex];\n            if (all)\n                return sliceGeneratedPositions(segments, memo, line, column, bias);\n            const index = traceSegmentInternal(segments, memo, line, column, bias);\n            if (index === -1)\n                return GMapping(null, null);\n            const segment = segments[index];\n            return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);\n        }\n    })();\n    function clone(map, mappings) {\n        return {\n            version: map.version,\n            file: map.file,\n            names: map.names,\n            sourceRoot: map.sourceRoot,\n            sources: map.sources,\n            sourcesContent: map.sourcesContent,\n            mappings,\n        };\n    }\n    function OMapping(source, line, column, name) {\n        return { source, line, column, name };\n    }\n    function GMapping(line, column) {\n        return { line, column };\n    }\n    function traceSegmentInternal(segments, memo, line, column, bias) {\n        let index = memoizedBinarySearch(segments, column, memo, line);\n        if (found) {\n            index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\n        }\n        else if (bias === LEAST_UPPER_BOUND)\n            index++;\n        if (index === -1 || index === segments.length)\n            return -1;\n        return index;\n    }\n    function sliceGeneratedPositions(segments, memo, line, column, bias) {\n        let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);\n        // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in\n        // insertion order) segment that matched. Even if we did respect the bias when tracing, we would\n        // still need to call `lowerBound()` to find the first segment, which is slower than just looking\n        // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the\n        // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to\n        // match LEAST_UPPER_BOUND.\n        if (!found && bias === LEAST_UPPER_BOUND)\n            min++;\n        if (min === -1 || min === segments.length)\n            return [];\n        // We may have found the segment that started at an earlier column. If this is the case, then we\n        // need to slice all generated segments that match _that_ column, because all such segments span\n        // to our desired column.\n        const matchedColumn = found ? column : segments[min][COLUMN];\n        // The binary search is not guaranteed to find the lower bound when a match wasn't found.\n        if (!found)\n            min = lowerBound(segments, matchedColumn, min);\n        const max = upperBound(segments, matchedColumn, min);\n        const result = [];\n        for (; min <= max; min++) {\n            const segment = segments[min];\n            result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));\n        }\n        return result;\n    }\n\n    exports.AnyMap = AnyMap;\n    exports.GREATEST_LOWER_BOUND = GREATEST_LOWER_BOUND;\n    exports.LEAST_UPPER_BOUND = LEAST_UPPER_BOUND;\n    exports.TraceMap = TraceMap;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=trace-mapping.umd.js.map\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map",
    "content": "{\"version\":3,\"file\":\"trace-mapping.umd.js\",\"sources\":[\"../src/resolve.ts\",\"../src/strip-filename.ts\",\"../src/sourcemap-segment.ts\",\"../src/sort.ts\",\"../src/binary-search.ts\",\"../src/by-source.ts\",\"../src/any-map.ts\",\"../src/trace-mapping.ts\"],\"sourcesContent\":[\"import resolveUri from '@jridgewell/resolve-uri';\\n\\nexport default function resolve(input: string, base: string | undefined): string {\\n  // The base is always treated as a directory, if it's not empty.\\n  // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327\\n  // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401\\n  if (base && !base.endsWith('/')) base += '/';\\n\\n  return resolveUri(input, base);\\n}\\n\",\"/**\\n * Removes everything after the last \\\"/\\\", but leaves the slash.\\n */\\nexport default function stripFilename(path: string | undefined | null): string {\\n  if (!path) return '';\\n  const index = path.lastIndexOf('/');\\n  return path.slice(0, index + 1);\\n}\\n\",\"type GeneratedColumn = number;\\ntype SourcesIndex = number;\\ntype SourceLine = number;\\ntype SourceColumn = number;\\ntype NamesIndex = number;\\n\\ntype GeneratedLine = number;\\n\\nexport type SourceMapSegment =\\n  | [GeneratedColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn]\\n  | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];\\n\\nexport type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn];\\n\\nexport const COLUMN = 0;\\nexport const SOURCES_INDEX = 1;\\nexport const SOURCE_LINE = 2;\\nexport const SOURCE_COLUMN = 3;\\nexport const NAMES_INDEX = 4;\\n\\nexport const REV_GENERATED_LINE = 1;\\nexport const REV_GENERATED_COLUMN = 2;\\n\",\"import { COLUMN } from './sourcemap-segment';\\n\\nimport type { SourceMapSegment } from './sourcemap-segment';\\n\\nexport default function maybeSort(\\n  mappings: SourceMapSegment[][],\\n  owned: boolean,\\n): SourceMapSegment[][] {\\n  const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);\\n  if (unsortedIndex === mappings.length) return mappings;\\n\\n  // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If\\n  // not, we do not want to modify the consumer's input array.\\n  if (!owned) mappings = mappings.slice();\\n\\n  for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {\\n    mappings[i] = sortSegments(mappings[i], owned);\\n  }\\n  return mappings;\\n}\\n\\nfunction nextUnsortedSegmentLine(mappings: SourceMapSegment[][], start: number): number {\\n  for (let i = start; i < mappings.length; i++) {\\n    if (!isSorted(mappings[i])) return i;\\n  }\\n  return mappings.length;\\n}\\n\\nfunction isSorted(line: SourceMapSegment[]): boolean {\\n  for (let j = 1; j < line.length; j++) {\\n    if (line[j][COLUMN] < line[j - 1][COLUMN]) {\\n      return false;\\n    }\\n  }\\n  return true;\\n}\\n\\nfunction sortSegments(line: SourceMapSegment[], owned: boolean): SourceMapSegment[] {\\n  if (!owned) line = line.slice();\\n  return line.sort(sortComparator);\\n}\\n\\nfunction sortComparator(a: SourceMapSegment, b: SourceMapSegment): number {\\n  return a[COLUMN] - b[COLUMN];\\n}\\n\",\"import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment';\\nimport { COLUMN } from './sourcemap-segment';\\n\\nexport type MemoState = {\\n  lastKey: number;\\n  lastNeedle: number;\\n  lastIndex: number;\\n};\\n\\nexport let found = false;\\n\\n/**\\n * A binary search implementation that returns the index if a match is found.\\n * If no match is found, then the left-index (the index associated with the item that comes just\\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\\n * the next index:\\n *\\n * ```js\\n * const array = [1, 3];\\n * const needle = 2;\\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\\n *\\n * assert.equal(index, 0);\\n * array.splice(index + 1, 0, needle);\\n * assert.deepEqual(array, [1, 2, 3]);\\n * ```\\n */\\nexport function binarySearch(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  low: number,\\n  high: number,\\n): number {\\n  while (low <= high) {\\n    const mid = low + ((high - low) >> 1);\\n    const cmp = haystack[mid][COLUMN] - needle;\\n\\n    if (cmp === 0) {\\n      found = true;\\n      return mid;\\n    }\\n\\n    if (cmp < 0) {\\n      low = mid + 1;\\n    } else {\\n      high = mid - 1;\\n    }\\n  }\\n\\n  found = false;\\n  return low - 1;\\n}\\n\\nexport function upperBound(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  index: number,\\n): number {\\n  for (let i = index + 1; i < haystack.length; index = i++) {\\n    if (haystack[i][COLUMN] !== needle) break;\\n  }\\n  return index;\\n}\\n\\nexport function lowerBound(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  index: number,\\n): number {\\n  for (let i = index - 1; i >= 0; index = i--) {\\n    if (haystack[i][COLUMN] !== needle) break;\\n  }\\n  return index;\\n}\\n\\nexport function memoizedState(): MemoState {\\n  return {\\n    lastKey: -1,\\n    lastNeedle: -1,\\n    lastIndex: -1,\\n  };\\n}\\n\\n/**\\n * This overly complicated beast is just to record the last tested line/column and the resulting\\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\\n */\\nexport function memoizedBinarySearch(\\n  haystack: SourceMapSegment[] | ReverseSegment[],\\n  needle: number,\\n  state: MemoState,\\n  key: number,\\n): number {\\n  const { lastKey, lastNeedle, lastIndex } = state;\\n\\n  let low = 0;\\n  let high = haystack.length - 1;\\n  if (key === lastKey) {\\n    if (needle === lastNeedle) {\\n      found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;\\n      return lastIndex;\\n    }\\n\\n    if (needle >= lastNeedle) {\\n      // lastIndex may be -1 if the previous needle was not found.\\n      low = lastIndex === -1 ? 0 : lastIndex;\\n    } else {\\n      high = lastIndex;\\n    }\\n  }\\n  state.lastKey = key;\\n  state.lastNeedle = needle;\\n\\n  return (state.lastIndex = binarySearch(haystack, needle, low, high));\\n}\\n\",\"import { COLUMN, SOURCES_INDEX, SOURCE_LINE, SOURCE_COLUMN } from './sourcemap-segment';\\nimport { memoizedBinarySearch, upperBound } from './binary-search';\\n\\nimport type { ReverseSegment, SourceMapSegment } from './sourcemap-segment';\\nimport type { MemoState } from './binary-search';\\n\\nexport type Source = {\\n  __proto__: null;\\n  [line: number]: Exclude<ReverseSegment, [number]>[];\\n};\\n\\n// Rebuilds the original source files, with mappings that are ordered by source line/column instead\\n// of generated line/column.\\nexport default function buildBySources(\\n  decoded: readonly SourceMapSegment[][],\\n  memos: MemoState[],\\n): Source[] {\\n  const sources: Source[] = memos.map(buildNullArray);\\n\\n  for (let i = 0; i < decoded.length; i++) {\\n    const line = decoded[i];\\n    for (let j = 0; j < line.length; j++) {\\n      const seg = line[j];\\n      if (seg.length === 1) continue;\\n\\n      const sourceIndex = seg[SOURCES_INDEX];\\n      const sourceLine = seg[SOURCE_LINE];\\n      const sourceColumn = seg[SOURCE_COLUMN];\\n      const originalSource = sources[sourceIndex];\\n      const originalLine = (originalSource[sourceLine] ||= []);\\n      const memo = memos[sourceIndex];\\n\\n      // The binary search either found a match, or it found the left-index just before where the\\n      // segment should go. Either way, we want to insert after that. And there may be multiple\\n      // generated segments associated with an original location, so there may need to move several\\n      // indexes before we find where we need to insert.\\n      const index = upperBound(\\n        originalLine,\\n        sourceColumn,\\n        memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine),\\n      );\\n\\n      insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);\\n    }\\n  }\\n\\n  return sources;\\n}\\n\\nfunction insert<T>(array: T[], index: number, value: T) {\\n  for (let i = array.length; i > index; i--) {\\n    array[i] = array[i - 1];\\n  }\\n  array[index] = value;\\n}\\n\\n// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like\\n// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.\\n// Numeric properties on objects are magically sorted in ascending order by the engine regardless of\\n// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending\\n// order when iterating with for-in.\\nfunction buildNullArray<T extends { __proto__: null }>(): T {\\n  return { __proto__: null } as T;\\n}\\n\",\"import { TraceMap, presortedDecodedMap, decodedMappings } from './trace-mapping';\\nimport {\\n  COLUMN,\\n  SOURCES_INDEX,\\n  SOURCE_LINE,\\n  SOURCE_COLUMN,\\n  NAMES_INDEX,\\n} from './sourcemap-segment';\\n\\nimport type {\\n  Section,\\n  SectionedSourceMap,\\n  DecodedSourceMap,\\n  SectionedSourceMapInput,\\n  Ro,\\n} from './types';\\nimport type { SourceMapSegment } from './sourcemap-segment';\\n\\ntype AnyMap = {\\n  new (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;\\n  (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;\\n};\\n\\nexport const AnyMap: AnyMap = function (map, mapUrl) {\\n  const parsed =\\n    typeof map === 'string' ? (JSON.parse(map) as Exclude<SectionedSourceMapInput, string>) : map;\\n\\n  if (!('sections' in parsed)) return new TraceMap(parsed, mapUrl);\\n\\n  const mappings: SourceMapSegment[][] = [];\\n  const sources: string[] = [];\\n  const sourcesContent: (string | null)[] = [];\\n  const names: string[] = [];\\n\\n  recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);\\n\\n  const joined: DecodedSourceMap = {\\n    version: 3,\\n    file: parsed.file,\\n    names,\\n    sources,\\n    sourcesContent,\\n    mappings,\\n  };\\n\\n  return presortedDecodedMap(joined);\\n} as AnyMap;\\n\\nfunction recurse(\\n  input: Ro<SectionedSourceMap>,\\n  mapUrl: string | null | undefined,\\n  mappings: SourceMapSegment[][],\\n  sources: string[],\\n  sourcesContent: (string | null)[],\\n  names: string[],\\n  lineOffset: number,\\n  columnOffset: number,\\n  stopLine: number,\\n  stopColumn: number,\\n) {\\n  const { sections } = input;\\n  for (let i = 0; i < sections.length; i++) {\\n    const { map, offset } = sections[i];\\n\\n    let sl = stopLine;\\n    let sc = stopColumn;\\n    if (i + 1 < sections.length) {\\n      const nextOffset = sections[i + 1].offset;\\n      sl = Math.min(stopLine, lineOffset + nextOffset.line);\\n\\n      if (sl === stopLine) {\\n        sc = Math.min(stopColumn, columnOffset + nextOffset.column);\\n      } else if (sl < stopLine) {\\n        sc = columnOffset + nextOffset.column;\\n      }\\n    }\\n\\n    addSection(\\n      map,\\n      mapUrl,\\n      mappings,\\n      sources,\\n      sourcesContent,\\n      names,\\n      lineOffset + offset.line,\\n      columnOffset + offset.column,\\n      sl,\\n      sc,\\n    );\\n  }\\n}\\n\\nfunction addSection(\\n  input: Ro<Section['map']>,\\n  mapUrl: string | null | undefined,\\n  mappings: SourceMapSegment[][],\\n  sources: string[],\\n  sourcesContent: (string | null)[],\\n  names: string[],\\n  lineOffset: number,\\n  columnOffset: number,\\n  stopLine: number,\\n  stopColumn: number,\\n) {\\n  if ('sections' in input) return recurse(...(arguments as unknown as Parameters<typeof recurse>));\\n\\n  const map = new TraceMap(input, mapUrl);\\n  const sourcesOffset = sources.length;\\n  const namesOffset = names.length;\\n  const decoded = decodedMappings(map);\\n  const { resolvedSources, sourcesContent: contents } = map;\\n\\n  append(sources, resolvedSources);\\n  append(names, map.names);\\n  if (contents) append(sourcesContent, contents);\\n  else for (let i = 0; i < resolvedSources.length; i++) sourcesContent.push(null);\\n\\n  for (let i = 0; i < decoded.length; i++) {\\n    const lineI = lineOffset + i;\\n\\n    // We can only add so many lines before we step into the range that the next section's map\\n    // controls. When we get to the last line, then we'll start checking the segments to see if\\n    // they've crossed into the column range. But it may not have any columns that overstep, so we\\n    // still need to check that we don't overstep lines, too.\\n    if (lineI > stopLine) return;\\n\\n    // The out line may already exist in mappings (if we're continuing the line started by a\\n    // previous section). Or, we may have jumped ahead several lines to start this section.\\n    const out = getLine(mappings, lineI);\\n    // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the\\n    // map can be multiple lines), it doesn't.\\n    const cOffset = i === 0 ? columnOffset : 0;\\n\\n    const line = decoded[i];\\n    for (let j = 0; j < line.length; j++) {\\n      const seg = line[j];\\n      const column = cOffset + seg[COLUMN];\\n\\n      // If this segment steps into the column range that the next section's map controls, we need\\n      // to stop early.\\n      if (lineI === stopLine && column >= stopColumn) return;\\n\\n      if (seg.length === 1) {\\n        out.push([column]);\\n        continue;\\n      }\\n\\n      const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];\\n      const sourceLine = seg[SOURCE_LINE];\\n      const sourceColumn = seg[SOURCE_COLUMN];\\n      out.push(\\n        seg.length === 4\\n          ? [column, sourcesIndex, sourceLine, sourceColumn]\\n          : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]],\\n      );\\n    }\\n  }\\n}\\n\\nfunction append<T>(arr: T[], other: T[]) {\\n  for (let i = 0; i < other.length; i++) arr.push(other[i]);\\n}\\n\\nfunction getLine<T>(arr: T[][], index: number): T[] {\\n  for (let i = arr.length; i <= index; i++) arr[i] = [];\\n  return arr[index];\\n}\\n\",\"import { encode, decode } from '@jridgewell/sourcemap-codec';\\n\\nimport resolve from './resolve';\\nimport stripFilename from './strip-filename';\\nimport maybeSort from './sort';\\nimport buildBySources from './by-source';\\nimport {\\n  memoizedState,\\n  memoizedBinarySearch,\\n  upperBound,\\n  lowerBound,\\n  found as bsFound,\\n} from './binary-search';\\nimport {\\n  COLUMN,\\n  SOURCES_INDEX,\\n  SOURCE_LINE,\\n  SOURCE_COLUMN,\\n  NAMES_INDEX,\\n  REV_GENERATED_LINE,\\n  REV_GENERATED_COLUMN,\\n} from './sourcemap-segment';\\n\\nimport type { SourceMapSegment, ReverseSegment } from './sourcemap-segment';\\nimport type {\\n  SourceMapV3,\\n  DecodedSourceMap,\\n  EncodedSourceMap,\\n  InvalidOriginalMapping,\\n  OriginalMapping,\\n  InvalidGeneratedMapping,\\n  GeneratedMapping,\\n  SourceMapInput,\\n  Needle,\\n  SourceNeedle,\\n  SourceMap,\\n  EachMapping,\\n  Bias,\\n} from './types';\\nimport type { Source } from './by-source';\\nimport type { MemoState } from './binary-search';\\n\\nexport type { SourceMapSegment } from './sourcemap-segment';\\nexport type {\\n  SourceMapInput,\\n  SectionedSourceMapInput,\\n  DecodedSourceMap,\\n  EncodedSourceMap,\\n  SectionedSourceMap,\\n  InvalidOriginalMapping,\\n  OriginalMapping as Mapping,\\n  OriginalMapping,\\n  InvalidGeneratedMapping,\\n  GeneratedMapping,\\n  EachMapping,\\n} from './types';\\n\\nconst LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';\\nconst COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';\\n\\nexport const LEAST_UPPER_BOUND = -1;\\nexport const GREATEST_LOWER_BOUND = 1;\\n\\n/**\\n * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\\n */\\nexport let encodedMappings: (map: TraceMap) => EncodedSourceMap['mappings'];\\n\\n/**\\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\\n */\\nexport let decodedMappings: (map: TraceMap) => Readonly<DecodedSourceMap['mappings']>;\\n\\n/**\\n * A low-level API to find the segment associated with a generated line/column (think, from a\\n * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\\n */\\nexport let traceSegment: (\\n  map: TraceMap,\\n  line: number,\\n  column: number,\\n) => Readonly<SourceMapSegment> | null;\\n\\n/**\\n * A higher-level API to find the source/line/column associated with a generated line/column\\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\\n * `source-map` library.\\n */\\nexport let originalPositionFor: (\\n  map: TraceMap,\\n  needle: Needle,\\n) => OriginalMapping | InvalidOriginalMapping;\\n\\n/**\\n * Finds the generated line/column position of the provided source/line/column source position.\\n */\\nexport let generatedPositionFor: (\\n  map: TraceMap,\\n  needle: SourceNeedle,\\n) => GeneratedMapping | InvalidGeneratedMapping;\\n\\n/**\\n * Finds all generated line/column positions of the provided source/line/column source position.\\n */\\nexport let allGeneratedPositionsFor: (map: TraceMap, needle: SourceNeedle) => GeneratedMapping[];\\n\\n/**\\n * Iterates each mapping in generated position order.\\n */\\nexport let eachMapping: (map: TraceMap, cb: (mapping: EachMapping) => void) => void;\\n\\n/**\\n * Retrieves the source content for a particular source, if its found. Returns null if not.\\n */\\nexport let sourceContentFor: (map: TraceMap, source: string) => string | null;\\n\\n/**\\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\\n * maps.\\n */\\nexport let presortedDecodedMap: (map: DecodedSourceMap, mapUrl?: string) => TraceMap;\\n\\n/**\\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let decodedMap: (\\n  map: TraceMap,\\n) => Omit<DecodedSourceMap, 'mappings'> & { mappings: readonly SourceMapSegment[][] };\\n\\n/**\\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\\n * a sourcemap, or to JSON.stringify.\\n */\\nexport let encodedMap: (map: TraceMap) => EncodedSourceMap;\\n\\nexport { AnyMap } from './any-map';\\n\\nexport class TraceMap implements SourceMap {\\n  declare version: SourceMapV3['version'];\\n  declare file: SourceMapV3['file'];\\n  declare names: SourceMapV3['names'];\\n  declare sourceRoot: SourceMapV3['sourceRoot'];\\n  declare sources: SourceMapV3['sources'];\\n  declare sourcesContent: SourceMapV3['sourcesContent'];\\n\\n  declare resolvedSources: string[];\\n  private declare _encoded: string | undefined;\\n\\n  private declare _decoded: SourceMapSegment[][] | undefined;\\n  private declare _decodedMemo: MemoState;\\n\\n  private declare _bySources: Source[] | undefined;\\n  private declare _bySourceMemos: MemoState[] | undefined;\\n\\n  constructor(map: SourceMapInput, mapUrl?: string | null) {\\n    const isString = typeof map === 'string';\\n\\n    if (!isString && (map as unknown as { _decodedMemo: any })._decodedMemo) return map as TraceMap;\\n\\n    const parsed = (isString ? JSON.parse(map) : map) as DecodedSourceMap | EncodedSourceMap;\\n\\n    const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;\\n    this.version = version;\\n    this.file = file;\\n    this.names = names;\\n    this.sourceRoot = sourceRoot;\\n    this.sources = sources;\\n    this.sourcesContent = sourcesContent;\\n\\n    const from = resolve(sourceRoot || '', stripFilename(mapUrl));\\n    this.resolvedSources = sources.map((s) => resolve(s || '', from));\\n\\n    const { mappings } = parsed;\\n    if (typeof mappings === 'string') {\\n      this._encoded = mappings;\\n      this._decoded = undefined;\\n    } else {\\n      this._encoded = undefined;\\n      this._decoded = maybeSort(mappings, isString);\\n    }\\n\\n    this._decodedMemo = memoizedState();\\n    this._bySources = undefined;\\n    this._bySourceMemos = undefined;\\n  }\\n\\n  static {\\n    encodedMappings = (map) => {\\n      return (map._encoded ??= encode(map._decoded!));\\n    };\\n\\n    decodedMappings = (map) => {\\n      return (map._decoded ||= decode(map._encoded!));\\n    };\\n\\n    traceSegment = (map, line, column) => {\\n      const decoded = decodedMappings(map);\\n\\n      // It's common for parent source maps to have pointers to lines that have no\\n      // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n      if (line >= decoded.length) return null;\\n\\n      const segments = decoded[line];\\n      const index = traceSegmentInternal(\\n        segments,\\n        map._decodedMemo,\\n        line,\\n        column,\\n        GREATEST_LOWER_BOUND,\\n      );\\n\\n      return index === -1 ? null : segments[index];\\n    };\\n\\n    originalPositionFor = (map, { line, column, bias }) => {\\n      line--;\\n      if (line < 0) throw new Error(LINE_GTR_ZERO);\\n      if (column < 0) throw new Error(COL_GTR_EQ_ZERO);\\n\\n      const decoded = decodedMappings(map);\\n\\n      // It's common for parent source maps to have pointers to lines that have no\\n      // mapping (like a \\\"//# sourceMappingURL=\\\") at the end of the child file.\\n      if (line >= decoded.length) return OMapping(null, null, null, null);\\n\\n      const segments = decoded[line];\\n      const index = traceSegmentInternal(\\n        segments,\\n        map._decodedMemo,\\n        line,\\n        column,\\n        bias || GREATEST_LOWER_BOUND,\\n      );\\n\\n      if (index === -1) return OMapping(null, null, null, null);\\n\\n      const segment = segments[index];\\n      if (segment.length === 1) return OMapping(null, null, null, null);\\n\\n      const { names, resolvedSources } = map;\\n      return OMapping(\\n        resolvedSources[segment[SOURCES_INDEX]],\\n        segment[SOURCE_LINE] + 1,\\n        segment[SOURCE_COLUMN],\\n        segment.length === 5 ? names[segment[NAMES_INDEX]] : null,\\n      );\\n    };\\n\\n    allGeneratedPositionsFor = (map, { source, line, column, bias }) => {\\n      // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.\\n      return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);\\n    };\\n\\n    generatedPositionFor = (map, { source, line, column, bias }) => {\\n      return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);\\n    };\\n\\n    eachMapping = (map, cb) => {\\n      const decoded = decodedMappings(map);\\n      const { names, resolvedSources } = map;\\n\\n      for (let i = 0; i < decoded.length; i++) {\\n        const line = decoded[i];\\n        for (let j = 0; j < line.length; j++) {\\n          const seg = line[j];\\n\\n          const generatedLine = i + 1;\\n          const generatedColumn = seg[0];\\n          let source = null;\\n          let originalLine = null;\\n          let originalColumn = null;\\n          let name = null;\\n          if (seg.length !== 1) {\\n            source = resolvedSources[seg[1]];\\n            originalLine = seg[2] + 1;\\n            originalColumn = seg[3];\\n          }\\n          if (seg.length === 5) name = names[seg[4]];\\n\\n          cb({\\n            generatedLine,\\n            generatedColumn,\\n            source,\\n            originalLine,\\n            originalColumn,\\n            name,\\n          } as EachMapping);\\n        }\\n      }\\n    };\\n\\n    sourceContentFor = (map, source) => {\\n      const { sources, resolvedSources, sourcesContent } = map;\\n      if (sourcesContent == null) return null;\\n\\n      let index = sources.indexOf(source);\\n      if (index === -1) index = resolvedSources.indexOf(source);\\n\\n      return index === -1 ? null : sourcesContent[index];\\n    };\\n\\n    presortedDecodedMap = (map, mapUrl) => {\\n      const tracer = new TraceMap(clone(map, []), mapUrl);\\n      tracer._decoded = map.mappings;\\n      return tracer;\\n    };\\n\\n    decodedMap = (map) => {\\n      return clone(map, decodedMappings(map));\\n    };\\n\\n    encodedMap = (map) => {\\n      return clone(map, encodedMappings(map));\\n    };\\n\\n    function generatedPosition(\\n      map: TraceMap,\\n      source: string,\\n      line: number,\\n      column: number,\\n      bias: Bias,\\n      all: false,\\n    ): GeneratedMapping | InvalidGeneratedMapping;\\n    function generatedPosition(\\n      map: TraceMap,\\n      source: string,\\n      line: number,\\n      column: number,\\n      bias: Bias,\\n      all: true,\\n    ): GeneratedMapping[];\\n    function generatedPosition(\\n      map: TraceMap,\\n      source: string,\\n      line: number,\\n      column: number,\\n      bias: Bias,\\n      all: boolean,\\n    ): GeneratedMapping | InvalidGeneratedMapping | GeneratedMapping[] {\\n      line--;\\n      if (line < 0) throw new Error(LINE_GTR_ZERO);\\n      if (column < 0) throw new Error(COL_GTR_EQ_ZERO);\\n\\n      const { sources, resolvedSources } = map;\\n      let sourceIndex = sources.indexOf(source);\\n      if (sourceIndex === -1) sourceIndex = resolvedSources.indexOf(source);\\n      if (sourceIndex === -1) return all ? [] : GMapping(null, null);\\n\\n      const generated = (map._bySources ||= buildBySources(\\n        decodedMappings(map),\\n        (map._bySourceMemos = sources.map(memoizedState)),\\n      ));\\n\\n      const segments = generated[sourceIndex][line];\\n      if (segments == null) return all ? [] : GMapping(null, null);\\n\\n      const memo = map._bySourceMemos![sourceIndex];\\n\\n      if (all) return sliceGeneratedPositions(segments, memo, line, column, bias);\\n\\n      const index = traceSegmentInternal(segments, memo, line, column, bias);\\n      if (index === -1) return GMapping(null, null);\\n\\n      const segment = segments[index];\\n      return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);\\n    }\\n  }\\n}\\n\\nfunction clone<T extends string | readonly SourceMapSegment[][]>(\\n  map: TraceMap | DecodedSourceMap | EncodedSourceMap,\\n  mappings: T,\\n): T extends string ? EncodedSourceMap : DecodedSourceMap {\\n  return {\\n    version: map.version,\\n    file: map.file,\\n    names: map.names,\\n    sourceRoot: map.sourceRoot,\\n    sources: map.sources,\\n    sourcesContent: map.sourcesContent,\\n    mappings,\\n  } as any;\\n}\\n\\nfunction OMapping(source: null, line: null, column: null, name: null): InvalidOriginalMapping;\\nfunction OMapping(\\n  source: string,\\n  line: number,\\n  column: number,\\n  name: string | null,\\n): OriginalMapping;\\nfunction OMapping(\\n  source: string | null,\\n  line: number | null,\\n  column: number | null,\\n  name: string | null,\\n): OriginalMapping | InvalidOriginalMapping {\\n  return { source, line, column, name } as any;\\n}\\n\\nfunction GMapping(line: null, column: null): InvalidGeneratedMapping;\\nfunction GMapping(line: number, column: number): GeneratedMapping;\\nfunction GMapping(\\n  line: number | null,\\n  column: number | null,\\n): GeneratedMapping | InvalidGeneratedMapping {\\n  return { line, column } as any;\\n}\\n\\nfunction traceSegmentInternal(\\n  segments: SourceMapSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): number;\\nfunction traceSegmentInternal(\\n  segments: ReverseSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): number;\\nfunction traceSegmentInternal(\\n  segments: SourceMapSegment[] | ReverseSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): number {\\n  let index = memoizedBinarySearch(segments, column, memo, line);\\n  if (bsFound) {\\n    index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);\\n  } else if (bias === LEAST_UPPER_BOUND) index++;\\n\\n  if (index === -1 || index === segments.length) return -1;\\n  return index;\\n}\\n\\nfunction sliceGeneratedPositions(\\n  segments: ReverseSegment[],\\n  memo: MemoState,\\n  line: number,\\n  column: number,\\n  bias: Bias,\\n): GeneratedMapping[] {\\n  let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);\\n\\n  // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in\\n  // insertion order) segment that matched. Even if we did respect the bias when tracing, we would\\n  // still need to call `lowerBound()` to find the first segment, which is slower than just looking\\n  // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the\\n  // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to\\n  // match LEAST_UPPER_BOUND.\\n  if (!bsFound && bias === LEAST_UPPER_BOUND) min++;\\n\\n  if (min === -1 || min === segments.length) return [];\\n\\n  // We may have found the segment that started at an earlier column. If this is the case, then we\\n  // need to slice all generated segments that match _that_ column, because all such segments span\\n  // to our desired column.\\n  const matchedColumn = bsFound ? column : segments[min][COLUMN];\\n\\n  // The binary search is not guaranteed to find the lower bound when a match wasn't found.\\n  if (!bsFound) min = lowerBound(segments, matchedColumn, min);\\n  const max = upperBound(segments, matchedColumn, min);\\n\\n  const result = [];\\n  for (; min <= max; min++) {\\n    const segment = segments[min];\\n    result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));\\n  }\\n  return result;\\n}\\n\"],\"names\":[\"resolveUri\",\"presortedDecodedMap\",\"decodedMappings\",\"encodedMappings\",\"traceSegment\",\"originalPositionFor\",\"generatedPositionFor\",\"allGeneratedPositionsFor\",\"eachMapping\",\"sourceContentFor\",\"decodedMap\",\"encodedMap\",\"encode\",\"decode\",\"bsFound\"],\"mappings\":\";;;;;;;;;;IAEc,SAAU,OAAO,CAAC,KAAa,EAAE,IAAwB,EAAA;;;;QAIrE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,IAAI,GAAG,CAAC;IAE7C,IAAA,OAAOA,8BAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC;;ICTA;;IAEG;IACqB,SAAA,aAAa,CAAC,IAA+B,EAAA;IACnE,IAAA,IAAI,CAAC,IAAI;IAAE,QAAA,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClC;;ICQO,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,CAAC;IAEtB,MAAM,kBAAkB,GAAG,CAAC,CAAC;IAC7B,MAAM,oBAAoB,GAAG,CAAC;;IClBvB,SAAU,SAAS,CAC/B,QAA8B,EAC9B,KAAc,EAAA;QAEd,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAA,IAAI,aAAa,KAAK,QAAQ,CAAC,MAAM;IAAE,QAAA,OAAO,QAAQ,CAAC;;;IAIvD,IAAA,IAAI,CAAC,KAAK;IAAE,QAAA,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC7F,QAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChD,KAAA;IACD,IAAA,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,uBAAuB,CAAC,QAA8B,EAAE,KAAa,EAAA;IAC5E,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC5C,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAAE,YAAA,OAAO,CAAC,CAAC;IACtC,KAAA;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,SAAS,QAAQ,CAAC,IAAwB,EAAA;IACxC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACpC,QAAA,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;IACzC,YAAA,OAAO,KAAK,CAAC;IACd,SAAA;IACF,KAAA;IACD,IAAA,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,YAAY,CAAC,IAAwB,EAAE,KAAc,EAAA;IAC5D,IAAA,IAAI,CAAC,KAAK;IAAE,QAAA,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAChC,IAAA,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,cAAc,CAAC,CAAmB,EAAE,CAAmB,EAAA;QAC9D,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/B;;ICnCO,IAAI,KAAK,GAAG,KAAK,CAAC;IAEzB;;;;;;;;;;;;;;;IAeG;IACG,SAAU,YAAY,CAC1B,QAA+C,EAC/C,MAAc,EACd,GAAW,EACX,IAAY,EAAA;QAEZ,OAAO,GAAG,IAAI,IAAI,EAAE;IAClB,QAAA,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAE3C,IAAI,GAAG,KAAK,CAAC,EAAE;gBACb,KAAK,GAAG,IAAI,CAAC;IACb,YAAA,OAAO,GAAG,CAAC;IACZ,SAAA;YAED,IAAI,GAAG,GAAG,CAAC,EAAE;IACX,YAAA,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACf,SAAA;IAAM,aAAA;IACL,YAAA,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IAChB,SAAA;IACF,KAAA;QAED,KAAK,GAAG,KAAK,CAAC;QACd,OAAO,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC;aAEe,UAAU,CACxB,QAA+C,EAC/C,MAAc,EACd,KAAa,EAAA;IAEb,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;YACxD,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM;gBAAE,MAAM;IAC3C,KAAA;IACD,IAAA,OAAO,KAAK,CAAC;IACf,CAAC;aAEe,UAAU,CACxB,QAA+C,EAC/C,MAAc,EACd,KAAa,EAAA;IAEb,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;YAC3C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM;gBAAE,MAAM;IAC3C,KAAA;IACD,IAAA,OAAO,KAAK,CAAC;IACf,CAAC;aAEe,aAAa,GAAA;QAC3B,OAAO;YACL,OAAO,EAAE,CAAC,CAAC;YACX,UAAU,EAAE,CAAC,CAAC;YACd,SAAS,EAAE,CAAC,CAAC;SACd,CAAC;IACJ,CAAC;IAED;;;IAGG;IACG,SAAU,oBAAoB,CAClC,QAA+C,EAC/C,MAAc,EACd,KAAgB,EAChB,GAAW,EAAA;QAEX,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,OAAO,EAAE;YACnB,IAAI,MAAM,KAAK,UAAU,EAAE;IACzB,YAAA,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;IACnE,YAAA,OAAO,SAAS,CAAC;IAClB,SAAA;YAED,IAAI,MAAM,IAAI,UAAU,EAAE;;IAExB,YAAA,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACxC,SAAA;IAAM,aAAA;gBACL,IAAI,GAAG,SAAS,CAAC;IAClB,SAAA;IACF,KAAA;IACD,IAAA,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IACpB,IAAA,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAE1B,IAAA,QAAQ,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IACvE;;ICvGA;IACA;IACc,SAAU,cAAc,CACpC,OAAsC,EACtC,KAAkB,EAAA;QAElB,MAAM,OAAO,GAAa,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEpD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACvC,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACpC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;IAE/B,YAAA,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACvC,YAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IACpC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,YAAA,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,YAAA,MAAM,YAAY,IAAI,cAAc,CAAC,UAAU,CAAzB,KAAA,cAAc,CAAC,UAAU,CAAM,GAAA,EAAE,EAAC,CAAC;IACzD,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;;;;;IAMhC,YAAA,MAAM,KAAK,GAAG,UAAU,CACtB,YAAY,EACZ,YAAY,EACZ,oBAAoB,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,CACnE,CAAC;gBAEF,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpF,SAAA;IACF,KAAA;IAED,IAAA,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,MAAM,CAAI,KAAU,EAAE,KAAa,EAAE,KAAQ,EAAA;IACpD,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YACzC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAA;IACD,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;IACA;IACA;IACA;IACA;IACA,SAAS,cAAc,GAAA;IACrB,IAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAO,CAAC;IAClC;;ACxCa,UAAA,MAAM,GAAW,UAAU,GAAG,EAAE,MAAM,EAAA;IACjD,IAAA,MAAM,MAAM,GACV,OAAO,GAAG,KAAK,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8C,GAAG,GAAG,CAAC;IAEhG,IAAA,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC;IAAE,QAAA,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAsB,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE5F,IAAA,MAAM,MAAM,GAAqB;IAC/B,QAAA,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK;YACL,OAAO;YACP,cAAc;YACd,QAAQ;SACT,CAAC;IAEF,IAAA,OAAOC,2BAAmB,CAAC,MAAM,CAAC,CAAC;IACrC,EAAY;IAEZ,SAAS,OAAO,CACd,KAA6B,EAC7B,MAAiC,EACjC,QAA8B,EAC9B,OAAiB,EACjB,cAAiC,EACjC,KAAe,EACf,UAAkB,EAClB,YAAoB,EACpB,QAAgB,EAChB,UAAkB,EAAA;IAElB,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEpC,IAAI,EAAE,GAAG,QAAQ,CAAC;YAClB,IAAI,EAAE,GAAG,UAAU,CAAC;IACpB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;gBAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,YAAA,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;gBAEtD,IAAI,EAAE,KAAK,QAAQ,EAAE;IACnB,gBAAA,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7D,aAAA;qBAAM,IAAI,EAAE,GAAG,QAAQ,EAAE;IACxB,gBAAA,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;IACvC,aAAA;IACF,SAAA;IAED,QAAA,UAAU,CACR,GAAG,EACH,MAAM,EACN,QAAQ,EACR,OAAO,EACP,cAAc,EACd,KAAK,EACL,UAAU,GAAG,MAAM,CAAC,IAAI,EACxB,YAAY,GAAG,MAAM,CAAC,MAAM,EAC5B,EAAE,EACF,EAAE,CACH,CAAC;IACH,KAAA;IACH,CAAC;IAED,SAAS,UAAU,CACjB,KAAyB,EACzB,MAAiC,EACjC,QAA8B,EAC9B,OAAiB,EACjB,cAAiC,EACjC,KAAe,EACf,UAAkB,EAClB,YAAoB,EACpB,QAAgB,EAChB,UAAkB,EAAA;QAElB,IAAI,UAAU,IAAI,KAAK;IAAE,QAAA,OAAO,OAAO,CAAC,GAAI,SAAmD,CAAC,CAAC;QAEjG,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IACrC,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,IAAA,MAAM,OAAO,GAAGC,uBAAe,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAE1D,IAAA,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjC,IAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAA,IAAI,QAAQ;IAAE,QAAA,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;;IAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE;IAAE,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhF,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACvC,QAAA,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;;;;;YAM7B,IAAI,KAAK,GAAG,QAAQ;gBAAE,OAAO;;;YAI7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;;;IAGrC,QAAA,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;IAE3C,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACpC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;;;IAIrC,YAAA,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,UAAU;oBAAE,OAAO;IAEvD,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;IACpB,gBAAA,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnB,SAAS;IACV,aAAA;gBAED,MAAM,YAAY,GAAG,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACxD,YAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IACpC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,YAAA,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,MAAM,KAAK,CAAC;sBACZ,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC;IAClD,kBAAE,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CACrF,CAAC;IACH,SAAA;IACF,KAAA;IACH,CAAC;IAED,SAAS,MAAM,CAAI,GAAQ,EAAE,KAAU,EAAA;IACrC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS,OAAO,CAAI,GAAU,EAAE,KAAa,EAAA;IAC3C,IAAA,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE;IAAE,QAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACtD,IAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB;;IC7GA,MAAM,aAAa,GAAG,uDAAuD,CAAC;IAC9E,MAAM,eAAe,GAAG,yEAAyE,CAAC;AAErF,UAAA,iBAAiB,GAAG,CAAC,EAAE;AAC7B,UAAM,oBAAoB,GAAG,EAAE;IAEtC;;IAEG;AACQC,qCAAiE;IAE5E;;IAEG;AACQD,qCAA2E;IAEtF;;;IAGG;AACQE,kCAI4B;IAEvC;;;;IAIG;AACQC,yCAGmC;IAE9C;;IAEG;AACQC,0CAGqC;IAEhD;;IAEG;AACQC,8CAAsF;IAEjG;;IAEG;AACQC,iCAAyE;IAEpF;;IAEG;AACQC,sCAAmE;IAE9E;;;IAGG;AACQR,yCAA0E;IAErF;;;IAGG;AACQS,gCAE2E;IAEtF;;;IAGG;AACQC,gCAAgD;UAI9C,QAAQ,CAAA;QAiBnB,WAAY,CAAA,GAAmB,EAAE,MAAsB,EAAA;IACrD,QAAA,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC;IAEzC,QAAA,IAAI,CAAC,QAAQ,IAAK,GAAwC,CAAC,YAAY;IAAE,YAAA,OAAO,GAAe,CAAC;IAEhG,QAAA,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAwC,CAAC;IAEzF,QAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAC7E,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACnB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC7B,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IAErC,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAElE,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,QAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;IAChC,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzB,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,SAAA;IAAM,aAAA;IACL,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/C,SAAA;IAED,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa,EAAE,CAAC;IACpC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;SACjC;IAuLF,CAAA;IArLC,CAAA,MAAA;IACE,IAAAR,uBAAe,GAAG,CAAC,GAAG,KAAI;;IACxB,QAAA,cAAQ,GAAG,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,IAAZ,GAAG,CAAC,QAAQ,GAAKS,qBAAM,CAAC,GAAG,CAAC,QAAS,CAAC,GAAE;IAClD,KAAC,CAAC;IAEF,IAAAV,uBAAe,GAAG,CAAC,GAAG,KAAI;IACxB,QAAA,QAAQ,GAAG,CAAC,QAAQ,KAAZ,GAAG,CAAC,QAAQ,GAAKW,qBAAM,CAAC,GAAG,CAAC,QAAS,CAAC,GAAE;IAClD,KAAC,CAAC;QAEFT,oBAAY,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,KAAI;IACnC,QAAA,MAAM,OAAO,GAAGF,uBAAe,CAAC,GAAG,CAAC,CAAC;;;IAIrC,QAAA,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;IAAE,YAAA,OAAO,IAAI,CAAC;IAExC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAChC,QAAQ,EACR,GAAG,CAAC,YAAY,EAChB,IAAI,EACJ,MAAM,EACN,oBAAoB,CACrB,CAAC;IAEF,QAAA,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,KAAC,CAAC;IAEF,IAAAG,2BAAmB,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAI;IACpD,QAAA,IAAI,EAAE,CAAC;YACP,IAAI,IAAI,GAAG,CAAC;IAAE,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7C,IAAI,MAAM,GAAG,CAAC;IAAE,YAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAEjD,QAAA,MAAM,OAAO,GAAGH,uBAAe,CAAC,GAAG,CAAC,CAAC;;;IAIrC,QAAA,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEpE,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAChC,QAAQ,EACR,GAAG,CAAC,YAAY,EAChB,IAAI,EACJ,MAAM,EACN,IAAI,IAAI,oBAAoB,CAC7B,CAAC;YAEF,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE1D,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAElE,QAAA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;IACvC,QAAA,OAAO,QAAQ,CACb,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EACvC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EACxB,OAAO,CAAC,aAAa,CAAC,EACtB,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAC1D,CAAC;IACJ,KAAC,CAAC;IAEF,IAAAK,gCAAwB,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAI;;IAEjE,QAAA,OAAO,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACvF,KAAC,CAAC;IAEF,IAAAD,4BAAoB,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAI;IAC7D,QAAA,OAAO,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAC3F,KAAC,CAAC;IAEF,IAAAE,mBAAW,GAAG,CAAC,GAAG,EAAE,EAAE,KAAI;IACxB,QAAA,MAAM,OAAO,GAAGN,uBAAe,CAAC,GAAG,CAAC,CAAC;IACrC,QAAA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;IAEvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACvC,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,gBAAA,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,gBAAA,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAI,MAAM,GAAG,IAAI,CAAC;oBAClB,IAAI,YAAY,GAAG,IAAI,CAAC;oBACxB,IAAI,cAAc,GAAG,IAAI,CAAC;oBAC1B,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;wBACpB,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,oBAAA,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1B,oBAAA,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,iBAAA;IACD,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;wBAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,gBAAA,EAAE,CAAC;wBACD,aAAa;wBACb,eAAe;wBACf,MAAM;wBACN,YAAY;wBACZ,cAAc;wBACd,IAAI;IACU,iBAAA,CAAC,CAAC;IACnB,aAAA;IACF,SAAA;IACH,KAAC,CAAC;IAEF,IAAAO,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAI;YACjC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;YACzD,IAAI,cAAc,IAAI,IAAI;IAAE,YAAA,OAAO,IAAI,CAAC;YAExC,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,CAAC,CAAC;IAAE,YAAA,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1D,QAAA,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrD,KAAC,CAAC;IAEF,IAAAR,2BAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAI;IACpC,QAAA,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,QAAA,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC/B,QAAA,OAAO,MAAM,CAAC;IAChB,KAAC,CAAC;IAEF,IAAAS,kBAAU,GAAG,CAAC,GAAG,KAAI;YACnB,OAAO,KAAK,CAAC,GAAG,EAAER,uBAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,KAAC,CAAC;IAEF,IAAAS,kBAAU,GAAG,CAAC,GAAG,KAAI;YACnB,OAAO,KAAK,CAAC,GAAG,EAAER,uBAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,KAAC,CAAC;IAkBF,IAAA,SAAS,iBAAiB,CACxB,GAAa,EACb,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAU,EACV,GAAY,EAAA;IAEZ,QAAA,IAAI,EAAE,CAAC;YACP,IAAI,IAAI,GAAG,CAAC;IAAE,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7C,IAAI,MAAM,GAAG,CAAC;IAAE,YAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAEjD,QAAA,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;YACzC,IAAI,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,WAAW,KAAK,CAAC,CAAC;IAAE,YAAA,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,WAAW,KAAK,CAAC,CAAC;IAAE,YAAA,OAAO,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE/D,QAAA,MAAM,SAAS,IAAI,GAAG,CAAC,UAAU,KAAd,GAAG,CAAC,UAAU,GAAK,cAAc,CAClDD,uBAAe,CAAC,GAAG,CAAC,GACnB,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EACjD,EAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,QAAQ,IAAI,IAAI;IAAE,YAAA,OAAO,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,IAAI,GAAG,GAAG,CAAC,cAAe,CAAC,WAAW,CAAC,CAAC;IAE9C,QAAA,IAAI,GAAG;IAAE,YAAA,OAAO,uBAAuB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAE5E,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACvE,IAAI,KAAK,KAAK,CAAC,CAAC;IAAE,YAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE9C,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;SACjF;IACH,CAAC,GAAA,CAAA;IAGH,SAAS,KAAK,CACZ,GAAmD,EACnD,QAAW,EAAA;QAEX,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,QAAQ;SACF,CAAC;IACX,CAAC;IASD,SAAS,QAAQ,CACf,MAAqB,EACrB,IAAmB,EACnB,MAAqB,EACrB,IAAmB,EAAA;QAEnB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAS,CAAC;IAC/C,CAAC;IAID,SAAS,QAAQ,CACf,IAAmB,EACnB,MAAqB,EAAA;IAErB,IAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAS,CAAC;IACjC,CAAC;IAgBD,SAAS,oBAAoB,CAC3B,QAA+C,EAC/C,IAAe,EACf,IAAY,EACZ,MAAc,EACd,IAAU,EAAA;IAEV,IAAA,IAAI,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/D,IAAA,IAAIY,KAAO,EAAE;YACX,KAAK,GAAG,CAAC,IAAI,KAAK,iBAAiB,GAAG,UAAU,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACzF,KAAA;aAAM,IAAI,IAAI,KAAK,iBAAiB;IAAE,QAAA,KAAK,EAAE,CAAC;QAE/C,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,CAAC;IACzD,IAAA,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,uBAAuB,CAC9B,QAA0B,EAC1B,IAAe,EACf,IAAY,EACZ,MAAc,EACd,IAAU,EAAA;IAEV,IAAA,IAAI,GAAG,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;;;;;;;IAQnF,IAAA,IAAI,CAACA,KAAO,IAAI,IAAI,KAAK,iBAAiB;IAAE,QAAA,GAAG,EAAE,CAAC;QAElD,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,MAAM;IAAE,QAAA,OAAO,EAAE,CAAC;;;;IAKrD,IAAA,MAAM,aAAa,GAAGA,KAAO,GAAG,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;;IAG/D,IAAA,IAAI,CAACA,KAAO;YAAE,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,IAAA,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,QAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvF,KAAA;IACD,IAAA,OAAO,MAAM,CAAC;IAChB;;;;;;;;;;;;;\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/any-map.d.ts",
    "content": "import { TraceMap } from './trace-mapping';\nimport type { SectionedSourceMapInput } from './types';\ndeclare type AnyMap = {\n    new (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;\n    (map: SectionedSourceMapInput, mapUrl?: string | null): TraceMap;\n};\nexport declare const AnyMap: AnyMap;\nexport {};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/binary-search.d.ts",
    "content": "import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment';\nexport declare type MemoState = {\n    lastKey: number;\n    lastNeedle: number;\n    lastIndex: number;\n};\nexport declare let found: boolean;\n/**\n * A binary search implementation that returns the index if a match is found.\n * If no match is found, then the left-index (the index associated with the item that comes just\n * before the desired index) is returned. To maintain proper sort order, a splice would happen at\n * the next index:\n *\n * ```js\n * const array = [1, 3];\n * const needle = 2;\n * const index = binarySearch(array, needle, (item, needle) => item - needle);\n *\n * assert.equal(index, 0);\n * array.splice(index + 1, 0, needle);\n * assert.deepEqual(array, [1, 2, 3]);\n * ```\n */\nexport declare function binarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, low: number, high: number): number;\nexport declare function upperBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number;\nexport declare function lowerBound(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, index: number): number;\nexport declare function memoizedState(): MemoState;\n/**\n * This overly complicated beast is just to record the last tested line/column and the resulting\n * index, allowing us to skip a few tests if mappings are monotonically increasing.\n */\nexport declare function memoizedBinarySearch(haystack: SourceMapSegment[] | ReverseSegment[], needle: number, state: MemoState, key: number): number;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/by-source.d.ts",
    "content": "import type { ReverseSegment, SourceMapSegment } from './sourcemap-segment';\nimport type { MemoState } from './binary-search';\nexport declare type Source = {\n    __proto__: null;\n    [line: number]: Exclude<ReverseSegment, [number]>[];\n};\nexport default function buildBySources(decoded: readonly SourceMapSegment[][], memos: MemoState[]): Source[];\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/resolve.d.ts",
    "content": "export default function resolve(input: string, base: string | undefined): string;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/sort.d.ts",
    "content": "import type { SourceMapSegment } from './sourcemap-segment';\nexport default function maybeSort(mappings: SourceMapSegment[][], owned: boolean): SourceMapSegment[][];\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/sourcemap-segment.d.ts",
    "content": "declare type GeneratedColumn = number;\ndeclare type SourcesIndex = number;\ndeclare type SourceLine = number;\ndeclare type SourceColumn = number;\ndeclare type NamesIndex = number;\ndeclare type GeneratedLine = number;\nexport declare type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex];\nexport declare type ReverseSegment = [SourceColumn, GeneratedLine, GeneratedColumn];\nexport declare const COLUMN = 0;\nexport declare const SOURCES_INDEX = 1;\nexport declare const SOURCE_LINE = 2;\nexport declare const SOURCE_COLUMN = 3;\nexport declare const NAMES_INDEX = 4;\nexport declare const REV_GENERATED_LINE = 1;\nexport declare const REV_GENERATED_COLUMN = 2;\nexport {};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/strip-filename.d.ts",
    "content": "/**\n * Removes everything after the last \"/\", but leaves the slash.\n */\nexport default function stripFilename(path: string | undefined | null): string;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/trace-mapping.d.ts",
    "content": "import type { SourceMapSegment } from './sourcemap-segment';\nimport type { SourceMapV3, DecodedSourceMap, EncodedSourceMap, InvalidOriginalMapping, OriginalMapping, InvalidGeneratedMapping, GeneratedMapping, SourceMapInput, Needle, SourceNeedle, SourceMap, EachMapping } from './types';\nexport type { SourceMapSegment } from './sourcemap-segment';\nexport type { SourceMapInput, SectionedSourceMapInput, DecodedSourceMap, EncodedSourceMap, SectionedSourceMap, InvalidOriginalMapping, OriginalMapping as Mapping, OriginalMapping, InvalidGeneratedMapping, GeneratedMapping, EachMapping, } from './types';\nexport declare const LEAST_UPPER_BOUND = -1;\nexport declare const GREATEST_LOWER_BOUND = 1;\n/**\n * Returns the encoded (VLQ string) form of the SourceMap's mappings field.\n */\nexport declare let encodedMappings: (map: TraceMap) => EncodedSourceMap['mappings'];\n/**\n * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.\n */\nexport declare let decodedMappings: (map: TraceMap) => Readonly<DecodedSourceMap['mappings']>;\n/**\n * A low-level API to find the segment associated with a generated line/column (think, from a\n * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.\n */\nexport declare let traceSegment: (map: TraceMap, line: number, column: number) => Readonly<SourceMapSegment> | null;\n/**\n * A higher-level API to find the source/line/column associated with a generated line/column\n * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in\n * `source-map` library.\n */\nexport declare let originalPositionFor: (map: TraceMap, needle: Needle) => OriginalMapping | InvalidOriginalMapping;\n/**\n * Finds the generated line/column position of the provided source/line/column source position.\n */\nexport declare let generatedPositionFor: (map: TraceMap, needle: SourceNeedle) => GeneratedMapping | InvalidGeneratedMapping;\n/**\n * Finds all generated line/column positions of the provided source/line/column source position.\n */\nexport declare let allGeneratedPositionsFor: (map: TraceMap, needle: SourceNeedle) => GeneratedMapping[];\n/**\n * Iterates each mapping in generated position order.\n */\nexport declare let eachMapping: (map: TraceMap, cb: (mapping: EachMapping) => void) => void;\n/**\n * Retrieves the source content for a particular source, if its found. Returns null if not.\n */\nexport declare let sourceContentFor: (map: TraceMap, source: string) => string | null;\n/**\n * A helper that skips sorting of the input map's mappings array, which can be expensive for larger\n * maps.\n */\nexport declare let presortedDecodedMap: (map: DecodedSourceMap, mapUrl?: string) => TraceMap;\n/**\n * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nexport declare let decodedMap: (map: TraceMap) => Omit<DecodedSourceMap, 'mappings'> & {\n    mappings: readonly SourceMapSegment[][];\n};\n/**\n * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects\n * a sourcemap, or to JSON.stringify.\n */\nexport declare let encodedMap: (map: TraceMap) => EncodedSourceMap;\nexport { AnyMap } from './any-map';\nexport declare class TraceMap implements SourceMap {\n    version: SourceMapV3['version'];\n    file: SourceMapV3['file'];\n    names: SourceMapV3['names'];\n    sourceRoot: SourceMapV3['sourceRoot'];\n    sources: SourceMapV3['sources'];\n    sourcesContent: SourceMapV3['sourcesContent'];\n    resolvedSources: string[];\n    private _encoded;\n    private _decoded;\n    private _decodedMemo;\n    private _bySources;\n    private _bySourceMemos;\n    constructor(map: SourceMapInput, mapUrl?: string | null);\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/dist/types/types.d.ts",
    "content": "import type { SourceMapSegment } from './sourcemap-segment';\nimport type { GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap } from './trace-mapping';\nexport interface SourceMapV3 {\n    file?: string | null;\n    names: string[];\n    sourceRoot?: string;\n    sources: (string | null)[];\n    sourcesContent?: (string | null)[];\n    version: 3;\n}\nexport interface EncodedSourceMap extends SourceMapV3 {\n    mappings: string;\n}\nexport interface DecodedSourceMap extends SourceMapV3 {\n    mappings: SourceMapSegment[][];\n}\nexport interface Section {\n    offset: {\n        line: number;\n        column: number;\n    };\n    map: EncodedSourceMap | DecodedSourceMap | SectionedSourceMap;\n}\nexport interface SectionedSourceMap {\n    file?: string | null;\n    sections: Section[];\n    version: 3;\n}\nexport declare type OriginalMapping = {\n    source: string | null;\n    line: number;\n    column: number;\n    name: string | null;\n};\nexport declare type InvalidOriginalMapping = {\n    source: null;\n    line: null;\n    column: null;\n    name: null;\n};\nexport declare type GeneratedMapping = {\n    line: number;\n    column: number;\n};\nexport declare type InvalidGeneratedMapping = {\n    line: null;\n    column: null;\n};\nexport declare type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND;\nexport declare type SourceMapInput = string | Ro<EncodedSourceMap> | Ro<DecodedSourceMap> | TraceMap;\nexport declare type SectionedSourceMapInput = SourceMapInput | Ro<SectionedSourceMap>;\nexport declare type Needle = {\n    line: number;\n    column: number;\n    bias?: Bias;\n};\nexport declare type SourceNeedle = {\n    source: string;\n    line: number;\n    column: number;\n    bias?: Bias;\n};\nexport declare type EachMapping = {\n    generatedLine: number;\n    generatedColumn: number;\n    source: null;\n    originalLine: null;\n    originalColumn: null;\n    name: null;\n} | {\n    generatedLine: number;\n    generatedColumn: number;\n    source: string | null;\n    originalLine: number;\n    originalColumn: number;\n    name: string | null;\n};\nexport declare abstract class SourceMap {\n    version: SourceMapV3['version'];\n    file: SourceMapV3['file'];\n    names: SourceMapV3['names'];\n    sourceRoot: SourceMapV3['sourceRoot'];\n    sources: SourceMapV3['sources'];\n    sourcesContent: SourceMapV3['sourcesContent'];\n    resolvedSources: SourceMapV3['sources'];\n}\nexport declare type Ro<T> = T extends Array<infer V> ? V[] | Readonly<V[]> | RoArray<V> | Readonly<RoArray<V>> : T extends object ? T | Readonly<T> | RoObject<T> | Readonly<RoObject<T>> : T;\ndeclare type RoArray<T> = Ro<T>[];\ndeclare type RoObject<T> = {\n    [K in keyof T]: T[K] | Ro<T[K]>;\n};\nexport {};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/@jridgewell/trace-mapping/package.json",
    "content": "{\n  \"name\": \"@jridgewell/trace-mapping\",\n  \"version\": \"0.3.18\",\n  \"description\": \"Trace the original position through a source map\",\n  \"keywords\": [\n    \"source\",\n    \"map\"\n  ],\n  \"main\": \"dist/trace-mapping.umd.js\",\n  \"module\": \"dist/trace-mapping.mjs\",\n  \"types\": \"dist/types/trace-mapping.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./dist/types/trace-mapping.d.ts\",\n        \"browser\": \"./dist/trace-mapping.umd.js\",\n        \"require\": \"./dist/trace-mapping.umd.js\",\n        \"import\": \"./dist/trace-mapping.mjs\"\n      },\n      \"./dist/trace-mapping.umd.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"author\": \"Justin Ridgewell <justin@ridgewell.name>\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jridgewell/trace-mapping.git\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"benchmark\": \"run-s build:rollup benchmark:*\",\n    \"benchmark:install\": \"cd benchmark && npm install\",\n    \"benchmark:only\": \"node --expose-gc benchmark/index.mjs\",\n    \"build\": \"run-s -n build:*\",\n    \"build:rollup\": \"rollup -c rollup.config.js\",\n    \"build:ts\": \"tsc --project tsconfig.build.json\",\n    \"lint\": \"run-s -n lint:*\",\n    \"lint:prettier\": \"npm run test:lint:prettier -- --write\",\n    \"lint:ts\": \"npm run test:lint:ts -- --fix\",\n    \"prebuild\": \"rm -rf dist\",\n    \"prepublishOnly\": \"npm run preversion\",\n    \"preversion\": \"run-s test build\",\n    \"test\": \"run-s -n test:lint test:only\",\n    \"test:debug\": \"ava debug\",\n    \"test:lint\": \"run-s -n test:lint:*\",\n    \"test:lint:prettier\": \"prettier --check '{src,test}/**/*.ts' '**/*.md'\",\n    \"test:lint:ts\": \"eslint '{src,test}/**/*.ts'\",\n    \"test:only\": \"c8 ava\",\n    \"test:watch\": \"ava --watch\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-typescript\": \"8.5.0\",\n    \"@typescript-eslint/eslint-plugin\": \"5.39.0\",\n    \"@typescript-eslint/parser\": \"5.39.0\",\n    \"ava\": \"4.3.3\",\n    \"benchmark\": \"2.1.4\",\n    \"c8\": \"7.12.0\",\n    \"esbuild\": \"0.15.10\",\n    \"eslint\": \"8.25.0\",\n    \"eslint-config-prettier\": \"8.5.0\",\n    \"eslint-plugin-no-only-tests\": \"3.0.0\",\n    \"npm-run-all\": \"4.1.5\",\n    \"prettier\": \"2.7.1\",\n    \"rollup\": \"2.79.1\",\n    \"tsx\": \"3.10.1\",\n    \"typescript\": \"4.8.4\"\n  },\n  \"dependencies\": {\n    \"@jridgewell/resolve-uri\": \"3.1.0\",\n    \"@jridgewell/sourcemap-codec\": \"1.4.14\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/CHANGELOG.md",
    "content": "## 8.8.2 (2023-01-23)\n\n### Bug fixes\n\nFix a bug that caused `allowHashBang` to be set to false when not provided, even with `ecmaVersion >= 14`.\n\nFix an exception when passing no option object to `parse` or `new Parser`.\n\nFix incorrect parse error on `if (0) let\\n[astral identifier char]`.\n\n## 8.8.1 (2022-10-24)\n\n### Bug fixes\n\nMake type for `Comment` compatible with estree types.\n\n## 8.8.0 (2022-07-21)\n\n### Bug fixes\n\nAllow parentheses around spread args in destructuring object assignment.\n\nFix an issue where the tree contained `directive` properties in when parsing with a language version that doesn't support them.\n\n### New features\n\nSupport hashbang comments by default in ECMAScript 2023 and later.\n\n## 8.7.1 (2021-04-26)\n\n### Bug fixes\n\nStop handling `\"use strict\"` directives in ECMAScript versions before 5.\n\nFix an issue where duplicate quoted export names in `export *` syntax were incorrectly checked.\n\nAdd missing type for `tokTypes`.\n\n## 8.7.0 (2021-12-27)\n\n### New features\n\nSupport quoted export names.\n\nUpgrade to Unicode 14.\n\nAdd support for Unicode 13 properties in regular expressions.\n\n### Bug fixes\n\nUse a loop to find line breaks, because the existing regexp search would overrun the end of the searched range and waste a lot of time in minified code.\n\n## 8.6.0 (2021-11-18)\n\n### Bug fixes\n\nFix a bug where an object literal with multiple `__proto__` properties would incorrectly be accepted if a later property value held an assigment.\n\n### New features\n\nSupport class private fields with the `in` operator.\n\n## 8.5.0 (2021-09-06)\n\n### Bug fixes\n\nImprove context-dependent tokenization in a number of corner cases.\n\nFix location tracking after a 0x2028 or 0x2029 character in a string literal (which before did not increase the line number).\n\nFix an issue where arrow function bodies in for loop context would inappropriately consume `in` operators.\n\nFix wrong end locations stored on SequenceExpression nodes.\n\nImplement restriction that `for`/`of` loop LHS can't start with `let`.\n\n### New features\n\nAdd support for ES2022 class static blocks.\n\nAllow multiple input files to be passed to the CLI tool.\n\n## 8.4.1 (2021-06-24)\n\n### Bug fixes\n\nFix a bug where `allowAwaitOutsideFunction` would allow `await` in class field initializers, and setting `ecmaVersion` to 13 or higher would allow top-level await in non-module sources.\n\n## 8.4.0 (2021-06-11)\n\n### New features\n\nA new option, `allowSuperOutsideMethod`, can be used to suppress the error when `super` is used in the wrong context.\n\n## 8.3.0 (2021-05-31)\n\n### New features\n\nDefault `allowAwaitOutsideFunction` to true for ECMAScript 2022 an higher.\n\nAdd support for the `d` ([indices](https://github.com/tc39/proposal-regexp-match-indices)) regexp flag.\n\n## 8.2.4 (2021-05-04)\n\n### Bug fixes\n\nFix spec conformity in corner case 'for await (async of ...)'.\n\n## 8.2.3 (2021-05-04)\n\n### Bug fixes\n\nFix an issue where the library couldn't parse 'for (async of ...)'.\n\nFix a bug in UTF-16 decoding that would read characters incorrectly in some circumstances.\n\n## 8.2.2 (2021-04-29)\n\n### Bug fixes\n\nFix a bug where a class field initialized to an async arrow function wouldn't allow await inside it. Same issue existed for generator arrow functions with yield.\n\n## 8.2.1 (2021-04-24)\n\n### Bug fixes\n\nFix a regression introduced in 8.2.0 where static or async class methods with keyword names fail to parse.\n\n## 8.2.0 (2021-04-24)\n\n### New features\n\nAdd support for ES2022 class fields and private methods.\n\n## 8.1.1 (2021-04-12)\n\n### Various\n\nStop shipping source maps in the NPM package.\n\n## 8.1.0 (2021-03-09)\n\n### Bug fixes\n\nFix a spurious error in nested destructuring arrays.\n\n### New features\n\nExpose `allowAwaitOutsideFunction` in CLI interface.\n\nMake `allowImportExportAnywhere` also apply to `import.meta`.\n\n## 8.0.5 (2021-01-25)\n\n### Bug fixes\n\nAdjust package.json to work with Node 12.16.0 and 13.0-13.6.\n\n## 8.0.4 (2020-10-05)\n\n### Bug fixes\n\nMake `await x ** y` an error, following the spec.\n\nFix potentially exponential regular expression.\n\n## 8.0.3 (2020-10-02)\n\n### Bug fixes\n\nFix a wasteful loop during `Parser` creation when setting `ecmaVersion` to `\"latest\"`.\n\n## 8.0.2 (2020-09-30)\n\n### Bug fixes\n\nMake the TypeScript types reflect the current allowed values for `ecmaVersion`.\n\nFix another regexp/division tokenizer issue.\n\n## 8.0.1 (2020-08-12)\n\n### Bug fixes\n\nProvide the correct value in the `version` export.\n\n## 8.0.0 (2020-08-12)\n\n### Bug fixes\n\nDisallow expressions like `(a = b) = c`.\n\nMake non-octal escape sequences a syntax error in strict mode.\n\n### New features\n\nThe package can now be loaded directly as an ECMAScript module in node 13+.\n\nUpdate to the set of Unicode properties from ES2021.\n\n### Breaking changes\n\nThe `ecmaVersion` option is now required. For the moment, omitting it will still work with a warning, but that will change in a future release.\n\nSome changes to method signatures that may be used by plugins.\n\n## 7.4.0 (2020-08-03)\n\n### New features\n\nAdd support for logical assignment operators.\n\nAdd support for numeric separators.\n\n## 7.3.1 (2020-06-11)\n\n### Bug fixes\n\nMake the string in the `version` export match the actual library version.\n\n## 7.3.0 (2020-06-11)\n\n### Bug fixes\n\nFix a bug that caused parsing of object patterns with a property named `set` that had a default value to fail.\n\n### New features\n\nAdd support for optional chaining (`?.`).\n\n## 7.2.0 (2020-05-09)\n\n### Bug fixes\n\nFix precedence issue in parsing of async arrow functions.\n\n### New features\n\nAdd support for nullish coalescing.\n\nAdd support for `import.meta`.\n\nSupport `export * as ...` syntax.\n\nUpgrade to Unicode 13.\n\n## 6.4.1 (2020-03-09)\n\n### Bug fixes\n\nMore carefully check for valid UTF16 surrogate pairs in regexp validator.\n\n## 7.1.1 (2020-03-01)\n\n### Bug fixes\n\nTreat `\\8` and `\\9` as invalid escapes in template strings.\n\nAllow unicode escapes in property names that are keywords.\n\nDon't error on an exponential operator expression as argument to `await`.\n\nMore carefully check for valid UTF16 surrogate pairs in regexp validator.\n\n## 7.1.0 (2019-09-24)\n\n### Bug fixes\n\nDisallow trailing object literal commas when ecmaVersion is less than 5.\n\n### New features\n\nAdd a static `acorn` property to the `Parser` class that contains the entire module interface, to allow plugins to access the instance of the library that they are acting on.\n\n## 7.0.0 (2019-08-13)\n\n### Breaking changes\n\nChanges the node format for dynamic imports to use the `ImportExpression` node type, as defined in [ESTree](https://github.com/estree/estree/blob/master/es2020.md#importexpression).\n\nMakes 10 (ES2019) the default value for the `ecmaVersion` option.\n\n## 6.3.0 (2019-08-12)\n\n### New features\n\n`sourceType: \"module\"` can now be used even when `ecmaVersion` is less than 6, to parse module-style code that otherwise conforms to an older standard.\n\n## 6.2.1 (2019-07-21)\n\n### Bug fixes\n\nFix bug causing Acorn to treat some characters as identifier characters that shouldn't be treated as such.\n\nFix issue where setting the `allowReserved` option to `\"never\"` allowed reserved words in some circumstances.\n\n## 6.2.0 (2019-07-04)\n\n### Bug fixes\n\nImprove valid assignment checking in `for`/`in` and `for`/`of` loops.\n\nDisallow binding `let` in patterns.\n\n### New features\n\nSupport bigint syntax with `ecmaVersion` >= 11.\n\nSupport dynamic `import` syntax with `ecmaVersion` >= 11.\n\nUpgrade to Unicode version 12.\n\n## 6.1.1 (2019-02-27)\n\n### Bug fixes\n\nFix bug that caused parsing default exports of with names to fail.\n\n## 6.1.0 (2019-02-08)\n\n### Bug fixes\n\nFix scope checking when redefining a `var` as a lexical binding.\n\n### New features\n\nSplit up `parseSubscripts` to use an internal `parseSubscript` method to make it easier to extend with plugins.\n\n## 6.0.7 (2019-02-04)\n\n### Bug fixes\n\nCheck that exported bindings are defined.\n\nDon't treat `\\u180e` as a whitespace character.\n\nCheck for duplicate parameter names in methods.\n\nDon't allow shorthand properties when they are generators or async methods.\n\nForbid binding `await` in async arrow function's parameter list.\n\n## 6.0.6 (2019-01-30)\n\n### Bug fixes\n\nThe content of class declarations and expressions is now always parsed in strict mode.\n\nDon't allow `let` or `const` to bind the variable name `let`.\n\nTreat class declarations as lexical.\n\nDon't allow a generator function declaration as the sole body of an `if` or `else`.\n\nIgnore `\"use strict\"` when after an empty statement.\n\nAllow string line continuations with special line terminator characters.\n\nTreat `for` bodies as part of the `for` scope when checking for conflicting bindings.\n\nFix bug with parsing `yield` in a `for` loop initializer.\n\nImplement special cases around scope checking for functions.\n\n## 6.0.5 (2019-01-02)\n\n### Bug fixes\n\nFix TypeScript type for `Parser.extend` and add `allowAwaitOutsideFunction` to options type.\n\nDon't treat `let` as a keyword when the next token is `{` on the next line.\n\nFix bug that broke checking for parentheses around an object pattern in a destructuring assignment when `preserveParens` was on.\n\n## 6.0.4 (2018-11-05)\n\n### Bug fixes\n\nFurther improvements to tokenizing regular expressions in corner cases.\n\n## 6.0.3 (2018-11-04)\n\n### Bug fixes\n\nFix bug in tokenizing an expression-less return followed by a function followed by a regular expression.\n\nRemove stray symlink in the package tarball.\n\n## 6.0.2 (2018-09-26)\n\n### Bug fixes\n\nFix bug where default expressions could fail to parse inside an object destructuring assignment expression.\n\n## 6.0.1 (2018-09-14)\n\n### Bug fixes\n\nFix wrong value in `version` export.\n\n## 6.0.0 (2018-09-14)\n\n### Bug fixes\n\nBetter handle variable-redefinition checks for catch bindings and functions directly under if statements.\n\nForbid `new.target` in top-level arrow functions.\n\nFix issue with parsing a regexp after `yield` in some contexts.\n\n### New features\n\nThe package now comes with TypeScript definitions.\n\n### Breaking changes\n\nThe default value of the `ecmaVersion` option is now 9 (2018).\n\nPlugins work differently, and will have to be rewritten to work with this version.\n\nThe loose parser and walker have been moved into separate packages (`acorn-loose` and `acorn-walk`).\n\n## 5.7.3 (2018-09-10)\n\n### Bug fixes\n\nFix failure to tokenize regexps after expressions like `x.of`.\n\nBetter error message for unterminated template literals.\n\n## 5.7.2 (2018-08-24)\n\n### Bug fixes\n\nProperly handle `allowAwaitOutsideFunction` in for statements.\n\nTreat function declarations at the top level of modules like let bindings.\n\nDon't allow async function declarations as the only statement under a label.\n\n## 5.7.0 (2018-06-15)\n\n### New features\n\nUpgraded to Unicode 11.\n\n## 5.6.0 (2018-05-31)\n\n### New features\n\nAllow U+2028 and U+2029 in string when ECMAVersion >= 10.\n\nAllow binding-less catch statements when ECMAVersion >= 10.\n\nAdd `allowAwaitOutsideFunction` option for parsing top-level `await`.\n\n## 5.5.3 (2018-03-08)\n\n### Bug fixes\n\nA _second_ republish of the code in 5.5.1, this time with yarn, to hopefully get valid timestamps.\n\n## 5.5.2 (2018-03-08)\n\n### Bug fixes\n\nA republish of the code in 5.5.1 in an attempt to solve an issue with the file timestamps in the npm package being 0.\n\n## 5.5.1 (2018-03-06)\n\n### Bug fixes\n\nFix misleading error message for octal escapes in template strings.\n\n## 5.5.0 (2018-02-27)\n\n### New features\n\nThe identifier character categorization is now based on Unicode version 10.\n\nAcorn will now validate the content of regular expressions, including new ES9 features.\n\n## 5.4.0 (2018-02-01)\n\n### Bug fixes\n\nDisallow duplicate or escaped flags on regular expressions.\n\nDisallow octal escapes in strings in strict mode.\n\n### New features\n\nAdd support for async iteration.\n\nAdd support for object spread and rest.\n\n## 5.3.0 (2017-12-28)\n\n### Bug fixes\n\nFix parsing of floating point literals with leading zeroes in loose mode.\n\nAllow duplicate property names in object patterns.\n\nDon't allow static class methods named `prototype`.\n\nDisallow async functions directly under `if` or `else`.\n\nParse right-hand-side of `for`/`of` as an assignment expression.\n\nStricter parsing of `for`/`in`.\n\nDon't allow unicode escapes in contextual keywords.\n\n### New features\n\nParsing class members was factored into smaller methods to allow plugins to hook into it.\n\n## 5.2.1 (2017-10-30)\n\n### Bug fixes\n\nFix a token context corruption bug.\n\n## 5.2.0 (2017-10-30)\n\n### Bug fixes\n\nFix token context tracking for `class` and `function` in property-name position.\n\nMake sure `%*` isn't parsed as a valid operator.\n\nAllow shorthand properties `get` and `set` to be followed by default values.\n\nDisallow `super` when not in callee or object position.\n\n### New features\n\nSupport [`directive` property](https://github.com/estree/estree/compare/b3de58c9997504d6fba04b72f76e6dd1619ee4eb...1da8e603237144f44710360f8feb7a9977e905e0) on directive expression statements.\n\n## 5.1.2 (2017-09-04)\n\n### Bug fixes\n\nDisable parsing of legacy HTML-style comments in modules.\n\nFix parsing of async methods whose names are keywords.\n\n## 5.1.1 (2017-07-06)\n\n### Bug fixes\n\nFix problem with disambiguating regexp and division after a class.\n\n## 5.1.0 (2017-07-05)\n\n### Bug fixes\n\nFix tokenizing of regexps in an object-desctructuring `for`/`of` loop and after `yield`.\n\nParse zero-prefixed numbers with non-octal digits as decimal.\n\nAllow object/array patterns in rest parameters.\n\nDon't error when `yield` is used as a property name.\n\nAllow `async` as a shorthand object property.\n\n### New features\n\nImplement the [template literal revision proposal](https://github.com/tc39/proposal-template-literal-revision) for ES9.\n\n## 5.0.3 (2017-04-01)\n\n### Bug fixes\n\nFix spurious duplicate variable definition errors for named functions.\n\n## 5.0.2 (2017-03-30)\n\n### Bug fixes\n\nA binary operator after a parenthesized arrow expression is no longer incorrectly treated as an error.\n\n## 5.0.0 (2017-03-28)\n\n### Bug fixes\n\nRaise an error for duplicated lexical bindings.\n\nFix spurious error when an assignement expression occurred after a spread expression.\n\nAccept regular expressions after `of` (in `for`/`of`), `yield` (in a generator), and braced arrow functions.\n\nAllow labels in front or `var` declarations, even in strict mode.\n\n### Breaking changes\n\nParse declarations following `export default` as declaration nodes, not expressions. This means that class and function declarations nodes can now have `null` as their `id`.\n\n## 4.0.11 (2017-02-07)\n\n### Bug fixes\n\nAllow all forms of member expressions to be parenthesized as lvalue.\n\n## 4.0.10 (2017-02-07)\n\n### Bug fixes\n\nDon't expect semicolons after default-exported functions or classes, even when they are expressions.\n\nCheck for use of `'use strict'` directives in non-simple parameter functions, even when already in strict mode.\n\n## 4.0.9 (2017-02-06)\n\n### Bug fixes\n\nFix incorrect error raised for parenthesized simple assignment targets, so that `(x) = 1` parses again.\n\n## 4.0.8 (2017-02-03)\n\n### Bug fixes\n\nSolve spurious parenthesized pattern errors by temporarily erring on the side of accepting programs that our delayed errors don't handle correctly yet.\n\n## 4.0.7 (2017-02-02)\n\n### Bug fixes\n\nAccept invalidly rejected code like `(x).y = 2` again.\n\nDon't raise an error when a function _inside_ strict code has a non-simple parameter list.\n\n## 4.0.6 (2017-02-02)\n\n### Bug fixes\n\nFix exponential behavior (manifesting itself as a complete hang for even relatively small source files) introduced by the new 'use strict' check.\n\n## 4.0.5 (2017-02-02)\n\n### Bug fixes\n\nDisallow parenthesized pattern expressions.\n\nAllow keywords as export names.\n\nDon't allow the `async` keyword to be parenthesized.\n\nProperly raise an error when a keyword contains a character escape.\n\nAllow `\"use strict\"` to appear after other string literal expressions.\n\nDisallow labeled declarations.\n\n## 4.0.4 (2016-12-19)\n\n### Bug fixes\n\nFix crash when `export` was followed by a keyword that can't be\nexported.\n\n## 4.0.3 (2016-08-16)\n\n### Bug fixes\n\nAllow regular function declarations inside single-statement `if` branches in loose mode. Forbid them entirely in strict mode.\n\nProperly parse properties named `async` in ES2017 mode.\n\nFix bug where reserved words were broken in ES2017 mode.\n\n## 4.0.2 (2016-08-11)\n\n### Bug fixes\n\nDon't ignore period or 'e' characters after octal numbers.\n\nFix broken parsing for call expressions in default parameter values of arrow functions.\n\n## 4.0.1 (2016-08-08)\n\n### Bug fixes\n\nFix false positives in duplicated export name errors.\n\n## 4.0.0 (2016-08-07)\n\n### Breaking changes\n\nThe default `ecmaVersion` option value is now 7.\n\nA number of internal method signatures changed, so plugins might need to be updated.\n\n### Bug fixes\n\nThe parser now raises errors on duplicated export names.\n\n`arguments` and `eval` can now be used in shorthand properties.\n\nDuplicate parameter names in non-simple argument lists now always produce an error.\n\n### New features\n\nThe `ecmaVersion` option now also accepts year-style version numbers\n(2015, etc).\n\nSupport for `async`/`await` syntax when `ecmaVersion` is >= 8.\n\nSupport for trailing commas in call expressions when `ecmaVersion` is >= 8.\n\n## 3.3.0 (2016-07-25)\n\n### Bug fixes\n\nFix bug in tokenizing of regexp operator after a function declaration.\n\nFix parser crash when parsing an array pattern with a hole.\n\n### New features\n\nImplement check against complex argument lists in functions that enable strict mode in ES7.\n\n## 3.2.0 (2016-06-07)\n\n### Bug fixes\n\nImprove handling of lack of unicode regexp support in host\nenvironment.\n\nProperly reject shorthand properties whose name is a keyword.\n\n### New features\n\nVisitors created with `visit.make` now have their base as _prototype_, rather than copying properties into a fresh object.\n\n## 3.1.0 (2016-04-18)\n\n### Bug fixes\n\nProperly tokenize the division operator directly after a function expression.\n\nAllow trailing comma in destructuring arrays.\n\n## 3.0.4 (2016-02-25)\n\n### Fixes\n\nAllow update expressions as left-hand-side of the ES7 exponential operator.\n\n## 3.0.2 (2016-02-10)\n\n### Fixes\n\nFix bug that accidentally made `undefined` a reserved word when parsing ES7.\n\n## 3.0.0 (2016-02-10)\n\n### Breaking changes\n\nThe default value of the `ecmaVersion` option is now 6 (used to be 5).\n\nSupport for comprehension syntax (which was dropped from the draft spec) has been removed.\n\n### Fixes\n\n`let` and `yield` are now “contextual keywords”, meaning you can mostly use them as identifiers in ES5 non-strict code.\n\nA parenthesized class or function expression after `export default` is now parsed correctly.\n\n### New features\n\nWhen `ecmaVersion` is set to 7, Acorn will parse the exponentiation operator (`**`).\n\nThe identifier character ranges are now based on Unicode 8.0.0.\n\nPlugins can now override the `raiseRecoverable` method to override the way non-critical errors are handled.\n\n## 2.7.0 (2016-01-04)\n\n### Fixes\n\nStop allowing rest parameters in setters.\n\nDisallow `y` rexexp flag in ES5.\n\nDisallow `\\00` and `\\000` escapes in strict mode.\n\nRaise an error when an import name is a reserved word.\n\n## 2.6.2 (2015-11-10)\n\n### Fixes\n\nDon't crash when no options object is passed.\n\n## 2.6.0 (2015-11-09)\n\n### Fixes\n\nAdd `await` as a reserved word in module sources.\n\nDisallow `yield` in a parameter default value for a generator.\n\nForbid using a comma after a rest pattern in an array destructuring.\n\n### New features\n\nSupport parsing stdin in command-line tool.\n\n## 2.5.0 (2015-10-27)\n\n### Fixes\n\nFix tokenizer support in the command-line tool.\n\nStop allowing `new.target` outside of functions.\n\nRemove legacy `guard` and `guardedHandler` properties from try nodes.\n\nStop allowing multiple `__proto__` properties on an object literal in strict mode.\n\nDon't allow rest parameters to be non-identifier patterns.\n\nCheck for duplicate paramter names in arrow functions.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/LICENSE",
    "content": "MIT License\n\nCopyright (C) 2012-2022 by various contributors (see AUTHORS)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/README.md",
    "content": "# Acorn\n\nA tiny, fast JavaScript parser written in JavaScript.\n\n## Community\n\nAcorn is open source software released under an\n[MIT license](https://github.com/acornjs/acorn/blob/master/acorn/LICENSE).\n\nYou are welcome to\n[report bugs](https://github.com/acornjs/acorn/issues) or create pull\nrequests on [github](https://github.com/acornjs/acorn). For questions\nand discussion, please use the\n[Tern discussion forum](https://discuss.ternjs.net).\n\n## Installation\n\nThe easiest way to install acorn is from [`npm`](https://www.npmjs.com/):\n\n```sh\nnpm install acorn\n```\n\nAlternately, you can download the source and build acorn yourself:\n\n```sh\ngit clone https://github.com/acornjs/acorn.git\ncd acorn\nnpm install\n```\n\n## Interface\n\n**parse**`(input, options)` is the main interface to the library. The\n`input` parameter is a string, `options` must be an object setting\nsome of the options listed below. The return value will be an abstract\nsyntax tree object as specified by the [ESTree\nspec](https://github.com/estree/estree).\n\n```javascript\nlet acorn = require(\"acorn\");\nconsole.log(acorn.parse(\"1 + 1\", {ecmaVersion: 2020}));\n```\n\nWhen encountering a syntax error, the parser will raise a\n`SyntaxError` object with a meaningful message. The error object will\nhave a `pos` property that indicates the string offset at which the\nerror occurred, and a `loc` object that contains a `{line, column}`\nobject referring to that same position.\n\nOptions are provided by in a second argument, which should be an\nobject containing any of these fields (only `ecmaVersion` is\nrequired):\n\n- **ecmaVersion**: Indicates the ECMAScript version to parse. Must be\n  either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 (2019),\n  11 (2020), 12 (2021), 13 (2022), 14 (2023), or `\"latest\"` (the\n  latest the library supports). This influences support for strict\n  mode, the set of reserved words, and support for new syntax\n  features.\n\n  **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being\n  implemented by Acorn. Other proposed new features must be\n  implemented through plugins.\n\n- **sourceType**: Indicate the mode the code should be parsed in. Can be\n  either `\"script\"` or `\"module\"`. This influences global strict mode\n  and parsing of `import` and `export` declarations.\n\n  **NOTE**: If set to `\"module\"`, then static `import` / `export` syntax\n  will be valid, even if `ecmaVersion` is less than 6.\n\n- **onInsertedSemicolon**: If given a callback, that callback will be\n  called whenever a missing semicolon is inserted by the parser. The\n  callback will be given the character offset of the point where the\n  semicolon is inserted as argument, and if `locations` is on, also a\n  `{line, column}` object representing this position.\n\n- **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing\n  commas.\n\n- **allowReserved**: If `false`, using a reserved word will generate\n  an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher\n  versions. When given the value `\"never\"`, reserved words and\n  keywords can also not be used as property names (as in Internet\n  Explorer's old parser).\n\n- **allowReturnOutsideFunction**: By default, a return statement at\n  the top level raises an error. Set this to `true` to accept such\n  code.\n\n- **allowImportExportEverywhere**: By default, `import` and `export`\n  declarations can only appear at a program's top level. Setting this\n  option to `true` allows them anywhere where a statement is allowed,\n  and also allows `import.meta` expressions to appear in scripts\n  (when `sourceType` is not `\"module\"`).\n\n- **allowAwaitOutsideFunction**: If `false`, `await` expressions can\n  only appear inside `async` functions. Defaults to `true` for\n  `ecmaVersion` 2022 and later, `false` for lower versions. Setting this option to\n  `true` allows to have top-level `await` expressions. They are\n  still not allowed in non-`async` functions, though.\n\n- **allowSuperOutsideMethod**: By default, `super` outside a method\n  raises an error. Set this to `true` to accept such code.\n\n- **allowHashBang**: When this is enabled, if the code starts with the\n  characters `#!` (as in a shellscript), the first line will be\n  treated as a comment. Defaults to true when `ecmaVersion` >= 2023.\n\n- **locations**: When `true`, each node has a `loc` object attached\n  with `start` and `end` subobjects, each of which contains the\n  one-based line and zero-based column numbers in `{line, column}`\n  form. Default is `false`.\n\n- **onToken**: If a function is passed for this option, each found\n  token will be passed in same format as tokens returned from\n  `tokenizer().getToken()`.\n\n  If array is passed, each found token is pushed to it.\n\n  Note that you are not allowed to call the parser from the\n  callback—that will corrupt its internal state.\n\n- **onComment**: If a function is passed for this option, whenever a\n  comment is encountered the function will be called with the\n  following parameters:\n\n  - `block`: `true` if the comment is a block comment, false if it\n    is a line comment.\n  - `text`: The content of the comment.\n  - `start`: Character offset of the start of the comment.\n  - `end`: Character offset of the end of the comment.\n\n  When the `locations` options is on, the `{line, column}` locations\n  of the comment’s start and end are passed as two additional\n  parameters.\n\n  If array is passed for this option, each found comment is pushed\n  to it as object in Esprima format:\n\n  ```javascript\n  {\n    \"type\": \"Line\" | \"Block\",\n    \"value\": \"comment text\",\n    \"start\": Number,\n    \"end\": Number,\n    // If `locations` option is on:\n    \"loc\": {\n      \"start\": {line: Number, column: Number}\n      \"end\": {line: Number, column: Number}\n    },\n    // If `ranges` option is on:\n    \"range\": [Number, Number]\n  }\n  ```\n\n  Note that you are not allowed to call the parser from the\n  callback—that will corrupt its internal state.\n\n- **ranges**: Nodes have their start and end characters offsets\n  recorded in `start` and `end` properties (directly on the node,\n  rather than the `loc` object, which holds line/column data. To also\n  add a\n  [semi-standardized](https://bugzilla.mozilla.org/show_bug.cgi?id=745678)\n  `range` property holding a `[start, end]` array with the same\n  numbers, set the `ranges` option to `true`.\n\n- **program**: It is possible to parse multiple files into a single\n  AST by passing the tree produced by parsing the first file as the\n  `program` option in subsequent parses. This will add the toplevel\n  forms of the parsed file to the \"Program\" (top) node of an existing\n  parse tree.\n\n- **sourceFile**: When the `locations` option is `true`, you can pass\n  this option to add a `source` attribute in every node’s `loc`\n  object. Note that the contents of this option are not examined or\n  processed in any way; you are free to use whatever format you\n  choose.\n\n- **directSourceFile**: Like `sourceFile`, but a `sourceFile` property\n  will be added (regardless of the `location` option) directly to the\n  nodes, rather than the `loc` object.\n\n- **preserveParens**: If this option is `true`, parenthesized expressions\n  are represented by (non-standard) `ParenthesizedExpression` nodes\n  that have a single `expression` property containing the expression\n  inside parentheses.\n\n**parseExpressionAt**`(input, offset, options)` will parse a single\nexpression in a string, and return its AST. It will not complain if\nthere is more of the string left after the expression.\n\n**tokenizer**`(input, options)` returns an object with a `getToken`\nmethod that can be called repeatedly to get the next token, a `{start,\nend, type, value}` object (with added `loc` property when the\n`locations` option is enabled and `range` property when the `ranges`\noption is enabled). When the token's type is `tokTypes.eof`, you\nshould stop calling the method, since it will keep returning that same\ntoken forever.\n\nIn ES6 environment, returned result can be used as any other\nprotocol-compliant iterable:\n\n```javascript\nfor (let token of acorn.tokenizer(str)) {\n  // iterate over the tokens\n}\n\n// transform code to array of tokens:\nvar tokens = [...acorn.tokenizer(str)];\n```\n\n**tokTypes** holds an object mapping names to the token type objects\nthat end up in the `type` properties of tokens.\n\n**getLineInfo**`(input, offset)` can be used to get a `{line,\ncolumn}` object for a given program string and offset.\n\n### The `Parser` class\n\nInstances of the **`Parser`** class contain all the state and logic\nthat drives a parse. It has static methods `parse`,\n`parseExpressionAt`, and `tokenizer` that match the top-level\nfunctions by the same name.\n\nWhen extending the parser with plugins, you need to call these methods\non the extended version of the class. To extend a parser with plugins,\nyou can use its static `extend` method.\n\n```javascript\nvar acorn = require(\"acorn\");\nvar jsx = require(\"acorn-jsx\");\nvar JSXParser = acorn.Parser.extend(jsx());\nJSXParser.parse(\"foo(<bar/>)\", {ecmaVersion: 2020});\n```\n\nThe `extend` method takes any number of plugin values, and returns a\nnew `Parser` class that includes the extra parser logic provided by\nthe plugins.\n\n## Command line interface\n\nThe `bin/acorn` utility can be used to parse a file from the command\nline. It accepts as arguments its input file and the following\noptions:\n\n- `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version\n  to parse. Default is version 9.\n\n- `--module`: Sets the parsing mode to `\"module\"`. Is set to `\"script\"` otherwise.\n\n- `--locations`: Attaches a \"loc\" object to each node with \"start\" and\n  \"end\" subobjects, each of which contains the one-based line and\n  zero-based column numbers in `{line, column}` form.\n\n- `--allow-hash-bang`: If the code starts with the characters #! (as\n  in a shellscript), the first line will be treated as a comment.\n\n- `--allow-await-outside-function`: Allows top-level `await` expressions.\n  See the `allowAwaitOutsideFunction` option for more information.\n\n- `--compact`: No whitespace is used in the AST output.\n\n- `--silent`: Do not output the AST, just return the exit status.\n\n- `--help`: Print the usage information and quit.\n\nThe utility spits out the syntax tree as JSON data.\n\n## Existing plugins\n\n - [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx)\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/bin/acorn",
    "content": "#!/usr/bin/env node\n\"use strict\"\n\nrequire(\"../dist/bin.js\")\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/dist/acorn.d.ts",
    "content": "export as namespace acorn\nexport = acorn\n\ndeclare namespace acorn {\n  function parse(input: string, options: Options): Node\n\n  function parseExpressionAt(input: string, pos: number, options: Options): Node\n\n  function tokenizer(input: string, options: Options): {\n    getToken(): Token\n    [Symbol.iterator](): Iterator<Token>\n  }\n\n  type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 'latest'\n\n  interface Options {\n    ecmaVersion: ecmaVersion\n    sourceType?: 'script' | 'module'\n    onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void\n    onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void\n    allowReserved?: boolean | 'never'\n    allowReturnOutsideFunction?: boolean\n    allowImportExportEverywhere?: boolean\n    allowAwaitOutsideFunction?: boolean\n    allowSuperOutsideMethod?: boolean\n    allowHashBang?: boolean\n    locations?: boolean\n    onToken?: ((token: Token) => any) | Token[]\n    onComment?: ((\n      isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,\n      endLoc?: Position\n    ) => void) | Comment[]\n    ranges?: boolean\n    program?: Node\n    sourceFile?: string\n    directSourceFile?: string\n    preserveParens?: boolean\n  }\n\n  class Parser {\n    // state.js\n    lineStart: number;\n    options: Options;\n    curLine: number;\n    start: number;\n    end: number;\n    input: string;\n    type: TokenType;\n\n    // state.js\n    constructor(options: Options, input: string, startPos?: number)\n    parse(this: Parser): Node\n\n    // tokenize.js\n    next(): void;\n    nextToken(): void;\n\n    // statement.js\n    parseTopLevel(node: Node): Node;\n\n    // node.js\n    finishNode(node: Node, type: string): Node;\n    finishNodeAt(node: Node, type: string, pos: number, loc: Position): Node;\n\n    // location.js\n    raise(pos: number, message: string) : void;\n    raiseRecoverable?(pos: number, message: string) : void;\n\n    // parseutils.js\n    unexpected(pos: number) : void;\n\n    // index.js\n    static acorn: typeof acorn;\n\n    // state.js\n    static parse(this: typeof Parser, input: string, options: Options): Node\n    static parseExpressionAt(this: typeof Parser, input: string, pos: number, options: Options): Node\n    static tokenizer(this: typeof Parser, input: string, options: Options): {\n      getToken(): Token\n      [Symbol.iterator](): Iterator<Token>\n    }\n    static extend(this: typeof Parser, ...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser\n  }\n\n  interface Position { line: number; column: number; offset: number }\n\n  const defaultOptions: Options\n\n  function getLineInfo(input: string, offset: number): Position\n\n  class SourceLocation {\n    start: Position\n    end: Position\n    source?: string | null\n    constructor(p: Parser, start: Position, end: Position)\n  }\n\n  class Node {\n    type: string\n    start: number\n    end: number\n    loc?: SourceLocation\n    sourceFile?: string\n    range?: [number, number]\n    constructor(parser: Parser, pos: number, loc?: SourceLocation)\n  }\n\n  class TokenType {\n    label: string\n    keyword: string\n    beforeExpr: boolean\n    startsExpr: boolean\n    isLoop: boolean\n    isAssign: boolean\n    prefix: boolean\n    postfix: boolean\n    binop: number\n    updateContext?: (prevType: TokenType) => void\n    constructor(label: string, conf?: any)\n  }\n\n  const tokTypes: {\n    num: TokenType\n    regexp: TokenType\n    string: TokenType\n    name: TokenType\n    privateId: TokenType\n    eof: TokenType\n    bracketL: TokenType\n    bracketR: TokenType\n    braceL: TokenType\n    braceR: TokenType\n    parenL: TokenType\n    parenR: TokenType\n    comma: TokenType\n    semi: TokenType\n    colon: TokenType\n    dot: TokenType\n    question: TokenType\n    questionDot: TokenType\n    arrow: TokenType\n    template: TokenType\n    invalidTemplate: TokenType\n    ellipsis: TokenType\n    backQuote: TokenType\n    dollarBraceL: TokenType\n    eq: TokenType\n    assign: TokenType\n    incDec: TokenType\n    prefix: TokenType\n    logicalOR: TokenType\n    logicalAND: TokenType\n    bitwiseOR: TokenType\n    bitwiseXOR: TokenType\n    bitwiseAND: TokenType\n    equality: TokenType\n    relational: TokenType\n    bitShift: TokenType\n    plusMin: TokenType\n    modulo: TokenType\n    star: TokenType\n    slash: TokenType\n    starstar: TokenType\n    coalesce: TokenType\n    _break: TokenType\n    _case: TokenType\n    _catch: TokenType\n    _continue: TokenType\n    _debugger: TokenType\n    _default: TokenType\n    _do: TokenType\n    _else: TokenType\n    _finally: TokenType\n    _for: TokenType\n    _function: TokenType\n    _if: TokenType\n    _return: TokenType\n    _switch: TokenType\n    _throw: TokenType\n    _try: TokenType\n    _var: TokenType\n    _const: TokenType\n    _while: TokenType\n    _with: TokenType\n    _new: TokenType\n    _this: TokenType\n    _super: TokenType\n    _class: TokenType\n    _extends: TokenType\n    _export: TokenType\n    _import: TokenType\n    _null: TokenType\n    _true: TokenType\n    _false: TokenType\n    _in: TokenType\n    _instanceof: TokenType\n    _typeof: TokenType\n    _void: TokenType\n    _delete: TokenType\n  }\n\n  class TokContext {\n    constructor(token: string, isExpr: boolean, preserveSpace: boolean, override?: (p: Parser) => void)\n  }\n\n  const tokContexts: {\n    b_stat: TokContext\n    b_expr: TokContext\n    b_tmpl: TokContext\n    p_stat: TokContext\n    p_expr: TokContext\n    q_tmpl: TokContext\n    f_expr: TokContext\n    f_stat: TokContext\n    f_expr_gen: TokContext\n    f_gen: TokContext\n  }\n\n  function isIdentifierStart(code: number, astral?: boolean): boolean\n\n  function isIdentifierChar(code: number, astral?: boolean): boolean\n\n  interface AbstractToken {\n  }\n\n  interface Comment extends AbstractToken {\n    type: 'Line' | 'Block'\n    value: string\n    start: number\n    end: number\n    loc?: SourceLocation\n    range?: [number, number]\n  }\n\n  class Token {\n    type: TokenType\n    value: any\n    start: number\n    end: number\n    loc?: SourceLocation\n    range?: [number, number]\n    constructor(p: Parser)\n  }\n\n  function isNewLine(code: number): boolean\n\n  const lineBreak: RegExp\n\n  const lineBreakG: RegExp\n\n  const version: string\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/dist/acorn.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.acorn = {}));\n})(this, (function (exports) { 'use strict';\n\n  // This file was generated. Do not modify manually!\n  var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];\n\n  // This file was generated. Do not modify manually!\n  var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];\n\n  // This file was generated. Do not modify manually!\n  var nonASCIIidentifierChars = \"\\u200c\\u200d\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0898-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1ace\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n\n  // This file was generated. Do not modify manually!\n  var nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088e\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c88\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7ca\\ua7d0\\ua7d1\\ua7d3\\ua7d5-\\ua7d9\\ua7f2-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n\n  // These are a run-length and offset encoded representation of the\n\n  // Reserved word lists for various dialects of the language\n\n  var reservedWords = {\n    3: \"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\",\n    5: \"class enum extends super const export import\",\n    6: \"enum\",\n    strict: \"implements interface let package private protected public static yield\",\n    strictBind: \"eval arguments\"\n  };\n\n  // And the keywords\n\n  var ecma5AndLessKeywords = \"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\";\n\n  var keywords$1 = {\n    5: ecma5AndLessKeywords,\n    \"5module\": ecma5AndLessKeywords + \" export import\",\n    6: ecma5AndLessKeywords + \" const class extends export import super\"\n  };\n\n  var keywordRelationalOperator = /^in(stanceof)?$/;\n\n  // ## Character categories\n\n  var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n  var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\n  // This has a complexity linear to the value of the code. The\n  // assumption is that looking up astral identifier characters is\n  // rare.\n  function isInAstralSet(code, set) {\n    var pos = 0x10000;\n    for (var i = 0; i < set.length; i += 2) {\n      pos += set[i];\n      if (pos > code) { return false }\n      pos += set[i + 1];\n      if (pos >= code) { return true }\n    }\n    return false\n  }\n\n  // Test whether a given character code starts an identifier.\n\n  function isIdentifierStart(code, astral) {\n    if (code < 65) { return code === 36 }\n    if (code < 91) { return true }\n    if (code < 97) { return code === 95 }\n    if (code < 123) { return true }\n    if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }\n    if (astral === false) { return false }\n    return isInAstralSet(code, astralIdentifierStartCodes)\n  }\n\n  // Test whether a given character is part of an identifier.\n\n  function isIdentifierChar(code, astral) {\n    if (code < 48) { return code === 36 }\n    if (code < 58) { return true }\n    if (code < 65) { return false }\n    if (code < 91) { return true }\n    if (code < 97) { return code === 95 }\n    if (code < 123) { return true }\n    if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }\n    if (astral === false) { return false }\n    return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)\n  }\n\n  // ## Token types\n\n  // The assignment of fine-grained, information-carrying type objects\n  // allows the tokenizer to store the information it has about a\n  // token in a way that is very cheap for the parser to look up.\n\n  // All token type variables start with an underscore, to make them\n  // easy to recognize.\n\n  // The `beforeExpr` property is used to disambiguate between regular\n  // expressions and divisions. It is set on all token types that can\n  // be followed by an expression (thus, a slash after them would be a\n  // regular expression).\n  //\n  // The `startsExpr` property is used to check if the token ends a\n  // `yield` expression. It is set on all token types that either can\n  // directly start an expression (like a quotation mark) or can\n  // continue an expression (like the body of a string).\n  //\n  // `isLoop` marks a keyword as starting a loop, which is important\n  // to know when parsing a label, in order to allow or disallow\n  // continue jumps to that label.\n\n  var TokenType = function TokenType(label, conf) {\n    if ( conf === void 0 ) conf = {};\n\n    this.label = label;\n    this.keyword = conf.keyword;\n    this.beforeExpr = !!conf.beforeExpr;\n    this.startsExpr = !!conf.startsExpr;\n    this.isLoop = !!conf.isLoop;\n    this.isAssign = !!conf.isAssign;\n    this.prefix = !!conf.prefix;\n    this.postfix = !!conf.postfix;\n    this.binop = conf.binop || null;\n    this.updateContext = null;\n  };\n\n  function binop(name, prec) {\n    return new TokenType(name, {beforeExpr: true, binop: prec})\n  }\n  var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};\n\n  // Map keyword names to token types.\n\n  var keywords = {};\n\n  // Succinct definitions of keyword token types\n  function kw(name, options) {\n    if ( options === void 0 ) options = {};\n\n    options.keyword = name;\n    return keywords[name] = new TokenType(name, options)\n  }\n\n  var types$1 = {\n    num: new TokenType(\"num\", startsExpr),\n    regexp: new TokenType(\"regexp\", startsExpr),\n    string: new TokenType(\"string\", startsExpr),\n    name: new TokenType(\"name\", startsExpr),\n    privateId: new TokenType(\"privateId\", startsExpr),\n    eof: new TokenType(\"eof\"),\n\n    // Punctuation token types.\n    bracketL: new TokenType(\"[\", {beforeExpr: true, startsExpr: true}),\n    bracketR: new TokenType(\"]\"),\n    braceL: new TokenType(\"{\", {beforeExpr: true, startsExpr: true}),\n    braceR: new TokenType(\"}\"),\n    parenL: new TokenType(\"(\", {beforeExpr: true, startsExpr: true}),\n    parenR: new TokenType(\")\"),\n    comma: new TokenType(\",\", beforeExpr),\n    semi: new TokenType(\";\", beforeExpr),\n    colon: new TokenType(\":\", beforeExpr),\n    dot: new TokenType(\".\"),\n    question: new TokenType(\"?\", beforeExpr),\n    questionDot: new TokenType(\"?.\"),\n    arrow: new TokenType(\"=>\", beforeExpr),\n    template: new TokenType(\"template\"),\n    invalidTemplate: new TokenType(\"invalidTemplate\"),\n    ellipsis: new TokenType(\"...\", beforeExpr),\n    backQuote: new TokenType(\"`\", startsExpr),\n    dollarBraceL: new TokenType(\"${\", {beforeExpr: true, startsExpr: true}),\n\n    // Operators. These carry several kinds of properties to help the\n    // parser use them properly (the presence of these properties is\n    // what categorizes them as operators).\n    //\n    // `binop`, when present, specifies that this operator is a binary\n    // operator, and will refer to its precedence.\n    //\n    // `prefix` and `postfix` mark the operator as a prefix or postfix\n    // unary operator.\n    //\n    // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n    // binary operators with a very low precedence, that should result\n    // in AssignmentExpression nodes.\n\n    eq: new TokenType(\"=\", {beforeExpr: true, isAssign: true}),\n    assign: new TokenType(\"_=\", {beforeExpr: true, isAssign: true}),\n    incDec: new TokenType(\"++/--\", {prefix: true, postfix: true, startsExpr: true}),\n    prefix: new TokenType(\"!/~\", {beforeExpr: true, prefix: true, startsExpr: true}),\n    logicalOR: binop(\"||\", 1),\n    logicalAND: binop(\"&&\", 2),\n    bitwiseOR: binop(\"|\", 3),\n    bitwiseXOR: binop(\"^\", 4),\n    bitwiseAND: binop(\"&\", 5),\n    equality: binop(\"==/!=/===/!==\", 6),\n    relational: binop(\"</>/<=/>=\", 7),\n    bitShift: binop(\"<</>>/>>>\", 8),\n    plusMin: new TokenType(\"+/-\", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),\n    modulo: binop(\"%\", 10),\n    star: binop(\"*\", 10),\n    slash: binop(\"/\", 10),\n    starstar: new TokenType(\"**\", {beforeExpr: true}),\n    coalesce: binop(\"??\", 1),\n\n    // Keyword token types.\n    _break: kw(\"break\"),\n    _case: kw(\"case\", beforeExpr),\n    _catch: kw(\"catch\"),\n    _continue: kw(\"continue\"),\n    _debugger: kw(\"debugger\"),\n    _default: kw(\"default\", beforeExpr),\n    _do: kw(\"do\", {isLoop: true, beforeExpr: true}),\n    _else: kw(\"else\", beforeExpr),\n    _finally: kw(\"finally\"),\n    _for: kw(\"for\", {isLoop: true}),\n    _function: kw(\"function\", startsExpr),\n    _if: kw(\"if\"),\n    _return: kw(\"return\", beforeExpr),\n    _switch: kw(\"switch\"),\n    _throw: kw(\"throw\", beforeExpr),\n    _try: kw(\"try\"),\n    _var: kw(\"var\"),\n    _const: kw(\"const\"),\n    _while: kw(\"while\", {isLoop: true}),\n    _with: kw(\"with\"),\n    _new: kw(\"new\", {beforeExpr: true, startsExpr: true}),\n    _this: kw(\"this\", startsExpr),\n    _super: kw(\"super\", startsExpr),\n    _class: kw(\"class\", startsExpr),\n    _extends: kw(\"extends\", beforeExpr),\n    _export: kw(\"export\"),\n    _import: kw(\"import\", startsExpr),\n    _null: kw(\"null\", startsExpr),\n    _true: kw(\"true\", startsExpr),\n    _false: kw(\"false\", startsExpr),\n    _in: kw(\"in\", {beforeExpr: true, binop: 7}),\n    _instanceof: kw(\"instanceof\", {beforeExpr: true, binop: 7}),\n    _typeof: kw(\"typeof\", {beforeExpr: true, prefix: true, startsExpr: true}),\n    _void: kw(\"void\", {beforeExpr: true, prefix: true, startsExpr: true}),\n    _delete: kw(\"delete\", {beforeExpr: true, prefix: true, startsExpr: true})\n  };\n\n  // Matches a whole line break (where CRLF is considered a single\n  // line break). Used to count lines.\n\n  var lineBreak = /\\r\\n?|\\n|\\u2028|\\u2029/;\n  var lineBreakG = new RegExp(lineBreak.source, \"g\");\n\n  function isNewLine(code) {\n    return code === 10 || code === 13 || code === 0x2028 || code === 0x2029\n  }\n\n  function nextLineBreak(code, from, end) {\n    if ( end === void 0 ) end = code.length;\n\n    for (var i = from; i < end; i++) {\n      var next = code.charCodeAt(i);\n      if (isNewLine(next))\n        { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 }\n    }\n    return -1\n  }\n\n  var nonASCIIwhitespace = /[\\u1680\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n\n  var skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\n  var ref = Object.prototype;\n  var hasOwnProperty = ref.hasOwnProperty;\n  var toString = ref.toString;\n\n  var hasOwn = Object.hasOwn || (function (obj, propName) { return (\n    hasOwnProperty.call(obj, propName)\n  ); });\n\n  var isArray = Array.isArray || (function (obj) { return (\n    toString.call(obj) === \"[object Array]\"\n  ); });\n\n  function wordsRegexp(words) {\n    return new RegExp(\"^(?:\" + words.replace(/ /g, \"|\") + \")$\")\n  }\n\n  function codePointToString(code) {\n    // UTF-16 Decoding\n    if (code <= 0xFFFF) { return String.fromCharCode(code) }\n    code -= 0x10000;\n    return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)\n  }\n\n  var loneSurrogate = /(?:[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/;\n\n  // These are used when `options.locations` is on, for the\n  // `startLoc` and `endLoc` properties.\n\n  var Position = function Position(line, col) {\n    this.line = line;\n    this.column = col;\n  };\n\n  Position.prototype.offset = function offset (n) {\n    return new Position(this.line, this.column + n)\n  };\n\n  var SourceLocation = function SourceLocation(p, start, end) {\n    this.start = start;\n    this.end = end;\n    if (p.sourceFile !== null) { this.source = p.sourceFile; }\n  };\n\n  // The `getLineInfo` function is mostly useful when the\n  // `locations` option is off (for performance reasons) and you\n  // want to find the line/column position for a given character\n  // offset. `input` should be the code string that the offset refers\n  // into.\n\n  function getLineInfo(input, offset) {\n    for (var line = 1, cur = 0;;) {\n      var nextBreak = nextLineBreak(input, cur, offset);\n      if (nextBreak < 0) { return new Position(line, offset - cur) }\n      ++line;\n      cur = nextBreak;\n    }\n  }\n\n  // A second argument must be given to configure the parser process.\n  // These options are recognized (only `ecmaVersion` is required):\n\n  var defaultOptions = {\n    // `ecmaVersion` indicates the ECMAScript version to parse. Must be\n    // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10\n    // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `\"latest\"`\n    // (the latest version the library supports). This influences\n    // support for strict mode, the set of reserved words, and support\n    // for new syntax features.\n    ecmaVersion: null,\n    // `sourceType` indicates the mode the code should be parsed in.\n    // Can be either `\"script\"` or `\"module\"`. This influences global\n    // strict mode and parsing of `import` and `export` declarations.\n    sourceType: \"script\",\n    // `onInsertedSemicolon` can be a callback that will be called\n    // when a semicolon is automatically inserted. It will be passed\n    // the position of the comma as an offset, and if `locations` is\n    // enabled, it is given the location as a `{line, column}` object\n    // as second argument.\n    onInsertedSemicolon: null,\n    // `onTrailingComma` is similar to `onInsertedSemicolon`, but for\n    // trailing commas.\n    onTrailingComma: null,\n    // By default, reserved words are only enforced if ecmaVersion >= 5.\n    // Set `allowReserved` to a boolean value to explicitly turn this on\n    // an off. When this option has the value \"never\", reserved words\n    // and keywords can also not be used as property names.\n    allowReserved: null,\n    // When enabled, a return at the top level is not considered an\n    // error.\n    allowReturnOutsideFunction: false,\n    // When enabled, import/export statements are not constrained to\n    // appearing at the top of the program, and an import.meta expression\n    // in a script isn't considered an error.\n    allowImportExportEverywhere: false,\n    // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022.\n    // When enabled, await identifiers are allowed to appear at the top-level scope,\n    // but they are still not allowed in non-async functions.\n    allowAwaitOutsideFunction: null,\n    // When enabled, super identifiers are not constrained to\n    // appearing in methods and do not raise an error when they appear elsewhere.\n    allowSuperOutsideMethod: null,\n    // When enabled, hashbang directive in the beginning of file is\n    // allowed and treated as a line comment. Enabled by default when\n    // `ecmaVersion` >= 2023.\n    allowHashBang: false,\n    // When `locations` is on, `loc` properties holding objects with\n    // `start` and `end` properties in `{line, column}` form (with\n    // line being 1-based and column 0-based) will be attached to the\n    // nodes.\n    locations: false,\n    // A function can be passed as `onToken` option, which will\n    // cause Acorn to call that function with object in the same\n    // format as tokens returned from `tokenizer().getToken()`. Note\n    // that you are not allowed to call the parser from the\n    // callback—that will corrupt its internal state.\n    onToken: null,\n    // A function can be passed as `onComment` option, which will\n    // cause Acorn to call that function with `(block, text, start,\n    // end)` parameters whenever a comment is skipped. `block` is a\n    // boolean indicating whether this is a block (`/* */`) comment,\n    // `text` is the content of the comment, and `start` and `end` are\n    // character offsets that denote the start and end of the comment.\n    // When the `locations` option is on, two more parameters are\n    // passed, the full `{line, column}` locations of the start and\n    // end of the comments. Note that you are not allowed to call the\n    // parser from the callback—that will corrupt its internal state.\n    onComment: null,\n    // Nodes have their start and end characters offsets recorded in\n    // `start` and `end` properties (directly on the node, rather than\n    // the `loc` object, which holds line/column data. To also add a\n    // [semi-standardized][range] `range` property holding a `[start,\n    // end]` array with the same numbers, set the `ranges` option to\n    // `true`.\n    //\n    // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n    ranges: false,\n    // It is possible to parse multiple files into a single AST by\n    // passing the tree produced by parsing the first file as\n    // `program` option in subsequent parses. This will add the\n    // toplevel forms of the parsed file to the `Program` (top) node\n    // of an existing parse tree.\n    program: null,\n    // When `locations` is on, you can pass this to record the source\n    // file in every node's `loc` object.\n    sourceFile: null,\n    // This value, if given, is stored in every node, whether\n    // `locations` is on or off.\n    directSourceFile: null,\n    // When enabled, parenthesized expressions are represented by\n    // (non-standard) ParenthesizedExpression nodes\n    preserveParens: false\n  };\n\n  // Interpret and default an options object\n\n  var warnedAboutEcmaVersion = false;\n\n  function getOptions(opts) {\n    var options = {};\n\n    for (var opt in defaultOptions)\n      { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; }\n\n    if (options.ecmaVersion === \"latest\") {\n      options.ecmaVersion = 1e8;\n    } else if (options.ecmaVersion == null) {\n      if (!warnedAboutEcmaVersion && typeof console === \"object\" && console.warn) {\n        warnedAboutEcmaVersion = true;\n        console.warn(\"Since Acorn 8.0.0, options.ecmaVersion is required.\\nDefaulting to 2020, but this will stop working in the future.\");\n      }\n      options.ecmaVersion = 11;\n    } else if (options.ecmaVersion >= 2015) {\n      options.ecmaVersion -= 2009;\n    }\n\n    if (options.allowReserved == null)\n      { options.allowReserved = options.ecmaVersion < 5; }\n\n    if (!opts || opts.allowHashBang == null)\n      { options.allowHashBang = options.ecmaVersion >= 14; }\n\n    if (isArray(options.onToken)) {\n      var tokens = options.onToken;\n      options.onToken = function (token) { return tokens.push(token); };\n    }\n    if (isArray(options.onComment))\n      { options.onComment = pushComment(options, options.onComment); }\n\n    return options\n  }\n\n  function pushComment(options, array) {\n    return function(block, text, start, end, startLoc, endLoc) {\n      var comment = {\n        type: block ? \"Block\" : \"Line\",\n        value: text,\n        start: start,\n        end: end\n      };\n      if (options.locations)\n        { comment.loc = new SourceLocation(this, startLoc, endLoc); }\n      if (options.ranges)\n        { comment.range = [start, end]; }\n      array.push(comment);\n    }\n  }\n\n  // Each scope gets a bitset that may contain these flags\n  var\n      SCOPE_TOP = 1,\n      SCOPE_FUNCTION = 2,\n      SCOPE_ASYNC = 4,\n      SCOPE_GENERATOR = 8,\n      SCOPE_ARROW = 16,\n      SCOPE_SIMPLE_CATCH = 32,\n      SCOPE_SUPER = 64,\n      SCOPE_DIRECT_SUPER = 128,\n      SCOPE_CLASS_STATIC_BLOCK = 256,\n      SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK;\n\n  function functionFlags(async, generator) {\n    return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)\n  }\n\n  // Used in checkLVal* and declareName to determine the type of a binding\n  var\n      BIND_NONE = 0, // Not a binding\n      BIND_VAR = 1, // Var-style binding\n      BIND_LEXICAL = 2, // Let- or const-style binding\n      BIND_FUNCTION = 3, // Function declaration\n      BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding\n      BIND_OUTSIDE = 5; // Special case for function names as bound inside the function\n\n  var Parser = function Parser(options, input, startPos) {\n    this.options = options = getOptions(options);\n    this.sourceFile = options.sourceFile;\n    this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === \"module\" ? \"5module\" : 5]);\n    var reserved = \"\";\n    if (options.allowReserved !== true) {\n      reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3];\n      if (options.sourceType === \"module\") { reserved += \" await\"; }\n    }\n    this.reservedWords = wordsRegexp(reserved);\n    var reservedStrict = (reserved ? reserved + \" \" : \"\") + reservedWords.strict;\n    this.reservedWordsStrict = wordsRegexp(reservedStrict);\n    this.reservedWordsStrictBind = wordsRegexp(reservedStrict + \" \" + reservedWords.strictBind);\n    this.input = String(input);\n\n    // Used to signal to callers of `readWord1` whether the word\n    // contained any escape sequences. This is needed because words with\n    // escape sequences must not be interpreted as keywords.\n    this.containsEsc = false;\n\n    // Set up token state\n\n    // The current position of the tokenizer in the input.\n    if (startPos) {\n      this.pos = startPos;\n      this.lineStart = this.input.lastIndexOf(\"\\n\", startPos - 1) + 1;\n      this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;\n    } else {\n      this.pos = this.lineStart = 0;\n      this.curLine = 1;\n    }\n\n    // Properties of the current token:\n    // Its type\n    this.type = types$1.eof;\n    // For tokens that include more information than their type, the value\n    this.value = null;\n    // Its start and end offset\n    this.start = this.end = this.pos;\n    // And, if locations are used, the {line, column} object\n    // corresponding to those offsets\n    this.startLoc = this.endLoc = this.curPosition();\n\n    // Position information for the previous token\n    this.lastTokEndLoc = this.lastTokStartLoc = null;\n    this.lastTokStart = this.lastTokEnd = this.pos;\n\n    // The context stack is used to superficially track syntactic\n    // context to predict whether a regular expression is allowed in a\n    // given position.\n    this.context = this.initialContext();\n    this.exprAllowed = true;\n\n    // Figure out if it's a module code.\n    this.inModule = options.sourceType === \"module\";\n    this.strict = this.inModule || this.strictDirective(this.pos);\n\n    // Used to signify the start of a potential arrow function\n    this.potentialArrowAt = -1;\n    this.potentialArrowInForAwait = false;\n\n    // Positions to delayed-check that yield/await does not exist in default parameters.\n    this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;\n    // Labels in scope.\n    this.labels = [];\n    // Thus-far undefined exports.\n    this.undefinedExports = Object.create(null);\n\n    // If enabled, skip leading hashbang line.\n    if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === \"#!\")\n      { this.skipLineComment(2); }\n\n    // Scope tracking for duplicate variable names (see scope.js)\n    this.scopeStack = [];\n    this.enterScope(SCOPE_TOP);\n\n    // For RegExp validation\n    this.regexpState = null;\n\n    // The stack of private names.\n    // Each element has two properties: 'declared' and 'used'.\n    // When it exited from the outermost class definition, all used private names must be declared.\n    this.privateNameStack = [];\n  };\n\n  var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } };\n\n  Parser.prototype.parse = function parse () {\n    var node = this.options.program || this.startNode();\n    this.nextToken();\n    return this.parseTopLevel(node)\n  };\n\n  prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };\n\n  prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit };\n\n  prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit };\n\n  prototypeAccessors.canAwait.get = function () {\n    for (var i = this.scopeStack.length - 1; i >= 0; i--) {\n      var scope = this.scopeStack[i];\n      if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false }\n      if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 }\n    }\n    return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction\n  };\n\n  prototypeAccessors.allowSuper.get = function () {\n    var ref = this.currentThisScope();\n      var flags = ref.flags;\n      var inClassFieldInit = ref.inClassFieldInit;\n    return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod\n  };\n\n  prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };\n\n  prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };\n\n  prototypeAccessors.allowNewDotTarget.get = function () {\n    var ref = this.currentThisScope();\n      var flags = ref.flags;\n      var inClassFieldInit = ref.inClassFieldInit;\n    return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit\n  };\n\n  prototypeAccessors.inClassStaticBlock.get = function () {\n    return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0\n  };\n\n  Parser.extend = function extend () {\n      var plugins = [], len = arguments.length;\n      while ( len-- ) plugins[ len ] = arguments[ len ];\n\n    var cls = this;\n    for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }\n    return cls\n  };\n\n  Parser.parse = function parse (input, options) {\n    return new this(options, input).parse()\n  };\n\n  Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) {\n    var parser = new this(options, input, pos);\n    parser.nextToken();\n    return parser.parseExpression()\n  };\n\n  Parser.tokenizer = function tokenizer (input, options) {\n    return new this(options, input)\n  };\n\n  Object.defineProperties( Parser.prototype, prototypeAccessors );\n\n  var pp$9 = Parser.prototype;\n\n  // ## Parser utilities\n\n  var literal = /^(?:'((?:\\\\.|[^'\\\\])*?)'|\"((?:\\\\.|[^\"\\\\])*?)\")/;\n  pp$9.strictDirective = function(start) {\n    if (this.options.ecmaVersion < 5) { return false }\n    for (;;) {\n      // Try to find string literal.\n      skipWhiteSpace.lastIndex = start;\n      start += skipWhiteSpace.exec(this.input)[0].length;\n      var match = literal.exec(this.input.slice(start));\n      if (!match) { return false }\n      if ((match[1] || match[2]) === \"use strict\") {\n        skipWhiteSpace.lastIndex = start + match[0].length;\n        var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;\n        var next = this.input.charAt(end);\n        return next === \";\" || next === \"}\" ||\n          (lineBreak.test(spaceAfter[0]) &&\n           !(/[(`.[+\\-/*%<>=,?^&]/.test(next) || next === \"!\" && this.input.charAt(end + 1) === \"=\"))\n      }\n      start += match[0].length;\n\n      // Skip semicolon, if any.\n      skipWhiteSpace.lastIndex = start;\n      start += skipWhiteSpace.exec(this.input)[0].length;\n      if (this.input[start] === \";\")\n        { start++; }\n    }\n  };\n\n  // Predicate that tests whether the next token is of the given\n  // type, and if yes, consumes it as a side effect.\n\n  pp$9.eat = function(type) {\n    if (this.type === type) {\n      this.next();\n      return true\n    } else {\n      return false\n    }\n  };\n\n  // Tests whether parsed token is a contextual keyword.\n\n  pp$9.isContextual = function(name) {\n    return this.type === types$1.name && this.value === name && !this.containsEsc\n  };\n\n  // Consumes contextual keyword if possible.\n\n  pp$9.eatContextual = function(name) {\n    if (!this.isContextual(name)) { return false }\n    this.next();\n    return true\n  };\n\n  // Asserts that following token is given contextual keyword.\n\n  pp$9.expectContextual = function(name) {\n    if (!this.eatContextual(name)) { this.unexpected(); }\n  };\n\n  // Test whether a semicolon can be inserted at the current position.\n\n  pp$9.canInsertSemicolon = function() {\n    return this.type === types$1.eof ||\n      this.type === types$1.braceR ||\n      lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n  };\n\n  pp$9.insertSemicolon = function() {\n    if (this.canInsertSemicolon()) {\n      if (this.options.onInsertedSemicolon)\n        { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }\n      return true\n    }\n  };\n\n  // Consume a semicolon, or, failing that, see if we are allowed to\n  // pretend that there is a semicolon at this position.\n\n  pp$9.semicolon = function() {\n    if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); }\n  };\n\n  pp$9.afterTrailingComma = function(tokType, notNext) {\n    if (this.type === tokType) {\n      if (this.options.onTrailingComma)\n        { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }\n      if (!notNext)\n        { this.next(); }\n      return true\n    }\n  };\n\n  // Expect a token of a given type. If found, consume it, otherwise,\n  // raise an unexpected token error.\n\n  pp$9.expect = function(type) {\n    this.eat(type) || this.unexpected();\n  };\n\n  // Raise an unexpected token error.\n\n  pp$9.unexpected = function(pos) {\n    this.raise(pos != null ? pos : this.start, \"Unexpected token\");\n  };\n\n  var DestructuringErrors = function DestructuringErrors() {\n    this.shorthandAssign =\n    this.trailingComma =\n    this.parenthesizedAssign =\n    this.parenthesizedBind =\n    this.doubleProto =\n      -1;\n  };\n\n  pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) {\n    if (!refDestructuringErrors) { return }\n    if (refDestructuringErrors.trailingComma > -1)\n      { this.raiseRecoverable(refDestructuringErrors.trailingComma, \"Comma is not permitted after the rest element\"); }\n    var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;\n    if (parens > -1) { this.raiseRecoverable(parens, isAssign ? \"Assigning to rvalue\" : \"Parenthesized pattern\"); }\n  };\n\n  pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {\n    if (!refDestructuringErrors) { return false }\n    var shorthandAssign = refDestructuringErrors.shorthandAssign;\n    var doubleProto = refDestructuringErrors.doubleProto;\n    if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }\n    if (shorthandAssign >= 0)\n      { this.raise(shorthandAssign, \"Shorthand property assignments are valid only in destructuring patterns\"); }\n    if (doubleProto >= 0)\n      { this.raiseRecoverable(doubleProto, \"Redefinition of __proto__ property\"); }\n  };\n\n  pp$9.checkYieldAwaitInDefaultParams = function() {\n    if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))\n      { this.raise(this.yieldPos, \"Yield expression cannot be a default value\"); }\n    if (this.awaitPos)\n      { this.raise(this.awaitPos, \"Await expression cannot be a default value\"); }\n  };\n\n  pp$9.isSimpleAssignTarget = function(expr) {\n    if (expr.type === \"ParenthesizedExpression\")\n      { return this.isSimpleAssignTarget(expr.expression) }\n    return expr.type === \"Identifier\" || expr.type === \"MemberExpression\"\n  };\n\n  var pp$8 = Parser.prototype;\n\n  // ### Statement parsing\n\n  // Parse a program. Initializes the parser, reads any number of\n  // statements, and wraps them in a Program node.  Optionally takes a\n  // `program` argument.  If present, the statements will be appended\n  // to its body instead of creating a new node.\n\n  pp$8.parseTopLevel = function(node) {\n    var exports = Object.create(null);\n    if (!node.body) { node.body = []; }\n    while (this.type !== types$1.eof) {\n      var stmt = this.parseStatement(null, true, exports);\n      node.body.push(stmt);\n    }\n    if (this.inModule)\n      { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)\n        {\n          var name = list[i];\n\n          this.raiseRecoverable(this.undefinedExports[name].start, (\"Export '\" + name + \"' is not defined\"));\n        } }\n    this.adaptDirectivePrologue(node.body);\n    this.next();\n    node.sourceType = this.options.sourceType;\n    return this.finishNode(node, \"Program\")\n  };\n\n  var loopLabel = {kind: \"loop\"}, switchLabel = {kind: \"switch\"};\n\n  pp$8.isLet = function(context) {\n    if (this.options.ecmaVersion < 6 || !this.isContextual(\"let\")) { return false }\n    skipWhiteSpace.lastIndex = this.pos;\n    var skip = skipWhiteSpace.exec(this.input);\n    var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n    // For ambiguous cases, determine if a LexicalDeclaration (or only a\n    // Statement) is allowed here. If context is not empty then only a Statement\n    // is allowed. However, `let [` is an explicit negative lookahead for\n    // ExpressionStatement, so special-case it first.\n    if (nextCh === 91 || nextCh === 92) { return true } // '[', '/'\n    if (context) { return false }\n\n    if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral\n    if (isIdentifierStart(nextCh, true)) {\n      var pos = next + 1;\n      while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; }\n      if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true }\n      var ident = this.input.slice(next, pos);\n      if (!keywordRelationalOperator.test(ident)) { return true }\n    }\n    return false\n  };\n\n  // check 'async [no LineTerminator here] function'\n  // - 'async /*foo*/ function' is OK.\n  // - 'async /*\\n*/ function' is invalid.\n  pp$8.isAsyncFunction = function() {\n    if (this.options.ecmaVersion < 8 || !this.isContextual(\"async\"))\n      { return false }\n\n    skipWhiteSpace.lastIndex = this.pos;\n    var skip = skipWhiteSpace.exec(this.input);\n    var next = this.pos + skip[0].length, after;\n    return !lineBreak.test(this.input.slice(this.pos, next)) &&\n      this.input.slice(next, next + 8) === \"function\" &&\n      (next + 8 === this.input.length ||\n       !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00))\n  };\n\n  // Parse a single statement.\n  //\n  // If expecting a statement and finding a slash operator, parse a\n  // regular expression literal. This is to handle cases like\n  // `if (foo) /blah/.exec(foo)`, where looking at the previous token\n  // does not help.\n\n  pp$8.parseStatement = function(context, topLevel, exports) {\n    var starttype = this.type, node = this.startNode(), kind;\n\n    if (this.isLet(context)) {\n      starttype = types$1._var;\n      kind = \"let\";\n    }\n\n    // Most types of statements are recognized by the keyword they\n    // start with. Many are trivial to parse, some require a bit of\n    // complexity.\n\n    switch (starttype) {\n    case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword)\n    case types$1._debugger: return this.parseDebuggerStatement(node)\n    case types$1._do: return this.parseDoStatement(node)\n    case types$1._for: return this.parseForStatement(node)\n    case types$1._function:\n      // Function as sole body of either an if statement or a labeled statement\n      // works, but not when it is part of a labeled statement that is the sole\n      // body of an if statement.\n      if ((context && (this.strict || context !== \"if\" && context !== \"label\")) && this.options.ecmaVersion >= 6) { this.unexpected(); }\n      return this.parseFunctionStatement(node, false, !context)\n    case types$1._class:\n      if (context) { this.unexpected(); }\n      return this.parseClass(node, true)\n    case types$1._if: return this.parseIfStatement(node)\n    case types$1._return: return this.parseReturnStatement(node)\n    case types$1._switch: return this.parseSwitchStatement(node)\n    case types$1._throw: return this.parseThrowStatement(node)\n    case types$1._try: return this.parseTryStatement(node)\n    case types$1._const: case types$1._var:\n      kind = kind || this.value;\n      if (context && kind !== \"var\") { this.unexpected(); }\n      return this.parseVarStatement(node, kind)\n    case types$1._while: return this.parseWhileStatement(node)\n    case types$1._with: return this.parseWithStatement(node)\n    case types$1.braceL: return this.parseBlock(true, node)\n    case types$1.semi: return this.parseEmptyStatement(node)\n    case types$1._export:\n    case types$1._import:\n      if (this.options.ecmaVersion > 10 && starttype === types$1._import) {\n        skipWhiteSpace.lastIndex = this.pos;\n        var skip = skipWhiteSpace.exec(this.input);\n        var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n        if (nextCh === 40 || nextCh === 46) // '(' or '.'\n          { return this.parseExpressionStatement(node, this.parseExpression()) }\n      }\n\n      if (!this.options.allowImportExportEverywhere) {\n        if (!topLevel)\n          { this.raise(this.start, \"'import' and 'export' may only appear at the top level\"); }\n        if (!this.inModule)\n          { this.raise(this.start, \"'import' and 'export' may appear only with 'sourceType: module'\"); }\n      }\n      return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports)\n\n      // If the statement does not start with a statement keyword or a\n      // brace, it's an ExpressionStatement or LabeledStatement. We\n      // simply start parsing an expression, and afterwards, if the\n      // next token is a colon and the expression was a simple\n      // Identifier node, we switch to interpreting it as a label.\n    default:\n      if (this.isAsyncFunction()) {\n        if (context) { this.unexpected(); }\n        this.next();\n        return this.parseFunctionStatement(node, true, !context)\n      }\n\n      var maybeName = this.value, expr = this.parseExpression();\n      if (starttype === types$1.name && expr.type === \"Identifier\" && this.eat(types$1.colon))\n        { return this.parseLabeledStatement(node, maybeName, expr, context) }\n      else { return this.parseExpressionStatement(node, expr) }\n    }\n  };\n\n  pp$8.parseBreakContinueStatement = function(node, keyword) {\n    var isBreak = keyword === \"break\";\n    this.next();\n    if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; }\n    else if (this.type !== types$1.name) { this.unexpected(); }\n    else {\n      node.label = this.parseIdent();\n      this.semicolon();\n    }\n\n    // Verify that there is an actual destination to break or\n    // continue to.\n    var i = 0;\n    for (; i < this.labels.length; ++i) {\n      var lab = this.labels[i];\n      if (node.label == null || lab.name === node.label.name) {\n        if (lab.kind != null && (isBreak || lab.kind === \"loop\")) { break }\n        if (node.label && isBreak) { break }\n      }\n    }\n    if (i === this.labels.length) { this.raise(node.start, \"Unsyntactic \" + keyword); }\n    return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n  };\n\n  pp$8.parseDebuggerStatement = function(node) {\n    this.next();\n    this.semicolon();\n    return this.finishNode(node, \"DebuggerStatement\")\n  };\n\n  pp$8.parseDoStatement = function(node) {\n    this.next();\n    this.labels.push(loopLabel);\n    node.body = this.parseStatement(\"do\");\n    this.labels.pop();\n    this.expect(types$1._while);\n    node.test = this.parseParenExpression();\n    if (this.options.ecmaVersion >= 6)\n      { this.eat(types$1.semi); }\n    else\n      { this.semicolon(); }\n    return this.finishNode(node, \"DoWhileStatement\")\n  };\n\n  // Disambiguating between a `for` and a `for`/`in` or `for`/`of`\n  // loop is non-trivial. Basically, we have to parse the init `var`\n  // statement or expression, disallowing the `in` operator (see\n  // the second parameter to `parseExpression`), and then check\n  // whether the next token is `in` or `of`. When there is no init\n  // part (semicolon immediately after the opening parenthesis), it\n  // is a regular `for` loop.\n\n  pp$8.parseForStatement = function(node) {\n    this.next();\n    var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual(\"await\")) ? this.lastTokStart : -1;\n    this.labels.push(loopLabel);\n    this.enterScope(0);\n    this.expect(types$1.parenL);\n    if (this.type === types$1.semi) {\n      if (awaitAt > -1) { this.unexpected(awaitAt); }\n      return this.parseFor(node, null)\n    }\n    var isLet = this.isLet();\n    if (this.type === types$1._var || this.type === types$1._const || isLet) {\n      var init$1 = this.startNode(), kind = isLet ? \"let\" : this.value;\n      this.next();\n      this.parseVar(init$1, true, kind);\n      this.finishNode(init$1, \"VariableDeclaration\");\n      if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) && init$1.declarations.length === 1) {\n        if (this.options.ecmaVersion >= 9) {\n          if (this.type === types$1._in) {\n            if (awaitAt > -1) { this.unexpected(awaitAt); }\n          } else { node.await = awaitAt > -1; }\n        }\n        return this.parseForIn(node, init$1)\n      }\n      if (awaitAt > -1) { this.unexpected(awaitAt); }\n      return this.parseFor(node, init$1)\n    }\n    var startsWithLet = this.isContextual(\"let\"), isForOf = false;\n    var refDestructuringErrors = new DestructuringErrors;\n    var init = this.parseExpression(awaitAt > -1 ? \"await\" : true, refDestructuringErrors);\n    if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) {\n      if (this.options.ecmaVersion >= 9) {\n        if (this.type === types$1._in) {\n          if (awaitAt > -1) { this.unexpected(awaitAt); }\n        } else { node.await = awaitAt > -1; }\n      }\n      if (startsWithLet && isForOf) { this.raise(init.start, \"The left-hand side of a for-of loop may not start with 'let'.\"); }\n      this.toAssignable(init, false, refDestructuringErrors);\n      this.checkLValPattern(init);\n      return this.parseForIn(node, init)\n    } else {\n      this.checkExpressionErrors(refDestructuringErrors, true);\n    }\n    if (awaitAt > -1) { this.unexpected(awaitAt); }\n    return this.parseFor(node, init)\n  };\n\n  pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) {\n    this.next();\n    return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)\n  };\n\n  pp$8.parseIfStatement = function(node) {\n    this.next();\n    node.test = this.parseParenExpression();\n    // allow function declarations in branches, but only in non-strict mode\n    node.consequent = this.parseStatement(\"if\");\n    node.alternate = this.eat(types$1._else) ? this.parseStatement(\"if\") : null;\n    return this.finishNode(node, \"IfStatement\")\n  };\n\n  pp$8.parseReturnStatement = function(node) {\n    if (!this.inFunction && !this.options.allowReturnOutsideFunction)\n      { this.raise(this.start, \"'return' outside of function\"); }\n    this.next();\n\n    // In `return` (and `break`/`continue`), the keywords with\n    // optional arguments, we eagerly look for a semicolon or the\n    // possibility to insert one.\n\n    if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; }\n    else { node.argument = this.parseExpression(); this.semicolon(); }\n    return this.finishNode(node, \"ReturnStatement\")\n  };\n\n  pp$8.parseSwitchStatement = function(node) {\n    this.next();\n    node.discriminant = this.parseParenExpression();\n    node.cases = [];\n    this.expect(types$1.braceL);\n    this.labels.push(switchLabel);\n    this.enterScope(0);\n\n    // Statements under must be grouped (by label) in SwitchCase\n    // nodes. `cur` is used to keep the node that we are currently\n    // adding statements to.\n\n    var cur;\n    for (var sawDefault = false; this.type !== types$1.braceR;) {\n      if (this.type === types$1._case || this.type === types$1._default) {\n        var isCase = this.type === types$1._case;\n        if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n        node.cases.push(cur = this.startNode());\n        cur.consequent = [];\n        this.next();\n        if (isCase) {\n          cur.test = this.parseExpression();\n        } else {\n          if (sawDefault) { this.raiseRecoverable(this.lastTokStart, \"Multiple default clauses\"); }\n          sawDefault = true;\n          cur.test = null;\n        }\n        this.expect(types$1.colon);\n      } else {\n        if (!cur) { this.unexpected(); }\n        cur.consequent.push(this.parseStatement(null));\n      }\n    }\n    this.exitScope();\n    if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n    this.next(); // Closing brace\n    this.labels.pop();\n    return this.finishNode(node, \"SwitchStatement\")\n  };\n\n  pp$8.parseThrowStatement = function(node) {\n    this.next();\n    if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))\n      { this.raise(this.lastTokEnd, \"Illegal newline after throw\"); }\n    node.argument = this.parseExpression();\n    this.semicolon();\n    return this.finishNode(node, \"ThrowStatement\")\n  };\n\n  // Reused empty array added for node fields that are always empty.\n\n  var empty$1 = [];\n\n  pp$8.parseTryStatement = function(node) {\n    this.next();\n    node.block = this.parseBlock();\n    node.handler = null;\n    if (this.type === types$1._catch) {\n      var clause = this.startNode();\n      this.next();\n      if (this.eat(types$1.parenL)) {\n        clause.param = this.parseBindingAtom();\n        var simple = clause.param.type === \"Identifier\";\n        this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);\n        this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);\n        this.expect(types$1.parenR);\n      } else {\n        if (this.options.ecmaVersion < 10) { this.unexpected(); }\n        clause.param = null;\n        this.enterScope(0);\n      }\n      clause.body = this.parseBlock(false);\n      this.exitScope();\n      node.handler = this.finishNode(clause, \"CatchClause\");\n    }\n    node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null;\n    if (!node.handler && !node.finalizer)\n      { this.raise(node.start, \"Missing catch or finally clause\"); }\n    return this.finishNode(node, \"TryStatement\")\n  };\n\n  pp$8.parseVarStatement = function(node, kind) {\n    this.next();\n    this.parseVar(node, false, kind);\n    this.semicolon();\n    return this.finishNode(node, \"VariableDeclaration\")\n  };\n\n  pp$8.parseWhileStatement = function(node) {\n    this.next();\n    node.test = this.parseParenExpression();\n    this.labels.push(loopLabel);\n    node.body = this.parseStatement(\"while\");\n    this.labels.pop();\n    return this.finishNode(node, \"WhileStatement\")\n  };\n\n  pp$8.parseWithStatement = function(node) {\n    if (this.strict) { this.raise(this.start, \"'with' in strict mode\"); }\n    this.next();\n    node.object = this.parseParenExpression();\n    node.body = this.parseStatement(\"with\");\n    return this.finishNode(node, \"WithStatement\")\n  };\n\n  pp$8.parseEmptyStatement = function(node) {\n    this.next();\n    return this.finishNode(node, \"EmptyStatement\")\n  };\n\n  pp$8.parseLabeledStatement = function(node, maybeName, expr, context) {\n    for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)\n      {\n      var label = list[i$1];\n\n      if (label.name === maybeName)\n        { this.raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n    } }\n    var kind = this.type.isLoop ? \"loop\" : this.type === types$1._switch ? \"switch\" : null;\n    for (var i = this.labels.length - 1; i >= 0; i--) {\n      var label$1 = this.labels[i];\n      if (label$1.statementStart === node.start) {\n        // Update information about previous labels on this node\n        label$1.statementStart = this.start;\n        label$1.kind = kind;\n      } else { break }\n    }\n    this.labels.push({name: maybeName, kind: kind, statementStart: this.start});\n    node.body = this.parseStatement(context ? context.indexOf(\"label\") === -1 ? context + \"label\" : context : \"label\");\n    this.labels.pop();\n    node.label = expr;\n    return this.finishNode(node, \"LabeledStatement\")\n  };\n\n  pp$8.parseExpressionStatement = function(node, expr) {\n    node.expression = expr;\n    this.semicolon();\n    return this.finishNode(node, \"ExpressionStatement\")\n  };\n\n  // Parse a semicolon-enclosed block of statements, handling `\"use\n  // strict\"` declarations when `allowStrict` is true (used for\n  // function bodies).\n\n  pp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) {\n    if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;\n    if ( node === void 0 ) node = this.startNode();\n\n    node.body = [];\n    this.expect(types$1.braceL);\n    if (createNewLexicalScope) { this.enterScope(0); }\n    while (this.type !== types$1.braceR) {\n      var stmt = this.parseStatement(null);\n      node.body.push(stmt);\n    }\n    if (exitStrict) { this.strict = false; }\n    this.next();\n    if (createNewLexicalScope) { this.exitScope(); }\n    return this.finishNode(node, \"BlockStatement\")\n  };\n\n  // Parse a regular `for` loop. The disambiguation code in\n  // `parseStatement` will already have parsed the init statement or\n  // expression.\n\n  pp$8.parseFor = function(node, init) {\n    node.init = init;\n    this.expect(types$1.semi);\n    node.test = this.type === types$1.semi ? null : this.parseExpression();\n    this.expect(types$1.semi);\n    node.update = this.type === types$1.parenR ? null : this.parseExpression();\n    this.expect(types$1.parenR);\n    node.body = this.parseStatement(\"for\");\n    this.exitScope();\n    this.labels.pop();\n    return this.finishNode(node, \"ForStatement\")\n  };\n\n  // Parse a `for`/`in` and `for`/`of` loop, which are almost\n  // same from parser's perspective.\n\n  pp$8.parseForIn = function(node, init) {\n    var isForIn = this.type === types$1._in;\n    this.next();\n\n    if (\n      init.type === \"VariableDeclaration\" &&\n      init.declarations[0].init != null &&\n      (\n        !isForIn ||\n        this.options.ecmaVersion < 8 ||\n        this.strict ||\n        init.kind !== \"var\" ||\n        init.declarations[0].id.type !== \"Identifier\"\n      )\n    ) {\n      this.raise(\n        init.start,\n        ((isForIn ? \"for-in\" : \"for-of\") + \" loop variable declaration may not have an initializer\")\n      );\n    }\n    node.left = init;\n    node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();\n    this.expect(types$1.parenR);\n    node.body = this.parseStatement(\"for\");\n    this.exitScope();\n    this.labels.pop();\n    return this.finishNode(node, isForIn ? \"ForInStatement\" : \"ForOfStatement\")\n  };\n\n  // Parse a list of variable declarations.\n\n  pp$8.parseVar = function(node, isFor, kind) {\n    node.declarations = [];\n    node.kind = kind;\n    for (;;) {\n      var decl = this.startNode();\n      this.parseVarId(decl, kind);\n      if (this.eat(types$1.eq)) {\n        decl.init = this.parseMaybeAssign(isFor);\n      } else if (kind === \"const\" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\")))) {\n        this.unexpected();\n      } else if (decl.id.type !== \"Identifier\" && !(isFor && (this.type === types$1._in || this.isContextual(\"of\")))) {\n        this.raise(this.lastTokEnd, \"Complex binding patterns require an initialization value\");\n      } else {\n        decl.init = null;\n      }\n      node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"));\n      if (!this.eat(types$1.comma)) { break }\n    }\n    return node\n  };\n\n  pp$8.parseVarId = function(decl, kind) {\n    decl.id = this.parseBindingAtom();\n    this.checkLValPattern(decl.id, kind === \"var\" ? BIND_VAR : BIND_LEXICAL, false);\n  };\n\n  var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;\n\n  // Parse a function declaration or literal (depending on the\n  // `statement & FUNC_STATEMENT`).\n\n  // Remove `allowExpressionBody` for 7.0.0, as it is only called with false\n  pp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) {\n    this.initFunction(node);\n    if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {\n      if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT))\n        { this.unexpected(); }\n      node.generator = this.eat(types$1.star);\n    }\n    if (this.options.ecmaVersion >= 8)\n      { node.async = !!isAsync; }\n\n    if (statement & FUNC_STATEMENT) {\n      node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent();\n      if (node.id && !(statement & FUNC_HANGING_STATEMENT))\n        // If it is a regular function declaration in sloppy mode, then it is\n        // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding\n        // mode depends on properties of the current scope (see\n        // treatFunctionsAsVar).\n        { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }\n    }\n\n    var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n    this.yieldPos = 0;\n    this.awaitPos = 0;\n    this.awaitIdentPos = 0;\n    this.enterScope(functionFlags(node.async, node.generator));\n\n    if (!(statement & FUNC_STATEMENT))\n      { node.id = this.type === types$1.name ? this.parseIdent() : null; }\n\n    this.parseFunctionParams(node);\n    this.parseFunctionBody(node, allowExpressionBody, false, forInit);\n\n    this.yieldPos = oldYieldPos;\n    this.awaitPos = oldAwaitPos;\n    this.awaitIdentPos = oldAwaitIdentPos;\n    return this.finishNode(node, (statement & FUNC_STATEMENT) ? \"FunctionDeclaration\" : \"FunctionExpression\")\n  };\n\n  pp$8.parseFunctionParams = function(node) {\n    this.expect(types$1.parenL);\n    node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n    this.checkYieldAwaitInDefaultParams();\n  };\n\n  // Parse a class declaration or literal (depending on the\n  // `isStatement` parameter).\n\n  pp$8.parseClass = function(node, isStatement) {\n    this.next();\n\n    // ecma-262 14.6 Class Definitions\n    // A class definition is always strict mode code.\n    var oldStrict = this.strict;\n    this.strict = true;\n\n    this.parseClassId(node, isStatement);\n    this.parseClassSuper(node);\n    var privateNameMap = this.enterClassBody();\n    var classBody = this.startNode();\n    var hadConstructor = false;\n    classBody.body = [];\n    this.expect(types$1.braceL);\n    while (this.type !== types$1.braceR) {\n      var element = this.parseClassElement(node.superClass !== null);\n      if (element) {\n        classBody.body.push(element);\n        if (element.type === \"MethodDefinition\" && element.kind === \"constructor\") {\n          if (hadConstructor) { this.raise(element.start, \"Duplicate constructor in the same class\"); }\n          hadConstructor = true;\n        } else if (element.key && element.key.type === \"PrivateIdentifier\" && isPrivateNameConflicted(privateNameMap, element)) {\n          this.raiseRecoverable(element.key.start, (\"Identifier '#\" + (element.key.name) + \"' has already been declared\"));\n        }\n      }\n    }\n    this.strict = oldStrict;\n    this.next();\n    node.body = this.finishNode(classBody, \"ClassBody\");\n    this.exitClassBody();\n    return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n  };\n\n  pp$8.parseClassElement = function(constructorAllowsSuper) {\n    if (this.eat(types$1.semi)) { return null }\n\n    var ecmaVersion = this.options.ecmaVersion;\n    var node = this.startNode();\n    var keyName = \"\";\n    var isGenerator = false;\n    var isAsync = false;\n    var kind = \"method\";\n    var isStatic = false;\n\n    if (this.eatContextual(\"static\")) {\n      // Parse static init block\n      if (ecmaVersion >= 13 && this.eat(types$1.braceL)) {\n        this.parseClassStaticBlock(node);\n        return node\n      }\n      if (this.isClassElementNameStart() || this.type === types$1.star) {\n        isStatic = true;\n      } else {\n        keyName = \"static\";\n      }\n    }\n    node.static = isStatic;\n    if (!keyName && ecmaVersion >= 8 && this.eatContextual(\"async\")) {\n      if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) {\n        isAsync = true;\n      } else {\n        keyName = \"async\";\n      }\n    }\n    if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) {\n      isGenerator = true;\n    }\n    if (!keyName && !isAsync && !isGenerator) {\n      var lastValue = this.value;\n      if (this.eatContextual(\"get\") || this.eatContextual(\"set\")) {\n        if (this.isClassElementNameStart()) {\n          kind = lastValue;\n        } else {\n          keyName = lastValue;\n        }\n      }\n    }\n\n    // Parse element name\n    if (keyName) {\n      // 'async', 'get', 'set', or 'static' were not a keyword contextually.\n      // The last token is any of those. Make it the element name.\n      node.computed = false;\n      node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc);\n      node.key.name = keyName;\n      this.finishNode(node.key, \"Identifier\");\n    } else {\n      this.parseClassElementName(node);\n    }\n\n    // Parse element value\n    if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== \"method\" || isGenerator || isAsync) {\n      var isConstructor = !node.static && checkKeyName(node, \"constructor\");\n      var allowsDirectSuper = isConstructor && constructorAllowsSuper;\n      // Couldn't move this check into the 'parseClassMethod' method for backward compatibility.\n      if (isConstructor && kind !== \"method\") { this.raise(node.key.start, \"Constructor can't have get/set modifier\"); }\n      node.kind = isConstructor ? \"constructor\" : kind;\n      this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper);\n    } else {\n      this.parseClassField(node);\n    }\n\n    return node\n  };\n\n  pp$8.isClassElementNameStart = function() {\n    return (\n      this.type === types$1.name ||\n      this.type === types$1.privateId ||\n      this.type === types$1.num ||\n      this.type === types$1.string ||\n      this.type === types$1.bracketL ||\n      this.type.keyword\n    )\n  };\n\n  pp$8.parseClassElementName = function(element) {\n    if (this.type === types$1.privateId) {\n      if (this.value === \"constructor\") {\n        this.raise(this.start, \"Classes can't have an element named '#constructor'\");\n      }\n      element.computed = false;\n      element.key = this.parsePrivateIdent();\n    } else {\n      this.parsePropertyName(element);\n    }\n  };\n\n  pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {\n    // Check key and flags\n    var key = method.key;\n    if (method.kind === \"constructor\") {\n      if (isGenerator) { this.raise(key.start, \"Constructor can't be a generator\"); }\n      if (isAsync) { this.raise(key.start, \"Constructor can't be an async method\"); }\n    } else if (method.static && checkKeyName(method, \"prototype\")) {\n      this.raise(key.start, \"Classes may not have a static property named prototype\");\n    }\n\n    // Parse value\n    var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);\n\n    // Check value\n    if (method.kind === \"get\" && value.params.length !== 0)\n      { this.raiseRecoverable(value.start, \"getter should have no params\"); }\n    if (method.kind === \"set\" && value.params.length !== 1)\n      { this.raiseRecoverable(value.start, \"setter should have exactly one param\"); }\n    if (method.kind === \"set\" && value.params[0].type === \"RestElement\")\n      { this.raiseRecoverable(value.params[0].start, \"Setter cannot use rest params\"); }\n\n    return this.finishNode(method, \"MethodDefinition\")\n  };\n\n  pp$8.parseClassField = function(field) {\n    if (checkKeyName(field, \"constructor\")) {\n      this.raise(field.key.start, \"Classes can't have a field named 'constructor'\");\n    } else if (field.static && checkKeyName(field, \"prototype\")) {\n      this.raise(field.key.start, \"Classes can't have a static field named 'prototype'\");\n    }\n\n    if (this.eat(types$1.eq)) {\n      // To raise SyntaxError if 'arguments' exists in the initializer.\n      var scope = this.currentThisScope();\n      var inClassFieldInit = scope.inClassFieldInit;\n      scope.inClassFieldInit = true;\n      field.value = this.parseMaybeAssign();\n      scope.inClassFieldInit = inClassFieldInit;\n    } else {\n      field.value = null;\n    }\n    this.semicolon();\n\n    return this.finishNode(field, \"PropertyDefinition\")\n  };\n\n  pp$8.parseClassStaticBlock = function(node) {\n    node.body = [];\n\n    var oldLabels = this.labels;\n    this.labels = [];\n    this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER);\n    while (this.type !== types$1.braceR) {\n      var stmt = this.parseStatement(null);\n      node.body.push(stmt);\n    }\n    this.next();\n    this.exitScope();\n    this.labels = oldLabels;\n\n    return this.finishNode(node, \"StaticBlock\")\n  };\n\n  pp$8.parseClassId = function(node, isStatement) {\n    if (this.type === types$1.name) {\n      node.id = this.parseIdent();\n      if (isStatement)\n        { this.checkLValSimple(node.id, BIND_LEXICAL, false); }\n    } else {\n      if (isStatement === true)\n        { this.unexpected(); }\n      node.id = null;\n    }\n  };\n\n  pp$8.parseClassSuper = function(node) {\n    node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(null, false) : null;\n  };\n\n  pp$8.enterClassBody = function() {\n    var element = {declared: Object.create(null), used: []};\n    this.privateNameStack.push(element);\n    return element.declared\n  };\n\n  pp$8.exitClassBody = function() {\n    var ref = this.privateNameStack.pop();\n    var declared = ref.declared;\n    var used = ref.used;\n    var len = this.privateNameStack.length;\n    var parent = len === 0 ? null : this.privateNameStack[len - 1];\n    for (var i = 0; i < used.length; ++i) {\n      var id = used[i];\n      if (!hasOwn(declared, id.name)) {\n        if (parent) {\n          parent.used.push(id);\n        } else {\n          this.raiseRecoverable(id.start, (\"Private field '#\" + (id.name) + \"' must be declared in an enclosing class\"));\n        }\n      }\n    }\n  };\n\n  function isPrivateNameConflicted(privateNameMap, element) {\n    var name = element.key.name;\n    var curr = privateNameMap[name];\n\n    var next = \"true\";\n    if (element.type === \"MethodDefinition\" && (element.kind === \"get\" || element.kind === \"set\")) {\n      next = (element.static ? \"s\" : \"i\") + element.kind;\n    }\n\n    // `class { get #a(){}; static set #a(_){} }` is also conflict.\n    if (\n      curr === \"iget\" && next === \"iset\" ||\n      curr === \"iset\" && next === \"iget\" ||\n      curr === \"sget\" && next === \"sset\" ||\n      curr === \"sset\" && next === \"sget\"\n    ) {\n      privateNameMap[name] = \"true\";\n      return false\n    } else if (!curr) {\n      privateNameMap[name] = next;\n      return false\n    } else {\n      return true\n    }\n  }\n\n  function checkKeyName(node, name) {\n    var computed = node.computed;\n    var key = node.key;\n    return !computed && (\n      key.type === \"Identifier\" && key.name === name ||\n      key.type === \"Literal\" && key.value === name\n    )\n  }\n\n  // Parses module export declaration.\n\n  pp$8.parseExport = function(node, exports) {\n    this.next();\n    // export * from '...'\n    if (this.eat(types$1.star)) {\n      if (this.options.ecmaVersion >= 11) {\n        if (this.eatContextual(\"as\")) {\n          node.exported = this.parseModuleExportName();\n          this.checkExport(exports, node.exported, this.lastTokStart);\n        } else {\n          node.exported = null;\n        }\n      }\n      this.expectContextual(\"from\");\n      if (this.type !== types$1.string) { this.unexpected(); }\n      node.source = this.parseExprAtom();\n      this.semicolon();\n      return this.finishNode(node, \"ExportAllDeclaration\")\n    }\n    if (this.eat(types$1._default)) { // export default ...\n      this.checkExport(exports, \"default\", this.lastTokStart);\n      var isAsync;\n      if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) {\n        var fNode = this.startNode();\n        this.next();\n        if (isAsync) { this.next(); }\n        node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);\n      } else if (this.type === types$1._class) {\n        var cNode = this.startNode();\n        node.declaration = this.parseClass(cNode, \"nullableID\");\n      } else {\n        node.declaration = this.parseMaybeAssign();\n        this.semicolon();\n      }\n      return this.finishNode(node, \"ExportDefaultDeclaration\")\n    }\n    // export var|const|let|function|class ...\n    if (this.shouldParseExportStatement()) {\n      node.declaration = this.parseStatement(null);\n      if (node.declaration.type === \"VariableDeclaration\")\n        { this.checkVariableExport(exports, node.declaration.declarations); }\n      else\n        { this.checkExport(exports, node.declaration.id, node.declaration.id.start); }\n      node.specifiers = [];\n      node.source = null;\n    } else { // export { x, y as z } [from '...']\n      node.declaration = null;\n      node.specifiers = this.parseExportSpecifiers(exports);\n      if (this.eatContextual(\"from\")) {\n        if (this.type !== types$1.string) { this.unexpected(); }\n        node.source = this.parseExprAtom();\n      } else {\n        for (var i = 0, list = node.specifiers; i < list.length; i += 1) {\n          // check for keywords used as local names\n          var spec = list[i];\n\n          this.checkUnreserved(spec.local);\n          // check if export is defined\n          this.checkLocalExport(spec.local);\n\n          if (spec.local.type === \"Literal\") {\n            this.raise(spec.local.start, \"A string literal cannot be used as an exported binding without `from`.\");\n          }\n        }\n\n        node.source = null;\n      }\n      this.semicolon();\n    }\n    return this.finishNode(node, \"ExportNamedDeclaration\")\n  };\n\n  pp$8.checkExport = function(exports, name, pos) {\n    if (!exports) { return }\n    if (typeof name !== \"string\")\n      { name = name.type === \"Identifier\" ? name.name : name.value; }\n    if (hasOwn(exports, name))\n      { this.raiseRecoverable(pos, \"Duplicate export '\" + name + \"'\"); }\n    exports[name] = true;\n  };\n\n  pp$8.checkPatternExport = function(exports, pat) {\n    var type = pat.type;\n    if (type === \"Identifier\")\n      { this.checkExport(exports, pat, pat.start); }\n    else if (type === \"ObjectPattern\")\n      { for (var i = 0, list = pat.properties; i < list.length; i += 1)\n        {\n          var prop = list[i];\n\n          this.checkPatternExport(exports, prop);\n        } }\n    else if (type === \"ArrayPattern\")\n      { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {\n        var elt = list$1[i$1];\n\n          if (elt) { this.checkPatternExport(exports, elt); }\n      } }\n    else if (type === \"Property\")\n      { this.checkPatternExport(exports, pat.value); }\n    else if (type === \"AssignmentPattern\")\n      { this.checkPatternExport(exports, pat.left); }\n    else if (type === \"RestElement\")\n      { this.checkPatternExport(exports, pat.argument); }\n    else if (type === \"ParenthesizedExpression\")\n      { this.checkPatternExport(exports, pat.expression); }\n  };\n\n  pp$8.checkVariableExport = function(exports, decls) {\n    if (!exports) { return }\n    for (var i = 0, list = decls; i < list.length; i += 1)\n      {\n      var decl = list[i];\n\n      this.checkPatternExport(exports, decl.id);\n    }\n  };\n\n  pp$8.shouldParseExportStatement = function() {\n    return this.type.keyword === \"var\" ||\n      this.type.keyword === \"const\" ||\n      this.type.keyword === \"class\" ||\n      this.type.keyword === \"function\" ||\n      this.isLet() ||\n      this.isAsyncFunction()\n  };\n\n  // Parses a comma-separated list of module exports.\n\n  pp$8.parseExportSpecifiers = function(exports) {\n    var nodes = [], first = true;\n    // export { x, y as z } [from '...']\n    this.expect(types$1.braceL);\n    while (!this.eat(types$1.braceR)) {\n      if (!first) {\n        this.expect(types$1.comma);\n        if (this.afterTrailingComma(types$1.braceR)) { break }\n      } else { first = false; }\n\n      var node = this.startNode();\n      node.local = this.parseModuleExportName();\n      node.exported = this.eatContextual(\"as\") ? this.parseModuleExportName() : node.local;\n      this.checkExport(\n        exports,\n        node.exported,\n        node.exported.start\n      );\n      nodes.push(this.finishNode(node, \"ExportSpecifier\"));\n    }\n    return nodes\n  };\n\n  // Parses import declaration.\n\n  pp$8.parseImport = function(node) {\n    this.next();\n    // import '...'\n    if (this.type === types$1.string) {\n      node.specifiers = empty$1;\n      node.source = this.parseExprAtom();\n    } else {\n      node.specifiers = this.parseImportSpecifiers();\n      this.expectContextual(\"from\");\n      node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected();\n    }\n    this.semicolon();\n    return this.finishNode(node, \"ImportDeclaration\")\n  };\n\n  // Parses a comma-separated list of module imports.\n\n  pp$8.parseImportSpecifiers = function() {\n    var nodes = [], first = true;\n    if (this.type === types$1.name) {\n      // import defaultObj, { x, y as z } from '...'\n      var node = this.startNode();\n      node.local = this.parseIdent();\n      this.checkLValSimple(node.local, BIND_LEXICAL);\n      nodes.push(this.finishNode(node, \"ImportDefaultSpecifier\"));\n      if (!this.eat(types$1.comma)) { return nodes }\n    }\n    if (this.type === types$1.star) {\n      var node$1 = this.startNode();\n      this.next();\n      this.expectContextual(\"as\");\n      node$1.local = this.parseIdent();\n      this.checkLValSimple(node$1.local, BIND_LEXICAL);\n      nodes.push(this.finishNode(node$1, \"ImportNamespaceSpecifier\"));\n      return nodes\n    }\n    this.expect(types$1.braceL);\n    while (!this.eat(types$1.braceR)) {\n      if (!first) {\n        this.expect(types$1.comma);\n        if (this.afterTrailingComma(types$1.braceR)) { break }\n      } else { first = false; }\n\n      var node$2 = this.startNode();\n      node$2.imported = this.parseModuleExportName();\n      if (this.eatContextual(\"as\")) {\n        node$2.local = this.parseIdent();\n      } else {\n        this.checkUnreserved(node$2.imported);\n        node$2.local = node$2.imported;\n      }\n      this.checkLValSimple(node$2.local, BIND_LEXICAL);\n      nodes.push(this.finishNode(node$2, \"ImportSpecifier\"));\n    }\n    return nodes\n  };\n\n  pp$8.parseModuleExportName = function() {\n    if (this.options.ecmaVersion >= 13 && this.type === types$1.string) {\n      var stringLiteral = this.parseLiteral(this.value);\n      if (loneSurrogate.test(stringLiteral.value)) {\n        this.raise(stringLiteral.start, \"An export name cannot include a lone surrogate.\");\n      }\n      return stringLiteral\n    }\n    return this.parseIdent(true)\n  };\n\n  // Set `ExpressionStatement#directive` property for directive prologues.\n  pp$8.adaptDirectivePrologue = function(statements) {\n    for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {\n      statements[i].directive = statements[i].expression.raw.slice(1, -1);\n    }\n  };\n  pp$8.isDirectiveCandidate = function(statement) {\n    return (\n      this.options.ecmaVersion >= 5 &&\n      statement.type === \"ExpressionStatement\" &&\n      statement.expression.type === \"Literal\" &&\n      typeof statement.expression.value === \"string\" &&\n      // Reject parenthesized strings.\n      (this.input[statement.start] === \"\\\"\" || this.input[statement.start] === \"'\")\n    )\n  };\n\n  var pp$7 = Parser.prototype;\n\n  // Convert existing expression atom to assignable pattern\n  // if possible.\n\n  pp$7.toAssignable = function(node, isBinding, refDestructuringErrors) {\n    if (this.options.ecmaVersion >= 6 && node) {\n      switch (node.type) {\n      case \"Identifier\":\n        if (this.inAsync && node.name === \"await\")\n          { this.raise(node.start, \"Cannot use 'await' as identifier inside an async function\"); }\n        break\n\n      case \"ObjectPattern\":\n      case \"ArrayPattern\":\n      case \"AssignmentPattern\":\n      case \"RestElement\":\n        break\n\n      case \"ObjectExpression\":\n        node.type = \"ObjectPattern\";\n        if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n        for (var i = 0, list = node.properties; i < list.length; i += 1) {\n          var prop = list[i];\n\n        this.toAssignable(prop, isBinding);\n          // Early error:\n          //   AssignmentRestProperty[Yield, Await] :\n          //     `...` DestructuringAssignmentTarget[Yield, Await]\n          //\n          //   It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.\n          if (\n            prop.type === \"RestElement\" &&\n            (prop.argument.type === \"ArrayPattern\" || prop.argument.type === \"ObjectPattern\")\n          ) {\n            this.raise(prop.argument.start, \"Unexpected token\");\n          }\n        }\n        break\n\n      case \"Property\":\n        // AssignmentProperty has type === \"Property\"\n        if (node.kind !== \"init\") { this.raise(node.key.start, \"Object pattern can't contain getter or setter\"); }\n        this.toAssignable(node.value, isBinding);\n        break\n\n      case \"ArrayExpression\":\n        node.type = \"ArrayPattern\";\n        if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n        this.toAssignableList(node.elements, isBinding);\n        break\n\n      case \"SpreadElement\":\n        node.type = \"RestElement\";\n        this.toAssignable(node.argument, isBinding);\n        if (node.argument.type === \"AssignmentPattern\")\n          { this.raise(node.argument.start, \"Rest elements cannot have a default value\"); }\n        break\n\n      case \"AssignmentExpression\":\n        if (node.operator !== \"=\") { this.raise(node.left.end, \"Only '=' operator can be used for specifying default value.\"); }\n        node.type = \"AssignmentPattern\";\n        delete node.operator;\n        this.toAssignable(node.left, isBinding);\n        break\n\n      case \"ParenthesizedExpression\":\n        this.toAssignable(node.expression, isBinding, refDestructuringErrors);\n        break\n\n      case \"ChainExpression\":\n        this.raiseRecoverable(node.start, \"Optional chaining cannot appear in left-hand side\");\n        break\n\n      case \"MemberExpression\":\n        if (!isBinding) { break }\n\n      default:\n        this.raise(node.start, \"Assigning to rvalue\");\n      }\n    } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n    return node\n  };\n\n  // Convert list of expression atoms to binding list.\n\n  pp$7.toAssignableList = function(exprList, isBinding) {\n    var end = exprList.length;\n    for (var i = 0; i < end; i++) {\n      var elt = exprList[i];\n      if (elt) { this.toAssignable(elt, isBinding); }\n    }\n    if (end) {\n      var last = exprList[end - 1];\n      if (this.options.ecmaVersion === 6 && isBinding && last && last.type === \"RestElement\" && last.argument.type !== \"Identifier\")\n        { this.unexpected(last.argument.start); }\n    }\n    return exprList\n  };\n\n  // Parses spread element.\n\n  pp$7.parseSpread = function(refDestructuringErrors) {\n    var node = this.startNode();\n    this.next();\n    node.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n    return this.finishNode(node, \"SpreadElement\")\n  };\n\n  pp$7.parseRestBinding = function() {\n    var node = this.startNode();\n    this.next();\n\n    // RestElement inside of a function parameter must be an identifier\n    if (this.options.ecmaVersion === 6 && this.type !== types$1.name)\n      { this.unexpected(); }\n\n    node.argument = this.parseBindingAtom();\n\n    return this.finishNode(node, \"RestElement\")\n  };\n\n  // Parses lvalue (assignable) atom.\n\n  pp$7.parseBindingAtom = function() {\n    if (this.options.ecmaVersion >= 6) {\n      switch (this.type) {\n      case types$1.bracketL:\n        var node = this.startNode();\n        this.next();\n        node.elements = this.parseBindingList(types$1.bracketR, true, true);\n        return this.finishNode(node, \"ArrayPattern\")\n\n      case types$1.braceL:\n        return this.parseObj(true)\n      }\n    }\n    return this.parseIdent()\n  };\n\n  pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma) {\n    var elts = [], first = true;\n    while (!this.eat(close)) {\n      if (first) { first = false; }\n      else { this.expect(types$1.comma); }\n      if (allowEmpty && this.type === types$1.comma) {\n        elts.push(null);\n      } else if (allowTrailingComma && this.afterTrailingComma(close)) {\n        break\n      } else if (this.type === types$1.ellipsis) {\n        var rest = this.parseRestBinding();\n        this.parseBindingListItem(rest);\n        elts.push(rest);\n        if (this.type === types$1.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n        this.expect(close);\n        break\n      } else {\n        var elem = this.parseMaybeDefault(this.start, this.startLoc);\n        this.parseBindingListItem(elem);\n        elts.push(elem);\n      }\n    }\n    return elts\n  };\n\n  pp$7.parseBindingListItem = function(param) {\n    return param\n  };\n\n  // Parses assignment pattern around given atom if possible.\n\n  pp$7.parseMaybeDefault = function(startPos, startLoc, left) {\n    left = left || this.parseBindingAtom();\n    if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left }\n    var node = this.startNodeAt(startPos, startLoc);\n    node.left = left;\n    node.right = this.parseMaybeAssign();\n    return this.finishNode(node, \"AssignmentPattern\")\n  };\n\n  // The following three functions all verify that a node is an lvalue —\n  // something that can be bound, or assigned to. In order to do so, they perform\n  // a variety of checks:\n  //\n  // - Check that none of the bound/assigned-to identifiers are reserved words.\n  // - Record name declarations for bindings in the appropriate scope.\n  // - Check duplicate argument names, if checkClashes is set.\n  //\n  // If a complex binding pattern is encountered (e.g., object and array\n  // destructuring), the entire pattern is recursively checked.\n  //\n  // There are three versions of checkLVal*() appropriate for different\n  // circumstances:\n  //\n  // - checkLValSimple() shall be used if the syntactic construct supports\n  //   nothing other than identifiers and member expressions. Parenthesized\n  //   expressions are also correctly handled. This is generally appropriate for\n  //   constructs for which the spec says\n  //\n  //   > It is a Syntax Error if AssignmentTargetType of [the production] is not\n  //   > simple.\n  //\n  //   It is also appropriate for checking if an identifier is valid and not\n  //   defined elsewhere, like import declarations or function/class identifiers.\n  //\n  //   Examples where this is used include:\n  //     a += …;\n  //     import a from '…';\n  //   where a is the node to be checked.\n  //\n  // - checkLValPattern() shall be used if the syntactic construct supports\n  //   anything checkLValSimple() supports, as well as object and array\n  //   destructuring patterns. This is generally appropriate for constructs for\n  //   which the spec says\n  //\n  //   > It is a Syntax Error if [the production] is neither an ObjectLiteral nor\n  //   > an ArrayLiteral and AssignmentTargetType of [the production] is not\n  //   > simple.\n  //\n  //   Examples where this is used include:\n  //     (a = …);\n  //     const a = …;\n  //     try { … } catch (a) { … }\n  //   where a is the node to be checked.\n  //\n  // - checkLValInnerPattern() shall be used if the syntactic construct supports\n  //   anything checkLValPattern() supports, as well as default assignment\n  //   patterns, rest elements, and other constructs that may appear within an\n  //   object or array destructuring pattern.\n  //\n  //   As a special case, function parameters also use checkLValInnerPattern(),\n  //   as they also support defaults and rest constructs.\n  //\n  // These functions deliberately support both assignment and binding constructs,\n  // as the logic for both is exceedingly similar. If the node is the target of\n  // an assignment, then bindingType should be set to BIND_NONE. Otherwise, it\n  // should be set to the appropriate BIND_* constant, like BIND_VAR or\n  // BIND_LEXICAL.\n  //\n  // If the function is called with a non-BIND_NONE bindingType, then\n  // additionally a checkClashes object may be specified to allow checking for\n  // duplicate argument names. checkClashes is ignored if the provided construct\n  // is an assignment (i.e., bindingType is BIND_NONE).\n\n  pp$7.checkLValSimple = function(expr, bindingType, checkClashes) {\n    if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n    var isBind = bindingType !== BIND_NONE;\n\n    switch (expr.type) {\n    case \"Identifier\":\n      if (this.strict && this.reservedWordsStrictBind.test(expr.name))\n        { this.raiseRecoverable(expr.start, (isBind ? \"Binding \" : \"Assigning to \") + expr.name + \" in strict mode\"); }\n      if (isBind) {\n        if (bindingType === BIND_LEXICAL && expr.name === \"let\")\n          { this.raiseRecoverable(expr.start, \"let is disallowed as a lexically bound name\"); }\n        if (checkClashes) {\n          if (hasOwn(checkClashes, expr.name))\n            { this.raiseRecoverable(expr.start, \"Argument name clash\"); }\n          checkClashes[expr.name] = true;\n        }\n        if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }\n      }\n      break\n\n    case \"ChainExpression\":\n      this.raiseRecoverable(expr.start, \"Optional chaining cannot appear in left-hand side\");\n      break\n\n    case \"MemberExpression\":\n      if (isBind) { this.raiseRecoverable(expr.start, \"Binding member expression\"); }\n      break\n\n    case \"ParenthesizedExpression\":\n      if (isBind) { this.raiseRecoverable(expr.start, \"Binding parenthesized expression\"); }\n      return this.checkLValSimple(expr.expression, bindingType, checkClashes)\n\n    default:\n      this.raise(expr.start, (isBind ? \"Binding\" : \"Assigning to\") + \" rvalue\");\n    }\n  };\n\n  pp$7.checkLValPattern = function(expr, bindingType, checkClashes) {\n    if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n    switch (expr.type) {\n    case \"ObjectPattern\":\n      for (var i = 0, list = expr.properties; i < list.length; i += 1) {\n        var prop = list[i];\n\n      this.checkLValInnerPattern(prop, bindingType, checkClashes);\n      }\n      break\n\n    case \"ArrayPattern\":\n      for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {\n        var elem = list$1[i$1];\n\n      if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); }\n      }\n      break\n\n    default:\n      this.checkLValSimple(expr, bindingType, checkClashes);\n    }\n  };\n\n  pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) {\n    if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n    switch (expr.type) {\n    case \"Property\":\n      // AssignmentProperty has type === \"Property\"\n      this.checkLValInnerPattern(expr.value, bindingType, checkClashes);\n      break\n\n    case \"AssignmentPattern\":\n      this.checkLValPattern(expr.left, bindingType, checkClashes);\n      break\n\n    case \"RestElement\":\n      this.checkLValPattern(expr.argument, bindingType, checkClashes);\n      break\n\n    default:\n      this.checkLValPattern(expr, bindingType, checkClashes);\n    }\n  };\n\n  // The algorithm used to determine whether a regexp can appear at a\n\n  var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {\n    this.token = token;\n    this.isExpr = !!isExpr;\n    this.preserveSpace = !!preserveSpace;\n    this.override = override;\n    this.generator = !!generator;\n  };\n\n  var types = {\n    b_stat: new TokContext(\"{\", false),\n    b_expr: new TokContext(\"{\", true),\n    b_tmpl: new TokContext(\"${\", false),\n    p_stat: new TokContext(\"(\", false),\n    p_expr: new TokContext(\"(\", true),\n    q_tmpl: new TokContext(\"`\", true, true, function (p) { return p.tryReadTemplateToken(); }),\n    f_stat: new TokContext(\"function\", false),\n    f_expr: new TokContext(\"function\", true),\n    f_expr_gen: new TokContext(\"function\", true, false, null, true),\n    f_gen: new TokContext(\"function\", false, false, null, true)\n  };\n\n  var pp$6 = Parser.prototype;\n\n  pp$6.initialContext = function() {\n    return [types.b_stat]\n  };\n\n  pp$6.curContext = function() {\n    return this.context[this.context.length - 1]\n  };\n\n  pp$6.braceIsBlock = function(prevType) {\n    var parent = this.curContext();\n    if (parent === types.f_expr || parent === types.f_stat)\n      { return true }\n    if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr))\n      { return !parent.isExpr }\n\n    // The check for `tt.name && exprAllowed` detects whether we are\n    // after a `yield` or `of` construct. See the `updateContext` for\n    // `tt.name`.\n    if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed)\n      { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }\n    if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow)\n      { return true }\n    if (prevType === types$1.braceL)\n      { return parent === types.b_stat }\n    if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name)\n      { return false }\n    return !this.exprAllowed\n  };\n\n  pp$6.inGeneratorContext = function() {\n    for (var i = this.context.length - 1; i >= 1; i--) {\n      var context = this.context[i];\n      if (context.token === \"function\")\n        { return context.generator }\n    }\n    return false\n  };\n\n  pp$6.updateContext = function(prevType) {\n    var update, type = this.type;\n    if (type.keyword && prevType === types$1.dot)\n      { this.exprAllowed = false; }\n    else if (update = type.updateContext)\n      { update.call(this, prevType); }\n    else\n      { this.exprAllowed = type.beforeExpr; }\n  };\n\n  // Used to handle egde cases when token context could not be inferred correctly during tokenization phase\n\n  pp$6.overrideContext = function(tokenCtx) {\n    if (this.curContext() !== tokenCtx) {\n      this.context[this.context.length - 1] = tokenCtx;\n    }\n  };\n\n  // Token-specific context update code\n\n  types$1.parenR.updateContext = types$1.braceR.updateContext = function() {\n    if (this.context.length === 1) {\n      this.exprAllowed = true;\n      return\n    }\n    var out = this.context.pop();\n    if (out === types.b_stat && this.curContext().token === \"function\") {\n      out = this.context.pop();\n    }\n    this.exprAllowed = !out.isExpr;\n  };\n\n  types$1.braceL.updateContext = function(prevType) {\n    this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);\n    this.exprAllowed = true;\n  };\n\n  types$1.dollarBraceL.updateContext = function() {\n    this.context.push(types.b_tmpl);\n    this.exprAllowed = true;\n  };\n\n  types$1.parenL.updateContext = function(prevType) {\n    var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while;\n    this.context.push(statementParens ? types.p_stat : types.p_expr);\n    this.exprAllowed = true;\n  };\n\n  types$1.incDec.updateContext = function() {\n    // tokExprAllowed stays unchanged\n  };\n\n  types$1._function.updateContext = types$1._class.updateContext = function(prevType) {\n    if (prevType.beforeExpr && prevType !== types$1._else &&\n        !(prevType === types$1.semi && this.curContext() !== types.p_stat) &&\n        !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&\n        !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat))\n      { this.context.push(types.f_expr); }\n    else\n      { this.context.push(types.f_stat); }\n    this.exprAllowed = false;\n  };\n\n  types$1.backQuote.updateContext = function() {\n    if (this.curContext() === types.q_tmpl)\n      { this.context.pop(); }\n    else\n      { this.context.push(types.q_tmpl); }\n    this.exprAllowed = false;\n  };\n\n  types$1.star.updateContext = function(prevType) {\n    if (prevType === types$1._function) {\n      var index = this.context.length - 1;\n      if (this.context[index] === types.f_expr)\n        { this.context[index] = types.f_expr_gen; }\n      else\n        { this.context[index] = types.f_gen; }\n    }\n    this.exprAllowed = true;\n  };\n\n  types$1.name.updateContext = function(prevType) {\n    var allowed = false;\n    if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) {\n      if (this.value === \"of\" && !this.exprAllowed ||\n          this.value === \"yield\" && this.inGeneratorContext())\n        { allowed = true; }\n    }\n    this.exprAllowed = allowed;\n  };\n\n  // A recursive descent parser operates by defining functions for all\n\n  var pp$5 = Parser.prototype;\n\n  // Check if property name clashes with already added.\n  // Object/class getters and setters are not allowed to clash —\n  // either with each other or with an init property — and in\n  // strict mode, init properties are also not allowed to be repeated.\n\n  pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) {\n    if (this.options.ecmaVersion >= 9 && prop.type === \"SpreadElement\")\n      { return }\n    if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))\n      { return }\n    var key = prop.key;\n    var name;\n    switch (key.type) {\n    case \"Identifier\": name = key.name; break\n    case \"Literal\": name = String(key.value); break\n    default: return\n    }\n    var kind = prop.kind;\n    if (this.options.ecmaVersion >= 6) {\n      if (name === \"__proto__\" && kind === \"init\") {\n        if (propHash.proto) {\n          if (refDestructuringErrors) {\n            if (refDestructuringErrors.doubleProto < 0) {\n              refDestructuringErrors.doubleProto = key.start;\n            }\n          } else {\n            this.raiseRecoverable(key.start, \"Redefinition of __proto__ property\");\n          }\n        }\n        propHash.proto = true;\n      }\n      return\n    }\n    name = \"$\" + name;\n    var other = propHash[name];\n    if (other) {\n      var redefinition;\n      if (kind === \"init\") {\n        redefinition = this.strict && other.init || other.get || other.set;\n      } else {\n        redefinition = other.init || other[kind];\n      }\n      if (redefinition)\n        { this.raiseRecoverable(key.start, \"Redefinition of property\"); }\n    } else {\n      other = propHash[name] = {\n        init: false,\n        get: false,\n        set: false\n      };\n    }\n    other[kind] = true;\n  };\n\n  // ### Expression parsing\n\n  // These nest, from the most general expression type at the top to\n  // 'atomic', nondivisible expression types at the bottom. Most of\n  // the functions will simply let the function(s) below them parse,\n  // and, *if* the syntactic construct they handle is present, wrap\n  // the AST node that the inner parser gave them in another node.\n\n  // Parse a full expression. The optional arguments are used to\n  // forbid the `in` operator (in for loops initalization expressions)\n  // and provide reference for storing '=' operator inside shorthand\n  // property assignment in contexts where both object expression\n  // and object pattern might appear (so it's possible to raise\n  // delayed syntax error at correct position).\n\n  pp$5.parseExpression = function(forInit, refDestructuringErrors) {\n    var startPos = this.start, startLoc = this.startLoc;\n    var expr = this.parseMaybeAssign(forInit, refDestructuringErrors);\n    if (this.type === types$1.comma) {\n      var node = this.startNodeAt(startPos, startLoc);\n      node.expressions = [expr];\n      while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); }\n      return this.finishNode(node, \"SequenceExpression\")\n    }\n    return expr\n  };\n\n  // Parse an assignment expression. This includes applications of\n  // operators like `+=`.\n\n  pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) {\n    if (this.isContextual(\"yield\")) {\n      if (this.inGenerator) { return this.parseYield(forInit) }\n      // The tokenizer will assume an expression is allowed after\n      // `yield`, but this isn't that kind of yield\n      else { this.exprAllowed = false; }\n    }\n\n    var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1;\n    if (refDestructuringErrors) {\n      oldParenAssign = refDestructuringErrors.parenthesizedAssign;\n      oldTrailingComma = refDestructuringErrors.trailingComma;\n      oldDoubleProto = refDestructuringErrors.doubleProto;\n      refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;\n    } else {\n      refDestructuringErrors = new DestructuringErrors;\n      ownDestructuringErrors = true;\n    }\n\n    var startPos = this.start, startLoc = this.startLoc;\n    if (this.type === types$1.parenL || this.type === types$1.name) {\n      this.potentialArrowAt = this.start;\n      this.potentialArrowInForAwait = forInit === \"await\";\n    }\n    var left = this.parseMaybeConditional(forInit, refDestructuringErrors);\n    if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }\n    if (this.type.isAssign) {\n      var node = this.startNodeAt(startPos, startLoc);\n      node.operator = this.value;\n      if (this.type === types$1.eq)\n        { left = this.toAssignable(left, false, refDestructuringErrors); }\n      if (!ownDestructuringErrors) {\n        refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;\n      }\n      if (refDestructuringErrors.shorthandAssign >= left.start)\n        { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly\n      if (this.type === types$1.eq)\n        { this.checkLValPattern(left); }\n      else\n        { this.checkLValSimple(left); }\n      node.left = left;\n      this.next();\n      node.right = this.parseMaybeAssign(forInit);\n      if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; }\n      return this.finishNode(node, \"AssignmentExpression\")\n    } else {\n      if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }\n    }\n    if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }\n    if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }\n    return left\n  };\n\n  // Parse a ternary conditional (`?:`) operator.\n\n  pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) {\n    var startPos = this.start, startLoc = this.startLoc;\n    var expr = this.parseExprOps(forInit, refDestructuringErrors);\n    if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n    if (this.eat(types$1.question)) {\n      var node = this.startNodeAt(startPos, startLoc);\n      node.test = expr;\n      node.consequent = this.parseMaybeAssign();\n      this.expect(types$1.colon);\n      node.alternate = this.parseMaybeAssign(forInit);\n      return this.finishNode(node, \"ConditionalExpression\")\n    }\n    return expr\n  };\n\n  // Start the precedence parser.\n\n  pp$5.parseExprOps = function(forInit, refDestructuringErrors) {\n    var startPos = this.start, startLoc = this.startLoc;\n    var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit);\n    if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n    return expr.start === startPos && expr.type === \"ArrowFunctionExpression\" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit)\n  };\n\n  // Parse binary operators with the operator precedence parsing\n  // algorithm. `left` is the left-hand side of the operator.\n  // `minPrec` provides context that allows the function to stop and\n  // defer further parser to one of its callers when it encounters an\n  // operator that has a lower precedence than the set it is parsing.\n\n  pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) {\n    var prec = this.type.binop;\n    if (prec != null && (!forInit || this.type !== types$1._in)) {\n      if (prec > minPrec) {\n        var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND;\n        var coalesce = this.type === types$1.coalesce;\n        if (coalesce) {\n          // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.\n          // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.\n          prec = types$1.logicalAND.binop;\n        }\n        var op = this.value;\n        this.next();\n        var startPos = this.start, startLoc = this.startLoc;\n        var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit);\n        var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);\n        if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) {\n          this.raiseRecoverable(this.start, \"Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses\");\n        }\n        return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit)\n      }\n    }\n    return left\n  };\n\n  pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) {\n    if (right.type === \"PrivateIdentifier\") { this.raise(right.start, \"Private identifier can only be left side of binary expression\"); }\n    var node = this.startNodeAt(startPos, startLoc);\n    node.left = left;\n    node.operator = op;\n    node.right = right;\n    return this.finishNode(node, logical ? \"LogicalExpression\" : \"BinaryExpression\")\n  };\n\n  // Parse unary operators, both prefix and postfix.\n\n  pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) {\n    var startPos = this.start, startLoc = this.startLoc, expr;\n    if (this.isContextual(\"await\") && this.canAwait) {\n      expr = this.parseAwait(forInit);\n      sawUnary = true;\n    } else if (this.type.prefix) {\n      var node = this.startNode(), update = this.type === types$1.incDec;\n      node.operator = this.value;\n      node.prefix = true;\n      this.next();\n      node.argument = this.parseMaybeUnary(null, true, update, forInit);\n      this.checkExpressionErrors(refDestructuringErrors, true);\n      if (update) { this.checkLValSimple(node.argument); }\n      else if (this.strict && node.operator === \"delete\" &&\n               node.argument.type === \"Identifier\")\n        { this.raiseRecoverable(node.start, \"Deleting local variable in strict mode\"); }\n      else if (node.operator === \"delete\" && isPrivateFieldAccess(node.argument))\n        { this.raiseRecoverable(node.start, \"Private fields can not be deleted\"); }\n      else { sawUnary = true; }\n      expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n    } else if (!sawUnary && this.type === types$1.privateId) {\n      if (forInit || this.privateNameStack.length === 0) { this.unexpected(); }\n      expr = this.parsePrivateIdent();\n      // only could be private fields in 'in', such as #x in obj\n      if (this.type !== types$1._in) { this.unexpected(); }\n    } else {\n      expr = this.parseExprSubscripts(refDestructuringErrors, forInit);\n      if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n      while (this.type.postfix && !this.canInsertSemicolon()) {\n        var node$1 = this.startNodeAt(startPos, startLoc);\n        node$1.operator = this.value;\n        node$1.prefix = false;\n        node$1.argument = expr;\n        this.checkLValSimple(expr);\n        this.next();\n        expr = this.finishNode(node$1, \"UpdateExpression\");\n      }\n    }\n\n    if (!incDec && this.eat(types$1.starstar)) {\n      if (sawUnary)\n        { this.unexpected(this.lastTokStart); }\n      else\n        { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), \"**\", false) }\n    } else {\n      return expr\n    }\n  };\n\n  function isPrivateFieldAccess(node) {\n    return (\n      node.type === \"MemberExpression\" && node.property.type === \"PrivateIdentifier\" ||\n      node.type === \"ChainExpression\" && isPrivateFieldAccess(node.expression)\n    )\n  }\n\n  // Parse call, dot, and `[]`-subscript expressions.\n\n  pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) {\n    var startPos = this.start, startLoc = this.startLoc;\n    var expr = this.parseExprAtom(refDestructuringErrors, forInit);\n    if (expr.type === \"ArrowFunctionExpression\" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== \")\")\n      { return expr }\n    var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit);\n    if (refDestructuringErrors && result.type === \"MemberExpression\") {\n      if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }\n      if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }\n      if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; }\n    }\n    return result\n  };\n\n  pp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) {\n    var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === \"Identifier\" && base.name === \"async\" &&\n        this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&\n        this.potentialArrowAt === base.start;\n    var optionalChained = false;\n\n    while (true) {\n      var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit);\n\n      if (element.optional) { optionalChained = true; }\n      if (element === base || element.type === \"ArrowFunctionExpression\") {\n        if (optionalChained) {\n          var chainNode = this.startNodeAt(startPos, startLoc);\n          chainNode.expression = element;\n          element = this.finishNode(chainNode, \"ChainExpression\");\n        }\n        return element\n      }\n\n      base = element;\n    }\n  };\n\n  pp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {\n    var optionalSupported = this.options.ecmaVersion >= 11;\n    var optional = optionalSupported && this.eat(types$1.questionDot);\n    if (noCalls && optional) { this.raise(this.lastTokStart, \"Optional chaining cannot appear in the callee of new expressions\"); }\n\n    var computed = this.eat(types$1.bracketL);\n    if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) {\n      var node = this.startNodeAt(startPos, startLoc);\n      node.object = base;\n      if (computed) {\n        node.property = this.parseExpression();\n        this.expect(types$1.bracketR);\n      } else if (this.type === types$1.privateId && base.type !== \"Super\") {\n        node.property = this.parsePrivateIdent();\n      } else {\n        node.property = this.parseIdent(this.options.allowReserved !== \"never\");\n      }\n      node.computed = !!computed;\n      if (optionalSupported) {\n        node.optional = optional;\n      }\n      base = this.finishNode(node, \"MemberExpression\");\n    } else if (!noCalls && this.eat(types$1.parenL)) {\n      var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n      this.yieldPos = 0;\n      this.awaitPos = 0;\n      this.awaitIdentPos = 0;\n      var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);\n      if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {\n        this.checkPatternErrors(refDestructuringErrors, false);\n        this.checkYieldAwaitInDefaultParams();\n        if (this.awaitIdentPos > 0)\n          { this.raise(this.awaitIdentPos, \"Cannot use 'await' as identifier inside an async function\"); }\n        this.yieldPos = oldYieldPos;\n        this.awaitPos = oldAwaitPos;\n        this.awaitIdentPos = oldAwaitIdentPos;\n        return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit)\n      }\n      this.checkExpressionErrors(refDestructuringErrors, true);\n      this.yieldPos = oldYieldPos || this.yieldPos;\n      this.awaitPos = oldAwaitPos || this.awaitPos;\n      this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;\n      var node$1 = this.startNodeAt(startPos, startLoc);\n      node$1.callee = base;\n      node$1.arguments = exprList;\n      if (optionalSupported) {\n        node$1.optional = optional;\n      }\n      base = this.finishNode(node$1, \"CallExpression\");\n    } else if (this.type === types$1.backQuote) {\n      if (optional || optionalChained) {\n        this.raise(this.start, \"Optional chaining cannot appear in the tag of tagged template expressions\");\n      }\n      var node$2 = this.startNodeAt(startPos, startLoc);\n      node$2.tag = base;\n      node$2.quasi = this.parseTemplate({isTagged: true});\n      base = this.finishNode(node$2, \"TaggedTemplateExpression\");\n    }\n    return base\n  };\n\n  // Parse an atomic expression — either a single token that is an\n  // expression, an expression started by a keyword like `function` or\n  // `new`, or an expression wrapped in punctuation like `()`, `[]`,\n  // or `{}`.\n\n  pp$5.parseExprAtom = function(refDestructuringErrors, forInit) {\n    // If a division operator appears in an expression position, the\n    // tokenizer got confused, and we force it to read a regexp instead.\n    if (this.type === types$1.slash) { this.readRegexp(); }\n\n    var node, canBeArrow = this.potentialArrowAt === this.start;\n    switch (this.type) {\n    case types$1._super:\n      if (!this.allowSuper)\n        { this.raise(this.start, \"'super' keyword outside a method\"); }\n      node = this.startNode();\n      this.next();\n      if (this.type === types$1.parenL && !this.allowDirectSuper)\n        { this.raise(node.start, \"super() call outside constructor of a subclass\"); }\n      // The `super` keyword can appear at below:\n      // SuperProperty:\n      //     super [ Expression ]\n      //     super . IdentifierName\n      // SuperCall:\n      //     super ( Arguments )\n      if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL)\n        { this.unexpected(); }\n      return this.finishNode(node, \"Super\")\n\n    case types$1._this:\n      node = this.startNode();\n      this.next();\n      return this.finishNode(node, \"ThisExpression\")\n\n    case types$1.name:\n      var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;\n      var id = this.parseIdent(false);\n      if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === \"async\" && !this.canInsertSemicolon() && this.eat(types$1._function)) {\n        this.overrideContext(types.f_expr);\n        return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit)\n      }\n      if (canBeArrow && !this.canInsertSemicolon()) {\n        if (this.eat(types$1.arrow))\n          { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) }\n        if (this.options.ecmaVersion >= 8 && id.name === \"async\" && this.type === types$1.name && !containsEsc &&\n            (!this.potentialArrowInForAwait || this.value !== \"of\" || this.containsEsc)) {\n          id = this.parseIdent(false);\n          if (this.canInsertSemicolon() || !this.eat(types$1.arrow))\n            { this.unexpected(); }\n          return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit)\n        }\n      }\n      return id\n\n    case types$1.regexp:\n      var value = this.value;\n      node = this.parseLiteral(value.value);\n      node.regex = {pattern: value.pattern, flags: value.flags};\n      return node\n\n    case types$1.num: case types$1.string:\n      return this.parseLiteral(this.value)\n\n    case types$1._null: case types$1._true: case types$1._false:\n      node = this.startNode();\n      node.value = this.type === types$1._null ? null : this.type === types$1._true;\n      node.raw = this.type.keyword;\n      this.next();\n      return this.finishNode(node, \"Literal\")\n\n    case types$1.parenL:\n      var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit);\n      if (refDestructuringErrors) {\n        if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))\n          { refDestructuringErrors.parenthesizedAssign = start; }\n        if (refDestructuringErrors.parenthesizedBind < 0)\n          { refDestructuringErrors.parenthesizedBind = start; }\n      }\n      return expr\n\n    case types$1.bracketL:\n      node = this.startNode();\n      this.next();\n      node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors);\n      return this.finishNode(node, \"ArrayExpression\")\n\n    case types$1.braceL:\n      this.overrideContext(types.b_expr);\n      return this.parseObj(false, refDestructuringErrors)\n\n    case types$1._function:\n      node = this.startNode();\n      this.next();\n      return this.parseFunction(node, 0)\n\n    case types$1._class:\n      return this.parseClass(this.startNode(), false)\n\n    case types$1._new:\n      return this.parseNew()\n\n    case types$1.backQuote:\n      return this.parseTemplate()\n\n    case types$1._import:\n      if (this.options.ecmaVersion >= 11) {\n        return this.parseExprImport()\n      } else {\n        return this.unexpected()\n      }\n\n    default:\n      this.unexpected();\n    }\n  };\n\n  pp$5.parseExprImport = function() {\n    var node = this.startNode();\n\n    // Consume `import` as an identifier for `import.meta`.\n    // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.\n    if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword import\"); }\n    var meta = this.parseIdent(true);\n\n    switch (this.type) {\n    case types$1.parenL:\n      return this.parseDynamicImport(node)\n    case types$1.dot:\n      node.meta = meta;\n      return this.parseImportMeta(node)\n    default:\n      this.unexpected();\n    }\n  };\n\n  pp$5.parseDynamicImport = function(node) {\n    this.next(); // skip `(`\n\n    // Parse node.source.\n    node.source = this.parseMaybeAssign();\n\n    // Verify ending.\n    if (!this.eat(types$1.parenR)) {\n      var errorPos = this.start;\n      if (this.eat(types$1.comma) && this.eat(types$1.parenR)) {\n        this.raiseRecoverable(errorPos, \"Trailing comma is not allowed in import()\");\n      } else {\n        this.unexpected(errorPos);\n      }\n    }\n\n    return this.finishNode(node, \"ImportExpression\")\n  };\n\n  pp$5.parseImportMeta = function(node) {\n    this.next(); // skip `.`\n\n    var containsEsc = this.containsEsc;\n    node.property = this.parseIdent(true);\n\n    if (node.property.name !== \"meta\")\n      { this.raiseRecoverable(node.property.start, \"The only valid meta property for import is 'import.meta'\"); }\n    if (containsEsc)\n      { this.raiseRecoverable(node.start, \"'import.meta' must not contain escaped characters\"); }\n    if (this.options.sourceType !== \"module\" && !this.options.allowImportExportEverywhere)\n      { this.raiseRecoverable(node.start, \"Cannot use 'import.meta' outside a module\"); }\n\n    return this.finishNode(node, \"MetaProperty\")\n  };\n\n  pp$5.parseLiteral = function(value) {\n    var node = this.startNode();\n    node.value = value;\n    node.raw = this.input.slice(this.start, this.end);\n    if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, \"\"); }\n    this.next();\n    return this.finishNode(node, \"Literal\")\n  };\n\n  pp$5.parseParenExpression = function() {\n    this.expect(types$1.parenL);\n    var val = this.parseExpression();\n    this.expect(types$1.parenR);\n    return val\n  };\n\n  pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) {\n    var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;\n    if (this.options.ecmaVersion >= 6) {\n      this.next();\n\n      var innerStartPos = this.start, innerStartLoc = this.startLoc;\n      var exprList = [], first = true, lastIsComma = false;\n      var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;\n      this.yieldPos = 0;\n      this.awaitPos = 0;\n      // Do not save awaitIdentPos to allow checking awaits nested in parameters\n      while (this.type !== types$1.parenR) {\n        first ? first = false : this.expect(types$1.comma);\n        if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) {\n          lastIsComma = true;\n          break\n        } else if (this.type === types$1.ellipsis) {\n          spreadStart = this.start;\n          exprList.push(this.parseParenItem(this.parseRestBinding()));\n          if (this.type === types$1.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n          break\n        } else {\n          exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));\n        }\n      }\n      var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc;\n      this.expect(types$1.parenR);\n\n      if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {\n        this.checkPatternErrors(refDestructuringErrors, false);\n        this.checkYieldAwaitInDefaultParams();\n        this.yieldPos = oldYieldPos;\n        this.awaitPos = oldAwaitPos;\n        return this.parseParenArrowList(startPos, startLoc, exprList, forInit)\n      }\n\n      if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }\n      if (spreadStart) { this.unexpected(spreadStart); }\n      this.checkExpressionErrors(refDestructuringErrors, true);\n      this.yieldPos = oldYieldPos || this.yieldPos;\n      this.awaitPos = oldAwaitPos || this.awaitPos;\n\n      if (exprList.length > 1) {\n        val = this.startNodeAt(innerStartPos, innerStartLoc);\n        val.expressions = exprList;\n        this.finishNodeAt(val, \"SequenceExpression\", innerEndPos, innerEndLoc);\n      } else {\n        val = exprList[0];\n      }\n    } else {\n      val = this.parseParenExpression();\n    }\n\n    if (this.options.preserveParens) {\n      var par = this.startNodeAt(startPos, startLoc);\n      par.expression = val;\n      return this.finishNode(par, \"ParenthesizedExpression\")\n    } else {\n      return val\n    }\n  };\n\n  pp$5.parseParenItem = function(item) {\n    return item\n  };\n\n  pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) {\n    return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit)\n  };\n\n  // New's precedence is slightly tricky. It must allow its argument to\n  // be a `[]` or dot subscript expression, but not a call — at least,\n  // not without wrapping it in parentheses. Thus, it uses the noCalls\n  // argument to parseSubscripts to prevent it from consuming the\n  // argument list.\n\n  var empty = [];\n\n  pp$5.parseNew = function() {\n    if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword new\"); }\n    var node = this.startNode();\n    var meta = this.parseIdent(true);\n    if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {\n      node.meta = meta;\n      var containsEsc = this.containsEsc;\n      node.property = this.parseIdent(true);\n      if (node.property.name !== \"target\")\n        { this.raiseRecoverable(node.property.start, \"The only valid meta property for new is 'new.target'\"); }\n      if (containsEsc)\n        { this.raiseRecoverable(node.start, \"'new.target' must not contain escaped characters\"); }\n      if (!this.allowNewDotTarget)\n        { this.raiseRecoverable(node.start, \"'new.target' can only be used in functions and class static block\"); }\n      return this.finishNode(node, \"MetaProperty\")\n    }\n    var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import;\n    node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false);\n    if (isImport && node.callee.type === \"ImportExpression\") {\n      this.raise(startPos, \"Cannot use new with import()\");\n    }\n    if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); }\n    else { node.arguments = empty; }\n    return this.finishNode(node, \"NewExpression\")\n  };\n\n  // Parse template expression.\n\n  pp$5.parseTemplateElement = function(ref) {\n    var isTagged = ref.isTagged;\n\n    var elem = this.startNode();\n    if (this.type === types$1.invalidTemplate) {\n      if (!isTagged) {\n        this.raiseRecoverable(this.start, \"Bad escape sequence in untagged template literal\");\n      }\n      elem.value = {\n        raw: this.value,\n        cooked: null\n      };\n    } else {\n      elem.value = {\n        raw: this.input.slice(this.start, this.end).replace(/\\r\\n?/g, \"\\n\"),\n        cooked: this.value\n      };\n    }\n    this.next();\n    elem.tail = this.type === types$1.backQuote;\n    return this.finishNode(elem, \"TemplateElement\")\n  };\n\n  pp$5.parseTemplate = function(ref) {\n    if ( ref === void 0 ) ref = {};\n    var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;\n\n    var node = this.startNode();\n    this.next();\n    node.expressions = [];\n    var curElt = this.parseTemplateElement({isTagged: isTagged});\n    node.quasis = [curElt];\n    while (!curElt.tail) {\n      if (this.type === types$1.eof) { this.raise(this.pos, \"Unterminated template literal\"); }\n      this.expect(types$1.dollarBraceL);\n      node.expressions.push(this.parseExpression());\n      this.expect(types$1.braceR);\n      node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));\n    }\n    this.next();\n    return this.finishNode(node, \"TemplateLiteral\")\n  };\n\n  pp$5.isAsyncProp = function(prop) {\n    return !prop.computed && prop.key.type === \"Identifier\" && prop.key.name === \"async\" &&\n      (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) &&\n      !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n  };\n\n  // Parse an object literal or binding pattern.\n\n  pp$5.parseObj = function(isPattern, refDestructuringErrors) {\n    var node = this.startNode(), first = true, propHash = {};\n    node.properties = [];\n    this.next();\n    while (!this.eat(types$1.braceR)) {\n      if (!first) {\n        this.expect(types$1.comma);\n        if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break }\n      } else { first = false; }\n\n      var prop = this.parseProperty(isPattern, refDestructuringErrors);\n      if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }\n      node.properties.push(prop);\n    }\n    return this.finishNode(node, isPattern ? \"ObjectPattern\" : \"ObjectExpression\")\n  };\n\n  pp$5.parseProperty = function(isPattern, refDestructuringErrors) {\n    var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;\n    if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) {\n      if (isPattern) {\n        prop.argument = this.parseIdent(false);\n        if (this.type === types$1.comma) {\n          this.raise(this.start, \"Comma is not permitted after the rest element\");\n        }\n        return this.finishNode(prop, \"RestElement\")\n      }\n      // Parse argument.\n      prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n      // To disallow trailing comma via `this.toAssignable()`.\n      if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {\n        refDestructuringErrors.trailingComma = this.start;\n      }\n      // Finish\n      return this.finishNode(prop, \"SpreadElement\")\n    }\n    if (this.options.ecmaVersion >= 6) {\n      prop.method = false;\n      prop.shorthand = false;\n      if (isPattern || refDestructuringErrors) {\n        startPos = this.start;\n        startLoc = this.startLoc;\n      }\n      if (!isPattern)\n        { isGenerator = this.eat(types$1.star); }\n    }\n    var containsEsc = this.containsEsc;\n    this.parsePropertyName(prop);\n    if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {\n      isAsync = true;\n      isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star);\n      this.parsePropertyName(prop);\n    } else {\n      isAsync = false;\n    }\n    this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);\n    return this.finishNode(prop, \"Property\")\n  };\n\n  pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {\n    if ((isGenerator || isAsync) && this.type === types$1.colon)\n      { this.unexpected(); }\n\n    if (this.eat(types$1.colon)) {\n      prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);\n      prop.kind = \"init\";\n    } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) {\n      if (isPattern) { this.unexpected(); }\n      prop.kind = \"init\";\n      prop.method = true;\n      prop.value = this.parseMethod(isGenerator, isAsync);\n    } else if (!isPattern && !containsEsc &&\n               this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === \"Identifier\" &&\n               (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n               (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) {\n      if (isGenerator || isAsync) { this.unexpected(); }\n      prop.kind = prop.key.name;\n      this.parsePropertyName(prop);\n      prop.value = this.parseMethod(false);\n      var paramCount = prop.kind === \"get\" ? 0 : 1;\n      if (prop.value.params.length !== paramCount) {\n        var start = prop.value.start;\n        if (prop.kind === \"get\")\n          { this.raiseRecoverable(start, \"getter should have no params\"); }\n        else\n          { this.raiseRecoverable(start, \"setter should have exactly one param\"); }\n      } else {\n        if (prop.kind === \"set\" && prop.value.params[0].type === \"RestElement\")\n          { this.raiseRecoverable(prop.value.params[0].start, \"Setter cannot use rest params\"); }\n      }\n    } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === \"Identifier\") {\n      if (isGenerator || isAsync) { this.unexpected(); }\n      this.checkUnreserved(prop.key);\n      if (prop.key.name === \"await\" && !this.awaitIdentPos)\n        { this.awaitIdentPos = startPos; }\n      prop.kind = \"init\";\n      if (isPattern) {\n        prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n      } else if (this.type === types$1.eq && refDestructuringErrors) {\n        if (refDestructuringErrors.shorthandAssign < 0)\n          { refDestructuringErrors.shorthandAssign = this.start; }\n        prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n      } else {\n        prop.value = this.copyNode(prop.key);\n      }\n      prop.shorthand = true;\n    } else { this.unexpected(); }\n  };\n\n  pp$5.parsePropertyName = function(prop) {\n    if (this.options.ecmaVersion >= 6) {\n      if (this.eat(types$1.bracketL)) {\n        prop.computed = true;\n        prop.key = this.parseMaybeAssign();\n        this.expect(types$1.bracketR);\n        return prop.key\n      } else {\n        prop.computed = false;\n      }\n    }\n    return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== \"never\")\n  };\n\n  // Initialize empty function node.\n\n  pp$5.initFunction = function(node) {\n    node.id = null;\n    if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }\n    if (this.options.ecmaVersion >= 8) { node.async = false; }\n  };\n\n  // Parse object or class method.\n\n  pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {\n    var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n    this.initFunction(node);\n    if (this.options.ecmaVersion >= 6)\n      { node.generator = isGenerator; }\n    if (this.options.ecmaVersion >= 8)\n      { node.async = !!isAsync; }\n\n    this.yieldPos = 0;\n    this.awaitPos = 0;\n    this.awaitIdentPos = 0;\n    this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));\n\n    this.expect(types$1.parenL);\n    node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n    this.checkYieldAwaitInDefaultParams();\n    this.parseFunctionBody(node, false, true, false);\n\n    this.yieldPos = oldYieldPos;\n    this.awaitPos = oldAwaitPos;\n    this.awaitIdentPos = oldAwaitIdentPos;\n    return this.finishNode(node, \"FunctionExpression\")\n  };\n\n  // Parse arrow function expression with given parameters.\n\n  pp$5.parseArrowExpression = function(node, params, isAsync, forInit) {\n    var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n    this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);\n    this.initFunction(node);\n    if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }\n\n    this.yieldPos = 0;\n    this.awaitPos = 0;\n    this.awaitIdentPos = 0;\n\n    node.params = this.toAssignableList(params, true);\n    this.parseFunctionBody(node, true, false, forInit);\n\n    this.yieldPos = oldYieldPos;\n    this.awaitPos = oldAwaitPos;\n    this.awaitIdentPos = oldAwaitIdentPos;\n    return this.finishNode(node, \"ArrowFunctionExpression\")\n  };\n\n  // Parse function body and check parameters.\n\n  pp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) {\n    var isExpression = isArrowFunction && this.type !== types$1.braceL;\n    var oldStrict = this.strict, useStrict = false;\n\n    if (isExpression) {\n      node.body = this.parseMaybeAssign(forInit);\n      node.expression = true;\n      this.checkParams(node, false);\n    } else {\n      var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);\n      if (!oldStrict || nonSimple) {\n        useStrict = this.strictDirective(this.end);\n        // If this is a strict mode function, verify that argument names\n        // are not repeated, and it does not try to bind the words `eval`\n        // or `arguments`.\n        if (useStrict && nonSimple)\n          { this.raiseRecoverable(node.start, \"Illegal 'use strict' directive in function with non-simple parameter list\"); }\n      }\n      // Start a new scope with regard to labels and the `inFunction`\n      // flag (restore them to their old value afterwards).\n      var oldLabels = this.labels;\n      this.labels = [];\n      if (useStrict) { this.strict = true; }\n\n      // Add the params to varDeclaredNames to ensure that an error is thrown\n      // if a let/const declaration in the function clashes with one of the params.\n      this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));\n      // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'\n      if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); }\n      node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);\n      node.expression = false;\n      this.adaptDirectivePrologue(node.body.body);\n      this.labels = oldLabels;\n    }\n    this.exitScope();\n  };\n\n  pp$5.isSimpleParamList = function(params) {\n    for (var i = 0, list = params; i < list.length; i += 1)\n      {\n      var param = list[i];\n\n      if (param.type !== \"Identifier\") { return false\n    } }\n    return true\n  };\n\n  // Checks function params for various disallowed patterns such as using \"eval\"\n  // or \"arguments\" and duplicate parameters.\n\n  pp$5.checkParams = function(node, allowDuplicates) {\n    var nameHash = Object.create(null);\n    for (var i = 0, list = node.params; i < list.length; i += 1)\n      {\n      var param = list[i];\n\n      this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);\n    }\n  };\n\n  // Parses a comma-separated list of expressions, and returns them as\n  // an array. `close` is the token type that ends the list, and\n  // `allowEmpty` can be turned on to allow subsequent commas with\n  // nothing in between them to be parsed as `null` (which is needed\n  // for array literals).\n\n  pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {\n    var elts = [], first = true;\n    while (!this.eat(close)) {\n      if (!first) {\n        this.expect(types$1.comma);\n        if (allowTrailingComma && this.afterTrailingComma(close)) { break }\n      } else { first = false; }\n\n      var elt = (void 0);\n      if (allowEmpty && this.type === types$1.comma)\n        { elt = null; }\n      else if (this.type === types$1.ellipsis) {\n        elt = this.parseSpread(refDestructuringErrors);\n        if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0)\n          { refDestructuringErrors.trailingComma = this.start; }\n      } else {\n        elt = this.parseMaybeAssign(false, refDestructuringErrors);\n      }\n      elts.push(elt);\n    }\n    return elts\n  };\n\n  pp$5.checkUnreserved = function(ref) {\n    var start = ref.start;\n    var end = ref.end;\n    var name = ref.name;\n\n    if (this.inGenerator && name === \"yield\")\n      { this.raiseRecoverable(start, \"Cannot use 'yield' as identifier inside a generator\"); }\n    if (this.inAsync && name === \"await\")\n      { this.raiseRecoverable(start, \"Cannot use 'await' as identifier inside an async function\"); }\n    if (this.currentThisScope().inClassFieldInit && name === \"arguments\")\n      { this.raiseRecoverable(start, \"Cannot use 'arguments' in class field initializer\"); }\n    if (this.inClassStaticBlock && (name === \"arguments\" || name === \"await\"))\n      { this.raise(start, (\"Cannot use \" + name + \" in class static initialization block\")); }\n    if (this.keywords.test(name))\n      { this.raise(start, (\"Unexpected keyword '\" + name + \"'\")); }\n    if (this.options.ecmaVersion < 6 &&\n      this.input.slice(start, end).indexOf(\"\\\\\") !== -1) { return }\n    var re = this.strict ? this.reservedWordsStrict : this.reservedWords;\n    if (re.test(name)) {\n      if (!this.inAsync && name === \"await\")\n        { this.raiseRecoverable(start, \"Cannot use keyword 'await' outside an async function\"); }\n      this.raiseRecoverable(start, (\"The keyword '\" + name + \"' is reserved\"));\n    }\n  };\n\n  // Parse the next token as an identifier. If `liberal` is true (used\n  // when parsing properties), it will also convert keywords into\n  // identifiers.\n\n  pp$5.parseIdent = function(liberal) {\n    var node = this.startNode();\n    if (this.type === types$1.name) {\n      node.name = this.value;\n    } else if (this.type.keyword) {\n      node.name = this.type.keyword;\n\n      // To fix https://github.com/acornjs/acorn/issues/575\n      // `class` and `function` keywords push new context into this.context.\n      // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.\n      // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword\n      if ((node.name === \"class\" || node.name === \"function\") &&\n          (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {\n        this.context.pop();\n      }\n    } else {\n      this.unexpected();\n    }\n    this.next(!!liberal);\n    this.finishNode(node, \"Identifier\");\n    if (!liberal) {\n      this.checkUnreserved(node);\n      if (node.name === \"await\" && !this.awaitIdentPos)\n        { this.awaitIdentPos = node.start; }\n    }\n    return node\n  };\n\n  pp$5.parsePrivateIdent = function() {\n    var node = this.startNode();\n    if (this.type === types$1.privateId) {\n      node.name = this.value;\n    } else {\n      this.unexpected();\n    }\n    this.next();\n    this.finishNode(node, \"PrivateIdentifier\");\n\n    // For validating existence\n    if (this.privateNameStack.length === 0) {\n      this.raise(node.start, (\"Private field '#\" + (node.name) + \"' must be declared in an enclosing class\"));\n    } else {\n      this.privateNameStack[this.privateNameStack.length - 1].used.push(node);\n    }\n\n    return node\n  };\n\n  // Parses yield expression inside generator.\n\n  pp$5.parseYield = function(forInit) {\n    if (!this.yieldPos) { this.yieldPos = this.start; }\n\n    var node = this.startNode();\n    this.next();\n    if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) {\n      node.delegate = false;\n      node.argument = null;\n    } else {\n      node.delegate = this.eat(types$1.star);\n      node.argument = this.parseMaybeAssign(forInit);\n    }\n    return this.finishNode(node, \"YieldExpression\")\n  };\n\n  pp$5.parseAwait = function(forInit) {\n    if (!this.awaitPos) { this.awaitPos = this.start; }\n\n    var node = this.startNode();\n    this.next();\n    node.argument = this.parseMaybeUnary(null, true, false, forInit);\n    return this.finishNode(node, \"AwaitExpression\")\n  };\n\n  var pp$4 = Parser.prototype;\n\n  // This function is used to raise exceptions on parse errors. It\n  // takes an offset integer (into the current `input`) to indicate\n  // the location of the error, attaches the position to the end\n  // of the error message, and then raises a `SyntaxError` with that\n  // message.\n\n  pp$4.raise = function(pos, message) {\n    var loc = getLineInfo(this.input, pos);\n    message += \" (\" + loc.line + \":\" + loc.column + \")\";\n    var err = new SyntaxError(message);\n    err.pos = pos; err.loc = loc; err.raisedAt = this.pos;\n    throw err\n  };\n\n  pp$4.raiseRecoverable = pp$4.raise;\n\n  pp$4.curPosition = function() {\n    if (this.options.locations) {\n      return new Position(this.curLine, this.pos - this.lineStart)\n    }\n  };\n\n  var pp$3 = Parser.prototype;\n\n  var Scope = function Scope(flags) {\n    this.flags = flags;\n    // A list of var-declared names in the current lexical scope\n    this.var = [];\n    // A list of lexically-declared names in the current lexical scope\n    this.lexical = [];\n    // A list of lexically-declared FunctionDeclaration names in the current lexical scope\n    this.functions = [];\n    // A switch to disallow the identifier reference 'arguments'\n    this.inClassFieldInit = false;\n  };\n\n  // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.\n\n  pp$3.enterScope = function(flags) {\n    this.scopeStack.push(new Scope(flags));\n  };\n\n  pp$3.exitScope = function() {\n    this.scopeStack.pop();\n  };\n\n  // The spec says:\n  // > At the top level of a function, or script, function declarations are\n  // > treated like var declarations rather than like lexical declarations.\n  pp$3.treatFunctionsAsVarInScope = function(scope) {\n    return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)\n  };\n\n  pp$3.declareName = function(name, bindingType, pos) {\n    var redeclared = false;\n    if (bindingType === BIND_LEXICAL) {\n      var scope = this.currentScope();\n      redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;\n      scope.lexical.push(name);\n      if (this.inModule && (scope.flags & SCOPE_TOP))\n        { delete this.undefinedExports[name]; }\n    } else if (bindingType === BIND_SIMPLE_CATCH) {\n      var scope$1 = this.currentScope();\n      scope$1.lexical.push(name);\n    } else if (bindingType === BIND_FUNCTION) {\n      var scope$2 = this.currentScope();\n      if (this.treatFunctionsAsVar)\n        { redeclared = scope$2.lexical.indexOf(name) > -1; }\n      else\n        { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }\n      scope$2.functions.push(name);\n    } else {\n      for (var i = this.scopeStack.length - 1; i >= 0; --i) {\n        var scope$3 = this.scopeStack[i];\n        if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||\n            !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {\n          redeclared = true;\n          break\n        }\n        scope$3.var.push(name);\n        if (this.inModule && (scope$3.flags & SCOPE_TOP))\n          { delete this.undefinedExports[name]; }\n        if (scope$3.flags & SCOPE_VAR) { break }\n      }\n    }\n    if (redeclared) { this.raiseRecoverable(pos, (\"Identifier '\" + name + \"' has already been declared\")); }\n  };\n\n  pp$3.checkLocalExport = function(id) {\n    // scope.functions must be empty as Module code is always strict.\n    if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&\n        this.scopeStack[0].var.indexOf(id.name) === -1) {\n      this.undefinedExports[id.name] = id;\n    }\n  };\n\n  pp$3.currentScope = function() {\n    return this.scopeStack[this.scopeStack.length - 1]\n  };\n\n  pp$3.currentVarScope = function() {\n    for (var i = this.scopeStack.length - 1;; i--) {\n      var scope = this.scopeStack[i];\n      if (scope.flags & SCOPE_VAR) { return scope }\n    }\n  };\n\n  // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\n  pp$3.currentThisScope = function() {\n    for (var i = this.scopeStack.length - 1;; i--) {\n      var scope = this.scopeStack[i];\n      if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }\n    }\n  };\n\n  var Node = function Node(parser, pos, loc) {\n    this.type = \"\";\n    this.start = pos;\n    this.end = 0;\n    if (parser.options.locations)\n      { this.loc = new SourceLocation(parser, loc); }\n    if (parser.options.directSourceFile)\n      { this.sourceFile = parser.options.directSourceFile; }\n    if (parser.options.ranges)\n      { this.range = [pos, 0]; }\n  };\n\n  // Start an AST node, attaching a start offset.\n\n  var pp$2 = Parser.prototype;\n\n  pp$2.startNode = function() {\n    return new Node(this, this.start, this.startLoc)\n  };\n\n  pp$2.startNodeAt = function(pos, loc) {\n    return new Node(this, pos, loc)\n  };\n\n  // Finish an AST node, adding `type` and `end` properties.\n\n  function finishNodeAt(node, type, pos, loc) {\n    node.type = type;\n    node.end = pos;\n    if (this.options.locations)\n      { node.loc.end = loc; }\n    if (this.options.ranges)\n      { node.range[1] = pos; }\n    return node\n  }\n\n  pp$2.finishNode = function(node, type) {\n    return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)\n  };\n\n  // Finish node at given position\n\n  pp$2.finishNodeAt = function(node, type, pos, loc) {\n    return finishNodeAt.call(this, node, type, pos, loc)\n  };\n\n  pp$2.copyNode = function(node) {\n    var newNode = new Node(this, node.start, this.startLoc);\n    for (var prop in node) { newNode[prop] = node[prop]; }\n    return newNode\n  };\n\n  // This file contains Unicode properties extracted from the ECMAScript specification.\n  // The lists are extracted like so:\n  // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)\n\n  // #table-binary-unicode-properties\n  var ecma9BinaryProperties = \"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS\";\n  var ecma10BinaryProperties = ecma9BinaryProperties + \" Extended_Pictographic\";\n  var ecma11BinaryProperties = ecma10BinaryProperties;\n  var ecma12BinaryProperties = ecma11BinaryProperties + \" EBase EComp EMod EPres ExtPict\";\n  var ecma13BinaryProperties = ecma12BinaryProperties;\n  var ecma14BinaryProperties = ecma13BinaryProperties;\n\n  var unicodeBinaryProperties = {\n    9: ecma9BinaryProperties,\n    10: ecma10BinaryProperties,\n    11: ecma11BinaryProperties,\n    12: ecma12BinaryProperties,\n    13: ecma13BinaryProperties,\n    14: ecma14BinaryProperties\n  };\n\n  // #table-unicode-general-category-values\n  var unicodeGeneralCategoryValues = \"Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu\";\n\n  // #table-unicode-script-values\n  var ecma9ScriptValues = \"Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb\";\n  var ecma10ScriptValues = ecma9ScriptValues + \" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd\";\n  var ecma11ScriptValues = ecma10ScriptValues + \" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho\";\n  var ecma12ScriptValues = ecma11ScriptValues + \" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi\";\n  var ecma13ScriptValues = ecma12ScriptValues + \" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith\";\n  var ecma14ScriptValues = ecma13ScriptValues + \" Kawi Nag_Mundari Nagm\";\n\n  var unicodeScriptValues = {\n    9: ecma9ScriptValues,\n    10: ecma10ScriptValues,\n    11: ecma11ScriptValues,\n    12: ecma12ScriptValues,\n    13: ecma13ScriptValues,\n    14: ecma14ScriptValues\n  };\n\n  var data = {};\n  function buildUnicodeData(ecmaVersion) {\n    var d = data[ecmaVersion] = {\n      binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + \" \" + unicodeGeneralCategoryValues),\n      nonBinary: {\n        General_Category: wordsRegexp(unicodeGeneralCategoryValues),\n        Script: wordsRegexp(unicodeScriptValues[ecmaVersion])\n      }\n    };\n    d.nonBinary.Script_Extensions = d.nonBinary.Script;\n\n    d.nonBinary.gc = d.nonBinary.General_Category;\n    d.nonBinary.sc = d.nonBinary.Script;\n    d.nonBinary.scx = d.nonBinary.Script_Extensions;\n  }\n\n  for (var i = 0, list = [9, 10, 11, 12, 13, 14]; i < list.length; i += 1) {\n    var ecmaVersion = list[i];\n\n    buildUnicodeData(ecmaVersion);\n  }\n\n  var pp$1 = Parser.prototype;\n\n  var RegExpValidationState = function RegExpValidationState(parser) {\n    this.parser = parser;\n    this.validFlags = \"gim\" + (parser.options.ecmaVersion >= 6 ? \"uy\" : \"\") + (parser.options.ecmaVersion >= 9 ? \"s\" : \"\") + (parser.options.ecmaVersion >= 13 ? \"d\" : \"\");\n    this.unicodeProperties = data[parser.options.ecmaVersion >= 14 ? 14 : parser.options.ecmaVersion];\n    this.source = \"\";\n    this.flags = \"\";\n    this.start = 0;\n    this.switchU = false;\n    this.switchN = false;\n    this.pos = 0;\n    this.lastIntValue = 0;\n    this.lastStringValue = \"\";\n    this.lastAssertionIsQuantifiable = false;\n    this.numCapturingParens = 0;\n    this.maxBackReference = 0;\n    this.groupNames = [];\n    this.backReferenceNames = [];\n  };\n\n  RegExpValidationState.prototype.reset = function reset (start, pattern, flags) {\n    var unicode = flags.indexOf(\"u\") !== -1;\n    this.start = start | 0;\n    this.source = pattern + \"\";\n    this.flags = flags;\n    this.switchU = unicode && this.parser.options.ecmaVersion >= 6;\n    this.switchN = unicode && this.parser.options.ecmaVersion >= 9;\n  };\n\n  RegExpValidationState.prototype.raise = function raise (message) {\n    this.parser.raiseRecoverable(this.start, (\"Invalid regular expression: /\" + (this.source) + \"/: \" + message));\n  };\n\n  // If u flag is given, this returns the code point at the index (it combines a surrogate pair).\n  // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).\n  RegExpValidationState.prototype.at = function at (i, forceU) {\n      if ( forceU === void 0 ) forceU = false;\n\n    var s = this.source;\n    var l = s.length;\n    if (i >= l) {\n      return -1\n    }\n    var c = s.charCodeAt(i);\n    if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {\n      return c\n    }\n    var next = s.charCodeAt(i + 1);\n    return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c\n  };\n\n  RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {\n      if ( forceU === void 0 ) forceU = false;\n\n    var s = this.source;\n    var l = s.length;\n    if (i >= l) {\n      return l\n    }\n    var c = s.charCodeAt(i), next;\n    if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||\n        (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {\n      return i + 1\n    }\n    return i + 2\n  };\n\n  RegExpValidationState.prototype.current = function current (forceU) {\n      if ( forceU === void 0 ) forceU = false;\n\n    return this.at(this.pos, forceU)\n  };\n\n  RegExpValidationState.prototype.lookahead = function lookahead (forceU) {\n      if ( forceU === void 0 ) forceU = false;\n\n    return this.at(this.nextIndex(this.pos, forceU), forceU)\n  };\n\n  RegExpValidationState.prototype.advance = function advance (forceU) {\n      if ( forceU === void 0 ) forceU = false;\n\n    this.pos = this.nextIndex(this.pos, forceU);\n  };\n\n  RegExpValidationState.prototype.eat = function eat (ch, forceU) {\n      if ( forceU === void 0 ) forceU = false;\n\n    if (this.current(forceU) === ch) {\n      this.advance(forceU);\n      return true\n    }\n    return false\n  };\n\n  /**\n   * Validate the flags part of a given RegExpLiteral.\n   *\n   * @param {RegExpValidationState} state The state to validate RegExp.\n   * @returns {void}\n   */\n  pp$1.validateRegExpFlags = function(state) {\n    var validFlags = state.validFlags;\n    var flags = state.flags;\n\n    for (var i = 0; i < flags.length; i++) {\n      var flag = flags.charAt(i);\n      if (validFlags.indexOf(flag) === -1) {\n        this.raise(state.start, \"Invalid regular expression flag\");\n      }\n      if (flags.indexOf(flag, i + 1) > -1) {\n        this.raise(state.start, \"Duplicate regular expression flag\");\n      }\n    }\n  };\n\n  /**\n   * Validate the pattern part of a given RegExpLiteral.\n   *\n   * @param {RegExpValidationState} state The state to validate RegExp.\n   * @returns {void}\n   */\n  pp$1.validateRegExpPattern = function(state) {\n    this.regexp_pattern(state);\n\n    // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of\n    // parsing contains a |GroupName|, reparse with the goal symbol\n    // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*\n    // exception if _P_ did not conform to the grammar, if any elements of _P_\n    // were not matched by the parse, or if any Early Error conditions exist.\n    if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) {\n      state.switchN = true;\n      this.regexp_pattern(state);\n    }\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern\n  pp$1.regexp_pattern = function(state) {\n    state.pos = 0;\n    state.lastIntValue = 0;\n    state.lastStringValue = \"\";\n    state.lastAssertionIsQuantifiable = false;\n    state.numCapturingParens = 0;\n    state.maxBackReference = 0;\n    state.groupNames.length = 0;\n    state.backReferenceNames.length = 0;\n\n    this.regexp_disjunction(state);\n\n    if (state.pos !== state.source.length) {\n      // Make the same messages as V8.\n      if (state.eat(0x29 /* ) */)) {\n        state.raise(\"Unmatched ')'\");\n      }\n      if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {\n        state.raise(\"Lone quantifier brackets\");\n      }\n    }\n    if (state.maxBackReference > state.numCapturingParens) {\n      state.raise(\"Invalid escape\");\n    }\n    for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {\n      var name = list[i];\n\n      if (state.groupNames.indexOf(name) === -1) {\n        state.raise(\"Invalid named capture referenced\");\n      }\n    }\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction\n  pp$1.regexp_disjunction = function(state) {\n    this.regexp_alternative(state);\n    while (state.eat(0x7C /* | */)) {\n      this.regexp_alternative(state);\n    }\n\n    // Make the same message as V8.\n    if (this.regexp_eatQuantifier(state, true)) {\n      state.raise(\"Nothing to repeat\");\n    }\n    if (state.eat(0x7B /* { */)) {\n      state.raise(\"Lone quantifier brackets\");\n    }\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative\n  pp$1.regexp_alternative = function(state) {\n    while (state.pos < state.source.length && this.regexp_eatTerm(state))\n      { }\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term\n  pp$1.regexp_eatTerm = function(state) {\n    if (this.regexp_eatAssertion(state)) {\n      // Handle `QuantifiableAssertion Quantifier` alternative.\n      // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion\n      // is a QuantifiableAssertion.\n      if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {\n        // Make the same message as V8.\n        if (state.switchU) {\n          state.raise(\"Invalid quantifier\");\n        }\n      }\n      return true\n    }\n\n    if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {\n      this.regexp_eatQuantifier(state);\n      return true\n    }\n\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion\n  pp$1.regexp_eatAssertion = function(state) {\n    var start = state.pos;\n    state.lastAssertionIsQuantifiable = false;\n\n    // ^, $\n    if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {\n      return true\n    }\n\n    // \\b \\B\n    if (state.eat(0x5C /* \\ */)) {\n      if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {\n        return true\n      }\n      state.pos = start;\n    }\n\n    // Lookahead / Lookbehind\n    if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {\n      var lookbehind = false;\n      if (this.options.ecmaVersion >= 9) {\n        lookbehind = state.eat(0x3C /* < */);\n      }\n      if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {\n        this.regexp_disjunction(state);\n        if (!state.eat(0x29 /* ) */)) {\n          state.raise(\"Unterminated group\");\n        }\n        state.lastAssertionIsQuantifiable = !lookbehind;\n        return true\n      }\n    }\n\n    state.pos = start;\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier\n  pp$1.regexp_eatQuantifier = function(state, noError) {\n    if ( noError === void 0 ) noError = false;\n\n    if (this.regexp_eatQuantifierPrefix(state, noError)) {\n      state.eat(0x3F /* ? */);\n      return true\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix\n  pp$1.regexp_eatQuantifierPrefix = function(state, noError) {\n    return (\n      state.eat(0x2A /* * */) ||\n      state.eat(0x2B /* + */) ||\n      state.eat(0x3F /* ? */) ||\n      this.regexp_eatBracedQuantifier(state, noError)\n    )\n  };\n  pp$1.regexp_eatBracedQuantifier = function(state, noError) {\n    var start = state.pos;\n    if (state.eat(0x7B /* { */)) {\n      var min = 0, max = -1;\n      if (this.regexp_eatDecimalDigits(state)) {\n        min = state.lastIntValue;\n        if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {\n          max = state.lastIntValue;\n        }\n        if (state.eat(0x7D /* } */)) {\n          // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term\n          if (max !== -1 && max < min && !noError) {\n            state.raise(\"numbers out of order in {} quantifier\");\n          }\n          return true\n        }\n      }\n      if (state.switchU && !noError) {\n        state.raise(\"Incomplete quantifier\");\n      }\n      state.pos = start;\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom\n  pp$1.regexp_eatAtom = function(state) {\n    return (\n      this.regexp_eatPatternCharacters(state) ||\n      state.eat(0x2E /* . */) ||\n      this.regexp_eatReverseSolidusAtomEscape(state) ||\n      this.regexp_eatCharacterClass(state) ||\n      this.regexp_eatUncapturingGroup(state) ||\n      this.regexp_eatCapturingGroup(state)\n    )\n  };\n  pp$1.regexp_eatReverseSolidusAtomEscape = function(state) {\n    var start = state.pos;\n    if (state.eat(0x5C /* \\ */)) {\n      if (this.regexp_eatAtomEscape(state)) {\n        return true\n      }\n      state.pos = start;\n    }\n    return false\n  };\n  pp$1.regexp_eatUncapturingGroup = function(state) {\n    var start = state.pos;\n    if (state.eat(0x28 /* ( */)) {\n      if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) {\n        this.regexp_disjunction(state);\n        if (state.eat(0x29 /* ) */)) {\n          return true\n        }\n        state.raise(\"Unterminated group\");\n      }\n      state.pos = start;\n    }\n    return false\n  };\n  pp$1.regexp_eatCapturingGroup = function(state) {\n    if (state.eat(0x28 /* ( */)) {\n      if (this.options.ecmaVersion >= 9) {\n        this.regexp_groupSpecifier(state);\n      } else if (state.current() === 0x3F /* ? */) {\n        state.raise(\"Invalid group\");\n      }\n      this.regexp_disjunction(state);\n      if (state.eat(0x29 /* ) */)) {\n        state.numCapturingParens += 1;\n        return true\n      }\n      state.raise(\"Unterminated group\");\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom\n  pp$1.regexp_eatExtendedAtom = function(state) {\n    return (\n      state.eat(0x2E /* . */) ||\n      this.regexp_eatReverseSolidusAtomEscape(state) ||\n      this.regexp_eatCharacterClass(state) ||\n      this.regexp_eatUncapturingGroup(state) ||\n      this.regexp_eatCapturingGroup(state) ||\n      this.regexp_eatInvalidBracedQuantifier(state) ||\n      this.regexp_eatExtendedPatternCharacter(state)\n    )\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier\n  pp$1.regexp_eatInvalidBracedQuantifier = function(state) {\n    if (this.regexp_eatBracedQuantifier(state, true)) {\n      state.raise(\"Nothing to repeat\");\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter\n  pp$1.regexp_eatSyntaxCharacter = function(state) {\n    var ch = state.current();\n    if (isSyntaxCharacter(ch)) {\n      state.lastIntValue = ch;\n      state.advance();\n      return true\n    }\n    return false\n  };\n  function isSyntaxCharacter(ch) {\n    return (\n      ch === 0x24 /* $ */ ||\n      ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||\n      ch === 0x2E /* . */ ||\n      ch === 0x3F /* ? */ ||\n      ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||\n      ch >= 0x7B /* { */ && ch <= 0x7D /* } */\n    )\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter\n  // But eat eager.\n  pp$1.regexp_eatPatternCharacters = function(state) {\n    var start = state.pos;\n    var ch = 0;\n    while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {\n      state.advance();\n    }\n    return state.pos !== start\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter\n  pp$1.regexp_eatExtendedPatternCharacter = function(state) {\n    var ch = state.current();\n    if (\n      ch !== -1 &&\n      ch !== 0x24 /* $ */ &&\n      !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&\n      ch !== 0x2E /* . */ &&\n      ch !== 0x3F /* ? */ &&\n      ch !== 0x5B /* [ */ &&\n      ch !== 0x5E /* ^ */ &&\n      ch !== 0x7C /* | */\n    ) {\n      state.advance();\n      return true\n    }\n    return false\n  };\n\n  // GroupSpecifier ::\n  //   [empty]\n  //   `?` GroupName\n  pp$1.regexp_groupSpecifier = function(state) {\n    if (state.eat(0x3F /* ? */)) {\n      if (this.regexp_eatGroupName(state)) {\n        if (state.groupNames.indexOf(state.lastStringValue) !== -1) {\n          state.raise(\"Duplicate capture group name\");\n        }\n        state.groupNames.push(state.lastStringValue);\n        return\n      }\n      state.raise(\"Invalid group\");\n    }\n  };\n\n  // GroupName ::\n  //   `<` RegExpIdentifierName `>`\n  // Note: this updates `state.lastStringValue` property with the eaten name.\n  pp$1.regexp_eatGroupName = function(state) {\n    state.lastStringValue = \"\";\n    if (state.eat(0x3C /* < */)) {\n      if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {\n        return true\n      }\n      state.raise(\"Invalid capture group name\");\n    }\n    return false\n  };\n\n  // RegExpIdentifierName ::\n  //   RegExpIdentifierStart\n  //   RegExpIdentifierName RegExpIdentifierPart\n  // Note: this updates `state.lastStringValue` property with the eaten name.\n  pp$1.regexp_eatRegExpIdentifierName = function(state) {\n    state.lastStringValue = \"\";\n    if (this.regexp_eatRegExpIdentifierStart(state)) {\n      state.lastStringValue += codePointToString(state.lastIntValue);\n      while (this.regexp_eatRegExpIdentifierPart(state)) {\n        state.lastStringValue += codePointToString(state.lastIntValue);\n      }\n      return true\n    }\n    return false\n  };\n\n  // RegExpIdentifierStart ::\n  //   UnicodeIDStart\n  //   `$`\n  //   `_`\n  //   `\\` RegExpUnicodeEscapeSequence[+U]\n  pp$1.regexp_eatRegExpIdentifierStart = function(state) {\n    var start = state.pos;\n    var forceU = this.options.ecmaVersion >= 11;\n    var ch = state.current(forceU);\n    state.advance(forceU);\n\n    if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n      ch = state.lastIntValue;\n    }\n    if (isRegExpIdentifierStart(ch)) {\n      state.lastIntValue = ch;\n      return true\n    }\n\n    state.pos = start;\n    return false\n  };\n  function isRegExpIdentifierStart(ch) {\n    return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */\n  }\n\n  // RegExpIdentifierPart ::\n  //   UnicodeIDContinue\n  //   `$`\n  //   `_`\n  //   `\\` RegExpUnicodeEscapeSequence[+U]\n  //   <ZWNJ>\n  //   <ZWJ>\n  pp$1.regexp_eatRegExpIdentifierPart = function(state) {\n    var start = state.pos;\n    var forceU = this.options.ecmaVersion >= 11;\n    var ch = state.current(forceU);\n    state.advance(forceU);\n\n    if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n      ch = state.lastIntValue;\n    }\n    if (isRegExpIdentifierPart(ch)) {\n      state.lastIntValue = ch;\n      return true\n    }\n\n    state.pos = start;\n    return false\n  };\n  function isRegExpIdentifierPart(ch) {\n    return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape\n  pp$1.regexp_eatAtomEscape = function(state) {\n    if (\n      this.regexp_eatBackReference(state) ||\n      this.regexp_eatCharacterClassEscape(state) ||\n      this.regexp_eatCharacterEscape(state) ||\n      (state.switchN && this.regexp_eatKGroupName(state))\n    ) {\n      return true\n    }\n    if (state.switchU) {\n      // Make the same message as V8.\n      if (state.current() === 0x63 /* c */) {\n        state.raise(\"Invalid unicode escape\");\n      }\n      state.raise(\"Invalid escape\");\n    }\n    return false\n  };\n  pp$1.regexp_eatBackReference = function(state) {\n    var start = state.pos;\n    if (this.regexp_eatDecimalEscape(state)) {\n      var n = state.lastIntValue;\n      if (state.switchU) {\n        // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape\n        if (n > state.maxBackReference) {\n          state.maxBackReference = n;\n        }\n        return true\n      }\n      if (n <= state.numCapturingParens) {\n        return true\n      }\n      state.pos = start;\n    }\n    return false\n  };\n  pp$1.regexp_eatKGroupName = function(state) {\n    if (state.eat(0x6B /* k */)) {\n      if (this.regexp_eatGroupName(state)) {\n        state.backReferenceNames.push(state.lastStringValue);\n        return true\n      }\n      state.raise(\"Invalid named reference\");\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape\n  pp$1.regexp_eatCharacterEscape = function(state) {\n    return (\n      this.regexp_eatControlEscape(state) ||\n      this.regexp_eatCControlLetter(state) ||\n      this.regexp_eatZero(state) ||\n      this.regexp_eatHexEscapeSequence(state) ||\n      this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||\n      (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||\n      this.regexp_eatIdentityEscape(state)\n    )\n  };\n  pp$1.regexp_eatCControlLetter = function(state) {\n    var start = state.pos;\n    if (state.eat(0x63 /* c */)) {\n      if (this.regexp_eatControlLetter(state)) {\n        return true\n      }\n      state.pos = start;\n    }\n    return false\n  };\n  pp$1.regexp_eatZero = function(state) {\n    if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {\n      state.lastIntValue = 0;\n      state.advance();\n      return true\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape\n  pp$1.regexp_eatControlEscape = function(state) {\n    var ch = state.current();\n    if (ch === 0x74 /* t */) {\n      state.lastIntValue = 0x09; /* \\t */\n      state.advance();\n      return true\n    }\n    if (ch === 0x6E /* n */) {\n      state.lastIntValue = 0x0A; /* \\n */\n      state.advance();\n      return true\n    }\n    if (ch === 0x76 /* v */) {\n      state.lastIntValue = 0x0B; /* \\v */\n      state.advance();\n      return true\n    }\n    if (ch === 0x66 /* f */) {\n      state.lastIntValue = 0x0C; /* \\f */\n      state.advance();\n      return true\n    }\n    if (ch === 0x72 /* r */) {\n      state.lastIntValue = 0x0D; /* \\r */\n      state.advance();\n      return true\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter\n  pp$1.regexp_eatControlLetter = function(state) {\n    var ch = state.current();\n    if (isControlLetter(ch)) {\n      state.lastIntValue = ch % 0x20;\n      state.advance();\n      return true\n    }\n    return false\n  };\n  function isControlLetter(ch) {\n    return (\n      (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||\n      (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)\n    )\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence\n  pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n    var start = state.pos;\n    var switchU = forceU || state.switchU;\n\n    if (state.eat(0x75 /* u */)) {\n      if (this.regexp_eatFixedHexDigits(state, 4)) {\n        var lead = state.lastIntValue;\n        if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {\n          var leadSurrogateEnd = state.pos;\n          if (state.eat(0x5C /* \\ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {\n            var trail = state.lastIntValue;\n            if (trail >= 0xDC00 && trail <= 0xDFFF) {\n              state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;\n              return true\n            }\n          }\n          state.pos = leadSurrogateEnd;\n          state.lastIntValue = lead;\n        }\n        return true\n      }\n      if (\n        switchU &&\n        state.eat(0x7B /* { */) &&\n        this.regexp_eatHexDigits(state) &&\n        state.eat(0x7D /* } */) &&\n        isValidUnicode(state.lastIntValue)\n      ) {\n        return true\n      }\n      if (switchU) {\n        state.raise(\"Invalid unicode escape\");\n      }\n      state.pos = start;\n    }\n\n    return false\n  };\n  function isValidUnicode(ch) {\n    return ch >= 0 && ch <= 0x10FFFF\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape\n  pp$1.regexp_eatIdentityEscape = function(state) {\n    if (state.switchU) {\n      if (this.regexp_eatSyntaxCharacter(state)) {\n        return true\n      }\n      if (state.eat(0x2F /* / */)) {\n        state.lastIntValue = 0x2F; /* / */\n        return true\n      }\n      return false\n    }\n\n    var ch = state.current();\n    if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {\n      state.lastIntValue = ch;\n      state.advance();\n      return true\n    }\n\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape\n  pp$1.regexp_eatDecimalEscape = function(state) {\n    state.lastIntValue = 0;\n    var ch = state.current();\n    if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {\n      do {\n        state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n        state.advance();\n      } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)\n      return true\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape\n  pp$1.regexp_eatCharacterClassEscape = function(state) {\n    var ch = state.current();\n\n    if (isCharacterClassEscape(ch)) {\n      state.lastIntValue = -1;\n      state.advance();\n      return true\n    }\n\n    if (\n      state.switchU &&\n      this.options.ecmaVersion >= 9 &&\n      (ch === 0x50 /* P */ || ch === 0x70 /* p */)\n    ) {\n      state.lastIntValue = -1;\n      state.advance();\n      if (\n        state.eat(0x7B /* { */) &&\n        this.regexp_eatUnicodePropertyValueExpression(state) &&\n        state.eat(0x7D /* } */)\n      ) {\n        return true\n      }\n      state.raise(\"Invalid property name\");\n    }\n\n    return false\n  };\n  function isCharacterClassEscape(ch) {\n    return (\n      ch === 0x64 /* d */ ||\n      ch === 0x44 /* D */ ||\n      ch === 0x73 /* s */ ||\n      ch === 0x53 /* S */ ||\n      ch === 0x77 /* w */ ||\n      ch === 0x57 /* W */\n    )\n  }\n\n  // UnicodePropertyValueExpression ::\n  //   UnicodePropertyName `=` UnicodePropertyValue\n  //   LoneUnicodePropertyNameOrValue\n  pp$1.regexp_eatUnicodePropertyValueExpression = function(state) {\n    var start = state.pos;\n\n    // UnicodePropertyName `=` UnicodePropertyValue\n    if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {\n      var name = state.lastStringValue;\n      if (this.regexp_eatUnicodePropertyValue(state)) {\n        var value = state.lastStringValue;\n        this.regexp_validateUnicodePropertyNameAndValue(state, name, value);\n        return true\n      }\n    }\n    state.pos = start;\n\n    // LoneUnicodePropertyNameOrValue\n    if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {\n      var nameOrValue = state.lastStringValue;\n      this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue);\n      return true\n    }\n    return false\n  };\n  pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {\n    if (!hasOwn(state.unicodeProperties.nonBinary, name))\n      { state.raise(\"Invalid property name\"); }\n    if (!state.unicodeProperties.nonBinary[name].test(value))\n      { state.raise(\"Invalid property value\"); }\n  };\n  pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {\n    if (!state.unicodeProperties.binary.test(nameOrValue))\n      { state.raise(\"Invalid property name\"); }\n  };\n\n  // UnicodePropertyName ::\n  //   UnicodePropertyNameCharacters\n  pp$1.regexp_eatUnicodePropertyName = function(state) {\n    var ch = 0;\n    state.lastStringValue = \"\";\n    while (isUnicodePropertyNameCharacter(ch = state.current())) {\n      state.lastStringValue += codePointToString(ch);\n      state.advance();\n    }\n    return state.lastStringValue !== \"\"\n  };\n  function isUnicodePropertyNameCharacter(ch) {\n    return isControlLetter(ch) || ch === 0x5F /* _ */\n  }\n\n  // UnicodePropertyValue ::\n  //   UnicodePropertyValueCharacters\n  pp$1.regexp_eatUnicodePropertyValue = function(state) {\n    var ch = 0;\n    state.lastStringValue = \"\";\n    while (isUnicodePropertyValueCharacter(ch = state.current())) {\n      state.lastStringValue += codePointToString(ch);\n      state.advance();\n    }\n    return state.lastStringValue !== \"\"\n  };\n  function isUnicodePropertyValueCharacter(ch) {\n    return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)\n  }\n\n  // LoneUnicodePropertyNameOrValue ::\n  //   UnicodePropertyValueCharacters\n  pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {\n    return this.regexp_eatUnicodePropertyValue(state)\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass\n  pp$1.regexp_eatCharacterClass = function(state) {\n    if (state.eat(0x5B /* [ */)) {\n      state.eat(0x5E /* ^ */);\n      this.regexp_classRanges(state);\n      if (state.eat(0x5D /* ] */)) {\n        return true\n      }\n      // Unreachable since it threw \"unterminated regular expression\" error before.\n      state.raise(\"Unterminated character class\");\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash\n  pp$1.regexp_classRanges = function(state) {\n    while (this.regexp_eatClassAtom(state)) {\n      var left = state.lastIntValue;\n      if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {\n        var right = state.lastIntValue;\n        if (state.switchU && (left === -1 || right === -1)) {\n          state.raise(\"Invalid character class\");\n        }\n        if (left !== -1 && right !== -1 && left > right) {\n          state.raise(\"Range out of order in character class\");\n        }\n      }\n    }\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash\n  pp$1.regexp_eatClassAtom = function(state) {\n    var start = state.pos;\n\n    if (state.eat(0x5C /* \\ */)) {\n      if (this.regexp_eatClassEscape(state)) {\n        return true\n      }\n      if (state.switchU) {\n        // Make the same message as V8.\n        var ch$1 = state.current();\n        if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {\n          state.raise(\"Invalid class escape\");\n        }\n        state.raise(\"Invalid escape\");\n      }\n      state.pos = start;\n    }\n\n    var ch = state.current();\n    if (ch !== 0x5D /* ] */) {\n      state.lastIntValue = ch;\n      state.advance();\n      return true\n    }\n\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape\n  pp$1.regexp_eatClassEscape = function(state) {\n    var start = state.pos;\n\n    if (state.eat(0x62 /* b */)) {\n      state.lastIntValue = 0x08; /* <BS> */\n      return true\n    }\n\n    if (state.switchU && state.eat(0x2D /* - */)) {\n      state.lastIntValue = 0x2D; /* - */\n      return true\n    }\n\n    if (!state.switchU && state.eat(0x63 /* c */)) {\n      if (this.regexp_eatClassControlLetter(state)) {\n        return true\n      }\n      state.pos = start;\n    }\n\n    return (\n      this.regexp_eatCharacterClassEscape(state) ||\n      this.regexp_eatCharacterEscape(state)\n    )\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter\n  pp$1.regexp_eatClassControlLetter = function(state) {\n    var ch = state.current();\n    if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {\n      state.lastIntValue = ch % 0x20;\n      state.advance();\n      return true\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\n  pp$1.regexp_eatHexEscapeSequence = function(state) {\n    var start = state.pos;\n    if (state.eat(0x78 /* x */)) {\n      if (this.regexp_eatFixedHexDigits(state, 2)) {\n        return true\n      }\n      if (state.switchU) {\n        state.raise(\"Invalid escape\");\n      }\n      state.pos = start;\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits\n  pp$1.regexp_eatDecimalDigits = function(state) {\n    var start = state.pos;\n    var ch = 0;\n    state.lastIntValue = 0;\n    while (isDecimalDigit(ch = state.current())) {\n      state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n      state.advance();\n    }\n    return state.pos !== start\n  };\n  function isDecimalDigit(ch) {\n    return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits\n  pp$1.regexp_eatHexDigits = function(state) {\n    var start = state.pos;\n    var ch = 0;\n    state.lastIntValue = 0;\n    while (isHexDigit(ch = state.current())) {\n      state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n      state.advance();\n    }\n    return state.pos !== start\n  };\n  function isHexDigit(ch) {\n    return (\n      (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||\n      (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||\n      (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)\n    )\n  }\n  function hexToInt(ch) {\n    if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {\n      return 10 + (ch - 0x41 /* A */)\n    }\n    if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {\n      return 10 + (ch - 0x61 /* a */)\n    }\n    return ch - 0x30 /* 0 */\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence\n  // Allows only 0-377(octal) i.e. 0-255(decimal).\n  pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) {\n    if (this.regexp_eatOctalDigit(state)) {\n      var n1 = state.lastIntValue;\n      if (this.regexp_eatOctalDigit(state)) {\n        var n2 = state.lastIntValue;\n        if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {\n          state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;\n        } else {\n          state.lastIntValue = n1 * 8 + n2;\n        }\n      } else {\n        state.lastIntValue = n1;\n      }\n      return true\n    }\n    return false\n  };\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit\n  pp$1.regexp_eatOctalDigit = function(state) {\n    var ch = state.current();\n    if (isOctalDigit(ch)) {\n      state.lastIntValue = ch - 0x30; /* 0 */\n      state.advance();\n      return true\n    }\n    state.lastIntValue = 0;\n    return false\n  };\n  function isOctalDigit(ch) {\n    return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */\n  }\n\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits\n  // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit\n  // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\n  pp$1.regexp_eatFixedHexDigits = function(state, length) {\n    var start = state.pos;\n    state.lastIntValue = 0;\n    for (var i = 0; i < length; ++i) {\n      var ch = state.current();\n      if (!isHexDigit(ch)) {\n        state.pos = start;\n        return false\n      }\n      state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n      state.advance();\n    }\n    return true\n  };\n\n  // Object type used to represent tokens. Note that normally, tokens\n  // simply exist as properties on the parser object. This is only\n  // used for the onToken callback and the external tokenizer.\n\n  var Token = function Token(p) {\n    this.type = p.type;\n    this.value = p.value;\n    this.start = p.start;\n    this.end = p.end;\n    if (p.options.locations)\n      { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }\n    if (p.options.ranges)\n      { this.range = [p.start, p.end]; }\n  };\n\n  // ## Tokenizer\n\n  var pp = Parser.prototype;\n\n  // Move to the next token\n\n  pp.next = function(ignoreEscapeSequenceInKeyword) {\n    if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)\n      { this.raiseRecoverable(this.start, \"Escape sequence in keyword \" + this.type.keyword); }\n    if (this.options.onToken)\n      { this.options.onToken(new Token(this)); }\n\n    this.lastTokEnd = this.end;\n    this.lastTokStart = this.start;\n    this.lastTokEndLoc = this.endLoc;\n    this.lastTokStartLoc = this.startLoc;\n    this.nextToken();\n  };\n\n  pp.getToken = function() {\n    this.next();\n    return new Token(this)\n  };\n\n  // If we're in an ES6 environment, make parsers iterable\n  if (typeof Symbol !== \"undefined\")\n    { pp[Symbol.iterator] = function() {\n      var this$1$1 = this;\n\n      return {\n        next: function () {\n          var token = this$1$1.getToken();\n          return {\n            done: token.type === types$1.eof,\n            value: token\n          }\n        }\n      }\n    }; }\n\n  // Toggle strict mode. Re-reads the next number or string to please\n  // pedantic tests (`\"use strict\"; 010;` should fail).\n\n  // Read a single token, updating the parser object's token-related\n  // properties.\n\n  pp.nextToken = function() {\n    var curContext = this.curContext();\n    if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }\n\n    this.start = this.pos;\n    if (this.options.locations) { this.startLoc = this.curPosition(); }\n    if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) }\n\n    if (curContext.override) { return curContext.override(this) }\n    else { this.readToken(this.fullCharCodeAtPos()); }\n  };\n\n  pp.readToken = function(code) {\n    // Identifier or keyword. '\\uXXXX' sequences are allowed in\n    // identifiers, so '\\' also dispatches to that.\n    if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\\' */)\n      { return this.readWord() }\n\n    return this.getTokenFromCode(code)\n  };\n\n  pp.fullCharCodeAtPos = function() {\n    var code = this.input.charCodeAt(this.pos);\n    if (code <= 0xd7ff || code >= 0xdc00) { return code }\n    var next = this.input.charCodeAt(this.pos + 1);\n    return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00\n  };\n\n  pp.skipBlockComment = function() {\n    var startLoc = this.options.onComment && this.curPosition();\n    var start = this.pos, end = this.input.indexOf(\"*/\", this.pos += 2);\n    if (end === -1) { this.raise(this.pos - 2, \"Unterminated comment\"); }\n    this.pos = end + 2;\n    if (this.options.locations) {\n      for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) {\n        ++this.curLine;\n        pos = this.lineStart = nextBreak;\n      }\n    }\n    if (this.options.onComment)\n      { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,\n                             startLoc, this.curPosition()); }\n  };\n\n  pp.skipLineComment = function(startSkip) {\n    var start = this.pos;\n    var startLoc = this.options.onComment && this.curPosition();\n    var ch = this.input.charCodeAt(this.pos += startSkip);\n    while (this.pos < this.input.length && !isNewLine(ch)) {\n      ch = this.input.charCodeAt(++this.pos);\n    }\n    if (this.options.onComment)\n      { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,\n                             startLoc, this.curPosition()); }\n  };\n\n  // Called at the start of the parse and after every token. Skips\n  // whitespace and comments, and.\n\n  pp.skipSpace = function() {\n    loop: while (this.pos < this.input.length) {\n      var ch = this.input.charCodeAt(this.pos);\n      switch (ch) {\n      case 32: case 160: // ' '\n        ++this.pos;\n        break\n      case 13:\n        if (this.input.charCodeAt(this.pos + 1) === 10) {\n          ++this.pos;\n        }\n      case 10: case 8232: case 8233:\n        ++this.pos;\n        if (this.options.locations) {\n          ++this.curLine;\n          this.lineStart = this.pos;\n        }\n        break\n      case 47: // '/'\n        switch (this.input.charCodeAt(this.pos + 1)) {\n        case 42: // '*'\n          this.skipBlockComment();\n          break\n        case 47:\n          this.skipLineComment(2);\n          break\n        default:\n          break loop\n        }\n        break\n      default:\n        if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n          ++this.pos;\n        } else {\n          break loop\n        }\n      }\n    }\n  };\n\n  // Called at the end of every token. Sets `end`, `val`, and\n  // maintains `context` and `exprAllowed`, and skips the space after\n  // the token, so that the next one's `start` will point at the\n  // right position.\n\n  pp.finishToken = function(type, val) {\n    this.end = this.pos;\n    if (this.options.locations) { this.endLoc = this.curPosition(); }\n    var prevType = this.type;\n    this.type = type;\n    this.value = val;\n\n    this.updateContext(prevType);\n  };\n\n  // ### Token reading\n\n  // This is the function that is called to fetch the next token. It\n  // is somewhat obscure, because it works in character codes rather\n  // than characters, and because operator parsing has been inlined\n  // into it.\n  //\n  // All in the name of speed.\n  //\n  pp.readToken_dot = function() {\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next >= 48 && next <= 57) { return this.readNumber(true) }\n    var next2 = this.input.charCodeAt(this.pos + 2);\n    if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'\n      this.pos += 3;\n      return this.finishToken(types$1.ellipsis)\n    } else {\n      ++this.pos;\n      return this.finishToken(types$1.dot)\n    }\n  };\n\n  pp.readToken_slash = function() { // '/'\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (this.exprAllowed) { ++this.pos; return this.readRegexp() }\n    if (next === 61) { return this.finishOp(types$1.assign, 2) }\n    return this.finishOp(types$1.slash, 1)\n  };\n\n  pp.readToken_mult_modulo_exp = function(code) { // '%*'\n    var next = this.input.charCodeAt(this.pos + 1);\n    var size = 1;\n    var tokentype = code === 42 ? types$1.star : types$1.modulo;\n\n    // exponentiation operator ** and **=\n    if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {\n      ++size;\n      tokentype = types$1.starstar;\n      next = this.input.charCodeAt(this.pos + 2);\n    }\n\n    if (next === 61) { return this.finishOp(types$1.assign, size + 1) }\n    return this.finishOp(tokentype, size)\n  };\n\n  pp.readToken_pipe_amp = function(code) { // '|&'\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next === code) {\n      if (this.options.ecmaVersion >= 12) {\n        var next2 = this.input.charCodeAt(this.pos + 2);\n        if (next2 === 61) { return this.finishOp(types$1.assign, 3) }\n      }\n      return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2)\n    }\n    if (next === 61) { return this.finishOp(types$1.assign, 2) }\n    return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1)\n  };\n\n  pp.readToken_caret = function() { // '^'\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next === 61) { return this.finishOp(types$1.assign, 2) }\n    return this.finishOp(types$1.bitwiseXOR, 1)\n  };\n\n  pp.readToken_plus_min = function(code) { // '+-'\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next === code) {\n      if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&\n          (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {\n        // A `-->` line comment\n        this.skipLineComment(3);\n        this.skipSpace();\n        return this.nextToken()\n      }\n      return this.finishOp(types$1.incDec, 2)\n    }\n    if (next === 61) { return this.finishOp(types$1.assign, 2) }\n    return this.finishOp(types$1.plusMin, 1)\n  };\n\n  pp.readToken_lt_gt = function(code) { // '<>'\n    var next = this.input.charCodeAt(this.pos + 1);\n    var size = 1;\n    if (next === code) {\n      size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;\n      if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) }\n      return this.finishOp(types$1.bitShift, size)\n    }\n    if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n        this.input.charCodeAt(this.pos + 3) === 45) {\n      // `<!--`, an XML-style comment that should be interpreted as a line comment\n      this.skipLineComment(4);\n      this.skipSpace();\n      return this.nextToken()\n    }\n    if (next === 61) { size = 2; }\n    return this.finishOp(types$1.relational, size)\n  };\n\n  pp.readToken_eq_excl = function(code) { // '=!'\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next === 61) { return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) }\n    if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>'\n      this.pos += 2;\n      return this.finishToken(types$1.arrow)\n    }\n    return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1)\n  };\n\n  pp.readToken_question = function() { // '?'\n    var ecmaVersion = this.options.ecmaVersion;\n    if (ecmaVersion >= 11) {\n      var next = this.input.charCodeAt(this.pos + 1);\n      if (next === 46) {\n        var next2 = this.input.charCodeAt(this.pos + 2);\n        if (next2 < 48 || next2 > 57) { return this.finishOp(types$1.questionDot, 2) }\n      }\n      if (next === 63) {\n        if (ecmaVersion >= 12) {\n          var next2$1 = this.input.charCodeAt(this.pos + 2);\n          if (next2$1 === 61) { return this.finishOp(types$1.assign, 3) }\n        }\n        return this.finishOp(types$1.coalesce, 2)\n      }\n    }\n    return this.finishOp(types$1.question, 1)\n  };\n\n  pp.readToken_numberSign = function() { // '#'\n    var ecmaVersion = this.options.ecmaVersion;\n    var code = 35; // '#'\n    if (ecmaVersion >= 13) {\n      ++this.pos;\n      code = this.fullCharCodeAtPos();\n      if (isIdentifierStart(code, true) || code === 92 /* '\\' */) {\n        return this.finishToken(types$1.privateId, this.readWord1())\n      }\n    }\n\n    this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n  };\n\n  pp.getTokenFromCode = function(code) {\n    switch (code) {\n    // The interpretation of a dot depends on whether it is followed\n    // by a digit or another two dots.\n    case 46: // '.'\n      return this.readToken_dot()\n\n    // Punctuation tokens.\n    case 40: ++this.pos; return this.finishToken(types$1.parenL)\n    case 41: ++this.pos; return this.finishToken(types$1.parenR)\n    case 59: ++this.pos; return this.finishToken(types$1.semi)\n    case 44: ++this.pos; return this.finishToken(types$1.comma)\n    case 91: ++this.pos; return this.finishToken(types$1.bracketL)\n    case 93: ++this.pos; return this.finishToken(types$1.bracketR)\n    case 123: ++this.pos; return this.finishToken(types$1.braceL)\n    case 125: ++this.pos; return this.finishToken(types$1.braceR)\n    case 58: ++this.pos; return this.finishToken(types$1.colon)\n\n    case 96: // '`'\n      if (this.options.ecmaVersion < 6) { break }\n      ++this.pos;\n      return this.finishToken(types$1.backQuote)\n\n    case 48: // '0'\n      var next = this.input.charCodeAt(this.pos + 1);\n      if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number\n      if (this.options.ecmaVersion >= 6) {\n        if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number\n        if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number\n      }\n\n    // Anything else beginning with a digit is an integer, octal\n    // number, or float.\n    case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9\n      return this.readNumber(false)\n\n    // Quotes produce strings.\n    case 34: case 39: // '\"', \"'\"\n      return this.readString(code)\n\n    // Operators are parsed inline in tiny state machines. '=' (61) is\n    // often referred to. `finishOp` simply skips the amount of\n    // characters it is given as second argument, and returns a token\n    // of the type given by its first argument.\n    case 47: // '/'\n      return this.readToken_slash()\n\n    case 37: case 42: // '%*'\n      return this.readToken_mult_modulo_exp(code)\n\n    case 124: case 38: // '|&'\n      return this.readToken_pipe_amp(code)\n\n    case 94: // '^'\n      return this.readToken_caret()\n\n    case 43: case 45: // '+-'\n      return this.readToken_plus_min(code)\n\n    case 60: case 62: // '<>'\n      return this.readToken_lt_gt(code)\n\n    case 61: case 33: // '=!'\n      return this.readToken_eq_excl(code)\n\n    case 63: // '?'\n      return this.readToken_question()\n\n    case 126: // '~'\n      return this.finishOp(types$1.prefix, 1)\n\n    case 35: // '#'\n      return this.readToken_numberSign()\n    }\n\n    this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n  };\n\n  pp.finishOp = function(type, size) {\n    var str = this.input.slice(this.pos, this.pos + size);\n    this.pos += size;\n    return this.finishToken(type, str)\n  };\n\n  pp.readRegexp = function() {\n    var escaped, inClass, start = this.pos;\n    for (;;) {\n      if (this.pos >= this.input.length) { this.raise(start, \"Unterminated regular expression\"); }\n      var ch = this.input.charAt(this.pos);\n      if (lineBreak.test(ch)) { this.raise(start, \"Unterminated regular expression\"); }\n      if (!escaped) {\n        if (ch === \"[\") { inClass = true; }\n        else if (ch === \"]\" && inClass) { inClass = false; }\n        else if (ch === \"/\" && !inClass) { break }\n        escaped = ch === \"\\\\\";\n      } else { escaped = false; }\n      ++this.pos;\n    }\n    var pattern = this.input.slice(start, this.pos);\n    ++this.pos;\n    var flagsStart = this.pos;\n    var flags = this.readWord1();\n    if (this.containsEsc) { this.unexpected(flagsStart); }\n\n    // Validate pattern\n    var state = this.regexpState || (this.regexpState = new RegExpValidationState(this));\n    state.reset(start, pattern, flags);\n    this.validateRegExpFlags(state);\n    this.validateRegExpPattern(state);\n\n    // Create Literal#value property value.\n    var value = null;\n    try {\n      value = new RegExp(pattern, flags);\n    } catch (e) {\n      // ESTree requires null if it failed to instantiate RegExp object.\n      // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral\n    }\n\n    return this.finishToken(types$1.regexp, {pattern: pattern, flags: flags, value: value})\n  };\n\n  // Read an integer in the given radix. Return null if zero digits\n  // were read, the integer value otherwise. When `len` is given, this\n  // will return `null` unless the integer has exactly `len` digits.\n\n  pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) {\n    // `len` is used for character escape sequences. In that case, disallow separators.\n    var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined;\n\n    // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b)\n    // and isn't fraction part nor exponent part. In that case, if the first digit\n    // is zero then disallow separators.\n    var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48;\n\n    var start = this.pos, total = 0, lastCode = 0;\n    for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) {\n      var code = this.input.charCodeAt(this.pos), val = (void 0);\n\n      if (allowSeparators && code === 95) {\n        if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed in legacy octal numeric literals\"); }\n        if (lastCode === 95) { this.raiseRecoverable(this.pos, \"Numeric separator must be exactly one underscore\"); }\n        if (i === 0) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed at the first of digits\"); }\n        lastCode = code;\n        continue\n      }\n\n      if (code >= 97) { val = code - 97 + 10; } // a\n      else if (code >= 65) { val = code - 65 + 10; } // A\n      else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9\n      else { val = Infinity; }\n      if (val >= radix) { break }\n      lastCode = code;\n      total = total * radix + val;\n    }\n\n    if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, \"Numeric separator is not allowed at the last of digits\"); }\n    if (this.pos === start || len != null && this.pos - start !== len) { return null }\n\n    return total\n  };\n\n  function stringToNumber(str, isLegacyOctalNumericLiteral) {\n    if (isLegacyOctalNumericLiteral) {\n      return parseInt(str, 8)\n    }\n\n    // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value.\n    return parseFloat(str.replace(/_/g, \"\"))\n  }\n\n  function stringToBigInt(str) {\n    if (typeof BigInt !== \"function\") {\n      return null\n    }\n\n    // `BigInt(value)` throws syntax error if the string contains numeric separators.\n    return BigInt(str.replace(/_/g, \"\"))\n  }\n\n  pp.readRadixNumber = function(radix) {\n    var start = this.pos;\n    this.pos += 2; // 0x\n    var val = this.readInt(radix);\n    if (val == null) { this.raise(this.start + 2, \"Expected number in radix \" + radix); }\n    if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) {\n      val = stringToBigInt(this.input.slice(start, this.pos));\n      ++this.pos;\n    } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n    return this.finishToken(types$1.num, val)\n  };\n\n  // Read an integer, octal integer, or floating-point number.\n\n  pp.readNumber = function(startsWithDot) {\n    var start = this.pos;\n    if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, \"Invalid number\"); }\n    var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48;\n    if (octal && this.strict) { this.raise(start, \"Invalid number\"); }\n    var next = this.input.charCodeAt(this.pos);\n    if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) {\n      var val$1 = stringToBigInt(this.input.slice(start, this.pos));\n      ++this.pos;\n      if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n      return this.finishToken(types$1.num, val$1)\n    }\n    if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; }\n    if (next === 46 && !octal) { // '.'\n      ++this.pos;\n      this.readInt(10);\n      next = this.input.charCodeAt(this.pos);\n    }\n    if ((next === 69 || next === 101) && !octal) { // 'eE'\n      next = this.input.charCodeAt(++this.pos);\n      if (next === 43 || next === 45) { ++this.pos; } // '+-'\n      if (this.readInt(10) === null) { this.raise(start, \"Invalid number\"); }\n    }\n    if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n\n    var val = stringToNumber(this.input.slice(start, this.pos), octal);\n    return this.finishToken(types$1.num, val)\n  };\n\n  // Read a string value, interpreting backslash-escapes.\n\n  pp.readCodePoint = function() {\n    var ch = this.input.charCodeAt(this.pos), code;\n\n    if (ch === 123) { // '{'\n      if (this.options.ecmaVersion < 6) { this.unexpected(); }\n      var codePos = ++this.pos;\n      code = this.readHexChar(this.input.indexOf(\"}\", this.pos) - this.pos);\n      ++this.pos;\n      if (code > 0x10FFFF) { this.invalidStringToken(codePos, \"Code point out of bounds\"); }\n    } else {\n      code = this.readHexChar(4);\n    }\n    return code\n  };\n\n  pp.readString = function(quote) {\n    var out = \"\", chunkStart = ++this.pos;\n    for (;;) {\n      if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated string constant\"); }\n      var ch = this.input.charCodeAt(this.pos);\n      if (ch === quote) { break }\n      if (ch === 92) { // '\\'\n        out += this.input.slice(chunkStart, this.pos);\n        out += this.readEscapedChar(false);\n        chunkStart = this.pos;\n      } else if (ch === 0x2028 || ch === 0x2029) {\n        if (this.options.ecmaVersion < 10) { this.raise(this.start, \"Unterminated string constant\"); }\n        ++this.pos;\n        if (this.options.locations) {\n          this.curLine++;\n          this.lineStart = this.pos;\n        }\n      } else {\n        if (isNewLine(ch)) { this.raise(this.start, \"Unterminated string constant\"); }\n        ++this.pos;\n      }\n    }\n    out += this.input.slice(chunkStart, this.pos++);\n    return this.finishToken(types$1.string, out)\n  };\n\n  // Reads template string tokens.\n\n  var INVALID_TEMPLATE_ESCAPE_ERROR = {};\n\n  pp.tryReadTemplateToken = function() {\n    this.inTemplateElement = true;\n    try {\n      this.readTmplToken();\n    } catch (err) {\n      if (err === INVALID_TEMPLATE_ESCAPE_ERROR) {\n        this.readInvalidTemplateToken();\n      } else {\n        throw err\n      }\n    }\n\n    this.inTemplateElement = false;\n  };\n\n  pp.invalidStringToken = function(position, message) {\n    if (this.inTemplateElement && this.options.ecmaVersion >= 9) {\n      throw INVALID_TEMPLATE_ESCAPE_ERROR\n    } else {\n      this.raise(position, message);\n    }\n  };\n\n  pp.readTmplToken = function() {\n    var out = \"\", chunkStart = this.pos;\n    for (;;) {\n      if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated template\"); }\n      var ch = this.input.charCodeAt(this.pos);\n      if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${'\n        if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) {\n          if (ch === 36) {\n            this.pos += 2;\n            return this.finishToken(types$1.dollarBraceL)\n          } else {\n            ++this.pos;\n            return this.finishToken(types$1.backQuote)\n          }\n        }\n        out += this.input.slice(chunkStart, this.pos);\n        return this.finishToken(types$1.template, out)\n      }\n      if (ch === 92) { // '\\'\n        out += this.input.slice(chunkStart, this.pos);\n        out += this.readEscapedChar(true);\n        chunkStart = this.pos;\n      } else if (isNewLine(ch)) {\n        out += this.input.slice(chunkStart, this.pos);\n        ++this.pos;\n        switch (ch) {\n        case 13:\n          if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; }\n        case 10:\n          out += \"\\n\";\n          break\n        default:\n          out += String.fromCharCode(ch);\n          break\n        }\n        if (this.options.locations) {\n          ++this.curLine;\n          this.lineStart = this.pos;\n        }\n        chunkStart = this.pos;\n      } else {\n        ++this.pos;\n      }\n    }\n  };\n\n  // Reads a template token to search for the end, without validating any escape sequences\n  pp.readInvalidTemplateToken = function() {\n    for (; this.pos < this.input.length; this.pos++) {\n      switch (this.input[this.pos]) {\n      case \"\\\\\":\n        ++this.pos;\n        break\n\n      case \"$\":\n        if (this.input[this.pos + 1] !== \"{\") {\n          break\n        }\n\n      // falls through\n      case \"`\":\n        return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos))\n\n      // no default\n      }\n    }\n    this.raise(this.start, \"Unterminated template\");\n  };\n\n  // Used to read escaped characters\n\n  pp.readEscapedChar = function(inTemplate) {\n    var ch = this.input.charCodeAt(++this.pos);\n    ++this.pos;\n    switch (ch) {\n    case 110: return \"\\n\" // 'n' -> '\\n'\n    case 114: return \"\\r\" // 'r' -> '\\r'\n    case 120: return String.fromCharCode(this.readHexChar(2)) // 'x'\n    case 117: return codePointToString(this.readCodePoint()) // 'u'\n    case 116: return \"\\t\" // 't' -> '\\t'\n    case 98: return \"\\b\" // 'b' -> '\\b'\n    case 118: return \"\\u000b\" // 'v' -> '\\u000b'\n    case 102: return \"\\f\" // 'f' -> '\\f'\n    case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\\r\\n'\n    case 10: // ' \\n'\n      if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }\n      return \"\"\n    case 56:\n    case 57:\n      if (this.strict) {\n        this.invalidStringToken(\n          this.pos - 1,\n          \"Invalid escape sequence\"\n        );\n      }\n      if (inTemplate) {\n        var codePos = this.pos - 1;\n\n        this.invalidStringToken(\n          codePos,\n          \"Invalid escape sequence in template string\"\n        );\n      }\n    default:\n      if (ch >= 48 && ch <= 55) {\n        var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0];\n        var octal = parseInt(octalStr, 8);\n        if (octal > 255) {\n          octalStr = octalStr.slice(0, -1);\n          octal = parseInt(octalStr, 8);\n        }\n        this.pos += octalStr.length - 1;\n        ch = this.input.charCodeAt(this.pos);\n        if ((octalStr !== \"0\" || ch === 56 || ch === 57) && (this.strict || inTemplate)) {\n          this.invalidStringToken(\n            this.pos - 1 - octalStr.length,\n            inTemplate\n              ? \"Octal literal in template string\"\n              : \"Octal literal in strict mode\"\n          );\n        }\n        return String.fromCharCode(octal)\n      }\n      if (isNewLine(ch)) {\n        // Unicode new line characters after \\ get removed from output in both\n        // template literals and strings\n        return \"\"\n      }\n      return String.fromCharCode(ch)\n    }\n  };\n\n  // Used to read character escape sequences ('\\x', '\\u', '\\U').\n\n  pp.readHexChar = function(len) {\n    var codePos = this.pos;\n    var n = this.readInt(16, len);\n    if (n === null) { this.invalidStringToken(codePos, \"Bad character escape sequence\"); }\n    return n\n  };\n\n  // Read an identifier, and return it as a string. Sets `this.containsEsc`\n  // to whether the word contained a '\\u' escape.\n  //\n  // Incrementally adds only escaped chars, adding other chunks as-is\n  // as a micro-optimization.\n\n  pp.readWord1 = function() {\n    this.containsEsc = false;\n    var word = \"\", first = true, chunkStart = this.pos;\n    var astral = this.options.ecmaVersion >= 6;\n    while (this.pos < this.input.length) {\n      var ch = this.fullCharCodeAtPos();\n      if (isIdentifierChar(ch, astral)) {\n        this.pos += ch <= 0xffff ? 1 : 2;\n      } else if (ch === 92) { // \"\\\"\n        this.containsEsc = true;\n        word += this.input.slice(chunkStart, this.pos);\n        var escStart = this.pos;\n        if (this.input.charCodeAt(++this.pos) !== 117) // \"u\"\n          { this.invalidStringToken(this.pos, \"Expecting Unicode escape sequence \\\\uXXXX\"); }\n        ++this.pos;\n        var esc = this.readCodePoint();\n        if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral))\n          { this.invalidStringToken(escStart, \"Invalid Unicode escape\"); }\n        word += codePointToString(esc);\n        chunkStart = this.pos;\n      } else {\n        break\n      }\n      first = false;\n    }\n    return word + this.input.slice(chunkStart, this.pos)\n  };\n\n  // Read an identifier or keyword token. Will check for reserved\n  // words when necessary.\n\n  pp.readWord = function() {\n    var word = this.readWord1();\n    var type = types$1.name;\n    if (this.keywords.test(word)) {\n      type = keywords[word];\n    }\n    return this.finishToken(type, word)\n  };\n\n  // Acorn is a tiny, fast JavaScript parser written in JavaScript.\n\n  var version = \"8.8.2\";\n\n  Parser.acorn = {\n    Parser: Parser,\n    version: version,\n    defaultOptions: defaultOptions,\n    Position: Position,\n    SourceLocation: SourceLocation,\n    getLineInfo: getLineInfo,\n    Node: Node,\n    TokenType: TokenType,\n    tokTypes: types$1,\n    keywordTypes: keywords,\n    TokContext: TokContext,\n    tokContexts: types,\n    isIdentifierChar: isIdentifierChar,\n    isIdentifierStart: isIdentifierStart,\n    Token: Token,\n    isNewLine: isNewLine,\n    lineBreak: lineBreak,\n    lineBreakG: lineBreakG,\n    nonASCIIwhitespace: nonASCIIwhitespace\n  };\n\n  // The main exported interface (under `self.acorn` when in the\n  // browser) is a `parse` function that takes a code string and\n  // returns an abstract syntax tree as specified by [Mozilla parser\n  // API][api].\n  //\n  // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API\n\n  function parse(input, options) {\n    return Parser.parse(input, options)\n  }\n\n  // This function tries to parse a single expression at a given\n  // offset in a string. Useful for parsing mixed-language formats\n  // that embed JavaScript expressions.\n\n  function parseExpressionAt(input, pos, options) {\n    return Parser.parseExpressionAt(input, pos, options)\n  }\n\n  // Acorn is organized as a tokenizer and a recursive-descent parser.\n  // The `tokenizer` export provides an interface to the tokenizer.\n\n  function tokenizer(input, options) {\n    return Parser.tokenizer(input, options)\n  }\n\n  exports.Node = Node;\n  exports.Parser = Parser;\n  exports.Position = Position;\n  exports.SourceLocation = SourceLocation;\n  exports.TokContext = TokContext;\n  exports.Token = Token;\n  exports.TokenType = TokenType;\n  exports.defaultOptions = defaultOptions;\n  exports.getLineInfo = getLineInfo;\n  exports.isIdentifierChar = isIdentifierChar;\n  exports.isIdentifierStart = isIdentifierStart;\n  exports.isNewLine = isNewLine;\n  exports.keywordTypes = keywords;\n  exports.lineBreak = lineBreak;\n  exports.lineBreakG = lineBreakG;\n  exports.nonASCIIwhitespace = nonASCIIwhitespace;\n  exports.parse = parse;\n  exports.parseExpressionAt = parseExpressionAt;\n  exports.tokContexts = types;\n  exports.tokTypes = types$1;\n  exports.tokenizer = tokenizer;\n  exports.version = version;\n\n}));\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/dist/acorn.mjs",
    "content": "// This file was generated. Do not modify manually!\nvar astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];\n\n// This file was generated. Do not modify manually!\nvar astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];\n\n// This file was generated. Do not modify manually!\nvar nonASCIIidentifierChars = \"\\u200c\\u200d\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0898-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1ace\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n\n// This file was generated. Do not modify manually!\nvar nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088e\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c88\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7ca\\ua7d0\\ua7d1\\ua7d3\\ua7d5-\\ua7d9\\ua7f2-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n\n// These are a run-length and offset encoded representation of the\n\n// Reserved word lists for various dialects of the language\n\nvar reservedWords = {\n  3: \"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\",\n  5: \"class enum extends super const export import\",\n  6: \"enum\",\n  strict: \"implements interface let package private protected public static yield\",\n  strictBind: \"eval arguments\"\n};\n\n// And the keywords\n\nvar ecma5AndLessKeywords = \"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\";\n\nvar keywords$1 = {\n  5: ecma5AndLessKeywords,\n  \"5module\": ecma5AndLessKeywords + \" export import\",\n  6: ecma5AndLessKeywords + \" const class extends export import super\"\n};\n\nvar keywordRelationalOperator = /^in(stanceof)?$/;\n\n// ## Character categories\n\nvar nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\nvar nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code, set) {\n  var pos = 0x10000;\n  for (var i = 0; i < set.length; i += 2) {\n    pos += set[i];\n    if (pos > code) { return false }\n    pos += set[i + 1];\n    if (pos >= code) { return true }\n  }\n  return false\n}\n\n// Test whether a given character code starts an identifier.\n\nfunction isIdentifierStart(code, astral) {\n  if (code < 65) { return code === 36 }\n  if (code < 91) { return true }\n  if (code < 97) { return code === 95 }\n  if (code < 123) { return true }\n  if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }\n  if (astral === false) { return false }\n  return isInAstralSet(code, astralIdentifierStartCodes)\n}\n\n// Test whether a given character is part of an identifier.\n\nfunction isIdentifierChar(code, astral) {\n  if (code < 48) { return code === 36 }\n  if (code < 58) { return true }\n  if (code < 65) { return false }\n  if (code < 91) { return true }\n  if (code < 97) { return code === 95 }\n  if (code < 123) { return true }\n  if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }\n  if (astral === false) { return false }\n  return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)\n}\n\n// ## Token types\n\n// The assignment of fine-grained, information-carrying type objects\n// allows the tokenizer to store the information it has about a\n// token in a way that is very cheap for the parser to look up.\n\n// All token type variables start with an underscore, to make them\n// easy to recognize.\n\n// The `beforeExpr` property is used to disambiguate between regular\n// expressions and divisions. It is set on all token types that can\n// be followed by an expression (thus, a slash after them would be a\n// regular expression).\n//\n// The `startsExpr` property is used to check if the token ends a\n// `yield` expression. It is set on all token types that either can\n// directly start an expression (like a quotation mark) or can\n// continue an expression (like the body of a string).\n//\n// `isLoop` marks a keyword as starting a loop, which is important\n// to know when parsing a label, in order to allow or disallow\n// continue jumps to that label.\n\nvar TokenType = function TokenType(label, conf) {\n  if ( conf === void 0 ) conf = {};\n\n  this.label = label;\n  this.keyword = conf.keyword;\n  this.beforeExpr = !!conf.beforeExpr;\n  this.startsExpr = !!conf.startsExpr;\n  this.isLoop = !!conf.isLoop;\n  this.isAssign = !!conf.isAssign;\n  this.prefix = !!conf.prefix;\n  this.postfix = !!conf.postfix;\n  this.binop = conf.binop || null;\n  this.updateContext = null;\n};\n\nfunction binop(name, prec) {\n  return new TokenType(name, {beforeExpr: true, binop: prec})\n}\nvar beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};\n\n// Map keyword names to token types.\n\nvar keywords = {};\n\n// Succinct definitions of keyword token types\nfunction kw(name, options) {\n  if ( options === void 0 ) options = {};\n\n  options.keyword = name;\n  return keywords[name] = new TokenType(name, options)\n}\n\nvar types$1 = {\n  num: new TokenType(\"num\", startsExpr),\n  regexp: new TokenType(\"regexp\", startsExpr),\n  string: new TokenType(\"string\", startsExpr),\n  name: new TokenType(\"name\", startsExpr),\n  privateId: new TokenType(\"privateId\", startsExpr),\n  eof: new TokenType(\"eof\"),\n\n  // Punctuation token types.\n  bracketL: new TokenType(\"[\", {beforeExpr: true, startsExpr: true}),\n  bracketR: new TokenType(\"]\"),\n  braceL: new TokenType(\"{\", {beforeExpr: true, startsExpr: true}),\n  braceR: new TokenType(\"}\"),\n  parenL: new TokenType(\"(\", {beforeExpr: true, startsExpr: true}),\n  parenR: new TokenType(\")\"),\n  comma: new TokenType(\",\", beforeExpr),\n  semi: new TokenType(\";\", beforeExpr),\n  colon: new TokenType(\":\", beforeExpr),\n  dot: new TokenType(\".\"),\n  question: new TokenType(\"?\", beforeExpr),\n  questionDot: new TokenType(\"?.\"),\n  arrow: new TokenType(\"=>\", beforeExpr),\n  template: new TokenType(\"template\"),\n  invalidTemplate: new TokenType(\"invalidTemplate\"),\n  ellipsis: new TokenType(\"...\", beforeExpr),\n  backQuote: new TokenType(\"`\", startsExpr),\n  dollarBraceL: new TokenType(\"${\", {beforeExpr: true, startsExpr: true}),\n\n  // Operators. These carry several kinds of properties to help the\n  // parser use them properly (the presence of these properties is\n  // what categorizes them as operators).\n  //\n  // `binop`, when present, specifies that this operator is a binary\n  // operator, and will refer to its precedence.\n  //\n  // `prefix` and `postfix` mark the operator as a prefix or postfix\n  // unary operator.\n  //\n  // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n  // binary operators with a very low precedence, that should result\n  // in AssignmentExpression nodes.\n\n  eq: new TokenType(\"=\", {beforeExpr: true, isAssign: true}),\n  assign: new TokenType(\"_=\", {beforeExpr: true, isAssign: true}),\n  incDec: new TokenType(\"++/--\", {prefix: true, postfix: true, startsExpr: true}),\n  prefix: new TokenType(\"!/~\", {beforeExpr: true, prefix: true, startsExpr: true}),\n  logicalOR: binop(\"||\", 1),\n  logicalAND: binop(\"&&\", 2),\n  bitwiseOR: binop(\"|\", 3),\n  bitwiseXOR: binop(\"^\", 4),\n  bitwiseAND: binop(\"&\", 5),\n  equality: binop(\"==/!=/===/!==\", 6),\n  relational: binop(\"</>/<=/>=\", 7),\n  bitShift: binop(\"<</>>/>>>\", 8),\n  plusMin: new TokenType(\"+/-\", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),\n  modulo: binop(\"%\", 10),\n  star: binop(\"*\", 10),\n  slash: binop(\"/\", 10),\n  starstar: new TokenType(\"**\", {beforeExpr: true}),\n  coalesce: binop(\"??\", 1),\n\n  // Keyword token types.\n  _break: kw(\"break\"),\n  _case: kw(\"case\", beforeExpr),\n  _catch: kw(\"catch\"),\n  _continue: kw(\"continue\"),\n  _debugger: kw(\"debugger\"),\n  _default: kw(\"default\", beforeExpr),\n  _do: kw(\"do\", {isLoop: true, beforeExpr: true}),\n  _else: kw(\"else\", beforeExpr),\n  _finally: kw(\"finally\"),\n  _for: kw(\"for\", {isLoop: true}),\n  _function: kw(\"function\", startsExpr),\n  _if: kw(\"if\"),\n  _return: kw(\"return\", beforeExpr),\n  _switch: kw(\"switch\"),\n  _throw: kw(\"throw\", beforeExpr),\n  _try: kw(\"try\"),\n  _var: kw(\"var\"),\n  _const: kw(\"const\"),\n  _while: kw(\"while\", {isLoop: true}),\n  _with: kw(\"with\"),\n  _new: kw(\"new\", {beforeExpr: true, startsExpr: true}),\n  _this: kw(\"this\", startsExpr),\n  _super: kw(\"super\", startsExpr),\n  _class: kw(\"class\", startsExpr),\n  _extends: kw(\"extends\", beforeExpr),\n  _export: kw(\"export\"),\n  _import: kw(\"import\", startsExpr),\n  _null: kw(\"null\", startsExpr),\n  _true: kw(\"true\", startsExpr),\n  _false: kw(\"false\", startsExpr),\n  _in: kw(\"in\", {beforeExpr: true, binop: 7}),\n  _instanceof: kw(\"instanceof\", {beforeExpr: true, binop: 7}),\n  _typeof: kw(\"typeof\", {beforeExpr: true, prefix: true, startsExpr: true}),\n  _void: kw(\"void\", {beforeExpr: true, prefix: true, startsExpr: true}),\n  _delete: kw(\"delete\", {beforeExpr: true, prefix: true, startsExpr: true})\n};\n\n// Matches a whole line break (where CRLF is considered a single\n// line break). Used to count lines.\n\nvar lineBreak = /\\r\\n?|\\n|\\u2028|\\u2029/;\nvar lineBreakG = new RegExp(lineBreak.source, \"g\");\n\nfunction isNewLine(code) {\n  return code === 10 || code === 13 || code === 0x2028 || code === 0x2029\n}\n\nfunction nextLineBreak(code, from, end) {\n  if ( end === void 0 ) end = code.length;\n\n  for (var i = from; i < end; i++) {\n    var next = code.charCodeAt(i);\n    if (isNewLine(next))\n      { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 }\n  }\n  return -1\n}\n\nvar nonASCIIwhitespace = /[\\u1680\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n\nvar skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\nvar ref = Object.prototype;\nvar hasOwnProperty = ref.hasOwnProperty;\nvar toString = ref.toString;\n\nvar hasOwn = Object.hasOwn || (function (obj, propName) { return (\n  hasOwnProperty.call(obj, propName)\n); });\n\nvar isArray = Array.isArray || (function (obj) { return (\n  toString.call(obj) === \"[object Array]\"\n); });\n\nfunction wordsRegexp(words) {\n  return new RegExp(\"^(?:\" + words.replace(/ /g, \"|\") + \")$\")\n}\n\nfunction codePointToString(code) {\n  // UTF-16 Decoding\n  if (code <= 0xFFFF) { return String.fromCharCode(code) }\n  code -= 0x10000;\n  return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)\n}\n\nvar loneSurrogate = /(?:[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/;\n\n// These are used when `options.locations` is on, for the\n// `startLoc` and `endLoc` properties.\n\nvar Position = function Position(line, col) {\n  this.line = line;\n  this.column = col;\n};\n\nPosition.prototype.offset = function offset (n) {\n  return new Position(this.line, this.column + n)\n};\n\nvar SourceLocation = function SourceLocation(p, start, end) {\n  this.start = start;\n  this.end = end;\n  if (p.sourceFile !== null) { this.source = p.sourceFile; }\n};\n\n// The `getLineInfo` function is mostly useful when the\n// `locations` option is off (for performance reasons) and you\n// want to find the line/column position for a given character\n// offset. `input` should be the code string that the offset refers\n// into.\n\nfunction getLineInfo(input, offset) {\n  for (var line = 1, cur = 0;;) {\n    var nextBreak = nextLineBreak(input, cur, offset);\n    if (nextBreak < 0) { return new Position(line, offset - cur) }\n    ++line;\n    cur = nextBreak;\n  }\n}\n\n// A second argument must be given to configure the parser process.\n// These options are recognized (only `ecmaVersion` is required):\n\nvar defaultOptions = {\n  // `ecmaVersion` indicates the ECMAScript version to parse. Must be\n  // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10\n  // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `\"latest\"`\n  // (the latest version the library supports). This influences\n  // support for strict mode, the set of reserved words, and support\n  // for new syntax features.\n  ecmaVersion: null,\n  // `sourceType` indicates the mode the code should be parsed in.\n  // Can be either `\"script\"` or `\"module\"`. This influences global\n  // strict mode and parsing of `import` and `export` declarations.\n  sourceType: \"script\",\n  // `onInsertedSemicolon` can be a callback that will be called\n  // when a semicolon is automatically inserted. It will be passed\n  // the position of the comma as an offset, and if `locations` is\n  // enabled, it is given the location as a `{line, column}` object\n  // as second argument.\n  onInsertedSemicolon: null,\n  // `onTrailingComma` is similar to `onInsertedSemicolon`, but for\n  // trailing commas.\n  onTrailingComma: null,\n  // By default, reserved words are only enforced if ecmaVersion >= 5.\n  // Set `allowReserved` to a boolean value to explicitly turn this on\n  // an off. When this option has the value \"never\", reserved words\n  // and keywords can also not be used as property names.\n  allowReserved: null,\n  // When enabled, a return at the top level is not considered an\n  // error.\n  allowReturnOutsideFunction: false,\n  // When enabled, import/export statements are not constrained to\n  // appearing at the top of the program, and an import.meta expression\n  // in a script isn't considered an error.\n  allowImportExportEverywhere: false,\n  // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022.\n  // When enabled, await identifiers are allowed to appear at the top-level scope,\n  // but they are still not allowed in non-async functions.\n  allowAwaitOutsideFunction: null,\n  // When enabled, super identifiers are not constrained to\n  // appearing in methods and do not raise an error when they appear elsewhere.\n  allowSuperOutsideMethod: null,\n  // When enabled, hashbang directive in the beginning of file is\n  // allowed and treated as a line comment. Enabled by default when\n  // `ecmaVersion` >= 2023.\n  allowHashBang: false,\n  // When `locations` is on, `loc` properties holding objects with\n  // `start` and `end` properties in `{line, column}` form (with\n  // line being 1-based and column 0-based) will be attached to the\n  // nodes.\n  locations: false,\n  // A function can be passed as `onToken` option, which will\n  // cause Acorn to call that function with object in the same\n  // format as tokens returned from `tokenizer().getToken()`. Note\n  // that you are not allowed to call the parser from the\n  // callback—that will corrupt its internal state.\n  onToken: null,\n  // A function can be passed as `onComment` option, which will\n  // cause Acorn to call that function with `(block, text, start,\n  // end)` parameters whenever a comment is skipped. `block` is a\n  // boolean indicating whether this is a block (`/* */`) comment,\n  // `text` is the content of the comment, and `start` and `end` are\n  // character offsets that denote the start and end of the comment.\n  // When the `locations` option is on, two more parameters are\n  // passed, the full `{line, column}` locations of the start and\n  // end of the comments. Note that you are not allowed to call the\n  // parser from the callback—that will corrupt its internal state.\n  onComment: null,\n  // Nodes have their start and end characters offsets recorded in\n  // `start` and `end` properties (directly on the node, rather than\n  // the `loc` object, which holds line/column data. To also add a\n  // [semi-standardized][range] `range` property holding a `[start,\n  // end]` array with the same numbers, set the `ranges` option to\n  // `true`.\n  //\n  // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n  ranges: false,\n  // It is possible to parse multiple files into a single AST by\n  // passing the tree produced by parsing the first file as\n  // `program` option in subsequent parses. This will add the\n  // toplevel forms of the parsed file to the `Program` (top) node\n  // of an existing parse tree.\n  program: null,\n  // When `locations` is on, you can pass this to record the source\n  // file in every node's `loc` object.\n  sourceFile: null,\n  // This value, if given, is stored in every node, whether\n  // `locations` is on or off.\n  directSourceFile: null,\n  // When enabled, parenthesized expressions are represented by\n  // (non-standard) ParenthesizedExpression nodes\n  preserveParens: false\n};\n\n// Interpret and default an options object\n\nvar warnedAboutEcmaVersion = false;\n\nfunction getOptions(opts) {\n  var options = {};\n\n  for (var opt in defaultOptions)\n    { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; }\n\n  if (options.ecmaVersion === \"latest\") {\n    options.ecmaVersion = 1e8;\n  } else if (options.ecmaVersion == null) {\n    if (!warnedAboutEcmaVersion && typeof console === \"object\" && console.warn) {\n      warnedAboutEcmaVersion = true;\n      console.warn(\"Since Acorn 8.0.0, options.ecmaVersion is required.\\nDefaulting to 2020, but this will stop working in the future.\");\n    }\n    options.ecmaVersion = 11;\n  } else if (options.ecmaVersion >= 2015) {\n    options.ecmaVersion -= 2009;\n  }\n\n  if (options.allowReserved == null)\n    { options.allowReserved = options.ecmaVersion < 5; }\n\n  if (!opts || opts.allowHashBang == null)\n    { options.allowHashBang = options.ecmaVersion >= 14; }\n\n  if (isArray(options.onToken)) {\n    var tokens = options.onToken;\n    options.onToken = function (token) { return tokens.push(token); };\n  }\n  if (isArray(options.onComment))\n    { options.onComment = pushComment(options, options.onComment); }\n\n  return options\n}\n\nfunction pushComment(options, array) {\n  return function(block, text, start, end, startLoc, endLoc) {\n    var comment = {\n      type: block ? \"Block\" : \"Line\",\n      value: text,\n      start: start,\n      end: end\n    };\n    if (options.locations)\n      { comment.loc = new SourceLocation(this, startLoc, endLoc); }\n    if (options.ranges)\n      { comment.range = [start, end]; }\n    array.push(comment);\n  }\n}\n\n// Each scope gets a bitset that may contain these flags\nvar\n    SCOPE_TOP = 1,\n    SCOPE_FUNCTION = 2,\n    SCOPE_ASYNC = 4,\n    SCOPE_GENERATOR = 8,\n    SCOPE_ARROW = 16,\n    SCOPE_SIMPLE_CATCH = 32,\n    SCOPE_SUPER = 64,\n    SCOPE_DIRECT_SUPER = 128,\n    SCOPE_CLASS_STATIC_BLOCK = 256,\n    SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK;\n\nfunction functionFlags(async, generator) {\n  return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)\n}\n\n// Used in checkLVal* and declareName to determine the type of a binding\nvar\n    BIND_NONE = 0, // Not a binding\n    BIND_VAR = 1, // Var-style binding\n    BIND_LEXICAL = 2, // Let- or const-style binding\n    BIND_FUNCTION = 3, // Function declaration\n    BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding\n    BIND_OUTSIDE = 5; // Special case for function names as bound inside the function\n\nvar Parser = function Parser(options, input, startPos) {\n  this.options = options = getOptions(options);\n  this.sourceFile = options.sourceFile;\n  this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === \"module\" ? \"5module\" : 5]);\n  var reserved = \"\";\n  if (options.allowReserved !== true) {\n    reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3];\n    if (options.sourceType === \"module\") { reserved += \" await\"; }\n  }\n  this.reservedWords = wordsRegexp(reserved);\n  var reservedStrict = (reserved ? reserved + \" \" : \"\") + reservedWords.strict;\n  this.reservedWordsStrict = wordsRegexp(reservedStrict);\n  this.reservedWordsStrictBind = wordsRegexp(reservedStrict + \" \" + reservedWords.strictBind);\n  this.input = String(input);\n\n  // Used to signal to callers of `readWord1` whether the word\n  // contained any escape sequences. This is needed because words with\n  // escape sequences must not be interpreted as keywords.\n  this.containsEsc = false;\n\n  // Set up token state\n\n  // The current position of the tokenizer in the input.\n  if (startPos) {\n    this.pos = startPos;\n    this.lineStart = this.input.lastIndexOf(\"\\n\", startPos - 1) + 1;\n    this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;\n  } else {\n    this.pos = this.lineStart = 0;\n    this.curLine = 1;\n  }\n\n  // Properties of the current token:\n  // Its type\n  this.type = types$1.eof;\n  // For tokens that include more information than their type, the value\n  this.value = null;\n  // Its start and end offset\n  this.start = this.end = this.pos;\n  // And, if locations are used, the {line, column} object\n  // corresponding to those offsets\n  this.startLoc = this.endLoc = this.curPosition();\n\n  // Position information for the previous token\n  this.lastTokEndLoc = this.lastTokStartLoc = null;\n  this.lastTokStart = this.lastTokEnd = this.pos;\n\n  // The context stack is used to superficially track syntactic\n  // context to predict whether a regular expression is allowed in a\n  // given position.\n  this.context = this.initialContext();\n  this.exprAllowed = true;\n\n  // Figure out if it's a module code.\n  this.inModule = options.sourceType === \"module\";\n  this.strict = this.inModule || this.strictDirective(this.pos);\n\n  // Used to signify the start of a potential arrow function\n  this.potentialArrowAt = -1;\n  this.potentialArrowInForAwait = false;\n\n  // Positions to delayed-check that yield/await does not exist in default parameters.\n  this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;\n  // Labels in scope.\n  this.labels = [];\n  // Thus-far undefined exports.\n  this.undefinedExports = Object.create(null);\n\n  // If enabled, skip leading hashbang line.\n  if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === \"#!\")\n    { this.skipLineComment(2); }\n\n  // Scope tracking for duplicate variable names (see scope.js)\n  this.scopeStack = [];\n  this.enterScope(SCOPE_TOP);\n\n  // For RegExp validation\n  this.regexpState = null;\n\n  // The stack of private names.\n  // Each element has two properties: 'declared' and 'used'.\n  // When it exited from the outermost class definition, all used private names must be declared.\n  this.privateNameStack = [];\n};\n\nvar prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } };\n\nParser.prototype.parse = function parse () {\n  var node = this.options.program || this.startNode();\n  this.nextToken();\n  return this.parseTopLevel(node)\n};\n\nprototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };\n\nprototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit };\n\nprototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit };\n\nprototypeAccessors.canAwait.get = function () {\n  for (var i = this.scopeStack.length - 1; i >= 0; i--) {\n    var scope = this.scopeStack[i];\n    if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false }\n    if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 }\n  }\n  return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction\n};\n\nprototypeAccessors.allowSuper.get = function () {\n  var ref = this.currentThisScope();\n    var flags = ref.flags;\n    var inClassFieldInit = ref.inClassFieldInit;\n  return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod\n};\n\nprototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };\n\nprototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };\n\nprototypeAccessors.allowNewDotTarget.get = function () {\n  var ref = this.currentThisScope();\n    var flags = ref.flags;\n    var inClassFieldInit = ref.inClassFieldInit;\n  return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit\n};\n\nprototypeAccessors.inClassStaticBlock.get = function () {\n  return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0\n};\n\nParser.extend = function extend () {\n    var plugins = [], len = arguments.length;\n    while ( len-- ) plugins[ len ] = arguments[ len ];\n\n  var cls = this;\n  for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }\n  return cls\n};\n\nParser.parse = function parse (input, options) {\n  return new this(options, input).parse()\n};\n\nParser.parseExpressionAt = function parseExpressionAt (input, pos, options) {\n  var parser = new this(options, input, pos);\n  parser.nextToken();\n  return parser.parseExpression()\n};\n\nParser.tokenizer = function tokenizer (input, options) {\n  return new this(options, input)\n};\n\nObject.defineProperties( Parser.prototype, prototypeAccessors );\n\nvar pp$9 = Parser.prototype;\n\n// ## Parser utilities\n\nvar literal = /^(?:'((?:\\\\.|[^'\\\\])*?)'|\"((?:\\\\.|[^\"\\\\])*?)\")/;\npp$9.strictDirective = function(start) {\n  if (this.options.ecmaVersion < 5) { return false }\n  for (;;) {\n    // Try to find string literal.\n    skipWhiteSpace.lastIndex = start;\n    start += skipWhiteSpace.exec(this.input)[0].length;\n    var match = literal.exec(this.input.slice(start));\n    if (!match) { return false }\n    if ((match[1] || match[2]) === \"use strict\") {\n      skipWhiteSpace.lastIndex = start + match[0].length;\n      var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;\n      var next = this.input.charAt(end);\n      return next === \";\" || next === \"}\" ||\n        (lineBreak.test(spaceAfter[0]) &&\n         !(/[(`.[+\\-/*%<>=,?^&]/.test(next) || next === \"!\" && this.input.charAt(end + 1) === \"=\"))\n    }\n    start += match[0].length;\n\n    // Skip semicolon, if any.\n    skipWhiteSpace.lastIndex = start;\n    start += skipWhiteSpace.exec(this.input)[0].length;\n    if (this.input[start] === \";\")\n      { start++; }\n  }\n};\n\n// Predicate that tests whether the next token is of the given\n// type, and if yes, consumes it as a side effect.\n\npp$9.eat = function(type) {\n  if (this.type === type) {\n    this.next();\n    return true\n  } else {\n    return false\n  }\n};\n\n// Tests whether parsed token is a contextual keyword.\n\npp$9.isContextual = function(name) {\n  return this.type === types$1.name && this.value === name && !this.containsEsc\n};\n\n// Consumes contextual keyword if possible.\n\npp$9.eatContextual = function(name) {\n  if (!this.isContextual(name)) { return false }\n  this.next();\n  return true\n};\n\n// Asserts that following token is given contextual keyword.\n\npp$9.expectContextual = function(name) {\n  if (!this.eatContextual(name)) { this.unexpected(); }\n};\n\n// Test whether a semicolon can be inserted at the current position.\n\npp$9.canInsertSemicolon = function() {\n  return this.type === types$1.eof ||\n    this.type === types$1.braceR ||\n    lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n};\n\npp$9.insertSemicolon = function() {\n  if (this.canInsertSemicolon()) {\n    if (this.options.onInsertedSemicolon)\n      { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }\n    return true\n  }\n};\n\n// Consume a semicolon, or, failing that, see if we are allowed to\n// pretend that there is a semicolon at this position.\n\npp$9.semicolon = function() {\n  if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); }\n};\n\npp$9.afterTrailingComma = function(tokType, notNext) {\n  if (this.type === tokType) {\n    if (this.options.onTrailingComma)\n      { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }\n    if (!notNext)\n      { this.next(); }\n    return true\n  }\n};\n\n// Expect a token of a given type. If found, consume it, otherwise,\n// raise an unexpected token error.\n\npp$9.expect = function(type) {\n  this.eat(type) || this.unexpected();\n};\n\n// Raise an unexpected token error.\n\npp$9.unexpected = function(pos) {\n  this.raise(pos != null ? pos : this.start, \"Unexpected token\");\n};\n\nvar DestructuringErrors = function DestructuringErrors() {\n  this.shorthandAssign =\n  this.trailingComma =\n  this.parenthesizedAssign =\n  this.parenthesizedBind =\n  this.doubleProto =\n    -1;\n};\n\npp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) {\n  if (!refDestructuringErrors) { return }\n  if (refDestructuringErrors.trailingComma > -1)\n    { this.raiseRecoverable(refDestructuringErrors.trailingComma, \"Comma is not permitted after the rest element\"); }\n  var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;\n  if (parens > -1) { this.raiseRecoverable(parens, isAssign ? \"Assigning to rvalue\" : \"Parenthesized pattern\"); }\n};\n\npp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {\n  if (!refDestructuringErrors) { return false }\n  var shorthandAssign = refDestructuringErrors.shorthandAssign;\n  var doubleProto = refDestructuringErrors.doubleProto;\n  if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }\n  if (shorthandAssign >= 0)\n    { this.raise(shorthandAssign, \"Shorthand property assignments are valid only in destructuring patterns\"); }\n  if (doubleProto >= 0)\n    { this.raiseRecoverable(doubleProto, \"Redefinition of __proto__ property\"); }\n};\n\npp$9.checkYieldAwaitInDefaultParams = function() {\n  if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))\n    { this.raise(this.yieldPos, \"Yield expression cannot be a default value\"); }\n  if (this.awaitPos)\n    { this.raise(this.awaitPos, \"Await expression cannot be a default value\"); }\n};\n\npp$9.isSimpleAssignTarget = function(expr) {\n  if (expr.type === \"ParenthesizedExpression\")\n    { return this.isSimpleAssignTarget(expr.expression) }\n  return expr.type === \"Identifier\" || expr.type === \"MemberExpression\"\n};\n\nvar pp$8 = Parser.prototype;\n\n// ### Statement parsing\n\n// Parse a program. Initializes the parser, reads any number of\n// statements, and wraps them in a Program node.  Optionally takes a\n// `program` argument.  If present, the statements will be appended\n// to its body instead of creating a new node.\n\npp$8.parseTopLevel = function(node) {\n  var exports = Object.create(null);\n  if (!node.body) { node.body = []; }\n  while (this.type !== types$1.eof) {\n    var stmt = this.parseStatement(null, true, exports);\n    node.body.push(stmt);\n  }\n  if (this.inModule)\n    { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)\n      {\n        var name = list[i];\n\n        this.raiseRecoverable(this.undefinedExports[name].start, (\"Export '\" + name + \"' is not defined\"));\n      } }\n  this.adaptDirectivePrologue(node.body);\n  this.next();\n  node.sourceType = this.options.sourceType;\n  return this.finishNode(node, \"Program\")\n};\n\nvar loopLabel = {kind: \"loop\"}, switchLabel = {kind: \"switch\"};\n\npp$8.isLet = function(context) {\n  if (this.options.ecmaVersion < 6 || !this.isContextual(\"let\")) { return false }\n  skipWhiteSpace.lastIndex = this.pos;\n  var skip = skipWhiteSpace.exec(this.input);\n  var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n  // For ambiguous cases, determine if a LexicalDeclaration (or only a\n  // Statement) is allowed here. If context is not empty then only a Statement\n  // is allowed. However, `let [` is an explicit negative lookahead for\n  // ExpressionStatement, so special-case it first.\n  if (nextCh === 91 || nextCh === 92) { return true } // '[', '/'\n  if (context) { return false }\n\n  if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral\n  if (isIdentifierStart(nextCh, true)) {\n    var pos = next + 1;\n    while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; }\n    if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true }\n    var ident = this.input.slice(next, pos);\n    if (!keywordRelationalOperator.test(ident)) { return true }\n  }\n  return false\n};\n\n// check 'async [no LineTerminator here] function'\n// - 'async /*foo*/ function' is OK.\n// - 'async /*\\n*/ function' is invalid.\npp$8.isAsyncFunction = function() {\n  if (this.options.ecmaVersion < 8 || !this.isContextual(\"async\"))\n    { return false }\n\n  skipWhiteSpace.lastIndex = this.pos;\n  var skip = skipWhiteSpace.exec(this.input);\n  var next = this.pos + skip[0].length, after;\n  return !lineBreak.test(this.input.slice(this.pos, next)) &&\n    this.input.slice(next, next + 8) === \"function\" &&\n    (next + 8 === this.input.length ||\n     !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00))\n};\n\n// Parse a single statement.\n//\n// If expecting a statement and finding a slash operator, parse a\n// regular expression literal. This is to handle cases like\n// `if (foo) /blah/.exec(foo)`, where looking at the previous token\n// does not help.\n\npp$8.parseStatement = function(context, topLevel, exports) {\n  var starttype = this.type, node = this.startNode(), kind;\n\n  if (this.isLet(context)) {\n    starttype = types$1._var;\n    kind = \"let\";\n  }\n\n  // Most types of statements are recognized by the keyword they\n  // start with. Many are trivial to parse, some require a bit of\n  // complexity.\n\n  switch (starttype) {\n  case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword)\n  case types$1._debugger: return this.parseDebuggerStatement(node)\n  case types$1._do: return this.parseDoStatement(node)\n  case types$1._for: return this.parseForStatement(node)\n  case types$1._function:\n    // Function as sole body of either an if statement or a labeled statement\n    // works, but not when it is part of a labeled statement that is the sole\n    // body of an if statement.\n    if ((context && (this.strict || context !== \"if\" && context !== \"label\")) && this.options.ecmaVersion >= 6) { this.unexpected(); }\n    return this.parseFunctionStatement(node, false, !context)\n  case types$1._class:\n    if (context) { this.unexpected(); }\n    return this.parseClass(node, true)\n  case types$1._if: return this.parseIfStatement(node)\n  case types$1._return: return this.parseReturnStatement(node)\n  case types$1._switch: return this.parseSwitchStatement(node)\n  case types$1._throw: return this.parseThrowStatement(node)\n  case types$1._try: return this.parseTryStatement(node)\n  case types$1._const: case types$1._var:\n    kind = kind || this.value;\n    if (context && kind !== \"var\") { this.unexpected(); }\n    return this.parseVarStatement(node, kind)\n  case types$1._while: return this.parseWhileStatement(node)\n  case types$1._with: return this.parseWithStatement(node)\n  case types$1.braceL: return this.parseBlock(true, node)\n  case types$1.semi: return this.parseEmptyStatement(node)\n  case types$1._export:\n  case types$1._import:\n    if (this.options.ecmaVersion > 10 && starttype === types$1._import) {\n      skipWhiteSpace.lastIndex = this.pos;\n      var skip = skipWhiteSpace.exec(this.input);\n      var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n      if (nextCh === 40 || nextCh === 46) // '(' or '.'\n        { return this.parseExpressionStatement(node, this.parseExpression()) }\n    }\n\n    if (!this.options.allowImportExportEverywhere) {\n      if (!topLevel)\n        { this.raise(this.start, \"'import' and 'export' may only appear at the top level\"); }\n      if (!this.inModule)\n        { this.raise(this.start, \"'import' and 'export' may appear only with 'sourceType: module'\"); }\n    }\n    return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports)\n\n    // If the statement does not start with a statement keyword or a\n    // brace, it's an ExpressionStatement or LabeledStatement. We\n    // simply start parsing an expression, and afterwards, if the\n    // next token is a colon and the expression was a simple\n    // Identifier node, we switch to interpreting it as a label.\n  default:\n    if (this.isAsyncFunction()) {\n      if (context) { this.unexpected(); }\n      this.next();\n      return this.parseFunctionStatement(node, true, !context)\n    }\n\n    var maybeName = this.value, expr = this.parseExpression();\n    if (starttype === types$1.name && expr.type === \"Identifier\" && this.eat(types$1.colon))\n      { return this.parseLabeledStatement(node, maybeName, expr, context) }\n    else { return this.parseExpressionStatement(node, expr) }\n  }\n};\n\npp$8.parseBreakContinueStatement = function(node, keyword) {\n  var isBreak = keyword === \"break\";\n  this.next();\n  if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; }\n  else if (this.type !== types$1.name) { this.unexpected(); }\n  else {\n    node.label = this.parseIdent();\n    this.semicolon();\n  }\n\n  // Verify that there is an actual destination to break or\n  // continue to.\n  var i = 0;\n  for (; i < this.labels.length; ++i) {\n    var lab = this.labels[i];\n    if (node.label == null || lab.name === node.label.name) {\n      if (lab.kind != null && (isBreak || lab.kind === \"loop\")) { break }\n      if (node.label && isBreak) { break }\n    }\n  }\n  if (i === this.labels.length) { this.raise(node.start, \"Unsyntactic \" + keyword); }\n  return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n};\n\npp$8.parseDebuggerStatement = function(node) {\n  this.next();\n  this.semicolon();\n  return this.finishNode(node, \"DebuggerStatement\")\n};\n\npp$8.parseDoStatement = function(node) {\n  this.next();\n  this.labels.push(loopLabel);\n  node.body = this.parseStatement(\"do\");\n  this.labels.pop();\n  this.expect(types$1._while);\n  node.test = this.parseParenExpression();\n  if (this.options.ecmaVersion >= 6)\n    { this.eat(types$1.semi); }\n  else\n    { this.semicolon(); }\n  return this.finishNode(node, \"DoWhileStatement\")\n};\n\n// Disambiguating between a `for` and a `for`/`in` or `for`/`of`\n// loop is non-trivial. Basically, we have to parse the init `var`\n// statement or expression, disallowing the `in` operator (see\n// the second parameter to `parseExpression`), and then check\n// whether the next token is `in` or `of`. When there is no init\n// part (semicolon immediately after the opening parenthesis), it\n// is a regular `for` loop.\n\npp$8.parseForStatement = function(node) {\n  this.next();\n  var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual(\"await\")) ? this.lastTokStart : -1;\n  this.labels.push(loopLabel);\n  this.enterScope(0);\n  this.expect(types$1.parenL);\n  if (this.type === types$1.semi) {\n    if (awaitAt > -1) { this.unexpected(awaitAt); }\n    return this.parseFor(node, null)\n  }\n  var isLet = this.isLet();\n  if (this.type === types$1._var || this.type === types$1._const || isLet) {\n    var init$1 = this.startNode(), kind = isLet ? \"let\" : this.value;\n    this.next();\n    this.parseVar(init$1, true, kind);\n    this.finishNode(init$1, \"VariableDeclaration\");\n    if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) && init$1.declarations.length === 1) {\n      if (this.options.ecmaVersion >= 9) {\n        if (this.type === types$1._in) {\n          if (awaitAt > -1) { this.unexpected(awaitAt); }\n        } else { node.await = awaitAt > -1; }\n      }\n      return this.parseForIn(node, init$1)\n    }\n    if (awaitAt > -1) { this.unexpected(awaitAt); }\n    return this.parseFor(node, init$1)\n  }\n  var startsWithLet = this.isContextual(\"let\"), isForOf = false;\n  var refDestructuringErrors = new DestructuringErrors;\n  var init = this.parseExpression(awaitAt > -1 ? \"await\" : true, refDestructuringErrors);\n  if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) {\n    if (this.options.ecmaVersion >= 9) {\n      if (this.type === types$1._in) {\n        if (awaitAt > -1) { this.unexpected(awaitAt); }\n      } else { node.await = awaitAt > -1; }\n    }\n    if (startsWithLet && isForOf) { this.raise(init.start, \"The left-hand side of a for-of loop may not start with 'let'.\"); }\n    this.toAssignable(init, false, refDestructuringErrors);\n    this.checkLValPattern(init);\n    return this.parseForIn(node, init)\n  } else {\n    this.checkExpressionErrors(refDestructuringErrors, true);\n  }\n  if (awaitAt > -1) { this.unexpected(awaitAt); }\n  return this.parseFor(node, init)\n};\n\npp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) {\n  this.next();\n  return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)\n};\n\npp$8.parseIfStatement = function(node) {\n  this.next();\n  node.test = this.parseParenExpression();\n  // allow function declarations in branches, but only in non-strict mode\n  node.consequent = this.parseStatement(\"if\");\n  node.alternate = this.eat(types$1._else) ? this.parseStatement(\"if\") : null;\n  return this.finishNode(node, \"IfStatement\")\n};\n\npp$8.parseReturnStatement = function(node) {\n  if (!this.inFunction && !this.options.allowReturnOutsideFunction)\n    { this.raise(this.start, \"'return' outside of function\"); }\n  this.next();\n\n  // In `return` (and `break`/`continue`), the keywords with\n  // optional arguments, we eagerly look for a semicolon or the\n  // possibility to insert one.\n\n  if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; }\n  else { node.argument = this.parseExpression(); this.semicolon(); }\n  return this.finishNode(node, \"ReturnStatement\")\n};\n\npp$8.parseSwitchStatement = function(node) {\n  this.next();\n  node.discriminant = this.parseParenExpression();\n  node.cases = [];\n  this.expect(types$1.braceL);\n  this.labels.push(switchLabel);\n  this.enterScope(0);\n\n  // Statements under must be grouped (by label) in SwitchCase\n  // nodes. `cur` is used to keep the node that we are currently\n  // adding statements to.\n\n  var cur;\n  for (var sawDefault = false; this.type !== types$1.braceR;) {\n    if (this.type === types$1._case || this.type === types$1._default) {\n      var isCase = this.type === types$1._case;\n      if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n      node.cases.push(cur = this.startNode());\n      cur.consequent = [];\n      this.next();\n      if (isCase) {\n        cur.test = this.parseExpression();\n      } else {\n        if (sawDefault) { this.raiseRecoverable(this.lastTokStart, \"Multiple default clauses\"); }\n        sawDefault = true;\n        cur.test = null;\n      }\n      this.expect(types$1.colon);\n    } else {\n      if (!cur) { this.unexpected(); }\n      cur.consequent.push(this.parseStatement(null));\n    }\n  }\n  this.exitScope();\n  if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n  this.next(); // Closing brace\n  this.labels.pop();\n  return this.finishNode(node, \"SwitchStatement\")\n};\n\npp$8.parseThrowStatement = function(node) {\n  this.next();\n  if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))\n    { this.raise(this.lastTokEnd, \"Illegal newline after throw\"); }\n  node.argument = this.parseExpression();\n  this.semicolon();\n  return this.finishNode(node, \"ThrowStatement\")\n};\n\n// Reused empty array added for node fields that are always empty.\n\nvar empty$1 = [];\n\npp$8.parseTryStatement = function(node) {\n  this.next();\n  node.block = this.parseBlock();\n  node.handler = null;\n  if (this.type === types$1._catch) {\n    var clause = this.startNode();\n    this.next();\n    if (this.eat(types$1.parenL)) {\n      clause.param = this.parseBindingAtom();\n      var simple = clause.param.type === \"Identifier\";\n      this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);\n      this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);\n      this.expect(types$1.parenR);\n    } else {\n      if (this.options.ecmaVersion < 10) { this.unexpected(); }\n      clause.param = null;\n      this.enterScope(0);\n    }\n    clause.body = this.parseBlock(false);\n    this.exitScope();\n    node.handler = this.finishNode(clause, \"CatchClause\");\n  }\n  node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null;\n  if (!node.handler && !node.finalizer)\n    { this.raise(node.start, \"Missing catch or finally clause\"); }\n  return this.finishNode(node, \"TryStatement\")\n};\n\npp$8.parseVarStatement = function(node, kind) {\n  this.next();\n  this.parseVar(node, false, kind);\n  this.semicolon();\n  return this.finishNode(node, \"VariableDeclaration\")\n};\n\npp$8.parseWhileStatement = function(node) {\n  this.next();\n  node.test = this.parseParenExpression();\n  this.labels.push(loopLabel);\n  node.body = this.parseStatement(\"while\");\n  this.labels.pop();\n  return this.finishNode(node, \"WhileStatement\")\n};\n\npp$8.parseWithStatement = function(node) {\n  if (this.strict) { this.raise(this.start, \"'with' in strict mode\"); }\n  this.next();\n  node.object = this.parseParenExpression();\n  node.body = this.parseStatement(\"with\");\n  return this.finishNode(node, \"WithStatement\")\n};\n\npp$8.parseEmptyStatement = function(node) {\n  this.next();\n  return this.finishNode(node, \"EmptyStatement\")\n};\n\npp$8.parseLabeledStatement = function(node, maybeName, expr, context) {\n  for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)\n    {\n    var label = list[i$1];\n\n    if (label.name === maybeName)\n      { this.raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n  } }\n  var kind = this.type.isLoop ? \"loop\" : this.type === types$1._switch ? \"switch\" : null;\n  for (var i = this.labels.length - 1; i >= 0; i--) {\n    var label$1 = this.labels[i];\n    if (label$1.statementStart === node.start) {\n      // Update information about previous labels on this node\n      label$1.statementStart = this.start;\n      label$1.kind = kind;\n    } else { break }\n  }\n  this.labels.push({name: maybeName, kind: kind, statementStart: this.start});\n  node.body = this.parseStatement(context ? context.indexOf(\"label\") === -1 ? context + \"label\" : context : \"label\");\n  this.labels.pop();\n  node.label = expr;\n  return this.finishNode(node, \"LabeledStatement\")\n};\n\npp$8.parseExpressionStatement = function(node, expr) {\n  node.expression = expr;\n  this.semicolon();\n  return this.finishNode(node, \"ExpressionStatement\")\n};\n\n// Parse a semicolon-enclosed block of statements, handling `\"use\n// strict\"` declarations when `allowStrict` is true (used for\n// function bodies).\n\npp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) {\n  if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;\n  if ( node === void 0 ) node = this.startNode();\n\n  node.body = [];\n  this.expect(types$1.braceL);\n  if (createNewLexicalScope) { this.enterScope(0); }\n  while (this.type !== types$1.braceR) {\n    var stmt = this.parseStatement(null);\n    node.body.push(stmt);\n  }\n  if (exitStrict) { this.strict = false; }\n  this.next();\n  if (createNewLexicalScope) { this.exitScope(); }\n  return this.finishNode(node, \"BlockStatement\")\n};\n\n// Parse a regular `for` loop. The disambiguation code in\n// `parseStatement` will already have parsed the init statement or\n// expression.\n\npp$8.parseFor = function(node, init) {\n  node.init = init;\n  this.expect(types$1.semi);\n  node.test = this.type === types$1.semi ? null : this.parseExpression();\n  this.expect(types$1.semi);\n  node.update = this.type === types$1.parenR ? null : this.parseExpression();\n  this.expect(types$1.parenR);\n  node.body = this.parseStatement(\"for\");\n  this.exitScope();\n  this.labels.pop();\n  return this.finishNode(node, \"ForStatement\")\n};\n\n// Parse a `for`/`in` and `for`/`of` loop, which are almost\n// same from parser's perspective.\n\npp$8.parseForIn = function(node, init) {\n  var isForIn = this.type === types$1._in;\n  this.next();\n\n  if (\n    init.type === \"VariableDeclaration\" &&\n    init.declarations[0].init != null &&\n    (\n      !isForIn ||\n      this.options.ecmaVersion < 8 ||\n      this.strict ||\n      init.kind !== \"var\" ||\n      init.declarations[0].id.type !== \"Identifier\"\n    )\n  ) {\n    this.raise(\n      init.start,\n      ((isForIn ? \"for-in\" : \"for-of\") + \" loop variable declaration may not have an initializer\")\n    );\n  }\n  node.left = init;\n  node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();\n  this.expect(types$1.parenR);\n  node.body = this.parseStatement(\"for\");\n  this.exitScope();\n  this.labels.pop();\n  return this.finishNode(node, isForIn ? \"ForInStatement\" : \"ForOfStatement\")\n};\n\n// Parse a list of variable declarations.\n\npp$8.parseVar = function(node, isFor, kind) {\n  node.declarations = [];\n  node.kind = kind;\n  for (;;) {\n    var decl = this.startNode();\n    this.parseVarId(decl, kind);\n    if (this.eat(types$1.eq)) {\n      decl.init = this.parseMaybeAssign(isFor);\n    } else if (kind === \"const\" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\")))) {\n      this.unexpected();\n    } else if (decl.id.type !== \"Identifier\" && !(isFor && (this.type === types$1._in || this.isContextual(\"of\")))) {\n      this.raise(this.lastTokEnd, \"Complex binding patterns require an initialization value\");\n    } else {\n      decl.init = null;\n    }\n    node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"));\n    if (!this.eat(types$1.comma)) { break }\n  }\n  return node\n};\n\npp$8.parseVarId = function(decl, kind) {\n  decl.id = this.parseBindingAtom();\n  this.checkLValPattern(decl.id, kind === \"var\" ? BIND_VAR : BIND_LEXICAL, false);\n};\n\nvar FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;\n\n// Parse a function declaration or literal (depending on the\n// `statement & FUNC_STATEMENT`).\n\n// Remove `allowExpressionBody` for 7.0.0, as it is only called with false\npp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) {\n  this.initFunction(node);\n  if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {\n    if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT))\n      { this.unexpected(); }\n    node.generator = this.eat(types$1.star);\n  }\n  if (this.options.ecmaVersion >= 8)\n    { node.async = !!isAsync; }\n\n  if (statement & FUNC_STATEMENT) {\n    node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent();\n    if (node.id && !(statement & FUNC_HANGING_STATEMENT))\n      // If it is a regular function declaration in sloppy mode, then it is\n      // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding\n      // mode depends on properties of the current scope (see\n      // treatFunctionsAsVar).\n      { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }\n  }\n\n  var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n  this.yieldPos = 0;\n  this.awaitPos = 0;\n  this.awaitIdentPos = 0;\n  this.enterScope(functionFlags(node.async, node.generator));\n\n  if (!(statement & FUNC_STATEMENT))\n    { node.id = this.type === types$1.name ? this.parseIdent() : null; }\n\n  this.parseFunctionParams(node);\n  this.parseFunctionBody(node, allowExpressionBody, false, forInit);\n\n  this.yieldPos = oldYieldPos;\n  this.awaitPos = oldAwaitPos;\n  this.awaitIdentPos = oldAwaitIdentPos;\n  return this.finishNode(node, (statement & FUNC_STATEMENT) ? \"FunctionDeclaration\" : \"FunctionExpression\")\n};\n\npp$8.parseFunctionParams = function(node) {\n  this.expect(types$1.parenL);\n  node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n  this.checkYieldAwaitInDefaultParams();\n};\n\n// Parse a class declaration or literal (depending on the\n// `isStatement` parameter).\n\npp$8.parseClass = function(node, isStatement) {\n  this.next();\n\n  // ecma-262 14.6 Class Definitions\n  // A class definition is always strict mode code.\n  var oldStrict = this.strict;\n  this.strict = true;\n\n  this.parseClassId(node, isStatement);\n  this.parseClassSuper(node);\n  var privateNameMap = this.enterClassBody();\n  var classBody = this.startNode();\n  var hadConstructor = false;\n  classBody.body = [];\n  this.expect(types$1.braceL);\n  while (this.type !== types$1.braceR) {\n    var element = this.parseClassElement(node.superClass !== null);\n    if (element) {\n      classBody.body.push(element);\n      if (element.type === \"MethodDefinition\" && element.kind === \"constructor\") {\n        if (hadConstructor) { this.raise(element.start, \"Duplicate constructor in the same class\"); }\n        hadConstructor = true;\n      } else if (element.key && element.key.type === \"PrivateIdentifier\" && isPrivateNameConflicted(privateNameMap, element)) {\n        this.raiseRecoverable(element.key.start, (\"Identifier '#\" + (element.key.name) + \"' has already been declared\"));\n      }\n    }\n  }\n  this.strict = oldStrict;\n  this.next();\n  node.body = this.finishNode(classBody, \"ClassBody\");\n  this.exitClassBody();\n  return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n};\n\npp$8.parseClassElement = function(constructorAllowsSuper) {\n  if (this.eat(types$1.semi)) { return null }\n\n  var ecmaVersion = this.options.ecmaVersion;\n  var node = this.startNode();\n  var keyName = \"\";\n  var isGenerator = false;\n  var isAsync = false;\n  var kind = \"method\";\n  var isStatic = false;\n\n  if (this.eatContextual(\"static\")) {\n    // Parse static init block\n    if (ecmaVersion >= 13 && this.eat(types$1.braceL)) {\n      this.parseClassStaticBlock(node);\n      return node\n    }\n    if (this.isClassElementNameStart() || this.type === types$1.star) {\n      isStatic = true;\n    } else {\n      keyName = \"static\";\n    }\n  }\n  node.static = isStatic;\n  if (!keyName && ecmaVersion >= 8 && this.eatContextual(\"async\")) {\n    if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) {\n      isAsync = true;\n    } else {\n      keyName = \"async\";\n    }\n  }\n  if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) {\n    isGenerator = true;\n  }\n  if (!keyName && !isAsync && !isGenerator) {\n    var lastValue = this.value;\n    if (this.eatContextual(\"get\") || this.eatContextual(\"set\")) {\n      if (this.isClassElementNameStart()) {\n        kind = lastValue;\n      } else {\n        keyName = lastValue;\n      }\n    }\n  }\n\n  // Parse element name\n  if (keyName) {\n    // 'async', 'get', 'set', or 'static' were not a keyword contextually.\n    // The last token is any of those. Make it the element name.\n    node.computed = false;\n    node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc);\n    node.key.name = keyName;\n    this.finishNode(node.key, \"Identifier\");\n  } else {\n    this.parseClassElementName(node);\n  }\n\n  // Parse element value\n  if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== \"method\" || isGenerator || isAsync) {\n    var isConstructor = !node.static && checkKeyName(node, \"constructor\");\n    var allowsDirectSuper = isConstructor && constructorAllowsSuper;\n    // Couldn't move this check into the 'parseClassMethod' method for backward compatibility.\n    if (isConstructor && kind !== \"method\") { this.raise(node.key.start, \"Constructor can't have get/set modifier\"); }\n    node.kind = isConstructor ? \"constructor\" : kind;\n    this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper);\n  } else {\n    this.parseClassField(node);\n  }\n\n  return node\n};\n\npp$8.isClassElementNameStart = function() {\n  return (\n    this.type === types$1.name ||\n    this.type === types$1.privateId ||\n    this.type === types$1.num ||\n    this.type === types$1.string ||\n    this.type === types$1.bracketL ||\n    this.type.keyword\n  )\n};\n\npp$8.parseClassElementName = function(element) {\n  if (this.type === types$1.privateId) {\n    if (this.value === \"constructor\") {\n      this.raise(this.start, \"Classes can't have an element named '#constructor'\");\n    }\n    element.computed = false;\n    element.key = this.parsePrivateIdent();\n  } else {\n    this.parsePropertyName(element);\n  }\n};\n\npp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {\n  // Check key and flags\n  var key = method.key;\n  if (method.kind === \"constructor\") {\n    if (isGenerator) { this.raise(key.start, \"Constructor can't be a generator\"); }\n    if (isAsync) { this.raise(key.start, \"Constructor can't be an async method\"); }\n  } else if (method.static && checkKeyName(method, \"prototype\")) {\n    this.raise(key.start, \"Classes may not have a static property named prototype\");\n  }\n\n  // Parse value\n  var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);\n\n  // Check value\n  if (method.kind === \"get\" && value.params.length !== 0)\n    { this.raiseRecoverable(value.start, \"getter should have no params\"); }\n  if (method.kind === \"set\" && value.params.length !== 1)\n    { this.raiseRecoverable(value.start, \"setter should have exactly one param\"); }\n  if (method.kind === \"set\" && value.params[0].type === \"RestElement\")\n    { this.raiseRecoverable(value.params[0].start, \"Setter cannot use rest params\"); }\n\n  return this.finishNode(method, \"MethodDefinition\")\n};\n\npp$8.parseClassField = function(field) {\n  if (checkKeyName(field, \"constructor\")) {\n    this.raise(field.key.start, \"Classes can't have a field named 'constructor'\");\n  } else if (field.static && checkKeyName(field, \"prototype\")) {\n    this.raise(field.key.start, \"Classes can't have a static field named 'prototype'\");\n  }\n\n  if (this.eat(types$1.eq)) {\n    // To raise SyntaxError if 'arguments' exists in the initializer.\n    var scope = this.currentThisScope();\n    var inClassFieldInit = scope.inClassFieldInit;\n    scope.inClassFieldInit = true;\n    field.value = this.parseMaybeAssign();\n    scope.inClassFieldInit = inClassFieldInit;\n  } else {\n    field.value = null;\n  }\n  this.semicolon();\n\n  return this.finishNode(field, \"PropertyDefinition\")\n};\n\npp$8.parseClassStaticBlock = function(node) {\n  node.body = [];\n\n  var oldLabels = this.labels;\n  this.labels = [];\n  this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER);\n  while (this.type !== types$1.braceR) {\n    var stmt = this.parseStatement(null);\n    node.body.push(stmt);\n  }\n  this.next();\n  this.exitScope();\n  this.labels = oldLabels;\n\n  return this.finishNode(node, \"StaticBlock\")\n};\n\npp$8.parseClassId = function(node, isStatement) {\n  if (this.type === types$1.name) {\n    node.id = this.parseIdent();\n    if (isStatement)\n      { this.checkLValSimple(node.id, BIND_LEXICAL, false); }\n  } else {\n    if (isStatement === true)\n      { this.unexpected(); }\n    node.id = null;\n  }\n};\n\npp$8.parseClassSuper = function(node) {\n  node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(null, false) : null;\n};\n\npp$8.enterClassBody = function() {\n  var element = {declared: Object.create(null), used: []};\n  this.privateNameStack.push(element);\n  return element.declared\n};\n\npp$8.exitClassBody = function() {\n  var ref = this.privateNameStack.pop();\n  var declared = ref.declared;\n  var used = ref.used;\n  var len = this.privateNameStack.length;\n  var parent = len === 0 ? null : this.privateNameStack[len - 1];\n  for (var i = 0; i < used.length; ++i) {\n    var id = used[i];\n    if (!hasOwn(declared, id.name)) {\n      if (parent) {\n        parent.used.push(id);\n      } else {\n        this.raiseRecoverable(id.start, (\"Private field '#\" + (id.name) + \"' must be declared in an enclosing class\"));\n      }\n    }\n  }\n};\n\nfunction isPrivateNameConflicted(privateNameMap, element) {\n  var name = element.key.name;\n  var curr = privateNameMap[name];\n\n  var next = \"true\";\n  if (element.type === \"MethodDefinition\" && (element.kind === \"get\" || element.kind === \"set\")) {\n    next = (element.static ? \"s\" : \"i\") + element.kind;\n  }\n\n  // `class { get #a(){}; static set #a(_){} }` is also conflict.\n  if (\n    curr === \"iget\" && next === \"iset\" ||\n    curr === \"iset\" && next === \"iget\" ||\n    curr === \"sget\" && next === \"sset\" ||\n    curr === \"sset\" && next === \"sget\"\n  ) {\n    privateNameMap[name] = \"true\";\n    return false\n  } else if (!curr) {\n    privateNameMap[name] = next;\n    return false\n  } else {\n    return true\n  }\n}\n\nfunction checkKeyName(node, name) {\n  var computed = node.computed;\n  var key = node.key;\n  return !computed && (\n    key.type === \"Identifier\" && key.name === name ||\n    key.type === \"Literal\" && key.value === name\n  )\n}\n\n// Parses module export declaration.\n\npp$8.parseExport = function(node, exports) {\n  this.next();\n  // export * from '...'\n  if (this.eat(types$1.star)) {\n    if (this.options.ecmaVersion >= 11) {\n      if (this.eatContextual(\"as\")) {\n        node.exported = this.parseModuleExportName();\n        this.checkExport(exports, node.exported, this.lastTokStart);\n      } else {\n        node.exported = null;\n      }\n    }\n    this.expectContextual(\"from\");\n    if (this.type !== types$1.string) { this.unexpected(); }\n    node.source = this.parseExprAtom();\n    this.semicolon();\n    return this.finishNode(node, \"ExportAllDeclaration\")\n  }\n  if (this.eat(types$1._default)) { // export default ...\n    this.checkExport(exports, \"default\", this.lastTokStart);\n    var isAsync;\n    if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) {\n      var fNode = this.startNode();\n      this.next();\n      if (isAsync) { this.next(); }\n      node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);\n    } else if (this.type === types$1._class) {\n      var cNode = this.startNode();\n      node.declaration = this.parseClass(cNode, \"nullableID\");\n    } else {\n      node.declaration = this.parseMaybeAssign();\n      this.semicolon();\n    }\n    return this.finishNode(node, \"ExportDefaultDeclaration\")\n  }\n  // export var|const|let|function|class ...\n  if (this.shouldParseExportStatement()) {\n    node.declaration = this.parseStatement(null);\n    if (node.declaration.type === \"VariableDeclaration\")\n      { this.checkVariableExport(exports, node.declaration.declarations); }\n    else\n      { this.checkExport(exports, node.declaration.id, node.declaration.id.start); }\n    node.specifiers = [];\n    node.source = null;\n  } else { // export { x, y as z } [from '...']\n    node.declaration = null;\n    node.specifiers = this.parseExportSpecifiers(exports);\n    if (this.eatContextual(\"from\")) {\n      if (this.type !== types$1.string) { this.unexpected(); }\n      node.source = this.parseExprAtom();\n    } else {\n      for (var i = 0, list = node.specifiers; i < list.length; i += 1) {\n        // check for keywords used as local names\n        var spec = list[i];\n\n        this.checkUnreserved(spec.local);\n        // check if export is defined\n        this.checkLocalExport(spec.local);\n\n        if (spec.local.type === \"Literal\") {\n          this.raise(spec.local.start, \"A string literal cannot be used as an exported binding without `from`.\");\n        }\n      }\n\n      node.source = null;\n    }\n    this.semicolon();\n  }\n  return this.finishNode(node, \"ExportNamedDeclaration\")\n};\n\npp$8.checkExport = function(exports, name, pos) {\n  if (!exports) { return }\n  if (typeof name !== \"string\")\n    { name = name.type === \"Identifier\" ? name.name : name.value; }\n  if (hasOwn(exports, name))\n    { this.raiseRecoverable(pos, \"Duplicate export '\" + name + \"'\"); }\n  exports[name] = true;\n};\n\npp$8.checkPatternExport = function(exports, pat) {\n  var type = pat.type;\n  if (type === \"Identifier\")\n    { this.checkExport(exports, pat, pat.start); }\n  else if (type === \"ObjectPattern\")\n    { for (var i = 0, list = pat.properties; i < list.length; i += 1)\n      {\n        var prop = list[i];\n\n        this.checkPatternExport(exports, prop);\n      } }\n  else if (type === \"ArrayPattern\")\n    { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {\n      var elt = list$1[i$1];\n\n        if (elt) { this.checkPatternExport(exports, elt); }\n    } }\n  else if (type === \"Property\")\n    { this.checkPatternExport(exports, pat.value); }\n  else if (type === \"AssignmentPattern\")\n    { this.checkPatternExport(exports, pat.left); }\n  else if (type === \"RestElement\")\n    { this.checkPatternExport(exports, pat.argument); }\n  else if (type === \"ParenthesizedExpression\")\n    { this.checkPatternExport(exports, pat.expression); }\n};\n\npp$8.checkVariableExport = function(exports, decls) {\n  if (!exports) { return }\n  for (var i = 0, list = decls; i < list.length; i += 1)\n    {\n    var decl = list[i];\n\n    this.checkPatternExport(exports, decl.id);\n  }\n};\n\npp$8.shouldParseExportStatement = function() {\n  return this.type.keyword === \"var\" ||\n    this.type.keyword === \"const\" ||\n    this.type.keyword === \"class\" ||\n    this.type.keyword === \"function\" ||\n    this.isLet() ||\n    this.isAsyncFunction()\n};\n\n// Parses a comma-separated list of module exports.\n\npp$8.parseExportSpecifiers = function(exports) {\n  var nodes = [], first = true;\n  // export { x, y as z } [from '...']\n  this.expect(types$1.braceL);\n  while (!this.eat(types$1.braceR)) {\n    if (!first) {\n      this.expect(types$1.comma);\n      if (this.afterTrailingComma(types$1.braceR)) { break }\n    } else { first = false; }\n\n    var node = this.startNode();\n    node.local = this.parseModuleExportName();\n    node.exported = this.eatContextual(\"as\") ? this.parseModuleExportName() : node.local;\n    this.checkExport(\n      exports,\n      node.exported,\n      node.exported.start\n    );\n    nodes.push(this.finishNode(node, \"ExportSpecifier\"));\n  }\n  return nodes\n};\n\n// Parses import declaration.\n\npp$8.parseImport = function(node) {\n  this.next();\n  // import '...'\n  if (this.type === types$1.string) {\n    node.specifiers = empty$1;\n    node.source = this.parseExprAtom();\n  } else {\n    node.specifiers = this.parseImportSpecifiers();\n    this.expectContextual(\"from\");\n    node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected();\n  }\n  this.semicolon();\n  return this.finishNode(node, \"ImportDeclaration\")\n};\n\n// Parses a comma-separated list of module imports.\n\npp$8.parseImportSpecifiers = function() {\n  var nodes = [], first = true;\n  if (this.type === types$1.name) {\n    // import defaultObj, { x, y as z } from '...'\n    var node = this.startNode();\n    node.local = this.parseIdent();\n    this.checkLValSimple(node.local, BIND_LEXICAL);\n    nodes.push(this.finishNode(node, \"ImportDefaultSpecifier\"));\n    if (!this.eat(types$1.comma)) { return nodes }\n  }\n  if (this.type === types$1.star) {\n    var node$1 = this.startNode();\n    this.next();\n    this.expectContextual(\"as\");\n    node$1.local = this.parseIdent();\n    this.checkLValSimple(node$1.local, BIND_LEXICAL);\n    nodes.push(this.finishNode(node$1, \"ImportNamespaceSpecifier\"));\n    return nodes\n  }\n  this.expect(types$1.braceL);\n  while (!this.eat(types$1.braceR)) {\n    if (!first) {\n      this.expect(types$1.comma);\n      if (this.afterTrailingComma(types$1.braceR)) { break }\n    } else { first = false; }\n\n    var node$2 = this.startNode();\n    node$2.imported = this.parseModuleExportName();\n    if (this.eatContextual(\"as\")) {\n      node$2.local = this.parseIdent();\n    } else {\n      this.checkUnreserved(node$2.imported);\n      node$2.local = node$2.imported;\n    }\n    this.checkLValSimple(node$2.local, BIND_LEXICAL);\n    nodes.push(this.finishNode(node$2, \"ImportSpecifier\"));\n  }\n  return nodes\n};\n\npp$8.parseModuleExportName = function() {\n  if (this.options.ecmaVersion >= 13 && this.type === types$1.string) {\n    var stringLiteral = this.parseLiteral(this.value);\n    if (loneSurrogate.test(stringLiteral.value)) {\n      this.raise(stringLiteral.start, \"An export name cannot include a lone surrogate.\");\n    }\n    return stringLiteral\n  }\n  return this.parseIdent(true)\n};\n\n// Set `ExpressionStatement#directive` property for directive prologues.\npp$8.adaptDirectivePrologue = function(statements) {\n  for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {\n    statements[i].directive = statements[i].expression.raw.slice(1, -1);\n  }\n};\npp$8.isDirectiveCandidate = function(statement) {\n  return (\n    this.options.ecmaVersion >= 5 &&\n    statement.type === \"ExpressionStatement\" &&\n    statement.expression.type === \"Literal\" &&\n    typeof statement.expression.value === \"string\" &&\n    // Reject parenthesized strings.\n    (this.input[statement.start] === \"\\\"\" || this.input[statement.start] === \"'\")\n  )\n};\n\nvar pp$7 = Parser.prototype;\n\n// Convert existing expression atom to assignable pattern\n// if possible.\n\npp$7.toAssignable = function(node, isBinding, refDestructuringErrors) {\n  if (this.options.ecmaVersion >= 6 && node) {\n    switch (node.type) {\n    case \"Identifier\":\n      if (this.inAsync && node.name === \"await\")\n        { this.raise(node.start, \"Cannot use 'await' as identifier inside an async function\"); }\n      break\n\n    case \"ObjectPattern\":\n    case \"ArrayPattern\":\n    case \"AssignmentPattern\":\n    case \"RestElement\":\n      break\n\n    case \"ObjectExpression\":\n      node.type = \"ObjectPattern\";\n      if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n      for (var i = 0, list = node.properties; i < list.length; i += 1) {\n        var prop = list[i];\n\n      this.toAssignable(prop, isBinding);\n        // Early error:\n        //   AssignmentRestProperty[Yield, Await] :\n        //     `...` DestructuringAssignmentTarget[Yield, Await]\n        //\n        //   It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.\n        if (\n          prop.type === \"RestElement\" &&\n          (prop.argument.type === \"ArrayPattern\" || prop.argument.type === \"ObjectPattern\")\n        ) {\n          this.raise(prop.argument.start, \"Unexpected token\");\n        }\n      }\n      break\n\n    case \"Property\":\n      // AssignmentProperty has type === \"Property\"\n      if (node.kind !== \"init\") { this.raise(node.key.start, \"Object pattern can't contain getter or setter\"); }\n      this.toAssignable(node.value, isBinding);\n      break\n\n    case \"ArrayExpression\":\n      node.type = \"ArrayPattern\";\n      if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n      this.toAssignableList(node.elements, isBinding);\n      break\n\n    case \"SpreadElement\":\n      node.type = \"RestElement\";\n      this.toAssignable(node.argument, isBinding);\n      if (node.argument.type === \"AssignmentPattern\")\n        { this.raise(node.argument.start, \"Rest elements cannot have a default value\"); }\n      break\n\n    case \"AssignmentExpression\":\n      if (node.operator !== \"=\") { this.raise(node.left.end, \"Only '=' operator can be used for specifying default value.\"); }\n      node.type = \"AssignmentPattern\";\n      delete node.operator;\n      this.toAssignable(node.left, isBinding);\n      break\n\n    case \"ParenthesizedExpression\":\n      this.toAssignable(node.expression, isBinding, refDestructuringErrors);\n      break\n\n    case \"ChainExpression\":\n      this.raiseRecoverable(node.start, \"Optional chaining cannot appear in left-hand side\");\n      break\n\n    case \"MemberExpression\":\n      if (!isBinding) { break }\n\n    default:\n      this.raise(node.start, \"Assigning to rvalue\");\n    }\n  } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n  return node\n};\n\n// Convert list of expression atoms to binding list.\n\npp$7.toAssignableList = function(exprList, isBinding) {\n  var end = exprList.length;\n  for (var i = 0; i < end; i++) {\n    var elt = exprList[i];\n    if (elt) { this.toAssignable(elt, isBinding); }\n  }\n  if (end) {\n    var last = exprList[end - 1];\n    if (this.options.ecmaVersion === 6 && isBinding && last && last.type === \"RestElement\" && last.argument.type !== \"Identifier\")\n      { this.unexpected(last.argument.start); }\n  }\n  return exprList\n};\n\n// Parses spread element.\n\npp$7.parseSpread = function(refDestructuringErrors) {\n  var node = this.startNode();\n  this.next();\n  node.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n  return this.finishNode(node, \"SpreadElement\")\n};\n\npp$7.parseRestBinding = function() {\n  var node = this.startNode();\n  this.next();\n\n  // RestElement inside of a function parameter must be an identifier\n  if (this.options.ecmaVersion === 6 && this.type !== types$1.name)\n    { this.unexpected(); }\n\n  node.argument = this.parseBindingAtom();\n\n  return this.finishNode(node, \"RestElement\")\n};\n\n// Parses lvalue (assignable) atom.\n\npp$7.parseBindingAtom = function() {\n  if (this.options.ecmaVersion >= 6) {\n    switch (this.type) {\n    case types$1.bracketL:\n      var node = this.startNode();\n      this.next();\n      node.elements = this.parseBindingList(types$1.bracketR, true, true);\n      return this.finishNode(node, \"ArrayPattern\")\n\n    case types$1.braceL:\n      return this.parseObj(true)\n    }\n  }\n  return this.parseIdent()\n};\n\npp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma) {\n  var elts = [], first = true;\n  while (!this.eat(close)) {\n    if (first) { first = false; }\n    else { this.expect(types$1.comma); }\n    if (allowEmpty && this.type === types$1.comma) {\n      elts.push(null);\n    } else if (allowTrailingComma && this.afterTrailingComma(close)) {\n      break\n    } else if (this.type === types$1.ellipsis) {\n      var rest = this.parseRestBinding();\n      this.parseBindingListItem(rest);\n      elts.push(rest);\n      if (this.type === types$1.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n      this.expect(close);\n      break\n    } else {\n      var elem = this.parseMaybeDefault(this.start, this.startLoc);\n      this.parseBindingListItem(elem);\n      elts.push(elem);\n    }\n  }\n  return elts\n};\n\npp$7.parseBindingListItem = function(param) {\n  return param\n};\n\n// Parses assignment pattern around given atom if possible.\n\npp$7.parseMaybeDefault = function(startPos, startLoc, left) {\n  left = left || this.parseBindingAtom();\n  if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left }\n  var node = this.startNodeAt(startPos, startLoc);\n  node.left = left;\n  node.right = this.parseMaybeAssign();\n  return this.finishNode(node, \"AssignmentPattern\")\n};\n\n// The following three functions all verify that a node is an lvalue —\n// something that can be bound, or assigned to. In order to do so, they perform\n// a variety of checks:\n//\n// - Check that none of the bound/assigned-to identifiers are reserved words.\n// - Record name declarations for bindings in the appropriate scope.\n// - Check duplicate argument names, if checkClashes is set.\n//\n// If a complex binding pattern is encountered (e.g., object and array\n// destructuring), the entire pattern is recursively checked.\n//\n// There are three versions of checkLVal*() appropriate for different\n// circumstances:\n//\n// - checkLValSimple() shall be used if the syntactic construct supports\n//   nothing other than identifiers and member expressions. Parenthesized\n//   expressions are also correctly handled. This is generally appropriate for\n//   constructs for which the spec says\n//\n//   > It is a Syntax Error if AssignmentTargetType of [the production] is not\n//   > simple.\n//\n//   It is also appropriate for checking if an identifier is valid and not\n//   defined elsewhere, like import declarations or function/class identifiers.\n//\n//   Examples where this is used include:\n//     a += …;\n//     import a from '…';\n//   where a is the node to be checked.\n//\n// - checkLValPattern() shall be used if the syntactic construct supports\n//   anything checkLValSimple() supports, as well as object and array\n//   destructuring patterns. This is generally appropriate for constructs for\n//   which the spec says\n//\n//   > It is a Syntax Error if [the production] is neither an ObjectLiteral nor\n//   > an ArrayLiteral and AssignmentTargetType of [the production] is not\n//   > simple.\n//\n//   Examples where this is used include:\n//     (a = …);\n//     const a = …;\n//     try { … } catch (a) { … }\n//   where a is the node to be checked.\n//\n// - checkLValInnerPattern() shall be used if the syntactic construct supports\n//   anything checkLValPattern() supports, as well as default assignment\n//   patterns, rest elements, and other constructs that may appear within an\n//   object or array destructuring pattern.\n//\n//   As a special case, function parameters also use checkLValInnerPattern(),\n//   as they also support defaults and rest constructs.\n//\n// These functions deliberately support both assignment and binding constructs,\n// as the logic for both is exceedingly similar. If the node is the target of\n// an assignment, then bindingType should be set to BIND_NONE. Otherwise, it\n// should be set to the appropriate BIND_* constant, like BIND_VAR or\n// BIND_LEXICAL.\n//\n// If the function is called with a non-BIND_NONE bindingType, then\n// additionally a checkClashes object may be specified to allow checking for\n// duplicate argument names. checkClashes is ignored if the provided construct\n// is an assignment (i.e., bindingType is BIND_NONE).\n\npp$7.checkLValSimple = function(expr, bindingType, checkClashes) {\n  if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n  var isBind = bindingType !== BIND_NONE;\n\n  switch (expr.type) {\n  case \"Identifier\":\n    if (this.strict && this.reservedWordsStrictBind.test(expr.name))\n      { this.raiseRecoverable(expr.start, (isBind ? \"Binding \" : \"Assigning to \") + expr.name + \" in strict mode\"); }\n    if (isBind) {\n      if (bindingType === BIND_LEXICAL && expr.name === \"let\")\n        { this.raiseRecoverable(expr.start, \"let is disallowed as a lexically bound name\"); }\n      if (checkClashes) {\n        if (hasOwn(checkClashes, expr.name))\n          { this.raiseRecoverable(expr.start, \"Argument name clash\"); }\n        checkClashes[expr.name] = true;\n      }\n      if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }\n    }\n    break\n\n  case \"ChainExpression\":\n    this.raiseRecoverable(expr.start, \"Optional chaining cannot appear in left-hand side\");\n    break\n\n  case \"MemberExpression\":\n    if (isBind) { this.raiseRecoverable(expr.start, \"Binding member expression\"); }\n    break\n\n  case \"ParenthesizedExpression\":\n    if (isBind) { this.raiseRecoverable(expr.start, \"Binding parenthesized expression\"); }\n    return this.checkLValSimple(expr.expression, bindingType, checkClashes)\n\n  default:\n    this.raise(expr.start, (isBind ? \"Binding\" : \"Assigning to\") + \" rvalue\");\n  }\n};\n\npp$7.checkLValPattern = function(expr, bindingType, checkClashes) {\n  if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n  switch (expr.type) {\n  case \"ObjectPattern\":\n    for (var i = 0, list = expr.properties; i < list.length; i += 1) {\n      var prop = list[i];\n\n    this.checkLValInnerPattern(prop, bindingType, checkClashes);\n    }\n    break\n\n  case \"ArrayPattern\":\n    for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {\n      var elem = list$1[i$1];\n\n    if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); }\n    }\n    break\n\n  default:\n    this.checkLValSimple(expr, bindingType, checkClashes);\n  }\n};\n\npp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) {\n  if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n  switch (expr.type) {\n  case \"Property\":\n    // AssignmentProperty has type === \"Property\"\n    this.checkLValInnerPattern(expr.value, bindingType, checkClashes);\n    break\n\n  case \"AssignmentPattern\":\n    this.checkLValPattern(expr.left, bindingType, checkClashes);\n    break\n\n  case \"RestElement\":\n    this.checkLValPattern(expr.argument, bindingType, checkClashes);\n    break\n\n  default:\n    this.checkLValPattern(expr, bindingType, checkClashes);\n  }\n};\n\n// The algorithm used to determine whether a regexp can appear at a\n\nvar TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {\n  this.token = token;\n  this.isExpr = !!isExpr;\n  this.preserveSpace = !!preserveSpace;\n  this.override = override;\n  this.generator = !!generator;\n};\n\nvar types = {\n  b_stat: new TokContext(\"{\", false),\n  b_expr: new TokContext(\"{\", true),\n  b_tmpl: new TokContext(\"${\", false),\n  p_stat: new TokContext(\"(\", false),\n  p_expr: new TokContext(\"(\", true),\n  q_tmpl: new TokContext(\"`\", true, true, function (p) { return p.tryReadTemplateToken(); }),\n  f_stat: new TokContext(\"function\", false),\n  f_expr: new TokContext(\"function\", true),\n  f_expr_gen: new TokContext(\"function\", true, false, null, true),\n  f_gen: new TokContext(\"function\", false, false, null, true)\n};\n\nvar pp$6 = Parser.prototype;\n\npp$6.initialContext = function() {\n  return [types.b_stat]\n};\n\npp$6.curContext = function() {\n  return this.context[this.context.length - 1]\n};\n\npp$6.braceIsBlock = function(prevType) {\n  var parent = this.curContext();\n  if (parent === types.f_expr || parent === types.f_stat)\n    { return true }\n  if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr))\n    { return !parent.isExpr }\n\n  // The check for `tt.name && exprAllowed` detects whether we are\n  // after a `yield` or `of` construct. See the `updateContext` for\n  // `tt.name`.\n  if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed)\n    { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }\n  if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow)\n    { return true }\n  if (prevType === types$1.braceL)\n    { return parent === types.b_stat }\n  if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name)\n    { return false }\n  return !this.exprAllowed\n};\n\npp$6.inGeneratorContext = function() {\n  for (var i = this.context.length - 1; i >= 1; i--) {\n    var context = this.context[i];\n    if (context.token === \"function\")\n      { return context.generator }\n  }\n  return false\n};\n\npp$6.updateContext = function(prevType) {\n  var update, type = this.type;\n  if (type.keyword && prevType === types$1.dot)\n    { this.exprAllowed = false; }\n  else if (update = type.updateContext)\n    { update.call(this, prevType); }\n  else\n    { this.exprAllowed = type.beforeExpr; }\n};\n\n// Used to handle egde cases when token context could not be inferred correctly during tokenization phase\n\npp$6.overrideContext = function(tokenCtx) {\n  if (this.curContext() !== tokenCtx) {\n    this.context[this.context.length - 1] = tokenCtx;\n  }\n};\n\n// Token-specific context update code\n\ntypes$1.parenR.updateContext = types$1.braceR.updateContext = function() {\n  if (this.context.length === 1) {\n    this.exprAllowed = true;\n    return\n  }\n  var out = this.context.pop();\n  if (out === types.b_stat && this.curContext().token === \"function\") {\n    out = this.context.pop();\n  }\n  this.exprAllowed = !out.isExpr;\n};\n\ntypes$1.braceL.updateContext = function(prevType) {\n  this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);\n  this.exprAllowed = true;\n};\n\ntypes$1.dollarBraceL.updateContext = function() {\n  this.context.push(types.b_tmpl);\n  this.exprAllowed = true;\n};\n\ntypes$1.parenL.updateContext = function(prevType) {\n  var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while;\n  this.context.push(statementParens ? types.p_stat : types.p_expr);\n  this.exprAllowed = true;\n};\n\ntypes$1.incDec.updateContext = function() {\n  // tokExprAllowed stays unchanged\n};\n\ntypes$1._function.updateContext = types$1._class.updateContext = function(prevType) {\n  if (prevType.beforeExpr && prevType !== types$1._else &&\n      !(prevType === types$1.semi && this.curContext() !== types.p_stat) &&\n      !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&\n      !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat))\n    { this.context.push(types.f_expr); }\n  else\n    { this.context.push(types.f_stat); }\n  this.exprAllowed = false;\n};\n\ntypes$1.backQuote.updateContext = function() {\n  if (this.curContext() === types.q_tmpl)\n    { this.context.pop(); }\n  else\n    { this.context.push(types.q_tmpl); }\n  this.exprAllowed = false;\n};\n\ntypes$1.star.updateContext = function(prevType) {\n  if (prevType === types$1._function) {\n    var index = this.context.length - 1;\n    if (this.context[index] === types.f_expr)\n      { this.context[index] = types.f_expr_gen; }\n    else\n      { this.context[index] = types.f_gen; }\n  }\n  this.exprAllowed = true;\n};\n\ntypes$1.name.updateContext = function(prevType) {\n  var allowed = false;\n  if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) {\n    if (this.value === \"of\" && !this.exprAllowed ||\n        this.value === \"yield\" && this.inGeneratorContext())\n      { allowed = true; }\n  }\n  this.exprAllowed = allowed;\n};\n\n// A recursive descent parser operates by defining functions for all\n\nvar pp$5 = Parser.prototype;\n\n// Check if property name clashes with already added.\n// Object/class getters and setters are not allowed to clash —\n// either with each other or with an init property — and in\n// strict mode, init properties are also not allowed to be repeated.\n\npp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) {\n  if (this.options.ecmaVersion >= 9 && prop.type === \"SpreadElement\")\n    { return }\n  if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))\n    { return }\n  var key = prop.key;\n  var name;\n  switch (key.type) {\n  case \"Identifier\": name = key.name; break\n  case \"Literal\": name = String(key.value); break\n  default: return\n  }\n  var kind = prop.kind;\n  if (this.options.ecmaVersion >= 6) {\n    if (name === \"__proto__\" && kind === \"init\") {\n      if (propHash.proto) {\n        if (refDestructuringErrors) {\n          if (refDestructuringErrors.doubleProto < 0) {\n            refDestructuringErrors.doubleProto = key.start;\n          }\n        } else {\n          this.raiseRecoverable(key.start, \"Redefinition of __proto__ property\");\n        }\n      }\n      propHash.proto = true;\n    }\n    return\n  }\n  name = \"$\" + name;\n  var other = propHash[name];\n  if (other) {\n    var redefinition;\n    if (kind === \"init\") {\n      redefinition = this.strict && other.init || other.get || other.set;\n    } else {\n      redefinition = other.init || other[kind];\n    }\n    if (redefinition)\n      { this.raiseRecoverable(key.start, \"Redefinition of property\"); }\n  } else {\n    other = propHash[name] = {\n      init: false,\n      get: false,\n      set: false\n    };\n  }\n  other[kind] = true;\n};\n\n// ### Expression parsing\n\n// These nest, from the most general expression type at the top to\n// 'atomic', nondivisible expression types at the bottom. Most of\n// the functions will simply let the function(s) below them parse,\n// and, *if* the syntactic construct they handle is present, wrap\n// the AST node that the inner parser gave them in another node.\n\n// Parse a full expression. The optional arguments are used to\n// forbid the `in` operator (in for loops initalization expressions)\n// and provide reference for storing '=' operator inside shorthand\n// property assignment in contexts where both object expression\n// and object pattern might appear (so it's possible to raise\n// delayed syntax error at correct position).\n\npp$5.parseExpression = function(forInit, refDestructuringErrors) {\n  var startPos = this.start, startLoc = this.startLoc;\n  var expr = this.parseMaybeAssign(forInit, refDestructuringErrors);\n  if (this.type === types$1.comma) {\n    var node = this.startNodeAt(startPos, startLoc);\n    node.expressions = [expr];\n    while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); }\n    return this.finishNode(node, \"SequenceExpression\")\n  }\n  return expr\n};\n\n// Parse an assignment expression. This includes applications of\n// operators like `+=`.\n\npp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) {\n  if (this.isContextual(\"yield\")) {\n    if (this.inGenerator) { return this.parseYield(forInit) }\n    // The tokenizer will assume an expression is allowed after\n    // `yield`, but this isn't that kind of yield\n    else { this.exprAllowed = false; }\n  }\n\n  var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1;\n  if (refDestructuringErrors) {\n    oldParenAssign = refDestructuringErrors.parenthesizedAssign;\n    oldTrailingComma = refDestructuringErrors.trailingComma;\n    oldDoubleProto = refDestructuringErrors.doubleProto;\n    refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;\n  } else {\n    refDestructuringErrors = new DestructuringErrors;\n    ownDestructuringErrors = true;\n  }\n\n  var startPos = this.start, startLoc = this.startLoc;\n  if (this.type === types$1.parenL || this.type === types$1.name) {\n    this.potentialArrowAt = this.start;\n    this.potentialArrowInForAwait = forInit === \"await\";\n  }\n  var left = this.parseMaybeConditional(forInit, refDestructuringErrors);\n  if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }\n  if (this.type.isAssign) {\n    var node = this.startNodeAt(startPos, startLoc);\n    node.operator = this.value;\n    if (this.type === types$1.eq)\n      { left = this.toAssignable(left, false, refDestructuringErrors); }\n    if (!ownDestructuringErrors) {\n      refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;\n    }\n    if (refDestructuringErrors.shorthandAssign >= left.start)\n      { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly\n    if (this.type === types$1.eq)\n      { this.checkLValPattern(left); }\n    else\n      { this.checkLValSimple(left); }\n    node.left = left;\n    this.next();\n    node.right = this.parseMaybeAssign(forInit);\n    if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; }\n    return this.finishNode(node, \"AssignmentExpression\")\n  } else {\n    if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }\n  }\n  if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }\n  if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }\n  return left\n};\n\n// Parse a ternary conditional (`?:`) operator.\n\npp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) {\n  var startPos = this.start, startLoc = this.startLoc;\n  var expr = this.parseExprOps(forInit, refDestructuringErrors);\n  if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n  if (this.eat(types$1.question)) {\n    var node = this.startNodeAt(startPos, startLoc);\n    node.test = expr;\n    node.consequent = this.parseMaybeAssign();\n    this.expect(types$1.colon);\n    node.alternate = this.parseMaybeAssign(forInit);\n    return this.finishNode(node, \"ConditionalExpression\")\n  }\n  return expr\n};\n\n// Start the precedence parser.\n\npp$5.parseExprOps = function(forInit, refDestructuringErrors) {\n  var startPos = this.start, startLoc = this.startLoc;\n  var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit);\n  if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n  return expr.start === startPos && expr.type === \"ArrowFunctionExpression\" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit)\n};\n\n// Parse binary operators with the operator precedence parsing\n// algorithm. `left` is the left-hand side of the operator.\n// `minPrec` provides context that allows the function to stop and\n// defer further parser to one of its callers when it encounters an\n// operator that has a lower precedence than the set it is parsing.\n\npp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) {\n  var prec = this.type.binop;\n  if (prec != null && (!forInit || this.type !== types$1._in)) {\n    if (prec > minPrec) {\n      var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND;\n      var coalesce = this.type === types$1.coalesce;\n      if (coalesce) {\n        // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.\n        // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.\n        prec = types$1.logicalAND.binop;\n      }\n      var op = this.value;\n      this.next();\n      var startPos = this.start, startLoc = this.startLoc;\n      var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit);\n      var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);\n      if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) {\n        this.raiseRecoverable(this.start, \"Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses\");\n      }\n      return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit)\n    }\n  }\n  return left\n};\n\npp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) {\n  if (right.type === \"PrivateIdentifier\") { this.raise(right.start, \"Private identifier can only be left side of binary expression\"); }\n  var node = this.startNodeAt(startPos, startLoc);\n  node.left = left;\n  node.operator = op;\n  node.right = right;\n  return this.finishNode(node, logical ? \"LogicalExpression\" : \"BinaryExpression\")\n};\n\n// Parse unary operators, both prefix and postfix.\n\npp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) {\n  var startPos = this.start, startLoc = this.startLoc, expr;\n  if (this.isContextual(\"await\") && this.canAwait) {\n    expr = this.parseAwait(forInit);\n    sawUnary = true;\n  } else if (this.type.prefix) {\n    var node = this.startNode(), update = this.type === types$1.incDec;\n    node.operator = this.value;\n    node.prefix = true;\n    this.next();\n    node.argument = this.parseMaybeUnary(null, true, update, forInit);\n    this.checkExpressionErrors(refDestructuringErrors, true);\n    if (update) { this.checkLValSimple(node.argument); }\n    else if (this.strict && node.operator === \"delete\" &&\n             node.argument.type === \"Identifier\")\n      { this.raiseRecoverable(node.start, \"Deleting local variable in strict mode\"); }\n    else if (node.operator === \"delete\" && isPrivateFieldAccess(node.argument))\n      { this.raiseRecoverable(node.start, \"Private fields can not be deleted\"); }\n    else { sawUnary = true; }\n    expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n  } else if (!sawUnary && this.type === types$1.privateId) {\n    if (forInit || this.privateNameStack.length === 0) { this.unexpected(); }\n    expr = this.parsePrivateIdent();\n    // only could be private fields in 'in', such as #x in obj\n    if (this.type !== types$1._in) { this.unexpected(); }\n  } else {\n    expr = this.parseExprSubscripts(refDestructuringErrors, forInit);\n    if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n    while (this.type.postfix && !this.canInsertSemicolon()) {\n      var node$1 = this.startNodeAt(startPos, startLoc);\n      node$1.operator = this.value;\n      node$1.prefix = false;\n      node$1.argument = expr;\n      this.checkLValSimple(expr);\n      this.next();\n      expr = this.finishNode(node$1, \"UpdateExpression\");\n    }\n  }\n\n  if (!incDec && this.eat(types$1.starstar)) {\n    if (sawUnary)\n      { this.unexpected(this.lastTokStart); }\n    else\n      { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), \"**\", false) }\n  } else {\n    return expr\n  }\n};\n\nfunction isPrivateFieldAccess(node) {\n  return (\n    node.type === \"MemberExpression\" && node.property.type === \"PrivateIdentifier\" ||\n    node.type === \"ChainExpression\" && isPrivateFieldAccess(node.expression)\n  )\n}\n\n// Parse call, dot, and `[]`-subscript expressions.\n\npp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) {\n  var startPos = this.start, startLoc = this.startLoc;\n  var expr = this.parseExprAtom(refDestructuringErrors, forInit);\n  if (expr.type === \"ArrowFunctionExpression\" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== \")\")\n    { return expr }\n  var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit);\n  if (refDestructuringErrors && result.type === \"MemberExpression\") {\n    if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }\n    if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }\n    if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; }\n  }\n  return result\n};\n\npp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) {\n  var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === \"Identifier\" && base.name === \"async\" &&\n      this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&\n      this.potentialArrowAt === base.start;\n  var optionalChained = false;\n\n  while (true) {\n    var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit);\n\n    if (element.optional) { optionalChained = true; }\n    if (element === base || element.type === \"ArrowFunctionExpression\") {\n      if (optionalChained) {\n        var chainNode = this.startNodeAt(startPos, startLoc);\n        chainNode.expression = element;\n        element = this.finishNode(chainNode, \"ChainExpression\");\n      }\n      return element\n    }\n\n    base = element;\n  }\n};\n\npp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {\n  var optionalSupported = this.options.ecmaVersion >= 11;\n  var optional = optionalSupported && this.eat(types$1.questionDot);\n  if (noCalls && optional) { this.raise(this.lastTokStart, \"Optional chaining cannot appear in the callee of new expressions\"); }\n\n  var computed = this.eat(types$1.bracketL);\n  if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) {\n    var node = this.startNodeAt(startPos, startLoc);\n    node.object = base;\n    if (computed) {\n      node.property = this.parseExpression();\n      this.expect(types$1.bracketR);\n    } else if (this.type === types$1.privateId && base.type !== \"Super\") {\n      node.property = this.parsePrivateIdent();\n    } else {\n      node.property = this.parseIdent(this.options.allowReserved !== \"never\");\n    }\n    node.computed = !!computed;\n    if (optionalSupported) {\n      node.optional = optional;\n    }\n    base = this.finishNode(node, \"MemberExpression\");\n  } else if (!noCalls && this.eat(types$1.parenL)) {\n    var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n    this.yieldPos = 0;\n    this.awaitPos = 0;\n    this.awaitIdentPos = 0;\n    var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);\n    if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {\n      this.checkPatternErrors(refDestructuringErrors, false);\n      this.checkYieldAwaitInDefaultParams();\n      if (this.awaitIdentPos > 0)\n        { this.raise(this.awaitIdentPos, \"Cannot use 'await' as identifier inside an async function\"); }\n      this.yieldPos = oldYieldPos;\n      this.awaitPos = oldAwaitPos;\n      this.awaitIdentPos = oldAwaitIdentPos;\n      return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit)\n    }\n    this.checkExpressionErrors(refDestructuringErrors, true);\n    this.yieldPos = oldYieldPos || this.yieldPos;\n    this.awaitPos = oldAwaitPos || this.awaitPos;\n    this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;\n    var node$1 = this.startNodeAt(startPos, startLoc);\n    node$1.callee = base;\n    node$1.arguments = exprList;\n    if (optionalSupported) {\n      node$1.optional = optional;\n    }\n    base = this.finishNode(node$1, \"CallExpression\");\n  } else if (this.type === types$1.backQuote) {\n    if (optional || optionalChained) {\n      this.raise(this.start, \"Optional chaining cannot appear in the tag of tagged template expressions\");\n    }\n    var node$2 = this.startNodeAt(startPos, startLoc);\n    node$2.tag = base;\n    node$2.quasi = this.parseTemplate({isTagged: true});\n    base = this.finishNode(node$2, \"TaggedTemplateExpression\");\n  }\n  return base\n};\n\n// Parse an atomic expression — either a single token that is an\n// expression, an expression started by a keyword like `function` or\n// `new`, or an expression wrapped in punctuation like `()`, `[]`,\n// or `{}`.\n\npp$5.parseExprAtom = function(refDestructuringErrors, forInit) {\n  // If a division operator appears in an expression position, the\n  // tokenizer got confused, and we force it to read a regexp instead.\n  if (this.type === types$1.slash) { this.readRegexp(); }\n\n  var node, canBeArrow = this.potentialArrowAt === this.start;\n  switch (this.type) {\n  case types$1._super:\n    if (!this.allowSuper)\n      { this.raise(this.start, \"'super' keyword outside a method\"); }\n    node = this.startNode();\n    this.next();\n    if (this.type === types$1.parenL && !this.allowDirectSuper)\n      { this.raise(node.start, \"super() call outside constructor of a subclass\"); }\n    // The `super` keyword can appear at below:\n    // SuperProperty:\n    //     super [ Expression ]\n    //     super . IdentifierName\n    // SuperCall:\n    //     super ( Arguments )\n    if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL)\n      { this.unexpected(); }\n    return this.finishNode(node, \"Super\")\n\n  case types$1._this:\n    node = this.startNode();\n    this.next();\n    return this.finishNode(node, \"ThisExpression\")\n\n  case types$1.name:\n    var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;\n    var id = this.parseIdent(false);\n    if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === \"async\" && !this.canInsertSemicolon() && this.eat(types$1._function)) {\n      this.overrideContext(types.f_expr);\n      return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit)\n    }\n    if (canBeArrow && !this.canInsertSemicolon()) {\n      if (this.eat(types$1.arrow))\n        { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) }\n      if (this.options.ecmaVersion >= 8 && id.name === \"async\" && this.type === types$1.name && !containsEsc &&\n          (!this.potentialArrowInForAwait || this.value !== \"of\" || this.containsEsc)) {\n        id = this.parseIdent(false);\n        if (this.canInsertSemicolon() || !this.eat(types$1.arrow))\n          { this.unexpected(); }\n        return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit)\n      }\n    }\n    return id\n\n  case types$1.regexp:\n    var value = this.value;\n    node = this.parseLiteral(value.value);\n    node.regex = {pattern: value.pattern, flags: value.flags};\n    return node\n\n  case types$1.num: case types$1.string:\n    return this.parseLiteral(this.value)\n\n  case types$1._null: case types$1._true: case types$1._false:\n    node = this.startNode();\n    node.value = this.type === types$1._null ? null : this.type === types$1._true;\n    node.raw = this.type.keyword;\n    this.next();\n    return this.finishNode(node, \"Literal\")\n\n  case types$1.parenL:\n    var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit);\n    if (refDestructuringErrors) {\n      if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))\n        { refDestructuringErrors.parenthesizedAssign = start; }\n      if (refDestructuringErrors.parenthesizedBind < 0)\n        { refDestructuringErrors.parenthesizedBind = start; }\n    }\n    return expr\n\n  case types$1.bracketL:\n    node = this.startNode();\n    this.next();\n    node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors);\n    return this.finishNode(node, \"ArrayExpression\")\n\n  case types$1.braceL:\n    this.overrideContext(types.b_expr);\n    return this.parseObj(false, refDestructuringErrors)\n\n  case types$1._function:\n    node = this.startNode();\n    this.next();\n    return this.parseFunction(node, 0)\n\n  case types$1._class:\n    return this.parseClass(this.startNode(), false)\n\n  case types$1._new:\n    return this.parseNew()\n\n  case types$1.backQuote:\n    return this.parseTemplate()\n\n  case types$1._import:\n    if (this.options.ecmaVersion >= 11) {\n      return this.parseExprImport()\n    } else {\n      return this.unexpected()\n    }\n\n  default:\n    this.unexpected();\n  }\n};\n\npp$5.parseExprImport = function() {\n  var node = this.startNode();\n\n  // Consume `import` as an identifier for `import.meta`.\n  // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.\n  if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword import\"); }\n  var meta = this.parseIdent(true);\n\n  switch (this.type) {\n  case types$1.parenL:\n    return this.parseDynamicImport(node)\n  case types$1.dot:\n    node.meta = meta;\n    return this.parseImportMeta(node)\n  default:\n    this.unexpected();\n  }\n};\n\npp$5.parseDynamicImport = function(node) {\n  this.next(); // skip `(`\n\n  // Parse node.source.\n  node.source = this.parseMaybeAssign();\n\n  // Verify ending.\n  if (!this.eat(types$1.parenR)) {\n    var errorPos = this.start;\n    if (this.eat(types$1.comma) && this.eat(types$1.parenR)) {\n      this.raiseRecoverable(errorPos, \"Trailing comma is not allowed in import()\");\n    } else {\n      this.unexpected(errorPos);\n    }\n  }\n\n  return this.finishNode(node, \"ImportExpression\")\n};\n\npp$5.parseImportMeta = function(node) {\n  this.next(); // skip `.`\n\n  var containsEsc = this.containsEsc;\n  node.property = this.parseIdent(true);\n\n  if (node.property.name !== \"meta\")\n    { this.raiseRecoverable(node.property.start, \"The only valid meta property for import is 'import.meta'\"); }\n  if (containsEsc)\n    { this.raiseRecoverable(node.start, \"'import.meta' must not contain escaped characters\"); }\n  if (this.options.sourceType !== \"module\" && !this.options.allowImportExportEverywhere)\n    { this.raiseRecoverable(node.start, \"Cannot use 'import.meta' outside a module\"); }\n\n  return this.finishNode(node, \"MetaProperty\")\n};\n\npp$5.parseLiteral = function(value) {\n  var node = this.startNode();\n  node.value = value;\n  node.raw = this.input.slice(this.start, this.end);\n  if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, \"\"); }\n  this.next();\n  return this.finishNode(node, \"Literal\")\n};\n\npp$5.parseParenExpression = function() {\n  this.expect(types$1.parenL);\n  var val = this.parseExpression();\n  this.expect(types$1.parenR);\n  return val\n};\n\npp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) {\n  var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;\n  if (this.options.ecmaVersion >= 6) {\n    this.next();\n\n    var innerStartPos = this.start, innerStartLoc = this.startLoc;\n    var exprList = [], first = true, lastIsComma = false;\n    var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;\n    this.yieldPos = 0;\n    this.awaitPos = 0;\n    // Do not save awaitIdentPos to allow checking awaits nested in parameters\n    while (this.type !== types$1.parenR) {\n      first ? first = false : this.expect(types$1.comma);\n      if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) {\n        lastIsComma = true;\n        break\n      } else if (this.type === types$1.ellipsis) {\n        spreadStart = this.start;\n        exprList.push(this.parseParenItem(this.parseRestBinding()));\n        if (this.type === types$1.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n        break\n      } else {\n        exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));\n      }\n    }\n    var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc;\n    this.expect(types$1.parenR);\n\n    if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {\n      this.checkPatternErrors(refDestructuringErrors, false);\n      this.checkYieldAwaitInDefaultParams();\n      this.yieldPos = oldYieldPos;\n      this.awaitPos = oldAwaitPos;\n      return this.parseParenArrowList(startPos, startLoc, exprList, forInit)\n    }\n\n    if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }\n    if (spreadStart) { this.unexpected(spreadStart); }\n    this.checkExpressionErrors(refDestructuringErrors, true);\n    this.yieldPos = oldYieldPos || this.yieldPos;\n    this.awaitPos = oldAwaitPos || this.awaitPos;\n\n    if (exprList.length > 1) {\n      val = this.startNodeAt(innerStartPos, innerStartLoc);\n      val.expressions = exprList;\n      this.finishNodeAt(val, \"SequenceExpression\", innerEndPos, innerEndLoc);\n    } else {\n      val = exprList[0];\n    }\n  } else {\n    val = this.parseParenExpression();\n  }\n\n  if (this.options.preserveParens) {\n    var par = this.startNodeAt(startPos, startLoc);\n    par.expression = val;\n    return this.finishNode(par, \"ParenthesizedExpression\")\n  } else {\n    return val\n  }\n};\n\npp$5.parseParenItem = function(item) {\n  return item\n};\n\npp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) {\n  return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit)\n};\n\n// New's precedence is slightly tricky. It must allow its argument to\n// be a `[]` or dot subscript expression, but not a call — at least,\n// not without wrapping it in parentheses. Thus, it uses the noCalls\n// argument to parseSubscripts to prevent it from consuming the\n// argument list.\n\nvar empty = [];\n\npp$5.parseNew = function() {\n  if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword new\"); }\n  var node = this.startNode();\n  var meta = this.parseIdent(true);\n  if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {\n    node.meta = meta;\n    var containsEsc = this.containsEsc;\n    node.property = this.parseIdent(true);\n    if (node.property.name !== \"target\")\n      { this.raiseRecoverable(node.property.start, \"The only valid meta property for new is 'new.target'\"); }\n    if (containsEsc)\n      { this.raiseRecoverable(node.start, \"'new.target' must not contain escaped characters\"); }\n    if (!this.allowNewDotTarget)\n      { this.raiseRecoverable(node.start, \"'new.target' can only be used in functions and class static block\"); }\n    return this.finishNode(node, \"MetaProperty\")\n  }\n  var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import;\n  node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false);\n  if (isImport && node.callee.type === \"ImportExpression\") {\n    this.raise(startPos, \"Cannot use new with import()\");\n  }\n  if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); }\n  else { node.arguments = empty; }\n  return this.finishNode(node, \"NewExpression\")\n};\n\n// Parse template expression.\n\npp$5.parseTemplateElement = function(ref) {\n  var isTagged = ref.isTagged;\n\n  var elem = this.startNode();\n  if (this.type === types$1.invalidTemplate) {\n    if (!isTagged) {\n      this.raiseRecoverable(this.start, \"Bad escape sequence in untagged template literal\");\n    }\n    elem.value = {\n      raw: this.value,\n      cooked: null\n    };\n  } else {\n    elem.value = {\n      raw: this.input.slice(this.start, this.end).replace(/\\r\\n?/g, \"\\n\"),\n      cooked: this.value\n    };\n  }\n  this.next();\n  elem.tail = this.type === types$1.backQuote;\n  return this.finishNode(elem, \"TemplateElement\")\n};\n\npp$5.parseTemplate = function(ref) {\n  if ( ref === void 0 ) ref = {};\n  var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;\n\n  var node = this.startNode();\n  this.next();\n  node.expressions = [];\n  var curElt = this.parseTemplateElement({isTagged: isTagged});\n  node.quasis = [curElt];\n  while (!curElt.tail) {\n    if (this.type === types$1.eof) { this.raise(this.pos, \"Unterminated template literal\"); }\n    this.expect(types$1.dollarBraceL);\n    node.expressions.push(this.parseExpression());\n    this.expect(types$1.braceR);\n    node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));\n  }\n  this.next();\n  return this.finishNode(node, \"TemplateLiteral\")\n};\n\npp$5.isAsyncProp = function(prop) {\n  return !prop.computed && prop.key.type === \"Identifier\" && prop.key.name === \"async\" &&\n    (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) &&\n    !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n};\n\n// Parse an object literal or binding pattern.\n\npp$5.parseObj = function(isPattern, refDestructuringErrors) {\n  var node = this.startNode(), first = true, propHash = {};\n  node.properties = [];\n  this.next();\n  while (!this.eat(types$1.braceR)) {\n    if (!first) {\n      this.expect(types$1.comma);\n      if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break }\n    } else { first = false; }\n\n    var prop = this.parseProperty(isPattern, refDestructuringErrors);\n    if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }\n    node.properties.push(prop);\n  }\n  return this.finishNode(node, isPattern ? \"ObjectPattern\" : \"ObjectExpression\")\n};\n\npp$5.parseProperty = function(isPattern, refDestructuringErrors) {\n  var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;\n  if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) {\n    if (isPattern) {\n      prop.argument = this.parseIdent(false);\n      if (this.type === types$1.comma) {\n        this.raise(this.start, \"Comma is not permitted after the rest element\");\n      }\n      return this.finishNode(prop, \"RestElement\")\n    }\n    // Parse argument.\n    prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n    // To disallow trailing comma via `this.toAssignable()`.\n    if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {\n      refDestructuringErrors.trailingComma = this.start;\n    }\n    // Finish\n    return this.finishNode(prop, \"SpreadElement\")\n  }\n  if (this.options.ecmaVersion >= 6) {\n    prop.method = false;\n    prop.shorthand = false;\n    if (isPattern || refDestructuringErrors) {\n      startPos = this.start;\n      startLoc = this.startLoc;\n    }\n    if (!isPattern)\n      { isGenerator = this.eat(types$1.star); }\n  }\n  var containsEsc = this.containsEsc;\n  this.parsePropertyName(prop);\n  if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {\n    isAsync = true;\n    isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star);\n    this.parsePropertyName(prop);\n  } else {\n    isAsync = false;\n  }\n  this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);\n  return this.finishNode(prop, \"Property\")\n};\n\npp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {\n  if ((isGenerator || isAsync) && this.type === types$1.colon)\n    { this.unexpected(); }\n\n  if (this.eat(types$1.colon)) {\n    prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);\n    prop.kind = \"init\";\n  } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) {\n    if (isPattern) { this.unexpected(); }\n    prop.kind = \"init\";\n    prop.method = true;\n    prop.value = this.parseMethod(isGenerator, isAsync);\n  } else if (!isPattern && !containsEsc &&\n             this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === \"Identifier\" &&\n             (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n             (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) {\n    if (isGenerator || isAsync) { this.unexpected(); }\n    prop.kind = prop.key.name;\n    this.parsePropertyName(prop);\n    prop.value = this.parseMethod(false);\n    var paramCount = prop.kind === \"get\" ? 0 : 1;\n    if (prop.value.params.length !== paramCount) {\n      var start = prop.value.start;\n      if (prop.kind === \"get\")\n        { this.raiseRecoverable(start, \"getter should have no params\"); }\n      else\n        { this.raiseRecoverable(start, \"setter should have exactly one param\"); }\n    } else {\n      if (prop.kind === \"set\" && prop.value.params[0].type === \"RestElement\")\n        { this.raiseRecoverable(prop.value.params[0].start, \"Setter cannot use rest params\"); }\n    }\n  } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === \"Identifier\") {\n    if (isGenerator || isAsync) { this.unexpected(); }\n    this.checkUnreserved(prop.key);\n    if (prop.key.name === \"await\" && !this.awaitIdentPos)\n      { this.awaitIdentPos = startPos; }\n    prop.kind = \"init\";\n    if (isPattern) {\n      prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n    } else if (this.type === types$1.eq && refDestructuringErrors) {\n      if (refDestructuringErrors.shorthandAssign < 0)\n        { refDestructuringErrors.shorthandAssign = this.start; }\n      prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n    } else {\n      prop.value = this.copyNode(prop.key);\n    }\n    prop.shorthand = true;\n  } else { this.unexpected(); }\n};\n\npp$5.parsePropertyName = function(prop) {\n  if (this.options.ecmaVersion >= 6) {\n    if (this.eat(types$1.bracketL)) {\n      prop.computed = true;\n      prop.key = this.parseMaybeAssign();\n      this.expect(types$1.bracketR);\n      return prop.key\n    } else {\n      prop.computed = false;\n    }\n  }\n  return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== \"never\")\n};\n\n// Initialize empty function node.\n\npp$5.initFunction = function(node) {\n  node.id = null;\n  if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }\n  if (this.options.ecmaVersion >= 8) { node.async = false; }\n};\n\n// Parse object or class method.\n\npp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {\n  var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n  this.initFunction(node);\n  if (this.options.ecmaVersion >= 6)\n    { node.generator = isGenerator; }\n  if (this.options.ecmaVersion >= 8)\n    { node.async = !!isAsync; }\n\n  this.yieldPos = 0;\n  this.awaitPos = 0;\n  this.awaitIdentPos = 0;\n  this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));\n\n  this.expect(types$1.parenL);\n  node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n  this.checkYieldAwaitInDefaultParams();\n  this.parseFunctionBody(node, false, true, false);\n\n  this.yieldPos = oldYieldPos;\n  this.awaitPos = oldAwaitPos;\n  this.awaitIdentPos = oldAwaitIdentPos;\n  return this.finishNode(node, \"FunctionExpression\")\n};\n\n// Parse arrow function expression with given parameters.\n\npp$5.parseArrowExpression = function(node, params, isAsync, forInit) {\n  var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n  this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);\n  this.initFunction(node);\n  if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }\n\n  this.yieldPos = 0;\n  this.awaitPos = 0;\n  this.awaitIdentPos = 0;\n\n  node.params = this.toAssignableList(params, true);\n  this.parseFunctionBody(node, true, false, forInit);\n\n  this.yieldPos = oldYieldPos;\n  this.awaitPos = oldAwaitPos;\n  this.awaitIdentPos = oldAwaitIdentPos;\n  return this.finishNode(node, \"ArrowFunctionExpression\")\n};\n\n// Parse function body and check parameters.\n\npp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) {\n  var isExpression = isArrowFunction && this.type !== types$1.braceL;\n  var oldStrict = this.strict, useStrict = false;\n\n  if (isExpression) {\n    node.body = this.parseMaybeAssign(forInit);\n    node.expression = true;\n    this.checkParams(node, false);\n  } else {\n    var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);\n    if (!oldStrict || nonSimple) {\n      useStrict = this.strictDirective(this.end);\n      // If this is a strict mode function, verify that argument names\n      // are not repeated, and it does not try to bind the words `eval`\n      // or `arguments`.\n      if (useStrict && nonSimple)\n        { this.raiseRecoverable(node.start, \"Illegal 'use strict' directive in function with non-simple parameter list\"); }\n    }\n    // Start a new scope with regard to labels and the `inFunction`\n    // flag (restore them to their old value afterwards).\n    var oldLabels = this.labels;\n    this.labels = [];\n    if (useStrict) { this.strict = true; }\n\n    // Add the params to varDeclaredNames to ensure that an error is thrown\n    // if a let/const declaration in the function clashes with one of the params.\n    this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));\n    // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'\n    if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); }\n    node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);\n    node.expression = false;\n    this.adaptDirectivePrologue(node.body.body);\n    this.labels = oldLabels;\n  }\n  this.exitScope();\n};\n\npp$5.isSimpleParamList = function(params) {\n  for (var i = 0, list = params; i < list.length; i += 1)\n    {\n    var param = list[i];\n\n    if (param.type !== \"Identifier\") { return false\n  } }\n  return true\n};\n\n// Checks function params for various disallowed patterns such as using \"eval\"\n// or \"arguments\" and duplicate parameters.\n\npp$5.checkParams = function(node, allowDuplicates) {\n  var nameHash = Object.create(null);\n  for (var i = 0, list = node.params; i < list.length; i += 1)\n    {\n    var param = list[i];\n\n    this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);\n  }\n};\n\n// Parses a comma-separated list of expressions, and returns them as\n// an array. `close` is the token type that ends the list, and\n// `allowEmpty` can be turned on to allow subsequent commas with\n// nothing in between them to be parsed as `null` (which is needed\n// for array literals).\n\npp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {\n  var elts = [], first = true;\n  while (!this.eat(close)) {\n    if (!first) {\n      this.expect(types$1.comma);\n      if (allowTrailingComma && this.afterTrailingComma(close)) { break }\n    } else { first = false; }\n\n    var elt = (void 0);\n    if (allowEmpty && this.type === types$1.comma)\n      { elt = null; }\n    else if (this.type === types$1.ellipsis) {\n      elt = this.parseSpread(refDestructuringErrors);\n      if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0)\n        { refDestructuringErrors.trailingComma = this.start; }\n    } else {\n      elt = this.parseMaybeAssign(false, refDestructuringErrors);\n    }\n    elts.push(elt);\n  }\n  return elts\n};\n\npp$5.checkUnreserved = function(ref) {\n  var start = ref.start;\n  var end = ref.end;\n  var name = ref.name;\n\n  if (this.inGenerator && name === \"yield\")\n    { this.raiseRecoverable(start, \"Cannot use 'yield' as identifier inside a generator\"); }\n  if (this.inAsync && name === \"await\")\n    { this.raiseRecoverable(start, \"Cannot use 'await' as identifier inside an async function\"); }\n  if (this.currentThisScope().inClassFieldInit && name === \"arguments\")\n    { this.raiseRecoverable(start, \"Cannot use 'arguments' in class field initializer\"); }\n  if (this.inClassStaticBlock && (name === \"arguments\" || name === \"await\"))\n    { this.raise(start, (\"Cannot use \" + name + \" in class static initialization block\")); }\n  if (this.keywords.test(name))\n    { this.raise(start, (\"Unexpected keyword '\" + name + \"'\")); }\n  if (this.options.ecmaVersion < 6 &&\n    this.input.slice(start, end).indexOf(\"\\\\\") !== -1) { return }\n  var re = this.strict ? this.reservedWordsStrict : this.reservedWords;\n  if (re.test(name)) {\n    if (!this.inAsync && name === \"await\")\n      { this.raiseRecoverable(start, \"Cannot use keyword 'await' outside an async function\"); }\n    this.raiseRecoverable(start, (\"The keyword '\" + name + \"' is reserved\"));\n  }\n};\n\n// Parse the next token as an identifier. If `liberal` is true (used\n// when parsing properties), it will also convert keywords into\n// identifiers.\n\npp$5.parseIdent = function(liberal) {\n  var node = this.startNode();\n  if (this.type === types$1.name) {\n    node.name = this.value;\n  } else if (this.type.keyword) {\n    node.name = this.type.keyword;\n\n    // To fix https://github.com/acornjs/acorn/issues/575\n    // `class` and `function` keywords push new context into this.context.\n    // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.\n    // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword\n    if ((node.name === \"class\" || node.name === \"function\") &&\n        (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {\n      this.context.pop();\n    }\n  } else {\n    this.unexpected();\n  }\n  this.next(!!liberal);\n  this.finishNode(node, \"Identifier\");\n  if (!liberal) {\n    this.checkUnreserved(node);\n    if (node.name === \"await\" && !this.awaitIdentPos)\n      { this.awaitIdentPos = node.start; }\n  }\n  return node\n};\n\npp$5.parsePrivateIdent = function() {\n  var node = this.startNode();\n  if (this.type === types$1.privateId) {\n    node.name = this.value;\n  } else {\n    this.unexpected();\n  }\n  this.next();\n  this.finishNode(node, \"PrivateIdentifier\");\n\n  // For validating existence\n  if (this.privateNameStack.length === 0) {\n    this.raise(node.start, (\"Private field '#\" + (node.name) + \"' must be declared in an enclosing class\"));\n  } else {\n    this.privateNameStack[this.privateNameStack.length - 1].used.push(node);\n  }\n\n  return node\n};\n\n// Parses yield expression inside generator.\n\npp$5.parseYield = function(forInit) {\n  if (!this.yieldPos) { this.yieldPos = this.start; }\n\n  var node = this.startNode();\n  this.next();\n  if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) {\n    node.delegate = false;\n    node.argument = null;\n  } else {\n    node.delegate = this.eat(types$1.star);\n    node.argument = this.parseMaybeAssign(forInit);\n  }\n  return this.finishNode(node, \"YieldExpression\")\n};\n\npp$5.parseAwait = function(forInit) {\n  if (!this.awaitPos) { this.awaitPos = this.start; }\n\n  var node = this.startNode();\n  this.next();\n  node.argument = this.parseMaybeUnary(null, true, false, forInit);\n  return this.finishNode(node, \"AwaitExpression\")\n};\n\nvar pp$4 = Parser.prototype;\n\n// This function is used to raise exceptions on parse errors. It\n// takes an offset integer (into the current `input`) to indicate\n// the location of the error, attaches the position to the end\n// of the error message, and then raises a `SyntaxError` with that\n// message.\n\npp$4.raise = function(pos, message) {\n  var loc = getLineInfo(this.input, pos);\n  message += \" (\" + loc.line + \":\" + loc.column + \")\";\n  var err = new SyntaxError(message);\n  err.pos = pos; err.loc = loc; err.raisedAt = this.pos;\n  throw err\n};\n\npp$4.raiseRecoverable = pp$4.raise;\n\npp$4.curPosition = function() {\n  if (this.options.locations) {\n    return new Position(this.curLine, this.pos - this.lineStart)\n  }\n};\n\nvar pp$3 = Parser.prototype;\n\nvar Scope = function Scope(flags) {\n  this.flags = flags;\n  // A list of var-declared names in the current lexical scope\n  this.var = [];\n  // A list of lexically-declared names in the current lexical scope\n  this.lexical = [];\n  // A list of lexically-declared FunctionDeclaration names in the current lexical scope\n  this.functions = [];\n  // A switch to disallow the identifier reference 'arguments'\n  this.inClassFieldInit = false;\n};\n\n// The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.\n\npp$3.enterScope = function(flags) {\n  this.scopeStack.push(new Scope(flags));\n};\n\npp$3.exitScope = function() {\n  this.scopeStack.pop();\n};\n\n// The spec says:\n// > At the top level of a function, or script, function declarations are\n// > treated like var declarations rather than like lexical declarations.\npp$3.treatFunctionsAsVarInScope = function(scope) {\n  return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)\n};\n\npp$3.declareName = function(name, bindingType, pos) {\n  var redeclared = false;\n  if (bindingType === BIND_LEXICAL) {\n    var scope = this.currentScope();\n    redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;\n    scope.lexical.push(name);\n    if (this.inModule && (scope.flags & SCOPE_TOP))\n      { delete this.undefinedExports[name]; }\n  } else if (bindingType === BIND_SIMPLE_CATCH) {\n    var scope$1 = this.currentScope();\n    scope$1.lexical.push(name);\n  } else if (bindingType === BIND_FUNCTION) {\n    var scope$2 = this.currentScope();\n    if (this.treatFunctionsAsVar)\n      { redeclared = scope$2.lexical.indexOf(name) > -1; }\n    else\n      { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }\n    scope$2.functions.push(name);\n  } else {\n    for (var i = this.scopeStack.length - 1; i >= 0; --i) {\n      var scope$3 = this.scopeStack[i];\n      if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||\n          !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {\n        redeclared = true;\n        break\n      }\n      scope$3.var.push(name);\n      if (this.inModule && (scope$3.flags & SCOPE_TOP))\n        { delete this.undefinedExports[name]; }\n      if (scope$3.flags & SCOPE_VAR) { break }\n    }\n  }\n  if (redeclared) { this.raiseRecoverable(pos, (\"Identifier '\" + name + \"' has already been declared\")); }\n};\n\npp$3.checkLocalExport = function(id) {\n  // scope.functions must be empty as Module code is always strict.\n  if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&\n      this.scopeStack[0].var.indexOf(id.name) === -1) {\n    this.undefinedExports[id.name] = id;\n  }\n};\n\npp$3.currentScope = function() {\n  return this.scopeStack[this.scopeStack.length - 1]\n};\n\npp$3.currentVarScope = function() {\n  for (var i = this.scopeStack.length - 1;; i--) {\n    var scope = this.scopeStack[i];\n    if (scope.flags & SCOPE_VAR) { return scope }\n  }\n};\n\n// Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\npp$3.currentThisScope = function() {\n  for (var i = this.scopeStack.length - 1;; i--) {\n    var scope = this.scopeStack[i];\n    if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }\n  }\n};\n\nvar Node = function Node(parser, pos, loc) {\n  this.type = \"\";\n  this.start = pos;\n  this.end = 0;\n  if (parser.options.locations)\n    { this.loc = new SourceLocation(parser, loc); }\n  if (parser.options.directSourceFile)\n    { this.sourceFile = parser.options.directSourceFile; }\n  if (parser.options.ranges)\n    { this.range = [pos, 0]; }\n};\n\n// Start an AST node, attaching a start offset.\n\nvar pp$2 = Parser.prototype;\n\npp$2.startNode = function() {\n  return new Node(this, this.start, this.startLoc)\n};\n\npp$2.startNodeAt = function(pos, loc) {\n  return new Node(this, pos, loc)\n};\n\n// Finish an AST node, adding `type` and `end` properties.\n\nfunction finishNodeAt(node, type, pos, loc) {\n  node.type = type;\n  node.end = pos;\n  if (this.options.locations)\n    { node.loc.end = loc; }\n  if (this.options.ranges)\n    { node.range[1] = pos; }\n  return node\n}\n\npp$2.finishNode = function(node, type) {\n  return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)\n};\n\n// Finish node at given position\n\npp$2.finishNodeAt = function(node, type, pos, loc) {\n  return finishNodeAt.call(this, node, type, pos, loc)\n};\n\npp$2.copyNode = function(node) {\n  var newNode = new Node(this, node.start, this.startLoc);\n  for (var prop in node) { newNode[prop] = node[prop]; }\n  return newNode\n};\n\n// This file contains Unicode properties extracted from the ECMAScript specification.\n// The lists are extracted like so:\n// $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)\n\n// #table-binary-unicode-properties\nvar ecma9BinaryProperties = \"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS\";\nvar ecma10BinaryProperties = ecma9BinaryProperties + \" Extended_Pictographic\";\nvar ecma11BinaryProperties = ecma10BinaryProperties;\nvar ecma12BinaryProperties = ecma11BinaryProperties + \" EBase EComp EMod EPres ExtPict\";\nvar ecma13BinaryProperties = ecma12BinaryProperties;\nvar ecma14BinaryProperties = ecma13BinaryProperties;\n\nvar unicodeBinaryProperties = {\n  9: ecma9BinaryProperties,\n  10: ecma10BinaryProperties,\n  11: ecma11BinaryProperties,\n  12: ecma12BinaryProperties,\n  13: ecma13BinaryProperties,\n  14: ecma14BinaryProperties\n};\n\n// #table-unicode-general-category-values\nvar unicodeGeneralCategoryValues = \"Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu\";\n\n// #table-unicode-script-values\nvar ecma9ScriptValues = \"Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb\";\nvar ecma10ScriptValues = ecma9ScriptValues + \" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd\";\nvar ecma11ScriptValues = ecma10ScriptValues + \" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho\";\nvar ecma12ScriptValues = ecma11ScriptValues + \" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi\";\nvar ecma13ScriptValues = ecma12ScriptValues + \" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith\";\nvar ecma14ScriptValues = ecma13ScriptValues + \" Kawi Nag_Mundari Nagm\";\n\nvar unicodeScriptValues = {\n  9: ecma9ScriptValues,\n  10: ecma10ScriptValues,\n  11: ecma11ScriptValues,\n  12: ecma12ScriptValues,\n  13: ecma13ScriptValues,\n  14: ecma14ScriptValues\n};\n\nvar data = {};\nfunction buildUnicodeData(ecmaVersion) {\n  var d = data[ecmaVersion] = {\n    binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + \" \" + unicodeGeneralCategoryValues),\n    nonBinary: {\n      General_Category: wordsRegexp(unicodeGeneralCategoryValues),\n      Script: wordsRegexp(unicodeScriptValues[ecmaVersion])\n    }\n  };\n  d.nonBinary.Script_Extensions = d.nonBinary.Script;\n\n  d.nonBinary.gc = d.nonBinary.General_Category;\n  d.nonBinary.sc = d.nonBinary.Script;\n  d.nonBinary.scx = d.nonBinary.Script_Extensions;\n}\n\nfor (var i = 0, list = [9, 10, 11, 12, 13, 14]; i < list.length; i += 1) {\n  var ecmaVersion = list[i];\n\n  buildUnicodeData(ecmaVersion);\n}\n\nvar pp$1 = Parser.prototype;\n\nvar RegExpValidationState = function RegExpValidationState(parser) {\n  this.parser = parser;\n  this.validFlags = \"gim\" + (parser.options.ecmaVersion >= 6 ? \"uy\" : \"\") + (parser.options.ecmaVersion >= 9 ? \"s\" : \"\") + (parser.options.ecmaVersion >= 13 ? \"d\" : \"\");\n  this.unicodeProperties = data[parser.options.ecmaVersion >= 14 ? 14 : parser.options.ecmaVersion];\n  this.source = \"\";\n  this.flags = \"\";\n  this.start = 0;\n  this.switchU = false;\n  this.switchN = false;\n  this.pos = 0;\n  this.lastIntValue = 0;\n  this.lastStringValue = \"\";\n  this.lastAssertionIsQuantifiable = false;\n  this.numCapturingParens = 0;\n  this.maxBackReference = 0;\n  this.groupNames = [];\n  this.backReferenceNames = [];\n};\n\nRegExpValidationState.prototype.reset = function reset (start, pattern, flags) {\n  var unicode = flags.indexOf(\"u\") !== -1;\n  this.start = start | 0;\n  this.source = pattern + \"\";\n  this.flags = flags;\n  this.switchU = unicode && this.parser.options.ecmaVersion >= 6;\n  this.switchN = unicode && this.parser.options.ecmaVersion >= 9;\n};\n\nRegExpValidationState.prototype.raise = function raise (message) {\n  this.parser.raiseRecoverable(this.start, (\"Invalid regular expression: /\" + (this.source) + \"/: \" + message));\n};\n\n// If u flag is given, this returns the code point at the index (it combines a surrogate pair).\n// Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).\nRegExpValidationState.prototype.at = function at (i, forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n  var s = this.source;\n  var l = s.length;\n  if (i >= l) {\n    return -1\n  }\n  var c = s.charCodeAt(i);\n  if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {\n    return c\n  }\n  var next = s.charCodeAt(i + 1);\n  return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c\n};\n\nRegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n  var s = this.source;\n  var l = s.length;\n  if (i >= l) {\n    return l\n  }\n  var c = s.charCodeAt(i), next;\n  if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||\n      (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {\n    return i + 1\n  }\n  return i + 2\n};\n\nRegExpValidationState.prototype.current = function current (forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n  return this.at(this.pos, forceU)\n};\n\nRegExpValidationState.prototype.lookahead = function lookahead (forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n  return this.at(this.nextIndex(this.pos, forceU), forceU)\n};\n\nRegExpValidationState.prototype.advance = function advance (forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n  this.pos = this.nextIndex(this.pos, forceU);\n};\n\nRegExpValidationState.prototype.eat = function eat (ch, forceU) {\n    if ( forceU === void 0 ) forceU = false;\n\n  if (this.current(forceU) === ch) {\n    this.advance(forceU);\n    return true\n  }\n  return false\n};\n\n/**\n * Validate the flags part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\npp$1.validateRegExpFlags = function(state) {\n  var validFlags = state.validFlags;\n  var flags = state.flags;\n\n  for (var i = 0; i < flags.length; i++) {\n    var flag = flags.charAt(i);\n    if (validFlags.indexOf(flag) === -1) {\n      this.raise(state.start, \"Invalid regular expression flag\");\n    }\n    if (flags.indexOf(flag, i + 1) > -1) {\n      this.raise(state.start, \"Duplicate regular expression flag\");\n    }\n  }\n};\n\n/**\n * Validate the pattern part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\npp$1.validateRegExpPattern = function(state) {\n  this.regexp_pattern(state);\n\n  // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of\n  // parsing contains a |GroupName|, reparse with the goal symbol\n  // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*\n  // exception if _P_ did not conform to the grammar, if any elements of _P_\n  // were not matched by the parse, or if any Early Error conditions exist.\n  if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) {\n    state.switchN = true;\n    this.regexp_pattern(state);\n  }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern\npp$1.regexp_pattern = function(state) {\n  state.pos = 0;\n  state.lastIntValue = 0;\n  state.lastStringValue = \"\";\n  state.lastAssertionIsQuantifiable = false;\n  state.numCapturingParens = 0;\n  state.maxBackReference = 0;\n  state.groupNames.length = 0;\n  state.backReferenceNames.length = 0;\n\n  this.regexp_disjunction(state);\n\n  if (state.pos !== state.source.length) {\n    // Make the same messages as V8.\n    if (state.eat(0x29 /* ) */)) {\n      state.raise(\"Unmatched ')'\");\n    }\n    if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {\n      state.raise(\"Lone quantifier brackets\");\n    }\n  }\n  if (state.maxBackReference > state.numCapturingParens) {\n    state.raise(\"Invalid escape\");\n  }\n  for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {\n    var name = list[i];\n\n    if (state.groupNames.indexOf(name) === -1) {\n      state.raise(\"Invalid named capture referenced\");\n    }\n  }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction\npp$1.regexp_disjunction = function(state) {\n  this.regexp_alternative(state);\n  while (state.eat(0x7C /* | */)) {\n    this.regexp_alternative(state);\n  }\n\n  // Make the same message as V8.\n  if (this.regexp_eatQuantifier(state, true)) {\n    state.raise(\"Nothing to repeat\");\n  }\n  if (state.eat(0x7B /* { */)) {\n    state.raise(\"Lone quantifier brackets\");\n  }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative\npp$1.regexp_alternative = function(state) {\n  while (state.pos < state.source.length && this.regexp_eatTerm(state))\n    { }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term\npp$1.regexp_eatTerm = function(state) {\n  if (this.regexp_eatAssertion(state)) {\n    // Handle `QuantifiableAssertion Quantifier` alternative.\n    // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion\n    // is a QuantifiableAssertion.\n    if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {\n      // Make the same message as V8.\n      if (state.switchU) {\n        state.raise(\"Invalid quantifier\");\n      }\n    }\n    return true\n  }\n\n  if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {\n    this.regexp_eatQuantifier(state);\n    return true\n  }\n\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion\npp$1.regexp_eatAssertion = function(state) {\n  var start = state.pos;\n  state.lastAssertionIsQuantifiable = false;\n\n  // ^, $\n  if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {\n    return true\n  }\n\n  // \\b \\B\n  if (state.eat(0x5C /* \\ */)) {\n    if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {\n      return true\n    }\n    state.pos = start;\n  }\n\n  // Lookahead / Lookbehind\n  if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {\n    var lookbehind = false;\n    if (this.options.ecmaVersion >= 9) {\n      lookbehind = state.eat(0x3C /* < */);\n    }\n    if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {\n      this.regexp_disjunction(state);\n      if (!state.eat(0x29 /* ) */)) {\n        state.raise(\"Unterminated group\");\n      }\n      state.lastAssertionIsQuantifiable = !lookbehind;\n      return true\n    }\n  }\n\n  state.pos = start;\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier\npp$1.regexp_eatQuantifier = function(state, noError) {\n  if ( noError === void 0 ) noError = false;\n\n  if (this.regexp_eatQuantifierPrefix(state, noError)) {\n    state.eat(0x3F /* ? */);\n    return true\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix\npp$1.regexp_eatQuantifierPrefix = function(state, noError) {\n  return (\n    state.eat(0x2A /* * */) ||\n    state.eat(0x2B /* + */) ||\n    state.eat(0x3F /* ? */) ||\n    this.regexp_eatBracedQuantifier(state, noError)\n  )\n};\npp$1.regexp_eatBracedQuantifier = function(state, noError) {\n  var start = state.pos;\n  if (state.eat(0x7B /* { */)) {\n    var min = 0, max = -1;\n    if (this.regexp_eatDecimalDigits(state)) {\n      min = state.lastIntValue;\n      if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {\n        max = state.lastIntValue;\n      }\n      if (state.eat(0x7D /* } */)) {\n        // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term\n        if (max !== -1 && max < min && !noError) {\n          state.raise(\"numbers out of order in {} quantifier\");\n        }\n        return true\n      }\n    }\n    if (state.switchU && !noError) {\n      state.raise(\"Incomplete quantifier\");\n    }\n    state.pos = start;\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Atom\npp$1.regexp_eatAtom = function(state) {\n  return (\n    this.regexp_eatPatternCharacters(state) ||\n    state.eat(0x2E /* . */) ||\n    this.regexp_eatReverseSolidusAtomEscape(state) ||\n    this.regexp_eatCharacterClass(state) ||\n    this.regexp_eatUncapturingGroup(state) ||\n    this.regexp_eatCapturingGroup(state)\n  )\n};\npp$1.regexp_eatReverseSolidusAtomEscape = function(state) {\n  var start = state.pos;\n  if (state.eat(0x5C /* \\ */)) {\n    if (this.regexp_eatAtomEscape(state)) {\n      return true\n    }\n    state.pos = start;\n  }\n  return false\n};\npp$1.regexp_eatUncapturingGroup = function(state) {\n  var start = state.pos;\n  if (state.eat(0x28 /* ( */)) {\n    if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) {\n      this.regexp_disjunction(state);\n      if (state.eat(0x29 /* ) */)) {\n        return true\n      }\n      state.raise(\"Unterminated group\");\n    }\n    state.pos = start;\n  }\n  return false\n};\npp$1.regexp_eatCapturingGroup = function(state) {\n  if (state.eat(0x28 /* ( */)) {\n    if (this.options.ecmaVersion >= 9) {\n      this.regexp_groupSpecifier(state);\n    } else if (state.current() === 0x3F /* ? */) {\n      state.raise(\"Invalid group\");\n    }\n    this.regexp_disjunction(state);\n    if (state.eat(0x29 /* ) */)) {\n      state.numCapturingParens += 1;\n      return true\n    }\n    state.raise(\"Unterminated group\");\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom\npp$1.regexp_eatExtendedAtom = function(state) {\n  return (\n    state.eat(0x2E /* . */) ||\n    this.regexp_eatReverseSolidusAtomEscape(state) ||\n    this.regexp_eatCharacterClass(state) ||\n    this.regexp_eatUncapturingGroup(state) ||\n    this.regexp_eatCapturingGroup(state) ||\n    this.regexp_eatInvalidBracedQuantifier(state) ||\n    this.regexp_eatExtendedPatternCharacter(state)\n  )\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier\npp$1.regexp_eatInvalidBracedQuantifier = function(state) {\n  if (this.regexp_eatBracedQuantifier(state, true)) {\n    state.raise(\"Nothing to repeat\");\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter\npp$1.regexp_eatSyntaxCharacter = function(state) {\n  var ch = state.current();\n  if (isSyntaxCharacter(ch)) {\n    state.lastIntValue = ch;\n    state.advance();\n    return true\n  }\n  return false\n};\nfunction isSyntaxCharacter(ch) {\n  return (\n    ch === 0x24 /* $ */ ||\n    ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||\n    ch === 0x2E /* . */ ||\n    ch === 0x3F /* ? */ ||\n    ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||\n    ch >= 0x7B /* { */ && ch <= 0x7D /* } */\n  )\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter\n// But eat eager.\npp$1.regexp_eatPatternCharacters = function(state) {\n  var start = state.pos;\n  var ch = 0;\n  while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {\n    state.advance();\n  }\n  return state.pos !== start\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter\npp$1.regexp_eatExtendedPatternCharacter = function(state) {\n  var ch = state.current();\n  if (\n    ch !== -1 &&\n    ch !== 0x24 /* $ */ &&\n    !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&\n    ch !== 0x2E /* . */ &&\n    ch !== 0x3F /* ? */ &&\n    ch !== 0x5B /* [ */ &&\n    ch !== 0x5E /* ^ */ &&\n    ch !== 0x7C /* | */\n  ) {\n    state.advance();\n    return true\n  }\n  return false\n};\n\n// GroupSpecifier ::\n//   [empty]\n//   `?` GroupName\npp$1.regexp_groupSpecifier = function(state) {\n  if (state.eat(0x3F /* ? */)) {\n    if (this.regexp_eatGroupName(state)) {\n      if (state.groupNames.indexOf(state.lastStringValue) !== -1) {\n        state.raise(\"Duplicate capture group name\");\n      }\n      state.groupNames.push(state.lastStringValue);\n      return\n    }\n    state.raise(\"Invalid group\");\n  }\n};\n\n// GroupName ::\n//   `<` RegExpIdentifierName `>`\n// Note: this updates `state.lastStringValue` property with the eaten name.\npp$1.regexp_eatGroupName = function(state) {\n  state.lastStringValue = \"\";\n  if (state.eat(0x3C /* < */)) {\n    if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {\n      return true\n    }\n    state.raise(\"Invalid capture group name\");\n  }\n  return false\n};\n\n// RegExpIdentifierName ::\n//   RegExpIdentifierStart\n//   RegExpIdentifierName RegExpIdentifierPart\n// Note: this updates `state.lastStringValue` property with the eaten name.\npp$1.regexp_eatRegExpIdentifierName = function(state) {\n  state.lastStringValue = \"\";\n  if (this.regexp_eatRegExpIdentifierStart(state)) {\n    state.lastStringValue += codePointToString(state.lastIntValue);\n    while (this.regexp_eatRegExpIdentifierPart(state)) {\n      state.lastStringValue += codePointToString(state.lastIntValue);\n    }\n    return true\n  }\n  return false\n};\n\n// RegExpIdentifierStart ::\n//   UnicodeIDStart\n//   `$`\n//   `_`\n//   `\\` RegExpUnicodeEscapeSequence[+U]\npp$1.regexp_eatRegExpIdentifierStart = function(state) {\n  var start = state.pos;\n  var forceU = this.options.ecmaVersion >= 11;\n  var ch = state.current(forceU);\n  state.advance(forceU);\n\n  if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n    ch = state.lastIntValue;\n  }\n  if (isRegExpIdentifierStart(ch)) {\n    state.lastIntValue = ch;\n    return true\n  }\n\n  state.pos = start;\n  return false\n};\nfunction isRegExpIdentifierStart(ch) {\n  return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */\n}\n\n// RegExpIdentifierPart ::\n//   UnicodeIDContinue\n//   `$`\n//   `_`\n//   `\\` RegExpUnicodeEscapeSequence[+U]\n//   <ZWNJ>\n//   <ZWJ>\npp$1.regexp_eatRegExpIdentifierPart = function(state) {\n  var start = state.pos;\n  var forceU = this.options.ecmaVersion >= 11;\n  var ch = state.current(forceU);\n  state.advance(forceU);\n\n  if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n    ch = state.lastIntValue;\n  }\n  if (isRegExpIdentifierPart(ch)) {\n    state.lastIntValue = ch;\n    return true\n  }\n\n  state.pos = start;\n  return false\n};\nfunction isRegExpIdentifierPart(ch) {\n  return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape\npp$1.regexp_eatAtomEscape = function(state) {\n  if (\n    this.regexp_eatBackReference(state) ||\n    this.regexp_eatCharacterClassEscape(state) ||\n    this.regexp_eatCharacterEscape(state) ||\n    (state.switchN && this.regexp_eatKGroupName(state))\n  ) {\n    return true\n  }\n  if (state.switchU) {\n    // Make the same message as V8.\n    if (state.current() === 0x63 /* c */) {\n      state.raise(\"Invalid unicode escape\");\n    }\n    state.raise(\"Invalid escape\");\n  }\n  return false\n};\npp$1.regexp_eatBackReference = function(state) {\n  var start = state.pos;\n  if (this.regexp_eatDecimalEscape(state)) {\n    var n = state.lastIntValue;\n    if (state.switchU) {\n      // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape\n      if (n > state.maxBackReference) {\n        state.maxBackReference = n;\n      }\n      return true\n    }\n    if (n <= state.numCapturingParens) {\n      return true\n    }\n    state.pos = start;\n  }\n  return false\n};\npp$1.regexp_eatKGroupName = function(state) {\n  if (state.eat(0x6B /* k */)) {\n    if (this.regexp_eatGroupName(state)) {\n      state.backReferenceNames.push(state.lastStringValue);\n      return true\n    }\n    state.raise(\"Invalid named reference\");\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape\npp$1.regexp_eatCharacterEscape = function(state) {\n  return (\n    this.regexp_eatControlEscape(state) ||\n    this.regexp_eatCControlLetter(state) ||\n    this.regexp_eatZero(state) ||\n    this.regexp_eatHexEscapeSequence(state) ||\n    this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||\n    (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||\n    this.regexp_eatIdentityEscape(state)\n  )\n};\npp$1.regexp_eatCControlLetter = function(state) {\n  var start = state.pos;\n  if (state.eat(0x63 /* c */)) {\n    if (this.regexp_eatControlLetter(state)) {\n      return true\n    }\n    state.pos = start;\n  }\n  return false\n};\npp$1.regexp_eatZero = function(state) {\n  if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {\n    state.lastIntValue = 0;\n    state.advance();\n    return true\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape\npp$1.regexp_eatControlEscape = function(state) {\n  var ch = state.current();\n  if (ch === 0x74 /* t */) {\n    state.lastIntValue = 0x09; /* \\t */\n    state.advance();\n    return true\n  }\n  if (ch === 0x6E /* n */) {\n    state.lastIntValue = 0x0A; /* \\n */\n    state.advance();\n    return true\n  }\n  if (ch === 0x76 /* v */) {\n    state.lastIntValue = 0x0B; /* \\v */\n    state.advance();\n    return true\n  }\n  if (ch === 0x66 /* f */) {\n    state.lastIntValue = 0x0C; /* \\f */\n    state.advance();\n    return true\n  }\n  if (ch === 0x72 /* r */) {\n    state.lastIntValue = 0x0D; /* \\r */\n    state.advance();\n    return true\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter\npp$1.regexp_eatControlLetter = function(state) {\n  var ch = state.current();\n  if (isControlLetter(ch)) {\n    state.lastIntValue = ch % 0x20;\n    state.advance();\n    return true\n  }\n  return false\n};\nfunction isControlLetter(ch) {\n  return (\n    (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||\n    (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)\n  )\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence\npp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {\n  if ( forceU === void 0 ) forceU = false;\n\n  var start = state.pos;\n  var switchU = forceU || state.switchU;\n\n  if (state.eat(0x75 /* u */)) {\n    if (this.regexp_eatFixedHexDigits(state, 4)) {\n      var lead = state.lastIntValue;\n      if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {\n        var leadSurrogateEnd = state.pos;\n        if (state.eat(0x5C /* \\ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {\n          var trail = state.lastIntValue;\n          if (trail >= 0xDC00 && trail <= 0xDFFF) {\n            state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;\n            return true\n          }\n        }\n        state.pos = leadSurrogateEnd;\n        state.lastIntValue = lead;\n      }\n      return true\n    }\n    if (\n      switchU &&\n      state.eat(0x7B /* { */) &&\n      this.regexp_eatHexDigits(state) &&\n      state.eat(0x7D /* } */) &&\n      isValidUnicode(state.lastIntValue)\n    ) {\n      return true\n    }\n    if (switchU) {\n      state.raise(\"Invalid unicode escape\");\n    }\n    state.pos = start;\n  }\n\n  return false\n};\nfunction isValidUnicode(ch) {\n  return ch >= 0 && ch <= 0x10FFFF\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape\npp$1.regexp_eatIdentityEscape = function(state) {\n  if (state.switchU) {\n    if (this.regexp_eatSyntaxCharacter(state)) {\n      return true\n    }\n    if (state.eat(0x2F /* / */)) {\n      state.lastIntValue = 0x2F; /* / */\n      return true\n    }\n    return false\n  }\n\n  var ch = state.current();\n  if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {\n    state.lastIntValue = ch;\n    state.advance();\n    return true\n  }\n\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape\npp$1.regexp_eatDecimalEscape = function(state) {\n  state.lastIntValue = 0;\n  var ch = state.current();\n  if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {\n    do {\n      state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n      state.advance();\n    } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)\n    return true\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape\npp$1.regexp_eatCharacterClassEscape = function(state) {\n  var ch = state.current();\n\n  if (isCharacterClassEscape(ch)) {\n    state.lastIntValue = -1;\n    state.advance();\n    return true\n  }\n\n  if (\n    state.switchU &&\n    this.options.ecmaVersion >= 9 &&\n    (ch === 0x50 /* P */ || ch === 0x70 /* p */)\n  ) {\n    state.lastIntValue = -1;\n    state.advance();\n    if (\n      state.eat(0x7B /* { */) &&\n      this.regexp_eatUnicodePropertyValueExpression(state) &&\n      state.eat(0x7D /* } */)\n    ) {\n      return true\n    }\n    state.raise(\"Invalid property name\");\n  }\n\n  return false\n};\nfunction isCharacterClassEscape(ch) {\n  return (\n    ch === 0x64 /* d */ ||\n    ch === 0x44 /* D */ ||\n    ch === 0x73 /* s */ ||\n    ch === 0x53 /* S */ ||\n    ch === 0x77 /* w */ ||\n    ch === 0x57 /* W */\n  )\n}\n\n// UnicodePropertyValueExpression ::\n//   UnicodePropertyName `=` UnicodePropertyValue\n//   LoneUnicodePropertyNameOrValue\npp$1.regexp_eatUnicodePropertyValueExpression = function(state) {\n  var start = state.pos;\n\n  // UnicodePropertyName `=` UnicodePropertyValue\n  if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {\n    var name = state.lastStringValue;\n    if (this.regexp_eatUnicodePropertyValue(state)) {\n      var value = state.lastStringValue;\n      this.regexp_validateUnicodePropertyNameAndValue(state, name, value);\n      return true\n    }\n  }\n  state.pos = start;\n\n  // LoneUnicodePropertyNameOrValue\n  if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {\n    var nameOrValue = state.lastStringValue;\n    this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue);\n    return true\n  }\n  return false\n};\npp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {\n  if (!hasOwn(state.unicodeProperties.nonBinary, name))\n    { state.raise(\"Invalid property name\"); }\n  if (!state.unicodeProperties.nonBinary[name].test(value))\n    { state.raise(\"Invalid property value\"); }\n};\npp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {\n  if (!state.unicodeProperties.binary.test(nameOrValue))\n    { state.raise(\"Invalid property name\"); }\n};\n\n// UnicodePropertyName ::\n//   UnicodePropertyNameCharacters\npp$1.regexp_eatUnicodePropertyName = function(state) {\n  var ch = 0;\n  state.lastStringValue = \"\";\n  while (isUnicodePropertyNameCharacter(ch = state.current())) {\n    state.lastStringValue += codePointToString(ch);\n    state.advance();\n  }\n  return state.lastStringValue !== \"\"\n};\nfunction isUnicodePropertyNameCharacter(ch) {\n  return isControlLetter(ch) || ch === 0x5F /* _ */\n}\n\n// UnicodePropertyValue ::\n//   UnicodePropertyValueCharacters\npp$1.regexp_eatUnicodePropertyValue = function(state) {\n  var ch = 0;\n  state.lastStringValue = \"\";\n  while (isUnicodePropertyValueCharacter(ch = state.current())) {\n    state.lastStringValue += codePointToString(ch);\n    state.advance();\n  }\n  return state.lastStringValue !== \"\"\n};\nfunction isUnicodePropertyValueCharacter(ch) {\n  return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)\n}\n\n// LoneUnicodePropertyNameOrValue ::\n//   UnicodePropertyValueCharacters\npp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {\n  return this.regexp_eatUnicodePropertyValue(state)\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass\npp$1.regexp_eatCharacterClass = function(state) {\n  if (state.eat(0x5B /* [ */)) {\n    state.eat(0x5E /* ^ */);\n    this.regexp_classRanges(state);\n    if (state.eat(0x5D /* ] */)) {\n      return true\n    }\n    // Unreachable since it threw \"unterminated regular expression\" error before.\n    state.raise(\"Unterminated character class\");\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges\n// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges\n// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash\npp$1.regexp_classRanges = function(state) {\n  while (this.regexp_eatClassAtom(state)) {\n    var left = state.lastIntValue;\n    if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {\n      var right = state.lastIntValue;\n      if (state.switchU && (left === -1 || right === -1)) {\n        state.raise(\"Invalid character class\");\n      }\n      if (left !== -1 && right !== -1 && left > right) {\n        state.raise(\"Range out of order in character class\");\n      }\n    }\n  }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash\npp$1.regexp_eatClassAtom = function(state) {\n  var start = state.pos;\n\n  if (state.eat(0x5C /* \\ */)) {\n    if (this.regexp_eatClassEscape(state)) {\n      return true\n    }\n    if (state.switchU) {\n      // Make the same message as V8.\n      var ch$1 = state.current();\n      if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {\n        state.raise(\"Invalid class escape\");\n      }\n      state.raise(\"Invalid escape\");\n    }\n    state.pos = start;\n  }\n\n  var ch = state.current();\n  if (ch !== 0x5D /* ] */) {\n    state.lastIntValue = ch;\n    state.advance();\n    return true\n  }\n\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape\npp$1.regexp_eatClassEscape = function(state) {\n  var start = state.pos;\n\n  if (state.eat(0x62 /* b */)) {\n    state.lastIntValue = 0x08; /* <BS> */\n    return true\n  }\n\n  if (state.switchU && state.eat(0x2D /* - */)) {\n    state.lastIntValue = 0x2D; /* - */\n    return true\n  }\n\n  if (!state.switchU && state.eat(0x63 /* c */)) {\n    if (this.regexp_eatClassControlLetter(state)) {\n      return true\n    }\n    state.pos = start;\n  }\n\n  return (\n    this.regexp_eatCharacterClassEscape(state) ||\n    this.regexp_eatCharacterEscape(state)\n  )\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter\npp$1.regexp_eatClassControlLetter = function(state) {\n  var ch = state.current();\n  if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {\n    state.lastIntValue = ch % 0x20;\n    state.advance();\n    return true\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\npp$1.regexp_eatHexEscapeSequence = function(state) {\n  var start = state.pos;\n  if (state.eat(0x78 /* x */)) {\n    if (this.regexp_eatFixedHexDigits(state, 2)) {\n      return true\n    }\n    if (state.switchU) {\n      state.raise(\"Invalid escape\");\n    }\n    state.pos = start;\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits\npp$1.regexp_eatDecimalDigits = function(state) {\n  var start = state.pos;\n  var ch = 0;\n  state.lastIntValue = 0;\n  while (isDecimalDigit(ch = state.current())) {\n    state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n    state.advance();\n  }\n  return state.pos !== start\n};\nfunction isDecimalDigit(ch) {\n  return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits\npp$1.regexp_eatHexDigits = function(state) {\n  var start = state.pos;\n  var ch = 0;\n  state.lastIntValue = 0;\n  while (isHexDigit(ch = state.current())) {\n    state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n    state.advance();\n  }\n  return state.pos !== start\n};\nfunction isHexDigit(ch) {\n  return (\n    (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||\n    (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||\n    (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)\n  )\n}\nfunction hexToInt(ch) {\n  if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {\n    return 10 + (ch - 0x41 /* A */)\n  }\n  if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {\n    return 10 + (ch - 0x61 /* a */)\n  }\n  return ch - 0x30 /* 0 */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence\n// Allows only 0-377(octal) i.e. 0-255(decimal).\npp$1.regexp_eatLegacyOctalEscapeSequence = function(state) {\n  if (this.regexp_eatOctalDigit(state)) {\n    var n1 = state.lastIntValue;\n    if (this.regexp_eatOctalDigit(state)) {\n      var n2 = state.lastIntValue;\n      if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {\n        state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;\n      } else {\n        state.lastIntValue = n1 * 8 + n2;\n      }\n    } else {\n      state.lastIntValue = n1;\n    }\n    return true\n  }\n  return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit\npp$1.regexp_eatOctalDigit = function(state) {\n  var ch = state.current();\n  if (isOctalDigit(ch)) {\n    state.lastIntValue = ch - 0x30; /* 0 */\n    state.advance();\n    return true\n  }\n  state.lastIntValue = 0;\n  return false\n};\nfunction isOctalDigit(ch) {\n  return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits\n// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit\n// And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\npp$1.regexp_eatFixedHexDigits = function(state, length) {\n  var start = state.pos;\n  state.lastIntValue = 0;\n  for (var i = 0; i < length; ++i) {\n    var ch = state.current();\n    if (!isHexDigit(ch)) {\n      state.pos = start;\n      return false\n    }\n    state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n    state.advance();\n  }\n  return true\n};\n\n// Object type used to represent tokens. Note that normally, tokens\n// simply exist as properties on the parser object. This is only\n// used for the onToken callback and the external tokenizer.\n\nvar Token = function Token(p) {\n  this.type = p.type;\n  this.value = p.value;\n  this.start = p.start;\n  this.end = p.end;\n  if (p.options.locations)\n    { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }\n  if (p.options.ranges)\n    { this.range = [p.start, p.end]; }\n};\n\n// ## Tokenizer\n\nvar pp = Parser.prototype;\n\n// Move to the next token\n\npp.next = function(ignoreEscapeSequenceInKeyword) {\n  if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)\n    { this.raiseRecoverable(this.start, \"Escape sequence in keyword \" + this.type.keyword); }\n  if (this.options.onToken)\n    { this.options.onToken(new Token(this)); }\n\n  this.lastTokEnd = this.end;\n  this.lastTokStart = this.start;\n  this.lastTokEndLoc = this.endLoc;\n  this.lastTokStartLoc = this.startLoc;\n  this.nextToken();\n};\n\npp.getToken = function() {\n  this.next();\n  return new Token(this)\n};\n\n// If we're in an ES6 environment, make parsers iterable\nif (typeof Symbol !== \"undefined\")\n  { pp[Symbol.iterator] = function() {\n    var this$1$1 = this;\n\n    return {\n      next: function () {\n        var token = this$1$1.getToken();\n        return {\n          done: token.type === types$1.eof,\n          value: token\n        }\n      }\n    }\n  }; }\n\n// Toggle strict mode. Re-reads the next number or string to please\n// pedantic tests (`\"use strict\"; 010;` should fail).\n\n// Read a single token, updating the parser object's token-related\n// properties.\n\npp.nextToken = function() {\n  var curContext = this.curContext();\n  if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }\n\n  this.start = this.pos;\n  if (this.options.locations) { this.startLoc = this.curPosition(); }\n  if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) }\n\n  if (curContext.override) { return curContext.override(this) }\n  else { this.readToken(this.fullCharCodeAtPos()); }\n};\n\npp.readToken = function(code) {\n  // Identifier or keyword. '\\uXXXX' sequences are allowed in\n  // identifiers, so '\\' also dispatches to that.\n  if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\\' */)\n    { return this.readWord() }\n\n  return this.getTokenFromCode(code)\n};\n\npp.fullCharCodeAtPos = function() {\n  var code = this.input.charCodeAt(this.pos);\n  if (code <= 0xd7ff || code >= 0xdc00) { return code }\n  var next = this.input.charCodeAt(this.pos + 1);\n  return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00\n};\n\npp.skipBlockComment = function() {\n  var startLoc = this.options.onComment && this.curPosition();\n  var start = this.pos, end = this.input.indexOf(\"*/\", this.pos += 2);\n  if (end === -1) { this.raise(this.pos - 2, \"Unterminated comment\"); }\n  this.pos = end + 2;\n  if (this.options.locations) {\n    for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) {\n      ++this.curLine;\n      pos = this.lineStart = nextBreak;\n    }\n  }\n  if (this.options.onComment)\n    { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,\n                           startLoc, this.curPosition()); }\n};\n\npp.skipLineComment = function(startSkip) {\n  var start = this.pos;\n  var startLoc = this.options.onComment && this.curPosition();\n  var ch = this.input.charCodeAt(this.pos += startSkip);\n  while (this.pos < this.input.length && !isNewLine(ch)) {\n    ch = this.input.charCodeAt(++this.pos);\n  }\n  if (this.options.onComment)\n    { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,\n                           startLoc, this.curPosition()); }\n};\n\n// Called at the start of the parse and after every token. Skips\n// whitespace and comments, and.\n\npp.skipSpace = function() {\n  loop: while (this.pos < this.input.length) {\n    var ch = this.input.charCodeAt(this.pos);\n    switch (ch) {\n    case 32: case 160: // ' '\n      ++this.pos;\n      break\n    case 13:\n      if (this.input.charCodeAt(this.pos + 1) === 10) {\n        ++this.pos;\n      }\n    case 10: case 8232: case 8233:\n      ++this.pos;\n      if (this.options.locations) {\n        ++this.curLine;\n        this.lineStart = this.pos;\n      }\n      break\n    case 47: // '/'\n      switch (this.input.charCodeAt(this.pos + 1)) {\n      case 42: // '*'\n        this.skipBlockComment();\n        break\n      case 47:\n        this.skipLineComment(2);\n        break\n      default:\n        break loop\n      }\n      break\n    default:\n      if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n        ++this.pos;\n      } else {\n        break loop\n      }\n    }\n  }\n};\n\n// Called at the end of every token. Sets `end`, `val`, and\n// maintains `context` and `exprAllowed`, and skips the space after\n// the token, so that the next one's `start` will point at the\n// right position.\n\npp.finishToken = function(type, val) {\n  this.end = this.pos;\n  if (this.options.locations) { this.endLoc = this.curPosition(); }\n  var prevType = this.type;\n  this.type = type;\n  this.value = val;\n\n  this.updateContext(prevType);\n};\n\n// ### Token reading\n\n// This is the function that is called to fetch the next token. It\n// is somewhat obscure, because it works in character codes rather\n// than characters, and because operator parsing has been inlined\n// into it.\n//\n// All in the name of speed.\n//\npp.readToken_dot = function() {\n  var next = this.input.charCodeAt(this.pos + 1);\n  if (next >= 48 && next <= 57) { return this.readNumber(true) }\n  var next2 = this.input.charCodeAt(this.pos + 2);\n  if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'\n    this.pos += 3;\n    return this.finishToken(types$1.ellipsis)\n  } else {\n    ++this.pos;\n    return this.finishToken(types$1.dot)\n  }\n};\n\npp.readToken_slash = function() { // '/'\n  var next = this.input.charCodeAt(this.pos + 1);\n  if (this.exprAllowed) { ++this.pos; return this.readRegexp() }\n  if (next === 61) { return this.finishOp(types$1.assign, 2) }\n  return this.finishOp(types$1.slash, 1)\n};\n\npp.readToken_mult_modulo_exp = function(code) { // '%*'\n  var next = this.input.charCodeAt(this.pos + 1);\n  var size = 1;\n  var tokentype = code === 42 ? types$1.star : types$1.modulo;\n\n  // exponentiation operator ** and **=\n  if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {\n    ++size;\n    tokentype = types$1.starstar;\n    next = this.input.charCodeAt(this.pos + 2);\n  }\n\n  if (next === 61) { return this.finishOp(types$1.assign, size + 1) }\n  return this.finishOp(tokentype, size)\n};\n\npp.readToken_pipe_amp = function(code) { // '|&'\n  var next = this.input.charCodeAt(this.pos + 1);\n  if (next === code) {\n    if (this.options.ecmaVersion >= 12) {\n      var next2 = this.input.charCodeAt(this.pos + 2);\n      if (next2 === 61) { return this.finishOp(types$1.assign, 3) }\n    }\n    return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2)\n  }\n  if (next === 61) { return this.finishOp(types$1.assign, 2) }\n  return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1)\n};\n\npp.readToken_caret = function() { // '^'\n  var next = this.input.charCodeAt(this.pos + 1);\n  if (next === 61) { return this.finishOp(types$1.assign, 2) }\n  return this.finishOp(types$1.bitwiseXOR, 1)\n};\n\npp.readToken_plus_min = function(code) { // '+-'\n  var next = this.input.charCodeAt(this.pos + 1);\n  if (next === code) {\n    if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&\n        (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {\n      // A `-->` line comment\n      this.skipLineComment(3);\n      this.skipSpace();\n      return this.nextToken()\n    }\n    return this.finishOp(types$1.incDec, 2)\n  }\n  if (next === 61) { return this.finishOp(types$1.assign, 2) }\n  return this.finishOp(types$1.plusMin, 1)\n};\n\npp.readToken_lt_gt = function(code) { // '<>'\n  var next = this.input.charCodeAt(this.pos + 1);\n  var size = 1;\n  if (next === code) {\n    size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;\n    if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) }\n    return this.finishOp(types$1.bitShift, size)\n  }\n  if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n      this.input.charCodeAt(this.pos + 3) === 45) {\n    // `<!--`, an XML-style comment that should be interpreted as a line comment\n    this.skipLineComment(4);\n    this.skipSpace();\n    return this.nextToken()\n  }\n  if (next === 61) { size = 2; }\n  return this.finishOp(types$1.relational, size)\n};\n\npp.readToken_eq_excl = function(code) { // '=!'\n  var next = this.input.charCodeAt(this.pos + 1);\n  if (next === 61) { return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) }\n  if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>'\n    this.pos += 2;\n    return this.finishToken(types$1.arrow)\n  }\n  return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1)\n};\n\npp.readToken_question = function() { // '?'\n  var ecmaVersion = this.options.ecmaVersion;\n  if (ecmaVersion >= 11) {\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next === 46) {\n      var next2 = this.input.charCodeAt(this.pos + 2);\n      if (next2 < 48 || next2 > 57) { return this.finishOp(types$1.questionDot, 2) }\n    }\n    if (next === 63) {\n      if (ecmaVersion >= 12) {\n        var next2$1 = this.input.charCodeAt(this.pos + 2);\n        if (next2$1 === 61) { return this.finishOp(types$1.assign, 3) }\n      }\n      return this.finishOp(types$1.coalesce, 2)\n    }\n  }\n  return this.finishOp(types$1.question, 1)\n};\n\npp.readToken_numberSign = function() { // '#'\n  var ecmaVersion = this.options.ecmaVersion;\n  var code = 35; // '#'\n  if (ecmaVersion >= 13) {\n    ++this.pos;\n    code = this.fullCharCodeAtPos();\n    if (isIdentifierStart(code, true) || code === 92 /* '\\' */) {\n      return this.finishToken(types$1.privateId, this.readWord1())\n    }\n  }\n\n  this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n};\n\npp.getTokenFromCode = function(code) {\n  switch (code) {\n  // The interpretation of a dot depends on whether it is followed\n  // by a digit or another two dots.\n  case 46: // '.'\n    return this.readToken_dot()\n\n  // Punctuation tokens.\n  case 40: ++this.pos; return this.finishToken(types$1.parenL)\n  case 41: ++this.pos; return this.finishToken(types$1.parenR)\n  case 59: ++this.pos; return this.finishToken(types$1.semi)\n  case 44: ++this.pos; return this.finishToken(types$1.comma)\n  case 91: ++this.pos; return this.finishToken(types$1.bracketL)\n  case 93: ++this.pos; return this.finishToken(types$1.bracketR)\n  case 123: ++this.pos; return this.finishToken(types$1.braceL)\n  case 125: ++this.pos; return this.finishToken(types$1.braceR)\n  case 58: ++this.pos; return this.finishToken(types$1.colon)\n\n  case 96: // '`'\n    if (this.options.ecmaVersion < 6) { break }\n    ++this.pos;\n    return this.finishToken(types$1.backQuote)\n\n  case 48: // '0'\n    var next = this.input.charCodeAt(this.pos + 1);\n    if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number\n    if (this.options.ecmaVersion >= 6) {\n      if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number\n      if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number\n    }\n\n  // Anything else beginning with a digit is an integer, octal\n  // number, or float.\n  case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9\n    return this.readNumber(false)\n\n  // Quotes produce strings.\n  case 34: case 39: // '\"', \"'\"\n    return this.readString(code)\n\n  // Operators are parsed inline in tiny state machines. '=' (61) is\n  // often referred to. `finishOp` simply skips the amount of\n  // characters it is given as second argument, and returns a token\n  // of the type given by its first argument.\n  case 47: // '/'\n    return this.readToken_slash()\n\n  case 37: case 42: // '%*'\n    return this.readToken_mult_modulo_exp(code)\n\n  case 124: case 38: // '|&'\n    return this.readToken_pipe_amp(code)\n\n  case 94: // '^'\n    return this.readToken_caret()\n\n  case 43: case 45: // '+-'\n    return this.readToken_plus_min(code)\n\n  case 60: case 62: // '<>'\n    return this.readToken_lt_gt(code)\n\n  case 61: case 33: // '=!'\n    return this.readToken_eq_excl(code)\n\n  case 63: // '?'\n    return this.readToken_question()\n\n  case 126: // '~'\n    return this.finishOp(types$1.prefix, 1)\n\n  case 35: // '#'\n    return this.readToken_numberSign()\n  }\n\n  this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n};\n\npp.finishOp = function(type, size) {\n  var str = this.input.slice(this.pos, this.pos + size);\n  this.pos += size;\n  return this.finishToken(type, str)\n};\n\npp.readRegexp = function() {\n  var escaped, inClass, start = this.pos;\n  for (;;) {\n    if (this.pos >= this.input.length) { this.raise(start, \"Unterminated regular expression\"); }\n    var ch = this.input.charAt(this.pos);\n    if (lineBreak.test(ch)) { this.raise(start, \"Unterminated regular expression\"); }\n    if (!escaped) {\n      if (ch === \"[\") { inClass = true; }\n      else if (ch === \"]\" && inClass) { inClass = false; }\n      else if (ch === \"/\" && !inClass) { break }\n      escaped = ch === \"\\\\\";\n    } else { escaped = false; }\n    ++this.pos;\n  }\n  var pattern = this.input.slice(start, this.pos);\n  ++this.pos;\n  var flagsStart = this.pos;\n  var flags = this.readWord1();\n  if (this.containsEsc) { this.unexpected(flagsStart); }\n\n  // Validate pattern\n  var state = this.regexpState || (this.regexpState = new RegExpValidationState(this));\n  state.reset(start, pattern, flags);\n  this.validateRegExpFlags(state);\n  this.validateRegExpPattern(state);\n\n  // Create Literal#value property value.\n  var value = null;\n  try {\n    value = new RegExp(pattern, flags);\n  } catch (e) {\n    // ESTree requires null if it failed to instantiate RegExp object.\n    // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral\n  }\n\n  return this.finishToken(types$1.regexp, {pattern: pattern, flags: flags, value: value})\n};\n\n// Read an integer in the given radix. Return null if zero digits\n// were read, the integer value otherwise. When `len` is given, this\n// will return `null` unless the integer has exactly `len` digits.\n\npp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) {\n  // `len` is used for character escape sequences. In that case, disallow separators.\n  var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined;\n\n  // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b)\n  // and isn't fraction part nor exponent part. In that case, if the first digit\n  // is zero then disallow separators.\n  var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48;\n\n  var start = this.pos, total = 0, lastCode = 0;\n  for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) {\n    var code = this.input.charCodeAt(this.pos), val = (void 0);\n\n    if (allowSeparators && code === 95) {\n      if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed in legacy octal numeric literals\"); }\n      if (lastCode === 95) { this.raiseRecoverable(this.pos, \"Numeric separator must be exactly one underscore\"); }\n      if (i === 0) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed at the first of digits\"); }\n      lastCode = code;\n      continue\n    }\n\n    if (code >= 97) { val = code - 97 + 10; } // a\n    else if (code >= 65) { val = code - 65 + 10; } // A\n    else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9\n    else { val = Infinity; }\n    if (val >= radix) { break }\n    lastCode = code;\n    total = total * radix + val;\n  }\n\n  if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, \"Numeric separator is not allowed at the last of digits\"); }\n  if (this.pos === start || len != null && this.pos - start !== len) { return null }\n\n  return total\n};\n\nfunction stringToNumber(str, isLegacyOctalNumericLiteral) {\n  if (isLegacyOctalNumericLiteral) {\n    return parseInt(str, 8)\n  }\n\n  // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value.\n  return parseFloat(str.replace(/_/g, \"\"))\n}\n\nfunction stringToBigInt(str) {\n  if (typeof BigInt !== \"function\") {\n    return null\n  }\n\n  // `BigInt(value)` throws syntax error if the string contains numeric separators.\n  return BigInt(str.replace(/_/g, \"\"))\n}\n\npp.readRadixNumber = function(radix) {\n  var start = this.pos;\n  this.pos += 2; // 0x\n  var val = this.readInt(radix);\n  if (val == null) { this.raise(this.start + 2, \"Expected number in radix \" + radix); }\n  if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) {\n    val = stringToBigInt(this.input.slice(start, this.pos));\n    ++this.pos;\n  } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n  return this.finishToken(types$1.num, val)\n};\n\n// Read an integer, octal integer, or floating-point number.\n\npp.readNumber = function(startsWithDot) {\n  var start = this.pos;\n  if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, \"Invalid number\"); }\n  var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48;\n  if (octal && this.strict) { this.raise(start, \"Invalid number\"); }\n  var next = this.input.charCodeAt(this.pos);\n  if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) {\n    var val$1 = stringToBigInt(this.input.slice(start, this.pos));\n    ++this.pos;\n    if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n    return this.finishToken(types$1.num, val$1)\n  }\n  if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; }\n  if (next === 46 && !octal) { // '.'\n    ++this.pos;\n    this.readInt(10);\n    next = this.input.charCodeAt(this.pos);\n  }\n  if ((next === 69 || next === 101) && !octal) { // 'eE'\n    next = this.input.charCodeAt(++this.pos);\n    if (next === 43 || next === 45) { ++this.pos; } // '+-'\n    if (this.readInt(10) === null) { this.raise(start, \"Invalid number\"); }\n  }\n  if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n\n  var val = stringToNumber(this.input.slice(start, this.pos), octal);\n  return this.finishToken(types$1.num, val)\n};\n\n// Read a string value, interpreting backslash-escapes.\n\npp.readCodePoint = function() {\n  var ch = this.input.charCodeAt(this.pos), code;\n\n  if (ch === 123) { // '{'\n    if (this.options.ecmaVersion < 6) { this.unexpected(); }\n    var codePos = ++this.pos;\n    code = this.readHexChar(this.input.indexOf(\"}\", this.pos) - this.pos);\n    ++this.pos;\n    if (code > 0x10FFFF) { this.invalidStringToken(codePos, \"Code point out of bounds\"); }\n  } else {\n    code = this.readHexChar(4);\n  }\n  return code\n};\n\npp.readString = function(quote) {\n  var out = \"\", chunkStart = ++this.pos;\n  for (;;) {\n    if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated string constant\"); }\n    var ch = this.input.charCodeAt(this.pos);\n    if (ch === quote) { break }\n    if (ch === 92) { // '\\'\n      out += this.input.slice(chunkStart, this.pos);\n      out += this.readEscapedChar(false);\n      chunkStart = this.pos;\n    } else if (ch === 0x2028 || ch === 0x2029) {\n      if (this.options.ecmaVersion < 10) { this.raise(this.start, \"Unterminated string constant\"); }\n      ++this.pos;\n      if (this.options.locations) {\n        this.curLine++;\n        this.lineStart = this.pos;\n      }\n    } else {\n      if (isNewLine(ch)) { this.raise(this.start, \"Unterminated string constant\"); }\n      ++this.pos;\n    }\n  }\n  out += this.input.slice(chunkStart, this.pos++);\n  return this.finishToken(types$1.string, out)\n};\n\n// Reads template string tokens.\n\nvar INVALID_TEMPLATE_ESCAPE_ERROR = {};\n\npp.tryReadTemplateToken = function() {\n  this.inTemplateElement = true;\n  try {\n    this.readTmplToken();\n  } catch (err) {\n    if (err === INVALID_TEMPLATE_ESCAPE_ERROR) {\n      this.readInvalidTemplateToken();\n    } else {\n      throw err\n    }\n  }\n\n  this.inTemplateElement = false;\n};\n\npp.invalidStringToken = function(position, message) {\n  if (this.inTemplateElement && this.options.ecmaVersion >= 9) {\n    throw INVALID_TEMPLATE_ESCAPE_ERROR\n  } else {\n    this.raise(position, message);\n  }\n};\n\npp.readTmplToken = function() {\n  var out = \"\", chunkStart = this.pos;\n  for (;;) {\n    if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated template\"); }\n    var ch = this.input.charCodeAt(this.pos);\n    if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${'\n      if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) {\n        if (ch === 36) {\n          this.pos += 2;\n          return this.finishToken(types$1.dollarBraceL)\n        } else {\n          ++this.pos;\n          return this.finishToken(types$1.backQuote)\n        }\n      }\n      out += this.input.slice(chunkStart, this.pos);\n      return this.finishToken(types$1.template, out)\n    }\n    if (ch === 92) { // '\\'\n      out += this.input.slice(chunkStart, this.pos);\n      out += this.readEscapedChar(true);\n      chunkStart = this.pos;\n    } else if (isNewLine(ch)) {\n      out += this.input.slice(chunkStart, this.pos);\n      ++this.pos;\n      switch (ch) {\n      case 13:\n        if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; }\n      case 10:\n        out += \"\\n\";\n        break\n      default:\n        out += String.fromCharCode(ch);\n        break\n      }\n      if (this.options.locations) {\n        ++this.curLine;\n        this.lineStart = this.pos;\n      }\n      chunkStart = this.pos;\n    } else {\n      ++this.pos;\n    }\n  }\n};\n\n// Reads a template token to search for the end, without validating any escape sequences\npp.readInvalidTemplateToken = function() {\n  for (; this.pos < this.input.length; this.pos++) {\n    switch (this.input[this.pos]) {\n    case \"\\\\\":\n      ++this.pos;\n      break\n\n    case \"$\":\n      if (this.input[this.pos + 1] !== \"{\") {\n        break\n      }\n\n    // falls through\n    case \"`\":\n      return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos))\n\n    // no default\n    }\n  }\n  this.raise(this.start, \"Unterminated template\");\n};\n\n// Used to read escaped characters\n\npp.readEscapedChar = function(inTemplate) {\n  var ch = this.input.charCodeAt(++this.pos);\n  ++this.pos;\n  switch (ch) {\n  case 110: return \"\\n\" // 'n' -> '\\n'\n  case 114: return \"\\r\" // 'r' -> '\\r'\n  case 120: return String.fromCharCode(this.readHexChar(2)) // 'x'\n  case 117: return codePointToString(this.readCodePoint()) // 'u'\n  case 116: return \"\\t\" // 't' -> '\\t'\n  case 98: return \"\\b\" // 'b' -> '\\b'\n  case 118: return \"\\u000b\" // 'v' -> '\\u000b'\n  case 102: return \"\\f\" // 'f' -> '\\f'\n  case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\\r\\n'\n  case 10: // ' \\n'\n    if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }\n    return \"\"\n  case 56:\n  case 57:\n    if (this.strict) {\n      this.invalidStringToken(\n        this.pos - 1,\n        \"Invalid escape sequence\"\n      );\n    }\n    if (inTemplate) {\n      var codePos = this.pos - 1;\n\n      this.invalidStringToken(\n        codePos,\n        \"Invalid escape sequence in template string\"\n      );\n    }\n  default:\n    if (ch >= 48 && ch <= 55) {\n      var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0];\n      var octal = parseInt(octalStr, 8);\n      if (octal > 255) {\n        octalStr = octalStr.slice(0, -1);\n        octal = parseInt(octalStr, 8);\n      }\n      this.pos += octalStr.length - 1;\n      ch = this.input.charCodeAt(this.pos);\n      if ((octalStr !== \"0\" || ch === 56 || ch === 57) && (this.strict || inTemplate)) {\n        this.invalidStringToken(\n          this.pos - 1 - octalStr.length,\n          inTemplate\n            ? \"Octal literal in template string\"\n            : \"Octal literal in strict mode\"\n        );\n      }\n      return String.fromCharCode(octal)\n    }\n    if (isNewLine(ch)) {\n      // Unicode new line characters after \\ get removed from output in both\n      // template literals and strings\n      return \"\"\n    }\n    return String.fromCharCode(ch)\n  }\n};\n\n// Used to read character escape sequences ('\\x', '\\u', '\\U').\n\npp.readHexChar = function(len) {\n  var codePos = this.pos;\n  var n = this.readInt(16, len);\n  if (n === null) { this.invalidStringToken(codePos, \"Bad character escape sequence\"); }\n  return n\n};\n\n// Read an identifier, and return it as a string. Sets `this.containsEsc`\n// to whether the word contained a '\\u' escape.\n//\n// Incrementally adds only escaped chars, adding other chunks as-is\n// as a micro-optimization.\n\npp.readWord1 = function() {\n  this.containsEsc = false;\n  var word = \"\", first = true, chunkStart = this.pos;\n  var astral = this.options.ecmaVersion >= 6;\n  while (this.pos < this.input.length) {\n    var ch = this.fullCharCodeAtPos();\n    if (isIdentifierChar(ch, astral)) {\n      this.pos += ch <= 0xffff ? 1 : 2;\n    } else if (ch === 92) { // \"\\\"\n      this.containsEsc = true;\n      word += this.input.slice(chunkStart, this.pos);\n      var escStart = this.pos;\n      if (this.input.charCodeAt(++this.pos) !== 117) // \"u\"\n        { this.invalidStringToken(this.pos, \"Expecting Unicode escape sequence \\\\uXXXX\"); }\n      ++this.pos;\n      var esc = this.readCodePoint();\n      if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral))\n        { this.invalidStringToken(escStart, \"Invalid Unicode escape\"); }\n      word += codePointToString(esc);\n      chunkStart = this.pos;\n    } else {\n      break\n    }\n    first = false;\n  }\n  return word + this.input.slice(chunkStart, this.pos)\n};\n\n// Read an identifier or keyword token. Will check for reserved\n// words when necessary.\n\npp.readWord = function() {\n  var word = this.readWord1();\n  var type = types$1.name;\n  if (this.keywords.test(word)) {\n    type = keywords[word];\n  }\n  return this.finishToken(type, word)\n};\n\n// Acorn is a tiny, fast JavaScript parser written in JavaScript.\n\nvar version = \"8.8.2\";\n\nParser.acorn = {\n  Parser: Parser,\n  version: version,\n  defaultOptions: defaultOptions,\n  Position: Position,\n  SourceLocation: SourceLocation,\n  getLineInfo: getLineInfo,\n  Node: Node,\n  TokenType: TokenType,\n  tokTypes: types$1,\n  keywordTypes: keywords,\n  TokContext: TokContext,\n  tokContexts: types,\n  isIdentifierChar: isIdentifierChar,\n  isIdentifierStart: isIdentifierStart,\n  Token: Token,\n  isNewLine: isNewLine,\n  lineBreak: lineBreak,\n  lineBreakG: lineBreakG,\n  nonASCIIwhitespace: nonASCIIwhitespace\n};\n\n// The main exported interface (under `self.acorn` when in the\n// browser) is a `parse` function that takes a code string and\n// returns an abstract syntax tree as specified by [Mozilla parser\n// API][api].\n//\n// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API\n\nfunction parse(input, options) {\n  return Parser.parse(input, options)\n}\n\n// This function tries to parse a single expression at a given\n// offset in a string. Useful for parsing mixed-language formats\n// that embed JavaScript expressions.\n\nfunction parseExpressionAt(input, pos, options) {\n  return Parser.parseExpressionAt(input, pos, options)\n}\n\n// Acorn is organized as a tokenizer and a recursive-descent parser.\n// The `tokenizer` export provides an interface to the tokenizer.\n\nfunction tokenizer(input, options) {\n  return Parser.tokenizer(input, options)\n}\n\nexport { Node, Parser, Position, SourceLocation, TokContext, Token, TokenType, defaultOptions, getLineInfo, isIdentifierChar, isIdentifierStart, isNewLine, keywords as keywordTypes, lineBreak, lineBreakG, nonASCIIwhitespace, parse, parseExpressionAt, types as tokContexts, types$1 as tokTypes, tokenizer, version };\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/dist/acorn.mjs.d.ts",
    "content": "import * as acorn from \"./acorn\";\nexport = acorn;"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/dist/bin.js",
    "content": "'use strict';\n\nvar path = require('path');\nvar fs = require('fs');\nvar acorn = require('./acorn.js');\n\nfunction _interopNamespaceDefault(e) {\n  var n = Object.create(null);\n  if (e) {\n    Object.keys(e).forEach(function (k) {\n      if (k !== 'default') {\n        var d = Object.getOwnPropertyDescriptor(e, k);\n        Object.defineProperty(n, k, d.get ? d : {\n          enumerable: true,\n          get: function () { return e[k]; }\n        });\n      }\n    });\n  }\n  n.default = e;\n  return Object.freeze(n);\n}\n\nvar acorn__namespace = /*#__PURE__*/_interopNamespaceDefault(acorn);\n\nvar inputFilePaths = [], forceFileName = false, fileMode = false, silent = false, compact = false, tokenize = false;\nvar options = {};\n\nfunction help(status) {\n  var print = (status === 0) ? console.log : console.error;\n  print(\"usage: \" + path.basename(process.argv[1]) + \" [--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|...|--ecma2015|--ecma2016|--ecma2017|--ecma2018|...]\");\n  print(\"        [--tokenize] [--locations] [--allow-hash-bang] [--allow-await-outside-function] [--compact] [--silent] [--module] [--help] [--] [<infile>...]\");\n  process.exit(status);\n}\n\nfor (var i = 2; i < process.argv.length; ++i) {\n  var arg = process.argv[i];\n  if (arg[0] !== \"-\" || arg === \"-\") { inputFilePaths.push(arg); }\n  else if (arg === \"--\") {\n    inputFilePaths.push.apply(inputFilePaths, process.argv.slice(i + 1));\n    forceFileName = true;\n    break\n  } else if (arg === \"--locations\") { options.locations = true; }\n  else if (arg === \"--allow-hash-bang\") { options.allowHashBang = true; }\n  else if (arg === \"--allow-await-outside-function\") { options.allowAwaitOutsideFunction = true; }\n  else if (arg === \"--silent\") { silent = true; }\n  else if (arg === \"--compact\") { compact = true; }\n  else if (arg === \"--help\") { help(0); }\n  else if (arg === \"--tokenize\") { tokenize = true; }\n  else if (arg === \"--module\") { options.sourceType = \"module\"; }\n  else {\n    var match = arg.match(/^--ecma(\\d+)$/);\n    if (match)\n      { options.ecmaVersion = +match[1]; }\n    else\n      { help(1); }\n  }\n}\n\nfunction run(codeList) {\n  var result = [], fileIdx = 0;\n  try {\n    codeList.forEach(function (code, idx) {\n      fileIdx = idx;\n      if (!tokenize) {\n        result = acorn__namespace.parse(code, options);\n        options.program = result;\n      } else {\n        var tokenizer = acorn__namespace.tokenizer(code, options), token;\n        do {\n          token = tokenizer.getToken();\n          result.push(token);\n        } while (token.type !== acorn__namespace.tokTypes.eof)\n      }\n    });\n  } catch (e) {\n    console.error(fileMode ? e.message.replace(/\\(\\d+:\\d+\\)$/, function (m) { return m.slice(0, 1) + inputFilePaths[fileIdx] + \" \" + m.slice(1); }) : e.message);\n    process.exit(1);\n  }\n  if (!silent) { console.log(JSON.stringify(result, null, compact ? null : 2)); }\n}\n\nif (fileMode = inputFilePaths.length && (forceFileName || !inputFilePaths.includes(\"-\") || inputFilePaths.length !== 1)) {\n  run(inputFilePaths.map(function (path) { return fs.readFileSync(path, \"utf8\"); }));\n} else {\n  var code = \"\";\n  process.stdin.resume();\n  process.stdin.on(\"data\", function (chunk) { return code += chunk; });\n  process.stdin.on(\"end\", function () { return run([code]); });\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/acorn/package.json",
    "content": "{\n  \"name\": \"acorn\",\n  \"description\": \"ECMAScript parser\",\n  \"homepage\": \"https://github.com/acornjs/acorn\",\n  \"main\": \"dist/acorn.js\",\n  \"types\": \"dist/acorn.d.ts\",\n  \"module\": \"dist/acorn.mjs\",\n  \"exports\": {\n    \".\": [\n      {\n        \"import\": \"./dist/acorn.mjs\",\n        \"require\": \"./dist/acorn.js\",\n        \"default\": \"./dist/acorn.js\"\n      },\n      \"./dist/acorn.js\"\n    ],\n    \"./package.json\": \"./package.json\"\n  },\n  \"version\": \"8.8.2\",\n  \"engines\": {\n    \"node\": \">=0.4.0\"\n  },\n  \"maintainers\": [\n    {\n      \"name\": \"Marijn Haverbeke\",\n      \"email\": \"marijnh@gmail.com\",\n      \"web\": \"https://marijnhaverbeke.nl\"\n    },\n    {\n      \"name\": \"Ingvar Stepanyan\",\n      \"email\": \"me@rreverser.com\",\n      \"web\": \"https://rreverser.com/\"\n    },\n    {\n      \"name\": \"Adrian Heine\",\n      \"web\": \"http://adrianheine.de\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/acornjs/acorn.git\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"prepare\": \"cd ..; npm run build:main\"\n  },\n  \"bin\": {\n    \"acorn\": \"./bin/acorn\"\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/buffer-from/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2016, 2018 Linus Unnebäck\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/buffer-from/index.js",
    "content": "/* eslint-disable node/no-deprecated-api */\n\nvar toString = Object.prototype.toString\n\nvar isModern = (\n  typeof Buffer !== 'undefined' &&\n  typeof Buffer.alloc === 'function' &&\n  typeof Buffer.allocUnsafe === 'function' &&\n  typeof Buffer.from === 'function'\n)\n\nfunction isArrayBuffer (input) {\n  return toString.call(input).slice(8, -1) === 'ArrayBuffer'\n}\n\nfunction fromArrayBuffer (obj, byteOffset, length) {\n  byteOffset >>>= 0\n\n  var maxLength = obj.byteLength - byteOffset\n\n  if (maxLength < 0) {\n    throw new RangeError(\"'offset' is out of bounds\")\n  }\n\n  if (length === undefined) {\n    length = maxLength\n  } else {\n    length >>>= 0\n\n    if (length > maxLength) {\n      throw new RangeError(\"'length' is out of bounds\")\n    }\n  }\n\n  return isModern\n    ? Buffer.from(obj.slice(byteOffset, byteOffset + length))\n    : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length)))\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  return isModern\n    ? Buffer.from(string, encoding)\n    : new Buffer(string, encoding)\n}\n\nfunction bufferFrom (value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (isArrayBuffer(value)) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  return isModern\n    ? Buffer.from(value)\n    : new Buffer(value)\n}\n\nmodule.exports = bufferFrom\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/buffer-from/package.json",
    "content": "{\n  \"name\": \"buffer-from\",\n  \"version\": \"1.1.2\",\n  \"license\": \"MIT\",\n  \"repository\": \"LinusU/buffer-from\",\n  \"files\": [\n    \"index.js\"\n  ],\n  \"scripts\": {\n    \"test\": \"standard && node test\"\n  },\n  \"devDependencies\": {\n    \"standard\": \"^12.0.1\"\n  },\n  \"keywords\": [\n    \"buffer\",\n    \"buffer from\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/buffer-from/readme.md",
    "content": "# Buffer From\n\nA [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available.\n\n## Installation\n\n```sh\nnpm install --save buffer-from\n```\n\n## Usage\n\n```js\nconst bufferFrom = require('buffer-from')\n\nconsole.log(bufferFrom([1, 2, 3, 4]))\n//=> <Buffer 01 02 03 04>\n\nconst arr = new Uint8Array([1, 2, 3, 4])\nconsole.log(bufferFrom(arr.buffer, 1, 2))\n//=> <Buffer 02 03>\n\nconsole.log(bufferFrom('test', 'utf8'))\n//=> <Buffer 74 65 73 74>\n\nconst buf = bufferFrom('test')\nconsole.log(bufferFrom(buf))\n//=> <Buffer 74 65 73 74>\n```\n\n## API\n\n### bufferFrom(array)\n\n- `array` &lt;Array&gt;\n\nAllocates a new `Buffer` using an `array` of octets.\n\n### bufferFrom(arrayBuffer[, byteOffset[, length]])\n\n- `arrayBuffer` &lt;ArrayBuffer&gt; The `.buffer` property of a TypedArray or ArrayBuffer\n- `byteOffset` &lt;Integer&gt; Where to start copying from `arrayBuffer`. **Default:** `0`\n- `length` &lt;Integer&gt; How many bytes to copy from `arrayBuffer`. **Default:** `arrayBuffer.length - byteOffset`\n\nWhen passed a reference to the `.buffer` property of a TypedArray instance, the\nnewly created `Buffer` will share the same allocated memory as the TypedArray.\n\nThe optional `byteOffset` and `length` arguments specify a memory range within\nthe `arrayBuffer` that will be shared by the `Buffer`.\n\n### bufferFrom(buffer)\n\n- `buffer` &lt;Buffer&gt; An existing `Buffer` to copy data from\n\nCopies the passed `buffer` data onto a new `Buffer` instance.\n\n### bufferFrom(string[, encoding])\n\n- `string` &lt;String&gt; A string to encode.\n- `encoding` &lt;String&gt; The encoding of `string`. **Default:** `'utf8'`\n\nCreates a new `Buffer` containing the given JavaScript string `string`. If\nprovided, the `encoding` parameter identifies the character encoding of\n`string`.\n\n## See also\n\n- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc`\n- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe`\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/commander/CHANGELOG.md",
    "content": "2.20.3 / 2019-10-11\n==================\n\n  * Support Node.js 0.10 (Revert #1059)\n  * Ran \"npm unpublish commander@2.20.2\". There is no 2.20.2.\n\n2.20.1 / 2019-09-29\n==================\n\n  * Improve executable subcommand tracking\n  * Update dev dependencies\n\n2.20.0 / 2019-04-02\n==================\n\n  * fix: resolve symbolic links completely when hunting for subcommands (#935)\n  * Update index.d.ts (#930)\n  * Update Readme.md (#924)\n  * Remove --save option as it isn't required anymore (#918)\n  * Add link to the license file (#900)\n  * Added example of receiving args from options (#858)\n  * Added missing semicolon (#882)\n  * Add extension to .eslintrc (#876)\n\n2.19.0 / 2018-10-02\n==================\n\n  * Removed newline after Options and Commands headers (#864)\n  * Bugfix - Error output (#862)\n  * Fix to change default value to string (#856)\n\n2.18.0 / 2018-09-07\n==================\n\n  * Standardize help output (#853)\n  * chmod 644 travis.yml (#851)\n  * add support for execute typescript subcommand via ts-node (#849)\n\n2.17.1 / 2018-08-07\n==================\n\n  * Fix bug in command emit (#844)\n\n2.17.0 / 2018-08-03\n==================\n\n  * fixed newline output after help information (#833)\n  * Fix to emit the action even without command (#778)\n  * npm update (#823)\n\n2.16.0 / 2018-06-29\n==================\n\n  * Remove Makefile and `test/run` (#821)\n  * Make 'npm test' run on Windows (#820)\n  * Add badge to display install size (#807)\n  * chore: cache node_modules (#814)\n  * chore: remove Node.js 4 (EOL), add Node.js 10 (#813)\n  * fixed typo in readme (#812)\n  * Fix types (#804)\n  * Update eslint to resolve vulnerabilities in lodash (#799)\n  * updated readme with custom event listeners. (#791)\n  * fix tests (#794)\n\n2.15.0 / 2018-03-07\n==================\n\n  * Update downloads badge to point to graph of downloads over time instead of duplicating link to npm\n  * Arguments description\n\n2.14.1 / 2018-02-07\n==================\n\n  * Fix typing of help function\n\n2.14.0 / 2018-02-05\n==================\n\n  * only register the option:version event once\n  * Fixes issue #727: Passing empty string for option on command is set to undefined\n  * enable eqeqeq rule\n  * resolves #754 add linter configuration to project\n  * resolves #560 respect custom name for version option\n  * document how to override the version flag\n  * document using options per command\n\n2.13.0 / 2018-01-09\n==================\n\n  * Do not print default for --no-\n  * remove trailing spaces in command help\n  * Update CI's Node.js to LTS and latest version\n  * typedefs: Command and Option types added to commander namespace\n\n2.12.2 / 2017-11-28\n==================\n\n  * fix: typings are not shipped\n\n2.12.1 / 2017-11-23\n==================\n\n  * Move @types/node to dev dependency\n\n2.12.0 / 2017-11-22\n==================\n\n  * add attributeName() method to Option objects\n  * Documentation updated for options with --no prefix\n  * typings: `outputHelp` takes a string as the first parameter\n  * typings: use overloads\n  * feat(typings): update to match js api\n  * Print default value in option help\n  * Fix translation error\n  * Fail when using same command and alias (#491)\n  * feat(typings): add help callback\n  * fix bug when description is add after command with options (#662)\n  * Format js code\n  * Rename History.md to CHANGELOG.md (#668)\n  * feat(typings): add typings to support TypeScript (#646)\n  * use current node\n\n2.11.0 / 2017-07-03\n==================\n\n  * Fix help section order and padding (#652)\n  * feature: support for signals to subcommands (#632)\n  * Fixed #37, --help should not display first (#447)\n  * Fix translation errors. (#570)\n  * Add package-lock.json\n  * Remove engines\n  * Upgrade package version\n  * Prefix events to prevent conflicts between commands and options (#494)\n  * Removing dependency on graceful-readlink\n  * Support setting name in #name function and make it chainable\n  * Add .vscode directory to .gitignore (Visual Studio Code metadata)\n  * Updated link to ruby commander in readme files\n\n2.10.0 / 2017-06-19\n==================\n\n  * Update .travis.yml. drop support for older node.js versions.\n  * Fix require arguments in README.md\n  * On SemVer you do not start from 0.0.1\n  * Add missing semi colon in readme\n  * Add save param to npm install\n  * node v6 travis test\n  * Update Readme_zh-CN.md\n  * Allow literal '--' to be passed-through as an argument\n  * Test subcommand alias help\n  * link build badge to master branch\n  * Support the alias of Git style sub-command\n  * added keyword commander for better search result on npm\n  * Fix Sub-Subcommands\n  * test node.js stable\n  * Fixes TypeError when a command has an option called `--description`\n  * Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets.\n  * Add chinese Readme file\n\n2.9.0 / 2015-10-13\n==================\n\n  * Add option `isDefault` to set default subcommand #415 @Qix-\n  * Add callback to allow filtering or post-processing of help text #434 @djulien\n  * Fix `undefined` text in help information close #414 #416 @zhiyelee\n\n2.8.1 / 2015-04-22\n==================\n\n * Back out `support multiline description` Close #396 #397\n\n2.8.0 / 2015-04-07\n==================\n\n  * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee\n  * Fix bug in Git-style sub-commands #372 @zhiyelee\n  * Allow commands to be hidden from help #383 @tonylukasavage\n  * When git-style sub-commands are in use, yet none are called, display help #382 @claylo\n  * Add ability to specify arguments syntax for top-level command #258 @rrthomas\n  * Support multiline descriptions #208 @zxqfox\n\n2.7.1 / 2015-03-11\n==================\n\n * Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.\n\n2.7.0 / 2015-03-09\n==================\n\n * Fix git-style bug when installed globally. Close #335 #349 @zhiyelee\n * Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage\n * Add support for camelCase on `opts()`. Close #353  @nkzawa\n * Add node.js 0.12 and io.js to travis.yml\n * Allow RegEx options. #337 @palanik\n * Fixes exit code when sub-command failing.  Close #260 #332 @pirelenito\n * git-style `bin` files in $PATH make sense. Close #196 #327  @zhiyelee\n\n2.6.0 / 2014-12-30\n==================\n\n  * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee\n  * Add application description to the help msg. Close #112 @dalssoft\n\n2.5.1 / 2014-12-15\n==================\n\n  * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee\n\n2.5.0 / 2014-10-24\n==================\n\n * add support for variadic arguments. Closes #277 @whitlockjc\n\n2.4.0 / 2014-10-17\n==================\n\n * fixed a bug on executing the coercion function of subcommands option. Closes #270\n * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage\n * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage\n * fixed a bug on subcommand name. Closes #248 @jonathandelgado\n * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr\n\n2.3.0 / 2014-07-16\n==================\n\n * add command alias'. Closes PR #210\n * fix: Typos. Closes #99\n * fix: Unused fs module. Closes #217\n\n2.2.0 / 2014-03-29\n==================\n\n * add passing of previous option value\n * fix: support subcommands on windows. Closes #142\n * Now the defaultValue passed as the second argument of the coercion function.\n\n2.1.0 / 2013-11-21\n==================\n\n * add: allow cflag style option params, unit test, fixes #174\n\n2.0.0 / 2013-07-18\n==================\n\n * remove input methods (.prompt, .confirm, etc)\n\n1.3.2 / 2013-07-18\n==================\n\n * add support for sub-commands to co-exist with the original command\n\n1.3.1 / 2013-07-18\n==================\n\n * add quick .runningCommand hack so you can opt-out of other logic when running a sub command\n\n1.3.0 / 2013-07-09\n==================\n\n * add EACCES error handling\n * fix sub-command --help\n\n1.2.0 / 2013-06-13\n==================\n\n * allow \"-\" hyphen as an option argument\n * support for RegExp coercion\n\n1.1.1 / 2012-11-20\n==================\n\n  * add more sub-command padding\n  * fix .usage() when args are present. Closes #106\n\n1.1.0 / 2012-11-16\n==================\n\n  * add git-style executable subcommand support. Closes #94\n\n1.0.5 / 2012-10-09\n==================\n\n  * fix `--name` clobbering. Closes #92\n  * fix examples/help. Closes #89\n\n1.0.4 / 2012-09-03\n==================\n\n  * add `outputHelp()` method.\n\n1.0.3 / 2012-08-30\n==================\n\n  * remove invalid .version() defaulting\n\n1.0.2 / 2012-08-24\n==================\n\n  * add `--foo=bar` support [arv]\n  * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]\n\n1.0.1 / 2012-08-03\n==================\n\n  * fix issue #56\n  * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())\n\n1.0.0 / 2012-07-05\n==================\n\n  * add support for optional option descriptions\n  * add defaulting of `.version()` to package.json's version\n\n0.6.1 / 2012-06-01\n==================\n\n  * Added: append (yes or no) on confirmation\n  * Added: allow node.js v0.7.x\n\n0.6.0 / 2012-04-10\n==================\n\n  * Added `.prompt(obj, callback)` support. Closes #49\n  * Added default support to .choose(). Closes #41\n  * Fixed the choice example\n\n0.5.1 / 2011-12-20\n==================\n\n  * Fixed `password()` for recent nodes. Closes #36\n\n0.5.0 / 2011-12-04\n==================\n\n  * Added sub-command option support [itay]\n\n0.4.3 / 2011-12-04\n==================\n\n  * Fixed custom help ordering. Closes #32\n\n0.4.2 / 2011-11-24\n==================\n\n  * Added travis support\n  * Fixed: line-buffered input automatically trimmed. Closes #31\n\n0.4.1 / 2011-11-18\n==================\n\n  * Removed listening for \"close\" on --help\n\n0.4.0 / 2011-11-15\n==================\n\n  * Added support for `--`. Closes #24\n\n0.3.3 / 2011-11-14\n==================\n\n  * Fixed: wait for close event when writing help info [Jerry Hamlet]\n\n0.3.2 / 2011-11-01\n==================\n\n  * Fixed long flag definitions with values [felixge]\n\n0.3.1 / 2011-10-31\n==================\n\n  * Changed `--version` short flag to `-V` from `-v`\n  * Changed `.version()` so it's configurable [felixge]\n\n0.3.0 / 2011-10-31\n==================\n\n  * Added support for long flags only. Closes #18\n\n0.2.1 / 2011-10-24\n==================\n\n  * \"node\": \">= 0.4.x < 0.7.0\". Closes #20\n\n0.2.0 / 2011-09-26\n==================\n\n  * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]\n\n0.1.0 / 2011-08-24\n==================\n\n  * Added support for custom `--help` output\n\n0.0.5 / 2011-08-18\n==================\n\n  * Changed: when the user enters nothing prompt for password again\n  * Fixed issue with passwords beginning with numbers [NuckChorris]\n\n0.0.4 / 2011-08-15\n==================\n\n  * Fixed `Commander#args`\n\n0.0.3 / 2011-08-15\n==================\n\n  * Added default option value support\n\n0.0.2 / 2011-08-15\n==================\n\n  * Added mask support to `Command#password(str[, mask], fn)`\n  * Added `Command#password(str, fn)`\n\n0.0.1 / 2010-01-03\n==================\n\n  * Initial release\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/commander/LICENSE",
    "content": "(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/commander/Readme.md",
    "content": "# Commander.js\n\n\n[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js)\n[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander)\n[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true)\n[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander)\n[![Join the chat at https://gitter.im/tj/commander.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n  The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander).  \n  [API documentation](http://tj.github.com/commander.js/)\n\n\n## Installation\n\n    $ npm install commander\n\n## Option parsing\n\nOptions with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n  .version('0.1.0')\n  .option('-p, --peppers', 'Add peppers')\n  .option('-P, --pineapple', 'Add pineapple')\n  .option('-b, --bbq-sauce', 'Add bbq sauce')\n  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n  .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log('  - peppers');\nif (program.pineapple) console.log('  - pineapple');\nif (program.bbqSauce) console.log('  - bbq');\nconsole.log('  - %s cheese', program.cheese);\n```\n\nShort flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\nNote that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n  .option('--no-sauce', 'Remove sauce')\n  .parse(process.argv);\n\nconsole.log('you ordered a pizza');\nif (program.sauce) console.log('  with sauce');\nelse console.log(' without sauce');\n```\n\nTo get string arguments from options you will need to use angle brackets <> for required inputs or square brackets [] for optional inputs. \n\ne.g. ```.option('-m --myarg [myVar]', 'my super cool description')```\n\nThen to access the input if it was passed in.\n\ne.g. ```var myInput = program.myarg```\n\n**NOTE**: If you pass a argument without using brackets the example above will return true and not the value passed in.\n\n\n## Version option\n\nCalling the `version` implicitly adds the `-V` and `--version` options to the command.\nWhen either of these options is present, the command prints the version number and exits.\n\n    $ ./examples/pizza -V\n    0.0.1\n\nIf you want your program to respond to the `-v` option instead of the `-V` option, simply pass custom flags to the `version` method using the same syntax as the `option` method.\n\n```js\nprogram\n  .version('0.0.1', '-v, --version')\n```\n\nThe version flags can be named anything, but the long option is required.\n\n## Command-specific options\n\nYou can attach options to a command.\n\n```js\n#!/usr/bin/env node\n\nvar program = require('commander');\n\nprogram\n  .command('rm <dir>')\n  .option('-r, --recursive', 'Remove recursively')\n  .action(function (dir, cmd) {\n    console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))\n  })\n\nprogram.parse(process.argv)\n```\n\nA command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated.\n\n## Coercion\n\n```js\nfunction range(val) {\n  return val.split('..').map(Number);\n}\n\nfunction list(val) {\n  return val.split(',');\n}\n\nfunction collect(val, memo) {\n  memo.push(val);\n  return memo;\n}\n\nfunction increaseVerbosity(v, total) {\n  return total + 1;\n}\n\nprogram\n  .version('0.1.0')\n  .usage('[options] <file ...>')\n  .option('-i, --integer <n>', 'An integer argument', parseInt)\n  .option('-f, --float <n>', 'A float argument', parseFloat)\n  .option('-r, --range <a>..<b>', 'A range', range)\n  .option('-l, --list <items>', 'A list', list)\n  .option('-o, --optional [value]', 'An optional value')\n  .option('-c, --collect [value]', 'A repeatable value', collect, [])\n  .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)\n  .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' collect: %j', program.collect);\nconsole.log(' verbosity: %j', program.verbose);\nconsole.log(' args: %j', program.args);\n```\n\n## Regular Expression\n```js\nprogram\n  .version('0.1.0')\n  .option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')\n  .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)\n  .parse(process.argv);\n\nconsole.log(' size: %j', program.size);\nconsole.log(' drink: %j', program.drink);\n```\n\n## Variadic arguments\n\n The last argument of a command can be variadic, and only the last argument.  To make an argument variadic you have to\n append `...` to the argument name.  Here is an example:\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n  .version('0.1.0')\n  .command('rmdir <dir> [otherDirs...]')\n  .action(function (dir, otherDirs) {\n    console.log('rmdir %s', dir);\n    if (otherDirs) {\n      otherDirs.forEach(function (oDir) {\n        console.log('rmdir %s', oDir);\n      });\n    }\n  });\n\nprogram.parse(process.argv);\n```\n\n An `Array` is used for the value of a variadic argument.  This applies to `program.args` as well as the argument passed\n to your action as demonstrated above.\n\n## Specify the argument syntax\n\n```js\n#!/usr/bin/env node\n\nvar program = require('commander');\n\nprogram\n  .version('0.1.0')\n  .arguments('<cmd> [env]')\n  .action(function (cmd, env) {\n     cmdValue = cmd;\n     envValue = env;\n  });\n\nprogram.parse(process.argv);\n\nif (typeof cmdValue === 'undefined') {\n   console.error('no command given!');\n   process.exit(1);\n}\nconsole.log('command:', cmdValue);\nconsole.log('environment:', envValue || \"no environment given\");\n```\nAngled brackets (e.g. `<cmd>`) indicate required input. Square brackets (e.g. `[env]`) indicate optional input.\n\n## Git-style sub-commands\n\n```js\n// file: ./examples/pm\nvar program = require('commander');\n\nprogram\n  .version('0.1.0')\n  .command('install [name]', 'install one or more packages')\n  .command('search [query]', 'search with optional query')\n  .command('list', 'list packages installed', {isDefault: true})\n  .parse(process.argv);\n```\n\nWhen `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.  \nThe commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.\n\nOptions can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the subcommand from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.\n\nIf the program is designed to be installed globally, make sure the executables have proper modes, like `755`.\n\n### `--harmony`\n\nYou can enable `--harmony` option in two ways:\n* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.\n* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n```  \n$ ./examples/pizza --help\nUsage: pizza [options]\n\nAn application for pizzas ordering\n\nOptions:\n  -h, --help           output usage information\n  -V, --version        output the version number\n  -p, --peppers        Add peppers\n  -P, --pineapple      Add pineapple\n  -b, --bbq            Add bbq sauce\n  -c, --cheese <type>  Add the specified type of cheese [marble]\n  -C, --no-cheese      You do not want any cheese\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviors, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n  .version('0.1.0')\n  .option('-f, --foo', 'enable some foo')\n  .option('-b, --bar', 'enable some bar')\n  .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n  console.log('')\n  console.log('Examples:');\n  console.log('  $ custom-help --help');\n  console.log('  $ custom-help -h');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nYields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:\n\n```\nUsage: custom-help [options]\n\nOptions:\n  -h, --help     output usage information\n  -V, --version  output the version number\n  -f, --foo      enable some foo\n  -b, --bar      enable some bar\n  -B, --baz      enable some baz\n\nExamples:\n  $ custom-help --help\n  $ custom-help -h\n```\n\n## .outputHelp(cb)\n\nOutput help information without exiting.\nOptional callback cb allows post-processing of help text before it is displayed.\n\nIf you want to display help by default (e.g. if no command was provided), you can use something like:\n\n```js\nvar program = require('commander');\nvar colors = require('colors');\n\nprogram\n  .version('0.1.0')\n  .command('getstream [url]', 'get stream URL')\n  .parse(process.argv);\n\nif (!process.argv.slice(2).length) {\n  program.outputHelp(make_red);\n}\n\nfunction make_red(txt) {\n  return colors.red(txt); //display the help text in red on the console\n}\n```\n\n## .help(cb)\n\n  Output help information and exit immediately.\n  Optional callback cb allows post-processing of help text before it is displayed.\n\n\n## Custom event listeners\n You can execute custom actions by listening to command and option events.\n\n```js\nprogram.on('option:verbose', function () {\n  process.env.VERBOSE = this.verbose;\n});\n\n// error on unknown commands\nprogram.on('command:*', function () {\n  console.error('Invalid command: %s\\nSee --help for a list of available commands.', program.args.join(' '));\n  process.exit(1);\n});\n```\n\n## Examples\n\n```js\nvar program = require('commander');\n\nprogram\n  .version('0.1.0')\n  .option('-C, --chdir <path>', 'change the working directory')\n  .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')\n  .option('-T, --no-tests', 'ignore test hook');\n\nprogram\n  .command('setup [env]')\n  .description('run setup commands for all envs')\n  .option(\"-s, --setup_mode [mode]\", \"Which setup mode to use\")\n  .action(function(env, options){\n    var mode = options.setup_mode || \"normal\";\n    env = env || 'all';\n    console.log('setup for %s env(s) with %s mode', env, mode);\n  });\n\nprogram\n  .command('exec <cmd>')\n  .alias('ex')\n  .description('execute the given remote cmd')\n  .option(\"-e, --exec_mode <mode>\", \"Which exec mode to use\")\n  .action(function(cmd, options){\n    console.log('exec \"%s\" using %s mode', cmd, options.exec_mode);\n  }).on('--help', function() {\n    console.log('');\n    console.log('Examples:');\n    console.log('');\n    console.log('  $ deploy exec sequential');\n    console.log('  $ deploy exec async');\n  });\n\nprogram\n  .command('*')\n  .action(function(env){\n    console.log('deploying \"%s\"', env);\n  });\n\nprogram.parse(process.argv);\n```\n\nMore Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.\n\n## License\n\n[MIT](https://github.com/tj/commander.js/blob/master/LICENSE)\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/commander/index.js",
    "content": "/**\n * Module dependencies.\n */\n\nvar EventEmitter = require('events').EventEmitter;\nvar spawn = require('child_process').spawn;\nvar path = require('path');\nvar dirname = path.dirname;\nvar basename = path.basename;\nvar fs = require('fs');\n\n/**\n * Inherit `Command` from `EventEmitter.prototype`.\n */\n\nrequire('util').inherits(Command, EventEmitter);\n\n/**\n * Expose the root command.\n */\n\nexports = module.exports = new Command();\n\n/**\n * Expose `Command`.\n */\n\nexports.Command = Command;\n\n/**\n * Expose `Option`.\n */\n\nexports.Option = Option;\n\n/**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {String} flags\n * @param {String} description\n * @api public\n */\n\nfunction Option(flags, description) {\n  this.flags = flags;\n  this.required = flags.indexOf('<') >= 0;\n  this.optional = flags.indexOf('[') >= 0;\n  this.bool = flags.indexOf('-no-') === -1;\n  flags = flags.split(/[ ,|]+/);\n  if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();\n  this.long = flags.shift();\n  this.description = description || '';\n}\n\n/**\n * Return option name.\n *\n * @return {String}\n * @api private\n */\n\nOption.prototype.name = function() {\n  return this.long\n    .replace('--', '')\n    .replace('no-', '');\n};\n\n/**\n * Return option name, in a camelcase format that can be used\n * as a object attribute key.\n *\n * @return {String}\n * @api private\n */\n\nOption.prototype.attributeName = function() {\n  return camelcase(this.name());\n};\n\n/**\n * Check if `arg` matches the short or long flag.\n *\n * @param {String} arg\n * @return {Boolean}\n * @api private\n */\n\nOption.prototype.is = function(arg) {\n  return this.short === arg || this.long === arg;\n};\n\n/**\n * Initialize a new `Command`.\n *\n * @param {String} name\n * @api public\n */\n\nfunction Command(name) {\n  this.commands = [];\n  this.options = [];\n  this._execs = {};\n  this._allowUnknownOption = false;\n  this._args = [];\n  this._name = name || '';\n}\n\n/**\n * Add command `name`.\n *\n * The `.action()` callback is invoked when the\n * command `name` is specified via __ARGV__,\n * and the remaining arguments are applied to the\n * function for access.\n *\n * When the `name` is \"*\" an un-matched command\n * will be passed as the first arg, followed by\n * the rest of __ARGV__ remaining.\n *\n * Examples:\n *\n *      program\n *        .version('0.0.1')\n *        .option('-C, --chdir <path>', 'change the working directory')\n *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')\n *        .option('-T, --no-tests', 'ignore test hook')\n *\n *      program\n *        .command('setup')\n *        .description('run remote setup commands')\n *        .action(function() {\n *          console.log('setup');\n *        });\n *\n *      program\n *        .command('exec <cmd>')\n *        .description('run the given remote command')\n *        .action(function(cmd) {\n *          console.log('exec \"%s\"', cmd);\n *        });\n *\n *      program\n *        .command('teardown <dir> [otherDirs...]')\n *        .description('run teardown commands')\n *        .action(function(dir, otherDirs) {\n *          console.log('dir \"%s\"', dir);\n *          if (otherDirs) {\n *            otherDirs.forEach(function (oDir) {\n *              console.log('dir \"%s\"', oDir);\n *            });\n *          }\n *        });\n *\n *      program\n *        .command('*')\n *        .description('deploy the given env')\n *        .action(function(env) {\n *          console.log('deploying \"%s\"', env);\n *        });\n *\n *      program.parse(process.argv);\n  *\n * @param {String} name\n * @param {String} [desc] for git-style sub-commands\n * @return {Command} the new command\n * @api public\n */\n\nCommand.prototype.command = function(name, desc, opts) {\n  if (typeof desc === 'object' && desc !== null) {\n    opts = desc;\n    desc = null;\n  }\n  opts = opts || {};\n  var args = name.split(/ +/);\n  var cmd = new Command(args.shift());\n\n  if (desc) {\n    cmd.description(desc);\n    this.executables = true;\n    this._execs[cmd._name] = true;\n    if (opts.isDefault) this.defaultExecutable = cmd._name;\n  }\n  cmd._noHelp = !!opts.noHelp;\n  this.commands.push(cmd);\n  cmd.parseExpectedArgs(args);\n  cmd.parent = this;\n\n  if (desc) return this;\n  return cmd;\n};\n\n/**\n * Define argument syntax for the top-level command.\n *\n * @api public\n */\n\nCommand.prototype.arguments = function(desc) {\n  return this.parseExpectedArgs(desc.split(/ +/));\n};\n\n/**\n * Add an implicit `help [cmd]` subcommand\n * which invokes `--help` for the given command.\n *\n * @api private\n */\n\nCommand.prototype.addImplicitHelpCommand = function() {\n  this.command('help [cmd]', 'display help for [cmd]');\n};\n\n/**\n * Parse expected `args`.\n *\n * For example `[\"[type]\"]` becomes `[{ required: false, name: 'type' }]`.\n *\n * @param {Array} args\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.parseExpectedArgs = function(args) {\n  if (!args.length) return;\n  var self = this;\n  args.forEach(function(arg) {\n    var argDetails = {\n      required: false,\n      name: '',\n      variadic: false\n    };\n\n    switch (arg[0]) {\n      case '<':\n        argDetails.required = true;\n        argDetails.name = arg.slice(1, -1);\n        break;\n      case '[':\n        argDetails.name = arg.slice(1, -1);\n        break;\n    }\n\n    if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {\n      argDetails.variadic = true;\n      argDetails.name = argDetails.name.slice(0, -3);\n    }\n    if (argDetails.name) {\n      self._args.push(argDetails);\n    }\n  });\n  return this;\n};\n\n/**\n * Register callback `fn` for the command.\n *\n * Examples:\n *\n *      program\n *        .command('help')\n *        .description('display verbose help')\n *        .action(function() {\n *           // output help here\n *        });\n *\n * @param {Function} fn\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.action = function(fn) {\n  var self = this;\n  var listener = function(args, unknown) {\n    // Parse any so-far unknown options\n    args = args || [];\n    unknown = unknown || [];\n\n    var parsed = self.parseOptions(unknown);\n\n    // Output help if necessary\n    outputHelpIfNecessary(self, parsed.unknown);\n\n    // If there are still any unknown options, then we simply\n    // die, unless someone asked for help, in which case we give it\n    // to them, and then we die.\n    if (parsed.unknown.length > 0) {\n      self.unknownOption(parsed.unknown[0]);\n    }\n\n    // Leftover arguments need to be pushed back. Fixes issue #56\n    if (parsed.args.length) args = parsed.args.concat(args);\n\n    self._args.forEach(function(arg, i) {\n      if (arg.required && args[i] == null) {\n        self.missingArgument(arg.name);\n      } else if (arg.variadic) {\n        if (i !== self._args.length - 1) {\n          self.variadicArgNotLast(arg.name);\n        }\n\n        args[i] = args.splice(i);\n      }\n    });\n\n    // Always append ourselves to the end of the arguments,\n    // to make sure we match the number of arguments the user\n    // expects\n    if (self._args.length) {\n      args[self._args.length] = self;\n    } else {\n      args.push(self);\n    }\n\n    fn.apply(self, args);\n  };\n  var parent = this.parent || this;\n  var name = parent === this ? '*' : this._name;\n  parent.on('command:' + name, listener);\n  if (this._alias) parent.on('command:' + this._alias, listener);\n  return this;\n};\n\n/**\n * Define option with `flags`, `description` and optional\n * coercion `fn`.\n *\n * The `flags` string should contain both the short and long flags,\n * separated by comma, a pipe or space. The following are all valid\n * all will output this way when `--help` is used.\n *\n *    \"-p, --pepper\"\n *    \"-p|--pepper\"\n *    \"-p --pepper\"\n *\n * Examples:\n *\n *     // simple boolean defaulting to false\n *     program.option('-p, --pepper', 'add pepper');\n *\n *     --pepper\n *     program.pepper\n *     // => Boolean\n *\n *     // simple boolean defaulting to true\n *     program.option('-C, --no-cheese', 'remove cheese');\n *\n *     program.cheese\n *     // => true\n *\n *     --no-cheese\n *     program.cheese\n *     // => false\n *\n *     // required argument\n *     program.option('-C, --chdir <path>', 'change the working directory');\n *\n *     --chdir /tmp\n *     program.chdir\n *     // => \"/tmp\"\n *\n *     // optional argument\n *     program.option('-c, --cheese [type]', 'add cheese [marble]');\n *\n * @param {String} flags\n * @param {String} description\n * @param {Function|*} [fn] or default\n * @param {*} [defaultValue]\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.option = function(flags, description, fn, defaultValue) {\n  var self = this,\n    option = new Option(flags, description),\n    oname = option.name(),\n    name = option.attributeName();\n\n  // default as 3rd arg\n  if (typeof fn !== 'function') {\n    if (fn instanceof RegExp) {\n      var regex = fn;\n      fn = function(val, def) {\n        var m = regex.exec(val);\n        return m ? m[0] : def;\n      };\n    } else {\n      defaultValue = fn;\n      fn = null;\n    }\n  }\n\n  // preassign default value only for --no-*, [optional], or <required>\n  if (!option.bool || option.optional || option.required) {\n    // when --no-* we make sure default is true\n    if (!option.bool) defaultValue = true;\n    // preassign only if we have a default\n    if (defaultValue !== undefined) {\n      self[name] = defaultValue;\n      option.defaultValue = defaultValue;\n    }\n  }\n\n  // register the option\n  this.options.push(option);\n\n  // when it's passed assign the value\n  // and conditionally invoke the callback\n  this.on('option:' + oname, function(val) {\n    // coercion\n    if (val !== null && fn) {\n      val = fn(val, self[name] === undefined ? defaultValue : self[name]);\n    }\n\n    // unassigned or bool\n    if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') {\n      // if no value, bool true, and we have a default, then use it!\n      if (val == null) {\n        self[name] = option.bool\n          ? defaultValue || true\n          : false;\n      } else {\n        self[name] = val;\n      }\n    } else if (val !== null) {\n      // reassign\n      self[name] = val;\n    }\n  });\n\n  return this;\n};\n\n/**\n * Allow unknown options on the command line.\n *\n * @param {Boolean} arg if `true` or omitted, no error will be thrown\n * for unknown options.\n * @api public\n */\nCommand.prototype.allowUnknownOption = function(arg) {\n  this._allowUnknownOption = arguments.length === 0 || arg;\n  return this;\n};\n\n/**\n * Parse `argv`, settings options and invoking commands when defined.\n *\n * @param {Array} argv\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.parse = function(argv) {\n  // implicit help\n  if (this.executables) this.addImplicitHelpCommand();\n\n  // store raw args\n  this.rawArgs = argv;\n\n  // guess name\n  this._name = this._name || basename(argv[1], '.js');\n\n  // github-style sub-commands with no sub-command\n  if (this.executables && argv.length < 3 && !this.defaultExecutable) {\n    // this user needs help\n    argv.push('--help');\n  }\n\n  // process argv\n  var parsed = this.parseOptions(this.normalize(argv.slice(2)));\n  var args = this.args = parsed.args;\n\n  var result = this.parseArgs(this.args, parsed.unknown);\n\n  // executable sub-commands\n  var name = result.args[0];\n\n  var aliasCommand = null;\n  // check alias of sub commands\n  if (name) {\n    aliasCommand = this.commands.filter(function(command) {\n      return command.alias() === name;\n    })[0];\n  }\n\n  if (this._execs[name] === true) {\n    return this.executeSubCommand(argv, args, parsed.unknown);\n  } else if (aliasCommand) {\n    // is alias of a subCommand\n    args[0] = aliasCommand._name;\n    return this.executeSubCommand(argv, args, parsed.unknown);\n  } else if (this.defaultExecutable) {\n    // use the default subcommand\n    args.unshift(this.defaultExecutable);\n    return this.executeSubCommand(argv, args, parsed.unknown);\n  }\n\n  return result;\n};\n\n/**\n * Execute a sub-command executable.\n *\n * @param {Array} argv\n * @param {Array} args\n * @param {Array} unknown\n * @api private\n */\n\nCommand.prototype.executeSubCommand = function(argv, args, unknown) {\n  args = args.concat(unknown);\n\n  if (!args.length) this.help();\n  if (args[0] === 'help' && args.length === 1) this.help();\n\n  // <cmd> --help\n  if (args[0] === 'help') {\n    args[0] = args[1];\n    args[1] = '--help';\n  }\n\n  // executable\n  var f = argv[1];\n  // name of the subcommand, link `pm-install`\n  var bin = basename(f, path.extname(f)) + '-' + args[0];\n\n  // In case of globally installed, get the base dir where executable\n  //  subcommand file should be located at\n  var baseDir;\n\n  var resolvedLink = fs.realpathSync(f);\n\n  baseDir = dirname(resolvedLink);\n\n  // prefer local `./<bin>` to bin in the $PATH\n  var localBin = path.join(baseDir, bin);\n\n  // whether bin file is a js script with explicit `.js` or `.ts` extension\n  var isExplicitJS = false;\n  if (exists(localBin + '.js')) {\n    bin = localBin + '.js';\n    isExplicitJS = true;\n  } else if (exists(localBin + '.ts')) {\n    bin = localBin + '.ts';\n    isExplicitJS = true;\n  } else if (exists(localBin)) {\n    bin = localBin;\n  }\n\n  args = args.slice(1);\n\n  var proc;\n  if (process.platform !== 'win32') {\n    if (isExplicitJS) {\n      args.unshift(bin);\n      // add executable arguments to spawn\n      args = (process.execArgv || []).concat(args);\n\n      proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] });\n    } else {\n      proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });\n    }\n  } else {\n    args.unshift(bin);\n    proc = spawn(process.execPath, args, { stdio: 'inherit' });\n  }\n\n  var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n  signals.forEach(function(signal) {\n    process.on(signal, function() {\n      if (proc.killed === false && proc.exitCode === null) {\n        proc.kill(signal);\n      }\n    });\n  });\n  proc.on('close', process.exit.bind(process));\n  proc.on('error', function(err) {\n    if (err.code === 'ENOENT') {\n      console.error('error: %s(1) does not exist, try --help', bin);\n    } else if (err.code === 'EACCES') {\n      console.error('error: %s(1) not executable. try chmod or run with root', bin);\n    }\n    process.exit(1);\n  });\n\n  // Store the reference to the child process\n  this.runningCommand = proc;\n};\n\n/**\n * Normalize `args`, splitting joined short flags. For example\n * the arg \"-abc\" is equivalent to \"-a -b -c\".\n * This also normalizes equal sign and splits \"--abc=def\" into \"--abc def\".\n *\n * @param {Array} args\n * @return {Array}\n * @api private\n */\n\nCommand.prototype.normalize = function(args) {\n  var ret = [],\n    arg,\n    lastOpt,\n    index;\n\n  for (var i = 0, len = args.length; i < len; ++i) {\n    arg = args[i];\n    if (i > 0) {\n      lastOpt = this.optionFor(args[i - 1]);\n    }\n\n    if (arg === '--') {\n      // Honor option terminator\n      ret = ret.concat(args.slice(i));\n      break;\n    } else if (lastOpt && lastOpt.required) {\n      ret.push(arg);\n    } else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') {\n      arg.slice(1).split('').forEach(function(c) {\n        ret.push('-' + c);\n      });\n    } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {\n      ret.push(arg.slice(0, index), arg.slice(index + 1));\n    } else {\n      ret.push(arg);\n    }\n  }\n\n  return ret;\n};\n\n/**\n * Parse command `args`.\n *\n * When listener(s) are available those\n * callbacks are invoked, otherwise the \"*\"\n * event is emitted and those actions are invoked.\n *\n * @param {Array} args\n * @return {Command} for chaining\n * @api private\n */\n\nCommand.prototype.parseArgs = function(args, unknown) {\n  var name;\n\n  if (args.length) {\n    name = args[0];\n    if (this.listeners('command:' + name).length) {\n      this.emit('command:' + args.shift(), args, unknown);\n    } else {\n      this.emit('command:*', args);\n    }\n  } else {\n    outputHelpIfNecessary(this, unknown);\n\n    // If there were no args and we have unknown options,\n    // then they are extraneous and we need to error.\n    if (unknown.length > 0) {\n      this.unknownOption(unknown[0]);\n    }\n    if (this.commands.length === 0 &&\n        this._args.filter(function(a) { return a.required; }).length === 0) {\n      this.emit('command:*');\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return an option matching `arg` if any.\n *\n * @param {String} arg\n * @return {Option}\n * @api private\n */\n\nCommand.prototype.optionFor = function(arg) {\n  for (var i = 0, len = this.options.length; i < len; ++i) {\n    if (this.options[i].is(arg)) {\n      return this.options[i];\n    }\n  }\n};\n\n/**\n * Parse options from `argv` returning `argv`\n * void of these options.\n *\n * @param {Array} argv\n * @return {Array}\n * @api public\n */\n\nCommand.prototype.parseOptions = function(argv) {\n  var args = [],\n    len = argv.length,\n    literal,\n    option,\n    arg;\n\n  var unknownOptions = [];\n\n  // parse options\n  for (var i = 0; i < len; ++i) {\n    arg = argv[i];\n\n    // literal args after --\n    if (literal) {\n      args.push(arg);\n      continue;\n    }\n\n    if (arg === '--') {\n      literal = true;\n      continue;\n    }\n\n    // find matching Option\n    option = this.optionFor(arg);\n\n    // option is defined\n    if (option) {\n      // requires arg\n      if (option.required) {\n        arg = argv[++i];\n        if (arg == null) return this.optionMissingArgument(option);\n        this.emit('option:' + option.name(), arg);\n      // optional arg\n      } else if (option.optional) {\n        arg = argv[i + 1];\n        if (arg == null || (arg[0] === '-' && arg !== '-')) {\n          arg = null;\n        } else {\n          ++i;\n        }\n        this.emit('option:' + option.name(), arg);\n      // bool\n      } else {\n        this.emit('option:' + option.name());\n      }\n      continue;\n    }\n\n    // looks like an option\n    if (arg.length > 1 && arg[0] === '-') {\n      unknownOptions.push(arg);\n\n      // If the next argument looks like it might be\n      // an argument for this option, we pass it on.\n      // If it isn't, then it'll simply be ignored\n      if ((i + 1) < argv.length && argv[i + 1][0] !== '-') {\n        unknownOptions.push(argv[++i]);\n      }\n      continue;\n    }\n\n    // arg\n    args.push(arg);\n  }\n\n  return { args: args, unknown: unknownOptions };\n};\n\n/**\n * Return an object containing options as key-value pairs\n *\n * @return {Object}\n * @api public\n */\nCommand.prototype.opts = function() {\n  var result = {},\n    len = this.options.length;\n\n  for (var i = 0; i < len; i++) {\n    var key = this.options[i].attributeName();\n    result[key] = key === this._versionOptionName ? this._version : this[key];\n  }\n  return result;\n};\n\n/**\n * Argument `name` is missing.\n *\n * @param {String} name\n * @api private\n */\n\nCommand.prototype.missingArgument = function(name) {\n  console.error(\"error: missing required argument `%s'\", name);\n  process.exit(1);\n};\n\n/**\n * `Option` is missing an argument, but received `flag` or nothing.\n *\n * @param {String} option\n * @param {String} flag\n * @api private\n */\n\nCommand.prototype.optionMissingArgument = function(option, flag) {\n  if (flag) {\n    console.error(\"error: option `%s' argument missing, got `%s'\", option.flags, flag);\n  } else {\n    console.error(\"error: option `%s' argument missing\", option.flags);\n  }\n  process.exit(1);\n};\n\n/**\n * Unknown option `flag`.\n *\n * @param {String} flag\n * @api private\n */\n\nCommand.prototype.unknownOption = function(flag) {\n  if (this._allowUnknownOption) return;\n  console.error(\"error: unknown option `%s'\", flag);\n  process.exit(1);\n};\n\n/**\n * Variadic argument with `name` is not the last argument as required.\n *\n * @param {String} name\n * @api private\n */\n\nCommand.prototype.variadicArgNotLast = function(name) {\n  console.error(\"error: variadic arguments must be last `%s'\", name);\n  process.exit(1);\n};\n\n/**\n * Set the program version to `str`.\n *\n * This method auto-registers the \"-V, --version\" flag\n * which will print the version number when passed.\n *\n * @param {String} str\n * @param {String} [flags]\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.version = function(str, flags) {\n  if (arguments.length === 0) return this._version;\n  this._version = str;\n  flags = flags || '-V, --version';\n  var versionOption = new Option(flags, 'output the version number');\n  this._versionOptionName = versionOption.long.substr(2) || 'version';\n  this.options.push(versionOption);\n  this.on('option:' + this._versionOptionName, function() {\n    process.stdout.write(str + '\\n');\n    process.exit(0);\n  });\n  return this;\n};\n\n/**\n * Set the description to `str`.\n *\n * @param {String} str\n * @param {Object} argsDescription\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.description = function(str, argsDescription) {\n  if (arguments.length === 0) return this._description;\n  this._description = str;\n  this._argsDescription = argsDescription;\n  return this;\n};\n\n/**\n * Set an alias for the command\n *\n * @param {String} alias\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.alias = function(alias) {\n  var command = this;\n  if (this.commands.length !== 0) {\n    command = this.commands[this.commands.length - 1];\n  }\n\n  if (arguments.length === 0) return command._alias;\n\n  if (alias === command._name) throw new Error('Command alias can\\'t be the same as its name');\n\n  command._alias = alias;\n  return this;\n};\n\n/**\n * Set / get the command usage `str`.\n *\n * @param {String} str\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.usage = function(str) {\n  var args = this._args.map(function(arg) {\n    return humanReadableArgName(arg);\n  });\n\n  var usage = '[options]' +\n    (this.commands.length ? ' [command]' : '') +\n    (this._args.length ? ' ' + args.join(' ') : '');\n\n  if (arguments.length === 0) return this._usage || usage;\n  this._usage = str;\n\n  return this;\n};\n\n/**\n * Get or set the name of the command\n *\n * @param {String} str\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.name = function(str) {\n  if (arguments.length === 0) return this._name;\n  this._name = str;\n  return this;\n};\n\n/**\n * Return prepared commands.\n *\n * @return {Array}\n * @api private\n */\n\nCommand.prototype.prepareCommands = function() {\n  return this.commands.filter(function(cmd) {\n    return !cmd._noHelp;\n  }).map(function(cmd) {\n    var args = cmd._args.map(function(arg) {\n      return humanReadableArgName(arg);\n    }).join(' ');\n\n    return [\n      cmd._name +\n        (cmd._alias ? '|' + cmd._alias : '') +\n        (cmd.options.length ? ' [options]' : '') +\n        (args ? ' ' + args : ''),\n      cmd._description\n    ];\n  });\n};\n\n/**\n * Return the largest command length.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.largestCommandLength = function() {\n  var commands = this.prepareCommands();\n  return commands.reduce(function(max, command) {\n    return Math.max(max, command[0].length);\n  }, 0);\n};\n\n/**\n * Return the largest option length.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.largestOptionLength = function() {\n  var options = [].slice.call(this.options);\n  options.push({\n    flags: '-h, --help'\n  });\n  return options.reduce(function(max, option) {\n    return Math.max(max, option.flags.length);\n  }, 0);\n};\n\n/**\n * Return the largest arg length.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.largestArgLength = function() {\n  return this._args.reduce(function(max, arg) {\n    return Math.max(max, arg.name.length);\n  }, 0);\n};\n\n/**\n * Return the pad width.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.padWidth = function() {\n  var width = this.largestOptionLength();\n  if (this._argsDescription && this._args.length) {\n    if (this.largestArgLength() > width) {\n      width = this.largestArgLength();\n    }\n  }\n\n  if (this.commands && this.commands.length) {\n    if (this.largestCommandLength() > width) {\n      width = this.largestCommandLength();\n    }\n  }\n\n  return width;\n};\n\n/**\n * Return help for options.\n *\n * @return {String}\n * @api private\n */\n\nCommand.prototype.optionHelp = function() {\n  var width = this.padWidth();\n\n  // Append the help information\n  return this.options.map(function(option) {\n    return pad(option.flags, width) + '  ' + option.description +\n      ((option.bool && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');\n  }).concat([pad('-h, --help', width) + '  ' + 'output usage information'])\n    .join('\\n');\n};\n\n/**\n * Return command help documentation.\n *\n * @return {String}\n * @api private\n */\n\nCommand.prototype.commandHelp = function() {\n  if (!this.commands.length) return '';\n\n  var commands = this.prepareCommands();\n  var width = this.padWidth();\n\n  return [\n    'Commands:',\n    commands.map(function(cmd) {\n      var desc = cmd[1] ? '  ' + cmd[1] : '';\n      return (desc ? pad(cmd[0], width) : cmd[0]) + desc;\n    }).join('\\n').replace(/^/gm, '  '),\n    ''\n  ].join('\\n');\n};\n\n/**\n * Return program help documentation.\n *\n * @return {String}\n * @api private\n */\n\nCommand.prototype.helpInformation = function() {\n  var desc = [];\n  if (this._description) {\n    desc = [\n      this._description,\n      ''\n    ];\n\n    var argsDescription = this._argsDescription;\n    if (argsDescription && this._args.length) {\n      var width = this.padWidth();\n      desc.push('Arguments:');\n      desc.push('');\n      this._args.forEach(function(arg) {\n        desc.push('  ' + pad(arg.name, width) + '  ' + argsDescription[arg.name]);\n      });\n      desc.push('');\n    }\n  }\n\n  var cmdName = this._name;\n  if (this._alias) {\n    cmdName = cmdName + '|' + this._alias;\n  }\n  var usage = [\n    'Usage: ' + cmdName + ' ' + this.usage(),\n    ''\n  ];\n\n  var cmds = [];\n  var commandHelp = this.commandHelp();\n  if (commandHelp) cmds = [commandHelp];\n\n  var options = [\n    'Options:',\n    '' + this.optionHelp().replace(/^/gm, '  '),\n    ''\n  ];\n\n  return usage\n    .concat(desc)\n    .concat(options)\n    .concat(cmds)\n    .join('\\n');\n};\n\n/**\n * Output help information for this command\n *\n * @api public\n */\n\nCommand.prototype.outputHelp = function(cb) {\n  if (!cb) {\n    cb = function(passthru) {\n      return passthru;\n    };\n  }\n  process.stdout.write(cb(this.helpInformation()));\n  this.emit('--help');\n};\n\n/**\n * Output help information and exit.\n *\n * @api public\n */\n\nCommand.prototype.help = function(cb) {\n  this.outputHelp(cb);\n  process.exit();\n};\n\n/**\n * Camel-case the given `flag`\n *\n * @param {String} flag\n * @return {String}\n * @api private\n */\n\nfunction camelcase(flag) {\n  return flag.split('-').reduce(function(str, word) {\n    return str + word[0].toUpperCase() + word.slice(1);\n  });\n}\n\n/**\n * Pad `str` to `width`.\n *\n * @param {String} str\n * @param {Number} width\n * @return {String}\n * @api private\n */\n\nfunction pad(str, width) {\n  var len = Math.max(0, width - str.length);\n  return str + Array(len + 1).join(' ');\n}\n\n/**\n * Output help information if necessary\n *\n * @param {Command} command to output help for\n * @param {Array} array of options to search for -h or --help\n * @api private\n */\n\nfunction outputHelpIfNecessary(cmd, options) {\n  options = options || [];\n  for (var i = 0; i < options.length; i++) {\n    if (options[i] === '--help' || options[i] === '-h') {\n      cmd.outputHelp();\n      process.exit(0);\n    }\n  }\n}\n\n/**\n * Takes an argument an returns its human readable equivalent for help usage.\n *\n * @param {Object} arg\n * @return {String}\n * @api private\n */\n\nfunction humanReadableArgName(arg) {\n  var nameOutput = arg.name + (arg.variadic === true ? '...' : '');\n\n  return arg.required\n    ? '<' + nameOutput + '>'\n    : '[' + nameOutput + ']';\n}\n\n// for versions before node v0.8 when there weren't `fs.existsSync`\nfunction exists(file) {\n  try {\n    if (fs.statSync(file).isFile()) {\n      return true;\n    }\n  } catch (e) {\n    return false;\n  }\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/commander/package.json",
    "content": "{\n  \"name\": \"commander\",\n  \"version\": \"2.20.3\",\n  \"description\": \"the complete solution for node.js command-line programs\",\n  \"keywords\": [\n    \"commander\",\n    \"command\",\n    \"option\",\n    \"parser\"\n  ],\n  \"author\": \"TJ Holowaychuk <tj@vision-media.ca>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/tj/commander.js.git\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint index.js\",\n    \"test\": \"node test/run.js && npm run test-typings\",\n    \"test-typings\": \"tsc -p tsconfig.json\"\n  },\n  \"main\": \"index\",\n  \"files\": [\n    \"index.js\",\n    \"typings/index.d.ts\"\n  ],\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"@types/node\": \"^12.7.8\",\n    \"eslint\": \"^6.4.0\",\n    \"should\": \"^13.2.3\",\n    \"sinon\": \"^7.5.0\",\n    \"standard\": \"^14.3.1\",\n    \"ts-node\": \"^8.4.1\",\n    \"typescript\": \"^3.6.3\"\n  },\n  \"typings\": \"typings/index.d.ts\"\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/commander/typings/index.d.ts",
    "content": "// Type definitions for commander 2.11\n// Project: https://github.com/visionmedia/commander.js\n// Definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\ndeclare namespace local {\n\n  class Option {\n    flags: string;\n    required: boolean;\n    optional: boolean;\n    bool: boolean;\n    short?: string;\n    long: string;\n    description: string;\n\n    /**\n     * Initialize a new `Option` with the given `flags` and `description`.\n     *\n     * @param {string} flags\n     * @param {string} [description]\n     */\n    constructor(flags: string, description?: string);\n  }\n\n  class Command extends NodeJS.EventEmitter {\n    [key: string]: any;\n\n    args: string[];\n\n    /**\n     * Initialize a new `Command`.\n     *\n     * @param {string} [name]\n     */\n    constructor(name?: string);\n\n    /**\n     * Set the program version to `str`.\n     *\n     * This method auto-registers the \"-V, --version\" flag\n     * which will print the version number when passed.\n     *\n     * @param {string} str\n     * @param {string} [flags]\n     * @returns {Command} for chaining\n     */\n    version(str: string, flags?: string): Command;\n\n    /**\n     * Add command `name`.\n     *\n     * The `.action()` callback is invoked when the\n     * command `name` is specified via __ARGV__,\n     * and the remaining arguments are applied to the\n     * function for access.\n     *\n     * When the `name` is \"*\" an un-matched command\n     * will be passed as the first arg, followed by\n     * the rest of __ARGV__ remaining.\n     *\n     * @example\n     *      program\n     *        .version('0.0.1')\n     *        .option('-C, --chdir <path>', 'change the working directory')\n     *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')\n     *        .option('-T, --no-tests', 'ignore test hook')\n     *\n     *      program\n     *        .command('setup')\n     *        .description('run remote setup commands')\n     *        .action(function() {\n     *          console.log('setup');\n     *        });\n     *\n     *      program\n     *        .command('exec <cmd>')\n     *        .description('run the given remote command')\n     *        .action(function(cmd) {\n     *          console.log('exec \"%s\"', cmd);\n     *        });\n     *\n     *      program\n     *        .command('teardown <dir> [otherDirs...]')\n     *        .description('run teardown commands')\n     *        .action(function(dir, otherDirs) {\n     *          console.log('dir \"%s\"', dir);\n     *          if (otherDirs) {\n     *            otherDirs.forEach(function (oDir) {\n     *              console.log('dir \"%s\"', oDir);\n     *            });\n     *          }\n     *        });\n     *\n     *      program\n     *        .command('*')\n     *        .description('deploy the given env')\n     *        .action(function(env) {\n     *          console.log('deploying \"%s\"', env);\n     *        });\n     *\n     *      program.parse(process.argv);\n     *\n     * @param {string} name\n     * @param {string} [desc] for git-style sub-commands\n     * @param {CommandOptions} [opts] command options\n     * @returns {Command} the new command\n     */\n    command(name: string, desc?: string, opts?: commander.CommandOptions): Command;\n\n    /**\n     * Define argument syntax for the top-level command.\n     *\n     * @param {string} desc\n     * @returns {Command} for chaining\n     */\n    arguments(desc: string): Command;\n\n    /**\n     * Parse expected `args`.\n     *\n     * For example `[\"[type]\"]` becomes `[{ required: false, name: 'type' }]`.\n     *\n     * @param {string[]} args\n     * @returns {Command} for chaining\n     */\n    parseExpectedArgs(args: string[]): Command;\n\n    /**\n     * Register callback `fn` for the command.\n     *\n     * @example\n     *      program\n     *        .command('help')\n     *        .description('display verbose help')\n     *        .action(function() {\n     *           // output help here\n     *        });\n     *\n     * @param {(...args: any[]) => void} fn\n     * @returns {Command} for chaining\n     */\n    action(fn: (...args: any[]) => void): Command;\n\n    /**\n     * Define option with `flags`, `description` and optional\n     * coercion `fn`.\n     *\n     * The `flags` string should contain both the short and long flags,\n     * separated by comma, a pipe or space. The following are all valid\n     * all will output this way when `--help` is used.\n     *\n     *    \"-p, --pepper\"\n     *    \"-p|--pepper\"\n     *    \"-p --pepper\"\n     *\n     * @example\n     *     // simple boolean defaulting to false\n     *     program.option('-p, --pepper', 'add pepper');\n     *\n     *     --pepper\n     *     program.pepper\n     *     // => Boolean\n     *\n     *     // simple boolean defaulting to true\n     *     program.option('-C, --no-cheese', 'remove cheese');\n     *\n     *     program.cheese\n     *     // => true\n     *\n     *     --no-cheese\n     *     program.cheese\n     *     // => false\n     *\n     *     // required argument\n     *     program.option('-C, --chdir <path>', 'change the working directory');\n     *\n     *     --chdir /tmp\n     *     program.chdir\n     *     // => \"/tmp\"\n     *\n     *     // optional argument\n     *     program.option('-c, --cheese [type]', 'add cheese [marble]');\n     *\n     * @param {string} flags\n     * @param {string} [description]\n     * @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default\n     * @param {*} [defaultValue]\n     * @returns {Command} for chaining\n     */\n    option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command;\n    option(flags: string, description?: string, defaultValue?: any): Command;\n\n    /**\n     * Allow unknown options on the command line.\n     *\n     * @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options.\n     * @returns {Command} for chaining\n     */\n    allowUnknownOption(arg?: boolean): Command;\n\n    /**\n     * Parse `argv`, settings options and invoking commands when defined.\n     *\n     * @param {string[]} argv\n     * @returns {Command} for chaining\n     */\n    parse(argv: string[]): Command;\n\n    /**\n     * Parse options from `argv` returning `argv` void of these options.\n     *\n     * @param {string[]} argv\n     * @returns {ParseOptionsResult}\n     */\n    parseOptions(argv: string[]): commander.ParseOptionsResult;\n\n    /**\n     * Return an object containing options as key-value pairs\n     *\n     * @returns {{[key: string]: any}}\n     */\n    opts(): { [key: string]: any };\n\n    /**\n     * Set the description to `str`.\n     *\n     * @param {string} str\n     * @param {{[argName: string]: string}} argsDescription\n     * @return {(Command | string)}\n     */\n    description(str: string, argsDescription?: {[argName: string]: string}): Command;\n    description(): string;\n\n    /**\n     * Set an alias for the command.\n     *\n     * @param {string} alias\n     * @return {(Command | string)}\n     */\n    alias(alias: string): Command;\n    alias(): string;\n\n    /**\n     * Set or get the command usage.\n     *\n     * @param {string} str\n     * @return {(Command | string)}\n     */\n    usage(str: string): Command;\n    usage(): string;\n\n    /**\n     * Set the name of the command.\n     *\n     * @param {string} str\n     * @return {Command}\n     */\n    name(str: string): Command;\n\n    /**\n     * Get the name of the command.\n     *\n     * @return {string}\n     */\n    name(): string;\n\n    /**\n     * Output help information for this command.\n     *\n     * @param {(str: string) => string} [cb]\n     */\n    outputHelp(cb?: (str: string) => string): void;\n\n    /** Output help information and exit.\n     *\n     * @param {(str: string) => string} [cb]\n     */\n    help(cb?: (str: string) => string): never;\n  }\n\n}\n\ndeclare namespace commander {\n\n    type Command = local.Command\n\n    type Option = local.Option\n\n    interface CommandOptions {\n        noHelp?: boolean;\n        isDefault?: boolean;\n    }\n\n    interface ParseOptionsResult {\n        args: string[];\n        unknown: string[];\n    }\n\n    interface CommanderStatic extends Command {\n        Command: typeof local.Command;\n        Option: typeof local.Option;\n        CommandOptions: CommandOptions;\n        ParseOptionsResult: ParseOptionsResult;\n    }\n\n}\n\ndeclare const commander: commander.CommanderStatic;\nexport = commander;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Evan Wallace\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/README.md",
    "content": "# Source Map Support\n[![Build Status](https://travis-ci.org/evanw/node-source-map-support.svg?branch=master)](https://travis-ci.org/evanw/node-source-map-support)\n\nThis module provides source map support for stack traces in node via the [V8 stack trace API](https://github.com/v8/v8/wiki/Stack-Trace-API). It uses the [source-map](https://github.com/mozilla/source-map) module to replace the paths and line numbers of source-mapped files with their original paths and line numbers. The output mimics node's stack trace format with the goal of making every compile-to-JS language more of a first-class citizen. Source maps are completely general (not specific to any one language) so you can use source maps with multiple compile-to-JS languages in the same node process.\n\n## Installation and Usage\n\n#### Node support\n\n```\n$ npm install source-map-support\n```\n\nSource maps can be generated using libraries such as [source-map-index-generator](https://github.com/twolfson/source-map-index-generator). Once you have a valid source map, place a source mapping comment somewhere in the file (usually done automatically or with an option by your transpiler):\n\n```\n//# sourceMappingURL=path/to/source.map\n```\n\nIf multiple sourceMappingURL comments exist in one file, the last sourceMappingURL comment will be\nrespected (e.g. if a file mentions the comment in code, or went through multiple transpilers).\nThe path should either be absolute or relative to the compiled file.\n\nFrom here you have two options.\n\n##### CLI Usage\n\n```bash\nnode -r source-map-support/register compiled.js\n```\n\n##### Programmatic Usage\n\nPut the following line at the top of the compiled file.\n\n```js\nrequire('source-map-support').install();\n```\n\nIt is also possible to install the source map support directly by\nrequiring the `register` module which can be handy with ES6:\n\n```js\nimport 'source-map-support/register'\n\n// Instead of:\nimport sourceMapSupport from 'source-map-support'\nsourceMapSupport.install()\n```\nNote: if you're using babel-register, it includes source-map-support already.\n\nIt is also very useful with Mocha:\n\n```\n$ mocha --require source-map-support/register tests/\n```\n\n#### Browser support\n\nThis library also works in Chrome. While the DevTools console already supports source maps, the V8 engine doesn't and `Error.prototype.stack` will be incorrect without this library. Everything will just work if you deploy your source files using [browserify](http://browserify.org/). Just make sure to pass the `--debug` flag to the browserify command so your source maps are included in the bundled code.\n\nThis library also works if you use another build process or just include the source files directly. In this case, include the file `browser-source-map-support.js` in your page and call `sourceMapSupport.install()`. It contains the whole library already bundled for the browser using browserify.\n\n```html\n<script src=\"browser-source-map-support.js\"></script>\n<script>sourceMapSupport.install();</script>\n```\n\nThis library also works if you use AMD (Asynchronous Module Definition), which is used in tools like [RequireJS](http://requirejs.org/). Just list `browser-source-map-support` as a dependency:\n\n```html\n<script>\n  define(['browser-source-map-support'], function(sourceMapSupport) {\n    sourceMapSupport.install();\n  });\n</script>\n```\n\n## Options\n\nThis module installs two things: a change to the `stack` property on `Error` objects and a handler for uncaught exceptions that mimics node's default exception handler (the handler can be seen in the demos below). You may want to disable the handler if you have your own uncaught exception handler. This can be done by passing an argument to the installer:\n\n```js\nrequire('source-map-support').install({\n  handleUncaughtExceptions: false\n});\n```\n\nThis module loads source maps from the filesystem by default. You can provide alternate loading behavior through a callback as shown below. For example, [Meteor](https://github.com/meteor) keeps all source maps cached in memory to avoid disk access.\n\n```js\nrequire('source-map-support').install({\n  retrieveSourceMap: function(source) {\n    if (source === 'compiled.js') {\n      return {\n        url: 'original.js',\n        map: fs.readFileSync('compiled.js.map', 'utf8')\n      };\n    }\n    return null;\n  }\n});\n```\n\nThe module will by default assume a browser environment if XMLHttpRequest and window are defined. If either of these do not exist it will instead assume a node environment.\nIn some rare cases, e.g. when running a browser emulation and where both variables are also set, you can explictly specify the environment to be either 'browser' or 'node'.\n\n```js\nrequire('source-map-support').install({\n  environment: 'node'\n});\n```\n\nTo support files with inline source maps, the `hookRequire` options can be specified, which will monitor all source files for inline source maps.\n\n\n```js\nrequire('source-map-support').install({\n  hookRequire: true\n});\n```\n\nThis monkey patches the `require` module loading chain, so is not enabled by default and is not recommended for any sort of production usage.\n\n## Demos\n\n#### Basic Demo\n\noriginal.js:\n\n```js\nthrow new Error('test'); // This is the original code\n```\n\ncompiled.js:\n\n```js\nrequire('source-map-support').install();\n\nthrow new Error('test'); // This is the compiled code\n// The next line defines the sourceMapping.\n//# sourceMappingURL=compiled.js.map\n```\n\ncompiled.js.map:\n\n```json\n{\n  \"version\": 3,\n  \"file\": \"compiled.js\",\n  \"sources\": [\"original.js\"],\n  \"names\": [],\n  \"mappings\": \";;AAAA,MAAM,IAAI\"\n}\n```\n\nRun compiled.js using node (notice how the stack trace uses original.js instead of compiled.js):\n\n```\n$ node compiled.js\n\noriginal.js:1\nthrow new Error('test'); // This is the original code\n      ^\nError: test\n    at Object.<anonymous> (original.js:1:7)\n    at Module._compile (module.js:456:26)\n    at Object.Module._extensions..js (module.js:474:10)\n    at Module.load (module.js:356:32)\n    at Function.Module._load (module.js:312:12)\n    at Function.Module.runMain (module.js:497:10)\n    at startup (node.js:119:16)\n    at node.js:901:3\n```\n\n#### TypeScript Demo\n\ndemo.ts:\n\n```typescript\ndeclare function require(name: string);\nrequire('source-map-support').install();\nclass Foo {\n  constructor() { this.bar(); }\n  bar() { throw new Error('this is a demo'); }\n}\nnew Foo();\n```\n\nCompile and run the file using the TypeScript compiler from the terminal:\n\n```\n$ npm install source-map-support typescript\n$ node_modules/typescript/bin/tsc -sourcemap demo.ts\n$ node demo.js\n\ndemo.ts:5\n  bar() { throw new Error('this is a demo'); }\n                ^\nError: this is a demo\n    at Foo.bar (demo.ts:5:17)\n    at new Foo (demo.ts:4:24)\n    at Object.<anonymous> (demo.ts:7:1)\n    at Module._compile (module.js:456:26)\n    at Object.Module._extensions..js (module.js:474:10)\n    at Module.load (module.js:356:32)\n    at Function.Module._load (module.js:312:12)\n    at Function.Module.runMain (module.js:497:10)\n    at startup (node.js:119:16)\n    at node.js:901:3\n```\n\nThere is also the option to use `-r source-map-support/register` with typescript, without the need add the `require('source-map-support').install()` in the code base:\n\n```\n$ npm install source-map-support typescript\n$ node_modules/typescript/bin/tsc  -sourcemap demo.ts\n$ node -r source-map-support/register demo.js\n\ndemo.ts:5\n  bar() { throw new Error('this is a demo'); }\n                ^\nError: this is a demo\n    at Foo.bar (demo.ts:5:17)\n    at new Foo (demo.ts:4:24)\n    at Object.<anonymous> (demo.ts:7:1)\n    at Module._compile (module.js:456:26)\n    at Object.Module._extensions..js (module.js:474:10)\n    at Module.load (module.js:356:32)\n    at Function.Module._load (module.js:312:12)\n    at Function.Module.runMain (module.js:497:10)\n    at startup (node.js:119:16)\n    at node.js:901:3\n```\n\n#### CoffeeScript Demo\n\ndemo.coffee:\n\n```coffee\nrequire('source-map-support').install()\nfoo = ->\n  bar = -> throw new Error 'this is a demo'\n  bar()\nfoo()\n```\n\nCompile and run the file using the CoffeeScript compiler from the terminal:\n\n```sh\n$ npm install source-map-support coffeescript\n$ node_modules/.bin/coffee --map --compile demo.coffee\n$ node demo.js\n\ndemo.coffee:3\n  bar = -> throw new Error 'this is a demo'\n                     ^\nError: this is a demo\n    at bar (demo.coffee:3:22)\n    at foo (demo.coffee:4:3)\n    at Object.<anonymous> (demo.coffee:5:1)\n    at Object.<anonymous> (demo.coffee:1:1)\n    at Module._compile (module.js:456:26)\n    at Object.Module._extensions..js (module.js:474:10)\n    at Module.load (module.js:356:32)\n    at Function.Module._load (module.js:312:12)\n    at Function.Module.runMain (module.js:497:10)\n    at startup (node.js:119:16)\n```\n\n## Tests\n\nThis repo contains both automated tests for node and manual tests for the browser. The automated tests can be run using mocha (type `mocha` in the root directory). To run the manual tests:\n\n* Build the tests using `build.js`\n* Launch the HTTP server (`npm run serve-tests`) and visit\n  * http://127.0.0.1:1336/amd-test\n  * http://127.0.0.1:1336/browser-test\n  * http://127.0.0.1:1336/browserify-test - **Currently not working** due to a bug with browserify (see [pull request #66](https://github.com/evanw/node-source-map-support/pull/66) for details).\n* For `header-test`, run `server.js` inside that directory and visit http://127.0.0.1:1337/\n\n## License\n\nThis code is available under the [MIT license](http://opensource.org/licenses/MIT).\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/browser-source-map-support.js",
    "content": "/*\n * Support for source maps in V8 stack traces\n * https://github.com/evanw/node-source-map-support\n */\n/*\n The buffer module from node.js, for the browser.\n\n @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n license  MIT\n*/\n(this.define||function(R,U){this.sourceMapSupport=U()})(\"browser-source-map-support\",function(R){(function e(C,J,A){function p(f,c){if(!J[f]){if(!C[f]){var l=\"function\"==typeof require&&require;if(!c&&l)return l(f,!0);if(t)return t(f,!0);throw Error(\"Cannot find module '\"+f+\"'\");}l=J[f]={exports:{}};C[f][0].call(l.exports,function(q){var r=C[f][1][q];return p(r?r:q)},l,l.exports,e,C,J,A)}return J[f].exports}for(var t=\"function\"==typeof require&&require,m=0;m<A.length;m++)p(A[m]);return p})({1:[function(C,\nJ,A){R=C(\"./source-map-support\")},{\"./source-map-support\":21}],2:[function(C,J,A){(function(e){function p(m){m=m.charCodeAt(0);if(43===m)return 62;if(47===m)return 63;if(48>m)return-1;if(58>m)return m-48+52;if(91>m)return m-65;if(123>m)return m-97+26}var t=\"undefined\"!==typeof Uint8Array?Uint8Array:Array;e.toByteArray=function(m){function f(d){q[k++]=d}if(0<m.length%4)throw Error(\"Invalid string. Length must be a multiple of 4\");var c=m.length;var l=\"=\"===m.charAt(c-2)?2:\"=\"===m.charAt(c-1)?1:0;var q=\nnew t(3*m.length/4-l);var r=0<l?m.length-4:m.length;var k=0;for(c=0;c<r;c+=4){var u=p(m.charAt(c))<<18|p(m.charAt(c+1))<<12|p(m.charAt(c+2))<<6|p(m.charAt(c+3));f((u&16711680)>>16);f((u&65280)>>8);f(u&255)}2===l?(u=p(m.charAt(c))<<2|p(m.charAt(c+1))>>4,f(u&255)):1===l&&(u=p(m.charAt(c))<<10|p(m.charAt(c+1))<<4|p(m.charAt(c+2))>>2,f(u>>8&255),f(u&255));return q};e.fromByteArray=function(m){var f=m.length%3,c=\"\",l;var q=0;for(l=m.length-f;q<l;q+=3){var r=(m[q]<<16)+(m[q+1]<<8)+m[q+2];r=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r>>\n18&63)+\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r>>12&63)+\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r>>6&63)+\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r&63);c+=r}switch(f){case 1:r=m[m.length-1];c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r>>2);c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r<<4&63);c+=\"==\";break;case 2:r=(m[m.length-2]<<8)+\nm[m.length-1],c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r>>10),c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r>>4&63),c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(r<<2&63),c+=\"=\"}return c}})(\"undefined\"===typeof A?this.base64js={}:A)},{}],3:[function(C,J,A){},{}],4:[function(C,J,A){(function(e){var p=Object.prototype.toString,t=\"function\"===typeof e.alloc&&\"function\"===typeof e.allocUnsafe&&\"function\"===\ntypeof e.from;J.exports=function(m,f,c){if(\"number\"===typeof m)throw new TypeError('\"value\" argument must not be a number');if(\"ArrayBuffer\"===p.call(m).slice(8,-1)){f>>>=0;var l=m.byteLength-f;if(0>l)throw new RangeError(\"'offset' is out of bounds\");if(void 0===c)c=l;else if(c>>>=0,c>l)throw new RangeError(\"'length' is out of bounds\");return t?e.from(m.slice(f,f+c)):new e(new Uint8Array(m.slice(f,f+c)))}if(\"string\"===typeof m){c=f;if(\"string\"!==typeof c||\"\"===c)c=\"utf8\";if(!e.isEncoding(c))throw new TypeError('\"encoding\" must be a valid string encoding');\nreturn t?e.from(m,c):new e(m,c)}return t?e.from(m):new e(m)}}).call(this,C(\"buffer\").Buffer)},{buffer:5}],5:[function(C,J,A){function e(a,b,h){if(!(this instanceof e))return new e(a,b,h);var w=typeof a;if(\"number\"===w)var y=0<a?a>>>0:0;else if(\"string\"===w){if(\"base64\"===b)for(a=(a.trim?a.trim():a.replace(/^\\s+|\\s+$/g,\"\")).replace(L,\"\");0!==a.length%4;)a+=\"=\";y=e.byteLength(a,b)}else if(\"object\"===w&&null!==a)\"Buffer\"===a.type&&z(a.data)&&(a=a.data),y=0<+a.length?Math.floor(+a.length):0;else throw new TypeError(\"must start with number, buffer, array or string\");\nif(this.length>G)throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+G.toString(16)+\" bytes\");if(e.TYPED_ARRAY_SUPPORT)var I=e._augment(new Uint8Array(y));else I=this,I.length=y,I._isBuffer=!0;if(e.TYPED_ARRAY_SUPPORT&&\"number\"===typeof a.byteLength)I._set(a);else{var K=a;if(z(K)||e.isBuffer(K)||K&&\"object\"===typeof K&&\"number\"===typeof K.length)if(e.isBuffer(a))for(b=0;b<y;b++)I[b]=a.readUInt8(b);else for(b=0;b<y;b++)I[b]=(a[b]%256+256)%256;else if(\"string\"===w)I.write(a,\n0,b);else if(\"number\"===w&&!e.TYPED_ARRAY_SUPPORT&&!h)for(b=0;b<y;b++)I[b]=0}return I}function p(a,b,h){var w=\"\";for(h=Math.min(a.length,h);b<h;b++)w+=String.fromCharCode(a[b]);return w}function t(a,b,h){if(0!==a%1||0>a)throw new RangeError(\"offset is not uint\");if(a+b>h)throw new RangeError(\"Trying to access beyond buffer length\");}function m(a,b,h,w,y,I){if(!e.isBuffer(a))throw new TypeError(\"buffer must be a Buffer instance\");if(b>y||b<I)throw new TypeError(\"value is out of bounds\");if(h+w>a.length)throw new TypeError(\"index out of range\");\n}function f(a,b,h,w){0>b&&(b=65535+b+1);for(var y=0,I=Math.min(a.length-h,2);y<I;y++)a[h+y]=(b&255<<8*(w?y:1-y))>>>8*(w?y:1-y)}function c(a,b,h,w){0>b&&(b=4294967295+b+1);for(var y=0,I=Math.min(a.length-h,4);y<I;y++)a[h+y]=b>>>8*(w?y:3-y)&255}function l(a,b,h,w,y,I){if(b>y||b<I)throw new TypeError(\"value is out of bounds\");if(h+w>a.length)throw new TypeError(\"index out of range\");}function q(a,b,h,w,y){y||l(a,b,h,4,3.4028234663852886E38,-3.4028234663852886E38);v.write(a,b,h,w,23,4);return h+4}function r(a,\nb,h,w,y){y||l(a,b,h,8,1.7976931348623157E308,-1.7976931348623157E308);v.write(a,b,h,w,52,8);return h+8}function k(a){for(var b=[],h=0;h<a.length;h++){var w=a.charCodeAt(h);if(127>=w)b.push(w);else{var y=h;55296<=w&&57343>=w&&h++;w=encodeURIComponent(a.slice(y,h+1)).substr(1).split(\"%\");for(y=0;y<w.length;y++)b.push(parseInt(w[y],16))}}return b}function u(a){for(var b=[],h=0;h<a.length;h++)b.push(a.charCodeAt(h)&255);return b}function d(a,b,h,w,y){y&&(w-=w%y);for(y=0;y<w&&!(y+h>=b.length||y>=a.length);y++)b[y+\nh]=a[y];return y}function g(a){try{return decodeURIComponent(a)}catch(b){return String.fromCharCode(65533)}}var n=C(\"base64-js\"),v=C(\"ieee754\"),z=C(\"is-array\");A.Buffer=e;A.SlowBuffer=e;A.INSPECT_MAX_BYTES=50;e.poolSize=8192;var G=1073741823;e.TYPED_ARRAY_SUPPORT=function(){try{var a=new ArrayBuffer(0),b=new Uint8Array(a);b.foo=function(){return 42};return 42===b.foo()&&\"function\"===typeof b.subarray&&0===(new Uint8Array(1)).subarray(1,1).byteLength}catch(h){return!1}}();e.isBuffer=function(a){return!(null==\na||!a._isBuffer)};e.compare=function(a,b){if(!e.isBuffer(a)||!e.isBuffer(b))throw new TypeError(\"Arguments must be Buffers\");for(var h=a.length,w=b.length,y=0,I=Math.min(h,w);y<I&&a[y]===b[y];y++);y!==I&&(h=a[y],w=b[y]);return h<w?-1:w<h?1:0};e.isEncoding=function(a){switch(String(a).toLowerCase()){case \"hex\":case \"utf8\":case \"utf-8\":case \"ascii\":case \"binary\":case \"base64\":case \"raw\":case \"ucs2\":case \"ucs-2\":case \"utf16le\":case \"utf-16le\":return!0;default:return!1}};e.concat=function(a,b){if(!z(a))throw new TypeError(\"Usage: Buffer.concat(list[, length])\");\nif(0===a.length)return new e(0);if(1===a.length)return a[0];var h;if(void 0===b)for(h=b=0;h<a.length;h++)b+=a[h].length;var w=new e(b),y=0;for(h=0;h<a.length;h++){var I=a[h];I.copy(w,y);y+=I.length}return w};e.byteLength=function(a,b){a+=\"\";switch(b||\"utf8\"){case \"ascii\":case \"binary\":case \"raw\":var h=a.length;break;case \"ucs2\":case \"ucs-2\":case \"utf16le\":case \"utf-16le\":h=2*a.length;break;case \"hex\":h=a.length>>>1;break;case \"utf8\":case \"utf-8\":h=k(a).length;break;case \"base64\":h=n.toByteArray(a).length;\nbreak;default:h=a.length}return h};e.prototype.length=void 0;e.prototype.parent=void 0;e.prototype.toString=function(a,b,h){var w=!1;b>>>=0;h=void 0===h||Infinity===h?this.length:h>>>0;a||(a=\"utf8\");0>b&&(b=0);h>this.length&&(h=this.length);if(h<=b)return\"\";for(;;)switch(a){case \"hex\":a=b;b=h;h=this.length;if(!a||0>a)a=0;if(!b||0>b||b>h)b=h;w=\"\";for(h=a;h<b;h++)a=w,w=this[h],w=16>w?\"0\"+w.toString(16):w.toString(16),w=a+w;return w;case \"utf8\":case \"utf-8\":w=a=\"\";for(h=Math.min(this.length,h);b<h;b++)127>=\nthis[b]?(a+=g(w)+String.fromCharCode(this[b]),w=\"\"):w+=\"%\"+this[b].toString(16);return a+g(w);case \"ascii\":return p(this,b,h);case \"binary\":return p(this,b,h);case \"base64\":return b=0===b&&h===this.length?n.fromByteArray(this):n.fromByteArray(this.slice(b,h)),b;case \"ucs2\":case \"ucs-2\":case \"utf16le\":case \"utf-16le\":b=this.slice(b,h);h=\"\";for(a=0;a<b.length;a+=2)h+=String.fromCharCode(b[a]+256*b[a+1]);return h;default:if(w)throw new TypeError(\"Unknown encoding: \"+a);a=(a+\"\").toLowerCase();w=!0}};\ne.prototype.equals=function(a){if(!e.isBuffer(a))throw new TypeError(\"Argument must be a Buffer\");return 0===e.compare(this,a)};e.prototype.inspect=function(){var a=\"\",b=A.INSPECT_MAX_BYTES;0<this.length&&(a=this.toString(\"hex\",0,b).match(/.{2}/g).join(\" \"),this.length>b&&(a+=\" ... \"));return\"<Buffer \"+a+\">\"};e.prototype.compare=function(a){if(!e.isBuffer(a))throw new TypeError(\"Argument must be a Buffer\");return e.compare(this,a)};e.prototype.get=function(a){console.log(\".get() is deprecated. Access using array indexes instead.\");\nreturn this.readUInt8(a)};e.prototype.set=function(a,b){console.log(\".set() is deprecated. Access using array indexes instead.\");return this.writeUInt8(a,b)};e.prototype.write=function(a,b,h,w){if(isFinite(b))isFinite(h)||(w=h,h=void 0);else{var y=w;w=b;b=h;h=y}b=Number(b)||0;y=this.length-b;h?(h=Number(h),h>y&&(h=y)):h=y;w=String(w||\"utf8\").toLowerCase();switch(w){case \"hex\":b=Number(b)||0;w=this.length-b;h?(h=Number(h),h>w&&(h=w)):h=w;w=a.length;if(0!==w%2)throw Error(\"Invalid hex string\");h>w/\n2&&(h=w/2);for(w=0;w<h;w++){y=parseInt(a.substr(2*w,2),16);if(isNaN(y))throw Error(\"Invalid hex string\");this[b+w]=y}a=w;break;case \"utf8\":case \"utf-8\":a=d(k(a),this,b,h);break;case \"ascii\":a=d(u(a),this,b,h);break;case \"binary\":a=d(u(a),this,b,h);break;case \"base64\":a=d(n.toByteArray(a),this,b,h);break;case \"ucs2\":case \"ucs-2\":case \"utf16le\":case \"utf-16le\":y=[];for(var I=0;I<a.length;I++){var K=a.charCodeAt(I);w=K>>8;K%=256;y.push(K);y.push(w)}a=d(y,this,b,h,2);break;default:throw new TypeError(\"Unknown encoding: \"+\nw);}return a};e.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};e.prototype.slice=function(a,b){var h=this.length;a=~~a;b=void 0===b?h:~~b;0>a?(a+=h,0>a&&(a=0)):a>h&&(a=h);0>b?(b+=h,0>b&&(b=0)):b>h&&(b=h);b<a&&(b=a);if(e.TYPED_ARRAY_SUPPORT)return e._augment(this.subarray(a,b));h=b-a;for(var w=new e(h,void 0,!0),y=0;y<h;y++)w[y]=this[y+a];return w};e.prototype.readUInt8=function(a,b){b||t(a,1,this.length);return this[a]};e.prototype.readUInt16LE=\nfunction(a,b){b||t(a,2,this.length);return this[a]|this[a+1]<<8};e.prototype.readUInt16BE=function(a,b){b||t(a,2,this.length);return this[a]<<8|this[a+1]};e.prototype.readUInt32LE=function(a,b){b||t(a,4,this.length);return(this[a]|this[a+1]<<8|this[a+2]<<16)+16777216*this[a+3]};e.prototype.readUInt32BE=function(a,b){b||t(a,4,this.length);return 16777216*this[a]+(this[a+1]<<16|this[a+2]<<8|this[a+3])};e.prototype.readInt8=function(a,b){b||t(a,1,this.length);return this[a]&128?-1*(255-this[a]+1):this[a]};\ne.prototype.readInt16LE=function(a,b){b||t(a,2,this.length);var h=this[a]|this[a+1]<<8;return h&32768?h|4294901760:h};e.prototype.readInt16BE=function(a,b){b||t(a,2,this.length);var h=this[a+1]|this[a]<<8;return h&32768?h|4294901760:h};e.prototype.readInt32LE=function(a,b){b||t(a,4,this.length);return this[a]|this[a+1]<<8|this[a+2]<<16|this[a+3]<<24};e.prototype.readInt32BE=function(a,b){b||t(a,4,this.length);return this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]};e.prototype.readFloatLE=function(a,\nb){b||t(a,4,this.length);return v.read(this,a,!0,23,4)};e.prototype.readFloatBE=function(a,b){b||t(a,4,this.length);return v.read(this,a,!1,23,4)};e.prototype.readDoubleLE=function(a,b){b||t(a,8,this.length);return v.read(this,a,!0,52,8)};e.prototype.readDoubleBE=function(a,b){b||t(a,8,this.length);return v.read(this,a,!1,52,8)};e.prototype.writeUInt8=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,1,255,0);e.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));this[b]=a;return b+1};e.prototype.writeUInt16LE=function(a,\nb,h){a=+a;b>>>=0;h||m(this,a,b,2,65535,0);e.TYPED_ARRAY_SUPPORT?(this[b]=a,this[b+1]=a>>>8):f(this,a,b,!0);return b+2};e.prototype.writeUInt16BE=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,2,65535,0);e.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=a):f(this,a,b,!1);return b+2};e.prototype.writeUInt32LE=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,4,4294967295,0);e.TYPED_ARRAY_SUPPORT?(this[b+3]=a>>>24,this[b+2]=a>>>16,this[b+1]=a>>>8,this[b]=a):c(this,a,b,!0);return b+4};e.prototype.writeUInt32BE=function(a,\nb,h){a=+a;b>>>=0;h||m(this,a,b,4,4294967295,0);e.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=a):c(this,a,b,!1);return b+4};e.prototype.writeInt8=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,1,127,-128);e.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));0>a&&(a=255+a+1);this[b]=a;return b+1};e.prototype.writeInt16LE=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,2,32767,-32768);e.TYPED_ARRAY_SUPPORT?(this[b]=a,this[b+1]=a>>>8):f(this,a,b,!0);return b+2};e.prototype.writeInt16BE=function(a,\nb,h){a=+a;b>>>=0;h||m(this,a,b,2,32767,-32768);e.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=a):f(this,a,b,!1);return b+2};e.prototype.writeInt32LE=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,4,2147483647,-2147483648);e.TYPED_ARRAY_SUPPORT?(this[b]=a,this[b+1]=a>>>8,this[b+2]=a>>>16,this[b+3]=a>>>24):c(this,a,b,!0);return b+4};e.prototype.writeInt32BE=function(a,b,h){a=+a;b>>>=0;h||m(this,a,b,4,2147483647,-2147483648);0>a&&(a=4294967295+a+1);e.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+\n2]=a>>>8,this[b+3]=a):c(this,a,b,!1);return b+4};e.prototype.writeFloatLE=function(a,b,h){return q(this,a,b,!0,h)};e.prototype.writeFloatBE=function(a,b,h){return q(this,a,b,!1,h)};e.prototype.writeDoubleLE=function(a,b,h){return r(this,a,b,!0,h)};e.prototype.writeDoubleBE=function(a,b,h){return r(this,a,b,!1,h)};e.prototype.copy=function(a,b,h,w){h||(h=0);w||0===w||(w=this.length);b||(b=0);if(w!==h&&0!==a.length&&0!==this.length){if(w<h)throw new TypeError(\"sourceEnd < sourceStart\");if(0>b||b>=a.length)throw new TypeError(\"targetStart out of bounds\");\nif(0>h||h>=this.length)throw new TypeError(\"sourceStart out of bounds\");if(0>w||w>this.length)throw new TypeError(\"sourceEnd out of bounds\");w>this.length&&(w=this.length);a.length-b<w-h&&(w=a.length-b+h);w-=h;if(1E3>w||!e.TYPED_ARRAY_SUPPORT)for(var y=0;y<w;y++)a[y+b]=this[y+h];else a._set(this.subarray(h,h+w),b)}};e.prototype.fill=function(a,b,h){a||(a=0);b||(b=0);h||(h=this.length);if(h<b)throw new TypeError(\"end < start\");if(h!==b&&0!==this.length){if(0>b||b>=this.length)throw new TypeError(\"start out of bounds\");\nif(0>h||h>this.length)throw new TypeError(\"end out of bounds\");if(\"number\"===typeof a)for(;b<h;b++)this[b]=a;else{a=k(a.toString());for(var w=a.length;b<h;b++)this[b]=a[b%w]}return this}};e.prototype.toArrayBuffer=function(){if(\"undefined\"!==typeof Uint8Array){if(e.TYPED_ARRAY_SUPPORT)return(new e(this)).buffer;for(var a=new Uint8Array(this.length),b=0,h=a.length;b<h;b+=1)a[b]=this[b];return a.buffer}throw new TypeError(\"Buffer.toArrayBuffer not supported in this browser\");};var D=e.prototype;e._augment=\nfunction(a){a.constructor=e;a._isBuffer=!0;a._get=a.get;a._set=a.set;a.get=D.get;a.set=D.set;a.write=D.write;a.toString=D.toString;a.toLocaleString=D.toString;a.toJSON=D.toJSON;a.equals=D.equals;a.compare=D.compare;a.copy=D.copy;a.slice=D.slice;a.readUInt8=D.readUInt8;a.readUInt16LE=D.readUInt16LE;a.readUInt16BE=D.readUInt16BE;a.readUInt32LE=D.readUInt32LE;a.readUInt32BE=D.readUInt32BE;a.readInt8=D.readInt8;a.readInt16LE=D.readInt16LE;a.readInt16BE=D.readInt16BE;a.readInt32LE=D.readInt32LE;a.readInt32BE=\nD.readInt32BE;a.readFloatLE=D.readFloatLE;a.readFloatBE=D.readFloatBE;a.readDoubleLE=D.readDoubleLE;a.readDoubleBE=D.readDoubleBE;a.writeUInt8=D.writeUInt8;a.writeUInt16LE=D.writeUInt16LE;a.writeUInt16BE=D.writeUInt16BE;a.writeUInt32LE=D.writeUInt32LE;a.writeUInt32BE=D.writeUInt32BE;a.writeInt8=D.writeInt8;a.writeInt16LE=D.writeInt16LE;a.writeInt16BE=D.writeInt16BE;a.writeInt32LE=D.writeInt32LE;a.writeInt32BE=D.writeInt32BE;a.writeFloatLE=D.writeFloatLE;a.writeFloatBE=D.writeFloatBE;a.writeDoubleLE=\nD.writeDoubleLE;a.writeDoubleBE=D.writeDoubleBE;a.fill=D.fill;a.inspect=D.inspect;a.toArrayBuffer=D.toArrayBuffer;return a};var L=/[^+\\/0-9A-z]/g},{\"base64-js\":2,ieee754:6,\"is-array\":7}],6:[function(C,J,A){A.read=function(e,p,t,m,f){var c=8*f-m-1;var l=(1<<c)-1,q=l>>1,r=-7;f=t?f-1:0;var k=t?-1:1,u=e[p+f];f+=k;t=u&(1<<-r)-1;u>>=-r;for(r+=c;0<r;t=256*t+e[p+f],f+=k,r-=8);c=t&(1<<-r)-1;t>>=-r;for(r+=m;0<r;c=256*c+e[p+f],f+=k,r-=8);if(0===t)t=1-q;else{if(t===l)return c?NaN:Infinity*(u?-1:1);c+=Math.pow(2,\nm);t-=q}return(u?-1:1)*c*Math.pow(2,t-m)};A.write=function(e,p,t,m,f,c){var l,q=8*c-f-1,r=(1<<q)-1,k=r>>1,u=23===f?Math.pow(2,-24)-Math.pow(2,-77):0;c=m?0:c-1;var d=m?1:-1,g=0>p||0===p&&0>1/p?1:0;p=Math.abs(p);isNaN(p)||Infinity===p?(p=isNaN(p)?1:0,m=r):(m=Math.floor(Math.log(p)/Math.LN2),1>p*(l=Math.pow(2,-m))&&(m--,l*=2),p=1<=m+k?p+u/l:p+u*Math.pow(2,1-k),2<=p*l&&(m++,l/=2),m+k>=r?(p=0,m=r):1<=m+k?(p=(p*l-1)*Math.pow(2,f),m+=k):(p=p*Math.pow(2,k-1)*Math.pow(2,f),m=0));for(;8<=f;e[t+c]=p&255,c+=\nd,p/=256,f-=8);m=m<<f|p;for(q+=f;0<q;e[t+c]=m&255,c+=d,m/=256,q-=8);e[t+c-d]|=128*g}},{}],7:[function(C,J,A){var e=Object.prototype.toString;J.exports=Array.isArray||function(p){return!!p&&\"[object Array]\"==e.call(p)}},{}],8:[function(C,J,A){(function(e){function p(c,l){for(var q=0,r=c.length-1;0<=r;r--){var k=c[r];\".\"===k?c.splice(r,1):\"..\"===k?(c.splice(r,1),q++):q&&(c.splice(r,1),q--)}if(l)for(;q--;q)c.unshift(\"..\");return c}function t(c,l){if(c.filter)return c.filter(l);for(var q=[],r=0;r<c.length;r++)l(c[r],\nr,c)&&q.push(c[r]);return q}var m=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;A.resolve=function(){for(var c=\"\",l=!1,q=arguments.length-1;-1<=q&&!l;q--){var r=0<=q?arguments[q]:e.cwd();if(\"string\"!==typeof r)throw new TypeError(\"Arguments to path.resolve must be strings\");r&&(c=r+\"/\"+c,l=\"/\"===r.charAt(0))}c=p(t(c.split(\"/\"),function(k){return!!k}),!l).join(\"/\");return(l?\"/\":\"\")+c||\".\"};A.normalize=function(c){var l=A.isAbsolute(c),q=\"/\"===f(c,-1);(c=p(t(c.split(\"/\"),function(r){return!!r}),\n!l).join(\"/\"))||l||(c=\".\");c&&q&&(c+=\"/\");return(l?\"/\":\"\")+c};A.isAbsolute=function(c){return\"/\"===c.charAt(0)};A.join=function(){var c=Array.prototype.slice.call(arguments,0);return A.normalize(t(c,function(l,q){if(\"string\"!==typeof l)throw new TypeError(\"Arguments to path.join must be strings\");return l}).join(\"/\"))};A.relative=function(c,l){function q(n){for(var v=0;v<n.length&&\"\"===n[v];v++);for(var z=n.length-1;0<=z&&\"\"===n[z];z--);return v>z?[]:n.slice(v,z-v+1)}c=A.resolve(c).substr(1);l=A.resolve(l).substr(1);\nfor(var r=q(c.split(\"/\")),k=q(l.split(\"/\")),u=Math.min(r.length,k.length),d=u,g=0;g<u;g++)if(r[g]!==k[g]){d=g;break}u=[];for(g=d;g<r.length;g++)u.push(\"..\");u=u.concat(k.slice(d));return u.join(\"/\")};A.sep=\"/\";A.delimiter=\":\";A.dirname=function(c){var l=m.exec(c).slice(1);c=l[0];l=l[1];if(!c&&!l)return\".\";l&&(l=l.substr(0,l.length-1));return c+l};A.basename=function(c,l){var q=m.exec(c).slice(1)[2];l&&q.substr(-1*l.length)===l&&(q=q.substr(0,q.length-l.length));return q};A.extname=function(c){return m.exec(c).slice(1)[3]};\nvar f=\"b\"===\"ab\".substr(-1)?function(c,l,q){return c.substr(l,q)}:function(c,l,q){0>l&&(l=c.length+l);return c.substr(l,q)}}).call(this,C(\"g5I+bs\"))},{\"g5I+bs\":9}],9:[function(C,J,A){function e(){}C=J.exports={};C.nextTick=function(){if(\"undefined\"!==typeof window&&window.setImmediate)return function(t){return window.setImmediate(t)};if(\"undefined\"!==typeof window&&window.postMessage&&window.addEventListener){var p=[];window.addEventListener(\"message\",function(t){var m=t.source;m!==window&&null!==\nm||\"process-tick\"!==t.data||(t.stopPropagation(),0<p.length&&p.shift()())},!0);return function(t){p.push(t);window.postMessage(\"process-tick\",\"*\")}}return function(t){setTimeout(t,0)}}();C.title=\"browser\";C.browser=!0;C.env={};C.argv=[];C.on=e;C.addListener=e;C.once=e;C.off=e;C.removeListener=e;C.removeAllListeners=e;C.emit=e;C.binding=function(p){throw Error(\"process.binding is not supported\");};C.cwd=function(){return\"/\"};C.chdir=function(p){throw Error(\"process.chdir is not supported\");}},{}],\n10:[function(C,J,A){function e(){this._array=[];this._set=m?new Map:Object.create(null)}var p=C(\"./util\"),t=Object.prototype.hasOwnProperty,m=\"undefined\"!==typeof Map;e.fromArray=function(f,c){for(var l=new e,q=0,r=f.length;q<r;q++)l.add(f[q],c);return l};e.prototype.size=function(){return m?this._set.size:Object.getOwnPropertyNames(this._set).length};e.prototype.add=function(f,c){var l=m?f:p.toSetString(f),q=m?this.has(f):t.call(this._set,l),r=this._array.length;q&&!c||this._array.push(f);q||(m?\nthis._set.set(f,r):this._set[l]=r)};e.prototype.has=function(f){if(m)return this._set.has(f);f=p.toSetString(f);return t.call(this._set,f)};e.prototype.indexOf=function(f){if(m){var c=this._set.get(f);if(0<=c)return c}else if(c=p.toSetString(f),t.call(this._set,c))return this._set[c];throw Error('\"'+f+'\" is not in the set.');};e.prototype.at=function(f){if(0<=f&&f<this._array.length)return this._array[f];throw Error(\"No element indexed by \"+f);};e.prototype.toArray=function(){return this._array.slice()};\nA.ArraySet=e},{\"./util\":19}],11:[function(C,J,A){var e=C(\"./base64\");A.encode=function(p){var t=\"\",m=0>p?(-p<<1)+1:p<<1;do p=m&31,m>>>=5,0<m&&(p|=32),t+=e.encode(p);while(0<m);return t};A.decode=function(p,t,m){var f=p.length,c=0,l=0;do{if(t>=f)throw Error(\"Expected more digits in base 64 VLQ value.\");var q=e.decode(p.charCodeAt(t++));if(-1===q)throw Error(\"Invalid base64 digit: \"+p.charAt(t-1));var r=!!(q&32);q&=31;c+=q<<l;l+=5}while(r);p=c>>1;m.value=1===(c&1)?-p:p;m.rest=t}},{\"./base64\":12}],12:[function(C,\nJ,A){var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");A.encode=function(p){if(0<=p&&p<e.length)return e[p];throw new TypeError(\"Must be between 0 and 63: \"+p);};A.decode=function(p){return 65<=p&&90>=p?p-65:97<=p&&122>=p?p-97+26:48<=p&&57>=p?p-48+52:43==p?62:47==p?63:-1}},{}],13:[function(C,J,A){function e(p,t,m,f,c,l){var q=Math.floor((t-p)/2)+p,r=c(m,f[q],!0);return 0===r?q:0<r?1<t-q?e(q,t,m,f,c,l):l==A.LEAST_UPPER_BOUND?t<f.length?t:-1:q:1<q-p?e(p,q,m,f,c,l):l==\nA.LEAST_UPPER_BOUND?q:0>p?-1:p}A.GREATEST_LOWER_BOUND=1;A.LEAST_UPPER_BOUND=2;A.search=function(p,t,m,f){if(0===t.length)return-1;p=e(-1,t.length,p,t,m,f||A.GREATEST_LOWER_BOUND);if(0>p)return-1;for(;0<=p-1&&0===m(t[p],t[p-1],!0);)--p;return p}},{}],14:[function(C,J,A){function e(){this._array=[];this._sorted=!0;this._last={generatedLine:-1,generatedColumn:0}}var p=C(\"./util\");e.prototype.unsortedForEach=function(t,m){this._array.forEach(t,m)};e.prototype.add=function(t){var m=this._last,f=m.generatedLine,\nc=t.generatedLine,l=m.generatedColumn,q=t.generatedColumn;c>f||c==f&&q>=l||0>=p.compareByGeneratedPositionsInflated(m,t)?this._last=t:this._sorted=!1;this._array.push(t)};e.prototype.toArray=function(){this._sorted||(this._array.sort(p.compareByGeneratedPositionsInflated),this._sorted=!0);return this._array};A.MappingList=e},{\"./util\":19}],15:[function(C,J,A){function e(t,m,f){var c=t[m];t[m]=t[f];t[f]=c}function p(t,m,f,c){if(f<c){var l=f-1;e(t,Math.round(f+Math.random()*(c-f)),c);for(var q=t[c],\nr=f;r<c;r++)0>=m(t[r],q)&&(l+=1,e(t,l,r));e(t,l+1,r);l+=1;p(t,m,f,l-1);p(t,m,l+1,c)}}A.quickSort=function(t,m){p(t,m,0,t.length-1)}},{}],16:[function(C,J,A){function e(k,u){var d=k;\"string\"===typeof k&&(d=f.parseSourceMapInput(k));return null!=d.sections?new m(d,u):new p(d,u)}function p(k,u){var d=k;\"string\"===typeof k&&(d=f.parseSourceMapInput(k));var g=f.getArg(d,\"version\"),n=f.getArg(d,\"sources\"),v=f.getArg(d,\"names\",[]),z=f.getArg(d,\"sourceRoot\",null),G=f.getArg(d,\"sourcesContent\",null),D=f.getArg(d,\n\"mappings\");d=f.getArg(d,\"file\",null);if(g!=this._version)throw Error(\"Unsupported version: \"+g);z&&(z=f.normalize(z));n=n.map(String).map(f.normalize).map(function(L){return z&&f.isAbsolute(z)&&f.isAbsolute(L)?f.relative(z,L):L});this._names=l.fromArray(v.map(String),!0);this._sources=l.fromArray(n,!0);this.sourceRoot=z;this.sourcesContent=G;this._mappings=D;this._sourceMapURL=u;this.file=d}function t(){this.generatedColumn=this.generatedLine=0;this.name=this.originalColumn=this.originalLine=this.source=\nnull}function m(k,u){var d=k;\"string\"===typeof k&&(d=f.parseSourceMapInput(k));var g=f.getArg(d,\"version\");d=f.getArg(d,\"sections\");if(g!=this._version)throw Error(\"Unsupported version: \"+g);this._sources=new l;this._names=new l;var n={line:-1,column:0};this._sections=d.map(function(v){if(v.url)throw Error(\"Support for url field in sections not implemented.\");var z=f.getArg(v,\"offset\"),G=f.getArg(z,\"line\"),D=f.getArg(z,\"column\");if(G<n.line||G===n.line&&D<n.column)throw Error(\"Section offsets must be ordered and non-overlapping.\");\nn=z;return{generatedOffset:{generatedLine:G+1,generatedColumn:D+1},consumer:new e(f.getArg(v,\"map\"),u)}})}var f=C(\"./util\"),c=C(\"./binary-search\"),l=C(\"./array-set\").ArraySet,q=C(\"./base64-vlq\"),r=C(\"./quick-sort\").quickSort;e.fromSourceMap=function(k){return p.fromSourceMap(k)};e.prototype._version=3;e.prototype.__generatedMappings=null;Object.defineProperty(e.prototype,\"_generatedMappings\",{configurable:!0,enumerable:!0,get:function(){this.__generatedMappings||this._parseMappings(this._mappings,\nthis.sourceRoot);return this.__generatedMappings}});e.prototype.__originalMappings=null;Object.defineProperty(e.prototype,\"_originalMappings\",{configurable:!0,enumerable:!0,get:function(){this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot);return this.__originalMappings}});e.prototype._charIsMappingSeparator=function(k,u){var d=k.charAt(u);return\";\"===d||\",\"===d};e.prototype._parseMappings=function(k,u){throw Error(\"Subclasses must implement _parseMappings\");};e.GENERATED_ORDER=\n1;e.ORIGINAL_ORDER=2;e.GREATEST_LOWER_BOUND=1;e.LEAST_UPPER_BOUND=2;e.prototype.eachMapping=function(k,u,d){u=u||null;switch(d||e.GENERATED_ORDER){case e.GENERATED_ORDER:d=this._generatedMappings;break;case e.ORIGINAL_ORDER:d=this._originalMappings;break;default:throw Error(\"Unknown order of iteration.\");}var g=this.sourceRoot;d.map(function(n){var v=null===n.source?null:this._sources.at(n.source);v=f.computeSourceURL(g,v,this._sourceMapURL);return{source:v,generatedLine:n.generatedLine,generatedColumn:n.generatedColumn,\noriginalLine:n.originalLine,originalColumn:n.originalColumn,name:null===n.name?null:this._names.at(n.name)}},this).forEach(k,u)};e.prototype.allGeneratedPositionsFor=function(k){var u=f.getArg(k,\"line\"),d={source:f.getArg(k,\"source\"),originalLine:u,originalColumn:f.getArg(k,\"column\",0)};null!=this.sourceRoot&&(d.source=f.relative(this.sourceRoot,d.source));if(!this._sources.has(d.source))return[];d.source=this._sources.indexOf(d.source);var g=[];d=this._findMapping(d,this._originalMappings,\"originalLine\",\n\"originalColumn\",f.compareByOriginalPositions,c.LEAST_UPPER_BOUND);if(0<=d){var n=this._originalMappings[d];if(void 0===k.column)for(u=n.originalLine;n&&n.originalLine===u;)g.push({line:f.getArg(n,\"generatedLine\",null),column:f.getArg(n,\"generatedColumn\",null),lastColumn:f.getArg(n,\"lastGeneratedColumn\",null)}),n=this._originalMappings[++d];else for(k=n.originalColumn;n&&n.originalLine===u&&n.originalColumn==k;)g.push({line:f.getArg(n,\"generatedLine\",null),column:f.getArg(n,\"generatedColumn\",null),\nlastColumn:f.getArg(n,\"lastGeneratedColumn\",null)}),n=this._originalMappings[++d]}return g};A.SourceMapConsumer=e;p.prototype=Object.create(e.prototype);p.prototype.consumer=e;p.fromSourceMap=function(k,u){var d=Object.create(p.prototype),g=d._names=l.fromArray(k._names.toArray(),!0),n=d._sources=l.fromArray(k._sources.toArray(),!0);d.sourceRoot=k._sourceRoot;d.sourcesContent=k._generateSourcesContent(d._sources.toArray(),d.sourceRoot);d.file=k._file;d._sourceMapURL=u;for(var v=k._mappings.toArray().slice(),\nz=d.__generatedMappings=[],G=d.__originalMappings=[],D=0,L=v.length;D<L;D++){var a=v[D],b=new t;b.generatedLine=a.generatedLine;b.generatedColumn=a.generatedColumn;a.source&&(b.source=n.indexOf(a.source),b.originalLine=a.originalLine,b.originalColumn=a.originalColumn,a.name&&(b.name=g.indexOf(a.name)),G.push(b));z.push(b)}r(d.__originalMappings,f.compareByOriginalPositions);return d};p.prototype._version=3;Object.defineProperty(p.prototype,\"sources\",{get:function(){return this._sources.toArray().map(function(k){return f.computeSourceURL(this.sourceRoot,\nk,this._sourceMapURL)},this)}});p.prototype._parseMappings=function(k,u){for(var d=1,g=0,n=0,v=0,z=0,G=0,D=k.length,L=0,a={},b={},h=[],w=[],y,I,K,N,P;L<D;)if(\";\"===k.charAt(L))d++,L++,g=0;else if(\",\"===k.charAt(L))L++;else{y=new t;y.generatedLine=d;for(N=L;N<D&&!this._charIsMappingSeparator(k,N);N++);I=k.slice(L,N);if(K=a[I])L+=I.length;else{for(K=[];L<N;)q.decode(k,L,b),P=b.value,L=b.rest,K.push(P);if(2===K.length)throw Error(\"Found a source, but no line and column\");if(3===K.length)throw Error(\"Found a source and line, but no column\");\na[I]=K}y.generatedColumn=g+K[0];g=y.generatedColumn;1<K.length&&(y.source=z+K[1],z+=K[1],y.originalLine=n+K[2],n=y.originalLine,y.originalLine+=1,y.originalColumn=v+K[3],v=y.originalColumn,4<K.length&&(y.name=G+K[4],G+=K[4]));w.push(y);\"number\"===typeof y.originalLine&&h.push(y)}r(w,f.compareByGeneratedPositionsDeflated);this.__generatedMappings=w;r(h,f.compareByOriginalPositions);this.__originalMappings=h};p.prototype._findMapping=function(k,u,d,g,n,v){if(0>=k[d])throw new TypeError(\"Line must be greater than or equal to 1, got \"+\nk[d]);if(0>k[g])throw new TypeError(\"Column must be greater than or equal to 0, got \"+k[g]);return c.search(k,u,n,v)};p.prototype.computeColumnSpans=function(){for(var k=0;k<this._generatedMappings.length;++k){var u=this._generatedMappings[k];if(k+1<this._generatedMappings.length){var d=this._generatedMappings[k+1];if(u.generatedLine===d.generatedLine){u.lastGeneratedColumn=d.generatedColumn-1;continue}}u.lastGeneratedColumn=Infinity}};p.prototype.originalPositionFor=function(k){var u={generatedLine:f.getArg(k,\n\"line\"),generatedColumn:f.getArg(k,\"column\")};k=this._findMapping(u,this._generatedMappings,\"generatedLine\",\"generatedColumn\",f.compareByGeneratedPositionsDeflated,f.getArg(k,\"bias\",e.GREATEST_LOWER_BOUND));if(0<=k&&(k=this._generatedMappings[k],k.generatedLine===u.generatedLine)){u=f.getArg(k,\"source\",null);null!==u&&(u=this._sources.at(u),u=f.computeSourceURL(this.sourceRoot,u,this._sourceMapURL));var d=f.getArg(k,\"name\",null);null!==d&&(d=this._names.at(d));return{source:u,line:f.getArg(k,\"originalLine\",\nnull),column:f.getArg(k,\"originalColumn\",null),name:d}}return{source:null,line:null,column:null,name:null}};p.prototype.hasContentsOfAllSources=function(){return this.sourcesContent?this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(k){return null==k}):!1};p.prototype.sourceContentFor=function(k,u){if(!this.sourcesContent)return null;var d=k;null!=this.sourceRoot&&(d=f.relative(this.sourceRoot,d));if(this._sources.has(d))return this.sourcesContent[this._sources.indexOf(d)];\nvar g=this.sources,n;for(n=0;n<g.length;++n)if(g[n]==k)return this.sourcesContent[n];var v;if(null!=this.sourceRoot&&(v=f.urlParse(this.sourceRoot))){g=d.replace(/^file:\\/\\//,\"\");if(\"file\"==v.scheme&&this._sources.has(g))return this.sourcesContent[this._sources.indexOf(g)];if((!v.path||\"/\"==v.path)&&this._sources.has(\"/\"+d))return this.sourcesContent[this._sources.indexOf(\"/\"+d)]}if(u)return null;throw Error('\"'+d+'\" is not in the SourceMap.');};p.prototype.generatedPositionFor=function(k){var u=\nf.getArg(k,\"source\");null!=this.sourceRoot&&(u=f.relative(this.sourceRoot,u));if(!this._sources.has(u))return{line:null,column:null,lastColumn:null};u=this._sources.indexOf(u);u={source:u,originalLine:f.getArg(k,\"line\"),originalColumn:f.getArg(k,\"column\")};k=this._findMapping(u,this._originalMappings,\"originalLine\",\"originalColumn\",f.compareByOriginalPositions,f.getArg(k,\"bias\",e.GREATEST_LOWER_BOUND));return 0<=k&&(k=this._originalMappings[k],k.source===u.source)?{line:f.getArg(k,\"generatedLine\",\nnull),column:f.getArg(k,\"generatedColumn\",null),lastColumn:f.getArg(k,\"lastGeneratedColumn\",null)}:{line:null,column:null,lastColumn:null}};A.BasicSourceMapConsumer=p;m.prototype=Object.create(e.prototype);m.prototype.constructor=e;m.prototype._version=3;Object.defineProperty(m.prototype,\"sources\",{get:function(){for(var k=[],u=0;u<this._sections.length;u++)for(var d=0;d<this._sections[u].consumer.sources.length;d++)k.push(this._sections[u].consumer.sources[d]);return k}});m.prototype.originalPositionFor=\nfunction(k){var u={generatedLine:f.getArg(k,\"line\"),generatedColumn:f.getArg(k,\"column\")},d=c.search(u,this._sections,function(g,n){var v=g.generatedLine-n.generatedOffset.generatedLine;return v?v:g.generatedColumn-n.generatedOffset.generatedColumn});return(d=this._sections[d])?d.consumer.originalPositionFor({line:u.generatedLine-(d.generatedOffset.generatedLine-1),column:u.generatedColumn-(d.generatedOffset.generatedLine===u.generatedLine?d.generatedOffset.generatedColumn-1:0),bias:k.bias}):{source:null,\nline:null,column:null,name:null}};m.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(k){return k.consumer.hasContentsOfAllSources()})};m.prototype.sourceContentFor=function(k,u){for(var d=0;d<this._sections.length;d++){var g=this._sections[d].consumer.sourceContentFor(k,!0);if(g)return g}if(u)return null;throw Error('\"'+k+'\" is not in the SourceMap.');};m.prototype.generatedPositionFor=function(k){for(var u=0;u<this._sections.length;u++){var d=this._sections[u];if(-1!==\nd.consumer.sources.indexOf(f.getArg(k,\"source\"))){var g=d.consumer.generatedPositionFor(k);if(g)return{line:g.line+(d.generatedOffset.generatedLine-1),column:g.column+(d.generatedOffset.generatedLine===g.line?d.generatedOffset.generatedColumn-1:0)}}}return{line:null,column:null}};m.prototype._parseMappings=function(k,u){this.__generatedMappings=[];this.__originalMappings=[];for(var d=0;d<this._sections.length;d++)for(var g=this._sections[d],n=g.consumer._generatedMappings,v=0;v<n.length;v++){var z=\nn[v],G=g.consumer._sources.at(z.source);G=f.computeSourceURL(g.consumer.sourceRoot,G,this._sourceMapURL);this._sources.add(G);G=this._sources.indexOf(G);var D=null;z.name&&(D=g.consumer._names.at(z.name),this._names.add(D),D=this._names.indexOf(D));z={source:G,generatedLine:z.generatedLine+(g.generatedOffset.generatedLine-1),generatedColumn:z.generatedColumn+(g.generatedOffset.generatedLine===z.generatedLine?g.generatedOffset.generatedColumn-1:0),originalLine:z.originalLine,originalColumn:z.originalColumn,\nname:D};this.__generatedMappings.push(z);\"number\"===typeof z.originalLine&&this.__originalMappings.push(z)}r(this.__generatedMappings,f.compareByGeneratedPositionsDeflated);r(this.__originalMappings,f.compareByOriginalPositions)};A.IndexedSourceMapConsumer=m},{\"./array-set\":10,\"./base64-vlq\":11,\"./binary-search\":13,\"./quick-sort\":15,\"./util\":19}],17:[function(C,J,A){function e(c){c||(c={});this._file=t.getArg(c,\"file\",null);this._sourceRoot=t.getArg(c,\"sourceRoot\",null);this._skipValidation=t.getArg(c,\n\"skipValidation\",!1);this._sources=new m;this._names=new m;this._mappings=new f;this._sourcesContents=null}var p=C(\"./base64-vlq\"),t=C(\"./util\"),m=C(\"./array-set\").ArraySet,f=C(\"./mapping-list\").MappingList;e.prototype._version=3;e.fromSourceMap=function(c){var l=c.sourceRoot,q=new e({file:c.file,sourceRoot:l});c.eachMapping(function(r){var k={generated:{line:r.generatedLine,column:r.generatedColumn}};null!=r.source&&(k.source=r.source,null!=l&&(k.source=t.relative(l,k.source)),k.original={line:r.originalLine,\ncolumn:r.originalColumn},null!=r.name&&(k.name=r.name));q.addMapping(k)});c.sources.forEach(function(r){var k=r;null!==l&&(k=t.relative(l,r));q._sources.has(k)||q._sources.add(k);k=c.sourceContentFor(r);null!=k&&q.setSourceContent(r,k)});return q};e.prototype.addMapping=function(c){var l=t.getArg(c,\"generated\"),q=t.getArg(c,\"original\",null),r=t.getArg(c,\"source\",null);c=t.getArg(c,\"name\",null);this._skipValidation||this._validateMapping(l,q,r,c);null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r));\nnull!=c&&(c=String(c),this._names.has(c)||this._names.add(c));this._mappings.add({generatedLine:l.line,generatedColumn:l.column,originalLine:null!=q&&q.line,originalColumn:null!=q&&q.column,source:r,name:c})};e.prototype.setSourceContent=function(c,l){var q=c;null!=this._sourceRoot&&(q=t.relative(this._sourceRoot,q));null!=l?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[t.toSetString(q)]=l):this._sourcesContents&&(delete this._sourcesContents[t.toSetString(q)],\n0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};e.prototype.applySourceMap=function(c,l,q){var r=l;if(null==l){if(null==c.file)throw Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\\'s \"file\" property. Both were omitted.');r=c.file}var k=this._sourceRoot;null!=k&&(r=t.relative(k,r));var u=new m,d=new m;this._mappings.unsortedForEach(function(g){if(g.source===r&&null!=g.originalLine){var n=c.originalPositionFor({line:g.originalLine,\ncolumn:g.originalColumn});null!=n.source&&(g.source=n.source,null!=q&&(g.source=t.join(q,g.source)),null!=k&&(g.source=t.relative(k,g.source)),g.originalLine=n.line,g.originalColumn=n.column,null!=n.name&&(g.name=n.name))}n=g.source;null==n||u.has(n)||u.add(n);g=g.name;null==g||d.has(g)||d.add(g)},this);this._sources=u;this._names=d;c.sources.forEach(function(g){var n=c.sourceContentFor(g);null!=n&&(null!=q&&(g=t.join(q,g)),null!=k&&(g=t.relative(k,g)),this.setSourceContent(g,n))},this)};e.prototype._validateMapping=\nfunction(c,l,q,r){if(l&&\"number\"!==typeof l.line&&\"number\"!==typeof l.column)throw Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if(!(c&&\"line\"in c&&\"column\"in c&&0<c.line&&0<=c.column&&!l&&!q&&!r||c&&\"line\"in c&&\"column\"in c&&l&&\"line\"in l&&\"column\"in l&&0<c.line&&0<=c.column&&0<l.line&&0<=l.column&&\nq))throw Error(\"Invalid mapping: \"+JSON.stringify({generated:c,source:q,original:l,name:r}));};e.prototype._serializeMappings=function(){for(var c=0,l=1,q=0,r=0,k=0,u=0,d=\"\",g,n,v,z=this._mappings.toArray(),G=0,D=z.length;G<D;G++){n=z[G];g=\"\";if(n.generatedLine!==l)for(c=0;n.generatedLine!==l;)g+=\";\",l++;else if(0<G){if(!t.compareByGeneratedPositionsInflated(n,z[G-1]))continue;g+=\",\"}g+=p.encode(n.generatedColumn-c);c=n.generatedColumn;null!=n.source&&(v=this._sources.indexOf(n.source),g+=p.encode(v-\nu),u=v,g+=p.encode(n.originalLine-1-r),r=n.originalLine-1,g+=p.encode(n.originalColumn-q),q=n.originalColumn,null!=n.name&&(n=this._names.indexOf(n.name),g+=p.encode(n-k),k=n));d+=g}return d};e.prototype._generateSourcesContent=function(c,l){return c.map(function(q){if(!this._sourcesContents)return null;null!=l&&(q=t.relative(l,q));q=t.toSetString(q);return Object.prototype.hasOwnProperty.call(this._sourcesContents,q)?this._sourcesContents[q]:null},this)};e.prototype.toJSON=function(){var c={version:this._version,\nsources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};null!=this._file&&(c.file=this._file);null!=this._sourceRoot&&(c.sourceRoot=this._sourceRoot);this._sourcesContents&&(c.sourcesContent=this._generateSourcesContent(c.sources,c.sourceRoot));return c};e.prototype.toString=function(){return JSON.stringify(this.toJSON())};A.SourceMapGenerator=e},{\"./array-set\":10,\"./base64-vlq\":11,\"./mapping-list\":14,\"./util\":19}],18:[function(C,J,A){function e(f,c,l,q,r){this.children=\n[];this.sourceContents={};this.line=null==f?null:f;this.column=null==c?null:c;this.source=null==l?null:l;this.name=null==r?null:r;this.$$$isSourceNode$$$=!0;null!=q&&this.add(q)}var p=C(\"./source-map-generator\").SourceMapGenerator,t=C(\"./util\"),m=/(\\r?\\n)/;e.fromStringWithSourceMap=function(f,c,l){function q(z,G){if(null===z||void 0===z.source)r.add(G);else{var D=l?t.join(l,z.source):z.source;r.add(new e(z.originalLine,z.originalColumn,D,G,z.name))}}var r=new e,k=f.split(m),u=0,d=function(){var z=\nu<k.length?k[u++]:void 0,G=(u<k.length?k[u++]:void 0)||\"\";return z+G},g=1,n=0,v=null;c.eachMapping(function(z){if(null!==v)if(g<z.generatedLine)q(v,d()),g++,n=0;else{var G=k[u]||\"\",D=G.substr(0,z.generatedColumn-n);k[u]=G.substr(z.generatedColumn-n);n=z.generatedColumn;q(v,D);v=z;return}for(;g<z.generatedLine;)r.add(d()),g++;n<z.generatedColumn&&(G=k[u]||\"\",r.add(G.substr(0,z.generatedColumn)),k[u]=G.substr(z.generatedColumn),n=z.generatedColumn);v=z},this);u<k.length&&(v&&q(v,d()),r.add(k.splice(u).join(\"\")));\nc.sources.forEach(function(z){var G=c.sourceContentFor(z);null!=G&&(null!=l&&(z=t.join(l,z)),r.setSourceContent(z,G))});return r};e.prototype.add=function(f){if(Array.isArray(f))f.forEach(function(c){this.add(c)},this);else if(f.$$$isSourceNode$$$||\"string\"===typeof f)f&&this.children.push(f);else throw new TypeError(\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \"+f);return this};e.prototype.prepend=function(f){if(Array.isArray(f))for(var c=f.length-1;0<=c;c--)this.prepend(f[c]);\nelse if(f.$$$isSourceNode$$$||\"string\"===typeof f)this.children.unshift(f);else throw new TypeError(\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \"+f);return this};e.prototype.walk=function(f){for(var c,l=0,q=this.children.length;l<q;l++)c=this.children[l],c.$$$isSourceNode$$$?c.walk(f):\"\"!==c&&f(c,{source:this.source,line:this.line,column:this.column,name:this.name})};e.prototype.join=function(f){var c,l=this.children.length;if(0<l){var q=[];for(c=0;c<l-1;c++)q.push(this.children[c]),\nq.push(f);q.push(this.children[c]);this.children=q}return this};e.prototype.replaceRight=function(f,c){var l=this.children[this.children.length-1];l.$$$isSourceNode$$$?l.replaceRight(f,c):\"string\"===typeof l?this.children[this.children.length-1]=l.replace(f,c):this.children.push(\"\".replace(f,c));return this};e.prototype.setSourceContent=function(f,c){this.sourceContents[t.toSetString(f)]=c};e.prototype.walkSourceContents=function(f){for(var c=0,l=this.children.length;c<l;c++)this.children[c].$$$isSourceNode$$$&&\nthis.children[c].walkSourceContents(f);var q=Object.keys(this.sourceContents);c=0;for(l=q.length;c<l;c++)f(t.fromSetString(q[c]),this.sourceContents[q[c]])};e.prototype.toString=function(){var f=\"\";this.walk(function(c){f+=c});return f};e.prototype.toStringWithSourceMap=function(f){var c=\"\",l=1,q=0,r=new p(f),k=!1,u=null,d=null,g=null,n=null;this.walk(function(v,z){c+=v;null!==z.source&&null!==z.line&&null!==z.column?(u===z.source&&d===z.line&&g===z.column&&n===z.name||r.addMapping({source:z.source,\noriginal:{line:z.line,column:z.column},generated:{line:l,column:q},name:z.name}),u=z.source,d=z.line,g=z.column,n=z.name,k=!0):k&&(r.addMapping({generated:{line:l,column:q}}),u=null,k=!1);for(var G=0,D=v.length;G<D;G++)10===v.charCodeAt(G)?(l++,q=0,G+1===D?(u=null,k=!1):k&&r.addMapping({source:z.source,original:{line:z.line,column:z.column},generated:{line:l,column:q},name:z.name})):q++});this.walkSourceContents(function(v,z){r.setSourceContent(v,z)});return{code:c,map:r}};A.SourceNode=e},{\"./source-map-generator\":17,\n\"./util\":19}],19:[function(C,J,A){function e(d){return(d=d.match(k))?{scheme:d[1],auth:d[2],host:d[3],port:d[4],path:d[5]}:null}function p(d){var g=\"\";d.scheme&&(g+=d.scheme+\":\");g+=\"//\";d.auth&&(g+=d.auth+\"@\");d.host&&(g+=d.host);d.port&&(g+=\":\"+d.port);d.path&&(g+=d.path);return g}function t(d){var g=d,n=e(d);if(n){if(!n.path)return d;g=n.path}d=A.isAbsolute(g);g=g.split(/\\/+/);for(var v,z=0,G=g.length-1;0<=G;G--)v=g[G],\".\"===v?g.splice(G,1):\"..\"===v?z++:0<z&&(\"\"===v?(g.splice(G+1,z),z=0):(g.splice(G,\n2),z--));g=g.join(\"/\");\"\"===g&&(g=d?\"/\":\".\");return n?(n.path=g,p(n)):g}function m(d,g){\"\"===d&&(d=\".\");\"\"===g&&(g=\".\");var n=e(g),v=e(d);v&&(d=v.path||\"/\");if(n&&!n.scheme)return v&&(n.scheme=v.scheme),p(n);if(n||g.match(u))return g;if(v&&!v.host&&!v.path)return v.host=g,p(v);n=\"/\"===g.charAt(0)?g:t(d.replace(/\\/+$/,\"\")+\"/\"+g);return v?(v.path=n,p(v)):n}function f(d){return d}function c(d){return q(d)?\"$\"+d:d}function l(d){return q(d)?d.slice(1):d}function q(d){if(!d)return!1;var g=d.length;if(9>\ng||95!==d.charCodeAt(g-1)||95!==d.charCodeAt(g-2)||111!==d.charCodeAt(g-3)||116!==d.charCodeAt(g-4)||111!==d.charCodeAt(g-5)||114!==d.charCodeAt(g-6)||112!==d.charCodeAt(g-7)||95!==d.charCodeAt(g-8)||95!==d.charCodeAt(g-9))return!1;for(g-=10;0<=g;g--)if(36!==d.charCodeAt(g))return!1;return!0}function r(d,g){return d===g?0:null===d?1:null===g?-1:d>g?1:-1}A.getArg=function(d,g,n){if(g in d)return d[g];if(3===arguments.length)return n;throw Error('\"'+g+'\" is a required argument.');};var k=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,\nu=/^data:.+,.+$/;A.urlParse=e;A.urlGenerate=p;A.normalize=t;A.join=m;A.isAbsolute=function(d){return\"/\"===d.charAt(0)||k.test(d)};A.relative=function(d,g){\"\"===d&&(d=\".\");d=d.replace(/\\/$/,\"\");for(var n=0;0!==g.indexOf(d+\"/\");){var v=d.lastIndexOf(\"/\");if(0>v)return g;d=d.slice(0,v);if(d.match(/^([^\\/]+:\\/)?\\/*$/))return g;++n}return Array(n+1).join(\"../\")+g.substr(d.length+1)};C=!(\"__proto__\"in Object.create(null));A.toSetString=C?f:c;A.fromSetString=C?f:l;A.compareByOriginalPositions=function(d,\ng,n){var v=r(d.source,g.source);if(0!==v)return v;v=d.originalLine-g.originalLine;if(0!==v)return v;v=d.originalColumn-g.originalColumn;if(0!==v||n)return v;v=d.generatedColumn-g.generatedColumn;if(0!==v)return v;v=d.generatedLine-g.generatedLine;return 0!==v?v:r(d.name,g.name)};A.compareByGeneratedPositionsDeflated=function(d,g,n){var v=d.generatedLine-g.generatedLine;if(0!==v)return v;v=d.generatedColumn-g.generatedColumn;if(0!==v||n)return v;v=r(d.source,g.source);if(0!==v)return v;v=d.originalLine-\ng.originalLine;if(0!==v)return v;v=d.originalColumn-g.originalColumn;return 0!==v?v:r(d.name,g.name)};A.compareByGeneratedPositionsInflated=function(d,g){var n=d.generatedLine-g.generatedLine;if(0!==n)return n;n=d.generatedColumn-g.generatedColumn;if(0!==n)return n;n=r(d.source,g.source);if(0!==n)return n;n=d.originalLine-g.originalLine;if(0!==n)return n;n=d.originalColumn-g.originalColumn;return 0!==n?n:r(d.name,g.name)};A.parseSourceMapInput=function(d){return JSON.parse(d.replace(/^\\)]}'[^\\n]*\\n/,\n\"\"))};A.computeSourceURL=function(d,g,n){g=g||\"\";d&&(\"/\"!==d[d.length-1]&&\"/\"!==g[0]&&(d+=\"/\"),g=d+g);if(n){d=e(n);if(!d)throw Error(\"sourceMapURL could not be parsed\");d.path&&(n=d.path.lastIndexOf(\"/\"),0<=n&&(d.path=d.path.substring(0,n+1)));g=m(p(d),g)}return t(g)}},{}],20:[function(C,J,A){A.SourceMapGenerator=C(\"./lib/source-map-generator\").SourceMapGenerator;A.SourceMapConsumer=C(\"./lib/source-map-consumer\").SourceMapConsumer;A.SourceNode=C(\"./lib/source-node\").SourceNode},{\"./lib/source-map-consumer\":16,\n\"./lib/source-map-generator\":17,\"./lib/source-node\":18}],21:[function(C,J,A){(function(e){function p(){return\"browser\"===a?!0:\"node\"===a?!1:\"undefined\"!==typeof window&&\"function\"===typeof XMLHttpRequest&&!(window.require&&window.module&&window.process&&\"renderer\"===window.process.type)}function t(x){return function(B){for(var F=0;F<x.length;F++){var E=x[F](B);if(E)return E}return null}}function m(x,B){if(!x)return B;var F=n.dirname(x),E=/^\\w+:\\/\\/[^\\/]*/.exec(F);E=E?E[0]:\"\";var H=F.slice(E.length);\nreturn E&&/^\\/\\w:/.test(H)?(E+=\"/\",E+n.resolve(F.slice(E.length),B).replace(/\\\\/g,\"/\")):E+n.resolve(F.slice(E.length),B)}function f(x){var B=h[x.source];if(!B){var F=N(x.source);F?(B=h[x.source]={url:F.url,map:new g(F.map)},B.map.sourcesContent&&B.map.sources.forEach(function(E,H){var M=B.map.sourcesContent[H];if(M){var S=m(B.url,E);b[S]=M}})):B=h[x.source]={url:null,map:null}}return B&&B.map&&\"function\"===typeof B.map.originalPositionFor&&(F=B.map.originalPositionFor(x),null!==F.source)?(F.source=\nm(B.url,F.source),F):x}function c(x){var B=/^eval at ([^(]+) \\((.+):(\\d+):(\\d+)\\)$/.exec(x);return B?(x=f({source:B[2],line:+B[3],column:B[4]-1}),\"eval at \"+B[1]+\" (\"+x.source+\":\"+x.line+\":\"+(x.column+1)+\")\"):(B=/^eval at ([^(]+) \\((.+)\\)$/.exec(x))?\"eval at \"+B[1]+\" (\"+c(B[2])+\")\":x}function l(){var x=\"\";if(this.isNative())x=\"native\";else{var B=this.getScriptNameOrSourceURL();!B&&this.isEval()&&(x=this.getEvalOrigin(),x+=\", \");x=B?x+B:x+\"<anonymous>\";B=this.getLineNumber();null!=B&&(x+=\":\"+B,(B=\nthis.getColumnNumber())&&(x+=\":\"+B))}B=\"\";var F=this.getFunctionName(),E=!0,H=this.isConstructor();if(this.isToplevel()||H)H?B+=\"new \"+(F||\"<anonymous>\"):F?B+=F:(B+=x,E=!1);else{H=this.getTypeName();\"[object Object]\"===H&&(H=\"null\");var M=this.getMethodName();F?(H&&0!=F.indexOf(H)&&(B+=H+\".\"),B+=F,M&&F.indexOf(\".\"+M)!=F.length-M.length-1&&(B+=\" [as \"+M+\"]\")):B+=H+\".\"+(M||\"<anonymous>\")}E&&(B+=\" (\"+x+\")\");return B}function q(x){var B={};Object.getOwnPropertyNames(Object.getPrototypeOf(x)).forEach(function(F){B[F]=\n/^(?:is|get)/.test(F)?function(){return x[F].call(x)}:x[F]});B.toString=l;return B}function r(x,B){void 0===B&&(B={nextPosition:null,curPosition:null});if(x.isNative())return B.curPosition=null,x;var F=x.getFileName()||x.getScriptNameOrSourceURL();if(F){var E=x.getLineNumber(),H=x.getColumnNumber()-1,M=/^v(10\\.1[6-9]|10\\.[2-9][0-9]|10\\.[0-9]{3,}|1[2-9]\\d*|[2-9]\\d|\\d{3,}|11\\.11)/,S=M.test;var V=\"object\"===typeof e&&null!==e?e.version:\"\";M=S.call(M,V)?0:62;1===E&&H>M&&!p()&&!x.isEval()&&(H-=M);var O=\nf({source:F,line:E,column:H});B.curPosition=O;x=q(x);var T=x.getFunctionName;x.getFunctionName=function(){return null==B.nextPosition?T():B.nextPosition.name||T()};x.getFileName=function(){return O.source};x.getLineNumber=function(){return O.line};x.getColumnNumber=function(){return O.column+1};x.getScriptNameOrSourceURL=function(){return O.source};return x}var Q=x.isEval()&&x.getEvalOrigin();Q&&(Q=c(Q),x=q(x),x.getEvalOrigin=function(){return Q});return x}function k(x,B){L&&(b={},h={});for(var F=\n(x.name||\"Error\")+\": \"+(x.message||\"\"),E={nextPosition:null,curPosition:null},H=[],M=B.length-1;0<=M;M--)H.push(\"\\n    at \"+r(B[M],E)),E.nextPosition=E.curPosition;E.curPosition=E.nextPosition=null;return F+H.reverse().join(\"\")}function u(x){var B=/\\n    at [^(]+ \\((.*):(\\d+):(\\d+)\\)/.exec(x.stack);if(B){x=B[1];var F=+B[2];B=+B[3];var E=b[x];if(!E&&v&&v.existsSync(x))try{E=v.readFileSync(x,\"utf8\")}catch(H){E=\"\"}if(E&&(E=E.split(/(?:\\r\\n|\\r|\\n)/)[F-1]))return x+\":\"+F+\"\\n\"+E+\"\\n\"+Array(B).join(\" \")+\n\"^\"}return null}function d(){var x=e.emit;e.emit=function(B){if(\"uncaughtException\"===B){var F=arguments[1]&&arguments[1].stack,E=0<this.listeners(B).length;if(F&&!E){F=arguments[1];E=u(F);var H=\"object\"===typeof e&&null!==e?e.stderr:void 0;H&&H._handle&&H._handle.setBlocking&&H._handle.setBlocking(!0);E&&(console.error(),console.error(E));console.error(F.stack);\"object\"===typeof e&&null!==e&&\"function\"===typeof e.exit&&e.exit(1);return}}return x.apply(this,arguments)}}var g=C(\"source-map\").SourceMapConsumer,\nn=C(\"path\");try{var v=C(\"fs\");v.existsSync&&v.readFileSync||(v=null)}catch(x){}var z=C(\"buffer-from\"),G=!1,D=!1,L=!1,a=\"auto\",b={},h={},w=/^data:application\\/json[^,]+base64,/,y=[],I=[],K=t(y);y.push(function(x){x=x.trim();/^file:/.test(x)&&(x=x.replace(/file:\\/\\/\\/(\\w:)?/,function(E,H){return H?\"\":\"/\"}));if(x in b)return b[x];var B=\"\";try{if(v)v.existsSync(x)&&(B=v.readFileSync(x,\"utf8\"));else{var F=new XMLHttpRequest;F.open(\"GET\",x,!1);F.send(null);4===F.readyState&&200===F.status&&(B=F.responseText)}}catch(E){}return b[x]=\nB});var N=t(I);I.push(function(x){a:{if(p())try{var B=new XMLHttpRequest;B.open(\"GET\",x,!1);B.send(null);var F=B.getResponseHeader(\"SourceMap\")||B.getResponseHeader(\"X-SourceMap\");if(F){var E=F;break a}}catch(M){}E=K(x);B=/(?:\\/\\/[@#][\\s]*sourceMappingURL=([^\\s'\"]+)[\\s]*$)|(?:\\/\\*[@#][\\s]*sourceMappingURL=([^\\s*'\"]+)[\\s]*(?:\\*\\/)[\\s]*$)/mg;for(var H;F=B.exec(E);)H=F;E=H?H[1]:null}if(!E)return null;w.test(E)?(H=E.slice(E.indexOf(\",\")+1),H=z(H,\"base64\").toString(),E=x):(E=m(x,E),H=K(E));return H?{url:E,\nmap:H}:null});var P=y.slice(0),W=I.slice(0);A.wrapCallSite=r;A.getErrorSource=u;A.mapSourcePosition=f;A.retrieveSourceMap=N;A.install=function(x){x=x||{};if(x.environment&&(a=x.environment,-1===[\"node\",\"browser\",\"auto\"].indexOf(a)))throw Error(\"environment \"+a+\" was unknown. Available options are {auto, browser, node}\");x.retrieveFile&&(x.overrideRetrieveFile&&(y.length=0),y.unshift(x.retrieveFile));x.retrieveSourceMap&&(x.overrideRetrieveSourceMap&&(I.length=0),I.unshift(x.retrieveSourceMap));if(x.hookRequire&&\n!p()){var B=J.require(\"module\"),F=B.prototype._compile;F.__sourceMapSupport||(B.prototype._compile=function(E,H){b[H]=E;h[H]=void 0;return F.call(this,E,H)},B.prototype._compile.__sourceMapSupport=!0)}L||(L=\"emptyCacheBetweenOperations\"in x?x.emptyCacheBetweenOperations:!1);G||(G=!0,Error.prepareStackTrace=k);if(!D){x=\"handleUncaughtExceptions\"in x?x.handleUncaughtExceptions:!0;try{!1===J.require(\"worker_threads\").isMainThread&&(x=!1)}catch(E){}x&&\"object\"===typeof e&&null!==e&&\"function\"===typeof e.on&&\n(D=!0,d())}};A.resetRetrieveHandlers=function(){y.length=0;I.length=0;y=P.slice(0);I=W.slice(0);N=t(I);K=t(y)}}).call(this,C(\"g5I+bs\"))},{\"buffer-from\":4,fs:3,\"g5I+bs\":9,path:8,\"source-map\":20}]},{},[1]);return R});\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/CHANGELOG.md",
    "content": "# Change Log\n\n## 0.5.6\n\n* Fix for regression when people were using numbers as names in source maps. See\n  #236.\n\n## 0.5.5\n\n* Fix \"regression\" of unsupported, implementation behavior that half the world\n  happens to have come to depend on. See #235.\n\n* Fix regression involving function hoisting in SpiderMonkey. See #233.\n\n## 0.5.4\n\n* Large performance improvements to source-map serialization. See #228 and #229.\n\n## 0.5.3\n\n* Do not include unnecessary distribution files. See\n  commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86.\n\n## 0.5.2\n\n* Include browser distributions of the library in package.json's `files`. See\n  issue #212.\n\n## 0.5.1\n\n* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See\n  ff05274becc9e6e1295ed60f3ea090d31d843379.\n\n## 0.5.0\n\n* Node 0.8 is no longer supported.\n\n* Use webpack instead of dryice for bundling.\n\n* Big speedups serializing source maps. See pull request #203.\n\n* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that\n  explicitly start with the source root. See issue #199.\n\n## 0.4.4\n\n* Fix an issue where using a `SourceMapGenerator` after having created a\n  `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See\n  issue #191.\n\n* Fix an issue with where `SourceMapGenerator` would mistakenly consider\n  different mappings as duplicates of each other and avoid generating them. See\n  issue #192.\n\n## 0.4.3\n\n* A very large number of performance improvements, particularly when parsing\n  source maps. Collectively about 75% of time shaved off of the source map\n  parsing benchmark!\n\n* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy\n  searching in the presence of a column option. See issue #177.\n\n* Fix a bug with joining a source and its source root when the source is above\n  the root. See issue #182.\n\n* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to\n  determine when all sources' contents are inlined into the source map. See\n  issue #190.\n\n## 0.4.2\n\n* Add an `.npmignore` file so that the benchmarks aren't pulled down by\n  dependent projects. Issue #169.\n\n* Add an optional `column` argument to\n  `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines\n  with no mappings. Issues #172 and #173.\n\n## 0.4.1\n\n* Fix accidentally defining a global variable. #170.\n\n## 0.4.0\n\n* The default direction for fuzzy searching was changed back to its original\n  direction. See #164.\n\n* There is now a `bias` option you can supply to `SourceMapConsumer` to control\n  the fuzzy searching direction. See #167.\n\n* About an 8% speed up in parsing source maps. See #159.\n\n* Added a benchmark for parsing and generating source maps.\n\n## 0.3.0\n\n* Change the default direction that searching for positions fuzzes when there is\n  not an exact match. See #154.\n\n* Support for environments using json2.js for JSON serialization. See #156.\n\n## 0.2.0\n\n* Support for consuming \"indexed\" source maps which do not have any remote\n  sections. See pull request #127. This introduces a minor backwards\n  incompatibility if you are monkey patching `SourceMapConsumer.prototype`\n  methods.\n\n## 0.1.43\n\n* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue\n  #148 for some discussion and issues #150, #151, and #152 for implementations.\n\n## 0.1.42\n\n* Fix an issue where `SourceNode`s from different versions of the source-map\n  library couldn't be used in conjunction with each other. See issue #142.\n\n## 0.1.41\n\n* Fix a bug with getting the source content of relative sources with a \"./\"\n  prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768).\n\n* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the\n  column span of each mapping.\n\n* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find\n  all generated positions associated with a given original source and line.\n\n## 0.1.40\n\n* Performance improvements for parsing source maps in SourceMapConsumer.\n\n## 0.1.39\n\n* Fix a bug where setting a source's contents to null before any source content\n  had been set before threw a TypeError. See issue #131.\n\n## 0.1.38\n\n* Fix a bug where finding relative paths from an empty path were creating\n  absolute paths. See issue #129.\n\n## 0.1.37\n\n* Fix a bug where if the source root was an empty string, relative source paths\n  would turn into absolute source paths. Issue #124.\n\n## 0.1.36\n\n* Allow the `names` mapping property to be an empty string. Issue #121.\n\n## 0.1.35\n\n* A third optional parameter was added to `SourceNode.fromStringWithSourceMap`\n  to specify a path that relative sources in the second parameter should be\n  relative to. Issue #105.\n\n* If no file property is given to a `SourceMapGenerator`, then the resulting\n  source map will no longer have a `null` file property. The property will\n  simply not exist. Issue #104.\n\n* Fixed a bug where consecutive newlines were ignored in `SourceNode`s.\n  Issue #116.\n\n## 0.1.34\n\n* Make `SourceNode` work with windows style (\"\\r\\n\") newlines. Issue #103.\n\n* Fix bug involving source contents and the\n  `SourceMapGenerator.prototype.applySourceMap`. Issue #100.\n\n## 0.1.33\n\n* Fix some edge cases surrounding path joining and URL resolution.\n\n* Add a third parameter for relative path to\n  `SourceMapGenerator.prototype.applySourceMap`.\n\n* Fix issues with mappings and EOLs.\n\n## 0.1.32\n\n* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns\n  (issue 92).\n\n* Fixed test runner to actually report number of failed tests as its process\n  exit code.\n\n* Fixed a typo when reporting bad mappings (issue 87).\n\n## 0.1.31\n\n* Delay parsing the mappings in SourceMapConsumer until queried for a source\n  location.\n\n* Support Sass source maps (which at the time of writing deviate from the spec\n  in small ways) in SourceMapConsumer.\n\n## 0.1.30\n\n* Do not join source root with a source, when the source is a data URI.\n\n* Extend the test runner to allow running single specific test files at a time.\n\n* Performance improvements in `SourceNode.prototype.walk` and\n  `SourceMapConsumer.prototype.eachMapping`.\n\n* Source map browser builds will now work inside Workers.\n\n* Better error messages when attempting to add an invalid mapping to a\n  `SourceMapGenerator`.\n\n## 0.1.29\n\n* Allow duplicate entries in the `names` and `sources` arrays of source maps\n  (usually from TypeScript) we are parsing. Fixes github issue 72.\n\n## 0.1.28\n\n* Skip duplicate mappings when creating source maps from SourceNode; github\n  issue 75.\n\n## 0.1.27\n\n* Don't throw an error when the `file` property is missing in SourceMapConsumer,\n  we don't use it anyway.\n\n## 0.1.26\n\n* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70.\n\n## 0.1.25\n\n* Make compatible with browserify\n\n## 0.1.24\n\n* Fix issue with absolute paths and `file://` URIs. See\n  https://bugzilla.mozilla.org/show_bug.cgi?id=885597\n\n## 0.1.23\n\n* Fix issue with absolute paths and sourcesContent, github issue 64.\n\n## 0.1.22\n\n* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21.\n\n## 0.1.21\n\n* Fixed handling of sources that start with a slash so that they are relative to\n  the source root's host.\n\n## 0.1.20\n\n* Fixed github issue #43: absolute URLs aren't joined with the source root\n  anymore.\n\n## 0.1.19\n\n* Using Travis CI to run tests.\n\n## 0.1.18\n\n* Fixed a bug in the handling of sourceRoot.\n\n## 0.1.17\n\n* Added SourceNode.fromStringWithSourceMap.\n\n## 0.1.16\n\n* Added missing documentation.\n\n* Fixed the generating of empty mappings in SourceNode.\n\n## 0.1.15\n\n* Added SourceMapGenerator.applySourceMap.\n\n## 0.1.14\n\n* The sourceRoot is now handled consistently.\n\n## 0.1.13\n\n* Added SourceMapGenerator.fromSourceMap.\n\n## 0.1.12\n\n* SourceNode now generates empty mappings too.\n\n## 0.1.11\n\n* Added name support to SourceNode.\n\n## 0.1.10\n\n* Added sourcesContent support to the customer and generator.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/LICENSE",
    "content": "\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the names of the Mozilla Foundation nor the names of project\n  contributors may be used to endorse or promote products derived from this\n  software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/README.md",
    "content": "# Source Map\n\n[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map)\n\n[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map)\n\nThis is a library to generate and consume the source map format\n[described here][format].\n\n[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit\n\n## Use with Node\n\n    $ npm install source-map\n\n## Use on the Web\n\n    <script src=\"https://raw.githubusercontent.com/mozilla/source-map/master/dist/source-map.min.js\" defer></script>\n\n--------------------------------------------------------------------------------\n\n<!-- `npm run toc` to regenerate the Table of Contents -->\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Examples](#examples)\n  - [Consuming a source map](#consuming-a-source-map)\n  - [Generating a source map](#generating-a-source-map)\n    - [With SourceNode (high level API)](#with-sourcenode-high-level-api)\n    - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)\n- [API](#api)\n  - [SourceMapConsumer](#sourcemapconsumer)\n    - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)\n    - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)\n    - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)\n    - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)\n    - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)\n    - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)\n    - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)\n    - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)\n  - [SourceMapGenerator](#sourcemapgenerator)\n    - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)\n    - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)\n    - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)\n    - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)\n    - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)\n    - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)\n  - [SourceNode](#sourcenode)\n    - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)\n    - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)\n    - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)\n    - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)\n    - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)\n    - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)\n    - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)\n    - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)\n    - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)\n    - [SourceNode.prototype.toString()](#sourcenodeprototypetostring)\n    - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Examples\n\n### Consuming a source map\n\n```js\nvar rawSourceMap = {\n  version: 3,\n  file: 'min.js',\n  names: ['bar', 'baz', 'n'],\n  sources: ['one.js', 'two.js'],\n  sourceRoot: 'http://example.com/www/js/',\n  mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'\n};\n\nvar smc = new SourceMapConsumer(rawSourceMap);\n\nconsole.log(smc.sources);\n// [ 'http://example.com/www/js/one.js',\n//   'http://example.com/www/js/two.js' ]\n\nconsole.log(smc.originalPositionFor({\n  line: 2,\n  column: 28\n}));\n// { source: 'http://example.com/www/js/two.js',\n//   line: 2,\n//   column: 10,\n//   name: 'n' }\n\nconsole.log(smc.generatedPositionFor({\n  source: 'http://example.com/www/js/two.js',\n  line: 2,\n  column: 10\n}));\n// { line: 2, column: 28 }\n\nsmc.eachMapping(function (m) {\n  // ...\n});\n```\n\n### Generating a source map\n\nIn depth guide:\n[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)\n\n#### With SourceNode (high level API)\n\n```js\nfunction compile(ast) {\n  switch (ast.type) {\n  case 'BinaryExpression':\n    return new SourceNode(\n      ast.location.line,\n      ast.location.column,\n      ast.location.source,\n      [compile(ast.left), \" + \", compile(ast.right)]\n    );\n  case 'Literal':\n    return new SourceNode(\n      ast.location.line,\n      ast.location.column,\n      ast.location.source,\n      String(ast.value)\n    );\n  // ...\n  default:\n    throw new Error(\"Bad AST\");\n  }\n}\n\nvar ast = parse(\"40 + 2\", \"add.js\");\nconsole.log(compile(ast).toStringWithSourceMap({\n  file: 'add.js'\n}));\n// { code: '40 + 2',\n//   map: [object SourceMapGenerator] }\n```\n\n#### With SourceMapGenerator (low level API)\n\n```js\nvar map = new SourceMapGenerator({\n  file: \"source-mapped.js\"\n});\n\nmap.addMapping({\n  generated: {\n    line: 10,\n    column: 35\n  },\n  source: \"foo.js\",\n  original: {\n    line: 33,\n    column: 2\n  },\n  name: \"christopher\"\n});\n\nconsole.log(map.toString());\n// '{\"version\":3,\"file\":\"source-mapped.js\",\"sources\":[\"foo.js\"],\"names\":[\"christopher\"],\"mappings\":\";;;;;;;;;mCAgCEA\"}'\n```\n\n## API\n\nGet a reference to the module:\n\n```js\n// Node.js\nvar sourceMap = require('source-map');\n\n// Browser builds\nvar sourceMap = window.sourceMap;\n\n// Inside Firefox\nconst sourceMap = require(\"devtools/toolkit/sourcemap/source-map.js\");\n```\n\n### SourceMapConsumer\n\nA SourceMapConsumer instance represents a parsed source map which we can query\nfor information about the original file positions by giving it a file position\nin the generated source.\n\n#### new SourceMapConsumer(rawSourceMap)\n\nThe only parameter is the raw source map (either as a string which can be\n`JSON.parse`'d, or an object). According to the spec, source maps have the\nfollowing attributes:\n\n* `version`: Which version of the source map spec this map is following.\n\n* `sources`: An array of URLs to the original source files.\n\n* `names`: An array of identifiers which can be referenced by individual\n  mappings.\n\n* `sourceRoot`: Optional. The URL root from which all sources are relative.\n\n* `sourcesContent`: Optional. An array of contents of the original source files.\n\n* `mappings`: A string of base64 VLQs which contain the actual mappings.\n\n* `file`: Optional. The generated filename this source map is associated with.\n\n```js\nvar consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);\n```\n\n#### SourceMapConsumer.prototype.computeColumnSpans()\n\nCompute the last column for each generated mapping. The last column is\ninclusive.\n\n```js\n// Before:\nconsumer.allGeneratedPositionsFor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n//     column: 1 },\n//   { line: 2,\n//     column: 10 },\n//   { line: 2,\n//     column: 20 } ]\n\nconsumer.computeColumnSpans();\n\n// After:\nconsumer.allGeneratedPositionsFor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n//     column: 1,\n//     lastColumn: 9 },\n//   { line: 2,\n//     column: 10,\n//     lastColumn: 19 },\n//   { line: 2,\n//     column: 20,\n//     lastColumn: Infinity } ]\n\n```\n\n#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)\n\nReturns the original source, line, and column information for the generated\nsource's line and column positions provided. The only argument is an object with\nthe following properties:\n\n* `line`: The line number in the generated source.  Line numbers in\n  this library are 1-based (note that the underlying source map\n  specification uses 0-based line numbers -- this library handles the\n  translation).\n\n* `column`: The column number in the generated source.  Column numbers\n  in this library are 0-based.\n\n* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or\n  `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest\n  element that is smaller than or greater than the one we are searching for,\n  respectively, if the exact element cannot be found.  Defaults to\n  `SourceMapConsumer.GREATEST_LOWER_BOUND`.\n\nand an object is returned with the following properties:\n\n* `source`: The original source file, or null if this information is not\n  available.\n\n* `line`: The line number in the original source, or null if this information is\n  not available.  The line number is 1-based.\n\n* `column`: The column number in the original source, or null if this\n  information is not available.  The column number is 0-based.\n\n* `name`: The original identifier, or null if this information is not available.\n\n```js\nconsumer.originalPositionFor({ line: 2, column: 10 })\n// { source: 'foo.coffee',\n//   line: 2,\n//   column: 2,\n//   name: null }\n\nconsumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })\n// { source: null,\n//   line: null,\n//   column: null,\n//   name: null }\n```\n\n#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)\n\nReturns the generated line and column information for the original source,\nline, and column positions provided. The only argument is an object with\nthe following properties:\n\n* `source`: The filename of the original source.\n\n* `line`: The line number in the original source.  The line number is\n  1-based.\n\n* `column`: The column number in the original source.  The column\n  number is 0-based.\n\nand an object is returned with the following properties:\n\n* `line`: The line number in the generated source, or null.  The line\n  number is 1-based.\n\n* `column`: The column number in the generated source, or null.  The\n  column number is 0-based.\n\n```js\nconsumer.generatedPositionFor({ source: \"example.js\", line: 2, column: 10 })\n// { line: 1,\n//   column: 56 }\n```\n\n#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)\n\nReturns all generated line and column information for the original source, line,\nand column provided. If no column is provided, returns all mappings\ncorresponding to a either the line we are searching for or the next closest line\nthat has any mappings. Otherwise, returns all mappings corresponding to the\ngiven line and either the column we are searching for or the next closest column\nthat has any offsets.\n\nThe only argument is an object with the following properties:\n\n* `source`: The filename of the original source.\n\n* `line`: The line number in the original source.  The line number is\n  1-based.\n\n* `column`: Optional. The column number in the original source.  The\n  column number is 0-based.\n\nand an array of objects is returned, each with the following properties:\n\n* `line`: The line number in the generated source, or null.  The line\n  number is 1-based.\n\n* `column`: The column number in the generated source, or null.  The\n  column number is 0-based.\n\n```js\nconsumer.allGeneratedpositionsfor({ line: 2, source: \"foo.coffee\" })\n// [ { line: 2,\n//     column: 1 },\n//   { line: 2,\n//     column: 10 },\n//   { line: 2,\n//     column: 20 } ]\n```\n\n#### SourceMapConsumer.prototype.hasContentsOfAllSources()\n\nReturn true if we have the embedded source content for every source listed in\nthe source map, false otherwise.\n\nIn other words, if this method returns `true`, then\n`consumer.sourceContentFor(s)` will succeed for every source `s` in\n`consumer.sources`.\n\n```js\n// ...\nif (consumer.hasContentsOfAllSources()) {\n  consumerReadyCallback(consumer);\n} else {\n  fetchSources(consumer, consumerReadyCallback);\n}\n// ...\n```\n\n#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])\n\nReturns the original source content for the source provided. The only\nargument is the URL of the original source file.\n\nIf the source content for the given source is not found, then an error is\nthrown. Optionally, pass `true` as the second param to have `null` returned\ninstead.\n\n```js\nconsumer.sources\n// [ \"my-cool-lib.clj\" ]\n\nconsumer.sourceContentFor(\"my-cool-lib.clj\")\n// \"...\"\n\nconsumer.sourceContentFor(\"this is not in the source map\");\n// Error: \"this is not in the source map\" is not in the source map\n\nconsumer.sourceContentFor(\"this is not in the source map\", true);\n// null\n```\n\n#### SourceMapConsumer.prototype.eachMapping(callback, context, order)\n\nIterate over each mapping between an original source/line/column and a\ngenerated line/column in this source map.\n\n* `callback`: The function that is called with each mapping. Mappings have the\n  form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,\n  name }`\n\n* `context`: Optional. If specified, this object will be the value of `this`\n  every time that `callback` is called.\n\n* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or\n  `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over\n  the mappings sorted by the generated file's line/column order or the\n  original's source/line/column order, respectively. Defaults to\n  `SourceMapConsumer.GENERATED_ORDER`.\n\n```js\nconsumer.eachMapping(function (m) { console.log(m); })\n// ...\n// { source: 'illmatic.js',\n//   generatedLine: 1,\n//   generatedColumn: 0,\n//   originalLine: 1,\n//   originalColumn: 0,\n//   name: null }\n// { source: 'illmatic.js',\n//   generatedLine: 2,\n//   generatedColumn: 0,\n//   originalLine: 2,\n//   originalColumn: 0,\n//   name: null }\n// ...\n```\n### SourceMapGenerator\n\nAn instance of the SourceMapGenerator represents a source map which is being\nbuilt incrementally.\n\n#### new SourceMapGenerator([startOfSourceMap])\n\nYou may pass an object with the following properties:\n\n* `file`: The filename of the generated source that this source map is\n  associated with.\n\n* `sourceRoot`: A root for all relative URLs in this source map.\n\n* `skipValidation`: Optional. When `true`, disables validation of mappings as\n  they are added. This can improve performance but should be used with\n  discretion, as a last resort. Even then, one should avoid using this flag when\n  running tests, if possible.\n\n```js\nvar generator = new sourceMap.SourceMapGenerator({\n  file: \"my-generated-javascript-file.js\",\n  sourceRoot: \"http://example.com/app/js/\"\n});\n```\n\n#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)\n\nCreates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.\n\n* `sourceMapConsumer` The SourceMap.\n\n```js\nvar generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);\n```\n\n#### SourceMapGenerator.prototype.addMapping(mapping)\n\nAdd a single mapping from original source line and column to the generated\nsource's line and column for this source map being created. The mapping object\nshould have the following properties:\n\n* `generated`: An object with the generated line and column positions.\n\n* `original`: An object with the original line and column positions.\n\n* `source`: The original source file (relative to the sourceRoot).\n\n* `name`: An optional original token name for this mapping.\n\n```js\ngenerator.addMapping({\n  source: \"module-one.scm\",\n  original: { line: 128, column: 0 },\n  generated: { line: 3, column: 456 }\n})\n```\n\n#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)\n\nSet the source content for an original source file.\n\n* `sourceFile` the URL of the original source file.\n\n* `sourceContent` the content of the source file.\n\n```js\ngenerator.setSourceContent(\"module-one.scm\",\n                           fs.readFileSync(\"path/to/module-one.scm\"))\n```\n\n#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])\n\nApplies a SourceMap for a source file to the SourceMap.\nEach mapping to the supplied source file is rewritten using the\nsupplied SourceMap. Note: The resolution for the resulting mappings\nis the minimum of this map and the supplied map.\n\n* `sourceMapConsumer`: The SourceMap to be applied.\n\n* `sourceFile`: Optional. The filename of the source file.\n  If omitted, sourceMapConsumer.file will be used, if it exists.\n  Otherwise an error will be thrown.\n\n* `sourceMapPath`: Optional. The dirname of the path to the SourceMap\n  to be applied. If relative, it is relative to the SourceMap.\n\n  This parameter is needed when the two SourceMaps aren't in the same\n  directory, and the SourceMap to be applied contains relative source\n  paths. If so, those relative source paths need to be rewritten\n  relative to the SourceMap.\n\n  If omitted, it is assumed that both SourceMaps are in the same directory,\n  thus not needing any rewriting. (Supplying `'.'` has the same effect.)\n\n#### SourceMapGenerator.prototype.toString()\n\nRenders the source map being generated to a string.\n\n```js\ngenerator.toString()\n// '{\"version\":3,\"sources\":[\"module-one.scm\"],\"names\":[],\"mappings\":\"...snip...\",\"file\":\"my-generated-javascript-file.js\",\"sourceRoot\":\"http://example.com/app/js/\"}'\n```\n\n### SourceNode\n\nSourceNodes provide a way to abstract over interpolating and/or concatenating\nsnippets of generated JavaScript source code, while maintaining the line and\ncolumn information associated between those snippets and the original source\ncode. This is useful as the final intermediate representation a compiler might\nuse before outputting the generated JS and source map.\n\n#### new SourceNode([line, column, source[, chunk[, name]]])\n\n* `line`: The original line number associated with this source node, or null if\n  it isn't associated with an original line.  The line number is 1-based.\n\n* `column`: The original column number associated with this source node, or null\n  if it isn't associated with an original column.  The column number\n  is 0-based.\n\n* `source`: The original source's filename; null if no filename is provided.\n\n* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see\n  below.\n\n* `name`: Optional. The original identifier.\n\n```js\nvar node = new SourceNode(1, 2, \"a.cpp\", [\n  new SourceNode(3, 4, \"b.cpp\", \"extern int status;\\n\"),\n  new SourceNode(5, 6, \"c.cpp\", \"std::string* make_string(size_t n);\\n\"),\n  new SourceNode(7, 8, \"d.cpp\", \"int main(int argc, char** argv) {}\\n\"),\n]);\n```\n\n#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])\n\nCreates a SourceNode from generated code and a SourceMapConsumer.\n\n* `code`: The generated code\n\n* `sourceMapConsumer` The SourceMap for the generated code\n\n* `relativePath` The optional path that relative sources in `sourceMapConsumer`\n  should be relative to.\n\n```js\nvar consumer = new SourceMapConsumer(fs.readFileSync(\"path/to/my-file.js.map\", \"utf8\"));\nvar node = SourceNode.fromStringWithSourceMap(fs.readFileSync(\"path/to/my-file.js\"),\n                                              consumer);\n```\n\n#### SourceNode.prototype.add(chunk)\n\nAdd a chunk of generated JS to this source node.\n\n* `chunk`: A string snippet of generated JS code, another instance of\n   `SourceNode`, or an array where each member is one of those things.\n\n```js\nnode.add(\" + \");\nnode.add(otherNode);\nnode.add([leftHandOperandNode, \" + \", rightHandOperandNode]);\n```\n\n#### SourceNode.prototype.prepend(chunk)\n\nPrepend a chunk of generated JS to this source node.\n\n* `chunk`: A string snippet of generated JS code, another instance of\n   `SourceNode`, or an array where each member is one of those things.\n\n```js\nnode.prepend(\"/** Build Id: f783haef86324gf **/\\n\\n\");\n```\n\n#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)\n\nSet the source content for a source file. This will be added to the\n`SourceMap` in the `sourcesContent` field.\n\n* `sourceFile`: The filename of the source file\n\n* `sourceContent`: The content of the source file\n\n```js\nnode.setSourceContent(\"module-one.scm\",\n                      fs.readFileSync(\"path/to/module-one.scm\"))\n```\n\n#### SourceNode.prototype.walk(fn)\n\nWalk over the tree of JS snippets in this node and its children. The walking\nfunction is called once for each snippet of JS and is passed that snippet and\nthe its original associated source's line/column location.\n\n* `fn`: The traversal function.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n  new SourceNode(3, 4, \"b.js\", \"uno\"),\n  \"dos\",\n  [\n    \"tres\",\n    new SourceNode(5, 6, \"c.js\", \"quatro\")\n  ]\n]);\n\nnode.walk(function (code, loc) { console.log(\"WALK:\", code, loc); })\n// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }\n// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }\n// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }\n// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }\n```\n\n#### SourceNode.prototype.walkSourceContents(fn)\n\nWalk over the tree of SourceNodes. The walking function is called for each\nsource file content and is passed the filename and source content.\n\n* `fn`: The traversal function.\n\n```js\nvar a = new SourceNode(1, 2, \"a.js\", \"generated from a\");\na.setSourceContent(\"a.js\", \"original a\");\nvar b = new SourceNode(1, 2, \"b.js\", \"generated from b\");\nb.setSourceContent(\"b.js\", \"original b\");\nvar c = new SourceNode(1, 2, \"c.js\", \"generated from c\");\nc.setSourceContent(\"c.js\", \"original c\");\n\nvar node = new SourceNode(null, null, null, [a, b, c]);\nnode.walkSourceContents(function (source, contents) { console.log(\"WALK:\", source, \":\", contents); })\n// WALK: a.js : original a\n// WALK: b.js : original b\n// WALK: c.js : original c\n```\n\n#### SourceNode.prototype.join(sep)\n\nLike `Array.prototype.join` except for SourceNodes. Inserts the separator\nbetween each of this source node's children.\n\n* `sep`: The separator.\n\n```js\nvar lhs = new SourceNode(1, 2, \"a.rs\", \"my_copy\");\nvar operand = new SourceNode(3, 4, \"a.rs\", \"=\");\nvar rhs = new SourceNode(5, 6, \"a.rs\", \"orig.clone()\");\n\nvar node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);\nvar joinedNode = node.join(\" \");\n```\n\n#### SourceNode.prototype.replaceRight(pattern, replacement)\n\nCall `String.prototype.replace` on the very right-most source snippet. Useful\nfor trimming white space from the end of a source node, etc.\n\n* `pattern`: The pattern to replace.\n\n* `replacement`: The thing to replace the pattern with.\n\n```js\n// Trim trailing white space.\nnode.replaceRight(/\\s*$/, \"\");\n```\n\n#### SourceNode.prototype.toString()\n\nReturn the string representation of this source node. Walks over the tree and\nconcatenates all the various snippets together to one string.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n  new SourceNode(3, 4, \"b.js\", \"uno\"),\n  \"dos\",\n  [\n    \"tres\",\n    new SourceNode(5, 6, \"c.js\", \"quatro\")\n  ]\n]);\n\nnode.toString()\n// 'unodostresquatro'\n```\n\n#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])\n\nReturns the string representation of this tree of source nodes, plus a\nSourceMapGenerator which contains all the mappings between the generated and\noriginal sources.\n\nThe arguments are the same as those to `new SourceMapGenerator`.\n\n```js\nvar node = new SourceNode(1, 2, \"a.js\", [\n  new SourceNode(3, 4, \"b.js\", \"uno\"),\n  \"dos\",\n  [\n    \"tres\",\n    new SourceNode(5, 6, \"c.js\", \"quatro\")\n  ]\n]);\n\nnode.toStringWithSourceMap({ file: \"my-output-file.js\" })\n// { code: 'unodostresquatro',\n//   map: [object SourceMapGenerator] }\n```\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/dist/source-map.debug.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t * Copyright 2009-2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE.txt or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\n\texports.SourceNode = __webpack_require__(10).SourceNode;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar base64VLQ = __webpack_require__(2);\n\tvar util = __webpack_require__(4);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar MappingList = __webpack_require__(6).MappingList;\n\t\n\t/**\n\t * An instance of the SourceMapGenerator represents a source map which is\n\t * being built incrementally. You may pass an object with the following\n\t * properties:\n\t *\n\t *   - file: The filename of the generated source.\n\t *   - sourceRoot: A root for all relative URLs in this source map.\n\t */\n\tfunction SourceMapGenerator(aArgs) {\n\t  if (!aArgs) {\n\t    aArgs = {};\n\t  }\n\t  this._file = util.getArg(aArgs, 'file', null);\n\t  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n\t  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t  this._mappings = new MappingList();\n\t  this._sourcesContents = null;\n\t}\n\t\n\tSourceMapGenerator.prototype._version = 3;\n\t\n\t/**\n\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\n\t *\n\t * @param aSourceMapConsumer The SourceMap.\n\t */\n\tSourceMapGenerator.fromSourceMap =\n\t  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n\t    var sourceRoot = aSourceMapConsumer.sourceRoot;\n\t    var generator = new SourceMapGenerator({\n\t      file: aSourceMapConsumer.file,\n\t      sourceRoot: sourceRoot\n\t    });\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      var newMapping = {\n\t        generated: {\n\t          line: mapping.generatedLine,\n\t          column: mapping.generatedColumn\n\t        }\n\t      };\n\t\n\t      if (mapping.source != null) {\n\t        newMapping.source = mapping.source;\n\t        if (sourceRoot != null) {\n\t          newMapping.source = util.relative(sourceRoot, newMapping.source);\n\t        }\n\t\n\t        newMapping.original = {\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        };\n\t\n\t        if (mapping.name != null) {\n\t          newMapping.name = mapping.name;\n\t        }\n\t      }\n\t\n\t      generator.addMapping(newMapping);\n\t    });\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var sourceRelative = sourceFile;\n\t      if (sourceRoot !== null) {\n\t        sourceRelative = util.relative(sourceRoot, sourceFile);\n\t      }\n\t\n\t      if (!generator._sources.has(sourceRelative)) {\n\t        generator._sources.add(sourceRelative);\n\t      }\n\t\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        generator.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t    return generator;\n\t  };\n\t\n\t/**\n\t * Add a single mapping from original source line and column to the generated\n\t * source's line and column for this source map being created. The mapping\n\t * object should have the following properties:\n\t *\n\t *   - generated: An object with the generated line and column positions.\n\t *   - original: An object with the original line and column positions.\n\t *   - source: The original source file (relative to the sourceRoot).\n\t *   - name: An optional original token name for this mapping.\n\t */\n\tSourceMapGenerator.prototype.addMapping =\n\t  function SourceMapGenerator_addMapping(aArgs) {\n\t    var generated = util.getArg(aArgs, 'generated');\n\t    var original = util.getArg(aArgs, 'original', null);\n\t    var source = util.getArg(aArgs, 'source', null);\n\t    var name = util.getArg(aArgs, 'name', null);\n\t\n\t    if (!this._skipValidation) {\n\t      this._validateMapping(generated, original, source, name);\n\t    }\n\t\n\t    if (source != null) {\n\t      source = String(source);\n\t      if (!this._sources.has(source)) {\n\t        this._sources.add(source);\n\t      }\n\t    }\n\t\n\t    if (name != null) {\n\t      name = String(name);\n\t      if (!this._names.has(name)) {\n\t        this._names.add(name);\n\t      }\n\t    }\n\t\n\t    this._mappings.add({\n\t      generatedLine: generated.line,\n\t      generatedColumn: generated.column,\n\t      originalLine: original != null && original.line,\n\t      originalColumn: original != null && original.column,\n\t      source: source,\n\t      name: name\n\t    });\n\t  };\n\t\n\t/**\n\t * Set the source content for a source file.\n\t */\n\tSourceMapGenerator.prototype.setSourceContent =\n\t  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n\t    var source = aSourceFile;\n\t    if (this._sourceRoot != null) {\n\t      source = util.relative(this._sourceRoot, source);\n\t    }\n\t\n\t    if (aSourceContent != null) {\n\t      // Add the source content to the _sourcesContents map.\n\t      // Create a new _sourcesContents map if the property is null.\n\t      if (!this._sourcesContents) {\n\t        this._sourcesContents = Object.create(null);\n\t      }\n\t      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n\t    } else if (this._sourcesContents) {\n\t      // Remove the source file from the _sourcesContents map.\n\t      // If the _sourcesContents map is empty, set the property to null.\n\t      delete this._sourcesContents[util.toSetString(source)];\n\t      if (Object.keys(this._sourcesContents).length === 0) {\n\t        this._sourcesContents = null;\n\t      }\n\t    }\n\t  };\n\t\n\t/**\n\t * Applies the mappings of a sub-source-map for a specific source file to the\n\t * source map being generated. Each mapping to the supplied source file is\n\t * rewritten using the supplied source map. Note: The resolution for the\n\t * resulting mappings is the minimium of this map and the supplied map.\n\t *\n\t * @param aSourceMapConsumer The source map to be applied.\n\t * @param aSourceFile Optional. The filename of the source file.\n\t *        If omitted, SourceMapConsumer's file property will be used.\n\t * @param aSourceMapPath Optional. The dirname of the path to the source map\n\t *        to be applied. If relative, it is relative to the SourceMapConsumer.\n\t *        This parameter is needed when the two source maps aren't in the same\n\t *        directory, and the source map to be applied contains relative source\n\t *        paths. If so, those relative source paths need to be rewritten\n\t *        relative to the SourceMapGenerator.\n\t */\n\tSourceMapGenerator.prototype.applySourceMap =\n\t  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n\t    var sourceFile = aSourceFile;\n\t    // If aSourceFile is omitted, we will use the file property of the SourceMap\n\t    if (aSourceFile == null) {\n\t      if (aSourceMapConsumer.file == null) {\n\t        throw new Error(\n\t          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n\t          'or the source map\\'s \"file\" property. Both were omitted.'\n\t        );\n\t      }\n\t      sourceFile = aSourceMapConsumer.file;\n\t    }\n\t    var sourceRoot = this._sourceRoot;\n\t    // Make \"sourceFile\" relative if an absolute Url is passed.\n\t    if (sourceRoot != null) {\n\t      sourceFile = util.relative(sourceRoot, sourceFile);\n\t    }\n\t    // Applying the SourceMap can add and remove items from the sources and\n\t    // the names array.\n\t    var newSources = new ArraySet();\n\t    var newNames = new ArraySet();\n\t\n\t    // Find mappings for the \"sourceFile\"\n\t    this._mappings.unsortedForEach(function (mapping) {\n\t      if (mapping.source === sourceFile && mapping.originalLine != null) {\n\t        // Check if it can be mapped by the source map, then update the mapping.\n\t        var original = aSourceMapConsumer.originalPositionFor({\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        });\n\t        if (original.source != null) {\n\t          // Copy mapping\n\t          mapping.source = original.source;\n\t          if (aSourceMapPath != null) {\n\t            mapping.source = util.join(aSourceMapPath, mapping.source)\n\t          }\n\t          if (sourceRoot != null) {\n\t            mapping.source = util.relative(sourceRoot, mapping.source);\n\t          }\n\t          mapping.originalLine = original.line;\n\t          mapping.originalColumn = original.column;\n\t          if (original.name != null) {\n\t            mapping.name = original.name;\n\t          }\n\t        }\n\t      }\n\t\n\t      var source = mapping.source;\n\t      if (source != null && !newSources.has(source)) {\n\t        newSources.add(source);\n\t      }\n\t\n\t      var name = mapping.name;\n\t      if (name != null && !newNames.has(name)) {\n\t        newNames.add(name);\n\t      }\n\t\n\t    }, this);\n\t    this._sources = newSources;\n\t    this._names = newNames;\n\t\n\t    // Copy sourcesContents of applied map.\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aSourceMapPath != null) {\n\t          sourceFile = util.join(aSourceMapPath, sourceFile);\n\t        }\n\t        if (sourceRoot != null) {\n\t          sourceFile = util.relative(sourceRoot, sourceFile);\n\t        }\n\t        this.setSourceContent(sourceFile, content);\n\t      }\n\t    }, this);\n\t  };\n\t\n\t/**\n\t * A mapping can have one of the three levels of data:\n\t *\n\t *   1. Just the generated position.\n\t *   2. The Generated position, original position, and original source.\n\t *   3. Generated and original position, original source, as well as a name\n\t *      token.\n\t *\n\t * To maintain consistency, we validate that any new mapping being added falls\n\t * in to one of these categories.\n\t */\n\tSourceMapGenerator.prototype._validateMapping =\n\t  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n\t                                              aName) {\n\t    // When aOriginal is truthy but has empty values for .line and .column,\n\t    // it is most likely a programmer error. In this case we throw a very\n\t    // specific error message to try to guide them the right way.\n\t    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n\t    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n\t        throw new Error(\n\t            'original.line and original.column are not numbers -- you probably meant to omit ' +\n\t            'the original mapping entirely and only map the generated position. If so, pass ' +\n\t            'null for the original mapping instead of an object with empty or null values.'\n\t        );\n\t    }\n\t\n\t    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t        && aGenerated.line > 0 && aGenerated.column >= 0\n\t        && !aOriginal && !aSource && !aName) {\n\t      // Case 1.\n\t      return;\n\t    }\n\t    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t             && aGenerated.line > 0 && aGenerated.column >= 0\n\t             && aOriginal.line > 0 && aOriginal.column >= 0\n\t             && aSource) {\n\t      // Cases 2 and 3.\n\t      return;\n\t    }\n\t    else {\n\t      throw new Error('Invalid mapping: ' + JSON.stringify({\n\t        generated: aGenerated,\n\t        source: aSource,\n\t        original: aOriginal,\n\t        name: aName\n\t      }));\n\t    }\n\t  };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t  function SourceMapGenerator_serializeMappings() {\n\t    var previousGeneratedColumn = 0;\n\t    var previousGeneratedLine = 1;\n\t    var previousOriginalColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousName = 0;\n\t    var previousSource = 0;\n\t    var result = '';\n\t    var next;\n\t    var mapping;\n\t    var nameIdx;\n\t    var sourceIdx;\n\t\n\t    var mappings = this._mappings.toArray();\n\t    for (var i = 0, len = mappings.length; i < len; i++) {\n\t      mapping = mappings[i];\n\t      next = ''\n\t\n\t      if (mapping.generatedLine !== previousGeneratedLine) {\n\t        previousGeneratedColumn = 0;\n\t        while (mapping.generatedLine !== previousGeneratedLine) {\n\t          next += ';';\n\t          previousGeneratedLine++;\n\t        }\n\t      }\n\t      else {\n\t        if (i > 0) {\n\t          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t            continue;\n\t          }\n\t          next += ',';\n\t        }\n\t      }\n\t\n\t      next += base64VLQ.encode(mapping.generatedColumn\n\t                                 - previousGeneratedColumn);\n\t      previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t      if (mapping.source != null) {\n\t        sourceIdx = this._sources.indexOf(mapping.source);\n\t        next += base64VLQ.encode(sourceIdx - previousSource);\n\t        previousSource = sourceIdx;\n\t\n\t        // lines are stored 0-based in SourceMap spec version 3\n\t        next += base64VLQ.encode(mapping.originalLine - 1\n\t                                   - previousOriginalLine);\n\t        previousOriginalLine = mapping.originalLine - 1;\n\t\n\t        next += base64VLQ.encode(mapping.originalColumn\n\t                                   - previousOriginalColumn);\n\t        previousOriginalColumn = mapping.originalColumn;\n\t\n\t        if (mapping.name != null) {\n\t          nameIdx = this._names.indexOf(mapping.name);\n\t          next += base64VLQ.encode(nameIdx - previousName);\n\t          previousName = nameIdx;\n\t        }\n\t      }\n\t\n\t      result += next;\n\t    }\n\t\n\t    return result;\n\t  };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t    return aSources.map(function (source) {\n\t      if (!this._sourcesContents) {\n\t        return null;\n\t      }\n\t      if (aSourceRoot != null) {\n\t        source = util.relative(aSourceRoot, source);\n\t      }\n\t      var key = util.toSetString(source);\n\t      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t        ? this._sourcesContents[key]\n\t        : null;\n\t    }, this);\n\t  };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t  function SourceMapGenerator_toJSON() {\n\t    var map = {\n\t      version: this._version,\n\t      sources: this._sources.toArray(),\n\t      names: this._names.toArray(),\n\t      mappings: this._serializeMappings()\n\t    };\n\t    if (this._file != null) {\n\t      map.file = this._file;\n\t    }\n\t    if (this._sourceRoot != null) {\n\t      map.sourceRoot = this._sourceRoot;\n\t    }\n\t    if (this._sourcesContents) {\n\t      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t    }\n\t\n\t    return map;\n\t  };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t  function SourceMapGenerator_toString() {\n\t    return JSON.stringify(this.toJSON());\n\t  };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t *  * Redistributions of source code must retain the above copyright\n\t *    notice, this list of conditions and the following disclaimer.\n\t *  * Redistributions in binary form must reproduce the above\n\t *    copyright notice, this list of conditions and the following\n\t *    disclaimer in the documentation and/or other materials provided\n\t *    with the distribution.\n\t *  * Neither the name of Google Inc. nor the names of its\n\t *    contributors may be used to endorse or promote products derived\n\t *    from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t//   Continuation\n\t//   |    Sign\n\t//   |    |\n\t//   V    V\n\t//   101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t  return aValue < 0\n\t    ? ((-aValue) << 1) + 1\n\t    : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t  var isNegative = (aValue & 1) === 1;\n\t  var shifted = aValue >> 1;\n\t  return isNegative\n\t    ? -shifted\n\t    : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t  var encoded = \"\";\n\t  var digit;\n\t\n\t  var vlq = toVLQSigned(aValue);\n\t\n\t  do {\n\t    digit = vlq & VLQ_BASE_MASK;\n\t    vlq >>>= VLQ_BASE_SHIFT;\n\t    if (vlq > 0) {\n\t      // There are still more digits in this value, so we must make sure the\n\t      // continuation bit is marked.\n\t      digit |= VLQ_CONTINUATION_BIT;\n\t    }\n\t    encoded += base64.encode(digit);\n\t  } while (vlq > 0);\n\t\n\t  return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t  var strLen = aStr.length;\n\t  var result = 0;\n\t  var shift = 0;\n\t  var continuation, digit;\n\t\n\t  do {\n\t    if (aIndex >= strLen) {\n\t      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t    }\n\t\n\t    digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t    if (digit === -1) {\n\t      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t    }\n\t\n\t    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t    digit &= VLQ_BASE_MASK;\n\t    result = result + (digit << shift);\n\t    shift += VLQ_BASE_SHIFT;\n\t  } while (continuation);\n\t\n\t  aOutParam.value = fromVLQSigned(result);\n\t  aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t  if (0 <= number && number < intToCharMap.length) {\n\t    return intToCharMap[number];\n\t  }\n\t  throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t  var bigA = 65;     // 'A'\n\t  var bigZ = 90;     // 'Z'\n\t\n\t  var littleA = 97;  // 'a'\n\t  var littleZ = 122; // 'z'\n\t\n\t  var zero = 48;     // '0'\n\t  var nine = 57;     // '9'\n\t\n\t  var plus = 43;     // '+'\n\t  var slash = 47;    // '/'\n\t\n\t  var littleOffset = 26;\n\t  var numberOffset = 52;\n\t\n\t  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t  if (bigA <= charCode && charCode <= bigZ) {\n\t    return (charCode - bigA);\n\t  }\n\t\n\t  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t  if (littleA <= charCode && charCode <= littleZ) {\n\t    return (charCode - littleA + littleOffset);\n\t  }\n\t\n\t  // 52 - 61: 0123456789\n\t  if (zero <= charCode && charCode <= nine) {\n\t    return (charCode - zero + numberOffset);\n\t  }\n\t\n\t  // 62: +\n\t  if (charCode == plus) {\n\t    return 62;\n\t  }\n\t\n\t  // 63: /\n\t  if (charCode == slash) {\n\t    return 63;\n\t  }\n\t\n\t  // Invalid base64 digit.\n\t  return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t  if (aName in aArgs) {\n\t    return aArgs[aName];\n\t  } else if (arguments.length === 3) {\n\t    return aDefaultValue;\n\t  } else {\n\t    throw new Error('\"' + aName + '\" is a required argument.');\n\t  }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t  var match = aUrl.match(urlRegexp);\n\t  if (!match) {\n\t    return null;\n\t  }\n\t  return {\n\t    scheme: match[1],\n\t    auth: match[2],\n\t    host: match[3],\n\t    port: match[4],\n\t    path: match[5]\n\t  };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t  var url = '';\n\t  if (aParsedUrl.scheme) {\n\t    url += aParsedUrl.scheme + ':';\n\t  }\n\t  url += '//';\n\t  if (aParsedUrl.auth) {\n\t    url += aParsedUrl.auth + '@';\n\t  }\n\t  if (aParsedUrl.host) {\n\t    url += aParsedUrl.host;\n\t  }\n\t  if (aParsedUrl.port) {\n\t    url += \":\" + aParsedUrl.port\n\t  }\n\t  if (aParsedUrl.path) {\n\t    url += aParsedUrl.path;\n\t  }\n\t  return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '<dir>/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t  var path = aPath;\n\t  var url = urlParse(aPath);\n\t  if (url) {\n\t    if (!url.path) {\n\t      return aPath;\n\t    }\n\t    path = url.path;\n\t  }\n\t  var isAbsolute = exports.isAbsolute(path);\n\t\n\t  var parts = path.split(/\\/+/);\n\t  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t    part = parts[i];\n\t    if (part === '.') {\n\t      parts.splice(i, 1);\n\t    } else if (part === '..') {\n\t      up++;\n\t    } else if (up > 0) {\n\t      if (part === '') {\n\t        // The first part is blank if the path is absolute. Trying to go\n\t        // above the root is a no-op. Therefore we can remove all '..' parts\n\t        // directly after the root.\n\t        parts.splice(i + 1, up);\n\t        up = 0;\n\t      } else {\n\t        parts.splice(i, 2);\n\t        up--;\n\t      }\n\t    }\n\t  }\n\t  path = parts.join('/');\n\t\n\t  if (path === '') {\n\t    path = isAbsolute ? '/' : '.';\n\t  }\n\t\n\t  if (url) {\n\t    url.path = path;\n\t    return urlGenerate(url);\n\t  }\n\t  return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t *   first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t *   is updated with the result and aRoot is returned. Otherwise the result\n\t *   is returned.\n\t *   - If aPath is absolute, the result is aPath.\n\t *   - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t  if (aPath === \"\") {\n\t    aPath = \".\";\n\t  }\n\t  var aPathUrl = urlParse(aPath);\n\t  var aRootUrl = urlParse(aRoot);\n\t  if (aRootUrl) {\n\t    aRoot = aRootUrl.path || '/';\n\t  }\n\t\n\t  // `join(foo, '//www.example.org')`\n\t  if (aPathUrl && !aPathUrl.scheme) {\n\t    if (aRootUrl) {\n\t      aPathUrl.scheme = aRootUrl.scheme;\n\t    }\n\t    return urlGenerate(aPathUrl);\n\t  }\n\t\n\t  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t    return aPath;\n\t  }\n\t\n\t  // `join('http://', 'www.example.com')`\n\t  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t    aRootUrl.host = aPath;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t\n\t  var joined = aPath.charAt(0) === '/'\n\t    ? aPath\n\t    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t  if (aRootUrl) {\n\t    aRootUrl.path = joined;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t  return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t\n\t  aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t  // It is possible for the path to be above the root. In this case, simply\n\t  // checking whether the root is a prefix of the path won't work. Instead, we\n\t  // need to remove components from the root one by one, until either we find\n\t  // a prefix that fits, or we run out of components to remove.\n\t  var level = 0;\n\t  while (aPath.indexOf(aRoot + '/') !== 0) {\n\t    var index = aRoot.lastIndexOf(\"/\");\n\t    if (index < 0) {\n\t      return aPath;\n\t    }\n\t\n\t    // If the only part of the root that is left is the scheme (i.e. http://,\n\t    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t    // have exhausted all components, so the path is not relative to the root.\n\t    aRoot = aRoot.slice(0, index);\n\t    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t      return aPath;\n\t    }\n\t\n\t    ++level;\n\t  }\n\t\n\t  // Make sure we add a \"../\" for each component we removed from the root.\n\t  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t  var obj = Object.create(null);\n\t  return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t  return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return '$' + aStr;\n\t  }\n\t\n\t  return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return aStr.slice(1);\n\t  }\n\t\n\t  return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t  if (!s) {\n\t    return false;\n\t  }\n\t\n\t  var length = s.length;\n\t\n\t  if (length < 9 /* \"__proto__\".length */) {\n\t    return false;\n\t  }\n\t\n\t  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n\t    return false;\n\t  }\n\t\n\t  for (var i = length - 10; i >= 0; i--) {\n\t    if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t      return false;\n\t    }\n\t  }\n\t\n\t  return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t  var cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0 || onlyCompareOriginal) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0 || onlyCompareGenerated) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t  if (aStr1 === aStr2) {\n\t    return 0;\n\t  }\n\t\n\t  if (aStr1 === null) {\n\t    return 1; // aStr2 !== null\n\t  }\n\t\n\t  if (aStr2 === null) {\n\t    return -1; // aStr1 !== null\n\t  }\n\t\n\t  if (aStr1 > aStr2) {\n\t    return 1;\n\t  }\n\t\n\t  return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\t\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\t\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t  sourceURL = sourceURL || '';\n\t\n\t  if (sourceRoot) {\n\t    // This follows what Chrome does.\n\t    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t      sourceRoot += '/';\n\t    }\n\t    // The spec says:\n\t    //   Line 4: An optional source root, useful for relocating source\n\t    //   files on a server or removing repeated values in the\n\t    //   “sources” entry.  This value is prepended to the individual\n\t    //   entries in the “source” field.\n\t    sourceURL = sourceRoot + sourceURL;\n\t  }\n\t\n\t  // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t  // a parameter.  This mode is still somewhat supported, which is why\n\t  // this code block is conditional.  However, it's preferable to pass\n\t  // the source map URL to SourceMapConsumer, so that this function\n\t  // can implement the source URL resolution algorithm as outlined in\n\t  // the spec.  This block is basically the equivalent of:\n\t  //    new URL(sourceURL, sourceMapURL).toString()\n\t  // ... except it avoids using URL, which wasn't available in the\n\t  // older releases of node still supported by this library.\n\t  //\n\t  // The spec says:\n\t  //   If the sources are not absolute URLs after prepending of the\n\t  //   “sourceRoot”, the sources are resolved relative to the\n\t  //   SourceMap (like resolving script src in a html document).\n\t  if (sourceMapURL) {\n\t    var parsed = urlParse(sourceMapURL);\n\t    if (!parsed) {\n\t      throw new Error(\"sourceMapURL could not be parsed\");\n\t    }\n\t    if (parsed.path) {\n\t      // Strip the last path component, but keep the \"/\".\n\t      var index = parsed.path.lastIndexOf('/');\n\t      if (index >= 0) {\n\t        parsed.path = parsed.path.substring(0, index + 1);\n\t      }\n\t    }\n\t    sourceURL = join(urlGenerate(parsed), sourceURL);\n\t  }\n\t\n\t  return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t  this._array = [];\n\t  this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t  var set = new ArraySet();\n\t  for (var i = 0, len = aArray.length; i < len; i++) {\n\t    set.add(aArray[i], aAllowDuplicates);\n\t  }\n\t  return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t  var idx = this._array.length;\n\t  if (!isDuplicate || aAllowDuplicates) {\n\t    this._array.push(aStr);\n\t  }\n\t  if (!isDuplicate) {\n\t    if (hasNativeMap) {\n\t      this._set.set(aStr, idx);\n\t    } else {\n\t      this._set[sStr] = idx;\n\t    }\n\t  }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t  if (hasNativeMap) {\n\t    return this._set.has(aStr);\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    return has.call(this._set, sStr);\n\t  }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t  if (hasNativeMap) {\n\t    var idx = this._set.get(aStr);\n\t    if (idx >= 0) {\n\t        return idx;\n\t    }\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    if (has.call(this._set, sStr)) {\n\t      return this._set[sStr];\n\t    }\n\t  }\n\t\n\t  throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t  if (aIdx >= 0 && aIdx < this._array.length) {\n\t    return this._array[aIdx];\n\t  }\n\t  throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t  return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t  // Optimized for most common case\n\t  var lineA = mappingA.generatedLine;\n\t  var lineB = mappingB.generatedLine;\n\t  var columnA = mappingA.generatedColumn;\n\t  var columnB = mappingB.generatedColumn;\n\t  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t  this._array = [];\n\t  this._sorted = true;\n\t  // Serves as infimum\n\t  this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t  function MappingList_forEach(aCallback, aThisArg) {\n\t    this._array.forEach(aCallback, aThisArg);\n\t  };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t  if (generatedPositionAfter(this._last, aMapping)) {\n\t    this._last = aMapping;\n\t    this._array.push(aMapping);\n\t  } else {\n\t    this._sorted = false;\n\t    this._array.push(aMapping);\n\t  }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t  if (!this._sorted) {\n\t    this._array.sort(util.compareByGeneratedPositionsInflated);\n\t    this._sorted = true;\n\t  }\n\t  return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  return sourceMap.sections != null\n\t    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t//     {\n\t//       generatedLine: The line number in the generated code,\n\t//       generatedColumn: The column number in the generated code,\n\t//       source: The path to the original source file that generated this\n\t//               chunk of code,\n\t//       originalLine: The line number in the original source that\n\t//                     corresponds to this chunk of generated code,\n\t//       originalColumn: The column number in the original source that\n\t//                       corresponds to this chunk of generated code,\n\t//       name: The name of the original symbol which generated this chunk of\n\t//             code.\n\t//     }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__generatedMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\t\n\t    return this.__generatedMappings;\n\t  }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__originalMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\t\n\t    return this.__originalMappings;\n\t  }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t    var c = aStr.charAt(index);\n\t    return c === \";\" || c === \",\";\n\t  };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    throw new Error(\"Subclasses must implement _parseMappings\");\n\t  };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t *        The function that is called with each mapping.\n\t * @param Object aContext\n\t *        Optional. If specified, this object will be the value of `this` every\n\t *        time that `aCallback` is called.\n\t * @param aOrder\n\t *        Either `SourceMapConsumer.GENERATED_ORDER` or\n\t *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t *        iterate over the mappings sorted by the generated file's line/column\n\t *        order or the original's source/line/column order, respectively. Defaults to\n\t *        `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t    var context = aContext || null;\n\t    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t    var mappings;\n\t    switch (order) {\n\t    case SourceMapConsumer.GENERATED_ORDER:\n\t      mappings = this._generatedMappings;\n\t      break;\n\t    case SourceMapConsumer.ORIGINAL_ORDER:\n\t      mappings = this._originalMappings;\n\t      break;\n\t    default:\n\t      throw new Error(\"Unknown order of iteration.\");\n\t    }\n\t\n\t    var sourceRoot = this.sourceRoot;\n\t    mappings.map(function (mapping) {\n\t      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n\t      return {\n\t        source: source,\n\t        generatedLine: mapping.generatedLine,\n\t        generatedColumn: mapping.generatedColumn,\n\t        originalLine: mapping.originalLine,\n\t        originalColumn: mapping.originalColumn,\n\t        name: mapping.name === null ? null : this._names.at(mapping.name)\n\t      };\n\t    }, this).forEach(aCallback, context);\n\t  };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number is 1-based.\n\t *   - column: Optional. the column number in the original source.\n\t *    The column number is 0-based.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *    line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *    The column number is 0-based.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t    var line = util.getArg(aArgs, 'line');\n\t\n\t    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t    // returns the index of the closest mapping less than the needle. By\n\t    // setting needle.originalColumn to 0, we thus find the last mapping for\n\t    // the given line, provided such a mapping exists.\n\t    var needle = {\n\t      source: util.getArg(aArgs, 'source'),\n\t      originalLine: line,\n\t      originalColumn: util.getArg(aArgs, 'column', 0)\n\t    };\n\t\n\t    needle.source = this._findSourceIndex(needle.source);\n\t    if (needle.source < 0) {\n\t      return [];\n\t    }\n\t\n\t    var mappings = [];\n\t\n\t    var index = this._findMapping(needle,\n\t                                  this._originalMappings,\n\t                                  \"originalLine\",\n\t                                  \"originalColumn\",\n\t                                  util.compareByOriginalPositions,\n\t                                  binarySearch.LEAST_UPPER_BOUND);\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\t\n\t      if (aArgs.column === undefined) {\n\t        var originalLine = mapping.originalLine;\n\t\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we found. Since\n\t        // mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we found.\n\t        while (mapping && mapping.originalLine === originalLine) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\t\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      } else {\n\t        var originalColumn = mapping.originalColumn;\n\t\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we were searching for.\n\t        // Since mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we are searching for.\n\t        while (mapping &&\n\t               mapping.originalLine === line &&\n\t               mapping.originalColumn == originalColumn) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\t\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      }\n\t    }\n\t\n\t    return mappings;\n\t  };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The first parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - sources: An array of URLs to the original source files.\n\t *   - names: An array of identifiers which can be referrenced by individual mappings.\n\t *   - sourceRoot: Optional. The URL root from which all sources are relative.\n\t *   - sourcesContent: Optional. An array of contents of the original source files.\n\t *   - mappings: A string of base64 VLQs which contain the actual mappings.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t *     {\n\t *       version : 3,\n\t *       file: \"out.js\",\n\t *       sourceRoot : \"\",\n\t *       sources: [\"foo.js\", \"bar.js\"],\n\t *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *       mappings: \"AA,AB;;ABCDE;\"\n\t *     }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sources = util.getArg(sourceMap, 'sources');\n\t  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t  // requires the array) to play nice here.\n\t  var names = util.getArg(sourceMap, 'names', []);\n\t  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t  var mappings = util.getArg(sourceMap, 'mappings');\n\t  var file = util.getArg(sourceMap, 'file', null);\n\t\n\t  // Once again, Sass deviates from the spec and supplies the version as a\n\t  // string rather than a number, so we use loose equality checking here.\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\t\n\t  if (sourceRoot) {\n\t    sourceRoot = util.normalize(sourceRoot);\n\t  }\n\t\n\t  sources = sources\n\t    .map(String)\n\t    // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n\t    // See bugzil.la/1090768.\n\t    .map(util.normalize)\n\t    // Always ensure that absolute sources are internally stored relative to\n\t    // the source root, if the source root is absolute. Not doing this would\n\t    // be particularly problematic when the source root is a prefix of the\n\t    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t    .map(function (source) {\n\t      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t        ? util.relative(sourceRoot, source)\n\t        : source;\n\t    });\n\t\n\t  // Pass `true` below to allow duplicate names and sources. While source maps\n\t  // are intended to be compressed and deduplicated, the TypeScript compiler\n\t  // sometimes generates source maps with duplicates in them. See Github issue\n\t  // #72 and bugzil.la/889492.\n\t  this._names = ArraySet.fromArray(names.map(String), true);\n\t  this._sources = ArraySet.fromArray(sources, true);\n\t\n\t  this._absoluteSources = this._sources.toArray().map(function (s) {\n\t    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t  });\n\t\n\t  this.sourceRoot = sourceRoot;\n\t  this.sourcesContent = sourcesContent;\n\t  this._mappings = mappings;\n\t  this._sourceMapURL = aSourceMapURL;\n\t  this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Utility function to find the index of a source.  Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t  var relativeSource = aSource;\n\t  if (this.sourceRoot != null) {\n\t    relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t  }\n\t\n\t  if (this._sources.has(relativeSource)) {\n\t    return this._sources.indexOf(relativeSource);\n\t  }\n\t\n\t  // Maybe aSource is an absolute URL as returned by |sources|.  In\n\t  // this case we can't simply undo the transform.\n\t  var i;\n\t  for (i = 0; i < this._absoluteSources.length; ++i) {\n\t    if (this._absoluteSources[i] == aSource) {\n\t      return i;\n\t    }\n\t  }\n\t\n\t  return -1;\n\t};\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t *        The source map that will be consumed.\n\t * @param String aSourceMapURL\n\t *        The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n\t    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t    smc.sourceRoot = aSourceMap._sourceRoot;\n\t    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t                                                            smc.sourceRoot);\n\t    smc.file = aSourceMap._file;\n\t    smc._sourceMapURL = aSourceMapURL;\n\t    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t    });\n\t\n\t    // Because we are modifying the entries (by converting string sources and\n\t    // names to indices into the sources and names ArraySets), we have to make\n\t    // a copy of the entry or else bad things happen. Shared mutable state\n\t    // strikes again! See github issue #191.\n\t\n\t    var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t    var destGeneratedMappings = smc.__generatedMappings = [];\n\t    var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t      var srcMapping = generatedMappings[i];\n\t      var destMapping = new Mapping;\n\t      destMapping.generatedLine = srcMapping.generatedLine;\n\t      destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t      if (srcMapping.source) {\n\t        destMapping.source = sources.indexOf(srcMapping.source);\n\t        destMapping.originalLine = srcMapping.originalLine;\n\t        destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t        if (srcMapping.name) {\n\t          destMapping.name = names.indexOf(srcMapping.name);\n\t        }\n\t\n\t        destOriginalMappings.push(destMapping);\n\t      }\n\t\n\t      destGeneratedMappings.push(destMapping);\n\t    }\n\t\n\t    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t    return smc;\n\t  };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    return this._absoluteSources.slice();\n\t  }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t  this.generatedLine = 0;\n\t  this.generatedColumn = 0;\n\t  this.source = null;\n\t  this.originalLine = null;\n\t  this.originalColumn = null;\n\t  this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    var generatedLine = 1;\n\t    var previousGeneratedColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousOriginalColumn = 0;\n\t    var previousSource = 0;\n\t    var previousName = 0;\n\t    var length = aStr.length;\n\t    var index = 0;\n\t    var cachedSegments = {};\n\t    var temp = {};\n\t    var originalMappings = [];\n\t    var generatedMappings = [];\n\t    var mapping, str, segment, end, value;\n\t\n\t    while (index < length) {\n\t      if (aStr.charAt(index) === ';') {\n\t        generatedLine++;\n\t        index++;\n\t        previousGeneratedColumn = 0;\n\t      }\n\t      else if (aStr.charAt(index) === ',') {\n\t        index++;\n\t      }\n\t      else {\n\t        mapping = new Mapping();\n\t        mapping.generatedLine = generatedLine;\n\t\n\t        // Because each offset is encoded relative to the previous one,\n\t        // many segments often have the same encoding. We can exploit this\n\t        // fact by caching the parsed variable length fields of each segment,\n\t        // allowing us to avoid a second parse if we encounter the same\n\t        // segment again.\n\t        for (end = index; end < length; end++) {\n\t          if (this._charIsMappingSeparator(aStr, end)) {\n\t            break;\n\t          }\n\t        }\n\t        str = aStr.slice(index, end);\n\t\n\t        segment = cachedSegments[str];\n\t        if (segment) {\n\t          index += str.length;\n\t        } else {\n\t          segment = [];\n\t          while (index < end) {\n\t            base64VLQ.decode(aStr, index, temp);\n\t            value = temp.value;\n\t            index = temp.rest;\n\t            segment.push(value);\n\t          }\n\t\n\t          if (segment.length === 2) {\n\t            throw new Error('Found a source, but no line and column');\n\t          }\n\t\n\t          if (segment.length === 3) {\n\t            throw new Error('Found a source and line, but no column');\n\t          }\n\t\n\t          cachedSegments[str] = segment;\n\t        }\n\t\n\t        // Generated column.\n\t        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t        previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t        if (segment.length > 1) {\n\t          // Original source.\n\t          mapping.source = previousSource + segment[1];\n\t          previousSource += segment[1];\n\t\n\t          // Original line.\n\t          mapping.originalLine = previousOriginalLine + segment[2];\n\t          previousOriginalLine = mapping.originalLine;\n\t          // Lines are stored 0-based\n\t          mapping.originalLine += 1;\n\t\n\t          // Original column.\n\t          mapping.originalColumn = previousOriginalColumn + segment[3];\n\t          previousOriginalColumn = mapping.originalColumn;\n\t\n\t          if (segment.length > 4) {\n\t            // Original name.\n\t            mapping.name = previousName + segment[4];\n\t            previousName += segment[4];\n\t          }\n\t        }\n\t\n\t        generatedMappings.push(mapping);\n\t        if (typeof mapping.originalLine === 'number') {\n\t          originalMappings.push(mapping);\n\t        }\n\t      }\n\t    }\n\t\n\t    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    this.__generatedMappings = generatedMappings;\n\t\n\t    quickSort(originalMappings, util.compareByOriginalPositions);\n\t    this.__originalMappings = originalMappings;\n\t  };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t                                         aColumnName, aComparator, aBias) {\n\t    // To return the position we are searching for, we must first find the\n\t    // mapping for the given position and then return the opposite position it\n\t    // points to. Because the mappings are sorted, we can use binary search to\n\t    // find the best mapping.\n\t\n\t    if (aNeedle[aLineName] <= 0) {\n\t      throw new TypeError('Line must be greater than or equal to 1, got '\n\t                          + aNeedle[aLineName]);\n\t    }\n\t    if (aNeedle[aColumnName] < 0) {\n\t      throw new TypeError('Column must be greater than or equal to 0, got '\n\t                          + aNeedle[aColumnName]);\n\t    }\n\t\n\t    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t  };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t  function SourceMapConsumer_computeColumnSpans() {\n\t    for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t      var mapping = this._generatedMappings[index];\n\t\n\t      // Mappings do not contain a field for the last generated columnt. We\n\t      // can come up with an optimistic estimate, however, by assuming that\n\t      // mappings are contiguous (i.e. given two consecutive mappings, the\n\t      // first mapping ends where the second one starts).\n\t      if (index + 1 < this._generatedMappings.length) {\n\t        var nextMapping = this._generatedMappings[index + 1];\n\t\n\t        if (mapping.generatedLine === nextMapping.generatedLine) {\n\t          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t          continue;\n\t        }\n\t      }\n\t\n\t      // The last mapping for each line spans the entire line.\n\t      mapping.lastGeneratedColumn = Infinity;\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t  function SourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._generatedMappings,\n\t      \"generatedLine\",\n\t      \"generatedColumn\",\n\t      util.compareByGeneratedPositionsDeflated,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\t\n\t    if (index >= 0) {\n\t      var mapping = this._generatedMappings[index];\n\t\n\t      if (mapping.generatedLine === needle.generatedLine) {\n\t        var source = util.getArg(mapping, 'source', null);\n\t        if (source !== null) {\n\t          source = this._sources.at(source);\n\t          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n\t        }\n\t        var name = util.getArg(mapping, 'name', null);\n\t        if (name !== null) {\n\t          name = this._names.at(name);\n\t        }\n\t        return {\n\t          source: source,\n\t          line: util.getArg(mapping, 'originalLine', null),\n\t          column: util.getArg(mapping, 'originalColumn', null),\n\t          name: name\n\t        };\n\t      }\n\t    }\n\t\n\t    return {\n\t      source: null,\n\t      line: null,\n\t      column: null,\n\t      name: null\n\t    };\n\t  };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t    if (!this.sourcesContent) {\n\t      return false;\n\t    }\n\t    return this.sourcesContent.length >= this._sources.size() &&\n\t      !this.sourcesContent.some(function (sc) { return sc == null; });\n\t  };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    if (!this.sourcesContent) {\n\t      return null;\n\t    }\n\t\n\t    var index = this._findSourceIndex(aSource);\n\t    if (index >= 0) {\n\t      return this.sourcesContent[index];\n\t    }\n\t\n\t    var relativeSource = aSource;\n\t    if (this.sourceRoot != null) {\n\t      relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t    }\n\t\n\t    var url;\n\t    if (this.sourceRoot != null\n\t        && (url = util.urlParse(this.sourceRoot))) {\n\t      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t      // many users. We can help them out when they expect file:// URIs to\n\t      // behave like it would if they were running a local HTTP server. See\n\t      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n\t      if (url.scheme == \"file\"\n\t          && this._sources.has(fileUriAbsPath)) {\n\t        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t      }\n\t\n\t      if ((!url.path || url.path == \"/\")\n\t          && this._sources.has(\"/\" + relativeSource)) {\n\t        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n\t      }\n\t    }\n\t\n\t    // This function is used recursively from\n\t    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t    // don't want to throw if we can't find the source - we just want to\n\t    // return null, so we provide a flag to exit gracefully.\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t  function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t    var source = util.getArg(aArgs, 'source');\n\t    source = this._findSourceIndex(source);\n\t    if (source < 0) {\n\t      return {\n\t        line: null,\n\t        column: null,\n\t        lastColumn: null\n\t      };\n\t    }\n\t\n\t    var needle = {\n\t      source: source,\n\t      originalLine: util.getArg(aArgs, 'line'),\n\t      originalColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._originalMappings,\n\t      \"originalLine\",\n\t      \"originalColumn\",\n\t      util.compareByOriginalPositions,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\t\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\t\n\t      if (mapping.source === needle.source) {\n\t        return {\n\t          line: util.getArg(mapping, 'generatedLine', null),\n\t          column: util.getArg(mapping, 'generatedColumn', null),\n\t          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t        };\n\t      }\n\t    }\n\t\n\t    return {\n\t      line: null,\n\t      column: null,\n\t      lastColumn: null\n\t    };\n\t  };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The first parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *   - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t *   - offset: The offset into the original specified at which this section\n\t *       begins to apply, defined as an object with a \"line\" and \"column\"\n\t *       field.\n\t *   - map: A source map definition. This source map could also be indexed,\n\t *       but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t *  {\n\t *    version : 3,\n\t *    file: \"app.js\",\n\t *    sections: [{\n\t *      offset: {line:100, column:10},\n\t *      map: {\n\t *        version : 3,\n\t *        file: \"section.js\",\n\t *        sources: [\"foo.js\", \"bar.js\"],\n\t *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *        mappings: \"AAAA,E;;ABCDE;\"\n\t *      }\n\t *    }],\n\t *  }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sections = util.getArg(sourceMap, 'sections');\n\t\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\t\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t\n\t  var lastOffset = {\n\t    line: -1,\n\t    column: 0\n\t  };\n\t  this._sections = sections.map(function (s) {\n\t    if (s.url) {\n\t      // The url field will require support for asynchronicity.\n\t      // See https://github.com/mozilla/source-map/issues/16\n\t      throw new Error('Support for url field in sections not implemented.');\n\t    }\n\t    var offset = util.getArg(s, 'offset');\n\t    var offsetLine = util.getArg(offset, 'line');\n\t    var offsetColumn = util.getArg(offset, 'column');\n\t\n\t    if (offsetLine < lastOffset.line ||\n\t        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t      throw new Error('Section offsets must be ordered and non-overlapping.');\n\t    }\n\t    lastOffset = offset;\n\t\n\t    return {\n\t      generatedOffset: {\n\t        // The offset fields are 0-based, but we use 1-based indices when\n\t        // encoding/decoding from VLQ.\n\t        generatedLine: offsetLine + 1,\n\t        generatedColumn: offsetColumn + 1\n\t      },\n\t      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n\t    }\n\t  });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    var sources = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t        sources.push(this._sections[i].consumer.sources[j]);\n\t      }\n\t    }\n\t    return sources;\n\t  }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    // Find the section containing the generated position we're trying to map\n\t    // to an original position.\n\t    var sectionIndex = binarySearch.search(needle, this._sections,\n\t      function(needle, section) {\n\t        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t        if (cmp) {\n\t          return cmp;\n\t        }\n\t\n\t        return (needle.generatedColumn -\n\t                section.generatedOffset.generatedColumn);\n\t      });\n\t    var section = this._sections[sectionIndex];\n\t\n\t    if (!section) {\n\t      return {\n\t        source: null,\n\t        line: null,\n\t        column: null,\n\t        name: null\n\t      };\n\t    }\n\t\n\t    return section.consumer.originalPositionFor({\n\t      line: needle.generatedLine -\n\t        (section.generatedOffset.generatedLine - 1),\n\t      column: needle.generatedColumn -\n\t        (section.generatedOffset.generatedLine === needle.generatedLine\n\t         ? section.generatedOffset.generatedColumn - 1\n\t         : 0),\n\t      bias: aArgs.bias\n\t    });\n\t  };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t    return this._sections.every(function (s) {\n\t      return s.consumer.hasContentsOfAllSources();\n\t    });\n\t  };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t\n\t      var content = section.consumer.sourceContentFor(aSource, true);\n\t      if (content) {\n\t        return content;\n\t      }\n\t    }\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based. \n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t\n\t      // Only consider this section if the requested source is in the list of\n\t      // sources of the consumer.\n\t      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n\t        continue;\n\t      }\n\t      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t      if (generatedPosition) {\n\t        var ret = {\n\t          line: generatedPosition.line +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          column: generatedPosition.column +\n\t            (section.generatedOffset.generatedLine === generatedPosition.line\n\t             ? section.generatedOffset.generatedColumn - 1\n\t             : 0)\n\t        };\n\t        return ret;\n\t      }\n\t    }\n\t\n\t    return {\n\t      line: null,\n\t      column: null\n\t    };\n\t  };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    this.__generatedMappings = [];\n\t    this.__originalMappings = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t      var sectionMappings = section.consumer._generatedMappings;\n\t      for (var j = 0; j < sectionMappings.length; j++) {\n\t        var mapping = sectionMappings[j];\n\t\n\t        var source = section.consumer._sources.at(mapping.source);\n\t        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t        this._sources.add(source);\n\t        source = this._sources.indexOf(source);\n\t\n\t        var name = null;\n\t        if (mapping.name) {\n\t          name = section.consumer._names.at(mapping.name);\n\t          this._names.add(name);\n\t          name = this._names.indexOf(name);\n\t        }\n\t\n\t        // The mappings coming from the consumer for the section have\n\t        // generated positions relative to the start of the section, so we\n\t        // need to offset them to be relative to the start of the concatenated\n\t        // generated file.\n\t        var adjustedMapping = {\n\t          source: source,\n\t          generatedLine: mapping.generatedLine +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          generatedColumn: mapping.generatedColumn +\n\t            (section.generatedOffset.generatedLine === mapping.generatedLine\n\t            ? section.generatedOffset.generatedColumn - 1\n\t            : 0),\n\t          originalLine: mapping.originalLine,\n\t          originalColumn: mapping.originalColumn,\n\t          name: name\n\t        };\n\t\n\t        this.__generatedMappings.push(adjustedMapping);\n\t        if (typeof adjustedMapping.originalLine === 'number') {\n\t          this.__originalMappings.push(adjustedMapping);\n\t        }\n\t      }\n\t    }\n\t\n\t    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t  };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t  // This function terminates when one of the following is true:\n\t  //\n\t  //   1. We find the exact element we are looking for.\n\t  //\n\t  //   2. We did not find the exact element, but we can return the index of\n\t  //      the next-closest element.\n\t  //\n\t  //   3. We did not find the exact element, and there is no next-closest\n\t  //      element than the one we are searching for, so we return -1.\n\t  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t  if (cmp === 0) {\n\t    // Found the element we are looking for.\n\t    return mid;\n\t  }\n\t  else if (cmp > 0) {\n\t    // Our needle is greater than aHaystack[mid].\n\t    if (aHigh - mid > 1) {\n\t      // The element is in the upper half.\n\t      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\t\n\t    // The exact needle element was not found in this haystack. Determine if\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return aHigh < aHaystack.length ? aHigh : -1;\n\t    } else {\n\t      return mid;\n\t    }\n\t  }\n\t  else {\n\t    // Our needle is less than aHaystack[mid].\n\t    if (mid - aLow > 1) {\n\t      // The element is in the lower half.\n\t      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\t\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return mid;\n\t    } else {\n\t      return aLow < 0 ? -1 : aLow;\n\t    }\n\t  }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t *     array and returns -1, 0, or 1 depending on whether the needle is less\n\t *     than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t  if (aHaystack.length === 0) {\n\t    return -1;\n\t  }\n\t\n\t  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t  if (index < 0) {\n\t    return -1;\n\t  }\n\t\n\t  // We have found either the exact element, or the next-closest element than\n\t  // the one we are searching for. However, there may be more than one such\n\t  // element. Make sure we always return the smallest of these.\n\t  while (index - 1 >= 0) {\n\t    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t      break;\n\t    }\n\t    --index;\n\t  }\n\t\n\t  return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t *        The array.\n\t * @param {Number} x\n\t *        The index of the first item.\n\t * @param {Number} y\n\t *        The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t  var temp = ary[x];\n\t  ary[x] = ary[y];\n\t  ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t *        The lower bound on the range.\n\t * @param {Number} high\n\t *        The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t  return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t * @param {Number} p\n\t *        Start index of the array\n\t * @param {Number} r\n\t *        End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t  // If our lower bound is less than our upper bound, we (1) partition the\n\t  // array into two pieces and (2) recurse on each half. If it is not, this is\n\t  // the empty array and our base case.\n\t\n\t  if (p < r) {\n\t    // (1) Partitioning.\n\t    //\n\t    // The partitioning chooses a pivot between `p` and `r` and moves all\n\t    // elements that are less than or equal to the pivot to the before it, and\n\t    // all the elements that are greater than it after it. The effect is that\n\t    // once partition is done, the pivot is in the exact place it will be when\n\t    // the array is put in sorted order, and it will not need to be moved\n\t    // again. This runs in O(n) time.\n\t\n\t    // Always choose a random pivot so that an input array which is reverse\n\t    // sorted does not cause O(n^2) running time.\n\t    var pivotIndex = randomIntInRange(p, r);\n\t    var i = p - 1;\n\t\n\t    swap(ary, pivotIndex, r);\n\t    var pivot = ary[r];\n\t\n\t    // Immediately after `j` is incremented in this loop, the following hold\n\t    // true:\n\t    //\n\t    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t    //\n\t    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t    for (var j = p; j < r; j++) {\n\t      if (comparator(ary[j], pivot) <= 0) {\n\t        i += 1;\n\t        swap(ary, i, j);\n\t      }\n\t    }\n\t\n\t    swap(ary, i + 1, j);\n\t    var q = i + 1;\n\t\n\t    // (2) Recurse on each half.\n\t\n\t    doQuickSort(ary, comparator, p, q - 1);\n\t    doQuickSort(ary, comparator, q + 1, r);\n\t  }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t  doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t *        generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t  this.children = [];\n\t  this.sourceContents = {};\n\t  this.line = aLine == null ? null : aLine;\n\t  this.column = aColumn == null ? null : aColumn;\n\t  this.source = aSource == null ? null : aSource;\n\t  this.name = aName == null ? null : aName;\n\t  this[isSourceNode] = true;\n\t  if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t *        SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t    // The SourceNode we want to fill with the generated code\n\t    // and the SourceMap\n\t    var node = new SourceNode();\n\t\n\t    // All even indices of this array are one line of the generated code,\n\t    // while all odd indices are the newlines between two adjacent lines\n\t    // (since `REGEX_NEWLINE` captures its match).\n\t    // Processed fragments are accessed by calling `shiftNextLine`.\n\t    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t    var remainingLinesIndex = 0;\n\t    var shiftNextLine = function() {\n\t      var lineContents = getNextLine();\n\t      // The last line of a file might not have a newline.\n\t      var newLine = getNextLine() || \"\";\n\t      return lineContents + newLine;\n\t\n\t      function getNextLine() {\n\t        return remainingLinesIndex < remainingLines.length ?\n\t            remainingLines[remainingLinesIndex++] : undefined;\n\t      }\n\t    };\n\t\n\t    // We need to remember the position of \"remainingLines\"\n\t    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t    // The generate SourceNodes we need a code range.\n\t    // To extract it current and last mapping is used.\n\t    // Here we store the last mapping.\n\t    var lastMapping = null;\n\t\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      if (lastMapping !== null) {\n\t        // We add the code from \"lastMapping\" to \"mapping\":\n\t        // First check if there is a new line in between.\n\t        if (lastGeneratedLine < mapping.generatedLine) {\n\t          // Associate first line with \"lastMapping\"\n\t          addMappingWithCode(lastMapping, shiftNextLine());\n\t          lastGeneratedLine++;\n\t          lastGeneratedColumn = 0;\n\t          // The remaining code is added without mapping\n\t        } else {\n\t          // There is no new line in between.\n\t          // Associate the code between \"lastGeneratedColumn\" and\n\t          // \"mapping.generatedColumn\" with \"lastMapping\"\n\t          var nextLine = remainingLines[remainingLinesIndex] || '';\n\t          var code = nextLine.substr(0, mapping.generatedColumn -\n\t                                        lastGeneratedColumn);\n\t          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t                                              lastGeneratedColumn);\n\t          lastGeneratedColumn = mapping.generatedColumn;\n\t          addMappingWithCode(lastMapping, code);\n\t          // No more remaining code, continue\n\t          lastMapping = mapping;\n\t          return;\n\t        }\n\t      }\n\t      // We add the generated code until the first mapping\n\t      // to the SourceNode without any mapping.\n\t      // Each line is added as separate string.\n\t      while (lastGeneratedLine < mapping.generatedLine) {\n\t        node.add(shiftNextLine());\n\t        lastGeneratedLine++;\n\t      }\n\t      if (lastGeneratedColumn < mapping.generatedColumn) {\n\t        var nextLine = remainingLines[remainingLinesIndex] || '';\n\t        node.add(nextLine.substr(0, mapping.generatedColumn));\n\t        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t        lastGeneratedColumn = mapping.generatedColumn;\n\t      }\n\t      lastMapping = mapping;\n\t    }, this);\n\t    // We have processed all mappings.\n\t    if (remainingLinesIndex < remainingLines.length) {\n\t      if (lastMapping) {\n\t        // Associate the remaining code in the current line with \"lastMapping\"\n\t        addMappingWithCode(lastMapping, shiftNextLine());\n\t      }\n\t      // and add the remaining lines without any mapping\n\t      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t    }\n\t\n\t    // Copy sourcesContent into SourceNode\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aRelativePath != null) {\n\t          sourceFile = util.join(aRelativePath, sourceFile);\n\t        }\n\t        node.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t\n\t    return node;\n\t\n\t    function addMappingWithCode(mapping, code) {\n\t      if (mapping === null || mapping.source === undefined) {\n\t        node.add(code);\n\t      } else {\n\t        var source = aRelativePath\n\t          ? util.join(aRelativePath, mapping.source)\n\t          : mapping.source;\n\t        node.add(new SourceNode(mapping.originalLine,\n\t                                mapping.originalColumn,\n\t                                source,\n\t                                code,\n\t                                mapping.name));\n\t      }\n\t    }\n\t  };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    aChunk.forEach(function (chunk) {\n\t      this.add(chunk);\n\t    }, this);\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    if (aChunk) {\n\t      this.children.push(aChunk);\n\t    }\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    for (var i = aChunk.length-1; i >= 0; i--) {\n\t      this.prepend(aChunk[i]);\n\t    }\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    this.children.unshift(aChunk);\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t  var chunk;\n\t  for (var i = 0, len = this.children.length; i < len; i++) {\n\t    chunk = this.children[i];\n\t    if (chunk[isSourceNode]) {\n\t      chunk.walk(aFn);\n\t    }\n\t    else {\n\t      if (chunk !== '') {\n\t        aFn(chunk, { source: this.source,\n\t                     line: this.line,\n\t                     column: this.column,\n\t                     name: this.name });\n\t      }\n\t    }\n\t  }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t  var newChildren;\n\t  var i;\n\t  var len = this.children.length;\n\t  if (len > 0) {\n\t    newChildren = [];\n\t    for (i = 0; i < len-1; i++) {\n\t      newChildren.push(this.children[i]);\n\t      newChildren.push(aSep);\n\t    }\n\t    newChildren.push(this.children[i]);\n\t    this.children = newChildren;\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t  var lastChild = this.children[this.children.length - 1];\n\t  if (lastChild[isSourceNode]) {\n\t    lastChild.replaceRight(aPattern, aReplacement);\n\t  }\n\t  else if (typeof lastChild === 'string') {\n\t    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t  }\n\t  else {\n\t    this.children.push(''.replace(aPattern, aReplacement));\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t  };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t  function SourceNode_walkSourceContents(aFn) {\n\t    for (var i = 0, len = this.children.length; i < len; i++) {\n\t      if (this.children[i][isSourceNode]) {\n\t        this.children[i].walkSourceContents(aFn);\n\t      }\n\t    }\n\t\n\t    var sources = Object.keys(this.sourceContents);\n\t    for (var i = 0, len = sources.length; i < len; i++) {\n\t      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t    }\n\t  };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t  var str = \"\";\n\t  this.walk(function (chunk) {\n\t    str += chunk;\n\t  });\n\t  return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t  var generated = {\n\t    code: \"\",\n\t    line: 1,\n\t    column: 0\n\t  };\n\t  var map = new SourceMapGenerator(aArgs);\n\t  var sourceMappingActive = false;\n\t  var lastOriginalSource = null;\n\t  var lastOriginalLine = null;\n\t  var lastOriginalColumn = null;\n\t  var lastOriginalName = null;\n\t  this.walk(function (chunk, original) {\n\t    generated.code += chunk;\n\t    if (original.source !== null\n\t        && original.line !== null\n\t        && original.column !== null) {\n\t      if(lastOriginalSource !== original.source\n\t         || lastOriginalLine !== original.line\n\t         || lastOriginalColumn !== original.column\n\t         || lastOriginalName !== original.name) {\n\t        map.addMapping({\n\t          source: original.source,\n\t          original: {\n\t            line: original.line,\n\t            column: original.column\n\t          },\n\t          generated: {\n\t            line: generated.line,\n\t            column: generated.column\n\t          },\n\t          name: original.name\n\t        });\n\t      }\n\t      lastOriginalSource = original.source;\n\t      lastOriginalLine = original.line;\n\t      lastOriginalColumn = original.column;\n\t      lastOriginalName = original.name;\n\t      sourceMappingActive = true;\n\t    } else if (sourceMappingActive) {\n\t      map.addMapping({\n\t        generated: {\n\t          line: generated.line,\n\t          column: generated.column\n\t        }\n\t      });\n\t      lastOriginalSource = null;\n\t      sourceMappingActive = false;\n\t    }\n\t    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t        generated.line++;\n\t        generated.column = 0;\n\t        // Mappings end at eol\n\t        if (idx + 1 === length) {\n\t          lastOriginalSource = null;\n\t          sourceMappingActive = false;\n\t        } else if (sourceMappingActive) {\n\t          map.addMapping({\n\t            source: original.source,\n\t            original: {\n\t              line: original.line,\n\t              column: original.column\n\t            },\n\t            generated: {\n\t              line: generated.line,\n\t              column: generated.column\n\t            },\n\t            name: original.name\n\t          });\n\t        }\n\t      } else {\n\t        generated.column++;\n\t      }\n\t    }\n\t  });\n\t  this.walkSourceContents(function (sourceFile, sourceContent) {\n\t    map.setSourceContent(sourceFile, sourceContent);\n\t  });\n\t\n\t  return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJCO0FBQzlDLHNCQUFxQiwrQ0FBK0M7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0Esc0JBQXFCLDRCQUE0QjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3huQ0EsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM5R0EsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0="
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/dist/source-map.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t * Copyright 2009-2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE.txt or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\n\texports.SourceNode = __webpack_require__(10).SourceNode;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\tvar base64VLQ = __webpack_require__(2);\n\tvar util = __webpack_require__(4);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar MappingList = __webpack_require__(6).MappingList;\n\n\t/**\n\t * An instance of the SourceMapGenerator represents a source map which is\n\t * being built incrementally. You may pass an object with the following\n\t * properties:\n\t *\n\t *   - file: The filename of the generated source.\n\t *   - sourceRoot: A root for all relative URLs in this source map.\n\t */\n\tfunction SourceMapGenerator(aArgs) {\n\t  if (!aArgs) {\n\t    aArgs = {};\n\t  }\n\t  this._file = util.getArg(aArgs, 'file', null);\n\t  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n\t  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t  this._mappings = new MappingList();\n\t  this._sourcesContents = null;\n\t}\n\n\tSourceMapGenerator.prototype._version = 3;\n\n\t/**\n\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\n\t *\n\t * @param aSourceMapConsumer The SourceMap.\n\t */\n\tSourceMapGenerator.fromSourceMap =\n\t  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n\t    var sourceRoot = aSourceMapConsumer.sourceRoot;\n\t    var generator = new SourceMapGenerator({\n\t      file: aSourceMapConsumer.file,\n\t      sourceRoot: sourceRoot\n\t    });\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      var newMapping = {\n\t        generated: {\n\t          line: mapping.generatedLine,\n\t          column: mapping.generatedColumn\n\t        }\n\t      };\n\n\t      if (mapping.source != null) {\n\t        newMapping.source = mapping.source;\n\t        if (sourceRoot != null) {\n\t          newMapping.source = util.relative(sourceRoot, newMapping.source);\n\t        }\n\n\t        newMapping.original = {\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        };\n\n\t        if (mapping.name != null) {\n\t          newMapping.name = mapping.name;\n\t        }\n\t      }\n\n\t      generator.addMapping(newMapping);\n\t    });\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var sourceRelative = sourceFile;\n\t      if (sourceRoot !== null) {\n\t        sourceRelative = util.relative(sourceRoot, sourceFile);\n\t      }\n\n\t      if (!generator._sources.has(sourceRelative)) {\n\t        generator._sources.add(sourceRelative);\n\t      }\n\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        generator.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t    return generator;\n\t  };\n\n\t/**\n\t * Add a single mapping from original source line and column to the generated\n\t * source's line and column for this source map being created. The mapping\n\t * object should have the following properties:\n\t *\n\t *   - generated: An object with the generated line and column positions.\n\t *   - original: An object with the original line and column positions.\n\t *   - source: The original source file (relative to the sourceRoot).\n\t *   - name: An optional original token name for this mapping.\n\t */\n\tSourceMapGenerator.prototype.addMapping =\n\t  function SourceMapGenerator_addMapping(aArgs) {\n\t    var generated = util.getArg(aArgs, 'generated');\n\t    var original = util.getArg(aArgs, 'original', null);\n\t    var source = util.getArg(aArgs, 'source', null);\n\t    var name = util.getArg(aArgs, 'name', null);\n\n\t    if (!this._skipValidation) {\n\t      this._validateMapping(generated, original, source, name);\n\t    }\n\n\t    if (source != null) {\n\t      source = String(source);\n\t      if (!this._sources.has(source)) {\n\t        this._sources.add(source);\n\t      }\n\t    }\n\n\t    if (name != null) {\n\t      name = String(name);\n\t      if (!this._names.has(name)) {\n\t        this._names.add(name);\n\t      }\n\t    }\n\n\t    this._mappings.add({\n\t      generatedLine: generated.line,\n\t      generatedColumn: generated.column,\n\t      originalLine: original != null && original.line,\n\t      originalColumn: original != null && original.column,\n\t      source: source,\n\t      name: name\n\t    });\n\t  };\n\n\t/**\n\t * Set the source content for a source file.\n\t */\n\tSourceMapGenerator.prototype.setSourceContent =\n\t  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n\t    var source = aSourceFile;\n\t    if (this._sourceRoot != null) {\n\t      source = util.relative(this._sourceRoot, source);\n\t    }\n\n\t    if (aSourceContent != null) {\n\t      // Add the source content to the _sourcesContents map.\n\t      // Create a new _sourcesContents map if the property is null.\n\t      if (!this._sourcesContents) {\n\t        this._sourcesContents = Object.create(null);\n\t      }\n\t      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n\t    } else if (this._sourcesContents) {\n\t      // Remove the source file from the _sourcesContents map.\n\t      // If the _sourcesContents map is empty, set the property to null.\n\t      delete this._sourcesContents[util.toSetString(source)];\n\t      if (Object.keys(this._sourcesContents).length === 0) {\n\t        this._sourcesContents = null;\n\t      }\n\t    }\n\t  };\n\n\t/**\n\t * Applies the mappings of a sub-source-map for a specific source file to the\n\t * source map being generated. Each mapping to the supplied source file is\n\t * rewritten using the supplied source map. Note: The resolution for the\n\t * resulting mappings is the minimium of this map and the supplied map.\n\t *\n\t * @param aSourceMapConsumer The source map to be applied.\n\t * @param aSourceFile Optional. The filename of the source file.\n\t *        If omitted, SourceMapConsumer's file property will be used.\n\t * @param aSourceMapPath Optional. The dirname of the path to the source map\n\t *        to be applied. If relative, it is relative to the SourceMapConsumer.\n\t *        This parameter is needed when the two source maps aren't in the same\n\t *        directory, and the source map to be applied contains relative source\n\t *        paths. If so, those relative source paths need to be rewritten\n\t *        relative to the SourceMapGenerator.\n\t */\n\tSourceMapGenerator.prototype.applySourceMap =\n\t  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n\t    var sourceFile = aSourceFile;\n\t    // If aSourceFile is omitted, we will use the file property of the SourceMap\n\t    if (aSourceFile == null) {\n\t      if (aSourceMapConsumer.file == null) {\n\t        throw new Error(\n\t          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n\t          'or the source map\\'s \"file\" property. Both were omitted.'\n\t        );\n\t      }\n\t      sourceFile = aSourceMapConsumer.file;\n\t    }\n\t    var sourceRoot = this._sourceRoot;\n\t    // Make \"sourceFile\" relative if an absolute Url is passed.\n\t    if (sourceRoot != null) {\n\t      sourceFile = util.relative(sourceRoot, sourceFile);\n\t    }\n\t    // Applying the SourceMap can add and remove items from the sources and\n\t    // the names array.\n\t    var newSources = new ArraySet();\n\t    var newNames = new ArraySet();\n\n\t    // Find mappings for the \"sourceFile\"\n\t    this._mappings.unsortedForEach(function (mapping) {\n\t      if (mapping.source === sourceFile && mapping.originalLine != null) {\n\t        // Check if it can be mapped by the source map, then update the mapping.\n\t        var original = aSourceMapConsumer.originalPositionFor({\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        });\n\t        if (original.source != null) {\n\t          // Copy mapping\n\t          mapping.source = original.source;\n\t          if (aSourceMapPath != null) {\n\t            mapping.source = util.join(aSourceMapPath, mapping.source)\n\t          }\n\t          if (sourceRoot != null) {\n\t            mapping.source = util.relative(sourceRoot, mapping.source);\n\t          }\n\t          mapping.originalLine = original.line;\n\t          mapping.originalColumn = original.column;\n\t          if (original.name != null) {\n\t            mapping.name = original.name;\n\t          }\n\t        }\n\t      }\n\n\t      var source = mapping.source;\n\t      if (source != null && !newSources.has(source)) {\n\t        newSources.add(source);\n\t      }\n\n\t      var name = mapping.name;\n\t      if (name != null && !newNames.has(name)) {\n\t        newNames.add(name);\n\t      }\n\n\t    }, this);\n\t    this._sources = newSources;\n\t    this._names = newNames;\n\n\t    // Copy sourcesContents of applied map.\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aSourceMapPath != null) {\n\t          sourceFile = util.join(aSourceMapPath, sourceFile);\n\t        }\n\t        if (sourceRoot != null) {\n\t          sourceFile = util.relative(sourceRoot, sourceFile);\n\t        }\n\t        this.setSourceContent(sourceFile, content);\n\t      }\n\t    }, this);\n\t  };\n\n\t/**\n\t * A mapping can have one of the three levels of data:\n\t *\n\t *   1. Just the generated position.\n\t *   2. The Generated position, original position, and original source.\n\t *   3. Generated and original position, original source, as well as a name\n\t *      token.\n\t *\n\t * To maintain consistency, we validate that any new mapping being added falls\n\t * in to one of these categories.\n\t */\n\tSourceMapGenerator.prototype._validateMapping =\n\t  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n\t                                              aName) {\n\t    // When aOriginal is truthy but has empty values for .line and .column,\n\t    // it is most likely a programmer error. In this case we throw a very\n\t    // specific error message to try to guide them the right way.\n\t    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n\t    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n\t        throw new Error(\n\t            'original.line and original.column are not numbers -- you probably meant to omit ' +\n\t            'the original mapping entirely and only map the generated position. If so, pass ' +\n\t            'null for the original mapping instead of an object with empty or null values.'\n\t        );\n\t    }\n\n\t    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t        && aGenerated.line > 0 && aGenerated.column >= 0\n\t        && !aOriginal && !aSource && !aName) {\n\t      // Case 1.\n\t      return;\n\t    }\n\t    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t             && aGenerated.line > 0 && aGenerated.column >= 0\n\t             && aOriginal.line > 0 && aOriginal.column >= 0\n\t             && aSource) {\n\t      // Cases 2 and 3.\n\t      return;\n\t    }\n\t    else {\n\t      throw new Error('Invalid mapping: ' + JSON.stringify({\n\t        generated: aGenerated,\n\t        source: aSource,\n\t        original: aOriginal,\n\t        name: aName\n\t      }));\n\t    }\n\t  };\n\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t  function SourceMapGenerator_serializeMappings() {\n\t    var previousGeneratedColumn = 0;\n\t    var previousGeneratedLine = 1;\n\t    var previousOriginalColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousName = 0;\n\t    var previousSource = 0;\n\t    var result = '';\n\t    var next;\n\t    var mapping;\n\t    var nameIdx;\n\t    var sourceIdx;\n\n\t    var mappings = this._mappings.toArray();\n\t    for (var i = 0, len = mappings.length; i < len; i++) {\n\t      mapping = mappings[i];\n\t      next = ''\n\n\t      if (mapping.generatedLine !== previousGeneratedLine) {\n\t        previousGeneratedColumn = 0;\n\t        while (mapping.generatedLine !== previousGeneratedLine) {\n\t          next += ';';\n\t          previousGeneratedLine++;\n\t        }\n\t      }\n\t      else {\n\t        if (i > 0) {\n\t          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t            continue;\n\t          }\n\t          next += ',';\n\t        }\n\t      }\n\n\t      next += base64VLQ.encode(mapping.generatedColumn\n\t                                 - previousGeneratedColumn);\n\t      previousGeneratedColumn = mapping.generatedColumn;\n\n\t      if (mapping.source != null) {\n\t        sourceIdx = this._sources.indexOf(mapping.source);\n\t        next += base64VLQ.encode(sourceIdx - previousSource);\n\t        previousSource = sourceIdx;\n\n\t        // lines are stored 0-based in SourceMap spec version 3\n\t        next += base64VLQ.encode(mapping.originalLine - 1\n\t                                   - previousOriginalLine);\n\t        previousOriginalLine = mapping.originalLine - 1;\n\n\t        next += base64VLQ.encode(mapping.originalColumn\n\t                                   - previousOriginalColumn);\n\t        previousOriginalColumn = mapping.originalColumn;\n\n\t        if (mapping.name != null) {\n\t          nameIdx = this._names.indexOf(mapping.name);\n\t          next += base64VLQ.encode(nameIdx - previousName);\n\t          previousName = nameIdx;\n\t        }\n\t      }\n\n\t      result += next;\n\t    }\n\n\t    return result;\n\t  };\n\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t    return aSources.map(function (source) {\n\t      if (!this._sourcesContents) {\n\t        return null;\n\t      }\n\t      if (aSourceRoot != null) {\n\t        source = util.relative(aSourceRoot, source);\n\t      }\n\t      var key = util.toSetString(source);\n\t      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t        ? this._sourcesContents[key]\n\t        : null;\n\t    }, this);\n\t  };\n\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t  function SourceMapGenerator_toJSON() {\n\t    var map = {\n\t      version: this._version,\n\t      sources: this._sources.toArray(),\n\t      names: this._names.toArray(),\n\t      mappings: this._serializeMappings()\n\t    };\n\t    if (this._file != null) {\n\t      map.file = this._file;\n\t    }\n\t    if (this._sourceRoot != null) {\n\t      map.sourceRoot = this._sourceRoot;\n\t    }\n\t    if (this._sourcesContents) {\n\t      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t    }\n\n\t    return map;\n\t  };\n\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t  function SourceMapGenerator_toString() {\n\t    return JSON.stringify(this.toJSON());\n\t  };\n\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t *  * Redistributions of source code must retain the above copyright\n\t *    notice, this list of conditions and the following disclaimer.\n\t *  * Redistributions in binary form must reproduce the above\n\t *    copyright notice, this list of conditions and the following\n\t *    disclaimer in the documentation and/or other materials provided\n\t *    with the distribution.\n\t *  * Neither the name of Google Inc. nor the names of its\n\t *    contributors may be used to endorse or promote products derived\n\t *    from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\n\tvar base64 = __webpack_require__(3);\n\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t//   Continuation\n\t//   |    Sign\n\t//   |    |\n\t//   V    V\n\t//   101011\n\n\tvar VLQ_BASE_SHIFT = 5;\n\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t  return aValue < 0\n\t    ? ((-aValue) << 1) + 1\n\t    : (aValue << 1) + 0;\n\t}\n\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t  var isNegative = (aValue & 1) === 1;\n\t  var shifted = aValue >> 1;\n\t  return isNegative\n\t    ? -shifted\n\t    : shifted;\n\t}\n\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t  var encoded = \"\";\n\t  var digit;\n\n\t  var vlq = toVLQSigned(aValue);\n\n\t  do {\n\t    digit = vlq & VLQ_BASE_MASK;\n\t    vlq >>>= VLQ_BASE_SHIFT;\n\t    if (vlq > 0) {\n\t      // There are still more digits in this value, so we must make sure the\n\t      // continuation bit is marked.\n\t      digit |= VLQ_CONTINUATION_BIT;\n\t    }\n\t    encoded += base64.encode(digit);\n\t  } while (vlq > 0);\n\n\t  return encoded;\n\t};\n\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t  var strLen = aStr.length;\n\t  var result = 0;\n\t  var shift = 0;\n\t  var continuation, digit;\n\n\t  do {\n\t    if (aIndex >= strLen) {\n\t      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t    }\n\n\t    digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t    if (digit === -1) {\n\t      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t    }\n\n\t    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t    digit &= VLQ_BASE_MASK;\n\t    result = result + (digit << shift);\n\t    shift += VLQ_BASE_SHIFT;\n\t  } while (continuation);\n\n\t  aOutParam.value = fromVLQSigned(result);\n\t  aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t  if (0 <= number && number < intToCharMap.length) {\n\t    return intToCharMap[number];\n\t  }\n\t  throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t  var bigA = 65;     // 'A'\n\t  var bigZ = 90;     // 'Z'\n\n\t  var littleA = 97;  // 'a'\n\t  var littleZ = 122; // 'z'\n\n\t  var zero = 48;     // '0'\n\t  var nine = 57;     // '9'\n\n\t  var plus = 43;     // '+'\n\t  var slash = 47;    // '/'\n\n\t  var littleOffset = 26;\n\t  var numberOffset = 52;\n\n\t  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t  if (bigA <= charCode && charCode <= bigZ) {\n\t    return (charCode - bigA);\n\t  }\n\n\t  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t  if (littleA <= charCode && charCode <= littleZ) {\n\t    return (charCode - littleA + littleOffset);\n\t  }\n\n\t  // 52 - 61: 0123456789\n\t  if (zero <= charCode && charCode <= nine) {\n\t    return (charCode - zero + numberOffset);\n\t  }\n\n\t  // 62: +\n\t  if (charCode == plus) {\n\t    return 62;\n\t  }\n\n\t  // 63: /\n\t  if (charCode == slash) {\n\t    return 63;\n\t  }\n\n\t  // Invalid base64 digit.\n\t  return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t  if (aName in aArgs) {\n\t    return aArgs[aName];\n\t  } else if (arguments.length === 3) {\n\t    return aDefaultValue;\n\t  } else {\n\t    throw new Error('\"' + aName + '\" is a required argument.');\n\t  }\n\t}\n\texports.getArg = getArg;\n\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\n\tfunction urlParse(aUrl) {\n\t  var match = aUrl.match(urlRegexp);\n\t  if (!match) {\n\t    return null;\n\t  }\n\t  return {\n\t    scheme: match[1],\n\t    auth: match[2],\n\t    host: match[3],\n\t    port: match[4],\n\t    path: match[5]\n\t  };\n\t}\n\texports.urlParse = urlParse;\n\n\tfunction urlGenerate(aParsedUrl) {\n\t  var url = '';\n\t  if (aParsedUrl.scheme) {\n\t    url += aParsedUrl.scheme + ':';\n\t  }\n\t  url += '//';\n\t  if (aParsedUrl.auth) {\n\t    url += aParsedUrl.auth + '@';\n\t  }\n\t  if (aParsedUrl.host) {\n\t    url += aParsedUrl.host;\n\t  }\n\t  if (aParsedUrl.port) {\n\t    url += \":\" + aParsedUrl.port\n\t  }\n\t  if (aParsedUrl.path) {\n\t    url += aParsedUrl.path;\n\t  }\n\t  return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '<dir>/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t  var path = aPath;\n\t  var url = urlParse(aPath);\n\t  if (url) {\n\t    if (!url.path) {\n\t      return aPath;\n\t    }\n\t    path = url.path;\n\t  }\n\t  var isAbsolute = exports.isAbsolute(path);\n\n\t  var parts = path.split(/\\/+/);\n\t  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t    part = parts[i];\n\t    if (part === '.') {\n\t      parts.splice(i, 1);\n\t    } else if (part === '..') {\n\t      up++;\n\t    } else if (up > 0) {\n\t      if (part === '') {\n\t        // The first part is blank if the path is absolute. Trying to go\n\t        // above the root is a no-op. Therefore we can remove all '..' parts\n\t        // directly after the root.\n\t        parts.splice(i + 1, up);\n\t        up = 0;\n\t      } else {\n\t        parts.splice(i, 2);\n\t        up--;\n\t      }\n\t    }\n\t  }\n\t  path = parts.join('/');\n\n\t  if (path === '') {\n\t    path = isAbsolute ? '/' : '.';\n\t  }\n\n\t  if (url) {\n\t    url.path = path;\n\t    return urlGenerate(url);\n\t  }\n\t  return path;\n\t}\n\texports.normalize = normalize;\n\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t *   first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t *   is updated with the result and aRoot is returned. Otherwise the result\n\t *   is returned.\n\t *   - If aPath is absolute, the result is aPath.\n\t *   - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t  if (aPath === \"\") {\n\t    aPath = \".\";\n\t  }\n\t  var aPathUrl = urlParse(aPath);\n\t  var aRootUrl = urlParse(aRoot);\n\t  if (aRootUrl) {\n\t    aRoot = aRootUrl.path || '/';\n\t  }\n\n\t  // `join(foo, '//www.example.org')`\n\t  if (aPathUrl && !aPathUrl.scheme) {\n\t    if (aRootUrl) {\n\t      aPathUrl.scheme = aRootUrl.scheme;\n\t    }\n\t    return urlGenerate(aPathUrl);\n\t  }\n\n\t  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t    return aPath;\n\t  }\n\n\t  // `join('http://', 'www.example.com')`\n\t  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t    aRootUrl.host = aPath;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\n\t  var joined = aPath.charAt(0) === '/'\n\t    ? aPath\n\t    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n\t  if (aRootUrl) {\n\t    aRootUrl.path = joined;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t  return joined;\n\t}\n\texports.join = join;\n\n\texports.isAbsolute = function (aPath) {\n\t  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n\t};\n\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\n\t  aRoot = aRoot.replace(/\\/$/, '');\n\n\t  // It is possible for the path to be above the root. In this case, simply\n\t  // checking whether the root is a prefix of the path won't work. Instead, we\n\t  // need to remove components from the root one by one, until either we find\n\t  // a prefix that fits, or we run out of components to remove.\n\t  var level = 0;\n\t  while (aPath.indexOf(aRoot + '/') !== 0) {\n\t    var index = aRoot.lastIndexOf(\"/\");\n\t    if (index < 0) {\n\t      return aPath;\n\t    }\n\n\t    // If the only part of the root that is left is the scheme (i.e. http://,\n\t    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t    // have exhausted all components, so the path is not relative to the root.\n\t    aRoot = aRoot.slice(0, index);\n\t    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t      return aPath;\n\t    }\n\n\t    ++level;\n\t  }\n\n\t  // Make sure we add a \"../\" for each component we removed from the root.\n\t  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\n\tvar supportsNullProto = (function () {\n\t  var obj = Object.create(null);\n\t  return !('__proto__' in obj);\n\t}());\n\n\tfunction identity (s) {\n\t  return s;\n\t}\n\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return '$' + aStr;\n\t  }\n\n\t  return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\n\tfunction fromSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return aStr.slice(1);\n\t  }\n\n\t  return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\n\tfunction isProtoString(s) {\n\t  if (!s) {\n\t    return false;\n\t  }\n\n\t  var length = s.length;\n\n\t  if (length < 9 /* \"__proto__\".length */) {\n\t    return false;\n\t  }\n\n\t  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n\t    return false;\n\t  }\n\n\t  for (var i = length - 10; i >= 0; i--) {\n\t    if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t  var cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0 || onlyCompareOriginal) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0 || onlyCompareGenerated) {\n\t    return cmp;\n\t  }\n\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\n\tfunction strcmp(aStr1, aStr2) {\n\t  if (aStr1 === aStr2) {\n\t    return 0;\n\t  }\n\n\t  if (aStr1 === null) {\n\t    return 1; // aStr2 !== null\n\t  }\n\n\t  if (aStr2 === null) {\n\t    return -1; // aStr1 !== null\n\t  }\n\n\t  if (aStr1 > aStr2) {\n\t    return 1;\n\t  }\n\n\t  return -1;\n\t}\n\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t  sourceURL = sourceURL || '';\n\n\t  if (sourceRoot) {\n\t    // This follows what Chrome does.\n\t    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t      sourceRoot += '/';\n\t    }\n\t    // The spec says:\n\t    //   Line 4: An optional source root, useful for relocating source\n\t    //   files on a server or removing repeated values in the\n\t    //   “sources” entry.  This value is prepended to the individual\n\t    //   entries in the “source” field.\n\t    sourceURL = sourceRoot + sourceURL;\n\t  }\n\n\t  // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t  // a parameter.  This mode is still somewhat supported, which is why\n\t  // this code block is conditional.  However, it's preferable to pass\n\t  // the source map URL to SourceMapConsumer, so that this function\n\t  // can implement the source URL resolution algorithm as outlined in\n\t  // the spec.  This block is basically the equivalent of:\n\t  //    new URL(sourceURL, sourceMapURL).toString()\n\t  // ... except it avoids using URL, which wasn't available in the\n\t  // older releases of node still supported by this library.\n\t  //\n\t  // The spec says:\n\t  //   If the sources are not absolute URLs after prepending of the\n\t  //   “sourceRoot”, the sources are resolved relative to the\n\t  //   SourceMap (like resolving script src in a html document).\n\t  if (sourceMapURL) {\n\t    var parsed = urlParse(sourceMapURL);\n\t    if (!parsed) {\n\t      throw new Error(\"sourceMapURL could not be parsed\");\n\t    }\n\t    if (parsed.path) {\n\t      // Strip the last path component, but keep the \"/\".\n\t      var index = parsed.path.lastIndexOf('/');\n\t      if (index >= 0) {\n\t        parsed.path = parsed.path.substring(0, index + 1);\n\t      }\n\t    }\n\t    sourceURL = join(urlGenerate(parsed), sourceURL);\n\t  }\n\n\t  return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t  this._array = [];\n\t  this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t  var set = new ArraySet();\n\t  for (var i = 0, len = aArray.length; i < len; i++) {\n\t    set.add(aArray[i], aAllowDuplicates);\n\t  }\n\t  return set;\n\t};\n\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t  var idx = this._array.length;\n\t  if (!isDuplicate || aAllowDuplicates) {\n\t    this._array.push(aStr);\n\t  }\n\t  if (!isDuplicate) {\n\t    if (hasNativeMap) {\n\t      this._set.set(aStr, idx);\n\t    } else {\n\t      this._set[sStr] = idx;\n\t    }\n\t  }\n\t};\n\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t  if (hasNativeMap) {\n\t    return this._set.has(aStr);\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    return has.call(this._set, sStr);\n\t  }\n\t};\n\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t  if (hasNativeMap) {\n\t    var idx = this._set.get(aStr);\n\t    if (idx >= 0) {\n\t        return idx;\n\t    }\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    if (has.call(this._set, sStr)) {\n\t      return this._set[sStr];\n\t    }\n\t  }\n\n\t  throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t  if (aIdx >= 0 && aIdx < this._array.length) {\n\t    return this._array[aIdx];\n\t  }\n\t  throw new Error('No element indexed by ' + aIdx);\n\t};\n\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t  return this._array.slice();\n\t};\n\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\tvar util = __webpack_require__(4);\n\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t  // Optimized for most common case\n\t  var lineA = mappingA.generatedLine;\n\t  var lineB = mappingB.generatedLine;\n\t  var columnA = mappingA.generatedColumn;\n\t  var columnB = mappingB.generatedColumn;\n\t  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t  this._array = [];\n\t  this._sorted = true;\n\t  // Serves as infimum\n\t  this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t  function MappingList_forEach(aCallback, aThisArg) {\n\t    this._array.forEach(aCallback, aThisArg);\n\t  };\n\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t  if (generatedPositionAfter(this._last, aMapping)) {\n\t    this._last = aMapping;\n\t    this._array.push(aMapping);\n\t  } else {\n\t    this._sorted = false;\n\t    this._array.push(aMapping);\n\t  }\n\t};\n\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t  if (!this._sorted) {\n\t    this._array.sort(util.compareByGeneratedPositionsInflated);\n\t    this._sorted = true;\n\t  }\n\t  return this._array;\n\t};\n\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\n\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\n\t  return sourceMap.sections != null\n\t    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n\t}\n\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t//     {\n\t//       generatedLine: The line number in the generated code,\n\t//       generatedColumn: The column number in the generated code,\n\t//       source: The path to the original source file that generated this\n\t//               chunk of code,\n\t//       originalLine: The line number in the original source that\n\t//                     corresponds to this chunk of generated code,\n\t//       originalColumn: The column number in the original source that\n\t//                       corresponds to this chunk of generated code,\n\t//       name: The name of the original symbol which generated this chunk of\n\t//             code.\n\t//     }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__generatedMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\n\t    return this.__generatedMappings;\n\t  }\n\t});\n\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__originalMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\n\t    return this.__originalMappings;\n\t  }\n\t});\n\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t    var c = aStr.charAt(index);\n\t    return c === \";\" || c === \",\";\n\t  };\n\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    throw new Error(\"Subclasses must implement _parseMappings\");\n\t  };\n\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t *        The function that is called with each mapping.\n\t * @param Object aContext\n\t *        Optional. If specified, this object will be the value of `this` every\n\t *        time that `aCallback` is called.\n\t * @param aOrder\n\t *        Either `SourceMapConsumer.GENERATED_ORDER` or\n\t *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t *        iterate over the mappings sorted by the generated file's line/column\n\t *        order or the original's source/line/column order, respectively. Defaults to\n\t *        `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t    var context = aContext || null;\n\t    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n\t    var mappings;\n\t    switch (order) {\n\t    case SourceMapConsumer.GENERATED_ORDER:\n\t      mappings = this._generatedMappings;\n\t      break;\n\t    case SourceMapConsumer.ORIGINAL_ORDER:\n\t      mappings = this._originalMappings;\n\t      break;\n\t    default:\n\t      throw new Error(\"Unknown order of iteration.\");\n\t    }\n\n\t    var sourceRoot = this.sourceRoot;\n\t    mappings.map(function (mapping) {\n\t      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n\t      return {\n\t        source: source,\n\t        generatedLine: mapping.generatedLine,\n\t        generatedColumn: mapping.generatedColumn,\n\t        originalLine: mapping.originalLine,\n\t        originalColumn: mapping.originalColumn,\n\t        name: mapping.name === null ? null : this._names.at(mapping.name)\n\t      };\n\t    }, this).forEach(aCallback, context);\n\t  };\n\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number is 1-based.\n\t *   - column: Optional. the column number in the original source.\n\t *    The column number is 0-based.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *    line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *    The column number is 0-based.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t    var line = util.getArg(aArgs, 'line');\n\n\t    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t    // returns the index of the closest mapping less than the needle. By\n\t    // setting needle.originalColumn to 0, we thus find the last mapping for\n\t    // the given line, provided such a mapping exists.\n\t    var needle = {\n\t      source: util.getArg(aArgs, 'source'),\n\t      originalLine: line,\n\t      originalColumn: util.getArg(aArgs, 'column', 0)\n\t    };\n\n\t    needle.source = this._findSourceIndex(needle.source);\n\t    if (needle.source < 0) {\n\t      return [];\n\t    }\n\n\t    var mappings = [];\n\n\t    var index = this._findMapping(needle,\n\t                                  this._originalMappings,\n\t                                  \"originalLine\",\n\t                                  \"originalColumn\",\n\t                                  util.compareByOriginalPositions,\n\t                                  binarySearch.LEAST_UPPER_BOUND);\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\n\t      if (aArgs.column === undefined) {\n\t        var originalLine = mapping.originalLine;\n\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we found. Since\n\t        // mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we found.\n\t        while (mapping && mapping.originalLine === originalLine) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      } else {\n\t        var originalColumn = mapping.originalColumn;\n\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we were searching for.\n\t        // Since mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we are searching for.\n\t        while (mapping &&\n\t               mapping.originalLine === line &&\n\t               mapping.originalColumn == originalColumn) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      }\n\t    }\n\n\t    return mappings;\n\t  };\n\n\texports.SourceMapConsumer = SourceMapConsumer;\n\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The first parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - sources: An array of URLs to the original source files.\n\t *   - names: An array of identifiers which can be referrenced by individual mappings.\n\t *   - sourceRoot: Optional. The URL root from which all sources are relative.\n\t *   - sourcesContent: Optional. An array of contents of the original source files.\n\t *   - mappings: A string of base64 VLQs which contain the actual mappings.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t *     {\n\t *       version : 3,\n\t *       file: \"out.js\",\n\t *       sourceRoot : \"\",\n\t *       sources: [\"foo.js\", \"bar.js\"],\n\t *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *       mappings: \"AA,AB;;ABCDE;\"\n\t *     }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sources = util.getArg(sourceMap, 'sources');\n\t  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t  // requires the array) to play nice here.\n\t  var names = util.getArg(sourceMap, 'names', []);\n\t  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t  var mappings = util.getArg(sourceMap, 'mappings');\n\t  var file = util.getArg(sourceMap, 'file', null);\n\n\t  // Once again, Sass deviates from the spec and supplies the version as a\n\t  // string rather than a number, so we use loose equality checking here.\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\n\t  if (sourceRoot) {\n\t    sourceRoot = util.normalize(sourceRoot);\n\t  }\n\n\t  sources = sources\n\t    .map(String)\n\t    // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n\t    // See bugzil.la/1090768.\n\t    .map(util.normalize)\n\t    // Always ensure that absolute sources are internally stored relative to\n\t    // the source root, if the source root is absolute. Not doing this would\n\t    // be particularly problematic when the source root is a prefix of the\n\t    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t    .map(function (source) {\n\t      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t        ? util.relative(sourceRoot, source)\n\t        : source;\n\t    });\n\n\t  // Pass `true` below to allow duplicate names and sources. While source maps\n\t  // are intended to be compressed and deduplicated, the TypeScript compiler\n\t  // sometimes generates source maps with duplicates in them. See Github issue\n\t  // #72 and bugzil.la/889492.\n\t  this._names = ArraySet.fromArray(names.map(String), true);\n\t  this._sources = ArraySet.fromArray(sources, true);\n\n\t  this._absoluteSources = this._sources.toArray().map(function (s) {\n\t    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t  });\n\n\t  this.sourceRoot = sourceRoot;\n\t  this.sourcesContent = sourcesContent;\n\t  this._mappings = mappings;\n\t  this._sourceMapURL = aSourceMapURL;\n\t  this.file = file;\n\t}\n\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n\t/**\n\t * Utility function to find the index of a source.  Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t  var relativeSource = aSource;\n\t  if (this.sourceRoot != null) {\n\t    relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t  }\n\n\t  if (this._sources.has(relativeSource)) {\n\t    return this._sources.indexOf(relativeSource);\n\t  }\n\n\t  // Maybe aSource is an absolute URL as returned by |sources|.  In\n\t  // this case we can't simply undo the transform.\n\t  var i;\n\t  for (i = 0; i < this._absoluteSources.length; ++i) {\n\t    if (this._absoluteSources[i] == aSource) {\n\t      return i;\n\t    }\n\t  }\n\n\t  return -1;\n\t};\n\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t *        The source map that will be consumed.\n\t * @param String aSourceMapURL\n\t *        The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n\t    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n\t    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t    smc.sourceRoot = aSourceMap._sourceRoot;\n\t    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t                                                            smc.sourceRoot);\n\t    smc.file = aSourceMap._file;\n\t    smc._sourceMapURL = aSourceMapURL;\n\t    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t    });\n\n\t    // Because we are modifying the entries (by converting string sources and\n\t    // names to indices into the sources and names ArraySets), we have to make\n\t    // a copy of the entry or else bad things happen. Shared mutable state\n\t    // strikes again! See github issue #191.\n\n\t    var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t    var destGeneratedMappings = smc.__generatedMappings = [];\n\t    var destOriginalMappings = smc.__originalMappings = [];\n\n\t    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t      var srcMapping = generatedMappings[i];\n\t      var destMapping = new Mapping;\n\t      destMapping.generatedLine = srcMapping.generatedLine;\n\t      destMapping.generatedColumn = srcMapping.generatedColumn;\n\n\t      if (srcMapping.source) {\n\t        destMapping.source = sources.indexOf(srcMapping.source);\n\t        destMapping.originalLine = srcMapping.originalLine;\n\t        destMapping.originalColumn = srcMapping.originalColumn;\n\n\t        if (srcMapping.name) {\n\t          destMapping.name = names.indexOf(srcMapping.name);\n\t        }\n\n\t        destOriginalMappings.push(destMapping);\n\t      }\n\n\t      destGeneratedMappings.push(destMapping);\n\t    }\n\n\t    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n\t    return smc;\n\t  };\n\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    return this._absoluteSources.slice();\n\t  }\n\t});\n\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t  this.generatedLine = 0;\n\t  this.generatedColumn = 0;\n\t  this.source = null;\n\t  this.originalLine = null;\n\t  this.originalColumn = null;\n\t  this.name = null;\n\t}\n\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    var generatedLine = 1;\n\t    var previousGeneratedColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousOriginalColumn = 0;\n\t    var previousSource = 0;\n\t    var previousName = 0;\n\t    var length = aStr.length;\n\t    var index = 0;\n\t    var cachedSegments = {};\n\t    var temp = {};\n\t    var originalMappings = [];\n\t    var generatedMappings = [];\n\t    var mapping, str, segment, end, value;\n\n\t    while (index < length) {\n\t      if (aStr.charAt(index) === ';') {\n\t        generatedLine++;\n\t        index++;\n\t        previousGeneratedColumn = 0;\n\t      }\n\t      else if (aStr.charAt(index) === ',') {\n\t        index++;\n\t      }\n\t      else {\n\t        mapping = new Mapping();\n\t        mapping.generatedLine = generatedLine;\n\n\t        // Because each offset is encoded relative to the previous one,\n\t        // many segments often have the same encoding. We can exploit this\n\t        // fact by caching the parsed variable length fields of each segment,\n\t        // allowing us to avoid a second parse if we encounter the same\n\t        // segment again.\n\t        for (end = index; end < length; end++) {\n\t          if (this._charIsMappingSeparator(aStr, end)) {\n\t            break;\n\t          }\n\t        }\n\t        str = aStr.slice(index, end);\n\n\t        segment = cachedSegments[str];\n\t        if (segment) {\n\t          index += str.length;\n\t        } else {\n\t          segment = [];\n\t          while (index < end) {\n\t            base64VLQ.decode(aStr, index, temp);\n\t            value = temp.value;\n\t            index = temp.rest;\n\t            segment.push(value);\n\t          }\n\n\t          if (segment.length === 2) {\n\t            throw new Error('Found a source, but no line and column');\n\t          }\n\n\t          if (segment.length === 3) {\n\t            throw new Error('Found a source and line, but no column');\n\t          }\n\n\t          cachedSegments[str] = segment;\n\t        }\n\n\t        // Generated column.\n\t        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t        previousGeneratedColumn = mapping.generatedColumn;\n\n\t        if (segment.length > 1) {\n\t          // Original source.\n\t          mapping.source = previousSource + segment[1];\n\t          previousSource += segment[1];\n\n\t          // Original line.\n\t          mapping.originalLine = previousOriginalLine + segment[2];\n\t          previousOriginalLine = mapping.originalLine;\n\t          // Lines are stored 0-based\n\t          mapping.originalLine += 1;\n\n\t          // Original column.\n\t          mapping.originalColumn = previousOriginalColumn + segment[3];\n\t          previousOriginalColumn = mapping.originalColumn;\n\n\t          if (segment.length > 4) {\n\t            // Original name.\n\t            mapping.name = previousName + segment[4];\n\t            previousName += segment[4];\n\t          }\n\t        }\n\n\t        generatedMappings.push(mapping);\n\t        if (typeof mapping.originalLine === 'number') {\n\t          originalMappings.push(mapping);\n\t        }\n\t      }\n\t    }\n\n\t    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    this.__generatedMappings = generatedMappings;\n\n\t    quickSort(originalMappings, util.compareByOriginalPositions);\n\t    this.__originalMappings = originalMappings;\n\t  };\n\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t                                         aColumnName, aComparator, aBias) {\n\t    // To return the position we are searching for, we must first find the\n\t    // mapping for the given position and then return the opposite position it\n\t    // points to. Because the mappings are sorted, we can use binary search to\n\t    // find the best mapping.\n\n\t    if (aNeedle[aLineName] <= 0) {\n\t      throw new TypeError('Line must be greater than or equal to 1, got '\n\t                          + aNeedle[aLineName]);\n\t    }\n\t    if (aNeedle[aColumnName] < 0) {\n\t      throw new TypeError('Column must be greater than or equal to 0, got '\n\t                          + aNeedle[aColumnName]);\n\t    }\n\n\t    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t  };\n\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t  function SourceMapConsumer_computeColumnSpans() {\n\t    for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t      var mapping = this._generatedMappings[index];\n\n\t      // Mappings do not contain a field for the last generated columnt. We\n\t      // can come up with an optimistic estimate, however, by assuming that\n\t      // mappings are contiguous (i.e. given two consecutive mappings, the\n\t      // first mapping ends where the second one starts).\n\t      if (index + 1 < this._generatedMappings.length) {\n\t        var nextMapping = this._generatedMappings[index + 1];\n\n\t        if (mapping.generatedLine === nextMapping.generatedLine) {\n\t          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t          continue;\n\t        }\n\t      }\n\n\t      // The last mapping for each line spans the entire line.\n\t      mapping.lastGeneratedColumn = Infinity;\n\t    }\n\t  };\n\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t  function SourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._generatedMappings,\n\t      \"generatedLine\",\n\t      \"generatedColumn\",\n\t      util.compareByGeneratedPositionsDeflated,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\n\t    if (index >= 0) {\n\t      var mapping = this._generatedMappings[index];\n\n\t      if (mapping.generatedLine === needle.generatedLine) {\n\t        var source = util.getArg(mapping, 'source', null);\n\t        if (source !== null) {\n\t          source = this._sources.at(source);\n\t          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n\t        }\n\t        var name = util.getArg(mapping, 'name', null);\n\t        if (name !== null) {\n\t          name = this._names.at(name);\n\t        }\n\t        return {\n\t          source: source,\n\t          line: util.getArg(mapping, 'originalLine', null),\n\t          column: util.getArg(mapping, 'originalColumn', null),\n\t          name: name\n\t        };\n\t      }\n\t    }\n\n\t    return {\n\t      source: null,\n\t      line: null,\n\t      column: null,\n\t      name: null\n\t    };\n\t  };\n\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t    if (!this.sourcesContent) {\n\t      return false;\n\t    }\n\t    return this.sourcesContent.length >= this._sources.size() &&\n\t      !this.sourcesContent.some(function (sc) { return sc == null; });\n\t  };\n\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    if (!this.sourcesContent) {\n\t      return null;\n\t    }\n\n\t    var index = this._findSourceIndex(aSource);\n\t    if (index >= 0) {\n\t      return this.sourcesContent[index];\n\t    }\n\n\t    var relativeSource = aSource;\n\t    if (this.sourceRoot != null) {\n\t      relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t    }\n\n\t    var url;\n\t    if (this.sourceRoot != null\n\t        && (url = util.urlParse(this.sourceRoot))) {\n\t      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t      // many users. We can help them out when they expect file:// URIs to\n\t      // behave like it would if they were running a local HTTP server. See\n\t      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n\t      if (url.scheme == \"file\"\n\t          && this._sources.has(fileUriAbsPath)) {\n\t        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t      }\n\n\t      if ((!url.path || url.path == \"/\")\n\t          && this._sources.has(\"/\" + relativeSource)) {\n\t        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n\t      }\n\t    }\n\n\t    // This function is used recursively from\n\t    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t    // don't want to throw if we can't find the source - we just want to\n\t    // return null, so we provide a flag to exit gracefully.\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t  function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t    var source = util.getArg(aArgs, 'source');\n\t    source = this._findSourceIndex(source);\n\t    if (source < 0) {\n\t      return {\n\t        line: null,\n\t        column: null,\n\t        lastColumn: null\n\t      };\n\t    }\n\n\t    var needle = {\n\t      source: source,\n\t      originalLine: util.getArg(aArgs, 'line'),\n\t      originalColumn: util.getArg(aArgs, 'column')\n\t    };\n\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._originalMappings,\n\t      \"originalLine\",\n\t      \"originalColumn\",\n\t      util.compareByOriginalPositions,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\n\t      if (mapping.source === needle.source) {\n\t        return {\n\t          line: util.getArg(mapping, 'generatedLine', null),\n\t          column: util.getArg(mapping, 'generatedColumn', null),\n\t          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t        };\n\t      }\n\t    }\n\n\t    return {\n\t      line: null,\n\t      column: null,\n\t      lastColumn: null\n\t    };\n\t  };\n\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The first parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *   - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t *   - offset: The offset into the original specified at which this section\n\t *       begins to apply, defined as an object with a \"line\" and \"column\"\n\t *       field.\n\t *   - map: A source map definition. This source map could also be indexed,\n\t *       but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t *  {\n\t *    version : 3,\n\t *    file: \"app.js\",\n\t *    sections: [{\n\t *      offset: {line:100, column:10},\n\t *      map: {\n\t *        version : 3,\n\t *        file: \"section.js\",\n\t *        sources: [\"foo.js\", \"bar.js\"],\n\t *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *        mappings: \"AAAA,E;;ABCDE;\"\n\t *      }\n\t *    }],\n\t *  }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sections = util.getArg(sourceMap, 'sections');\n\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\n\t  var lastOffset = {\n\t    line: -1,\n\t    column: 0\n\t  };\n\t  this._sections = sections.map(function (s) {\n\t    if (s.url) {\n\t      // The url field will require support for asynchronicity.\n\t      // See https://github.com/mozilla/source-map/issues/16\n\t      throw new Error('Support for url field in sections not implemented.');\n\t    }\n\t    var offset = util.getArg(s, 'offset');\n\t    var offsetLine = util.getArg(offset, 'line');\n\t    var offsetColumn = util.getArg(offset, 'column');\n\n\t    if (offsetLine < lastOffset.line ||\n\t        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t      throw new Error('Section offsets must be ordered and non-overlapping.');\n\t    }\n\t    lastOffset = offset;\n\n\t    return {\n\t      generatedOffset: {\n\t        // The offset fields are 0-based, but we use 1-based indices when\n\t        // encoding/decoding from VLQ.\n\t        generatedLine: offsetLine + 1,\n\t        generatedColumn: offsetColumn + 1\n\t      },\n\t      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n\t    }\n\t  });\n\t}\n\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    var sources = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t        sources.push(this._sections[i].consumer.sources[j]);\n\t      }\n\t    }\n\t    return sources;\n\t  }\n\t});\n\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\n\t    // Find the section containing the generated position we're trying to map\n\t    // to an original position.\n\t    var sectionIndex = binarySearch.search(needle, this._sections,\n\t      function(needle, section) {\n\t        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t        if (cmp) {\n\t          return cmp;\n\t        }\n\n\t        return (needle.generatedColumn -\n\t                section.generatedOffset.generatedColumn);\n\t      });\n\t    var section = this._sections[sectionIndex];\n\n\t    if (!section) {\n\t      return {\n\t        source: null,\n\t        line: null,\n\t        column: null,\n\t        name: null\n\t      };\n\t    }\n\n\t    return section.consumer.originalPositionFor({\n\t      line: needle.generatedLine -\n\t        (section.generatedOffset.generatedLine - 1),\n\t      column: needle.generatedColumn -\n\t        (section.generatedOffset.generatedLine === needle.generatedLine\n\t         ? section.generatedOffset.generatedColumn - 1\n\t         : 0),\n\t      bias: aArgs.bias\n\t    });\n\t  };\n\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t    return this._sections.every(function (s) {\n\t      return s.consumer.hasContentsOfAllSources();\n\t    });\n\t  };\n\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\n\t      var content = section.consumer.sourceContentFor(aSource, true);\n\t      if (content) {\n\t        return content;\n\t      }\n\t    }\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based. \n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\n\t      // Only consider this section if the requested source is in the list of\n\t      // sources of the consumer.\n\t      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n\t        continue;\n\t      }\n\t      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t      if (generatedPosition) {\n\t        var ret = {\n\t          line: generatedPosition.line +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          column: generatedPosition.column +\n\t            (section.generatedOffset.generatedLine === generatedPosition.line\n\t             ? section.generatedOffset.generatedColumn - 1\n\t             : 0)\n\t        };\n\t        return ret;\n\t      }\n\t    }\n\n\t    return {\n\t      line: null,\n\t      column: null\n\t    };\n\t  };\n\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    this.__generatedMappings = [];\n\t    this.__originalMappings = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t      var sectionMappings = section.consumer._generatedMappings;\n\t      for (var j = 0; j < sectionMappings.length; j++) {\n\t        var mapping = sectionMappings[j];\n\n\t        var source = section.consumer._sources.at(mapping.source);\n\t        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t        this._sources.add(source);\n\t        source = this._sources.indexOf(source);\n\n\t        var name = null;\n\t        if (mapping.name) {\n\t          name = section.consumer._names.at(mapping.name);\n\t          this._names.add(name);\n\t          name = this._names.indexOf(name);\n\t        }\n\n\t        // The mappings coming from the consumer for the section have\n\t        // generated positions relative to the start of the section, so we\n\t        // need to offset them to be relative to the start of the concatenated\n\t        // generated file.\n\t        var adjustedMapping = {\n\t          source: source,\n\t          generatedLine: mapping.generatedLine +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          generatedColumn: mapping.generatedColumn +\n\t            (section.generatedOffset.generatedLine === mapping.generatedLine\n\t            ? section.generatedOffset.generatedColumn - 1\n\t            : 0),\n\t          originalLine: mapping.originalLine,\n\t          originalColumn: mapping.originalColumn,\n\t          name: name\n\t        };\n\n\t        this.__generatedMappings.push(adjustedMapping);\n\t        if (typeof adjustedMapping.originalLine === 'number') {\n\t          this.__originalMappings.push(adjustedMapping);\n\t        }\n\t      }\n\t    }\n\n\t    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t  };\n\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t  // This function terminates when one of the following is true:\n\t  //\n\t  //   1. We find the exact element we are looking for.\n\t  //\n\t  //   2. We did not find the exact element, but we can return the index of\n\t  //      the next-closest element.\n\t  //\n\t  //   3. We did not find the exact element, and there is no next-closest\n\t  //      element than the one we are searching for, so we return -1.\n\t  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t  if (cmp === 0) {\n\t    // Found the element we are looking for.\n\t    return mid;\n\t  }\n\t  else if (cmp > 0) {\n\t    // Our needle is greater than aHaystack[mid].\n\t    if (aHigh - mid > 1) {\n\t      // The element is in the upper half.\n\t      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\n\t    // The exact needle element was not found in this haystack. Determine if\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return aHigh < aHaystack.length ? aHigh : -1;\n\t    } else {\n\t      return mid;\n\t    }\n\t  }\n\t  else {\n\t    // Our needle is less than aHaystack[mid].\n\t    if (mid - aLow > 1) {\n\t      // The element is in the lower half.\n\t      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return mid;\n\t    } else {\n\t      return aLow < 0 ? -1 : aLow;\n\t    }\n\t  }\n\t}\n\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t *     array and returns -1, 0, or 1 depending on whether the needle is less\n\t *     than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t  if (aHaystack.length === 0) {\n\t    return -1;\n\t  }\n\n\t  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t  if (index < 0) {\n\t    return -1;\n\t  }\n\n\t  // We have found either the exact element, or the next-closest element than\n\t  // the one we are searching for. However, there may be more than one such\n\t  // element. Make sure we always return the smallest of these.\n\t  while (index - 1 >= 0) {\n\t    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t      break;\n\t    }\n\t    --index;\n\t  }\n\n\t  return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t *        The array.\n\t * @param {Number} x\n\t *        The index of the first item.\n\t * @param {Number} y\n\t *        The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t  var temp = ary[x];\n\t  ary[x] = ary[y];\n\t  ary[y] = temp;\n\t}\n\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t *        The lower bound on the range.\n\t * @param {Number} high\n\t *        The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t  return Math.round(low + (Math.random() * (high - low)));\n\t}\n\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t * @param {Number} p\n\t *        Start index of the array\n\t * @param {Number} r\n\t *        End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t  // If our lower bound is less than our upper bound, we (1) partition the\n\t  // array into two pieces and (2) recurse on each half. If it is not, this is\n\t  // the empty array and our base case.\n\n\t  if (p < r) {\n\t    // (1) Partitioning.\n\t    //\n\t    // The partitioning chooses a pivot between `p` and `r` and moves all\n\t    // elements that are less than or equal to the pivot to the before it, and\n\t    // all the elements that are greater than it after it. The effect is that\n\t    // once partition is done, the pivot is in the exact place it will be when\n\t    // the array is put in sorted order, and it will not need to be moved\n\t    // again. This runs in O(n) time.\n\n\t    // Always choose a random pivot so that an input array which is reverse\n\t    // sorted does not cause O(n^2) running time.\n\t    var pivotIndex = randomIntInRange(p, r);\n\t    var i = p - 1;\n\n\t    swap(ary, pivotIndex, r);\n\t    var pivot = ary[r];\n\n\t    // Immediately after `j` is incremented in this loop, the following hold\n\t    // true:\n\t    //\n\t    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t    //\n\t    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t    for (var j = p; j < r; j++) {\n\t      if (comparator(ary[j], pivot) <= 0) {\n\t        i += 1;\n\t        swap(ary, i, j);\n\t      }\n\t    }\n\n\t    swap(ary, i + 1, j);\n\t    var q = i + 1;\n\n\t    // (2) Recurse on each half.\n\n\t    doQuickSort(ary, comparator, p, q - 1);\n\t    doQuickSort(ary, comparator, q + 1, r);\n\t  }\n\t}\n\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t  doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t *        generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t  this.children = [];\n\t  this.sourceContents = {};\n\t  this.line = aLine == null ? null : aLine;\n\t  this.column = aColumn == null ? null : aColumn;\n\t  this.source = aSource == null ? null : aSource;\n\t  this.name = aName == null ? null : aName;\n\t  this[isSourceNode] = true;\n\t  if (aChunks != null) this.add(aChunks);\n\t}\n\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t *        SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t    // The SourceNode we want to fill with the generated code\n\t    // and the SourceMap\n\t    var node = new SourceNode();\n\n\t    // All even indices of this array are one line of the generated code,\n\t    // while all odd indices are the newlines between two adjacent lines\n\t    // (since `REGEX_NEWLINE` captures its match).\n\t    // Processed fragments are accessed by calling `shiftNextLine`.\n\t    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t    var remainingLinesIndex = 0;\n\t    var shiftNextLine = function() {\n\t      var lineContents = getNextLine();\n\t      // The last line of a file might not have a newline.\n\t      var newLine = getNextLine() || \"\";\n\t      return lineContents + newLine;\n\n\t      function getNextLine() {\n\t        return remainingLinesIndex < remainingLines.length ?\n\t            remainingLines[remainingLinesIndex++] : undefined;\n\t      }\n\t    };\n\n\t    // We need to remember the position of \"remainingLines\"\n\t    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n\t    // The generate SourceNodes we need a code range.\n\t    // To extract it current and last mapping is used.\n\t    // Here we store the last mapping.\n\t    var lastMapping = null;\n\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      if (lastMapping !== null) {\n\t        // We add the code from \"lastMapping\" to \"mapping\":\n\t        // First check if there is a new line in between.\n\t        if (lastGeneratedLine < mapping.generatedLine) {\n\t          // Associate first line with \"lastMapping\"\n\t          addMappingWithCode(lastMapping, shiftNextLine());\n\t          lastGeneratedLine++;\n\t          lastGeneratedColumn = 0;\n\t          // The remaining code is added without mapping\n\t        } else {\n\t          // There is no new line in between.\n\t          // Associate the code between \"lastGeneratedColumn\" and\n\t          // \"mapping.generatedColumn\" with \"lastMapping\"\n\t          var nextLine = remainingLines[remainingLinesIndex] || '';\n\t          var code = nextLine.substr(0, mapping.generatedColumn -\n\t                                        lastGeneratedColumn);\n\t          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t                                              lastGeneratedColumn);\n\t          lastGeneratedColumn = mapping.generatedColumn;\n\t          addMappingWithCode(lastMapping, code);\n\t          // No more remaining code, continue\n\t          lastMapping = mapping;\n\t          return;\n\t        }\n\t      }\n\t      // We add the generated code until the first mapping\n\t      // to the SourceNode without any mapping.\n\t      // Each line is added as separate string.\n\t      while (lastGeneratedLine < mapping.generatedLine) {\n\t        node.add(shiftNextLine());\n\t        lastGeneratedLine++;\n\t      }\n\t      if (lastGeneratedColumn < mapping.generatedColumn) {\n\t        var nextLine = remainingLines[remainingLinesIndex] || '';\n\t        node.add(nextLine.substr(0, mapping.generatedColumn));\n\t        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t        lastGeneratedColumn = mapping.generatedColumn;\n\t      }\n\t      lastMapping = mapping;\n\t    }, this);\n\t    // We have processed all mappings.\n\t    if (remainingLinesIndex < remainingLines.length) {\n\t      if (lastMapping) {\n\t        // Associate the remaining code in the current line with \"lastMapping\"\n\t        addMappingWithCode(lastMapping, shiftNextLine());\n\t      }\n\t      // and add the remaining lines without any mapping\n\t      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t    }\n\n\t    // Copy sourcesContent into SourceNode\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aRelativePath != null) {\n\t          sourceFile = util.join(aRelativePath, sourceFile);\n\t        }\n\t        node.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\n\t    return node;\n\n\t    function addMappingWithCode(mapping, code) {\n\t      if (mapping === null || mapping.source === undefined) {\n\t        node.add(code);\n\t      } else {\n\t        var source = aRelativePath\n\t          ? util.join(aRelativePath, mapping.source)\n\t          : mapping.source;\n\t        node.add(new SourceNode(mapping.originalLine,\n\t                                mapping.originalColumn,\n\t                                source,\n\t                                code,\n\t                                mapping.name));\n\t      }\n\t    }\n\t  };\n\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    aChunk.forEach(function (chunk) {\n\t      this.add(chunk);\n\t    }, this);\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    if (aChunk) {\n\t      this.children.push(aChunk);\n\t    }\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    for (var i = aChunk.length-1; i >= 0; i--) {\n\t      this.prepend(aChunk[i]);\n\t    }\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    this.children.unshift(aChunk);\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t  var chunk;\n\t  for (var i = 0, len = this.children.length; i < len; i++) {\n\t    chunk = this.children[i];\n\t    if (chunk[isSourceNode]) {\n\t      chunk.walk(aFn);\n\t    }\n\t    else {\n\t      if (chunk !== '') {\n\t        aFn(chunk, { source: this.source,\n\t                     line: this.line,\n\t                     column: this.column,\n\t                     name: this.name });\n\t      }\n\t    }\n\t  }\n\t};\n\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t  var newChildren;\n\t  var i;\n\t  var len = this.children.length;\n\t  if (len > 0) {\n\t    newChildren = [];\n\t    for (i = 0; i < len-1; i++) {\n\t      newChildren.push(this.children[i]);\n\t      newChildren.push(aSep);\n\t    }\n\t    newChildren.push(this.children[i]);\n\t    this.children = newChildren;\n\t  }\n\t  return this;\n\t};\n\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t  var lastChild = this.children[this.children.length - 1];\n\t  if (lastChild[isSourceNode]) {\n\t    lastChild.replaceRight(aPattern, aReplacement);\n\t  }\n\t  else if (typeof lastChild === 'string') {\n\t    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t  }\n\t  else {\n\t    this.children.push(''.replace(aPattern, aReplacement));\n\t  }\n\t  return this;\n\t};\n\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t  };\n\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t  function SourceNode_walkSourceContents(aFn) {\n\t    for (var i = 0, len = this.children.length; i < len; i++) {\n\t      if (this.children[i][isSourceNode]) {\n\t        this.children[i].walkSourceContents(aFn);\n\t      }\n\t    }\n\n\t    var sources = Object.keys(this.sourceContents);\n\t    for (var i = 0, len = sources.length; i < len; i++) {\n\t      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t    }\n\t  };\n\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t  var str = \"\";\n\t  this.walk(function (chunk) {\n\t    str += chunk;\n\t  });\n\t  return str;\n\t};\n\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t  var generated = {\n\t    code: \"\",\n\t    line: 1,\n\t    column: 0\n\t  };\n\t  var map = new SourceMapGenerator(aArgs);\n\t  var sourceMappingActive = false;\n\t  var lastOriginalSource = null;\n\t  var lastOriginalLine = null;\n\t  var lastOriginalColumn = null;\n\t  var lastOriginalName = null;\n\t  this.walk(function (chunk, original) {\n\t    generated.code += chunk;\n\t    if (original.source !== null\n\t        && original.line !== null\n\t        && original.column !== null) {\n\t      if(lastOriginalSource !== original.source\n\t         || lastOriginalLine !== original.line\n\t         || lastOriginalColumn !== original.column\n\t         || lastOriginalName !== original.name) {\n\t        map.addMapping({\n\t          source: original.source,\n\t          original: {\n\t            line: original.line,\n\t            column: original.column\n\t          },\n\t          generated: {\n\t            line: generated.line,\n\t            column: generated.column\n\t          },\n\t          name: original.name\n\t        });\n\t      }\n\t      lastOriginalSource = original.source;\n\t      lastOriginalLine = original.line;\n\t      lastOriginalColumn = original.column;\n\t      lastOriginalName = original.name;\n\t      sourceMappingActive = true;\n\t    } else if (sourceMappingActive) {\n\t      map.addMapping({\n\t        generated: {\n\t          line: generated.line,\n\t          column: generated.column\n\t        }\n\t      });\n\t      lastOriginalSource = null;\n\t      sourceMappingActive = false;\n\t    }\n\t    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t        generated.line++;\n\t        generated.column = 0;\n\t        // Mappings end at eol\n\t        if (idx + 1 === length) {\n\t          lastOriginalSource = null;\n\t          sourceMappingActive = false;\n\t        } else if (sourceMappingActive) {\n\t          map.addMapping({\n\t            source: original.source,\n\t            original: {\n\t              line: original.line,\n\t              column: original.column\n\t            },\n\t            generated: {\n\t              line: generated.line,\n\t              column: generated.column\n\t            },\n\t            name: original.name\n\t          });\n\t        }\n\t      } else {\n\t        generated.column++;\n\t      }\n\t    }\n\t  });\n\t  this.walkSourceContents(function (sourceFile, sourceContent) {\n\t    map.setSourceContent(sourceFile, sourceContent);\n\t  });\n\n\t  return { code: generated.code, map: map };\n\t};\n\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/dist/source-map.min.js",
    "content": "!function(e,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define([],n):\"object\"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p=\"\",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,\"file\",null),this._sourceRoot=i.getArg(e,\"sourceRoot\",null),this._skipValidation=i.getArg(e,\"skipValidation\",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(t){var o=t;null!==n&&(o=i.relative(n,t)),r._sources.has(o)||r._sources.add(o);var s=e.sourceContentFor(t);null!=s&&r.setSourceContent(t,s)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,\"generated\"),r=i.getArg(e,\"original\",null),t=i.getArg(e,\"source\",null),o=i.getArg(e,\"name\",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\\'s \"file\" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&\"number\"!=typeof n.line&&\"number\"!=typeof n.column)throw new Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if((!(e&&\"line\"in e&&\"column\"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&\"line\"in e&&\"column\"in e&&n&&\"line\"in n&&\"column\"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error(\"Invalid mapping: \"+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p=\"\",h=this._mappings.toArray(),f=0,d=h.length;f<d;f++){if(n=h[f],e=\"\",n.generatedLine!==a)for(s=0;n.generatedLine!==a;)e+=\";\",a++;else if(f>0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=\",\"}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<<s,u=a-1,l=a;n.encode=function(e){var n,r=\"\",o=t(e);do n=o&u,o>>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error(\"Invalid base64 digit: \"+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<<p,p+=s}while(t);r.value=o(g),r.rest=n}},function(e,n){var r=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(e){if(0<=e&&e<r.length)return r[e];throw new TypeError(\"Must be between 0 and 63: \"+e)},n.decode=function(e){var n=65,r=90,t=97,o=122,i=48,s=57,a=43,u=47,l=26,c=52;return n<=e&&e<=r?e-n:t<=e&&e<=o?e-t+l:i<=e&&e<=s?e-i+c:e==a?62:e==u?63:-1}},function(e,n){function r(e,n,r){if(n in e)return e[n];if(3===arguments.length)return r;throw new Error('\"'+n+'\" is a required argument.')}function t(e){var n=e.match(v);return n?{scheme:n[1],auth:n[2],host:n[3],port:n[4],path:n[5]}:null}function o(e){var n=\"\";return e.scheme&&(n+=e.scheme+\":\"),n+=\"//\",e.auth&&(n+=e.auth+\"@\"),e.host&&(n+=e.host),e.port&&(n+=\":\"+e.port),e.path&&(n+=e.path),n}function i(e){var r=e,i=t(e);if(i){if(!i.path)return e;r=i.path}for(var s,a=n.isAbsolute(r),u=r.split(/\\/+/),l=0,c=u.length-1;c>=0;c--)s=u[c],\".\"===s?u.splice(c,1):\"..\"===s?l++:l>0&&(\"\"===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join(\"/\"),\"\"===r&&(r=a?\"/\":\".\"),i?(i.path=r,o(i)):r}function s(e,n){\"\"===e&&(e=\".\"),\"\"===n&&(n=\".\");var r=t(n),s=t(e);if(s&&(e=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(y))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a=\"/\"===n.charAt(0)?n:i(e.replace(/\\/+$/,\"\")+\"/\"+n);return s?(s.path=a,o(s)):a}function a(e,n){\"\"===e&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;0!==n.indexOf(e+\"/\");){var t=e.lastIndexOf(\"/\");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\\/]+:\\/)?\\/*$/))return n;++r}return Array(r+1).join(\"../\")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?\"$\"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=f(e.source,n.source);return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:f(e.name,n.name)))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=f(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:f(e.name,n.name)))))}function f(e,n){return e===n?0:null===e?1:null===n?-1:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}function m(e){return JSON.parse(e.replace(/^\\)]}'[^\\n]*\\n/,\"\"))}function _(e,n,r){if(n=n||\"\",e&&(\"/\"!==e[e.length-1]&&\"/\"!==n[0]&&(e+=\"/\"),n=e+n),r){var a=t(r);if(!a)throw new Error(\"sourceMapURL could not be parsed\");if(a.path){var u=a.path.lastIndexOf(\"/\");u>=0&&(a.path=a.path.substring(0,u+1))}n=s(o(a),n)}return i(n)}n.getArg=r;var v=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,y=/^data:.+\\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return\"/\"===e.charAt(0)||v.test(e)},n.relative=a;var C=function(){var e=Object.create(null);return!(\"__proto__\"in e)}();n.toSetString=C?u:l,n.fromSetString=C?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d,n.parseSourceMapInput=m,n.computeSourceURL=_},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s=\"undefined\"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o<i;o++)r.add(e[o],n);return r},t.prototype.size=function(){return s?this._set.size:Object.getOwnPropertyNames(this._set).length},t.prototype.add=function(e,n){var r=s?e:o.toSetString(e),t=s?this.has(e):i.call(this._set,r),a=this._array.length;t&&!n||this._array.push(e),t||(s?this._set.set(e,a):this._set[r]=a)},t.prototype.has=function(e){if(s)return this._set.has(e);var n=o.toSetString(e);return i.call(this._set,n)},t.prototype.indexOf=function(e){if(s){var n=this._set.get(e);if(n>=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('\"'+e+'\" is not in the set.')},t.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error(\"No element indexed by \"+e)},t.prototype.toArray=function(){return this._array.slice()},n.ArraySet=t},function(e,n,r){function t(e,n){var r=e.generatedLine,t=n.generatedLine,o=e.generatedColumn,s=n.generatedColumn;return t>r||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e,n){var r=e;return\"string\"==typeof e&&(r=a.parseSourceMapInput(e)),null!=r.sections?new s(r,n):new o(r,n)}function o(e,n){var r=e;\"string\"==typeof e&&(r=a.parseSourceMapInput(e));var t=a.getArg(r,\"version\"),o=a.getArg(r,\"sources\"),i=a.getArg(r,\"names\",[]),s=a.getArg(r,\"sourceRoot\",null),u=a.getArg(r,\"sourcesContent\",null),c=a.getArg(r,\"mappings\"),g=a.getArg(r,\"file\",null);if(t!=this._version)throw new Error(\"Unsupported version: \"+t);s&&(s=a.normalize(s)),o=o.map(String).map(a.normalize).map(function(e){return s&&a.isAbsolute(s)&&a.isAbsolute(e)?a.relative(s,e):e}),this._names=l.fromArray(i.map(String),!0),this._sources=l.fromArray(o,!0),this._absoluteSources=this._sources.toArray().map(function(e){return a.computeSourceURL(s,e,n)}),this.sourceRoot=s,this.sourcesContent=u,this._mappings=c,this._sourceMapURL=n,this.file=g}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e,n){var r=e;\"string\"==typeof e&&(r=a.parseSourceMapInput(e));var o=a.getArg(r,\"version\"),i=a.getArg(r,\"sections\");if(o!=this._version)throw new Error(\"Unsupported version: \"+o);this._sources=new l,this._names=new l;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw new Error(\"Support for url field in sections not implemented.\");var r=a.getArg(e,\"offset\"),o=a.getArg(r,\"line\"),i=a.getArg(r,\"column\");if(o<s.line||o===s.line&&i<s.column)throw new Error(\"Section offsets must be ordered and non-overlapping.\");return s=r,{generatedOffset:{generatedLine:o+1,generatedColumn:i+1},consumer:new t(a.getArg(e,\"map\"),n)}})}var a=r(4),u=r(8),l=r(5).ArraySet,c=r(2),g=r(9).quickSort;t.fromSourceMap=function(e,n){return o.fromSourceMap(e,n)},t.prototype._version=3,t.prototype.__generatedMappings=null,Object.defineProperty(t.prototype,\"_generatedMappings\",{configurable:!0,enumerable:!0,get:function(){return this.__generatedMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__generatedMappings}}),t.prototype.__originalMappings=null,Object.defineProperty(t.prototype,\"_originalMappings\",{configurable:!0,enumerable:!0,get:function(){return this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__originalMappings}}),t.prototype._charIsMappingSeparator=function(e,n){var r=e.charAt(n);return\";\"===r||\",\"===r},t.prototype._parseMappings=function(e,n){throw new Error(\"Subclasses must implement _parseMappings\")},t.GENERATED_ORDER=1,t.ORIGINAL_ORDER=2,t.GREATEST_LOWER_BOUND=1,t.LEAST_UPPER_BOUND=2,t.prototype.eachMapping=function(e,n,r){var o,i=n||null,s=r||t.GENERATED_ORDER;switch(s){case t.GENERATED_ORDER:o=this._generatedMappings;break;case t.ORIGINAL_ORDER:o=this._originalMappings;break;default:throw new Error(\"Unknown order of iteration.\")}var u=this.sourceRoot;o.map(function(e){var n=null===e.source?null:this._sources.at(e.source);return n=a.computeSourceURL(u,n,this._sourceMapURL),{source:n,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:null===e.name?null:this._names.at(e.name)}},this).forEach(e,i)},t.prototype.allGeneratedPositionsFor=function(e){var n=a.getArg(e,\"line\"),r={source:a.getArg(e,\"source\"),originalLine:n,originalColumn:a.getArg(e,\"column\",0)};if(r.source=this._findSourceIndex(r.source),r.source<0)return[];var t=[],o=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",a.compareByOriginalPositions,u.LEAST_UPPER_BOUND);if(o>=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,\"generatedLine\",null),column:a.getArg(i,\"generatedColumn\",null),lastColumn:a.getArg(i,\"lastGeneratedColumn\",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,\"generatedLine\",null),column:a.getArg(i,\"generatedColumn\",null),lastColumn:a.getArg(i,\"lastGeneratedColumn\",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.prototype._findSourceIndex=function(e){var n=e;if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);var r;for(r=0;r<this._absoluteSources.length;++r)if(this._absoluteSources[r]==e)return r;return-1},o.fromSourceMap=function(e,n){var r=Object.create(o.prototype),t=r._names=l.fromArray(e._names.toArray(),!0),s=r._sources=l.fromArray(e._sources.toArray(),!0);r.sourceRoot=e._sourceRoot,r.sourcesContent=e._generateSourcesContent(r._sources.toArray(),r.sourceRoot),r.file=e._file,r._sourceMapURL=n,r._absoluteSources=r._sources.toArray().map(function(e){return a.computeSourceURL(r.sourceRoot,e,n)});for(var u=e._mappings.toArray().slice(),c=r.__generatedMappings=[],p=r.__originalMappings=[],h=0,f=u.length;h<f;h++){var d=u[h],m=new i;m.generatedLine=d.generatedLine,m.generatedColumn=d.generatedColumn,d.source&&(m.source=s.indexOf(d.source),m.originalLine=d.originalLine,m.originalColumn=d.originalColumn,d.name&&(m.name=t.indexOf(d.name)),p.push(m)),c.push(m)}return g(r.__originalMappings,a.compareByOriginalPositions),r},o.prototype._version=3,Object.defineProperty(o.prototype,\"sources\",{get:function(){return this._absoluteSources.slice()}}),o.prototype._parseMappings=function(e,n){for(var r,t,o,s,u,l=1,p=0,h=0,f=0,d=0,m=0,_=e.length,v=0,y={},C={},S=[],A=[];v<_;)if(\";\"===e.charAt(v))l++,v++,p=0;else if(\",\"===e.charAt(v))v++;else{for(r=new i,r.generatedLine=l,s=v;s<_&&!this._charIsMappingSeparator(e,s);s++);if(t=e.slice(v,s),o=y[t])v+=t.length;else{for(o=[];v<s;)c.decode(e,v,C),u=C.value,v=C.rest,o.push(u);if(2===o.length)throw new Error(\"Found a source, but no line and column\");if(3===o.length)throw new Error(\"Found a source and line, but no column\");y[t]=o}r.generatedColumn=p+o[0],p=r.generatedColumn,o.length>1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),A.push(r),\"number\"==typeof r.originalLine&&S.push(r)}g(A,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=A,g(S,a.compareByOriginalPositions),this.__originalMappings=S},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError(\"Line must be greater than or equal to 1, got \"+e[r]);if(e[t]<0)throw new TypeError(\"Column must be greater than or equal to 0, got \"+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e<this._generatedMappings.length;++e){var n=this._generatedMappings[e];if(e+1<this._generatedMappings.length){var r=this._generatedMappings[e+1];if(n.generatedLine===r.generatedLine){n.lastGeneratedColumn=r.generatedColumn-1;continue}}n.lastGeneratedColumn=1/0}},o.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,\"line\"),generatedColumn:a.getArg(e,\"column\")},r=this._findMapping(n,this._generatedMappings,\"generatedLine\",\"generatedColumn\",a.compareByGeneratedPositionsDeflated,a.getArg(e,\"bias\",t.GREATEST_LOWER_BOUND));if(r>=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,\"source\",null);null!==i&&(i=this._sources.at(i),i=a.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));var s=a.getArg(o,\"name\",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,\"originalLine\",null),column:a.getArg(o,\"originalColumn\",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;var r=this._findSourceIndex(e);if(r>=0)return this.sourcesContent[r];var t=e;null!=this.sourceRoot&&(t=a.relative(this.sourceRoot,t));var o;if(null!=this.sourceRoot&&(o=a.urlParse(this.sourceRoot))){var i=t.replace(/^file:\\/\\//,\"\");if(\"file\"==o.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!o.path||\"/\"==o.path)&&this._sources.has(\"/\"+t))return this.sourcesContent[this._sources.indexOf(\"/\"+t)]}if(n)return null;throw new Error('\"'+t+'\" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,\"source\");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};var r={source:n,originalLine:a.getArg(e,\"line\"),originalColumn:a.getArg(e,\"column\")},o=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",a.compareByOriginalPositions,a.getArg(e,\"bias\",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,\"generatedLine\",null),column:a.getArg(i,\"generatedColumn\",null),lastColumn:a.getArg(i,\"lastGeneratedColumn\",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,\"sources\",{get:function(){for(var e=[],n=0;n<this._sections.length;n++)for(var r=0;r<this._sections[n].consumer.sources.length;r++)e.push(this._sections[n].consumer.sources[r]);return e}}),s.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,\"line\"),generatedColumn:a.getArg(e,\"column\")},r=u.search(n,this._sections,function(e,n){var r=e.generatedLine-n.generatedOffset.generatedLine;return r?r:e.generatedColumn-n.generatedOffset.generatedColumn}),t=this._sections[r];return t?t.consumer.originalPositionFor({line:n.generatedLine-(t.generatedOffset.generatedLine-1),column:n.generatedColumn-(t.generatedOffset.generatedLine===n.generatedLine?t.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}},s.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(e){return e.consumer.hasContentsOfAllSources()})},s.prototype.sourceContentFor=function(e,n){for(var r=0;r<this._sections.length;r++){var t=this._sections[r],o=t.consumer.sourceContentFor(e,!0);if(o)return o}if(n)return null;throw new Error('\"'+e+'\" is not in the SourceMap.')},s.prototype.generatedPositionFor=function(e){for(var n=0;n<this._sections.length;n++){var r=this._sections[n];if(r.consumer._findSourceIndex(a.getArg(e,\"source\"))!==-1){var t=r.consumer.generatedPositionFor(e);if(t){var o={line:t.line+(r.generatedOffset.generatedLine-1),column:t.column+(r.generatedOffset.generatedLine===t.line?r.generatedOffset.generatedColumn-1:0)};return o}}}return{line:null,column:null}},s.prototype._parseMappings=function(e,n){this.__generatedMappings=[],this.__originalMappings=[];for(var r=0;r<this._sections.length;r++)for(var t=this._sections[r],o=t.consumer._generatedMappings,i=0;i<o.length;i++){var s=o[i],u=t.consumer._sources.at(s.source);u=a.computeSourceURL(t.consumer.sourceRoot,u,this._sourceMapURL),this._sources.add(u),u=this._sources.indexOf(u);var l=null;s.name&&(l=t.consumer._names.at(s.name),this._names.add(l),l=this._names.indexOf(l));var c={source:u,generatedLine:s.generatedLine+(t.generatedOffset.generatedLine-1),generatedColumn:s.generatedColumn+(t.generatedOffset.generatedLine===s.generatedLine?t.generatedOffset.generatedColumn-1:0),originalLine:s.originalLine,originalColumn:s.originalColumn,name:l};this.__generatedMappings.push(c),\"number\"==typeof c.originalLine&&this.__originalMappings.push(c)}g(this.__generatedMappings,a.compareByGeneratedPositionsDeflated),g(this.__originalMappings,a.compareByOriginalPositions)},n.IndexedSourceMapConsumer=s},function(e,n){function r(e,t,o,i,s,a){var u=Math.floor((t-e)/2)+e,l=s(o,i[u],!0);return 0===l?u:l>0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t<i.length?t:-1:u:u-e>1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i<s){var a=t(i,s),u=i-1;r(e,a,s);for(var l=e[s],c=i;c<s;c++)n(e[c],l)<=0&&(u+=1,r(e,u,c));r(e,u+1,c);var g=u+1;o(e,n,i,g-1),o(e,n,g+1,s)}}n.quickSort=function(e,n){o(e,n,0,e.length-1)}},function(e,n,r){function t(e,n,r,t,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==n?null:n,this.source=null==r?null:r,this.name=null==o?null:o,this[u]=!0,null!=t&&this.add(t)}var o=r(1).SourceMapGenerator,i=r(4),s=/(\\r?\\n)/,a=10,u=\"$$$isSourceNode$$$\";t.fromStringWithSourceMap=function(e,n,r){function o(e,n){if(null===e||void 0===e.source)a.add(n);else{var o=r?i.join(r,e.source):e.source;a.add(new t(e.originalLine,e.originalColumn,o,n,e.name))}}var a=new t,u=e.split(s),l=0,c=function(){function e(){return l<u.length?u[l++]:void 0}var n=e(),r=e()||\"\";return n+r},g=1,p=0,h=null;return n.eachMapping(function(e){if(null!==h){if(!(g<e.generatedLine)){var n=u[l]||\"\",r=n.substr(0,e.generatedColumn-p);return u[l]=n.substr(e.generatedColumn-p),p=e.generatedColumn,o(h,r),void(h=e)}o(h,c()),g++,p=0}for(;g<e.generatedLine;)a.add(c()),g++;if(p<e.generatedColumn){var n=u[l]||\"\";a.add(n.substr(0,e.generatedColumn)),u[l]=n.substr(e.generatedColumn),p=e.generatedColumn}h=e},this),l<u.length&&(h&&o(h,c()),a.add(u.splice(l).join(\"\"))),n.sources.forEach(function(e){var t=n.sourceContentFor(e);null!=t&&(null!=r&&(e=i.join(r,e)),a.setSourceContent(e,t))}),a},t.prototype.add=function(e){if(Array.isArray(e))e.forEach(function(e){this.add(e)},this);else{if(!e[u]&&\"string\"!=typeof e)throw new TypeError(\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \"+e);e&&this.children.push(e)}return this},t.prototype.prepend=function(e){if(Array.isArray(e))for(var n=e.length-1;n>=0;n--)this.prepend(e[n]);else{if(!e[u]&&\"string\"!=typeof e)throw new TypeError(\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \"+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r<t;r++)n=this.children[r],n[u]?n.walk(e):\"\"!==n&&e(n,{source:this.source,line:this.line,column:this.column,name:this.name})},t.prototype.join=function(e){var n,r,t=this.children.length;if(t>0){for(n=[],r=0;r<t-1;r++)n.push(this.children[r]),n.push(e);n.push(this.children[r]),this.children=n}return this},t.prototype.replaceRight=function(e,n){var r=this.children[this.children.length-1];return r[u]?r.replaceRight(e,n):\"string\"==typeof r?this.children[this.children.length-1]=r.replace(e,n):this.children.push(\"\".replace(e,n)),this},t.prototype.setSourceContent=function(e,n){this.sourceContents[i.toSetString(e)]=n},t.prototype.walkSourceContents=function(e){for(var n=0,r=this.children.length;n<r;n++)this.children[n][u]&&this.children[n].walkSourceContents(e);for(var t=Object.keys(this.sourceContents),n=0,r=t.length;n<r;n++)e(i.fromSetString(t[n]),this.sourceContents[t[n]])},t.prototype.toString=function(){var e=\"\";return this.walk(function(n){e+=n}),e},t.prototype.toStringWithSourceMap=function(e){var n={code:\"\",line:1,column:0},r=new o(e),t=!1,i=null,s=null,u=null,l=null;return this.walk(function(e,o){n.code+=e,null!==o.source&&null!==o.line&&null!==o.column?(i===o.source&&s===o.line&&u===o.column&&l===o.name||r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name}),i=o.source,s=o.line,u=o.column,l=o.name,t=!0):t&&(r.addMapping({generated:{line:n.line,column:n.column}}),i=null,t=!1);for(var c=0,g=e.length;c<g;c++)e.charCodeAt(c)===a?(n.line++,n.column=0,c+1===g?(i=null,t=!1):t&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name})):n.column++}),this.walkSourceContents(function(e,n){r.setSourceContent(e,n)}),{code:n.code,map:r}},n.SourceNode=t}])});\n//# sourceMappingURL=source-map.min.js.map"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/dist/source-map.min.js.map",
    "content": "{\"version\":3,\"sources\":[\"webpack:///webpack/universalModuleDefinition\",\"webpack:///source-map.min.js\",\"webpack:///webpack/bootstrap 0fd5815da764db5fb9fe\",\"webpack:///./source-map.js\",\"webpack:///./lib/source-map-generator.js\",\"webpack:///./lib/base64-vlq.js\",\"webpack:///./lib/base64.js\",\"webpack:///./lib/util.js\",\"webpack:///./lib/array-set.js\",\"webpack:///./lib/mapping-list.js\",\"webpack:///./lib/source-map-consumer.js\",\"webpack:///./lib/binary-search.js\",\"webpack:///./lib/quick-sort.js\",\"webpack:///./lib/source-node.js\"],\"names\":[\"root\",\"factory\",\"exports\",\"module\",\"define\",\"amd\",\"this\",\"modules\",\"__webpack_require__\",\"moduleId\",\"installedModules\",\"id\",\"loaded\",\"call\",\"m\",\"c\",\"p\",\"SourceMapGenerator\",\"SourceMapConsumer\",\"SourceNode\",\"aArgs\",\"_file\",\"util\",\"getArg\",\"_sourceRoot\",\"_skipValidation\",\"_sources\",\"ArraySet\",\"_names\",\"_mappings\",\"MappingList\",\"_sourcesContents\",\"base64VLQ\",\"prototype\",\"_version\",\"fromSourceMap\",\"aSourceMapConsumer\",\"sourceRoot\",\"generator\",\"file\",\"eachMapping\",\"mapping\",\"newMapping\",\"generated\",\"line\",\"generatedLine\",\"column\",\"generatedColumn\",\"source\",\"relative\",\"original\",\"originalLine\",\"originalColumn\",\"name\",\"addMapping\",\"sources\",\"forEach\",\"sourceFile\",\"sourceRelative\",\"has\",\"add\",\"content\",\"sourceContentFor\",\"setSourceContent\",\"_validateMapping\",\"String\",\"aSourceFile\",\"aSourceContent\",\"Object\",\"create\",\"toSetString\",\"keys\",\"length\",\"applySourceMap\",\"aSourceMapPath\",\"Error\",\"newSources\",\"newNames\",\"unsortedForEach\",\"originalPositionFor\",\"join\",\"aGenerated\",\"aOriginal\",\"aSource\",\"aName\",\"JSON\",\"stringify\",\"_serializeMappings\",\"next\",\"nameIdx\",\"sourceIdx\",\"previousGeneratedColumn\",\"previousGeneratedLine\",\"previousOriginalColumn\",\"previousOriginalLine\",\"previousName\",\"previousSource\",\"result\",\"mappings\",\"toArray\",\"i\",\"len\",\"compareByGeneratedPositionsInflated\",\"encode\",\"indexOf\",\"_generateSourcesContent\",\"aSources\",\"aSourceRoot\",\"map\",\"key\",\"hasOwnProperty\",\"toJSON\",\"version\",\"names\",\"sourcesContent\",\"toString\",\"toVLQSigned\",\"aValue\",\"fromVLQSigned\",\"isNegative\",\"shifted\",\"base64\",\"VLQ_BASE_SHIFT\",\"VLQ_BASE\",\"VLQ_BASE_MASK\",\"VLQ_CONTINUATION_BIT\",\"digit\",\"encoded\",\"vlq\",\"decode\",\"aStr\",\"aIndex\",\"aOutParam\",\"continuation\",\"strLen\",\"shift\",\"charCodeAt\",\"charAt\",\"value\",\"rest\",\"intToCharMap\",\"split\",\"number\",\"TypeError\",\"charCode\",\"bigA\",\"bigZ\",\"littleA\",\"littleZ\",\"zero\",\"nine\",\"plus\",\"slash\",\"littleOffset\",\"numberOffset\",\"aDefaultValue\",\"arguments\",\"urlParse\",\"aUrl\",\"match\",\"urlRegexp\",\"scheme\",\"auth\",\"host\",\"port\",\"path\",\"urlGenerate\",\"aParsedUrl\",\"url\",\"normalize\",\"aPath\",\"part\",\"isAbsolute\",\"parts\",\"up\",\"splice\",\"aRoot\",\"aPathUrl\",\"aRootUrl\",\"dataUrlRegexp\",\"joined\",\"replace\",\"level\",\"index\",\"lastIndexOf\",\"slice\",\"Array\",\"substr\",\"identity\",\"s\",\"isProtoString\",\"fromSetString\",\"compareByOriginalPositions\",\"mappingA\",\"mappingB\",\"onlyCompareOriginal\",\"cmp\",\"strcmp\",\"compareByGeneratedPositionsDeflated\",\"onlyCompareGenerated\",\"aStr1\",\"aStr2\",\"parseSourceMapInput\",\"str\",\"parse\",\"computeSourceURL\",\"sourceURL\",\"sourceMapURL\",\"parsed\",\"substring\",\"test\",\"supportsNullProto\",\"obj\",\"_array\",\"_set\",\"hasNativeMap\",\"Map\",\"fromArray\",\"aArray\",\"aAllowDuplicates\",\"set\",\"size\",\"getOwnPropertyNames\",\"sStr\",\"isDuplicate\",\"idx\",\"push\",\"get\",\"at\",\"aIdx\",\"generatedPositionAfter\",\"lineA\",\"lineB\",\"columnA\",\"columnB\",\"_sorted\",\"_last\",\"aCallback\",\"aThisArg\",\"aMapping\",\"sort\",\"aSourceMap\",\"aSourceMapURL\",\"sourceMap\",\"sections\",\"IndexedSourceMapConsumer\",\"BasicSourceMapConsumer\",\"_absoluteSources\",\"_sourceMapURL\",\"Mapping\",\"lastOffset\",\"_sections\",\"offset\",\"offsetLine\",\"offsetColumn\",\"generatedOffset\",\"consumer\",\"binarySearch\",\"quickSort\",\"__generatedMappings\",\"defineProperty\",\"configurable\",\"enumerable\",\"_parseMappings\",\"__originalMappings\",\"_charIsMappingSeparator\",\"GENERATED_ORDER\",\"ORIGINAL_ORDER\",\"GREATEST_LOWER_BOUND\",\"LEAST_UPPER_BOUND\",\"aContext\",\"aOrder\",\"context\",\"order\",\"_generatedMappings\",\"_originalMappings\",\"allGeneratedPositionsFor\",\"needle\",\"_findSourceIndex\",\"_findMapping\",\"undefined\",\"lastColumn\",\"relativeSource\",\"smc\",\"generatedMappings\",\"destGeneratedMappings\",\"destOriginalMappings\",\"srcMapping\",\"destMapping\",\"segment\",\"end\",\"cachedSegments\",\"temp\",\"originalMappings\",\"aNeedle\",\"aMappings\",\"aLineName\",\"aColumnName\",\"aComparator\",\"aBias\",\"search\",\"computeColumnSpans\",\"nextMapping\",\"lastGeneratedColumn\",\"Infinity\",\"hasContentsOfAllSources\",\"some\",\"sc\",\"nullOnMissing\",\"fileUriAbsPath\",\"generatedPositionFor\",\"constructor\",\"j\",\"sectionIndex\",\"section\",\"bias\",\"every\",\"generatedPosition\",\"ret\",\"sectionMappings\",\"adjustedMapping\",\"recursiveSearch\",\"aLow\",\"aHigh\",\"aHaystack\",\"aCompare\",\"mid\",\"Math\",\"floor\",\"swap\",\"ary\",\"x\",\"y\",\"randomIntInRange\",\"low\",\"high\",\"round\",\"random\",\"doQuickSort\",\"comparator\",\"r\",\"pivotIndex\",\"pivot\",\"q\",\"aLine\",\"aColumn\",\"aChunks\",\"children\",\"sourceContents\",\"isSourceNode\",\"REGEX_NEWLINE\",\"NEWLINE_CODE\",\"fromStringWithSourceMap\",\"aGeneratedCode\",\"aRelativePath\",\"addMappingWithCode\",\"code\",\"node\",\"remainingLines\",\"remainingLinesIndex\",\"shiftNextLine\",\"getNextLine\",\"lineContents\",\"newLine\",\"lastGeneratedLine\",\"lastMapping\",\"nextLine\",\"aChunk\",\"isArray\",\"chunk\",\"prepend\",\"unshift\",\"walk\",\"aFn\",\"aSep\",\"newChildren\",\"replaceRight\",\"aPattern\",\"aReplacement\",\"lastChild\",\"walkSourceContents\",\"toStringWithSourceMap\",\"sourceMappingActive\",\"lastOriginalSource\",\"lastOriginalLine\",\"lastOriginalColumn\",\"lastOriginalName\",\"sourceContent\"],\"mappings\":\"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,UAAAD,IAEAD,EAAA,UAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAAUL,EAAQD,EAASM,GEjDjCN,EAAAe,mBAAAT,EAAA,GAAAS,mBACAf,EAAAgB,kBAAAV,EAAA,GAAAU,kBACAhB,EAAAiB,WAAAX,EAAA,IAAAW,YF6DM,SAAUhB,EAAQD,EAASM,GGhDjC,QAAAS,GAAAG,GACAA,IACAA,MAEAd,KAAAe,MAAAC,EAAAC,OAAAH,EAAA,aACAd,KAAAkB,YAAAF,EAAAC,OAAAH,EAAA,mBACAd,KAAAmB,gBAAAH,EAAAC,OAAAH,EAAA,qBACAd,KAAAoB,SAAA,GAAAC,GACArB,KAAAsB,OAAA,GAAAD,GACArB,KAAAuB,UAAA,GAAAC,GACAxB,KAAAyB,iBAAA,KAvBA,GAAAC,GAAAxB,EAAA,GACAc,EAAAd,EAAA,GACAmB,EAAAnB,EAAA,GAAAmB,SACAG,EAAAtB,EAAA,GAAAsB,WAuBAb,GAAAgB,UAAAC,SAAA,EAOAjB,EAAAkB,cACA,SAAAC,GACA,GAAAC,GAAAD,EAAAC,WACAC,EAAA,GAAArB,IACAsB,KAAAH,EAAAG,KACAF,cA2CA,OAzCAD,GAAAI,YAAA,SAAAC,GACA,GAAAC,IACAC,WACAC,KAAAH,EAAAI,cACAC,OAAAL,EAAAM,iBAIA,OAAAN,EAAAO,SACAN,EAAAM,OAAAP,EAAAO,OACA,MAAAX,IACAK,EAAAM,OAAA1B,EAAA2B,SAAAZ,EAAAK,EAAAM,SAGAN,EAAAQ,UACAN,KAAAH,EAAAU,aACAL,OAAAL,EAAAW,gBAGA,MAAAX,EAAAY,OACAX,EAAAW,KAAAZ,EAAAY,OAIAf,EAAAgB,WAAAZ,KAEAN,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAC,GAAAD,CACA,QAAApB,IACAqB,EAAApC,EAAA2B,SAAAZ,EAAAoB,IAGAnB,EAAAZ,SAAAiC,IAAAD,IACApB,EAAAZ,SAAAkC,IAAAF,EAGA,IAAAG,GAAAzB,EAAA0B,iBAAAL,EACA,OAAAI,GACAvB,EAAAyB,iBAAAN,EAAAI,KAGAvB,GAaArB,EAAAgB,UAAAqB,WACA,SAAAlC,GACA,GAAAuB,GAAArB,EAAAC,OAAAH,EAAA,aACA8B,EAAA5B,EAAAC,OAAAH,EAAA,iBACA4B,EAAA1B,EAAAC,OAAAH,EAAA,eACAiC,EAAA/B,EAAAC,OAAAH,EAAA,YAEAd,MAAAmB,iBACAnB,KAAA0D,iBAAArB,EAAAO,EAAAF,EAAAK,GAGA,MAAAL,IACAA,EAAAiB,OAAAjB,GACA1C,KAAAoB,SAAAiC,IAAAX,IACA1C,KAAAoB,SAAAkC,IAAAZ,IAIA,MAAAK,IACAA,EAAAY,OAAAZ,GACA/C,KAAAsB,OAAA+B,IAAAN,IACA/C,KAAAsB,OAAAgC,IAAAP,IAIA/C,KAAAuB,UAAA+B,KACAf,cAAAF,EAAAC,KACAG,gBAAAJ,EAAAG,OACAK,aAAA,MAAAD,KAAAN,KACAQ,eAAA,MAAAF,KAAAJ,OACAE,SACAK,UAOApC,EAAAgB,UAAA8B,iBACA,SAAAG,EAAAC,GACA,GAAAnB,GAAAkB,CACA,OAAA5D,KAAAkB,cACAwB,EAAA1B,EAAA2B,SAAA3C,KAAAkB,YAAAwB,IAGA,MAAAmB,GAGA7D,KAAAyB,mBACAzB,KAAAyB,iBAAAqC,OAAAC,OAAA,OAEA/D,KAAAyB,iBAAAT,EAAAgD,YAAAtB,IAAAmB,GACK7D,KAAAyB,yBAGLzB,MAAAyB,iBAAAT,EAAAgD,YAAAtB,IACA,IAAAoB,OAAAG,KAAAjE,KAAAyB,kBAAAyC,SACAlE,KAAAyB,iBAAA,QAqBAd,EAAAgB,UAAAwC,eACA,SAAArC,EAAA8B,EAAAQ,GACA,GAAAjB,GAAAS,CAEA,UAAAA,EAAA,CACA,SAAA9B,EAAAG,KACA,SAAAoC,OACA,gJAIAlB,GAAArB,EAAAG,KAEA,GAAAF,GAAA/B,KAAAkB,WAEA,OAAAa,IACAoB,EAAAnC,EAAA2B,SAAAZ,EAAAoB,GAIA,IAAAmB,GAAA,GAAAjD,GACAkD,EAAA,GAAAlD,EAGArB,MAAAuB,UAAAiD,gBAAA,SAAArC,GACA,GAAAA,EAAAO,SAAAS,GAAA,MAAAhB,EAAAU,aAAA,CAEA,GAAAD,GAAAd,EAAA2C,qBACAnC,KAAAH,EAAAU,aACAL,OAAAL,EAAAW,gBAEA,OAAAF,EAAAF,SAEAP,EAAAO,OAAAE,EAAAF,OACA,MAAA0B,IACAjC,EAAAO,OAAA1B,EAAA0D,KAAAN,EAAAjC,EAAAO,SAEA,MAAAX,IACAI,EAAAO,OAAA1B,EAAA2B,SAAAZ,EAAAI,EAAAO,SAEAP,EAAAU,aAAAD,EAAAN,KACAH,EAAAW,eAAAF,EAAAJ,OACA,MAAAI,EAAAG,OACAZ,EAAAY,KAAAH,EAAAG,OAKA,GAAAL,GAAAP,EAAAO,MACA,OAAAA,GAAA4B,EAAAjB,IAAAX,IACA4B,EAAAhB,IAAAZ,EAGA,IAAAK,GAAAZ,EAAAY,IACA,OAAAA,GAAAwB,EAAAlB,IAAAN,IACAwB,EAAAjB,IAAAP,IAGK/C,MACLA,KAAAoB,SAAAkD,EACAtE,KAAAsB,OAAAiD,EAGAzC,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAI,GAAAzB,EAAA0B,iBAAAL,EACA,OAAAI,IACA,MAAAa,IACAjB,EAAAnC,EAAA0D,KAAAN,EAAAjB,IAEA,MAAApB,IACAoB,EAAAnC,EAAA2B,SAAAZ,EAAAoB,IAEAnD,KAAAyD,iBAAAN,EAAAI,KAEKvD,OAcLW,EAAAgB,UAAA+B,iBACA,SAAAiB,EAAAC,EAAAC,EACAC,GAKA,GAAAF,GAAA,gBAAAA,GAAAtC,MAAA,gBAAAsC,GAAApC,OACA,SAAA6B,OACA,+OAMA,OAAAM,GAAA,QAAAA,IAAA,UAAAA,IACAA,EAAArC,KAAA,GAAAqC,EAAAnC,QAAA,IACAoC,GAAAC,GAAAC,MAIAH,GAAA,QAAAA,IAAA,UAAAA,IACAC,GAAA,QAAAA,IAAA,UAAAA,IACAD,EAAArC,KAAA,GAAAqC,EAAAnC,QAAA,GACAoC,EAAAtC,KAAA,GAAAsC,EAAApC,QAAA,GACAqC,GAKA,SAAAR,OAAA,oBAAAU,KAAAC,WACA3C,UAAAsC,EACAjC,OAAAmC,EACAjC,SAAAgC,EACA7B,KAAA+B,MASAnE,EAAAgB,UAAAsD,mBACA,WAcA,OANAC,GACA/C,EACAgD,EACAC,EAVAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,GAMAC,EAAA5F,KAAAuB,UAAAsE,UACAC,EAAA,EAAAC,EAAAH,EAAA1B,OAA0C4B,EAAAC,EAASD,IAAA,CAInD,GAHA3D,EAAAyD,EAAAE,GACAZ,EAAA,GAEA/C,EAAAI,gBAAA+C,EAEA,IADAD,EAAA,EACAlD,EAAAI,gBAAA+C,GACAJ,GAAA,IACAI,QAIA,IAAAQ,EAAA,GACA,IAAA9E,EAAAgF,oCAAA7D,EAAAyD,EAAAE,EAAA,IACA,QAEAZ,IAAA,IAIAA,GAAAxD,EAAAuE,OAAA9D,EAAAM,gBACA4C,GACAA,EAAAlD,EAAAM,gBAEA,MAAAN,EAAAO,SACA0C,EAAApF,KAAAoB,SAAA8E,QAAA/D,EAAAO,QACAwC,GAAAxD,EAAAuE,OAAAb,EAAAM,GACAA,EAAAN,EAGAF,GAAAxD,EAAAuE,OAAA9D,EAAAU,aAAA,EACA2C,GACAA,EAAArD,EAAAU,aAAA,EAEAqC,GAAAxD,EAAAuE,OAAA9D,EAAAW,eACAyC,GACAA,EAAApD,EAAAW,eAEA,MAAAX,EAAAY,OACAoC,EAAAnF,KAAAsB,OAAA4E,QAAA/D,EAAAY,MACAmC,GAAAxD,EAAAuE,OAAAd,EAAAM,GACAA,EAAAN,IAIAQ,GAAAT,EAGA,MAAAS,IAGAhF,EAAAgB,UAAAwE,wBACA,SAAAC,EAAAC,GACA,MAAAD,GAAAE,IAAA,SAAA5D,GACA,IAAA1C,KAAAyB,iBACA,WAEA,OAAA4E,IACA3D,EAAA1B,EAAA2B,SAAA0D,EAAA3D,GAEA,IAAA6D,GAAAvF,EAAAgD,YAAAtB,EACA,OAAAoB,QAAAnC,UAAA6E,eAAAjG,KAAAP,KAAAyB,iBAAA8E,GACAvG,KAAAyB,iBAAA8E,GACA,MACKvG,OAMLW,EAAAgB,UAAA8E,OACA,WACA,GAAAH,IACAI,QAAA1G,KAAA4B,SACAqB,QAAAjD,KAAAoB,SAAAyE,UACAc,MAAA3G,KAAAsB,OAAAuE,UACAD,SAAA5F,KAAAiF,qBAYA,OAVA,OAAAjF,KAAAe,QACAuF,EAAArE,KAAAjC,KAAAe,OAEA,MAAAf,KAAAkB,cACAoF,EAAAvE,WAAA/B,KAAAkB,aAEAlB,KAAAyB,mBACA6E,EAAAM,eAAA5G,KAAAmG,wBAAAG,EAAArD,QAAAqD,EAAAvE,aAGAuE,GAMA3F,EAAAgB,UAAAkF,SACA,WACA,MAAA9B,MAAAC,UAAAhF,KAAAyG,WAGA7G,EAAAe,sBH2EM,SAAUd,EAAQD,EAASM,GI/ajC,QAAA4G,GAAAC,GACA,MAAAA,GAAA,IACAA,GAAA,MACAA,GAAA,KASA,QAAAC,GAAAD,GACA,GAAAE,GAAA,OAAAF,GACAG,EAAAH,GAAA,CACA,OAAAE,IACAC,EACAA,EAhDA,GAAAC,GAAAjH,EAAA,GAcAkH,EAAA,EAGAC,EAAA,GAAAD,EAGAE,EAAAD,EAAA,EAGAE,EAAAF,CA+BAzH,GAAAqG,OAAA,SAAAc,GACA,GACAS,GADAC,EAAA,GAGAC,EAAAZ,EAAAC,EAEA,GACAS,GAAAE,EAAAJ,EACAI,KAAAN,EACAM,EAAA,IAGAF,GAAAD,GAEAE,GAAAN,EAAAlB,OAAAuB,SACGE,EAAA,EAEH,OAAAD,IAOA7H,EAAA+H,OAAA,SAAAC,EAAAC,EAAAC,GACA,GAGAC,GAAAP,EAHAQ,EAAAJ,EAAA1D,OACAyB,EAAA,EACAsC,EAAA,CAGA,IACA,GAAAJ,GAAAG,EACA,SAAA3D,OAAA,6CAIA,IADAmD,EAAAL,EAAAQ,OAAAC,EAAAM,WAAAL,MACAL,KAAA,EACA,SAAAnD,OAAA,yBAAAuD,EAAAO,OAAAN,EAAA,GAGAE,MAAAP,EAAAD,GACAC,GAAAF,EACA3B,GAAA6B,GAAAS,EACAA,GAAAb,QACGW,EAEHD,GAAAM,MAAApB,EAAArB,GACAmC,EAAAO,KAAAR,IJ2fM,SAAUhI,EAAQD,GK9nBxB,GAAA0I,GAAA,mEAAAC,MAAA,GAKA3I,GAAAqG,OAAA,SAAAuC,GACA,MAAAA,KAAAF,EAAApE,OACA,MAAAoE,GAAAE,EAEA,UAAAC,WAAA,6BAAAD,IAOA5I,EAAA+H,OAAA,SAAAe,GACA,GAAAC,GAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,IAEAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,EAGA,OAAAT,IAAAD,MAAAE,EACAF,EAAAC,EAIAE,GAAAH,MAAAI,EACAJ,EAAAG,EAAAM,EAIAJ,GAAAL,MAAAM,EACAN,EAAAK,EAAAK,EAIAV,GAAAO,EACA,GAIAP,GAAAQ,EACA,IAIA,IL6oBM,SAAUrJ,EAAQD,GM7rBxB,QAAAqB,GAAAH,EAAAgE,EAAAuE,GACA,GAAAvE,IAAAhE,GACA,MAAAA,GAAAgE,EACG,QAAAwE,UAAApF,OACH,MAAAmF,EAEA,UAAAhF,OAAA,IAAAS,EAAA,6BAQA,QAAAyE,GAAAC,GACA,GAAAC,GAAAD,EAAAC,MAAAC,EACA,OAAAD,IAIAE,OAAAF,EAAA,GACAG,KAAAH,EAAA,GACAI,KAAAJ,EAAA,GACAK,KAAAL,EAAA,GACAM,KAAAN,EAAA,IAPA,KAYA,QAAAO,GAAAC,GACA,GAAAC,GAAA,EAiBA,OAhBAD,GAAAN,SACAO,GAAAD,EAAAN,OAAA,KAEAO,GAAA,KACAD,EAAAL,OACAM,GAAAD,EAAAL,KAAA,KAEAK,EAAAJ,OACAK,GAAAD,EAAAJ,MAEAI,EAAAH,OACAI,GAAA,IAAAD,EAAAH,MAEAG,EAAAF,OACAG,GAAAD,EAAAF,MAEAG,EAeA,QAAAC,GAAAC,GACA,GAAAL,GAAAK,EACAF,EAAAX,EAAAa,EACA,IAAAF,EAAA,CACA,IAAAA,EAAAH,KACA,MAAAK,EAEAL,GAAAG,EAAAH,KAKA,OAAAM,GAHAC,EAAA1K,EAAA0K,WAAAP,GAEAQ,EAAAR,EAAAxB,MAAA,OACAiC,EAAA,EAAA1E,EAAAyE,EAAArG,OAAA,EAA8C4B,GAAA,EAAQA,IACtDuE,EAAAE,EAAAzE,GACA,MAAAuE,EACAE,EAAAE,OAAA3E,EAAA,GACK,OAAAuE,EACLG,IACKA,EAAA,IACL,KAAAH,GAIAE,EAAAE,OAAA3E,EAAA,EAAA0E,GACAA,EAAA,IAEAD,EAAAE,OAAA3E,EAAA,GACA0E,KAUA,OANAT,GAAAQ,EAAA7F,KAAA,KAEA,KAAAqF,IACAA,EAAAO,EAAA,SAGAJ,GACAA,EAAAH,OACAC,EAAAE,IAEAH,EAoBA,QAAArF,GAAAgG,EAAAN,GACA,KAAAM,IACAA,EAAA,KAEA,KAAAN,IACAA,EAAA,IAEA,IAAAO,GAAApB,EAAAa,GACAQ,EAAArB,EAAAmB,EAMA,IALAE,IACAF,EAAAE,EAAAb,MAAA,KAIAY,MAAAhB,OAIA,MAHAiB,KACAD,EAAAhB,OAAAiB,EAAAjB,QAEAK,EAAAW,EAGA,IAAAA,GAAAP,EAAAX,MAAAoB,GACA,MAAAT,EAIA,IAAAQ,MAAAf,OAAAe,EAAAb,KAEA,MADAa,GAAAf,KAAAO,EACAJ,EAAAY,EAGA,IAAAE,GAAA,MAAAV,EAAAjC,OAAA,GACAiC,EACAD,EAAAO,EAAAK,QAAA,eAAAX,EAEA,OAAAQ,IACAA,EAAAb,KAAAe,EACAd,EAAAY,IAEAE,EAcA,QAAAnI,GAAA+H,EAAAN,GACA,KAAAM,IACAA,EAAA,KAGAA,IAAAK,QAAA,SAOA,KADA,GAAAC,GAAA,EACA,IAAAZ,EAAAlE,QAAAwE,EAAA,OACA,GAAAO,GAAAP,EAAAQ,YAAA,IACA,IAAAD,EAAA,EACA,MAAAb,EAOA,IADAM,IAAAS,MAAA,EAAAF,GACAP,EAAAjB,MAAA,qBACA,MAAAW,KAGAY,EAIA,MAAAI,OAAAJ,EAAA,GAAAtG,KAAA,OAAA0F,EAAAiB,OAAAX,EAAAxG,OAAA,GASA,QAAAoH,GAAAC,GACA,MAAAA,GAYA,QAAAvH,GAAA4D,GACA,MAAA4D,GAAA5D,GACA,IAAAA,EAGAA,EAIA,QAAA6D,GAAA7D,GACA,MAAA4D,GAAA5D,GACAA,EAAAuD,MAAA,GAGAvD,EAIA,QAAA4D,GAAAD,GACA,IAAAA,EACA,QAGA,IAAArH,GAAAqH,EAAArH,MAEA,IAAAA,EAAA,EACA,QAGA,SAAAqH,EAAArD,WAAAhE,EAAA,IACA,KAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,KAAAqH,EAAArD,WAAAhE,EAAA,IACA,KAAAqH,EAAArD,WAAAhE,EAAA,GACA,QAGA,QAAA4B,GAAA5B,EAAA,GAA2B4B,GAAA,EAAQA,IACnC,QAAAyF,EAAArD,WAAApC,GACA,QAIA,UAWA,QAAA4F,GAAAC,EAAAC,EAAAC,GACA,GAAAC,GAAAC,EAAAJ,EAAAjJ,OAAAkJ,EAAAlJ,OACA,YAAAoJ,EACAA,GAGAA,EAAAH,EAAA9I,aAAA+I,EAAA/I,aACA,IAAAiJ,EACAA,GAGAA,EAAAH,EAAA7I,eAAA8I,EAAA9I,eACA,IAAAgJ,GAAAD,EACAC,GAGAA,EAAAH,EAAAlJ,gBAAAmJ,EAAAnJ,gBACA,IAAAqJ,EACAA,GAGAA,EAAAH,EAAApJ,cAAAqJ,EAAArJ,cACA,IAAAuJ,EACAA,EAGAC,EAAAJ,EAAA5I,KAAA6I,EAAA7I,UAaA,QAAAiJ,GAAAL,EAAAC,EAAAK,GACA,GAAAH,GAAAH,EAAApJ,cAAAqJ,EAAArJ,aACA,YAAAuJ,EACAA,GAGAA,EAAAH,EAAAlJ,gBAAAmJ,EAAAnJ,gBACA,IAAAqJ,GAAAG,EACAH,GAGAA,EAAAC,EAAAJ,EAAAjJ,OAAAkJ,EAAAlJ,QACA,IAAAoJ,EACAA,GAGAA,EAAAH,EAAA9I,aAAA+I,EAAA/I,aACA,IAAAiJ,EACAA,GAGAA,EAAAH,EAAA7I,eAAA8I,EAAA9I,eACA,IAAAgJ,EACAA,EAGAC,EAAAJ,EAAA5I,KAAA6I,EAAA7I,UAIA,QAAAgJ,GAAAG,EAAAC,GACA,MAAAD,KAAAC,EACA,EAGA,OAAAD,EACA,EAGA,OAAAC,GACA,EAGAD,EAAAC,EACA,GAGA,EAOA,QAAAnG,GAAA2F,EAAAC,GACA,GAAAE,GAAAH,EAAApJ,cAAAqJ,EAAArJ,aACA,YAAAuJ,EACAA,GAGAA,EAAAH,EAAAlJ,gBAAAmJ,EAAAnJ,gBACA,IAAAqJ,EACAA,GAGAA,EAAAC,EAAAJ,EAAAjJ,OAAAkJ,EAAAlJ,QACA,IAAAoJ,EACAA,GAGAA,EAAAH,EAAA9I,aAAA+I,EAAA/I,aACA,IAAAiJ,EACAA,GAGAA,EAAAH,EAAA7I,eAAA8I,EAAA9I,eACA,IAAAgJ,EACAA,EAGAC,EAAAJ,EAAA5I,KAAA6I,EAAA7I,UASA,QAAAqJ,GAAAC,GACA,MAAAtH,MAAAuH,MAAAD,EAAAtB,QAAA,iBAAsC,KAQtC,QAAAwB,GAAAxK,EAAAyK,EAAAC,GA8BA,GA7BAD,KAAA,GAEAzK,IAEA,MAAAA,IAAAmC,OAAA,UAAAsI,EAAA,KACAzK,GAAA,KAOAyK,EAAAzK,EAAAyK,GAiBAC,EAAA,CACA,GAAAC,GAAAnD,EAAAkD,EACA,KAAAC,EACA,SAAArI,OAAA,mCAEA,IAAAqI,EAAA3C,KAAA,CAEA,GAAAkB,GAAAyB,EAAA3C,KAAAmB,YAAA,IACAD,IAAA,IACAyB,EAAA3C,KAAA2C,EAAA3C,KAAA4C,UAAA,EAAA1B,EAAA,IAGAuB,EAAA9H,EAAAsF,EAAA0C,GAAAF,GAGA,MAAArC,GAAAqC,GA3cA5M,EAAAqB,QAEA,IAAAyI,GAAA,iEACAmB,EAAA,eAeAjL,GAAA2J,WAsBA3J,EAAAoK,cAwDApK,EAAAuK,YA2DAvK,EAAA8E,OAEA9E,EAAA0K,WAAA,SAAAF,GACA,YAAAA,EAAAjC,OAAA,IAAAuB,EAAAkD,KAAAxC,IAyCAxK,EAAA+C,UAEA,IAAAkK,GAAA,WACA,GAAAC,GAAAhJ,OAAAC,OAAA,KACA,sBAAA+I,MAuBAlN,GAAAoE,YAAA6I,EAAAvB,EAAAtH,EASApE,EAAA6L,cAAAoB,EAAAvB,EAAAG,EAsEA7L,EAAA8L,6BAuCA9L,EAAAoM,sCAsDApM,EAAAoG,sCAUApG,EAAAwM,sBAqDAxM,EAAA2M,oBNqtBM,SAAU1M,EAAQD,EAASM,GO3qCjC,QAAAmB,KACArB,KAAA+M,UACA/M,KAAAgN,KAAAC,EAAA,GAAAC,KAAApJ,OAAAC,OAAA,MAZA,GAAA/C,GAAAd,EAAA,GACAmD,EAAAS,OAAAnC,UAAA6E,eACAyG,EAAA,mBAAAC,IAgBA7L,GAAA8L,UAAA,SAAAC,EAAAC,GAEA,OADAC,GAAA,GAAAjM,GACAyE,EAAA,EAAAC,EAAAqH,EAAAlJ,OAAsC4B,EAAAC,EAASD,IAC/CwH,EAAAhK,IAAA8J,EAAAtH,GAAAuH,EAEA,OAAAC,IASAjM,EAAAM,UAAA4L,KAAA,WACA,MAAAN,GAAAjN,KAAAgN,KAAAO,KAAAzJ,OAAA0J,oBAAAxN,KAAAgN,MAAA9I,QAQA7C,EAAAM,UAAA2B,IAAA,SAAAsE,EAAAyF,GACA,GAAAI,GAAAR,EAAArF,EAAA5G,EAAAgD,YAAA4D,GACA8F,EAAAT,EAAAjN,KAAAqD,IAAAuE,GAAAvE,EAAA9C,KAAAP,KAAAgN,KAAAS,GACAE,EAAA3N,KAAA+M,OAAA7I,MACAwJ,KAAAL,GACArN,KAAA+M,OAAAa,KAAAhG,GAEA8F,IACAT,EACAjN,KAAAgN,KAAAM,IAAA1F,EAAA+F,GAEA3N,KAAAgN,KAAAS,GAAAE,IAUAtM,EAAAM,UAAA0B,IAAA,SAAAuE,GACA,GAAAqF,EACA,MAAAjN,MAAAgN,KAAA3J,IAAAuE,EAEA,IAAA6F,GAAAzM,EAAAgD,YAAA4D,EACA,OAAAvE,GAAA9C,KAAAP,KAAAgN,KAAAS,IASApM,EAAAM,UAAAuE,QAAA,SAAA0B,GACA,GAAAqF,EAAA,CACA,GAAAU,GAAA3N,KAAAgN,KAAAa,IAAAjG,EACA,IAAA+F,GAAA,EACA,MAAAA,OAEG,CACH,GAAAF,GAAAzM,EAAAgD,YAAA4D,EACA,IAAAvE,EAAA9C,KAAAP,KAAAgN,KAAAS,GACA,MAAAzN,MAAAgN,KAAAS,GAIA,SAAApJ,OAAA,IAAAuD,EAAA,yBAQAvG,EAAAM,UAAAmM,GAAA,SAAAC,GACA,GAAAA,GAAA,GAAAA,EAAA/N,KAAA+M,OAAA7I,OACA,MAAAlE,MAAA+M,OAAAgB,EAEA,UAAA1J,OAAA,yBAAA0J,IAQA1M,EAAAM,UAAAkE,QAAA,WACA,MAAA7F,MAAA+M,OAAA5B,SAGAvL,EAAAyB,YPmsCM,SAAUxB,EAAQD,EAASM,GQ9yCjC,QAAA8N,GAAArC,EAAAC,GAEA,GAAAqC,GAAAtC,EAAApJ,cACA2L,EAAAtC,EAAArJ,cACA4L,EAAAxC,EAAAlJ,gBACA2L,EAAAxC,EAAAnJ,eACA,OAAAyL,GAAAD,GAAAC,GAAAD,GAAAG,GAAAD,GACAnN,EAAAgF,oCAAA2F,EAAAC,IAAA,EAQA,QAAApK,KACAxB,KAAA+M,UACA/M,KAAAqO,SAAA,EAEArO,KAAAsO,OAAgB/L,eAAA,EAAAE,gBAAA,GAzBhB,GAAAzB,GAAAd,EAAA,EAkCAsB,GAAAG,UAAA6C,gBACA,SAAA+J,EAAAC,GACAxO,KAAA+M,OAAA7J,QAAAqL,EAAAC,IAQAhN,EAAAG,UAAA2B,IAAA,SAAAmL,GACAT,EAAAhO,KAAAsO,MAAAG,IACAzO,KAAAsO,MAAAG,EACAzO,KAAA+M,OAAAa,KAAAa,KAEAzO,KAAAqO,SAAA,EACArO,KAAA+M,OAAAa,KAAAa,KAaAjN,EAAAG,UAAAkE,QAAA,WAKA,MAJA7F,MAAAqO,UACArO,KAAA+M,OAAA2B,KAAA1N,EAAAgF,qCACAhG,KAAAqO,SAAA,GAEArO,KAAA+M,QAGAnN,EAAA4B,eRk0CM,SAAU3B,EAAQD,EAASM,GSn4CjC,QAAAU,GAAA+N,EAAAC,GACA,GAAAC,GAAAF,CAKA,OAJA,gBAAAA,KACAE,EAAA7N,EAAAoL,oBAAAuC,IAGA,MAAAE,EAAAC,SACA,GAAAC,GAAAF,EAAAD,GACA,GAAAI,GAAAH,EAAAD,GA0QA,QAAAI,GAAAL,EAAAC,GACA,GAAAC,GAAAF,CACA,iBAAAA,KACAE,EAAA7N,EAAAoL,oBAAAuC,GAGA,IAAAjI,GAAA1F,EAAAC,OAAA4N,EAAA,WACA5L,EAAAjC,EAAAC,OAAA4N,EAAA,WAGAlI,EAAA3F,EAAAC,OAAA4N,EAAA,YACA9M,EAAAf,EAAAC,OAAA4N,EAAA,mBACAjI,EAAA5F,EAAAC,OAAA4N,EAAA,uBACAjJ,EAAA5E,EAAAC,OAAA4N,EAAA,YACA5M,EAAAjB,EAAAC,OAAA4N,EAAA,YAIA,IAAAnI,GAAA1G,KAAA4B,SACA,SAAAyC,OAAA,wBAAAqC,EAGA3E,KACAA,EAAAf,EAAAmJ,UAAApI,IAGAkB,IACAqD,IAAA3C,QAIA2C,IAAAtF,EAAAmJ,WAKA7D,IAAA,SAAA5D,GACA,MAAAX,IAAAf,EAAAsJ,WAAAvI,IAAAf,EAAAsJ,WAAA5H,GACA1B,EAAA2B,SAAAZ,EAAAW,GACAA,IAOA1C,KAAAsB,OAAAD,EAAA8L,UAAAxG,EAAAL,IAAA3C,SAAA,GACA3D,KAAAoB,SAAAC,EAAA8L,UAAAlK,GAAA,GAEAjD,KAAAiP,iBAAAjP,KAAAoB,SAAAyE,UAAAS,IAAA,SAAAiF,GACA,MAAAvK,GAAAuL,iBAAAxK,EAAAwJ,EAAAqD,KAGA5O,KAAA+B,aACA/B,KAAA4G,iBACA5G,KAAAuB,UAAAqE,EACA5F,KAAAkP,cAAAN,EACA5O,KAAAiC,OA4GA,QAAAkN,KACAnP,KAAAuC,cAAA,EACAvC,KAAAyC,gBAAA,EACAzC,KAAA0C,OAAA,KACA1C,KAAA6C,aAAA,KACA7C,KAAA8C,eAAA,KACA9C,KAAA+C,KAAA,KAkaA,QAAAgM,GAAAJ,EAAAC,GACA,GAAAC,GAAAF,CACA,iBAAAA,KACAE,EAAA7N,EAAAoL,oBAAAuC,GAGA,IAAAjI,GAAA1F,EAAAC,OAAA4N,EAAA,WACAC,EAAA9N,EAAAC,OAAA4N,EAAA,WAEA,IAAAnI,GAAA1G,KAAA4B,SACA,SAAAyC,OAAA,wBAAAqC,EAGA1G,MAAAoB,SAAA,GAAAC,GACArB,KAAAsB,OAAA,GAAAD,EAEA,IAAA+N,IACA9M,MAAA,EACAE,OAAA,EAEAxC,MAAAqP,UAAAP,EAAAxI,IAAA,SAAAiF,GACA,GAAAA,EAAArB,IAGA,SAAA7F,OAAA,qDAEA,IAAAiL,GAAAtO,EAAAC,OAAAsK,EAAA,UACAgE,EAAAvO,EAAAC,OAAAqO,EAAA,QACAE,EAAAxO,EAAAC,OAAAqO,EAAA,SAEA,IAAAC,EAAAH,EAAA9M,MACAiN,IAAAH,EAAA9M,MAAAkN,EAAAJ,EAAA5M,OACA,SAAA6B,OAAA,uDAIA,OAFA+K,GAAAE,GAGAG,iBAGAlN,cAAAgN,EAAA,EACA9M,gBAAA+M,EAAA,GAEAE,SAAA,GAAA9O,GAAAI,EAAAC,OAAAsK,EAAA,OAAAqD,MAh5BA,GAAA5N,GAAAd,EAAA,GACAyP,EAAAzP,EAAA,GACAmB,EAAAnB,EAAA,GAAAmB,SACAK,EAAAxB,EAAA,GACA0P,EAAA1P,EAAA,GAAA0P,SAaAhP,GAAAiB,cAAA,SAAA8M,EAAAC,GACA,MAAAI,GAAAnN,cAAA8M,EAAAC,IAMAhO,EAAAe,UAAAC,SAAA,EAgCAhB,EAAAe,UAAAkO,oBAAA,KACA/L,OAAAgM,eAAAlP,EAAAe,UAAA,sBACAoO,cAAA,EACAC,YAAA,EACAnC,IAAA,WAKA,MAJA7N,MAAA6P,qBACA7P,KAAAiQ,eAAAjQ,KAAAuB,UAAAvB,KAAA+B,YAGA/B,KAAA6P,uBAIAjP,EAAAe,UAAAuO,mBAAA,KACApM,OAAAgM,eAAAlP,EAAAe,UAAA,qBACAoO,cAAA,EACAC,YAAA,EACAnC,IAAA,WAKA,MAJA7N,MAAAkQ,oBACAlQ,KAAAiQ,eAAAjQ,KAAAuB,UAAAvB,KAAA+B,YAGA/B,KAAAkQ,sBAIAtP,EAAAe,UAAAwO,wBACA,SAAAvI,EAAAqD,GACA,GAAAxK,GAAAmH,EAAAO,OAAA8C,EACA,aAAAxK,GAAmB,MAAAA,GAQnBG,EAAAe,UAAAsO,eACA,SAAArI,EAAAvB,GACA,SAAAhC,OAAA,6CAGAzD,EAAAwP,gBAAA,EACAxP,EAAAyP,eAAA,EAEAzP,EAAA0P,qBAAA,EACA1P,EAAA2P,kBAAA,EAkBA3P,EAAAe,UAAAO,YACA,SAAAqM,EAAAiC,EAAAC,GACA,GAGA7K,GAHA8K,EAAAF,GAAA,KACAG,EAAAF,GAAA7P,EAAAwP,eAGA,QAAAO,GACA,IAAA/P,GAAAwP,gBACAxK,EAAA5F,KAAA4Q,kBACA,MACA,KAAAhQ,GAAAyP,eACAzK,EAAA5F,KAAA6Q,iBACA,MACA,SACA,SAAAxM,OAAA,+BAGA,GAAAtC,GAAA/B,KAAA+B,UACA6D,GAAAU,IAAA,SAAAnE,GACA,GAAAO,GAAA,OAAAP,EAAAO,OAAA,KAAA1C,KAAAoB,SAAA0M,GAAA3L,EAAAO,OAEA,OADAA,GAAA1B,EAAAuL,iBAAAxK,EAAAW,EAAA1C,KAAAkP,gBAEAxM,SACAH,cAAAJ,EAAAI,cACAE,gBAAAN,EAAAM,gBACAI,aAAAV,EAAAU,aACAC,eAAAX,EAAAW,eACAC,KAAA,OAAAZ,EAAAY,KAAA,KAAA/C,KAAAsB,OAAAwM,GAAA3L,EAAAY,QAEK/C,MAAAkD,QAAAqL,EAAAmC,IAyBL9P,EAAAe,UAAAmP,yBACA,SAAAhQ,GACA,GAAAwB,GAAAtB,EAAAC,OAAAH,EAAA,QAMAiQ,GACArO,OAAA1B,EAAAC,OAAAH,EAAA,UACA+B,aAAAP,EACAQ,eAAA9B,EAAAC,OAAAH,EAAA,YAIA,IADAiQ,EAAArO,OAAA1C,KAAAgR,iBAAAD,EAAArO,QACAqO,EAAArO,OAAA,EACA,QAGA,IAAAkD,MAEAqF,EAAAjL,KAAAiR,aAAAF,EACA/Q,KAAA6Q,kBACA,eACA,iBACA7P,EAAA0K,2BACAiE,EAAAY,kBACA,IAAAtF,GAAA,GACA,GAAA9I,GAAAnC,KAAA6Q,kBAAA5F,EAEA,IAAAiG,SAAApQ,EAAA0B,OAOA,IANA,GAAAK,GAAAV,EAAAU,aAMAV,KAAAU,kBACA+C,EAAAgI,MACAtL,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAgP,WAAAnQ,EAAAC,OAAAkB,EAAA,8BAGAA,EAAAnC,KAAA6Q,oBAAA5F,OASA,KANA,GAAAnI,GAAAX,EAAAW,eAMAX,GACAA,EAAAU,eAAAP,GACAH,EAAAW,mBACA8C,EAAAgI,MACAtL,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAgP,WAAAnQ,EAAAC,OAAAkB,EAAA,8BAGAA,EAAAnC,KAAA6Q,oBAAA5F,GAKA,MAAArF,IAGAhG,EAAAgB,oBAgGAoO,EAAArN,UAAAmC,OAAAC,OAAAnD,EAAAe,WACAqN,EAAArN,UAAA+N,SAAA9O,EAMAoO,EAAArN,UAAAqP,iBAAA,SAAAnM,GACA,GAAAuM,GAAAvM,CAKA,IAJA,MAAA7E,KAAA+B,aACAqP,EAAApQ,EAAA2B,SAAA3C,KAAA+B,WAAAqP,IAGApR,KAAAoB,SAAAiC,IAAA+N,GACA,MAAApR,MAAAoB,SAAA8E,QAAAkL,EAKA,IAAAtL,EACA,KAAAA,EAAA,EAAaA,EAAA9F,KAAAiP,iBAAA/K,SAAkC4B,EAC/C,GAAA9F,KAAAiP,iBAAAnJ,IAAAjB,EACA,MAAAiB,EAIA,WAYAkJ,EAAAnN,cACA,SAAA8M,EAAAC,GACA,GAAAyC,GAAAvN,OAAAC,OAAAiL,EAAArN,WAEAgF,EAAA0K,EAAA/P,OAAAD,EAAA8L,UAAAwB,EAAArN,OAAAuE,WAAA,GACA5C,EAAAoO,EAAAjQ,SAAAC,EAAA8L,UAAAwB,EAAAvN,SAAAyE,WAAA,EACAwL,GAAAtP,WAAA4M,EAAAzN,YACAmQ,EAAAzK,eAAA+H,EAAAxI,wBAAAkL,EAAAjQ,SAAAyE,UACAwL,EAAAtP,YACAsP,EAAApP,KAAA0M,EAAA5N,MACAsQ,EAAAnC,cAAAN,EACAyC,EAAApC,iBAAAoC,EAAAjQ,SAAAyE,UAAAS,IAAA,SAAAiF,GACA,MAAAvK,GAAAuL,iBAAA8E,EAAAtP,WAAAwJ,EAAAqD,IAYA,QAJA0C,GAAA3C,EAAApN,UAAAsE,UAAAsF,QACAoG,EAAAF,EAAAxB,uBACA2B,EAAAH,EAAAnB,sBAEApK,EAAA,EAAA5B,EAAAoN,EAAApN,OAAsD4B,EAAA5B,EAAY4B,IAAA,CAClE,GAAA2L,GAAAH,EAAAxL,GACA4L,EAAA,GAAAvC,EACAuC,GAAAnP,cAAAkP,EAAAlP,cACAmP,EAAAjP,gBAAAgP,EAAAhP,gBAEAgP,EAAA/O,SACAgP,EAAAhP,OAAAO,EAAAiD,QAAAuL,EAAA/O,QACAgP,EAAA7O,aAAA4O,EAAA5O,aACA6O,EAAA5O,eAAA2O,EAAA3O,eAEA2O,EAAA1O,OACA2O,EAAA3O,KAAA4D,EAAAT,QAAAuL,EAAA1O,OAGAyO,EAAA5D,KAAA8D,IAGAH,EAAA3D,KAAA8D,GAKA,MAFA9B,GAAAyB,EAAAnB,mBAAAlP,EAAA0K,4BAEA2F,GAMArC,EAAArN,UAAAC,SAAA,EAKAkC,OAAAgM,eAAAd,EAAArN,UAAA,WACAkM,IAAA,WACA,MAAA7N,MAAAiP,iBAAA9D,WAqBA6D,EAAArN,UAAAsO,eACA,SAAArI,EAAAvB,GAeA,IAdA,GAYAlE,GAAAkK,EAAAsF,EAAAC,EAAAxJ,EAZA7F,EAAA,EACA8C,EAAA,EACAG,EAAA,EACAD,EAAA,EACAG,EAAA,EACAD,EAAA,EACAvB,EAAA0D,EAAA1D,OACA+G,EAAA,EACA4G,KACAC,KACAC,KACAT,KAGArG,EAAA/G,GACA,SAAA0D,EAAAO,OAAA8C,GACA1I,IACA0I,IACA5F,EAAA,MAEA,UAAAuC,EAAAO,OAAA8C,GACAA,QAEA,CASA,IARA9I,EAAA,GAAAgN,GACAhN,EAAAI,gBAOAqP,EAAA3G,EAAyB2G,EAAA1N,IACzBlE,KAAAmQ,wBAAAvI,EAAAgK,GADuCA,KAQvC,GAHAvF,EAAAzE,EAAAuD,MAAAF,EAAA2G,GAEAD,EAAAE,EAAAxF,GAEApB,GAAAoB,EAAAnI,WACS,CAET,IADAyN,KACA1G,EAAA2G,GACAlQ,EAAAiG,OAAAC,EAAAqD,EAAA6G,GACA1J,EAAA0J,EAAA1J,MACA6C,EAAA6G,EAAAzJ,KACAsJ,EAAA/D,KAAAxF,EAGA,QAAAuJ,EAAAzN,OACA,SAAAG,OAAA,yCAGA,QAAAsN,EAAAzN,OACA,SAAAG,OAAA,yCAGAwN,GAAAxF,GAAAsF,EAIAxP,EAAAM,gBAAA4C,EAAAsM,EAAA,GACAtM,EAAAlD,EAAAM,gBAEAkP,EAAAzN,OAAA,IAEA/B,EAAAO,OAAAgD,EAAAiM,EAAA,GACAjM,GAAAiM,EAAA,GAGAxP,EAAAU,aAAA2C,EAAAmM,EAAA,GACAnM,EAAArD,EAAAU,aAEAV,EAAAU,cAAA,EAGAV,EAAAW,eAAAyC,EAAAoM,EAAA,GACApM,EAAApD,EAAAW,eAEA6O,EAAAzN,OAAA,IAEA/B,EAAAY,KAAA0C,EAAAkM,EAAA,GACAlM,GAAAkM,EAAA,KAIAL,EAAA1D,KAAAzL,GACA,gBAAAA,GAAAU,cACAkP,EAAAnE,KAAAzL,GAKAyN,EAAA0B,EAAAtQ,EAAAgL,qCACAhM,KAAA6P,oBAAAyB,EAEA1B,EAAAmC,EAAA/Q,EAAA0K,4BACA1L,KAAAkQ,mBAAA6B,GAOA/C,EAAArN,UAAAsP,aACA,SAAAe,EAAAC,EAAAC,EACAC,EAAAC,EAAAC,GAMA,GAAAL,EAAAE,IAAA,EACA,SAAAzJ,WAAA,gDACAuJ,EAAAE,GAEA,IAAAF,EAAAG,GAAA,EACA,SAAA1J,WAAA,kDACAuJ,EAAAG,GAGA,OAAAxC,GAAA2C,OAAAN,EAAAC,EAAAG,EAAAC,IAOArD,EAAArN,UAAA4Q,mBACA,WACA,OAAAtH,GAAA,EAAuBA,EAAAjL,KAAA4Q,mBAAA1M,SAAwC+G,EAAA,CAC/D,GAAA9I,GAAAnC,KAAA4Q,mBAAA3F,EAMA,IAAAA,EAAA,EAAAjL,KAAA4Q,mBAAA1M,OAAA,CACA,GAAAsO,GAAAxS,KAAA4Q,mBAAA3F,EAAA,EAEA,IAAA9I,EAAAI,gBAAAiQ,EAAAjQ,cAAA,CACAJ,EAAAsQ,oBAAAD,EAAA/P,gBAAA,CACA,WAKAN,EAAAsQ,oBAAAC,MA4BA1D,EAAArN,UAAA8C,oBACA,SAAA3D,GACA,GAAAiQ,IACAxO,cAAAvB,EAAAC,OAAAH,EAAA,QACA2B,gBAAAzB,EAAAC,OAAAH,EAAA,WAGAmK,EAAAjL,KAAAiR,aACAF,EACA/Q,KAAA4Q,mBACA,gBACA,kBACA5P,EAAAgL,oCACAhL,EAAAC,OAAAH,EAAA,OAAAF,EAAA0P,sBAGA,IAAArF,GAAA,GACA,GAAA9I,GAAAnC,KAAA4Q,mBAAA3F,EAEA,IAAA9I,EAAAI,gBAAAwO,EAAAxO,cAAA,CACA,GAAAG,GAAA1B,EAAAC,OAAAkB,EAAA,cACA,QAAAO,IACAA,EAAA1C,KAAAoB,SAAA0M,GAAApL,GACAA,EAAA1B,EAAAuL,iBAAAvM,KAAA+B,WAAAW,EAAA1C,KAAAkP,eAEA,IAAAnM,GAAA/B,EAAAC,OAAAkB,EAAA,YAIA,OAHA,QAAAY,IACAA,EAAA/C,KAAAsB,OAAAwM,GAAA/K,KAGAL,SACAJ,KAAAtB,EAAAC,OAAAkB,EAAA,qBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,uBACAY,SAKA,OACAL,OAAA,KACAJ,KAAA,KACAE,OAAA,KACAO,KAAA,OAQAiM,EAAArN,UAAAgR,wBACA,WACA,QAAA3S,KAAA4G,iBAGA5G,KAAA4G,eAAA1C,QAAAlE,KAAAoB,SAAAmM,SACAvN,KAAA4G,eAAAgM,KAAA,SAAAC,GAA+C,aAAAA,MAQ/C7D,EAAArN,UAAA6B,iBACA,SAAAqB,EAAAiO,GACA,IAAA9S,KAAA4G,eACA,WAGA,IAAAqE,GAAAjL,KAAAgR,iBAAAnM,EACA,IAAAoG,GAAA,EACA,MAAAjL,MAAA4G,eAAAqE,EAGA,IAAAmG,GAAAvM,CACA,OAAA7E,KAAA+B,aACAqP,EAAApQ,EAAA2B,SAAA3C,KAAA+B,WAAAqP,GAGA,IAAAlH,EACA,UAAAlK,KAAA+B,aACAmI,EAAAlJ,EAAAuI,SAAAvJ,KAAA+B,aAAA,CAKA,GAAAgR,GAAA3B,EAAArG,QAAA,gBACA,YAAAb,EAAAP,QACA3J,KAAAoB,SAAAiC,IAAA0P,GACA,MAAA/S,MAAA4G,eAAA5G,KAAAoB,SAAA8E,QAAA6M,GAGA,MAAA7I,EAAAH,MAAA,KAAAG,EAAAH,OACA/J,KAAAoB,SAAAiC,IAAA,IAAA+N,GACA,MAAApR,MAAA4G,eAAA5G,KAAAoB,SAAA8E,QAAA,IAAAkL,IAQA,GAAA0B,EACA,WAGA,UAAAzO,OAAA,IAAA+M,EAAA,+BA2BApC,EAAArN,UAAAqR,qBACA,SAAAlS,GACA,GAAA4B,GAAA1B,EAAAC,OAAAH,EAAA,SAEA,IADA4B,EAAA1C,KAAAgR,iBAAAtO,GACAA,EAAA,EACA,OACAJ,KAAA,KACAE,OAAA,KACA2O,WAAA,KAIA,IAAAJ,IACArO,SACAG,aAAA7B,EAAAC,OAAAH,EAAA,QACAgC,eAAA9B,EAAAC,OAAAH,EAAA,WAGAmK,EAAAjL,KAAAiR,aACAF,EACA/Q,KAAA6Q,kBACA,eACA,iBACA7P,EAAA0K,2BACA1K,EAAAC,OAAAH,EAAA,OAAAF,EAAA0P,sBAGA,IAAArF,GAAA,GACA,GAAA9I,GAAAnC,KAAA6Q,kBAAA5F,EAEA,IAAA9I,EAAAO,SAAAqO,EAAArO,OACA,OACAJ,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAgP,WAAAnQ,EAAAC,OAAAkB,EAAA,6BAKA,OACAG,KAAA,KACAE,OAAA,KACA2O,WAAA,OAIAvR,EAAAoP,yBAmGAD,EAAApN,UAAAmC,OAAAC,OAAAnD,EAAAe,WACAoN,EAAApN,UAAAsR,YAAArS,EAKAmO,EAAApN,UAAAC,SAAA,EAKAkC,OAAAgM,eAAAf,EAAApN,UAAA,WACAkM,IAAA,WAEA,OADA5K,MACA6C,EAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAC9C,OAAAoN,GAAA,EAAqBA,EAAAlT,KAAAqP,UAAAvJ,GAAA4J,SAAAzM,QAAAiB,OAA+CgP,IACpEjQ,EAAA2K,KAAA5N,KAAAqP,UAAAvJ,GAAA4J,SAAAzM,QAAAiQ,GAGA,OAAAjQ,MAuBA8L,EAAApN,UAAA8C,oBACA,SAAA3D,GACA,GAAAiQ,IACAxO,cAAAvB,EAAAC,OAAAH,EAAA,QACA2B,gBAAAzB,EAAAC,OAAAH,EAAA,WAKAqS,EAAAxD,EAAA2C,OAAAvB,EAAA/Q,KAAAqP,UACA,SAAA0B,EAAAqC,GACA,GAAAtH,GAAAiF,EAAAxO,cAAA6Q,EAAA3D,gBAAAlN,aACA,OAAAuJ,GACAA,EAGAiF,EAAAtO,gBACA2Q,EAAA3D,gBAAAhN,kBAEA2Q,EAAApT,KAAAqP,UAAA8D,EAEA,OAAAC,GASAA,EAAA1D,SAAAjL,qBACAnC,KAAAyO,EAAAxO,eACA6Q,EAAA3D,gBAAAlN,cAAA,GACAC,OAAAuO,EAAAtO,iBACA2Q,EAAA3D,gBAAAlN,gBAAAwO,EAAAxO,cACA6Q,EAAA3D,gBAAAhN,gBAAA,EACA,GACA4Q,KAAAvS,EAAAuS,QAdA3Q,OAAA,KACAJ,KAAA,KACAE,OAAA,KACAO,KAAA,OAmBAgM,EAAApN,UAAAgR,wBACA,WACA,MAAA3S,MAAAqP,UAAAiE,MAAA,SAAA/H,GACA,MAAAA,GAAAmE,SAAAiD,6BASA5D,EAAApN,UAAA6B,iBACA,SAAAqB,EAAAiO,GACA,OAAAhN,GAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAAA,CAC9C,GAAAsN,GAAApT,KAAAqP,UAAAvJ,GAEAvC,EAAA6P,EAAA1D,SAAAlM,iBAAAqB,GAAA,EACA,IAAAtB,EACA,MAAAA,GAGA,GAAAuP,EACA,WAGA,UAAAzO,OAAA,IAAAQ,EAAA,+BAsBAkK,EAAApN,UAAAqR,qBACA,SAAAlS,GACA,OAAAgF,GAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAAA,CAC9C,GAAAsN,GAAApT,KAAAqP,UAAAvJ,EAIA,IAAAsN,EAAA1D,SAAAsB,iBAAAhQ,EAAAC,OAAAH,EAAA,iBAGA,GAAAyS,GAAAH,EAAA1D,SAAAsD,qBAAAlS,EACA,IAAAyS,EAAA,CACA,GAAAC,IACAlR,KAAAiR,EAAAjR,MACA8Q,EAAA3D,gBAAAlN,cAAA,GACAC,OAAA+Q,EAAA/Q,QACA4Q,EAAA3D,gBAAAlN,gBAAAgR,EAAAjR,KACA8Q,EAAA3D,gBAAAhN,gBAAA,EACA,GAEA,OAAA+Q,KAIA,OACAlR,KAAA,KACAE,OAAA,OASAuM,EAAApN,UAAAsO,eACA,SAAArI,EAAAvB,GACArG,KAAA6P,uBACA7P,KAAAkQ,qBACA,QAAApK,GAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAG9C,OAFAsN,GAAApT,KAAAqP,UAAAvJ,GACA2N,EAAAL,EAAA1D,SAAAkB,mBACAsC,EAAA,EAAqBA,EAAAO,EAAAvP,OAA4BgP,IAAA,CACjD,GAAA/Q,GAAAsR,EAAAP,GAEAxQ,EAAA0Q,EAAA1D,SAAAtO,SAAA0M,GAAA3L,EAAAO,OACAA,GAAA1B,EAAAuL,iBAAA6G,EAAA1D,SAAA3N,WAAAW,EAAA1C,KAAAkP,eACAlP,KAAAoB,SAAAkC,IAAAZ,GACAA,EAAA1C,KAAAoB,SAAA8E,QAAAxD,EAEA,IAAAK,GAAA,IACAZ,GAAAY,OACAA,EAAAqQ,EAAA1D,SAAApO,OAAAwM,GAAA3L,EAAAY,MACA/C,KAAAsB,OAAAgC,IAAAP,GACAA,EAAA/C,KAAAsB,OAAA4E,QAAAnD,GAOA,IAAA2Q,IACAhR,SACAH,cAAAJ,EAAAI,eACA6Q,EAAA3D,gBAAAlN,cAAA,GACAE,gBAAAN,EAAAM,iBACA2Q,EAAA3D,gBAAAlN,gBAAAJ,EAAAI,cACA6Q,EAAA3D,gBAAAhN,gBAAA,EACA,GACAI,aAAAV,EAAAU,aACAC,eAAAX,EAAAW,eACAC,OAGA/C,MAAA6P,oBAAAjC,KAAA8F,GACA,gBAAAA,GAAA7Q,cACA7C,KAAAkQ,mBAAAtC,KAAA8F,GAKA9D,EAAA5P,KAAA6P,oBAAA7O,EAAAgL,qCACA4D,EAAA5P,KAAAkQ,mBAAAlP,EAAA0K,6BAGA9L,EAAAmP,4BTu5CM,SAAUlP,EAAQD,GUx/ExB,QAAA+T,GAAAC,EAAAC,EAAA7B,EAAA8B,EAAAC,EAAA1B,GAUA,GAAA2B,GAAAC,KAAAC,OAAAL,EAAAD,GAAA,GAAAA,EACA9H,EAAAiI,EAAA/B,EAAA8B,EAAAE,IAAA,EACA,YAAAlI,EAEAkI,EAEAlI,EAAA,EAEA+H,EAAAG,EAAA,EAEAL,EAAAK,EAAAH,EAAA7B,EAAA8B,EAAAC,EAAA1B,GAKAA,GAAAzS,EAAA2Q,kBACAsD,EAAAC,EAAA5P,OAAA2P,GAAA,EAEAG,EAKAA,EAAAJ,EAAA,EAEAD,EAAAC,EAAAI,EAAAhC,EAAA8B,EAAAC,EAAA1B,GAIAA,GAAAzS,EAAA2Q,kBACAyD,EAEAJ,EAAA,KAAAA,EA1DAhU,EAAA0Q,qBAAA,EACA1Q,EAAA2Q,kBAAA,EAgFA3Q,EAAA0S,OAAA,SAAAN,EAAA8B,EAAAC,EAAA1B,GACA,OAAAyB,EAAA5P,OACA,QAGA,IAAA+G,GAAA0I,GAAA,EAAAG,EAAA5P,OAAA8N,EAAA8B,EACAC,EAAA1B,GAAAzS,EAAA0Q,qBACA,IAAArF,EAAA,EACA,QAMA,MAAAA,EAAA,MACA,IAAA8I,EAAAD,EAAA7I,GAAA6I,EAAA7I,EAAA,UAGAA,CAGA,OAAAA,KVuhFM,SAAUpL,EAAQD,GWzmFxB,QAAAuU,GAAAC,EAAAC,EAAAC,GACA,GAAAxC,GAAAsC,EAAAC,EACAD,GAAAC,GAAAD,EAAAE,GACAF,EAAAE,GAAAxC,EAWA,QAAAyC,GAAAC,EAAAC,GACA,MAAAR,MAAAS,MAAAF,EAAAP,KAAAU,UAAAF,EAAAD,IAeA,QAAAI,GAAAR,EAAAS,EAAAnU,EAAAoU,GAKA,GAAApU,EAAAoU,EAAA,CAYA,GAAAC,GAAAR,EAAA7T,EAAAoU,GACAhP,EAAApF,EAAA,CAEAyT,GAAAC,EAAAW,EAAAD,EASA,QARAE,GAAAZ,EAAAU,GAQA5B,EAAAxS,EAAmBwS,EAAA4B,EAAO5B,IAC1B2B,EAAAT,EAAAlB,GAAA8B,IAAA,IACAlP,GAAA,EACAqO,EAAAC,EAAAtO,EAAAoN,GAIAiB,GAAAC,EAAAtO,EAAA,EAAAoN,EACA,IAAA+B,GAAAnP,EAAA,CAIA8O,GAAAR,EAAAS,EAAAnU,EAAAuU,EAAA,GACAL,EAAAR,EAAAS,EAAAI,EAAA,EAAAH,IAYAlV,EAAAgQ,UAAA,SAAAwE,EAAAS,GACAD,EAAAR,EAAAS,EAAA,EAAAT,EAAAlQ,OAAA,KX4oFM,SAAUrE,EAAQD,EAASM,GY1tFjC,QAAAW,GAAAqU,EAAAC,EAAAtQ,EAAAuQ,EAAAtQ,GACA9E,KAAAqV,YACArV,KAAAsV,kBACAtV,KAAAsC,KAAA,MAAA4S,EAAA,KAAAA,EACAlV,KAAAwC,OAAA,MAAA2S,EAAA,KAAAA,EACAnV,KAAA0C,OAAA,MAAAmC,EAAA,KAAAA,EACA7E,KAAA+C,KAAA,MAAA+B,EAAA,KAAAA,EACA9E,KAAAuV,IAAA,EACA,MAAAH,GAAApV,KAAAsD,IAAA8R,GAnCA,GAAAzU,GAAAT,EAAA,GAAAS,mBACAK,EAAAd,EAAA,GAIAsV,EAAA,UAGAC,EAAA,GAKAF,EAAA,oBAiCA1U,GAAA6U,wBACA,SAAAC,EAAA7T,EAAA8T,GA+FA,QAAAC,GAAA1T,EAAA2T,GACA,UAAA3T,GAAA+O,SAAA/O,EAAAO,OACAqT,EAAAzS,IAAAwS,OACO,CACP,GAAApT,GAAAkT,EACA5U,EAAA0D,KAAAkR,EAAAzT,EAAAO,QACAP,EAAAO,MACAqT,GAAAzS,IAAA,GAAAzC,GAAAsB,EAAAU,aACAV,EAAAW,eACAJ,EACAoT,EACA3T,EAAAY,QAvGA,GAAAgT,GAAA,GAAAlV,GAMAmV,EAAAL,EAAApN,MAAAiN,GACAS,EAAA,EACAC,EAAA,WAMA,QAAAC,KACA,MAAAF,GAAAD,EAAA9R,OACA8R,EAAAC,KAAA/E,OAPA,GAAAkF,GAAAD,IAEAE,EAAAF,KAAA,EACA,OAAAC,GAAAC,GASAC,EAAA,EAAA7D,EAAA,EAKA8D,EAAA,IAgEA,OA9DAzU,GAAAI,YAAA,SAAAC,GACA,UAAAoU,EAAA,CAGA,KAAAD,EAAAnU,EAAAI,eAMS,CAIT,GAAAiU,GAAAR,EAAAC,IAAA,GACAH,EAAAU,EAAAnL,OAAA,EAAAlJ,EAAAM,gBACAgQ,EAOA,OANAuD,GAAAC,GAAAO,EAAAnL,OAAAlJ,EAAAM,gBACAgQ,GACAA,EAAAtQ,EAAAM,gBACAoT,EAAAU,EAAAT,QAEAS,EAAApU,GAhBA0T,EAAAU,EAAAL,KACAI,IACA7D,EAAA,EAqBA,KAAA6D,EAAAnU,EAAAI,eACAwT,EAAAzS,IAAA4S,KACAI,GAEA,IAAA7D,EAAAtQ,EAAAM,gBAAA,CACA,GAAA+T,GAAAR,EAAAC,IAAA,EACAF,GAAAzS,IAAAkT,EAAAnL,OAAA,EAAAlJ,EAAAM,kBACAuT,EAAAC,GAAAO,EAAAnL,OAAAlJ,EAAAM,iBACAgQ,EAAAtQ,EAAAM,gBAEA8T,EAAApU,GACKnC,MAELiW,EAAAD,EAAA9R,SACAqS,GAEAV,EAAAU,EAAAL,KAGAH,EAAAzS,IAAA0S,EAAAvL,OAAAwL,GAAAvR,KAAA,MAIA5C,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAI,GAAAzB,EAAA0B,iBAAAL,EACA,OAAAI,IACA,MAAAqS,IACAzS,EAAAnC,EAAA0D,KAAAkR,EAAAzS,IAEA4S,EAAAtS,iBAAAN,EAAAI,MAIAwS,GAwBAlV,EAAAc,UAAA2B,IAAA,SAAAmT,GACA,GAAArL,MAAAsL,QAAAD,GACAA,EAAAvT,QAAA,SAAAyT,GACA3W,KAAAsD,IAAAqT,IACK3W,UAEL,KAAAyW,EAAAlB,IAAA,gBAAAkB,GAMA,SAAAhO,WACA,8EAAAgO,EANAA,IACAzW,KAAAqV,SAAAzH,KAAA6I,GAQA,MAAAzW,OASAa,EAAAc,UAAAiV,QAAA,SAAAH,GACA,GAAArL,MAAAsL,QAAAD,GACA,OAAA3Q,GAAA2Q,EAAAvS,OAAA,EAAiC4B,GAAA,EAAQA,IACzC9F,KAAA4W,QAAAH,EAAA3Q,QAGA,KAAA2Q,EAAAlB,IAAA,gBAAAkB,GAIA,SAAAhO,WACA,8EAAAgO,EAJAzW,MAAAqV,SAAAwB,QAAAJ,GAOA,MAAAzW,OAUAa,EAAAc,UAAAmV,KAAA,SAAAC,GAEA,OADAJ,GACA7Q,EAAA,EAAAC,EAAA/F,KAAAqV,SAAAnR,OAA6C4B,EAAAC,EAASD,IACtD6Q,EAAA3W,KAAAqV,SAAAvP,GACA6Q,EAAApB,GACAoB,EAAAG,KAAAC,GAGA,KAAAJ,GACAI,EAAAJ,GAAoBjU,OAAA1C,KAAA0C,OACpBJ,KAAAtC,KAAAsC,KACAE,OAAAxC,KAAAwC,OACAO,KAAA/C,KAAA+C,QAYAlC,EAAAc,UAAA+C,KAAA,SAAAsS,GACA,GAAAC,GACAnR,EACAC,EAAA/F,KAAAqV,SAAAnR,MACA,IAAA6B,EAAA,GAEA,IADAkR,KACAnR,EAAA,EAAeA,EAAAC,EAAA,EAAWD,IAC1BmR,EAAArJ,KAAA5N,KAAAqV,SAAAvP,IACAmR,EAAArJ,KAAAoJ,EAEAC,GAAArJ,KAAA5N,KAAAqV,SAAAvP,IACA9F,KAAAqV,SAAA4B,EAEA,MAAAjX,OAUAa,EAAAc,UAAAuV,aAAA,SAAAC,EAAAC,GACA,GAAAC,GAAArX,KAAAqV,SAAArV,KAAAqV,SAAAnR,OAAA,EAUA,OATAmT,GAAA9B,GACA8B,EAAAH,aAAAC,EAAAC,GAEA,gBAAAC,GACArX,KAAAqV,SAAArV,KAAAqV,SAAAnR,OAAA,GAAAmT,EAAAtM,QAAAoM,EAAAC,GAGApX,KAAAqV,SAAAzH,KAAA,GAAA7C,QAAAoM,EAAAC,IAEApX,MAUAa,EAAAc,UAAA8B,iBACA,SAAAG,EAAAC,GACA7D,KAAAsV,eAAAtU,EAAAgD,YAAAJ,IAAAC,GASAhD,EAAAc,UAAA2V,mBACA,SAAAP,GACA,OAAAjR,GAAA,EAAAC,EAAA/F,KAAAqV,SAAAnR,OAA+C4B,EAAAC,EAASD,IACxD9F,KAAAqV,SAAAvP,GAAAyP,IACAvV,KAAAqV,SAAAvP,GAAAwR,mBAAAP,EAKA,QADA9T,GAAAa,OAAAG,KAAAjE,KAAAsV,gBACAxP,EAAA,EAAAC,EAAA9C,EAAAiB,OAAyC4B,EAAAC,EAASD,IAClDiR,EAAA/V,EAAAyK,cAAAxI,EAAA6C,IAAA9F,KAAAsV,eAAArS,EAAA6C,MAQAjF,EAAAc,UAAAkF,SAAA,WACA,GAAAwF,GAAA,EAIA,OAHArM,MAAA8W,KAAA,SAAAH,GACAtK,GAAAsK,IAEAtK,GAOAxL,EAAAc,UAAA4V,sBAAA,SAAAzW,GACA,GAAAuB,IACAyT,KAAA,GACAxT,KAAA,EACAE,OAAA,GAEA8D,EAAA,GAAA3F,GAAAG,GACA0W,GAAA,EACAC,EAAA,KACAC,EAAA,KACAC,EAAA,KACAC,EAAA,IAqEA,OApEA5X,MAAA8W,KAAA,SAAAH,EAAA/T,GACAP,EAAAyT,MAAAa,EACA,OAAA/T,EAAAF,QACA,OAAAE,EAAAN,MACA,OAAAM,EAAAJ,QACAiV,IAAA7U,EAAAF,QACAgV,IAAA9U,EAAAN,MACAqV,IAAA/U,EAAAJ,QACAoV,IAAAhV,EAAAG,MACAuD,EAAAtD,YACAN,OAAAE,EAAAF,OACAE,UACAN,KAAAM,EAAAN,KACAE,OAAAI,EAAAJ,QAEAH,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,QAEAO,KAAAH,EAAAG,OAGA0U,EAAA7U,EAAAF,OACAgV,EAAA9U,EAAAN,KACAqV,EAAA/U,EAAAJ,OACAoV,EAAAhV,EAAAG,KACAyU,GAAA,GACKA,IACLlR,EAAAtD,YACAX,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,UAGAiV,EAAA,KACAD,GAAA,EAEA,QAAA7J,GAAA,EAAAzJ,EAAAyS,EAAAzS,OAA4CyJ,EAAAzJ,EAAcyJ,IAC1DgJ,EAAAzO,WAAAyF,KAAA8H,GACApT,EAAAC,OACAD,EAAAG,OAAA,EAEAmL,EAAA,IAAAzJ,GACAuT,EAAA,KACAD,GAAA,GACSA,GACTlR,EAAAtD,YACAN,OAAAE,EAAAF,OACAE,UACAN,KAAAM,EAAAN,KACAE,OAAAI,EAAAJ,QAEAH,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,QAEAO,KAAAH,EAAAG,QAIAV,EAAAG,WAIAxC,KAAAsX,mBAAA,SAAAnU,EAAA0U,GACAvR,EAAA7C,iBAAAN,EAAA0U,MAGU/B,KAAAzT,EAAAyT,KAAAxP,QAGV1G,EAAAiB\",\"file\":\"source-map.min.js\",\"sourcesContent\":[\"(function webpackUniversalModuleDefinition(root, factory) {\\n\\tif(typeof exports === 'object' && typeof module === 'object')\\n\\t\\tmodule.exports = factory();\\n\\telse if(typeof define === 'function' && define.amd)\\n\\t\\tdefine([], factory);\\n\\telse if(typeof exports === 'object')\\n\\t\\texports[\\\"sourceMap\\\"] = factory();\\n\\telse\\n\\t\\troot[\\\"sourceMap\\\"] = factory();\\n})(this, function() {\\nreturn \\n\\n\\n// WEBPACK FOOTER //\\n// webpack/universalModuleDefinition\",\"(function webpackUniversalModuleDefinition(root, factory) {\\n\\tif(typeof exports === 'object' && typeof module === 'object')\\n\\t\\tmodule.exports = factory();\\n\\telse if(typeof define === 'function' && define.amd)\\n\\t\\tdefine([], factory);\\n\\telse if(typeof exports === 'object')\\n\\t\\texports[\\\"sourceMap\\\"] = factory();\\n\\telse\\n\\t\\troot[\\\"sourceMap\\\"] = factory();\\n})(this, function() {\\nreturn /******/ (function(modules) { // webpackBootstrap\\n/******/ \\t// The module cache\\n/******/ \\tvar installedModules = {};\\n/******/\\n/******/ \\t// The require function\\n/******/ \\tfunction __webpack_require__(moduleId) {\\n/******/\\n/******/ \\t\\t// Check if module is in cache\\n/******/ \\t\\tif(installedModules[moduleId])\\n/******/ \\t\\t\\treturn installedModules[moduleId].exports;\\n/******/\\n/******/ \\t\\t// Create a new module (and put it into the cache)\\n/******/ \\t\\tvar module = installedModules[moduleId] = {\\n/******/ \\t\\t\\texports: {},\\n/******/ \\t\\t\\tid: moduleId,\\n/******/ \\t\\t\\tloaded: false\\n/******/ \\t\\t};\\n/******/\\n/******/ \\t\\t// Execute the module function\\n/******/ \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n/******/\\n/******/ \\t\\t// Flag the module as loaded\\n/******/ \\t\\tmodule.loaded = true;\\n/******/\\n/******/ \\t\\t// Return the exports of the module\\n/******/ \\t\\treturn module.exports;\\n/******/ \\t}\\n/******/\\n/******/\\n/******/ \\t// expose the modules object (__webpack_modules__)\\n/******/ \\t__webpack_require__.m = modules;\\n/******/\\n/******/ \\t// expose the module cache\\n/******/ \\t__webpack_require__.c = installedModules;\\n/******/\\n/******/ \\t// __webpack_public_path__\\n/******/ \\t__webpack_require__.p = \\\"\\\";\\n/******/\\n/******/ \\t// Load entry module and return exports\\n/******/ \\treturn __webpack_require__(0);\\n/******/ })\\n/************************************************************************/\\n/******/ ([\\n/* 0 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/*\\n\\t * Copyright 2009-2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE.txt or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\\n\\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\\n\\texports.SourceNode = __webpack_require__(10).SourceNode;\\n\\n\\n/***/ }),\\n/* 1 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\tvar base64VLQ = __webpack_require__(2);\\n\\tvar util = __webpack_require__(4);\\n\\tvar ArraySet = __webpack_require__(5).ArraySet;\\n\\tvar MappingList = __webpack_require__(6).MappingList;\\n\\t\\n\\t/**\\n\\t * An instance of the SourceMapGenerator represents a source map which is\\n\\t * being built incrementally. You may pass an object with the following\\n\\t * properties:\\n\\t *\\n\\t *   - file: The filename of the generated source.\\n\\t *   - sourceRoot: A root for all relative URLs in this source map.\\n\\t */\\n\\tfunction SourceMapGenerator(aArgs) {\\n\\t  if (!aArgs) {\\n\\t    aArgs = {};\\n\\t  }\\n\\t  this._file = util.getArg(aArgs, 'file', null);\\n\\t  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\\n\\t  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\\n\\t  this._sources = new ArraySet();\\n\\t  this._names = new ArraySet();\\n\\t  this._mappings = new MappingList();\\n\\t  this._sourcesContents = null;\\n\\t}\\n\\t\\n\\tSourceMapGenerator.prototype._version = 3;\\n\\t\\n\\t/**\\n\\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\\n\\t *\\n\\t * @param aSourceMapConsumer The SourceMap.\\n\\t */\\n\\tSourceMapGenerator.fromSourceMap =\\n\\t  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\\n\\t    var sourceRoot = aSourceMapConsumer.sourceRoot;\\n\\t    var generator = new SourceMapGenerator({\\n\\t      file: aSourceMapConsumer.file,\\n\\t      sourceRoot: sourceRoot\\n\\t    });\\n\\t    aSourceMapConsumer.eachMapping(function (mapping) {\\n\\t      var newMapping = {\\n\\t        generated: {\\n\\t          line: mapping.generatedLine,\\n\\t          column: mapping.generatedColumn\\n\\t        }\\n\\t      };\\n\\t\\n\\t      if (mapping.source != null) {\\n\\t        newMapping.source = mapping.source;\\n\\t        if (sourceRoot != null) {\\n\\t          newMapping.source = util.relative(sourceRoot, newMapping.source);\\n\\t        }\\n\\t\\n\\t        newMapping.original = {\\n\\t          line: mapping.originalLine,\\n\\t          column: mapping.originalColumn\\n\\t        };\\n\\t\\n\\t        if (mapping.name != null) {\\n\\t          newMapping.name = mapping.name;\\n\\t        }\\n\\t      }\\n\\t\\n\\t      generator.addMapping(newMapping);\\n\\t    });\\n\\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\\n\\t      var sourceRelative = sourceFile;\\n\\t      if (sourceRoot !== null) {\\n\\t        sourceRelative = util.relative(sourceRoot, sourceFile);\\n\\t      }\\n\\t\\n\\t      if (!generator._sources.has(sourceRelative)) {\\n\\t        generator._sources.add(sourceRelative);\\n\\t      }\\n\\t\\n\\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\\n\\t      if (content != null) {\\n\\t        generator.setSourceContent(sourceFile, content);\\n\\t      }\\n\\t    });\\n\\t    return generator;\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Add a single mapping from original source line and column to the generated\\n\\t * source's line and column for this source map being created. The mapping\\n\\t * object should have the following properties:\\n\\t *\\n\\t *   - generated: An object with the generated line and column positions.\\n\\t *   - original: An object with the original line and column positions.\\n\\t *   - source: The original source file (relative to the sourceRoot).\\n\\t *   - name: An optional original token name for this mapping.\\n\\t */\\n\\tSourceMapGenerator.prototype.addMapping =\\n\\t  function SourceMapGenerator_addMapping(aArgs) {\\n\\t    var generated = util.getArg(aArgs, 'generated');\\n\\t    var original = util.getArg(aArgs, 'original', null);\\n\\t    var source = util.getArg(aArgs, 'source', null);\\n\\t    var name = util.getArg(aArgs, 'name', null);\\n\\t\\n\\t    if (!this._skipValidation) {\\n\\t      this._validateMapping(generated, original, source, name);\\n\\t    }\\n\\t\\n\\t    if (source != null) {\\n\\t      source = String(source);\\n\\t      if (!this._sources.has(source)) {\\n\\t        this._sources.add(source);\\n\\t      }\\n\\t    }\\n\\t\\n\\t    if (name != null) {\\n\\t      name = String(name);\\n\\t      if (!this._names.has(name)) {\\n\\t        this._names.add(name);\\n\\t      }\\n\\t    }\\n\\t\\n\\t    this._mappings.add({\\n\\t      generatedLine: generated.line,\\n\\t      generatedColumn: generated.column,\\n\\t      originalLine: original != null && original.line,\\n\\t      originalColumn: original != null && original.column,\\n\\t      source: source,\\n\\t      name: name\\n\\t    });\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Set the source content for a source file.\\n\\t */\\n\\tSourceMapGenerator.prototype.setSourceContent =\\n\\t  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\\n\\t    var source = aSourceFile;\\n\\t    if (this._sourceRoot != null) {\\n\\t      source = util.relative(this._sourceRoot, source);\\n\\t    }\\n\\t\\n\\t    if (aSourceContent != null) {\\n\\t      // Add the source content to the _sourcesContents map.\\n\\t      // Create a new _sourcesContents map if the property is null.\\n\\t      if (!this._sourcesContents) {\\n\\t        this._sourcesContents = Object.create(null);\\n\\t      }\\n\\t      this._sourcesContents[util.toSetString(source)] = aSourceContent;\\n\\t    } else if (this._sourcesContents) {\\n\\t      // Remove the source file from the _sourcesContents map.\\n\\t      // If the _sourcesContents map is empty, set the property to null.\\n\\t      delete this._sourcesContents[util.toSetString(source)];\\n\\t      if (Object.keys(this._sourcesContents).length === 0) {\\n\\t        this._sourcesContents = null;\\n\\t      }\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Applies the mappings of a sub-source-map for a specific source file to the\\n\\t * source map being generated. Each mapping to the supplied source file is\\n\\t * rewritten using the supplied source map. Note: The resolution for the\\n\\t * resulting mappings is the minimium of this map and the supplied map.\\n\\t *\\n\\t * @param aSourceMapConsumer The source map to be applied.\\n\\t * @param aSourceFile Optional. The filename of the source file.\\n\\t *        If omitted, SourceMapConsumer's file property will be used.\\n\\t * @param aSourceMapPath Optional. The dirname of the path to the source map\\n\\t *        to be applied. If relative, it is relative to the SourceMapConsumer.\\n\\t *        This parameter is needed when the two source maps aren't in the same\\n\\t *        directory, and the source map to be applied contains relative source\\n\\t *        paths. If so, those relative source paths need to be rewritten\\n\\t *        relative to the SourceMapGenerator.\\n\\t */\\n\\tSourceMapGenerator.prototype.applySourceMap =\\n\\t  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\\n\\t    var sourceFile = aSourceFile;\\n\\t    // If aSourceFile is omitted, we will use the file property of the SourceMap\\n\\t    if (aSourceFile == null) {\\n\\t      if (aSourceMapConsumer.file == null) {\\n\\t        throw new Error(\\n\\t          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\\n\\t          'or the source map\\\\'s \\\"file\\\" property. Both were omitted.'\\n\\t        );\\n\\t      }\\n\\t      sourceFile = aSourceMapConsumer.file;\\n\\t    }\\n\\t    var sourceRoot = this._sourceRoot;\\n\\t    // Make \\\"sourceFile\\\" relative if an absolute Url is passed.\\n\\t    if (sourceRoot != null) {\\n\\t      sourceFile = util.relative(sourceRoot, sourceFile);\\n\\t    }\\n\\t    // Applying the SourceMap can add and remove items from the sources and\\n\\t    // the names array.\\n\\t    var newSources = new ArraySet();\\n\\t    var newNames = new ArraySet();\\n\\t\\n\\t    // Find mappings for the \\\"sourceFile\\\"\\n\\t    this._mappings.unsortedForEach(function (mapping) {\\n\\t      if (mapping.source === sourceFile && mapping.originalLine != null) {\\n\\t        // Check if it can be mapped by the source map, then update the mapping.\\n\\t        var original = aSourceMapConsumer.originalPositionFor({\\n\\t          line: mapping.originalLine,\\n\\t          column: mapping.originalColumn\\n\\t        });\\n\\t        if (original.source != null) {\\n\\t          // Copy mapping\\n\\t          mapping.source = original.source;\\n\\t          if (aSourceMapPath != null) {\\n\\t            mapping.source = util.join(aSourceMapPath, mapping.source)\\n\\t          }\\n\\t          if (sourceRoot != null) {\\n\\t            mapping.source = util.relative(sourceRoot, mapping.source);\\n\\t          }\\n\\t          mapping.originalLine = original.line;\\n\\t          mapping.originalColumn = original.column;\\n\\t          if (original.name != null) {\\n\\t            mapping.name = original.name;\\n\\t          }\\n\\t        }\\n\\t      }\\n\\t\\n\\t      var source = mapping.source;\\n\\t      if (source != null && !newSources.has(source)) {\\n\\t        newSources.add(source);\\n\\t      }\\n\\t\\n\\t      var name = mapping.name;\\n\\t      if (name != null && !newNames.has(name)) {\\n\\t        newNames.add(name);\\n\\t      }\\n\\t\\n\\t    }, this);\\n\\t    this._sources = newSources;\\n\\t    this._names = newNames;\\n\\t\\n\\t    // Copy sourcesContents of applied map.\\n\\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\\n\\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\\n\\t      if (content != null) {\\n\\t        if (aSourceMapPath != null) {\\n\\t          sourceFile = util.join(aSourceMapPath, sourceFile);\\n\\t        }\\n\\t        if (sourceRoot != null) {\\n\\t          sourceFile = util.relative(sourceRoot, sourceFile);\\n\\t        }\\n\\t        this.setSourceContent(sourceFile, content);\\n\\t      }\\n\\t    }, this);\\n\\t  };\\n\\t\\n\\t/**\\n\\t * A mapping can have one of the three levels of data:\\n\\t *\\n\\t *   1. Just the generated position.\\n\\t *   2. The Generated position, original position, and original source.\\n\\t *   3. Generated and original position, original source, as well as a name\\n\\t *      token.\\n\\t *\\n\\t * To maintain consistency, we validate that any new mapping being added falls\\n\\t * in to one of these categories.\\n\\t */\\n\\tSourceMapGenerator.prototype._validateMapping =\\n\\t  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\\n\\t                                              aName) {\\n\\t    // When aOriginal is truthy but has empty values for .line and .column,\\n\\t    // it is most likely a programmer error. In this case we throw a very\\n\\t    // specific error message to try to guide them the right way.\\n\\t    // For example: https://github.com/Polymer/polymer-bundler/pull/519\\n\\t    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\\n\\t        throw new Error(\\n\\t            'original.line and original.column are not numbers -- you probably meant to omit ' +\\n\\t            'the original mapping entirely and only map the generated position. If so, pass ' +\\n\\t            'null for the original mapping instead of an object with empty or null values.'\\n\\t        );\\n\\t    }\\n\\t\\n\\t    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\\n\\t        && aGenerated.line > 0 && aGenerated.column >= 0\\n\\t        && !aOriginal && !aSource && !aName) {\\n\\t      // Case 1.\\n\\t      return;\\n\\t    }\\n\\t    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\\n\\t             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\\n\\t             && aGenerated.line > 0 && aGenerated.column >= 0\\n\\t             && aOriginal.line > 0 && aOriginal.column >= 0\\n\\t             && aSource) {\\n\\t      // Cases 2 and 3.\\n\\t      return;\\n\\t    }\\n\\t    else {\\n\\t      throw new Error('Invalid mapping: ' + JSON.stringify({\\n\\t        generated: aGenerated,\\n\\t        source: aSource,\\n\\t        original: aOriginal,\\n\\t        name: aName\\n\\t      }));\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\\n\\t * specified by the source map format.\\n\\t */\\n\\tSourceMapGenerator.prototype._serializeMappings =\\n\\t  function SourceMapGenerator_serializeMappings() {\\n\\t    var previousGeneratedColumn = 0;\\n\\t    var previousGeneratedLine = 1;\\n\\t    var previousOriginalColumn = 0;\\n\\t    var previousOriginalLine = 0;\\n\\t    var previousName = 0;\\n\\t    var previousSource = 0;\\n\\t    var result = '';\\n\\t    var next;\\n\\t    var mapping;\\n\\t    var nameIdx;\\n\\t    var sourceIdx;\\n\\t\\n\\t    var mappings = this._mappings.toArray();\\n\\t    for (var i = 0, len = mappings.length; i < len; i++) {\\n\\t      mapping = mappings[i];\\n\\t      next = ''\\n\\t\\n\\t      if (mapping.generatedLine !== previousGeneratedLine) {\\n\\t        previousGeneratedColumn = 0;\\n\\t        while (mapping.generatedLine !== previousGeneratedLine) {\\n\\t          next += ';';\\n\\t          previousGeneratedLine++;\\n\\t        }\\n\\t      }\\n\\t      else {\\n\\t        if (i > 0) {\\n\\t          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\\n\\t            continue;\\n\\t          }\\n\\t          next += ',';\\n\\t        }\\n\\t      }\\n\\t\\n\\t      next += base64VLQ.encode(mapping.generatedColumn\\n\\t                                 - previousGeneratedColumn);\\n\\t      previousGeneratedColumn = mapping.generatedColumn;\\n\\t\\n\\t      if (mapping.source != null) {\\n\\t        sourceIdx = this._sources.indexOf(mapping.source);\\n\\t        next += base64VLQ.encode(sourceIdx - previousSource);\\n\\t        previousSource = sourceIdx;\\n\\t\\n\\t        // lines are stored 0-based in SourceMap spec version 3\\n\\t        next += base64VLQ.encode(mapping.originalLine - 1\\n\\t                                   - previousOriginalLine);\\n\\t        previousOriginalLine = mapping.originalLine - 1;\\n\\t\\n\\t        next += base64VLQ.encode(mapping.originalColumn\\n\\t                                   - previousOriginalColumn);\\n\\t        previousOriginalColumn = mapping.originalColumn;\\n\\t\\n\\t        if (mapping.name != null) {\\n\\t          nameIdx = this._names.indexOf(mapping.name);\\n\\t          next += base64VLQ.encode(nameIdx - previousName);\\n\\t          previousName = nameIdx;\\n\\t        }\\n\\t      }\\n\\t\\n\\t      result += next;\\n\\t    }\\n\\t\\n\\t    return result;\\n\\t  };\\n\\t\\n\\tSourceMapGenerator.prototype._generateSourcesContent =\\n\\t  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\\n\\t    return aSources.map(function (source) {\\n\\t      if (!this._sourcesContents) {\\n\\t        return null;\\n\\t      }\\n\\t      if (aSourceRoot != null) {\\n\\t        source = util.relative(aSourceRoot, source);\\n\\t      }\\n\\t      var key = util.toSetString(source);\\n\\t      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\\n\\t        ? this._sourcesContents[key]\\n\\t        : null;\\n\\t    }, this);\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Externalize the source map.\\n\\t */\\n\\tSourceMapGenerator.prototype.toJSON =\\n\\t  function SourceMapGenerator_toJSON() {\\n\\t    var map = {\\n\\t      version: this._version,\\n\\t      sources: this._sources.toArray(),\\n\\t      names: this._names.toArray(),\\n\\t      mappings: this._serializeMappings()\\n\\t    };\\n\\t    if (this._file != null) {\\n\\t      map.file = this._file;\\n\\t    }\\n\\t    if (this._sourceRoot != null) {\\n\\t      map.sourceRoot = this._sourceRoot;\\n\\t    }\\n\\t    if (this._sourcesContents) {\\n\\t      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\\n\\t    }\\n\\t\\n\\t    return map;\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Render the source map being generated to a string.\\n\\t */\\n\\tSourceMapGenerator.prototype.toString =\\n\\t  function SourceMapGenerator_toString() {\\n\\t    return JSON.stringify(this.toJSON());\\n\\t  };\\n\\t\\n\\texports.SourceMapGenerator = SourceMapGenerator;\\n\\n\\n/***/ }),\\n/* 2 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t *\\n\\t * Based on the Base 64 VLQ implementation in Closure Compiler:\\n\\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\\n\\t *\\n\\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\\n\\t * Redistribution and use in source and binary forms, with or without\\n\\t * modification, are permitted provided that the following conditions are\\n\\t * met:\\n\\t *\\n\\t *  * Redistributions of source code must retain the above copyright\\n\\t *    notice, this list of conditions and the following disclaimer.\\n\\t *  * Redistributions in binary form must reproduce the above\\n\\t *    copyright notice, this list of conditions and the following\\n\\t *    disclaimer in the documentation and/or other materials provided\\n\\t *    with the distribution.\\n\\t *  * Neither the name of Google Inc. nor the names of its\\n\\t *    contributors may be used to endorse or promote products derived\\n\\t *    from this software without specific prior written permission.\\n\\t *\\n\\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\\n\\t * \\\"AS IS\\\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\\n\\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\\n\\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\\n\\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\\n\\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\\n\\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\\n\\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\\n\\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\\n\\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n\\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n\\t */\\n\\t\\n\\tvar base64 = __webpack_require__(3);\\n\\t\\n\\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\\n\\t// length quantities we use in the source map spec, the first bit is the sign,\\n\\t// the next four bits are the actual value, and the 6th bit is the\\n\\t// continuation bit. The continuation bit tells us whether there are more\\n\\t// digits in this value following this digit.\\n\\t//\\n\\t//   Continuation\\n\\t//   |    Sign\\n\\t//   |    |\\n\\t//   V    V\\n\\t//   101011\\n\\t\\n\\tvar VLQ_BASE_SHIFT = 5;\\n\\t\\n\\t// binary: 100000\\n\\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\\n\\t\\n\\t// binary: 011111\\n\\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\\n\\t\\n\\t// binary: 100000\\n\\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\\n\\t\\n\\t/**\\n\\t * Converts from a two-complement value to a value where the sign bit is\\n\\t * placed in the least significant bit.  For example, as decimals:\\n\\t *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\\n\\t *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\\n\\t */\\n\\tfunction toVLQSigned(aValue) {\\n\\t  return aValue < 0\\n\\t    ? ((-aValue) << 1) + 1\\n\\t    : (aValue << 1) + 0;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Converts to a two-complement value from a value where the sign bit is\\n\\t * placed in the least significant bit.  For example, as decimals:\\n\\t *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\\n\\t *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\\n\\t */\\n\\tfunction fromVLQSigned(aValue) {\\n\\t  var isNegative = (aValue & 1) === 1;\\n\\t  var shifted = aValue >> 1;\\n\\t  return isNegative\\n\\t    ? -shifted\\n\\t    : shifted;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Returns the base 64 VLQ encoded value.\\n\\t */\\n\\texports.encode = function base64VLQ_encode(aValue) {\\n\\t  var encoded = \\\"\\\";\\n\\t  var digit;\\n\\t\\n\\t  var vlq = toVLQSigned(aValue);\\n\\t\\n\\t  do {\\n\\t    digit = vlq & VLQ_BASE_MASK;\\n\\t    vlq >>>= VLQ_BASE_SHIFT;\\n\\t    if (vlq > 0) {\\n\\t      // There are still more digits in this value, so we must make sure the\\n\\t      // continuation bit is marked.\\n\\t      digit |= VLQ_CONTINUATION_BIT;\\n\\t    }\\n\\t    encoded += base64.encode(digit);\\n\\t  } while (vlq > 0);\\n\\t\\n\\t  return encoded;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Decodes the next base 64 VLQ value from the given string and returns the\\n\\t * value and the rest of the string via the out parameter.\\n\\t */\\n\\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\\n\\t  var strLen = aStr.length;\\n\\t  var result = 0;\\n\\t  var shift = 0;\\n\\t  var continuation, digit;\\n\\t\\n\\t  do {\\n\\t    if (aIndex >= strLen) {\\n\\t      throw new Error(\\\"Expected more digits in base 64 VLQ value.\\\");\\n\\t    }\\n\\t\\n\\t    digit = base64.decode(aStr.charCodeAt(aIndex++));\\n\\t    if (digit === -1) {\\n\\t      throw new Error(\\\"Invalid base64 digit: \\\" + aStr.charAt(aIndex - 1));\\n\\t    }\\n\\t\\n\\t    continuation = !!(digit & VLQ_CONTINUATION_BIT);\\n\\t    digit &= VLQ_BASE_MASK;\\n\\t    result = result + (digit << shift);\\n\\t    shift += VLQ_BASE_SHIFT;\\n\\t  } while (continuation);\\n\\t\\n\\t  aOutParam.value = fromVLQSigned(result);\\n\\t  aOutParam.rest = aIndex;\\n\\t};\\n\\n\\n/***/ }),\\n/* 3 */\\n/***/ (function(module, exports) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\\n\\t\\n\\t/**\\n\\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\\n\\t */\\n\\texports.encode = function (number) {\\n\\t  if (0 <= number && number < intToCharMap.length) {\\n\\t    return intToCharMap[number];\\n\\t  }\\n\\t  throw new TypeError(\\\"Must be between 0 and 63: \\\" + number);\\n\\t};\\n\\t\\n\\t/**\\n\\t * Decode a single base 64 character code digit to an integer. Returns -1 on\\n\\t * failure.\\n\\t */\\n\\texports.decode = function (charCode) {\\n\\t  var bigA = 65;     // 'A'\\n\\t  var bigZ = 90;     // 'Z'\\n\\t\\n\\t  var littleA = 97;  // 'a'\\n\\t  var littleZ = 122; // 'z'\\n\\t\\n\\t  var zero = 48;     // '0'\\n\\t  var nine = 57;     // '9'\\n\\t\\n\\t  var plus = 43;     // '+'\\n\\t  var slash = 47;    // '/'\\n\\t\\n\\t  var littleOffset = 26;\\n\\t  var numberOffset = 52;\\n\\t\\n\\t  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\\n\\t  if (bigA <= charCode && charCode <= bigZ) {\\n\\t    return (charCode - bigA);\\n\\t  }\\n\\t\\n\\t  // 26 - 51: abcdefghijklmnopqrstuvwxyz\\n\\t  if (littleA <= charCode && charCode <= littleZ) {\\n\\t    return (charCode - littleA + littleOffset);\\n\\t  }\\n\\t\\n\\t  // 52 - 61: 0123456789\\n\\t  if (zero <= charCode && charCode <= nine) {\\n\\t    return (charCode - zero + numberOffset);\\n\\t  }\\n\\t\\n\\t  // 62: +\\n\\t  if (charCode == plus) {\\n\\t    return 62;\\n\\t  }\\n\\t\\n\\t  // 63: /\\n\\t  if (charCode == slash) {\\n\\t    return 63;\\n\\t  }\\n\\t\\n\\t  // Invalid base64 digit.\\n\\t  return -1;\\n\\t};\\n\\n\\n/***/ }),\\n/* 4 */\\n/***/ (function(module, exports) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\t/**\\n\\t * This is a helper function for getting values from parameter/options\\n\\t * objects.\\n\\t *\\n\\t * @param args The object we are extracting values from\\n\\t * @param name The name of the property we are getting.\\n\\t * @param defaultValue An optional value to return if the property is missing\\n\\t * from the object. If this is not specified and the property is missing, an\\n\\t * error will be thrown.\\n\\t */\\n\\tfunction getArg(aArgs, aName, aDefaultValue) {\\n\\t  if (aName in aArgs) {\\n\\t    return aArgs[aName];\\n\\t  } else if (arguments.length === 3) {\\n\\t    return aDefaultValue;\\n\\t  } else {\\n\\t    throw new Error('\\\"' + aName + '\\\" is a required argument.');\\n\\t  }\\n\\t}\\n\\texports.getArg = getArg;\\n\\t\\n\\tvar urlRegexp = /^(?:([\\\\w+\\\\-.]+):)?\\\\/\\\\/(?:(\\\\w+:\\\\w+)@)?([\\\\w.-]*)(?::(\\\\d+))?(.*)$/;\\n\\tvar dataUrlRegexp = /^data:.+\\\\,.+$/;\\n\\t\\n\\tfunction urlParse(aUrl) {\\n\\t  var match = aUrl.match(urlRegexp);\\n\\t  if (!match) {\\n\\t    return null;\\n\\t  }\\n\\t  return {\\n\\t    scheme: match[1],\\n\\t    auth: match[2],\\n\\t    host: match[3],\\n\\t    port: match[4],\\n\\t    path: match[5]\\n\\t  };\\n\\t}\\n\\texports.urlParse = urlParse;\\n\\t\\n\\tfunction urlGenerate(aParsedUrl) {\\n\\t  var url = '';\\n\\t  if (aParsedUrl.scheme) {\\n\\t    url += aParsedUrl.scheme + ':';\\n\\t  }\\n\\t  url += '//';\\n\\t  if (aParsedUrl.auth) {\\n\\t    url += aParsedUrl.auth + '@';\\n\\t  }\\n\\t  if (aParsedUrl.host) {\\n\\t    url += aParsedUrl.host;\\n\\t  }\\n\\t  if (aParsedUrl.port) {\\n\\t    url += \\\":\\\" + aParsedUrl.port\\n\\t  }\\n\\t  if (aParsedUrl.path) {\\n\\t    url += aParsedUrl.path;\\n\\t  }\\n\\t  return url;\\n\\t}\\n\\texports.urlGenerate = urlGenerate;\\n\\t\\n\\t/**\\n\\t * Normalizes a path, or the path portion of a URL:\\n\\t *\\n\\t * - Replaces consecutive slashes with one slash.\\n\\t * - Removes unnecessary '.' parts.\\n\\t * - Removes unnecessary '<dir>/..' parts.\\n\\t *\\n\\t * Based on code in the Node.js 'path' core module.\\n\\t *\\n\\t * @param aPath The path or url to normalize.\\n\\t */\\n\\tfunction normalize(aPath) {\\n\\t  var path = aPath;\\n\\t  var url = urlParse(aPath);\\n\\t  if (url) {\\n\\t    if (!url.path) {\\n\\t      return aPath;\\n\\t    }\\n\\t    path = url.path;\\n\\t  }\\n\\t  var isAbsolute = exports.isAbsolute(path);\\n\\t\\n\\t  var parts = path.split(/\\\\/+/);\\n\\t  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\\n\\t    part = parts[i];\\n\\t    if (part === '.') {\\n\\t      parts.splice(i, 1);\\n\\t    } else if (part === '..') {\\n\\t      up++;\\n\\t    } else if (up > 0) {\\n\\t      if (part === '') {\\n\\t        // The first part is blank if the path is absolute. Trying to go\\n\\t        // above the root is a no-op. Therefore we can remove all '..' parts\\n\\t        // directly after the root.\\n\\t        parts.splice(i + 1, up);\\n\\t        up = 0;\\n\\t      } else {\\n\\t        parts.splice(i, 2);\\n\\t        up--;\\n\\t      }\\n\\t    }\\n\\t  }\\n\\t  path = parts.join('/');\\n\\t\\n\\t  if (path === '') {\\n\\t    path = isAbsolute ? '/' : '.';\\n\\t  }\\n\\t\\n\\t  if (url) {\\n\\t    url.path = path;\\n\\t    return urlGenerate(url);\\n\\t  }\\n\\t  return path;\\n\\t}\\n\\texports.normalize = normalize;\\n\\t\\n\\t/**\\n\\t * Joins two paths/URLs.\\n\\t *\\n\\t * @param aRoot The root path or URL.\\n\\t * @param aPath The path or URL to be joined with the root.\\n\\t *\\n\\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\\n\\t *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\\n\\t *   first.\\n\\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\\n\\t *   is updated with the result and aRoot is returned. Otherwise the result\\n\\t *   is returned.\\n\\t *   - If aPath is absolute, the result is aPath.\\n\\t *   - Otherwise the two paths are joined with a slash.\\n\\t * - Joining for example 'http://' and 'www.example.com' is also supported.\\n\\t */\\n\\tfunction join(aRoot, aPath) {\\n\\t  if (aRoot === \\\"\\\") {\\n\\t    aRoot = \\\".\\\";\\n\\t  }\\n\\t  if (aPath === \\\"\\\") {\\n\\t    aPath = \\\".\\\";\\n\\t  }\\n\\t  var aPathUrl = urlParse(aPath);\\n\\t  var aRootUrl = urlParse(aRoot);\\n\\t  if (aRootUrl) {\\n\\t    aRoot = aRootUrl.path || '/';\\n\\t  }\\n\\t\\n\\t  // `join(foo, '//www.example.org')`\\n\\t  if (aPathUrl && !aPathUrl.scheme) {\\n\\t    if (aRootUrl) {\\n\\t      aPathUrl.scheme = aRootUrl.scheme;\\n\\t    }\\n\\t    return urlGenerate(aPathUrl);\\n\\t  }\\n\\t\\n\\t  if (aPathUrl || aPath.match(dataUrlRegexp)) {\\n\\t    return aPath;\\n\\t  }\\n\\t\\n\\t  // `join('http://', 'www.example.com')`\\n\\t  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\\n\\t    aRootUrl.host = aPath;\\n\\t    return urlGenerate(aRootUrl);\\n\\t  }\\n\\t\\n\\t  var joined = aPath.charAt(0) === '/'\\n\\t    ? aPath\\n\\t    : normalize(aRoot.replace(/\\\\/+$/, '') + '/' + aPath);\\n\\t\\n\\t  if (aRootUrl) {\\n\\t    aRootUrl.path = joined;\\n\\t    return urlGenerate(aRootUrl);\\n\\t  }\\n\\t  return joined;\\n\\t}\\n\\texports.join = join;\\n\\t\\n\\texports.isAbsolute = function (aPath) {\\n\\t  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\\n\\t};\\n\\t\\n\\t/**\\n\\t * Make a path relative to a URL or another path.\\n\\t *\\n\\t * @param aRoot The root path or URL.\\n\\t * @param aPath The path or URL to be made relative to aRoot.\\n\\t */\\n\\tfunction relative(aRoot, aPath) {\\n\\t  if (aRoot === \\\"\\\") {\\n\\t    aRoot = \\\".\\\";\\n\\t  }\\n\\t\\n\\t  aRoot = aRoot.replace(/\\\\/$/, '');\\n\\t\\n\\t  // It is possible for the path to be above the root. In this case, simply\\n\\t  // checking whether the root is a prefix of the path won't work. Instead, we\\n\\t  // need to remove components from the root one by one, until either we find\\n\\t  // a prefix that fits, or we run out of components to remove.\\n\\t  var level = 0;\\n\\t  while (aPath.indexOf(aRoot + '/') !== 0) {\\n\\t    var index = aRoot.lastIndexOf(\\\"/\\\");\\n\\t    if (index < 0) {\\n\\t      return aPath;\\n\\t    }\\n\\t\\n\\t    // If the only part of the root that is left is the scheme (i.e. http://,\\n\\t    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\\n\\t    // have exhausted all components, so the path is not relative to the root.\\n\\t    aRoot = aRoot.slice(0, index);\\n\\t    if (aRoot.match(/^([^\\\\/]+:\\\\/)?\\\\/*$/)) {\\n\\t      return aPath;\\n\\t    }\\n\\t\\n\\t    ++level;\\n\\t  }\\n\\t\\n\\t  // Make sure we add a \\\"../\\\" for each component we removed from the root.\\n\\t  return Array(level + 1).join(\\\"../\\\") + aPath.substr(aRoot.length + 1);\\n\\t}\\n\\texports.relative = relative;\\n\\t\\n\\tvar supportsNullProto = (function () {\\n\\t  var obj = Object.create(null);\\n\\t  return !('__proto__' in obj);\\n\\t}());\\n\\t\\n\\tfunction identity (s) {\\n\\t  return s;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Because behavior goes wacky when you set `__proto__` on objects, we\\n\\t * have to prefix all the strings in our set with an arbitrary character.\\n\\t *\\n\\t * See https://github.com/mozilla/source-map/pull/31 and\\n\\t * https://github.com/mozilla/source-map/issues/30\\n\\t *\\n\\t * @param String aStr\\n\\t */\\n\\tfunction toSetString(aStr) {\\n\\t  if (isProtoString(aStr)) {\\n\\t    return '$' + aStr;\\n\\t  }\\n\\t\\n\\t  return aStr;\\n\\t}\\n\\texports.toSetString = supportsNullProto ? identity : toSetString;\\n\\t\\n\\tfunction fromSetString(aStr) {\\n\\t  if (isProtoString(aStr)) {\\n\\t    return aStr.slice(1);\\n\\t  }\\n\\t\\n\\t  return aStr;\\n\\t}\\n\\texports.fromSetString = supportsNullProto ? identity : fromSetString;\\n\\t\\n\\tfunction isProtoString(s) {\\n\\t  if (!s) {\\n\\t    return false;\\n\\t  }\\n\\t\\n\\t  var length = s.length;\\n\\t\\n\\t  if (length < 9 /* \\\"__proto__\\\".length */) {\\n\\t    return false;\\n\\t  }\\n\\t\\n\\t  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\\n\\t      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\\n\\t      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\\n\\t      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\\n\\t      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\\n\\t      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\\n\\t      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\\n\\t      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\\n\\t      s.charCodeAt(length - 9) !== 95  /* '_' */) {\\n\\t    return false;\\n\\t  }\\n\\t\\n\\t  for (var i = length - 10; i >= 0; i--) {\\n\\t    if (s.charCodeAt(i) !== 36 /* '$' */) {\\n\\t      return false;\\n\\t    }\\n\\t  }\\n\\t\\n\\t  return true;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Comparator between two mappings where the original positions are compared.\\n\\t *\\n\\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\\n\\t * mappings with the same original source/line/column, but different generated\\n\\t * line and column the same. Useful when searching for a mapping with a\\n\\t * stubbed out mapping.\\n\\t */\\n\\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\\n\\t  var cmp = strcmp(mappingA.source, mappingB.source);\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.originalLine - mappingB.originalLine;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\\n\\t  if (cmp !== 0 || onlyCompareOriginal) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.generatedLine - mappingB.generatedLine;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  return strcmp(mappingA.name, mappingB.name);\\n\\t}\\n\\texports.compareByOriginalPositions = compareByOriginalPositions;\\n\\t\\n\\t/**\\n\\t * Comparator between two mappings with deflated source and name indices where\\n\\t * the generated positions are compared.\\n\\t *\\n\\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\\n\\t * mappings with the same generated line and column, but different\\n\\t * source/name/original line and column the same. Useful when searching for a\\n\\t * mapping with a stubbed out mapping.\\n\\t */\\n\\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\\n\\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\\n\\t  if (cmp !== 0 || onlyCompareGenerated) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = strcmp(mappingA.source, mappingB.source);\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.originalLine - mappingB.originalLine;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  return strcmp(mappingA.name, mappingB.name);\\n\\t}\\n\\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\\n\\t\\n\\tfunction strcmp(aStr1, aStr2) {\\n\\t  if (aStr1 === aStr2) {\\n\\t    return 0;\\n\\t  }\\n\\t\\n\\t  if (aStr1 === null) {\\n\\t    return 1; // aStr2 !== null\\n\\t  }\\n\\t\\n\\t  if (aStr2 === null) {\\n\\t    return -1; // aStr1 !== null\\n\\t  }\\n\\t\\n\\t  if (aStr1 > aStr2) {\\n\\t    return 1;\\n\\t  }\\n\\t\\n\\t  return -1;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Comparator between two mappings with inflated source and name strings where\\n\\t * the generated positions are compared.\\n\\t */\\n\\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\\n\\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = strcmp(mappingA.source, mappingB.source);\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.originalLine - mappingB.originalLine;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\\n\\t  if (cmp !== 0) {\\n\\t    return cmp;\\n\\t  }\\n\\t\\n\\t  return strcmp(mappingA.name, mappingB.name);\\n\\t}\\n\\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\\n\\t\\n\\t/**\\n\\t * Strip any JSON XSSI avoidance prefix from the string (as documented\\n\\t * in the source maps specification), and then parse the string as\\n\\t * JSON.\\n\\t */\\n\\tfunction parseSourceMapInput(str) {\\n\\t  return JSON.parse(str.replace(/^\\\\)]}'[^\\\\n]*\\\\n/, ''));\\n\\t}\\n\\texports.parseSourceMapInput = parseSourceMapInput;\\n\\t\\n\\t/**\\n\\t * Compute the URL of a source given the the source root, the source's\\n\\t * URL, and the source map's URL.\\n\\t */\\n\\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\\n\\t  sourceURL = sourceURL || '';\\n\\t\\n\\t  if (sourceRoot) {\\n\\t    // This follows what Chrome does.\\n\\t    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\\n\\t      sourceRoot += '/';\\n\\t    }\\n\\t    // The spec says:\\n\\t    //   Line 4: An optional source root, useful for relocating source\\n\\t    //   files on a server or removing repeated values in the\\n\\t    //   “sources” entry.  This value is prepended to the individual\\n\\t    //   entries in the “source” field.\\n\\t    sourceURL = sourceRoot + sourceURL;\\n\\t  }\\n\\t\\n\\t  // Historically, SourceMapConsumer did not take the sourceMapURL as\\n\\t  // a parameter.  This mode is still somewhat supported, which is why\\n\\t  // this code block is conditional.  However, it's preferable to pass\\n\\t  // the source map URL to SourceMapConsumer, so that this function\\n\\t  // can implement the source URL resolution algorithm as outlined in\\n\\t  // the spec.  This block is basically the equivalent of:\\n\\t  //    new URL(sourceURL, sourceMapURL).toString()\\n\\t  // ... except it avoids using URL, which wasn't available in the\\n\\t  // older releases of node still supported by this library.\\n\\t  //\\n\\t  // The spec says:\\n\\t  //   If the sources are not absolute URLs after prepending of the\\n\\t  //   “sourceRoot”, the sources are resolved relative to the\\n\\t  //   SourceMap (like resolving script src in a html document).\\n\\t  if (sourceMapURL) {\\n\\t    var parsed = urlParse(sourceMapURL);\\n\\t    if (!parsed) {\\n\\t      throw new Error(\\\"sourceMapURL could not be parsed\\\");\\n\\t    }\\n\\t    if (parsed.path) {\\n\\t      // Strip the last path component, but keep the \\\"/\\\".\\n\\t      var index = parsed.path.lastIndexOf('/');\\n\\t      if (index >= 0) {\\n\\t        parsed.path = parsed.path.substring(0, index + 1);\\n\\t      }\\n\\t    }\\n\\t    sourceURL = join(urlGenerate(parsed), sourceURL);\\n\\t  }\\n\\t\\n\\t  return normalize(sourceURL);\\n\\t}\\n\\texports.computeSourceURL = computeSourceURL;\\n\\n\\n/***/ }),\\n/* 5 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\tvar util = __webpack_require__(4);\\n\\tvar has = Object.prototype.hasOwnProperty;\\n\\tvar hasNativeMap = typeof Map !== \\\"undefined\\\";\\n\\t\\n\\t/**\\n\\t * A data structure which is a combination of an array and a set. Adding a new\\n\\t * member is O(1), testing for membership is O(1), and finding the index of an\\n\\t * element is O(1). Removing elements from the set is not supported. Only\\n\\t * strings are supported for membership.\\n\\t */\\n\\tfunction ArraySet() {\\n\\t  this._array = [];\\n\\t  this._set = hasNativeMap ? new Map() : Object.create(null);\\n\\t}\\n\\t\\n\\t/**\\n\\t * Static method for creating ArraySet instances from an existing array.\\n\\t */\\n\\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\\n\\t  var set = new ArraySet();\\n\\t  for (var i = 0, len = aArray.length; i < len; i++) {\\n\\t    set.add(aArray[i], aAllowDuplicates);\\n\\t  }\\n\\t  return set;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Return how many unique items are in this ArraySet. If duplicates have been\\n\\t * added, than those do not count towards the size.\\n\\t *\\n\\t * @returns Number\\n\\t */\\n\\tArraySet.prototype.size = function ArraySet_size() {\\n\\t  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Add the given string to this set.\\n\\t *\\n\\t * @param String aStr\\n\\t */\\n\\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\\n\\t  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\\n\\t  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\\n\\t  var idx = this._array.length;\\n\\t  if (!isDuplicate || aAllowDuplicates) {\\n\\t    this._array.push(aStr);\\n\\t  }\\n\\t  if (!isDuplicate) {\\n\\t    if (hasNativeMap) {\\n\\t      this._set.set(aStr, idx);\\n\\t    } else {\\n\\t      this._set[sStr] = idx;\\n\\t    }\\n\\t  }\\n\\t};\\n\\t\\n\\t/**\\n\\t * Is the given string a member of this set?\\n\\t *\\n\\t * @param String aStr\\n\\t */\\n\\tArraySet.prototype.has = function ArraySet_has(aStr) {\\n\\t  if (hasNativeMap) {\\n\\t    return this._set.has(aStr);\\n\\t  } else {\\n\\t    var sStr = util.toSetString(aStr);\\n\\t    return has.call(this._set, sStr);\\n\\t  }\\n\\t};\\n\\t\\n\\t/**\\n\\t * What is the index of the given string in the array?\\n\\t *\\n\\t * @param String aStr\\n\\t */\\n\\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\\n\\t  if (hasNativeMap) {\\n\\t    var idx = this._set.get(aStr);\\n\\t    if (idx >= 0) {\\n\\t        return idx;\\n\\t    }\\n\\t  } else {\\n\\t    var sStr = util.toSetString(aStr);\\n\\t    if (has.call(this._set, sStr)) {\\n\\t      return this._set[sStr];\\n\\t    }\\n\\t  }\\n\\t\\n\\t  throw new Error('\\\"' + aStr + '\\\" is not in the set.');\\n\\t};\\n\\t\\n\\t/**\\n\\t * What is the element at the given index?\\n\\t *\\n\\t * @param Number aIdx\\n\\t */\\n\\tArraySet.prototype.at = function ArraySet_at(aIdx) {\\n\\t  if (aIdx >= 0 && aIdx < this._array.length) {\\n\\t    return this._array[aIdx];\\n\\t  }\\n\\t  throw new Error('No element indexed by ' + aIdx);\\n\\t};\\n\\t\\n\\t/**\\n\\t * Returns the array representation of this set (which has the proper indices\\n\\t * indicated by indexOf). Note that this is a copy of the internal array used\\n\\t * for storing the members so that no one can mess with internal state.\\n\\t */\\n\\tArraySet.prototype.toArray = function ArraySet_toArray() {\\n\\t  return this._array.slice();\\n\\t};\\n\\t\\n\\texports.ArraySet = ArraySet;\\n\\n\\n/***/ }),\\n/* 6 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2014 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\tvar util = __webpack_require__(4);\\n\\t\\n\\t/**\\n\\t * Determine whether mappingB is after mappingA with respect to generated\\n\\t * position.\\n\\t */\\n\\tfunction generatedPositionAfter(mappingA, mappingB) {\\n\\t  // Optimized for most common case\\n\\t  var lineA = mappingA.generatedLine;\\n\\t  var lineB = mappingB.generatedLine;\\n\\t  var columnA = mappingA.generatedColumn;\\n\\t  var columnB = mappingB.generatedColumn;\\n\\t  return lineB > lineA || lineB == lineA && columnB >= columnA ||\\n\\t         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\\n\\t}\\n\\t\\n\\t/**\\n\\t * A data structure to provide a sorted view of accumulated mappings in a\\n\\t * performance conscious manner. It trades a neglibable overhead in general\\n\\t * case for a large speedup in case of mappings being added in order.\\n\\t */\\n\\tfunction MappingList() {\\n\\t  this._array = [];\\n\\t  this._sorted = true;\\n\\t  // Serves as infimum\\n\\t  this._last = {generatedLine: -1, generatedColumn: 0};\\n\\t}\\n\\t\\n\\t/**\\n\\t * Iterate through internal items. This method takes the same arguments that\\n\\t * `Array.prototype.forEach` takes.\\n\\t *\\n\\t * NOTE: The order of the mappings is NOT guaranteed.\\n\\t */\\n\\tMappingList.prototype.unsortedForEach =\\n\\t  function MappingList_forEach(aCallback, aThisArg) {\\n\\t    this._array.forEach(aCallback, aThisArg);\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Add the given source mapping.\\n\\t *\\n\\t * @param Object aMapping\\n\\t */\\n\\tMappingList.prototype.add = function MappingList_add(aMapping) {\\n\\t  if (generatedPositionAfter(this._last, aMapping)) {\\n\\t    this._last = aMapping;\\n\\t    this._array.push(aMapping);\\n\\t  } else {\\n\\t    this._sorted = false;\\n\\t    this._array.push(aMapping);\\n\\t  }\\n\\t};\\n\\t\\n\\t/**\\n\\t * Returns the flat, sorted array of mappings. The mappings are sorted by\\n\\t * generated position.\\n\\t *\\n\\t * WARNING: This method returns internal data without copying, for\\n\\t * performance. The return value must NOT be mutated, and should be treated as\\n\\t * an immutable borrow. If you want to take ownership, you must make your own\\n\\t * copy.\\n\\t */\\n\\tMappingList.prototype.toArray = function MappingList_toArray() {\\n\\t  if (!this._sorted) {\\n\\t    this._array.sort(util.compareByGeneratedPositionsInflated);\\n\\t    this._sorted = true;\\n\\t  }\\n\\t  return this._array;\\n\\t};\\n\\t\\n\\texports.MappingList = MappingList;\\n\\n\\n/***/ }),\\n/* 7 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\tvar util = __webpack_require__(4);\\n\\tvar binarySearch = __webpack_require__(8);\\n\\tvar ArraySet = __webpack_require__(5).ArraySet;\\n\\tvar base64VLQ = __webpack_require__(2);\\n\\tvar quickSort = __webpack_require__(9).quickSort;\\n\\t\\n\\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\\n\\t  var sourceMap = aSourceMap;\\n\\t  if (typeof aSourceMap === 'string') {\\n\\t    sourceMap = util.parseSourceMapInput(aSourceMap);\\n\\t  }\\n\\t\\n\\t  return sourceMap.sections != null\\n\\t    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\\n\\t    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\\n\\t}\\n\\t\\n\\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\\n\\t  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\\n\\t}\\n\\t\\n\\t/**\\n\\t * The version of the source mapping spec that we are consuming.\\n\\t */\\n\\tSourceMapConsumer.prototype._version = 3;\\n\\t\\n\\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\\n\\t// parsed mapping coordinates from the source map's \\\"mappings\\\" attribute. They\\n\\t// are lazily instantiated, accessed via the `_generatedMappings` and\\n\\t// `_originalMappings` getters respectively, and we only parse the mappings\\n\\t// and create these arrays once queried for a source location. We jump through\\n\\t// these hoops because there can be many thousands of mappings, and parsing\\n\\t// them is expensive, so we only want to do it if we must.\\n\\t//\\n\\t// Each object in the arrays is of the form:\\n\\t//\\n\\t//     {\\n\\t//       generatedLine: The line number in the generated code,\\n\\t//       generatedColumn: The column number in the generated code,\\n\\t//       source: The path to the original source file that generated this\\n\\t//               chunk of code,\\n\\t//       originalLine: The line number in the original source that\\n\\t//                     corresponds to this chunk of generated code,\\n\\t//       originalColumn: The column number in the original source that\\n\\t//                       corresponds to this chunk of generated code,\\n\\t//       name: The name of the original symbol which generated this chunk of\\n\\t//             code.\\n\\t//     }\\n\\t//\\n\\t// All properties except for `generatedLine` and `generatedColumn` can be\\n\\t// `null`.\\n\\t//\\n\\t// `_generatedMappings` is ordered by the generated positions.\\n\\t//\\n\\t// `_originalMappings` is ordered by the original positions.\\n\\t\\n\\tSourceMapConsumer.prototype.__generatedMappings = null;\\n\\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\\n\\t  configurable: true,\\n\\t  enumerable: true,\\n\\t  get: function () {\\n\\t    if (!this.__generatedMappings) {\\n\\t      this._parseMappings(this._mappings, this.sourceRoot);\\n\\t    }\\n\\t\\n\\t    return this.__generatedMappings;\\n\\t  }\\n\\t});\\n\\t\\n\\tSourceMapConsumer.prototype.__originalMappings = null;\\n\\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\\n\\t  configurable: true,\\n\\t  enumerable: true,\\n\\t  get: function () {\\n\\t    if (!this.__originalMappings) {\\n\\t      this._parseMappings(this._mappings, this.sourceRoot);\\n\\t    }\\n\\t\\n\\t    return this.__originalMappings;\\n\\t  }\\n\\t});\\n\\t\\n\\tSourceMapConsumer.prototype._charIsMappingSeparator =\\n\\t  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\\n\\t    var c = aStr.charAt(index);\\n\\t    return c === \\\";\\\" || c === \\\",\\\";\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Parse the mappings in a string in to a data structure which we can easily\\n\\t * query (the ordered arrays in the `this.__generatedMappings` and\\n\\t * `this.__originalMappings` properties).\\n\\t */\\n\\tSourceMapConsumer.prototype._parseMappings =\\n\\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\\n\\t    throw new Error(\\\"Subclasses must implement _parseMappings\\\");\\n\\t  };\\n\\t\\n\\tSourceMapConsumer.GENERATED_ORDER = 1;\\n\\tSourceMapConsumer.ORIGINAL_ORDER = 2;\\n\\t\\n\\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\\n\\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\\n\\t\\n\\t/**\\n\\t * Iterate over each mapping between an original source/line/column and a\\n\\t * generated line/column in this source map.\\n\\t *\\n\\t * @param Function aCallback\\n\\t *        The function that is called with each mapping.\\n\\t * @param Object aContext\\n\\t *        Optional. If specified, this object will be the value of `this` every\\n\\t *        time that `aCallback` is called.\\n\\t * @param aOrder\\n\\t *        Either `SourceMapConsumer.GENERATED_ORDER` or\\n\\t *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\\n\\t *        iterate over the mappings sorted by the generated file's line/column\\n\\t *        order or the original's source/line/column order, respectively. Defaults to\\n\\t *        `SourceMapConsumer.GENERATED_ORDER`.\\n\\t */\\n\\tSourceMapConsumer.prototype.eachMapping =\\n\\t  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\\n\\t    var context = aContext || null;\\n\\t    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\\n\\t\\n\\t    var mappings;\\n\\t    switch (order) {\\n\\t    case SourceMapConsumer.GENERATED_ORDER:\\n\\t      mappings = this._generatedMappings;\\n\\t      break;\\n\\t    case SourceMapConsumer.ORIGINAL_ORDER:\\n\\t      mappings = this._originalMappings;\\n\\t      break;\\n\\t    default:\\n\\t      throw new Error(\\\"Unknown order of iteration.\\\");\\n\\t    }\\n\\t\\n\\t    var sourceRoot = this.sourceRoot;\\n\\t    mappings.map(function (mapping) {\\n\\t      var source = mapping.source === null ? null : this._sources.at(mapping.source);\\n\\t      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\\n\\t      return {\\n\\t        source: source,\\n\\t        generatedLine: mapping.generatedLine,\\n\\t        generatedColumn: mapping.generatedColumn,\\n\\t        originalLine: mapping.originalLine,\\n\\t        originalColumn: mapping.originalColumn,\\n\\t        name: mapping.name === null ? null : this._names.at(mapping.name)\\n\\t      };\\n\\t    }, this).forEach(aCallback, context);\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Returns all generated line and column information for the original source,\\n\\t * line, and column provided. If no column is provided, returns all mappings\\n\\t * corresponding to a either the line we are searching for or the next\\n\\t * closest line that has any mappings. Otherwise, returns all mappings\\n\\t * corresponding to the given line and either the column we are searching for\\n\\t * or the next closest column that has any offsets.\\n\\t *\\n\\t * The only argument is an object with the following properties:\\n\\t *\\n\\t *   - source: The filename of the original source.\\n\\t *   - line: The line number in the original source.  The line number is 1-based.\\n\\t *   - column: Optional. the column number in the original source.\\n\\t *    The column number is 0-based.\\n\\t *\\n\\t * and an array of objects is returned, each with the following properties:\\n\\t *\\n\\t *   - line: The line number in the generated source, or null.  The\\n\\t *    line number is 1-based.\\n\\t *   - column: The column number in the generated source, or null.\\n\\t *    The column number is 0-based.\\n\\t */\\n\\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\\n\\t  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\\n\\t    var line = util.getArg(aArgs, 'line');\\n\\t\\n\\t    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\\n\\t    // returns the index of the closest mapping less than the needle. By\\n\\t    // setting needle.originalColumn to 0, we thus find the last mapping for\\n\\t    // the given line, provided such a mapping exists.\\n\\t    var needle = {\\n\\t      source: util.getArg(aArgs, 'source'),\\n\\t      originalLine: line,\\n\\t      originalColumn: util.getArg(aArgs, 'column', 0)\\n\\t    };\\n\\t\\n\\t    needle.source = this._findSourceIndex(needle.source);\\n\\t    if (needle.source < 0) {\\n\\t      return [];\\n\\t    }\\n\\t\\n\\t    var mappings = [];\\n\\t\\n\\t    var index = this._findMapping(needle,\\n\\t                                  this._originalMappings,\\n\\t                                  \\\"originalLine\\\",\\n\\t                                  \\\"originalColumn\\\",\\n\\t                                  util.compareByOriginalPositions,\\n\\t                                  binarySearch.LEAST_UPPER_BOUND);\\n\\t    if (index >= 0) {\\n\\t      var mapping = this._originalMappings[index];\\n\\t\\n\\t      if (aArgs.column === undefined) {\\n\\t        var originalLine = mapping.originalLine;\\n\\t\\n\\t        // Iterate until either we run out of mappings, or we run into\\n\\t        // a mapping for a different line than the one we found. Since\\n\\t        // mappings are sorted, this is guaranteed to find all mappings for\\n\\t        // the line we found.\\n\\t        while (mapping && mapping.originalLine === originalLine) {\\n\\t          mappings.push({\\n\\t            line: util.getArg(mapping, 'generatedLine', null),\\n\\t            column: util.getArg(mapping, 'generatedColumn', null),\\n\\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\\n\\t          });\\n\\t\\n\\t          mapping = this._originalMappings[++index];\\n\\t        }\\n\\t      } else {\\n\\t        var originalColumn = mapping.originalColumn;\\n\\t\\n\\t        // Iterate until either we run out of mappings, or we run into\\n\\t        // a mapping for a different line than the one we were searching for.\\n\\t        // Since mappings are sorted, this is guaranteed to find all mappings for\\n\\t        // the line we are searching for.\\n\\t        while (mapping &&\\n\\t               mapping.originalLine === line &&\\n\\t               mapping.originalColumn == originalColumn) {\\n\\t          mappings.push({\\n\\t            line: util.getArg(mapping, 'generatedLine', null),\\n\\t            column: util.getArg(mapping, 'generatedColumn', null),\\n\\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\\n\\t          });\\n\\t\\n\\t          mapping = this._originalMappings[++index];\\n\\t        }\\n\\t      }\\n\\t    }\\n\\t\\n\\t    return mappings;\\n\\t  };\\n\\t\\n\\texports.SourceMapConsumer = SourceMapConsumer;\\n\\t\\n\\t/**\\n\\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\\n\\t * query for information about the original file positions by giving it a file\\n\\t * position in the generated source.\\n\\t *\\n\\t * The first parameter is the raw source map (either as a JSON string, or\\n\\t * already parsed to an object). According to the spec, source maps have the\\n\\t * following attributes:\\n\\t *\\n\\t *   - version: Which version of the source map spec this map is following.\\n\\t *   - sources: An array of URLs to the original source files.\\n\\t *   - names: An array of identifiers which can be referrenced by individual mappings.\\n\\t *   - sourceRoot: Optional. The URL root from which all sources are relative.\\n\\t *   - sourcesContent: Optional. An array of contents of the original source files.\\n\\t *   - mappings: A string of base64 VLQs which contain the actual mappings.\\n\\t *   - file: Optional. The generated file this source map is associated with.\\n\\t *\\n\\t * Here is an example source map, taken from the source map spec[0]:\\n\\t *\\n\\t *     {\\n\\t *       version : 3,\\n\\t *       file: \\\"out.js\\\",\\n\\t *       sourceRoot : \\\"\\\",\\n\\t *       sources: [\\\"foo.js\\\", \\\"bar.js\\\"],\\n\\t *       names: [\\\"src\\\", \\\"maps\\\", \\\"are\\\", \\\"fun\\\"],\\n\\t *       mappings: \\\"AA,AB;;ABCDE;\\\"\\n\\t *     }\\n\\t *\\n\\t * The second parameter, if given, is a string whose value is the URL\\n\\t * at which the source map was found.  This URL is used to compute the\\n\\t * sources array.\\n\\t *\\n\\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\\n\\t */\\n\\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\\n\\t  var sourceMap = aSourceMap;\\n\\t  if (typeof aSourceMap === 'string') {\\n\\t    sourceMap = util.parseSourceMapInput(aSourceMap);\\n\\t  }\\n\\t\\n\\t  var version = util.getArg(sourceMap, 'version');\\n\\t  var sources = util.getArg(sourceMap, 'sources');\\n\\t  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\\n\\t  // requires the array) to play nice here.\\n\\t  var names = util.getArg(sourceMap, 'names', []);\\n\\t  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\\n\\t  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\\n\\t  var mappings = util.getArg(sourceMap, 'mappings');\\n\\t  var file = util.getArg(sourceMap, 'file', null);\\n\\t\\n\\t  // Once again, Sass deviates from the spec and supplies the version as a\\n\\t  // string rather than a number, so we use loose equality checking here.\\n\\t  if (version != this._version) {\\n\\t    throw new Error('Unsupported version: ' + version);\\n\\t  }\\n\\t\\n\\t  if (sourceRoot) {\\n\\t    sourceRoot = util.normalize(sourceRoot);\\n\\t  }\\n\\t\\n\\t  sources = sources\\n\\t    .map(String)\\n\\t    // Some source maps produce relative source paths like \\\"./foo.js\\\" instead of\\n\\t    // \\\"foo.js\\\".  Normalize these first so that future comparisons will succeed.\\n\\t    // See bugzil.la/1090768.\\n\\t    .map(util.normalize)\\n\\t    // Always ensure that absolute sources are internally stored relative to\\n\\t    // the source root, if the source root is absolute. Not doing this would\\n\\t    // be particularly problematic when the source root is a prefix of the\\n\\t    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\\n\\t    .map(function (source) {\\n\\t      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\\n\\t        ? util.relative(sourceRoot, source)\\n\\t        : source;\\n\\t    });\\n\\t\\n\\t  // Pass `true` below to allow duplicate names and sources. While source maps\\n\\t  // are intended to be compressed and deduplicated, the TypeScript compiler\\n\\t  // sometimes generates source maps with duplicates in them. See Github issue\\n\\t  // #72 and bugzil.la/889492.\\n\\t  this._names = ArraySet.fromArray(names.map(String), true);\\n\\t  this._sources = ArraySet.fromArray(sources, true);\\n\\t\\n\\t  this._absoluteSources = this._sources.toArray().map(function (s) {\\n\\t    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\\n\\t  });\\n\\t\\n\\t  this.sourceRoot = sourceRoot;\\n\\t  this.sourcesContent = sourcesContent;\\n\\t  this._mappings = mappings;\\n\\t  this._sourceMapURL = aSourceMapURL;\\n\\t  this.file = file;\\n\\t}\\n\\t\\n\\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\\n\\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\\n\\t\\n\\t/**\\n\\t * Utility function to find the index of a source.  Returns -1 if not\\n\\t * found.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\\n\\t  var relativeSource = aSource;\\n\\t  if (this.sourceRoot != null) {\\n\\t    relativeSource = util.relative(this.sourceRoot, relativeSource);\\n\\t  }\\n\\t\\n\\t  if (this._sources.has(relativeSource)) {\\n\\t    return this._sources.indexOf(relativeSource);\\n\\t  }\\n\\t\\n\\t  // Maybe aSource is an absolute URL as returned by |sources|.  In\\n\\t  // this case we can't simply undo the transform.\\n\\t  var i;\\n\\t  for (i = 0; i < this._absoluteSources.length; ++i) {\\n\\t    if (this._absoluteSources[i] == aSource) {\\n\\t      return i;\\n\\t    }\\n\\t  }\\n\\t\\n\\t  return -1;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\\n\\t *\\n\\t * @param SourceMapGenerator aSourceMap\\n\\t *        The source map that will be consumed.\\n\\t * @param String aSourceMapURL\\n\\t *        The URL at which the source map can be found (optional)\\n\\t * @returns BasicSourceMapConsumer\\n\\t */\\n\\tBasicSourceMapConsumer.fromSourceMap =\\n\\t  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\\n\\t    var smc = Object.create(BasicSourceMapConsumer.prototype);\\n\\t\\n\\t    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\\n\\t    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\\n\\t    smc.sourceRoot = aSourceMap._sourceRoot;\\n\\t    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\\n\\t                                                            smc.sourceRoot);\\n\\t    smc.file = aSourceMap._file;\\n\\t    smc._sourceMapURL = aSourceMapURL;\\n\\t    smc._absoluteSources = smc._sources.toArray().map(function (s) {\\n\\t      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\\n\\t    });\\n\\t\\n\\t    // Because we are modifying the entries (by converting string sources and\\n\\t    // names to indices into the sources and names ArraySets), we have to make\\n\\t    // a copy of the entry or else bad things happen. Shared mutable state\\n\\t    // strikes again! See github issue #191.\\n\\t\\n\\t    var generatedMappings = aSourceMap._mappings.toArray().slice();\\n\\t    var destGeneratedMappings = smc.__generatedMappings = [];\\n\\t    var destOriginalMappings = smc.__originalMappings = [];\\n\\t\\n\\t    for (var i = 0, length = generatedMappings.length; i < length; i++) {\\n\\t      var srcMapping = generatedMappings[i];\\n\\t      var destMapping = new Mapping;\\n\\t      destMapping.generatedLine = srcMapping.generatedLine;\\n\\t      destMapping.generatedColumn = srcMapping.generatedColumn;\\n\\t\\n\\t      if (srcMapping.source) {\\n\\t        destMapping.source = sources.indexOf(srcMapping.source);\\n\\t        destMapping.originalLine = srcMapping.originalLine;\\n\\t        destMapping.originalColumn = srcMapping.originalColumn;\\n\\t\\n\\t        if (srcMapping.name) {\\n\\t          destMapping.name = names.indexOf(srcMapping.name);\\n\\t        }\\n\\t\\n\\t        destOriginalMappings.push(destMapping);\\n\\t      }\\n\\t\\n\\t      destGeneratedMappings.push(destMapping);\\n\\t    }\\n\\t\\n\\t    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\\n\\t\\n\\t    return smc;\\n\\t  };\\n\\t\\n\\t/**\\n\\t * The version of the source mapping spec that we are consuming.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype._version = 3;\\n\\t\\n\\t/**\\n\\t * The list of original sources.\\n\\t */\\n\\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\\n\\t  get: function () {\\n\\t    return this._absoluteSources.slice();\\n\\t  }\\n\\t});\\n\\t\\n\\t/**\\n\\t * Provide the JIT with a nice shape / hidden class.\\n\\t */\\n\\tfunction Mapping() {\\n\\t  this.generatedLine = 0;\\n\\t  this.generatedColumn = 0;\\n\\t  this.source = null;\\n\\t  this.originalLine = null;\\n\\t  this.originalColumn = null;\\n\\t  this.name = null;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Parse the mappings in a string in to a data structure which we can easily\\n\\t * query (the ordered arrays in the `this.__generatedMappings` and\\n\\t * `this.__originalMappings` properties).\\n\\t */\\n\\tBasicSourceMapConsumer.prototype._parseMappings =\\n\\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\\n\\t    var generatedLine = 1;\\n\\t    var previousGeneratedColumn = 0;\\n\\t    var previousOriginalLine = 0;\\n\\t    var previousOriginalColumn = 0;\\n\\t    var previousSource = 0;\\n\\t    var previousName = 0;\\n\\t    var length = aStr.length;\\n\\t    var index = 0;\\n\\t    var cachedSegments = {};\\n\\t    var temp = {};\\n\\t    var originalMappings = [];\\n\\t    var generatedMappings = [];\\n\\t    var mapping, str, segment, end, value;\\n\\t\\n\\t    while (index < length) {\\n\\t      if (aStr.charAt(index) === ';') {\\n\\t        generatedLine++;\\n\\t        index++;\\n\\t        previousGeneratedColumn = 0;\\n\\t      }\\n\\t      else if (aStr.charAt(index) === ',') {\\n\\t        index++;\\n\\t      }\\n\\t      else {\\n\\t        mapping = new Mapping();\\n\\t        mapping.generatedLine = generatedLine;\\n\\t\\n\\t        // Because each offset is encoded relative to the previous one,\\n\\t        // many segments often have the same encoding. We can exploit this\\n\\t        // fact by caching the parsed variable length fields of each segment,\\n\\t        // allowing us to avoid a second parse if we encounter the same\\n\\t        // segment again.\\n\\t        for (end = index; end < length; end++) {\\n\\t          if (this._charIsMappingSeparator(aStr, end)) {\\n\\t            break;\\n\\t          }\\n\\t        }\\n\\t        str = aStr.slice(index, end);\\n\\t\\n\\t        segment = cachedSegments[str];\\n\\t        if (segment) {\\n\\t          index += str.length;\\n\\t        } else {\\n\\t          segment = [];\\n\\t          while (index < end) {\\n\\t            base64VLQ.decode(aStr, index, temp);\\n\\t            value = temp.value;\\n\\t            index = temp.rest;\\n\\t            segment.push(value);\\n\\t          }\\n\\t\\n\\t          if (segment.length === 2) {\\n\\t            throw new Error('Found a source, but no line and column');\\n\\t          }\\n\\t\\n\\t          if (segment.length === 3) {\\n\\t            throw new Error('Found a source and line, but no column');\\n\\t          }\\n\\t\\n\\t          cachedSegments[str] = segment;\\n\\t        }\\n\\t\\n\\t        // Generated column.\\n\\t        mapping.generatedColumn = previousGeneratedColumn + segment[0];\\n\\t        previousGeneratedColumn = mapping.generatedColumn;\\n\\t\\n\\t        if (segment.length > 1) {\\n\\t          // Original source.\\n\\t          mapping.source = previousSource + segment[1];\\n\\t          previousSource += segment[1];\\n\\t\\n\\t          // Original line.\\n\\t          mapping.originalLine = previousOriginalLine + segment[2];\\n\\t          previousOriginalLine = mapping.originalLine;\\n\\t          // Lines are stored 0-based\\n\\t          mapping.originalLine += 1;\\n\\t\\n\\t          // Original column.\\n\\t          mapping.originalColumn = previousOriginalColumn + segment[3];\\n\\t          previousOriginalColumn = mapping.originalColumn;\\n\\t\\n\\t          if (segment.length > 4) {\\n\\t            // Original name.\\n\\t            mapping.name = previousName + segment[4];\\n\\t            previousName += segment[4];\\n\\t          }\\n\\t        }\\n\\t\\n\\t        generatedMappings.push(mapping);\\n\\t        if (typeof mapping.originalLine === 'number') {\\n\\t          originalMappings.push(mapping);\\n\\t        }\\n\\t      }\\n\\t    }\\n\\t\\n\\t    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\\n\\t    this.__generatedMappings = generatedMappings;\\n\\t\\n\\t    quickSort(originalMappings, util.compareByOriginalPositions);\\n\\t    this.__originalMappings = originalMappings;\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Find the mapping that best matches the hypothetical \\\"needle\\\" mapping that\\n\\t * we are searching for in the given \\\"haystack\\\" of mappings.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype._findMapping =\\n\\t  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\\n\\t                                         aColumnName, aComparator, aBias) {\\n\\t    // To return the position we are searching for, we must first find the\\n\\t    // mapping for the given position and then return the opposite position it\\n\\t    // points to. Because the mappings are sorted, we can use binary search to\\n\\t    // find the best mapping.\\n\\t\\n\\t    if (aNeedle[aLineName] <= 0) {\\n\\t      throw new TypeError('Line must be greater than or equal to 1, got '\\n\\t                          + aNeedle[aLineName]);\\n\\t    }\\n\\t    if (aNeedle[aColumnName] < 0) {\\n\\t      throw new TypeError('Column must be greater than or equal to 0, got '\\n\\t                          + aNeedle[aColumnName]);\\n\\t    }\\n\\t\\n\\t    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Compute the last column for each generated mapping. The last column is\\n\\t * inclusive.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype.computeColumnSpans =\\n\\t  function SourceMapConsumer_computeColumnSpans() {\\n\\t    for (var index = 0; index < this._generatedMappings.length; ++index) {\\n\\t      var mapping = this._generatedMappings[index];\\n\\t\\n\\t      // Mappings do not contain a field for the last generated columnt. We\\n\\t      // can come up with an optimistic estimate, however, by assuming that\\n\\t      // mappings are contiguous (i.e. given two consecutive mappings, the\\n\\t      // first mapping ends where the second one starts).\\n\\t      if (index + 1 < this._generatedMappings.length) {\\n\\t        var nextMapping = this._generatedMappings[index + 1];\\n\\t\\n\\t        if (mapping.generatedLine === nextMapping.generatedLine) {\\n\\t          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\\n\\t          continue;\\n\\t        }\\n\\t      }\\n\\t\\n\\t      // The last mapping for each line spans the entire line.\\n\\t      mapping.lastGeneratedColumn = Infinity;\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Returns the original source, line, and column information for the generated\\n\\t * source's line and column positions provided. The only argument is an object\\n\\t * with the following properties:\\n\\t *\\n\\t *   - line: The line number in the generated source.  The line number\\n\\t *     is 1-based.\\n\\t *   - column: The column number in the generated source.  The column\\n\\t *     number is 0-based.\\n\\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\\n\\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\\n\\t *     closest element that is smaller than or greater than the one we are\\n\\t *     searching for, respectively, if the exact element cannot be found.\\n\\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\\n\\t *\\n\\t * and an object is returned with the following properties:\\n\\t *\\n\\t *   - source: The original source file, or null.\\n\\t *   - line: The line number in the original source, or null.  The\\n\\t *     line number is 1-based.\\n\\t *   - column: The column number in the original source, or null.  The\\n\\t *     column number is 0-based.\\n\\t *   - name: The original identifier, or null.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype.originalPositionFor =\\n\\t  function SourceMapConsumer_originalPositionFor(aArgs) {\\n\\t    var needle = {\\n\\t      generatedLine: util.getArg(aArgs, 'line'),\\n\\t      generatedColumn: util.getArg(aArgs, 'column')\\n\\t    };\\n\\t\\n\\t    var index = this._findMapping(\\n\\t      needle,\\n\\t      this._generatedMappings,\\n\\t      \\\"generatedLine\\\",\\n\\t      \\\"generatedColumn\\\",\\n\\t      util.compareByGeneratedPositionsDeflated,\\n\\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\\n\\t    );\\n\\t\\n\\t    if (index >= 0) {\\n\\t      var mapping = this._generatedMappings[index];\\n\\t\\n\\t      if (mapping.generatedLine === needle.generatedLine) {\\n\\t        var source = util.getArg(mapping, 'source', null);\\n\\t        if (source !== null) {\\n\\t          source = this._sources.at(source);\\n\\t          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\\n\\t        }\\n\\t        var name = util.getArg(mapping, 'name', null);\\n\\t        if (name !== null) {\\n\\t          name = this._names.at(name);\\n\\t        }\\n\\t        return {\\n\\t          source: source,\\n\\t          line: util.getArg(mapping, 'originalLine', null),\\n\\t          column: util.getArg(mapping, 'originalColumn', null),\\n\\t          name: name\\n\\t        };\\n\\t      }\\n\\t    }\\n\\t\\n\\t    return {\\n\\t      source: null,\\n\\t      line: null,\\n\\t      column: null,\\n\\t      name: null\\n\\t    };\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Return true if we have the source content for every source in the source\\n\\t * map, false otherwise.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\\n\\t  function BasicSourceMapConsumer_hasContentsOfAllSources() {\\n\\t    if (!this.sourcesContent) {\\n\\t      return false;\\n\\t    }\\n\\t    return this.sourcesContent.length >= this._sources.size() &&\\n\\t      !this.sourcesContent.some(function (sc) { return sc == null; });\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Returns the original source content. The only argument is the url of the\\n\\t * original source file. Returns null if no original source content is\\n\\t * available.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype.sourceContentFor =\\n\\t  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\\n\\t    if (!this.sourcesContent) {\\n\\t      return null;\\n\\t    }\\n\\t\\n\\t    var index = this._findSourceIndex(aSource);\\n\\t    if (index >= 0) {\\n\\t      return this.sourcesContent[index];\\n\\t    }\\n\\t\\n\\t    var relativeSource = aSource;\\n\\t    if (this.sourceRoot != null) {\\n\\t      relativeSource = util.relative(this.sourceRoot, relativeSource);\\n\\t    }\\n\\t\\n\\t    var url;\\n\\t    if (this.sourceRoot != null\\n\\t        && (url = util.urlParse(this.sourceRoot))) {\\n\\t      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\\n\\t      // many users. We can help them out when they expect file:// URIs to\\n\\t      // behave like it would if they were running a local HTTP server. See\\n\\t      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\\n\\t      var fileUriAbsPath = relativeSource.replace(/^file:\\\\/\\\\//, \\\"\\\");\\n\\t      if (url.scheme == \\\"file\\\"\\n\\t          && this._sources.has(fileUriAbsPath)) {\\n\\t        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\\n\\t      }\\n\\t\\n\\t      if ((!url.path || url.path == \\\"/\\\")\\n\\t          && this._sources.has(\\\"/\\\" + relativeSource)) {\\n\\t        return this.sourcesContent[this._sources.indexOf(\\\"/\\\" + relativeSource)];\\n\\t      }\\n\\t    }\\n\\t\\n\\t    // This function is used recursively from\\n\\t    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\\n\\t    // don't want to throw if we can't find the source - we just want to\\n\\t    // return null, so we provide a flag to exit gracefully.\\n\\t    if (nullOnMissing) {\\n\\t      return null;\\n\\t    }\\n\\t    else {\\n\\t      throw new Error('\\\"' + relativeSource + '\\\" is not in the SourceMap.');\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Returns the generated line and column information for the original source,\\n\\t * line, and column positions provided. The only argument is an object with\\n\\t * the following properties:\\n\\t *\\n\\t *   - source: The filename of the original source.\\n\\t *   - line: The line number in the original source.  The line number\\n\\t *     is 1-based.\\n\\t *   - column: The column number in the original source.  The column\\n\\t *     number is 0-based.\\n\\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\\n\\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\\n\\t *     closest element that is smaller than or greater than the one we are\\n\\t *     searching for, respectively, if the exact element cannot be found.\\n\\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\\n\\t *\\n\\t * and an object is returned with the following properties:\\n\\t *\\n\\t *   - line: The line number in the generated source, or null.  The\\n\\t *     line number is 1-based.\\n\\t *   - column: The column number in the generated source, or null.\\n\\t *     The column number is 0-based.\\n\\t */\\n\\tBasicSourceMapConsumer.prototype.generatedPositionFor =\\n\\t  function SourceMapConsumer_generatedPositionFor(aArgs) {\\n\\t    var source = util.getArg(aArgs, 'source');\\n\\t    source = this._findSourceIndex(source);\\n\\t    if (source < 0) {\\n\\t      return {\\n\\t        line: null,\\n\\t        column: null,\\n\\t        lastColumn: null\\n\\t      };\\n\\t    }\\n\\t\\n\\t    var needle = {\\n\\t      source: source,\\n\\t      originalLine: util.getArg(aArgs, 'line'),\\n\\t      originalColumn: util.getArg(aArgs, 'column')\\n\\t    };\\n\\t\\n\\t    var index = this._findMapping(\\n\\t      needle,\\n\\t      this._originalMappings,\\n\\t      \\\"originalLine\\\",\\n\\t      \\\"originalColumn\\\",\\n\\t      util.compareByOriginalPositions,\\n\\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\\n\\t    );\\n\\t\\n\\t    if (index >= 0) {\\n\\t      var mapping = this._originalMappings[index];\\n\\t\\n\\t      if (mapping.source === needle.source) {\\n\\t        return {\\n\\t          line: util.getArg(mapping, 'generatedLine', null),\\n\\t          column: util.getArg(mapping, 'generatedColumn', null),\\n\\t          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\\n\\t        };\\n\\t      }\\n\\t    }\\n\\t\\n\\t    return {\\n\\t      line: null,\\n\\t      column: null,\\n\\t      lastColumn: null\\n\\t    };\\n\\t  };\\n\\t\\n\\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\\n\\t\\n\\t/**\\n\\t * An IndexedSourceMapConsumer instance represents a parsed source map which\\n\\t * we can query for information. It differs from BasicSourceMapConsumer in\\n\\t * that it takes \\\"indexed\\\" source maps (i.e. ones with a \\\"sections\\\" field) as\\n\\t * input.\\n\\t *\\n\\t * The first parameter is a raw source map (either as a JSON string, or already\\n\\t * parsed to an object). According to the spec for indexed source maps, they\\n\\t * have the following attributes:\\n\\t *\\n\\t *   - version: Which version of the source map spec this map is following.\\n\\t *   - file: Optional. The generated file this source map is associated with.\\n\\t *   - sections: A list of section definitions.\\n\\t *\\n\\t * Each value under the \\\"sections\\\" field has two fields:\\n\\t *   - offset: The offset into the original specified at which this section\\n\\t *       begins to apply, defined as an object with a \\\"line\\\" and \\\"column\\\"\\n\\t *       field.\\n\\t *   - map: A source map definition. This source map could also be indexed,\\n\\t *       but doesn't have to be.\\n\\t *\\n\\t * Instead of the \\\"map\\\" field, it's also possible to have a \\\"url\\\" field\\n\\t * specifying a URL to retrieve a source map from, but that's currently\\n\\t * unsupported.\\n\\t *\\n\\t * Here's an example source map, taken from the source map spec[0], but\\n\\t * modified to omit a section which uses the \\\"url\\\" field.\\n\\t *\\n\\t *  {\\n\\t *    version : 3,\\n\\t *    file: \\\"app.js\\\",\\n\\t *    sections: [{\\n\\t *      offset: {line:100, column:10},\\n\\t *      map: {\\n\\t *        version : 3,\\n\\t *        file: \\\"section.js\\\",\\n\\t *        sources: [\\\"foo.js\\\", \\\"bar.js\\\"],\\n\\t *        names: [\\\"src\\\", \\\"maps\\\", \\\"are\\\", \\\"fun\\\"],\\n\\t *        mappings: \\\"AAAA,E;;ABCDE;\\\"\\n\\t *      }\\n\\t *    }],\\n\\t *  }\\n\\t *\\n\\t * The second parameter, if given, is a string whose value is the URL\\n\\t * at which the source map was found.  This URL is used to compute the\\n\\t * sources array.\\n\\t *\\n\\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\\n\\t */\\n\\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\\n\\t  var sourceMap = aSourceMap;\\n\\t  if (typeof aSourceMap === 'string') {\\n\\t    sourceMap = util.parseSourceMapInput(aSourceMap);\\n\\t  }\\n\\t\\n\\t  var version = util.getArg(sourceMap, 'version');\\n\\t  var sections = util.getArg(sourceMap, 'sections');\\n\\t\\n\\t  if (version != this._version) {\\n\\t    throw new Error('Unsupported version: ' + version);\\n\\t  }\\n\\t\\n\\t  this._sources = new ArraySet();\\n\\t  this._names = new ArraySet();\\n\\t\\n\\t  var lastOffset = {\\n\\t    line: -1,\\n\\t    column: 0\\n\\t  };\\n\\t  this._sections = sections.map(function (s) {\\n\\t    if (s.url) {\\n\\t      // The url field will require support for asynchronicity.\\n\\t      // See https://github.com/mozilla/source-map/issues/16\\n\\t      throw new Error('Support for url field in sections not implemented.');\\n\\t    }\\n\\t    var offset = util.getArg(s, 'offset');\\n\\t    var offsetLine = util.getArg(offset, 'line');\\n\\t    var offsetColumn = util.getArg(offset, 'column');\\n\\t\\n\\t    if (offsetLine < lastOffset.line ||\\n\\t        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\\n\\t      throw new Error('Section offsets must be ordered and non-overlapping.');\\n\\t    }\\n\\t    lastOffset = offset;\\n\\t\\n\\t    return {\\n\\t      generatedOffset: {\\n\\t        // The offset fields are 0-based, but we use 1-based indices when\\n\\t        // encoding/decoding from VLQ.\\n\\t        generatedLine: offsetLine + 1,\\n\\t        generatedColumn: offsetColumn + 1\\n\\t      },\\n\\t      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\\n\\t    }\\n\\t  });\\n\\t}\\n\\t\\n\\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\\n\\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\\n\\t\\n\\t/**\\n\\t * The version of the source mapping spec that we are consuming.\\n\\t */\\n\\tIndexedSourceMapConsumer.prototype._version = 3;\\n\\t\\n\\t/**\\n\\t * The list of original sources.\\n\\t */\\n\\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\\n\\t  get: function () {\\n\\t    var sources = [];\\n\\t    for (var i = 0; i < this._sections.length; i++) {\\n\\t      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\\n\\t        sources.push(this._sections[i].consumer.sources[j]);\\n\\t      }\\n\\t    }\\n\\t    return sources;\\n\\t  }\\n\\t});\\n\\t\\n\\t/**\\n\\t * Returns the original source, line, and column information for the generated\\n\\t * source's line and column positions provided. The only argument is an object\\n\\t * with the following properties:\\n\\t *\\n\\t *   - line: The line number in the generated source.  The line number\\n\\t *     is 1-based.\\n\\t *   - column: The column number in the generated source.  The column\\n\\t *     number is 0-based.\\n\\t *\\n\\t * and an object is returned with the following properties:\\n\\t *\\n\\t *   - source: The original source file, or null.\\n\\t *   - line: The line number in the original source, or null.  The\\n\\t *     line number is 1-based.\\n\\t *   - column: The column number in the original source, or null.  The\\n\\t *     column number is 0-based.\\n\\t *   - name: The original identifier, or null.\\n\\t */\\n\\tIndexedSourceMapConsumer.prototype.originalPositionFor =\\n\\t  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\\n\\t    var needle = {\\n\\t      generatedLine: util.getArg(aArgs, 'line'),\\n\\t      generatedColumn: util.getArg(aArgs, 'column')\\n\\t    };\\n\\t\\n\\t    // Find the section containing the generated position we're trying to map\\n\\t    // to an original position.\\n\\t    var sectionIndex = binarySearch.search(needle, this._sections,\\n\\t      function(needle, section) {\\n\\t        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\\n\\t        if (cmp) {\\n\\t          return cmp;\\n\\t        }\\n\\t\\n\\t        return (needle.generatedColumn -\\n\\t                section.generatedOffset.generatedColumn);\\n\\t      });\\n\\t    var section = this._sections[sectionIndex];\\n\\t\\n\\t    if (!section) {\\n\\t      return {\\n\\t        source: null,\\n\\t        line: null,\\n\\t        column: null,\\n\\t        name: null\\n\\t      };\\n\\t    }\\n\\t\\n\\t    return section.consumer.originalPositionFor({\\n\\t      line: needle.generatedLine -\\n\\t        (section.generatedOffset.generatedLine - 1),\\n\\t      column: needle.generatedColumn -\\n\\t        (section.generatedOffset.generatedLine === needle.generatedLine\\n\\t         ? section.generatedOffset.generatedColumn - 1\\n\\t         : 0),\\n\\t      bias: aArgs.bias\\n\\t    });\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Return true if we have the source content for every source in the source\\n\\t * map, false otherwise.\\n\\t */\\n\\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\\n\\t  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\\n\\t    return this._sections.every(function (s) {\\n\\t      return s.consumer.hasContentsOfAllSources();\\n\\t    });\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Returns the original source content. The only argument is the url of the\\n\\t * original source file. Returns null if no original source content is\\n\\t * available.\\n\\t */\\n\\tIndexedSourceMapConsumer.prototype.sourceContentFor =\\n\\t  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\\n\\t    for (var i = 0; i < this._sections.length; i++) {\\n\\t      var section = this._sections[i];\\n\\t\\n\\t      var content = section.consumer.sourceContentFor(aSource, true);\\n\\t      if (content) {\\n\\t        return content;\\n\\t      }\\n\\t    }\\n\\t    if (nullOnMissing) {\\n\\t      return null;\\n\\t    }\\n\\t    else {\\n\\t      throw new Error('\\\"' + aSource + '\\\" is not in the SourceMap.');\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Returns the generated line and column information for the original source,\\n\\t * line, and column positions provided. The only argument is an object with\\n\\t * the following properties:\\n\\t *\\n\\t *   - source: The filename of the original source.\\n\\t *   - line: The line number in the original source.  The line number\\n\\t *     is 1-based.\\n\\t *   - column: The column number in the original source.  The column\\n\\t *     number is 0-based.\\n\\t *\\n\\t * and an object is returned with the following properties:\\n\\t *\\n\\t *   - line: The line number in the generated source, or null.  The\\n\\t *     line number is 1-based. \\n\\t *   - column: The column number in the generated source, or null.\\n\\t *     The column number is 0-based.\\n\\t */\\n\\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\\n\\t  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\\n\\t    for (var i = 0; i < this._sections.length; i++) {\\n\\t      var section = this._sections[i];\\n\\t\\n\\t      // Only consider this section if the requested source is in the list of\\n\\t      // sources of the consumer.\\n\\t      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\\n\\t        continue;\\n\\t      }\\n\\t      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\\n\\t      if (generatedPosition) {\\n\\t        var ret = {\\n\\t          line: generatedPosition.line +\\n\\t            (section.generatedOffset.generatedLine - 1),\\n\\t          column: generatedPosition.column +\\n\\t            (section.generatedOffset.generatedLine === generatedPosition.line\\n\\t             ? section.generatedOffset.generatedColumn - 1\\n\\t             : 0)\\n\\t        };\\n\\t        return ret;\\n\\t      }\\n\\t    }\\n\\t\\n\\t    return {\\n\\t      line: null,\\n\\t      column: null\\n\\t    };\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Parse the mappings in a string in to a data structure which we can easily\\n\\t * query (the ordered arrays in the `this.__generatedMappings` and\\n\\t * `this.__originalMappings` properties).\\n\\t */\\n\\tIndexedSourceMapConsumer.prototype._parseMappings =\\n\\t  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\\n\\t    this.__generatedMappings = [];\\n\\t    this.__originalMappings = [];\\n\\t    for (var i = 0; i < this._sections.length; i++) {\\n\\t      var section = this._sections[i];\\n\\t      var sectionMappings = section.consumer._generatedMappings;\\n\\t      for (var j = 0; j < sectionMappings.length; j++) {\\n\\t        var mapping = sectionMappings[j];\\n\\t\\n\\t        var source = section.consumer._sources.at(mapping.source);\\n\\t        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\\n\\t        this._sources.add(source);\\n\\t        source = this._sources.indexOf(source);\\n\\t\\n\\t        var name = null;\\n\\t        if (mapping.name) {\\n\\t          name = section.consumer._names.at(mapping.name);\\n\\t          this._names.add(name);\\n\\t          name = this._names.indexOf(name);\\n\\t        }\\n\\t\\n\\t        // The mappings coming from the consumer for the section have\\n\\t        // generated positions relative to the start of the section, so we\\n\\t        // need to offset them to be relative to the start of the concatenated\\n\\t        // generated file.\\n\\t        var adjustedMapping = {\\n\\t          source: source,\\n\\t          generatedLine: mapping.generatedLine +\\n\\t            (section.generatedOffset.generatedLine - 1),\\n\\t          generatedColumn: mapping.generatedColumn +\\n\\t            (section.generatedOffset.generatedLine === mapping.generatedLine\\n\\t            ? section.generatedOffset.generatedColumn - 1\\n\\t            : 0),\\n\\t          originalLine: mapping.originalLine,\\n\\t          originalColumn: mapping.originalColumn,\\n\\t          name: name\\n\\t        };\\n\\t\\n\\t        this.__generatedMappings.push(adjustedMapping);\\n\\t        if (typeof adjustedMapping.originalLine === 'number') {\\n\\t          this.__originalMappings.push(adjustedMapping);\\n\\t        }\\n\\t      }\\n\\t    }\\n\\t\\n\\t    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\\n\\t    quickSort(this.__originalMappings, util.compareByOriginalPositions);\\n\\t  };\\n\\t\\n\\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\\n\\n\\n/***/ }),\\n/* 8 */\\n/***/ (function(module, exports) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\texports.GREATEST_LOWER_BOUND = 1;\\n\\texports.LEAST_UPPER_BOUND = 2;\\n\\t\\n\\t/**\\n\\t * Recursive implementation of binary search.\\n\\t *\\n\\t * @param aLow Indices here and lower do not contain the needle.\\n\\t * @param aHigh Indices here and higher do not contain the needle.\\n\\t * @param aNeedle The element being searched for.\\n\\t * @param aHaystack The non-empty array being searched.\\n\\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\\n\\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\\n\\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\\n\\t *     closest element that is smaller than or greater than the one we are\\n\\t *     searching for, respectively, if the exact element cannot be found.\\n\\t */\\n\\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\\n\\t  // This function terminates when one of the following is true:\\n\\t  //\\n\\t  //   1. We find the exact element we are looking for.\\n\\t  //\\n\\t  //   2. We did not find the exact element, but we can return the index of\\n\\t  //      the next-closest element.\\n\\t  //\\n\\t  //   3. We did not find the exact element, and there is no next-closest\\n\\t  //      element than the one we are searching for, so we return -1.\\n\\t  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\\n\\t  var cmp = aCompare(aNeedle, aHaystack[mid], true);\\n\\t  if (cmp === 0) {\\n\\t    // Found the element we are looking for.\\n\\t    return mid;\\n\\t  }\\n\\t  else if (cmp > 0) {\\n\\t    // Our needle is greater than aHaystack[mid].\\n\\t    if (aHigh - mid > 1) {\\n\\t      // The element is in the upper half.\\n\\t      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\\n\\t    }\\n\\t\\n\\t    // The exact needle element was not found in this haystack. Determine if\\n\\t    // we are in termination case (3) or (2) and return the appropriate thing.\\n\\t    if (aBias == exports.LEAST_UPPER_BOUND) {\\n\\t      return aHigh < aHaystack.length ? aHigh : -1;\\n\\t    } else {\\n\\t      return mid;\\n\\t    }\\n\\t  }\\n\\t  else {\\n\\t    // Our needle is less than aHaystack[mid].\\n\\t    if (mid - aLow > 1) {\\n\\t      // The element is in the lower half.\\n\\t      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\\n\\t    }\\n\\t\\n\\t    // we are in termination case (3) or (2) and return the appropriate thing.\\n\\t    if (aBias == exports.LEAST_UPPER_BOUND) {\\n\\t      return mid;\\n\\t    } else {\\n\\t      return aLow < 0 ? -1 : aLow;\\n\\t    }\\n\\t  }\\n\\t}\\n\\t\\n\\t/**\\n\\t * This is an implementation of binary search which will always try and return\\n\\t * the index of the closest element if there is no exact hit. This is because\\n\\t * mappings between original and generated line/col pairs are single points,\\n\\t * and there is an implicit region between each of them, so a miss just means\\n\\t * that you aren't on the very start of a region.\\n\\t *\\n\\t * @param aNeedle The element you are looking for.\\n\\t * @param aHaystack The array that is being searched.\\n\\t * @param aCompare A function which takes the needle and an element in the\\n\\t *     array and returns -1, 0, or 1 depending on whether the needle is less\\n\\t *     than, equal to, or greater than the element, respectively.\\n\\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\\n\\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\\n\\t *     closest element that is smaller than or greater than the one we are\\n\\t *     searching for, respectively, if the exact element cannot be found.\\n\\t *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\\n\\t */\\n\\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\\n\\t  if (aHaystack.length === 0) {\\n\\t    return -1;\\n\\t  }\\n\\t\\n\\t  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\\n\\t                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\\n\\t  if (index < 0) {\\n\\t    return -1;\\n\\t  }\\n\\t\\n\\t  // We have found either the exact element, or the next-closest element than\\n\\t  // the one we are searching for. However, there may be more than one such\\n\\t  // element. Make sure we always return the smallest of these.\\n\\t  while (index - 1 >= 0) {\\n\\t    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\\n\\t      break;\\n\\t    }\\n\\t    --index;\\n\\t  }\\n\\t\\n\\t  return index;\\n\\t};\\n\\n\\n/***/ }),\\n/* 9 */\\n/***/ (function(module, exports) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\t// It turns out that some (most?) JavaScript engines don't self-host\\n\\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\\n\\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\\n\\t// custom comparator function, calling back and forth between the VM's C++ and\\n\\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\\n\\t// worse generated code for the comparator function than would be optimal. In\\n\\t// fact, when sorting with a comparator, these costs outweigh the benefits of\\n\\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\\n\\t// a ~3500ms mean speed-up in `bench/bench.html`.\\n\\t\\n\\t/**\\n\\t * Swap the elements indexed by `x` and `y` in the array `ary`.\\n\\t *\\n\\t * @param {Array} ary\\n\\t *        The array.\\n\\t * @param {Number} x\\n\\t *        The index of the first item.\\n\\t * @param {Number} y\\n\\t *        The index of the second item.\\n\\t */\\n\\tfunction swap(ary, x, y) {\\n\\t  var temp = ary[x];\\n\\t  ary[x] = ary[y];\\n\\t  ary[y] = temp;\\n\\t}\\n\\t\\n\\t/**\\n\\t * Returns a random integer within the range `low .. high` inclusive.\\n\\t *\\n\\t * @param {Number} low\\n\\t *        The lower bound on the range.\\n\\t * @param {Number} high\\n\\t *        The upper bound on the range.\\n\\t */\\n\\tfunction randomIntInRange(low, high) {\\n\\t  return Math.round(low + (Math.random() * (high - low)));\\n\\t}\\n\\t\\n\\t/**\\n\\t * The Quick Sort algorithm.\\n\\t *\\n\\t * @param {Array} ary\\n\\t *        An array to sort.\\n\\t * @param {function} comparator\\n\\t *        Function to use to compare two items.\\n\\t * @param {Number} p\\n\\t *        Start index of the array\\n\\t * @param {Number} r\\n\\t *        End index of the array\\n\\t */\\n\\tfunction doQuickSort(ary, comparator, p, r) {\\n\\t  // If our lower bound is less than our upper bound, we (1) partition the\\n\\t  // array into two pieces and (2) recurse on each half. If it is not, this is\\n\\t  // the empty array and our base case.\\n\\t\\n\\t  if (p < r) {\\n\\t    // (1) Partitioning.\\n\\t    //\\n\\t    // The partitioning chooses a pivot between `p` and `r` and moves all\\n\\t    // elements that are less than or equal to the pivot to the before it, and\\n\\t    // all the elements that are greater than it after it. The effect is that\\n\\t    // once partition is done, the pivot is in the exact place it will be when\\n\\t    // the array is put in sorted order, and it will not need to be moved\\n\\t    // again. This runs in O(n) time.\\n\\t\\n\\t    // Always choose a random pivot so that an input array which is reverse\\n\\t    // sorted does not cause O(n^2) running time.\\n\\t    var pivotIndex = randomIntInRange(p, r);\\n\\t    var i = p - 1;\\n\\t\\n\\t    swap(ary, pivotIndex, r);\\n\\t    var pivot = ary[r];\\n\\t\\n\\t    // Immediately after `j` is incremented in this loop, the following hold\\n\\t    // true:\\n\\t    //\\n\\t    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\\n\\t    //\\n\\t    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\\n\\t    for (var j = p; j < r; j++) {\\n\\t      if (comparator(ary[j], pivot) <= 0) {\\n\\t        i += 1;\\n\\t        swap(ary, i, j);\\n\\t      }\\n\\t    }\\n\\t\\n\\t    swap(ary, i + 1, j);\\n\\t    var q = i + 1;\\n\\t\\n\\t    // (2) Recurse on each half.\\n\\t\\n\\t    doQuickSort(ary, comparator, p, q - 1);\\n\\t    doQuickSort(ary, comparator, q + 1, r);\\n\\t  }\\n\\t}\\n\\t\\n\\t/**\\n\\t * Sort the given array in-place with the given comparator function.\\n\\t *\\n\\t * @param {Array} ary\\n\\t *        An array to sort.\\n\\t * @param {function} comparator\\n\\t *        Function to use to compare two items.\\n\\t */\\n\\texports.quickSort = function (ary, comparator) {\\n\\t  doQuickSort(ary, comparator, 0, ary.length - 1);\\n\\t};\\n\\n\\n/***/ }),\\n/* 10 */\\n/***/ (function(module, exports, __webpack_require__) {\\n\\n\\t/* -*- Mode: js; js-indent-level: 2; -*- */\\n\\t/*\\n\\t * Copyright 2011 Mozilla Foundation and contributors\\n\\t * Licensed under the New BSD license. See LICENSE or:\\n\\t * http://opensource.org/licenses/BSD-3-Clause\\n\\t */\\n\\t\\n\\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\\n\\tvar util = __webpack_require__(4);\\n\\t\\n\\t// Matches a Windows-style `\\\\r\\\\n` newline or a `\\\\n` newline used by all other\\n\\t// operating systems these days (capturing the result).\\n\\tvar REGEX_NEWLINE = /(\\\\r?\\\\n)/;\\n\\t\\n\\t// Newline character code for charCodeAt() comparisons\\n\\tvar NEWLINE_CODE = 10;\\n\\t\\n\\t// Private symbol for identifying `SourceNode`s when multiple versions of\\n\\t// the source-map library are loaded. This MUST NOT CHANGE across\\n\\t// versions!\\n\\tvar isSourceNode = \\\"$$$isSourceNode$$$\\\";\\n\\t\\n\\t/**\\n\\t * SourceNodes provide a way to abstract over interpolating/concatenating\\n\\t * snippets of generated JavaScript source code while maintaining the line and\\n\\t * column information associated with the original source code.\\n\\t *\\n\\t * @param aLine The original line number.\\n\\t * @param aColumn The original column number.\\n\\t * @param aSource The original source's filename.\\n\\t * @param aChunks Optional. An array of strings which are snippets of\\n\\t *        generated JS, or other SourceNodes.\\n\\t * @param aName The original identifier.\\n\\t */\\n\\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\\n\\t  this.children = [];\\n\\t  this.sourceContents = {};\\n\\t  this.line = aLine == null ? null : aLine;\\n\\t  this.column = aColumn == null ? null : aColumn;\\n\\t  this.source = aSource == null ? null : aSource;\\n\\t  this.name = aName == null ? null : aName;\\n\\t  this[isSourceNode] = true;\\n\\t  if (aChunks != null) this.add(aChunks);\\n\\t}\\n\\t\\n\\t/**\\n\\t * Creates a SourceNode from generated code and a SourceMapConsumer.\\n\\t *\\n\\t * @param aGeneratedCode The generated code\\n\\t * @param aSourceMapConsumer The SourceMap for the generated code\\n\\t * @param aRelativePath Optional. The path that relative sources in the\\n\\t *        SourceMapConsumer should be relative to.\\n\\t */\\n\\tSourceNode.fromStringWithSourceMap =\\n\\t  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\\n\\t    // The SourceNode we want to fill with the generated code\\n\\t    // and the SourceMap\\n\\t    var node = new SourceNode();\\n\\t\\n\\t    // All even indices of this array are one line of the generated code,\\n\\t    // while all odd indices are the newlines between two adjacent lines\\n\\t    // (since `REGEX_NEWLINE` captures its match).\\n\\t    // Processed fragments are accessed by calling `shiftNextLine`.\\n\\t    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\\n\\t    var remainingLinesIndex = 0;\\n\\t    var shiftNextLine = function() {\\n\\t      var lineContents = getNextLine();\\n\\t      // The last line of a file might not have a newline.\\n\\t      var newLine = getNextLine() || \\\"\\\";\\n\\t      return lineContents + newLine;\\n\\t\\n\\t      function getNextLine() {\\n\\t        return remainingLinesIndex < remainingLines.length ?\\n\\t            remainingLines[remainingLinesIndex++] : undefined;\\n\\t      }\\n\\t    };\\n\\t\\n\\t    // We need to remember the position of \\\"remainingLines\\\"\\n\\t    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\\n\\t\\n\\t    // The generate SourceNodes we need a code range.\\n\\t    // To extract it current and last mapping is used.\\n\\t    // Here we store the last mapping.\\n\\t    var lastMapping = null;\\n\\t\\n\\t    aSourceMapConsumer.eachMapping(function (mapping) {\\n\\t      if (lastMapping !== null) {\\n\\t        // We add the code from \\\"lastMapping\\\" to \\\"mapping\\\":\\n\\t        // First check if there is a new line in between.\\n\\t        if (lastGeneratedLine < mapping.generatedLine) {\\n\\t          // Associate first line with \\\"lastMapping\\\"\\n\\t          addMappingWithCode(lastMapping, shiftNextLine());\\n\\t          lastGeneratedLine++;\\n\\t          lastGeneratedColumn = 0;\\n\\t          // The remaining code is added without mapping\\n\\t        } else {\\n\\t          // There is no new line in between.\\n\\t          // Associate the code between \\\"lastGeneratedColumn\\\" and\\n\\t          // \\\"mapping.generatedColumn\\\" with \\\"lastMapping\\\"\\n\\t          var nextLine = remainingLines[remainingLinesIndex] || '';\\n\\t          var code = nextLine.substr(0, mapping.generatedColumn -\\n\\t                                        lastGeneratedColumn);\\n\\t          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\\n\\t                                              lastGeneratedColumn);\\n\\t          lastGeneratedColumn = mapping.generatedColumn;\\n\\t          addMappingWithCode(lastMapping, code);\\n\\t          // No more remaining code, continue\\n\\t          lastMapping = mapping;\\n\\t          return;\\n\\t        }\\n\\t      }\\n\\t      // We add the generated code until the first mapping\\n\\t      // to the SourceNode without any mapping.\\n\\t      // Each line is added as separate string.\\n\\t      while (lastGeneratedLine < mapping.generatedLine) {\\n\\t        node.add(shiftNextLine());\\n\\t        lastGeneratedLine++;\\n\\t      }\\n\\t      if (lastGeneratedColumn < mapping.generatedColumn) {\\n\\t        var nextLine = remainingLines[remainingLinesIndex] || '';\\n\\t        node.add(nextLine.substr(0, mapping.generatedColumn));\\n\\t        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\\n\\t        lastGeneratedColumn = mapping.generatedColumn;\\n\\t      }\\n\\t      lastMapping = mapping;\\n\\t    }, this);\\n\\t    // We have processed all mappings.\\n\\t    if (remainingLinesIndex < remainingLines.length) {\\n\\t      if (lastMapping) {\\n\\t        // Associate the remaining code in the current line with \\\"lastMapping\\\"\\n\\t        addMappingWithCode(lastMapping, shiftNextLine());\\n\\t      }\\n\\t      // and add the remaining lines without any mapping\\n\\t      node.add(remainingLines.splice(remainingLinesIndex).join(\\\"\\\"));\\n\\t    }\\n\\t\\n\\t    // Copy sourcesContent into SourceNode\\n\\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\\n\\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\\n\\t      if (content != null) {\\n\\t        if (aRelativePath != null) {\\n\\t          sourceFile = util.join(aRelativePath, sourceFile);\\n\\t        }\\n\\t        node.setSourceContent(sourceFile, content);\\n\\t      }\\n\\t    });\\n\\t\\n\\t    return node;\\n\\t\\n\\t    function addMappingWithCode(mapping, code) {\\n\\t      if (mapping === null || mapping.source === undefined) {\\n\\t        node.add(code);\\n\\t      } else {\\n\\t        var source = aRelativePath\\n\\t          ? util.join(aRelativePath, mapping.source)\\n\\t          : mapping.source;\\n\\t        node.add(new SourceNode(mapping.originalLine,\\n\\t                                mapping.originalColumn,\\n\\t                                source,\\n\\t                                code,\\n\\t                                mapping.name));\\n\\t      }\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Add a chunk of generated JS to this source node.\\n\\t *\\n\\t * @param aChunk A string snippet of generated JS code, another instance of\\n\\t *        SourceNode, or an array where each member is one of those things.\\n\\t */\\n\\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\\n\\t  if (Array.isArray(aChunk)) {\\n\\t    aChunk.forEach(function (chunk) {\\n\\t      this.add(chunk);\\n\\t    }, this);\\n\\t  }\\n\\t  else if (aChunk[isSourceNode] || typeof aChunk === \\\"string\\\") {\\n\\t    if (aChunk) {\\n\\t      this.children.push(aChunk);\\n\\t    }\\n\\t  }\\n\\t  else {\\n\\t    throw new TypeError(\\n\\t      \\\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \\\" + aChunk\\n\\t    );\\n\\t  }\\n\\t  return this;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Add a chunk of generated JS to the beginning of this source node.\\n\\t *\\n\\t * @param aChunk A string snippet of generated JS code, another instance of\\n\\t *        SourceNode, or an array where each member is one of those things.\\n\\t */\\n\\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\\n\\t  if (Array.isArray(aChunk)) {\\n\\t    for (var i = aChunk.length-1; i >= 0; i--) {\\n\\t      this.prepend(aChunk[i]);\\n\\t    }\\n\\t  }\\n\\t  else if (aChunk[isSourceNode] || typeof aChunk === \\\"string\\\") {\\n\\t    this.children.unshift(aChunk);\\n\\t  }\\n\\t  else {\\n\\t    throw new TypeError(\\n\\t      \\\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \\\" + aChunk\\n\\t    );\\n\\t  }\\n\\t  return this;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Walk over the tree of JS snippets in this node and its children. The\\n\\t * walking function is called once for each snippet of JS and is passed that\\n\\t * snippet and the its original associated source's line/column location.\\n\\t *\\n\\t * @param aFn The traversal function.\\n\\t */\\n\\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\\n\\t  var chunk;\\n\\t  for (var i = 0, len = this.children.length; i < len; i++) {\\n\\t    chunk = this.children[i];\\n\\t    if (chunk[isSourceNode]) {\\n\\t      chunk.walk(aFn);\\n\\t    }\\n\\t    else {\\n\\t      if (chunk !== '') {\\n\\t        aFn(chunk, { source: this.source,\\n\\t                     line: this.line,\\n\\t                     column: this.column,\\n\\t                     name: this.name });\\n\\t      }\\n\\t    }\\n\\t  }\\n\\t};\\n\\t\\n\\t/**\\n\\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\\n\\t * each of `this.children`.\\n\\t *\\n\\t * @param aSep The separator.\\n\\t */\\n\\tSourceNode.prototype.join = function SourceNode_join(aSep) {\\n\\t  var newChildren;\\n\\t  var i;\\n\\t  var len = this.children.length;\\n\\t  if (len > 0) {\\n\\t    newChildren = [];\\n\\t    for (i = 0; i < len-1; i++) {\\n\\t      newChildren.push(this.children[i]);\\n\\t      newChildren.push(aSep);\\n\\t    }\\n\\t    newChildren.push(this.children[i]);\\n\\t    this.children = newChildren;\\n\\t  }\\n\\t  return this;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Call String.prototype.replace on the very right-most source snippet. Useful\\n\\t * for trimming whitespace from the end of a source node, etc.\\n\\t *\\n\\t * @param aPattern The pattern to replace.\\n\\t * @param aReplacement The thing to replace the pattern with.\\n\\t */\\n\\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\\n\\t  var lastChild = this.children[this.children.length - 1];\\n\\t  if (lastChild[isSourceNode]) {\\n\\t    lastChild.replaceRight(aPattern, aReplacement);\\n\\t  }\\n\\t  else if (typeof lastChild === 'string') {\\n\\t    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\\n\\t  }\\n\\t  else {\\n\\t    this.children.push(''.replace(aPattern, aReplacement));\\n\\t  }\\n\\t  return this;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Set the source content for a source file. This will be added to the SourceMapGenerator\\n\\t * in the sourcesContent field.\\n\\t *\\n\\t * @param aSourceFile The filename of the source file\\n\\t * @param aSourceContent The content of the source file\\n\\t */\\n\\tSourceNode.prototype.setSourceContent =\\n\\t  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\\n\\t    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Walk over the tree of SourceNodes. The walking function is called for each\\n\\t * source file content and is passed the filename and source content.\\n\\t *\\n\\t * @param aFn The traversal function.\\n\\t */\\n\\tSourceNode.prototype.walkSourceContents =\\n\\t  function SourceNode_walkSourceContents(aFn) {\\n\\t    for (var i = 0, len = this.children.length; i < len; i++) {\\n\\t      if (this.children[i][isSourceNode]) {\\n\\t        this.children[i].walkSourceContents(aFn);\\n\\t      }\\n\\t    }\\n\\t\\n\\t    var sources = Object.keys(this.sourceContents);\\n\\t    for (var i = 0, len = sources.length; i < len; i++) {\\n\\t      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\\n\\t    }\\n\\t  };\\n\\t\\n\\t/**\\n\\t * Return the string representation of this source node. Walks over the tree\\n\\t * and concatenates all the various snippets together to one string.\\n\\t */\\n\\tSourceNode.prototype.toString = function SourceNode_toString() {\\n\\t  var str = \\\"\\\";\\n\\t  this.walk(function (chunk) {\\n\\t    str += chunk;\\n\\t  });\\n\\t  return str;\\n\\t};\\n\\t\\n\\t/**\\n\\t * Returns the string representation of this source node along with a source\\n\\t * map.\\n\\t */\\n\\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\\n\\t  var generated = {\\n\\t    code: \\\"\\\",\\n\\t    line: 1,\\n\\t    column: 0\\n\\t  };\\n\\t  var map = new SourceMapGenerator(aArgs);\\n\\t  var sourceMappingActive = false;\\n\\t  var lastOriginalSource = null;\\n\\t  var lastOriginalLine = null;\\n\\t  var lastOriginalColumn = null;\\n\\t  var lastOriginalName = null;\\n\\t  this.walk(function (chunk, original) {\\n\\t    generated.code += chunk;\\n\\t    if (original.source !== null\\n\\t        && original.line !== null\\n\\t        && original.column !== null) {\\n\\t      if(lastOriginalSource !== original.source\\n\\t         || lastOriginalLine !== original.line\\n\\t         || lastOriginalColumn !== original.column\\n\\t         || lastOriginalName !== original.name) {\\n\\t        map.addMapping({\\n\\t          source: original.source,\\n\\t          original: {\\n\\t            line: original.line,\\n\\t            column: original.column\\n\\t          },\\n\\t          generated: {\\n\\t            line: generated.line,\\n\\t            column: generated.column\\n\\t          },\\n\\t          name: original.name\\n\\t        });\\n\\t      }\\n\\t      lastOriginalSource = original.source;\\n\\t      lastOriginalLine = original.line;\\n\\t      lastOriginalColumn = original.column;\\n\\t      lastOriginalName = original.name;\\n\\t      sourceMappingActive = true;\\n\\t    } else if (sourceMappingActive) {\\n\\t      map.addMapping({\\n\\t        generated: {\\n\\t          line: generated.line,\\n\\t          column: generated.column\\n\\t        }\\n\\t      });\\n\\t      lastOriginalSource = null;\\n\\t      sourceMappingActive = false;\\n\\t    }\\n\\t    for (var idx = 0, length = chunk.length; idx < length; idx++) {\\n\\t      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\\n\\t        generated.line++;\\n\\t        generated.column = 0;\\n\\t        // Mappings end at eol\\n\\t        if (idx + 1 === length) {\\n\\t          lastOriginalSource = null;\\n\\t          sourceMappingActive = false;\\n\\t        } else if (sourceMappingActive) {\\n\\t          map.addMapping({\\n\\t            source: original.source,\\n\\t            original: {\\n\\t              line: original.line,\\n\\t              column: original.column\\n\\t            },\\n\\t            generated: {\\n\\t              line: generated.line,\\n\\t              column: generated.column\\n\\t            },\\n\\t            name: original.name\\n\\t          });\\n\\t        }\\n\\t      } else {\\n\\t        generated.column++;\\n\\t      }\\n\\t    }\\n\\t  });\\n\\t  this.walkSourceContents(function (sourceFile, sourceContent) {\\n\\t    map.setSourceContent(sourceFile, sourceContent);\\n\\t  });\\n\\t\\n\\t  return { code: generated.code, map: map };\\n\\t};\\n\\t\\n\\texports.SourceNode = SourceNode;\\n\\n\\n/***/ })\\n/******/ ])\\n});\\n;\\n\\n\\n// WEBPACK FOOTER //\\n// source-map.min.js\",\" \\t// The module cache\\n \\tvar installedModules = {};\\n\\n \\t// The require function\\n \\tfunction __webpack_require__(moduleId) {\\n\\n \\t\\t// Check if module is in cache\\n \\t\\tif(installedModules[moduleId])\\n \\t\\t\\treturn installedModules[moduleId].exports;\\n\\n \\t\\t// Create a new module (and put it into the cache)\\n \\t\\tvar module = installedModules[moduleId] = {\\n \\t\\t\\texports: {},\\n \\t\\t\\tid: moduleId,\\n \\t\\t\\tloaded: false\\n \\t\\t};\\n\\n \\t\\t// Execute the module function\\n \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n \\t\\t// Flag the module as loaded\\n \\t\\tmodule.loaded = true;\\n\\n \\t\\t// Return the exports of the module\\n \\t\\treturn module.exports;\\n \\t}\\n\\n\\n \\t// expose the modules object (__webpack_modules__)\\n \\t__webpack_require__.m = modules;\\n\\n \\t// expose the module cache\\n \\t__webpack_require__.c = installedModules;\\n\\n \\t// __webpack_public_path__\\n \\t__webpack_require__.p = \\\"\\\";\\n\\n \\t// Load entry module and return exports\\n \\treturn __webpack_require__(0);\\n\\n\\n\\n// WEBPACK FOOTER //\\n// webpack/bootstrap 0fd5815da764db5fb9fe\",\"/*\\n * Copyright 2009-2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE.txt or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\\nexports.SourceNode = require('./lib/source-node').SourceNode;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./source-map.js\\n// module id = 0\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nvar base64VLQ = require('./base64-vlq');\\nvar util = require('./util');\\nvar ArraySet = require('./array-set').ArraySet;\\nvar MappingList = require('./mapping-list').MappingList;\\n\\n/**\\n * An instance of the SourceMapGenerator represents a source map which is\\n * being built incrementally. You may pass an object with the following\\n * properties:\\n *\\n *   - file: The filename of the generated source.\\n *   - sourceRoot: A root for all relative URLs in this source map.\\n */\\nfunction SourceMapGenerator(aArgs) {\\n  if (!aArgs) {\\n    aArgs = {};\\n  }\\n  this._file = util.getArg(aArgs, 'file', null);\\n  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\\n  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\\n  this._sources = new ArraySet();\\n  this._names = new ArraySet();\\n  this._mappings = new MappingList();\\n  this._sourcesContents = null;\\n}\\n\\nSourceMapGenerator.prototype._version = 3;\\n\\n/**\\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\\n *\\n * @param aSourceMapConsumer The SourceMap.\\n */\\nSourceMapGenerator.fromSourceMap =\\n  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\\n    var sourceRoot = aSourceMapConsumer.sourceRoot;\\n    var generator = new SourceMapGenerator({\\n      file: aSourceMapConsumer.file,\\n      sourceRoot: sourceRoot\\n    });\\n    aSourceMapConsumer.eachMapping(function (mapping) {\\n      var newMapping = {\\n        generated: {\\n          line: mapping.generatedLine,\\n          column: mapping.generatedColumn\\n        }\\n      };\\n\\n      if (mapping.source != null) {\\n        newMapping.source = mapping.source;\\n        if (sourceRoot != null) {\\n          newMapping.source = util.relative(sourceRoot, newMapping.source);\\n        }\\n\\n        newMapping.original = {\\n          line: mapping.originalLine,\\n          column: mapping.originalColumn\\n        };\\n\\n        if (mapping.name != null) {\\n          newMapping.name = mapping.name;\\n        }\\n      }\\n\\n      generator.addMapping(newMapping);\\n    });\\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\\n      var sourceRelative = sourceFile;\\n      if (sourceRoot !== null) {\\n        sourceRelative = util.relative(sourceRoot, sourceFile);\\n      }\\n\\n      if (!generator._sources.has(sourceRelative)) {\\n        generator._sources.add(sourceRelative);\\n      }\\n\\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\\n      if (content != null) {\\n        generator.setSourceContent(sourceFile, content);\\n      }\\n    });\\n    return generator;\\n  };\\n\\n/**\\n * Add a single mapping from original source line and column to the generated\\n * source's line and column for this source map being created. The mapping\\n * object should have the following properties:\\n *\\n *   - generated: An object with the generated line and column positions.\\n *   - original: An object with the original line and column positions.\\n *   - source: The original source file (relative to the sourceRoot).\\n *   - name: An optional original token name for this mapping.\\n */\\nSourceMapGenerator.prototype.addMapping =\\n  function SourceMapGenerator_addMapping(aArgs) {\\n    var generated = util.getArg(aArgs, 'generated');\\n    var original = util.getArg(aArgs, 'original', null);\\n    var source = util.getArg(aArgs, 'source', null);\\n    var name = util.getArg(aArgs, 'name', null);\\n\\n    if (!this._skipValidation) {\\n      this._validateMapping(generated, original, source, name);\\n    }\\n\\n    if (source != null) {\\n      source = String(source);\\n      if (!this._sources.has(source)) {\\n        this._sources.add(source);\\n      }\\n    }\\n\\n    if (name != null) {\\n      name = String(name);\\n      if (!this._names.has(name)) {\\n        this._names.add(name);\\n      }\\n    }\\n\\n    this._mappings.add({\\n      generatedLine: generated.line,\\n      generatedColumn: generated.column,\\n      originalLine: original != null && original.line,\\n      originalColumn: original != null && original.column,\\n      source: source,\\n      name: name\\n    });\\n  };\\n\\n/**\\n * Set the source content for a source file.\\n */\\nSourceMapGenerator.prototype.setSourceContent =\\n  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\\n    var source = aSourceFile;\\n    if (this._sourceRoot != null) {\\n      source = util.relative(this._sourceRoot, source);\\n    }\\n\\n    if (aSourceContent != null) {\\n      // Add the source content to the _sourcesContents map.\\n      // Create a new _sourcesContents map if the property is null.\\n      if (!this._sourcesContents) {\\n        this._sourcesContents = Object.create(null);\\n      }\\n      this._sourcesContents[util.toSetString(source)] = aSourceContent;\\n    } else if (this._sourcesContents) {\\n      // Remove the source file from the _sourcesContents map.\\n      // If the _sourcesContents map is empty, set the property to null.\\n      delete this._sourcesContents[util.toSetString(source)];\\n      if (Object.keys(this._sourcesContents).length === 0) {\\n        this._sourcesContents = null;\\n      }\\n    }\\n  };\\n\\n/**\\n * Applies the mappings of a sub-source-map for a specific source file to the\\n * source map being generated. Each mapping to the supplied source file is\\n * rewritten using the supplied source map. Note: The resolution for the\\n * resulting mappings is the minimium of this map and the supplied map.\\n *\\n * @param aSourceMapConsumer The source map to be applied.\\n * @param aSourceFile Optional. The filename of the source file.\\n *        If omitted, SourceMapConsumer's file property will be used.\\n * @param aSourceMapPath Optional. The dirname of the path to the source map\\n *        to be applied. If relative, it is relative to the SourceMapConsumer.\\n *        This parameter is needed when the two source maps aren't in the same\\n *        directory, and the source map to be applied contains relative source\\n *        paths. If so, those relative source paths need to be rewritten\\n *        relative to the SourceMapGenerator.\\n */\\nSourceMapGenerator.prototype.applySourceMap =\\n  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\\n    var sourceFile = aSourceFile;\\n    // If aSourceFile is omitted, we will use the file property of the SourceMap\\n    if (aSourceFile == null) {\\n      if (aSourceMapConsumer.file == null) {\\n        throw new Error(\\n          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\\n          'or the source map\\\\'s \\\"file\\\" property. Both were omitted.'\\n        );\\n      }\\n      sourceFile = aSourceMapConsumer.file;\\n    }\\n    var sourceRoot = this._sourceRoot;\\n    // Make \\\"sourceFile\\\" relative if an absolute Url is passed.\\n    if (sourceRoot != null) {\\n      sourceFile = util.relative(sourceRoot, sourceFile);\\n    }\\n    // Applying the SourceMap can add and remove items from the sources and\\n    // the names array.\\n    var newSources = new ArraySet();\\n    var newNames = new ArraySet();\\n\\n    // Find mappings for the \\\"sourceFile\\\"\\n    this._mappings.unsortedForEach(function (mapping) {\\n      if (mapping.source === sourceFile && mapping.originalLine != null) {\\n        // Check if it can be mapped by the source map, then update the mapping.\\n        var original = aSourceMapConsumer.originalPositionFor({\\n          line: mapping.originalLine,\\n          column: mapping.originalColumn\\n        });\\n        if (original.source != null) {\\n          // Copy mapping\\n          mapping.source = original.source;\\n          if (aSourceMapPath != null) {\\n            mapping.source = util.join(aSourceMapPath, mapping.source)\\n          }\\n          if (sourceRoot != null) {\\n            mapping.source = util.relative(sourceRoot, mapping.source);\\n          }\\n          mapping.originalLine = original.line;\\n          mapping.originalColumn = original.column;\\n          if (original.name != null) {\\n            mapping.name = original.name;\\n          }\\n        }\\n      }\\n\\n      var source = mapping.source;\\n      if (source != null && !newSources.has(source)) {\\n        newSources.add(source);\\n      }\\n\\n      var name = mapping.name;\\n      if (name != null && !newNames.has(name)) {\\n        newNames.add(name);\\n      }\\n\\n    }, this);\\n    this._sources = newSources;\\n    this._names = newNames;\\n\\n    // Copy sourcesContents of applied map.\\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\\n      if (content != null) {\\n        if (aSourceMapPath != null) {\\n          sourceFile = util.join(aSourceMapPath, sourceFile);\\n        }\\n        if (sourceRoot != null) {\\n          sourceFile = util.relative(sourceRoot, sourceFile);\\n        }\\n        this.setSourceContent(sourceFile, content);\\n      }\\n    }, this);\\n  };\\n\\n/**\\n * A mapping can have one of the three levels of data:\\n *\\n *   1. Just the generated position.\\n *   2. The Generated position, original position, and original source.\\n *   3. Generated and original position, original source, as well as a name\\n *      token.\\n *\\n * To maintain consistency, we validate that any new mapping being added falls\\n * in to one of these categories.\\n */\\nSourceMapGenerator.prototype._validateMapping =\\n  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\\n                                              aName) {\\n    // When aOriginal is truthy but has empty values for .line and .column,\\n    // it is most likely a programmer error. In this case we throw a very\\n    // specific error message to try to guide them the right way.\\n    // For example: https://github.com/Polymer/polymer-bundler/pull/519\\n    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\\n        throw new Error(\\n            'original.line and original.column are not numbers -- you probably meant to omit ' +\\n            'the original mapping entirely and only map the generated position. If so, pass ' +\\n            'null for the original mapping instead of an object with empty or null values.'\\n        );\\n    }\\n\\n    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\\n        && aGenerated.line > 0 && aGenerated.column >= 0\\n        && !aOriginal && !aSource && !aName) {\\n      // Case 1.\\n      return;\\n    }\\n    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\\n             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\\n             && aGenerated.line > 0 && aGenerated.column >= 0\\n             && aOriginal.line > 0 && aOriginal.column >= 0\\n             && aSource) {\\n      // Cases 2 and 3.\\n      return;\\n    }\\n    else {\\n      throw new Error('Invalid mapping: ' + JSON.stringify({\\n        generated: aGenerated,\\n        source: aSource,\\n        original: aOriginal,\\n        name: aName\\n      }));\\n    }\\n  };\\n\\n/**\\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\\n * specified by the source map format.\\n */\\nSourceMapGenerator.prototype._serializeMappings =\\n  function SourceMapGenerator_serializeMappings() {\\n    var previousGeneratedColumn = 0;\\n    var previousGeneratedLine = 1;\\n    var previousOriginalColumn = 0;\\n    var previousOriginalLine = 0;\\n    var previousName = 0;\\n    var previousSource = 0;\\n    var result = '';\\n    var next;\\n    var mapping;\\n    var nameIdx;\\n    var sourceIdx;\\n\\n    var mappings = this._mappings.toArray();\\n    for (var i = 0, len = mappings.length; i < len; i++) {\\n      mapping = mappings[i];\\n      next = ''\\n\\n      if (mapping.generatedLine !== previousGeneratedLine) {\\n        previousGeneratedColumn = 0;\\n        while (mapping.generatedLine !== previousGeneratedLine) {\\n          next += ';';\\n          previousGeneratedLine++;\\n        }\\n      }\\n      else {\\n        if (i > 0) {\\n          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\\n            continue;\\n          }\\n          next += ',';\\n        }\\n      }\\n\\n      next += base64VLQ.encode(mapping.generatedColumn\\n                                 - previousGeneratedColumn);\\n      previousGeneratedColumn = mapping.generatedColumn;\\n\\n      if (mapping.source != null) {\\n        sourceIdx = this._sources.indexOf(mapping.source);\\n        next += base64VLQ.encode(sourceIdx - previousSource);\\n        previousSource = sourceIdx;\\n\\n        // lines are stored 0-based in SourceMap spec version 3\\n        next += base64VLQ.encode(mapping.originalLine - 1\\n                                   - previousOriginalLine);\\n        previousOriginalLine = mapping.originalLine - 1;\\n\\n        next += base64VLQ.encode(mapping.originalColumn\\n                                   - previousOriginalColumn);\\n        previousOriginalColumn = mapping.originalColumn;\\n\\n        if (mapping.name != null) {\\n          nameIdx = this._names.indexOf(mapping.name);\\n          next += base64VLQ.encode(nameIdx - previousName);\\n          previousName = nameIdx;\\n        }\\n      }\\n\\n      result += next;\\n    }\\n\\n    return result;\\n  };\\n\\nSourceMapGenerator.prototype._generateSourcesContent =\\n  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\\n    return aSources.map(function (source) {\\n      if (!this._sourcesContents) {\\n        return null;\\n      }\\n      if (aSourceRoot != null) {\\n        source = util.relative(aSourceRoot, source);\\n      }\\n      var key = util.toSetString(source);\\n      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\\n        ? this._sourcesContents[key]\\n        : null;\\n    }, this);\\n  };\\n\\n/**\\n * Externalize the source map.\\n */\\nSourceMapGenerator.prototype.toJSON =\\n  function SourceMapGenerator_toJSON() {\\n    var map = {\\n      version: this._version,\\n      sources: this._sources.toArray(),\\n      names: this._names.toArray(),\\n      mappings: this._serializeMappings()\\n    };\\n    if (this._file != null) {\\n      map.file = this._file;\\n    }\\n    if (this._sourceRoot != null) {\\n      map.sourceRoot = this._sourceRoot;\\n    }\\n    if (this._sourcesContents) {\\n      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\\n    }\\n\\n    return map;\\n  };\\n\\n/**\\n * Render the source map being generated to a string.\\n */\\nSourceMapGenerator.prototype.toString =\\n  function SourceMapGenerator_toString() {\\n    return JSON.stringify(this.toJSON());\\n  };\\n\\nexports.SourceMapGenerator = SourceMapGenerator;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/source-map-generator.js\\n// module id = 1\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n *\\n * Based on the Base 64 VLQ implementation in Closure Compiler:\\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\\n *\\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are\\n * met:\\n *\\n *  * Redistributions of source code must retain the above copyright\\n *    notice, this list of conditions and the following disclaimer.\\n *  * Redistributions in binary form must reproduce the above\\n *    copyright notice, this list of conditions and the following\\n *    disclaimer in the documentation and/or other materials provided\\n *    with the distribution.\\n *  * Neither the name of Google Inc. nor the names of its\\n *    contributors may be used to endorse or promote products derived\\n *    from this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\\n * \\\"AS IS\\\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\nvar base64 = require('./base64');\\n\\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\\n// length quantities we use in the source map spec, the first bit is the sign,\\n// the next four bits are the actual value, and the 6th bit is the\\n// continuation bit. The continuation bit tells us whether there are more\\n// digits in this value following this digit.\\n//\\n//   Continuation\\n//   |    Sign\\n//   |    |\\n//   V    V\\n//   101011\\n\\nvar VLQ_BASE_SHIFT = 5;\\n\\n// binary: 100000\\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\\n\\n// binary: 011111\\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\\n\\n// binary: 100000\\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\\n\\n/**\\n * Converts from a two-complement value to a value where the sign bit is\\n * placed in the least significant bit.  For example, as decimals:\\n *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\\n *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\\n */\\nfunction toVLQSigned(aValue) {\\n  return aValue < 0\\n    ? ((-aValue) << 1) + 1\\n    : (aValue << 1) + 0;\\n}\\n\\n/**\\n * Converts to a two-complement value from a value where the sign bit is\\n * placed in the least significant bit.  For example, as decimals:\\n *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\\n *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\\n */\\nfunction fromVLQSigned(aValue) {\\n  var isNegative = (aValue & 1) === 1;\\n  var shifted = aValue >> 1;\\n  return isNegative\\n    ? -shifted\\n    : shifted;\\n}\\n\\n/**\\n * Returns the base 64 VLQ encoded value.\\n */\\nexports.encode = function base64VLQ_encode(aValue) {\\n  var encoded = \\\"\\\";\\n  var digit;\\n\\n  var vlq = toVLQSigned(aValue);\\n\\n  do {\\n    digit = vlq & VLQ_BASE_MASK;\\n    vlq >>>= VLQ_BASE_SHIFT;\\n    if (vlq > 0) {\\n      // There are still more digits in this value, so we must make sure the\\n      // continuation bit is marked.\\n      digit |= VLQ_CONTINUATION_BIT;\\n    }\\n    encoded += base64.encode(digit);\\n  } while (vlq > 0);\\n\\n  return encoded;\\n};\\n\\n/**\\n * Decodes the next base 64 VLQ value from the given string and returns the\\n * value and the rest of the string via the out parameter.\\n */\\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\\n  var strLen = aStr.length;\\n  var result = 0;\\n  var shift = 0;\\n  var continuation, digit;\\n\\n  do {\\n    if (aIndex >= strLen) {\\n      throw new Error(\\\"Expected more digits in base 64 VLQ value.\\\");\\n    }\\n\\n    digit = base64.decode(aStr.charCodeAt(aIndex++));\\n    if (digit === -1) {\\n      throw new Error(\\\"Invalid base64 digit: \\\" + aStr.charAt(aIndex - 1));\\n    }\\n\\n    continuation = !!(digit & VLQ_CONTINUATION_BIT);\\n    digit &= VLQ_BASE_MASK;\\n    result = result + (digit << shift);\\n    shift += VLQ_BASE_SHIFT;\\n  } while (continuation);\\n\\n  aOutParam.value = fromVLQSigned(result);\\n  aOutParam.rest = aIndex;\\n};\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/base64-vlq.js\\n// module id = 2\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\\n\\n/**\\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\\n */\\nexports.encode = function (number) {\\n  if (0 <= number && number < intToCharMap.length) {\\n    return intToCharMap[number];\\n  }\\n  throw new TypeError(\\\"Must be between 0 and 63: \\\" + number);\\n};\\n\\n/**\\n * Decode a single base 64 character code digit to an integer. Returns -1 on\\n * failure.\\n */\\nexports.decode = function (charCode) {\\n  var bigA = 65;     // 'A'\\n  var bigZ = 90;     // 'Z'\\n\\n  var littleA = 97;  // 'a'\\n  var littleZ = 122; // 'z'\\n\\n  var zero = 48;     // '0'\\n  var nine = 57;     // '9'\\n\\n  var plus = 43;     // '+'\\n  var slash = 47;    // '/'\\n\\n  var littleOffset = 26;\\n  var numberOffset = 52;\\n\\n  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\\n  if (bigA <= charCode && charCode <= bigZ) {\\n    return (charCode - bigA);\\n  }\\n\\n  // 26 - 51: abcdefghijklmnopqrstuvwxyz\\n  if (littleA <= charCode && charCode <= littleZ) {\\n    return (charCode - littleA + littleOffset);\\n  }\\n\\n  // 52 - 61: 0123456789\\n  if (zero <= charCode && charCode <= nine) {\\n    return (charCode - zero + numberOffset);\\n  }\\n\\n  // 62: +\\n  if (charCode == plus) {\\n    return 62;\\n  }\\n\\n  // 63: /\\n  if (charCode == slash) {\\n    return 63;\\n  }\\n\\n  // Invalid base64 digit.\\n  return -1;\\n};\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/base64.js\\n// module id = 3\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\n/**\\n * This is a helper function for getting values from parameter/options\\n * objects.\\n *\\n * @param args The object we are extracting values from\\n * @param name The name of the property we are getting.\\n * @param defaultValue An optional value to return if the property is missing\\n * from the object. If this is not specified and the property is missing, an\\n * error will be thrown.\\n */\\nfunction getArg(aArgs, aName, aDefaultValue) {\\n  if (aName in aArgs) {\\n    return aArgs[aName];\\n  } else if (arguments.length === 3) {\\n    return aDefaultValue;\\n  } else {\\n    throw new Error('\\\"' + aName + '\\\" is a required argument.');\\n  }\\n}\\nexports.getArg = getArg;\\n\\nvar urlRegexp = /^(?:([\\\\w+\\\\-.]+):)?\\\\/\\\\/(?:(\\\\w+:\\\\w+)@)?([\\\\w.-]*)(?::(\\\\d+))?(.*)$/;\\nvar dataUrlRegexp = /^data:.+\\\\,.+$/;\\n\\nfunction urlParse(aUrl) {\\n  var match = aUrl.match(urlRegexp);\\n  if (!match) {\\n    return null;\\n  }\\n  return {\\n    scheme: match[1],\\n    auth: match[2],\\n    host: match[3],\\n    port: match[4],\\n    path: match[5]\\n  };\\n}\\nexports.urlParse = urlParse;\\n\\nfunction urlGenerate(aParsedUrl) {\\n  var url = '';\\n  if (aParsedUrl.scheme) {\\n    url += aParsedUrl.scheme + ':';\\n  }\\n  url += '//';\\n  if (aParsedUrl.auth) {\\n    url += aParsedUrl.auth + '@';\\n  }\\n  if (aParsedUrl.host) {\\n    url += aParsedUrl.host;\\n  }\\n  if (aParsedUrl.port) {\\n    url += \\\":\\\" + aParsedUrl.port\\n  }\\n  if (aParsedUrl.path) {\\n    url += aParsedUrl.path;\\n  }\\n  return url;\\n}\\nexports.urlGenerate = urlGenerate;\\n\\n/**\\n * Normalizes a path, or the path portion of a URL:\\n *\\n * - Replaces consecutive slashes with one slash.\\n * - Removes unnecessary '.' parts.\\n * - Removes unnecessary '<dir>/..' parts.\\n *\\n * Based on code in the Node.js 'path' core module.\\n *\\n * @param aPath The path or url to normalize.\\n */\\nfunction normalize(aPath) {\\n  var path = aPath;\\n  var url = urlParse(aPath);\\n  if (url) {\\n    if (!url.path) {\\n      return aPath;\\n    }\\n    path = url.path;\\n  }\\n  var isAbsolute = exports.isAbsolute(path);\\n\\n  var parts = path.split(/\\\\/+/);\\n  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\\n    part = parts[i];\\n    if (part === '.') {\\n      parts.splice(i, 1);\\n    } else if (part === '..') {\\n      up++;\\n    } else if (up > 0) {\\n      if (part === '') {\\n        // The first part is blank if the path is absolute. Trying to go\\n        // above the root is a no-op. Therefore we can remove all '..' parts\\n        // directly after the root.\\n        parts.splice(i + 1, up);\\n        up = 0;\\n      } else {\\n        parts.splice(i, 2);\\n        up--;\\n      }\\n    }\\n  }\\n  path = parts.join('/');\\n\\n  if (path === '') {\\n    path = isAbsolute ? '/' : '.';\\n  }\\n\\n  if (url) {\\n    url.path = path;\\n    return urlGenerate(url);\\n  }\\n  return path;\\n}\\nexports.normalize = normalize;\\n\\n/**\\n * Joins two paths/URLs.\\n *\\n * @param aRoot The root path or URL.\\n * @param aPath The path or URL to be joined with the root.\\n *\\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\\n *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\\n *   first.\\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\\n *   is updated with the result and aRoot is returned. Otherwise the result\\n *   is returned.\\n *   - If aPath is absolute, the result is aPath.\\n *   - Otherwise the two paths are joined with a slash.\\n * - Joining for example 'http://' and 'www.example.com' is also supported.\\n */\\nfunction join(aRoot, aPath) {\\n  if (aRoot === \\\"\\\") {\\n    aRoot = \\\".\\\";\\n  }\\n  if (aPath === \\\"\\\") {\\n    aPath = \\\".\\\";\\n  }\\n  var aPathUrl = urlParse(aPath);\\n  var aRootUrl = urlParse(aRoot);\\n  if (aRootUrl) {\\n    aRoot = aRootUrl.path || '/';\\n  }\\n\\n  // `join(foo, '//www.example.org')`\\n  if (aPathUrl && !aPathUrl.scheme) {\\n    if (aRootUrl) {\\n      aPathUrl.scheme = aRootUrl.scheme;\\n    }\\n    return urlGenerate(aPathUrl);\\n  }\\n\\n  if (aPathUrl || aPath.match(dataUrlRegexp)) {\\n    return aPath;\\n  }\\n\\n  // `join('http://', 'www.example.com')`\\n  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\\n    aRootUrl.host = aPath;\\n    return urlGenerate(aRootUrl);\\n  }\\n\\n  var joined = aPath.charAt(0) === '/'\\n    ? aPath\\n    : normalize(aRoot.replace(/\\\\/+$/, '') + '/' + aPath);\\n\\n  if (aRootUrl) {\\n    aRootUrl.path = joined;\\n    return urlGenerate(aRootUrl);\\n  }\\n  return joined;\\n}\\nexports.join = join;\\n\\nexports.isAbsolute = function (aPath) {\\n  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\\n};\\n\\n/**\\n * Make a path relative to a URL or another path.\\n *\\n * @param aRoot The root path or URL.\\n * @param aPath The path or URL to be made relative to aRoot.\\n */\\nfunction relative(aRoot, aPath) {\\n  if (aRoot === \\\"\\\") {\\n    aRoot = \\\".\\\";\\n  }\\n\\n  aRoot = aRoot.replace(/\\\\/$/, '');\\n\\n  // It is possible for the path to be above the root. In this case, simply\\n  // checking whether the root is a prefix of the path won't work. Instead, we\\n  // need to remove components from the root one by one, until either we find\\n  // a prefix that fits, or we run out of components to remove.\\n  var level = 0;\\n  while (aPath.indexOf(aRoot + '/') !== 0) {\\n    var index = aRoot.lastIndexOf(\\\"/\\\");\\n    if (index < 0) {\\n      return aPath;\\n    }\\n\\n    // If the only part of the root that is left is the scheme (i.e. http://,\\n    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\\n    // have exhausted all components, so the path is not relative to the root.\\n    aRoot = aRoot.slice(0, index);\\n    if (aRoot.match(/^([^\\\\/]+:\\\\/)?\\\\/*$/)) {\\n      return aPath;\\n    }\\n\\n    ++level;\\n  }\\n\\n  // Make sure we add a \\\"../\\\" for each component we removed from the root.\\n  return Array(level + 1).join(\\\"../\\\") + aPath.substr(aRoot.length + 1);\\n}\\nexports.relative = relative;\\n\\nvar supportsNullProto = (function () {\\n  var obj = Object.create(null);\\n  return !('__proto__' in obj);\\n}());\\n\\nfunction identity (s) {\\n  return s;\\n}\\n\\n/**\\n * Because behavior goes wacky when you set `__proto__` on objects, we\\n * have to prefix all the strings in our set with an arbitrary character.\\n *\\n * See https://github.com/mozilla/source-map/pull/31 and\\n * https://github.com/mozilla/source-map/issues/30\\n *\\n * @param String aStr\\n */\\nfunction toSetString(aStr) {\\n  if (isProtoString(aStr)) {\\n    return '$' + aStr;\\n  }\\n\\n  return aStr;\\n}\\nexports.toSetString = supportsNullProto ? identity : toSetString;\\n\\nfunction fromSetString(aStr) {\\n  if (isProtoString(aStr)) {\\n    return aStr.slice(1);\\n  }\\n\\n  return aStr;\\n}\\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\\n\\nfunction isProtoString(s) {\\n  if (!s) {\\n    return false;\\n  }\\n\\n  var length = s.length;\\n\\n  if (length < 9 /* \\\"__proto__\\\".length */) {\\n    return false;\\n  }\\n\\n  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\\n      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\\n      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\\n      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\\n      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\\n      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\\n      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\\n      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\\n      s.charCodeAt(length - 9) !== 95  /* '_' */) {\\n    return false;\\n  }\\n\\n  for (var i = length - 10; i >= 0; i--) {\\n    if (s.charCodeAt(i) !== 36 /* '$' */) {\\n      return false;\\n    }\\n  }\\n\\n  return true;\\n}\\n\\n/**\\n * Comparator between two mappings where the original positions are compared.\\n *\\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\\n * mappings with the same original source/line/column, but different generated\\n * line and column the same. Useful when searching for a mapping with a\\n * stubbed out mapping.\\n */\\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\\n  var cmp = strcmp(mappingA.source, mappingB.source);\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.originalLine - mappingB.originalLine;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\\n  if (cmp !== 0 || onlyCompareOriginal) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.generatedLine - mappingB.generatedLine;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  return strcmp(mappingA.name, mappingB.name);\\n}\\nexports.compareByOriginalPositions = compareByOriginalPositions;\\n\\n/**\\n * Comparator between two mappings with deflated source and name indices where\\n * the generated positions are compared.\\n *\\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\\n * mappings with the same generated line and column, but different\\n * source/name/original line and column the same. Useful when searching for a\\n * mapping with a stubbed out mapping.\\n */\\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\\n  if (cmp !== 0 || onlyCompareGenerated) {\\n    return cmp;\\n  }\\n\\n  cmp = strcmp(mappingA.source, mappingB.source);\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.originalLine - mappingB.originalLine;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  return strcmp(mappingA.name, mappingB.name);\\n}\\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\\n\\nfunction strcmp(aStr1, aStr2) {\\n  if (aStr1 === aStr2) {\\n    return 0;\\n  }\\n\\n  if (aStr1 === null) {\\n    return 1; // aStr2 !== null\\n  }\\n\\n  if (aStr2 === null) {\\n    return -1; // aStr1 !== null\\n  }\\n\\n  if (aStr1 > aStr2) {\\n    return 1;\\n  }\\n\\n  return -1;\\n}\\n\\n/**\\n * Comparator between two mappings with inflated source and name strings where\\n * the generated positions are compared.\\n */\\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = strcmp(mappingA.source, mappingB.source);\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.originalLine - mappingB.originalLine;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\\n  if (cmp !== 0) {\\n    return cmp;\\n  }\\n\\n  return strcmp(mappingA.name, mappingB.name);\\n}\\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\\n\\n/**\\n * Strip any JSON XSSI avoidance prefix from the string (as documented\\n * in the source maps specification), and then parse the string as\\n * JSON.\\n */\\nfunction parseSourceMapInput(str) {\\n  return JSON.parse(str.replace(/^\\\\)]}'[^\\\\n]*\\\\n/, ''));\\n}\\nexports.parseSourceMapInput = parseSourceMapInput;\\n\\n/**\\n * Compute the URL of a source given the the source root, the source's\\n * URL, and the source map's URL.\\n */\\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\\n  sourceURL = sourceURL || '';\\n\\n  if (sourceRoot) {\\n    // This follows what Chrome does.\\n    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\\n      sourceRoot += '/';\\n    }\\n    // The spec says:\\n    //   Line 4: An optional source root, useful for relocating source\\n    //   files on a server or removing repeated values in the\\n    //   “sources” entry.  This value is prepended to the individual\\n    //   entries in the “source” field.\\n    sourceURL = sourceRoot + sourceURL;\\n  }\\n\\n  // Historically, SourceMapConsumer did not take the sourceMapURL as\\n  // a parameter.  This mode is still somewhat supported, which is why\\n  // this code block is conditional.  However, it's preferable to pass\\n  // the source map URL to SourceMapConsumer, so that this function\\n  // can implement the source URL resolution algorithm as outlined in\\n  // the spec.  This block is basically the equivalent of:\\n  //    new URL(sourceURL, sourceMapURL).toString()\\n  // ... except it avoids using URL, which wasn't available in the\\n  // older releases of node still supported by this library.\\n  //\\n  // The spec says:\\n  //   If the sources are not absolute URLs after prepending of the\\n  //   “sourceRoot”, the sources are resolved relative to the\\n  //   SourceMap (like resolving script src in a html document).\\n  if (sourceMapURL) {\\n    var parsed = urlParse(sourceMapURL);\\n    if (!parsed) {\\n      throw new Error(\\\"sourceMapURL could not be parsed\\\");\\n    }\\n    if (parsed.path) {\\n      // Strip the last path component, but keep the \\\"/\\\".\\n      var index = parsed.path.lastIndexOf('/');\\n      if (index >= 0) {\\n        parsed.path = parsed.path.substring(0, index + 1);\\n      }\\n    }\\n    sourceURL = join(urlGenerate(parsed), sourceURL);\\n  }\\n\\n  return normalize(sourceURL);\\n}\\nexports.computeSourceURL = computeSourceURL;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/util.js\\n// module id = 4\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nvar util = require('./util');\\nvar has = Object.prototype.hasOwnProperty;\\nvar hasNativeMap = typeof Map !== \\\"undefined\\\";\\n\\n/**\\n * A data structure which is a combination of an array and a set. Adding a new\\n * member is O(1), testing for membership is O(1), and finding the index of an\\n * element is O(1). Removing elements from the set is not supported. Only\\n * strings are supported for membership.\\n */\\nfunction ArraySet() {\\n  this._array = [];\\n  this._set = hasNativeMap ? new Map() : Object.create(null);\\n}\\n\\n/**\\n * Static method for creating ArraySet instances from an existing array.\\n */\\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\\n  var set = new ArraySet();\\n  for (var i = 0, len = aArray.length; i < len; i++) {\\n    set.add(aArray[i], aAllowDuplicates);\\n  }\\n  return set;\\n};\\n\\n/**\\n * Return how many unique items are in this ArraySet. If duplicates have been\\n * added, than those do not count towards the size.\\n *\\n * @returns Number\\n */\\nArraySet.prototype.size = function ArraySet_size() {\\n  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\\n};\\n\\n/**\\n * Add the given string to this set.\\n *\\n * @param String aStr\\n */\\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\\n  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\\n  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\\n  var idx = this._array.length;\\n  if (!isDuplicate || aAllowDuplicates) {\\n    this._array.push(aStr);\\n  }\\n  if (!isDuplicate) {\\n    if (hasNativeMap) {\\n      this._set.set(aStr, idx);\\n    } else {\\n      this._set[sStr] = idx;\\n    }\\n  }\\n};\\n\\n/**\\n * Is the given string a member of this set?\\n *\\n * @param String aStr\\n */\\nArraySet.prototype.has = function ArraySet_has(aStr) {\\n  if (hasNativeMap) {\\n    return this._set.has(aStr);\\n  } else {\\n    var sStr = util.toSetString(aStr);\\n    return has.call(this._set, sStr);\\n  }\\n};\\n\\n/**\\n * What is the index of the given string in the array?\\n *\\n * @param String aStr\\n */\\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\\n  if (hasNativeMap) {\\n    var idx = this._set.get(aStr);\\n    if (idx >= 0) {\\n        return idx;\\n    }\\n  } else {\\n    var sStr = util.toSetString(aStr);\\n    if (has.call(this._set, sStr)) {\\n      return this._set[sStr];\\n    }\\n  }\\n\\n  throw new Error('\\\"' + aStr + '\\\" is not in the set.');\\n};\\n\\n/**\\n * What is the element at the given index?\\n *\\n * @param Number aIdx\\n */\\nArraySet.prototype.at = function ArraySet_at(aIdx) {\\n  if (aIdx >= 0 && aIdx < this._array.length) {\\n    return this._array[aIdx];\\n  }\\n  throw new Error('No element indexed by ' + aIdx);\\n};\\n\\n/**\\n * Returns the array representation of this set (which has the proper indices\\n * indicated by indexOf). Note that this is a copy of the internal array used\\n * for storing the members so that no one can mess with internal state.\\n */\\nArraySet.prototype.toArray = function ArraySet_toArray() {\\n  return this._array.slice();\\n};\\n\\nexports.ArraySet = ArraySet;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/array-set.js\\n// module id = 5\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2014 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nvar util = require('./util');\\n\\n/**\\n * Determine whether mappingB is after mappingA with respect to generated\\n * position.\\n */\\nfunction generatedPositionAfter(mappingA, mappingB) {\\n  // Optimized for most common case\\n  var lineA = mappingA.generatedLine;\\n  var lineB = mappingB.generatedLine;\\n  var columnA = mappingA.generatedColumn;\\n  var columnB = mappingB.generatedColumn;\\n  return lineB > lineA || lineB == lineA && columnB >= columnA ||\\n         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\\n}\\n\\n/**\\n * A data structure to provide a sorted view of accumulated mappings in a\\n * performance conscious manner. It trades a neglibable overhead in general\\n * case for a large speedup in case of mappings being added in order.\\n */\\nfunction MappingList() {\\n  this._array = [];\\n  this._sorted = true;\\n  // Serves as infimum\\n  this._last = {generatedLine: -1, generatedColumn: 0};\\n}\\n\\n/**\\n * Iterate through internal items. This method takes the same arguments that\\n * `Array.prototype.forEach` takes.\\n *\\n * NOTE: The order of the mappings is NOT guaranteed.\\n */\\nMappingList.prototype.unsortedForEach =\\n  function MappingList_forEach(aCallback, aThisArg) {\\n    this._array.forEach(aCallback, aThisArg);\\n  };\\n\\n/**\\n * Add the given source mapping.\\n *\\n * @param Object aMapping\\n */\\nMappingList.prototype.add = function MappingList_add(aMapping) {\\n  if (generatedPositionAfter(this._last, aMapping)) {\\n    this._last = aMapping;\\n    this._array.push(aMapping);\\n  } else {\\n    this._sorted = false;\\n    this._array.push(aMapping);\\n  }\\n};\\n\\n/**\\n * Returns the flat, sorted array of mappings. The mappings are sorted by\\n * generated position.\\n *\\n * WARNING: This method returns internal data without copying, for\\n * performance. The return value must NOT be mutated, and should be treated as\\n * an immutable borrow. If you want to take ownership, you must make your own\\n * copy.\\n */\\nMappingList.prototype.toArray = function MappingList_toArray() {\\n  if (!this._sorted) {\\n    this._array.sort(util.compareByGeneratedPositionsInflated);\\n    this._sorted = true;\\n  }\\n  return this._array;\\n};\\n\\nexports.MappingList = MappingList;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/mapping-list.js\\n// module id = 6\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nvar util = require('./util');\\nvar binarySearch = require('./binary-search');\\nvar ArraySet = require('./array-set').ArraySet;\\nvar base64VLQ = require('./base64-vlq');\\nvar quickSort = require('./quick-sort').quickSort;\\n\\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\\n  var sourceMap = aSourceMap;\\n  if (typeof aSourceMap === 'string') {\\n    sourceMap = util.parseSourceMapInput(aSourceMap);\\n  }\\n\\n  return sourceMap.sections != null\\n    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\\n    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\\n}\\n\\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\\n  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\\n}\\n\\n/**\\n * The version of the source mapping spec that we are consuming.\\n */\\nSourceMapConsumer.prototype._version = 3;\\n\\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\\n// parsed mapping coordinates from the source map's \\\"mappings\\\" attribute. They\\n// are lazily instantiated, accessed via the `_generatedMappings` and\\n// `_originalMappings` getters respectively, and we only parse the mappings\\n// and create these arrays once queried for a source location. We jump through\\n// these hoops because there can be many thousands of mappings, and parsing\\n// them is expensive, so we only want to do it if we must.\\n//\\n// Each object in the arrays is of the form:\\n//\\n//     {\\n//       generatedLine: The line number in the generated code,\\n//       generatedColumn: The column number in the generated code,\\n//       source: The path to the original source file that generated this\\n//               chunk of code,\\n//       originalLine: The line number in the original source that\\n//                     corresponds to this chunk of generated code,\\n//       originalColumn: The column number in the original source that\\n//                       corresponds to this chunk of generated code,\\n//       name: The name of the original symbol which generated this chunk of\\n//             code.\\n//     }\\n//\\n// All properties except for `generatedLine` and `generatedColumn` can be\\n// `null`.\\n//\\n// `_generatedMappings` is ordered by the generated positions.\\n//\\n// `_originalMappings` is ordered by the original positions.\\n\\nSourceMapConsumer.prototype.__generatedMappings = null;\\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\\n  configurable: true,\\n  enumerable: true,\\n  get: function () {\\n    if (!this.__generatedMappings) {\\n      this._parseMappings(this._mappings, this.sourceRoot);\\n    }\\n\\n    return this.__generatedMappings;\\n  }\\n});\\n\\nSourceMapConsumer.prototype.__originalMappings = null;\\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\\n  configurable: true,\\n  enumerable: true,\\n  get: function () {\\n    if (!this.__originalMappings) {\\n      this._parseMappings(this._mappings, this.sourceRoot);\\n    }\\n\\n    return this.__originalMappings;\\n  }\\n});\\n\\nSourceMapConsumer.prototype._charIsMappingSeparator =\\n  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\\n    var c = aStr.charAt(index);\\n    return c === \\\";\\\" || c === \\\",\\\";\\n  };\\n\\n/**\\n * Parse the mappings in a string in to a data structure which we can easily\\n * query (the ordered arrays in the `this.__generatedMappings` and\\n * `this.__originalMappings` properties).\\n */\\nSourceMapConsumer.prototype._parseMappings =\\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\\n    throw new Error(\\\"Subclasses must implement _parseMappings\\\");\\n  };\\n\\nSourceMapConsumer.GENERATED_ORDER = 1;\\nSourceMapConsumer.ORIGINAL_ORDER = 2;\\n\\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\\n\\n/**\\n * Iterate over each mapping between an original source/line/column and a\\n * generated line/column in this source map.\\n *\\n * @param Function aCallback\\n *        The function that is called with each mapping.\\n * @param Object aContext\\n *        Optional. If specified, this object will be the value of `this` every\\n *        time that `aCallback` is called.\\n * @param aOrder\\n *        Either `SourceMapConsumer.GENERATED_ORDER` or\\n *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\\n *        iterate over the mappings sorted by the generated file's line/column\\n *        order or the original's source/line/column order, respectively. Defaults to\\n *        `SourceMapConsumer.GENERATED_ORDER`.\\n */\\nSourceMapConsumer.prototype.eachMapping =\\n  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\\n    var context = aContext || null;\\n    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\\n\\n    var mappings;\\n    switch (order) {\\n    case SourceMapConsumer.GENERATED_ORDER:\\n      mappings = this._generatedMappings;\\n      break;\\n    case SourceMapConsumer.ORIGINAL_ORDER:\\n      mappings = this._originalMappings;\\n      break;\\n    default:\\n      throw new Error(\\\"Unknown order of iteration.\\\");\\n    }\\n\\n    var sourceRoot = this.sourceRoot;\\n    mappings.map(function (mapping) {\\n      var source = mapping.source === null ? null : this._sources.at(mapping.source);\\n      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\\n      return {\\n        source: source,\\n        generatedLine: mapping.generatedLine,\\n        generatedColumn: mapping.generatedColumn,\\n        originalLine: mapping.originalLine,\\n        originalColumn: mapping.originalColumn,\\n        name: mapping.name === null ? null : this._names.at(mapping.name)\\n      };\\n    }, this).forEach(aCallback, context);\\n  };\\n\\n/**\\n * Returns all generated line and column information for the original source,\\n * line, and column provided. If no column is provided, returns all mappings\\n * corresponding to a either the line we are searching for or the next\\n * closest line that has any mappings. Otherwise, returns all mappings\\n * corresponding to the given line and either the column we are searching for\\n * or the next closest column that has any offsets.\\n *\\n * The only argument is an object with the following properties:\\n *\\n *   - source: The filename of the original source.\\n *   - line: The line number in the original source.  The line number is 1-based.\\n *   - column: Optional. the column number in the original source.\\n *    The column number is 0-based.\\n *\\n * and an array of objects is returned, each with the following properties:\\n *\\n *   - line: The line number in the generated source, or null.  The\\n *    line number is 1-based.\\n *   - column: The column number in the generated source, or null.\\n *    The column number is 0-based.\\n */\\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\\n  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\\n    var line = util.getArg(aArgs, 'line');\\n\\n    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\\n    // returns the index of the closest mapping less than the needle. By\\n    // setting needle.originalColumn to 0, we thus find the last mapping for\\n    // the given line, provided such a mapping exists.\\n    var needle = {\\n      source: util.getArg(aArgs, 'source'),\\n      originalLine: line,\\n      originalColumn: util.getArg(aArgs, 'column', 0)\\n    };\\n\\n    needle.source = this._findSourceIndex(needle.source);\\n    if (needle.source < 0) {\\n      return [];\\n    }\\n\\n    var mappings = [];\\n\\n    var index = this._findMapping(needle,\\n                                  this._originalMappings,\\n                                  \\\"originalLine\\\",\\n                                  \\\"originalColumn\\\",\\n                                  util.compareByOriginalPositions,\\n                                  binarySearch.LEAST_UPPER_BOUND);\\n    if (index >= 0) {\\n      var mapping = this._originalMappings[index];\\n\\n      if (aArgs.column === undefined) {\\n        var originalLine = mapping.originalLine;\\n\\n        // Iterate until either we run out of mappings, or we run into\\n        // a mapping for a different line than the one we found. Since\\n        // mappings are sorted, this is guaranteed to find all mappings for\\n        // the line we found.\\n        while (mapping && mapping.originalLine === originalLine) {\\n          mappings.push({\\n            line: util.getArg(mapping, 'generatedLine', null),\\n            column: util.getArg(mapping, 'generatedColumn', null),\\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\\n          });\\n\\n          mapping = this._originalMappings[++index];\\n        }\\n      } else {\\n        var originalColumn = mapping.originalColumn;\\n\\n        // Iterate until either we run out of mappings, or we run into\\n        // a mapping for a different line than the one we were searching for.\\n        // Since mappings are sorted, this is guaranteed to find all mappings for\\n        // the line we are searching for.\\n        while (mapping &&\\n               mapping.originalLine === line &&\\n               mapping.originalColumn == originalColumn) {\\n          mappings.push({\\n            line: util.getArg(mapping, 'generatedLine', null),\\n            column: util.getArg(mapping, 'generatedColumn', null),\\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\\n          });\\n\\n          mapping = this._originalMappings[++index];\\n        }\\n      }\\n    }\\n\\n    return mappings;\\n  };\\n\\nexports.SourceMapConsumer = SourceMapConsumer;\\n\\n/**\\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\\n * query for information about the original file positions by giving it a file\\n * position in the generated source.\\n *\\n * The first parameter is the raw source map (either as a JSON string, or\\n * already parsed to an object). According to the spec, source maps have the\\n * following attributes:\\n *\\n *   - version: Which version of the source map spec this map is following.\\n *   - sources: An array of URLs to the original source files.\\n *   - names: An array of identifiers which can be referrenced by individual mappings.\\n *   - sourceRoot: Optional. The URL root from which all sources are relative.\\n *   - sourcesContent: Optional. An array of contents of the original source files.\\n *   - mappings: A string of base64 VLQs which contain the actual mappings.\\n *   - file: Optional. The generated file this source map is associated with.\\n *\\n * Here is an example source map, taken from the source map spec[0]:\\n *\\n *     {\\n *       version : 3,\\n *       file: \\\"out.js\\\",\\n *       sourceRoot : \\\"\\\",\\n *       sources: [\\\"foo.js\\\", \\\"bar.js\\\"],\\n *       names: [\\\"src\\\", \\\"maps\\\", \\\"are\\\", \\\"fun\\\"],\\n *       mappings: \\\"AA,AB;;ABCDE;\\\"\\n *     }\\n *\\n * The second parameter, if given, is a string whose value is the URL\\n * at which the source map was found.  This URL is used to compute the\\n * sources array.\\n *\\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\\n */\\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\\n  var sourceMap = aSourceMap;\\n  if (typeof aSourceMap === 'string') {\\n    sourceMap = util.parseSourceMapInput(aSourceMap);\\n  }\\n\\n  var version = util.getArg(sourceMap, 'version');\\n  var sources = util.getArg(sourceMap, 'sources');\\n  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\\n  // requires the array) to play nice here.\\n  var names = util.getArg(sourceMap, 'names', []);\\n  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\\n  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\\n  var mappings = util.getArg(sourceMap, 'mappings');\\n  var file = util.getArg(sourceMap, 'file', null);\\n\\n  // Once again, Sass deviates from the spec and supplies the version as a\\n  // string rather than a number, so we use loose equality checking here.\\n  if (version != this._version) {\\n    throw new Error('Unsupported version: ' + version);\\n  }\\n\\n  if (sourceRoot) {\\n    sourceRoot = util.normalize(sourceRoot);\\n  }\\n\\n  sources = sources\\n    .map(String)\\n    // Some source maps produce relative source paths like \\\"./foo.js\\\" instead of\\n    // \\\"foo.js\\\".  Normalize these first so that future comparisons will succeed.\\n    // See bugzil.la/1090768.\\n    .map(util.normalize)\\n    // Always ensure that absolute sources are internally stored relative to\\n    // the source root, if the source root is absolute. Not doing this would\\n    // be particularly problematic when the source root is a prefix of the\\n    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\\n    .map(function (source) {\\n      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\\n        ? util.relative(sourceRoot, source)\\n        : source;\\n    });\\n\\n  // Pass `true` below to allow duplicate names and sources. While source maps\\n  // are intended to be compressed and deduplicated, the TypeScript compiler\\n  // sometimes generates source maps with duplicates in them. See Github issue\\n  // #72 and bugzil.la/889492.\\n  this._names = ArraySet.fromArray(names.map(String), true);\\n  this._sources = ArraySet.fromArray(sources, true);\\n\\n  this._absoluteSources = this._sources.toArray().map(function (s) {\\n    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\\n  });\\n\\n  this.sourceRoot = sourceRoot;\\n  this.sourcesContent = sourcesContent;\\n  this._mappings = mappings;\\n  this._sourceMapURL = aSourceMapURL;\\n  this.file = file;\\n}\\n\\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\\n\\n/**\\n * Utility function to find the index of a source.  Returns -1 if not\\n * found.\\n */\\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\\n  var relativeSource = aSource;\\n  if (this.sourceRoot != null) {\\n    relativeSource = util.relative(this.sourceRoot, relativeSource);\\n  }\\n\\n  if (this._sources.has(relativeSource)) {\\n    return this._sources.indexOf(relativeSource);\\n  }\\n\\n  // Maybe aSource is an absolute URL as returned by |sources|.  In\\n  // this case we can't simply undo the transform.\\n  var i;\\n  for (i = 0; i < this._absoluteSources.length; ++i) {\\n    if (this._absoluteSources[i] == aSource) {\\n      return i;\\n    }\\n  }\\n\\n  return -1;\\n};\\n\\n/**\\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\\n *\\n * @param SourceMapGenerator aSourceMap\\n *        The source map that will be consumed.\\n * @param String aSourceMapURL\\n *        The URL at which the source map can be found (optional)\\n * @returns BasicSourceMapConsumer\\n */\\nBasicSourceMapConsumer.fromSourceMap =\\n  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\\n    var smc = Object.create(BasicSourceMapConsumer.prototype);\\n\\n    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\\n    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\\n    smc.sourceRoot = aSourceMap._sourceRoot;\\n    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\\n                                                            smc.sourceRoot);\\n    smc.file = aSourceMap._file;\\n    smc._sourceMapURL = aSourceMapURL;\\n    smc._absoluteSources = smc._sources.toArray().map(function (s) {\\n      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\\n    });\\n\\n    // Because we are modifying the entries (by converting string sources and\\n    // names to indices into the sources and names ArraySets), we have to make\\n    // a copy of the entry or else bad things happen. Shared mutable state\\n    // strikes again! See github issue #191.\\n\\n    var generatedMappings = aSourceMap._mappings.toArray().slice();\\n    var destGeneratedMappings = smc.__generatedMappings = [];\\n    var destOriginalMappings = smc.__originalMappings = [];\\n\\n    for (var i = 0, length = generatedMappings.length; i < length; i++) {\\n      var srcMapping = generatedMappings[i];\\n      var destMapping = new Mapping;\\n      destMapping.generatedLine = srcMapping.generatedLine;\\n      destMapping.generatedColumn = srcMapping.generatedColumn;\\n\\n      if (srcMapping.source) {\\n        destMapping.source = sources.indexOf(srcMapping.source);\\n        destMapping.originalLine = srcMapping.originalLine;\\n        destMapping.originalColumn = srcMapping.originalColumn;\\n\\n        if (srcMapping.name) {\\n          destMapping.name = names.indexOf(srcMapping.name);\\n        }\\n\\n        destOriginalMappings.push(destMapping);\\n      }\\n\\n      destGeneratedMappings.push(destMapping);\\n    }\\n\\n    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\\n\\n    return smc;\\n  };\\n\\n/**\\n * The version of the source mapping spec that we are consuming.\\n */\\nBasicSourceMapConsumer.prototype._version = 3;\\n\\n/**\\n * The list of original sources.\\n */\\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\\n  get: function () {\\n    return this._absoluteSources.slice();\\n  }\\n});\\n\\n/**\\n * Provide the JIT with a nice shape / hidden class.\\n */\\nfunction Mapping() {\\n  this.generatedLine = 0;\\n  this.generatedColumn = 0;\\n  this.source = null;\\n  this.originalLine = null;\\n  this.originalColumn = null;\\n  this.name = null;\\n}\\n\\n/**\\n * Parse the mappings in a string in to a data structure which we can easily\\n * query (the ordered arrays in the `this.__generatedMappings` and\\n * `this.__originalMappings` properties).\\n */\\nBasicSourceMapConsumer.prototype._parseMappings =\\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\\n    var generatedLine = 1;\\n    var previousGeneratedColumn = 0;\\n    var previousOriginalLine = 0;\\n    var previousOriginalColumn = 0;\\n    var previousSource = 0;\\n    var previousName = 0;\\n    var length = aStr.length;\\n    var index = 0;\\n    var cachedSegments = {};\\n    var temp = {};\\n    var originalMappings = [];\\n    var generatedMappings = [];\\n    var mapping, str, segment, end, value;\\n\\n    while (index < length) {\\n      if (aStr.charAt(index) === ';') {\\n        generatedLine++;\\n        index++;\\n        previousGeneratedColumn = 0;\\n      }\\n      else if (aStr.charAt(index) === ',') {\\n        index++;\\n      }\\n      else {\\n        mapping = new Mapping();\\n        mapping.generatedLine = generatedLine;\\n\\n        // Because each offset is encoded relative to the previous one,\\n        // many segments often have the same encoding. We can exploit this\\n        // fact by caching the parsed variable length fields of each segment,\\n        // allowing us to avoid a second parse if we encounter the same\\n        // segment again.\\n        for (end = index; end < length; end++) {\\n          if (this._charIsMappingSeparator(aStr, end)) {\\n            break;\\n          }\\n        }\\n        str = aStr.slice(index, end);\\n\\n        segment = cachedSegments[str];\\n        if (segment) {\\n          index += str.length;\\n        } else {\\n          segment = [];\\n          while (index < end) {\\n            base64VLQ.decode(aStr, index, temp);\\n            value = temp.value;\\n            index = temp.rest;\\n            segment.push(value);\\n          }\\n\\n          if (segment.length === 2) {\\n            throw new Error('Found a source, but no line and column');\\n          }\\n\\n          if (segment.length === 3) {\\n            throw new Error('Found a source and line, but no column');\\n          }\\n\\n          cachedSegments[str] = segment;\\n        }\\n\\n        // Generated column.\\n        mapping.generatedColumn = previousGeneratedColumn + segment[0];\\n        previousGeneratedColumn = mapping.generatedColumn;\\n\\n        if (segment.length > 1) {\\n          // Original source.\\n          mapping.source = previousSource + segment[1];\\n          previousSource += segment[1];\\n\\n          // Original line.\\n          mapping.originalLine = previousOriginalLine + segment[2];\\n          previousOriginalLine = mapping.originalLine;\\n          // Lines are stored 0-based\\n          mapping.originalLine += 1;\\n\\n          // Original column.\\n          mapping.originalColumn = previousOriginalColumn + segment[3];\\n          previousOriginalColumn = mapping.originalColumn;\\n\\n          if (segment.length > 4) {\\n            // Original name.\\n            mapping.name = previousName + segment[4];\\n            previousName += segment[4];\\n          }\\n        }\\n\\n        generatedMappings.push(mapping);\\n        if (typeof mapping.originalLine === 'number') {\\n          originalMappings.push(mapping);\\n        }\\n      }\\n    }\\n\\n    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\\n    this.__generatedMappings = generatedMappings;\\n\\n    quickSort(originalMappings, util.compareByOriginalPositions);\\n    this.__originalMappings = originalMappings;\\n  };\\n\\n/**\\n * Find the mapping that best matches the hypothetical \\\"needle\\\" mapping that\\n * we are searching for in the given \\\"haystack\\\" of mappings.\\n */\\nBasicSourceMapConsumer.prototype._findMapping =\\n  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\\n                                         aColumnName, aComparator, aBias) {\\n    // To return the position we are searching for, we must first find the\\n    // mapping for the given position and then return the opposite position it\\n    // points to. Because the mappings are sorted, we can use binary search to\\n    // find the best mapping.\\n\\n    if (aNeedle[aLineName] <= 0) {\\n      throw new TypeError('Line must be greater than or equal to 1, got '\\n                          + aNeedle[aLineName]);\\n    }\\n    if (aNeedle[aColumnName] < 0) {\\n      throw new TypeError('Column must be greater than or equal to 0, got '\\n                          + aNeedle[aColumnName]);\\n    }\\n\\n    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\\n  };\\n\\n/**\\n * Compute the last column for each generated mapping. The last column is\\n * inclusive.\\n */\\nBasicSourceMapConsumer.prototype.computeColumnSpans =\\n  function SourceMapConsumer_computeColumnSpans() {\\n    for (var index = 0; index < this._generatedMappings.length; ++index) {\\n      var mapping = this._generatedMappings[index];\\n\\n      // Mappings do not contain a field for the last generated columnt. We\\n      // can come up with an optimistic estimate, however, by assuming that\\n      // mappings are contiguous (i.e. given two consecutive mappings, the\\n      // first mapping ends where the second one starts).\\n      if (index + 1 < this._generatedMappings.length) {\\n        var nextMapping = this._generatedMappings[index + 1];\\n\\n        if (mapping.generatedLine === nextMapping.generatedLine) {\\n          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\\n          continue;\\n        }\\n      }\\n\\n      // The last mapping for each line spans the entire line.\\n      mapping.lastGeneratedColumn = Infinity;\\n    }\\n  };\\n\\n/**\\n * Returns the original source, line, and column information for the generated\\n * source's line and column positions provided. The only argument is an object\\n * with the following properties:\\n *\\n *   - line: The line number in the generated source.  The line number\\n *     is 1-based.\\n *   - column: The column number in the generated source.  The column\\n *     number is 0-based.\\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\\n *     closest element that is smaller than or greater than the one we are\\n *     searching for, respectively, if the exact element cannot be found.\\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\\n *\\n * and an object is returned with the following properties:\\n *\\n *   - source: The original source file, or null.\\n *   - line: The line number in the original source, or null.  The\\n *     line number is 1-based.\\n *   - column: The column number in the original source, or null.  The\\n *     column number is 0-based.\\n *   - name: The original identifier, or null.\\n */\\nBasicSourceMapConsumer.prototype.originalPositionFor =\\n  function SourceMapConsumer_originalPositionFor(aArgs) {\\n    var needle = {\\n      generatedLine: util.getArg(aArgs, 'line'),\\n      generatedColumn: util.getArg(aArgs, 'column')\\n    };\\n\\n    var index = this._findMapping(\\n      needle,\\n      this._generatedMappings,\\n      \\\"generatedLine\\\",\\n      \\\"generatedColumn\\\",\\n      util.compareByGeneratedPositionsDeflated,\\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\\n    );\\n\\n    if (index >= 0) {\\n      var mapping = this._generatedMappings[index];\\n\\n      if (mapping.generatedLine === needle.generatedLine) {\\n        var source = util.getArg(mapping, 'source', null);\\n        if (source !== null) {\\n          source = this._sources.at(source);\\n          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\\n        }\\n        var name = util.getArg(mapping, 'name', null);\\n        if (name !== null) {\\n          name = this._names.at(name);\\n        }\\n        return {\\n          source: source,\\n          line: util.getArg(mapping, 'originalLine', null),\\n          column: util.getArg(mapping, 'originalColumn', null),\\n          name: name\\n        };\\n      }\\n    }\\n\\n    return {\\n      source: null,\\n      line: null,\\n      column: null,\\n      name: null\\n    };\\n  };\\n\\n/**\\n * Return true if we have the source content for every source in the source\\n * map, false otherwise.\\n */\\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\\n  function BasicSourceMapConsumer_hasContentsOfAllSources() {\\n    if (!this.sourcesContent) {\\n      return false;\\n    }\\n    return this.sourcesContent.length >= this._sources.size() &&\\n      !this.sourcesContent.some(function (sc) { return sc == null; });\\n  };\\n\\n/**\\n * Returns the original source content. The only argument is the url of the\\n * original source file. Returns null if no original source content is\\n * available.\\n */\\nBasicSourceMapConsumer.prototype.sourceContentFor =\\n  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\\n    if (!this.sourcesContent) {\\n      return null;\\n    }\\n\\n    var index = this._findSourceIndex(aSource);\\n    if (index >= 0) {\\n      return this.sourcesContent[index];\\n    }\\n\\n    var relativeSource = aSource;\\n    if (this.sourceRoot != null) {\\n      relativeSource = util.relative(this.sourceRoot, relativeSource);\\n    }\\n\\n    var url;\\n    if (this.sourceRoot != null\\n        && (url = util.urlParse(this.sourceRoot))) {\\n      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\\n      // many users. We can help them out when they expect file:// URIs to\\n      // behave like it would if they were running a local HTTP server. See\\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\\n      var fileUriAbsPath = relativeSource.replace(/^file:\\\\/\\\\//, \\\"\\\");\\n      if (url.scheme == \\\"file\\\"\\n          && this._sources.has(fileUriAbsPath)) {\\n        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\\n      }\\n\\n      if ((!url.path || url.path == \\\"/\\\")\\n          && this._sources.has(\\\"/\\\" + relativeSource)) {\\n        return this.sourcesContent[this._sources.indexOf(\\\"/\\\" + relativeSource)];\\n      }\\n    }\\n\\n    // This function is used recursively from\\n    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\\n    // don't want to throw if we can't find the source - we just want to\\n    // return null, so we provide a flag to exit gracefully.\\n    if (nullOnMissing) {\\n      return null;\\n    }\\n    else {\\n      throw new Error('\\\"' + relativeSource + '\\\" is not in the SourceMap.');\\n    }\\n  };\\n\\n/**\\n * Returns the generated line and column information for the original source,\\n * line, and column positions provided. The only argument is an object with\\n * the following properties:\\n *\\n *   - source: The filename of the original source.\\n *   - line: The line number in the original source.  The line number\\n *     is 1-based.\\n *   - column: The column number in the original source.  The column\\n *     number is 0-based.\\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\\n *     closest element that is smaller than or greater than the one we are\\n *     searching for, respectively, if the exact element cannot be found.\\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\\n *\\n * and an object is returned with the following properties:\\n *\\n *   - line: The line number in the generated source, or null.  The\\n *     line number is 1-based.\\n *   - column: The column number in the generated source, or null.\\n *     The column number is 0-based.\\n */\\nBasicSourceMapConsumer.prototype.generatedPositionFor =\\n  function SourceMapConsumer_generatedPositionFor(aArgs) {\\n    var source = util.getArg(aArgs, 'source');\\n    source = this._findSourceIndex(source);\\n    if (source < 0) {\\n      return {\\n        line: null,\\n        column: null,\\n        lastColumn: null\\n      };\\n    }\\n\\n    var needle = {\\n      source: source,\\n      originalLine: util.getArg(aArgs, 'line'),\\n      originalColumn: util.getArg(aArgs, 'column')\\n    };\\n\\n    var index = this._findMapping(\\n      needle,\\n      this._originalMappings,\\n      \\\"originalLine\\\",\\n      \\\"originalColumn\\\",\\n      util.compareByOriginalPositions,\\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\\n    );\\n\\n    if (index >= 0) {\\n      var mapping = this._originalMappings[index];\\n\\n      if (mapping.source === needle.source) {\\n        return {\\n          line: util.getArg(mapping, 'generatedLine', null),\\n          column: util.getArg(mapping, 'generatedColumn', null),\\n          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\\n        };\\n      }\\n    }\\n\\n    return {\\n      line: null,\\n      column: null,\\n      lastColumn: null\\n    };\\n  };\\n\\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\\n\\n/**\\n * An IndexedSourceMapConsumer instance represents a parsed source map which\\n * we can query for information. It differs from BasicSourceMapConsumer in\\n * that it takes \\\"indexed\\\" source maps (i.e. ones with a \\\"sections\\\" field) as\\n * input.\\n *\\n * The first parameter is a raw source map (either as a JSON string, or already\\n * parsed to an object). According to the spec for indexed source maps, they\\n * have the following attributes:\\n *\\n *   - version: Which version of the source map spec this map is following.\\n *   - file: Optional. The generated file this source map is associated with.\\n *   - sections: A list of section definitions.\\n *\\n * Each value under the \\\"sections\\\" field has two fields:\\n *   - offset: The offset into the original specified at which this section\\n *       begins to apply, defined as an object with a \\\"line\\\" and \\\"column\\\"\\n *       field.\\n *   - map: A source map definition. This source map could also be indexed,\\n *       but doesn't have to be.\\n *\\n * Instead of the \\\"map\\\" field, it's also possible to have a \\\"url\\\" field\\n * specifying a URL to retrieve a source map from, but that's currently\\n * unsupported.\\n *\\n * Here's an example source map, taken from the source map spec[0], but\\n * modified to omit a section which uses the \\\"url\\\" field.\\n *\\n *  {\\n *    version : 3,\\n *    file: \\\"app.js\\\",\\n *    sections: [{\\n *      offset: {line:100, column:10},\\n *      map: {\\n *        version : 3,\\n *        file: \\\"section.js\\\",\\n *        sources: [\\\"foo.js\\\", \\\"bar.js\\\"],\\n *        names: [\\\"src\\\", \\\"maps\\\", \\\"are\\\", \\\"fun\\\"],\\n *        mappings: \\\"AAAA,E;;ABCDE;\\\"\\n *      }\\n *    }],\\n *  }\\n *\\n * The second parameter, if given, is a string whose value is the URL\\n * at which the source map was found.  This URL is used to compute the\\n * sources array.\\n *\\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\\n */\\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\\n  var sourceMap = aSourceMap;\\n  if (typeof aSourceMap === 'string') {\\n    sourceMap = util.parseSourceMapInput(aSourceMap);\\n  }\\n\\n  var version = util.getArg(sourceMap, 'version');\\n  var sections = util.getArg(sourceMap, 'sections');\\n\\n  if (version != this._version) {\\n    throw new Error('Unsupported version: ' + version);\\n  }\\n\\n  this._sources = new ArraySet();\\n  this._names = new ArraySet();\\n\\n  var lastOffset = {\\n    line: -1,\\n    column: 0\\n  };\\n  this._sections = sections.map(function (s) {\\n    if (s.url) {\\n      // The url field will require support for asynchronicity.\\n      // See https://github.com/mozilla/source-map/issues/16\\n      throw new Error('Support for url field in sections not implemented.');\\n    }\\n    var offset = util.getArg(s, 'offset');\\n    var offsetLine = util.getArg(offset, 'line');\\n    var offsetColumn = util.getArg(offset, 'column');\\n\\n    if (offsetLine < lastOffset.line ||\\n        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\\n      throw new Error('Section offsets must be ordered and non-overlapping.');\\n    }\\n    lastOffset = offset;\\n\\n    return {\\n      generatedOffset: {\\n        // The offset fields are 0-based, but we use 1-based indices when\\n        // encoding/decoding from VLQ.\\n        generatedLine: offsetLine + 1,\\n        generatedColumn: offsetColumn + 1\\n      },\\n      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\\n    }\\n  });\\n}\\n\\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\\n\\n/**\\n * The version of the source mapping spec that we are consuming.\\n */\\nIndexedSourceMapConsumer.prototype._version = 3;\\n\\n/**\\n * The list of original sources.\\n */\\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\\n  get: function () {\\n    var sources = [];\\n    for (var i = 0; i < this._sections.length; i++) {\\n      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\\n        sources.push(this._sections[i].consumer.sources[j]);\\n      }\\n    }\\n    return sources;\\n  }\\n});\\n\\n/**\\n * Returns the original source, line, and column information for the generated\\n * source's line and column positions provided. The only argument is an object\\n * with the following properties:\\n *\\n *   - line: The line number in the generated source.  The line number\\n *     is 1-based.\\n *   - column: The column number in the generated source.  The column\\n *     number is 0-based.\\n *\\n * and an object is returned with the following properties:\\n *\\n *   - source: The original source file, or null.\\n *   - line: The line number in the original source, or null.  The\\n *     line number is 1-based.\\n *   - column: The column number in the original source, or null.  The\\n *     column number is 0-based.\\n *   - name: The original identifier, or null.\\n */\\nIndexedSourceMapConsumer.prototype.originalPositionFor =\\n  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\\n    var needle = {\\n      generatedLine: util.getArg(aArgs, 'line'),\\n      generatedColumn: util.getArg(aArgs, 'column')\\n    };\\n\\n    // Find the section containing the generated position we're trying to map\\n    // to an original position.\\n    var sectionIndex = binarySearch.search(needle, this._sections,\\n      function(needle, section) {\\n        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\\n        if (cmp) {\\n          return cmp;\\n        }\\n\\n        return (needle.generatedColumn -\\n                section.generatedOffset.generatedColumn);\\n      });\\n    var section = this._sections[sectionIndex];\\n\\n    if (!section) {\\n      return {\\n        source: null,\\n        line: null,\\n        column: null,\\n        name: null\\n      };\\n    }\\n\\n    return section.consumer.originalPositionFor({\\n      line: needle.generatedLine -\\n        (section.generatedOffset.generatedLine - 1),\\n      column: needle.generatedColumn -\\n        (section.generatedOffset.generatedLine === needle.generatedLine\\n         ? section.generatedOffset.generatedColumn - 1\\n         : 0),\\n      bias: aArgs.bias\\n    });\\n  };\\n\\n/**\\n * Return true if we have the source content for every source in the source\\n * map, false otherwise.\\n */\\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\\n  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\\n    return this._sections.every(function (s) {\\n      return s.consumer.hasContentsOfAllSources();\\n    });\\n  };\\n\\n/**\\n * Returns the original source content. The only argument is the url of the\\n * original source file. Returns null if no original source content is\\n * available.\\n */\\nIndexedSourceMapConsumer.prototype.sourceContentFor =\\n  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\\n    for (var i = 0; i < this._sections.length; i++) {\\n      var section = this._sections[i];\\n\\n      var content = section.consumer.sourceContentFor(aSource, true);\\n      if (content) {\\n        return content;\\n      }\\n    }\\n    if (nullOnMissing) {\\n      return null;\\n    }\\n    else {\\n      throw new Error('\\\"' + aSource + '\\\" is not in the SourceMap.');\\n    }\\n  };\\n\\n/**\\n * Returns the generated line and column information for the original source,\\n * line, and column positions provided. The only argument is an object with\\n * the following properties:\\n *\\n *   - source: The filename of the original source.\\n *   - line: The line number in the original source.  The line number\\n *     is 1-based.\\n *   - column: The column number in the original source.  The column\\n *     number is 0-based.\\n *\\n * and an object is returned with the following properties:\\n *\\n *   - line: The line number in the generated source, or null.  The\\n *     line number is 1-based. \\n *   - column: The column number in the generated source, or null.\\n *     The column number is 0-based.\\n */\\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\\n  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\\n    for (var i = 0; i < this._sections.length; i++) {\\n      var section = this._sections[i];\\n\\n      // Only consider this section if the requested source is in the list of\\n      // sources of the consumer.\\n      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\\n        continue;\\n      }\\n      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\\n      if (generatedPosition) {\\n        var ret = {\\n          line: generatedPosition.line +\\n            (section.generatedOffset.generatedLine - 1),\\n          column: generatedPosition.column +\\n            (section.generatedOffset.generatedLine === generatedPosition.line\\n             ? section.generatedOffset.generatedColumn - 1\\n             : 0)\\n        };\\n        return ret;\\n      }\\n    }\\n\\n    return {\\n      line: null,\\n      column: null\\n    };\\n  };\\n\\n/**\\n * Parse the mappings in a string in to a data structure which we can easily\\n * query (the ordered arrays in the `this.__generatedMappings` and\\n * `this.__originalMappings` properties).\\n */\\nIndexedSourceMapConsumer.prototype._parseMappings =\\n  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\\n    this.__generatedMappings = [];\\n    this.__originalMappings = [];\\n    for (var i = 0; i < this._sections.length; i++) {\\n      var section = this._sections[i];\\n      var sectionMappings = section.consumer._generatedMappings;\\n      for (var j = 0; j < sectionMappings.length; j++) {\\n        var mapping = sectionMappings[j];\\n\\n        var source = section.consumer._sources.at(mapping.source);\\n        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\\n        this._sources.add(source);\\n        source = this._sources.indexOf(source);\\n\\n        var name = null;\\n        if (mapping.name) {\\n          name = section.consumer._names.at(mapping.name);\\n          this._names.add(name);\\n          name = this._names.indexOf(name);\\n        }\\n\\n        // The mappings coming from the consumer for the section have\\n        // generated positions relative to the start of the section, so we\\n        // need to offset them to be relative to the start of the concatenated\\n        // generated file.\\n        var adjustedMapping = {\\n          source: source,\\n          generatedLine: mapping.generatedLine +\\n            (section.generatedOffset.generatedLine - 1),\\n          generatedColumn: mapping.generatedColumn +\\n            (section.generatedOffset.generatedLine === mapping.generatedLine\\n            ? section.generatedOffset.generatedColumn - 1\\n            : 0),\\n          originalLine: mapping.originalLine,\\n          originalColumn: mapping.originalColumn,\\n          name: name\\n        };\\n\\n        this.__generatedMappings.push(adjustedMapping);\\n        if (typeof adjustedMapping.originalLine === 'number') {\\n          this.__originalMappings.push(adjustedMapping);\\n        }\\n      }\\n    }\\n\\n    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\\n    quickSort(this.__originalMappings, util.compareByOriginalPositions);\\n  };\\n\\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/source-map-consumer.js\\n// module id = 7\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nexports.GREATEST_LOWER_BOUND = 1;\\nexports.LEAST_UPPER_BOUND = 2;\\n\\n/**\\n * Recursive implementation of binary search.\\n *\\n * @param aLow Indices here and lower do not contain the needle.\\n * @param aHigh Indices here and higher do not contain the needle.\\n * @param aNeedle The element being searched for.\\n * @param aHaystack The non-empty array being searched.\\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\\n *     closest element that is smaller than or greater than the one we are\\n *     searching for, respectively, if the exact element cannot be found.\\n */\\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\\n  // This function terminates when one of the following is true:\\n  //\\n  //   1. We find the exact element we are looking for.\\n  //\\n  //   2. We did not find the exact element, but we can return the index of\\n  //      the next-closest element.\\n  //\\n  //   3. We did not find the exact element, and there is no next-closest\\n  //      element than the one we are searching for, so we return -1.\\n  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\\n  var cmp = aCompare(aNeedle, aHaystack[mid], true);\\n  if (cmp === 0) {\\n    // Found the element we are looking for.\\n    return mid;\\n  }\\n  else if (cmp > 0) {\\n    // Our needle is greater than aHaystack[mid].\\n    if (aHigh - mid > 1) {\\n      // The element is in the upper half.\\n      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\\n    }\\n\\n    // The exact needle element was not found in this haystack. Determine if\\n    // we are in termination case (3) or (2) and return the appropriate thing.\\n    if (aBias == exports.LEAST_UPPER_BOUND) {\\n      return aHigh < aHaystack.length ? aHigh : -1;\\n    } else {\\n      return mid;\\n    }\\n  }\\n  else {\\n    // Our needle is less than aHaystack[mid].\\n    if (mid - aLow > 1) {\\n      // The element is in the lower half.\\n      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\\n    }\\n\\n    // we are in termination case (3) or (2) and return the appropriate thing.\\n    if (aBias == exports.LEAST_UPPER_BOUND) {\\n      return mid;\\n    } else {\\n      return aLow < 0 ? -1 : aLow;\\n    }\\n  }\\n}\\n\\n/**\\n * This is an implementation of binary search which will always try and return\\n * the index of the closest element if there is no exact hit. This is because\\n * mappings between original and generated line/col pairs are single points,\\n * and there is an implicit region between each of them, so a miss just means\\n * that you aren't on the very start of a region.\\n *\\n * @param aNeedle The element you are looking for.\\n * @param aHaystack The array that is being searched.\\n * @param aCompare A function which takes the needle and an element in the\\n *     array and returns -1, 0, or 1 depending on whether the needle is less\\n *     than, equal to, or greater than the element, respectively.\\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\\n *     closest element that is smaller than or greater than the one we are\\n *     searching for, respectively, if the exact element cannot be found.\\n *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\\n */\\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\\n  if (aHaystack.length === 0) {\\n    return -1;\\n  }\\n\\n  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\\n                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\\n  if (index < 0) {\\n    return -1;\\n  }\\n\\n  // We have found either the exact element, or the next-closest element than\\n  // the one we are searching for. However, there may be more than one such\\n  // element. Make sure we always return the smallest of these.\\n  while (index - 1 >= 0) {\\n    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\\n      break;\\n    }\\n    --index;\\n  }\\n\\n  return index;\\n};\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/binary-search.js\\n// module id = 8\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\n// It turns out that some (most?) JavaScript engines don't self-host\\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\\n// custom comparator function, calling back and forth between the VM's C++ and\\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\\n// worse generated code for the comparator function than would be optimal. In\\n// fact, when sorting with a comparator, these costs outweigh the benefits of\\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\\n// a ~3500ms mean speed-up in `bench/bench.html`.\\n\\n/**\\n * Swap the elements indexed by `x` and `y` in the array `ary`.\\n *\\n * @param {Array} ary\\n *        The array.\\n * @param {Number} x\\n *        The index of the first item.\\n * @param {Number} y\\n *        The index of the second item.\\n */\\nfunction swap(ary, x, y) {\\n  var temp = ary[x];\\n  ary[x] = ary[y];\\n  ary[y] = temp;\\n}\\n\\n/**\\n * Returns a random integer within the range `low .. high` inclusive.\\n *\\n * @param {Number} low\\n *        The lower bound on the range.\\n * @param {Number} high\\n *        The upper bound on the range.\\n */\\nfunction randomIntInRange(low, high) {\\n  return Math.round(low + (Math.random() * (high - low)));\\n}\\n\\n/**\\n * The Quick Sort algorithm.\\n *\\n * @param {Array} ary\\n *        An array to sort.\\n * @param {function} comparator\\n *        Function to use to compare two items.\\n * @param {Number} p\\n *        Start index of the array\\n * @param {Number} r\\n *        End index of the array\\n */\\nfunction doQuickSort(ary, comparator, p, r) {\\n  // If our lower bound is less than our upper bound, we (1) partition the\\n  // array into two pieces and (2) recurse on each half. If it is not, this is\\n  // the empty array and our base case.\\n\\n  if (p < r) {\\n    // (1) Partitioning.\\n    //\\n    // The partitioning chooses a pivot between `p` and `r` and moves all\\n    // elements that are less than or equal to the pivot to the before it, and\\n    // all the elements that are greater than it after it. The effect is that\\n    // once partition is done, the pivot is in the exact place it will be when\\n    // the array is put in sorted order, and it will not need to be moved\\n    // again. This runs in O(n) time.\\n\\n    // Always choose a random pivot so that an input array which is reverse\\n    // sorted does not cause O(n^2) running time.\\n    var pivotIndex = randomIntInRange(p, r);\\n    var i = p - 1;\\n\\n    swap(ary, pivotIndex, r);\\n    var pivot = ary[r];\\n\\n    // Immediately after `j` is incremented in this loop, the following hold\\n    // true:\\n    //\\n    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\\n    //\\n    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\\n    for (var j = p; j < r; j++) {\\n      if (comparator(ary[j], pivot) <= 0) {\\n        i += 1;\\n        swap(ary, i, j);\\n      }\\n    }\\n\\n    swap(ary, i + 1, j);\\n    var q = i + 1;\\n\\n    // (2) Recurse on each half.\\n\\n    doQuickSort(ary, comparator, p, q - 1);\\n    doQuickSort(ary, comparator, q + 1, r);\\n  }\\n}\\n\\n/**\\n * Sort the given array in-place with the given comparator function.\\n *\\n * @param {Array} ary\\n *        An array to sort.\\n * @param {function} comparator\\n *        Function to use to compare two items.\\n */\\nexports.quickSort = function (ary, comparator) {\\n  doQuickSort(ary, comparator, 0, ary.length - 1);\\n};\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/quick-sort.js\\n// module id = 9\\n// module chunks = 0\",\"/* -*- Mode: js; js-indent-level: 2; -*- */\\n/*\\n * Copyright 2011 Mozilla Foundation and contributors\\n * Licensed under the New BSD license. See LICENSE or:\\n * http://opensource.org/licenses/BSD-3-Clause\\n */\\n\\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\\nvar util = require('./util');\\n\\n// Matches a Windows-style `\\\\r\\\\n` newline or a `\\\\n` newline used by all other\\n// operating systems these days (capturing the result).\\nvar REGEX_NEWLINE = /(\\\\r?\\\\n)/;\\n\\n// Newline character code for charCodeAt() comparisons\\nvar NEWLINE_CODE = 10;\\n\\n// Private symbol for identifying `SourceNode`s when multiple versions of\\n// the source-map library are loaded. This MUST NOT CHANGE across\\n// versions!\\nvar isSourceNode = \\\"$$$isSourceNode$$$\\\";\\n\\n/**\\n * SourceNodes provide a way to abstract over interpolating/concatenating\\n * snippets of generated JavaScript source code while maintaining the line and\\n * column information associated with the original source code.\\n *\\n * @param aLine The original line number.\\n * @param aColumn The original column number.\\n * @param aSource The original source's filename.\\n * @param aChunks Optional. An array of strings which are snippets of\\n *        generated JS, or other SourceNodes.\\n * @param aName The original identifier.\\n */\\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\\n  this.children = [];\\n  this.sourceContents = {};\\n  this.line = aLine == null ? null : aLine;\\n  this.column = aColumn == null ? null : aColumn;\\n  this.source = aSource == null ? null : aSource;\\n  this.name = aName == null ? null : aName;\\n  this[isSourceNode] = true;\\n  if (aChunks != null) this.add(aChunks);\\n}\\n\\n/**\\n * Creates a SourceNode from generated code and a SourceMapConsumer.\\n *\\n * @param aGeneratedCode The generated code\\n * @param aSourceMapConsumer The SourceMap for the generated code\\n * @param aRelativePath Optional. The path that relative sources in the\\n *        SourceMapConsumer should be relative to.\\n */\\nSourceNode.fromStringWithSourceMap =\\n  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\\n    // The SourceNode we want to fill with the generated code\\n    // and the SourceMap\\n    var node = new SourceNode();\\n\\n    // All even indices of this array are one line of the generated code,\\n    // while all odd indices are the newlines between two adjacent lines\\n    // (since `REGEX_NEWLINE` captures its match).\\n    // Processed fragments are accessed by calling `shiftNextLine`.\\n    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\\n    var remainingLinesIndex = 0;\\n    var shiftNextLine = function() {\\n      var lineContents = getNextLine();\\n      // The last line of a file might not have a newline.\\n      var newLine = getNextLine() || \\\"\\\";\\n      return lineContents + newLine;\\n\\n      function getNextLine() {\\n        return remainingLinesIndex < remainingLines.length ?\\n            remainingLines[remainingLinesIndex++] : undefined;\\n      }\\n    };\\n\\n    // We need to remember the position of \\\"remainingLines\\\"\\n    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\\n\\n    // The generate SourceNodes we need a code range.\\n    // To extract it current and last mapping is used.\\n    // Here we store the last mapping.\\n    var lastMapping = null;\\n\\n    aSourceMapConsumer.eachMapping(function (mapping) {\\n      if (lastMapping !== null) {\\n        // We add the code from \\\"lastMapping\\\" to \\\"mapping\\\":\\n        // First check if there is a new line in between.\\n        if (lastGeneratedLine < mapping.generatedLine) {\\n          // Associate first line with \\\"lastMapping\\\"\\n          addMappingWithCode(lastMapping, shiftNextLine());\\n          lastGeneratedLine++;\\n          lastGeneratedColumn = 0;\\n          // The remaining code is added without mapping\\n        } else {\\n          // There is no new line in between.\\n          // Associate the code between \\\"lastGeneratedColumn\\\" and\\n          // \\\"mapping.generatedColumn\\\" with \\\"lastMapping\\\"\\n          var nextLine = remainingLines[remainingLinesIndex] || '';\\n          var code = nextLine.substr(0, mapping.generatedColumn -\\n                                        lastGeneratedColumn);\\n          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\\n                                              lastGeneratedColumn);\\n          lastGeneratedColumn = mapping.generatedColumn;\\n          addMappingWithCode(lastMapping, code);\\n          // No more remaining code, continue\\n          lastMapping = mapping;\\n          return;\\n        }\\n      }\\n      // We add the generated code until the first mapping\\n      // to the SourceNode without any mapping.\\n      // Each line is added as separate string.\\n      while (lastGeneratedLine < mapping.generatedLine) {\\n        node.add(shiftNextLine());\\n        lastGeneratedLine++;\\n      }\\n      if (lastGeneratedColumn < mapping.generatedColumn) {\\n        var nextLine = remainingLines[remainingLinesIndex] || '';\\n        node.add(nextLine.substr(0, mapping.generatedColumn));\\n        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\\n        lastGeneratedColumn = mapping.generatedColumn;\\n      }\\n      lastMapping = mapping;\\n    }, this);\\n    // We have processed all mappings.\\n    if (remainingLinesIndex < remainingLines.length) {\\n      if (lastMapping) {\\n        // Associate the remaining code in the current line with \\\"lastMapping\\\"\\n        addMappingWithCode(lastMapping, shiftNextLine());\\n      }\\n      // and add the remaining lines without any mapping\\n      node.add(remainingLines.splice(remainingLinesIndex).join(\\\"\\\"));\\n    }\\n\\n    // Copy sourcesContent into SourceNode\\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\\n      if (content != null) {\\n        if (aRelativePath != null) {\\n          sourceFile = util.join(aRelativePath, sourceFile);\\n        }\\n        node.setSourceContent(sourceFile, content);\\n      }\\n    });\\n\\n    return node;\\n\\n    function addMappingWithCode(mapping, code) {\\n      if (mapping === null || mapping.source === undefined) {\\n        node.add(code);\\n      } else {\\n        var source = aRelativePath\\n          ? util.join(aRelativePath, mapping.source)\\n          : mapping.source;\\n        node.add(new SourceNode(mapping.originalLine,\\n                                mapping.originalColumn,\\n                                source,\\n                                code,\\n                                mapping.name));\\n      }\\n    }\\n  };\\n\\n/**\\n * Add a chunk of generated JS to this source node.\\n *\\n * @param aChunk A string snippet of generated JS code, another instance of\\n *        SourceNode, or an array where each member is one of those things.\\n */\\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\\n  if (Array.isArray(aChunk)) {\\n    aChunk.forEach(function (chunk) {\\n      this.add(chunk);\\n    }, this);\\n  }\\n  else if (aChunk[isSourceNode] || typeof aChunk === \\\"string\\\") {\\n    if (aChunk) {\\n      this.children.push(aChunk);\\n    }\\n  }\\n  else {\\n    throw new TypeError(\\n      \\\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \\\" + aChunk\\n    );\\n  }\\n  return this;\\n};\\n\\n/**\\n * Add a chunk of generated JS to the beginning of this source node.\\n *\\n * @param aChunk A string snippet of generated JS code, another instance of\\n *        SourceNode, or an array where each member is one of those things.\\n */\\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\\n  if (Array.isArray(aChunk)) {\\n    for (var i = aChunk.length-1; i >= 0; i--) {\\n      this.prepend(aChunk[i]);\\n    }\\n  }\\n  else if (aChunk[isSourceNode] || typeof aChunk === \\\"string\\\") {\\n    this.children.unshift(aChunk);\\n  }\\n  else {\\n    throw new TypeError(\\n      \\\"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \\\" + aChunk\\n    );\\n  }\\n  return this;\\n};\\n\\n/**\\n * Walk over the tree of JS snippets in this node and its children. The\\n * walking function is called once for each snippet of JS and is passed that\\n * snippet and the its original associated source's line/column location.\\n *\\n * @param aFn The traversal function.\\n */\\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\\n  var chunk;\\n  for (var i = 0, len = this.children.length; i < len; i++) {\\n    chunk = this.children[i];\\n    if (chunk[isSourceNode]) {\\n      chunk.walk(aFn);\\n    }\\n    else {\\n      if (chunk !== '') {\\n        aFn(chunk, { source: this.source,\\n                     line: this.line,\\n                     column: this.column,\\n                     name: this.name });\\n      }\\n    }\\n  }\\n};\\n\\n/**\\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\\n * each of `this.children`.\\n *\\n * @param aSep The separator.\\n */\\nSourceNode.prototype.join = function SourceNode_join(aSep) {\\n  var newChildren;\\n  var i;\\n  var len = this.children.length;\\n  if (len > 0) {\\n    newChildren = [];\\n    for (i = 0; i < len-1; i++) {\\n      newChildren.push(this.children[i]);\\n      newChildren.push(aSep);\\n    }\\n    newChildren.push(this.children[i]);\\n    this.children = newChildren;\\n  }\\n  return this;\\n};\\n\\n/**\\n * Call String.prototype.replace on the very right-most source snippet. Useful\\n * for trimming whitespace from the end of a source node, etc.\\n *\\n * @param aPattern The pattern to replace.\\n * @param aReplacement The thing to replace the pattern with.\\n */\\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\\n  var lastChild = this.children[this.children.length - 1];\\n  if (lastChild[isSourceNode]) {\\n    lastChild.replaceRight(aPattern, aReplacement);\\n  }\\n  else if (typeof lastChild === 'string') {\\n    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\\n  }\\n  else {\\n    this.children.push(''.replace(aPattern, aReplacement));\\n  }\\n  return this;\\n};\\n\\n/**\\n * Set the source content for a source file. This will be added to the SourceMapGenerator\\n * in the sourcesContent field.\\n *\\n * @param aSourceFile The filename of the source file\\n * @param aSourceContent The content of the source file\\n */\\nSourceNode.prototype.setSourceContent =\\n  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\\n    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\\n  };\\n\\n/**\\n * Walk over the tree of SourceNodes. The walking function is called for each\\n * source file content and is passed the filename and source content.\\n *\\n * @param aFn The traversal function.\\n */\\nSourceNode.prototype.walkSourceContents =\\n  function SourceNode_walkSourceContents(aFn) {\\n    for (var i = 0, len = this.children.length; i < len; i++) {\\n      if (this.children[i][isSourceNode]) {\\n        this.children[i].walkSourceContents(aFn);\\n      }\\n    }\\n\\n    var sources = Object.keys(this.sourceContents);\\n    for (var i = 0, len = sources.length; i < len; i++) {\\n      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\\n    }\\n  };\\n\\n/**\\n * Return the string representation of this source node. Walks over the tree\\n * and concatenates all the various snippets together to one string.\\n */\\nSourceNode.prototype.toString = function SourceNode_toString() {\\n  var str = \\\"\\\";\\n  this.walk(function (chunk) {\\n    str += chunk;\\n  });\\n  return str;\\n};\\n\\n/**\\n * Returns the string representation of this source node along with a source\\n * map.\\n */\\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\\n  var generated = {\\n    code: \\\"\\\",\\n    line: 1,\\n    column: 0\\n  };\\n  var map = new SourceMapGenerator(aArgs);\\n  var sourceMappingActive = false;\\n  var lastOriginalSource = null;\\n  var lastOriginalLine = null;\\n  var lastOriginalColumn = null;\\n  var lastOriginalName = null;\\n  this.walk(function (chunk, original) {\\n    generated.code += chunk;\\n    if (original.source !== null\\n        && original.line !== null\\n        && original.column !== null) {\\n      if(lastOriginalSource !== original.source\\n         || lastOriginalLine !== original.line\\n         || lastOriginalColumn !== original.column\\n         || lastOriginalName !== original.name) {\\n        map.addMapping({\\n          source: original.source,\\n          original: {\\n            line: original.line,\\n            column: original.column\\n          },\\n          generated: {\\n            line: generated.line,\\n            column: generated.column\\n          },\\n          name: original.name\\n        });\\n      }\\n      lastOriginalSource = original.source;\\n      lastOriginalLine = original.line;\\n      lastOriginalColumn = original.column;\\n      lastOriginalName = original.name;\\n      sourceMappingActive = true;\\n    } else if (sourceMappingActive) {\\n      map.addMapping({\\n        generated: {\\n          line: generated.line,\\n          column: generated.column\\n        }\\n      });\\n      lastOriginalSource = null;\\n      sourceMappingActive = false;\\n    }\\n    for (var idx = 0, length = chunk.length; idx < length; idx++) {\\n      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\\n        generated.line++;\\n        generated.column = 0;\\n        // Mappings end at eol\\n        if (idx + 1 === length) {\\n          lastOriginalSource = null;\\n          sourceMappingActive = false;\\n        } else if (sourceMappingActive) {\\n          map.addMapping({\\n            source: original.source,\\n            original: {\\n              line: original.line,\\n              column: original.column\\n            },\\n            generated: {\\n              line: generated.line,\\n              column: generated.column\\n            },\\n            name: original.name\\n          });\\n        }\\n      } else {\\n        generated.column++;\\n      }\\n    }\\n  });\\n  this.walkSourceContents(function (sourceFile, sourceContent) {\\n    map.setSourceContent(sourceFile, sourceContent);\\n  });\\n\\n  return { code: generated.code, map: map };\\n};\\n\\nexports.SourceNode = SourceNode;\\n\\n\\n\\n//////////////////\\n// WEBPACK FOOTER\\n// ./lib/source-node.js\\n// module id = 10\\n// module chunks = 0\"],\"sourceRoot\":\"\"}"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/array-set.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n  this._array = [];\n  this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n  var set = new ArraySet();\n  for (var i = 0, len = aArray.length; i < len; i++) {\n    set.add(aArray[i], aAllowDuplicates);\n  }\n  return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n  var idx = this._array.length;\n  if (!isDuplicate || aAllowDuplicates) {\n    this._array.push(aStr);\n  }\n  if (!isDuplicate) {\n    if (hasNativeMap) {\n      this._set.set(aStr, idx);\n    } else {\n      this._set[sStr] = idx;\n    }\n  }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n  if (hasNativeMap) {\n    return this._set.has(aStr);\n  } else {\n    var sStr = util.toSetString(aStr);\n    return has.call(this._set, sStr);\n  }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n  if (hasNativeMap) {\n    var idx = this._set.get(aStr);\n    if (idx >= 0) {\n        return idx;\n    }\n  } else {\n    var sStr = util.toSetString(aStr);\n    if (has.call(this._set, sStr)) {\n      return this._set[sStr];\n    }\n  }\n\n  throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n  if (aIdx >= 0 && aIdx < this._array.length) {\n    return this._array[aIdx];\n  }\n  throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n  return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/base64-vlq.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *  * Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *  * Neither the name of Google Inc. nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n//   Continuation\n//   |    Sign\n//   |    |\n//   V    V\n//   101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n  return aValue < 0\n    ? ((-aValue) << 1) + 1\n    : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n  var isNegative = (aValue & 1) === 1;\n  var shifted = aValue >> 1;\n  return isNegative\n    ? -shifted\n    : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n  var encoded = \"\";\n  var digit;\n\n  var vlq = toVLQSigned(aValue);\n\n  do {\n    digit = vlq & VLQ_BASE_MASK;\n    vlq >>>= VLQ_BASE_SHIFT;\n    if (vlq > 0) {\n      // There are still more digits in this value, so we must make sure the\n      // continuation bit is marked.\n      digit |= VLQ_CONTINUATION_BIT;\n    }\n    encoded += base64.encode(digit);\n  } while (vlq > 0);\n\n  return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n  var strLen = aStr.length;\n  var result = 0;\n  var shift = 0;\n  var continuation, digit;\n\n  do {\n    if (aIndex >= strLen) {\n      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n    }\n\n    digit = base64.decode(aStr.charCodeAt(aIndex++));\n    if (digit === -1) {\n      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n    }\n\n    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n    digit &= VLQ_BASE_MASK;\n    result = result + (digit << shift);\n    shift += VLQ_BASE_SHIFT;\n  } while (continuation);\n\n  aOutParam.value = fromVLQSigned(result);\n  aOutParam.rest = aIndex;\n};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/base64.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n  if (0 <= number && number < intToCharMap.length) {\n    return intToCharMap[number];\n  }\n  throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n  var bigA = 65;     // 'A'\n  var bigZ = 90;     // 'Z'\n\n  var littleA = 97;  // 'a'\n  var littleZ = 122; // 'z'\n\n  var zero = 48;     // '0'\n  var nine = 57;     // '9'\n\n  var plus = 43;     // '+'\n  var slash = 47;    // '/'\n\n  var littleOffset = 26;\n  var numberOffset = 52;\n\n  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n  if (bigA <= charCode && charCode <= bigZ) {\n    return (charCode - bigA);\n  }\n\n  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n  if (littleA <= charCode && charCode <= littleZ) {\n    return (charCode - littleA + littleOffset);\n  }\n\n  // 52 - 61: 0123456789\n  if (zero <= charCode && charCode <= nine) {\n    return (charCode - zero + numberOffset);\n  }\n\n  // 62: +\n  if (charCode == plus) {\n    return 62;\n  }\n\n  // 63: /\n  if (charCode == slash) {\n    return 63;\n  }\n\n  // Invalid base64 digit.\n  return -1;\n};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/binary-search.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n  // This function terminates when one of the following is true:\n  //\n  //   1. We find the exact element we are looking for.\n  //\n  //   2. We did not find the exact element, but we can return the index of\n  //      the next-closest element.\n  //\n  //   3. We did not find the exact element, and there is no next-closest\n  //      element than the one we are searching for, so we return -1.\n  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n  if (cmp === 0) {\n    // Found the element we are looking for.\n    return mid;\n  }\n  else if (cmp > 0) {\n    // Our needle is greater than aHaystack[mid].\n    if (aHigh - mid > 1) {\n      // The element is in the upper half.\n      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n    }\n\n    // The exact needle element was not found in this haystack. Determine if\n    // we are in termination case (3) or (2) and return the appropriate thing.\n    if (aBias == exports.LEAST_UPPER_BOUND) {\n      return aHigh < aHaystack.length ? aHigh : -1;\n    } else {\n      return mid;\n    }\n  }\n  else {\n    // Our needle is less than aHaystack[mid].\n    if (mid - aLow > 1) {\n      // The element is in the lower half.\n      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n    }\n\n    // we are in termination case (3) or (2) and return the appropriate thing.\n    if (aBias == exports.LEAST_UPPER_BOUND) {\n      return mid;\n    } else {\n      return aLow < 0 ? -1 : aLow;\n    }\n  }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n *     array and returns -1, 0, or 1 depending on whether the needle is less\n *     than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n  if (aHaystack.length === 0) {\n    return -1;\n  }\n\n  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n  if (index < 0) {\n    return -1;\n  }\n\n  // We have found either the exact element, or the next-closest element than\n  // the one we are searching for. However, there may be more than one such\n  // element. Make sure we always return the smallest of these.\n  while (index - 1 >= 0) {\n    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n      break;\n    }\n    --index;\n  }\n\n  return index;\n};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/mapping-list.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n  // Optimized for most common case\n  var lineA = mappingA.generatedLine;\n  var lineB = mappingB.generatedLine;\n  var columnA = mappingA.generatedColumn;\n  var columnB = mappingB.generatedColumn;\n  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n  this._array = [];\n  this._sorted = true;\n  // Serves as infimum\n  this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n  function MappingList_forEach(aCallback, aThisArg) {\n    this._array.forEach(aCallback, aThisArg);\n  };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n  if (generatedPositionAfter(this._last, aMapping)) {\n    this._last = aMapping;\n    this._array.push(aMapping);\n  } else {\n    this._sorted = false;\n    this._array.push(aMapping);\n  }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n  if (!this._sorted) {\n    this._array.sort(util.compareByGeneratedPositionsInflated);\n    this._sorted = true;\n  }\n  return this._array;\n};\n\nexports.MappingList = MappingList;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/quick-sort.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n *        The array.\n * @param {Number} x\n *        The index of the first item.\n * @param {Number} y\n *        The index of the second item.\n */\nfunction swap(ary, x, y) {\n  var temp = ary[x];\n  ary[x] = ary[y];\n  ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n *        The lower bound on the range.\n * @param {Number} high\n *        The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n  return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n *        An array to sort.\n * @param {function} comparator\n *        Function to use to compare two items.\n * @param {Number} p\n *        Start index of the array\n * @param {Number} r\n *        End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n  // If our lower bound is less than our upper bound, we (1) partition the\n  // array into two pieces and (2) recurse on each half. If it is not, this is\n  // the empty array and our base case.\n\n  if (p < r) {\n    // (1) Partitioning.\n    //\n    // The partitioning chooses a pivot between `p` and `r` and moves all\n    // elements that are less than or equal to the pivot to the before it, and\n    // all the elements that are greater than it after it. The effect is that\n    // once partition is done, the pivot is in the exact place it will be when\n    // the array is put in sorted order, and it will not need to be moved\n    // again. This runs in O(n) time.\n\n    // Always choose a random pivot so that an input array which is reverse\n    // sorted does not cause O(n^2) running time.\n    var pivotIndex = randomIntInRange(p, r);\n    var i = p - 1;\n\n    swap(ary, pivotIndex, r);\n    var pivot = ary[r];\n\n    // Immediately after `j` is incremented in this loop, the following hold\n    // true:\n    //\n    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n    //\n    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n    for (var j = p; j < r; j++) {\n      if (comparator(ary[j], pivot) <= 0) {\n        i += 1;\n        swap(ary, i, j);\n      }\n    }\n\n    swap(ary, i + 1, j);\n    var q = i + 1;\n\n    // (2) Recurse on each half.\n\n    doQuickSort(ary, comparator, p, q - 1);\n    doQuickSort(ary, comparator, q + 1, r);\n  }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n *        An array to sort.\n * @param {function} comparator\n *        Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n  doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/source-map-consumer.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  return sourceMap.sections != null\n    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n//     {\n//       generatedLine: The line number in the generated code,\n//       generatedColumn: The column number in the generated code,\n//       source: The path to the original source file that generated this\n//               chunk of code,\n//       originalLine: The line number in the original source that\n//                     corresponds to this chunk of generated code,\n//       originalColumn: The column number in the original source that\n//                       corresponds to this chunk of generated code,\n//       name: The name of the original symbol which generated this chunk of\n//             code.\n//     }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n  configurable: true,\n  enumerable: true,\n  get: function () {\n    if (!this.__generatedMappings) {\n      this._parseMappings(this._mappings, this.sourceRoot);\n    }\n\n    return this.__generatedMappings;\n  }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n  configurable: true,\n  enumerable: true,\n  get: function () {\n    if (!this.__originalMappings) {\n      this._parseMappings(this._mappings, this.sourceRoot);\n    }\n\n    return this.__originalMappings;\n  }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n    var c = aStr.charAt(index);\n    return c === \";\" || c === \",\";\n  };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    throw new Error(\"Subclasses must implement _parseMappings\");\n  };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n *        The function that is called with each mapping.\n * @param Object aContext\n *        Optional. If specified, this object will be the value of `this` every\n *        time that `aCallback` is called.\n * @param aOrder\n *        Either `SourceMapConsumer.GENERATED_ORDER` or\n *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n *        iterate over the mappings sorted by the generated file's line/column\n *        order or the original's source/line/column order, respectively. Defaults to\n *        `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n    var context = aContext || null;\n    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n    var mappings;\n    switch (order) {\n    case SourceMapConsumer.GENERATED_ORDER:\n      mappings = this._generatedMappings;\n      break;\n    case SourceMapConsumer.ORIGINAL_ORDER:\n      mappings = this._originalMappings;\n      break;\n    default:\n      throw new Error(\"Unknown order of iteration.\");\n    }\n\n    var sourceRoot = this.sourceRoot;\n    mappings.map(function (mapping) {\n      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n      return {\n        source: source,\n        generatedLine: mapping.generatedLine,\n        generatedColumn: mapping.generatedColumn,\n        originalLine: mapping.originalLine,\n        originalColumn: mapping.originalColumn,\n        name: mapping.name === null ? null : this._names.at(mapping.name)\n      };\n    }, this).forEach(aCallback, context);\n  };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number is 1-based.\n *   - column: Optional. the column number in the original source.\n *    The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *    line number is 1-based.\n *   - column: The column number in the generated source, or null.\n *    The column number is 0-based.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n    var line = util.getArg(aArgs, 'line');\n\n    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n    // returns the index of the closest mapping less than the needle. By\n    // setting needle.originalColumn to 0, we thus find the last mapping for\n    // the given line, provided such a mapping exists.\n    var needle = {\n      source: util.getArg(aArgs, 'source'),\n      originalLine: line,\n      originalColumn: util.getArg(aArgs, 'column', 0)\n    };\n\n    needle.source = this._findSourceIndex(needle.source);\n    if (needle.source < 0) {\n      return [];\n    }\n\n    var mappings = [];\n\n    var index = this._findMapping(needle,\n                                  this._originalMappings,\n                                  \"originalLine\",\n                                  \"originalColumn\",\n                                  util.compareByOriginalPositions,\n                                  binarySearch.LEAST_UPPER_BOUND);\n    if (index >= 0) {\n      var mapping = this._originalMappings[index];\n\n      if (aArgs.column === undefined) {\n        var originalLine = mapping.originalLine;\n\n        // Iterate until either we run out of mappings, or we run into\n        // a mapping for a different line than the one we found. Since\n        // mappings are sorted, this is guaranteed to find all mappings for\n        // the line we found.\n        while (mapping && mapping.originalLine === originalLine) {\n          mappings.push({\n            line: util.getArg(mapping, 'generatedLine', null),\n            column: util.getArg(mapping, 'generatedColumn', null),\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n          });\n\n          mapping = this._originalMappings[++index];\n        }\n      } else {\n        var originalColumn = mapping.originalColumn;\n\n        // Iterate until either we run out of mappings, or we run into\n        // a mapping for a different line than the one we were searching for.\n        // Since mappings are sorted, this is guaranteed to find all mappings for\n        // the line we are searching for.\n        while (mapping &&\n               mapping.originalLine === line &&\n               mapping.originalColumn == originalColumn) {\n          mappings.push({\n            line: util.getArg(mapping, 'generatedLine', null),\n            column: util.getArg(mapping, 'generatedColumn', null),\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n          });\n\n          mapping = this._originalMappings[++index];\n        }\n      }\n    }\n\n    return mappings;\n  };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n *   - version: Which version of the source map spec this map is following.\n *   - sources: An array of URLs to the original source files.\n *   - names: An array of identifiers which can be referrenced by individual mappings.\n *   - sourceRoot: Optional. The URL root from which all sources are relative.\n *   - sourcesContent: Optional. An array of contents of the original source files.\n *   - mappings: A string of base64 VLQs which contain the actual mappings.\n *   - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n *     {\n *       version : 3,\n *       file: \"out.js\",\n *       sourceRoot : \"\",\n *       sources: [\"foo.js\", \"bar.js\"],\n *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n *       mappings: \"AA,AB;;ABCDE;\"\n *     }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found.  This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  var version = util.getArg(sourceMap, 'version');\n  var sources = util.getArg(sourceMap, 'sources');\n  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n  // requires the array) to play nice here.\n  var names = util.getArg(sourceMap, 'names', []);\n  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n  var mappings = util.getArg(sourceMap, 'mappings');\n  var file = util.getArg(sourceMap, 'file', null);\n\n  // Once again, Sass deviates from the spec and supplies the version as a\n  // string rather than a number, so we use loose equality checking here.\n  if (version != this._version) {\n    throw new Error('Unsupported version: ' + version);\n  }\n\n  if (sourceRoot) {\n    sourceRoot = util.normalize(sourceRoot);\n  }\n\n  sources = sources\n    .map(String)\n    // Some source maps produce relative source paths like \"./foo.js\" instead of\n    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n    // See bugzil.la/1090768.\n    .map(util.normalize)\n    // Always ensure that absolute sources are internally stored relative to\n    // the source root, if the source root is absolute. Not doing this would\n    // be particularly problematic when the source root is a prefix of the\n    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n    .map(function (source) {\n      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n        ? util.relative(sourceRoot, source)\n        : source;\n    });\n\n  // Pass `true` below to allow duplicate names and sources. While source maps\n  // are intended to be compressed and deduplicated, the TypeScript compiler\n  // sometimes generates source maps with duplicates in them. See Github issue\n  // #72 and bugzil.la/889492.\n  this._names = ArraySet.fromArray(names.map(String), true);\n  this._sources = ArraySet.fromArray(sources, true);\n\n  this._absoluteSources = this._sources.toArray().map(function (s) {\n    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n  });\n\n  this.sourceRoot = sourceRoot;\n  this.sourcesContent = sourcesContent;\n  this._mappings = mappings;\n  this._sourceMapURL = aSourceMapURL;\n  this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source.  Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n  var relativeSource = aSource;\n  if (this.sourceRoot != null) {\n    relativeSource = util.relative(this.sourceRoot, relativeSource);\n  }\n\n  if (this._sources.has(relativeSource)) {\n    return this._sources.indexOf(relativeSource);\n  }\n\n  // Maybe aSource is an absolute URL as returned by |sources|.  In\n  // this case we can't simply undo the transform.\n  var i;\n  for (i = 0; i < this._absoluteSources.length; ++i) {\n    if (this._absoluteSources[i] == aSource) {\n      return i;\n    }\n  }\n\n  return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n *        The source map that will be consumed.\n * @param String aSourceMapURL\n *        The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n    smc.sourceRoot = aSourceMap._sourceRoot;\n    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n                                                            smc.sourceRoot);\n    smc.file = aSourceMap._file;\n    smc._sourceMapURL = aSourceMapURL;\n    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n    });\n\n    // Because we are modifying the entries (by converting string sources and\n    // names to indices into the sources and names ArraySets), we have to make\n    // a copy of the entry or else bad things happen. Shared mutable state\n    // strikes again! See github issue #191.\n\n    var generatedMappings = aSourceMap._mappings.toArray().slice();\n    var destGeneratedMappings = smc.__generatedMappings = [];\n    var destOriginalMappings = smc.__originalMappings = [];\n\n    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n      var srcMapping = generatedMappings[i];\n      var destMapping = new Mapping;\n      destMapping.generatedLine = srcMapping.generatedLine;\n      destMapping.generatedColumn = srcMapping.generatedColumn;\n\n      if (srcMapping.source) {\n        destMapping.source = sources.indexOf(srcMapping.source);\n        destMapping.originalLine = srcMapping.originalLine;\n        destMapping.originalColumn = srcMapping.originalColumn;\n\n        if (srcMapping.name) {\n          destMapping.name = names.indexOf(srcMapping.name);\n        }\n\n        destOriginalMappings.push(destMapping);\n      }\n\n      destGeneratedMappings.push(destMapping);\n    }\n\n    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n    return smc;\n  };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n  get: function () {\n    return this._absoluteSources.slice();\n  }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n  this.generatedLine = 0;\n  this.generatedColumn = 0;\n  this.source = null;\n  this.originalLine = null;\n  this.originalColumn = null;\n  this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    var generatedLine = 1;\n    var previousGeneratedColumn = 0;\n    var previousOriginalLine = 0;\n    var previousOriginalColumn = 0;\n    var previousSource = 0;\n    var previousName = 0;\n    var length = aStr.length;\n    var index = 0;\n    var cachedSegments = {};\n    var temp = {};\n    var originalMappings = [];\n    var generatedMappings = [];\n    var mapping, str, segment, end, value;\n\n    while (index < length) {\n      if (aStr.charAt(index) === ';') {\n        generatedLine++;\n        index++;\n        previousGeneratedColumn = 0;\n      }\n      else if (aStr.charAt(index) === ',') {\n        index++;\n      }\n      else {\n        mapping = new Mapping();\n        mapping.generatedLine = generatedLine;\n\n        // Because each offset is encoded relative to the previous one,\n        // many segments often have the same encoding. We can exploit this\n        // fact by caching the parsed variable length fields of each segment,\n        // allowing us to avoid a second parse if we encounter the same\n        // segment again.\n        for (end = index; end < length; end++) {\n          if (this._charIsMappingSeparator(aStr, end)) {\n            break;\n          }\n        }\n        str = aStr.slice(index, end);\n\n        segment = cachedSegments[str];\n        if (segment) {\n          index += str.length;\n        } else {\n          segment = [];\n          while (index < end) {\n            base64VLQ.decode(aStr, index, temp);\n            value = temp.value;\n            index = temp.rest;\n            segment.push(value);\n          }\n\n          if (segment.length === 2) {\n            throw new Error('Found a source, but no line and column');\n          }\n\n          if (segment.length === 3) {\n            throw new Error('Found a source and line, but no column');\n          }\n\n          cachedSegments[str] = segment;\n        }\n\n        // Generated column.\n        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n        previousGeneratedColumn = mapping.generatedColumn;\n\n        if (segment.length > 1) {\n          // Original source.\n          mapping.source = previousSource + segment[1];\n          previousSource += segment[1];\n\n          // Original line.\n          mapping.originalLine = previousOriginalLine + segment[2];\n          previousOriginalLine = mapping.originalLine;\n          // Lines are stored 0-based\n          mapping.originalLine += 1;\n\n          // Original column.\n          mapping.originalColumn = previousOriginalColumn + segment[3];\n          previousOriginalColumn = mapping.originalColumn;\n\n          if (segment.length > 4) {\n            // Original name.\n            mapping.name = previousName + segment[4];\n            previousName += segment[4];\n          }\n        }\n\n        generatedMappings.push(mapping);\n        if (typeof mapping.originalLine === 'number') {\n          originalMappings.push(mapping);\n        }\n      }\n    }\n\n    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n    this.__generatedMappings = generatedMappings;\n\n    quickSort(originalMappings, util.compareByOriginalPositions);\n    this.__originalMappings = originalMappings;\n  };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n                                         aColumnName, aComparator, aBias) {\n    // To return the position we are searching for, we must first find the\n    // mapping for the given position and then return the opposite position it\n    // points to. Because the mappings are sorted, we can use binary search to\n    // find the best mapping.\n\n    if (aNeedle[aLineName] <= 0) {\n      throw new TypeError('Line must be greater than or equal to 1, got '\n                          + aNeedle[aLineName]);\n    }\n    if (aNeedle[aColumnName] < 0) {\n      throw new TypeError('Column must be greater than or equal to 0, got '\n                          + aNeedle[aColumnName]);\n    }\n\n    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n  };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n  function SourceMapConsumer_computeColumnSpans() {\n    for (var index = 0; index < this._generatedMappings.length; ++index) {\n      var mapping = this._generatedMappings[index];\n\n      // Mappings do not contain a field for the last generated columnt. We\n      // can come up with an optimistic estimate, however, by assuming that\n      // mappings are contiguous (i.e. given two consecutive mappings, the\n      // first mapping ends where the second one starts).\n      if (index + 1 < this._generatedMappings.length) {\n        var nextMapping = this._generatedMappings[index + 1];\n\n        if (mapping.generatedLine === nextMapping.generatedLine) {\n          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n          continue;\n        }\n      }\n\n      // The last mapping for each line spans the entire line.\n      mapping.lastGeneratedColumn = Infinity;\n    }\n  };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n *   - line: The line number in the generated source.  The line number\n *     is 1-based.\n *   - column: The column number in the generated source.  The column\n *     number is 0-based.\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n *   - source: The original source file, or null.\n *   - line: The line number in the original source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the original source, or null.  The\n *     column number is 0-based.\n *   - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n  function SourceMapConsumer_originalPositionFor(aArgs) {\n    var needle = {\n      generatedLine: util.getArg(aArgs, 'line'),\n      generatedColumn: util.getArg(aArgs, 'column')\n    };\n\n    var index = this._findMapping(\n      needle,\n      this._generatedMappings,\n      \"generatedLine\",\n      \"generatedColumn\",\n      util.compareByGeneratedPositionsDeflated,\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n    );\n\n    if (index >= 0) {\n      var mapping = this._generatedMappings[index];\n\n      if (mapping.generatedLine === needle.generatedLine) {\n        var source = util.getArg(mapping, 'source', null);\n        if (source !== null) {\n          source = this._sources.at(source);\n          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n        }\n        var name = util.getArg(mapping, 'name', null);\n        if (name !== null) {\n          name = this._names.at(name);\n        }\n        return {\n          source: source,\n          line: util.getArg(mapping, 'originalLine', null),\n          column: util.getArg(mapping, 'originalColumn', null),\n          name: name\n        };\n      }\n    }\n\n    return {\n      source: null,\n      line: null,\n      column: null,\n      name: null\n    };\n  };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n    if (!this.sourcesContent) {\n      return false;\n    }\n    return this.sourcesContent.length >= this._sources.size() &&\n      !this.sourcesContent.some(function (sc) { return sc == null; });\n  };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n    if (!this.sourcesContent) {\n      return null;\n    }\n\n    var index = this._findSourceIndex(aSource);\n    if (index >= 0) {\n      return this.sourcesContent[index];\n    }\n\n    var relativeSource = aSource;\n    if (this.sourceRoot != null) {\n      relativeSource = util.relative(this.sourceRoot, relativeSource);\n    }\n\n    var url;\n    if (this.sourceRoot != null\n        && (url = util.urlParse(this.sourceRoot))) {\n      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n      // many users. We can help them out when they expect file:// URIs to\n      // behave like it would if they were running a local HTTP server. See\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n      if (url.scheme == \"file\"\n          && this._sources.has(fileUriAbsPath)) {\n        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n      }\n\n      if ((!url.path || url.path == \"/\")\n          && this._sources.has(\"/\" + relativeSource)) {\n        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n      }\n    }\n\n    // This function is used recursively from\n    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n    // don't want to throw if we can't find the source - we just want to\n    // return null, so we provide a flag to exit gracefully.\n    if (nullOnMissing) {\n      return null;\n    }\n    else {\n      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n    }\n  };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number\n *     is 1-based.\n *   - column: The column number in the original source.  The column\n *     number is 0-based.\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the generated source, or null.\n *     The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n  function SourceMapConsumer_generatedPositionFor(aArgs) {\n    var source = util.getArg(aArgs, 'source');\n    source = this._findSourceIndex(source);\n    if (source < 0) {\n      return {\n        line: null,\n        column: null,\n        lastColumn: null\n      };\n    }\n\n    var needle = {\n      source: source,\n      originalLine: util.getArg(aArgs, 'line'),\n      originalColumn: util.getArg(aArgs, 'column')\n    };\n\n    var index = this._findMapping(\n      needle,\n      this._originalMappings,\n      \"originalLine\",\n      \"originalColumn\",\n      util.compareByOriginalPositions,\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n    );\n\n    if (index >= 0) {\n      var mapping = this._originalMappings[index];\n\n      if (mapping.source === needle.source) {\n        return {\n          line: util.getArg(mapping, 'generatedLine', null),\n          column: util.getArg(mapping, 'generatedColumn', null),\n          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n        };\n      }\n    }\n\n    return {\n      line: null,\n      column: null,\n      lastColumn: null\n    };\n  };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n *   - version: Which version of the source map spec this map is following.\n *   - file: Optional. The generated file this source map is associated with.\n *   - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n *   - offset: The offset into the original specified at which this section\n *       begins to apply, defined as an object with a \"line\" and \"column\"\n *       field.\n *   - map: A source map definition. This source map could also be indexed,\n *       but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n *  {\n *    version : 3,\n *    file: \"app.js\",\n *    sections: [{\n *      offset: {line:100, column:10},\n *      map: {\n *        version : 3,\n *        file: \"section.js\",\n *        sources: [\"foo.js\", \"bar.js\"],\n *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n *        mappings: \"AAAA,E;;ABCDE;\"\n *      }\n *    }],\n *  }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found.  This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  var version = util.getArg(sourceMap, 'version');\n  var sections = util.getArg(sourceMap, 'sections');\n\n  if (version != this._version) {\n    throw new Error('Unsupported version: ' + version);\n  }\n\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n\n  var lastOffset = {\n    line: -1,\n    column: 0\n  };\n  this._sections = sections.map(function (s) {\n    if (s.url) {\n      // The url field will require support for asynchronicity.\n      // See https://github.com/mozilla/source-map/issues/16\n      throw new Error('Support for url field in sections not implemented.');\n    }\n    var offset = util.getArg(s, 'offset');\n    var offsetLine = util.getArg(offset, 'line');\n    var offsetColumn = util.getArg(offset, 'column');\n\n    if (offsetLine < lastOffset.line ||\n        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n      throw new Error('Section offsets must be ordered and non-overlapping.');\n    }\n    lastOffset = offset;\n\n    return {\n      generatedOffset: {\n        // The offset fields are 0-based, but we use 1-based indices when\n        // encoding/decoding from VLQ.\n        generatedLine: offsetLine + 1,\n        generatedColumn: offsetColumn + 1\n      },\n      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n    }\n  });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n  get: function () {\n    var sources = [];\n    for (var i = 0; i < this._sections.length; i++) {\n      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n        sources.push(this._sections[i].consumer.sources[j]);\n      }\n    }\n    return sources;\n  }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n *   - line: The line number in the generated source.  The line number\n *     is 1-based.\n *   - column: The column number in the generated source.  The column\n *     number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n *   - source: The original source file, or null.\n *   - line: The line number in the original source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the original source, or null.  The\n *     column number is 0-based.\n *   - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n    var needle = {\n      generatedLine: util.getArg(aArgs, 'line'),\n      generatedColumn: util.getArg(aArgs, 'column')\n    };\n\n    // Find the section containing the generated position we're trying to map\n    // to an original position.\n    var sectionIndex = binarySearch.search(needle, this._sections,\n      function(needle, section) {\n        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n        if (cmp) {\n          return cmp;\n        }\n\n        return (needle.generatedColumn -\n                section.generatedOffset.generatedColumn);\n      });\n    var section = this._sections[sectionIndex];\n\n    if (!section) {\n      return {\n        source: null,\n        line: null,\n        column: null,\n        name: null\n      };\n    }\n\n    return section.consumer.originalPositionFor({\n      line: needle.generatedLine -\n        (section.generatedOffset.generatedLine - 1),\n      column: needle.generatedColumn -\n        (section.generatedOffset.generatedLine === needle.generatedLine\n         ? section.generatedOffset.generatedColumn - 1\n         : 0),\n      bias: aArgs.bias\n    });\n  };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n    return this._sections.every(function (s) {\n      return s.consumer.hasContentsOfAllSources();\n    });\n  };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n\n      var content = section.consumer.sourceContentFor(aSource, true);\n      if (content) {\n        return content;\n      }\n    }\n    if (nullOnMissing) {\n      return null;\n    }\n    else {\n      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n    }\n  };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number\n *     is 1-based.\n *   - column: The column number in the original source.  The column\n *     number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *     line number is 1-based. \n *   - column: The column number in the generated source, or null.\n *     The column number is 0-based.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n\n      // Only consider this section if the requested source is in the list of\n      // sources of the consumer.\n      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n        continue;\n      }\n      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n      if (generatedPosition) {\n        var ret = {\n          line: generatedPosition.line +\n            (section.generatedOffset.generatedLine - 1),\n          column: generatedPosition.column +\n            (section.generatedOffset.generatedLine === generatedPosition.line\n             ? section.generatedOffset.generatedColumn - 1\n             : 0)\n        };\n        return ret;\n      }\n    }\n\n    return {\n      line: null,\n      column: null\n    };\n  };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    this.__generatedMappings = [];\n    this.__originalMappings = [];\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n      var sectionMappings = section.consumer._generatedMappings;\n      for (var j = 0; j < sectionMappings.length; j++) {\n        var mapping = sectionMappings[j];\n\n        var source = section.consumer._sources.at(mapping.source);\n        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n        this._sources.add(source);\n        source = this._sources.indexOf(source);\n\n        var name = null;\n        if (mapping.name) {\n          name = section.consumer._names.at(mapping.name);\n          this._names.add(name);\n          name = this._names.indexOf(name);\n        }\n\n        // The mappings coming from the consumer for the section have\n        // generated positions relative to the start of the section, so we\n        // need to offset them to be relative to the start of the concatenated\n        // generated file.\n        var adjustedMapping = {\n          source: source,\n          generatedLine: mapping.generatedLine +\n            (section.generatedOffset.generatedLine - 1),\n          generatedColumn: mapping.generatedColumn +\n            (section.generatedOffset.generatedLine === mapping.generatedLine\n            ? section.generatedOffset.generatedColumn - 1\n            : 0),\n          originalLine: mapping.originalLine,\n          originalColumn: mapping.originalColumn,\n          name: name\n        };\n\n        this.__generatedMappings.push(adjustedMapping);\n        if (typeof adjustedMapping.originalLine === 'number') {\n          this.__originalMappings.push(adjustedMapping);\n        }\n      }\n    }\n\n    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n  };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/source-map-generator.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n *   - file: The filename of the generated source.\n *   - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n  if (!aArgs) {\n    aArgs = {};\n  }\n  this._file = util.getArg(aArgs, 'file', null);\n  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n  this._mappings = new MappingList();\n  this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n    var sourceRoot = aSourceMapConsumer.sourceRoot;\n    var generator = new SourceMapGenerator({\n      file: aSourceMapConsumer.file,\n      sourceRoot: sourceRoot\n    });\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      var newMapping = {\n        generated: {\n          line: mapping.generatedLine,\n          column: mapping.generatedColumn\n        }\n      };\n\n      if (mapping.source != null) {\n        newMapping.source = mapping.source;\n        if (sourceRoot != null) {\n          newMapping.source = util.relative(sourceRoot, newMapping.source);\n        }\n\n        newMapping.original = {\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        };\n\n        if (mapping.name != null) {\n          newMapping.name = mapping.name;\n        }\n      }\n\n      generator.addMapping(newMapping);\n    });\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var sourceRelative = sourceFile;\n      if (sourceRoot !== null) {\n        sourceRelative = util.relative(sourceRoot, sourceFile);\n      }\n\n      if (!generator._sources.has(sourceRelative)) {\n        generator._sources.add(sourceRelative);\n      }\n\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        generator.setSourceContent(sourceFile, content);\n      }\n    });\n    return generator;\n  };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n *   - generated: An object with the generated line and column positions.\n *   - original: An object with the original line and column positions.\n *   - source: The original source file (relative to the sourceRoot).\n *   - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n  function SourceMapGenerator_addMapping(aArgs) {\n    var generated = util.getArg(aArgs, 'generated');\n    var original = util.getArg(aArgs, 'original', null);\n    var source = util.getArg(aArgs, 'source', null);\n    var name = util.getArg(aArgs, 'name', null);\n\n    if (!this._skipValidation) {\n      this._validateMapping(generated, original, source, name);\n    }\n\n    if (source != null) {\n      source = String(source);\n      if (!this._sources.has(source)) {\n        this._sources.add(source);\n      }\n    }\n\n    if (name != null) {\n      name = String(name);\n      if (!this._names.has(name)) {\n        this._names.add(name);\n      }\n    }\n\n    this._mappings.add({\n      generatedLine: generated.line,\n      generatedColumn: generated.column,\n      originalLine: original != null && original.line,\n      originalColumn: original != null && original.column,\n      source: source,\n      name: name\n    });\n  };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n    var source = aSourceFile;\n    if (this._sourceRoot != null) {\n      source = util.relative(this._sourceRoot, source);\n    }\n\n    if (aSourceContent != null) {\n      // Add the source content to the _sourcesContents map.\n      // Create a new _sourcesContents map if the property is null.\n      if (!this._sourcesContents) {\n        this._sourcesContents = Object.create(null);\n      }\n      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n    } else if (this._sourcesContents) {\n      // Remove the source file from the _sourcesContents map.\n      // If the _sourcesContents map is empty, set the property to null.\n      delete this._sourcesContents[util.toSetString(source)];\n      if (Object.keys(this._sourcesContents).length === 0) {\n        this._sourcesContents = null;\n      }\n    }\n  };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n *        If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n *        to be applied. If relative, it is relative to the SourceMapConsumer.\n *        This parameter is needed when the two source maps aren't in the same\n *        directory, and the source map to be applied contains relative source\n *        paths. If so, those relative source paths need to be rewritten\n *        relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n    var sourceFile = aSourceFile;\n    // If aSourceFile is omitted, we will use the file property of the SourceMap\n    if (aSourceFile == null) {\n      if (aSourceMapConsumer.file == null) {\n        throw new Error(\n          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n          'or the source map\\'s \"file\" property. Both were omitted.'\n        );\n      }\n      sourceFile = aSourceMapConsumer.file;\n    }\n    var sourceRoot = this._sourceRoot;\n    // Make \"sourceFile\" relative if an absolute Url is passed.\n    if (sourceRoot != null) {\n      sourceFile = util.relative(sourceRoot, sourceFile);\n    }\n    // Applying the SourceMap can add and remove items from the sources and\n    // the names array.\n    var newSources = new ArraySet();\n    var newNames = new ArraySet();\n\n    // Find mappings for the \"sourceFile\"\n    this._mappings.unsortedForEach(function (mapping) {\n      if (mapping.source === sourceFile && mapping.originalLine != null) {\n        // Check if it can be mapped by the source map, then update the mapping.\n        var original = aSourceMapConsumer.originalPositionFor({\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        });\n        if (original.source != null) {\n          // Copy mapping\n          mapping.source = original.source;\n          if (aSourceMapPath != null) {\n            mapping.source = util.join(aSourceMapPath, mapping.source)\n          }\n          if (sourceRoot != null) {\n            mapping.source = util.relative(sourceRoot, mapping.source);\n          }\n          mapping.originalLine = original.line;\n          mapping.originalColumn = original.column;\n          if (original.name != null) {\n            mapping.name = original.name;\n          }\n        }\n      }\n\n      var source = mapping.source;\n      if (source != null && !newSources.has(source)) {\n        newSources.add(source);\n      }\n\n      var name = mapping.name;\n      if (name != null && !newNames.has(name)) {\n        newNames.add(name);\n      }\n\n    }, this);\n    this._sources = newSources;\n    this._names = newNames;\n\n    // Copy sourcesContents of applied map.\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aSourceMapPath != null) {\n          sourceFile = util.join(aSourceMapPath, sourceFile);\n        }\n        if (sourceRoot != null) {\n          sourceFile = util.relative(sourceRoot, sourceFile);\n        }\n        this.setSourceContent(sourceFile, content);\n      }\n    }, this);\n  };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n *   1. Just the generated position.\n *   2. The Generated position, original position, and original source.\n *   3. Generated and original position, original source, as well as a name\n *      token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n                                              aName) {\n    // When aOriginal is truthy but has empty values for .line and .column,\n    // it is most likely a programmer error. In this case we throw a very\n    // specific error message to try to guide them the right way.\n    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n        throw new Error(\n            'original.line and original.column are not numbers -- you probably meant to omit ' +\n            'the original mapping entirely and only map the generated position. If so, pass ' +\n            'null for the original mapping instead of an object with empty or null values.'\n        );\n    }\n\n    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n        && aGenerated.line > 0 && aGenerated.column >= 0\n        && !aOriginal && !aSource && !aName) {\n      // Case 1.\n      return;\n    }\n    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n             && aGenerated.line > 0 && aGenerated.column >= 0\n             && aOriginal.line > 0 && aOriginal.column >= 0\n             && aSource) {\n      // Cases 2 and 3.\n      return;\n    }\n    else {\n      throw new Error('Invalid mapping: ' + JSON.stringify({\n        generated: aGenerated,\n        source: aSource,\n        original: aOriginal,\n        name: aName\n      }));\n    }\n  };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n  function SourceMapGenerator_serializeMappings() {\n    var previousGeneratedColumn = 0;\n    var previousGeneratedLine = 1;\n    var previousOriginalColumn = 0;\n    var previousOriginalLine = 0;\n    var previousName = 0;\n    var previousSource = 0;\n    var result = '';\n    var next;\n    var mapping;\n    var nameIdx;\n    var sourceIdx;\n\n    var mappings = this._mappings.toArray();\n    for (var i = 0, len = mappings.length; i < len; i++) {\n      mapping = mappings[i];\n      next = ''\n\n      if (mapping.generatedLine !== previousGeneratedLine) {\n        previousGeneratedColumn = 0;\n        while (mapping.generatedLine !== previousGeneratedLine) {\n          next += ';';\n          previousGeneratedLine++;\n        }\n      }\n      else {\n        if (i > 0) {\n          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n            continue;\n          }\n          next += ',';\n        }\n      }\n\n      next += base64VLQ.encode(mapping.generatedColumn\n                                 - previousGeneratedColumn);\n      previousGeneratedColumn = mapping.generatedColumn;\n\n      if (mapping.source != null) {\n        sourceIdx = this._sources.indexOf(mapping.source);\n        next += base64VLQ.encode(sourceIdx - previousSource);\n        previousSource = sourceIdx;\n\n        // lines are stored 0-based in SourceMap spec version 3\n        next += base64VLQ.encode(mapping.originalLine - 1\n                                   - previousOriginalLine);\n        previousOriginalLine = mapping.originalLine - 1;\n\n        next += base64VLQ.encode(mapping.originalColumn\n                                   - previousOriginalColumn);\n        previousOriginalColumn = mapping.originalColumn;\n\n        if (mapping.name != null) {\n          nameIdx = this._names.indexOf(mapping.name);\n          next += base64VLQ.encode(nameIdx - previousName);\n          previousName = nameIdx;\n        }\n      }\n\n      result += next;\n    }\n\n    return result;\n  };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n    return aSources.map(function (source) {\n      if (!this._sourcesContents) {\n        return null;\n      }\n      if (aSourceRoot != null) {\n        source = util.relative(aSourceRoot, source);\n      }\n      var key = util.toSetString(source);\n      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n        ? this._sourcesContents[key]\n        : null;\n    }, this);\n  };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n  function SourceMapGenerator_toJSON() {\n    var map = {\n      version: this._version,\n      sources: this._sources.toArray(),\n      names: this._names.toArray(),\n      mappings: this._serializeMappings()\n    };\n    if (this._file != null) {\n      map.file = this._file;\n    }\n    if (this._sourceRoot != null) {\n      map.sourceRoot = this._sourceRoot;\n    }\n    if (this._sourcesContents) {\n      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n    }\n\n    return map;\n  };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n  function SourceMapGenerator_toString() {\n    return JSON.stringify(this.toJSON());\n  };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/source-node.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n *        generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n  this.children = [];\n  this.sourceContents = {};\n  this.line = aLine == null ? null : aLine;\n  this.column = aColumn == null ? null : aColumn;\n  this.source = aSource == null ? null : aSource;\n  this.name = aName == null ? null : aName;\n  this[isSourceNode] = true;\n  if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n *        SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n    // The SourceNode we want to fill with the generated code\n    // and the SourceMap\n    var node = new SourceNode();\n\n    // All even indices of this array are one line of the generated code,\n    // while all odd indices are the newlines between two adjacent lines\n    // (since `REGEX_NEWLINE` captures its match).\n    // Processed fragments are accessed by calling `shiftNextLine`.\n    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n    var remainingLinesIndex = 0;\n    var shiftNextLine = function() {\n      var lineContents = getNextLine();\n      // The last line of a file might not have a newline.\n      var newLine = getNextLine() || \"\";\n      return lineContents + newLine;\n\n      function getNextLine() {\n        return remainingLinesIndex < remainingLines.length ?\n            remainingLines[remainingLinesIndex++] : undefined;\n      }\n    };\n\n    // We need to remember the position of \"remainingLines\"\n    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n    // The generate SourceNodes we need a code range.\n    // To extract it current and last mapping is used.\n    // Here we store the last mapping.\n    var lastMapping = null;\n\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      if (lastMapping !== null) {\n        // We add the code from \"lastMapping\" to \"mapping\":\n        // First check if there is a new line in between.\n        if (lastGeneratedLine < mapping.generatedLine) {\n          // Associate first line with \"lastMapping\"\n          addMappingWithCode(lastMapping, shiftNextLine());\n          lastGeneratedLine++;\n          lastGeneratedColumn = 0;\n          // The remaining code is added without mapping\n        } else {\n          // There is no new line in between.\n          // Associate the code between \"lastGeneratedColumn\" and\n          // \"mapping.generatedColumn\" with \"lastMapping\"\n          var nextLine = remainingLines[remainingLinesIndex] || '';\n          var code = nextLine.substr(0, mapping.generatedColumn -\n                                        lastGeneratedColumn);\n          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n                                              lastGeneratedColumn);\n          lastGeneratedColumn = mapping.generatedColumn;\n          addMappingWithCode(lastMapping, code);\n          // No more remaining code, continue\n          lastMapping = mapping;\n          return;\n        }\n      }\n      // We add the generated code until the first mapping\n      // to the SourceNode without any mapping.\n      // Each line is added as separate string.\n      while (lastGeneratedLine < mapping.generatedLine) {\n        node.add(shiftNextLine());\n        lastGeneratedLine++;\n      }\n      if (lastGeneratedColumn < mapping.generatedColumn) {\n        var nextLine = remainingLines[remainingLinesIndex] || '';\n        node.add(nextLine.substr(0, mapping.generatedColumn));\n        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n        lastGeneratedColumn = mapping.generatedColumn;\n      }\n      lastMapping = mapping;\n    }, this);\n    // We have processed all mappings.\n    if (remainingLinesIndex < remainingLines.length) {\n      if (lastMapping) {\n        // Associate the remaining code in the current line with \"lastMapping\"\n        addMappingWithCode(lastMapping, shiftNextLine());\n      }\n      // and add the remaining lines without any mapping\n      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n    }\n\n    // Copy sourcesContent into SourceNode\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aRelativePath != null) {\n          sourceFile = util.join(aRelativePath, sourceFile);\n        }\n        node.setSourceContent(sourceFile, content);\n      }\n    });\n\n    return node;\n\n    function addMappingWithCode(mapping, code) {\n      if (mapping === null || mapping.source === undefined) {\n        node.add(code);\n      } else {\n        var source = aRelativePath\n          ? util.join(aRelativePath, mapping.source)\n          : mapping.source;\n        node.add(new SourceNode(mapping.originalLine,\n                                mapping.originalColumn,\n                                source,\n                                code,\n                                mapping.name));\n      }\n    }\n  };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n *        SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n  if (Array.isArray(aChunk)) {\n    aChunk.forEach(function (chunk) {\n      this.add(chunk);\n    }, this);\n  }\n  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n    if (aChunk) {\n      this.children.push(aChunk);\n    }\n  }\n  else {\n    throw new TypeError(\n      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n    );\n  }\n  return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n *        SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n  if (Array.isArray(aChunk)) {\n    for (var i = aChunk.length-1; i >= 0; i--) {\n      this.prepend(aChunk[i]);\n    }\n  }\n  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n    this.children.unshift(aChunk);\n  }\n  else {\n    throw new TypeError(\n      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n    );\n  }\n  return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n  var chunk;\n  for (var i = 0, len = this.children.length; i < len; i++) {\n    chunk = this.children[i];\n    if (chunk[isSourceNode]) {\n      chunk.walk(aFn);\n    }\n    else {\n      if (chunk !== '') {\n        aFn(chunk, { source: this.source,\n                     line: this.line,\n                     column: this.column,\n                     name: this.name });\n      }\n    }\n  }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n  var newChildren;\n  var i;\n  var len = this.children.length;\n  if (len > 0) {\n    newChildren = [];\n    for (i = 0; i < len-1; i++) {\n      newChildren.push(this.children[i]);\n      newChildren.push(aSep);\n    }\n    newChildren.push(this.children[i]);\n    this.children = newChildren;\n  }\n  return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n  var lastChild = this.children[this.children.length - 1];\n  if (lastChild[isSourceNode]) {\n    lastChild.replaceRight(aPattern, aReplacement);\n  }\n  else if (typeof lastChild === 'string') {\n    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n  }\n  else {\n    this.children.push(''.replace(aPattern, aReplacement));\n  }\n  return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n  };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n  function SourceNode_walkSourceContents(aFn) {\n    for (var i = 0, len = this.children.length; i < len; i++) {\n      if (this.children[i][isSourceNode]) {\n        this.children[i].walkSourceContents(aFn);\n      }\n    }\n\n    var sources = Object.keys(this.sourceContents);\n    for (var i = 0, len = sources.length; i < len; i++) {\n      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n    }\n  };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n  var str = \"\";\n  this.walk(function (chunk) {\n    str += chunk;\n  });\n  return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n  var generated = {\n    code: \"\",\n    line: 1,\n    column: 0\n  };\n  var map = new SourceMapGenerator(aArgs);\n  var sourceMappingActive = false;\n  var lastOriginalSource = null;\n  var lastOriginalLine = null;\n  var lastOriginalColumn = null;\n  var lastOriginalName = null;\n  this.walk(function (chunk, original) {\n    generated.code += chunk;\n    if (original.source !== null\n        && original.line !== null\n        && original.column !== null) {\n      if(lastOriginalSource !== original.source\n         || lastOriginalLine !== original.line\n         || lastOriginalColumn !== original.column\n         || lastOriginalName !== original.name) {\n        map.addMapping({\n          source: original.source,\n          original: {\n            line: original.line,\n            column: original.column\n          },\n          generated: {\n            line: generated.line,\n            column: generated.column\n          },\n          name: original.name\n        });\n      }\n      lastOriginalSource = original.source;\n      lastOriginalLine = original.line;\n      lastOriginalColumn = original.column;\n      lastOriginalName = original.name;\n      sourceMappingActive = true;\n    } else if (sourceMappingActive) {\n      map.addMapping({\n        generated: {\n          line: generated.line,\n          column: generated.column\n        }\n      });\n      lastOriginalSource = null;\n      sourceMappingActive = false;\n    }\n    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n        generated.line++;\n        generated.column = 0;\n        // Mappings end at eol\n        if (idx + 1 === length) {\n          lastOriginalSource = null;\n          sourceMappingActive = false;\n        } else if (sourceMappingActive) {\n          map.addMapping({\n            source: original.source,\n            original: {\n              line: original.line,\n              column: original.column\n            },\n            generated: {\n              line: generated.line,\n              column: generated.column\n            },\n            name: original.name\n          });\n        }\n      } else {\n        generated.column++;\n      }\n    }\n  });\n  this.walkSourceContents(function (sourceFile, sourceContent) {\n    map.setSourceContent(sourceFile, sourceContent);\n  });\n\n  return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/lib/util.js",
    "content": "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n  if (aName in aArgs) {\n    return aArgs[aName];\n  } else if (arguments.length === 3) {\n    return aDefaultValue;\n  } else {\n    throw new Error('\"' + aName + '\" is a required argument.');\n  }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n  var match = aUrl.match(urlRegexp);\n  if (!match) {\n    return null;\n  }\n  return {\n    scheme: match[1],\n    auth: match[2],\n    host: match[3],\n    port: match[4],\n    path: match[5]\n  };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n  var url = '';\n  if (aParsedUrl.scheme) {\n    url += aParsedUrl.scheme + ':';\n  }\n  url += '//';\n  if (aParsedUrl.auth) {\n    url += aParsedUrl.auth + '@';\n  }\n  if (aParsedUrl.host) {\n    url += aParsedUrl.host;\n  }\n  if (aParsedUrl.port) {\n    url += \":\" + aParsedUrl.port\n  }\n  if (aParsedUrl.path) {\n    url += aParsedUrl.path;\n  }\n  return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n  var path = aPath;\n  var url = urlParse(aPath);\n  if (url) {\n    if (!url.path) {\n      return aPath;\n    }\n    path = url.path;\n  }\n  var isAbsolute = exports.isAbsolute(path);\n\n  var parts = path.split(/\\/+/);\n  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n    part = parts[i];\n    if (part === '.') {\n      parts.splice(i, 1);\n    } else if (part === '..') {\n      up++;\n    } else if (up > 0) {\n      if (part === '') {\n        // The first part is blank if the path is absolute. Trying to go\n        // above the root is a no-op. Therefore we can remove all '..' parts\n        // directly after the root.\n        parts.splice(i + 1, up);\n        up = 0;\n      } else {\n        parts.splice(i, 2);\n        up--;\n      }\n    }\n  }\n  path = parts.join('/');\n\n  if (path === '') {\n    path = isAbsolute ? '/' : '.';\n  }\n\n  if (url) {\n    url.path = path;\n    return urlGenerate(url);\n  }\n  return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n *   first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n *   is updated with the result and aRoot is returned. Otherwise the result\n *   is returned.\n *   - If aPath is absolute, the result is aPath.\n *   - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n  if (aPath === \"\") {\n    aPath = \".\";\n  }\n  var aPathUrl = urlParse(aPath);\n  var aRootUrl = urlParse(aRoot);\n  if (aRootUrl) {\n    aRoot = aRootUrl.path || '/';\n  }\n\n  // `join(foo, '//www.example.org')`\n  if (aPathUrl && !aPathUrl.scheme) {\n    if (aRootUrl) {\n      aPathUrl.scheme = aRootUrl.scheme;\n    }\n    return urlGenerate(aPathUrl);\n  }\n\n  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n    return aPath;\n  }\n\n  // `join('http://', 'www.example.com')`\n  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n    aRootUrl.host = aPath;\n    return urlGenerate(aRootUrl);\n  }\n\n  var joined = aPath.charAt(0) === '/'\n    ? aPath\n    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n  if (aRootUrl) {\n    aRootUrl.path = joined;\n    return urlGenerate(aRootUrl);\n  }\n  return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n\n  aRoot = aRoot.replace(/\\/$/, '');\n\n  // It is possible for the path to be above the root. In this case, simply\n  // checking whether the root is a prefix of the path won't work. Instead, we\n  // need to remove components from the root one by one, until either we find\n  // a prefix that fits, or we run out of components to remove.\n  var level = 0;\n  while (aPath.indexOf(aRoot + '/') !== 0) {\n    var index = aRoot.lastIndexOf(\"/\");\n    if (index < 0) {\n      return aPath;\n    }\n\n    // If the only part of the root that is left is the scheme (i.e. http://,\n    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n    // have exhausted all components, so the path is not relative to the root.\n    aRoot = aRoot.slice(0, index);\n    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n      return aPath;\n    }\n\n    ++level;\n  }\n\n  // Make sure we add a \"../\" for each component we removed from the root.\n  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n  var obj = Object.create(null);\n  return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n  return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return '$' + aStr;\n  }\n\n  return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return aStr.slice(1);\n  }\n\n  return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n  if (!s) {\n    return false;\n  }\n\n  var length = s.length;\n\n  if (length < 9 /* \"__proto__\".length */) {\n    return false;\n  }\n\n  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n    return false;\n  }\n\n  for (var i = length - 10; i >= 0; i--) {\n    if (s.charCodeAt(i) !== 36 /* '$' */) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n  var cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0 || onlyCompareOriginal) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0 || onlyCompareGenerated) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n  if (aStr1 === aStr2) {\n    return 0;\n  }\n\n  if (aStr1 === null) {\n    return 1; // aStr2 !== null\n  }\n\n  if (aStr2 === null) {\n    return -1; // aStr1 !== null\n  }\n\n  if (aStr1 > aStr2) {\n    return 1;\n  }\n\n  return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n  sourceURL = sourceURL || '';\n\n  if (sourceRoot) {\n    // This follows what Chrome does.\n    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n      sourceRoot += '/';\n    }\n    // The spec says:\n    //   Line 4: An optional source root, useful for relocating source\n    //   files on a server or removing repeated values in the\n    //   “sources” entry.  This value is prepended to the individual\n    //   entries in the “source” field.\n    sourceURL = sourceRoot + sourceURL;\n  }\n\n  // Historically, SourceMapConsumer did not take the sourceMapURL as\n  // a parameter.  This mode is still somewhat supported, which is why\n  // this code block is conditional.  However, it's preferable to pass\n  // the source map URL to SourceMapConsumer, so that this function\n  // can implement the source URL resolution algorithm as outlined in\n  // the spec.  This block is basically the equivalent of:\n  //    new URL(sourceURL, sourceMapURL).toString()\n  // ... except it avoids using URL, which wasn't available in the\n  // older releases of node still supported by this library.\n  //\n  // The spec says:\n  //   If the sources are not absolute URLs after prepending of the\n  //   “sourceRoot”, the sources are resolved relative to the\n  //   SourceMap (like resolving script src in a html document).\n  if (sourceMapURL) {\n    var parsed = urlParse(sourceMapURL);\n    if (!parsed) {\n      throw new Error(\"sourceMapURL could not be parsed\");\n    }\n    if (parsed.path) {\n      // Strip the last path component, but keep the \"/\".\n      var index = parsed.path.lastIndexOf('/');\n      if (index >= 0) {\n        parsed.path = parsed.path.substring(0, index + 1);\n      }\n    }\n    sourceURL = join(urlGenerate(parsed), sourceURL);\n  }\n\n  return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/package.json",
    "content": "{\n  \"name\": \"source-map\",\n  \"description\": \"Generates and consumes source maps\",\n  \"version\": \"0.6.1\",\n  \"homepage\": \"https://github.com/mozilla/source-map\",\n  \"author\": \"Nick Fitzgerald <nfitzgerald@mozilla.com>\",\n  \"contributors\": [\n    \"Tobias Koppers <tobias.koppers@googlemail.com>\",\n    \"Duncan Beevers <duncan@dweebd.com>\",\n    \"Stephen Crane <scrane@mozilla.com>\",\n    \"Ryan Seddon <seddon.ryan@gmail.com>\",\n    \"Miles Elam <miles.elam@deem.com>\",\n    \"Mihai Bazon <mihai.bazon@gmail.com>\",\n    \"Michael Ficarra <github.public.email@michael.ficarra.me>\",\n    \"Todd Wolfson <todd@twolfson.com>\",\n    \"Alexander Solovyov <alexander@solovyov.net>\",\n    \"Felix Gnass <fgnass@gmail.com>\",\n    \"Conrad Irwin <conrad.irwin@gmail.com>\",\n    \"usrbincc <usrbincc@yahoo.com>\",\n    \"David Glasser <glasser@davidglasser.net>\",\n    \"Chase Douglas <chase@newrelic.com>\",\n    \"Evan Wallace <evan.exe@gmail.com>\",\n    \"Heather Arthur <fayearthur@gmail.com>\",\n    \"Hugh Kennedy <hughskennedy@gmail.com>\",\n    \"David Glasser <glasser@davidglasser.net>\",\n    \"Simon Lydell <simon.lydell@gmail.com>\",\n    \"Jmeas Smith <jellyes2@gmail.com>\",\n    \"Michael Z Goddard <mzgoddard@gmail.com>\",\n    \"azu <azu@users.noreply.github.com>\",\n    \"John Gozde <john@gozde.ca>\",\n    \"Adam Kirkton <akirkton@truefitinnovation.com>\",\n    \"Chris Montgomery <christopher.montgomery@dowjones.com>\",\n    \"J. Ryan Stinnett <jryans@gmail.com>\",\n    \"Jack Herrington <jherrington@walmartlabs.com>\",\n    \"Chris Truter <jeffpalentine@gmail.com>\",\n    \"Daniel Espeset <daniel@danielespeset.com>\",\n    \"Jamie Wong <jamie.lf.wong@gmail.com>\",\n    \"Eddy Bruël <ejpbruel@mozilla.com>\",\n    \"Hawken Rives <hawkrives@gmail.com>\",\n    \"Gilad Peleg <giladp007@gmail.com>\",\n    \"djchie <djchie.dev@gmail.com>\",\n    \"Gary Ye <garysye@gmail.com>\",\n    \"Nicolas Lalevée <nicolas.lalevee@hibnet.org>\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"http://github.com/mozilla/source-map.git\"\n  },\n  \"main\": \"./source-map.js\",\n  \"files\": [\n    \"source-map.js\",\n    \"source-map.d.ts\",\n    \"lib/\",\n    \"dist/source-map.debug.js\",\n    \"dist/source-map.js\",\n    \"dist/source-map.min.js\",\n    \"dist/source-map.min.js.map\"\n  ],\n  \"engines\": {\n    \"node\": \">=0.10.0\"\n  },\n  \"license\": \"BSD-3-Clause\",\n  \"scripts\": {\n    \"test\": \"npm run build && node test/run-tests.js\",\n    \"build\": \"webpack --color\",\n    \"toc\": \"doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md\"\n  },\n  \"devDependencies\": {\n    \"doctoc\": \"^0.15.0\",\n    \"webpack\": \"^1.12.0\"\n  },\n  \"typings\": \"source-map\"\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/source-map.d.ts",
    "content": "export interface StartOfSourceMap {\n    file?: string;\n    sourceRoot?: string;\n}\n\nexport interface RawSourceMap extends StartOfSourceMap {\n    version: string;\n    sources: string[];\n    names: string[];\n    sourcesContent?: string[];\n    mappings: string;\n}\n\nexport interface Position {\n    line: number;\n    column: number;\n}\n\nexport interface LineRange extends Position {\n    lastColumn: number;\n}\n\nexport interface FindPosition extends Position {\n    // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND\n    bias?: number;\n}\n\nexport interface SourceFindPosition extends FindPosition {\n    source: string;\n}\n\nexport interface MappedPosition extends Position {\n    source: string;\n    name?: string;\n}\n\nexport interface MappingItem {\n    source: string;\n    generatedLine: number;\n    generatedColumn: number;\n    originalLine: number;\n    originalColumn: number;\n    name: string;\n}\n\nexport class SourceMapConsumer {\n    static GENERATED_ORDER: number;\n    static ORIGINAL_ORDER: number;\n\n    static GREATEST_LOWER_BOUND: number;\n    static LEAST_UPPER_BOUND: number;\n\n    constructor(rawSourceMap: RawSourceMap);\n    computeColumnSpans(): void;\n    originalPositionFor(generatedPosition: FindPosition): MappedPosition;\n    generatedPositionFor(originalPosition: SourceFindPosition): LineRange;\n    allGeneratedPositionsFor(originalPosition: MappedPosition): Position[];\n    hasContentsOfAllSources(): boolean;\n    sourceContentFor(source: string, returnNullOnMissing?: boolean): string;\n    eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void;\n}\n\nexport interface Mapping {\n    generated: Position;\n    original: Position;\n    source: string;\n    name?: string;\n}\n\nexport class SourceMapGenerator {\n    constructor(startOfSourceMap?: StartOfSourceMap);\n    static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator;\n    addMapping(mapping: Mapping): void;\n    setSourceContent(sourceFile: string, sourceContent: string): void;\n    applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void;\n    toString(): string;\n}\n\nexport interface CodeWithSourceMap {\n    code: string;\n    map: SourceMapGenerator;\n}\n\nexport class SourceNode {\n    constructor();\n    constructor(line: number, column: number, source: string);\n    constructor(line: number, column: number, source: string, chunk?: string, name?: string);\n    static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode;\n    add(chunk: string): void;\n    prepend(chunk: string): void;\n    setSourceContent(sourceFile: string, sourceContent: string): void;\n    walk(fn: (chunk: string, mapping: MappedPosition) => void): void;\n    walkSourceContents(fn: (file: string, content: string) => void): void;\n    join(sep: string): SourceNode;\n    replaceRight(pattern: string, replacement: string): SourceNode;\n    toString(): string;\n    toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap;\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/node_modules/source-map/source-map.js",
    "content": "/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/package.json",
    "content": "{\n  \"name\": \"source-map-support\",\n  \"description\": \"Fixes stack traces for files with source maps\",\n  \"version\": \"0.5.21\",\n  \"main\": \"./source-map-support.js\",\n  \"scripts\": {\n    \"build\": \"node build.js\",\n    \"serve-tests\": \"http-server -p 1336\",\n    \"prepublish\": \"npm run build\",\n    \"test\": \"mocha\"\n  },\n  \"dependencies\": {\n    \"buffer-from\": \"^1.0.0\",\n    \"source-map\": \"^0.6.0\"\n  },\n  \"devDependencies\": {\n    \"browserify\": \"^4.2.3\",\n    \"coffeescript\": \"^1.12.7\",\n    \"http-server\": \"^0.11.1\",\n    \"mocha\": \"^3.5.3\",\n    \"webpack\": \"^1.15.0\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/evanw/node-source-map-support\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/evanw/node-source-map-support/issues\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/register-hook-require.js",
    "content": "require('./').install({hookRequire: true});\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/register.js",
    "content": "require('./').install();\n"
  },
  {
    "path": "templates/bin/node/terser/node_modules/source-map-support/source-map-support.js",
    "content": "var SourceMapConsumer = require('source-map').SourceMapConsumer;\nvar path = require('path');\n\nvar fs;\ntry {\n  fs = require('fs');\n  if (!fs.existsSync || !fs.readFileSync) {\n    // fs doesn't have all methods we need\n    fs = null;\n  }\n} catch (err) {\n  /* nop */\n}\n\nvar bufferFrom = require('buffer-from');\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param {NodeModule} mod\n * @param {string} request\n */\nfunction dynamicRequire(mod, request) {\n  return mod.require(request);\n}\n\n// Only install once if called multiple times\nvar errorFormatterInstalled = false;\nvar uncaughtShimInstalled = false;\n\n// If true, the caches are reset before a stack trace formatting operation\nvar emptyCacheBetweenOperations = false;\n\n// Supports {browser, node, auto}\nvar environment = \"auto\";\n\n// Maps a file path to a string containing the file contents\nvar fileContentsCache = {};\n\n// Maps a file path to a source map for that file\nvar sourceMapCache = {};\n\n// Regex for detecting source maps\nvar reSourceMap = /^data:application\\/json[^,]+base64,/;\n\n// Priority list of retrieve handlers\nvar retrieveFileHandlers = [];\nvar retrieveMapHandlers = [];\n\nfunction isInBrowser() {\n  if (environment === \"browser\")\n    return true;\n  if (environment === \"node\")\n    return false;\n  return ((typeof window !== 'undefined') && (typeof XMLHttpRequest === 'function') && !(window.require && window.module && window.process && window.process.type === \"renderer\"));\n}\n\nfunction hasGlobalProcessEventEmitter() {\n  return ((typeof process === 'object') && (process !== null) && (typeof process.on === 'function'));\n}\n\nfunction globalProcessVersion() {\n  if ((typeof process === 'object') && (process !== null)) {\n    return process.version;\n  } else {\n    return '';\n  }\n}\n\nfunction globalProcessStderr() {\n  if ((typeof process === 'object') && (process !== null)) {\n    return process.stderr;\n  }\n}\n\nfunction globalProcessExit(code) {\n  if ((typeof process === 'object') && (process !== null) && (typeof process.exit === 'function')) {\n    return process.exit(code);\n  }\n}\n\nfunction handlerExec(list) {\n  return function(arg) {\n    for (var i = 0; i < list.length; i++) {\n      var ret = list[i](arg);\n      if (ret) {\n        return ret;\n      }\n    }\n    return null;\n  };\n}\n\nvar retrieveFile = handlerExec(retrieveFileHandlers);\n\nretrieveFileHandlers.push(function(path) {\n  // Trim the path to make sure there is no extra whitespace.\n  path = path.trim();\n  if (/^file:/.test(path)) {\n    // existsSync/readFileSync can't handle file protocol, but once stripped, it works\n    path = path.replace(/file:\\/\\/\\/(\\w:)?/, function(protocol, drive) {\n      return drive ?\n        '' : // file:///C:/dir/file -> C:/dir/file\n        '/'; // file:///root-dir/file -> /root-dir/file\n    });\n  }\n  if (path in fileContentsCache) {\n    return fileContentsCache[path];\n  }\n\n  var contents = '';\n  try {\n    if (!fs) {\n      // Use SJAX if we are in the browser\n      var xhr = new XMLHttpRequest();\n      xhr.open('GET', path, /** async */ false);\n      xhr.send(null);\n      if (xhr.readyState === 4 && xhr.status === 200) {\n        contents = xhr.responseText;\n      }\n    } else if (fs.existsSync(path)) {\n      // Otherwise, use the filesystem\n      contents = fs.readFileSync(path, 'utf8');\n    }\n  } catch (er) {\n    /* ignore any errors */\n  }\n\n  return fileContentsCache[path] = contents;\n});\n\n// Support URLs relative to a directory, but be careful about a protocol prefix\n// in case we are in the browser (i.e. directories may start with \"http://\" or \"file:///\")\nfunction supportRelativeURL(file, url) {\n  if (!file) return url;\n  var dir = path.dirname(file);\n  var match = /^\\w+:\\/\\/[^\\/]*/.exec(dir);\n  var protocol = match ? match[0] : '';\n  var startPath = dir.slice(protocol.length);\n  if (protocol && /^\\/\\w\\:/.test(startPath)) {\n    // handle file:///C:/ paths\n    protocol += '/';\n    return protocol + path.resolve(dir.slice(protocol.length), url).replace(/\\\\/g, '/');\n  }\n  return protocol + path.resolve(dir.slice(protocol.length), url);\n}\n\nfunction retrieveSourceMapURL(source) {\n  var fileData;\n\n  if (isInBrowser()) {\n     try {\n       var xhr = new XMLHttpRequest();\n       xhr.open('GET', source, false);\n       xhr.send(null);\n       fileData = xhr.readyState === 4 ? xhr.responseText : null;\n\n       // Support providing a sourceMappingURL via the SourceMap header\n       var sourceMapHeader = xhr.getResponseHeader(\"SourceMap\") ||\n                             xhr.getResponseHeader(\"X-SourceMap\");\n       if (sourceMapHeader) {\n         return sourceMapHeader;\n       }\n     } catch (e) {\n     }\n  }\n\n  // Get the URL of the source map\n  fileData = retrieveFile(source);\n  var re = /(?:\\/\\/[@#][\\s]*sourceMappingURL=([^\\s'\"]+)[\\s]*$)|(?:\\/\\*[@#][\\s]*sourceMappingURL=([^\\s*'\"]+)[\\s]*(?:\\*\\/)[\\s]*$)/mg;\n  // Keep executing the search to find the *last* sourceMappingURL to avoid\n  // picking up sourceMappingURLs from comments, strings, etc.\n  var lastMatch, match;\n  while (match = re.exec(fileData)) lastMatch = match;\n  if (!lastMatch) return null;\n  return lastMatch[1];\n};\n\n// Can be overridden by the retrieveSourceMap option to install. Takes a\n// generated source filename; returns a {map, optional url} object, or null if\n// there is no source map.  The map field may be either a string or the parsed\n// JSON object (ie, it must be a valid argument to the SourceMapConsumer\n// constructor).\nvar retrieveSourceMap = handlerExec(retrieveMapHandlers);\nretrieveMapHandlers.push(function(source) {\n  var sourceMappingURL = retrieveSourceMapURL(source);\n  if (!sourceMappingURL) return null;\n\n  // Read the contents of the source map\n  var sourceMapData;\n  if (reSourceMap.test(sourceMappingURL)) {\n    // Support source map URL as a data url\n    var rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1);\n    sourceMapData = bufferFrom(rawData, \"base64\").toString();\n    sourceMappingURL = source;\n  } else {\n    // Support source map URLs relative to the source URL\n    sourceMappingURL = supportRelativeURL(source, sourceMappingURL);\n    sourceMapData = retrieveFile(sourceMappingURL);\n  }\n\n  if (!sourceMapData) {\n    return null;\n  }\n\n  return {\n    url: sourceMappingURL,\n    map: sourceMapData\n  };\n});\n\nfunction mapSourcePosition(position) {\n  var sourceMap = sourceMapCache[position.source];\n  if (!sourceMap) {\n    // Call the (overrideable) retrieveSourceMap function to get the source map.\n    var urlAndMap = retrieveSourceMap(position.source);\n    if (urlAndMap) {\n      sourceMap = sourceMapCache[position.source] = {\n        url: urlAndMap.url,\n        map: new SourceMapConsumer(urlAndMap.map)\n      };\n\n      // Load all sources stored inline with the source map into the file cache\n      // to pretend like they are already loaded. They may not exist on disk.\n      if (sourceMap.map.sourcesContent) {\n        sourceMap.map.sources.forEach(function(source, i) {\n          var contents = sourceMap.map.sourcesContent[i];\n          if (contents) {\n            var url = supportRelativeURL(sourceMap.url, source);\n            fileContentsCache[url] = contents;\n          }\n        });\n      }\n    } else {\n      sourceMap = sourceMapCache[position.source] = {\n        url: null,\n        map: null\n      };\n    }\n  }\n\n  // Resolve the source URL relative to the URL of the source map\n  if (sourceMap && sourceMap.map && typeof sourceMap.map.originalPositionFor === 'function') {\n    var originalPosition = sourceMap.map.originalPositionFor(position);\n\n    // Only return the original position if a matching line was found. If no\n    // matching line is found then we return position instead, which will cause\n    // the stack trace to print the path and line for the compiled file. It is\n    // better to give a precise location in the compiled file than a vague\n    // location in the original file.\n    if (originalPosition.source !== null) {\n      originalPosition.source = supportRelativeURL(\n        sourceMap.url, originalPosition.source);\n      return originalPosition;\n    }\n  }\n\n  return position;\n}\n\n// Parses code generated by FormatEvalOrigin(), a function inside V8:\n// https://code.google.com/p/v8/source/browse/trunk/src/messages.js\nfunction mapEvalOrigin(origin) {\n  // Most eval() calls are in this format\n  var match = /^eval at ([^(]+) \\((.+):(\\d+):(\\d+)\\)$/.exec(origin);\n  if (match) {\n    var position = mapSourcePosition({\n      source: match[2],\n      line: +match[3],\n      column: match[4] - 1\n    });\n    return 'eval at ' + match[1] + ' (' + position.source + ':' +\n      position.line + ':' + (position.column + 1) + ')';\n  }\n\n  // Parse nested eval() calls using recursion\n  match = /^eval at ([^(]+) \\((.+)\\)$/.exec(origin);\n  if (match) {\n    return 'eval at ' + match[1] + ' (' + mapEvalOrigin(match[2]) + ')';\n  }\n\n  // Make sure we still return useful information if we didn't find anything\n  return origin;\n}\n\n// This is copied almost verbatim from the V8 source code at\n// https://code.google.com/p/v8/source/browse/trunk/src/messages.js. The\n// implementation of wrapCallSite() used to just forward to the actual source\n// code of CallSite.prototype.toString but unfortunately a new release of V8\n// did something to the prototype chain and broke the shim. The only fix I\n// could find was copy/paste.\nfunction CallSiteToString() {\n  var fileName;\n  var fileLocation = \"\";\n  if (this.isNative()) {\n    fileLocation = \"native\";\n  } else {\n    fileName = this.getScriptNameOrSourceURL();\n    if (!fileName && this.isEval()) {\n      fileLocation = this.getEvalOrigin();\n      fileLocation += \", \";  // Expecting source position to follow.\n    }\n\n    if (fileName) {\n      fileLocation += fileName;\n    } else {\n      // Source code does not originate from a file and is not native, but we\n      // can still get the source position inside the source string, e.g. in\n      // an eval string.\n      fileLocation += \"<anonymous>\";\n    }\n    var lineNumber = this.getLineNumber();\n    if (lineNumber != null) {\n      fileLocation += \":\" + lineNumber;\n      var columnNumber = this.getColumnNumber();\n      if (columnNumber) {\n        fileLocation += \":\" + columnNumber;\n      }\n    }\n  }\n\n  var line = \"\";\n  var functionName = this.getFunctionName();\n  var addSuffix = true;\n  var isConstructor = this.isConstructor();\n  var isMethodCall = !(this.isToplevel() || isConstructor);\n  if (isMethodCall) {\n    var typeName = this.getTypeName();\n    // Fixes shim to be backward compatable with Node v0 to v4\n    if (typeName === \"[object Object]\") {\n      typeName = \"null\";\n    }\n    var methodName = this.getMethodName();\n    if (functionName) {\n      if (typeName && functionName.indexOf(typeName) != 0) {\n        line += typeName + \".\";\n      }\n      line += functionName;\n      if (methodName && functionName.indexOf(\".\" + methodName) != functionName.length - methodName.length - 1) {\n        line += \" [as \" + methodName + \"]\";\n      }\n    } else {\n      line += typeName + \".\" + (methodName || \"<anonymous>\");\n    }\n  } else if (isConstructor) {\n    line += \"new \" + (functionName || \"<anonymous>\");\n  } else if (functionName) {\n    line += functionName;\n  } else {\n    line += fileLocation;\n    addSuffix = false;\n  }\n  if (addSuffix) {\n    line += \" (\" + fileLocation + \")\";\n  }\n  return line;\n}\n\nfunction cloneCallSite(frame) {\n  var object = {};\n  Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach(function(name) {\n    object[name] = /^(?:is|get)/.test(name) ? function() { return frame[name].call(frame); } : frame[name];\n  });\n  object.toString = CallSiteToString;\n  return object;\n}\n\nfunction wrapCallSite(frame, state) {\n  // provides interface backward compatibility\n  if (state === undefined) {\n    state = { nextPosition: null, curPosition: null }\n  }\n  if(frame.isNative()) {\n    state.curPosition = null;\n    return frame;\n  }\n\n  // Most call sites will return the source file from getFileName(), but code\n  // passed to eval() ending in \"//# sourceURL=...\" will return the source file\n  // from getScriptNameOrSourceURL() instead\n  var source = frame.getFileName() || frame.getScriptNameOrSourceURL();\n  if (source) {\n    var line = frame.getLineNumber();\n    var column = frame.getColumnNumber() - 1;\n\n    // Fix position in Node where some (internal) code is prepended.\n    // See https://github.com/evanw/node-source-map-support/issues/36\n    // Header removed in node at ^10.16 || >=11.11.0\n    // v11 is not an LTS candidate, we can just test the one version with it.\n    // Test node versions for: 10.16-19, 10.20+, 12-19, 20-99, 100+, or 11.11\n    var noHeader = /^v(10\\.1[6-9]|10\\.[2-9][0-9]|10\\.[0-9]{3,}|1[2-9]\\d*|[2-9]\\d|\\d{3,}|11\\.11)/;\n    var headerLength = noHeader.test(globalProcessVersion()) ? 0 : 62;\n    if (line === 1 && column > headerLength && !isInBrowser() && !frame.isEval()) {\n      column -= headerLength;\n    }\n\n    var position = mapSourcePosition({\n      source: source,\n      line: line,\n      column: column\n    });\n    state.curPosition = position;\n    frame = cloneCallSite(frame);\n    var originalFunctionName = frame.getFunctionName;\n    frame.getFunctionName = function() {\n      if (state.nextPosition == null) {\n        return originalFunctionName();\n      }\n      return state.nextPosition.name || originalFunctionName();\n    };\n    frame.getFileName = function() { return position.source; };\n    frame.getLineNumber = function() { return position.line; };\n    frame.getColumnNumber = function() { return position.column + 1; };\n    frame.getScriptNameOrSourceURL = function() { return position.source; };\n    return frame;\n  }\n\n  // Code called using eval() needs special handling\n  var origin = frame.isEval() && frame.getEvalOrigin();\n  if (origin) {\n    origin = mapEvalOrigin(origin);\n    frame = cloneCallSite(frame);\n    frame.getEvalOrigin = function() { return origin; };\n    return frame;\n  }\n\n  // If we get here then we were unable to change the source position\n  return frame;\n}\n\n// This function is part of the V8 stack trace API, for more info see:\n// https://v8.dev/docs/stack-trace-api\nfunction prepareStackTrace(error, stack) {\n  if (emptyCacheBetweenOperations) {\n    fileContentsCache = {};\n    sourceMapCache = {};\n  }\n\n  var name = error.name || 'Error';\n  var message = error.message || '';\n  var errorString = name + \": \" + message;\n\n  var state = { nextPosition: null, curPosition: null };\n  var processedStack = [];\n  for (var i = stack.length - 1; i >= 0; i--) {\n    processedStack.push('\\n    at ' + wrapCallSite(stack[i], state));\n    state.nextPosition = state.curPosition;\n  }\n  state.curPosition = state.nextPosition = null;\n  return errorString + processedStack.reverse().join('');\n}\n\n// Generate position and snippet of original source with pointer\nfunction getErrorSource(error) {\n  var match = /\\n    at [^(]+ \\((.*):(\\d+):(\\d+)\\)/.exec(error.stack);\n  if (match) {\n    var source = match[1];\n    var line = +match[2];\n    var column = +match[3];\n\n    // Support the inline sourceContents inside the source map\n    var contents = fileContentsCache[source];\n\n    // Support files on disk\n    if (!contents && fs && fs.existsSync(source)) {\n      try {\n        contents = fs.readFileSync(source, 'utf8');\n      } catch (er) {\n        contents = '';\n      }\n    }\n\n    // Format the line from the original source code like node does\n    if (contents) {\n      var code = contents.split(/(?:\\r\\n|\\r|\\n)/)[line - 1];\n      if (code) {\n        return source + ':' + line + '\\n' + code + '\\n' +\n          new Array(column).join(' ') + '^';\n      }\n    }\n  }\n  return null;\n}\n\nfunction printErrorAndExit (error) {\n  var source = getErrorSource(error);\n\n  // Ensure error is printed synchronously and not truncated\n  var stderr = globalProcessStderr();\n  if (stderr && stderr._handle && stderr._handle.setBlocking) {\n    stderr._handle.setBlocking(true);\n  }\n\n  if (source) {\n    console.error();\n    console.error(source);\n  }\n\n  console.error(error.stack);\n  globalProcessExit(1);\n}\n\nfunction shimEmitUncaughtException () {\n  var origEmit = process.emit;\n\n  process.emit = function (type) {\n    if (type === 'uncaughtException') {\n      var hasStack = (arguments[1] && arguments[1].stack);\n      var hasListeners = (this.listeners(type).length > 0);\n\n      if (hasStack && !hasListeners) {\n        return printErrorAndExit(arguments[1]);\n      }\n    }\n\n    return origEmit.apply(this, arguments);\n  };\n}\n\nvar originalRetrieveFileHandlers = retrieveFileHandlers.slice(0);\nvar originalRetrieveMapHandlers = retrieveMapHandlers.slice(0);\n\nexports.wrapCallSite = wrapCallSite;\nexports.getErrorSource = getErrorSource;\nexports.mapSourcePosition = mapSourcePosition;\nexports.retrieveSourceMap = retrieveSourceMap;\n\nexports.install = function(options) {\n  options = options || {};\n\n  if (options.environment) {\n    environment = options.environment;\n    if ([\"node\", \"browser\", \"auto\"].indexOf(environment) === -1) {\n      throw new Error(\"environment \" + environment + \" was unknown. Available options are {auto, browser, node}\")\n    }\n  }\n\n  // Allow sources to be found by methods other than reading the files\n  // directly from disk.\n  if (options.retrieveFile) {\n    if (options.overrideRetrieveFile) {\n      retrieveFileHandlers.length = 0;\n    }\n\n    retrieveFileHandlers.unshift(options.retrieveFile);\n  }\n\n  // Allow source maps to be found by methods other than reading the files\n  // directly from disk.\n  if (options.retrieveSourceMap) {\n    if (options.overrideRetrieveSourceMap) {\n      retrieveMapHandlers.length = 0;\n    }\n\n    retrieveMapHandlers.unshift(options.retrieveSourceMap);\n  }\n\n  // Support runtime transpilers that include inline source maps\n  if (options.hookRequire && !isInBrowser()) {\n    // Use dynamicRequire to avoid including in browser bundles\n    var Module = dynamicRequire(module, 'module');\n    var $compile = Module.prototype._compile;\n\n    if (!$compile.__sourceMapSupport) {\n      Module.prototype._compile = function(content, filename) {\n        fileContentsCache[filename] = content;\n        sourceMapCache[filename] = undefined;\n        return $compile.call(this, content, filename);\n      };\n\n      Module.prototype._compile.__sourceMapSupport = true;\n    }\n  }\n\n  // Configure options\n  if (!emptyCacheBetweenOperations) {\n    emptyCacheBetweenOperations = 'emptyCacheBetweenOperations' in options ?\n      options.emptyCacheBetweenOperations : false;\n  }\n\n  // Install the error reformatter\n  if (!errorFormatterInstalled) {\n    errorFormatterInstalled = true;\n    Error.prepareStackTrace = prepareStackTrace;\n  }\n\n  if (!uncaughtShimInstalled) {\n    var installHandler = 'handleUncaughtExceptions' in options ?\n      options.handleUncaughtExceptions : true;\n\n    // Do not override 'uncaughtException' with our own handler in Node.js\n    // Worker threads. Workers pass the error to the main thread as an event,\n    // rather than printing something to stderr and exiting.\n    try {\n      // We need to use `dynamicRequire` because `require` on it's own will be optimized by WebPack/Browserify.\n      var worker_threads = dynamicRequire(module, 'worker_threads');\n      if (worker_threads.isMainThread === false) {\n        installHandler = false;\n      }\n    } catch(e) {}\n\n    // Provide the option to not install the uncaught exception handler. This is\n    // to support other uncaught exception handlers (in test frameworks, for\n    // example). If this handler is not installed and there are no other uncaught\n    // exception handlers, uncaught exceptions will be caught by node's built-in\n    // exception handler and the process will still be terminated. However, the\n    // generated JavaScript code will be shown above the stack trace instead of\n    // the original source code.\n    if (installHandler && hasGlobalProcessEventEmitter()) {\n      uncaughtShimInstalled = true;\n      shimEmitUncaughtException();\n    }\n  }\n};\n\nexports.resetRetrieveHandlers = function() {\n  retrieveFileHandlers.length = 0;\n  retrieveMapHandlers.length = 0;\n\n  retrieveFileHandlers = originalRetrieveFileHandlers.slice(0);\n  retrieveMapHandlers = originalRetrieveMapHandlers.slice(0);\n\n  retrieveSourceMap = handlerExec(retrieveMapHandlers);\n  retrieveFile = handlerExec(retrieveFileHandlers);\n}\n"
  },
  {
    "path": "templates/bin/node/terser/package.json",
    "content": "{\n  \"name\": \"terser\",\n  \"description\": \"JavaScript parser, mangler/compressor and beautifier toolkit for ES6+\",\n  \"homepage\": \"https://terser.org\",\n  \"author\": \"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)\",\n  \"license\": \"BSD-2-Clause\",\n  \"version\": \"5.17.4\",\n  \"engines\": {\n    \"node\": \">=10\"\n  },\n  \"maintainers\": [\n    \"Fábio Santos <fabiosantosart@gmail.com>\"\n  ],\n  \"repository\": \"https://github.com/terser/terser\",\n  \"main\": \"dist/bundle.min.js\",\n  \"type\": \"module\",\n  \"module\": \"./main.js\",\n  \"exports\": {\n    \".\": [\n      {\n        \"types\": \"./tools/terser.d.ts\",\n        \"import\": \"./main.js\",\n        \"require\": \"./dist/bundle.min.js\"\n      },\n      \"./dist/bundle.min.js\"\n    ],\n    \"./package\": \"./package.json\",\n    \"./package.json\": \"./package.json\",\n    \"./bin/terser\": \"./bin/terser\"\n  },\n  \"types\": \"tools/terser.d.ts\",\n  \"bin\": {\n    \"terser\": \"bin/terser\"\n  },\n  \"files\": [\n    \"bin\",\n    \"dist\",\n    \"lib\",\n    \"tools\",\n    \"LICENSE\",\n    \"README.md\",\n    \"CHANGELOG.md\",\n    \"PATRONS.md\",\n    \"main.js\"\n  ],\n  \"dependencies\": {\n    \"@jridgewell/source-map\": \"^0.3.2\",\n    \"acorn\": \"^8.5.0\",\n    \"commander\": \"^2.20.0\",\n    \"source-map-support\": \"~0.5.20\"\n  },\n  \"devDependencies\": {\n    \"@ls-lint/ls-lint\": \"^1.10.0\",\n    \"astring\": \"^1.7.5\",\n    \"eslint\": \"^7.32.0\",\n    \"eslump\": \"^3.0.0\",\n    \"esm\": \"^3.2.25\",\n    \"mocha\": \"^9.2.0\",\n    \"pre-commit\": \"^1.2.2\",\n    \"rimraf\": \"^3.0.2\",\n    \"rollup\": \"2.56.3\",\n    \"semver\": \"^7.3.4\",\n    \"source-map\": \"~0.8.0-beta.0\"\n  },\n  \"scripts\": {\n    \"test\": \"node test/compress.js && mocha test/mocha\",\n    \"test:compress\": \"node test/compress.js\",\n    \"test:mocha\": \"mocha test/mocha\",\n    \"lint\": \"eslint lib\",\n    \"lint-fix\": \"eslint --fix lib\",\n    \"ls-lint\": \"ls-lint\",\n    \"build\": \"rimraf dist/bundle* && rollup --config --silent\",\n    \"prepare\": \"npm run build\",\n    \"postversion\": \"echo 'Remember to update the changelog!'\"\n  },\n  \"keywords\": [\n    \"uglify\",\n    \"terser\",\n    \"uglify-es\",\n    \"uglify-js\",\n    \"minify\",\n    \"minifier\",\n    \"javascript\",\n    \"ecmascript\",\n    \"es5\",\n    \"es6\",\n    \"es7\",\n    \"es8\",\n    \"es2015\",\n    \"es2016\",\n    \"es2017\",\n    \"async\",\n    \"await\"\n  ],\n  \"eslintConfig\": {\n    \"parserOptions\": {\n      \"sourceType\": \"module\",\n      \"ecmaVersion\": 2020\n    },\n    \"env\": {\n      \"node\": true,\n      \"browser\": true,\n      \"es2020\": true\n    },\n    \"globals\": {\n      \"describe\": false,\n      \"it\": false,\n      \"require\": false,\n      \"before\": false,\n      \"after\": false,\n      \"global\": false,\n      \"process\": false\n    },\n    \"rules\": {\n      \"brace-style\": [\n        \"error\",\n        \"1tbs\",\n        {\n          \"allowSingleLine\": true\n        }\n      ],\n      \"quotes\": [\n        \"error\",\n        \"double\",\n        \"avoid-escape\"\n      ],\n      \"no-debugger\": \"error\",\n      \"no-undef\": \"error\",\n      \"no-unused-vars\": [\n        \"error\",\n        {\n          \"varsIgnorePattern\": \"^_\"\n        }\n      ],\n      \"no-tabs\": \"error\",\n      \"semi\": [\n        \"error\",\n        \"always\"\n      ],\n      \"no-extra-semi\": \"error\",\n      \"no-irregular-whitespace\": \"error\",\n      \"space-before-blocks\": [\n        \"error\",\n        \"always\"\n      ]\n    }\n  },\n  \"pre-commit\": [\n    \"build\",\n    \"lint-fix\",\n    \"ls-lint\",\n    \"test\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/terser/tools/domprops.js",
    "content": "export var domprops = [\n    \"$&\",\n    \"$'\",\n    \"$*\",\n    \"$+\",\n    \"$1\",\n    \"$2\",\n    \"$3\",\n    \"$4\",\n    \"$5\",\n    \"$6\",\n    \"$7\",\n    \"$8\",\n    \"$9\",\n    \"$_\",\n    \"$`\",\n    \"$input\",\n    \"-moz-animation\",\n    \"-moz-animation-delay\",\n    \"-moz-animation-direction\",\n    \"-moz-animation-duration\",\n    \"-moz-animation-fill-mode\",\n    \"-moz-animation-iteration-count\",\n    \"-moz-animation-name\",\n    \"-moz-animation-play-state\",\n    \"-moz-animation-timing-function\",\n    \"-moz-appearance\",\n    \"-moz-backface-visibility\",\n    \"-moz-border-end\",\n    \"-moz-border-end-color\",\n    \"-moz-border-end-style\",\n    \"-moz-border-end-width\",\n    \"-moz-border-image\",\n    \"-moz-border-start\",\n    \"-moz-border-start-color\",\n    \"-moz-border-start-style\",\n    \"-moz-border-start-width\",\n    \"-moz-box-align\",\n    \"-moz-box-direction\",\n    \"-moz-box-flex\",\n    \"-moz-box-ordinal-group\",\n    \"-moz-box-orient\",\n    \"-moz-box-pack\",\n    \"-moz-box-sizing\",\n    \"-moz-float-edge\",\n    \"-moz-font-feature-settings\",\n    \"-moz-font-language-override\",\n    \"-moz-force-broken-image-icon\",\n    \"-moz-hyphens\",\n    \"-moz-image-region\",\n    \"-moz-margin-end\",\n    \"-moz-margin-start\",\n    \"-moz-orient\",\n    \"-moz-osx-font-smoothing\",\n    \"-moz-outline-radius\",\n    \"-moz-outline-radius-bottomleft\",\n    \"-moz-outline-radius-bottomright\",\n    \"-moz-outline-radius-topleft\",\n    \"-moz-outline-radius-topright\",\n    \"-moz-padding-end\",\n    \"-moz-padding-start\",\n    \"-moz-perspective\",\n    \"-moz-perspective-origin\",\n    \"-moz-tab-size\",\n    \"-moz-text-size-adjust\",\n    \"-moz-transform\",\n    \"-moz-transform-origin\",\n    \"-moz-transform-style\",\n    \"-moz-transition\",\n    \"-moz-transition-delay\",\n    \"-moz-transition-duration\",\n    \"-moz-transition-property\",\n    \"-moz-transition-timing-function\",\n    \"-moz-user-focus\",\n    \"-moz-user-input\",\n    \"-moz-user-modify\",\n    \"-moz-user-select\",\n    \"-moz-window-dragging\",\n    \"-webkit-align-content\",\n    \"-webkit-align-items\",\n    \"-webkit-align-self\",\n    \"-webkit-animation\",\n    \"-webkit-animation-delay\",\n    \"-webkit-animation-direction\",\n    \"-webkit-animation-duration\",\n    \"-webkit-animation-fill-mode\",\n    \"-webkit-animation-iteration-count\",\n    \"-webkit-animation-name\",\n    \"-webkit-animation-play-state\",\n    \"-webkit-animation-timing-function\",\n    \"-webkit-appearance\",\n    \"-webkit-backface-visibility\",\n    \"-webkit-background-clip\",\n    \"-webkit-background-origin\",\n    \"-webkit-background-size\",\n    \"-webkit-border-bottom-left-radius\",\n    \"-webkit-border-bottom-right-radius\",\n    \"-webkit-border-image\",\n    \"-webkit-border-radius\",\n    \"-webkit-border-top-left-radius\",\n    \"-webkit-border-top-right-radius\",\n    \"-webkit-box-align\",\n    \"-webkit-box-direction\",\n    \"-webkit-box-flex\",\n    \"-webkit-box-ordinal-group\",\n    \"-webkit-box-orient\",\n    \"-webkit-box-pack\",\n    \"-webkit-box-shadow\",\n    \"-webkit-box-sizing\",\n    \"-webkit-filter\",\n    \"-webkit-flex\",\n    \"-webkit-flex-basis\",\n    \"-webkit-flex-direction\",\n    \"-webkit-flex-flow\",\n    \"-webkit-flex-grow\",\n    \"-webkit-flex-shrink\",\n    \"-webkit-flex-wrap\",\n    \"-webkit-justify-content\",\n    \"-webkit-line-clamp\",\n    \"-webkit-mask\",\n    \"-webkit-mask-clip\",\n    \"-webkit-mask-composite\",\n    \"-webkit-mask-image\",\n    \"-webkit-mask-origin\",\n    \"-webkit-mask-position\",\n    \"-webkit-mask-position-x\",\n    \"-webkit-mask-position-y\",\n    \"-webkit-mask-repeat\",\n    \"-webkit-mask-size\",\n    \"-webkit-order\",\n    \"-webkit-perspective\",\n    \"-webkit-perspective-origin\",\n    \"-webkit-text-fill-color\",\n    \"-webkit-text-size-adjust\",\n    \"-webkit-text-stroke\",\n    \"-webkit-text-stroke-color\",\n    \"-webkit-text-stroke-width\",\n    \"-webkit-transform\",\n    \"-webkit-transform-origin\",\n    \"-webkit-transform-style\",\n    \"-webkit-transition\",\n    \"-webkit-transition-delay\",\n    \"-webkit-transition-duration\",\n    \"-webkit-transition-property\",\n    \"-webkit-transition-timing-function\",\n    \"-webkit-user-select\",\n    \"0\",\n    \"1\",\n    \"10\",\n    \"11\",\n    \"12\",\n    \"13\",\n    \"14\",\n    \"15\",\n    \"16\",\n    \"17\",\n    \"18\",\n    \"19\",\n    \"2\",\n    \"20\",\n    \"3\",\n    \"4\",\n    \"5\",\n    \"6\",\n    \"7\",\n    \"8\",\n    \"9\",\n    \"@@iterator\",\n    \"ABORT_ERR\",\n    \"ACTIVE\",\n    \"ACTIVE_ATTRIBUTES\",\n    \"ACTIVE_TEXTURE\",\n    \"ACTIVE_UNIFORMS\",\n    \"ACTIVE_UNIFORM_BLOCKS\",\n    \"ADDITION\",\n    \"ALIASED_LINE_WIDTH_RANGE\",\n    \"ALIASED_POINT_SIZE_RANGE\",\n    \"ALLOW_KEYBOARD_INPUT\",\n    \"ALLPASS\",\n    \"ALPHA\",\n    \"ALPHA_BITS\",\n    \"ALREADY_SIGNALED\",\n    \"ALT_MASK\",\n    \"ALWAYS\",\n    \"ANY_SAMPLES_PASSED\",\n    \"ANY_SAMPLES_PASSED_CONSERVATIVE\",\n    \"ANY_TYPE\",\n    \"ANY_UNORDERED_NODE_TYPE\",\n    \"ARRAY_BUFFER\",\n    \"ARRAY_BUFFER_BINDING\",\n    \"ATTACHED_SHADERS\",\n    \"ATTRIBUTE_NODE\",\n    \"AT_TARGET\",\n    \"AbortController\",\n    \"AbortSignal\",\n    \"AbsoluteOrientationSensor\",\n    \"AbstractRange\",\n    \"Accelerometer\",\n    \"AddSearchProvider\",\n    \"AggregateError\",\n    \"AnalyserNode\",\n    \"Animation\",\n    \"AnimationEffect\",\n    \"AnimationEvent\",\n    \"AnimationPlaybackEvent\",\n    \"AnimationTimeline\",\n    \"AnonXMLHttpRequest\",\n    \"Any\",\n    \"ApplicationCache\",\n    \"ApplicationCacheErrorEvent\",\n    \"Array\",\n    \"ArrayBuffer\",\n    \"ArrayType\",\n    \"Atomics\",\n    \"Attr\",\n    \"Audio\",\n    \"AudioBuffer\",\n    \"AudioBufferSourceNode\",\n    \"AudioContext\",\n    \"AudioDestinationNode\",\n    \"AudioListener\",\n    \"AudioNode\",\n    \"AudioParam\",\n    \"AudioParamMap\",\n    \"AudioProcessingEvent\",\n    \"AudioScheduledSourceNode\",\n    \"AudioStreamTrack\",\n    \"AudioWorklet\",\n    \"AudioWorkletNode\",\n    \"AuthenticatorAssertionResponse\",\n    \"AuthenticatorAttestationResponse\",\n    \"AuthenticatorResponse\",\n    \"AutocompleteErrorEvent\",\n    \"BACK\",\n    \"BAD_BOUNDARYPOINTS_ERR\",\n    \"BAD_REQUEST\",\n    \"BANDPASS\",\n    \"BLEND\",\n    \"BLEND_COLOR\",\n    \"BLEND_DST_ALPHA\",\n    \"BLEND_DST_RGB\",\n    \"BLEND_EQUATION\",\n    \"BLEND_EQUATION_ALPHA\",\n    \"BLEND_EQUATION_RGB\",\n    \"BLEND_SRC_ALPHA\",\n    \"BLEND_SRC_RGB\",\n    \"BLUE_BITS\",\n    \"BLUR\",\n    \"BOOL\",\n    \"BOOLEAN_TYPE\",\n    \"BOOL_VEC2\",\n    \"BOOL_VEC3\",\n    \"BOOL_VEC4\",\n    \"BOTH\",\n    \"BROWSER_DEFAULT_WEBGL\",\n    \"BUBBLING_PHASE\",\n    \"BUFFER_SIZE\",\n    \"BUFFER_USAGE\",\n    \"BYTE\",\n    \"BYTES_PER_ELEMENT\",\n    \"BackgroundFetchManager\",\n    \"BackgroundFetchRecord\",\n    \"BackgroundFetchRegistration\",\n    \"BarProp\",\n    \"BarcodeDetector\",\n    \"BaseAudioContext\",\n    \"BaseHref\",\n    \"BatteryManager\",\n    \"BeforeInstallPromptEvent\",\n    \"BeforeLoadEvent\",\n    \"BeforeUnloadEvent\",\n    \"BigInt\",\n    \"BigInt64Array\",\n    \"BigUint64Array\",\n    \"BiquadFilterNode\",\n    \"Blob\",\n    \"BlobEvent\",\n    \"Bluetooth\",\n    \"BluetoothCharacteristicProperties\",\n    \"BluetoothDevice\",\n    \"BluetoothRemoteGATTCharacteristic\",\n    \"BluetoothRemoteGATTDescriptor\",\n    \"BluetoothRemoteGATTServer\",\n    \"BluetoothRemoteGATTService\",\n    \"BluetoothUUID\",\n    \"Boolean\",\n    \"BroadcastChannel\",\n    \"ByteLengthQueuingStrategy\",\n    \"CAPTURING_PHASE\",\n    \"CCW\",\n    \"CDATASection\",\n    \"CDATA_SECTION_NODE\",\n    \"CHANGE\",\n    \"CHARSET_RULE\",\n    \"CHECKING\",\n    \"CLAMP_TO_EDGE\",\n    \"CLICK\",\n    \"CLOSED\",\n    \"CLOSING\",\n    \"COLOR\",\n    \"COLOR_ATTACHMENT0\",\n    \"COLOR_ATTACHMENT1\",\n    \"COLOR_ATTACHMENT10\",\n    \"COLOR_ATTACHMENT11\",\n    \"COLOR_ATTACHMENT12\",\n    \"COLOR_ATTACHMENT13\",\n    \"COLOR_ATTACHMENT14\",\n    \"COLOR_ATTACHMENT15\",\n    \"COLOR_ATTACHMENT2\",\n    \"COLOR_ATTACHMENT3\",\n    \"COLOR_ATTACHMENT4\",\n    \"COLOR_ATTACHMENT5\",\n    \"COLOR_ATTACHMENT6\",\n    \"COLOR_ATTACHMENT7\",\n    \"COLOR_ATTACHMENT8\",\n    \"COLOR_ATTACHMENT9\",\n    \"COLOR_BUFFER_BIT\",\n    \"COLOR_CLEAR_VALUE\",\n    \"COLOR_WRITEMASK\",\n    \"COMMENT_NODE\",\n    \"COMPARE_REF_TO_TEXTURE\",\n    \"COMPILE_STATUS\",\n    \"COMPLETION_STATUS_KHR\",\n    \"COMPRESSED_RGBA_S3TC_DXT1_EXT\",\n    \"COMPRESSED_RGBA_S3TC_DXT3_EXT\",\n    \"COMPRESSED_RGBA_S3TC_DXT5_EXT\",\n    \"COMPRESSED_RGB_S3TC_DXT1_EXT\",\n    \"COMPRESSED_TEXTURE_FORMATS\",\n    \"CONDITION_SATISFIED\",\n    \"CONFIGURATION_UNSUPPORTED\",\n    \"CONNECTING\",\n    \"CONSTANT_ALPHA\",\n    \"CONSTANT_COLOR\",\n    \"CONSTRAINT_ERR\",\n    \"CONTEXT_LOST_WEBGL\",\n    \"CONTROL_MASK\",\n    \"COPY_READ_BUFFER\",\n    \"COPY_READ_BUFFER_BINDING\",\n    \"COPY_WRITE_BUFFER\",\n    \"COPY_WRITE_BUFFER_BINDING\",\n    \"COUNTER_STYLE_RULE\",\n    \"CSS\",\n    \"CSS2Properties\",\n    \"CSSAnimation\",\n    \"CSSCharsetRule\",\n    \"CSSConditionRule\",\n    \"CSSCounterStyleRule\",\n    \"CSSFontFaceRule\",\n    \"CSSFontFeatureValuesRule\",\n    \"CSSGroupingRule\",\n    \"CSSImageValue\",\n    \"CSSImportRule\",\n    \"CSSKeyframeRule\",\n    \"CSSKeyframesRule\",\n    \"CSSKeywordValue\",\n    \"CSSMathInvert\",\n    \"CSSMathMax\",\n    \"CSSMathMin\",\n    \"CSSMathNegate\",\n    \"CSSMathProduct\",\n    \"CSSMathSum\",\n    \"CSSMathValue\",\n    \"CSSMatrixComponent\",\n    \"CSSMediaRule\",\n    \"CSSMozDocumentRule\",\n    \"CSSNameSpaceRule\",\n    \"CSSNamespaceRule\",\n    \"CSSNumericArray\",\n    \"CSSNumericValue\",\n    \"CSSPageRule\",\n    \"CSSPerspective\",\n    \"CSSPositionValue\",\n    \"CSSPrimitiveValue\",\n    \"CSSRotate\",\n    \"CSSRule\",\n    \"CSSRuleList\",\n    \"CSSScale\",\n    \"CSSSkew\",\n    \"CSSSkewX\",\n    \"CSSSkewY\",\n    \"CSSStyleDeclaration\",\n    \"CSSStyleRule\",\n    \"CSSStyleSheet\",\n    \"CSSStyleValue\",\n    \"CSSSupportsRule\",\n    \"CSSTransformComponent\",\n    \"CSSTransformValue\",\n    \"CSSTransition\",\n    \"CSSTranslate\",\n    \"CSSUnitValue\",\n    \"CSSUnknownRule\",\n    \"CSSUnparsedValue\",\n    \"CSSValue\",\n    \"CSSValueList\",\n    \"CSSVariableReferenceValue\",\n    \"CSSVariablesDeclaration\",\n    \"CSSVariablesRule\",\n    \"CSSViewportRule\",\n    \"CSS_ATTR\",\n    \"CSS_CM\",\n    \"CSS_COUNTER\",\n    \"CSS_CUSTOM\",\n    \"CSS_DEG\",\n    \"CSS_DIMENSION\",\n    \"CSS_EMS\",\n    \"CSS_EXS\",\n    \"CSS_FILTER_BLUR\",\n    \"CSS_FILTER_BRIGHTNESS\",\n    \"CSS_FILTER_CONTRAST\",\n    \"CSS_FILTER_CUSTOM\",\n    \"CSS_FILTER_DROP_SHADOW\",\n    \"CSS_FILTER_GRAYSCALE\",\n    \"CSS_FILTER_HUE_ROTATE\",\n    \"CSS_FILTER_INVERT\",\n    \"CSS_FILTER_OPACITY\",\n    \"CSS_FILTER_REFERENCE\",\n    \"CSS_FILTER_SATURATE\",\n    \"CSS_FILTER_SEPIA\",\n    \"CSS_GRAD\",\n    \"CSS_HZ\",\n    \"CSS_IDENT\",\n    \"CSS_IN\",\n    \"CSS_INHERIT\",\n    \"CSS_KHZ\",\n    \"CSS_MATRIX\",\n    \"CSS_MATRIX3D\",\n    \"CSS_MM\",\n    \"CSS_MS\",\n    \"CSS_NUMBER\",\n    \"CSS_PC\",\n    \"CSS_PERCENTAGE\",\n    \"CSS_PERSPECTIVE\",\n    \"CSS_PRIMITIVE_VALUE\",\n    \"CSS_PT\",\n    \"CSS_PX\",\n    \"CSS_RAD\",\n    \"CSS_RECT\",\n    \"CSS_RGBCOLOR\",\n    \"CSS_ROTATE\",\n    \"CSS_ROTATE3D\",\n    \"CSS_ROTATEX\",\n    \"CSS_ROTATEY\",\n    \"CSS_ROTATEZ\",\n    \"CSS_S\",\n    \"CSS_SCALE\",\n    \"CSS_SCALE3D\",\n    \"CSS_SCALEX\",\n    \"CSS_SCALEY\",\n    \"CSS_SCALEZ\",\n    \"CSS_SKEW\",\n    \"CSS_SKEWX\",\n    \"CSS_SKEWY\",\n    \"CSS_STRING\",\n    \"CSS_TRANSLATE\",\n    \"CSS_TRANSLATE3D\",\n    \"CSS_TRANSLATEX\",\n    \"CSS_TRANSLATEY\",\n    \"CSS_TRANSLATEZ\",\n    \"CSS_UNKNOWN\",\n    \"CSS_URI\",\n    \"CSS_VALUE_LIST\",\n    \"CSS_VH\",\n    \"CSS_VMAX\",\n    \"CSS_VMIN\",\n    \"CSS_VW\",\n    \"CULL_FACE\",\n    \"CULL_FACE_MODE\",\n    \"CURRENT_PROGRAM\",\n    \"CURRENT_QUERY\",\n    \"CURRENT_VERTEX_ATTRIB\",\n    \"CUSTOM\",\n    \"CW\",\n    \"Cache\",\n    \"CacheStorage\",\n    \"CanvasCaptureMediaStream\",\n    \"CanvasCaptureMediaStreamTrack\",\n    \"CanvasGradient\",\n    \"CanvasPattern\",\n    \"CanvasRenderingContext2D\",\n    \"CaretPosition\",\n    \"ChannelMergerNode\",\n    \"ChannelSplitterNode\",\n    \"CharacterData\",\n    \"ClientRect\",\n    \"ClientRectList\",\n    \"Clipboard\",\n    \"ClipboardEvent\",\n    \"ClipboardItem\",\n    \"CloseEvent\",\n    \"Collator\",\n    \"CommandEvent\",\n    \"Comment\",\n    \"CompileError\",\n    \"CompositionEvent\",\n    \"CompressionStream\",\n    \"Console\",\n    \"ConstantSourceNode\",\n    \"Controllers\",\n    \"ConvolverNode\",\n    \"CountQueuingStrategy\",\n    \"Counter\",\n    \"Credential\",\n    \"CredentialsContainer\",\n    \"Crypto\",\n    \"CryptoKey\",\n    \"CustomElementRegistry\",\n    \"CustomEvent\",\n    \"DATABASE_ERR\",\n    \"DATA_CLONE_ERR\",\n    \"DATA_ERR\",\n    \"DBLCLICK\",\n    \"DECR\",\n    \"DECR_WRAP\",\n    \"DELETE_STATUS\",\n    \"DEPTH\",\n    \"DEPTH24_STENCIL8\",\n    \"DEPTH32F_STENCIL8\",\n    \"DEPTH_ATTACHMENT\",\n    \"DEPTH_BITS\",\n    \"DEPTH_BUFFER_BIT\",\n    \"DEPTH_CLEAR_VALUE\",\n    \"DEPTH_COMPONENT\",\n    \"DEPTH_COMPONENT16\",\n    \"DEPTH_COMPONENT24\",\n    \"DEPTH_COMPONENT32F\",\n    \"DEPTH_FUNC\",\n    \"DEPTH_RANGE\",\n    \"DEPTH_STENCIL\",\n    \"DEPTH_STENCIL_ATTACHMENT\",\n    \"DEPTH_TEST\",\n    \"DEPTH_WRITEMASK\",\n    \"DEVICE_INELIGIBLE\",\n    \"DIRECTION_DOWN\",\n    \"DIRECTION_LEFT\",\n    \"DIRECTION_RIGHT\",\n    \"DIRECTION_UP\",\n    \"DISABLED\",\n    \"DISPATCH_REQUEST_ERR\",\n    \"DITHER\",\n    \"DOCUMENT_FRAGMENT_NODE\",\n    \"DOCUMENT_NODE\",\n    \"DOCUMENT_POSITION_CONTAINED_BY\",\n    \"DOCUMENT_POSITION_CONTAINS\",\n    \"DOCUMENT_POSITION_DISCONNECTED\",\n    \"DOCUMENT_POSITION_FOLLOWING\",\n    \"DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC\",\n    \"DOCUMENT_POSITION_PRECEDING\",\n    \"DOCUMENT_TYPE_NODE\",\n    \"DOMCursor\",\n    \"DOMError\",\n    \"DOMException\",\n    \"DOMImplementation\",\n    \"DOMImplementationLS\",\n    \"DOMMatrix\",\n    \"DOMMatrixReadOnly\",\n    \"DOMParser\",\n    \"DOMPoint\",\n    \"DOMPointReadOnly\",\n    \"DOMQuad\",\n    \"DOMRect\",\n    \"DOMRectList\",\n    \"DOMRectReadOnly\",\n    \"DOMRequest\",\n    \"DOMSTRING_SIZE_ERR\",\n    \"DOMSettableTokenList\",\n    \"DOMStringList\",\n    \"DOMStringMap\",\n    \"DOMTokenList\",\n    \"DOMTransactionEvent\",\n    \"DOM_DELTA_LINE\",\n    \"DOM_DELTA_PAGE\",\n    \"DOM_DELTA_PIXEL\",\n    \"DOM_INPUT_METHOD_DROP\",\n    \"DOM_INPUT_METHOD_HANDWRITING\",\n    \"DOM_INPUT_METHOD_IME\",\n    \"DOM_INPUT_METHOD_KEYBOARD\",\n    \"DOM_INPUT_METHOD_MULTIMODAL\",\n    \"DOM_INPUT_METHOD_OPTION\",\n    \"DOM_INPUT_METHOD_PASTE\",\n    \"DOM_INPUT_METHOD_SCRIPT\",\n    \"DOM_INPUT_METHOD_UNKNOWN\",\n    \"DOM_INPUT_METHOD_VOICE\",\n    \"DOM_KEY_LOCATION_JOYSTICK\",\n    \"DOM_KEY_LOCATION_LEFT\",\n    \"DOM_KEY_LOCATION_MOBILE\",\n    \"DOM_KEY_LOCATION_NUMPAD\",\n    \"DOM_KEY_LOCATION_RIGHT\",\n    \"DOM_KEY_LOCATION_STANDARD\",\n    \"DOM_VK_0\",\n    \"DOM_VK_1\",\n    \"DOM_VK_2\",\n    \"DOM_VK_3\",\n    \"DOM_VK_4\",\n    \"DOM_VK_5\",\n    \"DOM_VK_6\",\n    \"DOM_VK_7\",\n    \"DOM_VK_8\",\n    \"DOM_VK_9\",\n    \"DOM_VK_A\",\n    \"DOM_VK_ACCEPT\",\n    \"DOM_VK_ADD\",\n    \"DOM_VK_ALT\",\n    \"DOM_VK_ALTGR\",\n    \"DOM_VK_AMPERSAND\",\n    \"DOM_VK_ASTERISK\",\n    \"DOM_VK_AT\",\n    \"DOM_VK_ATTN\",\n    \"DOM_VK_B\",\n    \"DOM_VK_BACKSPACE\",\n    \"DOM_VK_BACK_QUOTE\",\n    \"DOM_VK_BACK_SLASH\",\n    \"DOM_VK_BACK_SPACE\",\n    \"DOM_VK_C\",\n    \"DOM_VK_CANCEL\",\n    \"DOM_VK_CAPS_LOCK\",\n    \"DOM_VK_CIRCUMFLEX\",\n    \"DOM_VK_CLEAR\",\n    \"DOM_VK_CLOSE_BRACKET\",\n    \"DOM_VK_CLOSE_CURLY_BRACKET\",\n    \"DOM_VK_CLOSE_PAREN\",\n    \"DOM_VK_COLON\",\n    \"DOM_VK_COMMA\",\n    \"DOM_VK_CONTEXT_MENU\",\n    \"DOM_VK_CONTROL\",\n    \"DOM_VK_CONVERT\",\n    \"DOM_VK_CRSEL\",\n    \"DOM_VK_CTRL\",\n    \"DOM_VK_D\",\n    \"DOM_VK_DECIMAL\",\n    \"DOM_VK_DELETE\",\n    \"DOM_VK_DIVIDE\",\n    \"DOM_VK_DOLLAR\",\n    \"DOM_VK_DOUBLE_QUOTE\",\n    \"DOM_VK_DOWN\",\n    \"DOM_VK_E\",\n    \"DOM_VK_EISU\",\n    \"DOM_VK_END\",\n    \"DOM_VK_ENTER\",\n    \"DOM_VK_EQUALS\",\n    \"DOM_VK_EREOF\",\n    \"DOM_VK_ESCAPE\",\n    \"DOM_VK_EXCLAMATION\",\n    \"DOM_VK_EXECUTE\",\n    \"DOM_VK_EXSEL\",\n    \"DOM_VK_F\",\n    \"DOM_VK_F1\",\n    \"DOM_VK_F10\",\n    \"DOM_VK_F11\",\n    \"DOM_VK_F12\",\n    \"DOM_VK_F13\",\n    \"DOM_VK_F14\",\n    \"DOM_VK_F15\",\n    \"DOM_VK_F16\",\n    \"DOM_VK_F17\",\n    \"DOM_VK_F18\",\n    \"DOM_VK_F19\",\n    \"DOM_VK_F2\",\n    \"DOM_VK_F20\",\n    \"DOM_VK_F21\",\n    \"DOM_VK_F22\",\n    \"DOM_VK_F23\",\n    \"DOM_VK_F24\",\n    \"DOM_VK_F25\",\n    \"DOM_VK_F26\",\n    \"DOM_VK_F27\",\n    \"DOM_VK_F28\",\n    \"DOM_VK_F29\",\n    \"DOM_VK_F3\",\n    \"DOM_VK_F30\",\n    \"DOM_VK_F31\",\n    \"DOM_VK_F32\",\n    \"DOM_VK_F33\",\n    \"DOM_VK_F34\",\n    \"DOM_VK_F35\",\n    \"DOM_VK_F36\",\n    \"DOM_VK_F4\",\n    \"DOM_VK_F5\",\n    \"DOM_VK_F6\",\n    \"DOM_VK_F7\",\n    \"DOM_VK_F8\",\n    \"DOM_VK_F9\",\n    \"DOM_VK_FINAL\",\n    \"DOM_VK_FRONT\",\n    \"DOM_VK_G\",\n    \"DOM_VK_GREATER_THAN\",\n    \"DOM_VK_H\",\n    \"DOM_VK_HANGUL\",\n    \"DOM_VK_HANJA\",\n    \"DOM_VK_HASH\",\n    \"DOM_VK_HELP\",\n    \"DOM_VK_HK_TOGGLE\",\n    \"DOM_VK_HOME\",\n    \"DOM_VK_HYPHEN_MINUS\",\n    \"DOM_VK_I\",\n    \"DOM_VK_INSERT\",\n    \"DOM_VK_J\",\n    \"DOM_VK_JUNJA\",\n    \"DOM_VK_K\",\n    \"DOM_VK_KANA\",\n    \"DOM_VK_KANJI\",\n    \"DOM_VK_L\",\n    \"DOM_VK_LEFT\",\n    \"DOM_VK_LEFT_TAB\",\n    \"DOM_VK_LESS_THAN\",\n    \"DOM_VK_M\",\n    \"DOM_VK_META\",\n    \"DOM_VK_MODECHANGE\",\n    \"DOM_VK_MULTIPLY\",\n    \"DOM_VK_N\",\n    \"DOM_VK_NONCONVERT\",\n    \"DOM_VK_NUMPAD0\",\n    \"DOM_VK_NUMPAD1\",\n    \"DOM_VK_NUMPAD2\",\n    \"DOM_VK_NUMPAD3\",\n    \"DOM_VK_NUMPAD4\",\n    \"DOM_VK_NUMPAD5\",\n    \"DOM_VK_NUMPAD6\",\n    \"DOM_VK_NUMPAD7\",\n    \"DOM_VK_NUMPAD8\",\n    \"DOM_VK_NUMPAD9\",\n    \"DOM_VK_NUM_LOCK\",\n    \"DOM_VK_O\",\n    \"DOM_VK_OEM_1\",\n    \"DOM_VK_OEM_102\",\n    \"DOM_VK_OEM_2\",\n    \"DOM_VK_OEM_3\",\n    \"DOM_VK_OEM_4\",\n    \"DOM_VK_OEM_5\",\n    \"DOM_VK_OEM_6\",\n    \"DOM_VK_OEM_7\",\n    \"DOM_VK_OEM_8\",\n    \"DOM_VK_OEM_COMMA\",\n    \"DOM_VK_OEM_MINUS\",\n    \"DOM_VK_OEM_PERIOD\",\n    \"DOM_VK_OEM_PLUS\",\n    \"DOM_VK_OPEN_BRACKET\",\n    \"DOM_VK_OPEN_CURLY_BRACKET\",\n    \"DOM_VK_OPEN_PAREN\",\n    \"DOM_VK_P\",\n    \"DOM_VK_PA1\",\n    \"DOM_VK_PAGEDOWN\",\n    \"DOM_VK_PAGEUP\",\n    \"DOM_VK_PAGE_DOWN\",\n    \"DOM_VK_PAGE_UP\",\n    \"DOM_VK_PAUSE\",\n    \"DOM_VK_PERCENT\",\n    \"DOM_VK_PERIOD\",\n    \"DOM_VK_PIPE\",\n    \"DOM_VK_PLAY\",\n    \"DOM_VK_PLUS\",\n    \"DOM_VK_PRINT\",\n    \"DOM_VK_PRINTSCREEN\",\n    \"DOM_VK_PROCESSKEY\",\n    \"DOM_VK_PROPERITES\",\n    \"DOM_VK_Q\",\n    \"DOM_VK_QUESTION_MARK\",\n    \"DOM_VK_QUOTE\",\n    \"DOM_VK_R\",\n    \"DOM_VK_REDO\",\n    \"DOM_VK_RETURN\",\n    \"DOM_VK_RIGHT\",\n    \"DOM_VK_S\",\n    \"DOM_VK_SCROLL_LOCK\",\n    \"DOM_VK_SELECT\",\n    \"DOM_VK_SEMICOLON\",\n    \"DOM_VK_SEPARATOR\",\n    \"DOM_VK_SHIFT\",\n    \"DOM_VK_SLASH\",\n    \"DOM_VK_SLEEP\",\n    \"DOM_VK_SPACE\",\n    \"DOM_VK_SUBTRACT\",\n    \"DOM_VK_T\",\n    \"DOM_VK_TAB\",\n    \"DOM_VK_TILDE\",\n    \"DOM_VK_U\",\n    \"DOM_VK_UNDERSCORE\",\n    \"DOM_VK_UNDO\",\n    \"DOM_VK_UNICODE\",\n    \"DOM_VK_UP\",\n    \"DOM_VK_V\",\n    \"DOM_VK_VOLUME_DOWN\",\n    \"DOM_VK_VOLUME_MUTE\",\n    \"DOM_VK_VOLUME_UP\",\n    \"DOM_VK_W\",\n    \"DOM_VK_WIN\",\n    \"DOM_VK_WINDOW\",\n    \"DOM_VK_WIN_ICO_00\",\n    \"DOM_VK_WIN_ICO_CLEAR\",\n    \"DOM_VK_WIN_ICO_HELP\",\n    \"DOM_VK_WIN_OEM_ATTN\",\n    \"DOM_VK_WIN_OEM_AUTO\",\n    \"DOM_VK_WIN_OEM_BACKTAB\",\n    \"DOM_VK_WIN_OEM_CLEAR\",\n    \"DOM_VK_WIN_OEM_COPY\",\n    \"DOM_VK_WIN_OEM_CUSEL\",\n    \"DOM_VK_WIN_OEM_ENLW\",\n    \"DOM_VK_WIN_OEM_FINISH\",\n    \"DOM_VK_WIN_OEM_FJ_JISHO\",\n    \"DOM_VK_WIN_OEM_FJ_LOYA\",\n    \"DOM_VK_WIN_OEM_FJ_MASSHOU\",\n    \"DOM_VK_WIN_OEM_FJ_ROYA\",\n    \"DOM_VK_WIN_OEM_FJ_TOUROKU\",\n    \"DOM_VK_WIN_OEM_JUMP\",\n    \"DOM_VK_WIN_OEM_PA1\",\n    \"DOM_VK_WIN_OEM_PA2\",\n    \"DOM_VK_WIN_OEM_PA3\",\n    \"DOM_VK_WIN_OEM_RESET\",\n    \"DOM_VK_WIN_OEM_WSCTRL\",\n    \"DOM_VK_X\",\n    \"DOM_VK_XF86XK_ADD_FAVORITE\",\n    \"DOM_VK_XF86XK_APPLICATION_LEFT\",\n    \"DOM_VK_XF86XK_APPLICATION_RIGHT\",\n    \"DOM_VK_XF86XK_AUDIO_CYCLE_TRACK\",\n    \"DOM_VK_XF86XK_AUDIO_FORWARD\",\n    \"DOM_VK_XF86XK_AUDIO_LOWER_VOLUME\",\n    \"DOM_VK_XF86XK_AUDIO_MEDIA\",\n    \"DOM_VK_XF86XK_AUDIO_MUTE\",\n    \"DOM_VK_XF86XK_AUDIO_NEXT\",\n    \"DOM_VK_XF86XK_AUDIO_PAUSE\",\n    \"DOM_VK_XF86XK_AUDIO_PLAY\",\n    \"DOM_VK_XF86XK_AUDIO_PREV\",\n    \"DOM_VK_XF86XK_AUDIO_RAISE_VOLUME\",\n    \"DOM_VK_XF86XK_AUDIO_RANDOM_PLAY\",\n    \"DOM_VK_XF86XK_AUDIO_RECORD\",\n    \"DOM_VK_XF86XK_AUDIO_REPEAT\",\n    \"DOM_VK_XF86XK_AUDIO_REWIND\",\n    \"DOM_VK_XF86XK_AUDIO_STOP\",\n    \"DOM_VK_XF86XK_AWAY\",\n    \"DOM_VK_XF86XK_BACK\",\n    \"DOM_VK_XF86XK_BACK_FORWARD\",\n    \"DOM_VK_XF86XK_BATTERY\",\n    \"DOM_VK_XF86XK_BLUE\",\n    \"DOM_VK_XF86XK_BLUETOOTH\",\n    \"DOM_VK_XF86XK_BOOK\",\n    \"DOM_VK_XF86XK_BRIGHTNESS_ADJUST\",\n    \"DOM_VK_XF86XK_CALCULATOR\",\n    \"DOM_VK_XF86XK_CALENDAR\",\n    \"DOM_VK_XF86XK_CD\",\n    \"DOM_VK_XF86XK_CLOSE\",\n    \"DOM_VK_XF86XK_COMMUNITY\",\n    \"DOM_VK_XF86XK_CONTRAST_ADJUST\",\n    \"DOM_VK_XF86XK_COPY\",\n    \"DOM_VK_XF86XK_CUT\",\n    \"DOM_VK_XF86XK_CYCLE_ANGLE\",\n    \"DOM_VK_XF86XK_DISPLAY\",\n    \"DOM_VK_XF86XK_DOCUMENTS\",\n    \"DOM_VK_XF86XK_DOS\",\n    \"DOM_VK_XF86XK_EJECT\",\n    \"DOM_VK_XF86XK_EXCEL\",\n    \"DOM_VK_XF86XK_EXPLORER\",\n    \"DOM_VK_XF86XK_FAVORITES\",\n    \"DOM_VK_XF86XK_FINANCE\",\n    \"DOM_VK_XF86XK_FORWARD\",\n    \"DOM_VK_XF86XK_FRAME_BACK\",\n    \"DOM_VK_XF86XK_FRAME_FORWARD\",\n    \"DOM_VK_XF86XK_GAME\",\n    \"DOM_VK_XF86XK_GO\",\n    \"DOM_VK_XF86XK_GREEN\",\n    \"DOM_VK_XF86XK_HIBERNATE\",\n    \"DOM_VK_XF86XK_HISTORY\",\n    \"DOM_VK_XF86XK_HOME_PAGE\",\n    \"DOM_VK_XF86XK_HOT_LINKS\",\n    \"DOM_VK_XF86XK_I_TOUCH\",\n    \"DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN\",\n    \"DOM_VK_XF86XK_KBD_BRIGHTNESS_UP\",\n    \"DOM_VK_XF86XK_KBD_LIGHT_ON_OFF\",\n    \"DOM_VK_XF86XK_LAUNCH0\",\n    \"DOM_VK_XF86XK_LAUNCH1\",\n    \"DOM_VK_XF86XK_LAUNCH2\",\n    \"DOM_VK_XF86XK_LAUNCH3\",\n    \"DOM_VK_XF86XK_LAUNCH4\",\n    \"DOM_VK_XF86XK_LAUNCH5\",\n    \"DOM_VK_XF86XK_LAUNCH6\",\n    \"DOM_VK_XF86XK_LAUNCH7\",\n    \"DOM_VK_XF86XK_LAUNCH8\",\n    \"DOM_VK_XF86XK_LAUNCH9\",\n    \"DOM_VK_XF86XK_LAUNCH_A\",\n    \"DOM_VK_XF86XK_LAUNCH_B\",\n    \"DOM_VK_XF86XK_LAUNCH_C\",\n    \"DOM_VK_XF86XK_LAUNCH_D\",\n    \"DOM_VK_XF86XK_LAUNCH_E\",\n    \"DOM_VK_XF86XK_LAUNCH_F\",\n    \"DOM_VK_XF86XK_LIGHT_BULB\",\n    \"DOM_VK_XF86XK_LOG_OFF\",\n    \"DOM_VK_XF86XK_MAIL\",\n    \"DOM_VK_XF86XK_MAIL_FORWARD\",\n    \"DOM_VK_XF86XK_MARKET\",\n    \"DOM_VK_XF86XK_MEETING\",\n    \"DOM_VK_XF86XK_MEMO\",\n    \"DOM_VK_XF86XK_MENU_KB\",\n    \"DOM_VK_XF86XK_MENU_PB\",\n    \"DOM_VK_XF86XK_MESSENGER\",\n    \"DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN\",\n    \"DOM_VK_XF86XK_MON_BRIGHTNESS_UP\",\n    \"DOM_VK_XF86XK_MUSIC\",\n    \"DOM_VK_XF86XK_MY_COMPUTER\",\n    \"DOM_VK_XF86XK_MY_SITES\",\n    \"DOM_VK_XF86XK_NEW\",\n    \"DOM_VK_XF86XK_NEWS\",\n    \"DOM_VK_XF86XK_OFFICE_HOME\",\n    \"DOM_VK_XF86XK_OPEN\",\n    \"DOM_VK_XF86XK_OPEN_URL\",\n    \"DOM_VK_XF86XK_OPTION\",\n    \"DOM_VK_XF86XK_PASTE\",\n    \"DOM_VK_XF86XK_PHONE\",\n    \"DOM_VK_XF86XK_PICTURES\",\n    \"DOM_VK_XF86XK_POWER_DOWN\",\n    \"DOM_VK_XF86XK_POWER_OFF\",\n    \"DOM_VK_XF86XK_RED\",\n    \"DOM_VK_XF86XK_REFRESH\",\n    \"DOM_VK_XF86XK_RELOAD\",\n    \"DOM_VK_XF86XK_REPLY\",\n    \"DOM_VK_XF86XK_ROCKER_DOWN\",\n    \"DOM_VK_XF86XK_ROCKER_ENTER\",\n    \"DOM_VK_XF86XK_ROCKER_UP\",\n    \"DOM_VK_XF86XK_ROTATE_WINDOWS\",\n    \"DOM_VK_XF86XK_ROTATION_KB\",\n    \"DOM_VK_XF86XK_ROTATION_PB\",\n    \"DOM_VK_XF86XK_SAVE\",\n    \"DOM_VK_XF86XK_SCREEN_SAVER\",\n    \"DOM_VK_XF86XK_SCROLL_CLICK\",\n    \"DOM_VK_XF86XK_SCROLL_DOWN\",\n    \"DOM_VK_XF86XK_SCROLL_UP\",\n    \"DOM_VK_XF86XK_SEARCH\",\n    \"DOM_VK_XF86XK_SEND\",\n    \"DOM_VK_XF86XK_SHOP\",\n    \"DOM_VK_XF86XK_SPELL\",\n    \"DOM_VK_XF86XK_SPLIT_SCREEN\",\n    \"DOM_VK_XF86XK_STANDBY\",\n    \"DOM_VK_XF86XK_START\",\n    \"DOM_VK_XF86XK_STOP\",\n    \"DOM_VK_XF86XK_SUBTITLE\",\n    \"DOM_VK_XF86XK_SUPPORT\",\n    \"DOM_VK_XF86XK_SUSPEND\",\n    \"DOM_VK_XF86XK_TASK_PANE\",\n    \"DOM_VK_XF86XK_TERMINAL\",\n    \"DOM_VK_XF86XK_TIME\",\n    \"DOM_VK_XF86XK_TOOLS\",\n    \"DOM_VK_XF86XK_TOP_MENU\",\n    \"DOM_VK_XF86XK_TO_DO_LIST\",\n    \"DOM_VK_XF86XK_TRAVEL\",\n    \"DOM_VK_XF86XK_USER1KB\",\n    \"DOM_VK_XF86XK_USER2KB\",\n    \"DOM_VK_XF86XK_USER_PB\",\n    \"DOM_VK_XF86XK_UWB\",\n    \"DOM_VK_XF86XK_VENDOR_HOME\",\n    \"DOM_VK_XF86XK_VIDEO\",\n    \"DOM_VK_XF86XK_VIEW\",\n    \"DOM_VK_XF86XK_WAKE_UP\",\n    \"DOM_VK_XF86XK_WEB_CAM\",\n    \"DOM_VK_XF86XK_WHEEL_BUTTON\",\n    \"DOM_VK_XF86XK_WLAN\",\n    \"DOM_VK_XF86XK_WORD\",\n    \"DOM_VK_XF86XK_WWW\",\n    \"DOM_VK_XF86XK_XFER\",\n    \"DOM_VK_XF86XK_YELLOW\",\n    \"DOM_VK_XF86XK_ZOOM_IN\",\n    \"DOM_VK_XF86XK_ZOOM_OUT\",\n    \"DOM_VK_Y\",\n    \"DOM_VK_Z\",\n    \"DOM_VK_ZOOM\",\n    \"DONE\",\n    \"DONT_CARE\",\n    \"DOWNLOADING\",\n    \"DRAGDROP\",\n    \"DRAW_BUFFER0\",\n    \"DRAW_BUFFER1\",\n    \"DRAW_BUFFER10\",\n    \"DRAW_BUFFER11\",\n    \"DRAW_BUFFER12\",\n    \"DRAW_BUFFER13\",\n    \"DRAW_BUFFER14\",\n    \"DRAW_BUFFER15\",\n    \"DRAW_BUFFER2\",\n    \"DRAW_BUFFER3\",\n    \"DRAW_BUFFER4\",\n    \"DRAW_BUFFER5\",\n    \"DRAW_BUFFER6\",\n    \"DRAW_BUFFER7\",\n    \"DRAW_BUFFER8\",\n    \"DRAW_BUFFER9\",\n    \"DRAW_FRAMEBUFFER\",\n    \"DRAW_FRAMEBUFFER_BINDING\",\n    \"DST_ALPHA\",\n    \"DST_COLOR\",\n    \"DYNAMIC_COPY\",\n    \"DYNAMIC_DRAW\",\n    \"DYNAMIC_READ\",\n    \"DataChannel\",\n    \"DataTransfer\",\n    \"DataTransferItem\",\n    \"DataTransferItemList\",\n    \"DataView\",\n    \"Date\",\n    \"DateTimeFormat\",\n    \"DecompressionStream\",\n    \"DelayNode\",\n    \"DeprecationReportBody\",\n    \"DesktopNotification\",\n    \"DesktopNotificationCenter\",\n    \"DeviceLightEvent\",\n    \"DeviceMotionEvent\",\n    \"DeviceMotionEventAcceleration\",\n    \"DeviceMotionEventRotationRate\",\n    \"DeviceOrientationEvent\",\n    \"DeviceProximityEvent\",\n    \"DeviceStorage\",\n    \"DeviceStorageChangeEvent\",\n    \"Directory\",\n    \"DisplayNames\",\n    \"Document\",\n    \"DocumentFragment\",\n    \"DocumentTimeline\",\n    \"DocumentType\",\n    \"DragEvent\",\n    \"DynamicsCompressorNode\",\n    \"E\",\n    \"ELEMENT_ARRAY_BUFFER\",\n    \"ELEMENT_ARRAY_BUFFER_BINDING\",\n    \"ELEMENT_NODE\",\n    \"EMPTY\",\n    \"ENCODING_ERR\",\n    \"ENDED\",\n    \"END_TO_END\",\n    \"END_TO_START\",\n    \"ENTITY_NODE\",\n    \"ENTITY_REFERENCE_NODE\",\n    \"EPSILON\",\n    \"EQUAL\",\n    \"EQUALPOWER\",\n    \"ERROR\",\n    \"EXPONENTIAL_DISTANCE\",\n    \"Element\",\n    \"ElementInternals\",\n    \"ElementQuery\",\n    \"EnterPictureInPictureEvent\",\n    \"Entity\",\n    \"EntityReference\",\n    \"Error\",\n    \"ErrorEvent\",\n    \"EvalError\",\n    \"Event\",\n    \"EventException\",\n    \"EventSource\",\n    \"EventTarget\",\n    \"External\",\n    \"FASTEST\",\n    \"FIDOSDK\",\n    \"FILTER_ACCEPT\",\n    \"FILTER_INTERRUPT\",\n    \"FILTER_REJECT\",\n    \"FILTER_SKIP\",\n    \"FINISHED_STATE\",\n    \"FIRST_ORDERED_NODE_TYPE\",\n    \"FLOAT\",\n    \"FLOAT_32_UNSIGNED_INT_24_8_REV\",\n    \"FLOAT_MAT2\",\n    \"FLOAT_MAT2x3\",\n    \"FLOAT_MAT2x4\",\n    \"FLOAT_MAT3\",\n    \"FLOAT_MAT3x2\",\n    \"FLOAT_MAT3x4\",\n    \"FLOAT_MAT4\",\n    \"FLOAT_MAT4x2\",\n    \"FLOAT_MAT4x3\",\n    \"FLOAT_VEC2\",\n    \"FLOAT_VEC3\",\n    \"FLOAT_VEC4\",\n    \"FOCUS\",\n    \"FONT_FACE_RULE\",\n    \"FONT_FEATURE_VALUES_RULE\",\n    \"FRAGMENT_SHADER\",\n    \"FRAGMENT_SHADER_DERIVATIVE_HINT\",\n    \"FRAGMENT_SHADER_DERIVATIVE_HINT_OES\",\n    \"FRAMEBUFFER\",\n    \"FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\",\n    \"FRAMEBUFFER_ATTACHMENT_BLUE_SIZE\",\n    \"FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\",\n    \"FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\",\n    \"FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\",\n    \"FRAMEBUFFER_ATTACHMENT_GREEN_SIZE\",\n    \"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\",\n    \"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\",\n    \"FRAMEBUFFER_ATTACHMENT_RED_SIZE\",\n    \"FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\",\n    \"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\",\n    \"FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\",\n    \"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\",\n    \"FRAMEBUFFER_BINDING\",\n    \"FRAMEBUFFER_COMPLETE\",\n    \"FRAMEBUFFER_DEFAULT\",\n    \"FRAMEBUFFER_INCOMPLETE_ATTACHMENT\",\n    \"FRAMEBUFFER_INCOMPLETE_DIMENSIONS\",\n    \"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\",\n    \"FRAMEBUFFER_INCOMPLETE_MULTISAMPLE\",\n    \"FRAMEBUFFER_UNSUPPORTED\",\n    \"FRONT\",\n    \"FRONT_AND_BACK\",\n    \"FRONT_FACE\",\n    \"FUNC_ADD\",\n    \"FUNC_REVERSE_SUBTRACT\",\n    \"FUNC_SUBTRACT\",\n    \"FeaturePolicy\",\n    \"FeaturePolicyViolationReportBody\",\n    \"FederatedCredential\",\n    \"Feed\",\n    \"FeedEntry\",\n    \"File\",\n    \"FileError\",\n    \"FileList\",\n    \"FileReader\",\n    \"FileSystem\",\n    \"FileSystemDirectoryEntry\",\n    \"FileSystemDirectoryReader\",\n    \"FileSystemEntry\",\n    \"FileSystemFileEntry\",\n    \"FinalizationRegistry\",\n    \"FindInPage\",\n    \"Float32Array\",\n    \"Float64Array\",\n    \"FocusEvent\",\n    \"FontFace\",\n    \"FontFaceSet\",\n    \"FontFaceSetLoadEvent\",\n    \"FormData\",\n    \"FormDataEvent\",\n    \"FragmentDirective\",\n    \"Function\",\n    \"GENERATE_MIPMAP_HINT\",\n    \"GEQUAL\",\n    \"GREATER\",\n    \"GREEN_BITS\",\n    \"GainNode\",\n    \"Gamepad\",\n    \"GamepadAxisMoveEvent\",\n    \"GamepadButton\",\n    \"GamepadButtonEvent\",\n    \"GamepadEvent\",\n    \"GamepadHapticActuator\",\n    \"GamepadPose\",\n    \"Geolocation\",\n    \"GeolocationCoordinates\",\n    \"GeolocationPosition\",\n    \"GeolocationPositionError\",\n    \"GestureEvent\",\n    \"Global\",\n    \"Gyroscope\",\n    \"HALF_FLOAT\",\n    \"HAVE_CURRENT_DATA\",\n    \"HAVE_ENOUGH_DATA\",\n    \"HAVE_FUTURE_DATA\",\n    \"HAVE_METADATA\",\n    \"HAVE_NOTHING\",\n    \"HEADERS_RECEIVED\",\n    \"HIDDEN\",\n    \"HIERARCHY_REQUEST_ERR\",\n    \"HIGHPASS\",\n    \"HIGHSHELF\",\n    \"HIGH_FLOAT\",\n    \"HIGH_INT\",\n    \"HORIZONTAL\",\n    \"HORIZONTAL_AXIS\",\n    \"HRTF\",\n    \"HTMLAllCollection\",\n    \"HTMLAnchorElement\",\n    \"HTMLAppletElement\",\n    \"HTMLAreaElement\",\n    \"HTMLAudioElement\",\n    \"HTMLBRElement\",\n    \"HTMLBaseElement\",\n    \"HTMLBaseFontElement\",\n    \"HTMLBlockquoteElement\",\n    \"HTMLBodyElement\",\n    \"HTMLButtonElement\",\n    \"HTMLCanvasElement\",\n    \"HTMLCollection\",\n    \"HTMLCommandElement\",\n    \"HTMLContentElement\",\n    \"HTMLDListElement\",\n    \"HTMLDataElement\",\n    \"HTMLDataListElement\",\n    \"HTMLDetailsElement\",\n    \"HTMLDialogElement\",\n    \"HTMLDirectoryElement\",\n    \"HTMLDivElement\",\n    \"HTMLDocument\",\n    \"HTMLElement\",\n    \"HTMLEmbedElement\",\n    \"HTMLFieldSetElement\",\n    \"HTMLFontElement\",\n    \"HTMLFormControlsCollection\",\n    \"HTMLFormElement\",\n    \"HTMLFrameElement\",\n    \"HTMLFrameSetElement\",\n    \"HTMLHRElement\",\n    \"HTMLHeadElement\",\n    \"HTMLHeadingElement\",\n    \"HTMLHtmlElement\",\n    \"HTMLIFrameElement\",\n    \"HTMLImageElement\",\n    \"HTMLInputElement\",\n    \"HTMLIsIndexElement\",\n    \"HTMLKeygenElement\",\n    \"HTMLLIElement\",\n    \"HTMLLabelElement\",\n    \"HTMLLegendElement\",\n    \"HTMLLinkElement\",\n    \"HTMLMapElement\",\n    \"HTMLMarqueeElement\",\n    \"HTMLMediaElement\",\n    \"HTMLMenuElement\",\n    \"HTMLMenuItemElement\",\n    \"HTMLMetaElement\",\n    \"HTMLMeterElement\",\n    \"HTMLModElement\",\n    \"HTMLOListElement\",\n    \"HTMLObjectElement\",\n    \"HTMLOptGroupElement\",\n    \"HTMLOptionElement\",\n    \"HTMLOptionsCollection\",\n    \"HTMLOutputElement\",\n    \"HTMLParagraphElement\",\n    \"HTMLParamElement\",\n    \"HTMLPictureElement\",\n    \"HTMLPreElement\",\n    \"HTMLProgressElement\",\n    \"HTMLPropertiesCollection\",\n    \"HTMLQuoteElement\",\n    \"HTMLScriptElement\",\n    \"HTMLSelectElement\",\n    \"HTMLShadowElement\",\n    \"HTMLSlotElement\",\n    \"HTMLSourceElement\",\n    \"HTMLSpanElement\",\n    \"HTMLStyleElement\",\n    \"HTMLTableCaptionElement\",\n    \"HTMLTableCellElement\",\n    \"HTMLTableColElement\",\n    \"HTMLTableElement\",\n    \"HTMLTableRowElement\",\n    \"HTMLTableSectionElement\",\n    \"HTMLTemplateElement\",\n    \"HTMLTextAreaElement\",\n    \"HTMLTimeElement\",\n    \"HTMLTitleElement\",\n    \"HTMLTrackElement\",\n    \"HTMLUListElement\",\n    \"HTMLUnknownElement\",\n    \"HTMLVideoElement\",\n    \"HashChangeEvent\",\n    \"Headers\",\n    \"History\",\n    \"Hz\",\n    \"ICE_CHECKING\",\n    \"ICE_CLOSED\",\n    \"ICE_COMPLETED\",\n    \"ICE_CONNECTED\",\n    \"ICE_FAILED\",\n    \"ICE_GATHERING\",\n    \"ICE_WAITING\",\n    \"IDBCursor\",\n    \"IDBCursorWithValue\",\n    \"IDBDatabase\",\n    \"IDBDatabaseException\",\n    \"IDBFactory\",\n    \"IDBFileHandle\",\n    \"IDBFileRequest\",\n    \"IDBIndex\",\n    \"IDBKeyRange\",\n    \"IDBMutableFile\",\n    \"IDBObjectStore\",\n    \"IDBOpenDBRequest\",\n    \"IDBRequest\",\n    \"IDBTransaction\",\n    \"IDBVersionChangeEvent\",\n    \"IDLE\",\n    \"IIRFilterNode\",\n    \"IMPLEMENTATION_COLOR_READ_FORMAT\",\n    \"IMPLEMENTATION_COLOR_READ_TYPE\",\n    \"IMPORT_RULE\",\n    \"INCR\",\n    \"INCR_WRAP\",\n    \"INDEX_SIZE_ERR\",\n    \"INT\",\n    \"INTERLEAVED_ATTRIBS\",\n    \"INT_2_10_10_10_REV\",\n    \"INT_SAMPLER_2D\",\n    \"INT_SAMPLER_2D_ARRAY\",\n    \"INT_SAMPLER_3D\",\n    \"INT_SAMPLER_CUBE\",\n    \"INT_VEC2\",\n    \"INT_VEC3\",\n    \"INT_VEC4\",\n    \"INUSE_ATTRIBUTE_ERR\",\n    \"INVALID_ACCESS_ERR\",\n    \"INVALID_CHARACTER_ERR\",\n    \"INVALID_ENUM\",\n    \"INVALID_EXPRESSION_ERR\",\n    \"INVALID_FRAMEBUFFER_OPERATION\",\n    \"INVALID_INDEX\",\n    \"INVALID_MODIFICATION_ERR\",\n    \"INVALID_NODE_TYPE_ERR\",\n    \"INVALID_OPERATION\",\n    \"INVALID_STATE_ERR\",\n    \"INVALID_VALUE\",\n    \"INVERSE_DISTANCE\",\n    \"INVERT\",\n    \"IceCandidate\",\n    \"IdleDeadline\",\n    \"Image\",\n    \"ImageBitmap\",\n    \"ImageBitmapRenderingContext\",\n    \"ImageCapture\",\n    \"ImageData\",\n    \"Infinity\",\n    \"InputDeviceCapabilities\",\n    \"InputDeviceInfo\",\n    \"InputEvent\",\n    \"InputMethodContext\",\n    \"InstallTrigger\",\n    \"InstallTriggerImpl\",\n    \"Instance\",\n    \"Int16Array\",\n    \"Int32Array\",\n    \"Int8Array\",\n    \"Intent\",\n    \"InternalError\",\n    \"IntersectionObserver\",\n    \"IntersectionObserverEntry\",\n    \"Intl\",\n    \"IsSearchProviderInstalled\",\n    \"Iterator\",\n    \"JSON\",\n    \"KEEP\",\n    \"KEYDOWN\",\n    \"KEYFRAMES_RULE\",\n    \"KEYFRAME_RULE\",\n    \"KEYPRESS\",\n    \"KEYUP\",\n    \"KeyEvent\",\n    \"Keyboard\",\n    \"KeyboardEvent\",\n    \"KeyboardLayoutMap\",\n    \"KeyframeEffect\",\n    \"LENGTHADJUST_SPACING\",\n    \"LENGTHADJUST_SPACINGANDGLYPHS\",\n    \"LENGTHADJUST_UNKNOWN\",\n    \"LEQUAL\",\n    \"LESS\",\n    \"LINEAR\",\n    \"LINEAR_DISTANCE\",\n    \"LINEAR_MIPMAP_LINEAR\",\n    \"LINEAR_MIPMAP_NEAREST\",\n    \"LINES\",\n    \"LINE_LOOP\",\n    \"LINE_STRIP\",\n    \"LINE_WIDTH\",\n    \"LINK_STATUS\",\n    \"LIVE\",\n    \"LN10\",\n    \"LN2\",\n    \"LOADED\",\n    \"LOADING\",\n    \"LOG10E\",\n    \"LOG2E\",\n    \"LOWPASS\",\n    \"LOWSHELF\",\n    \"LOW_FLOAT\",\n    \"LOW_INT\",\n    \"LSException\",\n    \"LSParserFilter\",\n    \"LUMINANCE\",\n    \"LUMINANCE_ALPHA\",\n    \"LargestContentfulPaint\",\n    \"LayoutShift\",\n    \"LayoutShiftAttribution\",\n    \"LinearAccelerationSensor\",\n    \"LinkError\",\n    \"ListFormat\",\n    \"LocalMediaStream\",\n    \"Locale\",\n    \"Location\",\n    \"Lock\",\n    \"LockManager\",\n    \"MAX\",\n    \"MAX_3D_TEXTURE_SIZE\",\n    \"MAX_ARRAY_TEXTURE_LAYERS\",\n    \"MAX_CLIENT_WAIT_TIMEOUT_WEBGL\",\n    \"MAX_COLOR_ATTACHMENTS\",\n    \"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\",\n    \"MAX_COMBINED_TEXTURE_IMAGE_UNITS\",\n    \"MAX_COMBINED_UNIFORM_BLOCKS\",\n    \"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\",\n    \"MAX_CUBE_MAP_TEXTURE_SIZE\",\n    \"MAX_DRAW_BUFFERS\",\n    \"MAX_ELEMENTS_INDICES\",\n    \"MAX_ELEMENTS_VERTICES\",\n    \"MAX_ELEMENT_INDEX\",\n    \"MAX_FRAGMENT_INPUT_COMPONENTS\",\n    \"MAX_FRAGMENT_UNIFORM_BLOCKS\",\n    \"MAX_FRAGMENT_UNIFORM_COMPONENTS\",\n    \"MAX_FRAGMENT_UNIFORM_VECTORS\",\n    \"MAX_PROGRAM_TEXEL_OFFSET\",\n    \"MAX_RENDERBUFFER_SIZE\",\n    \"MAX_SAFE_INTEGER\",\n    \"MAX_SAMPLES\",\n    \"MAX_SERVER_WAIT_TIMEOUT\",\n    \"MAX_TEXTURE_IMAGE_UNITS\",\n    \"MAX_TEXTURE_LOD_BIAS\",\n    \"MAX_TEXTURE_MAX_ANISOTROPY_EXT\",\n    \"MAX_TEXTURE_SIZE\",\n    \"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\",\n    \"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\",\n    \"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\",\n    \"MAX_UNIFORM_BLOCK_SIZE\",\n    \"MAX_UNIFORM_BUFFER_BINDINGS\",\n    \"MAX_VALUE\",\n    \"MAX_VARYING_COMPONENTS\",\n    \"MAX_VARYING_VECTORS\",\n    \"MAX_VERTEX_ATTRIBS\",\n    \"MAX_VERTEX_OUTPUT_COMPONENTS\",\n    \"MAX_VERTEX_TEXTURE_IMAGE_UNITS\",\n    \"MAX_VERTEX_UNIFORM_BLOCKS\",\n    \"MAX_VERTEX_UNIFORM_COMPONENTS\",\n    \"MAX_VERTEX_UNIFORM_VECTORS\",\n    \"MAX_VIEWPORT_DIMS\",\n    \"MEDIA_ERR_ABORTED\",\n    \"MEDIA_ERR_DECODE\",\n    \"MEDIA_ERR_ENCRYPTED\",\n    \"MEDIA_ERR_NETWORK\",\n    \"MEDIA_ERR_SRC_NOT_SUPPORTED\",\n    \"MEDIA_KEYERR_CLIENT\",\n    \"MEDIA_KEYERR_DOMAIN\",\n    \"MEDIA_KEYERR_HARDWARECHANGE\",\n    \"MEDIA_KEYERR_OUTPUT\",\n    \"MEDIA_KEYERR_SERVICE\",\n    \"MEDIA_KEYERR_UNKNOWN\",\n    \"MEDIA_RULE\",\n    \"MEDIUM_FLOAT\",\n    \"MEDIUM_INT\",\n    \"META_MASK\",\n    \"MIDIAccess\",\n    \"MIDIConnectionEvent\",\n    \"MIDIInput\",\n    \"MIDIInputMap\",\n    \"MIDIMessageEvent\",\n    \"MIDIOutput\",\n    \"MIDIOutputMap\",\n    \"MIDIPort\",\n    \"MIN\",\n    \"MIN_PROGRAM_TEXEL_OFFSET\",\n    \"MIN_SAFE_INTEGER\",\n    \"MIN_VALUE\",\n    \"MIRRORED_REPEAT\",\n    \"MODE_ASYNCHRONOUS\",\n    \"MODE_SYNCHRONOUS\",\n    \"MODIFICATION\",\n    \"MOUSEDOWN\",\n    \"MOUSEDRAG\",\n    \"MOUSEMOVE\",\n    \"MOUSEOUT\",\n    \"MOUSEOVER\",\n    \"MOUSEUP\",\n    \"MOZ_KEYFRAMES_RULE\",\n    \"MOZ_KEYFRAME_RULE\",\n    \"MOZ_SOURCE_CURSOR\",\n    \"MOZ_SOURCE_ERASER\",\n    \"MOZ_SOURCE_KEYBOARD\",\n    \"MOZ_SOURCE_MOUSE\",\n    \"MOZ_SOURCE_PEN\",\n    \"MOZ_SOURCE_TOUCH\",\n    \"MOZ_SOURCE_UNKNOWN\",\n    \"MSGESTURE_FLAG_BEGIN\",\n    \"MSGESTURE_FLAG_CANCEL\",\n    \"MSGESTURE_FLAG_END\",\n    \"MSGESTURE_FLAG_INERTIA\",\n    \"MSGESTURE_FLAG_NONE\",\n    \"MSPOINTER_TYPE_MOUSE\",\n    \"MSPOINTER_TYPE_PEN\",\n    \"MSPOINTER_TYPE_TOUCH\",\n    \"MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE\",\n    \"MS_ASYNC_CALLBACK_STATUS_CANCEL\",\n    \"MS_ASYNC_CALLBACK_STATUS_CHOOSEANY\",\n    \"MS_ASYNC_CALLBACK_STATUS_ERROR\",\n    \"MS_ASYNC_CALLBACK_STATUS_JOIN\",\n    \"MS_ASYNC_OP_STATUS_CANCELED\",\n    \"MS_ASYNC_OP_STATUS_ERROR\",\n    \"MS_ASYNC_OP_STATUS_SUCCESS\",\n    \"MS_MANIPULATION_STATE_ACTIVE\",\n    \"MS_MANIPULATION_STATE_CANCELLED\",\n    \"MS_MANIPULATION_STATE_COMMITTED\",\n    \"MS_MANIPULATION_STATE_DRAGGING\",\n    \"MS_MANIPULATION_STATE_INERTIA\",\n    \"MS_MANIPULATION_STATE_PRESELECT\",\n    \"MS_MANIPULATION_STATE_SELECTING\",\n    \"MS_MANIPULATION_STATE_STOPPED\",\n    \"MS_MEDIA_ERR_ENCRYPTED\",\n    \"MS_MEDIA_KEYERR_CLIENT\",\n    \"MS_MEDIA_KEYERR_DOMAIN\",\n    \"MS_MEDIA_KEYERR_HARDWARECHANGE\",\n    \"MS_MEDIA_KEYERR_OUTPUT\",\n    \"MS_MEDIA_KEYERR_SERVICE\",\n    \"MS_MEDIA_KEYERR_UNKNOWN\",\n    \"Map\",\n    \"Math\",\n    \"MathMLElement\",\n    \"MediaCapabilities\",\n    \"MediaCapabilitiesInfo\",\n    \"MediaController\",\n    \"MediaDeviceInfo\",\n    \"MediaDevices\",\n    \"MediaElementAudioSourceNode\",\n    \"MediaEncryptedEvent\",\n    \"MediaError\",\n    \"MediaKeyError\",\n    \"MediaKeyEvent\",\n    \"MediaKeyMessageEvent\",\n    \"MediaKeyNeededEvent\",\n    \"MediaKeySession\",\n    \"MediaKeyStatusMap\",\n    \"MediaKeySystemAccess\",\n    \"MediaKeys\",\n    \"MediaList\",\n    \"MediaMetadata\",\n    \"MediaQueryList\",\n    \"MediaQueryListEvent\",\n    \"MediaRecorder\",\n    \"MediaRecorderErrorEvent\",\n    \"MediaSession\",\n    \"MediaSettingsRange\",\n    \"MediaSource\",\n    \"MediaStream\",\n    \"MediaStreamAudioDestinationNode\",\n    \"MediaStreamAudioSourceNode\",\n    \"MediaStreamEvent\",\n    \"MediaStreamTrack\",\n    \"MediaStreamTrackAudioSourceNode\",\n    \"MediaStreamTrackEvent\",\n    \"Memory\",\n    \"MessageChannel\",\n    \"MessageEvent\",\n    \"MessagePort\",\n    \"Methods\",\n    \"MimeType\",\n    \"MimeTypeArray\",\n    \"Module\",\n    \"MouseEvent\",\n    \"MouseScrollEvent\",\n    \"MozAnimation\",\n    \"MozAnimationDelay\",\n    \"MozAnimationDirection\",\n    \"MozAnimationDuration\",\n    \"MozAnimationFillMode\",\n    \"MozAnimationIterationCount\",\n    \"MozAnimationName\",\n    \"MozAnimationPlayState\",\n    \"MozAnimationTimingFunction\",\n    \"MozAppearance\",\n    \"MozBackfaceVisibility\",\n    \"MozBinding\",\n    \"MozBorderBottomColors\",\n    \"MozBorderEnd\",\n    \"MozBorderEndColor\",\n    \"MozBorderEndStyle\",\n    \"MozBorderEndWidth\",\n    \"MozBorderImage\",\n    \"MozBorderLeftColors\",\n    \"MozBorderRightColors\",\n    \"MozBorderStart\",\n    \"MozBorderStartColor\",\n    \"MozBorderStartStyle\",\n    \"MozBorderStartWidth\",\n    \"MozBorderTopColors\",\n    \"MozBoxAlign\",\n    \"MozBoxDirection\",\n    \"MozBoxFlex\",\n    \"MozBoxOrdinalGroup\",\n    \"MozBoxOrient\",\n    \"MozBoxPack\",\n    \"MozBoxSizing\",\n    \"MozCSSKeyframeRule\",\n    \"MozCSSKeyframesRule\",\n    \"MozColumnCount\",\n    \"MozColumnFill\",\n    \"MozColumnGap\",\n    \"MozColumnRule\",\n    \"MozColumnRuleColor\",\n    \"MozColumnRuleStyle\",\n    \"MozColumnRuleWidth\",\n    \"MozColumnWidth\",\n    \"MozColumns\",\n    \"MozContactChangeEvent\",\n    \"MozFloatEdge\",\n    \"MozFontFeatureSettings\",\n    \"MozFontLanguageOverride\",\n    \"MozForceBrokenImageIcon\",\n    \"MozHyphens\",\n    \"MozImageRegion\",\n    \"MozMarginEnd\",\n    \"MozMarginStart\",\n    \"MozMmsEvent\",\n    \"MozMmsMessage\",\n    \"MozMobileMessageThread\",\n    \"MozOSXFontSmoothing\",\n    \"MozOrient\",\n    \"MozOsxFontSmoothing\",\n    \"MozOutlineRadius\",\n    \"MozOutlineRadiusBottomleft\",\n    \"MozOutlineRadiusBottomright\",\n    \"MozOutlineRadiusTopleft\",\n    \"MozOutlineRadiusTopright\",\n    \"MozPaddingEnd\",\n    \"MozPaddingStart\",\n    \"MozPerspective\",\n    \"MozPerspectiveOrigin\",\n    \"MozPowerManager\",\n    \"MozSettingsEvent\",\n    \"MozSmsEvent\",\n    \"MozSmsMessage\",\n    \"MozStackSizing\",\n    \"MozTabSize\",\n    \"MozTextAlignLast\",\n    \"MozTextDecorationColor\",\n    \"MozTextDecorationLine\",\n    \"MozTextDecorationStyle\",\n    \"MozTextSizeAdjust\",\n    \"MozTransform\",\n    \"MozTransformOrigin\",\n    \"MozTransformStyle\",\n    \"MozTransition\",\n    \"MozTransitionDelay\",\n    \"MozTransitionDuration\",\n    \"MozTransitionProperty\",\n    \"MozTransitionTimingFunction\",\n    \"MozUserFocus\",\n    \"MozUserInput\",\n    \"MozUserModify\",\n    \"MozUserSelect\",\n    \"MozWindowDragging\",\n    \"MozWindowShadow\",\n    \"MutationEvent\",\n    \"MutationObserver\",\n    \"MutationRecord\",\n    \"NAMESPACE_ERR\",\n    \"NAMESPACE_RULE\",\n    \"NEAREST\",\n    \"NEAREST_MIPMAP_LINEAR\",\n    \"NEAREST_MIPMAP_NEAREST\",\n    \"NEGATIVE_INFINITY\",\n    \"NETWORK_EMPTY\",\n    \"NETWORK_ERR\",\n    \"NETWORK_IDLE\",\n    \"NETWORK_LOADED\",\n    \"NETWORK_LOADING\",\n    \"NETWORK_NO_SOURCE\",\n    \"NEVER\",\n    \"NEW\",\n    \"NEXT\",\n    \"NEXT_NO_DUPLICATE\",\n    \"NICEST\",\n    \"NODE_AFTER\",\n    \"NODE_BEFORE\",\n    \"NODE_BEFORE_AND_AFTER\",\n    \"NODE_INSIDE\",\n    \"NONE\",\n    \"NON_TRANSIENT_ERR\",\n    \"NOTATION_NODE\",\n    \"NOTCH\",\n    \"NOTEQUAL\",\n    \"NOT_ALLOWED_ERR\",\n    \"NOT_FOUND_ERR\",\n    \"NOT_READABLE_ERR\",\n    \"NOT_SUPPORTED_ERR\",\n    \"NO_DATA_ALLOWED_ERR\",\n    \"NO_ERR\",\n    \"NO_ERROR\",\n    \"NO_MODIFICATION_ALLOWED_ERR\",\n    \"NUMBER_TYPE\",\n    \"NUM_COMPRESSED_TEXTURE_FORMATS\",\n    \"NaN\",\n    \"NamedNodeMap\",\n    \"NavigationPreloadManager\",\n    \"Navigator\",\n    \"NearbyLinks\",\n    \"NetworkInformation\",\n    \"Node\",\n    \"NodeFilter\",\n    \"NodeIterator\",\n    \"NodeList\",\n    \"Notation\",\n    \"Notification\",\n    \"NotifyPaintEvent\",\n    \"Number\",\n    \"NumberFormat\",\n    \"OBJECT_TYPE\",\n    \"OBSOLETE\",\n    \"OK\",\n    \"ONE\",\n    \"ONE_MINUS_CONSTANT_ALPHA\",\n    \"ONE_MINUS_CONSTANT_COLOR\",\n    \"ONE_MINUS_DST_ALPHA\",\n    \"ONE_MINUS_DST_COLOR\",\n    \"ONE_MINUS_SRC_ALPHA\",\n    \"ONE_MINUS_SRC_COLOR\",\n    \"OPEN\",\n    \"OPENED\",\n    \"OPENING\",\n    \"ORDERED_NODE_ITERATOR_TYPE\",\n    \"ORDERED_NODE_SNAPSHOT_TYPE\",\n    \"OTHER_ERROR\",\n    \"OUT_OF_MEMORY\",\n    \"Object\",\n    \"OfflineAudioCompletionEvent\",\n    \"OfflineAudioContext\",\n    \"OfflineResourceList\",\n    \"OffscreenCanvas\",\n    \"OffscreenCanvasRenderingContext2D\",\n    \"Option\",\n    \"OrientationSensor\",\n    \"OscillatorNode\",\n    \"OverconstrainedError\",\n    \"OverflowEvent\",\n    \"PACK_ALIGNMENT\",\n    \"PACK_ROW_LENGTH\",\n    \"PACK_SKIP_PIXELS\",\n    \"PACK_SKIP_ROWS\",\n    \"PAGE_RULE\",\n    \"PARSE_ERR\",\n    \"PATHSEG_ARC_ABS\",\n    \"PATHSEG_ARC_REL\",\n    \"PATHSEG_CLOSEPATH\",\n    \"PATHSEG_CURVETO_CUBIC_ABS\",\n    \"PATHSEG_CURVETO_CUBIC_REL\",\n    \"PATHSEG_CURVETO_CUBIC_SMOOTH_ABS\",\n    \"PATHSEG_CURVETO_CUBIC_SMOOTH_REL\",\n    \"PATHSEG_CURVETO_QUADRATIC_ABS\",\n    \"PATHSEG_CURVETO_QUADRATIC_REL\",\n    \"PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS\",\n    \"PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL\",\n    \"PATHSEG_LINETO_ABS\",\n    \"PATHSEG_LINETO_HORIZONTAL_ABS\",\n    \"PATHSEG_LINETO_HORIZONTAL_REL\",\n    \"PATHSEG_LINETO_REL\",\n    \"PATHSEG_LINETO_VERTICAL_ABS\",\n    \"PATHSEG_LINETO_VERTICAL_REL\",\n    \"PATHSEG_MOVETO_ABS\",\n    \"PATHSEG_MOVETO_REL\",\n    \"PATHSEG_UNKNOWN\",\n    \"PATH_EXISTS_ERR\",\n    \"PEAKING\",\n    \"PERMISSION_DENIED\",\n    \"PERSISTENT\",\n    \"PI\",\n    \"PIXEL_PACK_BUFFER\",\n    \"PIXEL_PACK_BUFFER_BINDING\",\n    \"PIXEL_UNPACK_BUFFER\",\n    \"PIXEL_UNPACK_BUFFER_BINDING\",\n    \"PLAYING_STATE\",\n    \"POINTS\",\n    \"POLYGON_OFFSET_FACTOR\",\n    \"POLYGON_OFFSET_FILL\",\n    \"POLYGON_OFFSET_UNITS\",\n    \"POSITION_UNAVAILABLE\",\n    \"POSITIVE_INFINITY\",\n    \"PREV\",\n    \"PREV_NO_DUPLICATE\",\n    \"PROCESSING_INSTRUCTION_NODE\",\n    \"PageChangeEvent\",\n    \"PageTransitionEvent\",\n    \"PaintRequest\",\n    \"PaintRequestList\",\n    \"PannerNode\",\n    \"PasswordCredential\",\n    \"Path2D\",\n    \"PaymentAddress\",\n    \"PaymentInstruments\",\n    \"PaymentManager\",\n    \"PaymentMethodChangeEvent\",\n    \"PaymentRequest\",\n    \"PaymentRequestUpdateEvent\",\n    \"PaymentResponse\",\n    \"Performance\",\n    \"PerformanceElementTiming\",\n    \"PerformanceEntry\",\n    \"PerformanceEventTiming\",\n    \"PerformanceLongTaskTiming\",\n    \"PerformanceMark\",\n    \"PerformanceMeasure\",\n    \"PerformanceNavigation\",\n    \"PerformanceNavigationTiming\",\n    \"PerformanceObserver\",\n    \"PerformanceObserverEntryList\",\n    \"PerformancePaintTiming\",\n    \"PerformanceResourceTiming\",\n    \"PerformanceServerTiming\",\n    \"PerformanceTiming\",\n    \"PeriodicSyncManager\",\n    \"PeriodicWave\",\n    \"PermissionStatus\",\n    \"Permissions\",\n    \"PhotoCapabilities\",\n    \"PictureInPictureWindow\",\n    \"Plugin\",\n    \"PluginArray\",\n    \"PluralRules\",\n    \"PointerEvent\",\n    \"PopStateEvent\",\n    \"PopupBlockedEvent\",\n    \"Presentation\",\n    \"PresentationAvailability\",\n    \"PresentationConnection\",\n    \"PresentationConnectionAvailableEvent\",\n    \"PresentationConnectionCloseEvent\",\n    \"PresentationConnectionList\",\n    \"PresentationReceiver\",\n    \"PresentationRequest\",\n    \"ProcessingInstruction\",\n    \"ProgressEvent\",\n    \"Promise\",\n    \"PromiseRejectionEvent\",\n    \"PropertyNodeList\",\n    \"Proxy\",\n    \"PublicKeyCredential\",\n    \"PushManager\",\n    \"PushSubscription\",\n    \"PushSubscriptionOptions\",\n    \"Q\",\n    \"QUERY_RESULT\",\n    \"QUERY_RESULT_AVAILABLE\",\n    \"QUOTA_ERR\",\n    \"QUOTA_EXCEEDED_ERR\",\n    \"QueryInterface\",\n    \"R11F_G11F_B10F\",\n    \"R16F\",\n    \"R16I\",\n    \"R16UI\",\n    \"R32F\",\n    \"R32I\",\n    \"R32UI\",\n    \"R8\",\n    \"R8I\",\n    \"R8UI\",\n    \"R8_SNORM\",\n    \"RASTERIZER_DISCARD\",\n    \"READ_BUFFER\",\n    \"READ_FRAMEBUFFER\",\n    \"READ_FRAMEBUFFER_BINDING\",\n    \"READ_ONLY\",\n    \"READ_ONLY_ERR\",\n    \"READ_WRITE\",\n    \"RED\",\n    \"RED_BITS\",\n    \"RED_INTEGER\",\n    \"REMOVAL\",\n    \"RENDERBUFFER\",\n    \"RENDERBUFFER_ALPHA_SIZE\",\n    \"RENDERBUFFER_BINDING\",\n    \"RENDERBUFFER_BLUE_SIZE\",\n    \"RENDERBUFFER_DEPTH_SIZE\",\n    \"RENDERBUFFER_GREEN_SIZE\",\n    \"RENDERBUFFER_HEIGHT\",\n    \"RENDERBUFFER_INTERNAL_FORMAT\",\n    \"RENDERBUFFER_RED_SIZE\",\n    \"RENDERBUFFER_SAMPLES\",\n    \"RENDERBUFFER_STENCIL_SIZE\",\n    \"RENDERBUFFER_WIDTH\",\n    \"RENDERER\",\n    \"RENDERING_INTENT_ABSOLUTE_COLORIMETRIC\",\n    \"RENDERING_INTENT_AUTO\",\n    \"RENDERING_INTENT_PERCEPTUAL\",\n    \"RENDERING_INTENT_RELATIVE_COLORIMETRIC\",\n    \"RENDERING_INTENT_SATURATION\",\n    \"RENDERING_INTENT_UNKNOWN\",\n    \"REPEAT\",\n    \"REPLACE\",\n    \"RG\",\n    \"RG16F\",\n    \"RG16I\",\n    \"RG16UI\",\n    \"RG32F\",\n    \"RG32I\",\n    \"RG32UI\",\n    \"RG8\",\n    \"RG8I\",\n    \"RG8UI\",\n    \"RG8_SNORM\",\n    \"RGB\",\n    \"RGB10_A2\",\n    \"RGB10_A2UI\",\n    \"RGB16F\",\n    \"RGB16I\",\n    \"RGB16UI\",\n    \"RGB32F\",\n    \"RGB32I\",\n    \"RGB32UI\",\n    \"RGB565\",\n    \"RGB5_A1\",\n    \"RGB8\",\n    \"RGB8I\",\n    \"RGB8UI\",\n    \"RGB8_SNORM\",\n    \"RGB9_E5\",\n    \"RGBA\",\n    \"RGBA16F\",\n    \"RGBA16I\",\n    \"RGBA16UI\",\n    \"RGBA32F\",\n    \"RGBA32I\",\n    \"RGBA32UI\",\n    \"RGBA4\",\n    \"RGBA8\",\n    \"RGBA8I\",\n    \"RGBA8UI\",\n    \"RGBA8_SNORM\",\n    \"RGBA_INTEGER\",\n    \"RGBColor\",\n    \"RGB_INTEGER\",\n    \"RG_INTEGER\",\n    \"ROTATION_CLOCKWISE\",\n    \"ROTATION_COUNTERCLOCKWISE\",\n    \"RTCCertificate\",\n    \"RTCDTMFSender\",\n    \"RTCDTMFToneChangeEvent\",\n    \"RTCDataChannel\",\n    \"RTCDataChannelEvent\",\n    \"RTCDtlsTransport\",\n    \"RTCError\",\n    \"RTCErrorEvent\",\n    \"RTCIceCandidate\",\n    \"RTCIceTransport\",\n    \"RTCPeerConnection\",\n    \"RTCPeerConnectionIceErrorEvent\",\n    \"RTCPeerConnectionIceEvent\",\n    \"RTCRtpReceiver\",\n    \"RTCRtpSender\",\n    \"RTCRtpTransceiver\",\n    \"RTCSctpTransport\",\n    \"RTCSessionDescription\",\n    \"RTCStatsReport\",\n    \"RTCTrackEvent\",\n    \"RadioNodeList\",\n    \"Range\",\n    \"RangeError\",\n    \"RangeException\",\n    \"ReadableStream\",\n    \"ReadableStreamDefaultReader\",\n    \"RecordErrorEvent\",\n    \"Rect\",\n    \"ReferenceError\",\n    \"Reflect\",\n    \"RegExp\",\n    \"RelativeOrientationSensor\",\n    \"RelativeTimeFormat\",\n    \"RemotePlayback\",\n    \"Report\",\n    \"ReportBody\",\n    \"ReportingObserver\",\n    \"Request\",\n    \"ResizeObserver\",\n    \"ResizeObserverEntry\",\n    \"ResizeObserverSize\",\n    \"Response\",\n    \"RuntimeError\",\n    \"SAMPLER_2D\",\n    \"SAMPLER_2D_ARRAY\",\n    \"SAMPLER_2D_ARRAY_SHADOW\",\n    \"SAMPLER_2D_SHADOW\",\n    \"SAMPLER_3D\",\n    \"SAMPLER_BINDING\",\n    \"SAMPLER_CUBE\",\n    \"SAMPLER_CUBE_SHADOW\",\n    \"SAMPLES\",\n    \"SAMPLE_ALPHA_TO_COVERAGE\",\n    \"SAMPLE_BUFFERS\",\n    \"SAMPLE_COVERAGE\",\n    \"SAMPLE_COVERAGE_INVERT\",\n    \"SAMPLE_COVERAGE_VALUE\",\n    \"SAWTOOTH\",\n    \"SCHEDULED_STATE\",\n    \"SCISSOR_BOX\",\n    \"SCISSOR_TEST\",\n    \"SCROLL_PAGE_DOWN\",\n    \"SCROLL_PAGE_UP\",\n    \"SDP_ANSWER\",\n    \"SDP_OFFER\",\n    \"SDP_PRANSWER\",\n    \"SECURITY_ERR\",\n    \"SELECT\",\n    \"SEPARATE_ATTRIBS\",\n    \"SERIALIZE_ERR\",\n    \"SEVERITY_ERROR\",\n    \"SEVERITY_FATAL_ERROR\",\n    \"SEVERITY_WARNING\",\n    \"SHADER_COMPILER\",\n    \"SHADER_TYPE\",\n    \"SHADING_LANGUAGE_VERSION\",\n    \"SHIFT_MASK\",\n    \"SHORT\",\n    \"SHOWING\",\n    \"SHOW_ALL\",\n    \"SHOW_ATTRIBUTE\",\n    \"SHOW_CDATA_SECTION\",\n    \"SHOW_COMMENT\",\n    \"SHOW_DOCUMENT\",\n    \"SHOW_DOCUMENT_FRAGMENT\",\n    \"SHOW_DOCUMENT_TYPE\",\n    \"SHOW_ELEMENT\",\n    \"SHOW_ENTITY\",\n    \"SHOW_ENTITY_REFERENCE\",\n    \"SHOW_NOTATION\",\n    \"SHOW_PROCESSING_INSTRUCTION\",\n    \"SHOW_TEXT\",\n    \"SIGNALED\",\n    \"SIGNED_NORMALIZED\",\n    \"SINE\",\n    \"SOUNDFIELD\",\n    \"SQLException\",\n    \"SQRT1_2\",\n    \"SQRT2\",\n    \"SQUARE\",\n    \"SRC_ALPHA\",\n    \"SRC_ALPHA_SATURATE\",\n    \"SRC_COLOR\",\n    \"SRGB\",\n    \"SRGB8\",\n    \"SRGB8_ALPHA8\",\n    \"START_TO_END\",\n    \"START_TO_START\",\n    \"STATIC_COPY\",\n    \"STATIC_DRAW\",\n    \"STATIC_READ\",\n    \"STENCIL\",\n    \"STENCIL_ATTACHMENT\",\n    \"STENCIL_BACK_FAIL\",\n    \"STENCIL_BACK_FUNC\",\n    \"STENCIL_BACK_PASS_DEPTH_FAIL\",\n    \"STENCIL_BACK_PASS_DEPTH_PASS\",\n    \"STENCIL_BACK_REF\",\n    \"STENCIL_BACK_VALUE_MASK\",\n    \"STENCIL_BACK_WRITEMASK\",\n    \"STENCIL_BITS\",\n    \"STENCIL_BUFFER_BIT\",\n    \"STENCIL_CLEAR_VALUE\",\n    \"STENCIL_FAIL\",\n    \"STENCIL_FUNC\",\n    \"STENCIL_INDEX\",\n    \"STENCIL_INDEX8\",\n    \"STENCIL_PASS_DEPTH_FAIL\",\n    \"STENCIL_PASS_DEPTH_PASS\",\n    \"STENCIL_REF\",\n    \"STENCIL_TEST\",\n    \"STENCIL_VALUE_MASK\",\n    \"STENCIL_WRITEMASK\",\n    \"STREAM_COPY\",\n    \"STREAM_DRAW\",\n    \"STREAM_READ\",\n    \"STRING_TYPE\",\n    \"STYLE_RULE\",\n    \"SUBPIXEL_BITS\",\n    \"SUPPORTS_RULE\",\n    \"SVGAElement\",\n    \"SVGAltGlyphDefElement\",\n    \"SVGAltGlyphElement\",\n    \"SVGAltGlyphItemElement\",\n    \"SVGAngle\",\n    \"SVGAnimateColorElement\",\n    \"SVGAnimateElement\",\n    \"SVGAnimateMotionElement\",\n    \"SVGAnimateTransformElement\",\n    \"SVGAnimatedAngle\",\n    \"SVGAnimatedBoolean\",\n    \"SVGAnimatedEnumeration\",\n    \"SVGAnimatedInteger\",\n    \"SVGAnimatedLength\",\n    \"SVGAnimatedLengthList\",\n    \"SVGAnimatedNumber\",\n    \"SVGAnimatedNumberList\",\n    \"SVGAnimatedPreserveAspectRatio\",\n    \"SVGAnimatedRect\",\n    \"SVGAnimatedString\",\n    \"SVGAnimatedTransformList\",\n    \"SVGAnimationElement\",\n    \"SVGCircleElement\",\n    \"SVGClipPathElement\",\n    \"SVGColor\",\n    \"SVGComponentTransferFunctionElement\",\n    \"SVGCursorElement\",\n    \"SVGDefsElement\",\n    \"SVGDescElement\",\n    \"SVGDiscardElement\",\n    \"SVGDocument\",\n    \"SVGElement\",\n    \"SVGElementInstance\",\n    \"SVGElementInstanceList\",\n    \"SVGEllipseElement\",\n    \"SVGException\",\n    \"SVGFEBlendElement\",\n    \"SVGFEColorMatrixElement\",\n    \"SVGFEComponentTransferElement\",\n    \"SVGFECompositeElement\",\n    \"SVGFEConvolveMatrixElement\",\n    \"SVGFEDiffuseLightingElement\",\n    \"SVGFEDisplacementMapElement\",\n    \"SVGFEDistantLightElement\",\n    \"SVGFEDropShadowElement\",\n    \"SVGFEFloodElement\",\n    \"SVGFEFuncAElement\",\n    \"SVGFEFuncBElement\",\n    \"SVGFEFuncGElement\",\n    \"SVGFEFuncRElement\",\n    \"SVGFEGaussianBlurElement\",\n    \"SVGFEImageElement\",\n    \"SVGFEMergeElement\",\n    \"SVGFEMergeNodeElement\",\n    \"SVGFEMorphologyElement\",\n    \"SVGFEOffsetElement\",\n    \"SVGFEPointLightElement\",\n    \"SVGFESpecularLightingElement\",\n    \"SVGFESpotLightElement\",\n    \"SVGFETileElement\",\n    \"SVGFETurbulenceElement\",\n    \"SVGFilterElement\",\n    \"SVGFontElement\",\n    \"SVGFontFaceElement\",\n    \"SVGFontFaceFormatElement\",\n    \"SVGFontFaceNameElement\",\n    \"SVGFontFaceSrcElement\",\n    \"SVGFontFaceUriElement\",\n    \"SVGForeignObjectElement\",\n    \"SVGGElement\",\n    \"SVGGeometryElement\",\n    \"SVGGlyphElement\",\n    \"SVGGlyphRefElement\",\n    \"SVGGradientElement\",\n    \"SVGGraphicsElement\",\n    \"SVGHKernElement\",\n    \"SVGImageElement\",\n    \"SVGLength\",\n    \"SVGLengthList\",\n    \"SVGLineElement\",\n    \"SVGLinearGradientElement\",\n    \"SVGMPathElement\",\n    \"SVGMarkerElement\",\n    \"SVGMaskElement\",\n    \"SVGMatrix\",\n    \"SVGMetadataElement\",\n    \"SVGMissingGlyphElement\",\n    \"SVGNumber\",\n    \"SVGNumberList\",\n    \"SVGPaint\",\n    \"SVGPathElement\",\n    \"SVGPathSeg\",\n    \"SVGPathSegArcAbs\",\n    \"SVGPathSegArcRel\",\n    \"SVGPathSegClosePath\",\n    \"SVGPathSegCurvetoCubicAbs\",\n    \"SVGPathSegCurvetoCubicRel\",\n    \"SVGPathSegCurvetoCubicSmoothAbs\",\n    \"SVGPathSegCurvetoCubicSmoothRel\",\n    \"SVGPathSegCurvetoQuadraticAbs\",\n    \"SVGPathSegCurvetoQuadraticRel\",\n    \"SVGPathSegCurvetoQuadraticSmoothAbs\",\n    \"SVGPathSegCurvetoQuadraticSmoothRel\",\n    \"SVGPathSegLinetoAbs\",\n    \"SVGPathSegLinetoHorizontalAbs\",\n    \"SVGPathSegLinetoHorizontalRel\",\n    \"SVGPathSegLinetoRel\",\n    \"SVGPathSegLinetoVerticalAbs\",\n    \"SVGPathSegLinetoVerticalRel\",\n    \"SVGPathSegList\",\n    \"SVGPathSegMovetoAbs\",\n    \"SVGPathSegMovetoRel\",\n    \"SVGPatternElement\",\n    \"SVGPoint\",\n    \"SVGPointList\",\n    \"SVGPolygonElement\",\n    \"SVGPolylineElement\",\n    \"SVGPreserveAspectRatio\",\n    \"SVGRadialGradientElement\",\n    \"SVGRect\",\n    \"SVGRectElement\",\n    \"SVGRenderingIntent\",\n    \"SVGSVGElement\",\n    \"SVGScriptElement\",\n    \"SVGSetElement\",\n    \"SVGStopElement\",\n    \"SVGStringList\",\n    \"SVGStyleElement\",\n    \"SVGSwitchElement\",\n    \"SVGSymbolElement\",\n    \"SVGTRefElement\",\n    \"SVGTSpanElement\",\n    \"SVGTextContentElement\",\n    \"SVGTextElement\",\n    \"SVGTextPathElement\",\n    \"SVGTextPositioningElement\",\n    \"SVGTitleElement\",\n    \"SVGTransform\",\n    \"SVGTransformList\",\n    \"SVGUnitTypes\",\n    \"SVGUseElement\",\n    \"SVGVKernElement\",\n    \"SVGViewElement\",\n    \"SVGViewSpec\",\n    \"SVGZoomAndPan\",\n    \"SVGZoomEvent\",\n    \"SVG_ANGLETYPE_DEG\",\n    \"SVG_ANGLETYPE_GRAD\",\n    \"SVG_ANGLETYPE_RAD\",\n    \"SVG_ANGLETYPE_UNKNOWN\",\n    \"SVG_ANGLETYPE_UNSPECIFIED\",\n    \"SVG_CHANNEL_A\",\n    \"SVG_CHANNEL_B\",\n    \"SVG_CHANNEL_G\",\n    \"SVG_CHANNEL_R\",\n    \"SVG_CHANNEL_UNKNOWN\",\n    \"SVG_COLORTYPE_CURRENTCOLOR\",\n    \"SVG_COLORTYPE_RGBCOLOR\",\n    \"SVG_COLORTYPE_RGBCOLOR_ICCCOLOR\",\n    \"SVG_COLORTYPE_UNKNOWN\",\n    \"SVG_EDGEMODE_DUPLICATE\",\n    \"SVG_EDGEMODE_NONE\",\n    \"SVG_EDGEMODE_UNKNOWN\",\n    \"SVG_EDGEMODE_WRAP\",\n    \"SVG_FEBLEND_MODE_COLOR\",\n    \"SVG_FEBLEND_MODE_COLOR_BURN\",\n    \"SVG_FEBLEND_MODE_COLOR_DODGE\",\n    \"SVG_FEBLEND_MODE_DARKEN\",\n    \"SVG_FEBLEND_MODE_DIFFERENCE\",\n    \"SVG_FEBLEND_MODE_EXCLUSION\",\n    \"SVG_FEBLEND_MODE_HARD_LIGHT\",\n    \"SVG_FEBLEND_MODE_HUE\",\n    \"SVG_FEBLEND_MODE_LIGHTEN\",\n    \"SVG_FEBLEND_MODE_LUMINOSITY\",\n    \"SVG_FEBLEND_MODE_MULTIPLY\",\n    \"SVG_FEBLEND_MODE_NORMAL\",\n    \"SVG_FEBLEND_MODE_OVERLAY\",\n    \"SVG_FEBLEND_MODE_SATURATION\",\n    \"SVG_FEBLEND_MODE_SCREEN\",\n    \"SVG_FEBLEND_MODE_SOFT_LIGHT\",\n    \"SVG_FEBLEND_MODE_UNKNOWN\",\n    \"SVG_FECOLORMATRIX_TYPE_HUEROTATE\",\n    \"SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA\",\n    \"SVG_FECOLORMATRIX_TYPE_MATRIX\",\n    \"SVG_FECOLORMATRIX_TYPE_SATURATE\",\n    \"SVG_FECOLORMATRIX_TYPE_UNKNOWN\",\n    \"SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE\",\n    \"SVG_FECOMPONENTTRANSFER_TYPE_GAMMA\",\n    \"SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY\",\n    \"SVG_FECOMPONENTTRANSFER_TYPE_LINEAR\",\n    \"SVG_FECOMPONENTTRANSFER_TYPE_TABLE\",\n    \"SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN\",\n    \"SVG_FECOMPOSITE_OPERATOR_ARITHMETIC\",\n    \"SVG_FECOMPOSITE_OPERATOR_ATOP\",\n    \"SVG_FECOMPOSITE_OPERATOR_IN\",\n    \"SVG_FECOMPOSITE_OPERATOR_OUT\",\n    \"SVG_FECOMPOSITE_OPERATOR_OVER\",\n    \"SVG_FECOMPOSITE_OPERATOR_UNKNOWN\",\n    \"SVG_FECOMPOSITE_OPERATOR_XOR\",\n    \"SVG_INVALID_VALUE_ERR\",\n    \"SVG_LENGTHTYPE_CM\",\n    \"SVG_LENGTHTYPE_EMS\",\n    \"SVG_LENGTHTYPE_EXS\",\n    \"SVG_LENGTHTYPE_IN\",\n    \"SVG_LENGTHTYPE_MM\",\n    \"SVG_LENGTHTYPE_NUMBER\",\n    \"SVG_LENGTHTYPE_PC\",\n    \"SVG_LENGTHTYPE_PERCENTAGE\",\n    \"SVG_LENGTHTYPE_PT\",\n    \"SVG_LENGTHTYPE_PX\",\n    \"SVG_LENGTHTYPE_UNKNOWN\",\n    \"SVG_MARKERUNITS_STROKEWIDTH\",\n    \"SVG_MARKERUNITS_UNKNOWN\",\n    \"SVG_MARKERUNITS_USERSPACEONUSE\",\n    \"SVG_MARKER_ORIENT_ANGLE\",\n    \"SVG_MARKER_ORIENT_AUTO\",\n    \"SVG_MARKER_ORIENT_UNKNOWN\",\n    \"SVG_MASKTYPE_ALPHA\",\n    \"SVG_MASKTYPE_LUMINANCE\",\n    \"SVG_MATRIX_NOT_INVERTABLE\",\n    \"SVG_MEETORSLICE_MEET\",\n    \"SVG_MEETORSLICE_SLICE\",\n    \"SVG_MEETORSLICE_UNKNOWN\",\n    \"SVG_MORPHOLOGY_OPERATOR_DILATE\",\n    \"SVG_MORPHOLOGY_OPERATOR_ERODE\",\n    \"SVG_MORPHOLOGY_OPERATOR_UNKNOWN\",\n    \"SVG_PAINTTYPE_CURRENTCOLOR\",\n    \"SVG_PAINTTYPE_NONE\",\n    \"SVG_PAINTTYPE_RGBCOLOR\",\n    \"SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR\",\n    \"SVG_PAINTTYPE_UNKNOWN\",\n    \"SVG_PAINTTYPE_URI\",\n    \"SVG_PAINTTYPE_URI_CURRENTCOLOR\",\n    \"SVG_PAINTTYPE_URI_NONE\",\n    \"SVG_PAINTTYPE_URI_RGBCOLOR\",\n    \"SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR\",\n    \"SVG_PRESERVEASPECTRATIO_NONE\",\n    \"SVG_PRESERVEASPECTRATIO_UNKNOWN\",\n    \"SVG_PRESERVEASPECTRATIO_XMAXYMAX\",\n    \"SVG_PRESERVEASPECTRATIO_XMAXYMID\",\n    \"SVG_PRESERVEASPECTRATIO_XMAXYMIN\",\n    \"SVG_PRESERVEASPECTRATIO_XMIDYMAX\",\n    \"SVG_PRESERVEASPECTRATIO_XMIDYMID\",\n    \"SVG_PRESERVEASPECTRATIO_XMIDYMIN\",\n    \"SVG_PRESERVEASPECTRATIO_XMINYMAX\",\n    \"SVG_PRESERVEASPECTRATIO_XMINYMID\",\n    \"SVG_PRESERVEASPECTRATIO_XMINYMIN\",\n    \"SVG_SPREADMETHOD_PAD\",\n    \"SVG_SPREADMETHOD_REFLECT\",\n    \"SVG_SPREADMETHOD_REPEAT\",\n    \"SVG_SPREADMETHOD_UNKNOWN\",\n    \"SVG_STITCHTYPE_NOSTITCH\",\n    \"SVG_STITCHTYPE_STITCH\",\n    \"SVG_STITCHTYPE_UNKNOWN\",\n    \"SVG_TRANSFORM_MATRIX\",\n    \"SVG_TRANSFORM_ROTATE\",\n    \"SVG_TRANSFORM_SCALE\",\n    \"SVG_TRANSFORM_SKEWX\",\n    \"SVG_TRANSFORM_SKEWY\",\n    \"SVG_TRANSFORM_TRANSLATE\",\n    \"SVG_TRANSFORM_UNKNOWN\",\n    \"SVG_TURBULENCE_TYPE_FRACTALNOISE\",\n    \"SVG_TURBULENCE_TYPE_TURBULENCE\",\n    \"SVG_TURBULENCE_TYPE_UNKNOWN\",\n    \"SVG_UNIT_TYPE_OBJECTBOUNDINGBOX\",\n    \"SVG_UNIT_TYPE_UNKNOWN\",\n    \"SVG_UNIT_TYPE_USERSPACEONUSE\",\n    \"SVG_WRONG_TYPE_ERR\",\n    \"SVG_ZOOMANDPAN_DISABLE\",\n    \"SVG_ZOOMANDPAN_MAGNIFY\",\n    \"SVG_ZOOMANDPAN_UNKNOWN\",\n    \"SYNC_CONDITION\",\n    \"SYNC_FENCE\",\n    \"SYNC_FLAGS\",\n    \"SYNC_FLUSH_COMMANDS_BIT\",\n    \"SYNC_GPU_COMMANDS_COMPLETE\",\n    \"SYNC_STATUS\",\n    \"SYNTAX_ERR\",\n    \"SavedPages\",\n    \"Screen\",\n    \"ScreenOrientation\",\n    \"Script\",\n    \"ScriptProcessorNode\",\n    \"ScrollAreaEvent\",\n    \"SecurityPolicyViolationEvent\",\n    \"Selection\",\n    \"Sensor\",\n    \"SensorErrorEvent\",\n    \"ServiceWorker\",\n    \"ServiceWorkerContainer\",\n    \"ServiceWorkerRegistration\",\n    \"SessionDescription\",\n    \"Set\",\n    \"ShadowRoot\",\n    \"SharedArrayBuffer\",\n    \"SharedWorker\",\n    \"SimpleGestureEvent\",\n    \"SourceBuffer\",\n    \"SourceBufferList\",\n    \"SpeechSynthesis\",\n    \"SpeechSynthesisErrorEvent\",\n    \"SpeechSynthesisEvent\",\n    \"SpeechSynthesisUtterance\",\n    \"SpeechSynthesisVoice\",\n    \"StaticRange\",\n    \"StereoPannerNode\",\n    \"StopIteration\",\n    \"Storage\",\n    \"StorageEvent\",\n    \"StorageManager\",\n    \"String\",\n    \"StructType\",\n    \"StylePropertyMap\",\n    \"StylePropertyMapReadOnly\",\n    \"StyleSheet\",\n    \"StyleSheetList\",\n    \"SubmitEvent\",\n    \"SubtleCrypto\",\n    \"Symbol\",\n    \"SyncManager\",\n    \"SyntaxError\",\n    \"TEMPORARY\",\n    \"TEXTPATH_METHODTYPE_ALIGN\",\n    \"TEXTPATH_METHODTYPE_STRETCH\",\n    \"TEXTPATH_METHODTYPE_UNKNOWN\",\n    \"TEXTPATH_SPACINGTYPE_AUTO\",\n    \"TEXTPATH_SPACINGTYPE_EXACT\",\n    \"TEXTPATH_SPACINGTYPE_UNKNOWN\",\n    \"TEXTURE\",\n    \"TEXTURE0\",\n    \"TEXTURE1\",\n    \"TEXTURE10\",\n    \"TEXTURE11\",\n    \"TEXTURE12\",\n    \"TEXTURE13\",\n    \"TEXTURE14\",\n    \"TEXTURE15\",\n    \"TEXTURE16\",\n    \"TEXTURE17\",\n    \"TEXTURE18\",\n    \"TEXTURE19\",\n    \"TEXTURE2\",\n    \"TEXTURE20\",\n    \"TEXTURE21\",\n    \"TEXTURE22\",\n    \"TEXTURE23\",\n    \"TEXTURE24\",\n    \"TEXTURE25\",\n    \"TEXTURE26\",\n    \"TEXTURE27\",\n    \"TEXTURE28\",\n    \"TEXTURE29\",\n    \"TEXTURE3\",\n    \"TEXTURE30\",\n    \"TEXTURE31\",\n    \"TEXTURE4\",\n    \"TEXTURE5\",\n    \"TEXTURE6\",\n    \"TEXTURE7\",\n    \"TEXTURE8\",\n    \"TEXTURE9\",\n    \"TEXTURE_2D\",\n    \"TEXTURE_2D_ARRAY\",\n    \"TEXTURE_3D\",\n    \"TEXTURE_BASE_LEVEL\",\n    \"TEXTURE_BINDING_2D\",\n    \"TEXTURE_BINDING_2D_ARRAY\",\n    \"TEXTURE_BINDING_3D\",\n    \"TEXTURE_BINDING_CUBE_MAP\",\n    \"TEXTURE_COMPARE_FUNC\",\n    \"TEXTURE_COMPARE_MODE\",\n    \"TEXTURE_CUBE_MAP\",\n    \"TEXTURE_CUBE_MAP_NEGATIVE_X\",\n    \"TEXTURE_CUBE_MAP_NEGATIVE_Y\",\n    \"TEXTURE_CUBE_MAP_NEGATIVE_Z\",\n    \"TEXTURE_CUBE_MAP_POSITIVE_X\",\n    \"TEXTURE_CUBE_MAP_POSITIVE_Y\",\n    \"TEXTURE_CUBE_MAP_POSITIVE_Z\",\n    \"TEXTURE_IMMUTABLE_FORMAT\",\n    \"TEXTURE_IMMUTABLE_LEVELS\",\n    \"TEXTURE_MAG_FILTER\",\n    \"TEXTURE_MAX_ANISOTROPY_EXT\",\n    \"TEXTURE_MAX_LEVEL\",\n    \"TEXTURE_MAX_LOD\",\n    \"TEXTURE_MIN_FILTER\",\n    \"TEXTURE_MIN_LOD\",\n    \"TEXTURE_WRAP_R\",\n    \"TEXTURE_WRAP_S\",\n    \"TEXTURE_WRAP_T\",\n    \"TEXT_NODE\",\n    \"TIMEOUT\",\n    \"TIMEOUT_ERR\",\n    \"TIMEOUT_EXPIRED\",\n    \"TIMEOUT_IGNORED\",\n    \"TOO_LARGE_ERR\",\n    \"TRANSACTION_INACTIVE_ERR\",\n    \"TRANSFORM_FEEDBACK\",\n    \"TRANSFORM_FEEDBACK_ACTIVE\",\n    \"TRANSFORM_FEEDBACK_BINDING\",\n    \"TRANSFORM_FEEDBACK_BUFFER\",\n    \"TRANSFORM_FEEDBACK_BUFFER_BINDING\",\n    \"TRANSFORM_FEEDBACK_BUFFER_MODE\",\n    \"TRANSFORM_FEEDBACK_BUFFER_SIZE\",\n    \"TRANSFORM_FEEDBACK_BUFFER_START\",\n    \"TRANSFORM_FEEDBACK_PAUSED\",\n    \"TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN\",\n    \"TRANSFORM_FEEDBACK_VARYINGS\",\n    \"TRIANGLE\",\n    \"TRIANGLES\",\n    \"TRIANGLE_FAN\",\n    \"TRIANGLE_STRIP\",\n    \"TYPE_BACK_FORWARD\",\n    \"TYPE_ERR\",\n    \"TYPE_MISMATCH_ERR\",\n    \"TYPE_NAVIGATE\",\n    \"TYPE_RELOAD\",\n    \"TYPE_RESERVED\",\n    \"Table\",\n    \"TaskAttributionTiming\",\n    \"Text\",\n    \"TextDecoder\",\n    \"TextDecoderStream\",\n    \"TextEncoder\",\n    \"TextEncoderStream\",\n    \"TextEvent\",\n    \"TextMetrics\",\n    \"TextTrack\",\n    \"TextTrackCue\",\n    \"TextTrackCueList\",\n    \"TextTrackList\",\n    \"TimeEvent\",\n    \"TimeRanges\",\n    \"Touch\",\n    \"TouchEvent\",\n    \"TouchList\",\n    \"TrackEvent\",\n    \"TransformStream\",\n    \"TransitionEvent\",\n    \"TreeWalker\",\n    \"TrustedHTML\",\n    \"TrustedScript\",\n    \"TrustedScriptURL\",\n    \"TrustedTypePolicy\",\n    \"TrustedTypePolicyFactory\",\n    \"TypeError\",\n    \"TypedObject\",\n    \"U2F\",\n    \"UIEvent\",\n    \"UNCACHED\",\n    \"UNIFORM_ARRAY_STRIDE\",\n    \"UNIFORM_BLOCK_ACTIVE_UNIFORMS\",\n    \"UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES\",\n    \"UNIFORM_BLOCK_BINDING\",\n    \"UNIFORM_BLOCK_DATA_SIZE\",\n    \"UNIFORM_BLOCK_INDEX\",\n    \"UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER\",\n    \"UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER\",\n    \"UNIFORM_BUFFER\",\n    \"UNIFORM_BUFFER_BINDING\",\n    \"UNIFORM_BUFFER_OFFSET_ALIGNMENT\",\n    \"UNIFORM_BUFFER_SIZE\",\n    \"UNIFORM_BUFFER_START\",\n    \"UNIFORM_IS_ROW_MAJOR\",\n    \"UNIFORM_MATRIX_STRIDE\",\n    \"UNIFORM_OFFSET\",\n    \"UNIFORM_SIZE\",\n    \"UNIFORM_TYPE\",\n    \"UNKNOWN_ERR\",\n    \"UNKNOWN_RULE\",\n    \"UNMASKED_RENDERER_WEBGL\",\n    \"UNMASKED_VENDOR_WEBGL\",\n    \"UNORDERED_NODE_ITERATOR_TYPE\",\n    \"UNORDERED_NODE_SNAPSHOT_TYPE\",\n    \"UNPACK_ALIGNMENT\",\n    \"UNPACK_COLORSPACE_CONVERSION_WEBGL\",\n    \"UNPACK_FLIP_Y_WEBGL\",\n    \"UNPACK_IMAGE_HEIGHT\",\n    \"UNPACK_PREMULTIPLY_ALPHA_WEBGL\",\n    \"UNPACK_ROW_LENGTH\",\n    \"UNPACK_SKIP_IMAGES\",\n    \"UNPACK_SKIP_PIXELS\",\n    \"UNPACK_SKIP_ROWS\",\n    \"UNSCHEDULED_STATE\",\n    \"UNSENT\",\n    \"UNSIGNALED\",\n    \"UNSIGNED_BYTE\",\n    \"UNSIGNED_INT\",\n    \"UNSIGNED_INT_10F_11F_11F_REV\",\n    \"UNSIGNED_INT_24_8\",\n    \"UNSIGNED_INT_2_10_10_10_REV\",\n    \"UNSIGNED_INT_5_9_9_9_REV\",\n    \"UNSIGNED_INT_SAMPLER_2D\",\n    \"UNSIGNED_INT_SAMPLER_2D_ARRAY\",\n    \"UNSIGNED_INT_SAMPLER_3D\",\n    \"UNSIGNED_INT_SAMPLER_CUBE\",\n    \"UNSIGNED_INT_VEC2\",\n    \"UNSIGNED_INT_VEC3\",\n    \"UNSIGNED_INT_VEC4\",\n    \"UNSIGNED_NORMALIZED\",\n    \"UNSIGNED_SHORT\",\n    \"UNSIGNED_SHORT_4_4_4_4\",\n    \"UNSIGNED_SHORT_5_5_5_1\",\n    \"UNSIGNED_SHORT_5_6_5\",\n    \"UNSPECIFIED_EVENT_TYPE_ERR\",\n    \"UPDATEREADY\",\n    \"URIError\",\n    \"URL\",\n    \"URLSearchParams\",\n    \"URLUnencoded\",\n    \"URL_MISMATCH_ERR\",\n    \"USB\",\n    \"USBAlternateInterface\",\n    \"USBConfiguration\",\n    \"USBConnectionEvent\",\n    \"USBDevice\",\n    \"USBEndpoint\",\n    \"USBInTransferResult\",\n    \"USBInterface\",\n    \"USBIsochronousInTransferPacket\",\n    \"USBIsochronousInTransferResult\",\n    \"USBIsochronousOutTransferPacket\",\n    \"USBIsochronousOutTransferResult\",\n    \"USBOutTransferResult\",\n    \"UTC\",\n    \"Uint16Array\",\n    \"Uint32Array\",\n    \"Uint8Array\",\n    \"Uint8ClampedArray\",\n    \"UserActivation\",\n    \"UserMessageHandler\",\n    \"UserMessageHandlersNamespace\",\n    \"UserProximityEvent\",\n    \"VALIDATE_STATUS\",\n    \"VALIDATION_ERR\",\n    \"VARIABLES_RULE\",\n    \"VENDOR\",\n    \"VERSION\",\n    \"VERSION_CHANGE\",\n    \"VERSION_ERR\",\n    \"VERTEX_ARRAY_BINDING\",\n    \"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\",\n    \"VERTEX_ATTRIB_ARRAY_DIVISOR\",\n    \"VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE\",\n    \"VERTEX_ATTRIB_ARRAY_ENABLED\",\n    \"VERTEX_ATTRIB_ARRAY_INTEGER\",\n    \"VERTEX_ATTRIB_ARRAY_NORMALIZED\",\n    \"VERTEX_ATTRIB_ARRAY_POINTER\",\n    \"VERTEX_ATTRIB_ARRAY_SIZE\",\n    \"VERTEX_ATTRIB_ARRAY_STRIDE\",\n    \"VERTEX_ATTRIB_ARRAY_TYPE\",\n    \"VERTEX_SHADER\",\n    \"VERTICAL\",\n    \"VERTICAL_AXIS\",\n    \"VER_ERR\",\n    \"VIEWPORT\",\n    \"VIEWPORT_RULE\",\n    \"VRDisplay\",\n    \"VRDisplayCapabilities\",\n    \"VRDisplayEvent\",\n    \"VREyeParameters\",\n    \"VRFieldOfView\",\n    \"VRFrameData\",\n    \"VRPose\",\n    \"VRStageParameters\",\n    \"VTTCue\",\n    \"VTTRegion\",\n    \"ValidityState\",\n    \"VideoPlaybackQuality\",\n    \"VideoStreamTrack\",\n    \"VisualViewport\",\n    \"WAIT_FAILED\",\n    \"WEBKIT_FILTER_RULE\",\n    \"WEBKIT_KEYFRAMES_RULE\",\n    \"WEBKIT_KEYFRAME_RULE\",\n    \"WEBKIT_REGION_RULE\",\n    \"WRONG_DOCUMENT_ERR\",\n    \"WakeLock\",\n    \"WakeLockSentinel\",\n    \"WasmAnyRef\",\n    \"WaveShaperNode\",\n    \"WeakMap\",\n    \"WeakRef\",\n    \"WeakSet\",\n    \"WebAssembly\",\n    \"WebGL2RenderingContext\",\n    \"WebGLActiveInfo\",\n    \"WebGLBuffer\",\n    \"WebGLContextEvent\",\n    \"WebGLFramebuffer\",\n    \"WebGLProgram\",\n    \"WebGLQuery\",\n    \"WebGLRenderbuffer\",\n    \"WebGLRenderingContext\",\n    \"WebGLSampler\",\n    \"WebGLShader\",\n    \"WebGLShaderPrecisionFormat\",\n    \"WebGLSync\",\n    \"WebGLTexture\",\n    \"WebGLTransformFeedback\",\n    \"WebGLUniformLocation\",\n    \"WebGLVertexArray\",\n    \"WebGLVertexArrayObject\",\n    \"WebKitAnimationEvent\",\n    \"WebKitBlobBuilder\",\n    \"WebKitCSSFilterRule\",\n    \"WebKitCSSFilterValue\",\n    \"WebKitCSSKeyframeRule\",\n    \"WebKitCSSKeyframesRule\",\n    \"WebKitCSSMatrix\",\n    \"WebKitCSSRegionRule\",\n    \"WebKitCSSTransformValue\",\n    \"WebKitDataCue\",\n    \"WebKitGamepad\",\n    \"WebKitMediaKeyError\",\n    \"WebKitMediaKeyMessageEvent\",\n    \"WebKitMediaKeySession\",\n    \"WebKitMediaKeys\",\n    \"WebKitMediaSource\",\n    \"WebKitMutationObserver\",\n    \"WebKitNamespace\",\n    \"WebKitPlaybackTargetAvailabilityEvent\",\n    \"WebKitPoint\",\n    \"WebKitShadowRoot\",\n    \"WebKitSourceBuffer\",\n    \"WebKitSourceBufferList\",\n    \"WebKitTransitionEvent\",\n    \"WebSocket\",\n    \"WebkitAlignContent\",\n    \"WebkitAlignItems\",\n    \"WebkitAlignSelf\",\n    \"WebkitAnimation\",\n    \"WebkitAnimationDelay\",\n    \"WebkitAnimationDirection\",\n    \"WebkitAnimationDuration\",\n    \"WebkitAnimationFillMode\",\n    \"WebkitAnimationIterationCount\",\n    \"WebkitAnimationName\",\n    \"WebkitAnimationPlayState\",\n    \"WebkitAnimationTimingFunction\",\n    \"WebkitAppearance\",\n    \"WebkitBackfaceVisibility\",\n    \"WebkitBackgroundClip\",\n    \"WebkitBackgroundOrigin\",\n    \"WebkitBackgroundSize\",\n    \"WebkitBorderBottomLeftRadius\",\n    \"WebkitBorderBottomRightRadius\",\n    \"WebkitBorderImage\",\n    \"WebkitBorderRadius\",\n    \"WebkitBorderTopLeftRadius\",\n    \"WebkitBorderTopRightRadius\",\n    \"WebkitBoxAlign\",\n    \"WebkitBoxDirection\",\n    \"WebkitBoxFlex\",\n    \"WebkitBoxOrdinalGroup\",\n    \"WebkitBoxOrient\",\n    \"WebkitBoxPack\",\n    \"WebkitBoxShadow\",\n    \"WebkitBoxSizing\",\n    \"WebkitFilter\",\n    \"WebkitFlex\",\n    \"WebkitFlexBasis\",\n    \"WebkitFlexDirection\",\n    \"WebkitFlexFlow\",\n    \"WebkitFlexGrow\",\n    \"WebkitFlexShrink\",\n    \"WebkitFlexWrap\",\n    \"WebkitJustifyContent\",\n    \"WebkitLineClamp\",\n    \"WebkitMask\",\n    \"WebkitMaskClip\",\n    \"WebkitMaskComposite\",\n    \"WebkitMaskImage\",\n    \"WebkitMaskOrigin\",\n    \"WebkitMaskPosition\",\n    \"WebkitMaskPositionX\",\n    \"WebkitMaskPositionY\",\n    \"WebkitMaskRepeat\",\n    \"WebkitMaskSize\",\n    \"WebkitOrder\",\n    \"WebkitPerspective\",\n    \"WebkitPerspectiveOrigin\",\n    \"WebkitTextFillColor\",\n    \"WebkitTextSizeAdjust\",\n    \"WebkitTextStroke\",\n    \"WebkitTextStrokeColor\",\n    \"WebkitTextStrokeWidth\",\n    \"WebkitTransform\",\n    \"WebkitTransformOrigin\",\n    \"WebkitTransformStyle\",\n    \"WebkitTransition\",\n    \"WebkitTransitionDelay\",\n    \"WebkitTransitionDuration\",\n    \"WebkitTransitionProperty\",\n    \"WebkitTransitionTimingFunction\",\n    \"WebkitUserSelect\",\n    \"WheelEvent\",\n    \"Window\",\n    \"Worker\",\n    \"Worklet\",\n    \"WritableStream\",\n    \"WritableStreamDefaultWriter\",\n    \"XMLDocument\",\n    \"XMLHttpRequest\",\n    \"XMLHttpRequestEventTarget\",\n    \"XMLHttpRequestException\",\n    \"XMLHttpRequestProgressEvent\",\n    \"XMLHttpRequestUpload\",\n    \"XMLSerializer\",\n    \"XMLStylesheetProcessingInstruction\",\n    \"XPathEvaluator\",\n    \"XPathException\",\n    \"XPathExpression\",\n    \"XPathNSResolver\",\n    \"XPathResult\",\n    \"XRBoundedReferenceSpace\",\n    \"XRDOMOverlayState\",\n    \"XRFrame\",\n    \"XRHitTestResult\",\n    \"XRHitTestSource\",\n    \"XRInputSource\",\n    \"XRInputSourceArray\",\n    \"XRInputSourceEvent\",\n    \"XRInputSourcesChangeEvent\",\n    \"XRLayer\",\n    \"XRPose\",\n    \"XRRay\",\n    \"XRReferenceSpace\",\n    \"XRReferenceSpaceEvent\",\n    \"XRRenderState\",\n    \"XRRigidTransform\",\n    \"XRSession\",\n    \"XRSessionEvent\",\n    \"XRSpace\",\n    \"XRSystem\",\n    \"XRTransientInputHitTestResult\",\n    \"XRTransientInputHitTestSource\",\n    \"XRView\",\n    \"XRViewerPose\",\n    \"XRViewport\",\n    \"XRWebGLLayer\",\n    \"XSLTProcessor\",\n    \"ZERO\",\n    \"_XD0M_\",\n    \"_YD0M_\",\n    \"__defineGetter__\",\n    \"__defineSetter__\",\n    \"__lookupGetter__\",\n    \"__lookupSetter__\",\n    \"__opera\",\n    \"__proto__\",\n    \"_browserjsran\",\n    \"a\",\n    \"aLink\",\n    \"abbr\",\n    \"abort\",\n    \"aborted\",\n    \"abs\",\n    \"absolute\",\n    \"acceleration\",\n    \"accelerationIncludingGravity\",\n    \"accelerator\",\n    \"accept\",\n    \"acceptCharset\",\n    \"acceptNode\",\n    \"accessKey\",\n    \"accessKeyLabel\",\n    \"accuracy\",\n    \"acos\",\n    \"acosh\",\n    \"action\",\n    \"actionURL\",\n    \"actions\",\n    \"activated\",\n    \"active\",\n    \"activeCues\",\n    \"activeElement\",\n    \"activeSourceBuffers\",\n    \"activeSourceCount\",\n    \"activeTexture\",\n    \"activeVRDisplays\",\n    \"actualBoundingBoxAscent\",\n    \"actualBoundingBoxDescent\",\n    \"actualBoundingBoxLeft\",\n    \"actualBoundingBoxRight\",\n    \"add\",\n    \"addAll\",\n    \"addBehavior\",\n    \"addCandidate\",\n    \"addColorStop\",\n    \"addCue\",\n    \"addElement\",\n    \"addEventListener\",\n    \"addFilter\",\n    \"addFromString\",\n    \"addFromUri\",\n    \"addIceCandidate\",\n    \"addImport\",\n    \"addListener\",\n    \"addModule\",\n    \"addNamed\",\n    \"addPageRule\",\n    \"addPath\",\n    \"addPointer\",\n    \"addRange\",\n    \"addRegion\",\n    \"addRule\",\n    \"addSearchEngine\",\n    \"addSourceBuffer\",\n    \"addStream\",\n    \"addTextTrack\",\n    \"addTrack\",\n    \"addTransceiver\",\n    \"addWakeLockListener\",\n    \"added\",\n    \"addedNodes\",\n    \"additionalName\",\n    \"additiveSymbols\",\n    \"addons\",\n    \"address\",\n    \"addressLine\",\n    \"adoptNode\",\n    \"adoptedStyleSheets\",\n    \"adr\",\n    \"advance\",\n    \"after\",\n    \"album\",\n    \"alert\",\n    \"algorithm\",\n    \"align\",\n    \"align-content\",\n    \"align-items\",\n    \"align-self\",\n    \"alignContent\",\n    \"alignItems\",\n    \"alignSelf\",\n    \"alignmentBaseline\",\n    \"alinkColor\",\n    \"all\",\n    \"allSettled\",\n    \"allow\",\n    \"allowFullscreen\",\n    \"allowPaymentRequest\",\n    \"allowedDirections\",\n    \"allowedFeatures\",\n    \"allowedToPlay\",\n    \"allowsFeature\",\n    \"alpha\",\n    \"alt\",\n    \"altGraphKey\",\n    \"altHtml\",\n    \"altKey\",\n    \"altLeft\",\n    \"alternate\",\n    \"alternateSetting\",\n    \"alternates\",\n    \"altitude\",\n    \"altitudeAccuracy\",\n    \"amplitude\",\n    \"ancestorOrigins\",\n    \"anchor\",\n    \"anchorNode\",\n    \"anchorOffset\",\n    \"anchors\",\n    \"and\",\n    \"angle\",\n    \"angularAcceleration\",\n    \"angularVelocity\",\n    \"animVal\",\n    \"animate\",\n    \"animatedInstanceRoot\",\n    \"animatedNormalizedPathSegList\",\n    \"animatedPathSegList\",\n    \"animatedPoints\",\n    \"animation\",\n    \"animation-delay\",\n    \"animation-direction\",\n    \"animation-duration\",\n    \"animation-fill-mode\",\n    \"animation-iteration-count\",\n    \"animation-name\",\n    \"animation-play-state\",\n    \"animation-timing-function\",\n    \"animationDelay\",\n    \"animationDirection\",\n    \"animationDuration\",\n    \"animationFillMode\",\n    \"animationIterationCount\",\n    \"animationName\",\n    \"animationPlayState\",\n    \"animationStartTime\",\n    \"animationTimingFunction\",\n    \"animationsPaused\",\n    \"anniversary\",\n    \"antialias\",\n    \"anticipatedRemoval\",\n    \"any\",\n    \"app\",\n    \"appCodeName\",\n    \"appMinorVersion\",\n    \"appName\",\n    \"appNotifications\",\n    \"appVersion\",\n    \"appearance\",\n    \"append\",\n    \"appendBuffer\",\n    \"appendChild\",\n    \"appendData\",\n    \"appendItem\",\n    \"appendMedium\",\n    \"appendNamed\",\n    \"appendRule\",\n    \"appendStream\",\n    \"appendWindowEnd\",\n    \"appendWindowStart\",\n    \"applets\",\n    \"applicationCache\",\n    \"applicationServerKey\",\n    \"apply\",\n    \"applyConstraints\",\n    \"applyElement\",\n    \"arc\",\n    \"arcTo\",\n    \"architecture\",\n    \"archive\",\n    \"areas\",\n    \"arguments\",\n    \"ariaAtomic\",\n    \"ariaAutoComplete\",\n    \"ariaBusy\",\n    \"ariaChecked\",\n    \"ariaColCount\",\n    \"ariaColIndex\",\n    \"ariaColSpan\",\n    \"ariaCurrent\",\n    \"ariaDescription\",\n    \"ariaDisabled\",\n    \"ariaExpanded\",\n    \"ariaHasPopup\",\n    \"ariaHidden\",\n    \"ariaKeyShortcuts\",\n    \"ariaLabel\",\n    \"ariaLevel\",\n    \"ariaLive\",\n    \"ariaModal\",\n    \"ariaMultiLine\",\n    \"ariaMultiSelectable\",\n    \"ariaOrientation\",\n    \"ariaPlaceholder\",\n    \"ariaPosInSet\",\n    \"ariaPressed\",\n    \"ariaReadOnly\",\n    \"ariaRelevant\",\n    \"ariaRequired\",\n    \"ariaRoleDescription\",\n    \"ariaRowCount\",\n    \"ariaRowIndex\",\n    \"ariaRowSpan\",\n    \"ariaSelected\",\n    \"ariaSetSize\",\n    \"ariaSort\",\n    \"ariaValueMax\",\n    \"ariaValueMin\",\n    \"ariaValueNow\",\n    \"ariaValueText\",\n    \"arrayBuffer\",\n    \"artist\",\n    \"artwork\",\n    \"as\",\n    \"asIntN\",\n    \"asUintN\",\n    \"asin\",\n    \"asinh\",\n    \"assert\",\n    \"assign\",\n    \"assignedElements\",\n    \"assignedNodes\",\n    \"assignedSlot\",\n    \"async\",\n    \"asyncIterator\",\n    \"atEnd\",\n    \"atan\",\n    \"atan2\",\n    \"atanh\",\n    \"atob\",\n    \"attachEvent\",\n    \"attachInternals\",\n    \"attachShader\",\n    \"attachShadow\",\n    \"attachments\",\n    \"attack\",\n    \"attestationObject\",\n    \"attrChange\",\n    \"attrName\",\n    \"attributeFilter\",\n    \"attributeName\",\n    \"attributeNamespace\",\n    \"attributeOldValue\",\n    \"attributeStyleMap\",\n    \"attributes\",\n    \"attribution\",\n    \"audioBitsPerSecond\",\n    \"audioTracks\",\n    \"audioWorklet\",\n    \"authenticatedSignedWrites\",\n    \"authenticatorData\",\n    \"autoIncrement\",\n    \"autobuffer\",\n    \"autocapitalize\",\n    \"autocomplete\",\n    \"autocorrect\",\n    \"autofocus\",\n    \"automationRate\",\n    \"autoplay\",\n    \"availHeight\",\n    \"availLeft\",\n    \"availTop\",\n    \"availWidth\",\n    \"availability\",\n    \"available\",\n    \"aversion\",\n    \"ax\",\n    \"axes\",\n    \"axis\",\n    \"ay\",\n    \"azimuth\",\n    \"b\",\n    \"back\",\n    \"backface-visibility\",\n    \"backfaceVisibility\",\n    \"background\",\n    \"background-attachment\",\n    \"background-blend-mode\",\n    \"background-clip\",\n    \"background-color\",\n    \"background-image\",\n    \"background-origin\",\n    \"background-position\",\n    \"background-position-x\",\n    \"background-position-y\",\n    \"background-repeat\",\n    \"background-size\",\n    \"backgroundAttachment\",\n    \"backgroundBlendMode\",\n    \"backgroundClip\",\n    \"backgroundColor\",\n    \"backgroundFetch\",\n    \"backgroundImage\",\n    \"backgroundOrigin\",\n    \"backgroundPosition\",\n    \"backgroundPositionX\",\n    \"backgroundPositionY\",\n    \"backgroundRepeat\",\n    \"backgroundSize\",\n    \"badInput\",\n    \"badge\",\n    \"balance\",\n    \"baseFrequencyX\",\n    \"baseFrequencyY\",\n    \"baseLatency\",\n    \"baseLayer\",\n    \"baseNode\",\n    \"baseOffset\",\n    \"baseURI\",\n    \"baseVal\",\n    \"baselineShift\",\n    \"battery\",\n    \"bday\",\n    \"before\",\n    \"beginElement\",\n    \"beginElementAt\",\n    \"beginPath\",\n    \"beginQuery\",\n    \"beginTransformFeedback\",\n    \"behavior\",\n    \"behaviorCookie\",\n    \"behaviorPart\",\n    \"behaviorUrns\",\n    \"beta\",\n    \"bezierCurveTo\",\n    \"bgColor\",\n    \"bgProperties\",\n    \"bias\",\n    \"big\",\n    \"bigint64\",\n    \"biguint64\",\n    \"binaryType\",\n    \"bind\",\n    \"bindAttribLocation\",\n    \"bindBuffer\",\n    \"bindBufferBase\",\n    \"bindBufferRange\",\n    \"bindFramebuffer\",\n    \"bindRenderbuffer\",\n    \"bindSampler\",\n    \"bindTexture\",\n    \"bindTransformFeedback\",\n    \"bindVertexArray\",\n    \"bitness\",\n    \"blendColor\",\n    \"blendEquation\",\n    \"blendEquationSeparate\",\n    \"blendFunc\",\n    \"blendFuncSeparate\",\n    \"blink\",\n    \"blitFramebuffer\",\n    \"blob\",\n    \"block-size\",\n    \"blockDirection\",\n    \"blockSize\",\n    \"blockedURI\",\n    \"blue\",\n    \"bluetooth\",\n    \"blur\",\n    \"body\",\n    \"bodyUsed\",\n    \"bold\",\n    \"bookmarks\",\n    \"booleanValue\",\n    \"border\",\n    \"border-block\",\n    \"border-block-color\",\n    \"border-block-end\",\n    \"border-block-end-color\",\n    \"border-block-end-style\",\n    \"border-block-end-width\",\n    \"border-block-start\",\n    \"border-block-start-color\",\n    \"border-block-start-style\",\n    \"border-block-start-width\",\n    \"border-block-style\",\n    \"border-block-width\",\n    \"border-bottom\",\n    \"border-bottom-color\",\n    \"border-bottom-left-radius\",\n    \"border-bottom-right-radius\",\n    \"border-bottom-style\",\n    \"border-bottom-width\",\n    \"border-collapse\",\n    \"border-color\",\n    \"border-end-end-radius\",\n    \"border-end-start-radius\",\n    \"border-image\",\n    \"border-image-outset\",\n    \"border-image-repeat\",\n    \"border-image-slice\",\n    \"border-image-source\",\n    \"border-image-width\",\n    \"border-inline\",\n    \"border-inline-color\",\n    \"border-inline-end\",\n    \"border-inline-end-color\",\n    \"border-inline-end-style\",\n    \"border-inline-end-width\",\n    \"border-inline-start\",\n    \"border-inline-start-color\",\n    \"border-inline-start-style\",\n    \"border-inline-start-width\",\n    \"border-inline-style\",\n    \"border-inline-width\",\n    \"border-left\",\n    \"border-left-color\",\n    \"border-left-style\",\n    \"border-left-width\",\n    \"border-radius\",\n    \"border-right\",\n    \"border-right-color\",\n    \"border-right-style\",\n    \"border-right-width\",\n    \"border-spacing\",\n    \"border-start-end-radius\",\n    \"border-start-start-radius\",\n    \"border-style\",\n    \"border-top\",\n    \"border-top-color\",\n    \"border-top-left-radius\",\n    \"border-top-right-radius\",\n    \"border-top-style\",\n    \"border-top-width\",\n    \"border-width\",\n    \"borderBlock\",\n    \"borderBlockColor\",\n    \"borderBlockEnd\",\n    \"borderBlockEndColor\",\n    \"borderBlockEndStyle\",\n    \"borderBlockEndWidth\",\n    \"borderBlockStart\",\n    \"borderBlockStartColor\",\n    \"borderBlockStartStyle\",\n    \"borderBlockStartWidth\",\n    \"borderBlockStyle\",\n    \"borderBlockWidth\",\n    \"borderBottom\",\n    \"borderBottomColor\",\n    \"borderBottomLeftRadius\",\n    \"borderBottomRightRadius\",\n    \"borderBottomStyle\",\n    \"borderBottomWidth\",\n    \"borderBoxSize\",\n    \"borderCollapse\",\n    \"borderColor\",\n    \"borderColorDark\",\n    \"borderColorLight\",\n    \"borderEndEndRadius\",\n    \"borderEndStartRadius\",\n    \"borderImage\",\n    \"borderImageOutset\",\n    \"borderImageRepeat\",\n    \"borderImageSlice\",\n    \"borderImageSource\",\n    \"borderImageWidth\",\n    \"borderInline\",\n    \"borderInlineColor\",\n    \"borderInlineEnd\",\n    \"borderInlineEndColor\",\n    \"borderInlineEndStyle\",\n    \"borderInlineEndWidth\",\n    \"borderInlineStart\",\n    \"borderInlineStartColor\",\n    \"borderInlineStartStyle\",\n    \"borderInlineStartWidth\",\n    \"borderInlineStyle\",\n    \"borderInlineWidth\",\n    \"borderLeft\",\n    \"borderLeftColor\",\n    \"borderLeftStyle\",\n    \"borderLeftWidth\",\n    \"borderRadius\",\n    \"borderRight\",\n    \"borderRightColor\",\n    \"borderRightStyle\",\n    \"borderRightWidth\",\n    \"borderSpacing\",\n    \"borderStartEndRadius\",\n    \"borderStartStartRadius\",\n    \"borderStyle\",\n    \"borderTop\",\n    \"borderTopColor\",\n    \"borderTopLeftRadius\",\n    \"borderTopRightRadius\",\n    \"borderTopStyle\",\n    \"borderTopWidth\",\n    \"borderWidth\",\n    \"bottom\",\n    \"bottomMargin\",\n    \"bound\",\n    \"boundElements\",\n    \"boundingClientRect\",\n    \"boundingHeight\",\n    \"boundingLeft\",\n    \"boundingTop\",\n    \"boundingWidth\",\n    \"bounds\",\n    \"boundsGeometry\",\n    \"box-decoration-break\",\n    \"box-shadow\",\n    \"box-sizing\",\n    \"boxDecorationBreak\",\n    \"boxShadow\",\n    \"boxSizing\",\n    \"brand\",\n    \"brands\",\n    \"break-after\",\n    \"break-before\",\n    \"break-inside\",\n    \"breakAfter\",\n    \"breakBefore\",\n    \"breakInside\",\n    \"broadcast\",\n    \"browserLanguage\",\n    \"btoa\",\n    \"bubbles\",\n    \"buffer\",\n    \"bufferData\",\n    \"bufferDepth\",\n    \"bufferSize\",\n    \"bufferSubData\",\n    \"buffered\",\n    \"bufferedAmount\",\n    \"bufferedAmountLowThreshold\",\n    \"buildID\",\n    \"buildNumber\",\n    \"button\",\n    \"buttonID\",\n    \"buttons\",\n    \"byteLength\",\n    \"byteOffset\",\n    \"bytesWritten\",\n    \"c\",\n    \"cache\",\n    \"caches\",\n    \"call\",\n    \"caller\",\n    \"canBeFormatted\",\n    \"canBeMounted\",\n    \"canBeShared\",\n    \"canHaveChildren\",\n    \"canHaveHTML\",\n    \"canInsertDTMF\",\n    \"canMakePayment\",\n    \"canPlayType\",\n    \"canPresent\",\n    \"canTrickleIceCandidates\",\n    \"cancel\",\n    \"cancelAndHoldAtTime\",\n    \"cancelAnimationFrame\",\n    \"cancelBubble\",\n    \"cancelIdleCallback\",\n    \"cancelScheduledValues\",\n    \"cancelVideoFrameCallback\",\n    \"cancelWatchAvailability\",\n    \"cancelable\",\n    \"candidate\",\n    \"canonicalUUID\",\n    \"canvas\",\n    \"capabilities\",\n    \"caption\",\n    \"caption-side\",\n    \"captionSide\",\n    \"capture\",\n    \"captureEvents\",\n    \"captureStackTrace\",\n    \"captureStream\",\n    \"caret-color\",\n    \"caretBidiLevel\",\n    \"caretColor\",\n    \"caretPositionFromPoint\",\n    \"caretRangeFromPoint\",\n    \"cast\",\n    \"catch\",\n    \"category\",\n    \"cbrt\",\n    \"cd\",\n    \"ceil\",\n    \"cellIndex\",\n    \"cellPadding\",\n    \"cellSpacing\",\n    \"cells\",\n    \"ch\",\n    \"chOff\",\n    \"chain\",\n    \"challenge\",\n    \"changeType\",\n    \"changedTouches\",\n    \"channel\",\n    \"channelCount\",\n    \"channelCountMode\",\n    \"channelInterpretation\",\n    \"char\",\n    \"charAt\",\n    \"charCode\",\n    \"charCodeAt\",\n    \"charIndex\",\n    \"charLength\",\n    \"characterData\",\n    \"characterDataOldValue\",\n    \"characterSet\",\n    \"characteristic\",\n    \"charging\",\n    \"chargingTime\",\n    \"charset\",\n    \"check\",\n    \"checkEnclosure\",\n    \"checkFramebufferStatus\",\n    \"checkIntersection\",\n    \"checkValidity\",\n    \"checked\",\n    \"childElementCount\",\n    \"childList\",\n    \"childNodes\",\n    \"children\",\n    \"chrome\",\n    \"ciphertext\",\n    \"cite\",\n    \"city\",\n    \"claimInterface\",\n    \"claimed\",\n    \"classList\",\n    \"className\",\n    \"classid\",\n    \"clear\",\n    \"clearAppBadge\",\n    \"clearAttributes\",\n    \"clearBufferfi\",\n    \"clearBufferfv\",\n    \"clearBufferiv\",\n    \"clearBufferuiv\",\n    \"clearColor\",\n    \"clearData\",\n    \"clearDepth\",\n    \"clearHalt\",\n    \"clearImmediate\",\n    \"clearInterval\",\n    \"clearLiveSeekableRange\",\n    \"clearMarks\",\n    \"clearMaxGCPauseAccumulator\",\n    \"clearMeasures\",\n    \"clearParameters\",\n    \"clearRect\",\n    \"clearResourceTimings\",\n    \"clearShadow\",\n    \"clearStencil\",\n    \"clearTimeout\",\n    \"clearWatch\",\n    \"click\",\n    \"clickCount\",\n    \"clientDataJSON\",\n    \"clientHeight\",\n    \"clientInformation\",\n    \"clientLeft\",\n    \"clientRect\",\n    \"clientRects\",\n    \"clientTop\",\n    \"clientWaitSync\",\n    \"clientWidth\",\n    \"clientX\",\n    \"clientY\",\n    \"clip\",\n    \"clip-path\",\n    \"clip-rule\",\n    \"clipBottom\",\n    \"clipLeft\",\n    \"clipPath\",\n    \"clipPathUnits\",\n    \"clipRight\",\n    \"clipRule\",\n    \"clipTop\",\n    \"clipboard\",\n    \"clipboardData\",\n    \"clone\",\n    \"cloneContents\",\n    \"cloneNode\",\n    \"cloneRange\",\n    \"close\",\n    \"closePath\",\n    \"closed\",\n    \"closest\",\n    \"clz\",\n    \"clz32\",\n    \"cm\",\n    \"cmp\",\n    \"code\",\n    \"codeBase\",\n    \"codePointAt\",\n    \"codeType\",\n    \"colSpan\",\n    \"collapse\",\n    \"collapseToEnd\",\n    \"collapseToStart\",\n    \"collapsed\",\n    \"collect\",\n    \"colno\",\n    \"color\",\n    \"color-adjust\",\n    \"color-interpolation\",\n    \"color-interpolation-filters\",\n    \"colorAdjust\",\n    \"colorDepth\",\n    \"colorInterpolation\",\n    \"colorInterpolationFilters\",\n    \"colorMask\",\n    \"colorType\",\n    \"cols\",\n    \"column-count\",\n    \"column-fill\",\n    \"column-gap\",\n    \"column-rule\",\n    \"column-rule-color\",\n    \"column-rule-style\",\n    \"column-rule-width\",\n    \"column-span\",\n    \"column-width\",\n    \"columnCount\",\n    \"columnFill\",\n    \"columnGap\",\n    \"columnNumber\",\n    \"columnRule\",\n    \"columnRuleColor\",\n    \"columnRuleStyle\",\n    \"columnRuleWidth\",\n    \"columnSpan\",\n    \"columnWidth\",\n    \"columns\",\n    \"command\",\n    \"commit\",\n    \"commitPreferences\",\n    \"commitStyles\",\n    \"commonAncestorContainer\",\n    \"compact\",\n    \"compareBoundaryPoints\",\n    \"compareDocumentPosition\",\n    \"compareEndPoints\",\n    \"compareExchange\",\n    \"compareNode\",\n    \"comparePoint\",\n    \"compatMode\",\n    \"compatible\",\n    \"compile\",\n    \"compileShader\",\n    \"compileStreaming\",\n    \"complete\",\n    \"component\",\n    \"componentFromPoint\",\n    \"composed\",\n    \"composedPath\",\n    \"composite\",\n    \"compositionEndOffset\",\n    \"compositionStartOffset\",\n    \"compressedTexImage2D\",\n    \"compressedTexImage3D\",\n    \"compressedTexSubImage2D\",\n    \"compressedTexSubImage3D\",\n    \"computedStyleMap\",\n    \"concat\",\n    \"conditionText\",\n    \"coneInnerAngle\",\n    \"coneOuterAngle\",\n    \"coneOuterGain\",\n    \"configuration\",\n    \"configurationName\",\n    \"configurationValue\",\n    \"configurations\",\n    \"confirm\",\n    \"confirmComposition\",\n    \"confirmSiteSpecificTrackingException\",\n    \"confirmWebWideTrackingException\",\n    \"connect\",\n    \"connectEnd\",\n    \"connectShark\",\n    \"connectStart\",\n    \"connected\",\n    \"connection\",\n    \"connectionList\",\n    \"connectionSpeed\",\n    \"connectionState\",\n    \"connections\",\n    \"console\",\n    \"consolidate\",\n    \"constraint\",\n    \"constrictionActive\",\n    \"construct\",\n    \"constructor\",\n    \"contactID\",\n    \"contain\",\n    \"containerId\",\n    \"containerName\",\n    \"containerSrc\",\n    \"containerType\",\n    \"contains\",\n    \"containsNode\",\n    \"content\",\n    \"contentBoxSize\",\n    \"contentDocument\",\n    \"contentEditable\",\n    \"contentHint\",\n    \"contentOverflow\",\n    \"contentRect\",\n    \"contentScriptType\",\n    \"contentStyleType\",\n    \"contentType\",\n    \"contentWindow\",\n    \"context\",\n    \"contextMenu\",\n    \"contextmenu\",\n    \"continue\",\n    \"continuePrimaryKey\",\n    \"continuous\",\n    \"control\",\n    \"controlTransferIn\",\n    \"controlTransferOut\",\n    \"controller\",\n    \"controls\",\n    \"controlsList\",\n    \"convertPointFromNode\",\n    \"convertQuadFromNode\",\n    \"convertRectFromNode\",\n    \"convertToBlob\",\n    \"convertToSpecifiedUnits\",\n    \"cookie\",\n    \"cookieEnabled\",\n    \"coords\",\n    \"copyBufferSubData\",\n    \"copyFromChannel\",\n    \"copyTexImage2D\",\n    \"copyTexSubImage2D\",\n    \"copyTexSubImage3D\",\n    \"copyToChannel\",\n    \"copyWithin\",\n    \"correspondingElement\",\n    \"correspondingUseElement\",\n    \"corruptedVideoFrames\",\n    \"cos\",\n    \"cosh\",\n    \"count\",\n    \"countReset\",\n    \"counter-increment\",\n    \"counter-reset\",\n    \"counter-set\",\n    \"counterIncrement\",\n    \"counterReset\",\n    \"counterSet\",\n    \"country\",\n    \"cpuClass\",\n    \"cpuSleepAllowed\",\n    \"create\",\n    \"createAnalyser\",\n    \"createAnswer\",\n    \"createAttribute\",\n    \"createAttributeNS\",\n    \"createBiquadFilter\",\n    \"createBuffer\",\n    \"createBufferSource\",\n    \"createCDATASection\",\n    \"createCSSStyleSheet\",\n    \"createCaption\",\n    \"createChannelMerger\",\n    \"createChannelSplitter\",\n    \"createComment\",\n    \"createConstantSource\",\n    \"createContextualFragment\",\n    \"createControlRange\",\n    \"createConvolver\",\n    \"createDTMFSender\",\n    \"createDataChannel\",\n    \"createDelay\",\n    \"createDelayNode\",\n    \"createDocument\",\n    \"createDocumentFragment\",\n    \"createDocumentType\",\n    \"createDynamicsCompressor\",\n    \"createElement\",\n    \"createElementNS\",\n    \"createEntityReference\",\n    \"createEvent\",\n    \"createEventObject\",\n    \"createExpression\",\n    \"createFramebuffer\",\n    \"createFunction\",\n    \"createGain\",\n    \"createGainNode\",\n    \"createHTML\",\n    \"createHTMLDocument\",\n    \"createIIRFilter\",\n    \"createImageBitmap\",\n    \"createImageData\",\n    \"createIndex\",\n    \"createJavaScriptNode\",\n    \"createLinearGradient\",\n    \"createMediaElementSource\",\n    \"createMediaKeys\",\n    \"createMediaStreamDestination\",\n    \"createMediaStreamSource\",\n    \"createMediaStreamTrackSource\",\n    \"createMutableFile\",\n    \"createNSResolver\",\n    \"createNodeIterator\",\n    \"createNotification\",\n    \"createObjectStore\",\n    \"createObjectURL\",\n    \"createOffer\",\n    \"createOscillator\",\n    \"createPanner\",\n    \"createPattern\",\n    \"createPeriodicWave\",\n    \"createPolicy\",\n    \"createPopup\",\n    \"createProcessingInstruction\",\n    \"createProgram\",\n    \"createQuery\",\n    \"createRadialGradient\",\n    \"createRange\",\n    \"createRangeCollection\",\n    \"createReader\",\n    \"createRenderbuffer\",\n    \"createSVGAngle\",\n    \"createSVGLength\",\n    \"createSVGMatrix\",\n    \"createSVGNumber\",\n    \"createSVGPathSegArcAbs\",\n    \"createSVGPathSegArcRel\",\n    \"createSVGPathSegClosePath\",\n    \"createSVGPathSegCurvetoCubicAbs\",\n    \"createSVGPathSegCurvetoCubicRel\",\n    \"createSVGPathSegCurvetoCubicSmoothAbs\",\n    \"createSVGPathSegCurvetoCubicSmoothRel\",\n    \"createSVGPathSegCurvetoQuadraticAbs\",\n    \"createSVGPathSegCurvetoQuadraticRel\",\n    \"createSVGPathSegCurvetoQuadraticSmoothAbs\",\n    \"createSVGPathSegCurvetoQuadraticSmoothRel\",\n    \"createSVGPathSegLinetoAbs\",\n    \"createSVGPathSegLinetoHorizontalAbs\",\n    \"createSVGPathSegLinetoHorizontalRel\",\n    \"createSVGPathSegLinetoRel\",\n    \"createSVGPathSegLinetoVerticalAbs\",\n    \"createSVGPathSegLinetoVerticalRel\",\n    \"createSVGPathSegMovetoAbs\",\n    \"createSVGPathSegMovetoRel\",\n    \"createSVGPoint\",\n    \"createSVGRect\",\n    \"createSVGTransform\",\n    \"createSVGTransformFromMatrix\",\n    \"createSampler\",\n    \"createScript\",\n    \"createScriptProcessor\",\n    \"createScriptURL\",\n    \"createSession\",\n    \"createShader\",\n    \"createShadowRoot\",\n    \"createStereoPanner\",\n    \"createStyleSheet\",\n    \"createTBody\",\n    \"createTFoot\",\n    \"createTHead\",\n    \"createTextNode\",\n    \"createTextRange\",\n    \"createTexture\",\n    \"createTouch\",\n    \"createTouchList\",\n    \"createTransformFeedback\",\n    \"createTreeWalker\",\n    \"createVertexArray\",\n    \"createWaveShaper\",\n    \"creationTime\",\n    \"credentials\",\n    \"crossOrigin\",\n    \"crossOriginIsolated\",\n    \"crypto\",\n    \"csi\",\n    \"csp\",\n    \"cssFloat\",\n    \"cssRules\",\n    \"cssText\",\n    \"cssValueType\",\n    \"ctrlKey\",\n    \"ctrlLeft\",\n    \"cues\",\n    \"cullFace\",\n    \"currentDirection\",\n    \"currentLocalDescription\",\n    \"currentNode\",\n    \"currentPage\",\n    \"currentRect\",\n    \"currentRemoteDescription\",\n    \"currentScale\",\n    \"currentScript\",\n    \"currentSrc\",\n    \"currentState\",\n    \"currentStyle\",\n    \"currentTarget\",\n    \"currentTime\",\n    \"currentTranslate\",\n    \"currentView\",\n    \"cursor\",\n    \"curve\",\n    \"customElements\",\n    \"customError\",\n    \"cx\",\n    \"cy\",\n    \"d\",\n    \"data\",\n    \"dataFld\",\n    \"dataFormatAs\",\n    \"dataLoss\",\n    \"dataLossMessage\",\n    \"dataPageSize\",\n    \"dataSrc\",\n    \"dataTransfer\",\n    \"database\",\n    \"databases\",\n    \"dataset\",\n    \"dateTime\",\n    \"db\",\n    \"debug\",\n    \"debuggerEnabled\",\n    \"declare\",\n    \"decode\",\n    \"decodeAudioData\",\n    \"decodeURI\",\n    \"decodeURIComponent\",\n    \"decodedBodySize\",\n    \"decoding\",\n    \"decodingInfo\",\n    \"decrypt\",\n    \"default\",\n    \"defaultCharset\",\n    \"defaultChecked\",\n    \"defaultMuted\",\n    \"defaultPlaybackRate\",\n    \"defaultPolicy\",\n    \"defaultPrevented\",\n    \"defaultRequest\",\n    \"defaultSelected\",\n    \"defaultStatus\",\n    \"defaultURL\",\n    \"defaultValue\",\n    \"defaultView\",\n    \"defaultstatus\",\n    \"defer\",\n    \"define\",\n    \"defineMagicFunction\",\n    \"defineMagicVariable\",\n    \"defineProperties\",\n    \"defineProperty\",\n    \"deg\",\n    \"delay\",\n    \"delayTime\",\n    \"delegatesFocus\",\n    \"delete\",\n    \"deleteBuffer\",\n    \"deleteCaption\",\n    \"deleteCell\",\n    \"deleteContents\",\n    \"deleteData\",\n    \"deleteDatabase\",\n    \"deleteFramebuffer\",\n    \"deleteFromDocument\",\n    \"deleteIndex\",\n    \"deleteMedium\",\n    \"deleteObjectStore\",\n    \"deleteProgram\",\n    \"deleteProperty\",\n    \"deleteQuery\",\n    \"deleteRenderbuffer\",\n    \"deleteRow\",\n    \"deleteRule\",\n    \"deleteSampler\",\n    \"deleteShader\",\n    \"deleteSync\",\n    \"deleteTFoot\",\n    \"deleteTHead\",\n    \"deleteTexture\",\n    \"deleteTransformFeedback\",\n    \"deleteVertexArray\",\n    \"deliverChangeRecords\",\n    \"delivery\",\n    \"deliveryInfo\",\n    \"deliveryStatus\",\n    \"deliveryTimestamp\",\n    \"delta\",\n    \"deltaMode\",\n    \"deltaX\",\n    \"deltaY\",\n    \"deltaZ\",\n    \"dependentLocality\",\n    \"depthFar\",\n    \"depthFunc\",\n    \"depthMask\",\n    \"depthNear\",\n    \"depthRange\",\n    \"deref\",\n    \"deriveBits\",\n    \"deriveKey\",\n    \"description\",\n    \"deselectAll\",\n    \"designMode\",\n    \"desiredSize\",\n    \"destination\",\n    \"destinationURL\",\n    \"detach\",\n    \"detachEvent\",\n    \"detachShader\",\n    \"detail\",\n    \"details\",\n    \"detect\",\n    \"detune\",\n    \"device\",\n    \"deviceClass\",\n    \"deviceId\",\n    \"deviceMemory\",\n    \"devicePixelContentBoxSize\",\n    \"devicePixelRatio\",\n    \"deviceProtocol\",\n    \"deviceSubclass\",\n    \"deviceVersionMajor\",\n    \"deviceVersionMinor\",\n    \"deviceVersionSubminor\",\n    \"deviceXDPI\",\n    \"deviceYDPI\",\n    \"didTimeout\",\n    \"diffuseConstant\",\n    \"digest\",\n    \"dimensions\",\n    \"dir\",\n    \"dirName\",\n    \"direction\",\n    \"dirxml\",\n    \"disable\",\n    \"disablePictureInPicture\",\n    \"disableRemotePlayback\",\n    \"disableVertexAttribArray\",\n    \"disabled\",\n    \"dischargingTime\",\n    \"disconnect\",\n    \"disconnectShark\",\n    \"dispatchEvent\",\n    \"display\",\n    \"displayId\",\n    \"displayName\",\n    \"disposition\",\n    \"distanceModel\",\n    \"div\",\n    \"divisor\",\n    \"djsapi\",\n    \"djsproxy\",\n    \"doImport\",\n    \"doNotTrack\",\n    \"doScroll\",\n    \"doctype\",\n    \"document\",\n    \"documentElement\",\n    \"documentMode\",\n    \"documentURI\",\n    \"dolphin\",\n    \"dolphinGameCenter\",\n    \"dolphininfo\",\n    \"dolphinmeta\",\n    \"domComplete\",\n    \"domContentLoadedEventEnd\",\n    \"domContentLoadedEventStart\",\n    \"domInteractive\",\n    \"domLoading\",\n    \"domOverlayState\",\n    \"domain\",\n    \"domainLookupEnd\",\n    \"domainLookupStart\",\n    \"dominant-baseline\",\n    \"dominantBaseline\",\n    \"done\",\n    \"dopplerFactor\",\n    \"dotAll\",\n    \"downDegrees\",\n    \"downlink\",\n    \"download\",\n    \"downloadTotal\",\n    \"downloaded\",\n    \"dpcm\",\n    \"dpi\",\n    \"dppx\",\n    \"dragDrop\",\n    \"draggable\",\n    \"drawArrays\",\n    \"drawArraysInstanced\",\n    \"drawArraysInstancedANGLE\",\n    \"drawBuffers\",\n    \"drawCustomFocusRing\",\n    \"drawElements\",\n    \"drawElementsInstanced\",\n    \"drawElementsInstancedANGLE\",\n    \"drawFocusIfNeeded\",\n    \"drawImage\",\n    \"drawImageFromRect\",\n    \"drawRangeElements\",\n    \"drawSystemFocusRing\",\n    \"drawingBufferHeight\",\n    \"drawingBufferWidth\",\n    \"dropEffect\",\n    \"droppedVideoFrames\",\n    \"dropzone\",\n    \"dtmf\",\n    \"dump\",\n    \"dumpProfile\",\n    \"duplicate\",\n    \"durability\",\n    \"duration\",\n    \"dvname\",\n    \"dvnum\",\n    \"dx\",\n    \"dy\",\n    \"dynsrc\",\n    \"e\",\n    \"edgeMode\",\n    \"effect\",\n    \"effectAllowed\",\n    \"effectiveDirective\",\n    \"effectiveType\",\n    \"elapsedTime\",\n    \"element\",\n    \"elementFromPoint\",\n    \"elementTiming\",\n    \"elements\",\n    \"elementsFromPoint\",\n    \"elevation\",\n    \"ellipse\",\n    \"em\",\n    \"email\",\n    \"embeds\",\n    \"emma\",\n    \"empty\",\n    \"empty-cells\",\n    \"emptyCells\",\n    \"emptyHTML\",\n    \"emptyScript\",\n    \"emulatedPosition\",\n    \"enable\",\n    \"enableBackground\",\n    \"enableDelegations\",\n    \"enableStyleSheetsForSet\",\n    \"enableVertexAttribArray\",\n    \"enabled\",\n    \"enabledPlugin\",\n    \"encode\",\n    \"encodeInto\",\n    \"encodeURI\",\n    \"encodeURIComponent\",\n    \"encodedBodySize\",\n    \"encoding\",\n    \"encodingInfo\",\n    \"encrypt\",\n    \"enctype\",\n    \"end\",\n    \"endContainer\",\n    \"endElement\",\n    \"endElementAt\",\n    \"endOfStream\",\n    \"endOffset\",\n    \"endQuery\",\n    \"endTime\",\n    \"endTransformFeedback\",\n    \"ended\",\n    \"endpoint\",\n    \"endpointNumber\",\n    \"endpoints\",\n    \"endsWith\",\n    \"enterKeyHint\",\n    \"entities\",\n    \"entries\",\n    \"entryType\",\n    \"enumerate\",\n    \"enumerateDevices\",\n    \"enumerateEditable\",\n    \"environmentBlendMode\",\n    \"equals\",\n    \"error\",\n    \"errorCode\",\n    \"errorDetail\",\n    \"errorText\",\n    \"escape\",\n    \"estimate\",\n    \"eval\",\n    \"evaluate\",\n    \"event\",\n    \"eventPhase\",\n    \"every\",\n    \"ex\",\n    \"exception\",\n    \"exchange\",\n    \"exec\",\n    \"execCommand\",\n    \"execCommandShowHelp\",\n    \"execScript\",\n    \"exitFullscreen\",\n    \"exitPictureInPicture\",\n    \"exitPointerLock\",\n    \"exitPresent\",\n    \"exp\",\n    \"expand\",\n    \"expandEntityReferences\",\n    \"expando\",\n    \"expansion\",\n    \"expiration\",\n    \"expirationTime\",\n    \"expires\",\n    \"expiryDate\",\n    \"explicitOriginalTarget\",\n    \"expm1\",\n    \"exponent\",\n    \"exponentialRampToValueAtTime\",\n    \"exportKey\",\n    \"exports\",\n    \"extend\",\n    \"extensions\",\n    \"extentNode\",\n    \"extentOffset\",\n    \"external\",\n    \"externalResourcesRequired\",\n    \"extractContents\",\n    \"extractable\",\n    \"eye\",\n    \"f\",\n    \"face\",\n    \"factoryReset\",\n    \"failureReason\",\n    \"fallback\",\n    \"family\",\n    \"familyName\",\n    \"farthestViewportElement\",\n    \"fastSeek\",\n    \"fatal\",\n    \"featureId\",\n    \"featurePolicy\",\n    \"featureSettings\",\n    \"features\",\n    \"fenceSync\",\n    \"fetch\",\n    \"fetchStart\",\n    \"fftSize\",\n    \"fgColor\",\n    \"fieldOfView\",\n    \"file\",\n    \"fileCreatedDate\",\n    \"fileHandle\",\n    \"fileModifiedDate\",\n    \"fileName\",\n    \"fileSize\",\n    \"fileUpdatedDate\",\n    \"filename\",\n    \"files\",\n    \"filesystem\",\n    \"fill\",\n    \"fill-opacity\",\n    \"fill-rule\",\n    \"fillLightMode\",\n    \"fillOpacity\",\n    \"fillRect\",\n    \"fillRule\",\n    \"fillStyle\",\n    \"fillText\",\n    \"filter\",\n    \"filterResX\",\n    \"filterResY\",\n    \"filterUnits\",\n    \"filters\",\n    \"finally\",\n    \"find\",\n    \"findIndex\",\n    \"findRule\",\n    \"findText\",\n    \"finish\",\n    \"finished\",\n    \"fireEvent\",\n    \"firesTouchEvents\",\n    \"firstChild\",\n    \"firstElementChild\",\n    \"firstPage\",\n    \"fixed\",\n    \"flags\",\n    \"flat\",\n    \"flatMap\",\n    \"flex\",\n    \"flex-basis\",\n    \"flex-direction\",\n    \"flex-flow\",\n    \"flex-grow\",\n    \"flex-shrink\",\n    \"flex-wrap\",\n    \"flexBasis\",\n    \"flexDirection\",\n    \"flexFlow\",\n    \"flexGrow\",\n    \"flexShrink\",\n    \"flexWrap\",\n    \"flipX\",\n    \"flipY\",\n    \"float\",\n    \"float32\",\n    \"float64\",\n    \"flood-color\",\n    \"flood-opacity\",\n    \"floodColor\",\n    \"floodOpacity\",\n    \"floor\",\n    \"flush\",\n    \"focus\",\n    \"focusNode\",\n    \"focusOffset\",\n    \"font\",\n    \"font-family\",\n    \"font-feature-settings\",\n    \"font-kerning\",\n    \"font-language-override\",\n    \"font-optical-sizing\",\n    \"font-size\",\n    \"font-size-adjust\",\n    \"font-stretch\",\n    \"font-style\",\n    \"font-synthesis\",\n    \"font-variant\",\n    \"font-variant-alternates\",\n    \"font-variant-caps\",\n    \"font-variant-east-asian\",\n    \"font-variant-ligatures\",\n    \"font-variant-numeric\",\n    \"font-variant-position\",\n    \"font-variation-settings\",\n    \"font-weight\",\n    \"fontFamily\",\n    \"fontFeatureSettings\",\n    \"fontKerning\",\n    \"fontLanguageOverride\",\n    \"fontOpticalSizing\",\n    \"fontSize\",\n    \"fontSizeAdjust\",\n    \"fontSmoothingEnabled\",\n    \"fontStretch\",\n    \"fontStyle\",\n    \"fontSynthesis\",\n    \"fontVariant\",\n    \"fontVariantAlternates\",\n    \"fontVariantCaps\",\n    \"fontVariantEastAsian\",\n    \"fontVariantLigatures\",\n    \"fontVariantNumeric\",\n    \"fontVariantPosition\",\n    \"fontVariationSettings\",\n    \"fontWeight\",\n    \"fontcolor\",\n    \"fontfaces\",\n    \"fonts\",\n    \"fontsize\",\n    \"for\",\n    \"forEach\",\n    \"force\",\n    \"forceRedraw\",\n    \"form\",\n    \"formAction\",\n    \"formData\",\n    \"formEnctype\",\n    \"formMethod\",\n    \"formNoValidate\",\n    \"formTarget\",\n    \"format\",\n    \"formatToParts\",\n    \"forms\",\n    \"forward\",\n    \"forwardX\",\n    \"forwardY\",\n    \"forwardZ\",\n    \"foundation\",\n    \"fr\",\n    \"fragmentDirective\",\n    \"frame\",\n    \"frameBorder\",\n    \"frameElement\",\n    \"frameSpacing\",\n    \"framebuffer\",\n    \"framebufferHeight\",\n    \"framebufferRenderbuffer\",\n    \"framebufferTexture2D\",\n    \"framebufferTextureLayer\",\n    \"framebufferWidth\",\n    \"frames\",\n    \"freeSpace\",\n    \"freeze\",\n    \"frequency\",\n    \"frequencyBinCount\",\n    \"from\",\n    \"fromCharCode\",\n    \"fromCodePoint\",\n    \"fromElement\",\n    \"fromEntries\",\n    \"fromFloat32Array\",\n    \"fromFloat64Array\",\n    \"fromMatrix\",\n    \"fromPoint\",\n    \"fromQuad\",\n    \"fromRect\",\n    \"frontFace\",\n    \"fround\",\n    \"fullPath\",\n    \"fullScreen\",\n    \"fullVersionList\",\n    \"fullscreen\",\n    \"fullscreenElement\",\n    \"fullscreenEnabled\",\n    \"fx\",\n    \"fy\",\n    \"gain\",\n    \"gamepad\",\n    \"gamma\",\n    \"gap\",\n    \"gatheringState\",\n    \"gatt\",\n    \"genderIdentity\",\n    \"generateCertificate\",\n    \"generateKey\",\n    \"generateMipmap\",\n    \"generateRequest\",\n    \"geolocation\",\n    \"gestureObject\",\n    \"get\",\n    \"getActiveAttrib\",\n    \"getActiveUniform\",\n    \"getActiveUniformBlockName\",\n    \"getActiveUniformBlockParameter\",\n    \"getActiveUniforms\",\n    \"getAdjacentText\",\n    \"getAll\",\n    \"getAllKeys\",\n    \"getAllResponseHeaders\",\n    \"getAllowlistForFeature\",\n    \"getAnimations\",\n    \"getAsFile\",\n    \"getAsString\",\n    \"getAttachedShaders\",\n    \"getAttribLocation\",\n    \"getAttribute\",\n    \"getAttributeNS\",\n    \"getAttributeNames\",\n    \"getAttributeNode\",\n    \"getAttributeNodeNS\",\n    \"getAttributeType\",\n    \"getAudioTracks\",\n    \"getAvailability\",\n    \"getBBox\",\n    \"getBattery\",\n    \"getBigInt64\",\n    \"getBigUint64\",\n    \"getBlob\",\n    \"getBookmark\",\n    \"getBoundingClientRect\",\n    \"getBounds\",\n    \"getBoxQuads\",\n    \"getBufferParameter\",\n    \"getBufferSubData\",\n    \"getByteFrequencyData\",\n    \"getByteTimeDomainData\",\n    \"getCSSCanvasContext\",\n    \"getCTM\",\n    \"getCandidateWindowClientRect\",\n    \"getCanonicalLocales\",\n    \"getCapabilities\",\n    \"getChannelData\",\n    \"getCharNumAtPosition\",\n    \"getCharacteristic\",\n    \"getCharacteristics\",\n    \"getClientExtensionResults\",\n    \"getClientRect\",\n    \"getClientRects\",\n    \"getCoalescedEvents\",\n    \"getCompositionAlternatives\",\n    \"getComputedStyle\",\n    \"getComputedTextLength\",\n    \"getComputedTiming\",\n    \"getConfiguration\",\n    \"getConstraints\",\n    \"getContext\",\n    \"getContextAttributes\",\n    \"getContributingSources\",\n    \"getCounterValue\",\n    \"getCueAsHTML\",\n    \"getCueById\",\n    \"getCurrentPosition\",\n    \"getCurrentTime\",\n    \"getData\",\n    \"getDatabaseNames\",\n    \"getDate\",\n    \"getDay\",\n    \"getDefaultComputedStyle\",\n    \"getDescriptor\",\n    \"getDescriptors\",\n    \"getDestinationInsertionPoints\",\n    \"getDevices\",\n    \"getDirectory\",\n    \"getDisplayMedia\",\n    \"getDistributedNodes\",\n    \"getEditable\",\n    \"getElementById\",\n    \"getElementsByClassName\",\n    \"getElementsByName\",\n    \"getElementsByTagName\",\n    \"getElementsByTagNameNS\",\n    \"getEnclosureList\",\n    \"getEndPositionOfChar\",\n    \"getEntries\",\n    \"getEntriesByName\",\n    \"getEntriesByType\",\n    \"getError\",\n    \"getExtension\",\n    \"getExtentOfChar\",\n    \"getEyeParameters\",\n    \"getFeature\",\n    \"getFile\",\n    \"getFiles\",\n    \"getFilesAndDirectories\",\n    \"getFingerprints\",\n    \"getFloat32\",\n    \"getFloat64\",\n    \"getFloatFrequencyData\",\n    \"getFloatTimeDomainData\",\n    \"getFloatValue\",\n    \"getFragDataLocation\",\n    \"getFrameData\",\n    \"getFramebufferAttachmentParameter\",\n    \"getFrequencyResponse\",\n    \"getFullYear\",\n    \"getGamepads\",\n    \"getHighEntropyValues\",\n    \"getHitTestResults\",\n    \"getHitTestResultsForTransientInput\",\n    \"getHours\",\n    \"getIdentityAssertion\",\n    \"getIds\",\n    \"getImageData\",\n    \"getIndexedParameter\",\n    \"getInstalledRelatedApps\",\n    \"getInt16\",\n    \"getInt32\",\n    \"getInt8\",\n    \"getInternalformatParameter\",\n    \"getIntersectionList\",\n    \"getItem\",\n    \"getItems\",\n    \"getKey\",\n    \"getKeyframes\",\n    \"getLayers\",\n    \"getLayoutMap\",\n    \"getLineDash\",\n    \"getLocalCandidates\",\n    \"getLocalParameters\",\n    \"getLocalStreams\",\n    \"getMarks\",\n    \"getMatchedCSSRules\",\n    \"getMaxGCPauseSinceClear\",\n    \"getMeasures\",\n    \"getMetadata\",\n    \"getMilliseconds\",\n    \"getMinutes\",\n    \"getModifierState\",\n    \"getMonth\",\n    \"getNamedItem\",\n    \"getNamedItemNS\",\n    \"getNativeFramebufferScaleFactor\",\n    \"getNotifications\",\n    \"getNotifier\",\n    \"getNumberOfChars\",\n    \"getOffsetReferenceSpace\",\n    \"getOutputTimestamp\",\n    \"getOverrideHistoryNavigationMode\",\n    \"getOverrideStyle\",\n    \"getOwnPropertyDescriptor\",\n    \"getOwnPropertyDescriptors\",\n    \"getOwnPropertyNames\",\n    \"getOwnPropertySymbols\",\n    \"getParameter\",\n    \"getParameters\",\n    \"getParent\",\n    \"getPathSegAtLength\",\n    \"getPhotoCapabilities\",\n    \"getPhotoSettings\",\n    \"getPointAtLength\",\n    \"getPose\",\n    \"getPredictedEvents\",\n    \"getPreference\",\n    \"getPreferenceDefault\",\n    \"getPresentationAttribute\",\n    \"getPreventDefault\",\n    \"getPrimaryService\",\n    \"getPrimaryServices\",\n    \"getProgramInfoLog\",\n    \"getProgramParameter\",\n    \"getPropertyCSSValue\",\n    \"getPropertyPriority\",\n    \"getPropertyShorthand\",\n    \"getPropertyType\",\n    \"getPropertyValue\",\n    \"getPrototypeOf\",\n    \"getQuery\",\n    \"getQueryParameter\",\n    \"getRGBColorValue\",\n    \"getRandomValues\",\n    \"getRangeAt\",\n    \"getReader\",\n    \"getReceivers\",\n    \"getRectValue\",\n    \"getRegistration\",\n    \"getRegistrations\",\n    \"getRemoteCandidates\",\n    \"getRemoteCertificates\",\n    \"getRemoteParameters\",\n    \"getRemoteStreams\",\n    \"getRenderbufferParameter\",\n    \"getResponseHeader\",\n    \"getRoot\",\n    \"getRootNode\",\n    \"getRotationOfChar\",\n    \"getSVGDocument\",\n    \"getSamplerParameter\",\n    \"getScreenCTM\",\n    \"getSeconds\",\n    \"getSelectedCandidatePair\",\n    \"getSelection\",\n    \"getSenders\",\n    \"getService\",\n    \"getSettings\",\n    \"getShaderInfoLog\",\n    \"getShaderParameter\",\n    \"getShaderPrecisionFormat\",\n    \"getShaderSource\",\n    \"getSimpleDuration\",\n    \"getSiteIcons\",\n    \"getSources\",\n    \"getSpeculativeParserUrls\",\n    \"getStartPositionOfChar\",\n    \"getStartTime\",\n    \"getState\",\n    \"getStats\",\n    \"getStatusForPolicy\",\n    \"getStorageUpdates\",\n    \"getStreamById\",\n    \"getStringValue\",\n    \"getSubStringLength\",\n    \"getSubscription\",\n    \"getSupportedConstraints\",\n    \"getSupportedExtensions\",\n    \"getSupportedFormats\",\n    \"getSyncParameter\",\n    \"getSynchronizationSources\",\n    \"getTags\",\n    \"getTargetRanges\",\n    \"getTexParameter\",\n    \"getTime\",\n    \"getTimezoneOffset\",\n    \"getTiming\",\n    \"getTotalLength\",\n    \"getTrackById\",\n    \"getTracks\",\n    \"getTransceivers\",\n    \"getTransform\",\n    \"getTransformFeedbackVarying\",\n    \"getTransformToElement\",\n    \"getTransports\",\n    \"getType\",\n    \"getTypeMapping\",\n    \"getUTCDate\",\n    \"getUTCDay\",\n    \"getUTCFullYear\",\n    \"getUTCHours\",\n    \"getUTCMilliseconds\",\n    \"getUTCMinutes\",\n    \"getUTCMonth\",\n    \"getUTCSeconds\",\n    \"getUint16\",\n    \"getUint32\",\n    \"getUint8\",\n    \"getUniform\",\n    \"getUniformBlockIndex\",\n    \"getUniformIndices\",\n    \"getUniformLocation\",\n    \"getUserMedia\",\n    \"getVRDisplays\",\n    \"getValues\",\n    \"getVarDate\",\n    \"getVariableValue\",\n    \"getVertexAttrib\",\n    \"getVertexAttribOffset\",\n    \"getVideoPlaybackQuality\",\n    \"getVideoTracks\",\n    \"getViewerPose\",\n    \"getViewport\",\n    \"getVoices\",\n    \"getWakeLockState\",\n    \"getWriter\",\n    \"getYear\",\n    \"givenName\",\n    \"global\",\n    \"globalAlpha\",\n    \"globalCompositeOperation\",\n    \"globalThis\",\n    \"glyphOrientationHorizontal\",\n    \"glyphOrientationVertical\",\n    \"glyphRef\",\n    \"go\",\n    \"grabFrame\",\n    \"grad\",\n    \"gradientTransform\",\n    \"gradientUnits\",\n    \"grammars\",\n    \"green\",\n    \"grid\",\n    \"grid-area\",\n    \"grid-auto-columns\",\n    \"grid-auto-flow\",\n    \"grid-auto-rows\",\n    \"grid-column\",\n    \"grid-column-end\",\n    \"grid-column-gap\",\n    \"grid-column-start\",\n    \"grid-gap\",\n    \"grid-row\",\n    \"grid-row-end\",\n    \"grid-row-gap\",\n    \"grid-row-start\",\n    \"grid-template\",\n    \"grid-template-areas\",\n    \"grid-template-columns\",\n    \"grid-template-rows\",\n    \"gridArea\",\n    \"gridAutoColumns\",\n    \"gridAutoFlow\",\n    \"gridAutoRows\",\n    \"gridColumn\",\n    \"gridColumnEnd\",\n    \"gridColumnGap\",\n    \"gridColumnStart\",\n    \"gridGap\",\n    \"gridRow\",\n    \"gridRowEnd\",\n    \"gridRowGap\",\n    \"gridRowStart\",\n    \"gridTemplate\",\n    \"gridTemplateAreas\",\n    \"gridTemplateColumns\",\n    \"gridTemplateRows\",\n    \"gripSpace\",\n    \"group\",\n    \"groupCollapsed\",\n    \"groupEnd\",\n    \"groupId\",\n    \"hadRecentInput\",\n    \"hand\",\n    \"handedness\",\n    \"hapticActuators\",\n    \"hardwareConcurrency\",\n    \"has\",\n    \"hasAttribute\",\n    \"hasAttributeNS\",\n    \"hasAttributes\",\n    \"hasBeenActive\",\n    \"hasChildNodes\",\n    \"hasComposition\",\n    \"hasEnrolledInstrument\",\n    \"hasExtension\",\n    \"hasExternalDisplay\",\n    \"hasFeature\",\n    \"hasFocus\",\n    \"hasInstance\",\n    \"hasLayout\",\n    \"hasOrientation\",\n    \"hasOwnProperty\",\n    \"hasPointerCapture\",\n    \"hasPosition\",\n    \"hasReading\",\n    \"hasStorageAccess\",\n    \"hash\",\n    \"head\",\n    \"headers\",\n    \"heading\",\n    \"height\",\n    \"hidden\",\n    \"hide\",\n    \"hideFocus\",\n    \"high\",\n    \"highWaterMark\",\n    \"hint\",\n    \"history\",\n    \"honorificPrefix\",\n    \"honorificSuffix\",\n    \"horizontalOverflow\",\n    \"host\",\n    \"hostCandidate\",\n    \"hostname\",\n    \"href\",\n    \"hrefTranslate\",\n    \"hreflang\",\n    \"hspace\",\n    \"html5TagCheckInerface\",\n    \"htmlFor\",\n    \"htmlText\",\n    \"httpEquiv\",\n    \"httpRequestStatusCode\",\n    \"hwTimestamp\",\n    \"hyphens\",\n    \"hypot\",\n    \"iccId\",\n    \"iceConnectionState\",\n    \"iceGatheringState\",\n    \"iceTransport\",\n    \"icon\",\n    \"iconURL\",\n    \"id\",\n    \"identifier\",\n    \"identity\",\n    \"idpLoginUrl\",\n    \"ignoreBOM\",\n    \"ignoreCase\",\n    \"ignoreDepthValues\",\n    \"image-orientation\",\n    \"image-rendering\",\n    \"imageHeight\",\n    \"imageOrientation\",\n    \"imageRendering\",\n    \"imageSizes\",\n    \"imageSmoothingEnabled\",\n    \"imageSmoothingQuality\",\n    \"imageSrcset\",\n    \"imageWidth\",\n    \"images\",\n    \"ime-mode\",\n    \"imeMode\",\n    \"implementation\",\n    \"importKey\",\n    \"importNode\",\n    \"importStylesheet\",\n    \"imports\",\n    \"impp\",\n    \"imul\",\n    \"in\",\n    \"in1\",\n    \"in2\",\n    \"inBandMetadataTrackDispatchType\",\n    \"inRange\",\n    \"includes\",\n    \"incremental\",\n    \"indeterminate\",\n    \"index\",\n    \"indexNames\",\n    \"indexOf\",\n    \"indexedDB\",\n    \"indicate\",\n    \"inertiaDestinationX\",\n    \"inertiaDestinationY\",\n    \"info\",\n    \"init\",\n    \"initAnimationEvent\",\n    \"initBeforeLoadEvent\",\n    \"initClipboardEvent\",\n    \"initCloseEvent\",\n    \"initCommandEvent\",\n    \"initCompositionEvent\",\n    \"initCustomEvent\",\n    \"initData\",\n    \"initDataType\",\n    \"initDeviceMotionEvent\",\n    \"initDeviceOrientationEvent\",\n    \"initDragEvent\",\n    \"initErrorEvent\",\n    \"initEvent\",\n    \"initFocusEvent\",\n    \"initGestureEvent\",\n    \"initHashChangeEvent\",\n    \"initKeyEvent\",\n    \"initKeyboardEvent\",\n    \"initMSManipulationEvent\",\n    \"initMessageEvent\",\n    \"initMouseEvent\",\n    \"initMouseScrollEvent\",\n    \"initMouseWheelEvent\",\n    \"initMutationEvent\",\n    \"initNSMouseEvent\",\n    \"initOverflowEvent\",\n    \"initPageEvent\",\n    \"initPageTransitionEvent\",\n    \"initPointerEvent\",\n    \"initPopStateEvent\",\n    \"initProgressEvent\",\n    \"initScrollAreaEvent\",\n    \"initSimpleGestureEvent\",\n    \"initStorageEvent\",\n    \"initTextEvent\",\n    \"initTimeEvent\",\n    \"initTouchEvent\",\n    \"initTransitionEvent\",\n    \"initUIEvent\",\n    \"initWebKitAnimationEvent\",\n    \"initWebKitTransitionEvent\",\n    \"initWebKitWheelEvent\",\n    \"initWheelEvent\",\n    \"initialTime\",\n    \"initialize\",\n    \"initiatorType\",\n    \"inline-size\",\n    \"inlineSize\",\n    \"inlineVerticalFieldOfView\",\n    \"inner\",\n    \"innerHTML\",\n    \"innerHeight\",\n    \"innerText\",\n    \"innerWidth\",\n    \"input\",\n    \"inputBuffer\",\n    \"inputEncoding\",\n    \"inputMethod\",\n    \"inputMode\",\n    \"inputSource\",\n    \"inputSources\",\n    \"inputType\",\n    \"inputs\",\n    \"insertAdjacentElement\",\n    \"insertAdjacentHTML\",\n    \"insertAdjacentText\",\n    \"insertBefore\",\n    \"insertCell\",\n    \"insertDTMF\",\n    \"insertData\",\n    \"insertItemBefore\",\n    \"insertNode\",\n    \"insertRow\",\n    \"insertRule\",\n    \"inset\",\n    \"inset-block\",\n    \"inset-block-end\",\n    \"inset-block-start\",\n    \"inset-inline\",\n    \"inset-inline-end\",\n    \"inset-inline-start\",\n    \"insetBlock\",\n    \"insetBlockEnd\",\n    \"insetBlockStart\",\n    \"insetInline\",\n    \"insetInlineEnd\",\n    \"insetInlineStart\",\n    \"installing\",\n    \"instanceRoot\",\n    \"instantiate\",\n    \"instantiateStreaming\",\n    \"instruments\",\n    \"int16\",\n    \"int32\",\n    \"int8\",\n    \"integrity\",\n    \"interactionMode\",\n    \"intercept\",\n    \"interfaceClass\",\n    \"interfaceName\",\n    \"interfaceNumber\",\n    \"interfaceProtocol\",\n    \"interfaceSubclass\",\n    \"interfaces\",\n    \"interimResults\",\n    \"internalSubset\",\n    \"interpretation\",\n    \"intersectionRatio\",\n    \"intersectionRect\",\n    \"intersectsNode\",\n    \"interval\",\n    \"invalidIteratorState\",\n    \"invalidateFramebuffer\",\n    \"invalidateSubFramebuffer\",\n    \"inverse\",\n    \"invertSelf\",\n    \"is\",\n    \"is2D\",\n    \"isActive\",\n    \"isAlternate\",\n    \"isArray\",\n    \"isBingCurrentSearchDefault\",\n    \"isBuffer\",\n    \"isCandidateWindowVisible\",\n    \"isChar\",\n    \"isCollapsed\",\n    \"isComposing\",\n    \"isConcatSpreadable\",\n    \"isConnected\",\n    \"isContentEditable\",\n    \"isContentHandlerRegistered\",\n    \"isContextLost\",\n    \"isDefaultNamespace\",\n    \"isDirectory\",\n    \"isDisabled\",\n    \"isEnabled\",\n    \"isEqual\",\n    \"isEqualNode\",\n    \"isExtensible\",\n    \"isExternalCTAP2SecurityKeySupported\",\n    \"isFile\",\n    \"isFinite\",\n    \"isFramebuffer\",\n    \"isFrozen\",\n    \"isGenerator\",\n    \"isHTML\",\n    \"isHistoryNavigation\",\n    \"isId\",\n    \"isIdentity\",\n    \"isInjected\",\n    \"isInteger\",\n    \"isIntersecting\",\n    \"isLockFree\",\n    \"isMap\",\n    \"isMultiLine\",\n    \"isNaN\",\n    \"isOpen\",\n    \"isPointInFill\",\n    \"isPointInPath\",\n    \"isPointInRange\",\n    \"isPointInStroke\",\n    \"isPrefAlternate\",\n    \"isPresenting\",\n    \"isPrimary\",\n    \"isProgram\",\n    \"isPropertyImplicit\",\n    \"isProtocolHandlerRegistered\",\n    \"isPrototypeOf\",\n    \"isQuery\",\n    \"isRenderbuffer\",\n    \"isSafeInteger\",\n    \"isSameNode\",\n    \"isSampler\",\n    \"isScript\",\n    \"isScriptURL\",\n    \"isSealed\",\n    \"isSecureContext\",\n    \"isSessionSupported\",\n    \"isShader\",\n    \"isSupported\",\n    \"isSync\",\n    \"isTextEdit\",\n    \"isTexture\",\n    \"isTransformFeedback\",\n    \"isTrusted\",\n    \"isTypeSupported\",\n    \"isUserVerifyingPlatformAuthenticatorAvailable\",\n    \"isVertexArray\",\n    \"isView\",\n    \"isVisible\",\n    \"isochronousTransferIn\",\n    \"isochronousTransferOut\",\n    \"isolation\",\n    \"italics\",\n    \"item\",\n    \"itemId\",\n    \"itemProp\",\n    \"itemRef\",\n    \"itemScope\",\n    \"itemType\",\n    \"itemValue\",\n    \"items\",\n    \"iterateNext\",\n    \"iterationComposite\",\n    \"iterator\",\n    \"javaEnabled\",\n    \"jobTitle\",\n    \"join\",\n    \"json\",\n    \"justify-content\",\n    \"justify-items\",\n    \"justify-self\",\n    \"justifyContent\",\n    \"justifyItems\",\n    \"justifySelf\",\n    \"k1\",\n    \"k2\",\n    \"k3\",\n    \"k4\",\n    \"kHz\",\n    \"keepalive\",\n    \"kernelMatrix\",\n    \"kernelUnitLengthX\",\n    \"kernelUnitLengthY\",\n    \"kerning\",\n    \"key\",\n    \"keyCode\",\n    \"keyFor\",\n    \"keyIdentifier\",\n    \"keyLightEnabled\",\n    \"keyLocation\",\n    \"keyPath\",\n    \"keyStatuses\",\n    \"keySystem\",\n    \"keyText\",\n    \"keyUsage\",\n    \"keyboard\",\n    \"keys\",\n    \"keytype\",\n    \"kind\",\n    \"knee\",\n    \"label\",\n    \"labels\",\n    \"lang\",\n    \"language\",\n    \"languages\",\n    \"largeArcFlag\",\n    \"lastChild\",\n    \"lastElementChild\",\n    \"lastEventId\",\n    \"lastIndex\",\n    \"lastIndexOf\",\n    \"lastInputTime\",\n    \"lastMatch\",\n    \"lastMessageSubject\",\n    \"lastMessageType\",\n    \"lastModified\",\n    \"lastModifiedDate\",\n    \"lastPage\",\n    \"lastParen\",\n    \"lastState\",\n    \"lastStyleSheetSet\",\n    \"latitude\",\n    \"layerX\",\n    \"layerY\",\n    \"layoutFlow\",\n    \"layoutGrid\",\n    \"layoutGridChar\",\n    \"layoutGridLine\",\n    \"layoutGridMode\",\n    \"layoutGridType\",\n    \"lbound\",\n    \"left\",\n    \"leftContext\",\n    \"leftDegrees\",\n    \"leftMargin\",\n    \"leftProjectionMatrix\",\n    \"leftViewMatrix\",\n    \"length\",\n    \"lengthAdjust\",\n    \"lengthComputable\",\n    \"letter-spacing\",\n    \"letterSpacing\",\n    \"level\",\n    \"lighting-color\",\n    \"lightingColor\",\n    \"limitingConeAngle\",\n    \"line\",\n    \"line-break\",\n    \"line-height\",\n    \"lineAlign\",\n    \"lineBreak\",\n    \"lineCap\",\n    \"lineDashOffset\",\n    \"lineHeight\",\n    \"lineJoin\",\n    \"lineNumber\",\n    \"lineTo\",\n    \"lineWidth\",\n    \"linearAcceleration\",\n    \"linearRampToValueAtTime\",\n    \"linearVelocity\",\n    \"lineno\",\n    \"lines\",\n    \"link\",\n    \"linkColor\",\n    \"linkProgram\",\n    \"links\",\n    \"list\",\n    \"list-style\",\n    \"list-style-image\",\n    \"list-style-position\",\n    \"list-style-type\",\n    \"listStyle\",\n    \"listStyleImage\",\n    \"listStylePosition\",\n    \"listStyleType\",\n    \"listener\",\n    \"load\",\n    \"loadEventEnd\",\n    \"loadEventStart\",\n    \"loadTime\",\n    \"loadTimes\",\n    \"loaded\",\n    \"loading\",\n    \"localDescription\",\n    \"localName\",\n    \"localService\",\n    \"localStorage\",\n    \"locale\",\n    \"localeCompare\",\n    \"location\",\n    \"locationbar\",\n    \"lock\",\n    \"locked\",\n    \"lockedFile\",\n    \"locks\",\n    \"log\",\n    \"log10\",\n    \"log1p\",\n    \"log2\",\n    \"logicalXDPI\",\n    \"logicalYDPI\",\n    \"longDesc\",\n    \"longitude\",\n    \"lookupNamespaceURI\",\n    \"lookupPrefix\",\n    \"loop\",\n    \"loopEnd\",\n    \"loopStart\",\n    \"looping\",\n    \"low\",\n    \"lower\",\n    \"lowerBound\",\n    \"lowerOpen\",\n    \"lowsrc\",\n    \"m11\",\n    \"m12\",\n    \"m13\",\n    \"m14\",\n    \"m21\",\n    \"m22\",\n    \"m23\",\n    \"m24\",\n    \"m31\",\n    \"m32\",\n    \"m33\",\n    \"m34\",\n    \"m41\",\n    \"m42\",\n    \"m43\",\n    \"m44\",\n    \"makeXRCompatible\",\n    \"manifest\",\n    \"manufacturer\",\n    \"manufacturerName\",\n    \"map\",\n    \"mapping\",\n    \"margin\",\n    \"margin-block\",\n    \"margin-block-end\",\n    \"margin-block-start\",\n    \"margin-bottom\",\n    \"margin-inline\",\n    \"margin-inline-end\",\n    \"margin-inline-start\",\n    \"margin-left\",\n    \"margin-right\",\n    \"margin-top\",\n    \"marginBlock\",\n    \"marginBlockEnd\",\n    \"marginBlockStart\",\n    \"marginBottom\",\n    \"marginHeight\",\n    \"marginInline\",\n    \"marginInlineEnd\",\n    \"marginInlineStart\",\n    \"marginLeft\",\n    \"marginRight\",\n    \"marginTop\",\n    \"marginWidth\",\n    \"mark\",\n    \"marker\",\n    \"marker-end\",\n    \"marker-mid\",\n    \"marker-offset\",\n    \"marker-start\",\n    \"markerEnd\",\n    \"markerHeight\",\n    \"markerMid\",\n    \"markerOffset\",\n    \"markerStart\",\n    \"markerUnits\",\n    \"markerWidth\",\n    \"marks\",\n    \"mask\",\n    \"mask-clip\",\n    \"mask-composite\",\n    \"mask-image\",\n    \"mask-mode\",\n    \"mask-origin\",\n    \"mask-position\",\n    \"mask-position-x\",\n    \"mask-position-y\",\n    \"mask-repeat\",\n    \"mask-size\",\n    \"mask-type\",\n    \"maskClip\",\n    \"maskComposite\",\n    \"maskContentUnits\",\n    \"maskImage\",\n    \"maskMode\",\n    \"maskOrigin\",\n    \"maskPosition\",\n    \"maskPositionX\",\n    \"maskPositionY\",\n    \"maskRepeat\",\n    \"maskSize\",\n    \"maskType\",\n    \"maskUnits\",\n    \"match\",\n    \"matchAll\",\n    \"matchMedia\",\n    \"matchMedium\",\n    \"matches\",\n    \"matrix\",\n    \"matrixTransform\",\n    \"max\",\n    \"max-block-size\",\n    \"max-height\",\n    \"max-inline-size\",\n    \"max-width\",\n    \"maxActions\",\n    \"maxAlternatives\",\n    \"maxBlockSize\",\n    \"maxChannelCount\",\n    \"maxChannels\",\n    \"maxConnectionsPerServer\",\n    \"maxDecibels\",\n    \"maxDistance\",\n    \"maxHeight\",\n    \"maxInlineSize\",\n    \"maxLayers\",\n    \"maxLength\",\n    \"maxMessageSize\",\n    \"maxPacketLifeTime\",\n    \"maxRetransmits\",\n    \"maxTouchPoints\",\n    \"maxValue\",\n    \"maxWidth\",\n    \"measure\",\n    \"measureText\",\n    \"media\",\n    \"mediaCapabilities\",\n    \"mediaDevices\",\n    \"mediaElement\",\n    \"mediaGroup\",\n    \"mediaKeys\",\n    \"mediaSession\",\n    \"mediaStream\",\n    \"mediaText\",\n    \"meetOrSlice\",\n    \"memory\",\n    \"menubar\",\n    \"mergeAttributes\",\n    \"message\",\n    \"messageClass\",\n    \"messageHandlers\",\n    \"messageType\",\n    \"metaKey\",\n    \"metadata\",\n    \"method\",\n    \"methodDetails\",\n    \"methodName\",\n    \"mid\",\n    \"mimeType\",\n    \"mimeTypes\",\n    \"min\",\n    \"min-block-size\",\n    \"min-height\",\n    \"min-inline-size\",\n    \"min-width\",\n    \"minBlockSize\",\n    \"minDecibels\",\n    \"minHeight\",\n    \"minInlineSize\",\n    \"minLength\",\n    \"minValue\",\n    \"minWidth\",\n    \"miterLimit\",\n    \"mix-blend-mode\",\n    \"mixBlendMode\",\n    \"mm\",\n    \"mobile\",\n    \"mode\",\n    \"model\",\n    \"modify\",\n    \"mount\",\n    \"move\",\n    \"moveBy\",\n    \"moveEnd\",\n    \"moveFirst\",\n    \"moveFocusDown\",\n    \"moveFocusLeft\",\n    \"moveFocusRight\",\n    \"moveFocusUp\",\n    \"moveNext\",\n    \"moveRow\",\n    \"moveStart\",\n    \"moveTo\",\n    \"moveToBookmark\",\n    \"moveToElementText\",\n    \"moveToPoint\",\n    \"movementX\",\n    \"movementY\",\n    \"mozAdd\",\n    \"mozAnimationStartTime\",\n    \"mozAnon\",\n    \"mozApps\",\n    \"mozAudioCaptured\",\n    \"mozAudioChannelType\",\n    \"mozAutoplayEnabled\",\n    \"mozCancelAnimationFrame\",\n    \"mozCancelFullScreen\",\n    \"mozCancelRequestAnimationFrame\",\n    \"mozCaptureStream\",\n    \"mozCaptureStreamUntilEnded\",\n    \"mozClearDataAt\",\n    \"mozContact\",\n    \"mozContacts\",\n    \"mozCreateFileHandle\",\n    \"mozCurrentTransform\",\n    \"mozCurrentTransformInverse\",\n    \"mozCursor\",\n    \"mozDash\",\n    \"mozDashOffset\",\n    \"mozDecodedFrames\",\n    \"mozExitPointerLock\",\n    \"mozFillRule\",\n    \"mozFragmentEnd\",\n    \"mozFrameDelay\",\n    \"mozFullScreen\",\n    \"mozFullScreenElement\",\n    \"mozFullScreenEnabled\",\n    \"mozGetAll\",\n    \"mozGetAllKeys\",\n    \"mozGetAsFile\",\n    \"mozGetDataAt\",\n    \"mozGetMetadata\",\n    \"mozGetUserMedia\",\n    \"mozHasAudio\",\n    \"mozHasItem\",\n    \"mozHidden\",\n    \"mozImageSmoothingEnabled\",\n    \"mozIndexedDB\",\n    \"mozInnerScreenX\",\n    \"mozInnerScreenY\",\n    \"mozInputSource\",\n    \"mozIsTextField\",\n    \"mozItem\",\n    \"mozItemCount\",\n    \"mozItems\",\n    \"mozLength\",\n    \"mozLockOrientation\",\n    \"mozMatchesSelector\",\n    \"mozMovementX\",\n    \"mozMovementY\",\n    \"mozOpaque\",\n    \"mozOrientation\",\n    \"mozPaintCount\",\n    \"mozPaintedFrames\",\n    \"mozParsedFrames\",\n    \"mozPay\",\n    \"mozPointerLockElement\",\n    \"mozPresentedFrames\",\n    \"mozPreservesPitch\",\n    \"mozPressure\",\n    \"mozPrintCallback\",\n    \"mozRTCIceCandidate\",\n    \"mozRTCPeerConnection\",\n    \"mozRTCSessionDescription\",\n    \"mozRemove\",\n    \"mozRequestAnimationFrame\",\n    \"mozRequestFullScreen\",\n    \"mozRequestPointerLock\",\n    \"mozSetDataAt\",\n    \"mozSetImageElement\",\n    \"mozSourceNode\",\n    \"mozSrcObject\",\n    \"mozSystem\",\n    \"mozTCPSocket\",\n    \"mozTextStyle\",\n    \"mozTypesAt\",\n    \"mozUnlockOrientation\",\n    \"mozUserCancelled\",\n    \"mozVisibilityState\",\n    \"ms\",\n    \"msAnimation\",\n    \"msAnimationDelay\",\n    \"msAnimationDirection\",\n    \"msAnimationDuration\",\n    \"msAnimationFillMode\",\n    \"msAnimationIterationCount\",\n    \"msAnimationName\",\n    \"msAnimationPlayState\",\n    \"msAnimationStartTime\",\n    \"msAnimationTimingFunction\",\n    \"msBackfaceVisibility\",\n    \"msBlockProgression\",\n    \"msCSSOMElementFloatMetrics\",\n    \"msCaching\",\n    \"msCachingEnabled\",\n    \"msCancelRequestAnimationFrame\",\n    \"msCapsLockWarningOff\",\n    \"msClearImmediate\",\n    \"msClose\",\n    \"msContentZoomChaining\",\n    \"msContentZoomFactor\",\n    \"msContentZoomLimit\",\n    \"msContentZoomLimitMax\",\n    \"msContentZoomLimitMin\",\n    \"msContentZoomSnap\",\n    \"msContentZoomSnapPoints\",\n    \"msContentZoomSnapType\",\n    \"msContentZooming\",\n    \"msConvertURL\",\n    \"msCrypto\",\n    \"msDoNotTrack\",\n    \"msElementsFromPoint\",\n    \"msElementsFromRect\",\n    \"msExitFullscreen\",\n    \"msExtendedCode\",\n    \"msFillRule\",\n    \"msFirstPaint\",\n    \"msFlex\",\n    \"msFlexAlign\",\n    \"msFlexDirection\",\n    \"msFlexFlow\",\n    \"msFlexItemAlign\",\n    \"msFlexLinePack\",\n    \"msFlexNegative\",\n    \"msFlexOrder\",\n    \"msFlexPack\",\n    \"msFlexPositive\",\n    \"msFlexPreferredSize\",\n    \"msFlexWrap\",\n    \"msFlowFrom\",\n    \"msFlowInto\",\n    \"msFontFeatureSettings\",\n    \"msFullscreenElement\",\n    \"msFullscreenEnabled\",\n    \"msGetInputContext\",\n    \"msGetRegionContent\",\n    \"msGetUntransformedBounds\",\n    \"msGraphicsTrustStatus\",\n    \"msGridColumn\",\n    \"msGridColumnAlign\",\n    \"msGridColumnSpan\",\n    \"msGridColumns\",\n    \"msGridRow\",\n    \"msGridRowAlign\",\n    \"msGridRowSpan\",\n    \"msGridRows\",\n    \"msHidden\",\n    \"msHighContrastAdjust\",\n    \"msHyphenateLimitChars\",\n    \"msHyphenateLimitLines\",\n    \"msHyphenateLimitZone\",\n    \"msHyphens\",\n    \"msImageSmoothingEnabled\",\n    \"msImeAlign\",\n    \"msIndexedDB\",\n    \"msInterpolationMode\",\n    \"msIsStaticHTML\",\n    \"msKeySystem\",\n    \"msKeys\",\n    \"msLaunchUri\",\n    \"msLockOrientation\",\n    \"msManipulationViewsEnabled\",\n    \"msMatchMedia\",\n    \"msMatchesSelector\",\n    \"msMaxTouchPoints\",\n    \"msOrientation\",\n    \"msOverflowStyle\",\n    \"msPerspective\",\n    \"msPerspectiveOrigin\",\n    \"msPlayToDisabled\",\n    \"msPlayToPreferredSourceUri\",\n    \"msPlayToPrimary\",\n    \"msPointerEnabled\",\n    \"msRegionOverflow\",\n    \"msReleasePointerCapture\",\n    \"msRequestAnimationFrame\",\n    \"msRequestFullscreen\",\n    \"msSaveBlob\",\n    \"msSaveOrOpenBlob\",\n    \"msScrollChaining\",\n    \"msScrollLimit\",\n    \"msScrollLimitXMax\",\n    \"msScrollLimitXMin\",\n    \"msScrollLimitYMax\",\n    \"msScrollLimitYMin\",\n    \"msScrollRails\",\n    \"msScrollSnapPointsX\",\n    \"msScrollSnapPointsY\",\n    \"msScrollSnapType\",\n    \"msScrollSnapX\",\n    \"msScrollSnapY\",\n    \"msScrollTranslation\",\n    \"msSetImmediate\",\n    \"msSetMediaKeys\",\n    \"msSetPointerCapture\",\n    \"msTextCombineHorizontal\",\n    \"msTextSizeAdjust\",\n    \"msToBlob\",\n    \"msTouchAction\",\n    \"msTouchSelect\",\n    \"msTraceAsyncCallbackCompleted\",\n    \"msTraceAsyncCallbackStarting\",\n    \"msTraceAsyncOperationCompleted\",\n    \"msTraceAsyncOperationStarting\",\n    \"msTransform\",\n    \"msTransformOrigin\",\n    \"msTransformStyle\",\n    \"msTransition\",\n    \"msTransitionDelay\",\n    \"msTransitionDuration\",\n    \"msTransitionProperty\",\n    \"msTransitionTimingFunction\",\n    \"msUnlockOrientation\",\n    \"msUpdateAsyncCallbackRelation\",\n    \"msUserSelect\",\n    \"msVisibilityState\",\n    \"msWrapFlow\",\n    \"msWrapMargin\",\n    \"msWrapThrough\",\n    \"msWriteProfilerMark\",\n    \"msZoom\",\n    \"msZoomTo\",\n    \"mt\",\n    \"mul\",\n    \"multiEntry\",\n    \"multiSelectionObj\",\n    \"multiline\",\n    \"multiple\",\n    \"multiply\",\n    \"multiplySelf\",\n    \"mutableFile\",\n    \"muted\",\n    \"n\",\n    \"name\",\n    \"nameProp\",\n    \"namedItem\",\n    \"namedRecordset\",\n    \"names\",\n    \"namespaceURI\",\n    \"namespaces\",\n    \"naturalHeight\",\n    \"naturalWidth\",\n    \"navigate\",\n    \"navigation\",\n    \"navigationMode\",\n    \"navigationPreload\",\n    \"navigationStart\",\n    \"navigator\",\n    \"near\",\n    \"nearestViewportElement\",\n    \"negative\",\n    \"negotiated\",\n    \"netscape\",\n    \"networkState\",\n    \"newScale\",\n    \"newTranslate\",\n    \"newURL\",\n    \"newValue\",\n    \"newValueSpecifiedUnits\",\n    \"newVersion\",\n    \"newhome\",\n    \"next\",\n    \"nextElementSibling\",\n    \"nextHopProtocol\",\n    \"nextNode\",\n    \"nextPage\",\n    \"nextSibling\",\n    \"nickname\",\n    \"noHref\",\n    \"noModule\",\n    \"noResize\",\n    \"noShade\",\n    \"noValidate\",\n    \"noWrap\",\n    \"node\",\n    \"nodeName\",\n    \"nodeType\",\n    \"nodeValue\",\n    \"nonce\",\n    \"normalize\",\n    \"normalizedPathSegList\",\n    \"notationName\",\n    \"notations\",\n    \"note\",\n    \"noteGrainOn\",\n    \"noteOff\",\n    \"noteOn\",\n    \"notify\",\n    \"now\",\n    \"numOctaves\",\n    \"number\",\n    \"numberOfChannels\",\n    \"numberOfInputs\",\n    \"numberOfItems\",\n    \"numberOfOutputs\",\n    \"numberValue\",\n    \"oMatchesSelector\",\n    \"object\",\n    \"object-fit\",\n    \"object-position\",\n    \"objectFit\",\n    \"objectPosition\",\n    \"objectStore\",\n    \"objectStoreNames\",\n    \"objectType\",\n    \"observe\",\n    \"of\",\n    \"offscreenBuffering\",\n    \"offset\",\n    \"offset-anchor\",\n    \"offset-distance\",\n    \"offset-path\",\n    \"offset-rotate\",\n    \"offsetAnchor\",\n    \"offsetDistance\",\n    \"offsetHeight\",\n    \"offsetLeft\",\n    \"offsetNode\",\n    \"offsetParent\",\n    \"offsetPath\",\n    \"offsetRotate\",\n    \"offsetTop\",\n    \"offsetWidth\",\n    \"offsetX\",\n    \"offsetY\",\n    \"ok\",\n    \"oldURL\",\n    \"oldValue\",\n    \"oldVersion\",\n    \"olderShadowRoot\",\n    \"onLine\",\n    \"onabort\",\n    \"onabsolutedeviceorientation\",\n    \"onactivate\",\n    \"onactive\",\n    \"onaddsourcebuffer\",\n    \"onaddstream\",\n    \"onaddtrack\",\n    \"onafterprint\",\n    \"onafterscriptexecute\",\n    \"onafterupdate\",\n    \"onanimationcancel\",\n    \"onanimationend\",\n    \"onanimationiteration\",\n    \"onanimationstart\",\n    \"onappinstalled\",\n    \"onaudioend\",\n    \"onaudioprocess\",\n    \"onaudiostart\",\n    \"onautocomplete\",\n    \"onautocompleteerror\",\n    \"onauxclick\",\n    \"onbeforeactivate\",\n    \"onbeforecopy\",\n    \"onbeforecut\",\n    \"onbeforedeactivate\",\n    \"onbeforeeditfocus\",\n    \"onbeforeinstallprompt\",\n    \"onbeforepaste\",\n    \"onbeforeprint\",\n    \"onbeforescriptexecute\",\n    \"onbeforeunload\",\n    \"onbeforeupdate\",\n    \"onbeforexrselect\",\n    \"onbegin\",\n    \"onblocked\",\n    \"onblur\",\n    \"onbounce\",\n    \"onboundary\",\n    \"onbufferedamountlow\",\n    \"oncached\",\n    \"oncancel\",\n    \"oncandidatewindowhide\",\n    \"oncandidatewindowshow\",\n    \"oncandidatewindowupdate\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"once\",\n    \"oncellchange\",\n    \"onchange\",\n    \"oncharacteristicvaluechanged\",\n    \"onchargingchange\",\n    \"onchargingtimechange\",\n    \"onchecking\",\n    \"onclick\",\n    \"onclose\",\n    \"onclosing\",\n    \"oncompassneedscalibration\",\n    \"oncomplete\",\n    \"onconnect\",\n    \"onconnecting\",\n    \"onconnectionavailable\",\n    \"onconnectionstatechange\",\n    \"oncontextmenu\",\n    \"oncontrollerchange\",\n    \"oncontrolselect\",\n    \"oncopy\",\n    \"oncuechange\",\n    \"oncut\",\n    \"ondataavailable\",\n    \"ondatachannel\",\n    \"ondatasetchanged\",\n    \"ondatasetcomplete\",\n    \"ondblclick\",\n    \"ondeactivate\",\n    \"ondevicechange\",\n    \"ondevicelight\",\n    \"ondevicemotion\",\n    \"ondeviceorientation\",\n    \"ondeviceorientationabsolute\",\n    \"ondeviceproximity\",\n    \"ondischargingtimechange\",\n    \"ondisconnect\",\n    \"ondisplay\",\n    \"ondownloading\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragexit\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onencrypted\",\n    \"onend\",\n    \"onended\",\n    \"onenter\",\n    \"onenterpictureinpicture\",\n    \"onerror\",\n    \"onerrorupdate\",\n    \"onexit\",\n    \"onfilterchange\",\n    \"onfinish\",\n    \"onfocus\",\n    \"onfocusin\",\n    \"onfocusout\",\n    \"onformdata\",\n    \"onfreeze\",\n    \"onfullscreenchange\",\n    \"onfullscreenerror\",\n    \"ongatheringstatechange\",\n    \"ongattserverdisconnected\",\n    \"ongesturechange\",\n    \"ongestureend\",\n    \"ongesturestart\",\n    \"ongotpointercapture\",\n    \"onhashchange\",\n    \"onhelp\",\n    \"onicecandidate\",\n    \"onicecandidateerror\",\n    \"oniceconnectionstatechange\",\n    \"onicegatheringstatechange\",\n    \"oninactive\",\n    \"oninput\",\n    \"oninputsourceschange\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeystatuseschange\",\n    \"onkeyup\",\n    \"onlanguagechange\",\n    \"onlayoutcomplete\",\n    \"onleavepictureinpicture\",\n    \"onlevelchange\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadend\",\n    \"onloading\",\n    \"onloadingdone\",\n    \"onloadingerror\",\n    \"onloadstart\",\n    \"onlosecapture\",\n    \"onlostpointercapture\",\n    \"only\",\n    \"onmark\",\n    \"onmessage\",\n    \"onmessageerror\",\n    \"onmidimessage\",\n    \"onmousedown\",\n    \"onmouseenter\",\n    \"onmouseleave\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onmove\",\n    \"onmoveend\",\n    \"onmovestart\",\n    \"onmozfullscreenchange\",\n    \"onmozfullscreenerror\",\n    \"onmozorientationchange\",\n    \"onmozpointerlockchange\",\n    \"onmozpointerlockerror\",\n    \"onmscontentzoom\",\n    \"onmsfullscreenchange\",\n    \"onmsfullscreenerror\",\n    \"onmsgesturechange\",\n    \"onmsgesturedoubletap\",\n    \"onmsgestureend\",\n    \"onmsgesturehold\",\n    \"onmsgesturestart\",\n    \"onmsgesturetap\",\n    \"onmsgotpointercapture\",\n    \"onmsinertiastart\",\n    \"onmslostpointercapture\",\n    \"onmsmanipulationstatechanged\",\n    \"onmsneedkey\",\n    \"onmsorientationchange\",\n    \"onmspointercancel\",\n    \"onmspointerdown\",\n    \"onmspointerenter\",\n    \"onmspointerhover\",\n    \"onmspointerleave\",\n    \"onmspointermove\",\n    \"onmspointerout\",\n    \"onmspointerover\",\n    \"onmspointerup\",\n    \"onmssitemodejumplistitemremoved\",\n    \"onmsthumbnailclick\",\n    \"onmute\",\n    \"onnegotiationneeded\",\n    \"onnomatch\",\n    \"onnoupdate\",\n    \"onobsolete\",\n    \"onoffline\",\n    \"ononline\",\n    \"onopen\",\n    \"onorientationchange\",\n    \"onpagechange\",\n    \"onpagehide\",\n    \"onpageshow\",\n    \"onpaste\",\n    \"onpause\",\n    \"onpayerdetailchange\",\n    \"onpaymentmethodchange\",\n    \"onplay\",\n    \"onplaying\",\n    \"onpluginstreamstart\",\n    \"onpointercancel\",\n    \"onpointerdown\",\n    \"onpointerenter\",\n    \"onpointerleave\",\n    \"onpointerlockchange\",\n    \"onpointerlockerror\",\n    \"onpointermove\",\n    \"onpointerout\",\n    \"onpointerover\",\n    \"onpointerrawupdate\",\n    \"onpointerup\",\n    \"onpopstate\",\n    \"onprocessorerror\",\n    \"onprogress\",\n    \"onpropertychange\",\n    \"onratechange\",\n    \"onreading\",\n    \"onreadystatechange\",\n    \"onrejectionhandled\",\n    \"onrelease\",\n    \"onremove\",\n    \"onremovesourcebuffer\",\n    \"onremovestream\",\n    \"onremovetrack\",\n    \"onrepeat\",\n    \"onreset\",\n    \"onresize\",\n    \"onresizeend\",\n    \"onresizestart\",\n    \"onresourcetimingbufferfull\",\n    \"onresult\",\n    \"onresume\",\n    \"onrowenter\",\n    \"onrowexit\",\n    \"onrowsdelete\",\n    \"onrowsinserted\",\n    \"onscroll\",\n    \"onsearch\",\n    \"onsecuritypolicyviolation\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onselectedcandidatepairchange\",\n    \"onselectend\",\n    \"onselectionchange\",\n    \"onselectstart\",\n    \"onshippingaddresschange\",\n    \"onshippingoptionchange\",\n    \"onshow\",\n    \"onsignalingstatechange\",\n    \"onsoundend\",\n    \"onsoundstart\",\n    \"onsourceclose\",\n    \"onsourceclosed\",\n    \"onsourceended\",\n    \"onsourceopen\",\n    \"onspeechend\",\n    \"onspeechstart\",\n    \"onsqueeze\",\n    \"onsqueezeend\",\n    \"onsqueezestart\",\n    \"onstalled\",\n    \"onstart\",\n    \"onstatechange\",\n    \"onstop\",\n    \"onstorage\",\n    \"onstoragecommit\",\n    \"onsubmit\",\n    \"onsuccess\",\n    \"onsuspend\",\n    \"onterminate\",\n    \"ontextinput\",\n    \"ontimeout\",\n    \"ontimeupdate\",\n    \"ontoggle\",\n    \"ontonechange\",\n    \"ontouchcancel\",\n    \"ontouchend\",\n    \"ontouchmove\",\n    \"ontouchstart\",\n    \"ontrack\",\n    \"ontransitioncancel\",\n    \"ontransitionend\",\n    \"ontransitionrun\",\n    \"ontransitionstart\",\n    \"onunhandledrejection\",\n    \"onunload\",\n    \"onunmute\",\n    \"onupdate\",\n    \"onupdateend\",\n    \"onupdatefound\",\n    \"onupdateready\",\n    \"onupdatestart\",\n    \"onupgradeneeded\",\n    \"onuserproximity\",\n    \"onversionchange\",\n    \"onvisibilitychange\",\n    \"onvoiceschanged\",\n    \"onvolumechange\",\n    \"onvrdisplayactivate\",\n    \"onvrdisplayconnect\",\n    \"onvrdisplaydeactivate\",\n    \"onvrdisplaydisconnect\",\n    \"onvrdisplaypresentchange\",\n    \"onwaiting\",\n    \"onwaitingforkey\",\n    \"onwarning\",\n    \"onwebkitanimationend\",\n    \"onwebkitanimationiteration\",\n    \"onwebkitanimationstart\",\n    \"onwebkitcurrentplaybacktargetiswirelesschanged\",\n    \"onwebkitfullscreenchange\",\n    \"onwebkitfullscreenerror\",\n    \"onwebkitkeyadded\",\n    \"onwebkitkeyerror\",\n    \"onwebkitkeymessage\",\n    \"onwebkitneedkey\",\n    \"onwebkitorientationchange\",\n    \"onwebkitplaybacktargetavailabilitychanged\",\n    \"onwebkitpointerlockchange\",\n    \"onwebkitpointerlockerror\",\n    \"onwebkitresourcetimingbufferfull\",\n    \"onwebkittransitionend\",\n    \"onwheel\",\n    \"onzoom\",\n    \"opacity\",\n    \"open\",\n    \"openCursor\",\n    \"openDatabase\",\n    \"openKeyCursor\",\n    \"opened\",\n    \"opener\",\n    \"opera\",\n    \"operationType\",\n    \"operator\",\n    \"opr\",\n    \"optimum\",\n    \"options\",\n    \"or\",\n    \"order\",\n    \"orderX\",\n    \"orderY\",\n    \"ordered\",\n    \"org\",\n    \"organization\",\n    \"orient\",\n    \"orientAngle\",\n    \"orientType\",\n    \"orientation\",\n    \"orientationX\",\n    \"orientationY\",\n    \"orientationZ\",\n    \"origin\",\n    \"originalPolicy\",\n    \"originalTarget\",\n    \"orphans\",\n    \"oscpu\",\n    \"outerHTML\",\n    \"outerHeight\",\n    \"outerText\",\n    \"outerWidth\",\n    \"outline\",\n    \"outline-color\",\n    \"outline-offset\",\n    \"outline-style\",\n    \"outline-width\",\n    \"outlineColor\",\n    \"outlineOffset\",\n    \"outlineStyle\",\n    \"outlineWidth\",\n    \"outputBuffer\",\n    \"outputChannelCount\",\n    \"outputLatency\",\n    \"outputs\",\n    \"overflow\",\n    \"overflow-anchor\",\n    \"overflow-block\",\n    \"overflow-inline\",\n    \"overflow-wrap\",\n    \"overflow-x\",\n    \"overflow-y\",\n    \"overflowAnchor\",\n    \"overflowBlock\",\n    \"overflowInline\",\n    \"overflowWrap\",\n    \"overflowX\",\n    \"overflowY\",\n    \"overrideMimeType\",\n    \"oversample\",\n    \"overscroll-behavior\",\n    \"overscroll-behavior-block\",\n    \"overscroll-behavior-inline\",\n    \"overscroll-behavior-x\",\n    \"overscroll-behavior-y\",\n    \"overscrollBehavior\",\n    \"overscrollBehaviorBlock\",\n    \"overscrollBehaviorInline\",\n    \"overscrollBehaviorX\",\n    \"overscrollBehaviorY\",\n    \"ownKeys\",\n    \"ownerDocument\",\n    \"ownerElement\",\n    \"ownerNode\",\n    \"ownerRule\",\n    \"ownerSVGElement\",\n    \"owningElement\",\n    \"p1\",\n    \"p2\",\n    \"p3\",\n    \"p4\",\n    \"packetSize\",\n    \"packets\",\n    \"pad\",\n    \"padEnd\",\n    \"padStart\",\n    \"padding\",\n    \"padding-block\",\n    \"padding-block-end\",\n    \"padding-block-start\",\n    \"padding-bottom\",\n    \"padding-inline\",\n    \"padding-inline-end\",\n    \"padding-inline-start\",\n    \"padding-left\",\n    \"padding-right\",\n    \"padding-top\",\n    \"paddingBlock\",\n    \"paddingBlockEnd\",\n    \"paddingBlockStart\",\n    \"paddingBottom\",\n    \"paddingInline\",\n    \"paddingInlineEnd\",\n    \"paddingInlineStart\",\n    \"paddingLeft\",\n    \"paddingRight\",\n    \"paddingTop\",\n    \"page\",\n    \"page-break-after\",\n    \"page-break-before\",\n    \"page-break-inside\",\n    \"pageBreakAfter\",\n    \"pageBreakBefore\",\n    \"pageBreakInside\",\n    \"pageCount\",\n    \"pageLeft\",\n    \"pageTop\",\n    \"pageX\",\n    \"pageXOffset\",\n    \"pageY\",\n    \"pageYOffset\",\n    \"pages\",\n    \"paint-order\",\n    \"paintOrder\",\n    \"paintRequests\",\n    \"paintType\",\n    \"paintWorklet\",\n    \"palette\",\n    \"pan\",\n    \"panningModel\",\n    \"parameterData\",\n    \"parameters\",\n    \"parent\",\n    \"parentElement\",\n    \"parentNode\",\n    \"parentRule\",\n    \"parentStyleSheet\",\n    \"parentTextEdit\",\n    \"parentWindow\",\n    \"parse\",\n    \"parseAll\",\n    \"parseFloat\",\n    \"parseFromString\",\n    \"parseInt\",\n    \"part\",\n    \"participants\",\n    \"passive\",\n    \"password\",\n    \"pasteHTML\",\n    \"path\",\n    \"pathLength\",\n    \"pathSegList\",\n    \"pathSegType\",\n    \"pathSegTypeAsLetter\",\n    \"pathname\",\n    \"pattern\",\n    \"patternContentUnits\",\n    \"patternMismatch\",\n    \"patternTransform\",\n    \"patternUnits\",\n    \"pause\",\n    \"pauseAnimations\",\n    \"pauseOnExit\",\n    \"pauseProfilers\",\n    \"pauseTransformFeedback\",\n    \"paused\",\n    \"payerEmail\",\n    \"payerName\",\n    \"payerPhone\",\n    \"paymentManager\",\n    \"pc\",\n    \"peerIdentity\",\n    \"pending\",\n    \"pendingLocalDescription\",\n    \"pendingRemoteDescription\",\n    \"percent\",\n    \"performance\",\n    \"periodicSync\",\n    \"permission\",\n    \"permissionState\",\n    \"permissions\",\n    \"persist\",\n    \"persisted\",\n    \"personalbar\",\n    \"perspective\",\n    \"perspective-origin\",\n    \"perspectiveOrigin\",\n    \"phone\",\n    \"phoneticFamilyName\",\n    \"phoneticGivenName\",\n    \"photo\",\n    \"pictureInPictureElement\",\n    \"pictureInPictureEnabled\",\n    \"pictureInPictureWindow\",\n    \"ping\",\n    \"pipeThrough\",\n    \"pipeTo\",\n    \"pitch\",\n    \"pixelBottom\",\n    \"pixelDepth\",\n    \"pixelHeight\",\n    \"pixelLeft\",\n    \"pixelRight\",\n    \"pixelStorei\",\n    \"pixelTop\",\n    \"pixelUnitToMillimeterX\",\n    \"pixelUnitToMillimeterY\",\n    \"pixelWidth\",\n    \"place-content\",\n    \"place-items\",\n    \"place-self\",\n    \"placeContent\",\n    \"placeItems\",\n    \"placeSelf\",\n    \"placeholder\",\n    \"platformVersion\",\n    \"platform\",\n    \"platforms\",\n    \"play\",\n    \"playEffect\",\n    \"playState\",\n    \"playbackRate\",\n    \"playbackState\",\n    \"playbackTime\",\n    \"played\",\n    \"playoutDelayHint\",\n    \"playsInline\",\n    \"plugins\",\n    \"pluginspage\",\n    \"pname\",\n    \"pointer-events\",\n    \"pointerBeforeReferenceNode\",\n    \"pointerEnabled\",\n    \"pointerEvents\",\n    \"pointerId\",\n    \"pointerLockElement\",\n    \"pointerType\",\n    \"points\",\n    \"pointsAtX\",\n    \"pointsAtY\",\n    \"pointsAtZ\",\n    \"polygonOffset\",\n    \"pop\",\n    \"populateMatrix\",\n    \"popupWindowFeatures\",\n    \"popupWindowName\",\n    \"popupWindowURI\",\n    \"port\",\n    \"port1\",\n    \"port2\",\n    \"ports\",\n    \"posBottom\",\n    \"posHeight\",\n    \"posLeft\",\n    \"posRight\",\n    \"posTop\",\n    \"posWidth\",\n    \"pose\",\n    \"position\",\n    \"positionAlign\",\n    \"positionX\",\n    \"positionY\",\n    \"positionZ\",\n    \"postError\",\n    \"postMessage\",\n    \"postalCode\",\n    \"poster\",\n    \"pow\",\n    \"powerEfficient\",\n    \"powerOff\",\n    \"preMultiplySelf\",\n    \"precision\",\n    \"preferredStyleSheetSet\",\n    \"preferredStylesheetSet\",\n    \"prefix\",\n    \"preload\",\n    \"prepend\",\n    \"presentation\",\n    \"preserveAlpha\",\n    \"preserveAspectRatio\",\n    \"preserveAspectRatioString\",\n    \"pressed\",\n    \"pressure\",\n    \"prevValue\",\n    \"preventDefault\",\n    \"preventExtensions\",\n    \"preventSilentAccess\",\n    \"previousElementSibling\",\n    \"previousNode\",\n    \"previousPage\",\n    \"previousRect\",\n    \"previousScale\",\n    \"previousSibling\",\n    \"previousTranslate\",\n    \"primaryKey\",\n    \"primitiveType\",\n    \"primitiveUnits\",\n    \"principals\",\n    \"print\",\n    \"priority\",\n    \"privateKey\",\n    \"probablySupportsContext\",\n    \"process\",\n    \"processIceMessage\",\n    \"processingEnd\",\n    \"processingStart\",\n    \"processorOptions\",\n    \"product\",\n    \"productId\",\n    \"productName\",\n    \"productSub\",\n    \"profile\",\n    \"profileEnd\",\n    \"profiles\",\n    \"projectionMatrix\",\n    \"promise\",\n    \"prompt\",\n    \"properties\",\n    \"propertyIsEnumerable\",\n    \"propertyName\",\n    \"protocol\",\n    \"protocolLong\",\n    \"prototype\",\n    \"provider\",\n    \"pseudoClass\",\n    \"pseudoElement\",\n    \"pt\",\n    \"publicId\",\n    \"publicKey\",\n    \"published\",\n    \"pulse\",\n    \"push\",\n    \"pushManager\",\n    \"pushNotification\",\n    \"pushState\",\n    \"put\",\n    \"putImageData\",\n    \"px\",\n    \"quadraticCurveTo\",\n    \"qualifier\",\n    \"quaternion\",\n    \"query\",\n    \"queryCommandEnabled\",\n    \"queryCommandIndeterm\",\n    \"queryCommandState\",\n    \"queryCommandSupported\",\n    \"queryCommandText\",\n    \"queryCommandValue\",\n    \"querySelector\",\n    \"querySelectorAll\",\n    \"queueMicrotask\",\n    \"quote\",\n    \"quotes\",\n    \"r\",\n    \"r1\",\n    \"r2\",\n    \"race\",\n    \"rad\",\n    \"radiogroup\",\n    \"radiusX\",\n    \"radiusY\",\n    \"random\",\n    \"range\",\n    \"rangeCount\",\n    \"rangeMax\",\n    \"rangeMin\",\n    \"rangeOffset\",\n    \"rangeOverflow\",\n    \"rangeParent\",\n    \"rangeUnderflow\",\n    \"rate\",\n    \"ratio\",\n    \"raw\",\n    \"rawId\",\n    \"read\",\n    \"readAsArrayBuffer\",\n    \"readAsBinaryString\",\n    \"readAsBlob\",\n    \"readAsDataURL\",\n    \"readAsText\",\n    \"readBuffer\",\n    \"readEntries\",\n    \"readOnly\",\n    \"readPixels\",\n    \"readReportRequested\",\n    \"readText\",\n    \"readValue\",\n    \"readable\",\n    \"ready\",\n    \"readyState\",\n    \"reason\",\n    \"reboot\",\n    \"receivedAlert\",\n    \"receiver\",\n    \"receivers\",\n    \"recipient\",\n    \"reconnect\",\n    \"recordNumber\",\n    \"recordsAvailable\",\n    \"recordset\",\n    \"rect\",\n    \"red\",\n    \"redEyeReduction\",\n    \"redirect\",\n    \"redirectCount\",\n    \"redirectEnd\",\n    \"redirectStart\",\n    \"redirected\",\n    \"reduce\",\n    \"reduceRight\",\n    \"reduction\",\n    \"refDistance\",\n    \"refX\",\n    \"refY\",\n    \"referenceNode\",\n    \"referenceSpace\",\n    \"referrer\",\n    \"referrerPolicy\",\n    \"refresh\",\n    \"region\",\n    \"regionAnchorX\",\n    \"regionAnchorY\",\n    \"regionId\",\n    \"regions\",\n    \"register\",\n    \"registerContentHandler\",\n    \"registerElement\",\n    \"registerProperty\",\n    \"registerProtocolHandler\",\n    \"reject\",\n    \"rel\",\n    \"relList\",\n    \"relatedAddress\",\n    \"relatedNode\",\n    \"relatedPort\",\n    \"relatedTarget\",\n    \"release\",\n    \"releaseCapture\",\n    \"releaseEvents\",\n    \"releaseInterface\",\n    \"releaseLock\",\n    \"releasePointerCapture\",\n    \"releaseShaderCompiler\",\n    \"reliable\",\n    \"reliableWrite\",\n    \"reload\",\n    \"rem\",\n    \"remainingSpace\",\n    \"remote\",\n    \"remoteDescription\",\n    \"remove\",\n    \"removeAllRanges\",\n    \"removeAttribute\",\n    \"removeAttributeNS\",\n    \"removeAttributeNode\",\n    \"removeBehavior\",\n    \"removeChild\",\n    \"removeCue\",\n    \"removeEventListener\",\n    \"removeFilter\",\n    \"removeImport\",\n    \"removeItem\",\n    \"removeListener\",\n    \"removeNamedItem\",\n    \"removeNamedItemNS\",\n    \"removeNode\",\n    \"removeParameter\",\n    \"removeProperty\",\n    \"removeRange\",\n    \"removeRegion\",\n    \"removeRule\",\n    \"removeSiteSpecificTrackingException\",\n    \"removeSourceBuffer\",\n    \"removeStream\",\n    \"removeTrack\",\n    \"removeVariable\",\n    \"removeWakeLockListener\",\n    \"removeWebWideTrackingException\",\n    \"removed\",\n    \"removedNodes\",\n    \"renderHeight\",\n    \"renderState\",\n    \"renderTime\",\n    \"renderWidth\",\n    \"renderbufferStorage\",\n    \"renderbufferStorageMultisample\",\n    \"renderedBuffer\",\n    \"renderingMode\",\n    \"renotify\",\n    \"repeat\",\n    \"replace\",\n    \"replaceAdjacentText\",\n    \"replaceAll\",\n    \"replaceChild\",\n    \"replaceChildren\",\n    \"replaceData\",\n    \"replaceId\",\n    \"replaceItem\",\n    \"replaceNode\",\n    \"replaceState\",\n    \"replaceSync\",\n    \"replaceTrack\",\n    \"replaceWholeText\",\n    \"replaceWith\",\n    \"reportValidity\",\n    \"request\",\n    \"requestAnimationFrame\",\n    \"requestAutocomplete\",\n    \"requestData\",\n    \"requestDevice\",\n    \"requestFrame\",\n    \"requestFullscreen\",\n    \"requestHitTestSource\",\n    \"requestHitTestSourceForTransientInput\",\n    \"requestId\",\n    \"requestIdleCallback\",\n    \"requestMIDIAccess\",\n    \"requestMediaKeySystemAccess\",\n    \"requestPermission\",\n    \"requestPictureInPicture\",\n    \"requestPointerLock\",\n    \"requestPresent\",\n    \"requestReferenceSpace\",\n    \"requestSession\",\n    \"requestStart\",\n    \"requestStorageAccess\",\n    \"requestSubmit\",\n    \"requestVideoFrameCallback\",\n    \"requestingWindow\",\n    \"requireInteraction\",\n    \"required\",\n    \"requiredExtensions\",\n    \"requiredFeatures\",\n    \"reset\",\n    \"resetPose\",\n    \"resetTransform\",\n    \"resize\",\n    \"resizeBy\",\n    \"resizeTo\",\n    \"resolve\",\n    \"response\",\n    \"responseBody\",\n    \"responseEnd\",\n    \"responseReady\",\n    \"responseStart\",\n    \"responseText\",\n    \"responseType\",\n    \"responseURL\",\n    \"responseXML\",\n    \"restartIce\",\n    \"restore\",\n    \"result\",\n    \"resultIndex\",\n    \"resultType\",\n    \"results\",\n    \"resume\",\n    \"resumeProfilers\",\n    \"resumeTransformFeedback\",\n    \"retry\",\n    \"returnValue\",\n    \"rev\",\n    \"reverse\",\n    \"reversed\",\n    \"revocable\",\n    \"revokeObjectURL\",\n    \"rgbColor\",\n    \"right\",\n    \"rightContext\",\n    \"rightDegrees\",\n    \"rightMargin\",\n    \"rightProjectionMatrix\",\n    \"rightViewMatrix\",\n    \"role\",\n    \"rolloffFactor\",\n    \"root\",\n    \"rootBounds\",\n    \"rootElement\",\n    \"rootMargin\",\n    \"rotate\",\n    \"rotateAxisAngle\",\n    \"rotateAxisAngleSelf\",\n    \"rotateFromVector\",\n    \"rotateFromVectorSelf\",\n    \"rotateSelf\",\n    \"rotation\",\n    \"rotationAngle\",\n    \"rotationRate\",\n    \"round\",\n    \"row-gap\",\n    \"rowGap\",\n    \"rowIndex\",\n    \"rowSpan\",\n    \"rows\",\n    \"rtcpTransport\",\n    \"rtt\",\n    \"ruby-align\",\n    \"ruby-position\",\n    \"rubyAlign\",\n    \"rubyOverhang\",\n    \"rubyPosition\",\n    \"rules\",\n    \"runtime\",\n    \"runtimeStyle\",\n    \"rx\",\n    \"ry\",\n    \"s\",\n    \"safari\",\n    \"sample\",\n    \"sampleCoverage\",\n    \"sampleRate\",\n    \"samplerParameterf\",\n    \"samplerParameteri\",\n    \"sandbox\",\n    \"save\",\n    \"saveData\",\n    \"scale\",\n    \"scale3d\",\n    \"scale3dSelf\",\n    \"scaleNonUniform\",\n    \"scaleNonUniformSelf\",\n    \"scaleSelf\",\n    \"scheme\",\n    \"scissor\",\n    \"scope\",\n    \"scopeName\",\n    \"scoped\",\n    \"screen\",\n    \"screenBrightness\",\n    \"screenEnabled\",\n    \"screenLeft\",\n    \"screenPixelToMillimeterX\",\n    \"screenPixelToMillimeterY\",\n    \"screenTop\",\n    \"screenX\",\n    \"screenY\",\n    \"scriptURL\",\n    \"scripts\",\n    \"scroll\",\n    \"scroll-behavior\",\n    \"scroll-margin\",\n    \"scroll-margin-block\",\n    \"scroll-margin-block-end\",\n    \"scroll-margin-block-start\",\n    \"scroll-margin-bottom\",\n    \"scroll-margin-inline\",\n    \"scroll-margin-inline-end\",\n    \"scroll-margin-inline-start\",\n    \"scroll-margin-left\",\n    \"scroll-margin-right\",\n    \"scroll-margin-top\",\n    \"scroll-padding\",\n    \"scroll-padding-block\",\n    \"scroll-padding-block-end\",\n    \"scroll-padding-block-start\",\n    \"scroll-padding-bottom\",\n    \"scroll-padding-inline\",\n    \"scroll-padding-inline-end\",\n    \"scroll-padding-inline-start\",\n    \"scroll-padding-left\",\n    \"scroll-padding-right\",\n    \"scroll-padding-top\",\n    \"scroll-snap-align\",\n    \"scroll-snap-type\",\n    \"scrollAmount\",\n    \"scrollBehavior\",\n    \"scrollBy\",\n    \"scrollByLines\",\n    \"scrollByPages\",\n    \"scrollDelay\",\n    \"scrollHeight\",\n    \"scrollIntoView\",\n    \"scrollIntoViewIfNeeded\",\n    \"scrollLeft\",\n    \"scrollLeftMax\",\n    \"scrollMargin\",\n    \"scrollMarginBlock\",\n    \"scrollMarginBlockEnd\",\n    \"scrollMarginBlockStart\",\n    \"scrollMarginBottom\",\n    \"scrollMarginInline\",\n    \"scrollMarginInlineEnd\",\n    \"scrollMarginInlineStart\",\n    \"scrollMarginLeft\",\n    \"scrollMarginRight\",\n    \"scrollMarginTop\",\n    \"scrollMaxX\",\n    \"scrollMaxY\",\n    \"scrollPadding\",\n    \"scrollPaddingBlock\",\n    \"scrollPaddingBlockEnd\",\n    \"scrollPaddingBlockStart\",\n    \"scrollPaddingBottom\",\n    \"scrollPaddingInline\",\n    \"scrollPaddingInlineEnd\",\n    \"scrollPaddingInlineStart\",\n    \"scrollPaddingLeft\",\n    \"scrollPaddingRight\",\n    \"scrollPaddingTop\",\n    \"scrollRestoration\",\n    \"scrollSnapAlign\",\n    \"scrollSnapType\",\n    \"scrollTo\",\n    \"scrollTop\",\n    \"scrollTopMax\",\n    \"scrollWidth\",\n    \"scrollX\",\n    \"scrollY\",\n    \"scrollbar-color\",\n    \"scrollbar-width\",\n    \"scrollbar3dLightColor\",\n    \"scrollbarArrowColor\",\n    \"scrollbarBaseColor\",\n    \"scrollbarColor\",\n    \"scrollbarDarkShadowColor\",\n    \"scrollbarFaceColor\",\n    \"scrollbarHighlightColor\",\n    \"scrollbarShadowColor\",\n    \"scrollbarTrackColor\",\n    \"scrollbarWidth\",\n    \"scrollbars\",\n    \"scrolling\",\n    \"scrollingElement\",\n    \"sctp\",\n    \"sctpCauseCode\",\n    \"sdp\",\n    \"sdpLineNumber\",\n    \"sdpMLineIndex\",\n    \"sdpMid\",\n    \"seal\",\n    \"search\",\n    \"searchBox\",\n    \"searchBoxJavaBridge_\",\n    \"searchParams\",\n    \"sectionRowIndex\",\n    \"secureConnectionStart\",\n    \"security\",\n    \"seed\",\n    \"seekToNextFrame\",\n    \"seekable\",\n    \"seeking\",\n    \"select\",\n    \"selectAllChildren\",\n    \"selectAlternateInterface\",\n    \"selectConfiguration\",\n    \"selectNode\",\n    \"selectNodeContents\",\n    \"selectNodes\",\n    \"selectSingleNode\",\n    \"selectSubString\",\n    \"selected\",\n    \"selectedIndex\",\n    \"selectedOptions\",\n    \"selectedStyleSheetSet\",\n    \"selectedStylesheetSet\",\n    \"selection\",\n    \"selectionDirection\",\n    \"selectionEnd\",\n    \"selectionStart\",\n    \"selector\",\n    \"selectorText\",\n    \"self\",\n    \"send\",\n    \"sendAsBinary\",\n    \"sendBeacon\",\n    \"sender\",\n    \"sentAlert\",\n    \"sentTimestamp\",\n    \"separator\",\n    \"serialNumber\",\n    \"serializeToString\",\n    \"serverTiming\",\n    \"service\",\n    \"serviceWorker\",\n    \"session\",\n    \"sessionId\",\n    \"sessionStorage\",\n    \"set\",\n    \"setActionHandler\",\n    \"setActive\",\n    \"setAlpha\",\n    \"setAppBadge\",\n    \"setAttribute\",\n    \"setAttributeNS\",\n    \"setAttributeNode\",\n    \"setAttributeNodeNS\",\n    \"setBaseAndExtent\",\n    \"setBigInt64\",\n    \"setBigUint64\",\n    \"setBingCurrentSearchDefault\",\n    \"setCapture\",\n    \"setCodecPreferences\",\n    \"setColor\",\n    \"setCompositeOperation\",\n    \"setConfiguration\",\n    \"setCurrentTime\",\n    \"setCustomValidity\",\n    \"setData\",\n    \"setDate\",\n    \"setDragImage\",\n    \"setEnd\",\n    \"setEndAfter\",\n    \"setEndBefore\",\n    \"setEndPoint\",\n    \"setFillColor\",\n    \"setFilterRes\",\n    \"setFloat32\",\n    \"setFloat64\",\n    \"setFloatValue\",\n    \"setFormValue\",\n    \"setFullYear\",\n    \"setHeaderValue\",\n    \"setHours\",\n    \"setIdentityProvider\",\n    \"setImmediate\",\n    \"setInt16\",\n    \"setInt32\",\n    \"setInt8\",\n    \"setInterval\",\n    \"setItem\",\n    \"setKeyframes\",\n    \"setLineCap\",\n    \"setLineDash\",\n    \"setLineJoin\",\n    \"setLineWidth\",\n    \"setLiveSeekableRange\",\n    \"setLocalDescription\",\n    \"setMatrix\",\n    \"setMatrixValue\",\n    \"setMediaKeys\",\n    \"setMilliseconds\",\n    \"setMinutes\",\n    \"setMiterLimit\",\n    \"setMonth\",\n    \"setNamedItem\",\n    \"setNamedItemNS\",\n    \"setNonUserCodeExceptions\",\n    \"setOrientToAngle\",\n    \"setOrientToAuto\",\n    \"setOrientation\",\n    \"setOverrideHistoryNavigationMode\",\n    \"setPaint\",\n    \"setParameter\",\n    \"setParameters\",\n    \"setPeriodicWave\",\n    \"setPointerCapture\",\n    \"setPosition\",\n    \"setPositionState\",\n    \"setPreference\",\n    \"setProperty\",\n    \"setPrototypeOf\",\n    \"setRGBColor\",\n    \"setRGBColorICCColor\",\n    \"setRadius\",\n    \"setRangeText\",\n    \"setRemoteDescription\",\n    \"setRequestHeader\",\n    \"setResizable\",\n    \"setResourceTimingBufferSize\",\n    \"setRotate\",\n    \"setScale\",\n    \"setSeconds\",\n    \"setSelectionRange\",\n    \"setServerCertificate\",\n    \"setShadow\",\n    \"setSinkId\",\n    \"setSkewX\",\n    \"setSkewY\",\n    \"setStart\",\n    \"setStartAfter\",\n    \"setStartBefore\",\n    \"setStdDeviation\",\n    \"setStreams\",\n    \"setStringValue\",\n    \"setStrokeColor\",\n    \"setSuggestResult\",\n    \"setTargetAtTime\",\n    \"setTargetValueAtTime\",\n    \"setTime\",\n    \"setTimeout\",\n    \"setTransform\",\n    \"setTranslate\",\n    \"setUTCDate\",\n    \"setUTCFullYear\",\n    \"setUTCHours\",\n    \"setUTCMilliseconds\",\n    \"setUTCMinutes\",\n    \"setUTCMonth\",\n    \"setUTCSeconds\",\n    \"setUint16\",\n    \"setUint32\",\n    \"setUint8\",\n    \"setUri\",\n    \"setValidity\",\n    \"setValueAtTime\",\n    \"setValueCurveAtTime\",\n    \"setVariable\",\n    \"setVelocity\",\n    \"setVersion\",\n    \"setYear\",\n    \"settingName\",\n    \"settingValue\",\n    \"sex\",\n    \"shaderSource\",\n    \"shadowBlur\",\n    \"shadowColor\",\n    \"shadowOffsetX\",\n    \"shadowOffsetY\",\n    \"shadowRoot\",\n    \"shape\",\n    \"shape-image-threshold\",\n    \"shape-margin\",\n    \"shape-outside\",\n    \"shape-rendering\",\n    \"shapeImageThreshold\",\n    \"shapeMargin\",\n    \"shapeOutside\",\n    \"shapeRendering\",\n    \"sheet\",\n    \"shift\",\n    \"shiftKey\",\n    \"shiftLeft\",\n    \"shippingAddress\",\n    \"shippingOption\",\n    \"shippingType\",\n    \"show\",\n    \"showHelp\",\n    \"showModal\",\n    \"showModalDialog\",\n    \"showModelessDialog\",\n    \"showNotification\",\n    \"sidebar\",\n    \"sign\",\n    \"signal\",\n    \"signalingState\",\n    \"signature\",\n    \"silent\",\n    \"sin\",\n    \"singleNodeValue\",\n    \"sinh\",\n    \"sinkId\",\n    \"sittingToStandingTransform\",\n    \"size\",\n    \"sizeToContent\",\n    \"sizeX\",\n    \"sizeZ\",\n    \"sizes\",\n    \"skewX\",\n    \"skewXSelf\",\n    \"skewY\",\n    \"skewYSelf\",\n    \"slice\",\n    \"slope\",\n    \"slot\",\n    \"small\",\n    \"smil\",\n    \"smooth\",\n    \"smoothingTimeConstant\",\n    \"snapToLines\",\n    \"snapshotItem\",\n    \"snapshotLength\",\n    \"some\",\n    \"sort\",\n    \"sortingCode\",\n    \"source\",\n    \"sourceBuffer\",\n    \"sourceBuffers\",\n    \"sourceCapabilities\",\n    \"sourceFile\",\n    \"sourceIndex\",\n    \"sources\",\n    \"spacing\",\n    \"span\",\n    \"speak\",\n    \"speakAs\",\n    \"speaking\",\n    \"species\",\n    \"specified\",\n    \"specularConstant\",\n    \"specularExponent\",\n    \"speechSynthesis\",\n    \"speed\",\n    \"speedOfSound\",\n    \"spellcheck\",\n    \"splice\",\n    \"split\",\n    \"splitText\",\n    \"spreadMethod\",\n    \"sqrt\",\n    \"src\",\n    \"srcElement\",\n    \"srcFilter\",\n    \"srcObject\",\n    \"srcUrn\",\n    \"srcdoc\",\n    \"srclang\",\n    \"srcset\",\n    \"stack\",\n    \"stackTraceLimit\",\n    \"stacktrace\",\n    \"stageParameters\",\n    \"standalone\",\n    \"standby\",\n    \"start\",\n    \"startContainer\",\n    \"startIce\",\n    \"startMessages\",\n    \"startNotifications\",\n    \"startOffset\",\n    \"startProfiling\",\n    \"startRendering\",\n    \"startShark\",\n    \"startTime\",\n    \"startsWith\",\n    \"state\",\n    \"status\",\n    \"statusCode\",\n    \"statusMessage\",\n    \"statusText\",\n    \"statusbar\",\n    \"stdDeviationX\",\n    \"stdDeviationY\",\n    \"stencilFunc\",\n    \"stencilFuncSeparate\",\n    \"stencilMask\",\n    \"stencilMaskSeparate\",\n    \"stencilOp\",\n    \"stencilOpSeparate\",\n    \"step\",\n    \"stepDown\",\n    \"stepMismatch\",\n    \"stepUp\",\n    \"sticky\",\n    \"stitchTiles\",\n    \"stop\",\n    \"stop-color\",\n    \"stop-opacity\",\n    \"stopColor\",\n    \"stopImmediatePropagation\",\n    \"stopNotifications\",\n    \"stopOpacity\",\n    \"stopProfiling\",\n    \"stopPropagation\",\n    \"stopShark\",\n    \"stopped\",\n    \"storage\",\n    \"storageArea\",\n    \"storageName\",\n    \"storageStatus\",\n    \"store\",\n    \"storeSiteSpecificTrackingException\",\n    \"storeWebWideTrackingException\",\n    \"stpVersion\",\n    \"stream\",\n    \"streams\",\n    \"stretch\",\n    \"strike\",\n    \"string\",\n    \"stringValue\",\n    \"stringify\",\n    \"stroke\",\n    \"stroke-dasharray\",\n    \"stroke-dashoffset\",\n    \"stroke-linecap\",\n    \"stroke-linejoin\",\n    \"stroke-miterlimit\",\n    \"stroke-opacity\",\n    \"stroke-width\",\n    \"strokeDasharray\",\n    \"strokeDashoffset\",\n    \"strokeLinecap\",\n    \"strokeLinejoin\",\n    \"strokeMiterlimit\",\n    \"strokeOpacity\",\n    \"strokeRect\",\n    \"strokeStyle\",\n    \"strokeText\",\n    \"strokeWidth\",\n    \"style\",\n    \"styleFloat\",\n    \"styleMap\",\n    \"styleMedia\",\n    \"styleSheet\",\n    \"styleSheetSets\",\n    \"styleSheets\",\n    \"sub\",\n    \"subarray\",\n    \"subject\",\n    \"submit\",\n    \"submitFrame\",\n    \"submitter\",\n    \"subscribe\",\n    \"substr\",\n    \"substring\",\n    \"substringData\",\n    \"subtle\",\n    \"subtree\",\n    \"suffix\",\n    \"suffixes\",\n    \"summary\",\n    \"sup\",\n    \"supported\",\n    \"supportedContentEncodings\",\n    \"supportedEntryTypes\",\n    \"supports\",\n    \"supportsSession\",\n    \"surfaceScale\",\n    \"surroundContents\",\n    \"suspend\",\n    \"suspendRedraw\",\n    \"swapCache\",\n    \"swapNode\",\n    \"sweepFlag\",\n    \"symbols\",\n    \"sync\",\n    \"sysexEnabled\",\n    \"system\",\n    \"systemCode\",\n    \"systemId\",\n    \"systemLanguage\",\n    \"systemXDPI\",\n    \"systemYDPI\",\n    \"tBodies\",\n    \"tFoot\",\n    \"tHead\",\n    \"tabIndex\",\n    \"table\",\n    \"table-layout\",\n    \"tableLayout\",\n    \"tableValues\",\n    \"tag\",\n    \"tagName\",\n    \"tagUrn\",\n    \"tags\",\n    \"taintEnabled\",\n    \"takePhoto\",\n    \"takeRecords\",\n    \"tan\",\n    \"tangentialPressure\",\n    \"tanh\",\n    \"target\",\n    \"targetElement\",\n    \"targetRayMode\",\n    \"targetRaySpace\",\n    \"targetTouches\",\n    \"targetX\",\n    \"targetY\",\n    \"tcpType\",\n    \"tee\",\n    \"tel\",\n    \"terminate\",\n    \"test\",\n    \"texImage2D\",\n    \"texImage3D\",\n    \"texParameterf\",\n    \"texParameteri\",\n    \"texStorage2D\",\n    \"texStorage3D\",\n    \"texSubImage2D\",\n    \"texSubImage3D\",\n    \"text\",\n    \"text-align\",\n    \"text-align-last\",\n    \"text-anchor\",\n    \"text-combine-upright\",\n    \"text-decoration\",\n    \"text-decoration-color\",\n    \"text-decoration-line\",\n    \"text-decoration-skip-ink\",\n    \"text-decoration-style\",\n    \"text-decoration-thickness\",\n    \"text-emphasis\",\n    \"text-emphasis-color\",\n    \"text-emphasis-position\",\n    \"text-emphasis-style\",\n    \"text-indent\",\n    \"text-justify\",\n    \"text-orientation\",\n    \"text-overflow\",\n    \"text-rendering\",\n    \"text-shadow\",\n    \"text-transform\",\n    \"text-underline-offset\",\n    \"text-underline-position\",\n    \"textAlign\",\n    \"textAlignLast\",\n    \"textAnchor\",\n    \"textAutospace\",\n    \"textBaseline\",\n    \"textCombineUpright\",\n    \"textContent\",\n    \"textDecoration\",\n    \"textDecorationBlink\",\n    \"textDecorationColor\",\n    \"textDecorationLine\",\n    \"textDecorationLineThrough\",\n    \"textDecorationNone\",\n    \"textDecorationOverline\",\n    \"textDecorationSkipInk\",\n    \"textDecorationStyle\",\n    \"textDecorationThickness\",\n    \"textDecorationUnderline\",\n    \"textEmphasis\",\n    \"textEmphasisColor\",\n    \"textEmphasisPosition\",\n    \"textEmphasisStyle\",\n    \"textIndent\",\n    \"textJustify\",\n    \"textJustifyTrim\",\n    \"textKashida\",\n    \"textKashidaSpace\",\n    \"textLength\",\n    \"textOrientation\",\n    \"textOverflow\",\n    \"textRendering\",\n    \"textShadow\",\n    \"textTracks\",\n    \"textTransform\",\n    \"textUnderlineOffset\",\n    \"textUnderlinePosition\",\n    \"then\",\n    \"threadId\",\n    \"threshold\",\n    \"thresholds\",\n    \"tiltX\",\n    \"tiltY\",\n    \"time\",\n    \"timeEnd\",\n    \"timeLog\",\n    \"timeOrigin\",\n    \"timeRemaining\",\n    \"timeStamp\",\n    \"timecode\",\n    \"timeline\",\n    \"timelineTime\",\n    \"timeout\",\n    \"timestamp\",\n    \"timestampOffset\",\n    \"timing\",\n    \"title\",\n    \"to\",\n    \"toArray\",\n    \"toBlob\",\n    \"toDataURL\",\n    \"toDateString\",\n    \"toElement\",\n    \"toExponential\",\n    \"toFixed\",\n    \"toFloat32Array\",\n    \"toFloat64Array\",\n    \"toGMTString\",\n    \"toISOString\",\n    \"toJSON\",\n    \"toLocaleDateString\",\n    \"toLocaleFormat\",\n    \"toLocaleLowerCase\",\n    \"toLocaleString\",\n    \"toLocaleTimeString\",\n    \"toLocaleUpperCase\",\n    \"toLowerCase\",\n    \"toMatrix\",\n    \"toMethod\",\n    \"toPrecision\",\n    \"toPrimitive\",\n    \"toSdp\",\n    \"toSource\",\n    \"toStaticHTML\",\n    \"toString\",\n    \"toStringTag\",\n    \"toSum\",\n    \"toTimeString\",\n    \"toUTCString\",\n    \"toUpperCase\",\n    \"toggle\",\n    \"toggleAttribute\",\n    \"toggleLongPressEnabled\",\n    \"tone\",\n    \"toneBuffer\",\n    \"tooLong\",\n    \"tooShort\",\n    \"toolbar\",\n    \"top\",\n    \"topMargin\",\n    \"total\",\n    \"totalFrameDelay\",\n    \"totalVideoFrames\",\n    \"touch-action\",\n    \"touchAction\",\n    \"touched\",\n    \"touches\",\n    \"trace\",\n    \"track\",\n    \"trackVisibility\",\n    \"transaction\",\n    \"transactions\",\n    \"transceiver\",\n    \"transferControlToOffscreen\",\n    \"transferFromImageBitmap\",\n    \"transferImageBitmap\",\n    \"transferIn\",\n    \"transferOut\",\n    \"transferSize\",\n    \"transferToImageBitmap\",\n    \"transform\",\n    \"transform-box\",\n    \"transform-origin\",\n    \"transform-style\",\n    \"transformBox\",\n    \"transformFeedbackVaryings\",\n    \"transformOrigin\",\n    \"transformPoint\",\n    \"transformString\",\n    \"transformStyle\",\n    \"transformToDocument\",\n    \"transformToFragment\",\n    \"transition\",\n    \"transition-delay\",\n    \"transition-duration\",\n    \"transition-property\",\n    \"transition-timing-function\",\n    \"transitionDelay\",\n    \"transitionDuration\",\n    \"transitionProperty\",\n    \"transitionTimingFunction\",\n    \"translate\",\n    \"translateSelf\",\n    \"translationX\",\n    \"translationY\",\n    \"transport\",\n    \"trim\",\n    \"trimEnd\",\n    \"trimLeft\",\n    \"trimRight\",\n    \"trimStart\",\n    \"trueSpeed\",\n    \"trunc\",\n    \"truncate\",\n    \"trustedTypes\",\n    \"turn\",\n    \"twist\",\n    \"type\",\n    \"typeDetail\",\n    \"typeMismatch\",\n    \"typeMustMatch\",\n    \"types\",\n    \"u2f\",\n    \"ubound\",\n    \"uint16\",\n    \"uint32\",\n    \"uint8\",\n    \"uint8Clamped\",\n    \"undefined\",\n    \"unescape\",\n    \"uneval\",\n    \"unicode\",\n    \"unicode-bidi\",\n    \"unicodeBidi\",\n    \"unicodeRange\",\n    \"uniform1f\",\n    \"uniform1fv\",\n    \"uniform1i\",\n    \"uniform1iv\",\n    \"uniform1ui\",\n    \"uniform1uiv\",\n    \"uniform2f\",\n    \"uniform2fv\",\n    \"uniform2i\",\n    \"uniform2iv\",\n    \"uniform2ui\",\n    \"uniform2uiv\",\n    \"uniform3f\",\n    \"uniform3fv\",\n    \"uniform3i\",\n    \"uniform3iv\",\n    \"uniform3ui\",\n    \"uniform3uiv\",\n    \"uniform4f\",\n    \"uniform4fv\",\n    \"uniform4i\",\n    \"uniform4iv\",\n    \"uniform4ui\",\n    \"uniform4uiv\",\n    \"uniformBlockBinding\",\n    \"uniformMatrix2fv\",\n    \"uniformMatrix2x3fv\",\n    \"uniformMatrix2x4fv\",\n    \"uniformMatrix3fv\",\n    \"uniformMatrix3x2fv\",\n    \"uniformMatrix3x4fv\",\n    \"uniformMatrix4fv\",\n    \"uniformMatrix4x2fv\",\n    \"uniformMatrix4x3fv\",\n    \"unique\",\n    \"uniqueID\",\n    \"uniqueNumber\",\n    \"unit\",\n    \"unitType\",\n    \"units\",\n    \"unloadEventEnd\",\n    \"unloadEventStart\",\n    \"unlock\",\n    \"unmount\",\n    \"unobserve\",\n    \"unpause\",\n    \"unpauseAnimations\",\n    \"unreadCount\",\n    \"unregister\",\n    \"unregisterContentHandler\",\n    \"unregisterProtocolHandler\",\n    \"unscopables\",\n    \"unselectable\",\n    \"unshift\",\n    \"unsubscribe\",\n    \"unsuspendRedraw\",\n    \"unsuspendRedrawAll\",\n    \"unwatch\",\n    \"unwrapKey\",\n    \"upDegrees\",\n    \"upX\",\n    \"upY\",\n    \"upZ\",\n    \"update\",\n    \"updateCommands\",\n    \"updateIce\",\n    \"updateInterval\",\n    \"updatePlaybackRate\",\n    \"updateRenderState\",\n    \"updateSettings\",\n    \"updateTiming\",\n    \"updateViaCache\",\n    \"updateWith\",\n    \"updated\",\n    \"updating\",\n    \"upgrade\",\n    \"upload\",\n    \"uploadTotal\",\n    \"uploaded\",\n    \"upper\",\n    \"upperBound\",\n    \"upperOpen\",\n    \"uri\",\n    \"url\",\n    \"urn\",\n    \"urns\",\n    \"usages\",\n    \"usb\",\n    \"usbVersionMajor\",\n    \"usbVersionMinor\",\n    \"usbVersionSubminor\",\n    \"useCurrentView\",\n    \"useMap\",\n    \"useProgram\",\n    \"usedSpace\",\n    \"user-select\",\n    \"userActivation\",\n    \"userAgent\",\n    \"userAgentData\",\n    \"userChoice\",\n    \"userHandle\",\n    \"userHint\",\n    \"userLanguage\",\n    \"userSelect\",\n    \"userVisibleOnly\",\n    \"username\",\n    \"usernameFragment\",\n    \"utterance\",\n    \"uuid\",\n    \"v8BreakIterator\",\n    \"vAlign\",\n    \"vLink\",\n    \"valid\",\n    \"validate\",\n    \"validateProgram\",\n    \"validationMessage\",\n    \"validity\",\n    \"value\",\n    \"valueAsDate\",\n    \"valueAsNumber\",\n    \"valueAsString\",\n    \"valueInSpecifiedUnits\",\n    \"valueMissing\",\n    \"valueOf\",\n    \"valueText\",\n    \"valueType\",\n    \"values\",\n    \"variable\",\n    \"variant\",\n    \"variationSettings\",\n    \"vector-effect\",\n    \"vectorEffect\",\n    \"velocityAngular\",\n    \"velocityExpansion\",\n    \"velocityX\",\n    \"velocityY\",\n    \"vendor\",\n    \"vendorId\",\n    \"vendorSub\",\n    \"verify\",\n    \"version\",\n    \"vertexAttrib1f\",\n    \"vertexAttrib1fv\",\n    \"vertexAttrib2f\",\n    \"vertexAttrib2fv\",\n    \"vertexAttrib3f\",\n    \"vertexAttrib3fv\",\n    \"vertexAttrib4f\",\n    \"vertexAttrib4fv\",\n    \"vertexAttribDivisor\",\n    \"vertexAttribDivisorANGLE\",\n    \"vertexAttribI4i\",\n    \"vertexAttribI4iv\",\n    \"vertexAttribI4ui\",\n    \"vertexAttribI4uiv\",\n    \"vertexAttribIPointer\",\n    \"vertexAttribPointer\",\n    \"vertical\",\n    \"vertical-align\",\n    \"verticalAlign\",\n    \"verticalOverflow\",\n    \"vh\",\n    \"vibrate\",\n    \"vibrationActuator\",\n    \"videoBitsPerSecond\",\n    \"videoHeight\",\n    \"videoTracks\",\n    \"videoWidth\",\n    \"view\",\n    \"viewBox\",\n    \"viewBoxString\",\n    \"viewTarget\",\n    \"viewTargetString\",\n    \"viewport\",\n    \"viewportAnchorX\",\n    \"viewportAnchorY\",\n    \"viewportElement\",\n    \"views\",\n    \"violatedDirective\",\n    \"visibility\",\n    \"visibilityState\",\n    \"visible\",\n    \"visualViewport\",\n    \"vlinkColor\",\n    \"vmax\",\n    \"vmin\",\n    \"voice\",\n    \"voiceURI\",\n    \"volume\",\n    \"vrml\",\n    \"vspace\",\n    \"vw\",\n    \"w\",\n    \"wait\",\n    \"waitSync\",\n    \"waiting\",\n    \"wake\",\n    \"wakeLock\",\n    \"wand\",\n    \"warn\",\n    \"wasClean\",\n    \"wasDiscarded\",\n    \"watch\",\n    \"watchAvailability\",\n    \"watchPosition\",\n    \"webdriver\",\n    \"webkitAddKey\",\n    \"webkitAlignContent\",\n    \"webkitAlignItems\",\n    \"webkitAlignSelf\",\n    \"webkitAnimation\",\n    \"webkitAnimationDelay\",\n    \"webkitAnimationDirection\",\n    \"webkitAnimationDuration\",\n    \"webkitAnimationFillMode\",\n    \"webkitAnimationIterationCount\",\n    \"webkitAnimationName\",\n    \"webkitAnimationPlayState\",\n    \"webkitAnimationTimingFunction\",\n    \"webkitAppearance\",\n    \"webkitAudioContext\",\n    \"webkitAudioDecodedByteCount\",\n    \"webkitAudioPannerNode\",\n    \"webkitBackfaceVisibility\",\n    \"webkitBackground\",\n    \"webkitBackgroundAttachment\",\n    \"webkitBackgroundClip\",\n    \"webkitBackgroundColor\",\n    \"webkitBackgroundImage\",\n    \"webkitBackgroundOrigin\",\n    \"webkitBackgroundPosition\",\n    \"webkitBackgroundPositionX\",\n    \"webkitBackgroundPositionY\",\n    \"webkitBackgroundRepeat\",\n    \"webkitBackgroundSize\",\n    \"webkitBackingStorePixelRatio\",\n    \"webkitBorderBottomLeftRadius\",\n    \"webkitBorderBottomRightRadius\",\n    \"webkitBorderImage\",\n    \"webkitBorderImageOutset\",\n    \"webkitBorderImageRepeat\",\n    \"webkitBorderImageSlice\",\n    \"webkitBorderImageSource\",\n    \"webkitBorderImageWidth\",\n    \"webkitBorderRadius\",\n    \"webkitBorderTopLeftRadius\",\n    \"webkitBorderTopRightRadius\",\n    \"webkitBoxAlign\",\n    \"webkitBoxDirection\",\n    \"webkitBoxFlex\",\n    \"webkitBoxOrdinalGroup\",\n    \"webkitBoxOrient\",\n    \"webkitBoxPack\",\n    \"webkitBoxShadow\",\n    \"webkitBoxSizing\",\n    \"webkitCancelAnimationFrame\",\n    \"webkitCancelFullScreen\",\n    \"webkitCancelKeyRequest\",\n    \"webkitCancelRequestAnimationFrame\",\n    \"webkitClearResourceTimings\",\n    \"webkitClosedCaptionsVisible\",\n    \"webkitConvertPointFromNodeToPage\",\n    \"webkitConvertPointFromPageToNode\",\n    \"webkitCreateShadowRoot\",\n    \"webkitCurrentFullScreenElement\",\n    \"webkitCurrentPlaybackTargetIsWireless\",\n    \"webkitDecodedFrameCount\",\n    \"webkitDirectionInvertedFromDevice\",\n    \"webkitDisplayingFullscreen\",\n    \"webkitDroppedFrameCount\",\n    \"webkitEnterFullScreen\",\n    \"webkitEnterFullscreen\",\n    \"webkitEntries\",\n    \"webkitExitFullScreen\",\n    \"webkitExitFullscreen\",\n    \"webkitExitPointerLock\",\n    \"webkitFilter\",\n    \"webkitFlex\",\n    \"webkitFlexBasis\",\n    \"webkitFlexDirection\",\n    \"webkitFlexFlow\",\n    \"webkitFlexGrow\",\n    \"webkitFlexShrink\",\n    \"webkitFlexWrap\",\n    \"webkitFullScreenKeyboardInputAllowed\",\n    \"webkitFullscreenElement\",\n    \"webkitFullscreenEnabled\",\n    \"webkitGenerateKeyRequest\",\n    \"webkitGetAsEntry\",\n    \"webkitGetDatabaseNames\",\n    \"webkitGetEntries\",\n    \"webkitGetEntriesByName\",\n    \"webkitGetEntriesByType\",\n    \"webkitGetFlowByName\",\n    \"webkitGetGamepads\",\n    \"webkitGetImageDataHD\",\n    \"webkitGetNamedFlows\",\n    \"webkitGetRegionFlowRanges\",\n    \"webkitGetUserMedia\",\n    \"webkitHasClosedCaptions\",\n    \"webkitHidden\",\n    \"webkitIDBCursor\",\n    \"webkitIDBDatabase\",\n    \"webkitIDBDatabaseError\",\n    \"webkitIDBDatabaseException\",\n    \"webkitIDBFactory\",\n    \"webkitIDBIndex\",\n    \"webkitIDBKeyRange\",\n    \"webkitIDBObjectStore\",\n    \"webkitIDBRequest\",\n    \"webkitIDBTransaction\",\n    \"webkitImageSmoothingEnabled\",\n    \"webkitIndexedDB\",\n    \"webkitInitMessageEvent\",\n    \"webkitIsFullScreen\",\n    \"webkitJustifyContent\",\n    \"webkitKeys\",\n    \"webkitLineClamp\",\n    \"webkitLineDashOffset\",\n    \"webkitLockOrientation\",\n    \"webkitMask\",\n    \"webkitMaskClip\",\n    \"webkitMaskComposite\",\n    \"webkitMaskImage\",\n    \"webkitMaskOrigin\",\n    \"webkitMaskPosition\",\n    \"webkitMaskPositionX\",\n    \"webkitMaskPositionY\",\n    \"webkitMaskRepeat\",\n    \"webkitMaskSize\",\n    \"webkitMatchesSelector\",\n    \"webkitMediaStream\",\n    \"webkitNotifications\",\n    \"webkitOfflineAudioContext\",\n    \"webkitOrder\",\n    \"webkitOrientation\",\n    \"webkitPeerConnection00\",\n    \"webkitPersistentStorage\",\n    \"webkitPerspective\",\n    \"webkitPerspectiveOrigin\",\n    \"webkitPointerLockElement\",\n    \"webkitPostMessage\",\n    \"webkitPreservesPitch\",\n    \"webkitPutImageDataHD\",\n    \"webkitRTCPeerConnection\",\n    \"webkitRegionOverset\",\n    \"webkitRelativePath\",\n    \"webkitRequestAnimationFrame\",\n    \"webkitRequestFileSystem\",\n    \"webkitRequestFullScreen\",\n    \"webkitRequestFullscreen\",\n    \"webkitRequestPointerLock\",\n    \"webkitResolveLocalFileSystemURL\",\n    \"webkitSetMediaKeys\",\n    \"webkitSetResourceTimingBufferSize\",\n    \"webkitShadowRoot\",\n    \"webkitShowPlaybackTargetPicker\",\n    \"webkitSlice\",\n    \"webkitSpeechGrammar\",\n    \"webkitSpeechGrammarList\",\n    \"webkitSpeechRecognition\",\n    \"webkitSpeechRecognitionError\",\n    \"webkitSpeechRecognitionEvent\",\n    \"webkitStorageInfo\",\n    \"webkitSupportsFullscreen\",\n    \"webkitTemporaryStorage\",\n    \"webkitTextFillColor\",\n    \"webkitTextSizeAdjust\",\n    \"webkitTextStroke\",\n    \"webkitTextStrokeColor\",\n    \"webkitTextStrokeWidth\",\n    \"webkitTransform\",\n    \"webkitTransformOrigin\",\n    \"webkitTransformStyle\",\n    \"webkitTransition\",\n    \"webkitTransitionDelay\",\n    \"webkitTransitionDuration\",\n    \"webkitTransitionProperty\",\n    \"webkitTransitionTimingFunction\",\n    \"webkitURL\",\n    \"webkitUnlockOrientation\",\n    \"webkitUserSelect\",\n    \"webkitVideoDecodedByteCount\",\n    \"webkitVisibilityState\",\n    \"webkitWirelessVideoPlaybackDisabled\",\n    \"webkitdirectory\",\n    \"webkitdropzone\",\n    \"webstore\",\n    \"weight\",\n    \"whatToShow\",\n    \"wheelDelta\",\n    \"wheelDeltaX\",\n    \"wheelDeltaY\",\n    \"whenDefined\",\n    \"which\",\n    \"white-space\",\n    \"whiteSpace\",\n    \"wholeText\",\n    \"widows\",\n    \"width\",\n    \"will-change\",\n    \"willChange\",\n    \"willValidate\",\n    \"window\",\n    \"withCredentials\",\n    \"word-break\",\n    \"word-spacing\",\n    \"word-wrap\",\n    \"wordBreak\",\n    \"wordSpacing\",\n    \"wordWrap\",\n    \"workerStart\",\n    \"wow64\",\n    \"wrap\",\n    \"wrapKey\",\n    \"writable\",\n    \"writableAuxiliaries\",\n    \"write\",\n    \"writeText\",\n    \"writeValue\",\n    \"writeWithoutResponse\",\n    \"writeln\",\n    \"writing-mode\",\n    \"writingMode\",\n    \"x\",\n    \"x1\",\n    \"x2\",\n    \"xChannelSelector\",\n    \"xmlEncoding\",\n    \"xmlStandalone\",\n    \"xmlVersion\",\n    \"xmlbase\",\n    \"xmllang\",\n    \"xmlspace\",\n    \"xor\",\n    \"xr\",\n    \"y\",\n    \"y1\",\n    \"y2\",\n    \"yChannelSelector\",\n    \"yandex\",\n    \"z\",\n    \"z-index\",\n    \"zIndex\",\n    \"zoom\",\n    \"zoomAndPan\",\n    \"zoomRectScreen\",\n];\n"
  },
  {
    "path": "templates/bin/node/terser/tools/exit.cjs",
    "content": "// workaround for tty output truncation upon process.exit()\n// https://github.com/nodejs/node/issues/6456\n\n[process.stdout, process.stderr].forEach((s) => {\n  s && s.isTTY && s._handle && s._handle.setBlocking &&\n    s._handle.setBlocking(true)\n});\n"
  },
  {
    "path": "templates/bin/node/terser/tools/props.html",
    "content": "<html>\n  <head>\n  </head>\n  <body>\n    <script>(function(){\n      var props = {};\n\n      function addObject(obj) {\n        if (obj == null) return;\n        try {\n          Object.getOwnPropertyNames(obj).forEach(add);\n        } catch(ex) {}\n        if (obj.prototype) {\n          Object.getOwnPropertyNames(obj.prototype).forEach(add);\n        }\n        if (typeof obj == \"function\") {\n          try {\n            Object.getOwnPropertyNames(new obj).forEach(add);\n          } catch(ex) {}\n        }\n      }\n\n      function add(name) {\n        props[name] = true;\n      }\n\n      Object.getOwnPropertyNames(window).forEach(function(thing){\n        addObject(window[thing]);\n      });\n\n      try {\n        addObject(new Event(\"click\"));\n        addObject(new Event(\"contextmenu\"));\n        addObject(new Event(\"mouseup\"));\n        addObject(new Event(\"mousedown\"));\n        addObject(new Event(\"keydown\"));\n        addObject(new Event(\"keypress\"));\n        addObject(new Event(\"keyup\"));\n      } catch(ex) {}\n\n      var ta = document.createElement(\"textarea\");\n      ta.style.width = \"100%\";\n      ta.style.height = \"20em\";\n      ta.style.boxSizing = \"border-box\";\n      ta.value = 'export var domprops = ' + JSON.stringify(Object.keys(props).sort(cmp), null, 4);\n      document.body.appendChild(ta);\n\n      function cmp(a, b) {\n        a = a.toLowerCase();\n        b = b.toLowerCase();\n        return a < b ? -1 : a > b ? 1 : 0;\n      }\n    })();</script>\n  </body>\n</html>\n"
  },
  {
    "path": "templates/bin/node/terser/tools/terser.d.ts",
    "content": "/// <reference lib=\"es2015\" />\n\nimport { SectionedSourceMapInput, EncodedSourceMap, DecodedSourceMap } from '@jridgewell/source-map';\n\nexport type ECMA = 5 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020;\n\nexport interface ParseOptions {\n    bare_returns?: boolean;\n    /** @deprecated legacy option. Currently, all supported EcmaScript is valid to parse. */\n    ecma?: ECMA;\n    html5_comments?: boolean;\n    shebang?: boolean;\n}\n\nexport interface CompressOptions {\n    arguments?: boolean;\n    arrows?: boolean;\n    booleans_as_integers?: boolean;\n    booleans?: boolean;\n    collapse_vars?: boolean;\n    comparisons?: boolean;\n    computed_props?: boolean;\n    conditionals?: boolean;\n    dead_code?: boolean;\n    defaults?: boolean;\n    directives?: boolean;\n    drop_console?: boolean;\n    drop_debugger?: boolean;\n    ecma?: ECMA;\n    evaluate?: boolean;\n    expression?: boolean;\n    global_defs?: object;\n    hoist_funs?: boolean;\n    hoist_props?: boolean;\n    hoist_vars?: boolean;\n    ie8?: boolean;\n    if_return?: boolean;\n    inline?: boolean | InlineFunctions;\n    join_vars?: boolean;\n    keep_classnames?: boolean | RegExp;\n    keep_fargs?: boolean;\n    keep_fnames?: boolean | RegExp;\n    keep_infinity?: boolean;\n    loops?: boolean;\n    module?: boolean;\n    negate_iife?: boolean;\n    passes?: number;\n    properties?: boolean;\n    pure_funcs?: string[];\n    pure_getters?: boolean | 'strict';\n    reduce_funcs?: boolean;\n    reduce_vars?: boolean;\n    sequences?: boolean | number;\n    side_effects?: boolean;\n    switches?: boolean;\n    toplevel?: boolean;\n    top_retain?: null | string | string[] | RegExp;\n    typeofs?: boolean;\n    unsafe_arrows?: boolean;\n    unsafe?: boolean;\n    unsafe_comps?: boolean;\n    unsafe_Function?: boolean;\n    unsafe_math?: boolean;\n    unsafe_symbols?: boolean;\n    unsafe_methods?: boolean;\n    unsafe_proto?: boolean;\n    unsafe_regexp?: boolean;\n    unsafe_undefined?: boolean;\n    unused?: boolean;\n}\n\nexport enum InlineFunctions {\n    Disabled = 0,\n    SimpleFunctions = 1,\n    WithArguments = 2,\n    WithArgumentsAndVariables = 3\n}\n\nexport interface MangleOptions {\n    eval?: boolean;\n    keep_classnames?: boolean | RegExp;\n    keep_fnames?: boolean | RegExp;\n    module?: boolean;\n    nth_identifier?: SimpleIdentifierMangler | WeightedIdentifierMangler;\n    properties?: boolean | ManglePropertiesOptions;\n    reserved?: string[];\n    safari10?: boolean;\n    toplevel?: boolean;\n}\n\n/**\n * An identifier mangler for which the output is invariant with respect to the source code.\n */\nexport interface SimpleIdentifierMangler {\n    /**\n     * Obtains the nth most favored (usually shortest) identifier to rename a variable to.\n     * The mangler will increment n and retry until the return value is not in use in scope, and is not a reserved word.\n     * This function is expected to be stable; Evaluating get(n) === get(n) should always return true.\n     * @param n The ordinal of the identifier.\n     */\n    get(n: number): string;\n}\n\n/**\n * An identifier mangler that leverages character frequency analysis to determine identifier precedence.\n */\nexport interface WeightedIdentifierMangler extends SimpleIdentifierMangler {\n    /**\n     * Modifies the internal weighting of the input characters by the specified delta.\n     * Will be invoked on the entire printed AST, and then deduct mangleable identifiers.\n     * @param chars The characters to modify the weighting of.\n     * @param delta The numeric weight to add to the characters.\n     */\n    consider(chars: string, delta: number): number;\n    /**\n     * Resets character weights.\n     */\n    reset(): void;\n    /**\n     * Sorts identifiers by character frequency, in preparation for calls to get(n).\n     */\n    sort(): void;\n}\n\nexport interface ManglePropertiesOptions {\n    builtins?: boolean;\n    debug?: boolean;\n    keep_quoted?: boolean | 'strict';\n    nth_identifier?: SimpleIdentifierMangler | WeightedIdentifierMangler;\n    regex?: RegExp | string;\n    reserved?: string[];\n}\n\nexport interface FormatOptions {\n    ascii_only?: boolean;\n    /** @deprecated Not implemented anymore */\n    beautify?: boolean;\n    braces?: boolean;\n    comments?: boolean | 'all' | 'some' | RegExp | ( (node: any, comment: {\n        value: string,\n        type: 'comment1' | 'comment2' | 'comment3' | 'comment4',\n        pos: number,\n        line: number,\n        col: number,\n    }) => boolean );\n    ecma?: ECMA;\n    ie8?: boolean;\n    keep_numbers?: boolean;\n    indent_level?: number;\n    indent_start?: number;\n    inline_script?: boolean;\n    keep_quoted_props?: boolean;\n    max_line_len?: number | false;\n    preamble?: string;\n    preserve_annotations?: boolean;\n    quote_keys?: boolean;\n    quote_style?: OutputQuoteStyle;\n    safari10?: boolean;\n    semicolons?: boolean;\n    shebang?: boolean;\n    shorthand?: boolean;\n    source_map?: SourceMapOptions;\n    webkit?: boolean;\n    width?: number;\n    wrap_iife?: boolean;\n    wrap_func_args?: boolean;\n}\n\nexport enum OutputQuoteStyle {\n    PreferDouble = 0,\n    AlwaysSingle = 1,\n    AlwaysDouble = 2,\n    AlwaysOriginal = 3\n}\n\nexport interface MinifyOptions {\n    compress?: boolean | CompressOptions;\n    ecma?: ECMA;\n    enclose?: boolean | string;\n    ie8?: boolean;\n    keep_classnames?: boolean | RegExp;\n    keep_fnames?: boolean | RegExp;\n    mangle?: boolean | MangleOptions;\n    module?: boolean;\n    nameCache?: object;\n    format?: FormatOptions;\n    /** @deprecated */\n    output?: FormatOptions;\n    parse?: ParseOptions;\n    safari10?: boolean;\n    sourceMap?: boolean | SourceMapOptions;\n    toplevel?: boolean;\n}\n\nexport interface MinifyOutput {\n    code?: string;\n    map?: EncodedSourceMap | string;\n    decoded_map?: DecodedSourceMap | null;\n}\n\nexport interface SourceMapOptions {\n    /** Source map object, 'inline' or source map file content */\n    content?: SectionedSourceMapInput | string;\n    includeSources?: boolean;\n    filename?: string;\n    root?: string;\n    asObject?: boolean;\n    url?: string | 'inline';\n}\n\nexport function minify(files: string | string[] | { [file: string]: string }, options?: MinifyOptions): Promise<MinifyOutput>;\n"
  },
  {
    "path": "templates/bin/node/watch/LICENSE",
    "content": "Apache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of this License; and\n\nYou must cause any modified files to carry prominent notices stating that You changed the files; and\n\nYou must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS"
  },
  {
    "path": "templates/bin/node/watch/cli-custom.js",
    "content": "#!/usr/bin/env node\n\nvar argv = require('minimist')(process.argv.slice(2))\nvar execshell = require('exec-sh')\nvar cp = require('child_process');\nvar path = require('path')\nvar watch = require('./main.js')\n\nif(argv._.length === 0) {\n  console.error([\n    'Usage: watch <command> [...directory]',\n    '[--wait=<seconds>]',\n    '[--filter=<file>]',\n    '[--interval=<seconds>]',\n    '[--ignoreDotFiles]',\n    '[--ignoreUnreadable]',\n    '[--ignoreDirectoryPattern]',\n    '[--exit]'\n  ].join(' '))\n  process.exit()\n}\n\nvar watchTreeOpts = {}\nvar command = argv._[0]\nvar dirs = []\n\nvar i\nvar argLen = argv._.length\nif (argLen > 1) {\n  for(i = 1; i< argLen; i++) {\n      dirs.push(argv._[i])\n  }\n} else {\n  dirs.push(process.cwd())\n}\n\nvar waitTime = Number(argv.wait || argv.w)\nif (argv.interval || argv.i) {\n  watchTreeOpts.interval = Number(argv.interval || argv.i || 0.2);\n}\n\nvar exitShell = (argv.exit || argv.e);\n\nif(argv.ignoreDotFiles || argv.d)\n  watchTreeOpts.ignoreDotFiles = true\n\nif(argv.ignoreUnreadable || argv.u)\n  watchTreeOpts.ignoreUnreadableDir = true\n\nif(argv.ignoreDirectoryPattern || argv.p) {\n  var match = (argv.ignoreDirectoryPattern || argv.p).match(/^\\/(.*)\\/([gimuy]*)$/);\n  watchTreeOpts.ignoreDirectoryPattern = new RegExp(match[1], match[2])\n}\n\nif(argv.filter || argv.f) {\n  try {\n    watchTreeOpts.filter = require(path.resolve(process.cwd(), argv.filter || argv.f));\n  } catch (e) {\n    console.error(e)\n    process.exit(1)\n  }\n}\n\nwatchTreeOpts.filter = function (file, stat) {\n\tvar ext = path.extname(file);\n\treturn (ext == \"\" || ext == \".hx\");\n};\n\nvar wait = false\nvar shell = null;\n\nvar dirLen = dirs.length\nvar skip = dirLen - 1\nfor(i = 0; i < dirLen; i++) {\n  var dir = dirs[i]\n  console.error('> Watching', dir)\n  watch.watchTree(dir, watchTreeOpts, function (f, curr, prev) {\n    if(skip) {\n        skip--\n        return\n    }\n    if(wait) return\n\n    if(exitShell && shell != null) {\n      try {\n        var isWin = /^win/.test(process.platform);\n        if(!isWin) {\n            shell.kill('SIGKILL');\n        } else {\n            cp.exec('taskkill /PID ' + shell.pid + ' /T /F', function(error, stdout, stderr) {\n            });\n        }\n      } catch (e) {}\n    }\n    try {\n      console.error('> Rebuilding...')\n      shell = execshell(command)\n    } catch (e) {\n      console.error (e);\n    }\n\n    if(waitTime > 0) {\n      wait = true\n      setTimeout(function () {\n        wait = false\n      }, waitTime * 1000)\n    }\n  })\n}\n"
  },
  {
    "path": "templates/bin/node/watch/cli.js",
    "content": "#!/usr/bin/env node\n\nvar argv = require('minimist')(process.argv.slice(2))\nvar execshell = require('exec-sh')\nvar cp = require('child_process');\nvar path = require('path')\nvar watch = require('./main.js')\n\nif(argv._.length === 0) {\n  console.error([\n    'Usage: watch <command> [...directory]',\n    '[--wait=<seconds>]',\n    '[--filter=<file>]',\n    '[--interval=<seconds>]',\n    '[--ignoreDotFiles]',\n    '[--ignoreUnreadable]',\n    '[--ignoreDirectoryPattern]',\n    '[--exit]'\n  ].join(' '))\n  process.exit()\n}\n\nvar watchTreeOpts = {}\nvar command = argv._[0]\nvar dirs = []\n\nvar i\nvar argLen = argv._.length\nif (argLen > 1) {\n  for(i = 1; i< argLen; i++) {\n      dirs.push(argv._[i])\n  }\n} else {\n  dirs.push(process.cwd())\n}\n\nvar waitTime = Number(argv.wait || argv.w)\nif (argv.interval || argv.i) {\n  watchTreeOpts.interval = Number(argv.interval || argv.i || 0.2);\n}\n\nvar exitShell = (argv.exit || argv.e);\n\nif(argv.ignoreDotFiles || argv.d)\n  watchTreeOpts.ignoreDotFiles = true\n\nif(argv.ignoreUnreadable || argv.u)\n  watchTreeOpts.ignoreUnreadableDir = true\n\nif(argv.ignoreDirectoryPattern || argv.p) {\n  var match = (argv.ignoreDirectoryPattern || argv.p).match(/^\\/(.*)\\/([gimuy]*)$/);\n  watchTreeOpts.ignoreDirectoryPattern = new RegExp(match[1], match[2])\n}\n\nif(argv.filter || argv.f) {\n  try {\n    console.log (argv.filter);\n    console.log (path.resolve(process.cwd(), argv.filter || argv.f));\n    watchTreeOpts.filter = require(path.resolve(process.cwd(), argv.filter || argv.f));\n    console.log (watchTreeOpts.filter);\n  } catch (e) {\n    console.error(e)\n    process.exit(1)\n  }\n}\n\nvar wait = false\nvar shell = null;\n\nvar dirLen = dirs.length\nvar skip = dirLen - 1\nfor(i = 0; i < dirLen; i++) {\n  var dir = dirs[i]\n  console.error('> Watching', dir)\n  watch.watchTree(dir, watchTreeOpts, function (f, curr, prev) {\n    if(skip) {\n        skip--\n        return\n    }\n    if(wait) return\n\n    try {\n      if(exitShell && shell != null) {\n        var isWin = /^win/.test(process.platform);\n        if(!isWin) {\n            shell.kill ();\n        } else {\n            cp.exec('taskkill /PID ' + shell.pid + ' /T /F', function(error, stdout, stderr) {\n            });\n        }\n      }\n      shell = execshell(command)\n    } catch (e) {\n      console.error (e);\n    }\n\n    if(waitTime > 0) {\n      wait = true\n      setTimeout(function () {\n        wait = false\n      }, waitTime * 1000)\n    }\n  })\n}\n"
  },
  {
    "path": "templates/bin/node/watch/main.js",
    "content": "// Copyright 2010-2011 Mikeal Rogers\n//\n//    Licensed under the Apache License, Version 2.0 (the \"License\");\n//    you may not use this file except in compliance with the License.\n//    You may obtain a copy of the License at\n//\n//        http://www.apache.org/licenses/LICENSE-2.0\n//\n//    Unless required by applicable law or agreed to in writing, software\n//    distributed under the License is distributed on an \"AS IS\" BASIS,\n//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//    See the License for the specific language governing permissions and\n//    limitations under the License.\n\nvar sys = require('util')\n  , fs = require('fs')\n  , path = require('path')\n  , events = require('events')\n  ;\n\nfunction walk (dir, options, callback) {\n  if (!callback) {callback = options; options = {}}\n  if (!callback.files) callback.files = {};\n  if (!callback.pending) callback.pending = 0;\n  callback.pending += 1;\n  fs.stat(dir, function (err, stat) {\n    if (err) return callback(err);\n    callback.files[dir] = stat;\n    fs.readdir(dir, function (err, files) {\n      if (err) {\n        if(err.code === 'EACCES' && options.ignoreUnreadableDir) return callback();\n        return callback(err);\n      }\n      callback.pending -= 1;\n      files.forEach(function (f, index) {\n        f = path.join(dir, f);\n        callback.pending += 1;\n        fs.stat(f, function (err, stat) {\n          var enoent = false\n            , done = false;\n\n          if (err) {\n            if (err.code !== 'ENOENT' && (err.code !== 'EPERM' && options.ignoreNotPermitted)) {\n              return callback(err);\n            } else {\n              enoent = true;\n            }\n          }\n          callback.pending -= 1;\n          done = callback.pending === 0;\n          if (!enoent) {\n            if (options.ignoreDotFiles && path.basename(f)[0] === '.') return done && callback(null, callback.files);\n            if (options.filter && !options.filter(f, stat)) return done && callback(null, callback.files);\n            callback.files[f] = stat;\n            if (stat.isDirectory() && !(options.ignoreDirectoryPattern && options.ignoreDirectoryPattern.test(f))) walk(f, options, callback);\n            done = callback.pending === 0;\n            if (done) callback(null, callback.files);\n          }\n        })\n      })\n      if (callback.pending === 0) callback(null, callback.files);\n    })\n    if (callback.pending === 0) callback(null, callback.files);\n  })\n\n}\n\nvar watchedFiles = Object.create(null);\n\nexports.watchTree = function ( root, options, callback ) {\n  if (!callback) {callback = options; options = {}}\n  walk(root, options, function (err, files) {\n    if (err) throw err;\n    var fileWatcher = function (f) {\n      var fsOptions = {};\n      if (options.interval) {\n        fsOptions.interval = options.interval * 1000;\n      }\n      fs.watchFile(f, fsOptions, function (c, p) {\n        // Check if anything actually changed in stat\n        if (files[f] && !files[f].isDirectory() && c.nlink !== 0 && files[f].mtime.getTime() == c.mtime.getTime()) return;\n        files[f] = c;\n        if (!files[f].isDirectory()) callback(f, c, p);\n        else {\n          fs.readdir(f, function (err, nfiles) {\n            if (err) return;\n            nfiles.forEach(function (b) {\n              var file = path.join(f, b);\n              if (!files[file] && (options.ignoreDotFiles !== true || b[0] != '.')) {\n                fs.stat(file, function (err, stat) {\n                  if (options.filter && !options.filter(file, stat)) return;\n                  callback(file, stat, null);\n                  files[file] = stat;\n                  fileWatcher(file);\n                })\n              }\n            })\n          })\n        }\n        if (c.nlink === 0) {\n          // unwatch removed files.\n          delete files[f]\n          fs.unwatchFile(f);\n        }\n      })\n    }\n    fileWatcher(root);\n    for (var i in files) {\n      fileWatcher(i);\n    }\n    watchedFiles[root] = files;\n    callback(files, null, null);\n  })\n}\n\nexports.unwatchTree = function (root) {\n  if (!watchedFiles[root]) return;\n  Object.keys(watchedFiles[root]).forEach(fs.unwatchFile);\n  watchedFiles[root] = false;\n};\n\nexports.createMonitor = function (root, options, cb) {\n  if (!cb) {cb = options; options = {}}\n  var monitor = new events.EventEmitter();\n  monitor.stop = exports.unwatchTree.bind(null, root);\n\n  var prevFile = {file: null,action: null,stat: null};\n  exports.watchTree(root, options, function (f, curr, prev) {\n    // if not curr, prev, but f is an object\n    if (typeof f == \"object\" && prev == null && curr === null) {\n      monitor.files = f;\n      return cb(monitor);\n    }\n\n    // if not prev and either prevFile.file is not f or prevFile.action is not created\n    if (!prev) {\n      if (prevFile.file != f || prevFile.action != \"created\") {\n        prevFile = { file: f, action: \"created\", stat: curr };\n        return monitor.emit(\"created\", f, curr);\n      }\n    }\n\n    // if curr.nlink is 0 and either prevFile.file is not f or prevFile.action is not removed\n    if (curr) {\n      if (curr.nlink === 0) {\n        if (prevFile.file != f || prevFile.action != \"removed\") {\n          prevFile = { file: f, action: \"removed\", stat: curr };\n          return monitor.emit(\"removed\", f, curr);\n        }\n      }\n    }\n\n    // if prevFile.file is null or prevFile.stat.mtime is not the same as curr.mtime\n    if (prevFile.file === null) {\n      return monitor.emit(\"changed\", f, curr, prev);\n    }\n    // stat might return null, so catch errors\n    try {\n      if (prevFile.stat.mtime.getTime() !== curr.mtime.getTime()) {\n        return monitor.emit(\"changed\", f, curr, prev);\n      }\n    } catch(e) {\n      return monitor.emit(\"changed\", f, curr, prev);\n    }\n  })\n}\n\nexports.walk = walk;\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/exec-sh/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Aleksandr Tsertkov <tsertkov@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/exec-sh/lib/exec-sh.js",
    "content": "var\n  cp = require(\"child_process\"),\n  merge = require(\"merge\");\n\nvar\n  sh, cmd,\n  defSpawnOptions = { stdio: \"inherit\" };\n\n/**\n * @summary Get shell program meta for current platform\n * @private\n * @returns {Object}\n */\nfunction getShell(){\n  if (process.platform === \"win32\") {\n    return { cmd: \"cmd\", arg: \"/C\" };\n  } else {\n    return { cmd: \"sh\", arg: \"-c\" };\n  }\n}\n\n/**\n * Callback is called with the output when the process terminates. Output is\n * available when true is passed as options argument or stdio: null set\n * within given options.\n *\n * @summary Execute shell command forwarding all stdio\n * @param {String|Array} command\n * @param {Object|TRUE} [options] spawn() options or TRUE to set stdio: null\n * @param {Function} [callback]\n * @returns {ChildProcess}\n */\nfunction execSh(command, options, callback){\n  if (Array.isArray(command)) {\n    command = command.join(\";\");\n  }\n\n  if (options === true) {\n    options = { stdio: null };\n  }\n\n  if (typeof options === \"function\") {\n    callback = options;\n    options = defSpawnOptions;\n  } else {\n    options = options || {};\n    options = merge(true, defSpawnOptions, options);\n    callback = callback || function(){};\n  }\n\n  var\n    child,\n    stdout = \"\", stderr = \"\",\n    shell = getShell();\n\n  try {\n    child = cp.spawn(shell.cmd, [shell.arg, command], options);\n  } catch (e) {\n    callback(e, stdout, stderr);\n    return;\n  }\n\n  if (child.stdout) {\n    child.stdout.on(\"data\", function(data){\n      stdout += data;\n    });\n  }\n\n  if (child.stderr) {\n    child.stderr.on(\"data\", function(data){\n      stderr += data;\n    });\n  }\n\n  child.on(\"close\", function(code){\n    if (code) {\n      var e = new Error(\"Shell command exit with non zero code: \" + code);\n      e.code = code;\n      callback(e, stdout, stderr);\n    } else {\n      callback(null, stdout, stderr);\n    }\n  });\n\n  return child;\n}\n\nmodule.exports = execSh;\n\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/exec-sh/package.json",
    "content": "{\n  \"_from\": \"exec-sh@^0.2.0\",\n  \"_id\": \"exec-sh@0.2.1\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==\",\n  \"_location\": \"/exec-sh\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"range\",\n    \"registry\": true,\n    \"raw\": \"exec-sh@^0.2.0\",\n    \"name\": \"exec-sh\",\n    \"escapedName\": \"exec-sh\",\n    \"rawSpec\": \"^0.2.0\",\n    \"saveSpec\": null,\n    \"fetchSpec\": \"^0.2.0\"\n  },\n  \"_requiredBy\": [\n    \"/watch\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz\",\n  \"_shasum\": \"163b98a6e89e6b65b47c2a28d215bc1f63989c38\",\n  \"_spec\": \"exec-sh@^0.2.0\",\n  \"_where\": \"C:\\\\Projects\\\\Personal\\\\SceneBuilderTest\\\\node_modules\\\\watch\",\n  \"author\": {\n    \"name\": \"Aleksandr Tsertkov\",\n    \"email\": \"tsertkov@gmail.com\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/tsertkov/exec-sh/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"dependencies\": {\n    \"merge\": \"^1.1.3\"\n  },\n  \"deprecated\": false,\n  \"description\": \"Execute shell command forwarding all stdio.\",\n  \"devDependencies\": {\n    \"coveralls\": \"^2.11.2\",\n    \"istanbul\": \"^0.3.2\",\n    \"jsdoc\": \"^3.3.0-alpha8\",\n    \"jshint\": \"^2.5.1\",\n    \"mocha\": \"^1.20.1\",\n    \"sinon\": \"^1.10.2\"\n  },\n  \"homepage\": \"https://github.com/tsertkov/exec-sh#readme\",\n  \"keywords\": [\n    \"exec\",\n    \"spawn\",\n    \"terminal\",\n    \"console\",\n    \"shell\",\n    \"command\",\n    \"child_process\"\n  ],\n  \"license\": {\n    \"type\": \"MIT\",\n    \"url\": \"https://github.com/tsertkov/exec-sh/blob/master/LICENSE\"\n  },\n  \"main\": \"lib/exec-sh.js\",\n  \"name\": \"exec-sh\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+ssh://git@github.com/tsertkov/exec-sh.git\"\n  },\n  \"scripts\": {\n    \"cover-test\": \"istanbul cover --dir artifacts/coverage _mocha -- --reporter spec\",\n    \"dev\": \"mocha --reporter spec --watch\",\n    \"jsdoc\": \"jsdoc --private --destination artifacts/jsdoc lib/\",\n    \"jshint\": \"jshint lib/ example/ test/ package.json\",\n    \"test\": \"npm run cover-test && npm run jshint\"\n  },\n  \"version\": \"0.2.1\"\n}\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/merge/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 yeikos - http://www.yeikos.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "templates/bin/node/watch/node_modules/merge/bower.json",
    "content": "{\n  \"name\": \"merge\",\n  \"version\": \"1.2.0\",\n  \"homepage\": \"https://github.com/yeikos/js.merge\",\n  \"authors\": [\n    \"yeikos <yeikos@gmail.com>\"\n  ],\n  \"description\": \"Merge multiple objects into one, optionally creating a new cloned object. Similar to the jQuery.extend but more flexible. Works in Node.js and the browser.\",\n  \"main\": \"merge.js\",\n  \"keywords\": [\n    \"merge\",\n    \"recursive\",\n    \"extend\",\n    \"clone\",\n    \"object\",\n    \"browser\"\n  ],\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"tests\"\n  ]\n}\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/merge/merge.js",
    "content": "/*!\n * @name JavaScript/NodeJS Merge v1.2.0\n * @author yeikos\n * @repository https://github.com/yeikos/js.merge\n\n * Copyright 2014 yeikos - MIT license\n * https://raw.github.com/yeikos/js.merge/master/LICENSE\n */\n\n;(function(isNode) {\n\n\t/**\n\t * Merge one or more objects \n\t * @param bool? clone\n\t * @param mixed,... arguments\n\t * @return object\n\t */\n\n\tvar Public = function(clone) {\n\n\t\treturn merge(clone === true, false, arguments);\n\n\t}, publicName = 'merge';\n\n\t/**\n\t * Merge two or more objects recursively \n\t * @param bool? clone\n\t * @param mixed,... arguments\n\t * @return object\n\t */\n\n\tPublic.recursive = function(clone) {\n\n\t\treturn merge(clone === true, true, arguments);\n\n\t};\n\n\t/**\n\t * Clone the input removing any reference\n\t * @param mixed input\n\t * @return mixed\n\t */\n\n\tPublic.clone = function(input) {\n\n\t\tvar output = input,\n\t\t\ttype = typeOf(input),\n\t\t\tindex, size;\n\n\t\tif (type === 'array') {\n\n\t\t\toutput = [];\n\t\t\tsize = input.length;\n\n\t\t\tfor (index=0;index<size;++index)\n\n\t\t\t\toutput[index] = Public.clone(input[index]);\n\n\t\t} else if (type === 'object') {\n\n\t\t\toutput = {};\n\n\t\t\tfor (index in input)\n\n\t\t\t\toutput[index] = Public.clone(input[index]);\n\n\t\t}\n\n\t\treturn output;\n\n\t};\n\n\t/**\n\t * Merge two objects recursively\n\t * @param mixed input\n\t * @param mixed extend\n\t * @return mixed\n\t */\n\n\tfunction merge_recursive(base, extend) {\n\n\t\tif (typeOf(base) !== 'object')\n\n\t\t\treturn extend;\n\n\t\tfor (var key in extend) {\n\n\t\t\tif (typeOf(base[key]) === 'object' && typeOf(extend[key]) === 'object') {\n\n\t\t\t\tbase[key] = merge_recursive(base[key], extend[key]);\n\n\t\t\t} else {\n\n\t\t\t\tbase[key] = extend[key];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn base;\n\n\t}\n\n\t/**\n\t * Merge two or more objects\n\t * @param bool clone\n\t * @param bool recursive\n\t * @param array argv\n\t * @return object\n\t */\n\n\tfunction merge(clone, recursive, argv) {\n\n\t\tvar result = argv[0],\n\t\t\tsize = argv.length;\n\n\t\tif (clone || typeOf(result) !== 'object')\n\n\t\t\tresult = {};\n\n\t\tfor (var index=0;index<size;++index) {\n\n\t\t\tvar item = argv[index],\n\n\t\t\t\ttype = typeOf(item);\n\n\t\t\tif (type !== 'object') continue;\n\n\t\t\tfor (var key in item) {\n\n\t\t\t\tvar sitem = clone ? Public.clone(item[key]) : item[key];\n\n\t\t\t\tif (recursive) {\n\n\t\t\t\t\tresult[key] = merge_recursive(result[key], sitem);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult[key] = sitem;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Get type of variable\n\t * @param mixed input\n\t * @return string\n\t *\n\t * @see http://jsperf.com/typeofvar\n\t */\n\n\tfunction typeOf(input) {\n\n\t\treturn ({}).toString.call(input).slice(8, -1).toLowerCase();\n\n\t}\n\n\tif (isNode) {\n\n\t\tmodule.exports = Public;\n\n\t} else {\n\n\t\twindow[publicName] = Public;\n\n\t}\n\n})(typeof module === 'object' && module && typeof module.exports === 'object' && module.exports);"
  },
  {
    "path": "templates/bin/node/watch/node_modules/merge/merge.min.js",
    "content": "/*! JavaScript/NodeJS Merge v1.2.0 | Copyright 2014 yeikos - MIT license | https://github.com/yeikos/js.merge */\n\n;(function(e){function r(e,t){if(s(e)!==\"object\")return t;for(var n in t){if(s(e[n])===\"object\"&&s(t[n])===\"object\"){e[n]=r(e[n],t[n])}else{e[n]=t[n]}}return e}function i(e,n,i){var o=i[0],u=i.length;if(e||s(o)!==\"object\")o={};for(var a=0;a<u;++a){var f=i[a],l=s(f);if(l!==\"object\")continue;for(var c in f){var h=e?t.clone(f[c]):f[c];if(n){o[c]=r(o[c],h)}else{o[c]=h}}}return o}function s(e){return{}.toString.call(e).slice(8,-1).toLowerCase()}var t=function(e){return i(e===true,false,arguments)},n=\"merge\";t.recursive=function(e){return i(e===true,true,arguments)};t.clone=function(e){var n=e,r=s(e),i,o;if(r===\"array\"){n=[];o=e.length;for(i=0;i<o;++i)n[i]=t.clone(e[i])}else if(r===\"object\"){n={};for(i in e)n[i]=t.clone(e[i])}return n};if(e){module.exports=t}else{window[n]=t}})(typeof module===\"object\"&&module&&typeof module.exports===\"object\"&&module.exports);"
  },
  {
    "path": "templates/bin/node/watch/node_modules/merge/package.json",
    "content": "{\n  \"_from\": \"merge@^1.1.3\",\n  \"_id\": \"merge@1.2.0\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=\",\n  \"_location\": \"/merge\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"range\",\n    \"registry\": true,\n    \"raw\": \"merge@^1.1.3\",\n    \"name\": \"merge\",\n    \"escapedName\": \"merge\",\n    \"rawSpec\": \"^1.1.3\",\n    \"saveSpec\": null,\n    \"fetchSpec\": \"^1.1.3\"\n  },\n  \"_requiredBy\": [\n    \"/exec-sh\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/merge/-/merge-1.2.0.tgz\",\n  \"_shasum\": \"7531e39d4949c281a66b8c5a6e0265e8b05894da\",\n  \"_spec\": \"merge@^1.1.3\",\n  \"_where\": \"C:\\\\Projects\\\\Personal\\\\SceneBuilderTest\\\\node_modules\\\\exec-sh\",\n  \"author\": {\n    \"name\": \"yeikos\",\n    \"url\": \"http://www.yeikos.com\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/yeikos/js.merge/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"deprecated\": false,\n  \"description\": \"Merge multiple objects into one, optionally creating a new cloned object. Similar to the jQuery.extend but more flexible. Works in Node.js and the browser.\",\n  \"homepage\": \"https://github.com/yeikos/js.merge\",\n  \"keywords\": [\n    \"merge\",\n    \"recursive\",\n    \"extend\",\n    \"clone\",\n    \"object\",\n    \"browser\"\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"merge.js\",\n  \"name\": \"merge\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/yeikos/js.merge.git\"\n  },\n  \"scripts\": {\n    \"test\": \"cd tests; node index.js\"\n  },\n  \"version\": \"1.2.0\"\n}\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/minimist/LICENSE",
    "content": "This software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/minimist/index.js",
    "content": "module.exports = function (args, opts) {\n    if (!opts) opts = {};\n    \n    var flags = { bools : {}, strings : {}, unknownFn: null };\n\n    if (typeof opts['unknown'] === 'function') {\n        flags.unknownFn = opts['unknown'];\n    }\n\n    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {\n      flags.allBools = true;\n    } else {\n      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {\n          flags.bools[key] = true;\n      });\n    }\n    \n    var aliases = {};\n    Object.keys(opts.alias || {}).forEach(function (key) {\n        aliases[key] = [].concat(opts.alias[key]);\n        aliases[key].forEach(function (x) {\n            aliases[x] = [key].concat(aliases[key].filter(function (y) {\n                return x !== y;\n            }));\n        });\n    });\n\n    [].concat(opts.string).filter(Boolean).forEach(function (key) {\n        flags.strings[key] = true;\n        if (aliases[key]) {\n            flags.strings[aliases[key]] = true;\n        }\n     });\n\n    var defaults = opts['default'] || {};\n    \n    var argv = { _ : [] };\n    Object.keys(flags.bools).forEach(function (key) {\n        setArg(key, defaults[key] === undefined ? false : defaults[key]);\n    });\n    \n    var notFlags = [];\n\n    if (args.indexOf('--') !== -1) {\n        notFlags = args.slice(args.indexOf('--')+1);\n        args = args.slice(0, args.indexOf('--'));\n    }\n\n    function argDefined(key, arg) {\n        return (flags.allBools && /^--[^=]+$/.test(arg)) ||\n            flags.strings[key] || flags.bools[key] || aliases[key];\n    }\n\n    function setArg (key, val, arg) {\n        if (arg && flags.unknownFn && !argDefined(key, arg)) {\n            if (flags.unknownFn(arg) === false) return;\n        }\n\n        var value = !flags.strings[key] && isNumber(val)\n            ? Number(val) : val\n        ;\n        setKey(argv, key.split('.'), value);\n        \n        (aliases[key] || []).forEach(function (x) {\n            setKey(argv, x.split('.'), value);\n        });\n    }\n\n    function setKey (obj, keys, value) {\n        var o = obj;\n        keys.slice(0,-1).forEach(function (key) {\n            if (o[key] === undefined) o[key] = {};\n            o = o[key];\n        });\n\n        var key = keys[keys.length - 1];\n        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {\n            o[key] = value;\n        }\n        else if (Array.isArray(o[key])) {\n            o[key].push(value);\n        }\n        else {\n            o[key] = [ o[key], value ];\n        }\n    }\n    \n    function aliasIsBoolean(key) {\n      return aliases[key].some(function (x) {\n          return flags.bools[x];\n      });\n    }\n\n    for (var i = 0; i < args.length; i++) {\n        var arg = args[i];\n        \n        if (/^--.+=/.test(arg)) {\n            // Using [\\s\\S] instead of . because js doesn't support the\n            // 'dotall' regex modifier. See:\n            // http://stackoverflow.com/a/1068308/13216\n            var m = arg.match(/^--([^=]+)=([\\s\\S]*)$/);\n            var key = m[1];\n            var value = m[2];\n            if (flags.bools[key]) {\n                value = value !== 'false';\n            }\n            setArg(key, value, arg);\n        }\n        else if (/^--no-.+/.test(arg)) {\n            var key = arg.match(/^--no-(.+)/)[1];\n            setArg(key, false, arg);\n        }\n        else if (/^--.+/.test(arg)) {\n            var key = arg.match(/^--(.+)/)[1];\n            var next = args[i + 1];\n            if (next !== undefined && !/^-/.test(next)\n            && !flags.bools[key]\n            && !flags.allBools\n            && (aliases[key] ? !aliasIsBoolean(key) : true)) {\n                setArg(key, next, arg);\n                i++;\n            }\n            else if (/^(true|false)$/.test(next)) {\n                setArg(key, next === 'true', arg);\n                i++;\n            }\n            else {\n                setArg(key, flags.strings[key] ? '' : true, arg);\n            }\n        }\n        else if (/^-[^-]+/.test(arg)) {\n            var letters = arg.slice(1,-1).split('');\n            \n            var broken = false;\n            for (var j = 0; j < letters.length; j++) {\n                var next = arg.slice(j+2);\n                \n                if (next === '-') {\n                    setArg(letters[j], next, arg)\n                    continue;\n                }\n                \n                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {\n                    setArg(letters[j], next.split('=')[1], arg);\n                    broken = true;\n                    break;\n                }\n                \n                if (/[A-Za-z]/.test(letters[j])\n                && /-?\\d+(\\.\\d*)?(e-?\\d+)?$/.test(next)) {\n                    setArg(letters[j], next, arg);\n                    broken = true;\n                    break;\n                }\n                \n                if (letters[j+1] && letters[j+1].match(/\\W/)) {\n                    setArg(letters[j], arg.slice(j+2), arg);\n                    broken = true;\n                    break;\n                }\n                else {\n                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);\n                }\n            }\n            \n            var key = arg.slice(-1)[0];\n            if (!broken && key !== '-') {\n                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])\n                && !flags.bools[key]\n                && (aliases[key] ? !aliasIsBoolean(key) : true)) {\n                    setArg(key, args[i+1], arg);\n                    i++;\n                }\n                else if (args[i+1] && /true|false/.test(args[i+1])) {\n                    setArg(key, args[i+1] === 'true', arg);\n                    i++;\n                }\n                else {\n                    setArg(key, flags.strings[key] ? '' : true, arg);\n                }\n            }\n        }\n        else {\n            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {\n                argv._.push(\n                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)\n                );\n            }\n            if (opts.stopEarly) {\n                argv._.push.apply(argv._, args.slice(i + 1));\n                break;\n            }\n        }\n    }\n    \n    Object.keys(defaults).forEach(function (key) {\n        if (!hasKey(argv, key.split('.'))) {\n            setKey(argv, key.split('.'), defaults[key]);\n            \n            (aliases[key] || []).forEach(function (x) {\n                setKey(argv, x.split('.'), defaults[key]);\n            });\n        }\n    });\n    \n    if (opts['--']) {\n        argv['--'] = new Array();\n        notFlags.forEach(function(key) {\n            argv['--'].push(key);\n        });\n    }\n    else {\n        notFlags.forEach(function(key) {\n            argv._.push(key);\n        });\n    }\n\n    return argv;\n};\n\nfunction hasKey (obj, keys) {\n    var o = obj;\n    keys.slice(0,-1).forEach(function (key) {\n        o = (o[key] || {});\n    });\n\n    var key = keys[keys.length - 1];\n    return key in o;\n}\n\nfunction isNumber (x) {\n    if (typeof x === 'number') return true;\n    if (/^0x[0-9a-f]+$/i.test(x)) return true;\n    return /^[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(e[-+]?\\d+)?$/.test(x);\n}\n\n"
  },
  {
    "path": "templates/bin/node/watch/node_modules/minimist/package.json",
    "content": "{\n  \"_from\": \"minimist@^1.2.0\",\n  \"_id\": \"minimist@1.2.0\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=\",\n  \"_location\": \"/minimist\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"range\",\n    \"registry\": true,\n    \"raw\": \"minimist@^1.2.0\",\n    \"name\": \"minimist\",\n    \"escapedName\": \"minimist\",\n    \"rawSpec\": \"^1.2.0\",\n    \"saveSpec\": null,\n    \"fetchSpec\": \"^1.2.0\"\n  },\n  \"_requiredBy\": [\n    \"/watch\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz\",\n  \"_shasum\": \"a35008b20f41383eec1fb914f4cd5df79a264284\",\n  \"_spec\": \"minimist@^1.2.0\",\n  \"_where\": \"C:\\\\Projects\\\\Personal\\\\SceneBuilderTest\\\\node_modules\\\\watch\",\n  \"author\": {\n    \"name\": \"James Halliday\",\n    \"email\": \"mail@substack.net\",\n    \"url\": \"http://substack.net\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/substack/minimist/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"deprecated\": false,\n  \"description\": \"parse argument options\",\n  \"devDependencies\": {\n    \"covert\": \"^1.0.0\",\n    \"tap\": \"~0.4.0\",\n    \"tape\": \"^3.5.0\"\n  },\n  \"homepage\": \"https://github.com/substack/minimist\",\n  \"keywords\": [\n    \"argv\",\n    \"getopt\",\n    \"parser\",\n    \"optimist\"\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"index.js\",\n  \"name\": \"minimist\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/substack/minimist.git\"\n  },\n  \"scripts\": {\n    \"coverage\": \"covert test/*.js\",\n    \"test\": \"tap test/*.js\"\n  },\n  \"testling\": {\n    \"files\": \"test/*.js\",\n    \"browsers\": [\n      \"ie/6..latest\",\n      \"ff/5\",\n      \"firefox/latest\",\n      \"chrome/10\",\n      \"chrome/latest\",\n      \"safari/5.1\",\n      \"safari/latest\",\n      \"opera/12\"\n    ]\n  },\n  \"version\": \"1.2.0\"\n}\n"
  },
  {
    "path": "templates/bin/node/watch/package.json",
    "content": "{\n  \"_from\": \"watch\",\n  \"_id\": \"watch@1.0.2\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=\",\n  \"_location\": \"/watch\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"tag\",\n    \"registry\": true,\n    \"raw\": \"watch\",\n    \"name\": \"watch\",\n    \"escapedName\": \"watch\",\n    \"rawSpec\": \"\",\n    \"saveSpec\": null,\n    \"fetchSpec\": \"latest\"\n  },\n  \"_requiredBy\": [\n    \"#DEV:/\",\n    \"#USER\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/watch/-/watch-1.0.2.tgz\",\n  \"_shasum\": \"340a717bde765726fa0aa07d721e0147a551df0c\",\n  \"_spec\": \"watch\",\n  \"_where\": \"C:\\\\Projects\\\\Personal\\\\SceneBuilderTest\",\n  \"author\": {\n    \"name\": \"Mikeal Rogers\",\n    \"email\": \"mikeal.rogers@gmail.com\"\n  },\n  \"bin\": {\n    \"watch\": \"./cli.js\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/mikeal/watch/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"dependencies\": {\n    \"exec-sh\": \"^0.2.0\",\n    \"minimist\": \"^1.2.0\"\n  },\n  \"deprecated\": false,\n  \"description\": \"Utilities for watching file trees.\",\n  \"directories\": {\n    \"lib\": \"lib\"\n  },\n  \"engines\": {\n    \"node\": \">=0.1.95\"\n  },\n  \"homepage\": \"https://github.com/mikeal/watch\",\n  \"keywords\": [\n    \"util\",\n    \"utility\",\n    \"fs\",\n    \"files\"\n  ],\n  \"license\": \"Apache-2.0\",\n  \"main\": \"./main\",\n  \"name\": \"watch\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/mikeal/watch.git\"\n  },\n  \"scripts\": {\n    \"release:major\": \"bash scripts/release.sh major\",\n    \"release:minor\": \"bash scripts/release.sh minor\",\n    \"release:patch\": \"bash scripts/release.sh patch\"\n  },\n  \"version\": \"1.0.2\"\n}\n"
  },
  {
    "path": "templates/blackberry/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D blackberry\n-debug\n"
  },
  {
    "path": "templates/blackberry/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D blackberry\n-D final\n"
  },
  {
    "path": "templates/blackberry/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D blackberry\n"
  },
  {
    "path": "templates/blackberry/template/bar-descriptor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>                                                                                                                               \n<qnx xmlns=\"http://www.qnx.com/schemas/application/1.0\">\n    \n\t<id>::APP_PACKAGE::</id>\n    <name>::APP_TITLE::</name>\n\t<description>::APP_DESCRIPTION::</description>\n\t\n\t<author>::APP_COMPANY::</author>\n    <authorId>::BLACKBERRY_AUTHOR_ID::</authorId>\n\t\n    <versionNumber>::APP_VERSION::</versionNumber>\n\t<buildId>::APP_BUILD_NUMBER::</buildId>\n    \n    <initialWindow>\n\t\t\n        <systemChrome>none</systemChrome>\n        <transparent>false</transparent>\n        <!-- <autoOrients>true</autoOrients> -->\n\t\t::if (WIN_ORIENTATION == \"landscape\")::<autoOrients>false</autoOrients><aspectRatio>landscape</aspectRatio>::end::\n\t\t::if (WIN_ORIENTATION == \"portrait\")::<autoOrients>false</autoOrients><aspectRatio>portrait</aspectRatio>::end::\n\t\t\n    </initialWindow>\n\t\n    <env var=\"LD_LIBRARY_PATH\" value=\"app/native\"/>\n    \n\t<action system=\"true\">run_native</action>\n    \n\t<category>core.games</category>\n    \n\t<asset entry=\"true\" path=\"::APP_FILE_SAFE::\" type=\"Qnx/Elf\">::APP_FILE_SAFE::</asset>\n\t<asset path=\".\">.</asset>\n\t\n\t::if (HAS_ICON)::<icon>\n\t::foreach ICONS::\t<image>::__current__::</image>\n\t::end::</icon>::end::\n\t\n    <!-- <splashscreen>splashscreen.png</splashscreen>-->\n\t\n</qnx>"
  },
  {
    "path": "templates/blackberry/template/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<widget xmlns=\"http://www.w3.org/ns/widgets\" xmlns:rim=\"http://www.blackberry.com/ns/widgets\" version=\"::APP_VERSION::\" id=\"::APP_PACKAGE::\">\n\t\n\t<!-- <author href=\"http://www.example.com/\" rim:copyright=\"Copyright 1998-2012 My Corp\">My Corp</author>-->\n\t<author>::APP_COMPANY::</author>\n\t\n\t<name>::APP_TITLE::</name>\n\t\n\t<description>::APP_DESCRIPTION::</description>\n\t\n\t<rim:permissions>\n\t\t<!-- <rim:permit>access_shared</rim:permit>\n\t\t<rim:permit>access_location_services</rim:permit>\n\t\t<rim:permit>use_camera</rim:permit> -->\n\t</rim:permissions>\n\t\n::if (HAS_ICON)::::foreach ICONS::\t<icon src=\"::__current__::\" />::end::::end::\n\t\n\t<!-- <rim:splash src=\"splash-1280x768.png\"/>\n\t<rim:splash src=\"splash-768x1280.png\"/> -->\n\t\n\t<content src=\"index.html\" rim:allowInvokeParams=\"true\"/>\n\t\n\t<feature id=\"blackberry.ui.dialog\"/>\n\t\n\t::if (WIN_ORIENTATION == \"landscape\")::<feature id=\"blackberry.app.orientation\">\n\t\t<param name=\"mode\" value=\"landscape\" />\n\t</feature>::end::\n\t\n\t::if (WIN_ORIENTATION == \"portrait\")::<feature id=\"blackberry.app.orientation\">\n\t\t<param name=\"mode\" value=\"portrait\" />\n\t</feature>::end::\n\t\n\t<feature id=\"blackberry.app\">\n\t\t<param name=\"backgroundColor\" value=\"0x::WIN_BACKGROUND::\" />\n\t</feature>\n\t\n\t<!-- <access uri=\"http://www.somedomain.com\" subdomains=\"true\">\n\t\t<feature id=\"blackberry.app\" required=\"true\" version=\"1.0.0\"/>\n\t\t<feature id=\"blackberry.invoke\" required=\"true\" version=\"1.0.0\"/>\n\t</access> -->\n\t\n\t<!-- <license href=\"http://www.example.com/\"/> -->\n\t\n</widget>"
  },
  {
    "path": "templates/cpp/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cpp ::CPP_DIR::\n-cp ::OUTPUT_DIR::/haxe\n--macro keep(\"::APP_MAIN::\")\n-debug\n"
  },
  {
    "path": "templates/cpp/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D final\n"
  },
  {
    "path": "templates/cpp/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n"
  },
  {
    "path": "templates/cpp/static/BuildMain.xml",
    "content": "<xml>\n\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\" />\n\n\t<set name=\"no_shared_libs\" value=\"1\" if=\"mingw\" />\n\n\t<include name=\"${HXCPP}/project/thirdparty/mbedtls-files.xml\" noerror=\"true\" />\n\t<set name=\"HAS_HXCPP_MBEDTLS_FILES\" value=\"1\" if=\"MBEDTLS_DIR\" />\n\t<include name=\"${HXCPP}/src/hx/libs/ssl/Build.xml\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\n\t<files id=\"main\">\n\n\t\t<file name=\"Main.cpp\" />\n\n\t</files>\n\n\t<target id=\"main\" output=\"Main${DBG}\" tool=\"linker\" toolid=\"exe\">\n\n\t\t<files id=\"main\" />\n\t\t<files id=\"mbedtls\" if=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\t\t<files id=\"hxcpp_ssl\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\t\t::foreach ndlls::\n\t\t<lib name=\"::path::\" />::end::\n\n\t\t<section if=\"windows\">\n\n\t\t\t<lib name=\"gdi32.lib\" />\n\t\t\t<lib name=\"opengl32.lib\" />\n\t\t\t<lib name=\"user32.lib\" />\n\t\t\t<lib name=\"kernel32.lib\" />\n\t\t\t<lib name=\"advapi32.lib\" />\n\t\t\t<lib name=\"winmm.lib\" />\n\t\t\t<lib name=\"imm32.lib\"  />\n\t\t\t<lib name=\"ole32.lib\" />\n\t\t\t<lib name=\"oleaut32.lib\" />\n\t\t\t<lib name=\"version.lib\" />\n\t\t\t<lib name=\"ws2_32.lib\"  />\n\t\t\t<lib name=\"wldap32.lib\" />\n\t\t\t<lib name=\"shell32.lib\" />\n\t\t\t<lib name=\"comdlg32.lib\" />\n\t\t\t<lib name=\"wbemuuid.lib\" />\n\t\t\t<lib name=\"comsuppw.lib\" unless=\"mingw\" />\n\t\t\t<lib name=\"usp10.lib\" />\n\t\t\t<lib name=\"rpcrt4.lib\" />\n\t\t\t<lib name=\"dwrite.lib\" />\n\t\t\t<lib name=\"setupapi.lib\" />\n\t\t\t<lib name=\"crypt32.lib\" />\n\n\t\t</section>\n\n\t\t<section if=\"linux\">\n\n\t\t\t<lib name=\"-lpthread\" />\n\t\t\t<lib name=\"-lrt\" />\n\n\t\t\t<lib name=\"-lgc\" if=\"LIME_NEKO\" />\n\t\t\t<lib name=\"-lm\" if=\"LIME_NEKO\" />\n\n\t\t</section>\n\n\t\t<section if=\"mac\">\n\n\t\t\t<vflag name=\"-l\" value=\"iconv\"/>\n\t\t\t<vflag name=\"-framework\" value=\"IOKit\" />\n\t\t\t<vflag name=\"-framework\" value=\"Foundation\" />\n\t\t\t<vflag name=\"-framework\" value=\"CoreAudio\" />\n\t\t\t<vflag name=\"-framework\" value=\"CoreVideo\" />\n\t\t\t<vflag name=\"-framework\" value=\"Cocoa\" />\n\t\t\t<vflag name=\"-framework\" value=\"OpenGL\" />\n\t\t\t<vflag name=\"-framework\" value=\"AudioToolbox\" />\n\t\t\t<vflag name=\"-framework\" value=\"AudioUnit\" />\n\t\t\t<vflag name=\"-framework\" value=\"ForceFeedback\" />\n\t\t\t<vflag name=\"-framework\" value=\"Carbon\" />\n\t\t\t<vflag name=\"-framework\" value=\"AppKit\" />\n\t\t\t<vflag name=\"-framework\" value=\"OpenAL\"/>\n\t\t\t<vflag name=\"-framework\" value=\"SystemConfiguration\"/>\n\n\t\t\t<lib name=\"/opt/local/lib/libgc.a\" if=\"LIME_NEKO\" />\n\t\t\t<lib name=\"-lm\" if=\"LIME_NEKO\" />\n\n\t\t</section>\n\n\t\t<section if=\"android\">\n\n\t\t\t<lib name=\"-Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit\" if=\"LIME_SDL\"/>\n\t\t\t<lib name=\"-ldl\" />\n\t\t\t<lib name=\"-llog\" />\n\t\t\t<lib name=\"-landroid\" />\n\t\t\t<lib name=\"-lEGL\" />\n\t\t\t<lib name=\"-lGLESv2\" />\n\t\t\t<lib name=\"-lGLESv1_CM\" />\n\t\t\t<lib name=\"-lOpenSLES\" />\n\n\t\t</section>\n\n\t\t<lib name=\"libApplicationMain${DBG}${LIBEXT}\" />\n\n\t</target>\n\n\t<target id=\"default\">\n\n\t\t<target id=\"main\" />\n\n\t</target>\n\n</xml>\n"
  },
  {
    "path": "templates/cpp/static/Main.cpp",
    "content": "#include <stdio.h>\n\n#if defined(HX_WINDOWS) && !defined(HXCPP_DEBUGGER)\n#include <windows.h>\n#endif\n\nextern \"C\" const char *hxRunLibrary ();\nextern \"C\" void hxcpp_set_top_of_stack ();\n\nextern \"C\" int zlib_register_prims ();\nextern \"C\" int lime_cairo_register_prims ();\nextern \"C\" int lime_openal_register_prims ();\n::foreach ndlls::::if (registerStatics)::\nextern \"C\" int ::nameSafe::_register_prims ();::end::::end::\n\n\n#if defined(HX_WINDOWS) && !defined(HXCPP_DEBUGGER)\nint __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {\n#else\nextern \"C\" int main(int argc, char *argv[]) {\n#endif\n\t\n\thxcpp_set_top_of_stack ();\n\t\n\tzlib_register_prims ();\n\tlime_cairo_register_prims ();\n\tlime_openal_register_prims ();\n\t::foreach ndlls::::if (registerStatics)::\n\t::nameSafe::_register_prims ();::end::::end::\n\t\n\tconst char *err = NULL;\n \terr = hxRunLibrary ();\n\t\n\tif (err) {\n\t\t\n\t\tprintf(\"Error: %s\\n\", err);\n\t\treturn -1;\n\t\t\n\t}\n\t\n\treturn 0;\n\t\n}\n"
  },
  {
    "path": "templates/cppia/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cppia ::CPPIA_FILE::\n--macro keep(\"::APP_MAIN::\")\n-debug"
  },
  {
    "path": "templates/cppia/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cppia ::CPPIA_FILE::\n--macro keep(\"::APP_MAIN::\")\n-D final"
  },
  {
    "path": "templates/cppia/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cppia ::CPPIA_FILE::\n--macro keep(\"::APP_MAIN::\")"
  },
  {
    "path": "templates/cs/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-D net-ver=40\n-cp ::OUTPUT_DIR::/haxe\n-cs ::OUTPUT_DIR::/obj\n--macro keep(\"::APP_MAIN::\")\n-debug"
  },
  {
    "path": "templates/cs/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-D net-ver=40\n-D real-position\n-cp ::OUTPUT_DIR::/haxe\n-cs ::OUTPUT_DIR::/obj\n--macro keep(\"::APP_MAIN::\")\n-D final"
  },
  {
    "path": "templates/cs/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-D net-ver=40\n-D real-position\n-cp ::OUTPUT_DIR::/haxe\n-cs ::OUTPUT_DIR::/obj\n--macro keep(\"::APP_MAIN::\")"
  },
  {
    "path": "templates/cs/src/cs/ndll/CFFICSLoader.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing haxe.lang;\n\nnamespace cs.ndll\n{\n    class CFFICSLoader\n    {\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        internal delegate IntPtr CFFILoaderDelegate(String inName);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int ValTypeDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int AllocKindDelegate();\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocAbstractDelegate(int arg1, IntPtr arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void FreeAbstractDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValToKindDelegate(IntPtr arg1, int arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValDataDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValArrayIntDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocBoolDelegate([MarshalAs(UnmanagedType.I1)]bool arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocNullDelegate();\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr CreateRootDelegate(IntPtr inValue);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr QueryRootDelegate(IntPtr inValue);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void DestroyRootDelegate(IntPtr inValue);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void ValGCDelegate(IntPtr arg1, CSAbstract.FinalizerDelegate arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate double ValNumberDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int ValStrLenDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValStringDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int ValIntDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocIntDelegate(int arg1);\n        \n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocArrayDelegate(int arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocArrayTypeDelegate(int arg1, hxValueType arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int ValArraySizeDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValArrayIDelegate(IntPtr arg1, int arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void ValArraySetIDelegate(IntPtr arg1, int arg2, IntPtr arg3);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void ValArrayPushDelegate(IntPtr arg1, IntPtr arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int ValIdDelegate(String arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void AllocFieldDelegate(IntPtr arg1, int arg2, IntPtr arg3);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValCall0Delegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocEmptyObjectDelegate();\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocStringLenDelegate(IntPtr inStr, int inLen);\n\n         [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocWStringLenDelegate(IntPtr inStr, int inLen);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocFloatDelegate(double arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr AllocBufferLenDelegate(int inLen);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr BufferDataDelegate(IntPtr inBuffer);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr BufferValDelegate(IntPtr b);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValToBufferDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void BufferSetSizeDelegate(IntPtr inBuffer, int inLen);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate int BufferSizeDelegate(IntPtr inBuffer);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr PinBufferDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void UnPinBufferDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr ValFieldDelegate(IntPtr arg1, int arg2);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate bool ValBoolDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void ValThrowDelegate(IntPtr arg1);\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr EmptyDelegate();\n\n        private enum hxValueType\n        {\n            valtUnknown = -1,\n            valtInt = 0xff,\n            valtNull = 0,\n            valtFloat = 1,\n            valtBool = 2,\n            valtString = 3,\n            valtObject = 4,\n            valtArray = 5,\n            valtFunction = 6,\n            valtEnum,\n            valtClass,\n            valtRoot = 0xff,\n            valtAbstractBase = 0x100,\n        };\n        \n        private static int sgKinds = (int)(hxValueType.valtAbstractBase + 2);\n\n        private static DelegateConverter<ValTypeDelegate> val_type;\n        private static DelegateConverter<AllocKindDelegate> alloc_kind;\n        private static DelegateConverter<AllocAbstractDelegate> alloc_abstract;\n        private static DelegateConverter<FreeAbstractDelegate> free_abstract;\n        private static DelegateConverter<ValToKindDelegate> val_to_kind;\n        private static DelegateConverter<ValDataDelegate> val_data;\n        private static DelegateConverter<ValArrayIntDelegate> val_array_int;\n        private static DelegateConverter<AllocBoolDelegate> alloc_bool;\n        private static DelegateConverter<AllocNullDelegate> alloc_null;\n        private static DelegateConverter<CreateRootDelegate> create_root;\n        private static DelegateConverter<QueryRootDelegate> query_root;\n        private static DelegateConverter<DestroyRootDelegate> destroy_root;\n        private static DelegateConverter<ValGCDelegate> val_gc;\n        private static DelegateConverter<ValNumberDelegate> val_number;\n        private static DelegateConverter<ValStrLenDelegate> val_strlen;\n        private static DelegateConverter<ValStringDelegate> val_string;\n        private static DelegateConverter<ValIntDelegate> val_int;\n        private static DelegateConverter<AllocIntDelegate> alloc_int;\n        private static DelegateConverter<AllocArrayDelegate> alloc_array;\n        private static DelegateConverter<AllocArrayTypeDelegate> alloc_array_type;\n        private static DelegateConverter<ValArraySizeDelegate> val_array_size;\n        private static DelegateConverter<ValArrayIDelegate> val_array_i;\n        private static DelegateConverter<ValArraySetIDelegate> val_array_set_i;\n        private static DelegateConverter<ValArrayPushDelegate> val_array_push;\n        private static DelegateConverter<ValIdDelegate> val_id;\n        private static DelegateConverter<AllocFieldDelegate> alloc_field;\n        private static DelegateConverter<ValCall0Delegate> val_call0;\n        private static DelegateConverter<AllocEmptyObjectDelegate> alloc_empty_object;\n        private static DelegateConverter<AllocStringLenDelegate> alloc_string_len;\n        private static DelegateConverter<AllocWStringLenDelegate> alloc_wstring_len;\n        private static DelegateConverter<AllocFloatDelegate> alloc_float;\n        private static DelegateConverter<AllocBufferLenDelegate> alloc_buffer_len;\n        private static DelegateConverter<BufferDataDelegate> buffer_data;\n        private static DelegateConverter<BufferValDelegate> buffer_val;\n        private static DelegateConverter<ValToBufferDelegate> val_to_buffer;\n        private static DelegateConverter<BufferSetSizeDelegate> buffer_set_size;\n        private static DelegateConverter<BufferSizeDelegate> buffer_size;\n        private static DelegateConverter<PinBufferDelegate> pin_buffer;\n        private static DelegateConverter<UnPinBufferDelegate> unpin_buffer;\n        private static DelegateConverter<ValFieldDelegate> val_field;\n        private static DelegateConverter<ValBoolDelegate> val_bool;\n         private static DelegateConverter<ValThrowDelegate> val_throw;\n        private static DelegateConverter<EmptyDelegate> empty;\n\n        private static int cs_val_type(IntPtr inArg1)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return (int)hxValueType.valtNull;\n\n            if (arg1 is Boolean)\n                return (int)hxValueType.valtBool;\n            else if (arg1 is sbyte ||\n                arg1 is byte ||\n                arg1 is short ||\n                arg1 is ushort ||\n                arg1 is int ||\n                arg1 is uint ||\n                arg1 is long ||\n                arg1 is ulong)\n                return (int)hxValueType.valtInt;\n            else if (arg1 is float ||\n                arg1 is double ||\n                arg1 is decimal)\n                return (int)hxValueType.valtFloat;\n            else if (arg1 is String)\n                return (int)hxValueType.valtString;\n            else if (arg1 is Array)\n                return (int)hxValueType.valtArray;\n            else if (arg1 is Function)\n                return (int)hxValueType.valtFunction;\n            else if (arg1.GetType().IsEnum)\n                return (int)hxValueType.valtEnum;\n            else if (arg1.GetType().IsClass)\n                return (int)hxValueType.valtClass;\n            else if (arg1 is DynamicObject)\n                return (int)hxValueType.valtObject;\n            else if (arg1 is CSAbstract)\n                return ((CSAbstract)arg1).Kind;\n\n            return (int)hxValueType.valtUnknown;\n        }\n\n        // Abstract types\n        private static int cs_alloc_kind()\n        {\n            return ++sgKinds;\n        }\n\n        private static IntPtr cs_alloc_abstract(int arg1, IntPtr arg2)\n        {\n            return CSHandleContainer.GetCurrent().CreateGCHandle(new CSAbstract(arg1, arg2));\n        }\n\n        private static void cs_free_abstract(IntPtr inArg1)\n        {\n            CSAbstract arg1 = (CSAbstract)HandleUtils.GetObjectFromIntPtr(inArg1);\n            arg1.Free();\n        }\n\n        private static IntPtr cs_val_to_kind(IntPtr inArg1, int arg2)\n        {\n            CSAbstract arg1 = (CSAbstract)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return IntPtr.Zero;\n\n            return arg1.Kind == arg2 ? arg1.Pointer : IntPtr.Zero;\n        }\n\n        private static IntPtr cs_val_data(IntPtr inArg1)\n        {\n            CSAbstract arg1 = (CSAbstract)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return IntPtr.Zero;\n\n            return arg1.Pointer;\n        }\n\n        private static IntPtr cs_val_array_int(IntPtr inArg1)\n        {\n            Array arg1 = (Array)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return IntPtr.Zero;\n            \n            Array<int> intHxArray = arg1 as Array<int>;\n            if (intHxArray != null)\n                return CSHandleContainer.GetCurrent().GetAddrOfBlittableObject(intHxArray.__a);\n            \n            return IntPtr.Zero;\n        }\n\n        private static IntPtr cs_alloc_bool(bool arg1)\n        {\n            return CSHandleContainer.GetCurrent().CreateGCHandle(arg1);\n        }\n\n        private static IntPtr cs_alloc_null()\n        {\n            return IntPtr.Zero;\n        }\n\n        private static IntPtr cs_create_root(IntPtr inValue)\n        {\n            object value = HandleUtils.GetObjectFromIntPtr(inValue);\n            GCHandle handle = GCHandle.Alloc(new CSPersistent(value));\n            return GCHandle.ToIntPtr(handle);\n        }\n\n        private static IntPtr cs_query_root(IntPtr inValue)\n        {\n            CSPersistent persistent = (CSPersistent)HandleUtils.GetObjectFromIntPtr(inValue);\n            return CSHandleContainer.GetCurrent().CreateGCHandle(persistent.Value);\n        }\n\n        private static void cs_destroy_root(IntPtr inValue)\n        {\n            GCHandle handle = GCHandle.FromIntPtr(inValue);\n            CSPersistent persistent = (CSPersistent)handle.Target;\n            handle.Free();\n        }\n\n        private static void cs_val_gc(IntPtr inArg1, CSAbstract.FinalizerDelegate arg2)\n        {\n            object value = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (value == null)\n                return;\n\n            if (value is CSAbstract)\n            {\n                CSAbstract arg1 = (CSAbstract)value;\n                arg1.Finalizer = arg2;\n            }\n            else\n            {\n                // TODO\n            }\n        }\n\n        private static double cs_val_number(IntPtr inArg1)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return 0;\n\n            if (arg1 is sbyte)\n                return (sbyte)arg1;\n            else if (arg1 is byte)\n                return (byte)arg1;\n            else if (arg1 is short)\n                return (short)arg1;\n            else if (arg1 is ushort)\n                return (ushort)arg1;\n            else if (arg1 is int)\n                return (int)arg1;\n            else if (arg1 is uint)\n                return (uint)arg1;\n            else if (arg1 is long)\n                return (long)arg1;\n            else if (arg1 is ulong)\n                return (ulong)arg1;\n            else if (arg1 is float)\n                return (float)arg1;\n            else if (arg1 is double)\n                return (double)arg1;\n            else if (arg1 is decimal)\n            {\n                decimal d = (decimal)(arg1);\n                return decimal.ToDouble(d);\n            }\n\n            return 0;\n        }\n\n        private static int cs_val_strlen(IntPtr inArg1)\n        {\n            String arg1 = (String)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return 0;\n\n            return Encoding.UTF8.GetByteCount(arg1);\n        }\n\n        private static IntPtr cs_val_string(IntPtr inArg1)\n        {\n            String arg1 = (String)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return IntPtr.Zero;\n\n            CSHandleContainer container = CSHandleContainer.GetCurrent();\n            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(arg1);\n            IntPtr memory = container.AllocateMemory(sizeof(byte) * (bytes.Length + 1));\n            Marshal.Copy(bytes, 0, memory, bytes.Length);\n            Marshal.WriteByte(memory, bytes.Length, 0);\n            return memory;\n        }\n\n        private static int cs_val_int(IntPtr inArg1)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return 0;\n\n            if (arg1 is sbyte)\n                return (sbyte)arg1;\n            else if (arg1 is byte)\n                return (byte)arg1;\n            else if (arg1 is short)\n                return (short)arg1;\n            else if (arg1 is ushort)\n                return (ushort)arg1;\n            else if (arg1 is int)\n                return (int)arg1;\n            else if (arg1 is uint)\n                return (int)(uint)arg1;\n            else if (arg1 is long)\n                return (int)(long)arg1;\n            else if (arg1 is ulong)\n                return (int)(ulong)arg1;\n            else if (arg1 is float)\n                return (int)(float)arg1;\n            else if (arg1 is double)\n                return (int)(double)arg1;\n            else if (arg1 is decimal)\n            {\n                decimal d = (decimal)arg1;\n                return decimal.ToInt32(d);\n            }\n\n            return 0;\n        }\n\n        private static IntPtr cs_alloc_int(int arg1)\n        {\n            return CSHandleContainer.GetCurrent().CreateGCHandle(arg1);\n        }\n\n        private static IntPtr cs_alloc_array(int arg1)\n        {\n            return CSHandleContainer.GetCurrent().CreateGCHandle(new Array<object>(new object[arg1]));\n        }\n\n        private static IntPtr cs_alloc_array_type(int arg1, hxValueType arg2)\n        {\n            Array arr;\n            switch(arg2)\n            {\n                case hxValueType.valtBool:\n                    arr = new Array<bool>(new bool[arg1]);\n                    break;\n                case hxValueType.valtInt:\n                    arr = new Array<int>(new int[arg1]);\n                    break;\n                case hxValueType.valtFloat:\n                    arr = new Array<double>(new double[arg1]);\n                    break;\n                case hxValueType.valtString:\n                    arr = new Array<String>(new String[arg1]);\n                    break;\n                case hxValueType.valtObject:\n                    arr = new Array<object>(new object[arg1]);\n                    break;\n                default:\n                    return IntPtr.Zero;\n            }\n            return CSHandleContainer.GetCurrent().CreateGCHandle(arr);\n        }\n\n        private static int cs_val_array_size(IntPtr inArg1)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 is Array<object>)\n                return ((Array<object>)arg1).length;\n            else if (arg1 is Array<bool>)\n                return ((Array<bool>)arg1).length;\n            else if (arg1 is Array<byte>)\n                return ((Array<byte>)arg1).length;\n            else if (arg1 is Array<sbyte>)\n                return ((Array<sbyte>)arg1).length;\n            else if (arg1 is Array<uint>)\n                return ((Array<uint>)arg1).length;\n            else if (arg1 is Array<int>)\n                return ((Array<int>)arg1).length;\n            else if (arg1 is Array<ulong>)\n                return ((Array<ulong>)arg1).length;\n            else if (arg1 is Array<long>)\n                return ((Array<long>)arg1).length;\n            else if (arg1 is Array<float>)\n                return ((Array<float>)arg1).length;\n            else if (arg1 is Array<double>)\n                return ((Array<double>)arg1).length;\n\n            return 0;\n        }\n\n        private static IntPtr cs_val_array_i(IntPtr inArg1, int arg2)\n        {\n            Array arg1 = (Array)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return IntPtr.Zero;\n\n            return CSHandleContainer.GetCurrent().CreateGCHandle(arg1[arg2]);\n        }\n\n        private static void cs_val_array_set_i(IntPtr inArg1, int arg2, IntPtr inArg3)\n        {\n            Array arg1 = (Array)HandleUtils.GetObjectFromIntPtr(inArg1);\n            object arg3 = HandleUtils.GetObjectFromIntPtr(inArg3);\n            if (arg1 == null)\n                return;\n            \n            arg1[arg2] = arg3;\n        }\n\n        private static void cs_val_array_push(IntPtr inArg1, IntPtr inArg2)\n        {\n            Array<object> arg1 = (Array<object>)HandleUtils.GetObjectFromIntPtr(inArg1);\n            object arg2 = HandleUtils.GetObjectFromIntPtr(inArg2);\n            if (arg1 == null)\n                return;\n            \n            arg1.push(arg2);\n        }\n\n        private static int cs_val_id(String arg1)\n        {\n            return CSHandleContainer.GetCurrent().GetId(arg1);\n        }\n\n        private static void cs_alloc_field(IntPtr inArg1, int arg2, IntPtr inArg3)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            object arg3 = HandleUtils.GetObjectFromIntPtr(inArg3);\n            if (arg1 == null)\n                throw new ArgumentNullException(\"Null object set\");\n\n            String field = CSHandleContainer.GetCurrent().GetStringFromId(arg2);\n            Reflect.setField(arg1, field, arg3);\n        }\n\n        private static IntPtr cs_val_field(IntPtr inArg1, int arg2)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                throw new ArgumentNullException(\"Null object get\");\n\n            CSHandleContainer container = CSHandleContainer.GetCurrent();\n            String field = container.GetStringFromId(arg2);\n            return container.CreateGCHandle(Reflect.field(arg1, field));\n        }\n\n        private static IntPtr cs_val_call0(IntPtr inArg1)\n        {\n            Function arg1 = (Function)HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                throw new ArgumentNullException(\"Null function call\");\n\n            return CSHandleContainer.GetCurrent().CreateGCHandle(arg1.__hx_invoke0_o());\n        }\n\n        private static IntPtr cs_alloc_empty_object()\n        {\n            return CSHandleContainer.GetCurrent().CreateGCHandle(new DynamicObject());\n        }\n\n        private static IntPtr cs_alloc_string_len(IntPtr inStr, int inLen)\n        {\n            byte[] bytes = new byte[inLen];\n            Marshal.Copy(inStr, bytes, 0, inLen);\n            String str = Encoding.UTF8.GetString(bytes, 0, inLen);\n            return CSHandleContainer.GetCurrent().CreateGCHandle(str);\n        }\n\n        private static IntPtr cs_alloc_wstring_len(IntPtr inStr, int inLen)\n        {\n            byte[] bytes;\n            String str;\n            int totalLen;\n            switch(Environment.OSVersion.Platform)\n            {\n                case PlatformID.Win32NT:\n                case PlatformID.Win32S:\n                case PlatformID.Win32Windows:\n                    totalLen = inLen * 2;\n                    bytes = new byte[totalLen];\n                    Marshal.Copy(inStr, bytes, 0, totalLen);\n                    str = Encoding.Unicode.GetString(bytes);\n                    return CSHandleContainer.GetCurrent().CreateGCHandle(str);\n                default:\n                    totalLen = inLen * 4;\n                    bytes = new byte[totalLen];\n                    Marshal.Copy(inStr, bytes, 0, totalLen);\n                    str = Encoding.UTF32.GetString(bytes);\n                    return CSHandleContainer.GetCurrent().CreateGCHandle(str);\n            }\n        }\n\n        private static IntPtr cs_alloc_float(double arg1)\n        {\n            return CSHandleContainer.GetCurrent().CreateGCHandle(arg1);\n        }\n\n        private static IntPtr cs_alloc_buffer_len(int inLen)\n        {\n            byte[] buffer = new byte[inLen];\n            return CSHandleContainer.GetCurrent().CreatePinnedGCHandle(buffer);\n        }\n\n        private static IntPtr cs_buffer_val(IntPtr b)\n        {\n            return b;\n        }\n\n        private static IntPtr cs_val_to_buffer(IntPtr arg1)\n        {\n            return arg1;\n        }\n\n        private static void cs_buffer_set_size(IntPtr inBuffer, int inLen)\n        {\n            byte[] buffer = (byte[])HandleUtils.GetObjectFromIntPtr(inBuffer);\n            if (buffer != null) {\n                System.Array.Resize<byte>(ref buffer, inLen);\n            }\n        }\n\n        private static int cs_buffer_size(IntPtr inBuffer)\n        {\n            byte[] buffer = (byte[])HandleUtils.GetObjectFromIntPtr(inBuffer);\n            if (buffer == null)\n                return 0;\n\n            return buffer.Length;\n        }\n\n        private static IntPtr cs_buffer_data(IntPtr inBuffer)\n        {\n            byte[] buffer = (byte[])HandleUtils.GetObjectFromIntPtr(inBuffer);\n            if (buffer == null)\n                return IntPtr.Zero;\n\n            return CSHandleContainer.GetCurrent().GetAddrOfBlittableObject(buffer);\n        }\n\n        private static IntPtr cs_pin_buffer(IntPtr inBuffer)\n        {\n            byte[] buffer = (byte[])GCHandle.FromIntPtr(inBuffer).Target;\n            return GCHandle.ToIntPtr(GCHandle.Alloc(buffer, GCHandleType.Pinned));\n        }\n\n        private static void cs_unpin_buffer(IntPtr inArg1)\n        {\n            GCHandle handle = GCHandle.FromIntPtr(inArg1);\n            handle.Free();\n        }\n\n        private static bool cs_val_bool(IntPtr inArg1)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            if (arg1 == null)\n                return false;\n\n            return (bool)arg1;\n        }\n\n        private static void cs_val_throw(IntPtr inArg1)\n        {\n            object arg1 = HandleUtils.GetObjectFromIntPtr(inArg1);\n            throw new Exception(arg1.ToString());\n        }\n\n        private static IntPtr cs_empty() { return IntPtr.Zero; }\n\n        static CFFICSLoader()\n        {\n            val_type = new DelegateConverter<ValTypeDelegate>(new ValTypeDelegate(cs_val_type));\n            alloc_kind = new DelegateConverter<AllocKindDelegate>(new AllocKindDelegate(cs_alloc_kind));\n            alloc_abstract = new DelegateConverter<AllocAbstractDelegate>(new AllocAbstractDelegate(cs_alloc_abstract));\n            free_abstract = new DelegateConverter<FreeAbstractDelegate>(new FreeAbstractDelegate(cs_free_abstract));\n            val_to_kind = new DelegateConverter<ValToKindDelegate>(new ValToKindDelegate(cs_val_to_kind));\n            val_data = new DelegateConverter<ValDataDelegate>(new ValDataDelegate(cs_val_data));\n            val_array_int = new DelegateConverter<ValArrayIntDelegate>(new ValArrayIntDelegate(cs_val_array_int));\n            alloc_bool = new DelegateConverter<AllocBoolDelegate>(new AllocBoolDelegate(cs_alloc_bool));\n            alloc_null = new DelegateConverter<AllocNullDelegate>(new AllocNullDelegate(cs_alloc_null));\n            create_root = new DelegateConverter<CreateRootDelegate>(new CreateRootDelegate(cs_create_root));\n            query_root = new DelegateConverter<QueryRootDelegate>(new QueryRootDelegate(cs_query_root));\n            destroy_root = new DelegateConverter<DestroyRootDelegate>(new DestroyRootDelegate(cs_destroy_root));\n            val_gc = new DelegateConverter<ValGCDelegate>(new ValGCDelegate(cs_val_gc));\n            val_number = new DelegateConverter<ValNumberDelegate>(new ValNumberDelegate(cs_val_number));\n            val_strlen = new DelegateConverter<ValStrLenDelegate>(new ValStrLenDelegate(cs_val_strlen));\n            val_string = new DelegateConverter<ValStringDelegate>(new ValStringDelegate(cs_val_string));\n            val_int = new DelegateConverter<ValIntDelegate>(new ValIntDelegate(cs_val_int));\n            alloc_int = new DelegateConverter<AllocIntDelegate>(new AllocIntDelegate(cs_alloc_int));\n            alloc_array = new DelegateConverter<AllocArrayDelegate>(new AllocArrayDelegate(cs_alloc_array));\n            alloc_array_type = new DelegateConverter<AllocArrayTypeDelegate>(new AllocArrayTypeDelegate(cs_alloc_array_type));\n            val_array_size = new DelegateConverter<ValArraySizeDelegate>(new ValArraySizeDelegate(cs_val_array_size));\n            val_array_i = new DelegateConverter<ValArrayIDelegate>(new ValArrayIDelegate(cs_val_array_i));\n            val_array_set_i = new DelegateConverter<ValArraySetIDelegate>(new ValArraySetIDelegate(cs_val_array_set_i));\n            val_array_push = new DelegateConverter<ValArrayPushDelegate>(new ValArrayPushDelegate(cs_val_array_push));\n            val_id = new DelegateConverter<ValIdDelegate>(new ValIdDelegate(cs_val_id));\n            alloc_field = new DelegateConverter<AllocFieldDelegate>(new AllocFieldDelegate(cs_alloc_field));\n            val_call0 = new DelegateConverter<ValCall0Delegate>(new ValCall0Delegate(cs_val_call0));\n            alloc_empty_object = new DelegateConverter<AllocEmptyObjectDelegate>(new AllocEmptyObjectDelegate(cs_alloc_empty_object));\n            alloc_string_len = new DelegateConverter<AllocStringLenDelegate>(new AllocStringLenDelegate(cs_alloc_string_len));\n            alloc_wstring_len = new DelegateConverter<AllocWStringLenDelegate>(new AllocWStringLenDelegate(cs_alloc_wstring_len));\n            alloc_float = new DelegateConverter<AllocFloatDelegate>(new AllocFloatDelegate(cs_alloc_float));\n            alloc_buffer_len = new DelegateConverter<AllocBufferLenDelegate>(new AllocBufferLenDelegate(cs_alloc_buffer_len));\n            buffer_data = new DelegateConverter<BufferDataDelegate>(new BufferDataDelegate(cs_buffer_data));\n            buffer_val = new DelegateConverter<BufferValDelegate>(new BufferValDelegate(cs_buffer_val));\n            val_to_buffer = new DelegateConverter<ValToBufferDelegate>(new ValToBufferDelegate(cs_val_to_buffer));\n            buffer_set_size = new DelegateConverter<BufferSetSizeDelegate>(new BufferSetSizeDelegate(cs_buffer_set_size));\n            buffer_size = new DelegateConverter<BufferSizeDelegate>(new BufferSizeDelegate(cs_buffer_size));\n            pin_buffer = new DelegateConverter<PinBufferDelegate>(new PinBufferDelegate(cs_pin_buffer));\n            unpin_buffer = new DelegateConverter<UnPinBufferDelegate>(new UnPinBufferDelegate(cs_unpin_buffer));\n            val_field = new DelegateConverter<ValFieldDelegate>(new ValFieldDelegate(cs_val_field));\n            val_bool = new DelegateConverter<ValBoolDelegate>(new ValBoolDelegate(cs_val_bool));\n            val_throw = new DelegateConverter<ValThrowDelegate>(new ValThrowDelegate(cs_val_throw));\n            empty = new DelegateConverter<EmptyDelegate>(new EmptyDelegate(cs_empty));\n        }\n\n        internal static IntPtr Load(String inName)\n        {\n            switch (inName)\n            {\n                case \"val_type\":\n                    return val_type.ToPointer();\n                case \"alloc_kind\":\n                    return alloc_kind.ToPointer();\n                case \"alloc_abstract\":\n                    return alloc_abstract.ToPointer();\n                case \"free_abstract\":\n                    return free_abstract.ToPointer();\n                case \"val_to_kind\":\n                    return val_to_kind.ToPointer();\n                case \"val_array_int\":\n                    return val_array_int.ToPointer();\n                case \"alloc_bool\":\n                    return alloc_bool.ToPointer();\n                case \"alloc_null\":\n                    return alloc_null.ToPointer();\n                case \"create_root\":\n                    return create_root.ToPointer();\n                case \"query_root\":\n                    return query_root.ToPointer();\n                case \"destroy_root\":\n                    return destroy_root.ToPointer();\n                case \"val_data\":\n                    return val_data.ToPointer();\n                case \"alloc_root\":\n                    return empty.ToPointer();\n                case \"val_gc\":\n                    return val_gc.ToPointer();\n                case \"val_number\":\n                    return val_number.ToPointer();\n                case \"val_strlen\":\n                    return val_strlen.ToPointer();\n                case \"val_string\":\n                    return val_string.ToPointer();\n                case \"val_int\":\n                    return val_int.ToPointer();\n                case \"alloc_int\":\n                    return alloc_int.ToPointer();\n                case \"alloc_array\":\n                    return alloc_array.ToPointer();\n                case \"alloc_array_type\":\n                    return alloc_array_type.ToPointer();\n                case \"val_array_size\":\n                    return val_array_size.ToPointer();\n                case \"val_array_i\":\n                    return val_array_i.ToPointer();\n                case \"val_array_set_i\":\n                    return val_array_set_i.ToPointer();\n                case \"val_array_push\":\n                    return val_array_push.ToPointer();\n                case \"val_id\":\n                    return val_id.ToPointer();\n                case \"alloc_field\":\n                    return alloc_field.ToPointer();\n                case \"val_call0\":\n                    return val_call0.ToPointer();\n                case \"alloc_empty_object\":\n                    return alloc_empty_object.ToPointer();\n                case \"alloc_string_len\":\n                    return alloc_string_len.ToPointer();\n                case \"alloc_wstring_len\":\n                    return alloc_wstring_len.ToPointer();\n                case \"alloc_float\":\n                    return alloc_float.ToPointer();\n                case \"alloc_buffer_len\":\n                    return alloc_buffer_len.ToPointer();\n                case \"buffer_data\":\n                    return buffer_data.ToPointer();\n                case \"buffer_val\":\n                    return buffer_val.ToPointer();\n                case \"val_to_buffer\":\n                    return val_to_buffer.ToPointer();\n                case \"buffer_set_size\":\n                    return buffer_set_size.ToPointer();\n                case \"buffer_size\":\n                    return buffer_size.ToPointer();\n                case \"pin_buffer\":\n                    return pin_buffer.ToPointer();\n                case \"unpin_buffer\":\n                    return unpin_buffer.ToPointer();\n                case \"val_field\":\n                    return val_field.ToPointer();\n                case \"val_bool\":\n                    return val_bool.ToPointer();\n                case \"val_throw\":\n                    return val_throw.ToPointer();\n            }\n\n            return IntPtr.Zero;\n        }\n    }\n}\n"
  },
  {
    "path": "templates/cs/src/cs/ndll/CSAbstract.cs",
    "content": "using System;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n    class CSAbstract : IDisposable\n    {\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        internal delegate IntPtr FinalizerDelegate(IntPtr arg1);\n\n        internal IntPtr Pointer { get; private set; }\n        internal int Kind { get; private set; }\n        private FinalizerDelegate finalizer;\n        internal FinalizerDelegate Finalizer\n        {\n            get\n            {\n                return finalizer;\n            }\n            set\n            {\n                if (disposed && value != null)\n                    throw new InvalidOperationException(\"Tried to set finalizer to disposed CSAbstract\");\n                if (finalizer != null && value != null)\n                    throw new InvalidOperationException(\"Finalizer is already set\");\n\n                finalizer = value;\n                if (finalizer == null)\n                {\n                    GC.SuppressFinalize(this);\n                    disposed = true;\n                }\n            }\n        }\n        private bool disposed;\n\n        internal CSAbstract(int kind, IntPtr ptr)\n        {\n            Pointer = ptr;\n            Kind = kind;\n            disposed = false;\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        private void Dispose(bool disposing)\n        {\n            if (disposed)\n                return;\n            disposed = true;\n            if (finalizer == null)\n                return;\n\n            GCHandle handle = GCHandle.Alloc(this, GCHandleType.Normal);\n            finalizer(GCHandle.ToIntPtr(handle));\n            handle.Free();\n        }\n\n        public void Free()\n        {\n            Pointer = IntPtr.Zero;\n            finalizer = null;\n            disposed = true;\n            GC.SuppressFinalize(this);\n        }\n\n        ~CSAbstract()\n        {\n            Dispose(false);\n        }\n    }\n}"
  },
  {
    "path": "templates/cs/src/cs/ndll/CSHandleContainer.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n    class CSHandleContainer : IDisposable\n    {\n        private bool disposed = false;\n        private System.Collections.Generic.Dictionary<string, int> sgNameToID;\n        private System.Collections.Generic.List<string> sgIDToName;\n\n        internal System.Collections.Generic.List<GCHandle> handles;\n        internal System.Collections.Generic.List<IntPtr> memoryList;\n\n        private static CSHandleContainer container;\n\n        private CSHandleContainer()\n        {\n            sgNameToID = new System.Collections.Generic.Dictionary<string, int>();\n            sgIDToName = new System.Collections.Generic.List<string>();\n\n            handles = new System.Collections.Generic.List<GCHandle>();\n            memoryList = new System.Collections.Generic.List<IntPtr>();\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        private void Dispose(bool disposing)\n        {\n            if (disposed)\n                return;\n\n            for (int i = 0; i < handles.Count; ++i)\n                handles[i].Free();\n\n            for (int i = 0; i < memoryList.Count; ++i)\n                Marshal.FreeHGlobal(memoryList[i]);\n\n            disposed = true;\n        }\n\n        ~CSHandleContainer()\n        {\n            Dispose(false);\n        }\n\n        internal int GetId(string key)\n        {\n            if (sgNameToID.ContainsKey(key))\n                return sgNameToID[key];\n            int idx = sgIDToName.Count;\n            sgIDToName.Add(key);\n            sgNameToID.Add(key, idx);\n            return idx;\n        }\n\n        internal string GetStringFromId(int id)\n        {\n            return sgIDToName[id];\n        }\n\n        internal IntPtr CreateGCHandle(Object value)\n        {\n            handles.Add(GCHandle.Alloc(value, GCHandleType.Normal));\n            return GCHandle.ToIntPtr(handles[handles.Count - 1]);\n        }\n\n        internal IntPtr CreatePinnedGCHandle(Object value)\n        {\n            handles.Add(GCHandle.Alloc(value, GCHandleType.Pinned));\n            return GCHandle.ToIntPtr(handles[handles.Count - 1]);\n        }\n\n        internal IntPtr GetAddrOfBlittableObject(Object value)\n        {\n            handles.Add(GCHandle.Alloc(value, GCHandleType.Pinned));\n            return handles[handles.Count - 1].AddrOfPinnedObject();\n        }\n\n        internal IntPtr AllocateMemory(int length)\n        {\n            IntPtr memory = Marshal.AllocHGlobal(length);\n            memoryList.Add(memory);\n            return memory;\n        }\n\n        internal void ResizeHandles(int handleSize, int memoryListSize)\n        {\n            int oldHandleSize = handles.Count;\n            for (int i = handleSize; i < oldHandleSize; ++i)\n            {\n                handles[i].Free();\n            }\n            handles.RemoveRange(handleSize, oldHandleSize - handleSize);\n\n            int oldMemoryListSize = memoryList.Count;\n            for (int i = memoryListSize; i < oldMemoryListSize; ++i)\n                Marshal.FreeHGlobal(memoryList[i]);\n            memoryList.RemoveRange(memoryListSize, oldMemoryListSize - memoryListSize);\n        }\n\n        internal static CSHandleContainer GetCurrent()\n        {\n            if (container == null)\n                container = new CSHandleContainer();\n        \n            return container;\n        }\n    \n    }\n}\n"
  },
  {
    "path": "templates/cs/src/cs/ndll/CSHandleScope.cs",
    "content": "﻿namespace cs.ndll\n{\n    struct CSHandleScope\n    {\n\t\tinternal static CSHandleScope Create()\n        {\n            CSHandleScope scope = new CSHandleScope();\n            CSHandleContainer container = CSHandleContainer.GetCurrent();\n            scope.handleIndex = container.handles.Count;\n            scope.memoryListIndex = container.memoryList.Count;\n            return scope;\n        }\n\n        internal void Destroy()\n        {\n            CSHandleContainer.GetCurrent().ResizeHandles(handleIndex, memoryListIndex);\n        }\n        \n\t\tprivate int handleIndex;\n        private int memoryListIndex;\n    };\n}"
  },
  {
    "path": "templates/cs/src/cs/ndll/CSPersistent.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n    class CSPersistent\n    {\n        internal object Value { get; private set; }\n\n        internal CSPersistent(object value)\n        {\n            Value = value;\n        }\n\n        internal void Destroy()\n        {\n            Value = null;\n        }\n    }\n}\n"
  },
  {
    "path": "templates/cs/src/cs/ndll/DelegateConverter.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n\tclass DelegateConverter<T> : IDisposable\n    {\n        private T func;\n        private IntPtr funcPtr;\n        private GCHandle handle;\n\n        internal DelegateConverter(T func)\n        {\n            this.func = func;\n        }\n\n        ~DelegateConverter()\n        {\n            Dispose(false);\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        private void Dispose(bool disposing)\n        {\n            if (!handle.IsAllocated)\n                return;\n\n            handle.Free();\n        }\n\n        internal IntPtr ToPointer()\n        {\n            if (!handle.IsAllocated)\n            {\n                funcPtr = Marshal.GetFunctionPointerForDelegate(func as Delegate);\n                handle = GCHandle.Alloc(funcPtr, GCHandleType.Pinned);\n            }\n            return (IntPtr)handle.Target;\n        }\n    }\n}"
  },
  {
    "path": "templates/cs/src/cs/ndll/HandleUtils.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n    class HandleUtils\n    {\n        internal static bool IsEmpty(GCHandle handle)\n        {\n            if (handle == null)\n                return true;\n            else if (handle.Target == null)\n                return true;\n            \n            return false;\n        }\n\n        internal static object GetObjectFromIntPtr(IntPtr ptr)\n        {\n            if (ptr == IntPtr.Zero)\n                return null;\n\n            return GCHandle.FromIntPtr(ptr).Target;\n        }\n    }\n}\n"
  },
  {
    "path": "templates/cs/src/cs/ndll/NDLLFunction.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n    public class NDLLFunction : IDisposable\n    {\n        private IntPtr module;\n        private Delegate func;\n        private int numArgs;\n        private static CFFICSLoader.CFFILoaderDelegate loaderDelegate;\n        private static GCHandle pinnedLoaderFunc;\n        public static String LibraryDir = null;\n        public static String LibraryPrefix = \"\";\n        public static String LibrarySuffix = \".ndll\";\n\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr NDLLFunctionDelegate();\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate void HxSetLoaderDelegate(IntPtr loader);\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr CallMultDelegate(IntPtr args);\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr Call0Delegate();\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr Call1Delegate(IntPtr arg1);\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr Call2Delegate(IntPtr arg1, IntPtr arg2);\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr Call3Delegate(IntPtr arg1, IntPtr arg2, IntPtr arg3);\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr Call4Delegate(IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4);\n        [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]\n        private delegate IntPtr Call5Delegate(IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5);\n\n        NDLLFunction(IntPtr module, Delegate func, int numArgs)\n        {\n            this.module = module;\n            this.func = func;\n            this.numArgs = numArgs;\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        private void Dispose(bool disposing)\n        {\n            if (module != IntPtr.Zero)\n            {\n                NativeMethods.FreeLibraryWrap(module);\n                module = IntPtr.Zero;\n            }\n        }\n\n        ~NDLLFunction()\n        {\n            Dispose(false);\n        }\n\n        public static NDLLFunction Load(String lib, String name, int numArgs)\n        {\n            if (numArgs < -1 || numArgs > 5)\n                throw new ArgumentOutOfRangeException(\"Invalid numArgs: \" + numArgs);\n\n            IntPtr module = IntPtr.Zero;\n            try\n            {\n                if (LibraryDir != null && (lib.StartsWith(\"./\") || lib.StartsWith(\".\\\\\")))\n                    lib = LibraryDir + Path.DirectorySeparatorChar + LibraryPrefix + lib.Substring(2) + LibrarySuffix;\n                else\n                    lib = lib + LibrarySuffix;\n                module = NativeMethods.LoadLibraryWrap(lib);\n                if (module == IntPtr.Zero)\n                    return null;\n\n                String funcName;\n                if (numArgs != -1)\n                    funcName = String.Format(\"{0}__{1}\", name, numArgs);\n                else\n                    funcName = String.Format(\"{0}__MULT\", name);\n\n                IntPtr funcPtr = NativeMethods.GetProcAddressWrap(module, funcName);\n                if (funcPtr == IntPtr.Zero)\n                    return null;\n                NDLLFunctionDelegate func = (NDLLFunctionDelegate)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(NDLLFunctionDelegate));\n                Delegate cfunc = null;\n                switch (numArgs)\n                {\n                    case -1:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(CallMultDelegate));\n                        break;\n                    case 0:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(Call0Delegate));\n                        break;\n                    case 1:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(Call1Delegate));\n                        break;\n                    case 2:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(Call2Delegate));\n                        break;\n                    case 3:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(Call3Delegate));\n                        break;\n                    case 4:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(Call4Delegate));\n                        break;\n                    case 5:\n                        cfunc = Marshal.GetDelegateForFunctionPointer(func(), typeof(Call5Delegate));\n                        break;\n                }\n\n                IntPtr dll_hx_set_loader_ptr = NativeMethods.GetProcAddressWrap(module, \"hx_set_loader\");\n                if (dll_hx_set_loader_ptr == IntPtr.Zero)\n                    return null;\n                HxSetLoaderDelegate dll_hx_set_loader = (HxSetLoaderDelegate)Marshal.GetDelegateForFunctionPointer(dll_hx_set_loader_ptr, typeof(HxSetLoaderDelegate));\n                IntPtr callbackPtr;\n                if (loaderDelegate == null)\n                {\n                    loaderDelegate = new CFFICSLoader.CFFILoaderDelegate(CFFICSLoader.Load);\n                    callbackPtr = Marshal.GetFunctionPointerForDelegate(loaderDelegate);\n                    pinnedLoaderFunc = GCHandle.Alloc(callbackPtr, GCHandleType.Pinned);\n                }\n                else\n                {\n                    callbackPtr = (IntPtr)pinnedLoaderFunc.Target;\n                }\n\n                dll_hx_set_loader(callbackPtr);\n\n                NDLLFunction ndllFunc = new NDLLFunction(module, cfunc, numArgs);\n                module = IntPtr.Zero;\n                return ndllFunc;\n            }\n            finally\n            {\n                if (module != IntPtr.Zero)\n                    NativeMethods.FreeLibraryWrap(module);\n            }\n        }\n\n        public object CallMult(Array args)\n        {\n            if (numArgs != -1)\n                throw new InvalidOperationException();\n            \n            Array<object> hxArray = (Array<object>)args;\n            CSHandleScope scope = CSHandleScope.Create();\n            GCHandle[] handles = new GCHandle[hxArray.length];\n            for (int i = 0; i < hxArray.length; ++i)\n                handles[i] = GCHandle.Alloc(hxArray[i]);\n            IntPtr[] pointers = new IntPtr[hxArray.length];\n            for (int i = 0; i < hxArray.length; ++i)\n                pointers[i] = GCHandle.ToIntPtr(handles[i]);\n            GCHandle pinnedArray = GCHandle.Alloc(pointers, GCHandleType.Pinned);\n\n            CallMultDelegate cfunc = (CallMultDelegate)func;\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc(pinnedArray.AddrOfPinnedObject()));\n            scope.Destroy();\n            for (int i = 0; i < hxArray.length; ++i)\n                handles[i].Free();\n            pinnedArray.Free();\n            return result;\n        }\n\n        public object Call0()\n        {\n            if (numArgs != 0)\n                throw new InvalidOperationException();\n\n            CSHandleScope scope = CSHandleScope.Create();\n            Call0Delegate cfunc = (Call0Delegate)func;\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc());\n            scope.Destroy();\n            return result;\n        }\n\n        public object Call1(object arg1)\n        {\n            if (numArgs != 1)\n                throw new InvalidOperationException();\n\n            CSHandleScope scope = CSHandleScope.Create();\n            Call1Delegate cfunc = (Call1Delegate)func;\n            GCHandle gch1 = GCHandle.Alloc(arg1);\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc(GCHandle.ToIntPtr(gch1)));\n            scope.Destroy();\n            gch1.Free();\n            return result;\n        }\n\n        public object Call2(object arg1, object arg2)\n        {\n            if (numArgs != 2)\n                throw new InvalidOperationException();\n\n            CSHandleScope scope = CSHandleScope.Create();\n            Call2Delegate cfunc = (Call2Delegate)func;\n            GCHandle gch1 = GCHandle.Alloc(arg1);\n            GCHandle gch2 = GCHandle.Alloc(arg2);\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc(GCHandle.ToIntPtr(gch1), GCHandle.ToIntPtr(gch2)));\n            scope.Destroy();\n            gch1.Free();\n            gch2.Free();\n            return result;\n        }\n\n        public object Call3(object arg1, object arg2, object arg3)\n        {\n            if (numArgs != 3)\n                throw new InvalidOperationException();\n\n            CSHandleScope scope = CSHandleScope.Create();\n            Call3Delegate cfunc = (Call3Delegate)func;\n            GCHandle gch1 = GCHandle.Alloc(arg1);\n            GCHandle gch2 = GCHandle.Alloc(arg2);\n            GCHandle gch3 = GCHandle.Alloc(arg3);\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc(GCHandle.ToIntPtr(gch1), GCHandle.ToIntPtr(gch2), GCHandle.ToIntPtr(gch3)));\n            scope.Destroy();\n            gch1.Free();\n            gch2.Free();\n            gch3.Free();\n            return result;\n        }\n\n        public object Call4(Object arg1, Object arg2, Object arg3, Object arg4)\n        {\n            if (numArgs != 4)\n                throw new InvalidOperationException();\n\n            CSHandleScope scope = CSHandleScope.Create();\n            Call4Delegate cfunc = (Call4Delegate)func;\n            GCHandle gch1 = GCHandle.Alloc(arg1);\n            GCHandle gch2 = GCHandle.Alloc(arg2);\n            GCHandle gch3 = GCHandle.Alloc(arg3);\n            GCHandle gch4 = GCHandle.Alloc(arg4);\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc(GCHandle.ToIntPtr(gch1), GCHandle.ToIntPtr(gch2), GCHandle.ToIntPtr(gch3), GCHandle.ToIntPtr(gch4)));\n            scope.Destroy();\n            gch1.Free();\n            gch2.Free();\n            gch3.Free();\n            gch4.Free();\n            return result;\n        }\n\n        public Object Call5(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)\n        {\n            if (numArgs != 5)\n                throw new InvalidOperationException();\n\n            CSHandleScope scope = CSHandleScope.Create();\n            Call5Delegate cfunc = (Call5Delegate)func;\n            GCHandle gch1 = GCHandle.Alloc(arg1);\n            GCHandle gch2 = GCHandle.Alloc(arg2);\n            GCHandle gch3 = GCHandle.Alloc(arg3);\n            GCHandle gch4 = GCHandle.Alloc(arg4);\n            GCHandle gch5 = GCHandle.Alloc(arg5);\n            object result = HandleUtils.GetObjectFromIntPtr(cfunc(GCHandle.ToIntPtr(gch1),\n                GCHandle.ToIntPtr(gch2), GCHandle.ToIntPtr(gch3), GCHandle.ToIntPtr(gch4), GCHandle.ToIntPtr(gch5)));\n            scope.Destroy();\n            gch1.Free();\n            gch2.Free();\n            gch3.Free();\n            gch4.Free();\n            gch5.Free();\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "templates/cs/src/cs/ndll/NativeMethods.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace cs.ndll\n{\n    class NativeMethods\n    {\n        public static IntPtr LoadLibraryWrap(String filename)\n        {\n            switch(Environment.OSVersion.Platform)\n            {\n                case PlatformID.Win32NT:\n                case PlatformID.Win32S:\n                case PlatformID.Win32Windows:\n                    return LoadLibrary(filename);\n                default:\n                    return dlopen(filename, RTLD_NOW);\n            }\n        }\n\n        public static void FreeLibraryWrap(IntPtr handle)\n        {\n            switch(Environment.OSVersion.Platform)\n            {\n                case PlatformID.Win32NT:\n                case PlatformID.Win32S:\n                case PlatformID.Win32Windows:\n                    FreeLibrary(handle);\n                    break;\n                default:\n                    dlclose(handle);\n                    break;\n            }\n        }\n\n        public static IntPtr GetProcAddressWrap(IntPtr handle, String symbol)\n        {\n            switch(Environment.OSVersion.Platform)\n            {\n                case PlatformID.Win32NT:\n                case PlatformID.Win32S:\n                case PlatformID.Win32Windows:\n                    return GetProcAddress(handle, symbol);\n                default:\n                    return dlsym(handle, symbol);\n            }\n        }\n\n        internal const int RTLD_NOW = 2;\n\n        [DllImport(\"kernel32\", CharSet = CharSet.Unicode, SetLastError = true)]\n        private static extern IntPtr LoadLibrary(String lpFileName);\n        [DllImport(\"kernel32\", SetLastError = true)]\n        private static extern bool FreeLibrary(IntPtr hModule);\n        [DllImport(\"kernel32\", SetLastError = true, ExactSpelling = false, BestFitMapping = false, ThrowOnUnmappableChar = true)]\n        private static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)]String lpProcName);\n        [DllImport(\"dl\", BestFitMapping = false, ThrowOnUnmappableChar = true)]\n        private static extern IntPtr dlopen([MarshalAs(UnmanagedType.LPTStr)]String filename, int flags);\n        [DllImport(\"dl\")]\n        private static extern int dlclose(IntPtr handle);\n        [DllImport(\"dl\", BestFitMapping = false, ThrowOnUnmappableChar = true)]\n        private static extern IntPtr dlsym(IntPtr handle, [MarshalAs(UnmanagedType.LPTStr)] String symbol);\n    }\n}\n"
  },
  {
    "path": "templates/electron/haxe/ElectronSetup.hx",
    "content": "package;\n\nclass ElectronSetup\n{\n\tpublic static var window:ElectronBrowserWindow;\n\n\tstatic function main()\n\t{\n\t\tElectronApp.commandLine.appendSwitch('ignore-gpu-blacklist', 'true');\n\n\t\tvar windows:Array<OpenFLWindow> = [\n\t\t\t::foreach windows::\n\t\t\t{\n\t\t\t\tallowHighDPI: ::allowHighDPI::,\n\t\t\t\talwaysOnTop: ::alwaysOnTop::,\n\t\t\t\tantialiasing: ::antialiasing::,\n\t\t\t\tbackground: ::background::,\n\t\t\t\tborderless: ::borderless::,\n\t\t\t\tcolorDepth: ::colorDepth::,\n\t\t\t\tdepthBuffer: ::depthBuffer::,\n\t\t\t\tdisplay: ::display::,\n\t\t\t\tfullscreen: ::fullscreen::,\n\t\t\t\thardware: ::hardware::,\n\t\t\t\theight: ::height::,\n\t\t\t\thidden: #if munit true #else ::hidden:: #end,\n\t\t\t\tmaximized: ::maximized::,\n\t\t\t\tminimized: ::minimized::,\n\t\t\t\tparameters: ::parameters::,\n\t\t\t\tresizable: ::resizable::,\n\t\t\t\tstencilBuffer: ::stencilBuffer::,\n\t\t\t\ttitle: \"::title::\",\n\t\t\t\tvsync: ::vsync::,\n\t\t\t\twidth: ::width::,\n\t\t\t\tx: ::x::,\n\t\t\t\ty: ::y::\n\t\t\t},::end::\n\t\t];\n\n\t\tfor (i in 0...windows.length)\n\t\t{\n\t\t\tvar window:OpenFLWindow = windows[i];\n\t\t\tvar width:Int = window.width;\n\t\t\tvar height:Int = window.height;\n\t\t\tif (width == 0) width = 800;\n\t\t\tif (height == 0) height = 600;\n\t\t\tvar frame:Bool = window.borderless == false;\n\n\t\t\tElectronApp.commandLine.appendSwitch('--autoplay-policy', 'no-user-gesture-required');\n\n\t\t\tElectronApp.on('ready', function(e)\n\t\t\t{\n\t\t\t\tvar config:Dynamic =\n\t\t\t\t\t{\n\t\t\t\t\t\twebPreferences:{\n\t\t\t\t\t\t\tnodeIntegration:true\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfullscreen: window.fullscreen,\n\t\t\t\t\t\tframe: frame,\n\t\t\t\t\t\tresizable: window.resizable,\n\t\t\t\t\t\talwaysOnTop: window.alwaysOnTop,\n\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\theight: height,\n\t\t\t\t\t\twebgl: window.hardware\n\t\t\t\t\t};\n\t\t\t\tElectronSetup.window = new ElectronBrowserWindow(config);\n\n\t\t\t\tElectronSetup.window.on('closed', function()\n\t\t\t\t{\n\t\t\t\t\tif (js.Node.process.platform != 'darwin')\n\t\t\t\t\t{\n\t\t\t\t\t\tElectronApp.quit();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tElectronSetup.window.loadURL('file://' + js.Node.__dirname + '/index.html');\n\t\t\t\t#if (debug && !suppress_devtools)\n\t\t\t\tElectronSetup.window.webContents.openDevTools();\n\t\t\t\t#end\n\t\t\t});\n\t\t}\n\t}\n}\n\ntypedef OpenFLWindow =\n{\n\tallowHighDPI:Bool,\n\talwaysOnTop:Bool,\n\tantialiasing:Int,\n\tbackground:UInt,\n\tborderless:Bool,\n\tcolorDepth:Int,\n\tdepthBuffer:Bool,\n\tdisplay:Dynamic,\n\tfullscreen:Bool,\n\thardware:Dynamic,\n\theight:Int,\n\thidden:Bool,\n\tmaximized:Bool,\n\tminimized:Bool,\n\tparameters:Dynamic,\n\tresizable:Bool,\n\tstencilBuffer:Bool,\n\ttitle:String,\n\tvsync:Bool,\n\twidth:Int,\n\tx:Int,\n\ty:Int\n}\n\n// Externs to compile without requiring hxelectron\n\n@:jsRequire(\"electron\", \"app\") extern class ElectronApp\n{\n\tpublic static var commandLine:Dynamic;\n\tpublic static function on(type:Dynamic, callback:Dynamic):Dynamic;\n\tpublic static function quit():Void;\n}\n\n@:jsRequire(\"electron\", \"BrowserWindow\") extern class ElectronBrowserWindow\n{\n\tpublic var webContents:Dynamic;\n\tpublic function new(?options:Dynamic);\n\tpublic function loadURL(url:String, ?options:Dynamic):Dynamic;\n\tpublic function on(type:Dynamic, callback:Dynamic):Dynamic;\n}\n"
  },
  {
    "path": "templates/electron/hxml/debug.hxml",
    "content": "--each\n\n--next\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-main ApplicationMain ::HAXE_FLAGS::\n\n-D electron\n-D html5\n-D html\n-debug\n\n--next\n-js ::OUTPUT_DIR::/bin/ElectronSetup.js\n-cp ::OUTPUT_DIR::/haxe\n-main ElectronSetup\n-lib hxnodejs\n-dce full\n\n-D electron\n-D html5\n-D html\n-debug\n"
  },
  {
    "path": "templates/electron/hxml/final.hxml",
    "content": "--each\n\n--next\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-main ApplicationMain ::HAXE_FLAGS::\n\n-D electron\n-D html5\n-D html\n\n--next\n-js ::OUTPUT_DIR::/bin/ElectronSetup.js\n-cp ::OUTPUT_DIR::/haxe\n-main ElectronSetup\n-lib hxnodejs\n-dce full\n\n-D electron\n-D html5\n-D html\n-D final\n-D js-flatten\n-dce full\n"
  },
  {
    "path": "templates/electron/hxml/release.hxml",
    "content": "--each\n\n--next\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-main ApplicationMain ::HAXE_FLAGS::\n\n-D electron\n-D html5\n-D html\n\n--next\n-js ::OUTPUT_DIR::/bin/ElectronSetup.js\n-cp ::OUTPUT_DIR::/haxe\n-main ElectronSetup\n-lib hxnodejs\n-dce full\n\n-D electron\n-D html5\n-D html\n"
  },
  {
    "path": "templates/electron/template/package.json",
    "content": "{\n    \"name\": \"::meta.packageName::\",\n    \"version\": \"::meta.version::\",\n    \"main\": \"ElectronSetup.js\",\n    \"scripts\": {\n        \"start\": \"electron ElectronSetup.js\"\n    },\n    \"devDependencies\": {\n        \"electron\": \"^18.0.4\"\n    }\n}\n"
  },
  {
    "path": "templates/extension/.gitignore",
    "content": "project/obj/\n.DS_Store\n\n# Examples of other files you might choose to ignore\n#*.zip\n#ndll/*/*.a\n#ndll/*/*.so\n#ndll/*/*.ndll\n#ndll/*/*.hash\n"
  },
  {
    "path": "templates/extension/Extension.hx",
    "content": "package;\n\n\nimport lime.system.CFFI;\nimport lime.system.JNI;\n\n\nclass ::className:: {\n\t\n\t\n\tpublic static function sampleMethod (inputValue:Int):Int {\n\t\t\n\t\t#if android\n\t\t\n\t\tvar resultJNI = ::extensionLowerCase::_sample_method_jni(inputValue);\n\t\tvar resultNative = ::extensionLowerCase::_sample_method(inputValue);\n\t\t\n\t\tif (resultJNI != resultNative) {\n\t\t\t\n\t\t\tthrow \"Fuzzy math!\";\n\t\t\t\n\t\t}\n\t\t\n\t\treturn resultNative;\n\t\t\n\t\t#else\n\t\t\n\t\treturn ::extensionLowerCase::_sample_method(inputValue);\n\t\t\n\t\t#end\n\t\t\n\t}\n\t\n\t\n\tprivate static var ::extensionLowerCase::_sample_method = CFFI.load (\"::extensionLowerCase::\", \"::extensionLowerCase::_sample_method\", 1);\n\t\n\t#if android\n\tprivate static var ::extensionLowerCase::_sample_method_jni = JNI.createStaticMethod (\"org.haxe.extension.::className::\", \"sampleMethod\", \"(I)I\");\n\t#end\n\t\n\t\n}"
  },
  {
    "path": "templates/extension/dependencies/android/build.gradle",
    "content": "buildscript {\n\trepositories {\n\t\tmavenCentral()\n\t\tgoogle()\n\t}\n\n\tdependencies {\n\t\tclasspath 'com.android.tools.build:gradle:::::if (1 == 1)::ANDROID_GRADLE_PLUGIN::end::::'\n\t}\n}\n\napply plugin: 'com.android.library'\n\nandroid {\n\tnamespace \"org.haxe.extension.::extensionLowerCase::\"\n\tcompileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n\tbuildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION\n}\n\ndependencies {\n\timplementation project(':deps:extension-api')\n}\n"
  },
  {
    "path": "templates/extension/dependencies/android/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" />\n"
  },
  {
    "path": "templates/extension/dependencies/android/src/main/java/org/haxe/extension/Extension.java",
    "content": "package org.haxe.extension;\n\n\nimport android.app.Activity;\nimport android.content.res.AssetManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\n\n\n/* \n\tYou can use the Android Extension class in order to hook\n\tinto the Android activity lifecycle. This is not required\n\tfor standard Java code, this is designed for when you need\n\tdeeper integration.\n\t\n\tYou can access additional references from the Extension class,\n\tdepending on your needs:\n\t\n\t- Extension.assetManager (android.content.res.AssetManager)\n\t- Extension.callbackHandler (android.os.Handler)\n\t- Extension.mainActivity (android.app.Activity)\n\t- Extension.mainContext (android.content.Context)\n\t- Extension.mainView (android.view.View)\n\t\n\tYou can also make references to static or instance methods\n\tand properties on Java classes. These classes can be included \n\tas single files using <java path=\"to/File.java\" /> within your\n\tproject, or use the full Android Library Project format (such\n\tas this example) in order to include your own AndroidManifest\n\tdata, additional dependencies, etc.\n\t\n\tThese are also optional, though this example shows a static\n\tfunction for performing a single task, like returning a value\n\tback to Haxe from Java.\n*/\npublic class ::className:: extends Extension {\n\t\n\t\n\tpublic static int sampleMethod (int inputValue) {\n\t\t\n\t\treturn inputValue * 100;\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when an activity you launched exits, giving you the requestCode \n\t * you started it with, the resultCode it returned, and any additional data \n\t * from it.\n\t */\n\tpublic boolean onActivityResult (int requestCode, int resultCode, Intent data) {\n\t\t\n\t\treturn true;\n\t\t\n\t}\n\n\t/**\n\t * Called when the activity receives th results for permission requests.\n\t */\n\tpublic boolean onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {\n\n\t\treturn true;\n\n\t}\n\t\n\t\n\t/**\n\t * Called when the activity is starting.\n\t */\n\tpublic void onCreate (Bundle savedInstanceState) {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Perform any final cleanup before an activity is destroyed.\n\t */\n\tpublic void onDestroy () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called as part of the activity lifecycle when an activity is going into\n\t * the background, but has not (yet) been killed.\n\t */\n\tpublic void onPause () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after {@link #onStop} when the current activity is being \n\t * re-displayed to the user (the user has navigated back to it).\n\t */\n\tpublic void onRestart () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after {@link #onRestart}, or {@link #onPause}, for your activity \n\t * to start interacting with the user.\n\t */\n\tpublic void onResume () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called after {@link #onCreate} &mdash; or after {@link #onRestart} when  \n\t * the activity had been stopped, but is now again being displayed to the \n\t * user.\n\t */\n\tpublic void onStart () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n\t/**\n\t * Called when the activity is no longer visible to the user, because \n\t * another activity has been resumed and is covering this one. \n\t */\n\tpublic void onStop () {\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t\n}"
  },
  {
    "path": "templates/extension/haxelib.json",
    "content": "{\n  \"name\": \"::extension::\",\n  \"url\": \"\",\n  \"license\": \"MIT\",\n  \"tags\": [],\n  \"description\": \"\",\n  \"version\": \"1.0.0\",\n  \"releasenote\": \"\",\n  \"contributors\": [\"\"],\n  \"dependencies\": {\n\n  }\n}"
  },
  {
    "path": "templates/extension/include.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project>\n\t\n\t<ndll name=\"::extensionLowerCase::\" unless=\"android\" />\n\t\n\t<!-- Use the following for an Android Java extension, not needed otherwise -->\n\t\n\t<dependency name=\"::extensionLowerCase::\" path=\"dependencies/android\" if=\"android\" />\n\t<android extension=\"org.haxe.extension.::className::\" />\n\t\n</project>\n"
  },
  {
    "path": "templates/extension/project/Build.xml",
    "content": "<xml>\n\t\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\"/>\n\t\n\t<files id=\"common\">\n\t\t\n\t\t<compilerflag value=\"-Iinclude\"/>\n\t\t\n\t\t<file name=\"common/ExternalInterface.cpp\"/>\n\t\t<file name=\"common/::file::.cpp\"/>\n\t\t\n\t</files>\n\t\n\t<set name=\"SLIBEXT\" value=\".lib\" if=\"windows\"/>\n\t<set name=\"SLIBEXT\" value=\".a\" unless=\"windows\"/>\n\t<set name=\"SLIBEXT\" value=\".so\" if=\"webos\"/>\n\t\n\t<set name=\"DEBUGEXTRA\" value=\"-debug\" if=\"fulldebug\" />\n\t\n\t<target id=\"NDLL\" output=\"${LIBPREFIX}::extensionLowerCase::${MSVC_LIB_VERSION}${DEBUGEXTRA}${LIBEXTRA}\" tool=\"linker\" toolid=\"${STD_MODULE_LINK}\">\n\t\t\n\t\t<outdir name=\"../ndll/${BINDIR}\"/>\n\t\t<ext value=\".ndll\" if=\"windows || mac || linux\"/>\n\t\t<files id=\"common\"/>\n\t\t\n\t</target>\n\t\n\t<target id=\"default\">\n\t\t\n\t\t<target id=\"NDLL\"/>\n\t\t\n\t</target>\n\t\n</xml>"
  },
  {
    "path": "templates/extension/project/common/Extension.cpp",
    "content": "#include \"Utils.h\"\n\n\nnamespace ::extensionLowerCase:: {\n\t\n\t\n\tint SampleMethod(int inputValue) {\n\t\t\n\t\treturn inputValue * 100;\n\t\t\n\t}\n\t\n\t\n}"
  },
  {
    "path": "templates/extension/project/common/ExternalInterface.cpp",
    "content": "#ifndef STATIC_LINK\n#define IMPLEMENT_API\n#endif\n\n#if defined(HX_WINDOWS) || defined(HX_MACOS) || defined(HX_LINUX)\n#define NEKO_COMPATIBLE\n#endif\n\n\n#include <hx/CFFI.h>\n#include \"Utils.h\"\n\n\nusing namespace ::extensionLowerCase::;\n\n\n\nstatic value ::extensionLowerCase::_sample_method (value inputValue) {\n\t\n\tint returnValue = SampleMethod(val_int(inputValue));\n\treturn alloc_int(returnValue);\n\t\n}\nDEFINE_PRIM (::extensionLowerCase::_sample_method, 1);\n\n\n\nextern \"C\" void ::extensionLowerCase::_main () {\n\t\n\tval_int(0); // Fix Neko init\n\t\n}\nDEFINE_ENTRY_POINT (::extensionLowerCase::_main);\n\n\n\nextern \"C\" int ::extensionLowerCase::_register_prims () { return 0; }"
  },
  {
    "path": "templates/extension/project/include/Utils.h",
    "content": "#ifndef ::extensionUpperCase::_H\n#define ::extensionUpperCase::_H\n\n\nnamespace ::extensionLowerCase:: {\n\t\n\t\n\tint SampleMethod(int inputValue);\n\t\n\t\n}\n\n\n#endif"
  },
  {
    "path": "templates/flash/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-swf-version ::SWF_VERSION::\n-swf ::OUTPUT_DIR::/bin/::APP_FILE::.swf\n-swf-header ::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end:::::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end:::::WIN_FPS:::::WIN_FLASHBACKGROUND::\n-cp ::OUTPUT_DIR::/haxe\n-debug"
  },
  {
    "path": "templates/flash/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-swf-version ::SWF_VERSION::\n-swf ::OUTPUT_DIR::/bin/::APP_FILE::.swf\n-swf-header ::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end:::::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end:::::WIN_FPS:::::WIN_FLASHBACKGROUND::\n-cp ::OUTPUT_DIR::/haxe\n-D final"
  },
  {
    "path": "templates/flash/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-swf-version ::SWF_VERSION::\n-swf ::OUTPUT_DIR::/bin/::APP_FILE::.swf\n-swf-header ::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end:::::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end:::::WIN_FPS:::::WIN_FLASHBACKGROUND::\n-cp ::OUTPUT_DIR::/haxe"
  },
  {
    "path": "templates/flash/templates/chrome/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\t\n\t<head>\n\t\t\n\t\t<title>::APP_TITLE::</title>\n\t\t\n\t\t<script type=\"text/javascript\" src=\"swfobject.js\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\t\n\t\t\tswfobject.embedSWF (\"::APP_FILE::.swf\", \"nme-application\", \"::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end::\", \"::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end::\", \"::SWF_VERSION::\", \"expressInstall.swf\", ::WIN_PARAMETERS::);\n\t\t</script>\n\t\t\n\t\t<style>\n\t\t\thtml, body, #nme-application\t{ width:::if (WIN_WIDTH == \"0\")::100%::else::::WIN_WIDTH::px::end::; height:::if (WIN_HEIGHT == \"0\")::100%::else::::WIN_HEIGHT::px::end::; }\n\t\t\tbody\t\t\t\t\t{ margin:0; padding:0; overflow:hidden; }\n\t\t\t\n\t\t</style>\n\t\t\n\t</head>\n\t\n\t<body>\n\t\t\n\t\t<div id=\"nme-application\"></div>\n\t\t\n\t</body>\n\t\n</html>"
  },
  {
    "path": "templates/flash/templates/chrome/manifest.json",
    "content": "{\n  \"name\": \"::APP_TITLE::\",\n  \"description\": \"::APP_DESCRIPTION::\",\n  \"version\": \"::APP_VERSION::\",\n  \"app\": {\n    \"launch\": {\n      \"local_path\": \"index.html\"\n    }\n  },\n  \"icons\": {\n    \"16\": \"icon_16.png\",\n    \"128\": \"icon_128.png\"\n  }\n}"
  },
  {
    "path": "templates/flash/templates/chrome/swfobject.js",
    "content": "/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/> \n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();"
  },
  {
    "path": "templates/flash/templates/opera/config.xml",
    "content": "<widget defaultmode=\"application\">\n  <widgetname>::APP_TITLE::</widgetname>\n  <description>::APP_DESCRIPTION::</description>\n  <width>::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end::</width>\n  <height>::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end::</height>\n  <author>\n    <name>::APP_COMPANY::</name>\n    <!-- <email></email> -->\n    <organization>::APP_COMPANY::</organization>\n    <!-- <link></link> -->\n  </author>\n  <icon width=\"128\" height=\"128\">icon_128.png</icon>\n  <icon width=\"64\" height=\"64\">icon_64.png</icon>\n  <icon width=\"32\" height=\"32\">icon_32.png</icon>\n  <icon width=\"16\" height=\"16\">icon_16.png</icon>\n  <id>\n    <host>::APP_PACKAGE_HOST::</host>\n    <name>::APP_PACKAGE_NAME::</name>\n    <revised>::REVISION_DATE::</revised>\n  </id>\n</widget>"
  },
  {
    "path": "templates/flash/templates/opera/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\t\n\t<head>\n\t\t\n\t\t<title>::APP_TITLE::</title>\n\t\t\n\t\t<script type=\"text/javascript\" src=\"swfobject.js\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\t\n\t\t\tswfobject.embedSWF (\"::APP_FILE::.swf\", \"nme-application\", \"::if (WIN_WIDTH == \"0\")::800::else::::WIN_WIDTH::::end::\", \"::if (WIN_HEIGHT == \"0\")::500::else::::WIN_HEIGHT::::end::\", \"::SWF_VERSION::\", \"expressInstall.swf\", ::WIN_PARAMETERS::);\n\t\t</script>\n\t\t\n\t\t<style>\n\t\t\thtml, body, #nme-application\t{ width:::if (WIN_WIDTH == \"0\")::100%::else::::WIN_WIDTH::px::end::; height:::if (WIN_HEIGHT == \"0\")::100%::else::::WIN_HEIGHT::px::end::; }\n\t\t\tbody\t\t\t\t\t{ margin:0; padding:0; overflow:hidden; }\n\t\t\t\n\t\t</style>\n\t\t\n\t</head>\n\t\n\t<body>\n\t\t\n\t\t<div id=\"nme-application\"></div>\n\t\t\n\t</body>\n\t\n</html>"
  },
  {
    "path": "templates/flash/templates/opera/swfobject.js",
    "content": "/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/> \n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();"
  },
  {
    "path": "templates/flash/templates/web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\t\n\t<head>\n\t\t\n\t\t<title>::APP_TITLE::</title>\n\t\t\n\t\t<script type=\"text/javascript\" src=\"swfobject.js\"></script>\n\t\t<script type=\"text/javascript\">\n\t\t\t\n\t\t\tswfobject.embedSWF (\"::APP_FILE::.swf\", \"content\", \"::if (WIN_WIDTH == 0)::800::else::::WIN_WIDTH::::end::\", \"::if (WIN_HEIGHT == 0)::500::else::::WIN_HEIGHT::::end::\", \"::SWF_VERSION::\", \"expressInstall.swf\", ::WIN_PARAMETERS::, { base: \".\" });\n\t\t\t\n\t\t</script>\n\t\t\n\t\t<style>\n\t\t\t\n\t\t\thtml, body, #content { width: ::if (WIN_WIDTH == 0)::100%::else::::WIN_WIDTH::px::end::; height: ::if (WIN_HEIGHT == 0)::100%::else::::WIN_HEIGHT::px::end::; }\n\t\t\tbody { margin: 0; padding: 0; overflow: hidden; }\n\t\t\t\n\t\t</style>\n\t\t\n\t</head>\n\t\n\t<body>\n\t\t\n\t\t<div id=\"content\" />\n\t\t\n\t</body>\n\t\n</html>"
  },
  {
    "path": "templates/flash/templates/web/swfobject.js",
    "content": "/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/> \n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();"
  },
  {
    "path": "templates/haxe/ApplicationMain.hx",
    "content": "package;\n\nimport ::APP_MAIN::;\n\n@:access(lime.app.Application)\n@:access(lime.system.System)\n\n@:dox(hide) class ApplicationMain\n{\n\tpublic static function main()\n\t{\n\t\tlime.system.System.__registerEntryPoint(\"::APP_FILE::\", create);\n\n\t\t#if (!html5 || munit)\n\t\tcreate(null);\n\t\t#end\n\t}\n\n\tpublic static function create(config:Dynamic):Void\n\t{\n\t\t#if !disable_preloader_assets\n\t\tManifestResources.init(config);\n\t\t#end\n\n\t\t#if !munit\n\t\tvar app = new ::APP_MAIN::();\n\t\tapp.meta.set(\"build\", \"::meta.buildNumber::\");\n\t\tapp.meta.set(\"company\", \"::meta.company::\");\n\t\tapp.meta.set(\"file\", \"::APP_FILE::\");\n\t\tapp.meta.set(\"name\", \"::meta.title::\");\n\t\tapp.meta.set(\"packageName\", \"::meta.packageName::\");\n\t\tapp.meta.set(\"version\", \"::meta.version::\");\n\n\t\t#if !flash\n\t\t::foreach windows::\n\t\tvar attributes:lime.ui.WindowAttributes =\n\t\t\t{\n\t\t\t\tallowHighDPI: ::allowHighDPI::,\n\t\t\t\talwaysOnTop: ::alwaysOnTop::,\n\t\t\t\tborderless: ::borderless::,\n\t\t\t\t// display: ::display::,\n\t\t\t\telement: null,\n\t\t\t\tframeRate: ::fps::,\n\t\t\t\t#if !web fullscreen: ::fullscreen::, #end\n\t\t\t\theight: ::height::,\n\t\t\t\thidden: #if munit true #else ::hidden:: #end,\n\t\t\t\tmaximized: ::maximized::,\n\t\t\t\tminimized: ::minimized::,\n\t\t\t\tparameters: ::parameters::,\n\t\t\t\tresizable: ::resizable::,\n\t\t\t\ttitle: \"::title::\",\n\t\t\t\twidth: ::width::,\n\t\t\t\tx: ::x::,\n\t\t\t\ty: ::y::,\n\t\t\t};\n\n\t\tattributes.context =\n\t\t\t{\n\t\t\t\tantialiasing: ::antialiasing::,\n\t\t\t\tbackground: ::background::,\n\t\t\t\tcolorDepth: ::colorDepth::,\n\t\t\t\tdepth: ::depthBuffer::,\n\t\t\t\thardware: ::hardware::,\n\t\t\t\tstencil: ::stencilBuffer::,\n\t\t\t\ttype: null,\n\t\t\t\tvsync: ::vsync::\n\t\t\t};\n\n\t\tif (app.window == null)\n\t\t{\n\t\t\tif (config != null)\n\t\t\t{\n\t\t\t\tfor (field in Reflect.fields(config))\n\t\t\t\t{\n\t\t\t\t\tif (Reflect.hasField(attributes, field))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(attributes, field, Reflect.field(config, field));\n\t\t\t\t\t}\n\t\t\t\t\telse if (Reflect.hasField(attributes.context, field))\n\t\t\t\t\t{\n\t\t\t\t\t\tReflect.setField(attributes.context, field, Reflect.field(config, field));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#if sys\n\t\t\tlime.system.System.__parseArguments(attributes);\n\t\t\t#end\n\t\t}\n\n\t\tapp.createWindow(attributes);\n\t\t::end::\n\t\t#elseif air\n\t\tapp.window.title = \"::meta.title::\";\n\t\t#else\n\t\tapp.window.context.attributes.background = ::WIN_BACKGROUND::;\n\t\tapp.window.frameRate = ::WIN_FPS::;\n\t\t#end\n\t\t#end\n\n\t\t// preloader.create ();\n\n\t\t#if !disable_preloader_assets\n\t\tfor (library in ManifestResources.preloadLibraries)\n\t\t{\n\t\t\tapp.preloader.addLibrary(library);\n\t\t}\n\n\t\tfor (name in ManifestResources.preloadLibraryNames)\n\t\t{\n\t\t\tapp.preloader.addLibraryName(name);\n\t\t}\n\t\t#end\n\n\t\tapp.preloader.load();\n\n\t\t#if !munit\n\t\tstart(app);\n\t\t#end\n\t}\n\n\tpublic static function start(app:lime.app.Application = null):Void\n\t{\n\t\t#if !munit\n\n\t\tvar result = app.exec();\n\n\t\t#if (sys && !ios && !nodejs && !webassembly)\n\t\tlime.system.System.exit(result);\n\t\t#end\n\n\t\t#else\n\n\t\tnew ::APP_MAIN::();\n\n\t\t#end\n\t}\n\n\t@:noCompletion @:dox(hide) public static function __init__()\n\t{\n\t\tvar init = lime.app.Application;\n\n\t\t#if neko\n\t\t// Copy from https://github.com/HaxeFoundation/haxe/blob/development/std/neko/_std/Sys.hx#L164\n\t\t// since Sys.programPath () isn't available in __init__\n\t\tvar sys_program_path =\n\t\t\t{\n\t\t\t\tvar m = neko.vm.Module.local().name;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tsys.FileSystem.fullPath(m);\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\t// maybe the neko module name was supplied without .n extension...\n\t\t\t\t\tif (!StringTools.endsWith(m, \".n\"))\n\t\t\t\t\t{\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsys.FileSystem.fullPath(m + \".n\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tm;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tm;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\tvar loader = new neko.vm.Loader(untyped $loader);\n\t\tloader.addPath(haxe.io.Path.directory(#if (haxe_ver >= 3.3) sys_program_path #else Sys.executablePath() #end));\n\t\tloader.addPath(\"./\");\n\t\tloader.addPath(\"@executable_path/\");\n\t\t#end\n\t}\n}\n"
  },
  {
    "path": "templates/haxe/ManifestResources.hx",
    "content": "package;\n\nimport haxe.io.Bytes;\nimport haxe.io.Path;\nimport lime.utils.AssetBundle;\nimport lime.utils.AssetLibrary;\nimport lime.utils.AssetManifest;\nimport lime.utils.Assets;\n\n#if sys\nimport sys.FileSystem;\n#end\n\n#if disable_preloader_assets\n@:dox(hide) class ManifestResources {\n\tpublic static var preloadLibraries:Array<Dynamic>;\n\tpublic static var preloadLibraryNames:Array<String>;\n\tpublic static var rootPath:String;\n\n\tpublic static function init (config:Dynamic):Void {\n\t\tpreloadLibraries = new Array ();\n\t\tpreloadLibraryNames = new Array ();\n\t}\n}\n#else\n@:access(lime.utils.Assets)\n\n\n@:keep @:dox(hide) class ManifestResources {\n\n\n\tpublic static var preloadLibraries:Array<AssetLibrary>;\n\tpublic static var preloadLibraryNames:Array<String>;\n\tpublic static var rootPath:String;\n\n\n\tpublic static function init (config:Dynamic):Void {\n\n\t\tpreloadLibraries = new Array ();\n\t\tpreloadLibraryNames = new Array ();\n\n\t\trootPath = null;\n\n\t\tif (config != null && Reflect.hasField (config, \"rootPath\")) {\n\n\t\t\trootPath = Reflect.field (config, \"rootPath\");\n\n\t\t\tif(!StringTools.endsWith (rootPath, \"/\")) {\n\n\t\t\t\trootPath += \"/\";\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (rootPath == null) {\n\n\t\t\t#if (ios || tvos || webassembly)\n\t\t\trootPath = \"assets/\";\n\t\t\t#elseif android\n\t\t\trootPath = \"\";\n\t\t\t#elseif (console || sys)\n\t\t\trootPath = lime.system.System.applicationDirectory;\n\t\t\t#else\n\t\t\trootPath = \"./\";\n\t\t\t#end\n\n\t\t}\n\n\t\t#if (openfl && !flash && !display)\n\t\t::if (assets != null)::::foreach assets::::if (type == \"font\")::openfl.text.Font.registerFont (__ASSET__OPENFL__::flatName::);\n\t\t::end::::end::::end::\n\t\t#end\n\n\t\tvar data, manifest, library, bundle;\n\n\t\t::if (assets != null)::::foreach assets::::if (type == \"manifest\")::::if (embed)::data = '::data::';\n\t\tmanifest = AssetManifest.parse (data, rootPath);\n\t\tlibrary = AssetLibrary.fromManifest (manifest);\n\t\tAssets.registerLibrary (\"::library::\", library);\n\t\t::else::Assets.libraryPaths[\"::library::\"] = rootPath + \"::resourceName::\";\n\t\t::end::::end::::if (type == \"bundle\")::::if (embed)::\n\t\tbundle = AssetBundle.fromBytes (#if flash Bytes.ofData (new __ASSET__::flatName:: () #else new __ASSET__::flatName:: () #end));\n\t\tlibrary = AssetLibrary.fromBundle (bundle);\n\t\tAssets.registerLibrary (\"::library::\", library);\n\t\t::else::Assets.bundlePaths[\"::library::\"] = rootPath + \"::resourceName::\";\n\t\t::end::::end::::end::::end::\n\n\t\t::foreach libraries::::if (preload)::library = Assets.getLibrary (\"::name::\");\n\t\tif (library != null) preloadLibraries.push (library);\n\t\telse preloadLibraryNames.push (\"::name::\");\n\t\t::end::::end::\n\n\t}\n\n\n}\n\n#if !display\n#if flash\n\n::foreach assets::::if (embed != false)::::if (type == \"image\")::@:keep @:bind @:noCompletion #if display private #end class __ASSET__::flatName:: extends flash.display.BitmapData { public function new () { super (0, 0, true, 0); } }::else::@:keep @:bind @:noCompletion #if display private #end class __ASSET__::flatName:: extends ::flashClass:: { }::end::\n::end::::end::\n\n#elseif (desktop || cpp)\n\n::if (assets != null)::::foreach assets::::if (embed)::@:keep ::if (type == \"image\")::@:image(\"::sourcePath::\") @:noCompletion #if display private #end class __ASSET__::flatName:: extends lime.graphics.Image {}\n::elseif (type == \"sound\")::@:file(\"::sourcePath::\") @:noCompletion #if display private #end class __ASSET__::flatName:: extends haxe.io.Bytes {}\n::elseif (type == \"music\")::@:file(\"::sourcePath::\") @:noCompletion #if display private #end class __ASSET__::flatName:: extends haxe.io.Bytes {}\n::elseif (type == \"font\")::@:font(\"::sourcePath::\") @:noCompletion #if display private #end class __ASSET__::flatName:: extends lime.text.Font {}\n::else::@:file(\"::sourcePath::\") @:noCompletion #if display private #end class __ASSET__::flatName:: extends haxe.io.Bytes {}\n::end::::end::::end::::end::\n::if (assets != null)::::foreach assets::::if (!embed)::::if (type == \"font\")::@:keep @:noCompletion #if display private #end class __ASSET__::flatName:: extends lime.text.Font { public function new () { ::if (targetPath != null)::__fontPath = ManifestResources.rootPath + \"::targetPath::\";::else::::if (library != null)::__fontID = \"::library:::::id::\";::else::__fontID = \"::id::\";::end::::end:: ::if (fontName)::name = \"::fontName::\";::end:: super (); }}\n::end::::end::::end::::end::\n\n#else\n\n::if (assets != null)::::foreach assets::::if (type == \"font\")::@:keep @:expose('__ASSET__::flatName::') @:noCompletion #if display private #end class __ASSET__::flatName:: extends lime.text.Font { public function new () { #if !html5 __fontPath = \"::targetPath::\"; #else ascender = ::ascender::; descender = ::descender::; height = ::height::; numGlyphs = ::numGlyphs::; underlinePosition = ::underlinePosition::; underlineThickness = ::underlineThickness::; unitsPerEM = ::unitsPerEM::; #end::if (fontName):: name = \"::fontName::\";::end:: super (); }}\n::end::::end::::end::\n\n#end\n\n#if (openfl && !flash)\n\n#if html5\n::if (assets != null)::::foreach assets::::if (type == \"font\")::@:keep @:expose('__ASSET__OPENFL__::flatName::') @:noCompletion #if display private #end class __ASSET__OPENFL__::flatName:: extends openfl.text.Font { public function new () {::if (embed):: __fromLimeFont (new __ASSET__::flatName:: ());::else::::if (fontName):: name = \"::fontName::\";::end::::end:: super (); }}\n::end::::end::::end::\n#else\n::if (assets != null)::::foreach assets::::if (type == \"font\")::@:keep @:expose('__ASSET__OPENFL__::flatName::') @:noCompletion #if display private #end class __ASSET__OPENFL__::flatName:: extends openfl.text.Font { public function new () {::if (embed):: __fromLimeFont (new __ASSET__::flatName:: ());::else:: ::if (targetPath != null)::__fontPath = ManifestResources.rootPath + \"::targetPath::\";::else::::if (library != null)::__fontID = \"::library:::::id::\";::else::__fontID = \"::id::\";::end::::end::::if (fontName):: name = \"::fontName::\";::end::::end:: super (); }}\n::end::::end::::end::\n#end\n\n#end\n#end\n\n#end"
  },
  {
    "path": "templates/hl/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-hl ::HL_FILE::\n--macro keep(\"::APP_MAIN::\")\n-debug"
  },
  {
    "path": "templates/hl/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-hl ::HL_FILE::\n--macro keep(\"::APP_MAIN::\")\n-D final"
  },
  {
    "path": "templates/hl/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-hl ::HL_FILE::\n--macro keep(\"::APP_MAIN::\")"
  },
  {
    "path": "templates/hl/mac-launch.sh",
    "content": "#!/usr/bin/env sh\n# HashLink needs a specific working directory to find hlboot.dat and libraries\n# automatically, so we use this script to configure them all manually\nBASEDIR=$(dirname $0)\nDYLD_LIBRARY_PATH=$BASEDIR:$DYLD_LIBRARY_PATH exec $BASEDIR/hl $BASEDIR/hlboot.dat \"$@\""
  },
  {
    "path": "templates/html5/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-D html5\n-D html\n-debug\n"
  },
  {
    "path": "templates/html5/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-D html5\n-D html\n-D final\n-D js-flatten\n-dce full"
  },
  {
    "path": "templates/html5/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-D html5\n-D html"
  },
  {
    "path": "templates/html5/npm/package.json",
    "content": "{\n  \"name\": \"::META_PACKAGE::\",\n  \"version\": \"::META_VERSION::\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"haxe\": \"^5.0.10\",\n    \"haxe-loader\": \"^0.10.0\",\n    \"uglifyjs-webpack-plugin\": \"^1.3.0\",\n    \"webpack\": \"^4.20.2\",\n    \"webpack-cli\": \"^3.1.2\",\n    \"webpack-dev-server\": \"^3.1.9\",\n    \"webpack-merge\": \"^4.1.4\"\n  },\n  \"haxeDependencies\": {\n    \"haxe\": \"3.4.7\"\n  },\n  \"scripts\": {\n    \"build\": \"npm run build:prod\",\n    \"build:dev\": \"webpack --config webpack.dev.js\",\n    \"build:prod\": \"webpack --config webpack.prod.js\",\n    \"start\": \"npm run start:dev\",\n    \"start:dev\": \"webpack-dev-server --open --config webpack.dev.js\",\n    \"start:prod\": \"webpack-dev-server --open --config webpack.prod.js\"\n  },\n  \"dependencies\": {}\n}\n"
  },
  {
    "path": "templates/html5/npm/webpack.common.js",
    "content": "const path = require ('path');\n\nmodule.exports = {\n\tentry: \"./../haxe/::if DEBUG::debug.hxml::else::::if FINAL::final.hxml::else::release.hxml::end::::end::\",\n\toutput: {\n\t\tpath: path.resolve (__dirname, \"dist\"),\n\t\tfilename: \"::OUTPUT_FILE::\",\n\t\tlibrary: \"lime\",\n\t\tlibraryTarget: 'window',\n\t\tlibraryExport: 'lime'\n\t},\n\tmodule: {\n\t\trules: [\n\t\t\t{\n\t\t\t\ttest: /\\.hxml$/,\n\t\t\t\tloader: 'haxe-loader',\n\t\t\t}\n\t\t]\n\t}\n};"
  },
  {
    "path": "templates/html5/npm/webpack.dev.js",
    "content": "const merge = require ('webpack-merge');\nconst common = require ('./webpack.common.js');\n\nmodule.exports = merge (common, {\n\tmode: 'development',\n\tdevServer: {\n\t\tcontentBase: './dist'\n\t},\n\tdevtool: \"inline-source-map\",\n});"
  },
  {
    "path": "templates/html5/npm/webpack.prod.js",
    "content": "const webpack = require ('webpack');\nconst merge = require ('webpack-merge');\nconst UglifyJSPlugin = require ('uglifyjs-webpack-plugin');\nconst common = require ('./webpack.common.js');\n\nmodule.exports = merge (common, {\n\tmode: 'production',\n\tdevtool: \"source-map\",\n\tplugins: [\n\t\tnew UglifyJSPlugin ({\n\t\t\tsourceMap: true\n\t\t}),\n\t\tnew webpack.DefinePlugin ({\n\t\t\t'process.env.NODE_ENV': JSON.stringify ('production')\n\t\t})\n\t]\n});"
  },
  {
    "path": "templates/html5/output.js",
    "content": "var $lime_init = (function ($hx_exports, $global) { \"use strict\"; var $hx_script = (function (exports, global) { ::SOURCE_FILE::\n});::if false::\n/*\n\tDon't insert or remove any line breaks in the code above this line!\n\n\t::SOURCE_FILE:: must start on the first line.\n\n\tBreakpoints in debug builds won't work if this file's line numbers don't\n\tmatch the .js.map file's expected line numbers exactly.\n\n\tAdditionally, the }); after ::SOURCE_FILE:: must appear on the next line\n\tto avoid it getting ignored in a // comment at the end of ::SOURCE_FILE::.\n*/\n::end::\n\tif (typeof self !== \"undefined\" && self.constructor.name.includes(\"Worker\")) {\n\t\t// No need for exports in a worker context, just initialize statics.\n\t\t$hx_script({}, $global);\n\t} else {\n\t\t$hx_exports.lime = $hx_exports.lime || {};\n\t\t$hx_exports.lime.$scripts = $hx_exports.lime.$scripts || {};\n\t\t$hx_exports.lime.$scripts[\"::APP_FILE::\"] = $hx_script;\n\t\t$hx_exports.lime.embed = function (projectName) {\n\t\t\tvar exports = {};\n\t\t\tvar script = $hx_exports.lime.$scripts[projectName];\n\t\t\tif (!script) throw Error(\"Cannot find project name \\\"\" + projectName + \"\\\"\");\n\t\t\tscript(exports, $global);\n\t\t\tfor (var key in exports) $hx_exports[key] = $hx_exports[key] || exports[key];\n\t\t\tvar lime = exports.lime || window.lime;\n\t\t\tif (lime && lime.embed && this !== lime.embed) lime.embed.apply(lime, arguments);\n\t\t\treturn exports;\n\t\t};\n\t}\n\n\tif (typeof define === \"function\" && define.amd) {\n\t\tdefine([], function () { return $hx_exports.lime; });\n\t\tdefine.__amd = define.amd;\n\t\tdefine.amd = null;\n\t}\n})\n\n$lime_init(typeof exports !== \"undefined\" ? exports : typeof define === \"function\" && define.amd ? {} : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : this,\ntypeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : this);\n\n::if embeddedLibraries::::foreach embeddedLibraries::\n::__current__::::end::::end::\n\nif (typeof define === \"function\" && define.__amd) {\n\tdefine.amd = define.__amd;\n\tdelete define.__amd;\n}\n"
  },
  {
    "path": "templates/html5/template/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n\t<meta charset=\"utf-8\">\n\n\t<title>::APP_TITLE::</title>\n\n\t<meta id=\"viewport\" name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\n\t<meta name=\"mobile-web-app-capable\" content=\"yes\">\n\n\t::if favicons::::foreach (favicons)::\n\t<link rel=\"::__current__.rel::\" type=\"::__current__.type::\" href=\"::__current__.href::\">::end::::end::\n\n\t::if linkedLibraries::::foreach (linkedLibraries)::\n\t<script type=\"text/javascript\" src=\"::__current__::\"></script>::end::::end::\n\t<script type=\"text/javascript\" src=\"./::APP_FILE::.js\"></script>\n\n\t<script>\n\t\twindow.addEventListener (\"touchmove\", function (event) { event.preventDefault (); }, { capture: false, passive: false });\n\t\tif (typeof window.devicePixelRatio != 'undefined' && window.devicePixelRatio > 2) {\n\t\t\tvar meta = document.getElementById (\"viewport\");\n\t\t\tmeta.setAttribute ('content', 'width=device-width, initial-scale=' + (2 / window.devicePixelRatio) + ', user-scalable=no');\n\t\t}\n\t</script>\n\n\t<style>\n\t\thtml,body { margin: 0; padding: 0; height: 100%; overflow: hidden; }\n\t\t#content { ::if (WIN_BACKGROUND)::background: #000000; ::end::width: ::if (WIN_RESIZABLE)::100%::elseif (WIN_WIDTH > 0)::::WIN_WIDTH::px::else::100%::end::; height: ::if (WIN_RESIZABLE)::100%::elseif (WIN_WIDTH > 0)::::WIN_HEIGHT::px::else::100%::end::; }\n::foreach assets::::if (type == \"font\")::::if (cssFontFace)::::cssFontFace::::end::::end::::end::\n\t</style>\n\n</head>\n<body>\n\t::foreach assets::::if (type == \"font\")::\n\t<span style=\"font-family: ::id::\"> </span>::end::::end::\n\n\t<div id=\"content\"></div>\n\n\t<script type=\"text/javascript\">\n\t\tlime.embed (\"::APP_FILE::\", \"content\", ::WIN_WIDTH::, ::WIN_HEIGHT::);\n\t</script>\n\n</body>\n</html>"
  },
  {
    "path": "templates/hxformat.json",
    "content": "{\n\t\"disableFormatting\": true\n}"
  },
  {
    "path": "templates/ios/storyboards/splash.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14460.31\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" ::if (deploymentVersion.major >= 9)::useSafeAreas=\"YES\"::end:: colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"ipad11_0rounded\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment version=\"::deploymentVersion.code::\" identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14460.20\"/>\n        ::if (deploymentVersion.major >= 9)::<capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>::end::\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"834\" height=\"1194\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"::contentMode::\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Oxd-N2-wEZ\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"834\" height=\"1194\"/>\n                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                ::if portrait::<variation key=\"heightClass=regular-widthClass=compact\" image=\"::portrait::\"/>::end::\n                                ::if landscape::<variation key=\"heightClass=compact-widthClass=regular\" image=\"::landscape::\"/>\n                                <variation key=\"heightClass=compact-widthClass=compact\" image=\"::landscape::\"/>::end::\n                                ::if ipad::<variation key=\"heightClass=regular-widthClass=regular\" image=\"::ipad::\"/>::end::\n                            </imageView>\n                        </subviews>\n                        ::if bg::\n                        <color key=\"backgroundColor\" red=\"::bg.r::\" green=\"::bg.g::\" blue=\"::bg.b::\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        ::else::\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        ::end::\n                        ::if (deploymentVersion.major >= 9)::<viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>::end::\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"52.5\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        ::foreach imagesets::\n        <image name=\"::name::\" width=\"::width::\" height=\"::height::\"/>\n        ::end::\n    </resources>\n</document>\n"
  },
  {
    "path": "templates/ios/template/{{app.file}}/Classes/Main.mm",
    "content": "#include <stdio.h>\n\nextern \"C\" const char *hxRunLibrary ();\nextern \"C\" void hxcpp_set_top_of_stack ();\n\nextern \"C\" int zlib_register_prims ();\nextern \"C\" int lime_register_prims ();\n::foreach ndlls::::if (registerStatics)::\nextern \"C\" int ::nameSafe::_register_prims ();::end::::end::\n\n\nextern \"C\" int SDL_main (int argc, char *argv[]) {\n\n\thxcpp_set_top_of_stack ();\n\n\tzlib_register_prims ();\n\tlime_register_prims ();\n\t::foreach ndlls::::if (registerStatics)::\n\t::nameSafe::_register_prims ();::end::::end::\n\n\tconst char *err = NULL;\n\terr = hxRunLibrary ();\n\n\tif (err) {\n\n\t\tprintf (\"Error %s\\n\", err);\n\t\treturn -1;\n\n\t}\n\n\treturn 0;\n\n}"
  },
  {
    "path": "templates/ios/template/{{app.file}}/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small-40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"57x57\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"57x57\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-20.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-40.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-50.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-50@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"72x72\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-72.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"72x72\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-72@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-Marketing.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "templates/ios/template/{{app.file}}/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2436h\",\n      \"filename\" : \"Default-812h@3x.png\",\n      \"minimum-system-version\" : \"11.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2436h\",\n      \"filename\" : \"Default-Landscape-812h@3x.png\",\n      \"minimum-system-version\" : \"11.0\",\n      \"orientation\" : \"landscape\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"736h\",\n      \"filename\" : \"Default-736h@3x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"736h\",\n      \"filename\" : \"Default-736h-Landscape@3x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"landscape\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"667h\",\n      \"filename\" : \"Default-667h@2x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"filename\" : \"Default-568h@2x.png\",\n      \"minimum-system-version\" : \"7.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Portrait.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Landscape.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Portrait@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Landscape@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-568h@2x.png\",\n      \"subtype\" : \"retina4\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Portrait.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Landscape.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Portrait@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Landscape@2x.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "templates/ios/template/{{app.file}}/exportOptions-adhoc.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>ad-hoc</string>\n\t\t::if (config.ios.adhoc.manifest != null)::<key>manifest</key>\n\t\t<dict>\n\t\t\t<key>appURL</key>\n\t\t\t<string>::config.ios.adhoc.manifest.appURL::</string>\n\t\t\t<key>displayImageURL</key>\n\t\t\t<string>::config.ios.adhoc.manifest.displayImageURL::</string>\n\t\t\t<key>fullSizeImageURL</key>\n\t\t\t<string>::config.ios.adhoc.manifest.fullSizeImageURL::</string>\n\t\t</dict>::end::\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/ios/template/{{app.file}}/exportOptions-appstore.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>app-store</string>\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/ios/template/{{app.file}}/exportOptions-development.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>development</string>\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/ios/template/{{app.file}}/exportOptions-enterprise.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>enterprise</string>\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/ios/template/{{app.file}}/haxe/Build.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-D iphone\n-D ios\n--macro keep(\"::APP_MAIN::\")\n-D no-compilation"
  },
  {
    "path": "templates/ios/template/{{app.file}}/haxe/BuildHxcppMbedtls.xml",
    "content": "<xml>\n\n\t<include name=\"${HXCPP}/project/thirdparty/mbedtls-files.xml\" noerror=\"true\" />\n\t<set name=\"HAS_HXCPP_MBEDTLS_FILES\" value=\"1\" if=\"MBEDTLS_DIR\" />\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\t<include name=\"${HXCPP}/src/hx/libs/ssl/Build.xml\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\n\t<target id=\"default\" output=\"libmbedtls_hxcpp${DBG}\" tool=\"linker\" toolid=\"static_link\">\n\n\t\t<files id=\"mbedtls\" if=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\t\t<files id=\"hxcpp_ssl\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\n\t</target>\n\n</xml>\n"
  },
  {
    "path": "templates/ios/template/{{app.file}}/haxe/makefile",
    "content": "\nifeq (\"$(ARCHS)\",\"normal\")\n\tARCHS = armv6 armv7 i386\nendif\n\nHAXE_BUILDS := $(ARCHS:%=build-haxe-%)\n\nifeq (\"$(CONFIGURATION)\",\"Debug\")\n   BUILD_STYLE := Debug\nendif\n\nifeq (\"$(BUILD_STYLE)\",\"Debug\")\n   DEBUG := -debug\n   CONFIG := Debug\nelse\n   DEBUG :=\n   CONFIG := Release\nendif\n\nHAXE_OS := $(PLATFORM_NAME)\nifeq (\"$(HAXE_OS)\",\"iphonesimulator\")\n   HAXE_OS := iphonesim\nendif\nCONFIG := $(CONFIG)-$(HAXE_OS)\n\nLIB_DEST := $(DEBUG)/libApplicationMain.a\nLIB_MBEDTLS_DEST := $(DEBUG)/libmbedtls_hxcpp.a\n\nSIMULATOR_ARCH = i386 x86_64\n\nSUFFIX_i386 =\nSUFFIX_x86_64 = -64\nSUFFIX_armv6 =\nSUFFIX_armv7 = -v7\nSUFFIX_arm64 = -64\n\nHXCPP_FLAGS_i386 = -D simulator\nHXCPP_FLAGS_x86_64 = -D simulator -D HXCPP_M64\nHXCPP_FLAGS_armv6 = -D HXCPP_ARMV6\nHXCPP_FLAGS_armv7 = -D HXCPP_ARMV7\nHXCPP_FLAGS_arm64 = -D HXCPP_ARM64\n\nifeq (\"$(ACTION)\",\"clean\")\ndefault: clean\nelse\ndefault: $(HAXE_BUILDS)\nendif\n\ndefault: debug_print\n\ndebug_print:\n\t@echo \"Make $(HAXE_BUILDS)\"\n\n$(HAXE_BUILDS): build-haxe-%:\n\t@echo \"Haxe $(if $(filter $*,$(SIMULATOR_ARCH)),simulator,device) build: $(CONFIG)$(SUFFIX_$*)\"\n\thaxe Build.hxml $(HXCPP_FLAGS_$*) -cpp build/$(CONFIG)$(SUFFIX_$*) $(DEBUG)\n\tcd build/$(CONFIG)$(SUFFIX_$*); ::HAXELIB_PATH:: export HXCPP_NO_COLOR=1; \\\n\t\thaxelib run ::CPP_BUILD_LIBRARY:: Build.xml haxe -Ddestination=\"$(CURDIR)/../lib/$*$(LIB_DEST)\" \\\n\t\t-options Options.txt $(DEBUG)\n\ttouch ../Classes/Main.mm\n\tcd build/$(CONFIG)$(SUFFIX_$*); ::HAXELIB_PATH:: export HXCPP_NO_COLOR=1; \\\n\t\t::CPP_CACHE_WORKAROUND:: haxelib run ::CPP_BUILD_LIBRARY:: \"$(CURDIR)/BuildHxcppMbedtls.xml\" \\\n\t\t-Ddestination=\"$(CURDIR)/../lib/$*$(LIB_MBEDTLS_DEST)\" \\\n\t\t-options \"$(CURDIR)/build/$(CONFIG)$(SUFFIX_$*)/Options.txt\" $(DEBUG)\n\nclean:\n\trm -rf build\n\n.PHONY: default debug_print clean $(HAXE_BUILDS)\n.SUFFIXES:\n"
  },
  {
    "path": "templates/ios/template/{{app.file}}/{{app.file}}-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t::if (languages != null)::<key>CFBundleLocalizations</key>\n\t<array>::foreach languages::\n\t\t<string>::__current__::</string>::end::\n\t</array>::end::\n\t<key>CFBundleDisplayName</key>\n\t<string>::APP_TITLE::</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>::APP_PACKAGE::</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>::APP_VERSION::</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>::APP_BUILD_NUMBER::</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t::if (IOS_LAUNCH_STORYBOARD != null)::<key>UILaunchStoryboardName</key>\n\t<string>::IOS_LAUNCH_STORYBOARD::</string>::end::\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<dict>\n\t\t::foreach REQUIRED_CAPABILITY::<key>::name::</key>\n\t\t::if value::<true/>::else::<false/>::end::::end::\n\t</dict>\n\t<key>UIStatusBarHidden</key>\n\t<::WIN_FULLSCREEN::/>\n\t<key>UIRequiresFullScreen</key>\n\t<::WIN_FULLSCREEN::/>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<::!WIN_FULLSCREEN::/>\n\t::if (IOS_APP_ORIENTATION != null)::<key>UISupportedInterfaceOrientations</key>\n\t::IOS_APP_ORIENTATION::::end::\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t::if (IOS_ALLOW_INSECURE_HTTP != null)::<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t::foreach IOS_ALLOW_INSECURE_HTTP::<key>::domain::</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSIncludesSubdomains</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>NSTemporaryExceptionMinimumTLSVersion</key>\n\t\t\t\t<string>TLSv1.1</string>\n\t\t\t</dict>\n\t\t</dict>::end::::else::<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>::end::\n\t</dict>\n\t::if (IOS_NON_EXEMPT_ENCRYPTION != null)::<key>ITSAppUsesNonExemptEncryption</key><::IOS_NON_EXEMPT_ENCRYPTION:: />::end::\n</dict>\n</plist>"
  },
  {
    "path": "templates/ios/template/{{app.file}}/{{app.file}}-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the '::APP_FILE::' target in the '::APP_FILE::' project\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_3_0\n#warning \"This project uses features only available in iOS SDK 3.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    #import <UIKit/UIKit.h>\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "templates/ios/template/{{app.file}}/{{app.file}}.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>get-task-allow</key>\n    <true/>\n</dict>\n</plist>"
  },
  {
    "path": "templates/ios/template/{{app.file}}.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1E2E17AD131E8B5D0048F3C7 /* ::APP_FILE::/assets in Resources */ = {isa = PBXBuildFile; fileRef = 1E2E17A5131E8B5D0048F3C7 /* Data */; };\n\t\t1EF0A83B121ADB8E003F2F59 /* ::APP_FILE::/haxe/build in Sources */ = {isa = PBXBuildFile; fileRef = 1E2E17A5141E8B5D0048F3C7 /* haxe */; };\n\t\t1EEEBA9B121AF1C60048A9DF /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBA9A121AF1C60048A9DF /* UIKit.framework */; };\n\t\t1EEEBAA3121AF2210048A9DF /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAA2121AF2210048A9DF /* OpenAL.framework */; };\n\t\t1EEEBAA5121AF2210048A9DF /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAA4121AF2210048A9DF /* OpenGLES.framework */; };\n\t\t1EEEBAA7121AF2210048A9DF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAA6121AF2210048A9DF /* QuartzCore.framework */; };\n\t\t1EEEBAB3121AF2880048A9D0 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB2121AF2880048A9D0 /* CoreMotion.framework */; };\n\t\t1EEEBAB3121AF2880048A9D1 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB2121AF2880048A9D1 /* MediaPlayer.framework */; };\n\t\t1EEEBAB3121AF2880048A9DF /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB2121AF2880048A9DF /* CoreAudio.framework */; };\n\t\t1EEEBAB5121AF2880048A9DF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB4121AF2880048A9DF /* CoreGraphics.framework */; };\n\t\t1EEEBAFC121BE2980048A9DF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAFB121BE2980048A9DF /* AudioToolbox.framework */; };\n\t\t1EEEBAFE121BE2980048A9DF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAFD121BE2980048A9DF /* AVFoundation.framework */; };\n\t\t1EEEBB00121BE2B30048A9DF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAFF121BE2B30048A9DF /* Foundation.framework */; };\n\t\t1EF0A83A121ADB8E003F2F59 /* Main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1EF0A839121ADB8E003F2F59 /* Main.mm */; };\n\t\t4257533F1A5EFD8C004AA45B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4257533E1A5EFD8C004AA45B /* Images.xcassets */; };\n\t\t6892FA0E263B5BC100EA2669 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6892FA0D263B5BC100EA2669 /* Metal.framework */; };\n\t\t792E75C91C6C876900D01DE0 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 792E75C81C6C876900D01DE0 /* GameController.framework */; };\n\t\t792E75C91C6C876900D01DE1 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 792E75C81C6C876900D01DE1 /* CoreText.framework */; };\n\t\t7C1D3D2F27403D7800CFEBE5 /* CoreHaptics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C1D3D2E27403D7800CFEBE5 /* CoreHaptics.framework */; };\n\t\t::if (IOS_LAUNCH_STORYBOARD != null)::D099CA9021A64C87003837AD /* ::IOS_LAUNCH_STORYBOARD::.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D099CA8F21A64C86003837AD /* ::IOS_LAUNCH_STORYBOARD::.storyboard */; };::end::\n\t\t::ADDL_PBX_BUILD_FILE::\n\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1EF0A882121AE1D2003F2F59 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1EF0A87F121AE1CE003F2F59;\n\t\t\tremoteInfo = \"Build Haxe\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t1D6058910D05DD3D006BFB54 /* ::APP_TITLE::.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"::APP_TITLE::.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1E2E17A5131E8B5D0048F3C7 /* ::APP_FILE::/assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = \"::APP_FILE::/assets\"; sourceTree = \"<group>\"; };\n\t\t1E2E17A5141E8B5D0048F3C7 /* ::APP_FILE::/haxe/build */ = {isa = PBXFileReference; lastKnownFileType = folder; path = \"::APP_FILE::/haxe/build\"; sourceTree = SOURCE_ROOT; };\n\t\t1EEEBA9A121AF1C60048A9DF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAA2121AF2210048A9DF /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAA4121AF2210048A9DF /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAA6121AF2210048A9DF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB2121AF2880048A9D0 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB2121AF2880048A9D1 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB2121AF2880048A9DF /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB4121AF2880048A9DF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAFB121BE2980048A9DF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAFD121BE2980048A9DF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAFF121BE2B30048A9DF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t1EF0A839121ADB8E003F2F59 /* Main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Main.mm; path = \"::APP_FILE::/Classes/Main.mm\"; sourceTree = SOURCE_ROOT; };\n\t\t4257533E1A5EFD8C004AA45B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = \"::APP_FILE::/Images.xcassets\"; sourceTree = \"<group>\"; };\n\t\t6662F3920A0E282007F4E3E /* ::APP_FILE::.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = \"::APP_FILE::.entitlements\"; path = \"::APP_FILE::/::APP_FILE::.entitlements\"; sourceTree = \"<group>\"; };\n\t\t6892FA0D263B5BC100EA2669 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };\n\t\t792E75C81C6C876900D01DE0 /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; };\n\t\t792E75C81C6C876900D01DE1 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };\n\t\t7C1D3D2E27403D7800CFEBE5 /* CoreHaptics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreHaptics.framework; path = System/Library/Frameworks/CoreHaptics.framework; sourceTree = SDKROOT; };\n\t\t::if (IOS_LAUNCH_STORYBOARD != null)::D099CA8F21A64C86003837AD /* ::IOS_LAUNCH_STORYBOARD::.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = \"::APP_FILE::/::IOS_LAUNCH_STORYBOARD::.storyboard\"; sourceTree = \"<group>\"; };::end::\n\t\t::ADDL_PBX_FILE_REFERENCE::\n\n\t\t8D1107310486CEB800E47090 /* ::APP_FILE::-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"::APP_FILE::/::APP_FILE::-Info.plist\"; plistStructureDefinitionIdentifier = \"com.apple.xcode.plist.structure-definition.iphone.info-plist\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1D60588F0D05DD3D006BFB54 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t::if ARMV6::1EF0A888121AE2F0003F2F59 /* lib/ApplicationMain.a in lib */,::end::\n\t\t\t\t::if ARMV7::1EF0A888121AE2F0003F2F5A /* lib/ApplicationMain-v7.a in lib */,::end::\n\t\t\t\t792E75C91C6C876900D01DE0 /* GameController.framework in Frameworks */,\n\t\t\t\t792E75C91C6C876900D01DE1 /* CoreText.framework in Frameworks */,\n\t\t\t\t7C1D3D2F27403D7800CFEBE5 /* CoreHaptics.framework in Frameworks */,\n\t\t\t\t6892FA0E263B5BC100EA2669 /* Metal.framework in Frameworks */,\n\t\t\t\t1EEEBA9B121AF1C60048A9DF /* UIKit.framework in Frameworks */,\n\t\t\t\t1EEEBAA3121AF2210048A9DF /* OpenAL.framework in Frameworks */,\n\t\t\t\t1EEEBAA5121AF2210048A9DF /* OpenGLES.framework in Frameworks */,\n\t\t\t\t1EEEBAA7121AF2210048A9DF /* QuartzCore.framework in Frameworks */,\n\t\t\t\t1EEEBAB3121AF2880048A9DF /* CoreAudio.framework in Frameworks */,\n\t\t\t\t1EEEBAB5121AF2880048A9DF /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t1EEEBAFC121BE2980048A9DF /* AudioToolbox.framework in Frameworks */,\n\t\t\t\t1EEEBAFE121BE2980048A9DF /* AVFoundation.framework in Frameworks */,\n\t\t\t\t1EEEBB00121BE2B30048A9DF /* Foundation.framework in Frameworks */,\n\t\t\t\t1EEEBAB3121AF2880048A9D0 /* CoreMotion.framework in Frameworks */,\n\t\t\t\t1EEEBAB3121AF2880048A9D1 /* MediaPlayer.framework in Frameworks */,\n\t\t\t\t::ADDL_PBX_FRAMEWORKS_BUILD_PHASE::\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t080E96DDFE201D6D7F000001 /* Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1EF0A839121ADB8E003F2F59 /* Main.mm */,\n\t\t\t);\n\t\t\tpath = Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FACFE9D520D11CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1D6058910D05DD3D006BFB54 /* ::APP_TITLE::.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1EEEBA99121AF18B0048A9DF /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6892FA0D263B5BC100EA2669 /* Metal.framework */,\n\t\t\t\t792E75C81C6C876900D01DE0 /* GameController.framework */,\n\t\t\t\t792E75C81C6C876900D01DE1 /* CoreText.framework */,\n\t\t\t\t7C1D3D2E27403D7800CFEBE5 /* CoreHaptics.framework */,\n\t\t\t\t1EEEBA9A121AF1C60048A9DF /* UIKit.framework */,\n\t\t\t\t1EEEBAA2121AF2210048A9DF /* OpenAL.framework */,\n\t\t\t\t1EEEBAA4121AF2210048A9DF /* OpenGLES.framework */,\n\t\t\t\t1EEEBAA6121AF2210048A9DF /* QuartzCore.framework */,\n\t\t\t\t1EEEBAB2121AF2880048A9DF /* CoreAudio.framework */,\n\t\t\t\t1EEEBAB4121AF2880048A9DF /* CoreGraphics.framework */,\n\t\t\t\t1EEEBAFF121BE2B30048A9DF /* Foundation.framework */,\n\t\t\t\t1EEEBAFB121BE2980048A9DF /* AudioToolbox.framework */,\n\t\t\t\t1EEEBAFD121BE2980048A9DF /* AVFoundation.framework */,\n\t\t\t\t1EEEBAB2121AF2880048A9D0 /* CoreMotion.framework */,\n\t\t\t\t1EEEBAB2121AF2880048A9D1 /* MediaPlayer.framework */,\n\t\t\t\t::ADDL_PBX_FRAMEWORK_GROUP::\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6662F3920A0E282007F4E3E /* ::APP_FILE::.entitlements */,\n\t\t\t\t1EEEBA99121AF18B0048A9DF /* Frameworks */,\n\t\t\t\t080E96DDFE201D6D7F000001 /* Classes */,\n\t\t\t\t29B97315FDCFA39411CA2CEA /* Other Sources */,\n\t\t\t\t29B97317FDCFA39411CA2CEA /* Resources */,\n\t\t\t\t19C28FACFE9D520D11CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = CustomTemplate;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97315FDCFA39411CA2CEA /* Other Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1E2E17A5141E8B5D0048F3C7 /* ::APP_FILE::/haxe/build */,\n\t\t\t);\n\t\t\tname = \"Other Sources\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97317FDCFA39411CA2CEA /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4257533E1A5EFD8C004AA45B /* Images.xcassets */,\n\t\t\t\t::if (IOS_LAUNCH_STORYBOARD != null)::D099CA8F21A64C86003837AD /* ::IOS_LAUNCH_STORYBOARD::.storyboard */,::end::\n\t\t\t\t8D1107310486CEB800E47090 /* ::APP_FILE::/::APP_FILE::-Info.plist */,\n\t\t\t\t1E2E17A5131E8B5D0048F3C7 /* ::APP_FILE::/assets */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1D6058900D05DD3D006BFB54 /* \"::APP_FILE::\" */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget \"::APP_FILE::\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1D60588D0D05DD3D006BFB54 /* Resources */,\n\t\t\t\t1D60588E0D05DD3D006BFB54 /* Sources */,\n\t\t\t\t1D60588F0D05DD3D006BFB54 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1EF0A883121AE1D2003F2F59 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"::APP_FILE::\";\n\t\t\tproductName = \"::APP_TITLE::\";\n\t\t\tproductReference = 1D6058910D05DD3D006BFB54 /* ::APP_TITLE::.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXLegacyTarget section */\n\t\t1EF0A87F121AE1CE003F2F59 /* Build Haxe */ = {\n\t\t\tisa = PBXLegacyTarget;\n\t\t\tbuildArgumentsString = \"\";\n\t\t\tbuildConfigurationList = 1EF0A885121AE21C003F2F59 /* Build configuration list for PBXLegacyTarget \"Build Haxe\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tbuildToolPath = make;\n\t\t\tbuildWorkingDirectory = \"::APP_FILE::/haxe\";\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Build Haxe\";\n\t\t\tpassBuildSettingsInEnvironment = 1;\n\t\t\tproductName = \"Build Haxe\";\n\t\t};\n/* End PBXLegacyTarget section */\n\n/* Begin PBXProject section */\n\t\t29B97313FDCFA39411CA2CEA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0920;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1D6058900D05DD3D006BFB54 = {\n\t\t\t\t\t\t::if DEVELOPMENT_TEAM_ID::DevelopmentTeam = ::DEVELOPMENT_TEAM_ID::;::end::\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject \"::APP_TITLE::\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\thasScannedForEncodings = 1;\n\t\t\tmainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1D6058900D05DD3D006BFB54 /* ::APP_FILE:: */,\n\t\t\t\t1EF0A87F121AE1CE003F2F59 /* Build Haxe */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1D60588D0D05DD3D006BFB54 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1E2E17AD131E8B5D0048F3C7 /* ::APP_FILE::/assets in Resources */,\n\t\t\t\t::if (IOS_LAUNCH_STORYBOARD != null)::D099CA9021A64C87003837AD /* ::IOS_LAUNCH_STORYBOARD::.storyboard in Resources */,::end::\n\t\t\t\t4257533F1A5EFD8C004AA45B /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1D60588E0D05DD3D006BFB54 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1EF0A83A121ADB8E003F2F59 /* Main.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t1EF0A883121AE1D2003F2F59 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1EF0A87F121AE1CE003F2F59 /* Build Haxe */;\n\t\t\ttargetProxy = 1EF0A882121AE1D2003F2F59 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\tC01FCF4F08A954540054247B /* Debug */ = {/* Build configuration list for PBXProject \"::APP_TITLE::\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = ::CURRENT_ARCHS::;\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"::config.ios.identity::\";\n\t\t\t\t::if (IOS_PROVISIONING_PROFILE)::PROVISIONING_PROFILE = \"::IOS_PROVISIONING_PROFILE::\";::end::\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ::DEPLOYMENT::;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"::TARGET_DEVICES::\";\n\t\t\t\t::THUMB_SUPPORT::\n\t\t\t\tVALID_ARCHS = \"::VALID_ARCHS::\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC01FCF5008A954540054247B /* Release */ = {/* Build configuration list for PBXProject \"::APP_TITLE::\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = ::CURRENT_ARCHS::;\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"::config.ios.identity::\";\n\t\t\t\t::if (IOS_PROVISIONING_PROFILE)::PROVISIONING_PROFILE = \"::IOS_PROVISIONING_PROFILE::\";::end::\n\t\t\t\t/* COMPRESS_PNG_FILES = NO; */\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ::DEPLOYMENT::;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\t/* PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; */\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"::TARGET_DEVICES::\";\n\t\t\t\t::THUMB_SUPPORT::\n\t\t\t\tVALID_ARCHS = \"::VALID_ARCHS::\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1D6058940D05DD3E006BFB54 /* Debug */ = {/* Build configuration list for PBXNativeTarget \"::APP_TITLE::\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\t::if (IOS_LAUNCH_STORYBOARD == null)::ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;::end::\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"::APP_FILE::/::APP_FILE::.entitlements\";\n\t\t\t\t::if DEVELOPMENT_TEAM_ID::DEVELOPMENT_TEAM = ::DEVELOPMENT_TEAM_ID::;::end::\n\t\t\t\tENABLE_BITCODE = ::if (ENABLE_BITCODE)::YES::else::NO::end::;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t::foreach frameworkSearchPaths:: \"\\\"::__current__::\\\"\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"::APP_FILE::/::APP_FILE::-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"::APP_FILE::/::APP_FILE::-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ::DEPLOYMENT::;\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=arm64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/arm64-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/arm64\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv6]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv6-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv6\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv7]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv7-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv7\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=i386]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/i386-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/i386\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=x86_64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/x86_64-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/x86_64\\\"\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-lmbedtls_hxcpp\",\n\t\t\t\t\t::foreach ndlls:: \"-l::name::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t::foreach linkedLibraries:: \"-l::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t\"-lApplicationMain\",\n\t\t\t\t\t::foreach IOS_LINKER_FLAGS:: \"::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"::APP_PACKAGE::\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1D6058950D05DD3E006BFB54 /* Release */ = {/* Build configuration list for PBXNativeTarget \"::APP_TITLE::\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\t::if (IOS_LAUNCH_STORYBOARD == null)::ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;::end::\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"::APP_FILE::/::APP_FILE::.entitlements\";\n\t\t\t\t::if DEVELOPMENT_TEAM_ID::DEVELOPMENT_TEAM = ::DEVELOPMENT_TEAM_ID::;::end::\n\t\t\t\tENABLE_BITCODE = ::if (ENABLE_BITCODE)::YES::else::NO::end::;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t::foreach frameworkSearchPaths:: \"\\\"::__current__::\\\"\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"::APP_FILE::/::APP_FILE::-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"::APP_FILE::/::APP_FILE::-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ::DEPLOYMENT::;\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=arm64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/arm64\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv6]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv6\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv7]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv7\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=i386]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/i386\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=x86_64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/x86_64\\\"\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-lmbedtls_hxcpp\",\n\t\t\t\t\t::foreach ndlls:: \"-l::name::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t::foreach linkedLibraries:: \"-l::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t\"-lApplicationMain\",\n\t\t\t\t\t::foreach IOS_LINKER_FLAGS:: \"::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"::APP_PACKAGE::\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1EF0A880121AE1CE003F2F59 /* Debug */ = {/* Build configuration list for PBXLegacyTarget \"Build Haxe\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1EF0A881121AE1CE003F2F59 /* Release */ = {/* Build configuration list for PBXLegacyTarget \"Build Haxe\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tC01FCF4E08A954540054247B /* Build configuration list for PBXProject \"::APP_TITLE::\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC01FCF4F08A954540054247B /* Debug */,\n\t\t\t\tC01FCF5008A954540054247B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget \"::APP_TITLE::\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1D6058940D05DD3E006BFB54 /* Debug */,\n\t\t\t\t1D6058950D05DD3E006BFB54 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1EF0A885121AE21C003F2F59 /* Build configuration list for PBXLegacyTarget \"Build Haxe\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1EF0A880121AE1CE003F2F59 /* Debug */,\n\t\t\t\t1EF0A881121AE1CE003F2F59 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t}; /* end objects */\n\trootObject = 29B97313FDCFA39411CA2CEA /* Project object */;\n}"
  },
  {
    "path": "templates/java/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-java ::OUTPUT_DIR::/obj\n--macro keep(\"::APP_MAIN::\")\n-debug"
  },
  {
    "path": "templates/java/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-java ::OUTPUT_DIR::/obj\n--macro keep(\"::APP_MAIN::\")\n-D final"
  },
  {
    "path": "templates/java/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-java ::OUTPUT_DIR::/obj\n--macro keep(\"::APP_MAIN::\")"
  },
  {
    "path": "templates/mac/Entitlements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n</dict>\n</plist>"
  },
  {
    "path": "templates/mac/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>::APP_FILE::</string>\n\t<key>CFBundleIconFile</key>\n\t<string>icon.icns</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>::APP_PACKAGE::</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>::APP_TITLE::</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>::APP_VERSION::</string>\n\t<key>CFBundleSignature</key>\n\t<string>haxe</string>\n\t<key>CFBundleVersion</key>\n\t<string>::APP_BUILD_NUMBER::</string>\n\t<key>NSAppleScriptEnabled</key>\n\t<string>NO</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.games</string>\n\t<key>NSHighResolutionCapable</key>\n\t<string>True</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "templates/neko/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-neko ::NEKO_FILE::\n--macro keep(\"::APP_MAIN::\")\n-debug"
  },
  {
    "path": "templates/neko/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-neko ::NEKO_FILE::\n--macro keep(\"::APP_MAIN::\")\n-D final"
  },
  {
    "path": "templates/neko/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-neko ::NEKO_FILE::\n--macro keep(\"::APP_MAIN::\")"
  },
  {
    "path": "templates/nodejs/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::NODE_FILE::\n-cp ::OUTPUT_DIR::/haxe\n--macro allowPackage(\"flash\")\n--macro define(\"sys\")\n-D nodejs\n-D js-flatten\n-debug"
  },
  {
    "path": "templates/nodejs/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::NODE_FILE::\n-cp ::OUTPUT_DIR::/haxe\n--macro allowPackage(\"flash\")\n--macro define(\"sys\")\n-D nodejs\n-D js-flatten\n-D final"
  },
  {
    "path": "templates/nodejs/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::NODE_FILE::\n-cp ::OUTPUT_DIR::/haxe\n--macro allowPackage(\"flash\")\n--macro define(\"sys\")\n-D nodejs\n-D js-flatten"
  },
  {
    "path": "templates/project/Assets/.gitignore",
    "content": ""
  },
  {
    "path": "templates/project/Source/Main.hx",
    "content": "package;\n\nimport lime.app.Application;\n\nclass Main extends Application\n{\n\tpublic function new()\n\t{\n\t\tsuper();\n\t}\n}\n"
  },
  {
    "path": "templates/project/project.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project>\n\t\n\t<meta title=\"::title::\" package=\"::packageName::\" version=\"::version::\" company=\"::company::\" />\n\t<app main=\"Main\" path=\"Export\" file=\"::file::\" />\n\t\n\t<source path=\"Source\" />\n\t\n\t<haxelib name=\"lime\" />\n\t\n\t<assets path=\"Assets\" rename=\"assets\" />\n\t\n</project>"
  },
  {
    "path": "templates/project/{{app.file}}.hxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project version=\"2\">\n  <!-- Output SWF options -->\n  <output>\n    <movie outputType=\"CustomBuild\" />\n    <movie input=\"\" />\n    <movie path=\"project.xml\" />\n    <movie fps=\"30\" />\n    <movie width=\"800\" />\n    <movie height=\"600\" />\n    <movie version=\"1\" />\n    <movie minorVersion=\"0\" />\n    <movie platform=\"Lime\" />\n    <movie background=\"#FFFFFF\" />\n    <movie preferredSDK=\";3;\" />\n  </output>\n  <!-- Other classes to be compiled into your SWF -->\n  <classpaths>\n    <class path=\"d:\\Development\\Haxe\\lime\" />\n    <class path=\"Source\" />\n    <class path=\"Export\\html5\\haxe\" />\n  </classpaths>\n  <!-- Build options -->\n  <build>\n    <option directives=\"lime=2.1.3&#xA;tools=2.1.3&#xA;no-compilation&#xA;lime-html5&#xA;html5&#xA;web&#xA;html5&#xA;html\" />\n    <option flashStrict=\"False\" />\n    <option noInlineOnDebug=\"False\" />\n    <option mainClass=\"ApplicationMain\" />\n    <option enabledebug=\"False\" />\n    <option additional=\"\" />\n  </build>\n  <!-- haxelib libraries -->\n  <haxelib>\n    <!-- example: <library name=\"...\" /> -->\n  </haxelib>\n  <!-- Class files to compile (other referenced classes will automatically be included) -->\n  <compileTargets>\n    <!-- example: <compile path=\"...\" /> -->\n  </compileTargets>\n  <!-- Paths to exclude from the Project Explorer tree -->\n  <hiddenPaths>\n    <hidden path=\"obj\" />\n  </hiddenPaths>\n  <!-- Executed before build -->\n  <preBuildCommand>\"$(CompilerPath)/haxelib\" run lime build \"$(OutputFile)\" $(TargetBuild) -$(BuildConfig) -Dfdb</preBuildCommand>\n  <!-- Executed after build -->\n  <postBuildCommand alwaysRun=\"False\" />\n  <!-- Other project options -->\n  <options>\n    <option showHiddenPaths=\"False\" />\n    <option testMovie=\"Custom\" />\n    <option testMovieCommand=\"\" />\n  </options>\n  <!-- Plugin storage -->\n  <storage />\n</project>"
  },
  {
    "path": "templates/tizen/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D tizen\n-debug\n-D no-compilation"
  },
  {
    "path": "templates/tizen/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D tizen\n-D no-compilation\n-D final"
  },
  {
    "path": "templates/tizen/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D tizen\n-D no-compilation"
  },
  {
    "path": "templates/tizen/template/CommandLineBuild/build_data",
    "content": "PLATFORM_VER:Tizen 2.2\nARCHITECTURE:::if (SIMULATOR)::i386::else::armel::end::\nTOOLCHAIN:GCC-4.5\nTYPE:app\n"
  },
  {
    "path": "templates/tizen/template/manifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<Manifest xmlns=\"http://schemas.tizen.org/2012/12/manifest\">\n\t<Id>::APP_PACKAGE::</Id>\n\t<Version>::APP_VERSION::</Version>\n\t<Type>C++App</Type>\n\t<Requirements>\n        <Feature Name=\"http://tizen.org/feature/screen.size.all\">true</Feature>\n\t\t<Feature Name=\"http://tizen.org/api/filesystem\">true</Feature>\n\t</Requirements>\n\t<Apps>\n\t\t<ApiVersion>2.2</ApiVersion>\n\t\t<Privileges>\n\t\t\t<Privilege>http://tizen.org/privilege/application.launch</Privilege>\n\t\t</Privileges>\n\t\t<UiApp HwAcceleration=\"On\" Name=\"::APP_FILE::\" Main=\"True\" MenuIconVisible=\"True\">\n\t\t\t<UiScalability CoordinateSystem=\"Physical\"></UiScalability>\n\t\t\t<UiTheme SystemTheme=\"Black\"></UiTheme>\n\t\t\t<DisplayNames>\n\t\t\t\t<DisplayName Locale=\"eng-GB\">::APP_TITLE::</DisplayName>\n\t\t\t</DisplayNames>\n\t\t\t<Icons>\n\t\t\t\t<Icon Section=\"MainMenu\">mainmenu.png</Icon>\n\t\t\t</Icons>\n\t\t\t<LaunchConditions/>\n\t\t</UiApp>\n\t</Apps>\n</Manifest>\n"
  },
  {
    "path": "templates/tvos/PROJ/Classes/Main.mm",
    "content": "#include <stdio.h>\n\nextern \"C\" const char *hxRunLibrary ();\nextern \"C\" void hxcpp_set_top_of_stack ();\n\nextern \"C\" int zlib_register_prims ();\nextern \"C\" int lime_register_prims ();\n::foreach ndlls::::if (registerStatics)::\nextern \"C\" int ::nameSafe::_register_prims ();::end::::end::\n\n\nextern \"C\" int SDL_main (int argc, char *argv[]) {\n\n\thxcpp_set_top_of_stack ();\n\n\tzlib_register_prims ();\n\tlime_register_prims ();\n\t::foreach ndlls::::if (registerStatics)::\n\t::nameSafe::_register_prims ();::end::::end::\n\n\tconst char *err = NULL;\n\terr = hxRunLibrary ();\n\n\tif (err) {\n\n\t\tprintf (\"Error %s\\n\", err);\n\t\treturn -1;\n\n\t}\n\n\treturn 0;\n\n}"
  },
  {
    "path": "templates/tvos/PROJ/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"57x57\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"57x57\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-40.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-50.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-50@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"72x72\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-72.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"72x72\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-72@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76@2x.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "templates/tvos/PROJ/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"736h\",\n      \"filename\" : \"Default-736h@3x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"736h\",\n      \"filename\" : \"Default-736h-Landscape@3x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"landscape\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"667h\",\n      \"filename\" : \"Default-667h@2x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"filename\" : \"Default-568h@2x.png\",\n      \"minimum-system-version\" : \"7.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Portrait.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Landscape.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Portrait@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"filename\" : \"Default-Landscape@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-568h@2x.png\",\n      \"subtype\" : \"retina4\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"to-status-bar\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Portrait.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"to-status-bar\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Landscape.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"to-status-bar\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Portrait@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"to-status-bar\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"filename\" : \"Default-Landscape@2x.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "templates/tvos/PROJ/PROJ-Entitlements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>get-task-allow</key>\n    <true/>\n</dict>\n</plist>"
  },
  {
    "path": "templates/tvos/PROJ/PROJ-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>::APP_TITLE::</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>::APP_PACKAGE::</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>::APP_VERSION::</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>::APP_BUILD_NUMBER::</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<dict>\n\t\t::foreach REQUIRED_CAPABILITY::\n\t\t\t<key>::name::</key>\n\t\t\t::if value::<true/>::else::<false/>::end::\n\t\t::end::\n\t</dict>\n\t<key>UIStatusBarHidden</key>\n\t<::WIN_FULLSCREEN::/>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<::!WIN_FULLSCREEN::/>\n\t::if (IOS_APP_ORIENTATION != null)::\n\t<key>UISupportedInterfaceOrientations</key>\n\t::IOS_APP_ORIENTATION::::end::\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key><true/>\n\t</dict>\n\t::if (IOS_NON_EXEMPT_ENCRYPTION != null)::<key>ITSAppUsesNonExemptEncryption</key><::IOS_NON_EXEMPT_ENCRYPTION:: />::end::\n</dict>\n</plist>\n"
  },
  {
    "path": "templates/tvos/PROJ/PROJ-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the '::APP_FILE::' target in the '::APP_FILE::' project\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_3_0\n#warning \"This project uses features only available in iOS SDK 3.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    #import <UIKit/UIKit.h>\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "templates/tvos/PROJ/exportOptions-adhoc.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>ad-hoc</string>\n\t\t::if (config.ios.adhoc.manifest != null)::<key>manifest</key>\n\t\t<dict>\n\t\t\t<key>appURL</key>\n\t\t\t<string>::config.ios.adhoc.manifest.appURL::</string>\n\t\t\t<key>displayImageURL</key>\n\t\t\t<string>::config.ios.adhoc.manifest.displayImageURL::</string>\n\t\t\t<key>fullSizeImageURL</key>\n\t\t\t<string>::config.ios.adhoc.manifest.fullSizeImageURL::</string>\n\t\t</dict>::end::\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/tvos/PROJ/exportOptions-appstore.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>app-store</string>\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/tvos/PROJ/exportOptions-development.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>development</string>\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/tvos/PROJ/exportOptions-enterprise.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n\t<dict>\n\t\t<key>method</key>\n\t\t<string>enterprise</string>\n\t</dict>\n</plist>"
  },
  {
    "path": "templates/tvos/PROJ/haxe/Build.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-D tvos\n-D appletv\n--macro keep(\"::APP_MAIN::\")\n-D no-compilation"
  },
  {
    "path": "templates/tvos/PROJ/haxe/BuildHxcppMbedtls.xml",
    "content": "<xml>\n\n\t<include name=\"${HXCPP}/project/thirdparty/mbedtls-files.xml\" noerror=\"true\" />\n\t<set name=\"HAS_HXCPP_MBEDTLS_FILES\" value=\"1\" if=\"MBEDTLS_DIR\" />\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\t<include name=\"${HXCPP}/src/hx/libs/ssl/Build.xml\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\n\t<target id=\"default\" output=\"libmbedtls_hxcpp${DBG}\" tool=\"linker\" toolid=\"static_link\">\n\n\t\t<files id=\"mbedtls\" if=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\t\t<files id=\"hxcpp_ssl\" unless=\"HAS_HXCPP_MBEDTLS_FILES\" />\n\n\t</target>\n\n</xml>\n"
  },
  {
    "path": "templates/tvos/PROJ/haxe/makefile",
    "content": "\nifeq (\"$(ARCHS)\",\"normal\")\n\tARCHS = arm64\nendif\n\nHAXE_BUILDS := $(ARCHS:%=build-haxe-%)\n\nifeq (\"$(CONFIGURATION)\",\"Debug\")\n   BUILD_STYLE := Debug\nendif\n\nifeq (\"$(BUILD_STYLE)\",\"Debug\")\n   DEBUG := -debug\n   CONFIG := Debug\nelse\n   DEBUG :=\n   CONFIG := Release\nendif\n\nHAXE_OS := $(PLATFORM_NAME)\nifeq (\"$(HAXE_OS)\",\"appletvsimulator\")\n   HAXE_OS := appletvsim\nendif\nCONFIG := $(CONFIG)-$(HAXE_OS)\n\nLIB_DEST := $(DEBUG)/libApplicationMain.a\nLIB_MBEDTLS_DEST := $(DEBUG)/libmbedtls_hxcpp.a\n\nSIMULATOR_ARCH = x86_64\n\nSUFFIX_arm64 = -64\nSUFFIX_x86_64 = -64\n\nHXCPP_FLAGS_x86_64 = -D simulator -D HXCPP_M64\nHXCPP_FLAGS_arm64 = -D HXCPP_ARM64\n\nifeq (\"$(ACTION)\",\"clean\")\ndefault: clean\nelse\ndefault: $(HAXE_BUILDS)\nendif\n\ndefault: debug_print\n\ndebug_print:\n\t@echo \"Make $(HAXE_BUILDS)\"\n\n$(HAXE_BUILDS): build-haxe-%:\n\t@echo \"Haxe $(if $(filter $*,$(SIMULATOR_ARCH)),simulator,device) build: $(CONFIG)$(SUFFIX_$*)\"\n\thaxe Build.hxml $(HXCPP_FLAGS_$*) -cpp build/$(CONFIG)$(SUFFIX_$*) $(DEBUG)\n\tcd build/$(CONFIG)$(SUFFIX_$*); ::HAXELIB_PATH:: export HXCPP_NO_COLOR=1; \\\n\t\thaxelib run ::CPP_BUILD_LIBRARY:: Build.xml haxe -Ddestination=\"$(CURDIR)/../lib/$*$(LIB_DEST)\" \\\n\t\t-options Options.txt $(DEBUG)\n\ttouch ../Classes/Main.mm\n\tcd build/$(CONFIG)$(SUFFIX_$*); ::HAXELIB_PATH:: export HXCPP_NO_COLOR=1; \\\n\t\t::CPP_CACHE_WORKAROUND:: haxelib run ::CPP_BUILD_LIBRARY:: \"$(CURDIR)/BuildHxcppMbedtls.xml\" \\\n\t\t-Ddestination=\"$(CURDIR)/../lib/$*$(LIB_MBEDTLS_DEST)\" \\\n\t\t-options \"$(CURDIR)/build/$(CONFIG)$(SUFFIX_$*)/Options.txt\" $(DEBUG)\n\nclean:\n\trm -rf build\n\n.PHONY: default debug_print clean $(HAXE_BUILDS)\n.SUFFIXES:\n"
  },
  {
    "path": "templates/tvos/PROJ.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1E2E17AD131E8B5D0048F3C7 /* ::APP_FILE::/assets in Resources */ = {isa = PBXBuildFile; fileRef = 1E2E17A5131E8B5D0048F3C7 /* Data */; };\n\t\t1EF0A83B121ADB8E003F2F59 /* ::APP_FILE::/haxe/build in Sources */ = {isa = PBXBuildFile; fileRef = 1E2E17A5141E8B5D0048F3C7 /* haxe */; };\n\t\t1EEEBA9B121AF1C60048A9DF /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBA9A121AF1C60048A9DF /* UIKit.framework */; };\n\t\t1EEEBAA3121AF2210048A9DF /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAA2121AF2210048A9DF /* OpenAL.framework */; };\n\t\t1EEEBAA5121AF2210048A9DF /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAA4121AF2210048A9DF /* OpenGLES.framework */; };\n\t\t1EEEBAA7121AF2210048A9DF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAA6121AF2210048A9DF /* QuartzCore.framework */; };\n\t\t1EEEBAB3121AF2880048A9D1 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB2121AF2880048A9D1 /* MediaPlayer.framework */; };\n\t\t1EEEBAB3121AF2880048A9DF /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB2121AF2880048A9DF /* CoreAudio.framework */; };\n\t\t1EEEBAB5121AF2880048A9DF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAB4121AF2880048A9DF /* CoreGraphics.framework */; };\n\t\t1EEEBAFC121BE2980048A9DF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAFB121BE2980048A9DF /* AudioToolbox.framework */; };\n\t\t1EEEBAFE121BE2980048A9DF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAFD121BE2980048A9DF /* AVFoundation.framework */; };\n\t\t1EEEBB00121BE2B30048A9DF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEEBAFF121BE2B30048A9DF /* Foundation.framework */; };\n\t\t026D746C1BBED5C800EAA58A /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 026D746B1BBED5C800EAA58A /* GameController.framework */; };\n\t\t1EF0A83A121ADB8E003F2F59 /* Main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1EF0A839121ADB8E003F2F59 /* Main.mm */; };\n\t\t4257533F1A5EFD8C004AA45B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4257533E1A5EFD8C004AA45B /* Images.xcassets */; };\n\t\t::ADDL_PBX_BUILD_FILE::\n\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1EF0A882121AE1D2003F2F59 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1EF0A87F121AE1CE003F2F59;\n\t\t\tremoteInfo = \"Build Haxe\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t1D6058910D05DD3D006BFB54 /* ::APP_TITLE::.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"::APP_TITLE::.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1E2E17A5131E8B5D0048F3C7 /* ::APP_FILE::/assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = \"::APP_FILE::/assets\"; sourceTree = \"<group>\"; };\n\t\t1E2E17A5141E8B5D0048F3C7 /* ::APP_FILE::/haxe/build */ = {isa = PBXFileReference; lastKnownFileType = folder; path = \"::APP_FILE::/haxe/build\"; sourceTree = SOURCE_ROOT; };\n\t\t1EEEBA9A121AF1C60048A9DF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAA2121AF2210048A9DF /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAA4121AF2210048A9DF /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAA6121AF2210048A9DF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB2121AF2880048A9D1 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB2121AF2880048A9DF /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAB4121AF2880048A9DF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAFB121BE2980048A9DF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAFD121BE2980048A9DF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };\n\t\t1EEEBAFF121BE2B30048A9DF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t026D746B1BBED5C800EAA58A /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; };\n\t\t1EF0A839121ADB8E003F2F59 /* Main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Main.mm; path = \"::APP_FILE::/Classes/Main.mm\"; sourceTree = SOURCE_ROOT; };\n\t\t4257533E1A5EFD8C004AA45B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = \"::APP_FILE::/Images.xcassets\"; sourceTree = \"<group>\"; };\n\t\t\n\t\t::ADDL_PBX_FILE_REFERENCE::\n\n\t\t8D1107310486CEB800E47090 /* ::APP_FILE::-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"::APP_FILE::/::APP_FILE::-Info.plist\"; plistStructureDefinitionIdentifier = \"com.apple.xcode.plist.structure-definition.iphone.info-plist\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1D60588F0D05DD3D006BFB54 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t::if ARMV6::1EF0A888121AE2F0003F2F59 /* lib/ApplicationMain.a in lib */,::end::\n\t\t\t\t::if ARMV7::1EF0A888121AE2F0003F2F5A /* lib/ApplicationMain-v7.a in lib */,::end::\n\t\t\t\t1EEEBA9B121AF1C60048A9DF /* UIKit.framework in Frameworks */,\n\t\t\t\t1EEEBAA3121AF2210048A9DF /* OpenAL.framework in Frameworks */,\n\t\t\t\t1EEEBAA5121AF2210048A9DF /* OpenGLES.framework in Frameworks */,\n\t\t\t\t1EEEBAA7121AF2210048A9DF /* QuartzCore.framework in Frameworks */,\n\t\t\t\t1EEEBAB3121AF2880048A9DF /* CoreAudio.framework in Frameworks */,\n\t\t\t\t1EEEBAB5121AF2880048A9DF /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t1EEEBAFC121BE2980048A9DF /* AudioToolbox.framework in Frameworks */,\n\t\t\t\t1EEEBAFE121BE2980048A9DF /* AVFoundation.framework in Frameworks */,\n\t\t\t\t1EEEBB00121BE2B30048A9DF /* Foundation.framework in Frameworks */,\n\t\t\t\t1EEEBAB3121AF2880048A9D1 /* MediaPlayer.framework in Frameworks */,\n\t\t\t\t026D746C1BBED5C800EAA58A /* GameController.framework in Frameworks */,\n\t\t\t\t::ADDL_PBX_FRAMEWORKS_BUILD_PHASE::\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t080E96DDFE201D6D7F000001 /* Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1EF0A839121ADB8E003F2F59 /* Main.mm */,\n\t\t\t);\n\t\t\tpath = Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19C28FACFE9D520D11CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1D6058910D05DD3D006BFB54 /* ::APP_TITLE::.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1EEEBA99121AF18B0048A9DF /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1EEEBA9A121AF1C60048A9DF /* UIKit.framework */,\n\t\t\t\t1EEEBAA2121AF2210048A9DF /* OpenAL.framework */,\n\t\t\t\t1EEEBAA4121AF2210048A9DF /* OpenGLES.framework */,\n\t\t\t\t1EEEBAA6121AF2210048A9DF /* QuartzCore.framework */,\n\t\t\t\t1EEEBAB2121AF2880048A9DF /* CoreAudio.framework */,\n\t\t\t\t1EEEBAB4121AF2880048A9DF /* CoreGraphics.framework */,\n\t\t\t\t1EEEBAFF121BE2B30048A9DF /* Foundation.framework */,\n\t\t\t\t1EEEBAFB121BE2980048A9DF /* AudioToolbox.framework */,\n\t\t\t\t1EEEBAFD121BE2980048A9DF /* AVFoundation.framework */,\n\t\t\t\t1EEEBAB2121AF2880048A9D1 /* MediaPlayer.framework */,\n\t\t\t\t026D746B1BBED5C800EAA58A /* GameController.framework */,\n\t\t\t\t::ADDL_PBX_FRAMEWORK_GROUP::\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1EEEBA99121AF18B0048A9DF /* Frameworks */,\n\t\t\t\t080E96DDFE201D6D7F000001 /* Classes */,\n\t\t\t\t29B97315FDCFA39411CA2CEA /* Other Sources */,\n\t\t\t\t29B97317FDCFA39411CA2CEA /* Resources */,\n\t\t\t\t19C28FACFE9D520D11CA2CBB /* Products */,\n\t\t\t);\n\t\t\tname = CustomTemplate;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97315FDCFA39411CA2CEA /* Other Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1E2E17A5141E8B5D0048F3C7 /* ::APP_FILE::/haxe/build */,\n\t\t\t);\n\t\t\tname = \"Other Sources\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29B97317FDCFA39411CA2CEA /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4257533E1A5EFD8C004AA45B /* Images.xcassets */,\n\t\t\t\t8D1107310486CEB800E47090 /* ::APP_FILE::/::APP_FILE::-Info.plist */,\n\t\t\t\t1E2E17A5131E8B5D0048F3C7 /* ::APP_FILE::/assets */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1D6058900D05DD3D006BFB54 /* \"::APP_FILE::\" */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget \"::APP_FILE::\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1D60588D0D05DD3D006BFB54 /* Resources */,\n\t\t\t\t1D60588E0D05DD3D006BFB54 /* Sources */,\n\t\t\t\t1D60588F0D05DD3D006BFB54 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1EF0A883121AE1D2003F2F59 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"::APP_FILE::\";\n\t\t\tproductName = \"::APP_TITLE::\";\n\t\t\tproductReference = 1D6058910D05DD3D006BFB54 /* ::APP_TITLE::.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXLegacyTarget section */\n\t\t1EF0A87F121AE1CE003F2F59 /* Build Haxe */ = {\n\t\t\tisa = PBXLegacyTarget;\n\t\t\tbuildArgumentsString = \"\";\n\t\t\tbuildConfigurationList = 1EF0A885121AE21C003F2F59 /* Build configuration list for PBXLegacyTarget \"Build Haxe\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tbuildToolPath = make;\n\t\t\tbuildWorkingDirectory = \"::APP_FILE::/haxe\";\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Build Haxe\";\n\t\t\tpassBuildSettingsInEnvironment = 1;\n\t\t\tproductName = \"Build Haxe\";\n\t\t};\n/* End PBXLegacyTarget section */\n\n/* Begin PBXProject section */\n\t\t29B97313FDCFA39411CA2CEA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject \"::APP_TITLE::\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\thasScannedForEncodings = 1;\n\t\t\tmainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1D6058900D05DD3D006BFB54 /* ::APP_FILE:: */,\n\t\t\t\t1EF0A87F121AE1CE003F2F59 /* Build Haxe */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1D60588D0D05DD3D006BFB54 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1E2E17AD131E8B5D0048F3C7 /* ::APP_FILE::/assets in Resources */,\n\t\t\t\t4257533F1A5EFD8C004AA45B /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1D60588E0D05DD3D006BFB54 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1EF0A83A121ADB8E003F2F59 /* Main.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t1EF0A883121AE1D2003F2F59 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1EF0A87F121AE1CE003F2F59 /* Build Haxe */;\n\t\t\ttargetProxy = 1EF0A882121AE1D2003F2F59 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\tC01FCF4F08A954540054247B /* Debug */ = {/* Build configuration list for PBXProject \"::APP_TITLE::\" */ \n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"::config.tvos.identity::\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ::DEPLOYMENT::;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"::TARGET_DEVICES::\";\n\t\t\t\t::THUMB_SUPPORT::\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC01FCF5008A954540054247B /* Release */ = {/* Build configuration list for PBXProject \"::APP_TITLE::\" */ \n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"::config.tvos.identity::\";\n\t\t\t\t/* COMPRESS_PNG_FILES = NO; */\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\t/* GCC_ENABLE_SYMBOL_SEPARATION = YES; */\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ::DEPLOYMENT::;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\t/* PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; */\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"::TARGET_DEVICES::\";\n\t\t\t\t::THUMB_SUPPORT::\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1D6058940D05DD3E006BFB54 /* Debug */ = {/* Build configuration list for PBXNativeTarget \"::APP_TITLE::\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t::foreach frameworkSearchPaths:: \"\\\"::__current__::\\\"\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"::APP_FILE::/::APP_FILE::-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"::APP_FILE::/::APP_FILE::-Info.plist\";\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=arm64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/arm64-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/arm64\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv6]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv6-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv6\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv7]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv7-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv7\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=i386]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/i386-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/i386\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=x86_64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/x86_64-debug\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/x86_64\\\"\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-lmbedtls_hxcpp\",\n\t\t\t\t\t::foreach ndlls:: \"-l::name::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t::foreach linkedLibraries:: \"-l::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t\"-lApplicationMain\",\n\t\t\t\t\t::foreach IOS_LINKER_FLAGS:: \"::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"::APP_PACKAGE::\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1D6058950D05DD3E006BFB54 /* Release */ = {/* Build configuration list for PBXNativeTarget \"::APP_TITLE::\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t::foreach frameworkSearchPaths:: \"\\\"::__current__::\\\"\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"::APP_FILE::/::APP_FILE::-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"::APP_FILE::/::APP_FILE::-Info.plist\";\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=arm64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/arm64\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv6]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv6\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=armv7]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/armv7\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=i386]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/i386\\\"\",\n\t\t\t\t);\n\t\t\t\t\"LIBRARY_SEARCH_PATHS[arch=x86_64]\" = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/::APP_FILE::/lib/x86_64\\\"\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-lmbedtls_hxcpp\",\n\t\t\t\t\t::foreach ndlls:: \"-l::name::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t::foreach linkedLibraries:: \"-l::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t\t\"-lApplicationMain\",\n\t\t\t\t\t::foreach IOS_LINKER_FLAGS:: \"::__current__::\",\n\t\t\t\t\t::end::\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"::APP_PACKAGE::\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1EF0A880121AE1CE003F2F59 /* Debug */ = {/* Build configuration list for PBXLegacyTarget \"Build Haxe\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1EF0A881121AE1CE003F2F59 /* Release */ = {/* Build configuration list for PBXLegacyTarget \"Build Haxe\" */\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\t::if (OBJC_ARC)::\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t::end::\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tC01FCF4E08A954540054247B /* Build configuration list for PBXProject \"::APP_TITLE::\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC01FCF4F08A954540054247B /* Debug */,\n\t\t\t\tC01FCF5008A954540054247B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget \"::APP_TITLE::\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1D6058940D05DD3E006BFB54 /* Debug */,\n\t\t\t\t1D6058950D05DD3E006BFB54 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1EF0A885121AE21C003F2F59 /* Build configuration list for PBXLegacyTarget \"Build Haxe\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1EF0A880121AE1CE003F2F59 /* Debug */,\n\t\t\t\t1EF0A881121AE1CE003F2F59 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t}; /* end objects */\n\trootObject = 29B97313FDCFA39411CA2CEA /* Project object */;\n}"
  },
  {
    "path": "templates/tvos/PROJ.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n</Workspace>\n"
  },
  {
    "path": "templates/webassembly/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D webassembly\n-D wasm\n-D emscripten\n-D webgl\n-debug\n"
  },
  {
    "path": "templates/webassembly/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D webassembly\n-D wasm\n-D emscripten\n-D webgl\n-D final\n"
  },
  {
    "path": "templates/webassembly/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D webassembly\n-D wasm\n-D emscripten\n-D webgl\n"
  },
  {
    "path": "templates/webassembly/output.js",
    "content": "::SOURCE_FILE::\n::if embeddedLibraries::::foreach (embeddedLibraries)::\n::__current__::::end::::end::"
  },
  {
    "path": "templates/webassembly/template/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n\t<meta charset=\"utf-8\">\n\n\t<title>::APP_TITLE::</title>\n\n\t<meta id=\"viewport\" name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\n\t<meta name=\"mobile-web-app-capable\" content=\"yes\">\n\n\t::if favicons::::foreach (favicons)::\n\t<link rel=\"::__current__.rel::\" type=\"::__current__.type::\" href=\"::__current__.href::\">::end::::end::\n\n\t::if linkedLibraries::::foreach (linkedLibraries)::\n\t<script type=\"text/javascript\" src=\"::__current__::\"></script>::end::::end::\n\n\t<script>\n\t\twindow.addEventListener (\"touchmove\", function (event) { event.preventDefault (); }, false);\n\t\tif (typeof window.devicePixelRatio != 'undefined' && window.devicePixelRatio > 2) {\n\t\t\tvar meta = document.getElementById (\"viewport\");\n\t\t\tmeta.setAttribute ('content', 'width=device-width, initial-scale=' + (2 / window.devicePixelRatio) + ', user-scalable=no');\n\t\t}\n\t</script>\n\n\t<style>\n\t\thtml,body { margin: 0; padding: 0; height: 100%; overflow: hidden; }\n\t\t#content { background: #000000; width: 100%; height: 100%; }\n\t\t::foreach assets::::if (type == \"font\")::\n\t\t@font-face {\n\t\t\tfont-family: '::fontName::';\n\t\t\tsrc: url('::targetPath::.eot');\n\t\t\tsrc: url('::targetPath::.eot?#iefix') format('embedded-opentype'),\n\t\t\turl('::targetPath::.svg#my-font-family') format('svg'),\n\t\t\turl('::targetPath::.woff') format('woff'),\n\t\t\turl('::targetPath::.ttf') format('truetype');\n\t\t\tfont-weight: normal;\n\t\t\tfont-style: normal;\n\t\t}::end::::end::\n\t</style>\n\n</head>\n<body>\n\t::foreach assets::::if (type == \"font\")::\n\t<span style=\"font-family: ::id::\"> </span>::end::::end::\n\n\t<div id=\"content\">\n\t\t<canvas id=\"canvas\"::if (WIN_WIDTH != 0):: width=\"::WIN_WIDTH::px\"::end::::if (WIN_HEIGHT != 0):: height=\"::WIN_HEIGHT::px\"::end::></canvas>\n\t</div>\n\n\t<script type=\"text/javascript\">\n\t\tvar Module = {};\n\t\tModule.canvas = document.getElementById (\"canvas\");\n\t\t//::if DEBUG::Module.setStatus = function (msg) { console.log (msg); };::else::Module.setStatus = function(_) {};::end::\n\t\tModule.setStatus = function (msg) { console.log (msg); };\n\t\t::if (WIN_WIDTH == 0)::::if (WIN_HEIGHT == 0)::\n\t\tvar container = document.getElementById (\"content\");\n\t\tModule.canvas.width = container.clientWidth;\n\t\tModule.canvas.height = container.clientHeight;\n\n\t\twindow.addEventListener (\"resize\", function (e)\n\t\t{\n\t\t\tModule.canvas.width = container.clientWidth;\n\t\t\tModule.canvas.height = container.clientHeight;\n\t\t}, true);::end::::end::\n\t</script>\n\n\t<script type=\"text/javascript\" src=\"./::APP_FILE::.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "templates/webos/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D webos\n-D HXCPP_LOAD_DEBUG\n-D HXCPP_RTLD_LAZY\n-debug"
  },
  {
    "path": "templates/webos/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D webos\n-D HXCPP_RTLD_LAZY\n-D final"
  },
  {
    "path": "templates/webos/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D webos\n-D HXCPP_RTLD_LAZY"
  },
  {
    "path": "templates/webos/template/appinfo.json",
    "content": "{\n\t\"title\": \"::APP_TITLE::\",\n\t\"id\": \"::APP_PACKAGE::\",\n\t\"type\": \"pdk\",\n\t\"version\": \"::APP_VERSION::\",\n\t\"vendor\": \"::APP_COMPANY::\",\n\t\"icon\": \"::APP_ICON::\",\n\t\"main\": \"::APP_FILE::\",\n\t\"requiredMemory\": 40\n}\n"
  },
  {
    "path": "templates/webos/template/package.properties",
    "content": "filemode.755=::APP_FILE::\n"
  },
  {
    "path": "templates/windows/resource/ApplicationMain.rc",
    "content": "#include \"winres.h\"\n\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK\n\nVS_VERSION_INFO VERSIONINFO\n\tFILEVERSION ::VERSION_NUMBER::\n\tPRODUCTVERSION ::VERSION_NUMBER::\n\tFILEFLAGSMASK 0x3fL\n\tFILEFLAGS 0x0L\n\tFILEOS 0x40004L\n\tFILETYPE 0x2L\n\tFILESUBTYPE 0x0L\n\nBEGIN\n\tBLOCK \"StringFileInfo\"\n\tBEGIN\n\t\tBLOCK \"040904b0\"\n\t\tBEGIN\n\t\t\tVALUE \"CompanyName\", \"::APP_COMPANY::\"\n\t\t\tVALUE \"FileDescription\", \"::APP_DESCRIPTION::\"\n\t\t\tVALUE \"FileVersion\", \"::FILE_VERSION::\"\n\t\t\tVALUE \"InternalName\", \"::APP_FILE::\"\n\t\t\tVALUE \"LegalCopyright\", \"Copyright (C) ::APP_COPYRIGHT_YEARS:: ::APP_COMPANY::\"\n\t\t\tVALUE \"OriginalFilename\", \"::APP_FILE::\"\n\t\t\tVALUE \"ProductName\", \"::APP_PACKAGE::\"\n\t\t\tVALUE \"ProductVersion\", \"::FILE_VERSION::\"\n\t\tEND\n\tEND\n\tBLOCK \"VarFileInfo\"\n\tBEGIN\n\t\tVALUE \"Translation\", 0x409, 1200\n\tEND\nEND\n"
  },
  {
    "path": "templates/winjs/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-D html5\n-D html\n-D windows\n-D winjs\n-D uwp\n-debug\n"
  },
  {
    "path": "templates/winjs/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-D html5\n-D html\n-D windows\n-D winjs\n-D uwp\n-D final\n-D js-flatten\n-dce full"
  },
  {
    "path": "templates/winjs/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-js ::OUTPUT_FILE::\n-cp ::OUTPUT_DIR::/haxe\n-D html5\n-D html\n-D windows\n-D winjs\n-D uwp"
  },
  {
    "path": "templates/winjs/template/PowerShell_Set_Unrestricted.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell]\n\"Path\"=\"C:\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\"\n\"ExecutionPolicy\"=\"Unrestricted\"\n\n"
  },
  {
    "path": "templates/winjs/template/source/css/default.css",
    "content": "﻿body {\n  /* Uncomment this to enable scrolling and zooming\n  touch-action: manipulation;\n  */\n}\n"
  },
  {
    "path": "templates/winjs/template/source/index.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\" />\n    <title>::APP_TITLE:: - ::guid::</title>\n    <link href=\"css/default.css\" rel=\"stylesheet\" />\n    <meta id=\"viewport\" name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\n    <meta name=\"mobile-web-app-capable\" content=\"yes\">\n    ::if favicons::::foreach (favicons)::\n    <link rel=\"::__current__.rel::\" type=\"::__current__.type::\" href=\"::__current__.href::\">::end::::end::\n\n    ::if linkedLibraries::::foreach (linkedLibraries)::\n    <script type=\"text/javascript\" src=\"::__current__::\"></script>::end::::end::\n    <script type=\"text/javascript\" src=\"./js/::APP_FILE::.js\"></script>\n    <script src=\"lib/winjs-4.0.1/js/base.js\"></script>\n    <script src=\"lib/winjs-4.0.1/js/ui.js\"></script>\n    <script>\n\t\twindow.addEventListener (\"touchmove\", function (event) { event.preventDefault (); }, false);\n\t\tif (typeof window.devicePixelRatio != 'undefined' && window.devicePixelRatio > 2) {\n\t\t\tvar meta = document.getElementById (\"viewport\");\n\t\t\tmeta.setAttribute ('content', 'width=device-width, initial-scale=' + (2 / window.devicePixelRatio) + ', user-scalable=no');\n\t\t}\n\t</script>\n\n    <style>\n\t\thtml,body { margin: 0; padding: 0; height: 100%; overflow: hidden; }\n\t\t#content { background: #000000; width: ::if (WIN_RESIZABLE)::100%::elseif (WIN_WIDTH > 0)::::WIN_WIDTH::px::else::100%::end::; height: ::if (WIN_RESIZABLE)::100%::elseif (WIN_WIDTH > 0)::::WIN_HEIGHT::px::else::100%::end::; }\n\t\t::foreach assets::::if (type == \"font\")::\n\t\t@font-face {\n\t\t\tfont-family: '::fontName::';\n\t\t\tsrc: url('::targetPath::.eot');\n\t\t\tsrc: url('::targetPath::.eot?#iefix') format('embedded-opentype'),\n\t\t\turl('::targetPath::.svg#my-font-family') format('svg'),\n\t\t\turl('::targetPath::.woff') format('woff'),\n\t\t\turl('::targetPath::.ttf') format('truetype');\n\t\t\tfont-weight: normal;\n\t\t\tfont-style: normal;\n\t\t}::end::::end::\n\t</style>\n\n</head>\n<body>\n    <script src=\"js/main.js\"></script>\n\n    ::foreach assets::::if (type == \"font\")::\n    <span style=\"font-family: ::id::\"> </span>::end::::end::\n\n    <div id=\"content\"></div>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "templates/winjs/template/source/js/main.js",
    "content": "﻿// For an introduction to the Blank template, see the following documentation:\n// https://go.microsoft.com/fwlink/?LinkId=232509\n\n(function () {\n\t\"use strict\";\n\n\tif(typeof Windows !== \"undefined\") {\n\t    initUWP();\n\t} else {\n\t    lime.embed (\"::APP_FILE::\", \"content\", ::WIN_WIDTH::, ::WIN_HEIGHT::);\n\t}\n\n\n    function initUWP() {\n        var app = WinJS.Application;\n        \tvar activation = Windows.ApplicationModel.Activation;\n        \tvar isFirstActivation = true;\n\n        \tapp.onactivated = function (args) {\n        \t\tif (args.detail.kind === activation.ActivationKind.voiceCommand) {\n        \t\t\t// TODO: Handle relevant ActivationKinds. For example, if your app can be started by voice commands,\n        \t\t\t// this is a good place to decide whether to populate an input field or choose a different initial view.\n        \t\t}\n        \t\telse if (args.detail.kind === activation.ActivationKind.launch) {\n        \t\t\t// A Launch activation happens when the user launches your app via the tile\n        \t\t\t// or invokes a toast notification by clicking or tapping on the body.\n        \t\t\tif (args.detail.arguments) {\n        \t\t\t\t// TODO: If the app supports toasts, use this value from the toast payload to determine where in the app\n        \t\t\t\t// to take the user in response to them invoking a toast notification.\n        \t\t\t}\n        \t\t\telse if (args.detail.previousExecutionState === activation.ApplicationExecutionState.terminated) {\n        \t\t\t\t// TODO: This application had been suspended and was then terminated to reclaim memory.\n        \t\t\t\t// To create a smooth user experience, restore application state here so that it looks like the app never stopped running.\n        \t\t\t\t// Note: You may want to record the time when the app was last suspended and only restore state if they've returned after a short period.\n        \t\t\t}\n        \t\t}\n\n        \t\tif (!args.detail.prelaunchActivated) {\n        \t\t\t// TODO: If prelaunchActivated were true, it would mean the app was prelaunched in the background as an optimization.\n        \t\t\t// In that case it would be suspended shortly thereafter.\n        \t\t\t// Any long-running operations (like expensive network or disk I/O) or changes to user state which occur at launch\n        \t\t\t// should be done here (to avoid doing them in the prelaunch case).\n        \t\t\t// Alternatively, this work can be done in a resume or visibilitychanged handler.\n        \t\t}\n\n        \t\tif (isFirstActivation) {\n        \t\t\t// TODO: The app was activated and had not been running. Do general startup initialization here.\n        \t\t\tDebug.writeln(\"app.onactivated isFirstActivation\");\n                    lime.embed (\"::APP_FILE::\", \"content\", ::WIN_WIDTH::, ::WIN_HEIGHT::);\n        \t\t\tdocument.addEventListener(\"visibilitychange\", onVisibilityChanged);\n        \t\t\targs.setPromise(WinJS.UI.processAll());\n        \t\t}\n\n        \t\tisFirstActivation = false;\n        \t};\n\n        \tfunction onVisibilityChanged(args) {\n        \t\tif (!document.hidden) {\n        \t\t\t// TODO: The app just became visible. This may be a good time to refresh the view.\n        \t\t}\n        \t}\n\n        \tapp.oncheckpoint = function (args) {\n        \t\t// TODO: This application is about to be suspended. Save any state that needs to persist across suspensions here.\n        \t\t// You might use the WinJS.Application.sessionState object, which is automatically saved and restored across suspension.\n        \t\t// If you need to complete an asynchronous operation before your application is suspended, call args.setPromise().\n        \t};\n\n        \tapp.start();\n    }\n\n\n})();\n"
  },
  {
    "path": "templates/winjs/template/source/lib/winjs-4.0.1/css/ui-dark.css",
    "content": "﻿/* Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */\n@keyframes WinJS-node-inserted {\n  from {\n    outline-color: #000;\n  }\n  to {\n    outline-color: #001;\n  }\n}\n@keyframes WinJS-opacity-in {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n@keyframes WinJS-opacity-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n@keyframes WinJS-scale-up {\n  from {\n    transform: scale(0.85);\n  }\n  to {\n    transform: scale(1);\n  }\n}\n@keyframes WinJS-scale-down {\n  from {\n    transform: scale(1);\n  }\n  to {\n    transform: scale(0.85);\n  }\n}\n@keyframes WinJS-default-remove {\n  from {\n    transform: translateX(11px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-default-remove-rtl {\n  from {\n    transform: translateX(-11px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-default-apply {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(11px);\n  }\n}\n@keyframes WinJS-default-apply-rtl {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(-11px);\n  }\n}\n@keyframes WinJS-showEdgeUI {\n  from {\n    transform: translateY(-70px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showPanel {\n  from {\n    transform: translateX(364px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showPanel-rtl {\n  from {\n    transform: translateX(-364px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-hideEdgeUI {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateY(-70px);\n  }\n}\n@keyframes WinJS-hidePanel {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(364px);\n  }\n}\n@keyframes WinJS-hidePanel-rtl {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(-364px);\n  }\n}\n@keyframes WinJS-showPopup {\n  from {\n    transform: translateY(50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-dragSourceEnd {\n  from {\n    transform: translateX(11px) scale(1.05);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-dragSourceEnd-rtl {\n  from {\n    transform: translateX(-11px) scale(1.05);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-enterContent {\n  from {\n    transform: translateY(28px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-exit {\n  from {\n    transform: none;\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-enterPage {\n  from {\n    transform: translateY(28px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-updateBadge {\n  from {\n    transform: translateY(24px);\n  }\n  to {\n    transform: none;\n  }\n}\n@-webkit-keyframes WinJS-node-inserted {\n  from {\n    outline-color: #000;\n  }\n  to {\n    outline-color: #001;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-opacity-in {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-opacity-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-scale-up {\n  from {\n    -webkit-transform: scale(0.85);\n  }\n  to {\n    -webkit-transform: scale(1);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-scale-down {\n  from {\n    -webkit-transform: scale(1);\n  }\n  to {\n    -webkit-transform: scale(0.85);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-remove {\n  from {\n    -webkit-transform: translateX(11px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-remove-rtl {\n  from {\n    -webkit-transform: translateX(-11px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-apply {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(11px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-apply-rtl {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(-11px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showEdgeUI {\n  from {\n    -webkit-transform: translateY(-70px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showPanel {\n  from {\n    -webkit-transform: translateX(364px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showPanel-rtl {\n  from {\n    -webkit-transform: translateX(-364px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-hideEdgeUI {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateY(-70px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-hidePanel {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(364px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-hidePanel-rtl {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(-364px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showPopup {\n  from {\n    -webkit-transform: translateY(50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-dragSourceEnd {\n  from {\n    -webkit-transform: translateX(11px) scale(1.05);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-dragSourceEnd-rtl {\n  from {\n    -webkit-transform: translateX(-11px) scale(1.05);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-enterContent {\n  from {\n    -webkit-transform: translateY(28px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-exit {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-enterPage {\n  from {\n    -webkit-transform: translateY(28px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-updateBadge {\n  from {\n    -webkit-transform: translateY(24px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@font-face {\n  font-family: \"Segoe UI Command\";\n  src: local(\"Segoe MDL2 Assets\");\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"Symbols\";\n  src: url(../fonts/Symbols.ttf);\n}\n.win-type-header,\n.win-h1 {\n  font-size: 46px;\n  font-weight: 200;\n  line-height: 1.216;\n  letter-spacing: 0px;\n}\n.win-type-subheader,\n.win-h2 {\n  font-size: 34px;\n  font-weight: 200;\n  line-height: 1.176;\n}\n.win-type-title,\n.win-h3 {\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 1.167;\n}\n.win-type-subtitle,\n.win-h4 {\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n}\n.win-type-body,\n.win-h6 {\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-type-base,\n.win-h5 {\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 1.333;\n}\n.win-type-caption {\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 1.167;\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 200;\n  src: local(\"Segoe UI Light\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 300;\n  src: local(\"Segoe UI Semilight\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 400;\n  src: local(\"Segoe UI\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 500;\n  src: local(\"Segoe UI Semibold\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 600;\n  src: local(\"Segoe UI Bold\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-style: italic;\n  font-weight: 400;\n  src: local(\"Segoe UI Italic\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-style: italic;\n  font-weight: 700;\n  src: local(\"Segoe UI Bold Italic\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 200;\n  src: local(\"Microsoft Yahei UI Light\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 300;\n  src: local(\"Microsoft Yahei UI\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 500;\n  src: local(\"Microsoft Yahei UI\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 600;\n  src: local(\"Microsoft Yahei UI Bold\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 200;\n  src: local(\"Microsoft JhengHei UI Light\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 300;\n  src: local(\"Microsoft JhengHei UI\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 500;\n  src: local(\"Microsoft JhengHei UI\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 600;\n  src: local(\"Microsoft JhengHei UI Bold\");\n}\n.win-type-header:-ms-lang(am, ti),\n.win-type-subheader:-ms-lang(am, ti),\n.win-type-title:-ms-lang(am, ti),\n.win-type-subtitle:-ms-lang(am, ti),\n.win-type-base:-ms-lang(am, ti),\n.win-type-body:-ms-lang(am, ti),\n.win-type-caption:-ms-lang(am, ti),\n.win-h1:-ms-lang(am, ti),\n.win-h2:-ms-lang(am, ti),\n.win-h3:-ms-lang(am, ti),\n.win-h4:-ms-lang(am, ti),\n.win-h5:-ms-lang(am, ti),\n.win-h6:-ms-lang(am, ti),\n.win-button:-ms-lang(am, ti),\n.win-dropdown:-ms-lang(am, ti),\n.win-textbox:-ms-lang(am, ti),\n.win-link:-ms-lang(am, ti),\n.win-textarea:-ms-lang(am, ti) {\n  font-family: \"Ebrima\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-subheader:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-title:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-subtitle:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-base:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-body:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-caption:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h1:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h2:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h3:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h4:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h5:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h6:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-button:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-dropdown:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-textbox:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-link:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-textarea:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te) {\n  font-family: \"Nirmala UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(chr-CHER-US),\n.win-type-subheader:-ms-lang(chr-CHER-US),\n.win-type-title:-ms-lang(chr-CHER-US),\n.win-type-subtitle:-ms-lang(chr-CHER-US),\n.win-type-base:-ms-lang(chr-CHER-US),\n.win-type-body:-ms-lang(chr-CHER-US),\n.win-type-caption:-ms-lang(chr-CHER-US),\n.win-h1:-ms-lang(chr-CHER-US),\n.win-h2:-ms-lang(chr-CHER-US),\n.win-h3:-ms-lang(chr-CHER-US),\n.win-h4:-ms-lang(chr-CHER-US),\n.win-h5:-ms-lang(chr-CHER-US),\n.win-h6:-ms-lang(chr-CHER-US),\n.win-button:-ms-lang(chr-CHER-US),\n.win-dropdown:-ms-lang(chr-CHER-US),\n.win-textbox:-ms-lang(chr-CHER-US),\n.win-link:-ms-lang(chr-CHER-US),\n.win-textarea:-ms-lang(chr-CHER-US) {\n  font-family: \"Gadugi\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(ja),\n.win-type-subheader:-ms-lang(ja),\n.win-type-title:-ms-lang(ja),\n.win-type-subtitle:-ms-lang(ja),\n.win-type-base:-ms-lang(ja),\n.win-type-body:-ms-lang(ja),\n.win-type-caption:-ms-lang(ja),\n.win-h1:-ms-lang(ja),\n.win-h2:-ms-lang(ja),\n.win-h3:-ms-lang(ja),\n.win-h4:-ms-lang(ja),\n.win-h5:-ms-lang(ja),\n.win-h6:-ms-lang(ja),\n.win-button:-ms-lang(ja),\n.win-dropdown:-ms-lang(ja),\n.win-textbox:-ms-lang(ja),\n.win-link:-ms-lang(ja),\n.win-textarea:-ms-lang(ja) {\n  font-family: \"Yu Gothic UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-subheader:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-title:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-subtitle:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-base:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-body:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-caption:-ms-lang(km, lo, th, bug-Bugi),\n.win-h1:-ms-lang(km, lo, th, bug-Bugi),\n.win-h2:-ms-lang(km, lo, th, bug-Bugi),\n.win-h3:-ms-lang(km, lo, th, bug-Bugi),\n.win-h4:-ms-lang(km, lo, th, bug-Bugi),\n.win-h5:-ms-lang(km, lo, th, bug-Bugi),\n.win-h6:-ms-lang(km, lo, th, bug-Bugi),\n.win-button:-ms-lang(km, lo, th, bug-Bugi),\n.win-dropdown:-ms-lang(km, lo, th, bug-Bugi),\n.win-textbox:-ms-lang(km, lo, th, bug-Bugi),\n.win-link:-ms-lang(km, lo, th, bug-Bugi),\n.win-textarea:-ms-lang(km, lo, th, bug-Bugi) {\n  font-family: \"Leelawadee UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(ko),\n.win-type-subheader:-ms-lang(ko),\n.win-type-title:-ms-lang(ko),\n.win-type-subtitle:-ms-lang(ko),\n.win-type-base:-ms-lang(ko),\n.win-type-body:-ms-lang(ko),\n.win-type-caption:-ms-lang(ko),\n.win-h1:-ms-lang(ko),\n.win-h2:-ms-lang(ko),\n.win-h3:-ms-lang(ko),\n.win-h4:-ms-lang(ko),\n.win-h5:-ms-lang(ko),\n.win-h6:-ms-lang(ko),\n.win-button:-ms-lang(ko),\n.win-dropdown:-ms-lang(ko),\n.win-textbox:-ms-lang(ko),\n.win-link:-ms-lang(ko),\n.win-textarea:-ms-lang(ko) {\n  font-family: \"Malgun Gothic\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(jv-Java),\n.win-type-subheader:-ms-lang(jv-Java),\n.win-type-title:-ms-lang(jv-Java),\n.win-type-subtitle:-ms-lang(jv-Java),\n.win-type-base:-ms-lang(jv-Java),\n.win-type-body:-ms-lang(jv-Java),\n.win-type-caption:-ms-lang(jv-Java),\n.win-h1:-ms-lang(jv-Java),\n.win-h2:-ms-lang(jv-Java),\n.win-h3:-ms-lang(jv-Java),\n.win-h4:-ms-lang(jv-Java),\n.win-h5:-ms-lang(jv-Java),\n.win-h6:-ms-lang(jv-Java),\n.win-button:-ms-lang(jv-Java),\n.win-dropdown:-ms-lang(jv-Java),\n.win-textbox:-ms-lang(jv-Java),\n.win-link:-ms-lang(jv-Java),\n.win-textarea:-ms-lang(jv-Java) {\n  font-family: \"Javanese Text\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(cop-Copt),\n.win-type-subheader:-ms-lang(cop-Copt),\n.win-type-title:-ms-lang(cop-Copt),\n.win-type-subtitle:-ms-lang(cop-Copt),\n.win-type-base:-ms-lang(cop-Copt),\n.win-type-body:-ms-lang(cop-Copt),\n.win-type-caption:-ms-lang(cop-Copt),\n.win-h1:-ms-lang(cop-Copt),\n.win-h2:-ms-lang(cop-Copt),\n.win-h3:-ms-lang(cop-Copt),\n.win-h4:-ms-lang(cop-Copt),\n.win-h5:-ms-lang(cop-Copt),\n.win-h6:-ms-lang(cop-Copt),\n.win-button:-ms-lang(cop-Copt),\n.win-dropdown:-ms-lang(cop-Copt),\n.win-textbox:-ms-lang(cop-Copt),\n.win-link:-ms-lang(cop-Copt),\n.win-textarea:-ms-lang(cop-Copt) {\n  font-family: \"Segoe MDL2 Assets\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-subheader:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-title:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-subtitle:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-base:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-body:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-caption:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h1:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h2:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h3:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h4:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h5:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h6:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-button:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-dropdown:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-textbox:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-link:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-textarea:-ms-lang(zh-CN, zh-Hans, zh-SG) {\n  font-family: \"Microsoft YaHei UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-subheader:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-title:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-subtitle:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-base:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-body:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-caption:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h1:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h2:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h3:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h4:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h5:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h6:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-button:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-dropdown:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-textbox:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-link:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-textarea:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO) {\n  font-family: \"Microsoft JhengHei UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\nhtml,\nbody {\n  width: 100%;\n  height: 100%;\n  margin: 0px;\n  cursor: default;\n  -webkit-touch-callout: none;\n  -ms-scroll-translation: vertical-to-horizontal;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nhtml {\n  overflow: hidden;\n  direction: ltr;\n}\nhtml:lang(ar),\nhtml:lang(dv),\nhtml:lang(fa),\nhtml:lang(he),\nhtml:lang(ku-Arab),\nhtml:lang(pa-Arab),\nhtml:lang(prs),\nhtml:lang(ps),\nhtml:lang(sd-Arab),\nhtml:lang(syr),\nhtml:lang(ug),\nhtml:lang(ur),\nhtml:lang(qps-plocm) {\n  direction: rtl;\n}\nbody {\n  -ms-content-zooming: none;\n}\niframe {\n  border: 0;\n}\n.win-type-header,\n.win-type-subheader,\n.win-type-title,\n.win-type-subtitle,\n.win-type-base,\n.win-type-body,\n.win-type-caption,\n.win-h1,\n.win-h2,\n.win-h3,\n.win-h4,\n.win-h5,\n.win-h6,\n.win-button,\n.win-dropdown,\n.win-textbox,\n.win-link,\n.win-textarea {\n  font-family: \"Segoe UI\", sans-serif, \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-textbox,\n.win-textarea {\n  -ms-user-select: element;\n  border-style: solid;\n  border-width: 2px;\n  border-radius: 0;\n  margin: 8px 0px;\n  width: 296px;\n  min-width: 64px;\n  min-height: 28px;\n  background-clip: border-box;\n  box-sizing: border-box;\n  padding: 3px 6px 5px 10px;\n  outline: 0;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-textbox::-ms-value {\n  margin: 0;\n  padding: 0;\n}\n.win-textbox::-ms-clear,\n.win-textbox::-ms-reveal {\n  padding-right: 2px;\n  margin-right: -8px;\n  margin-left: 2px;\n  margin-top: -8px;\n  margin-bottom: -8px;\n  width: 30px;\n  height: 32px;\n}\n.win-textbox:lang(ar)::-ms-clear,\n.win-textbox:lang(dv)::-ms-clear,\n.win-textbox:lang(fa)::-ms-clear,\n.win-textbox:lang(he)::-ms-clear,\n.win-textbox:lang(ku-Arab)::-ms-clear,\n.win-textbox:lang(pa-Arab)::-ms-clear,\n.win-textbox:lang(prs)::-ms-clear,\n.win-textbox:lang(ps)::-ms-clear,\n.win-textbox:lang(sd-Arab)::-ms-clear,\n.win-textbox:lang(syr)::-ms-clear,\n.win-textbox:lang(ug)::-ms-clear,\n.win-textbox:lang(ur)::-ms-clear,\n.win-textbox:lang(qps-plocm)::-ms-clear,\n.win-textbox:lang(ar)::-ms-reveal,\n.win-textbox:lang(dv)::-ms-reveal,\n.win-textbox:lang(fa)::-ms-reveal,\n.win-textbox:lang(he)::-ms-reveal,\n.win-textbox:lang(ku-Arab)::-ms-reveal,\n.win-textbox:lang(pa-Arab)::-ms-reveal,\n.win-textbox:lang(prs)::-ms-reveal,\n.win-textbox:lang(ps)::-ms-reveal,\n.win-textbox:lang(sd-Arab)::-ms-reveal,\n.win-textbox:lang(syr)::-ms-reveal,\n.win-textbox:lang(ug)::-ms-reveal,\n.win-textbox:lang(ur)::-ms-reveal,\n.win-textbox:lang(qps-plocm)::-ms-reveal {\n  margin-left: -8px;\n  margin-right: 2px;\n}\n.win-textarea {\n  resize: none;\n  overflow-y: auto;\n}\n.win-radio,\n.win-checkbox {\n  width: 20px;\n  height: 20px;\n  margin-right: 8px;\n  margin-top: 12px;\n  margin-bottom: 12px;\n}\n.win-radio:lang(ar),\n.win-checkbox:lang(ar),\n.win-radio:lang(dv),\n.win-checkbox:lang(dv),\n.win-radio:lang(fa),\n.win-checkbox:lang(fa),\n.win-radio:lang(he),\n.win-checkbox:lang(he),\n.win-radio:lang(ku-Arab),\n.win-checkbox:lang(ku-Arab),\n.win-radio:lang(pa-Arab),\n.win-checkbox:lang(pa-Arab),\n.win-radio:lang(prs),\n.win-checkbox:lang(prs),\n.win-radio:lang(ps),\n.win-checkbox:lang(ps),\n.win-radio:lang(sd-Arab),\n.win-checkbox:lang(sd-Arab),\n.win-radio:lang(syr),\n.win-checkbox:lang(syr),\n.win-radio:lang(ug),\n.win-checkbox:lang(ug),\n.win-radio:lang(ur),\n.win-checkbox:lang(ur),\n.win-radio:lang(qps-plocm),\n.win-checkbox:lang(qps-plocm) {\n  margin-left: 8px;\n  margin-right: 0px;\n}\n.win-radio::-ms-check,\n.win-checkbox::-ms-check {\n  border-style: solid;\n  display: inline-block;\n  border-width: 2px;\n  background-clip: border-box;\n}\n.win-button {\n  border-style: solid;\n  margin: 0px;\n  min-height: 32px;\n  min-width: 120px;\n  padding: 4px 8px;\n  border-width: 2px;\n  background-clip: border-box;\n  border-radius: 0;\n  touch-action: manipulation;\n  -webkit-appearance: none;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-button.win-button-file {\n  border: none;\n  min-width: 100px;\n  min-height: 20px;\n  width: 340px;\n  height: 32px;\n  padding: 0px;\n  margin: 7px 8px 21px 8px;\n  background-clip: padding-box;\n}\n.win-button.win-button-file::-ms-value {\n  margin: 0;\n  border-width: 2px;\n  border-style: solid;\n  border-right-style: none;\n  border-radius: 0;\n  background-clip: border-box;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-button.win-button-file:lang(ar)::-ms-value,\n.win-button.win-button-file:lang(dv)::-ms-value,\n.win-button.win-button-file:lang(fa)::-ms-value,\n.win-button.win-button-file:lang(he)::-ms-value,\n.win-button.win-button-file:lang(ku-Arab)::-ms-value,\n.win-button.win-button-file:lang(pa-Arab)::-ms-value,\n.win-button.win-button-file:lang(prs)::-ms-value,\n.win-button.win-button-file:lang(ps)::-ms-value,\n.win-button.win-button-file:lang(sd-Arab)::-ms-value,\n.win-button.win-button-file:lang(syr)::-ms-value,\n.win-button.win-button-file:lang(ug)::-ms-value,\n.win-button.win-button-file:lang(ur)::-ms-value,\n.win-button.win-button-file:lang(qps-plocm)::-ms-value {\n  border-left-style: none;\n  border-right-style: solid;\n}\n.win-button.win-button-file::-ms-browse {\n  margin: 0;\n  padding: 0 18px;\n  border-width: 2px;\n  border-style: solid;\n  background-clip: padding-box;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-dropdown {\n  min-width: 56px;\n  max-width: 368px;\n  min-height: 32px;\n  margin: 8px 0;\n  border-style: solid;\n  border-width: 2px;\n  background-clip: border-box;\n  background-image: none;\n  box-sizing: border-box;\n  border-radius: 0;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-dropdown::-ms-value {\n  padding: 5px 12px 7px 12px;\n  margin: 0;\n}\n.win-dropdown::-ms-expand {\n  border: none;\n  margin-right: 5px;\n  margin-left: 3px;\n  margin-bottom: -2px;\n  font-size: 20px;\n}\nselect[multiple].win-dropdown {\n  padding: 0 0 0 12px;\n  vertical-align: bottom;\n}\n.win-dropdown option {\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-progress-bar,\n.win-progress-ring,\n.win-ring {\n  width: 180px;\n  height: 4px;\n  -webkit-appearance: none;\n}\n.win-progress-bar:not(:indeterminate),\n.win-progress-ring:not(:indeterminate),\n.win-ring:not(:indeterminate) {\n  border-style: none;\n}\n.win-progress-bar::-ms-fill,\n.win-progress-ring::-ms-fill,\n.win-ring::-ms-fill {\n  border-style: none;\n}\n.win-progress-bar.win-medium,\n.win-progress-ring.win-medium,\n.win-ring.win-medium {\n  width: 296px;\n}\n.win-progress-bar.win-large,\n.win-progress-ring.win-large,\n.win-ring.win-large {\n  width: 100%;\n}\n.win-progress-bar:indeterminate::-webkit-progress-value,\n.win-progress-ring:indeterminate::-webkit-progress-value,\n.win-ring:indeterminate::-webkit-progress-value {\n  position: relative;\n  -webkit-animation: win-progress-indeterminate 3s linear infinite;\n}\n.win-progress-bar.win-paused:not(:indeterminate),\n.win-progress-ring.win-paused:not(:indeterminate),\n.win-ring.win-paused:not(:indeterminate) {\n  animation-name: win-progress-fade-out;\n  animation-duration: 3s;\n  animation-timing-function: cubic-bezier(0.03, 0.76, 0.31, 1);\n  opacity: 0.5;\n}\n.win-progress-bar.win-error::-ms-fill,\n.win-progress-ring.win-error::-ms-fill,\n.win-ring.win-error::-ms-fill {\n  opacity: 0;\n}\n.win-progress-ring,\n.win-ring {\n  width: 20px;\n  height: 20px;\n}\n.win-progress-ring:indeterminate::-ms-fill,\n.win-ring:indeterminate::-ms-fill {\n  animation-name: -ms-ring;\n}\n.win-progress-ring.win-medium,\n.win-ring.win-medium {\n  width: 40px;\n  height: 40px;\n}\n.win-progress-ring.win-large,\n.win-ring.win-large {\n  width: 60px;\n  height: 60px;\n}\n@-webkit-keyframes win-progress-indeterminate {\n  0% {\n    left: 0;\n    width: 25%;\n  }\n  50% {\n    left: calc(75%);\n    width: 25%;\n  }\n  75% {\n    left: calc(100%);\n    width: 0%;\n  }\n  75.1% {\n    left: 0;\n    width: 0%;\n  }\n  100% {\n    left: 0;\n    width: 25%;\n  }\n}\n@keyframes win-progress-fade-out {\n  from {\n    opacity: 1.0;\n  }\n  to {\n    opacity: 0.5;\n  }\n}\n.win-slider {\n  -webkit-appearance: none;\n  width: 280px;\n  height: 22px;\n  padding-top: 17px;\n  padding-bottom: 32px;\n}\n.win-slider::-ms-track {\n  height: 2px;\n  border-style: none;\n}\n.win-slider::-webkit-slider-runnable-track {\n  height: 2px;\n  border-style: none;\n}\n.win-slider::-moz-range-track {\n  height: 2px;\n  border-style: none;\n}\n.win-slider::-ms-thumb {\n  width: 24px;\n  height: 8px;\n  border-radius: 4px;\n  border-style: none;\n}\n.win-slider::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  margin-top: -4px;\n  width: 24px;\n  height: 8px;\n  border-radius: 4px;\n  border-style: none;\n}\n.win-slider::-moz-range-thumb {\n  width: 24px;\n  height: 8px;\n  border-radius: 4px;\n  border-style: none;\n}\n.win-slider.win-vertical {\n  writing-mode: bt-lr;\n  width: 22px;\n  height: 280px;\n}\n.win-slider.win-vertical::-ms-track {\n  width: 2px;\n  height: auto;\n}\n.win-slider.win-vertical::-ms-thumb {\n  width: 8px;\n  height: 24px;\n}\n.win-slider.win-vertical:lang(ar),\n.win-slider.win-vertical:lang(dv),\n.win-slider.win-vertical:lang(fa),\n.win-slider.win-vertical:lang(he),\n.win-slider.win-vertical:lang(ku-Arab),\n.win-slider.win-vertical:lang(pa-Arab),\n.win-slider.win-vertical:lang(prs),\n.win-slider.win-vertical:lang(ps),\n.win-slider.win-vertical:lang(sd-Arab),\n.win-slider.win-vertical:lang(syr),\n.win-slider.win-vertical:lang(ug),\n.win-slider.win-vertical:lang(ur),\n.win-slider.win-vertical:lang(qps-plocm) {\n  writing-mode: bt-rl;\n}\n.win-link {\n  text-decoration: underline;\n  cursor: pointer;\n  touch-action: manipulation;\n}\n.win-code {\n  font-family: \"Consolas\", \"Menlo\", \"Monaco\", \"Courier New\", monospace;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-type-ellipsis {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\nh1.win-type-ellipsis,\n.win-type-header.win-type-ellipsis,\n.win-h1.win-type-ellipsis {\n  line-height: 1.4286;\n}\nh2.win-type-ellipsis,\n.win-type-subheader.win-type-ellipsis,\n.win-h2.win-type-ellipsis {\n  line-height: 1.5;\n}\n.win-scrollview {\n  overflow-x: auto;\n  overflow-y: hidden;\n  height: 400px;\n  width: 100%;\n}\nh1.win-type-header,\nh2.win-type-subheader,\nh3.win-type-title,\nh4.win-type-subtitle,\nh5.win-type-base,\nh6.win-type-body,\nh1.win-h1,\nh2.win-h2,\nh3.win-h3,\nh4.win-h4,\nh5.win-h5,\nh6.win-h6 {\n  margin-top: 0px;\n  margin-bottom: 0px;\n}\n.win-type-body p,\np.win-type-body {\n  font-weight: 300;\n}\n.win-listview {\n  overflow: hidden;\n  height: 400px;\n}\n.win-listview .win-surface {\n  overflow: visible;\n}\n.win-listview > .win-viewport.win-horizontal .win-surface {\n  height: 100%;\n}\n.win-listview > .win-viewport.win-vertical .win-surface {\n  width: 100%;\n}\n.win-listview > .win-viewport {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  z-index: 0;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n  -webkit-overflow-scrolling: touch;\n  white-space: nowrap;\n}\n.win-listview > .win-viewport.win-horizontal {\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n.win-listview > .win-viewport.win-vertical {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.win-listview .win-itemscontainer {\n  overflow: hidden;\n}\n.win-listview .win-itemscontainer-padder {\n  width: 0;\n  height: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  overflow: hidden;\n}\n.win-listview > .win-horizontal .win-container {\n  margin: 10px 5px 0px 5px;\n}\n.win-listview > .win-vertical .win-container {\n  margin: 10px 24px 0px 7px;\n}\n.win-listview.win-rtl > .win-vertical .win-container {\n  margin: 10px 7px 0px 24px;\n}\n.win-listview .win-container,\n.win-listview .win-itembox,\n.win-itemcontainer.win-container,\n.win-itemcontainer .win-itembox {\n  cursor: default;\n  z-index: 0;\n}\n.win-listview .win-container {\n  touch-action: pan-x pan-y pinch-zoom;\n}\n.win-semanticzoom .win-listview > .win-viewport * {\n  touch-action: auto;\n}\n.win-semanticzoom .win-listview > .win-viewport.win-zooming-x {\n  overflow-x: visible;\n}\n.win-semanticzoom .win-listview > .win-viewport.win-zooming-y {\n  overflow-y: visible;\n}\n.win-listview .win-itembox,\n.win-itemcontainer .win-itembox {\n  width: 100%;\n  height: 100%;\n}\n.win-listview .win-item,\n.win-itemcontainer .win-item {\n  z-index: 1;\n}\n.win-listview .win-item,\n.win-itemcontainer .win-item {\n  overflow: hidden;\n  position: relative;\n}\n.win-listview > .win-vertical .win-item {\n  width: 100%;\n}\n.win-listview .win-item:focus,\n.win-itemcontainer .win-item:focus {\n  outline-style: none;\n}\n.win-listview .win-focusedoutline,\n.win-itemcontainer .win-focusedoutline {\n  width: calc(100% - 4px);\n  height: calc(100% - 4px);\n  left: 2px;\n  top: 2px;\n  position: absolute;\n  z-index: 5;\n  pointer-events: none;\n}\n.win-container.win-selected .win-selectionborder {\n  border-width: 2px;\n  border-style: solid;\n}\nhtml.win-hoverable .win-container.win-selected:hover .win-selectionborder {\n  border-width: 2px;\n  border-style: solid;\n}\nhtml.win-hoverable .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-itembox:hover::before {\n  position: absolute;\n  left: 0px;\n  top: 0px;\n  content: \"\";\n  width: calc(100% - 4px);\n  height: calc(100% - 4px);\n  pointer-events: none;\n  border-style: solid;\n  border-width: 2px;\n  z-index: 3;\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled .win-itembox:hover::before,\nhtml.win-hoverable .win-listview .win-itembox.win-selected:hover::before,\nhtml.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before,\nhtml.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before {\n  display: none;\n}\n.win-listview .win-groupheader {\n  padding: 10px 10px 10px 2px;\n  overflow: hidden;\n  outline-width: 0.01px;\n  outline-style: none;\n  float: left;\n  font-size: 34px;\n  font-weight: 200;\n  line-height: 1.176;\n}\n.win-listview .win-groupheadercontainer {\n  z-index: 1;\n  touch-action: pan-x pan-y pinch-zoom;\n  overflow: hidden;\n}\n.win-listview .win-horizontal .win-headercontainer,\n.win-listview .win-horizontal .win-footercontainer {\n  height: 100%;\n  display: inline-block;\n  overflow: hidden;\n  white-space: normal;\n}\n.win-listview .win-vertical .win-headercontainer,\n.win-listview .win-vertical .win-footercontainer {\n  width: 100%;\n  display: block;\n  overflow: hidden;\n  white-space: normal;\n}\n.win-listview .win-groupheader.win-focused {\n  outline-style: dotted;\n}\n.win-listview.win-rtl .win-groupheader {\n  padding-left: 10px;\n  padding-right: 2px;\n  float: right;\n}\n.win-listview.win-groups .win-horizontal .win-groupleader {\n  margin-left: 70px;\n}\n.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader {\n  margin-left: 0;\n  margin-right: 70px;\n}\n.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader,\n.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader {\n  margin-top: 70px;\n}\n.win-listview.win-groups > .win-vertical .win-surface.win-listlayout,\n.win-listview.win-groups > .win-vertical .win-surface.win-gridlayout {\n  margin-top: -65px;\n}\n.win-listview.win-groups > .win-horizontal .win-surface {\n  margin-left: -70px;\n}\n.win-listview.win-groups.win-rtl > .win-horizontal .win-surface {\n  margin-left: 0;\n  margin-right: -70px;\n}\n.win-listview .win-surface {\n  -webkit-margin-collapse: separate;\n  white-space: normal;\n}\n.win-surface ._win-proxy {\n  position: relative;\n  overflow: hidden;\n  width: 0;\n  height: 0;\n  touch-action: none;\n}\n.win-selectionborder {\n  position: absolute;\n  opacity: inherit;\n  z-index: 2;\n  pointer-events: none;\n}\n.win-container.win-selected .win-selectionborder {\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n.win-selectionbackground {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 0;\n}\n.win-selectioncheckmarkbackground {\n  position: absolute;\n  top: 2px;\n  right: 2px;\n  width: 14px;\n  height: 11px;\n  margin: 0;\n  padding: 0;\n  border-left-width: 2px;\n  border-right-width: 2px;\n  border-top-width: 4px;\n  border-bottom-width: 3px;\n  border-style: solid;\n  z-index: 3;\n  display: none;\n}\n.win-listview.win-rtl .win-selectioncheckmarkbackground,\n.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground {\n  left: 2px;\n  right: auto;\n}\n.win-selectionmode.win-itemcontainer .win-selectioncheckmarkbackground,\n.win-selectionmode.win-itemcontainer.win-selectionmode .win-selectioncheckmark,\n.win-selectionmode .win-itemcontainer .win-selectioncheckmarkbackground,\n.win-selectionmode .win-itemcontainer.win-selectionmode .win-selectioncheckmark,\n.win-listview .win-selectionmode .win-selectioncheckmarkbackground,\n.win-listview .win-selectionmode .win-selectioncheckmark {\n  display: block;\n}\n.win-selectioncheckmark {\n  position: absolute;\n  margin: 0;\n  padding: 2px;\n  right: 1px;\n  top: 1px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 14px;\n  z-index: 4;\n  line-height: 1;\n  display: none;\n}\n.win-rtl .win-selectioncheckmark {\n  right: auto;\n  left: 0px;\n}\n.win-selectionstylefilled.win-container,\n.win-selectionstylefilled .win-container {\n  overflow: hidden;\n}\n.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-selectionmode.win-itemcontainer.win-container .win-itembox::after,\n.win-listview .win-surface.win-selectionmode .win-itembox::after {\n  content: \"\";\n  position: absolute;\n  width: 18px;\n  height: 18px;\n  pointer-events: none;\n  right: 2px;\n  top: 2px;\n  z-index: 3;\n}\n.win-rtl .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-itemcontainer.win-rtl.win-selectionmode.win-container .win-itembox::after,\n.win-listview.win-rtl .win-surface.win-selectionmode .win-itembox::after {\n  right: auto;\n  left: 2px;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: translate(40px, 0px);\n  -webkit-transform: translate(40px, 0px);\n}\n.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-selectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: translate(-40px, 0px);\n  -webkit-transform: translate(-40px, 0px);\n}\n.win-listview.win-selectionstylefilled .win-surface.win-hidingselectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: none;\n  -webkit-transform: none;\n}\n.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-hideselectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: none;\n  -webkit-transform: none;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {\n  left: 12px;\n  right: auto;\n  top: 50%;\n  margin-top: -9px;\n  display: block;\n  border: 2px solid;\n  width: 16px;\n  height: 16px;\n}\n.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-itembox::after {\n  left: auto;\n  right: 12px;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmarkbackground {\n  left: 12px;\n  top: 50%;\n  margin-top: -9px;\n  display: block;\n  border: 2px solid;\n  width: 16px;\n  height: 16px;\n}\n.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmarkbackground {\n  left: auto;\n  right: 12px;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmark {\n  left: 13px;\n  top: 50%;\n  margin-top: -8px;\n  display: block;\n  width: 14px;\n  height: 14px;\n}\n.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmark {\n  left: 0;\n  right: 10px;\n}\n.win-selectionmode .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-selected::after,\n.win-itemcontainer.win-selectionmode.win-selectionstylefilled.win-container .win-itembox.win-selected::after,\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox.win-nonselectable::after,\n.win-listview .win-surface.win-selectionmode .win-itembox.win-selected::after {\n  display: none;\n}\n.win-listview .win-progress {\n  left: 50%;\n  top: 50%;\n  width: 60px;\n  height: 60px;\n  margin-left: -30px;\n  margin-top: -30px;\n  z-index: 1;\n  position: absolute;\n}\n.win-listview .win-progress::-ms-fill {\n  animation-name: -ms-ring;\n}\n.win-listview .win-itemsblock {\n  overflow: hidden;\n}\n.win-listview .win-surface.win-nocssgrid.win-gridlayout,\n.win-listview .win-horizontal .win-nocssgrid.win-listlayout,\n.win-listview .win-vertical .win-nocssgrid.win-listlayout.win-headerpositionleft {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  vertical-align: top;\n}\n.win-listview .win-horizontal .win-surface.win-nocssgrid {\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-vertical .win-surface.win-nocssgrid {\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout {\n  display: block;\n}\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder {\n  height: 0;\n  width: 0;\n}\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer,\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer {\n  display: none;\n}\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout,\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout {\n  display: block;\n}\n.win-listview .win-listlayout .win-itemscontainer {\n  overflow: visible;\n}\n.win-listview .win-listlayout .win-itemsblock {\n  padding-bottom: 4px;\n  margin-bottom: -4px;\n}\n.win-listview > .win-vertical .win-listlayout.win-headerpositiontop .win-groupheader {\n  float: none;\n}\n.win-listview > .win-vertical .win-surface.win-listlayout {\n  margin-bottom: 5px;\n}\n.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface {\n  display: -ms-inline-grid;\n  -ms-grid-columns: auto 1fr;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer {\n  -ms-grid-column: 1;\n}\n.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer {\n  -ms-grid-column: 2;\n}\n.win-listview > .win-horizontal .win-surface.win-listlayout {\n  display: -ms-inline-grid;\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto;\n  vertical-align: top;\n}\n.win-listview .win-horizontal .win-listlayout .win-itemsblock {\n  height: 100%;\n}\n.win-listview .win-horizontal .win-listlayout .win-itemscontainer {\n  margin-bottom: 24px;\n}\n.win-listview .win-horizontal .win-listlayout .win-container {\n  height: calc(100% - 10px);\n}\n.win-listview > .win-horizontal .win-surface.win-listlayout.win-headerpositiontop {\n  -ms-grid-rows: auto 1fr;\n}\n.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer {\n  -ms-grid-row: 2;\n}\n.win-listview .win-gridlayout.win-surface {\n  display: -ms-inline-grid;\n  vertical-align: top;\n}\n.win-listview .win-gridlayout .win-container {\n  margin: 5px;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,\n.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {\n  -ms-grid-column: 1;\n}\n.win-listview.win-groups .win-gridlayout .win-itemscontainer,\n.win-listview.win-groups .win-gridlayout .win-groupheadercontainer {\n  display: none;\n}\n.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout {\n  display: block;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface {\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto 1fr;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer {\n  -ms-grid-row: 2;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface {\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface {\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer {\n  -ms-grid-column: 1;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface {\n  -ms-grid-columns: auto 1fr;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer {\n  -ms-grid-column: 2;\n}\n.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n}\n.win-listview .win-horizontal .win-listlayout .win-itemscontainer,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-listlayout .win-itemsblock,\n.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-horizontal .win-itemscontainer-padder {\n  height: 100%;\n}\n.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  height: 100%;\n}\n.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout {\n  display: -ms-grid;\n}\n.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,\n.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  width: 100%;\n}\n.win-listview .win-cellspanninggridlayout .win-container.win-laidout {\n  display: block;\n}\n.win-listview .win-cellspanninggridlayout .win-container {\n  display: none;\n}\n.win-listview .win-itembox {\n  position: relative;\n}\n.win-listview.win-dragover .win-itembox {\n  transform: scale(0.86);\n  -webkit-transform: scale(0.86);\n}\n.win-listview .win-itembox.win-dragsource,\n.win-itemcontainer .win-itembox.win-dragsource {\n  opacity: 0.5;\n  transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n  -webkit-transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n}\n.win-listview.win-dragover .win-itembox.win-dragsource {\n  opacity: 0;\n  transition: none;\n  -webkit-transition: none;\n}\nhtml.win-hoverable .win-listview.win-dragover .win-container:hover {\n  outline: none;\n}\n.win-listview .win-itembox {\n  transition: transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n  -webkit-transition: -webkit-transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n}\n.win-listview.win-groups > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {\n  margin-left: 70px;\n}\n.win-listview.win-groups.win-rtl > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {\n  margin-left: 0px;\n  margin-right: 70px;\n}\n.win-listview > .win-horizontal .win-surface.win-listlayout {\n  margin-left: 70px;\n}\n.win-listview.win-rtl > .win-horizontal .win-surface.win-listlayout {\n  margin-left: 0px;\n  margin-right: 70px;\n}\n.win-listview .win-vertical .win-gridlayout.win-surface {\n  margin-left: 20px;\n}\n.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface {\n  margin-left: 0px;\n  margin-right: 20px;\n}\n.win-itemcontainer .win-itembox,\n.win-itemcontainer.win-container {\n  position: relative;\n}\n.win-itemcontainer {\n  touch-action: pan-x pan-y pinch-zoom;\n}\nhtml.win-hoverable .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-itembox:hover::before {\n  opacity: 0.4;\n}\nhtml.win-hoverable .win-listview .win-pressed .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-pressed .win-itembox:hover::before,\nhtml.win-hoverable .win-listview .win-pressed.win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-pressed.win-itembox:hover::before {\n  opacity: 0.6;\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover,\nhtml.win-hoverable .win-selectionstylefilled .win-itemcontainer.win-container:hover {\n  outline: none;\n}\n.win-selectionstylefilled.win-itemcontainer .win-itembox,\n.win-selectionstylefilled .win-itemcontainer .win-itembox,\n.win-listview.win-selectionstylefilled .win-itembox {\n  background-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,\n.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {\n  border-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {\n  background-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,\n.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {\n  border-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-selected a,\n.win-listview.win-selectionstylefilled .win-selected progress,\n.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full,\n.win-itemcontainer.win-selectionstylefilled.win-selected a,\n.win-itemcontainer.win-selectionstylefilled.win-selected progress,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full {\n  color: #ffffff;\n}\n.win-listview.win-selectionstylefilled .win-selected.win-selected a:hover:active,\n.win-itemcontainer.win-selectionstylefilled.win-selected.win-selected a:hover:active {\n  color: rgba(255, 255, 255, 0.6);\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-selected a:hover,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected a:hover {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-listview.win-selectionstylefilled .win-selected button,\n.win-listview.win-selectionstylefilled .win-selected input[type=button],\n.win-listview.win-selectionstylefilled .win-selected input[type=reset],\n.win-listview.win-selectionstylefilled .win-selected input[type=text],\n.win-listview.win-selectionstylefilled .win-selected input[type=password],\n.win-listview.win-selectionstylefilled .win-selected input[type=email],\n.win-listview.win-selectionstylefilled .win-selected input[type=number],\n.win-listview.win-selectionstylefilled .win-selected input[type=tel],\n.win-listview.win-selectionstylefilled .win-selected input[type=url],\n.win-listview.win-selectionstylefilled .win-selected input[type=search],\n.win-listview.win-selectionstylefilled .win-selected input::-ms-check,\n.win-listview.win-selectionstylefilled .win-selected textarea,\n.win-listview.win-selectionstylefilled .win-selected .win-textarea,\n.win-listview.win-selectionstylefilled .win-selected select,\n.win-itemcontainer.win-selectionstylefilled.win-selected button,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search],\n.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,\n.win-itemcontainer.win-selectionstylefilled.win-selected textarea,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea,\n.win-itemcontainer.win-selectionstylefilled.win-selected select {\n  background-clip: border-box;\n  background-color: rgba(255, 255, 255, 0.8);\n  border-color: transparent;\n  color: #000000;\n}\n.win-listview.win-selectionstylefilled .win-selected button[type=submit],\n.win-listview.win-selectionstylefilled .win-selected input[type=submit],\n.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit] {\n  border-color: #ffffff;\n}\n.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower {\n  background-color: #ffffff;\n}\n.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb {\n  background-color: #000000;\n}\n.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,\n.win-listview.win-selectionstylefilled .win-selected progress,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,\n.win-itemcontainer.win-selectionstylefilled.win-selected progress {\n  background-color: rgba(255, 255, 255, 0.16);\n}\n.win-listview.win-selectionstylefilled .win-selected progress:indeterminate,\n.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate {\n  background-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty {\n  color: rgba(255, 255, 255, 0.16);\n}\n.win-listview .win-viewport {\n  outline: none;\n}\n@media (-ms-high-contrast) {\n  .win-listview .win-groupheader {\n    color: WindowText;\n  }\n  .win-selectioncheckmark {\n    color: HighlightText;\n  }\n  .win-listview .win-focusedoutline,\n  .win-listview .win-groupheader,\n  .win-itemcontainer .win-focusedoutline {\n    outline-color: WindowText;\n  }\n  .win-listview.win-selectionstylefilled .win-itembox,\n  .win-itemcontainer.win-selectionstylefilled .win-itembox {\n    background-color: Window;\n    color: WindowText;\n  }\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-itembox,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-container.win-selected .win-itembox,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox,\n  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-itembox,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,\n  .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder {\n    border-color: Highlight;\n  }\n  .win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,\n  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {\n    border-color: transparent;\n  }\n  html.win-hoverable .win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder,\n  html.win-hoverable .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder {\n    border-color: Highlight;\n  }\n  .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,\n  .win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {\n    border-color: transparent;\n  }\n  .win-listview.win-selectionstylefilled .win-selected a,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover a,\n  .win-listview.win-selectionstylefilled .win-selected progress,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,\n  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star:after,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star:after,\n  .win-itemcontainer.win-selectionstylefilled.win-selected a,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover a,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star:after,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star:after {\n    color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selected input,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input,\n  .win-listview.win-selectionstylefilled .win-selected input::-ms-check,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-check,\n  .win-listview.win-selectionstylefilled .win-selected input::-ms-value,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-value,\n  .win-listview.win-selectionstylefilled .win-selected input::-ms-track,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-track,\n  .win-listview.win-selectionstylefilled .win-selected button,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover button,\n  .win-listview.win-selectionstylefilled .win-selected progress,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,\n  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,\n  .win-listview.win-selectionstylefilled .win-selected select,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover select,\n  .win-listview.win-selectionstylefilled .win-selected textarea,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover textarea,\n  .win-listview.win-selectionstylefilled.win-selected input,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-check,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-value,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-value,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-track,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-track,\n  .win-itemcontainer.win-selectionstylefilled.win-selected button,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover button,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,\n  .win-itemcontainer.win-selectionstylefilled.win-selected select,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover select,\n  .win-itemcontainer.win-selectionstylefilled.win-selected textarea,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover textarea {\n    border-color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-lower,\n  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-lower,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill {\n    background-color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-upper,\n  .win-listview.win-selectionstylefilled .win-selected progress,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-upper,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress {\n    background-color: Highlight;\n  }\n  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full:before,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-full:before,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full:before,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-full:before {\n    color: ButtonFace;\n  }\n  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty:before,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-empty:before,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty:before,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-empty:before {\n    color: Highlight;\n  }\n  html.win-hoverable .win-listview .win-container:hover,\n  html.win-hoverable .win-itemcontainer.win-container:hover {\n    outline: Highlight solid 3px;\n  }\n}\n.win-flipview {\n  overflow: hidden;\n  height: 400px;\n}\n.win-flipview .win-surface {\n  -ms-scroll-chaining: none;\n}\n.win-flipview .win-navleft {\n  left: 0%;\n  top: 50%;\n  margin-top: -19px;\n}\n.win-flipview .win-navright {\n  left: 100%;\n  top: 50%;\n  margin-left: -20px;\n  margin-top: -19px;\n}\n.win-flipview .win-navtop {\n  left: 50%;\n  top: 0%;\n  margin-left: -35px;\n}\n.win-flipview .win-navbottom {\n  left: 50%;\n  top: 100%;\n  margin-left: -35px;\n  margin-top: -36px;\n}\n.win-flipview .win-navbutton {\n  touch-action: manipulation;\n  border: none;\n  width: 20px;\n  height: 36px;\n  z-index: 1;\n  position: absolute;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 16px;\n  padding: 0;\n  min-width: 0;\n}\n.win-flipview .win-item,\n.win-flipview .win-item > .win-template {\n  height: 100%;\n  width: 100%;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n}\n@media (-ms-high-contrast) {\n  .win-flipview .win-navbottom {\n    left: 50%;\n    top: 100%;\n    margin-left: -35px;\n    margin-top: -35px;\n  }\n  .win-flipview .win-navbutton {\n    background-color: ButtonFace;\n    color: ButtonText;\n    border: 2px solid ButtonText;\n    width: 65px;\n    height: 35px;\n  }\n  .win-flipview .win-navbutton.win-navbutton:hover:active,\n  .win-flipview .win-navbutton.win-navbutton:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  .win-flipview .win-navright {\n    margin-left: -65px;\n  }\n  html.win-hoverable .win-flipview .win-navbutton:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n}\n.win-datepicker {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  height: auto;\n  width: auto;\n}\n.win-datepicker select {\n  min-width: 80px;\n  margin-top: 4px;\n  margin-bottom: 4px;\n}\n.win-datepicker .win-datepicker-month {\n  margin-right: 20px;\n}\n.win-datepicker .win-datepicker-date.win-order0,\n.win-datepicker .win-datepicker-date.win-order1 {\n  margin-right: 20px;\n}\n.win-datepicker .win-datepicker-year.win-order0 {\n  margin-right: 20px;\n}\n.win-datepicker .win-datepicker-month:lang(ar),\n.win-datepicker .win-datepicker-month:lang(dv),\n.win-datepicker .win-datepicker-month:lang(fa),\n.win-datepicker .win-datepicker-month:lang(he),\n.win-datepicker .win-datepicker-month:lang(ku-Arab),\n.win-datepicker .win-datepicker-month:lang(pa-Arab),\n.win-datepicker .win-datepicker-month:lang(prs),\n.win-datepicker .win-datepicker-month:lang(ps),\n.win-datepicker .win-datepicker-month:lang(sd-Arab),\n.win-datepicker .win-datepicker-month:lang(syr),\n.win-datepicker .win-datepicker-month:lang(ug),\n.win-datepicker .win-datepicker-month:lang(ur),\n.win-datepicker .win-datepicker-month:lang(qps-plocm),\n.win-datepicker .win-datepicker-date.win-order0:lang(ar),\n.win-datepicker .win-datepicker-date.win-order0:lang(dv),\n.win-datepicker .win-datepicker-date.win-order0:lang(fa),\n.win-datepicker .win-datepicker-date.win-order0:lang(he),\n.win-datepicker .win-datepicker-date.win-order0:lang(ku-Arab),\n.win-datepicker .win-datepicker-date.win-order0:lang(pa-Arab),\n.win-datepicker .win-datepicker-date.win-order0:lang(prs),\n.win-datepicker .win-datepicker-date.win-order0:lang(ps),\n.win-datepicker .win-datepicker-date.win-order0:lang(sd-Arab),\n.win-datepicker .win-datepicker-date.win-order0:lang(syr),\n.win-datepicker .win-datepicker-date.win-order0:lang(ug),\n.win-datepicker .win-datepicker-date.win-order0:lang(ur),\n.win-datepicker .win-datepicker-date.win-order0:lang(qps-plocm),\n.win-datepicker .win-datepicker-date.win-order1:lang(ar),\n.win-datepicker .win-datepicker-date.win-order1:lang(dv),\n.win-datepicker .win-datepicker-date.win-order1:lang(fa),\n.win-datepicker .win-datepicker-date.win-order1:lang(he),\n.win-datepicker .win-datepicker-date.win-order1:lang(ku-Arab),\n.win-datepicker .win-datepicker-date.win-order1:lang(pa-Arab),\n.win-datepicker .win-datepicker-date.win-order1:lang(prs),\n.win-datepicker .win-datepicker-date.win-order1:lang(ps),\n.win-datepicker .win-datepicker-date.win-order1:lang(sd-Arab),\n.win-datepicker .win-datepicker-date.win-order1:lang(syr),\n.win-datepicker .win-datepicker-date.win-order1:lang(ug),\n.win-datepicker .win-datepicker-date.win-order1:lang(ur),\n.win-datepicker .win-datepicker-date.win-order1:lang(qps-plocm),\n.win-datepicker .win-datepicker-year.win-order0:lang(ar),\n.win-datepicker .win-datepicker-year.win-order0:lang(dv),\n.win-datepicker .win-datepicker-year.win-order0:lang(fa),\n.win-datepicker .win-datepicker-year.win-order0:lang(he),\n.win-datepicker .win-datepicker-year.win-order0:lang(ku-Arab),\n.win-datepicker .win-datepicker-year.win-order0:lang(pa-Arab),\n.win-datepicker .win-datepicker-year.win-order0:lang(prs),\n.win-datepicker .win-datepicker-year.win-order0:lang(ps),\n.win-datepicker .win-datepicker-year.win-order0:lang(sd-Arab),\n.win-datepicker .win-datepicker-year.win-order0:lang(syr),\n.win-datepicker .win-datepicker-year.win-order0:lang(ug),\n.win-datepicker .win-datepicker-year.win-order0:lang(ur),\n.win-datepicker .win-datepicker-year.win-order0:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: 20px;\n}\n.win-timepicker {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  height: auto;\n  width: auto;\n}\n.win-timepicker select {\n  min-width: 80px;\n  margin-top: 4px;\n  margin-bottom: 4px;\n}\n.win-timepicker .win-timepicker-hour {\n  margin-right: 20px;\n}\n.win-timepicker .win-timepicker-period.win-order0 {\n  margin-right: 20px;\n}\n.win-timepicker .win-timepicker-minute.win-order1 {\n  margin-right: 20px;\n}\n.win-timepicker .win-timepicker-period.win-order0:lang(ar),\n.win-timepicker .win-timepicker-period.win-order0:lang(dv),\n.win-timepicker .win-timepicker-period.win-order0:lang(fa),\n.win-timepicker .win-timepicker-period.win-order0:lang(he),\n.win-timepicker .win-timepicker-period.win-order0:lang(ku-Arab),\n.win-timepicker .win-timepicker-period.win-order0:lang(pa-Arab),\n.win-timepicker .win-timepicker-period.win-order0:lang(prs),\n.win-timepicker .win-timepicker-period.win-order0:lang(ps),\n.win-timepicker .win-timepicker-period.win-order0:lang(sd-Arab),\n.win-timepicker .win-timepicker-period.win-order0:lang(syr),\n.win-timepicker .win-timepicker-period.win-order0:lang(ug),\n.win-timepicker .win-timepicker-period.win-order0:lang(ur),\n.win-timepicker .win-timepicker-period.win-order0:lang(qps-plocm),\n.win-timepicker .win-timepicker-hour:lang(ar),\n.win-timepicker .win-timepicker-hour:lang(dv),\n.win-timepicker .win-timepicker-hour:lang(fa),\n.win-timepicker .win-timepicker-hour:lang(he),\n.win-timepicker .win-timepicker-hour:lang(ku-Arab),\n.win-timepicker .win-timepicker-hour:lang(pa-Arab),\n.win-timepicker .win-timepicker-hour:lang(prs),\n.win-timepicker .win-timepicker-hour:lang(ps),\n.win-timepicker .win-timepicker-hour:lang(sd-Arab),\n.win-timepicker .win-timepicker-hour:lang(syr),\n.win-timepicker .win-timepicker-hour:lang(ug),\n.win-timepicker .win-timepicker-hour:lang(ur),\n.win-timepicker .win-timepicker-hour:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: 20px;\n}\n.win-timepicker .win-timepicker-minute.win-order1:lang(ar),\n.win-timepicker .win-timepicker-minute.win-order1:lang(dv),\n.win-timepicker .win-timepicker-minute.win-order1:lang(fa),\n.win-timepicker .win-timepicker-minute.win-order1:lang(he),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ku-Arab),\n.win-timepicker .win-timepicker-minute.win-order1:lang(pa-Arab),\n.win-timepicker .win-timepicker-minute.win-order1:lang(prs),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ps),\n.win-timepicker .win-timepicker-minute.win-order1:lang(sd-Arab),\n.win-timepicker .win-timepicker-minute.win-order1:lang(syr),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ug),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ur),\n.win-timepicker .win-timepicker-minute.win-order1:lang(qps-plocm),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ar),\n.win-timepicker .win-timepicker-minute.win-order0:lang(dv),\n.win-timepicker .win-timepicker-minute.win-order0:lang(fa),\n.win-timepicker .win-timepicker-minute.win-order0:lang(he),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ku-Arab),\n.win-timepicker .win-timepicker-minute.win-order0:lang(pa-Arab),\n.win-timepicker .win-timepicker-minute.win-order0:lang(prs),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ps),\n.win-timepicker .win-timepicker-minute.win-order0:lang(sd-Arab),\n.win-timepicker .win-timepicker-minute.win-order0:lang(syr),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ug),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ur),\n.win-timepicker .win-timepicker-minute.win-order0:lang(qps-plocm) {\n  margin-left: 20px;\n  margin-right: 0;\n}\nbody > .win-navigation-backbutton {\n  position: absolute;\n  top: 50px;\n  left: 20px;\n}\n.win-backbutton,\n.win-navigation-backbutton,\n.win-back {\n  touch-action: manipulation;\n  display: inline-block;\n  min-width: 0;\n  min-height: 0;\n  padding: 0;\n  text-align: center;\n  width: 41px;\n  height: 41px;\n  font-size: 24px;\n  line-height: 41px;\n  vertical-align: baseline;\n}\n.win-backbutton::before,\n.win-back::before {\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-weight: normal;\n  content: \"\\E0D5\";\n  vertical-align: 50%;\n}\n.win-backbutton:lang(ar)::before,\n.win-backbutton:lang(dv)::before,\n.win-backbutton:lang(fa)::before,\n.win-backbutton:lang(he)::before,\n.win-backbutton:lang(ku-Arab)::before,\n.win-backbutton:lang(pa-Arab)::before,\n.win-backbutton:lang(prs)::before,\n.win-backbutton:lang(ps)::before,\n.win-backbutton:lang(sd-Arab)::before,\n.win-backbutton:lang(syr)::before,\n.win-backbutton:lang(ug)::before,\n.win-backbutton:lang(ur)::before,\n.win-backbutton:lang(qps-plocm)::before,\n.win-back:lang(ar)::before,\n.win-back:lang(dv)::before,\n.win-back:lang(fa)::before,\n.win-back:lang(he)::before,\n.win-back:lang(ku-Arab)::before,\n.win-back:lang(pa-Arab)::before,\n.win-back:lang(prs)::before,\n.win-back:lang(ps)::before,\n.win-back:lang(sd-Arab)::before,\n.win-back:lang(syr)::before,\n.win-back:lang(ug)::before,\n.win-back:lang(ur)::before,\n.win-back:lang(qps-plocm)::before {\n  content: \"\\E0AE\";\n}\nbutton.win-navigation-backbutton,\nbutton.win-navigation-backbutton:active,\nhtml.win-hoverable button.win-navigation-backbutton:enabled:hover,\nbutton.win-navigation-backbutton:enabled:hover:active {\n  background-color: transparent;\n  border: none;\n}\n@media (-ms-high-contrast) {\n  button.win-navigation-backbutton,\n  button.win-navigation-backbutton:active,\n  html.win-hoverable button.win-navigation-backbutton:enabled:hover,\n  button.win-navigation-backbutton:enabled:hover:active {\n    /* Overwrite default background and border styles from BackButton control's <button> element */\n    background-color: transparent;\n    border: none;\n  }\n  .win-backbutton,\n  .win-back {\n    background-color: ButtonFace;\n    border-color: ButtonText;\n    color: ButtonText;\n  }\n  .win-backbutton.win-backbutton:enabled:hover:active,\n  .win-navigation-backbutton.win-navigation-backbutton:enabled:hover:active .win-back {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  .win-backbutton:disabled,\n  .win-navigation-backbutton:disabled .win-back,\n  .win-backbutton:disabled:active,\n  .win-navigation-backbutton:disabled:active .win-back {\n    background-color: ButtonFace;\n    border-color: GrayText;\n    color: GrayText;\n  }\n  .win-backbutton:-ms-keyboard-active,\n  .win-navigation-backbutton:-ms-keyboard-active .win-back {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  html.win-hoverable .win-backbutton:enabled:hover,\n  html.win-hoverable .win-navigation-backbutton:enabled:hover .win-back {\n    background-color: Highlight;\n    border-color: ButtonText;\n    color: HighlightText;\n  }\n}\n.win-tooltip {\n  display: block;\n  position: fixed;\n  top: 30px;\n  left: 30px;\n  max-width: 320px;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 4px 7px 6px 7px;\n  border-style: solid;\n  border-width: 1px;\n  z-index: 9999;\n  word-wrap: break-word;\n  animation-fill-mode: both;\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 1.167;\n}\n.win-tooltip-phantom {\n  display: block;\n  position: fixed;\n  top: 30px;\n  left: 30px;\n  background-color: transparent;\n  border-width: 0;\n  margin: 0;\n  padding: 0;\n}\n@media (-ms-high-contrast) {\n  .win-tooltip {\n    background-color: Window;\n    border-color: WindowText;\n    color: WindowText;\n  }\n}\n.win-rating {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex-pack: self;\n  -webkit-justify-content: self;\n  justify-content: self;\n  -ms-flex-align: stretch;\n  -webkit-align-items: stretch;\n  align-items: stretch;\n  height: auto;\n  width: auto;\n  white-space: normal;\n  outline: 0;\n}\n.win-rating .win-star {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  height: 24px;\n  width: 24px;\n  padding: 9px 10px 11px 10px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 24px;\n  overflow: hidden;\n  text-indent: 0;\n  line-height: 1;\n  cursor: default;\n  position: relative;\n  letter-spacing: 0;\n  -ms-touch-action: none;\n  touch-action: none;\n}\n.win-rating.win-small .win-star {\n  width: 12px;\n  height: 12px;\n  font-size: 12px;\n  padding: 3px 4px 5px 4px;\n}\n.win-rating .win-star:before {\n  content: \"\\E082\";\n}\n.win-rating .win-star.win-disabled {\n  cursor: default;\n  -ms-touch-action: auto;\n  touch-action: auto;\n}\n@media (-ms-high-contrast) {\n  .win-rating .win-star:before {\n    content: \"\\E082\" !important;\n  }\n  .win-rating .win-star.win-full {\n    color: HighLight;\n  }\n  .win-rating .win-star.win-tentative.win-full {\n    color: ButtonText;\n  }\n  .win-rating .win-star.win-empty {\n    color: ButtonFace;\n  }\n  .win-rating .win-star:after {\n    content: \"\\E224\" !important;\n    position: relative;\n    top: -100%;\n    color: ButtonText;\n  }\n}\n.win-toggleswitch {\n  outline: 0;\n}\n.win-toggleswitch .win-toggleswitch-header {\n  max-width: 470px;\n  margin-bottom: 14px;\n  margin-top: 22px;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-toggleswitch .win-toggleswitch-values {\n  display: inline-block;\n  vertical-align: top;\n}\n.win-toggleswitch .win-toggleswitch-value {\n  min-width: 65px;\n  margin-left: 12px;\n  height: 16px;\n  vertical-align: top;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 16px;\n}\n.win-toggleswitch .win-toggleswitch-description {\n  font-size: 12px;\n  width: 22em;\n  margin-top: 28px;\n  display: none;\n}\n.win-toggleswitch .win-toggleswitch-clickregion {\n  display: inline-block;\n  touch-action: none;\n  -ms-user-select: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n.win-toggleswitch .win-toggleswitch-track {\n  position: relative;\n  display: inline-block;\n  width: 44px;\n  height: 16px;\n  border-style: solid;\n  border-width: 2px;\n  border-radius: 8px;\n  box-sizing: border-box;\n}\n.win-toggleswitch .win-toggleswitch-thumb {\n  position: absolute;\n  top: 2px;\n  display: inline-block;\n  width: 20px;\n  height: 8px;\n  border-radius: 4px;\n  -webkit-transition: left 0.1s;\n  transition: left 0.1s;\n}\n.win-toggleswitch:focus .win-toggleswitch-track {\n  outline-width: 1px;\n  outline-style: dotted;\n}\n.win-toggleswitch.win-toggleswitch-dragging .win-toggleswitch-thumb {\n  -webkit-transition: none;\n  transition: none;\n}\n.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-value-on {\n  visibility: hidden;\n  height: 0;\n  font-size: 0;\n  line-height: 0;\n}\n.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-value-off {\n  visibility: hidden;\n  height: 0;\n  font-size: 0;\n  line-height: 0;\n}\n.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-thumb {\n  left: 18px;\n}\n.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-thumb {\n  left: 2px;\n}\n.win-toggleswitch:lang(ar),\n.win-toggleswitch:lang(dv),\n.win-toggleswitch:lang(fa),\n.win-toggleswitch:lang(he),\n.win-toggleswitch:lang(ku-Arab),\n.win-toggleswitch:lang(pa-Arab),\n.win-toggleswitch:lang(prs),\n.win-toggleswitch:lang(ps),\n.win-toggleswitch:lang(sd-Arab),\n.win-toggleswitch:lang(syr),\n.win-toggleswitch:lang(ug),\n.win-toggleswitch:lang(ur),\n.win-toggleswitch:lang(qps-plocm) {\n  direction: rtl;\n}\n.win-toggleswitch:lang(ar).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(dv).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(fa).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(he).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ku-Arab).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(pa-Arab).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(prs).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ps).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(sd-Arab).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(syr).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ug).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ur).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(qps-plocm).win-toggleswitch-on .win-toggleswitch-thumb {\n  left: 2px;\n}\n.win-toggleswitch:lang(ar).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(dv).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(fa).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(he).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ku-Arab).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(pa-Arab).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(prs).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ps).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(sd-Arab).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(syr).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ug).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ur).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(qps-plocm).win-toggleswitch-off .win-toggleswitch-thumb {\n  left: 18px;\n}\n.win-semanticzoom {\n  touch-action: pan-x pan-y double-tap-zoom;\n  height: 400px;\n}\n.win-semanticzoom .win-listview > .win-viewport * {\n  touch-action: auto;\n}\n.win-semanticzoom * {\n  touch-action: inherit;\n}\n.win-semanticzoom-button {\n  z-index: 100;\n  position: absolute;\n  min-width: 25px;\n  min-height: 25px;\n  width: 25px;\n  height: 25px;\n  padding: 0px;\n  bottom: 21px;\n  touch-action: none;\n}\n.win-semanticzoom-button::before {\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-weight: normal;\n  font-size: 11px;\n  content: \"\\E0B8\";\n  /* minus sign */\n}\n.win-semanticzoom-button-location {\n  left: auto;\n  right: 4px;\n}\n.win-semanticzoom-button-location:lang(ar),\n.win-semanticzoom-button-location:lang(dv),\n.win-semanticzoom-button-location:lang(fa),\n.win-semanticzoom-button-location:lang(he),\n.win-semanticzoom-button-location:lang(ku-Arab),\n.win-semanticzoom-button-location:lang(pa-Arab),\n.win-semanticzoom-button-location:lang(prs),\n.win-semanticzoom-button-location:lang(ps),\n.win-semanticzoom-button-location:lang(sd-Arab),\n.win-semanticzoom-button-location:lang(syr),\n.win-semanticzoom-button-location:lang(ug),\n.win-semanticzoom-button-location:lang(ur),\n.win-semanticzoom-button-location:lang(qps-plocm) {\n  left: 4px;\n  right: auto;\n}\n@media (-ms-high-contrast) {\n  .win-semanticzoom-button {\n    background-color: ButtonFace;\n    border-color: ButtonText;\n    color: ButtonText;\n  }\n  .win-semanticzoom-button.win-semanticzoom-button:hover:active {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  .win-semanticzoom-button:-ms-keyboard-active {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  html.win-hoverable win-semanticzoom-button:hover {\n    background-color: Highlight;\n    border-color: ButtonText;\n    color: HighlightText;\n  }\n}\n.win-pivot {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: none;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n  height: 100%;\n  width: 100%;\n  overflow: hidden;\n  -ms-scroll-limit-x-max: 0px;\n  touch-action: manipulation;\n}\n.win-pivot .win-pivot-navbutton {\n  touch-action: manipulation;\n  position: absolute;\n  width: 20px;\n  height: 36px;\n  padding: 0px;\n  margin: 0px;\n  top: 10px;\n  min-width: 0px;\n  border-width: 0px;\n  cursor: pointer;\n  opacity: 0;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-pivot .win-pivot-headers.win-pivot-shownavbuttons .win-pivot-navbutton {\n  opacity: 1;\n}\n.win-pivot .win-pivot-headers .win-pivot-navbutton-prev:before {\n  content: \"\\E096\";\n}\n.win-pivot .win-pivot-headers .win-pivot-navbutton-next:before {\n  content: \"\\E09B\";\n}\n.win-pivot .win-pivot-title {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  font-family: \"Segoe UI\", sans-serif, \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 15px;\n  font-weight: bold;\n  white-space: nowrap;\n  margin: 14px 0 13px 24px;\n}\n.win-pivot .win-pivot-title:lang(ar),\n.win-pivot .win-pivot-title:lang(dv),\n.win-pivot .win-pivot-title:lang(fa),\n.win-pivot .win-pivot-title:lang(he),\n.win-pivot .win-pivot-title:lang(ku-Arab),\n.win-pivot .win-pivot-title:lang(pa-Arab),\n.win-pivot .win-pivot-title:lang(prs),\n.win-pivot .win-pivot-title:lang(ps),\n.win-pivot .win-pivot-title:lang(sd-Arab),\n.win-pivot .win-pivot-title:lang(syr),\n.win-pivot .win-pivot-title:lang(ug),\n.win-pivot .win-pivot-title:lang(ur),\n.win-pivot .win-pivot-title:lang(qps-plocm) {\n  margin: 14px 24px 13px 0;\n}\n.win-pivot > .win-pivot-item {\n  /*\n        Hide the pivot items defined declaratively until we reparent them to ensure correct\n        measuring and to avoid showing unprocessed content in the wrong location.\n        */\n  display: none;\n}\n.win-pivot .win-pivot-header-area {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n}\n.win-pivot .win-pivot-header-leftcustom,\n.win-pivot .win-pivot-header-rightcustom {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  margin-top: 13px;\n}\n.win-pivot .win-pivot-header-items {\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  overflow-x: hidden;\n  padding: 1px;\n}\n.win-pivot .win-pivot-headers {\n  white-space: nowrap;\n  position: relative;\n  overflow-y: visible;\n  height: 48px;\n  touch-action: none;\n  -ms-touch-action: none;\n  outline: 0;\n}\n.win-pivot .win-pivot-headers.win-keyboard:focus {\n  outline-style: dotted;\n  outline-width: 1px;\n}\n.win-pivot .win-pivot-header,\n.win-pivot .win-pivot-header.win-pivot-header:hover:active {\n  touch-action: manipulation;\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 1.167;\n  display: inline-block;\n  transition: opacity linear 167ms;\n  -webkit-transition: opacity linear 167ms;\n  overflow: hidden;\n  height: 30px;\n  border: 0;\n  padding: 0;\n  outline: 0;\n  margin: 12px 12px 0px 12px;\n  min-height: 0;\n  min-width: 0;\n}\n.win-pivot.win-pivot-locked .win-pivot-header {\n  opacity: 0;\n  visibility: hidden;\n}\n.win-pivot .win-pivot-header.win-pivot-header-selected,\n.win-pivot.win-pivot-locked .win-pivot-header.win-pivot-header-selected {\n  opacity: 1.0;\n  visibility: inherit;\n}\n.win-pivot .win-pivot-viewport {\n  /* Overlap the headers but not the title */\n  height: 100%;\n  overflow-x: auto;\n  overflow-y: hidden;\n  -ms-scroll-snap-type: mandatory;\n  -ms-scroll-snap-points-x: snapInterval(0%, 100%);\n  -ms-overflow-style: none;\n  /* The following 3 styles take advantage of a Trident bug to make the viewport pannable on the header track. The viewport is extended over the\n            header track space, and position: relative allows interacting with it as if the viewport was drawn over the header track.\n        */\n  position: relative;\n  padding-top: 48px;\n  margin-top: -48px;\n}\n.win-pivot.win-pivot-mouse .win-pivot-viewport {\n  padding-top: 0px;\n  margin-top: 0px;\n}\n.win-pivot.win-pivot-locked .win-pivot-viewport {\n  overflow: hidden;\n}\n.win-pivot .win-pivot-surface {\n  /* 49 before, 1 current, 50 after */\n  width: 10000%;\n  height: 100%;\n  position: relative;\n}\nhtml.win-hoverable .win-pivot button.win-pivot-header:hover {\n  background-color: transparent;\n  border: 0;\n  padding: 0;\n  letter-spacing: 0px;\n  margin: 12px 12px 0px 12px;\n  min-height: 0;\n  min-width: 0;\n}\nhtml.win-hoverable .win-pivot .win-pivot-navbutton:hover {\n  margin: 0px;\n  padding: 0px;\n  border-width: 0px;\n  cursor: pointer;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n/*\n    PivotItem\n*/\n.win-pivot-item {\n  position: absolute;\n  top: 0px;\n  bottom: 0;\n  /* Since the surface is 100x in width, 1% here means the size of the viewport. */\n  width: 1%;\n}\n.win-pivot-item .win-pivot-item-content {\n  height: 100%;\n  overflow-y: auto;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n  padding: 0px 24px;\n}\n/*\n    Modified styles for when the Pivot is in nosnap mode\n*/\n.win-pivot.win-pivot-nosnap .win-pivot-viewport {\n  padding-top: 0px;\n  margin-top: 0px;\n  overflow: hidden;\n}\n.win-pivot.win-pivot-nosnap .win-pivot-surface {\n  width: 100%;\n  position: static;\n}\n.win-pivot.win-pivot-nosnap .win-pivot-item {\n  width: 100%;\n}\n.win-hub {\n  height: 100%;\n  width: 100%;\n  position: relative;\n}\n.win-hub-progress {\n  position: absolute;\n  top: 10px;\n  width: 100%;\n  z-index: 1;\n}\n.win-hub-viewport {\n  height: 100%;\n  width: 100%;\n  -ms-scroll-snap-type: proximity;\n  -webkit-overflow-scrolling: touch;\n}\n.win-hub-horizontal .win-hub-viewport {\n  overflow-x: auto;\n  overflow-y: hidden;\n  white-space: nowrap;\n}\n.win-hub-vertical .win-hub-viewport {\n  position: relative;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n.win-hub-surface {\n  display: inline-block;\n}\n.win-hub-vertical .win-hub-surface {\n  width: 100%;\n  padding: 0px 12px 8px 12px;\n}\n.win-hub-horizontal .win-hub-surface {\n  height: 100%;\n  padding: 0px 0px 0px 12px;\n}\n.win-hub-section {\n  display: inline-block;\n  padding: 0px 24px 0px 0px;\n  vertical-align: top;\n  white-space: normal;\n}\n.win-hub-horizontal .win-hub-section {\n  height: 100%;\n}\n.win-hub-horizontal .win-hub-section-header {\n  margin-top: 44px;\n}\n.win-hub-vertical .win-hub-section {\n  width: calc(100% - 24px);\n}\n.win-hub-vertical .win-hub-section-header {\n  margin-top: 16px;\n}\n.win-hub-section-header {\n  margin: 4px 0px 9px 0px;\n  height: 28px;\n}\nbutton.win-hub-section-header-tabstop,\nhtml.win-hoverable button.win-hub-section-header-tabstop:hover,\nbutton.win-hub-section-header-tabstop:hover:active {\n  touch-action: manipulation;\n  width: 100%;\n  background-color: transparent;\n  border: 0;\n  min-height: 0;\n  min-width: 0;\n  max-width: 100%;\n  padding: 0;\n}\nbutton.win-hub-section-header-tabstop:focus {\n  outline: none;\n}\nbutton.win-hub-section-header-tabstop:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-hub-section-header-wrapper {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-align: stretch;\n  -webkit-align-items: stretch;\n  align-items: stretch;\n  width: 100%;\n  outline: none;\n}\n.win-hub-section-header-content {\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: left;\n  vertical-align: bottom;\n  padding-top: 1px;\n  overflow: hidden;\n  text-overflow: clip;\n  white-space: nowrap;\n  line-height: 1.5;\n}\n.win-hub-section-header-content:lang(ar),\n.win-hub-section-header-content:lang(dv),\n.win-hub-section-header-content:lang(fa),\n.win-hub-section-header-content:lang(he),\n.win-hub-section-header-content:lang(ku-Arab),\n.win-hub-section-header-content:lang(pa-Arab),\n.win-hub-section-header-content:lang(prs),\n.win-hub-section-header-content:lang(ps),\n.win-hub-section-header-content:lang(sd-Arab),\n.win-hub-section-header-content:lang(syr),\n.win-hub-section-header-content:lang(ug),\n.win-hub-section-header-content:lang(ur),\n.win-hub-section-header-content:lang(qps-plocm) {\n  text-align: right;\n}\n.win-hub-section-header-chevron {\n  display: none;\n}\n.win-hub-section-header-interactive .win-hub-section-header-chevron {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: inline-block;\n  margin-left: 24px;\n  line-height: 1.5;\n  padding-top: 7px;\n  text-align: right;\n  vertical-align: bottom;\n}\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ar),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(dv),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(fa),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(he),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ku-Arab),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(pa-Arab),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(prs),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ps),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(sd-Arab),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(syr),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ug),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ur),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(qps-plocm) {\n  text-align: left;\n  margin-left: 0;\n  margin-right: 24px;\n}\n.win-hub-horizontal .win-hub-section-content {\n  height: calc(100% - 81px);\n}\n.win-hub-vertical .win-hub-section-content {\n  width: 100%;\n}\n@media (-ms-high-contrast) {\n  button.win-hub-section-header-tabstop,\n  html.win-hoverable button.win-hub-section-header-tabstop:hover,\n  button.win-hub-section-header-tabstop:hover:active {\n    background-color: transparent;\n    color: WindowText;\n  }\n  button.win-hub-section-header-tabstop:-ms-keyboard-active {\n    color: WindowText;\n  }\n  html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover,\n  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active {\n    color: -ms-hotlight;\n  }\n  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {\n    color: -ms-hotlight;\n  }\n}\n.win-clickeater {\n  background-color: transparent;\n  width: 110%;\n  height: 110%;\n  left: -5%;\n  top: -5%;\n  position: fixed;\n  touch-action: none;\n  outline: 1px solid Purple;\n  /*Necessary to block passthrough over webviews*/\n  -ms-high-contrast-adjust: none;\n}\n/*\nCommand buttons.\n*/\nbutton.win-command {\n  touch-action: manipulation;\n  background: none;\n  background-clip: border-box;\n  height: auto;\n  padding: 0;\n  margin: 0;\n  border: 1px dotted;\n  /* reserve focus rect */\n  min-width: 40px;\n  min-height: 48px;\n  text-align: center;\n  font-size: 12px;\n  line-height: 16px;\n  font-weight: normal;\n  overflow: visible;\n  /* Commands are lrtb */\n  writing-mode: lr-tb;\n  position: relative;\n  z-index: 0;\n}\nbutton.win-command::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton:lang(ar),\nbutton:lang(dv),\nbutton:lang(fa),\nbutton:lang(he),\nbutton:lang(ku-Arab),\nbutton:lang(pa-Arab),\nbutton:lang(prs),\nbutton:lang(ps),\nbutton:lang(sd-Arab),\nbutton:lang(syr),\nbutton:lang(ug),\nbutton:lang(ur),\nbutton:lang(qps-plocm) {\n  writing-mode: rl-tb;\n}\n/*\nAlways hide the outline, not just when :focus is applied.\nhttps://github.com/winjs/winjs/issues/859\n*/\nbutton.win-command {\n  outline: none;\n}\n/*\nCommand button icons.\n*/\n.win-commandicon {\n  display: block;\n  margin: 11px 21px;\n  /* left/right margin: 22px = 1px focus rect + 21px. Affects margin-top of  button.win-command .win-label */\n  min-width: 0;\n  min-height: 0;\n  padding: 0;\n  /* Normal sizing */\n  width: 24px;\n  height: 24px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  cursor: default;\n  position: relative;\n  outline: none;\n}\n.win-commandimage {\n  /* Default font for glyphs. */\n  font-family: \"Segoe UI Command\", \"Symbols\";\n  letter-spacing: 0;\n  /* Applications provide their own content, like &#xE0D5;. */\n  vertical-align: middle;\n  font-size: 20px;\n  margin: 0;\n  line-height: 24px;\n  /* line-height must match the content box height */\n  background-position: 0 0;\n  background-origin: border-box;\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  background-size: 96px 48px;\n  outline: none;\n}\n.win-commandimage.win-commandglyph {\n  position: absolute;\n  left: 0;\n}\n/*\nOffsets for sprite versions.\n*/\nhtml.win-hoverable button:enabled:hover .win-commandimage,\nbutton:active .win-commandimage {\n  background-position: -24px 0;\n}\nbutton:enabled:hover:active .win-commandimage.win-commandimage {\n  background-position: -48px 0;\n}\nbutton:-ms-keyboard-active .win-commandimage {\n  background-position: -48px 0;\n}\nbutton:disabled .win-commandimage,\nbutton:disabled:active .win-commandimage {\n  background-position: -72px 0;\n}\n/*\nOffsets for sprite versions in selected state.\n*/\nbutton[aria-checked=true] .win-commandimage {\n  background-position: 0 -24px;\n}\nhtml.win-hoverable button[aria-checked=true]:enabled:hover .win-commandimage,\nbutton[aria-checked=true]:active .win-commandimage {\n  background-position: -24px -24px;\n}\nbutton[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n  background-position: -48px -24px;\n}\nbutton[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n  background-position: -48px -24px;\n}\nbutton[aria-checked=true]:disabled .win-commandimage,\nbutton[aria-checked=true]:disabled:active .win-commandimage {\n  background-position: -72px -24px;\n}\n/*\nCommand button labels.\n*/\nbutton.win-command .win-label {\n  font-family: \"Segoe UI\", sans-serif, \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 1.167;\n  position: relative;\n  line-height: 16px;\n  display: block;\n  max-width: 66px;\n  /* 68px button, but allow for 2*1px for focus border on each side */\n  margin-top: -10px;\n  /* 2px = 12px margin-bottom of .win-commandicon  - 10px*/\n  margin-bottom: 6px;\n  padding: 0;\n  overflow: hidden;\n  word-wrap: break-word;\n  word-break: keep-all;\n  outline: none;\n}\n/*\nAppBarCommand separator types.\n*/\nhr.win-command {\n  display: inline-block;\n  padding: 0;\n  margin: 12px 16px;\n  width: 2px;\n  height: 24px;\n  border: 0;\n  vertical-align: top;\n}\n/*\nAppBarCommand content types.\n*/\ndiv.win-command {\n  display: inline-block;\n  min-width: 0;\n  min-height: 0;\n  padding: 0px 31px;\n  border: 1px dotted;\n  /* reserve focus rect */\n  text-align: center;\n  font-size: 12px;\n  line-height: 16px;\n  font-weight: normal;\n  vertical-align: top;\n  /* Content Commands are lrtb */\n  writing-mode: lr-tb;\n  position: relative;\n}\ndiv.win-command:lang(ar),\ndiv.win-command:lang(dv),\ndiv.win-command:lang(fa),\ndiv.win-command:lang(he),\ndiv.win-command:lang(ku-Arab),\ndiv.win-command:lang(pa-Arab),\ndiv.win-command:lang(prs),\ndiv.win-command:lang(ps),\ndiv.win-command:lang(sd-Arab),\ndiv.win-command:lang(syr),\ndiv.win-command:lang(ug),\ndiv.win-command:lang(ur),\ndiv.win-command:lang(qps-plocm) {\n  writing-mode: rl-tb;\n}\ndiv.win-command:focus {\n  outline: none;\n}\n/*\nAppBar\n*/\n.win-navbar {\n  border-width: 0;\n  width: 100%;\n  height: auto;\n  left: 0;\n  position: fixed;\n  position: -ms-device-fixed;\n  min-height: 48px;\n}\n.win-navbar.win-navbar-minimal {\n  min-height: 25px;\n}\n.win-navbar.win-navbar-minimal.win-navbar-closed .win-navbar-invokebutton .win-navbar-ellipsis {\n  top: 5px;\n}\n.win-navbar.win-navbar-closing.win-navbar-minimal > :not(.win-navbar-invokebutton) {\n  opacity: 0;\n}\n.win-navbar.win-menulayout.win-navbar-closing .win-navbar-menu {\n  opacity: 1;\n}\n.win-navbar.win-navbar-closed.win-navbar-minimal > :not(.win-navbar-invokebutton) {\n  display: none !important;\n}\n.win-navbar.win-navbar-closing.win-navbar-minimal .win-navbar-invokebutton,\n.win-navbar.win-navbar-closed.win-navbar-minimal .win-navbar-invokebutton {\n  width: 100%;\n}\n.win-navbar.win-menulayout.win-navbar-opening .win-navbar-invokebutton,\n.win-navbar.win-menulayout.win-navbar-opened .win-navbar-invokebutton,\n.win-navbar.win-menulayout.win-navbar-closing .win-navbar-invokebutton {\n  visibility: hidden;\n}\n.win-navbar.win-menulayout.win-navbar-opening .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,\n.win-navbar.win-menulayout.win-navbar-opened .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,\n.win-navbar.win-menulayout.win-navbar-closing .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton {\n  visibility: visible;\n}\n.win-navbar .win-navbar-invokebutton {\n  touch-action: manipulation;\n  width: 32px;\n  height: 100%;\n  min-height: 25px;\n  position: absolute;\n  right: 0px;\n  margin: 0px;\n  padding: 0px;\n  border: dotted 1px;\n  min-width: 0px;\n  background-clip: border-box;\n  display: none;\n  z-index: 1;\n}\n.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {\n  width: 32px;\n  height: 100%;\n  right: 0px;\n  top: 15px;\n  position: absolute;\n  display: inline-block;\n  font-size: 14px;\n  text-align: center;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis::before {\n  content: \"\\E10C\";\n  position: relative;\n}\n.win-navbar:lang(ar) .win-navbar-invokebutton,\n.win-navbar:lang(dv) .win-navbar-invokebutton,\n.win-navbar:lang(fa) .win-navbar-invokebutton,\n.win-navbar:lang(he) .win-navbar-invokebutton,\n.win-navbar:lang(ku-Arab) .win-navbar-invokebutton,\n.win-navbar:lang(pa-Arab) .win-navbar-invokebutton,\n.win-navbar:lang(prs) .win-navbar-invokebutton,\n.win-navbar:lang(ps) .win-navbar-invokebutton,\n.win-navbar:lang(sd-Arab) .win-navbar-invokebutton,\n.win-navbar:lang(syr) .win-navbar-invokebutton,\n.win-navbar:lang(ug) .win-navbar-invokebutton,\n.win-navbar:lang(ur) .win-navbar-invokebutton,\n.win-navbar:lang(qps-plocm) .win-navbar-invokebutton,\n.win-navbar:lang(ar) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(dv) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(fa) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(he) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ku-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(pa-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(prs) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ps) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(sd-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(syr) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ug) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ur) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(qps-plocm) .win-navbar-invokebutton .win-navbar-ellipsis {\n  right: auto;\n  left: 0px;\n}\n.win-navbar.win-navbar-minimal .win-navbar-invokebutton,\n.win-navbar.win-navbar-compact .win-navbar-invokebutton {\n  display: block;\n}\n/*\nAppBar commands layout\n*/\n.win-commandlayout {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: none;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandlayout .win-primarygroup {\n  -ms-flex-order: 2;\n  flex-order: 2;\n  -webkit-order: 2;\n  order: 2;\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: end;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandlayout .win-secondarygroup {\n  -ms-flex-order: 1;\n  flex-order: 1;\n  -webkit-order: 1;\n  order: 1;\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  -webkit-justify-content: flex-start;\n  justify-content: flex-start;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandlayout .win-command {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n}\n.win-commandlayout.win-navbar-opening,\n.win-commandlayout.win-navbar-opened,\n.win-commandlayout.win-navbar-closing {\n  min-height: 62px;\n}\n.win-commandlayout.win-navbar-opening.win-navbar-compact,\n.win-commandlayout.win-navbar-opened.win-navbar-compact,\n.win-commandlayout.win-navbar-closing.win-navbar-compact {\n  min-height: 48px;\n}\n.win-commandlayout.win-navbar-minimal,\n.win-commandlayout.win-navbar-compact {\n  padding-right: 32px;\n  width: calc(100% - 32px);\n}\n.win-commandlayout.win-navbar-compact button.win-command .win-label {\n  display: none;\n}\n.win-commandlayout.win-navbar-compact.win-navbar-closing button.win-command .win-label {\n  display: block;\n  visibility: hidden;\n}\n.win-commandlayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,\n.win-commandlayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {\n  display: block;\n  visibility: visible;\n}\n/* CommandsLayout RTL */\n.win-commandlayout:lang(ar).win-navbar-minimal,\n.win-commandlayout:lang(dv).win-navbar-minimal,\n.win-commandlayout:lang(fa).win-navbar-minimal,\n.win-commandlayout:lang(he).win-navbar-minimal,\n.win-commandlayout:lang(ku-Arab).win-navbar-minimal,\n.win-commandlayout:lang(pa-Arab).win-navbar-minimal,\n.win-commandlayout:lang(prs).win-navbar-minimal,\n.win-commandlayout:lang(ps).win-navbar-minimal,\n.win-commandlayout:lang(sd-Arab).win-navbar-minimal,\n.win-commandlayout:lang(syr).win-navbar-minimal,\n.win-commandlayout:lang(ug).win-navbar-minimal,\n.win-commandlayout:lang(ur).win-navbar-minimal,\n.win-commandlayout:lang(qps-plocm).win-navbar-minimal,\n.win-commandlayout:lang(ar).win-navbar-compact,\n.win-commandlayout:lang(dv).win-navbar-compact,\n.win-commandlayout:lang(fa).win-navbar-compact,\n.win-commandlayout:lang(he).win-navbar-compact,\n.win-commandlayout:lang(ku-Arab).win-navbar-compact,\n.win-commandlayout:lang(pa-Arab).win-navbar-compact,\n.win-commandlayout:lang(prs).win-navbar-compact,\n.win-commandlayout:lang(ps).win-navbar-compact,\n.win-commandlayout:lang(sd-Arab).win-navbar-compact,\n.win-commandlayout:lang(syr).win-navbar-compact,\n.win-commandlayout:lang(ug).win-navbar-compact,\n.win-commandlayout:lang(ur).win-navbar-compact,\n.win-commandlayout:lang(qps-plocm).win-navbar-compact {\n  padding-right: 0px;\n  padding-left: 32px;\n}\n/*\nAppBar menu layout\n*/\n.win-menulayout .win-navbar-menu {\n  position: absolute;\n  right: 0;\n  top: 0;\n  overflow: hidden;\n}\n.win-menulayout .win-navbar-menu:lang(ar),\n.win-menulayout .win-navbar-menu:lang(dv),\n.win-menulayout .win-navbar-menu:lang(fa),\n.win-menulayout .win-navbar-menu:lang(he),\n.win-menulayout .win-navbar-menu:lang(ku-Arab),\n.win-menulayout .win-navbar-menu:lang(pa-Arab),\n.win-menulayout .win-navbar-menu:lang(prs),\n.win-menulayout .win-navbar-menu:lang(ps),\n.win-menulayout .win-navbar-menu:lang(sd-Arab),\n.win-menulayout .win-navbar-menu:lang(syr),\n.win-menulayout .win-navbar-menu:lang(ug),\n.win-menulayout .win-navbar-menu:lang(ur),\n.win-menulayout .win-navbar-menu:lang(qps-plocm) {\n  left: 0;\n  right: auto;\n}\n.win-menulayout.win-bottom .win-navbar-menu {\n  overflow: visible;\n}\n.win-menulayout .win-toolbar {\n  max-width: 100vw;\n}\n.win-menulayout.win-navbar-compact button.win-command .win-label {\n  display: none;\n  visibility: hidden;\n}\n.win-menulayout.win-navbar-compact.win-navbar-closing button.win-command .win-label,\n.win-menulayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {\n  display: block;\n  visibility: visible;\n}\n.win-menulayout.win-navbar-compact.win-navbar-opened button.win-command .win-label {\n  display: block;\n  visibility: visible;\n}\n.win-menulayout.win-navbar-compact.win-navbar-closed {\n  overflow: hidden;\n}\n.win-menulayout.win-navbar-compact.win-navbar-closed .win-toolbar-overflowarea {\n  visibility: hidden;\n}\n/*\nHigh contrast AppBar needs a border\n*/\n@media (-ms-high-contrast) {\n  /*\n    AppBar Borders\n    */\n  .win-navbar {\n    border: solid 2px;\n  }\n  .win-navbar.win-top {\n    border-top: none;\n    border-left: none;\n    border-right: none;\n  }\n  .win-navbar.win-bottom {\n    border-bottom: none;\n    border-left: none;\n    border-right: none;\n  }\n  .win-navbar.win-top button.win-command,\n  .win-navbar.win-top div.win-command {\n    padding-bottom: 7px;\n    /* 7px - 2px smaller to account for the high-constrast appbar border */\n  }\n  .win-navbar.win-bottom button.win-command,\n  .win-navbar.win-bottom div.win-command {\n    padding-top: 7px;\n    /* 7px - 2px smaller to account for the high-constrast appbar border */\n  }\n  .win-navbar.win-top hr.win-command {\n    margin-bottom: 28px;\n  }\n  .win-navbar.win-bottom hr.win-command {\n    margin-top: 8px;\n  }\n  .win-commandlayout.win-navbar-opening,\n  .win-commandlayout.win-navbar-opened,\n  .win-commandlayout.win-navbar-closing {\n    min-height: 62px;\n  }\n}\n/*\nFlyout control.\n*/\n.win-flyout {\n  position: fixed;\n  position: -ms-device-fixed;\n  padding: 12px;\n  border-style: solid;\n  border-width: 1px;\n  margin: 4px;\n  min-width: 70px;\n  /* 96px - 2px border - 24px padding */\n  max-width: 430px;\n  /* 456px - 2px border - 24px padding */\n  min-height: 16px;\n  /* 44px - 2px border - 24px padding */\n  max-height: 730px;\n  /* 758px - 2px border - 24px padding */\n  width: auto;\n  height: auto;\n  word-wrap: break-word;\n  overflow: auto;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-flyout.win-leftalign {\n  margin-left: 0;\n}\n.win-flyout.win-rightalign {\n  margin-right: 0;\n}\n.win-flyout.win-scrolls {\n  overflow: auto;\n}\n@media (max-width: 464px) {\n  .win-flyout {\n    max-width: calc(100% - 34px);\n    /* 100% - 8px margin - 2px border - 24px padding */\n  }\n}\n/*\nMenu control.\n*/\n.win-menu {\n  padding: 0;\n  line-height: 33px;\n  text-align: left;\n  /* Set explicitly in case our parent has different alignment, like appbar overflow. */\n  min-height: 42px;\n  /* 44px - 2px border */\n  max-height: calc(100% - 26px);\n  min-width: 134px;\n  /* 136px - 2px border */\n  max-width: 454px;\n  /* 456px - 2px border */\n}\n/*\nMenu commands.\n*/\n.win-menu button.win-command {\n  display: block;\n  margin-left: 0;\n  margin-right: 0;\n  text-align: left;\n  width: 100%;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-menu button.win-command:focus {\n  outline: none;\n}\n.win-menu button.win-command .win-menucommand-liner {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: none;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  width: 100%;\n  position: relative;\n}\n.win-menu button.win-command .win-menucommand-liner .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner .win-flyouticon {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: none;\n  visibility: hidden;\n  font-size: 16px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-menu button.win-command .win-menucommand-liner .win-toggleicon {\n  margin-left: 12px;\n}\n.win-menu button.win-command .win-menucommand-liner .win-toggleicon::before {\n  content: \"\\E0E7\";\n}\n.win-menu button.win-command .win-menucommand-liner .win-flyouticon {\n  margin-left: 12px;\n  margin-right: 16px;\n}\n.win-menu button.win-command .win-menucommand-liner .win-flyouticon::before {\n  content: \"\\E26B\";\n}\n.win-menu button.win-command .win-menucommand-liner .win-label {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  font-size: 15px;\n  line-height: inherit;\n  min-width: 112px;\n  max-width: none;\n  white-space: nowrap;\n  text-overflow: clip;\n  margin: 0px;\n  padding: 0px 12px;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar),\n.win-menu button.win-command .win-menucommand-liner:lang(dv),\n.win-menu button.win-command .win-menucommand-liner:lang(fa),\n.win-menu button.win-command .win-menucommand-liner:lang(he),\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab),\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab),\n.win-menu button.win-command .win-menucommand-liner:lang(prs),\n.win-menu button.win-command .win-menucommand-liner:lang(ps),\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab),\n.win-menu button.win-command .win-menucommand-liner:lang(syr),\n.win-menu button.win-command .win-menucommand-liner:lang(ug),\n.win-menu button.win-command .win-menucommand-liner:lang(ur),\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) {\n  text-align: right;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(he) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-toggleicon {\n  margin-left: 0px;\n  margin-right: 12px;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon {\n  margin-left: 16px;\n  margin-right: 12px;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon::before {\n  content: \"\\E26C\";\n}\n.win-menu.win-menu-mousespacing button.win-command {\n  padding-top: 5px;\n  padding-bottom: 7px;\n  min-height: 32px;\n}\n.win-menu.win-menu-touchspacing button.win-command {\n  padding-top: 11px;\n  padding-bottom: 13px;\n  min-height: 44px;\n}\n.win-menu hr.win-command {\n  display: block;\n  height: 1px;\n  width: auto;\n  border: 0;\n  padding: 0;\n  margin: 9px 20px 10px 20px;\n}\n/*\nMenu toggle and flyout commands.\n*/\n.win-menu-containstogglecommand button.win-command .win-menucommand-liner .win-toggleicon,\n.win-menu-containsflyoutcommand button.win-command .win-menucommand-liner .win-flyouticon {\n  display: inline-block;\n}\n.win-menu-containstogglecommand button.win-command-toggle[aria-checked=true] .win-menucommand-liner .win-toggleicon,\n.win-menu-containsflyoutcommand button.win-command-flyout .win-menucommand-liner .win-flyouticon {\n  visibility: visible;\n}\n@media (max-width: 464px) {\n  .win-menu {\n    max-width: calc(100% - 10px);\n    /* 100% - 8px margin - 2px border */\n  }\n}\n/*\nGrippers in touch selection do not dissapear when focus moves to an element outside of the selection range and they are always drawn on a layer above all HTML elemements.\nWhen an _Overlay derived control such as AppBar/Flyout/Menu/SettingsFlyout is invoked and steals focus, if that _Overlay is laid out on top of the elements in the touch selection,\nthe grippers can still be seen over the _Overlay and its contents. However, all grippers any where in the document will be hidden whenever the current active element has or inherits\nthe style \"-ms-touch-select: none;\"\n*/\n.win-overlay {\n  -ms-touch-select: none;\n}\n/* For input elements we filter type using the :not selector to capture any unrecognized user specified types which would just default to the form and function of a textbox*/\n.win-overlay input:not([type=\"file\"]),\n.win-overlay input:not([type=\"radio\"]),\n.win-overlay input:not([type=\"checkbox\"]),\n.win-overlay input:not([type=\"button\"]),\n.win-overlay input:not([type=\"range\"]),\n.win-overlay input:not([type=\"image\"]),\n.win-overlay input:not([type=\"reset\"]),\n.win-overlay input:not([type=\"hidden\"]),\n.win-overlay input:not([type=\"submit\"]),\n.win-overlay textarea,\n.win-overlay [contenteditable=true] {\n  -ms-touch-select: grippers;\n}\n/* Singleton element maintained by _Overlay, used for getting accurate floating point measurements of the total size of the visual viewport.\n    Floating point is necesary in high DPI resolutions. */\n.win-visualviewport-space {\n  position: fixed;\n  position: -ms-device-fixed;\n  height: 100%;\n  width: 100%;\n  visibility: hidden;\n}\n/*\nSettings Pane\n*/\n.win-settingsflyout {\n  border-left: 1px solid;\n  position: fixed;\n  top: 0;\n  right: 0;\n  height: 100%;\n  width: 319px;\n  /* 320px - border (1px) */\n  /* Settings back button is slightly smaller. */\n}\n.win-settingsflyout:lang(ar),\n.win-settingsflyout:lang(dv),\n.win-settingsflyout:lang(fa),\n.win-settingsflyout:lang(he),\n.win-settingsflyout:lang(ku-Arab),\n.win-settingsflyout:lang(pa-Arab),\n.win-settingsflyout:lang(prs),\n.win-settingsflyout:lang(ps),\n.win-settingsflyout:lang(sd-Arab),\n.win-settingsflyout:lang(syr),\n.win-settingsflyout:lang(ug),\n.win-settingsflyout:lang(ur),\n.win-settingsflyout:lang(qps-plocm) {\n  border-left: none;\n  border-right: 1px solid;\n}\n.win-settingsflyout.win-wide {\n  /* .win-wide is deprecated in Windows 8.1 */\n  width: 645px;\n  /* 646px - border (1px) */\n}\n.win-settingsflyout .win-backbutton,\n.win-settingsflyout .win-back {\n  width: 32px;\n  height: 32px;\n  font-size: 20px;\n  line-height: 32px;\n}\n.win-settingsflyout .win-header {\n  padding-top: 6px;\n  padding-bottom: 10px;\n  padding-left: 52px;\n  /* 40px for the backbutton */\n  padding-right: 12px;\n  height: 32px;\n  position: relative;\n}\n.win-settingsflyout .win-header .win-label {\n  display: inline-block;\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 32px;\n  white-space: nowrap;\n}\n.win-settingsflyout .win-header .win-backbutton,\n.win-settingsflyout .win-header .win-navigation-backbutton {\n  position: absolute;\n  left: 12px;\n}\n.win-settingsflyout .win-content {\n  overflow: auto;\n  padding: 0px 12px;\n}\n.win-settingsflyout .win-content .win-label {\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n}\n.win-settingsflyout .win-content .win-settings-section {\n  padding-bottom: 39px;\n  margin: 0;\n  padding-top: 0;\n  padding-bottom: 20px;\n}\n.win-settingsflyout .win-content .win-settings-section p {\n  margin: 0;\n  padding-top: 0;\n  padding-bottom: 25px;\n}\n.win-settingsflyout .win-content .win-settings-section a {\n  margin: 0;\n  padding-top: 0;\n  padding-bottom: 25px;\n  display: inline-block;\n}\n.win-settingsflyout .win-content .win-settings-section label {\n  display: block;\n  padding-bottom: 7px;\n}\n.win-settingsflyout .win-content .win-settings-section button,\n.win-settingsflyout .win-content .win-settings-section select,\n.win-settingsflyout .win-content .win-settings-section input[type=button],\n.win-settingsflyout .win-content .win-settings-section input[type=text] {\n  margin-bottom: 25px;\n  margin-left: 0;\n  margin-right: 20px;\n}\n.win-settingsflyout .win-content .win-settings-section button:lang(ar),\n.win-settingsflyout .win-content .win-settings-section select:lang(ar),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ar),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ar),\n.win-settingsflyout .win-content .win-settings-section button:lang(dv),\n.win-settingsflyout .win-content .win-settings-section select:lang(dv),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(dv),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(dv),\n.win-settingsflyout .win-content .win-settings-section button:lang(fa),\n.win-settingsflyout .win-content .win-settings-section select:lang(fa),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(fa),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(fa),\n.win-settingsflyout .win-content .win-settings-section button:lang(he),\n.win-settingsflyout .win-content .win-settings-section select:lang(he),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(he),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(he),\n.win-settingsflyout .win-content .win-settings-section button:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section select:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section button:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section select:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section button:lang(prs),\n.win-settingsflyout .win-content .win-settings-section select:lang(prs),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(prs),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(prs),\n.win-settingsflyout .win-content .win-settings-section button:lang(ps),\n.win-settingsflyout .win-content .win-settings-section select:lang(ps),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ps),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ps),\n.win-settingsflyout .win-content .win-settings-section button:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section select:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section button:lang(syr),\n.win-settingsflyout .win-content .win-settings-section select:lang(syr),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(syr),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(syr),\n.win-settingsflyout .win-content .win-settings-section button:lang(ug),\n.win-settingsflyout .win-content .win-settings-section select:lang(ug),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ug),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ug),\n.win-settingsflyout .win-content .win-settings-section button:lang(ur),\n.win-settingsflyout .win-content .win-settings-section select:lang(ur),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ur),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ur),\n.win-settingsflyout .win-content .win-settings-section button:lang(qps-plocm),\n.win-settingsflyout .win-content .win-settings-section select:lang(qps-plocm),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(qps-plocm),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(qps-plocm) {\n  margin-bottom: 25px;\n  margin-left: 20px;\n  margin-right: 0;\n}\n.win-settingsflyout .win-content .win-settings-section input[type=radio] {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-bottom: 15px;\n}\n/*Flyout control animations*/\n@keyframes WinJS-showFlyoutTop {\n  from {\n    transform: translateY(50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showFlyoutBottom {\n  from {\n    transform: translateY(-50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showFlyoutLeft {\n  from {\n    transform: translateX(50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showFlyoutRight {\n  from {\n    transform: translateX(-50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutTop {\n  from {\n    -webkit-transform: translateY(50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutBottom {\n  from {\n    -webkit-transform: translateY(-50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutLeft {\n  from {\n    -webkit-transform: translateX(50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutRight {\n  from {\n    -webkit-transform: translateX(-50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n.win-commandingsurface {\n  outline: none;\n  min-width: 32px;\n  /* enough to fit the overflowbutton */\n  position: relative;\n}\n.win-commandingsurface.win-commandingsurface-overflowbottom .win-commandingsurface-overflowareacontainer {\n  top: 100%;\n}\n.win-commandingsurface.win-commandingsurface-overflowtop .win-commandingsurface-overflowareacontainer {\n  bottom: 100%;\n}\n.win-commandingsurface .win-commandingsurface-actionarea {\n  min-height: 24px;\n  vertical-align: top;\n  overflow: hidden;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-pack: end;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-spacer {\n  visibility: hidden;\n  min-height: 48px;\n  /* height of a primary command with no label */\n  width: 0px;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-command,\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {\n  touch-action: manipulation;\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {\n  width: 32px;\n  /* 30px + 2px border */\n  margin: 0px;\n  padding: 0px;\n  border-width: 1px;\n  border-style: dotted;\n  min-width: 0px;\n  min-height: 0px;\n  outline: none;\n  -ms-flex-item-align: stretch;\n  -webkit-align-self: stretch;\n  align-self: stretch;\n  box-sizing: border-box;\n  background-clip: border-box;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis {\n  font-size: 16px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis::before {\n  content: \"\\E10C\";\n}\n.win-commandingsurface.win-commandingsurface-empty .win-commandingsurface-overflowbutton {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-actionarea {\n  height: auto;\n}\n.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowarea,\n.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowareacontainer {\n  display: block;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayfull .win-commandingsurface-actionarea {\n  height: auto;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea {\n  height: 48px;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea .win-command .win-label {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea {\n  height: 24px;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-command,\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-commandingsurface-spacer {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaynone {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowarea,\n.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowareacontainer {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-empty .win-commandingsurface-overflowbutton {\n  display: none;\n}\n.win-commandingsurface .win-commandingsurface-overflowareacontainer {\n  position: absolute;\n  overflow: hidden;\n  right: 0;\n  left: auto;\n}\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ar),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(dv),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(fa),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(he),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ku-Arab),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(pa-Arab),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(prs),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ps),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(sd-Arab),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(syr),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ug),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ur),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(qps-plocm) {\n  left: 0;\n  right: auto;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea,\n.win-commandingsurface .win-commandingsurface-overflowareacontainer {\n  min-width: 160px;\n  min-height: 0;\n  max-height: 50vh;\n  padding: 0;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea.win-menu {\n  max-width: 480px;\n  /* override max-width styles from WinJS.UI.Menu */\n}\n.win-commandingsurface .win-commandingsurface-overflowarea button.win-command {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  min-height: 44px;\n  border: 1px dotted transparent;\n  padding: 10px 11px 12px 11px;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n  white-space: nowrap;\n  overflow: hidden;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea hr.win-command {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  height: 2px;\n  margin: 6px 12px 4px 12px;\n}\n.win-commandingsurface .win-commandingsurface-actionareacontainer {\n  overflow: hidden;\n}\n.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaycompact .win-command .win-label,\n.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplayminimal .win-command,\n.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaynone .win-command {\n  opacity: 0;\n}\n@media (max-width: 480px) {\n  .win-commandingsurface .win-commandingsurface-overflowarea.win-menu {\n    width: 100vw;\n  }\n}\n.win-toolbar {\n  min-width: 32px;\n  /* enough to fit the overflowbutton */\n}\n.win-toolbar.win-toolbar-opened {\n  position: fixed;\n}\n.win-autosuggestbox {\n  white-space: normal;\n  position: relative;\n  width: 266px;\n  min-width: 265px;\n  min-height: 28px;\n}\n.win-autosuggestbox-flyout {\n  position: absolute;\n  top: 100%;\n  width: 100%;\n  z-index: 100;\n  max-height: 374px;\n  min-height: 44px;\n  overflow: auto;\n  -ms-scroll-chaining: none;\n  touch-action: none;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-autosuggestbox-flyout-above {\n  bottom: 100%;\n  top: auto;\n}\n.win-autosuggestbox-flyout-above .win-repeater {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column-reverse;\n  -webkit-flex-direction: column-reverse;\n  flex-direction: column-reverse;\n}\n.win-autosuggestbox .win-autosuggestbox-input {\n  -ms-ime-align: after;\n  margin: 0;\n  width: 100%;\n}\n.win-autosuggestbox-suggestion-selected {\n  outline-style: dotted;\n  outline-width: 1px;\n}\n.win-autosuggestbox-suggestion-result {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  padding: 0 18px;\n  height: 60px;\n  font-size: 11pt;\n  outline: none;\n}\n.win-autosuggestbox-suggestion-result div {\n  line-height: 20px;\n  white-space: nowrap;\n  overflow: hidden;\n}\n.win-autosuggestbox-suggestion-result-text {\n  padding-top: 9px;\n  padding-bottom: 11px;\n  height: 60px;\n  width: 179px;\n  white-space: nowrap;\n  overflow: hidden;\n  line-height: 20px;\n}\n.win-autosuggestbox-suggestion-result-detailed-text {\n  display: inline-block;\n  overflow: hidden;\n  line-height: 22px;\n  /* Some characters get clipped if line height is < 22px. Work around by setting -2 margin. */\n  margin-top: -1px;\n  width: 100%;\n}\n.win-autosuggestbox-suggestion-result img {\n  width: 40px;\n  height: 40px;\n  margin-left: 0;\n  padding-right: 10px;\n  padding-top: 10px;\n  padding-bottom: 10px;\n}\n.win-autosuggestbox-suggestion-result img:lang(ar),\n.win-autosuggestbox-suggestion-result img:lang(dv),\n.win-autosuggestbox-suggestion-result img:lang(fa),\n.win-autosuggestbox-suggestion-result img:lang(he),\n.win-autosuggestbox-suggestion-result img:lang(ku-Arab),\n.win-autosuggestbox-suggestion-result img:lang(pa-Arab),\n.win-autosuggestbox-suggestion-result img:lang(prs),\n.win-autosuggestbox-suggestion-result img:lang(ps),\n.win-autosuggestbox-suggestion-result img:lang(sd-Arab),\n.win-autosuggestbox-suggestion-result img:lang(syr),\n.win-autosuggestbox-suggestion-result img:lang(ug),\n.win-autosuggestbox-suggestion-result img:lang(ur),\n.win-autosuggestbox-suggestion-result img:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: auto;\n  padding-left: 10px;\n  padding-right: 0;\n}\n.win-autosuggestbox-suggestion-query {\n  height: 20px;\n  padding: 11px 0px 13px 12px;\n  outline: none;\n  white-space: nowrap;\n  overflow: hidden;\n  line-height: 20px;\n}\n.win-autosuggestbox-suggestion-separator {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  padding: 0 18px;\n  height: 40px;\n  font-size: 11pt;\n}\n.win-autosuggestbox-suggestion-separator hr {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  margin-top: 18px;\n  border-style: solid;\n  border-width: 1px 0px 0px 0px;\n}\n.win-autosuggestbox-suggestion-separator hr:lang(ar),\n.win-autosuggestbox-suggestion-separator hr:lang(dv),\n.win-autosuggestbox-suggestion-separator hr:lang(fa),\n.win-autosuggestbox-suggestion-separator hr:lang(he),\n.win-autosuggestbox-suggestion-separator hr:lang(ku-Arab),\n.win-autosuggestbox-suggestion-separator hr:lang(pa-Arab),\n.win-autosuggestbox-suggestion-separator hr:lang(prs),\n.win-autosuggestbox-suggestion-separator hr:lang(ps),\n.win-autosuggestbox-suggestion-separator hr:lang(sd-Arab),\n.win-autosuggestbox-suggestion-separator hr:lang(syr),\n.win-autosuggestbox-suggestion-separator hr:lang(ug),\n.win-autosuggestbox-suggestion-separator hr:lang(ur),\n.win-autosuggestbox-suggestion-separator hr:lang(qps-plocm) {\n  margin-right: 10px;\n  margin-left: auto;\n}\n.win-autosuggestbox-suggestion-separator div {\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  padding-top: 9px;\n  padding-bottom: 11px;\n  line-height: 20px;\n  margin-right: 10px;\n}\n.win-autosuggestbox-suggestion-separator div:lang(ar),\n.win-autosuggestbox-suggestion-separator div:lang(dv),\n.win-autosuggestbox-suggestion-separator div:lang(fa),\n.win-autosuggestbox-suggestion-separator div:lang(he),\n.win-autosuggestbox-suggestion-separator div:lang(ku-Arab),\n.win-autosuggestbox-suggestion-separator div:lang(pa-Arab),\n.win-autosuggestbox-suggestion-separator div:lang(prs),\n.win-autosuggestbox-suggestion-separator div:lang(ps),\n.win-autosuggestbox-suggestion-separator div:lang(sd-Arab),\n.win-autosuggestbox-suggestion-separator div:lang(syr),\n.win-autosuggestbox-suggestion-separator div:lang(ug),\n.win-autosuggestbox-suggestion-separator div:lang(ur),\n.win-autosuggestbox-suggestion-separator div:lang(qps-plocm) {\n  margin-left: 10px;\n  margin-right: auto;\n}\n/*\nASB control animations\n*/\n@keyframes WinJS-flyoutBelowASB-showPopup {\n  from {\n    transform: translateY(0px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-flyoutAboveASB-showPopup {\n  from {\n    transform: translateY(0px);\n  }\n  to {\n    transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-flyoutBelowASB-showPopup {\n  from {\n    -webkit-transform: translateY(0px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-flyoutAboveASB-showPopup {\n  from {\n    -webkit-transform: translateY(0px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@media (-ms-high-contrast) {\n  .win-autosuggestbox {\n    border-color: ButtonText;\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  .win-autosuggestbox-disabled {\n    background-color: ButtonFace;\n    border-color: GrayText;\n  }\n  .win-autosuggestbox-disabled input[disabled] {\n    background-color: ButtonFace;\n    color: GrayText;\n    border-color: GrayText;\n  }\n  .win-autosuggestbox-disabled div {\n    color: GrayText;\n    background-color: ButtonFace;\n  }\n  .win-autosuggestbox:-ms-input-placeholder,\n  .win-autosuggestbox::-webkit-input-placeholder,\n  .win-autosuggestbox::-moz-input-placeholder {\n    color: GrayText;\n  }\n  .win-autosuggestbox-flyout {\n    border-color: ButtonText;\n    background-color: ButtonFace;\n  }\n  .win-autosuggestbox-flyout-highlighttext {\n    color: ButtonText;\n  }\n  html.win-hoverable .win-autosuggestbox-suggestion-result:hover,\n  html.win-hoverable .win-autosuggestbox-query:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  html.win-hoverable .win-autosuggestbox-suggestion-result:hover .win-autosuggestbox-flyout-highlighttext,\n  html.win-hoverable .win-autosuggestbox-suggestion-query:hover .win-autosuggestbox-flyout-highlighttext {\n    color: HighlightText;\n  }\n  .win-autosuggestbox-suggestion-query,\n  .win-autosuggestbox-suggestion-result {\n    color: ButtonText;\n  }\n  .win-autosuggestbox-suggestion-selected {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-autosuggestbox-suggestion-separator {\n    color: ButtonText;\n  }\n  .win-autosuggestbox-suggestion-separator hr {\n    border-color: ButtonText;\n  }\n  .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {\n    color: HighlightText;\n  }\n}\n/*\nHide clear button in search box control.\n*/\n.win-searchbox input[type=search]::-ms-clear {\n  display: none;\n}\n.win-searchbox input[type=search]::-webkit-search-cancel-button {\n  display: none;\n}\n.win-searchbox-button {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 32px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 15px;\n  border-style: none;\n  height: 100%;\n  text-align: center;\n}\n.win-searchbox-button:lang(ar),\n.win-searchbox-button:lang(dv),\n.win-searchbox-button:lang(fa),\n.win-searchbox-button:lang(he),\n.win-searchbox-button:lang(ku-Arab),\n.win-searchbox-button:lang(pa-Arab),\n.win-searchbox-button:lang(prs),\n.win-searchbox-button:lang(ps),\n.win-searchbox-button:lang(sd-Arab),\n.win-searchbox-button:lang(syr),\n.win-searchbox-button:lang(ug),\n.win-searchbox-button:lang(ur),\n.win-searchbox-button:lang(qps-plocm) {\n  right: auto;\n  left: 0;\n}\n.win-searchbox-button.win-searchbox-button:before {\n  content: \"\\E094\";\n  position: absolute;\n  left: 8px;\n  top: 8px;\n  line-height: 100%;\n}\n@media (-ms-high-contrast) {\n  .win-searchbox-button {\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  html.win-hoverable .win-searchbox-button[disabled=false]:hover {\n    border-color: ButtonText;\n    background-color: HighLight;\n    color: HighLightText;\n  }\n  .win-searchbox-button-input-focus {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  html.win-hoverable .win-searchbox-button-input-focus:hover {\n    border-color: ButtonText;\n    background-color: HighLight;\n    color: HighLightText;\n  }\n  .win-searchbox-button:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n}\n.win-navbar.win-navbar-showing,\n.win-navbar.win-navbar-shown,\n.win-navbar.win-navbar-hiding {\n  min-height: 60px;\n}\n.win-navbar .win-navbar-invokebutton {\n  width: 32px;\n  min-height: 0;\n  height: 24px;\n}\n.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {\n  width: 32px;\n}\n.win-navbar.win-top .win-navbar-invokebutton {\n  bottom: 0;\n}\n.win-navbar.win-top .win-navbar-invokebutton .win-navbar-ellipsis {\n  top: 5px;\n}\n.win-navbar.win-bottom .win-navbar-invokebutton {\n  top: 0;\n}\n.win-navbar.win-bottom .win-navbar-invokebutton .win-navbar-ellipsis {\n  top: 0;\n}\n.win-navbarcontainer {\n  width: 100%;\n  position: relative;\n}\n.win-navbarcontainer-pageindicator-box {\n  position: absolute;\n  width: 100%;\n  text-align: center;\n  pointer-events: none;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box {\n  display: none;\n}\n.win-navbarcontainer-pageindicator {\n  display: inline-block;\n  width: 40px;\n  height: 4px;\n  margin: 4px 2px 16px 2px;\n}\n.win-navbarcontainer-horizontal .win-navbarcontainer-viewport::-webkit-scrollbar {\n  width: 0;\n  height: 0;\n}\n.win-navbarcontainer-horizontal .win-navbarcontainer-viewport {\n  padding: 20px 0;\n  overflow-x: auto;\n  overflow-y: hidden;\n  overflow: -moz-scrollbars-none;\n  -ms-scroll-snap-type: mandatory;\n  -ms-scroll-snap-points-x: snapInterval(0%, 100%);\n  -ms-overflow-style: none;\n  touch-action: pan-x;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-viewport {\n  overflow-x: hidden;\n  overflow-y: auto;\n  max-height: 216px;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n  touch-action: pan-y;\n  -webkit-overflow-scrolling: touch;\n}\n.win-navbarcontainer-horizontal .win-navbarcontainer-surface {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-surface {\n  padding: 12px 0;\n}\n.win-navbarcontainer-navarrow {\n  touch-action: manipulation;\n  position: absolute;\n  z-index: 2;\n  top: 24px;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  height: calc(100% - 48px);\n  width: 20px;\n  font-size: 16px;\n  overflow: hidden;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-navarrow {\n  display: none;\n}\n.win-navbarcontainer-navleft {\n  left: 0;\n  margin-right: 2px;\n}\n.win-navbarcontainer-navleft::before {\n  content: '\\E0E2';\n}\n.win-navbarcontainer-navright {\n  right: 0;\n  margin-left: 2px;\n}\n.win-navbarcontainer-navright::before {\n  content: '\\E0E3';\n}\n/*\n    NavBarCommand\n*/\n.win-navbarcommand {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  touch-action: manipulation;\n}\n.win-navbarcontainer-horizontal .win-navbarcommand {\n  margin: 4px;\n  width: 192px;\n}\n.win-navbarcontainer-vertical .win-navbarcommand {\n  margin: 4px 24px;\n}\n.win-navbarcommand-button {\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  position: relative;\n}\n.win-navbarcommand-button-content {\n  position: relative;\n  height: 48px;\n  padding-left: 16px;\n  padding-right: 16px;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n.win-navbarcommand-button:focus {\n  z-index: 1;\n  outline: none;\n}\n.win-navbarcommand-icon {\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  height: 16px;\n  width: 16px;\n  font-size: 16px;\n  margin-left: 0;\n  margin-right: 16px;\n  margin-top: 14px;\n  /* Center icon vertically */\n  line-height: 1;\n  /* Ensure icon is exactly font-size */\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n}\n.win-navbarcommand-icon:lang(ar),\n.win-navbarcommand-icon:lang(dv),\n.win-navbarcommand-icon:lang(fa),\n.win-navbarcommand-icon:lang(he),\n.win-navbarcommand-icon:lang(ku-Arab),\n.win-navbarcommand-icon:lang(pa-Arab),\n.win-navbarcommand-icon:lang(prs),\n.win-navbarcommand-icon:lang(ps),\n.win-navbarcommand-icon:lang(sd-Arab),\n.win-navbarcommand-icon:lang(syr),\n.win-navbarcommand-icon:lang(ug),\n.win-navbarcommand-icon:lang(ur),\n.win-navbarcommand-icon:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: 16px;\n}\n.win-navbarcommand-label {\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  overflow: hidden;\n  white-space: nowrap;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n  margin-top: 13px;\n  margin-bottom: 15px;\n}\n.win-navbarcommand-splitbutton {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: 48px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 16px;\n  margin-right: 0;\n  margin-left: 2px;\n  position: relative;\n}\n.win-navbarcommand-splitbutton:lang(ar),\n.win-navbarcommand-splitbutton:lang(dv),\n.win-navbarcommand-splitbutton:lang(fa),\n.win-navbarcommand-splitbutton:lang(he),\n.win-navbarcommand-splitbutton:lang(ku-Arab),\n.win-navbarcommand-splitbutton:lang(pa-Arab),\n.win-navbarcommand-splitbutton:lang(prs),\n.win-navbarcommand-splitbutton:lang(ps),\n.win-navbarcommand-splitbutton:lang(sd-Arab),\n.win-navbarcommand-splitbutton:lang(syr),\n.win-navbarcommand-splitbutton:lang(ug),\n.win-navbarcommand-splitbutton:lang(ur),\n.win-navbarcommand-splitbutton:lang(qps-plocm) {\n  margin-left: 0;\n  margin-right: 2px;\n}\n.win-navbarcommand-splitbutton::before {\n  content: '\\E019';\n  pointer-events: none;\n  position: absolute;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  text-align: center;\n  line-height: 46px;\n  border: 1px dotted transparent;\n}\n.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before {\n  content: '\\E018';\n}\n.win-navbarcommand-splitbutton:focus {\n  outline: none;\n}\n@media (-ms-high-contrast) {\n  .win-navbarcontainer-pageindicator {\n    background-color: ButtonFace;\n  }\n  .win-navbarcontainer-pageindicator:after {\n    display: block;\n    border: 1px solid ButtonText;\n    content: \"\";\n    width: calc(100% - 2px);\n    height: calc(100% - 2px);\n  }\n  .win-navbarcontainer-pageindicator-current {\n    background-color: ButtonText;\n  }\n  html.win-hoverable .win-navbarcontainer-pageindicator:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable .win-navbarcontainer-pageindicator-current:hover {\n    background-color: ButtonText;\n  }\n  .win-navbarcontainer-pageindicator:hover:active {\n    background-color: ButtonText;\n  }\n  .win-navbarcontainer-navarrow {\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  .win-navbarcontainer-navarrow:after {\n    position: absolute;\n    top: 0;\n    left: 0;\n    border: 2px solid ButtonText;\n    content: \"\";\n    width: calc(100% - 3px);\n    height: calc(100% - 3px);\n  }\n  html.win-hoverable .win-navbarcontainer-navarrow:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-navbarcontainer-navarrow:hover:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  /*\n        NavBarCommand colors.\n    */\n  .win-navbarcommand-button,\n  .win-navbarcommand-splitbutton {\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  .win-navbarcommand-button:after,\n  .win-navbarcommand-splitbutton:after {\n    position: absolute;\n    top: 0;\n    left: 0;\n    border: 2px solid ButtonText;\n    content: \"\";\n    width: calc(100% - 3px);\n    height: calc(100% - 3px);\n    pointer-events: none;\n  }\n  html.win-hoverable .win-navbarcommand-button:hover,\n  html.win-hoverable .win-navbarcommand-splitbutton:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened,\n  html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover,\n  .win-navbarcommand-button.win-pressed,\n  html.win-hoverable .win-navbarcommand-button.win-pressed:hover,\n  .win-navbarcommand-splitbutton.win-pressed,\n  html.win-hoverable .win-navbarcommand-splitbutton.win-pressed:hover {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n}\n.win-viewbox {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n.win-contentdialog {\n  /* Dialog's positioning and sizing rules:\n      - Horizontal alignment\n        - Always horizontally centered\n      - Vertical alignment\n        - If height of window < @dialogVerticallyCenteredThreshold, dialog is attached to top of window\n        - Otherwise, dialog is vertically centered\n      - Width:\n        - Always stays between @minWidth and @maxWidth\n        - Sizes to width of window\n      - Height:\n        - Always stays between @minHeight and @maxHeight\n        - If window height < @maxHeight and dialog height > 50% of window\n          height, dialog height = window height\n        - Otherwise, dialog height sizes to its content\n     */\n  /* Purpose of this element is to control the dialog body's height based on the height\n       of the window. The dialog body's height should:\n         - Match height of window when dialog body's intrinsic height < 50% of window height.\n           In this case, .win-contentdialog-column0or1 will be in column 1 allowing\n           the dialog's body to fill the height of the window.\n         - Size to content otherwise.\n           In this case, .win-contentdialog-column0or1 will be in column 0 preventing\n           the dialog's body from growing.\n       This element works by moving between flexbox columns as the window's height changes.\n     */\n}\n.win-contentdialog.win-contentdialog-verticalalignment {\n  z-index: 1005;\n  /* Above AppBar and SettingsFlyout. Below Flyout. */\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100vh;\n  overflow: hidden;\n  display: none;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  /* center on flex axis (vertically) */\n  -ms-flex-line-pack: center;\n  -webkit-align-content: center;\n  align-content: center;\n  /* maintain horizontal centering when the flexbox has 2 columns */\n}\n.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-visible {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n.win-contentdialog .win-contentdialog-backgroundoverlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100vh;\n}\n.win-contentdialog .win-contentdialog-dialog {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  z-index: 1;\n  /* Put the dialog's body above the backgroundoverlay */\n  outline-style: solid;\n  outline-width: 1px;\n  box-sizing: border-box;\n  padding: 18px 24px 24px 24px;\n  width: 100vw;\n  min-width: 320px;\n  max-width: 456px;\n  min-height: 184px;\n  max-height: 758px;\n  /* Center horizontally */\n  margin-left: auto;\n  margin-right: auto;\n}\n.win-contentdialog .win-contentdialog-column0or1 {\n  height: 50vh;\n  -ms-flex: 10000 0 auto;\n  -webkit-flex: 10000 0 auto;\n  flex: 10000 0 auto;\n  width: 0;\n}\n@media (min-height: 640px) {\n  .win-contentdialog .win-contentdialog-dialog {\n    -ms-flex: 0 1 auto;\n    -webkit-flex: 0 1 auto;\n    flex: 0 1 auto;\n  }\n  .win-contentdialog .win-contentdialog-column0or1 {\n    display: none;\n  }\n}\n.win-contentdialog .win-contentdialog-scroller {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  overflow: auto;\n}\n.win-contentdialog .win-contentdialog-title {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n}\n.win-contentdialog .win-contentdialog-content {\n  -ms-flex: 1 0 auto;\n  -webkit-flex: 1 0 auto;\n  flex: 1 0 auto;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-contentdialog .win-contentdialog-commands {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  margin-top: 24px;\n  margin-right: -4px;\n  /* Chop off margin on last command */\n}\n.win-contentdialog .win-contentdialog-commandspacer {\n  visibility: hidden;\n}\n.win-contentdialog .win-contentdialog-commands > button {\n  /* Each command should have the same width. Flexbox distributes widths using each\n           item's width and flex-grow as weights. Giving each command a flex-grow of 1\n           and a width of 0 causes each item to have equal weights and thus equal widths.\n         */\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 0;\n  margin-right: 4px;\n  /* 4px of space between each command */\n  white-space: nowrap;\n}\n.win-splitview {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  overflow: hidden;\n}\n.win-splitview.win-splitview-placementtop,\n.win-splitview.win-splitview-placementbottom {\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n.win-splitview.win-splitview-placementtop .win-splitview-panewrapper,\n.win-splitview.win-splitview-placementbottom .win-splitview-panewrapper {\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n.win-splitview .win-splitview-panewrapper {\n  position: relative;\n  z-index: 1;\n  outline: none;\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  overflow: hidden;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n.win-splitview .win-splitview-pane {\n  outline: none;\n}\n.win-splitview .win-splitview-pane,\n.win-splitview .win-splitview-paneplaceholder {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  overflow: hidden;\n}\n.win-splitview .win-splitview-contentwrapper {\n  position: relative;\n  z-index: 0;\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  overflow: hidden;\n}\n.win-splitview .win-splitview-content {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-placementleft .win-splitview-pane,\n.win-splitview.win-splitview-pane-opened.win-splitview-placementright .win-splitview-pane {\n  width: 320px;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-placementtop .win-splitview-pane,\n.win-splitview.win-splitview-pane-opened.win-splitview-placementbottom .win-splitview-pane {\n  height: 60px;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementtop .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementbottom .win-splitview-panewrapper {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: auto;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ar) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(dv) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(fa) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(he) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ku-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(pa-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(prs) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ps) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(sd-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(syr) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ug) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ur) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(qps-plocm) .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: auto;\n  right: 0;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: auto;\n  right: 0;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ar) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(dv) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(fa) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(he) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ku-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(pa-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(prs) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ps) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(sd-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(syr) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ug) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ur) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(qps-plocm) .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: auto;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-closed .win-splitview-paneplaceholder {\n  display: none;\n}\n.win-splitview.win-splitview-pane-closed.win-splitview-placementtop .win-splitview-pane,\n.win-splitview.win-splitview-pane-closed.win-splitview-placementbottom .win-splitview-pane {\n  height: 24px;\n}\n.win-splitview.win-splitview-pane-closed.win-splitview-placementleft .win-splitview-pane,\n.win-splitview.win-splitview-pane-closed.win-splitview-placementright .win-splitview-pane {\n  width: 48px;\n}\n.win-splitview.win-splitview-pane-closed.win-splitview-closeddisplaynone .win-splitview-pane {\n  display: none;\n}\n.win-splitview.win-splitview-openeddisplayinline .win-splitview-paneplaceholder {\n  display: none;\n}\nbutton.win-splitviewpanetoggle {\n  touch-action: manipulation;\n  box-sizing: border-box;\n  height: 48px;\n  width: 48px;\n  min-height: 0;\n  min-width: 0;\n  padding: 0;\n  border: 1px dotted transparent;\n  margin: 0;\n  outline: none;\n  background-color: transparent;\n}\nbutton.win-splitviewpanetoggle:after {\n  font-size: 24px;\n  font-family: 'Segoe MDL2 Assets', 'Symbols';\n  font-weight: 400;\n  line-height: 1.333;\n  content: \"\\E700\";\n}\n.win-appbar {\n  width: 100%;\n  min-width: 32px;\n  /* enough to fit the overflowbutton */\n  position: fixed;\n  position: -ms-device-fixed;\n}\n.win-appbar.win-appbar-top {\n  top: 0;\n}\n.win-appbar.win-appbar-bottom {\n  bottom: 0;\n}\n.win-appbar.win-appbar-closed.win-appbar-closeddisplaynone {\n  display: none;\n}\nbody {\n  background-color: #000000;\n  color: #ffffff;\n}\n.win-ui-dark {\n  background-color: #000000;\n  color: #ffffff;\n}\n.win-ui-light {\n  background-color: #ffffff;\n  color: #000000;\n}\nwinjs-themedetection-tag {\n  opacity: 0;\n}\n::selection {\n  color: #fff;\n}\n.win-link:hover {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-link:active {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-link[disabled] {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-checkbox::-ms-check {\n  color: #ffffff;\n  border-color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-checkbox:indeterminate::-ms-check {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-checkbox:checked::-ms-check {\n  color: #fff;\n  border-color: transparent;\n}\n.win-checkbox:hover::-ms-check {\n  border-color: #ffffff;\n}\n.win-checkbox:hover:indeterminate::-ms-check {\n  color: #ffffff;\n}\n.win-checkbox:active::-ms-check {\n  border-color: transparent;\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-checkbox:indeterminate:active::-ms-check {\n  color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-checkbox:disabled::-ms-check,\n.win-checkbox:indeterminate:disabled::-ms-check {\n  color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.2);\n  background-color: transparent;\n}\n.win-radio::-ms-check {\n  color: rgba(255, 255, 255, 0.8);\n  border-color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-radio:hover::-ms-check {\n  border-color: #ffffff;\n}\n.win-radio:hover::-ms-check {\n  color: #ffffff;\n}\n.win-radio:active::-ms-check {\n  color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-radio:disabled::-ms-check {\n  color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.win-progress-bar:not(:indeterminate),\n.win-progress-ring:not(:indeterminate),\n.win-ring:not(:indeterminate) {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-progress-bar::-webkit-progress-bar,\n.win-progress-ring::-webkit-progress-bar,\n.win-ring::-webkit-progress-bar {\n  background-color: transparent;\n}\n.win-progress-ring,\n.win-ring {\n  background-color: transparent;\n}\n.win-button {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: transparent;\n}\n.win-button:hover {\n  border-color: rgba(255, 255, 255, 0.4);\n}\n.win-button:active {\n  background-color: rgba(255, 255, 255, 0.4);\n}\n.win-button:disabled {\n  color: rgba(255, 255, 255, 0.2);\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: transparent;\n}\n.win-button.win-button-primary {\n  color: #fff;\n}\n.win-dropdown {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.4);\n}\n.win-dropdown::-ms-expand {\n  color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-dropdown:hover {\n  background-color: #2b2b2b;\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-dropdown:disabled {\n  color: rgba(255, 255, 255, 0.2);\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-dropdown:disabled::-ms-expand {\n  color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.win-dropdown option {\n  color: #ffffff;\n  background-color: #2b2b2b;\n}\n.win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-dropdown option:hover,\n.win-dropdown option:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #ffffff;\n}\n.win-dropdown optgroup {\n  color: #ffffff;\n  background-color: #2b2b2b;\n}\n.win-dropdown optgroup:disabled {\n  color: rgba(255, 255, 255, 0.2);\n}\nselect[multiple].win-dropdown {\n  border: none;\n  background-color: #2b2b2b;\n}\nselect[multiple].win-dropdown option {\n  color: #ffffff;\n}\nselect[multiple].win-dropdown option:hover {\n  color: #ffffff;\n}\nselect[multiple].win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-slider {\n  background-color: transparent;\n}\n.win-slider:hover::-ms-thumb {\n  background: #f9f9f9;\n}\n.win-slider:hover::-webkit-slider-thumb {\n  background: #f9f9f9;\n}\n.win-slider:hover::-moz-range-thumb {\n  background: #f9f9f9;\n}\n.win-slider:active::-ms-thumb {\n  background: #767676;\n}\n.win-slider:active::-webkit-slider-thumb {\n  background: #767676;\n}\n.win-slider:active::-moz-range-thumb {\n  background: #767676;\n}\n.win-slider:disabled::-ms-thumb {\n  background: #333333;\n}\n.win-slider:disabled::-webkit-slider-thumb {\n  background: #333333;\n}\n.win-slider:disabled::-moz-range-thumb {\n  background: #333333;\n}\n.win-slider:disabled::-ms-fill-lower {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-slider::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-slider::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-slider::-moz-range-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-slider:hover::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.6);\n}\n.win-slider:hover::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.6);\n}\n.win-slider:hover::-moz-range-track {\n  background: rgba(255, 255, 255, 0.6);\n}\n.win-slider:active::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-slider:active::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-slider:active::-moz-range-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-slider:disabled::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-slider:disabled::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-slider:disabled::-moz-range-track {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-slider::-ms-track {\n  color: transparent;\n  background-color: transparent;\n}\n.win-slider::-ms-ticks-before,\n.win-slider::-ms-ticks-after {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-textbox,\n.win-textarea {\n  color: #ffffff;\n  background-color: rgba(0, 0, 0, 0.4);\n  border-color: rgba(255, 255, 255, 0.4);\n}\n.win-textbox:-ms-input-placeholder,\n.win-textarea:-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-textbox::-webkit-input-placeholder,\n.win-textarea::-webkit-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-textbox::-moz-input-placeholder,\n.win-textarea::-moz-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-textbox:hover,\n.win-textarea:hover {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-textbox:focus,\n.win-textarea:focus {\n  color: #000000;\n  background-color: #ffffff;\n}\n.win-textbox::-ms-clear,\n.win-textbox::-ms-reveal {\n  display: block;\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-textbox::-ms-clear:active,\n.win-textbox::-ms-reveal:active {\n  color: #ffffff;\n}\n.win-xbox :focus {\n  outline: 2px solid white;\n}\n.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-itemcontainer.win-selectionmode.win-container .win-itembox::after,\n.win-listview .win-surface.win-selectionmode .win-itembox::after {\n  border-color: #ffffff;\n  background-color: #393939;\n}\n.win-selectioncheckmark {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox,\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-pressed {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-listview .win-itembox,\n.win-itemcontainer .win-itembox {\n  background-color: #1d1d1d;\n}\n.win-listview .win-container.win-backdrop {\n  background-color: rgba(155, 155, 155, 0.23);\n}\n.win-listview .win-groupheader {\n  outline-color: #ffffff;\n}\n.win-listview .win-focusedoutline,\n.win-itemcontainer .win-focusedoutline {\n  outline: #ffffff dashed 2px;\n}\n.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {\n  opacity: 0.6;\n}\n.win-listview.win-selectionstylefilled .win-selected,\n.win-itemcontainer.win-selectionstylefilled.win-selected {\n  color: #ffffff;\n}\n.win-flipview .win-navbutton {\n  background-color: rgba(255, 255, 255, 0.4);\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-flipview .win-navbutton:hover:active {\n  background-color: rgba(255, 255, 255, 0.8);\n}\nhtml.win-hoverable .win-flipview .win-navbutton:hover {\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-backbutton,\n.win-back,\n.win-navigation-backbutton {\n  background-color: transparent;\n  border: none;\n  color: #ffffff;\n}\n.win-backbutton:hover,\n.win-navigation-backbutton:hover .win-back {\n  background-color: rgba(255, 255, 255, 0.1);\n}\n.win-backbutton:active,\n.win-navigation-backbutton:active .win-back {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-backbutton:disabled,\n.win-backbutton:disabled:active,\n.win-navigation-backbutton:disabled,\n.win-navigation-backbutton:disabled .win-back,\n.win-navigation-backbutton:disabled:active .win-back {\n  color: rgba(255, 255, 255, 0.4);\n  background-color: transparent;\n}\n.win-backbutton:focus,\n.win-navigation-backbutton:focus .win-back {\n  outline-color: #ffffff;\n}\n.win-tooltip {\n  color: #ffffff;\n  border-color: #767676;\n  background-color: #2b2b2b;\n}\n.win-rating .win-star.win-tentative.win-full {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-rating .win-star.win-average.win-full,\n.win-rating .win-star.win-average.win-full.win-disabled {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-rating .win-star.win-empty {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-toggleswitch-header {\n  color: #ffffff;\n}\n.win-toggleswitch-value {\n  color: #ffffff;\n}\n.win-toggleswitch-thumb {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n.win-toggleswitch-off .win-toggleswitch-track {\n  border-color: rgba(255, 255, 255, 0.8);\n}\n.win-toggleswitch-pressed .win-toggleswitch-track {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-toggleswitch-pressed .win-toggleswitch-thumb {\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-toggleswitch-disabled .win-toggleswitch-track {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.win-toggleswitch-disabled .win-toggleswitch-thumb {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-toggleswitch-disabled .win-toggleswitch-header,\n.win-toggleswitch-disabled .win-toggleswitch-value {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-semanticzoom-button {\n  background-color: rgba(216, 216, 216, 0.33);\n  border-color: transparent;\n}\nbutton.win-semanticzoom-button.win-semanticzoom-button:active,\nbutton.win-semanticzoom-button.win-semanticzoom-button:hover:active {\n  background-color: #ffffff;\n}\n.win-pivot .win-pivot-title {\n  color: #ffffff;\n}\n.win-pivot .win-pivot-navbutton {\n  background-color: rgba(255, 255, 255, 0.4);\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-pivot button.win-pivot-header {\n  color: rgba(255, 255, 255, 0.6);\n  background-color: transparent;\n}\n.win-pivot button.win-pivot-header:focus,\n.win-pivot button.win-pivot-header.win-pivot-header:hover:active {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-pivot button.win-pivot-header.win-pivot-header-selected {\n  color: #ffffff;\n}\n.win-pivot-header[disabled] {\n  color: rgba(255, 255, 255, 0.4);\n}\nbutton.win-hub-section-header-tabstop,\nbutton.win-hub-section-header-tabstop:hover:active {\n  color: #ffffff;\n}\nbutton.win-hub-section-header-tabstop.win-keyboard:focus {\n  outline: 1px dotted #ffffff;\n}\nbutton.win-hub-section-header-tabstop:-ms-keyboard-active {\n  color: #ffffff;\n}\nbutton.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {\n  color: rgba(255, 255, 255, 0.4);\n}\nbutton.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-overlay {\n  outline: none;\n}\nhr.win-command {\n  background-color: rgba(255, 255, 255, 0.4);\n}\ndiv.win-command,\nbutton.win-command {\n  border-color: transparent;\n  background-color: transparent;\n}\ndiv.win-command:hover:active,\nbutton.win-command:hover:active {\n  border-color: transparent;\n}\nbutton:enabled.win-command.win-keyboard:focus,\ndiv.win-command.win-keyboard:focus,\nbutton:enabled.win-command.win-command.win-keyboard:hover:focus,\ndiv.win-command.win-command.win-keyboard:hover:focus {\n  border-color: #ffffff;\n}\n.win-commandimage {\n  color: #ffffff;\n}\nbutton.win-command.win-command:enabled:hover:active,\nbutton.win-command.win-command:enabled:active {\n  background-color: rgba(255, 255, 255, 0.2);\n  color: #ffffff;\n}\nbutton:enabled:hover:active .win-commandimage,\nbutton:enabled:active .win-commandimage {\n  color: #ffffff;\n}\nbutton:disabled .win-commandimage,\nbutton:disabled:active .win-commandimage {\n  color: rgba(255, 255, 255, 0.2);\n}\nbutton .win-label {\n  color: #ffffff;\n}\nbutton[aria-checked=true]:enabled .win-label,\nbutton[aria-checked=true]:enabled .win-commandimage,\nbutton[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n  color: #ffffff;\n}\nbutton[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n  color: #ffffff;\n}\nbutton[aria-checked=true].win-command:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.6;\n  box-sizing: content-box;\n  content: \"\";\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\nbutton.win-command:enabled:-ms-keyboard-active {\n  background-color: rgba(255, 255, 255, 0.2);\n  color: #ffffff;\n}\nbutton[aria-checked=true].win-command:enabled:hover:active {\n  background-color: transparent;\n}\nbutton.win-command:disabled,\nbutton.win-command:disabled:hover:active {\n  background-color: transparent;\n  border-color: transparent;\n}\nbutton.win-command:disabled .win-label,\nbutton.win-command:disabled:active .win-label {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-navbar,\n.win-navbar {\n  background-color: #393939;\n  border-color: #393939;\n}\n.win-navbar.win-menulayout .win-navbar-menu,\n.win-navbar.win-menulayout .win-navbar-menu,\n.win-navbar.win-menulayout .win-toolbar,\n.win-navbar.win-menulayout .win-toolbar {\n  background-color: inherit;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {\n  background-color: transparent;\n  outline: none;\n  border-color: transparent;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {\n  color: #ffffff;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {\n  border-color: #ffffff;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {\n  background-color: transparent;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {\n  color: #ffffff;\n}\n.win-flyout,\n.win-flyout {\n  background-color: #000000;\n}\n.win-settingsflyout {\n  background-color: #000000;\n}\n.win-menu button,\n.win-menu button {\n  background-color: transparent;\n  color: #ffffff;\n}\n.win-menu button.win-command.win-command:enabled:hover:active,\n.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n  color: #ffffff;\n}\n.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,\n.win-menu-containsflyoutcommand button.win-command-flyout-activated:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.6;\n  content: \"\";\n  box-sizing: content-box;\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\n.win-menu button[aria-checked=true].win-command:before,\n.win-menu button[aria-checked=true].win-command:before {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-menu button:disabled,\n.win-menu button:disabled,\n.win-menu button:disabled:active,\n.win-menu button:disabled:active {\n  background-color: transparent;\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-commandingsurface .win-commandingsurface-actionarea,\n.win-commandingsurface .win-commandingsurface-actionarea {\n  background-color: #393939;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton,\n.win-commandingsurface button.win-commandingsurface-overflowbutton {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {\n  color: #ffffff;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {\n  border-color: #ffffff;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea,\n.win-commandingsurface .win-commandingsurface-overflowarea {\n  background-color: #2b2b2b;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,\n.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-autosuggestbox-flyout-highlighttext {\n  color: #4617b4;\n}\n.win-autosuggestbox-suggestion-separator {\n  color: #7a7a7a;\n}\n.win-autosuggestbox-suggestion-separator hr {\n  border-color: #7a7a7a;\n}\n.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {\n  color: #a38bda;\n}\n.win-autosuggestbox-flyout {\n  background-color: #2b2b2b;\n  color: #ffffff;\n}\n.win-autosuggestbox-suggestion-result:hover:active,\n.win-autosuggestbox-suggestion-query:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-searchbox-button {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-searchbox-button-input-focus {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\n.win-navbarcontainer-pageindicator {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-navbarcontainer-pageindicator-current {\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-navbarcontainer-navarrow {\n  background-color: rgba(255, 255, 255, 0.4);\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n.win-navbarcommand-button,\n.win-navbarcommand-splitbutton {\n  background-color: rgba(255, 255, 255, 0.1);\n  color: #ffffff;\n}\n.win-navbarcommand-button.win-pressed,\n.win-navbarcommand-splitbutton.win-pressed {\n  background-color: rgba(255, 255, 255, 0.28);\n}\n.win-navbarcommand-button.win-keyboard:focus::before {\n  content: \"\";\n  pointer-events: none;\n  position: absolute;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  border: 1px dotted #ffffff;\n}\n.win-navbarcommand-splitbutton.win-keyboard:focus::before {\n  border-color: #ffffff;\n}\n.win-contentdialog-dialog {\n  background-color: #2b2b2b;\n}\n.win-contentdialog-title {\n  color: #ffffff;\n}\n.win-contentdialog-content {\n  color: #ffffff;\n}\n.win-contentdialog-backgroundoverlay {\n  background-color: #000000;\n  opacity: 0.6;\n}\n.win-splitview-pane {\n  background-color: #171717;\n}\nbutton.win-splitviewpanetoggle {\n  color: #ffffff;\n}\nbutton.win-splitviewpanetoggle:active,\nbutton.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {\n  background-color: rgba(255, 255, 255, 0.2);\n}\nbutton.win-splitviewpanetoggle.win-keyboard:focus {\n  border-color: #ffffff;\n}\nhtml.win-hoverable {\n  /* LegacyAppBar control colors */\n}\nhtml.win-hoverable .win-selectionstylefilled .win-container:hover .win-itembox,\nhtml.win-hoverable .win-selectionstylefilled.win-container:hover .win-itembox {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-itembox:hover::before {\n  border-color: #ffffff;\n}\nhtml.win-hoverable .win-listview .win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {\n  opacity: 0.8;\n}\nhtml.win-hoverable .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {\n  border-color: #ffffff;\n}\nhtml.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {\n  background-color: #ffffff;\n}\nhtml.win-hoverable button:hover.win-semanticzoom-button {\n  background-color: #d8d8d8;\n}\nhtml.win-hoverable .win-pivot .win-pivot-navbutton:hover {\n  color: rgba(255, 255, 255, 0.6);\n}\nhtml.win-hoverable .win-pivot button.win-pivot-header:hover {\n  color: rgba(255, 255, 255, 0.8);\n}\nhtml.win-hoverable button.win-hub-section-header-tabstop:hover {\n  color: #ffffff;\n}\nhtml.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {\n  color: rgba(255, 255, 255, 0.8);\n}\nhtml.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,\nhtml.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #ffffff;\n}\nhtml.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #ffffff;\n}\nhtml.win-hoverable button.win-command:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n  color: #ffffff;\n}\nhtml.win-hoverable button.win-command:enabled:hover .win-commandglyph {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-menu button.win-command:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n  color: #ffffff;\n}\nhtml.win-hoverable button[aria-checked=true].win-command:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {\n  opacity: 0.8;\n}\nhtml.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {\n  opacity: 0.9;\n}\nhtml.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,\nhtml.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,\nhtml.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-autosuggestbox-suggestion-result:hover,\nhtml.win-hoverable .win-autosuggestbox-suggestion-query:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-navbarcontainer-navarrow:hover {\n  background-color: rgba(255, 255, 255, 0.6);\n}\nhtml.win-hoverable .win-navbarcommand-button:hover,\nhtml.win-hoverable .win-navbarcommand-splitbutton:hover {\n  background-color: rgba(255, 255, 255, 0.19);\n}\nhtml.win-hoverable .win-navbarcommand-button:hover.win-pressed,\nhtml.win-hoverable .win-navbarcommand-splitbutton:hover.win-pressed {\n  background-color: rgba(255, 255, 255, 0.28);\n}\nhtml.win-hoverable button.win-splitviewpanetoggle:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\n.win-ui-light body {\n  background-color: #ffffff;\n  color: #000000;\n}\n.win-ui-light .win-ui-light {\n  background-color: #ffffff;\n  color: #000000;\n}\n.win-ui-light .win-ui-dark {\n  background-color: #000000;\n  color: #ffffff;\n}\n.win-ui-light ::selection {\n  color: #fff;\n}\n.win-ui-light .win-link:hover {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-link:active {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-link[disabled] {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-checkbox::-ms-check {\n  color: #000000;\n  border-color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-ui-light .win-checkbox:indeterminate::-ms-check {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-checkbox:checked::-ms-check {\n  color: #fff;\n  border-color: transparent;\n}\n.win-ui-light .win-checkbox:hover::-ms-check {\n  border-color: #000000;\n}\n.win-ui-light .win-checkbox:hover:indeterminate::-ms-check {\n  color: #000000;\n}\n.win-ui-light .win-checkbox:active::-ms-check {\n  border-color: transparent;\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-checkbox:indeterminate:active::-ms-check {\n  color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-ui-light .win-checkbox:disabled::-ms-check,\n.win-ui-light .win-checkbox:indeterminate:disabled::-ms-check {\n  color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.2);\n  background-color: transparent;\n}\n.win-ui-light .win-radio::-ms-check {\n  color: rgba(0, 0, 0, 0.8);\n  border-color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-ui-light .win-radio:hover::-ms-check {\n  border-color: #000000;\n}\n.win-ui-light .win-radio:hover::-ms-check {\n  color: #000000;\n}\n.win-ui-light .win-radio:active::-ms-check {\n  color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-radio:disabled::-ms-check {\n  color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-progress-bar:not(:indeterminate),\n.win-ui-light .win-progress-ring:not(:indeterminate),\n.win-ui-light .win-ring:not(:indeterminate) {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-progress-bar::-webkit-progress-bar,\n.win-ui-light .win-progress-ring::-webkit-progress-bar,\n.win-ui-light .win-ring::-webkit-progress-bar {\n  background-color: transparent;\n}\n.win-ui-light .win-progress-ring,\n.win-ui-light .win-ring {\n  background-color: transparent;\n}\n.win-ui-light .win-button {\n  color: #000000;\n  background-color: rgba(0, 0, 0, 0.2);\n  border-color: transparent;\n}\n.win-ui-light .win-button:hover {\n  border-color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-button:active {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-button:disabled {\n  color: rgba(0, 0, 0, 0.2);\n  background-color: rgba(0, 0, 0, 0.2);\n  border-color: transparent;\n}\n.win-ui-light .win-button.win-button-primary {\n  color: #fff;\n}\n.win-ui-light .win-dropdown {\n  color: #000000;\n  background-color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-dropdown::-ms-expand {\n  color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-ui-light .win-dropdown:hover {\n  background-color: #f2f2f2;\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-dropdown:disabled {\n  color: rgba(0, 0, 0, 0.2);\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-dropdown:disabled::-ms-expand {\n  color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-dropdown option {\n  color: #000000;\n  background-color: #f2f2f2;\n}\n.win-ui-light .win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-ui-light .win-dropdown option:hover,\n.win-ui-light .win-dropdown option:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\n.win-ui-light .win-dropdown optgroup {\n  color: #000000;\n  background-color: #f2f2f2;\n}\n.win-ui-light .win-dropdown optgroup:disabled {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light select[multiple].win-dropdown {\n  border: none;\n  background-color: #f2f2f2;\n}\n.win-ui-light select[multiple].win-dropdown option {\n  color: #000000;\n}\n.win-ui-light select[multiple].win-dropdown option:hover {\n  color: #000000;\n}\n.win-ui-light select[multiple].win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-ui-light .win-slider {\n  background-color: transparent;\n}\n.win-ui-light .win-slider:hover::-ms-thumb {\n  background: #1f1f1f;\n}\n.win-ui-light .win-slider:hover::-webkit-slider-thumb {\n  background: #1f1f1f;\n}\n.win-ui-light .win-slider:hover::-moz-range-thumb {\n  background: #1f1f1f;\n}\n.win-ui-light .win-slider:active::-ms-thumb {\n  background: #cccccc;\n}\n.win-ui-light .win-slider:active::-webkit-slider-thumb {\n  background: #cccccc;\n}\n.win-ui-light .win-slider:active::-moz-range-thumb {\n  background: #cccccc;\n}\n.win-ui-light .win-slider:disabled::-ms-thumb {\n  background: #cccccc;\n}\n.win-ui-light .win-slider:disabled::-webkit-slider-thumb {\n  background: #cccccc;\n}\n.win-ui-light .win-slider:disabled::-moz-range-thumb {\n  background: #cccccc;\n}\n.win-ui-light .win-slider:disabled::-ms-fill-lower {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-slider::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-slider::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-slider::-moz-range-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-slider:hover::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-slider:hover::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-slider:hover::-moz-range-track {\n  background: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-slider:active::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-slider:active::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-slider:active::-moz-range-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-slider:disabled::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-slider:disabled::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-slider:disabled::-moz-range-track {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-slider::-ms-track {\n  color: transparent;\n  background-color: transparent;\n}\n.win-ui-light .win-slider::-ms-ticks-before,\n.win-ui-light .win-slider::-ms-ticks-after {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-textbox,\n.win-ui-light .win-textarea {\n  color: #000000;\n  background-color: rgba(255, 255, 255, 0.4);\n  border-color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-textbox:-ms-input-placeholder,\n.win-ui-light .win-textarea:-ms-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-textbox::-webkit-input-placeholder,\n.win-ui-light .win-textarea::-webkit-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-textbox::-moz-input-placeholder,\n.win-ui-light .win-textarea::-moz-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-textbox:hover,\n.win-ui-light .win-textarea:hover {\n  background-color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-textbox:focus,\n.win-ui-light .win-textarea:focus {\n  color: #000000;\n  background-color: #ffffff;\n}\n.win-ui-light .win-textbox::-ms-clear,\n.win-ui-light .win-textbox::-ms-reveal {\n  display: block;\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-textbox::-ms-clear:active,\n.win-ui-light .win-textbox::-ms-reveal:active {\n  color: #ffffff;\n}\n.win-ui-light .win-xbox :focus {\n  outline: 2px solid white;\n}\n.win-ui-light .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-ui-light .win-itemcontainer.win-selectionmode.win-container .win-itembox::after,\n.win-ui-light .win-listview .win-surface.win-selectionmode .win-itembox::after {\n  border-color: #000000;\n  background-color: #e6e6e6;\n}\n.win-ui-light .win-selectioncheckmark {\n  color: #000000;\n}\n.win-ui-light html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,\n.win-ui-light html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox,\n.win-ui-light html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,\n.win-ui-light html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-pressed {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-listview .win-itembox,\n.win-ui-light .win-itemcontainer .win-itembox {\n  background-color: #ffffff;\n}\n.win-ui-light .win-listview .win-container.win-backdrop {\n  background-color: rgba(155, 155, 155, 0.23);\n}\n.win-ui-light .win-listview .win-groupheader {\n  outline-color: #000000;\n}\n.win-ui-light .win-listview .win-focusedoutline,\n.win-ui-light .win-itemcontainer .win-focusedoutline {\n  outline: #000000 dashed 2px;\n}\n.win-ui-light .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\n.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {\n  opacity: 0.4;\n}\n.win-ui-light .win-listview.win-selectionstylefilled .win-selected,\n.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected {\n  color: #000000;\n}\n.win-ui-light .win-flipview .win-navbutton {\n  background-color: rgba(0, 0, 0, 0.4);\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-light .win-flipview .win-navbutton:hover:active {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light html.win-hoverable .win-flipview .win-navbutton:hover {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-backbutton,\n.win-ui-light .win-back,\n.win-ui-light .win-navigation-backbutton {\n  background-color: transparent;\n  border: none;\n  color: #000000;\n}\n.win-ui-light .win-backbutton:hover,\n.win-ui-light .win-navigation-backbutton:hover .win-back {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.win-ui-light .win-backbutton:active,\n.win-ui-light .win-navigation-backbutton:active .win-back {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-backbutton:disabled,\n.win-ui-light .win-backbutton:disabled:active,\n.win-ui-light .win-navigation-backbutton:disabled,\n.win-ui-light .win-navigation-backbutton:disabled .win-back,\n.win-ui-light .win-navigation-backbutton:disabled:active .win-back {\n  color: rgba(0, 0, 0, 0.4);\n  background-color: transparent;\n}\n.win-ui-light .win-backbutton:focus,\n.win-ui-light .win-navigation-backbutton:focus .win-back {\n  outline-color: #000000;\n}\n.win-ui-light .win-tooltip {\n  color: #000000;\n  border-color: #cccccc;\n  background-color: #f2f2f2;\n}\n.win-ui-light .win-rating .win-star.win-tentative.win-full {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-rating .win-star.win-average.win-full,\n.win-ui-light .win-rating .win-star.win-average.win-full.win-disabled {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-rating .win-star.win-empty {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-toggleswitch-header {\n  color: #000000;\n}\n.win-ui-light .win-toggleswitch-value {\n  color: #000000;\n}\n.win-ui-light .win-toggleswitch-thumb {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-toggleswitch-off .win-toggleswitch-track {\n  border-color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-toggleswitch-pressed .win-toggleswitch-track {\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-toggleswitch-pressed .win-toggleswitch-thumb {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-track {\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-thumb {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-header,\n.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-value {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-semanticzoom-button {\n  background-color: rgba(216, 216, 216, 0.33);\n  border-color: transparent;\n}\n.win-ui-light button.win-semanticzoom-button.win-semanticzoom-button:active,\n.win-ui-light button.win-semanticzoom-button.win-semanticzoom-button:hover:active {\n  background-color: #000000;\n}\n.win-ui-light .win-pivot .win-pivot-title {\n  color: #000000;\n}\n.win-ui-light .win-pivot .win-pivot-navbutton {\n  background-color: rgba(0, 0, 0, 0.4);\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-light .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-pivot button.win-pivot-header {\n  color: rgba(0, 0, 0, 0.6);\n  background-color: transparent;\n}\n.win-ui-light .win-pivot button.win-pivot-header:focus,\n.win-ui-light .win-pivot button.win-pivot-header.win-pivot-header:hover:active {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-pivot button.win-pivot-header.win-pivot-header-selected {\n  color: #000000;\n}\n.win-ui-light .win-pivot-header[disabled] {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light button.win-hub-section-header-tabstop,\n.win-ui-light button.win-hub-section-header-tabstop:hover:active {\n  color: #000000;\n}\n.win-ui-light button.win-hub-section-header-tabstop.win-keyboard:focus {\n  outline: 1px dotted #000000;\n}\n.win-ui-light button.win-hub-section-header-tabstop:-ms-keyboard-active {\n  color: #000000;\n}\n.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-overlay {\n  outline: none;\n}\n.win-ui-light hr.win-command {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light div.win-command,\n.win-ui-light button.win-command {\n  border-color: transparent;\n  background-color: transparent;\n}\n.win-ui-light div.win-command:hover:active,\n.win-ui-light button.win-command:hover:active {\n  border-color: transparent;\n}\n.win-ui-light button:enabled.win-command.win-keyboard:focus,\n.win-ui-light div.win-command.win-keyboard:focus,\n.win-ui-light button:enabled.win-command.win-command.win-keyboard:hover:focus,\n.win-ui-light div.win-command.win-command.win-keyboard:hover:focus {\n  border-color: #000000;\n}\n.win-ui-light .win-commandimage {\n  color: #000000;\n}\n.win-ui-light button.win-command.win-command:enabled:hover:active,\n.win-ui-light button.win-command.win-command:enabled:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\n.win-ui-light button:enabled:hover:active .win-commandimage,\n.win-ui-light button:enabled:active .win-commandimage {\n  color: #000000;\n}\n.win-ui-light button:disabled .win-commandimage,\n.win-ui-light button:disabled:active .win-commandimage {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light button .win-label {\n  color: #000000;\n}\n.win-ui-light button[aria-checked=true]:enabled .win-label,\n.win-ui-light button[aria-checked=true]:enabled .win-commandimage,\n.win-ui-light button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n  color: #000000;\n}\n.win-ui-light button[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n  color: #000000;\n}\n.win-ui-light button[aria-checked=true].win-command:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.4;\n  box-sizing: content-box;\n  content: \"\";\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\n.win-ui-light button.win-command:enabled:-ms-keyboard-active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\n.win-ui-light button[aria-checked=true].win-command:enabled:hover:active {\n  background-color: transparent;\n}\n.win-ui-light button.win-command:disabled,\n.win-ui-light button.win-command:disabled:hover:active {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-ui-light button.win-command:disabled .win-label,\n.win-ui-light button.win-command:disabled:active .win-label {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light.win-navbar,\n.win-ui-light .win-navbar {\n  background-color: #e6e6e6;\n  border-color: #e6e6e6;\n}\n.win-ui-light.win-navbar.win-menulayout .win-navbar-menu,\n.win-ui-light .win-navbar.win-menulayout .win-navbar-menu,\n.win-ui-light.win-navbar.win-menulayout .win-toolbar,\n.win-ui-light .win-navbar.win-menulayout .win-toolbar {\n  background-color: inherit;\n}\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {\n  background-color: transparent;\n  outline: none;\n  border-color: transparent;\n}\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {\n  color: #000000;\n}\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {\n  border-color: #000000;\n}\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {\n  background-color: transparent;\n}\n.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,\n.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {\n  color: #000000;\n}\n.win-ui-light.win-flyout,\n.win-ui-light .win-flyout {\n  background-color: #ffffff;\n}\n.win-ui-light .win-settingsflyout {\n  background-color: #ffffff;\n}\n.win-ui-light.win-menu button,\n.win-ui-light .win-menu button {\n  background-color: transparent;\n  color: #000000;\n}\n.win-ui-light .win-menu button.win-command.win-command:enabled:hover:active,\n.win-ui-light .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\n.win-ui-light.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,\n.win-ui-light .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.4;\n  content: \"\";\n  box-sizing: content-box;\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\n.win-ui-light.win-menu button[aria-checked=true].win-command:before,\n.win-ui-light .win-menu button[aria-checked=true].win-command:before {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-ui-light.win-menu button:disabled,\n.win-ui-light .win-menu button:disabled,\n.win-ui-light.win-menu button:disabled:active,\n.win-ui-light .win-menu button:disabled:active {\n  background-color: transparent;\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light.win-commandingsurface .win-commandingsurface-actionarea,\n.win-ui-light .win-commandingsurface .win-commandingsurface-actionarea {\n  background-color: #e6e6e6;\n}\n.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton,\n.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,\n.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,\n.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {\n  color: #000000;\n}\n.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,\n.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {\n  border-color: #000000;\n}\n.win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea,\n.win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea {\n  background-color: #f2f2f2;\n}\n.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,\n.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,\n.win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {\n  color: #000000;\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-autosuggestbox-flyout-highlighttext {\n  color: #4617b4;\n}\n.win-ui-light .win-autosuggestbox-suggestion-separator {\n  color: #7a7a7a;\n}\n.win-ui-light .win-autosuggestbox-suggestion-separator hr {\n  border-color: #7a7a7a;\n}\n.win-ui-light .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {\n  color: #a38bda;\n}\n.win-ui-light .win-autosuggestbox-flyout {\n  background-color: #f2f2f2;\n  color: #000000;\n}\n.win-ui-light .win-autosuggestbox-suggestion-result:hover:active,\n.win-ui-light .win-autosuggestbox-suggestion-query:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-searchbox-button {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-searchbox-button-input-focus {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-light .win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\n.win-ui-light .win-navbarcontainer-pageindicator {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light .win-navbarcontainer-pageindicator-current {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-light .win-navbarcontainer-navarrow {\n  background-color: rgba(0, 0, 0, 0.4);\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-light .win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-light .win-navbarcommand-button,\n.win-ui-light .win-navbarcommand-splitbutton {\n  background-color: rgba(0, 0, 0, 0.1);\n  color: #000000;\n}\n.win-ui-light .win-navbarcommand-button.win-pressed,\n.win-ui-light .win-navbarcommand-splitbutton.win-pressed {\n  background-color: rgba(0, 0, 0, 0.28);\n}\n.win-ui-light .win-navbarcommand-button.win-keyboard:focus::before {\n  content: \"\";\n  pointer-events: none;\n  position: absolute;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  border: 1px dotted #000000;\n}\n.win-ui-light .win-navbarcommand-splitbutton.win-keyboard:focus::before {\n  border-color: #000000;\n}\n.win-ui-light .win-contentdialog-dialog {\n  background-color: #f2f2f2;\n}\n.win-ui-light .win-contentdialog-title {\n  color: #000000;\n}\n.win-ui-light .win-contentdialog-content {\n  color: #000000;\n}\n.win-ui-light .win-contentdialog-backgroundoverlay {\n  background-color: #ffffff;\n  opacity: 0.6;\n}\n.win-ui-light .win-splitview-pane {\n  background-color: #f2f2f2;\n}\n.win-ui-light button.win-splitviewpanetoggle {\n  color: #000000;\n}\n.win-ui-light button.win-splitviewpanetoggle:active,\n.win-ui-light button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-ui-light button.win-splitviewpanetoggle.win-keyboard:focus {\n  border-color: #000000;\n}\nhtml.win-hoverable .win-ui-light {\n  /* LegacyAppBar control colors */\n}\nhtml.win-hoverable .win-ui-light .win-selectionstylefilled .win-container:hover .win-itembox,\nhtml.win-hoverable .win-ui-light .win-selectionstylefilled.win-container:hover .win-itembox {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-ui-light .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-ui-light .win-itemcontainer .win-itembox:hover::before {\n  border-color: #000000;\n}\nhtml.win-hoverable .win-ui-light .win-listview .win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-ui-light .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-ui-light .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,\nhtml.win-hoverable .win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {\n  opacity: 0.6;\n}\nhtml.win-hoverable .win-ui-light .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {\n  border-color: #000000;\n}\nhtml.win-hoverable .win-ui-light .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {\n  background-color: #000000;\n}\nhtml.win-hoverable .win-ui-light button:hover.win-semanticzoom-button {\n  background-color: #d8d8d8;\n}\nhtml.win-hoverable .win-ui-light .win-pivot .win-pivot-navbutton:hover {\n  color: rgba(0, 0, 0, 0.6);\n}\nhtml.win-hoverable .win-ui-light .win-pivot button.win-pivot-header:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\nhtml.win-hoverable .win-ui-light button.win-hub-section-header-tabstop:hover {\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\nhtml.win-hoverable .win-ui-light.win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light .win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light.win-navbar button.win-navbar-invokebutton:disabled:hover,\nhtml.win-hoverable .win-ui-light .win-navbar button.win-navbar-invokebutton:disabled:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light button.win-command:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light button.win-command:enabled:hover .win-commandglyph {\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light .win-menu button.win-command:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light button[aria-checked=true].win-command:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable .win-ui-light button:enabled[aria-checked=true].win-command:hover:before {\n  opacity: 0.6;\n}\nhtml.win-hoverable .win-ui-light button:enabled[aria-checked=true].win-command:hover:active:before {\n  opacity: 0.7;\n}\nhtml.win-hoverable .win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable .win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable .win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,\nhtml.win-hoverable .win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,\nhtml.win-hoverable .win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {\n  color: #000000;\n}\nhtml.win-hoverable .win-ui-light .win-autosuggestbox-suggestion-result:hover,\nhtml.win-hoverable .win-ui-light .win-autosuggestbox-suggestion-query:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-ui-light .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-light .win-navbarcontainer-navarrow:hover {\n  background-color: rgba(0, 0, 0, 0.6);\n}\nhtml.win-hoverable .win-ui-light .win-navbarcommand-button:hover,\nhtml.win-hoverable .win-ui-light .win-navbarcommand-splitbutton:hover {\n  background-color: rgba(255, 255, 255, 0.19);\n}\nhtml.win-hoverable .win-ui-light .win-navbarcommand-button:hover.win-pressed,\nhtml.win-hoverable .win-ui-light .win-navbarcommand-splitbutton:hover.win-pressed {\n  background-color: rgba(255, 255, 255, 0.28);\n}\nhtml.win-hoverable .win-ui-light button.win-splitviewpanetoggle:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\n@media (-ms-high-contrast) {\n  .win-overlay {\n    outline: none;\n  }\n  hr.win-command {\n    background-color: ButtonText;\n  }\n  div.win-command,\n  button.win-command {\n    border-color: transparent;\n    background-color: transparent;\n  }\n  div.win-command:hover:active,\n  button.win-command:hover:active {\n    border-color: transparent;\n  }\n  button:enabled.win-command.win-keyboard:focus,\n  div.win-command.win-keyboard:focus,\n  button:enabled.win-command.win-command.win-keyboard:hover:focus,\n  div.win-command.win-command.win-keyboard:hover:focus {\n    border-color: ButtonText;\n  }\n  .win-commandimage {\n    color: ButtonText;\n  }\n  button.win-command.win-command:enabled:hover:active,\n  button.win-command.win-command:enabled:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  button:enabled:hover:active .win-commandimage,\n  button:enabled:active .win-commandimage {\n    color: ButtonFace;\n  }\n  button:disabled .win-commandimage,\n  button:disabled:active .win-commandimage {\n    color: GrayText;\n  }\n  button .win-label {\n    color: #ffffff;\n  }\n  button[aria-checked=true]:enabled .win-label,\n  button[aria-checked=true]:enabled .win-commandimage,\n  button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n    color: ButtonFace;\n  }\n  button[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n    color: ButtonFace;\n  }\n  button[aria-checked=true].win-command:before {\n    position: absolute;\n    height: 100%;\n    width: 100%;\n    opacity: 1;\n    box-sizing: content-box;\n    content: \"\";\n    /* We want this pseudo element to cover the border of its parent. */\n    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n    border-width: 1px;\n    border-style: solid;\n    top: -1px;\n    left: -1px;\n  }\n  button.win-command:enabled:-ms-keyboard-active {\n    background-color: ButtonText;\n    color: ButtonText;\n  }\n  button[aria-checked=true].win-command:enabled:hover:active {\n    background-color: transparent;\n  }\n  button.win-command:disabled,\n  button.win-command:disabled:hover:active {\n    background-color: transparent;\n    border-color: transparent;\n  }\n  button.win-command:disabled .win-label,\n  button.win-command:disabled:active .win-label {\n    color: GrayText;\n  }\n  .win-navbar,\n  .win-navbar {\n    background-color: ButtonFace;\n    border-color: Highlight;\n  }\n  .win-navbar.win-menulayout .win-navbar-menu,\n  .win-navbar.win-menulayout .win-navbar-menu,\n  .win-navbar.win-menulayout .win-toolbar,\n  .win-navbar.win-menulayout .win-toolbar {\n    background-color: inherit;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {\n    background-color: transparent;\n    outline: none;\n    border-color: transparent;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {\n    background-color: transparent;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {\n    color: ButtonText;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {\n    border-color: ButtonText;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {\n    background-color: transparent;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {\n    color: GrayText;\n  }\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {\n    background-color: ButtonText;\n  }\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {\n    color: ButtonFace;\n  }\n  .win-flyout,\n  .win-flyout {\n    background-color: ButtonFace;\n  }\n  .win-settingsflyout {\n    background-color: ButtonFace;\n  }\n  .win-menu button,\n  .win-menu button {\n    background-color: transparent;\n    color: ButtonText;\n  }\n  .win-menu button.win-command.win-command:enabled:hover:active,\n  .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before,\n  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {\n    position: absolute;\n    height: 100%;\n    width: 100%;\n    opacity: 0.6;\n    content: \"\";\n    box-sizing: content-box;\n    /* We want this pseudo element to cover the border of its parent. */\n    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n    border-width: 1px;\n    border-style: solid;\n    top: -1px;\n    left: -1px;\n  }\n  .win-menu button[aria-checked=true].win-command:before,\n  .win-menu button[aria-checked=true].win-command:before {\n    background-color: transparent;\n    border-color: transparent;\n  }\n  .win-menu button:disabled,\n  .win-menu button:disabled,\n  .win-menu button:disabled:active,\n  .win-menu button:disabled:active {\n    background-color: transparent;\n    color: GrayText;\n  }\n  .win-commandingsurface .win-commandingsurface-actionarea,\n  .win-commandingsurface .win-commandingsurface-actionarea {\n    background-color: ButtonFace;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton {\n    background-color: ButtonFace;\n    border-color: transparent;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {\n    background-color: ButtonFace;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {\n    color: ButtonText;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {\n    border-color: ButtonText;\n  }\n  .win-commandingsurface .win-commandingsurface-overflowarea,\n  .win-commandingsurface .win-commandingsurface-overflowarea {\n    background-color: ButtonFace;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {\n    background-color: Highlight;\n  }\n  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,\n  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {\n    color: ButtonFace;\n    background-color: ButtonText;\n  }\n  html.win-hoverable {\n    /* LegacyAppBar control colors */\n  }\n  html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,\n  html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {\n    background-color: transparent;\n  }\n  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n    color: HighlightText;\n  }\n  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n    color: HighlightText;\n  }\n  html.win-hoverable button.win-command:enabled:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  html.win-hoverable button.win-command:enabled:hover .win-commandglyph {\n    color: HighlightText;\n  }\n  html.win-hoverable .win-menu button.win-command:enabled:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  html.win-hoverable button[aria-checked=true].win-command:hover {\n    background-color: transparent;\n  }\n  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {\n    opacity: 1;\n  }\n  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {\n    opacity: 1;\n  }\n  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\n  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\n  html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,\n  html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,\n  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {\n    color: HighlightText;\n  }\n}\n"
  },
  {
    "path": "templates/winjs/template/source/lib/winjs-4.0.1/css/ui-light.css",
    "content": "﻿/* Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */\n@keyframes WinJS-node-inserted {\n  from {\n    outline-color: #000;\n  }\n  to {\n    outline-color: #001;\n  }\n}\n@keyframes WinJS-opacity-in {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n@keyframes WinJS-opacity-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n@keyframes WinJS-scale-up {\n  from {\n    transform: scale(0.85);\n  }\n  to {\n    transform: scale(1);\n  }\n}\n@keyframes WinJS-scale-down {\n  from {\n    transform: scale(1);\n  }\n  to {\n    transform: scale(0.85);\n  }\n}\n@keyframes WinJS-default-remove {\n  from {\n    transform: translateX(11px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-default-remove-rtl {\n  from {\n    transform: translateX(-11px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-default-apply {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(11px);\n  }\n}\n@keyframes WinJS-default-apply-rtl {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(-11px);\n  }\n}\n@keyframes WinJS-showEdgeUI {\n  from {\n    transform: translateY(-70px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showPanel {\n  from {\n    transform: translateX(364px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showPanel-rtl {\n  from {\n    transform: translateX(-364px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-hideEdgeUI {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateY(-70px);\n  }\n}\n@keyframes WinJS-hidePanel {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(364px);\n  }\n}\n@keyframes WinJS-hidePanel-rtl {\n  from {\n    transform: none;\n  }\n  to {\n    transform: translateX(-364px);\n  }\n}\n@keyframes WinJS-showPopup {\n  from {\n    transform: translateY(50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-dragSourceEnd {\n  from {\n    transform: translateX(11px) scale(1.05);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-dragSourceEnd-rtl {\n  from {\n    transform: translateX(-11px) scale(1.05);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-enterContent {\n  from {\n    transform: translateY(28px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-exit {\n  from {\n    transform: none;\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-enterPage {\n  from {\n    transform: translateY(28px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-updateBadge {\n  from {\n    transform: translateY(24px);\n  }\n  to {\n    transform: none;\n  }\n}\n@-webkit-keyframes WinJS-node-inserted {\n  from {\n    outline-color: #000;\n  }\n  to {\n    outline-color: #001;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-opacity-in {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-opacity-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-scale-up {\n  from {\n    -webkit-transform: scale(0.85);\n  }\n  to {\n    -webkit-transform: scale(1);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-scale-down {\n  from {\n    -webkit-transform: scale(1);\n  }\n  to {\n    -webkit-transform: scale(0.85);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-remove {\n  from {\n    -webkit-transform: translateX(11px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-remove-rtl {\n  from {\n    -webkit-transform: translateX(-11px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-apply {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(11px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-default-apply-rtl {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(-11px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showEdgeUI {\n  from {\n    -webkit-transform: translateY(-70px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showPanel {\n  from {\n    -webkit-transform: translateX(364px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showPanel-rtl {\n  from {\n    -webkit-transform: translateX(-364px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-hideEdgeUI {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateY(-70px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-hidePanel {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(364px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-hidePanel-rtl {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: translateX(-364px);\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showPopup {\n  from {\n    -webkit-transform: translateY(50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-dragSourceEnd {\n  from {\n    -webkit-transform: translateX(11px) scale(1.05);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-dragSourceEnd-rtl {\n  from {\n    -webkit-transform: translateX(-11px) scale(1.05);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-enterContent {\n  from {\n    -webkit-transform: translateY(28px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-exit {\n  from {\n    -webkit-transform: none;\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-enterPage {\n  from {\n    -webkit-transform: translateY(28px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-updateBadge {\n  from {\n    -webkit-transform: translateY(24px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@font-face {\n  font-family: \"Segoe UI Command\";\n  src: local(\"Segoe MDL2 Assets\");\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"Symbols\";\n  src: url(../fonts/Symbols.ttf);\n}\n.win-type-header,\n.win-h1 {\n  font-size: 46px;\n  font-weight: 200;\n  line-height: 1.216;\n  letter-spacing: 0px;\n}\n.win-type-subheader,\n.win-h2 {\n  font-size: 34px;\n  font-weight: 200;\n  line-height: 1.176;\n}\n.win-type-title,\n.win-h3 {\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 1.167;\n}\n.win-type-subtitle,\n.win-h4 {\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n}\n.win-type-body,\n.win-h6 {\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-type-base,\n.win-h5 {\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 1.333;\n}\n.win-type-caption {\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 1.167;\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 200;\n  src: local(\"Segoe UI Light\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 300;\n  src: local(\"Segoe UI Semilight\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 400;\n  src: local(\"Segoe UI\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 500;\n  src: local(\"Segoe UI Semibold\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-weight: 600;\n  src: local(\"Segoe UI Bold\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-style: italic;\n  font-weight: 400;\n  src: local(\"Segoe UI Italic\");\n}\n@font-face {\n  font-family: \"Segoe UI\";\n  font-style: italic;\n  font-weight: 700;\n  src: local(\"Segoe UI Bold Italic\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 200;\n  src: local(\"Microsoft Yahei UI Light\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 300;\n  src: local(\"Microsoft Yahei UI\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 500;\n  src: local(\"Microsoft Yahei UI\");\n}\n@font-face {\n  font-family: \"Microsoft Yahei UI\";\n  font-weight: 600;\n  src: local(\"Microsoft Yahei UI Bold\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 200;\n  src: local(\"Microsoft JhengHei UI Light\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 300;\n  src: local(\"Microsoft JhengHei UI\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 500;\n  src: local(\"Microsoft JhengHei UI\");\n}\n@font-face {\n  font-family: \"Microsoft JhengHei UI\";\n  font-weight: 600;\n  src: local(\"Microsoft JhengHei UI Bold\");\n}\n.win-type-header:-ms-lang(am, ti),\n.win-type-subheader:-ms-lang(am, ti),\n.win-type-title:-ms-lang(am, ti),\n.win-type-subtitle:-ms-lang(am, ti),\n.win-type-base:-ms-lang(am, ti),\n.win-type-body:-ms-lang(am, ti),\n.win-type-caption:-ms-lang(am, ti),\n.win-h1:-ms-lang(am, ti),\n.win-h2:-ms-lang(am, ti),\n.win-h3:-ms-lang(am, ti),\n.win-h4:-ms-lang(am, ti),\n.win-h5:-ms-lang(am, ti),\n.win-h6:-ms-lang(am, ti),\n.win-button:-ms-lang(am, ti),\n.win-dropdown:-ms-lang(am, ti),\n.win-textbox:-ms-lang(am, ti),\n.win-link:-ms-lang(am, ti),\n.win-textarea:-ms-lang(am, ti) {\n  font-family: \"Ebrima\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-subheader:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-title:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-subtitle:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-base:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-body:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-type-caption:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h1:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h2:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h3:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h4:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h5:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-h6:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-button:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-dropdown:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-textbox:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-link:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),\n.win-textarea:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te) {\n  font-family: \"Nirmala UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(chr-CHER-US),\n.win-type-subheader:-ms-lang(chr-CHER-US),\n.win-type-title:-ms-lang(chr-CHER-US),\n.win-type-subtitle:-ms-lang(chr-CHER-US),\n.win-type-base:-ms-lang(chr-CHER-US),\n.win-type-body:-ms-lang(chr-CHER-US),\n.win-type-caption:-ms-lang(chr-CHER-US),\n.win-h1:-ms-lang(chr-CHER-US),\n.win-h2:-ms-lang(chr-CHER-US),\n.win-h3:-ms-lang(chr-CHER-US),\n.win-h4:-ms-lang(chr-CHER-US),\n.win-h5:-ms-lang(chr-CHER-US),\n.win-h6:-ms-lang(chr-CHER-US),\n.win-button:-ms-lang(chr-CHER-US),\n.win-dropdown:-ms-lang(chr-CHER-US),\n.win-textbox:-ms-lang(chr-CHER-US),\n.win-link:-ms-lang(chr-CHER-US),\n.win-textarea:-ms-lang(chr-CHER-US) {\n  font-family: \"Gadugi\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(ja),\n.win-type-subheader:-ms-lang(ja),\n.win-type-title:-ms-lang(ja),\n.win-type-subtitle:-ms-lang(ja),\n.win-type-base:-ms-lang(ja),\n.win-type-body:-ms-lang(ja),\n.win-type-caption:-ms-lang(ja),\n.win-h1:-ms-lang(ja),\n.win-h2:-ms-lang(ja),\n.win-h3:-ms-lang(ja),\n.win-h4:-ms-lang(ja),\n.win-h5:-ms-lang(ja),\n.win-h6:-ms-lang(ja),\n.win-button:-ms-lang(ja),\n.win-dropdown:-ms-lang(ja),\n.win-textbox:-ms-lang(ja),\n.win-link:-ms-lang(ja),\n.win-textarea:-ms-lang(ja) {\n  font-family: \"Yu Gothic UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-subheader:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-title:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-subtitle:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-base:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-body:-ms-lang(km, lo, th, bug-Bugi),\n.win-type-caption:-ms-lang(km, lo, th, bug-Bugi),\n.win-h1:-ms-lang(km, lo, th, bug-Bugi),\n.win-h2:-ms-lang(km, lo, th, bug-Bugi),\n.win-h3:-ms-lang(km, lo, th, bug-Bugi),\n.win-h4:-ms-lang(km, lo, th, bug-Bugi),\n.win-h5:-ms-lang(km, lo, th, bug-Bugi),\n.win-h6:-ms-lang(km, lo, th, bug-Bugi),\n.win-button:-ms-lang(km, lo, th, bug-Bugi),\n.win-dropdown:-ms-lang(km, lo, th, bug-Bugi),\n.win-textbox:-ms-lang(km, lo, th, bug-Bugi),\n.win-link:-ms-lang(km, lo, th, bug-Bugi),\n.win-textarea:-ms-lang(km, lo, th, bug-Bugi) {\n  font-family: \"Leelawadee UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(ko),\n.win-type-subheader:-ms-lang(ko),\n.win-type-title:-ms-lang(ko),\n.win-type-subtitle:-ms-lang(ko),\n.win-type-base:-ms-lang(ko),\n.win-type-body:-ms-lang(ko),\n.win-type-caption:-ms-lang(ko),\n.win-h1:-ms-lang(ko),\n.win-h2:-ms-lang(ko),\n.win-h3:-ms-lang(ko),\n.win-h4:-ms-lang(ko),\n.win-h5:-ms-lang(ko),\n.win-h6:-ms-lang(ko),\n.win-button:-ms-lang(ko),\n.win-dropdown:-ms-lang(ko),\n.win-textbox:-ms-lang(ko),\n.win-link:-ms-lang(ko),\n.win-textarea:-ms-lang(ko) {\n  font-family: \"Malgun Gothic\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(jv-Java),\n.win-type-subheader:-ms-lang(jv-Java),\n.win-type-title:-ms-lang(jv-Java),\n.win-type-subtitle:-ms-lang(jv-Java),\n.win-type-base:-ms-lang(jv-Java),\n.win-type-body:-ms-lang(jv-Java),\n.win-type-caption:-ms-lang(jv-Java),\n.win-h1:-ms-lang(jv-Java),\n.win-h2:-ms-lang(jv-Java),\n.win-h3:-ms-lang(jv-Java),\n.win-h4:-ms-lang(jv-Java),\n.win-h5:-ms-lang(jv-Java),\n.win-h6:-ms-lang(jv-Java),\n.win-button:-ms-lang(jv-Java),\n.win-dropdown:-ms-lang(jv-Java),\n.win-textbox:-ms-lang(jv-Java),\n.win-link:-ms-lang(jv-Java),\n.win-textarea:-ms-lang(jv-Java) {\n  font-family: \"Javanese Text\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(cop-Copt),\n.win-type-subheader:-ms-lang(cop-Copt),\n.win-type-title:-ms-lang(cop-Copt),\n.win-type-subtitle:-ms-lang(cop-Copt),\n.win-type-base:-ms-lang(cop-Copt),\n.win-type-body:-ms-lang(cop-Copt),\n.win-type-caption:-ms-lang(cop-Copt),\n.win-h1:-ms-lang(cop-Copt),\n.win-h2:-ms-lang(cop-Copt),\n.win-h3:-ms-lang(cop-Copt),\n.win-h4:-ms-lang(cop-Copt),\n.win-h5:-ms-lang(cop-Copt),\n.win-h6:-ms-lang(cop-Copt),\n.win-button:-ms-lang(cop-Copt),\n.win-dropdown:-ms-lang(cop-Copt),\n.win-textbox:-ms-lang(cop-Copt),\n.win-link:-ms-lang(cop-Copt),\n.win-textarea:-ms-lang(cop-Copt) {\n  font-family: \"Segoe MDL2 Assets\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-subheader:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-title:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-subtitle:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-base:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-body:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-type-caption:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h1:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h2:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h3:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h4:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h5:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-h6:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-button:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-dropdown:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-textbox:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-link:-ms-lang(zh-CN, zh-Hans, zh-SG),\n.win-textarea:-ms-lang(zh-CN, zh-Hans, zh-SG) {\n  font-family: \"Microsoft YaHei UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\n.win-type-header:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-subheader:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-title:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-subtitle:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-base:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-body:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-type-caption:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h1:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h2:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h3:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h4:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h5:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-h6:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-button:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-dropdown:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-textbox:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-link:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),\n.win-textarea:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO) {\n  font-family: \"Microsoft JhengHei UI\", \"Ebrima\", \"Nirmala UI\", \"Gadugi\", \"Segoe UI Emoji\", \"Segoe MDL2 Assets\", \"Symbols\", \"Yu Gothic UI\", \"Yu Gothic\", \"Meiryo UI\", \"Leelawadee UI\", \"Microsoft YaHei UI\", \"Microsoft JhengHei UI\", \"Malgun Gothic\", \"Segoe UI Historic\", \"Estrangelo Edessa\", \"Microsoft Himalaya\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Tai Le\", \"Microsoft Yi Baiti\", \"Mongolian Baiti\", \"MV Boli\", \"Myanmar Text\", \"Javanese Text\", \"Cambria Math\";\n}\nhtml,\nbody {\n  width: 100%;\n  height: 100%;\n  margin: 0px;\n  cursor: default;\n  -webkit-touch-callout: none;\n  -ms-scroll-translation: vertical-to-horizontal;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nhtml {\n  overflow: hidden;\n  direction: ltr;\n}\nhtml:lang(ar),\nhtml:lang(dv),\nhtml:lang(fa),\nhtml:lang(he),\nhtml:lang(ku-Arab),\nhtml:lang(pa-Arab),\nhtml:lang(prs),\nhtml:lang(ps),\nhtml:lang(sd-Arab),\nhtml:lang(syr),\nhtml:lang(ug),\nhtml:lang(ur),\nhtml:lang(qps-plocm) {\n  direction: rtl;\n}\nbody {\n  -ms-content-zooming: none;\n}\niframe {\n  border: 0;\n}\n.win-type-header,\n.win-type-subheader,\n.win-type-title,\n.win-type-subtitle,\n.win-type-base,\n.win-type-body,\n.win-type-caption,\n.win-h1,\n.win-h2,\n.win-h3,\n.win-h4,\n.win-h5,\n.win-h6,\n.win-button,\n.win-dropdown,\n.win-textbox,\n.win-link,\n.win-textarea {\n  font-family: \"Segoe UI\", sans-serif, \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-textbox,\n.win-textarea {\n  -ms-user-select: element;\n  border-style: solid;\n  border-width: 2px;\n  border-radius: 0;\n  margin: 8px 0px;\n  width: 296px;\n  min-width: 64px;\n  min-height: 28px;\n  background-clip: border-box;\n  box-sizing: border-box;\n  padding: 3px 6px 5px 10px;\n  outline: 0;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-textbox::-ms-value {\n  margin: 0;\n  padding: 0;\n}\n.win-textbox::-ms-clear,\n.win-textbox::-ms-reveal {\n  padding-right: 2px;\n  margin-right: -8px;\n  margin-left: 2px;\n  margin-top: -8px;\n  margin-bottom: -8px;\n  width: 30px;\n  height: 32px;\n}\n.win-textbox:lang(ar)::-ms-clear,\n.win-textbox:lang(dv)::-ms-clear,\n.win-textbox:lang(fa)::-ms-clear,\n.win-textbox:lang(he)::-ms-clear,\n.win-textbox:lang(ku-Arab)::-ms-clear,\n.win-textbox:lang(pa-Arab)::-ms-clear,\n.win-textbox:lang(prs)::-ms-clear,\n.win-textbox:lang(ps)::-ms-clear,\n.win-textbox:lang(sd-Arab)::-ms-clear,\n.win-textbox:lang(syr)::-ms-clear,\n.win-textbox:lang(ug)::-ms-clear,\n.win-textbox:lang(ur)::-ms-clear,\n.win-textbox:lang(qps-plocm)::-ms-clear,\n.win-textbox:lang(ar)::-ms-reveal,\n.win-textbox:lang(dv)::-ms-reveal,\n.win-textbox:lang(fa)::-ms-reveal,\n.win-textbox:lang(he)::-ms-reveal,\n.win-textbox:lang(ku-Arab)::-ms-reveal,\n.win-textbox:lang(pa-Arab)::-ms-reveal,\n.win-textbox:lang(prs)::-ms-reveal,\n.win-textbox:lang(ps)::-ms-reveal,\n.win-textbox:lang(sd-Arab)::-ms-reveal,\n.win-textbox:lang(syr)::-ms-reveal,\n.win-textbox:lang(ug)::-ms-reveal,\n.win-textbox:lang(ur)::-ms-reveal,\n.win-textbox:lang(qps-plocm)::-ms-reveal {\n  margin-left: -8px;\n  margin-right: 2px;\n}\n.win-textarea {\n  resize: none;\n  overflow-y: auto;\n}\n.win-radio,\n.win-checkbox {\n  width: 20px;\n  height: 20px;\n  margin-right: 8px;\n  margin-top: 12px;\n  margin-bottom: 12px;\n}\n.win-radio:lang(ar),\n.win-checkbox:lang(ar),\n.win-radio:lang(dv),\n.win-checkbox:lang(dv),\n.win-radio:lang(fa),\n.win-checkbox:lang(fa),\n.win-radio:lang(he),\n.win-checkbox:lang(he),\n.win-radio:lang(ku-Arab),\n.win-checkbox:lang(ku-Arab),\n.win-radio:lang(pa-Arab),\n.win-checkbox:lang(pa-Arab),\n.win-radio:lang(prs),\n.win-checkbox:lang(prs),\n.win-radio:lang(ps),\n.win-checkbox:lang(ps),\n.win-radio:lang(sd-Arab),\n.win-checkbox:lang(sd-Arab),\n.win-radio:lang(syr),\n.win-checkbox:lang(syr),\n.win-radio:lang(ug),\n.win-checkbox:lang(ug),\n.win-radio:lang(ur),\n.win-checkbox:lang(ur),\n.win-radio:lang(qps-plocm),\n.win-checkbox:lang(qps-plocm) {\n  margin-left: 8px;\n  margin-right: 0px;\n}\n.win-radio::-ms-check,\n.win-checkbox::-ms-check {\n  border-style: solid;\n  display: inline-block;\n  border-width: 2px;\n  background-clip: border-box;\n}\n.win-button {\n  border-style: solid;\n  margin: 0px;\n  min-height: 32px;\n  min-width: 120px;\n  padding: 4px 8px;\n  border-width: 2px;\n  background-clip: border-box;\n  border-radius: 0;\n  touch-action: manipulation;\n  -webkit-appearance: none;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-button.win-button-file {\n  border: none;\n  min-width: 100px;\n  min-height: 20px;\n  width: 340px;\n  height: 32px;\n  padding: 0px;\n  margin: 7px 8px 21px 8px;\n  background-clip: padding-box;\n}\n.win-button.win-button-file::-ms-value {\n  margin: 0;\n  border-width: 2px;\n  border-style: solid;\n  border-right-style: none;\n  border-radius: 0;\n  background-clip: border-box;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-button.win-button-file:lang(ar)::-ms-value,\n.win-button.win-button-file:lang(dv)::-ms-value,\n.win-button.win-button-file:lang(fa)::-ms-value,\n.win-button.win-button-file:lang(he)::-ms-value,\n.win-button.win-button-file:lang(ku-Arab)::-ms-value,\n.win-button.win-button-file:lang(pa-Arab)::-ms-value,\n.win-button.win-button-file:lang(prs)::-ms-value,\n.win-button.win-button-file:lang(ps)::-ms-value,\n.win-button.win-button-file:lang(sd-Arab)::-ms-value,\n.win-button.win-button-file:lang(syr)::-ms-value,\n.win-button.win-button-file:lang(ug)::-ms-value,\n.win-button.win-button-file:lang(ur)::-ms-value,\n.win-button.win-button-file:lang(qps-plocm)::-ms-value {\n  border-left-style: none;\n  border-right-style: solid;\n}\n.win-button.win-button-file::-ms-browse {\n  margin: 0;\n  padding: 0 18px;\n  border-width: 2px;\n  border-style: solid;\n  background-clip: padding-box;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-dropdown {\n  min-width: 56px;\n  max-width: 368px;\n  min-height: 32px;\n  margin: 8px 0;\n  border-style: solid;\n  border-width: 2px;\n  background-clip: border-box;\n  background-image: none;\n  box-sizing: border-box;\n  border-radius: 0;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-dropdown::-ms-value {\n  padding: 5px 12px 7px 12px;\n  margin: 0;\n}\n.win-dropdown::-ms-expand {\n  border: none;\n  margin-right: 5px;\n  margin-left: 3px;\n  margin-bottom: -2px;\n  font-size: 20px;\n}\nselect[multiple].win-dropdown {\n  padding: 0 0 0 12px;\n  vertical-align: bottom;\n}\n.win-dropdown option {\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-progress-bar,\n.win-progress-ring,\n.win-ring {\n  width: 180px;\n  height: 4px;\n  -webkit-appearance: none;\n}\n.win-progress-bar:not(:indeterminate),\n.win-progress-ring:not(:indeterminate),\n.win-ring:not(:indeterminate) {\n  border-style: none;\n}\n.win-progress-bar::-ms-fill,\n.win-progress-ring::-ms-fill,\n.win-ring::-ms-fill {\n  border-style: none;\n}\n.win-progress-bar.win-medium,\n.win-progress-ring.win-medium,\n.win-ring.win-medium {\n  width: 296px;\n}\n.win-progress-bar.win-large,\n.win-progress-ring.win-large,\n.win-ring.win-large {\n  width: 100%;\n}\n.win-progress-bar:indeterminate::-webkit-progress-value,\n.win-progress-ring:indeterminate::-webkit-progress-value,\n.win-ring:indeterminate::-webkit-progress-value {\n  position: relative;\n  -webkit-animation: win-progress-indeterminate 3s linear infinite;\n}\n.win-progress-bar.win-paused:not(:indeterminate),\n.win-progress-ring.win-paused:not(:indeterminate),\n.win-ring.win-paused:not(:indeterminate) {\n  animation-name: win-progress-fade-out;\n  animation-duration: 3s;\n  animation-timing-function: cubic-bezier(0.03, 0.76, 0.31, 1);\n  opacity: 0.5;\n}\n.win-progress-bar.win-error::-ms-fill,\n.win-progress-ring.win-error::-ms-fill,\n.win-ring.win-error::-ms-fill {\n  opacity: 0;\n}\n.win-progress-ring,\n.win-ring {\n  width: 20px;\n  height: 20px;\n}\n.win-progress-ring:indeterminate::-ms-fill,\n.win-ring:indeterminate::-ms-fill {\n  animation-name: -ms-ring;\n}\n.win-progress-ring.win-medium,\n.win-ring.win-medium {\n  width: 40px;\n  height: 40px;\n}\n.win-progress-ring.win-large,\n.win-ring.win-large {\n  width: 60px;\n  height: 60px;\n}\n@-webkit-keyframes win-progress-indeterminate {\n  0% {\n    left: 0;\n    width: 25%;\n  }\n  50% {\n    left: calc(75%);\n    width: 25%;\n  }\n  75% {\n    left: calc(100%);\n    width: 0%;\n  }\n  75.1% {\n    left: 0;\n    width: 0%;\n  }\n  100% {\n    left: 0;\n    width: 25%;\n  }\n}\n@keyframes win-progress-fade-out {\n  from {\n    opacity: 1.0;\n  }\n  to {\n    opacity: 0.5;\n  }\n}\n.win-slider {\n  -webkit-appearance: none;\n  width: 280px;\n  height: 22px;\n  padding-top: 17px;\n  padding-bottom: 32px;\n}\n.win-slider::-ms-track {\n  height: 2px;\n  border-style: none;\n}\n.win-slider::-webkit-slider-runnable-track {\n  height: 2px;\n  border-style: none;\n}\n.win-slider::-moz-range-track {\n  height: 2px;\n  border-style: none;\n}\n.win-slider::-ms-thumb {\n  width: 24px;\n  height: 8px;\n  border-radius: 4px;\n  border-style: none;\n}\n.win-slider::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  margin-top: -4px;\n  width: 24px;\n  height: 8px;\n  border-radius: 4px;\n  border-style: none;\n}\n.win-slider::-moz-range-thumb {\n  width: 24px;\n  height: 8px;\n  border-radius: 4px;\n  border-style: none;\n}\n.win-slider.win-vertical {\n  writing-mode: bt-lr;\n  width: 22px;\n  height: 280px;\n}\n.win-slider.win-vertical::-ms-track {\n  width: 2px;\n  height: auto;\n}\n.win-slider.win-vertical::-ms-thumb {\n  width: 8px;\n  height: 24px;\n}\n.win-slider.win-vertical:lang(ar),\n.win-slider.win-vertical:lang(dv),\n.win-slider.win-vertical:lang(fa),\n.win-slider.win-vertical:lang(he),\n.win-slider.win-vertical:lang(ku-Arab),\n.win-slider.win-vertical:lang(pa-Arab),\n.win-slider.win-vertical:lang(prs),\n.win-slider.win-vertical:lang(ps),\n.win-slider.win-vertical:lang(sd-Arab),\n.win-slider.win-vertical:lang(syr),\n.win-slider.win-vertical:lang(ug),\n.win-slider.win-vertical:lang(ur),\n.win-slider.win-vertical:lang(qps-plocm) {\n  writing-mode: bt-rl;\n}\n.win-link {\n  text-decoration: underline;\n  cursor: pointer;\n  touch-action: manipulation;\n}\n.win-code {\n  font-family: \"Consolas\", \"Menlo\", \"Monaco\", \"Courier New\", monospace;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-type-ellipsis {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\nh1.win-type-ellipsis,\n.win-type-header.win-type-ellipsis,\n.win-h1.win-type-ellipsis {\n  line-height: 1.4286;\n}\nh2.win-type-ellipsis,\n.win-type-subheader.win-type-ellipsis,\n.win-h2.win-type-ellipsis {\n  line-height: 1.5;\n}\n.win-scrollview {\n  overflow-x: auto;\n  overflow-y: hidden;\n  height: 400px;\n  width: 100%;\n}\nh1.win-type-header,\nh2.win-type-subheader,\nh3.win-type-title,\nh4.win-type-subtitle,\nh5.win-type-base,\nh6.win-type-body,\nh1.win-h1,\nh2.win-h2,\nh3.win-h3,\nh4.win-h4,\nh5.win-h5,\nh6.win-h6 {\n  margin-top: 0px;\n  margin-bottom: 0px;\n}\n.win-type-body p,\np.win-type-body {\n  font-weight: 300;\n}\n.win-listview {\n  overflow: hidden;\n  height: 400px;\n}\n.win-listview .win-surface {\n  overflow: visible;\n}\n.win-listview > .win-viewport.win-horizontal .win-surface {\n  height: 100%;\n}\n.win-listview > .win-viewport.win-vertical .win-surface {\n  width: 100%;\n}\n.win-listview > .win-viewport {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  z-index: 0;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n  -webkit-overflow-scrolling: touch;\n  white-space: nowrap;\n}\n.win-listview > .win-viewport.win-horizontal {\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n.win-listview > .win-viewport.win-vertical {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.win-listview .win-itemscontainer {\n  overflow: hidden;\n}\n.win-listview .win-itemscontainer-padder {\n  width: 0;\n  height: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  overflow: hidden;\n}\n.win-listview > .win-horizontal .win-container {\n  margin: 10px 5px 0px 5px;\n}\n.win-listview > .win-vertical .win-container {\n  margin: 10px 24px 0px 7px;\n}\n.win-listview.win-rtl > .win-vertical .win-container {\n  margin: 10px 7px 0px 24px;\n}\n.win-listview .win-container,\n.win-listview .win-itembox,\n.win-itemcontainer.win-container,\n.win-itemcontainer .win-itembox {\n  cursor: default;\n  z-index: 0;\n}\n.win-listview .win-container {\n  touch-action: pan-x pan-y pinch-zoom;\n}\n.win-semanticzoom .win-listview > .win-viewport * {\n  touch-action: auto;\n}\n.win-semanticzoom .win-listview > .win-viewport.win-zooming-x {\n  overflow-x: visible;\n}\n.win-semanticzoom .win-listview > .win-viewport.win-zooming-y {\n  overflow-y: visible;\n}\n.win-listview .win-itembox,\n.win-itemcontainer .win-itembox {\n  width: 100%;\n  height: 100%;\n}\n.win-listview .win-item,\n.win-itemcontainer .win-item {\n  z-index: 1;\n}\n.win-listview .win-item,\n.win-itemcontainer .win-item {\n  overflow: hidden;\n  position: relative;\n}\n.win-listview > .win-vertical .win-item {\n  width: 100%;\n}\n.win-listview .win-item:focus,\n.win-itemcontainer .win-item:focus {\n  outline-style: none;\n}\n.win-listview .win-focusedoutline,\n.win-itemcontainer .win-focusedoutline {\n  width: calc(100% - 4px);\n  height: calc(100% - 4px);\n  left: 2px;\n  top: 2px;\n  position: absolute;\n  z-index: 5;\n  pointer-events: none;\n}\n.win-container.win-selected .win-selectionborder {\n  border-width: 2px;\n  border-style: solid;\n}\nhtml.win-hoverable .win-container.win-selected:hover .win-selectionborder {\n  border-width: 2px;\n  border-style: solid;\n}\nhtml.win-hoverable .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-itembox:hover::before {\n  position: absolute;\n  left: 0px;\n  top: 0px;\n  content: \"\";\n  width: calc(100% - 4px);\n  height: calc(100% - 4px);\n  pointer-events: none;\n  border-style: solid;\n  border-width: 2px;\n  z-index: 3;\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled .win-itembox:hover::before,\nhtml.win-hoverable .win-listview .win-itembox.win-selected:hover::before,\nhtml.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before,\nhtml.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before {\n  display: none;\n}\n.win-listview .win-groupheader {\n  padding: 10px 10px 10px 2px;\n  overflow: hidden;\n  outline-width: 0.01px;\n  outline-style: none;\n  float: left;\n  font-size: 34px;\n  font-weight: 200;\n  line-height: 1.176;\n}\n.win-listview .win-groupheadercontainer {\n  z-index: 1;\n  touch-action: pan-x pan-y pinch-zoom;\n  overflow: hidden;\n}\n.win-listview .win-horizontal .win-headercontainer,\n.win-listview .win-horizontal .win-footercontainer {\n  height: 100%;\n  display: inline-block;\n  overflow: hidden;\n  white-space: normal;\n}\n.win-listview .win-vertical .win-headercontainer,\n.win-listview .win-vertical .win-footercontainer {\n  width: 100%;\n  display: block;\n  overflow: hidden;\n  white-space: normal;\n}\n.win-listview .win-groupheader.win-focused {\n  outline-style: dotted;\n}\n.win-listview.win-rtl .win-groupheader {\n  padding-left: 10px;\n  padding-right: 2px;\n  float: right;\n}\n.win-listview.win-groups .win-horizontal .win-groupleader {\n  margin-left: 70px;\n}\n.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader {\n  margin-left: 0;\n  margin-right: 70px;\n}\n.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader,\n.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader {\n  margin-top: 70px;\n}\n.win-listview.win-groups > .win-vertical .win-surface.win-listlayout,\n.win-listview.win-groups > .win-vertical .win-surface.win-gridlayout {\n  margin-top: -65px;\n}\n.win-listview.win-groups > .win-horizontal .win-surface {\n  margin-left: -70px;\n}\n.win-listview.win-groups.win-rtl > .win-horizontal .win-surface {\n  margin-left: 0;\n  margin-right: -70px;\n}\n.win-listview .win-surface {\n  -webkit-margin-collapse: separate;\n  white-space: normal;\n}\n.win-surface ._win-proxy {\n  position: relative;\n  overflow: hidden;\n  width: 0;\n  height: 0;\n  touch-action: none;\n}\n.win-selectionborder {\n  position: absolute;\n  opacity: inherit;\n  z-index: 2;\n  pointer-events: none;\n}\n.win-container.win-selected .win-selectionborder {\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n.win-selectionbackground {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 0;\n}\n.win-selectioncheckmarkbackground {\n  position: absolute;\n  top: 2px;\n  right: 2px;\n  width: 14px;\n  height: 11px;\n  margin: 0;\n  padding: 0;\n  border-left-width: 2px;\n  border-right-width: 2px;\n  border-top-width: 4px;\n  border-bottom-width: 3px;\n  border-style: solid;\n  z-index: 3;\n  display: none;\n}\n.win-listview.win-rtl .win-selectioncheckmarkbackground,\n.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground {\n  left: 2px;\n  right: auto;\n}\n.win-selectionmode.win-itemcontainer .win-selectioncheckmarkbackground,\n.win-selectionmode.win-itemcontainer.win-selectionmode .win-selectioncheckmark,\n.win-selectionmode .win-itemcontainer .win-selectioncheckmarkbackground,\n.win-selectionmode .win-itemcontainer.win-selectionmode .win-selectioncheckmark,\n.win-listview .win-selectionmode .win-selectioncheckmarkbackground,\n.win-listview .win-selectionmode .win-selectioncheckmark {\n  display: block;\n}\n.win-selectioncheckmark {\n  position: absolute;\n  margin: 0;\n  padding: 2px;\n  right: 1px;\n  top: 1px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 14px;\n  z-index: 4;\n  line-height: 1;\n  display: none;\n}\n.win-rtl .win-selectioncheckmark {\n  right: auto;\n  left: 0px;\n}\n.win-selectionstylefilled.win-container,\n.win-selectionstylefilled .win-container {\n  overflow: hidden;\n}\n.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-selectionmode.win-itemcontainer.win-container .win-itembox::after,\n.win-listview .win-surface.win-selectionmode .win-itembox::after {\n  content: \"\";\n  position: absolute;\n  width: 18px;\n  height: 18px;\n  pointer-events: none;\n  right: 2px;\n  top: 2px;\n  z-index: 3;\n}\n.win-rtl .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-itemcontainer.win-rtl.win-selectionmode.win-container .win-itembox::after,\n.win-listview.win-rtl .win-surface.win-selectionmode .win-itembox::after {\n  right: auto;\n  left: 2px;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: translate(40px, 0px);\n  -webkit-transform: translate(40px, 0px);\n}\n.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-selectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: translate(-40px, 0px);\n  -webkit-transform: translate(-40px, 0px);\n}\n.win-listview.win-selectionstylefilled .win-surface.win-hidingselectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: none;\n  -webkit-transform: none;\n}\n.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-hideselectionmode .win-item {\n  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);\n  transform: none;\n  -webkit-transform: none;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {\n  left: 12px;\n  right: auto;\n  top: 50%;\n  margin-top: -9px;\n  display: block;\n  border: 2px solid;\n  width: 16px;\n  height: 16px;\n}\n.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-itembox::after {\n  left: auto;\n  right: 12px;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmarkbackground {\n  left: 12px;\n  top: 50%;\n  margin-top: -9px;\n  display: block;\n  border: 2px solid;\n  width: 16px;\n  height: 16px;\n}\n.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmarkbackground {\n  left: auto;\n  right: 12px;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmark {\n  left: 13px;\n  top: 50%;\n  margin-top: -8px;\n  display: block;\n  width: 14px;\n  height: 14px;\n}\n.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmark {\n  left: 0;\n  right: 10px;\n}\n.win-selectionmode .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-selected::after,\n.win-itemcontainer.win-selectionmode.win-selectionstylefilled.win-container .win-itembox.win-selected::after,\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox.win-nonselectable::after,\n.win-listview .win-surface.win-selectionmode .win-itembox.win-selected::after {\n  display: none;\n}\n.win-listview .win-progress {\n  left: 50%;\n  top: 50%;\n  width: 60px;\n  height: 60px;\n  margin-left: -30px;\n  margin-top: -30px;\n  z-index: 1;\n  position: absolute;\n}\n.win-listview .win-progress::-ms-fill {\n  animation-name: -ms-ring;\n}\n.win-listview .win-itemsblock {\n  overflow: hidden;\n}\n.win-listview .win-surface.win-nocssgrid.win-gridlayout,\n.win-listview .win-horizontal .win-nocssgrid.win-listlayout,\n.win-listview .win-vertical .win-nocssgrid.win-listlayout.win-headerpositionleft {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  vertical-align: top;\n}\n.win-listview .win-horizontal .win-surface.win-nocssgrid {\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-vertical .win-surface.win-nocssgrid {\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout {\n  display: block;\n}\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,\n.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,\n.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder {\n  height: 0;\n  width: 0;\n}\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer,\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer {\n  display: none;\n}\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout,\n.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout {\n  display: block;\n}\n.win-listview .win-listlayout .win-itemscontainer {\n  overflow: visible;\n}\n.win-listview .win-listlayout .win-itemsblock {\n  padding-bottom: 4px;\n  margin-bottom: -4px;\n}\n.win-listview > .win-vertical .win-listlayout.win-headerpositiontop .win-groupheader {\n  float: none;\n}\n.win-listview > .win-vertical .win-surface.win-listlayout {\n  margin-bottom: 5px;\n}\n.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface {\n  display: -ms-inline-grid;\n  -ms-grid-columns: auto 1fr;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer {\n  -ms-grid-column: 1;\n}\n.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer {\n  -ms-grid-column: 2;\n}\n.win-listview > .win-horizontal .win-surface.win-listlayout {\n  display: -ms-inline-grid;\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto;\n  vertical-align: top;\n}\n.win-listview .win-horizontal .win-listlayout .win-itemsblock {\n  height: 100%;\n}\n.win-listview .win-horizontal .win-listlayout .win-itemscontainer {\n  margin-bottom: 24px;\n}\n.win-listview .win-horizontal .win-listlayout .win-container {\n  height: calc(100% - 10px);\n}\n.win-listview > .win-horizontal .win-surface.win-listlayout.win-headerpositiontop {\n  -ms-grid-rows: auto 1fr;\n}\n.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer {\n  -ms-grid-row: 2;\n}\n.win-listview .win-gridlayout.win-surface {\n  display: -ms-inline-grid;\n  vertical-align: top;\n}\n.win-listview .win-gridlayout .win-container {\n  margin: 5px;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,\n.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {\n  -ms-grid-column: 1;\n}\n.win-listview.win-groups .win-gridlayout .win-itemscontainer,\n.win-listview.win-groups .win-gridlayout .win-groupheadercontainer {\n  display: none;\n}\n.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout {\n  display: block;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface {\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto 1fr;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer {\n  -ms-grid-row: 2;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface {\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer {\n  -ms-grid-row: 1;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface {\n  -ms-grid-columns: auto;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer {\n  -ms-grid-column: 1;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface {\n  -ms-grid-columns: auto 1fr;\n  -ms-grid-rows: auto;\n}\n.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer {\n  -ms-grid-column: 2;\n}\n.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n}\n.win-listview .win-horizontal .win-listlayout .win-itemscontainer,\n.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-listlayout .win-itemsblock,\n.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,\n.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-horizontal .win-itemscontainer-padder {\n  height: 100%;\n}\n.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  height: 100%;\n}\n.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout {\n  display: -ms-grid;\n}\n.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,\n.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {\n  width: 100%;\n}\n.win-listview .win-cellspanninggridlayout .win-container.win-laidout {\n  display: block;\n}\n.win-listview .win-cellspanninggridlayout .win-container {\n  display: none;\n}\n.win-listview .win-itembox {\n  position: relative;\n}\n.win-listview.win-dragover .win-itembox {\n  transform: scale(0.86);\n  -webkit-transform: scale(0.86);\n}\n.win-listview .win-itembox.win-dragsource,\n.win-itemcontainer .win-itembox.win-dragsource {\n  opacity: 0.5;\n  transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n  -webkit-transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n}\n.win-listview.win-dragover .win-itembox.win-dragsource {\n  opacity: 0;\n  transition: none;\n  -webkit-transition: none;\n}\nhtml.win-hoverable .win-listview.win-dragover .win-container:hover {\n  outline: none;\n}\n.win-listview .win-itembox {\n  transition: transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n  -webkit-transition: -webkit-transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;\n}\n.win-listview.win-groups > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {\n  margin-left: 70px;\n}\n.win-listview.win-groups.win-rtl > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {\n  margin-left: 0px;\n  margin-right: 70px;\n}\n.win-listview > .win-horizontal .win-surface.win-listlayout {\n  margin-left: 70px;\n}\n.win-listview.win-rtl > .win-horizontal .win-surface.win-listlayout {\n  margin-left: 0px;\n  margin-right: 70px;\n}\n.win-listview .win-vertical .win-gridlayout.win-surface {\n  margin-left: 20px;\n}\n.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface {\n  margin-left: 0px;\n  margin-right: 20px;\n}\n.win-itemcontainer .win-itembox,\n.win-itemcontainer.win-container {\n  position: relative;\n}\n.win-itemcontainer {\n  touch-action: pan-x pan-y pinch-zoom;\n}\nhtml.win-hoverable .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-itembox:hover::before {\n  opacity: 0.4;\n}\nhtml.win-hoverable .win-listview .win-pressed .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-pressed .win-itembox:hover::before,\nhtml.win-hoverable .win-listview .win-pressed.win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-pressed.win-itembox:hover::before {\n  opacity: 0.6;\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover,\nhtml.win-hoverable .win-selectionstylefilled .win-itemcontainer.win-container:hover {\n  outline: none;\n}\n.win-selectionstylefilled.win-itemcontainer .win-itembox,\n.win-selectionstylefilled .win-itemcontainer .win-itembox,\n.win-listview.win-selectionstylefilled .win-itembox {\n  background-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,\n.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {\n  border-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {\n  background-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,\n.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {\n  border-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-selected a,\n.win-listview.win-selectionstylefilled .win-selected progress,\n.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full,\n.win-itemcontainer.win-selectionstylefilled.win-selected a,\n.win-itemcontainer.win-selectionstylefilled.win-selected progress,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full {\n  color: #ffffff;\n}\n.win-listview.win-selectionstylefilled .win-selected.win-selected a:hover:active,\n.win-itemcontainer.win-selectionstylefilled.win-selected.win-selected a:hover:active {\n  color: rgba(255, 255, 255, 0.6);\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-selected a:hover,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected a:hover {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-listview.win-selectionstylefilled .win-selected button,\n.win-listview.win-selectionstylefilled .win-selected input[type=button],\n.win-listview.win-selectionstylefilled .win-selected input[type=reset],\n.win-listview.win-selectionstylefilled .win-selected input[type=text],\n.win-listview.win-selectionstylefilled .win-selected input[type=password],\n.win-listview.win-selectionstylefilled .win-selected input[type=email],\n.win-listview.win-selectionstylefilled .win-selected input[type=number],\n.win-listview.win-selectionstylefilled .win-selected input[type=tel],\n.win-listview.win-selectionstylefilled .win-selected input[type=url],\n.win-listview.win-selectionstylefilled .win-selected input[type=search],\n.win-listview.win-selectionstylefilled .win-selected input::-ms-check,\n.win-listview.win-selectionstylefilled .win-selected textarea,\n.win-listview.win-selectionstylefilled .win-selected .win-textarea,\n.win-listview.win-selectionstylefilled .win-selected select,\n.win-itemcontainer.win-selectionstylefilled.win-selected button,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search],\n.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,\n.win-itemcontainer.win-selectionstylefilled.win-selected textarea,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea,\n.win-itemcontainer.win-selectionstylefilled.win-selected select {\n  background-clip: border-box;\n  background-color: rgba(255, 255, 255, 0.8);\n  border-color: transparent;\n  color: #000000;\n}\n.win-listview.win-selectionstylefilled .win-selected button[type=submit],\n.win-listview.win-selectionstylefilled .win-selected input[type=submit],\n.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit],\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit] {\n  border-color: #ffffff;\n}\n.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower {\n  background-color: #ffffff;\n}\n.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb {\n  background-color: #000000;\n}\n.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,\n.win-listview.win-selectionstylefilled .win-selected progress,\n.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,\n.win-itemcontainer.win-selectionstylefilled.win-selected progress {\n  background-color: rgba(255, 255, 255, 0.16);\n}\n.win-listview.win-selectionstylefilled .win-selected progress:indeterminate,\n.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate {\n  background-color: transparent;\n}\n.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty {\n  color: rgba(255, 255, 255, 0.16);\n}\n.win-listview .win-viewport {\n  outline: none;\n}\n@media (-ms-high-contrast) {\n  .win-listview .win-groupheader {\n    color: WindowText;\n  }\n  .win-selectioncheckmark {\n    color: HighlightText;\n  }\n  .win-listview .win-focusedoutline,\n  .win-listview .win-groupheader,\n  .win-itemcontainer .win-focusedoutline {\n    outline-color: WindowText;\n  }\n  .win-listview.win-selectionstylefilled .win-itembox,\n  .win-itemcontainer.win-selectionstylefilled .win-itembox {\n    background-color: Window;\n    color: WindowText;\n  }\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-itembox,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-container.win-selected .win-itembox,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox,\n  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-itembox,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,\n  .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder {\n    border-color: Highlight;\n  }\n  .win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,\n  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {\n    border-color: transparent;\n  }\n  html.win-hoverable .win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder,\n  html.win-hoverable .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder {\n    border-color: Highlight;\n  }\n  .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,\n  .win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {\n    border-color: transparent;\n  }\n  .win-listview.win-selectionstylefilled .win-selected a,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover a,\n  .win-listview.win-selectionstylefilled .win-selected progress,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,\n  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star:after,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star:after,\n  .win-itemcontainer.win-selectionstylefilled.win-selected a,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover a,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star:after,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star:after {\n    color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selected input,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input,\n  .win-listview.win-selectionstylefilled .win-selected input::-ms-check,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-check,\n  .win-listview.win-selectionstylefilled .win-selected input::-ms-value,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-value,\n  .win-listview.win-selectionstylefilled .win-selected input::-ms-track,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-track,\n  .win-listview.win-selectionstylefilled .win-selected button,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover button,\n  .win-listview.win-selectionstylefilled .win-selected progress,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,\n  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,\n  .win-listview.win-selectionstylefilled .win-selected select,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover select,\n  .win-listview.win-selectionstylefilled .win-selected textarea,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover textarea,\n  .win-listview.win-selectionstylefilled.win-selected input,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-check,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-value,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-value,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-track,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-track,\n  .win-itemcontainer.win-selectionstylefilled.win-selected button,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover button,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,\n  .win-itemcontainer.win-selectionstylefilled.win-selected select,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover select,\n  .win-itemcontainer.win-selectionstylefilled.win-selected textarea,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover textarea {\n    border-color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-lower,\n  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-lower,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill {\n    background-color: HighlightText;\n  }\n  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-upper,\n  .win-listview.win-selectionstylefilled .win-selected progress,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,\n  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-upper,\n  .win-itemcontainer.win-selectionstylefilled.win-selected progress,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress {\n    background-color: Highlight;\n  }\n  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full:before,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-full:before,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full:before,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-full:before {\n    color: ButtonFace;\n  }\n  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty:before,\n  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-empty:before,\n  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty:before,\n  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-empty:before {\n    color: Highlight;\n  }\n  html.win-hoverable .win-listview .win-container:hover,\n  html.win-hoverable .win-itemcontainer.win-container:hover {\n    outline: Highlight solid 3px;\n  }\n}\n.win-flipview {\n  overflow: hidden;\n  height: 400px;\n}\n.win-flipview .win-surface {\n  -ms-scroll-chaining: none;\n}\n.win-flipview .win-navleft {\n  left: 0%;\n  top: 50%;\n  margin-top: -19px;\n}\n.win-flipview .win-navright {\n  left: 100%;\n  top: 50%;\n  margin-left: -20px;\n  margin-top: -19px;\n}\n.win-flipview .win-navtop {\n  left: 50%;\n  top: 0%;\n  margin-left: -35px;\n}\n.win-flipview .win-navbottom {\n  left: 50%;\n  top: 100%;\n  margin-left: -35px;\n  margin-top: -36px;\n}\n.win-flipview .win-navbutton {\n  touch-action: manipulation;\n  border: none;\n  width: 20px;\n  height: 36px;\n  z-index: 1;\n  position: absolute;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 16px;\n  padding: 0;\n  min-width: 0;\n}\n.win-flipview .win-item,\n.win-flipview .win-item > .win-template {\n  height: 100%;\n  width: 100%;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n}\n@media (-ms-high-contrast) {\n  .win-flipview .win-navbottom {\n    left: 50%;\n    top: 100%;\n    margin-left: -35px;\n    margin-top: -35px;\n  }\n  .win-flipview .win-navbutton {\n    background-color: ButtonFace;\n    color: ButtonText;\n    border: 2px solid ButtonText;\n    width: 65px;\n    height: 35px;\n  }\n  .win-flipview .win-navbutton.win-navbutton:hover:active,\n  .win-flipview .win-navbutton.win-navbutton:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  .win-flipview .win-navright {\n    margin-left: -65px;\n  }\n  html.win-hoverable .win-flipview .win-navbutton:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n}\n.win-datepicker {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  height: auto;\n  width: auto;\n}\n.win-datepicker select {\n  min-width: 80px;\n  margin-top: 4px;\n  margin-bottom: 4px;\n}\n.win-datepicker .win-datepicker-month {\n  margin-right: 20px;\n}\n.win-datepicker .win-datepicker-date.win-order0,\n.win-datepicker .win-datepicker-date.win-order1 {\n  margin-right: 20px;\n}\n.win-datepicker .win-datepicker-year.win-order0 {\n  margin-right: 20px;\n}\n.win-datepicker .win-datepicker-month:lang(ar),\n.win-datepicker .win-datepicker-month:lang(dv),\n.win-datepicker .win-datepicker-month:lang(fa),\n.win-datepicker .win-datepicker-month:lang(he),\n.win-datepicker .win-datepicker-month:lang(ku-Arab),\n.win-datepicker .win-datepicker-month:lang(pa-Arab),\n.win-datepicker .win-datepicker-month:lang(prs),\n.win-datepicker .win-datepicker-month:lang(ps),\n.win-datepicker .win-datepicker-month:lang(sd-Arab),\n.win-datepicker .win-datepicker-month:lang(syr),\n.win-datepicker .win-datepicker-month:lang(ug),\n.win-datepicker .win-datepicker-month:lang(ur),\n.win-datepicker .win-datepicker-month:lang(qps-plocm),\n.win-datepicker .win-datepicker-date.win-order0:lang(ar),\n.win-datepicker .win-datepicker-date.win-order0:lang(dv),\n.win-datepicker .win-datepicker-date.win-order0:lang(fa),\n.win-datepicker .win-datepicker-date.win-order0:lang(he),\n.win-datepicker .win-datepicker-date.win-order0:lang(ku-Arab),\n.win-datepicker .win-datepicker-date.win-order0:lang(pa-Arab),\n.win-datepicker .win-datepicker-date.win-order0:lang(prs),\n.win-datepicker .win-datepicker-date.win-order0:lang(ps),\n.win-datepicker .win-datepicker-date.win-order0:lang(sd-Arab),\n.win-datepicker .win-datepicker-date.win-order0:lang(syr),\n.win-datepicker .win-datepicker-date.win-order0:lang(ug),\n.win-datepicker .win-datepicker-date.win-order0:lang(ur),\n.win-datepicker .win-datepicker-date.win-order0:lang(qps-plocm),\n.win-datepicker .win-datepicker-date.win-order1:lang(ar),\n.win-datepicker .win-datepicker-date.win-order1:lang(dv),\n.win-datepicker .win-datepicker-date.win-order1:lang(fa),\n.win-datepicker .win-datepicker-date.win-order1:lang(he),\n.win-datepicker .win-datepicker-date.win-order1:lang(ku-Arab),\n.win-datepicker .win-datepicker-date.win-order1:lang(pa-Arab),\n.win-datepicker .win-datepicker-date.win-order1:lang(prs),\n.win-datepicker .win-datepicker-date.win-order1:lang(ps),\n.win-datepicker .win-datepicker-date.win-order1:lang(sd-Arab),\n.win-datepicker .win-datepicker-date.win-order1:lang(syr),\n.win-datepicker .win-datepicker-date.win-order1:lang(ug),\n.win-datepicker .win-datepicker-date.win-order1:lang(ur),\n.win-datepicker .win-datepicker-date.win-order1:lang(qps-plocm),\n.win-datepicker .win-datepicker-year.win-order0:lang(ar),\n.win-datepicker .win-datepicker-year.win-order0:lang(dv),\n.win-datepicker .win-datepicker-year.win-order0:lang(fa),\n.win-datepicker .win-datepicker-year.win-order0:lang(he),\n.win-datepicker .win-datepicker-year.win-order0:lang(ku-Arab),\n.win-datepicker .win-datepicker-year.win-order0:lang(pa-Arab),\n.win-datepicker .win-datepicker-year.win-order0:lang(prs),\n.win-datepicker .win-datepicker-year.win-order0:lang(ps),\n.win-datepicker .win-datepicker-year.win-order0:lang(sd-Arab),\n.win-datepicker .win-datepicker-year.win-order0:lang(syr),\n.win-datepicker .win-datepicker-year.win-order0:lang(ug),\n.win-datepicker .win-datepicker-year.win-order0:lang(ur),\n.win-datepicker .win-datepicker-year.win-order0:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: 20px;\n}\n.win-timepicker {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  height: auto;\n  width: auto;\n}\n.win-timepicker select {\n  min-width: 80px;\n  margin-top: 4px;\n  margin-bottom: 4px;\n}\n.win-timepicker .win-timepicker-hour {\n  margin-right: 20px;\n}\n.win-timepicker .win-timepicker-period.win-order0 {\n  margin-right: 20px;\n}\n.win-timepicker .win-timepicker-minute.win-order1 {\n  margin-right: 20px;\n}\n.win-timepicker .win-timepicker-period.win-order0:lang(ar),\n.win-timepicker .win-timepicker-period.win-order0:lang(dv),\n.win-timepicker .win-timepicker-period.win-order0:lang(fa),\n.win-timepicker .win-timepicker-period.win-order0:lang(he),\n.win-timepicker .win-timepicker-period.win-order0:lang(ku-Arab),\n.win-timepicker .win-timepicker-period.win-order0:lang(pa-Arab),\n.win-timepicker .win-timepicker-period.win-order0:lang(prs),\n.win-timepicker .win-timepicker-period.win-order0:lang(ps),\n.win-timepicker .win-timepicker-period.win-order0:lang(sd-Arab),\n.win-timepicker .win-timepicker-period.win-order0:lang(syr),\n.win-timepicker .win-timepicker-period.win-order0:lang(ug),\n.win-timepicker .win-timepicker-period.win-order0:lang(ur),\n.win-timepicker .win-timepicker-period.win-order0:lang(qps-plocm),\n.win-timepicker .win-timepicker-hour:lang(ar),\n.win-timepicker .win-timepicker-hour:lang(dv),\n.win-timepicker .win-timepicker-hour:lang(fa),\n.win-timepicker .win-timepicker-hour:lang(he),\n.win-timepicker .win-timepicker-hour:lang(ku-Arab),\n.win-timepicker .win-timepicker-hour:lang(pa-Arab),\n.win-timepicker .win-timepicker-hour:lang(prs),\n.win-timepicker .win-timepicker-hour:lang(ps),\n.win-timepicker .win-timepicker-hour:lang(sd-Arab),\n.win-timepicker .win-timepicker-hour:lang(syr),\n.win-timepicker .win-timepicker-hour:lang(ug),\n.win-timepicker .win-timepicker-hour:lang(ur),\n.win-timepicker .win-timepicker-hour:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: 20px;\n}\n.win-timepicker .win-timepicker-minute.win-order1:lang(ar),\n.win-timepicker .win-timepicker-minute.win-order1:lang(dv),\n.win-timepicker .win-timepicker-minute.win-order1:lang(fa),\n.win-timepicker .win-timepicker-minute.win-order1:lang(he),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ku-Arab),\n.win-timepicker .win-timepicker-minute.win-order1:lang(pa-Arab),\n.win-timepicker .win-timepicker-minute.win-order1:lang(prs),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ps),\n.win-timepicker .win-timepicker-minute.win-order1:lang(sd-Arab),\n.win-timepicker .win-timepicker-minute.win-order1:lang(syr),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ug),\n.win-timepicker .win-timepicker-minute.win-order1:lang(ur),\n.win-timepicker .win-timepicker-minute.win-order1:lang(qps-plocm),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ar),\n.win-timepicker .win-timepicker-minute.win-order0:lang(dv),\n.win-timepicker .win-timepicker-minute.win-order0:lang(fa),\n.win-timepicker .win-timepicker-minute.win-order0:lang(he),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ku-Arab),\n.win-timepicker .win-timepicker-minute.win-order0:lang(pa-Arab),\n.win-timepicker .win-timepicker-minute.win-order0:lang(prs),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ps),\n.win-timepicker .win-timepicker-minute.win-order0:lang(sd-Arab),\n.win-timepicker .win-timepicker-minute.win-order0:lang(syr),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ug),\n.win-timepicker .win-timepicker-minute.win-order0:lang(ur),\n.win-timepicker .win-timepicker-minute.win-order0:lang(qps-plocm) {\n  margin-left: 20px;\n  margin-right: 0;\n}\nbody > .win-navigation-backbutton {\n  position: absolute;\n  top: 50px;\n  left: 20px;\n}\n.win-backbutton,\n.win-navigation-backbutton,\n.win-back {\n  touch-action: manipulation;\n  display: inline-block;\n  min-width: 0;\n  min-height: 0;\n  padding: 0;\n  text-align: center;\n  width: 41px;\n  height: 41px;\n  font-size: 24px;\n  line-height: 41px;\n  vertical-align: baseline;\n}\n.win-backbutton::before,\n.win-back::before {\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-weight: normal;\n  content: \"\\E0D5\";\n  vertical-align: 50%;\n}\n.win-backbutton:lang(ar)::before,\n.win-backbutton:lang(dv)::before,\n.win-backbutton:lang(fa)::before,\n.win-backbutton:lang(he)::before,\n.win-backbutton:lang(ku-Arab)::before,\n.win-backbutton:lang(pa-Arab)::before,\n.win-backbutton:lang(prs)::before,\n.win-backbutton:lang(ps)::before,\n.win-backbutton:lang(sd-Arab)::before,\n.win-backbutton:lang(syr)::before,\n.win-backbutton:lang(ug)::before,\n.win-backbutton:lang(ur)::before,\n.win-backbutton:lang(qps-plocm)::before,\n.win-back:lang(ar)::before,\n.win-back:lang(dv)::before,\n.win-back:lang(fa)::before,\n.win-back:lang(he)::before,\n.win-back:lang(ku-Arab)::before,\n.win-back:lang(pa-Arab)::before,\n.win-back:lang(prs)::before,\n.win-back:lang(ps)::before,\n.win-back:lang(sd-Arab)::before,\n.win-back:lang(syr)::before,\n.win-back:lang(ug)::before,\n.win-back:lang(ur)::before,\n.win-back:lang(qps-plocm)::before {\n  content: \"\\E0AE\";\n}\nbutton.win-navigation-backbutton,\nbutton.win-navigation-backbutton:active,\nhtml.win-hoverable button.win-navigation-backbutton:enabled:hover,\nbutton.win-navigation-backbutton:enabled:hover:active {\n  background-color: transparent;\n  border: none;\n}\n@media (-ms-high-contrast) {\n  button.win-navigation-backbutton,\n  button.win-navigation-backbutton:active,\n  html.win-hoverable button.win-navigation-backbutton:enabled:hover,\n  button.win-navigation-backbutton:enabled:hover:active {\n    /* Overwrite default background and border styles from BackButton control's <button> element */\n    background-color: transparent;\n    border: none;\n  }\n  .win-backbutton,\n  .win-back {\n    background-color: ButtonFace;\n    border-color: ButtonText;\n    color: ButtonText;\n  }\n  .win-backbutton.win-backbutton:enabled:hover:active,\n  .win-navigation-backbutton.win-navigation-backbutton:enabled:hover:active .win-back {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  .win-backbutton:disabled,\n  .win-navigation-backbutton:disabled .win-back,\n  .win-backbutton:disabled:active,\n  .win-navigation-backbutton:disabled:active .win-back {\n    background-color: ButtonFace;\n    border-color: GrayText;\n    color: GrayText;\n  }\n  .win-backbutton:-ms-keyboard-active,\n  .win-navigation-backbutton:-ms-keyboard-active .win-back {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  html.win-hoverable .win-backbutton:enabled:hover,\n  html.win-hoverable .win-navigation-backbutton:enabled:hover .win-back {\n    background-color: Highlight;\n    border-color: ButtonText;\n    color: HighlightText;\n  }\n}\n.win-tooltip {\n  display: block;\n  position: fixed;\n  top: 30px;\n  left: 30px;\n  max-width: 320px;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 4px 7px 6px 7px;\n  border-style: solid;\n  border-width: 1px;\n  z-index: 9999;\n  word-wrap: break-word;\n  animation-fill-mode: both;\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 1.167;\n}\n.win-tooltip-phantom {\n  display: block;\n  position: fixed;\n  top: 30px;\n  left: 30px;\n  background-color: transparent;\n  border-width: 0;\n  margin: 0;\n  padding: 0;\n}\n@media (-ms-high-contrast) {\n  .win-tooltip {\n    background-color: Window;\n    border-color: WindowText;\n    color: WindowText;\n  }\n}\n.win-rating {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex-pack: self;\n  -webkit-justify-content: self;\n  justify-content: self;\n  -ms-flex-align: stretch;\n  -webkit-align-items: stretch;\n  align-items: stretch;\n  height: auto;\n  width: auto;\n  white-space: normal;\n  outline: 0;\n}\n.win-rating .win-star {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  height: 24px;\n  width: 24px;\n  padding: 9px 10px 11px 10px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 24px;\n  overflow: hidden;\n  text-indent: 0;\n  line-height: 1;\n  cursor: default;\n  position: relative;\n  letter-spacing: 0;\n  -ms-touch-action: none;\n  touch-action: none;\n}\n.win-rating.win-small .win-star {\n  width: 12px;\n  height: 12px;\n  font-size: 12px;\n  padding: 3px 4px 5px 4px;\n}\n.win-rating .win-star:before {\n  content: \"\\E082\";\n}\n.win-rating .win-star.win-disabled {\n  cursor: default;\n  -ms-touch-action: auto;\n  touch-action: auto;\n}\n@media (-ms-high-contrast) {\n  .win-rating .win-star:before {\n    content: \"\\E082\" !important;\n  }\n  .win-rating .win-star.win-full {\n    color: HighLight;\n  }\n  .win-rating .win-star.win-tentative.win-full {\n    color: ButtonText;\n  }\n  .win-rating .win-star.win-empty {\n    color: ButtonFace;\n  }\n  .win-rating .win-star:after {\n    content: \"\\E224\" !important;\n    position: relative;\n    top: -100%;\n    color: ButtonText;\n  }\n}\n.win-toggleswitch {\n  outline: 0;\n}\n.win-toggleswitch .win-toggleswitch-header {\n  max-width: 470px;\n  margin-bottom: 14px;\n  margin-top: 22px;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-toggleswitch .win-toggleswitch-values {\n  display: inline-block;\n  vertical-align: top;\n}\n.win-toggleswitch .win-toggleswitch-value {\n  min-width: 65px;\n  margin-left: 12px;\n  height: 16px;\n  vertical-align: top;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 16px;\n}\n.win-toggleswitch .win-toggleswitch-description {\n  font-size: 12px;\n  width: 22em;\n  margin-top: 28px;\n  display: none;\n}\n.win-toggleswitch .win-toggleswitch-clickregion {\n  display: inline-block;\n  touch-action: none;\n  -ms-user-select: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n.win-toggleswitch .win-toggleswitch-track {\n  position: relative;\n  display: inline-block;\n  width: 44px;\n  height: 16px;\n  border-style: solid;\n  border-width: 2px;\n  border-radius: 8px;\n  box-sizing: border-box;\n}\n.win-toggleswitch .win-toggleswitch-thumb {\n  position: absolute;\n  top: 2px;\n  display: inline-block;\n  width: 20px;\n  height: 8px;\n  border-radius: 4px;\n  -webkit-transition: left 0.1s;\n  transition: left 0.1s;\n}\n.win-toggleswitch:focus .win-toggleswitch-track {\n  outline-width: 1px;\n  outline-style: dotted;\n}\n.win-toggleswitch.win-toggleswitch-dragging .win-toggleswitch-thumb {\n  -webkit-transition: none;\n  transition: none;\n}\n.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-value-on {\n  visibility: hidden;\n  height: 0;\n  font-size: 0;\n  line-height: 0;\n}\n.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-value-off {\n  visibility: hidden;\n  height: 0;\n  font-size: 0;\n  line-height: 0;\n}\n.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-thumb {\n  left: 18px;\n}\n.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-thumb {\n  left: 2px;\n}\n.win-toggleswitch:lang(ar),\n.win-toggleswitch:lang(dv),\n.win-toggleswitch:lang(fa),\n.win-toggleswitch:lang(he),\n.win-toggleswitch:lang(ku-Arab),\n.win-toggleswitch:lang(pa-Arab),\n.win-toggleswitch:lang(prs),\n.win-toggleswitch:lang(ps),\n.win-toggleswitch:lang(sd-Arab),\n.win-toggleswitch:lang(syr),\n.win-toggleswitch:lang(ug),\n.win-toggleswitch:lang(ur),\n.win-toggleswitch:lang(qps-plocm) {\n  direction: rtl;\n}\n.win-toggleswitch:lang(ar).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(dv).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(fa).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(he).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ku-Arab).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(pa-Arab).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(prs).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ps).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(sd-Arab).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(syr).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ug).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ur).win-toggleswitch-on .win-toggleswitch-thumb,\n.win-toggleswitch:lang(qps-plocm).win-toggleswitch-on .win-toggleswitch-thumb {\n  left: 2px;\n}\n.win-toggleswitch:lang(ar).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(dv).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(fa).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(he).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ku-Arab).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(pa-Arab).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(prs).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ps).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(sd-Arab).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(syr).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ug).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(ur).win-toggleswitch-off .win-toggleswitch-thumb,\n.win-toggleswitch:lang(qps-plocm).win-toggleswitch-off .win-toggleswitch-thumb {\n  left: 18px;\n}\n.win-semanticzoom {\n  touch-action: pan-x pan-y double-tap-zoom;\n  height: 400px;\n}\n.win-semanticzoom .win-listview > .win-viewport * {\n  touch-action: auto;\n}\n.win-semanticzoom * {\n  touch-action: inherit;\n}\n.win-semanticzoom-button {\n  z-index: 100;\n  position: absolute;\n  min-width: 25px;\n  min-height: 25px;\n  width: 25px;\n  height: 25px;\n  padding: 0px;\n  bottom: 21px;\n  touch-action: none;\n}\n.win-semanticzoom-button::before {\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-weight: normal;\n  font-size: 11px;\n  content: \"\\E0B8\";\n  /* minus sign */\n}\n.win-semanticzoom-button-location {\n  left: auto;\n  right: 4px;\n}\n.win-semanticzoom-button-location:lang(ar),\n.win-semanticzoom-button-location:lang(dv),\n.win-semanticzoom-button-location:lang(fa),\n.win-semanticzoom-button-location:lang(he),\n.win-semanticzoom-button-location:lang(ku-Arab),\n.win-semanticzoom-button-location:lang(pa-Arab),\n.win-semanticzoom-button-location:lang(prs),\n.win-semanticzoom-button-location:lang(ps),\n.win-semanticzoom-button-location:lang(sd-Arab),\n.win-semanticzoom-button-location:lang(syr),\n.win-semanticzoom-button-location:lang(ug),\n.win-semanticzoom-button-location:lang(ur),\n.win-semanticzoom-button-location:lang(qps-plocm) {\n  left: 4px;\n  right: auto;\n}\n@media (-ms-high-contrast) {\n  .win-semanticzoom-button {\n    background-color: ButtonFace;\n    border-color: ButtonText;\n    color: ButtonText;\n  }\n  .win-semanticzoom-button.win-semanticzoom-button:hover:active {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  .win-semanticzoom-button:-ms-keyboard-active {\n    background-clip: border-box;\n    background-color: ButtonText;\n    border-color: transparent;\n    color: ButtonFace;\n  }\n  html.win-hoverable win-semanticzoom-button:hover {\n    background-color: Highlight;\n    border-color: ButtonText;\n    color: HighlightText;\n  }\n}\n.win-pivot {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: none;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n  height: 100%;\n  width: 100%;\n  overflow: hidden;\n  -ms-scroll-limit-x-max: 0px;\n  touch-action: manipulation;\n}\n.win-pivot .win-pivot-navbutton {\n  touch-action: manipulation;\n  position: absolute;\n  width: 20px;\n  height: 36px;\n  padding: 0px;\n  margin: 0px;\n  top: 10px;\n  min-width: 0px;\n  border-width: 0px;\n  cursor: pointer;\n  opacity: 0;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-pivot .win-pivot-headers.win-pivot-shownavbuttons .win-pivot-navbutton {\n  opacity: 1;\n}\n.win-pivot .win-pivot-headers .win-pivot-navbutton-prev:before {\n  content: \"\\E096\";\n}\n.win-pivot .win-pivot-headers .win-pivot-navbutton-next:before {\n  content: \"\\E09B\";\n}\n.win-pivot .win-pivot-title {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  font-family: \"Segoe UI\", sans-serif, \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 15px;\n  font-weight: bold;\n  white-space: nowrap;\n  margin: 14px 0 13px 24px;\n}\n.win-pivot .win-pivot-title:lang(ar),\n.win-pivot .win-pivot-title:lang(dv),\n.win-pivot .win-pivot-title:lang(fa),\n.win-pivot .win-pivot-title:lang(he),\n.win-pivot .win-pivot-title:lang(ku-Arab),\n.win-pivot .win-pivot-title:lang(pa-Arab),\n.win-pivot .win-pivot-title:lang(prs),\n.win-pivot .win-pivot-title:lang(ps),\n.win-pivot .win-pivot-title:lang(sd-Arab),\n.win-pivot .win-pivot-title:lang(syr),\n.win-pivot .win-pivot-title:lang(ug),\n.win-pivot .win-pivot-title:lang(ur),\n.win-pivot .win-pivot-title:lang(qps-plocm) {\n  margin: 14px 24px 13px 0;\n}\n.win-pivot > .win-pivot-item {\n  /*\n        Hide the pivot items defined declaratively until we reparent them to ensure correct\n        measuring and to avoid showing unprocessed content in the wrong location.\n        */\n  display: none;\n}\n.win-pivot .win-pivot-header-area {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n}\n.win-pivot .win-pivot-header-leftcustom,\n.win-pivot .win-pivot-header-rightcustom {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  margin-top: 13px;\n}\n.win-pivot .win-pivot-header-items {\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  overflow-x: hidden;\n  padding: 1px;\n}\n.win-pivot .win-pivot-headers {\n  white-space: nowrap;\n  position: relative;\n  overflow-y: visible;\n  height: 48px;\n  touch-action: none;\n  -ms-touch-action: none;\n  outline: 0;\n}\n.win-pivot .win-pivot-headers.win-keyboard:focus {\n  outline-style: dotted;\n  outline-width: 1px;\n}\n.win-pivot .win-pivot-header,\n.win-pivot .win-pivot-header.win-pivot-header:hover:active {\n  touch-action: manipulation;\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 1.167;\n  display: inline-block;\n  transition: opacity linear 167ms;\n  -webkit-transition: opacity linear 167ms;\n  overflow: hidden;\n  height: 30px;\n  border: 0;\n  padding: 0;\n  outline: 0;\n  margin: 12px 12px 0px 12px;\n  min-height: 0;\n  min-width: 0;\n}\n.win-pivot.win-pivot-locked .win-pivot-header {\n  opacity: 0;\n  visibility: hidden;\n}\n.win-pivot .win-pivot-header.win-pivot-header-selected,\n.win-pivot.win-pivot-locked .win-pivot-header.win-pivot-header-selected {\n  opacity: 1.0;\n  visibility: inherit;\n}\n.win-pivot .win-pivot-viewport {\n  /* Overlap the headers but not the title */\n  height: 100%;\n  overflow-x: auto;\n  overflow-y: hidden;\n  -ms-scroll-snap-type: mandatory;\n  -ms-scroll-snap-points-x: snapInterval(0%, 100%);\n  -ms-overflow-style: none;\n  /* The following 3 styles take advantage of a Trident bug to make the viewport pannable on the header track. The viewport is extended over the\n            header track space, and position: relative allows interacting with it as if the viewport was drawn over the header track.\n        */\n  position: relative;\n  padding-top: 48px;\n  margin-top: -48px;\n}\n.win-pivot.win-pivot-mouse .win-pivot-viewport {\n  padding-top: 0px;\n  margin-top: 0px;\n}\n.win-pivot.win-pivot-locked .win-pivot-viewport {\n  overflow: hidden;\n}\n.win-pivot .win-pivot-surface {\n  /* 49 before, 1 current, 50 after */\n  width: 10000%;\n  height: 100%;\n  position: relative;\n}\nhtml.win-hoverable .win-pivot button.win-pivot-header:hover {\n  background-color: transparent;\n  border: 0;\n  padding: 0;\n  letter-spacing: 0px;\n  margin: 12px 12px 0px 12px;\n  min-height: 0;\n  min-width: 0;\n}\nhtml.win-hoverable .win-pivot .win-pivot-navbutton:hover {\n  margin: 0px;\n  padding: 0px;\n  border-width: 0px;\n  cursor: pointer;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n/*\n    PivotItem\n*/\n.win-pivot-item {\n  position: absolute;\n  top: 0px;\n  bottom: 0;\n  /* Since the surface is 100x in width, 1% here means the size of the viewport. */\n  width: 1%;\n}\n.win-pivot-item .win-pivot-item-content {\n  height: 100%;\n  overflow-y: auto;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n  padding: 0px 24px;\n}\n/*\n    Modified styles for when the Pivot is in nosnap mode\n*/\n.win-pivot.win-pivot-nosnap .win-pivot-viewport {\n  padding-top: 0px;\n  margin-top: 0px;\n  overflow: hidden;\n}\n.win-pivot.win-pivot-nosnap .win-pivot-surface {\n  width: 100%;\n  position: static;\n}\n.win-pivot.win-pivot-nosnap .win-pivot-item {\n  width: 100%;\n}\n.win-hub {\n  height: 100%;\n  width: 100%;\n  position: relative;\n}\n.win-hub-progress {\n  position: absolute;\n  top: 10px;\n  width: 100%;\n  z-index: 1;\n}\n.win-hub-viewport {\n  height: 100%;\n  width: 100%;\n  -ms-scroll-snap-type: proximity;\n  -webkit-overflow-scrolling: touch;\n}\n.win-hub-horizontal .win-hub-viewport {\n  overflow-x: auto;\n  overflow-y: hidden;\n  white-space: nowrap;\n}\n.win-hub-vertical .win-hub-viewport {\n  position: relative;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n.win-hub-surface {\n  display: inline-block;\n}\n.win-hub-vertical .win-hub-surface {\n  width: 100%;\n  padding: 0px 12px 8px 12px;\n}\n.win-hub-horizontal .win-hub-surface {\n  height: 100%;\n  padding: 0px 0px 0px 12px;\n}\n.win-hub-section {\n  display: inline-block;\n  padding: 0px 24px 0px 0px;\n  vertical-align: top;\n  white-space: normal;\n}\n.win-hub-horizontal .win-hub-section {\n  height: 100%;\n}\n.win-hub-horizontal .win-hub-section-header {\n  margin-top: 44px;\n}\n.win-hub-vertical .win-hub-section {\n  width: calc(100% - 24px);\n}\n.win-hub-vertical .win-hub-section-header {\n  margin-top: 16px;\n}\n.win-hub-section-header {\n  margin: 4px 0px 9px 0px;\n  height: 28px;\n}\nbutton.win-hub-section-header-tabstop,\nhtml.win-hoverable button.win-hub-section-header-tabstop:hover,\nbutton.win-hub-section-header-tabstop:hover:active {\n  touch-action: manipulation;\n  width: 100%;\n  background-color: transparent;\n  border: 0;\n  min-height: 0;\n  min-width: 0;\n  max-width: 100%;\n  padding: 0;\n}\nbutton.win-hub-section-header-tabstop:focus {\n  outline: none;\n}\nbutton.win-hub-section-header-tabstop:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-hub-section-header-wrapper {\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-align: stretch;\n  -webkit-align-items: stretch;\n  align-items: stretch;\n  width: 100%;\n  outline: none;\n}\n.win-hub-section-header-content {\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: left;\n  vertical-align: bottom;\n  padding-top: 1px;\n  overflow: hidden;\n  text-overflow: clip;\n  white-space: nowrap;\n  line-height: 1.5;\n}\n.win-hub-section-header-content:lang(ar),\n.win-hub-section-header-content:lang(dv),\n.win-hub-section-header-content:lang(fa),\n.win-hub-section-header-content:lang(he),\n.win-hub-section-header-content:lang(ku-Arab),\n.win-hub-section-header-content:lang(pa-Arab),\n.win-hub-section-header-content:lang(prs),\n.win-hub-section-header-content:lang(ps),\n.win-hub-section-header-content:lang(sd-Arab),\n.win-hub-section-header-content:lang(syr),\n.win-hub-section-header-content:lang(ug),\n.win-hub-section-header-content:lang(ur),\n.win-hub-section-header-content:lang(qps-plocm) {\n  text-align: right;\n}\n.win-hub-section-header-chevron {\n  display: none;\n}\n.win-hub-section-header-interactive .win-hub-section-header-chevron {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: inline-block;\n  margin-left: 24px;\n  line-height: 1.5;\n  padding-top: 7px;\n  text-align: right;\n  vertical-align: bottom;\n}\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ar),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(dv),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(fa),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(he),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ku-Arab),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(pa-Arab),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(prs),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ps),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(sd-Arab),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(syr),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ug),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ur),\n.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(qps-plocm) {\n  text-align: left;\n  margin-left: 0;\n  margin-right: 24px;\n}\n.win-hub-horizontal .win-hub-section-content {\n  height: calc(100% - 81px);\n}\n.win-hub-vertical .win-hub-section-content {\n  width: 100%;\n}\n@media (-ms-high-contrast) {\n  button.win-hub-section-header-tabstop,\n  html.win-hoverable button.win-hub-section-header-tabstop:hover,\n  button.win-hub-section-header-tabstop:hover:active {\n    background-color: transparent;\n    color: WindowText;\n  }\n  button.win-hub-section-header-tabstop:-ms-keyboard-active {\n    color: WindowText;\n  }\n  html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover,\n  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active {\n    color: -ms-hotlight;\n  }\n  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {\n    color: -ms-hotlight;\n  }\n}\n.win-clickeater {\n  background-color: transparent;\n  width: 110%;\n  height: 110%;\n  left: -5%;\n  top: -5%;\n  position: fixed;\n  touch-action: none;\n  outline: 1px solid Purple;\n  /*Necessary to block passthrough over webviews*/\n  -ms-high-contrast-adjust: none;\n}\n/*\nCommand buttons.\n*/\nbutton.win-command {\n  touch-action: manipulation;\n  background: none;\n  background-clip: border-box;\n  height: auto;\n  padding: 0;\n  margin: 0;\n  border: 1px dotted;\n  /* reserve focus rect */\n  min-width: 40px;\n  min-height: 48px;\n  text-align: center;\n  font-size: 12px;\n  line-height: 16px;\n  font-weight: normal;\n  overflow: visible;\n  /* Commands are lrtb */\n  writing-mode: lr-tb;\n  position: relative;\n  z-index: 0;\n}\nbutton.win-command::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton:lang(ar),\nbutton:lang(dv),\nbutton:lang(fa),\nbutton:lang(he),\nbutton:lang(ku-Arab),\nbutton:lang(pa-Arab),\nbutton:lang(prs),\nbutton:lang(ps),\nbutton:lang(sd-Arab),\nbutton:lang(syr),\nbutton:lang(ug),\nbutton:lang(ur),\nbutton:lang(qps-plocm) {\n  writing-mode: rl-tb;\n}\n/*\nAlways hide the outline, not just when :focus is applied.\nhttps://github.com/winjs/winjs/issues/859\n*/\nbutton.win-command {\n  outline: none;\n}\n/*\nCommand button icons.\n*/\n.win-commandicon {\n  display: block;\n  margin: 11px 21px;\n  /* left/right margin: 22px = 1px focus rect + 21px. Affects margin-top of  button.win-command .win-label */\n  min-width: 0;\n  min-height: 0;\n  padding: 0;\n  /* Normal sizing */\n  width: 24px;\n  height: 24px;\n  box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  cursor: default;\n  position: relative;\n  outline: none;\n}\n.win-commandimage {\n  /* Default font for glyphs. */\n  font-family: \"Segoe UI Command\", \"Symbols\";\n  letter-spacing: 0;\n  /* Applications provide their own content, like &#xE0D5;. */\n  vertical-align: middle;\n  font-size: 20px;\n  margin: 0;\n  line-height: 24px;\n  /* line-height must match the content box height */\n  background-position: 0 0;\n  background-origin: border-box;\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  background-size: 96px 48px;\n  outline: none;\n}\n.win-commandimage.win-commandglyph {\n  position: absolute;\n  left: 0;\n}\n/*\nOffsets for sprite versions.\n*/\nhtml.win-hoverable button:enabled:hover .win-commandimage,\nbutton:active .win-commandimage {\n  background-position: -24px 0;\n}\nbutton:enabled:hover:active .win-commandimage.win-commandimage {\n  background-position: -48px 0;\n}\nbutton:-ms-keyboard-active .win-commandimage {\n  background-position: -48px 0;\n}\nbutton:disabled .win-commandimage,\nbutton:disabled:active .win-commandimage {\n  background-position: -72px 0;\n}\n/*\nOffsets for sprite versions in selected state.\n*/\nbutton[aria-checked=true] .win-commandimage {\n  background-position: 0 -24px;\n}\nhtml.win-hoverable button[aria-checked=true]:enabled:hover .win-commandimage,\nbutton[aria-checked=true]:active .win-commandimage {\n  background-position: -24px -24px;\n}\nbutton[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n  background-position: -48px -24px;\n}\nbutton[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n  background-position: -48px -24px;\n}\nbutton[aria-checked=true]:disabled .win-commandimage,\nbutton[aria-checked=true]:disabled:active .win-commandimage {\n  background-position: -72px -24px;\n}\n/*\nCommand button labels.\n*/\nbutton.win-command .win-label {\n  font-family: \"Segoe UI\", sans-serif, \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 12px;\n  font-weight: 400;\n  line-height: 1.167;\n  position: relative;\n  line-height: 16px;\n  display: block;\n  max-width: 66px;\n  /* 68px button, but allow for 2*1px for focus border on each side */\n  margin-top: -10px;\n  /* 2px = 12px margin-bottom of .win-commandicon  - 10px*/\n  margin-bottom: 6px;\n  padding: 0;\n  overflow: hidden;\n  word-wrap: break-word;\n  word-break: keep-all;\n  outline: none;\n}\n/*\nAppBarCommand separator types.\n*/\nhr.win-command {\n  display: inline-block;\n  padding: 0;\n  margin: 12px 16px;\n  width: 2px;\n  height: 24px;\n  border: 0;\n  vertical-align: top;\n}\n/*\nAppBarCommand content types.\n*/\ndiv.win-command {\n  display: inline-block;\n  min-width: 0;\n  min-height: 0;\n  padding: 0px 31px;\n  border: 1px dotted;\n  /* reserve focus rect */\n  text-align: center;\n  font-size: 12px;\n  line-height: 16px;\n  font-weight: normal;\n  vertical-align: top;\n  /* Content Commands are lrtb */\n  writing-mode: lr-tb;\n  position: relative;\n}\ndiv.win-command:lang(ar),\ndiv.win-command:lang(dv),\ndiv.win-command:lang(fa),\ndiv.win-command:lang(he),\ndiv.win-command:lang(ku-Arab),\ndiv.win-command:lang(pa-Arab),\ndiv.win-command:lang(prs),\ndiv.win-command:lang(ps),\ndiv.win-command:lang(sd-Arab),\ndiv.win-command:lang(syr),\ndiv.win-command:lang(ug),\ndiv.win-command:lang(ur),\ndiv.win-command:lang(qps-plocm) {\n  writing-mode: rl-tb;\n}\ndiv.win-command:focus {\n  outline: none;\n}\n/*\nAppBar\n*/\n.win-navbar {\n  border-width: 0;\n  width: 100%;\n  height: auto;\n  left: 0;\n  position: fixed;\n  position: -ms-device-fixed;\n  min-height: 48px;\n}\n.win-navbar.win-navbar-minimal {\n  min-height: 25px;\n}\n.win-navbar.win-navbar-minimal.win-navbar-closed .win-navbar-invokebutton .win-navbar-ellipsis {\n  top: 5px;\n}\n.win-navbar.win-navbar-closing.win-navbar-minimal > :not(.win-navbar-invokebutton) {\n  opacity: 0;\n}\n.win-navbar.win-menulayout.win-navbar-closing .win-navbar-menu {\n  opacity: 1;\n}\n.win-navbar.win-navbar-closed.win-navbar-minimal > :not(.win-navbar-invokebutton) {\n  display: none !important;\n}\n.win-navbar.win-navbar-closing.win-navbar-minimal .win-navbar-invokebutton,\n.win-navbar.win-navbar-closed.win-navbar-minimal .win-navbar-invokebutton {\n  width: 100%;\n}\n.win-navbar.win-menulayout.win-navbar-opening .win-navbar-invokebutton,\n.win-navbar.win-menulayout.win-navbar-opened .win-navbar-invokebutton,\n.win-navbar.win-menulayout.win-navbar-closing .win-navbar-invokebutton {\n  visibility: hidden;\n}\n.win-navbar.win-menulayout.win-navbar-opening .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,\n.win-navbar.win-menulayout.win-navbar-opened .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,\n.win-navbar.win-menulayout.win-navbar-closing .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton {\n  visibility: visible;\n}\n.win-navbar .win-navbar-invokebutton {\n  touch-action: manipulation;\n  width: 32px;\n  height: 100%;\n  min-height: 25px;\n  position: absolute;\n  right: 0px;\n  margin: 0px;\n  padding: 0px;\n  border: dotted 1px;\n  min-width: 0px;\n  background-clip: border-box;\n  display: none;\n  z-index: 1;\n}\n.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {\n  width: 32px;\n  height: 100%;\n  right: 0px;\n  top: 15px;\n  position: absolute;\n  display: inline-block;\n  font-size: 14px;\n  text-align: center;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis::before {\n  content: \"\\E10C\";\n  position: relative;\n}\n.win-navbar:lang(ar) .win-navbar-invokebutton,\n.win-navbar:lang(dv) .win-navbar-invokebutton,\n.win-navbar:lang(fa) .win-navbar-invokebutton,\n.win-navbar:lang(he) .win-navbar-invokebutton,\n.win-navbar:lang(ku-Arab) .win-navbar-invokebutton,\n.win-navbar:lang(pa-Arab) .win-navbar-invokebutton,\n.win-navbar:lang(prs) .win-navbar-invokebutton,\n.win-navbar:lang(ps) .win-navbar-invokebutton,\n.win-navbar:lang(sd-Arab) .win-navbar-invokebutton,\n.win-navbar:lang(syr) .win-navbar-invokebutton,\n.win-navbar:lang(ug) .win-navbar-invokebutton,\n.win-navbar:lang(ur) .win-navbar-invokebutton,\n.win-navbar:lang(qps-plocm) .win-navbar-invokebutton,\n.win-navbar:lang(ar) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(dv) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(fa) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(he) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ku-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(pa-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(prs) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ps) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(sd-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(syr) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ug) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(ur) .win-navbar-invokebutton .win-navbar-ellipsis,\n.win-navbar:lang(qps-plocm) .win-navbar-invokebutton .win-navbar-ellipsis {\n  right: auto;\n  left: 0px;\n}\n.win-navbar.win-navbar-minimal .win-navbar-invokebutton,\n.win-navbar.win-navbar-compact .win-navbar-invokebutton {\n  display: block;\n}\n/*\nAppBar commands layout\n*/\n.win-commandlayout {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: none;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandlayout .win-primarygroup {\n  -ms-flex-order: 2;\n  flex-order: 2;\n  -webkit-order: 2;\n  order: 2;\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: end;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandlayout .win-secondarygroup {\n  -ms-flex-order: 1;\n  flex-order: 1;\n  -webkit-order: 1;\n  order: 1;\n  display: -ms-inline-flexbox;\n  display: -webkit-inline-flex;\n  display: inline-flex;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  -webkit-justify-content: flex-start;\n  justify-content: flex-start;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandlayout .win-command {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n}\n.win-commandlayout.win-navbar-opening,\n.win-commandlayout.win-navbar-opened,\n.win-commandlayout.win-navbar-closing {\n  min-height: 62px;\n}\n.win-commandlayout.win-navbar-opening.win-navbar-compact,\n.win-commandlayout.win-navbar-opened.win-navbar-compact,\n.win-commandlayout.win-navbar-closing.win-navbar-compact {\n  min-height: 48px;\n}\n.win-commandlayout.win-navbar-minimal,\n.win-commandlayout.win-navbar-compact {\n  padding-right: 32px;\n  width: calc(100% - 32px);\n}\n.win-commandlayout.win-navbar-compact button.win-command .win-label {\n  display: none;\n}\n.win-commandlayout.win-navbar-compact.win-navbar-closing button.win-command .win-label {\n  display: block;\n  visibility: hidden;\n}\n.win-commandlayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,\n.win-commandlayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {\n  display: block;\n  visibility: visible;\n}\n/* CommandsLayout RTL */\n.win-commandlayout:lang(ar).win-navbar-minimal,\n.win-commandlayout:lang(dv).win-navbar-minimal,\n.win-commandlayout:lang(fa).win-navbar-minimal,\n.win-commandlayout:lang(he).win-navbar-minimal,\n.win-commandlayout:lang(ku-Arab).win-navbar-minimal,\n.win-commandlayout:lang(pa-Arab).win-navbar-minimal,\n.win-commandlayout:lang(prs).win-navbar-minimal,\n.win-commandlayout:lang(ps).win-navbar-minimal,\n.win-commandlayout:lang(sd-Arab).win-navbar-minimal,\n.win-commandlayout:lang(syr).win-navbar-minimal,\n.win-commandlayout:lang(ug).win-navbar-minimal,\n.win-commandlayout:lang(ur).win-navbar-minimal,\n.win-commandlayout:lang(qps-plocm).win-navbar-minimal,\n.win-commandlayout:lang(ar).win-navbar-compact,\n.win-commandlayout:lang(dv).win-navbar-compact,\n.win-commandlayout:lang(fa).win-navbar-compact,\n.win-commandlayout:lang(he).win-navbar-compact,\n.win-commandlayout:lang(ku-Arab).win-navbar-compact,\n.win-commandlayout:lang(pa-Arab).win-navbar-compact,\n.win-commandlayout:lang(prs).win-navbar-compact,\n.win-commandlayout:lang(ps).win-navbar-compact,\n.win-commandlayout:lang(sd-Arab).win-navbar-compact,\n.win-commandlayout:lang(syr).win-navbar-compact,\n.win-commandlayout:lang(ug).win-navbar-compact,\n.win-commandlayout:lang(ur).win-navbar-compact,\n.win-commandlayout:lang(qps-plocm).win-navbar-compact {\n  padding-right: 0px;\n  padding-left: 32px;\n}\n/*\nAppBar menu layout\n*/\n.win-menulayout .win-navbar-menu {\n  position: absolute;\n  right: 0;\n  top: 0;\n  overflow: hidden;\n}\n.win-menulayout .win-navbar-menu:lang(ar),\n.win-menulayout .win-navbar-menu:lang(dv),\n.win-menulayout .win-navbar-menu:lang(fa),\n.win-menulayout .win-navbar-menu:lang(he),\n.win-menulayout .win-navbar-menu:lang(ku-Arab),\n.win-menulayout .win-navbar-menu:lang(pa-Arab),\n.win-menulayout .win-navbar-menu:lang(prs),\n.win-menulayout .win-navbar-menu:lang(ps),\n.win-menulayout .win-navbar-menu:lang(sd-Arab),\n.win-menulayout .win-navbar-menu:lang(syr),\n.win-menulayout .win-navbar-menu:lang(ug),\n.win-menulayout .win-navbar-menu:lang(ur),\n.win-menulayout .win-navbar-menu:lang(qps-plocm) {\n  left: 0;\n  right: auto;\n}\n.win-menulayout.win-bottom .win-navbar-menu {\n  overflow: visible;\n}\n.win-menulayout .win-toolbar {\n  max-width: 100vw;\n}\n.win-menulayout.win-navbar-compact button.win-command .win-label {\n  display: none;\n  visibility: hidden;\n}\n.win-menulayout.win-navbar-compact.win-navbar-closing button.win-command .win-label,\n.win-menulayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {\n  display: block;\n  visibility: visible;\n}\n.win-menulayout.win-navbar-compact.win-navbar-opened button.win-command .win-label {\n  display: block;\n  visibility: visible;\n}\n.win-menulayout.win-navbar-compact.win-navbar-closed {\n  overflow: hidden;\n}\n.win-menulayout.win-navbar-compact.win-navbar-closed .win-toolbar-overflowarea {\n  visibility: hidden;\n}\n/*\nHigh contrast AppBar needs a border\n*/\n@media (-ms-high-contrast) {\n  /*\n    AppBar Borders\n    */\n  .win-navbar {\n    border: solid 2px;\n  }\n  .win-navbar.win-top {\n    border-top: none;\n    border-left: none;\n    border-right: none;\n  }\n  .win-navbar.win-bottom {\n    border-bottom: none;\n    border-left: none;\n    border-right: none;\n  }\n  .win-navbar.win-top button.win-command,\n  .win-navbar.win-top div.win-command {\n    padding-bottom: 7px;\n    /* 7px - 2px smaller to account for the high-constrast appbar border */\n  }\n  .win-navbar.win-bottom button.win-command,\n  .win-navbar.win-bottom div.win-command {\n    padding-top: 7px;\n    /* 7px - 2px smaller to account for the high-constrast appbar border */\n  }\n  .win-navbar.win-top hr.win-command {\n    margin-bottom: 28px;\n  }\n  .win-navbar.win-bottom hr.win-command {\n    margin-top: 8px;\n  }\n  .win-commandlayout.win-navbar-opening,\n  .win-commandlayout.win-navbar-opened,\n  .win-commandlayout.win-navbar-closing {\n    min-height: 62px;\n  }\n}\n/*\nFlyout control.\n*/\n.win-flyout {\n  position: fixed;\n  position: -ms-device-fixed;\n  padding: 12px;\n  border-style: solid;\n  border-width: 1px;\n  margin: 4px;\n  min-width: 70px;\n  /* 96px - 2px border - 24px padding */\n  max-width: 430px;\n  /* 456px - 2px border - 24px padding */\n  min-height: 16px;\n  /* 44px - 2px border - 24px padding */\n  max-height: 730px;\n  /* 758px - 2px border - 24px padding */\n  width: auto;\n  height: auto;\n  word-wrap: break-word;\n  overflow: auto;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-flyout.win-leftalign {\n  margin-left: 0;\n}\n.win-flyout.win-rightalign {\n  margin-right: 0;\n}\n.win-flyout.win-scrolls {\n  overflow: auto;\n}\n@media (max-width: 464px) {\n  .win-flyout {\n    max-width: calc(100% - 34px);\n    /* 100% - 8px margin - 2px border - 24px padding */\n  }\n}\n/*\nMenu control.\n*/\n.win-menu {\n  padding: 0;\n  line-height: 33px;\n  text-align: left;\n  /* Set explicitly in case our parent has different alignment, like appbar overflow. */\n  min-height: 42px;\n  /* 44px - 2px border */\n  max-height: calc(100% - 26px);\n  min-width: 134px;\n  /* 136px - 2px border */\n  max-width: 454px;\n  /* 456px - 2px border */\n}\n/*\nMenu commands.\n*/\n.win-menu button.win-command {\n  display: block;\n  margin-left: 0;\n  margin-right: 0;\n  text-align: left;\n  width: 100%;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-menu button.win-command:focus {\n  outline: none;\n}\n.win-menu button.win-command .win-menucommand-liner {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: row;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -ms-flex-wrap: none;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  width: 100%;\n  position: relative;\n}\n.win-menu button.win-command .win-menucommand-liner .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner .win-flyouticon {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: none;\n  visibility: hidden;\n  font-size: 16px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-menu button.win-command .win-menucommand-liner .win-toggleicon {\n  margin-left: 12px;\n}\n.win-menu button.win-command .win-menucommand-liner .win-toggleicon::before {\n  content: \"\\E0E7\";\n}\n.win-menu button.win-command .win-menucommand-liner .win-flyouticon {\n  margin-left: 12px;\n  margin-right: 16px;\n}\n.win-menu button.win-command .win-menucommand-liner .win-flyouticon::before {\n  content: \"\\E26B\";\n}\n.win-menu button.win-command .win-menucommand-liner .win-label {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  font-size: 15px;\n  line-height: inherit;\n  min-width: 112px;\n  max-width: none;\n  white-space: nowrap;\n  text-overflow: clip;\n  margin: 0px;\n  padding: 0px 12px;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar),\n.win-menu button.win-command .win-menucommand-liner:lang(dv),\n.win-menu button.win-command .win-menucommand-liner:lang(fa),\n.win-menu button.win-command .win-menucommand-liner:lang(he),\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab),\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab),\n.win-menu button.win-command .win-menucommand-liner:lang(prs),\n.win-menu button.win-command .win-menucommand-liner:lang(ps),\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab),\n.win-menu button.win-command .win-menucommand-liner:lang(syr),\n.win-menu button.win-command .win-menucommand-liner:lang(ug),\n.win-menu button.win-command .win-menucommand-liner:lang(ur),\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) {\n  text-align: right;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(he) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-toggleicon,\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-toggleicon {\n  margin-left: 0px;\n  margin-right: 12px;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon,\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon {\n  margin-left: 16px;\n  margin-right: 12px;\n}\n.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon::before,\n.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon::before {\n  content: \"\\E26C\";\n}\n.win-menu.win-menu-mousespacing button.win-command {\n  padding-top: 5px;\n  padding-bottom: 7px;\n  min-height: 32px;\n}\n.win-menu.win-menu-touchspacing button.win-command {\n  padding-top: 11px;\n  padding-bottom: 13px;\n  min-height: 44px;\n}\n.win-menu hr.win-command {\n  display: block;\n  height: 1px;\n  width: auto;\n  border: 0;\n  padding: 0;\n  margin: 9px 20px 10px 20px;\n}\n/*\nMenu toggle and flyout commands.\n*/\n.win-menu-containstogglecommand button.win-command .win-menucommand-liner .win-toggleicon,\n.win-menu-containsflyoutcommand button.win-command .win-menucommand-liner .win-flyouticon {\n  display: inline-block;\n}\n.win-menu-containstogglecommand button.win-command-toggle[aria-checked=true] .win-menucommand-liner .win-toggleicon,\n.win-menu-containsflyoutcommand button.win-command-flyout .win-menucommand-liner .win-flyouticon {\n  visibility: visible;\n}\n@media (max-width: 464px) {\n  .win-menu {\n    max-width: calc(100% - 10px);\n    /* 100% - 8px margin - 2px border */\n  }\n}\n/*\nGrippers in touch selection do not dissapear when focus moves to an element outside of the selection range and they are always drawn on a layer above all HTML elemements.\nWhen an _Overlay derived control such as AppBar/Flyout/Menu/SettingsFlyout is invoked and steals focus, if that _Overlay is laid out on top of the elements in the touch selection,\nthe grippers can still be seen over the _Overlay and its contents. However, all grippers any where in the document will be hidden whenever the current active element has or inherits\nthe style \"-ms-touch-select: none;\"\n*/\n.win-overlay {\n  -ms-touch-select: none;\n}\n/* For input elements we filter type using the :not selector to capture any unrecognized user specified types which would just default to the form and function of a textbox*/\n.win-overlay input:not([type=\"file\"]),\n.win-overlay input:not([type=\"radio\"]),\n.win-overlay input:not([type=\"checkbox\"]),\n.win-overlay input:not([type=\"button\"]),\n.win-overlay input:not([type=\"range\"]),\n.win-overlay input:not([type=\"image\"]),\n.win-overlay input:not([type=\"reset\"]),\n.win-overlay input:not([type=\"hidden\"]),\n.win-overlay input:not([type=\"submit\"]),\n.win-overlay textarea,\n.win-overlay [contenteditable=true] {\n  -ms-touch-select: grippers;\n}\n/* Singleton element maintained by _Overlay, used for getting accurate floating point measurements of the total size of the visual viewport.\n    Floating point is necesary in high DPI resolutions. */\n.win-visualviewport-space {\n  position: fixed;\n  position: -ms-device-fixed;\n  height: 100%;\n  width: 100%;\n  visibility: hidden;\n}\n/*\nSettings Pane\n*/\n.win-settingsflyout {\n  border-left: 1px solid;\n  position: fixed;\n  top: 0;\n  right: 0;\n  height: 100%;\n  width: 319px;\n  /* 320px - border (1px) */\n  /* Settings back button is slightly smaller. */\n}\n.win-settingsflyout:lang(ar),\n.win-settingsflyout:lang(dv),\n.win-settingsflyout:lang(fa),\n.win-settingsflyout:lang(he),\n.win-settingsflyout:lang(ku-Arab),\n.win-settingsflyout:lang(pa-Arab),\n.win-settingsflyout:lang(prs),\n.win-settingsflyout:lang(ps),\n.win-settingsflyout:lang(sd-Arab),\n.win-settingsflyout:lang(syr),\n.win-settingsflyout:lang(ug),\n.win-settingsflyout:lang(ur),\n.win-settingsflyout:lang(qps-plocm) {\n  border-left: none;\n  border-right: 1px solid;\n}\n.win-settingsflyout.win-wide {\n  /* .win-wide is deprecated in Windows 8.1 */\n  width: 645px;\n  /* 646px - border (1px) */\n}\n.win-settingsflyout .win-backbutton,\n.win-settingsflyout .win-back {\n  width: 32px;\n  height: 32px;\n  font-size: 20px;\n  line-height: 32px;\n}\n.win-settingsflyout .win-header {\n  padding-top: 6px;\n  padding-bottom: 10px;\n  padding-left: 52px;\n  /* 40px for the backbutton */\n  padding-right: 12px;\n  height: 32px;\n  position: relative;\n}\n.win-settingsflyout .win-header .win-label {\n  display: inline-block;\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 32px;\n  white-space: nowrap;\n}\n.win-settingsflyout .win-header .win-backbutton,\n.win-settingsflyout .win-header .win-navigation-backbutton {\n  position: absolute;\n  left: 12px;\n}\n.win-settingsflyout .win-content {\n  overflow: auto;\n  padding: 0px 12px;\n}\n.win-settingsflyout .win-content .win-label {\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n}\n.win-settingsflyout .win-content .win-settings-section {\n  padding-bottom: 39px;\n  margin: 0;\n  padding-top: 0;\n  padding-bottom: 20px;\n}\n.win-settingsflyout .win-content .win-settings-section p {\n  margin: 0;\n  padding-top: 0;\n  padding-bottom: 25px;\n}\n.win-settingsflyout .win-content .win-settings-section a {\n  margin: 0;\n  padding-top: 0;\n  padding-bottom: 25px;\n  display: inline-block;\n}\n.win-settingsflyout .win-content .win-settings-section label {\n  display: block;\n  padding-bottom: 7px;\n}\n.win-settingsflyout .win-content .win-settings-section button,\n.win-settingsflyout .win-content .win-settings-section select,\n.win-settingsflyout .win-content .win-settings-section input[type=button],\n.win-settingsflyout .win-content .win-settings-section input[type=text] {\n  margin-bottom: 25px;\n  margin-left: 0;\n  margin-right: 20px;\n}\n.win-settingsflyout .win-content .win-settings-section button:lang(ar),\n.win-settingsflyout .win-content .win-settings-section select:lang(ar),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ar),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ar),\n.win-settingsflyout .win-content .win-settings-section button:lang(dv),\n.win-settingsflyout .win-content .win-settings-section select:lang(dv),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(dv),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(dv),\n.win-settingsflyout .win-content .win-settings-section button:lang(fa),\n.win-settingsflyout .win-content .win-settings-section select:lang(fa),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(fa),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(fa),\n.win-settingsflyout .win-content .win-settings-section button:lang(he),\n.win-settingsflyout .win-content .win-settings-section select:lang(he),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(he),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(he),\n.win-settingsflyout .win-content .win-settings-section button:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section select:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ku-Arab),\n.win-settingsflyout .win-content .win-settings-section button:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section select:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(pa-Arab),\n.win-settingsflyout .win-content .win-settings-section button:lang(prs),\n.win-settingsflyout .win-content .win-settings-section select:lang(prs),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(prs),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(prs),\n.win-settingsflyout .win-content .win-settings-section button:lang(ps),\n.win-settingsflyout .win-content .win-settings-section select:lang(ps),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ps),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ps),\n.win-settingsflyout .win-content .win-settings-section button:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section select:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(sd-Arab),\n.win-settingsflyout .win-content .win-settings-section button:lang(syr),\n.win-settingsflyout .win-content .win-settings-section select:lang(syr),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(syr),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(syr),\n.win-settingsflyout .win-content .win-settings-section button:lang(ug),\n.win-settingsflyout .win-content .win-settings-section select:lang(ug),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ug),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ug),\n.win-settingsflyout .win-content .win-settings-section button:lang(ur),\n.win-settingsflyout .win-content .win-settings-section select:lang(ur),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ur),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ur),\n.win-settingsflyout .win-content .win-settings-section button:lang(qps-plocm),\n.win-settingsflyout .win-content .win-settings-section select:lang(qps-plocm),\n.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(qps-plocm),\n.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(qps-plocm) {\n  margin-bottom: 25px;\n  margin-left: 20px;\n  margin-right: 0;\n}\n.win-settingsflyout .win-content .win-settings-section input[type=radio] {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-bottom: 15px;\n}\n/*Flyout control animations*/\n@keyframes WinJS-showFlyoutTop {\n  from {\n    transform: translateY(50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showFlyoutBottom {\n  from {\n    transform: translateY(-50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showFlyoutLeft {\n  from {\n    transform: translateX(50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-showFlyoutRight {\n  from {\n    transform: translateX(-50px);\n  }\n  to {\n    transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutTop {\n  from {\n    -webkit-transform: translateY(50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutBottom {\n  from {\n    -webkit-transform: translateY(-50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutLeft {\n  from {\n    -webkit-transform: translateX(50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-showFlyoutRight {\n  from {\n    -webkit-transform: translateX(-50px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n.win-commandingsurface {\n  outline: none;\n  min-width: 32px;\n  /* enough to fit the overflowbutton */\n  position: relative;\n}\n.win-commandingsurface.win-commandingsurface-overflowbottom .win-commandingsurface-overflowareacontainer {\n  top: 100%;\n}\n.win-commandingsurface.win-commandingsurface-overflowtop .win-commandingsurface-overflowareacontainer {\n  bottom: 100%;\n}\n.win-commandingsurface .win-commandingsurface-actionarea {\n  min-height: 24px;\n  vertical-align: top;\n  overflow: hidden;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-pack: end;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n  -ms-flex-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-spacer {\n  visibility: hidden;\n  min-height: 48px;\n  /* height of a primary command with no label */\n  width: 0px;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-command,\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {\n  touch-action: manipulation;\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {\n  width: 32px;\n  /* 30px + 2px border */\n  margin: 0px;\n  padding: 0px;\n  border-width: 1px;\n  border-style: dotted;\n  min-width: 0px;\n  min-height: 0px;\n  outline: none;\n  -ms-flex-item-align: stretch;\n  -webkit-align-self: stretch;\n  align-self: stretch;\n  box-sizing: border-box;\n  background-clip: border-box;\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis {\n  font-size: 16px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n}\n.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis::before {\n  content: \"\\E10C\";\n}\n.win-commandingsurface.win-commandingsurface-empty .win-commandingsurface-overflowbutton {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-actionarea {\n  height: auto;\n}\n.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowarea,\n.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowareacontainer {\n  display: block;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayfull .win-commandingsurface-actionarea {\n  height: auto;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea {\n  height: 48px;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea .win-command .win-label {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea {\n  height: 24px;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-command,\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-commandingsurface-spacer {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaynone {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowarea,\n.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowareacontainer {\n  display: none;\n}\n.win-commandingsurface.win-commandingsurface-empty .win-commandingsurface-overflowbutton {\n  display: none;\n}\n.win-commandingsurface .win-commandingsurface-overflowareacontainer {\n  position: absolute;\n  overflow: hidden;\n  right: 0;\n  left: auto;\n}\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ar),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(dv),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(fa),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(he),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ku-Arab),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(pa-Arab),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(prs),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ps),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(sd-Arab),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(syr),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ug),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ur),\n.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(qps-plocm) {\n  left: 0;\n  right: auto;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea,\n.win-commandingsurface .win-commandingsurface-overflowareacontainer {\n  min-width: 160px;\n  min-height: 0;\n  max-height: 50vh;\n  padding: 0;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea.win-menu {\n  max-width: 480px;\n  /* override max-width styles from WinJS.UI.Menu */\n}\n.win-commandingsurface .win-commandingsurface-overflowarea button.win-command {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  min-height: 44px;\n  border: 1px dotted transparent;\n  padding: 10px 11px 12px 11px;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n  white-space: nowrap;\n  overflow: hidden;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea hr.win-command {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  height: 2px;\n  margin: 6px 12px 4px 12px;\n}\n.win-commandingsurface .win-commandingsurface-actionareacontainer {\n  overflow: hidden;\n}\n.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaycompact .win-command .win-label,\n.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplayminimal .win-command,\n.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaynone .win-command {\n  opacity: 0;\n}\n@media (max-width: 480px) {\n  .win-commandingsurface .win-commandingsurface-overflowarea.win-menu {\n    width: 100vw;\n  }\n}\n.win-toolbar {\n  min-width: 32px;\n  /* enough to fit the overflowbutton */\n}\n.win-toolbar.win-toolbar-opened {\n  position: fixed;\n}\n.win-autosuggestbox {\n  white-space: normal;\n  position: relative;\n  width: 266px;\n  min-width: 265px;\n  min-height: 28px;\n}\n.win-autosuggestbox-flyout {\n  position: absolute;\n  top: 100%;\n  width: 100%;\n  z-index: 100;\n  max-height: 374px;\n  min-height: 44px;\n  overflow: auto;\n  -ms-scroll-chaining: none;\n  touch-action: none;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-autosuggestbox-flyout-above {\n  bottom: 100%;\n  top: auto;\n}\n.win-autosuggestbox-flyout-above .win-repeater {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column-reverse;\n  -webkit-flex-direction: column-reverse;\n  flex-direction: column-reverse;\n}\n.win-autosuggestbox .win-autosuggestbox-input {\n  -ms-ime-align: after;\n  margin: 0;\n  width: 100%;\n}\n.win-autosuggestbox-suggestion-selected {\n  outline-style: dotted;\n  outline-width: 1px;\n}\n.win-autosuggestbox-suggestion-result {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  padding: 0 18px;\n  height: 60px;\n  font-size: 11pt;\n  outline: none;\n}\n.win-autosuggestbox-suggestion-result div {\n  line-height: 20px;\n  white-space: nowrap;\n  overflow: hidden;\n}\n.win-autosuggestbox-suggestion-result-text {\n  padding-top: 9px;\n  padding-bottom: 11px;\n  height: 60px;\n  width: 179px;\n  white-space: nowrap;\n  overflow: hidden;\n  line-height: 20px;\n}\n.win-autosuggestbox-suggestion-result-detailed-text {\n  display: inline-block;\n  overflow: hidden;\n  line-height: 22px;\n  /* Some characters get clipped if line height is < 22px. Work around by setting -2 margin. */\n  margin-top: -1px;\n  width: 100%;\n}\n.win-autosuggestbox-suggestion-result img {\n  width: 40px;\n  height: 40px;\n  margin-left: 0;\n  padding-right: 10px;\n  padding-top: 10px;\n  padding-bottom: 10px;\n}\n.win-autosuggestbox-suggestion-result img:lang(ar),\n.win-autosuggestbox-suggestion-result img:lang(dv),\n.win-autosuggestbox-suggestion-result img:lang(fa),\n.win-autosuggestbox-suggestion-result img:lang(he),\n.win-autosuggestbox-suggestion-result img:lang(ku-Arab),\n.win-autosuggestbox-suggestion-result img:lang(pa-Arab),\n.win-autosuggestbox-suggestion-result img:lang(prs),\n.win-autosuggestbox-suggestion-result img:lang(ps),\n.win-autosuggestbox-suggestion-result img:lang(sd-Arab),\n.win-autosuggestbox-suggestion-result img:lang(syr),\n.win-autosuggestbox-suggestion-result img:lang(ug),\n.win-autosuggestbox-suggestion-result img:lang(ur),\n.win-autosuggestbox-suggestion-result img:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: auto;\n  padding-left: 10px;\n  padding-right: 0;\n}\n.win-autosuggestbox-suggestion-query {\n  height: 20px;\n  padding: 11px 0px 13px 12px;\n  outline: none;\n  white-space: nowrap;\n  overflow: hidden;\n  line-height: 20px;\n}\n.win-autosuggestbox-suggestion-separator {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  padding: 0 18px;\n  height: 40px;\n  font-size: 11pt;\n}\n.win-autosuggestbox-suggestion-separator hr {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  margin-top: 18px;\n  border-style: solid;\n  border-width: 1px 0px 0px 0px;\n}\n.win-autosuggestbox-suggestion-separator hr:lang(ar),\n.win-autosuggestbox-suggestion-separator hr:lang(dv),\n.win-autosuggestbox-suggestion-separator hr:lang(fa),\n.win-autosuggestbox-suggestion-separator hr:lang(he),\n.win-autosuggestbox-suggestion-separator hr:lang(ku-Arab),\n.win-autosuggestbox-suggestion-separator hr:lang(pa-Arab),\n.win-autosuggestbox-suggestion-separator hr:lang(prs),\n.win-autosuggestbox-suggestion-separator hr:lang(ps),\n.win-autosuggestbox-suggestion-separator hr:lang(sd-Arab),\n.win-autosuggestbox-suggestion-separator hr:lang(syr),\n.win-autosuggestbox-suggestion-separator hr:lang(ug),\n.win-autosuggestbox-suggestion-separator hr:lang(ur),\n.win-autosuggestbox-suggestion-separator hr:lang(qps-plocm) {\n  margin-right: 10px;\n  margin-left: auto;\n}\n.win-autosuggestbox-suggestion-separator div {\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  padding-top: 9px;\n  padding-bottom: 11px;\n  line-height: 20px;\n  margin-right: 10px;\n}\n.win-autosuggestbox-suggestion-separator div:lang(ar),\n.win-autosuggestbox-suggestion-separator div:lang(dv),\n.win-autosuggestbox-suggestion-separator div:lang(fa),\n.win-autosuggestbox-suggestion-separator div:lang(he),\n.win-autosuggestbox-suggestion-separator div:lang(ku-Arab),\n.win-autosuggestbox-suggestion-separator div:lang(pa-Arab),\n.win-autosuggestbox-suggestion-separator div:lang(prs),\n.win-autosuggestbox-suggestion-separator div:lang(ps),\n.win-autosuggestbox-suggestion-separator div:lang(sd-Arab),\n.win-autosuggestbox-suggestion-separator div:lang(syr),\n.win-autosuggestbox-suggestion-separator div:lang(ug),\n.win-autosuggestbox-suggestion-separator div:lang(ur),\n.win-autosuggestbox-suggestion-separator div:lang(qps-plocm) {\n  margin-left: 10px;\n  margin-right: auto;\n}\n/*\nASB control animations\n*/\n@keyframes WinJS-flyoutBelowASB-showPopup {\n  from {\n    transform: translateY(0px);\n  }\n  to {\n    transform: none;\n  }\n}\n@keyframes WinJS-flyoutAboveASB-showPopup {\n  from {\n    transform: translateY(0px);\n  }\n  to {\n    transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-flyoutBelowASB-showPopup {\n  from {\n    -webkit-transform: translateY(0px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@-webkit-keyframes -webkit-WinJS-flyoutAboveASB-showPopup {\n  from {\n    -webkit-transform: translateY(0px);\n  }\n  to {\n    -webkit-transform: none;\n  }\n}\n@media (-ms-high-contrast) {\n  .win-autosuggestbox {\n    border-color: ButtonText;\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  .win-autosuggestbox-disabled {\n    background-color: ButtonFace;\n    border-color: GrayText;\n  }\n  .win-autosuggestbox-disabled input[disabled] {\n    background-color: ButtonFace;\n    color: GrayText;\n    border-color: GrayText;\n  }\n  .win-autosuggestbox-disabled div {\n    color: GrayText;\n    background-color: ButtonFace;\n  }\n  .win-autosuggestbox:-ms-input-placeholder,\n  .win-autosuggestbox::-webkit-input-placeholder,\n  .win-autosuggestbox::-moz-input-placeholder {\n    color: GrayText;\n  }\n  .win-autosuggestbox-flyout {\n    border-color: ButtonText;\n    background-color: ButtonFace;\n  }\n  .win-autosuggestbox-flyout-highlighttext {\n    color: ButtonText;\n  }\n  html.win-hoverable .win-autosuggestbox-suggestion-result:hover,\n  html.win-hoverable .win-autosuggestbox-query:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  html.win-hoverable .win-autosuggestbox-suggestion-result:hover .win-autosuggestbox-flyout-highlighttext,\n  html.win-hoverable .win-autosuggestbox-suggestion-query:hover .win-autosuggestbox-flyout-highlighttext {\n    color: HighlightText;\n  }\n  .win-autosuggestbox-suggestion-query,\n  .win-autosuggestbox-suggestion-result {\n    color: ButtonText;\n  }\n  .win-autosuggestbox-suggestion-selected {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-autosuggestbox-suggestion-separator {\n    color: ButtonText;\n  }\n  .win-autosuggestbox-suggestion-separator hr {\n    border-color: ButtonText;\n  }\n  .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {\n    color: HighlightText;\n  }\n}\n/*\nHide clear button in search box control.\n*/\n.win-searchbox input[type=search]::-ms-clear {\n  display: none;\n}\n.win-searchbox input[type=search]::-webkit-search-cancel-button {\n  display: none;\n}\n.win-searchbox-button {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 32px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 15px;\n  border-style: none;\n  height: 100%;\n  text-align: center;\n}\n.win-searchbox-button:lang(ar),\n.win-searchbox-button:lang(dv),\n.win-searchbox-button:lang(fa),\n.win-searchbox-button:lang(he),\n.win-searchbox-button:lang(ku-Arab),\n.win-searchbox-button:lang(pa-Arab),\n.win-searchbox-button:lang(prs),\n.win-searchbox-button:lang(ps),\n.win-searchbox-button:lang(sd-Arab),\n.win-searchbox-button:lang(syr),\n.win-searchbox-button:lang(ug),\n.win-searchbox-button:lang(ur),\n.win-searchbox-button:lang(qps-plocm) {\n  right: auto;\n  left: 0;\n}\n.win-searchbox-button.win-searchbox-button:before {\n  content: \"\\E094\";\n  position: absolute;\n  left: 8px;\n  top: 8px;\n  line-height: 100%;\n}\n@media (-ms-high-contrast) {\n  .win-searchbox-button {\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  html.win-hoverable .win-searchbox-button[disabled=false]:hover {\n    border-color: ButtonText;\n    background-color: HighLight;\n    color: HighLightText;\n  }\n  .win-searchbox-button-input-focus {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  html.win-hoverable .win-searchbox-button-input-focus:hover {\n    border-color: ButtonText;\n    background-color: HighLight;\n    color: HighLightText;\n  }\n  .win-searchbox-button:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n}\n.win-navbar.win-navbar-showing,\n.win-navbar.win-navbar-shown,\n.win-navbar.win-navbar-hiding {\n  min-height: 60px;\n}\n.win-navbar .win-navbar-invokebutton {\n  width: 32px;\n  min-height: 0;\n  height: 24px;\n}\n.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {\n  width: 32px;\n}\n.win-navbar.win-top .win-navbar-invokebutton {\n  bottom: 0;\n}\n.win-navbar.win-top .win-navbar-invokebutton .win-navbar-ellipsis {\n  top: 5px;\n}\n.win-navbar.win-bottom .win-navbar-invokebutton {\n  top: 0;\n}\n.win-navbar.win-bottom .win-navbar-invokebutton .win-navbar-ellipsis {\n  top: 0;\n}\n.win-navbarcontainer {\n  width: 100%;\n  position: relative;\n}\n.win-navbarcontainer-pageindicator-box {\n  position: absolute;\n  width: 100%;\n  text-align: center;\n  pointer-events: none;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box {\n  display: none;\n}\n.win-navbarcontainer-pageindicator {\n  display: inline-block;\n  width: 40px;\n  height: 4px;\n  margin: 4px 2px 16px 2px;\n}\n.win-navbarcontainer-horizontal .win-navbarcontainer-viewport::-webkit-scrollbar {\n  width: 0;\n  height: 0;\n}\n.win-navbarcontainer-horizontal .win-navbarcontainer-viewport {\n  padding: 20px 0;\n  overflow-x: auto;\n  overflow-y: hidden;\n  overflow: -moz-scrollbars-none;\n  -ms-scroll-snap-type: mandatory;\n  -ms-scroll-snap-points-x: snapInterval(0%, 100%);\n  -ms-overflow-style: none;\n  touch-action: pan-x;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-viewport {\n  overflow-x: hidden;\n  overflow-y: auto;\n  max-height: 216px;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n  touch-action: pan-y;\n  -webkit-overflow-scrolling: touch;\n}\n.win-navbarcontainer-horizontal .win-navbarcontainer-surface {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-line-pack: start;\n  -webkit-align-content: flex-start;\n  align-content: flex-start;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-surface {\n  padding: 12px 0;\n}\n.win-navbarcontainer-navarrow {\n  touch-action: manipulation;\n  position: absolute;\n  z-index: 2;\n  top: 24px;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  height: calc(100% - 48px);\n  width: 20px;\n  font-size: 16px;\n  overflow: hidden;\n}\n.win-navbarcontainer-vertical .win-navbarcontainer-navarrow {\n  display: none;\n}\n.win-navbarcontainer-navleft {\n  left: 0;\n  margin-right: 2px;\n}\n.win-navbarcontainer-navleft::before {\n  content: '\\E0E2';\n}\n.win-navbarcontainer-navright {\n  right: 0;\n  margin-left: 2px;\n}\n.win-navbarcontainer-navright::before {\n  content: '\\E0E3';\n}\n/*\n    NavBarCommand\n*/\n.win-navbarcommand {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  touch-action: manipulation;\n}\n.win-navbarcontainer-horizontal .win-navbarcommand {\n  margin: 4px;\n  width: 192px;\n}\n.win-navbarcontainer-vertical .win-navbarcommand {\n  margin: 4px 24px;\n}\n.win-navbarcommand-button {\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  position: relative;\n}\n.win-navbarcommand-button-content {\n  position: relative;\n  height: 48px;\n  padding-left: 16px;\n  padding-right: 16px;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n.win-navbarcommand-button:focus {\n  z-index: 1;\n  outline: none;\n}\n.win-navbarcommand-icon {\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  height: 16px;\n  width: 16px;\n  font-size: 16px;\n  margin-left: 0;\n  margin-right: 16px;\n  margin-top: 14px;\n  /* Center icon vertically */\n  line-height: 1;\n  /* Ensure icon is exactly font-size */\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n}\n.win-navbarcommand-icon:lang(ar),\n.win-navbarcommand-icon:lang(dv),\n.win-navbarcommand-icon:lang(fa),\n.win-navbarcommand-icon:lang(he),\n.win-navbarcommand-icon:lang(ku-Arab),\n.win-navbarcommand-icon:lang(pa-Arab),\n.win-navbarcommand-icon:lang(prs),\n.win-navbarcommand-icon:lang(ps),\n.win-navbarcommand-icon:lang(sd-Arab),\n.win-navbarcommand-icon:lang(syr),\n.win-navbarcommand-icon:lang(ug),\n.win-navbarcommand-icon:lang(ur),\n.win-navbarcommand-icon:lang(qps-plocm) {\n  margin-right: 0;\n  margin-left: 16px;\n}\n.win-navbarcommand-label {\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  overflow: hidden;\n  white-space: nowrap;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n  margin-top: 13px;\n  margin-bottom: 15px;\n}\n.win-navbarcommand-splitbutton {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: 48px;\n  font-family: \"Segoe MDL2 Assets\", \"Symbols\";\n  font-size: 16px;\n  margin-right: 0;\n  margin-left: 2px;\n  position: relative;\n}\n.win-navbarcommand-splitbutton:lang(ar),\n.win-navbarcommand-splitbutton:lang(dv),\n.win-navbarcommand-splitbutton:lang(fa),\n.win-navbarcommand-splitbutton:lang(he),\n.win-navbarcommand-splitbutton:lang(ku-Arab),\n.win-navbarcommand-splitbutton:lang(pa-Arab),\n.win-navbarcommand-splitbutton:lang(prs),\n.win-navbarcommand-splitbutton:lang(ps),\n.win-navbarcommand-splitbutton:lang(sd-Arab),\n.win-navbarcommand-splitbutton:lang(syr),\n.win-navbarcommand-splitbutton:lang(ug),\n.win-navbarcommand-splitbutton:lang(ur),\n.win-navbarcommand-splitbutton:lang(qps-plocm) {\n  margin-left: 0;\n  margin-right: 2px;\n}\n.win-navbarcommand-splitbutton::before {\n  content: '\\E019';\n  pointer-events: none;\n  position: absolute;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  text-align: center;\n  line-height: 46px;\n  border: 1px dotted transparent;\n}\n.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before {\n  content: '\\E018';\n}\n.win-navbarcommand-splitbutton:focus {\n  outline: none;\n}\n@media (-ms-high-contrast) {\n  .win-navbarcontainer-pageindicator {\n    background-color: ButtonFace;\n  }\n  .win-navbarcontainer-pageindicator:after {\n    display: block;\n    border: 1px solid ButtonText;\n    content: \"\";\n    width: calc(100% - 2px);\n    height: calc(100% - 2px);\n  }\n  .win-navbarcontainer-pageindicator-current {\n    background-color: ButtonText;\n  }\n  html.win-hoverable .win-navbarcontainer-pageindicator:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable .win-navbarcontainer-pageindicator-current:hover {\n    background-color: ButtonText;\n  }\n  .win-navbarcontainer-pageindicator:hover:active {\n    background-color: ButtonText;\n  }\n  .win-navbarcontainer-navarrow {\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  .win-navbarcontainer-navarrow:after {\n    position: absolute;\n    top: 0;\n    left: 0;\n    border: 2px solid ButtonText;\n    content: \"\";\n    width: calc(100% - 3px);\n    height: calc(100% - 3px);\n  }\n  html.win-hoverable .win-navbarcontainer-navarrow:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-navbarcontainer-navarrow:hover:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  /*\n        NavBarCommand colors.\n    */\n  .win-navbarcommand-button,\n  .win-navbarcommand-splitbutton {\n    background-color: ButtonFace;\n    color: ButtonText;\n  }\n  .win-navbarcommand-button:after,\n  .win-navbarcommand-splitbutton:after {\n    position: absolute;\n    top: 0;\n    left: 0;\n    border: 2px solid ButtonText;\n    content: \"\";\n    width: calc(100% - 3px);\n    height: calc(100% - 3px);\n    pointer-events: none;\n  }\n  html.win-hoverable .win-navbarcommand-button:hover,\n  html.win-hoverable .win-navbarcommand-splitbutton:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened,\n  html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover,\n  .win-navbarcommand-button.win-pressed,\n  html.win-hoverable .win-navbarcommand-button.win-pressed:hover,\n  .win-navbarcommand-splitbutton.win-pressed,\n  html.win-hoverable .win-navbarcommand-splitbutton.win-pressed:hover {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n}\n.win-viewbox {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n.win-contentdialog {\n  /* Dialog's positioning and sizing rules:\n      - Horizontal alignment\n        - Always horizontally centered\n      - Vertical alignment\n        - If height of window < @dialogVerticallyCenteredThreshold, dialog is attached to top of window\n        - Otherwise, dialog is vertically centered\n      - Width:\n        - Always stays between @minWidth and @maxWidth\n        - Sizes to width of window\n      - Height:\n        - Always stays between @minHeight and @maxHeight\n        - If window height < @maxHeight and dialog height > 50% of window\n          height, dialog height = window height\n        - Otherwise, dialog height sizes to its content\n     */\n  /* Purpose of this element is to control the dialog body's height based on the height\n       of the window. The dialog body's height should:\n         - Match height of window when dialog body's intrinsic height < 50% of window height.\n           In this case, .win-contentdialog-column0or1 will be in column 1 allowing\n           the dialog's body to fill the height of the window.\n         - Size to content otherwise.\n           In this case, .win-contentdialog-column0or1 will be in column 0 preventing\n           the dialog's body from growing.\n       This element works by moving between flexbox columns as the window's height changes.\n     */\n}\n.win-contentdialog.win-contentdialog-verticalalignment {\n  z-index: 1005;\n  /* Above AppBar and SettingsFlyout. Below Flyout. */\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100vh;\n  overflow: hidden;\n  display: none;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-wrap: wrap;\n  -webkit-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  /* center on flex axis (vertically) */\n  -ms-flex-line-pack: center;\n  -webkit-align-content: center;\n  align-content: center;\n  /* maintain horizontal centering when the flexbox has 2 columns */\n}\n.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-visible {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n.win-contentdialog .win-contentdialog-backgroundoverlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100vh;\n}\n.win-contentdialog .win-contentdialog-dialog {\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  z-index: 1;\n  /* Put the dialog's body above the backgroundoverlay */\n  outline-style: solid;\n  outline-width: 1px;\n  box-sizing: border-box;\n  padding: 18px 24px 24px 24px;\n  width: 100vw;\n  min-width: 320px;\n  max-width: 456px;\n  min-height: 184px;\n  max-height: 758px;\n  /* Center horizontally */\n  margin-left: auto;\n  margin-right: auto;\n}\n.win-contentdialog .win-contentdialog-column0or1 {\n  height: 50vh;\n  -ms-flex: 10000 0 auto;\n  -webkit-flex: 10000 0 auto;\n  flex: 10000 0 auto;\n  width: 0;\n}\n@media (min-height: 640px) {\n  .win-contentdialog .win-contentdialog-dialog {\n    -ms-flex: 0 1 auto;\n    -webkit-flex: 0 1 auto;\n    flex: 0 1 auto;\n  }\n  .win-contentdialog .win-contentdialog-column0or1 {\n    display: none;\n  }\n}\n.win-contentdialog .win-contentdialog-scroller {\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  overflow: auto;\n}\n.win-contentdialog .win-contentdialog-title {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  font-size: 20px;\n  font-weight: 400;\n  line-height: 1.2;\n}\n.win-contentdialog .win-contentdialog-content {\n  -ms-flex: 1 0 auto;\n  -webkit-flex: 1 0 auto;\n  flex: 1 0 auto;\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.333;\n}\n.win-contentdialog .win-contentdialog-commands {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  margin-top: 24px;\n  margin-right: -4px;\n  /* Chop off margin on last command */\n}\n.win-contentdialog .win-contentdialog-commandspacer {\n  visibility: hidden;\n}\n.win-contentdialog .win-contentdialog-commands > button {\n  /* Each command should have the same width. Flexbox distributes widths using each\n           item's width and flex-grow as weights. Giving each command a flex-grow of 1\n           and a width of 0 causes each item to have equal weights and thus equal widths.\n         */\n  -ms-flex: 1 1 auto;\n  -webkit-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 0;\n  margin-right: 4px;\n  /* 4px of space between each command */\n  white-space: nowrap;\n}\n.win-splitview {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n  overflow: hidden;\n}\n.win-splitview.win-splitview-placementtop,\n.win-splitview.win-splitview-placementbottom {\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n.win-splitview.win-splitview-placementtop .win-splitview-panewrapper,\n.win-splitview.win-splitview-placementbottom .win-splitview-panewrapper {\n  -ms-flex-direction: column;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n.win-splitview .win-splitview-panewrapper {\n  position: relative;\n  z-index: 1;\n  outline: none;\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  overflow: hidden;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n.win-splitview .win-splitview-pane {\n  outline: none;\n}\n.win-splitview .win-splitview-pane,\n.win-splitview .win-splitview-paneplaceholder {\n  -ms-flex: 0 0 auto;\n  -webkit-flex: 0 0 auto;\n  flex: 0 0 auto;\n  overflow: hidden;\n}\n.win-splitview .win-splitview-contentwrapper {\n  position: relative;\n  z-index: 0;\n  -ms-flex: 1 1 0%;\n  -webkit-flex: 1 1 0%;\n  flex: 1 1 0%;\n  overflow: hidden;\n}\n.win-splitview .win-splitview-content {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-placementleft .win-splitview-pane,\n.win-splitview.win-splitview-pane-opened.win-splitview-placementright .win-splitview-pane {\n  width: 320px;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-placementtop .win-splitview-pane,\n.win-splitview.win-splitview-pane-opened.win-splitview-placementbottom .win-splitview-pane {\n  height: 60px;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementtop .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementbottom .win-splitview-panewrapper {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: auto;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ar) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(dv) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(fa) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(he) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ku-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(pa-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(prs) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ps) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(sd-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(syr) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ug) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ur) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(qps-plocm) .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: auto;\n  right: 0;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: auto;\n  right: 0;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ar) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(dv) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(fa) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(he) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ku-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(pa-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(prs) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ps) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(sd-Arab) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(syr) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ug) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ur) .win-splitview-panewrapper,\n.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(qps-plocm) .win-splitview-panewrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: auto;\n  height: 100%;\n}\n.win-splitview.win-splitview-pane-closed .win-splitview-paneplaceholder {\n  display: none;\n}\n.win-splitview.win-splitview-pane-closed.win-splitview-placementtop .win-splitview-pane,\n.win-splitview.win-splitview-pane-closed.win-splitview-placementbottom .win-splitview-pane {\n  height: 24px;\n}\n.win-splitview.win-splitview-pane-closed.win-splitview-placementleft .win-splitview-pane,\n.win-splitview.win-splitview-pane-closed.win-splitview-placementright .win-splitview-pane {\n  width: 48px;\n}\n.win-splitview.win-splitview-pane-closed.win-splitview-closeddisplaynone .win-splitview-pane {\n  display: none;\n}\n.win-splitview.win-splitview-openeddisplayinline .win-splitview-paneplaceholder {\n  display: none;\n}\nbutton.win-splitviewpanetoggle {\n  touch-action: manipulation;\n  box-sizing: border-box;\n  height: 48px;\n  width: 48px;\n  min-height: 0;\n  min-width: 0;\n  padding: 0;\n  border: 1px dotted transparent;\n  margin: 0;\n  outline: none;\n  background-color: transparent;\n}\nbutton.win-splitviewpanetoggle:after {\n  font-size: 24px;\n  font-family: 'Segoe MDL2 Assets', 'Symbols';\n  font-weight: 400;\n  line-height: 1.333;\n  content: \"\\E700\";\n}\n.win-appbar {\n  width: 100%;\n  min-width: 32px;\n  /* enough to fit the overflowbutton */\n  position: fixed;\n  position: -ms-device-fixed;\n}\n.win-appbar.win-appbar-top {\n  top: 0;\n}\n.win-appbar.win-appbar-bottom {\n  bottom: 0;\n}\n.win-appbar.win-appbar-closed.win-appbar-closeddisplaynone {\n  display: none;\n}\nbody {\n  background-color: #ffffff;\n  color: #000000;\n}\n.win-ui-light {\n  background-color: #ffffff;\n  color: #000000;\n}\n.win-ui-dark {\n  background-color: #000000;\n  color: #ffffff;\n}\n::selection {\n  color: #fff;\n}\n.win-link:hover {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-link:active {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-link[disabled] {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-checkbox::-ms-check {\n  color: #000000;\n  border-color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-checkbox:indeterminate::-ms-check {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-checkbox:checked::-ms-check {\n  color: #fff;\n  border-color: transparent;\n}\n.win-checkbox:hover::-ms-check {\n  border-color: #000000;\n}\n.win-checkbox:hover:indeterminate::-ms-check {\n  color: #000000;\n}\n.win-checkbox:active::-ms-check {\n  border-color: transparent;\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-checkbox:indeterminate:active::-ms-check {\n  color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-checkbox:disabled::-ms-check,\n.win-checkbox:indeterminate:disabled::-ms-check {\n  color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.2);\n  background-color: transparent;\n}\n.win-radio::-ms-check {\n  color: rgba(0, 0, 0, 0.8);\n  border-color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-radio:hover::-ms-check {\n  border-color: #000000;\n}\n.win-radio:hover::-ms-check {\n  color: #000000;\n}\n.win-radio:active::-ms-check {\n  color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-radio:disabled::-ms-check {\n  color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.win-progress-bar:not(:indeterminate),\n.win-progress-ring:not(:indeterminate),\n.win-ring:not(:indeterminate) {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-progress-bar::-webkit-progress-bar,\n.win-progress-ring::-webkit-progress-bar,\n.win-ring::-webkit-progress-bar {\n  background-color: transparent;\n}\n.win-progress-ring,\n.win-ring {\n  background-color: transparent;\n}\n.win-button {\n  color: #000000;\n  background-color: rgba(0, 0, 0, 0.2);\n  border-color: transparent;\n}\n.win-button:hover {\n  border-color: rgba(0, 0, 0, 0.4);\n}\n.win-button:active {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.win-button:disabled {\n  color: rgba(0, 0, 0, 0.2);\n  background-color: rgba(0, 0, 0, 0.2);\n  border-color: transparent;\n}\n.win-button.win-button-primary {\n  color: #fff;\n}\n.win-dropdown {\n  color: #000000;\n  background-color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.4);\n}\n.win-dropdown::-ms-expand {\n  color: rgba(0, 0, 0, 0.8);\n  background-color: transparent;\n}\n.win-dropdown:hover {\n  background-color: #f2f2f2;\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-dropdown:disabled {\n  color: rgba(0, 0, 0, 0.2);\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-dropdown:disabled::-ms-expand {\n  color: rgba(0, 0, 0, 0.2);\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.win-dropdown option {\n  color: #000000;\n  background-color: #f2f2f2;\n}\n.win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-dropdown option:hover,\n.win-dropdown option:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\n.win-dropdown optgroup {\n  color: #000000;\n  background-color: #f2f2f2;\n}\n.win-dropdown optgroup:disabled {\n  color: rgba(0, 0, 0, 0.2);\n}\nselect[multiple].win-dropdown {\n  border: none;\n  background-color: #f2f2f2;\n}\nselect[multiple].win-dropdown option {\n  color: #000000;\n}\nselect[multiple].win-dropdown option:hover {\n  color: #000000;\n}\nselect[multiple].win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-slider {\n  background-color: transparent;\n}\n.win-slider:hover::-ms-thumb {\n  background: #1f1f1f;\n}\n.win-slider:hover::-webkit-slider-thumb {\n  background: #1f1f1f;\n}\n.win-slider:hover::-moz-range-thumb {\n  background: #1f1f1f;\n}\n.win-slider:active::-ms-thumb {\n  background: #cccccc;\n}\n.win-slider:active::-webkit-slider-thumb {\n  background: #cccccc;\n}\n.win-slider:active::-moz-range-thumb {\n  background: #cccccc;\n}\n.win-slider:disabled::-ms-thumb {\n  background: #cccccc;\n}\n.win-slider:disabled::-webkit-slider-thumb {\n  background: #cccccc;\n}\n.win-slider:disabled::-moz-range-thumb {\n  background: #cccccc;\n}\n.win-slider:disabled::-ms-fill-lower {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-slider::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-slider::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-slider::-moz-range-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-slider:hover::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.6);\n}\n.win-slider:hover::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.6);\n}\n.win-slider:hover::-moz-range-track {\n  background: rgba(0, 0, 0, 0.6);\n}\n.win-slider:active::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-slider:active::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-slider:active::-moz-range-track {\n  background: rgba(0, 0, 0, 0.4);\n}\n.win-slider:disabled::-ms-fill-upper {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-slider:disabled::-webkit-slider-runnable-track {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-slider:disabled::-moz-range-track {\n  background: rgba(0, 0, 0, 0.2);\n}\n.win-slider::-ms-track {\n  color: transparent;\n  background-color: transparent;\n}\n.win-slider::-ms-ticks-before,\n.win-slider::-ms-ticks-after {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-textbox,\n.win-textarea {\n  color: #000000;\n  background-color: rgba(255, 255, 255, 0.4);\n  border-color: rgba(0, 0, 0, 0.4);\n}\n.win-textbox:-ms-input-placeholder,\n.win-textarea:-ms-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-textbox::-webkit-input-placeholder,\n.win-textarea::-webkit-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-textbox::-moz-input-placeholder,\n.win-textarea::-moz-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-textbox:hover,\n.win-textarea:hover {\n  background-color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-textbox:focus,\n.win-textarea:focus {\n  color: #000000;\n  background-color: #ffffff;\n}\n.win-textbox::-ms-clear,\n.win-textbox::-ms-reveal {\n  display: block;\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-textbox::-ms-clear:active,\n.win-textbox::-ms-reveal:active {\n  color: #ffffff;\n}\n.win-xbox :focus {\n  outline: 2px solid white;\n}\n.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-itemcontainer.win-selectionmode.win-container .win-itembox::after,\n.win-listview .win-surface.win-selectionmode .win-itembox::after {\n  border-color: #000000;\n  background-color: #e6e6e6;\n}\n.win-selectioncheckmark {\n  color: #000000;\n}\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox,\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-pressed {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-listview .win-itembox,\n.win-itemcontainer .win-itembox {\n  background-color: #ffffff;\n}\n.win-listview .win-container.win-backdrop {\n  background-color: rgba(155, 155, 155, 0.23);\n}\n.win-listview .win-groupheader {\n  outline-color: #000000;\n}\n.win-listview .win-focusedoutline,\n.win-itemcontainer .win-focusedoutline {\n  outline: #000000 dashed 2px;\n}\n.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\n.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {\n  opacity: 0.4;\n}\n.win-listview.win-selectionstylefilled .win-selected,\n.win-itemcontainer.win-selectionstylefilled.win-selected {\n  color: #000000;\n}\n.win-flipview .win-navbutton {\n  background-color: rgba(0, 0, 0, 0.4);\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-flipview .win-navbutton:hover:active {\n  background-color: rgba(0, 0, 0, 0.8);\n}\nhtml.win-hoverable .win-flipview .win-navbutton:hover {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-backbutton,\n.win-back,\n.win-navigation-backbutton {\n  background-color: transparent;\n  border: none;\n  color: #000000;\n}\n.win-backbutton:hover,\n.win-navigation-backbutton:hover .win-back {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.win-backbutton:active,\n.win-navigation-backbutton:active .win-back {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-backbutton:disabled,\n.win-backbutton:disabled:active,\n.win-navigation-backbutton:disabled,\n.win-navigation-backbutton:disabled .win-back,\n.win-navigation-backbutton:disabled:active .win-back {\n  color: rgba(0, 0, 0, 0.4);\n  background-color: transparent;\n}\n.win-backbutton:focus,\n.win-navigation-backbutton:focus .win-back {\n  outline-color: #000000;\n}\n.win-tooltip {\n  color: #000000;\n  border-color: #cccccc;\n  background-color: #f2f2f2;\n}\n.win-rating .win-star.win-tentative.win-full {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-rating .win-star.win-average.win-full,\n.win-rating .win-star.win-average.win-full.win-disabled {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-rating .win-star.win-empty {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-toggleswitch-header {\n  color: #000000;\n}\n.win-toggleswitch-value {\n  color: #000000;\n}\n.win-toggleswitch-thumb {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n.win-toggleswitch-off .win-toggleswitch-track {\n  border-color: rgba(0, 0, 0, 0.8);\n}\n.win-toggleswitch-pressed .win-toggleswitch-track {\n  border-color: rgba(0, 0, 0, 0.6);\n}\n.win-toggleswitch-pressed .win-toggleswitch-thumb {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-toggleswitch-disabled .win-toggleswitch-track {\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.win-toggleswitch-disabled .win-toggleswitch-thumb {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-toggleswitch-disabled .win-toggleswitch-header,\n.win-toggleswitch-disabled .win-toggleswitch-value {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-semanticzoom-button {\n  background-color: rgba(216, 216, 216, 0.33);\n  border-color: transparent;\n}\nbutton.win-semanticzoom-button.win-semanticzoom-button:active,\nbutton.win-semanticzoom-button.win-semanticzoom-button:hover:active {\n  background-color: #000000;\n}\n.win-pivot .win-pivot-title {\n  color: #000000;\n}\n.win-pivot .win-pivot-navbutton {\n  background-color: rgba(0, 0, 0, 0.4);\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-pivot button.win-pivot-header {\n  color: rgba(0, 0, 0, 0.6);\n  background-color: transparent;\n}\n.win-pivot button.win-pivot-header:focus,\n.win-pivot button.win-pivot-header.win-pivot-header:hover:active {\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-pivot button.win-pivot-header.win-pivot-header-selected {\n  color: #000000;\n}\n.win-pivot-header[disabled] {\n  color: rgba(0, 0, 0, 0.4);\n}\nbutton.win-hub-section-header-tabstop,\nbutton.win-hub-section-header-tabstop:hover:active {\n  color: #000000;\n}\nbutton.win-hub-section-header-tabstop.win-keyboard:focus {\n  outline: 1px dotted #000000;\n}\nbutton.win-hub-section-header-tabstop:-ms-keyboard-active {\n  color: #000000;\n}\nbutton.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {\n  color: rgba(0, 0, 0, 0.4);\n}\nbutton.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-overlay {\n  outline: none;\n}\nhr.win-command {\n  background-color: rgba(0, 0, 0, 0.4);\n}\ndiv.win-command,\nbutton.win-command {\n  border-color: transparent;\n  background-color: transparent;\n}\ndiv.win-command:hover:active,\nbutton.win-command:hover:active {\n  border-color: transparent;\n}\nbutton:enabled.win-command.win-keyboard:focus,\ndiv.win-command.win-keyboard:focus,\nbutton:enabled.win-command.win-command.win-keyboard:hover:focus,\ndiv.win-command.win-command.win-keyboard:hover:focus {\n  border-color: #000000;\n}\n.win-commandimage {\n  color: #000000;\n}\nbutton.win-command.win-command:enabled:hover:active,\nbutton.win-command.win-command:enabled:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\nbutton:enabled:hover:active .win-commandimage,\nbutton:enabled:active .win-commandimage {\n  color: #000000;\n}\nbutton:disabled .win-commandimage,\nbutton:disabled:active .win-commandimage {\n  color: rgba(0, 0, 0, 0.2);\n}\nbutton .win-label {\n  color: #000000;\n}\nbutton[aria-checked=true]:enabled .win-label,\nbutton[aria-checked=true]:enabled .win-commandimage,\nbutton[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n  color: #000000;\n}\nbutton[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n  color: #000000;\n}\nbutton[aria-checked=true].win-command:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.4;\n  box-sizing: content-box;\n  content: \"\";\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\nbutton.win-command:enabled:-ms-keyboard-active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\nbutton[aria-checked=true].win-command:enabled:hover:active {\n  background-color: transparent;\n}\nbutton.win-command:disabled,\nbutton.win-command:disabled:hover:active {\n  background-color: transparent;\n  border-color: transparent;\n}\nbutton.win-command:disabled .win-label,\nbutton.win-command:disabled:active .win-label {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-navbar,\n.win-navbar {\n  background-color: #e6e6e6;\n  border-color: #e6e6e6;\n}\n.win-navbar.win-menulayout .win-navbar-menu,\n.win-navbar.win-menulayout .win-navbar-menu,\n.win-navbar.win-menulayout .win-toolbar,\n.win-navbar.win-menulayout .win-toolbar {\n  background-color: inherit;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {\n  background-color: transparent;\n  outline: none;\n  border-color: transparent;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {\n  color: #000000;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {\n  border-color: #000000;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {\n  background-color: transparent;\n}\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,\n.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {\n  color: #000000;\n}\n.win-flyout,\n.win-flyout {\n  background-color: #ffffff;\n}\n.win-settingsflyout {\n  background-color: #ffffff;\n}\n.win-menu button,\n.win-menu button {\n  background-color: transparent;\n  color: #000000;\n}\n.win-menu button.win-command.win-command:enabled:hover:active,\n.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #000000;\n}\n.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,\n.win-menu-containsflyoutcommand button.win-command-flyout-activated:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.4;\n  content: \"\";\n  box-sizing: content-box;\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\n.win-menu button[aria-checked=true].win-command:before,\n.win-menu button[aria-checked=true].win-command:before {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-menu button:disabled,\n.win-menu button:disabled,\n.win-menu button:disabled:active,\n.win-menu button:disabled:active {\n  background-color: transparent;\n  color: rgba(0, 0, 0, 0.2);\n}\n.win-commandingsurface .win-commandingsurface-actionarea,\n.win-commandingsurface .win-commandingsurface-actionarea {\n  background-color: #e6e6e6;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton,\n.win-commandingsurface button.win-commandingsurface-overflowbutton {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,\n.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {\n  color: #000000;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {\n  border-color: #000000;\n}\n.win-commandingsurface .win-commandingsurface-overflowarea,\n.win-commandingsurface .win-commandingsurface-overflowarea {\n  background-color: #f2f2f2;\n}\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,\n.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,\n.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {\n  color: #000000;\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-autosuggestbox-flyout-highlighttext {\n  color: #4617b4;\n}\n.win-autosuggestbox-suggestion-separator {\n  color: #7a7a7a;\n}\n.win-autosuggestbox-suggestion-separator hr {\n  border-color: #7a7a7a;\n}\n.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {\n  color: #a38bda;\n}\n.win-autosuggestbox-flyout {\n  background-color: #f2f2f2;\n  color: #000000;\n}\n.win-autosuggestbox-suggestion-result:hover:active,\n.win-autosuggestbox-suggestion-query:hover:active {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-searchbox-button {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-searchbox-button-input-focus {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\n.win-navbarcontainer-pageindicator {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.win-navbarcontainer-pageindicator-current {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n.win-navbarcontainer-navarrow {\n  background-color: rgba(0, 0, 0, 0.4);\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {\n  background-color: rgba(0, 0, 0, 0.8);\n}\n.win-navbarcommand-button,\n.win-navbarcommand-splitbutton {\n  background-color: rgba(0, 0, 0, 0.1);\n  color: #000000;\n}\n.win-navbarcommand-button.win-pressed,\n.win-navbarcommand-splitbutton.win-pressed {\n  background-color: rgba(0, 0, 0, 0.28);\n}\n.win-navbarcommand-button.win-keyboard:focus::before {\n  content: \"\";\n  pointer-events: none;\n  position: absolute;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  border: 1px dotted #000000;\n}\n.win-navbarcommand-splitbutton.win-keyboard:focus::before {\n  border-color: #000000;\n}\n.win-contentdialog-dialog {\n  background-color: #f2f2f2;\n}\n.win-contentdialog-title {\n  color: #000000;\n}\n.win-contentdialog-content {\n  color: #000000;\n}\n.win-contentdialog-backgroundoverlay {\n  background-color: #ffffff;\n  opacity: 0.6;\n}\n.win-splitview-pane {\n  background-color: #f2f2f2;\n}\nbutton.win-splitviewpanetoggle {\n  color: #000000;\n}\nbutton.win-splitviewpanetoggle:active,\nbutton.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {\n  background-color: rgba(0, 0, 0, 0.2);\n}\nbutton.win-splitviewpanetoggle.win-keyboard:focus {\n  border-color: #000000;\n}\nhtml.win-hoverable {\n  /* LegacyAppBar control colors */\n}\nhtml.win-hoverable .win-selectionstylefilled .win-container:hover .win-itembox,\nhtml.win-hoverable .win-selectionstylefilled.win-container:hover .win-itembox {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-itemcontainer .win-itembox:hover::before {\n  border-color: #000000;\n}\nhtml.win-hoverable .win-listview .win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,\nhtml.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {\n  opacity: 0.6;\n}\nhtml.win-hoverable .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {\n  border-color: #000000;\n}\nhtml.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {\n  background-color: #000000;\n}\nhtml.win-hoverable button:hover.win-semanticzoom-button {\n  background-color: #d8d8d8;\n}\nhtml.win-hoverable .win-pivot .win-pivot-navbutton:hover {\n  color: rgba(0, 0, 0, 0.6);\n}\nhtml.win-hoverable .win-pivot button.win-pivot-header:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\nhtml.win-hoverable button.win-hub-section-header-tabstop:hover {\n  color: #000000;\n}\nhtml.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {\n  color: rgba(0, 0, 0, 0.8);\n}\nhtml.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,\nhtml.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #000000;\n}\nhtml.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #000000;\n}\nhtml.win-hoverable button.win-command:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n  color: #000000;\n}\nhtml.win-hoverable button.win-command:enabled:hover .win-commandglyph {\n  color: #000000;\n}\nhtml.win-hoverable .win-menu button.win-command:enabled:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n  color: #000000;\n}\nhtml.win-hoverable button[aria-checked=true].win-command:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {\n  opacity: 0.6;\n}\nhtml.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {\n  opacity: 0.7;\n}\nhtml.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,\nhtml.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,\nhtml.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {\n  color: #000000;\n}\nhtml.win-hoverable .win-autosuggestbox-suggestion-result:hover,\nhtml.win-hoverable .win-autosuggestbox-suggestion-query:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-navbarcontainer-navarrow:hover {\n  background-color: rgba(0, 0, 0, 0.6);\n}\nhtml.win-hoverable .win-navbarcommand-button:hover,\nhtml.win-hoverable .win-navbarcommand-splitbutton:hover {\n  background-color: rgba(0, 0, 0, 0.19);\n}\nhtml.win-hoverable .win-navbarcommand-button:hover.win-pressed,\nhtml.win-hoverable .win-navbarcommand-splitbutton:hover.win-pressed {\n  background-color: rgba(0, 0, 0, 0.28);\n}\nhtml.win-hoverable button.win-splitviewpanetoggle:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.win-ui-dark body {\n  background-color: #000000;\n  color: #ffffff;\n}\n.win-ui-dark .win-ui-dark {\n  background-color: #000000;\n  color: #ffffff;\n}\n.win-ui-dark .win-ui-light {\n  background-color: #ffffff;\n  color: #000000;\n}\n.win-ui-dark winjs-themedetection-tag {\n  opacity: 0;\n}\n.win-ui-dark ::selection {\n  color: #fff;\n}\n.win-ui-dark .win-link:hover {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-link:active {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-link[disabled] {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-checkbox::-ms-check {\n  color: #ffffff;\n  border-color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-ui-dark .win-checkbox:indeterminate::-ms-check {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-checkbox:checked::-ms-check {\n  color: #fff;\n  border-color: transparent;\n}\n.win-ui-dark .win-checkbox:hover::-ms-check {\n  border-color: #ffffff;\n}\n.win-ui-dark .win-checkbox:hover:indeterminate::-ms-check {\n  color: #ffffff;\n}\n.win-ui-dark .win-checkbox:active::-ms-check {\n  border-color: transparent;\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-checkbox:indeterminate:active::-ms-check {\n  color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-ui-dark .win-checkbox:disabled::-ms-check,\n.win-ui-dark .win-checkbox:indeterminate:disabled::-ms-check {\n  color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.2);\n  background-color: transparent;\n}\n.win-ui-dark .win-radio::-ms-check {\n  color: rgba(255, 255, 255, 0.8);\n  border-color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-ui-dark .win-radio:hover::-ms-check {\n  border-color: #ffffff;\n}\n.win-ui-dark .win-radio:hover::-ms-check {\n  color: #ffffff;\n}\n.win-ui-dark .win-radio:active::-ms-check {\n  color: rgba(255, 255, 255, 0.6);\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-radio:disabled::-ms-check {\n  color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-progress-bar:not(:indeterminate),\n.win-ui-dark .win-progress-ring:not(:indeterminate),\n.win-ui-dark .win-ring:not(:indeterminate) {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-progress-bar::-webkit-progress-bar,\n.win-ui-dark .win-progress-ring::-webkit-progress-bar,\n.win-ui-dark .win-ring::-webkit-progress-bar {\n  background-color: transparent;\n}\n.win-ui-dark .win-progress-ring,\n.win-ui-dark .win-ring {\n  background-color: transparent;\n}\n.win-ui-dark .win-button {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: transparent;\n}\n.win-ui-dark .win-button:hover {\n  border-color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-button:active {\n  background-color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-button:disabled {\n  color: rgba(255, 255, 255, 0.2);\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: transparent;\n}\n.win-ui-dark .win-button.win-button-primary {\n  color: #fff;\n}\n.win-ui-dark .win-dropdown {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-dropdown::-ms-expand {\n  color: rgba(255, 255, 255, 0.8);\n  background-color: transparent;\n}\n.win-ui-dark .win-dropdown:hover {\n  background-color: #2b2b2b;\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-dropdown:disabled {\n  color: rgba(255, 255, 255, 0.2);\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-dropdown:disabled::-ms-expand {\n  color: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-dropdown option {\n  color: #ffffff;\n  background-color: #2b2b2b;\n}\n.win-ui-dark .win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-ui-dark .win-dropdown option:hover,\n.win-ui-dark .win-dropdown option:active {\n  background-color: rgba(0, 0, 0, 0.2);\n  color: #ffffff;\n}\n.win-ui-dark .win-dropdown optgroup {\n  color: #ffffff;\n  background-color: #2b2b2b;\n}\n.win-ui-dark .win-dropdown optgroup:disabled {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark select[multiple].win-dropdown {\n  border: none;\n  background-color: #2b2b2b;\n}\n.win-ui-dark select[multiple].win-dropdown option {\n  color: #ffffff;\n}\n.win-ui-dark select[multiple].win-dropdown option:hover {\n  color: #ffffff;\n}\n.win-ui-dark select[multiple].win-dropdown option:checked {\n  color: #ffffff;\n}\n.win-ui-dark .win-slider {\n  background-color: transparent;\n}\n.win-ui-dark .win-slider:hover::-ms-thumb {\n  background: #f9f9f9;\n}\n.win-ui-dark .win-slider:hover::-webkit-slider-thumb {\n  background: #f9f9f9;\n}\n.win-ui-dark .win-slider:hover::-moz-range-thumb {\n  background: #f9f9f9;\n}\n.win-ui-dark .win-slider:active::-ms-thumb {\n  background: #767676;\n}\n.win-ui-dark .win-slider:active::-webkit-slider-thumb {\n  background: #767676;\n}\n.win-ui-dark .win-slider:active::-moz-range-thumb {\n  background: #767676;\n}\n.win-ui-dark .win-slider:disabled::-ms-thumb {\n  background: #333333;\n}\n.win-ui-dark .win-slider:disabled::-webkit-slider-thumb {\n  background: #333333;\n}\n.win-ui-dark .win-slider:disabled::-moz-range-thumb {\n  background: #333333;\n}\n.win-ui-dark .win-slider:disabled::-ms-fill-lower {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-slider::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-slider::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-slider::-moz-range-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-slider:hover::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-slider:hover::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-slider:hover::-moz-range-track {\n  background: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-slider:active::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-slider:active::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-slider:active::-moz-range-track {\n  background: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-slider:disabled::-ms-fill-upper {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-slider:disabled::-webkit-slider-runnable-track {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-slider:disabled::-moz-range-track {\n  background: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-slider::-ms-track {\n  color: transparent;\n  background-color: transparent;\n}\n.win-ui-dark .win-slider::-ms-ticks-before,\n.win-ui-dark .win-slider::-ms-ticks-after {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-textbox,\n.win-ui-dark .win-textarea {\n  color: #ffffff;\n  background-color: rgba(0, 0, 0, 0.4);\n  border-color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-textbox:-ms-input-placeholder,\n.win-ui-dark .win-textarea:-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-textbox::-webkit-input-placeholder,\n.win-ui-dark .win-textarea::-webkit-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-textbox::-moz-input-placeholder,\n.win-ui-dark .win-textarea::-moz-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-textbox:hover,\n.win-ui-dark .win-textarea:hover {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-textbox:focus,\n.win-ui-dark .win-textarea:focus {\n  color: #000000;\n  background-color: #ffffff;\n}\n.win-ui-dark .win-textbox::-ms-clear,\n.win-ui-dark .win-textbox::-ms-reveal {\n  display: block;\n  color: rgba(0, 0, 0, 0.6);\n}\n.win-ui-dark .win-textbox::-ms-clear:active,\n.win-ui-dark .win-textbox::-ms-reveal:active {\n  color: #ffffff;\n}\n.win-ui-dark .win-xbox :focus {\n  outline: 2px solid white;\n}\n.win-ui-dark .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,\n.win-ui-dark .win-itemcontainer.win-selectionmode.win-container .win-itembox::after,\n.win-ui-dark .win-listview .win-surface.win-selectionmode .win-itembox::after {\n  border-color: #ffffff;\n  background-color: #393939;\n}\n.win-ui-dark .win-selectioncheckmark {\n  color: #ffffff;\n}\n.win-ui-dark html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,\n.win-ui-dark html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox,\n.win-ui-dark html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,\n.win-ui-dark html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-pressed {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-listview .win-itembox,\n.win-ui-dark .win-itemcontainer .win-itembox {\n  background-color: #1d1d1d;\n}\n.win-ui-dark .win-listview .win-container.win-backdrop {\n  background-color: rgba(155, 155, 155, 0.23);\n}\n.win-ui-dark .win-listview .win-groupheader {\n  outline-color: #ffffff;\n}\n.win-ui-dark .win-listview .win-focusedoutline,\n.win-ui-dark .win-itemcontainer .win-focusedoutline {\n  outline: #ffffff dashed 2px;\n}\n.win-ui-dark .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\n.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {\n  opacity: 0.6;\n}\n.win-ui-dark .win-listview.win-selectionstylefilled .win-selected,\n.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected {\n  color: #ffffff;\n}\n.win-ui-dark .win-flipview .win-navbutton {\n  background-color: rgba(255, 255, 255, 0.4);\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-dark .win-flipview .win-navbutton:hover:active {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark html.win-hoverable .win-flipview .win-navbutton:hover {\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-backbutton,\n.win-ui-dark .win-back,\n.win-ui-dark .win-navigation-backbutton {\n  background-color: transparent;\n  border: none;\n  color: #ffffff;\n}\n.win-ui-dark .win-backbutton:hover,\n.win-ui-dark .win-navigation-backbutton:hover .win-back {\n  background-color: rgba(255, 255, 255, 0.1);\n}\n.win-ui-dark .win-backbutton:active,\n.win-ui-dark .win-navigation-backbutton:active .win-back {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-backbutton:disabled,\n.win-ui-dark .win-backbutton:disabled:active,\n.win-ui-dark .win-navigation-backbutton:disabled,\n.win-ui-dark .win-navigation-backbutton:disabled .win-back,\n.win-ui-dark .win-navigation-backbutton:disabled:active .win-back {\n  color: rgba(255, 255, 255, 0.4);\n  background-color: transparent;\n}\n.win-ui-dark .win-backbutton:focus,\n.win-ui-dark .win-navigation-backbutton:focus .win-back {\n  outline-color: #ffffff;\n}\n.win-ui-dark .win-tooltip {\n  color: #ffffff;\n  border-color: #767676;\n  background-color: #2b2b2b;\n}\n.win-ui-dark .win-rating .win-star.win-tentative.win-full {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-rating .win-star.win-average.win-full,\n.win-ui-dark .win-rating .win-star.win-average.win-full.win-disabled {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-rating .win-star.win-empty {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-toggleswitch-header {\n  color: #ffffff;\n}\n.win-ui-dark .win-toggleswitch-value {\n  color: #ffffff;\n}\n.win-ui-dark .win-toggleswitch-thumb {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-toggleswitch-off .win-toggleswitch-track {\n  border-color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-toggleswitch-pressed .win-toggleswitch-track {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-toggleswitch-pressed .win-toggleswitch-thumb {\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-track {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-thumb {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-header,\n.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-value {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-semanticzoom-button {\n  background-color: rgba(216, 216, 216, 0.33);\n  border-color: transparent;\n}\n.win-ui-dark button.win-semanticzoom-button.win-semanticzoom-button:active,\n.win-ui-dark button.win-semanticzoom-button.win-semanticzoom-button:hover:active {\n  background-color: #ffffff;\n}\n.win-ui-dark .win-pivot .win-pivot-title {\n  color: #ffffff;\n}\n.win-ui-dark .win-pivot .win-pivot-navbutton {\n  background-color: rgba(255, 255, 255, 0.4);\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-dark .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-pivot button.win-pivot-header {\n  color: rgba(255, 255, 255, 0.6);\n  background-color: transparent;\n}\n.win-ui-dark .win-pivot button.win-pivot-header:focus,\n.win-ui-dark .win-pivot button.win-pivot-header.win-pivot-header:hover:active {\n  color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-pivot button.win-pivot-header.win-pivot-header-selected {\n  color: #ffffff;\n}\n.win-ui-dark .win-pivot-header[disabled] {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark button.win-hub-section-header-tabstop,\n.win-ui-dark button.win-hub-section-header-tabstop:hover:active {\n  color: #ffffff;\n}\n.win-ui-dark button.win-hub-section-header-tabstop.win-keyboard:focus {\n  outline: 1px dotted #ffffff;\n}\n.win-ui-dark button.win-hub-section-header-tabstop:-ms-keyboard-active {\n  color: #ffffff;\n}\n.win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-overlay {\n  outline: none;\n}\n.win-ui-dark hr.win-command {\n  background-color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark div.win-command,\n.win-ui-dark button.win-command {\n  border-color: transparent;\n  background-color: transparent;\n}\n.win-ui-dark div.win-command:hover:active,\n.win-ui-dark button.win-command:hover:active {\n  border-color: transparent;\n}\n.win-ui-dark button:enabled.win-command.win-keyboard:focus,\n.win-ui-dark div.win-command.win-keyboard:focus,\n.win-ui-dark button:enabled.win-command.win-command.win-keyboard:hover:focus,\n.win-ui-dark div.win-command.win-command.win-keyboard:hover:focus {\n  border-color: #ffffff;\n}\n.win-ui-dark .win-commandimage {\n  color: #ffffff;\n}\n.win-ui-dark button.win-command.win-command:enabled:hover:active,\n.win-ui-dark button.win-command.win-command:enabled:active {\n  background-color: rgba(255, 255, 255, 0.2);\n  color: #ffffff;\n}\n.win-ui-dark button:enabled:hover:active .win-commandimage,\n.win-ui-dark button:enabled:active .win-commandimage {\n  color: #ffffff;\n}\n.win-ui-dark button:disabled .win-commandimage,\n.win-ui-dark button:disabled:active .win-commandimage {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark button .win-label {\n  color: #ffffff;\n}\n.win-ui-dark button[aria-checked=true]:enabled .win-label,\n.win-ui-dark button[aria-checked=true]:enabled .win-commandimage,\n.win-ui-dark button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n  color: #ffffff;\n}\n.win-ui-dark button[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n  color: #ffffff;\n}\n.win-ui-dark button[aria-checked=true].win-command:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.6;\n  box-sizing: content-box;\n  content: \"\";\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\n.win-ui-dark button.win-command:enabled:-ms-keyboard-active {\n  background-color: rgba(255, 255, 255, 0.2);\n  color: #ffffff;\n}\n.win-ui-dark button[aria-checked=true].win-command:enabled:hover:active {\n  background-color: transparent;\n}\n.win-ui-dark button.win-command:disabled,\n.win-ui-dark button.win-command:disabled:hover:active {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-ui-dark button.win-command:disabled .win-label,\n.win-ui-dark button.win-command:disabled:active .win-label {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark.win-navbar,\n.win-ui-dark .win-navbar {\n  background-color: #393939;\n  border-color: #393939;\n}\n.win-ui-dark.win-navbar.win-menulayout .win-navbar-menu,\n.win-ui-dark .win-navbar.win-menulayout .win-navbar-menu,\n.win-ui-dark.win-navbar.win-menulayout .win-toolbar,\n.win-ui-dark .win-navbar.win-menulayout .win-toolbar {\n  background-color: inherit;\n}\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {\n  background-color: transparent;\n  outline: none;\n  border-color: transparent;\n}\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {\n  color: #ffffff;\n}\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {\n  border-color: #ffffff;\n}\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {\n  background-color: transparent;\n}\n.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,\n.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n.win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n.win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {\n  color: #ffffff;\n}\n.win-ui-dark.win-flyout,\n.win-ui-dark .win-flyout {\n  background-color: #000000;\n}\n.win-ui-dark .win-settingsflyout {\n  background-color: #000000;\n}\n.win-ui-dark.win-menu button,\n.win-ui-dark .win-menu button {\n  background-color: transparent;\n  color: #ffffff;\n}\n.win-ui-dark .win-menu button.win-command.win-command:enabled:hover:active,\n.win-ui-dark .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n  color: #ffffff;\n}\n.win-ui-dark.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,\n.win-ui-dark .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  opacity: 0.6;\n  content: \"\";\n  box-sizing: content-box;\n  /* We want this pseudo element to cover the border of its parent. */\n  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n  border-width: 1px;\n  border-style: solid;\n  top: -1px;\n  left: -1px;\n}\n.win-ui-dark.win-menu button[aria-checked=true].win-command:before,\n.win-ui-dark .win-menu button[aria-checked=true].win-command:before {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-ui-dark.win-menu button:disabled,\n.win-ui-dark .win-menu button:disabled,\n.win-ui-dark.win-menu button:disabled:active,\n.win-ui-dark .win-menu button:disabled:active {\n  background-color: transparent;\n  color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark.win-commandingsurface .win-commandingsurface-actionarea,\n.win-ui-dark .win-commandingsurface .win-commandingsurface-actionarea {\n  background-color: #393939;\n}\n.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton,\n.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton {\n  background-color: transparent;\n  border-color: transparent;\n}\n.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,\n.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {\n  background-color: transparent;\n}\n.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,\n.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {\n  color: #ffffff;\n}\n.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,\n.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {\n  border-color: #ffffff;\n}\n.win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea,\n.win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea {\n  background-color: #2b2b2b;\n}\n.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,\n.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,\n.win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-autosuggestbox-flyout-highlighttext {\n  color: #4617b4;\n}\n.win-ui-dark .win-autosuggestbox-suggestion-separator {\n  color: #7a7a7a;\n}\n.win-ui-dark .win-autosuggestbox-suggestion-separator hr {\n  border-color: #7a7a7a;\n}\n.win-ui-dark .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {\n  color: #a38bda;\n}\n.win-ui-dark .win-autosuggestbox-flyout {\n  background-color: #2b2b2b;\n  color: #ffffff;\n}\n.win-ui-dark .win-autosuggestbox-suggestion-result:hover:active,\n.win-ui-dark .win-autosuggestbox-suggestion-query:hover:active {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-searchbox-button {\n  color: rgba(255, 255, 255, 0.4);\n}\n.win-ui-dark .win-searchbox-button-input-focus {\n  color: rgba(0, 0, 0, 0.4);\n}\n.win-ui-dark .win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\n.win-ui-dark .win-navbarcontainer-pageindicator {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark .win-navbarcontainer-pageindicator-current {\n  background-color: rgba(255, 255, 255, 0.6);\n}\n.win-ui-dark .win-navbarcontainer-navarrow {\n  background-color: rgba(255, 255, 255, 0.4);\n  color: rgba(0, 0, 0, 0.8);\n}\n.win-ui-dark .win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {\n  background-color: rgba(255, 255, 255, 0.8);\n}\n.win-ui-dark .win-navbarcommand-button,\n.win-ui-dark .win-navbarcommand-splitbutton {\n  background-color: rgba(255, 255, 255, 0.1);\n  color: #ffffff;\n}\n.win-ui-dark .win-navbarcommand-button.win-pressed,\n.win-ui-dark .win-navbarcommand-splitbutton.win-pressed {\n  background-color: rgba(255, 255, 255, 0.28);\n}\n.win-ui-dark .win-navbarcommand-button.win-keyboard:focus::before {\n  content: \"\";\n  pointer-events: none;\n  position: absolute;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  border: 1px dotted #ffffff;\n}\n.win-ui-dark .win-navbarcommand-splitbutton.win-keyboard:focus::before {\n  border-color: #ffffff;\n}\n.win-ui-dark .win-contentdialog-dialog {\n  background-color: #2b2b2b;\n}\n.win-ui-dark .win-contentdialog-title {\n  color: #ffffff;\n}\n.win-ui-dark .win-contentdialog-content {\n  color: #ffffff;\n}\n.win-ui-dark .win-contentdialog-backgroundoverlay {\n  background-color: #000000;\n  opacity: 0.6;\n}\n.win-ui-dark .win-splitview-pane {\n  background-color: #171717;\n}\n.win-ui-dark button.win-splitviewpanetoggle {\n  color: #ffffff;\n}\n.win-ui-dark button.win-splitviewpanetoggle:active,\n.win-ui-dark button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n.win-ui-dark button.win-splitviewpanetoggle.win-keyboard:focus {\n  border-color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark {\n  /* LegacyAppBar control colors */\n}\nhtml.win-hoverable .win-ui-dark .win-selectionstylefilled .win-container:hover .win-itembox,\nhtml.win-hoverable .win-ui-dark .win-selectionstylefilled.win-container:hover .win-itembox {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-ui-dark .win-listview .win-itembox:hover::before,\nhtml.win-hoverable .win-ui-dark .win-itemcontainer .win-itembox:hover::before {\n  border-color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark .win-listview .win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-ui-dark .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,\nhtml.win-hoverable .win-ui-dark .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,\nhtml.win-hoverable .win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {\n  opacity: 0.8;\n}\nhtml.win-hoverable .win-ui-dark .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {\n  border-color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {\n  background-color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark button:hover.win-semanticzoom-button {\n  background-color: #d8d8d8;\n}\nhtml.win-hoverable .win-ui-dark .win-pivot .win-pivot-navbutton:hover {\n  color: rgba(255, 255, 255, 0.6);\n}\nhtml.win-hoverable .win-ui-dark .win-pivot button.win-pivot-header:hover {\n  color: rgba(255, 255, 255, 0.8);\n}\nhtml.win-hoverable .win-ui-dark button.win-hub-section-header-tabstop:hover {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {\n  color: rgba(255, 255, 255, 0.8);\n}\nhtml.win-hoverable .win-ui-dark.win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark .win-navbar button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark.win-navbar button.win-navbar-invokebutton:disabled:hover,\nhtml.win-hoverable .win-ui-dark .win-navbar button.win-navbar-invokebutton:disabled:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\nhtml.win-hoverable .win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark button.win-command:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark button.win-command:enabled:hover .win-commandglyph {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark .win-menu button.win-command:enabled:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark button[aria-checked=true].win-command:hover {\n  background-color: transparent;\n}\nhtml.win-hoverable .win-ui-dark button:enabled[aria-checked=true].win-command:hover:before {\n  opacity: 0.8;\n}\nhtml.win-hoverable .win-ui-dark button:enabled[aria-checked=true].win-command:hover:active:before {\n  opacity: 0.9;\n}\nhtml.win-hoverable .win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable .win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\nhtml.win-hoverable .win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,\nhtml.win-hoverable .win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,\nhtml.win-hoverable .win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark .win-autosuggestbox-suggestion-result:hover,\nhtml.win-hoverable .win-ui-dark .win-autosuggestbox-suggestion-query:hover {\n  background-color: rgba(255, 255, 255, 0.1);\n}\nhtml.win-hoverable .win-ui-dark .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {\n  color: #ffffff;\n}\nhtml.win-hoverable .win-ui-dark .win-navbarcontainer-navarrow:hover {\n  background-color: rgba(255, 255, 255, 0.6);\n}\nhtml.win-hoverable .win-ui-dark .win-navbarcommand-button:hover,\nhtml.win-hoverable .win-ui-dark .win-navbarcommand-splitbutton:hover {\n  background-color: rgba(0, 0, 0, 0.19);\n}\nhtml.win-hoverable .win-ui-dark .win-navbarcommand-button:hover.win-pressed,\nhtml.win-hoverable .win-ui-dark .win-navbarcommand-splitbutton:hover.win-pressed {\n  background-color: rgba(0, 0, 0, 0.28);\n}\nhtml.win-hoverable .win-ui-dark button.win-splitviewpanetoggle:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n@media (-ms-high-contrast) {\n  .win-overlay {\n    outline: none;\n  }\n  hr.win-command {\n    background-color: ButtonText;\n  }\n  div.win-command,\n  button.win-command {\n    border-color: transparent;\n    background-color: transparent;\n  }\n  div.win-command:hover:active,\n  button.win-command:hover:active {\n    border-color: transparent;\n  }\n  button:enabled.win-command.win-keyboard:focus,\n  div.win-command.win-keyboard:focus,\n  button:enabled.win-command.win-command.win-keyboard:hover:focus,\n  div.win-command.win-command.win-keyboard:hover:focus {\n    border-color: ButtonText;\n  }\n  .win-commandimage {\n    color: ButtonText;\n  }\n  button.win-command.win-command:enabled:hover:active,\n  button.win-command.win-command:enabled:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  button:enabled:hover:active .win-commandimage,\n  button:enabled:active .win-commandimage {\n    color: ButtonFace;\n  }\n  button:disabled .win-commandimage,\n  button:disabled:active .win-commandimage {\n    color: GrayText;\n  }\n  button .win-label {\n    color: #000000;\n  }\n  button[aria-checked=true]:enabled .win-label,\n  button[aria-checked=true]:enabled .win-commandimage,\n  button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {\n    color: ButtonFace;\n  }\n  button[aria-checked=true]:-ms-keyboard-active .win-commandimage {\n    color: ButtonFace;\n  }\n  button[aria-checked=true].win-command:before {\n    position: absolute;\n    height: 100%;\n    width: 100%;\n    opacity: 1;\n    box-sizing: content-box;\n    content: \"\";\n    /* We want this pseudo element to cover the border of its parent. */\n    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n    border-width: 1px;\n    border-style: solid;\n    top: -1px;\n    left: -1px;\n  }\n  button.win-command:enabled:-ms-keyboard-active {\n    background-color: ButtonText;\n    color: ButtonText;\n  }\n  button[aria-checked=true].win-command:enabled:hover:active {\n    background-color: transparent;\n  }\n  button.win-command:disabled,\n  button.win-command:disabled:hover:active {\n    background-color: transparent;\n    border-color: transparent;\n  }\n  button.win-command:disabled .win-label,\n  button.win-command:disabled:active .win-label {\n    color: GrayText;\n  }\n  .win-navbar,\n  .win-navbar {\n    background-color: ButtonFace;\n    border-color: Highlight;\n  }\n  .win-navbar.win-menulayout .win-navbar-menu,\n  .win-navbar.win-menulayout .win-navbar-menu,\n  .win-navbar.win-menulayout .win-toolbar,\n  .win-navbar.win-menulayout .win-toolbar {\n    background-color: inherit;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {\n    background-color: transparent;\n    outline: none;\n    border-color: transparent;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {\n    background-color: transparent;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {\n    color: ButtonText;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {\n    border-color: ButtonText;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {\n    background-color: transparent;\n  }\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,\n  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {\n    color: GrayText;\n  }\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {\n    background-color: ButtonText;\n  }\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,\n  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {\n    color: ButtonFace;\n  }\n  .win-flyout,\n  .win-flyout {\n    background-color: ButtonFace;\n  }\n  .win-settingsflyout {\n    background-color: ButtonFace;\n  }\n  .win-menu button,\n  .win-menu button {\n    background-color: transparent;\n    color: ButtonText;\n  }\n  .win-menu button.win-command.win-command:enabled:hover:active,\n  .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {\n    background-color: ButtonText;\n    color: ButtonFace;\n  }\n  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before,\n  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {\n    position: absolute;\n    height: 100%;\n    width: 100%;\n    opacity: 0.4;\n    content: \"\";\n    box-sizing: content-box;\n    /* We want this pseudo element to cover the border of its parent. */\n    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/\n    border-width: 1px;\n    border-style: solid;\n    top: -1px;\n    left: -1px;\n  }\n  .win-menu button[aria-checked=true].win-command:before,\n  .win-menu button[aria-checked=true].win-command:before {\n    background-color: transparent;\n    border-color: transparent;\n  }\n  .win-menu button:disabled,\n  .win-menu button:disabled,\n  .win-menu button:disabled:active,\n  .win-menu button:disabled:active {\n    background-color: transparent;\n    color: GrayText;\n  }\n  .win-commandingsurface .win-commandingsurface-actionarea,\n  .win-commandingsurface .win-commandingsurface-actionarea {\n    background-color: ButtonFace;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton {\n    background-color: ButtonFace;\n    border-color: transparent;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {\n    background-color: ButtonFace;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {\n    color: ButtonText;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {\n    border-color: ButtonText;\n  }\n  .win-commandingsurface .win-commandingsurface-overflowarea,\n  .win-commandingsurface .win-commandingsurface-overflowarea {\n    background-color: ButtonFace;\n  }\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,\n  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {\n    background-color: Highlight;\n  }\n  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,\n  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {\n    color: ButtonFace;\n    background-color: ButtonText;\n  }\n  html.win-hoverable {\n    /* LegacyAppBar control colors */\n  }\n  html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,\n  html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {\n    background-color: transparent;\n  }\n  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n    color: HighlightText;\n  }\n  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,\n  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,\n  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {\n    color: HighlightText;\n  }\n  html.win-hoverable button.win-command:enabled:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  html.win-hoverable button.win-command:enabled:hover .win-commandglyph {\n    color: HighlightText;\n  }\n  html.win-hoverable .win-menu button.win-command:enabled:hover {\n    background-color: Highlight;\n    color: HighlightText;\n  }\n  html.win-hoverable button[aria-checked=true].win-command:hover {\n    background-color: transparent;\n  }\n  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {\n    opacity: 1;\n  }\n  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {\n    opacity: 1;\n  }\n  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\n  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,\n  html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,\n  html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {\n    background-color: Highlight;\n  }\n  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,\n  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {\n    color: HighlightText;\n  }\n}\n"
  },
  {
    "path": "templates/winjs/template/source/lib/winjs-4.0.1/js/base.js",
    "content": "﻿\n/*! Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */\n(function () {\n\n    var globalObject = \n        typeof window !== 'undefined' ? window :\n        typeof self !== 'undefined' ? self :\n        typeof global !== 'undefined' ? global :\n        {};\n    (function (factory) {\n        if (typeof define === 'function' && define.amd) {\n            // amd\n            define([], factory);\n        } else {\n            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.0 4.0.1.winjs.2015.6.10 base.js,StartTM');\n            if (typeof module !== 'undefined') {\n                // CommonJS\n                factory();\n            } else {\n                // No module system\n                factory(globalObject.WinJS);\n            }\n            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.0 4.0.1.winjs.2015.6.10 base.js,StopTM');\n        }\n    }(function (WinJS) {\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/*jshint ignore:start */\nvar require;\nvar define;\n/*jshint ignore:end */\n\n(function () {\n    \"use strict\";\n\n    var defined = {};\n    define = function (id, dependencies, factory) {\n        if (!Array.isArray(dependencies)) {\n            factory = dependencies;\n            dependencies = [];\n        }\n\n        var mod = {\n            dependencies: normalize(id, dependencies),\n            factory: factory\n        };\n\n        if (dependencies.indexOf('exports') !== -1) {\n            mod.exports = {};\n        }\n\n        defined[id] = mod;\n    };\n\n    // WinJS/Core depends on ./Core/_Base\n    // should return WinJS/Core/_Base\n    function normalize(id, dependencies) {\n        id = id || \"\";\n        var parent = id.split('/');\n        parent.pop();\n        return dependencies.map(function (dep) {\n            if (dep[0] === '.') {\n                var parts = dep.split('/');\n                var current = parent.slice(0);\n                parts.forEach(function (part) {\n                    if (part === '..') {\n                        current.pop();\n                    } else if (part !== '.') {\n                        current.push(part);\n                    }\n                });\n                return current.join('/');\n            } else {\n                return dep;\n            }\n        });\n    }\n\n    function resolve(dependencies, parent, exports) {\n        return dependencies.map(function (depName) {\n            if (depName === 'exports') {\n                return exports;\n            }\n\n            if (depName === 'require') {\n                return function (dependencies, factory) {\n                    require(normalize(parent, dependencies), factory);\n                };\n            }\n\n            var dep = defined[depName];\n            if (!dep) {\n                throw new Error(\"Undefined dependency: \" + depName);\n            }\n\n            if (!dep.resolved) {\n                dep.resolved = load(dep.dependencies, dep.factory, depName, dep.exports);\n                if (typeof dep.resolved === \"undefined\") {\n                    dep.resolved = dep.exports;\n                }\n            }\n\n            return dep.resolved;\n        });\n    }\n\n    function load(dependencies, factory, parent, exports) {\n        var deps = resolve(dependencies, parent, exports);\n        if (factory && factory.apply) {\n            return factory.apply(null, deps);\n        } else {\n            return factory;\n        }\n    }\n    require = function (dependencies, factory) { //jshint ignore:line\n        if (!Array.isArray(dependencies)) {\n            dependencies = [dependencies];\n        }\n        load(dependencies, factory);\n    };\n\n\n})();\ndefine(\"amd\", function(){});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_WinJS',{});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_Global',[], function () {\n    \"use strict\";\n    \n    // Appease jshint\n    /* global window, self, global */\n    \n    var globalObject =\n        typeof window !== 'undefined' ? window :\n        typeof self !== 'undefined' ? self :\n        typeof global !== 'undefined' ? global :\n        {};\n    return globalObject;\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_BaseCoreUtils',[\n    './_Global'\n    ], function baseCoreUtilsInit(_Global) {\n    \"use strict\";\n\n    var hasWinRT = !!_Global.Windows;\n\n    function markSupportedForProcessing(func) {\n        /// <signature helpKeyword=\"WinJS.Utilities.markSupportedForProcessing\">\n        /// <summary locid=\"WinJS.Utilities.markSupportedForProcessing\">\n        /// Marks a function as being compatible with declarative processing, such as WinJS.UI.processAll\n        /// or WinJS.Binding.processAll.\n        /// </summary>\n        /// <param name=\"func\" type=\"Function\" locid=\"WinJS.Utilities.markSupportedForProcessing_p:func\">\n        /// The function to be marked as compatible with declarative processing.\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.Utilities.markSupportedForProcessing_returnValue\">\n        /// The input function.\n        /// </returns>\n        /// </signature>\n        func.supportedForProcessing = true;\n        return func;\n    }\n\n    return {\n        hasWinRT: hasWinRT,\n        markSupportedForProcessing: markSupportedForProcessing,\n        _setImmediate: _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (handler) {\n            _Global.setTimeout(handler, 0);\n        }\n    };\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_WriteProfilerMark',[\n    './_Global'\n], function profilerInit(_Global) {\n    \"use strict\";\n\n    return _Global.msWriteProfilerMark || function () { };\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_Base',[\n    './_WinJS',\n    './_Global',\n    './_BaseCoreUtils',\n    './_WriteProfilerMark'\n    ], function baseInit(_WinJS, _Global, _BaseCoreUtils, _WriteProfilerMark) {\n    \"use strict\";\n\n    function initializeProperties(target, members, prefix) {\n        var keys = Object.keys(members);\n        var isArray = Array.isArray(target);\n        var properties;\n        var i, len;\n        for (i = 0, len = keys.length; i < len; i++) {\n            var key = keys[i];\n            var enumerable = key.charCodeAt(0) !== /*_*/95;\n            var member = members[key];\n            if (member && typeof member === 'object') {\n                if (member.value !== undefined || typeof member.get === 'function' || typeof member.set === 'function') {\n                    if (member.enumerable === undefined) {\n                        member.enumerable = enumerable;\n                    }\n                    if (prefix && member.setName && typeof member.setName === 'function') {\n                        member.setName(prefix + \".\" + key);\n                    }\n                    properties = properties || {};\n                    properties[key] = member;\n                    continue;\n                }\n            }\n            if (!enumerable) {\n                properties = properties || {};\n                properties[key] = { value: member, enumerable: enumerable, configurable: true, writable: true };\n                continue;\n            }\n            if (isArray) {\n                target.forEach(function (target) {\n                    target[key] = member;\n                });\n            } else {\n                target[key] = member;\n            }\n        }\n        if (properties) {\n            if (isArray) {\n                target.forEach(function (target) {\n                    Object.defineProperties(target, properties);\n                });\n            } else {\n                Object.defineProperties(target, properties);\n            }\n        }\n    }\n\n    (function () {\n\n        var _rootNamespace = _WinJS;\n        if (!_rootNamespace.Namespace) {\n            _rootNamespace.Namespace = Object.create(Object.prototype);\n        }\n\n        function createNamespace(parentNamespace, name) {\n            var currentNamespace = parentNamespace || {};\n            if (name) {\n                var namespaceFragments = name.split(\".\");\n                if (currentNamespace === _Global && namespaceFragments[0] === \"WinJS\") {\n                    currentNamespace = _WinJS;\n                    namespaceFragments.splice(0, 1);\n                }\n                for (var i = 0, len = namespaceFragments.length; i < len; i++) {\n                    var namespaceName = namespaceFragments[i];\n                    if (!currentNamespace[namespaceName]) {\n                        Object.defineProperty(currentNamespace, namespaceName,\n                            { value: {}, writable: false, enumerable: true, configurable: true }\n                        );\n                    }\n                    currentNamespace = currentNamespace[namespaceName];\n                }\n            }\n            return currentNamespace;\n        }\n\n        function defineWithParent(parentNamespace, name, members) {\n            /// <signature helpKeyword=\"WinJS.Namespace.defineWithParent\">\n            /// <summary locid=\"WinJS.Namespace.defineWithParent\">\n            /// Defines a new namespace with the specified name under the specified parent namespace.\n            /// </summary>\n            /// <param name=\"parentNamespace\" type=\"Object\" locid=\"WinJS.Namespace.defineWithParent_p:parentNamespace\">\n            /// The parent namespace.\n            /// </param>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Namespace.defineWithParent_p:name\">\n            /// The name of the new namespace.\n            /// </param>\n            /// <param name=\"members\" type=\"Object\" locid=\"WinJS.Namespace.defineWithParent_p:members\">\n            /// The members of the new namespace.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Namespace.defineWithParent_returnValue\">\n            /// The newly-defined namespace.\n            /// </returns>\n            /// </signature>\n            var currentNamespace = createNamespace(parentNamespace, name);\n\n            if (members) {\n                initializeProperties(currentNamespace, members, name || \"<ANONYMOUS>\");\n            }\n\n            return currentNamespace;\n        }\n\n        function define(name, members) {\n            /// <signature helpKeyword=\"WinJS.Namespace.define\">\n            /// <summary locid=\"WinJS.Namespace.define\">\n            /// Defines a new namespace with the specified name.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Namespace.define_p:name\">\n            /// The name of the namespace. This could be a dot-separated name for nested namespaces.\n            /// </param>\n            /// <param name=\"members\" type=\"Object\" locid=\"WinJS.Namespace.define_p:members\">\n            /// The members of the new namespace.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Namespace.define_returnValue\">\n            /// The newly-defined namespace.\n            /// </returns>\n            /// </signature>\n            return defineWithParent(_Global, name, members);\n        }\n\n        var LazyStates = {\n            uninitialized: 1,\n            working: 2,\n            initialized: 3,\n        };\n\n        function lazy(f) {\n            var name;\n            var state = LazyStates.uninitialized;\n            var result;\n            return {\n                setName: function (value) {\n                    name = value;\n                },\n                get: function () {\n                    switch (state) {\n                        case LazyStates.initialized:\n                            return result;\n\n                        case LazyStates.uninitialized:\n                            state = LazyStates.working;\n                            try {\n                                _WriteProfilerMark(\"WinJS.Namespace._lazy:\" + name + \",StartTM\");\n                                result = f();\n                            } finally {\n                                _WriteProfilerMark(\"WinJS.Namespace._lazy:\" + name + \",StopTM\");\n                                state = LazyStates.uninitialized;\n                            }\n                            f = null;\n                            state = LazyStates.initialized;\n                            return result;\n\n                        case LazyStates.working:\n                            throw \"Illegal: reentrancy on initialization\";\n\n                        default:\n                            throw \"Illegal\";\n                    }\n                },\n                set: function (value) {\n                    switch (state) {\n                        case LazyStates.working:\n                            throw \"Illegal: reentrancy on initialization\";\n\n                        default:\n                            state = LazyStates.initialized;\n                            result = value;\n                            break;\n                    }\n                },\n                enumerable: true,\n                configurable: true,\n            };\n        }\n\n        // helper for defining AMD module members\n        function moduleDefine(exports, name, members) {\n            var target = [exports];\n            var publicNS = null;\n            if (name) {\n                publicNS = createNamespace(_Global, name);\n                target.push(publicNS);\n            }\n            initializeProperties(target, members, name || \"<ANONYMOUS>\");\n            return publicNS;\n        }\n\n        // Establish members of the \"WinJS.Namespace\" namespace\n        Object.defineProperties(_rootNamespace.Namespace, {\n\n            defineWithParent: { value: defineWithParent, writable: true, enumerable: true, configurable: true },\n\n            define: { value: define, writable: true, enumerable: true, configurable: true },\n\n            _lazy: { value: lazy, writable: true, enumerable: true, configurable: true },\n\n            _moduleDefine: { value: moduleDefine, writable: true, enumerable: true, configurable: true }\n\n        });\n\n    })();\n\n    (function () {\n\n        function define(constructor, instanceMembers, staticMembers) {\n            /// <signature helpKeyword=\"WinJS.Class.define\">\n            /// <summary locid=\"WinJS.Class.define\">\n            /// Defines a class using the given constructor and the specified instance members.\n            /// </summary>\n            /// <param name=\"constructor\" type=\"Function\" locid=\"WinJS.Class.define_p:constructor\">\n            /// A constructor function that is used to instantiate this class.\n            /// </param>\n            /// <param name=\"instanceMembers\" type=\"Object\" locid=\"WinJS.Class.define_p:instanceMembers\">\n            /// The set of instance fields, properties, and methods made available on the class.\n            /// </param>\n            /// <param name=\"staticMembers\" type=\"Object\" locid=\"WinJS.Class.define_p:staticMembers\">\n            /// The set of static fields, properties, and methods made available on the class.\n            /// </param>\n            /// <returns type=\"Function\" locid=\"WinJS.Class.define_returnValue\">\n            /// The newly-defined class.\n            /// </returns>\n            /// </signature>\n            constructor = constructor || function () { };\n            _BaseCoreUtils.markSupportedForProcessing(constructor);\n            if (instanceMembers) {\n                initializeProperties(constructor.prototype, instanceMembers);\n            }\n            if (staticMembers) {\n                initializeProperties(constructor, staticMembers);\n            }\n            return constructor;\n        }\n\n        function derive(baseClass, constructor, instanceMembers, staticMembers) {\n            /// <signature helpKeyword=\"WinJS.Class.derive\">\n            /// <summary locid=\"WinJS.Class.derive\">\n            /// Creates a sub-class based on the supplied baseClass parameter, using prototypal inheritance.\n            /// </summary>\n            /// <param name=\"baseClass\" type=\"Function\" locid=\"WinJS.Class.derive_p:baseClass\">\n            /// The class to inherit from.\n            /// </param>\n            /// <param name=\"constructor\" type=\"Function\" locid=\"WinJS.Class.derive_p:constructor\">\n            /// A constructor function that is used to instantiate this class.\n            /// </param>\n            /// <param name=\"instanceMembers\" type=\"Object\" locid=\"WinJS.Class.derive_p:instanceMembers\">\n            /// The set of instance fields, properties, and methods to be made available on the class.\n            /// </param>\n            /// <param name=\"staticMembers\" type=\"Object\" locid=\"WinJS.Class.derive_p:staticMembers\">\n            /// The set of static fields, properties, and methods to be made available on the class.\n            /// </param>\n            /// <returns type=\"Function\" locid=\"WinJS.Class.derive_returnValue\">\n            /// The newly-defined class.\n            /// </returns>\n            /// </signature>\n            if (baseClass) {\n                constructor = constructor || function () { };\n                var basePrototype = baseClass.prototype;\n                constructor.prototype = Object.create(basePrototype);\n                _BaseCoreUtils.markSupportedForProcessing(constructor);\n                Object.defineProperty(constructor.prototype, \"constructor\", { value: constructor, writable: true, configurable: true, enumerable: true });\n                if (instanceMembers) {\n                    initializeProperties(constructor.prototype, instanceMembers);\n                }\n                if (staticMembers) {\n                    initializeProperties(constructor, staticMembers);\n                }\n                return constructor;\n            } else {\n                return define(constructor, instanceMembers, staticMembers);\n            }\n        }\n\n        function mix(constructor) {\n            /// <signature helpKeyword=\"WinJS.Class.mix\">\n            /// <summary locid=\"WinJS.Class.mix\">\n            /// Defines a class using the given constructor and the union of the set of instance members\n            /// specified by all the mixin objects. The mixin parameter list is of variable length.\n            /// </summary>\n            /// <param name=\"constructor\" locid=\"WinJS.Class.mix_p:constructor\">\n            /// A constructor function that is used to instantiate this class.\n            /// </param>\n            /// <returns type=\"Function\" locid=\"WinJS.Class.mix_returnValue\">\n            /// The newly-defined class.\n            /// </returns>\n            /// </signature>\n            constructor = constructor || function () { };\n            var i, len;\n            for (i = 1, len = arguments.length; i < len; i++) {\n                initializeProperties(constructor.prototype, arguments[i]);\n            }\n            return constructor;\n        }\n\n        // Establish members of \"WinJS.Class\" namespace\n        _WinJS.Namespace.define(\"WinJS.Class\", {\n            define: define,\n            derive: derive,\n            mix: mix\n        });\n\n    })();\n\n    return {\n        Namespace: _WinJS.Namespace,\n        Class: _WinJS.Class\n    };\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_ErrorFromName',[\n    './_Base'\n    ], function errorsInit(_Base) {\n    \"use strict\";\n\n    var ErrorFromName = _Base.Class.derive(Error, function (name, message) {\n        /// <signature helpKeyword=\"WinJS.ErrorFromName\">\n        /// <summary locid=\"WinJS.ErrorFromName\">\n        /// Creates an Error object with the specified name and message properties.\n        /// </summary>\n        /// <param name=\"name\" type=\"String\" locid=\"WinJS.ErrorFromName_p:name\">The name of this error. The name is meant to be consumed programmatically and should not be localized.</param>\n        /// <param name=\"message\" type=\"String\" optional=\"true\" locid=\"WinJS.ErrorFromName_p:message\">The message for this error. The message is meant to be consumed by humans and should be localized.</param>\n        /// <returns type=\"Error\" locid=\"WinJS.ErrorFromName_returnValue\">Error instance with .name and .message properties populated</returns>\n        /// </signature>\n        this.name = name;\n        this.message = message || name;\n    }, {\n        /* empty */\n    }, {\n        supportedForProcessing: false,\n    });\n\n    _Base.Namespace.define(\"WinJS\", {\n        // ErrorFromName establishes a simple pattern for returning error codes.\n        //\n        ErrorFromName: ErrorFromName\n    });\n\n    return ErrorFromName;\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_WinRT',[\n    'exports',\n    './_Global',\n    './_Base',\n], function winrtInit(exports, _Global, _Base) {\n    \"use strict\";\n\n    exports.msGetWeakWinRTProperty = _Global.msGetWeakWinRTProperty;\n    exports.msSetWeakWinRTProperty = _Global.msSetWeakWinRTProperty;\n\n    var APIs = [\n        \"Windows.ApplicationModel.DesignMode.designModeEnabled\",\n        \"Windows.ApplicationModel.Resources.Core.ResourceContext\",\n        \"Windows.ApplicationModel.Resources.Core.ResourceManager\",\n        \"Windows.ApplicationModel.Search.SearchQueryLinguisticDetails\",\n        \"Windows.Data.Text.SemanticTextQuery\",\n        \"Windows.Foundation.Collections.CollectionChange\",\n        \"Windows.Foundation.Diagnostics\",\n        \"Windows.Foundation.Uri\",\n        \"Windows.Globalization.ApplicationLanguages\",\n        \"Windows.Globalization.Calendar\",\n        \"Windows.Globalization.DateTimeFormatting\",\n        \"Windows.Globalization.Language\",\n        \"Windows.Phone.UI.Input.HardwareButtons\",\n        \"Windows.Storage.ApplicationData\",\n        \"Windows.Storage.CreationCollisionOption\",\n        \"Windows.Storage.BulkAccess.FileInformationFactory\",\n        \"Windows.Storage.FileIO\",\n        \"Windows.Storage.FileProperties.ThumbnailType\",\n        \"Windows.Storage.FileProperties.ThumbnailMode\",\n        \"Windows.Storage.FileProperties.ThumbnailOptions\",\n        \"Windows.Storage.KnownFolders\",\n        \"Windows.Storage.Search.FolderDepth\",\n        \"Windows.Storage.Search.IndexerOption\",\n        \"Windows.Storage.Streams.RandomAccessStreamReference\",\n        \"Windows.UI.ApplicationSettings.SettingsEdgeLocation\",\n        \"Windows.UI.ApplicationSettings.SettingsCommand\",\n        \"Windows.UI.ApplicationSettings.SettingsPane\",\n        \"Windows.UI.Core.AnimationMetrics\",\n        \"Windows.UI.Input.EdgeGesture\",\n        \"Windows.UI.Input.EdgeGestureKind\",\n        \"Windows.UI.Input.PointerPoint\",\n        \"Windows.UI.ViewManagement.HandPreference\",\n        \"Windows.UI.ViewManagement.InputPane\",\n        \"Windows.UI.ViewManagement.UIColorType\",\n        \"Windows.UI.ViewManagement.UISettings\",\n        \"Windows.UI.WebUI.Core.WebUICommandBar\",\n        \"Windows.UI.WebUI.Core.WebUICommandBarBitmapIcon\",\n        \"Windows.UI.WebUI.Core.WebUICommandBarClosedDisplayMode\",\n        \"Windows.UI.WebUI.Core.WebUICommandBarIconButton\",\n        \"Windows.UI.WebUI.Core.WebUICommandBarSymbolIcon\",\n        \"Windows.UI.WebUI.WebUIApplication\",\n    ];\n\n    APIs.forEach(function (api) {\n        var parts = api.split(\".\");\n        var leaf = {};\n        leaf[parts[parts.length - 1]] = {\n            get: function () {\n                return parts.reduce(function (current, part) { return current ? current[part] : null; }, _Global);\n            }\n        };\n        _Base.Namespace.defineWithParent(exports, parts.slice(0, -1).join(\".\"), leaf);\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_Events',[\n    'exports',\n    './_Base'\n    ], function eventsInit(exports, _Base) {\n    \"use strict\";\n\n\n    function createEventProperty(name) {\n        var eventPropStateName = \"_on\" + name + \"state\";\n\n        return {\n            get: function () {\n                var state = this[eventPropStateName];\n                return state && state.userHandler;\n            },\n            set: function (handler) {\n                var state = this[eventPropStateName];\n                if (handler) {\n                    if (!state) {\n                        state = { wrapper: function (evt) { return state.userHandler(evt); }, userHandler: handler };\n                        Object.defineProperty(this, eventPropStateName, { value: state, enumerable: false, writable:true, configurable: true });\n                        this.addEventListener(name, state.wrapper, false);\n                    }\n                    state.userHandler = handler;\n                } else if (state) {\n                    this.removeEventListener(name, state.wrapper, false);\n                    this[eventPropStateName] = null;\n                }\n            },\n            enumerable: true\n        };\n    }\n\n    function createEventProperties() {\n        /// <signature helpKeyword=\"WinJS.Utilities.createEventProperties\">\n        /// <summary locid=\"WinJS.Utilities.createEventProperties\">\n        /// Creates an object that has one property for each name passed to the function.\n        /// </summary>\n        /// <param name=\"events\" locid=\"WinJS.Utilities.createEventProperties_p:events\">\n        /// A variable list of property names.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Utilities.createEventProperties_returnValue\">\n        /// The object with the specified properties. The names of the properties are prefixed with 'on'.\n        /// </returns>\n        /// </signature>\n        var props = {};\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            var name = arguments[i];\n            props[\"on\" + name] = createEventProperty(name);\n        }\n        return props;\n    }\n\n    var EventMixinEvent = _Base.Class.define(\n        function EventMixinEvent_ctor(type, detail, target) {\n            this.detail = detail;\n            this.target = target;\n            this.timeStamp = Date.now();\n            this.type = type;\n        },\n        {\n            bubbles: { value: false, writable: false },\n            cancelable: { value: false, writable: false },\n            currentTarget: {\n                get: function () { return this.target; }\n            },\n            defaultPrevented: {\n                get: function () { return this._preventDefaultCalled; }\n            },\n            trusted: { value: false, writable: false },\n            eventPhase: { value: 0, writable: false },\n            target: null,\n            timeStamp: null,\n            type: null,\n\n            preventDefault: function () {\n                this._preventDefaultCalled = true;\n            },\n            stopImmediatePropagation: function () {\n                this._stopImmediatePropagationCalled = true;\n            },\n            stopPropagation: function () {\n            }\n        }, {\n            supportedForProcessing: false,\n        }\n    );\n\n    var eventMixin = {\n        _listeners: null,\n\n        addEventListener: function (type, listener, useCapture) {\n            /// <signature helpKeyword=\"WinJS.Utilities.eventMixin.addEventListener\">\n            /// <summary locid=\"WinJS.Utilities.eventMixin.addEventListener\">\n            /// Adds an event listener to the control.\n            /// </summary>\n            /// <param name=\"type\" locid=\"WinJS.Utilities.eventMixin.addEventListener_p:type\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name=\"listener\" locid=\"WinJS.Utilities.eventMixin.addEventListener_p:listener\">\n            /// The listener to invoke when the event is raised.\n            /// </param>\n            /// <param name=\"useCapture\" locid=\"WinJS.Utilities.eventMixin.addEventListener_p:useCapture\">\n            /// if true initiates capture, otherwise false.\n            /// </param>\n            /// </signature>\n            useCapture = useCapture || false;\n            this._listeners = this._listeners || {};\n            var eventListeners = (this._listeners[type] = this._listeners[type] || []);\n            for (var i = 0, len = eventListeners.length; i < len; i++) {\n                var l = eventListeners[i];\n                if (l.useCapture === useCapture && l.listener === listener) {\n                    return;\n                }\n            }\n            eventListeners.push({ listener: listener, useCapture: useCapture });\n        },\n        dispatchEvent: function (type, details) {\n            /// <signature helpKeyword=\"WinJS.Utilities.eventMixin.dispatchEvent\">\n            /// <summary locid=\"WinJS.Utilities.eventMixin.dispatchEvent\">\n            /// Raises an event of the specified type and with the specified additional properties.\n            /// </summary>\n            /// <param name=\"type\" locid=\"WinJS.Utilities.eventMixin.dispatchEvent_p:type\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name=\"details\" locid=\"WinJS.Utilities.eventMixin.dispatchEvent_p:details\">\n            /// The set of additional properties to be attached to the event object when the event is raised.\n            /// </param>\n            /// <returns type=\"Boolean\" locid=\"WinJS.Utilities.eventMixin.dispatchEvent_returnValue\">\n            /// true if preventDefault was called on the event.\n            /// </returns>\n            /// </signature>\n            var listeners = this._listeners && this._listeners[type];\n            if (listeners) {\n                var eventValue = new EventMixinEvent(type, details, this);\n                // Need to copy the array to protect against people unregistering while we are dispatching\n                listeners = listeners.slice(0, listeners.length);\n                for (var i = 0, len = listeners.length; i < len && !eventValue._stopImmediatePropagationCalled; i++) {\n                    listeners[i].listener(eventValue);\n                }\n                return eventValue.defaultPrevented || false;\n            }\n            return false;\n        },\n        removeEventListener: function (type, listener, useCapture) {\n            /// <signature helpKeyword=\"WinJS.Utilities.eventMixin.removeEventListener\">\n            /// <summary locid=\"WinJS.Utilities.eventMixin.removeEventListener\">\n            /// Removes an event listener from the control.\n            /// </summary>\n            /// <param name=\"type\" locid=\"WinJS.Utilities.eventMixin.removeEventListener_p:type\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name=\"listener\" locid=\"WinJS.Utilities.eventMixin.removeEventListener_p:listener\">\n            /// The listener to remove.\n            /// </param>\n            /// <param name=\"useCapture\" locid=\"WinJS.Utilities.eventMixin.removeEventListener_p:useCapture\">\n            /// Specifies whether to initiate capture.\n            /// </param>\n            /// </signature>\n            useCapture = useCapture || false;\n            var listeners = this._listeners && this._listeners[type];\n            if (listeners) {\n                for (var i = 0, len = listeners.length; i < len; i++) {\n                    var l = listeners[i];\n                    if (l.listener === listener && l.useCapture === useCapture) {\n                        listeners.splice(i, 1);\n                        if (listeners.length === 0) {\n                            delete this._listeners[type];\n                        }\n                        // Only want to remove one element for each call to removeEventListener\n                        break;\n                    }\n                }\n            }\n        }\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        _createEventProperty: createEventProperty,\n        createEventProperties: createEventProperties,\n        eventMixin: eventMixin\n    });\n\n});\n\n\ndefine('require-json',{load: function(id){throw new Error(\"Dynamic load not allowed: \" + id);}});\n\ndefine('require-json!strings/en-us/Microsoft.WinJS.resjson',{\n    \"ui/appBarAriaLabel\": \"App Bar\",\n    \"ui/appBarCommandAriaLabel\": \"App Bar Item\",\n\t\"ui/appBarOverflowButtonAriaLabel\": \"View more\",\n    \"ui/autoSuggestBoxAriaLabel\": \"Autosuggestbox\",\n    \"ui/autoSuggestBoxAriaLabelInputNoPlaceHolder\": \"Autosuggestbox, enter to submit query, esc to clear text\",\n    \"ui/autoSuggestBoxAriaLabelInputPlaceHolder\": \"Autosuggestbox, {0}, enter to submit query, esc to clear text\",\n    \"ui/autoSuggestBoxAriaLabelQuery\": \"Suggestion: {0}\",\n    \"_ui/autoSuggestBoxAriaLabelQuery.comment\": \"Suggestion: query text (example: Suggestion: contoso)\",\n    \"ui/autoSuggestBoxAriaLabelSeparator\": \"Separator: {0}\",\n    \"_ui/autoSuggestBoxAriaLabelSeparator.comment\": \"Separator: separator text (example: Separator: People or Separator: Apps)\",\n    \"ui/autoSuggestBoxAriaLabelResult\": \"Result: {0}, {1}\",\n    \"_ui/autoSuggestBoxAriaLabelResult.comment\": \"Result: text, detailed text (example: Result: contoso, www.contoso.com)\",\n    \"ui/averageRating\": \"Average Rating\",\n    \"ui/backbuttonarialabel\": \"Back\",\n    \"ui/chapterSkipBackMediaCommandDisplayText\": \"Chapter back\",\n    \"ui/chapterSkipForwardMediaCommandDisplayText\": \"Chapter forward\",\n    \"ui/clearYourRating\" : \"Clear your rating\",\n    \"ui/closedCaptionsLabelNone\": \"Off\",\n    \"ui/closedCaptionsMediaCommandDisplayText\": \"Closed captioning\",\n    \"ui/closeOverlay\" : \"Close\",\n    \"ui/commandingSurfaceAriaLabel\": \"CommandingSurface\",\n    \"ui/commandingSurfaceOverflowButtonAriaLabel\": \"View more\",\n    \"ui/datePicker\": \"Date Picker\",\n    \"ui/fastForwardMediaCommandDisplayText\": \"Fast forward\",\n    \"ui/fastForwardFeedbackDisplayText\": \" {0}X\",\n    \"ui/fastForwardFeedbackSlowMotionDisplayText\": \"0.5X\",\n    \"ui/flipViewPanningContainerAriaLabel\": \"Scrolling Container\",\n    \"ui/flyoutAriaLabel\": \"Flyout\",\n    \"ui/goToFullScreenButtonLabel\": \"Go full screen\",\n    \"ui/goToLiveMediaCommandDisplayText\": \"LIVE\",\n    \"ui/hubViewportAriaLabel\": \"Scrolling Container\",\n    \"ui/listViewViewportAriaLabel\": \"Scrolling Container\",\n    \"ui/mediaErrorAborted\": \"Playback was interrupted. Please try again.\",\n    \"ui/mediaErrorNetwork\": \"There was a network connection error.\",\n    \"ui/mediaErrorDecode\": \"The content could not be decoded\",\n    \"ui/mediaErrorSourceNotSupported\": \"This content type is not supported.\",\n    \"ui/mediaErrorUnknown\": \"There was an unknown error.\",\n    \"ui/mediaPlayerAudioTracksButtonLabel\": \"Audio tracks\",\n    \"ui/mediaPlayerCastButtonLabel\": \"Cast\",\n    \"ui/mediaPlayerChapterSkipBackButtonLabel\": \"Previous\",\n    \"ui/mediaPlayerChapterSkipForwardButtonLabel\": \"Next\",\n    \"ui/mediaPlayerClosedCaptionsButtonLabel\": \"Closed captions\",\n    \"ui/mediaPlayerFastForwardButtonLabel\": \"Fast forward\",\n    \"ui/mediaPlayerFullscreenButtonLabel\": \"Fullscreen\",\n    \"ui/mediaPlayerLiveButtonLabel\": \"LIVE\",\n    \"ui/mediaPlayerNextTrackButtonLabel\": \"Next\",\n    \"ui/mediaPlayerOverlayActiveOptionIndicator\": \"(On)\",\n    \"ui/mediaPlayerPauseButtonLabel\": \"Pause\",\n    \"ui/mediaPlayerPlayButtonLabel\": \"Play\",\n    \"ui/mediaPlayerPlayFromBeginningButtonLabel\": \"Replay\",\n    \"ui/mediaPlayerPlayRateButtonLabel\": \"Playback rate\",\n    \"ui/mediaPlayerPreviousTrackButtonLabel\": \"Previous\",\n    \"ui/mediaPlayerRewindButtonLabel\": \"Rewind\",\n    \"ui/mediaPlayerStopButtonLabel\": \"Stop\",\n    \"ui/mediaPlayerTimeSkipBackButtonLabel\": \"8 second replay\",   \n    \"ui/mediaPlayerTimeSkipForwardButtonLabel\": \"30 second skip\",\n    \"ui/mediaPlayerToggleSnapButtonLabel\": \"Snap\",\n    \"ui/mediaPlayerVolumeButtonLabel\": \"Volume\",\n    \"ui/mediaPlayerZoomButtonLabel\": \"Zoom\",\n    \"ui/menuCommandAriaLabel\": \"Menu Item\",\n    \"ui/menuAriaLabel\": \"Menu\",\n    \"ui/navBarContainerViewportAriaLabel\": \"Scrolling Container\",\n    \"ui/nextTrackMediaCommandDisplayText\": \"Next track\",\n    \"ui/off\" : \"Off\",\n    \"ui/on\" : \"On\",\n    \"ui/pauseMediaCommandDisplayText\": \"Pause\",\n    \"ui/playFromBeginningMediaCommandDisplayText\": \"Play again\",\n    \"ui/playbackRateHalfSpeedLabel\": \"0.5x\",\n    \"ui/playbackRateNormalSpeedLabel\": \"Normal\",\n    \"ui/playbackRateOneAndHalfSpeedLabel\": \"1.5x\",\n    \"ui/playbackRateDoubleSpeedLabel\": \"2x\",\n    \"ui/playMediaCommandDisplayText\": \"Play\",\n    \"ui/pivotAriaLabel\": \"Pivot\",\n    \"ui/pivotViewportAriaLabel\": \"Scrolling Container\",\n    \"ui/replayMediaCommandDisplayText\": \"Play again\",\n    \"ui/rewindMediaCommandDisplayText\": \"Rewind\",\n    \"ui/rewindFeedbackDisplayText\": \" {0}X\",\n    \"ui/rewindFeedbackSlowMotionDisplayText\": \"0.5X\",\n    \"ui/searchBoxAriaLabel\": \"Searchbox\",\n    \"ui/searchBoxAriaLabelInputNoPlaceHolder\": \"Searchbox, enter to submit query, esc to clear text\",\n    \"ui/searchBoxAriaLabelInputPlaceHolder\": \"Searchbox, {0}, enter to submit query, esc to clear text\",\n    \"ui/searchBoxAriaLabelButton\": \"Click to submit query\",\n    \"ui/seeMore\":  \"See more\",\n    \"ui/selectAMPM\": \"Select A.M P.M\",\n    \"ui/selectDay\": \"Select Day\",\n    \"ui/selectHour\": \"Select Hour\",\n    \"ui/selectMinute\": \"Select Minute\",\n    \"ui/selectMonth\": \"Select Month\",\n    \"ui/selectYear\": \"Select Year\",\n    \"ui/settingsFlyoutAriaLabel\": \"Settings Flyout\",\n    \"ui/stopMediaCommandDisplayText\": \"Stop\",\n    \"ui/tentativeRating\": \"Tentative Rating\",\n    \"ui/timePicker\": \"Time Picker\",\n    \"ui/timeSeparator\": \":\",\n    \"ui/timeSkipBackMediaCommandDisplayText\": \"Skip back\",\n    \"ui/timeSkipForwardMediaCommandDisplayText\": \"Skip forward\",\n    \"ui/toolbarAriaLabel\": \"ToolBar\",\n    \"ui/toolbarOverflowButtonAriaLabel\": \"View more\",\n    \"ui/unrated\": \"Unrated\",\n    \"ui/userRating\": \"User Rating\",\n    \"ui/zoomMediaCommandDisplayText\": \"Zoom\",\n    // AppBar Icons follow, the format of the ui.js and ui.resjson differ for\n    // the AppBarIcon namespace.  The remainder of the file therefore differs.\n    // Code point comments are the icon glyphs in the 'Segoe UI Symbol' font.\n    \"ui/appBarIcons/previous\":                            \"\\uE100\", //  group:Media\n    \"_ui/appBarIcons/previous.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/next\":                                \"\\uE101\", //  group:Media\n    \"_ui/appBarIcons/next.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/play\":                                \"\\uE102\", //  group:Media\n    \"_ui/appBarIcons/play.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/pause\":                               \"\\uE103\", //  group:Media\n    \"_ui/appBarIcons/pause.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/edit\":                                \"\\uE104\", //  group:File\n    \"_ui/appBarIcons/edit.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/save\":                                \"\\uE105\", //  group:File\n    \"_ui/appBarIcons/save.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/clear\":                               \"\\uE106\", //  group:File\n    \"_ui/appBarIcons/clear.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/delete\":                              \"\\uE107\", //  group:File\n    \"_ui/appBarIcons/delete.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/remove\":                              \"\\uE108\", //  group:File\n    \"_ui/appBarIcons/remove.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/add\":                                 \"\\uE109\", //  group:File\n    \"_ui/appBarIcons/add.comment\":                        \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/cancel\":                              \"\\uE10A\", //  group:Editing\n    \"_ui/appBarIcons/cancel.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/accept\":                              \"\\uE10B\", //  group:General\n    \"_ui/appBarIcons/accept.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/more\":                                \"\\uE10C\", //  group:General\n    \"_ui/appBarIcons/more.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/redo\":                                \"\\uE10D\", //  group:Editing\n    \"_ui/appBarIcons/redo.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/undo\":                                \"\\uE10E\", //  group:Editing\n    \"_ui/appBarIcons/undo.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/home\":                                \"\\uE10F\", //  group:General\n    \"_ui/appBarIcons/home.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/up\":                                  \"\\uE110\", //  group:General\n    \"_ui/appBarIcons/up.comment\":                         \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/forward\":                             \"\\uE111\", //  group:General\n    \"_ui/appBarIcons/forward.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/right\":                               \"\\uE111\", //  group:General\n    \"_ui/appBarIcons/right.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/back\":                                \"\\uE112\", //  group:General\n    \"_ui/appBarIcons/back.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/left\":                                \"\\uE112\", //  group:General\n    \"_ui/appBarIcons/left.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/favorite\":                            \"\\uE113\", //  group:Media\n    \"_ui/appBarIcons/favorite.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/camera\":                              \"\\uE114\", //  group:System\n    \"_ui/appBarIcons/camera.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",    \n    \"ui/appBarIcons/settings\":                            \"\\uE115\", //  group:System\n    \"_ui/appBarIcons/settings.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/video\":                               \"\\uE116\", //  group:Media\n    \"_ui/appBarIcons/video.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/sync\":                                \"\\uE117\", //  group:Media\n    \"_ui/appBarIcons/sync.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/download\":                            \"\\uE118\", //  group:Media\n    \"_ui/appBarIcons/download.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mail\":                                \"\\uE119\", //  group:Mail and calendar\n    \"_ui/appBarIcons/mail.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/find\":                                \"\\uE11A\", //  group:Data\n    \"_ui/appBarIcons/find.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/help\":                                \"\\uE11B\", //  group:General\n    \"_ui/appBarIcons/help.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/upload\":                              \"\\uE11C\", //  group:Media\n    \"_ui/appBarIcons/upload.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/emoji\":                               \"\\uE11D\", //  group:Communications\n    \"_ui/appBarIcons/emoji.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/twopage\":                             \"\\uE11E\", //  group:Layout\n    \"_ui/appBarIcons/twopage.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/leavechat\":                           \"\\uE11F\", //  group:Communications\n    \"_ui/appBarIcons/leavechat.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mailforward\":                         \"\\uE120\", //  group:Mail and calendar\n    \"_ui/appBarIcons/mailforward.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/clock\":                               \"\\uE121\", //  group:General\n    \"_ui/appBarIcons/clock.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/send\":                                \"\\uE122\", //  group:Mail and calendar\n    \"_ui/appBarIcons/send.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/crop\":                                \"\\uE123\", //  group:Editing\n    \"_ui/appBarIcons/crop.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/rotatecamera\":                        \"\\uE124\", //  group:System\n    \"_ui/appBarIcons/rotatecamera.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/people\":                              \"\\uE125\", //  group:Communications\n    \"_ui/appBarIcons/people.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/closepane\":                           \"\\uE126\", //  group:Layout\n    \"_ui/appBarIcons/closepane.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/openpane\":                            \"\\uE127\", //  group:Layout\n    \"_ui/appBarIcons/openpane.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/world\":                               \"\\uE128\", //  group:General\n    \"_ui/appBarIcons/world.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/flag\":                                \"\\uE129\", //  group:Mail and calendar\n    \"_ui/appBarIcons/flag.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/previewlink\":                         \"\\uE12A\", //  group:General\n    \"_ui/appBarIcons/previewlink.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/globe\":                               \"\\uE12B\", //  group:Communications\n    \"_ui/appBarIcons/globe.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/trim\":                                \"\\uE12C\", //  group:Editing\n    \"_ui/appBarIcons/trim.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/attachcamera\":                        \"\\uE12D\", //  group:System\n    \"_ui/appBarIcons/attachcamera.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/zoomin\":                              \"\\uE12E\", //  group:Layout\n    \"_ui/appBarIcons/zoomin.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/bookmarks\":                           \"\\uE12F\", //  group:Editing\n    \"_ui/appBarIcons/bookmarks.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/document\":                            \"\\uE130\", //  group:File\n    \"_ui/appBarIcons/document.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/protecteddocument\":                   \"\\uE131\", //  group:File\n    \"_ui/appBarIcons/protecteddocument.comment\":          \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/page\":                                \"\\uE132\", //  group:Layout\n    \"_ui/appBarIcons/page.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/bullets\":                             \"\\uE133\", //  group:Editing\n    \"_ui/appBarIcons/bullets.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/comment\":                             \"\\uE134\", //  group:Communications\n    \"_ui/appBarIcons/comment.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mail2\":                               \"\\uE135\", //  group:Mail and calendar\n    \"_ui/appBarIcons/mail2.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/contactinfo\":                         \"\\uE136\", //  group:Communications\n    \"_ui/appBarIcons/contactinfo.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/hangup\":                              \"\\uE137\", //  group:Communications\n    \"_ui/appBarIcons/hangup.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/viewall\":                             \"\\uE138\", //  group:Data\n    \"_ui/appBarIcons/viewall.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mappin\":                              \"\\uE139\", //  group:General\n    \"_ui/appBarIcons/mappin.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/phone\":                               \"\\uE13A\", //  group:Communications\n    \"_ui/appBarIcons/phone.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/videochat\":                           \"\\uE13B\", //  group:Communications\n    \"_ui/appBarIcons/videochat.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/switch\":                              \"\\uE13C\", //  group:Communications\n    \"_ui/appBarIcons/switch.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/contact\":                             \"\\uE13D\", //  group:Communications\n    \"_ui/appBarIcons/contact.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/rename\":                              \"\\uE13E\", //  group:File\n    \"_ui/appBarIcons/rename.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/pin\":                                 \"\\uE141\", //  group:System\n    \"_ui/appBarIcons/pin.comment\":                        \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/musicinfo\":                           \"\\uE142\", //  group:Media\n    \"_ui/appBarIcons/musicinfo.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/go\":                                  \"\\uE143\", //  group:General\n    \"_ui/appBarIcons/go.comment\":                         \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/keyboard\":                            \"\\uE144\", //  group:System\n    \"_ui/appBarIcons/keyboard.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/dockleft\":                            \"\\uE145\", //  group:Layout\n    \"_ui/appBarIcons/dockleft.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/dockright\":                           \"\\uE146\", //  group:Layout\n    \"_ui/appBarIcons/dockright.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/dockbottom\":                          \"\\uE147\", //  group:Layout\n    \"_ui/appBarIcons/dockbottom.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/remote\":                              \"\\uE148\", //  group:System\n    \"_ui/appBarIcons/remote.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/refresh\":                             \"\\uE149\", //  group:Data\n    \"_ui/appBarIcons/refresh.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/rotate\":                              \"\\uE14A\", //  group:Layout\n    \"_ui/appBarIcons/rotate.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/shuffle\":                             \"\\uE14B\", //  group:Media\n    \"_ui/appBarIcons/shuffle.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/list\":                                \"\\uE14C\", //  group:Editing\n    \"_ui/appBarIcons/list.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/shop\":                                \"\\uE14D\", //  group:General\n    \"_ui/appBarIcons/shop.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/selectall\":                           \"\\uE14E\", //  group:Data\n    \"_ui/appBarIcons/selectall.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/orientation\":                         \"\\uE14F\", //  group:Layout\n    \"_ui/appBarIcons/orientation.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/import\":                              \"\\uE150\", //  group:Data\n    \"_ui/appBarIcons/import.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/importall\":                           \"\\uE151\", //  group:Data\n    \"_ui/appBarIcons/importall.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/browsephotos\":                        \"\\uE155\", //  group:Media\n    \"_ui/appBarIcons/browsephotos.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/webcam\":                              \"\\uE156\", //  group:System\n    \"_ui/appBarIcons/webcam.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/pictures\":                            \"\\uE158\", //  group:Media\n    \"_ui/appBarIcons/pictures.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/savelocal\":                           \"\\uE159\", //  group:File\n    \"_ui/appBarIcons/savelocal.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/caption\":                             \"\\uE15A\", //  group:Media\n    \"_ui/appBarIcons/caption.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/stop\":                                \"\\uE15B\", //  group:Media\n    \"_ui/appBarIcons/stop.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/showresults\":                         \"\\uE15C\", //  group:Data\n    \"_ui/appBarIcons/showresults.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/volume\":                              \"\\uE15D\", //  group:Media\n    \"_ui/appBarIcons/volume.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/repair\":                              \"\\uE15E\", //  group:System\n    \"_ui/appBarIcons/repair.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/message\":                             \"\\uE15F\", //  group:Communications\n    \"_ui/appBarIcons/message.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/page2\":                               \"\\uE160\", //  group:Layout\n    \"_ui/appBarIcons/page2.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/calendarday\":                         \"\\uE161\", //  group:Mail and calendar\n    \"_ui/appBarIcons/calendarday.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/calendarweek\":                        \"\\uE162\", //  group:Mail and calendar\n    \"_ui/appBarIcons/calendarweek.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/calendar\":                            \"\\uE163\", //  group:Mail and calendar\n    \"_ui/appBarIcons/calendar.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/characters\":                          \"\\uE164\", //  group:Editing\n    \"_ui/appBarIcons/characters.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mailreplyall\":                        \"\\uE165\", //  group:Mail and calendar\n    \"_ui/appBarIcons/mailreplyall.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/read\":                                \"\\uE166\", //  group:Mail and calendar\n    \"_ui/appBarIcons/read.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/link\":                                \"\\uE167\", //  group:Communications\n    \"_ui/appBarIcons/link.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/accounts\":                            \"\\uE168\", //  group:Communications\n    \"_ui/appBarIcons/accounts.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/showbcc\":                             \"\\uE169\", //  group:Mail and calendar\n    \"_ui/appBarIcons/showbcc.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/hidebcc\":                             \"\\uE16A\", //  group:Mail and calendar\n    \"_ui/appBarIcons/hidebcc.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/cut\":                                 \"\\uE16B\", //  group:Editing\n    \"_ui/appBarIcons/cut.comment\":                        \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/attach\":                              \"\\uE16C\", //  group:Mail and calendar\n    \"_ui/appBarIcons/attach.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/paste\":                               \"\\uE16D\", //  group:Editing\n    \"_ui/appBarIcons/paste.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/filter\":                              \"\\uE16E\", //  group:Data\n    \"_ui/appBarIcons/filter.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/copy\":                                \"\\uE16F\", //  group:Editing\n    \"_ui/appBarIcons/copy.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/emoji2\":                              \"\\uE170\", //  group:Mail and calendar\n    \"_ui/appBarIcons/emoji2.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/important\":                           \"\\uE171\", //  group:Mail and calendar\n    \"_ui/appBarIcons/important.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mailreply\":                           \"\\uE172\", //  group:Mail and calendar\n    \"_ui/appBarIcons/mailreply.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/slideshow\":                           \"\\uE173\", //  group:Media\n    \"_ui/appBarIcons/slideshow.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/sort\":                                \"\\uE174\", //  group:Data\n    \"_ui/appBarIcons/sort.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/manage\":                              \"\\uE178\", //  group:System\n    \"_ui/appBarIcons/manage.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/allapps\":                             \"\\uE179\", //  group:System\n    \"_ui/appBarIcons/allapps.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/disconnectdrive\":                     \"\\uE17A\", //  group:System\n    \"_ui/appBarIcons/disconnectdrive.comment\":            \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mapdrive\":                            \"\\uE17B\", //  group:System\n    \"_ui/appBarIcons/mapdrive.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/newwindow\":                           \"\\uE17C\", //  group:System\n    \"_ui/appBarIcons/newwindow.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/openwith\":                            \"\\uE17D\", //  group:System\n    \"_ui/appBarIcons/openwith.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/contactpresence\":                     \"\\uE181\", //  group:Communications\n    \"_ui/appBarIcons/contactpresence.comment\":            \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/priority\":                            \"\\uE182\", //  group:Mail and calendar\n    \"_ui/appBarIcons/priority.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/uploadskydrive\":                      \"\\uE183\", //  group:File\n    \"_ui/appBarIcons/uploadskydrive.comment\":             \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/gototoday\":                           \"\\uE184\", //  group:Mail and calendar\n    \"_ui/appBarIcons/gototoday.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/font\":                                \"\\uE185\", //  group:Editing\n    \"_ui/appBarIcons/font.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/fontcolor\":                           \"\\uE186\", //  group:Editing\n    \"_ui/appBarIcons/fontcolor.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/contact2\":                            \"\\uE187\", //  group:Communications\n    \"_ui/appBarIcons/contact2.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/folder\":                              \"\\uE188\", //  group:File\n    \"_ui/appBarIcons/folder.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/audio\":                               \"\\uE189\", //  group:Media\n    \"_ui/appBarIcons/audio.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/placeholder\":                         \"\\uE18A\", //  group:General\n    \"_ui/appBarIcons/placeholder.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/view\":                                \"\\uE18B\", //  group:Layout\n    \"_ui/appBarIcons/view.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/setlockscreen\":                       \"\\uE18C\", //  group:System\n    \"_ui/appBarIcons/setlockscreen.comment\":              \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/settile\":                             \"\\uE18D\", //  group:System\n    \"_ui/appBarIcons/settile.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/cc\":                                  \"\\uE190\", //  group:Media\n    \"_ui/appBarIcons/cc.comment\":                         \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/stopslideshow\":                       \"\\uE191\", //  group:Media\n    \"_ui/appBarIcons/stopslideshow.comment\":              \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/permissions\":                         \"\\uE192\", //  group:System\n    \"_ui/appBarIcons/permissions.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/highlight\":                           \"\\uE193\", //  group:Editing\n    \"_ui/appBarIcons/highlight.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/disableupdates\":                      \"\\uE194\", //  group:System\n    \"_ui/appBarIcons/disableupdates.comment\":             \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/unfavorite\":                          \"\\uE195\", //  group:Media\n    \"_ui/appBarIcons/unfavorite.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/unpin\":                               \"\\uE196\", //  group:System\n    \"_ui/appBarIcons/unpin.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/openlocal\":                           \"\\uE197\", //  group:File\n    \"_ui/appBarIcons/openlocal.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/mute\":                                \"\\uE198\", //  group:Media\n    \"_ui/appBarIcons/mute.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/italic\":                              \"\\uE199\", //  group:Editing\n    \"_ui/appBarIcons/italic.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/underline\":                           \"\\uE19A\", //  group:Editing\n    \"_ui/appBarIcons/underline.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/bold\":                                \"\\uE19B\", //  group:Editing\n    \"_ui/appBarIcons/bold.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/movetofolder\":                        \"\\uE19C\", //  group:File\n    \"_ui/appBarIcons/movetofolder.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/likedislike\":                         \"\\uE19D\", //  group:Data\n    \"_ui/appBarIcons/likedislike.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/dislike\":                             \"\\uE19E\", //  group:Data\n    \"_ui/appBarIcons/dislike.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/like\":                                \"\\uE19F\", //  group:Data\n    \"_ui/appBarIcons/like.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/alignright\":                          \"\\uE1A0\", //  group:Editing\n    \"_ui/appBarIcons/alignright.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/aligncenter\":                         \"\\uE1A1\", //  group:Editing\n    \"_ui/appBarIcons/aligncenter.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/alignleft\":                           \"\\uE1A2\", //  group:Editing\n    \"_ui/appBarIcons/alignleft.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/zoom\":                                \"\\uE1A3\", //  group:Layout\n    \"_ui/appBarIcons/zoom.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/zoomout\":                             \"\\uE1A4\", //  group:Layout\n    \"_ui/appBarIcons/zoomout.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/openfile\":                            \"\\uE1A5\", //  group:File\n    \"_ui/appBarIcons/openfile.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/otheruser\":                           \"\\uE1A6\", //  group:System\n    \"_ui/appBarIcons/otheruser.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/admin\":                               \"\\uE1A7\", //  group:System\n    \"_ui/appBarIcons/admin.comment\":                      \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/street\":                              \"\\uE1C3\", //  group:General\n    \"_ui/appBarIcons/street.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/map\":                                 \"\\uE1C4\", //  group:General\n    \"_ui/appBarIcons/map.comment\":                        \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/clearselection\":                      \"\\uE1C5\", //  group:Data\n    \"_ui/appBarIcons/clearselection.comment\":             \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/fontdecrease\":                        \"\\uE1C6\", //  group:Editing\n    \"_ui/appBarIcons/fontdecrease.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/fontincrease\":                        \"\\uE1C7\", //  group:Editing\n    \"_ui/appBarIcons/fontincrease.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/fontsize\":                            \"\\uE1C8\", //  group:Editing\n    \"_ui/appBarIcons/fontsize.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/cellphone\":                           \"\\uE1C9\", //  group:Communications\n    \"_ui/appBarIcons/cellphone.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/reshare\":                             \"\\uE1CA\", //  group:Communications\n    \"_ui/appBarIcons/reshare.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/tag\":                                 \"\\uE1CB\", //  group:Data\n    \"_ui/appBarIcons/tag.comment\":                        \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/repeatone\":                           \"\\uE1CC\", //  group:Media\n    \"_ui/appBarIcons/repeatone.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/repeatall\":                           \"\\uE1CD\", //  group:Media\n    \"_ui/appBarIcons/repeatall.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/outlinestar\":                         \"\\uE1CE\", //  group:Data\n    \"_ui/appBarIcons/outlinestar.comment\":                \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/solidstar\":                           \"\\uE1CF\", //  group:Data\n    \"_ui/appBarIcons/solidstar.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/calculator\":                          \"\\uE1D0\", //  group:General\n    \"_ui/appBarIcons/calculator.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/directions\":                          \"\\uE1D1\", //  group:General\n    \"_ui/appBarIcons/directions.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/target\":                              \"\\uE1D2\", //  group:General\n    \"_ui/appBarIcons/target.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/library\":                             \"\\uE1D3\", //  group:Media\n    \"_ui/appBarIcons/library.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/phonebook\":                           \"\\uE1D4\", //  group:Communications\n    \"_ui/appBarIcons/phonebook.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/memo\":                                \"\\uE1D5\", //  group:Communications\n    \"_ui/appBarIcons/memo.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/microphone\":                          \"\\uE1D6\", //  group:System\n    \"_ui/appBarIcons/microphone.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/postupdate\":                          \"\\uE1D7\", //  group:Communications\n    \"_ui/appBarIcons/postupdate.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/backtowindow\":                        \"\\uE1D8\", //  group:Layout\n    \"_ui/appBarIcons/backtowindow.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/fullscreen\":                          \"\\uE1D9\", //  group:Layout\n    \"_ui/appBarIcons/fullscreen.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/newfolder\":                           \"\\uE1DA\", //  group:File\n    \"_ui/appBarIcons/newfolder.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/calendarreply\":                       \"\\uE1DB\", //  group:Mail and calendar\n    \"_ui/appBarIcons/calendarreply.comment\":              \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/unsyncfolder\":                        \"\\uE1DD\", //  group:File\n    \"_ui/appBarIcons/unsyncfolder.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/reporthacked\":                        \"\\uE1DE\", //  group:Communications\n    \"_ui/appBarIcons/reporthacked.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/syncfolder\":                          \"\\uE1DF\", //  group:File\n    \"_ui/appBarIcons/syncfolder.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/blockcontact\":                        \"\\uE1E0\", //  group:Communications\n    \"_ui/appBarIcons/blockcontact.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/switchapps\":                          \"\\uE1E1\", //  group:System\n    \"_ui/appBarIcons/switchapps.comment\":                 \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/addfriend\":                           \"\\uE1E2\", //  group:Communications\n    \"_ui/appBarIcons/addfriend.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/touchpointer\":                        \"\\uE1E3\", //  group:System\n    \"_ui/appBarIcons/touchpointer.comment\":               \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/gotostart\":                           \"\\uE1E4\", //  group:System\n    \"_ui/appBarIcons/gotostart.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/zerobars\":                            \"\\uE1E5\", //  group:System\n    \"_ui/appBarIcons/zerobars.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/onebar\":                              \"\\uE1E6\", //  group:System\n    \"_ui/appBarIcons/onebar.comment\":                     \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/twobars\":                             \"\\uE1E7\", //  group:System\n    \"_ui/appBarIcons/twobars.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/threebars\":                           \"\\uE1E8\", //  group:System\n    \"_ui/appBarIcons/threebars.comment\":                  \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/fourbars\":                            \"\\uE1E9\", //  group:System\n    \"_ui/appBarIcons/fourbars.comment\":                   \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/scan\":                                \"\\uE294\", //  group:General\n    \"_ui/appBarIcons/scan.comment\":                       \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/preview\":                             \"\\uE295\", //  group:General\n    \"_ui/appBarIcons/preview.comment\":                    \"{Locked:qps-ploc,qps-plocm}\",\n    \"ui/appBarIcons/hamburger\":                           \"\\uE700\", //  group:General\n    \"_ui/appBarIcons/hamburger.comment\":                  \"{Locked:qps-ploc,qps-plocm}\"\n}\n);\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_Resources',[\n    'exports',\n    './_Global',\n    './_WinRT',\n    './_Base',\n    './_Events',\n    'require-json!strings/en-us/Microsoft.WinJS.resjson',\n    ], function resourcesInit(exports, _Global, _WinRT, _Base, _Events, defaultStrings) {\n    \"use strict\";\n\n    function _getWinJSString(id) {\n        var result = getString(\"ms-resource:///Microsoft.WinJS/\" + id);\n\n        if (result.empty) {\n            result = _getStringBuiltIn(id);\n        }\n\n        return result;\n    }\n\n    function _getStringBuiltIn(resourceId) {\n        var str = defaultStrings[resourceId];\n\n        if (typeof str === \"string\") {\n            str = { value: str };\n        }\n\n        return str || { value: resourceId, empty: true };\n    }\n\n    var resourceMap;\n    var mrtEventHook = false;\n    var contextChangedET = \"contextchanged\";\n    var resourceContext;\n\n    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /* empty */ }, { supportedForProcessing: false }), _Events.eventMixin);\n    var listeners = new ListenerType();\n    var createEvent = _Events._createEventProperty;\n\n    var strings = {\n        get malformedFormatStringInput() { return \"Malformed, did you mean to escape your '{0}'?\"; },\n    };\n\n    _Base.Namespace.define(\"WinJS.Resources\", {\n        _getWinJSString: _getWinJSString\n    });\n\n    function formatString(string) {\n        var args = arguments;\n        if (args.length > 1) {\n            string = string.replace(/({{)|(}})|{(\\d+)}|({)|(})/g, function (unused, left, right, index, illegalLeft, illegalRight) {\n                if (illegalLeft || illegalRight) { throw formatString(strings.malformedFormatStringInput, illegalLeft || illegalRight); }\n                return (left && \"{\") || (right && \"}\") || args[(index | 0) + 1];\n            });\n        }\n        return string;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Resources\", {\n        addEventListener: function (type, listener, useCapture) {\n            /// <signature helpKeyword=\"WinJS.Resources.addEventListener\">\n            /// <summary locid=\"WinJS.Resources.addEventListener\">\n            /// Registers an event handler for the specified event.\n            /// </summary>\n            /// <param name='type' type=\"String\" locid='WinJS.Resources.addEventListener_p:type'>\n            /// The name of the event to handle.\n            /// </param>\n            /// <param name='listener' type=\"Function\" locid='WinJS.Resources.addEventListener_p:listener'>\n            /// The listener to invoke when the event gets raised.\n            /// </param>\n            /// <param name='useCapture' type=\"Boolean\" locid='WinJS.Resources.addEventListener_p:useCapture'>\n            /// Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase.\n            /// </param>\n            /// </signature>\n            if (_WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager && !mrtEventHook) {\n                if (type === contextChangedET) {\n                    try {\n                        var resContext = exports._getResourceContext();\n                        if (resContext) {\n                            resContext.qualifierValues.addEventListener(\"mapchanged\", function (e) {\n                                exports.dispatchEvent(contextChangedET, { qualifier: e.key, changed: e.target[e.key] });\n                            }, false);\n\n                        } else {\n                            // The API can be called in the Background thread (web worker).\n                            _WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager.current.defaultContext.qualifierValues.addEventListener(\"mapchanged\", function (e) {\n                                exports.dispatchEvent(contextChangedET, { qualifier: e.key, changed: e.target[e.key] });\n                            }, false);\n                        }\n                        mrtEventHook = true;\n                    } catch (e) {\n                    }\n                }\n            }\n            listeners.addEventListener(type, listener, useCapture);\n        },\n        removeEventListener: listeners.removeEventListener.bind(listeners),\n        dispatchEvent: listeners.dispatchEvent.bind(listeners),\n\n        _formatString: formatString,\n\n        _getStringWinRT: function (resourceId) {\n            if (!resourceMap) {\n                var mainResourceMap = _WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager.current.mainResourceMap;\n                try {\n                    resourceMap = mainResourceMap.getSubtree('Resources');\n                }\n                catch (e) {\n                }\n                if (!resourceMap) {\n                    resourceMap = mainResourceMap;\n                }\n            }\n\n            var stringValue;\n            var langValue;\n            var resCandidate;\n            try {\n                var resContext = exports._getResourceContext();\n                if (resContext) {\n                    resCandidate = resourceMap.getValue(resourceId, resContext);\n                } else {\n                    resCandidate = resourceMap.getValue(resourceId);\n                }\n\n                if (resCandidate) {\n                    stringValue = resCandidate.valueAsString;\n                    if (stringValue === undefined) {\n                        stringValue = resCandidate.toString();\n                    }\n                }\n            }\n            catch (e) { }\n\n            if (!stringValue) {\n                return exports._getStringJS(resourceId);\n            }\n\n            try {\n                langValue = resCandidate.getQualifierValue(\"Language\");\n            }\n            catch (e) {\n                return { value: stringValue };\n            }\n\n            return { value: stringValue, lang: langValue };\n        },\n\n        _getStringJS: function (resourceId) {\n            var str = _Global.strings && _Global.strings[resourceId];\n            if (typeof str === \"string\") {\n                str = { value: str };\n            }\n            return str || { value: resourceId, empty: true };\n        },\n\n        _getResourceContext: function () {\n            if (_Global.document) {\n                if (typeof (resourceContext) === 'undefined') {\n                    var context = _WinRT.Windows.ApplicationModel.Resources.Core.ResourceContext;\n                    if (context.getForCurrentView) {\n                        resourceContext = context.getForCurrentView();\n                    } else {\n                        resourceContext = null;\n                    }\n\n                }\n            }\n            return resourceContext;\n        },\n\n        oncontextchanged: createEvent(contextChangedET)\n\n    });\n\n    var getStringImpl = _WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager ? exports._getStringWinRT : exports._getStringJS;\n\n    var getString = function (resourceId) {\n        /// <signature helpKeyword=\"WinJS.Resources.getString\">\n        /// <summary locid='WinJS.Resources.getString'>\n        /// Retrieves the resource string that has the specified resource id.\n        /// </summary>\n        /// <param name='resourceId' type=\"Number\" locid='WinJS.Resources.getString._p:resourceId'>\n        /// The resource id of the string to retrieve.\n        /// </param>\n        /// <returns type='Object' locid='WinJS.Resources.getString_returnValue'>\n        /// An object that can contain these properties:\n        ///\n        /// value:\n        /// The value of the requested string. This property is always present.\n        ///\n        /// empty:\n        /// A value that specifies whether the requested string wasn't found.\n        /// If its true, the string wasn't found. If its false or undefined,\n        /// the requested string was found.\n        ///\n        /// lang:\n        /// The language of the string, if specified. This property is only present\n        /// for multi-language resources.\n        ///\n        /// </returns>\n        /// </signature>\n\n        return getStringImpl(resourceId);\n    };\n\n    _Base.Namespace._moduleDefine(exports, null, {\n        _formatString: formatString,\n        _getWinJSString: _getWinJSString\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Resources\", {\n        getString: {\n            get: function () {\n                return getString;\n            },\n            set: function (value) {\n                getString = value;\n            }\n        }\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_Trace',[\n    './_Global'\n    ], function traceInit(_Global) {\n    \"use strict\";\n\n    function nop(v) {\n        return v;\n    }\n\n    return {\n        _traceAsyncOperationStarting: (_Global.Debug && _Global.Debug.msTraceAsyncOperationStarting && _Global.Debug.msTraceAsyncOperationStarting.bind(_Global.Debug)) || nop,\n        _traceAsyncOperationCompleted: (_Global.Debug && _Global.Debug.msTraceAsyncOperationCompleted && _Global.Debug.msTraceAsyncOperationCompleted.bind(_Global.Debug)) || nop,\n        _traceAsyncCallbackStarting: (_Global.Debug && _Global.Debug.msTraceAsyncCallbackStarting && _Global.Debug.msTraceAsyncCallbackStarting.bind(_Global.Debug)) || nop,\n        _traceAsyncCallbackCompleted: (_Global.Debug && _Global.Debug.msTraceAsyncCallbackCompleted && _Global.Debug.msTraceAsyncCallbackCompleted.bind(_Global.Debug)) || nop\n    };\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Promise/_StateMachine',[\n    '../Core/_Global',\n    '../Core/_BaseCoreUtils',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Trace'\n    ], function promiseStateMachineInit(_Global, _BaseCoreUtils, _Base, _ErrorFromName, _Events, _Trace) {\n    \"use strict\";\n\n    _Global.Debug && (_Global.Debug.setNonUserCodeExceptions = true);\n\n    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /*empty*/ }, { supportedForProcessing: false }), _Events.eventMixin);\n    var promiseEventListeners = new ListenerType();\n    // make sure there is a listeners collection so that we can do a more trivial check below\n    promiseEventListeners._listeners = {};\n    var errorET = \"error\";\n    var canceledName = \"Canceled\";\n    var tagWithStack = false;\n    var tag = {\n        promise: 0x01,\n        thenPromise: 0x02,\n        errorPromise: 0x04,\n        exceptionPromise: 0x08,\n        completePromise: 0x10,\n    };\n    tag.all = tag.promise | tag.thenPromise | tag.errorPromise | tag.exceptionPromise | tag.completePromise;\n\n    //\n    // Global error counter, for each error which enters the system we increment this once and then\n    // the error number travels with the error as it traverses the tree of potential handlers.\n    //\n    // When someone has registered to be told about errors (WinJS.Promise.callonerror) promises\n    // which are in error will get tagged with a ._errorId field. This tagged field is the\n    // contract by which nested promises with errors will be identified as chaining for the\n    // purposes of the callonerror semantics. If a nested promise in error is encountered without\n    // a ._errorId it will be assumed to be foreign and treated as an interop boundary and\n    // a new error id will be minted.\n    //\n    var error_number = 1;\n\n    //\n    // The state machine has a interesting hiccup in it with regards to notification, in order\n    // to flatten out notification and avoid recursion for synchronous completion we have an\n    // explicit set of *_notify states which are responsible for notifying their entire tree\n    // of children. They can do this because they know that immediate children are always\n    // ThenPromise instances and we can therefore reach into their state to access the\n    // _listeners collection.\n    //\n    // So, what happens is that a Promise will be fulfilled through the _completed or _error\n    // messages at which point it will enter a *_notify state and be responsible for to move\n    // its children into an (as appropriate) success or error state and also notify that child's\n    // listeners of the state transition, until leaf notes are reached.\n    //\n\n    var state_created,              // -> working\n        state_working,              // -> error | error_notify | success | success_notify | canceled | waiting\n        state_waiting,              // -> error | error_notify | success | success_notify | waiting_canceled\n        state_waiting_canceled,     // -> error | error_notify | success | success_notify | canceling\n        state_canceled,             // -> error | error_notify | success | success_notify | canceling\n        state_canceling,            // -> error_notify\n        state_success_notify,       // -> success\n        state_success,              // -> .\n        state_error_notify,         // -> error\n        state_error;                // -> .\n\n    // Noop function, used in the various states to indicate that they don't support a given\n    // message. Named with the somewhat cute name '_' because it reads really well in the states.\n\n    function _() { }\n\n    // Initial state\n    //\n    state_created = {\n        name: \"created\",\n        enter: function (promise) {\n            promise._setState(state_working);\n        },\n        cancel: _,\n        done: _,\n        then: _,\n        _completed: _,\n        _error: _,\n        _notify: _,\n        _progress: _,\n        _setCompleteValue: _,\n        _setErrorValue: _\n    };\n\n    // Ready state, waiting for a message (completed/error/progress), able to be canceled\n    //\n    state_working = {\n        name: \"working\",\n        enter: _,\n        cancel: function (promise) {\n            promise._setState(state_canceled);\n        },\n        done: done,\n        then: then,\n        _completed: completed,\n        _error: error,\n        _notify: _,\n        _progress: progress,\n        _setCompleteValue: setCompleteValue,\n        _setErrorValue: setErrorValue\n    };\n\n    // Waiting state, if a promise is completed with a value which is itself a promise\n    // (has a then() method) it signs up to be informed when that child promise is\n    // fulfilled at which point it will be fulfilled with that value.\n    //\n    state_waiting = {\n        name: \"waiting\",\n        enter: function (promise) {\n            var waitedUpon = promise._value;\n            // We can special case our own intermediate promises which are not in a\n            //  terminal state by just pushing this promise as a listener without\n            //  having to create new indirection functions\n            if (waitedUpon instanceof ThenPromise &&\n                waitedUpon._state !== state_error &&\n                waitedUpon._state !== state_success) {\n                pushListener(waitedUpon, { promise: promise });\n            } else {\n                var error = function (value) {\n                    if (waitedUpon._errorId) {\n                        promise._chainedError(value, waitedUpon);\n                    } else {\n                        // Because this is an interop boundary we want to indicate that this\n                        //  error has been handled by the promise infrastructure before we\n                        //  begin a new handling chain.\n                        //\n                        callonerror(promise, value, detailsForHandledError, waitedUpon, error);\n                        promise._error(value);\n                    }\n                };\n                error.handlesOnError = true;\n                waitedUpon.then(\n                    promise._completed.bind(promise),\n                    error,\n                    promise._progress.bind(promise)\n                );\n            }\n        },\n        cancel: function (promise) {\n            promise._setState(state_waiting_canceled);\n        },\n        done: done,\n        then: then,\n        _completed: completed,\n        _error: error,\n        _notify: _,\n        _progress: progress,\n        _setCompleteValue: setCompleteValue,\n        _setErrorValue: setErrorValue\n    };\n\n    // Waiting canceled state, when a promise has been in a waiting state and receives a\n    // request to cancel its pending work it will forward that request to the child promise\n    // and then waits to be informed of the result. This promise moves itself into the\n    // canceling state but understands that the child promise may instead push it to a\n    // different state.\n    //\n    state_waiting_canceled = {\n        name: \"waiting_canceled\",\n        enter: function (promise) {\n            // Initiate a transition to canceling. Triggering a cancel on the promise\n            // that we are waiting upon may result in a different state transition\n            // before the state machine pump runs again.\n            promise._setState(state_canceling);\n            var waitedUpon = promise._value;\n            if (waitedUpon.cancel) {\n                waitedUpon.cancel();\n            }\n        },\n        cancel: _,\n        done: done,\n        then: then,\n        _completed: completed,\n        _error: error,\n        _notify: _,\n        _progress: progress,\n        _setCompleteValue: setCompleteValue,\n        _setErrorValue: setErrorValue\n    };\n\n    // Canceled state, moves to the canceling state and then tells the promise to do\n    // whatever it might need to do on cancelation.\n    //\n    state_canceled = {\n        name: \"canceled\",\n        enter: function (promise) {\n            // Initiate a transition to canceling. The _cancelAction may change the state\n            // before the state machine pump runs again.\n            promise._setState(state_canceling);\n            promise._cancelAction();\n        },\n        cancel: _,\n        done: done,\n        then: then,\n        _completed: completed,\n        _error: error,\n        _notify: _,\n        _progress: progress,\n        _setCompleteValue: setCompleteValue,\n        _setErrorValue: setErrorValue\n    };\n\n    // Canceling state, commits to the promise moving to an error state with an error\n    // object whose 'name' and 'message' properties contain the string \"Canceled\"\n    //\n    state_canceling = {\n        name: \"canceling\",\n        enter: function (promise) {\n            var error = new Error(canceledName);\n            error.name = error.message;\n            promise._value = error;\n            promise._setState(state_error_notify);\n        },\n        cancel: _,\n        done: _,\n        then: _,\n        _completed: _,\n        _error: _,\n        _notify: _,\n        _progress: _,\n        _setCompleteValue: _,\n        _setErrorValue: _\n    };\n\n    // Success notify state, moves a promise to the success state and notifies all children\n    //\n    state_success_notify = {\n        name: \"complete_notify\",\n        enter: function (promise) {\n            promise.done = CompletePromise.prototype.done;\n            promise.then = CompletePromise.prototype.then;\n            if (promise._listeners) {\n                var queue = [promise];\n                var p;\n                while (queue.length) {\n                    p = queue.shift();\n                    p._state._notify(p, queue);\n                }\n            }\n            promise._setState(state_success);\n        },\n        cancel: _,\n        done: null, /*error to get here */\n        then: null, /*error to get here */\n        _completed: _,\n        _error: _,\n        _notify: notifySuccess,\n        _progress: _,\n        _setCompleteValue: _,\n        _setErrorValue: _\n    };\n\n    // Success state, moves a promise to the success state and does NOT notify any children.\n    // Some upstream promise is owning the notification pass.\n    //\n    state_success = {\n        name: \"success\",\n        enter: function (promise) {\n            promise.done = CompletePromise.prototype.done;\n            promise.then = CompletePromise.prototype.then;\n            promise._cleanupAction();\n        },\n        cancel: _,\n        done: null, /*error to get here */\n        then: null, /*error to get here */\n        _completed: _,\n        _error: _,\n        _notify: notifySuccess,\n        _progress: _,\n        _setCompleteValue: _,\n        _setErrorValue: _\n    };\n\n    // Error notify state, moves a promise to the error state and notifies all children\n    //\n    state_error_notify = {\n        name: \"error_notify\",\n        enter: function (promise) {\n            promise.done = ErrorPromise.prototype.done;\n            promise.then = ErrorPromise.prototype.then;\n            if (promise._listeners) {\n                var queue = [promise];\n                var p;\n                while (queue.length) {\n                    p = queue.shift();\n                    p._state._notify(p, queue);\n                }\n            }\n            promise._setState(state_error);\n        },\n        cancel: _,\n        done: null, /*error to get here*/\n        then: null, /*error to get here*/\n        _completed: _,\n        _error: _,\n        _notify: notifyError,\n        _progress: _,\n        _setCompleteValue: _,\n        _setErrorValue: _\n    };\n\n    // Error state, moves a promise to the error state and does NOT notify any children.\n    // Some upstream promise is owning the notification pass.\n    //\n    state_error = {\n        name: \"error\",\n        enter: function (promise) {\n            promise.done = ErrorPromise.prototype.done;\n            promise.then = ErrorPromise.prototype.then;\n            promise._cleanupAction();\n        },\n        cancel: _,\n        done: null, /*error to get here*/\n        then: null, /*error to get here*/\n        _completed: _,\n        _error: _,\n        _notify: notifyError,\n        _progress: _,\n        _setCompleteValue: _,\n        _setErrorValue: _\n    };\n\n    //\n    // The statemachine implementation follows a very particular pattern, the states are specified\n    // as static stateless bags of functions which are then indirected through the state machine\n    // instance (a Promise). As such all of the functions on each state have the promise instance\n    // passed to them explicitly as a parameter and the Promise instance members do a little\n    // dance where they indirect through the state and insert themselves in the argument list.\n    //\n    // We could instead call directly through the promise states however then every caller\n    // would have to remember to do things like pumping the state machine to catch state transitions.\n    //\n\n    var PromiseStateMachine = _Base.Class.define(null, {\n        _listeners: null,\n        _nextState: null,\n        _state: null,\n        _value: null,\n\n        cancel: function () {\n            /// <signature helpKeyword=\"WinJS.PromiseStateMachine.cancel\">\n            /// <summary locid=\"WinJS.PromiseStateMachine.cancel\">\n            /// Attempts to cancel the fulfillment of a promised value. If the promise hasn't\n            /// already been fulfilled and cancellation is supported, the promise enters\n            /// the error state with a value of Error(\"Canceled\").\n            /// </summary>\n            /// </signature>\n            this._state.cancel(this);\n            this._run();\n        },\n        done: function Promise_done(onComplete, onError, onProgress) {\n            /// <signature helpKeyword=\"WinJS.PromiseStateMachine.done\">\n            /// <summary locid=\"WinJS.PromiseStateMachine.done\">\n            /// Allows you to specify the work to be done on the fulfillment of the promised value,\n            /// the error handling to be performed if the promise fails to fulfill\n            /// a value, and the handling of progress notifications along the way.\n            ///\n            /// After the handlers have finished executing, this function throws any error that would have been returned\n            /// from then() as a promise in the error state.\n            /// </summary>\n            /// <param name='onComplete' type='Function' locid=\"WinJS.PromiseStateMachine.done_p:onComplete\">\n            /// The function to be called if the promise is fulfilled successfully with a value.\n            /// The fulfilled value is passed as the single argument. If the value is null,\n            /// the fulfilled value is returned. The value returned\n            /// from the function becomes the fulfilled value of the promise returned by\n            /// then(). If an exception is thrown while executing the function, the promise returned\n            /// by then() moves into the error state.\n            /// </param>\n            /// <param name='onError' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.done_p:onError\">\n            /// The function to be called if the promise is fulfilled with an error. The error\n            /// is passed as the single argument. If it is null, the error is forwarded.\n            /// The value returned from the function is the fulfilled value of the promise returned by then().\n            /// </param>\n            /// <param name='onProgress' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.done_p:onProgress\">\n            /// the function to be called if the promise reports progress. Data about the progress\n            /// is passed as the single argument. Promises are not required to support\n            /// progress.\n            /// </param>\n            /// </signature>\n            this._state.done(this, onComplete, onError, onProgress);\n        },\n        then: function Promise_then(onComplete, onError, onProgress) {\n            /// <signature helpKeyword=\"WinJS.PromiseStateMachine.then\">\n            /// <summary locid=\"WinJS.PromiseStateMachine.then\">\n            /// Allows you to specify the work to be done on the fulfillment of the promised value,\n            /// the error handling to be performed if the promise fails to fulfill\n            /// a value, and the handling of progress notifications along the way.\n            /// </summary>\n            /// <param name='onComplete' type='Function' locid=\"WinJS.PromiseStateMachine.then_p:onComplete\">\n            /// The function to be called if the promise is fulfilled successfully with a value.\n            /// The value is passed as the single argument. If the value is null, the value is returned.\n            /// The value returned from the function becomes the fulfilled value of the promise returned by\n            /// then(). If an exception is thrown while this function is being executed, the promise returned\n            /// by then() moves into the error state.\n            /// </param>\n            /// <param name='onError' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.then_p:onError\">\n            /// The function to be called if the promise is fulfilled with an error. The error\n            /// is passed as the single argument. If it is null, the error is forwarded.\n            /// The value returned from the function becomes the fulfilled value of the promise returned by then().\n            /// </param>\n            /// <param name='onProgress' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.then_p:onProgress\">\n            /// The function to be called if the promise reports progress. Data about the progress\n            /// is passed as the single argument. Promises are not required to support\n            /// progress.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.PromiseStateMachine.then_returnValue\">\n            /// The promise whose value is the result of executing the complete or\n            /// error function.\n            /// </returns>\n            /// </signature>\n            return this._state.then(this, onComplete, onError, onProgress);\n        },\n\n        _chainedError: function (value, context) {\n            var result = this._state._error(this, value, detailsForChainedError, context);\n            this._run();\n            return result;\n        },\n        _completed: function (value) {\n            var result = this._state._completed(this, value);\n            this._run();\n            return result;\n        },\n        _error: function (value) {\n            var result = this._state._error(this, value, detailsForError);\n            this._run();\n            return result;\n        },\n        _progress: function (value) {\n            this._state._progress(this, value);\n        },\n        _setState: function (state) {\n            this._nextState = state;\n        },\n        _setCompleteValue: function (value) {\n            this._state._setCompleteValue(this, value);\n            this._run();\n        },\n        _setChainedErrorValue: function (value, context) {\n            var result = this._state._setErrorValue(this, value, detailsForChainedError, context);\n            this._run();\n            return result;\n        },\n        _setExceptionValue: function (value) {\n            var result = this._state._setErrorValue(this, value, detailsForException);\n            this._run();\n            return result;\n        },\n        _run: function () {\n            while (this._nextState) {\n                this._state = this._nextState;\n                this._nextState = null;\n                this._state.enter(this);\n            }\n        }\n    }, {\n        supportedForProcessing: false\n    });\n\n    //\n    // Implementations of shared state machine code.\n    //\n\n    function completed(promise, value) {\n        var targetState;\n        if (value && typeof value === \"object\" && typeof value.then === \"function\") {\n            targetState = state_waiting;\n        } else {\n            targetState = state_success_notify;\n        }\n        promise._value = value;\n        promise._setState(targetState);\n    }\n    function createErrorDetails(exception, error, promise, id, parent, handler) {\n        return {\n            exception: exception,\n            error: error,\n            promise: promise,\n            handler: handler,\n            id: id,\n            parent: parent\n        };\n    }\n    function detailsForHandledError(promise, errorValue, context, handler) {\n        var exception = context._isException;\n        var errorId = context._errorId;\n        return createErrorDetails(\n            exception ? errorValue : null,\n            exception ? null : errorValue,\n            promise,\n            errorId,\n            context,\n            handler\n        );\n    }\n    function detailsForChainedError(promise, errorValue, context) {\n        var exception = context._isException;\n        var errorId = context._errorId;\n        setErrorInfo(promise, errorId, exception);\n        return createErrorDetails(\n            exception ? errorValue : null,\n            exception ? null : errorValue,\n            promise,\n            errorId,\n            context\n        );\n    }\n    function detailsForError(promise, errorValue) {\n        var errorId = ++error_number;\n        setErrorInfo(promise, errorId);\n        return createErrorDetails(\n            null,\n            errorValue,\n            promise,\n            errorId\n        );\n    }\n    function detailsForException(promise, exceptionValue) {\n        var errorId = ++error_number;\n        setErrorInfo(promise, errorId, true);\n        return createErrorDetails(\n            exceptionValue,\n            null,\n            promise,\n            errorId\n        );\n    }\n    function done(promise, onComplete, onError, onProgress) {\n        var asyncOpID = _Trace._traceAsyncOperationStarting(\"WinJS.Promise.done\");\n        pushListener(promise, { c: onComplete, e: onError, p: onProgress, asyncOpID: asyncOpID });\n    }\n    function error(promise, value, onerrorDetails, context) {\n        promise._value = value;\n        callonerror(promise, value, onerrorDetails, context);\n        promise._setState(state_error_notify);\n    }\n    function notifySuccess(promise, queue) {\n        var value = promise._value;\n        var listeners = promise._listeners;\n        if (!listeners) {\n            return;\n        }\n        promise._listeners = null;\n        var i, len;\n        for (i = 0, len = Array.isArray(listeners) ? listeners.length : 1; i < len; i++) {\n            var listener = len === 1 ? listeners : listeners[i];\n            var onComplete = listener.c;\n            var target = listener.promise;\n\n            _Trace._traceAsyncOperationCompleted(listener.asyncOpID, _Global.Debug && _Global.Debug.MS_ASYNC_OP_STATUS_SUCCESS);\n\n            if (target) {\n                _Trace._traceAsyncCallbackStarting(listener.asyncOpID);\n                try {\n                    target._setCompleteValue(onComplete ? onComplete(value) : value);\n                } catch (ex) {\n                    target._setExceptionValue(ex);\n                } finally {\n                    _Trace._traceAsyncCallbackCompleted();\n                }\n                if (target._state !== state_waiting && target._listeners) {\n                    queue.push(target);\n                }\n            } else {\n                CompletePromise.prototype.done.call(promise, onComplete);\n            }\n        }\n    }\n    function notifyError(promise, queue) {\n        var value = promise._value;\n        var listeners = promise._listeners;\n        if (!listeners) {\n            return;\n        }\n        promise._listeners = null;\n        var i, len;\n        for (i = 0, len = Array.isArray(listeners) ? listeners.length : 1; i < len; i++) {\n            var listener = len === 1 ? listeners : listeners[i];\n            var onError = listener.e;\n            var target = listener.promise;\n\n            var errorID = _Global.Debug && (value && value.name === canceledName ? _Global.Debug.MS_ASYNC_OP_STATUS_CANCELED : _Global.Debug.MS_ASYNC_OP_STATUS_ERROR);\n            _Trace._traceAsyncOperationCompleted(listener.asyncOpID, errorID);\n\n            if (target) {\n                var asyncCallbackStarted = false;\n                try {\n                    if (onError) {\n                        _Trace._traceAsyncCallbackStarting(listener.asyncOpID);\n                        asyncCallbackStarted = true;\n                        if (!onError.handlesOnError) {\n                            callonerror(target, value, detailsForHandledError, promise, onError);\n                        }\n                        target._setCompleteValue(onError(value));\n                    } else {\n                        target._setChainedErrorValue(value, promise);\n                    }\n                } catch (ex) {\n                    target._setExceptionValue(ex);\n                } finally {\n                    if (asyncCallbackStarted) {\n                        _Trace._traceAsyncCallbackCompleted();\n                    }\n                }\n                if (target._state !== state_waiting && target._listeners) {\n                    queue.push(target);\n                }\n            } else {\n                ErrorPromise.prototype.done.call(promise, null, onError);\n            }\n        }\n    }\n    function callonerror(promise, value, onerrorDetailsGenerator, context, handler) {\n        if (promiseEventListeners._listeners[errorET]) {\n            if (value instanceof Error && value.message === canceledName) {\n                return;\n            }\n            promiseEventListeners.dispatchEvent(errorET, onerrorDetailsGenerator(promise, value, context, handler));\n        }\n    }\n    function progress(promise, value) {\n        var listeners = promise._listeners;\n        if (listeners) {\n            var i, len;\n            for (i = 0, len = Array.isArray(listeners) ? listeners.length : 1; i < len; i++) {\n                var listener = len === 1 ? listeners : listeners[i];\n                var onProgress = listener.p;\n                if (onProgress) {\n                    try { onProgress(value); } catch (ex) { }\n                }\n                if (!(listener.c || listener.e) && listener.promise) {\n                    listener.promise._progress(value);\n                }\n            }\n        }\n    }\n    function pushListener(promise, listener) {\n        var listeners = promise._listeners;\n        if (listeners) {\n            // We may have either a single listener (which will never be wrapped in an array)\n            // or 2+ listeners (which will be wrapped). Since we are now adding one more listener\n            // we may have to wrap the single listener before adding the second.\n            listeners = Array.isArray(listeners) ? listeners : [listeners];\n            listeners.push(listener);\n        } else {\n            listeners = listener;\n        }\n        promise._listeners = listeners;\n    }\n    // The difference beween setCompleteValue()/setErrorValue() and complete()/error() is that setXXXValue() moves\n    // a promise directly to the success/error state without starting another notification pass (because one\n    // is already ongoing).\n    function setErrorInfo(promise, errorId, isException) {\n        promise._isException = isException || false;\n        promise._errorId = errorId;\n    }\n    function setErrorValue(promise, value, onerrorDetails, context) {\n        promise._value = value;\n        callonerror(promise, value, onerrorDetails, context);\n        promise._setState(state_error);\n    }\n    function setCompleteValue(promise, value) {\n        var targetState;\n        if (value && typeof value === \"object\" && typeof value.then === \"function\") {\n            targetState = state_waiting;\n        } else {\n            targetState = state_success;\n        }\n        promise._value = value;\n        promise._setState(targetState);\n    }\n    function then(promise, onComplete, onError, onProgress) {\n        var result = new ThenPromise(promise);\n        var asyncOpID = _Trace._traceAsyncOperationStarting(\"WinJS.Promise.then\");\n        pushListener(promise, { promise: result, c: onComplete, e: onError, p: onProgress, asyncOpID: asyncOpID });\n        return result;\n    }\n\n    //\n    // Internal implementation detail promise, ThenPromise is created when a promise needs\n    // to be returned from a then() method.\n    //\n    var ThenPromise = _Base.Class.derive(PromiseStateMachine,\n        function (creator) {\n\n            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.thenPromise))) {\n                this._stack = Promise._getStack();\n            }\n\n            this._creator = creator;\n            this._setState(state_created);\n            this._run();\n        }, {\n            _creator: null,\n\n            _cancelAction: function () { if (this._creator) { this._creator.cancel(); } },\n            _cleanupAction: function () { this._creator = null; }\n        }, {\n            supportedForProcessing: false\n        }\n    );\n\n    //\n    // Slim promise implementations for already completed promises, these are created\n    // under the hood on synchronous completion paths as well as by WinJS.Promise.wrap\n    // and WinJS.Promise.wrapError.\n    //\n\n    var ErrorPromise = _Base.Class.define(\n        function ErrorPromise_ctor(value) {\n\n            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.errorPromise))) {\n                this._stack = Promise._getStack();\n            }\n\n            this._value = value;\n            callonerror(this, value, detailsForError);\n        }, {\n            cancel: function () {\n                /// <signature helpKeyword=\"WinJS.PromiseStateMachine.cancel\">\n                /// <summary locid=\"WinJS.PromiseStateMachine.cancel\">\n                /// Attempts to cancel the fulfillment of a promised value. If the promise hasn't\n                /// already been fulfilled and cancellation is supported, the promise enters\n                /// the error state with a value of Error(\"Canceled\").\n                /// </summary>\n                /// </signature>\n            },\n            done: function ErrorPromise_done(unused, onError) {\n                /// <signature helpKeyword=\"WinJS.PromiseStateMachine.done\">\n                /// <summary locid=\"WinJS.PromiseStateMachine.done\">\n                /// Allows you to specify the work to be done on the fulfillment of the promised value,\n                /// the error handling to be performed if the promise fails to fulfill\n                /// a value, and the handling of progress notifications along the way.\n                ///\n                /// After the handlers have finished executing, this function throws any error that would have been returned\n                /// from then() as a promise in the error state.\n                /// </summary>\n                /// <param name='onComplete' type='Function' locid=\"WinJS.PromiseStateMachine.done_p:onComplete\">\n                /// The function to be called if the promise is fulfilled successfully with a value.\n                /// The fulfilled value is passed as the single argument. If the value is null,\n                /// the fulfilled value is returned. The value returned\n                /// from the function becomes the fulfilled value of the promise returned by\n                /// then(). If an exception is thrown while executing the function, the promise returned\n                /// by then() moves into the error state.\n                /// </param>\n                /// <param name='onError' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.done_p:onError\">\n                /// The function to be called if the promise is fulfilled with an error. The error\n                /// is passed as the single argument. If it is null, the error is forwarded.\n                /// The value returned from the function is the fulfilled value of the promise returned by then().\n                /// </param>\n                /// <param name='onProgress' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.done_p:onProgress\">\n                /// the function to be called if the promise reports progress. Data about the progress\n                /// is passed as the single argument. Promises are not required to support\n                /// progress.\n                /// </param>\n                /// </signature>\n                var value = this._value;\n                if (onError) {\n                    try {\n                        if (!onError.handlesOnError) {\n                            callonerror(null, value, detailsForHandledError, this, onError);\n                        }\n                        var result = onError(value);\n                        if (result && typeof result === \"object\" && typeof result.done === \"function\") {\n                            // If a promise is returned we need to wait on it.\n                            result.done();\n                        }\n                        return;\n                    } catch (ex) {\n                        value = ex;\n                    }\n                }\n                if (value instanceof Error && value.message === canceledName) {\n                    // suppress cancel\n                    return;\n                }\n                // force the exception to be thrown asyncronously to avoid any try/catch blocks\n                //\n                Promise._doneHandler(value);\n            },\n            then: function ErrorPromise_then(unused, onError) {\n                /// <signature helpKeyword=\"WinJS.PromiseStateMachine.then\">\n                /// <summary locid=\"WinJS.PromiseStateMachine.then\">\n                /// Allows you to specify the work to be done on the fulfillment of the promised value,\n                /// the error handling to be performed if the promise fails to fulfill\n                /// a value, and the handling of progress notifications along the way.\n                /// </summary>\n                /// <param name='onComplete' type='Function' locid=\"WinJS.PromiseStateMachine.then_p:onComplete\">\n                /// The function to be called if the promise is fulfilled successfully with a value.\n                /// The value is passed as the single argument. If the value is null, the value is returned.\n                /// The value returned from the function becomes the fulfilled value of the promise returned by\n                /// then(). If an exception is thrown while this function is being executed, the promise returned\n                /// by then() moves into the error state.\n                /// </param>\n                /// <param name='onError' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.then_p:onError\">\n                /// The function to be called if the promise is fulfilled with an error. The error\n                /// is passed as the single argument. If it is null, the error is forwarded.\n                /// The value returned from the function becomes the fulfilled value of the promise returned by then().\n                /// </param>\n                /// <param name='onProgress' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.then_p:onProgress\">\n                /// The function to be called if the promise reports progress. Data about the progress\n                /// is passed as the single argument. Promises are not required to support\n                /// progress.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.PromiseStateMachine.then_returnValue\">\n                /// The promise whose value is the result of executing the complete or\n                /// error function.\n                /// </returns>\n                /// </signature>\n\n                // If the promise is already in a error state and no error handler is provided\n                // we optimize by simply returning the promise instead of creating a new one.\n                //\n                if (!onError) { return this; }\n                var result;\n                var value = this._value;\n                try {\n                    if (!onError.handlesOnError) {\n                        callonerror(null, value, detailsForHandledError, this, onError);\n                    }\n                    result = new CompletePromise(onError(value));\n                } catch (ex) {\n                    // If the value throw from the error handler is the same as the value\n                    // provided to the error handler then there is no need for a new promise.\n                    //\n                    if (ex === value) {\n                        result = this;\n                    } else {\n                        result = new ExceptionPromise(ex);\n                    }\n                }\n                return result;\n            }\n        }, {\n            supportedForProcessing: false\n        }\n    );\n\n    var ExceptionPromise = _Base.Class.derive(ErrorPromise,\n        function ExceptionPromise_ctor(value) {\n\n            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.exceptionPromise))) {\n                this._stack = Promise._getStack();\n            }\n\n            this._value = value;\n            callonerror(this, value, detailsForException);\n        }, {\n            /* empty */\n        }, {\n            supportedForProcessing: false\n        }\n    );\n\n    var CompletePromise = _Base.Class.define(\n        function CompletePromise_ctor(value) {\n\n            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.completePromise))) {\n                this._stack = Promise._getStack();\n            }\n\n            if (value && typeof value === \"object\" && typeof value.then === \"function\") {\n                var result = new ThenPromise(null);\n                result._setCompleteValue(value);\n                return result;\n            }\n            this._value = value;\n        }, {\n            cancel: function () {\n                /// <signature helpKeyword=\"WinJS.PromiseStateMachine.cancel\">\n                /// <summary locid=\"WinJS.PromiseStateMachine.cancel\">\n                /// Attempts to cancel the fulfillment of a promised value. If the promise hasn't\n                /// already been fulfilled and cancellation is supported, the promise enters\n                /// the error state with a value of Error(\"Canceled\").\n                /// </summary>\n                /// </signature>\n            },\n            done: function CompletePromise_done(onComplete) {\n                /// <signature helpKeyword=\"WinJS.PromiseStateMachine.done\">\n                /// <summary locid=\"WinJS.PromiseStateMachine.done\">\n                /// Allows you to specify the work to be done on the fulfillment of the promised value,\n                /// the error handling to be performed if the promise fails to fulfill\n                /// a value, and the handling of progress notifications along the way.\n                ///\n                /// After the handlers have finished executing, this function throws any error that would have been returned\n                /// from then() as a promise in the error state.\n                /// </summary>\n                /// <param name='onComplete' type='Function' locid=\"WinJS.PromiseStateMachine.done_p:onComplete\">\n                /// The function to be called if the promise is fulfilled successfully with a value.\n                /// The fulfilled value is passed as the single argument. If the value is null,\n                /// the fulfilled value is returned. The value returned\n                /// from the function becomes the fulfilled value of the promise returned by\n                /// then(). If an exception is thrown while executing the function, the promise returned\n                /// by then() moves into the error state.\n                /// </param>\n                /// <param name='onError' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.done_p:onError\">\n                /// The function to be called if the promise is fulfilled with an error. The error\n                /// is passed as the single argument. If it is null, the error is forwarded.\n                /// The value returned from the function is the fulfilled value of the promise returned by then().\n                /// </param>\n                /// <param name='onProgress' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.done_p:onProgress\">\n                /// the function to be called if the promise reports progress. Data about the progress\n                /// is passed as the single argument. Promises are not required to support\n                /// progress.\n                /// </param>\n                /// </signature>\n                if (!onComplete) { return; }\n                try {\n                    var result = onComplete(this._value);\n                    if (result && typeof result === \"object\" && typeof result.done === \"function\") {\n                        result.done();\n                    }\n                } catch (ex) {\n                    // force the exception to be thrown asynchronously to avoid any try/catch blocks\n                    Promise._doneHandler(ex);\n                }\n            },\n            then: function CompletePromise_then(onComplete) {\n                /// <signature helpKeyword=\"WinJS.PromiseStateMachine.then\">\n                /// <summary locid=\"WinJS.PromiseStateMachine.then\">\n                /// Allows you to specify the work to be done on the fulfillment of the promised value,\n                /// the error handling to be performed if the promise fails to fulfill\n                /// a value, and the handling of progress notifications along the way.\n                /// </summary>\n                /// <param name='onComplete' type='Function' locid=\"WinJS.PromiseStateMachine.then_p:onComplete\">\n                /// The function to be called if the promise is fulfilled successfully with a value.\n                /// The value is passed as the single argument. If the value is null, the value is returned.\n                /// The value returned from the function becomes the fulfilled value of the promise returned by\n                /// then(). If an exception is thrown while this function is being executed, the promise returned\n                /// by then() moves into the error state.\n                /// </param>\n                /// <param name='onError' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.then_p:onError\">\n                /// The function to be called if the promise is fulfilled with an error. The error\n                /// is passed as the single argument. If it is null, the error is forwarded.\n                /// The value returned from the function becomes the fulfilled value of the promise returned by then().\n                /// </param>\n                /// <param name='onProgress' type='Function' optional='true' locid=\"WinJS.PromiseStateMachine.then_p:onProgress\">\n                /// The function to be called if the promise reports progress. Data about the progress\n                /// is passed as the single argument. Promises are not required to support\n                /// progress.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.PromiseStateMachine.then_returnValue\">\n                /// The promise whose value is the result of executing the complete or\n                /// error function.\n                /// </returns>\n                /// </signature>\n                try {\n                    // If the value returned from the completion handler is the same as the value\n                    // provided to the completion handler then there is no need for a new promise.\n                    //\n                    var newValue = onComplete ? onComplete(this._value) : this._value;\n                    return newValue === this._value ? this : new CompletePromise(newValue);\n                } catch (ex) {\n                    return new ExceptionPromise(ex);\n                }\n            }\n        }, {\n            supportedForProcessing: false\n        }\n    );\n\n    //\n    // Promise is the user-creatable WinJS.Promise object.\n    //\n\n    function timeout(timeoutMS) {\n        var id;\n        return new Promise(\n            function (c) {\n                if (timeoutMS) {\n                    id = _Global.setTimeout(c, timeoutMS);\n                } else {\n                    _BaseCoreUtils._setImmediate(c);\n                }\n            },\n            function () {\n                if (id) {\n                    _Global.clearTimeout(id);\n                }\n            }\n        );\n    }\n\n    function timeoutWithPromise(timeout, promise) {\n        var cancelPromise = function () { promise.cancel(); };\n        var cancelTimeout = function () { timeout.cancel(); };\n        timeout.then(cancelPromise);\n        promise.then(cancelTimeout, cancelTimeout);\n        return promise;\n    }\n\n    var staticCanceledPromise;\n\n    var Promise = _Base.Class.derive(PromiseStateMachine,\n        function Promise_ctor(init, oncancel) {\n            /// <signature helpKeyword=\"WinJS.Promise\">\n            /// <summary locid=\"WinJS.Promise\">\n            /// A promise provides a mechanism to schedule work to be done on a value that\n            /// has not yet been computed. It is a convenient abstraction for managing\n            /// interactions with asynchronous APIs.\n            /// </summary>\n            /// <param name=\"init\" type=\"Function\" locid=\"WinJS.Promise_p:init\">\n            /// The function that is called during construction of the  promise. The function\n            /// is given three arguments (complete, error, progress). Inside this function\n            /// you should add event listeners for the notifications supported by this value.\n            /// </param>\n            /// <param name=\"oncancel\" optional=\"true\" locid=\"WinJS.Promise_p:oncancel\">\n            /// The function to call if a consumer of this promise wants\n            /// to cancel its undone work. Promises are not required to\n            /// support cancellation.\n            /// </param>\n            /// </signature>\n\n            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.promise))) {\n                this._stack = Promise._getStack();\n            }\n\n            this._oncancel = oncancel;\n            this._setState(state_created);\n            this._run();\n\n            try {\n                var complete = this._completed.bind(this);\n                var error = this._error.bind(this);\n                var progress = this._progress.bind(this);\n                init(complete, error, progress);\n            } catch (ex) {\n                this._setExceptionValue(ex);\n            }\n        }, {\n            _oncancel: null,\n\n            _cancelAction: function () {\n                if (this._oncancel) {\n                    try { this._oncancel(); } catch (ex) { }\n                }\n            },\n            _cleanupAction: function () { this._oncancel = null; }\n        }, {\n\n            addEventListener: function Promise_addEventListener(eventType, listener, capture) {\n                /// <signature helpKeyword=\"WinJS.Promise.addEventListener\">\n                /// <summary locid=\"WinJS.Promise.addEventListener\">\n                /// Adds an event listener to the control.\n                /// </summary>\n                /// <param name=\"eventType\" locid=\"WinJS.Promise.addEventListener_p:eventType\">\n                /// The type (name) of the event.\n                /// </param>\n                /// <param name=\"listener\" locid=\"WinJS.Promise.addEventListener_p:listener\">\n                /// The listener to invoke when the event is raised.\n                /// </param>\n                /// <param name=\"capture\" locid=\"WinJS.Promise.addEventListener_p:capture\">\n                /// Specifies whether or not to initiate capture.\n                /// </param>\n                /// </signature>\n                promiseEventListeners.addEventListener(eventType, listener, capture);\n            },\n            any: function Promise_any(values) {\n                /// <signature helpKeyword=\"WinJS.Promise.any\">\n                /// <summary locid=\"WinJS.Promise.any\">\n                /// Returns a promise that is fulfilled when one of the input promises\n                /// has been fulfilled.\n                /// </summary>\n                /// <param name=\"values\" type=\"Array\" locid=\"WinJS.Promise.any_p:values\">\n                /// An array that contains promise objects or objects whose property\n                /// values include promise objects.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.any_returnValue\">\n                /// A promise that on fulfillment yields the value of the input (complete or error).\n                /// </returns>\n                /// </signature>\n                return new Promise(\n                    function (complete, error) {\n                        var keys = Object.keys(values);\n                        if (keys.length === 0) {\n                            complete();\n                        }\n                        var canceled = 0;\n                        keys.forEach(function (key) {\n                            Promise.as(values[key]).then(\n                                function () { complete({ key: key, value: values[key] }); },\n                                function (e) {\n                                    if (e instanceof Error && e.name === canceledName) {\n                                        if ((++canceled) === keys.length) {\n                                            complete(Promise.cancel);\n                                        }\n                                        return;\n                                    }\n                                    error({ key: key, value: values[key] });\n                                }\n                            );\n                        });\n                    },\n                    function () {\n                        var keys = Object.keys(values);\n                        keys.forEach(function (key) {\n                            var promise = Promise.as(values[key]);\n                            if (typeof promise.cancel === \"function\") {\n                                promise.cancel();\n                            }\n                        });\n                    }\n                );\n            },\n            as: function Promise_as(value) {\n                /// <signature helpKeyword=\"WinJS.Promise.as\">\n                /// <summary locid=\"WinJS.Promise.as\">\n                /// Returns a promise. If the object is already a promise it is returned;\n                /// otherwise the object is wrapped in a promise.\n                /// </summary>\n                /// <param name=\"value\" locid=\"WinJS.Promise.as_p:value\">\n                /// The value to be treated as a promise.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.as_returnValue\">\n                /// A promise.\n                /// </returns>\n                /// </signature>\n                if (value && typeof value === \"object\" && typeof value.then === \"function\") {\n                    return value;\n                }\n                return new CompletePromise(value);\n            },\n            /// <field type=\"WinJS.Promise\" helpKeyword=\"WinJS.Promise.cancel\" locid=\"WinJS.Promise.cancel\">\n            /// Canceled promise value, can be returned from a promise completion handler\n            /// to indicate cancelation of the promise chain.\n            /// </field>\n            cancel: {\n                get: function () {\n                    return (staticCanceledPromise = staticCanceledPromise || new ErrorPromise(new _ErrorFromName(canceledName)));\n                }\n            },\n            dispatchEvent: function Promise_dispatchEvent(eventType, details) {\n                /// <signature helpKeyword=\"WinJS.Promise.dispatchEvent\">\n                /// <summary locid=\"WinJS.Promise.dispatchEvent\">\n                /// Raises an event of the specified type and properties.\n                /// </summary>\n                /// <param name=\"eventType\" locid=\"WinJS.Promise.dispatchEvent_p:eventType\">\n                /// The type (name) of the event.\n                /// </param>\n                /// <param name=\"details\" locid=\"WinJS.Promise.dispatchEvent_p:details\">\n                /// The set of additional properties to be attached to the event object.\n                /// </param>\n                /// <returns type=\"Boolean\" locid=\"WinJS.Promise.dispatchEvent_returnValue\">\n                /// Specifies whether preventDefault was called on the event.\n                /// </returns>\n                /// </signature>\n                return promiseEventListeners.dispatchEvent(eventType, details);\n            },\n            is: function Promise_is(value) {\n                /// <signature helpKeyword=\"WinJS.Promise.is\">\n                /// <summary locid=\"WinJS.Promise.is\">\n                /// Determines whether a value fulfills the promise contract.\n                /// </summary>\n                /// <param name=\"value\" locid=\"WinJS.Promise.is_p:value\">\n                /// A value that may be a promise.\n                /// </param>\n                /// <returns type=\"Boolean\" locid=\"WinJS.Promise.is_returnValue\">\n                /// true if the specified value is a promise, otherwise false.\n                /// </returns>\n                /// </signature>\n                return value && typeof value === \"object\" && typeof value.then === \"function\";\n            },\n            join: function Promise_join(values) {\n                /// <signature helpKeyword=\"WinJS.Promise.join\">\n                /// <summary locid=\"WinJS.Promise.join\">\n                /// Creates a promise that is fulfilled when all the values are fulfilled.\n                /// </summary>\n                /// <param name=\"values\" type=\"Object\" locid=\"WinJS.Promise.join_p:values\">\n                /// An object whose fields contain values, some of which may be promises.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.join_returnValue\">\n                /// A promise whose value is an object with the same field names as those of the object in the values parameter, where\n                /// each field value is the fulfilled value of a promise.\n                /// </returns>\n                /// </signature>\n                return new Promise(\n                    function (complete, error, progress) {\n                        var keys = Object.keys(values);\n                        var errors = Array.isArray(values) ? [] : {};\n                        var results = Array.isArray(values) ? [] : {};\n                        var undefineds = 0;\n                        var pending = keys.length;\n                        var argDone = function (key) {\n                            if ((--pending) === 0) {\n                                var errorCount = Object.keys(errors).length;\n                                if (errorCount === 0) {\n                                    complete(results);\n                                } else {\n                                    var canceledCount = 0;\n                                    keys.forEach(function (key) {\n                                        var e = errors[key];\n                                        if (e instanceof Error && e.name === canceledName) {\n                                            canceledCount++;\n                                        }\n                                    });\n                                    if (canceledCount === errorCount) {\n                                        complete(Promise.cancel);\n                                    } else {\n                                        error(errors);\n                                    }\n                                }\n                            } else {\n                                progress({ Key: key, Done: true });\n                            }\n                        };\n                        keys.forEach(function (key) {\n                            var value = values[key];\n                            if (value === undefined) {\n                                undefineds++;\n                            } else {\n                                Promise.then(value,\n                                    function (value) { results[key] = value; argDone(key); },\n                                    function (value) { errors[key] = value; argDone(key); }\n                                );\n                            }\n                        });\n                        pending -= undefineds;\n                        if (pending === 0) {\n                            complete(results);\n                            return;\n                        }\n                    },\n                    function () {\n                        Object.keys(values).forEach(function (key) {\n                            var promise = Promise.as(values[key]);\n                            if (typeof promise.cancel === \"function\") {\n                                promise.cancel();\n                            }\n                        });\n                    }\n                );\n            },\n            removeEventListener: function Promise_removeEventListener(eventType, listener, capture) {\n                /// <signature helpKeyword=\"WinJS.Promise.removeEventListener\">\n                /// <summary locid=\"WinJS.Promise.removeEventListener\">\n                /// Removes an event listener from the control.\n                /// </summary>\n                /// <param name='eventType' locid=\"WinJS.Promise.removeEventListener_eventType\">\n                /// The type (name) of the event.\n                /// </param>\n                /// <param name='listener' locid=\"WinJS.Promise.removeEventListener_listener\">\n                /// The listener to remove.\n                /// </param>\n                /// <param name='capture' locid=\"WinJS.Promise.removeEventListener_capture\">\n                /// Specifies whether or not to initiate capture.\n                /// </param>\n                /// </signature>\n                promiseEventListeners.removeEventListener(eventType, listener, capture);\n            },\n            supportedForProcessing: false,\n            then: function Promise_then(value, onComplete, onError, onProgress) {\n                /// <signature helpKeyword=\"WinJS.Promise.then\">\n                /// <summary locid=\"WinJS.Promise.then\">\n                /// A static version of the promise instance method then().\n                /// </summary>\n                /// <param name=\"value\" locid=\"WinJS.Promise.then_p:value\">\n                /// the value to be treated as a promise.\n                /// </param>\n                /// <param name=\"onComplete\" type=\"Function\" locid=\"WinJS.Promise.then_p:complete\">\n                /// The function to be called if the promise is fulfilled with a value.\n                /// If it is null, the promise simply\n                /// returns the value. The value is passed as the single argument.\n                /// </param>\n                /// <param name=\"onError\" type=\"Function\" optional=\"true\" locid=\"WinJS.Promise.then_p:error\">\n                /// The function to be called if the promise is fulfilled with an error. The error\n                /// is passed as the single argument.\n                /// </param>\n                /// <param name=\"onProgress\" type=\"Function\" optional=\"true\" locid=\"WinJS.Promise.then_p:progress\">\n                /// The function to be called if the promise reports progress. Data about the progress\n                /// is passed as the single argument. Promises are not required to support\n                /// progress.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.then_returnValue\">\n                /// A promise whose value is the result of executing the provided complete function.\n                /// </returns>\n                /// </signature>\n                return Promise.as(value).then(onComplete, onError, onProgress);\n            },\n            thenEach: function Promise_thenEach(values, onComplete, onError, onProgress) {\n                /// <signature helpKeyword=\"WinJS.Promise.thenEach\">\n                /// <summary locid=\"WinJS.Promise.thenEach\">\n                /// Performs an operation on all the input promises and returns a promise\n                /// that has the shape of the input and contains the result of the operation\n                /// that has been performed on each input.\n                /// </summary>\n                /// <param name=\"values\" locid=\"WinJS.Promise.thenEach_p:values\">\n                /// A set of values (which could be either an array or an object) of which some or all are promises.\n                /// </param>\n                /// <param name=\"onComplete\" type=\"Function\" locid=\"WinJS.Promise.thenEach_p:complete\">\n                /// The function to be called if the promise is fulfilled with a value.\n                /// If the value is null, the promise returns the value.\n                /// The value is passed as the single argument.\n                /// </param>\n                /// <param name=\"onError\" type=\"Function\" optional=\"true\" locid=\"WinJS.Promise.thenEach_p:error\">\n                /// The function to be called if the promise is fulfilled with an error. The error\n                /// is passed as the single argument.\n                /// </param>\n                /// <param name=\"onProgress\" type=\"Function\" optional=\"true\" locid=\"WinJS.Promise.thenEach_p:progress\">\n                /// The function to be called if the promise reports progress. Data about the progress\n                /// is passed as the single argument. Promises are not required to support\n                /// progress.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.thenEach_returnValue\">\n                /// A promise that is the result of calling Promise.join on the values parameter.\n                /// </returns>\n                /// </signature>\n                var result = Array.isArray(values) ? [] : {};\n                Object.keys(values).forEach(function (key) {\n                    result[key] = Promise.as(values[key]).then(onComplete, onError, onProgress);\n                });\n                return Promise.join(result);\n            },\n            timeout: function Promise_timeout(time, promise) {\n                /// <signature helpKeyword=\"WinJS.Promise.timeout\">\n                /// <summary locid=\"WinJS.Promise.timeout\">\n                /// Creates a promise that is fulfilled after a timeout.\n                /// </summary>\n                /// <param name=\"timeout\" type=\"Number\" optional=\"true\" locid=\"WinJS.Promise.timeout_p:timeout\">\n                /// The timeout period in milliseconds. If this value is zero or not specified\n                /// setImmediate is called, otherwise setTimeout is called.\n                /// </param>\n                /// <param name=\"promise\" type=\"Promise\" optional=\"true\" locid=\"WinJS.Promise.timeout_p:promise\">\n                /// A promise that will be canceled if it doesn't complete before the\n                /// timeout has expired.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.timeout_returnValue\">\n                /// A promise that is completed asynchronously after the specified timeout.\n                /// </returns>\n                /// </signature>\n                var to = timeout(time);\n                return promise ? timeoutWithPromise(to, promise) : to;\n            },\n            wrap: function Promise_wrap(value) {\n                /// <signature helpKeyword=\"WinJS.Promise.wrap\">\n                /// <summary locid=\"WinJS.Promise.wrap\">\n                /// Wraps a non-promise value in a promise. You can use this function if you need\n                /// to pass a value to a function that requires a promise.\n                /// </summary>\n                /// <param name=\"value\" locid=\"WinJS.Promise.wrap_p:value\">\n                /// Some non-promise value to be wrapped in a promise.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.wrap_returnValue\">\n                /// A promise that is successfully fulfilled with the specified value\n                /// </returns>\n                /// </signature>\n                return new CompletePromise(value);\n            },\n            wrapError: function Promise_wrapError(error) {\n                /// <signature helpKeyword=\"WinJS.Promise.wrapError\">\n                /// <summary locid=\"WinJS.Promise.wrapError\">\n                /// Wraps a non-promise error value in a promise. You can use this function if you need\n                /// to pass an error to a function that requires a promise.\n                /// </summary>\n                /// <param name=\"error\" locid=\"WinJS.Promise.wrapError_p:error\">\n                /// A non-promise error value to be wrapped in a promise.\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Promise.wrapError_returnValue\">\n                /// A promise that is in an error state with the specified value.\n                /// </returns>\n                /// </signature>\n                return new ErrorPromise(error);\n            },\n\n            _veryExpensiveTagWithStack: {\n                get: function () { return tagWithStack; },\n                set: function (value) { tagWithStack = value; }\n            },\n            _veryExpensiveTagWithStack_tag: tag,\n            _getStack: function () {\n                if (_Global.Debug && _Global.Debug.debuggerEnabled) {\n                    try { throw new Error(); } catch (e) { return e.stack; }\n                }\n            },\n\n            _cancelBlocker: function Promise__cancelBlocker(input, oncancel) {\n                //\n                // Returns a promise which on cancelation will still result in downstream cancelation while\n                //  protecting the promise 'input' from being  canceled which has the effect of allowing\n                //  'input' to be shared amoung various consumers.\n                //\n                if (!Promise.is(input)) {\n                    return Promise.wrap(input);\n                }\n                var complete;\n                var error;\n                var output = new Promise(\n                    function (c, e) {\n                        complete = c;\n                        error = e;\n                    },\n                    function () {\n                        complete = null;\n                        error = null;\n                        oncancel && oncancel();\n                    }\n                );\n                input.then(\n                    function (v) { complete && complete(v); },\n                    function (e) { error && error(e); }\n                );\n                return output;\n            },\n\n        }\n    );\n    Object.defineProperties(Promise, _Events.createEventProperties(errorET));\n\n    Promise._doneHandler = function (value) {\n        _BaseCoreUtils._setImmediate(function Promise_done_rethrow() {\n            throw value;\n        });\n    };\n\n    return {\n        PromiseStateMachine: PromiseStateMachine,\n        Promise: Promise,\n        state_created: state_created\n    };\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Promise',[\n    './Core/_Base',\n    './Promise/_StateMachine'\n    ], function promiseInit( _Base, _StateMachine) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS\", {\n        Promise: _StateMachine.Promise\n    });\n\n    return _StateMachine.Promise;\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_Log',[\n    'exports',\n    './_Global',\n    './_Base',\n    ], function logInit(exports, _Global, _Base) {\n    \"use strict\";\n\n    var spaceR = /\\s+/g;\n    var typeR = /^(error|warn|info|log)$/;\n    var WinJSLog = null;\n\n    function format(message, tag, type) {\n        /// <signature helpKeyword=\"WinJS.Utilities.formatLog\">\n        /// <summary locid=\"WinJS.Utilities.formatLog\">\n        /// Adds tags and type to a logging message.\n        /// </summary>\n        /// <param name=\"message\" type=\"String\" locid=\"WinJS.Utilities.startLog_p:message\">The message to format.</param>\n        /// <param name=\"tag\" type=\"String\" locid=\"WinJS.Utilities.startLog_p:tag\">\n        /// The tag(s) to apply to the message. Separate multiple tags with spaces.\n        /// </param>\n        /// <param name=\"type\" type=\"String\" locid=\"WinJS.Utilities.startLog_p:type\">The type of the message.</param>\n        /// <returns type=\"String\" locid=\"WinJS.Utilities.startLog_returnValue\">The formatted message.</returns>\n        /// </signature>\n        var m = message;\n        if (typeof (m) === \"function\") { m = m(); }\n\n        return ((type && typeR.test(type)) ? (\"\") : (type ? (type + \": \") : \"\")) +\n            (tag ? tag.replace(spaceR, \":\") + \": \" : \"\") +\n            m;\n    }\n    function defAction(message, tag, type) {\n        var m = exports.formatLog(message, tag, type);\n        if (_Global.console) {\n            _Global.console[(type && typeR.test(type)) ? type : \"log\"](m);\n        }\n    }\n    function escape(s) {\n        // \\s (whitespace) is used as separator, so don't escape it\n        return s.replace(/[-[\\]{}()*+?.,\\\\^$|#]/g, \"\\\\$&\");\n    }\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        startLog: function (options) {\n            /// <signature helpKeyword=\"WinJS.Utilities.startLog\">\n            /// <summary locid=\"WinJS.Utilities.startLog\">\n            /// Configures a logger that writes messages containing the specified tags from WinJS.log to console.log.\n            /// </summary>\n            /// <param name=\"options\" type=\"String\" locid=\"WinJS.Utilities.startLog_p:options\">\n            /// The tags for messages to log. Separate multiple tags with spaces.\n            /// </param>\n            /// </signature>\n            /// <signature>\n            /// <summary locid=\"WinJS.Utilities.startLog2\">\n            /// Configure a logger to write WinJS.log output.\n            /// </summary>\n            /// <param name=\"options\" type=\"Object\" locid=\"WinJS.Utilities.startLog_p:options2\">\n            /// May contain .type, .tags, .excludeTags and .action properties.\n            ///  - .type is a required tag.\n            ///  - .excludeTags is a space-separated list of tags, any of which will result in a message not being logged.\n            ///  - .tags is a space-separated list of tags, any of which will result in a message being logged.\n            ///  - .action is a function that, if present, will be called with the log message, tags and type. The default is to log to the console.\n            /// </param>\n            /// </signature>\n            options = options || {};\n            if (typeof options === \"string\") {\n                options = { tags: options };\n            }\n            var el = options.type && new RegExp(\"^(\" + escape(options.type).replace(spaceR, \" \").split(\" \").join(\"|\") + \")$\");\n            var not = options.excludeTags && new RegExp(\"(^|\\\\s)(\" + escape(options.excludeTags).replace(spaceR, \" \").split(\" \").join(\"|\") + \")(\\\\s|$)\", \"i\");\n            var has = options.tags && new RegExp(\"(^|\\\\s)(\" + escape(options.tags).replace(spaceR, \" \").split(\" \").join(\"|\") + \")(\\\\s|$)\", \"i\");\n            var action = options.action || defAction;\n\n            if (!el && !not && !has && !exports.log) {\n                exports.log = action;\n                return;\n            }\n\n            var result = function (message, tag, type) {\n                if (!((el && !el.test(type))          // if the expected log level is not satisfied\n                    || (not && not.test(tag))         // if any of the excluded categories exist\n                    || (has && !has.test(tag)))) {    // if at least one of the included categories doesn't exist\n                        action(message, tag, type);\n                    }\n\n                result.next && result.next(message, tag, type);\n            };\n            result.next = exports.log;\n            exports.log = result;\n        },\n        stopLog: function () {\n            /// <signature helpKeyword=\"WinJS.Utilities.stopLog\">\n            /// <summary locid=\"WinJS.Utilities.stopLog\">\n            /// Removes the previously set up logger.\n            /// </summary>\n            /// </signature>\n            exports.log = null;\n        },\n        formatLog: format\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS\", {\n        log: {\n            get: function () {\n                return WinJSLog;\n            },\n            set: function (value) {\n                WinJSLog = value;\n            }\n        }\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Scheduler',[\n    'exports',\n    './Core/_Global',\n    './Core/_Base',\n    './Core/_ErrorFromName',\n    './Core/_Log',\n    './Core/_Resources',\n    './Core/_Trace',\n    './Core/_WriteProfilerMark',\n    './Promise'\n    ], function schedulerInit(exports, _Global, _Base, _ErrorFromName, _Log, _Resources, _Trace, _WriteProfilerMark, Promise) {\n    \"use strict\";\n\n    function linkedListMixin(name) {\n        var mixin = {};\n        var PREV = \"_prev\" + name;\n        var NEXT = \"_next\" + name;\n        mixin[\"_remove\" + name] = function () {\n            // Assumes we always have a static head and tail.\n            //\n            var prev = this[PREV];\n            var next = this[NEXT];\n            // PREV <-> NEXT\n            //\n            next && (next[PREV] = prev);\n            prev && (prev[NEXT] = next);\n            // null <- this -> null\n            //\n            this[PREV] = null;\n            this[NEXT] = null;\n        };\n        mixin[\"_insert\" + name + \"Before\"] = function (node) {\n            var prev = this[PREV];\n            // PREV -> node -> this\n            //\n            prev && (prev[NEXT] = node);\n            node[NEXT] = this;\n            // PREV <- node <- this\n            //\n            node[PREV] = prev;\n            this[PREV] = node;\n\n            return node;\n        };\n        mixin[\"_insert\" + name + \"After\"] = function (node) {\n            var next = this[NEXT];\n            // this -> node -> NEXT\n            //\n            this[NEXT] = node;\n            node[NEXT] = next;\n            // this <- node <- NEXT\n            //\n            node[PREV] = this;\n            next && (next[PREV] = node);\n\n            return node;\n        };\n        return mixin;\n    }\n\n    _Base.Namespace.define(\"WinJS.Utilities\", {\n\n        _linkedListMixin: linkedListMixin\n\n    });\n\n    var strings = {\n        get jobInfoIsNoLongerValid() { return \"The job info object can only be used while the job is running\"; }\n    };\n\n    //\n    // Profiler mark helpers\n    //\n    // markerType must be one of the following: info, StartTM, StopTM\n    //\n\n    function profilerMarkArgs(arg0, arg1, arg2) {\n        if (arg2 !== undefined) {\n            return \"(\" + arg0 + \";\" + arg1 + \";\" + arg2 + \")\";\n        } else if (arg1 !== undefined) {\n            return \"(\" + arg0 + \";\" + arg1 + \")\";\n        } else if (arg0 !== undefined) {\n            return \"(\" + arg0 + \")\";\n        } else {\n            return \"\";\n        }\n    }\n\n    function schedulerProfilerMark(operation, markerType, arg0, arg1) {\n        _WriteProfilerMark(\n            \"WinJS.Scheduler:\" + operation +\n            profilerMarkArgs(arg0, arg1) +\n            \",\" + markerType\n        );\n    }\n\n    function jobProfilerMark(job, operation, markerType, arg0, arg1) {\n        var argProvided = job.name || arg0 !== undefined || arg1 !== undefined;\n\n        _WriteProfilerMark(\n            \"WinJS.Scheduler:\" + operation + \":\" + job.id +\n            (argProvided ? profilerMarkArgs(job.name, arg0, arg1) : \"\") +\n            \",\" + markerType\n        );\n    }\n\n    //\n    // Job type. This cannot be instantiated by developers and is instead handed back by the scheduler\n    //  schedule method. Its public interface is what is used when interacting with a job.\n    //\n\n    var JobNode = _Base.Class.define(function (id, work, priority, context, name, asyncOpID) {\n        this._id = id;\n        this._work = work;\n        this._context = context;\n        this._name = name;\n        this._asyncOpID = asyncOpID;\n        this._setPriority(priority);\n        this._setState(state_created);\n        jobProfilerMark(this, \"job-scheduled\", \"info\");\n    }, {\n\n        /// <field type=\"Boolean\" locid=\"WinJS.Utilities.Scheduler._JobNode.completed\" helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.completed\">\n        /// Gets a value that indicates whether the job has completed. This value is true if job has run to completion\n        /// and false if it hasn't yet run or was canceled.\n        /// </field>\n        completed: {\n            get: function () { return !!this._state.completed; }\n        },\n\n        /// <field type=\"Number\" locid=\"WinJS.Utilities.Scheduler._JobNode.id\" helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.id\">\n        /// Gets the unique identifier for this job.\n        /// </field>\n        id: {\n            get: function () { return this._id; }\n        },\n\n        /// <field type=\"String\" locid=\"WinJS.Utilities.Scheduler._JobNode.name\" helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.name\">\n        /// Gets or sets a string that specifies the diagnostic name for this job.\n        /// </field>\n        name: {\n            get: function () { return this._name; },\n            set: function (value) { this._name = value; }\n        },\n\n        /// <field type=\"WinJS.Utilities.Scheduler._OwnerToken\" locid=\"WinJS.Utilities.Scheduler._JobNode.owner\" helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.owner\">\n        /// Gets an owner token for the job. You can use this owner token's cancelAll method to cancel related jobs.\n        /// </field>\n        owner: {\n            get: function () { return this._owner; },\n            set: function (value) {\n                this._owner && this._owner._remove(this);\n                this._owner = value;\n                this._owner && this._owner._add(this);\n            }\n        },\n\n        /// <field type=\"WinJS.Utilities.Scheduler.Priority\" locid=\"WinJS.Utilities.Scheduler._JobNode.priority\" helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.priority\">\n        /// Gets or sets the priority at which this job is executed by the scheduler.\n        /// </field>\n        priority: {\n            get: function () { return this._priority; },\n            set: function (value) {\n                value = clampPriority(value);\n                this._state.setPriority(this, value);\n            }\n        },\n\n        cancel: function () {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.cancel\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler._JobNode.cancel\">Cancels the job.</summary>\n            /// </signature>\n            this._state.cancel(this);\n        },\n\n        pause: function () {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.pause\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler._JobNode.pause\">Pauses the job.</summary>\n            /// </signature>\n            this._state.pause(this);\n        },\n\n        resume: function () {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler._JobNode.resume\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler._JobNode.resume\">Resumes the job if it's been paused.</summary>\n            /// </signature>\n            this._state.resume(this);\n        },\n\n        _execute: function (shouldYield) {\n            this._state.execute(this, shouldYield);\n        },\n\n        _executeDone: function (result) {\n            return this._state.executeDone(this, result);\n        },\n\n        _blockedDone: function (result) {\n            return this._state.blockedDone(this, result);\n        },\n\n        _setPriority: function (value) {\n            if (+this._priority === this._priority && this._priority !== value) {\n                jobProfilerMark(this, \"job-priority-changed\", \"info\",\n                    markerFromPriority(this._priority).name,\n                    markerFromPriority(value).name);\n            }\n            this._priority = value;\n        },\n\n        _setState: function (state, arg0, arg1) {\n            if (this._state) {\n                _Log.log && _Log.log(\"Transitioning job (\" + this.id + \") from: \" + this._state.name + \" to: \" + state.name, \"winjs scheduler\", \"log\");\n            }\n            this._state = state;\n            this._state.enter(this, arg0, arg1);\n        },\n\n    });\n    _Base.Class.mix(JobNode, linkedListMixin(\"Job\"));\n\n    var YieldPolicy = {\n        complete: 1,\n        continue: 2,\n        block: 3,\n    };\n\n    //\n    // JobInfo object is passed to a work item when it is executed and allows the work to ask whether it\n    //  should cooperatively yield and in that event provide a continuation work function to run the\n    //  next time this job is scheduled. The JobInfo object additionally allows access to the job itself\n    //  and the ability to provide a Promise for a future continuation work function in order to have\n    //  jobs easily block on async work.\n    //\n\n    var JobInfo = _Base.Class.define(function (shouldYield, job) {\n        this._job = job;\n        this._result = null;\n        this._yieldPolicy = YieldPolicy.complete;\n        this._shouldYield = shouldYield;\n    }, {\n\n        /// <field type=\"WinJS.Utilities.Scheduler._JobNode\" locid=\"WinJS.Utilities.Scheduler._JobInfo.job\" helpKeyword=\"WinJS.Utilities.Scheduler._JobInfo.job\">\n        /// The job instance for which the work is currently being executed.\n        /// </field>\n        job: {\n            get: function () {\n                this._throwIfDisabled();\n                return this._job;\n            }\n        },\n\n        /// <field type=\"Boolean\" locid=\"WinJS.Utilities.Scheduler._JobInfo.shouldYield\" helpKeyword=\"WinJS.Utilities.Scheduler._JobInfo.shouldYield\">\n        /// A boolean which will become true when the work item is requested to cooperatively yield by the scheduler.\n        /// </field>\n        shouldYield: {\n            get: function () {\n                this._throwIfDisabled();\n                return this._shouldYield();\n            }\n        },\n\n        setPromise: function (promise) {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler._JobInfo.setPromise\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler._JobInfo.setPromise\">\n            /// Called when the  work item is blocked on asynchronous work.\n            /// The scheduler waits for the specified Promise to complete before rescheduling the job.\n            /// </summary>\n            /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.Utilities.Scheduler._JobInfo.setPromise_p:promise\">\n            /// A Promise value which, when completed, provides a work item function to be re-scheduled.\n            /// </param>\n            /// </signature>\n            this._throwIfDisabled();\n            this._result = promise;\n            this._yieldPolicy = YieldPolicy.block;\n        },\n\n        setWork: function (work) {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler._JobInfo.setWork\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler._JobInfo.setWork\">\n            /// Called  when the work item is cooperatively yielding to the scheduler and has more work to complete in the future.\n            /// Use this method to schedule additonal work for when the work item is about to yield.\n            /// </summary>\n            /// <param name=\"work\" type=\"Function\" locid=\"WinJS.Utilities.Scheduler._JobInfo.setWork_p:work\">\n            /// The work function which will be re-scheduled.\n            /// </param>\n            /// </signature>\n            this._throwIfDisabled();\n            this._result = work;\n            this._yieldPolicy = YieldPolicy.continue;\n        },\n\n        _disablePublicApi: function () {\n            // _disablePublicApi should be called as soon as the job yields. This\n            //  says that the job info object should no longer be used by the\n            //  job and if the job tries to use it, job info will throw.\n            //\n            this._publicApiDisabled = true;\n        },\n\n        _throwIfDisabled: function () {\n            if (this._publicApiDisabled) {\n                throw new _ErrorFromName(\"WinJS.Utilities.Scheduler.JobInfoIsNoLongerValid\", strings.jobInfoIsNoLongerValid);\n            }\n        }\n\n    });\n\n    //\n    // Owner type. Made available to developers through the createOwnerToken method.\n    //  Allows cancelation of jobs in bulk.\n    //\n\n    var OwnerToken = _Base.Class.define(function OwnerToken_ctor() {\n        this._jobs = {};\n    }, {\n        cancelAll: function OwnerToken_cancelAll() {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler._OwnerToken.cancelAll\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler._OwnerToken.cancelAll\">\n            /// Cancels all jobs that are associated with this owner token.\n            /// </summary>\n            /// </signature>\n            var jobs = this._jobs,\n                jobIds = Object.keys(jobs);\n            this._jobs = {};\n\n            for (var i = 0, len = jobIds.length; i < len; i++) {\n                jobs[jobIds[i]].cancel();\n            }\n        },\n\n        _add: function OwnerToken_add(job) {\n            this._jobs[job.id] = job;\n        },\n\n        _remove: function OwnerToken_remove(job) {\n            delete this._jobs[job.id];\n        }\n    });\n\n    function _() {\n        // Noop function, used in the various states to indicate that they don't support a given\n        // message. Named with the somewhat cute name '_' because it reads really well in the states.\n        //\n        return false;\n    }\n    function illegal(job) {\n        /*jshint validthis: true */\n        throw \"Illegal call by job(\" + job.id + \") in state: \" + this.name;\n    }\n\n    //\n    // Scheduler job state machine.\n    //\n    // A job normally goes through a lifecycle which is created -> scheduled -> running -> complete. The\n    //  Scheduler decides when to transition a job from scheduled to running based on its policies and\n    //  the other work which is scheduled.\n    //\n    // Additionally there are various operations which can be performed on a job which will change its\n    //  state like: cancel, pause, resume and setting the job's priority.\n    //\n    // Additionally when in the running state a job may either cooperatively yield, or block.\n    //\n    // The job state machine accounts for these various states and interactions.\n    //\n\n    var State = _Base.Class.define(function (name) {\n        this.name = name;\n        this.enter = illegal;\n        this.execute = illegal;\n        this.executeDone = illegal;\n        this.blockedDone = illegal;\n        this.cancel = illegal;\n        this.pause = illegal;\n        this.resume = illegal;\n        this.setPriority = illegal;\n    });\n\n    var state_created = new State(\"created\"),                                   // -> scheduled\n        state_scheduled = new State(\"scheduled\"),                               // -> running | canceled | paused\n        state_paused = new State(\"paused\"),                                     // -> canceled | scheduled\n        state_canceled = new State(\"canceled\"),                                 // -> .\n        state_running = new State(\"running\"),                                   // -> cooperative_yield | blocked | complete | running_canceled | running_paused\n        state_running_paused = new State(\"running_paused\"),                     // -> cooperative_yield_paused | blocked_paused | complete | running_canceled | running_resumed\n        state_running_resumed = new State(\"running_resumed\"),                   // -> cooperative_yield | blocked | complete | running_canceled | running_paused\n        state_running_canceled = new State(\"running_canceled\"),                 // -> canceled | running_canceled_blocked\n        state_running_canceled_blocked = new State(\"running_canceled_blocked\"), // -> canceled\n        state_cooperative_yield = new State(\"cooperative_yield\"),               // -> scheduled\n        state_cooperative_yield_paused = new State(\"cooperative_yield_paused\"), // -> paused\n        state_blocked = new State(\"blocked\"),                                   // -> blocked_waiting\n        state_blocked_waiting = new State(\"blocked_waiting\"),                   // -> cooperative_yield | complete | blocked_canceled | blocked_paused_waiting\n        state_blocked_paused = new State(\"blocked_paused\"),                     // -> blocked_paused_waiting\n        state_blocked_paused_waiting = new State(\"blocked_paused_waiting\"),     // -> cooperative_yield_paused | complete | blocked_canceled | blocked_waiting\n        state_blocked_canceled = new State(\"blocked_canceled\"),                 // -> canceled\n        state_complete = new State(\"complete\");                                 // -> .\n\n    // A given state may include implementations for the following operations:\n    //\n    //  - enter(job, arg0, arg1)\n    //  - execute(job, shouldYield)\n    //  - executeDone(job, result) --> next state\n    //  - blockedDone(job, result, initialPriority)\n    //  - cancel(job)\n    //  - pause(job)\n    //  - resume(job)\n    //  - setPriority(job, priority)\n    //\n    // Any functions which are not implemented are illegal in that state.\n    // Any functions which have an implementation of _ are a nop in that state.\n    //\n\n    // Helper which yields a function that transitions to the specified state\n    //\n    function setState(state) {\n        return function (job, arg0, arg1) {\n            job._setState(state, arg0, arg1);\n        };\n    }\n\n    // Helper which sets the priority of a job.\n    //\n    function changePriority(job, priority) {\n        job._setPriority(priority);\n    }\n\n    // Created\n    //\n    state_created.enter = function (job) {\n        addJobAtTailOfPriority(job, job.priority);\n        job._setState(state_scheduled);\n    };\n\n    // Scheduled\n    //\n    state_scheduled.enter = function () {\n        startRunning();\n    };\n    state_scheduled.execute = setState(state_running);\n    state_scheduled.cancel = setState(state_canceled);\n    state_scheduled.pause = setState(state_paused);\n    state_scheduled.resume = _;\n    state_scheduled.setPriority = function (job, priority) {\n        if (job.priority !== priority) {\n            job._setPriority(priority);\n            job.pause();\n            job.resume();\n        }\n    };\n\n    // Paused\n    //\n    state_paused.enter = function (job) {\n        jobProfilerMark(job, \"job-paused\", \"info\");\n        job._removeJob();\n    };\n    state_paused.cancel = setState(state_canceled);\n    state_paused.pause = _;\n    state_paused.resume = function (job) {\n        jobProfilerMark(job, \"job-resumed\", \"info\");\n        addJobAtTailOfPriority(job, job.priority);\n        job._setState(state_scheduled);\n    };\n    state_paused.setPriority = changePriority;\n\n    // Canceled\n    //\n    state_canceled.enter = function (job) {\n        jobProfilerMark(job, \"job-canceled\", \"info\");\n        _Trace._traceAsyncOperationCompleted(job._asyncOpID, _Global.Debug && _Global.Debug.MS_ASYNC_OP_STATUS_CANCELED);\n        job._removeJob();\n        job._work = null;\n        job._context = null;\n        job.owner = null;\n    };\n    state_canceled.cancel = _;\n    state_canceled.pause = _;\n    state_canceled.resume = _;\n    state_canceled.setPriority = _;\n\n    // Running\n    //\n    state_running.enter = function (job, shouldYield) {\n        // Remove the job from the list in case it throws an exception, this means in the\n        //  yield case we have to add it back.\n        //\n        job._removeJob();\n\n        var priority = job.priority;\n        var work = job._work;\n        var context = job._context;\n\n        // Null out the work and context so they aren't leaked if the job throws an exception.\n        //\n        job._work = null;\n        job._context = null;\n\n        var jobInfo = new JobInfo(shouldYield, job);\n\n        _Trace._traceAsyncCallbackStarting(job._asyncOpID);\n        try {\n            MSApp.execAtPriority(function () {\n                work.call(context, jobInfo);\n            }, toWwaPriority(priority));\n        } finally {\n            _Trace._traceAsyncCallbackCompleted();\n            jobInfo._disablePublicApi();\n        }\n\n        // Restore the context in case it is needed due to yielding or blocking.\n        //\n        job._context = context;\n\n        var targetState = job._executeDone(jobInfo._yieldPolicy);\n\n        job._setState(targetState, jobInfo._result, priority);\n    };\n    state_running.executeDone = function (job, yieldPolicy) {\n        switch (yieldPolicy) {\n            case YieldPolicy.complete:\n                return state_complete;\n            case YieldPolicy.continue:\n                return state_cooperative_yield;\n            case YieldPolicy.block:\n                return state_blocked;\n        }\n    };\n    state_running.cancel = function (job) {\n        // Interaction with the singleton scheduler. The act of canceling a job pokes the scheduler\n        //  and tells it to start asking the job to yield.\n        //\n        immediateYield = true;\n        job._setState(state_running_canceled);\n    };\n    state_running.pause = function (job) {\n        // Interaction with the singleton scheduler. The act of pausing a job pokes the scheduler\n        //  and tells it to start asking the job to yield.\n        //\n        immediateYield = true;\n        job._setState(state_running_paused);\n    };\n    state_running.resume = _;\n    state_running.setPriority = changePriority;\n\n    // Running paused\n    //\n    state_running_paused.enter = _;\n    state_running_paused.executeDone = function (job, yieldPolicy) {\n        switch (yieldPolicy) {\n            case YieldPolicy.complete:\n                return state_complete;\n            case YieldPolicy.continue:\n                return state_cooperative_yield_paused;\n            case YieldPolicy.block:\n                return state_blocked_paused;\n        }\n    };\n    state_running_paused.cancel = setState(state_running_canceled);\n    state_running_paused.pause = _;\n    state_running_paused.resume = setState(state_running_resumed);\n    state_running_paused.setPriority = changePriority;\n\n    // Running resumed\n    //\n    state_running_resumed.enter = _;\n    state_running_resumed.executeDone = function (job, yieldPolicy) {\n        switch (yieldPolicy) {\n            case YieldPolicy.complete:\n                return state_complete;\n            case YieldPolicy.continue:\n                return state_cooperative_yield;\n            case YieldPolicy.block:\n                return state_blocked;\n        }\n    };\n    state_running_resumed.cancel = setState(state_running_canceled);\n    state_running_resumed.pause = setState(state_running_paused);\n    state_running_resumed.resume = _;\n    state_running_resumed.setPriority = changePriority;\n\n    // Running canceled\n    //\n    state_running_canceled.enter = _;\n    state_running_canceled.executeDone = function (job, yieldPolicy) {\n        switch (yieldPolicy) {\n            case YieldPolicy.complete:\n            case YieldPolicy.continue:\n                return state_canceled;\n            case YieldPolicy.block:\n                return state_running_canceled_blocked;\n        }\n    };\n    state_running_canceled.cancel = _;\n    state_running_canceled.pause = _;\n    state_running_canceled.resume = _;\n    state_running_canceled.setPriority = _;\n\n    // Running canceled -> blocked\n    //\n    state_running_canceled_blocked.enter = function (job, work) {\n        work.cancel();\n        job._setState(state_canceled);\n    };\n\n    // Cooperative yield\n    //\n    state_cooperative_yield.enter = function (job, work, initialPriority) {\n        jobProfilerMark(job, \"job-yielded\", \"info\");\n        if (initialPriority === job.priority) {\n            addJobAtHeadOfPriority(job, job.priority);\n        } else {\n            addJobAtTailOfPriority(job, job.priority);\n        }\n        job._work = work;\n        job._setState(state_scheduled);\n    };\n\n    // Cooperative yield paused\n    //\n    state_cooperative_yield_paused.enter = function (job, work) {\n        jobProfilerMark(job, \"job-yielded\", \"info\");\n        job._work = work;\n        job._setState(state_paused);\n    };\n\n    // Blocked\n    //\n    state_blocked.enter = function (job, work, initialPriority) {\n        jobProfilerMark(job, \"job-blocked\", \"StartTM\");\n        job._work = work;\n        job._setState(state_blocked_waiting);\n\n        // Sign up for a completion from the provided promise, after the completion occurs\n        //  transition from the current state at the completion time to the target state\n        //  depending on the completion value.\n        //\n        work.done(\n            function (newWork) {\n                jobProfilerMark(job, \"job-blocked\", \"StopTM\");\n                var targetState = job._blockedDone(newWork);\n                job._setState(targetState, newWork, initialPriority);\n            },\n            function (error) {\n                if (!(error && error.name === \"Canceled\")) {\n                    jobProfilerMark(job, \"job-error\", \"info\");\n                }\n                jobProfilerMark(job, \"job-blocked\", \"StopTM\");\n                job._setState(state_canceled);\n                return Promise.wrapError(error);\n            }\n        );\n    };\n\n    // Blocked waiting\n    //\n    state_blocked_waiting.enter = _;\n    state_blocked_waiting.blockedDone = function (job, result) {\n        if (typeof result === \"function\") {\n            return state_cooperative_yield;\n        } else {\n            return state_complete;\n        }\n    };\n    state_blocked_waiting.cancel = setState(state_blocked_canceled);\n    state_blocked_waiting.pause = setState(state_blocked_paused_waiting);\n    state_blocked_waiting.resume = _;\n    state_blocked_waiting.setPriority = changePriority;\n\n    // Blocked paused\n    //\n    state_blocked_paused.enter = function (job, work, initialPriority) {\n        jobProfilerMark(job, \"job-blocked\", \"StartTM\");\n        job._work = work;\n        job._setState(state_blocked_paused_waiting);\n\n        // Sign up for a completion from the provided promise, after the completion occurs\n        //  transition from the current state at the completion time to the target state\n        //  depending on the completion value.\n        //\n        work.done(\n            function (newWork) {\n                jobProfilerMark(job, \"job-blocked\", \"StopTM\");\n                var targetState = job._blockedDone(newWork);\n                job._setState(targetState, newWork, initialPriority);\n            },\n            function (error) {\n                if (!(error && error.name === \"Canceled\")) {\n                    jobProfilerMark(job, \"job-error\", \"info\");\n                }\n                jobProfilerMark(job, \"job-blocked\", \"StopTM\");\n                job._setState(state_canceled);\n                return Promise.wrapError(error);\n            }\n        );\n    };\n\n    // Blocked paused waiting\n    //\n    state_blocked_paused_waiting.enter = _;\n    state_blocked_paused_waiting.blockedDone = function (job, result) {\n        if (typeof result === \"function\") {\n            return state_cooperative_yield_paused;\n        } else {\n            return state_complete;\n        }\n    };\n    state_blocked_paused_waiting.cancel = setState(state_blocked_canceled);\n    state_blocked_paused_waiting.pause = _;\n    state_blocked_paused_waiting.resume = setState(state_blocked_waiting);\n    state_blocked_paused_waiting.setPriority = changePriority;\n\n    // Blocked canceled\n    //\n    state_blocked_canceled.enter = function (job) {\n        // Cancel the outstanding promise and then eventually it will complete, presumably with a 'canceled'\n        //  error at which point we will transition to the canceled state.\n        //\n        job._work.cancel();\n        job._work = null;\n    };\n    state_blocked_canceled.blockedDone = function () {\n        return state_canceled;\n    };\n    state_blocked_canceled.cancel = _;\n    state_blocked_canceled.pause = _;\n    state_blocked_canceled.resume = _;\n    state_blocked_canceled.setPriority = _;\n\n    // Complete\n    //\n    state_complete.completed = true;\n    state_complete.enter = function (job) {\n        _Trace._traceAsyncOperationCompleted(job._asyncOpID, _Global.Debug && _Global.Debug.MS_ASYNC_OP_STATUS_SUCCESS);\n        job._work = null;\n        job._context = null;\n        job.owner = null;\n        jobProfilerMark(job, \"job-completed\", \"info\");\n    };\n    state_complete.cancel = _;\n    state_complete.pause = _;\n    state_complete.resume = _;\n    state_complete.setPriority = _;\n\n    // Private Priority marker node in the Job list. The marker nodes are linked both into the job\n    //  list and a separate marker list. This is used so that jobs can be easily added into a given\n    //  priority level by simply traversing to the next marker in the list and inserting before it.\n    //\n    // Markers may either be \"static\" or \"dynamic\". Static markers are the set of things which are\n    //  named and are always in the list, they may exist with or without jobs at their priority\n    //  level. Dynamic markers are added as needed.\n    //\n    // @NOTE: Dynamic markers are NYI\n    //\n    var MarkerNode = _Base.Class.define(function (priority, name) {\n        this.priority = priority;\n        this.name = name;\n    }, {\n\n        // NYI\n        //\n        //dynamic: {\n        //    get: function () { return !this.name; }\n        //},\n\n    });\n    _Base.Class.mix(MarkerNode, linkedListMixin(\"Job\"), linkedListMixin(\"Marker\"));\n\n    //\n    // Scheduler state\n    //\n\n    // Unique ID per job.\n    //\n    var globalJobId = 0;\n\n    // Unique ID per drain request.\n    var globalDrainId = 0;\n\n    // Priority is: -15 ... 0 ... 15 where that maps to: 'min' ... 'normal' ... 'max'\n    //\n    var MIN_PRIORITY = -15;\n    var MAX_PRIORITY = 15;\n\n    // Named priorities\n    //\n    var Priority = {\n        max: 15,\n        high: 13,\n        aboveNormal: 9,\n        normal: 0,\n        belowNormal: -9,\n        idle: -13,\n        min: -15,\n    };\n\n    // Definition of the priorities, named have static markers.\n    //\n    var priorities = [\n        new MarkerNode(15, \"max\"),          // Priority.max\n        new MarkerNode(14, \"14\"),\n        new MarkerNode(13, \"high\"),         // Priority.high\n        new MarkerNode(12, \"12\"),\n        new MarkerNode(11, \"11\"),\n        new MarkerNode(10, \"10\"),\n        new MarkerNode(9, \"aboveNormal\"),   // Priority.aboveNormal\n        new MarkerNode(8, \"8\"),\n        new MarkerNode(7, \"7\"),\n        new MarkerNode(6, \"6\"),\n        new MarkerNode(5, \"5\"),\n        new MarkerNode(4, \"4\"),\n        new MarkerNode(3, \"3\"),\n        new MarkerNode(2, \"2\"),\n        new MarkerNode(1, \"1\"),\n        new MarkerNode(0, \"normal\"),        // Priority.normal\n        new MarkerNode(-1, \"-1\"),\n        new MarkerNode(-2, \"-2\"),\n        new MarkerNode(-3, \"-3\"),\n        new MarkerNode(-4, \"-4\"),\n        new MarkerNode(-5, \"-5\"),\n        new MarkerNode(-6, \"-6\"),\n        new MarkerNode(-7, \"-7\"),\n        new MarkerNode(-8, \"-8\"),\n        new MarkerNode(-9, \"belowNormal\"),  // Priority.belowNormal\n        new MarkerNode(-10, \"-10\"),\n        new MarkerNode(-11, \"-11\"),\n        new MarkerNode(-12, \"-12\"),\n        new MarkerNode(-13, \"idle\"),        // Priority.idle\n        new MarkerNode(-14, \"-14\"),\n        new MarkerNode(-15, \"min\"),         // Priority.min\n        new MarkerNode(-16, \"<TAIL>\")\n    ];\n\n    function dumpList(type, reverse) {\n        function dumpMarker(marker, pos) {\n            _Log.log && _Log.log(pos + \": MARKER: \" + marker.name, \"winjs scheduler\", \"log\");\n        }\n        function dumpJob(job, pos) {\n            _Log.log && _Log.log(pos + \": JOB(\" + job.id + \"): state: \" + (job._state ? job._state.name : \"\") + (job.name ? \", name: \" + job.name : \"\"), \"winjs scheduler\", \"log\");\n        }\n        _Log.log && _Log.log(\"highWaterMark: \" + highWaterMark, \"winjs scheduler\", \"log\");\n        var pos = 0;\n        var head = reverse ? priorities[priorities.length - 1] : priorities[0];\n        var current = head;\n        do {\n            if (current instanceof MarkerNode) {\n                dumpMarker(current, pos);\n            }\n            if (current instanceof JobNode) {\n                dumpJob(current, pos);\n            }\n            pos++;\n            current = reverse ? current[\"_prev\" + type] : current[\"_next\" + type];\n        } while (current);\n    }\n\n    function retrieveState() {\n        /// <signature helpKeyword=\"WinJS.Utilities.Scheduler.retrieveState\">\n        /// <summary locid=\"WinJS.Utilities.Scheduler.retrieveState\">\n        /// Returns a string representation of the scheduler's state for diagnostic\n        /// purposes. The jobs and drain requests are displayed in the order in which\n        /// they are currently expected to be processed. The current job and drain\n        /// request are marked by an asterisk.\n        /// </summary>\n        /// </signature>\n        var output = \"\";\n\n        function logJob(job, isRunning) {\n            output +=\n                \"    \" + (isRunning ? \"*\" : \" \") +\n                \"id: \" + job.id +\n                \", priority: \" + markerFromPriority(job.priority).name +\n                (job.name ? \", name: \" + job.name : \"\") +\n                \"\\n\";\n        }\n\n        output += \"Jobs:\\n\";\n        var current = markerFromPriority(highWaterMark);\n        var jobCount = 0;\n        if (runningJob) {\n            logJob(runningJob, true);\n            jobCount++;\n        }\n        while (current.priority >= Priority.min) {\n            if (current instanceof JobNode) {\n                logJob(current, false);\n                jobCount++;\n            }\n            current = current._nextJob;\n        }\n        if (jobCount === 0) {\n            output += \"     None\\n\";\n        }\n\n        output += \"Drain requests:\\n\";\n        for (var i = 0, len = drainQueue.length; i < len; i++) {\n            output +=\n                \"    \" + (i === 0 ? \"*\" : \" \") +\n                \"priority: \" + markerFromPriority(drainQueue[i].priority).name +\n                \", name: \" + drainQueue[i].name +\n                \"\\n\";\n        }\n        if (drainQueue.length === 0) {\n            output += \"     None\\n\";\n        }\n\n        return output;\n    }\n\n    function isEmpty() {\n        var current = priorities[0];\n        do {\n            if (current instanceof JobNode) {\n                return false;\n            }\n            current = current._nextJob;\n        } while (current);\n\n        return true;\n    }\n\n    // The WWA priority at which the pump is currently scheduled on the WWA scheduler.\n    //  null when the pump is not scheduled.\n    //\n    var scheduledWwaPriority = null;\n\n    // Whether the scheduler pump is currently on the stack\n    //\n    var pumping;\n    // What priority is currently being pumped\n    //\n    var pumpingPriority;\n\n    // A reference to the job object that is currently running.\n    //  null when no job is running.\n    //\n    var runningJob = null;\n\n    // Whether we are using the WWA scheduler.\n    //\n    var usingWwaScheduler = !!(_Global.MSApp && _Global.MSApp.execAtPriority);\n\n    // Queue of drain listeners\n    //\n    var drainQueue = [];\n\n    // Bit indicating that we should yield immediately\n    //\n    var immediateYield;\n\n    // time slice for scheduler\n    //\n    var TIME_SLICE = 30;\n\n    // high-water-mark is maintained any time priorities are adjusted, new jobs are\n    //  added or the scheduler pumps itself down through a priority marker. The goal\n    //  of the high-water-mark is to be a fast check as to whether a job may exist\n    //  at a higher priority level than we are currently at. It may be wrong but it\n    //  may only be wrong by being higher than the current highest priority job, not\n    //  lower as that would cause the system to pump things out of order.\n    //\n    var highWaterMark = Priority.min;\n\n    //\n    // Initialize the scheduler\n    //\n\n    // Wire up the markers\n    //\n    priorities.reduce(function (prev, current) {\n        if (prev) {\n            prev._insertJobAfter(current);\n            prev._insertMarkerAfter(current);\n        }\n        return current;\n    });\n\n    //\n    // Draining mechanism\n    //\n    // For each active drain request, there is a unique drain listener in the\n    //  drainQueue. Requests are processed in FIFO order. The scheduler is in\n    //  drain mode precisely when the drainQueue is non-empty.\n    //\n\n    // Returns priority of the current drain request\n    //\n    function currentDrainPriority() {\n        return drainQueue.length === 0 ? null : drainQueue[0].priority;\n    }\n\n    function drainStarting(listener) {\n        schedulerProfilerMark(\"drain\", \"StartTM\", listener.name, markerFromPriority(listener.priority).name);\n    }\n    function drainStopping(listener, canceled) {\n        if (canceled) {\n            schedulerProfilerMark(\"drain-canceled\", \"info\", listener.name, markerFromPriority(listener.priority).name);\n        }\n        schedulerProfilerMark(\"drain\", \"StopTM\", listener.name, markerFromPriority(listener.priority).name);\n    }\n\n    function addDrainListener(priority, complete, name) {\n        drainQueue.push({ priority: priority, complete: complete, name: name });\n        if (drainQueue.length === 1) {\n            drainStarting(drainQueue[0]);\n            if (priority > highWaterMark) {\n                highWaterMark = priority;\n                immediateYield = true;\n            }\n        }\n    }\n\n    function removeDrainListener(complete, canceled) {\n        var i,\n            len = drainQueue.length;\n\n        for (i = 0; i < len; i++) {\n            if (drainQueue[i].complete === complete) {\n                if (i === 0) {\n                    drainStopping(drainQueue[0], canceled);\n                    drainQueue[1] && drainStarting(drainQueue[1]);\n                }\n                drainQueue.splice(i, 1);\n                break;\n            }\n        }\n    }\n\n    // Notifies and removes the current drain listener\n    //\n    function notifyCurrentDrainListener() {\n        var listener = drainQueue.shift();\n\n        if (listener) {\n            drainStopping(listener);\n            drainQueue[0] && drainStarting(drainQueue[0]);\n            listener.complete();\n        }\n    }\n\n    // Notifies all drain listeners which are at a priority > highWaterMark.\n    //  Returns whether or not any drain listeners were notified. This\n    //  function sets pumpingPriority and reads highWaterMark. Note that\n    //  it may call into user code which may call back into the scheduler.\n    //\n    function notifyDrainListeners() {\n        var notifiedSomebody = false;\n        if (!!drainQueue.length) {\n            // As we exhaust priority levels, notify the appropriate drain listeners.\n            //\n            var drainPriority = currentDrainPriority();\n            while (+drainPriority === drainPriority && drainPriority > highWaterMark) {\n                pumpingPriority = drainPriority;\n                notifyCurrentDrainListener();\n                notifiedSomebody = true;\n                drainPriority = currentDrainPriority();\n            }\n        }\n        return notifiedSomebody;\n    }\n\n    //\n    // Interfacing with the WWA Scheduler\n    //\n\n    // The purpose of yielding to the host is to give the host the opportunity to do some work.\n    // setImmediate has this guarantee built-in so we prefer that. Otherwise, we do setTimeout 16\n    // which should give the host a decent amount of time to do work.\n    //\n    var scheduleWithHost = _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (callback) {\n        _Global.setTimeout(callback, 16);\n    };\n\n    // Stubs for the parts of the WWA scheduler APIs that we use. These stubs are\n    //  used in contexts where the WWA scheduler is not available.\n    //\n    var MSAppStubs = {\n        execAsyncAtPriority: function (callback, priority) {\n            // If it's a high priority callback then we additionally schedule using setTimeout(0)\n            //\n            if (priority === MSApp.HIGH) {\n                _Global.setTimeout(callback, 0);\n            }\n            // We always schedule using setImmediate\n            //\n            scheduleWithHost(callback);\n        },\n\n        execAtPriority: function (callback) {\n            return callback();\n        },\n\n        getCurrentPriority: function () {\n            return MSAppStubs.NORMAL;\n        },\n\n        isTaskScheduledAtPriorityOrHigher: function () {\n            return false;\n        },\n\n        HIGH: \"high\",\n        NORMAL: \"normal\",\n        IDLE: \"idle\"\n    };\n\n    var MSApp = (usingWwaScheduler ? _Global.MSApp : MSAppStubs);\n\n    function toWwaPriority(winjsPriority) {\n        if (winjsPriority >= Priority.aboveNormal + 1) { return MSApp.HIGH; }\n        if (winjsPriority >= Priority.belowNormal) { return MSApp.NORMAL; }\n        return MSApp.IDLE;\n    }\n\n    var wwaPriorityToInt = {};\n    wwaPriorityToInt[MSApp.IDLE] = 1;\n    wwaPriorityToInt[MSApp.NORMAL] = 2;\n    wwaPriorityToInt[MSApp.HIGH] = 3;\n\n    function isEqualOrHigherWwaPriority(priority1, priority2) {\n        return wwaPriorityToInt[priority1] >= wwaPriorityToInt[priority2];\n    }\n\n    function isHigherWwaPriority(priority1, priority2) {\n        return wwaPriorityToInt[priority1] > wwaPriorityToInt[priority2];\n    }\n\n    function wwaTaskScheduledAtPriorityHigherThan(wwaPriority) {\n        switch (wwaPriority) {\n            case MSApp.HIGH:\n                return false;\n            case MSApp.NORMAL:\n                return MSApp.isTaskScheduledAtPriorityOrHigher(MSApp.HIGH);\n            case MSApp.IDLE:\n                return MSApp.isTaskScheduledAtPriorityOrHigher(MSApp.NORMAL);\n        }\n    }\n\n    //\n    // Mechanism for the scheduler\n    //\n\n    function addJobAtHeadOfPriority(node, priority) {\n        var marker = markerFromPriority(priority);\n        if (marker.priority > highWaterMark) {\n            highWaterMark = marker.priority;\n            immediateYield = true;\n        }\n        marker._insertJobAfter(node);\n    }\n\n    function addJobAtTailOfPriority(node, priority) {\n        var marker = markerFromPriority(priority);\n        if (marker.priority > highWaterMark) {\n            highWaterMark = marker.priority;\n            immediateYield = true;\n        }\n        marker._nextMarker._insertJobBefore(node);\n    }\n\n    function clampPriority(priority) {\n        priority = priority | 0;\n        priority = Math.max(priority, MIN_PRIORITY);\n        priority = Math.min(priority, MAX_PRIORITY);\n        return priority;\n    }\n\n    function markerFromPriority(priority) {\n        priority = clampPriority(priority);\n\n        // The priority skip list is from high -> idle, add the offset and then make it positive.\n        //\n        return priorities[-1 * (priority - MAX_PRIORITY)];\n    }\n\n    // Performance.now is not defined in web workers.\n    //\n    var now = (_Global.performance && _Global.performance.now && _Global.performance.now.bind(_Global.performance)) || Date.now.bind(Date);\n\n    // Main scheduler pump.\n    //\n    function run(scheduled) {\n        pumping = true;\n        schedulerProfilerMark(\"timeslice\", \"StartTM\");\n        var didWork;\n        var ranJobSuccessfully = true;\n        var current;\n        var lastLoggedPriority;\n        var timesliceExhausted = false;\n        var yieldForPriorityBoundary = false;\n\n        // Reset per-run state\n        //\n        immediateYield = false;\n\n        try {\n            var start = now();\n            var end = start + TIME_SLICE;\n\n            // Yielding policy\n            //\n            // @TODO, should we have a different scheduler policy when the debugger is attached. Today if you\n            //  break in user code we will generally yield immediately after that job due to the fact that any\n            //  breakpoint will take longer than TIME_SLICE to process.\n            //\n\n            var shouldYield = function () {\n                timesliceExhausted = false;\n                if (immediateYield) { return true; }\n                if (wwaTaskScheduledAtPriorityHigherThan(toWwaPriority(highWaterMark))) { return true; }\n                if (!!drainQueue.length) { return false; }\n                if (now() > end) {\n                    timesliceExhausted = true;\n                    return true;\n                }\n                return false;\n            };\n\n            // Run until we run out of jobs or decide it is time to yield\n            //\n            while (highWaterMark >= Priority.min && !shouldYield() && !yieldForPriorityBoundary) {\n\n                didWork = false;\n                current = markerFromPriority(highWaterMark)._nextJob;\n                do {\n                    // Record the priority currently being pumped\n                    //\n                    pumpingPriority = current.priority;\n\n                    if (current instanceof JobNode) {\n                        if (lastLoggedPriority !== current.priority) {\n                            if (+lastLoggedPriority === lastLoggedPriority) {\n                                schedulerProfilerMark(\"priority\", \"StopTM\", markerFromPriority(lastLoggedPriority).name);\n                            }\n                            schedulerProfilerMark(\"priority\", \"StartTM\", markerFromPriority(current.priority).name);\n                            lastLoggedPriority = current.priority;\n                        }\n\n                        // Important that we update this state before calling execute because the\n                        //  job may throw an exception and we don't want to stall the queue.\n                        //\n                        didWork = true;\n                        ranJobSuccessfully = false;\n                        runningJob = current;\n                        jobProfilerMark(runningJob, \"job-running\", \"StartTM\", markerFromPriority(pumpingPriority).name);\n                        current._execute(shouldYield);\n                        jobProfilerMark(runningJob, \"job-running\", \"StopTM\", markerFromPriority(pumpingPriority).name);\n                        runningJob = null;\n                        ranJobSuccessfully = true;\n                    } else {\n                        // As we pass marker nodes update our high water mark. It's important to do\n                        //  this before notifying drain listeners because they may schedule new jobs\n                        //  which will affect the highWaterMark.\n                        //\n                        var wwaPrevHighWaterMark = toWwaPriority(highWaterMark);\n                        highWaterMark = current.priority;\n\n                        didWork = notifyDrainListeners();\n\n                        var wwaHighWaterMark = toWwaPriority(highWaterMark);\n                        if (isHigherWwaPriority(wwaPrevHighWaterMark, wwaHighWaterMark) &&\n                                (!usingWwaScheduler || MSApp.isTaskScheduledAtPriorityOrHigher(wwaHighWaterMark))) {\n                            // Timeslice is moving to a lower WWA priority and the host\n                            //  has equally or more important work to do. Time to yield.\n                            //\n                            yieldForPriorityBoundary = true;\n                        }\n                    }\n\n                    current = current._nextJob;\n\n                    // When didWork is true we exit the loop because:\n                    //  - We've called into user code which may have modified the\n                    //    scheduler's queue. We need to restart at the high water mark.\n                    //  - We need to check if it's time for the scheduler to yield.\n                    //\n                } while (current && !didWork && !yieldForPriorityBoundary && !wwaTaskScheduledAtPriorityHigherThan(toWwaPriority(highWaterMark)));\n\n                // Reset per-item state\n                //\n                immediateYield = false;\n\n            }\n\n        } finally {\n            runningJob = null;\n\n            // If a job was started and did not run to completion due to an exception\n            //  we should transition it to a terminal state.\n            //\n            if (!ranJobSuccessfully) {\n                jobProfilerMark(current, \"job-error\", \"info\");\n                jobProfilerMark(current, \"job-running\", \"StopTM\", markerFromPriority(pumpingPriority).name);\n                current.cancel();\n            }\n\n            if (+lastLoggedPriority === lastLoggedPriority) {\n                schedulerProfilerMark(\"priority\", \"StopTM\", markerFromPriority(lastLoggedPriority).name);\n            }\n            // Update high water mark to be the priority of the highest priority job.\n            //\n            var foundAJob = false;\n            while (highWaterMark >= Priority.min && !foundAJob) {\n\n                didWork = false;\n                current = markerFromPriority(highWaterMark)._nextJob;\n                do {\n\n                    if (current instanceof JobNode) {\n                        // We found a job. High water mark is now set to the priority\n                        //  of this job.\n                        //\n                        foundAJob = true;\n                    } else {\n                        // As we pass marker nodes update our high water mark. It's important to do\n                        //  this before notifying drain listeners because they may schedule new jobs\n                        //  which will affect the highWaterMark.\n                        //\n                        highWaterMark = current.priority;\n\n                        didWork = notifyDrainListeners();\n                    }\n\n                    current = current._nextJob;\n\n                    // When didWork is true we exit the loop because:\n                    //  - We've called into user code which may have modified the\n                    //    scheduler's queue. We need to restart at the high water mark.\n                    //\n                } while (current && !didWork && !foundAJob);\n            }\n\n            var reasonForYielding;\n            if (!ranJobSuccessfully) {\n                reasonForYielding = \"job error\";\n            } else if (timesliceExhausted) {\n                reasonForYielding = \"timeslice exhausted\";\n            } else if (highWaterMark < Priority.min) {\n                reasonForYielding = \"jobs exhausted\";\n            } else if (yieldForPriorityBoundary) {\n                reasonForYielding = \"reached WWA priority boundary\";\n            } else {\n                reasonForYielding = \"WWA host work\";\n            }\n\n            // If this was a scheduled call to the pump, then the pump is no longer\n            //  scheduled to be called and we should clear its scheduled priority.\n            //\n            if (scheduled) {\n                scheduledWwaPriority = null;\n            }\n\n            // If the high water mark has not reached the end of the queue then\n            //  we re-queue in order to see if there are more jobs to run.\n            //\n            pumping = false;\n            if (highWaterMark >= Priority.min) {\n                startRunning();\n            }\n            schedulerProfilerMark(\"yielding\", \"info\", reasonForYielding);\n            schedulerProfilerMark(\"timeslice\", \"StopTM\");\n        }\n    }\n\n    // When we schedule the pump we assign it a version. When we start executing one we check\n    //  to see what the max executed version is. If we have superseded it then we skip the call.\n    //\n    var scheduledVersion = 0;\n    var executedVersion = 0;\n\n    function startRunning(priority) {\n        if (+priority !== priority) {\n            priority = highWaterMark;\n        }\n        var priorityWwa = toWwaPriority(priority);\n\n        // Don't schedule the pump while pumping. The pump will be scheduled\n        //  immediately before yielding if necessary.\n        //\n        if (pumping) {\n            return;\n        }\n\n        // If the pump is already scheduled at priority or higher, then there\n        //  is no need to schedule the pump again.\n        // However, when we're not using the WWA scheduler, we fallback to immediate/timeout\n        //  which do not have a notion of priority. In this case, if the pump is scheduled,\n        //  there is no need to schedule another pump.\n        //\n        if (scheduledWwaPriority && (!usingWwaScheduler || isEqualOrHigherWwaPriority(scheduledWwaPriority, priorityWwa))) {\n            return;\n        }\n        var current = ++scheduledVersion;\n        var runner = function () {\n            if (executedVersion < current) {\n                executedVersion = scheduledVersion;\n                run(true);\n            }\n        };\n\n        MSApp.execAsyncAtPriority(runner, priorityWwa);\n        scheduledWwaPriority = priorityWwa;\n    }\n\n    function requestDrain(priority, name) {\n        /// <signature helpKeyword=\"WinJS.Utilities.Scheduler.requestDrain\">\n        /// <summary locid=\"WinJS.Utilities.Scheduler.requestDrain\">\n        /// Runs jobs in the scheduler without timeslicing until all jobs at the\n        /// specified priority and higher have executed.\n        /// </summary>\n        /// <param name=\"priority\" isOptional=\"true\" type=\"WinJS.Utilities.Scheduler.Priority\" locid=\"WinJS.Utilities.Scheduler.requestDrain_p:priority\">\n        /// The priority to which the scheduler should drain. The default is Priority.min, which drains all jobs in the queue.\n        /// </param>\n        /// <param name=\"name\" isOptional=\"true\" type=\"String\" locid=\"WinJS.Utilities.Scheduler.requestDrain_p:name\">\n        /// An optional description of the drain request for diagnostics.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Utilities.Scheduler.requestDrain_returnValue\">\n        /// A promise which completes when the drain has finished. Canceling this\n        /// promise cancels the drain request. This promise will never enter an error state.\n        /// </returns>\n        /// </signature>\n\n        var id = globalDrainId++;\n        if (name === undefined) {\n            name = \"Drain Request \" + id;\n        }\n        priority = (+priority === priority) ? priority : Priority.min;\n        priority = clampPriority(priority);\n\n        var complete;\n        var promise = new Promise(function (c) {\n            complete = c;\n            addDrainListener(priority, complete, name);\n        }, function () {\n            removeDrainListener(complete, true);\n        });\n\n        if (!pumping) {\n            startRunning();\n        }\n\n        return promise;\n    }\n\n    function execHigh(callback) {\n        /// <signature helpKeyword=\"WinJS.Utilities.Scheduler.execHigh\">\n        /// <summary locid=\"WinJS.Utilities.Scheduler.execHigh\">\n        /// Runs the specified callback in a high priority context.\n        /// </summary>\n        /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Utilities.Scheduler.execHigh_p:callback\">\n        /// The callback to run in a high priority context.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Utilities.Scheduler.execHigh_returnValue\">\n        /// The return value of the callback.\n        /// </returns>\n        /// </signature>\n\n        return MSApp.execAtPriority(callback, MSApp.HIGH);\n    }\n\n    function createOwnerToken() {\n        /// <signature helpKeyword=\"WinJS.Utilities.Scheduler.createOwnerToken\">\n        /// <summary locid=\"WinJS.Utilities.Scheduler.createOwnerToken\">\n        /// Creates and returns a new owner token which can be set to the owner property of one or more jobs.\n        /// It can then be used to cancel all jobs it \"owns\".\n        /// </summary>\n        /// <returns type=\"WinJS.Utilities.Scheduler._OwnerToken\" locid=\"WinJS.Utilities.Scheduler.createOwnerToken_returnValue\">\n        /// The new owner token. You can use this token to control jobs that it owns.\n        /// </returns>\n        /// </signature>\n\n        return new OwnerToken();\n    }\n\n    function schedule(work, priority, thisArg, name) {\n        /// <signature helpKeyword=\"WinJS.Utilities.Scheduler.schedule\">\n        /// <summary locid=\"WinJS.Utilities.Scheduler.schedule\">\n        /// Schedules the specified function to execute asynchronously.\n        /// </summary>\n        /// <param name=\"work\" type=\"Function\" locid=\"WinJS.Utilities.Scheduler.schedule_p:work\">\n        /// A function that represents the work item to be scheduled. When called the work item will receive as its first argument\n        /// a JobInfo object which allows the work item to ask the scheduler if it should yield cooperatively and if so allows the\n        /// work item to either provide a function to be run as a continuation or a WinJS.Promise which will when complete\n        /// provide a function to run as a continuation.\n        /// </param>\n        /// <param name=\"priority\" isOptional=\"true\" type=\"WinJS.Utilities.Scheduler.Priority\" locid=\"WinJS.Utilities.Scheduler.schedule_p:priority\">\n        /// The priority at which to schedule the work item. The default value is Priority.normal.\n        /// </param>\n        /// <param name=\"thisArg\" isOptional=\"true\" type=\"Object\" locid=\"WinJS.Utilities.Scheduler.schedule_p:thisArg\">\n        /// A 'this' instance to be bound into the work item. The default value is null.\n        /// </param>\n        /// <param name=\"name\" isOptional=\"true\" type=\"String\" locid=\"WinJS.Utilities.Scheduler.schedule_p:name\">\n        /// A description of the work item for diagnostics. The default value is an empty string.\n        /// </param>\n        /// <returns type=\"WinJS.Utilities.Scheduler._JobNode\" locid=\"WinJS.Utilities.Scheduler.schedule_returnValue\">\n        /// The Job instance which represents this work item.\n        /// </returns>\n        /// </signature>\n\n        priority = priority || Priority.normal;\n        thisArg = thisArg || null;\n        var jobId = ++globalJobId;\n        var asyncOpID = _Trace._traceAsyncOperationStarting(\"WinJS.Utilities.Scheduler.schedule: \" + jobId + profilerMarkArgs(name));\n        name = name || \"\";\n        return new JobNode(jobId, work, priority, thisArg, name, asyncOpID);\n    }\n\n    function getCurrentPriority() {\n        if (pumping) {\n            return pumpingPriority;\n        } else {\n            switch (MSApp.getCurrentPriority()) {\n                case MSApp.HIGH: return Priority.high;\n                case MSApp.NORMAL: return Priority.normal;\n                case MSApp.IDLE: return Priority.idle;\n            }\n        }\n    }\n\n    function makeSchedulePromise(priority) {\n        return function (promiseValue, jobName) {\n            /// <signature helpKeyword=\"WinJS.Utilities.Scheduler.schedulePromise\">\n            /// <summary locid=\"WinJS.Utilities.Scheduler.schedulePromise\">\n            /// Schedules a job to complete a returned Promise.\n            /// There are four versions of this method for different commonly used priorities: schedulePromiseHigh,\n            /// schedulePromiseAboveNormal, schedulePromiseNormal, schedulePromiseBelowNormal,\n            /// and schedulePromiseIdle.\n            /// Example usage which shows how to\n            /// ensure that the last link in a promise chain is run on the scheduler at high priority:\n            /// asyncOp().then(Scheduler.schedulePromiseHigh).then(function (valueOfAsyncOp) { });\n            /// </summary>\n            /// <param name=\"promiseValue\" isOptional=\"true\" type=\"Object\" locid=\"WinJS.Utilities.Scheduler.schedulePromise_p:promiseValue\">\n            /// The value with which the returned promise will complete.\n            /// </param>\n            /// <param name=\"jobName\" isOptional=\"true\" type=\"String\" locid=\"WinJS.Utilities.Scheduler.schedulePromise_p:jobName\">\n            /// A string that describes the job for diagnostic purposes.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Utilities.Scheduler.schedulePromise_returnValue\">\n            /// A promise which completes within a job of the desired priority.\n            /// </returns>\n            /// </signature>\n            var job;\n            return new Promise(\n                function (c) {\n                    job = schedule(function schedulePromise() {\n                        c(promiseValue);\n                    }, priority, null, jobName);\n                },\n                function () {\n                    job.cancel();\n                }\n            );\n        };\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities.Scheduler\", {\n\n        Priority: Priority,\n\n        schedule: schedule,\n\n        createOwnerToken: createOwnerToken,\n\n        execHigh: execHigh,\n\n        requestDrain: requestDrain,\n\n        /// <field type=\"WinJS.Utilities.Scheduler.Priority\" locid=\"WinJS.Utilities.Scheduler.currentPriority\" helpKeyword=\"WinJS.Utilities.Scheduler.currentPriority\">\n        /// Gets the current priority at which the caller is executing.\n        /// </field>\n        currentPriority: {\n            get: getCurrentPriority\n        },\n\n        // Promise helpers\n        //\n        schedulePromiseHigh: makeSchedulePromise(Priority.high),\n        schedulePromiseAboveNormal: makeSchedulePromise(Priority.aboveNormal),\n        schedulePromiseNormal: makeSchedulePromise(Priority.normal),\n        schedulePromiseBelowNormal: makeSchedulePromise(Priority.belowNormal),\n        schedulePromiseIdle: makeSchedulePromise(Priority.idle),\n\n        retrieveState: retrieveState,\n\n        _JobNode: JobNode,\n\n        _JobInfo: JobInfo,\n\n        _OwnerToken: OwnerToken,\n\n        _dumpList: dumpList,\n\n        _isEmpty: {\n            get: isEmpty\n        },\n\n        // The properties below are used for testing.\n        //\n\n        _usingWwaScheduler: {\n            get: function () {\n                return usingWwaScheduler;\n            },\n            set: function (value) {\n                usingWwaScheduler = value;\n                MSApp = (usingWwaScheduler ? _Global.MSApp : MSAppStubs);\n            }\n        },\n\n        _MSApp: {\n            get: function () {\n                return MSApp;\n            },\n            set: function (value) {\n                MSApp = value;\n            }\n        },\n\n        _TIME_SLICE: TIME_SLICE\n\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Core/_BaseUtils',[\n    'exports',\n    './_Global',\n    './_Base',\n    './_BaseCoreUtils',\n    './_ErrorFromName',\n    './_Resources',\n    './_Trace',\n    '../Promise',\n    '../Scheduler'\n    ], function baseUtilsInit(exports, _Global, _Base, _BaseCoreUtils, _ErrorFromName, _Resources, _Trace, Promise, Scheduler) {\n    \"use strict\";\n\n    var strings = {\n        get notSupportedForProcessing() { return \"Value is not supported within a declarative processing context, if you want it to be supported mark it using WinJS.Utilities.markSupportedForProcessing. The value was: '{0}'\"; }\n    };\n\n    var requestAnimationWorker;\n    var requestAnimationId = 0;\n    var requestAnimationHandlers = {};\n    var validation = false;\n    var platform = _Global.navigator.platform;\n    var isiOS = platform === \"iPhone\" || platform === \"iPad\" || platform === \"iPod\";\n\n    function nop(v) {\n        return v;\n    }\n\n    function getMemberFiltered(name, root, filter) {\n        return name.split(\".\").reduce(function (currentNamespace, name) {\n            if (currentNamespace) {\n                return filter(currentNamespace[name]);\n            }\n            return null;\n        }, root);\n    }\n\n    function getMember(name, root) {\n        /// <signature helpKeyword=\"WinJS.Utilities.getMember\">\n        /// <summary locid=\"WinJS.Utilities.getMember\">\n        /// Gets the leaf-level type or namespace specified by the name parameter.\n        /// </summary>\n        /// <param name=\"name\" locid=\"WinJS.Utilities.getMember_p:name\">\n        /// The name of the member.\n        /// </param>\n        /// <param name=\"root\" locid=\"WinJS.Utilities.getMember_p:root\">\n        /// The root to start in. Defaults to the global object.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Utilities.getMember_returnValue\">\n        /// The leaf-level type or namespace in the specified parent namespace.\n        /// </returns>\n        /// </signature>\n        if (!name) {\n            return null;\n        }\n        return getMemberFiltered(name, root || _Global, nop);\n    }\n\n    function getCamelCasedName(styleName) {\n        // special case -moz prefixed styles because their JS property name starts with Moz\n        if (styleName.length > 0 && styleName.indexOf(\"-moz\") !== 0 && styleName.charAt(0) === \"-\") {\n            styleName = styleName.slice(1);\n        }\n        return styleName.replace(/\\-[a-z]/g, function (x) { return x[1].toUpperCase(); });\n    }\n\n    function addPrefixToCamelCasedName(prefix, name) {\n        if (prefix === \"\") {\n            return name;\n        }\n\n        return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n    }\n\n    function addPrefixToCSSName(prefix, name) {\n        return (prefix !== \"\" ? \"-\" + prefix.toLowerCase() + \"-\" : \"\") + name;\n    }\n\n    function getBrowserStyleEquivalents() {\n        // not supported in WebWorker\n        if (!_Global.document) {\n            return {};\n        }\n\n        var equivalents = {},\n            docStyle = _Global.document.documentElement.style,\n            stylePrefixesToTest = [\"\", \"webkit\", \"ms\", \"Moz\"],\n            styles = [\"animation\",\n                \"transition\",\n                \"transform\",\n                \"animation-name\",\n                \"animation-duration\",\n                \"animation-delay\",\n                \"animation-timing-function\",\n                \"animation-iteration-count\",\n                \"animation-direction\",\n                \"animation-fill-mode\",\n                \"grid-column\",\n                \"grid-columns\",\n                \"grid-column-span\",\n                \"grid-row\",\n                \"grid-rows\",\n                \"grid-row-span\",\n                \"transform-origin\",\n                \"transition-property\",\n                \"transition-duration\",\n                \"transition-delay\",\n                \"transition-timing-function\",\n                \"scroll-snap-points-x\",\n                \"scroll-snap-points-y\",\n                \"scroll-chaining\",\n                \"scroll-limit\",\n                \"scroll-limit-x-max\",\n                \"scroll-limit-x-min\",\n                \"scroll-limit-y-max\",\n                \"scroll-limit-y-min\",\n                \"scroll-snap-type\",\n                \"scroll-snap-x\",\n                \"scroll-snap-y\",\n                \"touch-action\",\n                \"overflow-style\",\n                \"user-select\" // used for Template Compiler test\n            ],\n            prefixesUsedOnStyles = {};\n\n        for (var i = 0, len = styles.length; i < len; i++) {\n            var originalName = styles[i],\n                styleToTest = getCamelCasedName(originalName);\n            for (var j = 0, prefixLen = stylePrefixesToTest.length; j < prefixLen; j++) {\n                var prefix = stylePrefixesToTest[j];\n                var styleName = addPrefixToCamelCasedName(prefix, styleToTest);\n                if (styleName in docStyle) {\n                    // Firefox doesn't support dashed style names being get/set via script. (eg, something like element.style[\"transform-origin\"] = \"\" wouldn't work).\n                    // For each style translation we create, we'll make a CSS name version and a script name version for it so each can be used where appropriate.\n                    var cssName = addPrefixToCSSName(prefix, originalName);\n                    equivalents[originalName] = {\n                        cssName: cssName,\n                        scriptName: styleName\n                    };\n                    prefixesUsedOnStyles[originalName] = prefix;\n                    break;\n                }\n            }\n        }\n\n        // Special cases:\n        equivalents.animationPrefix = addPrefixToCSSName(prefixesUsedOnStyles[\"animation\"], \"\");\n        equivalents.keyframes = addPrefixToCSSName(prefixesUsedOnStyles[\"animation\"], \"keyframes\");\n\n        return equivalents;\n    }\n\n    function getBrowserEventEquivalents() {\n        var equivalents = {};\n        var animationEventPrefixes = [\"\", \"WebKit\"],\n            animationEvents = [\n                {\n                    eventObject: \"TransitionEvent\",\n                    events: [\"transitionStart\", \"transitionEnd\"]\n                },\n                {\n                    eventObject: \"AnimationEvent\",\n                    events: [\"animationStart\", \"animationEnd\"]\n                }\n            ];\n\n        for (var i = 0, len = animationEvents.length; i < len; i++) {\n            var eventToTest = animationEvents[i],\n                chosenPrefix = \"\";\n            for (var j = 0, prefixLen = animationEventPrefixes.length; j < prefixLen; j++) {\n                var prefix = animationEventPrefixes[j];\n                if ((prefix + eventToTest.eventObject) in _Global) {\n                    chosenPrefix = prefix.toLowerCase();\n                    break;\n                }\n            }\n            for (var j = 0, eventsLen = eventToTest.events.length; j < eventsLen; j++) {\n                var eventName = eventToTest.events[j];\n                equivalents[eventName] = addPrefixToCamelCasedName(chosenPrefix, eventName);\n                if (chosenPrefix === \"\") {\n                    // Transition and animation events are case sensitive. When there's no prefix, the event name should be in lowercase.\n                    // In IE, Chrome and Firefox, an event handler listening to transitionend will be triggered properly, but transitionEnd will not.\n                    // When a prefix is provided, though, the event name needs to be case sensitive.\n                    // IE and Firefox will trigger an animationend event handler correctly, but Chrome won't trigger webkitanimationend -- it has to be webkitAnimationEnd.\n                    equivalents[eventName] = equivalents[eventName].toLowerCase();\n                }\n            }\n        }\n\n        // Non-standardized events\n        equivalents[\"manipulationStateChanged\"] = (\"MSManipulationEvent\" in _Global ? \"ManipulationEvent\" : null);\n        return equivalents;\n    }\n\n    // Returns a function which, when called, will call *fn*. However,\n    // if called multiple times, it will only call *fn* at most once every\n    // *delay* milliseconds. Multiple calls during the throttling period\n    // will be coalesced into a single call to *fn* with the arguments being\n    // the ones from the last call received during the throttling period.\n    // Note that, due to the throttling period, *fn* may be invoked asynchronously\n    // relative to the time it was called so make sure its arguments are still valid\n    // (for example, eventObjects will not be valid).\n    //\n    // Example usage. If you want your key down handler to run once every 100 ms,\n    // you could do this:\n    //   var onKeyDown = throttledFunction(function (keyCode) {\n    //     // do something with keyCode\n    //   });\n    //   element.addEventListener(\"keydown\", function (eventObject) { onKeyDown(eventObject.keyCode); });\n    //\n    function throttledFunction(delay, fn) {\n        var throttlePromise = null;\n        var pendingCallPromise = null;\n        var nextContext = null;\n        var nextArgs = null;\n\n        function makeThrottlePromise() {\n            return Promise.timeout(delay).then(function () {\n                throttlePromise = null;\n            });\n        }\n\n        return function () {\n            if (pendingCallPromise) {\n                nextContext = this;\n                nextArgs = [].slice.call(arguments, 0);\n            } else if (throttlePromise) {\n                nextContext = this;\n                nextArgs = [].slice.call(arguments, 0);\n                pendingCallPromise = throttlePromise.then(function () {\n                    var context = nextContext;\n                    nextContext = null;\n                    var args = nextArgs;\n                    nextArgs = null;\n                    throttlePromise = makeThrottlePromise();\n                    pendingCallPromise = null;\n                    fn.apply(context, args);\n                });\n            } else {\n                throttlePromise = makeThrottlePromise();\n                fn.apply(this, arguments);\n            }\n        };\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        // Used for mocking in tests\n        _setHasWinRT: {\n            value: function (value) {\n                _BaseCoreUtils.hasWinRT = value;\n            },\n            configurable: false,\n            writable: false,\n            enumerable: false\n        },\n\n        /// <field type=\"Boolean\" locid=\"WinJS.Utilities.hasWinRT\" helpKeyword=\"WinJS.Utilities.hasWinRT\">Determine if WinRT is accessible in this script context.</field>\n        hasWinRT: {\n            get: function () { return _BaseCoreUtils.hasWinRT; },\n            configurable: false,\n            enumerable: true\n        },\n\n        // Used for mocking in tests\n        _setIsiOS: {\n            value: function (value) {\n                isiOS = value;\n            },\n            configurable: false,\n            writable: false,\n            enumerable: false\n        },\n\n        _isiOS: {\n            get: function () { return isiOS; },\n            configurable: false,\n            enumerable: true\n        },\n\n        _getMemberFiltered: getMemberFiltered,\n\n        getMember: getMember,\n\n        _browserStyleEquivalents: getBrowserStyleEquivalents(),\n        _browserEventEquivalents: getBrowserEventEquivalents(),\n        _getCamelCasedName: getCamelCasedName,\n\n        ready: function ready(callback, async) {\n            /// <signature helpKeyword=\"WinJS.Utilities.ready\">\n            /// <summary locid=\"WinJS.Utilities.ready\">\n            /// Ensures that the specified function executes only after the DOMContentLoaded event has fired\n            /// for the current page.\n            /// </summary>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Utilities.ready_returnValue\">A promise that completes after DOMContentLoaded has occurred.</returns>\n            /// <param name=\"callback\" optional=\"true\" locid=\"WinJS.Utilities.ready_p:callback\">\n            /// A function that executes after DOMContentLoaded has occurred.\n            /// </param>\n            /// <param name=\"async\" optional=\"true\" locid=\"WinJS.Utilities.ready_p:async\">\n            /// If true, the callback is executed asynchronously.\n            /// </param>\n            /// </signature>\n            return new Promise(function (c, e) {\n                function complete() {\n                    if (callback) {\n                        try {\n                            callback();\n                            c();\n                        }\n                        catch (err) {\n                            e(err);\n                        }\n                    } else {\n                        c();\n                    }\n                }\n\n                var readyState = ready._testReadyState;\n                if (!readyState) {\n                    if (_Global.document) {\n                        readyState = _Global.document.readyState;\n                    } else {\n                        readyState = \"complete\";\n                    }\n                }\n                if (readyState === \"complete\" || (_Global.document && _Global.document.body !== null)) {\n                    if (async) {\n                        Scheduler.schedule(function WinJS_Utilities_ready() {\n                            complete();\n                        }, Scheduler.Priority.normal, null, \"WinJS.Utilities.ready\");\n                    } else {\n                        complete();\n                    }\n                } else {\n                    _Global.addEventListener(\"DOMContentLoaded\", complete, false);\n                }\n            });\n        },\n\n        /// <field type=\"Boolean\" locid=\"WinJS.Utilities.strictProcessing\" helpKeyword=\"WinJS.Utilities.strictProcessing\">Determines if strict declarative processing is enabled in this script context.</field>\n        strictProcessing: {\n            get: function () { return true; },\n            configurable: false,\n            enumerable: true,\n        },\n\n        markSupportedForProcessing: {\n            value: _BaseCoreUtils.markSupportedForProcessing,\n            configurable: false,\n            writable: false,\n            enumerable: true\n        },\n\n        requireSupportedForProcessing: {\n            value: function (value) {\n                /// <signature helpKeyword=\"WinJS.Utilities.requireSupportedForProcessing\">\n                /// <summary locid=\"WinJS.Utilities.requireSupportedForProcessing\">\n                /// Asserts that the value is compatible with declarative processing, such as WinJS.UI.processAll\n                /// or WinJS.Binding.processAll. If it is not compatible an exception will be thrown.\n                /// </summary>\n                /// <param name=\"value\" type=\"Object\" locid=\"WinJS.Utilities.requireSupportedForProcessing_p:value\">\n                /// The value to be tested for compatibility with declarative processing. If the\n                /// value is a function it must be marked with a property 'supportedForProcessing'\n                /// with a value of true.\n                /// </param>\n                /// <returns type=\"Object\" locid=\"WinJS.Utilities.requireSupportedForProcessing_returnValue\">\n                /// The input value.\n                /// </returns>\n                /// </signature>\n                var supportedForProcessing = true;\n\n                supportedForProcessing = supportedForProcessing && value !== _Global;\n                supportedForProcessing = supportedForProcessing && value !== _Global.location;\n                supportedForProcessing = supportedForProcessing && !(value instanceof _Global.HTMLIFrameElement);\n                supportedForProcessing = supportedForProcessing && !(typeof value === \"function\" && !value.supportedForProcessing);\n\n                switch (_Global.frames.length) {\n                    case 0:\n                        break;\n\n                    case 1:\n                        supportedForProcessing = supportedForProcessing && value !== _Global.frames[0];\n                        break;\n\n                    default:\n                        for (var i = 0, len = _Global.frames.length; supportedForProcessing && i < len; i++) {\n                            supportedForProcessing = supportedForProcessing && value !== _Global.frames[i];\n                        }\n                        break;\n                }\n\n                if (supportedForProcessing) {\n                    return value;\n                }\n\n                throw new _ErrorFromName(\"WinJS.Utilities.requireSupportedForProcessing\", _Resources._formatString(strings.notSupportedForProcessing, value));\n            },\n            configurable: false,\n            writable: false,\n            enumerable: true\n        },\n\n        _setImmediate: _BaseCoreUtils._setImmediate,\n\n        _requestAnimationFrame: _Global.requestAnimationFrame ? _Global.requestAnimationFrame.bind(_Global) : function (handler) {\n            var handle = ++requestAnimationId;\n            requestAnimationHandlers[handle] = handler;\n            requestAnimationWorker = requestAnimationWorker || _Global.setTimeout(function () {\n                var toProcess = requestAnimationHandlers;\n                var now = Date.now();\n                requestAnimationHandlers = {};\n                requestAnimationWorker = null;\n                Object.keys(toProcess).forEach(function (key) {\n                    toProcess[key](now);\n                });\n            }, 16);\n            return handle;\n        },\n\n        _cancelAnimationFrame: _Global.cancelAnimationFrame ? _Global.cancelAnimationFrame.bind(_Global) : function (handle) {\n            delete requestAnimationHandlers[handle];\n        },\n\n        // Allows the browser to finish dispatching its current set of events before running\n        // the callback.\n        _yieldForEvents: _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (handler) {\n            _Global.setTimeout(handler, 0);\n        },\n\n        // Allows the browser to notice a DOM modification before running the callback.\n        _yieldForDomModification: _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (handler) {\n            _Global.setTimeout(handler, 0);\n        },\n\n        _throttledFunction: throttledFunction,\n\n        _shallowCopy: function _shallowCopy(a) {\n            // Shallow copy a single object.\n            return this._mergeAll([a]);\n        },\n\n        _merge: function _merge(a, b) {\n            // Merge 2 objects together into a new object\n            return this._mergeAll([a, b]);\n        },\n\n        _mergeAll: function _mergeAll(list) {\n            // Merge a list of objects together\n            var o = {};\n            list.forEach(function (part) {\n                Object.keys(part).forEach(function (k) {\n                    o[k] = part[k];\n                });\n            });\n            return o;\n        },\n\n        _getProfilerMarkIdentifier: function _getProfilerMarkIdentifier(element) {\n            var profilerMarkIdentifier = \"\";\n            if (element.id) {\n                profilerMarkIdentifier += \" id='\" + element.id + \"'\";\n            }\n            if (element.className) {\n                profilerMarkIdentifier += \" class='\" + element.className + \"'\";\n            }\n            return profilerMarkIdentifier;\n        },\n\n        _now: function _now() {\n            return (_Global.performance && _Global.performance.now && _Global.performance.now()) || Date.now();\n        },\n\n        _traceAsyncOperationStarting: _Trace._traceAsyncOperationStarting,\n        _traceAsyncOperationCompleted: _Trace._traceAsyncOperationCompleted,\n        _traceAsyncCallbackStarting: _Trace._traceAsyncCallbackStarting,\n        _traceAsyncCallbackCompleted: _Trace._traceAsyncCallbackCompleted,\n\n        _version: \"4.0.1\"\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS\", {\n        validation: {\n            get: function () {\n                return validation;\n            },\n            set: function (value) {\n                validation = value;\n            }\n        }\n    });\n\n    // strictProcessing also exists as a module member\n    _Base.Namespace.define(\"WinJS\", {\n        strictProcessing: {\n            value: function () {\n                /// <signature helpKeyword=\"WinJS.strictProcessing\">\n                /// <summary locid=\"WinJS.strictProcessing\">\n                /// Strict processing is always enforced, this method has no effect.\n                /// </summary>\n                /// </signature>\n            },\n            configurable: false,\n            writable: false,\n            enumerable: false\n        }\n    });\n});\n\n\ndefine('WinJS/Core',[\n    './Core/_Base',\n    './Core/_BaseCoreUtils',\n    './Core/_BaseUtils',\n    './Core/_ErrorFromName',\n    './Core/_Events',\n    './Core/_Global',\n    './Core/_Log',\n    './Core/_Resources',\n    './Core/_Trace',\n    './Core/_WinRT',\n    './Core/_WriteProfilerMark'\n    ], function () {\n    // Wrapper module\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/_Signal',[\n    './Core/_Base',\n    './Promise/_StateMachine'\n    ], function signalInit(_Base, _StateMachine) {\n    \"use strict\";\n\n    var SignalPromise = _Base.Class.derive(_StateMachine.PromiseStateMachine,\n        function (cancel) {\n            this._oncancel = cancel;\n            this._setState(_StateMachine.state_created);\n            this._run();\n        }, {\n            _cancelAction: function () { this._oncancel && this._oncancel(); },\n            _cleanupAction: function () { this._oncancel = null; }\n        }, {\n            supportedForProcessing: false\n        }\n    );\n\n    var Signal = _Base.Class.define(\n        function Signal_ctor(oncancel) {\n            this._promise = new SignalPromise(oncancel);\n        }, {\n            promise: {\n                get: function () { return this._promise; }\n            },\n\n            cancel: function Signal_cancel() {\n                this._promise.cancel();\n            },\n            complete: function Signal_complete(value) {\n                this._promise._completed(value);\n            },\n            error: function Signal_error(value) {\n                this._promise._error(value);\n            },\n            progress: function Signal_progress(value) {\n                this._promise._progress(value);\n            }\n        }, {\n            supportedForProcessing: false,\n        }\n    );\n\n    _Base.Namespace.define(\"WinJS\", {\n        _Signal: Signal\n    });\n\n    return Signal;\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_Control',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base'\n    ], function controlInit(exports, _Global, _Base) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    function setOptions(control, options) {\n        /// <signature helpKeyword=\"WinJS.UI.DOMEventMixin.setOptions\">\n        /// <summary locid=\"WinJS.UI.DOMEventMixin.setOptions\">\n        /// Adds the set of declaratively specified options (properties and events) to the specified control.\n        /// If name of the options property begins with \"on\", the property value is a function and the control\n        /// supports addEventListener. The setOptions method calls the addEventListener method on the control.\n        /// </summary>\n        /// <param name=\"control\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI.DOMEventMixin.setOptions_p:control\">\n        /// The control on which the properties and events are to be applied.\n        /// </param>\n        /// <param name=\"options\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI.DOMEventMixin.setOptions_p:options\">\n        /// The set of options that are specified declaratively.\n        /// </param>\n        /// </signature>\n        _setOptions(control, options);\n    }\n\n    function _setOptions(control, options, eventsOnly) {\n        if (typeof options === \"object\") {\n            var keys = Object.keys(options);\n            for (var i = 0, len = keys.length; i < len; i++) {\n                var key = keys[i];\n                var value = options[key];\n                if (key.length > 2) {\n                    var ch1 = key[0];\n                    var ch2 = key[1];\n                    if ((ch1 === 'o' || ch1 === 'O') && (ch2 === 'n' || ch2 === 'N')) {\n                        if (typeof value === \"function\") {\n                            if (control.addEventListener) {\n                                control.addEventListener(key.substr(2), value);\n                                continue;\n                            }\n                        }\n                    }\n                }\n\n                if (!eventsOnly) {\n                    control[key] = value;\n                }\n            }\n        }\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        DOMEventMixin: _Base.Namespace._lazy(function () {\n            return {\n                _domElement: null,\n\n                addEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI.DOMEventMixin.addEventListener\">\n                    /// <summary locid=\"WinJS.UI.DOMEventMixin.addEventListener\">\n                    /// Adds an event listener to the control.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.DOMEventMixin.addEventListener_p:type\">\n                    /// The type (name) of the event.\n                    /// </param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI.DOMEventMixin.addEventListener_p:listener\">\n                    /// The listener to invoke when the event gets raised.\n                    /// </param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI.DOMEventMixin.addEventListener_p:useCapture\">\n                    /// true to initiate capture; otherwise, false.\n                    /// </param>\n                    /// </signature>\n                    (this.element || this._domElement).addEventListener(type, listener, useCapture || false);\n                },\n                dispatchEvent: function (type, eventProperties) {\n                    /// <signature helpKeyword=\"WinJS.UI.DOMEventMixin.dispatchEvent\">\n                    /// <summary locid=\"WinJS.UI.DOMEventMixin.dispatchEvent\">\n                    /// Raises an event of the specified type, adding the specified additional properties.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.DOMEventMixin.dispatchEvent_p:type\">\n                    /// The type (name) of the event.\n                    /// </param>\n                    /// <param name=\"eventProperties\" type=\"Object\" locid=\"WinJS.UI.DOMEventMixin.dispatchEvent_p:eventProperties\">\n                    /// The set of additional properties to be attached to the event object when the event is raised.\n                    /// </param>\n                    /// <returns type=\"Boolean\" locid=\"WinJS.UI.DOMEventMixin.dispatchEvent_returnValue\">\n                    /// true if preventDefault was called on the event, otherwise false.\n                    /// </returns>\n                    /// </signature>\n                    var eventValue = _Global.document.createEvent(\"Event\");\n                    eventValue.initEvent(type, false, false);\n                    eventValue.detail = eventProperties;\n                    if (typeof eventProperties === \"object\") {\n                        Object.keys(eventProperties).forEach(function (key) {\n                            eventValue[key] = eventProperties[key];\n                        });\n                    }\n                    return (this.element || this._domElement).dispatchEvent(eventValue);\n                },\n                removeEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI.DOMEventMixin.removeEventListener\">\n                    /// <summary locid=\"WinJS.UI.DOMEventMixin.removeEventListener\">\n                    /// Removes an event listener from the control.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.DOMEventMixin.removeEventListener_p:type\">\n                    /// The type (name) of the event.\n                    /// </param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI.DOMEventMixin.removeEventListener_p:listener\">\n                    /// The listener to remove.\n                    /// </param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI.DOMEventMixin.removeEventListener_p:useCapture\">\n                    /// true to initiate capture; otherwise, false.\n                    /// </param>\n                    /// </signature>\n                    (this.element || this._domElement).removeEventListener(type, listener, useCapture || false);\n                }\n            };\n        }),\n\n        setOptions: setOptions,\n\n        _setOptions: _setOptions\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_ElementUtilities',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_WinRT',\n    '../Promise',\n    '../Scheduler'\n], function elementUtilities(exports, _Global, _Base, _BaseUtils, _WinRT, Promise, Scheduler) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var _zoomToDuration = 167;\n\n    function removeEmpties(arr) {\n        var len = arr.length;\n        for (var i = len - 1; i >= 0; i--) {\n            if (!arr[i]) {\n                arr.splice(i, 1);\n                len--;\n            }\n        }\n        return len;\n    }\n\n    function getClassName(e) {\n        var name = e.className || \"\";\n        if (typeof (name) === \"string\") {\n            return name;\n        } else {\n            return name.baseVal || \"\";\n        }\n    }\n    function setClassName(e, value) {\n        // SVG elements (which use e.className.baseVal) are never undefined,\n        // so this logic makes the comparison a bit more compact.\n        //\n        var name = e.className || \"\";\n        if (typeof (name) === \"string\") {\n            e.className = value;\n        } else {\n            e.className.baseVal = value;\n        }\n        return e;\n    }\n    function addClass(e, name) {\n        /// <signature helpKeyword=\"WinJS.Utilities.addClass\">\n        /// <summary locid=\"WinJS.Utilities.addClass\">\n        /// Adds the specified class(es) to the specified element. Multiple classes can be added using space delimited names.\n        /// </summary>\n        /// <param name=\"e\" type=\"HTMLElement\" locid=\"WinJS.Utilities.addClass_p:e\">\n        /// The element to which to add the class.\n        /// </param>\n        /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.addClass_p:name\">\n        /// The name of the class to add, multiple classes can be added using space delimited names\n        /// </param>\n        /// <returns type=\"HTMLElement\" locid=\"WinJS.Utilities.addClass_returnValue\">\n        /// The element.\n        /// </returns>\n        /// </signature>\n        if (e.classList) {\n            // Fastpath: adding a single class, no need to string split the argument\n            if (name.indexOf(\" \") < 0) {\n                e.classList.add(name);\n            } else {\n                var namesToAdd = name.split(\" \");\n                removeEmpties(namesToAdd);\n\n                for (var i = 0, len = namesToAdd.length; i < len; i++) {\n                    e.classList.add(namesToAdd[i]);\n                }\n            }\n            return e;\n        } else {\n            var className = getClassName(e);\n            var names = className.split(\" \");\n            var l = removeEmpties(names);\n            var toAdd;\n\n            // we have a fast path for the common case of a single name in the class name\n            //\n            if (name.indexOf(\" \") >= 0) {\n                var namesToAdd = name.split(\" \");\n                removeEmpties(namesToAdd);\n                for (var i = 0; i < l; i++) {\n                    var found = namesToAdd.indexOf(names[i]);\n                    if (found >= 0) {\n                        namesToAdd.splice(found, 1);\n                    }\n                }\n                if (namesToAdd.length > 0) {\n                    toAdd = namesToAdd.join(\" \");\n                }\n            } else {\n                var saw = false;\n                for (var i = 0; i < l; i++) {\n                    if (names[i] === name) {\n                        saw = true;\n                        break;\n                    }\n                }\n                if (!saw) { toAdd = name; }\n\n            }\n            if (toAdd) {\n                if (l > 0 && names[0].length > 0) {\n                    setClassName(e, className + \" \" + toAdd);\n                } else {\n                    setClassName(e, toAdd);\n                }\n            }\n            return e;\n        }\n    }\n    function removeClass(e, name) {\n        /// <signature helpKeyword=\"WinJS.Utilities.removeClass\">\n        /// <summary locid=\"WinJS.Utilities.removeClass\">\n        /// Removes the specified class from the specified element.\n        /// </summary>\n        /// <param name=\"e\" type=\"HTMLElement\" locid=\"WinJS.Utilities.removeClass_p:e\">\n        /// The element from which to remove the class.\n        /// </param>\n        /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.removeClass_p:name\">\n        /// The name of the class to remove.\n        /// </param>\n        /// <returns type=\"HTMLElement\" locid=\"WinJS.Utilities.removeClass_returnValue\">\n        /// The element.\n        /// </returns>\n        /// </signature>\n        if (e.classList) {\n\n            // Fastpath: Nothing to remove\n            if (e.classList.length === 0) {\n                return e;\n            }\n            var namesToRemove = name.split(\" \");\n            removeEmpties(namesToRemove);\n\n            for (var i = 0, len = namesToRemove.length; i < len; i++) {\n                e.classList.remove(namesToRemove[i]);\n            }\n            return e;\n        } else {\n            var original = getClassName(e);\n            var namesToRemove;\n            var namesToRemoveLen;\n\n            if (name.indexOf(\" \") >= 0) {\n                namesToRemove = name.split(\" \");\n                namesToRemoveLen = removeEmpties(namesToRemove);\n            } else {\n                // early out for the case where you ask to remove a single\n                // name and that name isn't found.\n                //\n                if (original.indexOf(name) < 0) {\n                    return e;\n                }\n                namesToRemove = [name];\n                namesToRemoveLen = 1;\n            }\n            var removed;\n            var names = original.split(\" \");\n            var namesLen = removeEmpties(names);\n\n            for (var i = namesLen - 1; i >= 0; i--) {\n                if (namesToRemove.indexOf(names[i]) >= 0) {\n                    names.splice(i, 1);\n                    removed = true;\n                }\n            }\n\n            if (removed) {\n                setClassName(e, names.join(\" \"));\n            }\n            return e;\n        }\n    }\n    function toggleClass(e, name) {\n        /// <signature helpKeyword=\"WinJS.Utilities.toggleClass\">\n        /// <summary locid=\"WinJS.Utilities.toggleClass\">\n        /// Toggles (adds or removes) the specified class on the specified element.\n        /// If the class is present, it is removed; if it is absent, it is added.\n        /// </summary>\n        /// <param name=\"e\" type=\"HTMLElement\" locid=\"WinJS.Utilities.toggleClass_p:e\">\n        /// The element on which to toggle the class.\n        /// </param>\n        /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.toggleClass_p:name\">\n        /// The name of the class to toggle.\n        /// </param>\n        /// <returns type=\"HTMLElement\" locid=\"WinJS.Utilities.toggleClass_returnValue\">\n        /// The element.\n        /// </returns>\n        /// </signature>\n        if (e.classList) {\n            e.classList.toggle(name);\n            return e;\n        } else {\n            var className = getClassName(e);\n            var names = className.trim().split(\" \");\n            var l = names.length;\n            var found = false;\n            for (var i = 0; i < l; i++) {\n                if (names[i] === name) {\n                    found = true;\n                }\n            }\n            if (!found) {\n                if (l > 0 && names[0].length > 0) {\n                    setClassName(e, className + \" \" + name);\n                } else {\n                    setClassName(e, className + name);\n                }\n            } else {\n                setClassName(e, names.reduce(function (r, e) {\n                    if (e === name) {\n                        return r;\n                    } else if (r && r.length > 0) {\n                        return r + \" \" + e;\n                    } else {\n                        return e;\n                    }\n                }, \"\"));\n            }\n            return e;\n        }\n    }\n\n    // Only set the attribute if its value has changed\n    function setAttribute(element, attribute, value) {\n        if (element.getAttribute(attribute) !== \"\" + value) {\n            element.setAttribute(attribute, value);\n        }\n    }\n\n    function _clamp(value, lowerBound, upperBound, defaultValue) {\n        var n = Math.max(lowerBound, Math.min(upperBound, +value));\n        return n === 0 ? 0 : n || Math.max(lowerBound, Math.min(upperBound, defaultValue));\n    }\n    var _pixelsRE = /^-?\\d+\\.?\\d*(px)?$/i;\n    var _numberRE = /^-?\\d+/i;\n    function convertToPixels(element, value) {\n        /// <signature helpKeyword=\"WinJS.Utilities.convertToPixels\">\n        /// <summary locid=\"WinJS.Utilities.convertToPixels\">\n        /// Converts a CSS positioning string for the specified element to pixels.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.convertToPixels_p:element\">\n        /// The element.\n        /// </param>\n        /// <param name=\"value\" type=\"String\" locid=\"WinJS.Utilities.convertToPixels_p:value\">\n        /// The CSS positioning string.\n        /// </param>\n        /// <returns type=\"Number\" locid=\"WinJS.Utilities.convertToPixels_returnValue\">\n        /// The number of pixels.\n        /// </returns>\n        /// </signature>\n        if (!_pixelsRE.test(value) && _numberRE.test(value)) {\n            var previousValue = element.style.left;\n\n            element.style.left = value;\n            value = element.style.pixelLeft;\n\n            element.style.left = previousValue;\n\n            return value;\n        } else {\n            return Math.round(parseFloat(value)) || 0;\n        }\n    }\n\n    function getDimension(element, property) {\n        return convertToPixels(element, _Global.getComputedStyle(element, null)[property]);\n    }\n\n    function _convertToPrecisePixels(value) {\n        return parseFloat(value) || 0;\n    }\n    function _getPreciseDimension(element, property) {\n        return _convertToPrecisePixels(_Global.getComputedStyle(element, null)[property]);\n    }\n    function _getPreciseMargins(element) {\n        var style = _Global.getComputedStyle(element);\n        return {\n            top: _convertToPrecisePixels(style.marginTop),\n            right: _convertToPrecisePixels(style.marginRight),\n            bottom: _convertToPrecisePixels(style.marginBottom),\n            left: _convertToPrecisePixels(style.marginLeft),\n        };\n    }\n\n    var _MSGestureEvent = _Global.MSGestureEvent || {\n        MSGESTURE_FLAG_BEGIN: 1,\n        MSGESTURE_FLAG_CANCEL: 4,\n        MSGESTURE_FLAG_END: 2,\n        MSGESTURE_FLAG_INERTIA: 8,\n        MSGESTURE_FLAG_NONE: 0\n    };\n\n    var _MSManipulationEvent = _Global.MSManipulationEvent || {\n        MS_MANIPULATION_STATE_ACTIVE: 1,\n        MS_MANIPULATION_STATE_CANCELLED: 6,\n        MS_MANIPULATION_STATE_COMMITTED: 7,\n        MS_MANIPULATION_STATE_DRAGGING: 5,\n        MS_MANIPULATION_STATE_INERTIA: 2,\n        MS_MANIPULATION_STATE_PRESELECT: 3,\n        MS_MANIPULATION_STATE_SELECTING: 4,\n        MS_MANIPULATION_STATE_STOPPED: 0\n    };\n\n    var _MSPointerEvent = _Global.MSPointerEvent || {\n        MSPOINTER_TYPE_TOUCH: \"touch\",\n        MSPOINTER_TYPE_PEN: \"pen\",\n        MSPOINTER_TYPE_MOUSE: \"mouse\",\n    };\n\n    // Helpers for managing element._eventsMap for custom events\n    //\n\n    function addListenerToEventMap(element, type, listener, useCapture, data) {\n        var eventNameLowercase = type.toLowerCase();\n        if (!element._eventsMap) {\n            element._eventsMap = {};\n        }\n        if (!element._eventsMap[eventNameLowercase]) {\n            element._eventsMap[eventNameLowercase] = [];\n        }\n        element._eventsMap[eventNameLowercase].push({\n            listener: listener,\n            useCapture: useCapture,\n            data: data\n        });\n    }\n\n    function removeListenerFromEventMap(element, type, listener, useCapture) {\n        var eventNameLowercase = type.toLowerCase();\n        var mappedEvents = element._eventsMap && element._eventsMap[eventNameLowercase];\n        if (mappedEvents) {\n            for (var i = mappedEvents.length - 1; i >= 0; i--) {\n                var mapping = mappedEvents[i];\n                if (mapping.listener === listener && (!!useCapture === !!mapping.useCapture)) {\n                    mappedEvents.splice(i, 1);\n                    return mapping;\n                }\n            }\n        }\n        return null;\n    }\n\n    function lookupListeners(element, type) {\n        var eventNameLowercase = type.toLowerCase();\n        return element._eventsMap && element._eventsMap[eventNameLowercase] && element._eventsMap[eventNameLowercase].slice(0) || [];\n    }\n\n    // Custom focusin/focusout events\n    // Generally, use these instead of using the browser's blur/focus/focusout/focusin events directly.\n    // However, this doesn't support the window object. If you need to listen to focus events on the window,\n    // use the browser's events directly.\n    //\n    // In order to send our custom focusin/focusout events synchronously on every browser, we feature detect\n    // for native \"focusin\" and \"focusout\" since every browser that supports them will fire them synchronously.\n    // Every browser in our support matrix, except for IE, also fires focus/blur synchronously, we fall back to\n    // those events in browsers such as Firefox that do not have native support for focusin/focusout.\n\n    function bubbleEvent(element, type, eventObject) {\n        while (element) {\n            var handlers = lookupListeners(element, type);\n            for (var i = 0, len = handlers.length; i < len; i++) {\n                handlers[i].listener.call(element, eventObject);\n            }\n\n            element = element.parentNode;\n        }\n    }\n\n    function prepareFocusEvent(eventObject) {\n        // If an iframe is involved, then relatedTarget should be null.\n        if (eventObject.relatedTarget && eventObject.relatedTarget.tagName === \"IFRAME\" ||\n                eventObject.target && eventObject.target.tagName === \"IFRAME\") {\n            eventObject.relatedTarget = null;\n        }\n\n        return eventObject;\n    }\n\n    var nativeSupportForFocusIn = \"onfocusin\" in _Global.document.documentElement;\n    var activeElement = null;\n    _Global.addEventListener(nativeSupportForFocusIn ? \"focusout\" : \"blur\", function (eventObject) {\n        // Fires focusout when focus move to another window or into an iframe.\n        if (eventObject.target === _Global) {\n            var previousActiveElement = activeElement;\n            if (previousActiveElement) {\n                bubbleEvent(previousActiveElement, \"focusout\", prepareFocusEvent({\n                    type: \"focusout\",\n                    target: previousActiveElement,\n                    relatedTarget: null\n                }));\n            }\n            activeElement = null;\n        }\n    });\n\n    _Global.document.documentElement.addEventListener(nativeSupportForFocusIn ? \"focusin\" : \"focus\", function (eventObject) {\n        var previousActiveElement = activeElement;\n        activeElement = eventObject.target;\n        if (previousActiveElement) {\n            bubbleEvent(previousActiveElement, \"focusout\", prepareFocusEvent({\n                type: \"focusout\",\n                target: previousActiveElement,\n                relatedTarget: activeElement\n            }));\n        }\n        if (activeElement) {\n            bubbleEvent(activeElement, \"focusin\", prepareFocusEvent({\n                type: \"focusin\",\n                target: activeElement,\n                relatedTarget: previousActiveElement\n            }));\n        }\n    }, true);\n\n    function registerBubbleListener(element, type, listener, useCapture) {\n        if (useCapture) {\n            throw \"This custom WinJS event only supports bubbling\";\n        }\n        addListenerToEventMap(element, type, listener, useCapture);\n    }\n\n    // Custom pointer events\n    //\n\n    // Sets the properties in *overrideProperties* on the object. Delegates all other\n    // property accesses to *eventObject*.\n    //\n    // The purpose of PointerEventProxy is that it allows us to customize properties on\n    // an eventObject despite those properties being unwritable and unconfigurable.\n    var PointerEventProxy = function (eventObject, overrideProperties) {\n        overrideProperties = overrideProperties || {};\n        this.__eventObject = eventObject;\n        var that = this;\n        Object.keys(overrideProperties).forEach(function (propertyName) {\n            Object.defineProperty(that, propertyName, {\n                value: overrideProperties[propertyName]\n            });\n        });\n    };\n\n    // Define PointerEventProxy properties which should be delegated to the original eventObject.\n    [\n        \"altKey\", \"AT_TARGET\", \"bubbles\", \"BUBBLING_PHASE\", \"button\", \"buttons\",\n        \"cancelable\", \"cancelBubble\", \"CAPTURING_PHASE\", \"clientX\", \"clientY\",\n        \"ctrlKey\", \"currentTarget\", \"defaultPrevented\", \"detail\", \"eventPhase\",\n        \"fromElement\", \"getModifierState\", \"height\", \"hwTimestamp\", \"initEvent\",\n        \"initMouseEvent\", \"initPointerEvent\", \"initUIEvent\", \"isPrimary\", \"isTrusted\",\n        \"layerX\", \"layerY\", \"metaKey\", \"offsetX\", \"offsetY\", \"pageX\", \"pageY\",\n        \"pointerId\", \"pointerType\", \"pressure\", \"preventDefault\", \"relatedTarget\",\n        \"rotation\", \"screenX\", \"screenY\", \"shiftKey\", \"srcElement\", \"stopImmediatePropagation\",\n        \"stopPropagation\", \"target\", \"tiltX\", \"tiltY\", \"timeStamp\", \"toElement\", \"type\",\n        \"view\", \"which\", \"width\", \"x\", \"y\", \"_normalizedType\", \"_fakedBySemanticZoom\"\n    ].forEach(function (propertyName) {\n        Object.defineProperty(PointerEventProxy.prototype, propertyName, {\n            get: function () {\n                var value = this.__eventObject[propertyName];\n                return typeof value === \"function\" ? value.bind(this.__eventObject) : value;\n            },\n            configurable: true\n        });\n    });\n\n    function touchEventTranslator(callback, eventObject) {\n        var changedTouches = eventObject.changedTouches,\n            retVal = null;\n\n        if (!changedTouches) {\n            return retVal;\n        }\n\n        for (var i = 0, len = changedTouches.length; i < len; i++) {\n            var touchObject = changedTouches[i];\n            var pointerEventObject = new PointerEventProxy(eventObject, {\n                pointerType: _MSPointerEvent.MSPOINTER_TYPE_TOUCH,\n                pointerId: touchObject.identifier,\n                isPrimary: i === 0,\n                screenX: touchObject.screenX,\n                screenY: touchObject.screenY,\n                clientX: touchObject.clientX,\n                clientY: touchObject.clientY,\n                pageX: touchObject.pageX,\n                pageY: touchObject.pageY,\n                radiusX: touchObject.radiusX,\n                radiusY: touchObject.radiusY,\n                rotationAngle: touchObject.rotationAngle,\n                force: touchObject.force,\n                _currentTouch: touchObject\n            });\n            var newRetVal = callback(pointerEventObject);\n            retVal = retVal || newRetVal;\n        }\n        return retVal;\n    }\n\n    function mouseEventTranslator(callback, eventObject) {\n        eventObject.pointerType = _MSPointerEvent.MSPOINTER_TYPE_MOUSE;\n        eventObject.pointerId = -1;\n        eventObject.isPrimary = true;\n        return callback(eventObject);\n    }\n\n    function mspointerEventTranslator(callback, eventObject) {\n        return callback(eventObject);\n    }\n\n    var eventTranslations = {\n        pointerdown: {\n            touch: \"touchstart\",\n            mspointer: \"MSPointerDown\",\n            mouse: \"mousedown\"\n        },\n        pointerup: {\n            touch: \"touchend\",\n            mspointer: \"MSPointerUp\",\n            mouse: \"mouseup\"\n        },\n        pointermove: {\n            touch: \"touchmove\",\n            mspointer: \"MSPointerMove\",\n            mouse: \"mousemove\"\n        },\n        pointerenter: {\n            touch: \"touchenter\",\n            mspointer: \"MSPointerEnter\",\n            mouse: \"mouseenter\"\n        },\n        pointerover: {\n            touch: null,\n            mspointer: \"MSPointerOver\",\n            mouse: \"mouseover\"\n        },\n        pointerout: {\n            touch: \"touchleave\",\n            mspointer: \"MSPointerOut\",\n            mouse: \"mouseout\"\n        },\n        pointercancel: {\n            touch: \"touchcancel\",\n            mspointer: \"MSPointerCancel\",\n            mouse: null\n        }\n    };\n\n    function registerPointerEvent(element, type, callback, capture) {\n        var eventNameLowercase = type.toLowerCase();\n\n        var mouseWrapper,\n            touchWrapper,\n            mspointerWrapper;\n        var translations = eventTranslations[eventNameLowercase];\n\n        // Browsers fire a touch event and then a mouse event when the input is touch. touchHandled is used to prevent invoking the pointer callback twice.\n        var touchHandled;\n\n        // If we are in IE10, we should use MSPointer as it provides a better interface than touch events\n        if (_Global.MSPointerEvent) {\n            mspointerWrapper = function (eventObject) {\n                eventObject._normalizedType = eventNameLowercase;\n                touchHandled = true;\n                return mspointerEventTranslator(callback, eventObject);\n            };\n            element.addEventListener(translations.mspointer, mspointerWrapper, capture);\n        } else {\n            // Otherwise, use a mouse and touch event\n            if (translations.mouse) {\n                mouseWrapper = function (eventObject) {\n                    eventObject._normalizedType = eventNameLowercase;\n                    if (!touchHandled) {\n                        return mouseEventTranslator(callback, eventObject);\n                    }\n                    touchHandled = false;\n                };\n                element.addEventListener(translations.mouse, mouseWrapper, capture);\n            }\n            if (translations.touch) {\n                touchWrapper = function (eventObject) {\n                    eventObject._normalizedType = eventNameLowercase;\n                    touchHandled = true;\n                    return touchEventTranslator(callback, eventObject);\n                };\n                element.addEventListener(translations.touch, touchWrapper, capture);\n            }\n        }\n\n        addListenerToEventMap(element, type, callback, capture, {\n            mouseWrapper: mouseWrapper,\n            touchWrapper: touchWrapper,\n            mspointerWrapper: mspointerWrapper\n        });\n    }\n\n    function unregisterPointerEvent(element, type, callback, capture) {\n        var eventNameLowercase = type.toLowerCase();\n\n        var mapping = removeListenerFromEventMap(element, type, callback, capture);\n        if (mapping) {\n            var translations = eventTranslations[eventNameLowercase];\n            if (mapping.data.mouseWrapper) {\n                element.removeEventListener(translations.mouse, mapping.data.mouseWrapper, capture);\n            }\n            if (mapping.data.touchWrapper) {\n                element.removeEventListener(translations.touch, mapping.data.touchWrapper, capture);\n            }\n            if (mapping.data.mspointerWrapper) {\n                element.removeEventListener(translations.mspointer, mapping.data.mspointerWrapper, capture);\n            }\n        }\n    }\n\n    // Custom events dispatch table. Event names should be lowercased.\n    //\n\n    var customEvents = {\n        focusout: {\n            register: registerBubbleListener,\n            unregister: removeListenerFromEventMap\n        },\n        focusin: {\n            register: registerBubbleListener,\n            unregister: removeListenerFromEventMap\n        }\n    };\n    if (!_Global.PointerEvent) {\n        var pointerEventEntry = {\n            register: registerPointerEvent,\n            unregister: unregisterPointerEvent\n        };\n\n        customEvents.pointerdown = pointerEventEntry;\n        customEvents.pointerup = pointerEventEntry;\n        customEvents.pointermove = pointerEventEntry;\n        customEvents.pointerenter = pointerEventEntry;\n        customEvents.pointerover = pointerEventEntry;\n        customEvents.pointerout = pointerEventEntry;\n        customEvents.pointercancel = pointerEventEntry;\n    }\n\n    // The MutationObserverShim only supports the following configuration:\n    //  attributes\n    //  attributeFilter\n    var MutationObserverShim = _Base.Class.define(\n        function MutationObserverShim_ctor(callback) {\n            this._callback = callback;\n            this._toDispose = [];\n            this._attributeFilter = [];\n            this._scheduled = false;\n            this._pendingChanges = [];\n            this._observerCount = 0;\n            this._handleCallback = this._handleCallback.bind(this);\n            this._targetElements = [];\n        },\n        {\n            observe: function MutationObserverShim_observe(element, configuration) {\n                if (this._targetElements.indexOf(element) === -1) {\n                    this._targetElements.push(element);\n                }\n                this._observerCount++;\n                if (configuration.attributes) {\n                    this._addRemovableListener(element, \"DOMAttrModified\", this._handleCallback);\n                }\n                if (configuration.attributeFilter) {\n                    this._attributeFilter = configuration.attributeFilter;\n                }\n            },\n            disconnect: function MutationObserverShim_disconnect() {\n                this._observerCount = 0;\n                this._targetElements = [];\n                this._toDispose.forEach(function (disposeFunc) {\n                    disposeFunc();\n                });\n            },\n            _addRemovableListener: function MutationObserverShim_addRemovableListener(target, event, listener) {\n                target.addEventListener(event, listener);\n                this._toDispose.push(function () {\n                    target.removeEventListener(event, listener);\n                });\n            },\n            _handleCallback: function MutationObserverShim_handleCallback(evt) {\n\n                // prevent multiple events from firing when nesting observers\n                evt.stopPropagation();\n\n                var attrName = evt.attrName;\n                if (this._attributeFilter.length && this._attributeFilter.indexOf(attrName) === -1) {\n                    return;\n                }\n\n                // subtree:true is not currently supported\n                if (this._targetElements.indexOf(evt.target) === -1) {\n                    return;\n                }\n\n                var isAriaMutation = attrName.indexOf(\"aria\") >= 0;\n\n                // DOM mutation events use different naming for this attribute\n                if (attrName === 'tabindex') {\n                    attrName = 'tabIndex';\n                }\n\n                this._pendingChanges.push({\n                    type: 'attributes',\n                    target: evt.target,\n                    attributeName: attrName\n                });\n\n                if (this._observerCount === 1 && !isAriaMutation) {\n                    this._dispatchEvent();\n                } else if (this._scheduled === false) {\n                    this._scheduled = true;\n                    _BaseUtils._setImmediate(this._dispatchEvent.bind(this));\n                }\n\n            },\n            _dispatchEvent: function MutationObserverShim_dispatchEvent() {\n                try {\n                    this._callback(this._pendingChanges);\n                }\n                finally {\n                    this._pendingChanges = [];\n                    this._scheduled = false;\n                }\n            }\n        },\n        {\n            _isShim: true\n        }\n    );\n\n    var _MutationObserver = _Global.MutationObserver || MutationObserverShim;\n\n    // Lazily init singleton on first access.\n    var _resizeNotifier = null;\n\n    // Class to provide a global listener for window.onresize events.\n    // This keeps individual elements from having to listen to window.onresize\n    // and having to dispose themselves to avoid leaks.\n    var ResizeNotifier = _Base.Class.define(\n        function ElementResizer_ctor() {\n            _Global.addEventListener(\"resize\", this._handleResize.bind(this));\n        },\n        {\n            subscribe: function ElementResizer_subscribe(element, handler) {\n                element.addEventListener(this._resizeEvent, handler);\n                addClass(element, this._resizeClass);\n            },\n            unsubscribe: function ElementResizer_unsubscribe(element, handler) {\n                removeClass(element, this._resizeClass);\n                element.removeEventListener(this._resizeEvent, handler);\n            },\n            _handleResize: function ElementResizer_handleResize() {\n                var resizables = _Global.document.querySelectorAll('.' + this._resizeClass);\n                var length = resizables.length;\n                for (var i = 0; i < length; i++) {\n                    var event = _Global.document.createEvent(\"Event\");\n                    event.initEvent(this._resizeEvent, false, true);\n                    resizables[i].dispatchEvent(event);\n                }\n            },\n            _resizeClass: { get: function () { return 'win-element-resize'; } },\n            _resizeEvent: { get: function () { return 'WinJSElementResize'; } }\n        }\n    );\n\n    // - object: The object on which GenericListener will listen for events.\n    // - objectName: A string representing the name of *object*. This will be\n    //   incorporated into the names of the events and classNames created by\n    //   GenericListener.\n    // - options\n    //   - registerThruWinJSCustomEvents: If true, will register for events using\n    //     _exports._addEventListener so that you can take advantage of WinJS's custom\n    //     events (e.g. focusin, pointer*). Otherwise, registers directly on *object*\n    //     using its add/removeEventListener methods.\n    var GenericListener = _Base.Class.define(\n        function GenericListener_ctor(objectName, object, options) {\n            options = options || {};\n            this.registerThruWinJSCustomEvents = !!options.registerThruWinJSCustomEvents;\n\n            this.objectName = objectName;\n            this.object = object;\n            this.capture = {};\n            this.bubble = {};\n        },\n        {\n            addEventListener: function GenericListener_addEventListener(element, name, listener, capture) {\n                name = name.toLowerCase();\n                var handlers = this._getHandlers(capture);\n                var handler = handlers[name];\n\n                if (!handler) {\n                    handler = this._getListener(name, capture);\n                    handler.refCount = 0;\n                    handlers[name] = handler;\n\n                    if (this.registerThruWinJSCustomEvents) {\n                        exports._addEventListener(this.object, name, handler, capture);\n                    } else {\n                        this.object.addEventListener(name, handler, capture);\n                    }\n                }\n\n                handler.refCount++;\n                element.addEventListener(this._getEventName(name, capture), listener);\n                addClass(element, this._getClassName(name, capture));\n            },\n            removeEventListener: function GenericListener_removeEventListener(element, name, listener, capture) {\n                name = name.toLowerCase();\n                var handlers = this._getHandlers(capture);\n                var handler = handlers[name];\n\n                if (handler) {\n                    handler.refCount--;\n                    if (handler.refCount === 0) {\n                        if (this.registerThruWinJSCustomEvents) {\n                            exports._removeEventListener(this.object, name, handler, capture);\n                        } else {\n                            this.object.removeEventListener(name, handler, capture);\n                        }\n                        delete handlers[name];\n                    }\n                }\n\n                removeClass(element, this._getClassName(name, capture));\n                element.removeEventListener(this._getEventName(name, capture), listener);\n            },\n\n            _getHandlers: function GenericListener_getHandlers(capture) {\n                if (capture) {\n                    return this.capture;\n                } else {\n                    return this.bubble;\n                }\n            },\n\n            _getClassName: function GenericListener_getClassName(name, capture) {\n                var captureSuffix = capture ? 'capture' : 'bubble';\n                return 'win-' + this.objectName.toLowerCase() + '-event-' + name + captureSuffix;\n            },\n\n            _getEventName: function GenericListener_getEventName(name, capture) {\n                var captureSuffix = capture ? 'capture' : 'bubble';\n                return 'WinJS' + this.objectName + 'Event-' + name + captureSuffix;\n            },\n\n            _getListener: function GenericListener_getListener(name, capture) {\n                var listener = function GenericListener_generatedListener(ev) {\n\n                    var targets = _Global.document.querySelectorAll('.' + this._getClassName(name, capture));\n                    var length = targets.length;\n                    var handled = false;\n                    for (var i = 0; i < length; i++) {\n                        var event = _Global.document.createEvent(\"Event\");\n                        event.initEvent(this._getEventName(name, capture), false, true);\n                        event.detail = { originalEvent: ev };\n                        var doDefault = targets[i].dispatchEvent(event);\n                        handled = handled || !doDefault;\n                    }\n                    return handled;\n                };\n\n                return listener.bind(this);\n            }\n        }\n    );\n\n    var determinedRTLEnvironment = false,\n        usingWebkitScrollCoordinates = false,\n        usingFirefoxScrollCoordinates = false;\n    function determineRTLEnvironment() {\n        var element = _Global.document.createElement(\"div\");\n        element.style.direction = \"rtl\";\n        element.innerHTML = \"\" +\n            \"<div style='width: 100px; height: 100px; overflow: scroll; visibility:hidden'>\" +\n                \"<div style='width: 10000px; height: 100px;'></div>\" +\n            \"</div>\";\n        _Global.document.body.appendChild(element);\n        var elementScroller = element.firstChild;\n        if (elementScroller.scrollLeft > 0) {\n            usingWebkitScrollCoordinates = true;\n        }\n        elementScroller.scrollLeft += 100;\n        if (elementScroller.scrollLeft === 0) {\n            usingFirefoxScrollCoordinates = true;\n        }\n        _Global.document.body.removeChild(element);\n        determinedRTLEnvironment = true;\n    }\n\n    function getAdjustedScrollPosition(element) {\n        var computedStyle = _Global.getComputedStyle(element),\n            scrollLeft = element.scrollLeft;\n        if (computedStyle.direction === \"rtl\") {\n            if (!determinedRTLEnvironment) {\n                determineRTLEnvironment();\n            }\n            if (usingWebkitScrollCoordinates) {\n                scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft;\n            }\n            scrollLeft = Math.abs(scrollLeft);\n        }\n\n        return {\n            scrollLeft: scrollLeft,\n            scrollTop: element.scrollTop\n        };\n    }\n\n    function setAdjustedScrollPosition(element, scrollLeft, scrollTop) {\n        if (scrollLeft !== undefined) {\n            var computedStyle = _Global.getComputedStyle(element);\n            if (computedStyle.direction === \"rtl\") {\n                if (!determinedRTLEnvironment) {\n                    determineRTLEnvironment();\n                }\n                if (usingFirefoxScrollCoordinates) {\n                    scrollLeft = -scrollLeft;\n                } else if (usingWebkitScrollCoordinates) {\n                    scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft;\n                }\n            }\n            element.scrollLeft = scrollLeft;\n        }\n\n        if (scrollTop !== undefined) {\n            element.scrollTop = scrollTop;\n        }\n    }\n\n    function getScrollPosition(element) {\n        /// <signature helpKeyword=\"WinJS.Utilities.getScrollPosition\">\n        /// <summary locid=\"WinJS.Utilities.getScrollPosition\">\n        /// Gets the scrollLeft and scrollTop of the specified element, adjusting the scrollLeft to change from browser specific coordinates to logical coordinates when in RTL.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.Utilities.getScrollPosition_p:element\">\n        /// The element.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Utilities.getScrollPosition_returnValue\">\n        /// An object with two properties: scrollLeft and scrollTop\n        /// </returns>\n        /// </signature>\n        return getAdjustedScrollPosition(element);\n    }\n\n    function setScrollPosition(element, position) {\n        /// <signature helpKeyword=\"WinJS.Utilities.setScrollPosition\">\n        /// <summary locid=\"WinJS.Utilities.setScrollPosition\">\n        /// Sets the scrollLeft and scrollTop of the specified element, changing the scrollLeft from logical coordinates to browser-specific coordinates when in RTL.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.Utilities.setScrollPosition_p:element\">\n        /// The element.\n        /// </param>\n        /// <param name=\"position\" type=\"Object\" domElement=\"true\" locid=\"WinJS.Utilities.setScrollPosition_p:position\">\n        /// The element.\n        /// </param>\n        /// </signature>\n        position = position || {};\n        setAdjustedScrollPosition(element, position.scrollLeft, position.scrollTop);\n    }\n\n    // navigator.msManipulationViewsEnabled tells us whether snap points work or not regardless of whether the style properties exist, however,\n    // on Phone WWAs, this check returns false even though snap points are supported. To work around this bug, we check for the presence of\n    // 'MSAppHost' in the user agent string which indicates that we are in a WWA environment; all WWA environments support snap points.\n    var supportsSnapPoints = _Global.navigator.msManipulationViewsEnabled || _Global.navigator.userAgent.indexOf(\"MSAppHost\") >= 0;\n    var supportsTouchDetection = !!(_Global.MSPointerEvent || _Global.TouchEvent);\n\n    var uniqueElementIDCounter = 0;\n\n    function uniqueID(e) {\n        if (!(e.uniqueID || e._uniqueID)) {\n            e._uniqueID = \"element__\" + (++uniqueElementIDCounter);\n        }\n\n        return e.uniqueID || e._uniqueID;\n    }\n\n    function ensureId(element) {\n        if (!element.id) {\n            element.id = uniqueID(element);\n        }\n    }\n\n    function _getCursorPos(eventObject) {\n        var docElement = _Global.document.documentElement;\n        var docScrollPos = getScrollPosition(docElement);\n\n        return {\n            left: eventObject.clientX + (_Global.document.body.dir === \"rtl\" ? -docScrollPos.scrollLeft : docScrollPos.scrollLeft),\n            top: eventObject.clientY + docElement.scrollTop\n        };\n    }\n\n    function _getElementsByClasses(parent, classes) {\n        var retVal = [];\n\n        for (var i = 0, len = classes.length; i < len; i++) {\n            var element = parent.querySelector(\".\" + classes[i]);\n            if (element) {\n                retVal.push(element);\n            }\n        }\n        return retVal;\n    }\n\n    var _selectionPartsSelector = \".win-selectionborder, .win-selectionbackground, .win-selectioncheckmark, .win-selectioncheckmarkbackground\";\n    var _dataKey = \"_msDataKey\";\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        _dataKey: _dataKey,\n\n        _supportsSnapPoints: {\n            get: function () {\n                return supportsSnapPoints;\n            }\n        },\n\n        _supportsTouchDetection: {\n            get: function () {\n                return supportsTouchDetection;\n            }\n        },\n\n        _uniqueID: uniqueID,\n\n        _ensureId: ensureId,\n\n        _clamp: _clamp,\n\n        _getCursorPos: _getCursorPos,\n\n        _getElementsByClasses: _getElementsByClasses,\n\n        _createGestureRecognizer: function () {\n            if (_Global.MSGesture) {\n                return new _Global.MSGesture();\n            }\n\n            var doNothing = function () {\n            };\n            return {\n                addEventListener: doNothing,\n                removeEventListener: doNothing,\n                addPointer: doNothing,\n                stop: doNothing\n            };\n        },\n\n        _MSGestureEvent: _MSGestureEvent,\n        _MSManipulationEvent: _MSManipulationEvent,\n\n        _elementsFromPoint: function (x, y) {\n            if (_Global.document.msElementsFromPoint) {\n                return _Global.document.msElementsFromPoint(x, y);\n            } else {\n                var element = _Global.document.elementFromPoint(x, y);\n                return element ? [element] : null;\n            }\n        },\n\n        _matchesSelector: function _matchesSelector(element, selectorString) {\n            var matchesSelector = element.matches\n                    || element.msMatchesSelector\n                    || element.mozMatchesSelector\n                    || element.webkitMatchesSelector;\n            return matchesSelector.call(element, selectorString);\n        },\n\n        _selectionPartsSelector: _selectionPartsSelector,\n\n        _isSelectionRendered: function _isSelectionRendered(itemBox) {\n            // The tree is changed at pointerDown but _selectedClass is added only when the user drags an item below the selection threshold so checking for _selectedClass is not reliable.\n            return itemBox.querySelectorAll(_selectionPartsSelector).length > 0;\n        },\n\n        _addEventListener: function _addEventListener(element, type, listener, useCapture) {\n            var eventNameLower = type && type.toLowerCase();\n            var entry = customEvents[eventNameLower];\n            var equivalentEvent = _BaseUtils._browserEventEquivalents[type];\n            if (entry) {\n                entry.register(element, type, listener, useCapture);\n            } else if (equivalentEvent) {\n                element.addEventListener(equivalentEvent, listener, useCapture);\n            } else {\n                element.addEventListener(type, listener, useCapture);\n            }\n        },\n\n        _removeEventListener: function _removeEventListener(element, type, listener, useCapture) {\n            var eventNameLower = type && type.toLowerCase();\n            var entry = customEvents[eventNameLower];\n            var equivalentEvent = _BaseUtils._browserEventEquivalents[type];\n            if (entry) {\n                entry.unregister(element, type, listener, useCapture);\n            } else if (equivalentEvent) {\n                element.removeEventListener(equivalentEvent, listener, useCapture);\n            } else {\n                element.removeEventListener(type, listener, useCapture);\n            }\n        },\n\n        _initEventImpl: function (initType, event, eventType) {\n            eventType = eventType.toLowerCase();\n            var mapping = eventTranslations[eventType];\n            if (mapping) {\n                switch (initType.toLowerCase()) {\n                    case \"pointer\":\n                        arguments[2] = mapping.mspointer;\n                        break;\n\n                    default:\n                        arguments[2] = mapping[initType.toLowerCase()];\n                        break;\n                }\n            }\n            event[\"init\" + initType + \"Event\"].apply(event, Array.prototype.slice.call(arguments, 2));\n        },\n\n        _initMouseEvent: function (event) {\n            this._initEventImpl.apply(this, [\"Mouse\", event].concat(Array.prototype.slice.call(arguments, 1)));\n        },\n\n        _initPointerEvent: function (event) {\n            this._initEventImpl.apply(this, [\"Pointer\", event].concat(Array.prototype.slice.call(arguments, 1)));\n        },\n\n        _PointerEventProxy: PointerEventProxy,\n\n        _bubbleEvent: bubbleEvent,\n\n        _setPointerCapture: function (element, pointerId) {\n            if (element.setPointerCapture) {\n                element.setPointerCapture(pointerId);\n            }\n        },\n\n        _releasePointerCapture: function (element, pointerId) {\n            if (element.releasePointerCapture) {\n                element.releasePointerCapture(pointerId);\n            }\n        },\n\n        _MSPointerEvent: _MSPointerEvent,\n\n        _zoomToDuration: _zoomToDuration,\n\n        _zoomTo: function _zoomTo(element, args) {\n            if (this._supportsSnapPoints && element.msZoomTo) {\n                element.msZoomTo(args);\n            } else {\n                // Schedule to ensure that we're not running from within an event handler. For example, if running\n                // within a focus handler triggered by WinJS.Utilities._setActive, scroll position will not yet be\n                // restored.\n                Scheduler.schedule(function () {\n                    var initialPos = getAdjustedScrollPosition(element);\n                    var effectiveScrollLeft = (typeof element._zoomToDestX === \"number\" ? element._zoomToDestX : initialPos.scrollLeft);\n                    var effectiveScrollTop = (typeof element._zoomToDestY === \"number\" ? element._zoomToDestY : initialPos.scrollTop);\n                    var cs = _Global.getComputedStyle(element);\n                    var scrollLimitX = element.scrollWidth - parseInt(cs.width, 10) - parseInt(cs.paddingLeft, 10) - parseInt(cs.paddingRight, 10);\n                    var scrollLimitY = element.scrollHeight - parseInt(cs.height, 10) - parseInt(cs.paddingTop, 10) - parseInt(cs.paddingBottom, 10);\n\n                    if (typeof args.contentX !== \"number\") {\n                        args.contentX = effectiveScrollLeft;\n                    }\n                    if (typeof args.contentY !== \"number\") {\n                        args.contentY = effectiveScrollTop;\n                    }\n\n                    var zoomToDestX = _clamp(args.contentX, 0, scrollLimitX);\n                    var zoomToDestY = _clamp(args.contentY, 0, scrollLimitY);\n                    if (zoomToDestX === effectiveScrollLeft && zoomToDestY === effectiveScrollTop) {\n                        // Scroll position is already in the proper state. This zoomTo is a no-op.\n                        return;\n                    }\n\n                    element._zoomToId = element._zoomToId || 0;\n                    element._zoomToId++;\n                    element._zoomToDestX = zoomToDestX;\n                    element._zoomToDestY = zoomToDestY;\n\n                    var thisZoomToId = element._zoomToId;\n                    var start = _BaseUtils._now();\n                    var xFactor = (element._zoomToDestX - initialPos.scrollLeft) / _zoomToDuration;\n                    var yFactor = (element._zoomToDestY - initialPos.scrollTop) / _zoomToDuration;\n\n                    var update = function () {\n                        var t = _BaseUtils._now() - start;\n                        if (element._zoomToId !== thisZoomToId) {\n                            return;\n                        } else if (t > _zoomToDuration) {\n                            setAdjustedScrollPosition(element, element._zoomToDestX, element._zoomToDestY);\n                            element._zoomToDestX = null;\n                            element._zoomToDestY = null;\n                        } else {\n                            setAdjustedScrollPosition(element, initialPos.scrollLeft + t * xFactor, initialPos.scrollTop + t * yFactor);\n                            _BaseUtils._requestAnimationFrame(update);\n                        }\n                    };\n\n                    _BaseUtils._requestAnimationFrame(update);\n                }, Scheduler.Priority.high, null, \"WinJS.Utilities._zoomTo\");\n            }\n        },\n\n        _setActive: function _setActive(element, scroller) {\n            var success = true;\n            try {\n                if (_Global.HTMLElement && _Global.HTMLElement.prototype.setActive) {\n                    element.setActive();\n                } else {\n                    // We are aware that, unlike setActive(), focus() will scroll to the element that gets focus. However, this is\n                    // our current cross-browser solution until there is an equivalent for setActive() in other browsers.\n                    //\n                    // This _setActive polyfill does have limited support for preventing scrolling: via the scroller parameter, it\n                    // can prevent one scroller from scrolling. This functionality is necessary in some scenarios. For example, when using\n                    // _zoomTo and _setActive together.\n\n                    var scrollLeft,\n                        scrollTop;\n\n                    if (scroller) {\n                        scrollLeft = scroller.scrollLeft;\n                        scrollTop = scroller.scrollTop;\n                    }\n                    element.focus();\n                    if (scroller) {\n                        scroller.scrollLeft = scrollLeft;\n                        scroller.scrollTop = scrollTop;\n                    }\n                }\n            } catch (e) {\n                // setActive() raises an exception when trying to focus an invisible item. Checking visibility is non-trivial, so it's best\n                // just to catch the exception and ignore it. focus() on the other hand, does not raise exceptions.\n                success = false;\n            }\n            return success;\n        },\n\n        _MutationObserver: _MutationObserver,\n\n        _resizeNotifier: {\n            get: function () {\n                if (!_resizeNotifier) {\n                    _resizeNotifier = new ResizeNotifier();\n                }\n                return _resizeNotifier;\n            }\n        },\n\n        _GenericListener: GenericListener,\n        _globalListener: new GenericListener(\"Global\", _Global, { registerThruWinJSCustomEvents: true }),\n        _documentElementListener: new GenericListener(\"DocumentElement\", _Global.document.documentElement, { registerThruWinJSCustomEvents: true }),\n        _inputPaneListener: _WinRT.Windows.UI.ViewManagement.InputPane ?\n            new GenericListener(\"InputPane\", _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView()) :\n            { addEventListener: function () { }, removeEventListener: function () { } },\n\n        // Appends a hidden child to the given element that will listen for being added\n        // to the DOM. When the hidden element is added to the DOM, it will dispatch a\n        // \"WinJSNodeInserted\" event on the provided element.\n        _addInsertedNotifier: function (element) {\n            var hiddenElement = _Global.document.createElement(\"div\");\n            hiddenElement.style[_BaseUtils._browserStyleEquivalents[\"animation-name\"].scriptName] = \"WinJS-node-inserted\";\n            hiddenElement.style[_BaseUtils._browserStyleEquivalents[\"animation-duration\"].scriptName] = \"0.01s\";\n            hiddenElement.style[\"position\"] = \"absolute\";\n            element.appendChild(hiddenElement);\n\n            exports._addEventListener(hiddenElement, \"animationStart\", function (e) {\n                if (e.animationName === \"WinJS-node-inserted\") {\n                    var e = _Global.document.createEvent(\"Event\");\n                    e.initEvent(\"WinJSNodeInserted\", false, true);\n                    element.dispatchEvent(e);\n                }\n            }, false);\n\n            return hiddenElement;\n        },\n\n        // Returns a promise which completes when *element* is in the DOM.\n        _inDom: function Utilities_inDom(element) {\n            return new Promise(function (c) {\n                if (_Global.document.body.contains(element)) {\n                    c();\n                } else {\n                    var nodeInsertedHandler = function () {\n                        element.removeEventListener(\"WinJSNodeInserted\", nodeInsertedHandler, false);\n                        c();\n                    };\n                    exports._addInsertedNotifier(element);\n                    element.addEventListener(\"WinJSNodeInserted\", nodeInsertedHandler, false);\n                }\n            });\n        },\n\n        // Browser agnostic method to set element flex style\n        // Param is an object in the form {grow: flex-grow, shrink: flex-shrink, basis: flex-basis}\n        // All fields optional\n        _setFlexStyle: function (element, flexParams) {\n            var styleObject = element.style;\n            if (typeof flexParams.grow !== \"undefined\") {\n                styleObject.msFlexPositive = flexParams.grow;\n                styleObject.webkitFlexGrow = flexParams.grow;\n                styleObject.flexGrow = flexParams.grow;\n            }\n            if (typeof flexParams.shrink !== \"undefined\") {\n                styleObject.msFlexNegative = flexParams.shrink;\n                styleObject.webkitFlexShrink = flexParams.shrink;\n                styleObject.flexShrink = flexParams.shrink;\n            }\n            if (typeof flexParams.basis !== \"undefined\") {\n                styleObject.msFlexPreferredSize = flexParams.basis;\n                styleObject.webkitFlexBasis = flexParams.basis;\n                styleObject.flexBasis = flexParams.basis;\n            }\n        },\n\n        /// <field locid=\"WinJS.Utilities.Key\" helpKeyword=\"WinJS.Utilities.Key\">\n        /// Defines a set of keyboard values.\n        /// </field>\n        Key: {\n            /// <field locid=\"WinJS.Utilities.Key.backspace\" helpKeyword=\"WinJS.Utilities.Key.backspace\">\n            /// BACKSPACE key.\n            /// </field>\n            backspace: 8,\n\n            /// <field locid=\"WinJS.Utilities.Key.tab\" helpKeyword=\"WinJS.Utilities.Key.tab\">\n            /// TAB key.\n            /// </field>\n            tab: 9,\n\n            /// <field locid=\"WinJS.Utilities.Key.enter\" helpKeyword=\"WinJS.Utilities.Key.enter\">\n            /// ENTER key.\n            /// </field>\n            enter: 13,\n\n            /// <field locid=\"WinJS.Utilities.Key.shift\" helpKeyword=\"WinJS.Utilities.Key.shift\">\n            /// Shift key.\n            /// </field>\n            shift: 16,\n\n            /// <field locid=\"WinJS.Utilities.Key.ctrl\" helpKeyword=\"WinJS.Utilities.Key.ctrl\">\n            /// CTRL key.\n            /// </field>\n            ctrl: 17,\n\n            /// <field locid=\"WinJS.Utilities.Key.alt\" helpKeyword=\"WinJS.Utilities.Key.alt\">\n            /// ALT key\n            /// </field>\n            alt: 18,\n\n            /// <field locid=\"WinJS.Utilities.Key.pause\" helpKeyword=\"WinJS.Utilities.Key.pause\">\n            /// Pause key.\n            /// </field>\n            pause: 19,\n\n            /// <field locid=\"WinJS.Utilities.Key.capsLock\" helpKeyword=\"WinJS.Utilities.Key.capsLock\">\n            /// CAPS LOCK key.\n            /// </field>\n            capsLock: 20,\n\n            /// <field locid=\"WinJS.Utilities.Key.escape\" helpKeyword=\"WinJS.Utilities.Key.escape\">\n            /// ESCAPE key.\n            /// </field>\n            escape: 27,\n\n            /// <field locid=\"WinJS.Utilities.Key.space\" helpKeyword=\"WinJS.Utilities.Key.space\">\n            /// SPACE key.\n            /// </field>\n            space: 32,\n\n            /// <field locid=\"WinJS.Utilities.Key.pageUp\" helpKeyword=\"WinJS.Utilities.Key.pageUp\">\n            /// PAGE UP key.\n            /// </field>\n            pageUp: 33,\n\n            /// <field locid=\"WinJS.Utilities.Key.pageDown\" helpKeyword=\"WinJS.Utilities.Key.pageDown\">\n            /// PAGE DOWN key.\n            /// </field>\n            pageDown: 34,\n\n            /// <field locid=\"WinJS.Utilities.Key.end\" helpKeyword=\"WinJS.Utilities.Key.end\">\n            /// END key.\n            /// </field>\n            end: 35,\n\n            /// <field locid=\"WinJS.Utilities.Key.home\" helpKeyword=\"WinJS.Utilities.Key.home\">\n            /// HOME key.\n            /// </field>\n            home: 36,\n\n            /// <field locid=\"WinJS.Utilities.Key.leftArrow\" helpKeyword=\"WinJS.Utilities.Key.leftArrow\">\n            /// Left arrow key.\n            /// </field>\n            leftArrow: 37,\n\n            /// <field locid=\"WinJS.Utilities.Key.upArrow\" helpKeyword=\"WinJS.Utilities.Key.upArrow\">\n            /// Up arrow key.\n            /// </field>\n            upArrow: 38,\n\n            /// <field locid=\"WinJS.Utilities.Key.rightArrow\" helpKeyword=\"WinJS.Utilities.Key.rightArrow\">\n            /// Right arrow key.\n            /// </field>\n            rightArrow: 39,\n\n            /// <field locid=\"WinJS.Utilities.Key.downArrow\" helpKeyword=\"WinJS.Utilities.Key.downArrow\">\n            /// Down arrow key.\n            /// </field>\n            downArrow: 40,\n\n            /// <field locid=\"WinJS.Utilities.Key.insert\" helpKeyword=\"WinJS.Utilities.Key.insert\">\n            /// INSERT key.\n            /// </field>\n            insert: 45,\n\n            /// <field locid=\"WinJS.Utilities.Key.deleteKey\" helpKeyword=\"WinJS.Utilities.Key.deleteKey\">\n            /// DELETE key.\n            /// </field>\n            deleteKey: 46,\n\n            /// <field locid=\"WinJS.Utilities.Key.num0\" helpKeyword=\"WinJS.Utilities.Key.num0\">\n            /// Number 0 key.\n            /// </field>\n            num0: 48,\n\n            /// <field locid=\"WinJS.Utilities.Key.num1\" helpKeyword=\"WinJS.Utilities.Key.num1\">\n            /// Number 1 key.\n            /// </field>\n            num1: 49,\n\n            /// <field locid=\"WinJS.Utilities.Key.num2\" helpKeyword=\"WinJS.Utilities.Key.num2\">\n            /// Number 2 key.\n            /// </field>\n            num2: 50,\n\n            /// <field locid=\"WinJS.Utilities.Key.num3\" helpKeyword=\"WinJS.Utilities.Key.num3\">\n            /// Number 3 key.\n            /// </field>\n            num3: 51,\n\n            /// <field locid=\"WinJS.Utilities.Key.num4\" helpKeyword=\"WinJS.Utilities.Key.num4\">\n            /// Number 4 key.\n            /// </field>\n            num4: 52,\n\n            /// <field locid=\"WinJS.Utilities.Key.num5\" helpKeyword=\"WinJS.Utilities.Key.num5\">\n            /// Number 5 key.\n            /// </field>\n            num5: 53,\n\n            /// <field locid=\"WinJS.Utilities.Key.num6\" helpKeyword=\"WinJS.Utilities.Key.num6\">\n            /// Number 6 key.\n            /// </field>\n            num6: 54,\n\n            /// <field locid=\"WinJS.Utilities.Key.num7\" helpKeyword=\"WinJS.Utilities.Key.num7\">\n            /// Number 7 key.\n            /// </field>\n            num7: 55,\n\n            /// <field locid=\"WinJS.Utilities.Key.num8\" helpKeyword=\"WinJS.Utilities.Key.num8\">\n            /// Number 8 key.\n            /// </field>\n            num8: 56,\n\n            /// <field locid=\"WinJS.Utilities.Key.num9\" helpKeyword=\"WinJS.Utilities.Key.num9\">\n            /// Number 9 key.\n            /// </field>\n            num9: 57,\n\n            /// <field locid=\"WinJS.Utilities.Key.a\" helpKeyword=\"WinJS.Utilities.Key.a\">\n            /// A key.\n            /// </field>\n            a: 65,\n\n            /// <field locid=\"WinJS.Utilities.Key.b\" helpKeyword=\"WinJS.Utilities.Key.b\">\n            /// B key.\n            /// </field>\n            b: 66,\n\n            /// <field locid=\"WinJS.Utilities.Key.c\" helpKeyword=\"WinJS.Utilities.Key.c\">\n            /// C key.\n            /// </field>\n            c: 67,\n\n            /// <field locid=\"WinJS.Utilities.Key.d\" helpKeyword=\"WinJS.Utilities.Key.d\">\n            /// D key.\n            /// </field>\n            d: 68,\n\n            /// <field locid=\"WinJS.Utilities.Key.e\" helpKeyword=\"WinJS.Utilities.Key.e\">\n            /// E key.\n            /// </field>\n            e: 69,\n\n            /// <field locid=\"WinJS.Utilities.Key.f\" helpKeyword=\"WinJS.Utilities.Key.f\">\n            /// F key.\n            /// </field>\n            f: 70,\n\n            /// <field locid=\"WinJS.Utilities.Key.g\" helpKeyword=\"WinJS.Utilities.Key.g\">\n            /// G key.\n            /// </field>\n            g: 71,\n\n            /// <field locid=\"WinJS.Utilities.Key.h\" helpKeyword=\"WinJS.Utilities.Key.h\">\n            /// H key.\n            /// </field>\n            h: 72,\n\n            /// <field locid=\"WinJS.Utilities.Key.i\" helpKeyword=\"WinJS.Utilities.Key.i\">\n            /// I key.\n            /// </field>\n            i: 73,\n\n            /// <field locid=\"WinJS.Utilities.Key.j\" helpKeyword=\"WinJS.Utilities.Key.j\">\n            /// J key.\n            /// </field>\n            j: 74,\n\n            /// <field locid=\"WinJS.Utilities.Key.k\" helpKeyword=\"WinJS.Utilities.Key.k\">\n            /// K key.\n            /// </field>\n            k: 75,\n\n            /// <field locid=\"WinJS.Utilities.Key.l\" helpKeyword=\"WinJS.Utilities.Key.l\">\n            /// L key.\n            /// </field>\n            l: 76,\n\n            /// <field locid=\"WinJS.Utilities.Key.m\" helpKeyword=\"WinJS.Utilities.Key.m\">\n            /// M key.\n            /// </field>\n            m: 77,\n\n            /// <field locid=\"WinJS.Utilities.Key.n\" helpKeyword=\"WinJS.Utilities.Key.n\">\n            /// N key.\n            /// </field>\n            n: 78,\n\n            /// <field locid=\"WinJS.Utilities.Key.o\" helpKeyword=\"WinJS.Utilities.Key.o\">\n            /// O key.\n            /// </field>\n            o: 79,\n\n            /// <field locid=\"WinJS.Utilities.Key.p\" helpKeyword=\"WinJS.Utilities.Key.p\">\n            /// P key.\n            /// </field>\n            p: 80,\n\n            /// <field locid=\"WinJS.Utilities.Key.q\" helpKeyword=\"WinJS.Utilities.Key.q\">\n            /// Q key.\n            /// </field>\n            q: 81,\n\n            /// <field locid=\"WinJS.Utilities.Key.r\" helpKeyword=\"WinJS.Utilities.Key.r\">\n            /// R key.\n            /// </field>\n            r: 82,\n\n            /// <field locid=\"WinJS.Utilities.Key.s\" helpKeyword=\"WinJS.Utilities.Key.s\">\n            /// S key.\n            /// </field>\n            s: 83,\n\n            /// <field locid=\"WinJS.Utilities.Key.t\" helpKeyword=\"WinJS.Utilities.Key.t\">\n            /// T key.\n            /// </field>\n            t: 84,\n\n            /// <field locid=\"WinJS.Utilities.Key.u\" helpKeyword=\"WinJS.Utilities.Key.u\">\n            /// U key.\n            /// </field>\n            u: 85,\n\n            /// <field locid=\"WinJS.Utilities.Key.v\" helpKeyword=\"WinJS.Utilities.Key.v\">\n            /// V key.\n            /// </field>\n            v: 86,\n\n            /// <field locid=\"WinJS.Utilities.Key.w\" helpKeyword=\"WinJS.Utilities.Key.w\">\n            /// W key.\n            /// </field>\n            w: 87,\n\n            /// <field locid=\"WinJS.Utilities.Key.x\" helpKeyword=\"WinJS.Utilities.Key.x\">\n            /// X key.\n            /// </field>\n            x: 88,\n\n            /// <field locid=\"WinJS.Utilities.Key.y\" helpKeyword=\"WinJS.Utilities.Key.y\">\n            /// Y key.\n            /// </field>\n            y: 89,\n\n            /// <field locid=\"WinJS.Utilities.Key.z\" helpKeyword=\"WinJS.Utilities.Key.z\">\n            /// Z key.\n            /// </field>\n            z: 90,\n\n            /// <field locid=\"WinJS.Utilities.Key.leftWindows\" helpKeyword=\"WinJS.Utilities.Key.leftWindows\">\n            /// Left Windows key.\n            /// </field>\n            leftWindows: 91,\n\n            /// <field locid=\"WinJS.Utilities.Key.rightWindows\" helpKeyword=\"WinJS.Utilities.Key.rightWindows\">\n            /// Right Windows key.\n            /// </field>\n            rightWindows: 92,\n\n            /// <field locid=\"WinJS.Utilities.Key.menu\" helpKeyword=\"WinJS.Utilities.Key.menu\">\n            /// Menu key.\n            /// </field>\n            menu: 93,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad0\" helpKeyword=\"WinJS.Utilities.Key.numPad0\">\n            /// Number pad 0 key.\n            /// </field>\n            numPad0: 96,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad1\" helpKeyword=\"WinJS.Utilities.Key.numPad1\">\n            /// Number pad 1 key.\n            /// </field>\n            numPad1: 97,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad2\" helpKeyword=\"WinJS.Utilities.Key.numPad2\">\n            /// Number pad 2 key.\n            /// </field>\n            numPad2: 98,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad3\" helpKeyword=\"WinJS.Utilities.Key.numPad3\">\n            /// Number pad 3 key.\n            /// </field>\n            numPad3: 99,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad4\" helpKeyword=\"WinJS.Utilities.Key.numPad4\">\n            /// Number pad 4 key.\n            /// </field>\n            numPad4: 100,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad5\" helpKeyword=\"WinJS.Utilities.Key.numPad5\">\n            /// Number pad 5 key.\n            /// </field>\n            numPad5: 101,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad6\" helpKeyword=\"WinJS.Utilities.Key.numPad6\">\n            /// Number pad 6 key.\n            /// </field>\n            numPad6: 102,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad7\" helpKeyword=\"WinJS.Utilities.Key.numPad7\">\n            /// Number pad 7 key.\n            /// </field>\n            numPad7: 103,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad8\" helpKeyword=\"WinJS.Utilities.Key.numPad8\">\n            /// Number pad 8 key.\n            /// </field>\n            numPad8: 104,\n\n            /// <field locid=\"WinJS.Utilities.Key.numPad9\" helpKeyword=\"WinJS.Utilities.Key.numPad9\">\n            /// Number pad 9 key.\n            /// </field>\n            numPad9: 105,\n\n            /// <field locid=\"WinJS.Utilities.Key.multiply\" helpKeyword=\"WinJS.Utilities.Key.multiply\">\n            /// Multiplication key.\n            /// </field>\n            multiply: 106,\n\n            /// <field locid=\"WinJS.Utilities.Key.add\" helpKeyword=\"WinJS.Utilities.Key.add\">\n            /// Addition key.\n            /// </field>\n            add: 107,\n\n            /// <field locid=\"WinJS.Utilities.Key.subtract\" helpKeyword=\"WinJS.Utilities.Key.subtract\">\n            /// Subtraction key.\n            /// </field>\n            subtract: 109,\n\n            /// <field locid=\"WinJS.Utilities.Key.decimalPoint\" helpKeyword=\"WinJS.Utilities.Key.decimalPoint\">\n            /// Decimal point key.\n            /// </field>\n            decimalPoint: 110,\n\n            /// <field locid=\"WinJS.Utilities.Key.divide\" helpKeyword=\"WinJS.Utilities.Key.divide\">\n            /// Division key.\n            /// </field>\n            divide: 111,\n\n            /// <field locid=\"WinJS.Utilities.Key.F1\" helpKeyword=\"WinJS.Utilities.Key.F1\">\n            /// F1 key.\n            /// </field>\n            F1: 112,\n\n            /// <field locid=\"WinJS.Utilities.Key.F2\" helpKeyword=\"WinJS.Utilities.Key.F2\">\n            /// F2 key.\n            /// </field>\n            F2: 113,\n\n            /// <field locid=\"WinJS.Utilities.Key.F3\" helpKeyword=\"WinJS.Utilities.Key.F3\">\n            /// F3 key.\n            /// </field>\n            F3: 114,\n\n            /// <field locid=\"WinJS.Utilities.Key.F4\" helpKeyword=\"WinJS.Utilities.Key.F4\">\n            /// F4 key.\n            /// </field>\n            F4: 115,\n\n            /// <field locid=\"WinJS.Utilities.Key.F5\" helpKeyword=\"WinJS.Utilities.Key.F5\">\n            /// F5 key.\n            /// </field>\n            F5: 116,\n\n            /// <field locid=\"WinJS.Utilities.Key.F6\" helpKeyword=\"WinJS.Utilities.Key.F6\">\n            /// F6 key.\n            /// </field>\n            F6: 117,\n\n            /// <field locid=\"WinJS.Utilities.Key.F7\" helpKeyword=\"WinJS.Utilities.Key.F7\">\n            /// F7 key.\n            /// </field>\n            F7: 118,\n\n            /// <field locid=\"WinJS.Utilities.Key.F8\" helpKeyword=\"WinJS.Utilities.Key.F8\">\n            /// F8 key.\n            /// </field>\n            F8: 119,\n\n            /// <field locid=\"WinJS.Utilities.Key.F9\" helpKeyword=\"WinJS.Utilities.Key.F9\">\n            /// F9 key.\n            /// </field>\n            F9: 120,\n\n            /// <field locid=\"WinJS.Utilities.Key.F10\" helpKeyword=\"WinJS.Utilities.Key.F10\">\n            /// F10 key.\n            /// </field>\n            F10: 121,\n\n            /// <field locid=\"WinJS.Utilities.Key.F11\" helpKeyword=\"WinJS.Utilities.Key.F11\">\n            /// F11 key.\n            /// </field>\n            F11: 122,\n\n            /// <field locid=\"WinJS.Utilities.Key.F12\" helpKeyword=\"WinJS.Utilities.Key.F12\">\n            /// F12 key.\n            /// </field>\n            F12: 123,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationView\" helpKeyword=\"WinJS.Utilities.Key.NavigationView\">\n            /// XBox One Remote NavigationView key.\n            /// </field>\n            NavigationView: 136,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationMenu\" helpKeyword=\"WinJS.Utilities.Key.NavigationMenu\">\n            /// XBox One Remote NavigationMenu key.\n            /// </field>\n            NavigationMenu: 137,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationUp\" helpKeyword=\"WinJS.Utilities.Key.NavigationUp\">\n            /// XBox One Remote NavigationUp key.\n            /// </field>\n            NavigationUp: 138,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationDown\" helpKeyword=\"WinJS.Utilities.Key.NavigationDown\">\n            /// XBox One Remote NavigationDown key.\n            /// </field>\n            NavigationDown: 139,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationLeft\" helpKeyword=\"WinJS.Utilities.Key.NavigationLeft\">\n            /// XBox One Remote NavigationLeft key.\n            /// </field>\n            NavigationLeft: 140,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationRight\" helpKeyword=\"WinJS.Utilities.Key.NavigationRight\">\n            /// XBox One Remote NavigationRight key.\n            /// </field>\n            NavigationRight: 141,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationAccept\" helpKeyword=\"WinJS.Utilities.Key.NavigationAccept\">\n            /// XBox One Remote NavigationAccept key.\n            /// </field>\n            NavigationAccept: 142,\n\n            /// <field locid=\"WinJS.Utilities.Key.NavigationCancel\" helpKeyword=\"WinJS.Utilities.Key.NavigationCancel\">\n            /// XBox One Remote NavigationCancel key.\n            /// </field>\n            NavigationCancel: 143,\n\n            /// <field locid=\"WinJS.Utilities.Key.numLock\" helpKeyword=\"WinJS.Utilities.Key.numLock\">\n            /// NUMBER LOCK key.\n            /// </field>\n            numLock: 144,\n\n            /// <field locid=\"WinJS.Utilities.Key.scrollLock\" helpKeyword=\"WinJS.Utilities.Key.scrollLock\">\n            /// SCROLL LOCK key.\n            /// </field>\n            scrollLock: 145,\n\n            /// <field locid=\"WinJS.Utilities.Key.browserBack\" helpKeyword=\"WinJS.Utilities.Key.browserBack\">\n            /// Browser back key.\n            /// </field>\n            browserBack: 166,\n\n            /// <field locid=\"WinJS.Utilities.Key.browserForward\" helpKeyword=\"WinJS.Utilities.Key.browserForward\">\n            /// Browser forward key.\n            /// </field>\n            browserForward: 167,\n\n            /// <field locid=\"WinJS.Utilities.Key.semicolon\" helpKeyword=\"WinJS.Utilities.Key.semicolon\">\n            /// SEMICOLON key.\n            /// </field>\n            semicolon: 186,\n\n            /// <field locid=\"WinJS.Utilities.Key.equal\" helpKeyword=\"WinJS.Utilities.Key.equal\">\n            /// EQUAL key.\n            /// </field>\n            equal: 187,\n\n            /// <field locid=\"WinJS.Utilities.Key.comma\" helpKeyword=\"WinJS.Utilities.Key.comma\">\n            /// COMMA key.\n            /// </field>\n            comma: 188,\n\n            /// <field locid=\"WinJS.Utilities.Key.dash\" helpKeyword=\"WinJS.Utilities.Key.dash\">\n            /// DASH key.\n            /// </field>\n            dash: 189,\n\n            /// <field locid=\"WinJS.Utilities.Key.period\" helpKeyword=\"WinJS.Utilities.Key.period\">\n            /// PERIOD key.\n            /// </field>\n            period: 190,\n\n            /// <field locid=\"WinJS.Utilities.Key.forwardSlash\" helpKeyword=\"WinJS.Utilities.Key.forwardSlash\">\n            /// FORWARD SLASH key.\n            /// </field>\n            forwardSlash: 191,\n\n            /// <field locid=\"WinJS.Utilities.Key.graveAccent\" helpKeyword=\"WinJS.Utilities.Key.graveAccent\">\n            /// Accent grave key.\n            /// </field>\n            graveAccent: 192,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadA\" helpKeyword=\"WinJS.Utilities.Key.GamepadA\">\n            /// XBox One GamepadA key.\n            /// </field>\n            GamepadA: 195,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadB\" helpKeyword=\"WinJS.Utilities.Key.GamepadB\">\n            /// XBox One GamepadB key.\n            /// </field>\n            GamepadB: 196,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadX\" helpKeyword=\"WinJS.Utilities.Key.GamepadX\">\n            /// XBox One GamepadX key.\n            /// </field>\n            GamepadX: 197,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadY\" helpKeyword=\"WinJS.Utilities.Key.GamepadY\">\n            /// XBox One GamepadY key.\n            /// </field>\n            GamepadY: 198,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightShoulder\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightShoulder\">\n            /// XBox One GamepadRightShoulder key.\n            /// </field>\n            GamepadRightShoulder: 199,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftShoulder\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftShoulder\">\n            /// XBox One GamepadLeftShoulder key.\n            /// </field>\n            GamepadLeftShoulder: 200,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftTrigger\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftTrigger\">\n            /// XBox One GamepadLeftTrigger key.\n            /// </field>\n            GamepadLeftTrigger: 201,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightTrigger\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightTrigger\">\n            /// XBox One GamepadRightTrigger key.\n            /// </field>\n            GamepadRightTrigger: 202,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadDPadUp\" helpKeyword=\"WinJS.Utilities.Key.GamepadDPadUp\">\n            /// XBox One GamepadDPadUp key.\n            /// </field>\n            GamepadDPadUp: 203,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadDPadDown\" helpKeyword=\"WinJS.Utilities.Key.GamepadDPadDown\">\n            /// XBox One GamepadDPadDown key.\n            /// </field>\n            GamepadDPadDown: 204,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadDPadLeft\" helpKeyword=\"WinJS.Utilities.Key.GamepadDPadLeft\">\n            /// XBox One GamepadDPadLeft key.\n            /// </field>\n            GamepadDPadLeft: 205,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadDPadRight\" helpKeyword=\"WinJS.Utilities.Key.GamepadDPadRight\">\n            /// XBox One GamepadDPadRight key.\n            /// </field>\n            GamepadDPadRight: 206,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadMenu\" helpKeyword=\"WinJS.Utilities.Key.GamepadMenu\">\n            /// XBox One GamepadMenu key.\n            /// </field>\n            GamepadMenu: 207,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadView\" helpKeyword=\"WinJS.Utilities.Key.GamepadView\">\n            /// XBox One GamepadView key.\n            /// </field>\n            GamepadView: 208,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftThumbstick\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftThumbstick\">\n            /// XBox One GamepadLeftThumbstick key.\n            /// </field>\n            GamepadLeftThumbstick: 209,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightThumbstick\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightThumbstick\">\n            /// XBox One GamepadRightThumbstick key.\n            /// </field>\n            GamepadRightThumbstick: 210,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftThumbstickUp\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftThumbstickUp\">\n            /// XBox One GamepadLeftThumbstickUp key.\n            /// </field>\n            GamepadLeftThumbstickUp: 211,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftThumbstickDown\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftThumbstickDown\">\n            /// XBox One GamepadLeftThumbstickDown key.\n            /// </field>\n            GamepadLeftThumbstickDown: 212,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftThumbstickRight\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftThumbstickRight\">\n            /// XBox One GamepadLeftThumbstickRight key.\n            /// </field>\n            GamepadLeftThumbstickRight: 213,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadLeftThumbstickLeft\" helpKeyword=\"WinJS.Utilities.Key.GamepadLeftThumbstickLeft\">\n            /// XBox One GamepadLeftThumbstickLeft key.\n            /// </field>\n            GamepadLeftThumbstickLeft: 214,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightThumbstickUp\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightThumbstickUp\">\n            /// XBox One GamepadRightThumbstickUp key.\n            /// </field>\n            GamepadRightThumbstickUp: 215,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightThumbstickDown\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightThumbstickDown\">\n            /// XBox One GamepadRightThumbstickDown key.\n            /// </field>\n            GamepadRightThumbstickDown: 216,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightThumbstickRight\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightThumbstickRight\">\n            /// XBox One GamepadRightThumbstickRight key.\n            /// </field>\n            GamepadRightThumbstickRight: 217,\n\n            /// <field locid=\"WinJS.Utilities.Key.GamepadRightThumbstickLeft\" helpKeyword=\"WinJS.Utilities.Key.GamepadRightThumbstickLeft\">\n            /// XBox One GamepadRightThumbstickLeft key.\n            /// </field>\n            GamepadRightThumbstickLeft: 218,\n\n            /// <field locid=\"WinJS.Utilities.Key.openBracket\" helpKeyword=\"WinJS.Utilities.Key.openBracket\">\n            /// OPEN BRACKET key.\n            /// </field>\n            openBracket: 219,\n\n            /// <field locid=\"WinJS.Utilities.Key.backSlash\" helpKeyword=\"WinJS.Utilities.Key.backSlash\">\n            /// BACKSLASH key.\n            /// </field>\n            backSlash: 220,\n\n            /// <field locid=\"WinJS.Utilities.Key.closeBracket\" helpKeyword=\"WinJS.Utilities.Key.closeBracket\">\n            /// CLOSE BRACKET key.\n            /// </field>\n            closeBracket: 221,\n\n            /// <field locid=\"WinJS.Utilities.Key.singleQuote\" helpKeyword=\"WinJS.Utilities.Key.singleQuote\">\n            /// SINGLE QUOTE key.\n            /// </field>\n            singleQuote: 222,\n\n            /// <field locid=\"WinJS.Utilities.Key.IME\" helpKeyword=\"WinJS.Utilities.Key.IME\">\n            /// Any IME input.\n            /// </field>\n            IME: 229\n        },\n\n        data: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.data\">\n            /// <summary locid=\"WinJS.Utilities.data\">\n            /// Gets the data value associated with the specified element.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.data_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Utilities.data_returnValue\">\n            /// The value associated with the element.\n            /// </returns>\n            /// </signature>\n            if (!element[_dataKey]) {\n                element[_dataKey] = {};\n            }\n            return element[_dataKey];\n        },\n\n        hasClass: function (e, name) {\n            /// <signature helpKeyword=\"WinJS.Utilities.hasClass\">\n            /// <summary locid=\"WinJS.Utilities.hasClass\">\n            /// Determines whether the specified element has the specified class.\n            /// </summary>\n            /// <param name=\"e\" type=\"HTMLElement\" locid=\"WinJS.Utilities.hasClass_p:e\">\n            /// The element.\n            /// </param>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.hasClass_p:name\">\n            /// The name of the class.\n            /// </param>\n            /// <returns type=\"Boolean\" locid=\"WinJS.Utilities.hasClass_returnValue\">\n            /// true if the specified element contains the specified class; otherwise, false.\n            /// </returns>\n            /// </signature>\n\n            if (e.classList) {\n                return e.classList.contains(name);\n            } else {\n                var className = getClassName(e);\n                var names = className.trim().split(\" \");\n                var l = names.length;\n                for (var i = 0; i < l; i++) {\n                    if (names[i] === name) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        },\n\n        addClass: addClass,\n\n        removeClass: removeClass,\n\n        toggleClass: toggleClass,\n\n        _setAttribute: setAttribute,\n\n        getRelativeLeft: function (element, parent) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getRelativeLeft\">\n            /// <summary locid=\"WinJS.Utilities.getRelativeLeft\">\n            /// Gets the left coordinate of the specified element relative to the specified parent.\n            /// </summary>\n            /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.Utilities.getRelativeLeft_p:element\">\n            /// The element.\n            /// </param>\n            /// <param name=\"parent\" domElement=\"true\" locid=\"WinJS.Utilities.getRelativeLeft_p:parent\">\n            /// The parent element.\n            /// </param>\n            /// <returns type=\"Number\" locid=\"WinJS.Utilities.getRelativeLeft_returnValue\">\n            /// The relative left coordinate.\n            /// </returns>\n            /// </signature>\n            if (!element) {\n                return 0;\n            }\n\n            var left = element.offsetLeft;\n            var e = element.parentNode;\n            while (e) {\n                left -= e.offsetLeft;\n\n                if (e === parent) {\n                    break;\n                }\n                e = e.parentNode;\n            }\n\n            return left;\n        },\n\n        getRelativeTop: function (element, parent) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getRelativeTop\">\n            /// <summary locid=\"WinJS.Utilities.getRelativeTop\">\n            /// Gets the top coordinate of the element relative to the specified parent.\n            /// </summary>\n            /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.Utilities.getRelativeTop_p:element\">\n            /// The element.\n            /// </param>\n            /// <param name=\"parent\" domElement=\"true\" locid=\"WinJS.Utilities.getRelativeTop_p:parent\">\n            /// The parent element.\n            /// </param>\n            /// <returns type=\"Number\" locid=\"WinJS.Utilities.getRelativeTop_returnValue\">\n            /// The relative top coordinate.\n            /// </returns>\n            /// </signature>\n            if (!element) {\n                return 0;\n            }\n\n            var top = element.offsetTop;\n            var e = element.parentNode;\n            while (e) {\n                top -= e.offsetTop;\n\n                if (e === parent) {\n                    break;\n                }\n                e = e.parentNode;\n            }\n\n            return top;\n        },\n\n        getScrollPosition: getScrollPosition,\n\n        setScrollPosition: setScrollPosition,\n\n        empty: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.empty\">\n            /// <summary locid=\"WinJS.Utilities.empty\">\n            /// Removes all the child nodes from the specified element.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.Utilities.empty_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"HTMLElement\" locid=\"WinJS.Utilities.empty_returnValue\">\n            /// The element.\n            /// </returns>\n            /// </signature>\n            if (element.childNodes && element.childNodes.length > 0) {\n                for (var i = element.childNodes.length - 1; i >= 0; i--) {\n                    element.removeChild(element.childNodes.item(i));\n                }\n            }\n            return element;\n        },\n\n        _isDOMElement: function (element) {\n            return element &&\n                typeof element === \"object\" &&\n                typeof element.tagName === \"string\";\n        },\n\n        getContentWidth: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getContentWidth\">\n            /// <summary locid=\"WinJS.Utilities.getContentWidth\">\n            /// Gets the width of the content of the specified element. The content width does not include borders or padding.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.getContentWidth_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Number\" locid=\"WinJS.Utilities.getContentWidth_returnValue\">\n            /// The content width of the element.\n            /// </returns>\n            /// </signature>\n            var border = getDimension(element, \"borderLeftWidth\") + getDimension(element, \"borderRightWidth\"),\n                padding = getDimension(element, \"paddingLeft\") + getDimension(element, \"paddingRight\");\n            return element.offsetWidth - border - padding;\n        },\n        _getPreciseContentWidth: function (element) {\n            var border = _getPreciseDimension(element, \"borderLeftWidth\") + _getPreciseDimension(element, \"borderRightWidth\"),\n                padding = _getPreciseDimension(element, \"paddingLeft\") + _getPreciseDimension(element, \"paddingRight\");\n            return element.offsetWidth - border - padding;\n        },\n\n        getTotalWidth: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getTotalWidth\">\n            /// <summary locid=\"WinJS.Utilities.getTotalWidth\">\n            /// Gets the width of the element, including margins.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.getTotalWidth_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Number\" locid=\"WinJS.Utilities.getTotalWidth_returnValue\">\n            /// The width of the element including margins.\n            /// </returns>\n            /// </signature>\n            var margin = getDimension(element, \"marginLeft\") + getDimension(element, \"marginRight\");\n            return element.offsetWidth + margin;\n        },\n        _getPreciseTotalWidth: function (element) {\n            var margin = _getPreciseDimension(element, \"marginLeft\") + _getPreciseDimension(element, \"marginRight\");\n            return element.offsetWidth + margin;\n        },\n\n        getContentHeight: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getContentHeight\">\n            /// <summary locid=\"WinJS.Utilities.getContentHeight\">\n            /// Gets the height of the content of the specified element. The content height does not include borders or padding.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.getContentHeight_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Utilities.getContentHeight_returnValue\">\n            /// The content height of the element.\n            /// </returns>\n            /// </signature>\n            var border = getDimension(element, \"borderTopWidth\") + getDimension(element, \"borderBottomWidth\"),\n                padding = getDimension(element, \"paddingTop\") + getDimension(element, \"paddingBottom\");\n            return element.offsetHeight - border - padding;\n        },\n        _getPreciseContentHeight: function (element) {\n            var border = _getPreciseDimension(element, \"borderTopWidth\") + _getPreciseDimension(element, \"borderBottomWidth\"),\n                padding = _getPreciseDimension(element, \"paddingTop\") + _getPreciseDimension(element, \"paddingBottom\");\n            return element.offsetHeight - border - padding;\n        },\n\n        getTotalHeight: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getTotalHeight\">\n            /// <summary locid=\"WinJS.Utilities.getTotalHeight\">\n            /// Gets the height of the element, including its margins.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.getTotalHeight_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Number\" locid=\"WinJS.Utilities.getTotalHeight_returnValue\">\n            /// The height of the element including margins.\n            /// </returns>\n            /// </signature>\n            var margin = getDimension(element, \"marginTop\") + getDimension(element, \"marginBottom\");\n            return element.offsetHeight + margin;\n        },\n        _getPreciseTotalHeight: function (element) {\n            var margin = _getPreciseDimension(element, \"marginTop\") + _getPreciseDimension(element, \"marginBottom\");\n            return element.offsetHeight + margin;\n        },\n\n        getPosition: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getPosition\">\n            /// <summary locid=\"WinJS.Utilities.getPosition\">\n            /// Gets the position of the specified element.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.getPosition_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Utilities.getPosition_returnValue\">\n            /// An object that contains the left, top, width and height properties of the element.\n            /// </returns>\n            /// </signature>\n            return exports._getPositionRelativeTo(element, null);\n        },\n\n        getTabIndex: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.getTabIndex\">\n            /// <summary locid=\"WinJS.Utilities.getTabIndex\">\n            /// Gets the tabIndex of the specified element.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.getTabIndex_p:element\">\n            /// The element.\n            /// </param>\n            /// <returns type=\"Number\" locid=\"WinJS.Utilities.getTabIndex_returnValue\">\n            /// The tabIndex of the element. Returns -1 if the element cannot be tabbed to\n            /// </returns>\n            /// </signature>\n            // For reference: http://www.w3.org/html/wg/drafts/html/master/single-page.html#specially-focusable\n            var tabbableElementsRE = /BUTTON|COMMAND|MENUITEM|OBJECT|SELECT|TEXTAREA/;\n            if (element.disabled) {\n                return -1;\n            }\n            var tabIndex = element.getAttribute(\"tabindex\");\n            if (tabIndex === null || tabIndex === undefined) {\n                var name = element.tagName;\n                if (tabbableElementsRE.test(name) ||\n                    (element.href && (name === \"A\" || name === \"AREA\" || name === \"LINK\")) ||\n                    (name === \"INPUT\" && element.type !== \"hidden\") ||\n                    (name === \"TH\" && element.sorted)) {\n                    return 0;\n                }\n                return -1;\n            }\n            return parseInt(tabIndex, 10);\n        },\n\n        convertToPixels: convertToPixels,\n        _convertToPrecisePixels: _convertToPrecisePixels,\n        _getPreciseMargins: _getPreciseMargins,\n\n\n        eventWithinElement: function (element, event) {\n            /// <signature helpKeyword=\"WinJS.Utilities.eventWithinElement\">\n            /// <summary locid=\"WinJS.Utilities.eventWithinElement\">\n            /// Determines whether the specified event occurred within the specified element.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.eventWithinElement_p:element\">\n            /// The element.\n            /// </param>\n            /// <param name=\"event\" type=\"Event\" locid=\"WinJS.Utilities.eventWithinElement_p:event\">\n            /// The event.\n            /// </param>\n            /// <returns type=\"Boolean\" locid=\"WinJS.Utilities.eventWithinElement_returnValue\">\n            /// true if the event occurred within the element; otherwise, false.\n            /// </returns>\n            /// </signature>\n            var related = event.relatedTarget;\n            if (related && related !== element) {\n                return element.contains(related);\n            }\n\n            return false;\n        },\n\n        //UI Utilities\n        _deprecated: function (message) {\n            _Global.console && _Global.console.warn(message);\n        },\n\n        // Take a renderer which may be a function (signature: (data) => element) or a WinJS.Binding.Template\n        //  and return a function with a unified synchronous contract which is:\n        //\n        //  (data, container) => element\n        //\n        // Where:\n        //\n        //  1) if you pass container the content will be rendered into the container and the\n        //     container will be returned.\n        //\n        //  2) if you don't pass a container the content will be rendered and returned.\n        //\n        _syncRenderer: function (renderer, tagName) {\n            tagName = tagName || \"div\";\n            if (typeof renderer === \"function\") {\n                return function (data, container) {\n                    if (container) {\n                        container.appendChild(renderer(data));\n                        return container;\n                    } else {\n                        return renderer(data);\n                    }\n                };\n            }\n\n            var template;\n            if (typeof renderer.render === \"function\") {\n                template = renderer;\n            } else if (renderer.winControl && typeof renderer.winControl.render === \"function\") {\n                template = renderer.winControl;\n            }\n\n            return function (data, container) {\n                var host = container || _Global.document.createElement(tagName);\n                template.render(data, host);\n                if (container) {\n                    return container;\n                } else {\n                    // The expectation is that the creation of the DOM elements happens synchronously\n                    //  and as such we steal the first child and make it the root element.\n                    //\n                    var element = host.firstElementChild;\n\n                    // Because we have changed the \"root\" we may need to move the dispose method\n                    //  created by the template to the child and do a little switcheroo on dispose.\n                    //\n                    if (element && host.dispose) {\n                        var prev = element.dispose;\n                        element.dispose = function () {\n                            element.dispose = prev;\n                            host.appendChild(element);\n                            host.dispose();\n                        };\n                    }\n                    return element;\n                }\n            };\n        },\n\n        _getPositionRelativeTo: function Utilities_getPositionRelativeTo(element, ancestor) {\n            var fromElement = element,\n                offsetParent = element.offsetParent,\n                top = element.offsetTop,\n                left = element.offsetLeft;\n\n            while ((element = element.parentNode) &&\n                    element !== ancestor &&\n                    element !== _Global.document.body &&\n                    element !== _Global.document.documentElement) {\n                top -= element.scrollTop;\n                var dir = _Global.document.defaultView.getComputedStyle(element, null).direction;\n                left -= dir !== \"rtl\" ? element.scrollLeft : -getAdjustedScrollPosition(element).scrollLeft;\n\n                if (element === offsetParent) {\n                    top += element.offsetTop;\n                    left += element.offsetLeft;\n                    offsetParent = element.offsetParent;\n                }\n            }\n\n            return {\n                left: left,\n                top: top,\n                width: fromElement.offsetWidth,\n                height: fromElement.offsetHeight\n            };\n        },\n\n        // *element* is not included in the tabIndex search\n        _getHighAndLowTabIndices: function Utilities_getHighAndLowTabIndices(element) {\n            var descendants = element.getElementsByTagName(\"*\");\n            var lowestTabIndex = 0;\n            var highestTabIndex = 0;\n            // tabIndex=0 is the highest (considered higher than positive tab indices) so\n            // we can stop searching for a higher tab index once we find tabIndex=0.\n            var foundTabIndex0 = false;\n            for (var i = 0, len = descendants.length; i < len; i++) {\n                var tabIndexStr = descendants[i].getAttribute(\"tabIndex\");\n                if (tabIndexStr !== null && tabIndexStr !== undefined) {\n                    var tabIndex = parseInt(tabIndexStr, 10);\n                    // Update lowest\n                    if (tabIndex > 0 && (tabIndex < lowestTabIndex || lowestTabIndex === 0)) {\n                        lowestTabIndex = tabIndex;\n                    }\n                    // Update highest\n                    if (!foundTabIndex0) {\n                        if (tabIndex === 0) {\n                            foundTabIndex0 = true;\n                            highestTabIndex = 0;\n                        } else if (tabIndex > highestTabIndex) {\n                            highestTabIndex = tabIndex;\n                        }\n                    }\n                }\n            }\n\n            return {\n                highest: highestTabIndex,\n                lowest: lowestTabIndex\n            };\n        },\n\n        _getLowestTabIndexInList: function Utilities_getLowestTabIndexInList(elements) {\n            // Returns the lowest positive tabIndex in a list of elements.\n            // Returns 0 if there are no positive tabIndices.\n            var lowestTabIndex = 0;\n            var elmTabIndex;\n            for (var i = 0; i < elements.length; i++) {\n                elmTabIndex = parseInt(elements[i].getAttribute(\"tabIndex\"), 10);\n                if ((0 < elmTabIndex)\n                 && ((elmTabIndex < lowestTabIndex) || !lowestTabIndex)) {\n                    lowestTabIndex = elmTabIndex;\n                }\n            }\n\n            return lowestTabIndex;\n        },\n\n        _getHighestTabIndexInList: function Utilities_getHighestTabIndexInList(elements) {\n            // Returns 0 if any element is explicitly set to 0. (0 is the highest tabIndex)\n            // Returns the highest tabIndex in the list of elements.\n            // Returns 0 if there are no positive tabIndices.\n            var highestTabIndex = 0;\n            var elmTabIndex;\n            for (var i = 0; i < elements.length; i++) {\n                elmTabIndex = parseInt(elements[i].getAttribute(\"tabIndex\"), 10);\n                if (elmTabIndex === 0) {\n                    return elmTabIndex;\n                } else if (highestTabIndex < elmTabIndex) {\n                    highestTabIndex = elmTabIndex;\n                }\n            }\n\n            return highestTabIndex;\n        },\n\n        _hasCursorKeysBehaviors: function Utilities_hasCursorKeysBehaviors(element) {\n            if (element.tagName === \"SELECT\" ||\n                element.tagName === \"TEXTAREA\") {\n                return true;\n            }\n            if (element.tagName === \"INPUT\") {\n                return element.type === \"\" ||\n                    element.type === \"date\" ||\n                    element.type === \"datetime\" ||\n                    element.type === \"datetime-local\" ||\n                    element.type === \"email\" ||\n                    element.type === \"month\" ||\n                    element.type === \"number\" ||\n                    element.type === \"password\" ||\n                    element.type === \"range\" ||\n                    element.type === \"search\" ||\n                    element.type === \"tel\" ||\n                    element.type === \"text\" ||\n                    element.type === \"time\" ||\n                    element.type === \"url\" ||\n                    element.type === \"week\";\n            }\n            return false;\n        },\n\n        _reparentChildren: function (originalParent, destinationParent) {\n            var child = originalParent.firstChild;\n            while (child) {\n                var sibling = child.nextSibling;\n                destinationParent.appendChild(child);\n                child = sibling;\n            }\n        },\n\n        // Ensures that the same element has focus before and after *callback* is\n        // called. Useful if moving focus is an unintentional side effect of *callback*.\n        // For example, this could happen if *callback* removes and reinserts elements\n        // to the DOM.\n        _maintainFocus: function ElementUtilities_maintainFocus(callback) {\n            var focusedElement = _Global.document.activeElement;\n            callback();\n            exports._trySetActiveOnAnyElement(focusedElement);\n        },\n        \n        // Tries to give focus to an element (even if its tabIndex is -1) via setActive.\n        _trySetActiveOnAnyElement: function Utilities_trySetActiveOnAnyElement(element, scroller) {\n            return exports._tryFocusOnAnyElement(element, true, scroller);\n        },\n        \n        // Tries to give focus to an element (even if its tabIndex is -1).\n        _tryFocusOnAnyElement: function Utilities_tryFocusOnAnyElement(element, useSetActive, scroller) {\n            var previousActiveElement = _Global.document.activeElement;\n\n            if (element === previousActiveElement) {\n                return true;\n            }\n            \n            if (useSetActive) {\n                exports._setActive(element, scroller);\n            } else {\n                element.focus();\n            }\n            \n            return previousActiveElement !== _Global.document.activeElement;\n        },\n        \n        // Tries to give focus to an element which is a tabstop (i.e. tabIndex >= 0)\n        // via setActive.\n        _trySetActive: function Utilities_trySetActive(elem, scroller) {\n            return this._tryFocus(elem, true, scroller);\n        },\n        \n        // Tries to give focus to an element which is a tabstop (i.e. tabIndex >= 0).\n        _tryFocus: function Utilities_tryFocus(elem, useSetActive, scroller) {\n            var previousActiveElement = _Global.document.activeElement;\n\n            if (elem === previousActiveElement) {\n                return true;\n            }\n\n            var simpleLogicForValidTabStop = (exports.getTabIndex(elem) >= 0);\n            if (!simpleLogicForValidTabStop) {\n                return false;\n            }\n\n            if (useSetActive) {\n                exports._setActive(elem, scroller);\n            } else {\n                elem.focus();\n            }\n\n            if (previousActiveElement !== _Global.document.activeElement) {\n                return true;\n            }\n            return false;\n        },\n\n        _setActiveFirstFocusableElement: function Utilities_setActiveFirstFocusableElement(rootEl, scroller) {\n            return this._focusFirstFocusableElement(rootEl, true, scroller);\n        },\n\n        _focusFirstFocusableElement: function Utilities_focusFirstFocusableElement(rootEl, useSetActive, scroller) {\n            var _elms = rootEl.getElementsByTagName(\"*\");\n\n            // Get the tabIndex set to the firstDiv (which is the lowest)\n            var _lowestTabIndex = this._getLowestTabIndexInList(_elms);\n            var _nextLowestTabIndex = 0;\n\n            // If there are positive tabIndices, set focus to the element with the lowest tabIndex.\n            // Keep trying with the next lowest tabIndex until all tabIndices have been exhausted.\n            // Otherwise set focus to the first focusable element in DOM order.\n            var i;\n            while (_lowestTabIndex) {\n                for (i = 0; i < _elms.length; i++) {\n                    if (_elms[i].tabIndex === _lowestTabIndex) {\n                        if (this._tryFocus(_elms[i], useSetActive, scroller)) {\n                            return true;\n                        }\n                    } else if ((_lowestTabIndex < _elms[i].tabIndex)\n                            && ((_elms[i].tabIndex < _nextLowestTabIndex) || (_nextLowestTabIndex === 0))) {\n                        // Here if _lowestTabIndex < _elms[i].tabIndex < _nextLowestTabIndex\n                        _nextLowestTabIndex = _elms[i].tabIndex;\n                    }\n                }\n\n                // We weren't able to set focus to anything at that tabIndex\n                // If we found a higher valid tabIndex, try that now\n                _lowestTabIndex = _nextLowestTabIndex;\n                _nextLowestTabIndex = 0;\n            }\n\n            // Wasn't able to set focus to anything with a positive tabIndex, try everything now.\n            // This is where things with tabIndex of 0 will be tried.\n            for (i = 0; i < _elms.length; i++) {\n                if (this._tryFocus(_elms[i], useSetActive, scroller)) {\n                    return true;\n                }\n            }\n\n            return false;\n        },\n\n        _setActiveLastFocusableElement: function Utilities_setActiveLastFocusableElement(rootEl, scroller) {\n            return this._focusLastFocusableElement(rootEl, true, scroller);\n        },\n\n        _focusLastFocusableElement: function Utilities_focusLastFocusableElement(rootEl, useSetActive, scroller) {\n            var _elms = rootEl.getElementsByTagName(\"*\");\n            // Get the tabIndex set to the finalDiv (which is the highest)\n            var _highestTabIndex = this._getHighestTabIndexInList(_elms);\n            var _nextHighestTabIndex = 0;\n\n            // Try all tabIndex 0 first. After this conditional the _highestTabIndex\n            // should be equal to the highest positive tabIndex.\n            var i;\n            if (_highestTabIndex === 0) {\n                for (i = _elms.length - 1; i >= 0; i--) {\n                    if (_elms[i].tabIndex === _highestTabIndex) {\n                        if (this._tryFocus(_elms[i], useSetActive, scroller)) {\n                            return true;\n                        }\n                    } else if (_nextHighestTabIndex < _elms[i].tabIndex) {\n                        _nextHighestTabIndex = _elms[i].tabIndex;\n                    }\n                }\n\n                _highestTabIndex = _nextHighestTabIndex;\n                _nextHighestTabIndex = 0;\n            }\n\n            // If there are positive tabIndices, set focus to the element with the highest tabIndex.\n            // Keep trying with the next highest tabIndex until all tabIndices have been exhausted.\n            // Otherwise set focus to the last focusable element in DOM order.\n            while (_highestTabIndex) {\n                for (i = _elms.length - 1; i >= 0; i--) {\n                    if (_elms[i].tabIndex === _highestTabIndex) {\n                        if (this._tryFocus(_elms[i], useSetActive, scroller)) {\n                            return true;\n                        }\n                    } else if ((_nextHighestTabIndex < _elms[i].tabIndex) && (_elms[i].tabIndex < _highestTabIndex)) {\n                        // Here if _nextHighestTabIndex < _elms[i].tabIndex < _highestTabIndex\n                        _nextHighestTabIndex = _elms[i].tabIndex;\n                    }\n                }\n\n                // We weren't able to set focus to anything at that tabIndex\n                // If we found a lower valid tabIndex, try that now\n                _highestTabIndex = _nextHighestTabIndex;\n                _nextHighestTabIndex = 0;\n            }\n\n            // Wasn't able to set focus to anything with a tabIndex, try everything now\n            for (i = _elms.length - 2; i > 0; i--) {\n                if (this._tryFocus(_elms[i], useSetActive, scroller)) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_Dispose',[\n    'exports',\n    '../Core/_Base',\n    '../Core/_WriteProfilerMark',\n    './_ElementUtilities'\n    ], function (exports, _Base, _WriteProfilerMark, _ElementUtilities) {\n    \"use strict\";\n\n    function markDisposable(element, disposeImpl) {\n            /// <signature helpKeyword=\"WinJS.Utilities.markDisposable\">\n            /// <summary locid=\"WinJS.Utilities.markDisposable\">\n            /// Adds the specified dispose implementation to the specified element and marks it as disposable.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.markDisposable_p:element\">\n            /// The element to mark as disposable.\n            /// </param>\n            /// <param name=\"disposeImpl\" type=\"Function\" locid=\"WinJS.Utilities.markDisposable_p:disposeImpl\">\n            /// The function containing the element-specific dispose logic that will be called by the dispose function.\n            /// </param>\n            /// </signature>\n            var disposed = false;\n            _ElementUtilities.addClass(element, \"win-disposable\");\n\n            var disposable = element.winControl || element;\n            disposable.dispose = function () {\n                if (disposed) {\n                    return;\n                }\n\n                disposed = true;\n                disposeSubTree(element);\n                if (disposeImpl) {\n                    disposeImpl();\n                }\n            };\n        }\n\n    function disposeSubTree(element) {\n        /// <signature helpKeyword=\"WinJS.Utilities.disposeSubTree\">\n        /// <summary locid=\"WinJS.Utilities.disposeSubTree\">\n        /// Disposes all first-generation disposable elements that are descendents of the specified element.\n        /// The specified element itself is not disposed.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.disposeSubTree_p:element\">\n        /// The root element whose sub-tree is to be disposed.\n        /// </param>\n        /// </signature>\n        if (!element) {\n            return;\n        }\n\n        _WriteProfilerMark(\"WinJS.Utilities.disposeSubTree,StartTM\");\n        var query = element.querySelectorAll(\".win-disposable\");\n\n        var index = 0;\n        var length = query.length;\n        while (index < length) {\n            var disposable = query[index];\n            if (disposable.winControl && disposable.winControl.dispose) {\n                disposable.winControl.dispose();\n            }\n            if (disposable.dispose) {\n                disposable.dispose();\n            }\n\n            // Skip over disposable's descendants since they are this disposable's responsibility to clean up.\n            index += disposable.querySelectorAll(\".win-disposable\").length + 1;\n        }\n        _WriteProfilerMark(\"WinJS.Utilities.disposeSubTree,StopTM\");\n    }\n\n    function _disposeElement(element) {\n        // This helper should only be used for supporting dispose scenarios predating the dispose pattern.\n        // The specified element should be well enough defined so we don't have to check whether it\n        // a) has a disposable winControl,\n        // b) is disposable itself,\n        // or has disposable descendants in which case either a) or b) must have been true when designed correctly.\n        if (!element) {\n            return;\n        }\n\n        var disposed = false;\n        if (element.winControl && element.winControl.dispose) {\n            element.winControl.dispose();\n            disposed = true;\n        }\n        if (element.dispose) {\n            element.dispose();\n            disposed = true;\n        }\n\n        if (!disposed) {\n            disposeSubTree(element);\n        }\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n\n        markDisposable: markDisposable,\n\n        disposeSubTree: disposeSubTree,\n\n        _disposeElement: _disposeElement\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/ControlProcessor/_OptionsLexer',[\n    'exports',\n    '../Core/_Base'\n    ], function optionsLexerInit(exports, _Base) {\n    \"use strict\";\n\n    /*\n\nLexical grammar is defined in ECMA-262-5, section 7.\n\nLexical productions used in this grammar defined in ECMA-262-5:\n\nProduction          Section\n--------------------------------\nIdentifier          7.6\nNullLiteral         7.8.1\nBooleanLiteral      7.8.2\nNumberLiteral       7.8.3\nStringLiteral       7.8.4\n\n*/\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _optionsLexer: _Base.Namespace._lazy(function () {\n\n            var tokenType = {\n                leftBrace: 1,           // {\n                rightBrace: 2,          // }\n                leftBracket: 3,         // [\n                rightBracket: 4,        // ]\n                separator: 5,           // ECMA-262-5, 7.2\n                colon: 6,               // :\n                semicolon: 7,           // ;\n                comma: 8,               // ,\n                dot: 9,                 // .\n                nullLiteral: 10,        // ECMA-262-5, 7.8.1 (null)\n                trueLiteral: 11,        // ECMA-262-5, 7.8.2 (true)\n                falseLiteral: 12,       // ECMA-262-5, 7.8.2 (false)\n                numberLiteral: 13,      // ECMA-262-5, 7.8.3\n                stringLiteral: 14,      // ECMA-262-5, 7.8.4\n                identifier: 15,         // ECMA-262-5, 7.6\n                reservedWord: 16,\n                thisKeyword: 17,\n                leftParentheses: 18,    // (\n                rightParentheses: 19,   // )\n                eof: 20,\n                error: 21\n            };\n            // debugging - this costs something like 20%\n            //\n            //Object.keys(tokenType).forEach(function (key) {\n            //    tokenType[key] = key.toString();\n            //});\n            var tokens = {\n                leftBrace: { type: tokenType.leftBrace, length: 1 },\n                rightBrace: { type: tokenType.rightBrace, length: 1 },\n                leftBracket: { type: tokenType.leftBracket, length: 1 },\n                rightBracket: { type: tokenType.rightBracket, length: 1 },\n                colon: { type: tokenType.colon, length: 1 },\n                semicolon: { type: tokenType.semicolon, length: 1 },\n                comma: { type: tokenType.comma, length: 1 },\n                dot: { type: tokenType.dot, length: 1 },\n                nullLiteral: { type: tokenType.nullLiteral, length: 4, value: null, keyword: true },\n                trueLiteral: { type: tokenType.trueLiteral, length: 4, value: true, keyword: true },\n                falseLiteral: { type: tokenType.falseLiteral, length: 5, value: false, keyword: true },\n                thisKeyword: { type: tokenType.thisKeyword, length: 4, value: \"this\", keyword: true },\n                leftParentheses: { type: tokenType.leftParentheses, length: 1 },\n                rightParentheses: { type: tokenType.rightParentheses, length: 1 },\n                eof: { type: tokenType.eof, length: 0 }\n            };\n\n            function reservedWord(word) {\n                return { type: tokenType.reservedWord, value: word, length: word.length, keyword: true };\n            }\n            function reservedWordLookup(identifier) {\n                // Moving from a simple object literal lookup for reserved words to this\n                // switch was worth a non-trivial performance increase (5-7%) as this path\n                // gets taken for any identifier.\n                //\n                switch (identifier.charCodeAt(0)) {\n                    case /*b*/98:\n                        switch (identifier) {\n                            case 'break':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*c*/99:\n                        switch (identifier) {\n                            case 'case':\n                            case 'catch':\n                            case 'class':\n                            case 'const':\n                            case 'continue':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*d*/100:\n                        switch (identifier) {\n                            case 'debugger':\n                            case 'default':\n                            case 'delete':\n                            case 'do':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*e*/101:\n                        switch (identifier) {\n                            case 'else':\n                            case 'enum':\n                            case 'export':\n                            case 'extends':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*f*/102:\n                        switch (identifier) {\n                            case 'false':\n                                return tokens.falseLiteral;\n\n                            case 'finally':\n                            case 'for':\n                            case 'function':\n                                return reservedWord(identifier);\n                        }\n\n                        break;\n                    case /*i*/105:\n                        switch (identifier) {\n                            case 'if':\n                            case 'import':\n                            case 'in':\n                            case 'instanceof':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*n*/110:\n                        switch (identifier) {\n                            case 'null':\n                                return tokens.nullLiteral;\n\n                            case 'new':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*r*/114:\n                        switch (identifier) {\n                            case 'return':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*s*/115:\n                        switch (identifier) {\n                            case 'super':\n                            case 'switch':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*t*/116:\n                        switch (identifier) {\n                            case 'true':\n                                return tokens.trueLiteral;\n\n                            case 'this':\n                                return tokens.thisKeyword;\n\n                            case 'throw':\n                            case 'try':\n                            case 'typeof':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*v*/118:\n                        switch (identifier) {\n                            case 'var':\n                            case 'void':\n                                return reservedWord(identifier);\n                        }\n                        break;\n\n                    case /*w*/119:\n                        switch (identifier) {\n                            case 'while':\n                            case 'with':\n                                return reservedWord(identifier);\n                        }\n                        break;\n                }\n                return;\n            }\n\n            var lexer = (function () {\n                function isIdentifierStartCharacter(code, text, offset, limit) {\n                    // The ES5 spec decalares that identifiers consist of a bunch of unicode classes, without\n                    // WinRT support for determining unicode class membership we are looking at 2500+ lines of\n                    // javascript code to encode the relevant class tables. Instead we look for everything\n                    // which is legal and < 0x7f, we exclude whitespace and line terminators, and then accept\n                    // everything > 0x7f.\n                    //\n                    // Here's the ES5 production:\n                    //\n                    //  Lu | Ll | Lt | Lm | Lo | Nl\n                    //  $\n                    //  _\n                    //  \\ UnicodeEscapeSequence\n                    //\n                    switch (code) {\n                        case (code >= /*a*/97 && code <= /*z*/122) && code:\n                        case (code >= /*A*/65 && code <= /*Z*/90) && code:\n                        case /*$*/36:\n                        case /*_*/95:\n                            return true;\n\n                        case isWhitespace(code) && code:\n                        case isLineTerminator(code) && code:\n                            return false;\n\n                        case (code > 0x7f) && code:\n                            return true;\n\n                        case /*\\*/92:\n                            if (offset + 4 < limit) {\n                                if (text.charCodeAt(offset) === /*u*/117 &&\n                                    isHexDigit(text.charCodeAt(offset + 1)) &&\n                                    isHexDigit(text.charCodeAt(offset + 2)) &&\n                                    isHexDigit(text.charCodeAt(offset + 3)) &&\n                                    isHexDigit(text.charCodeAt(offset + 4))) {\n                                    return true;\n                                }\n                            }\n                            return false;\n\n                        default:\n                            return false;\n                    }\n                }\n                /*\n        // Hand-inlined into readIdentifierPart\n        function isIdentifierPartCharacter(code) {\n        // See comment in isIdentifierStartCharacter.\n        //\n        // Mn | Mc | Nd | Pc\n        // <ZWNJ> | <ZWJ>\n        //\n        switch (code) {\n        case isIdentifierStartCharacter(code) && code:\n        case isDecimalDigit(code) && code:\n        return true;\n\n        default:\n        return false;\n        }\n        }\n        */\n                function readIdentifierPart(text, offset, limit) {\n                    var hasEscape = false;\n                    while (offset < limit) {\n                        var code = text.charCodeAt(offset);\n                        switch (code) {\n                            //case isIdentifierStartCharacter(code) && code:\n                            case (code >= /*a*/97 && code <= /*z*/122) && code:\n                            case (code >= /*A*/65 && code <= /*Z*/90) && code:\n                            case /*$*/36:\n                            case /*_*/95:\n                                break;\n\n                            case isWhitespace(code) && code:\n                            case isLineTerminator(code) && code:\n                                return hasEscape ? -offset : offset;\n\n                            case (code > 0x7f) && code:\n                                break;\n\n                                //case isDecimalDigit(code) && code:\n                            case (code >= /*0*/48 && code <= /*9*/57) && code:\n                                break;\n\n                            case /*\\*/92:\n                                if (offset + 5 < limit) {\n                                    if (text.charCodeAt(offset + 1) === /*u*/117 &&\n                                        isHexDigit(text.charCodeAt(offset + 2)) &&\n                                        isHexDigit(text.charCodeAt(offset + 3)) &&\n                                        isHexDigit(text.charCodeAt(offset + 4)) &&\n                                        isHexDigit(text.charCodeAt(offset + 5))) {\n                                        offset += 5;\n                                        hasEscape = true;\n                                        break;\n                                    }\n                                }\n                                return hasEscape ? -offset : offset;\n\n                            default:\n                                return hasEscape ? -offset : offset;\n                        }\n                        offset++;\n                    }\n                    return hasEscape ? -offset : offset;\n                }\n                function readIdentifierToken(text, offset, limit) {\n                    var startOffset = offset;\n                    offset = readIdentifierPart(text, offset, limit);\n                    var hasEscape = false;\n                    if (offset < 0) {\n                        offset = -offset;\n                        hasEscape = true;\n                    }\n                    var identifier = text.substr(startOffset, offset - startOffset);\n                    if (hasEscape) {\n                        identifier = \"\" + JSON.parse('\"' + identifier + '\"');\n                    }\n                    var wordToken = reservedWordLookup(identifier);\n                    if (wordToken) {\n                        return wordToken;\n                    }\n                    return {\n                        type: tokenType.identifier,\n                        length: offset - startOffset,\n                        value: identifier\n                    };\n                }\n                function isHexDigit(code) {\n                    switch (code) {\n                        case (code >= /*0*/48 && code <= /*9*/57) && code:\n                        case (code >= /*a*/97 && code <= /*f*/102) && code:\n                        case (code >= /*A*/65 && code <= /*F*/70) && code:\n                            return true;\n\n                        default:\n                            return false;\n                    }\n                }\n                function readHexIntegerLiteral(text, offset, limit) {\n                    while (offset < limit && isHexDigit(text.charCodeAt(offset))) {\n                        offset++;\n                    }\n                    return offset;\n                }\n                function isDecimalDigit(code) {\n                    switch (code) {\n                        case (code >= /*0*/48 && code <= /*9*/57) && code:\n                            return true;\n\n                        default:\n                            return false;\n                    }\n                }\n                function readDecimalDigits(text, offset, limit) {\n                    while (offset < limit && isDecimalDigit(text.charCodeAt(offset))) {\n                        offset++;\n                    }\n                    return offset;\n                }\n                function readDecimalLiteral(text, offset, limit) {\n                    offset = readDecimalDigits(text, offset, limit);\n                    if (offset < limit && text.charCodeAt(offset) === /*.*/46 && offset + 1 < limit && isDecimalDigit(text.charCodeAt(offset + 1))) {\n                        offset = readDecimalDigits(text, offset + 2, limit);\n                    }\n                    if (offset < limit) {\n                        var code = text.charCodeAt(offset);\n                        if (code === /*e*/101 || code === /*E*/69) {\n                            var tempOffset = offset + 1;\n                            if (tempOffset < limit) {\n                                code = text.charCodeAt(tempOffset);\n                                if (code === /*+*/43 || code === /*-*/45) {\n                                    tempOffset++;\n                                }\n                                offset = readDecimalDigits(text, tempOffset, limit);\n                            }\n                        }\n                    }\n                    return offset;\n                }\n                function readDecimalLiteralToken(text, start, offset, limit) {\n                    var offset = readDecimalLiteral(text, offset, limit);\n                    var length = offset - start;\n                    return {\n                        type: tokenType.numberLiteral,\n                        length: length,\n                        value: +text.substr(start, length)\n                    };\n                }\n                function isLineTerminator(code) {\n                    switch (code) {\n                        case 0x000A:    // line feed\n                        case 0x000D:    // carriage return\n                        case 0x2028:    // line separator\n                        case 0x2029:    // paragraph separator\n                            return true;\n\n                        default:\n                            return false;\n                    }\n                }\n                function readStringLiteralToken(text, offset, limit) {\n                    var startOffset = offset;\n                    var quoteCharCode = text.charCodeAt(offset);\n                    var hasEscape = false;\n                    offset++;\n                    while (offset < limit && !isLineTerminator(text.charCodeAt(offset))) {\n                        if (offset + 1 < limit && text.charCodeAt(offset) === /*\\*/92) {\n                            hasEscape = true;\n\n                            switch (text.charCodeAt(offset + 1)) {\n                                case quoteCharCode:\n                                case 0x005C:    // \\\n                                case 0x000A:    // line feed\n                                case 0x2028:    // line separator\n                                case 0x2029:    // paragraph separator\n                                    offset += 2;\n                                    continue;\n\n                                case 0x000D:    // carriage return\n                                    if (offset + 2 < limit && text.charCodeAt(offset + 2) === 0x000A) {\n                                        // Skip \\r\\n\n                                        offset += 3;\n                                    } else {\n                                        offset += 2;\n                                    }\n                                    continue;\n                            }\n                        }\n                        offset++;\n                        if (text.charCodeAt(offset - 1) === quoteCharCode) {\n                            break;\n                        }\n                    }\n                    var length = offset - startOffset;\n                    // If we don't have a terminating quote go through the escape path.\n                    hasEscape = hasEscape || length === 1 || text.charCodeAt(offset - 1) !== quoteCharCode;\n                    var stringValue;\n                    if (hasEscape) {\n                        stringValue = eval(text.substr(startOffset, length)); // jshint ignore:line\n                    } else {\n                        stringValue = text.substr(startOffset + 1, length - 2);\n                    }\n                    return {\n                        type: tokenType.stringLiteral,\n                        length: length,\n                        value: stringValue\n                    };\n                }\n                function isWhitespace(code) {\n                    switch (code) {\n                        case 0x0009:    // tab\n                        case 0x000B:    // vertical tab\n                        case 0x000C:    // form feed\n                        case 0x0020:    // space\n                        case 0x00A0:    // no-breaking space\n                        case 0xFEFF:    // BOM\n                            return true;\n\n                            // There are no category Zs between 0x00A0 and 0x1680.\n                            //\n                        case (code < 0x1680) && code:\n                            return false;\n\n                            // Unicode category Zs\n                            //\n                        case 0x1680:\n                        case 0x180e:\n                        case (code >= 0x2000 && code <= 0x200a) && code:\n                        case 0x202f:\n                        case 0x205f:\n                        case 0x3000:\n                            return true;\n\n                        default:\n                            return false;\n                    }\n                }\n                // Hand-inlined isWhitespace.\n                function readWhitespace(text, offset, limit) {\n                    while (offset < limit) {\n                        var code = text.charCodeAt(offset);\n                        switch (code) {\n                            case 0x0009:    // tab\n                            case 0x000B:    // vertical tab\n                            case 0x000C:    // form feed\n                            case 0x0020:    // space\n                            case 0x00A0:    // no-breaking space\n                            case 0xFEFF:    // BOM\n                                break;\n\n                                // There are no category Zs between 0x00A0 and 0x1680.\n                                //\n                            case (code < 0x1680) && code:\n                                return offset;\n\n                                // Unicode category Zs\n                                //\n                            case 0x1680:\n                            case 0x180e:\n                            case (code >= 0x2000 && code <= 0x200a) && code:\n                            case 0x202f:\n                            case 0x205f:\n                            case 0x3000:\n                                break;\n\n                            default:\n                                return offset;\n                        }\n                        offset++;\n                    }\n                    return offset;\n                }\n                function lex(result, text, offset, limit) {\n                    while (offset < limit) {\n                        var startOffset = offset;\n                        var code = text.charCodeAt(offset++);\n                        var token;\n                        switch (code) {\n                            case isWhitespace(code) && code:\n                            case isLineTerminator(code) && code:\n                                offset = readWhitespace(text, offset, limit);\n                                token = { type: tokenType.separator, length: offset - startOffset };\n                                // don't include whitespace in the token stream.\n                                continue;\n\n                            case /*\"*/34:\n                            case /*'*/39:\n                                token = readStringLiteralToken(text, offset - 1, limit);\n                                break;\n\n                            case /*(*/40:\n                                token = tokens.leftParentheses;\n                                break;\n\n                            case /*)*/41:\n                                token = tokens.rightParentheses;\n                                break;\n\n                            case /*+*/43:\n                            case /*-*/45:\n                                if (offset < limit) {\n                                    var afterSign = text.charCodeAt(offset);\n                                    if (afterSign === /*.*/46) {\n                                        var signOffset = offset + 1;\n                                        if (signOffset < limit && isDecimalDigit(text.charCodeAt(signOffset))) {\n                                            token = readDecimalLiteralToken(text, startOffset, signOffset, limit);\n                                            break;\n                                        }\n                                    } else if (isDecimalDigit(afterSign)) {\n                                        token = readDecimalLiteralToken(text, startOffset, offset, limit);\n                                        break;\n                                    }\n                                }\n                                token = { type: tokenType.error, length: offset - startOffset, value: text.substring(startOffset, offset) };\n                                break;\n\n                            case /*,*/44:\n                                token = tokens.comma;\n                                break;\n\n                            case /*.*/46:\n                                token = tokens.dot;\n                                if (offset < limit && isDecimalDigit(text.charCodeAt(offset))) {\n                                    token = readDecimalLiteralToken(text, startOffset, offset, limit);\n                                }\n                                break;\n\n                            case /*0*/48:\n                                var ch2 = (offset < limit ? text.charCodeAt(offset) : 0);\n                                if (ch2 === /*x*/120 || ch2 === /*X*/88) {\n                                    var hexOffset = readHexIntegerLiteral(text, offset + 1, limit);\n                                    token = {\n                                        type: tokenType.numberLiteral,\n                                        length: hexOffset - startOffset,\n                                        value: +text.substr(startOffset, hexOffset - startOffset)\n                                    };\n                                } else {\n                                    token = readDecimalLiteralToken(text, startOffset, offset, limit);\n                                }\n                                break;\n\n                            case (code >= /*1*/49 && code <= /*9*/57) && code:\n                                token = readDecimalLiteralToken(text, startOffset, offset, limit);\n                                break;\n\n                            case /*:*/58:\n                                token = tokens.colon;\n                                break;\n\n                            case /*;*/59:\n                                token = tokens.semicolon;\n                                break;\n\n                            case /*[*/91:\n                                token = tokens.leftBracket;\n                                break;\n\n                            case /*]*/93:\n                                token = tokens.rightBracket;\n                                break;\n\n                            case /*{*/123:\n                                token = tokens.leftBrace;\n                                break;\n\n                            case /*}*/125:\n                                token = tokens.rightBrace;\n                                break;\n\n                            default:\n                                if (isIdentifierStartCharacter(code, text, offset, limit)) {\n                                    token = readIdentifierToken(text, offset - 1, limit);\n                                    break;\n                                }\n                                token = { type: tokenType.error, length: offset - startOffset, value: text.substring(startOffset, offset) };\n                                break;\n                        }\n\n                        offset += (token.length - 1);\n                        result.push(token);\n                    }\n                }\n                return function (text) {\n                    var result = [];\n                    lex(result, text, 0, text.length);\n                    result.push(tokens.eof);\n                    return result;\n                };\n            })();\n            lexer.tokenType = tokenType;\n            return lexer;\n        })\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/ControlProcessor/_OptionsParser',[\n    'exports',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources',\n    './_OptionsLexer'\n    ], function optionsParserInit(exports, _Base, _BaseUtils, _ErrorFromName, _Resources, _OptionsLexer) {\n    \"use strict\";\n\n    var strings = {\n        get invalidOptionsRecord() { return \"Invalid options record: '{0}', expected to be in the format of an object literal. {1}\"; },\n        get unexpectedTokenExpectedToken() { return \"Unexpected token: {0}, expected token: {1}, at offset {2}\"; },\n        get unexpectedTokenExpectedTokens() { return \"Unexpected token: {0}, expected one of: {1}, at offset {2}\"; },\n        get unexpectedTokenGeneric() { return \"Unexpected token: {0}, at offset {1}\"; },\n    };\n\n    /*\n    Notation is described in ECMA-262-5 (ECMAScript Language Specification, 5th edition) section 5.\n\n    Lexical grammar is defined in ECMA-262-5, section 7.\n\n    Lexical productions used in this grammar defined in ECMA-262-5:\n\n        Production          Section\n        --------------------------------\n        Identifier          7.6\n        NullLiteral         7.8.1\n        BooleanLiteral      7.8.2\n        NumberLiteral       7.8.3\n        StringLiteral       7.8.4\n\n    Syntactic grammar for the value of the data-win-options attribute.\n\n        OptionsLiteral:\n            ObjectLiteral\n\n        ObjectLiteral:\n            { }\n            { ObjectProperties }\n            { ObjectProperties , }\n\n        ObjectProperties:\n            ObjectProperty\n            ObjectProperties, ObjectProperty\n\n        ObjectProperty:\n            PropertyName : Value\n\n        PropertyName:                       (from ECMA-262-6, 11.1.5)\n            StringLiteral\n            NumberLiteral\n            Identifier\n\n        ArrayLiteral:\n            [ ]\n            [ Elision ]\n            [ ArrayElements ]\n            [ ArrayElements , ]\n            [ ArrayElements , Elision ]\n\n        ArrayElements:\n            Value\n            Elision Value\n            ArrayElements , Value\n            ArrayElements , Elision Value\n\n        Elision:\n            ,\n            Elision ,\n\n        Value:\n            NullLiteral\n            NumberLiteral\n            BooleanLiteral\n            StringLiteral\n            ArrayLiteral\n            ObjectLiteral\n            IdentifierExpression\n            ObjectQueryExpression\n\n        AccessExpression:\n            [ Value ]\n            . Identifier\n\n        AccessExpressions:\n            AccessExpression\n            AccessExpressions AccessExpression\n\n        IdentifierExpression:\n            Identifier\n            Identifier AccessExpressions\n\n        ObjectQueryExpression:\n            Identifier ( StringLiteral )\n            Identifier ( StringLiteral ) AccessExpressions\n\n\n    NOTE: We have factored the above grammar to allow the infrastructure to be used\n          by the BindingInterpreter as well. The BaseInterpreter does NOT provide an\n          implementation of _evaluateValue(), this is expected to be provided by the\n          derived class since right now the two have different grammars for Value\n\n        AccessExpression:\n            [ Value ]\n            . Identifier\n\n        AccessExpressions:\n            AccessExpression\n            AccessExpressions AccessExpression\n\n        Identifier:\n            Identifier                      (from ECMA-262-6, 7.6)\n\n        IdentifierExpression:\n            Identifier\n            Identifier AccessExpressions\n\n        Value:\n            *** Provided by concrete interpreter ***\n\n*/\n\n    function illegal() {\n        throw \"Illegal\";\n    }\n\n    var imports = _Base.Namespace.defineWithParent(null, null, {\n        lexer: _Base.Namespace._lazy(function () {\n            return _OptionsLexer._optionsLexer;\n        }),\n        tokenType: _Base.Namespace._lazy(function () {\n            return _OptionsLexer._optionsLexer.tokenType;\n        }),\n    });\n\n    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n\n    function tokenTypeName(type) {\n        var keys = Object.keys(imports.tokenType);\n        for (var i = 0, len = keys.length; i < len; i++) {\n            if (type === imports.tokenType[keys[i]]) {\n                return keys[i];\n            }\n        }\n        return \"<unknown>\";\n    }\n\n    var local = _Base.Namespace.defineWithParent(null, null, {\n\n        BaseInterpreter: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(null, {\n                _error: function (message) {\n                    throw new _ErrorFromName(\"WinJS.UI.ParseError\", message);\n                },\n                _currentOffset: function () {\n                    var p = this._pos;\n                    var offset = 0;\n                    for (var i = 0; i < p; i++) {\n                        offset += this._tokens[i].length;\n                    }\n                    return offset;\n                },\n                _evaluateAccessExpression: function (value) {\n                    switch (this._current.type) {\n                        case imports.tokenType.dot:\n                            this._read();\n                            switch (this._current.type) {\n                                case imports.tokenType.identifier:\n                                case this._current.keyword && this._current.type:\n                                    var id = this._current.value;\n                                    this._read();\n                                    return value[id];\n\n                                default:\n                                    this._unexpectedToken(imports.tokenType.identifier, imports.tokenType.reservedWord);\n                                    break;\n                            }\n                            return;\n\n                        case imports.tokenType.leftBracket:\n                            this._read();\n                            var index = this._evaluateValue();\n                            this._read(imports.tokenType.rightBracket);\n                            return value[index];\n\n                            // default: is unreachable because all the callers are conditional on\n                            // the next token being either a . or {\n                            //\n                    }\n                },\n                _evaluateAccessExpressions: function (value) {\n                    while (true) {\n                        switch (this._current.type) {\n                            case imports.tokenType.dot:\n                            case imports.tokenType.leftBracket:\n                                value = this._evaluateAccessExpression(value);\n                                break;\n\n                            default:\n                                return value;\n                        }\n                    }\n                },\n                _evaluateIdentifier: function (nested, value) {\n                    var id = this._readIdentifier();\n                    value = nested ? value[id] : this._context[id];\n                    return value;\n                },\n                _evaluateIdentifierExpression: function () {\n                    var value = this._evaluateIdentifier(false);\n\n                    switch (this._current.type) {\n                        case imports.tokenType.dot:\n                        case imports.tokenType.leftBracket:\n                            return this._evaluateAccessExpressions(value);\n                        default:\n                            return value;\n                    }\n                },\n                _initialize: function (tokens, originalSource, context, functionContext) {\n                    this._originalSource = originalSource;\n                    this._tokens = tokens;\n                    this._context = context;\n                    this._functionContext = functionContext;\n                    this._pos = 0;\n                    this._current = this._tokens[0];\n                },\n                _read: function (expected) {\n                    if (expected && this._current.type !== expected) {\n                        this._unexpectedToken(expected);\n                    }\n                    if (this._current !== imports.tokenType.eof) {\n                        this._current = this._tokens[++this._pos];\n                    }\n                },\n                _peek: function (expected) {\n                    if (expected && this._current.type !== expected) {\n                        return;\n                    }\n                    if (this._current !== imports.tokenType.eof) {\n                        return this._tokens[this._pos + 1];\n                    }\n                },\n                _readAccessExpression: function (parts) {\n                    switch (this._current.type) {\n                        case imports.tokenType.dot:\n                            this._read();\n                            switch (this._current.type) {\n                                case imports.tokenType.identifier:\n                                case this._current.keyword && this._current.type:\n                                    parts.push(this._current.value);\n                                    this._read();\n                                    break;\n\n                                default:\n                                    this._unexpectedToken(imports.tokenType.identifier, imports.tokenType.reservedWord);\n                                    break;\n                            }\n                            return;\n\n                        case imports.tokenType.leftBracket:\n                            this._read();\n                            parts.push(this._evaluateValue());\n                            this._read(imports.tokenType.rightBracket);\n                            return;\n\n                            // default: is unreachable because all the callers are conditional on\n                            // the next token being either a . or {\n                            //\n                    }\n                },\n                _readAccessExpressions: function (parts) {\n                    while (true) {\n                        switch (this._current.type) {\n                            case imports.tokenType.dot:\n                            case imports.tokenType.leftBracket:\n                                this._readAccessExpression(parts);\n                                break;\n\n                            default:\n                                return;\n                        }\n                    }\n                },\n                _readIdentifier: function () {\n                    var id = this._current.value;\n                    this._read(imports.tokenType.identifier);\n                    return id;\n                },\n                _readIdentifierExpression: function () {\n                    var parts = [];\n                    if (this._peek(imports.tokenType.thisKeyword) && parts.length === 0) {\n                        this._read();\n                    } else {\n                        parts.push(this._readIdentifier());\n                    }\n\n                    switch (this._current.type) {\n                        case imports.tokenType.dot:\n                        case imports.tokenType.leftBracket:\n                            this._readAccessExpressions(parts);\n                            break;\n                    }\n\n                    return parts;\n                },\n                _unexpectedToken: function (expected) {\n                    var unexpected = (this._current.type === imports.tokenType.error ? \"'\" + this._current.value + \"'\" : tokenTypeName(this._current.type));\n                    if (expected) {\n                        if (arguments.length === 1) {\n                            expected = tokenTypeName(expected);\n                            this._error(_Resources._formatString(strings.unexpectedTokenExpectedToken, unexpected, expected, this._currentOffset()));\n                        } else {\n                            var names = [];\n                            for (var i = 0, len = arguments.length; i < len; i++) {\n                                names.push(tokenTypeName(arguments[i]));\n                            }\n                            expected = names.join(\", \");\n                            this._error(_Resources._formatString(strings.unexpectedTokenExpectedTokens, unexpected, expected, this._currentOffset()));\n                        }\n                    } else {\n                        this._error(_Resources._formatString(strings.unexpectedTokenGeneric, unexpected, this._currentOffset()));\n                    }\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        OptionsInterpreter: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(local.BaseInterpreter, function (tokens, originalSource, context, functionContext) {\n                this._initialize(tokens, originalSource, context, functionContext);\n            }, {\n                _error: function (message) {\n                    throw new _ErrorFromName(\"WinJS.UI.ParseError\", _Resources._formatString(strings.invalidOptionsRecord, this._originalSource, message));\n                },\n                _evaluateArrayLiteral: function () {\n                    var a = [];\n                    this._read(imports.tokenType.leftBracket);\n                    this._readArrayElements(a);\n                    this._read(imports.tokenType.rightBracket);\n                    return a;\n                },\n                _evaluateObjectLiteral: function () {\n                    var o = {};\n                    this._read(imports.tokenType.leftBrace);\n                    this._readObjectProperties(o);\n                    this._tryReadComma();\n                    this._read(imports.tokenType.rightBrace);\n                    return o;\n                },\n                _evaluateOptionsLiteral: function () {\n                    var value = this._evaluateValue();\n                    if (this._current.type !== imports.tokenType.eof) {\n                        this._unexpectedToken(imports.tokenType.eof);\n                    }\n                    return value;\n                },\n                _peekValue: function () {\n                    switch (this._current.type) {\n                        case imports.tokenType.falseLiteral:\n                        case imports.tokenType.nullLiteral:\n                        case imports.tokenType.stringLiteral:\n                        case imports.tokenType.trueLiteral:\n                        case imports.tokenType.numberLiteral:\n                        case imports.tokenType.leftBrace:\n                        case imports.tokenType.leftBracket:\n                        case imports.tokenType.identifier:\n                            return true;\n                        default:\n                            return false;\n                    }\n                },\n                _evaluateValue: function () {\n                    switch (this._current.type) {\n                        case imports.tokenType.falseLiteral:\n                        case imports.tokenType.nullLiteral:\n                        case imports.tokenType.stringLiteral:\n                        case imports.tokenType.trueLiteral:\n                        case imports.tokenType.numberLiteral:\n                            var value = this._current.value;\n                            this._read();\n                            return value;\n\n                        case imports.tokenType.leftBrace:\n                            return this._evaluateObjectLiteral();\n\n                        case imports.tokenType.leftBracket:\n                            return this._evaluateArrayLiteral();\n\n                        case imports.tokenType.identifier:\n                            if (this._peek(imports.tokenType.identifier).type === imports.tokenType.leftParentheses) {\n                                return requireSupportedForProcessing(this._evaluateObjectQueryExpression());\n                            }\n                            return requireSupportedForProcessing(this._evaluateIdentifierExpression());\n\n                        default:\n                            this._unexpectedToken(imports.tokenType.falseLiteral, imports.tokenType.nullLiteral, imports.tokenType.stringLiteral,\n                                imports.tokenType.trueLiteral, imports.tokenType.numberLiteral, imports.tokenType.leftBrace, imports.tokenType.leftBracket,\n                                imports.tokenType.identifier);\n                            break;\n                    }\n                },\n                _tryReadElement: function (a) {\n                    if (this._peekValue()) {\n                        a.push(this._evaluateValue());\n                        return true;\n                    } else {\n                        return false;\n                    }\n                },\n                _tryReadComma: function () {\n                    if (this._peek(imports.tokenType.comma)) {\n                        this._read();\n                        return true;\n                    }\n                    return false;\n                },\n                _tryReadElision: function (a) {\n                    var found = false;\n                    while (this._tryReadComma()) {\n                        a.push(undefined);\n                        found = true;\n                    }\n                    return found;\n                },\n                _readArrayElements: function (a) {\n                    while (!this._peek(imports.tokenType.rightBracket)) {\n                        var elision = this._tryReadElision(a);\n                        var element = this._tryReadElement(a);\n                        var comma = this._peek(imports.tokenType.comma);\n                        if (element && comma) {\n                            // if we had a element followed by a comma, eat the comma and try to read the next element\n                            this._read();\n                        } else if (element || elision) {\n                            // if we had a element without a trailing comma or if all we had were commas we're done\n                            break;\n                        } else {\n                            // if we didn't have a element or elision then we are done and in error\n                            this._unexpectedToken(imports.tokenType.falseLiteral, imports.tokenType.nullLiteral, imports.tokenType.stringLiteral,\n                                imports.tokenType.trueLiteral, imports.tokenType.numberLiteral, imports.tokenType.leftBrace, imports.tokenType.leftBracket,\n                                imports.tokenType.identifier);\n                            break;\n                        }\n                    }\n                },\n                _readObjectProperties: function (o) {\n                    while (!this._peek(imports.tokenType.rightBrace)) {\n                        var property = this._tryReadObjectProperty(o);\n                        var comma = this._peek(imports.tokenType.comma);\n                        if (property && comma) {\n                            // if we had a property followed by a comma, eat the comma and try to read the next property\n                            this._read();\n                        } else if (property) {\n                            // if we had a property without a trailing comma we're done\n                            break;\n                        } else {\n                            // if we didn't have a property then we are done and in error\n                            this._unexpectedToken(imports.tokenType.numberLiteral, imports.tokenType.stringLiteral, imports.tokenType.identifier);\n                            break;\n                        }\n                    }\n                },\n                _tryReadObjectProperty: function (o) {\n                    switch (this._current.type) {\n                        case imports.tokenType.numberLiteral:\n                        case imports.tokenType.stringLiteral:\n                        case imports.tokenType.identifier:\n                        case this._current.keyword && this._current.type:\n                            var propertyName = this._current.value;\n                            this._read();\n                            this._read(imports.tokenType.colon);\n                            o[propertyName] = this._evaluateValue();\n                            return true;\n\n                        default:\n                            return false;\n                    }\n                },\n                _failReadObjectProperty: function () {\n                    this._unexpectedToken(imports.tokenType.numberLiteral, imports.tokenType.stringLiteral, imports.tokenType.identifier, imports.tokenType.reservedWord);\n                },\n                _evaluateObjectQueryExpression: function () {\n                    var functionName = this._current.value;\n                    this._read(imports.tokenType.identifier);\n                    this._read(imports.tokenType.leftParentheses);\n                    var queryExpression = this._current.value;\n                    this._read(imports.tokenType.stringLiteral);\n                    this._read(imports.tokenType.rightParentheses);\n\n                    var value = requireSupportedForProcessing(this._functionContext[functionName])(queryExpression);\n                    switch (this._current.type) {\n                        case imports.tokenType.dot:\n                        case imports.tokenType.leftBracket:\n                            return this._evaluateAccessExpressions(value);\n\n                        default:\n                            return value;\n                    }\n                },\n                run: function () {\n                    return this._evaluateOptionsLiteral();\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        OptionsParser: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(local.OptionsInterpreter, function (tokens, originalSource) {\n                this._initialize(tokens, originalSource);\n            }, {\n                // When parsing it is illegal to get to any of these \"evaluate\" RHS productions because\n                //  we will always instead go to the \"read\" version\n                //\n                _evaluateAccessExpression: illegal,\n                _evaluateAccessExpressions: illegal,\n                _evaluateIdentifier: illegal,\n                _evaluateIdentifierExpression: illegal,\n                _evaluateObjectQueryExpression: illegal,\n\n                _evaluateValue: function () {\n                    switch (this._current.type) {\n                        case imports.tokenType.falseLiteral:\n                        case imports.tokenType.nullLiteral:\n                        case imports.tokenType.stringLiteral:\n                        case imports.tokenType.trueLiteral:\n                        case imports.tokenType.numberLiteral:\n                            var value = this._current.value;\n                            this._read();\n                            return value;\n\n                        case imports.tokenType.leftBrace:\n                            return this._evaluateObjectLiteral();\n\n                        case imports.tokenType.leftBracket:\n                            return this._evaluateArrayLiteral();\n\n                        case imports.tokenType.identifier:\n                            if (this._peek(imports.tokenType.identifier).type === imports.tokenType.leftParentheses) {\n                                return this._readObjectQueryExpression();\n                            }\n                            return this._readIdentifierExpression();\n\n                        default:\n                            this._unexpectedToken(imports.tokenType.falseLiteral, imports.tokenType.nullLiteral, imports.tokenType.stringLiteral,\n                                imports.tokenType.trueLiteral, imports.tokenType.numberLiteral, imports.tokenType.leftBrace, imports.tokenType.leftBracket,\n                                imports.tokenType.identifier);\n                            break;\n                    }\n                },\n\n                _readIdentifierExpression: function () {\n                    var parts = local.BaseInterpreter.prototype._readIdentifierExpression.call(this);\n                    return new IdentifierExpression(parts);\n                },\n                _readObjectQueryExpression: function () {\n                    var functionName = this._current.value;\n                    this._read(imports.tokenType.identifier);\n                    this._read(imports.tokenType.leftParentheses);\n                    var queryExpressionLiteral = this._current.value;\n                    this._read(imports.tokenType.stringLiteral);\n                    this._read(imports.tokenType.rightParentheses);\n\n                    var call = new CallExpression(functionName, queryExpressionLiteral);\n                    switch (this._current.type) {\n                        case imports.tokenType.dot:\n                        case imports.tokenType.leftBracket:\n                            var parts = [call];\n                            this._readAccessExpressions(parts);\n                            return new IdentifierExpression(parts);\n\n                        default:\n                            return call;\n                    }\n                },\n            }, {\n                supportedForProcessing: false,\n            });\n        })\n\n    });\n\n    var parser = function (text, context, functionContext) {\n        var tokens = imports.lexer(text);\n        var interpreter = new local.OptionsInterpreter(tokens, text, context || {}, functionContext || {});\n        return interpreter.run();\n    };\n    Object.defineProperty(parser, \"_BaseInterpreter\", { get: function () { return local.BaseInterpreter; } });\n\n    var parser2 = function (text) {\n        var tokens = imports.lexer(text);\n        var parser = new local.OptionsParser(tokens, text);\n        return parser.run();\n    };\n\n    // Consumers of parser2 need to be able to see the AST for RHS expression in order to emit\n    //  code representing these portions of the options record\n    //\n    var CallExpression = _Base.Class.define(function (target, arg0Value) {\n        this.target = target;\n        this.arg0Value = arg0Value;\n    });\n    CallExpression.supportedForProcessing = false;\n\n    var IdentifierExpression = _Base.Class.define(function (parts) {\n        this.parts = parts;\n    });\n    IdentifierExpression.supportedForProcessing = false;\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n\n        // This is the mis-named interpreter version of the options record processor.\n        //\n        optionsParser: parser,\n\n        // This is the actual parser version of the options record processor.\n        //\n        _optionsParser: parser2,\n        _CallExpression: CallExpression,\n        _IdentifierExpression: IdentifierExpression,\n\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/ControlProcessor',[\n    'exports',\n    './Core/_Global',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './Core/_Log',\n    './Core/_Resources',\n    './Core/_WriteProfilerMark',\n    './ControlProcessor/_OptionsParser',\n    './Promise',\n    './Utilities/_ElementUtilities'\n    ], function declarativeControlsInit(exports, _Global, _Base, _BaseUtils, _Log, _Resources, _WriteProfilerMark, _OptionsParser, Promise, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var strings = {\n        get errorActivatingControl() { return \"Error activating control: {0}\"; },\n    };\n\n    var markSupportedForProcessing = _BaseUtils.markSupportedForProcessing;\n    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n    var processedAllCalled = false;\n\n    function createSelect(element) {\n        var result = function select(selector) {\n            /// <signature helpKeyword=\"WinJS.UI.select.createSelect\">\n            /// <summary locid=\"WinJS.UI.select.createSelect\">\n            /// Walks the DOM tree from the given  element to the root of the document, whenever\n            /// a selector scope is encountered select performs a lookup within that scope for\n            /// the given selector string. The first matching element is returned.\n            /// </summary>\n            /// <param name=\"selector\" type=\"String\" locid=\"WinJS.UI.select.createSelect_p:selector\">The selector string.</param>\n            /// <returns type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.select.createSelect_returnValue\">The target element, if found.</returns>\n            /// </signature>\n            var current = element;\n            var selected;\n            while (current) {\n                if (current.msParentSelectorScope) {\n                    var scope = current.parentNode;\n                    if (scope) {\n                        selected = _ElementUtilities._matchesSelector(scope, selector) ? scope : scope.querySelector(selector);\n                        if (selected) {\n                            break;\n                        }\n                    }\n                }\n                current = current.parentNode;\n            }\n\n            return selected || _Global.document.querySelector(selector);\n        };\n        return markSupportedForProcessing(result);\n    }\n\n    function activate(element, Handler) {\n        return new Promise(function activate2(complete, error) {\n            try {\n                var options;\n                var optionsAttribute = element.getAttribute(\"data-win-options\");\n                if (optionsAttribute) {\n                    options = _OptionsParser.optionsParser(optionsAttribute, _Global, {\n                        select: createSelect(element)\n                    });\n                }\n\n                var ctl;\n                var count = 1;\n\n                // handler is required to call complete if it takes that parameter\n                //\n                if (Handler.length > 2) {\n                    count++;\n                }\n                var checkComplete = function checkComplete() {\n                    count--;\n                    if (count === 0) {\n                        element.winControl = element.winControl || ctl;\n                        complete(ctl);\n                    }\n                };\n\n                // async exceptions from the handler get dropped on the floor...\n                //\n                ctl = new Handler(element, options, checkComplete);\n                checkComplete();\n            }\n            catch (err) {\n                _Log.log && _Log.log(_Resources._formatString(strings.errorActivatingControl, err && err.message), \"winjs controls\", \"error\");\n                error(err);\n            }\n        });\n    }\n\n    function processAllImpl(rootElement, skipRootElement) {\n        return new Promise(function processAllImpl2(complete, error) {\n            _WriteProfilerMark(\"WinJS.UI:processAll,StartTM\");\n            rootElement = rootElement || _Global.document.body;\n            var pending = 0;\n            var selector = \"[data-win-control]\";\n            var allElements = rootElement.querySelectorAll(selector);\n            var elements = [];\n            if (!skipRootElement && getControlHandler(rootElement)) {\n                elements.push(rootElement);\n            }\n            for (var i = 0, len = allElements.length; i < len; i++) {\n                elements.push(allElements[i]);\n            }\n\n            // bail early if there is nothing to process\n            //\n            if (elements.length === 0) {\n                _WriteProfilerMark(\"WinJS.UI:processAll,StopTM\");\n                complete(rootElement);\n                return;\n            }\n\n            var checkAllComplete = function () {\n                pending = pending - 1;\n                if (pending < 0) {\n                    _WriteProfilerMark(\"WinJS.UI:processAll,StopTM\");\n                    complete(rootElement);\n                }\n            };\n\n            // First go through and determine which elements to activate\n            //\n            var controls = new Array(elements.length);\n            for (var i = 0, len = elements.length; i < len; i++) {\n                var element = elements[i];\n                var control;\n                var instance = element.winControl;\n                if (instance) {\n                    control = instance.constructor;\n                    // already activated, don't need to add to controls array\n                } else {\n                    controls[i] = control = getControlHandler(element);\n                }\n                if (control && control.isDeclarativeControlContainer) {\n                    i += element.querySelectorAll(selector).length;\n                }\n            }\n\n            // Now go through and activate those\n            //\n            _WriteProfilerMark(\"WinJS.UI:processAllActivateControls,StartTM\");\n            for (var i = 0, len = elements.length; i < len; i++) {\n                var ctl = controls[i];\n                var element = elements[i];\n                if (ctl && !element.winControl) {\n                    pending++;\n                    activate(element, ctl).then(checkAllComplete, function (e) {\n                        _WriteProfilerMark(\"WinJS.UI:processAll,StopTM\");\n                        error(e);\n                    });\n\n                    if (ctl.isDeclarativeControlContainer && typeof ctl.isDeclarativeControlContainer === \"function\") {\n                        var idcc = requireSupportedForProcessing(ctl.isDeclarativeControlContainer);\n                        idcc(element.winControl, processAll);\n                    }\n                }\n            }\n            _WriteProfilerMark(\"WinJS.UI:processAllActivateControls,StopTM\");\n\n            checkAllComplete();\n        });\n    }\n\n    function getControlHandler(element) {\n        if (element.getAttribute) {\n            var evaluator = element.getAttribute(\"data-win-control\");\n            if (evaluator) {\n                return _BaseUtils._getMemberFiltered(evaluator.trim(), _Global, requireSupportedForProcessing);\n            }\n        }\n    }\n\n    function scopedSelect(selector, element) {\n        /// <signature helpKeyword=\"WinJS.UI.scopedSelect\">\n        /// <summary locid=\"WinJS.UI.scopedSelect\">\n        /// Walks the DOM tree from the given  element to the root of the document, whenever\n        /// a selector scope is encountered select performs a lookup within that scope for\n        /// the given selector string. The first matching element is returned.\n        /// </summary>\n        /// <param name=\"selector\" type=\"String\" locid=\"WinJS.UI.scopedSelect_p:selector\">The selector string.</param>\n        /// <returns type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.scopedSelect_returnValue\">The target element, if found.</returns>\n        /// </signature>\n        return createSelect(element)(selector);\n    }\n\n    function processAll(rootElement, skipRoot) {\n        /// <signature helpKeyword=\"WinJS.UI.processAll\">\n        /// <summary locid=\"WinJS.UI.processAll\">\n        /// Applies declarative control binding to all elements, starting at the specified root element.\n        /// </summary>\n        /// <param name=\"rootElement\" type=\"Object\" domElement=\"true\" locid=\"WinJS.UI.processAll_p:rootElement\">\n        /// The element at which to start applying the binding. If this parameter is not specified, the binding is applied to the entire document.\n        /// </param>\n        /// <param name=\"skipRoot\" type=\"Boolean\" optional=\"true\" locid=\"WinJS.UI.processAll_p:skipRoot\">\n        /// If true, the elements to be bound skip the specified root element and include only the children.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.processAll_returnValue\">\n        /// A promise that is fulfilled when binding has been applied to all the controls.\n        /// </returns>\n        /// </signature>\n        if (!processedAllCalled) {\n            return _BaseUtils.ready().then(function () {\n                processedAllCalled = true;\n                return processAllImpl(rootElement, skipRoot);\n            });\n        } else {\n            return processAllImpl(rootElement, skipRoot);\n        }\n    }\n\n    function process(element) {\n        /// <signature helpKeyword=\"WinJS.UI.process\">\n        /// <summary locid=\"WinJS.UI.process\">\n        /// Applies declarative control binding to the specified element.\n        /// </summary>\n        /// <param name=\"element\" type=\"Object\" domElement=\"true\" locid=\"WinJS.UI.process_p:element\">\n        /// The element to bind.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.process_returnValue\">\n        /// A promise that is fulfilled after the control is activated. The value of the\n        /// promise is the control that is attached to element.\n        /// </returns>\n        /// </signature>\n\n        if (element && element.winControl) {\n            return Promise.as(element.winControl);\n        }\n        var handler = getControlHandler(element);\n        if (!handler) {\n            return Promise.as(); // undefined, no handler\n        } else {\n            return activate(element, handler);\n        }\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        scopedSelect: scopedSelect,\n        processAll: processAll,\n        process: process\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_ElementListUtilities',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../ControlProcessor',\n    '../Promise',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities'\n    ], function elementListUtilities(exports, _Global, _Base, ControlProcessor, Promise, _Control, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        QueryCollection: _Base.Class.derive(Array, function (items) {\n            /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection\">\n            /// <summary locid=\"WinJS.Utilities.QueryCollection\">\n            /// Represents the result of a query selector, and provides\n            /// various operations that perform actions over the elements of\n            /// the collection.\n            /// </summary>\n            /// <param name=\"items\" locid=\"WinJS.Utilities.QueryCollection_p:items\">\n            /// The items resulting from the query.\n            /// </param>\n            /// </signature>\n            if (items) {\n                this.include(items);\n            }\n        }, {\n            forEach: function (callbackFn, thisArg) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.forEach\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.forEach\">\n                /// Performs an action on each item in the QueryCollection\n                /// </summary>\n                /// <param name=\"callbackFn\" type=\"function(value, Number index, traversedObject)\" locid=\"WinJS.Utilities.QueryCollection.forEach_p:callbackFn\">\n                /// Action to perform on each item.\n                /// </param>\n                /// <param name=\"thisArg\" isOptional=\"true\" type=\"function(value, Number index, traversedObject)\" locid=\"WinJS.Utilities.QueryCollection.forEach_p:thisArg\">\n                /// Argument to bind to callbackFn\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.forEach_returnValue\">\n                /// Returns the QueryCollection\n                /// </returns>\n                /// </signature>\n                Array.prototype.forEach.apply(this, [callbackFn, thisArg]);\n                return this;\n            },\n            get: function (index) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.get\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.get\">\n                /// Gets an item from the QueryCollection.\n                /// </summary>\n                /// <param name=\"index\" type=\"Number\" locid=\"WinJS.Utilities.QueryCollection.get_p:index\">\n                /// The index of the item to return.\n                /// </param>\n                /// <returns type=\"Object\" locid=\"WinJS.Utilities.QueryCollection.get_returnValue\">\n                /// A single item from the collection.\n                /// </returns>\n                /// </signature>\n                return this[index];\n            },\n            setAttribute: function (name, value) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.setAttribute\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.setAttribute\">\n                /// Sets an attribute value on all the items in the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.setAttribute_p:name\">\n                /// The name of the attribute to be set.\n                /// </param>\n                /// <param name=\"value\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.setAttribute_p:value\">\n                /// The value of the attribute to be set.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.setAttribute_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    item.setAttribute(name, value);\n                });\n                return this;\n            },\n            getAttribute: function (name) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.getAttribute\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.getAttribute\">\n                /// Gets an attribute value from the first element in the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.getAttribute_p:name\">\n                /// The name of the attribute.\n                /// </param>\n                /// <returns type=\"String\" locid=\"WinJS.Utilities.QueryCollection.getAttribute_returnValue\">\n                /// The value of the attribute.\n                /// </returns>\n                /// </signature>\n                if (this.length > 0) {\n                    return this[0].getAttribute(name);\n                }\n            },\n            addClass: function (name) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.addClass\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.addClass\">\n                /// Adds the specified class to all the elements in the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.addClass_p:name\">\n                /// The name of the class to add.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.addClass_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    _ElementUtilities.addClass(item, name);\n                });\n                return this;\n            },\n            hasClass: function (name) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.hasClass\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.hasClass\">\n                /// Determines whether the specified class exists on the first element of the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.hasClass_p:name\">\n                /// The name of the class.\n                /// </param>\n                /// <returns type=\"Boolean\" locid=\"WinJS.Utilities.QueryCollection.hasClass_returnValue\">\n                /// true if the element has the specified class; otherwise, false.\n                /// </returns>\n                /// </signature>\n                if (this.length > 0) {\n                    return _ElementUtilities.hasClass(this[0], name);\n                }\n                return false;\n            },\n            removeClass: function (name) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.removeClass\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.removeClass\">\n                /// Removes the specified class from all the elements in the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.removeClass_p:name\">\n                /// The name of the class to be removed.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.removeClass_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    _ElementUtilities.removeClass(item, name);\n                });\n                return this;\n            },\n            toggleClass: function (name) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.toggleClass\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.toggleClass\">\n                /// Toggles (adds or removes) the specified class on all the elements in the collection.\n                /// If the class is present, it is removed; if it is absent, it is added.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.toggleClass_p:name\">\n                /// The name of the class to be toggled.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.toggleClass_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    _ElementUtilities.toggleClass(item, name);\n                });\n                return this;\n            },\n            listen: function (eventType, listener, capture) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.listen\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.listen\">\n                /// Registers the listener for the specified event on all the elements in the collection.\n                /// </summary>\n                /// <param name=\"eventType\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.listen_p:eventType\">\n                /// The name of the event.\n                /// </param>\n                /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.Utilities.QueryCollection.listen_p:listener\">\n                /// The event handler function to be called when the event occurs.\n                /// </param>\n                /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.Utilities.QueryCollection.listen_p:capture\">\n                /// true if capture == true is to be passed to addEventListener; otherwise, false.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.listen_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    item.addEventListener(eventType, listener, capture);\n                });\n                return this;\n            },\n            removeEventListener: function (eventType, listener, capture) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.removeEventListener\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.removeEventListener\">\n                /// Unregisters the listener for the specified event on all the elements in the collection.\n                /// </summary>\n                /// <param name=\"eventType\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.removeEventListener_p:eventType\">\n                /// The name of the event.\n                /// </param>\n                /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.Utilities.QueryCollection.removeEventListener_p:listener\">\n                /// The event handler function.\n                /// </param>\n                /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.Utilities.QueryCollection.removeEventListener_p:capture\">\n                /// true if capture == true; otherwise, false.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.removeEventListener_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    item.removeEventListener(eventType, listener, capture);\n                });\n                return this;\n            },\n            setStyle: function (name, value) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.setStyle\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.setStyle\">\n                /// Sets the specified style property for all the elements in the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.setStyle_p:name\">\n                /// The name of the style property.\n                /// </param>\n                /// <param name=\"value\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.setStyle_p:value\">\n                /// The value for the property.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.setStyle_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    item.style[name] = value;\n                });\n                return this;\n            },\n            clearStyle: function (name) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.clearStyle\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.clearStyle\">\n                /// Clears the specified style property for all the elements in the collection.\n                /// </summary>\n                /// <param name=\"name\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.clearStyle_p:name\">\n                /// The name of the style property to be cleared.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.clearStyle_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                this.forEach(function (item) {\n                    item.style[name] = \"\";\n                });\n                return this;\n            },\n            query: function (query) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.query\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.query\">\n                /// Executes a query selector on all the elements in the collection\n                /// and aggregates the result into a QueryCollection.\n                /// </summary>\n                /// <param name=\"query\" type=\"String\" locid=\"WinJS.Utilities.QueryCollection.query_p:query\">\n                /// The query selector string.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.query_returnValue\">\n                /// A QueryCollection object containing the aggregate results of\n                /// executing the query on all the elements in the collection.\n                /// </returns>\n                /// </signature>\n                var newCollection = new exports.QueryCollection();\n                this.forEach(function (item) {\n                    newCollection.include(item.querySelectorAll(query));\n                });\n                return newCollection;\n            },\n            include: function (items) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.include\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.include\">\n                /// Adds a set of items to this QueryCollection.\n                /// </summary>\n                /// <param name=\"items\" locid=\"WinJS.Utilities.QueryCollection.include_p:items\">\n                /// The items to add to the QueryCollection. This may be an\n                /// array-like object, a document fragment, or a single item.\n                /// </param>\n                /// </signature>\n                if (typeof items.length === \"number\") {\n                    for (var i = 0; i < items.length; i++) {\n                        this.push(items[i]);\n                    }\n                } else if (items.DOCUMENT_FRAGMENT_NODE && items.nodeType === items.DOCUMENT_FRAGMENT_NODE) {\n                    this.include(items.childNodes);\n                } else {\n                    this.push(items);\n                }\n            },\n            control: function (Ctor, options) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.control\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.control\">\n                /// Creates controls that are attached to the elements in this QueryCollection.\n                /// </summary>\n                /// <param name='Ctor' locid=\"WinJS.Utilities.QueryCollection.control_p:ctor\">\n                /// A constructor function that is used to create controls to attach to the elements.\n                /// </param>\n                /// <param name='options' locid=\"WinJS.Utilities.QueryCollection.control_p:options\">\n                /// The options passed to the newly-created controls.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.control_returnValue\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n                /// <signature>\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.control2\">\n                /// Configures the controls that are attached to the elements in this QueryCollection.\n                /// </summary>\n                /// <param name='ctor' locid=\"WinJS.Utilities.QueryCollection.control_p:ctor2\">\n                /// The options passed to the controls.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.control_returnValue2\">\n                /// This QueryCollection object.\n                /// </returns>\n                /// </signature>\n\n                if (Ctor && typeof (Ctor) === \"function\") {\n                    this.forEach(function (element) {\n                        element.winControl = new Ctor(element, options);\n                    });\n                } else {\n                    options = Ctor;\n                    this.forEach(function (element) {\n                        ControlProcessor.process(element).done(function (control) {\n                            control && _Control.setOptions(control, options);\n                        });\n                    });\n                }\n                return this;\n            },\n            template: function (templateElement, data, renderDonePromiseCallback) {\n                /// <signature helpKeyword=\"WinJS.Utilities.QueryCollection.template\">\n                /// <summary locid=\"WinJS.Utilities.QueryCollection.template\">\n                /// Renders a template that is bound to the given data\n                /// and parented to the elements included in the QueryCollection.\n                /// If the QueryCollection contains multiple elements, the template\n                /// is rendered multiple times, once at each element in the QueryCollection\n                /// per item of data passed.\n                /// </summary>\n                /// <param name=\"templateElement\" type=\"DOMElement\" locid=\"WinJS.Utilities.QueryCollection.template_p:templateElement\">\n                /// The DOM element to which the template control is attached to.\n                /// </param>\n                /// <param name=\"data\" type=\"Object\" locid=\"WinJS.Utilities.QueryCollection.template_p:data\">\n                /// The data to render. If the data is an array (or any other object\n                /// that has a forEach method) then the template is rendered\n                /// multiple times, once for each item in the collection.\n                /// </param>\n                /// <param name=\"renderDonePromiseCallback\" type=\"Function\" locid=\"WinJS.Utilities.QueryCollection.template_p:renderDonePromiseCallback\">\n                /// If supplied, this function is called\n                /// each time the template gets rendered, and is passed a promise\n                /// that is fulfilled when the template rendering is complete.\n                /// </param>\n                /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.QueryCollection.template_returnValue\">\n                /// The QueryCollection.\n                /// </returns>\n                /// </signature>\n                if (templateElement instanceof exports.QueryCollection) {\n                    templateElement = templateElement[0];\n                }\n                var template = templateElement.winControl;\n\n                if (data === null || data === undefined || !data.forEach) {\n                    data = [data];\n                }\n\n                renderDonePromiseCallback = renderDonePromiseCallback || function () { };\n\n                var that = this;\n                var donePromises = [];\n                data.forEach(function (datum) {\n                    that.forEach(function (element) {\n                        donePromises.push(template.render(datum, element));\n                    });\n                });\n                renderDonePromiseCallback(Promise.join(donePromises));\n\n                return this;\n            }\n        }, {\n            supportedForProcessing: false,\n        }),\n\n        query: function (query, element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.query\">\n            /// <summary locid=\"WinJS.Utilities.query\">\n            /// Executes a query selector on the specified element or the entire document.\n            /// </summary>\n            /// <param name=\"query\" type=\"String\" locid=\"WinJS.Utilities.query_p:query\">\n            /// The query selector to be executed.\n            /// </param>\n            /// <param name=\"element\" optional=\"true\" type=\"HTMLElement\" locid=\"WinJS.Utilities.query_p:element\">\n            /// The element on which to execute the query. If this parameter is not specified, the\n            /// query is executed on the entire document.\n            /// </param>\n            /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.query_returnValue\">\n            /// The QueryCollection that contains the results of the query.\n            /// </returns>\n            /// </signature>\n            return new exports.QueryCollection((element || _Global.document).querySelectorAll(query));\n        },\n\n        id: function (id) {\n            /// <signature helpKeyword=\"WinJS.Utilities.id\">\n            /// <summary locid=\"WinJS.Utilities.id\">\n            /// Looks up an element by ID and wraps the result in a QueryCollection.\n            /// </summary>\n            /// <param name=\"id\" type=\"String\" locid=\"WinJS.Utilities.id_p:id\">\n            /// The ID of the element.\n            /// </param>\n            /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.id_returnValue\">\n            /// A QueryCollection that contains the element, if it is found.\n            /// </returns>\n            /// </signature>\n            var e = _Global.document.getElementById(id);\n            return new exports.QueryCollection(e ? [e] : []);\n        },\n\n        children: function (element) {\n            /// <signature helpKeyword=\"WinJS.Utilities.children\">\n            /// <summary locid=\"WinJS.Utilities.children\">\n            /// Creates a QueryCollection that contains the children of the specified parent element.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.children_p:element\">\n            /// The parent element.\n            /// </param>\n            /// <returns type=\"WinJS.Utilities.QueryCollection\" locid=\"WinJS.Utilities.children_returnValue\">\n            /// The QueryCollection that contains the children of the element.\n            /// </returns>\n            /// </signature>\n            return new exports.QueryCollection(element.children);\n        }\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_Hoverable',[\n    'exports',\n    '../Core/_Global'\n], function hoverable(exports, _Global) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    _Global.document.documentElement.classList.add(\"win-hoverable\");\n    exports.isHoverable = true;\n\n    if (!_Global.MSPointerEvent) {\n        var touchStartHandler = function () {\n            _Global.document.removeEventListener(\"touchstart\", touchStartHandler);\n            // Remove win-hoverable CSS class fromstartt . <html> to avoid :hover styles in webkit when there is\n            // touch support.\n            _Global.document.documentElement.classList.remove(\"win-hoverable\");\n            exports.isHoverable = false;\n        };\n\n        _Global.document.addEventListener(\"touchstart\", touchStartHandler);\n    }\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_ParallelWorkQueue',[\n    'exports',\n    '../Core/_Base',\n    '../Promise',\n    '../Scheduler'\n    ], function parallelWorkQueueInit(exports, _Base, Promise, Scheduler) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _ParallelWorkQueue : _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function ParallelWorkQueue_ctor(maxRunning) {\n                var workIndex = 0;\n                var workItems = {};\n                var workQueue = [];\n\n                maxRunning = maxRunning || 3;\n                var running = 0;\n                var processing = 0;\n                function runNext() {\n                    running--;\n                    // if we have fallen out of this loop, then we know we are already\n                    // async, so \"post\" is OK. If we are still in the loop, then the\n                    // loop will continue to run, so we don't need to \"post\" or\n                    // recurse. This avoids stack overflow in the sync case.\n                    //\n                    if (!processing) {\n                        Scheduler.schedule(run, Scheduler.Priority.normal,\n                            null, \"WinJS._ParallelWorkQueue.runNext\");\n                    }\n                }\n                function run() {\n                    processing++;\n                    for (; running < maxRunning; running++) {\n                        var next;\n                        var nextWork;\n                        do {\n                            next = workQueue.shift();\n                            nextWork = next && workItems[next];\n                        } while (next && !nextWork);\n\n                        if (nextWork) {\n                            delete workItems[next];\n                            try {\n                                nextWork().then(runNext, runNext);\n                            }\n                            catch (err) {\n                                // this will only get hit if there is a queued item that\n                                // fails to return something that conforms to the Promise\n                                // contract\n                                //\n                                runNext();\n                            }\n                        } else {\n                            break;\n                        }\n                    }\n                    processing--;\n                }\n                function queue(f, data, first) {\n                    var id = \"w\" + (workIndex++);\n                    var workPromise;\n                    return new Promise(\n                        function (c, e, p) {\n                            var w = function () {\n                                workPromise = f().then(c, e, p);\n                                return workPromise;\n                            };\n                            w.data = data;\n                            workItems[id] = w;\n                            if (first) {\n                                workQueue.unshift(id);\n                            } else {\n                                workQueue.push(id);\n                            }\n                            run();\n                        },\n                        function () {\n                            delete workItems[id];\n                            if (workPromise) {\n                                workPromise.cancel();\n                            }\n                        }\n                    );\n                }\n\n                this.sort = function (f) {\n                    workQueue.sort(function (a, b) {\n                        a = workItems[a];\n                        b = workItems[b];\n                        return a === undefined && b === undefined ? 0 : a === undefined ? 1 : b === undefined ? -1 : f(a.data, b.data);\n                    });\n                };\n                this.queue = queue;\n            }, {\n                /* empty */\n            }, {\n                supportedForProcessing: false,\n            });\n        })\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_VersionManager',[\n    'exports',\n    '../Core/_Base',\n    '../_Signal'\n    ], function versionManagerInit(exports, _Base, _Signal) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _VersionManager: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function _VersionManager_ctor() {\n                this._unlocked = new _Signal();\n                this._unlocked.complete();\n            }, {\n                _cancelCount: 0,\n                _notificationCount: 0,\n                _updateCount: 0,\n                _version: 0,\n\n                // This should be used generally for all logic that should be suspended while data changes are happening\n                //\n                locked: { get: function () { return this._notificationCount !== 0 || this._updateCount !== 0; } },\n\n                // this should only be accessed by the update logic in ListViewImpl.js\n                //\n                noOutstandingNotifications: { get: function () { return this._notificationCount === 0; } },\n                version: { get: function () { return this._version; } },\n\n                unlocked: { get: function () { return this._unlocked.promise; } },\n\n                _dispose: function () {\n                    if (this._unlocked) {\n                        this._unlocked.cancel();\n                        this._unlocked = null;\n                    }\n                },\n\n                beginUpdating: function () {\n                    this._checkLocked();\n                    this._updateCount++;\n                },\n                endUpdating: function () {\n                    this._updateCount--;\n                    this._checkUnlocked();\n                },\n                beginNotifications: function () {\n                    this._checkLocked();\n                    this._notificationCount++;\n                },\n                endNotifications: function () {\n                    this._notificationCount--;\n                    this._checkUnlocked();\n                },\n                _checkLocked: function () {\n                    if (!this.locked) {\n                        this._dispose();\n                        this._unlocked = new _Signal();\n                    }\n                },\n                _checkUnlocked: function () {\n                    if (!this.locked) {\n                        this._unlocked.complete();\n                    }\n                },\n                receivedNotification: function () {\n                    this._version++;\n                    if (this._cancel) {\n                        var cancel = this._cancel;\n                        this._cancel = null;\n                        cancel.forEach(function (p) { p && p.cancel(); });\n                    }\n                },\n                cancelOnNotification: function (promise) {\n                    if (!this._cancel) {\n                        this._cancel = [];\n                        this._cancelCount = 0;\n                    }\n                    this._cancel[this._cancelCount++] = promise;\n                    return this._cancelCount - 1;\n                },\n                clearCancelOnNotification: function (token) {\n                    if (this._cancel) {\n                        delete this._cancel[token];\n                    }\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        })\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Items Manager\n\ndefine('WinJS/Utilities/_ItemsManager',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../_Signal',\n    '../Scheduler',\n    '../Utilities/_ElementUtilities',\n    './_ParallelWorkQueue',\n    './_VersionManager'\n    ], function itemsManagerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, Promise, _Signal, Scheduler, _ElementUtilities, _ParallelWorkQueue, _VersionManager) {\n    \"use strict\";\n\n    var markSupportedForProcessing = _BaseUtils.markSupportedForProcessing;\n    var uniqueID = _ElementUtilities._uniqueID;\n\n    function simpleItemRenderer(f) {\n        return markSupportedForProcessing(function (itemPromise, element) {\n            return itemPromise.then(function (item) {\n                return (item ? f(item, element) : null);\n            });\n        });\n    }\n\n    var trivialHtmlRenderer = simpleItemRenderer(function (item) {\n        if (_ElementUtilities._isDOMElement(item.data)) {\n            return item.data;\n        }\n\n        var data = item.data;\n        if (data === undefined) {\n            data = \"undefined\";\n        } else if (data === null) {\n            data = \"null\";\n        } else if (typeof data === \"object\") {\n            data = JSON.stringify(data);\n        }\n\n        var element = _Global.document.createElement(\"span\");\n        element.textContent = data.toString();\n        return element;\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _normalizeRendererReturn: function (v) {\n            if (v) {\n                if (typeof v === \"object\" && v.element) {\n                    var elementPromise = Promise.as(v.element);\n                    return elementPromise.then(function (e) { return { element: e, renderComplete: Promise.as(v.renderComplete) }; });\n                } else {\n                    var elementPromise = Promise.as(v);\n                    return elementPromise.then(function (e) { return { element: e, renderComplete: Promise.as() }; });\n                }\n            } else {\n                return { element: null, renderComplete: Promise.as() };\n            }\n        },\n        simpleItemRenderer: simpleItemRenderer,\n        _trivialHtmlRenderer: trivialHtmlRenderer\n    });\n\n    // Private statics\n\n    var strings = {\n        get listDataSourceIsInvalid() { return \"Invalid argument: dataSource must be an object.\"; },\n        get itemRendererIsInvalid() { return \"Invalid argument: itemRenderer must be a function.\"; },\n        get itemIsInvalid() { return \"Invalid argument: item must be a DOM element that was returned by the Items Manager, and has not been replaced or released.\"; },\n    };\n\n    var imageLoader;\n    var lastSort = new Date();\n    var minDurationBetweenImageSort = 64;\n\n    // This optimization is good for a couple of reasons:\n    // - It is a global optimizer, which means that all on screen images take precedence over all off screen images.\n    // - It avoids resorting too frequently by only resorting when a new image loads and it has been at least 64 ms since\n    //   the last sort.\n    // Also, it is worth noting that \"sort\" on an empty queue does no work (besides the function call).\n    function compareImageLoadPriority(a, b) {\n        var aon = false;\n        var bon = false;\n\n        // Currently isOnScreen is synchronous and fast for list view\n        a.isOnScreen().then(function (v) { aon = v; });\n        b.isOnScreen().then(function (v) { bon = v; });\n\n        return (aon ? 0 : 1) - (bon ? 0 : 1);\n    }\n\n    var nextImageLoaderId = 0;\n    var seenUrls = {};\n    var seenUrlsMRU = [];\n    var SEEN_URLS_MAXSIZE = 250;\n    var SEEN_URLS_MRU_MAXSIZE = 1000;\n\n    function seenUrl(srcUrl) {\n        if ((/^blob:/i).test(srcUrl)) {\n            return;\n        }\n\n        seenUrls[srcUrl] = true;\n        seenUrlsMRU.push(srcUrl);\n\n        if (seenUrlsMRU.length > SEEN_URLS_MRU_MAXSIZE) {\n            var mru = seenUrlsMRU;\n            seenUrls = {};\n            seenUrlsMRU = [];\n\n            for (var count = 0, i = mru.length - 1; i >= 0 && count < SEEN_URLS_MAXSIZE; i--) {\n                var url = mru[i];\n                if (!seenUrls[url]) {\n                    seenUrls[url] = true;\n                    count++;\n                }\n            }\n        }\n    }\n\n    // Exposing the seenUrl related members to use them in unit tests\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _seenUrl: seenUrl,\n        _getSeenUrls: function () {\n            return seenUrls;\n        },\n        _getSeenUrlsMRU: function () {\n            return seenUrlsMRU;\n        },\n        _seenUrlsMaxSize: SEEN_URLS_MAXSIZE,\n        _seenUrlsMRUMaxSize: SEEN_URLS_MRU_MAXSIZE\n    });\n\n    function loadImage(srcUrl, image, data) {\n        var imageId = nextImageLoaderId++;\n        imageLoader = imageLoader || new _ParallelWorkQueue._ParallelWorkQueue(6);\n        return imageLoader.queue(function () {\n            return new Promise(function (c, e) {\n                Scheduler.schedule(function ImageLoader_async_loadImage(jobInfo) {\n                    if (!image) {\n                        image = _Global.document.createElement(\"img\");\n                    }\n\n                    var seen = seenUrls[srcUrl];\n\n                    if (!seen) {\n                        jobInfo.setPromise(new Promise(function (imageLoadComplete) {\n                            var tempImage = _Global.document.createElement(\"img\");\n\n                            var cleanup = function () {\n                                tempImage.removeEventListener(\"load\", loadComplete, false);\n                                tempImage.removeEventListener(\"error\", loadError, false);\n\n                                // One time use blob images are cleaned up as soon as they are not referenced by images any longer.\n                                // We set the image src before clearing the tempImage src to make sure the blob image is always\n                                // referenced.\n                                image.src = srcUrl;\n\n                                var currentDate = new Date();\n                                if (currentDate - lastSort > minDurationBetweenImageSort) {\n                                    lastSort = currentDate;\n                                    imageLoader.sort(compareImageLoadPriority);\n                                }\n                            };\n\n                            var loadComplete = function () {\n                                imageLoadComplete(jobComplete);\n                            };\n                            var loadError = function () {\n                                imageLoadComplete(jobError);\n                            };\n\n                            var jobComplete = function () {\n                                seenUrl(srcUrl);\n                                cleanup();\n                                c(image);\n                            };\n                            var jobError = function () {\n                                cleanup();\n                                e(image);\n                            };\n\n                            tempImage.addEventListener(\"load\", loadComplete, false);\n                            tempImage.addEventListener(\"error\", loadError, false);\n                            tempImage.src = srcUrl;\n                        }));\n                    } else {\n                        seenUrl(srcUrl);\n                        image.src = srcUrl;\n                        c(image);\n                    }\n                }, Scheduler.Priority.normal, null, \"WinJS.UI._ImageLoader._image\" + imageId);\n            });\n        }, data);\n    }\n\n    function isImageCached(srcUrl) {\n        return seenUrls[srcUrl];\n    }\n\n    function defaultRenderer() {\n        return _Global.document.createElement(\"div\");\n    }\n\n    // Public definitions\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _createItemsManager: _Base.Namespace._lazy(function () {\n            var ListNotificationHandler = _Base.Class.define(function ListNotificationHandler_ctor(itemsManager) {\n                // Constructor\n\n                this._itemsManager = itemsManager;\n            }, {\n                // Public methods\n\n                beginNotifications: function () {\n                    this._itemsManager._versionManager.beginNotifications();\n                    this._itemsManager._beginNotifications();\n                },\n\n                // itemAvailable: not implemented\n\n                inserted: function (itemPromise, previousHandle, nextHandle) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._inserted(itemPromise, previousHandle, nextHandle);\n                },\n\n                changed: function (newItem, oldItem) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._changed(newItem, oldItem);\n                },\n\n                moved: function (itemPromise, previousHandle, nextHandle) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._moved(itemPromise, previousHandle, nextHandle);\n                },\n\n                removed: function (handle, mirage) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._removed(handle, mirage);\n                },\n\n                countChanged: function (newCount, oldCount) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._countChanged(newCount, oldCount);\n                },\n\n                indexChanged: function (handle, newIndex, oldIndex) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._indexChanged(handle, newIndex, oldIndex);\n                },\n\n                affectedRange: function (range) {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._affectedRange(range);\n                },\n\n                endNotifications: function () {\n                    this._itemsManager._versionManager.endNotifications();\n                    this._itemsManager._endNotifications();\n                },\n\n                reload: function () {\n                    this._itemsManager._versionManager.receivedNotification();\n                    this._itemsManager._reload();\n                }\n            }, { // Static Members\n                supportedForProcessing: false,\n            });\n\n            var ItemsManager = _Base.Class.define(function ItemsManager_ctor(listDataSource, itemRenderer, elementNotificationHandler, options) {\n                // Constructor\n\n                if (!listDataSource) {\n                    throw new _ErrorFromName(\"WinJS.UI.ItemsManager.ListDataSourceIsInvalid\", strings.listDataSourceIsInvalid);\n                }\n                if (!itemRenderer) {\n                    throw new _ErrorFromName(\"WinJS.UI.ItemsManager.ItemRendererIsInvalid\", strings.itemRendererIsInvalid);\n                }\n\n                this.$pipeline_callbacksMap = {};\n\n                this._listDataSource = listDataSource;\n\n                this.dataSource = this._listDataSource;\n\n                this._elementNotificationHandler = elementNotificationHandler;\n\n                this._listBinding = this._listDataSource.createListBinding(new ListNotificationHandler(this));\n\n                if (options) {\n                    if (options.ownerElement) {\n                        this._ownerElement = options.ownerElement;\n                    }\n                    this._profilerId = options.profilerId;\n                    this._versionManager = options.versionManager || new _VersionManager._VersionManager();\n                }\n\n                this._indexInView = options && options.indexInView;\n                this._itemRenderer = itemRenderer;\n                this._viewCallsReady = options && options.viewCallsReady;\n\n                // Map of (the uniqueIDs of) elements to records for items\n                this._elementMap = {};\n\n                // Map of handles to records for items\n                this._handleMap = {};\n\n                // Owner for use with jobs on the scheduler. Allows for easy cancellation of jobs during clean up.\n                this._jobOwner = Scheduler.createOwnerToken();\n\n                // Boolean to track whether endNotifications needs to be called on the ElementNotificationHandler\n                this._notificationsSent = false;\n\n                // Only enable the lastItem method if the data source implements the itemsFromEnd method\n                if (this._listBinding.last) {\n                    this.lastItem = function () {\n                        return this._elementForItem(this._listBinding.last());\n                    };\n                }\n            }, {\n                _itemFromItemPromise: function (itemPromise) {\n                    return this._waitForElement(this._elementForItem(itemPromise));\n                },\n                // If stage 0 is not yet complete, caller is responsible for transitioning the item from stage 0 to stage 1\n                _itemFromItemPromiseThrottled: function (itemPromise) {\n                    return this._waitForElement(this._elementForItem(itemPromise, true));\n                },\n                _itemAtIndex: function (index) {\n                    var itemPromise = this._itemPromiseAtIndex(index);\n                    this._itemFromItemPromise(itemPromise).then(null, function (e) {\n                        itemPromise.cancel();\n                        return Promise.wrapError(e);\n                    });\n                },\n                _itemPromiseAtIndex: function (index) {\n                    return this._listBinding.fromIndex(index);\n                },\n                _waitForElement: function (possiblePlaceholder) {\n                    var that = this;\n                    return new Promise(function (c) {\n                        if (possiblePlaceholder) {\n                            if (!that.isPlaceholder(possiblePlaceholder)) {\n                                c(possiblePlaceholder);\n                            } else {\n                                var placeholderID = uniqueID(possiblePlaceholder);\n                                var callbacks = that.$pipeline_callbacksMap[placeholderID];\n                                if (!callbacks) {\n                                    that.$pipeline_callbacksMap[placeholderID] = [c];\n                                } else {\n                                    callbacks.push(c);\n                                }\n                            }\n                        } else {\n                            c(possiblePlaceholder);\n                        }\n                    });\n                },\n                _updateElement: function (newElement, oldElement) {\n                    var placeholderID = uniqueID(oldElement);\n                    var callbacks = this.$pipeline_callbacksMap[placeholderID];\n                    if (callbacks) {\n                        delete this.$pipeline_callbacksMap[placeholderID];\n                        callbacks.forEach(function (c) { c(newElement); });\n                    }\n                },\n                _firstItem: function () {\n                    return this._waitForElement(this._elementForItem(this._listBinding.first()));\n                },\n                _lastItem: function () {\n                    return this._waitForElement(this._elementForItem(this._listBinding.last()));\n                },\n                _previousItem: function (element) {\n                    this._listBinding.jumpToItem(this._itemFromElement(element));\n                    return this._waitForElement(this._elementForItem(this._listBinding.previous()));\n                },\n                _nextItem: function (element) {\n                    this._listBinding.jumpToItem(this._itemFromElement(element));\n                    return this._waitForElement(this._elementForItem(this._listBinding.next()));\n                },\n                _itemFromPromise: function (itemPromise) {\n                    return this._waitForElement(this._elementForItem(itemPromise));\n                },\n                isPlaceholder: function (item) {\n                    return !!this._recordFromElement(item).elementIsPlaceholder;\n                },\n\n                itemObject: function (element) {\n                    return this._itemFromElement(element);\n                },\n\n                release: function () {\n                    this._listBinding.release();\n                    this._elementNotificationHandler = null;\n                    this._listBinding = null;\n                    this._jobOwner.cancelAll();\n                    this._released = true;\n                },\n\n                releaseItemPromise: function (itemPromise) {\n                    var handle = itemPromise.handle;\n                    var record = this._handleMap[handle];\n                    if (!record) {\n                        // The item promise is not in our handle map so we didn't even try to render it yet.\n                        itemPromise.cancel();\n                    } else {\n                        this._releaseRecord(record);\n                    }\n                },\n\n                releaseItem: function (element) {\n                    var record = this._elementMap[uniqueID(element)];\n                    this._releaseRecord(record);\n                },\n\n                _releaseRecord: function (record) {\n                    if (!record) { return; }\n\n                    if (record.renderPromise) {\n                        record.renderPromise.cancel();\n                    }\n                    if (record.itemPromise) {\n                        record.itemPromise.cancel();\n                    }\n                    if (record.imagePromises) {\n                        record.imagePromises.forEach(function (promise) {\n                            promise.cancel();\n                        });\n                    }\n                    if (record.itemReadyPromise) {\n                        record.itemReadyPromise.cancel();\n                    }\n                    if (record.renderComplete) {\n                        record.renderComplete.cancel();\n                    }\n\n                    this._removeEntryFromElementMap(record.element);\n                    this._removeEntryFromHandleMap(record.itemPromise.handle, record);\n\n                    if (record.item) {\n                        this._listBinding.releaseItem(record.item);\n                    }\n\n                },\n\n                refresh: function () {\n                    return this._listDataSource.invalidateAll();\n                },\n\n                // Private members\n\n                _handlerToNotifyCaresAboutItemAvailable: function () {\n                    return !!(this._elementNotificationHandler && this._elementNotificationHandler.itemAvailable);\n                },\n\n                _handlerToNotify: function () {\n                    if (!this._notificationsSent) {\n                        this._notificationsSent = true;\n\n                        if (this._elementNotificationHandler && this._elementNotificationHandler.beginNotifications) {\n                            this._elementNotificationHandler.beginNotifications();\n                        }\n                    }\n                    return this._elementNotificationHandler;\n                },\n\n                _defineIndexProperty: function (itemForRenderer, item, record) {\n                    record.indexObserved = false;\n                    Object.defineProperty(itemForRenderer, \"index\", {\n                        get: function () {\n                            record.indexObserved = true;\n                            return item.index;\n                        }\n                    });\n                },\n\n                _renderPlaceholder: function (record) {\n                    var itemForRenderer = {};\n                    var elementPlaceholder = defaultRenderer(itemForRenderer);\n                    record.elementIsPlaceholder = true;\n                    return elementPlaceholder;\n                },\n\n                _renderItem: function (itemPromise, record, callerThrottlesStage1) {\n                    var that = this;\n                    var indexInView = that._indexInView || function () { return true; };\n                    var stage1Signal = new _Signal();\n                    var readySignal = new _Signal();\n                    var perfItemPromiseId = \"_renderItem(\" + record.item.index + \"):itemPromise\";\n\n                    var stage0RunningSync = true;\n                    var stage0Ran = false;\n                    itemPromise.then(function (item) {\n                        stage0Ran = true;\n                        if (stage0RunningSync) {\n                            stage1Signal.complete(item);\n                        }\n                    });\n                    stage0RunningSync = false;\n\n                    var itemForRendererPromise = stage1Signal.promise.then(function (item) {\n                        if (item) {\n                            var itemForRenderer = Object.create(item);\n                            // Derive a new item and override its index property, to track whether it is read\n                            that._defineIndexProperty(itemForRenderer, item, record);\n                            itemForRenderer.ready = readySignal.promise;\n                            itemForRenderer.isOnScreen = function () {\n                                return Promise.wrap(indexInView(item.index));\n                            };\n                            itemForRenderer.loadImage = function (srcUrl, image) {\n                                var loadImagePromise = loadImage(srcUrl, image, itemForRenderer);\n                                if (record.imagePromises) {\n                                    record.imagePromises.push(loadImagePromise);\n                                } else {\n                                    record.imagePromises = [loadImagePromise];\n                                }\n                                return loadImagePromise;\n                            };\n                            itemForRenderer.isImageCached = isImageCached;\n                            return itemForRenderer;\n                        } else {\n                            return Promise.cancel;\n                        }\n                    });\n\n                    function queueAsyncStage1() {\n                        itemPromise.then(function (item) {\n                            that._writeProfilerMark(perfItemPromiseId + \",StartTM\");\n                            stage1Signal.complete(item);\n                            that._writeProfilerMark(perfItemPromiseId + \",StopTM\");\n                        });\n                    }\n                    if (!stage0Ran) {\n                        if (callerThrottlesStage1) {\n                            record.stage0 = itemPromise;\n                            record.startStage1 = function () {\n                                record.startStage1 = null;\n                                queueAsyncStage1();\n                            };\n                        } else {\n                            queueAsyncStage1();\n                        }\n                    }\n\n                    itemForRendererPromise.handle = itemPromise.handle;\n                    record.itemPromise = itemForRendererPromise;\n                    record.itemReadyPromise = readySignal.promise;\n                    record.readyComplete = false;\n\n                    // perfRendererWorkId = stage 1 rendering (if itemPromise is async) or stage 1+2 (if itemPromise is sync and ran inline)\n                    // perfItemPromiseId = stage 2 rendering only (should only be emitted if itemPromise was async)\n                    // perfItemReadyId = stage 3 rendering\n                    var perfRendererWorkId = \"_renderItem(\" + record.item.index + (stage0Ran ? \"):syncItemPromise\" : \"):placeholder\");\n                    var perfItemReadyId = \"_renderItem(\" + record.item.index + \"):itemReady\";\n\n                    this._writeProfilerMark(perfRendererWorkId + \",StartTM\");\n                    var rendererPromise = Promise.as(that._itemRenderer(itemForRendererPromise, record.element)).\n                        then(exports._normalizeRendererReturn).\n                        then(function (v) {\n                            if (that._released) {\n                                return Promise.cancel;\n                            }\n\n                            itemForRendererPromise.then(function (item) {\n                                // Store pending ready callback off record so ScrollView can call it during realizePage. Otherwise\n                                // call it ourselves.\n                                record.pendingReady = function () {\n                                    if (record.pendingReady) {\n                                        record.pendingReady = null;\n                                        record.readyComplete = true;\n                                        that._writeProfilerMark(perfItemReadyId + \",StartTM\");\n                                        readySignal.complete(item);\n                                        that._writeProfilerMark(perfItemReadyId + \",StopTM\");\n                                    }\n                                };\n                                if (!that._viewCallsReady) {\n                                    var job = Scheduler.schedule(record.pendingReady, Scheduler.Priority.normal,\n                                        record, \"WinJS.UI._ItemsManager._pendingReady\");\n                                    job.owner = that._jobOwner;\n                                }\n                            });\n                            return v;\n                        });\n\n                    this._writeProfilerMark(perfRendererWorkId + \",StopTM\");\n                    return rendererPromise;\n                },\n\n                _replaceElement: function (record, elementNew) {\n                    this._removeEntryFromElementMap(record.element);\n                    record.element = elementNew;\n                    this._addEntryToElementMap(elementNew, record);\n                },\n\n                _changeElement: function (record, elementNew, elementNewIsPlaceholder) {\n                    record.renderPromise = null;\n                    var elementOld = record.element,\n                        itemOld = record.item;\n\n                    if (record.newItem) {\n                        record.item = record.newItem;\n                        record.newItem = null;\n                    }\n\n                    this._replaceElement(record, elementNew);\n\n                    if (record.item && record.elementIsPlaceholder && !elementNewIsPlaceholder) {\n                        record.elementDelayed = null;\n                        record.elementIsPlaceholder = false;\n                        this._updateElement(record.element, elementOld);\n                        if (this._handlerToNotifyCaresAboutItemAvailable()) {\n                            this._handlerToNotify().itemAvailable(record.element, elementOld);\n                        }\n                    } else {\n                        this._handlerToNotify().changed(elementNew, elementOld, itemOld);\n                    }\n                },\n\n                _elementForItem: function (itemPromise, callerThrottlesStage1) {\n                    var handle = itemPromise.handle,\n                        record = this._recordFromHandle(handle, true),\n                        element;\n\n                    if (!handle) {\n                        return null;\n                    }\n\n                    if (record) {\n                        element = record.element;\n                    } else {\n                        // Create a new record for this item\n                        record = {\n                            item: itemPromise,\n                            itemPromise: itemPromise\n                        };\n                        this._addEntryToHandleMap(handle, record);\n\n                        var that = this;\n                        var mirage = false;\n                        var synchronous = false;\n\n                        var renderPromise =\n                            that._renderItem(itemPromise, record, callerThrottlesStage1).\n                            then(function (v) {\n                                var elementNew = v.element;\n                                record.renderComplete = v.renderComplete;\n\n                                itemPromise.then(function (item) {\n                                    record.item = item;\n                                    if (!item) {\n                                        mirage = true;\n                                        element = null;\n                                    }\n                                });\n\n                                synchronous = true;\n                                record.renderPromise = null;\n\n                                if (elementNew) {\n                                    if (element) {\n                                        that._presentElements(record, elementNew);\n                                    } else {\n                                        element = elementNew;\n                                    }\n                                }\n                            });\n\n                        if (!mirage) {\n                            if (!synchronous) {\n                                record.renderPromise = renderPromise;\n                            }\n\n                            if (!element) {\n                                element = this._renderPlaceholder(record);\n                            }\n\n                            record.element = element;\n                            this._addEntryToElementMap(element, record);\n\n                            itemPromise.retain();\n                        }\n                    }\n\n                    return element;\n                },\n\n                _addEntryToElementMap: function (element, record) {\n                    this._elementMap[uniqueID(element)] = record;\n                },\n\n                _removeEntryFromElementMap: function (element) {\n                    delete this._elementMap[uniqueID(element)];\n                },\n\n                _recordFromElement: function (element) {\n                    var record = this._elementMap[uniqueID(element)];\n                    if (!record) {\n                        this._writeProfilerMark(\"_recordFromElement:ItemIsInvalidError,info\");\n                        throw new _ErrorFromName(\"WinJS.UI.ItemsManager.ItemIsInvalid\", strings.itemIsInvalid);\n                    }\n\n                    return record;\n                },\n\n                _addEntryToHandleMap: function (handle, record) {\n                    this._handleMap[handle] = record;\n                },\n\n                _removeEntryFromHandleMap: function (handle) {\n                    delete this._handleMap[handle];\n                },\n\n                _handleInHandleMap: function (handle) {\n                    return !!this._handleMap[handle];\n                },\n\n                _recordFromHandle: function (handle, ignoreFailure) {\n                    var record = this._handleMap[handle];\n                    if (!record && !ignoreFailure) {\n                        throw new _ErrorFromName(\"WinJS.UI.ItemsManager.ItemIsInvalid\", strings.itemIsInvalid);\n                    }\n                    return record;\n                },\n\n                _foreachRecord: function (callback) {\n                    var records = this._handleMap;\n                    for (var property in records) {\n                        var record = records[property];\n                        callback(record);\n                    }\n                },\n\n                _itemFromElement: function (element) {\n                    return this._recordFromElement(element).item;\n                },\n\n                _elementFromHandle: function (handle) {\n                    if (handle) {\n                        var record = this._recordFromHandle(handle, true);\n\n                        if (record && record.element) {\n                            return record.element;\n                        }\n                    }\n\n                    return null;\n                },\n\n                _inserted: function (itemPromise, previousHandle, nextHandle) {\n                    this._handlerToNotify().inserted(itemPromise, previousHandle, nextHandle);\n                },\n\n                _changed: function (newItem, oldItem) {\n                    if (!this._handleInHandleMap(oldItem.handle)) { return; }\n\n                    var record = this._recordFromHandle(oldItem.handle);\n\n                    if (record.renderPromise) {\n                        record.renderPromise.cancel();\n                    }\n                    if (record.itemPromise) {\n                        record.itemPromise.cancel();\n                    }\n                    if (record.imagePromises) {\n                        record.imagePromises.forEach(function (promise) {\n                            promise.cancel();\n                        });\n                    }\n                    if (record.itemReadyPromise) {\n                        record.itemReadyPromise.cancel();\n                    }\n                    if (record.renderComplete) {\n                        record.renderComplete.cancel();\n                    }\n\n                    record.newItem = newItem;\n\n                    var that = this;\n                    var newItemPromise = Promise.as(newItem);\n                    newItemPromise.handle = record.itemPromise.handle;\n                    record.renderPromise = this._renderItem(newItemPromise, record).\n                        then(function (v) {\n                            record.renderComplete = v.renderComplete;\n                            that._changeElement(record, v.element, false);\n                            that._presentElements(record);\n                        });\n                },\n\n                _moved: function (itemPromise, previousHandle, nextHandle) {\n                    // no check for haveHandle, as we get move notification for items we\n                    // are \"next\" to, so we handle the \"null element\" cases below\n                    //\n                    var element = this._elementFromHandle(itemPromise.handle);\n                    var previous = this._elementFromHandle(previousHandle);\n                    var next = this._elementFromHandle(nextHandle);\n\n                    this._handlerToNotify().moved(element, previous, next, itemPromise);\n                    this._presentAllElements();\n                },\n\n                _removed: function (handle, mirage) {\n                    if (this._handleInHandleMap(handle)) {\n                        var element = this._elementFromHandle(handle);\n\n                        this._handlerToNotify().removed(element, mirage, handle);\n                        this.releaseItem(element);\n                        this._presentAllElements();\n                    } else {\n                        this._handlerToNotify().removed(null, mirage, handle);\n                    }\n                },\n\n                _countChanged: function (newCount, oldCount) {\n                    if (this._elementNotificationHandler && this._elementNotificationHandler.countChanged) {\n                        this._handlerToNotify().countChanged(newCount, oldCount);\n                    }\n                },\n\n                _indexChanged: function (handle, newIndex, oldIndex) {\n                    var element;\n                    if (this._handleInHandleMap(handle)) {\n                        var record = this._recordFromHandle(handle);\n                        if (record.indexObserved) {\n                            if (!record.elementIsPlaceholder) {\n                                if (record.item.index !== newIndex) {\n                                    if (record.renderPromise) {\n                                        record.renderPromise.cancel();\n                                    }\n                                    if (record.renderComplete) {\n                                        record.renderComplete.cancel();\n                                    }\n\n                                    var itemToRender = record.newItem || record.item;\n                                    itemToRender.index = newIndex;\n\n                                    var newItemPromise = Promise.as(itemToRender);\n                                    newItemPromise.handle = record.itemPromise.handle;\n\n                                    var that = this;\n                                    record.renderPromise = this._renderItem(newItemPromise, record).\n                                        then(function (v) {\n                                            record.renderComplete = v.renderComplete;\n                                            that._changeElement(record, v.element, false);\n                                            that._presentElements(record);\n                                        });\n                                }\n                            } else {\n                                this._changeElement(record, this._renderPlaceholder(record), true);\n                            }\n                        }\n                        element = record.element;\n                    }\n                    if (this._elementNotificationHandler && this._elementNotificationHandler.indexChanged) {\n                        this._handlerToNotify().indexChanged(element, newIndex, oldIndex);\n                    }\n                },\n\n                _affectedRange: function (range) {\n                    if (this._elementNotificationHandler && this._elementNotificationHandler.updateAffectedRange) {\n                        this._handlerToNotify().updateAffectedRange(range);\n                    }\n                },\n\n                _beginNotifications: function () {\n                    // accessing _handlerToNotify will force the call to beginNotifications on the client\n                    //\n                    this._externalBegin = true;\n                    this._handlerToNotify();\n                },\n                _endNotifications: function () {\n                    if (this._notificationsSent) {\n                        this._notificationsSent = false;\n                        this._externalBegin = false;\n\n                        if (this._elementNotificationHandler && this._elementNotificationHandler.endNotifications) {\n                            this._elementNotificationHandler.endNotifications();\n                        }\n                    }\n                },\n\n                _reload: function () {\n                    if (this._elementNotificationHandler && this._elementNotificationHandler.reload) {\n                        this._elementNotificationHandler.reload();\n                    }\n                },\n\n                // Some functions may be called synchronously or asynchronously, so it's best to post _endNotifications to avoid\n                // calling it prematurely.\n                _postEndNotifications: function () {\n                    if (this._notificationsSent && !this._externalBegin && !this._endNotificationsPosted) {\n                        this._endNotificationsPosted = true;\n                        var that = this;\n                        Scheduler.schedule(function ItemsManager_async_endNotifications() {\n                            that._endNotificationsPosted = false;\n                            that._endNotifications();\n                        }, Scheduler.Priority.high, null, \"WinJS.UI._ItemsManager._postEndNotifications\");\n                    }\n                },\n\n                _presentElement: function (record) {\n                    var elementOld = record.element;\n                    // Finish modifying the slot before calling back into user code, in case there is a reentrant call\n                    this._replaceElement(record, record.elementDelayed);\n                    record.elementDelayed = null;\n\n                    record.elementIsPlaceholder = false;\n                    this._updateElement(record.element, elementOld);\n                    if (this._handlerToNotifyCaresAboutItemAvailable()) {\n                        this._handlerToNotify().itemAvailable(record.element, elementOld);\n                    }\n                },\n\n                _presentElements: function (record, elementDelayed) {\n                    if (elementDelayed) {\n                        record.elementDelayed = elementDelayed;\n                    }\n\n                    this._listBinding.jumpToItem(record.item);\n                    if (record.elementDelayed) {\n                        this._presentElement(record);\n                    }\n\n                    this._postEndNotifications();\n                },\n\n                // Presents all delayed elements\n                _presentAllElements: function () {\n                    var that = this;\n                    this._foreachRecord(function (record) {\n                        if (record.elementDelayed) {\n                            that._presentElement(record);\n                        }\n                    });\n                },\n\n                _writeProfilerMark: function (text) {\n                    var message = \"WinJS.UI._ItemsManager:\" + (this._profilerId ? (this._profilerId + \":\") : \":\") + text;\n                    _WriteProfilerMark(message);\n                }\n            }, { // Static Members\n                supportedForProcessing: false,\n            });\n\n            return function (dataSource, itemRenderer, elementNotificationHandler, options) {\n                return new ItemsManager(dataSource, itemRenderer, elementNotificationHandler, options);\n            };\n        })\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_TabContainer',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    './_ElementUtilities'\n    ], function tabManagerInit(exports, _Global, _Base, _BaseUtils, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    function fireEvent(element, name, forward, cancelable) {\n        var event = _Global.document.createEvent('UIEvent');\n        event.initUIEvent(name, false, !!cancelable, _Global, forward ? 1 : 0);\n        return !element.dispatchEvent(event);\n    }\n\n    var getTabIndex = _ElementUtilities.getTabIndex;\n\n    // tabbableElementsNodeFilter works with the TreeWalker to create a view of the DOM tree that is built up of what we want the focusable tree to look like.\n    // When it runs into a tab contained area, it rejects anything except the childFocus element so that any potentially tabbable things that the TabContainer\n    // doesn't want tabbed to get ignored.\n    function tabbableElementsNodeFilter(node) {\n        var nodeStyle = _Global.getComputedStyle(node);\n        if (nodeStyle.display === \"none\" || nodeStyle.visibility === \"hidden\") {\n            return _Global.NodeFilter.FILTER_REJECT;\n        }\n        if (node._tabContainer) {\n            return _Global.NodeFilter.FILTER_ACCEPT;\n        }\n        if (node.parentNode && node.parentNode._tabContainer) {\n            var managedTarget = node.parentNode._tabContainer.childFocus;\n            // Ignore subtrees that are under a tab manager but not the child focus. If a node is contained in the child focus, either accept it (if it's tabbable itself), or skip it and find tabbable content inside of it.\n            if (managedTarget && node.contains(managedTarget)) {\n                return (getTabIndex(node) >= 0 ? _Global.NodeFilter.FILTER_ACCEPT : _Global.NodeFilter.FILTER_SKIP);\n            }\n            return _Global.NodeFilter.FILTER_REJECT;\n        }\n        var tabIndex = getTabIndex(node);\n        if (tabIndex >= 0) {\n            return _Global.NodeFilter.FILTER_ACCEPT;\n        }\n        return _Global.NodeFilter.FILTER_SKIP;\n    }\n\n    // We've got to manually scrape the results the walker generated, since the walker will have generated a fairly good representation of the tabbable tree, but\n    // won't have a perfect image. Trees like this cause a problem for the walker:\n    //     [ tabContainer element ]\n    //   [ element containing childFocus ]\n    //  [ childFocus ] [ sibling of child focus that has tabIndex >= 0 ]\n    // We can't tell the tree walker to jump right to the childFocus, so it'll collect the childFocus but also that sibling element. We don't want that sibling element\n    // to appear in our version of the tabOrder, so scrapeTabManagedSubtree will take the pretty accurate representation we get from the TreeWalker, and do a little\n    // more pruning to give us only the nodes we're interested in.\n    function scrapeTabManagedSubtree(walker) {\n        var tabManagedElement = walker.currentNode,\n            childFocus = tabManagedElement._tabContainer.childFocus,\n            elementsFound = [];\n\n        if (!childFocus) {\n            return [];\n        }\n\n        walker.currentNode = childFocus;\n        function scrapeSubtree() {\n            if (walker.currentNode._tabContainer) {\n                elementsFound = elementsFound.concat(scrapeTabManagedSubtree(walker));\n            } else {\n                // A child focus can have tabIndex = -1, so check the tabIndex before marking it as valid\n                if (getTabIndex(walker.currentNode) >= 0) {\n                    elementsFound.push(walker.currentNode);\n                }\n                if (walker.firstChild()) {\n                    do {\n                        scrapeSubtree();\n                    } while (walker.nextSibling());\n                    walker.parentNode();\n                }\n            }\n        }\n        scrapeSubtree();\n        walker.currentNode = tabManagedElement;\n\n        return elementsFound;\n    }\n\n    function TabHelperObject(element, tabIndex) {\n        function createCatcher() {\n            var fragment = _Global.document.createElement(\"DIV\");\n            fragment.tabIndex = (tabIndex ? tabIndex : 0);\n            fragment.setAttribute(\"aria-hidden\", true);\n            return fragment;\n        }\n\n        var parent = element.parentNode;\n\n        // Insert prefix focus catcher\n        var catcherBegin = createCatcher();\n        parent.insertBefore(catcherBegin, element);\n\n        // Insert postfix focus catcher\n        var catcherEnd = createCatcher();\n        parent.insertBefore(catcherEnd, element.nextSibling);\n\n        catcherBegin.addEventListener(\"focus\", function () {\n            fireEvent(element, \"onTabEnter\", true);\n        }, true);\n        catcherEnd.addEventListener(\"focus\", function () {\n            fireEvent(element, \"onTabEnter\", false);\n        }, true);\n\n        this._catcherBegin = catcherBegin;\n        this._catcherEnd = catcherEnd;\n        var refCount = 1;\n        this.addRef = function () {\n            refCount++;\n        };\n        this.release = function () {\n            if (--refCount === 0) {\n                if (catcherBegin.parentElement) {\n                    parent.removeChild(catcherBegin);\n                }\n                if (catcherEnd.parentElement) {\n                    parent.removeChild(catcherEnd);\n                }\n            }\n            return refCount;\n        };\n        this.updateTabIndex = function (tabIndex) {\n            catcherBegin.tabIndex = tabIndex;\n            catcherEnd.tabIndex = tabIndex;\n        };\n    }\n\n    var TrackTabBehavior = {\n        attach: function (element, tabIndex) {\n            ///\n            if (!element[\"win-trackTabHelperObject\"]) {\n                element[\"win-trackTabHelperObject\"] = new TabHelperObject(element, tabIndex);\n            } else {\n                element[\"win-trackTabHelperObject\"].addRef();\n            }\n\n            return element[\"win-trackTabHelperObject\"];\n        },\n\n        detach: function (element) {\n            ///\n            if (!element[\"win-trackTabHelperObject\"].release()) {\n                delete element[\"win-trackTabHelperObject\"];\n            }\n        }\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        TrackTabBehavior: TrackTabBehavior,\n        TabContainer: _Base.Class.define(function TabContainer_ctor(element) {\n            /// <signature helpKeyword=\"WinJS.UI.TabContainer.TabContainer\">\n            /// <summary locid=\"WinJS.UI.TabContainer.constructor\">\n            /// Constructs the TabContainer.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.TabContainer.constructor_p:element\">\n            /// The DOM element to be associated with the TabContainer.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.TabContainer.constructor_p:options\">\n            /// The set of options to be applied initially to the TabContainer.\n            /// </param>\n            /// <returns type=\"WinJS.UI.TabContainer\" locid=\"WinJS.UI.TabContainer.constructor_returnValue\">\n            /// A constructed TabContainer.\n            /// </returns>\n            /// </signature>\n            this._element = element;\n            this._tabIndex = 0;\n            element._tabContainer = this;\n            if (element.getAttribute(\"tabindex\") === null) {\n                element.tabIndex = -1;\n            }\n            var that = this;\n\n            element.addEventListener(\"onTabEnter\", function (e) {\n                var skipDefaultBehavior = fireEvent(that._element, \"onTabEntered\", e.detail, true);\n                if (skipDefaultBehavior) {\n                    return;\n                }\n\n                if (that.childFocus) {\n                    that.childFocus.focus();\n                } else {\n                    element.focus();\n                }\n            });\n            element.addEventListener(\"keydown\", function (e) {\n                var targetElement = e.target;\n                if (e.keyCode === _ElementUtilities.Key.tab) {\n                    var forwardTab = !e.shiftKey;\n                    var canKeepTabbing = that._hasMoreElementsInTabOrder(targetElement, forwardTab);\n                    if (!canKeepTabbing) {\n                        var skipTabExitHandling = fireEvent(that._element, \"onTabExiting\", forwardTab, true);\n                        if (skipTabExitHandling) {\n                            e.stopPropagation();\n                            e.preventDefault();\n                            return;\n                        }\n                        var allTabbableElements = that._element.querySelectorAll(\"a[href],area[href],button,command,input,link,menuitem,object,select,textarea,th[sorted],[tabindex]\"),\n                            len = allTabbableElements.length,\n                            originalTabIndices = [];\n\n                        for (var i = 0; i < len; i++) {\n                            var element = allTabbableElements[i];\n                            originalTabIndices.push(element.tabIndex);\n                            element.tabIndex = -1;\n                        }\n                        // If there's nothing else that can be tabbed to on the page, tab should wrap around back to the tab contained area.\n                        // We'll disable the sentinel node that's directly in the path of the tab order (catcherEnd for forward tabs, and\n                        // catcherBegin for shift+tabs), but leave the other sentinel node untouched so tab can wrap around back into the region.\n                        that._elementTabHelper[forwardTab ? \"_catcherEnd\" : \"_catcherBegin\"].tabIndex = -1;\n\n                        var restoreTabIndicesOnBlur = function () {\n                            targetElement.removeEventListener(\"blur\", restoreTabIndicesOnBlur, false);\n                            for (var i = 0; i < len; i++) {\n                                if (originalTabIndices[i] !== -1) {\n                                    // When the original tabIndex was -1, don't try restoring to -1 again. A nested TabContainer might also be in the middle of handling this same code,\n                                    // and so would have set tabIndex = -1 on this element. The nested tab container will restore the element's tabIndex properly.\n                                    allTabbableElements[i].tabIndex = originalTabIndices[i];\n                                }\n                            }\n                            that._elementTabHelper._catcherBegin.tabIndex = that._tabIndex;\n                            that._elementTabHelper._catcherEnd.tabIndex = that._tabIndex;\n                        };\n                        targetElement.addEventListener(\"blur\", restoreTabIndicesOnBlur, false);\n                        _BaseUtils._yieldForEvents(function () {\n                            fireEvent(that._element, \"onTabExit\", forwardTab);\n                        });\n                    }\n                }\n            });\n\n            this._elementTabHelper = TrackTabBehavior.attach(element, this._tabIndex);\n            this._elementTabHelper._catcherBegin.tabIndex = 0;\n            this._elementTabHelper._catcherEnd.tabIndex = 0;\n        }, {\n\n            // Public members\n\n            /// <signature helpKeyword=\"WinJS.UI.TabContainer.dispose\">\n            /// <summary locid=\"WinJS.UI.TabContainer.dispose\">\n            /// Disposes the Tab Container.\n            /// </summary>\n            /// </signature>\n            dispose: function () {\n                TrackTabBehavior.detach(this._element, this._tabIndex);\n            },\n\n            /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.TabContainer.childFocus\" helpKeyword=\"WinJS.UI.TabContainer.childFocus\">\n            /// Gets or sets the child element that has focus.\n            /// </field>\n            childFocus: {\n                set: function (e) {\n                    if (e !== this._focusElement) {\n                        if (e && e.parentNode) {\n                            this._focusElement = e;\n                        } else {\n                            this._focusElement = null;\n                        }\n                    }\n                },\n                get: function () {\n                    return this._focusElement;\n                }\n            },\n\n            /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.TabContainer.tabIndex\" helpKeyword=\"WinJS.UI.TabContainer.tabIndex\">\n            /// Gets or sets the tab order of the control within its container.\n            /// </field>\n            tabIndex: {\n                set: function (tabIndex) {\n                    this._tabIndex = tabIndex;\n                    this._elementTabHelper.updateTabIndex(tabIndex);\n                },\n\n                get: function () {\n                    return this._tabIndex;\n                }\n            },\n\n            // Private members\n\n            _element: null,\n            _skipper: function (e) {\n                e.stopPropagation();\n                e.preventDefault();\n            },\n            _hasMoreElementsInTabOrder: function (currentFocus, movingForwards) {\n                if (!this.childFocus) {\n                    return false;\n                }\n                var walker = _Global.document.createTreeWalker(this._element, _Global.NodeFilter.SHOW_ELEMENT, tabbableElementsNodeFilter, false);\n                var tabStops = scrapeTabManagedSubtree(walker);\n                for (var i = 0; i < tabStops.length; i++) {\n                    if (tabStops[i] === currentFocus) {\n                        return (movingForwards ? (i < tabStops.length - 1) : (i > 0));\n                    }\n                }\n                return false;\n            },\n            _focusElement: null\n\n        }, { // Static Members\n            supportedForProcessing: false,\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_KeyboardBehavior',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    './_Control',\n    './_ElementUtilities',\n    './_TabContainer'\n], function KeyboardBehaviorInit(exports, _Global, _Base, _Control, _ElementUtilities, _TabContainer) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n    \n    var InputTypes = {\n        touch: \"touch\",\n        pen: \"pen\",\n        mouse: \"mouse\",\n        keyboard: \"keyboard\"\n    };\n    var _lastInputType = InputTypes.mouse;\n    \n    // Keys should be the same as the values for a PointerEvent's pointerType.\n    var pointerTypeToInputType = {\n        // IE 10 uses numbers for its pointerType\n        2: InputTypes.touch,\n        3: InputTypes.pen,\n        4: InputTypes.mouse,\n        \n        // Others use strings for their pointerTypes\n        touch: InputTypes.touch,\n        pen: InputTypes.pen,\n        mouse: InputTypes.mouse\n    };\n\n    _ElementUtilities._addEventListener(_Global, \"pointerdown\", function (eventObject) {\n        _lastInputType = pointerTypeToInputType[eventObject.pointerType] || InputTypes.mouse;\n    }, true);\n\n    _Global.addEventListener(\"keydown\", function () {\n        _lastInputType = InputTypes.keyboard;\n    }, true);\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _keyboardSeenLast: {\n            get: function _keyboardSeenLast_get() {\n                return _lastInputType === InputTypes.keyboard;\n            },\n            set: function _keyboardSeenLast_set(value) {\n                _lastInputType = (value ? InputTypes.keyboard : InputTypes.mouse);\n            }\n        },\n        _lastInputType: {\n            get: function _lastInputType_get() {\n                return _lastInputType;\n            },\n            set: function _lastInputType_set(value) {\n                if (InputTypes[value]) {\n                    _lastInputType = value;\n                }\n            }\n        },\n        _InputTypes: InputTypes,\n        _WinKeyboard: function (element) {\n            // Win Keyboard behavior is a solution that would be similar to -ms-keyboard-focus.\n            // It monitors the last input (keyboard/mouse) and adds/removes a win-keyboard class\n            // so that you can style .foo.win-keyboard:focus vs .foo:focus to add a keyboard rect\n            // on an item only when the last input method was keyboard.\n            // Reminder: Touch edgy does not count as an input method.\n            _ElementUtilities._addEventListener(element, \"pointerdown\", function (ev) {\n                // In case pointer down came on the active element.\n                _ElementUtilities.removeClass(ev.target, \"win-keyboard\");\n            }, true);\n            element.addEventListener(\"keydown\", function (ev) {\n                _ElementUtilities.addClass(ev.target, \"win-keyboard\");\n            }, true);\n            _ElementUtilities._addEventListener(element, \"focusin\", function (ev) {\n                exports._keyboardSeenLast && _ElementUtilities.addClass(ev.target, \"win-keyboard\");\n            }, false);\n            _ElementUtilities._addEventListener(element, \"focusout\", function (ev) {\n                _ElementUtilities.removeClass(ev.target, \"win-keyboard\");\n            }, false);\n        },\n        _KeyboardBehavior: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            var _KeyboardBehavior = _Base.Class.define(function KeyboardBehavior_ctor(element, options) {\n                // KeyboardBehavior allows you to easily convert a bunch of tabable elements into a single tab stop with\n                // navigation replaced by keyboard arrow (Up/Down/Left/Right) + Home + End + Custom keys.\n                //\n                // Example use cases:\n                //\n                // 1 Dimensional list: FixedDirection = height and FixedSize = 1;\n                // [1] [ 2 ] [  3  ] [4] [  5  ]...\n                //\n                // 2 Dimensional list: FixedDirection = height and FixedSize = 2;\n                // [1] [3] [5] [7] ...\n                // [2] [4] [6] [8]\n                //\n                // 1 Dimensional list: FixedDirection = width and FixedSize = 1;\n                // [ 1 ]\n                // -   -\n                // |   |\n                // | 2 |\n                // |   |\n                // -   -\n                // [ 3 ]\n                // [ 4 ]\n                //  ...\n                //\n                // 2 Dimensional list: FixedDirection = width and FixedSize = 2;\n                // [1][2]\n                // [3][4]\n                // [5][6]\n                // ...\n                //\n                // Currently it is a \"behavior\" instead of a \"control\" so it can be attached to the same element as a\n                // winControl. The main scenario for this would be to attach it to the same element as a repeater.\n                //\n                // It also blocks \"Portaling\" where you go off the end of one column and wrap around to the other\n                // column. It also blocks \"Carousel\" where you go from the end of the list to the beginning.\n                //\n                // Keyboarding behavior supports nesting. It supports your tab stops having sub tab stops. If you want\n                // an interactive element within the tab stop you need to use the win-interactive classname or during the\n                // keydown event stop propogation so that the event is skipped.\n                //\n                // If you have custom keyboarding the getAdjacent API is provided. This can be used to enable keyboarding\n                // in multisize 2d lists or custom keyboard commands. PageDown and PageUp are the most common since this\n                // behavior does not detect scrollers.\n                //\n                // It also allows developers to show/hide keyboard focus rectangles themselves.\n                //\n                // It has an API called currentIndex so that Tab (or Shift+Tab) or a developer imitating Tab will result in\n                // the correct item having focus.\n                //\n                // It also allows an element to be represented as 2 arrow stops (commonly used for a split button) by calling\n                // the _getFocusInto API on the child element's winControl if it exists.\n\n                element = element || _Global.document.createElement(\"DIV\");\n                options = options || {};\n\n                element._keyboardBehavior = this;\n                this._element = element;\n\n                this._fixedDirection = _KeyboardBehavior.FixedDirection.width;\n                this._fixedSize = 1;\n                this._currentIndex = 0;\n\n                _Control.setOptions(this, options);\n\n                // If there's a scroller, the TabContainer can't be inside of the scroller. Otherwise, tabbing into the\n                // TabContainer will cause the scroller to scroll.\n                this._tabContainer = new _TabContainer.TabContainer(this.scroller || this._element);\n                this._tabContainer.tabIndex = 0;\n                if (this._element.children.length > 0) {\n                    this._tabContainer.childFocus = this._getFocusInto(this._element.children[0]);\n                }\n\n                this._element.addEventListener('keydown', this._keyDownHandler.bind(this));\n                _ElementUtilities._addEventListener(this._element, 'pointerdown', this._MSPointerDownHandler.bind(this));\n            }, {\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                fixedDirection: {\n                    get: function () {\n                        return this._fixedDirection;\n                    },\n                    set: function (value) {\n                        this._fixedDirection = value;\n                    }\n                },\n\n                fixedSize: {\n                    get: function () {\n                        return this._fixedSize;\n                    },\n                    set: function (value) {\n                        if (+value === value) {\n                            value = Math.max(1, value);\n                            this._fixedSize = value;\n                        }\n                    }\n                },\n\n                currentIndex: {\n                    get: function () {\n                        if (this._element.children.length > 0) {\n                            return this._currentIndex;\n                        }\n                        return -1;\n                    },\n                    set: function (value) {\n                        if (+value === value) {\n                            var length = this._element.children.length;\n                            value = Math.max(0, Math.min(length - 1, value));\n                            this._currentIndex = value;\n                            this._tabContainer.childFocus = this._getFocusInto(this._element.children[value]);\n                        }\n                    }\n                },\n\n                getAdjacent: {\n                    get: function () {\n                        return this._getAdjacent;\n                    },\n                    set: function (value) {\n                        this._getAdjacent = value;\n                    }\n                },\n\n                // If set, KeyboardBehavior will prevent *scroller* from scrolling when moving focus\n                scroller: {\n                    get: function () {\n                        return this._scroller;\n                    },\n                    set: function (value) {\n                        this._scroller = value;\n                    }\n                },\n\n                _keyDownHandler: function _KeyboardBehavior_keyDownHandler(ev) {\n                    if (!ev.altKey) {\n                        if (_ElementUtilities._matchesSelector(ev.target, \".win-interactive, .win-interactive *\")) {\n                            return;\n                        }\n                        var newIndex = this.currentIndex;\n                        var maxIndex = this._element.children.length - 1;\n\n                        var rtl = _Global.getComputedStyle(this._element).direction === \"rtl\";\n                        var leftStr = rtl ? Key.rightArrow : Key.leftArrow;\n                        var rightStr = rtl ? Key.leftArrow : Key.rightArrow;\n\n                        var targetIndex = this.getAdjacent && this.getAdjacent(newIndex, ev.keyCode);\n                        if (+targetIndex === targetIndex) {\n                            newIndex = targetIndex;\n                        } else {\n                            var modFixedSize = newIndex % this.fixedSize;\n\n                            if (ev.keyCode === leftStr) {\n                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.width) {\n                                    if (modFixedSize !== 0) {\n                                        newIndex--;\n                                    }\n                                } else {\n                                    if (newIndex >= this.fixedSize) {\n                                        newIndex -= this.fixedSize;\n                                    }\n                                }\n                            } else if (ev.keyCode === rightStr) {\n                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.width) {\n                                    if (modFixedSize !== this.fixedSize - 1) {\n                                        newIndex++;\n                                    }\n                                } else {\n                                    if (newIndex + this.fixedSize - modFixedSize <= maxIndex) {\n                                        newIndex += this.fixedSize;\n                                    }\n                                }\n                            } else if (ev.keyCode === Key.upArrow) {\n                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.height) {\n                                    if (modFixedSize !== 0) {\n                                        newIndex--;\n                                    }\n                                } else {\n                                    if (newIndex >= this.fixedSize) {\n                                        newIndex -= this.fixedSize;\n                                    }\n                                }\n                            } else if (ev.keyCode === Key.downArrow) {\n                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.height) {\n                                    if (modFixedSize !== this.fixedSize - 1) {\n                                        newIndex++;\n                                    }\n                                } else {\n                                    if (newIndex + this.fixedSize - modFixedSize <= maxIndex) {\n                                        newIndex += this.fixedSize;\n                                    }\n                                }\n                            } else if (ev.keyCode === Key.home) {\n                                newIndex = 0;\n                            } else if (ev.keyCode === Key.end) {\n                                newIndex = this._element.children.length - 1;\n                            }\n                        }\n\n                        newIndex = Math.max(0, Math.min(this._element.children.length - 1, newIndex));\n\n                        if (newIndex !== this.currentIndex) {\n                            this._focus(newIndex, ev.keyCode);\n\n                            // Allow KeyboardBehavior to be nested\n                            if (ev.keyCode === leftStr || ev.keyCode === rightStr || ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow) {\n                                ev.stopPropagation();\n                            }\n\n                            ev.preventDefault();\n                        }\n                    }\n                },\n\n                _getFocusInto: function _KeyboardBehavior_getFocusInto(elementToFocus, keyCode) {\n                    return elementToFocus && elementToFocus.winControl && elementToFocus.winControl._getFocusInto ?\n                        elementToFocus.winControl._getFocusInto(keyCode) :\n                        elementToFocus;\n                },\n\n                _focus: function _KeyboardBehavior_focus(index, keyCode) {\n                    index = (+index === index) ? index : this.currentIndex;\n\n                    var elementToFocus = this._element.children[index];\n                    if (elementToFocus) {\n                        elementToFocus = this._getFocusInto(elementToFocus, keyCode);\n\n                        this.currentIndex = index;\n\n                        _ElementUtilities._setActive(elementToFocus, this.scroller);\n                    }\n                },\n\n                _MSPointerDownHandler: function _KeyboardBehavior_MSPointerDownHandler(ev) {\n                    var srcElement = ev.target;\n                    if (srcElement === this.element) {\n                        return;\n                    }\n\n                    while (srcElement.parentNode !== this.element) {\n                        srcElement = srcElement.parentNode;\n                    }\n\n                    var index = -1;\n                    while (srcElement) {\n                        index++;\n                        srcElement = srcElement.previousElementSibling;\n                    }\n\n                    this.currentIndex = index;\n                }\n            }, {\n                FixedDirection: {\n                    height: \"height\",\n                    width: \"width\"\n                }\n            });\n\n            return _KeyboardBehavior;\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_SafeHtml',[\n    'exports',\n    '../Core/_WinJS',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources'\n    ], function safeHTMLInit(exports, _WinJS, _Global, _Base, _ErrorFromName, _Resources) {\n    \"use strict\";\n\n\n    var setInnerHTML,\n        setInnerHTMLUnsafe,\n        setOuterHTML,\n        setOuterHTMLUnsafe,\n        insertAdjacentHTML,\n        insertAdjacentHTMLUnsafe;\n\n    var strings = {\n        get nonStaticHTML() { return \"Unable to add dynamic content. A script attempted to inject dynamic content, or elements previously modified dynamically, that might be unsafe. For example, using the innerHTML property or the document.write method to add a script element will generate this exception. If the content is safe and from a trusted source, use a method to explicitly manipulate elements and attributes, such as createElement, or use setInnerHTMLUnsafe (or other unsafe method).\"; },\n    };\n\n    setInnerHTML = setInnerHTMLUnsafe = function (element, text) {\n        /// <signature helpKeyword=\"WinJS.Utilities.setInnerHTML\">\n        /// <summary locid=\"WinJS.Utilities.setInnerHTML\">\n        /// Sets the innerHTML property of the specified element to the specified text.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.setInnerHTML_p:element\">\n        /// The element on which the innerHTML property is to be set.\n        /// </param>\n        /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.setInnerHTML_p:text\">\n        /// The value to be set to the innerHTML property.\n        /// </param>\n        /// </signature>\n        element.innerHTML = text;\n    };\n    setOuterHTML = setOuterHTMLUnsafe = function (element, text) {\n        /// <signature helpKeyword=\"WinJS.Utilities.setOuterHTML\">\n        /// <summary locid=\"WinJS.Utilities.setOuterHTML\">\n        /// Sets the outerHTML property of the specified element to the specified text.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.setOuterHTML_p:element\">\n        /// The element on which the outerHTML property is to be set.\n        /// </param>\n        /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.setOuterHTML_p:text\">\n        /// The value to be set to the outerHTML property.\n        /// </param>\n        /// </signature>\n        element.outerHTML = text;\n    };\n    insertAdjacentHTML = insertAdjacentHTMLUnsafe = function (element, position, text) {\n        /// <signature helpKeyword=\"WinJS.Utilities.insertAdjacentHTML\">\n        /// <summary locid=\"WinJS.Utilities.insertAdjacentHTML\">\n        /// Calls insertAdjacentHTML on the specified element.\n        /// </summary>\n        /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.insertAdjacentHTML_p:element\">\n        /// The element on which insertAdjacentHTML is to be called.\n        /// </param>\n        /// <param name=\"position\" type=\"String\" locid=\"WinJS.Utilities.insertAdjacentHTML_p:position\">\n        /// The position relative to the element at which to insert the HTML.\n        /// </param>\n        /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.insertAdjacentHTML_p:text\">\n        /// The value to be provided to insertAdjacentHTML.\n        /// </param>\n        /// </signature>\n        element.insertAdjacentHTML(position, text);\n    };\n\n    var msApp = _Global.MSApp;\n    if (msApp && msApp.execUnsafeLocalFunction) {\n        setInnerHTMLUnsafe = function (element, text) {\n            /// <signature helpKeyword=\"WinJS.Utilities.setInnerHTMLUnsafe\">\n            /// <summary locid=\"WinJS.Utilities.setInnerHTMLUnsafe\">\n            /// Sets the innerHTML property of the specified element to the specified text.\n            /// </summary>\n            /// <param name='element' type='HTMLElement' locid=\"WinJS.Utilities.setInnerHTMLUnsafe_p:element\">\n            /// The element on which the innerHTML property is to be set.\n            /// </param>\n            /// <param name='text' type=\"String\" locid=\"WinJS.Utilities.setInnerHTMLUnsafe_p:text\">\n            /// The value to be set to the innerHTML property.\n            /// </param>\n            /// </signature>\n            msApp.execUnsafeLocalFunction(function () {\n                try {\n                    _WinJS._execUnsafe = true;\n                    element.innerHTML = text;\n                } finally {\n                    _WinJS._execUnsafe = false;\n                }\n            });\n        };\n        setOuterHTMLUnsafe = function (element, text) {\n            /// <signature helpKeyword=\"WinJS.Utilities.setOuterHTMLUnsafe\">\n            /// <summary locid=\"WinJS.Utilities.setOuterHTMLUnsafe\">\n            /// Sets the outerHTML property of the specified element to the specified text\n            /// in the context of msWWA.execUnsafeLocalFunction.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.setOuterHTMLUnsafe_p:element\">\n            /// The element on which the outerHTML property is to be set.\n            /// </param>\n            /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.setOuterHTMLUnsafe_p:text\">\n            /// The value to be set to the outerHTML property.\n            /// </param>\n            /// </signature>\n            msApp.execUnsafeLocalFunction(function () {\n                try {\n                    _WinJS._execUnsafe = true;\n                    element.outerHTML = text;\n                } finally {\n                    _WinJS._execUnsafe = false;\n                }\n            });\n        };\n        insertAdjacentHTMLUnsafe = function (element, position, text) {\n            /// <signature helpKeyword=\"WinJS.Utilities.insertAdjacentHTMLUnsafe\">\n            /// <summary locid=\"WinJS.Utilities.insertAdjacentHTMLUnsafe\">\n            /// Calls insertAdjacentHTML on the specified element in the context\n            /// of msWWA.execUnsafeLocalFunction.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.insertAdjacentHTMLUnsafe_p:element\">\n            /// The element on which insertAdjacentHTML is to be called.\n            /// </param>\n            /// <param name=\"position\" type=\"String\" locid=\"WinJS.Utilities.insertAdjacentHTMLUnsafe_p:position\">\n            /// The position relative to the element at which to insert the HTML.\n            /// </param>\n            /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.insertAdjacentHTMLUnsafe_p:text\">\n            /// Value to be provided to insertAdjacentHTML.\n            /// </param>\n            /// </signature>\n            msApp.execUnsafeLocalFunction(function () {\n                try {\n                    _WinJS._execUnsafe = true;\n                    element.insertAdjacentHTML(position, text);\n                } finally {\n                    _WinJS._execUnsafe = false;\n                }\n            });\n        };\n    } else if (_Global.msIsStaticHTML) {\n        var check = function (str) {\n            if (!_Global.msIsStaticHTML(str)) {\n                throw new _ErrorFromName(\"WinJS.Utitilies.NonStaticHTML\", strings.nonStaticHTML);\n            }\n        };\n        // If we ever get isStaticHTML we can attempt to recreate the behavior we have in the local\n        // compartment, in the mean-time all we can do is sanitize the input.\n        //\n        setInnerHTML = function (element, text) {\n            /// <signature helpKeyword=\"WinJS.Utilities.setInnerHTML\">\n            /// <summary locid=\"WinJS.Utilities.msIsStaticHTML.setInnerHTML\">\n            /// Sets the innerHTML property of a element to the specified text\n            /// if it passes a msIsStaticHTML check.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.msIsStaticHTML.setInnerHTML_p:element\">\n            /// The element on which the innerHTML property is to be set.\n            /// </param>\n            /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.msIsStaticHTML.setInnerHTML_p:text\">\n            /// The value to be set to the innerHTML property.\n            /// </param>\n            /// </signature>\n            check(text);\n            element.innerHTML = text;\n        };\n        setOuterHTML = function (element, text) {\n            /// <signature helpKeyword=\"WinJS.Utilities.setOuterHTML\">\n            /// <summary locid=\"WinJS.Utilities.msIsStaticHTML.setOuterHTML\">\n            /// Sets the outerHTML property of a element to the specified text\n            /// if it passes a msIsStaticHTML check.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.msIsStaticHTML.setOuterHTML_p:element\">\n            /// The element on which the outerHTML property is to be set.\n            /// </param>\n            /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.msIsStaticHTML.setOuterHTML_p:text\">\n            /// The value to be set to the outerHTML property.\n            /// </param>\n            /// </signature>\n            check(text);\n            element.outerHTML = text;\n        };\n        insertAdjacentHTML = function (element, position, text) {\n            /// <signature helpKeyword=\"WinJS.Utilities.insertAdjacentHTML\">\n            /// <summary locid=\"WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML\">\n            /// Calls insertAdjacentHTML on the element if it passes\n            /// a msIsStaticHTML check.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" locid=\"WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML_p:element\">\n            /// The element on which insertAdjacentHTML is to be called.\n            /// </param>\n            /// <param name=\"position\" type=\"String\" locid=\"WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML_p:position\">\n            /// The position relative to the element at which to insert the HTML.\n            /// </param>\n            /// <param name=\"text\" type=\"String\" locid=\"WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML_p:text\">\n            /// The value to be provided to insertAdjacentHTML.\n            /// </param>\n            /// </signature>\n            check(text);\n            element.insertAdjacentHTML(position, text);\n        };\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        setInnerHTML: setInnerHTML,\n        setInnerHTMLUnsafe: setInnerHTMLUnsafe,\n        setOuterHTML: setOuterHTML,\n        setOuterHTMLUnsafe: setOuterHTMLUnsafe,\n        insertAdjacentHTML: insertAdjacentHTML,\n        insertAdjacentHTMLUnsafe: insertAdjacentHTMLUnsafe\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_Select',[\n    'exports',\n    '../Core/_Base',\n    './_SafeHtml'\n    ], function selectInit(exports, _Base, _SafeHtml) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _Select: _Base.Namespace._lazy(function () {\n            var encodeHtmlRegEx = /[&<>'\"]/g;\n            var encodeHtmlEscapeMap = {\n                \"&\": \"&amp;\",\n                \"<\": \"&lt;\",\n                \">\": \"&gt;\",\n                \"'\": \"&#39;\",\n                '\"': \"&quot;\"\n            };\n            var stringDirectionRegEx = /[\\u200e\\u200f]/g;\n            function encodeHtml(str) {\n                return str.replace(encodeHtmlRegEx, function (m) {\n                    return encodeHtmlEscapeMap[m] || \"\";\n                });\n            }\n            function stripDirectionMarker(str) {\n                return str.replace(stringDirectionRegEx, \"\");\n            }\n            function stockGetValue(index) {\n                /*jshint validthis: true */\n                return this[index];\n            }\n            function stockGetLength() {\n                /*jshint validthis: true */\n                return this.length;\n            }\n            function fixDataSource(dataSource) {\n                if (!dataSource.getValue) {\n                    dataSource.getValue = stockGetValue;\n                }\n\n                if (!dataSource.getLength) {\n                    dataSource.getLength = stockGetLength;\n                }\n                return dataSource;\n            }\n\n            return _Base.Class.define(function _Select_ctor(element, options) {\n                // This is an implementation detail of the TimePicker and DatePicker, designed\n                // to provide a primitive \"data bound\" select control. This is not designed to\n                // be used outside of the TimePicker and DatePicker controls.\n                //\n\n                this._dataSource = fixDataSource(options.dataSource);\n                this._index = options.index || 0;\n\n                this._domElement = element;\n                // Mark this as a tab stop\n                this._domElement.tabIndex = 0;\n\n                if (options.disabled) {\n                    this.setDisabled(options.disabled);\n                }\n\n                var that = this;\n                this._domElement.addEventListener(\"change\", function () {\n                    //Should be set to _index to prevent events from firing twice\n                    that._index = that._domElement.selectedIndex;\n                }, false);\n\n                //update runtime accessibility value after initialization\n                this._createSelectElement();\n            }, {\n                _index: 0,\n                _dataSource: null,\n\n                dataSource: {\n                    get: function () { return this._dataSource; },\n                    set: function (value) {\n                        this._dataSource = fixDataSource(value);\n\n                        //Update layout as data source change\n                        if (this._domElement) {\n                            this._createSelectElement();\n                        }\n                    }\n                },\n\n                setDisabled: function (disabled) {\n                    if (disabled) {\n                        this._domElement.setAttribute(\"disabled\", \"disabled\");\n                    } else {\n                        this._domElement.removeAttribute(\"disabled\");\n                    }\n                },\n\n                _createSelectElement: function () {\n                    var dataSourceLength = this._dataSource.getLength();\n                    var text = \"\";\n                    for (var i = 0; i < dataSourceLength; i++) {\n                        var value = \"\" + this._dataSource.getValue(i);\n                        var escaped = encodeHtml(value);\n                        // WinRT localization often tags the strings with reading direction. We want this\n                        // for display text (escaped), but don't want this in the value space, as it\n                        // only present for display.\n                        //\n                        var stripped = stripDirectionMarker(escaped);\n                        text += \"<option value='\" + stripped + \"'>\" + escaped + \"</option>\";\n                    }\n                    _SafeHtml.setInnerHTMLUnsafe(this._domElement, text);\n                    this._domElement.selectedIndex = this._index;\n                },\n\n                index: {\n                    get: function () {\n                        return Math.max(0, Math.min(this._index, this._dataSource.getLength() - 1));\n                    },\n                    set: function (value) {\n                        if (this._index !== value) {\n                            this._index = value;\n\n                            var d = this._domElement;\n                            if (d && d.selectedIndex !== value) {\n                                d.selectedIndex = value;\n                            }\n                        }\n                    }\n                },\n\n                value: {\n                    get: function () {\n                        return this._dataSource.getValue(this.index);\n                    }\n                }\n            });\n        })\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_Telemetry',[\n    'exports'\n    ], function telemetryInit(exports) {\n    \"use strict\";\n\n    /// NOTE: This file should be included when NOT building\n    /// Microsoft WinJS Framework Package which will be available in Windows Store.\n\n    exports.send = function (name, params) {\n    /// <signature helpKeyword=\"WinJS._Telemetry.send\">\n    /// <summary locid=\"WinJS._Telemetry.send\">\n    /// Formatter to upload the name/value pair to Asimov in the correct format.\n    /// This will result in no-op when built outside of Microsoft Framework Package.\n    /// </summary>\n    /// <param name=\"params\" type=\"Object\" locid=\"WinJS._Telemetry.send_p:params\">\n    /// Object of name/value pair items that need to be logged. They can be of type,\n    /// bool, int32, string.  Any other type will be ignored.\n    /// </param>\n    /// </signature>\n        /* empty */\n    };\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_UI',[\n    'exports',\n    '../Core/_BaseCoreUtils',\n    '../Core/_Base'\n    ], function uiInit(exports, _BaseCoreUtils, _Base) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        eventHandler: function (handler) {\n            /// <signature helpKeyword=\"WinJS.UI.eventHandler\">\n            /// <summary locid=\"WinJS.UI.eventHandler\">\n            /// Marks a event handler function as being compatible with declarative processing.\n            /// </summary>\n            /// <param name=\"handler\" type=\"Object\" locid=\"WinJS.UI.eventHandler_p:handler\">\n            /// The handler to be marked as compatible with declarative processing.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.UI.eventHandler_returnValue\">\n            /// The input handler.\n            /// </returns>\n            /// </signature>\n            return _BaseCoreUtils.markSupportedForProcessing(handler);\n        },\n        /// <field locid=\"WinJS.UI.Orientation\" helpKeyword=\"WinJS.UI.Orientation\">\n        /// Orientation options for a control's property\n        /// </field>\n        Orientation: {\n            /// <field locid=\"WinJS.UI.Orientation.horizontal\" helpKeyword=\"WinJS.UI.Orientation.horizontal\">\n            /// Horizontal\n            /// </field>\n            horizontal: \"horizontal\",\n            /// <field locid=\"WinJS.UI.Orientation.vertical\" helpKeyword=\"WinJS.UI.Orientation.vertical\">\n            /// Vertical\n            /// </field>\n            vertical: \"vertical\"\n        },\n\n        CountResult: {\n            unknown: \"unknown\"\n        },\n\n        CountError: {\n            noResponse: \"noResponse\"\n        },\n\n        DataSourceStatus: {\n            ready: \"ready\",\n            waiting: \"waiting\",\n            failure: \"failure\"\n        },\n\n        FetchError: {\n            noResponse: \"noResponse\",\n            doesNotExist: \"doesNotExist\"\n        },\n\n        EditError: {\n            noResponse: \"noResponse\",\n            canceled: \"canceled\",\n            notPermitted: \"notPermitted\",\n            noLongerMeaningful: \"noLongerMeaningful\"\n        },\n\n        /// <field locid=\"WinJS.UI.ListView.ObjectType\" helpKeyword=\"WinJS.UI.ObjectType\">\n        /// Specifies the type of an IListViewEntity.\n        /// </field>\n        ObjectType: {\n            /// <field locid=\"WinJS.UI.ListView.ObjectType.item\" helpKeyword=\"WinJS.UI.ObjectType.item\">\n            /// This value represents a ListView item.\n            /// </field>\n            item: \"item\",\n            /// <field locid=\"WinJS.UI.ListView.ObjectType.groupHeader\" helpKeyword=\"WinJS.UI.ObjectType.groupHeader\">\n            /// This value represents a ListView group header.\n            /// </field>\n            groupHeader: \"groupHeader\",\n            /// <field locid=\"WinJS.UI.ListView.ObjectType.header\" helpKeyword=\"WinJS.UI.ObjectType.header\">\n            /// This value represents the ListView's header.\n            /// </field>\n            header: \"header\",\n            /// <field locid=\"WinJS.UI.ListView.ObjectType.footer\" helpKeyword=\"WinJS.UI.ObjectType.footer\">\n            /// This value represents the ListView's footer.\n            /// </field>\n            footer: \"footer\",\n        },\n\n        /// <field locid=\"WinJS.UI.ListView.SelectionMode\" helpKeyword=\"WinJS.UI.SelectionMode\">\n        /// Specifies the selection mode for a ListView.\n        /// </field>\n        SelectionMode: {\n            /// <field locid=\"WinJS.UI.ListView.SelectionMode.none\" helpKeyword=\"WinJS.UI.SelectionMode.none\">\n            /// Items cannot be selected.\n            /// </field>\n            none: \"none\",\n            /// <field locid=\"WinJS.UI.ListView.SelectionMode.single\" helpKeyword=\"WinJS.UI.SelectionMode.single\">\n            /// A single item may be selected.\n            /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n            /// </field>\n            single: \"single\",\n            /// <field locid=\"WinJS.UI.ListView.SelectionMode.multi\" helpKeyword=\"WinJS.UI.SelectionMode.multi\">\n            /// Multiple items may be selected.\n            /// </field>\n            multi: \"multi\"\n        },\n\n        /// <field locid=\"WinJS.UI.TapBehavior\" helpKeyword=\"WinJS.UI.TapBehavior\">\n        /// Specifies how an ItemContainer or items in a ListView respond to the tap interaction.\n        /// </field>\n        TapBehavior: {\n            /// <field locid=\"WinJS.UI.TapBehavior.directSelect\" helpKeyword=\"WinJS.UI.TapBehavior.directSelect\">\n            /// Tapping the item invokes it and selects it. Navigating to the item with the keyboard changes the\n            /// the selection so that the focused item is the only item that is selected.\n            /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n            /// </field>\n            directSelect: \"directSelect\",\n            /// <field locid=\"WinJS.UI.TapBehavior.toggleSelect\" helpKeyword=\"WinJS.UI.TapBehavior.toggleSelect\">\n            /// Tapping the item invokes it. If the item was selected, tapping it clears the selection. If the item wasn't\n            /// selected, tapping the item selects it.\n            /// Navigating to the item with the keyboard does not select or invoke it.\n            /// </field>\n            toggleSelect: \"toggleSelect\",\n            /// <field locid=\"WinJS.UI.TapBehavior.invokeOnly\" helpKeyword=\"WinJS.UI.TapBehavior.invokeOnly\">\n            /// Tapping the item invokes it. Navigating to the item with keyboard does not select it or invoke it.\n            /// </field>\n            invokeOnly: \"invokeOnly\",\n            /// <field locid=\"WinJS.UI.TapBehavior.none\" helpKeyword=\"WinJS.UI.TapBehavior.none\">\n            /// Nothing happens.\n            /// </field>\n            none: \"none\"\n        },\n\n        /// <field locid=\"WinJS.UI.SwipeBehavior\" helpKeyword=\"WinJS.UI.SwipeBehavior\">\n        /// Specifies whether items are selected when the user performs a swipe interaction.\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        SwipeBehavior: {\n            /// <field locid=\"WinJS.UI.SwipeBehavior.select\" helpKeyword=\"WinJS.UI.SwipeBehavior.select\">\n            /// The swipe interaction selects the items touched by the swipe.\n            /// </field>\n            select: \"select\",\n            /// <field locid=\"WinJS.UI.SwipeBehavior.none\" helpKeyword=\"WinJS.UI.SwipeBehavior.none\">\n            /// The swipe interaction does not change which items are selected.\n            /// </field>\n            none: \"none\"\n        },\n\n        /// <field locid=\"WinJS.UI.GroupHeaderTapBehavior\" helpKeyword=\"WinJS.UI.GroupHeaderTapBehavior\">\n        /// Specifies how group headers in a ListView respond to the tap interaction.\n        /// </field>\n        GroupHeaderTapBehavior: {\n            /// <field locid=\"WinJS.UI.GroupHeaderTapBehavior.invoke\" helpKeyword=\"WinJS.UI.GroupHeaderTapBehavior.invoke\">\n            /// Tapping the group header invokes it.\n            /// </field>\n            invoke: \"invoke\",\n            /// <field locid=\"WinJS.UI.GroupHeaderTapBehavior.none\" helpKeyword=\"WinJS.UI.GroupHeaderTapBehavior.none\">\n            /// Nothing happens.\n            /// </field>\n            none: \"none\"\n        }\n\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities/_Xhr',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Promise',\n    '../Scheduler'\n    ], function xhrInit(_Global, _Base, Promise, Scheduler) {\n    \"use strict\";\n\n    function schedule(f, arg, priority) {\n        Scheduler.schedule(function xhr_callback() {\n            f(arg);\n        }, priority, null, \"WinJS.xhr\");\n    }\n\n    function noop() {\n    }\n\n    var schemeRegex = /^(\\w+)\\:\\/\\//;\n\n    function xhr(options) {\n        /// <signature helpKeyword=\"WinJS.xhr\">\n        /// <summary locid=\"WinJS.xhr\">\n        /// Wraps calls to XMLHttpRequest in a promise.\n        /// </summary>\n        /// <param name=\"options\" type=\"Object\" locid=\"WinJS.xhr_p:options\">\n        /// The options that are applied to the XMLHttpRequest object. They are: type,\n        /// url, user, password, headers, responseType, data, and customRequestInitializer.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.xhr_returnValue\">\n        /// A promise that returns the XMLHttpRequest object when it completes.\n        /// </returns>\n        /// </signature>\n        var req;\n        return new Promise(\n            function (c, e, p) {\n                /// <returns value=\"c(new XMLHttpRequest())\" locid=\"WinJS.xhr.constructor._returnValue\" />\n                var priority = Scheduler.currentPriority;\n                req = new _Global.XMLHttpRequest();\n\n                var isLocalRequest = false;\n                var schemeMatch = schemeRegex.exec(options.url.toLowerCase());\n                if (schemeMatch) {\n                    if (schemeMatch[1] === 'file') {\n                        isLocalRequest = true;\n                    }\n                } else if (_Global.location.protocol === 'file:'){\n                    isLocalRequest = true;\n                }\n\n\n                req.onreadystatechange = function () {\n                    if (req._canceled) {\n                        req.onreadystatechange = noop;\n                        return;\n                    }\n\n                    if (req.readyState === 4) {\n                        if ((req.status >= 200 && req.status < 300) || (isLocalRequest && req.status === 0)) {\n                            schedule(c, req, priority);\n                        } else {\n                            schedule(e, req, priority);\n                        }\n                        req.onreadystatechange = noop;\n                    } else {\n                        schedule(p, req, priority);\n                    }\n                };\n\n                req.open(\n                    options.type || \"GET\",\n                    options.url,\n                    // Promise based XHR does not support sync.\n                    //\n                    true,\n                    options.user,\n                    options.password\n                );\n                req.responseType = options.responseType || \"\";\n\n                Object.keys(options.headers || {}).forEach(function (k) {\n                    req.setRequestHeader(k, options.headers[k]);\n                });\n\n                if (options.customRequestInitializer) {\n                    options.customRequestInitializer(req);\n                }\n\n                if (options.data === undefined) {\n                    req.send();\n                } else {\n                    req.send(options.data);\n                }\n            },\n            function () {\n                req.onreadystatechange = noop;\n                req._canceled = true;\n                req.abort();\n            }\n        );\n    }\n\n    _Base.Namespace.define(\"WinJS\", {\n        xhr: xhr\n    });\n\n    return xhr;\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Utilities',[\n    './Utilities/_Control',\n    './Utilities/_Dispose',\n    './Utilities/_ElementListUtilities',\n    './Utilities/_ElementUtilities',\n    './Utilities/_Hoverable',\n    './Utilities/_ItemsManager',\n    './Utilities/_KeyboardBehavior',\n    './Utilities/_ParallelWorkQueue',\n    './Utilities/_SafeHtml',\n    './Utilities/_Select',\n    './Utilities/_TabContainer',\n    './Utilities/_Telemetry',\n    './Utilities/_UI',\n    './Utilities/_VersionManager',\n    './Utilities/_Xhr' ], function () {\n\n    //wrapper module\n});\ndefine('WinJS/XYFocus',[\"require\", \"exports\", \"./Core/_Global\", \"./Core/_Base\", \"./Core/_BaseUtils\", \"./Utilities/_ElementUtilities\", \"./Core/_Events\", \"./ControlProcessor/_OptionsParser\"], function (require, exports, _Global, _Base, _BaseUtils, _ElementUtilities, _Events, _OptionsParser) {\n    \"use strict\";\n    var Keys = _ElementUtilities.Key;\n    var AttributeNames = {\n        focusOverride: \"data-win-xyfocus\",\n        focusOverrideLegacy: \"data-win-focus\"\n    };\n    var ClassNames = {\n        focusable: \"win-focusable\",\n        xboxPlatform: \"win-xbox\",\n    };\n    var CrossDomainMessageConstants = {\n        messageDataProperty: \"msWinJSXYFocusControlMessage\",\n        register: \"register\",\n        unregister: \"unregister\",\n        dFocusEnter: \"dFocusEnter\",\n        dFocusExit: \"dFocusExit\"\n    };\n    var DirectionNames = {\n        left: \"left\",\n        right: \"right\",\n        up: \"up\",\n        down: \"down\"\n    };\n    var EventNames = {\n        focusChanging: \"focuschanging\",\n        focusChanged: \"focuschanged\"\n    };\n    var FocusableTagNames = [\n        \"A\",\n        \"BUTTON\",\n        \"IFRAME\",\n        \"INPUT\",\n        \"SELECT\",\n        \"TEXTAREA\"\n    ];\n    // These factors can be tweaked to adjust which elements are favored by the focus algorithm\n    var ScoringConstants = {\n        primaryAxisDistanceWeight: 30,\n        secondaryAxisDistanceWeight: 20,\n        percentInHistoryShadowWeight: 100000\n    };\n    /**\n     * Gets the mapping object that maps keycodes to XYFocus actions.\n    **/\n    exports.keyCodeMap = {\n        left: [Keys.GamepadLeftThumbstickLeft, Keys.GamepadDPadLeft, Keys.NavigationLeft],\n        right: [Keys.GamepadLeftThumbstickRight, Keys.GamepadDPadRight, Keys.NavigationRight],\n        up: [Keys.GamepadLeftThumbstickUp, Keys.GamepadDPadUp, Keys.NavigationUp],\n        down: [Keys.GamepadLeftThumbstickDown, Keys.GamepadDPadDown, Keys.NavigationDown],\n        accept: [Keys.GamepadA, Keys.NavigationAccept],\n    };\n    /**\n     * Gets or sets the focus root when invoking XYFocus APIs.\n    **/\n    exports.focusRoot;\n    function findNextFocusElement(direction, options) {\n        var result = _findNextFocusElementInternal(direction, options);\n        return result ? result.target : null;\n    }\n    exports.findNextFocusElement = findNextFocusElement;\n    function moveFocus(direction, options) {\n        var result = findNextFocusElement(direction, options);\n        if (result) {\n            var previousFocusElement = _Global.document.activeElement;\n            if (_trySetFocus(result, -1)) {\n                eventSrc.dispatchEvent(EventNames.focusChanged, { previousFocusElement: previousFocusElement, keyCode: -1 });\n                return result;\n            }\n        }\n    }\n    exports.moveFocus = moveFocus;\n    // Privates\n    var _lastTarget;\n    var _cachedLastTargetRect;\n    var _historyRect;\n    var _afEnabledFrames = [];\n    function _xyFocus(direction, keyCode, referenceRect) {\n        // If focus has moved since the last XYFocus movement, scrolling occured, or an explicit\n        // reference rectangle was given to us, then we invalidate the history rectangle.\n        if (referenceRect || _Global.document.activeElement !== _lastTarget) {\n            _historyRect = null;\n            _lastTarget = null;\n            _cachedLastTargetRect = null;\n        }\n        else if (_lastTarget && _cachedLastTargetRect) {\n            var lastTargetRect = _toIRect(_lastTarget.getBoundingClientRect());\n            if (lastTargetRect.left !== _cachedLastTargetRect.left || lastTargetRect.top !== _cachedLastTargetRect.top) {\n                _historyRect = null;\n                _lastTarget = null;\n                _cachedLastTargetRect = null;\n            }\n        }\n        var activeElement = _Global.document.activeElement;\n        var lastTarget = _lastTarget;\n        var result = _findNextFocusElementInternal(direction, {\n            focusRoot: exports.focusRoot,\n            historyRect: _historyRect,\n            referenceElement: _lastTarget,\n            referenceRect: referenceRect\n        });\n        if (result && _trySetFocus(result.target, keyCode)) {\n            // A focus target was found\n            updateHistoryRect(direction, result);\n            _lastTarget = result.target;\n            _cachedLastTargetRect = result.targetRect;\n            if (result.target.tagName === \"IFRAME\") {\n                var index = _afEnabledFrames.lastIndexOf(result.target.contentWindow);\n                if (index >= 0) {\n                    // If we successfully moved focus and the new focused item is an IFRAME, then we need to notify it\n                    // Note on coordinates: When signaling enter, DO transform the coordinates into the child frame's coordinate system.\n                    var refRect = _toIRect({\n                        left: result.referenceRect.left - result.targetRect.left,\n                        top: result.referenceRect.top - result.targetRect.top,\n                        width: result.referenceRect.width,\n                        height: result.referenceRect.height\n                    });\n                    var message = {};\n                    message[CrossDomainMessageConstants.messageDataProperty] = {\n                        type: CrossDomainMessageConstants.dFocusEnter,\n                        direction: direction,\n                        referenceRect: refRect\n                    };\n                    result.target.contentWindow.postMessage(message, \"*\");\n                }\n            }\n            eventSrc.dispatchEvent(EventNames.focusChanged, { previousFocusElement: activeElement, keyCode: keyCode });\n            return true;\n        }\n        else {\n            // No focus target was found; if we are inside an IFRAME, notify the parent that focus is exiting this IFRAME\n            // Note on coordinates: When signaling exit, do NOT transform the coordinates into the parent's coordinate system.\n            if (top !== window) {\n                var refRect = referenceRect;\n                if (!refRect) {\n                    refRect = _Global.document.activeElement ? _toIRect(_Global.document.activeElement.getBoundingClientRect()) : _defaultRect();\n                }\n                var message = {};\n                message[CrossDomainMessageConstants.messageDataProperty] = {\n                    type: CrossDomainMessageConstants.dFocusExit,\n                    direction: direction,\n                    referenceRect: refRect\n                };\n                _Global.parent.postMessage(message, \"*\");\n                return true;\n            }\n        }\n        return false;\n        // Nested Helpers\n        function updateHistoryRect(direction, result) {\n            var newHistoryRect = _defaultRect();\n            // It's possible to get into a situation where the target element has no overlap with the reference edge.\n            //\n            //..╔══════════════╗..........................\n            //..║   reference  ║..........................\n            //..╚══════════════╝..........................\n            //.....................╔═══════════════════╗..\n            //.....................║                   ║..\n            //.....................║       target      ║..\n            //.....................║                   ║..\n            //.....................╚═══════════════════╝..\n            //\n            // If that is the case, we need to reset the coordinates to the edge of the target element.\n            if (direction === DirectionNames.left || direction === DirectionNames.right) {\n                newHistoryRect.top = Math.max(result.targetRect.top, result.referenceRect.top, _historyRect ? _historyRect.top : Number.MIN_VALUE);\n                newHistoryRect.bottom = Math.min(result.targetRect.bottom, result.referenceRect.bottom, _historyRect ? _historyRect.bottom : Number.MAX_VALUE);\n                if (newHistoryRect.bottom <= newHistoryRect.top) {\n                    newHistoryRect.top = result.targetRect.top;\n                    newHistoryRect.bottom = result.targetRect.bottom;\n                }\n                newHistoryRect.height = newHistoryRect.bottom - newHistoryRect.top;\n                newHistoryRect.width = Number.MAX_VALUE;\n                newHistoryRect.left = Number.MIN_VALUE;\n                newHistoryRect.right = Number.MAX_VALUE;\n            }\n            else {\n                newHistoryRect.left = Math.max(result.targetRect.left, result.referenceRect.left, _historyRect ? _historyRect.left : Number.MIN_VALUE);\n                newHistoryRect.right = Math.min(result.targetRect.right, result.referenceRect.right, _historyRect ? _historyRect.right : Number.MAX_VALUE);\n                if (newHistoryRect.right <= newHistoryRect.left) {\n                    newHistoryRect.left = result.targetRect.left;\n                    newHistoryRect.right = result.targetRect.right;\n                }\n                newHistoryRect.width = newHistoryRect.right - newHistoryRect.left;\n                newHistoryRect.height = Number.MAX_VALUE;\n                newHistoryRect.top = Number.MIN_VALUE;\n                newHistoryRect.bottom = Number.MAX_VALUE;\n            }\n            _historyRect = newHistoryRect;\n        }\n    }\n    function _findNextFocusElementInternal(direction, options) {\n        options = options || {};\n        options.focusRoot = options.focusRoot || exports.focusRoot || _Global.document.body;\n        options.historyRect = options.historyRect || _defaultRect();\n        var maxDistance = Math.max(_Global.screen.availHeight, _Global.screen.availWidth);\n        var refObj = getReferenceObject(options.referenceElement, options.referenceRect);\n        // Handle override\n        if (refObj.element) {\n            var manualOverrideOptions = refObj.element.getAttribute(AttributeNames.focusOverride) || refObj.element.getAttribute(AttributeNames.focusOverrideLegacy);\n            if (manualOverrideOptions) {\n                var parsedOptions = _OptionsParser.optionsParser(manualOverrideOptions);\n                // The left-hand side can be cased as either \"left\" or \"Left\".\n                var selector = parsedOptions[direction] || parsedOptions[direction[0].toUpperCase() + direction.substr(1)];\n                if (selector) {\n                    var target;\n                    var element = refObj.element;\n                    while (!target && element) {\n                        target = element.querySelector(selector);\n                        element = element.parentElement;\n                    }\n                    if (target) {\n                        if (target === _Global.document.activeElement) {\n                            return null;\n                        }\n                        return { target: target, targetRect: _toIRect(target.getBoundingClientRect()), referenceRect: refObj.rect, usedOverride: true };\n                    }\n                }\n            }\n        }\n        // Calculate scores for each element in the root\n        var bestPotential = {\n            element: null,\n            rect: null,\n            score: 0\n        };\n        var allElements = options.focusRoot.querySelectorAll(\"*\");\n        for (var i = 0, length = allElements.length; i < length; i++) {\n            var potentialElement = allElements[i];\n            if (refObj.element === potentialElement || !isFocusable(potentialElement)) {\n                continue;\n            }\n            var potentialRect = _toIRect(potentialElement.getBoundingClientRect());\n            // Skip elements that have either a width of zero or a height of zero\n            if (potentialRect.width === 0 || potentialRect.height === 0) {\n                continue;\n            }\n            var score = calculateScore(direction, maxDistance, options.historyRect, refObj.rect, potentialRect);\n            if (score > bestPotential.score) {\n                bestPotential.element = potentialElement;\n                bestPotential.rect = potentialRect;\n                bestPotential.score = score;\n            }\n        }\n        return bestPotential.element ? { target: bestPotential.element, targetRect: bestPotential.rect, referenceRect: refObj.rect, usedOverride: false } : null;\n        // Nested Helpers\n        function calculatePercentInShadow(minReferenceCoord, maxReferenceCoord, minPotentialCoord, maxPotentialCoord) {\n            /// Calculates the percentage of the potential element that is in the shadow of the reference element.\n            if ((minReferenceCoord >= maxPotentialCoord) || (maxReferenceCoord <= minPotentialCoord)) {\n                // Potential is not in the reference's shadow.\n                return 0;\n            }\n            var pixelOverlap = Math.min(maxReferenceCoord, maxPotentialCoord) - Math.max(minReferenceCoord, minPotentialCoord);\n            var shortEdge = Math.min(maxPotentialCoord - minPotentialCoord, maxReferenceCoord - minReferenceCoord);\n            return pixelOverlap / shortEdge;\n        }\n        function calculateScore(direction, maxDistance, historyRect, referenceRect, potentialRect) {\n            var score = 0;\n            var percentInShadow;\n            var primaryAxisDistance;\n            var secondaryAxisDistance = 0;\n            var percentInHistoryShadow = 0;\n            switch (direction) {\n                case DirectionNames.left:\n                    // Make sure we don't evaluate any potential elements to the right of the reference element\n                    if (potentialRect.left >= referenceRect.left) {\n                        break;\n                    }\n                    percentInShadow = calculatePercentInShadow(referenceRect.top, referenceRect.bottom, potentialRect.top, potentialRect.bottom);\n                    primaryAxisDistance = referenceRect.left - potentialRect.right;\n                    if (percentInShadow > 0) {\n                        percentInHistoryShadow = calculatePercentInShadow(historyRect.top, historyRect.bottom, potentialRect.top, potentialRect.bottom);\n                    }\n                    else {\n                        // If the potential element is not in the shadow, then we calculate secondary axis distance\n                        secondaryAxisDistance = (referenceRect.bottom <= potentialRect.top) ? (potentialRect.top - referenceRect.bottom) : referenceRect.top - potentialRect.bottom;\n                    }\n                    break;\n                case DirectionNames.right:\n                    // Make sure we don't evaluate any potential elements to the left of the reference element\n                    if (potentialRect.right <= referenceRect.right) {\n                        break;\n                    }\n                    percentInShadow = calculatePercentInShadow(referenceRect.top, referenceRect.bottom, potentialRect.top, potentialRect.bottom);\n                    primaryAxisDistance = potentialRect.left - referenceRect.right;\n                    if (percentInShadow > 0) {\n                        percentInHistoryShadow = calculatePercentInShadow(historyRect.top, historyRect.bottom, potentialRect.top, potentialRect.bottom);\n                    }\n                    else {\n                        // If the potential element is not in the shadow, then we calculate secondary axis distance\n                        secondaryAxisDistance = (referenceRect.bottom <= potentialRect.top) ? (potentialRect.top - referenceRect.bottom) : referenceRect.top - potentialRect.bottom;\n                    }\n                    break;\n                case DirectionNames.up:\n                    // Make sure we don't evaluate any potential elements below the reference element\n                    if (potentialRect.top >= referenceRect.top) {\n                        break;\n                    }\n                    percentInShadow = calculatePercentInShadow(referenceRect.left, referenceRect.right, potentialRect.left, potentialRect.right);\n                    primaryAxisDistance = referenceRect.top - potentialRect.bottom;\n                    if (percentInShadow > 0) {\n                        percentInHistoryShadow = calculatePercentInShadow(historyRect.left, historyRect.right, potentialRect.left, potentialRect.right);\n                    }\n                    else {\n                        // If the potential element is not in the shadow, then we calculate secondary axis distance\n                        secondaryAxisDistance = (referenceRect.right <= potentialRect.left) ? (potentialRect.left - referenceRect.right) : referenceRect.left - potentialRect.right;\n                    }\n                    break;\n                case DirectionNames.down:\n                    // Make sure we don't evaluate any potential elements above the reference element\n                    if (potentialRect.bottom <= referenceRect.bottom) {\n                        break;\n                    }\n                    percentInShadow = calculatePercentInShadow(referenceRect.left, referenceRect.right, potentialRect.left, potentialRect.right);\n                    primaryAxisDistance = potentialRect.top - referenceRect.bottom;\n                    if (percentInShadow > 0) {\n                        percentInHistoryShadow = calculatePercentInShadow(historyRect.left, historyRect.right, potentialRect.left, potentialRect.right);\n                    }\n                    else {\n                        // If the potential element is not in the shadow, then we calculate secondary axis distance\n                        secondaryAxisDistance = (referenceRect.right <= potentialRect.left) ? (potentialRect.left - referenceRect.right) : referenceRect.left - potentialRect.right;\n                    }\n                    break;\n            }\n            if (primaryAxisDistance >= 0) {\n                // The score needs to be a positive number so we make these distances positive numbers\n                primaryAxisDistance = maxDistance - primaryAxisDistance;\n                secondaryAxisDistance = maxDistance - secondaryAxisDistance;\n                if (primaryAxisDistance >= 0 && secondaryAxisDistance >= 0) {\n                    // Potential elements in the shadow get a multiplier to their final score\n                    primaryAxisDistance += primaryAxisDistance * percentInShadow;\n                    score = primaryAxisDistance * ScoringConstants.primaryAxisDistanceWeight + secondaryAxisDistance * ScoringConstants.secondaryAxisDistanceWeight + percentInHistoryShadow * ScoringConstants.percentInHistoryShadowWeight;\n                }\n            }\n            return score;\n        }\n        function getReferenceObject(referenceElement, referenceRect) {\n            var refElement;\n            var refRect;\n            if ((!referenceElement && !referenceRect) || (referenceElement && !referenceElement.parentNode)) {\n                // Note: We need to check to make sure 'parentNode' is not null otherwise there is a case\n                // where _lastTarget is defined, but calling getBoundingClientRect will throw a native exception.\n                // This case happens if the innerHTML of the parent of the _lastTarget is set to \"\".\n                // If no valid reference is supplied, we'll use _Global.document.activeElement unless it's the body\n                if (_Global.document.activeElement !== _Global.document.body) {\n                    referenceElement = _Global.document.activeElement;\n                }\n            }\n            if (referenceElement) {\n                refElement = referenceElement;\n                refRect = _toIRect(refElement.getBoundingClientRect());\n            }\n            else if (referenceRect) {\n                refRect = _toIRect(referenceRect);\n            }\n            else {\n                refRect = _defaultRect();\n            }\n            return {\n                element: refElement,\n                rect: refRect\n            };\n        }\n        function isFocusable(element) {\n            var elementTagName = element.tagName;\n            if (!element.hasAttribute(\"tabindex\") && FocusableTagNames.indexOf(elementTagName) === -1 && !_ElementUtilities.hasClass(element, ClassNames.focusable)) {\n                // If the current potential element is not one of the tags we consider to be focusable, then exit\n                return false;\n            }\n            if (elementTagName === \"IFRAME\" && _afEnabledFrames.indexOf(element.contentWindow) === -1) {\n                // Skip IFRAMEs without compatible XYFocus implementation\n                return false;\n            }\n            if (elementTagName === \"DIV\" && element[\"winControl\"] && element[\"winControl\"].disabled) {\n                // Skip disabled WinJS controls\n                return false;\n            }\n            var style = getComputedStyle(element);\n            if (element.getAttribute(\"tabIndex\") === \"-1\" || style.display === \"none\" || style.visibility === \"hidden\" || element.disabled) {\n                // Skip elements that are hidden\n                // Note: We don't check for opacity === 0, because the browser cannot tell us this value accurately.\n                return false;\n            }\n            return true;\n        }\n    }\n    function _defaultRect() {\n        // We set the top, left, bottom and right properties of the referenceBoundingRectangle to '-1'\n        // (as opposed to '0') because we want to make sure that even elements that are up to the edge\n        // of the screen can receive focus.\n        return {\n            top: -1,\n            bottom: -1,\n            right: -1,\n            left: -1,\n            height: 0,\n            width: 0\n        };\n    }\n    function _toIRect(rect) {\n        return {\n            top: Math.floor(rect.top),\n            bottom: Math.floor(rect.top + rect.height),\n            right: Math.floor(rect.left + rect.width),\n            left: Math.floor(rect.left),\n            height: Math.floor(rect.height),\n            width: Math.floor(rect.width),\n        };\n    }\n    function _trySetFocus(element, keyCode) {\n        // We raise an event on the focusRoot before focus changes to give listeners\n        // a chance to prevent the next focus target from receiving focus if they want.\n        var canceled = eventSrc.dispatchEvent(EventNames.focusChanging, { nextFocusElement: element, keyCode: keyCode });\n        if (!canceled) {\n            element.focus();\n        }\n        return _Global.document.activeElement === element;\n    }\n    function _getIFrameFromWindow(win) {\n        var iframes = _Global.document.querySelectorAll(\"IFRAME\");\n        var found = Array.prototype.filter.call(iframes, function (x) { return x.contentWindow === win; });\n        return found.length ? found[0] : null;\n    }\n    function _handleKeyEvent(e) {\n        if (e.defaultPrevented) {\n            return;\n        }\n        var keys = Object.keys(exports.keyCodeMap);\n        for (var i = 0; i < keys.length; i++) {\n            // Note: key is 'left', 'right', 'up', 'down', or 'accept'\n            var key = keys[i];\n            var keyMappings = exports.keyCodeMap[key];\n            if (keyMappings.indexOf(e.keyCode) >= 0) {\n                if (keyMappings === exports.keyCodeMap.accept) {\n                    _Global.document.activeElement && _Global.document.activeElement[\"click\"] && _Global.document.activeElement[\"click\"]();\n                }\n                else {\n                    if (_xyFocus(key, e.keyCode)) {\n                        e.preventDefault();\n                    }\n                }\n                return;\n            }\n        }\n    }\n    _Global.addEventListener(\"message\", function (e) {\n        if (!e.data || !e.data[CrossDomainMessageConstants.messageDataProperty]) {\n            return;\n        }\n        var data = e.data[CrossDomainMessageConstants.messageDataProperty];\n        switch (data.type) {\n            case CrossDomainMessageConstants.register:\n                _afEnabledFrames.push(e.source);\n                break;\n            case CrossDomainMessageConstants.unregister:\n                var index = _afEnabledFrames.indexOf(e.source);\n                if (index >= 0) {\n                    _afEnabledFrames.splice(index, 1);\n                }\n                break;\n            case CrossDomainMessageConstants.dFocusEnter:\n                // The coordinates stored in data.refRect are already in this frame's coordinate system.\n                // When we get this message we will force-enable XYFocus to support scenarios where\n                // websites running WinJS are put into an IFRAME and the parent frame has XYFocus enabled.\n                _xyFocus(data.direction, -1, data.referenceRect);\n                break;\n            case CrossDomainMessageConstants.dFocusExit:\n                var iframe = _getIFrameFromWindow(e.source);\n                if (_Global.document.activeElement !== iframe) {\n                    break;\n                }\n                // The coordinates stored in data.refRect are in the IFRAME's coordinate system,\n                // so we must first transform them into this frame's coordinate system.\n                var refRect = data.referenceRect;\n                refRect.left += iframe.offsetLeft;\n                refRect.top += iframe.offsetTop;\n                _xyFocus(data.direction, -1, refRect);\n                break;\n        }\n    });\n    _BaseUtils.ready().then(function () {\n        if (_ElementUtilities.hasWinRT && _Global[\"Windows\"] && _Global[\"Windows\"][\"Xbox\"]) {\n            _ElementUtilities.addClass(_Global.document.body, ClassNames.xboxPlatform);\n        }\n        _Global.document.addEventListener(\"keydown\", _handleKeyEvent);\n        // If we are running within an iframe, we send a registration message to the parent window\n        if (_Global.top !== _Global.window) {\n            var message = {};\n            message[CrossDomainMessageConstants.messageDataProperty] = {\n                type: CrossDomainMessageConstants.register,\n                version: 1.0\n            };\n            _Global.parent.postMessage(message, \"*\");\n        }\n    });\n    // Publish to WinJS namespace\n    var toPublish = {\n        focusRoot: {\n            get: function () {\n                return exports.focusRoot;\n            },\n            set: function (value) {\n                exports.focusRoot = value;\n            }\n        },\n        findNextFocusElement: findNextFocusElement,\n        keyCodeMap: exports.keyCodeMap,\n        moveFocus: moveFocus,\n        onfocuschanged: _Events._createEventProperty(EventNames.focusChanged),\n        onfocuschanging: _Events._createEventProperty(EventNames.focusChanging),\n        _xyFocus: _xyFocus\n    };\n    toPublish = _BaseUtils._merge(toPublish, _Events.eventMixin);\n    toPublish[\"_listeners\"] = {};\n    var eventSrc = toPublish;\n    _Base.Namespace.define(\"WinJS.UI.XYFocus\", toPublish);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Fragments',[\n    'exports',\n    './Core/_Global',\n    './Core/_WinRT',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './Core/_ErrorFromName',\n    './Core/_Resources',\n    './Core/_WriteProfilerMark',\n    './Promise',\n    './Utilities/_ElementUtilities',\n    './Utilities/_SafeHtml',\n    './Utilities/_Xhr'\n], function fragmentLoaderInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, Promise, _ElementUtilities, _SafeHtml, _Xhr) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var forEach = function (arrayLikeValue, action) {\n        for (var i = 0, l = arrayLikeValue.length; i < l; i++) {\n            action(arrayLikeValue[i], i);\n        }\n    };\n    var head = _Global.document.head || _Global.document.getElementsByTagName(\"head\")[0];\n    var scripts = {};\n    var styles = {};\n    var links = {};\n    var initialized = false;\n    var cacheStore = {};\n    var uniqueId = 1;\n\n    function addScript(scriptTag, fragmentHref, position, lastNonInlineScriptPromise) {\n        // We synthesize a name for inline scripts because today we put the\n        // inline scripts in the same processing pipeline as src scripts. If\n        // we seperated inline scripts into their own logic, we could simplify\n        // this somewhat.\n        //\n        var src = scriptTag.src;\n        var inline = !src;\n        if (inline) {\n            src = fragmentHref + \"script[\" + position + \"]\";\n        }\n        src = src.toLowerCase();\n\n        if (!(src in scripts)) {\n            var promise = null;\n\n            scripts[src] = true;\n            var n = _Global.document.createElement(\"script\");\n            if (scriptTag.language) {\n                n.setAttribute(\"language\", \"javascript\");\n            }\n            n.setAttribute(\"type\", scriptTag.type);\n            n.setAttribute(\"async\", \"false\");\n            if (scriptTag.id) {\n                n.setAttribute(\"id\", scriptTag.id);\n            }\n            if (inline) {\n                var text = scriptTag.text;\n                promise = lastNonInlineScriptPromise.then(function () {\n                    n.text = text;\n                }).then(null, function () {\n                    // eat error\n                });\n            } else {\n                promise = new Promise(function (c) {\n                    n.onload = n.onerror = function () {\n                        c();\n                    };\n\n                    // Using scriptTag.src to maintain the original casing\n                    n.setAttribute(\"src\", scriptTag.src);\n                });\n            }\n            head.appendChild(n);\n\n            return {\n                promise: promise,\n                inline: inline,\n            };\n        }\n    }\n\n    function addStyle(styleTag, fragmentHref, position) {\n        var src = (fragmentHref + \"script[\" + position + \"]\").toLowerCase();\n        if (!(src in styles)) {\n            styles[src] = true;\n            head.appendChild(styleTag.cloneNode(true));\n        }\n    }\n\n    function addLink(styleTag) {\n        var src = styleTag.href.toLowerCase();\n        if (!(src in links)) {\n            links[src] = true;\n            var n = styleTag.cloneNode(false);\n\n            // Using scriptTag.href  to maintain the original casing\n            n.href = styleTag.href;\n            head.appendChild(n);\n        }\n    }\n\n    function getStateRecord(href, removeFromCache) {\n        if (typeof href === \"string\") {\n            return loadFromCache(href, removeFromCache);\n        } else {\n            var state = {\n                docfrag: _ElementUtilities.data(href).docFragment\n            };\n            if (!state.docfrag) {\n                var fragment = _Global.document.createDocumentFragment();\n                while (href.childNodes.length > 0) {\n                    fragment.appendChild(href.childNodes[0]);\n                }\n                state.docfrag = _ElementUtilities.data(href).docFragment = fragment;\n                href.setAttribute(\"data-win-hasfragment\", \"\");\n            }\n            if (removeFromCache) {\n                clearCache(href);\n            }\n            return Promise.as(state);\n        }\n    }\n    function createEntry(state, href) {\n        return populateDocument(state, href).\n            then(function () {\n                if (state.document) {\n                    return processDocument(href, state);\n                } else {\n                    return state;\n                }\n            }).\n            then(function () {\n                if (state.document) {\n                    delete state.document;\n                }\n                return state;\n            });\n    }\n\n    function loadFromCache(href, removeFromCache) {\n        var fragmentId = href.toLowerCase();\n        var state = cacheStore[fragmentId];\n\n        if (state) {\n            if (removeFromCache) {\n                delete cacheStore[fragmentId];\n            }\n            if (state.promise) {\n                return state.promise;\n            } else {\n                return Promise.as(state);\n            }\n        } else {\n            state = {};\n            if (!removeFromCache) {\n                cacheStore[fragmentId] = state;\n            }\n            var result = state.promise = createEntry(state, href);\n            state.promise.then(function () { delete state.promise; });\n            return result;\n        }\n    }\n\n    function processDocument(href, state) {\n        // Once the control's static state has been loaded in the temporary iframe,\n        // this method spelunks the iframe's document to retrieve all relevant information. Also,\n        // this performs any needed fixups on the DOM (like adjusting relative URLs).\n\n        var cd = state.document;\n        var b = cd.body;\n        var sp = [];\n\n        forEach(cd.querySelectorAll('link[rel=\"stylesheet\"], link[type=\"text/css\"]'), addLink);\n        forEach(cd.getElementsByTagName('style'), function (e, i) { addStyle(e, href, i); });\n\n        // In DOCMODE 11 IE moved to the standards based script loading behavior of\n        // having out-of-line script elements which are dynamically added to the DOM\n        // asynchronously load. This raises two problems for our fragment loader,\n        //\n        //  1) out-of-line scripts need to execute in order\n        //\n        //  2) so do in-line scripts.\n        //\n        // In order to mitigate this behavior we do two things:\n        //\n        //  A) We mark all scripts with the attribute async='false' which makes\n        //     out-of-line scripts respect DOM append order for execution when they\n        //     are eventually retrieved\n        //\n        //  B) We chain the setting of in-line script element's 'text' property\n        //     on the completion of the previous out-of-line script's execution.\n        //     This relies on the fact that the out-of-line script elements will\n        //     synchronously run their onload handler immediately after executing\n        //     thus assuring that the in-line script will run before the next\n        //     trailing out-of-line script.\n        //\n        var lastNonInlineScriptPromise = Promise.as();\n        forEach(cd.getElementsByTagName('script'), function (e, i) {\n            var result = addScript(e, href, i, lastNonInlineScriptPromise);\n            if (result) {\n                if (!result.inline) {\n                    lastNonInlineScriptPromise = result.promise;\n                }\n                sp.push(result.promise);\n            }\n        });\n\n        forEach(b.getElementsByTagName('img'), function (e) { e.src = e.src; });\n        forEach(b.getElementsByTagName('a'), function (e) {\n            // for # only anchor tags, we don't update the href\n            //\n            if (e.href !== \"\") {\n                var href = e.getAttribute(\"href\");\n                if (href && href[0] !== \"#\") {\n                    e.href = e.href;\n                }\n            }\n        });\n\n        // strip inline scripts from the body, they got copied to the\n        // host document with the rest of the scripts above...\n        //\n        var localScripts = b.getElementsByTagName(\"script\");\n        while (localScripts.length > 0) {\n            var s = localScripts[0];\n            s.parentNode.removeChild(s);\n        }\n\n        return Promise.join(sp).then(function () {\n            // Create the docfrag which is just the body children\n            //\n            var fragment = _Global.document.createDocumentFragment();\n            var imported = _Global.document.importNode(cd.body, true);\n            while (imported.childNodes.length > 0) {\n                fragment.appendChild(imported.childNodes[0]);\n            }\n            state.docfrag = fragment;\n\n            return state;\n        });\n    }\n\n    function initialize() {\n        if (initialized) { return; }\n\n        initialized = true;\n\n        forEach(head.querySelectorAll(\"script\"), function (e) {\n            scripts[e.src.toLowerCase()] = true;\n        });\n\n\n        forEach(head.querySelectorAll('link[rel=\"stylesheet\"], link[type=\"text/css\"]'), function (e) {\n            links[e.href.toLowerCase()] = true;\n        });\n    }\n\n    function renderCopy(href, target) {\n        /// <signature helpKeyword=\"WinJS.UI.Fragments.renderCopy\">\n        /// <summary locid=\"WinJS.UI.Fragments.renderCopy\">\n        /// Copies the contents of the specified URI into the specified element.\n        /// </summary>\n        /// <param name=\"href\" type=\"String\" locid=\"WinJS.UI.Fragments.renderCopy_p:href\">\n        /// The URI that contains the fragment to copy.\n        /// </param>\n        /// <param name=\"target\" type=\"HTMLElement\" optional=\"true\" locid=\"WinJS.UI.Fragments.renderCopy_p:target\">\n        /// The element to which the fragment is appended.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Fragments.renderCopy_returnValue\">\n        /// A promise that is fulfilled when the fragment has been loaded.\n        /// If a target element is not specified, the copied fragment is the\n        /// completed value.\n        /// </returns>\n        /// </signature>\n\n        return renderImpl(href, target, true);\n    }\n\n    function renderImpl(href, target, copy) {\n        var profilerMarkIdentifier = (href instanceof _Global.HTMLElement ? _BaseUtils._getProfilerMarkIdentifier(href) : \" href='\" + href + \"'\") + \"[\" + (++uniqueId) + \"]\";\n        writeProfilerMark(\"WinJS.UI.Fragments:render\" + profilerMarkIdentifier + \",StartTM\");\n\n        initialize();\n        return getStateRecord(href, !copy).then(function (state) {\n            var frag = state.docfrag;\n            if (copy) {\n                frag = frag.cloneNode(true);\n            }\n\n            var child = frag.firstChild;\n            while (child) {\n                if (child.nodeType === 1 /*Element node*/) {\n                    child.msParentSelectorScope = true;\n                }\n                child = child.nextSibling;\n            }\n\n            var retVal;\n            if (target) {\n                target.appendChild(frag);\n                retVal = target;\n            } else {\n                retVal = frag;\n            }\n            writeProfilerMark(\"WinJS.UI.Fragments:render\" + profilerMarkIdentifier + \",StopTM\");\n            return retVal;\n        });\n    }\n\n    function render(href, target) {\n        /// <signature helpKeyword=\"WinJS.UI.Fragments.render\">\n        /// <summary locid=\"WinJS.UI.Fragments.render\">\n        /// Copies the contents of the specified URI into the specified element.\n        /// </summary>\n        /// <param name='href' type='String' locid=\"WinJS.UI.Fragments.render_p:href\">\n        /// The URI that contains the fragment to copy.\n        /// </param>\n        /// <param name='target' type='HTMLElement' optional='true' locid=\"WinJS.UI.Fragments.render_p:target\">\n        /// The element to which the fragment is appended.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Fragments.render_returnValue\">\n        /// A promise that is fulfilled when the fragment has been loaded.\n        /// If a target element is not specified, the copied fragment is the\n        /// completed value.\n        /// </returns>\n        /// </signature>\n\n        return renderImpl(href, target, false);\n    }\n\n    function cache(href) {\n        /// <signature helpKeyword=\"WinJS.UI.Fragments.cache\">\n        /// <summary locid=\"WinJS.UI.Fragments.cache\">\n        /// Starts loading the fragment at the specified location. The returned promise completes\n        /// when the fragment is ready to be copied.\n        /// </summary>\n        /// <param name=\"href\" type=\"String or DOMElement\" locid=\"WinJS.UI.Fragments.cache_p:href\">\n        /// The URI that contains the fragment to be copied.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Fragments.cache_returnValue\">\n        /// A promise that is fulfilled when the fragment has been prepared for copying.\n        /// </returns>\n        /// </signature>\n        initialize();\n        return getStateRecord(href).then(function (state) { return state.docfrag; });\n    }\n\n    function clearCache(href) {\n        /// <signature helpKeyword=\"WinJS.UI.Fragments.clearCache\">\n        /// <summary locid=\"WinJS.UI.Fragments.clearCache\">\n        /// Removes any cached information about the specified fragment. This method does not unload any scripts\n        /// or styles that are referenced by the fragment.\n        /// </summary>\n        /// <param name=\"href\" type=\"String or DOMElement\" locid=\"WinJS.UI.Fragments.clearCache_p:href\">\n        /// The URI that contains the fragment to be cleared. If no URI is provided, the entire contents of the cache are cleared.\n        /// </param>\n        /// </signature>\n\n        if (!href) {\n            cacheStore = {};\n        } else if (typeof (href) === \"string\") {\n            delete cacheStore[href.toLowerCase()];\n        } else {\n            delete _ElementUtilities.data(href).docFragment;\n            href.removeAttribute(\"data-win-hasfragment\");\n        }\n    }\n\n    function populateDocument(state, href) {\n\n        var htmlDoc = _Global.document.implementation.createHTMLDocument(\"frag\");\n        var base = htmlDoc.createElement(\"base\");\n        htmlDoc.head.appendChild(base);\n        var anchor = htmlDoc.createElement(\"a\");\n        htmlDoc.body.appendChild(anchor);\n        base.href = _Global.document.location.href; // Initialize base URL to primary document URL\n        anchor.setAttribute(\"href\", href); // Resolve the relative path to an absolute path\n        base.href = anchor.href; // Update the base URL to be the resolved absolute path\n        // 'anchor' is no longer needed at this point and will be removed by the innerHTML call\n        state.document = htmlDoc;\n        return getFragmentContents(href).then(function (text) {\n            _SafeHtml.setInnerHTMLUnsafe(htmlDoc.documentElement, text);\n            htmlDoc.head.appendChild(base);\n        });\n    }\n\n    var writeProfilerMark = _WriteProfilerMark;\n\n    var getFragmentContents = getFragmentContentsXHR;\n    function getFragmentContentsXHR(href) {\n        return _Xhr({ url: href }).then(function (req) {\n            return req.responseText;\n        });\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI.Fragments\", {\n        renderCopy: renderCopy,\n        render: render,\n        cache: cache,\n        clearCache: clearCache,\n        _cacheStore: { get: function () { return cacheStore; } },\n        _getFragmentContents: {\n            get: function () {\n                return getFragmentContents;\n            },\n            set: function (value) {\n                getFragmentContents = value;\n            }\n        },\n        _writeProfilerMark: {\n            get: function () {\n                return writeProfilerMark;\n            },\n            set: function (value) {\n                writeProfilerMark = value;\n            }\n        }\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Application/_State',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Promise'\n    ], function stateInit(exports, _Global, _WinRT, _Base, _BaseUtils, Promise) {\n    \"use strict\";\n\n    function initWithWinRT() {\n        var local, temp, roaming;\n\n        var IOHelper = _Base.Class.define(\n        function IOHelper_ctor(folder) {\n            this.folder = folder;\n            this._path = folder.path;\n            if (folder.tryGetItemAsync) {\n                this._tryGetItemAsync = folder.tryGetItemAsync.bind(folder);\n            }\n        }, {\n            _tryGetItemAsync: function (fileName) {\n                return this.folder.getFileAsync(fileName).then(null, function () { return false; });\n            },\n\n            exists: function (fileName) {\n                /// <signature helpKeyword=\"WinJS.Application.IOHelper.exists\">\n                /// <summary locid=\"WinJS.Application.IOHelper.exists\">\n                /// Determines if the specified file exists in the container\n                /// </summary>\n                /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.IOHelper.exists_p:fileName\">\n                /// The file which may exist within this folder\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.IOHelper.exists_returnValue\">\n                /// Promise with either true (file exists) or false.\n                /// </returns>\n                /// </signature>\n                return this._tryGetItemAsync(fileName).then(function (fileItem) {\n                    return fileItem ? true : false;\n                });\n            },\n            remove: function (fileName) {\n                /// <signature helpKeyword=\"WinJS.Application.IOHelper.remove\">\n                /// <summary locid=\"WinJS.Application.IOHelper.remove\">\n                /// Delets a file in the container\n                /// </summary>\n                /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.IOHelper.remove_p:fileName\">\n                /// The file to be deleted\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.IOHelper.remove_returnValue\">\n                /// Promise which is fulfilled when the file has been deleted\n                /// </returns>\n                /// </signature>\n                return this._tryGetItemAsync(fileName).then(function (fileItem) {\n                    return fileItem ? fileItem.deleteAsync() : false;\n                }).then(null, function () { return false; });\n            },\n            writeText: function (fileName, str) {\n                /// <signature helpKeyword=\"WinJS.Application.IOHelper.writeText\">\n                /// <summary locid=\"WinJS.Application.IOHelper.writeText\">\n                /// Writes a file to the container with the specified text\n                /// </summary>\n                /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.IOHelper.writeText_p:fileName\">\n                /// The file to write to\n                /// </param>\n                /// <param name=\"str\" type=\"String\" locid=\"WinJS.Application.IOHelper.writeText_p:str\">\n                /// Content to be written to the file\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.IOHelper.writeText_returnValue\">\n                /// Promise which is fulfilled when the file has been written\n                /// </returns>\n                /// </signature>\n                var sto = _WinRT.Windows.Storage;\n                var that = this;\n                return that.folder.createFileAsync(fileName, sto.CreationCollisionOption.openIfExists).\n                    then(function (fileItem) {\n                        return sto.FileIO.writeTextAsync(fileItem, str);\n                    });\n            },\n\n            readText: function (fileName, def) {\n                /// <signature helpKeyword=\"WinJS.Application.IOHelper.readText\">\n                /// <summary locid=\"WinJS.Application.IOHelper.readText\">\n                /// Reads the contents of a file from the container, if the file\n                /// doesn't exist, def is returned.\n                /// </summary>\n                /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.IOHelper.readText_p:fileName\">\n                /// The file to read from\n                /// </param>\n                /// <param name=\"def\" type=\"String\" locid=\"WinJS.Application.IOHelper.readText_p:def\">\n                /// Default value to be returned if the file failed to open\n                /// </param>\n                /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.IOHelper.readText_returnValue\">\n                /// Promise containing the contents of the file, or def.\n                /// </returns>\n                /// </signature>\n                var sto = _WinRT.Windows.Storage;\n                return this._tryGetItemAsync(fileName).then(function (fileItem) {\n                    return fileItem ? sto.FileIO.readTextAsync(fileItem) : def;\n                }).then(null, function () { return def; });\n            }\n\n        }, {\n            supportedForProcessing: false,\n        });\n\n        _Base.Namespace._moduleDefine(exports, \"WinJS.Application\", {\n            /// <field type=\"Object\" helpKeyword=\"WinJS.Application.local\" locid=\"WinJS.Application.local\">\n            /// Allows access to create files in the application local storage, which is preserved across runs\n            /// of an application and does not roam.\n            /// </field>\n            local: {\n                get: function () {\n                    if (!local) {\n                        local = new IOHelper(_WinRT.Windows.Storage.ApplicationData.current.localFolder);\n                    }\n                    return local;\n                }\n            },\n            /// <field type=\"Object\" helpKeyword=\"WinJS.Application.temp\" locid=\"WinJS.Application.temp\">\n            /// Allows access to create files in the application temp storage, which may be reclaimed\n            /// by the system between application runs.\n            /// </field>\n            temp: {\n                get: function () {\n                    if (!temp) {\n                        temp = new IOHelper(_WinRT.Windows.Storage.ApplicationData.current.temporaryFolder);\n                    }\n                    return temp;\n                }\n            },\n            /// <field type=\"Object\" helpKeyword=\"WinJS.Application.roaming\" locid=\"WinJS.Application.roaming\">\n            /// Allows access to create files in the application roaming storage, which is preserved across runs\n            /// of an application and roams with the user across multiple machines.\n            /// </field>\n            roaming: {\n                get: function () {\n                    if (!roaming) {\n                        roaming = new IOHelper(_WinRT.Windows.Storage.ApplicationData.current.roamingFolder);\n                    }\n                    return roaming;\n                }\n            }\n        });\n    }\n\n    function initWithStub() {\n        var InMemoryHelper = _Base.Class.define(\n            function InMemoryHelper_ctor() {\n                this.storage = {};\n            }, {\n                exists: function (fileName) {\n                    /// <signature helpKeyword=\"WinJS.Application.InMemoryHelper.exists\">\n                    /// <summary locid=\"WinJS.Application.InMemoryHelper.exists\">\n                    /// Determines if the specified file exists in the container\n                    /// </summary>\n                    /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.InMemoryHelper.exists_p:fileName\">\n                    /// The filename which may exist within this folder\n                    /// </param>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.InMemoryHelper.exists_returnValue\">\n                    /// Promise with either true (file exists) or false.\n                    /// </returns>\n                    /// </signature>\n                    // force conversion to boolean\n                    //\n                    return Promise.as(this.storage[fileName] !== undefined);\n                },\n                remove: function (fileName) {\n                    /// <signature helpKeyword=\"WinJS.Application.InMemoryHelper.remove\">\n                    /// <summary locid=\"WinJS.Application.InMemoryHelper.remove\">\n                    /// Deletes a file in the container\n                    /// </summary>\n                    /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.InMemoryHelper.remove_p:fileName\">\n                    /// The file to be deleted\n                    /// </param>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.InMemoryHelper.remove_returnValue\">\n                    /// Promise which is fulfilled when the file has been deleted\n                    /// </returns>\n                    /// </signature>\n                    delete this.storage[fileName];\n                    return Promise.as();\n                },\n                writeText: function (fileName, str) {\n                    /// <signature helpKeyword=\"WinJS.Application.InMemoryHelper.writeText\">\n                    /// <summary locid=\"WinJS.Application.InMemoryHelper.writeText\">\n                    /// Writes a file to the container with the specified text\n                    /// </summary>\n                    /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.InMemoryHelper.writeText_p:fileName\">\n                    /// The filename to write to\n                    /// </param>\n                    /// <param name=\"str\" type=\"String\" locid=\"WinJS.Application.InMemoryHelper.writeText_p:str\">\n                    /// Content to be written to the file\n                    /// </param>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.InMemoryHelper.writeText_returnValue\">\n                    /// Promise which is fulfilled when the file has been written\n                    /// </returns>\n                    /// </signature>\n                    this.storage[fileName] = str;\n                    return Promise.as(str.length);\n                },\n                readText: function (fileName, def) {\n                    /// <signature helpKeyword=\"WinJS.Application.InMemoryHelper.readText\">\n                    /// <summary locid=\"WinJS.Application.InMemoryHelper.readText\">\n                    /// Reads the contents of a file from the container, if the file\n                    /// doesn't exist, def is returned.\n                    /// </summary>\n                    /// <param name=\"fileName\" type=\"String\" locid=\"WinJS.Application.InMemoryHelper.readText_p:fileName\">\n                    /// The filename to read from\n                    /// </param>\n                    /// <param name=\"def\" type=\"String\" locid=\"WinJS.Application.InMemoryHelper.readText_p:def\">\n                    /// Default value to be returned if the file failed to open\n                    /// </param>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Application.InMemoryHelper.readText_returnValue\">\n                    /// Promise containing the contents of the file, or def.\n                    /// </returns>\n                    /// </signature>\n                    var result = this.storage[fileName];\n                    return Promise.as(typeof result === \"string\" ? result : def);\n                }\n            }, {\n                supportedForProcessing: false,\n            }\n        );\n\n        _Base.Namespace._moduleDefine(exports, \"WinJS.Application\", {\n            /// <field type=\"Object\" helpKeyword=\"WinJS.Application.local\" locid=\"WinJS.Application.local\">\n            /// Allows access to create files in the application local storage, which is preserved across runs\n            /// of an application and does not roam.\n            /// </field>\n            local: new InMemoryHelper(),\n            /// <field type=\"Object\" helpKeyword=\"WinJS.Application.temp\" locid=\"WinJS.Application.temp\">\n            /// Allows access to create files in the application temp storage, which may be reclaimed\n            /// by the system between application runs.\n            /// </field>\n            temp: new InMemoryHelper(),\n            /// <field type=\"Object\" helpKeyword=\"WinJS.Application.roaming\" locid=\"WinJS.Application.roaming\">\n            /// Allows access to create files in the application roaming storage, which is preserved across runs\n            /// of an application and roams with the user across multiple machines.\n            /// </field>\n            roaming: new InMemoryHelper()\n        });\n    }\n\n    if (_WinRT.Windows.Storage.FileIO && _WinRT.Windows.Storage.ApplicationData && _WinRT.Windows.Storage.CreationCollisionOption) {\n        initWithWinRT();\n    } else {\n        initWithStub();\n    }\n\n    var sessionState = {};\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Application\", {\n        sessionState: {\n            get: function () {\n                return sessionState;\n            },\n            set: function (value) {\n                sessionState = value;\n            }\n        },\n        _loadState: function (e) {\n            // we only restore state if we are coming back from a clear termination from PLM\n            //\n            if (e.previousExecutionState === 3 /* ApplicationExecutionState.Terminated */) {\n                return exports.local.readText(\"_sessionState.json\", \"{}\").\n                    then(function (str) {\n                        var sessionState = JSON.parse(str);\n                        if (sessionState && Object.keys(sessionState).length > 0) {\n                            exports._sessionStateLoaded = true;\n                        }\n                        exports.sessionState = sessionState;\n                    }).\n                    then(null, function () {\n                        exports.sessionState = {};\n                    });\n            } else {\n                return Promise.as();\n            }\n        },\n        _oncheckpoint: function (event, Application) {\n            if (_Global.MSApp && _Global.MSApp.getViewOpener && _Global.MSApp.getViewOpener()) {\n                // don't save state in child windows.\n                return;\n            }\n            var sessionState = exports.sessionState;\n            if ((sessionState && Object.keys(sessionState).length > 0) || exports._sessionStateLoaded) {\n                var stateString;\n                try {\n                    stateString = JSON.stringify(sessionState);\n                } catch (e) {\n                    stateString = \"\";\n                    Application.queueEvent({ type: \"error\", detail: e });\n                }\n                event.setPromise(\n                    exports.local.writeText(\"_sessionState.json\", stateString).\n                        then(null, function (err) {\n                            Application.queueEvent({ type: \"error\", detail: err });\n                        })\n                );\n            }\n        }\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Navigation',[\n    'exports',\n    './Core/_Base',\n    './Core/_Events',\n    './Core/_WriteProfilerMark',\n    './Promise'\n    ], function navigationInit(exports, _Base, _Events, _WriteProfilerMark, Promise) {\n    \"use strict\";\n\n    var navigatedEventName = \"navigated\";\n    var navigatingEventName = \"navigating\";\n    var beforenavigateEventName = \"beforenavigate\";\n    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /* empty */ }, { supportedForProcessing: false }), _Events.eventMixin);\n    var listeners = new ListenerType();\n    var history = {\n        backStack: [],\n        current: { location: \"\", initialPlaceholder: true },\n        forwardStack: []\n    };\n    var createEvent = _Events._createEventProperty;\n\n    var raiseBeforeNavigate = function (proposed) {\n        _WriteProfilerMark(\"WinJS.Navigation:navigation,StartTM\");\n        return Promise.as().\n            then(function () {\n                var waitForPromise = Promise.as();\n                var defaultPrevented = listeners.dispatchEvent(beforenavigateEventName, {\n                    setPromise: function (promise) {\n                        /// <signature helpKeyword=\"WinJS.Navigation.beforenavigate.setPromise\">\n                        /// <summary locid=\"WinJS.Navigation.beforenavigate.setPromise\">\n                        /// Used to inform the ListView that asynchronous work is being performed, and that this\n                        /// event handler should not be considered complete until the promise completes.\n                        /// </summary>\n                        /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.Navigation.beforenavigate.setPromise_p:promise\">\n                        /// The promise to wait for.\n                        /// </param>\n                        /// </signature>\n\n                        waitForPromise = waitForPromise.then(function () { return promise; });\n                    },\n                    location: proposed.location,\n                    state: proposed.state\n                });\n                return waitForPromise.then(function beforeNavComplete(cancel) {\n                    return defaultPrevented || cancel;\n                });\n            });\n    };\n    var raiseNavigating = function (delta) {\n        return Promise.as().\n            then(function () {\n                var waitForPromise = Promise.as();\n                listeners.dispatchEvent(navigatingEventName, {\n                    setPromise: function (promise) {\n                        /// <signature helpKeyword=\"WinJS.Navigation.navigating.setPromise\">\n                        /// <summary locid=\"WinJS.Navigation.navigating.setPromise\">\n                        /// Used to inform the ListView that asynchronous work is being performed, and that this\n                        /// event handler should not be considered complete until the promise completes.\n                        /// </summary>\n                        /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.Navigation.navigating.setPromise_p:promise\">\n                        /// The promise to wait for.\n                        /// </param>\n                        /// </signature>\n\n                        waitForPromise = waitForPromise.then(function () { return promise; });\n                    },\n                    location: history.current.location,\n                    state: history.current.state,\n                    delta: delta\n                });\n                return waitForPromise;\n            });\n    };\n    var raiseNavigated = function (value, err) {\n        _WriteProfilerMark(\"WinJS.Navigation:navigation,StopTM\");\n        var waitForPromise = Promise.as();\n        var detail = {\n            value: value,\n            location: history.current.location,\n            state: history.current.state,\n            setPromise: function (promise) {\n                /// <signature helpKeyword=\"WinJS.Navigation.navigated.setPromise\">\n                /// <summary locid=\"WinJS.Navigation.navigated.setPromise\">\n                /// Used to inform the ListView that asynchronous work is being performed, and that this\n                /// event handler should not be considered complete until the promise completes.\n                /// </summary>\n                /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.Navigation.navigated.setPromise_p:promise\">\n                /// The promise to wait for.\n                /// </param>\n                /// </signature>\n\n                waitForPromise = waitForPromise.then(function () { return promise; });\n            }\n        };\n        if (!value && err) {\n            detail.error = err;\n        }\n        listeners.dispatchEvent(navigatedEventName, detail);\n        return waitForPromise;\n    };\n\n    var go = function (distance, fromStack, toStack, delta) {\n        distance = Math.min(distance, fromStack.length);\n        if (distance > 0) {\n            return raiseBeforeNavigate(fromStack[fromStack.length - distance]).\n                then(function goBeforeCompleted(cancel) {\n                    if (!cancel) {\n                        toStack.push(history.current);\n                        while (distance - 1 > 0) {\n                            distance--;\n                            toStack.push(fromStack.pop());\n                        }\n                        history.current = fromStack.pop();\n                        return raiseNavigating(delta).then(\n                            raiseNavigated,\n                            function (err) {\n                                raiseNavigated(undefined, err || true);\n                                throw err;\n                            }).then(function () { return true; });\n                    } else {\n                        return false;\n                    }\n                });\n        }\n        return Promise.wrap(false);\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Navigation\", {\n        /// <field name=\"canGoForward\" type=\"Boolean\" locid=\"WinJS.Navigation.canGoForward\" helpKeyword=\"WinJS.Navigation.canGoForward\">\n        /// Determines whether it is possible to navigate forwards.\n        /// </field>\n        canGoForward: {\n            get: function () {\n                return history.forwardStack.length > 0;\n            }\n        },\n        /// <field name=\"canGoBack\" type=\"Boolean\" locid=\"WinJS.Navigation.canGoBack\" helpKeyword=\"WinJS.Navigation.canGoBack\">\n        /// Determines whether it is possible to navigate backwards.\n        /// </field>\n        canGoBack: {\n            get: function () {\n                return history.backStack.length > 0;\n            }\n        },\n        /// <field name=\"location\" locid=\"WinJS.Navigation.location\" helpKeyword=\"WinJS.Navigation.location\">\n        /// Gets the current location.\n        /// </field>\n        location: {\n            get: function () {\n                return history.current.location;\n            }\n        },\n        /// <field name=\"state\" locid=\"WinJS.Navigation.state\" helpKeyword=\"WinJS.Navigation.state\">\n        /// Gets or sets the navigation state.\n        /// </field>\n        state: {\n            get: function () {\n                return history.current.state;\n            },\n            set: function (value) {\n                history.current.state = value;\n            }\n        },\n        /// <field name=\"history\" locid=\"WinJS.Navigation.history\" helpKeyword=\"WinJS.Navigation.history\">\n        /// Gets or sets the navigation history.\n        /// </field>\n        history: {\n            get: function () {\n                return history;\n            },\n            set: function (value) {\n                history = value;\n\n                // ensure the require fields are present\n                //\n                history.backStack = history.backStack || [];\n                history.forwardStack = history.forwardStack || [];\n                history.current = history.current || { location: \"\", initialPlaceholder: true };\n                history.current.location = history.current.location || \"\";\n            }\n        },\n        forward: function (distance) {\n            /// <signature helpKeyword=\"WinJS.Navigation.forward\">\n            /// <summary locid=\"WinJS.Navigation.forward\">\n            /// Navigates forwards.\n            /// </summary>\n            /// <param name=\"distance\" type=\"Number\" optional=\"true\" locid=\"WinJS.Navigation.forward_p:distance\">\n            /// The number of entries to go forward.\n            /// </param>\n            /// <returns type=\"Promise\" locid=\"WinJS.Navigation.forward_returnValue\">\n            /// A promise that is completed with a value that indicates whether or not\n            /// the navigation was successful.\n            /// </returns>\n            /// </signature>\n            distance = distance || 1;\n            return go(distance, history.forwardStack, history.backStack, distance);\n        },\n        back: function (distance) {\n            /// <signature helpKeyword=\"WinJS.Navigation.back\">\n            /// <summary locid=\"WinJS.Navigation.back\">\n            /// Navigates backwards.\n            /// </summary>\n            /// <param name=\"distance\" type=\"Number\" optional=\"true\" locid=\"WinJS.Navigation.back_p:distance\">\n            /// The number of entries to go back into the history.\n            /// </param>\n            /// <returns type=\"Promise\" locid=\"WinJS.Navigation.back_returnValue\">\n            /// A promise that is completed with a value that indicates whether or not\n            /// the navigation was successful.\n            /// </returns>\n            /// </signature>\n            distance = distance || 1;\n            return go(distance, history.backStack, history.forwardStack, -distance);\n        },\n        navigate: function (location, initialState) {\n            /// <signature helpKeyword=\"WinJS.Navigation.navigate\">\n            /// <summary locid=\"WinJS.Navigation.navigate\">\n            /// Navigates to a location.\n            /// </summary>\n            /// <param name=\"location\" type=\"Object\" locid=\"WinJS.Navigation.navigate_p:location\">\n            /// The location to navigate to. Generally the location is a string, but\n            /// it may be anything.\n            /// </param>\n            /// <param name=\"initialState\" type=\"Object\" locid=\"WinJS.Navigation.navigate_p:initialState\">\n            /// The navigation state that may be accessed through WinJS.Navigation.state.\n            /// </param>\n            /// <returns type=\"Promise\" locid=\"WinJS.Navigation.navigate_returnValue\">\n            /// A promise that is completed with a value that indicates whether or not\n            /// the navigation was successful.\n            /// </returns>\n            /// </signature>\n            var proposed = { location: location, state: initialState };\n            return raiseBeforeNavigate(proposed).\n                then(function navBeforeCompleted(cancel) {\n                    if (!cancel) {\n                        if (!history.current.initialPlaceholder) {\n                            history.backStack.push(history.current);\n                        }\n                        history.forwardStack = [];\n                        history.current = proposed;\n\n                        // error or no, we go from navigating -> navigated\n                        // cancelation should be handled with \"beforenavigate\"\n                        //\n                        return raiseNavigating().then(\n                            raiseNavigated,\n                            function (err) {\n                                raiseNavigated(undefined, err || true);\n                                throw err;\n                            }).then(function () { return true; });\n                    } else {\n                        return false;\n                    }\n                });\n        },\n        addEventListener: function (eventType, listener, capture) {\n            /// <signature helpKeyword=\"WinJS.Navigation.addEventListener\">\n            /// <summary locid=\"WinJS.Navigation.addEventListener\">\n            /// Adds an event listener to the control.\n            /// </summary>\n            /// <param name=\"eventType\" type=\"String\" locid=\"WinJS.Navigation.addEventListener_p:eventType\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.Navigation.addEventListener_p:listener\">\n            /// The listener to invoke when the event gets raised.\n            /// </param>\n            /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.Navigation.addEventListener_p:capture\">\n            /// Specifies whether or not to initiate capture.\n            /// </param>\n            /// </signature>\n            listeners.addEventListener(eventType, listener, capture);\n        },\n        removeEventListener: function (eventType, listener, capture) {\n            /// <signature helpKeyword=\"WinJS.Navigation.removeEventListener\">\n            /// <summary locid=\"WinJS.Navigation.removeEventListener\">\n            /// Removes an event listener from the control.\n            /// </summary>\n            /// <param name='eventType' type=\"String\" locid=\"WinJS.Navigation.removeEventListener_p:eventType\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name='listener' type='Function' locid=\"WinJS.Navigation.removeEventListener_p:listener\">\n            /// The listener to remove.\n            /// </param>\n            /// <param name='capture' type='Boolean' locid=\"WinJS.Navigation.removeEventListener_p:capture\">\n            /// Specifies whether or not to initiate capture.\n            /// </param>\n            /// </signature>\n            listeners.removeEventListener(eventType, listener, capture);\n        },\n        /// <field type=\"Function\" locid=\"WinJS.Navigation.onnavigated\" helpKeyword=\"WinJS.Navigation.onnavigated\">\n        /// A page navigation event that occurs after onbeforenavigate and onnavigating. This event can be used to perform other actions after navigation is complete.\n        /// </field>\n        onnavigated: createEvent(navigatedEventName),\n        /// <field type=\"Function\" locid=\"WinJS.Navigation.onnavigating\" helpKeyword=\"WinJS.Navigation.onnavigating\">\n        /// A page navigation event that occurs after onbeforenavigate and before onnavigated. This event can be used to perform other actions during navigation.\n        /// </field>\n        onnavigating: createEvent(navigatingEventName),\n        /// <field type=\"Function\" locid=\"WinJS.Navigation.onbeforenavigate\" helpKeyword=\"WinJS.Navigation.onbeforenavigate\">\n        /// A page navigation event that occurs before onnavigating and onnavigated. This event can be used to cancel navigation or perform other actions prior to navigation.\n        /// </field>\n        onbeforenavigate: createEvent(beforenavigateEventName)\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Application',[\n    'exports',\n    './Core/_Global',\n    './Core/_WinRT',\n    './Core/_Base',\n    './Core/_Events',\n    './Core/_Log',\n    './Core/_WriteProfilerMark',\n    './Application/_State',\n    './Navigation',\n    './Promise',\n    './_Signal',\n    './Scheduler',\n    './Utilities/_ElementUtilities'\n], function applicationInit(exports, _Global, _WinRT, _Base, _Events, _Log, _WriteProfilerMark, _State, Navigation, Promise, _Signal, Scheduler, _ElementUtilities) {\n    \"use strict\";\n\n    _Global.Debug && (_Global.Debug.setNonUserCodeExceptions = true);\n\n    var checkpointET = \"checkpoint\",\n        unloadET = \"unload\",\n        activatedET = \"activated\",\n        loadedET = \"loaded\",\n        readyET = \"ready\",\n        errorET = \"error\",\n        settingsET = \"settings\",\n        backClickET = \"backclick\",\n        beforeRequestingFocusOnKeyboardInputET = \"beforerequestingfocusonkeyboardinput\",\n        requestingFocusOnKeyboardInputET = \"requestingfocusonkeyboardinput\",\n        edgyStartingET = \"edgystarting\",\n        edgyCompletedET = \"edgycompleted\",\n        edgyCanceledET = \"edgycanceled\";\n\n    var outstandingPromiseErrors;\n    var eventQueue = [];\n    var eventQueueJob = null;\n    var eventQueuedSignal = null;\n    var running = false;\n    var registered = false;\n\n    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /* empty */ }, { supportedForProcessing: false }), _Events.eventMixin);\n    var listeners = new ListenerType();\n    var createEvent = _Events._createEventProperty;\n    var pendingDeferrals = {};\n    var pendingDeferralID = 0;\n    var TypeToSearch = {\n        _registered: false,\n\n        updateRegistration: function Application_TypeToSearch_updateRegistration() {\n            var ls = listeners._listeners && listeners._listeners[requestingFocusOnKeyboardInputET] || [];\n            if (!TypeToSearch._registered && ls.length > 0) {\n                TypeToSearch._updateKeydownCaptureListeners(_Global.top, true /*add*/);\n                TypeToSearch._registered = true;\n            }\n            if (TypeToSearch._registered && ls.length === 0) {\n                TypeToSearch._updateKeydownCaptureListeners(_Global.top, false /*add*/);\n                TypeToSearch._registered = false;\n            }\n        },\n\n        _keydownCaptureHandler: function Application_TypeToSearch_keydownCaptureHandler(event) {\n            if (TypeToSearch._registered && TypeToSearch._shouldKeyTriggerTypeToSearch(event)) {\n                requestingFocusOnKeyboardInput();\n            }\n        },\n\n        _frameLoadCaptureHandler: function Application_TypeToSearch_frameLoadCaptureHandler(event) {\n            if (TypeToSearch._registered) {\n                TypeToSearch._updateKeydownCaptureListeners(event.target.contentWindow, true /*add*/);\n            }\n        },\n\n        _updateKeydownCaptureListeners: function Application_TypeToSearch_updateKeydownCaptureListeners(win, add) {\n            // Register for child frame keydown events in order to support FocusOnKeyboardInput\n            // when focus is in a child frame.  Also register for child frame load events so\n            // it still works after frame navigations.\n            // Note: This won't catch iframes added programmatically later, but that can be worked\n            // around by toggling FocusOnKeyboardInput off/on after the new iframe is added.\n            try {\n                if (add) {\n                    win.document.addEventListener('keydown', TypeToSearch._keydownCaptureHandler, true);\n                } else {\n                    win.document.removeEventListener('keydown', TypeToSearch._keydownCaptureHandler, true);\n                }\n            } catch (e) { // if the IFrame crosses domains, we'll get a permission denied error\n            }\n\n            if (win.frames) {\n                for (var i = 0, l = win.frames.length; i < l; i++) {\n                    var childWin = win.frames[i];\n                    TypeToSearch._updateKeydownCaptureListeners(childWin, add);\n\n                    try {\n                        if (add) {\n                            if (childWin.frameElement) {\n                                childWin.frameElement.addEventListener('load', TypeToSearch._frameLoadCaptureHandler, true);\n                            }\n                        } else {\n                            if (childWin.frameElement) {\n                                childWin.frameElement.removeEventListener('load', TypeToSearch._frameLoadCaptureHandler, true);\n                            }\n                        }\n                    } catch (e) { // if the IFrame crosses domains, we'll get a permission denied error\n                    }\n                }\n            }\n        },\n\n        _shouldKeyTriggerTypeToSearch: function Application_TypeToSearch_shouldKeyTriggerTypeToSearch(event) {\n            var shouldTrigger = false;\n            // First, check if a metaKey is pressed (only applies to MacOS). If so, do nothing here.\n            if (!event.metaKey) {\n                // We also don't handle CTRL/ALT combinations, unless ALTGR is also set. Since there is no shortcut for checking AltGR,\n                // we need to use getModifierState, however, Safari currently doesn't support this.\n                if ((!event.ctrlKey && !event.altKey) || (event.getModifierState && event.getModifierState(\"AltGraph\"))) {\n                    // Show on most keys for visible characters like letters, numbers, etc.\n                    switch (event.keyCode) {\n                        case 0x30:  //0x30 0 key\n                        case 0x31:  //0x31 1 key\n                        case 0x32:  //0x32 2 key\n                        case 0x33:  //0x33 3 key\n                        case 0x34:  //0x34 4 key\n                        case 0x35:  //0x35 5 key\n                        case 0x36:  //0x36 6 key\n                        case 0x37:  //0x37 7 key\n                        case 0x38:  //0x38 8 key\n                        case 0x39:  //0x39 9 key\n\n                        case 0x41:  //0x41 A key\n                        case 0x42:  //0x42 B key\n                        case 0x43:  //0x43 C key\n                        case 0x44:  //0x44 D key\n                        case 0x45:  //0x45 E key\n                        case 0x46:  //0x46 F key\n                        case 0x47:  //0x47 G key\n                        case 0x48:  //0x48 H key\n                        case 0x49:  //0x49 I key\n                        case 0x4A:  //0x4A J key\n                        case 0x4B:  //0x4B K key\n                        case 0x4C:  //0x4C L key\n                        case 0x4D:  //0x4D M key\n                        case 0x4E:  //0x4E N key\n                        case 0x4F:  //0x4F O key\n                        case 0x50:  //0x50 P key\n                        case 0x51:  //0x51 Q key\n                        case 0x52:  //0x52 R key\n                        case 0x53:  //0x53 S key\n                        case 0x54:  //0x54 T key\n                        case 0x55:  //0x55 U key\n                        case 0x56:  //0x56 V key\n                        case 0x57:  //0x57 W key\n                        case 0x58:  //0x58 X key\n                        case 0x59:  //0x59 Y key\n                        case 0x5A:  //0x5A Z key\n\n                        case 0x60:  // VK_NUMPAD0,             //0x60 Numeric keypad 0 key\n                        case 0x61:  // VK_NUMPAD1,             //0x61 Numeric keypad 1 key\n                        case 0x62:  // VK_NUMPAD2,             //0x62 Numeric keypad 2 key\n                        case 0x63:  // VK_NUMPAD3,             //0x63 Numeric keypad 3 key\n                        case 0x64:  // VK_NUMPAD4,             //0x64 Numeric keypad 4 key\n                        case 0x65:  // VK_NUMPAD5,             //0x65 Numeric keypad 5 key\n                        case 0x66:  // VK_NUMPAD6,             //0x66 Numeric keypad 6 key\n                        case 0x67:  // VK_NUMPAD7,             //0x67 Numeric keypad 7 key\n                        case 0x68:  // VK_NUMPAD8,             //0x68 Numeric keypad 8 key\n                        case 0x69:  // VK_NUMPAD9,             //0x69 Numeric keypad 9 key\n                        case 0x6A:  // VK_MULTIPLY,            //0x6A Multiply key\n                        case 0x6B:  // VK_ADD,                 //0x6B Add key\n                        case 0x6C:  // VK_SEPARATOR,           //0x6C Separator key\n                        case 0x6D:  // VK_SUBTRACT,            //0x6D Subtract key\n                        case 0x6E:  // VK_DECIMAL,             //0x6E Decimal key\n                        case 0x6F:  // VK_DIVIDE,              //0x6F Divide key\n\n                        case 0xBA:  // VK_OEM_1,               //0xBA Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key\n                        case 0xBB:  // VK_OEM_PLUS,            //0xBB For any country/region, the '+' key\n                        case 0xBC:  // VK_OEM_COMMA,           //0xBC For any country/region, the ',' key\n                        case 0xBD:  // VK_OEM_MINUS,           //0xBD For any country/region, the '-' key\n                        case 0xBE:  // VK_OEM_PERIOD,          //0xBE For any country/region, the '.' key\n                        case 0xBF:  // VK_OEM_2,               //0xBF Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key\n                        case 0xC0:  // VK_OEM_3,               //0xC0 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key\n\n                        case 0xDB:  // VK_OEM_4,               //0xDB Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key\n                        case 0xDC:  // VK_OEM_5,               //0xDC Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\\|' key\n                        case 0xDD:  // VK_OEM_6,               //0xDD Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key\n                        case 0xDE:  // VK_OEM_7,               //0xDE Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key\n                        case 0xDF:  // VK_OEM_8,               //0xDF Used for miscellaneous characters; it can vary by keyboard.\n\n                        case 0xE2:  // VK_OEM_102,             //0xE2 Either the angle bracket key or the backslash key on the RT 102-key keyboard\n\n                        case 0xE5:  // VK_PROCESSKEY,          //0xE5 IME PROCESS key\n\n                        case 0xE7:  // VK_PACKET,              //0xE7 Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP\n                            shouldTrigger = true;\n                            break;\n                    }\n                }\n            }\n            return shouldTrigger;\n        }\n    };\n\n    function safeSerialize(obj) {\n        var str;\n        try {\n            var seenObjects = [];\n            str = JSON.stringify(obj, function (key, value) {\n                if (value === _Global) {\n                    return \"[window]\";\n                } else if (value instanceof _Global.HTMLElement) {\n                    return \"[HTMLElement]\";\n                } else if (typeof value === \"function\") {\n                    return \"[function]\";\n                } else if (typeof value === \"object\") {\n                    if (value === null) {\n                        return value;\n                    } else if (seenObjects.indexOf(value) === -1) {\n                        seenObjects.push(value);\n                        return value;\n                    } else {\n                        return \"[circular]\";\n                    }\n                } else {\n                    return value;\n                }\n\n            });\n        }\n        catch (err) {\n            // primitives, undefined, null, etc, all get serialized fine. In the\n            // case that stringify fails (typically due to circular graphs) we\n            // just show \"[object]\". While we may be able to tighten the condition\n            // for the exception, we never way this serialize to fail.\n            //\n            // Note: we make this be a JSON string, so that consumers of the log\n            // can always call JSON.parse.\n            str = JSON.stringify(\"[object]\");\n        }\n        return str;\n    }\n\n    function fatalErrorHandler(e) {\n        _Log.log && _Log.log(safeSerialize(e), \"winjs\", \"error\");\n\n        if (_Global.document && exports._terminateApp) {\n            var data = e.detail;\n            var number = data && (data.number || (data.exception && (data.exception.number || data.exception.code)) || (data.error && data.error.number) || data.errorCode || 0);\n            var terminateData = {\n                description: safeSerialize(data),\n                // note: because of how we listen to events, we rarely get a stack\n                stack: data && (data.stack || (data.exception && (data.exception.stack || data.exception.message)) || (data.error && data.error.stack) || null),\n                errorNumber: number,\n                number: number\n            };\n            exports._terminateApp(terminateData, e);\n        }\n    }\n\n    function defaultTerminateAppHandler(data, e) {\n        /*jshint unused: false*/\n        // This is the unhandled exception handler in WinJS. This handler is invoked whenever a promise\n        // has an exception occur that is not handled (via an error handler passed to then() or a call to done()).\n        //\n        // To see the original exception stack, look at data.stack.\n        // For more information on debugging and exception handling go to https://go.microsoft.com/fwlink/p/?LinkId=253583.\n\n        debugger; // jshint ignore:line\n        if (_Global.MSApp) {\n            _Global.MSApp.terminateApp(data);\n        }\n    }\n\n    var terminateAppHandler = defaultTerminateAppHandler;\n\n    function captureDeferral(obj) {\n        var id = \"def\" + (pendingDeferralID++);\n        return { deferral: pendingDeferrals[id] = obj.getDeferral(), id: id };\n    }\n    function completeDeferral(deferral, deferralID) {\n        // If we have a deferralID we our table to find the\n        // deferral. Since we remove it on completion, this\n        // ensures that we never double notify a deferral\n        // in the case of a user call \"Application.stop\" in\n        // the middle of processing an event\n        //\n        if (deferralID) {\n            deferral = pendingDeferrals[deferralID];\n            delete pendingDeferrals[deferralID];\n        }\n        if (deferral) {\n            deferral.complete();\n        }\n    }\n    function cleanupAllPendingDeferrals() {\n        if (pendingDeferrals) {\n            Object.keys(pendingDeferrals).forEach(function (k) {\n                pendingDeferrals[k].complete();\n            });\n            pendingDeferrals = {};\n        }\n    }\n\n    function dispatchEvent(eventRecord) {\n        _WriteProfilerMark(\"WinJS.Application:Event_\" + eventRecord.type + \",StartTM\");\n\n        var waitForPromise = Promise.as();\n        eventRecord.setPromise = function (promise) {\n            /// <signature helpKeyword=\"WinJS.Application.eventRecord.setPromise\">\n            /// <summary locid=\"WinJS.Application.event.setPromise\">\n            /// Used to inform the application object that asynchronous work is being performed, and that this\n            /// event handler should not be considered complete until the promise completes.\n            /// </summary>\n            /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.Application.eventRecord.setPromise_p:promise\">\n            /// The promise to wait for.\n            /// </param>\n            /// </signature>\n            waitForPromise = waitForPromise.then(function () { return promise; });\n        };\n        eventRecord._stoppedImmediatePropagation = false;\n        eventRecord.stopImmediatePropagation = function () {\n            eventRecord._stoppedImmediatePropagation = true;\n        };\n        eventRecord.detail = eventRecord.detail || {};\n        if (typeof (eventRecord.detail) === \"object\") {\n            eventRecord.detail.setPromise = eventRecord.setPromise;\n        }\n\n        try {\n            if (listeners._listeners) {\n                var handled = false;\n                l = listeners._listeners[eventRecord.type];\n                if (l) {\n                    for (var i = 0, len = l.length; i < len && !eventRecord._stoppedImmediatePropagation; i++) {\n                        handled = l[i].listener(eventRecord) || handled;\n                    }\n                }\n            }\n\n            // Fire built in listeners last, for checkpoint this is important\n            // as it lets our built in serialization see any mutations to\n            // app.sessionState\n            //\n            var l = builtInListeners[eventRecord.type];\n            if (l) {\n                l.forEach(function dispatchOne(e) { e(eventRecord, handled); });\n            }\n        }\n        catch (err) {\n            if (eventRecord.type === errorET) {\n                fatalErrorHandler(eventRecord);\n            } else {\n                queueEvent({ type: errorET, detail: err });\n            }\n        }\n\n\n        function cleanup(r) {\n            _WriteProfilerMark(\"WinJS.Application:Event_\" + eventRecord.type + \",StopTM\");\n\n            if (eventRecord._deferral) {\n                completeDeferral(eventRecord._deferral, eventRecord._deferralID);\n            }\n            return r;\n        }\n\n        return waitForPromise.then(cleanup, function (r) {\n            r = cleanup(r);\n            if (r && r.name === \"Canceled\") {\n                return;\n            }\n            return Promise.wrapError(r);\n        });\n    }\n\n    function createEventQueuedSignal() {\n        if (!eventQueuedSignal) {\n            eventQueuedSignal = new _Signal();\n            eventQueuedSignal.promise.done(function () {\n                eventQueuedSignal = null;\n            }, function () {\n                eventQueuedSignal = null;\n            });\n        }\n        return eventQueuedSignal;\n    }\n\n    function drainOneEvent(queue) {\n        function drainError(err) {\n            queueEvent({ type: errorET, detail: err });\n        }\n\n        if (queue.length === 0) {\n            return createEventQueuedSignal().promise;\n        } else {\n            return dispatchEvent(queue.shift()).then(null, drainError);\n        }\n    }\n\n    // Drains the event queue via the scheduler\n    //\n    function drainQueue(jobInfo) {\n        function drainNext() {\n            return drainQueue;\n        }\n\n        var queue = jobInfo.job._queue;\n\n        if (queue.length === 0 && eventQueue.length > 0) {\n            queue = jobInfo.job._queue = copyAndClearQueue();\n        }\n\n        jobInfo.setPromise(drainOneEvent(queue).then(drainNext, drainNext));\n    }\n\n    function startEventQueue() {\n        function markSync() {\n            sync = true;\n        }\n\n        var queue = [];\n        var sync = true;\n        var promise;\n\n        // Drain the queue as long as there are events and they complete synchronously\n        //\n        while (sync) {\n            if (queue.length === 0 && eventQueue.length > 0) {\n                queue = copyAndClearQueue();\n            }\n\n            sync = false;\n            promise = drainOneEvent(queue);\n            promise.done(markSync, markSync);\n        }\n\n        // Schedule a job which will be responsible for draining events for the\n        //  lifetime of the application.\n        //\n        eventQueueJob = Scheduler.schedule(function Application_pumpEventQueue(jobInfo) {\n            function drainNext() {\n                return drainQueue;\n            }\n            jobInfo.setPromise(promise.then(drainNext, drainNext));\n        }, Scheduler.Priority.high, null, \"WinJS.Application._pumpEventQueue\");\n        eventQueueJob._queue = queue;\n    }\n\n    function queueEvent(eventRecord) {\n        /// <signature helpKeyword=\"WinJS.Application.queueEvent\">\n        /// <summary locid=\"WinJS.Application.queueEvent\">\n        /// Queues an event to be processed by the WinJS.Application event queue.\n        /// </summary>\n        /// <param name=\"eventRecord\" type=\"Object\" locid=\"WinJS.Application.queueEvent_p:eventRecord\">\n        /// The event object is expected to have a type property that is\n        /// used as the event name when dispatching on the WinJS.Application\n        /// event queue. The entire object is provided to event listeners\n        /// in the detail property of the event.\n        /// </param>\n        /// </signature>\n        _WriteProfilerMark(\"WinJS.Application:Event_\" + eventRecord.type + \" queued,Info\");\n        eventQueue.push(eventRecord);\n        if (running && eventQueuedSignal) {\n            eventQueuedSignal.complete(drainQueue);\n        }\n    }\n\n    function copyAndClearQueue() {\n        var queue = eventQueue;\n        eventQueue = [];\n        return queue;\n    }\n\n    var builtInListeners = {\n        activated: [\n            function Application_activatedHandler() {\n                queueEvent({ type: readyET });\n            }\n        ],\n        checkpoint: [\n            function Application_checkpointHandler(e) {\n                _State._oncheckpoint(e, exports);\n            }\n        ],\n        error: [\n            function Application_errorHandler(e, handled) {\n                if (handled) {\n                    return;\n                }\n                fatalErrorHandler(e);\n            }\n        ],\n        backclick: [\n            function Application_backClickHandler(e, handled) {\n                if (handled) {\n                    e._winRTBackPressedEvent.handled = true;\n                } else if (Navigation.canGoBack) {\n                    Navigation.back();\n                    e._winRTBackPressedEvent.handled = true;\n                }\n            }\n        ],\n        beforerequestingfocusonkeyboardinput: [\n            function Application_beforeRequestingFocusOnKeyboardInputHandler(e, handled) {\n                if (!handled) {\n                    dispatchEvent({ type: requestingFocusOnKeyboardInputET });\n                }\n            }\n        ]\n    };\n\n    // loaded == DOMContentLoaded\n    // activated == after WinRT Activated\n    // ready == after all of the above\n    //\n    function activatedHandler(e) {\n        var def = captureDeferral(e.activatedOperation);\n        _State._loadState(e).then(function () {\n            queueEvent({ type: activatedET, detail: e, _deferral: def.deferral, _deferralID: def.id });\n        });\n    }\n    function suspendingHandler(e) {\n        var def = captureDeferral(e.suspendingOperation);\n        queueEvent({ type: checkpointET, _deferral: def.deferral, _deferralID: def.id });\n    }\n    function domContentLoadedHandler() {\n        queueEvent({ type: loadedET });\n        if (!(_Global.document && _WinRT.Windows.UI.WebUI.WebUIApplication)) {\n            var activatedArgs = {\n                arguments: \"\",\n                kind: \"Windows.Launch\",\n                previousExecutionState: 0 //_WinRT.Windows.ApplicationModel.Activation.ApplicationExecutionState.NotRunning\n            };\n            _State._loadState(activatedArgs).then(function () {\n                queueEvent({ type: activatedET, detail: activatedArgs });\n            });\n        }\n    }\n    function beforeUnloadHandler() {\n        cleanupAllPendingDeferrals();\n        queueEvent({ type: unloadET });\n    }\n    function errorHandler(e) {\n        var flattenedError = {};\n        for (var key in e) {\n            flattenedError[key] = e[key];\n        }\n        var data;\n        var handled = true;\n        var prev = exports._terminateApp;\n        try {\n            exports._terminateApp = function (d, e) {\n                handled = false;\n                data = d;\n                if (prev !== defaultTerminateAppHandler) {\n                    prev(d, e);\n                }\n            };\n            dispatchEvent({\n                type: errorET,\n                detail: {\n                    error: flattenedError,\n                    errorLine: e.lineno,\n                    errorCharacter: e.colno,\n                    errorUrl: e.filename,\n                    errorMessage: e.message\n                }\n            });\n        } finally {\n            exports._terminateApp = prev;\n        }\n        return handled;\n    }\n    function promiseErrorHandler(e) {\n        //\n        // e.detail looks like: { exception, error, promise, handler, id, parent }\n        //\n        var details = e.detail;\n        var id = details.id;\n\n        // If the error has a parent promise then this is not the origination of the\n        //  error so we check if it has a handler, and if so we mark that the error\n        //  was handled by removing it from outstandingPromiseErrors\n        //\n        if (details.parent) {\n            if (details.handler && outstandingPromiseErrors) {\n                delete outstandingPromiseErrors[id];\n            }\n            return;\n        }\n\n        // Work around browsers that don't serialize exceptions\n        if (details.exception instanceof Error) {\n            var error = {\n                stack: details.exception.stack,\n                message: details.exception.message\n            };\n            details.exception = error;\n        }\n\n        // If this is the first promise error to occur in this period we need to schedule\n        //  a helper to come along after a setImmediate that propagates any remaining\n        //  errors to the application's queue.\n        //\n        var shouldScheduleErrors = !outstandingPromiseErrors;\n\n        // Indicate that this error was orignated and needs to be handled\n        //\n        outstandingPromiseErrors = outstandingPromiseErrors || [];\n        outstandingPromiseErrors[id] = details;\n\n        if (shouldScheduleErrors) {\n            Scheduler.schedule(function Application_async_promiseErrorHandler() {\n                var errors = outstandingPromiseErrors;\n                outstandingPromiseErrors = null;\n                errors.forEach(function (error) {\n                    queueEvent({ type: errorET, detail: error });\n                });\n            }, Scheduler.Priority.high, null, \"WinJS.Application._queuePromiseErrors\");\n        }\n    }\n\n    // capture this early\n    //\n    if (_Global.document) {\n        _Global.document.addEventListener(\"DOMContentLoaded\", domContentLoadedHandler, false);\n    }\n\n    function commandsRequested(e) {\n        var event = { e: e, applicationcommands: undefined };\n        listeners.dispatchEvent(settingsET, event);\n    }\n\n    function hardwareButtonBackPressed(winRTBackPressedEvent) {\n        // Fire WinJS.Application 'backclick' event. If the winRTBackPressedEvent is not handled, the app will get suspended.\n        var eventRecord = { type: backClickET };\n        Object.defineProperty(eventRecord, \"_winRTBackPressedEvent\", {\n            value: winRTBackPressedEvent,\n            enumerable: false\n        });\n        dispatchEvent(eventRecord);\n    }\n\n    function requestingFocusOnKeyboardInput() {\n        // Built in listener for beforeRequestingFocusOnKeyboardInputET will trigger\n        // requestingFocusOnKeyboardInputET if it wasn't handled.\n        dispatchEvent({ type: beforeRequestingFocusOnKeyboardInputET });\n    }\n\n    function edgyStarting(eventObject) {\n        dispatchEvent({ type: edgyStartingET, kind: eventObject.kind });\n    }\n\n    function edgyCompleted(eventObject) {\n        dispatchEvent({ type: edgyCompletedET, kind: eventObject.kind });\n    }\n\n    function edgyCanceled(eventObject) {\n        dispatchEvent({ type: edgyCanceledET, kind: eventObject.kind });\n    }\n\n    function register() {\n        if (!registered) {\n            registered = true;\n            _Global.addEventListener(\"beforeunload\", beforeUnloadHandler, false);\n\n            // None of these are enabled in web worker\n            if (_Global.document) {\n                _Global.addEventListener(\"error\", errorHandler, false);\n                if (_WinRT.Windows.UI.WebUI.WebUIApplication) {\n\n                    var wui = _WinRT.Windows.UI.WebUI.WebUIApplication;\n                    wui.addEventListener(\"activated\", activatedHandler, false);\n                    wui.addEventListener(\"suspending\", suspendingHandler, false);\n                }\n\n                if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {\n                    var settingsPane = _WinRT.Windows.UI.ApplicationSettings.SettingsPane.getForCurrentView();\n                    settingsPane.addEventListener(\"commandsrequested\", commandsRequested);\n                }\n\n                // Code in WinJS.Application for phone. This integrates WinJS.Application into the hardware back button.\n                if (_WinRT.Windows.Phone.UI.Input.HardwareButtons) {\n                    _WinRT.Windows.Phone.UI.Input.HardwareButtons.addEventListener(\"backpressed\", hardwareButtonBackPressed);\n                }\n\n                if (_WinRT.Windows.UI.Input.EdgeGesture) {\n                    var edgy = _WinRT.Windows.UI.Input.EdgeGesture.getForCurrentView();\n                    edgy.addEventListener(\"starting\", edgyStarting);\n                    edgy.addEventListener(\"completed\", edgyCompleted);\n                    edgy.addEventListener(\"canceled\", edgyCanceled);\n                }\n            }\n\n            Promise.addEventListener(\"error\", promiseErrorHandler);\n        }\n    }\n    function unregister() {\n        if (registered) {\n            registered = false;\n            _Global.removeEventListener(\"beforeunload\", beforeUnloadHandler, false);\n\n            // None of these are enabled in web worker\n            if (_Global.document) {\n                if (_WinRT.Windows.UI.WebUI.WebUIApplication) {\n                    _Global.removeEventListener(\"error\", errorHandler, false);\n\n                    var wui = _WinRT.Windows.UI.WebUI.WebUIApplication;\n                    wui.removeEventListener(\"activated\", activatedHandler, false);\n                    wui.removeEventListener(\"suspending\", suspendingHandler, false);\n                }\n\n                if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {\n                    var settingsPane = _WinRT.Windows.UI.ApplicationSettings.SettingsPane.getForCurrentView();\n                    settingsPane.removeEventListener(\"commandsrequested\", commandsRequested);\n                }\n\n                // Code in WinJS.Application for phone. This integrates WinJS.Application into the hardware back button.\n                if (_WinRT.Windows.Phone.UI.Input.HardwareButtons) {\n                    _WinRT.Windows.Phone.UI.Input.HardwareButtons.removeEventListener(\"backpressed\", hardwareButtonBackPressed);\n                }\n\n                if (_WinRT.Windows.UI.Input.EdgeGesture) {\n                    var edgy = _WinRT.Windows.UI.Input.EdgeGesture.getForCurrentView();\n                    edgy.removeEventListener(\"starting\", edgyStarting);\n                    edgy.removeEventListener(\"completed\", edgyCompleted);\n                    edgy.removeEventListener(\"canceled\", edgyCanceled);\n                }\n            }\n\n            Promise.removeEventListener(\"error\", promiseErrorHandler);\n        }\n    }\n\n    var publicNS = _Base.Namespace._moduleDefine(exports, \"WinJS.Application\", {\n        stop: function Application_stop() {\n            /// <signature helpKeyword=\"WinJS.Application.stop\">\n            /// <summary locid=\"WinJS.Application.stop\">\n            /// Stops application event processing and resets WinJS.Application\n            /// to its initial state.\n            /// </summary>\n            /// </signature>\n\n            // Need to clear out the event properties explicitly to clear their backing\n            //  state.\n            //\n            publicNS.onactivated = null;\n            publicNS.oncheckpoint = null;\n            publicNS.onerror = null;\n            publicNS.onloaded = null;\n            publicNS.onready = null;\n            publicNS.onsettings = null;\n            publicNS.onunload = null;\n            publicNS.onbackclick = null;\n            listeners = new ListenerType();\n            _State.sessionState = {};\n            running = false;\n            copyAndClearQueue();\n            eventQueueJob && eventQueueJob.cancel();\n            eventQueueJob = null;\n            eventQueuedSignal = null;\n            unregister();\n            TypeToSearch.updateRegistration();\n            cleanupAllPendingDeferrals();\n        },\n\n        addEventListener: function Application_addEventListener(eventType, listener, capture) {\n            /// <signature helpKeyword=\"WinJS.Application.addEventListener\">\n            /// <summary locid=\"WinJS.Application.addEventListener\">\n            /// Adds an event listener to the control.\n            /// </summary>\n            /// <param name=\"eventType\" locid=\"WinJS.Application.addEventListener_p:eventType\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name=\"listener\" locid=\"WinJS.Application.addEventListener_p:listener\">\n            /// The listener to invoke when the event is raised.\n            /// </param>\n            /// <param name=\"capture\" locid=\"WinJS.Application.addEventListener_p:capture\">\n            /// true to initiate capture; otherwise, false.\n            /// </param>\n            /// </signature>\n            listeners.addEventListener(eventType, listener, capture);\n            if (eventType === requestingFocusOnKeyboardInputET) {\n                TypeToSearch.updateRegistration();\n            }\n        },\n        removeEventListener: function Application_removeEventListener(eventType, listener, capture) {\n            /// <signature helpKeyword=\"WinJS.Application.removeEventListener\">\n            /// <summary locid=\"WinJS.Application.removeEventListener\">\n            /// Removes an event listener from the control.\n            /// </summary>\n            /// <param name=\"eventType\" locid=\"WinJS.Application.removeEventListener_p:eventType\">\n            /// The type (name) of the event.\n            /// </param>\n            /// <param name=\"listener\" locid=\"WinJS.Application.removeEventListener_p:listener\">\n            /// The listener to remove.\n            /// </param>\n            /// <param name=\"capture\" locid=\"WinJS.Application.removeEventListener_p:capture\">\n            /// Specifies whether or not to initiate capture.\n            /// </param>\n            /// </signature>\n            listeners.removeEventListener(eventType, listener, capture);\n            if (eventType === requestingFocusOnKeyboardInputET) {\n                TypeToSearch.updateRegistration();\n            }\n        },\n\n        checkpoint: function Application_checkpoint() {\n            /// <signature helpKeyword=\"WinJS.Application.checkpoint\">\n            /// <summary locid=\"WinJS.Application.checkpoint\">\n            /// Queues a checkpoint event.\n            /// </summary>\n            /// </signature>\n            queueEvent({ type: checkpointET });\n        },\n\n        start: function Application_start() {\n            /// <signature helpKeyword=\"WinJS.Application.start\">\n            /// <summary locid=\"WinJS.Application.start\">\n            /// Starts processing events in the WinJS.Application event queue.\n            /// </summary>\n            /// </signature>\n            register();\n            running = true;\n            startEventQueue();\n        },\n\n        queueEvent: queueEvent,\n\n        // Like queueEvent but fires the event synchronously. Useful in tests.\n        _dispatchEvent: dispatchEvent,\n\n        _terminateApp: {\n            get: function Application_terminateApp_get() {\n                return terminateAppHandler;\n            },\n            set: function Application_terminateApp_set(value) {\n                terminateAppHandler = value;\n            }\n        },\n\n        _applicationListener: _Base.Namespace._lazy(function () {\n            // Use _lazy because publicNS can't be referenced in its own definition\n            return new _ElementUtilities._GenericListener(\"Application\", publicNS);\n        }),\n\n        /// <field type=\"Function\" locid=\"WinJS.Application.oncheckpoint\" helpKeyword=\"WinJS.Application.oncheckpoint\">\n        /// Occurs when receiving Process Lifetime Management (PLM) notification or when the checkpoint function is called.\n        /// </field>\n        oncheckpoint: createEvent(checkpointET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onunload\" helpKeyword=\"WinJS.Application.onunload\">\n        /// Occurs when the application is about to be unloaded.\n        /// </field>\n        onunload: createEvent(unloadET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onactivated\" helpKeyword=\"WinJS.Application.onactivated\">\n        /// Occurs when Windows Runtime activation has occurred.\n        /// The name of this event is \"activated\" (and also \"mainwindowactivated\".)\n        /// This event occurs after the loaded event and before the ready event.\n        /// </field>\n        onactivated: createEvent(activatedET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onloaded\" helpKeyword=\"WinJS.Application.onloaded\">\n        /// Occurs after the DOMContentLoaded event, which fires after the page has been parsed but before all the resources are loaded.\n        /// This event occurs before the activated event and the ready event.\n        /// </field>\n        onloaded: createEvent(loadedET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onready\" helpKeyword=\"WinJS.Application.onready\">\n        /// Occurs when the application is ready. This event occurs after the onloaded event and the onactivated event.\n        /// </field>\n        onready: createEvent(readyET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onsettings\" helpKeyword=\"WinJS.Application.onsettings\">\n        /// Occurs when the settings charm is invoked.\n        /// </field>\n        onsettings: createEvent(settingsET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onerror\" helpKeyword=\"WinJS.Application.onerror\">\n        /// Occurs when an unhandled error has been raised.\n        /// </field>\n        onerror: createEvent(errorET),\n        /// <field type=\"Function\" locid=\"WinJS.Application.onbackclick\" helpKeyword=\"WinJS.Application.onbackclick\">\n        /// Raised when the users clicks the backbutton on a Windows Phone.\n        /// </field>\n        onbackclick: createEvent(backClickET)\n\n\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Animations/_Constants',[\n    'exports',\n    '../Core/_Base'\n    ], function animationsConstantsInit(exports, _Base) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field locid=\"WinJS.UI.PageNavigationAnimation\" helpKeyword=\"WinJS.UI.PageNavigationAnimation\">\n        /// Specifies what animation type should be returned by WinJS.UI.Animation.createPageNavigationAnimations.\n        /// </field>\n        PageNavigationAnimation: {\n            /// <field locid=\"WinJS.UI.PageNavigationAnimation.turnstile\" helpKeyword=\"WinJS.UI.PageNavigationAnimation.turnstile\">\n            /// The pages will exit and enter using a turnstile animation.\n            /// </field>\n            turnstile: \"turnstile\",\n            /// <field locid=\"WinJS.UI.PageNavigationAnimation.slide\" helpKeyword=\"WinJS.UI.PageNavigationAnimation.slide\">\n            /// The pages will exit and enter using an animation that slides up/down.\n            /// </field>\n            slide: \"slide\",\n            /// <field locid=\"WinJS.UI.PageNavigationAnimation.enterPage\" helpKeyword=\"WinJS.UI.PageNavigationAnimation.enterPage\">\n            /// The pages will enter using an enterPage animation, and exit with no animation.\n            /// </field>\n            enterPage: \"enterPage\",\n            /// <field locid=\"WinJS.UI.PageNavigationAnimation.continuum\" helpKeyword=\"WinJS.UI.PageNavigationAnimation.continuum\">\n            /// The pages will exit and enter using a continuum animation.\n            /// </field>\n            continuum: \"continuum\"\n        }\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Animations/_TransitionAnimation',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Promise',\n    '../Scheduler',\n    '../Utilities/_ElementUtilities'\n    ], function transitionAnimationInit(exports, _Global, _WinRT, _Base, _BaseUtils, Promise, Scheduler, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var browserStyleEquivalents = _BaseUtils._browserStyleEquivalents;\n\n    function makeArray(elements) {\n        if (Array.isArray(elements) || elements instanceof _Global.NodeList || elements instanceof _Global.HTMLCollection) {\n            return elements;\n        } else if (elements) {\n            return [elements];\n        } else {\n            return [];\n        }\n    }\n\n    var keyframeCounter = 0;\n    function getUniqueKeyframeName() {\n        ++keyframeCounter;\n        return \"WinJSUIAnimation\" + keyframeCounter;\n    }\n    function isUniqueKeyframeName(s) {\n        return \"WinJSUIAnimation\" === s.substring(0, 16);\n    }\n\n    function resolveStyles(elem) {\n        _Global.getComputedStyle(elem, null).opacity;\n    }\n\n    function copyWithEvaluation(iElem, elem) {\n        return function (obj) {\n            var newObj = {};\n            for (var p in obj) {\n                var v = obj[p];\n                if (typeof v === \"function\") {\n                    v = v(iElem, elem);\n                }\n                newObj[p] = v;\n            }\n            if (!newObj.exactTiming) {\n                newObj.delay += exports._libraryDelay;\n            }\n            return newObj;\n        };\n    }\n\n    var activeActions = [];\n\n    var reason_interrupted = 1;\n    var reason_canceled = 2;\n\n    function stopExistingAction(id, prop) {\n        var key = id + \"|\" + prop;\n        var finish = activeActions[key];\n        if (finish) {\n            finish(reason_interrupted);\n        }\n    }\n\n    function registerAction(id, prop, finish) {\n        activeActions[id + \"|\" + prop] = finish;\n    }\n\n    function unregisterAction(id, prop) {\n        delete activeActions[id + \"|\" + prop];\n    }\n\n    var StyleCache = _Base.Class.define(\n        // Constructor\n        function StyleCache_ctor(id, desc, style) {\n            this.cref = 0;\n            this.id = id;\n            this.desc = desc;\n            this.removed = {};\n            this.prevStyles = desc.props.map(function (p) { return style[p[0]]; });\n            this.prevNames = this.names = style[desc.nameProp];\n            desc.styleCaches[id] = this;\n        }, {\n            // Members\n            destroy: function StyleCache_destroy(style, skipStylesReset) {\n                var desc = this.desc;\n                delete desc.styleCaches[this.id];\n                if (!skipStylesReset) {\n                    if (this.prevNames === \"\" &&\n                        this.prevStyles.every(function (s) { return s === \"\"; })) {\n                        style[desc.shorthandProp] = \"\";\n                    } else {\n                        desc.props.forEach(function (p, i) {\n                            style[p[0]] = this.prevStyles[i];\n                        }, this);\n                        style[desc.nameProp] = this.prevNames;\n                    }\n                }\n            },\n            removeName: function StyleCache_removeName(style, name, elem, skipStylesReset) {\n                var nameValue = this.names;\n                var names = nameValue.split(\", \");\n                var index = names.lastIndexOf(name);\n                if (index >= 0) {\n                    names.splice(index, 1);\n                    this.names = nameValue = names.join(\", \");\n                    if (nameValue === \"\" && this.desc.isTransition) {\n                        nameValue = \"none\";\n                    }\n                }\n                if (--this.cref) {\n                    style[this.desc.nameProp] = nameValue;\n                    if (!isUniqueKeyframeName(name)) {\n                        this.removed[name] = true;\n                    }\n                } else {\n                    if (elem && nameValue === \"none\") {\n                        style[this.desc.nameProp] = nameValue;\n                        resolveStyles(elem);\n                    }\n                    this.destroy(style, skipStylesReset);\n                }\n            }\n        });\n\n    function setTemporaryStyles(elem, id, style, actions, desc) {\n        var styleCache = desc.styleCaches[id] ||\n                         new StyleCache(id, desc, style);\n        styleCache.cref += actions.length;\n\n        actions.forEach(function (action) {\n            stopExistingAction(id, action.property);\n        });\n\n        if (desc.isTransition ||\n            actions.some(function (action) {\n                return styleCache.removed[action[desc.nameField]];\n        })) {\n            resolveStyles(elem);\n            styleCache.removed = {};\n        }\n\n        var newShorthand = actions.map(function (action) {\n            return action[desc.nameField] + \" \" +\n                desc.props.map(function (p) {\n                    return (p[1] ? action[p[1]] : \"\") + p[2];\n                }).join(\" \");\n        }).join(\", \");\n\n        var newNames = actions.map(function (action) {\n            return action[desc.nameField];\n        }).join(\", \");\n        if (styleCache.names !== \"\") {\n            newShorthand = styleCache.names + \", \" + newShorthand;\n            newNames = styleCache.names + \", \" + newNames;\n        }\n\n        style[desc.shorthandProp] = newShorthand;\n        styleCache.names = newNames;\n        return styleCache;\n    }\n\n    var elementTransitionProperties = {\n        shorthandProp: browserStyleEquivalents[\"transition\"].scriptName,\n        nameProp: browserStyleEquivalents[\"transition-property\"].scriptName,\n        nameField: \"property\",\n        props: [\n            [browserStyleEquivalents[\"transition-duration\"].scriptName, \"duration\", \"ms\"],\n            [browserStyleEquivalents[\"transition-timing-function\"].scriptName, \"timing\", \"\"],\n            [browserStyleEquivalents[\"transition-delay\"].scriptName, \"delay\", \"ms\"]\n        ],\n        isTransition: true,\n        styleCaches: []\n    };\n\n    function completePromise(c, synchronous) {\n        if (synchronous) {\n            c();\n        } else {\n            Scheduler.schedule(function _Animation_completeAnimationPromise() {\n                c();\n            }, Scheduler.Priority.normal, null, \"WinJS.UI._Animation._completeAnimationPromise\");\n        }\n    }\n\n    var uniformizeStyle;\n    function executeElementTransition(elem, index, transitions, promises, animate) {\n        if (transitions.length > 0) {\n            var style = elem.style;\n            var id = _ElementUtilities._uniqueID(elem);\n            if (!uniformizeStyle) {\n                uniformizeStyle = _Global.document.createElement(\"DIV\").style;\n            }\n            transitions = transitions.map(copyWithEvaluation(index, elem));\n            transitions.forEach(function (transition) {\n                var scriptNameOfProperty = _BaseUtils._getCamelCasedName(transition.property);\n                if (transition.hasOwnProperty(\"from\")) {\n                    style[scriptNameOfProperty] = transition.from;\n                }\n                uniformizeStyle[scriptNameOfProperty] = transition.to;\n                transition.to = uniformizeStyle[scriptNameOfProperty];\n                transition.propertyScriptName = scriptNameOfProperty;\n            });\n\n            if (animate) {\n                var styleCache = setTemporaryStyles(elem, id, style, transitions, elementTransitionProperties);\n                var listener = elem.disabled ? _Global.document : elem;\n\n                transitions.forEach(function (transition) {\n                    var finish;\n                    promises.push(new Promise(function (c) {\n                        finish = function (reason) {\n                            if (onTransitionEnd) {\n                                listener.removeEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], onTransitionEnd, false);\n                                unregisterAction(id, transition.property);\n                                styleCache.removeName(style, transition.propertyScriptName, reason ? elem : null, transition.skipStylesReset);\n                                _Global.clearTimeout(timeoutId);\n                                onTransitionEnd = null;\n                            }\n                            completePromise(c, reason === reason_canceled);\n                        };\n\n                        var onTransitionEnd = function (event) {\n                            if (event.target === elem && event.propertyName === transition.property) {\n                                finish();\n                            }\n                        };\n\n                        registerAction(id, transition.property, finish);\n                        listener.addEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], onTransitionEnd, false);\n\n                        var padding = 0;\n                        if (style[transition.propertyScriptName] !== transition.to) {\n                            style[transition.propertyScriptName] = transition.to;\n                            padding = 50;\n                        }\n                        var timeoutId = _Global.setTimeout(function () {\n                            timeoutId = _Global.setTimeout(finish, transition.delay + transition.duration);\n                        }, padding);\n                    }, function () { finish(reason_canceled); }));\n                });\n            } else {\n                transitions.forEach(function (transition) {\n                    style[transition.propertyScriptName] = transition.to;\n                });\n            }\n        }\n    }\n\n    var elementAnimationProperties = {\n        shorthandProp: browserStyleEquivalents[\"animation\"].scriptName,\n        nameProp: browserStyleEquivalents[\"animation-name\"].scriptName,\n        nameField: \"keyframe\",\n        props: [\n            [browserStyleEquivalents[\"animation-duration\"].scriptName, \"duration\", \"ms\"],\n            [browserStyleEquivalents[\"animation-timing-function\"].scriptName, \"timing\", \"\"],\n            [browserStyleEquivalents[\"animation-delay\"].scriptName, \"delay\", \"ms\"],\n            [browserStyleEquivalents[\"animation-iteration-count\"].scriptName, \"\", \"1\"],\n            [browserStyleEquivalents[\"animation-direction\"].scriptName, \"\", \"normal\"],\n            [browserStyleEquivalents[\"animation-fill-mode\"].scriptName, \"\", \"both\"]\n        ],\n        isTransition: false,\n        styleCaches: []\n    };\n\n    function executeElementAnimation(elem, index, anims, promises, animate) {\n        if (animate && anims.length > 0) {\n            var style = elem.style;\n            var id = _ElementUtilities._uniqueID(elem);\n            anims = anims.map(copyWithEvaluation(index, elem));\n            var styleElem;\n            var listener = elem.disabled ? _Global.document : elem;\n            anims.forEach(function (anim) {\n                if (!anim.keyframe) {\n                    if (!styleElem) {\n                        styleElem = _Global.document.createElement(\"STYLE\");\n                        _Global.document.documentElement.appendChild(styleElem);\n                    }\n                    anim.keyframe = getUniqueKeyframeName();\n                    var kf = \"@\" + browserStyleEquivalents[\"keyframes\"] + \" \" + anim.keyframe + \" { from {\" + anim.property + \":\" + anim.from + \";} to {\" + anim.property + \":\" + anim.to + \";}}\";\n                    styleElem.sheet.insertRule(kf, 0);\n                } else {\n                    anim.keyframe = browserStyleEquivalents.animationPrefix + anim.keyframe;\n                }\n            });\n            var styleCache = setTemporaryStyles(elem, id, style, anims, elementAnimationProperties),\n                animationsToCleanUp = [],\n                animationPromises = [];\n            anims.forEach(function (anim) {\n                var finish;\n                animationPromises.push(new Promise(function (c) {\n                    finish = function (reason) {\n                        if (onAnimationEnd) {\n                            listener.removeEventListener(_BaseUtils._browserEventEquivalents[\"animationEnd\"], onAnimationEnd, false);\n                            _Global.clearTimeout(timeoutId);\n                            onAnimationEnd = null;\n                        }\n                        completePromise(c, reason === reason_canceled);\n                    };\n\n                    var onAnimationEnd = function (event) {\n                        if (event.target === elem && event.animationName === anim.keyframe) {\n                            finish();\n                        }\n                    };\n\n                    registerAction(id, anim.property, finish);\n                    // Firefox will stop all animations if we clean up that animation's properties when there're other CSS animations still running\n                    // on an element. To work around this, we delay animation style cleanup until all parts of an animation finish.\n                    animationsToCleanUp.push({\n                        id: id,\n                        property: anim.property,\n                        style: style,\n                        keyframe: anim.keyframe\n                    });\n                    var timeoutId = _Global.setTimeout(function () {\n                        timeoutId = _Global.setTimeout(finish, anim.delay + anim.duration);\n                    }, 50);\n                    listener.addEventListener(_BaseUtils._browserEventEquivalents[\"animationEnd\"], onAnimationEnd, false);\n                }, function () { finish(reason_canceled); }));\n            });\n            if (styleElem) {\n                _Global.setTimeout(function () {\n                    var parentElement = styleElem.parentElement;\n                    if (parentElement) {\n                        parentElement.removeChild(styleElem);\n                    }\n                }, 50);\n            }\n\n            var cleanupAnimations = function () {\n                for (var i = 0; i < animationsToCleanUp.length; i++) {\n                    var anim = animationsToCleanUp[i];\n                    unregisterAction(anim.id, anim.property);\n                    styleCache.removeName(anim.style, anim.keyframe);\n                }\n            };\n            promises.push(Promise.join(animationPromises).then(cleanupAnimations, cleanupAnimations));\n        }\n    }\n\n    var enableCount = 0;\n    var animationSettings;\n    function initAnimations() {\n        if (!animationSettings) {\n            if (_WinRT.Windows.UI.ViewManagement.UISettings) {\n                animationSettings = new _WinRT.Windows.UI.ViewManagement.UISettings();\n            } else {\n                animationSettings = { animationsEnabled: true };\n            }\n        }\n    }\n\n    var isAnimationEnabled = function isAnimationEnabledImpl() {\n        /// <signature helpKeyword=\"WinJS.UI.isAnimationEnabled\">\n        /// <summary locid=\"WinJS.UI.isAnimationEnabled\">\n        /// Determines whether the WinJS Animation Library will perform animations.\n        /// </summary>\n        /// <returns type=\"Boolean\" locid=\"WinJS.UI.isAnimationEnabled_returnValue\">\n        /// true if WinJS animations will be performed.\n        /// false if WinJS animations are suppressed.\n        /// </returns>\n        /// </signature>\n        initAnimations();\n        return enableCount + animationSettings.animationsEnabled > 0;\n    };\n\n    function applyAction(element, action, execAction) {\n        try {\n            var animate = exports.isAnimationEnabled();\n            var elems = makeArray(element);\n            var actions = makeArray(action);\n\n            var promises = [];\n\n            for (var i = 0; i < elems.length; i++) {\n                if (Array.isArray(elems[i])) {\n                    for (var j = 0; j < elems[i].length; j++) {\n                        execAction(elems[i][j], i, actions, promises, animate);\n                    }\n                } else {\n                    execAction(elems[i], i, actions, promises, animate);\n                }\n            }\n\n            if (promises.length) {\n                return Promise.join(promises);\n            } else {\n                return Scheduler.schedulePromiseNormal(null, \"WinJS.UI._Animation._completeActionPromise\").then(null, function () {\n                    // Convert a cancelation to the success path\n                });\n            }\n        } catch (e) {\n            return Promise.wrapError(e);\n        }\n    }\n\n    function adjustAnimationTime(animation) {\n        if (Array.isArray(animation)) {\n            return animation.map(function (animation) {\n                return adjustAnimationTime(animation);\n            });\n        } else if (animation) {\n            animation.delay = animationTimeAdjustment(animation.delay);\n            animation.duration = animationTimeAdjustment(animation.duration);\n            return animation;\n        } else {\n            return;\n        }\n    }\n\n    function animationAdjustment(animation) {\n        if (animationFactor === 1) {\n            return animation;\n        } else {\n            return adjustAnimationTime(animation);\n        }\n    }\n\n    var animationTimeAdjustment = function _animationTimeAdjustmentImpl(v) {\n        return v * animationFactor;\n    };\n\n    var animationFactor = 1;\n    var libraryDelay = 0;\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        disableAnimations: function () {\n            /// <signature helpKeyword=\"WinJS.UI.disableAnimations\">\n            /// <summary locid=\"WinJS.UI.disableAnimations\">\n            /// Disables animations in the WinJS Animation Library\n            /// by decrementing the animation enable count.\n            /// </summary>\n            /// </signature>\n            enableCount--;\n        },\n\n        enableAnimations: function () {\n            /// <signature helpKeyword=\"WinJS.UI.enableAnimations\">\n            /// <summary locid=\"WinJS.UI.enableAnimations\">\n            /// Enables animations in the WinJS Animation Library\n            /// by incrementing the animation enable count.\n            /// </summary>\n            /// </signature>\n            enableCount++;\n        },\n\n        isAnimationEnabled: {\n            get: function () {\n                return isAnimationEnabled;\n            },\n            set: function (value) {\n                isAnimationEnabled = value;\n            }\n        },\n\n        _libraryDelay: {\n            get: function () {\n                return libraryDelay;\n            },\n            set: function (value) {\n                libraryDelay = value;\n            }\n        },\n\n        executeAnimation: function (element, animation) {\n            /// <signature helpKeyword=\"WinJS.UI.executeAnimation\">\n            /// <summary locid=\"WinJS.UI.executeAnimation\">\n            /// Perform a CSS animation that can coexist with other\n            /// Animation Library animations. Applications are not expected\n            /// to call this function directly; they should prefer to use\n            /// the high-level animations in the Animation Library.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.executeAnimation_p:element\">\n            /// Single element or collection of elements on which\n            /// to perform a CSS animation.\n            /// </param>\n            /// <param name=\"animation\" locid=\"WinJS.UI.executeAnimation_p:animation\">\n            /// Single animation description or array of animation descriptions.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.executeAnimation_returnValue\">\n            /// Promise object that completes when the CSS animation is complete.\n            /// </returns>\n            /// </signature>\n            return applyAction(element, animationAdjustment(animation), executeElementAnimation);\n        },\n\n        executeTransition: function (element, transition) {\n            /// <signature helpKeyword=\"WinJS.UI.executeTransition\">\n            /// <summary locid=\"WinJS.UI.executeTransition\">\n            /// Perform a CSS transition that can coexist with other\n            /// Animation Library animations. Applications are not expected\n            /// to call this function directly; they should prefer to use\n            /// the high-level animations in the Animation Library.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.executeTransition_p:element\">\n            /// Single element or collection of elements on which\n            /// to perform a CSS transition.\n            /// </param>\n            /// <param name=\"transition\" locid=\"WinJS.UI.executeTransition_p:transition\">\n            /// Single transition description or array of transition descriptions.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.executeTransition_returnValue\">\n            /// Promise object that completes when the CSS transition is complete.\n            /// </returns>\n            /// </signature>\n            return applyAction(element, animationAdjustment(transition), executeElementTransition);\n        },\n\n        _animationTimeAdjustment: {\n            get: function () {\n                return animationTimeAdjustment;\n            },\n            set: function (value) {\n                animationTimeAdjustment = value;\n            }\n        }\n\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n        _fastAnimations: {\n            get: function () {\n                return animationFactor === 1/20;\n            },\n            set: function (value) {\n                animationFactor = value ? 1/20 : 1;\n            }\n        },\n        _slowAnimations: {\n            get: function () {\n                return animationFactor === 3;\n            },\n            set: function (value) {\n                animationFactor = value ? 3 : 1;\n            }\n        },\n        _animationFactor: {\n            get: function () {\n                return animationFactor;\n            },\n            set: function (value) {\n                animationFactor = value;\n            }\n        },\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Animations',[\n    'exports',\n    './Core/_Global',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './Core/_WriteProfilerMark',\n    './Animations/_Constants',\n    './Animations/_TransitionAnimation',\n    './Promise'\n], function animationsInit(exports, _Global, _Base, _BaseUtils, _WriteProfilerMark, _Constants, _TransitionAnimation, Promise) {\n    \"use strict\";\n\n    var transformNames = _BaseUtils._browserStyleEquivalents[\"transform\"];\n\n    // Default to 11 pixel from the left (or right if RTL)\n    var defaultOffset = [{ top: \"0px\", left: \"11px\", rtlflip: true }];\n\n    var OffsetArray = _Base.Class.define(function OffsetArray_ctor(offset, keyframe, defOffset) {\n        // Constructor\n        defOffset = defOffset || defaultOffset;\n        if (Array.isArray(offset) && offset.length > 0) {\n            this.offsetArray = offset;\n            if (offset.length === 1) {\n                this.keyframe = checkKeyframe(offset[0], defOffset[0], keyframe);\n            }\n        } else if (offset && offset.hasOwnProperty(\"top\") && offset.hasOwnProperty(\"left\")) {\n            this.offsetArray = [offset];\n            this.keyframe = checkKeyframe(offset, defOffset[0], keyframe);\n        } else {\n            this.offsetArray = defOffset;\n            this.keyframe = chooseKeyframe(defOffset[0], keyframe);\n        }\n    }, { // Public Members\n        getOffset: function (i) {\n            if (i >= this.offsetArray.length) {\n                i = this.offsetArray.length - 1;\n            }\n            return this.offsetArray[i];\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    function checkKeyframe(offset, defOffset, keyframe) {\n        if (offset.keyframe) {\n            return offset.keyframe;\n        }\n\n        if (!keyframe ||\n            offset.left !== defOffset.left ||\n            offset.top !== defOffset.top ||\n            (offset.rtlflip && !defOffset.rtlflip)) {\n            return null;\n        }\n\n        if (!offset.rtlflip) {\n            return keyframe;\n        }\n\n        return keyframeCallback(keyframe);\n    }\n\n    function chooseKeyframe(defOffset, keyframe) {\n        if (!keyframe || !defOffset.rtlflip) {\n            return keyframe;\n        }\n\n        return keyframeCallback(keyframe);\n    }\n\n    function keyframeCallback(keyframe) {\n        var keyframeRtl = keyframe + \"-rtl\";\n        return function (i, elem) {\n            return _Global.getComputedStyle(elem).direction === \"ltr\" ? keyframe : keyframeRtl;\n        };\n    }\n\n    function makeArray(elements) {\n        if (Array.isArray(elements) || elements instanceof _Global.NodeList || elements instanceof _Global.HTMLCollection) {\n            return elements;\n        } else if (elements) {\n            return [elements];\n        } else {\n            return [];\n        }\n    }\n\n    function collectOffsetArray(elemArray) {\n        var offsetArray = [];\n        for (var i = 0; i < elemArray.length; i++) {\n            var offset = {\n                top: elemArray[i].offsetTop,\n                left: elemArray[i].offsetLeft\n            };\n            var matrix = _Global.getComputedStyle(elemArray[i], null)[transformNames.scriptName].split(\",\");\n            if (matrix.length === 6) {\n                offset.left += parseFloat(matrix[4]);\n                offset.top += parseFloat(matrix[5]);\n            }\n            offsetArray.push(offset);\n        }\n        return offsetArray;\n    }\n\n    function staggerDelay(initialDelay, extraDelay, delayFactor, delayCap) {\n        return function (i) {\n            var ret = initialDelay;\n            for (var j = 0; j < i; j++) {\n                extraDelay *= delayFactor;\n                ret += extraDelay;\n            }\n            if (delayCap) {\n                ret = Math.min(ret, delayCap);\n            }\n            return ret;\n        };\n    }\n\n    function makeOffsetsRelative(elemArray, offsetArray) {\n        for (var i = 0; i < offsetArray.length; i++) {\n            offsetArray[i].top -= elemArray[i].offsetTop;\n            offsetArray[i].left -= elemArray[i].offsetLeft;\n        }\n    }\n\n    function animTranslate2DTransform(elemArray, offsetArray, transition) {\n        makeOffsetsRelative(elemArray, offsetArray);\n        for (var i = 0; i < elemArray.length; i++) {\n            if (offsetArray[i].top !== 0 || offsetArray[i].left !== 0) {\n                elemArray[i].style[transformNames.scriptName] = \"translate(\" + offsetArray[i].left + \"px, \" + offsetArray[i].top + \"px)\";\n            }\n        }\n        return _TransitionAnimation.executeTransition(elemArray, transition);\n    }\n\n    function animStaggeredSlide(curve, start, end, fadeIn, page, first, second, third) {\n        var elementArray = [],\n            startOffsetArray = [],\n            endOffsetArray = [];\n        function prepareSlide(elements, start, end) {\n            if (!elements) {\n                return;\n            }\n            var startOffset = {\n                left: start + \"px\",\n                top: \"0px\"\n            },\n            endOffset = {\n                left: end + \"px\",\n                top: \"0px\"\n            };\n            if (+elements.length === elements.length) {\n                for (var i = 0, len = elements.length; i < len; i++) {\n                    elementArray.push(elements[i]);\n                    startOffsetArray.push(startOffset);\n                    endOffsetArray.push(endOffset);\n                }\n            } else {\n                elementArray.push(elements);\n                startOffsetArray.push(startOffset);\n                endOffsetArray.push(endOffset);\n            }\n        }\n        var horizontalOffset = 200,\n            startOffset = (start !== 0 ? (start < 0 ? -horizontalOffset : horizontalOffset) : 0),\n            endOffset = (end !== 0 ? (end < 0 ? -horizontalOffset : horizontalOffset) : 0);\n        prepareSlide(page, start, end);\n        prepareSlide(first, startOffset, endOffset);\n        prepareSlide(second, startOffset * 2, endOffset * 2);\n        prepareSlide(third, startOffset * 3, endOffset * 3);\n        startOffsetArray = new OffsetArray(startOffsetArray);\n        endOffsetArray = new OffsetArray(endOffsetArray);\n        return _TransitionAnimation.executeTransition(\n            elementArray,\n            [{\n                property: transformNames.cssName,\n                delay: 0,\n                duration: 350,\n                timing: curve,\n                from: translateCallback(startOffsetArray),\n                to: translateCallback(endOffsetArray)\n            },\n            {\n                property: \"opacity\",\n                delay: 0,\n                duration: 350,\n                timing: fadeIn ? \"steps(1, start)\" : \"steps(1, end)\",\n                from: fadeIn ? 0 : 1,\n                to: fadeIn ? 1 : 0\n            }]);\n    }\n\n    function animRotationTransform(elemArray, origins, transition) {\n        elemArray = makeArray(elemArray);\n        origins = makeArray(origins);\n        for (var i = 0, len = elemArray.length; i < len; i++) {\n            var rtl = _Global.getComputedStyle(elemArray[i]).direction === \"rtl\";\n            elemArray[i].style[_BaseUtils._browserStyleEquivalents[\"transform-origin\"].scriptName] = origins[Math.min(origins.length - 1, i)][rtl ? \"rtl\" : \"ltr\"];\n        }\n        function onComplete() {\n            clearAnimRotationTransform(elemArray);\n        }\n        return _TransitionAnimation.executeTransition(elemArray, transition).then(onComplete, onComplete);\n    }\n\n    function clearAnimRotationTransform(elemArray) {\n        for (var i = 0, len = elemArray.length; i < len; i++) {\n            elemArray[i].style[_BaseUtils._browserStyleEquivalents[\"transform-origin\"].scriptName] = \"\";\n            elemArray[i].style[transformNames.scriptName] = \"\";\n            elemArray[i].style.opacity = \"\";\n        }\n    }\n\n    function translateCallback(offsetArray, prefix) {\n        prefix = prefix || \"\";\n        return function (i, elem) {\n            var offset = offsetArray.getOffset(i);\n            var left = offset.left;\n            if (offset.rtlflip && _Global.getComputedStyle(elem).direction === \"rtl\") {\n                left = left.toString();\n                if (left.charAt(0) === \"-\") {\n                    left = left.substring(1);\n                } else {\n                    left = \"-\" + left;\n                }\n            }\n            return prefix + \"translate(\" + left + \", \" + offset.top + \")\";\n        };\n    }\n\n    function translateCallbackAnimate(offsetArray, suffix) {\n        suffix = suffix || \"\";\n        return function (i) {\n            var offset = offsetArray[i];\n            return \"translate(\" + offset.left + \"px, \" + offset.top + \"px) \" + suffix;\n        };\n    }\n\n    function keyframeCallbackAnimate(offsetArray, keyframe) {\n        return function (i) {\n            var offset = offsetArray[i];\n            return (offset.left === 0 && offset.top === 0) ? keyframe : null;\n        };\n    }\n\n    function layoutTransition(LayoutTransition, target, affected, extra) {\n        var targetArray = makeArray(target);\n        var affectedArray = makeArray(affected);\n        var offsetArray = collectOffsetArray(affectedArray);\n        return new LayoutTransition(targetArray, affectedArray, offsetArray, extra);\n    }\n\n    function collectTurnstileTransformOrigins(elements) {\n        var origins = [];\n        for (var i = 0, len = elements.length; i < len; i++) {\n            var itemBoundingBox = elements[i].getBoundingClientRect();\n            var offsetLeftLTR = -(40 + itemBoundingBox.left);\n            var offsetLeftRTL = 40 + (_Global.innerWidth - itemBoundingBox.right);\n            var totalOffsetY = ((_Global.innerHeight / 2) - itemBoundingBox.top);\n            origins.push(\n                {\n                    ltr: offsetLeftLTR + \"px \" + totalOffsetY + \"px\",\n                    rtl: offsetLeftRTL + \"px \" + totalOffsetY + \"px\"\n                }\n            );\n        }\n\n        return origins;\n    }\n\n    function writeAnimationProfilerMark(text) {\n        _WriteProfilerMark(\"WinJS.UI.Animation:\" + text);\n    }\n\n    var ExpandAnimation = _Base.Class.define(function ExpandAnimation_ctor(revealedArray, affectedArray, offsetArray) {\n        // Constructor\n        this.revealedArray = revealedArray;\n        this.affectedArray = affectedArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"expandAnimation,StartTM\");\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.revealedArray,\n                {\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: this.affectedArray.length > 0 ? 200 : 0,\n                    duration: 167,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: 0,\n                    to: 1\n                });\n            var promise2 = animTranslate2DTransform(\n                this.affectedArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"expandAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var CollapseAnimation = _Base.Class.define(function CollapseAnimation_ctor(hiddenArray, affectedArray, offsetArray) {\n        // Constructor\n        this.hiddenArray = hiddenArray;\n        this.affectedArray = affectedArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"collapseAnimation,StartTM\");\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.hiddenArray,\n                {\n                    keyframe: \"WinJS-opacity-out\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 167,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: 1,\n                    to: 0\n                });\n            var promise2 = animTranslate2DTransform(\n                this.affectedArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: this.hiddenArray.length > 0 ? 167 : 0,\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"collapseAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var RepositionAnimation = _Base.Class.define(function RepositionAnimation_ctor(target, elementArray, offsetArray) {\n        // Constructor\n        this.elementArray = elementArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"repositionAnimation,StartTM\");\n            return animTranslate2DTransform(\n                this.elementArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: staggerDelay(0, 33, 1, 250),\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                })\n                .then(function () { writeAnimationProfilerMark(\"repositionAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var AddToListAnimation = _Base.Class.define(function AddToListAnimation_ctor(addedArray, affectedArray, offsetArray) {\n        // Constructor\n        this.addedArray = addedArray;\n        this.affectedArray = affectedArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"addToListAnimation,StartTM\");\n            var delay = this.affectedArray.length > 0 ? 240 : 0;\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.addedArray,\n                [{\n                    keyframe: \"WinJS-scale-up\",\n                    property: transformNames.cssName,\n                    delay: delay,\n                    duration: 120,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: \"scale(0.85)\",\n                    to: \"none\"\n                },\n                {\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: delay,\n                    duration: 120,\n                    timing: \"linear\",\n                    from: 0,\n                    to: 1\n                }]\n            );\n            var promise2 = animTranslate2DTransform(\n                this.affectedArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 400,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"addToListAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var DeleteFromListAnimation = _Base.Class.define(function DeleteFromListAnimation_ctor(deletedArray, remainingArray, offsetArray) {\n        // Constructor\n        this.deletedArray = deletedArray;\n        this.remainingArray = remainingArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"deleteFromListAnimation,StartTM\");\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.deletedArray,\n                [{\n                    keyframe: \"WinJS-scale-down\",\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 120,\n                    timing: \"cubic-bezier(0.11, 0.5, 0.24, .96)\",\n                    from: \"none\",\n                    to: \"scale(0.85)\"\n                },\n                {\n                    keyframe: \"WinJS-opacity-out\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 120,\n                    timing: \"linear\",\n                    from: 1,\n                    to: 0\n                }]);\n            var promise2 = animTranslate2DTransform(\n                this.remainingArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: this.deletedArray.length > 0 ? 60 : 0,\n                    duration: 400,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"deleteFromListAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var _UpdateListAnimation = _Base.Class.define(function _UpdateListAnimation_ctor(addedArray, affectedArray, offsetArray, deleted) {\n        // Constructor\n        this.addedArray = addedArray;\n        this.affectedArray = affectedArray;\n        this.offsetArray = offsetArray;\n        var deletedArray = makeArray(deleted);\n        this.deletedArray = deletedArray;\n        this.deletedOffsetArray = collectOffsetArray(deletedArray);\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"_updateListAnimation,StartTM\");\n            makeOffsetsRelative(this.deletedArray, this.deletedOffsetArray);\n\n            var delay = 0;\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.deletedArray,\n                [{\n                    keyframe: keyframeCallbackAnimate(this.deletedOffsetArray, \"WinJS-scale-down\"),\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 120,\n                    timing: \"cubic-bezier(0.11, 0.5, 0.24, .96)\",\n                    from: translateCallbackAnimate(this.deletedOffsetArray),\n                    to: translateCallbackAnimate(this.deletedOffsetArray, \"scale(0.85)\")\n                },\n                {\n                    keyframe: \"WinJS-opacity-out\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 120,\n                    timing: \"linear\",\n                    from: 1,\n                    to: 0\n                }]);\n\n            if (this.deletedArray.length > 0) {\n                delay += 60;\n            }\n\n            var promise2 = animTranslate2DTransform(\n                this.affectedArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: delay,\n                    duration: 400,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n\n            if (this.affectedArray.length > 0) {\n                delay += 240;\n            } else if (delay) {\n                delay += 60;\n            }\n\n            var promise3 = _TransitionAnimation.executeAnimation(\n                this.addedArray,\n                [{\n                    keyframe: \"WinJS-scale-up\",\n                    property: transformNames.cssName,\n                    delay: delay,\n                    duration: 120,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: \"scale(0.85)\",\n                    to: \"none\"\n                },\n                {\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: delay,\n                    duration: 120,\n                    timing: \"linear\",\n                    from: 0,\n                    to: 1\n                }]\n            );\n            return Promise.join([promise1, promise2, promise3])\n                .then(function () { writeAnimationProfilerMark(\"_updateListAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n\n    var AddToSearchListAnimation = _Base.Class.define(function AddToSearchListAnimation_ctor(addedArray, affectedArray, offsetArray) {\n        // Constructor\n        this.addedArray = addedArray;\n        this.affectedArray = affectedArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"addToSearchListAnimation,StartTM\");\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.addedArray,\n                {\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: this.affectedArray.length > 0 ? 240 : 0,\n                    duration: 117,\n                    timing: \"linear\",\n                    from: 0,\n                    to: 1\n                });\n            var promise2 = animTranslate2DTransform(\n                this.affectedArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 400,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"addToSearchListAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var DeleteFromSearchListAnimation = _Base.Class.define(function DeleteFromSearchListAnimation_ctor(deletedArray, remainingArray, offsetArray) {\n        // Constructor\n        this.deletedArray = deletedArray;\n        this.remainingArray = remainingArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"deleteFromSearchListAnimation,StartTM\");\n            var promise1 = _TransitionAnimation.executeAnimation(\n                this.deletedArray,\n                {\n                    keyframe: \"WinJS-opacity-out\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 93,\n                    timing: \"linear\",\n                    from: 1,\n                    to: 0\n                });\n            var promise2 = animTranslate2DTransform(\n                this.remainingArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: this.deletedArray.length > 0 ? 60 : 0,\n                    duration: 400,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"deleteFromSearchListAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    var PeekAnimation = _Base.Class.define(function PeekAnimation_ctor(target, elementArray, offsetArray) {\n        // Constructor\n        this.elementArray = elementArray;\n        this.offsetArray = offsetArray;\n    }, { // Public Members\n        execute: function () {\n            writeAnimationProfilerMark(\"peekAnimation,StartTM\");\n            return animTranslate2DTransform(\n                this.elementArray,\n                this.offsetArray,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 2000,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                })\n                .then(function () { writeAnimationProfilerMark(\"peekAnimation,StopTM\"); });\n        }\n    }, { // Static Members\n        supportedForProcessing: false,\n    });\n\n    //\n    // Resize animation\n    //  The resize animation requires 2 animations to run simultaneously in sync with each other. It's implemented\n    //  without PVL because PVL doesn't provide a way to guarantee that 2 animations will start at the same time.\n    //\n    function transformWithTransition(element, transition) {\n        // transition's properties:\n        // - duration: Number representing the duration of the animation in milliseconds.\n        // - timing: String representing the CSS timing function that controls the progress of the animation.\n        // - to: The value of *element*'s transform property after the animation.\n        var duration = transition.duration * _TransitionAnimation._animationFactor;\n        var transitionProperty = _BaseUtils._browserStyleEquivalents[\"transition\"].scriptName;\n        element.style[transitionProperty] = duration + \"ms \" + transformNames.cssName + \" \" + transition.timing;\n        element.style[transformNames.scriptName] = transition.to;\n\n        var finish;\n        return new Promise(function (c) {\n            var onTransitionEnd = function (eventObject) {\n                if (eventObject.target === element && eventObject.propertyName === transformNames.cssName) {\n                    finish();\n                }\n            };\n\n            var didFinish = false;\n            finish = function () {\n                if (!didFinish) {\n                    _Global.clearTimeout(timeoutId);\n                    element.removeEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], onTransitionEnd);\n                    element.style[transitionProperty] = \"\";\n                    didFinish = true;\n                }\n                c();\n            };\n\n            // Watch dog timeout\n            var timeoutId = _Global.setTimeout(function () {\n                timeoutId = _Global.setTimeout(finish, duration);\n            }, 50);\n\n            element.addEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], onTransitionEnd);\n        }, function () {\n            finish(); // On cancelation, complete the promise successfully to match PVL\n        });\n    }\n\n    function getResizeDefaultTransitions() {\n        return {\n            defaultResizeGrowTransition: {\n                duration: 350,\n                timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\"\n            },\n\n            defaultResizeShrinkTransition: {\n                duration: 120,\n                timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\"\n            }\n        };\n    }\n\n    // See _resizeTransition's comment for documentation on *args*.\n    function resizeTransition(elementClipper, element, args) {\n        var defaultTransition = getResizeDefaultTransitions()[(args.to > args.from ? \"defaultResizeGrowTransition\" : \"defaultResizeShrinkTransition\")];\n        args = _BaseUtils._merge(args, {\n            duration: args.duration === undefined ? defaultTransition.duration : args.duration,\n            timing: args.timing === undefined ? defaultTransition.timing : args.timing\n        });\n\n        var start = args.actualSize - args.from;\n        var end = args.actualSize - args.to;\n        if (!args.anchorTrailingEdge) {\n            start = -start;\n            end = -end;\n        }\n        var translate = args.dimension === \"width\" ? \"translateX\" : \"translateY\";\n        var transition = {\n            duration: args.duration,\n            timing: args.timing\n        };\n\n        // Set up\n        elementClipper.style[transformNames.scriptName] = translate + \"(\" + start + \"px)\";\n        element.style[transformNames.scriptName] = translate + \"(\" + -start + \"px)\";\n\n        // Resolve styles\n        _Global.getComputedStyle(elementClipper).opacity;\n        _Global.getComputedStyle(element).opacity;\n\n        // Merge the transitions, but don't animate yet\n        var clipperTransition = _BaseUtils._merge(transition, { to: translate + \"(\" + end + \"px)\" });\n        var elementTransition = _BaseUtils._merge(transition, { to: translate + \"(\" + -end + \"px)\" });\n\n        // Return an array so that we can prepare any other animations before beginning everything (used by commanding surface open/close animations)\n        return [\n            { element: elementClipper, transition: clipperTransition },\n            { element: element, transition: elementTransition }\n        ];\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI.Animation\", {\n\n        createExpandAnimation: function (revealed, affected) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createExpandAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createExpandAnimation\">\n            /// Creates an expand animation.\n            /// After creating the ExpandAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the ExpandAnimation object.\n            /// </summary>\n            /// <param name=\"revealed\" locid=\"WinJS.UI.Animation.createExpandAnimation_p:revealed\">\n            /// Single element or collection of elements which were revealed.\n            /// </param>\n            /// <param name=\"affected\" locid=\"WinJS.UI.Animation.createExpandAnimation_p:affected\">\n            /// Single element or collection of elements whose positions were\n            /// affected by the expand.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createExpandAnimation_returnValue\">\n            /// ExpandAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(ExpandAnimation, revealed, affected);\n        },\n\n        createCollapseAnimation: function (hidden, affected) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createCollapseAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createCollapseAnimation\">\n            /// Creates a collapse animation.\n            /// After creating the CollapseAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the CollapseAnimation object.\n            /// </summary>\n            /// <param name=\"hidden\" locid=\"WinJS.UI.Animation.createCollapseAnimation_p:hidden\">\n            /// Single element or collection of elements being removed from view.\n            /// When the animation completes, the application should hide the elements\n            /// or remove them from the document.\n            /// </param>\n            /// <param name=\"affected\" locid=\"WinJS.UI.Animation.createCollapseAnimation_p:affected\">\n            /// Single element or collection of elements whose positions were\n            /// affected by the collapse.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createCollapseAnimation_returnValue\">\n            /// CollapseAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(CollapseAnimation, hidden, affected);\n        },\n\n        createRepositionAnimation: function (element) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createRepositionAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createRepositionAnimation\">\n            /// Creates a reposition animation.\n            /// After creating the RepositionAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the RepositionAnimation object.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.createRepositionAnimation_p:element\">\n            /// Single element or collection of elements which were repositioned.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createRepositionAnimation_returnValue\">\n            /// RepositionAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(RepositionAnimation, null, element);\n        },\n\n        fadeIn: function (shown) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.fadeIn\">\n            /// <summary locid=\"WinJS.UI.Animation.fadeIn\">\n            /// Execute a fade-in animation.\n            /// </summary>\n            /// <param name=\"shown\" locid=\"WinJS.UI.Animation.fadeIn_p:element\">\n            /// Single element or collection of elements to fade in.\n            /// At the end of the animation, the opacity of the elements is 1.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.fadeIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"fadeIn,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                shown,\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 250,\n                    timing: \"linear\",\n                    from: 0,\n                    to: 1\n                })\n                .then(function () { writeAnimationProfilerMark(\"fadeIn,StopTM\"); });\n        },\n\n        fadeOut: function (hidden) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.fadeOut\">\n            /// <summary locid=\"WinJS.UI.Animation.fadeOut\">\n            /// Execute a fade-out animation.\n            /// </summary>\n            /// <param name=\"hidden\" locid=\"WinJS.UI.Animation.fadeOut_p:element\">\n            /// Single element or collection of elements to fade out.\n            /// At the end of the animation, the opacity of the elements is 0.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.fadeOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"fadeOut,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                hidden,\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 167,\n                    timing: \"linear\",\n                    to: 0\n                })\n                .then(function () { writeAnimationProfilerMark(\"fadeOut,StopTM\"); });\n        },\n\n        createAddToListAnimation: function (added, affected) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createAddToListAnimation\" >\n            /// <summary locid=\"WinJS.UI.Animation.createAddToListAnimation\">\n            /// Creates an animation for adding to a list.\n            /// After creating the AddToListAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the AddToListAnimation object.\n            /// </summary>\n            /// <param name=\"added\" locid=\"WinJS.UI.Animation.createAddToListAnimation_p:added\">\n            /// Single element or collection of elements which were added.\n            /// </param>\n            /// <param name=\"affected\" locid=\"WinJS.UI.Animation.createAddToListAnimation_p:affected\">\n            /// Single element or collection of elements whose positions were\n            /// affected by the add.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createAddToListAnimation_returnValue\">\n            /// AddToListAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(AddToListAnimation, added, affected);\n        },\n\n        createDeleteFromListAnimation: function (deleted, remaining) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createDeleteFromListAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createDeleteFromListAnimation\">\n            /// Crestes an animation for deleting from a list.\n            /// After creating the DeleteFromListAnimation object,\n            /// modify the document to reflect the deletion,\n            /// then call the execute method on the DeleteFromListAnimation object.\n            /// </summary>\n            /// <param name=\"deleted\" locid=\"WinJS.UI.Animation.createDeleteFromListAnimation_p:deleted\">\n            /// Single element or collection of elements which will be deleted.\n            /// When the animation completes, the application should hide the elements\n            /// or remove them from the document.\n            /// </param>\n            /// <param name=\"remaining\" locid=\"WinJS.UI.Animation.createDeleteFromListAnimation_p:remaining\">\n            /// Single element or collection of elements whose positions were\n            /// affected by the deletion.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createDeleteFromListAnimation_returnValue\">\n            /// DeleteFromListAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(DeleteFromListAnimation, deleted, remaining);\n        },\n\n        _createUpdateListAnimation: function (added, deleted, affected) {\n            return layoutTransition(_UpdateListAnimation, added, affected, deleted);\n        },\n\n        createAddToSearchListAnimation: function (added, affected) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createAddToSearchListAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createAddToSearchListAnimation\">\n            /// Creates an animation for adding to a list of search results.\n            /// This is similar to an AddToListAnimation, but faster.\n            /// After creating the AddToSearchListAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the AddToSearchListAnimation object.\n            /// </summary>\n            /// <param name=\"added\" locid=\"WinJS.UI.Animation.createAddToSearchListAnimation_p:added\">\n            /// Single element or collection of elements which were added.\n            /// </param>\n            /// <param name=\"affected\" locid=\"WinJS.UI.Animation.createAddToSearchListAnimation_p:affected\">\n            /// Single element or collection of elements whose positions were\n            /// affected by the add.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createAddToSearchListAnimation_returnValue\">\n            /// AddToSearchListAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(AddToSearchListAnimation, added, affected);\n        },\n\n        createDeleteFromSearchListAnimation: function (deleted, remaining) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createDeleteFromSearchListAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createDeleteFromSearchListAnimation\">\n            /// Creates an animation for deleting from a list of search results.\n            /// This is similar to an DeleteFromListAnimation, but faster.\n            /// After creating the DeleteFromSearchListAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the DeleteFromSearchListAnimation object.\n            /// </summary>\n            /// <param name=\"deleted\" locid=\"WinJS.UI.Animation.createDeleteFromSearchListAnimation_p:deleted\">\n            /// Single element or collection of elements which will be deleted.\n            /// When the animation completes, the application should hide the elements\n            /// or remove them from the document.\n            /// </param>\n            /// <param name=\"remaining\" locid=\"WinJS.UI.Animation.createDeleteFromSearchListAnimation_p:remaining\">\n            /// Single element or collection of elements whose positions were\n            /// affected by the deletion.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createDeleteFromSearchListAnimation_returnValue\">\n            /// DeleteFromSearchListAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(DeleteFromSearchListAnimation, deleted, remaining);\n        },\n\n\n        showEdgeUI: function (element, offset, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.showEdgeUI\">\n            /// <summary locid=\"WinJS.UI.Animation.showEdgeUI\">\n            /// Slides an element or elements into position at the edge of the screen.\n            /// This animation is designed for a small object like an appbar.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.showEdgeUI_p:element\">\n            /// Single element or collection of elements to be slid into position.\n            /// The elements should be at their final positions\n            /// at the time the function is called.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.showEdgeUI_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" optional=\"true\" locid=\"WinJS.UI.Animation.showEdgeUI_p:options\">\n            /// Optional object which can specify the mechanism to use to play the animation. By default css\n            /// animations are used but if { mechanism: \"transition\" } is provided css transitions will be used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.showEdgeUI_p:returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"showEdgeUI,StartTM\");\n\n            var isTransition = options && options.mechanism === \"transition\";\n            var offsetArray = new OffsetArray(offset, \"WinJS-showEdgeUI\", [{ top: \"-70px\", left: \"0px\" }]);\n            return _TransitionAnimation[(isTransition ? \"executeTransition\" : \"executeAnimation\")](\n                element,\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: isTransition ? translateCallback(offsetArray) : (offsetArray.keyframe || translateCallback(offsetArray)),\n                    to: \"none\"\n                })\n                .then(function () { writeAnimationProfilerMark(\"showEdgeUI,StopTM\"); });\n        },\n\n        showPanel: function (element, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.showPanel\">\n            /// <summary locid=\"WinJS.UI.Animation.showPanel\">\n            /// Slides an element or elements into position at the edge of the screen.\n            /// This animation is designed for a large object like a keyboard.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.showPanel_p:element\">\n            /// Single element or collection of elements to be slid into position.\n            /// The elements should be at their final positions\n            /// at the time the function is called.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.showPanel_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.showPanel_returnValue\">\n            /// promise object\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"showPanel,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-showPanel\", [{ top: \"0px\", left: \"364px\", rtlflip: true }]);\n            return _TransitionAnimation.executeAnimation(\n                element,\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 550,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: offsetArray.keyframe || translateCallback(offsetArray),\n                    to: \"none\"\n                })\n                .then(function () { writeAnimationProfilerMark(\"showPanel,StopTM\"); });\n        },\n\n        hideEdgeUI: function (element, offset, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.hideEdgeUI\">\n            /// <summary locid=\"WinJS.UI.Animation.hideEdgeUI\">\n            /// Slides an element or elements at the edge of the screen out of view.\n            /// This animation is designed for a small object like an appbar.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.hideEdgeUI_p:element\">\n            /// Single element or collection of elements to be slid out.\n            /// The elements should be at their onscreen positions\n            /// at the time the function is called.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.hideEdgeUI_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the ending point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" optional=\"true\" locid=\"WinJS.UI.Animation.hideEdgeUI_p:options\">\n            /// Optional object which can specify the mechanism to use to play the animation. By default css\n            /// animations are used but if { mechanism: \"transition\" } is provided css transitions will be used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.hideEdgeUI_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"hideEdgeUI,StartTM\");\n\n            var isTransition = options && options.mechanism === \"transition\";\n            var offsetArray = new OffsetArray(offset, \"WinJS-hideEdgeUI\", [{ top: \"-70px\", left: \"0px\" }]);\n            return _TransitionAnimation[(isTransition ? \"executeTransition\" : \"executeAnimation\")](\n                element,\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: \"none\",\n                    to: isTransition ? translateCallback(offsetArray) : (offsetArray.keyframe || translateCallback(offsetArray))\n                })\n                .then(function () { writeAnimationProfilerMark(\"hideEdgeUI,StopTM\"); });\n        },\n\n        hidePanel: function (element, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.hidePanel\">\n            /// <summary locid=\"WinJS.UI.Animation.hidePanel\">\n            /// Slides an element or elements at the edge of the screen out of view.\n            /// This animation is designed for a large object like a keyboard.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.hidePanel_p:element\">\n            /// Single element or collection of elements to be slid out.\n            /// The elements should be at their onscreen positions\n            /// at the time the function is called.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.hidePanel_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the ending point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.hidePanel_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"hidePanel,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-hidePanel\", [{ top: \"0px\", left: \"364px\", rtlflip: true }]);\n            return _TransitionAnimation.executeAnimation(\n                element,\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 550,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: \"none\",\n                    to: offsetArray.keyframe || translateCallback(offsetArray)\n                })\n                .then(function () { writeAnimationProfilerMark(\"hidePanel,StopTM\"); });\n        },\n\n        showPopup: function (element, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.showPopup\">\n            /// <summary locid=\"WinJS.UI.Animation.showPopup\">\n            /// Displays an element or elements in the style of a popup.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.showPopup_p:element\">\n            /// Single element or collection of elements to be shown like a popup.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.showPopup_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.showPopup_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"showPopup,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-showPopup\", [{ top: \"50px\", left: \"0px\" }]);\n            return _TransitionAnimation.executeAnimation(\n                element,\n                [{\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: 83,\n                    duration: 83,\n                    timing: \"linear\",\n                    from: 0,\n                    to: 1\n                },\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: offsetArray.keyframe || translateCallback(offsetArray),\n                    to: \"none\"\n                }])\n                .then(function () { writeAnimationProfilerMark(\"showPopup,StopTM\"); });\n        },\n\n        hidePopup: function (element) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.hidePopup\" >\n            /// <summary locid=\"WinJS.UI.Animation.hidePopup\">\n            /// Removes a popup from the screen.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.hidePopup_p:element\">\n            /// Single element or collection of elements to be hidden like a popup.\n            /// When the animation completes, the application should hide the elements\n            /// or remove them from the document.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.hidePopup_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"hidePopup,StartTM\");\n\n            return _TransitionAnimation.executeAnimation(\n                element,\n                {\n                    keyframe: \"WinJS-opacity-out\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 83,\n                    timing: \"linear\",\n                    from: 1,\n                    to: 0\n                })\n                .then(function () { writeAnimationProfilerMark(\"hidePopup,StopTM\"); });\n        },\n\n        pointerDown: function (element) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.pointerDown\">\n            /// <summary locid=\"WinJS.UI.Animation.pointerDown\">\n            /// Execute a pointer-down animation.\n            /// Use the pointerUp animation to reverse the effect of this animation.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.pointerDown_p:element\">\n            /// Single element or collection of elements responding to the\n            /// pointer-down event.\n            /// At the end of the animation, the elements' properties have been\n            /// modified to reflect the pointer-down state.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.pointerDown_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"pointerDown,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                 element,\n                 {\n                     property: transformNames.cssName,\n                     delay: 0,\n                     duration: 167,\n                     timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                     to: \"scale(0.975, 0.975)\"\n                 })\n                .then(function () { writeAnimationProfilerMark(\"pointerDown,StopTM\"); });\n        },\n\n        pointerUp: function (element) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.pointerUp\">\n            /// <summary locid=\"WinJS.UI.Animation.pointerUp\">\n            /// Execute a pointer-up animation.\n            /// This reverses the effect of a pointerDown animation.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.pointerUp_p:element\">\n            /// Single element or collection of elements responding to\n            /// the pointer-up event.\n            /// At the end of the animation, the elements' properties have been\n            /// returned to normal.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.pointerUp_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"pointerUp,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                 element,\n                 {\n                     property: transformNames.cssName,\n                     delay: 0,\n                     duration: 167,\n                     timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                     to: \"\"\n                 })\n                .then(function () { writeAnimationProfilerMark(\"pointerUp,StopTM\"); });\n        },\n\n        dragSourceStart: function (dragSource, affected) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.dragSourceStart\" >\n            /// <summary locid=\"WinJS.UI.Animation.dragSourceStart\">\n            /// Execute a drag-start animation.\n            /// Use the dragSourceEnd animation to reverse the effects of this animation.\n            /// </summary>\n            /// <param name=\"dragSource\" locid=\"WinJS.UI.Animation.dragSourceStart_p:dragSource\">\n            /// Single element or collection of elements being dragged.\n            /// At the end of the animation, the elements' properties have been\n            /// modified to reflect the drag state.\n            /// </param>\n            /// <param name=\"affected\" locid=\"WinJS.UI.Animation.dragSourceStart_p:affected\">\n            /// Single element or collection of elements to highlight as not\n            /// being dragged.\n            /// At the end of the animation, the elements' properties have been\n            /// modified to reflect the drag state.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.dragSourceStart_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"dragSourceStart,StartTM\");\n\n            var promise1 = _TransitionAnimation.executeTransition(\n                dragSource,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 240,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"scale(1.05)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 240,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: 0.65\n                }]);\n            var promise2 = _TransitionAnimation.executeTransition(\n                affected,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 240,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"scale(0.95)\"\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"dragSourceStart,StopTM\"); });\n        },\n\n        dragSourceEnd: function (dragSource, offset, affected) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.dragSourceEnd\">\n            /// <summary locid=\"WinJS.UI.Animation.dragSourceEnd\">\n            /// Execute a drag-end animation.\n            /// This reverses the effect of the dragSourceStart animation.\n            /// </summary>\n            /// <param name=\"dragSource\" locid=\"WinJS.UI.Animation.dragSourceEnd_p:dragSource\">\n            /// Single element or collection of elements no longer being dragged.\n            /// At the end of the animation, the elements' properties have been\n            /// returned to normal.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.dragSourceEnd_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// dragSource parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <param name=\"affected\" locid=\"WinJS.UI.Animation.dragSourceEnd_p:affected\">\n            /// Single element or collection of elements which were highlighted as not\n            /// being dragged.\n            /// At the end of the animation, the elements' properties have been\n            /// returned to normal.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.dragSourceEnd_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"dragSourceEnd,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-dragSourceEnd\");\n            var promise1 = _TransitionAnimation.executeTransition(\n                dragSource,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\" // this removes the scale\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: 1\n                }]);\n\n            var promise2 = _TransitionAnimation.executeAnimation(\n                dragSource,\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: offsetArray.keyframe || translateCallback(offsetArray, \"scale(1.05) \"),\n                    to: \"none\"\n                });\n\n            var promise3 = _TransitionAnimation.executeTransition(\n                 affected,\n                 {\n                     property: transformNames.cssName,\n                     delay: 0,\n                     duration: 500,\n                     timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                     to: \"\"\n                 });\n            return Promise.join([promise1, promise2, promise3])\n                .then(function () { writeAnimationProfilerMark(\"dragSourceEnd,StopTM\"); });\n        },\n\n\n        enterContent: function (incoming, offset, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.enterContent\">\n            /// <summary locid=\"WinJS.UI.Animation.enterContent\">\n            /// Execute an enter-content animation.\n            /// </summary>\n            /// <param name=\"incoming\" locid=\"WinJS.UI.Animation.enterContent_p:incoming\">\n            /// Single element or collection of elements which represent\n            /// the incoming content.\n            /// At the end of the animation, the opacity of the elements is 1.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.enterContent_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// incoming parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" optional=\"true\" locid=\"WinJS.UI.Animation.enterContent_p:options\">\n            /// Optional object which can specify the mechanism to use to play the animation. By default css\n            /// animations are used but if { mechanism: \"transition\" } is provided css transitions will be used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.enterContent_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"enterContent,StartTM\");\n\n            var animationPromise;\n            var offsetArray = new OffsetArray(offset, \"WinJS-enterContent\", [{ top: \"28px\", left: \"0px\", rtlflip: false }]);\n            if (options && options.mechanism === \"transition\") {\n                animationPromise = _TransitionAnimation.executeTransition(\n                    incoming,\n                    [{\n                        property: transformNames.cssName,\n                        delay: 0,\n                        duration: 550,\n                        timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                        from: translateCallback(offsetArray),\n                        to: \"none\"\n                    },\n                    {\n                        property: \"opacity\",\n                        delay: 0,\n                        duration: 170,\n                        timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                        from: 0,\n                        to: 1\n                    }]);\n            } else {\n                var promise1 = _TransitionAnimation.executeAnimation(\n                    incoming,\n                    {\n                        keyframe: offsetArray.keyframe,\n                        property: transformNames.cssName,\n                        delay: 0,\n                        duration: 550,\n                        timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                        from: offsetArray.keyframe || translateCallback(offsetArray),\n                        to: \"none\"\n                    });\n                var promise2 = _TransitionAnimation.executeTransition(\n                    incoming,\n                    {\n                        property: \"opacity\",\n                        delay: 0,\n                        duration: 170,\n                        timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                        from: 0,\n                        to: 1\n                    });\n                animationPromise = Promise.join([promise1, promise2]);\n            }\n            return animationPromise.then(function () { writeAnimationProfilerMark(\"enterContent,StopTM\"); });\n        },\n\n        exitContent: function (outgoing, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.exitContent\">\n            /// <summary locid=\"WinJS.UI.Animation.exitContent\">\n            /// Execute an exit-content animation.\n            /// </summary>\n            /// <param name=\"outgoing\" locid=\"WinJS.UI.Animation.exitContent_p:outgoing\">\n            /// Single element or collection of elements which represent\n            /// the outgoing content.\n            /// At the end of the animation, the opacity of the elements is 0.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.exitContent_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the ending point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// outgoing parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.exitContent_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"exitContent,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-exit\", [{ top: \"0px\", left: \"0px\" }]);\n            var promise1 = _TransitionAnimation.executeAnimation(\n                outgoing,\n                offset && {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 117,\n                    timing: \"linear\",\n                    from: \"none\",\n                    to: offsetArray.keyframe || translateCallback(offsetArray)\n                });\n\n            var promise2 = _TransitionAnimation.executeTransition(\n                outgoing,\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 117,\n                    timing: \"linear\",\n                    to: 0\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"exitContent,StopTM\"); });\n        },\n\n        dragBetweenEnter: function (target, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.dragBetweenEnter\">\n            /// <summary locid=\"WinJS.UI.Animation.dragBetweenEnter\">\n            /// Execute an animation which indicates that a dragged object\n            /// can be dropped between other elements.\n            /// Use the dragBetweenLeave animation to reverse the effects of this animation.\n            /// </summary>\n            /// <param name=\"target\" locid=\"WinJS.UI.Animation.dragBetweenEnter_p:target\">\n            /// Single element or collection of elements (usually two)\n            /// that the dragged object can be dropped between.\n            /// At the end of the animation, the elements' properties have been\n            /// modified to reflect the drag-between state.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.dragBetweenEnter_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the ending point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.dragBetweenEnter_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"dragBetweenEnter,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, null, [{ top: \"-40px\", left: \"0px\" }, { top: \"40px\", left: \"0px\" }]);\n            return _TransitionAnimation.executeTransition(\n                target,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 200,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: translateCallback(offsetArray, \"scale(0.95) \")\n                })\n                .then(function () { writeAnimationProfilerMark(\"dragBetweenEnter,StopTM\"); });\n        },\n\n        dragBetweenLeave: function (target) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.dragBetweenLeave\">\n            /// <summary locid=\"WinJS.UI.Animation.dragBetweenLeave\">\n            /// Execute an animation which indicates that a dragged object\n            /// will no longer be dropped between other elements.\n            /// This reverses the effect of the dragBetweenEnter animation.\n            /// </summary>\n            /// <param name=\"target\" locid=\"WinJS.UI.Animation.dragBetweenLeave_p:target\">\n            /// Single element or collection of elements (usually two)\n            /// that the dragged object no longer will be dropped between.\n            /// At the end of the animation, the elements' properties have been\n            /// set to the dragSourceStart state.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.dragBetweenLeave_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"dragBetweenLeave,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                target,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 200,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"scale(0.95)\"\n                })\n                .then(function () { writeAnimationProfilerMark(\"dragBetweenLeave,StopTM\"); });\n        },\n\n        swipeSelect: function (selected, selection) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.swipeSelect\">\n            /// <summary locid=\"WinJS.UI.Animation.swipeSelect\">\n            /// Slide a swipe-selected object back into position when the\n            /// pointer is released, and show the selection mark.\n            /// </summary>\n            /// <param name=\"selected\" locid=\"WinJS.UI.Animation.swipeSelect_p:selected\">\n            /// Single element or collection of elements being selected.\n            /// At the end of the animation, the elements' properties have been\n            /// returned to normal.\n            /// </param>\n            /// <param name=\"selection\" locid=\"WinJS.UI.Animation.swipeSelect_p:selection\">\n            /// Single element or collection of elements that is the selection mark.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.swipeSelect_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"swipeSelect,StartTM\");\n\n            var promise1 = _TransitionAnimation.executeTransition(\n                selected,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 300,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n\n            var promise2 = _TransitionAnimation.executeAnimation(\n                selection,\n                {\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 300,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: 0,\n                    to: 1\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"swipeSelect,StopTM\"); });\n        },\n\n        swipeDeselect: function (deselected, selection) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.swipeDeselect\">\n            /// <summary locid=\"WinJS.UI.Animation.swipeDeselect\">\n            /// Slide a swipe-deselected object back into position when the\n            /// pointer is released, and hide the selection mark.\n            /// </summary>\n            /// <param name=\"deselected\" locid=\"WinJS.UI.Animation.swipeDeselect_p:deselected\">\n            /// Single element or collection of elements being deselected.\n            /// At the end of the animation, the elements' properties have been\n            /// returned to normal.\n            /// </param>\n            /// <param name=\"selection\" locid=\"WinJS.UI.Animation.swipeDeselect_p:selection\">\n            /// Single element or collection of elements that is the selection mark.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.swipeDeselect_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"swipeDeselect,StartTM\");\n\n            var promise1 = _TransitionAnimation.executeTransition(\n                deselected,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 300,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: \"\"\n                });\n\n            var promise2 = _TransitionAnimation.executeAnimation(\n                selection,\n                {\n                    keyframe: \"WinJS-opacity-out\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 300,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: 1,\n                    to: 0\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"swipeDeselect,StopTM\"); });\n        },\n\n        swipeReveal: function (target, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.swipeReveal\">\n            /// <summary locid=\"WinJS.UI.Animation.swipeReveal\">\n            /// Reveal an object as the result of a swipe, or slide the\n            /// swipe-selected object back into position after the reveal.\n            /// </summary>\n            /// <param name=\"target\" locid=\"WinJS.UI.Animation.swipeReveal_p:target\">\n            /// Single element or collection of elements being selected.\n            /// At the end of the animation, the elements' properties have been\n            /// modified to reflect the specified offset.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.swipeReveal_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the ending point of the animation.\n            /// When moving the object back into position, the offset should be\n            /// { top: \"0px\", left: \"0px\" }.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// The default value describes the motion for a reveal.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.swipeReveal_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"swipeReveal,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, null, [{ top: \"25px\", left: \"0px\" }]);\n            return _TransitionAnimation.executeTransition(\n                target,\n                {\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 300,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    to: translateCallback(offsetArray)\n                })\n                .then(function () { writeAnimationProfilerMark(\"swipeReveal,StopTM\"); });\n        },\n\n        enterPage: function (element, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.enterPage\">\n            /// <summary locid=\"WinJS.UI.Animation.enterPage\">\n            /// Execute an enterPage animation.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.enterPage_p:element\">\n            /// Single element or collection of elements representing the\n            /// incoming page.\n            /// At the end of the animation, the opacity of the elements is 1.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.enterPage_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// element parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.enterPage_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"enterPage,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-enterPage\", [{ top: \"28px\", left: \"0px\", rtlflip: false }]);\n            var promise1 = _TransitionAnimation.executeAnimation(\n                element,\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: staggerDelay(0, 83, 1, 333),\n                    duration: 1000,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: offsetArray.keyframe || translateCallback(offsetArray),\n                    to: \"none\"\n                });\n            var promise2 = _TransitionAnimation.executeTransition(\n                element,\n                {\n                    property: \"opacity\",\n                    delay: staggerDelay(0, 83, 1, 333),\n                    duration: 170,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: 0,\n                    to: 1\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"enterPage,StopTM\"); });\n        },\n\n        exitPage: function (outgoing, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.exitPage\">\n            /// <summary locid=\"WinJS.UI.Animation.exitPage\">\n            /// Execute an exitPage animation.\n            /// </summary>\n            /// <param name=\"outgoing\" locid=\"WinJS.UI.Animation.exitPage_p:outgoing\">\n            /// Single element or collection of elements representing\n            /// the outgoing page.\n            /// At the end of the animation, the opacity of the elements is 0.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.exitPage_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the ending point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// outgoing parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.exitPage_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"exitPage,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-exit\", [{ top: \"0px\", left: \"0px\" }]);\n            var promise1 = _TransitionAnimation.executeAnimation(\n                outgoing,\n                offset && {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 117,\n                    timing: \"linear\",\n                    from: \"none\",\n                    to: offsetArray.keyframe || translateCallback(offsetArray)\n                });\n\n            var promise2 = _TransitionAnimation.executeTransition(\n                outgoing,\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 117,\n                    timing: \"linear\",\n                    to: 0\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"exitPage,StopTM\"); });\n        },\n\n        crossFade: function (incoming, outgoing) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.crossFade\">\n            /// <summary locid=\"WinJS.UI.Animation.crossFade\">\n            /// Execute a crossFade animation.\n            /// </summary>\n            /// <param name=\"incoming\" locid=\"WinJS.UI.Animation.crossFade_p:incoming\">\n            /// Single incoming element or collection of incoming elements.\n            /// At the end of the animation, the opacity of the elements is 1.\n            /// </param>\n            /// <param name=\"outgoing\" locid=\"WinJS.UI.Animation.crossFade_p:outgoing\">\n            /// Single outgoing element or collection of outgoing elements.\n            /// At the end of the animation, the opacity of the elements is 0.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.crossFade_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"crossFade,StartTM\");\n\n            var promise1 = _TransitionAnimation.executeTransition(\n                incoming,\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 167,\n                    timing: \"linear\",\n                    to: 1\n                });\n\n            var promise2 = _TransitionAnimation.executeTransition(\n                outgoing,\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 167,\n                    timing: \"linear\",\n                    to: 0\n                });\n            return Promise.join([promise1, promise2])\n                .then(function () { writeAnimationProfilerMark(\"crossFade,StopTM\"); });\n        },\n\n        createPeekAnimation: function (element) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createPeekAnimation\">\n            /// <summary locid=\"WinJS.UI.Animation.createPeekAnimation\">\n            /// Creates a peek animation.\n            /// After creating the PeekAnimation object,\n            /// modify the document to move the elements to their new positions,\n            /// then call the execute method on the PeekAnimation object.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Animation.createPeekAnimation_p:element\">\n            /// Single element or collection of elements to be repositioned for peek.\n            /// </param>\n            /// <returns type=\"{ execute: Function }\" locid=\"WinJS.UI.Animation.createPeekAnimation_returnValue\">\n            /// PeekAnimation object whose execute method returns\n            /// a Promise that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            return layoutTransition(PeekAnimation, null, element);\n        },\n\n        updateBadge: function (incoming, offset) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.updateBadge\">\n            /// <summary locid=\"WinJS.UI.Animation.updateBadge\">\n            /// Execute an updateBadge animation.\n            /// </summary>\n            /// <param name=\"incoming\" locid=\"WinJS.UI.Animation.updateBadge_p:incoming\">\n            /// Single element or collection of elements representing the\n            /// incoming badge.\n            /// </param>\n            /// <param name=\"offset\" locid=\"WinJS.UI.Animation.updateBadge_p:offset\">\n            /// Optional offset object or collection of offset objects\n            /// array describing the starting point of the animation.\n            /// If the number of offset objects is less than the length of the\n            /// incoming parameter, then the last value is repeated for all\n            /// remaining elements.\n            /// If this parameter is omitted, then a default value is used.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.updateBadge_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"updateBadge,StartTM\");\n\n            var offsetArray = new OffsetArray(offset, \"WinJS-updateBadge\", [{ top: \"24px\", left: \"0px\" }]);\n            return _TransitionAnimation.executeAnimation(\n                incoming,\n                [{\n                    keyframe: \"WinJS-opacity-in\",\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 367,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: 0,\n                    to: 1\n                },\n                {\n                    keyframe: offsetArray.keyframe,\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 1333,\n                    timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                    from: offsetArray.keyframe || translateCallback(offsetArray),\n                    to: \"none\"\n                }])\n                .then(function () { writeAnimationProfilerMark(\"updateBadge,StopTM\"); });\n        },\n\n        turnstileForwardIn: function (incomingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.turnstileForwardIn\">\n            /// <summary locid=\"WinJS.UI.Animation.turnstileForwardIn\">\n            /// Execute a turnstile forward in animation.\n            /// </summary>\n            /// <param name=\"incomingElements\" locid=\"WinJS.UI.Animation.turnstileForwardIn_p:incomingElements\">\n            /// Single element or collection of elements to animate.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.turnstileForwardIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"turnstileForwardIn,StartTM\");\n\n            incomingElements = makeArray(incomingElements);\n            var origins = collectTurnstileTransformOrigins(incomingElements);\n            return animRotationTransform(\n                incomingElements,\n                origins,\n                [{\n                    property: transformNames.cssName,\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 300,\n                    timing: \"cubic-bezier(0.01,0.975,0.4775,0.9775)\",\n                    from: \"perspective(600px) rotateY(80deg)\",\n                    to: \"perspective(600px) rotateY(0deg)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 300,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"turnstileForwardIn,StopTM\"); });\n        },\n\n        turnstileForwardOut: function (outgoingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.turnstileForwardOut\">\n            /// <summary locid=\"WinJS.UI.Animation.turnstileForwardOut\">\n            /// Execute a turnstile forward out animation.\n            /// </summary>\n            /// <param name=\"outgoingElements\" locid=\"WinJS.UI.Animation.turnstileForwardOut_p:outgoingElements\">\n            /// Single element or collection of elements to animate.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.turnstileForwardOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"turnstileForwardOut,StartTM\");\n\n            outgoingElements = makeArray(outgoingElements);\n            var origins = collectTurnstileTransformOrigins(outgoingElements);\n            return animRotationTransform(\n                outgoingElements,\n                origins,\n                [{\n                    property: transformNames.cssName,\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 128,\n                    timing: \"cubic-bezier(0.4925,0.01,0.7675,-0.01)\",\n                    from: \"perspective(600px) rotateY(0deg)\",\n                    to: \"perspective(600px) rotateY(-50deg)\",\n                },\n                {\n                    property: \"opacity\",\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 128,\n                    timing: \"cubic-bezier(1,-0.42,0.995,-0.425)\",\n                    from: 1,\n                    to: 0,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"turnstileForwardOut,StopTM\"); });\n        },\n\n        turnstileBackwardIn: function (incomingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.turnstileBackwardIn\">\n            /// <summary locid=\"WinJS.UI.Animation.turnstileBackwardIn\">\n            /// Execute a turnstile backwards in animation.\n            /// </summary>\n            /// <param name=\"incomingElements\" locid=\"WinJS.UI.Animation.turnstileBackwardIn_p:incomingElements\">\n            /// Single element or collection of elements to animate.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.turnstileBackwardIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"turnstileBackwardIn,StartTM\");\n\n            incomingElements = makeArray(incomingElements);\n            var origins = collectTurnstileTransformOrigins(incomingElements);\n            return animRotationTransform(\n                incomingElements,\n                origins,\n                [{\n                    property: transformNames.cssName,\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 300,\n                    timing: \"cubic-bezier(0.01,0.975,0.4775,0.9775)\",\n                    from: \"perspective(600px) rotateY(-50deg)\",\n                    to: \"perspective(600px) rotateY(0deg)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 300,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"turnstileBackwardIn,StopTM\"); });\n        },\n\n        turnstileBackwardOut: function (outgoingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.turnstileBackwardOut\">\n            /// <summary locid=\"WinJS.UI.Animation.turnstileBackwardOut\">\n            /// Execute a turnstile backward out animation.\n            /// </summary>\n            /// <param name=\"outgoingElements\" locid=\"WinJS.UI.Animation.turnstileBackwardOut_p:outgoingElements\">\n            /// Single element or collection of elements to animate.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.turnstileBackwardOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"turnstileBackwardOut,StartTM\");\n\n            outgoingElements = makeArray(outgoingElements);\n            var origins = collectTurnstileTransformOrigins(outgoingElements);\n            return animRotationTransform(\n                outgoingElements,\n                origins,\n                [{\n                    property: transformNames.cssName,\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 128,\n                    timing: \"cubic-bezier(0.4925,0.01,0.7675,-0.01)\",\n                    from: \"perspective(800px) rotateY(0deg)\",\n                    to: \"perspective(800px) rotateY(80deg)\",\n                },\n                {\n                    property: \"opacity\",\n                    delay: staggerDelay(0, 50, 1, 1000),\n                    duration: 128,\n                    timing: \"cubic-bezier(1,-0.42,0.995,-0.425)\",\n                    from: 1,\n                    to: 0,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"turnstileBackwardOut,StopTM\"); });\n        },\n\n        slideDown: function (outgoingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.slideDown\">\n            /// <summary locid=\"WinJS.UI.Animation.slideDown\">\n            /// Execute a slide down animation.\n            /// </summary>\n            /// <param name=\"outgoingElements\" locid=\"WinJS.UI.Animation.slideDown_p:outgoingElements\">\n            /// Single element or collection of elements to animate sliding down.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.slideDown_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"slideDown,StartTM\");\n\n            return animRotationTransform(\n                outgoingElements,\n                { ltr: \"\", rtl: \"\" },\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 250,\n                    timing: \"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)\",\n                    from: \"translate(0px, 0px)\",\n                    to: \"translate(0px, 200px)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 250,\n                    timing: \"cubic-bezier(1,-0.42,0.995,-0.425)\",\n                    from: 1,\n                    to: 0\n                }])\n                .then(function () { writeAnimationProfilerMark(\"slideDown,StopTM\"); });\n        },\n\n        slideUp: function (incomingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.slideUp\">\n            /// <summary locid=\"WinJS.UI.Animation.slideUp\">\n            /// Execute a slide up animation.\n            /// </summary>\n            /// <param name=\"incomingElements\" locid=\"WinJS.UI.Animation.slideUp_p:incomingElements\">\n            /// Single element or collection of elements to animate sliding up.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.slideUp_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"slideUp,StartTM\");\n\n            return animRotationTransform(\n                incomingElements,\n                { ltr: \"\", rtl: \"\" },\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0.17,0.79,0.215,1.0025)\",\n                    from: \"translate(0px, 200px)\",\n                    to: \"translate(0px, 0px)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: staggerDelay(0, 34, 1, 1000),\n                    duration: 350,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"slideUp,StopTM\"); });\n        },\n\n        slideRightIn: function (page, firstIncomingElements, secondIncomingElements, thirdIncomingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.slideRightIn\">\n            /// <summary locid=\"WinJS.UI.Animation.slideRightIn\">\n            /// Execute a slide in from left to right animation.\n            /// </summary>\n            /// <param name=\"page\" locid=\"WinJS.UI.Animation.slideRightIn_p:page\">\n            /// The page containing all elements to slide.\n            /// </param>\n            /// <param name=\"firstIncomingElements\" locid=\"WinJS.UI.Animation.slideRightIn_p:firstIncomingElements\">\n            /// First element or collection of elements to animate sliding in.\n            /// </param>\n            /// <param name=\"secondIncomingElements\" locid=\"WinJS.UI.Animation.slideRightIn_p:secondIncomingElements\">\n            /// Second element or collection of elements to animate sliding in, which will be offset slightly farther than the first.\n            /// </param>\n            /// <param name=\"thirdIncomingElements\" locid=\"WinJS.UI.Animation.slideRightIn_p:thirdIncomingElements\">\n            /// Third element or collection of elements to animate sliding in, which will be offset slightly farther than the second.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.slideRightIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"slideRightIn,StartTM\");\n\n            return animStaggeredSlide(\"cubic-bezier(0.17,0.79,0.215,1.0025)\", -_Global.innerWidth, 0, true, page, firstIncomingElements, secondIncomingElements, thirdIncomingElements)\n                .then(function () { writeAnimationProfilerMark(\"slideRightIn,StopTM\"); });\n        },\n\n        slideRightOut: function (page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.slideRightOut\">\n            /// <summary locid=\"WinJS.UI.Animation.slideRightOut\">\n            /// Execute a slide out from left to right animation.\n            /// </summary>\n            /// <param name=\"page\" locid=\"WinJS.UI.Animation.slideRightOut_p:page\">\n            /// The page containing all elements to slide.\n            /// </param>\n            /// <param name=\"firstOutgoingElements\" locid=\"WinJS.UI.Animation.slideRightOut_p:firstOutgoingElements\">\n            /// First element or collection of elements to animate sliding out.\n            /// </param>\n            /// <param name=\"secondOutgoingElements\" locid=\"WinJS.UI.Animation.slideRightOut_p:secondOutgoingElements\">\n            /// Second element or collection of elements to animate sliding out, which will be offset slightly farther than the first.\n            /// </param>\n            /// <param name=\"thirdOutgoingElements\" locid=\"WinJS.UI.Animation.slideRightOut_p:thirdOutgoingElements\">\n            /// Third element or collection of elements to animate sliding out, which will be offset slightly farther than the second.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.slideRightOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"slideRightOut,StartTM\");\n\n            return animStaggeredSlide(\"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)\", 0, _Global.innerWidth, false, page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements)\n                .then(function () { writeAnimationProfilerMark(\"slideRightOut,StopTM\"); });\n        },\n\n        slideLeftIn: function (page, firstIncomingElements, secondIncomingElements, thirdIncomingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.slideLeftIn\">\n            /// <summary locid=\"WinJS.UI.Animation.slideLeftIn\">\n            /// Execute a slide in from right to left animation.\n            /// </summary>\n            /// <param name=\"page\" locid=\"WinJS.UI.Animation.slideLeftIn_p:page\">\n            /// The page containing all elements to slide.\n            /// </param>\n            /// <param name=\"firstIncomingElements\" locid=\"WinJS.UI.Animation.slideLeftIn_p:firstIncomingElements\">\n            /// First element or collection of elements to animate sliding in.\n            /// </param>\n            /// <param name=\"secondIncomingElements\" locid=\"WinJS.UI.Animation.slideLeftIn_p:secondIncomingElements\">\n            /// Second element or collection of elements to animate sliding in, which will be offset slightly farther than the first.\n            /// </param>\n            /// <param name=\"thirdIncomingElements\" locid=\"WinJS.UI.Animation.slideLeftIn_p:thirdIncomingElements\">\n            /// Third element or collection of elements to animate sliding in, which will be offset slightly farther than the second.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.slideLeftIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"slideLeftIn,StartTM\");\n\n            return animStaggeredSlide(\"cubic-bezier(0.17,0.79,0.215,1.0025)\", _Global.innerWidth, 0, true, page, firstIncomingElements, secondIncomingElements, thirdIncomingElements)\n                .then(function () { writeAnimationProfilerMark(\"slideLeftIn,StopTM\"); });\n        },\n\n        slideLeftOut: function (page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.slideLeftOut\">\n            /// <summary locid=\"WinJS.UI.Animation.slideLeftOut\">\n            /// Execute a slide out from right to left animation.\n            /// </summary>\n            /// <param name=\"page\" locid=\"WinJS.UI.Animation.slideLeftOut_p:page\">\n            /// The page containing all elements to slide.\n            /// </param>\n            /// <param name=\"firstOutgoingElements\" locid=\"WinJS.UI.Animation.slideLeftOut_p:firstOutgoingElements\">\n            /// First element or collection of elements to animate sliding out.\n            /// </param>\n            /// <param name=\"secondOutgoingElements\" locid=\"WinJS.UI.Animation.slideLeftOut_p:secondOutgoingElements\">\n            /// Second element or collection of elements to animate sliding out, which will be offset slightly farther than the first.\n            /// </param>\n            /// <param name=\"thirdOutgoingElements\" locid=\"WinJS.UI.Animation.slideLeftOut_p:thirdOutgoingElements\">\n            /// Third element or collection of elements to animate sliding out, which will be offset slightly farther than the second.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.slideLeftOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"slideLeftOut,StartTM\");\n\n            return animStaggeredSlide(\"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)\", 0, -_Global.innerWidth, false, page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements)\n                .then(function () { writeAnimationProfilerMark(\"slideLeftOut,StopTM\"); });\n        },\n\n        continuumForwardIn: function (incomingPage, incomingItemRoot, incomingItemContent) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.continuumForwardIn\">\n            /// <summary locid=\"WinJS.UI.Animation.continuumForwardIn\">\n            /// Execute a continuum animation, scaling up the incoming page while scaling, rotating, and translating the incoming item.\n            /// </summary>\n            /// <param name=\"incomingPage\" locid=\"WinJS.UI.Animation.continuumForwardIn_p:incomingPage\">\n            /// Single element to be scaled up that is the page root and does not contain the incoming item.\n            /// </param>\n            /// <param name=\"incomingItemRoot\" locid=\"WinJS.UI.Animation.continuumForwardIn_p:incomingItemRoot\">\n            /// Root of the item that will be translated as part of the continuum animation.\n            /// </param>\n            /// <param name=\"incomingItemContent\" locid=\"WinJS.UI.Animation.continuumForwardIn_p:incomingItemContent\">\n            /// Content of the item that will be scaled and rotated as part of the continuum animation.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.continuumForwardIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"continuumForwardIn,StartTM\");\n\n            return Promise.join([\n                _TransitionAnimation.executeTransition(incomingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0.33, 0.18, 0.11, 1)\",\n                    from: \"scale(0.5, 0.5)\",\n                    to: \"scale(1.0, 1.0)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }]),\n                _TransitionAnimation.executeTransition(incomingItemRoot,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0.24,1.15,0.11,1.1575)\",\n                    from: \"translate(0px, 225px)\",\n                    to: \"translate(0px, 0px)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }]),\n                animRotationTransform(incomingItemContent, { ltr: \"0px 50%\", rtl: \"100% 50%\" },\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0,0.62,0.8225,0.9625)\",\n                    from: \"rotateX(80deg) scale(1.5, 1.5)\",\n                    to: \"rotateX(0deg) scale(1.0, 1.0)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 350,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }])\n            ])\n            .then(function () { writeAnimationProfilerMark(\"continuumForwardIn,StopTM\"); });\n        },\n\n        continuumForwardOut: function (outgoingPage, outgoingItem) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.continuumForwardOut\">\n            /// <summary locid=\"WinJS.UI.Animation.continuumForwardOut\">\n            /// Execute a continuum animation, scaling down the outgoing page while scaling, rotating, and translating the outgoing item.\n            /// </summary>\n            /// <param name=\"outgoingPage\" locid=\"WinJS.UI.Animation.continuumForwardOut_p:outgoingPage\">\n            /// Single element to be scaled down that is the page root and contains the outgoing item.\n            /// </param>\n            /// <param name=\"outgoingItem\" locid=\"WinJS.UI.Animation.continuumForwardOut_p:outgoingItem\">\n            /// Single element to be scaled, rotated, and translated away from the outgoing page.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.continuumForwardOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"continuumForwardOut,StartTM\");\n\n            return Promise.join([\n                _TransitionAnimation.executeTransition(outgoingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 120,\n                    timing: \"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)\",\n                    from: \"scale(1.0, 1.0)\",\n                    to: \"scale(1.1, 1.1)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 120,\n                    timing: \"cubic-bezier(1,-0.42,0.995,-0.425)\",\n                    from: 1,\n                    to: 0,\n                }]),\n                animRotationTransform(outgoingItem, { ltr: \"0px 100%\", rtl: \"100% 100%\" },\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 152,\n                    timing: \"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)\",\n                    from: \"rotateX(0deg) scale(1.0, 1.0) translate(0px, 0px)\",\n                    to: \"rotateX(80deg) scale(1.5, 1.5) translate(0px, 150px)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 152,\n                    timing: \"cubic-bezier(1,-0.42,0.995,-0.425)\",\n                    from: 1,\n                    to: 0,\n                }])\n            ])\n            .then(function () { writeAnimationProfilerMark(\"continuumForwardOut,StopTM\"); });\n        },\n\n        continuumBackwardIn: function (incomingPage, incomingItem) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.continuumBackwardIn\">\n            /// <summary locid=\"WinJS.UI.Animation.continuumBackwardIn\">\n            /// Execute a continuum animation, scaling down the incoming page while scaling, rotating, and translating the incoming item.\n            /// </summary>\n            /// <param name=\"incomingPage\" locid=\"WinJS.UI.Animation.continuumBackwardIn_p:incomingPage\">\n            /// Single element to be scaled down that is the page root and contains the incoming item.\n            /// </param>\n            /// <param name=\"incomingItem\" locid=\"WinJS.UI.Animation.continuumBackwardIn_p:incomingItem\">\n            /// Single element to be scaled, rotated, and translated into its final position on the page.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.continuumBackwardIn_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"continuumBackwardIn,StartTM\");\n\n            return Promise.join([\n                _TransitionAnimation.executeTransition(incomingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 200,\n                    timing: \"cubic-bezier(0.33, 0.18, 0.11, 1)\",\n                    from: \"scale(1.25, 1.25)\",\n                    to: \"scale(1.0, 1.0)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 200,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }]),\n                animRotationTransform(incomingItem, { ltr: \"0px 50%\", rtl: \"100% 50%\" },\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 250,\n                    timing: \"cubic-bezier(0.2975, 0.7325, 0.4725, 0.99)\",\n                    from: \"rotateX(80deg) translate(0px, -100px)\",\n                    to: \"rotateX(0deg) translate(0px, 0px)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 250,\n                    timing: \"cubic-bezier(0, 2, 0, 2)\",\n                    from: 0,\n                    to: 1,\n                }])\n            ])\n            .then(function () { writeAnimationProfilerMark(\"continuumBackwardIn,StopTM\"); });\n        },\n\n        continuumBackwardOut: function (outgoingPage) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.continuumBackwardOut\">\n            /// <summary locid=\"WinJS.UI.Animation.continuumBackwardOut\">\n            /// Execute a continuum animation, scaling down the outgoing page while fading it out.\n            /// </summary>\n            /// <param name=\"outgoingPage\" locid=\"WinJS.UI.Animation.continuumBackwardOut_p:outgoingPage\">\n            /// Single element to be scaled down that is the page root.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.continuumBackwardOut_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"continuumBackwardOut,StartTM\");\n\n            return _TransitionAnimation.executeTransition(outgoingPage,\n            [{\n                property: transformNames.cssName,\n                delay: 0,\n                duration: 167,\n                timing: \"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)\",\n                from: \"scale(1.0, 1.0)\",\n                to: \"scale(0.5, 0.5)\"\n            },\n            {\n                property: \"opacity\",\n                delay: 0,\n                duration: 167,\n                timing: \"cubic-bezier(1,-0.42,0.995,-0.425)\",\n                from: 1,\n                to: 0,\n            }])\n            .then(function () { writeAnimationProfilerMark(\"continuumBackwardOut,StopTM\"); });\n        },\n\n        drillInIncoming: function (incomingPage) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.drillInIncoming\">\n            /// <summary locid=\"WinJS.UI.Animation.drillInIncoming\">\n            /// Execute the incoming phase of the drill in animation, scaling up the incoming page while fading it in.\n            /// </summary>\n            /// <param name=\"incomingPage\" locid=\"WinJS.UI.Animation.drillInIncoming_p:incomingPage\">\n            /// Element to be scaled up and faded in.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.drillInIncoming_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"drillInIncoming,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                incomingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: \"scale(0.84)\",\n                    to: \"scale(1.0)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: 0,\n                    to: 1,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"drillInIncoming,StopTM\"); });\n        },\n\n        drillInOutgoing: function (outgoingPage) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.drillInOutgoing\">\n            /// <summary locid=\"WinJS.UI.Animation.drillInOutgoing\">\n            /// Execute the outgoing phase of the drill in animation, scaling up the outgoing page while fading it out.\n            /// </summary>\n            /// <param name=\"outgoingPage\" locid=\"WinJS.UI.Animation.drillInOutgoing_p:outgoingPage\">\n            /// Element to be scaled up and faded out.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.drillInOutgoing_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"drillInOutgoing,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                outgoingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 233,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: \"scale(1.0)\",\n                    to: \"scale(1.29)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 233,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: 1,\n                    to: 0,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"drillInOutgoing,StopTM\"); });\n        },\n\n        drillOutIncoming: function (incomingPage) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.drillOutIncoming\">\n            /// <summary locid=\"WinJS.UI.Animation.drillOutIncoming\">\n            /// Execute the incoming phase of the drill out animation, scaling down the incoming page while fading it in.\n            /// </summary>\n            /// <param name=\"incomingPage\" locid=\"WinJS.UI.Animation.drillOutIncoming_p:incomingPage\">\n            /// Element to be scaled up and faded in.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.drillOutIncoming_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"drillOutIncoming,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                incomingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: \"scale(1.29)\",\n                    to: \"scale(1.0)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 500,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: 0,\n                    to: 1,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"drillOutIncoming,StopTM\"); });\n        },\n\n        drillOutOutgoing: function (outgoingPage) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.drillOutOutgoing\">\n            /// <summary locid=\"WinJS.UI.Animation.drillOutOutgoing\">\n            /// Execute the outgoing phase of the drill out animation, scaling down the outgoing page while fading it out.\n            /// </summary>\n            /// <param name=\"outgoingPage\" locid=\"WinJS.UI.Animation.drillOutOutgoing_p:outgoingPage\">\n            /// Element to be scaled down and faded out.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Animation.drillOutOutgoing_returnValue\">\n            /// Promise object that completes when the animation is complete.\n            /// </returns>\n            /// </signature>\n            writeAnimationProfilerMark(\"drillOutOutgoing,StartTM\");\n\n            return _TransitionAnimation.executeTransition(\n                outgoingPage,\n                [{\n                    property: transformNames.cssName,\n                    delay: 0,\n                    duration: 233,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: \"scale(1.0)\",\n                    to: \"scale(0.84)\"\n                },\n                {\n                    property: \"opacity\",\n                    delay: 0,\n                    duration: 233,\n                    timing: \"cubic-bezier(0.1,0.9,0.2,1)\",\n                    from: 1,\n                    to: 0,\n                }])\n                .then(function () { writeAnimationProfilerMark(\"drillOutOutgoing,StopTM\"); });\n        },\n\n        createPageNavigationAnimations: function (currentPreferredAnimation, nextPreferredAnimation, movingBackwards) {\n            /// <signature helpKeyword=\"WinJS.UI.Animation.createPageNavigationAnimations\" >\n            /// <summary locid=\"WinJS.UI.Animation.createPageNavigationAnimations\">\n            /// Creates an exit and entrance animation to play for a page navigation given the current and incoming pages'\n            /// animation preferences and whether the pages are navigating forwards or backwards.\n            /// </summary>\n            /// <param name=\"currentPreferredAnimation\" locid=\"WinJS.UI.Animation.createPageNavigationAnimations_p:currentPreferredAnimation\">\n            /// A value from WinJS.UI.PageNavigationAnimation describing the animation the current page prefers to use.\n            /// </param>\n            /// <param name=\"nextPreferredAnimation\" locid=\"WinJS.UI.Animation.createPageNavigationAnimations_p:nextPreferredAnimation\">\n            /// A value from WinJS.UI.PageNavigationAnimation describing the animation the incoming page prefers to use.\n            /// </param>\n            /// <param name=\"movingBackwards\" locid=\"WinJS.UI.Animation.createPageNavigationAnimations_p:movingBackwards\">\n            /// Boolean value for whether the navigation is moving backwards.\n            /// </param>\n            /// <returns type=\"{ entrance: Function, exit: Function }\" locid=\"WinJS.UI.Animation.createPageNavigationAnimations_returnValue\">\n            /// Returns an object containing the exit and entrance animations to play based on the parameters given.\n            /// </returns>\n            /// </signature>\n            function emptyAnimationFunction() {\n                return Promise.wrap();\n            }\n\n            return {\n                exit: emptyAnimationFunction,\n                entrance: exports.enterPage\n            };\n        },\n\n        // Plays an animation which makes an element look like it is resizing in 1 dimension. Arguments:\n        // - elementClipper: The parent of *element*. It shouldn't have any margin, border, or padding and its\n        //   size should match element's size. Its purpose is to clip *element* during the animation to give\n        //   it the illusion that it is resizing.\n        // - element: The element that should look like it's resizing.\n        // - args: An object with the following properties (each is required unless noted otherwise):\n        //   - from: A number representing the old total width/height of the element.\n        //   - to: A number representing the new total width/height of the element.\n        //   - actualSize: A number representing the actual total width/height of the element (should be at least\n        //     as big as from and to). The element should be at *actualSize* when this function is called.\n        //     from/to/actualSize represent the width/height of *element*'s margin box (e.g. getTotalWidth).\n        //   - dimension: The dimension on which *element* is resizing. Either \"width\" or \"height\".\n        //   - anchorTrailingEdge (optional): During the resize animation, one edge will move and the other\n        //     edge will remain where it is. This flag specifies which edge is anchored (i.e. won't move).\n        //   - duration (optional): Number representing the duration of the animation in milliseconds.\n        //   - timing (optional): String representing the CSS timing function that controls the progress of the animation.\n        //\n        _resizeTransition: function Utilities_resizeTransition(elementClipper, element, args) {\n            if (args.to === args.from || !_TransitionAnimation.isAnimationEnabled()) {\n                return Promise.as();\n            } else {\n                var animationsToPlay = resizeTransition(elementClipper, element, args);\n                var animationPromises = [];\n                for (var i = 0, len = animationsToPlay.length; i < len; i++) {\n                    animationPromises.push(transformWithTransition(animationsToPlay[i].element, animationsToPlay[i].transition));\n                }\n                return Promise.join(animationPromises);\n            }\n        },\n\n        _commandingSurfaceOpenAnimation: function Utilities_commandingSurfaceOpenAnimation(args) {\n            if (!_TransitionAnimation.isAnimationEnabled()) {\n                return Promise.as();\n            }\n\n            var actionAreaClipper = args.actionAreaClipper,\n                actionArea = args.actionArea,\n                overflowAreaClipper = args.overflowAreaClipper,\n                overflowArea = args.overflowArea,\n                closedHeight = args.oldHeight,\n                openedHeight = args.newHeight,\n                overflowAreaHeight = args.overflowAreaHeight,\n                menuPositionedAbove = args.menuPositionedAbove;\n            var deltaHeight = openedHeight - closedHeight;\n            var actionAreaAnimations = [];\n            var transitionToUse = getResizeDefaultTransitions().defaultResizeGrowTransition;\n\n            // The commanding surface open animation is a combination of animations. We need to animate the actionArea and overflowArea\n            // elements expanding and appearing. The first animation we prepare is the animation on the actionArea. This animation changes depending\n            // on whether the overflow menu will appear above or below the commanding surface.\n            // When the menu is positioned above, we can do a simple translation to get the animation we want.\n            // When the menu is positioned below, we have to do a resize transition using the actionArea's clipper in order to animate the surface expanding.\n            // In either case, we don't want to play the animation immediately because the overflowArea's animation still needs to be set up,\n            // The animations that need to be played on the actionArea elements will be stored in actionAreaAnimations until after the overflowArea\n            // animations are prepared, so that we can begin every animation at once. We do this to avoid a small 1-2px gap appearing between the overflowArea\n            // and the actionArea that would appear were we to start these animations at separate times\n            if (menuPositionedAbove) {\n                actionArea.style[transformNames.scriptName] = \"translateY(\" + deltaHeight + \"px)\";\n                _Global.getComputedStyle(actionArea).opacity;\n                var transition = _BaseUtils._merge(transitionToUse, { to: \"translateY(0px)\" });\n                actionAreaAnimations.push({ element: actionArea, transition: transition });\n            } else {\n                actionAreaAnimations = resizeTransition(actionAreaClipper, actionArea, {\n                    from: closedHeight,\n                    to: openedHeight,\n                    actualSize: openedHeight,\n                    dimension: \"height\",\n                    anchorTrailingEdge: false\n                });\n            }\n\n            // Now we set up the overflowArea animations. The overflowArea animation has two parts:\n            // The first animation is played on the overflowAreaClipper. This animation is a translation animation that we play that makes it look like the\n            // overflow menu is moving up along with the actionArea as it expands.\n            // The next animation is played on the overflowArea itself, which we animate up/down by the full size of the overflowArea. \n            // When combined, it makes it look like the overflowArea is sliding in its content while it slides up with the actionArea.\n            // Since the overflowArea and its clipper are in their final positions when this animation function is called, we apply an opposite translation\n            // to move them both to where they would have been just before the surface opened, then animate them going to translateY(0).\n            overflowAreaClipper.style[transformNames.scriptName] = \"translateY(\" + (menuPositionedAbove ? deltaHeight : -deltaHeight) + \"px)\";\n            overflowArea.style[transformNames.scriptName] = \"translateY(\" + (menuPositionedAbove ? overflowAreaHeight : -overflowAreaHeight) + \"px)\";\n\n            // Resolve styles on the overflowArea and overflowAreaClipper to prepare them for animation\n            _Global.getComputedStyle(overflowAreaClipper).opacity;\n            _Global.getComputedStyle(overflowArea).opacity;\n\n            var animationPromises = [];\n            for (var i = 0, len = actionAreaAnimations.length; i < len; i++) {\n                animationPromises.push(transformWithTransition(actionAreaAnimations[i].element, actionAreaAnimations[i].transition));\n            }\n            var overflowAreaTransition = _BaseUtils._merge(transitionToUse, { to: \"translateY(0px)\" });\n            animationPromises.push(transformWithTransition(overflowAreaClipper, overflowAreaTransition));\n            animationPromises.push(transformWithTransition(overflowArea, overflowAreaTransition));\n            return Promise.join(animationPromises);\n        },\n\n        _commandingSurfaceCloseAnimation: function Utilities_commandingSurfaceCloseAnimation(args) {\n            if (!_TransitionAnimation.isAnimationEnabled()) {\n                return Promise.as();\n            }\n\n            var actionAreaClipper = args.actionAreaClipper,\n                actionArea = args.actionArea,\n                overflowAreaClipper = args.overflowAreaClipper,\n                overflowArea = args.overflowArea,\n                openedHeight = args.oldHeight,\n                closedHeight = args.newHeight,\n                overflowAreaHeight = args.overflowAreaHeight,\n                menuPositionedAbove = args.menuPositionedAbove;\n            var deltaHeight = closedHeight - openedHeight;\n            var actionAreaAnimations = [];\n            var transitionToUse = getResizeDefaultTransitions().defaultResizeShrinkTransition;\n            if (menuPositionedAbove) {\n                actionArea.style[transformNames.scriptName] = \"translateY(0px)\";\n                _Global.getComputedStyle(actionArea).opacity;\n                var transition = _BaseUtils._merge(transitionToUse, { to: \"translateY(\" + -deltaHeight + \"px)\" });\n                actionAreaAnimations.push({ element: actionArea, transition: transition });\n            } else {\n                actionAreaAnimations = resizeTransition(actionAreaClipper, actionArea, {\n                    from: openedHeight,\n                    to: closedHeight,\n                    actualSize: openedHeight,\n                    dimension: \"height\",\n                    anchorTrailingEdge: false\n                });\n            }\n            // Set up\n            overflowAreaClipper.style[transformNames.scriptName] = \"translateY(0px)\";\n            overflowArea.style[transformNames.scriptName] = \"translateY(0px)\";\n\n            // Resolve styles on the overflowArea and overflowAreaClipper to prepare them for animation\n            _Global.getComputedStyle(overflowAreaClipper).opacity;\n            _Global.getComputedStyle(overflowArea).opacity;\n\n            // Now that everything's set up, we can kick off all the animations in unision\n            var animationPromises = [];\n            for (var i = 0, len = actionAreaAnimations.length; i < len; i++) {\n                animationPromises.push(transformWithTransition(actionAreaAnimations[i].element, actionAreaAnimations[i].transition));\n            }\n            var overflowAreaClipperTransition = _BaseUtils._merge(transitionToUse, { to: \"translateY(\" + (menuPositionedAbove ? -deltaHeight : deltaHeight) + \"px)\" });\n            var overflowAreaTransition = _BaseUtils._merge(transitionToUse, { to: \"translateY(\" + (menuPositionedAbove ? overflowAreaHeight : -overflowAreaHeight) + \"px)\" });\n            animationPromises.push(transformWithTransition(overflowAreaClipper, overflowAreaClipperTransition));\n            animationPromises.push(transformWithTransition(overflowArea, overflowAreaTransition));\n            return Promise.join(animationPromises);\n        }\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Binding/_BindingParser',[\n    'exports',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../ControlProcessor/_OptionsLexer',\n    '../ControlProcessor/_OptionsParser'\n    ], function bindingParserInit(exports, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, _OptionsLexer, _OptionsParser) {\n    \"use strict\";\n\n\n    var strings = {\n        get invalidBinding() { return \"Invalid binding:'{0}'. Expected to be '<destProp>:<sourceProp>;'. {1}\"; },\n        get bindingInitializerNotFound() { return \"Initializer not found:'{0}'\"; },\n    };\n\n/*\n    See comment for data-win-options attribute grammar for context.\n\n    Syntactic grammar for the value of the data-win-bind attribute.\n\n        BindDeclarations:\n            BindDeclaration\n            BindDeclarations ; BindDeclaration\n\n        BindDeclaration:\n            DestinationPropertyName : SourcePropertyName\n            DestinationPropertyName : SourcePropertyName InitializerName\n\n        DestinationPropertyName:\n            IdentifierExpression\n\n        SourcePropertyName:\n            IdentifierExpression\n\n        InitializerName:\n            IdentifierExpression\n\n        Value:\n            NumberLiteral\n            StringLiteral\n\n        AccessExpression:\n            [ Value ]\n            . Identifier\n\n        AccessExpressions:\n            AccessExpression\n            AccessExpressions AccessExpression\n\n        IdentifierExpression:\n            Identifier\n            Identifier AccessExpressions\n\n*/\n    var imports = _Base.Namespace.defineWithParent(null, null, {\n        lexer: _Base.Namespace._lazy(function () {\n            return _OptionsLexer._optionsLexer;\n        }),\n        tokenType: _Base.Namespace._lazy(function () {\n            return _OptionsLexer._optionsLexer.tokenType;\n        }),\n    });\n\n    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n\n    var local = _Base.Namespace.defineWithParent(null, null, {\n\n        BindingInterpreter: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(_OptionsParser.optionsParser._BaseInterpreter, function (tokens, originalSource, context) {\n                this._initialize(tokens, originalSource, context);\n            }, {\n                _error: function (message) {\n                    throw new _ErrorFromName(\"WinJS.Binding.ParseError\", _Resources._formatString(strings.invalidBinding, this._originalSource, message));\n                },\n                _evaluateInitializerName: function () {\n                    if (this._current.type === imports.tokenType.identifier) {\n                        var initializer = this._evaluateIdentifierExpression();\n                        if (_Log.log && !initializer) {\n                            _Log.log(_Resources._formatString(strings.bindingInitializerNotFound, this._originalSource), \"winjs binding\", \"error\");\n                        }\n                        return requireSupportedForProcessing(initializer);\n                    }\n                    return;\n                },\n                _evaluateValue: function () {\n                    switch (this._current.type) {\n                        case imports.tokenType.stringLiteral:\n                        case imports.tokenType.numberLiteral:\n                            var value = this._current.value;\n                            this._read();\n                            return value;\n\n                        default:\n                            this._unexpectedToken(imports.tokenType.stringLiteral, imports.tokenType.numberLiteral);\n                            return;\n                    }\n                },\n                _readBindDeclarations: function () {\n                    var bindings = [];\n                    while (true) {\n                        switch (this._current.type) {\n                            case imports.tokenType.identifier:\n                            case imports.tokenType.thisKeyword:\n                                bindings.push(this._readBindDeclaration());\n                                break;\n\n                            case imports.tokenType.semicolon:\n                                this._read();\n                                break;\n\n                            case imports.tokenType.eof:\n                                return bindings;\n\n                            default:\n                                this._unexpectedToken(imports.tokenType.identifier, imports.tokenType.semicolon, imports.tokenType.eof);\n                                return;\n                        }\n                    }\n                },\n                _readBindDeclaration: function () {\n                    var dest = this._readDestinationPropertyName();\n                    this._read(imports.tokenType.colon);\n                    var src = this._readSourcePropertyName();\n                    var initializer = this._evaluateInitializerName();\n                    return {\n                        destination: dest,\n                        source: src,\n                        initializer: initializer,\n                    };\n                },\n                _readDestinationPropertyName: function () {\n                    return this._readIdentifierExpression();\n                },\n                _readSourcePropertyName: function () {\n                    return this._readIdentifierExpression();\n                },\n                run: function () {\n                    return this._readBindDeclarations();\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        BindingParser: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(local.BindingInterpreter, function (tokens, originalSource) {\n                this._initialize(tokens, originalSource, {});\n            }, {\n                _readInitializerName: function () {\n                    if (this._current.type === imports.tokenType.identifier) {\n                        return this._readIdentifierExpression();\n                    }\n                    return;\n                },\n                _readBindDeclaration: function () {\n                    var dest = this._readDestinationPropertyName();\n                    this._read(imports.tokenType.colon);\n                    var src = this._readSourcePropertyName();\n                    var initializer = this._readInitializerName();\n                    return {\n                        destination: dest,\n                        source: src,\n                        initializer: initializer,\n                    };\n                },\n            }, {\n                supportedForProcessing: false,\n            });\n        })\n\n    });\n\n    function parser(text, context) {\n        _WriteProfilerMark(\"WinJS.Binding:bindingParser,StartTM\");\n        var tokens = imports.lexer(text);\n        var interpreter = new local.BindingInterpreter(tokens, text, context || {});\n        var res = interpreter.run();\n        _WriteProfilerMark(\"WinJS.Binding:bindingParser,StopTM\");\n        return res;\n    }\n\n    function parser2(text) {\n        _WriteProfilerMark(\"WinJS.Binding:bindingParser,StartTM\");\n        var tokens = imports.lexer(text);\n        var interpreter = new local.BindingParser(tokens, text);\n        var res = interpreter.run();\n        _WriteProfilerMark(\"WinJS.Binding:bindingParser,StopTM\");\n        return res;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n        _bindingParser: parser,\n        _bindingParser2: parser2,\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Binding/_DomWeakRefTable',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Scheduler'\n    ], function DOMWeakRefTableInit(exports, _Global, _WinRT, _Base, _BaseUtils, Scheduler) {\n    \"use strict\";\n\n    if (_WinRT.Windows.Foundation.Uri && _WinRT.msSetWeakWinRTProperty && _WinRT.msGetWeakWinRTProperty) {\n\n        var host = new _WinRT.Windows.Foundation.Uri(\"about://blank\");\n\n        _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\", {\n\n            _createWeakRef: function (element, id) {\n                _WinRT.msSetWeakWinRTProperty(host, id, element);\n                return id;\n            },\n\n            _getWeakRefElement: function (id) {\n                return _WinRT.msGetWeakWinRTProperty(host, id);\n            }\n\n        });\n\n        return;\n\n    }\n\n    // Defaults\n    var SWEEP_PERIOD = 500;\n    var TIMEOUT = 1000;\n    var table = {};\n    var cleanupToken;\n    var noTimeoutUnderDebugger = true;\n    var fastLoadPath = false;\n\n    function cleanup() {\n        if (SWEEP_PERIOD === 0) {     // If we're using post\n            cleanupToken = 0;          // indicate that cleanup has run\n        }\n        var keys = Object.keys(table);\n        var time = Date.now() - TIMEOUT;\n        var i, len;\n        for (i = 0, len = keys.length; i < len; i++) {\n            var id = keys[i];\n            if (table[id].time < time) {\n                delete table[id];\n            }\n        }\n        unscheduleCleanupIfNeeded();\n    }\n\n    function scheduleCleanupIfNeeded() {\n        if ((_Global.Debug && _Global.Debug.debuggerEnabled && noTimeoutUnderDebugger) || cleanupToken) {\n            return;\n        }\n        if (SWEEP_PERIOD === 0) {\n            Scheduler.schedule(cleanup, Scheduler.Priority.idle, null, \"WinJS.Utilities._DOMWeakRefTable.cleanup\");\n            cleanupToken = 1;\n        } else {\n            cleanupToken = _Global.setInterval(cleanup, SWEEP_PERIOD);\n        }\n    }\n\n    function unscheduleCleanupIfNeeded() {\n        if (_Global.Debug && _Global.Debug.debuggerEnabled && noTimeoutUnderDebugger) {\n            return;\n        }\n        if (SWEEP_PERIOD === 0) {                           // if we're using post\n            if (!cleanupToken) {                            // and there isn't already one scheduled\n                if (Object.keys(table).length !== 0) {      // and there are items in the table\n                    Scheduler.schedule(     // schedule another call to cleanup\n                        cleanup,\n                        Scheduler.Priority.idle,\n                        null, \"WinJS.Utilities._DOMWeakRefTable.cleanup\"\n                    );\n                    cleanupToken = 1;                       // and protect against overscheduling\n                }\n            }\n        } else if (cleanupToken) {\n            if (Object.keys(table).length === 0) {\n                _Global.clearInterval(cleanupToken);\n                cleanupToken = 0;\n            }\n        }\n    }\n\n    function createWeakRef(element, id) {\n        table[id] = { element: element, time: Date.now() };\n        scheduleCleanupIfNeeded();\n        return id;\n    }\n\n    function getWeakRefElement(id) {\n        if (fastLoadPath) {\n            var entry = table[id];\n            if (entry) {\n                return entry.element;\n            } else {\n                return _Global.document.getElementById(id);\n            }\n        } else {\n            var element = _Global.document.getElementById(id);\n            if (element) {\n                delete table[id];\n                unscheduleCleanupIfNeeded();\n            } else {\n                var entry = table[id];\n                if (entry) {\n                    entry.time = Date.now();\n                    element = entry.element;\n                }\n            }\n            return element;\n        }\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Utilities\",  {\n        _DOMWeakRefTable_noTimeoutUnderDebugger: {\n            get: function () {\n                return noTimeoutUnderDebugger;\n            },\n            set: function (value) {\n                noTimeoutUnderDebugger = value;\n            }\n        },\n        _DOMWeakRefTable_sweepPeriod: {\n            get: function () {\n                return SWEEP_PERIOD;\n            },\n            set: function (value) {\n                SWEEP_PERIOD = value;\n            }\n        },\n        _DOMWeakRefTable_timeout: {\n            get: function () {\n                return TIMEOUT;\n            },\n            set: function (value) {\n                TIMEOUT = value;\n            }\n        },\n        _DOMWeakRefTable_tableSize: { get: function () { return Object.keys(table).length; } },\n        _DOMWeakRefTable_fastLoadPath: {\n            get: function () {\n                return fastLoadPath;\n            },\n            set: function (value) {\n                fastLoadPath = value;\n            }\n        },\n        _createWeakRef: createWeakRef,\n        _getWeakRefElement: getWeakRefElement\n\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Binding/_Data',[\n    'exports',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Promise',\n    '../Scheduler',\n    './_DomWeakRefTable'\n    ], function dataInit(exports, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, Promise, Scheduler, _DomWeakRefTable) {\n    \"use strict\";\n\n\n    var strings = {\n        get exceptionFromBindingInitializer() { return \"Exception thrown from binding initializer: {0}\"; },\n        get propertyIsUndefined() { return \"{0} is undefined\"; },\n        get unsupportedDataTypeForBinding() { return \"Unsupported data type\"; },\n    };\n\n    var observableMixin = {\n        _listeners: null,\n        _pendingNotifications: null,\n        _notifyId: 0,\n\n        _getObservable: function () {\n            return this;\n        },\n\n        _cancel: function (name) {\n            var v = this._pendingNotifications;\n            var hit = false;\n            if (v) {\n                var k = Object.keys(v);\n                for (var i = k.length - 1; i >= 0; i--) {\n                    var entry = v[k[i]];\n                    if (entry.target === name) {\n                        if (entry.promise) {\n                            entry.promise.cancel();\n                            entry.promise = null;\n                        }\n                        delete v[k[i]];\n                        hit = true;\n                    }\n                }\n            }\n            return hit;\n        },\n\n        notify: function (name, newValue, oldValue) {\n            /// <signature helpKeyword=\"WinJS.Binding.observableMixin.notify\">\n            /// <summary locid=\"WinJS.Binding.observableMixin.notify\">\n            /// Notifies listeners that a property value was updated.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.observableMixin.notify_p:name\">The name of the property that is being updated.</param>\n            /// <param name=\"newValue\" type=\"Object\" locid=\"WinJS.Binding.observableMixin.notify_p:newValue\">The new value for the property.</param>\n            /// <param name=\"oldValue\" type=\"Object\" locid=\"WinJS.Binding.observableMixin.notify_p:oldValue\">The old value for the property.</param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Binding.observableMixin.notify_returnValue\">A promise that is completed when the notifications are complete.</returns>\n            /// </signature>\n            var listeners = this._listeners && this._listeners[name];\n            if (listeners) {\n                var that = this;\n\n                // Handle the case where we are updating a value that is currently updating\n                //\n                that._cancel(name);\n\n                // Starting new work, we cache the work description and queue up to do the notifications\n                //\n                that._pendingNotifications = that._pendingNotifications || {};\n                var x = that._notifyId++;\n                var cap = that._pendingNotifications[x] = { target: name };\n\n                var cleanup = function () {\n                    delete that._pendingNotifications[x];\n                };\n\n                // Binding guarantees async notification, so we do timeout()\n                //\n                cap.promise = Scheduler.schedulePromiseNormal(null, \"WinJS.Binding.observableMixin.notify\").\n                    then(function () {\n                        // cap.promise is removed after canceled, so we use this as a signal\n                        // to indicate that we should abort early\n                        //\n                        for (var i = 0, l = listeners.length; i < l && cap.promise; i++) {\n                            try {\n                                listeners[i](newValue, oldValue);\n                            }\n                            catch (e) {\n                                _Log.log && _Log.log(_Resources._formatString(strings.exceptionFromBindingInitializer, e.toString()), \"winjs binding\", \"error\");\n                            }\n                        }\n                        cleanup();\n                        return newValue;\n                    });\n\n                return cap.promise;\n            }\n\n            return Promise.as();\n        },\n\n        bind: function (name, action) {\n            /// <signature helpKeyword=\"WinJS.Binding.observableMixin.bind\">\n            /// <summary locid=\"WinJS.Binding.observableMixin.bind\">\n            /// Links the specified action to the property specified in the name parameter.\n            /// This function is invoked when the value of the property may have changed.\n            /// It is not guaranteed that the action will be called only when a value has actually changed,\n            /// nor is it guaranteed that the action will be called for every value change. The implementation\n            /// of this function coalesces change notifications, such that multiple updates to a property\n            /// value may result in only a single call to the specified action.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.observableMixin.bind_p:name\">\n            /// The name of the property to which to bind the action.\n            /// </param>\n            /// <param name=\"action\" type=\"function\" locid=\"WinJS.Binding.observableMixin.bind_p:action\">\n            /// The function to invoke asynchronously when the property may have changed.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Binding.observableMixin.bind_returnValue\">\n            /// This object is returned.\n            /// </returns>\n            /// </signature>\n\n            this._listeners = this._listeners || {};\n            var listeners = this._listeners[name] = this._listeners[name] || [];\n\n            // duplicate detection, multiple binds with the same action should have no effect\n            //\n            var found = false;\n            for (var i = 0, l = listeners.length; i < l; i++) {\n                if (listeners[i] === action) {\n                    found = true;\n                    break;\n                }\n            }\n\n            if (!found) {\n                listeners.push(action);\n\n                // out of band notification, we want to avoid a broadcast to all listeners\n                // so we can't just call notify.\n                //\n                action(unwrap(this[name]));\n            }\n            return this;\n        },\n\n        unbind: function (name, action) {\n            /// <signature helpKeyword=\"WinJS.Binding.observableMixin.unbind\">\n            /// <summary locid=\"WinJS.Binding.observableMixin.unbind\">\n            /// Removes one or more listeners from the notification list for a given property.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" optional=\"true\" locid=\"WinJS.Binding.observableMixin.unbind_p:name\">\n            /// The name of the property to unbind. If this parameter is omitted, all listeners\n            /// for all events are removed.\n            /// </param>\n            /// <param name=\"action\" type=\"function\" optional=\"true\" locid=\"WinJS.Binding.observableMixin.unbind_p:action\">\n            /// The function to remove from the listener list for the specified property. If this parameter is omitted, all listeners\n            /// are removed for the specific property.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Binding.observableMixin.unbind_returnValue\">\n            /// This object is returned.\n            /// </returns>\n            /// </signature>\n\n            this._listeners = this._listeners || {};\n\n            if (name && action) {\n                // this assumes we rarely have more than one\n                // listener, so we optimize to not do a lot of\n                // array manipulation, although it means we\n                // may do some extra GC churn in the other cases...\n                //\n                var listeners = this._listeners[name];\n                if (listeners) {\n                    var nl;\n                    for (var i = 0, l = listeners.length; i < l; i++) {\n                        if (listeners[i] !== action) {\n                            (nl = nl || []).push(listeners[i]);\n                        }\n                    }\n                    this._listeners[name] = nl;\n                }\n\n                // we allow any pending notification sweep to complete,\n                // which means that \"unbind\" inside of a notification\n                // will not prevent that notification from occuring.\n                //\n            } else if (name) {\n                this._cancel(name);\n                delete this._listeners[name];\n            } else {\n                var that = this;\n                if (that._pendingNotifications) {\n                    var v = that._pendingNotifications;\n                    that._pendingNotifications = {};\n                    Object.keys(v).forEach(function (k) {\n                        var n = v[k];\n                        if (n.promise) { n.promise.cancel(); }\n                    });\n                }\n                this._listeners = {};\n            }\n            return this;\n        }\n    };\n\n    var dynamicObservableMixin = {\n        _backingData: null,\n\n        _initObservable: function (data) {\n            this._backingData = data || {};\n        },\n\n        getProperty: function (name) {\n            /// <signature helpKeyword=\"WinJS.Binding.dynamicObservableMixin.getProperty\">\n            /// <summary locid=\"WinJS.Binding.dynamicObservableMixin.getProperty\">\n            /// Gets a property value by name.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.dynamicObservableMixin.getProperty_p:name\">\n            /// The name of property to get.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Binding.dynamicObservableMixin.getProperty_returnValue\">\n            /// The value of the property as an observable object.\n            /// </returns>\n            /// </signature>\n            var data = this._backingData[name];\n            if (_Log.log && data === undefined) {\n                _Log.log(_Resources._formatString(strings.propertyIsUndefined, name), \"winjs binding\", \"warn\");\n            }\n            return as(data);\n        },\n\n        setProperty: function (name, value) {\n            /// <signature helpKeyword=\"WinJS.Binding.dynamicObservableMixin.setProperty\">\n            /// <summary locid=\"WinJS.Binding.dynamicObservableMixin.setProperty\">\n            /// Updates a property value and notifies any listeners.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.dynamicObservableMixin.setProperty_p:name\">\n            /// The name of the property to update.\n            /// </param>\n            /// <param name=\"value\" locid=\"WinJS.Binding.dynamicObservableMixin.setProperty_p:value\">\n            /// The new value of the property.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Binding.dynamicObservableMixin.setProperty_returnValue\">\n            /// This object is returned.\n            /// </returns>\n            /// </signature>\n\n            this.updateProperty(name, value);\n            return this;\n        },\n\n        addProperty: function (name, value) {\n            /// <signature helpKeyword=\"WinJS.Binding.dynamicObservableMixin.addProperty\">\n            /// <summary locid=\"WinJS.Binding.dynamicObservableMixin.addProperty\">\n            /// Adds a property with change notification to this object, including a ECMAScript5 property definition.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.dynamicObservableMixin.addProperty_p:name\">\n            /// The name of the property to add.\n            /// </param>\n            /// <param name=\"value\" locid=\"WinJS.Binding.dynamicObservableMixin.addProperty_p:value\">\n            /// The value of the property.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Binding.dynamicObservableMixin.addProperty_returnValue\">\n            /// This object is returned.\n            /// </returns>\n            /// </signature>\n\n            // we could walk Object.keys to more deterministically determine this,\n            // however in the normal case this avoids a bunch of string compares\n            //\n            if (!this[name]) {\n                Object.defineProperty(this,\n                    name, {\n                        get: function () { return this.getProperty(name); },\n                        set: function (value) { this.setProperty(name, value); },\n                        enumerable: true,\n                        configurable: true\n                    }\n                );\n            }\n            return this.setProperty(name, value);\n        },\n\n        updateProperty: function (name, value) {\n            /// <signature helpKeyword=\"WinJS.Binding.dynamicObservableMixin.updateProperty\">\n            /// <summary locid=\"WinJS.Binding.dynamicObservableMixin.updateProperty\">\n            /// Updates a property value and notifies any listeners.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.dynamicObservableMixin.updateProperty_p:name\">\n            /// The name of the property to update.\n            /// </param>\n            /// <param name=\"value\" locid=\"WinJS.Binding.dynamicObservableMixin.updateProperty_p:value\">\n            /// The new value of the property.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Binding.dynamicObservableMixin.updateProperty_returnValue\">\n            /// A promise that completes when the notifications for\n            /// this property change have been processed. If multiple notifications are coalesced,\n            /// the promise may be canceled or the value of the promise may be updated.\n            /// The fulfilled value of the promise is the new value of the property for\n            /// which the notifications have been completed.\n            /// </returns>\n            /// </signature>\n\n            var oldValue = this._backingData[name];\n            var newValue = unwrap(value);\n            if (oldValue !== newValue) {\n                this._backingData[name] = newValue;\n\n                // This will complete when the listeners are notified, even\n                // if a new value is used. The only time this promise will fail\n                // (cancel) will be if we start notifying and then have to\n                // cancel in the middle of processing it. That's a pretty\n                // subtle contract.\n                //\n                // IE has a bug where readonly properties will not throw,\n                // even in strict mode, when set using a string accessor.\n                // To be consistent across browsers, only notify if the\n                // set succeeded.\n                if (this._backingData[name] === newValue) {\n                    return this.notify(name, newValue, oldValue);\n                }\n            }\n            return Promise.as();\n        },\n\n        removeProperty: function (name) {\n            /// <signature helpKeyword=\"WinJS.Binding.dynamicObservableMixin.removeProperty\">\n            /// <summary locid=\"WinJS.Binding.dynamicObservableMixin.removeProperty\">\n            /// Removes a property value.\n            /// </summary>\n            /// <param name=\"name\" type=\"String\" locid=\"WinJS.Binding.dynamicObservableMixin.removeProperty_p:name\">\n            /// The name of the property to remove.\n            /// </param>\n            /// <returns type=\"Object\" locid=\"WinJS.Binding.dynamicObservableMixin.removeProperty_returnValue\">\n            /// This object is returned.\n            /// </returns>\n            /// </signature>\n\n            var oldValue = this._backingData[name];\n            var value; // capture \"undefined\"\n            // in strict mode these may throw\n            try {\n                delete this._backingData[name];\n            } catch (e) { }\n            try {\n                delete this[name];\n            } catch (e) { }\n            this.notify(name, value, oldValue);\n            return this;\n        }\n    };\n\n    // Merge \"obsevable\" into \"dynamicObservable\"\n    //\n    Object.keys(observableMixin).forEach(function (k) {\n        dynamicObservableMixin[k] = observableMixin[k];\n    });\n\n\n    var bind = function (observable, bindingDescriptor) {\n        /// <signature helpKeyword=\"WinJS.Binding.bind\">\n        /// <summary locid=\"WinJS.Binding.bind\">\n        /// Binds to one or more properties on the observable object or or on child values\n        /// of that object.\n        /// </summary>\n        /// <param name=\"observable\" type=\"Object\" locid=\"WinJS.Binding.bind_p:observable\">\n        /// The object to bind to.\n        /// </param>\n        /// <param name=\"bindingDescriptor\" type=\"Object\" locid=\"WinJS.Binding.bind_p:bindingDescriptor\">\n        /// An object literal containing the binding declarations. Binding declarations take the form:\n        /// { propertyName: (function | bindingDeclaration), ... }\n        ///\n        /// For example, binding to a nested member of an object is declared like this:\n        /// bind(someObject, { address: { street: function(v) { ... } } });\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Binding.bind_returnValue\">\n        /// An object that contains at least a \"cancel\" field, which is\n        /// a function that removes all bindings associated with this bind\n        /// request.\n        /// </returns>\n        /// </signature>\n        return bindImpl(observable, bindingDescriptor);\n    };\n    var bindRefId = 0;\n    var createBindRefId = function () {\n        return \"bindHandler\" + (bindRefId++);\n    };\n    var createProxy = function (func, bindStateRef) {\n        if (!_WinRT.msGetWeakWinRTProperty) {\n            return func;\n        }\n\n        var id = createBindRefId();\n        _DomWeakRefTable._getWeakRefElement(bindStateRef)[id] = func;\n        return function (n, o) {\n            var bindState = _DomWeakRefTable._getWeakRefElement(bindStateRef);\n            if (bindState) {\n                bindState[id](n, o);\n            }\n        };\n    };\n    var bindImpl = function (observable, bindingDescriptor, bindStateRef) {\n        observable = as(observable);\n        if (!observable) {\n            return { cancel: function () { }, empty: true };\n        }\n\n        var bindState;\n        if (!bindStateRef) {\n            bindStateRef = createBindRefId();\n            bindState = {};\n            _DomWeakRefTable._createWeakRef(bindState, bindStateRef);\n        }\n\n        var complexLast = {};\n        var simpleLast = null;\n\n        function cancelSimple() {\n            if (simpleLast) {\n                simpleLast.forEach(function (e) {\n                    e.source.unbind(e.prop, e.listener);\n                });\n            }\n            simpleLast = null;\n        }\n\n        function cancelComplex(k) {\n            if (complexLast[k]) {\n                complexLast[k].complexBind.cancel();\n                delete complexLast[k];\n            }\n        }\n\n        Object.keys(bindingDescriptor).forEach(function (k) {\n            var listener = bindingDescriptor[k];\n            if (listener instanceof Function) {\n                // Create a proxy for the listener which indirects weakly through the bind\n                // state, if this is the root object tack the bind state onto the listener\n                //\n                listener = createProxy(listener, bindStateRef);\n                listener.bindState = bindState;\n                simpleLast = simpleLast || [];\n                simpleLast.push({ source: observable, prop: k, listener: listener });\n                observable.bind(k, listener);\n            } else {\n                var propChanged = function (v) {\n                    cancelComplex(k);\n                    var complexBind = bindImpl(as(v), listener, bindStateRef);\n\n                    // In the case that we hit an \"undefined\" in the chain, we prop the change\n                    // notification to all listeners, basically saying that x.y.z where \"y\"\n                    // is undefined resolves to undefined.\n                    //\n                    if (complexBind.empty) {\n                        var recursiveNotify = function (root) {\n                            Object.keys(root).forEach(function (key) {\n                                var item = root[key];\n                                if (item instanceof Function) {\n                                    item(undefined, undefined);\n                                } else {\n                                    recursiveNotify(item);\n                                }\n                            });\n                        };\n                        recursiveNotify(listener);\n                    }\n                    complexLast[k] = { source: v, complexBind: complexBind };\n                };\n\n                // Create a proxy for the listener which indirects weakly through the bind\n                // state, if this is the root object tack the bind state onto the listener\n                //\n                propChanged = createProxy(propChanged, bindStateRef);\n                propChanged.bindState = bindState;\n                simpleLast = simpleLast || [];\n                simpleLast.push({ source: observable, prop: k, listener: propChanged });\n                observable.bind(k, propChanged);\n            }\n        });\n\n        return {\n            cancel: function () {\n                cancelSimple();\n                Object.keys(complexLast).forEach(function (k) { cancelComplex(k); });\n            }\n        };\n    };\n\n\n    var ObservableProxy = _Base.Class.mix(function (data) {\n        this._initObservable(data);\n        Object.defineProperties(this, expandProperties(data));\n    }, dynamicObservableMixin);\n\n    var expandProperties = function (shape) {\n        /// <signature helpKeyword=\"WinJS.Binding.expandProperties\">\n        /// <summary locid=\"WinJS.Binding.expandProperties\">\n        /// Wraps the specified object so that all its properties\n        /// are instrumented for binding. This is meant to be used in\n        /// conjunction with the binding mixin.\n        /// </summary>\n        /// <param name=\"shape\" type=\"Object\" locid=\"WinJS.Binding.expandProperties_p:shape\">\n        /// The specification for the bindable object.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Binding.expandProperties_returnValue\">\n        /// An object with a set of properties all of which are wired for binding.\n        /// </returns>\n        /// </signature>\n        var props = {};\n        function addToProps(k) {\n            props[k] = {\n                get: function () { return this.getProperty(k); },\n                set: function (value) { this.setProperty(k, value); },\n                enumerable: true,\n                configurable: true // enables delete\n            };\n        }\n        while (shape && shape !== Object.prototype) {\n            Object.keys(shape).forEach(addToProps);\n            shape = Object.getPrototypeOf(shape);\n        }\n        return props;\n    };\n\n    var define = function (data) {\n        /// <signature helpKeyword=\"WinJS.Binding.define\">\n        /// <summary locid=\"WinJS.Binding.define\">\n        /// Creates a new constructor function that supports observability with\n        /// the specified set of properties.\n        /// </summary>\n        /// <param name=\"data\" type=\"Object\" locid=\"WinJS.Binding.define_p:data\">\n        /// The object to use as the pattern for defining the set of properties, for example:\n        /// var MyPointClass = define({x:0,y:0});\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.Binding.define_returnValue\">\n        /// A constructor function with 1 optional argument that is the initial state of\n        /// the properties.\n        /// </returns>\n        /// </signature>\n\n        // Common unsupported types, we just coerce to be an empty record\n        //\n        if (!data || typeof (data) !== \"object\" || (data instanceof Date) || Array.isArray(data)) {\n            if (_BaseUtils.validation) {\n                throw new _ErrorFromName(\"WinJS.Binding.UnsupportedDataType\", _Resources._formatString(strings.unsupportedDataTypeForBinding));\n            } else {\n                return;\n            }\n        }\n\n        return _Base.Class.mix(\n            function (init) {\n                /// <signature helpKeyword=\"WinJS.Binding.define.return\">\n                /// <summary locid=\"WinJS.Binding.define.return\">\n                /// Creates a new observable object.\n                /// </summary>\n                /// <param name=\"init\" type=\"Object\" locid=\"WinJS.Binding.define.return_p:init\">\n                /// The initial values for the properties.\n                /// </param>\n                /// </signature>\n\n                this._initObservable(init || Object.create(data));\n            },\n            dynamicObservableMixin,\n            expandProperties(data)\n        );\n    };\n\n    var as = function (data) {\n        /// <signature helpKeyword=\"WinJS.Binding.as\">\n        /// <summary locid=\"WinJS.Binding.as\">\n        /// Returns an observable object. This may be an observable proxy for the specified object, an existing proxy, or\n        /// the specified object itself if it directly supports observability.\n        /// </summary>\n        /// <param name=\"data\" type=\"Object\" locid=\"WinJS.Binding.as_p:data\">\n        /// Object to provide observability for.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Binding.as_returnValue\">\n        /// The observable object.\n        /// </returns>\n        /// </signature>\n\n        if (!data) {\n            return data;\n        }\n\n        var type = typeof data;\n        if (type === \"object\"\n            && !(data instanceof Date)\n            && !(Array.isArray(data))) {\n                if (data._getObservable) {\n                    return data._getObservable();\n                }\n\n                var observable = new ObservableProxy(data);\n                observable.backingData = data;\n                Object.defineProperty(\n                data,\n                \"_getObservable\",\n                {\n                    value: function () { return observable; },\n                    enumerable: false,\n                    writable: false\n                }\n            );\n                return observable;\n            } else {\n            return data;\n        }\n    };\n\n    var unwrap = function (data) {\n        /// <signature helpKeyword=\"WinJS.Binding.unwrap\">\n        /// <summary locid=\"WinJS.Binding.unwrap\">\n        /// Returns the original (non-observable) object is returned if the specified object is an observable proxy, .\n        /// </summary>\n        /// <param name=\"data\" type=\"Object\" locid=\"WinJS.Binding.unwrap_p:data\">\n        /// The object for which to retrieve the original value.\n        /// </param>\n        /// <returns type=\"Object\" locid=\"WinJS.Binding.unwrap_returnValue\">\n        /// If the specified object is an observable proxy, the original object is returned, otherwise the same object is returned.\n        /// </returns>\n        /// </signature>\n        if (data && data.backingData) {\n            return data.backingData;\n        } else {\n            return data;\n        }\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n        // must use long form because mixin has \"get\" and \"set\" as members, so the define\n        // method thinks it's a property\n        mixin: { value: dynamicObservableMixin, enumerable: false, writable: true, configurable: true },\n        dynamicObservableMixin: { value: dynamicObservableMixin, enumerable: true, writable: true, configurable: true },\n        observableMixin: { value: observableMixin, enumerable: true, writable: true, configurable: true },\n        expandProperties: expandProperties,\n        define: define,\n        as: as,\n        unwrap: unwrap,\n        bind: bind\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Binding/_Declarative',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../Utilities/_ElementUtilities',\n    './_BindingParser',\n    './_Data',\n    './_DomWeakRefTable'\n    ], function declarativeInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, Promise, _ElementUtilities, _BindingParser, _Data, _DomWeakRefTable) {\n    \"use strict\";\n\n    var uid = (Math.random() * 1000) >> 0;\n\n    // If we have proper weak references then we can move away from using the element's ID property\n    //\n    var optimizeBindingReferences = _WinRT.msSetWeakWinRTProperty && _WinRT.msGetWeakWinRTProperty;\n\n    var strings = {\n        get attributeBindingSingleProperty() { return \"Attribute binding requires a single destination attribute name, often in the form \\\"this['aria-label']\\\" or \\\"width\\\".\"; },\n        get cannotBindToThis() { return \"Can't bind to 'this'.\"; },\n        get creatingNewProperty() { return \"Creating new property {0}. Full path:{1}\"; },\n        get duplicateBindingDetected() { return \"Binding against element with id {0} failed because a duplicate id was detected.\"; },\n        get elementNotFound() { return \"Element not found:{0}\"; },\n        get errorInitializingBindings() { return \"Error initializing bindings: {0}\"; },\n        get propertyDoesNotExist() { return \"{0} doesn't exist. Full path:{1}\"; },\n        get idBindingNotSupported() { return \"Declarative binding to ID field is not supported. Initializer: {0}\"; },\n        get nestedDOMElementBindingNotSupported() { return \"Binding through a property {0} of type HTMLElement is not supported, Full path:{1}.\"; }\n    };\n\n    var markSupportedForProcessing = _BaseUtils.markSupportedForProcessing;\n    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n\n    function registerAutoDispose(bindable, callback) {\n        var d = bindable._autoDispose;\n        d && d.push(callback);\n    }\n    function autoDispose(bindable) {\n        bindable._autoDispose = (bindable._autoDispose || []).filter(function (callback) { return callback(); });\n    }\n\n    function checkBindingToken(element, bindingId) {\n        if (element) {\n            if (element.winBindingToken === bindingId) {\n                return element;\n            } else {\n                _Log.log && _Log.log(_Resources._formatString(strings.duplicateBindingDetected, element.id), \"winjs binding\", \"error\");\n            }\n        } else {\n            return element;\n        }\n    }\n\n    function setBindingToken(element) {\n        if (element.winBindingToken) {\n            return element.winBindingToken;\n        }\n\n        var bindingToken = \"_win_bind\" + (uid++);\n        Object.defineProperty(element, \"winBindingToken\", { configurable: false, writable: false, enumerable: false, value: bindingToken });\n        return bindingToken;\n    }\n\n    function initializerOneBinding(bind, ref, bindingId, source, e, pend, cacheEntry) {\n        var initializer = bind.initializer;\n        if (initializer) {\n            initializer = initializer.winControl || initializer[\"data-win-control\"] || initializer;\n        }\n        if (initializer instanceof Function) {\n            var result = initializer(source, bind.source, e, bind.destination);\n\n            if (cacheEntry) {\n                if (result && result.cancel) {\n                    cacheEntry.bindings.push(function () { result.cancel(); });\n                } else {\n                    // notify the cache that we encountered an uncancellable thing\n                    //\n                    cacheEntry.nocache = true;\n                }\n            }\n            return result;\n        } else if (initializer && initializer.render) {\n            pend.count++;\n\n            // notify the cache that we encountered an uncancellable thing\n            //\n            if (cacheEntry) {\n                cacheEntry.nocache = true;\n            }\n\n            requireSupportedForProcessing(initializer.render).call(initializer, getValue(source, bind.source), e).\n                then(function () {\n                    pend.checkComplete();\n                });\n        }\n    }\n\n    function makeBinding(ref, bindingId, pend, bindable, bind, cacheEntry) {\n        var first = true;\n        var bindResult;\n        var canceled = false;\n\n        autoDispose(bindable);\n\n        var resolveWeakRef = function () {\n            if (canceled) { return; }\n\n            var found = checkBindingToken(_DomWeakRefTable._getWeakRefElement(ref), bindingId);\n            if (!found) {\n                _Log.log && _Log.log(_Resources._formatString(strings.elementNotFound, ref), \"winjs binding\", \"info\");\n                if (bindResult) {\n                    bindResult.cancel();\n                }\n            }\n            return found;\n        };\n        var bindingAction = function (v) {\n            var found = resolveWeakRef();\n            if (found) {\n                nestedSet(found, bind.destination, v);\n            }\n            if (first) {\n                pend.checkComplete();\n                first = false;\n            }\n        };\n        registerAutoDispose(bindable, resolveWeakRef);\n\n        bindResult = bindWorker(bindable, bind.source, bindingAction);\n        if (bindResult) {\n            var cancel = bindResult.cancel;\n            bindResult.cancel = function () {\n                canceled = true;\n                return cancel.call(bindResult);\n            };\n            if (cacheEntry) {\n                cacheEntry.bindings.push(function () { bindResult.cancel(); });\n            }\n        }\n\n        return bindResult;\n    }\n\n    function sourceOneBinding(bind, ref, bindingId, source, e, pend, cacheEntry) {\n        var bindable;\n        if (source !== _Global) {\n            source = _Data.as(source);\n        }\n        if (source._getObservable) {\n            bindable = source._getObservable();\n        }\n        if (bindable) {\n            pend.count++;\n            // declarative binding must use a weak ref to the target element\n            //\n            return makeBinding(ref, bindingId, pend, bindable, bind, cacheEntry);\n        } else {\n            nestedSet(e, bind.destination, getValue(source, bind.source));\n        }\n    }\n\n    function filterIdBinding(declBind, bindingStr) {\n        for (var bindIndex = declBind.length - 1; bindIndex >= 0; bindIndex--) {\n            var bind = declBind[bindIndex];\n            var dest = bind.destination;\n            if (dest.length === 1 && dest[0] === \"id\") {\n                if (_BaseUtils.validation) {\n                    throw new _ErrorFromName(\"WinJS.Binding.IdBindingNotSupported\", _Resources._formatString(strings.idBindingNotSupported, bindingStr));\n                }\n                _Log.log && _Log.log(_Resources._formatString(strings.idBindingNotSupported, bindingStr), \"winjs binding\", \"error\");\n                declBind.splice(bindIndex, 1);\n            }\n        }\n        return declBind;\n    }\n\n    function calcBinding(bindingStr, bindingCache) {\n        if (bindingCache) {\n            var declBindCache = bindingCache.expressions[bindingStr];\n            var declBind;\n            if (!declBindCache) {\n                declBind = filterIdBinding(_BindingParser._bindingParser(bindingStr, _Global), bindingStr);\n                bindingCache.expressions[bindingStr] = declBind;\n            }\n            if (!declBind) {\n                declBind = declBindCache;\n            }\n            return declBind;\n        } else {\n            return filterIdBinding(_BindingParser._bindingParser(bindingStr, _Global), bindingStr);\n        }\n    }\n\n    function declarativeBindImpl(rootElement, dataContext, skipRoot, bindingCache, defaultInitializer, c) {\n        _WriteProfilerMark(\"WinJS.Binding:processAll,StartTM\");\n\n        var pend = {\n            count: 0,\n            checkComplete: function checkComplete() {\n                this.count--;\n                if (this.count === 0) {\n                    _WriteProfilerMark(\"WinJS.Binding:processAll,StopTM\");\n                    c();\n                }\n            }\n        };\n        var baseElement = (rootElement || _Global.document.body);\n        var selector = \"[data-win-bind],[data-win-control]\";\n        var elements = baseElement.querySelectorAll(selector);\n        var neg;\n        if (!skipRoot && (baseElement.getAttribute(\"data-win-bind\") || baseElement.winControl)) {\n            neg = baseElement;\n        }\n\n        pend.count++;\n        var source = dataContext || _Global;\n\n        _DomWeakRefTable._DOMWeakRefTable_fastLoadPath = true;\n        try {\n            var baseElementData = _ElementUtilities.data(baseElement);\n            baseElementData.winBindings = baseElementData.winBindings || [];\n\n            for (var i = (neg ? -1 : 0), l = elements.length; i < l; i++) {\n                var element = i < 0 ? neg : elements[i];\n\n                // If we run into a declarative control container (e.g. Binding.Template) we don't process its\n                //  children, but we do give it an opportunity to process them later using this data context.\n                //\n                if (element.winControl && element.winControl.constructor && element.winControl.constructor.isDeclarativeControlContainer) {\n                    i += element.querySelectorAll(selector).length;\n\n                    var idcc = element.winControl.constructor.isDeclarativeControlContainer;\n                    if (typeof idcc === \"function\") {\n                        idcc = requireSupportedForProcessing(idcc);\n                        idcc(element.winControl, function (element) {\n                            return declarativeBind(element, dataContext, false, bindingCache, defaultInitializer);\n                        });\n                    }\n                }\n\n                // In order to catch controls above we may have elements which don't have bindings, skip them\n                //\n                if (!element.hasAttribute(\"data-win-bind\")) {\n                    continue;\n                }\n\n                var original = element.getAttribute(\"data-win-bind\");\n                var declBind = calcBinding(original, bindingCache);\n\n                if (!declBind.implemented) {\n                    for (var bindIndex = 0, bindLen = declBind.length; bindIndex < bindLen; bindIndex++) {\n                        var bind = declBind[bindIndex];\n                        bind.initializer = bind.initializer || defaultInitializer;\n                        if (bind.initializer) {\n                            bind.implementation = initializerOneBinding;\n                        } else {\n                            bind.implementation = sourceOneBinding;\n                        }\n                    }\n                    declBind.implemented = true;\n                }\n\n                pend.count++;\n\n                var bindingId = setBindingToken(element);\n                var ref = optimizeBindingReferences ? bindingId : element.id;\n\n                if (!ref) {\n                    // We use our own counter here, as the IE \"uniqueId\" is only\n                    // global to a document, which means that binding against\n                    // unparented DOM elements would get duplicate IDs.\n                    //\n                    // The elements may not be parented at this point, but they\n                    // will be parented by the time the binding action is fired.\n                    //\n                    element.id = ref = bindingId;\n                }\n\n                _DomWeakRefTable._createWeakRef(element, ref);\n                var elementData = _ElementUtilities.data(element);\n                elementData.winBindings = null;\n                var cacheEntry;\n                if (bindingCache && bindingCache.elements) {\n                    cacheEntry = bindingCache.elements[ref];\n                    if (!cacheEntry) {\n                        bindingCache.elements[ref] = cacheEntry = { bindings: [] };\n                    }\n                }\n\n                for (var bindIndex2 = 0, bindLen2 = declBind.length; bindIndex2 < bindLen2; bindIndex2++) {\n                    var bind2 = declBind[bindIndex2];\n                    var cancel2 = bind2.implementation(bind2, ref, bindingId, source, element, pend, cacheEntry);\n                    if (cancel2) {\n                        elementData.winBindings = elementData.winBindings || [];\n                        elementData.winBindings.push(cancel2);\n                        baseElementData.winBindings.push(cancel2);\n                    }\n                }\n                pend.count--;\n            }\n        }\n        finally {\n            _DomWeakRefTable._DOMWeakRefTable_fastLoadPath = false;\n        }\n        pend.checkComplete();\n    }\n\n    function declarativeBind(rootElement, dataContext, skipRoot, bindingCache, defaultInitializer) {\n        /// <signature helpKeyword=\"WinJS.Binding.declarativeBind\">\n        /// <summary locid=\"WinJS.Binding.declarativeBind\">\n        /// Binds values from the specified data context to elements that are descendants of the specified root element\n        /// and have declarative binding attributes (data-win-bind).\n        /// </summary>\n        /// <param name=\"rootElement\" type=\"DOMElement\" optional=\"true\" locid=\"WinJS.Binding.declarativeBind_p:rootElement\">\n        /// The element at which to start traversing to find elements to bind to. If this parameter is omitted, the entire document\n        /// is searched.\n        /// </param>\n        /// <param name=\"dataContext\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.declarativeBind_p:dataContext\">\n        /// The object to use for default data binding.\n        /// </param>\n        /// <param name=\"skipRoot\" type=\"Boolean\" optional=\"true\" locid=\"WinJS.Binding.declarativeBind_p:skipRoot\">\n        /// If true, the elements to be bound skip the specified root element and include only the children.\n        /// </param>\n        /// <param name=\"bindingCache\" optional=\"true\" locid=\"WinJS.Binding.declarativeBind_p:bindingCache\">\n        /// The cached binding data.\n        /// </param>\n        /// <param name=\"defaultInitializer\" optional=\"true\" locid=\"WinJS.Binding.declarativeBind_p:defaultInitializer\">\n        /// The binding initializer to use in the case that one is not specified in a binding expression. If not\n        /// provided the behavior is the same as WinJS.Binding.defaultBind.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Binding.declarativeBind_returnValue\">\n        /// A promise that completes when each item that contains binding declarations has\n        /// been processed and the update has started.\n        /// </returns>\n        /// </signature>\n\n        return new Promise(function (c, e, p) {\n            declarativeBindImpl(rootElement, dataContext, skipRoot, bindingCache, defaultInitializer, c, e, p);\n        }).then(null, function (e) {\n            _Log.log && _Log.log(_Resources._formatString(strings.errorInitializingBindings, e && e.message), \"winjs binding\", \"error\");\n            return Promise.wrapError(e);\n        });\n    }\n\n    function converter(convert) {\n        /// <signature helpKeyword=\"WinJS.Binding.converter\">\n        /// <summary locid=\"WinJS.Binding.converter\">\n        /// Creates a default binding initializer for binding between a source\n        /// property and a destination property with a provided converter function\n        /// that is executed on the value of the source property.\n        /// </summary>\n        /// <param name=\"convert\" type=\"Function\" locid=\"WinJS.Binding.converter_p:convert\">\n        /// The conversion that operates over the result of the source property\n        /// to produce a value that is set to the destination property.\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.Binding.converter_returnValue\">\n        /// The binding initializer.\n        /// </returns>\n        /// </signature>\n        var userConverter = function (source, sourceProperties, dest, destProperties, initialValue) {\n            var bindingId = setBindingToken(dest);\n            var ref = optimizeBindingReferences ? bindingId : dest.id;\n\n            if (!ref) {\n                dest.id = ref = bindingId;\n            }\n\n            _DomWeakRefTable._createWeakRef(dest, ref);\n\n            var bindable;\n            if (source !== _Global) {\n                source = _Data.as(source);\n            }\n            if (source._getObservable) {\n                bindable = source._getObservable();\n            }\n            if (bindable) {\n                var workerResult = bindWorker(_Data.as(source), sourceProperties, function (v) {\n                    var found = checkBindingToken(_DomWeakRefTable._getWeakRefElement(ref), bindingId);\n                    if (found) {\n                        nestedSet(found, destProperties, convert(requireSupportedForProcessing(v)));\n                    } else if (workerResult) {\n                        _Log.log && _Log.log(_Resources._formatString(strings.elementNotFound, ref), \"winjs binding\", \"info\");\n                        workerResult.cancel();\n                    }\n                });\n                return workerResult;\n            } else {\n                var value = getValue(source, sourceProperties);\n                if (value !== initialValue) {\n                    nestedSet(dest, destProperties, convert(value));\n                }\n            }\n        };\n        return markSupportedForProcessing(userConverter);\n    }\n\n    function getValue(obj, path) {\n        if (obj !== _Global) {\n            obj = requireSupportedForProcessing(obj);\n        }\n        if (path) {\n            for (var i = 0, len = path.length; i < len && (obj !== null && obj !== undefined) ; i++) {\n                obj = requireSupportedForProcessing(obj[path[i]]);\n            }\n        }\n        return obj;\n    }\n\n    function nestedSet(dest, destProperties, v) {\n        requireSupportedForProcessing(v);\n        dest = requireSupportedForProcessing(dest);\n        for (var i = 0, len = (destProperties.length - 1) ; i < len; i++) {\n            dest = requireSupportedForProcessing(dest[destProperties[i]]);\n            if (!dest) {\n                _Log.log && _Log.log(_Resources._formatString(strings.propertyDoesNotExist, destProperties[i], destProperties.join(\".\")), \"winjs binding\", \"error\");\n                return;\n            } else if (dest instanceof _Global.Node) {\n                _Log.log && _Log.log(_Resources._formatString(strings.nestedDOMElementBindingNotSupported, destProperties[i], destProperties.join(\".\")), \"winjs binding\", \"error\");\n                return;\n            }\n        }\n        if (destProperties.length === 0) {\n            _Log.log && _Log.log(strings.cannotBindToThis, \"winjs binding\", \"error\");\n            return;\n        }\n        var prop = destProperties[destProperties.length - 1];\n        if (_Log.log) {\n            if (dest[prop] === undefined) {\n                _Log.log(_Resources._formatString(strings.creatingNewProperty, prop, destProperties.join(\".\")), \"winjs binding\", \"warn\");\n            }\n        }\n        dest[prop] = v;\n    }\n\n    function attributeSet(dest, destProperties, v) {\n        dest = requireSupportedForProcessing(dest);\n        if (!destProperties || destProperties.length !== 1 || !destProperties[0]) {\n            _Log.log && _Log.log(strings.attributeBindingSingleProperty, \"winjs binding\", \"error\");\n            return;\n        }\n        dest.setAttribute(destProperties[0], v);\n    }\n\n    function setAttribute(source, sourceProperties, dest, destProperties, initialValue) {\n        /// <signature helpKeyword=\"WinJS.Binding.setAttribute\">\n        /// <summary locid=\"WinJS.Binding.setAttribute\">\n        /// Creates a one-way binding between the source object and\n        /// an attribute on the destination element.\n        /// </summary>\n        /// <param name=\"source\" type=\"Object\" locid=\"WinJS.Binding.setAttribute_p:source\">\n        /// The source object.\n        /// </param>\n        /// <param name=\"sourceProperties\" type=\"Array\" locid=\"WinJS.Binding.setAttribute_p:sourceProperties\">\n        /// The path on the source object to the source property.\n        /// </param>\n        /// <param name=\"dest\" type=\"Object\" locid=\"WinJS.Binding.setAttribute_p:dest\">\n        /// The destination object (must be a DOM element).\n        /// </param>\n        /// <param name=\"destProperties\" type=\"Array\" locid=\"WinJS.Binding.setAttribute_p:destProperties\">\n        /// The path on the destination object to the destination property, this must be a single name.\n        /// </param>\n        /// <param name=\"initialValue\" optional=\"true\" locid=\"WinJS.Binding.setAttribute_p:initialValue\">\n        /// The known initial value of the target, if the source value is the same as this initial\n        /// value (using ===) then the target is not set the first time.\n        /// </param>\n        /// <returns type=\"{ cancel: Function }\" locid=\"WinJS.Binding.setAttribute_returnValue\">\n        /// An object with a cancel method that is used to coalesce bindings.\n        /// </returns>\n        /// </signature>\n\n        var bindingId = setBindingToken(dest);\n        var ref = optimizeBindingReferences ? bindingId : dest.id;\n\n        if (!ref) {\n            dest.id = ref = bindingId;\n        }\n\n        _DomWeakRefTable._createWeakRef(dest, ref);\n\n        var bindable;\n        if (source !== _Global) {\n            source = _Data.as(source);\n        }\n        if (source._getObservable) {\n            bindable = source._getObservable();\n        }\n        if (bindable) {\n            var counter = 0;\n            var workerResult = bindWorker(bindable, sourceProperties, function (v) {\n                if (++counter === 1) {\n                    if (v === initialValue) {\n                        return;\n                    }\n                }\n                var found = checkBindingToken(_DomWeakRefTable._getWeakRefElement(ref), bindingId);\n                if (found) {\n                    attributeSet(found, destProperties, requireSupportedForProcessing(v));\n                } else if (workerResult) {\n                    _Log.log && _Log.log(_Resources._formatString(strings.elementNotFound, ref), \"winjs binding\", \"info\");\n                    workerResult.cancel();\n                }\n            });\n            return workerResult;\n        } else {\n            var value = getValue(source, sourceProperties);\n            if (value !== initialValue) {\n                attributeSet(dest, destProperties, value);\n            }\n        }\n    }\n    function setAttributeOneTime(source, sourceProperties, dest, destProperties) {\n        /// <signature helpKeyword=\"WinJS.Binding.setAttributeOneTime\">\n        /// <summary locid=\"WinJS.Binding.setAttributeOneTime\">\n        /// Sets an attribute on the destination element to the value of the source property\n        /// </summary>\n        /// <param name=\"source\" type=\"Object\" locid=\"WinJS.Binding.setAttributeOneTime_p:source\">\n        /// The source object.\n        /// </param>\n        /// <param name=\"sourceProperties\" type=\"Array\" locid=\"WinJS.Binding.setAttributeOneTime_p:sourceProperties\">\n        /// The path on the source object to the source property.\n        /// </param>\n        /// <param name=\"dest\" type=\"Object\" locid=\"WinJS.Binding.setAttributeOneTime_p:dest\">\n        /// The destination object (must be a DOM element).\n        /// </param>\n        /// <param name=\"destProperties\" type=\"Array\" locid=\"WinJS.Binding.setAttributeOneTime_p:destProperties\">\n        /// The path on the destination object to the destination property, this must be a single name.\n        /// </param>\n        /// </signature>\n        return attributeSet(dest, destProperties, getValue(source, sourceProperties));\n    }\n\n    function addClassOneTime(source, sourceProperties, dest) {\n        /// <signature helpKeyword=\"WinJS.Binding.addClassOneTime\">\n        /// <summary locid=\"WinJS.Binding.addClassOneTime\">\n        /// Adds a class or Array list of classes on the destination element to the value of the source property\n        /// </summary>\n        /// <param name=\"source\" type=\"Object\" locid=\"WinJS.Binding.addClassOneTime:source\">\n        /// The source object.\n        /// </param>\n        /// <param name=\"sourceProperties\" type=\"Array\" locid=\"WinJS.Binding.addClassOneTime:sourceProperties\">\n        /// The path on the source object to the source property.\n        /// </param>\n        /// <param name=\"dest\" type=\"Object\" locid=\"WinJS.Binding.addClassOneTime:dest\">\n        /// The destination object (must be a DOM element).\n        /// </param>\n        /// </signature>\n        dest = requireSupportedForProcessing(dest);\n        var value = getValue(source, sourceProperties);\n        if (Array.isArray(value)) {\n            value.forEach(function (className) {\n                _ElementUtilities.addClass(dest, className);\n            });\n        } else if (value) {\n            _ElementUtilities.addClass(dest, value);\n        }\n    }\n\n    var defaultBindImpl = converter(function defaultBind_passthrough(v) { return v; });\n\n    function defaultBind(source, sourceProperties, dest, destProperties, initialValue) {\n        /// <signature helpKeyword=\"WinJS.Binding.defaultBind\">\n        /// <summary locid=\"WinJS.Binding.defaultBind\">\n        /// Creates a one-way binding between the source object and\n        /// the destination object.\n        /// </summary>\n        /// <param name=\"source\" type=\"Object\" locid=\"WinJS.Binding.defaultBind_p:source\">\n        /// The source object.\n        /// </param>\n        /// <param name=\"sourceProperties\" type=\"Array\" locid=\"WinJS.Binding.defaultBind_p:sourceProperties\">\n        /// The path on the source object to the source property.\n        /// </param>\n        /// <param name=\"dest\" type=\"Object\" locid=\"WinJS.Binding.defaultBind_p:dest\">\n        /// The destination object.\n        /// </param>\n        /// <param name=\"destProperties\" type=\"Array\" locid=\"WinJS.Binding.defaultBind_p:destProperties\">\n        /// The path on the destination object to the destination property.\n        /// </param>\n        /// <param name=\"initialValue\" optional=\"true\" locid=\"WinJS.Binding.defaultBind_p:initialValue\">\n        /// The known initial value of the target, if the source value is the same as this initial\n        /// value (using ===) then the target is not set the first time.\n        /// </param>\n        /// <returns type=\"{ cancel: Function }\" locid=\"WinJS.Binding.defaultBind_returnValue\">\n        /// An object with a cancel method that is used to coalesce bindings.\n        /// </returns>\n        /// </signature>\n\n        return defaultBindImpl(source, sourceProperties, dest, destProperties, initialValue);\n    }\n    function bindWorker(bindable, sourceProperties, func) {\n        if (sourceProperties.length > 1) {\n            var root = {};\n            var current = root;\n            for (var i = 0, l = sourceProperties.length - 1; i < l; i++) {\n                current = current[sourceProperties[i]] = {};\n            }\n            current[sourceProperties[sourceProperties.length - 1]] = func;\n\n            return _Data.bind(bindable, root, true);\n        } else if (sourceProperties.length === 1) {\n            bindable.bind(sourceProperties[0], func, true);\n            return {\n                cancel: function () {\n                    bindable.unbind(sourceProperties[0], func);\n                    this.cancel = noop;\n                }\n            };\n        } else {\n            // can't bind to object, so we just push it through\n            //\n            func(bindable);\n        }\n    }\n    function noop() { }\n    function oneTime(source, sourceProperties, dest, destProperties) {\n        /// <signature helpKeyword=\"WinJS.Binding.oneTime\">\n        /// <summary locid=\"WinJS.Binding.oneTime\">\n        /// Sets the destination property to the value of the source property.\n        /// </summary>\n        /// <param name=\"source\" type=\"Object\" locid=\"WinJS.Binding.oneTime_p:source\">\n        /// The source object.\n        /// </param>\n        /// <param name=\"sourceProperties\" type=\"Array\" locid=\"WinJS.Binding.oneTime_p:sourceProperties\">\n        /// The path on the source object to the source property.\n        /// </param>\n        /// <param name=\"dest\" type=\"Object\" locid=\"WinJS.Binding.oneTime_p:dest\">\n        /// The destination object.\n        /// </param>\n        /// <param name=\"destProperties\" type=\"Array\" locid=\"WinJS.Binding.oneTime_p:destProperties\">\n        /// The path on the destination object to the destination property.\n        /// </param>\n        /// <returns type=\"{ cancel: Function }\" locid=\"WinJS.Binding.oneTime_returnValue\">\n        /// An object with a cancel method that is used to coalesce bindings.\n        /// </returns>\n        /// </signature>\n        nestedSet(dest, destProperties, getValue(source, sourceProperties));\n        return { cancel: noop };\n    }\n\n    function initializer(customInitializer) {\n        /// <signature helpKeyword=\"WinJS.Binding.initializer\">\n        /// <summary locid=\"WinJS.Binding.initializer\">\n        /// Marks a custom initializer function as being compatible with declarative data binding.\n        /// </summary>\n        /// <param name=\"customInitializer\" type=\"Function\" locid=\"WinJS.Binding.initializer_p:customInitializer\">\n        /// The custom initializer to be marked as compatible with declarative data binding.\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.Binding.initializer_returnValue\">\n        /// The input customInitializer.\n        /// </returns>\n        /// </signature>\n        return markSupportedForProcessing(customInitializer);\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n        processAll: declarativeBind,\n        oneTime: initializer(oneTime),\n        defaultBind: initializer(defaultBind),\n        converter: converter,\n        initializer: initializer,\n        getValue: getValue,\n        setAttribute: initializer(setAttribute),\n        setAttributeOneTime: initializer(setAttributeOneTime),\n        addClassOneTime: initializer(addClassOneTime),\n    });\n\n});\n\ndefine('WinJS/Binding',[\n    './Binding/_BindingParser',\n    './Binding/_Data',\n    './Binding/_Declarative',\n    './Binding/_DomWeakRefTable'], function () {\n    //Wrapper module\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/BindingTemplate/_DataTemplateCompiler',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Binding/_BindingParser',\n    '../Binding/_Declarative',\n    '../ControlProcessor',\n    '../ControlProcessor/_OptionsParser',\n    '../Fragments',\n    '../Promise',\n    '../_Signal',\n    '../Utilities/_Dispose',\n    '../Utilities/_SafeHtml',\n    '../Utilities/_ElementUtilities'\n    ], function templateCompilerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, _BindingParser, _Declarative, ControlProcessor, _OptionsParser, Fragments, Promise, _Signal, _Dispose, _SafeHtml, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var strings = {\n        get attributeBindingSingleProperty() { return \"Attribute binding requires a single destination attribute name, often in the form \\\"this['aria-label']\\\" or \\\"width\\\".\"; },\n        get cannotBindToThis() { return \"Can't bind to 'this'.\"; },\n        get idBindingNotSupported() { return \"Declarative binding to ID field is not supported. Initializer: {0}\"; },\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n        _TemplateCompiler: _Base.Namespace._lazy(function () {\n\n            var cancelBlocker = Promise._cancelBlocker;\n\n            // Eagerly bind to stuff that will be needed by the compiler\n            //\n            var init_defaultBind = _Declarative.defaultBind;\n            var init_oneTime = _Declarative.oneTime;\n            var init_setAttribute = _Declarative.setAttribute;\n            var init_setAttributeOneTime = _Declarative.setAttributeOneTime;\n            var init_addClassOneTime = _Declarative.addClassOneTime;\n            var promise_as = Promise.as;\n            var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n            var insertAdjacentHTMLUnsafe = _SafeHtml.insertAdjacentHTMLUnsafe;\n            var utilities_data = _ElementUtilities.data;\n            var markDisposable = _Dispose.markDisposable;\n            var ui_processAll = ControlProcessor.processAll;\n            var binding_processAll = _Declarative.processAll;\n            var options_parser = _OptionsParser._optionsParser;\n            var CallExpression = _OptionsParser._CallExpression;\n            var IdentifierExpression = _OptionsParser._IdentifierExpression;\n            var binding_parser = _BindingParser._bindingParser2;\n            var scopedSelect = ControlProcessor.scopedSelect;\n            var writeProfilerMark = _WriteProfilerMark;\n\n            // Runtime helper functions\n            //\n            function disposeInstance(container, workPromise, renderCompletePromise) {\n                var bindings = _ElementUtilities.data(container).bindTokens;\n                if (bindings) {\n                    bindings.forEach(function (binding) {\n                        if (binding && binding.cancel) {\n                            binding.cancel();\n                        }\n                    });\n                }\n                if (workPromise) {\n                    workPromise.cancel();\n                }\n                if (renderCompletePromise) {\n                    renderCompletePromise.cancel();\n                }\n            }\n            function delayedBindingProcessing(data, defaultInitializer) {\n                return function (element) {\n                    return _Declarative.processAll(element, data, false, null, defaultInitializer);\n                };\n            }\n\n            function targetSecurityCheck(value) {\n                value = requireSupportedForProcessing(value);\n                return value instanceof _Global.Node ? null : value;\n            }\n\n            // Compiler formatting functions\n            //\n            var identifierRegEx = /^[A-Za-z]\\w*$/;\n            var identifierCharacterRegEx = /[^A-Za-z\\w$]/g;\n            var encodeHtmlRegEx = /[&<>'\"]/g;\n            var encodeHtmlEscapeMap = {\n                \"&\": \"&amp;\",\n                \"<\": \"&lt;\",\n                \">\": \"&gt;\",\n                \"'\": \"&#39;\",\n                '\"': \"&quot;\"\n            };\n            var formatRegEx = /({{)|(}})|{(\\w+)}|({)|(})/g;\n            var semiColonOnlyLineRegEx = /^\\s*;\\s*$/;\n            var capitalRegEx = /[A-Z]/g;\n\n            function format(string, parts) {\n                var multiline = string.indexOf(\"\\n\") !== -1;\n                var args = arguments;\n                //\n                // This allows you to format a string like: \"hello{there}you{0} {{encased in curlies}}\" and will\n                //  replace the holes {there} and {0} while turning the {{ and }} into single curlies.\n                //\n                // If the replacement is a number then it is inferred to be off of arguments, otherwise it is\n                //  a member on parts.\n                //\n                // If the replacement is a multiline string and the hole is indented then the entirety of the\n                //  replacement will have the same indentation as the hole.\n                //\n                var result = string.replace(formatRegEx, function (unused, left, right, part, illegalLeft, illegalRight, replacementIndex) {\n                    if (illegalLeft || illegalRight) {\n                        throw new _ErrorFromName(\n                            \"Format:MalformedInputString\",\n                            \"Did you forget to escape a: \" + (illegalLeft || illegalRight) + \" at: \" + replacementIndex);\n                    }\n                    if (left) { return \"{\"; }\n                    if (right) { return \"}\"; }\n                    var result;\n                    var index = +part;\n                    if (index === +index) {\n                        result = args[index + 1];\n                    } else {\n                        result = parts[part];\n                    }\n                    if (result === undefined) {\n                        throw new _ErrorFromName(\n                            \"Format:MissingPart\",\n                            \"Missing part '\" + part + \"'\"\n                        );\n                    }\n                    if (multiline) {\n                        var pos = replacementIndex;\n                        while (pos > 0 && string[--pos] === \" \") { /* empty */ }\n                        if (pos >= 0 && string[pos] === \"\\n\") {\n                            result = indent(replacementIndex - pos - 1, result);\n                        }\n                    }\n                    return result;\n                });\n                return result;\n            }\n            function indent(numberOfSpaces, multilineStringToBeIndented) {\n                var indent = \"\";\n                for (var i = 0; i < numberOfSpaces; i++) { indent += \" \"; }\n                return multilineStringToBeIndented.split(\"\\n\").map(function (line, index) { return index ? indent + line : line; }).join(\"\\n\");\n            }\n            function trim(s) {\n                return s.trim();\n            }\n            function statements(array) {\n                return array.join(\";\\n\");\n            }\n            function declarationList(array) {\n                return array.join(\", \") || \"empty\";\n            }\n            function identifierAccessExpression(parts) {\n                return parts.map(function (part) {\n                    // If this can be a member access optimize to that instead of a string lookup\n                    //\n                    if (part.match(identifierRegEx)) { return \".\" + part; }\n                    if (+part === part) { return format(\"[{0}]\", part); }\n                    return format(\"[{0}]\", literal(part));\n                }).join(\"\");\n            }\n            function nullableFilteredIdentifierAccessExpression(initial, parts, temporary, filter) {\n                //\n                //  generates: \"(t = initial) && filter(t = t.p0) && filter(t = t.p1) && t\"\n                //\n                // There are a number of contexts in which we will be derefernceing developer provided\n                //  identifier access expressions, in those case we don't know whether or not the target\n                //  property exists or in fact if anything exists along the path.\n                //\n                // In order to provide 'correct' behavior we dereference conditionally on whether\n                //  we have a non-null value. This results in returning undefined unless the entire\n                //  path is defined.\n                //\n                // In these cases we also want to filter the result for security purposes.\n                //\n                var parts = parts.map(function (part) {\n                    // If this can be a member access optimize to that instead of a string lookup\n                    //\n                    if (part.match(identifierRegEx)) { return \".\" + part; }\n                    if (+part === part) { part = +part; }\n                    return brackets(literal(part));\n                }).map(function (part) {\n                    return format(\"{filter}({temp} = {temp}{part})\", {\n                        filter: filter,\n                        temp: temporary,\n                        part: part\n                    });\n                });\n                parts.unshift(parens(assignment(temporary, initial)));\n                parts.push(temporary);\n                return parens(parts.join(\" && \"));\n            }\n            function literal(instance) {\n                return JSON.stringify(instance);\n            }\n            function newArray(N) {\n                return N ? \"new Array(\" + (+N) + \")\" : \"[]\";\n            }\n            function assignment(target, source) {\n                return \"\" + target + \" = \" + source;\n            }\n            function parens(expression) {\n                return \"(\" + expression + \")\";\n            }\n            function brackets(expression) {\n                return \"[\" + expression + \"]\";\n            }\n            function propertyName(name) {\n                if (name.match(identifierRegEx)) { return name; }\n                if (+name === name) { return +name; }\n                return literal(name);\n            }\n            function htmlEscape(str) {\n                str = \"\" + str;\n                return str.replace(encodeHtmlRegEx, function (m) {\n                    return encodeHtmlEscapeMap[m] || \" \";\n                });\n            }\n            function createIdentifier(prefix, count, suffix) {\n                if (suffix) {\n                    return new String(\"\" + prefix + count + \"_\" + suffix);\n                } else {\n                    return new String(\"\" + prefix + count);\n                }\n            }\n            function multiline(str) {\n                return str.replace(/\\\\n/g, \"\\\\n\\\\\\n\");\n            }\n\n            // Compiler helper functions\n            //\n            function keys(object) {\n                return Object.keys(object);\n            }\n            function values(object) {\n                return Object.keys(object).map(function (key) { return object[key]; });\n            }\n            function merge(a, b) {\n                return mergeAll([a, b]);\n            }\n            function mergeAll(list) {\n                var o = {};\n                for (var i = 0, len = list.length; i < len; i++) {\n                    var part = list[i];\n                    var keys = Object.keys(part);\n                    for (var j = 0, len2 = keys.length; j < len2; j++) {\n                        var key = keys[j];\n                        o[key] = part[key];\n                    }\n                }\n                return o;\n            }\n            function globalLookup(parts) {\n                return parts.reduce(\n                    function (current, name) {\n                        if (current) {\n                            return requireSupportedForProcessing(current[name]);\n                        }\n                        return null;\n                    },\n                    _Global\n                );\n            }\n            function visit(node, key, pre, post) {\n                var children = node.children;\n                if (children) {\n                    var keys = Object.keys(children);\n                    (key && pre) && pre(node, key, keys.length);\n                    for (var i = 0, len = keys.length; i < len; i++) {\n                        var childKey = keys[i];\n                        var child = children[childKey];\n                        visit(child, childKey, pre, post);\n                    }\n                    (key && post) && post(node, key, Object.keys(children).length);\n                } else {\n                    (key && pre) && pre(node, key, 0);\n                    (key && post) && post(node, key, 0);\n                }\n            }\n\n            // Compiler helper types\n            //\n            var TreeCSE = _Base.Class.define(function (compiler, name, kind, accessExpression, filter) {\n\n                var that = this;\n                this.compiler = compiler;\n                this.kind = kind;\n                this.base = new String(name);\n                this.tree = {\n                    children: {},\n                    parent: this.base,\n                    reference: function () { return that.base; }\n                };\n                this.accessExpression = accessExpression;\n                this.filter = filter || \"\";\n\n            }, {\n\n                createPathExpression: function (path, name) {\n\n                    if (path.length) {\n                        var that = this;\n                        var tail = path.reduce(\n                            function (node, part) {\n                                node.children = node.children || {};\n                                node.children[part] = node.children[part] || { parent: node };\n                                return node.children[part];\n                            },\n                            this.tree\n                        );\n                        tail.name = tail.name || that.compiler.defineInstance(\n                            that.kind,\n                            name || \"\",\n                            function () {\n                                return that.accessExpression(\n                                    /*l*/tail.parent.name ? tail.parent.name : tail.parent.reference(),\n                                    /*r*/path.slice(-1)[0],\n                                    /*root*/tail.parent.parent === that.base,\n                                    /*filter*/that.filter,\n                                    /*last*/true\n                                );\n                            }\n                        );\n                        return tail.name;\n                    } else {\n                        return this.base;\n                    }\n\n                },\n\n                lower: function () {\n\n                    var that = this;\n                    var aggregatedName = [];\n                    var reference = function (node, name, last) {\n                        return that.accessExpression(\n                            /*l*/node.parent.name ? node.parent.name : node.parent.reference(),\n                            /*r*/name,\n                            /*root*/node.parent.parent === that.base,\n                            /*filter*/that.filter,\n                            /*last*/last\n                        );\n                    };\n\n                    // Ensure that all shared internal nodes have names and that all nodes\n                    //  know who they reference\n                    //\n                    visit(this.tree, \"\",\n                        function pre(node, key, childCount) {\n                            aggregatedName.push(key);\n\n                            if (childCount > 1) {\n                                node.name = node.name || that.compiler.defineInstance(\n                                    that.kind,\n                                    aggregatedName.join(\"_\"),\n                                    reference.bind(null, node, key, true)\n                                );\n                                node.reference = function () { return node.name; };\n                            } else if (childCount === 1) {\n                                node.reference = reference.bind(null, node, key);\n                            }\n                        },\n                        function post() {\n                            aggregatedName.pop();\n                        }\n                    );\n\n                },\n\n                deadNodeElimination: function () {\n\n                    // Kill all dead nodes from the tree\n                    //\n                    visit(this.tree, \"\", null, function post(node, key, childCount) {\n                        if (!node.name || node.name.dead) {\n                            if (childCount === 0) {\n                                if (node.parent && node.parent.children) {\n                                    delete node.parent.children[key];\n                                }\n                            }\n                        }\n                    });\n\n                },\n\n                definitions: function () {\n\n                    var nodes = [];\n\n                    // Gather the nodes in a depth first ordering, any node which has a name\n                    //  needs to have a definition generated\n                    //\n                    visit(this.tree, \"\", function pre(node) {\n                        if (node.name) {\n                            nodes.push(node);\n                        }\n                    });\n\n                    return nodes.map(function (n) { return n.name.definition(); });\n\n                },\n\n            });\n\n            var InstanceKind = {\n                \"capture\": \"capture\",\n                \"temporary\": \"temporary\",\n                \"variable\": \"variable\",\n                \"data\": \"data\",\n                \"global\": \"global\",\n            };\n            var InstanceKindPrefixes = {\n                \"capture\": \"c\",\n                \"temporary\": \"t\",\n                \"variable\": \"iv\",\n                \"data\": \"d\",\n                \"global\": \"g\",\n            };\n\n            var StaticKind = {\n                \"imported\": \"import\",\n                \"variable\": \"variable\",\n            };\n            var StaticKindPrefixes = {\n                \"imported\": \"i\",\n                \"variable\": \"sv\",\n            };\n\n            var BindingKind = {\n                \"tree\": \"tree\",\n                \"text\": \"text\",\n                \"initializer\": \"initializer\",\n                \"template\": \"template\",\n                \"error\": \"error\",\n            };\n\n            var TextBindingKind = {\n                \"attribute\": \"attribute\",\n                \"booleanAttribute\": \"booleanAttribute\",\n                \"inlineStyle\": \"inlineStyle\",\n                \"textContent\": \"textContent\",\n            };\n\n            // Constants\n            //\n            var IMPORTS_ARG_NAME = \"imports\";\n\n            var Stage = {\n                initial: 0,\n                analyze: 1,\n                optimze: 2,\n                lower: 3,\n                compile: 4,\n                link: 5,\n                done: 6,\n            };\n\n            // Compiler\n            //\n            var TemplateCompiler = _Base.Class.define(function (templateElement, options) {\n                this._stage = Stage.initial;\n                this._staticVariables = {};\n                this._staticVariablesCount = 0;\n                this._instanceVariables = {};\n                this._instanceVariablesCount = {};\n                this._debugBreak = options.debugBreakOnRender;\n                this._defaultInitializer = requireSupportedForProcessing(options.defaultInitializer || init_defaultBind);\n                this._optimizeTextBindings = !options.disableTextBindingOptimization;\n                this._templateElement = templateElement;\n                this._templateContent = _Global.document.createElement(templateElement.tagName);\n                this._extractChild = options.extractChild || false;\n                this._controls = null;\n                this._bindings = null;\n                this._bindTokens = null;\n                this._textBindingPrefix = null;\n                this._textBindingId = 0;\n                this._suffix = [];\n                this._htmlProcessors = [];\n                this._profilerMarkIdentifier = options.profilerMarkIdentifier;\n                this._captureCSE = new TreeCSE(this, \"container\", InstanceKind.capture, this.generateElementCaptureAccess.bind(this));\n                this._dataCSE = new TreeCSE(this, \"data\", InstanceKind.data, this.generateNormalAccess.bind(this), this.importFunctionSafe(\"dataSecurityCheck\", requireSupportedForProcessing));\n                this._globalCSE = new TreeCSE(this, this.importFunctionSafe(\"global\", _Global), InstanceKind.global, this.generateNormalAccess.bind(this), this.importFunctionSafe(\"globalSecurityCheck\", requireSupportedForProcessing));\n\n                // Clone the template content and import it into its own HTML document for further processing\n                Fragments.renderCopy(this._templateElement, this._templateContent);\n\n                // If we are extracting the first child we only bother compiling the one child\n                if (this._extractChild) {\n                    while (this._templateContent.childElementCount > 1) {\n                        this._templateContent.removeChild(this._templateContent.lastElementChild);\n                    }\n                }\n            }, {\n\n                addClassOneTimeTextBinding: function (binding) {\n                    var that = this;\n                    var id = this.createTextBindingHole(binding.elementCapture.element.tagName, \"class\", ++this._textBindingId);\n                    binding.textBindingId = id;\n                    binding.kind = BindingKind.text;\n                    binding.elementCapture.element.classList.add(id);\n                    binding.elementCapture.refCount--;\n                    binding.definition = function () {\n                        return that.formatCode(\"{htmlEscape}({value})\", {\n                            htmlEscape: that._staticVariables.htmlEscape,\n                            value: binding.value(),\n                        });\n                    };\n                },\n\n                addClassOneTimeTreeBinding: function (binding) {\n\n                    var that = this;\n                    binding.pathExpression = this.bindingExpression(binding);\n                    binding.value = function () {\n                        return binding.pathExpression;\n                    };\n                    binding.kind = BindingKind.tree;\n                    binding.definition = function () {\n                        return that.formatCode(\"{element}.classList.add({value})\", {\n                            element: binding.elementCapture,\n                            value: binding.value(),\n                        });\n                    };\n\n                },\n\n                analyze: function () {\n\n                    if (this._stage > Stage.analyze) {\n                        throw \"Illegal: once we have moved past analyze we cannot revist it\";\n                    }\n                    this._stage = Stage.analyze;\n\n                    // find activatable and bound elements\n                    this._controls = this.gatherControls();\n                    this._bindings = this.gatherBindings();\n                    this._children = this.gatherChildren();\n\n                    // remove attributes which are no longer needed since we will inline bindings and controls\n                    this.cleanControlAndBindingAttributes();\n\n                    if (this.async) {\n                        this.createAsyncParts();\n                    }\n\n                    this.nullableIdentifierAccessTemporary = this.defineInstance(InstanceKind.temporary);\n\n                    // snapshot html\n                    var html = this._templateContent.innerHTML;\n                    this._html = function () { return multiline(literal(html)); };\n                    this._html.text = html;\n\n                },\n\n                bindingExpression: function (binding) {\n\n                    return this._dataCSE.createPathExpression(binding.source, binding.source.join(\"_\"));\n\n                },\n\n                capture: function (element) {\n\n                    var capture = element._capture;\n                    if (capture) {\n                        capture.refCount++;\n                        return capture;\n                    }\n\n                    // Find the path to the captured element\n                    //\n                    var path = [element];\n                    var e = element.parentNode;\n                    var name = element.tagName;\n                    while (e !== this._templateContent) {\n                        name = e.tagName + \"_\" + name;\n                        path.unshift(e);\n                        e = e.parentNode;\n                    }\n                    // Identify which child each path member is so we can form an indexed lookup\n                    //\n                    for (var i = 0, len = path.length; i < len; i++) {\n                        var child = path[i];\n                        path[i] = Array.prototype.indexOf.call(e.children, child);\n                        e = child;\n                    }\n                    // Create the capture and put it on the\n                    //\n                    capture = this._captureCSE.createPathExpression(path, name.toLowerCase());\n                    capture.element = element;\n                    capture.element._capture = capture;\n                    capture.refCount = 1;\n                    return capture;\n\n                },\n\n                cleanControlAndBindingAttributes: function () {\n                    var selector = \"[data-win-bind],[data-win-control]\";\n                    var elements = this._templateContent.querySelectorAll(selector);\n                    for (var i = 0, len = elements.length; i < len; i++) {\n                        var element = elements[i];\n                        if (element.isDeclarativeControlContainer) {\n                            i += element.querySelectorAll(\"[data-win-bind],[data-win-control]\").length;\n                        }\n                        element.removeAttribute(\"data-win-bind\");\n                        element.removeAttribute(\"data-win-control\");\n                        element.removeAttribute(\"data-win-options\");\n                    }\n                },\n\n                compile: function (bodyTemplate, replacements, supportDelayBindings) {\n\n                    if (this._stage > Stage.compile) {\n                        throw \"Illegal: once we have moved past compile we cannot revist it\";\n                    }\n                    this._stage = Stage.compile;\n\n                    var that = this;\n\n                    this._returnedElement = this._extractChild ? \"container.firstElementChild\" : \"container\";\n\n                    var control_processing = this._controls.map(function (control) {\n                        var constructionFormatString;\n                        if (control.async) {\n                            constructionFormatString = \"{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options}, controlDone)\";\n                        } else {\n                            constructionFormatString = \"{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options})\";\n                        }\n                        var construction = that.formatCode(\n                            constructionFormatString,\n                            {\n                                target: control.elementCapture,\n                                SafeConstructor: control.SafeConstructor,\n                                options: that.generateOptionsLiteral(control.optionsParsed, control.elementCapture),\n                            }\n                        );\n                        if (control.isDeclarativeControlContainer && typeof control.isDeclarativeControlContainer.imported === \"function\") {\n                            var result = [construction];\n                            result.push(that.formatCode(\n                                \"{isDeclarativeControlContainer}({target}.winControl, {delayedControlProcessing})\",\n                                {\n                                    target: control.elementCapture,\n                                    isDeclarativeControlContainer: control.isDeclarativeControlContainer,\n                                    delayedControlProcessing: that._staticVariables.ui_processAll\n                                }\n                            ));\n                            result.push(that.formatCode(\n                                \"{isDeclarativeControlContainer}({target}.winControl, {delayedBindingProcessing}(data, {templateDefaultInitializer}))\",\n                                {\n                                    target: control.elementCapture,\n                                    isDeclarativeControlContainer: control.isDeclarativeControlContainer,\n                                    delayedBindingProcessing: that._staticVariables.delayedBindingProcessing,\n                                    templateDefaultInitializer: that._staticVariables.templateDefaultInitializer || literal(null),\n                                }\n                            ));\n                            return result.join(\";\\n\");\n                        } else {\n                            return construction;\n                        }\n                    });\n\n                    var all_binding_processing = this._bindings.map(function (binding) {\n                        switch (binding.kind) {\n                            case BindingKind.template:\n                                return that.formatCode(\n                                    \"({nestedTemplates}[{nestedTemplate}] = {template}.render({path}, {dest}))\",\n                                    {\n                                        nestedTemplates: that._nestedTemplates,\n                                        nestedTemplate: literal(binding.nestedTemplate),\n                                        template: binding.template,\n                                        path: binding.pathExpression,\n                                        dest: binding.elementCapture,\n                                    }\n                                );\n\n                            case BindingKind.initializer:\n                                var formatString;\n                                if (binding.initialValue) {\n                                    formatString = \"({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}, {initialValue}))\";\n                                } else {\n                                    formatString = \"({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}))\";\n                                }\n                                return that.formatCode(\n                                    formatString,\n                                    {\n                                        bindTokens: that._bindTokens,\n                                        bindToken: literal(binding.bindToken),\n                                        initializer: binding.initializer,\n                                        sourceProperties: literal(binding.source),\n                                        destProperties: literal(binding.destination),\n                                        dest: binding.elementCapture,\n                                        initialValue: binding.initialValue,\n                                    }\n                                );\n\n                            case BindingKind.tree:\n                                return binding.definition();\n\n                            case BindingKind.text:\n                                // do nothing, text bindings are taken care of seperately\n                                break;\n\n                            case BindingKind.error:\n                                // do nothing, errors are reported and ignored\n                                break;\n\n                            default:\n                                throw \"NYI\";\n                        }\n                    });\n                    var binding_processing, delayed_binding_processing;\n                    if (supportDelayBindings) {\n                        binding_processing = all_binding_processing.filter(function (unused, index) {\n                            return !that._bindings[index].delayable;\n                        });\n                        delayed_binding_processing = all_binding_processing.filter(function (unused, index) {\n                            return that._bindings[index].delayable;\n                        });\n                    } else {\n                        binding_processing = all_binding_processing;\n                        delayed_binding_processing = [];\n                    }\n\n                    var instances = values(this._instanceVariables);\n\n                    var instanceDefinitions = instances\n                        .filter(function (instance) { return instance.kind === InstanceKind.variable; })\n                        .map(function (variable) { return variable.definition(); });\n\n                    var captures = this._captureCSE.definitions();\n                    var globals = this._globalCSE.definitions();\n                    var data = this._dataCSE.definitions();\n\n                    var set_msParentSelectorScope = this._children.map(function (child) {\n                        return that.formatCodeN(\"{0}.msParentSelectorScope = true\", child);\n                    });\n                    var suffix = this._suffix.map(function (statement) {\n                        return statement();\n                    });\n\n                    var renderComplete = \"\";\n                    if (supportDelayBindings && delayed_binding_processing.length) {\n                        renderComplete = that.formatCode(\n                            renderItemImplRenderCompleteTemplate,\n                            {\n                                delayed_binding_processing: statements(delayed_binding_processing)\n                            }\n                        );\n                    }\n\n                    var result = that.formatCode(\n                        bodyTemplate,\n                        mergeAll([\n                            this._staticVariables,\n                            replacements || {},\n                            {\n                                profilerMarkIdentifierStart: literal(\"WinJS.Binding.Template:render\" + this._profilerMarkIdentifier + \",StartTM\"),\n                                profilerMarkIdentifierStop: literal(\"WinJS.Binding.Template:render\" + this._profilerMarkIdentifier + \",StopTM\"),\n                                html: this._html(),\n                                tagName: literal(this._templateElement.tagName),\n                                instance_variable_declarations: declarationList(instances),\n                                global_definitions: statements(globals),\n                                data_definitions: statements(data),\n                                instance_variable_definitions: statements(instanceDefinitions),\n                                capture_definitions: statements(captures),\n                                set_msParentSelectorScope: statements(set_msParentSelectorScope),\n                                debug_break: this.generateDebugBreak(),\n                                control_processing: statements(control_processing),\n                                control_counter: this._controlCounter,\n                                binding_processing: statements(binding_processing),\n                                renderComplete: renderComplete,\n                                suffix_statements: statements(suffix),\n                                nestedTemplates: this._nestedTemplates,\n                                returnedElement: this._returnedElement,\n                            },\n                        ])\n                    );\n\n                    return this.prettify(result);\n\n                },\n\n                createAsyncParts: function () {\n\n                    this._nestedTemplates = this._nestedTemplates || this.defineInstance(\n                        InstanceKind.variable,\n                        \"nestedTemplates\",\n                        function () { return newArray(0); }\n                    );\n\n                    this._controlCounter = this._controlCounter || this.defineInstance(\n                        InstanceKind.variable,\n                        \"controlCounter\",\n                        function () { return literal(1); }\n                    );\n\n                },\n\n                createTextBindingHole: function (tagName, attribute, id) {\n                    if (!this._textBindingPrefix) {\n                        var c = \"\";\n                        while (this._html.text.indexOf(\"textbinding\" + c) !== -1) {\n                            c = c || 0;\n                            c++;\n                        }\n                        this._textBindingPrefix = \"textbinding\" + c;\n                        // NOTE: the form of this regex needs to be coordinated with any special cases which\n                        //  are introduced by the switch below.\n                        this._textBindingRegex = new RegExp(\"(#?\" + this._textBindingPrefix + \"_\\\\d+)\");\n                    }\n\n                    // Sometimes text bindings need to be of a particular form to suppress warnings from\n                    //  the host, specifically there is a case with IMG/src attribute where if you assign\n                    //  a naked textbinding_X to it you get a warning in the console of an unresolved image\n                    //  instead we prefix it with a # which is enough to suppress that message.\n                    //\n                    var result = this._textBindingPrefix + \"_\" + id;\n                    if (tagName === \"IMG\" && attribute === \"src\") {\n                        result = \"#\" + result;\n                    }\n\n                    return result;\n                },\n\n                deadCodeElimination: function () {\n                    var that = this;\n\n                    // Eliminate all captured elements which are no longer in the tree, this can happen if\n                    //  these captured elements are children of a node which had a text binding to 'innerText'\n                    //  or 'textContent' as those kill the subtree.\n                    //\n                    Object.keys(this._instanceVariables).forEach(function (key) {\n                        var iv = that._instanceVariables[key];\n                        if (iv.kind === InstanceKind.capture) {\n                            if (!that._templateContent.contains(iv.element)) {\n                                iv.dead = true;\n                            }\n                            if (iv.refCount === 0) {\n                                iv.dead = true;\n                            }\n                            if (iv.dead) {\n                                // This dead instance variable returns a blank definition which will then get\n                                // cleaned up by prettify.\n                                iv.definition = function () { };\n                                iv.name = null;\n                                delete that._instanceVariables[key];\n                            }\n                        }\n                    });\n\n                    // Eliminate all control activations which target elements which are no longer in the tree\n                    //\n                    this._controls = this._controls.filter(function (c) { return !c.elementCapture.dead; });\n\n                    // Eliminate all bindings which target elements which are no longer in the tree\n                    //\n                    this._bindings = this._bindings.filter(function (b) { return !b.elementCapture.dead; });\n\n                    // Cleanup the capture CSE tree now that we know dead nodes are marked as such.\n                    //\n                    this._captureCSE.deadNodeElimination();\n\n                },\n\n                defineInstance: function (kind, name, definition) {\n\n                    if (this._stage >= Stage.compile) {\n                        throw \"Illegal: define instance variable after compilation stage has started\";\n                    }\n\n                    var variableCount = this._instanceVariablesCount[kind] || 0;\n                    var suffix = name ? name.replace(identifierCharacterRegEx, \"_\") : \"\";\n                    var identifier = createIdentifier(InstanceKindPrefixes[kind], variableCount, suffix);\n                    identifier.definition = function () { return assignment(identifier, definition()); };\n                    identifier.kind = kind;\n                    this._instanceVariables[identifier] = identifier;\n                    this._instanceVariablesCount[kind] = variableCount + 1;\n                    return identifier;\n\n                },\n\n                defineStatic: function (kind, name, definition) {\n\n                    if (this._stage >= Stage.link) {\n                        throw \"Illegal: define static variable after link stage has started\";\n                    }\n\n                    if (name) {\n                        var known = this._staticVariables[name];\n                        if (known) {\n                            return known;\n                        }\n                    }\n                    var suffix = name ? name.replace(identifierCharacterRegEx, \"_\") : \"\";\n                    var identifier = createIdentifier(StaticKindPrefixes[kind], this._staticVariablesCount, suffix);\n                    identifier.definition = function () { return assignment(identifier, definition()); };\n                    identifier.kind = kind;\n                    this._staticVariables[name || identifier] = identifier;\n                    this._staticVariablesCount++;\n                    return identifier;\n\n                },\n\n                done: function () {\n\n                    if (this._stage > Stage.done) {\n                        throw \"Illegal: once we have moved past done we cannot revist it\";\n                    }\n                    this._stage = Stage.done;\n\n                },\n\n                emitScopedSelect: function (selector, elementCapture) {\n                    return this.formatCode(\n                        \"{scopedSelect}({selector}, {element})\",\n                        {\n                            scopedSelect: this._staticVariables.scopedSelect,\n                            selector: literal(selector),\n                            element: elementCapture,\n                        }\n                    );\n                },\n\n                emitOptionsNode: function (node, parts, elementCapture) {\n\n                    var that = this;\n                    if (node) {\n                        switch (typeof node) {\n                            case \"object\":\n                                if (Array.isArray(node)) {\n                                    parts.push(\"[\");\n                                    for (var i = 0, len = node.length; i < len; i++) {\n                                        this.emitOptionsNode(node[i], parts, elementCapture);\n                                        parts.push(\",\");\n                                    }\n                                    parts.push(\"]\");\n                                } else if (node instanceof CallExpression) {\n                                    parts.push(node.target === \"select\" ? this.emitScopedSelect(node.arg0Value, elementCapture) : literal(null));\n                                } else if (node instanceof IdentifierExpression && node.parts[0] instanceof CallExpression) {\n                                    var call = node.parts[0];\n                                    parts.push(\n                                        nullableFilteredIdentifierAccessExpression(\n                                            call.target === \"select\" ? this.emitScopedSelect(call.arg0Value, elementCapture) : literal(null),\n                                            node.parts.slice(1),\n                                            this.nullableIdentifierAccessTemporary,\n                                            this.importFunctionSafe(\"requireSupportedForProcessing\", requireSupportedForProcessing)\n                                        )\n                                    );\n                                } else if (node instanceof IdentifierExpression) {\n                                    parts.push(node.pathExpression);\n                                } else {\n                                    parts.push(\"{\");\n                                    Object.keys(node).forEach(function (key) {\n\n                                        parts.push(propertyName(key));\n                                        parts.push(\":\");\n                                        that.emitOptionsNode(node[key], parts, elementCapture);\n                                        parts.push(\",\");\n\n                                    });\n                                    parts.push(\"}\");\n                                }\n                                break;\n\n                            default:\n                                parts.push(literal(node));\n                                break;\n                        }\n                    } else {\n                        parts.push(literal(null));\n                    }\n\n                },\n\n                findGlobalIdentifierExpressions: function (obj, results) {\n\n                    results = results || [];\n                    var that = this;\n                    Object.keys(obj).forEach(function (key) {\n                        var prop = obj[key];\n                        if (typeof prop === \"object\") {\n                            if (prop instanceof IdentifierExpression) {\n                                if (!(prop.parts[0] instanceof CallExpression)) {\n                                    results.push(prop);\n                                }\n                            } else {\n                                that.findGlobalIdentifierExpressions(prop, results);\n                            }\n                        }\n                    });\n                    return results;\n\n                },\n\n                formatCodeN: function () {\n\n                    if (this._stage < Stage.compile) {\n                        throw \"Illegal: format code at before compilation stage has started\";\n                    }\n                    return format.apply(null, arguments);\n\n                },\n\n                formatCode: function (string, parts) {\n\n                    if (this._stage < Stage.compile) {\n                        throw \"Illegal: format code at before compilation stage has started\";\n                    }\n                    return format(string, parts);\n\n                },\n\n                gatherBindings: function () {\n\n                    var bindTokens = -1;\n                    var that = this;\n                    var nestedTemplates = -1;\n                    var bindings = [];\n                    var selector = \"[data-win-bind],[data-win-control]\";\n                    var elements = this._templateContent.querySelectorAll(selector);\n                    for (var i = 0, len = elements.length; i < len; i++) {\n                        var element = elements[i];\n\n                        // If we run into a declarative control container (e.g. Binding.Template) we don't\n                        //  bind its children, but we will give it an opportunity to process later using the\n                        //  same data context.\n                        if (element.isDeclarativeControlContainer) {\n                            i += element.querySelectorAll(selector).length;\n                        }\n\n                        // Since we had to look for controls as well as bindings in order to skip controls\n                        //  which are declarative control containers we have to check if this element is bound\n                        if (!element.hasAttribute(\"data-win-bind\")) {\n                            continue;\n                        }\n\n                        var bindingText = element.getAttribute(\"data-win-bind\");\n                        var elementBindings = binding_parser(bindingText, _Global);\n                        elementBindings.forEach(function (binding) {\n                            if (binding.initializer) {\n                                // If an initializer is specified it may be a nested template\n                                var initializerName = binding.initializer.join(\".\");\n                                var initializer = globalLookup(binding.initializer);\n                                if (initializer.render) {\n                                    requireSupportedForProcessing(initializer.render);\n                                    // We have already chceked this to be safe for import\n                                    binding.template = that.importFunctionSafe(initializerName, initializer);\n                                    binding.pathExpression = that.bindingExpression(binding);\n                                    binding.nestedTemplate = ++nestedTemplates;\n                                    binding.kind = BindingKind.template;\n                                } else if (initializer.winControl && initializer.winControl.render) {\n                                    requireSupportedForProcessing(initializer.winControl.render);\n                                    // We have already checked this to be safe to import\n                                    binding.template = that.importFunctionSafe(initializerName, initializer.winControl);\n                                    binding.pathExpression = that.bindingExpression(binding);\n                                    binding.nestedTemplate = ++nestedTemplates;\n                                    binding.kind = BindingKind.template;\n                                } else {\n                                    // Don't get the path expression here, we will do it if needed in optimize\n                                    binding.initializer = that.importFunction(initializerName, initializer);\n                                    binding.bindToken = ++bindTokens;\n                                    binding.kind = BindingKind.initializer;\n                                }\n                            } else {\n                                // Don't get the path expression here, we will do it if needed in optimize\n                                // We have already checked this to be safe to import\n                                binding.initializer = that.importFunctionSafe(\"templateDefaultInitializer\", that._defaultInitializer);\n                                binding.bindToken = ++bindTokens;\n                                binding.kind = BindingKind.initializer;\n                            }\n                            binding.elementCapture = that.capture(element);\n                            binding.bindingText = bindingText;\n                        });\n                        bindings.push.apply(bindings, elementBindings);\n                    }\n\n                    var nestedTemplateCount = nestedTemplates + 1;\n                    if (nestedTemplateCount > 0) {\n                        this.async = true;\n                        this._nestedTemplates = this.defineInstance(\n                            InstanceKind.variable,\n                            \"nestedTemplates\",\n                            function () { return newArray(nestedTemplateCount); }\n                        );\n                    }\n\n                    var bindTokenCount = bindTokens + 1;\n                    if (bindTokenCount > 0) {\n                        this._bindTokens = this.defineInstance(\n                            InstanceKind.variable,\n                            \"bindTokens\",\n                            function () { return newArray(bindTokenCount); }\n                        );\n                        this._suffix.push(function () {\n                            // NOTE: returnedElement is a local in the template which is set to either be the container\n                            //       or in the extractChild: true case the first child.\n                            return that.formatCode(\n                                \"{utilities_data}(returnedElement).bindTokens = {bindTokens}\",\n                                {\n                                    utilities_data: that._staticVariables.utilities_data,\n                                    bindTokens: that._bindTokens,\n                                }\n                            );\n                        });\n                    }\n\n                    return bindings;\n\n                },\n\n                gatherChildren: function () {\n\n                    var that = this;\n                    return Array.prototype.map.call(this._templateContent.children, function (child) { return that.capture(child); });\n\n                },\n\n                gatherControls: function () {\n\n                    var that = this;\n                    var asyncCount = 0;\n                    var controls = [];\n                    var selector = \"[data-win-control]\";\n                    var elements = this._templateContent.querySelectorAll(selector);\n                    for (var i = 0, len = elements.length; i < len; i++) {\n                        var element = elements[i];\n                        var name = element.getAttribute(\"data-win-control\");\n                        // Control constructors are checked along the entirety of their path to be supported\n                        //  for processing when they are bound\n                        var ControlConstructor = _BaseUtils._getMemberFiltered(name.trim(), _Global, requireSupportedForProcessing);\n                        if (!ControlConstructor) {\n                            continue;\n                        }\n\n                        var optionsText = element.getAttribute(\"data-win-options\") || literal({});\n                        var async = ControlConstructor.length > 2;\n                        if (async) {\n                            asyncCount++;\n                            this.async = true;\n                        }\n\n                        var isDeclarativeControlContainer = ControlConstructor.isDeclarativeControlContainer;\n                        if (isDeclarativeControlContainer) {\n                            if (typeof isDeclarativeControlContainer === \"function\") {\n                                isDeclarativeControlContainer = this.importFunction(name + \"_isDeclarativeControlContainer\", isDeclarativeControlContainer);\n                            }\n\n                            element.isDeclarativeControlContainer = isDeclarativeControlContainer;\n                            i += element.querySelectorAll(selector).length;\n                        }\n\n                        var control = {\n                            elementCapture: this.capture(element),\n                            name: name,\n                            // We have already checked this for requireSupportedForProcessing\n                            SafeConstructor: this.importFunctionSafe(name, ControlConstructor),\n                            async: async,\n                            optionsText: literal(optionsText),\n                            optionsParsed: options_parser(optionsText),\n                            isDeclarativeControlContainer: isDeclarativeControlContainer,\n                        };\n                        controls.push(control);\n\n                        var globalReferences = this.findGlobalIdentifierExpressions(control.optionsParsed);\n                        globalReferences.forEach(function (identifierExpression) {\n                            identifierExpression.pathExpression = that.globalExpression(identifierExpression.parts);\n                        });\n                    }\n\n                    if (asyncCount > 0) {\n                        this._controlCounter = this.defineInstance(\n                            InstanceKind.variable,\n                            \"controlCounter\",\n                            // +1 because we call it once to start in case we have no async controls in the async template\n                            function () { return literal(asyncCount + 1); }\n                        );\n                    }\n\n                    return controls;\n\n                },\n\n                generateElementCaptureAccess: function (l, r, root) {\n\n                    if (root) {\n                        // Clean up the right hand side so we don't end up with \"startIndex + 0\"\n                        var right = (\"\" + r === \"0\" ? \"\" : \" + \" + r);\n\n                        return this.formatCodeN(\"{0}.children[startIndex{1}]\", l, right);\n                    }\n                    return this.formatCodeN(\"{0}.children[{1}]\", l, r);\n\n                },\n\n                generateNormalAccess: function (left, right, root, filter, last) {\n\n                    // The 'last' parameter indicates that this path access is the last part of a greater\n                    // access expression and therefore does not need to be further assigned to the temp.\n\n                    if (left.indexOf(this.nullableIdentifierAccessTemporary) >= 0) {\n                        // If the nullableIdentifierAccessTemporary is on the LHS then the\n                        // LHS is already an access expression and does not need to be null-checked again\n                        var formatString;\n                        if (last) {\n                            formatString = \"{left} && {filter}({temp}{right})\";\n                        } else {\n                            formatString = \"{left} && ({temp} = {filter}({temp}{right}))\";\n                        }\n                        return this.formatCode(formatString, {\n                            temp: this.nullableIdentifierAccessTemporary,\n                            left: left,\n                            right: identifierAccessExpression([right]),\n                            filter: filter\n                        });\n                    }\n                    var formatString;\n                    if (last) {\n                        formatString = \"({temp} = {left}) && {filter}({temp}{right})\";\n                    } else {\n                        formatString = \"({temp} = {left}) && ({temp} = {filter}({temp}{right}))\";\n                    }\n                    return this.formatCode(formatString, {\n                        temp: this.nullableIdentifierAccessTemporary,\n                        left: left,\n                        right: identifierAccessExpression([right]),\n                        filter: filter\n                    });\n\n                },\n\n                generateOptionsLiteral: function (optionsParsed, elementCapture) {\n\n                    var parts = [];\n                    this.emitOptionsNode(optionsParsed, parts, elementCapture);\n                    return parts.join(\" \");\n\n                },\n\n                generateDebugBreak: function () {\n\n                    if (this._debugBreak) {\n                        var counter = this.defineStatic(\n                            StaticKind.variable,\n                            \"debugCounter\",\n                            function () { return literal(0); }\n                        );\n                        return this.formatCodeN(\"if (++{0} === 1) {{ debugger; }}\", counter);\n                    }\n                    return \"\";\n\n                },\n\n                globalExpression: function (path) {\n\n                    return this._globalCSE.createPathExpression(path, path.join(\"_\"));\n\n                },\n\n                importFunction: function (name, i) {\n\n                    // Used for functions which are gathered from user code (e.g. binding initializers and\n                    //  control constructors). For these functions we need to assert that they are safe for\n                    //  use in a declarative context, however since the values are known at compile time we\n                    //  can do that check once.\n                    //\n                    return this.importFunctionSafe(name, requireSupportedForProcessing(i));\n\n                },\n\n                importFunctionSafe: function (name, i) {\n\n                    // Used for functions and objects which are intrinsic to the template compiler and are safe\n                    //  for their intended usages and don't need to be marked requireSupportedForProcessing.\n                    //\n                    var that = this;\n                    var identifier = this.defineStatic(\n                        StaticKind.imported,\n                        name,\n                        function () { return that.formatCodeN(\"({0}{1})\", IMPORTS_ARG_NAME, identifierAccessExpression([name])); }\n                    );\n                    if (identifier.imported && identifier.imported !== i) {\n                        throw \"Duplicate import: '\" + name + \"'\";\n                    }\n                    identifier.imported = i;\n                    return identifier;\n\n                },\n\n                importAll: function (imports) {\n                    Object.keys(imports).forEach(function (key) {\n                        requireSupportedForProcessing(imports[key]);\n                    });\n                    return this.importAllSafe(imports);\n                },\n\n                importAllSafe: function (imports) {\n\n                    var that = this;\n                    var result = Object.keys(imports).reduce(\n                        function (o, key) {\n                            o[key] = that.importFunctionSafe(key, imports[key]);\n                            return o;\n                        },\n                        {}\n                    );\n                    return result;\n\n                },\n\n                link: function (body) {\n\n                    if (this._stage > Stage.link) {\n                        throw \"Illegal: once we have moved past link we cannot revist it\";\n                    }\n                    this._stage = Stage.link;\n\n                    var that = this;\n\n                    // Gather the set of imported instances (functions mostly). All of these are runtime values which\n                    //  are already safety checked for things like requireSupportedForProcessing.\n                    //\n                    var imports = keys(this._staticVariables)\n                        .filter(function (key) { return that._staticVariables[key].kind === StaticKind.imported; })\n                        .reduce(\n                            function (o, key) {\n                                o[key] = that._staticVariables[key].imported;\n                                return o;\n                            },\n                            {}\n                        );\n\n                    var statics = values(this._staticVariables);\n\n                    return new Function(IMPORTS_ARG_NAME, // jshint ignore:line\n                        this.formatCode(\n                            linkerCodeTemplate,\n                            {\n                                static_variable_declarations: declarationList(statics),\n                                static_variable_definitions: statements(statics.map(function (s) { return s.definition(); })),\n                                body: body.trim(),\n                            }\n                        )\n                    )(imports);\n\n                },\n\n                lower: function () {\n\n                    if (this._stage > Stage.lower) {\n                        throw \"Illegal: once we have moved past lower we cannot revist it\";\n                    }\n                    this._stage = Stage.lower;\n\n                    this._captureCSE.lower();\n                    this._dataCSE.lower();\n                    this._globalCSE.lower();\n\n                },\n\n                markBindingAsError: function (binding) {\n                    if (binding) {\n                        binding.kind = BindingKind.error;\n                        this.markBindingAsError(binding.original);\n                    }\n                },\n\n                oneTimeTextBinding: function (binding) {\n\n                    var that = this;\n                    var result = this.oneTimeTextBindingAnalyze(binding);\n                    if (result) {\n                        var initialValue;\n                        if (binding.original) {\n                            initialValue = binding.original.initialValue;\n                        }\n                        var id = this.createTextBindingHole(binding.elementCapture.element.tagName, result.attribute, ++this._textBindingId);\n                        binding.textBindingId = id;\n                        binding.kind = BindingKind.text;\n                        binding.elementCapture.refCount--;\n                        binding.definition = function () {\n                            var formatString;\n                            if (initialValue) {\n                                formatString = \"{htmlEscape}({initialValue})\";\n                            } else {\n                                formatString = \"{htmlEscape}({getter})\";\n                            }\n                            return that.formatCode(\n                                formatString,\n                                {\n                                    htmlEscape: that._staticVariables.htmlEscape,\n                                    getter: binding.value(),\n                                    initialValue: initialValue,\n                                }\n                            );\n                        };\n\n                        switch (result.kind) {\n                            case TextBindingKind.attribute:\n                                binding.elementCapture.element.setAttribute(result.attribute, id);\n                                break;\n\n                            case TextBindingKind.booleanAttribute:\n                                // Boolean attributes work differently, the presence of the attribute in any\n                                //  form means true and its absence means false. This means that we need to\n                                //  add or remove the whole thing and make the definition of the binding\n                                //  expression at runtime add it back.\n                                //\n                                binding.elementCapture.element.setAttribute(result.attribute, id);\n\n                                // Wrap the definition in a ternary expression which yields either the attribute\n                                //  name or an empty string.\n                                //\n                                binding.definition = function () {\n                                    var formatString;\n                                    if (initialValue) {\n                                        formatString = \"({initialValue} ? {attribute} : \\\"\\\")\";\n                                    } else {\n                                        formatString = \"({value} ? {attribute} : \\\"\\\")\";\n                                    }\n                                    return that.formatCode(\n                                        formatString,\n                                        {\n                                            value: binding.value(),\n                                            attribute: literal(result.attribute),\n                                            initialValue: initialValue\n                                        }\n                                    );\n                                };\n\n                                // Arrange for the attribute in the HTML with the 'id' as a value to be wholy\n                                //  replaced by the ID.\n                                //\n                                this._htmlProcessors.push(function (html) {\n                                    return html.replace(new RegExp(result.attribute + \"=\\\"\" + id + \"\\\"\", \"i\"), id);\n                                });\n                                break;\n\n                            case TextBindingKind.textContent:\n                                binding.elementCapture.element.textContent = id;\n                                break;\n\n                            case TextBindingKind.inlineStyle:\n                                var element = binding.elementCapture.element;\n                                // Inline styles require a little finesseing, their form always needs to be\n                                //  legal CSS include in the value space. We could attempt to special case\n                                //  all CSS properties and produce something which is legal in their value\n                                //  space but instead we wholesale replace the inline CSS with a extension\n                                //  property temporarially in order to get valid HTML. Later we go replace\n                                //  that well-known hole with the original inline CSS text as well as any\n                                //  new properties we are setting as a result of data binding.\n                                //\n                                if (!element.msReplaceStyle) {\n                                    element.msReplaceStyle = element.getAttribute(\"style\") || \"\";\n                                    // Ensure that there is always a trailing ';'\n                                    if (element.msReplaceStyle !== \"\" && element.msReplaceStyle[element.msReplaceStyle.length - 1] !== \";\") {\n                                        element.msReplaceStyle = element.msReplaceStyle + \";\";\n                                    }\n                                    element.setAttribute(\"style\", \"msReplaceStyle:'\" + id + \"'\");\n                                    var temp = element.getAttribute(\"style\");\n                                    this._htmlProcessors.push(function (html) {\n                                        return html.replace(temp, element.msReplaceStyle);\n                                    });\n                                }\n                                element.msReplaceStyle = element.msReplaceStyle + result.property + \":\" + id + \";\";\n                                break;\n\n                            default:\n                                throw \"NYI\";\n                        }\n                    }\n\n                },\n\n                oneTimeTextBindingAnalyze: function (binding) {\n                    var element = binding.elementCapture.element;\n                    var elementType = element.tagName;\n                    var targetProperty = binding.destination[0];\n\n                    // Properties which can only be optimized for a given element types\n                    //\n                    switch (elementType) {\n                        case \"A\":\n                            switch (targetProperty) {\n                                case \"href\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n                            }\n                            break;\n\n                        case \"IMG\":\n                            switch (targetProperty) {\n                                case \"alt\":\n                                case \"src\":\n                                case \"width\":\n                                case \"height\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n                            }\n                            break;\n\n                        case \"SELECT\":\n                            switch (targetProperty) {\n                                case \"disabled\":\n                                case \"multiple\":\n                                case \"required\":\n                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n\n                                case \"size\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n                            }\n                            break;\n\n                        case \"OPTION\":\n                            switch (targetProperty) {\n                                case \"label\":\n                                case \"value\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n\n                                case \"disabled\":\n                                case \"selected\":\n                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n                            }\n                            break;\n\n                        case \"INPUT\":\n                            switch (targetProperty) {\n                                case \"checked\":\n                                    switch (element.type) {\n                                        case \"checkbox\":\n                                        case \"radio\":\n                                            return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n                                    }\n                                    break;\n\n                                case \"disabled\":\n                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n\n                                case \"max\":\n                                case \"maxLength\":\n                                case \"min\":\n                                case \"step\":\n                                case \"value\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n\n                                case \"size\":\n                                    switch (element.type) {\n                                        case \"text\":\n                                        case \"search\":\n                                        case \"tel\":\n                                        case \"url\":\n                                        case \"email\":\n                                        case \"password\":\n                                            return { kind: TextBindingKind.attribute, attribute: targetProperty };\n                                    }\n                                    break;\n\n                                case \"readOnly\":\n                                    switch (element.type) {\n                                        case \"hidden\":\n                                        case \"range\":\n                                        case \"color\":\n                                        case \"checkbox\":\n                                        case \"radio\":\n                                        case \"file\":\n                                        case \"button\":\n                                            // not supported:\n                                            break;\n\n                                        default:\n                                            return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n                                    }\n                                    break;\n                            }\n                            break;\n\n                        case \"BUTTON\":\n                            switch (targetProperty) {\n                                case \"disabled\":\n                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n\n                                case \"value\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n                            }\n                            break;\n\n                        case \"TEXTAREA\":\n                            switch (targetProperty) {\n                                case \"disabled\":\n                                case \"readOnly\":\n                                case \"required\":\n                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };\n\n                                case \"cols\":\n                                case \"maxLength\":\n                                case \"placeholder\":\n                                case \"rows\":\n                                case \"wrap\":\n                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };\n                            }\n                            break;\n                    }\n\n                    // Properties which can be optimized for all element types\n                    //\n                    switch (targetProperty) {\n                        case \"className\":\n                            return { kind: TextBindingKind.attribute, attribute: \"class\" };\n\n                        case \"dir\":\n                        case \"lang\":\n                        case \"name\":\n                        case \"title\":\n                        case \"tabIndex\":\n                            return { kind: TextBindingKind.attribute, attribute: targetProperty };\n\n                        case \"style\":\n                            if (binding.destination.length > 1) {\n                                var targetCssProperty = binding.destination[1];\n                                if (targetCssProperty === \"cssText\") {\n                                    // We don't support optimizing the cssText property on styles\n                                    //\n                                    return;\n                                }\n                                // If this is a supported css property we will get a string (frequently empty)\n                                //  from the style object.\n                                //\n                                var supported = typeof element.style[targetCssProperty] === \"string\";\n                                if (supported) {\n                                    //  The mapping from css property name to JS property name is regular:\n                                    //  Chrome uses webkit as the JS property name prefix.\n                                    //  IE uses ms as the JS property name prefix.\n                                    //  Firefox uses Moz as the JS property name prefix.\n                                    //\n                                    //  To calculate the css property name we replace capital letters with\n                                    //  a dash followed by the lowercase version of that letter.\n                                    //\n                                    //  For Chrome and IE we have to add the leading dash manually since\n                                    //  the JS property name prefix is lowercase. For Firefox the replace\n                                    //  call will take care of this for us since their JS property name\n                                    //  prefix begins with a capital letter.\n                                    if (targetCssProperty[0] === \"m\" && targetCssProperty[1] === \"s\" ||\n                                            targetCssProperty.substring(0, 6) === \"webkit\") {\n                                        targetCssProperty = \"-\" + targetCssProperty;\n                                    }\n                                    targetCssProperty = targetCssProperty.replace(capitalRegEx, function (l) {\n                                        return \"-\" + l.toLowerCase();\n                                    });\n                                    return { kind: TextBindingKind.inlineStyle, property: targetCssProperty, attribute: \"style\" };\n                                }\n                            }\n                            break;\n\n                        case \"innerText\":\n                        case \"textContent\":\n                            return { kind: TextBindingKind.textContent, attribute: \"textContent\" };\n                    }\n                },\n\n                oneTimeTreeBinding: function (binding) {\n\n                    if (binding.destination.length === 1 && binding.destination[0] === \"id\") {\n                        if (_BaseUtils.validation) {\n                            throw new _ErrorFromName(\"WinJS.Binding.IdBindingNotSupported\", _Resources._formatString(strings.idBindingNotSupported, binding.bindingText));\n                        }\n                        _Log.log && _Log.log(_Resources._formatString(strings.idBindingNotSupported, binding.bindingText), \"winjs binding\", \"error\");\n                        this.markBindingAsError(binding);\n                        return;\n                    }\n\n                    if (binding.destination.length === 0) {\n                        _Log.log && _Log.log(strings.cannotBindToThis, \"winjs binding\", \"error\");\n                        this.markBindingAsError(binding);\n                        return;\n                    }\n\n                    var that = this;\n                    var initialValue;\n                    binding.pathExpression = this.bindingExpression(binding);\n                    binding.value = function () {\n                        return binding.pathExpression;\n                    };\n                    if (binding.original) {\n                        initialValue = binding.pathExpression;\n                        binding.original.initialValue = initialValue;\n                    }\n                    binding.kind = BindingKind.tree;\n                    binding.definition = function () {\n                        var formatString;\n                        if (initialValue) {\n                            formatString = \"({targetPath} || {{}}){prop} = {initialValue}\";\n                        } else {\n                            formatString = \"({targetPath} || {{}}){prop} = {sourcePath}\";\n                        }\n                        return that.formatCode(\n                            formatString,\n                            {\n                                targetPath: nullableFilteredIdentifierAccessExpression(\n                                    binding.elementCapture,\n                                    binding.destination.slice(0, -1),\n                                    that.nullableIdentifierAccessTemporary,\n                                    that.importFunctionSafe(\"targetSecurityCheck\", targetSecurityCheck)\n                                ),\n                                prop: identifierAccessExpression(binding.destination.slice(-1)),\n                                sourcePath: binding.value(),\n                                initialValue: initialValue,\n                            }\n                        );\n                    };\n\n                },\n\n                optimize: function () {\n\n                    if (this._stage > Stage.optimze) {\n                        throw \"Illegal: once we have moved past link we cannot revist it\";\n                    }\n                    this._stage = Stage.optimze;\n\n                    // Identify all bindings which can be turned into tree bindings, in some cases this consists\n                    //  of simply changing their type and providing a definition, in other cases it involves\n                    //  adding a new tree binding to complement the other binding\n                    //\n                    for (var i = 0; i < this._bindings.length; i++) {\n                        var binding = this._bindings[i];\n                        if (binding.template) {\n                            continue;\n                        }\n\n                        switch (binding.initializer.imported) {\n                            case init_defaultBind:\n                                // Add a new tree binding for one-time binding and mark the defaultBind as delayable\n                                var newBinding = merge(binding, {\n                                    kind: BindingKind.tree,\n                                    initializer: this.importFunctionSafe(\"init_oneTime\", init_oneTime),\n                                    original: binding,\n                                });\n                                newBinding.elementCapture.refCount++;\n                                this.oneTimeTreeBinding(newBinding);\n                                this._bindings.splice(i, 0, newBinding);\n                                binding.delayable = true;\n                                i++;\n                                break;\n\n                            case init_setAttribute:\n                                // Add a new tree binding for one-time setAttribute and mark the setAttribute as delayable\n                                var newBinding = merge(binding, {\n                                    kind: BindingKind.tree,\n                                    initializer: this.importFunctionSafe(\"init_setAttributeOneTime\", init_setAttributeOneTime),\n                                    original: binding,\n                                });\n                                newBinding.elementCapture.refCount++;\n                                this.setAttributeOneTimeTreeBinding(newBinding);\n                                this._bindings.splice(i, 0, newBinding);\n                                binding.delayable = true;\n                                i++;\n                                break;\n\n                            case init_oneTime:\n                                this.oneTimeTreeBinding(binding);\n                                break;\n\n                            case init_setAttributeOneTime:\n                                this.setAttributeOneTimeTreeBinding(binding);\n                                break;\n\n                            case init_addClassOneTime:\n                                this.addClassOneTimeTreeBinding(binding);\n                                break;\n\n                            default:\n                                if (binding.initializer) {\n                                    binding.delayable = !!binding.initializer.imported.delayable;\n                                }\n                                break;\n                        }\n                    }\n\n                    if (this._optimizeTextBindings) {\n\n                        // Identifiy all potential text bindings and generate text replacement expressions\n                        //\n                        var textBindings = {};\n                        for (var i = 0; i < this._bindings.length; i++) {\n                            var binding = this._bindings[i];\n                            if (binding.template) {\n                                continue;\n                            }\n                            if (binding.kind === BindingKind.error) {\n                                continue;\n                            }\n\n                            switch (binding.initializer.imported) {\n                                case init_oneTime:\n                                    this.oneTimeTextBinding(binding);\n                                    break;\n\n                                case init_setAttributeOneTime:\n                                    this.setAttributeOneTimeTextBinding(binding);\n                                    break;\n\n                                case init_addClassOneTime:\n                                    this.addClassOneTimeTextBinding(binding);\n                                    break;\n\n                                default:\n                                    break;\n                            }\n                            if (binding.textBindingId) {\n                                textBindings[binding.textBindingId] = binding;\n                            }\n                        }\n\n                        if (Object.keys(textBindings).length) {\n                            var newHtml = this._templateContent.innerHTML;\n\n                            // Perform any adjustments to the HTML that are needed for things like styles and\n                            //  boolean attributes\n                            //\n                            newHtml = this._htmlProcessors.reduce(\n                                function (html, replacer) {\n                                    return replacer(html);\n                                },\n                                newHtml\n                            );\n\n                            // All the even indexes are content and all the odds are replacements\n                            //\n                            // NOTE: this regular expression is\n                            var parts = newHtml.split(this._textBindingRegex);\n                            for (var i = 1; i < parts.length; i += 2) {\n                                var binding = textBindings[parts[i]];\n                                parts[i] = binding.definition;\n                            }\n\n                            // Generate the function which will code-gen the HTML replacements.\n                            //\n                            this._html = function () {\n                                var result = parts.map(function (p) {\n                                    // the strings are the literal parts of the HTML that came directly from the DOM\n                                    // the functions are the definitions for string replacements\n                                    return typeof p === \"string\" ? literal(p) : p();\n                                }).join(\" + \");\n                                return multiline(result);\n                            };\n                        }\n\n                    }\n\n                },\n\n                prettify: function (result) {\n\n                    // remove all lines which contain nothing but a semi-colon\n                    var lines = result.split(\"\\n\");\n                    return lines.filter(function (line) { return !semiColonOnlyLineRegEx.test(line); }).join(\"\\n\");\n\n                },\n\n                setAttributeOneTimeTextBinding: function (binding) {\n\n                    var that = this;\n                    var attribute = binding.destination[0];\n                    var id = this.createTextBindingHole(binding.elementCapture.element.tagName, attribute, ++this._textBindingId);\n                    var initialValue;\n                    if (binding.original) {\n                        initialValue = binding.original.initialValue;\n                    }\n                    binding.textBindingId = id;\n                    binding.kind = BindingKind.text;\n                    binding.elementCapture.element.setAttribute(attribute, id);\n                    binding.elementCapture.refCount--;\n                    binding.definition = function () {\n                        var formatString;\n                        if (initialValue) {\n                            formatString = \"{htmlEscape}({initialValue})\";\n                        } else {\n                            formatString = \"{htmlEscape}({value})\";\n                        }\n                        return that.formatCode(\n                            formatString,\n                            {\n                                htmlEscape: that._staticVariables.htmlEscape,\n                                initialValue: initialValue,\n                                value: binding.value(),\n                            }\n                        );\n                    };\n\n                },\n\n                setAttributeOneTimeTreeBinding: function (binding) {\n\n                    if (binding.destination.length === 1 && binding.destination[0] === \"id\") {\n                        if (_BaseUtils.validation) {\n                            throw new _ErrorFromName(\"WinJS.Binding.IdBindingNotSupported\", _Resources._formatString(strings.idBindingNotSupported, binding.bindingText));\n                        }\n                        _Log.log && _Log.log(_Resources._formatString(strings.idBindingNotSupported, binding.bindingText), \"winjs binding\", \"error\");\n                        this.markBindingAsError(binding);\n                        return;\n                    }\n\n                    if (binding.destination.length !== 1 || !binding.destination[0]) {\n                        _Log.log && _Log.log(strings.attributeBindingSingleProperty, \"winjs binding\", \"error\");\n                        this.markBindingAsError(binding);\n                        return;\n                    }\n\n                    var that = this;\n                    var initialValue;\n                    binding.pathExpression = this.bindingExpression(binding);\n                    binding.value = function () {\n                        return binding.pathExpression;\n                    };\n                    if (binding.original) {\n                        initialValue = this.defineInstance(InstanceKind.variable, \"\", binding.value);\n                        binding.original.initialValue = initialValue;\n                    }\n                    binding.kind = BindingKind.tree;\n                    binding.definition = function () {\n                        var formatString;\n                        if (initialValue) {\n                            formatString = \"{element}.setAttribute({attribute}, \\\"\\\" + {initialValue})\";\n                        } else {\n                            formatString = \"{element}.setAttribute({attribute}, \\\"\\\" + {value})\";\n                        }\n                        return that.formatCode(\n                            formatString,\n                            {\n                                element: binding.elementCapture,\n                                attribute: literal(binding.destination[0]),\n                                initialValue: initialValue,\n                                value: binding.value(),\n                            }\n                        );\n                    };\n\n                },\n\n            }, {\n                _TreeCSE: TreeCSE,\n\n                compile: function TemplateCompiler_compile(template, templateElement, options) {\n\n                    if (!(templateElement instanceof _Global.HTMLElement)) {\n                        throw \"Illegal\";\n                    }\n\n                    writeProfilerMark(\"WinJS.Binding.Template:compile\" + options.profilerMarkIdentifier + \",StartTM\");\n\n                    var compiler = new TemplateCompiler(templateElement, options);\n\n                    compiler.analyze();\n\n                    var importAliases = compiler.importAllSafe({\n                        Signal: _Signal,\n                        global: _Global,\n                        document: _Global.document,\n                        cancelBlocker: cancelBlocker,\n                        promise_as: promise_as,\n                        disposeInstance: disposeInstance,\n                        markDisposable: markDisposable,\n                        ui_processAll: ui_processAll,\n                        binding_processAll: binding_processAll,\n                        insertAdjacentHTMLUnsafe: insertAdjacentHTMLUnsafe,\n                        promise: Promise,\n                        utilities_data: utilities_data,\n                        requireSupportedForProcessing: requireSupportedForProcessing,\n                        htmlEscape: htmlEscape,\n                        scopedSelect: scopedSelect,\n                        delayedBindingProcessing: delayedBindingProcessing,\n                        writeProfilerMark: writeProfilerMark\n                    });\n\n                    compiler.optimize();\n\n                    compiler.deadCodeElimination();\n\n                    compiler.lower();\n\n                    var codeTemplate;\n                    var delayBindings;\n                    switch (options.target) {\n                        case \"render\":\n                            codeTemplate = compiler.async ? renderImplCodeAsyncTemplate : renderImplCodeTemplate;\n                            delayBindings = false;\n                            break;\n\n                        case \"renderItem\":\n                            codeTemplate = compiler.async ? renderItemImplCodeAsyncTemplate : renderItemImplCodeTemplate;\n                            delayBindings = true;\n                            break;\n                    }\n\n                    var body = compiler.compile(codeTemplate, importAliases, delayBindings);\n                    var render = compiler.link(body);\n\n                    compiler.done();\n\n                    writeProfilerMark(\"WinJS.Binding.Template:compile\" + options.profilerMarkIdentifier + \",StopTM\");\n\n                    return render;\n                }\n            });\n\n            //\n            // Templates\n            //\n\n            function trimLinesRight(string) {\n                // Replace all empty lines with just a newline\n                // Remove all trailing spaces\n                return string.replace(/^\\s*$/gm, \"\").replace(/^(.*[^\\s])( *)$/gm, function (unused, content) {\n                    return content;\n                });\n            }\n\n\n            var renderImplMainCodePrefixTemplate = trimLinesRight(\n\"container.classList.add(\\\"win-template\\\");                                                              \\n\" +\n\"var html = {html};                                                                                      \\n\" +\n\"{insertAdjacentHTMLUnsafe}(container, \\\"beforeend\\\", html);                                             \\n\" +\n\"returnedElement = {returnedElement};                                                                    \\n\" +\n\"                                                                                                        \\n\" +\n\"// Capture Definitions                                                                                  \\n\" +\n\"{capture_definitions};                                                                                  \\n\" +\n\"{set_msParentSelectorScope};                                                                            \\n\" +\n\"                                                                                                        \\n\"\n);\n\n            var renderImplControlAndBindingProcessing = trimLinesRight(\n\"// Control Processing                                                                                   \\n\" +\n\"{control_processing};                                                                                   \\n\" +\n\"                                                                                                        \\n\" +\n\"// Binding Processing                                                                                   \\n\" +\n\"{binding_processing};                                                                                   \\n\" +\n\"                                                                                                        \\n\" +\n\"var result = {promise_as}(returnedElement);                                                             \\n\"\n);\n\n            var renderImplAsyncControlAndBindingProcessing = trimLinesRight(\n\"var controlSignal = new {Signal}();                                                                     \\n\" +\n\"var controlDone = function () {{ if (--{control_counter} === 0) {{ controlSignal.complete(); }} }};     \\n\" +\n\"controlDone();                                                                                          \\n\" +\n\"                                                                                                        \\n\" +\n\"// Control Processing                                                                                   \\n\" +\n\"{control_processing};                                                                                   \\n\" +\n\"                                                                                                        \\n\" +\n\"var result = controlSignal.promise.then(function () {{                                                  \\n\" +\n\"    // Binding Processing                                                                               \\n\" +\n\"    {binding_processing};                                                                               \\n\" +\n\"    return {promise}.join({nestedTemplates});                                                           \\n\" +\n\"}}).then(function () {{                                                                                 \\n\" +\n\"    return returnedElement;                                                                             \\n\" +\n\"}}).then(null, function (e) {{                                                                          \\n\" +\n\"    if (typeof e === \\\"object\\\" && e.name === \\\"Canceled\\\") {{ returnedElement.dispose(); }}            \\n\" +\n\"    return {promise}.wrapError(e);                                                                      \\n\" +\n\"}});                                                                                                    \\n\"\n);\n\n\n            var renderImplMainCodeSuffixTemplate = trimLinesRight(\n\"{markDisposable}(returnedElement, function () {{ {disposeInstance}(returnedElement, result); }});       \\n\" +\n\"{suffix_statements};                                                                                    \\n\"\n);\n\n            var renderImplCodeTemplate = trimLinesRight(\n\"function render(data, container) {{                                                                     \\n\" +\n\"    {debug_break}                                                                                       \\n\" +\n\"    if (typeof data === \\\"object\\\" && typeof data.then === \\\"function\\\") {{                             \\n\" +\n\"        // async data + a container falls back to interpreted path                                      \\n\" +\n\"        if (container) {{                                                                               \\n\" +\n\"            var result = this._renderInterpreted(data, container);                                      \\n\" +\n\"            return result.element.then(function () {{ return result.renderComplete; }});                \\n\" +\n\"        }}                                                                                              \\n\" +\n\"        return {cancelBlocker}(data).then(function(data) {{ return render(data); }});                   \\n\" +\n\"    }}                                                                                                  \\n\" +\n\"                                                                                                        \\n\" +\n\"    {writeProfilerMark}({profilerMarkIdentifierStart});                                                 \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Declarations                                                                                     \\n\" +\n\"    var {instance_variable_declarations};                                                               \\n\" +\n\"    var returnedElement;                                                                                \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Global Definitions                                                                               \\n\" +\n\"    {global_definitions};                                                                               \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Data Definitions                                                                                 \\n\" +\n\"    data = (data === {global} ? data : {requireSupportedForProcessing}(data));                          \\n\" +\n\"    {data_definitions};                                                                                 \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Instance Variable Definitions                                                                    \\n\" +\n\"    {instance_variable_definitions};                                                                    \\n\" +\n\"                                                                                                        \\n\" +\n\"    // HTML Processing                                                                                  \\n\" +\n\"    container = container || {document}.createElement({tagName});                                       \\n\" +\n\"    var startIndex = container.childElementCount;                                                       \\n\" +\n\"    \" + trim(indent(4, renderImplMainCodePrefixTemplate)) + \"                                           \\n\" +\n\"                                                                                                        \\n\" +\n\"    \" + trim(indent(4, renderImplControlAndBindingProcessing)) + \"                                      \\n\" +\n\"    \" + trim(indent(4, renderImplMainCodeSuffixTemplate)) + \"                                           \\n\" +\n\"                                                                                                        \\n\" +\n\"    {writeProfilerMark}({profilerMarkIdentifierStop});                                                  \\n\" +\n\"                                                                                                        \\n\" +\n\"    return result;                                                                                      \\n\" +\n\"}}                                                                                                      \\n\"\n);\n\n            var renderImplCodeAsyncTemplate = trimLinesRight(\n\"function render(data, container) {{                                                                     \\n\" +\n\"    {debug_break}                                                                                       \\n\" +\n\"    if (typeof data === \\\"object\\\" && typeof data.then === \\\"function\\\") {{                             \\n\" +\n\"        // async data + a container falls back to interpreted path                                      \\n\" +\n\"        if (container) {{                                                                               \\n\" +\n\"            var result = this._renderInterpreted(data, container);                                      \\n\" +\n\"            return result.element.then(function () {{ return result.renderComplete; }});                \\n\" +\n\"        }}                                                                                              \\n\" +\n\"        return {cancelBlocker}(data).then(function(data) {{ return render(data, container); }});        \\n\" +\n\"    }}                                                                                                  \\n\" +\n\"                                                                                                        \\n\" +\n\"    {writeProfilerMark}({profilerMarkIdentifierStart});                                                 \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Declarations                                                                                     \\n\" +\n\"    var {instance_variable_declarations};                                                               \\n\" +\n\"    var returnedElement;                                                                                \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Global Definitions                                                                               \\n\" +\n\"    {global_definitions};                                                                               \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Data Definitions                                                                                 \\n\" +\n\"    data = (data === {global} ? data : {requireSupportedForProcessing}(data));                          \\n\" +\n\"    {data_definitions};                                                                                 \\n\" +\n\"                                                                                                        \\n\" +\n\"    // Instance Variable Definitions                                                                    \\n\" +\n\"    {instance_variable_definitions};                                                                    \\n\" +\n\"                                                                                                        \\n\" +\n\"    // HTML Processing                                                                                  \\n\" +\n\"    container = container || {document}.createElement({tagName});                                       \\n\" +\n\"    var startIndex = container.childElementCount;                                                       \\n\" +\n\"    \" + trim(indent(4, renderImplMainCodePrefixTemplate)) + \"                                           \\n\" +\n\"                                                                                                        \\n\" +\n\"    \" + trim(indent(4, renderImplAsyncControlAndBindingProcessing)) + \"                                 \\n\" +\n\"    \" + trim(indent(4, renderImplMainCodeSuffixTemplate)) + \"                                           \\n\" +\n\"                                                                                                        \\n\" +\n\"    {writeProfilerMark}({profilerMarkIdentifierStop});                                                  \\n\" +\n\"                                                                                                        \\n\" +\n\"    return result;                                                                                      \\n\" +\n\"}}                                                                                                      \\n\"\n);\n\n            var renderItemImplMainCodeSuffixTemplate = trimLinesRight(\n\"{markDisposable}(returnedElement, function () {{ {disposeInstance}(returnedElement, result, renderComplete); }});\\n\" +\n\"{suffix_statements};                                                                                    \\n\"\n);\n\n            var renderItemImplCodeTemplate = trimLinesRight(\n\"function renderItem(itemPromise) {{                                                                     \\n\" +\n\"    {debug_break}                                                                                       \\n\" +\n\"    // Declarations                                                                                     \\n\" +\n\"    var {instance_variable_declarations};                                                               \\n\" +\n\"    var element, renderComplete, data, returnedElement;                                                 \\n\" +\n\"                                                                                                        \\n\" +\n\"    element = itemPromise.then(function renderItem(item) {{                                             \\n\" +\n\"        if (typeof item.data === \\\"object\\\" && typeof item.data.then === \\\"function\\\") {{               \\n\" +\n\"            return {cancelBlocker}(item.data).then(function (data) {{ return renderItem({{ data: data }}); }});\\n\" +\n\"        }}                                                                                              \\n\" +\n\"                                                                                                        \\n\" +\n\"        {writeProfilerMark}({profilerMarkIdentifierStart});                                             \\n\" +\n\"                                                                                                        \\n\" +\n\"        // Global Definitions                                                                           \\n\" +\n\"        {global_definitions};                                                                           \\n\" +\n\"                                                                                                        \\n\" +\n\"        // Data Definitions                                                                             \\n\" +\n\"        data = item.data;                                                                               \\n\" +\n\"        data = (data === {global} ? data : {requireSupportedForProcessing}(data));                      \\n\" +\n\"        {data_definitions};                                                                             \\n\" +\n\"                                                                                                        \\n\" +\n\"        // Instance Variable Definitions                                                                \\n\" +\n\"        {instance_variable_definitions};                                                                \\n\" +\n\"                                                                                                        \\n\" +\n\"        // HTML Processing                                                                              \\n\" +\n\"        var container = {document}.createElement({tagName});                                            \\n\" +\n\"        var startIndex = 0;                                                                             \\n\" +\n\"        \" + trim(indent(8, renderImplMainCodePrefixTemplate)) + \"                                       \\n\" +\n\"                                                                                                        \\n\" +\n\"        \" + trim(indent(8, renderImplControlAndBindingProcessing)) + \"                                  \\n\" +\n\"        \" + trim(indent(8, renderItemImplMainCodeSuffixTemplate)) + \"                                   \\n\" +\n\"                                                                                                        \\n\" +\n\"        {writeProfilerMark}({profilerMarkIdentifierStop});                                              \\n\" +\n\"                                                                                                        \\n\" +\n\"        return result;                                                                                  \\n\" +\n\"    }});                                                                                                \\n\" +\n\"    {renderComplete};                                                                                   \\n\" +\n\"    return {{                                                                                           \\n\" +\n\"        element: element,                                                                               \\n\" +\n\"        renderComplete: renderComplete || element,                                                      \\n\" +\n\"    }};                                                                                                 \\n\" +\n\"}}                                                                                                      \\n\"\n);\n\n            var renderItemImplRenderCompleteTemplate = trimLinesRight(\n\"renderComplete = element.then(function () {{                                                            \\n\" +\n\"    return itemPromise;                                                                                 \\n\" +\n\"}}).then(function (item) {{                                                                             \\n\" +\n\"    return item.ready || item;                                                                          \\n\" +\n\"}}).then(function (item) {{                                                                             \\n\" +\n\"    {delayed_binding_processing};                                                                       \\n\" +\n\"    return element;                                                                                     \\n\" +\n\"}});                                                                                                    \\n\"\n);\n\n            var renderItemImplCodeAsyncTemplate = trimLinesRight(\n\"function renderItem(itemPromise) {{                                                                     \\n\" +\n\"    {debug_break}                                                                                       \\n\" +\n\"    // Declarations                                                                                     \\n\" +\n\"    var {instance_variable_declarations};                                                               \\n\" +\n\"    var element, renderComplete, data, returnedElement;                                                 \\n\" +\n\"                                                                                                        \\n\" +\n\"    element = itemPromise.then(function renderItem(item) {{                                             \\n\" +\n\"        if (typeof item.data === \\\"object\\\" && typeof item.data.then === \\\"function\\\") {{               \\n\" +\n\"            return {cancelBlocker}(item.data).then(function (data) {{ return renderItem({{ data: data }}); }});\\n\" +\n\"        }}                                                                                              \\n\" +\n\"                                                                                                        \\n\" +\n\"        {writeProfilerMark}({profilerMarkIdentifierStart});                                             \\n\" +\n\"                                                                                                        \\n\" +\n\"        // Global Definitions                                                                           \\n\" +\n\"        {global_definitions};                                                                           \\n\" +\n\"                                                                                                        \\n\" +\n\"        // Data Definitions                                                                             \\n\" +\n\"        data = item.data;                                                                               \\n\" +\n\"        data = (data === {global} ? data : {requireSupportedForProcessing}(data));                      \\n\" +\n\"        {data_definitions};                                                                             \\n\" +\n\"                                                                                                        \\n\" +\n\"        // Instance Variable Definitions                                                                \\n\" +\n\"        {instance_variable_definitions};                                                                \\n\" +\n\"                                                                                                        \\n\" +\n\"        // HTML Processing                                                                              \\n\" +\n\"        var container = {document}.createElement({tagName});                                            \\n\" +\n\"        var startIndex = 0;                                                                             \\n\" +\n\"        \" + trim(indent(8, renderImplMainCodePrefixTemplate)) + \"                                       \\n\" +\n\"                                                                                                        \\n\" +\n\"        \" + trim(indent(8, renderImplAsyncControlAndBindingProcessing)) + \"                             \\n\" +\n\"        \" + trim(indent(8, renderItemImplMainCodeSuffixTemplate)) + \"                                   \\n\" +\n\"                                                                                                        \\n\" +\n\"        {writeProfilerMark}({profilerMarkIdentifierStop});                                              \\n\" +\n\"                                                                                                        \\n\" +\n\"        return result;                                                                                  \\n\" +\n\"    }});                                                                                                \\n\" +\n\"    {renderComplete};                                                                                   \\n\" +\n\"    return {{                                                                                           \\n\" +\n\"        element: element,                                                                               \\n\" +\n\"        renderComplete: renderComplete || element,                                                      \\n\" +\n\"    }};                                                                                                 \\n\" +\n\"}}                                                                                                      \\n\"\n);\n\n            var linkerCodeTemplate = trimLinesRight(\n\"\\\"use strict\\\";                                                                                         \\n\" +\n\"                                                                                                        \\n\" +\n\"// statics                                                                                              \\n\" +\n\"var {static_variable_declarations};                                                                     \\n\" +\n\"{static_variable_definitions};                                                                          \\n\" +\n\"                                                                                                        \\n\" +\n\"// generated template rendering function                                                                \\n\" +\n\"return {body};                                                                                          \\n\"\n);\n\n            //\n            // End Templates\n            //\n\n            return TemplateCompiler;\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/BindingTemplate',[\n    'exports',\n    './Core/_Global',\n    './Core/_WinRT',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './Core/_Log',\n    './Core/_WriteProfilerMark',\n    './Binding/_Declarative',\n    './BindingTemplate/_DataTemplateCompiler',\n    './ControlProcessor',\n    './Fragments',\n    './Promise',\n    './Utilities/_Dispose',\n    './Utilities/_ElementUtilities'\n    ], function dataTemplateInit(exports, _Global, _WinRT, _Base, _BaseUtils, _Log, _WriteProfilerMark, _Declarative, _DataTemplateCompiler, ControlProcessor, Fragments, Promise, _Dispose, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var cancelBlocker = Promise._cancelBlocker;\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n\n        /// <field>\n        /// <summary locid=\"WinJS.Binding.Template\">\n        /// Provides a reusable declarative binding element.\n        /// </summary>\n        /// </field>\n        /// <name locid=\"WinJS.Binding.Template_name\">Template</name>\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.Binding.Template\"><div>Place content here</div></div>]]></htmlSnippet>\n        /// <icon src=\"base_winjs.ui.template.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"base_winjs.ui.template.16x16.png\" width=\"16\" height=\"16\" />\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Template: _Base.Namespace._lazy(function () {\n            function interpretedRender(template, dataContext, container) {\n                _WriteProfilerMark(\"WinJS.Binding:templateRender\" + template._profilerMarkIdentifier + \",StartTM\");\n\n                if (++template._counter === 1 && (template.debugBreakOnRender || Template._debugBreakOnRender)) {\n                    debugger; // jshint ignore:line\n                }\n\n                var workPromise = Promise.wrap();\n                var d = container || _Global.document.createElement(template.element.tagName);\n\n                _ElementUtilities.addClass(d, \"win-template\");\n                _ElementUtilities.addClass(d, \"win-loading\");\n                var that = template;\n                function done() {\n                    _ElementUtilities.removeClass(d, \"win-loading\");\n                    _WriteProfilerMark(\"WinJS.Binding:templateRender\" + template._profilerMarkIdentifier + \",StopTM\");\n                    return extractedChild || d;\n                }\n                var initial = d.children.length;\n                var element;\n                var extractedChild;\n                var dispose = function () {\n                    var bindings = _ElementUtilities.data(d).winBindings;\n                    if (bindings) {\n                        bindings.forEach(function (item) {\n                            item.cancel();\n                        });\n                    }\n                    workPromise.cancel();\n                };\n                if (template.extractChild) {\n                    element = Fragments.renderCopy(that.href || that.element, _Global.document.createElement(that.element.tagName)).then(function (frag) {\n                        var child = frag.firstElementChild;\n                        extractedChild = child;\n                        _Dispose.markDisposable(child, dispose);\n                        d.appendChild(child);\n                        return child;\n                    });\n                } else {\n                    _Dispose.markDisposable(d, dispose);\n                    element = Fragments.renderCopy(that.href || that.element, d);\n                }\n                var renderComplete = element.\n                    then(function Template_renderImpl_renderComplete_then() {\n                        var work;\n                        // If no existing children, we can do the faster path of just calling\n                        // on the root element...\n                        //\n                        if (initial === 0) {\n                            work = function (f, a, b, c) { return f(extractedChild || d, a, b, c); };\n                        } else {\n                            // We only grab the newly added nodes (always at the end)\n                            // and in the common case of only adding a single new element\n                            // we avoid the \"join\" overhead\n                            //\n                            var all = d.children;\n                            if (all.length === initial + 1) {\n                                work = function (f, a, b, c) { return f(all[initial], a, b, c); };\n                            } else {\n                                // we have to capture the elements first, in case\n                                // doing the work affects the children order/content\n                                //\n                                var elements = [];\n                                for (var i = initial, l = all.length; i < l; i++) {\n                                    elements.push(all[i]);\n                                }\n                                work = function (f, a, b, c) {\n                                    var join = [];\n                                    elements.forEach(function (e) {\n                                        join.push(f(e, a, b, c));\n                                    });\n                                    return Promise.join(join);\n                                };\n                            }\n                        }\n\n                        var child = d.firstElementChild;\n                        while (child) {\n                            child.msParentSelectorScope = true;\n                            child = child.nextElementSibling;\n                        }\n\n                        // This allows \"0\" to mean no timeout (at all) and negative values\n                        // mean setImmediate (no setTimeout). Since Promise.timeout uses\n                        // zero to mean setImmediate, we have to coerce.\n                        //\n                        var timeout = that.processTimeout;\n                        function complete() {\n                            return work(ControlProcessor.processAll).\n                                then(function () { return cancelBlocker(dataContext); }).\n                                then(function Template_renderImpl_Binding_processAll(data) {\n                                    return work(_Declarative.processAll, data, !extractedChild && !initial, that.bindingCache);\n                                }).\n                                then(null, function (e) {\n                                    if (typeof e === \"object\" && e.name === \"Canceled\") {\n                                        (extractedChild || d).dispose();\n                                    }\n                                    return Promise.wrapError(e);\n                                });\n                        }\n                        if (timeout) {\n                            if (timeout < 0) { timeout = 0; }\n                            return Promise.timeout(timeout).then(function () {\n                                workPromise = complete();\n                                return workPromise;\n                            });\n                        } else {\n                            workPromise = complete();\n                            return workPromise;\n                        }\n                    }).then(done, function (err) { done(); return Promise.wrapError(err); });\n\n                return { element: element, renderComplete: renderComplete };\n            }\n\n            var Template = _Base.Class.define(function Template_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.Binding.Template.Template\">\n                /// <summary locid=\"WinJS.Binding.Template.constructor\">\n                /// Creates a template that provides a reusable declarative binding element.\n                /// </summary>\n                /// <param name=\"element\" type=\"DOMElement\" locid=\"WinJS.Binding.Template.constructor_p:element\">\n                /// The DOM element to convert to a template.\n                /// </param>\n                /// <param name=\"options\" type=\"{href:String}\" optional=\"true\" locid=\"WinJS.Binding.Template.constructor_p:options\">\n                /// If this parameter is supplied, the template is loaded from the URI and\n                /// the content of the element parameter is ignored.\n                /// </param>\n                /// </signature>\n\n                this._element = element || _Global.document.createElement(\"div\");\n                this._element.winControl = this;\n\n                this._profilerMarkIdentifier = _BaseUtils._getProfilerMarkIdentifier(this._element);\n                _WriteProfilerMark(\"WinJS.Binding:newTemplate\" + this._profilerMarkIdentifier + \",StartTM\");\n\n                var that = this;\n                this._element.renderItem = function (itemPromise, recycled) { return that._renderItemImpl(itemPromise, recycled); };\n\n                options = options || {};\n                this.href = options.href;\n                this.enableRecycling = !!options.enableRecycling;\n                this.processTimeout = options.processTimeout || 0;\n                this.bindingInitializer = options.bindingInitializer;\n                this.debugBreakOnRender = options.debugBreakOnRender;\n                this.disableOptimizedProcessing = options.disableOptimizedProcessing;\n                this.extractChild = options.extractChild;\n                this._counter = 0;\n\n                // This will eventually change name and reverse polarity, starting opt-in.\n                //\n                this._compile = !!options._compile;\n\n                if (!this.href) {\n                    this.element.style.display = \"none\";\n                }\n                this.bindingCache = { expressions: {} };\n\n                _WriteProfilerMark(\"WinJS.Binding:newTemplate\" + this._profilerMarkIdentifier + \",StopTM\");\n            }, {\n                _shouldCompile: {\n                    get: function () {\n                        // This is the temporary switch to opt-in to compilation, eventually replaced\n                        //  by default opt-in with an opt-out switch.\n                        //\n                        var shouldCompile = true;\n                        shouldCompile = shouldCompile && !Template._interpretAll;\n                        shouldCompile = shouldCompile && !this.disableOptimizedProcessing;\n\n                        if (shouldCompile) {\n                            shouldCompile = shouldCompile && this.processTimeout === 0;\n                            shouldCompile = shouldCompile && (!this.href || this.href instanceof _Global.HTMLElement);\n\n                            if (!shouldCompile) {\n                                _Log.log && _Log.log(\"Cannot compile templates which use processTimeout or href properties\", \"winjs binding\", \"warn\");\n                            }\n                        }\n\n                        return shouldCompile;\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.Template.bindingInitializer\" helpKeyword=\"WinJS.Binding.Template.bindingInitializer\">\n                /// If specified this function is used as the default initializer for any data bindings which do not explicitly specify one. The\n                /// provided function must be marked as supported for processing.\n                /// </field>\n                bindingInitializer: {\n                    get: function () { return this._bindingInitializer; },\n                    set: function (value) {\n                        this._bindingInitializer = value;\n                        this._reset();\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.Binding.Template.debugBreakOnRender\" helpKeyword=\"WinJS.Binding.Template.debugBreakOnRender\">\n                /// Indicates whether a templates should break in the debugger on first render\n                /// </field>\n                debugBreakOnRender: {\n                    get: function () { return this._debugBreakOnRender; },\n                    set: function (value) {\n                        this._debugBreakOnRender = !!value;\n                        this._reset();\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.Binding.Template.disableOptimizedProcessing\" helpKeyword=\"WinJS.Binding.Template.disableOptimizedProcessing\">\n                /// Set this property to true to resotre classic template processing and data binding and disable template compilation.\n                /// </field>\n                disableOptimizedProcessing: {\n                    get: function () { return this._disableOptimizedProcessing; },\n                    set: function (value) {\n                        this._disableOptimizedProcessing = !!value;\n                        this._reset();\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.Binding.Template.element\" helpKeyword=\"WinJS.Binding.Template.element\">\n                /// Gets the DOM element that is used as the template.\n                /// </field>\n                element: {\n                    get: function () { return this._element; },\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.Binding.Template.extractChild\" helpKeyword=\"WinJS.Binding.Template.extractChild\">\n                /// Return the first element child of the template instead of a wrapper element hosting all the template content.\n                /// </field>\n                extractChild: {\n                    get: function () { return this._extractChild; },\n                    set: function (value) {\n                        this._extractChild = !!value;\n                        this._reset();\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.Template.processTimeout\" helpKeyword=\"WinJS.Binding.Template.processTimeout\">\n                /// Number of milliseconds to delay instantiating declarative controls. Zero (0) will result in no delay, any negative number\n                /// will result in a setImmediate delay, any positive number will be treated as the number of milliseconds.\n                /// </field>\n                processTimeout: {\n                    get: function () { return this._processTimeout || 0; },\n                    set: function (value) {\n                        this._processTimeout = value;\n                        this._reset();\n                    }\n                },\n\n                render: _BaseUtils.markSupportedForProcessing(function (dataContext, container) {\n                    /// <signature helpKeyword=\"WinJS.Binding.Template.render\">\n                    /// <summary locid=\"WinJS.Binding.Template.render\">\n                    /// Binds values from the specified data context to elements that are descendents of the specified root element\n                    /// and have the declarative binding attributes (data-win-bind).\n                    /// </summary>\n                    /// <param name=\"dataContext\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.Template.render_p:dataContext\">\n                    /// The object to use for default data binding.\n                    /// </param>\n                    /// <param name=\"container\" type=\"DOMElement\" optional=\"true\" locid=\"WinJS.Binding.Template.render_p:container\">\n                    /// The element to which to add this rendered template. If this parameter is omitted, a new DIV is created.\n                    /// </param>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Binding.Template.render_returnValue\">\n                    /// A promise that is completed after binding has finished. The value is\n                    /// either the element specified in the container parameter or the created DIV.\n                    /// </returns>\n                    /// </signature>\n\n                    return this._renderImpl(dataContext, container);\n                }),\n\n                // Hook point for compiled template\n                //\n                _renderImpl: function (dataContext, container) {\n                    if (this._shouldCompile) {\n                        try {\n                            this._renderImpl = this._compileTemplate({ target: \"render\" });\n                            return this._renderImpl(dataContext, container);\n                        } catch (e) {\n                            return Promise.wrapError(e);\n                        }\n                    }\n\n                    var render = interpretedRender(this, dataContext, container);\n                    return render.element.then(function () { return render.renderComplete; });\n                },\n\n                _renderInterpreted: function (dataContext, container) {\n                    return interpretedRender(this, dataContext, container);\n                },\n\n                renderItem: function (item, recycled) {\n                    /// <signature helpKeyword=\"WinJS.Binding.Template.renderItem\">\n                    /// <summary locid=\"WinJS.Binding.Template.renderItem\">\n                    /// Renders an instance of this template bound to the data contained in item. If\n                    /// the recycled parameter is present, and enableRecycling is true, then the template attempts\n                    /// to reuse the DOM elements from the recycled parameter.\n                    /// </summary>\n                    /// <param name=\"item\" type=\"Object\" optional=\"false\" locid=\"WinJS.Binding.Template.renderItem_p:item\">\n                    /// The object that contains the data to bind to. Only item.data is required.\n                    /// </param>\n                    /// <param name=\"recycled\" type=\"DOMElement\" optional=\"true\" locid=\"WinJS.Binding.Template.renderItem_p:recycled\">\n                    /// A previously-generated template instance.\n                    /// </param>\n                    /// <returns type=\"DOMElement\" locid=\"WinJS.Binding.Template.renderItem_returnValue\">\n                    /// The DOM element.\n                    /// </returns>\n                    /// </signature>\n                    return this._renderItemImpl(item, recycled);\n                },\n\n                // Hook point for compiled template\n                //\n                _renderItemImpl: function (item, recycled) {\n                    if (this._shouldCompile) {\n                        try {\n                            this._renderItemImpl = this._compileTemplate({ target: \"renderItem\" });\n                            return this._renderItemImpl(item);\n                        } catch (e) {\n                            return {\n                                element: Promise.wrapError(e),\n                                renderComplete: Promise.wrapError(e),\n                            };\n                        }\n                    }\n\n                    var that = this;\n\n                    // we only enable element cache when we are trying\n                    // to recycle. Otherwise our element cache would\n                    // grow unbounded.\n                    //\n                    if (this.enableRecycling && !this.bindingCache.elements) {\n                        this.bindingCache.elements = {};\n                    }\n\n                    if (this.enableRecycling\n                        && recycled\n                        && recycled.msOriginalTemplate === this) {\n\n                        // If we are asked to recycle, we cleanup any old work no matter what\n                        //\n                        var cacheEntry = this.bindingCache.elements[recycled.id];\n                        var okToReuse = true;\n                        if (cacheEntry) {\n                            cacheEntry.bindings.forEach(function (v) { v(); });\n                            cacheEntry.bindings = [];\n                            okToReuse = !cacheEntry.nocache;\n                        }\n\n                        // If our cache indicates that we hit a non-cancelable thing, then we are\n                        // in an unknown state, so we actually can't recycle the tree. We have\n                        // cleaned up what we can, but at this point we need to reset and create\n                        // a new tree.\n                        //\n                        if (okToReuse) {\n                            // Element recycling requires that there be no other content in \"recycled\" other than this\n                            // templates' output.\n                            //\n                            return {\n                                element: recycled,\n                                renderComplete: item.then(function (item) {\n                                    return _Declarative.processAll(recycled, item.data, true, that.bindingCache);\n                                }),\n                            };\n                        }\n                    }\n\n                    var render = interpretedRender(this, item.then(function (item) { return item.data; }));\n                    render.element = render.element.then(function (e) { e.msOriginalTemplate = that; return e; });\n                    return render;\n                },\n\n                _compileTemplate: function (options) {\n\n                    var that = this;\n\n                    var result = _DataTemplateCompiler._TemplateCompiler.compile(this, this.href || this.element, {\n                        debugBreakOnRender: this.debugBreakOnRender || Template._debugBreakOnRender,\n                        defaultInitializer: this.bindingInitializer || options.defaultInitializer,\n                        disableTextBindingOptimization: options.disableTextBindingOptimization || false,\n                        target: options.target,\n                        extractChild: this.extractChild,\n                        profilerMarkIdentifier: this._profilerMarkIdentifier\n                    });\n\n                    var resetOnFragmentChange = options.resetOnFragmentChange || _WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled;\n                    if (resetOnFragmentChange) {\n                        // For platforms that don't support MutationObserver the shim\n                        // currently will never fire. This is OK because only MutationObserver\n                        // can monitor DocFragments and this feature is only for\n                        // assisting authoring tools.\n                        var mo = new _ElementUtilities._MutationObserver(function () {\n                            that._reset();\n                            mo.disconnect();\n                        });\n                        mo.observe(_ElementUtilities.data(this.element).docFragment, {\n                            childList: true,\n                            attributes: true,\n                            characterData: true,\n                            subtree: true,\n                        });\n                    }\n\n                    return result;\n\n                },\n\n                _reset: function () {\n                    // Reset the template to being not compiled. In design mode this triggers on a mutation\n                    //  of the original document fragment.\n                    delete this._renderImpl;\n                    delete this._renderItemImpl;\n                },\n\n            }, {\n                isDeclarativeControlContainer: { value: true, writable: false, configurable: false },\n                render: {\n                    value: function (href, dataContext, container) {\n                        /// <signature helpKeyword=\"WinJS.Binding.Template.render.value\">\n                        /// <summary locid=\"WinJS.Binding.Template.render.value\">\n                        /// Renders a template based on a URI.\n                        /// </summary>\n                        /// <param name=\"href\" type=\"String\" locid=\"WinJS.Binding.Template.render.value_p:href\">\n                        /// The URI from which to load the template.\n                        /// </param>\n                        /// <param name=\"dataContext\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.Template.render.value_p:dataContext\">\n                        /// The object to use for default data binding.\n                        /// </param>\n                        /// <param name=\"container\" type=\"DOMElement\" optional=\"true\" locid=\"WinJS.Binding.Template.render.value_p:container\">\n                        /// The element to which to add this rendered template. If this parameter is omitted, a new DIV is created.\n                        /// </param>\n                        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.Binding.Template.render.value_returnValue\">\n                        /// A promise that is completed after binding has finished. The value is\n                        /// either the object in the container parameter or the created DIV.\n                        /// </returns>\n                        /// </signature>\n                        return new Template(null, { href: href }).render(dataContext, container);\n                    }\n                }\n            });\n\n            return Template;\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// WinJS.Binding.ListDataSource\n//\ndefine('WinJS/BindingList/_BindingListDataSource',[\n    'exports',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Binding/_DomWeakRefTable',\n    '../Promise',\n    '../Scheduler',\n    '../Utilities/_UI'\n    ], function bindingListDataSourceInit(exports, _WinRT, _Base, _ErrorFromName, _DomWeakRefTable, Promise, Scheduler, _UI) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n        _BindingListDataSource: _Base.Namespace._lazy(function () {\n            var errors = {\n                get noLongerMeaningful() { return Promise.wrapError(new _ErrorFromName(_UI.EditError.noLongerMeaningful)); }\n            };\n\n            function findNextKey(list, index) {\n                var len = list.length;\n                while (index < len - 1) {\n                    var item = list.getItem(++index);\n                    if (item) {\n                        return item.key;\n                    }\n                }\n                return null;\n            }\n\n            function findPreviousKey(list, index) {\n                while (index > 0) {\n                    var item = list.getItem(--index);\n                    if (item) {\n                        return item.key;\n                    }\n                }\n                return null;\n            }\n\n            function subscribe(target, handlers) {\n                Object.keys(handlers).forEach(function (handler) {\n                    target.addEventListener(handler, handlers[handler]);\n                });\n            }\n\n            function unsubscribe(target, handlers) {\n                Object.keys(handlers).forEach(function (handler) {\n                    target.removeEventListener(handler, handlers[handler]);\n                });\n            }\n\n            var CompletePromise = Promise.wrap().constructor;\n\n            var NullWrappedItem = _Base.Class.derive(CompletePromise,\n                function () {\n                    this._value = null;\n                }, {\n                    release: function () { },\n                    retain: function () { return this; }\n                }, {\n                    supportedForProcessing: false,\n                }\n            );\n\n            var WrappedItem = _Base.Class.derive(CompletePromise,\n                function (listBinding, item) {\n                    this._value = item;\n                    this._listBinding = listBinding;\n                }, {\n                    handle: {\n                        get: function () { return this._value.key; }\n                    },\n                    index: {\n                        get: function () { return this._value.index; }\n                    },\n                    release: function () {\n                        this._listBinding._release(this._value, this._listBinding._list.indexOfKey(this._value.key));\n                    },\n                    retain: function () {\n                        this._listBinding._addRef(this._value, this._listBinding._list.indexOfKey(this._value.key));\n                        return this;\n                    }\n                }, {\n                    supportedForProcessing: false,\n                }\n            );\n\n            var AsyncWrappedItem = _Base.Class.derive(Promise,\n                function (listBinding, item, name) {\n                    var that = this;\n                    this._item = item;\n                    this._listBinding = listBinding;\n                    Promise.call(this, function (c) {\n                        Scheduler.schedule(function BindingList_async_item() {\n                            if (listBinding._released) {\n                                that.cancel();\n                                return;\n                            }\n                            c(item);\n                        }, Scheduler.Priority.normal, null, \"WinJS.Binding.List.\" + name);\n                    });\n                }, {\n                    handle: {\n                        get: function () { return this._item.key; }\n                    },\n                    index: {\n                        get: function () { return this._item.index; }\n                    },\n                    release: function () {\n                        this._listBinding._release(this._item, this._listBinding._list.indexOfKey(this._item.key));\n                    },\n                    retain: function () {\n                        this._listBinding._addRef(this._item, this._listBinding._list.indexOfKey(this._item.key));\n                        return this;\n                    }\n                }, {\n                    supportedForProcessing: false,\n                }\n            );\n\n            function wrap(listBinding, item) {\n                return item ? new WrappedItem(listBinding, item) : new NullWrappedItem();\n            }\n\n            function wrapAsync(listBinding, item, name) {\n                return item ? new AsyncWrappedItem(listBinding, item, name) : new NullWrappedItem();\n            }\n\n            function cloneWithIndex(list, item, index) {\n                return item && list._annotateWithIndex(item, index);\n            }\n\n            var ListBinding = _Base.Class.define(function ListBinding_ctor(dataSource, list, notificationHandler, id) {\n                this._dataSource = dataSource;\n                this._list = list;\n                this._editsCount = 0;\n                this._notificationHandler = notificationHandler;\n                this._pos = -1;\n                this._retained = [];\n                this._retained.length = list.length;\n                this._retainedKeys = {};\n                this._affectedRange = null;\n                // When in WebContext, weakref utility functions don't work as desired so we capture this\n                // ListBinding object in the handler's closure. This causes the same leak as in 1.0.\n                var fallbackReference = null;\n                if (!_WinRT.msSetWeakWinRTProperty || !_WinRT.msGetWeakWinRTProperty) {\n                    fallbackReference = this;\n                }\n                if (notificationHandler) {\n                    var handleEvent = function (eventName, eventArg) {\n                        var lb = _DomWeakRefTable._getWeakRefElement(id) || fallbackReference;\n                        if (lb) {\n                            lb[\"_\" + eventName](eventArg);\n                            return true;\n                        }\n                        return false;\n                    };\n\n                    this._handlers = {\n                        itemchanged: function handler(event) {\n                            if (!handleEvent(\"itemchanged\", event)) {\n                                list.removeEventListener(\"itemchanged\", handler);\n                            }\n                        },\n                        iteminserted: function handler(event) {\n                            if (!handleEvent(\"iteminserted\", event)) {\n                                list.removeEventListener(\"iteminserted\", handler);\n                            }\n                        },\n                        itemmoved: function handler(event) {\n                            if (!handleEvent(\"itemmoved\", event)) {\n                                list.removeEventListener(\"itemmoved\", handler);\n                            }\n                        },\n                        itemremoved: function handler(event) {\n                            if (!handleEvent(\"itemremoved\", event)) {\n                                list.removeEventListener(\"itemremoved\", handler);\n                            }\n                        },\n                        reload: function handler() {\n                            if (!handleEvent(\"reload\")) {\n                                list.removeEventListener(\"reload\", handler);\n                            }\n                        }\n                    };\n                    subscribe(this._list, this._handlers);\n                }\n            }, {\n                _itemchanged: function (event) {\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    this._updateAffectedRange(index, \"changed\");\n                    var newItem = event.detail.newItem;\n                    var oldItem = this._retained[index];\n                    if (oldItem) {\n                        var handler = this._notificationHandler;\n                        if (oldItem.index !== index) {\n                            var oldIndex = oldItem.index;\n                            oldItem.index = index;\n                            if (handler && handler.indexChanged) {\n                                handler.indexChanged(newItem.key, index, oldIndex);\n                            }\n                        }\n                        newItem = cloneWithIndex(this._list, newItem, index);\n                        newItem._retainedCount = oldItem._retainedCount;\n                        this._retained[index] = newItem;\n                        this._retainedKeys[key] = newItem;\n\n                        this._beginEdits(this._list.length);\n                        if (handler && handler.changed) {\n                            handler.changed(\n                                newItem,\n                                oldItem\n                            );\n                        }\n                        this._endEdits();\n                    } else {\n                        // Item was not retained, but we still want to batch this change with the other edits to send the affectedRange notification.\n                        this._beginEdits(this._list.length);\n                        this._endEdits();\n                    }\n                },\n\n                _iteminserted: function (event) {\n                    var index = event.detail.index;\n                    this._updateAffectedRange(index, \"inserted\");\n                    this._beginEdits(this._list.length - 1);\n                    if (index <= this._pos) {\n                        this._pos = Math.min(this._pos + 1, this._list.length);\n                    }\n                    var retained = this._retained;\n                    // create a hole for this thing and then immediately make it undefined\n                    retained.splice(index, 0, 0);\n                    delete retained[index];\n                    if (this._shouldNotify(index) || this._list.length === 1) {\n                        var handler = this._notificationHandler;\n                        if (handler && handler.inserted) {\n                            handler.inserted(\n                                wrap(this, cloneWithIndex(this._list, this._list.getItem(index), index)),\n                                findPreviousKey(this._list, index),\n                                findNextKey(this._list, index)\n                            );\n                        }\n                    }\n                    this._endEdits();\n                },\n\n                _itemmoved: function (event) {\n                    var oldIndex = event.detail.oldIndex;\n                    var newIndex = event.detail.newIndex;\n                    this._updateAffectedRange(oldIndex, \"moved\");\n                    this._updateAffectedRange(newIndex, \"moved\");\n                    this._beginEdits(this._list.length);\n                    if (oldIndex < this._pos || newIndex <= this._pos) {\n                        if (newIndex > this._pos) {\n                            this._pos = Math.max(-1, this._pos - 1);\n                        } else if (oldIndex > this._pos) {\n                            this._pos = Math.min(this._pos + 1, this._list.length);\n                        }\n                    }\n                    var retained = this._retained;\n                    var item = retained.splice(oldIndex, 1)[0];\n                    retained.splice(newIndex, 0, item);\n                    if (!item) {\n                        delete retained[newIndex];\n                        item = cloneWithIndex(this._list, this._list.getItem(newIndex), newIndex);\n                    }\n                    item._moved = true;\n                    this._addRef(item, newIndex);\n                    this._endEdits();\n                },\n\n                _itemremoved: function (event) {\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    this._updateAffectedRange(index, \"removed\");\n                    this._beginEdits(this._list.length + 1);\n                    if (index < this._pos) {\n                        this._pos = Math.max(-1, this._pos - 1);\n                    }\n                    var retained = this._retained;\n                    var retainedKeys = this._retainedKeys;\n                    var wasRetained = index in retained;\n                    retained.splice(index, 1);\n                    delete retainedKeys[key];\n                    var handler = this._notificationHandler;\n                    if (wasRetained && handler && handler.removed) {\n                        handler.removed(key, false);\n                    }\n                    this._endEdits();\n                },\n\n                _reload: function () {\n                    this._retained = [];\n                    this._retainedKeys = {};\n                    var handler = this._notificationHandler;\n                    if (handler && handler.reload) {\n                        handler.reload();\n                    }\n                },\n\n                _addRef: function (item, index) {\n                    if (index in this._retained) {\n                        this._retained[index]._retainedCount++;\n                    } else {\n                        this._retained[index] = item;\n                        this._retainedKeys[item.key] = item;\n                        item._retainedCount = 1;\n                    }\n                },\n                _release: function (item, index) {\n                    var retained = this._retained[index];\n                    if (retained) {\n                        if (retained._retainedCount === 1) {\n                            delete this._retained[index];\n                            delete this._retainedKeys[retained.key];\n                        } else {\n                            retained._retainedCount--;\n                        }\n                    }\n                },\n                _shouldNotify: function (index) {\n                    var retained = this._retained;\n                    return index in retained || index + 1 in retained || index - 1 in retained;\n                },\n\n                _updateAffectedRange: function ListBinding_updateAffectedRange(index, operation) {\n                    // Creates a range of affected indices [start, end).\n                    // Definition of _affectedRange.start: All items in the set of data with indices < _affectedRange.start have not been directly modified.\n                    // Definition of _affectedRange.end: All items in the set of data with indices >= _affectedRange.end have not been directly modified.\n\n                    if (!this._notificationHandler.affectedRange) {\n                        return;\n                    }\n\n                    //[newStart, newEnd)\n                    var newStart = index;\n                    var newEnd = (operation !== \"removed\") ?\n                        index + 1 : index;\n\n                    if (this._affectedRange) {\n                        switch (operation) {\n                            case \"inserted\":\n                                if (index <= this._affectedRange.end) {\n                                    ++this._affectedRange.end;\n                                }\n                                break;\n                            case \"removed\":\n                                if (index < this._affectedRange.end) {\n                                    --this._affectedRange.end;\n                                }\n                                break;\n                            case \"moved\":\n                            case \"changed\":\n                                break;\n                        }\n                        this._affectedRange.start = Math.min(this._affectedRange.start, newStart);\n                        this._affectedRange.end = Math.max(this._affectedRange.end, newEnd);\n                    } else {\n                        // Handle the initial state\n                        this._affectedRange = { start: newStart, end: newEnd };\n                    }\n                },\n\n                _notifyAffectedRange: function ListBinding_notifyAffectedRange() {\n                    if (this._affectedRange) {\n                        if (this._notificationHandler && this._notificationHandler.affectedRange) {\n                            this._notificationHandler.affectedRange(this._affectedRange);\n                        }\n                        // reset range\n                        this._affectedRange = null;\n                    }\n                },\n                _notifyCountChanged: function () {\n                    var oldCount = this._countAtBeginEdits;\n                    var newCount = this._list.length;\n                    if (oldCount !== newCount) {\n                        var handler = this._notificationHandler;\n                        if (handler && handler.countChanged) {\n                            handler.countChanged(newCount, oldCount);\n                        }\n                    }\n                },\n                _notifyIndicesChanged: function () {\n                    var retained = this._retained;\n                    for (var i = 0, len = retained.length; i < len; i++) {\n                        var item = retained[i];\n                        if (item && item.index !== i) {\n                            var newIndex = i;\n                            var oldIndex = item.index;\n                            item.index = newIndex;\n                            var handler = this._notificationHandler;\n                            if (handler && handler.indexChanged) {\n                                handler.indexChanged(item.key, newIndex, oldIndex);\n                            }\n                        }\n                    }\n                },\n                _notifyMoved: function () {\n                    var retained = this._retained;\n                    for (var i = 0, len = retained.length; i < len; i++) {\n                        var item = retained[i];\n                        if (item && item._moved) {\n                            item._moved = false;\n                            this._release(item, i);\n                            if (this._shouldNotify(i)) {\n                                var handler = this._notificationHandler;\n                                if (handler && handler.moved) {\n                                    handler.moved(\n                                        wrap(this, item),\n                                        findPreviousKey(this._list, i),\n                                        findNextKey(this._list, i)\n                                    );\n                                }\n                            }\n                        }\n                    }\n                },\n\n                _beginEdits: function (length, explicit) {\n                    this._editsCount++;\n                    var handler = this._notificationHandler;\n                    if (this._editsCount === 1 && handler) {\n                        if (!explicit) {\n                            // Batch all edits between now and the job running. This has the effect\n                            // of batching synchronous edits.\n                            //\n                            this._editsCount++;\n                            var that = this;\n                            Scheduler.schedule(function BindingList_async_batchedEdits() {\n                                that._endEdits();\n                            }, Scheduler.Priority.high, null, \"WinJS.Binding.List._endEdits\");\n                        }\n                        if (handler.beginNotifications) {\n                            handler.beginNotifications();\n                        }\n                        this._countAtBeginEdits = length;\n                    }\n                },\n                _endEdits: function () {\n                    this._editsCount--;\n                    var handler = this._notificationHandler;\n                    if (this._editsCount === 0 && handler) {\n                        this._notifyIndicesChanged();\n                        this._notifyMoved();\n                        this._notifyCountChanged();\n                        // It's important to notify the affectedRange after _notifyCountChanged since we expect developers\n                        // may take a dependancy on the count being up to date when they recieve the affected range.\n                        this._notifyAffectedRange();\n                        if (handler.endNotifications) {\n                            handler.endNotifications();\n                        }\n                    }\n                },\n\n                jumpToItem: function (item) {\n                    var index = this._list.indexOfKey(item.handle);\n                    if (index === -1) {\n                        return Promise.wrap(null);\n                    }\n                    this._pos = index;\n                    return this.current();\n                },\n                current: function () {\n                    return this.fromIndex(this._pos);\n                },\n                previous: function () {\n                    this._pos = Math.max(-1, this._pos - 1);\n                    return this._fromIndex(this._pos, true, \"previous\");\n                },\n                next: function () {\n                    this._pos = Math.min(this._pos + 1, this._list.length);\n                    return this._fromIndex(this._pos, true, \"next\");\n                },\n                releaseItem: function (item) {\n                    if (item.release) {\n                        item.release();\n                    } else {\n                        this._release(item, this._list.indexOfKey(item.key));\n                    }\n                },\n                release: function () {\n                    if (this._notificationHandler) {\n                        unsubscribe(this._list, this._handlers);\n                    }\n                    this._notificationHandler = null;\n                    this._dataSource._releaseBinding(this);\n                    this._released = true;\n                },\n                first: function () {\n                    return this.fromIndex(0);\n                },\n                last: function () {\n                    return this.fromIndex(this._list.length - 1);\n                },\n                fromKey: function (key) {\n                    var retainedKeys = this._retainedKeys;\n                    var item;\n                    if (key in retainedKeys) {\n                        item = retainedKeys[key];\n                    } else {\n                        item = cloneWithIndex(this._list, this._list.getItemFromKey(key), this._list.indexOfKey(key));\n                    }\n                    return wrap(this, item);\n                },\n                fromIndex: function (index) {\n                    return this._fromIndex(index, false, \"fromIndex\");\n                },\n                _fromIndex: function (index, async, name) {\n                    var retained = this._retained;\n                    var item;\n                    if (index in retained) {\n                        item = retained[index];\n                    } else {\n                        item = cloneWithIndex(this._list, this._list.getItem(index), index);\n                    }\n                    return async ? wrapAsync(this, item, name) : wrap(this, item);\n                },\n            }, {\n                supportedForProcessing: false,\n            });\n\n            function insertAtStart(unused, data) {\n                /*jshint validthis: true */\n                // List ignores the key because its key management is internal\n                this._list.unshift(data);\n                return this.itemFromIndex(0);\n            }\n            function insertBefore(unused, data, nextKey) {\n                /*jshint validthis: true */\n                // List ignores the key because its key management is internal\n                var index = this._list.indexOfKey(nextKey);\n                if (index === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                this._list.splice(index, 0, data);\n                return this.itemFromIndex(index);\n            }\n            function insertAfter(unused, data, previousKey) {\n                /*jshint validthis: true */\n                // List ignores the key because its key management is internal\n                var index = this._list.indexOfKey(previousKey);\n                if (index === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                index += 1;\n                this._list.splice(index, 0, data);\n                return this.itemFromIndex(index);\n            }\n            function insertAtEnd(unused, data) {\n                /*jshint validthis: true */\n                // List ignores the key because its key management is internal\n                this._list.push(data);\n                return this.itemFromIndex(this._list.length - 1);\n            }\n            function change(key, newData) {\n                /*jshint validthis: true */\n                var index = this._list.indexOfKey(key);\n                if (index === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                this._list.setAt(index, newData);\n                return this.itemFromIndex(index);\n            }\n            function moveToStart(key) {\n                /*jshint validthis: true */\n                var sourceIndex = this._list.indexOfKey(key);\n                if (sourceIndex === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                var targetIndex = 0;\n                this._list.move(sourceIndex, targetIndex);\n                return this.itemFromIndex(targetIndex);\n            }\n            function moveBefore(key, nextKey) {\n                /*jshint validthis: true */\n                var sourceIndex = this._list.indexOfKey(key);\n                var targetIndex = this._list.indexOfKey(nextKey);\n                if (sourceIndex === -1 || targetIndex === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                targetIndex = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex;\n                this._list.move(sourceIndex, targetIndex);\n                return this.itemFromIndex(targetIndex);\n            }\n            function moveAfter(key, previousKey) {\n                /*jshint validthis: true */\n                var sourceIndex = this._list.indexOfKey(key);\n                var targetIndex = this._list.indexOfKey(previousKey);\n                if (sourceIndex === -1 || targetIndex === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                targetIndex = sourceIndex <= targetIndex ? targetIndex : targetIndex + 1;\n                this._list.move(sourceIndex, targetIndex);\n                return this.itemFromIndex(targetIndex);\n            }\n            function moveToEnd(key) {\n                /*jshint validthis: true */\n                var sourceIndex = this._list.indexOfKey(key);\n                if (sourceIndex === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                var targetIndex = this._list.length - 1;\n                this._list.move(sourceIndex, targetIndex);\n                return this.itemFromIndex(targetIndex);\n            }\n            function remove(key) {\n                /*jshint validthis: true */\n                var index = this._list.indexOfKey(key);\n                if (index === -1) {\n                    return errors.noLongerMeaningful;\n                }\n                this._list.splice(index, 1);\n                return Promise.wrap();\n            }\n\n            var bindingId = 0;\n            var DataSource = _Base.Class.define(function DataSource_ctor(list) {\n                this._usingWeakRef = _WinRT.msSetWeakWinRTProperty && _WinRT.msGetWeakWinRTProperty;\n                this._bindings = {};\n                this._list = list;\n\n                if (list.unshift) {\n                    this.insertAtStart = insertAtStart;\n                }\n                if (list.push) {\n                    this.insertAtEnd = insertAtEnd;\n                }\n                if (list.setAt) {\n                    this.change = change;\n                }\n                if (list.splice) {\n                    this.insertAfter = insertAfter;\n                    this.insertBefore = insertBefore;\n                    this.remove = remove;\n                }\n                if (list.move) {\n                    this.moveAfter = moveAfter;\n                    this.moveBefore = moveBefore;\n                    this.moveToEnd = moveToEnd;\n                    this.moveToStart = moveToStart;\n                }\n            }, {\n                _releaseBinding: function (binding) {\n                    delete this._bindings[binding._id];\n                },\n\n                addEventListener: function () {\n                    // nop, we don't send statusChanged\n                },\n                removeEventListener: function () {\n                    // nop, we don't send statusChanged\n                },\n\n                createListBinding: function (notificationHandler) {\n                    var id = \"ds_\" + (++bindingId);\n                    var binding = new ListBinding(this, this._list, notificationHandler, id);\n                    binding._id = id;\n\n                    if (this._usingWeakRef) {\n                        _DomWeakRefTable._createWeakRef(binding, id);\n                        this._bindings[id] = id;\n                    } else {\n                        this._bindings[id] = binding;\n                    }\n\n                    return binding;\n                },\n\n                getCount: function () {\n                    return Promise.wrap(this._list.length);\n                },\n\n                itemFromKey: function (key) {\n                    // Clone with a dummy index\n                    var list = this._list,\n                        item = cloneWithIndex(list, list.getItemFromKey(key), -1);\n\n                    // Override the index property with a getter\n                    Object.defineProperty(item, \"index\", {\n                        get: function () {\n                            return list.indexOfKey(key);\n                        },\n                        enumerable: false,\n                        configurable: true\n                    });\n\n                    return Promise.wrap(item);\n                },\n                itemFromIndex: function (index) {\n                    return Promise.wrap(cloneWithIndex(this._list, this._list.getItem(index), index));\n                },\n\n                list: {\n                    get: function () { return this._list; }\n                },\n\n                beginEdits: function () {\n                    var length = this._list.length;\n                    this._forEachBinding(function (binding) {\n                        binding._beginEdits(length, true);\n                    });\n                },\n                endEdits: function () {\n                    this._forEachBinding(function (binding) {\n                        binding._endEdits();\n                    });\n                },\n                _forEachBinding: function (callback) {\n                    if (this._usingWeakRef) {\n                        var toBeDeleted = [];\n                        Object.keys(this._bindings).forEach(function (id) {\n                            var lb = _DomWeakRefTable._getWeakRefElement(id);\n                            if (lb) {\n                                callback(lb);\n                            } else {\n                                toBeDeleted.push(id);\n                            }\n                        });\n                        for (var i = 0, len = toBeDeleted.length; i < len; i++) {\n                            delete this._bindings[toBeDeleted[i]];\n                        }\n                    } else {\n                        var that = this;\n                        Object.keys(this._bindings).forEach(function (id) {\n                            callback(that._bindings[id]);\n                        });\n                    }\n                },\n\n                invalidateAll: function () {\n                    return Promise.wrap();\n                },\n\n                //\n                // insert* and change are not implemented as I don't understand how they are\n                //  used by the controls since it is hard to fathom how they would be able\n                //  to make up unique keys. Manual editing of the List is meant to go through\n                //  the list itself.\n                //\n                // move* are implemented only if the underlying list supports move(). The\n                //  GroupsListProjection for instance does not.\n                //\n                moveAfter: undefined,\n                moveBefore: undefined,\n                moveToEnd: undefined,\n                moveToStart: undefined\n\n            }, {\n                supportedForProcessing: false,\n            });\n            return DataSource;\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n\n// WinJS.Binding.List\n//\ndefine('WinJS/BindingList',[\n    'exports',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './Core/_ErrorFromName',\n    './Core/_Events',\n    './Core/_Resources',\n    './Binding/_Data',\n    './BindingList/_BindingListDataSource'\n    ], function listInit(exports, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _Data, _BindingListDataSource) {\n    \"use strict\";\n\n    var strings = {\n        get sparseArrayNotSupported() { return \"Sparse arrays are not supported with proxy: true\"; },\n        get illegalListLength() { return \"List length must be assigned a finite positive number\"; },\n    };\n\n    function copyargs(args) {\n        return Array.prototype.slice.call(args, 0);\n    }\n\n    function cloneItem(item) {\n        return {\n            handle: item.handle,\n            key: item.key,\n            data: item.data,\n            groupKey: item.groupKey,\n            groupSize: item.groupSize,\n            firstItemKey: item.firstItemKey,\n            firstItemIndexHint: item.firstItemIndexHint\n        };\n    }\n\n    function asNumber(n) {\n        return n === undefined ? undefined : +n;\n    }\n\n    var createEvent = _Events._createEventProperty;\n\n    var emptyOptions = {};\n\n    // We need a stable sort in order to implement SortedListProjection because we want to be able to\n    // perform insertions in a predictable location s.t. if we were to apply another sorted projection\n    // over the same list (now containing the inserted data) the resulting order would be the same.\n    //\n    function mergeSort(arr, sorter) {\n        var temp = new Array(arr.length);\n\n        function copyBack(start, end) {\n            for (; start < end; start++) {\n                arr[start] = temp[start];\n            }\n        }\n\n        function sort(start, end) {\n            if ((end - start) < 2) {\n                return;\n            }\n            var middle = Math.floor((end + start) / 2);\n            sort(start, middle);\n            sort(middle, end);\n            merge(start, middle, end);\n            copyBack(start, end);\n        }\n\n        function merge(start, middle, end) {\n            for (var left = start, right = middle, i = start; i < end; i++) {\n                if (left < middle && (right >= end || sorter(arr[left], arr[right]) <= 0)) {\n                    temp[i] = arr[left];\n                    left++;\n                } else {\n                    temp[i] = arr[right];\n                    right++;\n                }\n            }\n        }\n\n        sort(0, arr.length);\n\n        return arr;\n    }\n\n    // Private namespace used for local lazily init'd classes\n    var ns = _Base.Namespace.defineWithParent(null, null, {\n        ListBase: _Base.Namespace._lazy(function () {\n            var ListBase = _Base.Class.define(null, {\n                _annotateWithIndex: function (item, index) {\n                    var result = cloneItem(item);\n                    result.index = index;\n                    return result;\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.ListBase.onitemchanged\" helpKeyword=\"WinJS.Binding.ListBase.onitemchanged\">\n                /// The value identified by the specified key has been replaced with a different value.\n                /// </field>\n                onitemchanged: createEvent(\"itemchanged\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.ListBase.oniteminserted\" helpKeyword=\"WinJS.Binding.ListBase.oniteminserted\">\n                /// A new value has been inserted into the list.\n                /// </field>\n                oniteminserted: createEvent(\"iteminserted\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.ListBase.onitemmoved\" helpKeyword=\"WinJS.Binding.ListBase.onitemmoved\">\n                /// The value identified by the specified key has been moved from one index in the list to another index.\n                /// </field>\n                onitemmoved: createEvent(\"itemmoved\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.ListBase.onitemmutated\" helpKeyword=\"WinJS.Binding.ListBase.onitemmutated\">\n                /// The value identified by the specified key has been mutated.\n                /// </field>\n                onitemmutated: createEvent(\"itemmutated\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.ListBase.onitemremoved\" helpKeyword=\"WinJS.Binding.ListBase.onitemremoved\">\n                /// The value identified by the specified key has been removed from the list.\n                /// </field>\n                onitemremoved: createEvent(\"itemremoved\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.Binding.ListBase.onreload\" helpKeyword=\"WinJS.Binding.ListBase.onreload\">\n                /// The list has been refreshed. Any references to items in the list may be incorrect.\n                /// </field>\n                onreload: createEvent(\"reload\"),\n\n                _notifyItemChanged: function (key, index, oldValue, newValue, oldItem, newItem) {\n                    if (this._listeners && this._listeners.itemchanged) {\n                        this.dispatchEvent(\"itemchanged\", { key: key, index: index, oldValue: oldValue, newValue: newValue, oldItem: oldItem, newItem: newItem });\n                    }\n                },\n                _notifyItemInserted: function (key, index, value) {\n                    if (this._listeners && this._listeners.iteminserted) {\n                        this.dispatchEvent(\"iteminserted\", { key: key, index: index, value: value });\n                    }\n                    var len = this.length;\n                    if (len !== this._lastNotifyLength) {\n                        this.notify(\"length\", len, this._lastNotifyLength);\n                        this._lastNotifyLength = len;\n                    }\n                },\n                _notifyItemMoved: function (key, oldIndex, newIndex, value) {\n                    if (this._listeners && this._listeners.itemmoved) {\n                        this.dispatchEvent(\"itemmoved\", { key: key, oldIndex: oldIndex, newIndex: newIndex, value: value });\n                    }\n                },\n                _notifyItemMutated: function (key, value, item) {\n                    if (this._listeners && this._listeners.itemmutated) {\n                        this.dispatchEvent(\"itemmutated\", { key: key, value: value, item: item });\n                    }\n                },\n                _notifyItemRemoved: function (key, index, value, item) {\n                    if (this._listeners && this._listeners.itemremoved) {\n                        this.dispatchEvent(\"itemremoved\", { key: key, index: index, value: value, item: item });\n                    }\n                    var len = this.length;\n                    if (len !== this._lastNotifyLength) {\n                        this.notify(\"length\", len, this._lastNotifyLength);\n                        this._lastNotifyLength = len;\n                    }\n                },\n                _notifyReload: function () {\n                    if (this._listeners && this._listeners.reload) {\n                        this.dispatchEvent(\"reload\");\n                    }\n                    if (len !== this._lastNotifyLength) {\n                        var len = this.length;\n                        this.notify(\"length\", len, this._lastNotifyLength);\n                        this._lastNotifyLength = len;\n                    }\n                },\n\n                _normalizeIndex: function (index) {\n                    index = asNumber(index);\n                    return index < 0 ? this.length + index : index;\n                },\n\n                // ABSTRACT: length\n\n                // Notifications:\n                //\n                // ABSTRACT: notifyMutated: function (index)\n                _notifyMutatedFromKey: function (key) {\n                    var item = this.getItemFromKey(key);\n                    this._notifyItemMutated(key, item.data, item);\n                },\n                notifyReload: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.notifyReload\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.notifyReload\">\n                    /// Forces the list to send a reload notification to any listeners.\n                    /// </summary>\n                    /// </signature>\n                    this._notifyReload();\n                },\n\n                // NOTE: performance can be improved in a number of the projections by overriding getAt/_getArray/_getFromKey/_getKey\n                //\n                getAt: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.getAt\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.getAt\">\n                    /// Gets the value at the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListBase.getAt_p:index\">The index of the value to get.</param>\n                    /// <returns type=\"Object\" mayBeNull=\"true\" locid=\"WinJS.Binding.ListBase.getAt_returnValue\">The value at the specified index.</returns>\n                    /// </signature>\n                    index = asNumber(index);\n                    var item = this.getItem(index);\n                    return item && item.data;\n                },\n                // returns [ data* ]\n                _getArray: function () {\n                    var results = new Array(this.length);\n                    for (var i = 0, len = this.length; i < len; i++) {\n                        var item = this.getItem(i);\n                        if (item) {\n                            results[i] = item.data;\n                        }\n                    }\n                    return results;\n                },\n                // returns data\n                _getFromKey: function (key) {\n                    var item = this.getItemFromKey(key);\n                    return item && item.data;\n                },\n                // ABSTRACT: getItem(index)\n                // ABSTRACT: getItemFromKey(key)\n                // returns string\n                _getKey: function (index) {\n                    index = asNumber(index);\n                    var item = this.getItem(index);\n                    return item && item.key;\n                },\n\n                // Normal list non-modifiying operations\n                //\n                concat: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.concat\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.concat\">\n                    /// Returns a new list consisting of a combination of two arrays.\n                    /// </summary>\n                    /// <parameter name=\"item\" type=\"Object\" optional=\"true\" parameterArray=\"true\">Additional items to add to the end of the list.</parameter>\n                    /// <returns type=\"Array\" locid=\"WinJS.Binding.ListBase.concat_returnValue\">An array containing the concatenation of the list and any other supplied items.</returns>\n                    /// </signature>\n                    var a = this._getArray();\n                    return a.concat.apply(a, arguments);\n                },\n                join: function (separator) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.join\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.join\">\n                    /// Returns a string consisting of all the elements of a list separated by the specified separator string.\n                    /// </summary>\n                    /// <param name=\"separator\" type=\"String\" optional=\"true\" locid=\"WinJS.Binding.ListBase.join_p:separator\">A string used to separate the elements of a list. If this parameter is omitted, the list elements are separated with a comma.</param>\n                    /// <returns type=\"String\" locid=\"WinJS.Binding.ListBase.join_returnValue\">The elements of a list separated by the specified separator string.</returns>\n                    /// </signature>\n                    return this._getArray().join(separator || \",\");\n                },\n                slice: function (begin, end) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.slice\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.slice\">\n                    /// Extracts a section of a list and returns a new list.\n                    /// </summary>\n                    /// <param name=\"begin\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListBase.slice_p:begin\">The index that specifies the beginning of the section.</param>\n                    /// <param name=\"end\" type=\"Number\" integer=\"true\" optional=\"true\" locid=\"WinJS.Binding.ListBase.slice_p:end\">The index that specifies the end of the section.</param>\n                    /// <returns type=\"Array\" locid=\"WinJS.Binding.ListBase.slice_returnValue\">Returns a section of an array.</returns>\n                    /// </signature>\n                    return this._getArray().slice(begin, end);\n                },\n                indexOf: function (searchElement, fromIndex) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.indexOf\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.indexOf\">\n                    /// Gets the index of the first occurrence of the specified value in a list.\n                    /// </summary>\n                    /// <param name=\"searchElement\" type=\"Object\" locid=\"WinJS.Binding.ListBase.indexOf_p:searchElement\">The value to locate in the list.</param>\n                    /// <param name=\"fromIndex\" type=\"Number\" integer=\"true\" optional=\"true\" locid=\"WinJS.Binding.ListBase.indexOf_p:fromIndex\">The index at which to begin the search. If fromIndex is omitted, the search starts at index 0.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListBase.indexOf_returnValue\">Index of the first occurrence of a value in a list or -1 if not found.</returns>\n                    /// </signature>\n                    fromIndex = asNumber(fromIndex);\n                    fromIndex = Math.max(0, this._normalizeIndex(fromIndex) || 0);\n                    for (var i = fromIndex, len = this.length; i < len; i++) {\n                        var item = this.getItem(i);\n                        if (item && item.data === searchElement) {\n                            return i;\n                        }\n                    }\n                    return -1;\n                },\n                // ABSTRACT: indexOfKey(key)\n                lastIndexOf: function (searchElement, fromIndex) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.lastIndexOf\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.lastIndexOf\">\n                    /// Gets the index of the last occurrence of the specified value in a list.\n                    /// </summary>\n                    /// <param name=\"searchElement\" type=\"Object\" locid=\"WinJS.Binding.ListBase.lastIndexOf_p:searchElement\">The value to locate in the list.</param>\n                    /// <param name=\"fromIndex\" type=\"Number\" integer=\"true\" optional=\"true\" locid=\"WinJS.Binding.ListBase.lastIndexOf_p:fromIndex\">The index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListBase.lastIndexOf_returnValue\">The index of the last occurrence of a value in a list, or -1 if not found.</returns>\n                    /// </signature>\n                    fromIndex = asNumber(fromIndex);\n                    var length = this.length;\n                    fromIndex = Math.min(this._normalizeIndex(fromIndex !== undefined ? fromIndex : length), length - 1);\n                    var i;\n                    for (i = fromIndex; i >= 0; i--) {\n                        var item = this.getItem(i);\n                        if (item && item.data === searchElement) {\n                            return i;\n                        }\n                    }\n                    return -1;\n                },\n\n                //\n                // Normal list projection operations\n                //\n\n                every: function (callback, thisArg) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.every\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.every\">\n                    /// Checks whether the specified callback function returns true for all elements in a list.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.every_p:callback\">A function that accepts up to three arguments. This function is called for each element in the list until it returns false or the end of the list is reached.</param>\n                    /// <param name=\"thisArg\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.every_p:thisArg\">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>\n                    /// <returns type=\"Boolean\" locid=\"WinJS.Binding.ListBase.every_returnValue\">True if the callback returns true for all elements in the list.</returns>\n                    /// </signature>\n                    return this._getArray().every(callback, thisArg);\n                },\n                filter: function (callback, thisArg) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.filter\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.filter\">\n                    /// Returns the elements of a list that meet the condition specified in a callback function.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.filter_p:callback\">A function that accepts up to three arguments. The function is called for each element in the list.</param>\n                    /// <param name=\"thisArg\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.filter_p:thisArg\">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>\n                    /// <returns type=\"Array\" locid=\"WinJS.Binding.ListBase.filter_returnValue\">An array containing the elements that meet the condition specified in the callback function.</returns>\n                    /// </signature>\n                    return this._getArray().filter(callback, thisArg);\n                },\n                forEach: function (callback, thisArg) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.forEach\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.forEach\">\n                    /// Calls the specified callback function for each element in a list.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.forEach_p:callback\">A function that accepts up to three arguments. The function is called for each element in the list.</param>\n                    /// <param name=\"thisArg\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.forEach_p:thisArg\">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>\n                    /// </signature>\n                    this._getArray().forEach(callback, thisArg);\n                },\n                map: function (callback, thisArg) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.map\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.map\">\n                    /// Calls the specified callback function on each element of a list, and returns an array that contains the results.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.map_p:callback\">A function that accepts up to three arguments. The function is called for each element in the list.</param>\n                    /// <param name=\"thisArg\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.map_p:thisArg\">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>\n                    /// <returns type=\"Array\" locid=\"WinJS.Binding.ListBase.map_returnValue\">An array containing the result of calling the callback function on each element in the list.</returns>\n                    /// </signature>\n                    return this._getArray().map(callback, thisArg);\n                },\n                some: function (callback, thisArg) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.some\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.some\">\n                    /// Checks whether the specified callback function returns true for any element of a list.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.some_p:callback\">A function that accepts up to three arguments. The function is called for each element in the list until it returns true, or until the end of the list.</param>\n                    /// <param name=\"thisArg\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.some_p:thisArg\">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>\n                    /// <returns type=\"Boolean\" locid=\"WinJS.Binding.ListBase.some_returnValue\">True if callback returns true for any element in the list.</returns>\n                    /// </signature>\n                    return this._getArray().some(callback, thisArg);\n                },\n                reduce: function (callback, initialValue) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.reduce\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.reduce\">\n                    /// Accumulates a single result by calling the specified callback function for all elements in a list. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.reduce_p:callback\">A function that accepts up to four arguments. The function is called for each element in the list.</param>\n                    /// <param name=\"initialValue\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.reduce_p:initialValue\">If initialValue is specified, it is used as the value with which to start the accumulation. The first call to the function provides this value as an argument instead of a list value.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.ListBase.reduce_returnValue\">The return value from the last call to the callback function.</returns>\n                    /// </signature>\n                    if (arguments.length > 1) {\n                        return this._getArray().reduce(callback, initialValue);\n                    }\n                    return this._getArray().reduce(callback);\n                },\n                reduceRight: function (callback, initialValue) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.reduceRight\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.reduceRight\">\n                    /// Accumulates a single result by calling the specified callback function for all elements in a list, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n                    /// </summary>\n                    /// <param name=\"callback\" type=\"Function\" locid=\"WinJS.Binding.ListBase.reduceRight_p:callback\">A function that accepts up to four arguments. The function is called for each element in the list.</param>\n                    /// <param name=\"initialValue\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.ListBase.reduceRight_p:initialValue\">If initialValue is specified, it is used as the value with which to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of a list value.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.ListBase.reduceRight_returnValue\">The return value from last call to callback function.</returns>\n                    /// </signature>\n                    if (arguments.length > 1) {\n                        return this._getArray().reduceRight(callback, initialValue);\n                    }\n                    return this._getArray().reduceRight(callback);\n                },\n\n                //\n                // Live Projections - if you want the lifetime of the returned projections to\n                //  be shorter than that of the list object on which they are based you have\n                //  to remember to call .dispose() on them when done.\n                //\n\n                createFiltered: function (predicate) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.createFiltered\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.createFiltered\">\n                    /// Creates a live filtered projection over this list. As the list changes, the filtered projection reacts to those changes and may also change.\n                    /// </summary>\n                    /// <param name=\"predicate\" type=\"Function\" locid=\"WinJS.Binding.ListBase.createFiltered_p:predicate\">A function that accepts a single argument. The createFiltered function calls the callback with each element in the list. If the function returns true, that element will be included in the filtered list.</param>\n                    /// <returns type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.ListBase.createFiltered_returnValue\">Filtered projection over the list.</returns>\n                    /// </signature>\n                    return new ns.FilteredListProjection(this, predicate);\n                },\n                createGrouped: function (groupKey, groupData, groupSorter) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.createGrouped\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.createGrouped\">\n                    /// Creates a live grouped projection over this list. As the list changes, the grouped projection reacts to those changes and may also change. The grouped projection sorts all the elements of the list to be in group-contiguous order. The grouped projection also contains a .groups property which is a WinJS.Binding.List representing the groups that were found in the list.\n                    /// </summary>\n                    /// <param name=\"groupKey\" type=\"Function\" locid=\"WinJS.Binding.ListBase.createGrouped_p:groupKey\">A function that accepts a single argument. The function is called with each element in the list, the function should return a string representing the group containing the element.</param>\n                    /// <param name=\"groupData\" type=\"Function\" locid=\"WinJS.Binding.ListBase.createGrouped_p:groupData\">A function that accepts a single argument. The function is called on an element in the list for each group. It should return the value that should be set as the data of the .groups list element for this group.</param>\n                    /// <param name=\"groupSorter\" type=\"Function\" optional=\"true\" locid=\"WinJS.Binding.ListBase.createGrouped_p:groupSorter\">A function that accepts two arguments. The function is called with the key of groups found in the list. It must return one of the following numeric values: negative if the first argument is less than the second, zero if the two arguments are equivalent, positive if the first argument is greater than the second. If omitted, the groups are sorted in ascending, ASCII character order.</param>\n                    /// <returns type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.ListBase.createGrouped_returnValue\">A grouped projection over the list.</returns>\n                    /// </signature>\n                    return new ns.GroupedSortedListProjection(this, groupKey, groupData, groupSorter);\n                },\n                createSorted: function (sorter) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBase.createSorted\">\n                    /// <summary locid=\"WinJS.Binding.ListBase.createSorted\">\n                    /// Creates a live sorted projection over this list. As the list changes, the sorted projection reacts to those changes and may also change.\n                    /// </summary>\n                    /// <param name=\"sorter\" type=\"Function\" locid=\"WinJS.Binding.ListBase.createSorted_p:sorter\">A function that accepts two arguments. The function is called with elements in the list. It must return one of the following numeric values: negative if the first argument is less than the second, zero if the two arguments are equivalent, positive if the first argument is greater than the second.</param>\n                    /// <returns type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.ListBase.createSorted_returnValue\">A sorted projection over the list.</returns>\n                    /// </signature>\n                    return new ns.SortedListProjection(this, sorter);\n                },\n\n                dataSource: {\n                    get: function () {\n                        return (this._dataSource = this._dataSource || new _BindingListDataSource._BindingListDataSource(this));\n                    }\n                },\n\n            }, {\n                supportedForProcessing: false,\n            });\n            _Base.Class.mix(ListBase, _Data.observableMixin);\n            _Base.Class.mix(ListBase, _Events.eventMixin);\n            return ListBase;\n        }),\n\n        ListBaseWithMutators: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.ListBase, null, {\n                // ABSTRACT: setAt(index, value)\n\n                // Normal list modifying operations\n                //\n                // returns data from tail of list\n                pop: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBaseWithMutators.pop\">\n                    /// <summary locid=\"WinJS.Binding.ListBaseWithMutators.pop\">\n                    /// Removes the last element from a list and returns it.\n                    /// </summary>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.ListBaseWithMutators.pop_returnValue\">Last element from the list.</returns>\n                    /// </signature>\n                    return this.splice(-1, 1)[0];\n                },\n                push: function (value) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBaseWithMutators.push\">\n                    /// <summary locid=\"WinJS.Binding.ListBaseWithMutators.push\">\n                    /// Appends new element(s) to a list, and returns the new length of the list.\n                    /// </summary>\n                    /// <param name=\"value\" type=\"Object\" parameterArray=\"true\" locid=\"WinJS.Binding.ListBaseWithMutators.push_p:value\">The element to insert at the end of the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListBaseWithMutators.push_returnValue\">The new length of the list.</returns>\n                    /// </signature>\n                    if (arguments.length === 1) {\n                        this.splice(this.length, 0, value);\n                        return this.length;\n                    } else {\n                        var args = copyargs(arguments);\n                        args.splice(0, 0, this.length, 0);\n                        this.splice.apply(this, args);\n                        return this.length;\n                    }\n                },\n                // returns data from head of list\n                shift: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBaseWithMutators.shift\">\n                    /// <summary locid=\"WinJS.Binding.ListBaseWithMutators.shift\">\n                    /// Removes the first element from a list and returns it.\n                    /// </summary>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.ListBaseWithMutators.shift_returnValue\">First element from the list.</returns>\n                    /// </signature>\n                    return this.splice(0, 1)[0];\n                },\n                unshift: function (value) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListBaseWithMutators.unshift\">\n                    /// <summary locid=\"WinJS.Binding.ListBaseWithMutators.unshift\">\n                    /// Appends new element(s) to a list, and returns the new length of the list.\n                    /// </summary>\n                    /// <param name=\"value\" type=\"Object\" parameterArray=\"true\" locid=\"WinJS.Binding.ListBaseWithMutators.unshift_p:value\">The element to insert at the start of the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListBaseWithMutators.unshift_returnValue\">The new length of the list.</returns>\n                    /// </signature>\n                    if (arguments.length === 1) {\n                        this.splice(0, 0, value);\n                    } else {\n                        var args = copyargs(arguments);\n                        // Wow, this looks weird. Insert 0, 0 at the beginning of splice.\n                        args.splice(0, 0, 0, 0);\n                        this.splice.apply(this, args);\n                    }\n                    return this.length;\n                }\n\n                // ABSTRACT: splice(index, howMany, values...)\n                // ABSTRACT: _spliceFromKey(key, howMany, values...)\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        ListProjection: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.ListBaseWithMutators, null, {\n                _list: null,\n                _myListeners: null,\n\n                _addListListener: function (name, func) {\n                    var l = { name: name, handler: func.bind(this) };\n                    this._myListeners = this._myListeners || [];\n                    this._myListeners.push(l);\n                    this._list.addEventListener(name, l.handler);\n                },\n\n                // ABSTRACT: _listReload()\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListProjection.dispose\">\n                    /// <summary locid=\"WinJS.Binding.ListProjection.dispose\">\n                    /// Disconnects this WinJS.Binding.List projection from its underlying WinJS.Binding.List. This is important only if they have different lifetimes.\n                    /// </summary>\n                    /// </signature>\n                    var list = this._list;\n\n                    var listeners = this._myListeners;\n                    this._myListeners = [];\n\n                    for (var i = 0, len = listeners.length; i < len; i++) {\n                        var l = listeners[i];\n                        list.removeEventListener(l.name, l.handler);\n                    }\n\n                    // Set this to an empty list and tell everyone that they need to reload to avoid\n                    //  consumers null-refing on an empty list.\n                    this._list = new exports.List();\n                    this._listReload();\n                },\n\n                getItemFromKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListProjection.getItemFromKey\">\n                    /// <summary locid=\"WinJS.Binding.ListProjection.getItemFromKey\">\n                    /// Gets a key/data pair for the specified key.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.ListProjection.getItemFromKey_p:key\">The key of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.ListProjection.getItemFromKey_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    return this._list.getItemFromKey(key);\n                },\n\n                move: function (index, newIndex) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListProjection.move\">\n                    /// <summary locid=\"WinJS.Binding.ListProjection.move\">\n                    /// Moves the value at index to position newIndex.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListProjection.move_p:index\">The original index of the value.</param>\n                    /// <param name=\"newIndex\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListProjection.move_p:newIndex\">The index of the value after the move.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    newIndex = asNumber(newIndex);\n                    if (index === newIndex || index < 0 || newIndex < 0 || index >= this.length || newIndex >= this.length) {\n                        return;\n                    }\n                    index = this._list.indexOfKey(this._getKey(index));\n                    newIndex = this._list.indexOfKey(this._getKey(newIndex));\n                    this._list.move(index, newIndex);\n                },\n\n                _notifyMutatedFromKey: function (key) {\n                    this._list._notifyMutatedFromKey(key);\n                },\n\n                splice: function (index, howMany, item) {\n                    /// <signature helpKeyword=\"WinJS.Binding.ListProjection.splice\">\n                    /// <summary locid=\"WinJS.Binding.ListProjection.splice\">\n                    /// Removes elements from a list and, if necessary, inserts new elements in their place, returning the deleted elements.\n                    /// </summary>\n                    /// <param name=\"start\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListProjection.splice_p:start\">The zero-based location in the list from which to start removing elements.</param>\n                    /// <param name=\"howMany\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.ListProjection.splice_p:howMany\">The number of elements to remove.</param>\n                    /// <param name=\"item\" type=\"Object\" optional=\"true\" parameterArray=\"true\" locid=\"WinJS.Binding.ListProjection.splice_p:item\">The elements to insert into the list in place of the deleted elements.</param>\n                    /// <returns type=\"Array\" locid=\"WinJS.Binding.ListProjection.splice_returnValue\">The deleted elements.</returns>\n                    /// </signature>\n                    index = asNumber(index);\n                    index = Math.max(0, this._normalizeIndex(index));\n                    var args = copyargs(arguments);\n                    if (index === this.length) {\n                        // In order to getAt the tail right we just push on to the end of the underlying list\n                        args[0] = this._list.length;\n                        return this._list.splice.apply(this._list, args);\n                    } else {\n                        args[0] = this._getKey(index);\n                        return this._spliceFromKey.apply(this, args);\n                    }\n                },\n\n                _setAtKey: function (key, value) {\n                    this._list._setAtKey(key, value);\n                },\n\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        FilteredListProjection: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.ListProjection, function (list, filter) {\n                this._list = list;\n                this._addListListener(\"itemchanged\", this._listItemChanged);\n                this._addListListener(\"iteminserted\", this._listItemInserted);\n                this._addListListener(\"itemmutated\", this._listItemMutated);\n                this._addListListener(\"itemmoved\", this._listItemMoved);\n                this._addListListener(\"itemremoved\", this._listItemRemoved);\n                this._addListListener(\"reload\", this._listReload);\n                this._filter = filter;\n                this._initFilteredKeys();\n            }, {\n                _filter: null,\n                _filteredKeys: null,\n                _initFilteredKeys: function () {\n                    var filter = this._filter;\n                    var list = this._list;\n                    var keys = [];\n                    for (var i = 0, len = list.length; i < len; i++) {\n                        var item = list.getItem(i);\n                        if (item && filter(item.data)) {\n                            keys.push(item.key);\n                        }\n                    }\n                    this._filteredKeys = keys;\n                },\n\n                _findInsertionPosition: function (key, index) {\n                    // find the spot to insert this by identifing the previous element in the list\n                    var filter = this._filter;\n                    var previousKey;\n                    while ((--index) >= 0) {\n                        var item = this._list.getItem(index);\n                        if (item && filter(item.data)) {\n                            previousKey = item.key;\n                            break;\n                        }\n                    }\n                    var filteredKeys = this._filteredKeys;\n                    var filteredIndex = previousKey ? (filteredKeys.indexOf(previousKey) + 1) : 0;\n                    return filteredIndex;\n                },\n\n                _listItemChanged: function (event) {\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    var oldValue = event.detail.oldValue;\n                    var newValue = event.detail.newValue;\n                    var oldItem = event.detail.oldItem;\n                    var newItem = event.detail.newItem;\n                    var filter = this._filter;\n                    var oldInFilter = filter(oldValue);\n                    var newInFilter = filter(newValue);\n                    if (oldInFilter && newInFilter) {\n                        var filteredKeys = this._filteredKeys;\n                        var filteredIndex = filteredKeys.indexOf(key);\n                        this._notifyItemChanged(key, filteredIndex, oldValue, newValue, oldItem, newItem);\n                    } else if (oldInFilter && !newInFilter) {\n                        this._listItemRemoved({ detail: { key: key, index: index, value: oldValue, item: oldItem } });\n                    } else if (!oldInFilter && newInFilter) {\n                        this._listItemInserted({ detail: { key: key, index: index, value: newValue } });\n                    }\n                },\n                _listItemInserted: function (event) {\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    var value = event.detail.value;\n                    var filter = this._filter;\n                    if (filter(value)) {\n                        var filteredIndex = this._findInsertionPosition(key, index);\n                        var filteredKeys = this._filteredKeys;\n                        filteredKeys.splice(filteredIndex, 0, key);\n                        this._notifyItemInserted(key, filteredIndex, value);\n                    }\n                },\n                _listItemMoved: function (event) {\n                    var key = event.detail.key;\n                    var newIndex = event.detail.newIndex;\n                    var value = event.detail.value;\n                    var filteredKeys = this._filteredKeys;\n                    var oldFilteredIndex = filteredKeys.indexOf(key);\n                    if (oldFilteredIndex !== -1) {\n                        filteredKeys.splice(oldFilteredIndex, 1);\n                        var newFilteredIndex = this._findInsertionPosition(key, newIndex);\n                        filteredKeys.splice(newFilteredIndex, 0, key);\n                        this._notifyItemMoved(key, oldFilteredIndex, newFilteredIndex, value);\n                    }\n                },\n                _listItemMutated: function (event) {\n                    var key = event.detail.key;\n                    var value = event.detail.value;\n                    var item = event.detail.item;\n                    var filter = this._filter;\n                    var filteredKeys = this._filteredKeys;\n                    var filteredIndex = filteredKeys.indexOf(key);\n                    var oldInFilter = filteredIndex !== -1;\n                    var newInFilter = filter(value);\n                    if (oldInFilter && newInFilter) {\n                        this._notifyItemMutated(key, value, item);\n                    } else if (oldInFilter && !newInFilter) {\n                        filteredKeys.splice(filteredIndex, 1);\n                        this._notifyItemRemoved(key, filteredIndex, value, item);\n                    } else if (!oldInFilter && newInFilter) {\n                        this._listItemInserted({ detail: { key: key, index: this._list.indexOfKey(key), value: value } });\n                    }\n                },\n                _listItemRemoved: function (event) {\n                    var key = event.detail.key;\n                    var value = event.detail.value;\n                    var item = event.detail.item;\n                    var filteredKeys = this._filteredKeys;\n                    var filteredIndex = filteredKeys.indexOf(key);\n                    if (filteredIndex !== -1) {\n                        filteredKeys.splice(filteredIndex, 1);\n                        this._notifyItemRemoved(key, filteredIndex, value, item);\n                    }\n                },\n                _listReload: function () {\n                    this._initFilteredKeys();\n                    this._notifyReload();\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.FilteredListProjection.length\" helpKeyword=\"WinJS.Binding.FilteredListProjection.length\">Returns an integer value one higher than the highest element defined in an list.</field>\n                length: {\n                    get: function () { return this._filteredKeys.length; },\n                    set: function (value) {\n                        if (typeof value === \"number\" && value >= 0) {\n                            var current = this.length;\n                            if (current > value) {\n                                this.splice(value, current - value);\n                            }\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.Binding.List.IllegalLength\", strings.illegalListLength);\n                        }\n                    }\n                },\n\n                getItem: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.FilteredListProjection.getItem\">\n                    /// <summary locid=\"WinJS.Binding.FilteredListProjection.getItem\">\n                    /// Returns a key/data pair for the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.FilteredListProjection.getItem_p:index\">The index of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.FilteredListProjection.getItem_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    index = asNumber(index);\n                    return this.getItemFromKey(this._filteredKeys[index]);\n                },\n\n                indexOfKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.FilteredListProjection.indexOfKey\">\n                    /// <summary locid=\"WinJS.Binding.FilteredListProjection.indexOfKey\">\n                    /// Returns the index of the first occurrence of a key in a list.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.FilteredListProjection.indexOfKey_p:key\">The key to locate in the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.FilteredListProjection.indexOfKey_returnValue\">The index of the first occurrence of a key in a list, or -1 if not found.</returns>\n                    /// </signature>\n                    return this._filteredKeys.indexOf(key);\n                },\n\n                notifyMutated: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.FilteredListProjection.notifyMutated\">\n                    /// <summary locid=\"WinJS.Binding.FilteredListProjection.notifyMutated\">\n                    /// Forces the list to send a itemmutated notification to any listeners for the value at the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.FilteredListProjection.notifyMutated_p:index\">The index of the value that was mutated.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    return this._notifyMutatedFromKey(this._filteredKeys[index]);\n                },\n\n                setAt: function (index, value) {\n                    /// <signature helpKeyword=\"WinJS.Binding.FilteredListProjection.setAt\">\n                    /// <summary locid=\"WinJS.Binding.FilteredListProjection.setAt\">\n                    /// Replaces the value at the specified index with a new value.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.FilteredListProjection.setAt_p:index\">The index of the value that was replaced.</param>\n                    /// <param name=\"newValue\" type=\"Object\" locid=\"WinJS.Binding.FilteredListProjection.setAt_p:newValue\">The new value.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    this._setAtKey(this._filteredKeys[index], value);\n                },\n\n                // returns [ data* ] of removed items\n                _spliceFromKey: function (key, howMany) {\n                    // first add in all the new items if we have any, this should serve to push key to the right\n                    if (arguments.length > 2) {\n                        var args = copyargs(arguments);\n                        args[1] = 0; // howMany\n                        this._list._spliceFromKey.apply(this._list, args);\n                    }\n                    // now we can remove anything that needs to be removed, since they are not necessarially contiguous\n                    // in the underlying list we remove them one by one.\n                    var result = [];\n                    if (howMany) {\n                        var keysToRemove = [];\n                        var filteredKeys = this._filteredKeys;\n                        var filteredKeyIndex = filteredKeys.indexOf(key);\n                        for (var i = filteredKeyIndex, len = filteredKeys.length; i < len && (i - filteredKeyIndex) < howMany; i++) {\n                            var key = filteredKeys[i];\n                            keysToRemove.push(key);\n                        }\n                        var that = this;\n                        keysToRemove.forEach(function (key) {\n                            result.push(that._list._spliceFromKey(key, 1)[0]);\n                        });\n                    }\n                    return result;\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        SortedListProjection: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.ListProjection, function (list, sortFunction) {\n                this._list = list;\n                this._addListListener(\"itemchanged\", this._listItemChanged);\n                this._addListListener(\"iteminserted\", this._listItemInserted);\n                this._addListListener(\"itemmoved\", this._listItemMoved);\n                this._addListListener(\"itemmutated\", this._listItemMutated);\n                this._addListListener(\"itemremoved\", this._listItemRemoved);\n                this._addListListener(\"reload\", this._listReload);\n                this._sortFunction = sortFunction;\n                this._initSortedKeys();\n            }, {\n                _sortFunction: null,\n                _sortedKeys: null,\n                _initSortedKeys: function () {\n                    var list = this._list;\n                    var keys = [];\n                    for (var i = 0, len = list.length; i < len; i++) {\n                        var item = list.getItem(i);\n                        if (item) {\n                            keys[i] = item.key;\n                        }\n                    }\n                    var sorter = this._sortFunction;\n                    var sorted = mergeSort(keys, function (l, r) {\n                        l = list.getItemFromKey(l).data;\n                        r = list.getItemFromKey(r).data;\n                        return sorter(l, r);\n                    });\n                    this._sortedKeys = sorted;\n                },\n\n                _findInsertionPos: function (key, index, value, startingMin, startingMax) {\n                    var sorter = this._sortFunction;\n                    var sortedKeys = this._sortedKeys;\n                    var min = Math.max(0, startingMin || -1);\n                    var max = Math.min(sortedKeys.length, startingMax || Number.MAX_VALUE);\n                    var mid = min;\n                    while (min <= max) {\n                        mid = ((min + max) / 2) >>> 0;\n                        var sortedKey = sortedKeys[mid];\n                        if (!sortedKey) {\n                            break;\n                        }\n                        var sortedItem = this.getItemFromKey(sortedKey);\n                        var r = sorter(sortedItem.data, value);\n                        if (r < 0) {\n                            min = mid + 1;\n                        } else if (r === 0) {\n                            return this._findStableInsertionPos(key, index, min, max, mid, value);\n                        } else {\n                            max = mid - 1;\n                        }\n                    }\n                    return min;\n                },\n                _findBeginningOfGroup: function (mid, sorter, list, sortedKeys, value) {\n                    // we made it to the beginning of the list without finding something\n                    // that sorts equal to this value, insert this key at the beginning of\n                    // this section of keys.\n                    var min = 0;\n                    var max = mid;\n                    while (min <= max) {\n                        mid = ((min + max) / 2) >>> 0;\n                        var sortedKey = sortedKeys[mid];\n                        var sortedItem = list.getItemFromKey(sortedKey);\n                        var r = sorter(sortedItem.data, value);\n                        if (r < 0) {\n                            min = mid + 1;\n                        } else {\n                            max = mid - 1;\n                        }\n                    }\n                    return min;\n                },\n                _findEndOfGroup: function (mid, sorter, list, sortedKeys, value) {\n                    // we made it ot the end of the list without finding something that sorts\n                    // equal to this value, insert this key at the end of this section of\n                    // keys.\n                    var min = mid;\n                    var max = sortedKeys.length;\n                    while (min <= max) {\n                        mid = ((min + max) / 2) >>> 0;\n                        var sortedKey = sortedKeys[mid];\n                        if (!sortedKey) {\n                            return sortedKeys.length;\n                        }\n                        var sortedItem = list.getItemFromKey(sortedKey);\n                        var r = sorter(sortedItem.data, value);\n                        if (r <= 0) {\n                            min = mid + 1;\n                        } else {\n                            max = mid - 1;\n                        }\n                    }\n                    return min;\n                },\n                _findStableInsertionPos: function (key, index, min, max, mid, value) {\n                    var list = this._list;\n                    var length = list.length;\n                    var sorter = this._sortFunction;\n                    var sortedKeys = this._sortedKeys;\n                    if (index < (length / 2)) {\n                        for (var i = index - 1; i >= 0; i--) {\n                            var item = list.getItem(i);\n                            if (sorter(item.data, value) === 0) {\n                                // we have found the next item to the left, insert this item to\n                                // the right of that.\n                                if ((length - min) > max) {\n                                    return sortedKeys.indexOf(item.key, min) + 1;\n                                } else {\n                                    return sortedKeys.lastIndexOf(item.key, max) + 1;\n                                }\n                            }\n                        }\n                        return this._findBeginningOfGroup(mid, sorter, list, sortedKeys, value);\n                    } else {\n                        for (var i = index + 1; i < length; i++) {\n                            var item = list.getItem(i);\n                            if (sorter(item.data, value) === 0) {\n                                // we have found the next item to the right, insert this item\n                                // to the left of that.\n                                if ((length - min) > max) {\n                                    return sortedKeys.indexOf(item.key, min);\n                                } else {\n                                    return sortedKeys.lastIndexOf(item.key, max);\n                                }\n                            }\n                        }\n                        return this._findEndOfGroup(mid, sorter, list, sortedKeys, value);\n                    }\n                },\n\n                _listItemChanged: function (event) {\n                    var key = event.detail.key;\n                    var newValue = event.detail.newValue;\n                    var oldValue = event.detail.oldValue;\n                    var sortFunction = this._sortFunction;\n                    if (sortFunction(oldValue, newValue) === 0) {\n                        var sortedIndex = this.indexOfKey(key);\n                        this._notifyItemChanged(key, sortedIndex, oldValue, newValue, event.detail.oldItem, event.detail.newItem);\n                    } else {\n                        this._listItemRemoved({ detail: { key: key, index: event.detail.index, value: event.detail.oldValue, item: event.detail.oldItem } });\n                        this._listItemInserted({ detail: { key: key, index: event.detail.index, value: event.detail.newValue } });\n                    }\n                },\n                _listItemInserted: function (event, knownMin, knownMax) {\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    var value = event.detail.value;\n                    var sortedIndex = this._findInsertionPos(key, index, value, knownMin, knownMax);\n                    this._sortedKeys.splice(sortedIndex, 0, key);\n                    this._notifyItemInserted(key, sortedIndex, value);\n                },\n                _listItemMoved: function (event, knownMin, knownMax) {\n                    var key = event.detail.key;\n                    var newIndex = event.detail.newIndex;\n                    var value = event.detail.value;\n                    var sortedKeys = this._sortedKeys;\n                    var oldSortedIndex = sortedKeys.indexOf(key, knownMin);\n                    sortedKeys.splice(oldSortedIndex, 1);\n                    var newSortedIndex = this._findInsertionPos(key, newIndex, value, knownMin, knownMax);\n                    sortedKeys.splice(newSortedIndex, 0, key);\n                    if (newSortedIndex !== oldSortedIndex) {\n                        // The move in the underlying list resulted in a move in the sorted list\n                        //\n                        this._notifyItemMoved(key, oldSortedIndex, newSortedIndex, value);\n                    } else {\n                        // The move in the underlying list resulted in no change in the sorted list\n                        //\n                    }\n                },\n                _listItemMutated: function (event) {\n                    var key = event.detail.key;\n                    var value = event.detail.value;\n                    var item = event.detail.item;\n                    var index = this._list.indexOfKey(key);\n                    var sortedIndex = this._sortedKeys.indexOf(key);\n                    this._sortedKeys.splice(sortedIndex, 1);\n                    var targetIndex = this._findInsertionPos(key, index, value);\n                    this._sortedKeys.splice(sortedIndex, 0, key);\n                    if (sortedIndex === targetIndex) {\n                        this._notifyItemMutated(key, value, item);\n                        return;\n                    }\n                    this._listItemRemoved({ detail: { key: key, index: index, value: value, item: item } });\n                    this._listItemInserted({ detail: { key: key, index: index, value: value } });\n                },\n                _listItemRemoved: function (event, knownMin) {\n                    var key = event.detail.key;\n                    var value = event.detail.value;\n                    var item = event.detail.item;\n                    var sortedKeys = this._sortedKeys;\n                    var sortedIndex = sortedKeys.indexOf(key, knownMin);\n                    sortedKeys.splice(sortedIndex, 1);\n                    this._notifyItemRemoved(key, sortedIndex, value, item);\n                },\n                _listReload: function () {\n                    this._initSortedKeys();\n                    this._notifyReload();\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.SortedListProjection.length\" helpKeyword=\"WinJS.Binding.SortedListProjection.length\">Gets or sets the length of the list. Returns an integer value one higher than the highest element defined in a list.</field>\n                length: {\n                    get: function () { return this._sortedKeys.length; },\n                    set: function (value) {\n                        if (typeof value === \"number\" && value >= 0) {\n                            var current = this.length;\n                            if (current > value) {\n                                this.splice(value, current - value);\n                            }\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.Binding.List.IllegalLength\", strings.illegalListLength);\n                        }\n                    }\n                },\n\n                getItem: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.SortedListProjection.getItem\">\n                    /// <summary locid=\"WinJS.Binding.SortedListProjection.getItem\">\n                    /// Returns a key/data pair for the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.SortedListProjection.getItem_p:index\">The index of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.SortedListProjection.getItem_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    index = asNumber(index);\n                    return this.getItemFromKey(this._sortedKeys[index]);\n                },\n\n                indexOfKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.SortedListProjection.getItem\">\n                    /// <summary locid=\"WinJS.Binding.SortedListProjection.getItem\">\n                    /// Returns the index of the first occurrence of a key.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.SortedListProjection.indexOfKey_p:key\">The key to locate in the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.SortedListProjection.indexOfKey_returnValue\">The index of the first occurrence of a key in a list, or -1 if not found.</returns>\n                    /// </signature>\n                    return this._sortedKeys.indexOf(key);\n                },\n\n                notifyMutated: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.SortedListProjection.notifyMutated\">\n                    /// <summary locid=\"WinJS.Binding.SortedListProjection.notifyMutated\">\n                    /// Forces the list to send a itemmutated notification to any listeners for the value at the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.SortedListProjection.notifyMutated_p:index\">The index of the value that was mutated.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    this._notifyMutatedFromKey(this._sortedKeys[index]);\n                },\n\n                setAt: function (index, value) {\n                    /// <signature helpKeyword=\"WinJS.Binding.SortedListProjection.setAt\">\n                    /// <summary locid=\"WinJS.Binding.SortedListProjection.setAt\">\n                    /// Replaces the value at the specified index with a new value.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.SortedListProjection.setAt_p:index\">The index of the value that was replaced.</param>\n                    /// <param name=\"newValue\" type=\"Object\" locid=\"WinJS.Binding.SortedListProjection.setAt_p:newValue\">The new value.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    this._setAtKey(this._sortedKeys[index], value);\n                },\n\n                // returns [ data* ] of removed items\n                _spliceFromKey: function (key, howMany) {\n                    // first add in all the new items if we have any, this should serve to push key to the right\n                    if (arguments.length > 2) {\n                        var args = copyargs(arguments);\n                        args[1] = 0; // howMany\n                        this._list._spliceFromKey.apply(this._list, args);\n                    }\n                    // now we can remove anything that needs to be removed, since they are not necessarially contiguous\n                    // in the underlying list we remove them one by one.\n                    var result = [];\n                    if (howMany) {\n                        var keysToRemove = [];\n                        var sortedKeys = this._sortedKeys;\n                        var sortedKeyIndex = sortedKeys.indexOf(key);\n                        for (var i = sortedKeyIndex, len = sortedKeys.length; i < len && (i - sortedKeyIndex) < howMany; i++) {\n                            keysToRemove.push(sortedKeys[i]);\n                        }\n                        var that = this;\n                        keysToRemove.forEach(function (key) {\n                            result.push(that._list._spliceFromKey(key, 1)[0]);\n                        });\n                    }\n                    return result;\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        // This projection sorts the underlying list by group key and within a group\n        //  respects the position of the item in the underlying list. It is built on top\n        //  of the SortedListProjection and has an intimate contract with\n        //  GroupsListProjection.\n        //\n        GroupedSortedListProjection: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.SortedListProjection, function (list, groupKeyOf, groupDataOf, groupSorter) {\n                this._list = list;\n                this._addListListener(\"itemchanged\", this._listGroupedItemChanged);\n                this._addListListener(\"iteminserted\", this._listGroupedItemInserted);\n                this._addListListener(\"itemmoved\", this._listGroupedItemMoved);\n                this._addListListener(\"itemmutated\", this._listGroupedItemMutated);\n                this._addListListener(\"itemremoved\", this._listGroupedItemRemoved);\n                this._addListListener(\"reload\", this._listReload);\n                this._sortFunction = function (l, r) {\n                    l = groupKeyOf(l);\n                    r = groupKeyOf(r);\n                    if (groupSorter) {\n                        return groupSorter(l, r);\n                    } else {\n                        return l < r ? -1 : l === r ? 0 : 1;\n                    }\n                };\n                this._groupKeyOf = groupKeyOf;\n                this._groupDataOf = groupDataOf;\n                this._initSortedKeys();\n                this._initGroupedItems();\n            }, {\n                _groupKeyOf: null,\n                _groupDataOf: null,\n\n                _groupedItems: null,\n                _initGroupedItems: function () {\n                    var groupedItems = {};\n                    var list = this._list;\n                    var groupKeyOf = this._groupKeyOf;\n                    for (var i = 0, len = list.length; i < len; i++) {\n                        var item = cloneItem(list.getItem(i));\n                        item.groupKey = groupKeyOf(item.data);\n                        groupedItems[item.key] = item;\n                    }\n                    this._groupedItems = groupedItems;\n                },\n\n                _groupsProjection: null,\n\n                _listGroupedItemChanged: function (event) {\n                    var key = event.detail.key;\n                    var oldValue = event.detail.oldValue;\n                    var newValue = event.detail.newValue;\n                    var groupedItems = this._groupedItems;\n                    var oldGroupedItem = groupedItems[key];\n                    var newGroupedItem = cloneItem(oldGroupedItem);\n                    newGroupedItem.data = newValue;\n                    newGroupedItem.groupKey = this._groupKeyOf(newValue);\n                    groupedItems[key] = newGroupedItem;\n                    var index;\n                    if (oldGroupedItem.groupKey === newGroupedItem.groupKey) {\n                        index = this.indexOfKey(key);\n                        this._notifyItemChanged(key, index, oldValue, newValue, oldGroupedItem, newGroupedItem);\n                    } else {\n                        index = event.detail.index;\n                        this._listItemChanged({ detail: { key: key, index: index, oldValue: oldValue, newValue: newValue, oldItem: oldGroupedItem, newItem: newGroupedItem } });\n                    }\n                },\n                _listGroupedItemInserted: function (event) {\n                    var key = event.detail.key;\n                    var value = event.detail.value;\n                    var groupKey = this._groupKeyOf(value);\n                    this._groupedItems[key] = {\n                        handle: key,\n                        key: key,\n                        data: value,\n                        groupKey: groupKey\n                    };\n                    var groupMin, groupMax;\n                    if (this._groupsProjection) {\n                        var groupItem = this._groupsProjection._groupItems[groupKey];\n                        if (groupItem) {\n                            groupMin = groupItem.firstItemIndexHint;\n                            groupMax = groupMin + groupItem.groupSize;\n                        }\n                    }\n                    this._listItemInserted(event, groupMin, groupMax);\n                },\n                _listGroupedItemMoved: function (event) {\n                    var groupMin, groupMax;\n                    var groupKey = this._groupedItems[event.detail.key].groupKey;\n                    if (this._groupsProjection) {\n                        var groupItem = this._groupsProjection._groupItems[groupKey];\n                        groupMin = groupItem.firstItemIndexHint;\n                        groupMax = groupMin + groupItem.groupSize;\n                    }\n                    this._listItemMoved(event, groupMin, groupMax);\n                },\n                _listGroupedItemMutated: function (event) {\n                    var key = event.detail.key;\n                    var value = event.detail.value;\n                    var groupedItems = this._groupedItems;\n                    var oldGroupedItem = groupedItems[key];\n                    var groupKey = this._groupKeyOf(value);\n                    if (oldGroupedItem.groupKey === groupKey) {\n                        this._notifyItemMutated(key, value, oldGroupedItem);\n                    } else {\n                        var newGroupedItem = cloneItem(oldGroupedItem);\n                        newGroupedItem.groupKey = groupKey;\n                        groupedItems[key] = newGroupedItem;\n                        var index = this._list.indexOfKey(key);\n                        this._listItemRemoved({ detail: { key: key, index: index, value: value, item: oldGroupedItem } });\n                        this._listItemInserted({ detail: { key: key, index: index, value: value } });\n                    }\n                },\n                _listGroupedItemRemoved: function (event) {\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    var value = event.detail.value;\n                    var groupedItems = this._groupedItems;\n                    var groupedItem = groupedItems[key];\n                    delete groupedItems[key];\n                    var groupMin, groupMax;\n                    if (this._groupsProjection) {\n                        var groupItem = this._groupsProjection._groupItems[groupedItem.groupKey];\n                        groupMin = groupItem.firstItemIndexHint;\n                        groupMax = groupMin + groupItem.groupSize;\n                    }\n                    this._listItemRemoved({ detail: { key: key, index: index, value: value, item: groupedItem } }, groupMin, groupMax);\n                },\n\n                // override _listReload\n                _listReload: function () {\n                    this._initGroupedItems();\n                    ns.SortedListProjection.prototype._listReload.call(this);\n                },\n\n                /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.GroupedSortedListProjection.groups\" helpKeyword=\"WinJS.Binding.GroupedSortedListProjection.groups\">Gets a WinJS.Binding.List, which is a projection of the groups that were identified in this list.</field>\n                groups: {\n                    get: function () {\n                        if (this._groupsProjection === null) {\n                            this._groupsProjection = new ns.GroupsListProjection(this, this._groupKeyOf, this._groupDataOf);\n                        }\n                        return this._groupsProjection;\n                    }\n                },\n\n                // We have to implement this because we keep our own set of items so that we can\n                //  tag them with groupKey.\n                //\n                getItemFromKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.GroupedSortedListProjection.getItemFromKey\">\n                    /// <summary locid=\"WinJS.Binding.GroupedSortedListProjection.getItemFromKey\">\n                    /// Gets a key/data pair for the specified item key.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.GroupedSortedListProjection.getItemFromKey_p:key\">The key of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.GroupedSortedListProjection.getItemFromKey_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    return this._groupedItems[key];\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        // This is really an implementation detail of GroupedSortedListProjection and takes a\n        // dependency on its internals and implementation details.\n        //\n        GroupsListProjection: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.ListBase, function (list, groupKeyOf, groupDataOf) {\n                this._list = list;\n                this._addListListener(\"itemchanged\", this._listItemChanged);\n                this._addListListener(\"iteminserted\", this._listItemInserted);\n                this._addListListener(\"itemmoved\", this._listItemMoved);\n                // itemmutated is handled by the GroupedSortedListProjection because if the item\n                //  changes groups it turns into a remove/insert.\n                this._addListListener(\"itemremoved\", this._listItemRemoved);\n                this._addListListener(\"reload\", this._listReload);\n                this._groupKeyOf = groupKeyOf;\n                this._groupDataOf = groupDataOf;\n                this._initGroupKeysAndItems();\n            }, {\n                _list: null,\n\n                _addListListener: function (name, func) {\n                    // interestingly, since GroupsListProjection has the same lifetime as the GroupedSortedListProjection\n                    // we don't have to worry about cleaning up the cycle here.\n                    this._list.addEventListener(name, func.bind(this));\n                },\n\n                _groupDataOf: null,\n                _groupKeyOf: null,\n                _groupOf: function (item) {\n                    return this.getItemFromKey(this._groupKeyOf(item.data));\n                },\n\n                _groupKeys: null,\n                _groupItems: null,\n                _initGroupKeysAndItems: function () {\n                    var groupDataOf = this._groupDataOf;\n                    var list = this._list;\n                    var groupItems = {};\n                    var groupKeys = [];\n                    var currentGroupKey = null;\n                    var currentGroupItem = null;\n                    var groupCount;\n                    for (var i = 0, len = list.length; i < len; i++) {\n                        var item = list.getItem(i);\n                        var groupKey = item.groupKey;\n                        if (groupKey !== currentGroupKey) {\n                            // new group\n                            if (currentGroupItem) {\n                                currentGroupItem.groupSize = groupCount;\n                            }\n                            groupCount = 1;\n                            currentGroupKey = groupKey;\n                            currentGroupItem = {\n                                handle: groupKey,\n                                key: groupKey,\n                                data: groupDataOf(item.data),\n                                firstItemKey: item.key,\n                                firstItemIndexHint: i\n                            };\n                            groupItems[groupKey] = currentGroupItem;\n                            groupKeys.push(groupKey);\n                        } else {\n                            // existing group\n                            groupCount++;\n                        }\n                    }\n                    if (currentGroupItem) {\n                        currentGroupItem.groupSize = groupCount;\n                    }\n                    this._groupKeys = groupKeys;\n                    this._groupItems = groupItems;\n                },\n\n                _listItemChanged: function (event) {\n                    // itemchanged is only interesting if the item that changed is the first item\n                    //  of a group at which point we need to regenerate the group item.\n                    //\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    var newValue = event.detail.newValue;\n                    var list = this._list;\n                    var groupKey = list.getItemFromKey(key).groupKey;\n                    var groupItems = this._groupItems;\n                    var groupItem = groupItems[groupKey];\n                    if (groupItem.firstItemIndexHint === index) {\n                        var newGroupItem = cloneItem(groupItem);\n                        newGroupItem.data = this._groupDataOf(newValue);\n                        newGroupItem.firstItemKey = key;\n                        groupItems[groupKey] = newGroupItem;\n                        this._notifyItemChanged(groupKey, this._groupKeys.indexOf(groupKey), groupItem.data, newGroupItem.data, groupItem, newGroupItem);\n                    }\n                },\n                _listItemInserted: function (event) {\n                    // iteminserted is only interesting if this is a new group, or is the first\n                    //  item of the group at which point the group data is regenerated. It will\n                    //  however always result in a +1 to all the following firstItemIndexHints\n                    //\n                    var key = event.detail.key;\n                    var index = event.detail.index;\n                    var value = event.detail.value;\n                    var list = this._list;\n                    var groupKey = list.getItemFromKey(key).groupKey;\n                    var groupItems = this._groupItems;\n                    var groupKeys = this._groupKeys;\n                    var groupItem = groupItems[groupKey];\n                    var groupIndex;\n                    var oldGroupItem, newGroupItem;\n\n                    var i, len;\n                    if (!groupItem) {\n                        // we have a new group, add it\n                        for (i = 0, len = groupKeys.length; i < len; i++) {\n                            groupItem = groupItems[groupKeys[i]];\n                            if (groupItem.firstItemIndexHint >= index) {\n                                break;\n                            }\n                        }\n                        groupIndex = i;\n                        groupItem = {\n                            handle: groupKey,\n                            key: groupKey,\n                            data: this._groupDataOf(value),\n                            groupSize: 1,\n                            firstItemKey: key,\n                            firstItemIndexHint: index\n                        };\n                        groupKeys.splice(groupIndex, 0, groupKey);\n                        groupItems[groupKey] = groupItem;\n                        this._notifyItemInserted(groupKey, groupIndex, groupItem.data);\n                    } else {\n                        oldGroupItem = groupItem;\n                        newGroupItem = cloneItem(oldGroupItem);\n                        newGroupItem.groupSize++;\n                        if (oldGroupItem.firstItemIndexHint === index) {\n                            newGroupItem.groupData = this._groupDataOf(value);\n                            newGroupItem.firstItemKey = key;\n                            newGroupItem.firstItemIndexHint = index;\n                        }\n                        groupItems[groupKey] = newGroupItem;\n                        groupIndex = groupKeys.indexOf(groupKey);\n                        this._notifyItemChanged(groupKey, groupIndex, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);\n                    }\n                    // update the firstItemIndexHint on following groups\n                    for (i = groupIndex + 1, len = groupKeys.length; i < len; i++) {\n                        oldGroupItem = groupItems[groupKeys[i]];\n                        newGroupItem = cloneItem(oldGroupItem);\n                        newGroupItem.firstItemIndexHint++;\n                        groupItems[newGroupItem.key] = newGroupItem;\n                        this._notifyItemChanged(newGroupItem.key, i, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);\n                    }\n                },\n                _listItemMoved: function (event) {\n                    // itemmoved is not important to grouping unless the move resulted in a new\n                    //  first item in the group at which point we will regenerate the group data\n                    //\n                    var key = event.detail.key;\n                    var oldIndex = event.detail.oldIndex;\n                    var newIndex = event.detail.newIndex;\n                    var list = this._list;\n                    var groupKey = list.getItemFromKey(key).groupKey;\n                    var groupItems = this._groupItems;\n                    var groupItem = groupItems[groupKey];\n                    if (groupItem.firstItemIndexHint === newIndex ||\n                        groupItem.firstItemIndexHint === oldIndex) {\n                        // the first item of the group has changed, update it.\n                        var item = list.getItem(groupItem.firstItemIndexHint);\n                        var newGroupItem = cloneItem(groupItem);\n                        newGroupItem.data = this._groupDataOf(item.data);\n                        newGroupItem.firstItemKey = item.key;\n                        groupItems[groupKey] = newGroupItem;\n                        this._notifyItemChanged(groupKey, this._groupKeys.indexOf(groupKey), groupItem.data, newGroupItem.data, groupItem, newGroupItem);\n                    }\n                },\n                _listItemRemoved: function (event) {\n                    // itemremoved is only interesting if the group was of size 1 or was the\n                    //  first item of the group at which point the group data is regenerated.\n                    //  It will however always result in a -1 to all of the following\n                    //  firstItemIndexHints.\n                    //\n                    var index = event.detail.index;\n                    var item = event.detail.item;\n                    var groupItems = this._groupItems;\n                    var groupKeys = this._groupKeys;\n                    // since the value is no longer in the list we can't ask for its item and\n                    // get the group key from there.\n                    var groupKey = item.groupKey;\n                    var groupItem = groupItems[groupKey];\n                    var groupIndex = groupKeys.indexOf(groupKey);\n                    var oldGroupItem, newGroupItem;\n\n                    if (groupItem.groupSize === 1) {\n                        groupKeys.splice(groupIndex, 1);\n                        delete groupItems[groupKey];\n                        this._notifyItemRemoved(groupKey, groupIndex, groupItem.data, groupItem);\n                        // after removing the group we need to decrement the index because it is used\n                        // for modifying subsequent group firstItemIndexHint's\n                        groupIndex--;\n                    } else {\n                        oldGroupItem = groupItem;\n                        newGroupItem = cloneItem(oldGroupItem);\n                        newGroupItem.groupSize--;\n                        if (oldGroupItem.firstItemIndexHint === index) {\n                            // find the next group item, it will be at the same index as the old\n                            // first group item.\n                            var newFirstItem = this._list.getItem(index);\n                            newGroupItem.data = this._groupDataOf(newFirstItem.data);\n                            newGroupItem.firstItemKey = newFirstItem.key;\n                        }\n                        groupItems[groupKey] = newGroupItem;\n                        this._notifyItemChanged(groupKey, groupIndex, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);\n                    }\n                    for (var i = groupIndex + 1, len = groupKeys.length; i < len; i++) {\n                        oldGroupItem = groupItems[groupKeys[i]];\n                        newGroupItem = cloneItem(oldGroupItem);\n                        newGroupItem.firstItemIndexHint--;\n                        groupItems[newGroupItem.key] = newGroupItem;\n                        this._notifyItemChanged(newGroupItem.key, i, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);\n                    }\n                },\n                _listReload: function () {\n                    this._initGroupKeysAndItems();\n                    this._notifyReload();\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.GroupsListProjection.length\" helpKeyword=\"WinJS.Binding.GroupsListProjection.length\">Gets the length of the list. Returns an integer value one higher than the highest element defined in a list.</field>\n                length: {\n                    get: function () { return this._groupKeys.length; }\n                },\n\n                getItem: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.GroupsListProjection.getItem\">\n                    /// <summary locid=\"WinJS.Binding.GroupsListProjection.getItem\">\n                    /// Gets a key/data pair for the specified index .\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.GroupsListProjection.getItem_p:index\">The index of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.GroupsListProjection.getItem_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    index = asNumber(index);\n                    return this._groupItems[this._groupKeys[index]];\n                },\n                getItemFromKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.GroupsListProjection.getItemFromKey\">\n                    /// <summary locid=\"WinJS.Binding.GroupsListProjection.getItemFromKey\">\n                    /// Gets a key/data pair for the specified key.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.GroupsListProjection.getItemFromKey_p:key\">The key of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.GroupsListProjection.getItemFromKey_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    return this._groupItems[key];\n                },\n\n                indexOfKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.GroupsListProjection.indexOfKey\">\n                    /// <summary locid=\"WinJS.Binding.GroupsListProjection.indexOfKey\">\n                    /// Returns the index of the first occurrence of a key in a list.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.GroupsListProjection.indexOfKey_p:key\">The key to locate in the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.GroupsListProjection.indexOfKey_returnValue\">The index of the first occurrence of a key in a list, or -1 if not found.</returns>\n                    /// </signature>\n                    return this._groupKeys.indexOf(key);\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Binding\", {\n        List: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(ns.ListBaseWithMutators, function (list, options) {\n                /// <signature helpKeyword=\"WinJS.Binding.List.List\">\n                /// <summary locid=\"WinJS.Binding.List.constructor\">\n                /// Creates a WinJS.Binding.List object.\n                /// </summary>\n                /// <param name=\"list\" type=\"Array\" optional=\"true\" locid=\"WinJS.Binding.List.constructor_p:list\">The array containing the elements to initalize the list.</param>\n                /// <param name=\"options\" type=\"Object\" optional=\"true\" locid=\"WinJS.Binding.List.constructor_p:options\">If options.binding is true, the list will contain the result of calling WinJS.Binding.as() on the element values. If options.proxy is true, the list specified as the first parameter is used as the storage for the WinJS.Binding.List. This option should be used with care because uncoordinated edits to the data storage will result in errors.</param>\n                /// <returns type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.List.constructor_returnValue\">The newly-constructed WinJS.Binding.List instance.</returns>\n                /// </signature>\n\n                this._currentKey = 0;\n                this._keys = null;\n                this._keyMap = {};\n\n                // options:\n                //  - binding: binding.as on items\n                //  - proxy: proxy over input data\n                //\n                options = options || emptyOptions;\n                this._proxy = options.proxy;\n                this._binding = options.binding;\n                if (this._proxy) {\n                    if (Object.keys(list).length !== list.length) {\n                        throw new _ErrorFromName(\"WinJS.Binding.List.NotSupported\", strings.sparseArrayNotSupported);\n                    }\n                    this._data = list;\n                    this._currentKey = list.length;\n                } else if (list) {\n                    var keyDataMap = this._keyMap;\n                    var pos = 0, i = 0;\n                    for (var len = list.length; i < len; i++) {\n                        if (i in list) {\n                            var item = list[i];\n                            if (this._binding) {\n                                item = _Data.as(item);\n                            }\n                            var key = pos.toString();\n                            pos++;\n                            keyDataMap[key] = { handle: key, key: key, data: item };\n                        }\n                    }\n                    if (pos !== i) {\n                        this._initializeKeys();\n                    }\n                    this._currentKey = pos;\n                }\n            }, {\n                _currentKey: 0,\n\n                _keys: null,\n                _keyMap: null,\n\n                _modifyingData: 0,\n\n                _initializeKeys: function () {\n                    if (this._keys) {\n                        return;\n                    }\n\n                    var keys = [];\n                    if (this._data) {\n                        // If this list is a proxy over the data then we will have been lazily initializing\n                        // the entries in the list, however the 1:1 mapping between index and key is about\n                        // to go away so this is our last chance to pull the items out of the data.\n                        //\n                        var keyMap = this._keyMap;\n                        var data = this._data;\n                        for (var i = 0, len = data.length; i < len; i++) {\n                            if (i in data) {\n                                var key = i.toString();\n                                keys[i] = key;\n                                if (!(key in keyMap)) {\n                                    var item = data[i];\n                                    if (this._binding) {\n                                        item = _Data.as(item);\n                                    }\n                                    keyMap[key] = { handle: key, key: key, data: item };\n                                }\n                            }\n                        }\n                    } else {\n                        // In the case where List owns the data we will have created the keyMap at initialization\n                        // time and can use that to harvest all the keys into the _keys list.\n                        //\n                        Object.keys(this._keyMap).forEach(function (key) {\n                            keys[key >>> 0] = key;\n                        });\n                    }\n                    this._keys = keys;\n                },\n                _lazyPopulateEntry: function (index) {\n                    if (this._data && index in this._data) {\n                        var item = this._data[index];\n                        if (this._binding) {\n                            item = _Data.as(item);\n                        }\n                        var key = index.toString();\n                        var entry = { handle: key, key: key, data: item };\n                        this._keyMap[entry.key] = entry;\n                        return entry;\n                    }\n                },\n\n                _assignKey: function () {\n                    return (++this._currentKey).toString();\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.length\" helpKeyword=\"WinJS.Binding.List.length\">Gets or sets the length of the list, which is an integer value one higher than the highest element defined in the list.</field>\n                length: {\n                    get: function () {\n                        // If we are proxying use the underlying list's length\n                        // If we have already allocated keys use that length\n                        // If we haven't allocated keys then we can use _currentKey which was set at initialization time\n                        //  to be length of the input list.\n                        if (this._data) {\n                            return this._data.length;\n                        } else if (this._keys) {\n                            return this._keys.length;\n                        } else {\n                            return this._currentKey;\n                        }\n                    },\n                    set: function (value) {\n                        if (typeof value === \"number\" && value >= 0) {\n                            this._initializeKeys();\n                            var current = this.length;\n                            if (current > value) {\n                                this.splice(value, current - value);\n                            } else {\n                                // We don't support setting lengths to longer in order to have sparse behavior\n                                value = current;\n                            }\n                            if (this._data) {\n                                this._modifyingData++;\n                                try {\n                                    this._data.length = value;\n                                } finally {\n                                    this._modifyingData--;\n                                }\n                            }\n                            if (this._keys) {\n                                this._keys.length = value;\n                            }\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.Binding.List.IllegalLength\", strings.illegalListLength);\n                        }\n                    }\n                },\n\n                getItem: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.getItem\">\n                    /// <summary locid=\"WinJS.Binding.List.getItem\">\n                    /// Gets a key/data pair for the specified list index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.getItem_p:index\">The index of value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.List.getItem_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    var entry;\n                    var key;\n                    index = asNumber(index);\n                    if (this._keys) {\n                        key = this._keys[index];\n                        entry = key && this._keyMap[key];\n                    } else {\n                        key = index.toString();\n                        entry = this._keyMap[key] || this._lazyPopulateEntry(index);\n                    }\n                    return entry;\n                },\n                getItemFromKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.getItemFromKey\">\n                    /// <summary locid=\"WinJS.Binding.List.getItemFromKey\">\n                    /// Gets a key/data pair for the list item key specified.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.List.getItemFromKey_p:key\">The key of the value to retrieve.</param>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.List.getItemFromKey_returnValue\">An object with .key and .data properties.</returns>\n                    /// </signature>\n                    var entry;\n                    // if we have a keys list we know to go through the keyMap, or if we are not\n                    // proxying through _data we also know to go through the keyMap.\n                    if (this._keys || !this._data) {\n                        entry = this._keyMap[key];\n                    } else {\n                        entry = this.getItem(key >>> 0);\n                    }\n                    return entry;\n                },\n\n                indexOfKey: function (key) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.indexOfKey\">\n                    /// <summary locid=\"WinJS.Binding.List.indexOfKey\">\n                    /// Gets the index of the first occurrence of a key in a list.\n                    /// </summary>\n                    /// <param name=\"key\" type=\"String\" locid=\"WinJS.Binding.List.indexOfKey_p:key\">The key to locate in the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.indexOfKey_returnValue\">The index of the first occurrence of a key in a list, or -1 if not found.</returns>\n                    /// </signature>\n                    var index = -1;\n                    if (this._keys) {\n                        index = this._keys.indexOf(key);\n                    } else {\n                        var t = key >>> 0;\n                        if (t < this._currentKey) {\n                            index = t;\n                        }\n                    }\n                    return index;\n                },\n\n                move: function (index, newIndex) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.move\">\n                    /// <summary locid=\"WinJS.Binding.List.move\">\n                    /// Moves the value at index to the specified position.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.move_p:index\">The original index of the value.</param>\n                    /// <param name=\"newIndex\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.move_p:newIndex\">The index of the value after the move.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    newIndex = asNumber(newIndex);\n                    this._initializeKeys();\n                    if (index === newIndex || index < 0 || newIndex < 0 || index >= this.length || newIndex >= this.length) {\n                        return;\n                    }\n                    if (this._data) {\n                        this._modifyingData++;\n                        try {\n                            var item = this._data.splice(index, 1)[0];\n                            this._data.splice(newIndex, 0, item);\n                        } finally {\n                            this._modifyingData--;\n                        }\n                    }\n                    var key = this._keys.splice(index, 1)[0];\n                    this._keys.splice(newIndex, 0, key);\n                    this._notifyItemMoved(key, index, newIndex, this.getItemFromKey(key).data);\n                },\n\n                notifyMutated: function (index) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.notifyMutated\">\n                    /// <summary locid=\"WinJS.Binding.List.notifyMutated\">\n                    /// Forces the list to send a itemmutated notification to any listeners for the value at the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.notifyMutated_p:index\">The index of the value that was mutated.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    var key = this._keys ? this._keys[index] : index.toString();\n                    this._notifyMutatedFromKey(key);\n                },\n\n                setAt: function (index, newValue) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.setAt\">\n                    /// <summary locid=\"WinJS.Binding.List.setAt\">\n                    /// Replaces the value at the specified index with a new value.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.setAt_p:index\">The index of the value that was replaced.</param>\n                    /// <param name=\"newValue\" type=\"Object\" locid=\"WinJS.Binding.List.setAt_p:newValue\">The new value.</param>\n                    /// </signature>\n                    index = asNumber(index);\n                    this._initializeKeys();\n                    var length = this.length;\n                    if (index === length) {\n                        this.push(newValue);\n                    } else if (index < length) {\n                        if (this._data) {\n                            this._modifyingData++;\n                            try {\n                                this._data[index] = newValue;\n                            } finally {\n                                this._modifyingData--;\n                            }\n                        }\n                        if (this._binding) {\n                            newValue = _Data.as(newValue);\n                        }\n                        if (index in this._keys) {\n                            var key = this._keys[index];\n                            var oldEntry = this._keyMap[key];\n                            var newEntry = cloneItem(oldEntry);\n                            newEntry.data = newValue;\n                            this._keyMap[key] = newEntry;\n                            this._notifyItemChanged(key, index, oldEntry.data, newValue, oldEntry, newEntry);\n                        }\n                    }\n                },\n\n                _setAtKey: function (key, newValue) {\n                    this.setAt(this.indexOfKey(key), newValue);\n                },\n\n                // These are the traditional Array mutators, they don't result in projections. In particular\n                //  having both sort and sorted is a bit confusing. It may be the case that we want to eliminate\n                //  the various array helpers outside of the standard push/pop,shift/unshift,splice,get*,setAt\n                //  and then offer up the specific projections: filter, sorted, grouped. Anything else can be\n                //  obtained through _getArray().\n                //\n                reverse: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.reverse\">\n                    /// <summary locid=\"WinJS.Binding.List.reverse\">\n                    /// Returns a list with the elements reversed. This method reverses the elements of a list object in place. It does not create a new list object during execution.\n                    /// </summary>\n                    /// <returns type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.List.reverse_returnValue\">The reversed list.</returns>\n                    /// </signature>\n                    this._initializeKeys();\n                    if (this._data) {\n                        this._modifyingData++;\n                        try {\n                            this._data.reverse();\n                        } finally {\n                            this._modifyingData--;\n                        }\n                    }\n                    this._keys.reverse();\n                    this._notifyReload();\n                    return this;\n                },\n                sort: function (sortFunction) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.sort\">\n                    /// <summary locid=\"WinJS.Binding.List.sort\">\n                    /// Returns a list with the elements sorted. This method sorts the elements of a list object in place. It does not create a new list object during execution.\n                    /// </summary>\n                    /// <param name=\"sortFunction\" type=\"Function\" locid=\"WinJS.Binding.List.sort_p:sortFunction\">The function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.</param>\n                    /// <returns type=\"WinJS.Binding.List\" locid=\"WinJS.Binding.List.sort_returnValue\">The sorted list.</returns>\n                    /// </signature>\n                    this._initializeKeys();\n                    if (this._data) {\n                        this._modifyingData++;\n                        try {\n                            this._data.sort(sortFunction);\n                        } finally {\n                            this._modifyingData--;\n                        }\n                    }\n                    var that = this;\n                    this._keys.sort(function (l, r) {\n                        l = that._keyMap[l];\n                        r = that._keyMap[r];\n                        if (sortFunction) {\n                            return sortFunction(l.data, r.data);\n                        }\n                        l = (l && l.data || \"\").toString();\n                        r = (l && r.data || \"\").toString();\n                        return l < r ? -1 : l === r ? 0 : 1;\n                    });\n                    this._notifyReload();\n                    return this;\n                },\n\n                pop: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.pop\">\n                    /// <summary locid=\"WinJS.Binding.List.pop\">\n                    /// Removes the last element from a list and returns it.\n                    /// </summary>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.List.pop_returnValue\">Last element from the list.</returns>\n                    /// </signature>\n                    if (this.length === 0) {\n                        return;\n                    }\n                    this._initializeKeys();\n                    var key = this._keys.pop();\n                    var entry = this._keyMap[key];\n                    var data = entry && entry.data;\n                    if (this._data) {\n                        this._modifyingData++;\n                        try {\n                            this._data.pop();\n                        } finally {\n                            this._modifyingData--;\n                        }\n                    }\n                    delete this._keyMap[key];\n                    this._notifyItemRemoved(key, this._keys.length, data, entry);\n                    return data;\n                },\n\n                push: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.push\">\n                    /// <summary locid=\"WinJS.Binding.List.push\">\n                    /// Appends new element(s) to a list, and returns the new length of the list.\n                    /// </summary>\n                    /// <param name=\"value\" type=\"Object\" parameterArray=\"true\" locid=\"WinJS.Binding.List.push_p:value\">The element to insert at the end of the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.push_returnValue\">The new length of the list.</returns>\n                    /// </signature>\n                    this._initializeKeys();\n                    var length = arguments.length;\n                    for (var i = 0; i < length; i++) {\n                        var item = arguments[i];\n                        if (this._binding) {\n                            item = _Data.as(item);\n                        }\n                        var key = this._assignKey();\n                        this._keys.push(key);\n                        if (this._data) {\n                            this._modifyingData++;\n                            try {\n                                this._data.push(arguments[i]);\n                            } finally {\n                                this._modifyingData--;\n                            }\n                        }\n                        this._keyMap[key] = { handle: key, key: key, data: item };\n                        this._notifyItemInserted(key, this._keys.length - 1, item);\n                    }\n                    return this.length;\n                },\n\n                shift: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.shift\">\n                    /// <summary locid=\"WinJS.Binding.List.shift\">\n                    /// Removes the first element from a list and returns it.\n                    /// </summary>\n                    /// <returns type=\"Object\" locid=\"WinJS.Binding.List.shift_returnValue\">First element from the list.</returns>\n                    /// </signature>\n                    if (this.length === 0) {\n                        return;\n                    }\n\n                    this._initializeKeys();\n                    var key = this._keys.shift();\n                    var entry = this._keyMap[key];\n                    var data = entry && entry.data;\n                    if (this._data) {\n                        this._modifyingData++;\n                        try {\n                            this._data.shift();\n                        } finally {\n                            this._modifyingData--;\n                        }\n                    }\n                    delete this._keyMap[key];\n                    this._notifyItemRemoved(key, 0, data, entry);\n                    return data;\n                },\n\n                unshift: function () {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.unshift\">\n                    /// <summary locid=\"WinJS.Binding.List.unshift\">\n                    /// Appends new element(s) to a list, and returns the new length of the list.\n                    /// </summary>\n                    /// <param name=\"value\" type=\"Object\" parameterArray=\"true\" locid=\"WinJS.Binding.List.unshift_p:value\">The element to insert at the start of the list.</param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.unshift_returnValue\">The new length of the list.</returns>\n                    /// </signature>\n                    this._initializeKeys();\n                    var length = arguments.length;\n                    for (var i = length - 1; i >= 0; i--) {\n                        var item = arguments[i];\n                        if (this._binding) {\n                            item = _Data.as(item);\n                        }\n                        var key = this._assignKey();\n                        this._keys.unshift(key);\n                        if (this._data) {\n                            this._modifyingData++;\n                            try {\n                                this._data.unshift(arguments[i]);\n                            } finally {\n                                this._modifyingData--;\n                            }\n                        }\n                        this._keyMap[key] = { handle: key, key: key, data: item };\n                        this._notifyItemInserted(key, 0, item);\n                    }\n                    return this.length;\n                },\n\n                splice: function (index, howMany, item) {\n                    /// <signature helpKeyword=\"WinJS.Binding.List.splice\">\n                    /// <summary locid=\"WinJS.Binding.List.splice\">\n                    /// Removes elements from a list and, if necessary, inserts new elements in their place, returning the deleted elements.\n                    /// </summary>\n                    /// <param name=\"start\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.splice_p:start\">The zero-based location in the list from which to start removing elements.</param>\n                    /// <param name=\"howMany\" type=\"Number\" integer=\"true\" locid=\"WinJS.Binding.List.splice_p:howMany\">The number of elements to remove.</param>\n                    /// <param name=\"item\" type=\"Object\" optional=\"true\" parameterArray=\"true\" locid=\"WinJS.Binding.List.splice_p:item\">The elements to insert into the list in place of the deleted elements.</param>\n                    /// <returns type=\"Array\" locid=\"WinJS.Binding.List.splice_returnValue\">The deleted elements.</returns>\n                    /// </signature>\n                    index = asNumber(index);\n                    this._initializeKeys();\n                    index = Math.max(0, this._normalizeIndex(index));\n                    howMany = Math.max(0, Math.min(howMany || 0, this.length - index));\n                    var result = [];\n                    while (howMany) {\n                        var key = this._keys[index];\n                        var entry = this._keyMap[key];\n                        var data = entry && entry.data;\n                        result.push(data);\n                        this._keys.splice(index, 1);\n                        if (this._data) {\n                            this._modifyingData++;\n                            try {\n                                this._data.splice(index, 1);\n                            } finally {\n                                this._modifyingData--;\n                            }\n                        }\n                        delete this._keyMap[key];\n                        this._notifyItemRemoved(key, index, data, entry);\n                        --howMany;\n                    }\n                    if (arguments.length > 2) {\n                        for (var i = 2, len = arguments.length; i < len; i++) {\n                            var additionalItem = arguments[i];\n                            if (this._binding) {\n                                additionalItem = _Data.as(additionalItem);\n                            }\n                            var pos = Math.min(index + i - 2, this.length);\n                            var newKey = this._assignKey();\n                            this._keys.splice(pos, 0, newKey);\n                            if (this._data) {\n                                this._modifyingData++;\n                                try {\n                                    this._data.splice(pos, 0, arguments[i]);\n                                } finally {\n                                    this._modifyingData--;\n                                }\n                            }\n                            this._keyMap[newKey] = { handle: newKey, key: newKey, data: additionalItem };\n                            this._notifyItemInserted(newKey, pos, additionalItem);\n                        }\n                    }\n                    return result;\n                },\n                // returns [ data* ] of removed items\n                _spliceFromKey: function (key) {\n                    this._initializeKeys();\n                    var args = copyargs(arguments);\n                    args[0] = this._keys.indexOf(key);\n                    return this.splice.apply(this, args);\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Res',[\n    'exports',\n    './Core/_Global',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './Core/_ErrorFromName',\n    './Core/_Resources',\n    './ControlProcessor/_OptionsParser',\n    './Promise'\n    ], function resInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _OptionsParser, Promise) {\n    \"use strict\";\n\n    var readyComplete = false;\n\n    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n\n    function processAllImpl(rootElement, count) {\n        rootElement = rootElement || _Global.document.body;\n\n        var count = count || 0;\n\n        if (count < 4) {\n            // Only 3 depth is supported in the innerHTML\n            if (count === 0) {\n                if (rootElement.getAttribute) {\n                    // Fragment-loaded root element isn't caught by querySelectorAll\n                    var rootElementNode = rootElement.getAttribute('data-win-res');\n                    if (rootElementNode) {\n                        var decls = _OptionsParser.optionsParser(rootElementNode);\n                        setMembers(rootElement, rootElement, decls, count);\n                    }\n                }\n            }\n\n            var selector = \"[data-win-res],[data-win-control]\";\n            var elements = rootElement.querySelectorAll(selector);\n            if (elements.length === 0) {\n                return Promise.as(rootElement);\n            }\n\n            for (var i = 0, len = elements.length; i < len; i++) {\n                var e = elements[i];\n\n                if (e.winControl && e.winControl.constructor && e.winControl.constructor.isDeclarativeControlContainer) {\n                    var idcc = e.winControl.constructor.isDeclarativeControlContainer;\n                    if (typeof idcc === \"function\") {\n                        idcc = requireSupportedForProcessing(idcc);\n                        idcc(e.winControl, processAll);\n\n                        // Skip all children of declarative control container\n                        i += e.querySelectorAll(selector).length;\n                    }\n                }\n\n                if (!e.hasAttribute(\"data-win-res\")) {\n                    continue;\n                }\n                // Use optionsParser that accept string format\n                // {name=\"value\", name2=\"value2\"}\n                var decls = _OptionsParser.optionsParser(e.getAttribute('data-win-res'));\n                setMembers(e, e, decls, count);\n            }\n\n        } else if (_BaseUtils.validation) {\n            throw new _ErrorFromName(\"WinJS.Res.NestingExceeded\", \"NestingExceeded\");\n        }\n\n        return Promise.as(rootElement);\n    }\n\n    function setAttributes(root, descriptor) {\n        var names = Object.keys(descriptor);\n\n        for (var k = 0, l = names.length ; k < l; k++) {\n            var name = names[k];\n            var value = descriptor[name];\n\n            var data = _Resources.getString(value);\n\n            if (!data || !data.empty) {\n                root.setAttribute(name, data.value);\n\n                if ((data.lang !== undefined) &&\n                    (root.lang !== undefined) &&\n                    (root.lang !== data.lang)) {\n\n                        root.lang = data.lang;\n                    }\n            } else if (_BaseUtils.validation) {\n                notFound(value);\n            }\n        }\n    }\n\n    function notFound(name) {\n        throw new _ErrorFromName(\"WinJS.Res.NotFound\", _Resources._formatString(\"NotFound: {0}\", name));\n    }\n\n    function setMembers(root, target, descriptor, count) {\n        var names = Object.keys(descriptor);\n        target = requireSupportedForProcessing(target);\n\n        for (var k = 0, l = names.length ; k < l; k++) {\n            var name = names[k];\n            var value = descriptor[name];\n\n            if (typeof value === \"string\") {\n                var data = _Resources.getString(value);\n\n                if (!data || !data.empty) {\n                    target[name] = data.value;\n\n                    if ((data.lang !== undefined) &&\n                        (root.lang !== undefined) &&\n                        (root.lang !== data.lang)) {\n                        // When lang property is different, we set the language with selected string's language\n                            root.lang = data.lang;\n                        }\n\n                    if (name === \"innerHTML\") {\n                        processAllImpl(target, count + 1);\n                    }\n                } else if (_BaseUtils.validation) {\n                    notFound(value);\n                }\n            } else if (root === target && name === \"attributes\") {\n                //Exposing setAttribute for attributes that don't have HTML properties, like aria, through a fake 'attributes' property\n                setAttributes(root, value);\n            } else {\n                setMembers(root, target[name], value, count);\n            }\n        }\n    }\n\n    function processAll(rootElement) {\n            /// <signature helpKeyword=\"WinJS.Resources.processAll\">\n            /// <summary locid=\"WinJS.Resources.processAll\">\n            /// Processes resources tag and replaces strings\n            /// with localized strings.\n            /// </summary>\n            /// <param name=\"rootElement\" locid=\"WinJS.Resources.processAll_p:rootElement\">\n            /// The DOM element at which to start processing. processAll processes the element and its child elements.\n            /// If you don't specify root element, processAll processes the entire document.\n            /// </param>\n            /// </signature>\n\n            if (!readyComplete) {\n                return _BaseUtils.ready().then(function () {\n                    readyComplete = true;\n                    return processAllImpl(rootElement);\n                });\n            } else {\n                try {\n                    return processAllImpl(rootElement);\n                }\n                catch (e) {\n                    return Promise.wrapError(e);\n                }\n            }\n        }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.Resources\", {\n        processAll: processAll\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Pages/_BasePage',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities'\n    ], function pagesInit(exports, _Global, _Base, _BaseUtils, _WriteProfilerMark, Promise, _Control, _Dispose, _ElementUtilities) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    function abs(uri) {\n        var a = _Global.document.createElement(\"a\");\n        a.href = uri;\n        return a.href;\n    }\n    var viewMap = {};\n\n    function selfhost(uri) {\n        return _Global.document.location.href.toLowerCase() === uri.toLowerCase();\n    }\n\n    var _mixin = {\n        dispose: function () {\n            /// <signature helpKeyword=\"WinJS.UI.Pages.dispose\">\n            /// <summary locid=\"WinJS.UI.Pages.dispose\">\n            /// Disposes this Page.\n            /// </summary>\n            /// </signature>\n            if (this._disposed) {\n                return;\n            }\n\n            this._disposed = true;\n            _Dispose.disposeSubTree(this.element);\n            this.element = null;\n        },\n        load: function (uri) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.load\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.load\">\n            /// Creates a copy of the DOM elements from the specified URI.  In order for this override\n            /// to be used, the page that contains the load override needs to be defined by calling\n            /// WinJS.UI.Pages.define() before WinJS.UI.Pages.render() is called.\n            /// </summary>\n            /// <param name=\"uri\" locid=\"WinJS.UI.Pages._mixin.load_p:uri\">\n            /// The URI from which to copy the DOM elements.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.load_returnValue\">\n            /// A promise whose fulfilled value is the set of unparented DOM elements, if asynchronous processing is necessary. If not, returns nothing.\n            /// </returns>\n            /// </signature>\n        },\n        init: function (element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.init\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.init\">\n            /// Initializes the control before the content of the control is set.\n            /// Use the processed method for any initialization that should be done after the content\n            /// of the control has been set.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.init_p:element\">\n            /// The DOM element that will contain all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.init_p:options\">\n            /// The options passed to the constructor of the page.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.init_returnValue\">\n            /// A promise that is fulfilled when initialization is complete, if asynchronous processing is necessary. If not, returns nothing.\n            /// </returns>\n            /// </signature>\n        },\n        process: function (element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.process\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.process\">\n            /// Processes the unparented DOM elements returned by load.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.process_p:element\">\n            /// The DOM element that will contain all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.process_p:options\">\n            /// The options that are to be passed to the constructor of the page.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.process_returnValue\">\n            /// A promise that is fulfilled when processing is complete.\n            /// </returns>\n            /// </signature>\n        },\n        processed: function (element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.processed\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.processed\">\n            /// Initializes the control after the content of the control is set.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.processed_p:element\">\n            /// The DOM element that will contain all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.processed_p:options\">\n            /// The options that are to be passed to the constructor of the page.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.processed_returnValue\">\n            /// A promise that is fulfilled when initialization is complete, if asynchronous processing is necessary. If not, returns nothing.\n            /// </returns>\n            /// </signature>\n        },\n        render: function (element, options, loadResult) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.render\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.render\">\n            /// Renders the control, typically by adding the elements specified in the loadResult parameter to the specified element.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.render_p:element\">\n            /// The DOM element that will contain all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.render_p:options\">\n            /// The options passed into the constructor of the page.\n            /// </param>\n            /// <param name=\"loadResult\" locid=\"WinJS.UI.Pages._mixin.render_p:loadResult\">\n            /// The elements returned from the load method.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.render_returnValue\">\n            /// A promise that is fulfilled when rendering is complete, if asynchronous processing is necessary. If not, returns nothing.\n            /// </returns>\n            /// </signature>\n        },\n        ready: function (element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.ready\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.ready\">\n            /// Called after all initialization and rendering is complete. At this\n            /// time the element is ready for use.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.ready_p:element\">\n            /// The DOM element that contains all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.ready_p:options\">\n            /// The options passed into the constructor of the page\n            /// </param>\n            /// </signature>\n        },\n        error: function (err) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.error\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.error\">\n            /// Called if any error occurs during the processing of the page.\n            /// </summary>\n            /// <param name=\"err\" locid=\"WinJS.UI.Pages._mixin.error_p:err\">\n            /// The error that occurred.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.error_returnValue\">\n            /// Nothing if the error was handled, or an error promise if the error was not handled.\n            /// </returns>\n            /// </signature>\n            return Promise.wrapError(err);\n        }\n    };\n\n    function Pages_define(uri, members) {\n        /// <signature helpKeyword=\"WinJS.UI.Pages.define\">\n        /// <summary locid=\"WinJS.UI.Pages.define\">\n        /// Creates a new page control from the specified URI that contains the specified members.\n        /// Multiple calls to this method for the same URI are allowed, and all members will be\n        /// merged.\n        /// </summary>\n        /// <param name=\"uri\" locid=\"WinJS.UI.Pages.define_p:uri\">\n        /// The URI for the content that defines the page.\n        /// </param>\n        /// <param name=\"members\" locid=\"WinJS.UI.Pages.define_p:members\">\n        /// Additional members that the control will have.\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.UI.Pages.define_returnValue\">\n        /// A constructor function that creates the page.\n        /// </returns>\n        /// </signature>\n\n        var base = get(uri);\n        uri = abs(uri);\n\n        if (!base) {\n            base = _Base.Class.define(\n                // This needs to follow the WinJS.UI.processAll \"async constructor\"\n                // pattern to interop nicely in the \"Views.Control\" use case.\n                //\n                function PageControl_ctor(element, options, complete, parentedPromise) {\n                    var that = this;\n                    this._disposed = false;\n                    this.element = element = element || _Global.document.createElement(\"div\");\n                    _ElementUtilities.addClass(element, \"win-disposable\");\n                    element.msSourceLocation = uri;\n                    this.uri = uri;\n                    this.selfhost = selfhost(uri);\n                    element.winControl = this;\n                    _ElementUtilities.addClass(element, \"pagecontrol\");\n\n                    var profilerMarkIdentifier = \" uri='\" + uri + \"'\" + _BaseUtils._getProfilerMarkIdentifier(this.element);\n\n                    _WriteProfilerMark(\"WinJS.UI.Pages:createPage\" + profilerMarkIdentifier + \",StartTM\");\n\n                    var load = Promise.wrap().\n                        then(function Pages_load() { return that.load(uri); });\n\n                    var renderCalled = load.then(function Pages_init(loadResult) {\n                        return Promise.join({\n                            loadResult: loadResult,\n                            initResult: that.init(element, options)\n                        });\n                    }).then(function Pages_render(result) {\n                        return that.render(element, options, result.loadResult);\n                    });\n\n                    this.elementReady = renderCalled.then(function () { return element; });\n\n                    this.renderComplete = renderCalled.\n                        then(function Pages_process() {\n                            return that.process(element, options);\n                        }).then(function Pages_processed() {\n                            return that.processed(element, options);\n                        }).then(function () {\n                            return that;\n                        });\n\n                    var callComplete = function () {\n                        complete && complete(that);\n                        _WriteProfilerMark(\"WinJS.UI.Pages:createPage\" + profilerMarkIdentifier + \",StopTM\");\n                    };\n\n                    // promises guarantee order, so this will be called prior to ready path below\n                    //\n                    this.renderComplete.then(callComplete, callComplete);\n\n                    this.readyComplete = this.renderComplete.then(function () {\n                        return parentedPromise;\n                    }).then(function Pages_ready() {\n                        that.ready(element, options);\n                        return that;\n                    }).then(\n                        null,\n                        function Pages_error(err) {\n                            return that.error(err);\n                        }\n                    );\n                },\n                _mixin\n            );\n            base = _Base.Class.mix(base, _Control.DOMEventMixin);\n            viewMap[uri.toLowerCase()] = base;\n        }\n\n        // Lazily mix in the members, allowing for multiple definitions of \"define\" to augment\n        // the shared definition of the member.\n        //\n        if (members) {\n            base = _Base.Class.mix(base, members);\n        }\n\n        base.selfhost = selfhost(uri);\n\n        return base;\n    }\n\n    function get(uri) {\n        uri = abs(uri);\n        return viewMap[uri.toLowerCase()];\n    }\n\n    function remove(uri) {\n        uri = abs(uri);\n        delete viewMap[uri.toLowerCase()];\n    }\n\n    _Base.Namespace._moduleDefine(exports, null, {\n        abs: abs,\n        define: Pages_define,\n        get: get,\n        remove: remove,\n        viewMap: viewMap\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Pages',[\n    'exports',\n    './Core/_Global',\n    './Core/_Base',\n    './Core/_BaseUtils',\n    './ControlProcessor',\n    './Fragments',\n    './Pages/_BasePage',\n    './Promise',\n    ], function pagesInit(exports, _Global, _Base, _BaseUtils, ControlProcessor, Fragments, _BasePage, Promise) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    var _mixin = {\n        load: function (uri) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.load\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.load\">\n            /// Creates a copy of the DOM elements from the specified URI.  In order for this override\n            /// to be used, the page that contains the load override needs to be defined by calling\n            /// WinJS.UI.Pages.define() before WinJS.UI.Pages.render() is called.\n            /// </summary>\n            /// <param name=\"uri\" locid=\"WinJS.UI.Pages._mixin.load_p:uri\">\n            /// The URI from which to copy the DOM elements.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.load_returnValue\">\n            /// A promise whose fulfilled value is the set of unparented DOM elements, if asynchronous processing is necessary. If not, returns nothing.\n            /// </returns>\n            /// </signature>\n            if (!this.selfhost) {\n                return Fragments.renderCopy(_BasePage.abs(uri));\n            }\n        },\n        process: function (element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.process\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.process\">\n            /// Processes the unparented DOM elements returned by load.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.process_p:element\">\n            /// The DOM element that will contain all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.process_p:options\">\n            /// The options that are to be passed to the constructor of the page.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.process_returnValue\">\n            /// A promise that is fulfilled when processing is complete.\n            /// </returns>\n            /// </signature>\n            return ControlProcessor.processAll(element);\n        },\n        render: function (element, options, loadResult) {\n            /// <signature helpKeyword=\"WinJS.UI.Pages._mixin.render\">\n            /// <summary locid=\"WinJS.UI.Pages._mixin.render\">\n            /// Renders the control, typically by adding the elements specified in the loadResult parameter to the specified element.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.Pages._mixin.render_p:element\">\n            /// The DOM element that will contain all the content for the page.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.Pages._mixin.render_p:options\">\n            /// The options passed into the constructor of the page.\n            /// </param>\n            /// <param name=\"loadResult\" locid=\"WinJS.UI.Pages._mixin.render_p:loadResult\">\n            /// The elements returned from the load method.\n            /// </param>\n            /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages._mixin.render_returnValue\">\n            /// A promise that is fulfilled when rendering is complete, if asynchronous processing is necessary. If not, returns nothing.\n            /// </returns>\n            /// </signature>\n            if (!this.selfhost) {\n                element.appendChild(loadResult);\n            }\n            return element;\n        }\n    };\n\n    function Pages_define(uri, members) {\n        /// <signature helpKeyword=\"WinJS.UI.Pages.define\">\n        /// <summary locid=\"WinJS.UI.Pages.define\">\n        /// Creates a new page control from the specified URI that contains the specified members.\n        /// Multiple calls to this method for the same URI are allowed, and all members will be\n        /// merged.\n        /// </summary>\n        /// <param name=\"uri\" locid=\"WinJS.UI.Pages.define_p:uri\">\n        /// The URI for the content that defines the page.\n        /// </param>\n        /// <param name=\"members\" locid=\"WinJS.UI.Pages.define_p:members\">\n        /// Additional members that the control will have.\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.UI.Pages.define_returnValue\">\n        /// A constructor function that creates the page.\n        /// </returns>\n        /// </signature>\n\n        var Page = _BasePage.get(uri);\n\n        if (!Page) {\n            Page = _BasePage.define(uri, _mixin);\n        }\n\n        if (members) {\n            Page = _Base.Class.mix(Page, members);\n        }\n\n        if (Page.selfhost) {\n            _BaseUtils.ready(function () {\n                render(_BasePage.abs(uri), _Global.document.body);\n            }, true);\n        }\n\n        return Page;\n    }\n\n    function get(uri) {\n        /// <signature helpKeyword=\"WinJS.UI.Pages.get\">\n        /// <summary locid=\"WinJS.UI.Pages.get\">\n        /// Gets an already-defined page control for the specified URI, or creates a new one.\n        /// </summary>\n        /// <param name=\"uri\" locid=\"WinJS.UI.Pages.get_p:uri\">\n        /// The URI for the content that defines the page.\n        /// </param>\n        /// <returns type=\"Function\" locid=\"WinJS.UI.Pages.get_returnValue\">\n        /// A constructor function that creates the page.\n        /// </returns>\n        /// </signature>\n\n        var ctor = _BasePage.get(uri);\n        if (!ctor) {\n            ctor = Pages_define(uri);\n        }\n        return ctor;\n    }\n\n    function _remove(uri) {\n        Fragments.clearCache(_BasePage.abs(uri));\n        _BasePage.remove(uri);\n    }\n\n    function render(uri, element, options, parentedPromise) {\n        /// <signature helpKeyword=\"WinJS.UI.Pages.render\">\n        /// <summary locid=\"WinJS.UI.Pages.render\">\n        /// Creates a page control from the specified URI inside\n        /// the specified element with the specified options.\n        /// </summary>\n        /// <param name=\"uri\" locid=\"WinJS.UI.Pages.render_p:uri\">\n        /// The URI for the content that defines the page.\n        /// </param>\n        /// <param name=\"element\" isOptional=\"true\" locid=\"WinJS.UI.Pages.render_p:element\">\n        /// The element to populate with the page.\n        /// </param>\n        /// <param name=\"options\" isOptional=\"true\" locid=\"WinJS.UI.Pages.render_p:options\">\n        /// The options for configuring the page.\n        /// </param>\n        /// <param name=\"parentedPromise\" isOptional=\"true\" locid=\"WinJS.UI.Pages.render_p:parentedPromise\">\n        /// A promise that is fulfilled when the specified element is parented to the final document.\n        /// </param>\n        /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.Pages.render_returnValue\">\n        /// A promise that is fulfilled when the page is done rendering\n        /// </returns>\n        /// </signature>\n        var Ctor = get(uri);\n        var control = new Ctor(element, options, null, parentedPromise);\n        return control.renderComplete.then(null, function (err) {\n            return Promise.wrapError({\n                error: err,\n                page: control\n            });\n        });\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI.Pages\", {\n        define: Pages_define,\n        get: get,\n        _remove: _remove,\n        render: render,\n        _viewMap: _BasePage.viewMap\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/HtmlControl',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Pages'\n    ], function htmlControlInit(exports, _Global, _Base, Pages) {\n    \"use strict\";\n\n    // not supported in WebWorker\n    if (!_Global.document) {\n        return;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.HtmlControl\">\n        /// Enables you to include an HTML page dynamically.\n        /// </summary>\n        /// </field>\n        /// <name locid=\"WinJS.UI.HtmlControl_name\">HtmlControl</name>\n        /// <icon src=\"base_winjs.ui.htmlcontrol.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"base_winjs.ui.htmlcontrol.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.HtmlControl\" data-win-options=\"{ uri: 'somePage.html' }\"></div>]]></htmlSnippet>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        HtmlControl: _Base.Class.define(function HtmlControl_ctor(element, options, complete) {\n            /// <signature helpKeyword=\"WinJS.UI.HtmlControl.HtmlControl\">\n            /// <summary locid=\"WinJS.UI.HtmlControl.constructor\">\n            /// Initializes a new instance of HtmlControl to define a new page control.\n            /// </summary>\n            /// <param name=\"element\" locid=\"WinJS.UI.HtmlControl.constructor_p:element\">\n            /// The element that hosts the HtmlControl.\n            /// </param>\n            /// <param name=\"options\" locid=\"WinJS.UI.HtmlControl.constructor_p:options\">\n            /// The options for configuring the page. The uri option is required in order to specify the source\n            /// document for the content of the page.\n            /// </param>\n            /// </signature>\n            Pages.render(options.uri, element, options).\n                then(complete, function () { complete(); });\n        })\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('base',[\n    'WinJS/Core/_WinJS',\n    'WinJS/Core',\n    'WinJS/Promise',\n    'WinJS/_Signal',\n    'WinJS/Scheduler',\n    'WinJS/Utilities',\n    'WinJS/XYFocus',\n    'WinJS/Fragments',\n    'WinJS/Application',\n    'WinJS/Navigation',\n    'WinJS/Animations',\n    'WinJS/Binding',\n    'WinJS/BindingTemplate',\n    'WinJS/BindingList',\n    'WinJS/Res',\n    'WinJS/Pages',\n    'WinJS/ControlProcessor',\n    'WinJS/Controls/HtmlControl',\n    ], function (_WinJS) {\n    \"use strict\";\n\n    _WinJS.Namespace.define(\"WinJS.Utilities\", {\n        _require: require,\n        _define: define\n    });\n\n    return _WinJS;\n});\n\n        require(['WinJS/Core/_WinJS', 'base'], function (_WinJS) {\n            // WinJS always publishes itself to global\n            globalObject.WinJS = _WinJS;\n            if (typeof module !== 'undefined') {\n                // This is a CommonJS context so publish to exports\n                module.exports = _WinJS;\n            }\n        });\n        return globalObject.WinJS;\n    }));\n}());\n\n"
  },
  {
    "path": "templates/winjs/template/source/lib/winjs-4.0.1/js/ui.js",
    "content": "﻿\n/*! Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */\n(function () {\n\n    var globalObject = \n        typeof window !== 'undefined' ? window :\n        typeof self !== 'undefined' ? self :\n        typeof global !== 'undefined' ? global :\n        {};\n    (function (factory) {\n        if (typeof define === 'function' && define.amd) {\n            // amd\n            define([\"./base\"], factory);\n        } else {\n            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.0 4.0.1.winjs.2015.6.10 ui.js,StartTM');\n            if (typeof module !== 'undefined') {\n                // CommonJS\n                factory(require(\"./base\"));\n            } else {\n                // No module system\n                factory(globalObject.WinJS);\n            }\n            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.0 4.0.1.winjs.2015.6.10 ui.js,StopTM');\n        }\n    }(function (WinJS) {\n\n\nvar require = WinJS.Utilities._require;\nvar define = WinJS.Utilities._define;\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Virtualized Data Source\ndefine('WinJS/VirtualizedDataSource/_VirtualizedDataSourceImpl',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../Scheduler',\n    '../_Signal',\n    '../Utilities/_UI'\n    ], function listDataSourceInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Promise, Scheduler, _Signal, _UI) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n\n        VirtualizedDataSource: _Base.Namespace._lazy(function () {\n            var MAX_BEGINREFRESH_COUNT = 100;\n            var uniqueID = 1;\n\n            var DataSourceStatus = _UI.DataSourceStatus,\n            CountResult = _UI.CountResult,\n            FetchError = _UI.FetchError,\n            EditError = _UI.EditError;\n\n            // Private statics\n\n            var strings = {\n                get listDataAdapterIsInvalid() { return \"Invalid argument: listDataAdapter must be an object or an array.\"; },\n                get indexIsInvalid() { return \"Invalid argument: index must be a non-negative integer.\"; },\n                get keyIsInvalid() { return \"Invalid argument: key must be a string.\"; },\n                get invalidItemReturned() { return \"Error: data adapter returned item that is not an object.\"; },\n                get invalidKeyReturned() { return \"Error: data adapter returned item with undefined or null key.\"; },\n                get invalidIndexReturned() { return \"Error: data adapter should return undefined, null or a non-negative integer for the index.\"; },\n                get invalidCountReturned() { return \"Error: data adapter should return undefined, null, CountResult.unknown, or a non-negative integer for the count.\"; },\n                get invalidRequestedCountReturned() { return \"Error: data adapter should return CountResult.unknown, CountResult.failure, or a non-negative integer for the count.\"; },\n                get refreshCycleIdentified() { return \"refresh cycle found, likely data inconsistency\"; },\n            };\n\n            var statusChangedEvent = \"statuschanged\";\n\n            function _baseDataSourceConstructor(listDataAdapter, options) {\n                /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor\">\n                /// <summary locid=\"WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor\">\n                /// Initializes the VirtualizedDataSource base class of a custom data source.\n                /// </summary>\n                /// <param name=\"listDataAdapter\" type=\"IListDataAdapter\" locid=\"WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor_p:itemIndex\">\n                /// An object that implements IListDataAdapter and supplies data to the VirtualizedDataSource.\n                /// </param>\n                /// <param name=\"options\" optional=\"true\" type=\"Object\" locid=\"WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor_p:options\">\n                /// An object that contains properties that specify additonal options for the VirtualizedDataSource:\n                ///\n                /// cacheSize\n                /// A Number that specifies minimum number of unrequested items to cache in case they are requested.\n                ///\n                /// The options parameter is optional.\n                /// </param>\n                /// </signature>\n\n                // Private members\n\n                /*jshint validthis: true */\n\n                var listDataNotificationHandler,\n                    cacheSize,\n                    status,\n                    statusPending,\n                    statusChangePosted,\n                    bindingMap,\n                    nextListBindingID,\n                    nextHandle,\n                    nextListenerID,\n                    getCountPromise,\n                    resultsProcessed,\n                    beginEditsCalled,\n                    editsInProgress,\n                    firstEditInProgress,\n                    editQueue,\n                    editsQueued,\n                    synchronousEdit,\n                    waitForRefresh,\n                    dataNotificationsInProgress,\n                    countDelta,\n                    indexUpdateDeferred,\n                    nextTempKey,\n                    currentRefreshID,\n                    fetchesPosted,\n                    nextFetchID,\n                    fetchesInProgress,\n                    fetchCompleteCallbacks,\n                    startMarker,\n                    endMarker,\n                    knownCount,\n                    slotsStart,\n                    slotListEnd,\n                    slotsEnd,\n                    handleMap,\n                    keyMap,\n                    indexMap,\n                    releasedSlots,\n                    lastSlotReleased,\n                    reduceReleasedSlotCountPosted,\n                    refreshRequested,\n                    refreshInProgress,\n                    refreshSignal,\n                    refreshFetchesInProgress,\n                    refreshItemsFetched,\n                    refreshCount,\n                    refreshStart,\n                    refreshEnd,\n                    keyFetchIDs,\n                    refreshKeyMap,\n                    refreshIndexMap,\n                    deletedKeys,\n                    synchronousProgress,\n                    reentrantContinue,\n                    synchronousRefresh,\n                    reentrantRefresh;\n\n                var beginRefreshCount = 0,\n                    refreshHistory = new Array(100),\n                    refreshHistoryPos = -1;\n\n                var itemsFromKey,\n                    itemsFromIndex,\n                    itemsFromStart,\n                    itemsFromEnd,\n                    itemsFromDescription;\n\n                if (listDataAdapter.itemsFromKey) {\n                    itemsFromKey = function (fetchID, key, countBefore, countAfter, hints) {\n                        var perfID = \"fetchItemsFromKey id=\" + fetchID + \" key=\" + key + \" countBefore=\" + countBefore + \" countAfter=\" + countAfter;\n                        profilerMarkStart(perfID);\n                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: \"itemsFromKey\", key: key, countBefore: countBefore, countAfter: countAfter };\n                        var result = listDataAdapter.itemsFromKey(key, countBefore, countAfter, hints);\n                        profilerMarkEnd(perfID);\n                        return result;\n                    };\n                }\n                if (listDataAdapter.itemsFromIndex) {\n                    itemsFromIndex = function (fetchID, index, countBefore, countAfter) {\n                        var perfID = \"fetchItemsFromIndex id=\" + fetchID + \" index=\" + index + \" countBefore=\" + countBefore + \" countAfter=\" + countAfter;\n                        profilerMarkStart(perfID);\n                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: \"itemsFromIndex\", index: index, countBefore: countBefore, countAfter: countAfter };\n                        var result = listDataAdapter.itemsFromIndex(index, countBefore, countAfter);\n                        profilerMarkEnd(perfID);\n                        return result;\n                    };\n                }\n                if (listDataAdapter.itemsFromStart) {\n                    itemsFromStart = function (fetchID, count) {\n                        var perfID = \"fetchItemsFromStart id=\" + fetchID + \" count=\" + count;\n                        profilerMarkStart(perfID);\n                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: \"itemsFromStart\", count: count };\n                        var result = listDataAdapter.itemsFromStart(count);\n                        profilerMarkEnd(perfID);\n                        return result;\n                    };\n                }\n                if (listDataAdapter.itemsFromEnd) {\n                    itemsFromEnd = function (fetchID, count) {\n                        var perfID = \"fetchItemsFromEnd id=\" + fetchID + \" count=\" + count;\n                        profilerMarkStart(perfID);\n                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: \"itemsFromEnd\", count: count };\n                        var result = listDataAdapter.itemsFromEnd(count);\n                        profilerMarkEnd(perfID);\n                        return result;\n                    };\n                }\n                if (listDataAdapter.itemsFromDescription) {\n                    itemsFromDescription = function (fetchID, description, countBefore, countAfter) {\n                        var perfID = \"fetchItemsFromDescription id=\" + fetchID + \" desc=\" + description + \" countBefore=\" + countBefore + \" countAfter=\" + countAfter;\n                        profilerMarkStart(perfID);\n                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: \"itemsFromDescription\", description: description, countBefore: countBefore, countAfter: countAfter };\n                        var result = listDataAdapter.itemsFromDescription(description, countBefore, countAfter);\n                        profilerMarkEnd(perfID);\n                        return result;\n                    };\n                }\n\n                var dataSourceID = ++uniqueID;\n\n                function profilerMarkStart(text) {\n                    var message = \"WinJS.UI.VirtualizedDataSource:\" + dataSourceID + \":\" + text + \",StartTM\";\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, \"winjs vds\", \"perf\");\n                }\n                function profilerMarkEnd(text) {\n                    var message = \"WinJS.UI.VirtualizedDataSource:\" + dataSourceID + \":\" + text + \",StopTM\";\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, \"winjs vds\", \"perf\");\n                }\n\n                function isNonNegativeNumber(n) {\n                    return (typeof n === \"number\") && n >= 0;\n                }\n\n                function isNonNegativeInteger(n) {\n                    return isNonNegativeNumber(n) && n === Math.floor(n);\n                }\n\n                function validateIndexReturned(index) {\n                    // Ensure that index is always undefined or a non-negative integer\n                    if (index === null) {\n                        index = undefined;\n                    } else if (index !== undefined && !isNonNegativeInteger(index)) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidIndexReturned\", strings.invalidIndexReturned);\n                    }\n\n                    return index;\n                }\n\n                function validateCountReturned(count) {\n                    // Ensure that count is always undefined or a non-negative integer\n                    if (count === null) {\n                        count = undefined;\n                    } else if (count !== undefined && !isNonNegativeInteger(count) && count !== CountResult.unknown) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidCountReturned\", strings.invalidCountReturned);\n                    }\n\n                    return count;\n                }\n\n                // Slot List\n\n                function createSlot() {\n                    var handle = (nextHandle++).toString(),\n                        slotNew = {\n                            handle: handle,\n                            item: null,\n                            itemNew: null,\n                            fetchListeners: null,\n                            cursorCount: 0,\n                            bindingMap: null\n                        };\n\n                    // Deliberately not initialized:\n                    //   - directFetchListeners\n\n                    handleMap[handle] = slotNew;\n\n                    return slotNew;\n                }\n\n                function createPrimarySlot() {\n                    return createSlot();\n                }\n\n                function insertSlot(slot, slotNext) {\n                    slot.prev = slotNext.prev;\n                    slot.next = slotNext;\n\n                    slot.prev.next = slot;\n                    slotNext.prev = slot;\n                }\n\n                function removeSlot(slot) {\n                    if (slot.lastInSequence) {\n                        delete slot.lastInSequence;\n                        slot.prev.lastInSequence = true;\n                    }\n                    if (slot.firstInSequence) {\n                        delete slot.firstInSequence;\n                        slot.next.firstInSequence = true;\n                    }\n                    slot.prev.next = slot.next;\n                    slot.next.prev = slot.prev;\n                }\n\n                function sequenceStart(slot) {\n                    while (!slot.firstInSequence) {\n                        slot = slot.prev;\n                    }\n\n                    return slot;\n                }\n\n                function sequenceEnd(slot) {\n                    while (!slot.lastInSequence) {\n                        slot = slot.next;\n                    }\n\n                    return slot;\n                }\n\n                // Does a little careful surgery to the slot sequence from slotFirst to slotLast before slotNext\n                function moveSequenceBefore(slotNext, slotFirst, slotLast) {\n                    slotFirst.prev.next = slotLast.next;\n                    slotLast.next.prev = slotFirst.prev;\n\n                    slotFirst.prev = slotNext.prev;\n                    slotLast.next = slotNext;\n\n                    slotFirst.prev.next = slotFirst;\n                    slotNext.prev = slotLast;\n\n                    return true;\n                }\n\n                // Does a little careful surgery to the slot sequence from slotFirst to slotLast after slotPrev\n                function moveSequenceAfter(slotPrev, slotFirst, slotLast) {\n                    slotFirst.prev.next = slotLast.next;\n                    slotLast.next.prev = slotFirst.prev;\n\n                    slotFirst.prev = slotPrev;\n                    slotLast.next = slotPrev.next;\n\n                    slotPrev.next = slotFirst;\n                    slotLast.next.prev = slotLast;\n\n                    return true;\n                }\n\n                function mergeSequences(slotPrev) {\n                    delete slotPrev.lastInSequence;\n                    delete slotPrev.next.firstInSequence;\n                }\n\n                function splitSequence(slotPrev) {\n                    var slotNext = slotPrev.next;\n\n                    slotPrev.lastInSequence = true;\n                    slotNext.firstInSequence = true;\n\n                    if (slotNext === slotListEnd) {\n                        // Clear slotListEnd's index, as that's now unknown\n                        changeSlotIndex(slotListEnd, undefined);\n                    }\n                }\n\n                // Inserts a slot in the middle of a sequence or between sequences.  If the latter, mergeWithPrev and mergeWithNext\n                // parameters specify whether to merge the slot with the previous sequence, or next, or neither.\n                function insertAndMergeSlot(slot, slotNext, mergeWithPrev, mergeWithNext) {\n                    insertSlot(slot, slotNext);\n\n                    var slotPrev = slot.prev;\n\n                    if (slotPrev.lastInSequence) {\n                        if (mergeWithPrev) {\n                            delete slotPrev.lastInSequence;\n                        } else {\n                            slot.firstInSequence = true;\n                        }\n\n                        if (mergeWithNext) {\n                            delete slotNext.firstInSequence;\n                        } else {\n                            slot.lastInSequence = true;\n                        }\n                    }\n                }\n\n                // Keys and Indices\n\n                function setSlotKey(slot, key) {\n                    slot.key = key;\n\n                    // Add the slot to the keyMap, so it is possible to quickly find the slot given its key\n                    keyMap[slot.key] = slot;\n                }\n\n                function setSlotIndex(slot, index, indexMapForSlot) {\n                    // Tolerate NaN, so clients can pass (undefined - 1) or (undefined + 1)\n                    if (+index === index) {\n                        slot.index = index;\n\n                        // Add the slot to the indexMap, so it is possible to quickly find the slot given its index\n                        indexMapForSlot[index] = slot;\n\n                        if (!indexUpdateDeferred) {\n                            // See if any sequences should be merged\n                            if (slot.firstInSequence && slot.prev && slot.prev.index === index - 1) {\n                                mergeSequences(slot.prev);\n                            }\n                            if (slot.lastInSequence && slot.next && slot.next.index === index + 1) {\n                                mergeSequences(slot);\n                            }\n                        }\n                    }\n                }\n\n                // Creates a new slot and adds it to the slot list before slotNext\n                function createAndAddSlot(slotNext, indexMapForSlot) {\n                    var slotNew = (indexMapForSlot === indexMap ? createPrimarySlot() : createSlot());\n\n                    insertSlot(slotNew, slotNext);\n\n                    return slotNew;\n                }\n\n                function createSlotSequence(slotNext, index, indexMapForSlot) {\n                    var slotNew = createAndAddSlot(slotNext, indexMapForSlot);\n\n                    slotNew.firstInSequence = true;\n                    slotNew.lastInSequence = true;\n\n                    setSlotIndex(slotNew, index, indexMapForSlot);\n\n                    return slotNew;\n                }\n\n                function createPrimarySlotSequence(slotNext, index) {\n                    return createSlotSequence(slotNext, index, indexMap);\n                }\n\n                function addSlotBefore(slotNext, indexMapForSlot) {\n                    var slotNew = createAndAddSlot(slotNext, indexMapForSlot);\n                    delete slotNext.firstInSequence;\n\n                    // See if we've bumped into the previous sequence\n                    if (slotNew.prev.index === slotNew.index - 1) {\n                        delete slotNew.prev.lastInSequence;\n                    } else {\n                        slotNew.firstInSequence = true;\n                    }\n\n                    setSlotIndex(slotNew, slotNext.index - 1, indexMapForSlot);\n\n                    return slotNew;\n                }\n\n                function addSlotAfter(slotPrev, indexMapForSlot) {\n                    var slotNew = createAndAddSlot(slotPrev.next, indexMapForSlot);\n                    delete slotPrev.lastInSequence;\n\n                    // See if we've bumped into the next sequence\n                    if (slotNew.next.index === slotNew.index + 1) {\n                        delete slotNew.next.firstInSequence;\n                    } else {\n                        slotNew.lastInSequence = true;\n                    }\n\n                    setSlotIndex(slotNew, slotPrev.index + 1, indexMapForSlot);\n\n                    return slotNew;\n                }\n\n                function reinsertSlot(slot, slotNext, mergeWithPrev, mergeWithNext) {\n                    insertAndMergeSlot(slot, slotNext, mergeWithPrev, mergeWithNext);\n                    keyMap[slot.key] = slot;\n                    if (slot.index !== undefined) {\n                        indexMap[slot.index] = slot;\n                    }\n                }\n\n                function removeSlotPermanently(slot) {\n                    removeSlot(slot);\n\n                    if (slot.key) {\n                        delete keyMap[slot.key];\n                    }\n                    if (slot.index !== undefined && indexMap[slot.index] === slot) {\n                        delete indexMap[slot.index];\n                    }\n\n                    var bindingMap = slot.bindingMap;\n                    for (var listBindingID in bindingMap) {\n                        var handle = bindingMap[listBindingID].handle;\n                        if (handle && handleMap[handle] === slot) {\n                            delete handleMap[handle];\n                        }\n                    }\n\n                    // Invalidating the slot's handle marks it as deleted\n                    if (handleMap[slot.handle] === slot) {\n                        delete handleMap[slot.handle];\n                    }\n                }\n\n                function slotPermanentlyRemoved(slot) {\n                    return !handleMap[slot.handle];\n                }\n\n                function successorFromIndex(index, indexMapForSlot, listStart, listEnd, skipPreviousIndex) {\n                    // Try the previous index\n                    var slotNext = (skipPreviousIndex ? null : indexMapForSlot[index - 1]);\n                    if (slotNext && (slotNext.next !== listEnd || listEnd.firstInSequence)) {\n                        // We want the successor\n                        slotNext = slotNext.next;\n                    } else {\n                        // Try the next index\n                        slotNext = indexMapForSlot[index + 1];\n                        if (!slotNext) {\n                            // Resort to a linear search\n                            slotNext = listStart.next;\n                            var lastSequenceStart;\n                            while (true) {\n                                if (slotNext.firstInSequence) {\n                                    lastSequenceStart = slotNext;\n                                }\n\n                                if (!(index >= slotNext.index) || slotNext === listEnd) {\n                                    break;\n                                }\n\n                                slotNext = slotNext.next;\n                            }\n\n                            if (slotNext === listEnd && !listEnd.firstInSequence) {\n                                // Return the last insertion point between sequences, or undefined if none\n                                slotNext = (lastSequenceStart && lastSequenceStart.index === undefined ? lastSequenceStart : undefined);\n                            }\n                        }\n                    }\n\n                    return slotNext;\n                }\n\n                // Slot Items\n\n                function isPlaceholder(slot) {\n                    return !slot.item && !slot.itemNew && slot !== slotListEnd;\n                }\n\n                function defineHandleProperty(item, handle) {\n                    Object.defineProperty(item, \"handle\", {\n                        value: handle,\n                        writable: false,\n                        enumerable: false,\n                        configurable: true\n                    });\n                }\n\n                function defineCommonItemProperties(item, slot, handle) {\n                    defineHandleProperty(item, handle);\n\n                    Object.defineProperty(item, \"index\", {\n                        get: function () {\n                            while (slot.slotMergedWith) {\n                                slot = slot.slotMergedWith;\n                            }\n\n                            return slot.index;\n                        },\n                        enumerable: false,\n                        configurable: true\n                    });\n                }\n\n                function validateData(data) {\n                    if (data === undefined) {\n                        return data;\n                    } else {\n                        // Convert the data object to JSON to enforce the constraints we want.  For example, we don't want\n                        // functions, arrays with extra properties, DOM objects, cyclic or acyclic graphs, or undefined values.\n                        var dataValidated = JSON.stringify(data);\n\n                        if (dataValidated === undefined) {\n                            throw new _ErrorFromName(\"WinJS.UI.ListDataSource.ObjectIsNotValidJson\", strings.objectIsNotValidJson);\n                        }\n\n                        return dataValidated;\n                    }\n                }\n\n                function itemSignature(item) {\n                    return (\n                        listDataAdapter.itemSignature ?\n                            listDataAdapter.itemSignature(item.data) :\n                            validateData(item.data)\n                    );\n                }\n\n                function prepareSlotItem(slot) {\n                    var item = slot.itemNew;\n                    slot.itemNew = null;\n\n                    if (item) {\n                        item = Object.create(item);\n                        defineCommonItemProperties(item, slot, slot.handle);\n\n                        if (!listDataAdapter.compareByIdentity) {\n                            // Store the item signature or a stringified copy of the data for comparison later\n                            slot.signature = itemSignature(item);\n                        }\n                    }\n\n                    slot.item = item;\n\n                    delete slot.indexRequested;\n                    delete slot.keyRequested;\n                }\n\n                // Slot Caching\n\n                function slotRetained(slot) {\n                    return slot.bindingMap || slot.cursorCount > 0;\n                }\n\n                function slotRequested(slot) {\n                    return slotRetained(slot) || slot.fetchListeners || slot.directFetchListeners;\n                }\n\n                function slotLive(slot) {\n                    return slotRequested(slot) || (!slot.firstInSequence && slotRetained(slot.prev)) || (!slot.lastInSequence && slotRetained(slot.next)) ||\n                        (!itemsFromIndex && (\n                            (!slot.firstInSequence && slot.prev !== slotsStart && !(slot.prev.item || slot.prev.itemNew)) |\n                            (!slot.lastInSequence && slot.next !== slotListEnd && !(slot.next.item || slot.next.itemNew))\n                        ));\n                }\n\n                function deleteUnnecessarySlot(slot) {\n                    splitSequence(slot);\n                    removeSlotPermanently(slot);\n                }\n\n                function reduceReleasedSlotCount() {\n                    // Must not release slots while edits are queued, as undo queue might refer to them\n                    if (!editsQueued) {\n                        // If lastSlotReleased is no longer valid, use the end of the list instead\n                        if (!lastSlotReleased || slotPermanentlyRemoved(lastSlotReleased)) {\n                            lastSlotReleased = slotListEnd.prev;\n                        }\n\n                        // Now use the simple heuristic of walking outwards in both directions from lastSlotReleased until the\n                        // desired cache size is reached, then removing everything else.\n                        var slotPrev = lastSlotReleased.prev,\n                            slotNext = lastSlotReleased.next,\n                            releasedSlotsFound = 0;\n\n                        var considerDeletingSlot = function (slotToDelete) {\n                            if (slotToDelete !== slotListEnd && !slotLive(slotToDelete)) {\n                                if (releasedSlotsFound <= cacheSize) {\n                                    releasedSlotsFound++;\n                                } else {\n                                    deleteUnnecessarySlot(slotToDelete);\n                                }\n                            }\n                        };\n\n                        while (slotPrev || slotNext) {\n                            if (slotPrev) {\n                                var slotPrevToDelete = slotPrev;\n                                slotPrev = slotPrevToDelete.prev;\n                                if (slotPrevToDelete !== slotsStart) {\n                                    considerDeletingSlot(slotPrevToDelete);\n                                }\n                            }\n                            if (slotNext) {\n                                var slotNextToDelete = slotNext;\n                                slotNext = slotNextToDelete.next;\n                                if (slotNextToDelete !== slotsEnd) {\n                                    considerDeletingSlot(slotNextToDelete);\n                                }\n                            }\n                        }\n\n                        // Reset the count to zero, so this method is only called periodically\n                        releasedSlots = 0;\n                    }\n                }\n\n                function releaseSlotIfUnrequested(slot) {\n                    if (!slotRequested(slot)) {\n\n                        releasedSlots++;\n\n                        // Must not release slots while edits are queued, as undo queue might refer to them.  If a refresh is in\n                        // progress, retain all slots, just in case the user re-requests some of them before the refresh completes.\n                        if (!editsQueued && !refreshInProgress) {\n                            // Track which slot was released most recently\n                            lastSlotReleased = slot;\n\n                            // See if the number of released slots has exceeded the cache size.  In practice there will be more\n                            // live slots than retained slots, so this is just a heuristic to periodically shrink the cache.\n                            if (releasedSlots > cacheSize && !reduceReleasedSlotCountPosted) {\n                                reduceReleasedSlotCountPosted = true;\n                                Scheduler.schedule(function VDS_async_releaseSlotIfUnrequested() {\n                                    reduceReleasedSlotCountPosted = false;\n                                    reduceReleasedSlotCount();\n                                }, Scheduler.Priority.idle, null, \"WinJS.UI.VirtualizedDataSource.releaseSlotIfUnrequested\");\n                            }\n                        }\n                    }\n                }\n\n                // Notifications\n\n                function forEachBindingRecord(callback) {\n                    for (var listBindingID in bindingMap) {\n                        callback(bindingMap[listBindingID]);\n                    }\n                }\n\n                function forEachBindingRecordOfSlot(slot, callback) {\n                    for (var listBindingID in slot.bindingMap) {\n                        callback(slot.bindingMap[listBindingID].bindingRecord, listBindingID);\n                    }\n                }\n\n                function handlerToNotify(bindingRecord) {\n                    if (!bindingRecord.notificationsSent) {\n                        bindingRecord.notificationsSent = true;\n\n                        if (bindingRecord.notificationHandler.beginNotifications) {\n                            bindingRecord.notificationHandler.beginNotifications();\n                        }\n                    }\n                    return bindingRecord.notificationHandler;\n                }\n\n                function finishNotifications() {\n                    if (!editsInProgress && !dataNotificationsInProgress) {\n                        forEachBindingRecord(function (bindingRecord) {\n                            if (bindingRecord.notificationsSent) {\n                                bindingRecord.notificationsSent = false;\n\n                                if (bindingRecord.notificationHandler.endNotifications) {\n                                    bindingRecord.notificationHandler.endNotifications();\n                                }\n                            }\n                        });\n                    }\n                }\n\n                function handleForBinding(slot, listBindingID) {\n                    var bindingMap = slot.bindingMap;\n                    if (bindingMap) {\n                        var slotBinding = bindingMap[listBindingID];\n                        if (slotBinding) {\n                            var handle = slotBinding.handle;\n                            if (handle) {\n                                return handle;\n                            }\n                        }\n                    }\n                    return slot.handle;\n                }\n\n                function itemForBinding(item, handle) {\n                    if (item && item.handle !== handle) {\n                        item = Object.create(item);\n                        defineHandleProperty(item, handle);\n                    }\n                    return item;\n                }\n\n                function changeCount(count) {\n                    var oldCount = knownCount;\n                    knownCount = count;\n\n                    forEachBindingRecord(function (bindingRecord) {\n                        if (bindingRecord.notificationHandler && bindingRecord.notificationHandler.countChanged) {\n                            handlerToNotify(bindingRecord).countChanged(knownCount, oldCount);\n                        }\n                    });\n                }\n\n                function sendIndexChangedNotifications(slot, indexOld) {\n                    forEachBindingRecordOfSlot(slot, function (bindingRecord, listBindingID) {\n                        if (bindingRecord.notificationHandler.indexChanged) {\n                            handlerToNotify(bindingRecord).indexChanged(handleForBinding(slot, listBindingID), slot.index, indexOld);\n                        }\n                    });\n                }\n\n                function changeSlotIndex(slot, index) {\n                    var indexOld = slot.index;\n\n                    if (indexOld !== undefined && indexMap[indexOld] === slot) {\n                        // Remove the slot's old index from the indexMap\n                        delete indexMap[indexOld];\n                    }\n\n                    // Tolerate NaN, so clients can pass (undefined - 1) or (undefined + 1)\n                    if (+index === index) {\n                        setSlotIndex(slot, index, indexMap);\n                    } else if (+indexOld === indexOld) {\n                        delete slot.index;\n                    } else {\n                        // If neither the new index or the old index is defined then there was no index changed.\n                        return;\n                    }\n\n                    sendIndexChangedNotifications(slot, indexOld);\n                }\n\n                function insertionNotificationRecipients(slot, slotPrev, slotNext, mergeWithPrev, mergeWithNext) {\n                    var bindingMapRecipients = {};\n\n                    // Start with the intersection of the bindings for the two adjacent slots\n                    if ((mergeWithPrev || !slotPrev.lastInSequence) && (mergeWithNext || !slotNext.firstInSequence)) {\n                        if (slotPrev === slotsStart) {\n                            if (slotNext === slotListEnd) {\n                                // Special case: if the list was empty, broadcast the insertion to all ListBindings with\n                                // notification handlers.\n                                for (var listBindingID in bindingMap) {\n                                    bindingMapRecipients[listBindingID] = bindingMap[listBindingID];\n                                }\n                            } else {\n                                // Include every binding on the next slot\n                                for (var listBindingID in slotNext.bindingMap) {\n                                    bindingMapRecipients[listBindingID] = bindingMap[listBindingID];\n                                }\n                            }\n                        } else if (slotNext === slotListEnd || slotNext.bindingMap) {\n                            for (var listBindingID in slotPrev.bindingMap) {\n                                if (slotNext === slotListEnd || slotNext.bindingMap[listBindingID]) {\n                                    bindingMapRecipients[listBindingID] = bindingMap[listBindingID];\n                                }\n                            }\n                        }\n                    }\n\n                    // Use the union of that result with the bindings for the slot being inserted\n                    for (var listBindingID in slot.bindingMap) {\n                        bindingMapRecipients[listBindingID] = bindingMap[listBindingID];\n                    }\n\n                    return bindingMapRecipients;\n                }\n\n                function sendInsertedNotification(slot) {\n                    var slotPrev = slot.prev,\n                        slotNext = slot.next,\n                        bindingMapRecipients = insertionNotificationRecipients(slot, slotPrev, slotNext),\n                        listBindingID;\n\n                    for (listBindingID in bindingMapRecipients) {\n                        var bindingRecord = bindingMapRecipients[listBindingID];\n                        if (bindingRecord.notificationHandler) {\n                            handlerToNotify(bindingRecord).inserted(bindingRecord.itemPromiseFromKnownSlot(slot),\n                                slotPrev.lastInSequence || slotPrev === slotsStart ? null : handleForBinding(slotPrev, listBindingID),\n                                slotNext.firstInSequence || slotNext === slotListEnd ? null : handleForBinding(slotNext, listBindingID)\n                            );\n                        }\n                    }\n                }\n\n                function changeSlot(slot) {\n                    var itemOld = slot.item;\n                    prepareSlotItem(slot);\n\n                    forEachBindingRecordOfSlot(slot, function (bindingRecord, listBindingID) {\n                        var handle = handleForBinding(slot, listBindingID);\n                        handlerToNotify(bindingRecord).changed(itemForBinding(slot.item, handle), itemForBinding(itemOld, handle));\n                    });\n                }\n\n                function moveSlot(slot, slotMoveBefore, mergeWithPrev, mergeWithNext, skipNotifications) {\n                    var slotMoveAfter = slotMoveBefore.prev,\n                        listBindingID;\n\n                    // If the slot is being moved before or after itself, adjust slotMoveAfter or slotMoveBefore accordingly. If\n                    // nothing is going to change in the slot list, don't send a notification.\n                    if (slotMoveBefore === slot) {\n                        if (!slot.firstInSequence || !mergeWithPrev) {\n                            return;\n                        }\n                        slotMoveBefore = slot.next;\n                    } else if (slotMoveAfter === slot) {\n                        if (!slot.lastInSequence || !mergeWithNext) {\n                            return;\n                        }\n                        slotMoveAfter = slot.prev;\n                    }\n\n                    if (!skipNotifications) {\n                        // Determine which bindings to notify\n\n                        var bindingMapRecipients = insertionNotificationRecipients(slot, slotMoveAfter, slotMoveBefore, mergeWithPrev, mergeWithNext);\n\n                        // Send the notification before the move\n                        for (listBindingID in bindingMapRecipients) {\n                            var bindingRecord = bindingMapRecipients[listBindingID];\n                            handlerToNotify(bindingRecord).moved(bindingRecord.itemPromiseFromKnownSlot(slot),\n                                ((slotMoveAfter.lastInSequence || slotMoveAfter === slot.prev) && !mergeWithPrev) || slotMoveAfter === slotsStart ? null : handleForBinding(slotMoveAfter, listBindingID),\n                                ((slotMoveBefore.firstInSequence || slotMoveBefore === slot.next) && !mergeWithNext) || slotMoveBefore === slotListEnd ? null : handleForBinding(slotMoveBefore, listBindingID)\n                            );\n                        }\n\n                        // If a ListBinding cursor is at the slot that's moving, adjust the cursor\n                        forEachBindingRecord(function (bindingRecord) {\n                            bindingRecord.adjustCurrentSlot(slot);\n                        });\n                    }\n\n                    removeSlot(slot);\n                    insertAndMergeSlot(slot, slotMoveBefore, mergeWithPrev, mergeWithNext);\n                }\n\n                function deleteSlot(slot, mirage) {\n                    completeFetchPromises(slot, true);\n\n                    forEachBindingRecordOfSlot(slot, function (bindingRecord, listBindingID) {\n                        handlerToNotify(bindingRecord).removed(handleForBinding(slot, listBindingID), mirage);\n                    });\n\n                    // If a ListBinding cursor is at the slot that's being removed, adjust the cursor\n                    forEachBindingRecord(function (bindingRecord) {\n                        bindingRecord.adjustCurrentSlot(slot);\n                    });\n\n                    removeSlotPermanently(slot);\n                }\n\n                function deleteMirageSequence(slot) {\n                    // Remove the slots in order\n\n                    while (!slot.firstInSequence) {\n                        slot = slot.prev;\n                    }\n\n                    var last;\n                    do {\n                        last = slot.lastInSequence;\n\n                        var slotNext = slot.next;\n                        deleteSlot(slot, true);\n                        slot = slotNext;\n                    } while (!last);\n                }\n\n                // Deferred Index Updates\n\n                // Returns the index of the slot taking into account any outstanding index updates\n                function adjustedIndex(slot) {\n                    var undefinedIndex;\n\n                    if (!slot) {\n                        return undefinedIndex;\n                    }\n\n                    var delta = 0;\n                    while (!slot.firstInSequence) {\n                        delta++;\n                        slot = slot.prev;\n                    }\n\n                    return (\n                        typeof slot.indexNew === \"number\" ?\n                            slot.indexNew + delta :\n                        typeof slot.index === \"number\" ?\n                            slot.index + delta :\n                            undefinedIndex\n                    );\n                }\n\n                // Updates the new index of the first slot in each sequence after the given slot\n                function updateNewIndicesAfterSlot(slot, indexDelta) {\n                    // Adjust all the indexNews after this slot\n                    for (slot = slot.next; slot; slot = slot.next) {\n                        if (slot.firstInSequence) {\n                            var indexNew = (slot.indexNew !== undefined ? slot.indexNew : slot.index);\n                            if (indexNew !== undefined) {\n                                slot.indexNew = indexNew + indexDelta;\n                            }\n                        }\n                    }\n\n                    // Adjust the overall count\n                    countDelta += indexDelta;\n\n                    indexUpdateDeferred = true;\n\n                    // Increment currentRefreshID so any outstanding fetches don't cause trouble.  If a refresh is in progress,\n                    // restart it (which will also increment currentRefreshID).\n                    if (refreshInProgress) {\n                        beginRefresh();\n                    } else {\n                        currentRefreshID++;\n                    }\n                }\n\n                // Updates the new index of the given slot if necessary, and all subsequent new indices\n                function updateNewIndices(slot, indexDelta) {\n                    // If this slot is at the start of a sequence, transfer the indexNew\n                    if (slot.firstInSequence) {\n                        var indexNew;\n\n                        if (indexDelta < 0) {\n                            // The given slot is about to be removed\n                            indexNew = slot.indexNew;\n                            if (indexNew !== undefined) {\n                                delete slot.indexNew;\n                            } else {\n                                indexNew = slot.index;\n                            }\n\n                            if (!slot.lastInSequence) {\n                                // Update the next slot now\n                                slot = slot.next;\n                                if (indexNew !== undefined) {\n                                    slot.indexNew = indexNew;\n                                }\n                            }\n                        } else {\n                            // The given slot was just inserted\n                            if (!slot.lastInSequence) {\n                                var slotNext = slot.next;\n\n                                indexNew = slotNext.indexNew;\n                                if (indexNew !== undefined) {\n                                    delete slotNext.indexNew;\n                                } else {\n                                    indexNew = slotNext.index;\n                                }\n\n                                if (indexNew !== undefined) {\n                                    slot.indexNew = indexNew;\n                                }\n                            }\n                        }\n                    }\n\n                    updateNewIndicesAfterSlot(slot, indexDelta);\n                }\n\n                // Updates the new index of the first slot in each sequence after the given new index\n                function updateNewIndicesFromIndex(index, indexDelta) {\n                    for (var slot = slotsStart; slot !== slotListEnd; slot = slot.next) {\n                        var indexNew = slot.indexNew;\n\n                        if (indexNew !== undefined && index <= indexNew) {\n                            updateNewIndicesAfterSlot(slot, indexDelta);\n                            break;\n                        }\n                    }\n                }\n\n                // Adjust the indices of all slots to be consistent with any indexNew properties, and strip off the indexNews\n                function updateIndices() {\n                    var slot,\n                        slotFirstInSequence,\n                        indexNew;\n\n                    for (slot = slotsStart; ; slot = slot.next) {\n                        if (slot.firstInSequence) {\n                            slotFirstInSequence = slot;\n                            if (slot.indexNew !== undefined) {\n                                indexNew = slot.indexNew;\n                                delete slot.indexNew;\n                                if (isNaN(indexNew)) {\n                                    break;\n                                }\n                            } else {\n                                indexNew = slot.index;\n                            }\n\n                            // See if this sequence should be merged with the previous one\n                            if (slot !== slotsStart && slot.prev.index === indexNew - 1) {\n                                mergeSequences(slot.prev);\n                            }\n                        }\n\n                        if (slot.lastInSequence) {\n                            var index = indexNew;\n                            for (var slotUpdate = slotFirstInSequence; slotUpdate !== slot.next; slotUpdate = slotUpdate.next) {\n                                if (index !== slotUpdate.index) {\n                                    changeSlotIndex(slotUpdate, index);\n                                }\n                                if (+index === index) {\n                                    index++;\n                                }\n                            }\n                        }\n\n                        if (slot === slotListEnd) {\n                            break;\n                        }\n                    }\n\n                    // Clear any indices on slots that were moved adjacent to slots without indices\n                    for (; slot !== slotsEnd; slot = slot.next) {\n                        if (slot.index !== undefined && slot !== slotListEnd) {\n                            changeSlotIndex(slot, undefined);\n                        }\n                    }\n\n                    indexUpdateDeferred = false;\n\n                    if (countDelta && +knownCount === knownCount) {\n                        if (getCountPromise) {\n                            getCountPromise.reset();\n                        } else {\n                            changeCount(knownCount + countDelta);\n                        }\n\n                        countDelta = 0;\n                    }\n                }\n\n                // Fetch Promises\n\n                function createFetchPromise(slot, listenersProperty, listenerID, listBindingID, onComplete) {\n                    if (slot.item) {\n                        return new Promise(function (complete) {\n                            if (onComplete) {\n                                onComplete(complete, slot.item);\n                            } else {\n                                complete(slot.item);\n                            }\n                        });\n                    } else {\n                        var listener = {\n                            listBindingID: listBindingID,\n                            retained: false\n                        };\n\n                        if (!slot[listenersProperty]) {\n                            slot[listenersProperty] = {};\n                        }\n                        slot[listenersProperty][listenerID] = listener;\n\n                        listener.promise = new Promise(function (complete, error) {\n                            listener.complete = (onComplete ? function (item) {\n                                onComplete(complete, item);\n                            } : complete);\n                            listener.error = error;\n                        }, function () {\n                            // By now the slot might have been merged with another\n\n                            while (slot.slotMergedWith) {\n                                slot = slot.slotMergedWith;\n                            }\n\n                            var fetchListeners = slot[listenersProperty];\n                            if (fetchListeners) {\n                                delete fetchListeners[listenerID];\n\n                                // See if there are any other listeners\n                                if (Object.keys(fetchListeners).length > 0) {\n                                    return;\n                                }\n                                delete slot[listenersProperty];\n                            }\n                            releaseSlotIfUnrequested(slot);\n                        });\n\n                        return listener.promise;\n                    }\n                }\n\n                function completePromises(item, listeners) {\n                    for (var listenerID in listeners) {\n                        listeners[listenerID].complete(item);\n                    }\n                }\n\n                function completeFetchPromises(slot, completeSynchronously) {\n                    var fetchListeners = slot.fetchListeners,\n                        directFetchListeners = slot.directFetchListeners;\n\n                    if (fetchListeners || directFetchListeners) {\n                        prepareSlotItem(slot);\n\n                        // By default, complete asynchronously to minimize reentrancy\n\n                        var item = slot.item;\n\n                        var completeOrQueuePromises = function (listeners) {\n                            if (completeSynchronously) {\n                                completePromises(item, listeners);\n                            } else {\n                                fetchCompleteCallbacks.push(function () {\n                                    completePromises(item, listeners);\n                                });\n                            }\n                        };\n\n                        if (directFetchListeners) {\n                            slot.directFetchListeners = null;\n                            completeOrQueuePromises(directFetchListeners);\n                        }\n\n                        if (fetchListeners) {\n                            slot.fetchListeners = null;\n                            completeOrQueuePromises(fetchListeners);\n                        }\n\n                        releaseSlotIfUnrequested(slot);\n                    }\n                }\n\n                function callFetchCompleteCallbacks() {\n                    var callbacks = fetchCompleteCallbacks;\n\n                    // Clear fetchCompleteCallbacks first to avoid reentrancy problems\n                    fetchCompleteCallbacks = [];\n\n                    for (var i = 0, len = callbacks.length; i < len; i++) {\n                        callbacks[i]();\n                    }\n                }\n\n                function returnDirectFetchError(slot, error) {\n                    var directFetchListeners = slot.directFetchListeners;\n                    if (directFetchListeners) {\n                        slot.directFetchListeners = null;\n\n                        for (var listenerID in directFetchListeners) {\n                            directFetchListeners[listenerID].error(error);\n                        }\n\n                        releaseSlotIfUnrequested(slot);\n                    }\n                }\n\n                // Item Requests\n\n                function requestSlot(slot) {\n                    // Ensure that there's a slot on either side of each requested item\n                    if (slot.firstInSequence) {\n                        addSlotBefore(slot, indexMap);\n                    }\n                    if (slot.lastInSequence) {\n                        addSlotAfter(slot, indexMap);\n                    }\n\n                    // If the item has already been fetched, prepare it now to be returned to the client\n                    if (slot.itemNew) {\n                        prepareSlotItem(slot);\n                    }\n\n                    // Start a new fetch if necessary\n                    postFetch();\n\n                    return slot;\n                }\n\n                function requestSlotBefore(slotNext) {\n                    // First, see if the previous slot already exists\n                    if (!slotNext.firstInSequence) {\n                        var slotPrev = slotNext.prev;\n\n                        // Next, see if the item is known to not exist\n                        return (slotPrev === slotsStart ? null : requestSlot(slotPrev));\n                    }\n\n                    return requestSlot(addSlotBefore(slotNext, indexMap));\n                }\n\n                function requestSlotAfter(slotPrev) {\n                    // First, see if the next slot already exists\n                    if (!slotPrev.lastInSequence) {\n                        var slotNext = slotPrev.next;\n\n                        // Next, see if the item is known to not exist\n                        return (slotNext === slotListEnd ? null : requestSlot(slotNext));\n                    }\n\n                    return requestSlot(addSlotAfter(slotPrev, indexMap));\n                }\n\n                function itemDirectlyFromSlot(slot) {\n                    // Return a complete promise for a non-existent slot\n                    return (\n                        slot ?\n                            createFetchPromise(slot, \"directFetchListeners\", (nextListenerID++).toString()) :\n                            Promise.wrap(null)\n                    );\n                }\n\n                function validateKey(key) {\n                    if (typeof key !== \"string\" || !key) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.KeyIsInvalid\", strings.keyIsInvalid);\n                    }\n                }\n\n                function createSlotForKey(key) {\n                    var slot = createPrimarySlotSequence(slotsEnd);\n\n                    setSlotKey(slot, key);\n                    slot.keyRequested = true;\n\n                    return slot;\n                }\n\n                function slotFromKey(key, hints) {\n                    validateKey(key);\n\n                    var slot = keyMap[key];\n\n                    if (!slot) {\n                        slot = createSlotForKey(key);\n                        slot.hints = hints;\n                    }\n\n                    return requestSlot(slot);\n                }\n\n                function slotFromIndex(index) {\n                    if (typeof index !== \"number\" || index < 0) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.IndexIsInvalid\", strings.indexIsInvalid);\n                    }\n\n                    if (slotListEnd.index <= index) {\n                        return null;\n                    }\n\n                    var slot = indexMap[index];\n\n                    if (!slot) {\n                        var slotNext = successorFromIndex(index, indexMap, slotsStart, slotListEnd);\n\n                        if (!slotNext) {\n                            // The complete list has been observed, and this index isn't a part of it; a refresh may be necessary\n                            return null;\n                        }\n\n                        if (slotNext === slotListEnd && index >= slotListEnd) {\n                            // Clear slotListEnd's index, as that's now unknown\n                            changeSlotIndex(slotListEnd, undefined);\n                        }\n\n                        // Create a new slot and start a request for it\n                        if (slotNext.prev.index === index - 1) {\n                            slot = addSlotAfter(slotNext.prev, indexMap);\n                        } else if (slotNext.index === index + 1) {\n                            slot = addSlotBefore(slotNext, indexMap);\n                        } else {\n                            slot = createPrimarySlotSequence(slotNext, index);\n                        }\n                    }\n\n                    if (!slot.item) {\n                        slot.indexRequested = true;\n                    }\n\n                    return requestSlot(slot);\n                }\n\n                function slotFromDescription(description) {\n                    // Create a new slot and start a request for it\n                    var slot = createPrimarySlotSequence(slotsEnd);\n\n                    slot.description = description;\n\n                    return requestSlot(slot);\n                }\n\n                // Status\n                var that = this;\n                function setStatus(statusNew) {\n                    statusPending = statusNew;\n                    if (status !== statusPending) {\n                        var dispatch = function () {\n                            statusChangePosted = false;\n\n                            if (status !== statusPending) {\n                                status = statusPending;\n                                that.dispatchEvent(statusChangedEvent, status);\n                            }\n                        };\n                        if (statusPending === DataSourceStatus.failure) {\n                            dispatch();\n                        } else if (!statusChangePosted) {\n                            statusChangePosted = true;\n\n                            // Delay the event to filter out rapid changes\n                            _Global.setTimeout(dispatch, 40);\n                        }\n                    }\n                }\n\n                // Slot Fetching\n\n                function slotFetchInProgress(slot) {\n                    var fetchID = slot.fetchID;\n                    return fetchID && fetchesInProgress[fetchID];\n                }\n\n                function setFetchID(slot, fetchID) {\n                    slot.fetchID = fetchID;\n                }\n\n                function newFetchID() {\n                    var fetchID = nextFetchID;\n                    nextFetchID++;\n\n                    fetchesInProgress[fetchID] = true;\n\n                    return fetchID;\n                }\n\n                function setFetchIDs(slot, countBefore, countAfter) {\n                    var fetchID = newFetchID();\n                    setFetchID(slot, fetchID);\n\n                    var slotBefore = slot;\n                    while (!slotBefore.firstInSequence && countBefore > 0) {\n                        slotBefore = slotBefore.prev;\n                        countBefore--;\n                        setFetchID(slotBefore, fetchID);\n                    }\n\n                    var slotAfter = slot;\n                    while (!slotAfter.lastInSequence && countAfter > 0) {\n                        slotAfter = slotAfter.next;\n                        countAfter--;\n                        setFetchID(slotAfter, fetchID);\n                    }\n\n                    return fetchID;\n                }\n\n                // Adds markers on behalf of the data adapter if their presence can be deduced\n                function addMarkers(fetchResult) {\n                    var items = fetchResult.items,\n                        offset = fetchResult.offset,\n                        totalCount = fetchResult.totalCount,\n                        absoluteIndex = fetchResult.absoluteIndex,\n                        atStart = fetchResult.atStart,\n                        atEnd = fetchResult.atEnd;\n\n                    if (isNonNegativeNumber(absoluteIndex)) {\n                        if (isNonNegativeNumber(totalCount)) {\n                            var itemsLength = items.length;\n                            if (absoluteIndex - offset + itemsLength === totalCount) {\n                                atEnd = true;\n                            }\n                        }\n\n                        if (offset === absoluteIndex) {\n                            atStart = true;\n                        }\n                    }\n\n                    if (atStart) {\n                        items.unshift(startMarker);\n                        fetchResult.offset++;\n                    }\n\n                    if (atEnd) {\n                        items.push(endMarker);\n                    }\n                }\n\n                function resultsValid(slot, refreshID, fetchID) {\n                    // This fetch has completed, whatever it has returned\n                    delete fetchesInProgress[fetchID];\n\n                    if (refreshID !== currentRefreshID || slotPermanentlyRemoved(slot)) {\n                        // This information is out of date, or the slot has since been discarded\n\n                        postFetch();\n                        return false;\n                    }\n\n                    return true;\n                }\n\n                function fetchItems(slot, fetchID, promiseItems, index) {\n                    var refreshID = currentRefreshID;\n                    promiseItems.then(function (fetchResult) {\n                        if (fetchResult.items && fetchResult.items.length) {\n                            var perfID = \"itemsFetched id=\" + fetchID + \" count=\" + fetchResult.items.length;\n                            profilerMarkStart(perfID);\n                            if (resultsValid(slot, refreshID, fetchID)) {\n                                if (+index === index) {\n                                    fetchResult.absoluteIndex = index;\n                                }\n                                addMarkers(fetchResult);\n                                processResults(slot, fetchResult.items, fetchResult.offset, fetchResult.totalCount, fetchResult.absoluteIndex);\n                            }\n                            profilerMarkEnd(perfID);\n                        } else {\n                            return Promise.wrapError(new _ErrorFromName(FetchError.doesNotExist));\n                        }\n                    }).then(null, function (error) {\n                        if (resultsValid(slot, refreshID, fetchID)) {\n                            processErrorResult(slot, error);\n                        }\n                    });\n                }\n\n                function fetchItemsForIndex(indexRequested, slot, fetchID, promiseItems) {\n                    var refreshID = currentRefreshID;\n                    promiseItems.then(function (fetchResult) {\n                        if (fetchResult.items && fetchResult.items.length) {\n                            var perfID = \"itemsFetched id=\" + fetchID + \" count=\" + fetchResult.items.length;\n                            profilerMarkStart(perfID);\n                            if (resultsValid(slot, refreshID, fetchID)) {\n                                fetchResult.absoluteIndex = indexRequested;\n                                addMarkers(fetchResult);\n                                processResultsForIndex(indexRequested, slot, fetchResult.items, fetchResult.offset, fetchResult.totalCount, fetchResult.absoluteIndex);\n                            }\n                            profilerMarkEnd(perfID);\n                        } else {\n                            return Promise.wrapError(new _ErrorFromName(FetchError.doesNotExist));\n                        }\n                    }).then(null, function () {\n                        if (resultsValid(slot, refreshID, fetchID)) {\n                            processErrorResultForIndex(indexRequested, slot, refreshID);\n                        }\n                    });\n                }\n\n                function fetchItemsFromStart(slot, count) {\n                    var fetchID = setFetchIDs(slot, 0, count - 1);\n                    if (itemsFromStart) {\n                        fetchItems(slot, fetchID, itemsFromStart(fetchID, count), 0);\n                    } else {\n                        fetchItems(slot, fetchID, itemsFromIndex(fetchID, 0, 0, count - 1), 0);\n                    }\n                }\n\n                function fetchItemsFromEnd(slot, count) {\n                    var fetchID = setFetchIDs(slot, count - 1, 0);\n                    fetchItems(slot, fetchID, itemsFromEnd(fetchID, count));\n                }\n\n                function fetchItemsFromKey(slot, countBefore, countAfter) {\n                    var fetchID = setFetchIDs(slot, countBefore, countAfter);\n                    fetchItems(slot, fetchID, itemsFromKey(fetchID, slot.key, countBefore, countAfter, slot.hints));\n                }\n\n                function fetchItemsFromIndex(slot, countBefore, countAfter) {\n                    var index = slot.index;\n\n                    // Don't ask for items with negative indices\n                    if (countBefore > index) {\n                        countBefore = index;\n                    }\n\n                    if (itemsFromIndex) {\n                        var fetchID = setFetchIDs(slot, countBefore, countAfter);\n                        fetchItems(slot, fetchID, itemsFromIndex(fetchID, index, countBefore, countAfter), index);\n                    } else {\n                        // If the slot key is known, we just need to request the surrounding items\n                        if (slot.key) {\n                            fetchItemsFromKey(slot, countBefore, countAfter);\n                        } else {\n                            // Search for the slot with the closest index that has a known key (using the start of the list as a\n                            // last resort).\n                            var slotClosest = slotsStart,\n                                closestDelta = index + 1,\n                                slotSearch,\n                                delta;\n\n                            // First search backwards\n                            for (slotSearch = slot.prev; slotSearch !== slotsStart; slotSearch = slotSearch.prev) {\n                                if (slotSearch.index !== undefined && slotSearch.key) {\n                                    delta = index - slotSearch.index;\n                                    if (closestDelta > delta) {\n                                        closestDelta = delta;\n                                        slotClosest = slotSearch;\n                                    }\n                                    break;\n                                }\n                            }\n\n                            // Then search forwards\n                            for (slotSearch = slot.next; slotSearch !== slotListEnd; slotSearch = slotSearch.next) {\n                                if (slotSearch.index !== undefined && slotSearch.key) {\n                                    delta = slotSearch.index - index;\n                                    if (closestDelta > delta) {\n                                        closestDelta = delta;\n                                        slotClosest = slotSearch;\n                                    }\n                                    break;\n                                }\n                            }\n\n                            if (slotClosest === slotsStart) {\n                                var fetchID = setFetchIDs(slot, 0, index + 1);\n                                fetchItemsForIndex(0, slot, fetchID, itemsFromStart(fetchID, index + 1));\n                            } else {\n                                var fetchBefore = Math.max(slotClosest.index - index, 0);\n                                var fetchAfter = Math.max(index - slotClosest.index, 0);\n                                var fetchID = setFetchIDs(slotClosest, fetchBefore, fetchAfter);\n                                fetchItemsForIndex(slotClosest.index, slot, fetchID, itemsFromKey(fetchID,\n                                    slotClosest.key,\n                                    fetchBefore,\n                                    fetchAfter,\n                                    slot.hints\n                                ));\n                            }\n                        }\n                    }\n                }\n\n                function fetchItemsFromDescription(slot, countBefore, countAfter) {\n                    var fetchID = setFetchIDs(slot, countBefore, countAfter);\n                    fetchItems(slot, fetchID, itemsFromDescription(fetchID, slot.description, countBefore, countAfter));\n                }\n\n                function fetchItemsForAllSlots() {\n                    if (!refreshInProgress) {\n                        var slotFirstPlaceholder,\n                            placeholderCount,\n                            fetchInProgress = false,\n                            fetchesInProgress = false,\n                            slotRequestedByKey,\n                            requestedKeyOffset,\n                            slotRequestedByDescription,\n                            requestedDescriptionOffset,\n                            slotRequestedByIndex,\n                            requestedIndexOffset;\n\n                        for (var slot = slotsStart.next; slot !== slotsEnd;) {\n                            var slotNext = slot.next;\n\n                            if (slot !== slotListEnd && isPlaceholder(slot)) {\n                                fetchesInProgress = true;\n\n                                if (!slotFirstPlaceholder) {\n                                    slotFirstPlaceholder = slot;\n                                    placeholderCount = 1;\n                                } else {\n                                    placeholderCount++;\n                                }\n\n                                if (slotFetchInProgress(slot)) {\n                                    fetchInProgress = true;\n                                }\n\n                                if (slot.keyRequested && !slotRequestedByKey) {\n                                    slotRequestedByKey = slot;\n                                    requestedKeyOffset = placeholderCount - 1;\n                                }\n\n                                if (slot.description !== undefined && !slotRequestedByDescription) {\n                                    slotRequestedByDescription = slot;\n                                    requestedDescriptionOffset = placeholderCount - 1;\n                                }\n\n                                if (slot.indexRequested && !slotRequestedByIndex) {\n                                    slotRequestedByIndex = slot;\n                                    requestedIndexOffset = placeholderCount - 1;\n                                }\n\n                                if (slot.lastInSequence || slotNext === slotsEnd || !isPlaceholder(slotNext)) {\n                                    if (fetchInProgress) {\n                                        fetchInProgress = false;\n                                    } else {\n                                        resultsProcessed = false;\n\n                                        // Start a new fetch for this placeholder sequence\n\n                                        // Prefer fetches in terms of a known item\n                                        if (!slotFirstPlaceholder.firstInSequence && slotFirstPlaceholder.prev.key && itemsFromKey) {\n                                            fetchItemsFromKey(slotFirstPlaceholder.prev, 0, placeholderCount);\n                                        } else if (!slot.lastInSequence && slotNext.key && itemsFromKey) {\n                                            fetchItemsFromKey(slotNext, placeholderCount, 0);\n                                        } else if (slotFirstPlaceholder.prev === slotsStart && !slotFirstPlaceholder.firstInSequence && (itemsFromStart || itemsFromIndex)) {\n                                            fetchItemsFromStart(slotFirstPlaceholder, placeholderCount);\n                                        } else if (slotNext === slotListEnd && !slot.lastInSequence && itemsFromEnd) {\n                                            fetchItemsFromEnd(slot, placeholderCount);\n                                        } else if (slotRequestedByKey) {\n                                            fetchItemsFromKey(slotRequestedByKey, requestedKeyOffset, placeholderCount - 1 - requestedKeyOffset);\n                                        } else if (slotRequestedByDescription) {\n                                            fetchItemsFromDescription(slotRequestedByDescription, requestedDescriptionOffset, placeholderCount - 1 - requestedDescriptionOffset);\n                                        } else if (slotRequestedByIndex) {\n                                            fetchItemsFromIndex(slotRequestedByIndex, requestedIndexOffset, placeholderCount - 1 - requestedIndexOffset);\n                                        } else if (typeof slotFirstPlaceholder.index === \"number\") {\n                                            fetchItemsFromIndex(slotFirstPlaceholder, placeholderCount - 1, 0);\n                                        } else {\n                                            // There is no way to fetch anything in this sequence\n                                            deleteMirageSequence(slotFirstPlaceholder);\n                                        }\n\n                                        if (resultsProcessed) {\n                                            // A re-entrant fetch might have altered the slots list - start again\n                                            postFetch();\n                                            return;\n                                        }\n\n                                        if (refreshInProgress) {\n                                            // A re-entrant fetch might also have caused a refresh\n                                            return;\n                                        }\n                                    }\n\n                                    slotFirstPlaceholder = slotRequestedByIndex = slotRequestedByKey = null;\n                                }\n                            }\n\n                            slot = slotNext;\n                        }\n\n                        setStatus(fetchesInProgress ? DataSourceStatus.waiting : DataSourceStatus.ready);\n                    }\n                }\n\n                function postFetch() {\n                    if (!fetchesPosted) {\n                        fetchesPosted = true;\n                        Scheduler.schedule(function VDS_async_postFetch() {\n                            fetchesPosted = false;\n                            fetchItemsForAllSlots();\n\n                            // A mirage sequence might have been removed\n                            finishNotifications();\n                        }, Scheduler.Priority.max, null, \"WinJS.UI.ListDataSource._fetch\");\n                    }\n                }\n\n                // Fetch Result Processing\n\n                function itemChanged(slot) {\n                    var itemNew = slot.itemNew;\n\n                    if (!itemNew) {\n                        return false;\n                    }\n\n                    var item = slot.item;\n\n                    for (var property in item) {\n                        switch (property) {\n                            case \"data\":\n                                // This is handled below\n                                break;\n\n                            default:\n                                if (item[property] !== itemNew[property]) {\n                                    return true;\n                                }\n                                break;\n                        }\n                    }\n\n                    return (\n                        listDataAdapter.compareByIdentity ?\n                            item.data !== itemNew.data :\n                            slot.signature !== itemSignature(itemNew)\n                    );\n                }\n\n                function changeSlotIfNecessary(slot) {\n                    if (!slotRequested(slot)) {\n                        // There's no need for any notifications, just delete the old item\n                        slot.item = null;\n                    } else if (itemChanged(slot)) {\n                        changeSlot(slot);\n                    } else {\n                        slot.itemNew = null;\n                    }\n                }\n\n                function updateSlotItem(slot) {\n                    if (slot.item) {\n                        changeSlotIfNecessary(slot);\n                    } else {\n                        completeFetchPromises(slot);\n                    }\n                }\n\n                function updateSlot(slot, item) {\n                    if (!slot.key) {\n                        setSlotKey(slot, item.key);\n                    }\n                    slot.itemNew = item;\n\n                    updateSlotItem(slot);\n                }\n\n                function sendMirageNotifications(slot, slotToDiscard, listBindingIDsToDelete) {\n                    var bindingMap = slotToDiscard.bindingMap;\n                    if (bindingMap) {\n                        for (var listBindingID in listBindingIDsToDelete) {\n                            if (bindingMap[listBindingID]) {\n                                var fetchListeners = slotToDiscard.fetchListeners;\n                                for (var listenerID in fetchListeners) {\n                                    var listener = fetchListeners[listenerID];\n\n                                    if (listener.listBindingID === listBindingID && listener.retained) {\n                                        delete fetchListeners[listenerID];\n                                        listener.complete(null);\n                                    }\n                                }\n\n                                var bindingRecord = bindingMap[listBindingID].bindingRecord;\n                                handlerToNotify(bindingRecord).removed(handleForBinding(slotToDiscard, listBindingID), true, handleForBinding(slot, listBindingID));\n\n                                // A re-entrant call to release from the removed handler might have cleared slotToDiscard.bindingMap\n                                if (slotToDiscard.bindingMap) {\n                                    delete slotToDiscard.bindingMap[listBindingID];\n                                }\n                            }\n                        }\n                    }\n                }\n\n                function mergeSlots(slot, slotToDiscard) {\n                    // This shouldn't be called on a slot that has a pending change notification\n                    // Only one of the two slots should have a key\n                    // If slotToDiscard is about to acquire an index, send the notifications now; in rare cases, multiple\n                    // indexChanged notifications will be sent for a given item during a refresh, but that's fine.\n                    if (slot.index !== slotToDiscard.index) {\n                        // If slotToDiscard has a defined index, that should have been transferred already\n                        var indexOld = slotToDiscard.index;\n                        slotToDiscard.index = slot.index;\n                        sendIndexChangedNotifications(slotToDiscard, indexOld);\n                    }\n\n                    slotToDiscard.slotMergedWith = slot;\n\n                    // Transfer the slotBindings from slotToDiscard to slot\n                    var bindingMap = slotToDiscard.bindingMap;\n                    for (var listBindingID in bindingMap) {\n                        if (!slot.bindingMap) {\n                            slot.bindingMap = {};\n                        }\n\n                        var slotBinding = bindingMap[listBindingID];\n\n                        if (!slotBinding.handle) {\n                            slotBinding.handle = slotToDiscard.handle;\n                        }\n                        handleMap[slotBinding.handle] = slot;\n\n                        slot.bindingMap[listBindingID] = slotBinding;\n                    }\n\n                    // Update any ListBinding cursors pointing to slotToDiscard\n                    forEachBindingRecord(function (bindingRecord) {\n                        bindingRecord.adjustCurrentSlot(slotToDiscard, slot);\n                    });\n\n                    // See if the item needs to be transferred from slotToDiscard to slot\n                    var item = slotToDiscard.itemNew || slotToDiscard.item;\n                    if (item) {\n                        item = Object.create(item);\n                        defineCommonItemProperties(item, slot, slot.handle);\n                        updateSlot(slot, item);\n                    }\n\n                    // Transfer the fetch listeners from slotToDiscard to slot, or complete them if item is known\n                    if (slot.item) {\n                        if (slotToDiscard.directFetchListeners) {\n                            fetchCompleteCallbacks.push(function () {\n                                completePromises(slot.item, slotToDiscard.directFetchListeners);\n                            });\n                        }\n                        if (slotToDiscard.fetchListeners) {\n                            fetchCompleteCallbacks.push(function () {\n                                completePromises(slot.item, slotToDiscard.fetchListeners);\n                            });\n                        }\n                    } else {\n                        var listenerID;\n\n                        for (listenerID in slotToDiscard.directFetchListeners) {\n                            if (!slot.directFetchListeners) {\n                                slot.directFetchListeners = {};\n                            }\n                            slot.directFetchListeners[listenerID] = slotToDiscard.directFetchListeners[listenerID];\n                        }\n\n                        for (listenerID in slotToDiscard.fetchListeners) {\n                            if (!slot.fetchListeners) {\n                                slot.fetchListeners = {};\n                            }\n                            slot.fetchListeners[listenerID] = slotToDiscard.fetchListeners[listenerID];\n                        }\n                    }\n\n                    // This might be the first time this slot's item can be prepared\n                    if (slot.itemNew) {\n                        completeFetchPromises(slot);\n                    }\n\n                    // Give slotToDiscard an unused handle so it appears to be permanently removed\n                    slotToDiscard.handle = (nextHandle++).toString();\n\n                    splitSequence(slotToDiscard);\n                    removeSlotPermanently(slotToDiscard);\n                }\n\n                function mergeSlotsAndItem(slot, slotToDiscard, item) {\n                    if (slotToDiscard && slotToDiscard.key) {\n                        if (!item) {\n                            item = slotToDiscard.itemNew || slotToDiscard.item;\n                        }\n\n                        // Free up the key for the promoted slot\n                        delete slotToDiscard.key;\n                        delete keyMap[item.key];\n\n                        slotToDiscard.itemNew = null;\n                        slotToDiscard.item = null;\n                    }\n\n                    if (item) {\n                        updateSlot(slot, item);\n                    }\n\n                    if (slotToDiscard) {\n                        mergeSlots(slot, slotToDiscard);\n                    }\n                }\n\n                function slotFromResult(result) {\n                    if (typeof result !== \"object\") {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidItemReturned\", strings.invalidItemReturned);\n                    } else if (result === startMarker) {\n                        return slotsStart;\n                    } else if (result === endMarker) {\n                        return slotListEnd;\n                    } else if (!result.key) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidKeyReturned\", strings.invalidKeyReturned);\n                    } else {\n                        if (_BaseUtils.validation) {\n                            validateKey(result.key);\n                        }\n                        return keyMap[result.key];\n                    }\n                }\n\n                function matchSlot(slot, result) {\n                    // First see if there is an existing slot that needs to be merged\n                    var slotExisting = slotFromResult(result);\n                    if (slotExisting === slot) {\n                        slotExisting = null;\n                    }\n\n                    if (slotExisting) {\n                        sendMirageNotifications(slot, slotExisting, slot.bindingMap);\n                    }\n\n                    mergeSlotsAndItem(slot, slotExisting, result);\n                }\n\n                function promoteSlot(slot, item, index, insertionPoint) {\n                    if (item && slot.key && slot.key !== item.key) {\n                        // A contradiction has been found\n                        beginRefresh();\n                        return false;\n                    }\n\n                    // The slot with the key \"wins\"; slots without bindings can be merged without any change in observable behavior\n\n                    var slotWithIndex = indexMap[index];\n                    if (slotWithIndex) {\n                        if (slotWithIndex === slot) {\n                            slotWithIndex = null;\n                        } else if (slotWithIndex.key && (slot.key || (item && slotWithIndex.key !== item.key))) {\n                            // A contradiction has been found\n                            beginRefresh();\n                            return false;\n                        } else if (!slot.key && slotWithIndex.bindingMap) {\n                            return false;\n                        }\n                    }\n\n                    var slotWithKey;\n                    if (item) {\n                        slotWithKey = keyMap[item.key];\n\n                        if (slotWithKey === slot) {\n                            slotWithKey = null;\n                        } else if (slotWithKey && slotWithKey.bindingMap) {\n                            return false;\n                        }\n                    }\n\n                    if (slotWithIndex) {\n                        sendMirageNotifications(slot, slotWithIndex, slot.bindingMap);\n\n                        // Transfer the index to the promoted slot\n                        delete indexMap[index];\n                        changeSlotIndex(slot, index);\n\n                        // See if this sequence should be merged with its neighbors\n                        if (slot.prev.index === index - 1) {\n                            mergeSequences(slot.prev);\n                        }\n                        if (slot.next.index === index + 1) {\n                            mergeSequences(slot);\n                        }\n\n                        insertionPoint.slotNext = slotWithIndex.slotNext;\n\n                        if (!item) {\n                            item = slotWithIndex.itemNew || slotWithIndex.item;\n                            if (item) {\n                                slotWithKey = keyMap[item.key];\n                            }\n                        }\n                    } else {\n                        changeSlotIndex(slot, index);\n                    }\n\n                    if (slotWithKey && slotWithIndex !== slotWithKey) {\n                        sendMirageNotifications(slot, slotWithKey, slot.bindingMap);\n                    }\n\n                    mergeSlotsAndItem(slot, slotWithKey, item);\n\n                    // Do this after mergeSlotsAndItem, since its call to updateSlot might send changed notifications, and those\n                    // wouldn't make sense to clients that never saw the old item.\n                    if (slotWithIndex && slotWithIndex !== slotWithKey) {\n                        mergeSlots(slot, slotWithIndex);\n                    }\n\n                    return true;\n                }\n\n                function mergeAdjacentSlot(slotExisting, slot, listBindingIDsToDelete) {\n                    if (slot.key && slotExisting.key && slot.key !== slotExisting.key) {\n                        // A contradiction has been found\n                        beginRefresh();\n                        return false;\n                    }\n\n                    for (var listBindingID in slotExisting.bindingMap) {\n                        listBindingIDsToDelete[listBindingID] = true;\n                    }\n\n                    sendMirageNotifications(slotExisting, slot, listBindingIDsToDelete);\n                    mergeSlotsAndItem(slotExisting, slot);\n\n                    return true;\n                }\n\n                function mergeSlotsBefore(slot, slotExisting) {\n                    var listBindingIDsToDelete = {};\n\n                    while (slot) {\n                        var slotPrev = (slot.firstInSequence ? null : slot.prev);\n\n                        if (!slotExisting.firstInSequence && slotExisting.prev === slotsStart) {\n                            deleteSlot(slot, true);\n                        } else {\n                            if (slotExisting.firstInSequence) {\n                                slotExisting = addSlotBefore(slotExisting, indexMap);\n                            } else {\n                                slotExisting = slotExisting.prev;\n                            }\n\n                            if (!mergeAdjacentSlot(slotExisting, slot, listBindingIDsToDelete)) {\n                                return;\n                            }\n                        }\n\n                        slot = slotPrev;\n                    }\n                }\n\n                function mergeSlotsAfter(slot, slotExisting) {\n                    var listBindingIDsToDelete = {};\n\n                    while (slot) {\n                        var slotNext = (slot.lastInSequence ? null : slot.next);\n\n                        if (!slotExisting.lastInSequence && slotExisting.next === slotListEnd) {\n                            deleteSlot(slot, true);\n                        } else {\n                            if (slotExisting.lastInSequence) {\n                                slotExisting = addSlotAfter(slotExisting, indexMap);\n                            } else {\n                                slotExisting = slotExisting.next;\n                            }\n\n                            if (!mergeAdjacentSlot(slotExisting, slot, listBindingIDsToDelete)) {\n                                return;\n                            }\n                        }\n\n                        slot = slotNext;\n                    }\n                }\n\n                function mergeSequencePairs(sequencePairsToMerge) {\n                    for (var i = 0; i < sequencePairsToMerge.length; i++) {\n                        var sequencePairToMerge = sequencePairsToMerge[i];\n                        mergeSlotsBefore(sequencePairToMerge.slotBeforeSequence, sequencePairToMerge.slotFirstInSequence);\n                        mergeSlotsAfter(sequencePairToMerge.slotAfterSequence, sequencePairToMerge.slotLastInSequence);\n                    }\n                }\n\n                // Removes any placeholders with indices that exceed the given upper bound on the count\n                function removeMirageIndices(countMax, indexFirstKnown) {\n                    var placeholdersAtEnd = 0;\n\n                    function removePlaceholdersAfterSlot(slotRemoveAfter) {\n                        for (var slot2 = slotListEnd.prev; !(slot2.index < countMax) && slot2 !== slotRemoveAfter;) {\n                            var slotPrev2 = slot2.prev;\n                            if (slot2.index !== undefined) {\n                                deleteSlot(slot2, true);\n                            }\n                            slot2 = slotPrev2;\n                        }\n\n                        placeholdersAtEnd = 0;\n                    }\n\n                    for (var slot = slotListEnd.prev; !(slot.index < countMax) || placeholdersAtEnd > 0;) {\n                        var slotPrev = slot.prev;\n\n                        if (slot === slotsStart) {\n                            removePlaceholdersAfterSlot(slotsStart);\n                            break;\n                        } else if (slot.key) {\n                            if (slot.index >= countMax) {\n                                beginRefresh();\n                                return false;\n                            } else if (slot.index >= indexFirstKnown) {\n                                removePlaceholdersAfterSlot(slot);\n                            } else {\n                                if (itemsFromKey) {\n                                    fetchItemsFromKey(slot, 0, placeholdersAtEnd);\n                                } else {\n                                    fetchItemsFromIndex(slot, 0, placeholdersAtEnd);\n                                }\n\n                                // Wait until the fetch has completed before doing anything\n                                return false;\n                            }\n                        } else if (slot.indexRequested || slot.firstInSequence) {\n                            removePlaceholdersAfterSlot(slotPrev);\n                        } else {\n                            placeholdersAtEnd++;\n                        }\n\n                        slot = slotPrev;\n                    }\n\n                    return true;\n                }\n\n                // Merges the results of a fetch into the slot list data structure, and determines if any notifications need to be\n                // synthesized.\n                function processResults(slot, results, offset, count, index) {\n                    var perfId = \"WinJS.UI.ListDataSource.processResults\";\n                    profilerMarkStart(perfId);\n\n                    index = validateIndexReturned(index);\n                    count = validateCountReturned(count);\n\n                    // If there are edits queued, we need to wait until the slots get back in sync with the data\n                    if (editsQueued) {\n                        profilerMarkEnd(perfId);\n                        return;\n                    }\n\n                    if (indexUpdateDeferred) {\n                        updateIndices();\n                    }\n\n                    // If the count has changed, and the end of the list has been reached, that's a contradiction\n                    if ((isNonNegativeNumber(count) || count === CountResult.unknown) && count !== knownCount && !slotListEnd.firstInSequence) {\n                        beginRefresh();\n                        profilerMarkEnd(perfId);\n                        return;\n                    }\n\n                    resultsProcessed = true;\n\n                    (function () {\n                        var i,\n                            j,\n                            resultsCount = results.length,\n                            slotExisting,\n                            slotBefore;\n\n                        // If an index wasn't passed in, see if the indices of these items can be determined\n                        if (typeof index !== \"number\") {\n                            for (i = 0; i < resultsCount; i++) {\n                                slotExisting = slotFromResult(results[i]);\n                                if (slotExisting && slotExisting.index !== undefined) {\n                                    index = slotExisting.index + offset - i;\n                                    break;\n                                }\n                            }\n                        }\n\n                        // See if these results include the end of the list\n                        if (typeof index === \"number\" && results[resultsCount - 1] === endMarker) {\n                            // If the count wasn't known, it is now\n                            count = index - offset + resultsCount - 1;\n                        } else if (isNonNegativeNumber(count) && (index === undefined || index === null)) {\n                            // If the index wasn't known, it is now\n                            index = count - (resultsCount - 1) + offset;\n                        }\n\n                        // If the count is known, remove any mirage placeholders at the end\n                        if (isNonNegativeNumber(count) && !removeMirageIndices(count, index - offset)) {\n                            // \"Forget\" the count - a subsequent fetch or refresh will update the count and list end\n                            count = undefined;\n                        }\n\n                        // Find any existing slots that correspond to the results, and check for contradictions\n                        var offsetMap = new Array(resultsCount);\n                        for (i = 0; i < resultsCount; i++) {\n                            var slotBestMatch = null;\n\n                            slotExisting = slotFromResult(results[i]);\n\n                            if (slotExisting) {\n                                // See if this item is currently adjacent to a different item, or has a different index\n                                if ((i > 0 && !slotExisting.firstInSequence && slotExisting.prev.key && slotExisting.prev.key !== results[i - 1].key) ||\n                                        (typeof index === \"number\" && slotExisting.index !== undefined && slotExisting.index !== index - offset + i)) {\n                                    // A contradiction has been found, so we can't proceed further\n                                    beginRefresh();\n                                    return;\n                                }\n\n                                if (slotExisting === slotsStart || slotExisting === slotListEnd || slotExisting.bindingMap) {\n                                    // First choice is a slot with the given key and at least one binding (or an end of the list)\n                                    slotBestMatch = slotExisting;\n                                }\n                            }\n\n                            if (typeof index === \"number\") {\n                                slotExisting = indexMap[index - offset + i];\n\n                                if (slotExisting) {\n                                    if (slotExisting.key && slotExisting.key !== results[i].key) {\n                                        // A contradiction has been found, so we can't proceed further\n                                        beginRefresh();\n                                        return;\n                                    }\n\n                                    if (!slotBestMatch && slotExisting.bindingMap) {\n                                        // Second choice is a slot with the given index and at least one binding\n                                        slotBestMatch = slotExisting;\n                                    }\n                                }\n                            }\n\n                            if (i === offset) {\n                                if ((slot.key && slot.key !== results[i].key) || (typeof slot.index === \"number\" && typeof index === \"number\" && slot.index !== index)) {\n                                    // A contradiction has been found, so we can't proceed further\n                                    beginRefresh();\n                                    return;\n                                }\n\n                                if (!slotBestMatch) {\n                                    // Third choice is the slot that was passed in\n                                    slotBestMatch = slot;\n                                }\n                            }\n\n                            offsetMap[i] = slotBestMatch;\n                        }\n\n                        // Update items with known indices (and at least one binding) first, as they will not be merged with\n                        // anything.\n                        for (i = 0; i < resultsCount; i++) {\n                            slotExisting = offsetMap[i];\n                            if (slotExisting && slotExisting.index !== undefined && slotExisting !== slotsStart && slotExisting !== slotListEnd) {\n                                matchSlot(slotExisting, results[i]);\n                            }\n                        }\n\n                        var sequencePairsToMerge = [];\n\n                        // Now process the sequences without indices\n                        var firstSequence = true;\n                        var slotBeforeSequence;\n                        var slotAfterSequence;\n                        for (i = 0; i < resultsCount; i++) {\n                            slotExisting = offsetMap[i];\n                            if (slotExisting && slotExisting !== slotListEnd) {\n                                var iLast = i;\n\n                                if (slotExisting.index === undefined) {\n                                    var insertionPoint = {};\n\n                                    promoteSlot(slotExisting, results[i], index - offset + i, insertionPoint);\n\n                                    // Find the extents of the sequence of slots that we can use\n                                    var slotFirstInSequence = slotExisting,\n                                        slotLastInSequence = slotExisting,\n                                        result;\n\n                                    for (j = i - 1; !slotFirstInSequence.firstInSequence; j--) {\n                                        // Keep going until we hit the start marker or a slot that we can't use or promote (it's ok\n                                        // if j leaves the results range).\n\n                                        result = results[j];\n                                        if (result === startMarker) {\n                                            break;\n                                        }\n\n                                        // Avoid assigning negative indices to slots\n                                        var index2 = index - offset + j;\n                                        if (index2 < 0) {\n                                            break;\n                                        }\n\n                                        if (promoteSlot(slotFirstInSequence.prev, result, index2, insertionPoint)) {\n                                            slotFirstInSequence = slotFirstInSequence.prev;\n                                            if (j >= 0) {\n                                                offsetMap[j] = slotFirstInSequence;\n                                            }\n                                        } else {\n                                            break;\n                                        }\n                                    }\n\n                                    for (j = i + 1; !slotLastInSequence.lastInSequence; j++) {\n                                        // Keep going until we hit the end marker or a slot that we can't use or promote (it's ok\n                                        // if j leaves the results range).\n\n                                        // If slotListEnd is in this sequence, it should not be separated from any predecessor\n                                        // slots, but they may need to be promoted.\n                                        result = results[j];\n                                        if ((result === endMarker || j === count) && slotLastInSequence.next !== slotListEnd) {\n                                            break;\n                                        }\n\n                                        if (slotLastInSequence.next === slotListEnd || promoteSlot(slotLastInSequence.next, result, index - offset + j, insertionPoint)) {\n                                            slotLastInSequence = slotLastInSequence.next;\n                                            if (j < resultsCount) {\n                                                offsetMap[j] = slotLastInSequence;\n                                            }\n\n                                            iLast = j;\n\n                                            if (slotLastInSequence === slotListEnd) {\n                                                break;\n                                            }\n                                        } else {\n                                            break;\n                                        }\n                                    }\n\n                                    slotBeforeSequence = (slotFirstInSequence.firstInSequence ? null : slotFirstInSequence.prev);\n                                    slotAfterSequence = (slotLastInSequence.lastInSequence ? null : slotLastInSequence.next);\n\n                                    if (slotBeforeSequence) {\n                                        splitSequence(slotBeforeSequence);\n                                    }\n                                    if (slotAfterSequence) {\n                                        splitSequence(slotLastInSequence);\n                                    }\n\n                                    // Move the sequence if necessary\n                                    if (typeof index === \"number\") {\n                                        if (slotLastInSequence === slotListEnd) {\n                                            // Instead of moving the list end, move the sequence before out of the way\n                                            if (slotBeforeSequence) {\n                                                moveSequenceAfter(slotListEnd, sequenceStart(slotBeforeSequence), slotBeforeSequence);\n                                            }\n                                        } else {\n                                            var slotInsertBefore = insertionPoint.slotNext;\n                                            if (!slotInsertBefore) {\n                                                slotInsertBefore = successorFromIndex(slotLastInSequence.index, indexMap, slotsStart, slotListEnd, true);\n                                            }\n                                            moveSequenceBefore(slotInsertBefore, slotFirstInSequence, slotLastInSequence);\n                                        }\n                                        if (slotFirstInSequence.prev.index === slotFirstInSequence.index - 1) {\n                                            mergeSequences(slotFirstInSequence.prev);\n                                        }\n                                        if (slotLastInSequence.next.index === slotLastInSequence.index + 1) {\n                                            mergeSequences(slotLastInSequence);\n                                        }\n                                    } else if (!firstSequence) {\n                                        slotBefore = offsetMap[i - 1];\n\n                                        if (slotBefore) {\n                                            if (slotFirstInSequence.prev !== slotBefore) {\n                                                if (slotLastInSequence === slotListEnd) {\n                                                    // Instead of moving the list end, move the sequence before out of the way and\n                                                    // the predecessor sequence into place.\n                                                    if (slotBeforeSequence) {\n                                                        moveSequenceAfter(slotListEnd, sequenceStart(slotBeforeSequence), slotBeforeSequence);\n                                                    }\n                                                    moveSequenceBefore(slotFirstInSequence, sequenceStart(slotBefore), slotBefore);\n                                                } else {\n                                                    moveSequenceAfter(slotBefore, slotFirstInSequence, slotLastInSequence);\n                                                }\n                                            }\n                                            mergeSequences(slotBefore);\n                                        }\n                                    }\n                                    firstSequence = false;\n\n                                    if (refreshRequested) {\n                                        return;\n                                    }\n\n                                    sequencePairsToMerge.push({\n                                        slotBeforeSequence: slotBeforeSequence,\n                                        slotFirstInSequence: slotFirstInSequence,\n                                        slotLastInSequence: slotLastInSequence,\n                                        slotAfterSequence: slotAfterSequence\n                                    });\n                                }\n\n                                // See if the fetched slot needs to be merged\n                                if (i === offset && slotExisting !== slot && !slotPermanentlyRemoved(slot)) {\n                                    slotBeforeSequence = (slot.firstInSequence ? null : slot.prev);\n                                    slotAfterSequence = (slot.lastInSequence ? null : slot.next);\n\n                                    sendMirageNotifications(slotExisting, slot, slotExisting.bindingMap);\n                                    mergeSlots(slotExisting, slot);\n\n                                    sequencePairsToMerge.push({\n                                        slotBeforeSequence: slotBeforeSequence,\n                                        slotFirstInSequence: slotExisting,\n                                        slotLastInSequence: slotExisting,\n                                        slotAfterSequence: slotAfterSequence\n                                    });\n                                }\n\n                                // Skip past all the other items in the sequence we just processed\n                                i = iLast;\n                            }\n                        }\n\n                        // If the count is known, set the index of the list end (wait until now because promoteSlot can sometimes\n                        // delete it; do this before mergeSequencePairs so the list end can have slots inserted immediately before\n                        // it).\n                        if (isNonNegativeNumber(count) && slotListEnd.index !== count) {\n                            changeSlotIndex(slotListEnd, count);\n                        }\n\n                        // Now that all the sequences have been moved, merge any colliding slots\n                        mergeSequencePairs(sequencePairsToMerge);\n\n                        // Match or cache any leftover items\n                        for (i = 0; i < resultsCount; i++) {\n                            // Find the first matched item\n                            slotExisting = offsetMap[i];\n                            if (slotExisting) {\n                                for (j = i - 1; j >= 0; j--) {\n                                    var slotAfter = offsetMap[j + 1];\n                                    matchSlot(offsetMap[j] = (slotAfter.firstInSequence ? addSlotBefore(offsetMap[j + 1], indexMap) : slotAfter.prev), results[j]);\n                                }\n                                for (j = i + 1; j < resultsCount; j++) {\n                                    slotBefore = offsetMap[j - 1];\n                                    slotExisting = offsetMap[j];\n                                    if (!slotExisting) {\n                                        matchSlot(offsetMap[j] = (slotBefore.lastInSequence ? addSlotAfter(slotBefore, indexMap) : slotBefore.next), results[j]);\n                                    } else if (slotExisting.firstInSequence) {\n                                        // Adding the cached items may result in some sequences merging\n                                        if (slotExisting.prev !== slotBefore) {\n                                            moveSequenceAfter(slotBefore, slotExisting, sequenceEnd(slotExisting));\n                                        }\n                                        mergeSequences(slotBefore);\n                                    }\n                                }\n                                break;\n                            }\n                        }\n\n                        // The description is no longer required\n                        delete slot.description;\n                    })();\n\n                    if (!refreshRequested) {\n                        // If the count changed, but that's the only thing, just send the notification\n                        if (count !== undefined && count !== knownCount) {\n                            changeCount(count);\n                        }\n\n                        // See if there are more requests we can now fulfill\n                        postFetch();\n                    }\n\n                    finishNotifications();\n\n                    // Finally complete any promises for newly obtained items\n                    callFetchCompleteCallbacks();\n                    profilerMarkEnd(perfId);\n                }\n\n                function processErrorResult(slot, error) {\n                    switch (error.name) {\n                        case FetchError.noResponse:\n                            setStatus(DataSourceStatus.failure);\n                            returnDirectFetchError(slot, error);\n                            break;\n\n                        case FetchError.doesNotExist:\n                            // Don't return an error, just complete with null (when the slot is deleted)\n\n                            if (slot.indexRequested) {\n                                // We now have an upper bound on the count\n                                removeMirageIndices(slot.index);\n                            } else if (slot.keyRequested || slot.description) {\n                                // This item, and any items in the same sequence, count as mirages, since they might never have\n                                // existed.\n                                deleteMirageSequence(slot);\n                            }\n\n                            finishNotifications();\n\n                            // It's likely that the client requested this item because something has changed since the client's\n                            // latest observations of the data.  Begin a refresh just in case.\n                            beginRefresh();\n                            break;\n                    }\n                }\n\n                function processResultsForIndex(indexRequested, slot, results, offset, count, index) {\n                    index = validateIndexReturned(index);\n                    count = validateCountReturned(count);\n\n                    var indexFirst = indexRequested - offset;\n\n                    var resultsCount = results.length;\n                    if (slot.index >= indexFirst && slot.index < indexFirst + resultsCount) {\n                        // The item is in this batch of results - process them all\n                        processResults(slot, results, slot.index - indexFirst, count, slot.index);\n                    } else if ((offset === resultsCount - 1 && indexRequested < slot.index) || (isNonNegativeNumber(count) && count <= slot.index)) {\n                        // The requested index does not exist\n                        processErrorResult(slot, new _ErrorFromName(FetchError.doesNotExist));\n                    } else {\n                        // We didn't get all the results we requested - pick up where they left off\n                        if (slot.index < indexFirst) {\n                            var fetchID = setFetchIDs(slot, 0, indexFirst - slot.index);\n                            fetchItemsForIndex(indexFirst, slot, fetchID, itemsFromKey(\n                                fetchID,\n                                results[0].key,\n                                indexFirst - slot.index,\n                                0\n                            ));\n                        } else {\n                            var indexLast = indexFirst + resultsCount - 1;\n                            var fetchID = setFetchIDs(slot, slot.index - indexLast, 0);\n                            fetchItemsForIndex(indexLast, slot, fetchID, itemsFromKey(\n                                fetchID,\n                                results[resultsCount - 1].key,\n                                0,\n                                slot.index - indexLast\n                            ));\n                        }\n                    }\n                }\n\n                function processErrorResultForIndex(indexRequested, slot, error) {\n                    // If the request was for an index other than the initial one, and the result was doesNotExist, this doesn't\n                    switch (error.name) {\n                        case FetchError.doesNotExist:\n                            if (indexRequested === slotsStart.index) {\n                                // The request was for the start of the list, so the item must not exist, and we now have an upper\n                                // bound of zero for the count.\n                                removeMirageIndices(0);\n\n                                processErrorResult(slot, error);\n\n                                // No need to check return value of removeMirageIndices, since processErrorResult is going to start\n                                // a refresh anyway.\n                            } else {\n                                // Something has changed, but this index might still exist, so request a refresh\n                                beginRefresh();\n                            }\n                            break;\n\n                        default:\n                            processErrorResult(slot, error);\n                            break;\n                    }\n                }\n\n                // Refresh\n\n                function identifyRefreshCycle() {\n                    // find refresh cycles, find the first beginRefresh in the refreshHistory and see whether it\n                    // matches the next beginRefresh, if so then move the data source into an error state and stop\n                    // refreshing.\n                    var start = 0;\n                    for (; start < refreshHistory.length; start++) {\n                        if (refreshHistory[start].kind === \"beginRefresh\") {\n                            break;\n                        }\n                    }\n                    var end = start;\n                    for (; end < refreshHistory.length; end++) {\n                        if (refreshHistory[end].kind === \"beginRefresh\") {\n                            break;\n                        }\n                    }\n                    if (end > start && (end + (end - start) < refreshHistory.length)) {\n                        var match = true;\n                        var length = end - start;\n                        for (var i = 0; i < length; i++) {\n                            if (refreshHistory[start + i].kind !== refreshHistory[end + i].kind) {\n                                match = false;\n                                break;\n                            }\n                        }\n                        if (match) {\n                            if (_Log.log) {\n                                _Log.log(strings.refreshCycleIdentified, \"winjs vds\", \"error\");\n                                for (var i = start; i < end; i++) {\n                                    _Log.log(\"\" + (i - start) + \": \" + JSON.stringify(refreshHistory[i]), \"winjs vds\", \"error\");\n                                }\n                            }\n                        }\n                        return match;\n                    }\n                }\n\n                function resetRefreshState() {\n                    if (++beginRefreshCount > MAX_BEGINREFRESH_COUNT) {\n                        if (identifyRefreshCycle()) {\n                            setStatus(DataSourceStatus.failure);\n                            return;\n                        }\n                    }\n                    refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: \"beginRefresh\" };\n\n                    // Give the start sentinel an index so we can always use predecessor + 1\n                    refreshStart = {\n                        firstInSequence: true,\n                        lastInSequence: true,\n                        index: -1\n                    };\n                    refreshEnd = {\n                        firstInSequence: true,\n                        lastInSequence: true\n                    };\n                    refreshStart.next = refreshEnd;\n                    refreshEnd.prev = refreshStart;\n\n                    refreshItemsFetched = false;\n                    refreshCount = undefined;\n                    keyFetchIDs = {};\n                    refreshKeyMap = {};\n                    refreshIndexMap = {};\n                    refreshIndexMap[-1] = refreshStart;\n                    deletedKeys = {};\n                }\n\n                function beginRefresh() {\n                    if (refreshRequested) {\n                        // There's already a refresh that has yet to start\n                        return;\n                    }\n\n                    refreshRequested = true;\n\n                    setStatus(DataSourceStatus.waiting);\n\n                    if (waitForRefresh) {\n                        waitForRefresh = false;\n\n                        // The edit queue has been paused until the next refresh - resume it now\n                        applyNextEdit();\n                        return;\n                    }\n\n                    if (editsQueued) {\n                        // The refresh will be started once the edit queue empties out\n                        return;\n                    }\n\n                    var refreshID = ++currentRefreshID;\n                    refreshInProgress = true;\n                    refreshFetchesInProgress = 0;\n\n                    // Batch calls to beginRefresh\n                    Scheduler.schedule(function VDS_async_beginRefresh() {\n                        if (currentRefreshID !== refreshID) {\n                            return;\n                        }\n\n                        refreshRequested = false;\n\n                        resetRefreshState();\n\n                        // Remove all slots that aren't live, so we don't waste time fetching them\n                        for (var slot = slotsStart.next; slot !== slotsEnd;) {\n                            var slotNext = slot.next;\n\n                            if (!slotLive(slot) && slot !== slotListEnd) {\n                                deleteUnnecessarySlot(slot);\n                            }\n\n                            slot = slotNext;\n                        }\n\n                        startRefreshFetches();\n                    }, Scheduler.Priority.high, null, \"WinJS.VirtualizedDataSource.beginRefresh\");\n                }\n\n                function requestRefresh() {\n                    refreshSignal = refreshSignal || new _Signal();\n\n                    beginRefresh();\n\n                    return refreshSignal.promise;\n                }\n\n                function resultsValidForRefresh(refreshID, fetchID) {\n                    // This fetch has completed, whatever it has returned\n                    delete fetchesInProgress[fetchID];\n\n                    if (refreshID !== currentRefreshID) {\n                        // This information is out of date.  Ignore it.\n                        return false;\n                    }\n\n                    refreshFetchesInProgress--;\n\n                    return true;\n                }\n\n                function fetchItemsForRefresh(key, fromStart, fetchID, promiseItems, index) {\n                    var refreshID = currentRefreshID;\n\n                    refreshFetchesInProgress++;\n\n                    promiseItems.then(function (fetchResult) {\n                        if (fetchResult.items && fetchResult.items.length) {\n                            var perfID = \"itemsFetched id=\" + fetchID + \" count=\" + fetchResult.items.length;\n                            profilerMarkStart(perfID);\n                            if (resultsValidForRefresh(refreshID, fetchID)) {\n                                addMarkers(fetchResult);\n                                processRefreshResults(key, fetchResult.items, fetchResult.offset, fetchResult.totalCount, (typeof index === \"number\" ? index : fetchResult.absoluteIndex));\n                            }\n                            profilerMarkEnd(perfID);\n                        } else {\n                            return Promise.wrapError(new _ErrorFromName(FetchError.doesNotExist));\n                        }\n                    }).then(null, function (error) {\n                        if (resultsValidForRefresh(refreshID, fetchID)) {\n                            processRefreshErrorResult(key, fromStart, error);\n                        }\n                    });\n                }\n\n                function refreshRange(slot, fetchID, countBefore, countAfter) {\n                    if (itemsFromKey) {\n                        // Keys are the preferred identifiers when the item might have moved\n                        fetchItemsForRefresh(slot.key, false, fetchID, itemsFromKey(fetchID, slot.key, countBefore, countAfter, slot.hints));\n                    } else {\n                        // Request additional items to try to locate items that have moved\n                        var searchDelta = 10,\n                            index = slot.index;\n\n                        if (refreshIndexMap[index] && refreshIndexMap[index].firstInSequence) {\n                            // Ensure at least one element is observed before this one\n                            fetchItemsForRefresh(slot.key, false, fetchID, itemsFromIndex(fetchID, index - 1, Math.min(countBefore + searchDelta, index) - 1, countAfter + 1 + searchDelta), index - 1);\n                        } else if (refreshIndexMap[index] && refreshIndexMap[index].lastInSequence) {\n                            // Ask for the next index we need directly\n                            fetchItemsForRefresh(slot.key, false, fetchID, itemsFromIndex(fetchID, index + 1, Math.min(countBefore + searchDelta, index) + 1, countAfter - 1 + searchDelta), index + 1);\n                        } else {\n                            fetchItemsForRefresh(slot.key, false, fetchID, itemsFromIndex(fetchID, index, Math.min(countBefore + searchDelta, index), countAfter + searchDelta), index);\n                        }\n                    }\n                }\n\n                function refreshFirstItem(fetchID) {\n                    if (itemsFromStart) {\n                        fetchItemsForRefresh(null, true, fetchID, itemsFromStart(fetchID, 1), 0);\n                    } else if (itemsFromIndex) {\n                        fetchItemsForRefresh(null, true, fetchID, itemsFromIndex(fetchID, 0, 0, 0), 0);\n                    }\n                }\n\n                function keyFetchInProgress(key) {\n                    return fetchesInProgress[keyFetchIDs[key]];\n                }\n\n                function refreshRanges(slotFirst, allRanges) {\n                    // Fetch a few extra items each time, to catch insertions without requiring an extra fetch\n                    var refreshFetchExtra = 3;\n\n                    var refreshID = currentRefreshID;\n\n                    var slotFetchFirst,\n                        slotRefreshFirst,\n                        fetchCount = 0,\n                        fetchID;\n\n                    // Walk through the slot list looking for keys we haven't fetched or attempted to fetch yet.  Rely on the\n                    // heuristic that items that were close together before the refresh are likely to remain so after, so batched\n                    // fetches will locate most of the previously fetched items.\n                    for (var slot = slotFirst; slot !== slotsEnd; slot = slot.next) {\n                        if (!slotFetchFirst && slot.key && !deletedKeys[slot.key] && !keyFetchInProgress(slot.key)) {\n                            var slotRefresh = refreshKeyMap[slot.key];\n\n                            // Keep attempting to fetch an item until at least one item on either side of it has been observed, so\n                            // we can determine its position relative to others.\n                            if (!slotRefresh || slotRefresh.firstInSequence || slotRefresh.lastInSequence) {\n                                slotFetchFirst = slot;\n                                slotRefreshFirst = slotRefresh;\n                                fetchID = newFetchID();\n                            }\n                        }\n\n                        if (!slotFetchFirst) {\n                            // Also attempt to fetch placeholders for requests for specific keys, just in case those items no\n                            // longer exist.\n                            if (slot.key && isPlaceholder(slot) && !deletedKeys[slot.key]) {\n                                // Fulfill each \"itemFromKey\" request\n                                if (!refreshKeyMap[slot.key]) {\n                                    // Fetch at least one item before and after, just to verify item's position in list\n                                    fetchID = newFetchID();\n                                    fetchItemsForRefresh(slot.key, false, fetchID, itemsFromKey(fetchID, slot.key, 1, 1, slot.hints));\n                                }\n                            }\n                        } else {\n                            var keyAlreadyFetched = keyFetchInProgress(slot.key);\n\n                            if (!deletedKeys[slot.key] && !refreshKeyMap[slot.key] && !keyAlreadyFetched) {\n                                if (slot.key) {\n                                    keyFetchIDs[slot.key] = fetchID;\n                                }\n                                fetchCount++;\n                            }\n\n                            if (slot.lastInSequence || slot.next === slotListEnd || keyAlreadyFetched) {\n                                refreshRange(slotFetchFirst, fetchID, (!slotRefreshFirst || slotRefreshFirst.firstInSequence ? refreshFetchExtra : 0), fetchCount - 1 + refreshFetchExtra);\n\n                                if (!allRanges) {\n                                    break;\n                                }\n\n                                slotFetchFirst = null;\n                                fetchCount = 0;\n                            }\n                        }\n                    }\n\n                    if (refreshFetchesInProgress === 0 && !refreshItemsFetched && currentRefreshID === refreshID) {\n                        // If nothing was successfully fetched, try fetching the first item, to detect an empty list\n                        refreshFirstItem(newFetchID());\n                    }\n\n                }\n\n                function startRefreshFetches() {\n                    var refreshID = currentRefreshID;\n\n                    do {\n                        synchronousProgress = false;\n                        reentrantContinue = true;\n                        refreshRanges(slotsStart.next, true);\n                        reentrantContinue = false;\n                    } while (refreshFetchesInProgress === 0 && synchronousProgress && currentRefreshID === refreshID && refreshInProgress);\n\n                    if (refreshFetchesInProgress === 0 && currentRefreshID === refreshID) {\n                        concludeRefresh();\n                    }\n                }\n\n                function continueRefresh(key) {\n                    var refreshID = currentRefreshID;\n\n                    // If the key is absent, then the attempt to fetch the first item just completed, and there is nothing else to\n                    // fetch.\n                    if (key) {\n                        var slotContinue = keyMap[key];\n                        if (!slotContinue) {\n                            // In a rare case, the slot might have been deleted; just start scanning from the beginning again\n                            slotContinue = slotsStart.next;\n                        }\n\n                        do {\n                            synchronousRefresh = false;\n                            reentrantRefresh = true;\n                            refreshRanges(slotContinue, false);\n                            reentrantRefresh = false;\n                        } while (synchronousRefresh && currentRefreshID === refreshID && refreshInProgress);\n                    }\n\n                    if (reentrantContinue) {\n                        synchronousProgress = true;\n                    } else {\n                        if (refreshFetchesInProgress === 0 && currentRefreshID === refreshID) {\n                            // Walk through the entire list one more time, in case any edits were made during the refresh\n                            startRefreshFetches();\n                        }\n                    }\n                }\n\n                function slotRefreshFromResult(result) {\n                    if (typeof result !== \"object\" || !result) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidItemReturned\", strings.invalidItemReturned);\n                    } else if (result === startMarker) {\n                        return refreshStart;\n                    } else if (result === endMarker) {\n                        return refreshEnd;\n                    } else if (!result.key) {\n                        throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidKeyReturned\", strings.invalidKeyReturned);\n                    } else {\n                        return refreshKeyMap[result.key];\n                    }\n                }\n\n                function processRefreshSlotIndex(slot, expectedIndex) {\n                    while (slot.index === undefined) {\n                        setSlotIndex(slot, expectedIndex, refreshIndexMap);\n\n                        if (slot.firstInSequence) {\n                            return true;\n                        }\n\n                        slot = slot.prev;\n                        expectedIndex--;\n                    }\n\n                    if (slot.index !== expectedIndex) {\n                        // Something has changed since the refresh began; start again\n                        beginRefresh();\n                        return false;\n                    }\n\n                    return true;\n                }\n\n                function setRefreshSlotResult(slotRefresh, result) {\n                    slotRefresh.key = result.key;\n                    refreshKeyMap[slotRefresh.key] = slotRefresh;\n\n                    slotRefresh.item = result;\n                }\n\n                // Returns the slot after the last insertion point between sequences\n                function lastRefreshInsertionPoint() {\n                    var slotNext = refreshEnd;\n                    while (!slotNext.firstInSequence) {\n                        slotNext = slotNext.prev;\n\n                        if (slotNext === refreshStart) {\n                            return null;\n                        }\n                    }\n\n                    return slotNext;\n                }\n\n                function processRefreshResults(key, results, offset, count, index) {\n                    index = validateIndexReturned(index);\n                    count = validateCountReturned(count);\n\n                    var keyPresent = false;\n\n                    refreshItemsFetched = true;\n\n                    var indexFirst = index - offset,\n                        result = results[0];\n\n                    if (result.key === key) {\n                        keyPresent = true;\n                    }\n\n                    var slot = slotRefreshFromResult(result);\n                    if (!slot) {\n                        if (refreshIndexMap[indexFirst]) {\n                            // Something has changed since the refresh began; start again\n                            beginRefresh();\n                            return;\n                        }\n\n                        // See if these results should be appended to an existing sequence\n                        var slotPrev;\n                        if (index !== undefined && (slotPrev = refreshIndexMap[indexFirst - 1])) {\n                            if (!slotPrev.lastInSequence) {\n                                // Something has changed since the refresh began; start again\n                                beginRefresh();\n                                return;\n                            }\n                            slot = addSlotAfter(slotPrev, refreshIndexMap);\n                        } else {\n                            // Create a new sequence\n                            var slotSuccessor = (\n                                +indexFirst === indexFirst ?\n                                    successorFromIndex(indexFirst, refreshIndexMap, refreshStart, refreshEnd) :\n                                    lastRefreshInsertionPoint(refreshStart, refreshEnd)\n                            );\n\n                            if (!slotSuccessor) {\n                                // Something has changed since the refresh began; start again\n                                beginRefresh();\n                                return;\n                            }\n\n                            slot = createSlotSequence(slotSuccessor, indexFirst, refreshIndexMap);\n                        }\n\n                        setRefreshSlotResult(slot, results[0]);\n                    } else {\n                        if (+indexFirst === indexFirst) {\n                            if (!processRefreshSlotIndex(slot, indexFirst)) {\n                                return;\n                            }\n                        }\n                    }\n\n                    var resultsCount = results.length;\n                    for (var i = 1; i < resultsCount; i++) {\n                        result = results[i];\n\n                        if (result.key === key) {\n                            keyPresent = true;\n                        }\n\n                        var slotNext = slotRefreshFromResult(result);\n\n                        if (!slotNext) {\n                            if (!slot.lastInSequence) {\n                                // Something has changed since the refresh began; start again\n                                beginRefresh();\n                                return;\n                            }\n                            slotNext = addSlotAfter(slot, refreshIndexMap);\n                            setRefreshSlotResult(slotNext, result);\n                        } else {\n                            if (slot.index !== undefined && !processRefreshSlotIndex(slotNext, slot.index + 1)) {\n                                return;\n                            }\n\n                            // If the slots aren't adjacent, see if it's possible to reorder sequences to make them so\n                            if (slotNext !== slot.next) {\n                                if (!slot.lastInSequence || !slotNext.firstInSequence) {\n                                    // Something has changed since the refresh began; start again\n                                    beginRefresh();\n                                    return;\n                                }\n\n                                var slotLast = sequenceEnd(slotNext);\n                                if (slotLast !== refreshEnd) {\n                                    moveSequenceAfter(slot, slotNext, slotLast);\n                                } else {\n                                    var slotFirst = sequenceStart(slot);\n                                    if (slotFirst !== refreshStart) {\n                                        moveSequenceBefore(slotNext, slotFirst, slot);\n                                    } else {\n                                        // Something has changed since the refresh began; start again\n                                        beginRefresh();\n                                        return;\n                                    }\n                                }\n\n                                mergeSequences(slot);\n                            } else if (slot.lastInSequence) {\n                                mergeSequences(slot);\n                            }\n                        }\n\n                        slot = slotNext;\n                    }\n\n                    if (!keyPresent) {\n                        deletedKeys[key] = true;\n                    }\n\n                    // If the count wasn't provided, see if it can be determined from the end of the list.\n                    if (!isNonNegativeNumber(count) && !refreshEnd.firstInSequence) {\n                        var indexLast = refreshEnd.prev.index;\n                        if (indexLast !== undefined) {\n                            count = indexLast + 1;\n                        }\n                    }\n\n                    if (isNonNegativeNumber(count) || count === CountResult.unknown) {\n                        if (isNonNegativeNumber(refreshCount)) {\n                            if (count !== refreshCount) {\n                                // Something has changed since the refresh began; start again\n                                beginRefresh();\n                                return;\n                            }\n                        } else {\n                            refreshCount = count;\n                        }\n\n                        if (isNonNegativeNumber(refreshCount) && !refreshIndexMap[refreshCount]) {\n                            setSlotIndex(refreshEnd, refreshCount, refreshIndexMap);\n                        }\n                    }\n\n                    if (reentrantRefresh) {\n                        synchronousRefresh = true;\n                    } else {\n                        continueRefresh(key);\n                    }\n                }\n\n                function processRefreshErrorResult(key, fromStart, error) {\n                    switch (error.name) {\n                        case FetchError.noResponse:\n                            setStatus(DataSourceStatus.failure);\n                            break;\n\n                        case FetchError.doesNotExist:\n                            if (fromStart) {\n                                // The attempt to fetch the first item failed, so the list must be empty\n                                setSlotIndex(refreshEnd, 0, refreshIndexMap);\n                                refreshCount = 0;\n\n                                concludeRefresh();\n                            } else {\n                                deletedKeys[key] = true;\n\n                                if (reentrantRefresh) {\n                                    synchronousRefresh = true;\n                                } else {\n                                    continueRefresh(key);\n                                }\n                            }\n                            break;\n                    }\n                }\n\n                function slotFromSlotRefresh(slotRefresh) {\n                    if (slotRefresh === refreshStart) {\n                        return slotsStart;\n                    } else if (slotRefresh === refreshEnd) {\n                        return slotListEnd;\n                    } else {\n                        return keyMap[slotRefresh.key];\n                    }\n                }\n\n                function slotRefreshFromSlot(slot) {\n                    if (slot === slotsStart) {\n                        return refreshStart;\n                    } else if (slot === slotListEnd) {\n                        return refreshEnd;\n                    } else {\n                        return refreshKeyMap[slot.key];\n                    }\n                }\n\n                function mergeSequencesForRefresh(slotPrev) {\n                    mergeSequences(slotPrev);\n\n                    // Mark the merge point, so we can distinguish insertions from unrequested items\n                    slotPrev.next.mergedForRefresh = true;\n                }\n\n                function copyRefreshSlotData(slotRefresh, slot) {\n                    setSlotKey(slot, slotRefresh.key);\n                    slot.itemNew = slotRefresh.item;\n                }\n\n                function addNewSlotFromRefresh(slotRefresh, slotNext, insertAfter) {\n                    var slotNew = createPrimarySlot();\n\n                    copyRefreshSlotData(slotRefresh, slotNew);\n                    insertAndMergeSlot(slotNew, slotNext, insertAfter, !insertAfter);\n\n                    var index = slotRefresh.index;\n                    if (+index !== index) {\n                        index = (insertAfter ? slotNew.prev.index + 1 : slotNext.next.index - 1);\n                    }\n\n                    setSlotIndex(slotNew, index, indexMap);\n\n                    return slotNew;\n                }\n\n                function matchSlotForRefresh(slotExisting, slot, slotRefresh) {\n                    if (slotExisting) {\n                        sendMirageNotifications(slotExisting, slot, slotExisting.bindingMap);\n                        mergeSlotsAndItem(slotExisting, slot, slotRefresh.item);\n                    } else {\n                        copyRefreshSlotData(slotRefresh, slot);\n\n                        // If the index was requested, complete the promises now, as the index might be about to change\n                        if (slot.indexRequested) {\n                            updateSlotItem(slot);\n                        }\n                    }\n                }\n\n                function updateSlotForRefresh(slotExisting, slot, slotRefresh) {\n                    if (!slot.key) {\n                        if (slotExisting) {\n                            // Record the relationship between the slot to discard and its neighbors\n                            slotRefresh.mergeWithPrev = !slot.firstInSequence;\n                            slotRefresh.mergeWithNext = !slot.lastInSequence;\n                        } else {\n                            slotRefresh.stationary = true;\n                        }\n                        matchSlotForRefresh(slotExisting, slot, slotRefresh);\n                        return true;\n                    } else {\n                        return false;\n                    }\n                }\n\n                function indexForRefresh(slot) {\n                    var indexNew;\n\n                    if (slot.indexRequested) {\n                        indexNew = slot.index;\n                    } else {\n                        var slotRefresh = slotRefreshFromSlot(slot);\n                        if (slotRefresh) {\n                            indexNew = slotRefresh.index;\n                        }\n                    }\n\n                    return indexNew;\n                }\n\n                function concludeRefresh() {\n                    beginRefreshCount = 0;\n                    refreshHistory = new Array(100);\n                    refreshHistoryPos = -1;\n\n                    indexUpdateDeferred = true;\n\n                    keyFetchIDs = {};\n\n                    var i,\n                        j,\n                        slot,\n                        slotPrev,\n                        slotNext,\n                        slotBefore,\n                        slotAfter,\n                        slotRefresh,\n                        slotExisting,\n                        slotFirstInSequence,\n                        sequenceCountOld,\n                        sequencesOld = [],\n                        sequenceOld,\n                        sequenceOldPrev,\n                        sequenceOldBestMatch,\n                        sequenceCountNew,\n                        sequencesNew = [],\n                        sequenceNew,\n                        index,\n                        offset;\n\n                    // Assign a sequence number to each refresh slot\n                    sequenceCountNew = 0;\n                    for (slotRefresh = refreshStart; slotRefresh; slotRefresh = slotRefresh.next) {\n                        slotRefresh.sequenceNumber = sequenceCountNew;\n\n                        if (slotRefresh.firstInSequence) {\n                            slotFirstInSequence = slotRefresh;\n                        }\n\n                        if (slotRefresh.lastInSequence) {\n                            sequencesNew[sequenceCountNew] = {\n                                first: slotFirstInSequence,\n                                last: slotRefresh,\n                                matchingItems: 0\n                            };\n                            sequenceCountNew++;\n                        }\n                    }\n\n                    // Remove unnecessary information from main slot list, and update the items\n                    lastSlotReleased = null;\n                    releasedSlots = 0;\n                    for (slot = slotsStart.next; slot !== slotsEnd;) {\n                        slotRefresh = refreshKeyMap[slot.key];\n                        slotNext = slot.next;\n\n                        if (slot !== slotListEnd) {\n                            if (!slotLive(slot)) {\n                                // Some more items might have been released since the refresh started.  Strip them away from the\n                                // main slot list, as they'll just get in the way from now on.  Since we're discarding these, but\n                                // don't know if they're actually going away, split the sequence as our starting assumption must be\n                                // that the items on either side are in separate sequences.\n                                deleteUnnecessarySlot(slot);\n                            } else if (slot.key && !slotRefresh) {\n                                // Remove items that have been deleted (or moved far away) and send removed notifications\n                                deleteSlot(slot, false);\n                            } else if (refreshCount === 0 || (slot.indexRequested && slot.index >= refreshCount)) {\n                                // Remove items that can't exist in the list and send mirage removed notifications\n                                deleteSlot(slot, true);\n                            } else if (slot.item || slot.keyRequested) {\n                                // Store the new item; this value will be compared with that stored in slot.item later\n                                slot.itemNew = slotRefresh.item;\n                            } else {\n                                // Clear keys and items that have never been observed by client\n                                if (slot.key) {\n                                    if (!slot.keyRequested) {\n                                        delete keyMap[slot.key];\n                                        delete slot.key;\n                                    }\n                                    slot.itemNew = null;\n                                }\n                            }\n                        }\n\n                        slot = slotNext;\n                    }\n\n                    // Placeholders generated by itemsAtIndex should not move.  Match these to items now if possible, or merge them\n                    // with existing items if necessary.\n                    for (slot = slotsStart.next; slot !== slotListEnd;) {\n                        slotNext = slot.next;\n\n                        if (slot.indexRequested) {\n                            slotRefresh = refreshIndexMap[slot.index];\n                            if (slotRefresh) {\n                                matchSlotForRefresh(slotFromSlotRefresh(slotRefresh), slot, slotRefresh);\n                            }\n                        }\n\n                        slot = slotNext;\n                    }\n\n                    // Match old sequences to new sequences\n                    var bestMatch,\n                        bestMatchCount,\n                        previousBestMatch = 0,\n                        newSequenceCounts = [],\n                        slotIndexRequested,\n                        sequenceIndexEnd,\n                        sequenceOldEnd;\n\n                    sequenceCountOld = 0;\n                    for (slot = slotsStart; slot !== slotsEnd; slot = slot.next) {\n                        if (slot.firstInSequence) {\n                            slotFirstInSequence = slot;\n                            slotIndexRequested = null;\n                            for (i = 0; i < sequenceCountNew; i++) {\n                                newSequenceCounts[i] = 0;\n                            }\n                        }\n\n                        if (slot.indexRequested) {\n                            slotIndexRequested = slot;\n                        }\n\n                        slotRefresh = slotRefreshFromSlot(slot);\n                        if (slotRefresh) {\n                            newSequenceCounts[slotRefresh.sequenceNumber]++;\n                        }\n\n                        if (slot.lastInSequence) {\n                            // Determine which new sequence is the best match for this old one.  Use a simple greedy algorithm to\n                            // ensure the relative ordering of matched sequences is the same; out-of-order sequences will require\n                            // move notifications.\n                            bestMatchCount = 0;\n                            for (i = previousBestMatch; i < sequenceCountNew; i++) {\n                                if (bestMatchCount < newSequenceCounts[i]) {\n                                    bestMatchCount = newSequenceCounts[i];\n                                    bestMatch = i;\n                                }\n                            }\n\n                            sequenceOld = {\n                                first: slotFirstInSequence,\n                                last: slot,\n                                sequenceNew: (bestMatchCount > 0 ? sequencesNew[bestMatch] : undefined),\n                                matchingItems: bestMatchCount\n                            };\n\n                            if (slotIndexRequested) {\n                                sequenceOld.indexRequested = true;\n                                sequenceOld.stationarySlot = slotIndexRequested;\n                            }\n\n                            sequencesOld[sequenceCountOld] = sequenceOld;\n\n                            if (slot === slotListEnd) {\n                                sequenceIndexEnd = sequenceCountOld;\n                                sequenceOldEnd = sequenceOld;\n                            }\n\n                            sequenceCountOld++;\n\n                            if (sequencesNew[bestMatch].first.index !== undefined) {\n                                previousBestMatch = bestMatch;\n                            }\n                        }\n                    }\n\n                    // Special case: split the old start into a separate sequence if the new start isn't its best match\n                    if (sequencesOld[0].sequenceNew !== sequencesNew[0]) {\n                        splitSequence(slotsStart);\n                        sequencesOld[0].first = slotsStart.next;\n                        sequencesOld.unshift({\n                            first: slotsStart,\n                            last: slotsStart,\n                            sequenceNew: sequencesNew[0],\n                            matchingItems: 1\n                        });\n                        sequenceIndexEnd++;\n                        sequenceCountOld++;\n                    }\n\n                    var listEndObserved = !slotListEnd.firstInSequence;\n\n                    // Special case: split the old end into a separate sequence if the new end isn't its best match\n                    if (sequenceOldEnd.sequenceNew !== sequencesNew[sequenceCountNew - 1]) {\n                        splitSequence(slotListEnd.prev);\n                        sequenceOldEnd.last = slotListEnd.prev;\n                        sequenceIndexEnd++;\n                        sequencesOld.splice(sequenceIndexEnd, 0, {\n                            first: slotListEnd,\n                            last: slotListEnd,\n                            sequenceNew: sequencesNew[sequenceCountNew - 1],\n                            matchingItems: 1\n                        });\n                        sequenceCountOld++;\n                        sequenceOldEnd = sequencesOld[sequenceIndexEnd];\n                    }\n\n                    // Map new sequences to old sequences\n                    for (i = 0; i < sequenceCountOld; i++) {\n                        sequenceNew = sequencesOld[i].sequenceNew;\n                        if (sequenceNew && sequenceNew.matchingItems < sequencesOld[i].matchingItems) {\n                            sequenceNew.matchingItems = sequencesOld[i].matchingItems;\n                            sequenceNew.sequenceOld = sequencesOld[i];\n                        }\n                    }\n\n                    // The old end must always be the best match for the new end (if the new end is also the new start, they will\n                    // be merged below).\n                    sequencesNew[sequenceCountNew - 1].sequenceOld = sequenceOldEnd;\n                    sequenceOldEnd.stationarySlot = slotListEnd;\n\n                    // The old start must always be the best match for the new start\n                    sequencesNew[0].sequenceOld = sequencesOld[0];\n                    sequencesOld[0].stationarySlot = slotsStart;\n\n                    // Merge additional indexed old sequences when possible\n\n                    // First do a forward pass\n                    for (i = 0; i <= sequenceIndexEnd; i++) {\n                        sequenceOld = sequencesOld[i];\n\n                        if (sequenceOld.sequenceNew && (sequenceOldBestMatch = sequenceOld.sequenceNew.sequenceOld) === sequenceOldPrev && sequenceOldPrev.last !== slotListEnd) {\n                            mergeSequencesForRefresh(sequenceOldBestMatch.last);\n                            sequenceOldBestMatch.last = sequenceOld.last;\n                            delete sequencesOld[i];\n                        } else {\n                            sequenceOldPrev = sequenceOld;\n                        }\n                    }\n\n                    // Now do a reverse pass\n                    sequenceOldPrev = null;\n                    for (i = sequenceIndexEnd; i >= 0; i--) {\n                        sequenceOld = sequencesOld[i];\n                        // From this point onwards, some members of sequencesOld may be undefined\n                        if (sequenceOld) {\n                            if (sequenceOld.sequenceNew && (sequenceOldBestMatch = sequenceOld.sequenceNew.sequenceOld) === sequenceOldPrev && sequenceOld.last !== slotListEnd) {\n                                mergeSequencesForRefresh(sequenceOld.last);\n                                sequenceOldBestMatch.first = sequenceOld.first;\n                                delete sequencesOld[i];\n                            } else {\n                                sequenceOldPrev = sequenceOld;\n                            }\n                        }\n                    }\n\n                    // Since we may have forced the list end into a separate sequence, the mergedForRefresh flag may be incorrect\n                    if (listEndObserved) {\n                        delete slotListEnd.mergedForRefresh;\n                    }\n\n                    var sequencePairsToMerge = [];\n\n                    // Find unchanged sequences without indices that can be merged with existing sequences without move\n                    // notifications.\n                    for (i = sequenceIndexEnd + 1; i < sequenceCountOld; i++) {\n                        sequenceOld = sequencesOld[i];\n                        if (sequenceOld && (!sequenceOld.sequenceNew || sequenceOld.sequenceNew.sequenceOld !== sequenceOld)) {\n                            // If the order of the known items in the sequence is unchanged, then the sequence probably has not\n                            // moved, but we now know where it belongs relative to at least one other sequence.\n                            var orderPreserved = true,\n                                slotRefreshFirst = null,\n                                slotRefreshLast = null,\n                                sequenceLength = 0;\n                            slotRefresh = slotRefreshFromSlot(sequenceOld.first);\n                            if (slotRefresh) {\n                                slotRefreshFirst = slotRefreshLast = slotRefresh;\n                                sequenceLength = 1;\n                            }\n                            for (slot = sequenceOld.first; slot !== sequenceOld.last; slot = slot.next) {\n                                var slotRefreshNext = slotRefreshFromSlot(slot.next);\n\n                                if (slotRefresh && slotRefreshNext && (slotRefresh.lastInSequence || slotRefresh.next !== slotRefreshNext)) {\n                                    orderPreserved = false;\n                                    break;\n                                }\n\n                                if (slotRefresh && !slotRefreshFirst) {\n                                    slotRefreshFirst = slotRefreshLast = slotRefresh;\n                                }\n\n                                if (slotRefreshNext && slotRefreshFirst) {\n                                    slotRefreshLast = slotRefreshNext;\n                                    sequenceLength++;\n                                }\n\n                                slotRefresh = slotRefreshNext;\n                            }\n\n                            // If the stationary sequence has indices, verify that there is enough space for this sequence - if\n                            // not, then something somewhere has moved after all.\n                            if (orderPreserved && slotRefreshFirst && slotRefreshFirst.index !== undefined) {\n                                var indexBefore;\n                                if (!slotRefreshFirst.firstInSequence) {\n                                    slotBefore = slotFromSlotRefresh(slotRefreshFirst.prev);\n                                    if (slotBefore) {\n                                        indexBefore = slotBefore.index;\n                                    }\n                                }\n\n                                var indexAfter;\n                                if (!slotRefreshLast.lastInSequence) {\n                                    slotAfter = slotFromSlotRefresh(slotRefreshLast.next);\n                                    if (slotAfter) {\n                                        indexAfter = slotAfter.index;\n                                    }\n                                }\n\n                                if ((!slotAfter || slotAfter.lastInSequence || slotAfter.mergedForRefresh) &&\n                                        (indexBefore === undefined || indexAfter === undefined || indexAfter - indexBefore - 1 >= sequenceLength)) {\n                                    sequenceOld.locationJustDetermined = true;\n\n                                    // Mark the individual refresh slots as not requiring move notifications\n                                    for (slotRefresh = slotRefreshFirst; ; slotRefresh = slotRefresh.next) {\n                                        slotRefresh.locationJustDetermined = true;\n\n                                        if (slotRefresh === slotRefreshLast) {\n                                            break;\n                                        }\n                                    }\n\n                                    // Store any adjacent placeholders so they can be merged once the moves and insertions have\n                                    // been processed.\n                                    var slotFirstInSequence = slotFromSlotRefresh(slotRefreshFirst),\n                                        slotLastInSequence = slotFromSlotRefresh(slotRefreshLast);\n                                    sequencePairsToMerge.push({\n                                        slotBeforeSequence: (slotFirstInSequence.firstInSequence ? null : slotFirstInSequence.prev),\n                                        slotFirstInSequence: slotFirstInSequence,\n                                        slotLastInSequence: slotLastInSequence,\n                                        slotAfterSequence: (slotLastInSequence.lastInSequence ? null : slotLastInSequence.next)\n                                    });\n                                }\n                            }\n                        }\n                    }\n\n                    // Remove placeholders in old sequences that don't map to new sequences (and don't contain requests for a\n                    // specific index or key), as they no longer have meaning.\n                    for (i = 0; i < sequenceCountOld; i++) {\n                        sequenceOld = sequencesOld[i];\n                        if (sequenceOld && !sequenceOld.indexRequested && !sequenceOld.locationJustDetermined && (!sequenceOld.sequenceNew || sequenceOld.sequenceNew.sequenceOld !== sequenceOld)) {\n                            sequenceOld.sequenceNew = null;\n\n                            slot = sequenceOld.first;\n\n                            var sequenceEndReached;\n                            do {\n                                sequenceEndReached = (slot === sequenceOld.last);\n\n                                slotNext = slot.next;\n\n                                if (slot !== slotsStart && slot !== slotListEnd && slot !== slotsEnd && !slot.item && !slot.keyRequested) {\n                                    deleteSlot(slot, true);\n                                    if (sequenceOld.first === slot) {\n                                        if (sequenceOld.last === slot) {\n                                            delete sequencesOld[i];\n                                            break;\n                                        } else {\n                                            sequenceOld.first = slot.next;\n                                        }\n                                    } else if (sequenceOld.last === slot) {\n                                        sequenceOld.last = slot.prev;\n                                    }\n                                }\n\n                                slot = slotNext;\n                            } while (!sequenceEndReached);\n                        }\n                    }\n\n                    // Locate boundaries of new items in new sequences\n                    for (i = 0; i < sequenceCountNew; i++) {\n                        sequenceNew = sequencesNew[i];\n                        for (slotRefresh = sequenceNew.first; !slotFromSlotRefresh(slotRefresh) && !slotRefresh.lastInSequence; slotRefresh = slotRefresh.next) {\n                            /*@empty*/\n                        }\n                        if (slotRefresh.lastInSequence && !slotFromSlotRefresh(slotRefresh)) {\n                            sequenceNew.firstInner = sequenceNew.lastInner = null;\n                        } else {\n                            sequenceNew.firstInner = slotRefresh;\n                            for (slotRefresh = sequenceNew.last; !slotFromSlotRefresh(slotRefresh) ; slotRefresh = slotRefresh.prev) {\n                                /*@empty*/\n                            }\n                            sequenceNew.lastInner = slotRefresh;\n                        }\n                    }\n\n                    // Determine which items to move\n                    for (i = 0; i < sequenceCountNew; i++) {\n                        sequenceNew = sequencesNew[i];\n                        if (sequenceNew && sequenceNew.firstInner) {\n                            sequenceOld = sequenceNew.sequenceOld;\n                            if (sequenceOld) {\n                                // Number the slots in each new sequence with their offset in the corresponding old sequence (or\n                                // undefined if in a different old sequence).\n                                var ordinal = 0;\n                                for (slot = sequenceOld.first; true; slot = slot.next, ordinal++) {\n                                    slotRefresh = slotRefreshFromSlot(slot);\n                                    if (slotRefresh && slotRefresh.sequenceNumber === sequenceNew.firstInner.sequenceNumber) {\n                                        slotRefresh.ordinal = ordinal;\n                                    }\n\n                                    if (slot.lastInSequence) {\n                                        break;\n                                    }\n                                }\n\n                                // Determine longest subsequence of items that are in the same order before and after\n                                var piles = [];\n                                for (slotRefresh = sequenceNew.firstInner; true; slotRefresh = slotRefresh.next) {\n                                    ordinal = slotRefresh.ordinal;\n                                    if (ordinal !== undefined) {\n                                        var searchFirst = 0,\n                                            searchLast = piles.length - 1;\n                                        while (searchFirst <= searchLast) {\n                                            var searchMidpoint = Math.floor(0.5 * (searchFirst + searchLast));\n                                            if (piles[searchMidpoint].ordinal < ordinal) {\n                                                searchFirst = searchMidpoint + 1;\n                                            } else {\n                                                searchLast = searchMidpoint - 1;\n                                            }\n                                        }\n                                        piles[searchFirst] = slotRefresh;\n                                        if (searchFirst > 0) {\n                                            slotRefresh.predecessor = piles[searchFirst - 1];\n                                        }\n                                    }\n\n                                    if (slotRefresh === sequenceNew.lastInner) {\n                                        break;\n                                    }\n                                }\n\n                                // The items in the longest ordered subsequence don't move; everything else does\n                                var stationaryItems = [],\n                                    stationaryItemCount = piles.length;\n                                slotRefresh = piles[stationaryItemCount - 1];\n                                for (j = stationaryItemCount; j--;) {\n                                    slotRefresh.stationary = true;\n                                    stationaryItems[j] = slotRefresh;\n                                    slotRefresh = slotRefresh.predecessor;\n                                }\n                                sequenceOld.stationarySlot = slotFromSlotRefresh(stationaryItems[0]);\n\n                                // Try to match new items before the first stationary item to placeholders\n                                slotRefresh = stationaryItems[0];\n                                slot = slotFromSlotRefresh(slotRefresh);\n                                slotPrev = slot.prev;\n                                var sequenceBoundaryReached = slot.firstInSequence;\n                                while (!slotRefresh.firstInSequence) {\n                                    slotRefresh = slotRefresh.prev;\n                                    slotExisting = slotFromSlotRefresh(slotRefresh);\n                                    if (!slotExisting || slotRefresh.locationJustDetermined) {\n                                        // Find the next placeholder walking backwards\n                                        while (!sequenceBoundaryReached && slotPrev !== slotsStart) {\n                                            slot = slotPrev;\n                                            slotPrev = slot.prev;\n                                            sequenceBoundaryReached = slot.firstInSequence;\n\n                                            if (updateSlotForRefresh(slotExisting, slot, slotRefresh)) {\n                                                break;\n                                            }\n                                        }\n                                    }\n                                }\n\n                                // Try to match new items between stationary items to placeholders\n                                for (j = 0; j < stationaryItemCount - 1; j++) {\n                                    slotRefresh = stationaryItems[j];\n                                    slot = slotFromSlotRefresh(slotRefresh);\n                                    var slotRefreshStop = stationaryItems[j + 1],\n                                        slotRefreshMergePoint = null,\n                                        slotStop = slotFromSlotRefresh(slotRefreshStop),\n                                        slotExisting;\n                                    // Find all the new items\n                                    slotNext = slot.next;\n                                    for (slotRefresh = slotRefresh.next; slotRefresh !== slotRefreshStop && !slotRefreshMergePoint && slot !== slotStop; slotRefresh = slotRefresh.next) {\n                                        slotExisting = slotFromSlotRefresh(slotRefresh);\n                                        if (!slotExisting || slotRefresh.locationJustDetermined) {\n                                            // Find the next placeholder\n                                            while (slotNext !== slotStop) {\n                                                // If a merge point is reached, match the remainder of the placeholders by walking backwards\n                                                if (slotNext.mergedForRefresh) {\n                                                    slotRefreshMergePoint = slotRefresh.prev;\n                                                    break;\n                                                }\n\n                                                slot = slotNext;\n                                                slotNext = slot.next;\n\n                                                if (updateSlotForRefresh(slotExisting, slot, slotRefresh)) {\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                    }\n\n                                    // Walk backwards to the first merge point if necessary\n                                    if (slotRefreshMergePoint) {\n                                        slotPrev = slotStop.prev;\n                                        for (slotRefresh = slotRefreshStop.prev; slotRefresh !== slotRefreshMergePoint && slotStop !== slot; slotRefresh = slotRefresh.prev) {\n                                            slotExisting = slotFromSlotRefresh(slotRefresh);\n                                            if (!slotExisting || slotRefresh.locationJustDetermined) {\n                                                // Find the next placeholder walking backwards\n                                                while (slotPrev !== slot) {\n                                                    slotStop = slotPrev;\n                                                    slotPrev = slotStop.prev;\n\n                                                    if (updateSlotForRefresh(slotExisting, slotStop, slotRefresh)) {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n\n                                    // Delete remaining placeholders, sending notifications\n                                    while (slotNext !== slotStop) {\n                                        slot = slotNext;\n                                        slotNext = slot.next;\n\n                                        if (slot !== slotsStart && isPlaceholder(slot) && !slot.keyRequested) {\n                                            // This might occur due to two sequences - requested by different clients - being\n                                            // merged.  However, since only sequences with indices are merged, if this placehholder\n                                            // is no longer necessary, it means an item actually was removed, so this doesn't count\n                                            // as a mirage.\n                                            deleteSlot(slot);\n                                        }\n                                    }\n                                }\n\n                                // Try to match new items after the last stationary item to placeholders\n                                slotRefresh = stationaryItems[stationaryItemCount - 1];\n                                slot = slotFromSlotRefresh(slotRefresh);\n                                slotNext = slot.next;\n                                sequenceBoundaryReached = slot.lastInSequence;\n                                while (!slotRefresh.lastInSequence) {\n                                    slotRefresh = slotRefresh.next;\n                                    slotExisting = slotFromSlotRefresh(slotRefresh);\n                                    if (!slotExisting || slotRefresh.locationJustDetermined) {\n                                        // Find the next placeholder\n                                        while (!sequenceBoundaryReached && slotNext !== slotListEnd) {\n                                            slot = slotNext;\n                                            slotNext = slot.next;\n                                            sequenceBoundaryReached = slot.lastInSequence;\n\n                                            if (updateSlotForRefresh(slotExisting, slot, slotRefresh)) {\n                                                break;\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    // Move items and send notifications\n                    for (i = 0; i < sequenceCountNew; i++) {\n                        sequenceNew = sequencesNew[i];\n\n                        if (sequenceNew.firstInner) {\n                            slotPrev = null;\n                            for (slotRefresh = sequenceNew.firstInner; true; slotRefresh = slotRefresh.next) {\n                                slot = slotFromSlotRefresh(slotRefresh);\n                                if (slot) {\n                                    if (!slotRefresh.stationary) {\n                                        var slotMoveBefore,\n                                            mergeWithPrev = false,\n                                            mergeWithNext = false;\n                                        if (slotPrev) {\n                                            slotMoveBefore = slotPrev.next;\n                                            mergeWithPrev = true;\n                                        } else {\n                                            // The first item will be inserted before the first stationary item, so find that now\n                                            var slotRefreshStationary;\n                                            for (slotRefreshStationary = sequenceNew.firstInner; !slotRefreshStationary.stationary && slotRefreshStationary !== sequenceNew.lastInner; slotRefreshStationary = slotRefreshStationary.next) {\n                                                /*@empty*/\n                                            }\n\n                                            if (!slotRefreshStationary.stationary) {\n                                                // There are no stationary items, as all the items are moving from another old\n                                                // sequence.\n\n                                                index = slotRefresh.index;\n\n                                                // Find the best place to insert the new sequence\n                                                if (index === 0) {\n                                                    // Index 0 is a special case\n                                                    slotMoveBefore = slotsStart.next;\n                                                    mergeWithPrev = true;\n                                                } else if (index === undefined) {\n                                                    slotMoveBefore = slotsEnd;\n                                                } else {\n                                                    // Use a linear search; unlike successorFromIndex, prefer the last insertion\n                                                    // point between sequences over the precise index\n                                                    slotMoveBefore = slotsStart.next;\n                                                    var lastSequenceStart = null;\n                                                    while (true) {\n                                                        if (slotMoveBefore.firstInSequence) {\n                                                            lastSequenceStart = slotMoveBefore;\n                                                        }\n\n                                                        if ((index < slotMoveBefore.index && lastSequenceStart) || slotMoveBefore === slotListEnd) {\n                                                            break;\n                                                        }\n\n                                                        slotMoveBefore = slotMoveBefore.next;\n                                                    }\n\n                                                    if (!slotMoveBefore.firstInSequence && lastSequenceStart) {\n                                                        slotMoveBefore = lastSequenceStart;\n                                                    }\n                                                }\n                                            } else {\n                                                slotMoveBefore = slotFromSlotRefresh(slotRefreshStationary);\n                                                mergeWithNext = true;\n                                            }\n                                        }\n\n                                        // Preserve merge boundaries\n                                        if (slot.mergedForRefresh) {\n                                            delete slot.mergedForRefresh;\n                                            if (!slot.lastInSequence) {\n                                                slot.next.mergedForRefresh = true;\n                                            }\n                                        }\n\n                                        mergeWithPrev = mergeWithPrev || slotRefresh.mergeWithPrev;\n                                        mergeWithNext = mergeWithNext || slotRefresh.mergeWithNext;\n\n                                        var skipNotifications = slotRefresh.locationJustDetermined;\n\n                                        moveSlot(slot, slotMoveBefore, mergeWithPrev, mergeWithNext, skipNotifications);\n\n                                        if (skipNotifications && mergeWithNext) {\n                                            // Since this item was moved without a notification, this is an implicit merge of\n                                            // sequences.  Mark the item's successor as mergedForRefresh.\n                                            slotMoveBefore.mergedForRefresh = true;\n                                        }\n                                    }\n\n                                    slotPrev = slot;\n                                }\n\n                                if (slotRefresh === sequenceNew.lastInner) {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    // Insert new items (with new indices) and send notifications\n                    for (i = 0; i < sequenceCountNew; i++) {\n                        sequenceNew = sequencesNew[i];\n\n                        if (sequenceNew.firstInner) {\n                            slotPrev = null;\n                            for (slotRefresh = sequenceNew.firstInner; true; slotRefresh = slotRefresh.next) {\n                                slot = slotFromSlotRefresh(slotRefresh);\n                                if (!slot) {\n                                    var slotInsertBefore;\n                                    if (slotPrev) {\n                                        slotInsertBefore = slotPrev.next;\n                                    } else {\n                                        // The first item will be inserted *before* the first old item, so find that now\n                                        var slotRefreshOld;\n                                        for (slotRefreshOld = sequenceNew.firstInner; !slotFromSlotRefresh(slotRefreshOld) ; slotRefreshOld = slotRefreshOld.next) {\n                                            /*@empty*/\n                                        }\n                                        slotInsertBefore = slotFromSlotRefresh(slotRefreshOld);\n                                    }\n\n                                    // Create a new slot for the item\n                                    slot = addNewSlotFromRefresh(slotRefresh, slotInsertBefore, !!slotPrev);\n\n                                    var slotRefreshNext = slotRefreshFromSlot(slotInsertBefore);\n\n                                    if (!slotInsertBefore.mergedForRefresh && (!slotRefreshNext || !slotRefreshNext.locationJustDetermined)) {\n                                        prepareSlotItem(slot);\n\n                                        // Send the notification after the insertion\n                                        sendInsertedNotification(slot);\n                                    }\n                                }\n                                slotPrev = slot;\n\n                                if (slotRefresh === sequenceNew.lastInner) {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    // Rebuild the indexMap from scratch, so it is possible to detect colliding indices\n                    indexMap = [];\n\n                    // Send indexChanged and changed notifications\n                    var indexFirst = -1;\n                    for (slot = slotsStart, offset = 0; slot !== slotsEnd; offset++) {\n                        var slotNext = slot.next;\n\n                        if (slot.firstInSequence) {\n                            slotFirstInSequence = slot;\n                            offset = 0;\n                        }\n\n                        if (indexFirst === undefined) {\n                            var indexNew = indexForRefresh(slot);\n                            if (indexNew !== undefined) {\n                                indexFirst = indexNew - offset;\n                            }\n                        }\n\n                        // See if the next slot would cause a contradiction, in which case split the sequences\n                        if (indexFirst !== undefined && !slot.lastInSequence) {\n                            var indexNewNext = indexForRefresh(slot.next);\n                            if (indexNewNext !== undefined && indexNewNext !== indexFirst + offset + 1) {\n                                splitSequence(slot);\n\n                                // 'Move' the items in-place individually, so move notifications are sent.  In rare cases, this\n                                // will result in multiple move notifications being sent for a given item, but that's fine.\n                                var first = true;\n                                for (var slotMove = slot.next, lastInSequence = false; !lastInSequence && slotMove !== slotListEnd;) {\n                                    var slotMoveNext = slotMove.next;\n\n                                    lastInSequence = slotMove.lastInSequence;\n\n                                    moveSlot(slotMove, slotMoveNext, !first, false);\n\n                                    first = false;\n                                    slotMove = slotMoveNext;\n                                }\n                            }\n                        }\n\n                        if (slot.lastInSequence) {\n                            index = indexFirst;\n                            for (var slotUpdate = slotFirstInSequence; slotUpdate !== slotNext;) {\n                                var slotUpdateNext = slotUpdate.next;\n\n                                if (index >= refreshCount && slotUpdate !== slotListEnd) {\n                                    deleteSlot(slotUpdate, true);\n                                } else {\n                                    var slotWithIndex = indexMap[index];\n\n                                    if (index !== slotUpdate.index) {\n                                        delete indexMap[index];\n                                        changeSlotIndex(slotUpdate, index);\n                                    } else if (+index === index && indexMap[index] !== slotUpdate) {\n                                        indexMap[index] = slotUpdate;\n                                    }\n\n                                    if (slotUpdate.itemNew) {\n                                        updateSlotItem(slotUpdate);\n                                    }\n\n                                    if (slotWithIndex) {\n                                        // Two slots' indices have collided - merge them\n                                        if (slotUpdate.key) {\n                                            sendMirageNotifications(slotUpdate, slotWithIndex, slotUpdate.bindingMap);\n                                            mergeSlots(slotUpdate, slotWithIndex);\n                                            if (+index === index) {\n                                                indexMap[index] = slotUpdate;\n                                            }\n                                        } else {\n                                            sendMirageNotifications(slotWithIndex, slotUpdate, slotWithIndex.bindingMap);\n                                            mergeSlots(slotWithIndex, slotUpdate);\n                                            if (+index === index) {\n                                                indexMap[index] = slotWithIndex;\n                                            }\n                                        }\n                                    }\n\n                                    if (+index === index) {\n                                        index++;\n                                    }\n                                }\n\n                                slotUpdate = slotUpdateNext;\n                            }\n\n                            indexFirst = undefined;\n                        }\n\n                        slot = slotNext;\n                    }\n\n                    // See if any sequences need to be moved and/or merged\n                    var indexMax = -2,\n                        listEndReached;\n\n                    for (slot = slotsStart, offset = 0; slot !== slotsEnd; offset++) {\n                        var slotNext = slot.next;\n\n                        if (slot.firstInSequence) {\n                            slotFirstInSequence = slot;\n                            offset = 0;\n                        }\n\n                        // Clean up during this pass\n                        delete slot.mergedForRefresh;\n\n                        if (slot.lastInSequence) {\n                            // Move sequence if necessary\n                            if (slotFirstInSequence.index === undefined) {\n                                slotBefore = slotFirstInSequence.prev;\n                                var slotRefreshBefore;\n                                if (slotBefore && (slotRefreshBefore = slotRefreshFromSlot(slotBefore)) && !slotRefreshBefore.lastInSequence &&\n                                        (slotRefresh = slotRefreshFromSlot(slot)) && slotRefresh.prev === slotRefreshBefore) {\n                                    moveSequenceAfter(slotBefore, slotFirstInSequence, slot);\n                                    mergeSequences(slotBefore);\n                                } else if (slot !== slotListEnd && !listEndReached) {\n                                    moveSequenceBefore(slotsEnd, slotFirstInSequence, slot);\n                                }\n                            } else {\n                                if (indexMax < slot.index && !listEndReached) {\n                                    indexMax = slot.index;\n                                } else {\n                                    // Find the correct insertion point\n                                    for (slotAfter = slotsStart.next; slotAfter.index < slot.index; slotAfter = slotAfter.next) {\n                                        /*@empty*/\n                                    }\n\n                                    // Move the items individually, so move notifications are sent\n                                    for (var slotMove = slotFirstInSequence; slotMove !== slotNext;) {\n                                        var slotMoveNext = slotMove.next;\n                                        slotRefresh = slotRefreshFromSlot(slotMove);\n                                        moveSlot(slotMove, slotAfter, slotAfter.prev.index === slotMove.index - 1, slotAfter.index === slotMove.index + 1, slotRefresh && slotRefresh.locationJustDetermined);\n                                        slotMove = slotMoveNext;\n                                    }\n                                }\n\n                                // Store slotBefore here since the sequence might have just been moved\n                                slotBefore = slotFirstInSequence.prev;\n\n                                // See if this sequence should be merged with the previous one\n                                if (slotBefore && slotBefore.index === slotFirstInSequence.index - 1) {\n                                    mergeSequences(slotBefore);\n                                }\n                            }\n                        }\n\n                        if (slot === slotListEnd) {\n                            listEndReached = true;\n                        }\n\n                        slot = slotNext;\n                    }\n\n                    indexUpdateDeferred = false;\n\n                    // Now that all the sequences have been moved, merge any colliding slots\n                    mergeSequencePairs(sequencePairsToMerge);\n\n                    // Send countChanged notification\n                    if (refreshCount !== undefined && refreshCount !== knownCount) {\n                        changeCount(refreshCount);\n                    }\n\n                    finishNotifications();\n\n                    // Before discarding the refresh slot list, see if any fetch requests can be completed by pretending each range\n                    // of refresh slots is an incoming array of results.\n                    var fetchResults = [];\n                    for (i = 0; i < sequenceCountNew; i++) {\n                        sequenceNew = sequencesNew[i];\n\n                        var results = [];\n\n                        slot = null;\n                        offset = 0;\n\n                        var slotOffset;\n\n                        for (slotRefresh = sequenceNew.first; true; slotRefresh = slotRefresh.next, offset++) {\n                            if (slotRefresh === refreshStart) {\n                                results.push(startMarker);\n                            } else if (slotRefresh === refreshEnd) {\n                                results.push(endMarker);\n                            } else {\n                                results.push(slotRefresh.item);\n\n                                if (!slot) {\n                                    slot = slotFromSlotRefresh(slotRefresh);\n                                    slotOffset = offset;\n                                }\n                            }\n\n                            if (slotRefresh.lastInSequence) {\n                                break;\n                            }\n                        }\n\n                        if (slot) {\n                            fetchResults.push({\n                                slot: slot,\n                                results: results,\n                                offset: slotOffset\n                            });\n                        }\n                    }\n\n                    resetRefreshState();\n                    refreshInProgress = false;\n\n                    // Complete any promises for newly obtained items\n                    callFetchCompleteCallbacks();\n\n                    // Now process the 'extra' results from the refresh list\n                    for (i = 0; i < fetchResults.length; i++) {\n                        var fetchResult = fetchResults[i];\n                        processResults(fetchResult.slot, fetchResult.results, fetchResult.offset, knownCount, fetchResult.slot.index);\n                    }\n\n                    if (refreshSignal) {\n                        var signal = refreshSignal;\n\n                        refreshSignal = null;\n\n                        signal.complete();\n                    }\n\n                    // Finally, kick-start fetches for any remaining placeholders\n                    postFetch();\n                }\n\n                // Edit Queue\n\n                // Queues an edit and immediately \"optimistically\" apply it to the slots list, sending re-entrant notifications\n                function queueEdit(applyEdit, editType, complete, error, keyUpdate, updateSlots, undo) {\n                    var editQueueTail = editQueue.prev,\n                        edit = {\n                            prev: editQueueTail,\n                            next: editQueue,\n                            applyEdit: applyEdit,\n                            editType: editType,\n                            complete: complete,\n                            error: error,\n                            keyUpdate: keyUpdate\n                        };\n                    editQueueTail.next = edit;\n                    editQueue.prev = edit;\n                    editsQueued = true;\n\n                    // If there's a refresh in progress, abandon it, but request that a new one be started once the edits complete\n                    if (refreshRequested || refreshInProgress) {\n                        currentRefreshID++;\n                        refreshInProgress = false;\n                        refreshRequested = true;\n                    }\n\n                    if (editQueue.next === edit) {\n                        // Attempt the edit immediately, in case it completes synchronously\n                        applyNextEdit();\n                    }\n\n                    // If the edit succeeded or is still pending, apply it to the slots (in the latter case, \"optimistically\")\n                    if (!edit.failed) {\n                        updateSlots();\n\n                        // Supply the undo function now\n                        edit.undo = undo;\n                    }\n\n                    if (!editsInProgress) {\n                        completeEdits();\n                    }\n                }\n\n                function dequeueEdit() {\n                    firstEditInProgress = false;\n\n                    var editNext = editQueue.next.next;\n\n                    editQueue.next = editNext;\n                    editNext.prev = editQueue;\n                }\n\n                // Undo all queued edits, starting with the most recent\n                function discardEditQueue() {\n                    while (editQueue.prev !== editQueue) {\n                        var editLast = editQueue.prev;\n\n                        if (editLast.error) {\n                            editLast.error(new _ErrorFromName(EditError.canceled));\n                        }\n\n                        // Edits that haven't been applied to the slots yet don't need to be undone\n                        if (editLast.undo && !refreshRequested) {\n                            editLast.undo();\n                        }\n\n                        editQueue.prev = editLast.prev;\n                    }\n                    editQueue.next = editQueue;\n\n                    editsInProgress = false;\n\n                    completeEdits();\n                }\n\n                var EditType = {\n                    insert: \"insert\",\n                    change: \"change\",\n                    move: \"move\",\n                    remove: \"remove\"\n                };\n\n                function attemptEdit(edit) {\n                    if (firstEditInProgress) {\n                        return;\n                    }\n\n                    var reentrant = true;\n\n                    function continueEdits() {\n                        if (!waitForRefresh) {\n                            if (reentrant) {\n                                synchronousEdit = true;\n                            } else {\n                                applyNextEdit();\n                            }\n                        }\n                    }\n\n                    var keyUpdate = edit.keyUpdate;\n\n                    function onEditComplete(item) {\n                        if (item) {\n                            var slot;\n                            if (keyUpdate && keyUpdate.key !== item.key) {\n                                var keyNew = item.key;\n                                if (!edit.undo) {\n                                    // If the edit is in the process of being queued, we can use the correct key when we update the\n                                    // slots, so there's no need for a later update.\n                                    keyUpdate.key = keyNew;\n                                } else {\n                                    slot = keyUpdate.slot;\n                                    if (slot) {\n                                        var keyOld = slot.key;\n                                        if (keyOld) {\n                                            delete keyMap[keyOld];\n                                        }\n                                        setSlotKey(slot, keyNew);\n                                        slot.itemNew = item;\n                                        if (slot.item) {\n                                            changeSlot(slot);\n                                            finishNotifications();\n                                        } else {\n                                            completeFetchPromises(slot);\n                                        }\n                                    }\n                                }\n                            } else if (edit.editType === EditType.change) {\n                                slot.itemNew = item;\n\n                                if (!reentrant) {\n                                    changeSlotIfNecessary(slot);\n                                }\n                            }\n                        }\n\n                        dequeueEdit();\n\n                        if (edit.complete) {\n                            edit.complete(item);\n                        }\n\n                        continueEdits();\n                    }\n\n                    function onEditError(error) {\n                        switch (error.Name) {\n                            case EditError.noResponse:\n                                // Report the failure to the client, but do not dequeue the edit\n                                setStatus(DataSourceStatus.failure);\n                                waitForRefresh = true;\n\n                                firstEditInProgress = false;\n\n                                // Don't report the error, as the edit will be attempted again on the next refresh\n                                return;\n\n                            case EditError.notPermitted:\n                                break;\n\n                            case EditError.noLongerMeaningful:\n                                // Something has changed, so request a refresh\n                                beginRefresh();\n                                break;\n\n                            default:\n                                break;\n                        }\n\n                        // Discard all remaining edits, rather than try to determine which subsequent ones depend on this one\n                        edit.failed = true;\n                        dequeueEdit();\n\n                        discardEditQueue();\n\n                        if (edit.error) {\n                            edit.error(error);\n                        }\n\n                        continueEdits();\n                    }\n\n                    if (listDataAdapter.beginEdits && !beginEditsCalled) {\n                        beginEditsCalled = true;\n                        listDataAdapter.beginEdits();\n                    }\n\n                    // Call the applyEdit function for the given edit, passing in our own wrapper of the error handler that the\n                    // client passed in.\n                    firstEditInProgress = true;\n                    edit.applyEdit().then(onEditComplete, onEditError);\n                    reentrant = false;\n                }\n\n                function applyNextEdit() {\n                    // See if there are any outstanding edits, and try to process as many as possible synchronously\n                    while (editQueue.next !== editQueue) {\n                        synchronousEdit = false;\n                        attemptEdit(editQueue.next);\n                        if (!synchronousEdit) {\n                            return;\n                        }\n                    }\n\n                    // The queue emptied out synchronously (or was empty to begin with)\n                    concludeEdits();\n                }\n\n                function completeEdits() {\n                    updateIndices();\n\n                    finishNotifications();\n\n                    callFetchCompleteCallbacks();\n\n                    if (editQueue.next === editQueue) {\n                        concludeEdits();\n                    }\n                }\n\n                // Once the edit queue has emptied, update state appropriately and resume normal operation\n                function concludeEdits() {\n                    editsQueued = false;\n\n                    if (listDataAdapter.endEdits && beginEditsCalled && !editsInProgress) {\n                        beginEditsCalled = false;\n                        listDataAdapter.endEdits();\n                    }\n\n                    // See if there's a refresh that needs to begin\n                    if (refreshRequested) {\n                        refreshRequested = false;\n                        beginRefresh();\n                    } else {\n                        // Otherwise, see if anything needs to be fetched\n                        postFetch();\n                    }\n                }\n\n                // Editing Operations\n\n                function getSlotForEdit(key) {\n                    validateKey(key);\n\n                    return keyMap[key] || createSlotForKey(key);\n                }\n\n                function insertNewSlot(key, itemNew, slotInsertBefore, mergeWithPrev, mergeWithNext) {\n                    // Create a new slot, but don't worry about its index, as indices will be updated during endEdits\n                    var slot = createPrimarySlot();\n\n                    insertAndMergeSlot(slot, slotInsertBefore, mergeWithPrev, mergeWithNext);\n                    if (key) {\n                        setSlotKey(slot, key);\n                    }\n                    slot.itemNew = itemNew;\n\n                    updateNewIndices(slot, 1);\n\n                    // If this isn't part of a batch of changes, set the slot index now so renderers can see it\n                    if (!editsInProgress && !dataNotificationsInProgress) {\n                        if (!slot.firstInSequence && typeof slot.prev.index === \"number\") {\n                            setSlotIndex(slot, slot.prev.index + 1, indexMap);\n                        } else if (!slot.lastInSequence && typeof slot.next.index === \"number\") {\n                            setSlotIndex(slot, slot.next.index - 1, indexMap);\n                        }\n                    }\n\n                    prepareSlotItem(slot);\n\n                    // Send the notification after the insertion\n                    sendInsertedNotification(slot);\n\n                    return slot;\n                }\n\n                function insertItem(key, data, slotInsertBefore, append, applyEdit) {\n                    var keyUpdate = { key: key };\n\n                    return new Promise(function (complete, error) {\n                        queueEdit(\n                            applyEdit, EditType.insert, complete, error, keyUpdate,\n\n                            // updateSlots\n                            function () {\n                                if (slotInsertBefore) {\n                                    var itemNew = {\n                                        key: keyUpdate.key,\n                                        data: data\n                                    };\n\n                                    keyUpdate.slot = insertNewSlot(keyUpdate.key, itemNew, slotInsertBefore, append, !append);\n                                }\n                            },\n\n                            // undo\n                            function () {\n                                var slot = keyUpdate.slot;\n\n                                if (slot) {\n                                    updateNewIndices(slot, -1);\n                                    deleteSlot(slot, false);\n                                }\n                            }\n                        );\n                    });\n                }\n\n                function moveItem(slot, slotMoveBefore, append, applyEdit) {\n                    return new Promise(function (complete, error) {\n                        var mergeAdjacent,\n                            slotNext,\n                            firstInSequence,\n                            lastInSequence;\n\n                        queueEdit(\n                            applyEdit, EditType.move, complete, error,\n\n                            // keyUpdate\n                            null,\n\n                            // updateSlots\n                            function () {\n                                slotNext = slot.next;\n                                firstInSequence = slot.firstInSequence;\n                                lastInSequence = slot.lastInSequence;\n\n                                var slotPrev = slot.prev;\n\n                                mergeAdjacent = (typeof slot.index !== \"number\" && (firstInSequence || !slotPrev.item) && (lastInSequence || !slotNext.item));\n\n                                updateNewIndices(slot, -1);\n                                moveSlot(slot, slotMoveBefore, append, !append);\n                                updateNewIndices(slot, 1);\n\n                                if (mergeAdjacent) {\n                                    splitSequence(slotPrev);\n\n                                    if (!firstInSequence) {\n                                        mergeSlotsBefore(slotPrev, slot);\n                                    }\n                                    if (!lastInSequence) {\n                                        mergeSlotsAfter(slotNext, slot);\n                                    }\n                                }\n                            },\n\n                            // undo\n                            function () {\n                                if (!mergeAdjacent) {\n                                    updateNewIndices(slot, -1);\n                                    moveSlot(slot, slotNext, !firstInSequence, !lastInSequence);\n                                    updateNewIndices(slot, 1);\n                                } else {\n                                    beginRefresh();\n                                }\n                            }\n                        );\n                    });\n                }\n\n                function ListDataNotificationHandler() {\n                    /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler\">\n                    /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler\">\n                    /// An implementation of IListDataNotificationHandler that is passed to the\n                    /// IListDataAdapter.setNotificationHandler method.\n                    /// </summary>\n                    /// </signature>\n\n                    this.invalidateAll = function () {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.invalidateAll\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.invalidateAll\">\n                        /// Notifies the VirtualizedDataSource that some data has changed, without specifying which data. It might\n                        /// be impractical for some data sources to call this method for any or all changes, so this call is optional.\n                        /// But if a given data adapter never calls it, the application should periodically call\n                        /// invalidateAll on the VirtualizedDataSource to refresh the data.\n                        /// </summary>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.invalidateAll_returnValue\">\n                        /// A Promise that completes when the data has been completely refreshed and all change notifications have\n                        /// been sent.\n                        /// </returns>\n                        /// </signature>\n\n                        if (knownCount === 0) {\n                            this.reload();\n                            return Promise.wrap();\n                        }\n\n                        return requestRefresh();\n                    };\n\n                    this.reload = function () {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.reload\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.reload\">\n                        /// Notifies the list data source that the list data has changed so much that it is better\n                        /// to reload the data from scratch.\n                        /// </summary>\n                        /// </signature>\n\n                        // Cancel all promises\n\n                        if (getCountPromise) {\n                            getCountPromise.cancel();\n                        }\n\n                        if (refreshSignal) {\n                            refreshSignal.cancel();\n                        }\n\n                        for (var slot = slotsStart.next; slot !== slotsEnd; slot = slot.next) {\n                            var fetchListeners = slot.fetchListeners;\n                            for (var listenerID in fetchListeners) {\n                                fetchListeners[listenerID].promise.cancel();\n                            }\n                            var directFetchListeners = slot.directFetchListeners;\n                            for (var listenerID in directFetchListeners) {\n                                directFetchListeners[listenerID].promise.cancel();\n                            }\n                        }\n\n                        resetState();\n\n                        forEachBindingRecord(function (bindingRecord) {\n                            if (bindingRecord.notificationHandler) {\n                                bindingRecord.notificationHandler.reload();\n                            }\n                        });\n                    };\n\n                    this.beginNotifications = function () {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.beginNotifications\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.beginNotifications\">\n                        /// Indicates the start of a notification batch.\n                        /// Call it before a sequence of other notification calls to minimize the number of countChanged and\n                        /// indexChanged notifications sent to the client of the VirtualizedDataSource. You must pair it with a call\n                        /// to endNotifications, and pairs can't be nested.\n                        /// </summary>\n                        /// </signature>\n\n                        dataNotificationsInProgress = true;\n                    };\n\n                    function completeNotification() {\n                        if (!dataNotificationsInProgress) {\n                            updateIndices();\n                            finishNotifications();\n\n                            callFetchCompleteCallbacks();\n                        }\n                    }\n\n                    this.inserted = function (newItem, previousKey, nextKey, index) {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted\">\n                        /// Raises a notification that an item was inserted.\n                        /// </summary>\n                        /// <param name=\"newItem\" type=\"Object\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:newItem\">\n                        /// The inserted item. It must have a key and a data property (it must implement the IItem interface).\n                        /// </param>\n                        /// <param name=\"previousKey\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:previousKey\">\n                        /// The key of the item before the insertion point, or null if the item was inserted at the start of the\n                        /// list.  It can be null if you specified nextKey.\n                        /// </param>\n                        /// <param name=\"nextKey\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:nextKey\">\n                        /// The key of the item after the insertion point, or null if the item was inserted at the end of the list.\n                        /// It can be null if you specified previousKey.\n                        /// </param>\n                        /// <param name=\"index\" optional=\"true\" type=\"Number\" integer=\"true\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:index\">\n                        /// The index of the inserted item.\n                        /// </param>\n                        /// </signature>\n\n                        if (editsQueued) {\n                            // We can't change the slots out from under any queued edits\n                            beginRefresh();\n                        } else {\n                            var key = newItem.key,\n                                slotPrev = keyMap[previousKey],\n                                slotNext = keyMap[nextKey];\n\n                            var havePreviousKey = typeof previousKey === \"string\",\n                                haveNextKey = typeof nextKey === \"string\";\n\n                            // Only one of previousKey, nextKey needs to be passed in\n                            //\n                            if (havePreviousKey) {\n                                if (slotNext && !slotNext.firstInSequence) {\n                                    slotPrev = slotNext.prev;\n                                }\n                            } else if (haveNextKey) {\n                                if (slotPrev && !slotPrev.lastInSequence) {\n                                    slotNext = slotPrev.next;\n                                }\n                            }\n\n                            // If the VDS believes the list is empty but the data adapter believes the item has\n                            // a adjacent item start a refresh.\n                            //\n                            if ((havePreviousKey || haveNextKey) && !(slotPrev || slotNext) && (slotsStart.next === slotListEnd)) {\n                                beginRefresh();\n                                return;\n                            }\n\n                            // If this key is known, something has changed, start a refresh.\n                            //\n                            if (keyMap[key]) {\n                                beginRefresh();\n                                return;\n                            }\n\n                            // If the slots aren't adjacent or are thought to be distinct sequences by the\n                            //  VDS something has changed so start a refresh.\n                            //\n                            if (slotPrev && slotNext) {\n                                if (slotPrev.next !== slotNext || slotPrev.lastInSequence || slotNext.firstInSequence) {\n                                    beginRefresh();\n                                    return;\n                                }\n                            }\n\n                            // If one of the adjacent keys or indicies has only just been requested - rare,\n                            //  and easier to deal with in a refresh.\n                            //\n                            if ((slotPrev && (slotPrev.keyRequested || slotPrev.indexRequested)) ||\n                                (slotNext && (slotNext.keyRequested || slotNext.indexRequested))) {\n                                beginRefresh();\n                                return;\n                            }\n\n                            if (slotPrev || slotNext) {\n                                insertNewSlot(key, newItem, (slotNext ? slotNext : slotPrev.next), !!slotPrev, !!slotNext);\n                            } else if (slotsStart.next === slotListEnd) {\n                                insertNewSlot(key, newItem, slotsStart.next, true, true);\n                            } else if (index !== undefined) {\n                                updateNewIndicesFromIndex(index, 1);\n                            } else {\n                                // We could not find a previous or next slot and an index was not provided, start a refresh\n                                //\n                                beginRefresh();\n                                return;\n                            }\n\n                            completeNotification();\n                        }\n                    };\n\n                    this.changed = function (item) {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.changed\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.changed\">\n                        /// Raises a notification that an item changed.\n                        /// </summary>\n                        /// <param name=\"item\" type=\"Object\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.changed_p:item\">\n                        /// An IItem that represents the item that changed.\n                        /// </param>\n                        /// </signature>\n\n                        if (editsQueued) {\n                            // We can't change the slots out from under any queued edits\n                            beginRefresh();\n                        } else {\n                            var key = item.key,\n                                slot = keyMap[key];\n\n                            if (slot) {\n                                if (slot.keyRequested) {\n                                    // The key has only just been requested - rare, and easier to deal with in a refresh\n                                    beginRefresh();\n                                } else {\n                                    slot.itemNew = item;\n\n                                    if (slot.item) {\n                                        changeSlot(slot);\n\n                                        completeNotification();\n                                    }\n                                }\n                            }\n                        }\n                    };\n\n                    this.moved = function (item, previousKey, nextKey, oldIndex, newIndex) {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved\">\n                        /// Raises a notfication that an item was moved.\n                        /// </summary>\n                        /// <param name=\"item\" type=\"Object\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:item\">\n                        /// The item that was moved.\n                        /// </param>\n                        /// <param name=\"previousKey\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:previousKey\">\n                        /// The key of the item before the insertion point, or null if the item was moved to the beginning of the list.\n                        /// It can be null if you specified nextKey.\n                        /// </param>\n                        /// <param name=\"nextKey\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:nextKey\">\n                        /// The key of the item after the insertion point, or null if the item was moved to the end of the list.\n                        /// It can be null if you specified previousKey.\n                        /// </param>\n                        /// <param name=\"oldIndex\" optional=\"true\" type=\"Number\" integer=\"true\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:oldIndex\">\n                        /// The index of the item before it was moved.\n                        /// </param>\n                        /// <param name=\"newIndex\" optional=\"true\" type=\"Number\" integer=\"true\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:newIndex\">\n                        /// The index of the item after it was moved.\n                        /// </param>\n                        /// </signature>\n\n                        if (editsQueued) {\n                            // We can't change the slots out from under any queued edits\n                            beginRefresh();\n                        } else {\n                            var key = item.key,\n                                slot = keyMap[key],\n                                slotPrev = keyMap[previousKey],\n                                slotNext = keyMap[nextKey];\n\n                            if ((slot && slot.keyRequested) || (slotPrev && slotPrev.keyRequested) || (slotNext && slotNext.keyRequested)) {\n                                // One of the keys has only just been requested - rare, and easier to deal with in a refresh\n                                beginRefresh();\n                            } else if (slot) {\n                                if (slotPrev && slotNext && (slotPrev.next !== slotNext || slotPrev.lastInSequence || slotNext.firstInSequence)) {\n                                    // Something has changed, start a refresh\n                                    beginRefresh();\n                                } else if (!slotPrev && !slotNext) {\n                                    // If we can't tell where the item moved to, treat this like a removal\n                                    updateNewIndices(slot, -1);\n                                    deleteSlot(slot, false);\n\n                                    if (oldIndex !== undefined) {\n                                        if (oldIndex < newIndex) {\n                                            newIndex--;\n                                        }\n\n                                        updateNewIndicesFromIndex(newIndex, 1);\n                                    }\n\n                                    completeNotification();\n                                } else {\n                                    updateNewIndices(slot, -1);\n                                    moveSlot(slot, (slotNext ? slotNext : slotPrev.next), !!slotPrev, !!slotNext);\n                                    updateNewIndices(slot, 1);\n\n                                    completeNotification();\n                                }\n                            } else if (slotPrev || slotNext) {\n                                // If previousKey or nextKey is known, but key isn't, treat this like an insertion.\n\n                                if (oldIndex !== undefined) {\n                                    updateNewIndicesFromIndex(oldIndex, -1);\n\n                                    if (oldIndex < newIndex) {\n                                        newIndex--;\n                                    }\n                                }\n\n                                this.inserted(item, previousKey, nextKey, newIndex);\n                            } else if (oldIndex !== undefined) {\n                                updateNewIndicesFromIndex(oldIndex, -1);\n\n                                if (oldIndex < newIndex) {\n                                    newIndex--;\n                                }\n\n                                updateNewIndicesFromIndex(newIndex, 1);\n\n                                completeNotification();\n                            }\n                        }\n                    };\n\n                    this.removed = function (key, index) {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed\">\n                        /// Raises a notification that an item was removed.\n                        /// </summary>\n                        /// <param name=\"key\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed_p:key\">\n                        /// The key of the item that was removed.\n                        /// </param>\n                        /// <param name=\"index\" optional=\"true\" type=\"Number\" integer=\"true\" locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed_p:index\">\n                        /// The index of the item that was removed.\n                        /// </param>\n                        /// </signature>\n\n                        if (editsQueued) {\n                            // We can't change the slots out from under any queued edits\n                            beginRefresh();\n                        } else {\n                            var slot;\n\n                            if (typeof key === \"string\") {\n                                slot = keyMap[key];\n                            } else {\n                                slot = indexMap[index];\n                            }\n\n                            if (slot) {\n                                if (slot.keyRequested) {\n                                    // The key has only just been requested - rare, and easier to deal with in a refresh\n                                    beginRefresh();\n                                } else {\n                                    updateNewIndices(slot, -1);\n                                    deleteSlot(slot, false);\n\n                                    completeNotification();\n                                }\n                            } else if (index !== undefined) {\n                                updateNewIndicesFromIndex(index, -1);\n                                completeNotification();\n                            }\n                        }\n                    };\n\n                    this.endNotifications = function () {\n                        /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.endNotifications\">\n                        /// <summary locid=\"WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.endNotifications\">\n                        /// Concludes a sequence of notifications that began with a call to beginNotifications.\n                        /// </summary>\n                        /// </signature>\n\n                        dataNotificationsInProgress = false;\n                        completeNotification();\n                    };\n\n                } // ListDataNotificationHandler\n\n                function resetState() {\n                    setStatus(DataSourceStatus.ready);\n\n                    // Track count promises\n                    getCountPromise = null;\n\n                    // Track whether listDataAdapter.endEdits needs to be called\n                    beginEditsCalled = false;\n\n                    // Track whether finishNotifications should be called after each edit\n                    editsInProgress = false;\n\n                    // Track whether the first queued edit should be attempted\n                    firstEditInProgress = false;\n\n                    // Queue of edis that have yet to be completed\n                    editQueue = {};\n                    editQueue.next = editQueue;\n                    editQueue.prev = editQueue;\n\n                    // Track whether there are currently edits queued\n                    editsQueued = false;\n\n                    // If an edit has returned noResponse, the edit queue will be reapplied when the next refresh is requested\n                    waitForRefresh = false;\n\n                    // Change to count while multiple edits are taking place\n                    countDelta = 0;\n\n                    // True while the indices are temporarily in a bad state due to multiple edits\n                    indexUpdateDeferred = false;\n\n                    // Next temporary key to use\n                    nextTempKey = 0;\n\n                    // Set of fetches for which results have not yet arrived\n                    fetchesInProgress = {};\n\n                    // Queue of complete callbacks for fetches\n                    fetchCompleteCallbacks = [];\n\n                    // Tracks the count returned explicitly or implicitly by the data adapter\n                    knownCount = CountResult.unknown;\n\n                    // Sentinel objects for list of slots\n                    // Give the start sentinel an index so we can always use predecessor + 1.\n                    slotsStart = {\n                        firstInSequence: true,\n                        lastInSequence: true,\n                        index: -1\n                    };\n                    slotListEnd = {\n                        firstInSequence: true,\n                        lastInSequence: true\n                    };\n                    slotsEnd = {\n                        firstInSequence: true,\n                        lastInSequence: true\n                    };\n                    slotsStart.next = slotListEnd;\n                    slotListEnd.prev = slotsStart;\n                    slotListEnd.next = slotsEnd;\n                    slotsEnd.prev = slotListEnd;\n\n                    // Map of request IDs to slots\n                    handleMap = {};\n\n                    // Map of keys to slots\n                    keyMap = {};\n\n                    // Map of indices to slots\n                    indexMap = {};\n                    indexMap[-1] = slotsStart;\n\n                    // Count of slots that have been released but not deleted\n                    releasedSlots = 0;\n\n                    lastSlotReleased = null;\n\n                    // At most one call to reduce the number of refresh slots should be posted at any given time\n                    reduceReleasedSlotCountPosted = false;\n\n                    // Multiple refresh requests are coalesced\n                    refreshRequested = false;\n\n                    // Requests do not cause fetches while a refresh is in progress\n                    refreshInProgress = false;\n\n                    // Refresh requests yield the same promise until a refresh completes\n                    refreshSignal = null;\n                }\n\n                // Construction\n\n                // Process creation parameters\n                if (!listDataAdapter) {\n                    throw new _ErrorFromName(\"WinJS.UI.ListDataSource.ListDataAdapterIsInvalid\", strings.listDataAdapterIsInvalid);\n                }\n\n                // Minimum number of released slots to retain\n                cacheSize = (listDataAdapter.compareByIdentity ? 0 : 200);\n\n                if (options) {\n                    if (typeof options.cacheSize === \"number\") {\n                        cacheSize = options.cacheSize;\n                    }\n                }\n\n                // Cached listDataNotificationHandler initially undefined\n                if (listDataAdapter.setNotificationHandler) {\n                    listDataNotificationHandler = new ListDataNotificationHandler();\n\n                    listDataAdapter.setNotificationHandler(listDataNotificationHandler);\n                }\n\n                // Current status\n                status = DataSourceStatus.ready;\n\n                // Track whether a change to the status has been posted already\n                statusChangePosted = false;\n\n                // Map of bindingIDs to binding records\n                bindingMap = {};\n\n                // ID to assign to the next ListBinding, incremented each time one is created\n                nextListBindingID = 0;\n\n                // ID assigned to a slot, incremented each time one is created - start with 1 so \"if (handle)\" tests are valid\n                nextHandle = 1;\n\n                // ID assigned to a fetch listener, incremented each time one is created\n                nextListenerID = 0;\n\n                // ID of the refresh in progress, incremented each time a new refresh is started\n                currentRefreshID = 0;\n\n                // Track whether fetchItemsForAllSlots has been posted already\n                fetchesPosted = false;\n\n                // ID of a fetch, incremented each time a new fetch is initiated - start with 1 so \"if (fetchID)\" tests are valid\n                nextFetchID = 1;\n\n                // Sentinel objects for results arrays\n                startMarker = {};\n                endMarker = {};\n\n                resetState();\n\n                // Public methods\n\n                this.createListBinding = function (notificationHandler) {\n                    /// <signature helpKeyword=\"WinJS.UI.IListDataSource.createListBinding\">\n                    /// <summary locid=\"WinJS.UI.IListDataSource.createListBinding\">\n                    /// Creates an IListBinding object that allows a client to read from the list and receive notifications for\n                    /// changes that affect those portions of the list that the client already read.\n                    /// </summary>\n                    /// <param name=\"notificationHandler\" optional=\"true\" locid=\"WinJS.UI.IListDataSource.createListBinding_p:notificationHandler\">\n                    /// An object that implements the IListNotificationHandler interface.  If you omit this parameter,\n                    /// change notifications won't be available.\n                    /// </param>\n                    /// <returns type=\"IListBinding\" locid=\"WinJS.UI.IListDataSource.createListBinding_returnValue\">\n                    /// An object that implements the IListBinding interface.\n                    /// </returns>\n                    /// </signature>\n\n                    var listBindingID = (nextListBindingID++).toString(),\n                        slotCurrent = null,\n                        released = false;\n\n                    function retainSlotForCursor(slot) {\n                        if (slot) {\n                            slot.cursorCount++;\n                        }\n                    }\n\n                    function releaseSlotForCursor(slot) {\n                        if (slot) {\n                            if (--slot.cursorCount === 0) {\n                                releaseSlotIfUnrequested(slot);\n                            }\n                        }\n                    }\n\n                    function moveCursor(slot) {\n                        // Retain the new slot first just in case it's the same slot\n                        retainSlotForCursor(slot);\n                        releaseSlotForCursor(slotCurrent);\n                        slotCurrent = slot;\n                    }\n\n                    function adjustCurrentSlot(slot, slotNew) {\n                        if (slot === slotCurrent) {\n                            if (!slotNew) {\n                                slotNew = (\n                                    !slotCurrent || slotCurrent.lastInSequence || slotCurrent.next === slotListEnd ?\n                                        null :\n                                        slotCurrent.next\n                                );\n                            }\n                            moveCursor(slotNew);\n                        }\n                    }\n\n                    function releaseSlotFromListBinding(slot) {\n                        var bindingMap = slot.bindingMap,\n                            bindingHandle = bindingMap[listBindingID].handle;\n\n                        delete slot.bindingMap[listBindingID];\n\n                        // See if there are any listBindings left in the map\n                        var releaseBindingMap = true,\n                            releaseHandle = true;\n                        for (var listBindingID2 in bindingMap) {\n                            releaseBindingMap = false;\n                            if (bindingHandle && bindingMap[listBindingID2].handle === bindingHandle) {\n                                releaseHandle = false;\n                                break;\n                            }\n                        }\n\n                        if (bindingHandle && releaseHandle) {\n                            delete handleMap[bindingHandle];\n                        }\n                        if (releaseBindingMap) {\n                            slot.bindingMap = null;\n                            releaseSlotIfUnrequested(slot);\n                        }\n                    }\n\n                    function retainItem(slot, listenerID) {\n                        if (!slot.bindingMap) {\n                            slot.bindingMap = {};\n                        }\n\n                        var slotBinding = slot.bindingMap[listBindingID];\n                        if (slotBinding) {\n                            slotBinding.count++;\n                        } else {\n                            slot.bindingMap[listBindingID] = {\n                                bindingRecord: bindingMap[listBindingID],\n                                count: 1\n                            };\n                        }\n\n                        if (slot.fetchListeners) {\n                            var listener = slot.fetchListeners[listenerID];\n                            if (listener) {\n                                listener.retained = true;\n                            }\n                        }\n                    }\n\n                    function releaseItem(handle) {\n                        var slot = handleMap[handle];\n\n                        if (slot) {\n                            var slotBinding = slot.bindingMap[listBindingID];\n                            if (--slotBinding.count === 0) {\n                                var fetchListeners = slot.fetchListeners;\n                                for (var listenerID in fetchListeners) {\n                                    var listener = fetchListeners[listenerID];\n                                    if (listener.listBindingID === listBindingID) {\n                                        listener.retained = false;\n                                    }\n                                }\n\n                                releaseSlotFromListBinding(slot);\n                            }\n                        }\n                    }\n\n                    function itemPromiseFromKnownSlot(slot) {\n                        var handle = handleForBinding(slot, listBindingID),\n                            listenerID = (nextListenerID++).toString();\n\n                        var itemPromise = createFetchPromise(slot, \"fetchListeners\", listenerID, listBindingID,\n                            function (complete, item) {\n                                complete(itemForBinding(item, handle));\n                            }\n                        );\n\n                        defineCommonItemProperties(itemPromise, slot, handle);\n\n                        // Only implement retain and release methods if a notification handler has been supplied\n                        if (notificationHandler) {\n                            itemPromise.retain = function () {\n                                listBinding._retainItem(slot, listenerID);\n                                return itemPromise;\n                            };\n\n                            itemPromise.release = function () {\n                                listBinding._releaseItem(handle);\n                            };\n                        }\n\n                        return itemPromise;\n                    }\n\n                    bindingMap[listBindingID] = {\n                        notificationHandler: notificationHandler,\n                        notificationsSent: false,\n                        adjustCurrentSlot: adjustCurrentSlot,\n                        itemPromiseFromKnownSlot: itemPromiseFromKnownSlot,\n                    };\n\n                    function itemPromiseFromSlot(slot) {\n                        var itemPromise;\n\n                        if (!released && slot) {\n                            itemPromise = itemPromiseFromKnownSlot(slot);\n                        } else {\n                            // Return a complete promise for a non-existent slot\n                            if (released) {\n                                itemPromise = new Promise(function () { });\n                                itemPromise.cancel();\n                            } else {\n                                itemPromise = Promise.wrap(null);\n                            }\n                            defineHandleProperty(itemPromise, null);\n                            // Only implement retain and release methods if a notification handler has been supplied\n                            if (notificationHandler) {\n                                itemPromise.retain = function () { return itemPromise; };\n                                itemPromise.release = function () { };\n                            }\n                        }\n\n                        moveCursor(slot);\n\n                        return itemPromise;\n                    }\n\n                    /// <signature helpKeyword=\"WinJS.UI.IListBinding\">\n                    /// <summary locid=\"WinJS.UI.IListBinding\">\n                    /// An interface that enables a client to read from the list and receive notifications for changes that affect\n                    /// those portions of the list that the client already read.  IListBinding can also enumerate through lists\n                    /// that can change at any time.\n                    /// </summary>\n                    /// </signature>\n                    var listBinding = {\n                        _retainItem: function (slot, listenerID) {\n                            retainItem(slot, listenerID);\n                        },\n\n                        _releaseItem: function (handle) {\n                            releaseItem(handle);\n                        },\n\n                        jumpToItem: function (item) {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.jumpToItem\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.jumpToItem\">\n                            /// Makes the specified item the current item.\n                            /// </summary>\n                            /// <param name=\"item\" type=\"Object\" locid=\"WinJS.UI.IListBinding.jumpToItem_p:item\">\n                            /// The IItem or IItemPromise to make the current item.\n                            /// </param>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.jumpToItem_returnValue\">\n                            /// An object that implements the IItemPromise interface and serves as a promise for the specified item.  If\n                            /// the specified item is not in the list, the promise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(item ? handleMap[item.handle] : null);\n                        },\n\n                        current: function () {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.current\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.current\">\n                            /// Retrieves the current item.\n                            /// </summary>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.current_returnValue\">\n                            /// An object that implements the IItemPromise interface and serves as a promise for the current item.\n                            /// If the cursor has moved past the start or end of the list, the promise completes with a value\n                            /// of null.  If the current item has been deleted or moved, the promise returns an error.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(slotCurrent);\n                        },\n\n                        previous: function () {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.previous\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.previous\">\n                            /// Retrieves the item before the current item and makes it the current item.\n                            /// </summary>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.previous_returnValue\">\n                            /// An object that implements the IItemPromise interface and serves as a promise for the previous item.\n                            /// If the cursor moves past the start of the list, the promise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(slotCurrent ? requestSlotBefore(slotCurrent) : null);\n                        },\n\n                        next: function () {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.next\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.next\">\n                            /// Retrieves the item after the current item and makes it the current item.\n                            /// </summary>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.next_returnValue\">\n                            /// An object that implements the IItemPromise interface and serves as a promise for the next item.  If\n                            /// the cursor moves past the end of the list, the promise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(slotCurrent ? requestSlotAfter(slotCurrent) : null);\n                        },\n\n                        releaseItem: function (item) {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.releaseItem\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.releaseItem\">\n                            /// Creates a request to stop change notfications for the specified item. The item is released only when the\n                            /// number of release calls matches the number of IItemPromise.retain calls. The number of release calls cannot\n                            /// exceed the number of retain calls. This method is present only if you passed an IListNotificationHandler\n                            /// to IListDataSource.createListBinding when it created this IListBinding.\n                            /// </summary>\n                            /// <param name=\"item\" type=\"Object\" locid=\"WinJS.UI.IListBinding.releaseItem_p:item\">\n                            /// The IItem or IItemPromise to release.\n                            /// </param>\n                            /// </signature>\n\n                            this._releaseItem(item.handle);\n                        },\n\n                        release: function () {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.release\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.release\">\n                            /// Releases resources, stops notifications, and cancels outstanding promises\n                            /// for all tracked items that this IListBinding returned.\n                            /// </summary>\n                            /// </signature>\n\n                            released = true;\n\n                            releaseSlotForCursor(slotCurrent);\n                            slotCurrent = null;\n\n                            for (var slot = slotsStart.next; slot !== slotsEnd;) {\n                                var slotNext = slot.next;\n\n                                var fetchListeners = slot.fetchListeners;\n                                for (var listenerID in fetchListeners) {\n                                    var listener = fetchListeners[listenerID];\n                                    if (listener.listBindingID === listBindingID) {\n                                        listener.promise.cancel();\n                                        delete fetchListeners[listenerID];\n                                    }\n                                }\n\n                                if (slot.bindingMap && slot.bindingMap[listBindingID]) {\n                                    releaseSlotFromListBinding(slot);\n                                }\n\n                                slot = slotNext;\n                            }\n\n                            delete bindingMap[listBindingID];\n                        }\n                    };\n\n                    // Only implement each navigation method if the data adapter implements certain methods\n\n                    if (itemsFromStart || itemsFromIndex) {\n                        listBinding.first = function () {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.first\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.first\">\n                            /// Retrieves the first item in the list and makes it the current item.\n                            /// </summary>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.first_returnValue\">\n                            /// An IItemPromise that serves as a promise for the requested item.\n                            /// If the list is empty, the Promise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(requestSlotAfter(slotsStart));\n                        };\n                    }\n\n                    if (itemsFromEnd) {\n                        listBinding.last = function () {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.last\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.last\">\n                            /// Retrieves the last item in the list and makes it the current item.\n                            /// </summary>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.last_returnValue\">\n                            /// An IItemPromise that serves as a promise for the requested item.\n                            /// If the list is empty, the Promise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(requestSlotBefore(slotListEnd));\n                        };\n                    }\n\n                    if (itemsFromKey) {\n                        listBinding.fromKey = function (key, hints) {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.fromKey\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.fromKey\">\n                            /// Retrieves the item with the specified key and makes it the current item.\n                            /// </summary>\n                            /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListBinding.fromKey_p:key\">\n                            /// The key of the requested item. It must be a non-empty string.\n                            /// </param>\n                            /// <param name=\"hints\" locid=\"WinJS.UI.IListBinding.fromKey_p:hints\">\n                            /// Domain-specific hints to the IListDataAdapter\n                            /// about the location of the item to improve retrieval time.\n                            /// </param>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.fromKey_returnValue\">\n                            /// An IItemPromise that serves as a promise for the requested item.\n                            /// If the list doesn't contain an item with the specified key, the Promise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(slotFromKey(key, hints));\n                        };\n                    }\n\n                    if (itemsFromIndex || (itemsFromStart && itemsFromKey)) {\n                        listBinding.fromIndex = function (index) {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.fromIndex\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.fromIndex\">\n                            /// Retrieves the item with the specified index and makes it the current item.\n                            /// </summary>\n                            /// <param name=\"index\" type=\"Nunmber\" integer=\"true\" locid=\"WinJS.UI.IListBinding.fromIndex_p:index\">\n                            /// A value greater than or equal to 0 that is the index of the item to retrieve.\n                            /// </param>\n                            /// <returns type=\"IItemPromise\" locid=\"WinJS.UI.IListBinding.fromIndex_returnValue\">\n                            /// An IItemPromise that serves as a promise for the requested item.\n                            /// If the list doesn't contain an item with the specified index, the IItemPromise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(slotFromIndex(index));\n                        };\n                    }\n\n                    if (itemsFromDescription) {\n                        listBinding.fromDescription = function (description) {\n                            /// <signature helpKeyword=\"WinJS.UI.IListBinding.fromDescription\">\n                            /// <summary locid=\"WinJS.UI.IListBinding.fromDescription\">\n                            /// Retrieves the item with the specified description and makes it the current item.\n                            /// </summary>\n                            /// <param name=\"description\" locid=\"WinJS.UI.IListDataSource.fromDescription_p:description\">\n                            /// The domain-specific description of the requested item, to be interpreted by the list data adapter.\n                            /// </param>\n                            /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.fromDescription_returnValue\">\n                            /// A Promise for the requested item. If the list doesn't contain an item with the specified description,\n                            /// the IItemPromise completes with a value of null.\n                            /// </returns>\n                            /// </signature>\n\n                            return itemPromiseFromSlot(slotFromDescription(description));\n                        };\n                    }\n\n                    return listBinding;\n                };\n\n                this.invalidateAll = function () {\n                    /// <signature helpKeyword=\"WinJS.UI.IListDataSource.invalidateAll\">\n                    /// <summary locid=\"WinJS.UI.IListDataSource.invalidateAll\">\n                    /// Makes the data source refresh its cached items by re-requesting them from the data adapter.\n                    /// The data source generates notifications if the data has changed.\n                    /// </summary>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.invalidateAll_returnValue\">\n                    /// A Promise that completes when the data has been completely refreshed and all change notifications have been\n                    /// sent.\n                    /// </returns>\n                    /// </signature>\n\n                    return requestRefresh();\n                };\n\n                // Create a helper which issues new promises for the result of the input promise\n                //  but have their cancelations ref-counted so that any given consumer canceling\n                //  their promise doesn't result in the incoming promise being canceled unless\n                //  all consumers are no longer interested in the result.\n                //\n                var countedCancelation = function (incomingPromise, dataSource) {\n                    var signal = new _Signal();\n                    incomingPromise.then(\n                        function (v) { signal.complete(v); },\n                        function (e) { signal.error(e); }\n                    );\n                    var resultPromise = signal.promise.then(null, function (e) {\n                        if (e.name === \"WinJS.UI.VirtualizedDataSource.resetCount\") {\n                            getCountPromise = null;\n                            return incomingPromise = dataSource.getCount();\n                        }\n                        return Promise.wrapError(e);\n                    });\n                    var count = 0;\n                    var currentGetCountPromise = {\n                        get: function () {\n                            count++;\n                            return new Promise(\n                                function (c, e) { resultPromise.then(c, e); },\n                                function () {\n                                    if (--count === 0) {\n                                        // when the count reaches zero cancel the incoming promise\n                                        signal.promise.cancel();\n                                        incomingPromise.cancel();\n                                        if (currentGetCountPromise === getCountPromise) {\n                                            getCountPromise = null;\n                                        }\n                                    }\n                                }\n                            );\n                        },\n                        reset: function () {\n                            signal.error(new _ErrorFromName(\"WinJS.UI.VirtualizedDataSource.resetCount\"));\n                        },\n                        cancel: function () {\n                            // if explicitly asked to cancel the incoming promise\n                            signal.promise.cancel();\n                            incomingPromise.cancel();\n                            if (currentGetCountPromise === getCountPromise) {\n                                getCountPromise = null;\n                            }\n                        }\n                    };\n                    return currentGetCountPromise;\n                };\n\n                this.getCount = function () {\n                    /// <signature helpKeyword=\"WinJS.UI.IListDataSource.getCount\">\n                    /// <summary locid=\"WinJS.UI.IListDataSource.getCount\">\n                    /// Retrieves the number of items in the data source.\n                    /// </summary>\n                    /// </signature>\n\n                    if (listDataAdapter.getCount) {\n                        // Always do a fetch, even if there is a cached result\n                        //\n                        var that = this;\n                        return Promise.wrap().then(function () {\n                            if (editsInProgress || editsQueued) {\n                                return knownCount;\n                            }\n\n                            var requestPromise;\n\n                            if (!getCountPromise) {\n\n                                var relatedGetCountPromise;\n\n                                // Make a request for the count\n                                //\n                                requestPromise = listDataAdapter.getCount();\n                                var synchronous;\n                                requestPromise.then(\n                                    function () {\n                                        if (getCountPromise === relatedGetCountPromise) {\n                                            getCountPromise = null;\n                                        }\n                                        synchronous = true;\n                                    },\n                                    function () {\n                                        if (getCountPromise === relatedGetCountPromise) {\n                                            getCountPromise = null;\n                                        }\n                                        synchronous = true;\n                                    }\n                                );\n\n                                // Every time we make a new request for the count we can consider the\n                                //  countDelta to be invalidated\n                                //\n                                countDelta = 0;\n\n                                // Wrap the result in a cancelation counter which will block cancelation\n                                //  of the outstanding promise unless all consumers cancel.\n                                //\n                                if (!synchronous) {\n                                    relatedGetCountPromise = getCountPromise = countedCancelation(requestPromise, that);\n                                }\n                            }\n\n                            return getCountPromise ? getCountPromise.get() : requestPromise;\n\n                        }).then(function (count) {\n                            if (!isNonNegativeInteger(count) && count !== undefined) {\n                                throw new _ErrorFromName(\"WinJS.UI.ListDataSource.InvalidRequestedCountReturned\", strings.invalidRequestedCountReturned);\n                            }\n\n                            if (count !== knownCount) {\n                                if (knownCount === CountResult.unknown) {\n                                    knownCount = count;\n                                } else {\n                                    changeCount(count);\n                                    finishNotifications();\n                                }\n                            }\n\n                            if (count === 0) {\n                                if (slotsStart.next !== slotListEnd || slotListEnd.next !== slotsEnd) {\n                                    // A contradiction has been found\n                                    beginRefresh();\n                                } else if (slotsStart.lastInSequence) {\n                                    // Now we know the list is empty\n                                    mergeSequences(slotsStart);\n                                    slotListEnd.index = 0;\n                                }\n                            }\n\n                            return count;\n                        }).then(null, function (error) {\n                            if (error.name === _UI.CountError.noResponse) {\n                                // Report the failure, but still report last known count\n                                setStatus(DataSourceStatus.failure);\n                                return knownCount;\n                            }\n                            return Promise.wrapError(error);\n                        });\n                    } else {\n                        // If the data adapter doesn't support the count method, return the VirtualizedDataSource's\n                        //  reckoning of the count.\n                        return Promise.wrap(knownCount);\n                    }\n                };\n\n                if (itemsFromKey) {\n                    this.itemFromKey = function (key, hints) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.itemFromKey\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.itemFromKey\">\n                        /// Retrieves the item with the specified key.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.itemFromKey_p:key\">\n                        /// The key of the requested item. It must be a non-empty string.\n                        /// </param>\n                        /// <param name=\"hints\" locid=\"WinJS.UI.IListDataSource.itemFromKey_p:hints\">\n                        /// Domain-specific hints to IListDataAdapter about the location of the item\n                        /// to improve the retrieval time.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.itemFromKey_returnValue\">\n                        /// A Promise for the requested item. If the list doesn't contain an item with the specified key,\n                        /// the Promise completes with a value of null.\n                        /// </returns>\n                        /// </signature>\n\n                        return itemDirectlyFromSlot(slotFromKey(key, hints));\n                    };\n                }\n\n                if (itemsFromIndex || (itemsFromStart && itemsFromKey)) {\n                    this.itemFromIndex = function (index) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.itemFromIndex\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.itemFromIndex\">\n                        /// Retrieves the item at the specified index.\n                        /// </summary>\n                        /// <param name=\"index\" type=\"Number\" integer=\"true\" locid=\"WinJS.UI.IListDataSource.itemFromIndex_p:index\">\n                        /// A value greater than or equal to zero that is the index of the requested item.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.itemFromIndex_returnValue\">\n                        /// A Promise for the requested item. If the list doesn't contain an item with the specified index,\n                        /// the Promise completes with a value of null.\n                        /// </returns>\n                        /// </signature>\n\n                        return itemDirectlyFromSlot(slotFromIndex(index));\n                    };\n                }\n\n                if (itemsFromDescription) {\n                    this.itemFromDescription = function (description) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.itemFromDescription\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.itemFromDescription\">\n                        /// Retrieves the item with the specified description.\n                        /// </summary>\n                        /// <param name=\"description\" locid=\"WinJS.UI.IListDataSource.itemFromDescription_p:description\">\n                        /// Domain-specific info that describes the item to retrieve, to be interpreted by the IListDataAdapter,\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.itemFromDescription_returnValue\">\n                        /// A Promise for the requested item. If the list doesn't contain an item with the specified description,\n                        /// the Promise completes with a value of null.\n                        /// </returns>\n                        /// </signature>\n\n                        return itemDirectlyFromSlot(slotFromDescription(description));\n                    };\n                }\n\n                this.beginEdits = function () {\n                    /// <signature helpKeyword=\"WinJS.UI.IListDataSource.beginEdits\">\n                    /// <summary locid=\"WinJS.UI.IListDataSource.beginEdits\">\n                    /// Notifies the data source that a sequence of edits is about to begin.  The data source calls\n                    /// IListNotificationHandler.beginNotifications and endNotifications each one time for a sequence of edits.\n                    /// </summary>\n                    /// </signature>\n\n                    editsInProgress = true;\n                };\n\n                // Only implement each editing method if the data adapter implements the corresponding ListDataAdapter method\n\n                if (listDataAdapter.insertAtStart) {\n                    this.insertAtStart = function (key, data) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.insertAtStart\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.insertAtStart\">\n                        /// Adds an item to the beginning of the data source.\n                        /// </summary>\n                        /// <param name=\"key\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.IListDataSource.insertAtStart_p:key\">\n                        /// The key of the item to insert, if known; otherwise, null.\n                        /// </param>\n                        /// <param name=\"data\" locid=\"WinJS.UI.IListDataSource.insertAtStart_p:data\">\n                        /// The data for the item to add.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.insertAtStart_returnValue\">\n                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        // Add item to start of list, only notify if the first item was requested\n                        return insertItem(\n                            key, data,\n\n                            // slotInsertBefore, append\n                            (slotsStart.lastInSequence ? null : slotsStart.next), true,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.insertAtStart(key, data);\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.insertBefore) {\n                    this.insertBefore = function (key, data, nextKey) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.insertBefore\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.insertBefore\">\n                        /// Inserts an item before another item.\n                        /// </summary>\n                        /// <param name=\"key\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.IListDataSource.insertBefore_p:key\">\n                        /// The key of the item to insert, if known; otherwise, null.\n                        /// </param>\n                        /// <param name=\"data\" locid=\"WinJS.UI.IListDataSource.insertBefore_p:data\">\n                        /// The data for the item to insert.\n                        /// </param>\n                        /// <param name=\"nextKey\" type=\"String\" locid=\"WinJS.UI.IListDataSource.insertBefore_p:nextKey\">\n                        /// The key of an item in the data source. The new data is inserted before this item.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.insertBefore_returnValue\">\n                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slotNext = getSlotForEdit(nextKey);\n\n                        // Add item before given item and send notification\n                        return insertItem(\n                            key, data,\n\n                            // slotInsertBefore, append\n                            slotNext, false,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.insertBefore(key, data, nextKey, adjustedIndex(slotNext));\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.insertAfter) {\n                    this.insertAfter = function (key, data, previousKey) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.insertAfter\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.insertAfter\">\n                        /// Inserts an item after another item.\n                        /// </summary>\n                        /// <param name=\"key\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.IListDataSource.insertAfter_p:key\">\n                        /// The key of the item to insert, if known; otherwise, null.\n                        /// </param>\n                        /// <param name=\"data\" locid=\"WinJS.UI.IListDataSource.insertAfter_p:data\">\n                        /// The data for the item to insert.\n                        /// </param>\n                        /// <param name=\"previousKey\" type=\"String\" locid=\"WinJS.UI.IListDataSource.insertAfter_p:previousKey\">\n                        /// The key for an item in the data source. The new item is added after this item.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.insertAfter_returnValue\">\n                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slotPrev = getSlotForEdit(previousKey);\n\n                        // Add item after given item and send notification\n                        return insertItem(\n                            key, data,\n\n                            // slotInsertBefore, append\n                            (slotPrev ? slotPrev.next : null), true,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.insertAfter(key, data, previousKey, adjustedIndex(slotPrev));\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.insertAtEnd) {\n                    this.insertAtEnd = function (key, data) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.insertAtEnd\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.insertAtEnd\">\n                        /// Adds an item to the end of the data source.\n                        /// </summary>\n                        /// <param name=\"key\" mayBeNull=\"true\" type=\"String\" locid=\"WinJS.UI.IListDataSource.insertAtEnd_p:key\">\n                        /// The key of the item to insert, if known; otherwise, null.\n                        /// </param>\n                        /// <param name=\"data\" locid=\"WinJS.UI.IListDataSource.insertAtEnd_data\">\n                        /// The data for the item to insert.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.insertAtEnd_returnValue\">\n                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        // Add item to end of list, only notify if the last item was requested\n                        return insertItem(\n                            key, data,\n\n                            // slotInsertBefore, append\n                            (slotListEnd.firstInSequence ? null : slotListEnd), false,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.insertAtEnd(key, data);\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.change) {\n                    this.change = function (key, newData) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.change\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.change\">\n                        /// Overwrites the data of the specified item.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.change_p:key\">\n                        /// The key for the item to replace.\n                        /// </param>\n                        /// <param name=\"newData\" type=\"Object\" locid=\"WinJS.UI.IListDataSource.change_p:newData\">\n                        /// The new data for the item.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.change_returnValue\">\n                        /// A Promise that contains the IItem that was updated or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slot = getSlotForEdit(key);\n\n                        return new Promise(function (complete, error) {\n                            var itemOld;\n\n                            queueEdit(\n                                // applyEdit\n                                function () {\n                                    return listDataAdapter.change(key, newData, adjustedIndex(slot));\n                                },\n\n                                EditType.change, complete, error,\n\n                                // keyUpdate\n                                null,\n\n                                // updateSlots\n                                function () {\n                                    itemOld = slot.item;\n\n                                    slot.itemNew = {\n                                        key: key,\n                                        data: newData\n                                    };\n\n                                    if (itemOld) {\n                                        changeSlot(slot);\n                                    } else {\n                                        completeFetchPromises(slot);\n                                    }\n                                },\n\n                                // undo\n                                function () {\n                                    if (itemOld) {\n                                        slot.itemNew = itemOld;\n                                        changeSlot(slot);\n                                    } else {\n                                        beginRefresh();\n                                    }\n                                }\n                            );\n                        });\n                    };\n                }\n\n                if (listDataAdapter.moveToStart) {\n                    this.moveToStart = function (key) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.moveToStart\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.moveToStart\">\n                        /// Moves the specified item to the beginning of the data source.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.moveToStart_p:key\">\n                        /// The key of the item to move.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.moveToStart_returnValue\">\n                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slot = getSlotForEdit(key);\n\n                        return moveItem(\n                            slot,\n\n                            // slotMoveBefore, append\n                            slotsStart.next, true,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.moveToStart(key, adjustedIndex(slot));\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.moveBefore) {\n                    this.moveBefore = function (key, nextKey) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.moveBefore\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.moveBefore\">\n                        /// Moves the specified item before another item.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.moveBefore_p:key\">\n                        /// The key of the item to move.\n                        /// </param>\n                        /// <param name=\"nextKey\" type=\"String\" locid=\"WinJS.UI.IListDataSource.moveBefore_p:nextKey\">\n                        /// The key of another item in the data source. The item specified by the key parameter\n                        /// is moved to a position immediately before this item.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.moveBefore_returnValue\">\n                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slot = getSlotForEdit(key),\n                            slotNext = getSlotForEdit(nextKey);\n\n                        return moveItem(\n                            slot,\n\n                            // slotMoveBefore, append\n                            slotNext, false,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.moveBefore(key, nextKey, adjustedIndex(slot), adjustedIndex(slotNext));\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.moveAfter) {\n                    this.moveAfter = function (key, previousKey) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.moveAfter\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.moveAfter\">\n                        /// Moves an item after another item.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.moveAfter_p:key\">\n                        /// The key of the item to move.\n                        /// </param>\n                        /// <param name=\"previousKey\" type=\"String\" locid=\"WinJS.UI.IListDataSource.moveAfter_p:previousKey\">\n                        /// The key of another item in the data source. The item specified by the key parameter will\n                        /// is moved to a position immediately after this item.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.moveAfter_returnValue\">\n                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slot = getSlotForEdit(key),\n                            slotPrev = getSlotForEdit(previousKey);\n\n                        return moveItem(\n                            slot,\n\n                            // slotMoveBefore, append\n                            slotPrev.next, true,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.moveAfter(key, previousKey, adjustedIndex(slot), adjustedIndex(slotPrev));\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.moveToEnd) {\n                    this.moveToEnd = function (key) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.moveToEnd\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.moveToEnd\">\n                        /// Moves an item to the end of the data source.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.moveToEnd_p:key\">\n                        /// The key of the item to move.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.moveToEnd_returnValue\">\n                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        var slot = getSlotForEdit(key);\n\n                        return moveItem(\n                            slot,\n\n                            // slotMoveBefore, append\n                            slotListEnd, false,\n\n                            // applyEdit\n                            function () {\n                                return listDataAdapter.moveToEnd(key, adjustedIndex(slot));\n                            }\n                        );\n                    };\n                }\n\n                if (listDataAdapter.remove) {\n                    this.remove = function (key) {\n                        /// <signature helpKeyword=\"WinJS.UI.IListDataSource.remove\">\n                        /// <summary locid=\"WinJS.UI.IListDataSource.remove\">\n                        /// Removes an item from the data source.\n                        /// </summary>\n                        /// <param name=\"key\" type=\"String\" locid=\"WinJS.UI.IListDataSource.remove_p:key\">\n                        /// The key of the item to remove.\n                        /// </param>\n                        /// <returns type=\"Promise\" locid=\"WinJS.UI.IListDataSource.remove_returnValue\">\n                        /// A Promise that contains nothing if the operation was successful or an EditError if an error occurred.\n                        /// </returns>\n                        /// </signature>\n\n                        validateKey(key);\n\n                        var slot = keyMap[key];\n\n                        return new Promise(function (complete, error) {\n                            var slotNext,\n                                firstInSequence,\n                                lastInSequence;\n\n                            queueEdit(\n                                // applyEdit\n                                function () {\n                                    return listDataAdapter.remove(key, adjustedIndex(slot));\n                                },\n\n                                EditType.remove, complete, error,\n\n                                // keyUpdate\n                                null,\n\n                                // updateSlots\n                                function () {\n                                    if (slot) {\n                                        slotNext = slot.next;\n                                        firstInSequence = slot.firstInSequence;\n                                        lastInSequence = slot.lastInSequence;\n\n                                        updateNewIndices(slot, -1);\n                                        deleteSlot(slot, false);\n                                    }\n                                },\n\n                                // undo\n                                function () {\n                                    if (slot) {\n                                        reinsertSlot(slot, slotNext, !firstInSequence, !lastInSequence);\n                                        updateNewIndices(slot, 1);\n                                        sendInsertedNotification(slot);\n                                    }\n                                }\n                            );\n                        });\n                    };\n                }\n\n                this.endEdits = function () {\n                    /// <signature helpKeyword=\"WinJS.UI.IListDataSource.endEdits\">\n                    /// <summary locid=\"WinJS.UI.IListDataSource.endEdits\">\n                    /// Notifies the data source that a sequence of edits has ended.  The data source will call\n                    /// IListNotificationHandler.beginNotifications and endNotifications once each for a sequence of edits.\n                    /// </summary>\n                    /// </signature>\n\n                    editsInProgress = false;\n                    completeEdits();\n                };\n\n            } // _baseDataSourceConstructor\n\n            var VDS = _Base.Class.define(function () {\n                /// <signature helpKeyword=\"WinJS.UI.VirtualizedDataSource\">\n                /// <summary locid=\"WinJS.UI.VirtualizedDataSource\">\n                /// Use as a base class when defining a custom data source. Do not instantiate directly.\n                /// </summary>\n                /// <event name=\"statuschanged\" locid=\"WinJS.UI.VirtualizedDataSource_e:statuschanged\">\n                /// Raised when the status of the VirtualizedDataSource changes between ready, waiting, and failure states.\n                /// </event>\n                /// </signature>\n            }, {\n                _baseDataSourceConstructor: _baseDataSourceConstructor,\n                _isVirtualizedDataSource: true\n            }, { // Static Members\n                supportedForProcessing: false\n            });\n            _Base.Class.mix(VDS, _Events.eventMixin);\n            return VDS;\n        })\n\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Group Data Source\n\ndefine('WinJS/VirtualizedDataSource/_GroupDataSource',[\n    'exports',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Promise',\n    '../Scheduler',\n    '../Utilities/_UI',\n    './_VirtualizedDataSourceImpl'\n    ], function groupDataSourceInit(exports, _Base, _ErrorFromName, Promise, Scheduler, _UI, VirtualizedDataSource) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n\n        _GroupDataSource: _Base.Namespace._lazy(function () {\n\n            // Private statics\n\n            function errorDoesNotExist() {\n                return new _ErrorFromName(_UI.FetchError.doesNotExist);\n            }\n\n            var batchSizeDefault = 101;\n\n            function groupReady(group) {\n                return group && group.firstReached && group.lastReached;\n            }\n\n            var ListNotificationHandler = _Base.Class.define(function ListNotificationHandler_ctor(groupDataAdapter) {\n                // Constructor\n\n                this._groupDataAdapter = groupDataAdapter;\n            }, {\n                // Public methods\n\n                beginNotifications: function () {\n                },\n\n                // itemAvailable: not implemented\n\n                inserted: function (itemPromise, previousHandle, nextHandle) {\n                    this._groupDataAdapter._inserted(itemPromise, previousHandle, nextHandle);\n                },\n\n                changed: function (newItem, oldItem) {\n                    this._groupDataAdapter._changed(newItem, oldItem);\n                },\n\n                moved: function (itemPromise, previousHandle, nextHandle) {\n                    this._groupDataAdapter._moved(itemPromise, previousHandle, nextHandle);\n                },\n\n                removed: function (handle, mirage) {\n                    this._groupDataAdapter._removed(handle, mirage);\n                },\n\n                countChanged: function (newCount, oldCount) {\n                    if (newCount === 0 && oldCount !== 0) {\n                        this._groupDataAdapter.invalidateGroups();\n                    }\n                },\n\n                indexChanged: function (handle, newIndex, oldIndex) {\n                    this._groupDataAdapter._indexChanged(handle, newIndex, oldIndex);\n                },\n\n                endNotifications: function () {\n                    this._groupDataAdapter._endNotifications();\n                },\n\n                reload: function () {\n                    this._groupDataAdapter._reload();\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n\n            var GroupDataAdapter = _Base.Class.define(function GroupDataAdapater_ctor(listDataSource, groupKey, groupData, options) {\n                // Constructor\n\n                this._listBinding = listDataSource.createListBinding(new ListNotificationHandler(this));\n\n                this._groupKey = groupKey;\n                this._groupData = groupData;\n\n                // _initializeState clears the count, so call this before processing the groupCountEstimate option\n                this._initializeState();\n\n                this._batchSize = batchSizeDefault;\n                this._count = null;\n\n                if (options) {\n                    if (typeof options.groupCountEstimate === \"number\") {\n                        this._count = (options.groupCountEstimate < 0 ? null : Math.max(options.groupCountEstimate, 1));\n                    }\n                    if (typeof options.batchSize === \"number\") {\n                        this._batchSize = options.batchSize + 1;\n                    }\n                }\n\n                if (this._listBinding.last) {\n                    this.itemsFromEnd = function (count) {\n                        var that = this;\n                        return this._fetchItems(\n                            // getGroup\n                            function () {\n                                return that._lastGroup;\n                            },\n\n                            // mayExist\n                            function (failed) {\n                                if (failed) {\n                                    return false;\n                                }\n                                var count = that._count;\n                                if (+count !== count) {\n                                    return true;\n                                }\n                                if (count > 0) {\n                                    return true;\n                                }\n                            },\n\n                            // fetchInitialBatch\n                            function () {\n                                that._fetchBatch(that._listBinding.last(), that._batchSize - 1, 0);\n                            },\n\n                            count - 1, 0\n                        );\n                    };\n                }\n            }, {\n                // Public members\n\n                setNotificationHandler: function (notificationHandler) {\n                    this._listDataNotificationHandler = notificationHandler;\n                },\n\n                // The ListDataSource should always compare these items by identity; in rare cases, it will do some unnecessary\n                // rerendering, but at least fetching will not stringify items we already know to be valid and that we know\n                // have not changed.\n                compareByIdentity: true,\n\n                // itemsFromStart: not implemented\n\n                // itemsFromEnd: implemented in constructor\n\n                itemsFromKey: function (key, countBefore, countAfter, hints) {\n                    var that = this;\n                    return this._fetchItems(\n                        // getGroup\n                        function () {\n                            return that._keyMap[key];\n                        },\n\n                        // mayExist\n                        function () {\n                            var lastGroup = that._lastGroup;\n                            if (!lastGroup) {\n                                return true;\n                            }\n                            if (+lastGroup.index !== lastGroup.index) {\n                                return true;\n                            }\n                        },\n\n                        // fetchInitialBatch\n                        function () {\n                            hints = hints || {};\n                            var itemPromise = (\n                                typeof hints.groupMemberKey === \"string\" && that._listBinding.fromKey ?\n                                    that._listBinding.fromKey(hints.groupMemberKey) :\n                                typeof hints.groupMemberIndex === \"number\" && that._listBinding.fromIndex ?\n                                    that._listBinding.fromIndex(hints.groupMemberIndex) :\n                                hints.groupMemberDescription !== undefined && that._listBinding.fromDescription ?\n                                    that._listBinding.fromDescription(hints.groupMemberDescription) :\n                                    that._listBinding.first()\n                            );\n\n                            var fetchBefore = Math.floor(0.5 * (that._batchSize - 1));\n                            that._fetchBatch(itemPromise, fetchBefore, that._batchSize - 1 - fetchBefore);\n                        },\n\n                        countBefore, countAfter\n                    );\n                },\n\n                itemsFromIndex: function (index, countBefore, countAfter) {\n                    var that = this;\n                    return this._fetchItems(\n                        // getGroup\n                        function () {\n                            return that._indexMap[index];\n                        },\n\n                        // mayExist\n                        function () {\n                            var lastGroup = that._lastGroup;\n                            if (!lastGroup) {\n                                return true;\n                            }\n                            if (+lastGroup.index !== lastGroup.index) {\n                                return true;\n                            }\n                            if (index <= lastGroup.index) {\n                                return true;\n                            }\n                        },\n\n                        // fetchInitialBatch\n                        function () {\n                            that._fetchNextIndex();\n                        },\n\n                        countBefore, countAfter\n                    );\n                },\n\n                // itemsFromDescription: not implemented\n\n                getCount: function () {\n                    if (this._lastGroup && typeof this._lastGroup.index === \"number\") {\n                        return Promise.wrap(this._count);\n                    } else {\n                        // Even if there's a current estimate for _count, consider this call to be a request to determine the true\n                        // count.\n\n                        var that = this;\n                        var countPromise = new Promise(function (complete) {\n                            var fetch = {\n                                initialBatch: function () {\n                                    that._fetchNextIndex();\n                                },\n                                getGroup: function () { return null; },\n                                countBefore: 0,\n                                countAfter: 0,\n                                complete: function (failed) {\n                                    if (failed) {\n                                        that._count = 0;\n                                    }\n\n                                    var count = that._count;\n                                    if (typeof count === \"number\") {\n                                        complete(count);\n                                        return true;\n                                    } else {\n                                        return false;\n                                    }\n                                }\n                            };\n\n                            that._fetchQueue.push(fetch);\n\n                            if (!that._itemBatch) {\n                                that._continueFetch(fetch);\n                            }\n                        });\n\n                        return (typeof this._count === \"number\" ? Promise.wrap(this._count) : countPromise);\n                    }\n                },\n\n                invalidateGroups: function () {\n                    this._beginRefresh();\n                    this._initializeState();\n                },\n\n                // Editing methods not implemented\n\n                // Private members\n\n                _initializeState: function () {\n                    this._count = null;\n                    this._indexMax = null;\n\n                    this._keyMap = {};\n                    this._indexMap = {};\n                    this._lastGroup = null;\n                    this._handleMap = {};\n\n                    this._fetchQueue = [];\n\n                    this._itemBatch = null;\n                    this._itemsToFetch = 0;\n\n                    this._indicesChanged = false;\n                },\n\n                _releaseItem: function (item) {\n                    delete this._handleMap[item.handle];\n                    this._listBinding.releaseItem(item);\n                },\n\n                _processBatch: function () {\n                    var previousItem = null,\n                        previousGroup = null,\n                        firstItemInGroup = null,\n                        itemsSinceStart = 0,\n                        failed = true;\n                    for (var i = 0; i < this._batchSize; i++) {\n                        var item = this._itemBatch[i],\n                            groupKey = (item ? this._groupKey(item) : null);\n\n                        if (item) {\n                            failed = false;\n                        }\n\n                        if (previousGroup && groupKey !== null && groupKey === previousGroup.key) {\n                            // This item is in the same group as the last item.  The only thing to do is advance the group's\n                            // lastItem if this is definitely the last item that has been processed for the group.\n                            itemsSinceStart++;\n                            if (previousGroup.lastItem === previousItem) {\n                                if (previousGroup.lastItem.handle !== previousGroup.firstItem.handle) {\n                                    this._releaseItem(previousGroup.lastItem);\n                                }\n                                previousGroup.lastItem = item;\n                                this._handleMap[item.handle] = previousGroup;\n\n                                previousGroup.size++;\n                            } else if (previousGroup.firstItem === item) {\n                                if (previousGroup.firstItem.handle !== previousGroup.lastItem.handle) {\n                                    this._releaseItem(previousGroup.firstItem);\n                                }\n                                previousGroup.firstItem = firstItemInGroup;\n                                this._handleMap[firstItemInGroup.handle] = previousGroup;\n\n                                previousGroup.size += itemsSinceStart;\n                            }\n                        } else {\n                            var index = null;\n\n                            if (previousGroup) {\n                                previousGroup.lastReached = true;\n\n                                if (typeof previousGroup.index === \"number\") {\n                                    index = previousGroup.index + 1;\n                                }\n                            }\n\n                            if (item) {\n                                // See if the current group has already been processed\n                                var group = this._keyMap[groupKey];\n\n                                if (!group) {\n                                    group = {\n                                        key: groupKey,\n                                        data: this._groupData(item),\n                                        firstItem: item,\n                                        lastItem: item,\n                                        size: 1\n                                    };\n                                    this._keyMap[group.key] = group;\n                                    this._handleMap[item.handle] = group;\n                                }\n\n                                if (i > 0) {\n                                    group.firstReached = true;\n\n                                    if (!previousGroup) {\n                                        index = 0;\n                                    }\n                                }\n\n                                if (typeof group.index !== \"number\" && typeof index === \"number\") {\n                                    // Set the indices of as many groups as possible\n                                    for (var group2 = group; group2; group2 = this._nextGroup(group2)) {\n                                        group2.index = index;\n                                        this._indexMap[index] = group2;\n\n                                        index++;\n                                    }\n\n                                    this._indexMax = index;\n                                    if (typeof this._count === \"number\" && !this._lastGroup && this._count <= this._indexMax) {\n                                        this._count = this._indexMax + 1;\n                                    }\n                                }\n\n                                firstItemInGroup = item;\n                                itemsSinceStart = 0;\n\n                                previousGroup = group;\n                            } else {\n                                if (previousGroup) {\n                                    this._lastGroup = previousGroup;\n\n                                    if (typeof previousGroup.index === \"number\") {\n                                        this._count = (previousGroup.index + 1);\n                                    }\n\n                                    // Force a client refresh (which should be fast) to ensure that a countChanged notification is\n                                    // sent.\n                                    this._listDataNotificationHandler.invalidateAll();\n\n                                    previousGroup = null;\n                                }\n                            }\n                        }\n\n                        previousItem = item;\n                    }\n\n                    // See how many fetches have now completed\n                    var fetch;\n                    for (fetch = this._fetchQueue[0]; fetch && fetch.complete(failed) ; fetch = this._fetchQueue[0]) {\n                        this._fetchQueue.splice(0, 1);\n                    }\n\n                    // Continue work on the next fetch, if any\n                    if (fetch) {\n                        var that = this;\n                        // Avoid reentering _processBatch\n                        Scheduler.schedule(function GroupDataSource_async_processBatch() {\n                            that._continueFetch(fetch);\n                        }, Scheduler.Priority.normal, null, \"WinJS.UI._GroupDataSource._continueFetch\");\n                    } else {\n                        this._itemBatch = null;\n                    }\n                },\n\n                _processPromise: function (itemPromise, batchIndex) {\n                    itemPromise.retain();\n\n                    this._itemBatch[batchIndex] = itemPromise;\n\n                    var that = this;\n                    itemPromise.then(function (item) {\n                        that._itemBatch[batchIndex] = item;\n                        if (--that._itemsToFetch === 0) {\n                            that._processBatch();\n                        }\n                    });\n                },\n\n                _fetchBatch: function (itemPromise, countBefore) {\n                    this._itemBatch = new Array(this._batchSize);\n                    this._itemsToFetch = this._batchSize;\n\n                    this._processPromise(itemPromise, countBefore);\n\n                    var batchIndex;\n\n                    this._listBinding.jumpToItem(itemPromise);\n                    for (batchIndex = countBefore - 1; batchIndex >= 0; batchIndex--) {\n                        this._processPromise(this._listBinding.previous(), batchIndex);\n                    }\n\n                    this._listBinding.jumpToItem(itemPromise);\n                    for (batchIndex = countBefore + 1; batchIndex < this._batchSize; batchIndex++) {\n                        this._processPromise(this._listBinding.next(), batchIndex);\n                    }\n                },\n\n                _fetchAdjacent: function (item, after) {\n                    // Batches overlap by one so group boundaries always fall within at least one batch\n                    this._fetchBatch(\n                        (this._listBinding.fromKey ? this._listBinding.fromKey(item.key) : this._listBinding.fromIndex(item.index)),\n                        (after ? 0 : this._batchSize - 1),\n                        (after ? this._batchSize - 1 : 0)\n                    );\n                },\n\n                _fetchNextIndex: function () {\n                    var groupHighestIndex = this._indexMap[this._indexMax - 1];\n                    if (groupHighestIndex) {\n                        // We've already fetched some of the first items, so continue where we left off\n                        this._fetchAdjacent(groupHighestIndex.lastItem, true);\n                    } else {\n                        // Fetch one non-existent item before the list so _processBatch knows the start was reached\n                        this._fetchBatch(this._listBinding.first(), 1, this._batchSize - 2);\n                    }\n                },\n\n                _continueFetch: function (fetch) {\n                    if (fetch.initialBatch) {\n                        fetch.initialBatch();\n                        fetch.initialBatch = null;\n                    } else {\n                        var group = fetch.getGroup();\n                        if (group) {\n                            var groupPrev,\n                                groupNext;\n\n                            if (!group.firstReached) {\n                                this._fetchAdjacent(group.firstItem, false);\n                            } else if (!group.lastReached) {\n                                this._fetchAdjacent(group.lastItem, true);\n                            } else if (fetch.countBefore > 0 && group.index !== 0 && !groupReady(groupPrev = this._previousGroup(group))) {\n                                this._fetchAdjacent((groupPrev && groupPrev.lastReached ? groupPrev.firstItem : group.firstItem), false);\n                            } else {\n                                groupNext = this._nextGroup(group);\n                                this._fetchAdjacent((groupNext && groupNext.firstReached ? groupNext.lastItem : group.lastItem), true);\n                            }\n                        } else {\n                            // Assume we're searching for a key, index or the count by brute force\n                            this._fetchNextIndex();\n                        }\n                    }\n                },\n\n                _fetchComplete: function (group, countBefore, countAfter, firstRequest, complete) {\n                    if (groupReady(group)) {\n                        // Check if the minimal requirements for the request are met\n                        var groupPrev = this._previousGroup(group);\n                        if (firstRequest || groupReady(groupPrev) || group.index === 0 || countBefore === 0) {\n                            var groupNext = this._nextGroup(group);\n                            if (firstRequest || groupReady(groupNext) || this._lastGroup === group || countAfter === 0) {\n                                // Time to return the fetch results\n\n                                // Find the first available group to return (don't return more than asked for)\n                                var countAvailableBefore = 0,\n                                    groupFirst = group;\n                                while (countAvailableBefore < countBefore) {\n                                    groupPrev = this._previousGroup(groupFirst);\n\n                                    if (!groupReady(groupPrev)) {\n                                        break;\n                                    }\n\n                                    groupFirst = groupPrev;\n                                    countAvailableBefore++;\n                                }\n\n                                // Find the last available group to return\n                                var countAvailableAfter = 0,\n                                    groupLast = group;\n                                while (countAvailableAfter < countAfter) {\n                                    groupNext = this._nextGroup(groupLast);\n\n                                    if (!groupReady(groupNext)) {\n                                        break;\n                                    }\n\n                                    groupLast = groupNext;\n                                    countAvailableAfter++;\n                                }\n\n                                // Now create the items to return\n                                var len = countAvailableBefore + 1 + countAvailableAfter,\n                                    items = new Array(len);\n\n                                for (var i = 0; i < len; i++) {\n                                    var item = {\n                                        key: groupFirst.key,\n                                        data: groupFirst.data,\n                                        firstItemKey: groupFirst.firstItem.key,\n                                        groupSize: groupFirst.size\n                                    };\n\n                                    var firstItemIndex = groupFirst.firstItem.index;\n                                    if (typeof firstItemIndex === \"number\") {\n                                        item.firstItemIndexHint = firstItemIndex;\n                                    }\n\n                                    items[i] = item;\n\n                                    groupFirst = this._nextGroup(groupFirst);\n                                }\n\n                                var result = {\n                                    items: items,\n                                    offset: countAvailableBefore\n                                };\n\n                                result.totalCount = (\n                                    typeof this._count === \"number\" ?\n                                        this._count :\n                                        _UI.CountResult.unknown\n                                );\n\n                                if (typeof group.index === \"number\") {\n                                    result.absoluteIndex = group.index;\n                                }\n\n                                if (groupLast === this._lastGroup) {\n                                    result.atEnd = true;\n                                }\n\n                                complete(result);\n                                return true;\n                            }\n                        }\n                    }\n\n                    return false;\n                },\n\n                _fetchItems: function (getGroup, mayExist, fetchInitialBatch, countBefore, countAfter) {\n                    var that = this;\n                    return new Promise(function (complete, error) {\n                        var group = getGroup(),\n                            firstRequest = !group,\n                            failureCount = 0;\n\n                        function fetchComplete(failed) {\n                            var group2 = getGroup();\n\n                            if (group2) {\n                                return that._fetchComplete(group2, countBefore, countAfter, firstRequest, complete, error);\n                            } else if (firstRequest && !mayExist(failed)) {\n                                error(errorDoesNotExist());\n                                return true;\n                            } else if (failureCount > 2) {\n                                error(errorDoesNotExist());\n                                return true;\n                            } else {\n                                // only consider consecutive failures\n                                if (failed) {\n                                    failureCount++;\n                                } else {\n                                    failureCount = 0;\n                                }\n                                // _continueFetch will switch to a brute force search\n                                return false;\n                            }\n                        }\n\n                        if (!fetchComplete()) {\n                            var fetch = {\n                                initialBatch: firstRequest ? fetchInitialBatch : null,\n                                getGroup: getGroup,\n                                countBefore: countBefore,\n                                countAfter: countAfter,\n                                complete: fetchComplete\n                            };\n\n                            that._fetchQueue.push(fetch);\n\n                            if (!that._itemBatch) {\n                                that._continueFetch(fetch);\n                            }\n                        }\n                    });\n                },\n\n                _previousGroup: function (group) {\n                    if (group && group.firstReached) {\n                        this._listBinding.jumpToItem(group.firstItem);\n\n                        return this._handleMap[this._listBinding.previous().handle];\n                    } else {\n                        return null;\n                    }\n                },\n\n                _nextGroup: function (group) {\n                    if (group && group.lastReached) {\n                        this._listBinding.jumpToItem(group.lastItem);\n\n                        return this._handleMap[this._listBinding.next().handle];\n                    } else {\n                        return null;\n                    }\n                },\n\n                _invalidateIndices: function (group) {\n                    this._count = null;\n                    this._lastGroup = null;\n\n                    if (typeof group.index === \"number\") {\n                        this._indexMax = (group.index > 0 ? group.index : null);\n                    }\n\n                    // Delete the indices of this and all subsequent groups\n                    for (var group2 = group; group2 && typeof group2.index === \"number\"; group2 = this._nextGroup(group2)) {\n                        delete this._indexMap[group2.index];\n                        group2.index = null;\n                    }\n                },\n\n                _releaseGroup: function (group) {\n                    this._invalidateIndices(group);\n\n                    delete this._keyMap[group.key];\n\n                    if (this._lastGroup === group) {\n                        this._lastGroup = null;\n                    }\n\n                    if (group.firstItem !== group.lastItem) {\n                        this._releaseItem(group.firstItem);\n                    }\n                    this._releaseItem(group.lastItem);\n                },\n\n                _beginRefresh: function () {\n                    // Abandon all current fetches\n\n                    this._fetchQueue = [];\n\n                    if (this._itemBatch) {\n                        for (var i = 0; i < this._batchSize; i++) {\n                            var item = this._itemBatch[i];\n                            if (item) {\n                                if (item.cancel) {\n                                    item.cancel();\n                                }\n                                this._listBinding.releaseItem(item);\n                            }\n                        }\n\n                        this._itemBatch = null;\n                    }\n\n                    this._itemsToFetch = 0;\n\n                    this._listDataNotificationHandler.invalidateAll();\n                },\n\n                _processInsertion: function (item, previousHandle, nextHandle) {\n                    var groupPrev = this._handleMap[previousHandle],\n                        groupNext = this._handleMap[nextHandle],\n                        groupKey = null;\n\n                    if (groupPrev) {\n                        // If an item in a different group from groupPrev is being inserted after it, no need to discard groupPrev\n                        if (!groupPrev.lastReached || previousHandle !== groupPrev.lastItem.handle || (groupKey = this._groupKey(item)) === groupPrev.key) {\n                            this._releaseGroup(groupPrev);\n                        } else if (this._lastGroup === groupPrev) {\n                            this._lastGroup = null;\n                            this._count = null;\n                        }\n                        this._beginRefresh();\n                    }\n\n                    if (groupNext && groupNext !== groupPrev) {\n                        this._invalidateIndices(groupNext);\n\n                        // If an item in a different group from groupNext is being inserted before it, no need to discard groupNext\n                        if (!groupNext.firstReached || nextHandle !== groupNext.firstItem.handle || (groupKey !== null ? groupKey : this._groupKey(item)) === groupNext.key) {\n                            this._releaseGroup(groupNext);\n                        }\n                        this._beginRefresh();\n                    }\n                },\n\n                _processRemoval: function (handle) {\n                    var group = this._handleMap[handle];\n\n                    if (group && (handle === group.firstItem.handle || handle === group.lastItem.handle)) {\n                        this._releaseGroup(group);\n                        this._beginRefresh();\n                    } else if (this._itemBatch) {\n                        for (var i = 0; i < this._batchSize; i++) {\n                            var item = this._itemBatch[i];\n                            if (item && item.handle === handle) {\n                                this._beginRefresh();\n                                break;\n                            }\n                        }\n                    }\n                },\n\n                _inserted: function (itemPromise, previousHandle, nextHandle) {\n                    var that = this;\n                    itemPromise.then(function (item) {\n                        that._processInsertion(item, previousHandle, nextHandle);\n                    });\n                },\n\n                _changed: function (newItem, oldItem) {\n                    // A change to the first item could affect the group item\n                    var group = this._handleMap[newItem.handle];\n                    if (group && newItem.handle === group.firstItem.handle) {\n                        this._releaseGroup(group);\n                        this._beginRefresh();\n                    }\n\n                    // If the item is now in a different group, treat this as a move\n                    if (this._groupKey(newItem) !== this._groupKey(oldItem)) {\n                        this._listBinding.jumpToItem(newItem);\n                        var previousHandle = this._listBinding.previous().handle;\n                        this._listBinding.jumpToItem(newItem);\n                        var nextHandle = this._listBinding.next().handle;\n\n                        this._processRemoval(newItem.handle);\n                        this._processInsertion(newItem, previousHandle, nextHandle);\n                    }\n                },\n\n                _moved: function (itemPromise, previousHandle, nextHandle) {\n                    this._processRemoval(itemPromise.handle);\n\n                    var that = this;\n                    itemPromise.then(function (item) {\n                        that._processInsertion(item, previousHandle, nextHandle);\n                    });\n                },\n\n                _removed: function (handle, mirage) {\n                    // Mirage removals will just result in null items, which can be ignored\n                    if (!mirage) {\n                        this._processRemoval(handle);\n                    }\n                },\n\n                _indexChanged: function (handle, newIndex, oldIndex) {\n                    if (typeof oldIndex === \"number\") {\n                        this._indicesChanged = true;\n                    }\n                },\n\n                _endNotifications: function () {\n                    if (this._indicesChanged) {\n                        this._indicesChanged = false;\n\n                        // Update the group sizes\n                        for (var key in this._keyMap) {\n                            var group = this._keyMap[key];\n\n                            if (group.firstReached && group.lastReached) {\n                                var newSize = group.lastItem.index + 1 - group.firstItem.index;\n                                if (!isNaN(newSize)) {\n                                    group.size = newSize;\n                                }\n                            }\n                        }\n\n                        // Invalidate the client, since some firstItemIndexHint properties have probably changed\n                        this._beginRefresh();\n                    }\n                },\n\n                _reload: function () {\n                    this._initializeState();\n                    this._listDataNotificationHandler.reload();\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n\n            return _Base.Class.derive(VirtualizedDataSource.VirtualizedDataSource, function (listDataSource, groupKey, groupData, options) {\n                var groupDataAdapter = new GroupDataAdapter(listDataSource, groupKey, groupData, options);\n\n                this._baseDataSourceConstructor(groupDataAdapter);\n\n                this.extensions = {\n                    invalidateGroups: function () {\n                        groupDataAdapter.invalidateGroups();\n                    }\n                };\n            }, {\n                /* empty */\n            }, {\n                supportedForProcessing: false,\n            });\n        })\n\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Grouped Item Data Source\n\ndefine('WinJS/VirtualizedDataSource/_GroupedItemDataSource',[\n    '../Core/_Base',\n    './_GroupDataSource'\n    ], function groupedItemDataSourceInit(_Base, _GroupDataSource) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n\n        computeDataSourceGroups: function (listDataSource, groupKey, groupData, options) {\n            /// <signature helpKeyword=\"WinJS.UI.computeDataSourceGroups\">\n            /// <summary locid=\"WinJS.UI.computeDataSourceGroups\">\n            /// Returns a data source that adds group information to the items of another data source.  The \"groups\" property\n            /// of this data source evaluates to yet another data source that enumerates the groups themselves.\n            /// </summary>\n            /// <param name=\"listDataSource\" type=\"VirtualizedDataSource\" locid=\"WinJS.UI.computeDataSourceGroups_p:listDataSource\">\n            /// The data source for the individual items to group.\n            /// </param>\n            /// <param name=\"groupKey\" type=\"Function\" locid=\"WinJS.UI.computeDataSourceGroups_p:groupKey\">\n            /// A callback function that takes an item in the list as an argument. The function is called\n            /// for each item in the list and returns the group key for the item as a string.\n            /// </param>\n            /// <param name=\"groupData\" type=\"Function\" locid=\"WinJS.UI.computeDataSourceGroups_p:groupData\">\n            /// A callback function that takes an item in the IListDataSource as an argument.\n            /// The function is called on one item in each group and returns\n            /// an object that represents the header of that group.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.computeDataSourceGroups_p:options\">\n            /// An object that can contain properties that specify additional options:\n            ///\n            /// groupCountEstimate:\n            /// A Number value that is the initial estimate for the number of groups. If you specify -1,\n            /// this function returns no result is until the actual number of groups\n            /// has been determined.\n            ///\n            /// batchSize:\n            /// A Number greater than 0 that specifies the number of items to fetch during each processing pass when\n            /// searching for groups. (In addition to the number specified, one item from the previous batch\n            /// is always included.)\n            /// </param>\n            /// <returns type=\"IListDataSource\" locid=\"WinJS.UI.computeDataSourceGroups_returnValue\">\n            /// An IListDataSource that contains the items in the original data source and provides additional\n            /// group info in a \"groups\" property. The \"groups\" property returns another\n            /// IListDataSource that enumerates the different groups in the list.\n            /// </returns>\n            /// </signature>\n\n            var groupedItemDataSource = Object.create(listDataSource);\n\n            function createGroupedItem(item) {\n                if (item) {\n                    var groupedItem = Object.create(item);\n\n                    groupedItem.groupKey = groupKey(item);\n\n                    if (groupData) {\n                        groupedItem.groupData = groupData(item);\n                    }\n\n                    return groupedItem;\n                } else {\n                    return null;\n                }\n            }\n\n            function createGroupedItemPromise(itemPromise) {\n                var groupedItemPromise = Object.create(itemPromise);\n\n                groupedItemPromise.then = function (onComplete, onError, onCancel) {\n                    return itemPromise.then(function (item) {\n                        return onComplete(createGroupedItem(item));\n                    }, onError, onCancel);\n                };\n\n                return groupedItemPromise;\n            }\n\n            groupedItemDataSource.createListBinding = function (notificationHandler) {\n                var groupedNotificationHandler;\n\n                if (notificationHandler) {\n                    groupedNotificationHandler = Object.create(notificationHandler);\n\n                    groupedNotificationHandler.inserted = function (itemPromise, previousHandle, nextHandle) {\n                        return notificationHandler.inserted(createGroupedItemPromise(itemPromise), previousHandle, nextHandle);\n                    };\n\n                    groupedNotificationHandler.changed = function (newItem, oldItem) {\n                        return notificationHandler.changed(createGroupedItem(newItem), createGroupedItem(oldItem));\n                    };\n\n                    groupedNotificationHandler.moved = function (itemPromise, previousHandle, nextHandle) {\n                        return notificationHandler.moved(createGroupedItemPromise(itemPromise), previousHandle, nextHandle);\n                    };\n                } else {\n                    groupedNotificationHandler = null;\n                }\n\n                var listBinding = listDataSource.createListBinding(groupedNotificationHandler),\n                    groupedItemListBinding = Object.create(listBinding);\n\n                var listBindingMethods = [\n                    \"first\",\n                    \"last\",\n                    \"fromDescription\",\n                    \"jumpToItem\",\n                    \"current\"\n                ];\n\n                for (var i = 0, len = listBindingMethods.length; i < len; i++) {\n                    (function (listBindingMethod) {\n                        if (listBinding[listBindingMethod]) {\n                            groupedItemListBinding[listBindingMethod] = function () {\n                                return createGroupedItemPromise(listBinding[listBindingMethod].apply(listBinding, arguments));\n                            };\n                        }\n                    })(listBindingMethods[i]);\n                }\n\n                // The following methods should be fast\n\n                if (listBinding.fromKey) {\n                    groupedItemListBinding.fromKey = function (key) {\n                        return createGroupedItemPromise(listBinding.fromKey(key));\n                    };\n                }\n\n                if (listBinding.fromIndex) {\n                    groupedItemListBinding.fromIndex = function (index) {\n                        return createGroupedItemPromise(listBinding.fromIndex(index));\n                    };\n                }\n\n                groupedItemListBinding.prev = function () {\n                    return createGroupedItemPromise(listBinding.prev());\n                };\n\n                groupedItemListBinding.next = function () {\n                    return createGroupedItemPromise(listBinding.next());\n                };\n\n                return groupedItemListBinding;\n            };\n\n            var listDataSourceMethods = [\n                \"itemFromKey\",\n                \"itemFromIndex\",\n                \"itemFromDescription\",\n                \"insertAtStart\",\n                \"insertBefore\",\n                \"insertAfter\",\n                \"insertAtEnd\",\n                \"change\",\n                \"moveToStart\",\n                \"moveBefore\",\n                \"moveAfter\",\n                \"moveToEnd\"\n                // remove does not return an itemPromise\n            ];\n\n            for (var i = 0, len = listDataSourceMethods.length; i < len; i++) {\n                (function (listDataSourceMethod) {\n                    if (listDataSource[listDataSourceMethod]) {\n                        groupedItemDataSource[listDataSourceMethod] = function () {\n                            return createGroupedItemPromise(listDataSource[listDataSourceMethod].apply(listDataSource, arguments));\n                        };\n                    }\n                })(listDataSourceMethods[i]);\n            }\n\n            [\"addEventListener\", \"removeEventListener\", \"dispatchEvent\"].forEach(function (methodName) {\n                if (listDataSource[methodName]) {\n                    groupedItemDataSource[methodName] = function () {\n                        return listDataSource[methodName].apply(listDataSource, arguments);\n                    };\n                }\n            });\n\n            var groupDataSource = null;\n\n            Object.defineProperty(groupedItemDataSource, \"groups\", {\n                get: function () {\n                    if (!groupDataSource) {\n                        groupDataSource = new _GroupDataSource._GroupDataSource(listDataSource, groupKey, groupData, options);\n                    }\n                    return groupDataSource;\n                },\n                enumerable: true,\n                configurable: true\n            });\n\n            return groupedItemDataSource;\n        }\n\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Storage Item Data Source\n\ndefine('WinJS/VirtualizedDataSource/_StorageDataSource',[\n    'exports',\n    '../Core/_WinRT',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../Promise',\n    '../Utilities/_UI',\n    './_VirtualizedDataSourceImpl'\n    ], function storageDataSourceInit(exports, _WinRT, _Global, _Base, _ErrorFromName, _WriteProfilerMark, Animations, Promise, _UI, VirtualizedDataSource) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        StorageDataSource: _Base.Namespace._lazy(function () {\n            var StorageDataAdapter = _Base.Class.define(function StorageDataAdapter_ctor(query, options) {\n                // Constructor\n                _WriteProfilerMark(\"WinJS.UI.StorageDataSource:constructor,StartTM\");\n\n                var mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.singleItem,\n                    size = 256,\n                    flags = _WinRT.Windows.Storage.FileProperties.ThumbnailOptions.useCurrentScale,\n                    delayLoad = true,\n                    library;\n\n                if (query === \"Pictures\") {\n                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.picturesView;\n                    library = _WinRT.Windows.Storage.KnownFolders.picturesLibrary;\n                    size = 190;\n                } else if (query === \"Music\") {\n                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.musicView;\n                    library = _WinRT.Windows.Storage.KnownFolders.musicLibrary;\n                    size = 256;\n                } else if (query === \"Documents\") {\n                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.documentsView;\n                    library = _WinRT.Windows.Storage.KnownFolders.documentsLibrary;\n                    size = 40;\n                } else if (query === \"Videos\") {\n                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.videosView;\n                    library = _WinRT.Windows.Storage.KnownFolders.videosLibrary;\n                    size = 190;\n                }\n\n                if (!library) {\n                    this._query = query;\n                } else {\n                    var queryOptions = new _WinRT.Windows.Storage.Search.QueryOptions();\n                    queryOptions.folderDepth = _WinRT.Windows.Storage.Search.FolderDepth.deep;\n                    queryOptions.indexerOption = _WinRT.Windows.Storage.Search.IndexerOption.useIndexerWhenAvailable;\n                    this._query = library.createFileQueryWithOptions(queryOptions);\n                }\n\n                if (options) {\n                    if (typeof options.mode === \"number\") {\n                        mode = options.mode;\n                    }\n                    if (typeof options.requestedThumbnailSize === \"number\") {\n                        size = Math.max(1, Math.min(options.requestedThumbnailSize, 1024));\n                    } else {\n                        switch (mode) {\n                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.picturesView:\n                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.videosView:\n                                size = 190;\n                                break;\n                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.documentsView:\n                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.listView:\n                                size = 40;\n                                break;\n                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.musicView:\n                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.singleItem:\n                                size = 256;\n                                break;\n                        }\n                    }\n                    if (typeof options.thumbnailOptions === \"number\") {\n                        flags = options.thumbnailOptions;\n                    }\n                    if (typeof options.waitForFileLoad === \"boolean\") {\n                        delayLoad = !options.waitForFileLoad;\n                    }\n                }\n\n                this._loader = new _WinRT.Windows.Storage.BulkAccess.FileInformationFactory(this._query, mode, size, flags, delayLoad);\n                this.compareByIdentity = false;\n                this.firstDataRequest = true;\n                _WriteProfilerMark(\"WinJS.UI.StorageDataSource:constructor,StopTM\");\n            }, {\n                // Public members\n\n                setNotificationHandler: function (notificationHandler) {\n                    this._notificationHandler = notificationHandler;\n                    this._query.addEventListener(\"contentschanged\", function () {\n                        notificationHandler.invalidateAll();\n                    });\n                    this._query.addEventListener(\"optionschanged\", function () {\n                        notificationHandler.invalidateAll();\n                    });\n                },\n\n                itemsFromEnd: function (count) {\n                    var that = this;\n                    _WriteProfilerMark(\"WinJS.UI.StorageDataSource:itemsFromEnd,info\");\n                    return this.getCount().then(function (totalCount) {\n                        if (totalCount === 0) {\n                            return Promise.wrapError(new _ErrorFromName(_UI.FetchError.doesNotExist));\n                        }\n                        // Intentionally passing countAfter = 1 to go one over the end so that itemsFromIndex will\n                        // report the vector size since its known.\n                        return that.itemsFromIndex(totalCount - 1, Math.min(totalCount - 1, count - 1), 1);\n                    });\n                },\n\n                itemsFromIndex: function (index, countBefore, countAfter) {\n                    // don't allow more than 64 items to be retrieved at once\n                    if (countBefore + countAfter > 64) {\n                        countBefore = Math.min(countBefore, 32);\n                        countAfter = 64 - (countBefore + 1);\n                    }\n\n                    var first = (index - countBefore),\n                        count = (countBefore + 1 + countAfter);\n                    var that = this;\n                    // Fetch a minimum of 32 items on the first request for smoothness. Otherwise\n                    // listview displays 2 items first and then the rest of the page.\n                    if (that.firstDataRequest) {\n                        that.firstDataRequest = false;\n                        count = Math.max(count, 32);\n                    }\n                    function listener(ev) {\n                        that._notificationHandler.changed(that._item(ev.target));\n                    }\n\n                    var perfId = \"WinJS.UI.StorageDataSource:itemsFromIndex(\" + first + \"-\" + (first + count - 1) + \")\";\n                    _WriteProfilerMark(perfId + \",StartTM\");\n                    return this._loader.getItemsAsync(first, count).then(function (itemsVector) {\n                        var vectorSize = itemsVector.size;\n                        if (vectorSize <= countBefore) {\n                            return Promise.wrapError(new _ErrorFromName(_UI.FetchError.doesNotExist));\n                        }\n                        var items = new Array(vectorSize);\n                        var localItemsVector = new Array(vectorSize);\n                        itemsVector.getMany(0, localItemsVector);\n                        for (var i = 0; i < vectorSize; i++) {\n                            items[i] = that._item(localItemsVector[i]);\n                            localItemsVector[i].addEventListener(\"propertiesupdated\", listener);\n                        }\n                        var result = {\n                            items: items,\n                            offset: countBefore,\n                            absoluteIndex: index\n                        };\n                        // set the totalCount only when we know it (when we retrieived fewer items than were asked for)\n                        if (vectorSize < count) {\n                            result.totalCount = first + vectorSize;\n                        }\n                        _WriteProfilerMark(perfId + \",StopTM\");\n                        return result;\n                    });\n                },\n\n                itemsFromDescription: function (description, countBefore, countAfter) {\n                    var that = this;\n                    _WriteProfilerMark(\"WinJS.UI.StorageDataSource:itemsFromDescription,info\");\n                    return this._query.findStartIndexAsync(description).then(function (index) {\n                        return that.itemsFromIndex(index, countBefore, countAfter);\n                    });\n                },\n\n                getCount: function () {\n                    _WriteProfilerMark(\"WinJS.UI.StorageDataSource:getCount,info\");\n                    return this._query.getItemCountAsync();\n                },\n\n                itemSignature: function (item) {\n                    return item.folderRelativeId;\n                },\n\n                // compareByIdentity: set in constructor\n                // itemsFromStart: not implemented\n                // itemsFromKey: not implemented\n                // insertAtStart: not implemented\n                // insertBefore: not implemented\n                // insertAfter: not implemented\n                // insertAtEnd: not implemented\n                // change: not implemented\n                // moveToStart: not implemented\n                // moveBefore: not implemented\n                // moveAfter: not implemented\n                // moveToEnd: not implemented\n                // remove: not implemented\n\n                // Private members\n\n                _item: function (item) {\n                    return {\n                        key: item.path || item.folderRelativeId,\n                        data: item\n                    };\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n\n            return _Base.Class.derive(VirtualizedDataSource.VirtualizedDataSource, function (query, options) {\n                /// <signature helpKeyword=\"WinJS.UI.StorageDataSource\">\n                /// <summary locid=\"WinJS.UI.StorageDataSource\">\n                /// Creates a data source that enumerates an IStorageQueryResultBase.\n                /// </summary>\n                /// <param name=\"query\" type=\"Windows.Storage.Search.IStorageQueryResultBase\" locid=\"WinJS.UI.StorageDataSource_p:query\">\n                /// The object to enumerate. It must support IStorageQueryResultBase.\n                /// </param>\n                /// <param name=\"options\" mayBeNull=\"true\" optional=\"true\" type=\"Object\" locid=\"WinJS.UI.StorageDataSource_p:options\">\n                /// An object that specifies options for the data source. This parameter is optional. It can contain these properties:\n                ///\n                /// mode:\n                /// A Windows.Storage.FileProperties.ThumbnailMode - a value that specifies whether to request\n                /// thumbnails and the type of thumbnails to request.\n                ///\n                /// requestedThumbnailSize:\n                /// A Number that specifies the size of the thumbnails.\n                ///\n                /// thumbnailOptions:\n                /// A Windows.Storage.FileProperties.ThumbnailOptions value that specifies additional options for the thumbnails.\n                ///\n                /// waitForFileLoad:\n                /// If you set this to true, the data source returns items only after it loads their properties and thumbnails.\n                ///\n                /// </param>\n                /// </signature>\n                this._baseDataSourceConstructor(new StorageDataAdapter(query, options));\n            }, {\n                /* empty */\n            }, {\n                loadThumbnail: function (item, image) {\n                    /// <signature>\n                    /// <summary locid=\"WinJS.UI.StorageDataSource.loadThumbnail\">\n                    /// Returns a promise for an image element that completes when the full quality thumbnail of the provided item is drawn to the\n                    /// image element.\n                    /// </summary>\n                    /// <param name=\"item\" type=\"ITemplateItem\" locid=\"WinJS.UI.StorageDataSource.loadThumbnail_p:item\">\n                    /// The item to retrieve a thumbnail for.\n                    /// </param>\n                    /// <param name=\"image\" type=\"Object\" domElement=\"true\" optional=\"true\" locid=\"WinJS.UI.StorageDataSource.loadThumbnail_p:image\">\n                    /// The image element to use. If not provided, a new image element is created.\n                    /// </param>\n                    /// </signature>\n                    var thumbnailUpdateHandler,\n                        thumbnailPromise,\n                        shouldRespondToThumbnailUpdate = false;\n\n                    return new Promise(function (complete) {\n                        // Load a thumbnail if it exists. The promise completes when a full quality thumbnail is visible.\n                        var tagSupplied = (image ? true : false);\n                        var processThumbnail = function (thumbnail) {\n                            if (thumbnail) {\n                                var url = _Global.URL.createObjectURL(thumbnail, {oneTimeOnly: true});\n\n                                // If this is the first version of the thumbnail we're loading, fade it in.\n                                if (!thumbnailPromise) {\n                                    thumbnailPromise = item.loadImage(url, image).then(function (image) {\n                                        // Wrapping the fadeIn call in a promise for the image returned by loadImage allows us to\n                                        // pipe the result of loadImage to further chained promises.  This is necessary because the\n                                        // image element provided to loadThumbnail is optional, and loadImage will create an image\n                                        // element if none is provided.\n                                        return item.isOnScreen().then(function (visible) {\n                                            var imagePromise;\n                                            if (visible && tagSupplied) {\n                                                imagePromise = Animations.fadeIn(image).then(function () {\n                                                    return image;\n                                                });\n                                            } else {\n                                                image.style.opacity = 1;\n                                                imagePromise = Promise.wrap(image);\n                                            }\n                                            return imagePromise;\n                                        });\n                                    });\n                                } else { // Otherwise, replace the existing version without animation.\n                                    thumbnailPromise = thumbnailPromise.then(function (image) {\n                                        return item.loadImage(url, image);\n                                    });\n                                }\n\n                                // If we have the full resolution thumbnail, we can cancel further updates and complete the promise\n                                // when current work is complete.\n                                if ((thumbnail.type !== _WinRT.Windows.Storage.FileProperties.ThumbnailType.icon) && !thumbnail.returnedSmallerCachedSize) {\n                                    _WriteProfilerMark(\"WinJS.UI.StorageDataSource:loadThumbnail complete,info\");\n                                    item.data.removeEventListener(\"thumbnailupdated\", thumbnailUpdateHandler);\n                                    shouldRespondToThumbnailUpdate = false;\n                                    thumbnailPromise = thumbnailPromise.then(function (image) {\n                                        thumbnailUpdateHandler = null;\n                                        thumbnailPromise = null;\n                                        complete(image);\n                                    });\n                                }\n                            }\n                        };\n\n                        thumbnailUpdateHandler = function (e) {\n                            // Ensure that a zombie update handler does not get invoked.\n                            if (shouldRespondToThumbnailUpdate) {\n                                processThumbnail(e.target.thumbnail);\n                            }\n                        };\n                        item.data.addEventListener(\"thumbnailupdated\", thumbnailUpdateHandler);\n                        shouldRespondToThumbnailUpdate = true;\n\n                        // If we already have a thumbnail we should render it now.\n                        processThumbnail(item.data.thumbnail);\n                    }, function () {\n                        item.data.removeEventListener(\"thumbnailupdated\", thumbnailUpdateHandler);\n                        shouldRespondToThumbnailUpdate = false;\n                        thumbnailUpdateHandler = null;\n                        if (thumbnailPromise) {\n                            thumbnailPromise.cancel();\n                            thumbnailPromise = null;\n                        }\n                    });\n                },\n\n                supportedForProcessing: false,\n            });\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/VirtualizedDataSource',[\n    './VirtualizedDataSource/_VirtualizedDataSourceImpl',\n    './VirtualizedDataSource/_GroupDataSource',\n    './VirtualizedDataSource/_GroupedItemDataSource',\n    './VirtualizedDataSource/_StorageDataSource'\n     ], function () {\n\n    //wrapper module\n});\ndefine('WinJS/_Accents',[\"require\", \"exports\", \"./Core/_Global\", \"./Core/_WinRT\", \"./Core/_Base\", \"./Core/_BaseUtils\"], function (require, exports, _Global, _WinRT, _Base, _BaseUtils) {\n    var Constants = {\n        accentStyleId: \"WinJSAccentsStyle\",\n        themeDetectionTag: \"winjs-themedetection-tag\",\n        hoverSelector: \"html.win-hoverable\",\n        lightThemeSelector: \".win-ui-light\",\n        darkThemeSelector: \".win-ui-dark\"\n    };\n    var CSSSelectorTokens = [\".\", \"#\", \":\"];\n    var UISettings = null;\n    var colors = [];\n    var isDarkTheme = false;\n    var rules = [];\n    var writeRulesTOHandle = -1;\n    // Public APIs\n    //\n    // Enum values align with the colors array indices\n    (function (ColorTypes) {\n        ColorTypes[ColorTypes[\"accent\"] = 0] = \"accent\";\n        ColorTypes[ColorTypes[\"listSelectRest\"] = 1] = \"listSelectRest\";\n        ColorTypes[ColorTypes[\"listSelectHover\"] = 2] = \"listSelectHover\";\n        ColorTypes[ColorTypes[\"listSelectPress\"] = 3] = \"listSelectPress\";\n        ColorTypes[ColorTypes[\"_listSelectRestInverse\"] = 4] = \"_listSelectRestInverse\";\n        ColorTypes[ColorTypes[\"_listSelectHoverInverse\"] = 5] = \"_listSelectHoverInverse\";\n        ColorTypes[ColorTypes[\"_listSelectPressInverse\"] = 6] = \"_listSelectPressInverse\";\n    })(exports.ColorTypes || (exports.ColorTypes = {}));\n    var ColorTypes = exports.ColorTypes;\n    function createAccentRule(selector, props) {\n        rules.push({ selector: selector, props: props });\n        scheduleWriteRules();\n    }\n    exports.createAccentRule = createAccentRule;\n    // Private helpers\n    //\n    function scheduleWriteRules() {\n        if (rules.length === 0 || writeRulesTOHandle !== -1) {\n            return;\n        }\n        writeRulesTOHandle = _BaseUtils._setImmediate(function () {\n            writeRulesTOHandle = -1;\n            cleanup();\n            var inverseThemeSelector = isDarkTheme ? Constants.lightThemeSelector : Constants.darkThemeSelector;\n            var inverseThemeHoverSelector = Constants.hoverSelector + \" \" + inverseThemeSelector;\n            var style = _Global.document.createElement(\"style\");\n            style.id = Constants.accentStyleId;\n            style.textContent = rules.map(function (rule) {\n                // example rule: { selector: \"  .foo,   html.win-hoverable   .bar:hover ,  div:hover  \", props: [{ name: \"color\", value: 0 }, { name: \"background-color\", value: 1 } }\n                var body = \"  \" + rule.props.map(function (prop) { return prop.name + \": \" + colors[prop.value] + \";\"; }).join(\"\\n  \");\n                // body = color: *accent*; background-color: *listSelectHover*\n                var selectorSplit = rule.selector.split(\",\").map(function (str) { return sanitizeSpaces(str); }); // [\".foo\", \".bar:hover\", \"div\"]\n                var selector = selectorSplit.join(\",\\n\"); // \".foo, html.win-hoverable .bar:hover, div:hover\"\n                var css = selector + \" {\\n\" + body + \"\\n}\";\n                // css = .foo, html.win-hoverable .bar:hover, div:hover { *body* }\n                // Inverse Theme Selectors\n                var isThemedColor = rule.props.some(function (prop) { return prop.value !== 0 /* accent */; });\n                if (isThemedColor) {\n                    var inverseBody = \"  \" + rule.props.map(function (prop) { return prop.name + \": \" + colors[(prop.value ? (prop.value + 3) : prop.value)] + \";\"; }).join(\"\\n  \");\n                    // inverseBody = \"color: *accent*; background-color: *listSelectHoverInverse\"\n                    var themedSelectors = [];\n                    selectorSplit.forEach(function (sel) {\n                        if (sel.indexOf(Constants.hoverSelector) !== -1 && sel.indexOf(inverseThemeHoverSelector) === -1) {\n                            themedSelectors.push(sel.replace(Constants.hoverSelector, inverseThemeHoverSelector));\n                            var selWithoutHover = sel.replace(Constants.hoverSelector, \"\").trim();\n                            if (CSSSelectorTokens.indexOf(selWithoutHover[0]) !== -1) {\n                                themedSelectors.push(sel.replace(Constants.hoverSelector + \" \", inverseThemeHoverSelector));\n                            }\n                        }\n                        else {\n                            themedSelectors.push(inverseThemeSelector + \" \" + sel);\n                            if (CSSSelectorTokens.indexOf(sel[0]) !== -1) {\n                                themedSelectors.push(inverseThemeSelector + sel);\n                            }\n                        }\n                        css += \"\\n\" + themedSelectors.join(\",\\n\") + \" {\\n\" + inverseBody + \"\\n}\";\n                    });\n                }\n                return css;\n            }).join(\"\\n\");\n            _Global.document.head.appendChild(style);\n        });\n    }\n    function handleColorsChanged() {\n        var UIColorType = _WinRT.Windows.UI.ViewManagement.UIColorType;\n        var uiColor = UISettings.getColorValue(_WinRT.Windows.UI.ViewManagement.UIColorType.accent);\n        var accent = colorToString(uiColor, 1);\n        if (colors[0] === accent) {\n            return;\n        }\n        // Establish colors\n        // The order of the colors align with the ColorTypes enum values\n        colors.length = 0;\n        colors.push(accent, colorToString(uiColor, (isDarkTheme ? 0.6 : 0.4)), colorToString(uiColor, (isDarkTheme ? 0.8 : 0.6)), colorToString(uiColor, (isDarkTheme ? 0.9 : 0.7)), colorToString(uiColor, (isDarkTheme ? 0.4 : 0.6)), colorToString(uiColor, (isDarkTheme ? 0.6 : 0.8)), colorToString(uiColor, (isDarkTheme ? 0.7 : 0.9)));\n        scheduleWriteRules();\n    }\n    function colorToString(color, alpha) {\n        return \"rgba(\" + color.r + \",\" + color.g + \",\" + color.b + \",\" + alpha + \")\";\n    }\n    function sanitizeSpaces(str) {\n        return str.replace(/  /g, \" \").replace(/  /g, \" \").trim();\n    }\n    function cleanup() {\n        var style = _Global.document.head.querySelector(\"#\" + Constants.accentStyleId);\n        style && style.parentNode.removeChild(style);\n    }\n    function _reset() {\n        rules.length = 0;\n        cleanup();\n    }\n    // Module initialization\n    //\n    // Figure out color theme\n    var tag = _Global.document.createElement(Constants.themeDetectionTag);\n    _Global.document.head.appendChild(tag);\n    var theme = _Global.getComputedStyle(tag).opacity;\n    isDarkTheme = theme === \"0\";\n    tag.parentElement.removeChild(tag);\n    try {\n        UISettings = new _WinRT.Windows.UI.ViewManagement.UISettings();\n        UISettings.addEventListener(\"colorvalueschanged\", handleColorsChanged);\n        handleColorsChanged();\n    }\n    catch (e) {\n        // No WinRT - use hardcoded blue accent color\n        // The order of the colors align with the ColorTypes enum values\n        colors.push(\"rgb(0, 120, 215)\", \"rgba(0, 120, 215, \" + (isDarkTheme ? \"0.6\" : \"0.4\") + \")\", \"rgba(0, 120, 215, \" + (isDarkTheme ? \"0.8\" : \"0.6\") + \")\", \"rgba(0, 120, 215, \" + (isDarkTheme ? \"0.9\" : \"0.7\") + \")\", \"rgba(0, 120, 215, \" + (isDarkTheme ? \"0.4\" : \"0.6\") + \")\", \"rgba(0, 120, 215, \" + (isDarkTheme ? \"0.6\" : \"0.8\") + \")\", \"rgba(0, 120, 215, \" + (isDarkTheme ? \"0.7\" : \"0.9\") + \")\");\n    }\n    // Publish to WinJS namespace\n    var toPublish = {\n        ColorTypes: ColorTypes,\n        createAccentRule: createAccentRule,\n        // Exposed for tests    \n        _colors: colors,\n        _reset: _reset,\n        _isDarkTheme: isDarkTheme\n    };\n    _Base.Namespace.define(\"WinJS.UI._Accents\", toPublish);\n});\n\ndefine('require-style',{load: function(id){throw new Error(\"Dynamic load not allowed: \" + id);}});\n\ndefine('require-style!less/styles-intrinsic',[],function(){});\n\ndefine('require-style!less/colors-intrinsic',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/IntrinsicControls',[\n    '../Utilities/_Hoverable',\n    '../_Accents',\n    'require-style!less/styles-intrinsic',\n    'require-style!less/colors-intrinsic'\n], function (_Hoverable, _Accents) {\n    \"use strict\";\n\n    // Shared color rule \n    _Accents.createAccentRule(\n        \".win-link,\\\n         .win-progress-bar,\\\n         .win-progress-ring,\\\n         .win-ring\",\n        [{ name: \"color\", value: _Accents.ColorTypes.accent }]);\n\n    // Shared background-color rule\n    _Accents.createAccentRule(\n        \"::selection,\\\n         .win-button.win-button-primary,\\\n         .win-dropdown option:checked,\\\n         select[multiple].win-dropdown option:checked\",\n        [{ name: \"background-color\", value: _Accents.ColorTypes.accent }]);\n\n    // Shared border-color rule\n    _Accents.createAccentRule(\n        \".win-textbox:focus,\\\n         .win-textarea:focus,\\\n         .win-textbox:focus:hover,\\\n         .win-textarea:focus:hover\",\n        [{ name: \"border-color\", value: _Accents.ColorTypes.accent }]);\n\n    // Edge-specific color rule\n    _Accents.createAccentRule(\n        \".win-textbox::-ms-clear:hover:not(:active),\\\n         .win-textbox::-ms-reveal:hover:not(:active)\",\n        [{ name: \"color\", value: _Accents.ColorTypes.accent }]);\n\n    // Edge-specific background-color rule\n    _Accents.createAccentRule(\n        \".win-checkbox:checked::-ms-check,\\\n         .win-textbox::-ms-clear:active,\\\n         .win-textbox::-ms-reveal:active\",\n        [{ name: \"background-color\", value: _Accents.ColorTypes.accent }]);\n\n    // Webkit-specific background-color rule\n    _Accents.createAccentRule(\n        \".win-progress-bar::-webkit-progress-value,\\\n         .win-progress-ring::-webkit-progress-value,\\\n         .win-ring::-webkit-progress-value\",\n        [{ name: \"background-color\", value: _Accents.ColorTypes.accent }]);\n\n    // Mozilla-specific background-color rule\n    _Accents.createAccentRule(\n        \".win-progress-bar:not(:indeterminate)::-moz-progress-bar,\\\n         .win-progress-ring:not(:indeterminate)::-moz-progress-bar,\\\n         .win-ring:not(:indeterminate)::-moz-progress-bar\",\n        [{ name: \"background-color\", value: _Accents.ColorTypes.accent }]);\n\n    // Edge-specific border-color rule\n    _Accents.createAccentRule(\n        \".win-checkbox:indeterminate::-ms-check,\\\n         .win-checkbox:hover:indeterminate::-ms-check,\\\n         .win-radio:checked::-ms-check\",\n        [{ name: \"border-color\", value: _Accents.ColorTypes.accent }]);\n\n\n    // Note the use of background instead of background-color\n    // FF slider styling doesn't work with background-color\n    // so using background for everything here for consistency\n\n    // Edge-specific background rule\n    _Accents.createAccentRule(\n        \".win-slider::-ms-thumb,\\\n         .win-slider::-ms-fill-lower\", /* Fill-Lower only supported in IE */\n        [{ name: \"background\", value: _Accents.ColorTypes.accent }]);\n\n    // Webkit-specific background rule\n    _Accents.createAccentRule(\n        \".win-slider::-webkit-slider-thumb\",\n        [{ name: \"background\", value: _Accents.ColorTypes.accent }]);\n\n    // Mozilla-specific background rule\n    _Accents.createAccentRule(\n        \".win-slider::-moz-range-thumb\",\n        [{ name: \"background\", value: _Accents.ColorTypes.accent }]);\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ItemContainer/_Constants',[\n    'exports',\n    '../../Core/_Base'\n    ], function constantsInit(exports, _Base) {\n    \"use strict\";\n\n    var members = {};\n    members._listViewClass = \"win-listview\";\n    members._viewportClass = \"win-viewport\";\n    members._rtlListViewClass = \"win-rtl\";\n    members._horizontalClass = \"win-horizontal\";\n    members._verticalClass = \"win-vertical\";\n    members._scrollableClass = \"win-surface\";\n    members._itemsContainerClass = \"win-itemscontainer\";\n    members._listHeaderContainerClass = \"win-headercontainer\";\n    members._listFooterContainerClass = \"win-footercontainer\";\n    members._padderClass = \"win-itemscontainer-padder\";\n    members._proxyClass = \"_win-proxy\";\n    members._itemClass = \"win-item\";\n    members._itemBoxClass = \"win-itembox\";\n    members._itemsBlockClass = \"win-itemsblock\";\n    members._containerClass = \"win-container\";\n    members._containerEvenClass = \"win-container-even\";\n    members._containerOddClass = \"win-container-odd\";\n    members._backdropClass = \"win-backdrop\";\n    members._footprintClass = \"win-footprint\";\n    members._groupsClass = \"win-groups\";\n    members._selectedClass = \"win-selected\";\n    members._selectionBorderClass = \"win-selectionborder\";\n    members._selectionBackgroundClass = \"win-selectionbackground\";\n    members._selectionCheckmarkClass = \"win-selectioncheckmark\";\n    members._selectionCheckmarkBackgroundClass = \"win-selectioncheckmarkbackground\";\n    members._pressedClass = \"win-pressed\";\n    members._headerClass = \"win-groupheader\";\n    members._headerContainerClass = \"win-groupheadercontainer\";\n    members._groupLeaderClass = \"win-groupleader\";\n    members._progressClass = \"win-progress\";\n    members._revealedClass = \"win-revealed\";\n    members._itemFocusClass = \"win-focused\";\n    members._itemFocusOutlineClass = \"win-focusedoutline\";\n    members._zoomingXClass = \"win-zooming-x\";\n    members._zoomingYClass = \"win-zooming-y\";\n    members._listLayoutClass = \"win-listlayout\";\n    members._gridLayoutClass = \"win-gridlayout\";\n    members._headerPositionTopClass = \"win-headerpositiontop\";\n    members._headerPositionLeftClass = \"win-headerpositionleft\";\n    members._structuralNodesClass = \"win-structuralnodes\";\n    members._singleItemsBlockClass = \"win-single-itemsblock\";\n    members._uniformGridLayoutClass = \"win-uniformgridlayout\";\n    members._uniformListLayoutClass = \"win-uniformlistlayout\";\n    members._cellSpanningGridLayoutClass = \"win-cellspanninggridlayout\";\n    members._laidOutClass = \"win-laidout\";\n    members._nonDraggableClass = \"win-nondraggable\";\n    members._nonSelectableClass = \"win-nonselectable\";\n    members._dragOverClass = \"win-dragover\";\n    members._dragSourceClass = \"win-dragsource\";\n    members._clipClass = \"win-clip\";\n    members._selectionModeClass = \"win-selectionmode\";\n    members._noCSSGrid = \"win-nocssgrid\";\n    members._hidingSelectionMode = \"win-hidingselectionmode\";\n    members._hidingSelectionModeAnimationTimeout = 250;\n\n    members._INVALID_INDEX = -1;\n    members._UNINITIALIZED = -1;\n\n    members._LEFT_MSPOINTER_BUTTON = 0;\n    members._RIGHT_MSPOINTER_BUTTON = 2;\n\n    members._TAP_END_THRESHOLD = 10;\n\n    members._DEFAULT_PAGES_TO_LOAD = 5;\n    members._DEFAULT_PAGE_LOAD_THRESHOLD = 2;\n\n    members._MIN_AUTOSCROLL_RATE = 150;\n    members._MAX_AUTOSCROLL_RATE = 1500;\n    members._AUTOSCROLL_THRESHOLD = 100;\n    members._AUTOSCROLL_DELAY = 50;\n\n    members._DEFERRED_ACTION = 250;\n    members._DEFERRED_SCROLL_END = 250;\n\n    members._SELECTION_CHECKMARK = \"\\uE081\";\n\n    members._LISTVIEW_PROGRESS_DELAY = 2000;\n\n    var ScrollToPriority = {\n        uninitialized: 0,\n        low: 1,             // used by layoutSite.invalidateLayout, forceLayout, _processReload, _update and _onMSElementResize - operations that preserve the scroll position\n        medium: 2,          // used by dataSource change, layout change and etc - operations that reset the scroll position to 0\n        high: 3             // used by indexOfFirstVisible, ensureVisible, scrollPosition - operations in which the developer explicitly sets the scroll position\n    };\n\n    var ViewChange = {\n        rebuild: 0,\n        remeasure: 1,\n        relayout: 2,\n        realize: 3\n    };\n\n    members._ScrollToPriority = ScrollToPriority;\n    members._ViewChange = ViewChange;\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", members);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ItemContainer/_ItemEventsHandler',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_WinRT',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_WriteProfilerMark',\n    '../../Animations',\n    '../../Animations/_TransitionAnimation',\n    '../../Promise',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_UI',\n    './_Constants'\n], function itemEventsHandlerInit(exports, _Global, _WinRT, _Base, _BaseUtils, _WriteProfilerMark, Animations, _TransitionAnimation, Promise, _ElementUtilities, _UI, _Constants) {\n    \"use strict\";\n\n    var transformNames = _BaseUtils._browserStyleEquivalents[\"transform\"];\n\n    // Returns a CSS transformation to rotate and shrink an element when it is\n    // pressed. The closer the click is to the center of the item, the more it\n    // shrinks and the less it rotates.\n    // *elementRect* should be of the form returned by getBoundingClientRect. All\n    // of the parameters must be relative to the same coordinate system.\n    // This function was translated from the Splash implementation.\n    function tiltTransform(clickX, clickY, elementRect) {\n        var minSize = 44,\n            maxSize = 750,\n            minRotationX = 2,\n            maxRotationX = 9,\n            minRotationY = 2.11,\n            maxRotationY = 13,\n            sizeRange = maxSize - minSize,\n            halfWidth = elementRect.width / 2,\n            halfHeight = elementRect.height / 2;\n\n        var clampedWidth = _ElementUtilities._clamp(elementRect.width, minSize, maxSize);\n        var clampedHeight = _ElementUtilities._clamp(elementRect.height, minSize, maxSize);\n\n        // The maximum rotation that any element is capable of is calculated by using its width and height and clamping it into the range calculated above.\n        // minRotationX|Y and maxRotationX|Y are the absolute minimums and maximums that any generic element can be rotated by, but in order to determine\n        // what the min/max rotations for our current element is (which will be inside of the absolute min/max described above), we need\n        // to calculate the max rotations for this element by clamping the sizes and doing a linear interpolation:\n        var maxElementRotationX = maxRotationX - (((clampedHeight - minSize) / sizeRange) * (maxRotationX - minRotationX));\n        var maxElementRotationY = maxRotationY - (((clampedWidth - minSize) / sizeRange) * (maxRotationY - minRotationY));\n\n        // Now we calculate the distance of our current point from the center of our element and normalize it to be in the range of 0 - 1\n        var normalizedOffsetX = ((clickX - elementRect.left) - halfWidth) / halfWidth;\n        var normalizedOffsetY = ((clickY - elementRect.top) - halfHeight) / halfHeight;\n\n        // Finally, we calculate the appropriate rotations and scale for the element by using the normalized click offsets and the\n        // maximum element rotation.\n        var rotationX = maxElementRotationX * normalizedOffsetY;\n        var rotationY = maxElementRotationY * normalizedOffsetX;\n        var scale = 0.97 + 0.03 * (Math.abs(normalizedOffsetX) + Math.abs(normalizedOffsetY)) / 2.0;\n        var transform = \"perspective(800px) scale(\" + scale + \") rotateX(\" + -rotationX + \"deg) rotateY(\" + rotationY + \"deg)\";\n        return transform;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        // Expose these to the unit tests\n        _tiltTransform: tiltTransform,\n\n        _ItemEventsHandler: _Base.Namespace._lazy(function () {\n            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\";\n\n            function createNodeWithClass(className, skipAriaHidden) {\n                var element = _Global.document.createElement(\"div\");\n                element.className = className;\n                if (!skipAriaHidden) {\n                    element.setAttribute(\"aria-hidden\", true);\n                }\n                return element;\n            }\n\n            var ItemEventsHandler = _Base.Class.define(function ItemEventsHandler_ctor(site) {\n                this._site = site;\n\n                this._work = [];\n                this._animations = {};\n            }, {\n                dispose: function () {\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n                    _ElementUtilities._removeEventListener(_Global, \"pointerup\", this._resetPointerDownStateBound);\n                    _ElementUtilities._removeEventListener(_Global, \"pointercancel\", this._resetPointerDownStateBound);\n                },\n\n                onPointerDown: function ItemEventsHandler_onPointerDown(eventObject) {\n                    _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSPointerDown,StartTM\");\n                    var site = this._site,\n                        touchInput = (eventObject.pointerType === PT_TOUCH),\n                        leftButton,\n                        rightButton;\n                    site.pressedElement = eventObject.target;\n                    if (_WinRT.Windows.UI.Input.PointerPoint) {\n                        // xButton is true when you've x-clicked with a mouse or pen. Otherwise it is false.\n                        var currentPoint = this._getCurrentPoint(eventObject);\n                        var pointProps = currentPoint.properties;\n                        if (!(touchInput || pointProps.isInverted || pointProps.isEraser || pointProps.isMiddleButtonPressed)) {\n                            rightButton = pointProps.isRightButtonPressed;\n                            leftButton = !rightButton && pointProps.isLeftButtonPressed;\n                        } else {\n                            leftButton = rightButton = false;\n                        }\n                    } else {\n                        // xButton is true when you've x-clicked with a mouse. Otherwise it is false.\n                        leftButton = (eventObject.button === _Constants._LEFT_MSPOINTER_BUTTON);\n                        rightButton = (eventObject.button === _Constants._RIGHT_MSPOINTER_BUTTON);\n                    }\n\n                    this._DragStartBound = this._DragStartBound || this.onDragStart.bind(this);\n                    this._PointerEnterBound = this._PointerEnterBound || this.onPointerEnter.bind(this);\n                    this._PointerLeaveBound = this._PointerLeaveBound || this.onPointerLeave.bind(this);\n\n                    var isInteractive = this._isInteractive(eventObject.target),\n                        currentPressedIndex = site.indexForItemElement(eventObject.target),\n                        currentPressedHeaderIndex = site.indexForHeaderElement(eventObject.target),\n                        mustSetCapture = !isInteractive && currentPressedIndex !== _Constants._INVALID_INDEX;\n\n                    if ((touchInput || leftButton) && this._site.pressedEntity.index === _Constants._INVALID_INDEX && !isInteractive) {\n                        if (currentPressedHeaderIndex === _Constants._INVALID_INDEX) {\n                            this._site.pressedEntity = { type: _UI.ObjectType.item, index: currentPressedIndex };\n                        } else {\n                            this._site.pressedEntity = { type: _UI.ObjectType.groupHeader, index: currentPressedHeaderIndex };\n                        }\n\n                        if (this._site.pressedEntity.index !== _Constants._INVALID_INDEX) {\n                            this._site.pressedPosition = _ElementUtilities._getCursorPos(eventObject);\n\n                            var allowed = site.verifySelectionAllowed(this._site.pressedEntity);\n                            this._canSelect = allowed.canSelect;\n                            this._canTapSelect = allowed.canTapSelect;\n\n                            if (this._site.pressedEntity.type === _UI.ObjectType.item) {\n                                this._site.pressedItemBox = site.itemBoxAtIndex(this._site.pressedEntity.index);\n                                this._site.pressedContainer = site.containerAtIndex(this._site.pressedEntity.index);\n                                this._site.animatedElement = this._site.pressedContainer;\n                                this._site.pressedHeader = null;\n                                this._togglePressed(true, false, eventObject);\n                                this._site.pressedContainer.addEventListener('dragstart', this._DragStartBound);\n                                if (!touchInput) {\n                                    // This only works for non touch input because on touch input we set capture which immediately fires the MSPointerOut.\n                                    _ElementUtilities._addEventListener(this._site.pressedContainer, 'pointerenter', this._PointerEnterBound, false);\n                                    _ElementUtilities._addEventListener(this._site.pressedContainer, 'pointerleave', this._PointerLeaveBound, false);\n                                }\n                            } else {\n                                this._site.pressedHeader = this._site.headerFromElement(eventObject.target);\n                                // Interactions with the headers on phone show an animation\n                                if (_BaseUtils.isPhone) {\n                                    this._site.animatedElement = this._site.pressedHeader;\n                                    this._togglePressed(true, false, eventObject);\n                                } else {\n                                    this._site.pressedItemBox = null;\n                                    this._site.pressedContainer = null;\n                                    this._site.animatedElement = null;\n                                }\n                            }\n\n                            if (!this._resetPointerDownStateBound) {\n                                this._resetPointerDownStateBound = this._resetPointerDownStateForPointerId.bind(this);\n                            }\n\n                            if (!touchInput) {\n                                _ElementUtilities._addEventListener(_Global, \"pointerup\", this._resetPointerDownStateBound, false);\n                                _ElementUtilities._addEventListener(_Global, \"pointercancel\", this._resetPointerDownStateBound, false);\n                            }\n\n                            this._pointerId = eventObject.pointerId;\n                            this._pointerRightButton = rightButton;\n                        }\n                    }\n\n                    if (mustSetCapture) {\n                        if (touchInput) {\n                            try {\n                                // Move pointer capture to avoid hover visual on second finger\n                                _ElementUtilities._setPointerCapture(site.canvasProxy, eventObject.pointerId);\n                            } catch (e) {\n                                _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSPointerDown,StopTM\");\n                                return;\n                            }\n                        }\n                    }\n\n                    // Once the shift selection pivot is set, it remains the same until the user\n                    // performs a left- or right-click without holding the shift key down.\n                    if (this._site.pressedEntity.type === _UI.ObjectType.item &&\n                            this._selectionAllowed() && this._multiSelection() &&       // Multi selection enabled\n                            this._site.pressedEntity.index !== _Constants._INVALID_INDEX &&    // A valid item was clicked\n                            site.selection._getFocused().index !== _Constants._INVALID_INDEX && site.selection._pivot === _Constants._INVALID_INDEX) {\n                        site.selection._pivot = site.selection._getFocused().index;\n                    }\n\n                    _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSPointerDown,StopTM\");\n                },\n\n                onPointerEnter: function ItemEventsHandler_onPointerEnter(eventObject) {\n                    if (this._site.pressedContainer && this._pointerId === eventObject.pointerId) {\n                        this._togglePressed(true, false, eventObject);\n                    }\n                },\n\n                onPointerLeave: function ItemEventsHandler_onPointerLeave(eventObject) {\n                    if (this._site.pressedContainer && this._pointerId === eventObject.pointerId) {\n                        this._togglePressed(false, true /* synchronous */, eventObject);\n                    }\n                },\n\n                onDragStart: function ItemEventsHandler_onDragStart() {\n                    this._resetPressedContainer();\n                },\n\n                _resetPressedContainer: function ItemEventsHandler_resetPressedContainer() {\n                    if ((this._site.pressedContainer || this._site.pressedHeader) && this._site.animatedElement) {\n                        this._togglePressed(false);\n                        if (this._site.pressedContainer) {\n                            this._site.pressedContainer.style[transformNames.scriptName] = \"\";\n                            this._site.pressedContainer.removeEventListener('dragstart', this._DragStartBound);\n                            _ElementUtilities._removeEventListener(this._site.pressedContainer, 'pointerenter', this._PointerEnterBound, false);\n                            _ElementUtilities._removeEventListener(this._site.pressedContainer, 'pointerleave', this._PointerLeaveBound, false);\n                        }\n                    }\n                },\n\n                onClick: function ItemEventsHandler_onClick(eventObject) {\n                    if (!this._skipClick) {\n                        // Handle the UIA invoke action on an item. this._skipClick is false which tells us that we received a click\n                        // event without an associated MSPointerUp event. This means that the click event was triggered thru UIA\n                        // rather than thru the GUI.\n                        var entity = { type: _UI.ObjectType.item, index: this._site.indexForItemElement(eventObject.target) };\n                        if (entity.index === _Constants._INVALID_INDEX) {\n                            entity.index = this._site.indexForHeaderElement(eventObject.target);\n                            if (entity.index !== _Constants._INVALID_INDEX) {\n                                entity.type = _UI.ObjectType.groupHeader;\n                            }\n                        }\n\n                        if (entity.index !== _Constants._INVALID_INDEX &&\n                            (_ElementUtilities.hasClass(eventObject.target, this._site.accessibleItemClass) || _ElementUtilities.hasClass(eventObject.target, _Constants._headerClass))) {\n                            var allowed = this._site.verifySelectionAllowed(entity);\n                            if (allowed.canTapSelect) {\n                                this.handleTap(entity);\n                            }\n                            this._site.fireInvokeEvent(entity, eventObject.target);\n                        }\n                    }\n                },\n\n                onPointerUp: function ItemEventsHandler_onPointerUp(eventObject) {\n                    _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSPointerUp,StartTM\");\n\n                    var site = this._site;\n                    this._skipClick = true;\n                    var that = this;\n                    _BaseUtils._yieldForEvents(function () {\n                        that._skipClick = false;\n                    });\n\n                    try {\n                        // Release the pointer capture to allow in air touch pointers to be reused for multiple interactions\n                        _ElementUtilities._releasePointerCapture(site.canvasProxy, eventObject.pointerId);\n                    } catch (e) {\n                        // This can throw if SeZo had capture or if the pointer was not already captured\n                    }\n\n                    var touchInput = (eventObject.pointerType === PT_TOUCH),\n                        releasedElement = this._releasedElement(eventObject),\n                        releasedIndex = site.indexForItemElement(releasedElement),\n                        releasedHeaderIndex = releasedElement && _ElementUtilities.hasClass(releasedElement, _Constants._headerContainerClass) ? site.indexForHeaderElement(site.pressedHeader) : site.indexForHeaderElement(releasedElement);\n\n                    if (this._pointerId === eventObject.pointerId) {\n                        var releasedEntity;\n                        if (releasedHeaderIndex === _Constants._INVALID_INDEX) {\n                            releasedEntity = { type: _UI.ObjectType.item, index: releasedIndex };\n                        } else {\n                            releasedEntity = { type: _UI.ObjectType.groupHeader, index: releasedHeaderIndex };\n                        }\n\n                        this._resetPressedContainer();\n\n                        if (this._site.pressedEntity.type === _UI.ObjectType.item && releasedEntity.type === _UI.ObjectType.item &&\n                                this._site.pressedContainer && this._site.pressedEntity.index === releasedEntity.index) {\n\n                            if (!eventObject.shiftKey) {\n                                // Reset the shift selection pivot when the user clicks w/o pressing shift\n                                site.selection._pivot = _Constants._INVALID_INDEX;\n                            }\n\n                            if (eventObject.shiftKey) {\n                                // Shift selection should work when shift or shift+ctrl are depressed for both left- and right-click\n                                if (this._selectionAllowed() && this._multiSelection() && site.selection._pivot !== _Constants._INVALID_INDEX) {\n                                    var firstIndex = Math.min(this._site.pressedEntity.index, site.selection._pivot),\n                                        lastIndex = Math.max(this._site.pressedEntity.index, site.selection._pivot),\n                                        additive = (this._pointerRightButton || eventObject.ctrlKey || site.tapBehavior === _UI.TapBehavior.toggleSelect);\n                                    site.selectRange(firstIndex, lastIndex, additive);\n                                }\n                            } else if (eventObject.ctrlKey) {\n                                this.toggleSelectionIfAllowed(this._site.pressedEntity.index);\n                            }\n                        }\n\n                        if (this._site.pressedHeader || this._site.pressedContainer) {\n                            var upPosition = _ElementUtilities._getCursorPos(eventObject);\n                            var isTap = Math.abs(upPosition.left - this._site.pressedPosition.left) <= _Constants._TAP_END_THRESHOLD &&\n                                Math.abs(upPosition.top - this._site.pressedPosition.top) <= _Constants._TAP_END_THRESHOLD;\n\n                            // We do not care whether or not the pressed and released indices are equivalent when the user is using touch. The only time they won't be is if the user\n                            // tapped the edge of an item and the pressed animation shrank the item such that the user's finger was no longer over it. In this case, the item should\n                            // be considered tapped.\n                            // However, if the user is using touch then we must perform an extra check. Sometimes we receive MSPointerUp events when the user intended to pan.\n                            // This extra check ensures that these intended pans aren't treated as taps.\n                            if (!this._pointerRightButton && !eventObject.ctrlKey && !eventObject.shiftKey &&\n                                    ((touchInput && isTap) ||\n                                    (!touchInput && this._site.pressedEntity.index === releasedEntity.index && this._site.pressedEntity.type === releasedEntity.type))) {\n                                if (releasedEntity.type === _UI.ObjectType.groupHeader) {\n                                    this._site.pressedHeader = site.headerAtIndex(releasedEntity.index);\n                                    this._site.pressedItemBox = null;\n                                    this._site.pressedContainer = null;\n                                } else {\n                                    this._site.pressedItemBox = site.itemBoxAtIndex(releasedEntity.index);\n                                    this._site.pressedContainer = site.containerAtIndex(releasedEntity.index);\n                                    this._site.pressedHeader = null;\n                                }\n\n                                if (this._canTapSelect) {\n                                    this.handleTap(this._site.pressedEntity);\n                                }\n                                this._site.fireInvokeEvent(this._site.pressedEntity, this._site.pressedItemBox || this._site.pressedHeader);\n                            }\n                        }\n\n                        if (this._site.pressedEntity.index !== _Constants._INVALID_INDEX) {\n                            site.changeFocus(this._site.pressedEntity, true, false, true);\n                        }\n\n                        this.resetPointerDownState();\n                    }\n\n                    _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSPointerUp,StopTM\");\n                },\n\n                onPointerCancel: function ItemEventsHandler_onPointerCancel(eventObject) {\n                    if (this._pointerId === eventObject.pointerId) {\n                        _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSPointerCancel,info\");\n                        this.resetPointerDownState();\n                    }\n                },\n\n                onLostPointerCapture: function ItemEventsHandler_onLostPointerCapture(eventObject) {\n                    if (this._pointerId === eventObject.pointerId) {\n                        _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:MSLostPointerCapture,info\");\n                        this.resetPointerDownState();\n                    }\n                },\n\n                // In order for the control to play nicely with other UI controls such as the app bar, it calls preventDefault on\n                // contextmenu events. It does this only when selection is enabled, the event occurred on or within an item, and\n                // the event did not occur on an interactive element.\n                onContextMenu: function ItemEventsHandler_onContextMenu(eventObject) {\n                    if (this._shouldSuppressContextMenu(eventObject.target)) {\n                        eventObject.preventDefault();\n                    }\n                },\n\n                onMSHoldVisual: function ItemEventsHandler_onMSHoldVisual(eventObject) {\n                    if (this._shouldSuppressContextMenu(eventObject.target)) {\n                        eventObject.preventDefault();\n                    }\n                },\n\n                onDataChanged: function ItemEventsHandler_onDataChanged() {\n                    this.resetPointerDownState();\n                },\n\n                toggleSelectionIfAllowed: function ItemEventsHandler_toggleSelectionIfAllowed(itemIndex) {\n                    if (this._selectionAllowed(itemIndex)) {\n                        this._toggleItemSelection(itemIndex);\n                    }\n                },\n\n                handleTap: function ItemEventsHandler_handleTap(entity) {\n                    if (entity.type === _UI.ObjectType.groupHeader) {\n                        return;\n                    }\n\n                    var site = this._site,\n                        selection = site.selection;\n\n                    if (this._selectionAllowed(entity.index) && this._selectOnTap()) {\n                        if (site.tapBehavior === _UI.TapBehavior.toggleSelect) {\n                            this._toggleItemSelection(entity.index);\n                        } else {\n                            // site.tapBehavior === _UI.TapBehavior.directSelect so ensure only itemIndex is selected\n                            if (site.selectionMode === _UI.SelectionMode.multi || !selection._isIncluded(entity.index)) {\n                                selection.set(entity.index);\n                            }\n                        }\n                    }\n                },\n\n                // In single selection mode, in addition to itemIndex's selection state being toggled,\n                // all other items will become deselected\n                _toggleItemSelection: function ItemEventsHandler_toggleItemSelection(itemIndex) {\n                    var site = this._site,\n                        selection = site.selection,\n                        selected = selection._isIncluded(itemIndex);\n\n                    if (site.selectionMode === _UI.SelectionMode.single) {\n                        if (!selected) {\n                            selection.set(itemIndex);\n                        } else {\n                            selection.clear();\n                        }\n                    } else {\n                        if (!selected) {\n                            selection.add(itemIndex);\n                        } else {\n                            selection.remove(itemIndex);\n                        }\n                    }\n                },\n\n                _getCurrentPoint: function ItemEventsHandler_getCurrentPoint(eventObject) {\n                    return _WinRT.Windows.UI.Input.PointerPoint.getCurrentPoint(eventObject.pointerId);\n                },\n\n                _containedInElementWithClass: function ItemEventsHandler_containedInElementWithClass(element, className) {\n                    if (element.parentNode) {\n                        var matches = element.parentNode.querySelectorAll(\".\" + className + \", .\" + className + \" *\");\n                        for (var i = 0, len = matches.length; i < len; i++) {\n                            if (matches[i] === element) {\n                                return true;\n                            }\n                        }\n                    }\n                    return false;\n                },\n\n                _isSelected: function ItemEventsHandler_isSelected(index) {\n                    return this._site.selection._isIncluded(index);\n                },\n\n                _isInteractive: function ItemEventsHandler_isInteractive(element) {\n                    return this._containedInElementWithClass(element, \"win-interactive\");\n                },\n\n                _shouldSuppressContextMenu: function ItemEventsHandler_shouldSuppressContextMenu(element) {\n                    var containerElement = this._site.containerFromElement(element);\n\n                    return (this._selectionAllowed() && containerElement && !this._isInteractive(element));\n                },\n\n                _togglePressed: function ItemEventsHandler_togglePressed(add, synchronous, eventObject) {\n                    var that = this;\n                    var isHeader = this._site.pressedEntity.type === _UI.ObjectType.groupHeader;\n\n                    this._site.animatedDownPromise && this._site.animatedDownPromise.cancel();\n\n                    if (!isHeader && _ElementUtilities.hasClass(this._site.pressedItemBox, _Constants._nonSelectableClass)) {\n                        return;\n                    }\n\n                    if (!this._staticMode(isHeader)) {\n                        if (add) {\n                            if (!_ElementUtilities.hasClass(this._site.animatedElement, _Constants._pressedClass)) {\n                                _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:applyPressedUI,info\");\n                                _ElementUtilities.addClass(this._site.animatedElement, _Constants._pressedClass);\n\n                                var boundingElement = isHeader ? that._site.pressedHeader : that._site.pressedContainer;\n                                var transform = tiltTransform(eventObject.clientX, eventObject.clientY, boundingElement.getBoundingClientRect());\n                                // Timeout prevents item from looking like it was pressed down during pans\n                                this._site.animatedDownPromise = Promise.timeout(50).then(function () {\n                                    applyDownVisual(transform);\n                                });\n                            }\n                        } else {\n                            if (_ElementUtilities.hasClass(this._site.animatedElement, _Constants._pressedClass)) {\n                                var element = this._site.animatedElement;\n                                var expectingStyle = this._site.animatedElementScaleTransform;\n                                if (synchronous) {\n                                    applyUpVisual(element, expectingStyle);\n                                } else {\n                                    // Force removal of the _pressedClass to be asynchronous so that users will see at\n                                    // least one frame of the shrunken item when doing a quick tap.\n                                    //\n                                    // setImmediate is used rather than requestAnimationFrame to ensure that the item\n                                    // doesn't get stuck down for too long -- apps are told to put long running invoke\n                                    // code behind a setImmediate and togglePressed's async code needs to run first.\n                                    _BaseUtils._setImmediate(function () {\n                                        if (_ElementUtilities.hasClass(element, _Constants._pressedClass)) {\n                                            applyUpVisual(element, expectingStyle);\n                                        }\n                                    });\n                                }\n                            }\n                        }\n                    }\n\n                    function applyDownVisual(transform) {\n                        if (that._site.isInSelectionMode()) {\n                            return;\n                        }\n\n                        if (that._site.animatedElement.style[transformNames.scriptName] === \"\") {\n                            that._site.animatedElement.style[transformNames.scriptName] = transform;\n                            that._site.animatedElementScaleTransform = that._site.animatedElement.style[transformNames.scriptName];\n                        } else {\n                            that._site.animatedElementScaleTransform = \"\";\n                        }\n                    }\n\n                    function applyUpVisual(element, expectingStyle) {\n                        _WriteProfilerMark(\"WinJS.UI._ItemEventsHandler:removePressedUI,info\");\n                        _ElementUtilities.removeClass(element, _Constants._pressedClass);\n                        if (that._containsTransform(element, expectingStyle)) {\n                            _TransitionAnimation.executeTransition(element, {\n                                property: transformNames.cssName,\n                                delay: 150,\n                                duration: 350,\n                                timing: \"cubic-bezier(0.17,0.17,0.2,1)\",\n                                to: element.style[transformNames.scriptName].replace(expectingStyle, \"\")\n                            });\n                        }\n                    }\n                },\n\n                _containsTransform: function ItemEventsHandler_containsTransform(element, transform) {\n                    return transform && element.style[transformNames.scriptName].indexOf(transform) !== -1;\n                },\n\n                _resetPointerDownStateForPointerId: function ItemEventsHandler_resetPointerDownState(eventObject) {\n                    if (this._pointerId === eventObject.pointerId) {\n                        this.resetPointerDownState();\n                    }\n                },\n\n                resetPointerDownState: function ItemEventsHandler_resetPointerDownState() {\n                    this._site.pressedElement = null;\n                    _ElementUtilities._removeEventListener(_Global, \"pointerup\", this._resetPointerDownStateBound);\n                    _ElementUtilities._removeEventListener(_Global, \"pointercancel\", this._resetPointerDownStateBound);\n\n                    this._resetPressedContainer();\n\n                    this._site.pressedContainer = null;\n                    this._site.animatedElement = null;\n                    this._site.pressedHeader = null;\n                    this._site.pressedItemBox = null;\n\n                    this._site.pressedEntity = { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };\n                    this._pointerId = null;\n                },\n\n                _releasedElement: function ItemEventsHandler_releasedElement(eventObject) {\n                    return _Global.document.elementFromPoint(eventObject.clientX, eventObject.clientY);\n                },\n\n                _applyUIInBatches: function ItemEventsHandler_applyUIInBatches(work) {\n                    var that = this;\n                    this._work.push(work);\n\n                    if (!this._paintedThisFrame) {\n                        applyUI();\n                    }\n\n                    function applyUI() {\n                        if (that._work.length > 0) {\n                            that._flushUIBatches();\n                            that._paintedThisFrame = _BaseUtils._requestAnimationFrame(applyUI.bind(that));\n                        } else {\n                            that._paintedThisFrame = null;\n                        }\n                    }\n                },\n\n                _flushUIBatches: function ItemEventsHandler_flushUIBatches() {\n                    if (this._work.length > 0) {\n                        var workItems = this._work;\n                        this._work = [];\n\n                        for (var i = 0; i < workItems.length; i++) {\n                            workItems[i]();\n                        }\n                    }\n                },\n\n                _selectionAllowed: function ItemEventsHandler_selectionAllowed(itemIndex) {\n                    var item = (itemIndex !== undefined ? this._site.itemAtIndex(itemIndex) : null),\n                        itemSelectable = !(item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass));\n                    return itemSelectable && this._site.selectionMode !== _UI.SelectionMode.none;\n                },\n\n                _multiSelection: function ItemEventsHandler_multiSelection() {\n                    return this._site.selectionMode === _UI.SelectionMode.multi;\n                },\n\n                _selectOnTap: function ItemEventsHandler_selectOnTap() {\n                    return this._site.tapBehavior === _UI.TapBehavior.toggleSelect || this._site.tapBehavior === _UI.TapBehavior.directSelect;\n                },\n\n                _staticMode: function ItemEventsHandler_staticMode(isHeader) {\n                    if (isHeader) {\n                        return this._site.headerTapBehavior === _UI.GroupHeaderTapBehavior.none;\n                    } else {\n                        return this._site.tapBehavior === _UI.TapBehavior.none && this._site.selectionMode === _UI.SelectionMode.none;\n                    }\n                },\n            }, {\n                // Avoids unnecessary UIA selection events by only updating aria-selected if it has changed\n                setAriaSelected: function ItemEventsHandler_setAriaSelected(itemElement, isSelected) {\n                    var ariaSelected = (itemElement.getAttribute(\"aria-selected\") === \"true\");\n\n                    if (isSelected !== ariaSelected) {\n                        itemElement.setAttribute(\"aria-selected\", isSelected);\n                    }\n                },\n\n                renderSelection: function ItemEventsHandler_renderSelection(itemBox, element, selected, aria, container) {\n                    if (!ItemEventsHandler._selectionTemplate) {\n                        ItemEventsHandler._selectionTemplate = [];\n                        ItemEventsHandler._selectionTemplate.push(createNodeWithClass(_Constants._selectionBackgroundClass));\n                        ItemEventsHandler._selectionTemplate.push(createNodeWithClass(_Constants._selectionBorderClass));\n                        ItemEventsHandler._selectionTemplate.push(createNodeWithClass(_Constants._selectionCheckmarkBackgroundClass));\n                        var checkmark = createNodeWithClass(_Constants._selectionCheckmarkClass);\n                        checkmark.textContent = _Constants._SELECTION_CHECKMARK;\n                        ItemEventsHandler._selectionTemplate.push(checkmark);\n                    }\n\n                    // Update the selection rendering if necessary\n                    if (selected !== _ElementUtilities._isSelectionRendered(itemBox)) {\n                        if (selected) {\n                            itemBox.insertBefore(ItemEventsHandler._selectionTemplate[0].cloneNode(true), itemBox.firstElementChild);\n\n                            for (var i = 1, len = ItemEventsHandler._selectionTemplate.length; i < len; i++) {\n                                itemBox.appendChild(ItemEventsHandler._selectionTemplate[i].cloneNode(true));\n                            }\n                        } else {\n                            var nodes = itemBox.querySelectorAll(_ElementUtilities._selectionPartsSelector);\n                            for (var i = 0, len = nodes.length; i < len; i++) {\n                                itemBox.removeChild(nodes[i]);\n                            }\n                        }\n\n                        _ElementUtilities[selected ? \"addClass\" : \"removeClass\"](itemBox, _Constants._selectedClass);\n                        if (container) {\n                            _ElementUtilities[selected ? \"addClass\" : \"removeClass\"](container, _Constants._selectedClass);\n                        }\n                    }\n\n                    // To allow itemPropertyChange to work properly, aria needs to be updated after the selection visuals are added to the itemBox\n                    if (aria) {\n                        ItemEventsHandler.setAriaSelected(element, selected);\n                    }\n                },\n            });\n\n            return ItemEventsHandler;\n        })\n\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_SelectionManager',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Promise',\n    '../../_Signal',\n    '../../Utilities/_UI',\n    '../ItemContainer/_Constants'\n    ], function selectionManagerInit(exports, _Global, _Base, Promise, _Signal, _UI, _Constants) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _ItemSet: _Base.Namespace._lazy(function () {\n            var _ItemSet = _Base.Class.define(function _ItemSet_ctor(listView, ranges, count) {\n                this._listView = listView;\n                this._ranges = ranges;\n                this._itemsCount = count;\n            });\n            _ItemSet.prototype = {\n                getRanges: function () {\n                    var ranges = [];\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        var range = this._ranges[i];\n                        ranges.push({\n                            firstIndex: range.firstIndex,\n                            lastIndex: range.lastIndex,\n                            firstKey: range.firstKey,\n                            lastKey: range.lastKey\n                        });\n                    }\n                    return ranges;\n                },\n\n                getItems: function () {\n                    return exports.getItemsFromRanges(this._listView._itemsManager.dataSource, this._ranges);\n                },\n\n                isEverything: function () {\n                    return this.count() === this._itemsCount;\n                },\n\n                count: function () {\n                    var count = 0;\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        var range = this._ranges[i];\n                        count += range.lastIndex - range.firstIndex + 1;\n                    }\n                    return count;\n                },\n\n                getIndices: function () {\n                    var indices = [];\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        var range = this._ranges[i];\n                        for (var n = range.firstIndex; n <= range.lastIndex; n++) {\n                            indices.push(n);\n                        }\n                    }\n                    return indices;\n                }\n            };\n            return _ItemSet;\n        }),\n\n        getItemsFromRanges: function (dataSource, ranges) {\n            var listBinding = dataSource.createListBinding(),\n                promises = [];\n\n            function getIndices() {\n                var indices = [];\n                for (var i = 0, len = ranges.length; i < len; i++) {\n                    var range = ranges[i];\n                    for (var j = range.firstIndex; j <= range.lastIndex; j++) {\n                        indices.push(j);\n                    }\n                }\n                return Promise.wrap(indices);\n            }\n\n            return getIndices().then(function (indices) {\n                for (var i = 0; i < indices.length; i++) {\n                    promises.push(listBinding.fromIndex(indices[i]));\n                }\n\n                return Promise.join(promises).then(function (items) {\n                    listBinding.release();\n                    return items;\n                });\n            });\n        },\n\n        _Selection: _Base.Namespace._lazy(function () {\n            function isEverythingRange(ranges) {\n                return ranges && ranges.firstIndex === 0 && ranges.lastIndex === Number.MAX_VALUE;\n            }\n\n            return _Base.Class.derive(exports._ItemSet, function (listView, indexesAndRanges) {\n                this._listView = listView;\n                this._itemsCount = -1;\n                this._ranges = [];\n                if (indexesAndRanges) {\n                    this.set(indexesAndRanges);\n                }\n            }, {\n                clear: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._Selection.prototype.clear\">\n                    /// <summary locid=\"WinJS.UI._Selection.prototype.clear\">\n                    /// Clears the selection.\n                    /// </summary>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._Selection.prototype.clear_returnValue\">\n                    /// A Promise that is fulfilled when the clear operation completes.\n                    /// </returns>\n                    /// </signature>\n\n                    this._releaseRanges(this._ranges);\n                    this._ranges = [];\n                    return Promise.wrap();\n                },\n\n                set: function (items) {\n                    /// <signature helpKeyword=\"WinJS.UI._Selection.prototype.set\">\n                    /// <summary locid=\"WinJS.UI._Selection.prototype.set\">\n                    /// Clears the current selection and replaces it with the specified items.\n                    /// </summary>\n                    /// <param name=\"items\" locid=\"WinJS.UI._Selection.prototype.set_items\">\n                    /// The indexes or keys of the items that make up the selection.\n                    /// You can provide different types of objects for the items parameter:\n                    /// you can specify an index, a key, or a range of indexes.\n                    /// It can also be an array that contains one or more of these objects.\n                    /// </param>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._Selection.prototype.set_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n\n                    // A range with lastIndex set to Number.MAX_VALUE used to mean selectAll. Passing such range to set was equivalent to selectAll. This code preserves this behavior.\n                    if (!isEverythingRange(items)) {\n                        this._releaseRanges(this._ranges);\n                        this._ranges = [];\n\n                        var that = this;\n                        return this._execute(\"_set\", items).then(function () {\n                            that._ranges.sort(function (left, right) {\n                                return left.firstIndex - right.firstIndex;\n                            });\n                            return that._ensureKeys();\n                        }).then(function () {\n                            return that._ensureCount();\n                        });\n                    } else {\n                        return this.selectAll();\n                    }\n                },\n\n                add: function (items) {\n                    /// <signature helpKeyword=\"WinJS.UI._Selection.prototype.add\">\n                    /// <summary locid=\"WinJS.UI._Selection.prototype.add\">\n                    /// Adds one or more items to the selection.\n                    /// </summary>\n                    /// <param name=\"items\" locid=\"WinJS.UI._Selection.prototype.add_items\">\n                    /// The indexes or keys of the items to add.\n                    /// You can provide different types of objects for the items parameter:\n                    /// you can specify an index, a key, or a range of indexes.\n                    /// It can also be an array that contains one or more of these objects.\n                    /// </param>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._Selection.prototype.add_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n\n                    if (!isEverythingRange(items)) {\n                        var that = this;\n                        return this._execute(\"_add\", items).then(function () {\n                            return that._ensureKeys();\n                        }).then(function () {\n                            return that._ensureCount();\n                        });\n                    } else {\n                        return this.selectAll();\n                    }\n                },\n\n                remove: function (items) {\n                    /// <signature helpKeyword=\"WinJS.UI._Selection.prototype.remove\">\n                    /// <summary locid=\"WinJS.UI._Selection.prototype.remove\">\n                    /// Removes the specified items from the selection.\n                    /// </summary>\n                    /// <param name=\"items\" locid=\"WinJS.UI._Selection.prototype.remove_items\">\n                    /// The indexes or keys of the items to remove. You can provide different types of objects for the items parameter:\n                    /// you can specify an index, a key, or a range of indexes.\n                    /// It can also be an array that contains one or more of these objects.\n                    /// </param>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._Selection.prototype.remove_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n\n                    var that = this;\n                    return this._execute(\"_remove\", items).then(function () {\n                        return that._ensureKeys();\n                    });\n                },\n\n                selectAll: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._Selection.prototype.selectAll\">\n                    /// <summary locid=\"WinJS.UI._Selection.prototype.selectAll\">\n                    /// Adds all the items in the ListView to the selection.\n                    /// </summary>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._Selection.prototype.selectAll_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n\n                    var that = this;\n                    return that._ensureCount().then(function () {\n                        if (that._itemsCount) {\n                            var range = {\n                                firstIndex: 0,\n                                lastIndex: that._itemsCount - 1,\n                            };\n                            that._retainRange(range);\n                            that._releaseRanges(that._ranges);\n                            that._ranges = [range];\n                            return that._ensureKeys();\n                        }\n                    });\n                },\n\n                _execute: function (operation, items) {\n                    var that = this,\n                        keysSupported = !!that._getListBinding().fromKey,\n                        array = Array.isArray(items) ? items : [items],\n                        promises = [Promise.wrap()];\n\n                    function toRange(type, first, last) {\n                        var retVal = {};\n                        retVal[\"first\" + type] = first;\n                        retVal[\"last\" + type] = last;\n                        return retVal;\n                    }\n\n                    function handleKeys(range) {\n                        var binding = that._getListBinding();\n\n                        var promise = Promise.join([binding.fromKey(range.firstKey), binding.fromKey(range.lastKey)]).then(function (items) {\n                            if (items[0] && items[1]) {\n                                range.firstIndex = items[0].index;\n                                range.lastIndex = items[1].index;\n                                that[operation](range);\n                            }\n                            return range;\n                        });\n                        promises.push(promise);\n                    }\n\n                    for (var i = 0, len = array.length; i < len; i++) {\n                        var item = array[i];\n                        if (typeof item === \"number\") {\n                            this[operation](toRange(\"Index\", item, item));\n                        } else if (item) {\n                            if (keysSupported && item.key !== undefined) {\n                                handleKeys(toRange(\"Key\", item.key, item.key));\n                            } else if (keysSupported && item.firstKey !== undefined && item.lastKey !== undefined) {\n                                handleKeys(toRange(\"Key\", item.firstKey, item.lastKey));\n                            } else if (item.index !== undefined && typeof item.index === \"number\") {\n                                this[operation](toRange(\"Index\", item.index, item.index));\n                            } else if (item.firstIndex !== undefined && item.lastIndex !== undefined &&\n                                    typeof item.firstIndex === \"number\" && typeof item.lastIndex === \"number\") {\n                                this[operation](toRange(\"Index\", item.firstIndex, item.lastIndex));\n                            }\n                        }\n                    }\n\n                    return Promise.join(promises);\n                },\n\n                _set: function (range) {\n                    this._retainRange(range);\n                    this._ranges.push(range);\n                },\n\n                _add: function (newRange) {\n                    var that = this,\n                        prev = null,\n                        range,\n                        inserted;\n\n                    var merge = function (left, right) {\n                        if (right.lastIndex > left.lastIndex) {\n                            left.lastIndex = right.lastIndex;\n                            left.lastKey = right.lastKey;\n                            if (left.lastPromise) {\n                                left.lastPromise.release();\n                            }\n                            left.lastPromise = that._getListBinding().fromIndex(left.lastIndex).retain();\n                        }\n                    };\n                    var mergeWithPrev;\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        range = this._ranges[i];\n                        if (newRange.firstIndex < range.firstIndex) {\n                            mergeWithPrev = prev && newRange.firstIndex < (prev.lastIndex + 1);\n                            if (mergeWithPrev) {\n                                inserted = i - 1;\n                                merge(prev, newRange);\n                            } else {\n                                this._insertRange(i, newRange);\n                                inserted = i;\n                            }\n                            break;\n                        } else if (newRange.firstIndex === range.firstIndex) {\n                            merge(range, newRange);\n                            inserted = i;\n                            break;\n                        }\n                        prev = range;\n                    }\n\n                    if (inserted === undefined) {\n                        var last = this._ranges.length ? this._ranges[this._ranges.length - 1] : null,\n                            mergeWithLast = last && newRange.firstIndex < (last.lastIndex + 1);\n                        if (mergeWithLast) {\n                            merge(last, newRange);\n                        } else {\n                            this._retainRange(newRange);\n                            this._ranges.push(newRange);\n                        }\n                    } else {\n                        prev = null;\n                        for (i = inserted + 1, len = this._ranges.length; i < len; i++) {\n                            range = this._ranges[i];\n                            if (newRange.lastIndex < range.firstIndex) {\n                                mergeWithPrev = prev && prev.lastIndex > newRange.lastIndex;\n                                if (mergeWithPrev) {\n                                    merge(this._ranges[inserted], prev);\n                                }\n                                this._removeRanges(inserted + 1, i - inserted - 1);\n                                break;\n                            } else if (newRange.lastIndex === range.firstIndex) {\n                                merge(this._ranges[inserted], range);\n                                this._removeRanges(inserted + 1, i - inserted);\n                                break;\n                            }\n                            prev = range;\n                        }\n                        if (i >= len) {\n                            merge(this._ranges[inserted], this._ranges[len - 1]);\n                            this._removeRanges(inserted + 1, len - inserted - 1);\n                        }\n                    }\n                },\n\n                _remove: function (toRemove) {\n                    var that = this;\n\n                    function retainPromise(index) {\n                        return that._getListBinding().fromIndex(index).retain();\n                    }\n\n                    // This method is called when a range needs to be unselected.  It is inspecting every range in the current selection comparing\n                    // it to the range which is being unselected and it is building an array of new selected ranges\n                    var ranges = [];\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        var range = this._ranges[i];\n                        if (range.lastIndex < toRemove.firstIndex || range.firstIndex > toRemove.lastIndex) {\n                            // No overlap with the unselected range\n                            ranges.push(range);\n                        } else if (range.firstIndex < toRemove.firstIndex && range.lastIndex >= toRemove.firstIndex && range.lastIndex <= toRemove.lastIndex) {\n                            // The end of this range is being unselected\n                            ranges.push({\n                                firstIndex: range.firstIndex,\n                                firstKey: range.firstKey,\n                                firstPromise: range.firstPromise,\n                                lastIndex: toRemove.firstIndex - 1,\n                                lastPromise: retainPromise(toRemove.firstIndex - 1)\n                            });\n                            range.lastPromise.release();\n                        } else if (range.lastIndex > toRemove.lastIndex && range.firstIndex >= toRemove.firstIndex && range.firstIndex <= toRemove.lastIndex) {\n                            // The beginning of this range is being unselected\n                            ranges.push({\n                                firstIndex: toRemove.lastIndex + 1,\n                                firstPromise: retainPromise(toRemove.lastIndex + 1),\n                                lastIndex: range.lastIndex,\n                                lastKey: range.lastKey,\n                                lastPromise: range.lastPromise\n                            });\n                            range.firstPromise.release();\n                        } else if (range.firstIndex < toRemove.firstIndex && range.lastIndex > toRemove.lastIndex) {\n                            // The middle part of this range is being unselected\n                            ranges.push({\n                                firstIndex: range.firstIndex,\n                                firstKey: range.firstKey,\n                                firstPromise: range.firstPromise,\n                                lastIndex: toRemove.firstIndex - 1,\n                                lastPromise: retainPromise(toRemove.firstIndex - 1),\n                            });\n                            ranges.push({\n                                firstIndex: toRemove.lastIndex + 1,\n                                firstPromise: retainPromise(toRemove.lastIndex + 1),\n                                lastIndex: range.lastIndex,\n                                lastKey: range.lastKey,\n                                lastPromise: range.lastPromise\n                            });\n                        } else {\n                            // The whole range is being unselected\n                            range.firstPromise.release();\n                            range.lastPromise.release();\n                        }\n                    }\n                    this._ranges = ranges;\n                },\n\n                _ensureKeys: function () {\n                    var promises = [Promise.wrap()];\n                    var that = this;\n\n                    var ensureKey = function (which, range) {\n                        var keyProperty = which + \"Key\";\n\n                        if (!range[keyProperty]) {\n                            var promise = range[which + \"Promise\"];\n                            promise.then(function (item) {\n                                if (item) {\n                                    range[keyProperty] = item.key;\n                                }\n                            });\n                            return promise;\n                        } else {\n                            return Promise.wrap();\n                        }\n                    };\n\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        var range = this._ranges[i];\n                        promises.push(ensureKey(\"first\", range));\n                        promises.push(ensureKey(\"last\", range));\n                    }\n\n                    Promise.join(promises).then(function () {\n                        that._ranges = that._ranges.filter(function (range) {\n                            return range.firstKey && range.lastKey;\n                        });\n                    });\n                    return Promise.join(promises);\n                },\n\n                _mergeRanges: function (target, source) {\n                    target.lastIndex = source.lastIndex;\n                    target.lastKey = source.lastKey;\n                },\n\n                _isIncluded: function (index) {\n                    if (this.isEverything()) {\n                        return true;\n                    } else {\n                        for (var i = 0, len = this._ranges.length; i < len; i++) {\n                            var range = this._ranges[i];\n                            if (range.firstIndex <= index && index <= range.lastIndex) {\n                                return true;\n                            }\n                        }\n                        return false;\n                    }\n                },\n\n                _ensureCount: function () {\n                    var that = this;\n                    return this._listView._itemsCount().then(function (count) {\n                        that._itemsCount = count;\n                    });\n                },\n\n                _insertRange: function (index, newRange) {\n                    this._retainRange(newRange);\n                    this._ranges.splice(index, 0, newRange);\n                },\n\n                _removeRanges: function (index, howMany) {\n                    for (var i = 0; i < howMany; i++) {\n                        this._releaseRange(this._ranges[index + i]);\n                    }\n                    this._ranges.splice(index, howMany);\n                },\n\n                _retainRange: function (range) {\n                    if (!range.firstPromise) {\n                        range.firstPromise = this._getListBinding().fromIndex(range.firstIndex).retain();\n                    }\n                    if (!range.lastPromise) {\n                        range.lastPromise = this._getListBinding().fromIndex(range.lastIndex).retain();\n                    }\n                },\n\n                _retainRanges: function () {\n                    for (var i = 0, len = this._ranges.length; i < len; i++) {\n                        this._retainRange(this._ranges[i]);\n                    }\n                },\n\n                _releaseRange: function (range) {\n                    range.firstPromise.release();\n                    range.lastPromise.release();\n                },\n\n                _releaseRanges: function (ranges) {\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        this._releaseRange(ranges[i]);\n                    }\n                },\n\n                _getListBinding: function () {\n                    return this._listView._itemsManager._listBinding;\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n        }),\n\n        // This component is responsible for holding selection state\n        _SelectionManager: _Base.Namespace._lazy(function () {\n            var _SelectionManager = function (listView) {\n                this._listView = listView;\n                this._selected = new exports._Selection(this._listView);\n                // Don't rename this member. Some apps reference it.\n                this._pivot = _Constants._INVALID_INDEX;\n                this._focused = { type: _UI.ObjectType.item, index: 0 };\n                this._pendingChange = Promise.wrap();\n            };\n            _SelectionManager.prototype = {\n                count: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.count\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.count\">\n                    /// Returns the number of items in the selection.\n                    /// </summary>\n                    /// <returns type=\"Number\" locid=\"WinJS.UI._SelectionManager.prototype.count_returnValue\">\n                    /// The number of items in the selection.\n                    /// </returns>\n                    /// </signature>\n                    return this._selected.count();\n                },\n\n                getIndices: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.getIndices\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.getIndices\">\n                    /// Returns a list of the indexes for the items in the selection.\n                    /// </summary>\n                    /// <returns type=\"Array\" locid=\"WinJS.UI._SelectionManager.prototype.getIndices_returnValue\">\n                    /// The list of indexes for the items in the selection as an array of Number objects.\n                    /// </returns>\n                    /// </signature>\n                    return this._selected.getIndices();\n                },\n\n                getItems: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.getItems\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.getItems\">\n                    /// Returns an array that contains the items in the selection.\n                    /// </summary>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._SelectionManager.prototype.getItems_returnValue\">\n                    /// A Promise that contains an array of the requested IItem objects.\n                    /// </returns>\n                    /// </signature>\n\n                    return this._selected.getItems();\n                },\n\n                getRanges: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.getRanges\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.getRanges\">\n                    /// Gets an array of the index ranges for the selected items.\n                    /// </summary>\n                    /// <returns type=\"Array\" locid=\"WinJS.UI._SelectionManager.prototype.getRanges_returnValue\">\n                    /// An array that contains an ISelectionRange object for each index range in the selection.\n                    /// </returns>\n                    /// </signature>\n                    return this._selected.getRanges();\n                },\n\n                isEverything: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.isEverything\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.isEverything\">\n                    /// Returns a value that indicates whether the selection contains every item in the data source.\n                    /// </summary>\n                    /// <returns type=\"Boolean\" locid=\"WinJS.UI._SelectionManager.prototype.isEverything_returnValue\">\n                    /// true if the selection contains every item in the data source; otherwise, false.\n                    /// </returns>\n                    /// </signature>\n                    return this._selected.isEverything();\n                },\n\n                set: function (items) {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.set\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.set\">\n                    /// Clears the current selection and replaces it with the specified items.\n                    /// </summary>\n                    /// <param name=\"items\" locid=\"WinJS.UI._SelectionManager.prototype.set_items\">\n                    /// The indexes or keys of the items that make up the selection.\n                    /// You can provide different types of objects for the items parameter:\n                    /// you can specify an index, a key, or a range of indexes.\n                    /// It can also be an array that contains one or more of these objects.\n                    /// </param>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._SelectionManager.prototype.set_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n                    var that = this,\n                        signal = new _Signal();\n                    return this._synchronize(signal).then(function () {\n                        var newSelection = new exports._Selection(that._listView);\n                        return newSelection.set(items).then(\n                            function () {\n                                that._set(newSelection);\n                                signal.complete();\n                            },\n                            function (error) {\n                                newSelection.clear();\n                                signal.complete();\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    });\n                },\n\n                clear: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.clear\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.clear\">\n                    /// Clears the selection.\n                    /// </summary>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._SelectionManager.prototype.clear_returnValue\">\n                    /// A Promise that is fulfilled when the clear operation completes.\n                    /// </returns>\n                    /// </signature>\n\n                    var that = this,\n                        signal = new _Signal();\n                    return this._synchronize(signal).then(function () {\n                        var newSelection = new exports._Selection(that._listView);\n                        return newSelection.clear().then(\n                            function () {\n                                that._set(newSelection);\n                                signal.complete();\n                            },\n                            function (error) {\n                                newSelection.clear();\n                                signal.complete();\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    });\n                },\n\n                add: function (items) {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.add\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.add\">\n                    /// Adds one or more items to the selection.\n                    /// </summary>\n                    /// <param name=\"items\" locid=\"WinJS.UI._SelectionManager.prototype.add_items\">\n                    /// The indexes or keys of the items to add.\n                    /// You can provide different types of objects for the items parameter:\n                    /// you can specify an index, a key, or a range of indexes.\n                    /// It can also be an array that contains one or more of these objects.\n                    /// </param>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._SelectionManager.prototype.add_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n                    var that = this,\n                        signal = new _Signal();\n                    return this._synchronize(signal).then(function () {\n                        var newSelection = that._cloneSelection();\n                        return newSelection.add(items).then(\n                            function () {\n                                that._set(newSelection);\n                                signal.complete();\n                            },\n                            function (error) {\n                                newSelection.clear();\n                                signal.complete();\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    });\n                },\n\n                remove: function (items) {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.remove\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.remove\">\n                    /// Removes the specified items from the selection.\n                    /// </summary>\n                    /// <param name=\"items\" locid=\"WinJS.UI._SelectionManager.prototype.remove_items\">\n                    /// The indexes or keys of the items to remove. You can provide different types of objects for the items parameter:\n                    /// you can specify an index, a key, or a range of indexes.\n                    /// It can also be an array that contains one or more of these objects.\n                    /// </param>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._SelectionManager.prototype.remove_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n                    var that = this,\n                        signal = new _Signal();\n                    return this._synchronize(signal).then(function () {\n                        var newSelection = that._cloneSelection();\n                        return newSelection.remove(items).then(\n                            function () {\n                                that._set(newSelection);\n                                signal.complete();\n                            },\n                            function (error) {\n                                newSelection.clear();\n                                signal.complete();\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    });\n                },\n\n                selectAll: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._SelectionManager.prototype.selectAll\">\n                    /// <summary locid=\"WinJS.UI._SelectionManager.prototype.selectAll\">\n                    /// Adds all the items in the ListView to the selection.\n                    /// </summary>\n                    /// <returns type=\"Promise\" locid=\"WinJS.UI._SelectionManager.prototype.selectAll_returnValue\">\n                    /// A Promise that is fulfilled when the operation completes.\n                    /// </returns>\n                    /// </signature>\n                    var that = this,\n                        signal = new _Signal();\n                    return this._synchronize(signal).then(function () {\n                        var newSelection = new exports._Selection(that._listView);\n                        return newSelection.selectAll().then(\n                            function () {\n                                that._set(newSelection);\n                                signal.complete();\n                            },\n                            function (error) {\n                                newSelection.clear();\n                                signal.complete();\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    });\n                },\n\n                _synchronize: function (signal) {\n                    var that = this;\n                    return this._listView._versionManager.unlocked.then(function () {\n                        var currentPendingChange = that._pendingChange;\n                        that._pendingChange = Promise.join([currentPendingChange, signal.promise]).then(function () { });\n                        return currentPendingChange;\n                    });\n                },\n\n                _reset: function () {\n                    this._pivot = _Constants._INVALID_INDEX;\n                    this._setFocused({ type: _UI.ObjectType.item, index: 0 }, this._keyboardFocused());\n                    this._pendingChange.cancel();\n                    this._pendingChange = Promise.wrap();\n                    this._selected.clear();\n                    this._selected = new exports._Selection(this._listView);\n                },\n\n                _dispose: function () {\n                    this._selected.clear();\n                    this._selected = null;\n                    this._listView = null;\n                },\n\n                _set: function (newSelection) {\n                    var that = this;\n                    return this._fireSelectionChanging(newSelection).then(function (approved) {\n                        if (approved) {\n                            that._selected.clear();\n                            that._selected = newSelection;\n                            that._listView._updateSelection();\n                            that._fireSelectionChanged();\n                        } else {\n                            newSelection.clear();\n                        }\n                        return approved;\n                    });\n                },\n\n                _fireSelectionChanging: function (newSelection) {\n                    var eventObject = _Global.document.createEvent(\"CustomEvent\"),\n                        newSelectionUpdated = Promise.wrap();\n\n                    eventObject.initCustomEvent(\"selectionchanging\", true, true, {\n                        newSelection: newSelection,\n                        preventTapBehavior: function () {\n                        },\n                        setPromise: function (promise) {\n                            /// <signature helpKeyword=\"WinJS.UI.SelectionManager.selectionchanging.setPromise\">\n                            /// <summary locid=\"WinJS.UI.SelectionManager.selectionchanging.setPromise\">\n                            /// Used to inform the ListView that asynchronous work is being performed, and that this\n                            /// event handler should not be considered complete until the promise completes.\n                            /// </summary>\n                            /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.UI.SelectionManager.selectionchanging.setPromise_p:promise\">\n                            /// The promise to wait for.\n                            /// </param>\n                            /// </signature>\n\n                            newSelectionUpdated = promise;\n                        }\n                    });\n\n                    var approved = this._listView._element.dispatchEvent(eventObject);\n                    return newSelectionUpdated.then(function () {\n                        return approved;\n                    });\n                },\n\n                _fireSelectionChanged: function () {\n                    var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                    eventObject.initCustomEvent(\"selectionchanged\", true, false, null);\n                    this._listView._element.dispatchEvent(eventObject);\n                },\n\n                _getFocused: function () {\n                    return { type: this._focused.type, index: this._focused.index };\n                },\n\n                _setFocused: function (entity, keyboardFocused) {\n                    this._focused = { type: entity.type, index: entity.index };\n                    this._focusedByKeyboard = keyboardFocused;\n                },\n\n                _keyboardFocused: function () {\n                    return this._focusedByKeyboard;\n                },\n\n                _updateCount: function (count) {\n                    this._selected._itemsCount = count;\n                },\n\n                _isIncluded: function (index) {\n                    return this._selected._isIncluded(index);\n                },\n\n                _cloneSelection: function () {\n                    var newSelection = new exports._Selection(this._listView);\n                    newSelection._ranges = this._selected.getRanges();\n                    newSelection._itemsCount = this._selected._itemsCount;\n                    newSelection._retainRanges();\n                    return newSelection;\n                }\n            };\n            _SelectionManager.supportedForProcessing = false;\n            return _SelectionManager;\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_BrowseMode',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Animations',\n    '../../Promise',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_UI',\n    '../ItemContainer/_Constants',\n    '../ItemContainer/_ItemEventsHandler',\n    './_SelectionManager'\n    ], function browseModeInit(exports, _Global, _Base, _BaseUtils, Animations, Promise, _ElementUtilities, _UI, _Constants, _ItemEventsHandler, _SelectionManager) {\n    \"use strict\";\n\n    var transformName = _BaseUtils._browserStyleEquivalents[\"transform\"].scriptName;\n    // This component is responsible for handling input in Browse Mode.\n    // When the user clicks on an item in this mode itemInvoked event is fired.\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n\n        _SelectionMode: _Base.Namespace._lazy(function () {\n\n            function clampToRange(first, last, x) {\n                return Math.max(first, Math.min(last, x));\n            }\n\n            function dispatchKeyboardNavigating(element, oldEntity, newEntity) {\n                var navigationEvent = _Global.document.createEvent(\"CustomEvent\");\n                navigationEvent.initCustomEvent(\"keyboardnavigating\", true, true, {\n                    oldFocus: oldEntity.index,\n                    oldFocusType: oldEntity.type,\n                    newFocus: newEntity.index,\n                    newFocusType: newEntity.type\n                });\n                return element.dispatchEvent(navigationEvent);\n            }\n\n            var _SelectionMode = _Base.Class.define(function _SelectionMode_ctor(modeSite) {\n                this.inboundFocusHandled = false;\n                this._pressedContainer = null;\n                this._pressedItemBox = null;\n                this._pressedHeader = null;\n                this._pressedEntity = { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };\n                this._pressedPosition = null;\n\n                this.initialize(modeSite);\n            },{\n                _dispose: function () {\n                    if (this._itemEventsHandler) {\n                        this._itemEventsHandler.dispose();\n                    }\n                    if (this._setNewFocusItemOffsetPromise) {\n                        this._setNewFocusItemOffsetPromise.cancel();\n                    }\n                },\n\n                initialize: function (modeSite) {\n                    this.site = modeSite;\n\n                    this._keyboardNavigationHandlers = {};\n                    this._keyboardAcceleratorHandlers = {};\n\n                    var site = this.site,\n                        that = this;\n                    this._itemEventsHandler = new _ItemEventsHandler._ItemEventsHandler(Object.create({\n                        containerFromElement: function (element) {\n                            return site._view.items.containerFrom(element);\n                        },\n                        indexForItemElement: function (element) {\n                            return site._view.items.index(element);\n                        },\n                        indexForHeaderElement: function (element) {\n                            return site._groups.index(element);\n                        },\n                        itemBoxAtIndex: function (index) {\n                            return site._view.items.itemBoxAt(index);\n                        },\n                        itemAtIndex: function (index) {\n                            return site._view.items.itemAt(index);\n                        },\n                        headerAtIndex: function (index) {\n                            return site._groups.group(index).header;\n                        },\n                        headerFromElement: function (element) {\n                            return site._groups.headerFrom(element);\n                        },\n                        containerAtIndex: function (index) {\n                            return site._view.items.containerAt(index);\n                        },\n                        isZombie: function () {\n                            return site._isZombie();\n                        },\n                        getItemPosition: function (entity) {\n                            return site._getItemPosition(entity);\n                        },\n                        rtl: function () {\n                            return site._rtl();\n                        },\n                        fireInvokeEvent: function (entity, itemElement) {\n                            return that._fireInvokeEvent(entity, itemElement);\n                        },\n                        verifySelectionAllowed: function (index) {\n                            return that._verifySelectionAllowed(index);\n                        },\n                        changeFocus: function (newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused) {\n                            return site._changeFocus(newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused);\n                        },\n                        selectRange: function (firstIndex, lastIndex, additive) {\n                            return that._selectRange(firstIndex, lastIndex, additive);\n                        },\n                        isInSelectionMode: function () {\n                            return site._isInSelectionMode();\n                        }\n                    }, {\n                        pressedEntity: {\n                            enumerable: true,\n                            get: function () {\n                                return that._pressedEntity;\n                            },\n                            set: function (value) {\n                                that._pressedEntity = value;\n                            }\n                        },\n                        pressedContainerScaleTransform: {\n                            enumerable: true,\n                            get: function () {\n                                return that._pressedContainerScaleTransform;\n                            },\n                            set: function (value) {\n                                that._pressedContainerScaleTransform = value;\n                            }\n                        },\n                        pressedContainer: {\n                            enumerable: true,\n                            get: function () {\n                                return that._pressedContainer;\n                            },\n                            set: function (value) {\n                                that._pressedContainer = value;\n                            }\n                        },\n\n                        pressedItemBox: {\n                            enumerable: true,\n                            get: function () {\n                                return that._pressedItemBox;\n                            },\n                            set: function (value) {\n                                that._pressedItemBox = value;\n                            }\n                        },\n\n                        pressedHeader: {\n                            enumerable: true,\n                            get: function () {\n                                return that._pressedHeader;\n                            },\n                            set: function (value) {\n                                return that._pressedHeader = value;\n                            }\n                        },\n\n                        pressedPosition: {\n                            enumerable: true,\n                            get: function () {\n                                return that._pressedPosition;\n                            },\n                            set: function (value) {\n                                that._pressedPosition = value;\n                            }\n                        },\n\n                        pressedElement: {\n                            enumerable: true,\n                            set: function (value) {\n                                that._pressedElement = value;\n                            }\n                        },\n                        eventHandlerRoot: {\n                            enumerable: true,\n                            get: function () {\n                                return site._viewport;\n                            }\n                        },\n                        selectionMode: {\n                            enumerable: true,\n                            get: function () {\n                                return site._selectionMode;\n                            }\n                        },\n                        accessibleItemClass: {\n                            enumerable: true,\n                            get: function () {\n                                // CSS class of the element with the aria role\n                                return _Constants._itemClass;\n                            }\n                        },\n                        canvasProxy: {\n                            enumerable: true,\n                            get: function () {\n                                return site._canvasProxy;\n                            }\n                        },\n                        tapBehavior: {\n                            enumerable: true,\n                            get: function () {\n                                return site._tap;\n                            }\n                        },\n                        headerTapBehavior: {\n                            enumerable: true,\n                            get: function () {\n                                return site._groupHeaderTap;\n                            }\n                        },\n                        draggable: {\n                            enumerable: true,\n                            get: function () {\n                                return site.itemsDraggable || site.itemsReorderable;\n                            }\n                        },\n                        selection: {\n                            enumerable: true,\n                            get: function () {\n                                return site._selection;\n                            }\n                        },\n                        customFootprintParent: {\n                            enumerable: true,\n                            get: function () {\n                                return null;\n                            }\n                        }\n                    }));\n\n                    function createArrowHandler(direction, clampToBounds) {\n                        var handler = function (oldFocus) {\n                            return modeSite._view.getAdjacent(oldFocus, direction);\n                        };\n                        handler.clampToBounds = clampToBounds;\n                        return handler;\n                    }\n\n                    var Key = _ElementUtilities.Key;\n                    this._keyboardNavigationHandlers[Key.upArrow] = createArrowHandler(Key.upArrow);\n                    this._keyboardNavigationHandlers[Key.downArrow] = createArrowHandler(Key.downArrow);\n                    this._keyboardNavigationHandlers[Key.leftArrow] = createArrowHandler(Key.leftArrow);\n                    this._keyboardNavigationHandlers[Key.rightArrow] = createArrowHandler(Key.rightArrow);\n                    this._keyboardNavigationHandlers[Key.pageUp] = createArrowHandler(Key.pageUp, true);\n                    this._keyboardNavigationHandlers[Key.pageDown] = createArrowHandler(Key.pageDown, true);\n                    this._keyboardNavigationHandlers[Key.home] = function (oldFocus) {\n                        if (that.site._header && (oldFocus.type === _UI.ObjectType.groupHeader || oldFocus.type === _UI.ObjectType.footer)) {\n                            return Promise.wrap({ type: _UI.ObjectType.header, index: 0 });\n                        }\n\n\n                        return Promise.wrap({ type: (oldFocus.type !== _UI.ObjectType.footer ? oldFocus.type : _UI.ObjectType.groupHeader), index: 0 });\n                    };\n                    this._keyboardNavigationHandlers[Key.end] = function (oldFocus) {\n                        if (that.site._footer && (oldFocus.type === _UI.ObjectType.groupHeader || oldFocus.type === _UI.ObjectType.header)) {\n                            return Promise.wrap({ type: _UI.ObjectType.footer, index: 0 });\n                        } else if (oldFocus.type === _UI.ObjectType.groupHeader || oldFocus.type === _UI.ObjectType.header) {\n                            return Promise.wrap({ type: _UI.ObjectType.groupHeader, index: site._groups.length() - 1 });\n                        } else {\n                            // Get the index of the last container\n                            var lastIndex = that.site._view.lastItemIndex();\n                            if (lastIndex >= 0) {\n                                return Promise.wrap({ type: oldFocus.type, index: lastIndex });\n                            } else {\n                                return Promise.cancel;\n                            }\n                        }\n                    };\n\n                    this._keyboardAcceleratorHandlers[Key.a] = function () {\n                        if (that.site._multiSelection()) {\n                            that._selectAll();\n                        }\n                    };\n                },\n\n                staticMode: function SelectionMode_staticMode() {\n                    return this.site._tap === _UI.TapBehavior.none && this.site._selectionMode === _UI.SelectionMode.none;\n                },\n\n                itemUnrealized: function SelectionMode_itemUnrealized(index, itemBox) {\n                    if (this._pressedEntity.type === _UI.ObjectType.groupHeader) {\n                        return;\n                    }\n\n                    if (this._pressedEntity.index === index) {\n                        this._resetPointerDownState();\n                    }\n\n                    if (this._itemBeingDragged(index)) {\n                        for (var i = this._draggedItemBoxes.length - 1; i >= 0; i--) {\n                            if (this._draggedItemBoxes[i] === itemBox) {\n                                _ElementUtilities.removeClass(itemBox, _Constants._dragSourceClass);\n                                this._draggedItemBoxes.splice(i, 1);\n                            }\n                        }\n                    }\n                },\n\n                _fireInvokeEvent: function SelectionMode_fireInvokeEvent(entity, itemElement) {\n                    if (!itemElement) {\n                        return;\n                    }\n\n                    var that = this;\n                    function fireInvokeEventImpl(dataSource, isHeader) {\n                        var listBinding = dataSource.createListBinding(),\n                             promise = listBinding.fromIndex(entity.index),\n                             eventName = isHeader ? \"groupheaderinvoked\" : \"iteminvoked\";\n\n                        promise.done(function () {\n                            listBinding.release();\n                        });\n\n                        var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                        eventObject.initCustomEvent(eventName, true, true, isHeader ? {\n                            groupHeaderPromise: promise,\n                            groupHeaderIndex: entity.index\n                        } : {\n                            itemPromise: promise,\n                            itemIndex: entity.index\n                        });\n\n                        // If preventDefault was not called, call the default action on the site\n                        if (itemElement.dispatchEvent(eventObject)) {\n                            that.site._defaultInvoke(entity);\n                        }\n                    }\n\n                    if (entity.type === _UI.ObjectType.groupHeader) {\n                        if (this.site._groupHeaderTap === _UI.GroupHeaderTapBehavior.invoke &&\n                            entity.index !== _Constants._INVALID_INDEX) {\n                            fireInvokeEventImpl(this.site.groupDataSource, true);\n                        }\n                    } else {\n                        // We don't want to raise an iteminvoked event when the ListView's tapBehavior is none, or if it's in selection mode.\n                        if (this.site._tap !== _UI.TapBehavior.none && entity.index !== _Constants._INVALID_INDEX && !(this.site._isInSelectionMode())) {\n                            fireInvokeEventImpl(this.site.itemDataSource, false);\n                        }\n                    }\n                },\n\n                _verifySelectionAllowed: function SelectionMode_verifySelectionAllowed(entity) {\n                    if (entity.type === _UI.ObjectType.groupHeader) {\n                        return {\n                            canSelect: false,\n                            canTapSelect: false\n                        };\n                    }\n\n                    var itemIndex = entity.index;\n                    var site = this.site;\n                    var item = this.site._view.items.itemAt(itemIndex);\n                    if (site._selectionAllowed() && site._selectOnTap() && !(item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass))) {\n                        var selected = site._selection._isIncluded(itemIndex),\n                            single = !site._multiSelection(),\n                            newSelection = site._selection._cloneSelection();\n\n                        if (selected) {\n                            if (single) {\n                                newSelection.clear();\n                            } else {\n                                newSelection.remove(itemIndex);\n                            }\n                        } else {\n                            if (single) {\n                                newSelection.set(itemIndex);\n                            } else {\n                                newSelection.add(itemIndex);\n                            }\n                        }\n\n                        var eventObject = _Global.document.createEvent(\"CustomEvent\"),\n                            newSelectionUpdated = Promise.wrap(),\n                            completed = false,\n                            preventTap = false,\n                            included;\n\n                        eventObject.initCustomEvent(\"selectionchanging\", true, true, {\n                            newSelection: newSelection,\n                            preventTapBehavior: function () {\n                                preventTap = true;\n                            },\n                            setPromise: function (promise) {\n                                /// <signature helpKeyword=\"WinJS.UI.BrowseMode.selectionchanging.setPromise\">\n                                /// <summary locid=\"WinJS.UI.BrowseMode.selectionchanging.setPromise\">\n                                /// Used to inform the ListView that asynchronous work is being performed, and that this\n                                /// event handler should not be considered complete until the promise completes.\n                                /// </summary>\n                                /// <param name=\"promise\" type=\"WinJS.Promise\" locid=\"WinJS.UI.BrowseMode.selectionchanging.setPromise_p:promise\">\n                                /// The promise to wait for.\n                                /// </param>\n                                /// </signature>\n\n                                newSelectionUpdated = promise;\n                            }\n                        });\n\n                        var defaultBehavior = site._element.dispatchEvent(eventObject);\n\n                        newSelectionUpdated.then(function () {\n                            completed = true;\n                            included = newSelection._isIncluded(itemIndex);\n                            newSelection.clear();\n                        });\n\n                        var canSelect = defaultBehavior && completed && (selected || included);\n\n                        return {\n                            canSelect: canSelect,\n                            canTapSelect: canSelect && !preventTap\n                        };\n                    } else {\n                        return {\n                            canSelect: false,\n                            canTapSelect: false\n                        };\n                    }\n                },\n\n                _containedInElementWithClass: function SelectionMode_containedInElementWithClass(element, className) {\n                    if (element.parentNode) {\n                        var matches = element.parentNode.querySelectorAll(\".\" + className + \", .\" + className + \" *\");\n                        for (var i = 0, len = matches.length; i < len; i++) {\n                            if (matches[i] === element) {\n                                return true;\n                            }\n                        }\n                    }\n                    return false;\n                },\n\n                _isDraggable: function SelectionMode_isDraggable(element) {\n                    return (!this._containedInElementWithClass(element, _Constants._nonDraggableClass));\n                },\n\n                _isInteractive: function SelectionMode_isInteractive(element) {\n                    return this._containedInElementWithClass(element, \"win-interactive\");\n                },\n\n                _resetPointerDownState: function SelectionMode_resetPointerDownState() {\n                    this._itemEventsHandler.resetPointerDownState();\n                },\n\n                onPointerDown: function SelectionMode_onPointerDown(eventObject) {\n                    this._itemEventsHandler.onPointerDown(eventObject);\n                },\n\n                onclick: function SelectionMode_onclick(eventObject) {\n                    this._itemEventsHandler.onClick(eventObject);\n                },\n\n                onPointerUp: function SelectionMode_onPointerUp(eventObject) {\n                    this._itemEventsHandler.onPointerUp(eventObject);\n                },\n\n                onPointerCancel: function SelectionMode_onPointerCancel(eventObject) {\n                    this._itemEventsHandler.onPointerCancel(eventObject);\n                },\n\n                onLostPointerCapture: function SelectionMode_onLostPointerCapture(eventObject) {\n                    this._itemEventsHandler.onLostPointerCapture(eventObject);\n                },\n\n                onContextMenu: function SelectionMode_onContextMenu(eventObject) {\n                    this._itemEventsHandler.onContextMenu(eventObject);\n                },\n\n                onMSHoldVisual: function SelectionMode_onMSHoldVisual(eventObject) {\n                    this._itemEventsHandler.onMSHoldVisual(eventObject);\n                },\n\n                onDataChanged: function SelectionMode_onDataChanged(eventObject) {\n                    this._itemEventsHandler.onDataChanged(eventObject);\n                },\n\n                _removeTransform: function SelectionMode_removeTransform(element, transform) {\n                    if (transform && element.style[transformName].indexOf(transform) !== -1) {\n                        element.style[transformName] = element.style[transformName].replace(transform, \"\");\n                    }\n                },\n\n                _selectAll: function SelectionMode_selectAll() {\n                    var unselectableRealizedItems = [];\n                    this.site._view.items.each(function (index, item) {\n                        if (item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass)) {\n                            unselectableRealizedItems.push(index);\n                        }\n                    });\n\n                    this.site._selection.selectAll();\n                    if (unselectableRealizedItems.length > 0) {\n                        this.site._selection.remove(unselectableRealizedItems);\n                    }\n                },\n\n                _selectRange: function SelectionMode_selectRange(firstIndex, lastIndex, additive) {\n                    var ranges = [];\n                    var currentStartRange = -1;\n                    for (var i = firstIndex; i <= lastIndex; i++) {\n                        var item = this.site._view.items.itemAt(i);\n                        if (item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass)) {\n                            if (currentStartRange !== -1) {\n                                ranges.push({\n                                    firstIndex: currentStartRange,\n                                    lastIndex: i - 1\n                                });\n                                currentStartRange = -1;\n                            }\n                        } else if (currentStartRange === -1) {\n                            currentStartRange = i;\n                        }\n                    }\n                    if (currentStartRange !== -1) {\n                        ranges.push({\n                            firstIndex: currentStartRange,\n                            lastIndex: lastIndex\n                        });\n                    }\n                    if (ranges.length > 0) {\n                        this.site._selection[additive ? \"add\" : \"set\"](ranges);\n                    }\n                },\n\n                onDragStart: function SelectionMode_onDragStart(eventObject) {\n                    this._pressedEntity = { type: _UI.ObjectType.item, index: this.site._view.items.index(eventObject.target) };\n                    this.site._selection._pivot = _Constants._INVALID_INDEX;\n                    // Drag shouldn't be initiated when the user holds down the mouse on a win-interactive element and moves.\n                    // The problem is that the dragstart event's srcElement+target will both be an itembox (which has draggable=true), so we can't check for win-interactive in the dragstart event handler.\n                    // The itemEventsHandler sets our _pressedElement field on MSPointerDown, so we use that instead when checking for interactive.\n                    if (this._pressedEntity.index !== _Constants._INVALID_INDEX &&\n                            (this.site.itemsDraggable || this.site.itemsReorderable) &&\n                            !this.site._view.animating &&\n                            this._isDraggable(eventObject.target) &&\n                            (!this._pressedElement || !this._isInteractive(this._pressedElement))) {\n                        this._dragging = true;\n                        this._dragDataTransfer = eventObject.dataTransfer;\n                        this._pressedPosition = _ElementUtilities._getCursorPos(eventObject);\n                        this._dragInfo = null;\n                        this._lastEnteredElement = eventObject.target;\n\n                        if (this.site._selection._isIncluded(this._pressedEntity.index)) {\n                            this._dragInfo = this.site.selection;\n                        } else {\n                            this._draggingUnselectedItem = true;\n                            this._dragInfo = new _SelectionManager._Selection(this.site, [{ firstIndex: this._pressedEntity.index, lastIndex: this._pressedEntity.index }]);\n                        }\n\n                        var dropTarget = this.site.itemsReorderable;\n                        var event = _Global.document.createEvent(\"CustomEvent\");\n                        event.initCustomEvent(\"itemdragstart\", true, false, {\n                            dataTransfer: eventObject.dataTransfer,\n                            dragInfo: this._dragInfo\n                        });\n\n                        // Firefox requires setData to be called on the dataTransfer object in order for DnD to continue.\n                        // Firefox also has an issue rendering the item's itemBox+element, so we need to use setDragImage, using the item's container, to get it to render.\n                        eventObject.dataTransfer.setData(\"text\", \"\");\n                        if (eventObject.dataTransfer.setDragImage) {\n                            var pressedItemData = this.site._view.items.itemDataAt(this._pressedEntity.index);\n                            if (pressedItemData && pressedItemData.container) {\n                                var rect = pressedItemData.container.getBoundingClientRect();\n                                eventObject.dataTransfer.setDragImage(pressedItemData.container, eventObject.clientX - rect.left, eventObject.clientY - rect.top);\n                            }\n                        }\n                        this.site.element.dispatchEvent(event);\n                        if (this.site.itemsDraggable && !this.site.itemsReorderable) {\n                            if (!this._firedDragEnter) {\n                                if (this._fireDragEnterEvent(eventObject.dataTransfer)) {\n                                    dropTarget = true;\n                                    this._dragUnderstood = true;\n                                }\n                            }\n                        }\n\n                        if (dropTarget) {\n                            this._addedDragOverClass = true;\n                            _ElementUtilities.addClass(this.site._element, _Constants._dragOverClass);\n                        }\n\n                        this._draggedItemBoxes = [];\n\n                        var that = this;\n                        // A dragged element can be removed from the DOM by a number of actions - datasource removes/changes, being scrolled outside of the realized range, etc.\n                        // The dragend event is fired on the original source element of the drag. If that element isn't in the DOM, though, the dragend event will only be fired on the element\n                        // itself and not bubble up through the ListView's tree to the _viewport element where all the other drag event handlers are.\n                        // The dragend event handler has to be added to the event's srcElement so that we always receive the event, even when the source element is unrealized.\n                        var sourceElement = eventObject.target;\n                        sourceElement.addEventListener(\"dragend\", function itemDragEnd(eventObject) {\n                            sourceElement.removeEventListener(\"dragend\", itemDragEnd);\n                            that.onDragEnd(eventObject);\n                        });\n                        // We delay setting the opacity of the dragged items so that IE has time to create a thumbnail before me make them invisible\n                        _BaseUtils._yieldForDomModification(function () {\n                            if (that._dragging) {\n                                var indicesSelected = that._dragInfo.getIndices();\n                                for (var i = 0, len = indicesSelected.length; i < len; i++) {\n                                    var itemData = that.site._view.items.itemDataAt(indicesSelected[i]);\n                                    if (itemData && itemData.itemBox) {\n                                        that._addDragSourceClass(itemData.itemBox);\n                                    }\n                                }\n                            }\n                        });\n                    } else {\n                        eventObject.preventDefault();\n                    }\n                },\n\n                onDragEnter: function (eventObject) {\n                    var eventHandled = this._dragUnderstood;\n                    this._lastEnteredElement = eventObject.target;\n                    if (this._exitEventTimer) {\n                        _Global.clearTimeout(this._exitEventTimer);\n                        this._exitEventTimer = 0;\n                    }\n\n                    if (!this._firedDragEnter) {\n                        if (this._fireDragEnterEvent(eventObject.dataTransfer)) {\n                            eventHandled = true;\n                        }\n                    }\n\n                    if (eventHandled || (this._dragging && this.site.itemsReorderable)) {\n                        eventObject.preventDefault();\n                        this._dragUnderstood = true;\n                        if (!this._addedDragOverClass) {\n                            this._addedDragOverClass = true;\n                            _ElementUtilities.addClass(this.site._element, _Constants._dragOverClass);\n                        }\n                    }\n                    this._pointerLeftRegion = false;\n                },\n\n                onDragLeave: function (eventObject) {\n                    if (eventObject.target === this._lastEnteredElement) {\n                        this._pointerLeftRegion = true;\n                        this._handleExitEvent();\n                    }\n                },\n\n                fireDragUpdateEvent: function () {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(\"itemdragchanged\", true, false, {\n                        dataTransfer: this._dragDataTransfer,\n                        dragInfo: this._dragInfo\n                    });\n                    this.site.element.dispatchEvent(event);\n                },\n\n                _fireDragEnterEvent: function (dataTransfer) {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(\"itemdragenter\", true, true, {\n                        dataTransfer: dataTransfer\n                    });\n                    // The end developer must tell a ListView when a drag can be understood by calling preventDefault() on the event we fire\n                    var dropTarget = (!this.site.element.dispatchEvent(event));\n                    this._firedDragEnter = true;\n                    return dropTarget;\n                },\n\n                _fireDragBetweenEvent: function (index, insertAfterIndex, dataTransfer) {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(\"itemdragbetween\", true, true, {\n                        index: index,\n                        insertAfterIndex: insertAfterIndex,\n                        dataTransfer: dataTransfer\n                    });\n                    return this.site.element.dispatchEvent(event);\n                },\n\n                _fireDropEvent: function (index, insertAfterIndex, dataTransfer) {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(\"itemdragdrop\", true, true, {\n                        index: index,\n                        insertAfterIndex: insertAfterIndex,\n                        dataTransfer: dataTransfer\n                    });\n                    return this.site.element.dispatchEvent(event);\n                },\n\n                _handleExitEvent: function () {\n                    if (this._exitEventTimer) {\n                        _Global.clearTimeout(this._exitEventTimer);\n                        this._exitEventTimer = 0;\n                    }\n                    var that = this;\n                    this._exitEventTimer = _Global.setTimeout(function () {\n                        if (that.site._disposed) { return; }\n\n                        if (that._pointerLeftRegion) {\n                            that.site._layout.dragLeave && that.site._layout.dragLeave();\n                            that._pointerLeftRegion = false;\n                            that._dragUnderstood = false;\n                            that._lastEnteredElement = null;\n                            that._lastInsertPoint = null;\n                            that._dragBetweenDisabled = false;\n                            if (that._firedDragEnter) {\n                                var event = _Global.document.createEvent(\"CustomEvent\");\n                                event.initCustomEvent(\"itemdragleave\", true, false, {\n                                });\n                                that.site.element.dispatchEvent(event);\n                                that._firedDragEnter = false;\n                            }\n                            if (that._addedDragOverClass) {\n                                that._addedDragOverClass = false;\n                                _ElementUtilities.removeClass(that.site._element, _Constants._dragOverClass);\n                            }\n                            that._exitEventTimer = 0;\n                            that._stopAutoScroll();\n                        }\n                    }, 40);\n                },\n\n                _getEventPositionInElementSpace: function (element, eventObject) {\n                    var elementRect = { left: 0, top: 0 };\n                    try {\n                        elementRect = element.getBoundingClientRect();\n                    }\n                    catch (err) { }\n\n                    var computedStyle = _Global.getComputedStyle(element, null),\n                        paddingLeft = parseInt(computedStyle[\"paddingLeft\"]),\n                        paddingTop = parseInt(computedStyle[\"paddingTop\"]),\n                        borderLeft = parseInt(computedStyle[\"borderLeftWidth\"]),\n                        borderTop = parseInt(computedStyle[\"borderTopWidth\"]),\n                        clientX = eventObject.clientX,\n                        clientY = eventObject.clientY;\n\n                    var position = {\n                        x: +clientX === clientX ? (clientX - elementRect.left - paddingLeft - borderLeft) : 0,\n                        y: +clientY === clientY ? (clientY - elementRect.top - paddingTop - borderTop) : 0\n                    };\n\n                    if (this.site._rtl()) {\n                        position.x = (elementRect.right - elementRect.left) - position.x;\n                    }\n\n                    return position;\n                },\n\n                _getPositionInCanvasSpace: function (eventObject) {\n                    var scrollLeft = this.site._horizontal() ? this.site.scrollPosition : 0,\n                        scrollTop = this.site._horizontal() ? 0 : this.site.scrollPosition,\n                        position = this._getEventPositionInElementSpace(this.site.element, eventObject);\n\n                    return {\n                        x: position.x + scrollLeft,\n                        y: position.y + scrollTop\n                    };\n                },\n\n                _itemBeingDragged: function (itemIndex) {\n                    if (!this._dragging) {\n                        return false;\n                    }\n\n                    return ((this._draggingUnselectedItem && this._dragInfo._isIncluded(itemIndex)) || (!this._draggingUnselectedItem && this.site._isSelected(itemIndex)));\n                },\n\n                _addDragSourceClass: function (itemBox) {\n                    this._draggedItemBoxes.push(itemBox);\n                    _ElementUtilities.addClass(itemBox, _Constants._dragSourceClass);\n                    if (itemBox.parentNode) {\n                        _ElementUtilities.addClass(itemBox.parentNode, _Constants._footprintClass);\n                    }\n                },\n\n                renderDragSourceOnRealizedItem: function (itemIndex, itemBox) {\n                    if (this._itemBeingDragged(itemIndex)) {\n                        this._addDragSourceClass(itemBox);\n                    }\n                },\n\n                onDragOver: function (eventObject) {\n                    if (!this._dragUnderstood) {\n                        return;\n                    }\n                    this._pointerLeftRegion = false;\n                    eventObject.preventDefault();\n\n                    var cursorPositionInCanvas = this._getPositionInCanvasSpace(eventObject),\n                        cursorPositionInRoot = this._getEventPositionInElementSpace(this.site.element, eventObject);\n                    this._checkAutoScroll(cursorPositionInRoot.x, cursorPositionInRoot.y);\n                    if (this.site._layout.hitTest) {\n                        if (this._autoScrollFrame) {\n                            if (this._lastInsertPoint) {\n                                this.site._layout.dragLeave();\n                                this._lastInsertPoint = null;\n                            }\n                        } else {\n                            var insertPoint = this.site._view.hitTest(cursorPositionInCanvas.x, cursorPositionInCanvas.y);\n                            insertPoint.insertAfterIndex = clampToRange(-1, this.site._cachedCount - 1, insertPoint.insertAfterIndex);\n                            if (!this._lastInsertPoint || this._lastInsertPoint.insertAfterIndex !== insertPoint.insertAfterIndex || this._lastInsertPoint.index !== insertPoint.index) {\n                                this._dragBetweenDisabled = !this._fireDragBetweenEvent(insertPoint.index, insertPoint.insertAfterIndex, eventObject.dataTransfer);\n                                if (!this._dragBetweenDisabled) {\n                                    this.site._layout.dragOver(cursorPositionInCanvas.x, cursorPositionInCanvas.y, this._dragInfo);\n                                } else {\n                                    this.site._layout.dragLeave();\n                                }\n                            }\n                            this._lastInsertPoint = insertPoint;\n                        }\n                    }\n                },\n\n                _clearDragProperties: function () {\n                    if (this._addedDragOverClass) {\n                        this._addedDragOverClass = false;\n                        _ElementUtilities.removeClass(this.site._element, _Constants._dragOverClass);\n                    }\n                    if (this._draggedItemBoxes) {\n                        for (var i = 0, len = this._draggedItemBoxes.length; i < len; i++) {\n                            _ElementUtilities.removeClass(this._draggedItemBoxes[i], _Constants._dragSourceClass);\n                            if (this._draggedItemBoxes[i].parentNode) {\n                                _ElementUtilities.removeClass(this._draggedItemBoxes[i].parentNode, _Constants._footprintClass);\n                            }\n                        }\n                        this._draggedItemBoxes = [];\n                    }\n                    this.site._layout.dragLeave();\n                    this._dragging = false;\n                    this._dragInfo = null;\n                    this._draggingUnselectedItem = false;\n                    this._dragDataTransfer = null;\n                    this._lastInsertPoint = null;\n                    this._resetPointerDownState();\n                    this._lastEnteredElement = null;\n                    this._dragBetweenDisabled = false;\n                    this._firedDragEnter = false;\n                    this._dragUnderstood = false;\n                    this._stopAutoScroll();\n                },\n\n                onDragEnd: function () {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(\"itemdragend\", true, false, {});\n                    this.site.element.dispatchEvent(event);\n                    this._clearDragProperties();\n                },\n\n                _findFirstAvailableInsertPoint: function (selectedItems, startIndex, searchForwards) {\n                    var indicesSelected = selectedItems.getIndices(),\n                        dropIndexInSelection = -1,\n                        count = this.site._cachedCount,\n                        selectionCount = indicesSelected.length,\n                        startIndexInSelection = -1,\n                        dropIndex = startIndex;\n                    for (var i = 0; i < selectionCount; i++) {\n                        if (indicesSelected[i] === dropIndex) {\n                            dropIndexInSelection = i;\n                            startIndexInSelection = i;\n                            break;\n                        }\n                    }\n\n                    while (dropIndexInSelection >= 0 && dropIndex >= 0) {\n                        if (searchForwards) {\n                            dropIndex++;\n                            if (dropIndexInSelection < selectionCount && indicesSelected[dropIndexInSelection + 1] === dropIndex && dropIndex < count) {\n                                dropIndexInSelection++;\n                            } else if (dropIndex >= count) {\n                                // If we hit the end of the list when looking for a new location ahead of our start index, it means everything from the starting point\n                                // to the end is selected, so no valid index can be located to move the items. We need to start searching again, moving backwards\n                                // from the starting location, to find the first available insert location to move the selected items.\n                                searchForwards = false;\n                                dropIndex = startIndex;\n                                dropIndexInSelection = startIndexInSelection;\n                            } else {\n                                dropIndexInSelection = -1;\n                            }\n                        } else {\n                            dropIndex--;\n                            if (dropIndexInSelection > 0 && indicesSelected[dropIndexInSelection - 1] === dropIndex) {\n                                dropIndexInSelection--;\n                            } else {\n                                dropIndexInSelection = -1;\n                            }\n                        }\n                    }\n\n                    return dropIndex;\n                },\n\n                _reorderItems: function (dropIndex, reorderedItems, reorderingUnselectedItem, useMoveBefore, ensureVisibleAtEnd) {\n                    var site = this.site;\n                    var updateSelection = function updatedSelectionOnDrop(items) {\n                        // Update selection if the items were selected. If there is a range with length > 0 a move operation\n                        // on the first or last item removes the range.\n                        if (!reorderingUnselectedItem) {\n                            site._selection.set({ firstKey: items[0].key, lastKey: items[items.length - 1].key });\n                        } else {\n                            site._selection.remove({ key: items[0].key });\n                        }\n                        if (ensureVisibleAtEnd) {\n                            site.ensureVisible(site._selection._getFocused());\n                        }\n                    };\n                    reorderedItems.getItems().then(function (items) {\n                        var ds = site.itemDataSource;\n                        if (dropIndex === -1) {\n                            ds.beginEdits();\n                            for (var i = items.length - 1; i >= 0; i--) {\n                                ds.moveToStart(items[i].key);\n                            }\n                            ds.endEdits();\n                            updateSelection(items);\n                        } else {\n                            var listBinding = ds.createListBinding();\n                            listBinding.fromIndex(dropIndex).then(function (item) {\n                                listBinding.release();\n                                ds.beginEdits();\n                                if (useMoveBefore) {\n                                    for (var i = 0, len = items.length; i < len; i++) {\n                                        ds.moveBefore(items[i].key, item.key);\n                                    }\n                                } else {\n                                    for (var i = items.length - 1; i >= 0; i--) {\n                                        ds.moveAfter(items[i].key, item.key);\n                                    }\n                                }\n                                ds.endEdits();\n                                updateSelection(items);\n                            });\n                        }\n                    });\n                },\n\n                onDrop: function SelectionMode_onDrop(eventObject) {\n                    // If the listview or the handler of the drop event we fire triggers a reorder, the dragged items can end up having different container nodes than what they started with.\n                    // Because of that, we need to remove the footprint class from the item boxes' containers before we do any processing of the drop event.\n                    if (this._draggedItemBoxes) {\n                        for (var i = 0, len = this._draggedItemBoxes.length; i < len; i++) {\n                            if (this._draggedItemBoxes[i].parentNode) {\n                                _ElementUtilities.removeClass(this._draggedItemBoxes[i].parentNode, _Constants._footprintClass);\n                            }\n                        }\n                    }\n                    if (!this._dragBetweenDisabled) {\n                        var cursorPosition = this._getPositionInCanvasSpace(eventObject);\n                        var dropLocation = this.site._view.hitTest(cursorPosition.x, cursorPosition.y),\n                            dropIndex = clampToRange(-1, this.site._cachedCount - 1, dropLocation.insertAfterIndex),\n                            allowDrop = true;\n                        // We don't fire dragBetween events during autoscroll, so if a user drops during autoscroll, we need to get up to date information\n                        // on the drop location, and fire dragBetween before the insert so that the developer can prevent the drop if they choose.\n                        if (!this._lastInsertPoint || this._lastInsertPoint.insertAfterIndex !== dropIndex || this._lastInsertPoint.index !== dropLocation.index) {\n                            allowDrop = this._fireDragBetweenEvent(dropLocation.index, dropIndex, eventObject.dataTransfer);\n                        }\n                        if (allowDrop) {\n                            this._lastInsertPoint = null;\n                            this.site._layout.dragLeave();\n                            if (this._fireDropEvent(dropLocation.index, dropIndex, eventObject.dataTransfer) && this._dragging && this.site.itemsReorderable) {\n                                if (this._dragInfo.isEverything() || this.site._groupsEnabled()) {\n                                    return;\n                                }\n\n                                dropIndex = this._findFirstAvailableInsertPoint(this._dragInfo, dropIndex, false);\n                                this._reorderItems(dropIndex, this._dragInfo, this._draggingUnselectedItem);\n                            }\n                        }\n                    }\n                    this._clearDragProperties();\n                    eventObject.preventDefault();\n                },\n\n                _checkAutoScroll: function (x, y) {\n                    var viewportSize = this.site._getViewportLength(),\n                        horizontal = this.site._horizontal(),\n                        cursorPositionInViewport = (horizontal ? x : y),\n                        canvasSize = this.site._viewport[horizontal ? \"scrollWidth\" : \"scrollHeight\"],\n                        scrollPosition = Math.floor(this.site.scrollPosition),\n                        travelRate = 0;\n\n                    if (cursorPositionInViewport < _Constants._AUTOSCROLL_THRESHOLD) {\n                        travelRate = cursorPositionInViewport - _Constants._AUTOSCROLL_THRESHOLD;\n                    } else if (cursorPositionInViewport > (viewportSize - _Constants._AUTOSCROLL_THRESHOLD)) {\n                        travelRate = (cursorPositionInViewport - (viewportSize - _Constants._AUTOSCROLL_THRESHOLD));\n                    }\n                    travelRate = Math.round((travelRate / _Constants._AUTOSCROLL_THRESHOLD) * (_Constants._MAX_AUTOSCROLL_RATE - _Constants._MIN_AUTOSCROLL_RATE));\n\n                    // If we're at the edge of the content, we don't need to keep scrolling. We'll set travelRate to 0 to stop the autoscroll timer.\n                    if ((scrollPosition === 0 && travelRate < 0) || (scrollPosition >= (canvasSize - viewportSize) && travelRate > 0)) {\n                        travelRate = 0;\n                    }\n                    if (travelRate === 0) {\n                        if (this._autoScrollDelay) {\n                            _Global.clearTimeout(this._autoScrollDelay);\n                            this._autoScrollDelay = 0;\n                        }\n                    } else {\n                        if (!this._autoScrollDelay && !this._autoScrollFrame) {\n                            var that = this;\n                            this._autoScrollDelay = _Global.setTimeout(function () {\n                                if (that._autoScrollRate) {\n                                    that._lastDragTimeout = _BaseUtils._now();\n                                    var nextFrame = function () {\n                                        if ((!that._autoScrollRate && that._autoScrollFrame) || that.site._disposed) {\n                                            that._stopAutoScroll();\n                                        } else {\n                                            // Timeout callbacks aren't reliably timed, so extra math is needed to figure out how far the scroll position should move since the last callback\n                                            var currentTime = _BaseUtils._now();\n                                            var delta = that._autoScrollRate * ((currentTime - that._lastDragTimeout) / 1000);\n                                            delta = (delta < 0 ? Math.min(-1, delta) : Math.max(1, delta));\n                                            var newScrollPos = {};\n                                            newScrollPos[that.site._scrollProperty] = that.site._viewportScrollPosition + delta;\n                                            _ElementUtilities.setScrollPosition(that.site._viewport, newScrollPos);\n                                            that._lastDragTimeout = currentTime;\n                                            that._autoScrollFrame = _BaseUtils._requestAnimationFrame(nextFrame);\n                                        }\n                                    };\n                                    that._autoScrollFrame = _BaseUtils._requestAnimationFrame(nextFrame);\n                                }\n                            }, _Constants._AUTOSCROLL_DELAY);\n                        }\n                    }\n                    this._autoScrollRate = travelRate;\n                },\n\n                _stopAutoScroll: function () {\n                    if (this._autoScrollDelay) {\n                        _Global.clearTimeout(this._autoScrollDelay);\n                        this._autoScrollDelay = 0;\n                    }\n                    this._autoScrollRate = 0;\n                    this._autoScrollFrame = 0;\n                },\n\n                onKeyDown: function SelectionMode_onKeyDown(eventObject) {\n                    var that = this,\n                        site = this.site,\n                        view = site._view,\n                        oldEntity = site._selection._getFocused(),\n                        handled = true,\n                        ctrlKeyDown = eventObject.ctrlKey;\n\n                    function setNewFocus(newEntity, skipSelection, clampToBounds) {\n                        function setNewFocusImpl(maxIndex) {\n                            var moveView = true,\n                                invalidIndex = false;\n                            // Since getKeyboardNavigatedItem is purely geometry oriented, it can return us out of bounds numbers, so this check is necessary\n                            if (clampToBounds) {\n                                newEntity.index = Math.max(0, Math.min(maxIndex, newEntity.index));\n                            } else if (newEntity.index < 0 || newEntity.index > maxIndex) {\n                                invalidIndex = true;\n                            }\n                            if (!invalidIndex && (oldEntity.index !== newEntity.index || oldEntity.type !== newEntity.type)) {\n                                var changeFocus = dispatchKeyboardNavigating(site._element, oldEntity, newEntity);\n                                if (changeFocus) {\n                                    moveView = false;\n\n                                    // If the oldEntity is completely off-screen then we mimic the desktop\n                                    // behavior. This is consistent with navbar keyboarding.\n                                    if (that._setNewFocusItemOffsetPromise) {\n                                        that._setNewFocusItemOffsetPromise.cancel();\n                                    }\n                                    site._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {\n                                        that._setNewFocusItemOffsetPromise = site._getItemOffset(oldEntity, true).then(function (range) {\n                                            range = site._convertFromCanvasCoordinates(range);\n                                            var oldItemOffscreen = range.end <= site.scrollPosition || range.begin >= site.scrollPosition + site._getViewportLength() - 1;\n                                            that._setNewFocusItemOffsetPromise = site._getItemOffset(newEntity).then(function (range) {\n                                                that._setNewFocusItemOffsetPromise = null;\n                                                var retVal = {\n                                                    position: site.scrollPosition,\n                                                    direction: \"right\"\n                                                };\n                                                if (oldItemOffscreen) {\n                                                    // oldEntity is completely off-screen\n                                                    site._selection._setFocused(newEntity, true);\n                                                    range = site._convertFromCanvasCoordinates(range);\n                                                    if (newEntity.index > oldEntity.index) {\n                                                        retVal.direction = \"right\";\n                                                        retVal.position = range.end - site._getViewportLength();\n                                                    } else {\n                                                        retVal.direction = \"left\";\n                                                        retVal.position = range.begin;\n                                                    }\n                                                }\n                                                site._changeFocus(newEntity, skipSelection, ctrlKeyDown, oldItemOffscreen, true);\n                                                if (!oldItemOffscreen) {\n                                                    return Promise.cancel;\n                                                } else {\n                                                    return retVal;\n                                                }\n                                            }, function (error) {\n                                                site._changeFocus(newEntity, skipSelection, ctrlKeyDown, true, true);\n                                                return Promise.wrapError(error);\n                                            });\n                                            return that._setNewFocusItemOffsetPromise;\n                                        }, function (error) {\n                                            site._changeFocus(newEntity, skipSelection, ctrlKeyDown, true, true);\n                                            return Promise.wrapError(error);\n                                        });\n                                        return that._setNewFocusItemOffsetPromise;\n                                    }, true);\n                                }\n                            }\n                            // When a key is pressed, we want to make sure the current focus is in view. If the keypress is changing to a new valid index,\n                            // _changeFocus will handle moving the viewport for us. If the focus isn't moving, though, we need to put the view back on\n                            // the current item ourselves and call setFocused(oldFocus, true) to make sure that the listview knows the focused item was\n                            // focused via keyboard and renders the rectangle appropriately.\n                            if (moveView) {\n                                site._selection._setFocused(oldEntity, true);\n                                site.ensureVisible(oldEntity);\n                            }\n                            if (invalidIndex) {\n                                return { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };\n                            } else {\n                                return newEntity;\n                            }\n                        }\n\n                        // We need to get the final item in the view so that we don't try setting focus out of bounds.\n                        if (newEntity.type === _UI.ObjectType.item) {\n                            return Promise.wrap(view.lastItemIndex()).then(setNewFocusImpl);\n                        } else if (newEntity.type === _UI.ObjectType.groupHeader) {\n                            return Promise.wrap(site._groups.length() - 1).then(setNewFocusImpl);\n                        } else {\n                            return Promise.wrap(0).then(setNewFocusImpl);\n                        }\n                    }\n\n                    var Key = _ElementUtilities.Key,\n                        keyCode = eventObject.keyCode,\n                        rtl = site._rtl();\n\n                    if (!this._isInteractive(eventObject.target)) {\n                        if (eventObject.ctrlKey && !eventObject.altKey && !eventObject.shiftKey && this._keyboardAcceleratorHandlers[keyCode]) {\n                            this._keyboardAcceleratorHandlers[keyCode]();\n                        }\n                        if (site.itemsReorderable && (!eventObject.ctrlKey && eventObject.altKey && eventObject.shiftKey && oldEntity.type === _UI.ObjectType.item) &&\n                            (keyCode === Key.leftArrow || keyCode === Key.rightArrow || keyCode === Key.upArrow || keyCode === Key.downArrow)) {\n                            var selection = site._selection,\n                                focusedIndex = oldEntity.index,\n                                movingUnselectedItem = false,\n                                processReorder = true;\n                            if (!selection.isEverything()) {\n                                if (!selection._isIncluded(focusedIndex)) {\n                                    var item = site._view.items.itemAt(focusedIndex);\n                                    // Selected items should never be marked as non draggable, so we only need to check for nonDraggableClass when trying to reorder an unselected item.\n                                    if (item && _ElementUtilities.hasClass(item, _Constants._nonDraggableClass)) {\n                                        processReorder = false;\n                                    } else {\n                                        movingUnselectedItem = true;\n                                        selection = new _SelectionManager._Selection(this.site, [{ firstIndex: focusedIndex, lastIndex: focusedIndex }]);\n                                    }\n                                }\n                                if (processReorder) {\n                                    var dropIndex = focusedIndex;\n                                    if (keyCode === Key.rightArrow) {\n                                        dropIndex += (rtl ? -1 : 1);\n                                    } else if (keyCode === Key.leftArrow) {\n                                        dropIndex += (rtl ? 1 : -1);\n                                    } else if (keyCode === Key.upArrow) {\n                                        dropIndex--;\n                                    } else {\n                                        dropIndex++;\n                                    }\n                                    // If the dropIndex is larger than the original index, we're trying to move items forward, so the search for the first unselected item to insert after should move forward.\n                                    var movingAhead = (dropIndex > focusedIndex),\n                                        searchForward = movingAhead;\n                                    if (movingAhead && dropIndex >= this.site._cachedCount) {\n                                        // If we're at the end of the list and trying to move items forward, dropIndex should be >= cachedCount.\n                                        // That doesn't mean we don't have to do any reordering, though. A selection could be broken down into\n                                        // a few blocks. We need to make the selection contiguous after this reorder, so we've got to search backwards\n                                        // to find the first unselected item, then move everything in the selection after it.\n                                        searchForward = false;\n                                        dropIndex = this.site._cachedCount - 1;\n                                    }\n                                    dropIndex = this._findFirstAvailableInsertPoint(selection, dropIndex, searchForward);\n                                    dropIndex = Math.min(Math.max(-1, dropIndex), this.site._cachedCount - 1);\n                                    var reportedInsertAfterIndex = dropIndex - (movingAhead || dropIndex === -1 ? 0 : 1),\n                                        reportedIndex = dropIndex,\n                                        groupsEnabled = this.site._groupsEnabled();\n\n                                    if (groupsEnabled) {\n                                        // The indices we picked for the index/insertAfterIndex to report in our events is always correct in an ungrouped list,\n                                        // and mostly correct in a grouped list. The only problem occurs when you move an item (or items) ahead into a new group,\n                                        // or back into a previous group, such that the items should be the first/last in the group. Take this list as an example:\n                                        // [Group A] [a] [b] [c] [Group B] [d] [e]\n                                        // When [d] is focused, right/down arrow reports index: 4, insertAfterIndex: 4, which is right -- it means move [d] after [e].\n                                        // Similarily, when [c] is focused and left/up is pressed, we report index: 1, insertAfterIndex: 0 -- move [c] to after [a].\n                                        // Take note that index does not tell us where focus is / what item is being moved.\n                                        // Like mouse/touch DnD, index tells us what the dragBetween slots would be were we to animate a dragBetween.\n                                        // The problem cases are moving backwards into a previous group, or forward into the next group.\n                                        // If [c] were focused and the user pressed right/down, we would report index: 3, insertAfterIndex: 3. In other words, move [c] after [d].\n                                        // That's not right at all - [c] needs to become the first element of [Group B]. When we're moving ahead, then, and our dropIndex\n                                        // is the first index of a new group, we adjust insertAfterIndex to be dropIndex - 1. Now we'll report index:3, insertAfterIndex: 2, which means\n                                        // [c] is now the first element of [Group B], rather than the last element of [Group A]. This is exactly the same as what we would report when\n                                        // the user mouse/touch drags [c] right before [d].\n                                        // Similarily, when [d] is focused and we press left/up, without the logic below we would report index: 2, insertAfterIndex: 1, so we'd try to move\n                                        // [d] ahead of [b]. Again, [d] first needs the opportunity to become the last element in [Group A], so we adjust the insertAfterIndex up by 1.\n                                        // We then will report index:2, insertAfterIndex:2, meaning insert [d] in [Group A] after [c], which again mimics the mouse/touch API.\n                                        var groups = this.site._groups,\n                                            groupIndex = (dropIndex > -1 ? groups.groupFromItem(dropIndex) : 0);\n                                        if (movingAhead) {\n                                            if (groups.group(groupIndex).startIndex === dropIndex) {\n                                                reportedInsertAfterIndex--;\n                                            }\n                                        } else if (groupIndex < (groups.length() - 1) && dropIndex === (groups.group(groupIndex + 1).startIndex - 1)) {\n                                            reportedInsertAfterIndex++;\n                                        }\n                                    }\n\n                                    if (this._fireDragBetweenEvent(reportedIndex, reportedInsertAfterIndex, null) && this._fireDropEvent(reportedIndex, reportedInsertAfterIndex, null)) {\n                                        if (groupsEnabled) {\n                                            return;\n                                        }\n\n                                        this._reorderItems(dropIndex, selection, movingUnselectedItem, !movingAhead, true);\n                                    }\n                                }\n                            }\n                        } else if (!eventObject.altKey) {\n                            if (this._keyboardNavigationHandlers[keyCode]) {\n                                this._keyboardNavigationHandlers[keyCode](oldEntity).then(function (newEntity) {\n                                    if (newEntity.index !== oldEntity.index || newEntity.type !== oldEntity.type) {\n                                        var clampToBounds = that._keyboardNavigationHandlers[keyCode].clampToBounds;\n                                        if (newEntity.type !== _UI.ObjectType.groupHeader && eventObject.shiftKey && site._selectionAllowed() && site._multiSelection()) {\n                                            // Shift selection should work when shift or shift+ctrl are depressed\n                                            if (site._selection._pivot === _Constants._INVALID_INDEX) {\n                                                site._selection._pivot = oldEntity.index;\n                                            }\n                                            setNewFocus(newEntity, true, clampToBounds).then(function (newEntity) {\n                                                if (newEntity.index !== _Constants._INVALID_INDEX) {\n                                                    var firstIndex = Math.min(newEntity.index, site._selection._pivot),\n                                                        lastIndex = Math.max(newEntity.index, site._selection._pivot),\n                                                        additive = (eventObject.ctrlKey || site._tap === _UI.TapBehavior.toggleSelect);\n                                                    that._selectRange(firstIndex, lastIndex, additive);\n                                                }\n                                            });\n                                        } else {\n                                            site._selection._pivot = _Constants._INVALID_INDEX;\n                                            setNewFocus(newEntity, false, clampToBounds);\n                                        }\n                                    } else {\n                                        handled = false;\n                                    }\n\n                                });\n                            } else if (!eventObject.ctrlKey && keyCode === Key.enter) {\n                                var element = oldEntity.type === _UI.ObjectType.groupHeader ? site._groups.group(oldEntity.index).header : site._view.items.itemBoxAt(oldEntity.index);\n                                if (element) {\n                                    if (oldEntity.type === _UI.ObjectType.groupHeader) {\n                                        this._pressedHeader = element;\n                                        this._pressedItemBox = null;\n                                        this._pressedContainer = null;\n                                    } else {\n                                        this._pressedItemBox = element;\n                                        this._pressedContainer = site._view.items.containerAt(oldEntity.index);\n                                        this._pressedHeader = null;\n                                    }\n\n                                    var allowed = this._verifySelectionAllowed(oldEntity);\n                                    if (allowed.canTapSelect) {\n                                        this._itemEventsHandler.handleTap(oldEntity);\n                                    }\n                                    this._fireInvokeEvent(oldEntity, element);\n                                }\n                            } else if (oldEntity.type !== _UI.ObjectType.groupHeader && ((eventObject.ctrlKey && keyCode === Key.enter) || keyCode === Key.space)) {\n                                this._itemEventsHandler.toggleSelectionIfAllowed(oldEntity.index);\n                                site._changeFocus(oldEntity, true, ctrlKeyDown, false, true);\n                            } else if (keyCode === Key.escape && site._selection.count() > 0) {\n                                site._selection._pivot = _Constants._INVALID_INDEX;\n                                site._selection.clear();\n                            } else {\n                                handled = false;\n                            }\n                        } else {\n                            handled = false;\n                        }\n\n                        this._keyDownHandled = handled;\n                        if (handled) {\n                            eventObject.stopPropagation();\n                            eventObject.preventDefault();\n                        }\n                    }\n\n                    if (keyCode === Key.tab) {\n                        this.site._keyboardFocusInbound = true;\n                    }\n                },\n\n                onKeyUp: function (eventObject) {\n                    if (this._keyDownHandled) {\n                        eventObject.stopPropagation();\n                        eventObject.preventDefault();\n                    }\n                },\n\n                onTabEntered: function (eventObject) {\n                    if (this.site._groups.length() === 0 && !this.site._hasHeaderOrFooter) {\n                        return;\n                    }\n\n                    var site = this.site,\n                        focused = site._selection._getFocused(),\n                        forward = eventObject.detail;\n\n                    // We establish whether focus is incoming on the ListView by checking keyboard focus and the srcElement.\n                    // If the ListView did not have keyboard focus, then it is definitely incoming since keyboard focus is cleared\n                    // on blur which works for 99% of all scenarios. When the ListView is the only tabbable element on the page,\n                    // then tabbing out of the ListView will make focus wrap around and focus the ListView again. The blur event is\n                    // handled after TabEnter, so the keyboard focus flag is not yet cleared. Therefore, we examine the srcElement and see\n                    // if it is the _viewport since it is the first tabbable element in the ListView DOM tree.\n                    var inboundFocus = !site._hasKeyboardFocus || eventObject.target === site._viewport;\n                    if (inboundFocus) {\n                        this.inboundFocusHandled = true;\n\n                        // We tabbed into the ListView\n                        focused.index = (focused.index === _Constants._INVALID_INDEX ? 0 : focused.index);\n                        if (forward || !(this.site._supportsGroupHeaderKeyboarding || this.site._hasHeaderOrFooter)) {\n                            // We tabbed into the ListView from before the ListView, so focus should go to items\n                            var entity = { type: _UI.ObjectType.item };\n                            if (focused.type === _UI.ObjectType.groupHeader) {\n                                entity.index = site._groupFocusCache.getIndexForGroup(focused.index);\n                                if (dispatchKeyboardNavigating(site._element, focused, entity)) {\n                                    site._changeFocus(entity, true, false, false, true);\n                                } else {\n                                    site._changeFocus(focused, true, false, false, true);\n                                }\n                            } else {\n                                entity.index = (focused.type !== _UI.ObjectType.item ? site._groupFocusCache.getLastFocusedItemIndex() : focused.index);\n                                site._changeFocus(entity, true, false, false, true);\n                            }\n                            eventObject.preventDefault();\n                        } else {\n                            // We tabbed into the ListView from after the ListView, focus should go to headers\n                            var entity = { type: _UI.ObjectType.groupHeader };\n                            if (this.site._hasHeaderOrFooter) {\n                                if (this.site._lastFocusedElementInGroupTrack.type === _UI.ObjectType.groupHeader && this.site._supportsGroupHeaderKeyboarding) {\n                                    entity.index = site._groups.groupFromItem(focused.index);\n                                    if (dispatchKeyboardNavigating(site._element, focused, entity)) {\n                                        site._changeFocus(entity, true, false, false, true);\n                                    } else {\n                                        site._changeFocus(focused, true, false, false, true);\n                                    }\n                                } else {\n                                    entity.type = this.site._lastFocusedElementInGroupTrack.type;\n                                    entity.index = 0;\n                                    site._changeFocus(entity, true, false, false, true);\n                                }\n                            } else if (focused.type !== _UI.ObjectType.groupHeader && this.site._supportsGroupHeaderKeyboarding) {\n                                entity.index = site._groups.groupFromItem(focused.index);\n                                if (dispatchKeyboardNavigating(site._element, focused, entity)) {\n                                    site._changeFocus(entity, true, false, false, true);\n                                } else {\n                                    site._changeFocus(focused, true, false, false, true);\n                                }\n                            } else {\n                                entity.index = focused.index;\n                                site._changeFocus(entity, true, false, false, true);\n                            }\n                            eventObject.preventDefault();\n                        }\n                    }\n                },\n\n                onTabExiting: function (eventObject) {\n                    if (!this.site._hasHeaderOrFooter && (!this.site._supportsGroupHeaderKeyboarding || this.site._groups.length() === 0)) {\n                        return;\n                    }\n\n                    var site = this.site,\n                        focused = site._selection._getFocused(),\n                        forward = eventObject.detail;\n\n                    if (forward) {\n                        var entity = null;\n                        if (focused.type === _UI.ObjectType.item) {\n                            // Tabbing and we were focusing an item, go to headers.\n                            // If we last saw focus in the header track on the layout header/footer, we'll move focus back to there first. Otherwise, we'll let the group header take it.\n                            var lastType = this.site._lastFocusedElementInGroupTrack.type;\n                            if (lastType === _UI.ObjectType.header || lastType === _UI.ObjectType.footer || !this.site._supportsGroupHeaderKeyboarding) {\n                                var entity = { type: (lastType === _UI.ObjectType.item ? _UI.ObjectType.header : lastType), index: 0 };\n                            } else {\n                                var entity = { type: _UI.ObjectType.groupHeader, index: site._groups.groupFromItem(focused.index) };\n                            }\n\n                        }\n\n                        if (entity && dispatchKeyboardNavigating(site._element, focused, entity)) {\n                            site._changeFocus(entity, true, false, false, true);\n                            eventObject.preventDefault();\n                        }\n                    } else if (!forward && focused.type !== _UI.ObjectType.item) {\n                        // Shift tabbing and we were focusing a header, go to items\n                        var targetIndex = 0;\n                        if (focused.type === _UI.ObjectType.groupHeader) {\n                            targetIndex = site._groupFocusCache.getIndexForGroup(focused.index);\n                        } else {\n                            targetIndex = (focused.type === _UI.ObjectType.header ? 0 : site._view.lastItemIndex());\n                        }\n                        var entity = { type: _UI.ObjectType.item, index: targetIndex };\n                        if (dispatchKeyboardNavigating(site._element, focused, entity)) {\n                            site._changeFocus(entity, true, false, false, true);\n                            eventObject.preventDefault();\n                        }\n                    }\n                }\n            });\n            return _SelectionMode;\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_ErrorMessages',[\n        'exports',\n        '../../Core/_Base',\n        '../../Core/_Resources'\n    ], function errorMessagesInit(exports, _Base, _Resources) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, null, {\n\n        modeIsInvalid: {\n            get: function () { return \"Invalid argument: mode must be one of following values: 'none', 'single' or 'multi'.\"; }\n        },\n\n        loadingBehaviorIsDeprecated: {\n            get: function () { return \"Invalid configuration: loadingBehavior is deprecated. The control will default this property to 'randomAccess'. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\"; }\n        },\n\n        pagesToLoadIsDeprecated: {\n            get: function () { return \"Invalid configuration: pagesToLoad is deprecated. The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\"; }\n        },\n\n        pagesToLoadThresholdIsDeprecated: {\n            get: function () { return \"Invalid configuration: pagesToLoadThreshold is deprecated.  The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\"; }\n        },\n\n        automaticallyLoadPagesIsDeprecated: {\n            get: function () { return \"Invalid configuration: automaticallyLoadPages is deprecated. The control will default this property to false. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\"; }\n        },\n\n        invalidTemplate: {\n            get: function () { return \"Invalid template: Templates must be created before being passed to the ListView, and must contain a valid tree of elements.\"; }\n        },\n\n        loadMorePagesIsDeprecated: {\n            get: function () { return \"loadMorePages is deprecated. Invoking this function will not have any effect. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\"; }\n        },\n\n        disableBackdropIsDeprecated: {\n            get: function () { return \"Invalid configuration: disableBackdrop is deprecated. Style: .win-listview .win-container.win-backdrop { background-color:transparent; } instead.\"; }\n        },\n\n        backdropColorIsDeprecated: {\n            get: function () { return \"Invalid configuration: backdropColor is deprecated. Style: .win-listview .win-container.win-backdrop { rgba(155,155,155,0.23); } instead.\"; }\n        },\n\n        itemInfoIsDeprecated: {\n            get: function () { return \"GridLayout.itemInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout.\"; }\n        },\n\n        groupInfoIsDeprecated: {\n            get: function () { return \"GridLayout.groupInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout.\"; }\n        },\n\n        resetItemIsDeprecated: {\n            get: function () { return \"resetItem may be altered or unavailable in future versions. Instead, mark the element as disposable using WinJS.Utilities.markDisposable.\"; }\n        },\n\n        resetGroupHeaderIsDeprecated: {\n            get: function () { return \"resetGroupHeader may be altered or unavailable in future versions. Instead, mark the header element as disposable using WinJS.Utilities.markDisposable.\"; }\n        },\n\n        maxRowsIsDeprecated: {\n            get: function () { return \"GridLayout.maxRows may be altered or unavailable in future versions. Instead, use the maximumRowsOrColumns property.\"; }\n        },\n        swipeOrientationDeprecated: {\n            get: function () { return \"Invalid configuration: swipeOrientation is deprecated. The control will default this property to 'none'\"; }\n        },\n        swipeBehaviorDeprecated: {\n            get: function () { return \"Invalid configuration: swipeBehavior is deprecated. The control will default this property to 'none'\"; }\n        }\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_GroupFocusCache',[\n    'exports',\n    '../../Core/_Base'\n    ], function GroupFocusCacheInit(exports, _Base) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _GroupFocusCache: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function GroupFocusCache_ctor(listView) {\n                this._listView = listView;\n                this.clear();\n            }, {\n                // We store indices as strings in the cache so index=0 does not evaluate to false as\n                // when we check for the existance of an index in the cache. The index is converted\n                // back into a number when calling getIndexForGroup\n\n                updateCache: function (groupKey, itemKey, itemIndex) {\n                    this._lastFocusedItemKey = itemKey;\n                    this._lastFocusedItemIndex = itemIndex;\n                    itemIndex = \"\" + itemIndex;\n                    this._itemToIndex[itemKey] = itemIndex;\n                    this._groupToItem[groupKey] = itemKey;\n                },\n\n                deleteItem: function (itemKey) {\n                    if (itemKey === this._lastFocusedItemKey) {\n                        this._lastFocusedItemKey = null;\n                        this._lastFocusedItemIndex = 0;\n                    }\n\n                    if (!this._itemToIndex[itemKey]) {\n                        return;\n                    }\n\n                    var that = this;\n                    var keys = Object.keys(this._groupToItem);\n                    for (var i = 0, len = keys.length; i < len; i++) {\n                        var key = keys[i];\n                        if (that._groupToItem[key] === itemKey) {\n                            that.deleteGroup(key);\n                            break;\n                        }\n                    }\n                },\n\n                deleteGroup: function (groupKey) {\n                    var itemKey = this._groupToItem[groupKey];\n                    if (itemKey) {\n                        delete this._itemToIndex[itemKey];\n                    }\n                    delete this._groupToItem[groupKey];\n                },\n\n                updateItemIndex: function (itemKey, itemIndex) {\n                    if (itemKey === this._lastFocusedItemKey) {\n                        this._lastFocusedItemIndex = itemIndex;\n                    }\n\n                    if (!this._itemToIndex[itemKey]) {\n                        return;\n                    }\n                    this._itemToIndex[itemKey] = \"\" + itemIndex;\n                },\n\n                getIndexForGroup: function (groupIndex) {\n                    var groupKey = this._listView._groups.group(groupIndex).key;\n\n                    var itemKey = this._groupToItem[groupKey];\n                    if (itemKey && this._itemToIndex[itemKey]) {\n                        return +this._itemToIndex[itemKey];\n                    } else {\n                        return this._listView._groups.fromKey(groupKey).group.startIndex;\n                    }\n                },\n\n                clear: function () {\n                    this._groupToItem = {};\n                    this._itemToIndex = {};\n                    this._lastFocusedItemIndex = 0;\n                    this._lastFocusedItemKey = null;\n                },\n\n                getLastFocusedItemIndex: function () {\n                    return this._lastFocusedItemIndex;\n                }\n            });\n        }),\n\n        _UnsupportedGroupFocusCache: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(null, {\n                updateCache: function (groupKey, itemKey, itemIndex) {\n                    this._lastFocusedItemKey = itemKey;\n                    this._lastFocusedItemIndex = itemIndex;\n                },\n\n                deleteItem: function (itemKey) {\n                    if (itemKey === this._lastFocusedItemKey) {\n                        this._lastFocusedItemKey = null;\n                        this._lastFocusedItemIndex = 0;\n                    }\n                },\n\n                deleteGroup: function () {\n                },\n\n                updateItemIndex: function (itemKey, itemIndex) {\n                    if (itemKey === this._lastFocusedItemKey) {\n                        this._lastFocusedItemIndex = itemIndex;\n                    }\n                },\n\n                getIndexForGroup: function () {\n                    return 0;\n                },\n\n                clear: function () {\n                    this._lastFocusedItemIndex = 0;\n                    this._lastFocusedItemKey = null;\n                },\n\n                getLastFocusedItemIndex: function () {\n                    return this._lastFocusedItemIndex;\n                }\n            });\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_GroupsContainer',[\n    'exports',\n    '../../Core/_Base',\n    '../../Promise',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_ItemsManager',\n    '../../Utilities/_UI',\n    '../ItemContainer/_Constants'\n    ], function groupsContainerInit(exports, _Base, Promise, _Dispose, _ElementUtilities, _ItemsManager, _UI, _Constants) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _GroupsContainerBase: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function () {\n            }, {\n                index: function (element) {\n                    var header = this.headerFrom(element);\n                    if (header) {\n                        for (var i = 0, len = this.groups.length; i < len; i++) {\n                            if (header === this.groups[i].header) {\n                                return i;\n                            }\n                        }\n                    }\n                    return _Constants._INVALID_INDEX;\n                },\n\n                headerFrom: function (element) {\n                    while (element && !_ElementUtilities.hasClass(element, _Constants._headerClass)) {\n                        element = element.parentNode;\n                    }\n                    return element;\n                },\n\n                requestHeader: function GroupsContainerBase_requestHeader(index) {\n                    this._waitingHeaderRequests = this._waitingHeaderRequests || {};\n                    if (!this._waitingHeaderRequests[index]) {\n                        this._waitingHeaderRequests[index] = [];\n                    }\n\n                    var that = this;\n                    return new Promise(function (complete) {\n                        var group = that.groups[index];\n                        if (group && group.header) {\n                            complete(group.header);\n                        } else {\n                            that._waitingHeaderRequests[index].push(complete);\n                        }\n                    });\n                },\n\n                notify: function GroupsContainerBase_notify(index, header) {\n                    if (this._waitingHeaderRequests && this._waitingHeaderRequests[index]) {\n                        var requests = this._waitingHeaderRequests[index];\n                        for (var i = 0, len = requests.length; i < len; i++) {\n                            requests[i](header);\n                        }\n\n                        this._waitingHeaderRequests[index] = [];\n                    }\n                },\n\n                groupFromImpl: function GroupsContainerBase_groupFromImpl(fromGroup, toGroup, comp) {\n                    if (toGroup < fromGroup) {\n                        return null;\n                    }\n\n                    var center = fromGroup + Math.floor((toGroup - fromGroup) / 2),\n                        centerGroup = this.groups[center];\n\n                    if (comp(centerGroup, center)) {\n                        return this.groupFromImpl(fromGroup, center - 1, comp);\n                    } else if (center < toGroup && !comp(this.groups[center + 1], center + 1)) {\n                        return this.groupFromImpl(center + 1, toGroup, comp);\n                    } else {\n                        return center;\n                    }\n                },\n\n                groupFrom: function GroupsContainerBase_groupFrom(comp) {\n                    if (this.groups.length > 0) {\n                        var lastGroupIndex = this.groups.length - 1,\n                            lastGroup = this.groups[lastGroupIndex];\n\n                        if (!comp(lastGroup, lastGroupIndex)) {\n                            return lastGroupIndex;\n                        } else {\n                            return this.groupFromImpl(0, this.groups.length - 1, comp);\n                        }\n                    } else {\n                        return null;\n                    }\n                },\n\n                groupFromItem: function GroupsContainerBase_groupFromItem(itemIndex) {\n                    return this.groupFrom(function (group) {\n                        return itemIndex < group.startIndex;\n                    });\n                },\n\n                groupFromOffset: function GroupsContainerBase_groupFromOffset(offset) {\n                    return this.groupFrom(function (group) {\n                        return offset < group.offset;\n                    });\n                },\n\n                group: function GroupsContainerBase_getGroup(index) {\n                    return this.groups[index];\n                },\n\n                length: function GroupsContainerBase_length() {\n                    return this.groups.length;\n                },\n\n                cleanUp: function GroupsContainerBase_cleanUp() {\n                    if (this.listBinding) {\n                        for (var i = 0, len = this.groups.length; i < len; i++) {\n                            var group = this.groups[i];\n                            if (group.userData) {\n                                this.listBinding.releaseItem(group.userData);\n                            }\n                        }\n                        this.listBinding.release();\n                    }\n                },\n\n                _dispose: function GroupsContainerBase_dispose() {\n                    this.cleanUp();\n                },\n\n                synchronizeGroups: function GroupsContainerBase_synchronizeGroups() {\n                    var that = this;\n\n                    this.pendingChanges = [];\n                    this.ignoreChanges = true;\n                    return this.groupDataSource.invalidateAll().then(function () {\n                        return Promise.join(that.pendingChanges);\n                    }).then(function () {\n                        if (that._listView._ifZombieDispose()) {\n                            return Promise.cancel;\n                        }\n                    }).then(\n                        function () {\n                            that.ignoreChanges = false;\n                        },\n                        function (error) {\n                            that.ignoreChanges = false;\n                            return Promise.wrapError(error);\n                        }\n                    );\n                },\n\n                fromKey: function GroupsContainerBase_fromKey(key) {\n                    for (var i = 0, len = this.groups.length; i < len; i++) {\n                        var group = this.groups[i];\n                        if (group.key === key) {\n                            return {\n                                group: group,\n                                index: i\n                            };\n                        }\n                    }\n                    return null;\n                },\n\n                fromHandle: function GroupsContainerBase_fromHandle(handle) {\n                    for (var i = 0, len = this.groups.length; i < len; i++) {\n                        var group = this.groups[i];\n                        if (group.handle === handle) {\n                            return {\n                                group: group,\n                                index: i\n                            };\n                        }\n                    }\n                    return null;\n                }\n            });\n        }),\n\n        _UnvirtualizedGroupsContainer: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports._GroupsContainerBase, function (listView, groupDataSource) {\n                this._listView = listView;\n                this.groupDataSource = groupDataSource;\n                this.groups = [];\n                this.pendingChanges = [];\n                this.dirty = true;\n\n                var that = this,\n                notificationHandler = {\n                    beginNotifications: function GroupsContainer_beginNotifications() {\n                        that._listView._versionManager.beginNotifications();\n                    },\n\n                    endNotifications: function GroupsContainer_endNotifications() {\n                        that._listView._versionManager.endNotifications();\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        if (!that.ignoreChanges && that._listView._groupsChanged) {\n                            that._listView._scheduleUpdate();\n                        }\n                    },\n\n                    indexChanged: function GroupsContainer_indexChanged() {\n                        that._listView._versionManager.receivedNotification();\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        this.scheduleUpdate();\n                    },\n\n                    itemAvailable: function GroupsContainer_itemAvailable() {\n                    },\n\n                    countChanged: function GroupsContainer_countChanged(newCount) {\n                        that._listView._versionManager.receivedNotification();\n\n                        that._listView._writeProfilerMark(\"groupCountChanged(\" + newCount + \"),info\");\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        this.scheduleUpdate();\n                    },\n\n                    changed: function GroupsContainer_changed(newItem) {\n                        that._listView._versionManager.receivedNotification();\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        var groupEntry = that.fromKey(newItem.key);\n                        if (groupEntry) {\n                            that._listView._writeProfilerMark(\"groupChanged(\" + groupEntry.index + \"),info\");\n\n                            groupEntry.group.userData = newItem;\n                            groupEntry.group.startIndex = newItem.firstItemIndexHint;\n                            this.markToRemove(groupEntry.group);\n                        }\n\n                        this.scheduleUpdate();\n                    },\n\n                    removed: function GroupsContainer_removed(itemHandle) {\n                        that._listView._versionManager.receivedNotification();\n                        that._listView._groupRemoved(itemHandle);\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        var groupEntry = that.fromHandle(itemHandle);\n                        if (groupEntry) {\n                            that._listView._writeProfilerMark(\"groupRemoved(\" + groupEntry.index + \"),info\");\n\n                            that.groups.splice(groupEntry.index, 1);\n                            var index = that.groups.indexOf(groupEntry.group, groupEntry.index);\n\n                            if (index > -1) {\n                                that.groups.splice(index, 1);\n                            }\n\n                            this.markToRemove(groupEntry.group);\n                        }\n\n                        this.scheduleUpdate();\n                    },\n\n                    inserted: function GroupsContainer_inserted(itemPromise, previousHandle, nextHandle) {\n                        that._listView._versionManager.receivedNotification();\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        that._listView._writeProfilerMark(\"groupInserted,info\");\n\n                        var notificationHandler = this;\n                        itemPromise.retain().then(function (item) {\n\n                            var index;\n                            if (!previousHandle && !nextHandle && !that.groups.length) {\n                                index = 0;\n                            } else {\n                                index = notificationHandler.findIndex(previousHandle, nextHandle);\n                            }\n                            if (index !== -1) {\n                                var newGroup = {\n                                    key: item.key,\n                                    startIndex: item.firstItemIndexHint,\n                                    userData: item,\n                                    handle: itemPromise.handle\n                                };\n\n                                that.groups.splice(index, 0, newGroup);\n                            }\n                            notificationHandler.scheduleUpdate();\n                        });\n                        that.pendingChanges.push(itemPromise);\n                    },\n\n                    moved: function GroupsContainer_moved(itemPromise, previousHandle, nextHandle) {\n                        that._listView._versionManager.receivedNotification();\n\n                        if (that._listView._ifZombieDispose()) { return; }\n\n                        that._listView._writeProfilerMark(\"groupMoved,info\");\n\n                        var notificationHandler = this;\n                        itemPromise.then(function (item) {\n                            var newIndex = notificationHandler.findIndex(previousHandle, nextHandle),\n                                groupEntry = that.fromKey(item.key);\n\n                            if (groupEntry) {\n                                that.groups.splice(groupEntry.index, 1);\n\n                                if (newIndex !== -1) {\n                                    if (groupEntry.index < newIndex) {\n                                        newIndex--;\n                                    }\n\n                                    groupEntry.group.key = item.key;\n                                    groupEntry.group.userData = item;\n                                    groupEntry.group.startIndex = item.firstItemIndexHint;\n                                    that.groups.splice(newIndex, 0, groupEntry.group);\n                                }\n\n                            } else if (newIndex !== -1) {\n                                var newGroup = {\n                                    key: item.key,\n                                    startIndex: item.firstItemIndexHint,\n                                    userData: item,\n                                    handle: itemPromise.handle\n                                };\n                                that.groups.splice(newIndex, 0, newGroup);\n                                itemPromise.retain();\n                            }\n\n                            notificationHandler.scheduleUpdate();\n                        });\n                        that.pendingChanges.push(itemPromise);\n                    },\n\n                    reload: function GroupsContainer_reload() {\n                        that._listView._versionManager.receivedNotification();\n\n                        if (that._listView._ifZombieDispose()) {\n                            return;\n                        }\n\n                        that._listView._processReload();\n                    },\n\n                    markToRemove: function GroupsContainer_markToRemove(group) {\n                        if (group.header) {\n                            var header = group.header;\n                            group.header = null;\n                            group.left = -1;\n                            group.width = -1;\n                            group.decorator = null;\n                            group.tabIndex = -1;\n                            header.tabIndex = -1;\n\n                            that._listView._groupsToRemove[_ElementUtilities._uniqueID(header)] = { group: group, header: header };\n                        }\n                    },\n\n                    scheduleUpdate: function GroupsContainer_scheduleUpdate() {\n                        that.dirty = true;\n                        if (!that.ignoreChanges) {\n                            that._listView._groupsChanged = true;\n                        }\n                    },\n\n                    findIndex: function GroupsContainer_findIndex(previousHandle, nextHandle) {\n                        var index = -1,\n                            groupEntry;\n\n                        if (previousHandle) {\n                            groupEntry = that.fromHandle(previousHandle);\n                            if (groupEntry) {\n                                index = groupEntry.index + 1;\n                            }\n                        }\n\n                        if (index === -1 && nextHandle) {\n                            groupEntry = that.fromHandle(nextHandle);\n                            if (groupEntry) {\n                                index = groupEntry.index;\n                            }\n                        }\n\n                        return index;\n                    },\n\n                    removeElements: function GroupsContainer_removeElements(group) {\n                        if (group.header) {\n                            var parentNode = group.header.parentNode;\n                            if (parentNode) {\n                                _Dispose.disposeSubTree(group.header);\n                                parentNode.removeChild(group.header);\n                            }\n                            group.header = null;\n                            group.left = -1;\n                            group.width = -1;\n                        }\n                    }\n                };\n\n                this.listBinding = this.groupDataSource.createListBinding(notificationHandler);\n            }, {\n                initialize: function UnvirtualizedGroupsContainer_initialize() {\n                    if (this.initializePromise) {\n                        this.initializePromise.cancel();\n                    }\n\n                    this._listView._writeProfilerMark(\"GroupsContainer_initialize,StartTM\");\n\n                    var that = this;\n                    this.initializePromise = this.groupDataSource.getCount().then(function (count) {\n                        var promises = [];\n                        for (var i = 0; i < count; i++) {\n                            promises.push(that.listBinding.fromIndex(i).retain());\n                        }\n                        return Promise.join(promises);\n                    }).then(\n                        function (groups) {\n                            that.groups = [];\n\n                            for (var i = 0, len = groups.length; i < len; i++) {\n                                var group = groups[i];\n\n                                that.groups.push({\n                                    key: group.key,\n                                    startIndex: group.firstItemIndexHint,\n                                    handle: group.handle,\n                                    userData: group,\n                                });\n                            }\n                            that._listView._writeProfilerMark(\"GroupsContainer_initialize groups(\" + groups.length + \"),info\");\n                            that._listView._writeProfilerMark(\"GroupsContainer_initialize,StopTM\");\n                        },\n                        function (error) {\n                            that._listView._writeProfilerMark(\"GroupsContainer_initialize,StopTM\");\n                            return Promise.wrapError(error);\n                        });\n                    return this.initializePromise;\n                },\n\n                renderGroup: function UnvirtualizedGroupsContainer_renderGroup(index) {\n                    if (this._listView.groupHeaderTemplate) {\n                        var group = this.groups[index];\n                        return Promise.wrap(this._listView._groupHeaderRenderer(Promise.wrap(group.userData))).then(_ItemsManager._normalizeRendererReturn);\n                    } else {\n                        return Promise.wrap(null);\n                    }\n                },\n\n                setDomElement: function UnvirtualizedGroupsContainer_setDomElement(index, headerElement) {\n                    this.groups[index].header = headerElement;\n                    this.notify(index, headerElement);\n                },\n\n                removeElements: function UnvirtualizedGroupsContainer_removeElements() {\n                    var elements = this._listView._groupsToRemove || {},\n                        keys = Object.keys(elements),\n                        focusedItemPurged = false;\n\n                    var focused = this._listView._selection._getFocused();\n                    for (var i = 0, len = keys.length; i < len; i++) {\n                        var group = elements[keys[i]],\n                            header = group.header,\n                            groupData = group.group;\n\n                        if (!focusedItemPurged && focused.type === _UI.ObjectType.groupHeader && groupData.userData.index === focused.index) {\n                            this._listView._unsetFocusOnItem();\n                            focusedItemPurged = true;\n                        }\n\n                        if (header) {\n                            var parentNode = header.parentNode;\n                            if (parentNode) {\n                                _Dispose._disposeElement(header);\n                                parentNode.removeChild(header);\n                            }\n                        }\n                    }\n\n                    if (focusedItemPurged) {\n                        this._listView._setFocusOnItem(focused);\n                    }\n\n                    this._listView._groupsToRemove = {};\n                },\n\n                resetGroups: function UnvirtualizedGroupsContainer_resetGroups() {\n                    var groups = this.groups.slice(0);\n\n                    for (var i = 0, len = groups.length; i < len; i++) {\n                        var group = groups[i];\n\n                        if (this.listBinding && group.userData) {\n                            this.listBinding.releaseItem(group.userData);\n                        }\n                    }\n\n                    // Set the lengths to zero to clear the arrays, rather than setting = [], which re-instantiates\n                    this.groups.length = 0;\n                    this.dirty = true;\n                }\n            });\n        }),\n\n        _NoGroups: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports._GroupsContainerBase, function (listView) {\n                this._listView = listView;\n                this.groups = [{ startIndex: 0 }];\n                this.dirty = true;\n            }, {\n                synchronizeGroups: function () {\n                    return Promise.wrap();\n                },\n\n                addItem: function () {\n                    return Promise.wrap(this.groups[0]);\n                },\n\n                resetGroups: function () {\n                    this.groups = [{ startIndex: 0 }];\n                    delete this.pinnedItem;\n                    delete this.pinnedOffset;\n                    this.dirty = true;\n                },\n\n                renderGroup: function () {\n                    return Promise.wrap(null);\n                },\n\n                ensureFirstGroup: function () {\n                    return Promise.wrap(this.groups[0]);\n                },\n\n                groupOf: function () {\n                    return Promise.wrap(this.groups[0]);\n                },\n\n                removeElements: function () {\n                }\n            });\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_Helpers',[\n    'exports',\n    '../../Core/_Base',\n    '../ItemContainer/_Constants'\n], function helpersInit(exports, _Base, _Constants) {\n    \"use strict\";\n\n    function nodeListToArray(nodeList) {\n        return Array.prototype.slice.call(nodeList);\n    }\n\n    function repeat(strings, count) {\n        // Continously concatenate a string or set of strings\n        // until the specified number of concatenations are made.\n        // e.g.\n        //  repeat(\"a\", 3) ==> \"aaa\"\n        //  repeat([\"a\", \"b\"], 0) ==> \"\"\n        //  repeat([\"a\", \"b\", \"c\"], 2) ==> \"ab\"\n        //  repeat([\"a\", \"b\", \"c\"], 7) ==> \"abcabca\"\n        if (typeof strings === \"string\") {\n            return repeat([strings], count);\n        }\n        var result = new Array(Math.floor(count / strings.length) + 1).join(strings.join(\"\"));\n        result += strings.slice(0, count % strings.length).join(\"\");\n        return result;\n    }\n\n    function stripedContainers(count, nextItemIndex) {\n        var containersMarkup,\n            evenStripe = _Constants._containerEvenClass,\n            oddStripe = _Constants._containerOddClass,\n            stripes = nextItemIndex % 2 === 0 ? [evenStripe, oddStripe] : [oddStripe, evenStripe];\n\n        var pairOfContainers = [\n                \"<div class='win-container \" + stripes[0] + \" win-backdrop'></div>\",\n                \"<div class='win-container \" + stripes[1] + \" win-backdrop'></div>\"\n        ];\n\n        containersMarkup = repeat(pairOfContainers, count);\n        return containersMarkup;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _nodeListToArray: nodeListToArray,\n        _repeat: repeat,\n        _stripedContainers: stripedContainers\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_ItemsContainer',[\n    'exports',\n    '../../Core/_Base',\n    '../../Promise',\n    '../../Utilities/_ElementUtilities',\n    '../ItemContainer/_Constants'\n    ], function itemsContainerInit(exports, _Base, Promise, _ElementUtilities, _Constants) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _ItemsContainer: _Base.Namespace._lazy(function () {\n\n            var _ItemsContainer = function (site) {\n                this.site = site;\n                this._itemData = {};\n                this.waitingItemRequests = {};\n            };\n            _ItemsContainer.prototype = {\n                requestItem: function ItemsContainer_requestItem(itemIndex) {\n                    if (!this.waitingItemRequests[itemIndex]) {\n                        this.waitingItemRequests[itemIndex] = [];\n                    }\n\n                    var that = this;\n                    var promise = new Promise(function (complete) {\n                        var itemData = that._itemData[itemIndex];\n                        if (itemData && !itemData.detached && itemData.element) {\n                            complete(itemData.element);\n                        } else {\n                            that.waitingItemRequests[itemIndex].push(complete);\n                        }\n                    });\n\n                    return promise;\n                },\n\n                removeItem: function (index) {\n                    delete this._itemData[index];\n                },\n\n                removeItems: function ItemsContainer_removeItems() {\n                    this._itemData = {};\n                    this.waitingItemRequests = {};\n                },\n\n                setItemAt: function ItemsContainer_setItemAt(itemIndex, itemData) {\n                    this._itemData[itemIndex] = itemData;\n                    if (!itemData.detached) {\n                        this.notify(itemIndex, itemData);\n                    }\n                },\n\n                notify: function ItemsContainer_notify(itemIndex, itemData) {\n                    if (this.waitingItemRequests[itemIndex]) {\n                        var requests = this.waitingItemRequests[itemIndex];\n                        for (var i = 0; i < requests.length; i++) {\n                            requests[i](itemData.element);\n                        }\n\n                        this.waitingItemRequests[itemIndex] = [];\n                    }\n                },\n\n                elementAvailable: function ItemsContainer_elementAvailable(itemIndex) {\n                    var itemData = this._itemData[itemIndex];\n                    itemData.detached = false;\n                    this.notify(itemIndex, itemData);\n                },\n\n                itemAt: function ItemsContainer_itemAt(itemIndex) {\n                    var itemData = this._itemData[itemIndex];\n                    return itemData ? itemData.element : null;\n                },\n\n                itemDataAt: function ItemsContainer_itemDataAt(itemIndex) {\n                    return this._itemData[itemIndex];\n                },\n\n                containerAt: function ItemsContainer_containerAt(itemIndex) {\n                    var itemData = this._itemData[itemIndex];\n                    return itemData ? itemData.container : null;\n                },\n\n                itemBoxAt: function ItemsContainer_itemBoxAt(itemIndex) {\n                    var itemData = this._itemData[itemIndex];\n                    return itemData ? itemData.itemBox : null;\n                },\n\n                itemBoxFrom: function ItemsContainer_containerFrom(element) {\n                    while (element && !_ElementUtilities.hasClass(element, _Constants._itemBoxClass)) {\n                        element = element.parentNode;\n                    }\n\n                    return element;\n                },\n\n                containerFrom: function ItemsContainer_containerFrom(element) {\n                    while (element && !_ElementUtilities.hasClass(element, _Constants._containerClass)) {\n                        element = element.parentNode;\n                    }\n\n                    return element;\n                },\n\n                index: function ItemsContainer_index(element) {\n                    var item = this.containerFrom(element);\n                    if (item) {\n                        for (var index in this._itemData) {\n                            if (this._itemData[index].container === item) {\n                                return parseInt(index, 10);\n                            }\n                        }\n                    }\n\n                    return _Constants._INVALID_INDEX;\n                },\n\n                each: function ItemsContainer_each(callback) {\n                    for (var index in this._itemData) {\n                        if (this._itemData.hasOwnProperty(index)) {\n                            var itemData = this._itemData[index];\n                            callback(parseInt(index, 10), itemData.element, itemData);\n                        }\n                    }\n                },\n\n                eachIndex: function ItemsContainer_each(callback) {\n                    for (var index in this._itemData) {\n                        if (callback(parseInt(index, 10))) {\n                            break;\n                        }\n                    }\n                },\n\n                count: function ItemsContainer_count() {\n                    return Object.keys(this._itemData).length;\n                }\n            };\n            return _ItemsContainer;\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_Layouts',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Resources',\n    '../../Core/_WriteProfilerMark',\n    '../../Animations/_TransitionAnimation',\n    '../../Promise',\n    '../../Scheduler',\n    '../../_Signal',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_SafeHtml',\n    '../../Utilities/_UI',\n    '../ItemContainer/_Constants',\n    './_ErrorMessages'\n], function layouts2Init(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, _TransitionAnimation, Promise, Scheduler, _Signal, _Dispose, _ElementUtilities, _SafeHtml, _UI, _Constants, _ErrorMessages) {\n    \"use strict\";\n\n    var Key = _ElementUtilities.Key,\n        uniqueID = _ElementUtilities._uniqueID;\n\n    var strings = {\n        get itemInfoIsInvalid() { return \"Invalid argument: An itemInfo function must be provided which returns an object with numeric width and height properties.\"; },\n        get groupInfoResultIsInvalid() { return \"Invalid result: groupInfo result for cell spanning groups must include the following numeric properties: cellWidth and cellHeight.\"; }\n    };\n\n    //\n    // Helpers for dynamic CSS rules\n    //\n    // Rule deletions are delayed until the next rule insertion. This helps the\n    // scenario where a ListView changes layouts. By doing the rule manipulations\n    // in a single synchronous block, IE will do 1 layout pass instead of 2.\n    //\n\n    // Dynamic CSS rules will be added to this style element\n    var layoutStyleElem = _Global.document.createElement(\"style\");\n    _Global.document.head.appendChild(layoutStyleElem);\n\n    var nextCssClassId = 0,\n        staleClassNames = [];\n\n    // The prefix for the class name should not contain dashes\n    function uniqueCssClassName(prefix) {\n        return \"_win-dynamic-\" + prefix + \"-\" + (nextCssClassId++);\n    }\n\n    var browserStyleEquivalents = _BaseUtils._browserStyleEquivalents;\n    var transformNames = browserStyleEquivalents[\"transform\"];\n    var transitionScriptName = _BaseUtils._browserStyleEquivalents[\"transition\"].scriptName;\n    var dragBetweenTransition = transformNames.cssName + \" cubic-bezier(0.1, 0.9, 0.2, 1) 167ms\";\n    var dragBetweenDistance = 12;\n\n    // Removes the dynamic CSS rules corresponding to the classes in staleClassNames\n    // from the DOM.\n    function flushDynamicCssRules() {\n        var rules = layoutStyleElem.sheet.cssRules,\n            classCount = staleClassNames.length,\n            i,\n            j,\n            ruleSuffix;\n\n        for (i = 0; i < classCount; i++) {\n            ruleSuffix = \".\" + staleClassNames[i] + \" \";\n            for (j = rules.length - 1; j >= 0; j--) {\n                if (rules[j].selectorText.indexOf(ruleSuffix) !== -1) {\n                    layoutStyleElem.sheet.deleteRule(j);\n                }\n            }\n        }\n        staleClassNames = [];\n    }\n\n    // Creates a dynamic CSS rule and adds it to the DOM. uniqueToken is a class name\n    // which uniquely identifies a set of related rules. These rules may be removed\n    // using deleteDynamicCssRule. uniqueToken should be created using uniqueCssClassName.\n    function addDynamicCssRule(uniqueToken, site, selector, body) {\n        flushDynamicCssRules();\n        var rule = \".\" + _Constants._listViewClass + \" .\" + uniqueToken + \" \" + selector + \" { \" +\n             body +\n        \"}\";\n        var perfId = \"_addDynamicCssRule:\" + uniqueToken + \",info\";\n        if (site) {\n            site._writeProfilerMark(perfId);\n        } else {\n            _WriteProfilerMark(\"WinJS.UI.ListView:Layout\" + perfId);\n        }\n        layoutStyleElem.sheet.insertRule(rule, 0);\n    }\n\n    // Marks the CSS rules corresponding to uniqueToken for deletion. The rules\n    // should have been added by addDynamicCssRule.\n    function deleteDynamicCssRule(uniqueToken) {\n        staleClassNames.push(uniqueToken);\n    }\n\n    //\n    // Helpers shared by all layouts\n    //\n\n    // Clamps x to the range first <= x <= last\n    function clampToRange(first, last, x) {\n        return Math.max(first, Math.min(last, x));\n    }\n\n    function getDimension(element, property) {\n        return _ElementUtilities.convertToPixels(element, _Global.getComputedStyle(element, null)[property]);\n    }\n\n    // Returns the sum of the margin, border, and padding for the side of the\n    // element specified by side. side can be \"Left\", \"Right\", \"Top\", or \"Bottom\".\n    function getOuter(side, element) {\n        return getDimension(element, \"margin\" + side) +\n            getDimension(element, \"border\" + side + \"Width\") +\n            getDimension(element, \"padding\" + side);\n    }\n\n    // Returns the total height of element excluding its content height\n    function getOuterHeight(element) {\n        return getOuter(\"Top\", element) + getOuter(\"Bottom\", element);\n    }\n\n    // Returns the total width of element excluding its content width\n    function getOuterWidth(element) {\n        return getOuter(\"Left\", element) + getOuter(\"Right\", element);\n    }\n\n    function forEachContainer(itemsContainer, callback) {\n        if (itemsContainer.items) {\n            for (var i = 0, len = itemsContainer.items.length; i < len; i++) {\n                callback(itemsContainer.items[i], i);\n            }\n        } else {\n            for (var b = 0, index = 0; b < itemsContainer.itemsBlocks.length; b++) {\n                var block = itemsContainer.itemsBlocks[b];\n                for (var i = 0, len = block.items.length; i < len; i++) {\n                    callback(block.items[i], index++);\n                }\n            }\n        }\n    }\n\n    function containerFromIndex(itemsContainer, index) {\n        if (index < 0) {\n            return null;\n        }\n        if (itemsContainer.items) {\n            return (index < itemsContainer.items.length ? itemsContainer.items[index] : null);\n        } else {\n            var blockSize = itemsContainer.itemsBlocks[0].items.length,\n                blockIndex = Math.floor(index / blockSize),\n                offset = index % blockSize;\n            return (blockIndex < itemsContainer.itemsBlocks.length && offset < itemsContainer.itemsBlocks[blockIndex].items.length ? itemsContainer.itemsBlocks[blockIndex].items[offset] : null);\n        }\n    }\n\n    function getItemsContainerTree(itemsContainer, tree) {\n        var itemsContainerTree;\n        for (var i = 0, treeLength = tree.length; i < treeLength; i++) {\n            if (tree[i].itemsContainer.element === itemsContainer) {\n                itemsContainerTree = tree[i].itemsContainer;\n                break;\n            }\n        }\n        return itemsContainerTree;\n    }\n\n    function getItemsContainerLength(itemsContainer) {\n        var blocksCount,\n            itemsCount;\n        if (itemsContainer.itemsBlocks) {\n            blocksCount = itemsContainer.itemsBlocks.length;\n            if (blocksCount > 0) {\n                itemsCount = (itemsContainer.itemsBlocks[0].items.length * (blocksCount - 1)) + itemsContainer.itemsBlocks[blocksCount - 1].items.length;\n            } else {\n                itemsCount = 0;\n            }\n        } else {\n            itemsCount = itemsContainer.items.length;\n        }\n        return itemsCount;\n    }\n\n    var environmentDetails = null;\n    // getEnvironmentSupportInformation does one-time checks on several browser-specific environment details (both to check the existence of styles,\n    // and also to see if some environments have layout bugs the ListView needs to work around).\n    function getEnvironmentSupportInformation(site) {\n        if (!environmentDetails) {\n            var surface = _Global.document.createElement(\"div\");\n            surface.style.width = \"500px\";\n            surface.style.visibility = \"hidden\";\n\n            // Set up the DOM\n            var flexRoot = _Global.document.createElement(\"div\");\n            flexRoot.style.cssText += \"width: 500px; height: 200px; display: -webkit-flex; display: flex\";\n            _SafeHtml.setInnerHTMLUnsafe(flexRoot,\n                \"<div style='height: 100%; display: -webkit-flex; display: flex; flex-flow: column wrap; align-content: flex-start; -webkit-flex-flow: column wrap; -webkit-align-content: flex-start'>\" +\n                    \"<div style='width: 100px; height: 100px'></div>\" +\n                    \"<div style='width: 100px; height: 100px'></div>\" +\n                    \"<div style='width: 100px; height: 100px'></div>\" +\n                \"</div>\");\n            surface.appendChild(flexRoot);\n\n            // Read from the DOM and detect the bugs\n            site.viewport.insertBefore(surface, site.viewport.firstChild);\n            var canMeasure = surface.offsetWidth > 0,\n                expectedWidth = 200;\n            if (canMeasure) {\n                // If we can't measure now (e.g. ListView is display:none), leave environmentDetails as null\n                // so that we do the detection later when the app calls recalculateItemPosition/forceLayout.\n\n                environmentDetails = {\n                    supportsCSSGrid: !!(\"-ms-grid-row\" in _Global.document.documentElement.style),\n                    // Detects Chrome flex issue 345433: Incorrect sizing for nested flexboxes\n                    // https://code.google.com/p/chromium/issues/detail?id=345433\n                    // With nested flexboxes, the inner flexbox's width is proportional to the number of elements intead\n                    // of the number of columns.\n                    nestedFlexTooLarge: flexRoot.firstElementChild.offsetWidth > expectedWidth,\n\n                    // Detects Firefox issue 995020\n                    // https://bugzilla.mozilla.org/show_bug.cgi?id=995020\n                    // The three squares we're adding to the nested flexbox should increase the size of the nestedFlex to be 200 pixels wide. This is the case in IE but\n                    // currently not in Firefox. In Firefox, the third square will move to the next column, but the container's width won't update for it.\n                    nestedFlexTooSmall: flexRoot.firstElementChild.offsetWidth < expectedWidth\n                };\n            }\n\n            // Signal ListView's own measurement operation.\n            // ListView always needs an opportunity to measure, even if layout cannot.\n            site.readyToMeasure();\n\n            // Clean up the DOM\n            site.viewport.removeChild(surface);\n        }\n\n        return environmentDetails;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        Layout: _Base.Class.define(function Layout_ctor() {\n            /// <signature helpKeyword=\"WinJS.UI.Layout\">\n            /// <summary locid=\"WinJS.UI.Layout.constructor\">\n            /// Creates a new Layout object.\n            /// </summary>\n            /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.Layout.constructor_p:options\">\n            /// The set of options to be applied initially to the new Layout object.\n            /// </param>\n            /// <returns type=\"WinJS.UI.Layout\" locid=\"WinJS.UI.Layout.constructor_returnValue\">\n            /// The new Layout object.\n            /// </returns>\n            /// </signature>\n        }),\n\n        _LayoutCommon: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports.Layout, null, {\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.HeaderPosition\" locid=\"WinJS.UI._LayoutCommon.groupHeaderPosition\" helpKeyword=\"WinJS.UI._LayoutCommon.groupHeaderPosition\">\n                /// Gets or sets the position of group headers relative to their items.\n                /// The default value is \"top\".\n                /// </field>\n                groupHeaderPosition: {\n                    enumerable: true,\n                    get: function () {\n                        return this._groupHeaderPosition;\n                    },\n                    set: function (position) {\n                        this._groupHeaderPosition = position;\n                        this._invalidateLayout();\n                    }\n                },\n\n                // Implementation of part of ILayout interface\n\n                initialize: function _LayoutCommon_initialize(site, groupsEnabled) {\n                    site._writeProfilerMark(\"Layout:initialize,info\");\n                    if (!this._inListMode) {\n                        _ElementUtilities.addClass(site.surface, _Constants._gridLayoutClass);\n                    }\n\n                    if (this._backdropColorClassName) {\n                        _ElementUtilities.addClass(site.surface, this._backdropColorClassName);\n                    }\n                    if (this._disableBackdropClassName) {\n                        _ElementUtilities.addClass(site.surface, this._disableBackdropClassName);\n                    }\n                    this._groups = [];\n                    this._groupMap = {};\n                    this._oldGroupHeaderPosition = null;\n                    this._usingStructuralNodes = false;\n\n                    this._site = site;\n                    this._groupsEnabled = groupsEnabled;\n                    this._resetAnimationCaches(true);\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Orientation\" locid=\"WinJS.UI._LayoutCommon.orientation\" helpKeyword=\"WinJS.UI._LayoutCommon.orientation\">\n                /// Gets or sets the orientation for the layout.\n                /// The default value is \"horizontal\".\n                /// </field>\n                orientation: {\n                    enumerable: true,\n                    get: function () {\n                        return this._orientation;\n                    },\n                    set: function (orientation) {\n                        this._orientation = orientation;\n                        this._horizontal = (orientation === \"horizontal\");\n                        this._invalidateLayout();\n                    }\n                },\n\n                uninitialize: function _LayoutCommon_uninitialize() {\n                    var perfId = \"Layout:uninitialize,info\";\n                    function cleanGroups(groups) {\n                        var len = groups.length,\n                            i;\n                        for (i = 0; i < len; i++) {\n                            groups[i].cleanUp(true);\n                        }\n                    }\n\n                    this._elementsToMeasure = {};\n\n                    if (this._site) {\n                        this._site._writeProfilerMark(perfId);\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._gridLayoutClass);\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionTopClass);\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionLeftClass);\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._structuralNodesClass);\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._singleItemsBlockClass);\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._noCSSGrid);\n                        this._site.surface.style.cssText = \"\";\n                        if (this._groups) {\n                            cleanGroups(this._groups);\n                            this._groups = null;\n                            this._groupMap = null;\n                        }\n                        if (this._layoutPromise) {\n                            this._layoutPromise.cancel();\n                            this._layoutPromise = null;\n                        }\n                        this._resetMeasurements();\n                        this._oldGroupHeaderPosition = null;\n                        this._usingStructuralNodes = false;\n                        this._envInfo = null;\n                        // The properties given to us by the app (_groupInfo, _itemInfo,\n                        // _groupHeaderPosition) are not cleaned up so that the values are\n                        // remembered if the layout is reused.\n\n                        if (this._backdropColorClassName) {\n                            _ElementUtilities.removeClass(this._site.surface, this._backdropColorClassName);\n                            deleteDynamicCssRule(this._backdropColorClassName);\n                            this._backdropColorClassName = null;\n                        }\n                        if (this._disableBackdropClassName) {\n                            _ElementUtilities.removeClass(this._site.surface, this._disableBackdropClassName);\n                            deleteDynamicCssRule(this._disableBackdropClassName);\n                            this._disableBackdropClassName = null;\n                        }\n\n                        this._site = null;\n                        this._groupsEnabled = null;\n                        if (this._animationsRunning) {\n                            this._animationsRunning.cancel();\n                        }\n                        this._animatingItemsBlocks = {};\n                    } else {\n                        _WriteProfilerMark(\"WinJS.UI.ListView:\" + perfId);\n                    }\n                },\n\n                numberOfItemsPerItemsBlock: {\n                    get: function _LayoutCommon_getNumberOfItemsPerItemsBlock() {\n                        function allGroupsAreUniform() {\n                            var groupCount = that._site.groupCount,\n                                i;\n\n                            for (i = 0; i < groupCount; i++) {\n                                if (that._isCellSpanning(i)) {\n                                    return false;\n                                }\n                            }\n\n                            return true;\n                        }\n\n                        var that = this;\n                        return that._measureItem(0).then(function () {\n                            if (that._sizes.viewportContentSize !== that._getViewportCrossSize()) {\n                                that._viewportSizeChanged(that._getViewportCrossSize());\n                            }\n\n                            if (!allGroupsAreUniform()) {\n                                that._usingStructuralNodes = false;\n                                return null;\n                            } else if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {\n                                // Store all items in a single itemsblock\n                                that._usingStructuralNodes = true;\n                                return Number.MAX_VALUE;\n                            } else {\n                                that._usingStructuralNodes = exports._LayoutCommon._barsPerItemsBlock > 0;\n                                return exports._LayoutCommon._barsPerItemsBlock * that._itemsPerBar;\n                            }\n                        });\n                    }\n                },\n\n                layout: function _LayoutCommon_layout(tree, changedRange, modifiedItems, modifiedGroups) {\n                    // changedRange implies that the minimum amount of work the layout needs to do is as follows:\n                    // - It needs to lay out group shells (header containers and items containers) from\n                    //   firstChangedGroup thru lastGroup.\n                    // - It needs to ask firstChangedGroup thru lastChangedGroup to lay out their\n                    //   contents (i.e. win-containers).\n                    // - For each group included in the changedRange, it needs to lay out its\n                    //   contents (i.e. win-containers) from firstChangedItem thru lastItem.\n\n                    var that = this;\n                    var site = that._site,\n                        layoutPerfId = \"Layout.layout\",\n                        realizedRangePerfId = layoutPerfId + \":realizedRange\",\n                        realizedRangePromise;\n\n                    that._site._writeProfilerMark(layoutPerfId + \",StartTM\");\n                    that._site._writeProfilerMark(realizedRangePerfId + \",StartTM\");\n\n                    // Receives an items container's tree and returns a normalized copy.\n                    // This allows us to hold on to a snapshot of the tree without\n                    // worrying that items may have been unexpectedly inserted/\n                    // removed/moved. The returned tree always appears as though\n                    // structural nodes are disabled.\n                    function copyItemsContainerTree(itemsContainer) {\n                        function copyItems(itemsContainer) {\n                            if (that._usingStructuralNodes) {\n                                var items = [];\n                                itemsContainer.itemsBlocks.forEach(function (itemsBlock) {\n                                    items = items.concat(itemsBlock.items.slice(0));\n                                });\n                                return items;\n                            } else {\n                                return itemsContainer.items.slice(0);\n                            }\n                        }\n\n                        return {\n                            element: itemsContainer.element,\n                            items: copyItems(itemsContainer)\n                        };\n                    }\n\n                    // Updates the GridLayout's internal state to reflect the current tree.\n                    // Similarly tells each group to update its internal state via prepareLayout.\n                    // After this function runs, the ILayout functions will return results that\n                    // are appropriate for the current tree.\n                    function updateGroups() {\n                        function createGroup(groupInfo, itemsContainer) {\n                            var GroupType = (groupInfo.enableCellSpanning ?\n                                Groups.CellSpanningGroup :\n                                Groups.UniformGroup);\n                            return new GroupType(that, itemsContainer);\n                        }\n\n                        var oldRealizedItemRange = (that._groups.length > 0 ?\n                                that._getRealizationRange() :\n                                null),\n                            newGroups = [],\n                            prepared = [],\n                            cleanUpDom = {},\n                            newGroupMap = {},\n                            currentIndex = 0,\n                            len = tree.length,\n                            i;\n\n                        for (i = 0; i < len; i++) {\n                            var oldChangedRealizedRangeInGroup = null,\n                                groupInfo = that._getGroupInfo(i),\n                                groupKey = that._site.groupFromIndex(i).key,\n                                oldGroup = that._groupMap[groupKey],\n                                wasCellSpanning = oldGroup instanceof Groups.CellSpanningGroup,\n                                isCellSpanning = groupInfo.enableCellSpanning;\n\n                            if (oldGroup) {\n                                if (wasCellSpanning !== isCellSpanning) {\n                                    // The group has changed types so DOM needs to be cleaned up\n                                    cleanUpDom[groupKey] = true;\n                                } else {\n                                    // Compute the range of changed items that is within the group's realized range\n                                    var firstChangedIndexInGroup = Math.max(0, changedRange.firstIndex - oldGroup.startIndex),\n                                        oldRealizedItemRangeInGroup = that._rangeForGroup(oldGroup, oldRealizedItemRange);\n                                    if (oldRealizedItemRangeInGroup && firstChangedIndexInGroup <= oldRealizedItemRangeInGroup.lastIndex) {\n                                        // The old changed realized range is non-empty\n                                        oldChangedRealizedRangeInGroup = {\n                                            firstIndex: Math.max(firstChangedIndexInGroup, oldRealizedItemRangeInGroup.firstIndex),\n                                            lastIndex: oldRealizedItemRangeInGroup.lastIndex\n                                        };\n                                    }\n                                }\n                            }\n                            var group = createGroup(groupInfo, tree[i].itemsContainer.element);\n                            var prepareLayoutPromise;\n                            if (group.prepareLayoutWithCopyOfTree) {\n                                prepareLayoutPromise = group.prepareLayoutWithCopyOfTree(copyItemsContainerTree(tree[i].itemsContainer), oldChangedRealizedRangeInGroup, oldGroup, {\n                                    groupInfo: groupInfo,\n                                    startIndex: currentIndex,\n                                });\n                            } else {\n                                prepareLayoutPromise = group.prepareLayout(getItemsContainerLength(tree[i].itemsContainer), oldChangedRealizedRangeInGroup, oldGroup, {\n                                    groupInfo: groupInfo,\n                                    startIndex: currentIndex,\n                                });\n                            }\n                            prepared.push(prepareLayoutPromise);\n\n                            currentIndex += group.count;\n\n                            newGroups.push(group);\n                            newGroupMap[groupKey] = group;\n                        }\n\n                        return Promise.join(prepared).then(function () {\n                            var currentOffset = 0;\n                            for (var i = 0, len = newGroups.length; i < len; i++) {\n                                var group = newGroups[i];\n                                group.offset = currentOffset;\n                                currentOffset += that._getGroupSize(group);\n                            }\n\n                            // Clean up deleted groups\n                            Object.keys(that._groupMap).forEach(function (deletedKey) {\n                                var skipDomCleanUp = !cleanUpDom[deletedKey];\n                                that._groupMap[deletedKey].cleanUp(skipDomCleanUp);\n                            });\n\n                            that._groups = newGroups;\n                            that._groupMap = newGroupMap;\n                        });\n                    }\n\n                    // When doRealizedRange is true, this function is synchronous and has no return value.\n                    // When doRealizedRange is false, this function is asynchronous and returns a promise.\n                    function layoutGroupContent(groupIndex, realizedItemRange, doRealizedRange) {\n                        var group = that._groups[groupIndex],\n                            firstChangedIndexInGroup = Math.max(0, changedRange.firstIndex - group.startIndex),\n                            realizedItemRangeInGroup = that._rangeForGroup(group, realizedItemRange),\n                            beforeRealizedRange;\n\n                        if (doRealizedRange) {\n                            group.layoutRealizedRange(firstChangedIndexInGroup, realizedItemRangeInGroup);\n                        } else {\n                            if (!realizedItemRangeInGroup) {\n                                beforeRealizedRange = (group.startIndex + group.count - 1 < realizedItemRange.firstIndex);\n                            }\n\n                            return group.layoutUnrealizedRange(firstChangedIndexInGroup, realizedItemRangeInGroup, beforeRealizedRange);\n                        }\n                    }\n\n                    // Synchronously lays out:\n                    // - Realized and unrealized group shells (header containers and items containers).\n                    //   This is needed so that each realized group will be positioned at the correct offset.\n                    // - Realized items.\n                    function layoutRealizedRange() {\n                        if (that._groups.length === 0) {\n                            return;\n                        }\n\n                        var realizedItemRange = that._getRealizationRange(),\n                            len = tree.length,\n                            i,\n                            firstChangedGroup = site.groupIndexFromItemIndex(changedRange.firstIndex);\n\n                        for (i = firstChangedGroup; i < len; i++) {\n                            layoutGroupContent(i, realizedItemRange, true);\n                            that._layoutGroup(i);\n                        }\n                    }\n\n                    // Asynchronously lays out the unrealized items\n                    function layoutUnrealizedRange() {\n                        if (that._groups.length === 0) {\n                            return Promise.wrap();\n                        }\n\n                        var realizedItemRange = that._getRealizationRange(),\n                            // Last group before the realized range which contains 1 or more unrealized items\n                            lastGroupBefore = site.groupIndexFromItemIndex(realizedItemRange.firstIndex - 1),\n                            // First group after the realized range which contains 1 or more unrealized items\n                            firstGroupAfter = site.groupIndexFromItemIndex(realizedItemRange.lastIndex + 1),\n                            firstChangedGroup = site.groupIndexFromItemIndex(changedRange.firstIndex),\n                            layoutPromises = [],\n                            groupCount = that._groups.length;\n\n                        var stop = false;\n                        var before = lastGroupBefore;\n                        var after = Math.max(firstChangedGroup, firstGroupAfter);\n                        after = Math.max(before + 1, after);\n                        while (!stop) {\n                            stop = true;\n                            if (before >= firstChangedGroup) {\n                                layoutPromises.push(layoutGroupContent(before, realizedItemRange, false));\n                                stop = false;\n                                before--;\n                            }\n                            if (after < groupCount) {\n                                layoutPromises.push(layoutGroupContent(after, realizedItemRange, false));\n                                stop = false;\n                                after++;\n                            }\n                        }\n\n                        return Promise.join(layoutPromises);\n                    }\n\n                    realizedRangePromise = that._measureItem(0).then(function () {\n                        _ElementUtilities[(that._usingStructuralNodes) ? \"addClass\" : \"removeClass\"]\n                            (that._site.surface, _Constants._structuralNodesClass);\n                        _ElementUtilities[(that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) ? \"addClass\" : \"removeClass\"]\n                            (that._site.surface, _Constants._singleItemsBlockClass);\n\n                        if (that._sizes.viewportContentSize !== that._getViewportCrossSize()) {\n                            that._viewportSizeChanged(that._getViewportCrossSize());\n                        }\n\n                        // Move deleted elements to their original positions before calling updateGroups can be slow.\n                        that._cacheRemovedElements(modifiedItems, that._cachedItemRecords, that._cachedInsertedItemRecords, that._cachedRemovedItems, false);\n                        that._cacheRemovedElements(modifiedGroups, that._cachedHeaderRecords, that._cachedInsertedHeaderRecords, that._cachedRemovedHeaders, true);\n\n                        return updateGroups();\n                    }).then(function () {\n                        that._syncDomWithGroupHeaderPosition(tree);\n                        var surfaceLength = 0;\n                        if (that._groups.length > 0) {\n                            var lastGroup = that._groups[that._groups.length - 1];\n                            surfaceLength = lastGroup.offset + that._getGroupSize(lastGroup);\n                        }\n\n                        // Explicitly set the surface width/height. This maintains backwards\n                        // compatibility with the original layouts by allowing the items\n                        // to be shifted through surface margins.\n                        if (that._horizontal) {\n                            if (that._groupsEnabled && that._groupHeaderPosition === HeaderPosition.left) {\n                                site.surface.style.cssText +=\n                                    \";height:\" + that._sizes.surfaceContentSize +\n                                    \"px;-ms-grid-columns: (\" + that._sizes.headerContainerWidth + \"px auto)[\" + tree.length + \"]\";\n                            } else {\n                                site.surface.style.height = that._sizes.surfaceContentSize + \"px\";\n                            }\n                            if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {\n                                site.surface.style.width = surfaceLength + \"px\";\n                            }\n                        } else {\n                            if (that._groupsEnabled && that._groupHeaderPosition === HeaderPosition.top) {\n                                site.surface.style.cssText +=\n                                    \";width:\" + that._sizes.surfaceContentSize +\n                                    \"px;-ms-grid-rows: (\" + that._sizes.headerContainerHeight + \"px auto)[\" + tree.length + \"]\";\n                            } else {\n                                site.surface.style.width = that._sizes.surfaceContentSize + \"px\";\n                            }\n                            if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {\n                                site.surface.style.height = surfaceLength + \"px\";\n                            }\n                        }\n\n                        layoutRealizedRange();\n\n                        that._layoutAnimations(modifiedItems, modifiedGroups);\n\n                        that._site._writeProfilerMark(realizedRangePerfId + \":complete,info\");\n                        that._site._writeProfilerMark(realizedRangePerfId + \",StopTM\");\n                    }, function (error) {\n                        that._site._writeProfilerMark(realizedRangePerfId + \":canceled,info\");\n                        that._site._writeProfilerMark(realizedRangePerfId + \",StopTM\");\n                        return Promise.wrapError(error);\n                    });\n\n                    that._layoutPromise = realizedRangePromise.then(function () {\n                        return layoutUnrealizedRange().then(function () {\n                            that._site._writeProfilerMark(layoutPerfId + \":complete,info\");\n                            that._site._writeProfilerMark(layoutPerfId + \",StopTM\");\n                        }, function (error) {\n                            that._site._writeProfilerMark(layoutPerfId + \":canceled,info\");\n                            that._site._writeProfilerMark(layoutPerfId + \",StopTM\");\n                            return Promise.wrapError(error);\n                        });\n                    });\n\n                    return {\n                        realizedRangeComplete: realizedRangePromise,\n                        layoutComplete: that._layoutPromise\n                    };\n                },\n\n                itemsFromRange: function _LayoutCommon_itemsFromRange(firstPixel, lastPixel) {\n                    if (this._rangeContainsItems(firstPixel, lastPixel)) {\n                        return {\n                            firstIndex: this._firstItemFromRange(firstPixel),\n                            lastIndex: this._lastItemFromRange(lastPixel)\n                        };\n                    } else {\n                        return {\n                            firstIndex: 0,\n                            lastIndex: -1\n                        };\n                    }\n\n                },\n\n                getAdjacent: function _LayoutCommon_getAdjacent(currentItem, pressedKey) {\n                    var that = this,\n                        groupIndex = that._site.groupIndexFromItemIndex(currentItem.index),\n                        group = that._groups[groupIndex],\n                        adjustedKey = that._adjustedKeyForOrientationAndBars(that._adjustedKeyForRTL(pressedKey), group instanceof Groups.CellSpanningGroup);\n\n                    if (!currentItem.type) {\n                        currentItem.type = _UI.ObjectType.item;\n                    }\n                    if (currentItem.type !== _UI.ObjectType.item && (pressedKey === Key.pageUp || pressedKey === Key.pageDown)) {\n                        // We treat page up and page down keys as if an item had focus\n                        var itemIndex = 0;\n                        if (currentItem.type === _UI.ObjectType.groupHeader) {\n                            itemIndex = that._groups[currentItem.index].startIndex;\n                        } else {\n                            itemIndex = (currentItem.type === _UI.ObjectType.header ? 0 : that._groups[that._groups.length - 1].count - 1);\n                        }\n                        currentItem = { type: _UI.ObjectType.item, index: itemIndex };\n                    }else if (currentItem.type === _UI.ObjectType.header && adjustedKey === Key.rightArrow) {\n                        return { type: (that._groupsEnabled ? _UI.ObjectType.groupHeader : _UI.ObjectType.footer), index: 0 };\n                    } else if (currentItem.type === _UI.ObjectType.footer && adjustedKey === Key.leftArrow) {\n                        return { type: (that._groupsEnabled ? _UI.ObjectType.groupHeader : _UI.ObjectType.header), index: 0 };\n                    } else if (currentItem.type === _UI.ObjectType.groupHeader) {\n                        if (adjustedKey === Key.leftArrow) {\n                            var desiredIndex = currentItem.index - 1;\n                            desiredIndex = (that._site.header ? desiredIndex : Math.max(0, desiredIndex));\n                            return {\n                                type: (desiredIndex > -1 ? _UI.ObjectType.groupHeader : _UI.ObjectType.header),\n                                index: (desiredIndex > -1 ? desiredIndex : 0)\n                            };\n                        } else if (adjustedKey === Key.rightArrow) {\n                            var desiredIndex = currentItem.index + 1;\n                            desiredIndex = (that._site.header ? desiredIndex : Math.min(that._groups.length - 1, currentItem.index + 1));\n                            return {\n                                type: (desiredIndex >= that._groups.length ? _UI.ObjectType.header : _UI.ObjectType.groupHeader),\n                                index: (desiredIndex >= that._groups.length ? 0 : desiredIndex)\n                            };\n                        }\n                        return currentItem;\n                    }\n\n                    function handleArrowKeys() {\n                        var currentItemInGroup = {\n                            type: currentItem.type,\n                            index: currentItem.index - group.startIndex\n                        },\n                            newItem = group.getAdjacent(currentItemInGroup, adjustedKey);\n\n                        if (newItem === \"boundary\") {\n                            var prevGroup = that._groups[groupIndex - 1],\n                                nextGroup = that._groups[groupIndex + 1],\n                                lastGroupIndex = that._groups.length - 1;\n\n                            if (adjustedKey === Key.leftArrow) {\n                                if (groupIndex === 0) {\n                                    // We're at the beginning of the first group so stay put\n                                    return currentItem;\n                                } else if (prevGroup instanceof Groups.UniformGroup && group instanceof Groups.UniformGroup) {\n                                    // Moving between uniform groups so maintain the row/column if possible\n                                    var coordinates = that._indexToCoordinate(currentItemInGroup.index);\n                                    var currentSlot = (that._horizontal ? coordinates.row : coordinates.column),\n                                        indexOfLastBar = Math.floor((prevGroup.count - 1) / that._itemsPerBar),\n                                        startOfLastBar = indexOfLastBar * that._itemsPerBar; // first cell of last bar\n                                    return {\n                                        type: _UI.ObjectType.item,\n                                        index: prevGroup.startIndex + Math.min(prevGroup.count - 1, startOfLastBar + currentSlot)\n                                    };\n                                } else {\n                                    // Moving to or from a cell spanning group so go to the last item\n                                    return { type: _UI.ObjectType.item, index: group.startIndex - 1 };\n                                }\n                            } else if (adjustedKey === Key.rightArrow) {\n                                if (groupIndex === lastGroupIndex) {\n                                    // We're at the end of the last group so stay put\n                                    return currentItem;\n                                } else if (group instanceof Groups.UniformGroup && nextGroup instanceof Groups.UniformGroup) {\n                                    // Moving between uniform groups so maintain the row/column if possible\n                                    var coordinates = that._indexToCoordinate(currentItemInGroup.index),\n                                        currentSlot = (that._horizontal ? coordinates.row : coordinates.column);\n                                    return {\n                                        type: _UI.ObjectType.item,\n                                        index: nextGroup.startIndex + Math.min(nextGroup.count - 1, currentSlot)\n                                    };\n                                } else {\n                                    // Moving to or from a cell spanning group so go to the first item\n                                    return { type: _UI.ObjectType.item, index: nextGroup.startIndex };\n                                }\n                            } else {\n                                return currentItem;\n                            }\n                        } else {\n                            newItem.index += group.startIndex;\n                            return newItem;\n                        }\n                    }\n\n                    switch (that._adjustedKeyForRTL(pressedKey)) {\n                        case Key.upArrow:\n                        case Key.leftArrow:\n                        case Key.downArrow:\n                        case Key.rightArrow:\n                            return handleArrowKeys();\n                        default:\n                            return exports._LayoutCommon.prototype._getAdjacentForPageKeys.call(that, currentItem, pressedKey);\n                    }\n                },\n\n                hitTest: function _LayoutCommon_hitTest(x, y) {\n                    var sizes = this._sizes,\n                        result;\n\n                    // Make the coordinates relative to grid layout's content box\n                    x -= sizes.layoutOriginX;\n                    y -= sizes.layoutOriginY;\n\n                    var groupIndex = this._groupFromOffset(this._horizontal ? x : y),\n                        group = this._groups[groupIndex];\n\n                    // Make the coordinates relative to the margin box of the group's items container\n                    if (this._horizontal) {\n                        x -= group.offset;\n                    } else {\n                        y -= group.offset;\n                    }\n                    if (this._groupsEnabled) {\n                        if (this._groupHeaderPosition === HeaderPosition.left) {\n                            x -= sizes.headerContainerWidth;\n                        } else {\n                            // Headers above\n                            y -= sizes.headerContainerHeight;\n                        }\n                    }\n\n                    result = group.hitTest(x, y);\n                    result.index += group.startIndex;\n                    result.insertAfterIndex += group.startIndex;\n                    return result;\n                },\n\n                // Animation cycle:\n                //\n                // Edits\n                //  ---     UpdateTree        Realize\n                // |   |      ---               /\\/\\\n                // |   |     |   |             |    |\n                // ------------------------------------------------------- Time\n                //      |   |     |   |   |   |      |   |\n                //       ---      |   |    ---        ---/\\/\\/\\/\\/\\/\\/\\/\\/\n                //     setupAni   |   | layoutAni    endAni  (animations)\n                //                 ---/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\\n                //                layout    (outside realized range)\n                //\n                //\n                // When there is a modification to the DataSource, the first thing that happens is setupAnimations is\n                // called with the current tree. This allows us to cache the locations of the existing items.\n                //\n                // The next 3 steps have to be completely synchronous otherwise users will see intermediate states and\n                // items will blink or jump between locations.\n                //\n                // ListView modifies the DOM tree. A container is added/removed from the group's itemsContainer for each\n                // item added/removed to the group. The existing itemBoxes are shuffled between the different containers.\n                // The itemBoxes for the removed items will be removed from the containers completely. Since the DOM tree\n                // has been modified we have to apply a transform to position the itemBoxes at their original location. We\n                // compare the new locations with the cached locations to figure out how far to translate the itemBoxes.\n                // Also the removed items need to be placed back in the DOM without affecting layout (by using position\n                // absolute) so that they also do not jump or blink.\n                //\n                // We only tranform and add back removed items for items which were on screen or are now on screen.\n                //\n                // Now the ListView can realize other items asynchronously. The items to realize are items which have been\n                // inserted into the DataSource or items which are in the realization range because a removal has occurred\n                // or the user has scroll slightly.\n                //\n                // During the realization pass the user may scroll. If they scroll to a range outside of the realization\n                // range the items will just appear in the correct location without any animations. If they scroll to a\n                // location within the old realization range we still have the items and they will animate correctly.\n                //\n                // During the realization pass another data source edit can occur. A realization pass is unable to run when\n                // the tree and layout are out of sync. Otherwise it may try to request item at index X and get item at\n                // index X + 1. This means that if another data source edit occurs before endAnimations is called we\n                // restart the whole animation cycle. To group the animations between the two edits we do not reset the\n                // caches of item box locations. We could add to it if there were items outside of the range however they\n                // will only play half of the animation and will probably look just as ugly as not playing the animation at\n                // all. This means setupAnimations will just be a no op in this scenario.\n                //\n                // This also shows that batching data source edits and only changing the data source when in loadingstate\n                // \"complete\" is still a large performance win.\n                //\n                // Once the realization pass has finished ListView calls executeAnimations. This is where the layout\n                // effectively fades out the removed items (and then removes them from the dom), moves the itemBoxes back\n                // to translate(0,0), and fades in the inserted itemBoxes. ListView waits for the executeAnimations promise\n                // to complete before allowing more data source edits to trigger another animation cycle.\n                //\n                // If a resize occurs during the animation cycle the animations will be canceled and items will jump to\n                // their final positions.\n\n                setupAnimations: function _LayoutCommon_setupAnimations() {\n                    // This function is called after a data source change so that we can cache the locations\n                    // of the realized items.\n\n                    if (this._groups.length === 0) {\n                        // No animations if we haven't measured before\n                        this._resetAnimationCaches();\n                        return;\n                    }\n\n                    if (Object.keys(this._cachedItemRecords).length) {\n                        // Ignore the second call.\n                        return;\n                    }\n\n                    this._site._writeProfilerMark(\"Animation:setupAnimations,StartTM\");\n\n                    var realizationRange = this._getRealizationRange();\n\n                    var tree = this._site.tree;\n                    var itemIndex = 0;\n                    var horizontal = (this.orientation === \"horizontal\");\n                    for (var i = 0, treeLength = tree.length; i < treeLength; i++) {\n                        var groupBundle = tree[i];\n                        var groupHasAtleastOneItemRealized = false;\n                        var group = this._groups[i];\n                        var groupIsCellSpanning = group instanceof Groups.CellSpanningGroup;\n                        var groupOffset = (group ? group.offset : 0);\n\n                        forEachContainer(groupBundle.itemsContainer, function (container, j) {\n                            // Don't try to cache something outside of the realization range.\n                            if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {\n                                groupHasAtleastOneItemRealized = true;\n\n                                if (!this._cachedItemRecords[itemIndex]) {\n                                    var itemPosition = this._getItemPositionForAnimations(itemIndex, i, j);\n                                    var row = itemPosition.row;\n                                    var column = itemPosition.column;\n                                    var left = itemPosition.left;\n                                    var top = itemPosition.top;\n\n                                    // Setting both old and new variables now in case layoutAnimations is called multiple times.\n                                    this._cachedItemRecords[itemIndex] = {\n                                        oldRow: row,\n                                        oldColumn: column,\n                                        oldLeft: left,\n                                        oldTop: top,\n                                        width: itemPosition.width,\n                                        height: itemPosition.height,\n                                        element: container,\n                                        inCellSpanningGroup: groupIsCellSpanning\n                                    };\n                                }\n                            }\n                            itemIndex++;\n                        }.bind(this));\n\n                        if (groupHasAtleastOneItemRealized) {\n                            var groupIndex = i;\n                            if (!this._cachedHeaderRecords[groupIndex]) {\n                                var headerPosition = this._getHeaderPositionForAnimations(groupIndex);\n                                this._cachedHeaderRecords[groupIndex] = {\n                                    oldLeft: headerPosition.left,\n                                    oldTop: headerPosition.top,\n                                    width: headerPosition.width,\n                                    height: headerPosition.height,\n                                    element: groupBundle.header,\n                                };\n                            }\n                            if (!this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)]) {\n                                this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)] = {\n                                    oldLeft: horizontal ? groupOffset : 0,\n                                    left: horizontal ? groupOffset : 0,\n                                    oldTop: horizontal ? 0 : groupOffset,\n                                    top: horizontal ? 0 : groupOffset,\n                                    element: groupBundle.itemsContainer.element,\n                                };\n                            }\n                        }\n                    }\n\n                    this._site._writeProfilerMark(\"Animation:setupAnimations,StopTM\");\n                },\n\n                _layoutAnimations: function _LayoutCommon_layoutAnimations(modifiedItems, modifiedGroups) {\n                    // This function is called after the DOM tree has been modified to match the data source.\n                    // In this function we update the cached records and apply transforms to hide the modifications\n                    // from the user. We will remove the transforms via animations in execute animation.\n\n                    if (!Object.keys(this._cachedItemRecords).length &&\n                        !Object.keys(this._cachedGroupRecords).length &&\n                        !Object.keys(this._cachedHeaderRecords).length) {\n                        return;\n                    }\n\n                    this._site._writeProfilerMark(\"Animation:layoutAnimation,StartTM\");\n\n                    this._updateAnimationCache(modifiedItems, modifiedGroups);\n\n                    var realizationRange = this._getRealizationRange();\n\n                    var tree = this._site.tree;\n                    var itemIndex = 0;\n                    var horizontal = (this.orientation === \"horizontal\");\n                    for (var i = 0, treeLength = tree.length; i < treeLength; i++) {\n                        var groupBundle = tree[i];\n                        var group = this._groups[i];\n                        var groupIsCellSpanning = group instanceof Groups.CellSpanningGroup;\n                        var groupOffset = (group ? group.offset : 0);\n                        var groupMovementX = 0;\n                        var groupMovementY = 0;\n\n                        var cachedGroupRecord = this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)];\n                        if (cachedGroupRecord) {\n                            if (horizontal) {\n                                groupMovementX = cachedGroupRecord.oldLeft - groupOffset;\n                            } else {\n                                groupMovementY = cachedGroupRecord.oldTop - groupOffset;\n                            }\n                        }\n\n\n                        forEachContainer(groupBundle.itemsContainer, function (container, j) {\n                            // Don't try to cache something outside of the realization range.\n                            if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {\n                                var cachedItemRecord = this._cachedItemRecords[itemIndex];\n                                if (cachedItemRecord) {\n                                    var itemPosition = this._getItemPositionForAnimations(itemIndex, i, j);\n                                    var row = itemPosition.row;\n                                    var column = itemPosition.column;\n                                    var left = itemPosition.left;\n                                    var top = itemPosition.top;\n\n                                    cachedItemRecord.inCellSpanningGroup = cachedItemRecord.inCellSpanningGroup || groupIsCellSpanning;\n\n                                    // If the item has moved we need to update the cache and apply a transform to make it\n                                    // appear like it has not moved yet.\n                                    if (cachedItemRecord.oldRow !== row ||\n                                        cachedItemRecord.oldColumn !== column ||\n                                        cachedItemRecord.oldTop !== top ||\n                                        cachedItemRecord.oldLeft !== left) {\n\n                                        cachedItemRecord.row = row;\n                                        cachedItemRecord.column = column;\n                                        cachedItemRecord.left = left;\n                                        cachedItemRecord.top = top;\n\n                                        var xOffset = cachedItemRecord.oldLeft - cachedItemRecord.left - groupMovementX;\n                                        var yOffset = cachedItemRecord.oldTop - cachedItemRecord.top - groupMovementY;\n                                        xOffset = (this._site.rtl ? -1 : 1) * xOffset;\n\n                                        cachedItemRecord.xOffset = xOffset;\n                                        cachedItemRecord.yOffset = yOffset;\n                                        if (xOffset !== 0 || yOffset !== 0) {\n                                            var element = cachedItemRecord.element;\n                                            cachedItemRecord.needsToResetTransform = true;\n                                            element.style[transitionScriptName] = \"\";\n                                            element.style[transformNames.scriptName] = \"translate(\" + xOffset + \"px,\" + yOffset + \"px)\";\n                                        }\n\n                                        var itemsBlock = container.parentNode;\n                                        if (_ElementUtilities.hasClass(itemsBlock, _Constants._itemsBlockClass)) {\n                                            this._animatingItemsBlocks[uniqueID(itemsBlock)] = itemsBlock;\n                                        }\n                                    }\n\n                                } else {\n                                    // Treat items that came from outside of the realization range into the realization range\n                                    // as a \"Move\" which means fade it in.\n                                    this._cachedInsertedItemRecords[itemIndex] = container;\n                                    container.style[transitionScriptName] = \"\";\n                                    container.style.opacity = 0;\n                                }\n                            }\n\n                            itemIndex++;\n                        }.bind(this));\n\n                        var groupIndex = i;\n                        var cachedHeader = this._cachedHeaderRecords[groupIndex];\n                        if (cachedHeader) {\n                            var headerPosition = this._getHeaderPositionForAnimations(groupIndex);\n                            // Note: If a group changes width we allow the header to immediately grow/shrink instead of\n                            // animating it. However if the header is removed we stick the header to the last known size.\n                            cachedHeader.height = headerPosition.height;\n                            cachedHeader.width = headerPosition.width;\n                            if (cachedHeader.oldLeft !== headerPosition.left ||\n                                cachedHeader.oldTop !== headerPosition.top) {\n\n                                cachedHeader.left = headerPosition.left;\n                                cachedHeader.top = headerPosition.top;\n\n                                var xOffset = cachedHeader.oldLeft - cachedHeader.left;\n                                var yOffset = cachedHeader.oldTop - cachedHeader.top;\n                                xOffset = (this._site.rtl ? -1 : 1) * xOffset;\n                                if (xOffset !== 0 || yOffset !== 0) {\n                                    cachedHeader.needsToResetTransform = true;\n                                    var headerContainer = cachedHeader.element;\n                                    headerContainer.style[transitionScriptName] = \"\";\n                                    headerContainer.style[transformNames.scriptName] = \"translate(\" + xOffset + \"px,\" + yOffset + \"px)\";\n                                }\n                            }\n                        }\n\n                        if (cachedGroupRecord) {\n                            if ((horizontal && cachedGroupRecord.left !== groupOffset) ||\n                                (!horizontal && cachedGroupRecord.top !== groupOffset)) {\n                                var element = cachedGroupRecord.element;\n                                if (groupMovementX === 0 && groupMovementY === 0) {\n                                    if (cachedGroupRecord.needsToResetTransform) {\n                                        cachedGroupRecord.needsToResetTransform = false;\n                                        element.style[transformNames.scriptName] = \"\";\n                                    }\n                                } else {\n                                    var groupOffsetX = (this._site.rtl ? -1 : 1) * groupMovementX,\n                                        groupOffsetY = groupMovementY;\n                                    cachedGroupRecord.needsToResetTransform = true;\n                                    element.style[transitionScriptName] = \"\";\n                                    element.style[transformNames.scriptName] = \"translate(\" + groupOffsetX + \"px, \" + groupOffsetY + \"px)\";\n                                }\n                            }\n                        }\n                    }\n\n                    if (this._inListMode || this._itemsPerBar === 1) {\n                        var itemsBlockKeys = Object.keys(this._animatingItemsBlocks);\n                        for (var b = 0, blockKeys = itemsBlockKeys.length; b < blockKeys; b++) {\n                            this._animatingItemsBlocks[itemsBlockKeys[b]].style.overflow = 'visible';\n                        }\n                    }\n\n                    this._site._writeProfilerMark(\"Animation:layoutAnimation,StopTM\");\n                },\n\n                executeAnimations: function _LayoutCommon_executeAnimations() {\n                    // This function is called when we should perform an animation to reveal the true location of the items.\n                    // We fade out removed items, fade in added items, and move items which need to be shifted. If they moved\n                    // across columns we do a reflow animation.\n\n                    var animationSignal = new _Signal();\n\n                    // Only animate the items on screen.\n                    this._filterInsertedElements();\n                    this._filterMovedElements();\n                    this._filterRemovedElements();\n\n                    if (this._insertedElements.length === 0 && this._removedElements.length === 0 && this._itemMoveRecords.length === 0 && this._moveRecords.length === 0) {\n                        // Nothing to animate.\n                        this._resetAnimationCaches(true);\n                        animationSignal.complete();\n                        return animationSignal.promise;\n                    }\n                    this._animationsRunning = animationSignal.promise;\n\n                    var slowAnimations = exports.Layout._debugAnimations || exports.Layout._slowAnimations;\n                    var site = this._site;\n                    var insertedElements = this._insertedElements;\n                    var removedElements = this._removedElements;\n                    var itemMoveRecords = this._itemMoveRecords;\n                    var moveRecords = this._moveRecords;\n\n                    var removeDelay = 0;\n                    var moveDelay = 0;\n                    var addDelay = 0;\n\n                    var currentAnimationPromise = null;\n                    var pendingTransitionPromises = [];\n\n                    var hasMultisizeMove = false;\n                    var hasReflow = false;\n                    var minOffset = 0;\n                    var maxOffset = 0;\n                    var itemContainersToExpand = {};\n                    var upOutDist = 0;\n                    var downOutDist = 0;\n                    var upInDist = 0;\n                    var downInDist = 0;\n                    var reflowItemRecords = [];\n                    var horizontal = (this.orientation === \"horizontal\");\n                    var oldReflowLayoutProperty = horizontal ? \"oldColumn\" : \"oldRow\",\n                        reflowLayoutProperty = horizontal ? \"column\" : \"row\",\n                        oldReflowLayoutPosition = horizontal ? \"oldTop\" : \"oldLeft\",\n                        reflowLayoutPosition = horizontal ? \"top\" : \"left\";\n\n                    var animatingItemsBlocks = this._animatingItemsBlocks;\n\n                    for (var i = 0, len = itemMoveRecords.length; i < len; i++) {\n                        var cachedItemRecord = itemMoveRecords[i];\n                        if (cachedItemRecord.inCellSpanningGroup) {\n                            hasMultisizeMove = true;\n                            break;\n                        }\n                    }\n\n                    var that = this;\n\n                    function startAnimations() {\n                        removePhase();\n                        if (hasMultisizeMove) {\n                            cellSpanningFadeOutMove();\n                        } else {\n                            if (that._itemsPerBar > 1) {\n                                var maxDistance = that._itemsPerBar * that._sizes.containerCrossSize + that._getHeaderSizeContentAdjustment() +\n                                    that._sizes.containerMargins[horizontal ? \"top\" : (site.rtl ? \"right\" : \"left\")] +\n                                    (horizontal ? that._sizes.layoutOriginY : that._sizes.layoutOriginX);\n                                for (var i = 0, len = itemMoveRecords.length; i < len; i++) {\n                                    var cachedItemRecord = itemMoveRecords[i];\n                                    if (cachedItemRecord[oldReflowLayoutProperty] > cachedItemRecord[reflowLayoutProperty]) {\n                                        upOutDist = Math.max(upOutDist, cachedItemRecord[oldReflowLayoutPosition] + cachedItemRecord[horizontal ? \"height\" : \"width\"]);\n                                        upInDist = Math.max(upInDist, maxDistance - cachedItemRecord[reflowLayoutPosition]);\n                                        hasReflow = true;\n                                        reflowItemRecords.push(cachedItemRecord);\n                                    } else if (cachedItemRecord[oldReflowLayoutProperty] < cachedItemRecord[reflowLayoutProperty]) {\n                                        downOutDist = Math.max(downOutDist, maxDistance - cachedItemRecord[oldReflowLayoutPosition]);\n                                        downInDist = Math.max(downInDist, cachedItemRecord[reflowLayoutPosition] + cachedItemRecord[horizontal ? \"height\" : \"width\"]);\n                                        reflowItemRecords.push(cachedItemRecord);\n                                        hasReflow = true;\n                                    }\n                                }\n                            }\n\n                            if (site.rtl && !horizontal) {\n                                upOutDist *= -1;\n                                upInDist *= -1;\n                                downOutDist *= -1;\n                                downInDist *= -1;\n                            }\n\n                            if (hasReflow) {\n                                reflowPhase(that._itemsPerBar);\n                            } else {\n                                directMovePhase();\n                            }\n                        }\n                    }\n\n                    if (exports.Layout._debugAnimations) {\n                        _BaseUtils._requestAnimationFrame(function () {\n                            startAnimations();\n                        });\n                    } else {\n                        startAnimations();\n                    }\n\n                    function waitForNextPhase(nextPhaseCallback) {\n                        currentAnimationPromise = Promise.join(pendingTransitionPromises);\n                        currentAnimationPromise.done(function () {\n                            pendingTransitionPromises = [];\n                            // The success is called even if the animations are canceled due to the WinJS.UI.executeTransition\n                            // API. To deal with that we check the animationSignal variable. If it is null the animations were\n                            // canceled so we shouldn't continue.\n                            if (animationSignal) {\n                                if (exports.Layout._debugAnimations) {\n                                    _BaseUtils._requestAnimationFrame(function () {\n                                        nextPhaseCallback();\n                                    });\n                                } else {\n                                    nextPhaseCallback();\n                                }\n                            }\n                        });\n                    }\n\n                    function removePhase() {\n                        if (removedElements.length) {\n                            site._writeProfilerMark(\"Animation:setupRemoveAnimation,StartTM\");\n\n                            moveDelay += 60;\n                            addDelay += 60;\n\n                            var removeDuration = 120;\n                            if (slowAnimations) {\n                                removeDuration *= 10;\n                            }\n\n                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(removedElements,\n                            [{\n                                property: \"opacity\",\n                                delay: removeDelay,\n                                duration: removeDuration,\n                                timing: \"linear\",\n                                to: 0,\n                                skipStylesReset: true\n                            }]));\n\n                            site._writeProfilerMark(\"Animation:setupRemoveAnimation,StopTM\");\n                        }\n                    }\n\n                    function cellSpanningFadeOutMove() {\n                        site._writeProfilerMark(\"Animation:cellSpanningFadeOutMove,StartTM\");\n\n                        // For multisize items which move we fade out and then fade in (opacity 1->0->1)\n                        var moveElements = [];\n                        for (var i = 0, len = itemMoveRecords.length; i < len; i++) {\n                            var cachedItemRecord = itemMoveRecords[i];\n                            var container = cachedItemRecord.element;\n                            moveElements.push(container);\n                        }\n                        // Including groups and headers.\n                        for (var i = 0, len = moveRecords.length; i < len; i++) {\n                            var cachedItemRecord = moveRecords[i];\n                            var container = cachedItemRecord.element;\n                            moveElements.push(container);\n                        }\n\n                        var fadeOutDuration = 120;\n                        if (slowAnimations) {\n                            fadeOutDuration *= 10;\n                        }\n\n                        pendingTransitionPromises.push(_TransitionAnimation.executeTransition(moveElements,\n                        {\n                            property: \"opacity\",\n                            delay: removeDelay,\n                            duration: fadeOutDuration,\n                            timing: \"linear\",\n                            to: 0\n                        }));\n\n                        waitForNextPhase(cellSpanningFadeInMove);\n                        site._writeProfilerMark(\"Animation:cellSpanningFadeOutMove,StopTM\");\n                    }\n\n                    function cellSpanningFadeInMove() {\n                        site._writeProfilerMark(\"Animation:cellSpanningFadeInMove,StartTM\");\n\n                        addDelay = 0;\n\n                        var moveElements = [];\n                        // Move them to their final location.\n                        for (var i = 0, len = itemMoveRecords.length; i < len; i++) {\n                            var cachedItemRecord = itemMoveRecords[i];\n                            var container = cachedItemRecord.element;\n                            container.style[transformNames.scriptName] = \"\";\n                            moveElements.push(container);\n                        }\n                        // Including groups and headers.\n                        for (var i = 0, len = moveRecords.length; i < len; i++) {\n                            var cachedItemRecord = moveRecords[i];\n                            var container = cachedItemRecord.element;\n                            container.style[transformNames.scriptName] = \"\";\n                            moveElements.push(container);\n                        }\n\n                        var fadeInDuration = 120;\n                        if (slowAnimations) {\n                            fadeInDuration *= 10;\n                        }\n\n                        // For multisize items which move we fade out and then fade in (opacity 1->0->1)\n                        pendingTransitionPromises.push(_TransitionAnimation.executeTransition(moveElements,\n                        {\n                            property: \"opacity\",\n                            delay: addDelay,\n                            duration: fadeInDuration,\n                            timing: \"linear\",\n                            to: 1\n                        }));\n\n                        site._writeProfilerMark(\"Animation:cellSpanningFadeInMove,StopTM\");\n\n                        addPhase();\n                    }\n\n                    function reflowPhase(itemsPerBar) {\n                        site._writeProfilerMark(\"Animation:setupReflowAnimation,StartTM\");\n\n                        var itemContainersLastBarIndices = {};\n                        for (var i = 0, len = reflowItemRecords.length; i < len; i++) {\n                            var reflowItemRecord = reflowItemRecords[i];\n                            var xOffset = reflowItemRecord.xOffset;\n                            var yOffset = reflowItemRecord.yOffset;\n                            if (reflowItemRecord[oldReflowLayoutProperty] > reflowItemRecord[reflowLayoutProperty]) {\n                                if (horizontal) {\n                                    yOffset -= upOutDist;\n                                } else {\n                                    xOffset -= upOutDist;\n                                }\n                            } else if (reflowItemRecord[oldReflowLayoutProperty] < reflowItemRecord[reflowLayoutProperty]) {\n                                if (horizontal) {\n                                    yOffset += downOutDist;\n                                } else {\n                                    xOffset += downOutDist;\n                                }\n                            }\n\n                            var container = reflowItemRecord.element;\n\n                            minOffset = Math.min(minOffset, horizontal ? xOffset : yOffset);\n                            maxOffset = Math.max(maxOffset, horizontal ? xOffset : yOffset);\n                            var itemsContainer = container.parentNode;\n                            if (!_ElementUtilities.hasClass(itemsContainer, \"win-itemscontainer\")) {\n                                itemsContainer = itemsContainer.parentNode;\n                            }\n\n                            // The itemscontainer element is always overflow:hidden for two reasons:\n                            // 1) Better panning performance\n                            // 2) When there is margin betweeen the itemscontainer and the surface elements, items that\n                            //    reflow should not be visible while they travel long distances or overlap with headers.\n                            // This introduces an issue when updateTree makes the itemscontainer smaller, but we need its size\n                            // to remain the same size during the execution of the animation to avoid having some of the animated\n                            // items being clipped. This is only an issue when items from the last column (in horizontal mode) or row\n                            // (in vertical mode) of the group will reflow. Therefore, we change the padding so that the contents are larger,\n                            // and then use margin to reverse the size change. We don't do this expansion when it is unnecessary because the\n                            // layout/formatting caused by these style changes has significant cost when the group has thousands of items.\n                            var lastBarIndex = itemContainersLastBarIndices[uniqueID(itemsContainer)];\n                            if (!lastBarIndex) {\n                                var count = getItemsContainerLength(getItemsContainerTree(itemsContainer, site.tree));\n                                itemContainersLastBarIndices[uniqueID(itemsContainer)] = lastBarIndex = Math.ceil(count / itemsPerBar) - 1;\n                            }\n                            if (reflowItemRecords[i][horizontal ? \"column\" : \"row\"] === lastBarIndex) {\n                                itemContainersToExpand[uniqueID(itemsContainer)] = itemsContainer;\n                            }\n\n                            var reflowDuration = 80;\n                            if (slowAnimations) {\n                                reflowDuration *= 10;\n                            }\n\n                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(container,\n                            {\n                                property: transformNames.cssName,\n                                delay: moveDelay,\n                                duration: reflowDuration,\n                                timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                                to: \"translate(\" + xOffset + \"px,\" + yOffset + \"px)\"\n                            }));\n                        }\n\n                        var itemContainerKeys = Object.keys(itemContainersToExpand);\n                        for (var i = 0, len = itemContainerKeys.length; i < len; i++) {\n                            var itemContainer = itemContainersToExpand[itemContainerKeys[i]];\n                            if (site.rtl && horizontal) {\n                                itemContainer.style.paddingLeft = (-1 * minOffset) + 'px';\n                                itemContainer.style.marginLeft = minOffset + 'px';\n                            } else {\n                                itemContainer.style[horizontal ? \"paddingRight\" : \"paddingBottom\"] = maxOffset + 'px';\n                                itemContainer.style[horizontal ? \"marginRight\" : \"marginBottom\"] = '-' + maxOffset + 'px';\n                            }\n                        }\n                        var itemsBlockKeys = Object.keys(animatingItemsBlocks);\n                        for (var i = 0, len = itemsBlockKeys.length; i < len; i++) {\n                            animatingItemsBlocks[itemsBlockKeys[i]].classList.add(_Constants._clipClass);\n                        }\n\n                        waitForNextPhase(afterReflowPhase);\n\n                        site._writeProfilerMark(\"Animation:setupReflowAnimation,StopTM\");\n                    }\n\n                    function cleanupItemsContainers() {\n                        // Reset the styles used to obtain overflow-y: hidden overflow-x: visible.\n                        var itemContainerKeys = Object.keys(itemContainersToExpand);\n                        for (var i = 0, len = itemContainerKeys.length; i < len; i++) {\n                            var itemContainer = itemContainersToExpand[itemContainerKeys[i]];\n                            if (site.rtl && horizontal) {\n                                itemContainer.style.paddingLeft = '';\n                                itemContainer.style.marginLeft = '';\n                            } else {\n                                itemContainer.style[horizontal ? \"paddingRight\" : \"paddingBottom\"] = '';\n                                itemContainer.style[horizontal ? \"marginRight\" : \"marginBottom\"] = '';\n                            }\n                        }\n                        itemContainersToExpand = {};\n\n                        var itemsBlockKeys = Object.keys(animatingItemsBlocks);\n                        for (var i = 0, len = itemsBlockKeys.length; i < len; i++) {\n                            var itemsBlock = animatingItemsBlocks[itemsBlockKeys[i]];\n                            itemsBlock.style.overflow = '';\n                            itemsBlock.classList.remove(_Constants._clipClass);\n                        }\n                    }\n\n                    function afterReflowPhase() {\n                        site._writeProfilerMark(\"Animation:prepareReflowedItems,StartTM\");\n\n                        // Position the items at the edge ready to slide in.\n                        for (var i = 0, len = reflowItemRecords.length; i < len; i++) {\n                            var reflowItemRecord = reflowItemRecords[i];\n                            var xOffset = 0,\n                                yOffset = 0;\n                            if (reflowItemRecord[oldReflowLayoutProperty] > reflowItemRecord[reflowLayoutProperty]) {\n                                if (horizontal) {\n                                    yOffset = upInDist;\n                                } else {\n                                    xOffset = upInDist;\n                                }\n                            } else if (reflowItemRecord[oldReflowLayoutProperty] < reflowItemRecord[reflowLayoutProperty]) {\n                                if (horizontal) {\n                                    yOffset = -1 * downInDist;\n                                } else {\n                                    xOffset = -1 * downInDist;\n                                }\n                            }\n                            reflowItemRecord.element.style[transitionScriptName] = \"\";\n                            reflowItemRecord.element.style[transformNames.scriptName] = \"translate(\" + xOffset + \"px,\" + yOffset + \"px)\";\n                        }\n\n                        site._writeProfilerMark(\"Animation:prepareReflowedItems,StopTM\");\n\n                        if (exports.Layout._debugAnimations) {\n                            _BaseUtils._requestAnimationFrame(function () {\n                                directMovePhase(true);\n                            });\n                        } else {\n                            directMovePhase(true);\n                        }\n                    }\n\n                    function directMovePhase(fastMode) {\n                        // For groups and items which move we transition them from transform: translate(Xpx,Ypx) to translate(0px,0px).\n                        var duration = 200;\n                        if (fastMode) {\n                            duration = 150;\n                            moveDelay = 0;\n                            addDelay = 0;\n                        }\n\n                        if (slowAnimations) {\n                            duration *= 10;\n                        }\n\n                        if (itemMoveRecords.length > 0 || moveRecords.length > 0) {\n                            site._writeProfilerMark(\"Animation:setupMoveAnimation,StartTM\");\n\n                            var moveElements = [];\n                            for (var i = 0, len = moveRecords.length; i < len; i++) {\n                                var container = moveRecords[i].element;\n                                moveElements.push(container);\n                            }\n                            for (var i = 0, len = itemMoveRecords.length; i < len; i++) {\n                                var container = itemMoveRecords[i].element;\n                                moveElements.push(container);\n                            }\n                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(moveElements,\n                            {\n                                property: transformNames.cssName,\n                                delay: moveDelay,\n                                duration: duration,\n                                timing: \"cubic-bezier(0.1, 0.9, 0.2, 1)\",\n                                to: \"\"\n                            }));\n\n                            addDelay += 80;\n\n                            site._writeProfilerMark(\"Animation:setupMoveAnimation,StopTM\");\n                        }\n\n                        addPhase();\n                    }\n\n                    function addPhase() {\n                        if (insertedElements.length > 0) {\n                            site._writeProfilerMark(\"Animation:setupInsertAnimation,StartTM\");\n\n                            var addDuration = 120;\n                            if (slowAnimations) {\n                                addDuration *= 10;\n                            }\n\n                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(insertedElements,\n                            [{\n                                property: \"opacity\",\n                                delay: addDelay,\n                                duration: addDuration,\n                                timing: \"linear\",\n                                to: 1\n                            }]));\n\n                            site._writeProfilerMark(\"Animation:setupInsertAnimation,StopTM\");\n                        }\n\n                        waitForNextPhase(completePhase);\n                    }\n                    function completePhase() {\n                        site._writeProfilerMark(\"Animation:cleanupAnimations,StartTM\");\n\n                        cleanupItemsContainers();\n\n                        for (var i = 0, len = removedElements.length; i < len; i++) {\n                            var container = removedElements[i];\n                            if (container.parentNode) {\n                                _Dispose._disposeElement(container);\n                                container.parentNode.removeChild(container);\n                            }\n                        }\n\n                        site._writeProfilerMark(\"Animation:cleanupAnimations,StopTM\");\n\n                        that._animationsRunning = null;\n                        animationSignal.complete();\n                    }\n                    this._resetAnimationCaches(true);\n\n                    // The PVL animation library completes sucessfully even if you cancel an animation.\n                    // If the animation promise passed to layout is canceled we should cancel the PVL animations and\n                    // set a marker for them to be ignored.\n                    animationSignal.promise.then(null, function () {\n                        // Since it was canceled make sure we still clean up the styles.\n                        cleanupItemsContainers();\n                        for (var i = 0, len = moveRecords.length; i < len; i++) {\n                            var container = moveRecords[i].element;\n                            container.style[transformNames.scriptName] = '';\n                            container.style.opacity = 1;\n                        }\n                        for (var i = 0, len = itemMoveRecords.length; i < len; i++) {\n                            var container = itemMoveRecords[i].element;\n                            container.style[transformNames.scriptName] = '';\n                            container.style.opacity = 1;\n                        }\n                        for (var i = 0, len = insertedElements.length; i < len; i++) {\n                            insertedElements[i].style.opacity = 1;\n                        }\n                        for (var i = 0, len = removedElements.length; i < len; i++) {\n                            var container = removedElements[i];\n                            if (container.parentNode) {\n                                _Dispose._disposeElement(container);\n                                container.parentNode.removeChild(container);\n                            }\n                        }\n\n                        this._animationsRunning = null;\n                        animationSignal = null;\n                        currentAnimationPromise && currentAnimationPromise.cancel();\n\n                    }.bind(this));\n\n                    return animationSignal.promise;\n                },\n\n                dragOver: function _LayoutCommon_dragOver(x, y, dragInfo) {\n                    // The coordinates passed to dragOver should be in ListView's viewport space. 0,0 should be the top left corner of the viewport's padding.\n                    var indicesAffected = this.hitTest(x, y),\n                        groupAffected = (this._groups ? this._site.groupIndexFromItemIndex(indicesAffected.index) : 0),\n                        itemsContainer = this._site.tree[groupAffected].itemsContainer,\n                        itemsCount = getItemsContainerLength(itemsContainer),\n                        indexOffset = (this._groups ? this._groups[groupAffected].startIndex : 0),\n                        visibleRange = this._getVisibleRange();\n\n                    indicesAffected.index -= indexOffset;\n                    indicesAffected.insertAfterIndex -= indexOffset;\n                    visibleRange.firstIndex = Math.max(visibleRange.firstIndex - indexOffset - 1, 0);\n                    visibleRange.lastIndex = Math.min(visibleRange.lastIndex - indexOffset + 1, itemsCount);\n                    var indexAfter = Math.max(Math.min(itemsCount - 1, indicesAffected.insertAfterIndex), -1),\n                        indexBefore = Math.min(indexAfter + 1, itemsCount);\n\n                    if (dragInfo) {\n                        for (var i = indexAfter; i >= visibleRange.firstIndex; i--) {\n                            if (!dragInfo._isIncluded(i + indexOffset)) {\n                                indexAfter = i;\n                                break;\n                            } else if (i === visibleRange.firstIndex) {\n                                indexAfter = -1;\n                            }\n                        }\n\n                        for (var i = indexBefore; i < visibleRange.lastIndex; i++) {\n                            if (!dragInfo._isIncluded(i + indexOffset)) {\n                                indexBefore = i;\n                                break;\n                            } else if (i === (visibleRange.lastIndex - 1)) {\n                                indexBefore = itemsCount;\n                            }\n                        }\n                    }\n\n                    var elementBefore = containerFromIndex(itemsContainer, indexBefore),\n                        elementAfter = containerFromIndex(itemsContainer, indexAfter);\n\n                    if (this._animatedDragItems) {\n                        for (var i = 0, len = this._animatedDragItems.length; i < len; i++) {\n                            var item = this._animatedDragItems[i];\n                            if (item) {\n                                item.style[transitionScriptName] = this._site.animationsDisabled ? \"\" : dragBetweenTransition;\n                                item.style[transformNames.scriptName] = \"\";\n                            }\n                        }\n                    }\n                    this._animatedDragItems = [];\n                    var horizontal = this.orientation === \"horizontal\",\n                        inListMode = this._inListMode || this._itemsPerBar === 1;\n                    if (this._groups && this._groups[groupAffected] instanceof Groups.CellSpanningGroup) {\n                        inListMode = this._groups[groupAffected]._slotsPerColumn === 1;\n                    }\n                    var horizontalTransform = 0,\n                        verticalTransform = 0;\n                    // In general, items should slide in the direction perpendicular to the layout's orientation.\n                    // In a horizontal layout, items are laid out top to bottom, left to right. For any two neighboring items in this layout, we want to move the first item up and the second down\n                    // to denote that any inserted item would go between those two.\n                    // Similarily, vertical layout should have the first item move left and the second move right.\n                    // List layout is a special case. A horizontal list layout can only lay things out left to right, so it should slide the two items left and right like a vertical grid.\n                    // A vertical list can only lay things out top to bottom, so it should slide items up and down like a horizontal grid.\n                    // In other words: Apply horizontal transformations if we're a vertical grid or horizontal list, otherwise use vertical transformations.\n                    if ((!horizontal && !inListMode) || (horizontal && inListMode)) {\n                        horizontalTransform = this._site.rtl ? -dragBetweenDistance : dragBetweenDistance;\n                    } else {\n                        verticalTransform = dragBetweenDistance;\n                    }\n                    if (elementBefore) {\n                        elementBefore.style[transitionScriptName] = this._site.animationsDisabled ? \"\" : dragBetweenTransition;\n                        elementBefore.style[transformNames.scriptName] = \"translate(\" + horizontalTransform + \"px, \" + verticalTransform + \"px)\";\n                        this._animatedDragItems.push(elementBefore);\n                    }\n                    if (elementAfter) {\n                        elementAfter.style[transitionScriptName] = this._site.animationsDisabled ? \"\" : dragBetweenTransition;\n                        elementAfter.style[transformNames.scriptName] = \"translate(\" + (-horizontalTransform) + \"px, -\" + verticalTransform + \"px)\";\n                        this._animatedDragItems.push(elementAfter);\n                    }\n                },\n\n                dragLeave: function _LayoutCommon_dragLeave() {\n                    if (this._animatedDragItems) {\n                        for (var i = 0, len = this._animatedDragItems.length; i < len; i++) {\n                            this._animatedDragItems[i].style[transitionScriptName] = this._site.animationsDisabled ? \"\" : dragBetweenTransition;\n                            this._animatedDragItems[i].style[transformNames.scriptName] = \"\";\n                        }\n                    }\n                    this._animatedDragItems = [];\n                },\n\n                // Private methods\n\n                _setMaxRowsOrColumns: function _LayoutCommon_setMaxRowsOrColumns(value) {\n                    if (value === this._maxRowsOrColumns || this._inListMode) {\n                        return;\n                    }\n\n                    // If container size is unavailable then we do not need to compute itemsPerBar\n                    // as it will be computed along with the container size.\n                    if (this._sizes && this._sizes.containerSizeLoaded) {\n                        this._itemsPerBar = Math.floor(this._sizes.maxItemsContainerContentSize / this._sizes.containerCrossSize);\n                        if (value) {\n                            this._itemsPerBar = Math.min(this._itemsPerBar, value);\n                        }\n                        this._itemsPerBar = Math.max(1, this._itemsPerBar);\n                    }\n                    this._maxRowsOrColumns = value;\n\n                    this._invalidateLayout();\n                },\n\n                _getItemPosition: function _LayoutCommon_getItemPosition(itemIndex) {\n                    if (this._groupsEnabled) {\n                        var groupIndex = Math.min(this._groups.length - 1, this._site.groupIndexFromItemIndex(itemIndex)),\n                            group = this._groups[groupIndex],\n                            itemOfGroupIndex = itemIndex - group.startIndex;\n                        return this._getItemPositionForAnimations(itemIndex, groupIndex, itemOfGroupIndex);\n                    } else {\n                        return this._getItemPositionForAnimations(itemIndex, 0, itemIndex);\n                    }\n                },\n\n                _getRealizationRange: function _LayoutCommon_getRealizationRange() {\n                    var realizedRange = this._site.realizedRange;\n                    return {\n                        firstIndex: this._firstItemFromRange(realizedRange.firstPixel),\n                        lastIndex: this._lastItemFromRange(realizedRange.lastPixel)\n                    };\n                },\n\n                _getVisibleRange: function _LayoutCommon_getVisibleRange() {\n                    var visibleRange = this._site.visibleRange;\n                    return {\n                        firstIndex: this._firstItemFromRange(visibleRange.firstPixel),\n                        lastIndex: this._lastItemFromRange(visibleRange.lastPixel)\n                    };\n                },\n\n                _resetAnimationCaches: function _LayoutCommon_resetAnimationCaches(skipReset) {\n                    if (!skipReset) {\n                        // Caches with move transforms:\n                        this._resetStylesForRecords(this._cachedGroupRecords);\n                        this._resetStylesForRecords(this._cachedItemRecords);\n                        this._resetStylesForRecords(this._cachedHeaderRecords);\n\n                        // Caches with insert transforms:\n                        this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords);\n                        this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);\n\n                        // Caches with insert transforms:\n                        this._resetStylesForRemovedRecords(this._cachedRemovedItems);\n                        this._resetStylesForRemovedRecords(this._cachedRemovedHeaders);\n\n                        var itemsBlockKeys = Object.keys(this._animatingItemsBlocks);\n                        for (var i = 0, len = itemsBlockKeys.length; i < len; i++) {\n                            var itemsBlock = this._animatingItemsBlocks[itemsBlockKeys[i]];\n                            itemsBlock.style.overflow = '';\n                            itemsBlock.classList.remove(_Constants._clipClass);\n                        }\n                    }\n\n                    this._cachedGroupRecords = {};\n                    this._cachedItemRecords = {};\n                    this._cachedHeaderRecords = {};\n\n                    this._cachedInsertedItemRecords = {};\n                    this._cachedInsertedHeaderRecords = {};\n\n                    this._cachedRemovedItems = [];\n                    this._cachedRemovedHeaders = [];\n\n                    this._animatingItemsBlocks = {};\n                },\n\n                _cacheRemovedElements: function _LayoutCommon_cacheRemovedElements(modifiedElements, cachedRecords, cachedInsertedRecords, removedElements, areHeaders) {\n                    var leftStr = \"left\";\n                    if (this._site.rtl) {\n                        leftStr = \"right\";\n                    }\n                    // Offset between the container's content box and its margin box\n                    var outerX, outerY;\n                    if (areHeaders) {\n                        outerX = this._sizes.headerContainerOuterX;\n                        outerY = this._sizes.headerContainerOuterY;\n                    } else {\n                        outerX = this._sizes.containerMargins[leftStr];\n                        outerY = this._sizes.containerMargins.top;\n                    }\n\n                    // Cache the removed boxes and place them back in the DOM with position absolute\n                    // so that they do not appear like they have moved.\n                    for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                        var modifiedElementLookup = modifiedElements[i];\n                        if (modifiedElementLookup.newIndex === -1) {\n                            var container = modifiedElementLookup.element;\n                            var cachedItemRecord = cachedRecords[modifiedElementLookup.oldIndex];\n                            if (cachedItemRecord) {\n                                cachedItemRecord.element = container;\n                                // This item can no longer be a moved item.\n                                delete cachedRecords[modifiedElementLookup.oldIndex];\n                                container.style.position = \"absolute\";\n                                container.style[transitionScriptName] = \"\";\n                                container.style.top = cachedItemRecord.oldTop - outerY + \"px\";\n                                container.style[leftStr] = cachedItemRecord.oldLeft - outerX + \"px\";\n                                container.style.width = cachedItemRecord.width + \"px\";\n                                container.style.height = cachedItemRecord.height + \"px\";\n                                container.style[transformNames.scriptName] = \"\";\n                                this._site.surface.appendChild(container);\n                                removedElements.push(cachedItemRecord);\n                            }\n                            if (cachedInsertedRecords[modifiedElementLookup.oldIndex]) {\n                                delete cachedInsertedRecords[modifiedElementLookup.oldIndex];\n                            }\n                        }\n                    }\n                },\n                _cacheInsertedElements: function _LayoutCommon_cacheInsertedItems(modifiedElements, cachedInsertedRecords, cachedRecords) {\n                    var newCachedInsertedRecords = {};\n\n                    for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                        var modifiedElementLookup = modifiedElements[i];\n                        var wasInserted = cachedInsertedRecords[modifiedElementLookup.oldIndex];\n                        if (wasInserted) {\n                            delete cachedInsertedRecords[modifiedElementLookup.oldIndex];\n                        }\n\n                        if (wasInserted || modifiedElementLookup.oldIndex === -1 || modifiedElementLookup.moved) {\n                            var cachedRecord = cachedRecords[modifiedElementLookup.newIndex];\n                            if (cachedRecord) {\n                                delete cachedRecords[modifiedElementLookup.newIndex];\n                            }\n\n                            var modifiedElement = modifiedElementLookup.element;\n                            newCachedInsertedRecords[modifiedElementLookup.newIndex] = modifiedElement;\n                            modifiedElement.style[transitionScriptName] = \"\";\n                            modifiedElement.style[transformNames.scriptName] = \"\";\n                            modifiedElement.style.opacity = 0;\n                        }\n                    }\n\n                    var keys = Object.keys(cachedInsertedRecords);\n                    for (var i = 0, len = keys.length; i < len; i++) {\n                        newCachedInsertedRecords[keys[i]] = cachedInsertedRecords[keys[i]];\n                    }\n\n                    return newCachedInsertedRecords;\n                },\n                _resetStylesForRecords: function _LayoutCommon_resetStylesForRecords(recordsHash) {\n                    var recordKeys = Object.keys(recordsHash);\n                    for (var i = 0, len = recordKeys.length; i < len; i++) {\n                        var record = recordsHash[recordKeys[i]];\n                        if (record.needsToResetTransform) {\n                            record.element.style[transformNames.scriptName] = \"\";\n                            record.needsToResetTransform = false;\n                        }\n                    }\n                },\n                _resetStylesForInsertedRecords: function _LayoutCommon_resetStylesForInsertedRecords(insertedRecords) {\n                    var insertedRecordKeys = Object.keys(insertedRecords);\n                    for (var i = 0, len = insertedRecordKeys.length; i < len; i++) {\n                        var insertedElement = insertedRecords[insertedRecordKeys[i]];\n                        insertedElement.style.opacity = 1;\n                    }\n                },\n                _resetStylesForRemovedRecords: function _LayoutCommon_resetStylesForRemovedRecords(removedElements) {\n                    for (var i = 0, len = removedElements.length; i < len; i++) {\n                        var container = removedElements[i].element;\n                        if (container.parentNode) {\n                            _Dispose._disposeElement(container);\n                            container.parentNode.removeChild(container);\n                        }\n                    }\n                },\n                _updateAnimationCache: function _LayoutCommon_updateAnimationCache(modifiedItems, modifiedGroups) {\n                    // ItemBoxes can change containers so we have to start them back without transforms\n                    // and then update them again. ItemsContainers don't need to do this.\n                    this._resetStylesForRecords(this._cachedItemRecords);\n                    this._resetStylesForRecords(this._cachedHeaderRecords);\n                    // Go through all the inserted records and reset their insert transforms.\n                    this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords);\n                    this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);\n\n                    var existingContainers = {};\n                    var realizationRange = this._getRealizationRange();\n                    var tree = this._site.tree;\n                    for (var i = 0, itemIndex = 0, treeLength = tree.length; i < treeLength; i++) {\n                        forEachContainer(tree[i].itemsContainer, function (container) {\n                            if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {\n                                existingContainers[uniqueID(container)] = true;\n                            }\n                            itemIndex++;\n                        });\n                    }\n\n                    // Update the indicies before the insert since insert needs the new containers.\n                    function updateIndicies(modifiedElements, cachedRecords) {\n                        var updatedCachedRecords = {};\n\n                        for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                            var modifiedElementLookup = modifiedElements[i];\n                            var cachedRecord = cachedRecords[modifiedElementLookup.oldIndex];\n                            if (cachedRecord) {\n                                updatedCachedRecords[modifiedElementLookup.newIndex] = cachedRecord;\n                                cachedRecord.element = modifiedElementLookup.element;\n                                delete cachedRecords[modifiedElementLookup.oldIndex];\n                            }\n                        }\n                        var cachedRecordKeys = Object.keys(cachedRecords);\n                        for (var i = 0, len = cachedRecordKeys.length; i < len; i++) {\n                            var key = cachedRecordKeys[i],\n                                record = cachedRecords[key];\n                            // We need to filter out containers which were removed from the DOM. If container's item\n                            // wasn't realized container can be removed without adding record to modifiedItems.\n                            if (!record.element || existingContainers[uniqueID(record.element)]) {\n                                updatedCachedRecords[key] = record;\n                            }\n                        }\n                        return updatedCachedRecords;\n                    }\n\n                    this._cachedItemRecords = updateIndicies(modifiedItems, this._cachedItemRecords);\n                    this._cachedHeaderRecords = updateIndicies(modifiedGroups, this._cachedHeaderRecords);\n\n                    this._cachedInsertedItemRecords = this._cacheInsertedElements(modifiedItems, this._cachedInsertedItemRecords, this._cachedItemRecords);\n                    this._cachedInsertedHeaderRecords = this._cacheInsertedElements(modifiedGroups, this._cachedInsertedHeaderRecords, this._cachedHeaderRecords);\n                },\n                _filterRemovedElements: function _LayoutCommon_filterRemovedElements() {\n                    this._removedElements = [];\n\n                    if (this._site.animationsDisabled) {\n                        this._resetStylesForRemovedRecords(this._cachedRemovedItems);\n                        this._resetStylesForRemovedRecords(this._cachedRemovedHeaders);\n                        return;\n                    }\n\n                    var that = this;\n                    var oldLeftStr = this.orientation === \"horizontal\" ? \"oldLeft\" : \"oldTop\";\n                    var widthStr = this.orientation === \"horizontal\" ? \"width\" : \"height\";\n\n                    var visibleFirstPixel = this._site.scrollbarPos;\n                    var visibleLastPixel = visibleFirstPixel + this._site.viewportSize[widthStr] - 1;\n\n                    function filterRemovedElements(removedRecordArray, removedElementsArray) {\n                        for (var i = 0, len = removedRecordArray.length; i < len; i++) {\n                            var removedItem = removedRecordArray[i];\n                            var container = removedItem.element;\n                            if (removedItem[oldLeftStr] + removedItem[widthStr] - 1 < visibleFirstPixel || removedItem[oldLeftStr] > visibleLastPixel || !that._site.viewport.contains(container)) {\n                                if (container.parentNode) {\n                                    _Dispose._disposeElement(container);\n                                    container.parentNode.removeChild(container);\n                                }\n                            } else {\n                                removedElementsArray.push(container);\n                            }\n                        }\n                    }\n\n                    filterRemovedElements(this._cachedRemovedItems, this._removedElements);\n                    filterRemovedElements(this._cachedRemovedHeaders, this._removedElements);\n                },\n\n                _filterInsertedElements: function _LayoutCommon_filterInsertedElements() {\n                    this._insertedElements = [];\n                    if (this._site.animationsDisabled) {\n                        this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords);\n                        this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);\n                        return;\n                    }\n\n                    var that = this;\n                    var visibleRange = this._getVisibleRange();\n\n                    function filterInsertedElements(cachedInsertedRecords, insertedElementsArray) {\n                        var recordKeys = Object.keys(cachedInsertedRecords);\n                        for (var i = 0, len = recordKeys.length; i < len; i++) {\n                            var itemIndex = recordKeys[i];\n                            var insertedRecord = cachedInsertedRecords[itemIndex];\n                            if (itemIndex < visibleRange.firstIndex || itemIndex > visibleRange.lastIndex || that._site.viewport.contains(insertedRecord.element)) {\n                                insertedRecord.style.opacity = 1;\n                            } else {\n                                insertedElementsArray.push(insertedRecord);\n                            }\n                        }\n                    }\n\n                    filterInsertedElements(this._cachedInsertedItemRecords, this._insertedElements);\n                    filterInsertedElements(this._cachedInsertedHeaderRecords, this._insertedElements);\n                },\n\n                _filterMovedElements: function _LayoutCommon_filterMovedElements() {\n                    var that = this;\n\n                    // This filters all the items and groups down which could have moved to just the items on screen.\n                    // The items which are not going to animate are immediately shown in their correct final location.\n                    var oldLeftStr = this.orientation === \"horizontal\" ? \"oldLeft\" : \"oldTop\";\n                    var leftStr = this.orientation === \"horizontal\" ? \"left\" : \"top\";\n                    var widthStr = this.orientation === \"horizontal\" ? \"width\" : \"height\";\n\n                    var realizationRange = this._getRealizationRange();\n                    var visibleFirstPixel = this._site.scrollbarPos;\n                    var visibleLastPixel = visibleFirstPixel + this._site.viewportSize[widthStr] - 1;\n\n                    // ItemMove can reflow across column or fade in/out due to multisize.\n                    this._itemMoveRecords = [];\n                    this._moveRecords = [];\n\n                    if (!this._site.animationsDisabled) {\n                        var tree = this._site.tree;\n                        var itemIndex = 0;\n                        for (var i = 0, treeLength = tree.length; i < treeLength; i++) {\n                            var groupBundle = tree[i];\n                            var groupHasItemToAnimate = false;\n\n                            forEachContainer(groupBundle.itemsContainer, function () {\n                                if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {\n                                    var cachedItemRecord = this._cachedItemRecords[itemIndex];\n                                    if (cachedItemRecord) {\n                                        var shouldAnimate = ((cachedItemRecord[oldLeftStr] + cachedItemRecord[widthStr] - 1 >= visibleFirstPixel && cachedItemRecord[oldLeftStr] <= visibleLastPixel) ||\n                                                            (cachedItemRecord[leftStr] + cachedItemRecord[widthStr] - 1 >= visibleFirstPixel && cachedItemRecord[leftStr] <= visibleLastPixel)) &&\n                                                            that._site.viewport.contains(cachedItemRecord.element);\n                                        if (shouldAnimate) {\n                                            groupHasItemToAnimate = true;\n                                            if (cachedItemRecord.needsToResetTransform) {\n                                                this._itemMoveRecords.push(cachedItemRecord);\n                                                delete this._cachedItemRecords[itemIndex];\n                                            }\n                                        }\n                                    }\n                                }\n                                itemIndex++;\n                            }.bind(this));\n\n                            var groupIndex = i;\n                            var cachedHeaderRecord = this._cachedHeaderRecords[groupIndex];\n                            if (cachedHeaderRecord) {\n                                if (groupHasItemToAnimate && cachedHeaderRecord.needsToResetTransform) {\n                                    this._moveRecords.push(cachedHeaderRecord);\n                                    delete this._cachedHeaderRecords[groupIndex];\n                                }\n                            }\n\n                            var cachedGroupRecord = this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)];\n                            if (cachedGroupRecord) {\n                                if (groupHasItemToAnimate && cachedGroupRecord.needsToResetTransform) {\n                                    this._moveRecords.push(cachedGroupRecord);\n                                    delete this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)];\n                                }\n                            }\n                        }\n                    }\n\n                    // Reset transform for groups and items that were never on screen.\n                    this._resetStylesForRecords(this._cachedGroupRecords);\n                    this._resetStylesForRecords(this._cachedItemRecords);\n                    this._resetStylesForRecords(this._cachedHeaderRecords);\n                },\n\n                _getItemPositionForAnimations: function _LayoutCommon_getItemPositionForAnimations(itemIndex, groupIndex, itemOfGroupIndex) {\n                    // Top/Left are used to know if the item has moved and also used to position the item if removed.\n                    // Row/Column are used to know if a reflow animation should occur\n                    // Height/Width are used when positioning a removed item without impacting layout.\n                    // The returned rectangle refers to the win-container's border/padding/content box. Coordinates\n                    // are relative to the viewport.\n                    var group = this._groups[groupIndex];\n                    var itemPosition = group.getItemPositionForAnimations(itemOfGroupIndex);\n                    var groupOffset = (this._groups[groupIndex] ? this._groups[groupIndex].offset : 0);\n                    var headerWidth = (this._groupsEnabled && this._groupHeaderPosition === HeaderPosition.left ? this._sizes.headerContainerWidth : 0);\n                    var headerHeight = (this._groupsEnabled && this._groupHeaderPosition === HeaderPosition.top ? this._sizes.headerContainerHeight : 0);\n\n                    itemPosition.left += this._sizes.layoutOriginX + headerWidth + this._sizes.itemsContainerOuterX;\n                    itemPosition.top += this._sizes.layoutOriginY + headerHeight + this._sizes.itemsContainerOuterY;\n                    itemPosition[this._horizontal ? \"left\" : \"top\"] += groupOffset;\n                    return itemPosition;\n                },\n\n                _getHeaderPositionForAnimations: function (groupIndex) {\n                    // Top/Left are used to know if the item has moved.\n                    // Height/Width are used when positioning a removed item without impacting layout.\n                    // The returned rectangle refers to the header container's content box. Coordinates\n                    // are relative to the viewport.\n\n                    var headerPosition;\n\n                    if (this._groupsEnabled) {\n                        var width = this._sizes.headerContainerWidth - this._sizes.headerContainerOuterWidth,\n                            height = this._sizes.headerContainerHeight - this._sizes.headerContainerOuterHeight;\n                        if (this._groupHeaderPosition === HeaderPosition.left && !this._horizontal) {\n                            height = this._groups[groupIndex].getItemsContainerSize() - this._sizes.headerContainerOuterHeight;\n                        } else if (this._groupHeaderPosition === HeaderPosition.top && this._horizontal) {\n                            width = this._groups[groupIndex].getItemsContainerSize() - this._sizes.headerContainerOuterWidth;\n                        }\n\n                        var offsetX = this._horizontal ? this._groups[groupIndex].offset : 0,\n                            offsetY = this._horizontal ? 0 : this._groups[groupIndex].offset;\n                        headerPosition = {\n                            top: this._sizes.layoutOriginY + offsetY + this._sizes.headerContainerOuterY,\n                            left: this._sizes.layoutOriginX + offsetX + this._sizes.headerContainerOuterX,\n                            height: height,\n                            width: width\n                        };\n                    } else {\n                        headerPosition = {\n                            top: 0,\n                            left: 0,\n                            height: 0,\n                            width: 0\n                        };\n                    }\n                    return headerPosition;\n                },\n\n                _rangeContainsItems: function _LayoutCommon_rangeContainsItems(firstPixel, lastPixel) {\n                    if (this._groups.length === 0) {\n                        return false;\n                    } else {\n                        var lastGroup = this._groups[this._groups.length - 1],\n                            lastPixelOfLayout = this._sizes.layoutOrigin + lastGroup.offset + this._getGroupSize(lastGroup) - 1;\n\n                        return lastPixel >= 0 && firstPixel <= lastPixelOfLayout;\n                    }\n                },\n\n                _itemFromOffset: function _LayoutCommon_itemFromOffset(offset, options) {\n                    // supported options are:\n                    // - wholeItem: when set to true the fully visible item is returned\n                    // - last: if 1 the last item is returned. if 0 the first\n                    var that = this;\n                    if (this._groups.length === 0) {\n                        return 0;\n                    }\n\n                    function assignItemMargins(offset) {\n                        if (!options.wholeItem) {\n                            // This makes it such that if a container's margin is on screen but all of its\n                            // content is off screen then we'll treat the container as being off screen.\n                            var marginPropLast = (that._horizontal ? (that._site.rtl ? \"right\" : \"left\") : \"top\"),\n                                marginPropFirst = (that._horizontal ? (that._site.rtl ? \"left\" : \"right\") : \"bottom\");\n                            if (options.last) {\n                                // When looking for the *last* item, treat all container margins\n                                // as belonging to the container *before* the margin.\n                                return offset - that._sizes.containerMargins[marginPropLast];\n                            } else {\n                                // When looking for the *first* item, treat all container margins\n                                // as belonging to the container *after* the margin.\n                                return offset + that._sizes.containerMargins[marginPropFirst];\n                            }\n                        }\n                        return offset;\n                    }\n\n                    // Assign the headers and margins to the appropriate groups.\n                    function assignGroupMarginsAndHeaders(offset) {\n                        if (options.last) {\n                            // When looking for the *last* group, the *trailing* header and margin belong to the group.\n                            return offset - that._getHeaderSizeGroupAdjustment() - that._sizes.itemsContainerOuterStart;\n                        } else {\n                            // When looking for the *first* group, the *leading* header and margin belong to the group.\n                            // No need to make any adjustments to offset because the correct header and margin\n                            // already belong to the group.\n                            return offset;\n                        }\n                    }\n\n                    options = options || {};\n\n                    // Make offset relative to layout's content box\n                    offset -= this._sizes.layoutOrigin;\n\n                    offset = assignItemMargins(offset);\n\n                    var groupIndex = this._groupFromOffset(assignGroupMarginsAndHeaders(offset)),\n                        group = this._groups[groupIndex];\n\n                    // Make offset relative to the margin box of the group's items container\n                    offset -= group.offset;\n                    offset -= this._getHeaderSizeGroupAdjustment();\n\n                    return group.startIndex + group.itemFromOffset(offset, options);\n                },\n\n                _firstItemFromRange: function _LayoutCommon_firstItemFromRange(firstPixel, options) {\n                    // supported options are:\n                    // - wholeItem: when set to true the first fully visible item is returned\n                    options = options || {};\n                    options.last = 0;\n                    return this._itemFromOffset(firstPixel, options);\n                },\n\n                _lastItemFromRange: function _LayoutCommon_lastItemFromRange(lastPixel, options) {\n                    // supported options are:\n                    // - wholeItem: when set to true the last fully visible item is returned\n                    options = options || {};\n                    options.last = 1;\n                    return this._itemFromOffset(lastPixel, options);\n                },\n\n                _adjustedKeyForRTL: function _LayoutCommon_adjustedKeyForRTL(key) {\n                    if (this._site.rtl) {\n                        if (key === Key.leftArrow) {\n                            key = Key.rightArrow;\n                        } else if (key === Key.rightArrow) {\n                            key = Key.leftArrow;\n                        }\n                    }\n                    return key;\n                },\n\n                _adjustedKeyForOrientationAndBars: function _LayoutCommon_adjustedKeyForOrientationAndBars(key, cellSpanningGroup) {\n                    var newKey = key;\n\n                    // Don't support cell spanning\n                    if (cellSpanningGroup) {\n                        return key;\n                    }\n                    // First, convert the key into a virtual form based off of horizontal layouts.\n                    // In a horizontal layout, left/right keys switch between columns (AKA \"bars\"), and\n                    // up/down keys switch between rows (AKA \"slots\").\n                    // In vertical mode, we want up/down to switch between rows (AKA \"bars\" when vertical),\n                    // and left/right to switch between columns (AKA \"slots\" when vertical).\n                    // The first step is to convert keypresses in vertical so that up/down always correspond to moving between slots,\n                    // and left/right moving between bars.\n                    if (!this._horizontal) {\n                        switch (newKey) {\n                            case Key.leftArrow:\n                                newKey = Key.upArrow;\n                                break;\n                            case Key.rightArrow:\n                                newKey = Key.downArrow;\n                                break;\n                            case Key.upArrow:\n                                newKey = Key.leftArrow;\n                                break;\n                            case Key.downArrow:\n                                newKey = Key.rightArrow;\n                                break;\n                        }\n                    }\n\n                    // Next, if we only have one item per bar, we'll make the change-slots-key the same as the change-bars-key\n                    if (this._itemsPerBar === 1) {\n                        if (newKey === Key.upArrow) {\n                            newKey = Key.leftArrow;\n                        } else if (newKey === Key.downArrow) {\n                            newKey = Key.rightArrow;\n                        }\n                    }\n\n                    return newKey;\n                },\n\n                _getAdjacentForPageKeys: function _LayoutCommon_getAdjacentForPageKeys(currentItem, pressedKey) {\n                    var containerMargins = this._sizes.containerMargins,\n                        marginSum = (this.orientation === \"horizontal\" ?\n                            containerMargins.left + containerMargins.right :\n                            containerMargins.top + containerMargins.bottom);\n\n                    var viewportLength = this._site.viewportSize[this.orientation === \"horizontal\" ? \"width\" : \"height\"],\n                        firstPixel = this._site.scrollbarPos,\n                        lastPixel = firstPixel + viewportLength - 1 - containerMargins[(this.orientation === \"horizontal\" ? \"right\" : \"bottom\")],\n                        newFocus;\n\n                    // Handles page up by attempting to choose the first fully visible item\n                    // on the current page. If that item already has focus, chooses the\n                    // first item on the previous page. Page down is handled similarly.\n\n                    var firstIndex = this._firstItemFromRange(firstPixel, { wholeItem: true }),\n                        lastIndex = this._lastItemFromRange(lastPixel, { wholeItem: false }),\n                        currentItemPosition = this._getItemPosition(currentItem.index);\n\n\n                    var offscreen = false;\n                    if (currentItem.index < firstIndex || currentItem.index > lastIndex) {\n                        offscreen = true;\n                        if (this.orientation === \"horizontal\") {\n                            firstPixel = currentItemPosition.left - marginSum;\n                        } else {\n                            firstPixel = currentItemPosition.top - marginSum;\n                        }\n                        lastPixel = firstPixel + viewportLength - 1;\n                        firstIndex = this._firstItemFromRange(firstPixel, { wholeItem: true });\n                        lastIndex = this._lastItemFromRange(lastPixel, { wholeItem: false });\n                    }\n\n                    if (pressedKey === Key.pageUp) {\n                        if (!offscreen && firstIndex !== currentItem.index) {\n                            return { type: _UI.ObjectType.item, index: firstIndex };\n                        }\n                        var end;\n                        if (this.orientation === \"horizontal\") {\n                            end = currentItemPosition.left + currentItemPosition.width + marginSum + containerMargins.left;\n                        } else {\n                            end = currentItemPosition.top + currentItemPosition.height + marginSum + containerMargins.bottom;\n                        }\n                        var firstIndexOnPrevPage = this._firstItemFromRange(end - viewportLength, { wholeItem: true });\n                        if (currentItem.index === firstIndexOnPrevPage) {\n                            // The current item is so big that it spanned from the previous page, so we want to at least\n                            // move to the previous item.\n                            newFocus = Math.max(0, currentItem.index - this._itemsPerBar);\n                        } else {\n                            newFocus = firstIndexOnPrevPage;\n                        }\n                    } else {\n                        if (!offscreen && lastIndex !== currentItem.index) {\n                            return { type: _UI.ObjectType.item, index: lastIndex };\n                        }\n                        // We need to subtract twice the marginSum from the item's starting position because we need to\n                        // consider that ensureVisible will scroll the viewport to include the new items margin as well\n                        // which may push the current item just off screen.\n                        var start;\n                        if (this.orientation === \"horizontal\") {\n                            start = currentItemPosition.left - marginSum - containerMargins.right;\n                        } else {\n                            start = currentItemPosition.top - marginSum - containerMargins.bottom;\n                        }\n                        var lastIndexOnNextPage = Math.max(0, this._lastItemFromRange(start + viewportLength - 1, { wholeItem: true }));\n                        if (currentItem.index === lastIndexOnNextPage) {\n                            // The current item is so big that it spans across the next page, so we want to at least\n                            // move to the next item. It is also ok to blindly increment this index w/o bound checking\n                            // since the browse mode clamps the bounds for page keys. This way we do not have to\n                            // asynchronoulsy request the count here.\n                            newFocus = currentItem.index + this._itemsPerBar;\n                        } else {\n                            newFocus = lastIndexOnNextPage;\n                        }\n                    }\n\n                    return { type: _UI.ObjectType.item, index: newFocus };\n                },\n\n                _isCellSpanning: function _LayoutCommon_isCellSpanning(groupIndex) {\n                    var group = this._site.groupFromIndex(groupIndex),\n                        groupInfo = this._groupInfo;\n\n                    if (groupInfo) {\n                        return !!(typeof groupInfo === \"function\" ? groupInfo(group) : groupInfo).enableCellSpanning;\n                    } else {\n                        return false;\n                    }\n                },\n\n                // Can only be called after measuring has been completed\n                _getGroupInfo: function _LayoutCommon_getGroupInfo(groupIndex) {\n                    var group = this._site.groupFromIndex(groupIndex),\n                        groupInfo = this._groupInfo,\n                        margins = this._sizes.containerMargins,\n                        adjustedInfo = { enableCellSpanning: false };\n\n                    groupInfo = (typeof groupInfo === \"function\" ? groupInfo(group) : groupInfo);\n                    if (groupInfo) {\n                        if (groupInfo.enableCellSpanning && (+groupInfo.cellWidth !== groupInfo.cellWidth || +groupInfo.cellHeight !== groupInfo.cellHeight)) {\n                            throw new _ErrorFromName(\"WinJS.UI.GridLayout.GroupInfoResultIsInvalid\", strings.groupInfoResultIsInvalid);\n                        }\n                        adjustedInfo = {\n                            enableCellSpanning: !!groupInfo.enableCellSpanning,\n                            cellWidth: groupInfo.cellWidth + margins.left + margins.right,\n                            cellHeight: groupInfo.cellHeight + margins.top + margins.bottom\n                        };\n                    }\n\n                    return adjustedInfo;\n                },\n\n                // itemIndex is optional\n                _getItemInfo: function _LayoutCommon_getItemInfo(itemIndex) {\n                    var result;\n                    if (!this._itemInfo || typeof this._itemInfo !== \"function\") {\n                        if (this._useDefaultItemInfo) {\n                            result = this._defaultItemInfo(itemIndex);\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.UI.GridLayout.ItemInfoIsInvalid\", strings.itemInfoIsInvalid);\n                        }\n                    } else {\n                        result = this._itemInfo(itemIndex);\n                    }\n                    return Promise.as(result).then(function (size) {\n                        if (!size || +size.width !== size.width || +size.height !== size.height) {\n                            throw new _ErrorFromName(\"WinJS.UI.GridLayout.ItemInfoIsInvalid\", strings.itemInfoIsInvalid);\n                        }\n                        return size;\n                    });\n                },\n\n                _defaultItemInfo: function _LayoutCommon_defaultItemInfo(itemIndex) {\n                    var that = this;\n                    return this._site.renderItem(this._site.itemFromIndex(itemIndex)).then(function (element) {\n                        that._elementsToMeasure[itemIndex] = {\n                            element: element\n                        };\n                        return that._measureElements();\n                    }).then(\n                        function () {\n                            var entry = that._elementsToMeasure[itemIndex],\n                                size = {\n                                    width: entry.width,\n                                    height: entry.height\n                                };\n\n                            delete that._elementsToMeasure[itemIndex];\n                            return size;\n                        },\n                        function (error) {\n                            delete that._elementsToMeasure[itemIndex];\n                            return Promise.wrapError(error);\n                        }\n                    );\n                },\n\n                _getGroupSize: function _LayoutCommon_getGroupSize(group) {\n                    var headerContainerMinSize = 0;\n\n                    if (this._groupsEnabled) {\n                        if (this._horizontal && this._groupHeaderPosition === HeaderPosition.top) {\n                            headerContainerMinSize = this._sizes.headerContainerMinWidth;\n                        } else if (!this._horizontal && this._groupHeaderPosition === HeaderPosition.left) {\n                            headerContainerMinSize = this._sizes.headerContainerMinHeight;\n                        }\n                    }\n                    return Math.max(headerContainerMinSize, group.getItemsContainerSize() + this._getHeaderSizeGroupAdjustment());\n                },\n\n                // offset should be relative to the grid layout's content box\n                _groupFromOffset: function _LayoutCommon_groupFromOffset(offset) {\n                    return offset < this._groups[0].offset ?\n                        0 :\n                        this._groupFrom(function (group) {\n                            return offset < group.offset;\n                        });\n                },\n\n                _groupFromImpl: function _LayoutCommon_groupFromImpl(fromGroup, toGroup, comp) {\n                    if (toGroup < fromGroup) {\n                        return null;\n                    }\n\n                    var center = fromGroup + Math.floor((toGroup - fromGroup) / 2),\n                        centerGroup = this._groups[center];\n\n                    if (comp(centerGroup, center)) {\n                        return this._groupFromImpl(fromGroup, center - 1, comp);\n                    } else if (center < toGroup && !comp(this._groups[center + 1], center + 1)) {\n                        return this._groupFromImpl(center + 1, toGroup, comp);\n                    } else {\n                        return center;\n                    }\n                },\n\n                _groupFrom: function _LayoutCommon_groupFrom(comp) {\n                    if (this._groups.length > 0) {\n                        var lastGroupIndex = this._groups.length - 1,\n                            lastGroup = this._groups[lastGroupIndex];\n\n                        if (!comp(lastGroup, lastGroupIndex)) {\n                            return lastGroupIndex;\n                        } else {\n                            return this._groupFromImpl(0, this._groups.length - 1, comp);\n                        }\n                    } else {\n                        return null;\n                    }\n                },\n\n                _invalidateLayout: function _LayoutCommon_invalidateLayout() {\n                    if (this._site) {\n                        this._site.invalidateLayout();\n                    }\n                },\n\n                _resetMeasurements: function _LayoutCommon_resetMeasurements() {\n                    if (this._measuringPromise) {\n                        this._measuringPromise.cancel();\n                        this._measuringPromise = null;\n                    }\n                    if (this._containerSizeClassName) {\n                        _ElementUtilities.removeClass(this._site.surface, this._containerSizeClassName);\n                        deleteDynamicCssRule(this._containerSizeClassName);\n                        this._containerSizeClassName = null;\n                    }\n                    this._sizes = null;\n                    this._resetAnimationCaches();\n                },\n\n                _measureElements: function _LayoutCommon_measureElements() {\n                    // batching measurements to minimalize number of layout passes\n                    if (!this._measuringElements) {\n                        var that = this;\n                        // Schedule a job so that:\n                        //  1. Calls to _measureElements are batched.\n                        //  2. that._measuringElements is set before the promise handler is executed\n                        //     (that._measuringElements is used within the handler).\n                        that._measuringElements = Scheduler.schedulePromiseHigh(null, \"WinJS.UI.GridLayout._measuringElements\").then(\n                            function measure() {\n                                that._site._writeProfilerMark(\"_measureElements,StartTM\");\n\n                                var surface = that._createMeasuringSurface(),\n                                    itemsContainer = _Global.document.createElement(\"div\"),\n                                    site = that._site,\n                                    measuringElements = that._measuringElements,\n                                    elementsToMeasure = that._elementsToMeasure,\n                                    stopMeasuring = false;\n\n                                itemsContainer.className = _Constants._itemsContainerClass + \" \" + _Constants._laidOutClass;\n                                // This code is executed by CellSpanningGroups where styling is configured for –ms-grid. Let's satisfy these assumptions\n                                itemsContainer.style.cssText +=\n                                        \";display: -ms-grid\" +\n                                        \";-ms-grid-column: 1\" +\n                                        \";-ms-grid-row: 1\";\n\n                                var keys = Object.keys(elementsToMeasure),\n                                    len,\n                                    i;\n\n                                for (i = 0, len = keys.length; i < len; i++) {\n                                    var element = elementsToMeasure[keys[i]].element;\n                                    element.style[\"-ms-grid-column\"] = i + 1;\n                                    element.style[\"-ms-grid-row\"] = i + 1;\n                                    itemsContainer.appendChild(element);\n                                }\n\n                                surface.appendChild(itemsContainer);\n                                site.viewport.insertBefore(surface, site.viewport.firstChild);\n\n                                // Reading from the DOM may cause the app's resize handler to\n                                // be run synchronously which may invalidate this measuring\n                                // operation. When this happens, stop measuring.\n                                measuringElements.then(null, function () {\n                                    stopMeasuring = true;\n                                });\n\n                                for (i = 0, len = keys.length; i < len && !stopMeasuring; i++) {\n                                    var entry = elementsToMeasure[keys[i]],\n                                        item = entry.element.querySelector(\".\" + _Constants._itemClass);\n\n                                    entry.width = _ElementUtilities.getTotalWidth(item);\n                                    entry.height = _ElementUtilities.getTotalHeight(item);\n\n                                }\n\n                                if (surface.parentNode) {\n                                    surface.parentNode.removeChild(surface);\n                                }\n                                if (measuringElements === that._measuringElements) {\n                                    that._measuringElements = null;\n                                }\n\n                                site._writeProfilerMark(\"_measureElements,StopTM\");\n                            },\n                            function (error) {\n                                that._measuringElements = null;\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    }\n                    return this._measuringElements;\n                },\n\n                _ensureEnvInfo: function _LayoutCommon_ensureEnvInfo() {\n                    if (!this._envInfo) {\n                        this._envInfo = getEnvironmentSupportInformation(this._site);\n                        if (this._envInfo && !this._envInfo.supportsCSSGrid) {\n                            _ElementUtilities.addClass(this._site.surface, _Constants._noCSSGrid);\n                        }\n                    }\n                    return !!this._envInfo;\n                },\n\n                _createMeasuringSurface: function _LayoutCommon_createMeasuringSurface() {\n                    var surface = _Global.document.createElement(\"div\");\n\n                    surface.style.cssText =\n                        \"visibility: hidden\" +\n                        \";-ms-grid-columns: auto\" +\n                        \";-ms-grid-rows: auto\" +\n                        \";-ms-flex-align: start\" +\n                        \";-webkit-align-items: flex-start\" +\n                        \";align-items: flex-start\";\n                    surface.className = _Constants._scrollableClass + \" \" + (this._inListMode ? _Constants._listLayoutClass : _Constants._gridLayoutClass);\n                    if (!this._envInfo.supportsCSSGrid) {\n                        _ElementUtilities.addClass(surface, _Constants._noCSSGrid);\n                    }\n                    if (this._groupsEnabled) {\n                        if (this._groupHeaderPosition === HeaderPosition.top) {\n                            _ElementUtilities.addClass(surface, _Constants._headerPositionTopClass);\n                        } else {\n                            _ElementUtilities.addClass(surface, _Constants._headerPositionLeftClass);\n                        }\n                    }\n\n                    return surface;\n                },\n\n                // Assumes that the size of the item at the specified index is representative\n                // of the size of all items, measures it, and stores the measurements in\n                // this._sizes. If necessary, also:\n                // - Creates a CSS rule to give the containers a height and width\n                // - Stores the name associated with the rule in this._containerSizeClassName\n                // - Adds the class name associated with the rule to the surface\n                _measureItem: function _LayoutCommon_measureItem(index) {\n                    var that = this;\n                    var perfId = \"Layout:measureItem\";\n                    var site = that._site;\n                    var measuringPromise = that._measuringPromise;\n\n                    // itemPromise is optional. It is provided when taking a second attempt at measuring.\n                    function measureItemImpl(index, itemPromise) {\n                        var secondTry = !!itemPromise,\n                            elementPromises = {},\n                            itemPromise,\n                            left = site.rtl ? \"right\" : \"left\";\n\n                        return site.itemCount.then(function (count) {\n                            if (!count || (that._groupsEnabled && !site.groupCount)) {\n                                return Promise.cancel;\n                            }\n\n                            itemPromise = itemPromise || site.itemFromIndex(index);\n                            elementPromises.container = site.renderItem(itemPromise);\n                            if (that._groupsEnabled) {\n                                elementPromises.headerContainer = site.renderHeader(that._site.groupFromIndex(site.groupIndexFromItemIndex(index)));\n                            }\n\n                            return Promise.join(elementPromises);\n                        }).then(function (elements) {\n\n                            // Reading from the DOM is tricky because each read may trigger a resize handler which\n                            // may invalidate this layout object. To make it easier to minimize bugs in this edge case:\n                            //  1. All DOM reads for _LayoutCommon_measureItem should be contained within this function.\n                            //  2. This function should remain as simple as possible. Stick to DOM reads, avoid putting\n                            //     logic in here, and cache all needed instance variables at the top of the function.\n                            //\n                            // Returns null if the measuring operation was invalidated while reading from the DOM.\n                            // Otherwise, returns an object containing the measurements.\n                            function readMeasurementsFromDOM() {\n                                var horizontal = that._horizontal;\n                                var groupsEnabled = that._groupsEnabled;\n                                var stopMeasuring = false;\n\n                                // Reading from the DOM may cause the app's resize handler to\n                                // be run synchronously which may invalidate this measuring\n                                // operation. When this happens, stop measuring.\n                                measuringPromise.then(null, function () {\n                                    stopMeasuring = true;\n                                });\n\n                                var firstElementOnSurfaceMargins = getMargins(firstElementOnSurface);\n                                var firstElementOnSurfaceOffsetX = site.rtl ?\n                                    (site.viewport.offsetWidth - (firstElementOnSurface.offsetLeft + firstElementOnSurface.offsetWidth)) :\n                                    firstElementOnSurface.offsetLeft;\n                                var firstElementOnSurfaceOffsetY = firstElementOnSurface.offsetTop;\n                                var sizes = {\n                                    // These will be set by _viewportSizeChanged\n                                    viewportContentSize: 0,\n                                    surfaceContentSize: 0,\n                                    maxItemsContainerContentSize: 0,\n\n                                    surfaceOuterHeight: getOuterHeight(surface),\n                                    surfaceOuterWidth: getOuterWidth(surface),\n\n                                    // Origin of the grid layout's content in viewport coordinates\n                                    layoutOriginX: firstElementOnSurfaceOffsetX - firstElementOnSurfaceMargins[left],\n                                    layoutOriginY: firstElementOnSurfaceOffsetY - firstElementOnSurfaceMargins.top,\n                                    itemsContainerOuterHeight: getOuterHeight(itemsContainer),\n                                    itemsContainerOuterWidth: getOuterWidth(itemsContainer),\n                                    // Amount of space between the items container's margin and its content\n                                    itemsContainerOuterX: getOuter(site.rtl ? \"Right\" : \"Left\", itemsContainer),\n                                    itemsContainerOuterY: getOuter(\"Top\", itemsContainer),\n                                    itemsContainerMargins: getMargins(itemsContainer),\n\n                                    itemBoxOuterHeight: getOuterHeight(itemBox),\n                                    itemBoxOuterWidth: getOuterWidth(itemBox),\n                                    containerOuterHeight: getOuterHeight(elements.container),\n                                    containerOuterWidth: getOuterWidth(elements.container),\n                                    emptyContainerContentHeight: _ElementUtilities.getContentHeight(emptyContainer),\n                                    emptyContainerContentWidth: _ElementUtilities.getContentWidth(emptyContainer),\n\n                                    containerMargins: getMargins(elements.container),\n                                    // containerWidth/Height are computed when a uniform group is detected\n                                    containerWidth: 0,\n                                    containerHeight: 0,\n                                    // true when both containerWidth and containerHeight have been measured\n                                    containerSizeLoaded: false\n                                };\n\n                                if (site.header) {\n                                    sizes[(horizontal ? \"layoutOriginX\" : \"layoutOriginY\")] += _ElementUtilities[(horizontal ? \"getTotalWidth\" : \"getTotalHeight\")](site.header);\n                                }\n\n                                if (groupsEnabled) {\n                                    // Amount of space between the header container's margin and its content\n                                    sizes.headerContainerOuterX = getOuter(site.rtl ? \"Right\" : \"Left\", elements.headerContainer),\n                                    sizes.headerContainerOuterY = getOuter(\"Top\", elements.headerContainer),\n\n                                    sizes.headerContainerOuterWidth = getOuterWidth(elements.headerContainer);\n                                    sizes.headerContainerOuterHeight = getOuterHeight(elements.headerContainer);\n                                    sizes.headerContainerWidth = _ElementUtilities.getTotalWidth(elements.headerContainer);\n                                    sizes.headerContainerHeight = _ElementUtilities.getTotalHeight(elements.headerContainer);\n                                    sizes.headerContainerMinWidth = getDimension(elements.headerContainer, \"minWidth\") + sizes.headerContainerOuterWidth;\n                                    sizes.headerContainerMinHeight = getDimension(elements.headerContainer, \"minHeight\") + sizes.headerContainerOuterHeight;\n                                }\n\n                                var measurements = {\n                                    // Measurements which are needed after measureItem has returned.\n                                    sizes: sizes,\n\n                                    // Measurements which are only needed within measureItem.\n                                    viewportContentWidth: _ElementUtilities.getContentWidth(site.viewport),\n                                    viewportContentHeight: _ElementUtilities.getContentHeight(site.viewport),\n                                    containerContentWidth: _ElementUtilities.getContentWidth(elements.container),\n                                    containerContentHeight: _ElementUtilities.getContentHeight(elements.container),\n                                    containerWidth: _ElementUtilities.getTotalWidth(elements.container),\n                                    containerHeight: _ElementUtilities.getTotalHeight(elements.container)\n                                };\n                                measurements.viewportCrossSize = measurements[horizontal ? \"viewportContentHeight\" : \"viewportContentWidth\"];\n\n                                site.readyToMeasure();\n\n                                return stopMeasuring ? null : measurements;\n                            }\n\n                            function cleanUp() {\n                                if (surface.parentNode) {\n                                    surface.parentNode.removeChild(surface);\n                                }\n                            }\n\n                            var surface = that._createMeasuringSurface(),\n                                itemsContainer = _Global.document.createElement(\"div\"),\n                                emptyContainer = _Global.document.createElement(\"div\"),\n                                itemBox = elements.container.querySelector(\".\" + _Constants._itemBoxClass),\n                                groupIndex = site.groupIndexFromItemIndex(index);\n\n                            emptyContainer.className = _Constants._containerClass;\n                            itemsContainer.className = _Constants._itemsContainerClass + \" \" + _Constants._laidOutClass;\n                            // Use display=inline-block so that the width sizes to content when not in list mode.\n                            // When in grid mode, put items container and header container in different rows and columns so that the size of the items container does not affect the size of the header container and vice versa.\n                            // Use the same for list mode when headers are inline with item containers.\n                            // When headers are to the left of a vertical list, or above a horizontal list, put the rows/columns they would be in when laid out normally\n                            // into the CSS text for measuring. We have to do this because list item containers should take up 100% of the space left over in the surface\n                            // once the group's header is laid out.\n                            var itemsContainerRow = 1,\n                                itemsContainerColumn = 1,\n                                headerContainerRow = 2,\n                                headerContainerColumn = 2,\n                                firstElementOnSurface = itemsContainer,\n                                addHeaderFirst = false;\n                            if (that._inListMode && that._groupsEnabled) {\n                                if (that._horizontal && that._groupHeaderPosition === HeaderPosition.top) {\n                                    itemsContainerRow = 2;\n                                    headerContainerColumn = 1;\n                                    headerContainerRow = 1;\n                                    firstElementOnSurface = elements.headerContainer;\n                                    addHeaderFirst = true;\n                                } else if (!that._horizontal && that._groupHeaderPosition === HeaderPosition.left) {\n                                    itemsContainerColumn = 2;\n                                    headerContainerColumn = 1;\n                                    headerContainerRow = 1;\n                                    firstElementOnSurface = elements.headerContainer;\n                                    addHeaderFirst = true;\n                                }\n                            }\n                            // ListMode needs to use display block to proprerly measure items in vertical mode, and display flex to properly measure items in horizontal mode\n                            itemsContainer.style.cssText +=\n                                    \";display: \" + (that._inListMode ? ((that._horizontal ? \"flex\" : \"block\") + \"; overflow: hidden\") : \"inline-block\") +\n                                     \";vertical-align:top\" +\n                                    \";-ms-grid-column: \" + itemsContainerColumn +\n                                    \";-ms-grid-row: \" + itemsContainerRow;\n                            if (!that._inListMode) {\n                                elements.container.style.display = \"inline-block\";\n                            }\n                            if (that._groupsEnabled) {\n                                elements.headerContainer.style.cssText +=\n                                    \";display: inline-block\" +\n                                    \";-ms-grid-column: \" + headerContainerColumn +\n                                    \";-ms-grid-row: \" + headerContainerRow;\n                                _ElementUtilities.addClass(elements.headerContainer, _Constants._laidOutClass + \" \" + _Constants._groupLeaderClass);\n                                if ((that._groupHeaderPosition === HeaderPosition.top && that._horizontal) ||\n                                    (that._groupHeaderPosition === HeaderPosition.left && !that._horizontal)) {\n                                    _ElementUtilities.addClass(itemsContainer, _Constants._groupLeaderClass);\n                                }\n                            }\n                            if (addHeaderFirst) {\n                                surface.appendChild(elements.headerContainer);\n                            }\n\n                            itemsContainer.appendChild(elements.container);\n                            itemsContainer.appendChild(emptyContainer);\n\n                            surface.appendChild(itemsContainer);\n                            if (!addHeaderFirst && that._groupsEnabled) {\n                                surface.appendChild(elements.headerContainer);\n                            }\n                            site.viewport.insertBefore(surface, site.viewport.firstChild);\n\n                            var measurements = readMeasurementsFromDOM();\n\n                            if (!measurements) {\n                                // While reading from the DOM, the measuring operation was invalidated. Bail out.\n                                cleanUp();\n                                return Promise.cancel;\n                            } else if ((that._horizontal && measurements.viewportContentHeight === 0) || (!that._horizontal && measurements.viewportContentWidth === 0)) {\n                                // ListView is invisible so we can't measure. Return a canceled promise.\n                                cleanUp();\n                                return Promise.cancel;\n                            } else if (!secondTry && !that._isCellSpanning(groupIndex) &&\n                                    (measurements.containerContentWidth === 0 || measurements.containerContentHeight === 0)) {\n                                // win-container has no size. For backwards compatibility, wait for the item promise and then try measuring again.\n                                cleanUp();\n                                return itemPromise.then(function () {\n                                    return measureItemImpl(index, itemPromise);\n                                });\n                            } else {\n                                var sizes = that._sizes = measurements.sizes;\n\n                                // Wrappers for orientation-specific properties.\n                                // Sizes prefaced with \"cross\" refer to the sizes orthogonal to the current layout orientation. Sizes without a preface are in the orientation's direction.\n                                Object.defineProperties(sizes, {\n                                    surfaceOuterCrossSize: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.surfaceOuterHeight : sizes.surfaceOuterWidth);\n                                        },\n                                        enumerable: true\n                                    },\n                                    layoutOrigin: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.layoutOriginX : sizes.layoutOriginY);\n                                        },\n                                        enumerable: true\n                                    },\n                                    itemsContainerOuterSize: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.itemsContainerOuterWidth : sizes.itemsContainerOuterHeight);\n                                        },\n                                        enumerable: true\n                                    },\n                                    itemsContainerOuterCrossSize: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.itemsContainerOuterHeight : sizes.itemsContainerOuterWidth);\n                                        },\n                                        enumerable: true\n                                    },\n                                    itemsContainerOuterStart: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.itemsContainerOuterX : sizes.itemsContainerOuterY);\n                                        },\n                                        enumerable: true\n                                    },\n                                    itemsContainerOuterCrossStart: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.itemsContainerOuterY : sizes.itemsContainerOuterX);\n                                        },\n                                        enumerable: true\n                                    },\n                                    containerCrossSize: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.containerHeight : sizes.containerWidth);\n                                        },\n                                        enumerable: true\n                                    },\n                                    containerSize: {\n                                        get: function () {\n                                            return (that._horizontal ? sizes.containerWidth : sizes.containerHeight);\n                                        },\n                                        enumerable: true\n                                    },\n                                });\n\n                                // If the measured group is uniform, measure the container height\n                                // and width now. Otherwise, compute them thru itemInfo on demand (via _ensureContainerSize).\n                                if (!that._isCellSpanning(groupIndex)) {\n                                    if (that._inListMode) {\n                                        var itemsContainerContentSize = measurements.viewportCrossSize - sizes.surfaceOuterCrossSize - that._getHeaderSizeContentAdjustment() - sizes.itemsContainerOuterCrossSize;\n                                        if (that._horizontal) {\n                                            sizes.containerHeight = itemsContainerContentSize;\n                                            sizes.containerWidth = measurements.containerWidth;\n                                        } else {\n                                            sizes.containerHeight = measurements.containerHeight;\n                                            sizes.containerWidth = itemsContainerContentSize;\n                                        }\n                                    } else {\n                                        sizes.containerWidth = measurements.containerWidth;\n                                        sizes.containerHeight = measurements.containerHeight;\n                                    }\n                                    sizes.containerSizeLoaded = true;\n                                }\n\n                                that._createContainerStyleRule();\n                                that._viewportSizeChanged(measurements.viewportCrossSize);\n\n                                cleanUp();\n                            }\n                        });\n                    }\n\n                    if (!measuringPromise) {\n                        site._writeProfilerMark(perfId + \",StartTM\");\n                        // Use a signal to guarantee that measuringPromise is set before the promise\n                        // handler is executed (measuringPromise is referenced within measureItemImpl).\n                        var promiseStoredSignal = new _Signal();\n                        that._measuringPromise = measuringPromise = promiseStoredSignal.promise.then(function () {\n                            if (that._ensureEnvInfo()) {\n                                return measureItemImpl(index);\n                            } else {\n                                // Couldn't get envInfo. ListView is invisible. Bail out.\n                                return Promise.cancel;\n                            }\n                        }).then(function () {\n                            site._writeProfilerMark(perfId + \":complete,info\");\n                            site._writeProfilerMark(perfId + \",StopTM\");\n                        }, function (error) {\n                            // The purpose of the measuring promise is so that we only\n                            // measure once. If measuring fails, clear the promise because\n                            // we still need to measure.\n                            that._measuringPromise = null;\n\n                            site._writeProfilerMark(perfId + \":canceled,info\");\n                            site._writeProfilerMark(perfId + \",StopTM\");\n\n                            return Promise.wrapError(error);\n                        });\n                        promiseStoredSignal.complete();\n                    }\n                    return measuringPromise;\n                },\n\n                _getHeaderSizeGroupAdjustment: function () {\n                    if (this._groupsEnabled) {\n                        if (this._horizontal && this._groupHeaderPosition === HeaderPosition.left) {\n                            return this._sizes.headerContainerWidth;\n                        } else if (!this._horizontal && this._groupHeaderPosition === HeaderPosition.top) {\n                            return this._sizes.headerContainerHeight;\n                        }\n                    }\n\n                    return 0;\n                },\n                _getHeaderSizeContentAdjustment: function () {\n                    if (this._groupsEnabled) {\n                        if (this._horizontal && this._groupHeaderPosition === HeaderPosition.top) {\n                            return this._sizes.headerContainerHeight;\n                        } else if (!this._horizontal && this._groupHeaderPosition === HeaderPosition.left) {\n                            return this._sizes.headerContainerWidth;\n                        }\n                    }\n\n                    return 0;\n                },\n\n                // Horizontal layouts lay items out top to bottom, left to right, whereas vertical layouts lay items out left to right, top to bottom.\n                // The viewport size is the size layouts use to determine how many items can be placed in one bar, so it should be cross to the\n                // orientation.\n                _getViewportCrossSize: function () {\n                    return this._site.viewportSize[this._horizontal ? \"height\" : \"width\"];\n                },\n\n                // viewportContentSize is the new viewport size\n                _viewportSizeChanged: function _LayoutCommon_viewportSizeChanged(viewportContentSize) {\n                    var sizes = this._sizes;\n\n                    sizes.viewportContentSize = viewportContentSize;\n                    sizes.surfaceContentSize = viewportContentSize - sizes.surfaceOuterCrossSize;\n                    sizes.maxItemsContainerContentSize = sizes.surfaceContentSize - sizes.itemsContainerOuterCrossSize - this._getHeaderSizeContentAdjustment();\n\n                    // This calculation is for uniform layouts\n                    if (sizes.containerSizeLoaded && !this._inListMode) {\n                        this._itemsPerBar = Math.floor(sizes.maxItemsContainerContentSize / sizes.containerCrossSize);\n                        if (this.maximumRowsOrColumns) {\n                            this._itemsPerBar = Math.min(this._itemsPerBar, this.maximumRowsOrColumns);\n                        }\n                        this._itemsPerBar = Math.max(1, this._itemsPerBar);\n                    } else {\n                        if (this._inListMode) {\n                            sizes[this._horizontal ? \"containerHeight\" : \"containerWidth\"] = sizes.maxItemsContainerContentSize;\n                        }\n                        this._itemsPerBar = 1;\n                    }\n\n                    // Ignore animations if height changed\n                    this._resetAnimationCaches();\n                },\n\n                _createContainerStyleRule: function _LayoutCommon_createContainerStyleRule() {\n                    // Adding CSS rules is expensive. Add a rule to provide a\n                    // height and width for containers if the app hasn't provided one.\n                    var sizes = this._sizes;\n                    if (!this._containerSizeClassName && sizes.containerSizeLoaded && (sizes.emptyContainerContentHeight === 0 || sizes.emptyContainerContentWidth === 0)) {\n                        var width = sizes.containerWidth - sizes.containerOuterWidth + \"px\",\n                            height = sizes.containerHeight - sizes.containerOuterHeight + \"px\";\n                        if (this._inListMode) {\n                            if (this._horizontal) {\n                                height = \"calc(100% - \" + (sizes.containerMargins.top + sizes.containerMargins.bottom) + \"px)\";\n                            } else {\n                                width = \"auto\";\n                            }\n                        }\n\n                        if (!this._containerSizeClassName) {\n                            this._containerSizeClassName = uniqueCssClassName(\"containersize\");\n                            _ElementUtilities.addClass(this._site.surface, this._containerSizeClassName);\n                        }\n                        var ruleSelector = \".\" + _Constants._containerClass,\n                            ruleBody = \"width:\" + width + \";height:\" + height + \";\";\n                        addDynamicCssRule(this._containerSizeClassName, this._site, ruleSelector, ruleBody);\n                    }\n                },\n\n                // Computes container width and height if they haven't been computed yet. This\n                // should happen when the first uniform group is created.\n                _ensureContainerSize: function _LayoutCommon_ensureContainerSize(group) {\n                    var sizes = this._sizes;\n                    if (!sizes.containerSizeLoaded && !this._ensuringContainerSize) {\n                        var promise;\n                        if ((!this._itemInfo || typeof this._itemInfo !== \"function\") && this._useDefaultItemInfo) {\n                            var margins = sizes.containerMargins;\n                            promise = Promise.wrap({\n                                width: group.groupInfo.cellWidth - margins.left - margins.right,\n                                height: group.groupInfo.cellHeight - margins.top - margins.bottom\n                            });\n\n                        } else {\n                            promise = this._getItemInfo();\n                        }\n\n                        var that = this;\n                        this._ensuringContainerSize = promise.then(function (itemSize) {\n                            sizes.containerSizeLoaded = true;\n                            sizes.containerWidth = itemSize.width + sizes.itemBoxOuterWidth + sizes.containerOuterWidth;\n                            sizes.containerHeight = itemSize.height + sizes.itemBoxOuterHeight + sizes.containerOuterHeight;\n                            if (!that._inListMode) {\n                                that._itemsPerBar = Math.floor(sizes.maxItemsContainerContentSize / sizes.containerCrossSize);\n                                if (that.maximumRowsOrColumns) {\n                                    that._itemsPerBar = Math.min(that._itemsPerBar, that.maximumRowsOrColumns);\n                                }\n                                that._itemsPerBar = Math.max(1, that._itemsPerBar);\n                            } else {\n                                that._itemsPerBar = 1;\n                            }\n                            that._createContainerStyleRule();\n                        });\n\n                        promise.done(\n                            function () {\n                                that._ensuringContainerSize = null;\n                            },\n                            function () {\n                                that._ensuringContainerSize = null;\n                            }\n                        );\n\n                        return promise;\n                    } else {\n                        return this._ensuringContainerSize ? this._ensuringContainerSize : Promise.wrap();\n                    }\n                },\n\n                _indexToCoordinate: function _LayoutCommon_indexToCoordinate(index, itemsPerBar) {\n                    itemsPerBar = itemsPerBar || this._itemsPerBar;\n                    var bar = Math.floor(index / itemsPerBar);\n                    if (this._horizontal) {\n                        return {\n                            column: bar,\n                            row: index - bar * itemsPerBar\n                        };\n                    } else {\n                        return {\n                            row: bar,\n                            column: index - bar * itemsPerBar\n                        };\n                    }\n                },\n\n                // Empty ranges are represented by null. Non-empty ranges are represented by\n                // an object with 2 properties: firstIndex and lastIndex.\n                _rangeForGroup: function _LayoutCommon_rangeForGroup(group, range) {\n                    var first = group.startIndex,\n                        last = first + group.count - 1;\n\n                    if (!range || range.firstIndex > last || range.lastIndex < first) {\n                        // There isn't any overlap between range and the group's indices\n                        return null;\n                    } else {\n                        return {\n                            firstIndex: Math.max(0, range.firstIndex - first),\n                            lastIndex: Math.min(group.count - 1, range.lastIndex - first)\n                        };\n                    }\n                },\n\n                _syncDomWithGroupHeaderPosition: function _LayoutCommon_syncDomWithGroupHeaderPosition(tree) {\n                    if (this._groupsEnabled && this._oldGroupHeaderPosition !== this._groupHeaderPosition) {\n                        // this._oldGroupHeaderPosition may refer to top, left, or null. It will be null\n                        // the first time this function is called which means that no styles have to be\n                        // removed.\n\n                        var len = tree.length,\n                            i;\n                        // Remove styles associated with old group header position\n                        if (this._oldGroupHeaderPosition === HeaderPosition.top) {\n                            _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionTopClass);\n                            // maxWidth must be cleared because it is used with headers in the top position but not the left position.\n                            // The _groupLeaderClass must be removed from the itemsContainer element because the associated styles\n                            // should only be applied to it when headers are in the top position.\n                            if (this._horizontal) {\n                                for (i = 0; i < len; i++) {\n                                    tree[i].header.style.maxWidth = \"\";\n                                    _ElementUtilities.removeClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);\n                                }\n                            } else {\n                                this._site.surface.style.msGridRows = \"\";\n                            }\n                        } else if (this._oldGroupHeaderPosition === HeaderPosition.left) {\n                            _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionLeftClass);\n                            // msGridColumns is cleared for a similar reason as maxWidth\n                            if (!this._horizontal) {\n                                for (i = 0; i < len; i++) {\n                                    tree[i].header.style.maxHeight = \"\";\n                                    _ElementUtilities.removeClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);\n                                }\n                            }\n                            this._site.surface.style.msGridColumns = \"\";\n                        }\n\n                        // Add styles associated with new group header position\n                        if (this._groupHeaderPosition === HeaderPosition.top) {\n                            _ElementUtilities.addClass(this._site.surface, _Constants._headerPositionTopClass);\n                            if (this._horizontal) {\n                                for (i = 0; i < len; i++) {\n                                    _ElementUtilities.addClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);\n                                }\n                            }\n                        } else {\n                            _ElementUtilities.addClass(this._site.surface, _Constants._headerPositionLeftClass);\n                            if (!this._horizontal) {\n                                for (i = 0; i < len; i++) {\n                                    _ElementUtilities.addClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);\n                                }\n                            }\n                        }\n\n                        this._oldGroupHeaderPosition = this._groupHeaderPosition;\n                    }\n                },\n\n                _layoutGroup: function _LayoutCommon_layoutGroup(index) {\n                    var group = this._groups[index],\n                        groupBundle = this._site.tree[index],\n                        headerContainer = groupBundle.header,\n                        itemsContainer = groupBundle.itemsContainer.element,\n                        sizes = this._sizes,\n                        groupCrossSize = group.getItemsContainerCrossSize();\n\n                    if (this._groupsEnabled) {\n                        if (this._horizontal) {\n                            if (this._groupHeaderPosition === HeaderPosition.top) {\n                                // Horizontal with headers above\n                                //\n                                var headerContainerMinContentWidth = sizes.headerContainerMinWidth - sizes.headerContainerOuterWidth,\n                                    itemsContainerContentWidth = group.getItemsContainerSize() - sizes.headerContainerOuterWidth;\n                                headerContainer.style.maxWidth = Math.max(headerContainerMinContentWidth, itemsContainerContentWidth) + \"px\";\n                                if (this._envInfo.supportsCSSGrid) {\n                                    headerContainer.style.msGridColumn = index + 1;\n                                    itemsContainer.style.msGridColumn = index + 1;\n                                } else {\n                                    headerContainer.style.height = (sizes.headerContainerHeight - sizes.headerContainerOuterHeight) + \"px\";\n                                    itemsContainer.style.height = (groupCrossSize - sizes.itemsContainerOuterHeight) + \"px\";\n                                    // If the itemsContainer is too small, the next group's header runs the risk of appearing below the current group's items.\n                                    // We need to add a margin to the bottom of the itemsContainer to prevent that from happening.\n                                    itemsContainer.style.marginBottom = sizes.itemsContainerMargins.bottom + (sizes.maxItemsContainerContentSize - groupCrossSize + sizes.itemsContainerOuterHeight) + \"px\";\n                                }\n                                // itemsContainers only get the _groupLeaderClass when header position is top.\n                                _ElementUtilities.addClass(itemsContainer, _Constants._groupLeaderClass);\n                            } else {\n                                // Horizontal with headers on the left\n                                //\n                                if (this._envInfo.supportsCSSGrid) {\n                                    headerContainer.style.msGridColumn = index * 2 + 1;\n                                    itemsContainer.style.msGridColumn = index * 2 + 2;\n                                } else {\n                                    headerContainer.style.width = sizes.headerContainerWidth - sizes.headerContainerOuterWidth + \"px\";\n                                    headerContainer.style.height = (groupCrossSize - sizes.headerContainerOuterHeight) + \"px\";\n                                    itemsContainer.style.height = (groupCrossSize - sizes.itemsContainerOuterHeight) + \"px\";\n                                }\n                            }\n                        } else {\n                            if (this._groupHeaderPosition === HeaderPosition.left) {\n                                // Vertical with headers on the left\n                                //\n                                var headerContainerMinContentHeight = sizes.headerContainerMinHeight - sizes.headerContainerOuterHeight,\n                                    itemsContainerContentHeight = group.getItemsContainerSize() - sizes.headerContainerOuterHeight;\n                                headerContainer.style.maxHeight = Math.max(headerContainerMinContentHeight, itemsContainerContentHeight) + \"px\";\n                                if (this._envInfo.supportsCSSGrid) {\n                                    headerContainer.style.msGridRow = index + 1;\n                                    itemsContainer.style.msGridRow = index + 1;\n                                } else {\n                                    headerContainer.style.width = (sizes.headerContainerWidth - sizes.headerContainerOuterWidth) + \"px\";\n                                    itemsContainer.style.width = (groupCrossSize - sizes.itemsContainerOuterWidth) + \"px\";\n                                    // If the itemsContainer is too small, the next group's header runs the risk of appearing to the side of the current group's items.\n                                    // We need to add a margin to the right of the itemsContainer to prevent that from happening (or the left margin, in RTL).\n                                    itemsContainer.style[\"margin\" + (this._site.rtl ? \"Left\" : \"Right\")] = (sizes.itemsContainerMargins[(this._site.rtl ? \"left\" : \"right\")] +\n                                        (sizes.maxItemsContainerContentSize - groupCrossSize + sizes.itemsContainerOuterWidth)) + \"px\";\n                                }\n                                // itemsContainers only get the _groupLeaderClass when header position is left.\n                                _ElementUtilities.addClass(itemsContainer, _Constants._groupLeaderClass);\n                            } else {\n                                // Vertical with headers above\n                                //\n                                headerContainer.style.msGridRow = index * 2 + 1;\n                                // It's important to explicitly set the container height in vertical list mode with headers above, since we use flow layout.\n                                // When the header's content is taken from the DOM, the headerContainer will shrink unless it has a height set.\n                                if (this._inListMode) {\n                                    headerContainer.style.height = (sizes.headerContainerHeight - sizes.headerContainerOuterHeight) + \"px\";\n                                } else {\n                                    if (this._envInfo.supportsCSSGrid) {\n                                        itemsContainer.style.msGridRow = index * 2 + 2;\n                                    } else {\n                                        headerContainer.style.height = sizes.headerContainerHeight - sizes.headerContainerOuterHeight + \"px\";\n                                        headerContainer.style.width = (groupCrossSize - sizes.headerContainerOuterWidth) + \"px\";\n                                        itemsContainer.style.width = (groupCrossSize - sizes.itemsContainerOuterWidth) + \"px\";\n                                    }\n                                }\n                            }\n\n                        }\n                        // Header containers always get the _groupLeaderClass.\n                        _ElementUtilities.addClass(headerContainer, _Constants._laidOutClass + \" \" + _Constants._groupLeaderClass);\n                    }\n                    _ElementUtilities.addClass(itemsContainer, _Constants._laidOutClass);\n                }\n            }, {\n                // The maximum number of rows or columns of win-containers to put into each items block.\n                // A row/column cannot be split across multiple items blocks. win-containers\n                // are grouped into items blocks in order to mitigate the costs of the platform doing\n                // a layout in response to insertions and removals of win-containers.\n                _barsPerItemsBlock: 4\n            });\n        }),\n\n        //\n        // Layouts\n        //\n\n        _LegacyLayout: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports._LayoutCommon, null, {\n                /// <field type=\"Boolean\" locid=\"WinJS.UI._LegacyLayout.disableBackdrop\" helpKeyword=\"WinJS.UI._LegacyLayout.disableBackdrop\">\n                /// Gets or sets a value that indicates whether the layout should disable the backdrop feature\n                /// which avoids blank areas while panning in a virtualized list.\n                /// <deprecated type=\"deprecate\">\n                /// disableBackdrop is deprecated. Style: .win-listview .win-container.win-backdrop { background-color:transparent; } instead.\n                /// </deprecated>\n                /// </field>\n                disableBackdrop: {\n                    get: function _LegacyLayout_disableBackdrop_get() {\n                        return this._backdropDisabled || false;\n                    },\n                    set: function _LegacyLayout_disableBackdrop_set(value) {\n                        _ElementUtilities._deprecated(_ErrorMessages.disableBackdropIsDeprecated);\n                        value = !!value;\n                        if (this._backdropDisabled !== value) {\n                            this._backdropDisabled = value;\n                            if (this._disableBackdropClassName) {\n                                deleteDynamicCssRule(this._disableBackdropClassName);\n                                this._site && _ElementUtilities.removeClass(this._site.surface, this._disableBackdropClassName);\n                                this._disableBackdropClassName = null;\n                            }\n                            this._disableBackdropClassName = uniqueCssClassName(\"disablebackdrop\");\n                            this._site && _ElementUtilities.addClass(this._site.surface, this._disableBackdropClassName);\n                            if (value) {\n                                var ruleSelector = \".win-container.win-backdrop\",\n                                    ruleBody = \"background-color:transparent;\";\n                                addDynamicCssRule(this._disableBackdropClassName, this._site, ruleSelector, ruleBody);\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI._LegacyLayout.backdropColor\" helpKeyword=\"WinJS.UI._LegacyLayout.backdropColor\">\n                /// Gets or sets the fill color for the default pattern used for the backdrops.\n                /// The default value is \"rgba(155,155,155,0.23)\".\n                /// <deprecated type=\"deprecate\">\n                /// backdropColor is deprecated. Style: .win-listview .win-container.win-backdrop { rgba(155,155,155,0.23); } instead.\n                /// </deprecated>\n                /// </field>\n                backdropColor: {\n                    get: function _LegacyLayout_backdropColor_get() {\n                        return this._backdropColor || \"rgba(155,155,155,0.23)\";\n                    },\n                    set: function _LegacyLayout_backdropColor_set(value) {\n                        _ElementUtilities._deprecated(_ErrorMessages.backdropColorIsDeprecated);\n                        if (value && this._backdropColor !== value) {\n                            this._backdropColor = value;\n                            if (this._backdropColorClassName) {\n                                deleteDynamicCssRule(this._backdropColorClassName);\n                                this._site && _ElementUtilities.removeClass(this._site.surface, this._backdropColorClassName);\n                                this._backdropColorClassName = null;\n                            }\n                            this._backdropColorClassName = uniqueCssClassName(\"backdropcolor\");\n                            this._site && _ElementUtilities.addClass(this._site.surface, this._backdropColorClassName);\n                            var ruleSelector = \".win-container.win-backdrop\",\n                                ruleBody = \"background-color:\" + value + \";\";\n                            addDynamicCssRule(this._backdropColorClassName, this._site, ruleSelector, ruleBody);\n                        }\n                    }\n                }\n            });\n        }),\n\n        GridLayout: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports._LegacyLayout, function (options) {\n                /// <signature helpKeyword=\"WinJS.UI.GridLayout\">\n                /// <summary locid=\"WinJS.UI.GridLayout\">\n                /// Creates a new GridLayout.\n                /// </summary>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.GridLayout_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options\n                /// object corresponds to one of the control's properties or events.\n                /// </param>\n                /// <returns type=\"WinJS.UI.GridLayout\" locid=\"WinJS.UI.GridLayout_returnValue\">\n                /// The new GridLayout.\n                /// </returns>\n                /// </signature>\n                options = options || {};\n                // Executing setters to display compatibility warning\n                this.itemInfo = options.itemInfo;\n                this.groupInfo = options.groupInfo;\n                this._maxRowsOrColumns = 0;\n                this._useDefaultItemInfo = true;\n                this._elementsToMeasure = {};\n                this._groupHeaderPosition = options.groupHeaderPosition || HeaderPosition.top;\n                this.orientation = options.orientation || \"horizontal\";\n\n                if (options.maxRows) {\n                    this.maxRows = +options.maxRows;\n                }\n                if (options.maximumRowsOrColumns) {\n                    this.maximumRowsOrColumns = +options.maximumRowsOrColumns;\n                }\n            }, {\n\n                // Public\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.GridLayout.maximumRowsOrColumns\" helpKeyword=\"WinJS.UI.GridLayout.maximumRowsOrColumns\">\n                /// Gets the maximum number of rows or columns, depending on the orientation, that should present before it introduces wrapping to the layout.\n                /// A value of 0 indicates that there is no maximum. The default value is 0.\n                /// </field>\n                maximumRowsOrColumns: {\n                    get: function () {\n                        return this._maxRowsOrColumns;\n                    },\n                    set: function (value) {\n                        this._setMaxRowsOrColumns(value);\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.GridLayout.maxRows\" helpKeyword=\"WinJS.UI.GridLayout.maxRows\">\n                /// Gets or sets the maximum number of rows displayed by the ListView.\n                /// <deprecated type=\"deprecate\">\n                /// WinJS.UI.GridLayout.maxRows may be altered or unavailable after the Windows Library for JavaScript 2.0. Instead, use the maximumRowsOrColumns property.\n                /// </deprecated>\n                /// </field>\n                maxRows: {\n                    get: function () {\n                        return this.maximumRowsOrColumns;\n                    },\n                    set: function (maxRows) {\n                        _ElementUtilities._deprecated(_ErrorMessages.maxRowsIsDeprecated);\n                        this.maximumRowsOrColumns = maxRows;\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.GridLayout.itemInfo\" helpKeyword=\"WinJS.UI.GridLayout.itemInfo\">\n                /// Determines the size of the item and whether\n                /// the item should be placed in a new column.\n                /// <deprecated type=\"deprecate\">\n                /// GridLayout.itemInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout.\n                /// </deprecated>\n                /// </field>\n                itemInfo: {\n                    enumerable: true,\n                    get: function () {\n                        return this._itemInfo;\n                    },\n                    set: function (itemInfo) {\n                        itemInfo && _ElementUtilities._deprecated(_ErrorMessages.itemInfoIsDeprecated);\n                        this._itemInfo = itemInfo;\n                        this._invalidateLayout();\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.GridLayout.groupInfo\" helpKeyword=\"WinJS.UI.GridLayout.groupInfo\">\n                /// Indicates whether a group has cell spanning items and specifies the dimensions of the cell.\n                /// <deprecated type=\"deprecate\">\n                /// GridLayout.groupInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout.\n                /// </deprecated>\n                /// </field>\n                groupInfo: {\n                    enumerable: true,\n                    get: function () {\n                        return this._groupInfo;\n                    },\n                    set: function (groupInfo) {\n                        groupInfo && _ElementUtilities._deprecated(_ErrorMessages.groupInfoIsDeprecated);\n                        this._groupInfo = groupInfo;\n                        this._invalidateLayout();\n                    }\n                }\n            });\n        })\n    });\n\n    var Groups = _Base.Namespace.defineWithParent(null, null, {\n\n        UniformGroupBase: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(null, {\n                cleanUp: function UniformGroupBase_cleanUp() {\n                },\n\n                itemFromOffset: function UniformGroupBase_itemFromOffset(offset, options) {\n                    // supported options are:\n                    // - wholeItem: when set to true the fully visible item is returned\n                    // - last: if 1 the last item is returned. if 0 the first\n                    options = options || {};\n\n                    var sizes = this._layout._sizes;\n\n                    // Make offset relative to the items container's content box\n                    offset -= sizes.itemsContainerOuterStart;\n\n                    if (options.wholeItem) {\n                        offset += (options.last ? -1 : 1) * (sizes.containerSize - 1);\n                    }\n                    var lastIndexOfGroup = this.count - 1,\n                        lastBar = Math.floor(lastIndexOfGroup / this._layout._itemsPerBar),\n                        bar = clampToRange(0, lastBar, Math.floor(offset / sizes.containerSize)),\n                        index = (bar + options.last) * this._layout._itemsPerBar - options.last;\n                    return clampToRange(0, this.count - 1, index);\n                },\n\n                hitTest: function UniformGroupBase_hitTest(x, y) {\n                    var horizontal = this._layout._horizontal,\n                        itemsPerBar = this._layout._itemsPerBar,\n                        useListSemantics = this._layout._inListMode || itemsPerBar === 1,\n                        directionalLocation = horizontal ? x : y,\n                        crossLocation = horizontal ? y : x,\n                        sizes = this._layout._sizes;\n\n                    directionalLocation -= sizes.itemsContainerOuterStart;\n                    crossLocation -= sizes.itemsContainerOuterCrossStart;\n\n                    var bar = Math.floor(directionalLocation / sizes.containerSize);\n                    var slotInBar = clampToRange(0, itemsPerBar - 1, Math.floor(crossLocation / sizes.containerCrossSize));\n                    var index = Math.max(-1, bar * itemsPerBar + slotInBar);\n\n                    // insertAfterIndex is determined by which half of the target element the mouse cursor is currently in.\n                    // The trouble is that we can cut the element in half horizontally or cut it in half vertically.\n                    // Which one we choose depends on the order that elements are laid out in the grid.\n                    // A horizontal grid with multiple rows per column will lay items out starting from top to bottom, and move left to right.\n                    // A vertical list is just a horizontal grid with an infinite number of rows per column, so it follows the same order.\n                    // In both of these cases, each item is cut in half horizontally, since for any item n, n-1 should be above it and n+1 below (ignoring column changes).\n                    // A vertical grid lays items out left to right, top to bottom, and a horizontal list left to right (with infinite items per row).\n                    // In this case for item n, n-1 is on the left and n+1 on the right, so we cut the item in half vertically.\n                    var insertAfterSlot;\n                    if ((!horizontal && useListSemantics) ||\n                        (horizontal && !useListSemantics)) {\n                        insertAfterSlot = (y - sizes.containerHeight / 2) / sizes.containerHeight;\n                    } else {\n                        insertAfterSlot = (x - sizes.containerWidth / 2) / sizes.containerWidth;\n                    }\n                    if (useListSemantics) {\n                        insertAfterSlot = Math.floor(insertAfterSlot);\n                        return {\n                            index: index,\n                            insertAfterIndex: (insertAfterSlot >= 0 && index >= 0 ? insertAfterSlot : -1)\n                        };\n                    }\n                    insertAfterSlot = clampToRange(-1, itemsPerBar - 1, insertAfterSlot);\n                    var insertAfterIndex;\n                    if (insertAfterSlot < 0) {\n                        insertAfterIndex = bar * itemsPerBar - 1;\n                    } else {\n                        insertAfterIndex = bar * itemsPerBar + Math.floor(insertAfterSlot);\n                    }\n\n                    return {\n                        index: clampToRange(-1, this.count - 1, index),\n                        insertAfterIndex: clampToRange(-1, this.count - 1, insertAfterIndex)\n                    };\n                },\n\n                getAdjacent: function UniformGroupBase_getAdjacent(currentItem, pressedKey) {\n                    var index = currentItem.index,\n                        currentBar = Math.floor(index / this._layout._itemsPerBar),\n                        currentSlot = index % this._layout._itemsPerBar,\n                        newFocus;\n\n                    switch (pressedKey) {\n                        case Key.upArrow:\n                            newFocus = (currentSlot === 0 ? \"boundary\" : index - 1);\n                            break;\n                        case Key.downArrow:\n                            var isLastIndexOfGroup = (index === this.count - 1),\n                                inLastSlot = (this._layout._itemsPerBar > 1 && currentSlot === this._layout._itemsPerBar - 1);\n                            newFocus = (isLastIndexOfGroup || inLastSlot ? \"boundary\" : index + 1);\n                            break;\n                        case Key.leftArrow:\n                            newFocus = (currentBar === 0 && this._layout._itemsPerBar > 1 ? \"boundary\" : index - this._layout._itemsPerBar);\n                            break;\n                        case Key.rightArrow:\n                            var lastIndexOfGroup = this.count - 1,\n                                lastBar = Math.floor(lastIndexOfGroup / this._layout._itemsPerBar);\n                            newFocus = (currentBar === lastBar ? \"boundary\" : Math.min(index + this._layout._itemsPerBar, this.count - 1));\n                            break;\n                    }\n                    return (newFocus === \"boundary\" ? newFocus : { type: _UI.ObjectType.item, index: newFocus });\n                },\n\n                getItemsContainerSize: function UniformGroupBase_getItemsContainerSize() {\n                    var sizes = this._layout._sizes,\n                        barCount = Math.ceil(this.count / this._layout._itemsPerBar);\n                    return barCount * sizes.containerSize + sizes.itemsContainerOuterSize;\n                },\n\n                getItemsContainerCrossSize: function UniformGroupBase_getItemsContainerCrossSize() {\n                    var sizes = this._layout._sizes;\n                    return this._layout._itemsPerBar * sizes.containerCrossSize + sizes.itemsContainerOuterCrossSize;\n                },\n\n                getItemPositionForAnimations: function UniformGroupBase_getItemPositionForAnimations(itemIndex) {\n                    // Top/Left are used to know if the item has moved and also used to position the item if removed.\n                    // Row/Column are used to know if a reflow animation should occur\n                    // Height/Width are used when positioning a removed item without impacting layout.\n                    // The returned rectangle refers to the win-container's border/padding/content box. Coordinates\n                    // are relative to group's items container.\n\n                    var sizes = this._layout._sizes;\n                    var leftStr = this._layout._site.rtl ? \"right\" : \"left\";\n                    var containerMargins = this._layout._sizes.containerMargins;\n                    var coordinates = this._layout._indexToCoordinate(itemIndex);\n                    var itemPosition = {\n                        row: coordinates.row,\n                        column: coordinates.column,\n                        top: containerMargins.top + coordinates.row * sizes.containerHeight,\n                        left: containerMargins[leftStr] + coordinates.column * sizes.containerWidth,\n                        height: sizes.containerHeight - sizes.containerMargins.top - sizes.containerMargins.bottom,\n                        width: sizes.containerWidth - sizes.containerMargins.left - sizes.containerMargins.right\n                    };\n                    return itemPosition;\n                }\n            });\n        }),\n\n        //\n        // Groups for GridLayout\n        //\n        // Each group implements a 3 function layout interface. The interface is used\n        // whenever GridLayout has to do a layout. The interface consists of:\n        // - prepareLayout/prepareLayoutWithCopyOfTree: Called 1st. Group should update all of its internal\n        //   layout state. It should not modify the DOM. Group should implement either prepareLayout or\n        //   prepareLayoutWithCopyOfTree. The former is preferable because the latter is expensive as calling\n        //   it requires copying the group's tree. Implementing prepareLayoutWithCopyOfTree is necessary when\n        //   the group is manually laying out items and is laying out unrealized items asynchronously\n        //   (e.g. CellSpanningGroup). This requires a copy of the tree from the previous layout pass.\n        // - layoutRealizedRange: Called 2nd. Group should update the DOM so that\n        //   the realized range reflects the internal layout state computed during\n        //   prepareLayout.\n        // - layoutUnrealizedRange: Called 3rd. Group should update the DOM for the items\n        //   outside of the realized range. This function returns a promise so\n        //   it can do its work asynchronously. When the promise completes, layout will\n        //   be done.\n        //\n        // The motivation for this interface is perceived performance. If groups had just 1\n        // layout function, all items would have to be laid out before any animations could\n        // begin. With this interface, animations can begin playing after\n        // layoutRealizedRange is called.\n        //\n        // Each group also implements a cleanUp function which is called when the group is\n        // no longer needed so that it can clean up the DOM and its resources. After cleanUp\n        // is called, the group object cannnot be reused.\n        //\n\n        UniformGroup: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(Groups.UniformGroupBase, function UniformGroup_ctor(layout, itemsContainer) {\n                this._layout = layout;\n                this._itemsContainer = itemsContainer;\n                _ElementUtilities.addClass(this._itemsContainer, layout._inListMode ? _Constants._uniformListLayoutClass : _Constants._uniformGridLayoutClass);\n            }, {\n                cleanUp: function UniformGroup_cleanUp(skipDomCleanUp) {\n                    if (!skipDomCleanUp) {\n                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformGridLayoutClass);\n                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformListLayoutClass);\n                        this._itemsContainer.style.height = this._itemsContainer.style.width = \"\";\n                    }\n                    this._itemsContainer = null;\n                    this._layout = null;\n                    this.groupInfo = null;\n                    this.startIndex = null;\n                    this.offset = null;\n                    this.count = null;\n                },\n\n                prepareLayout: function UniformGroup_prepareLayout(itemsCount, oldChangedRealizedRange, oldState, updatedProperties) {\n                    this.groupInfo = updatedProperties.groupInfo;\n                    this.startIndex = updatedProperties.startIndex;\n                    this.count = itemsCount;\n                    return this._layout._ensureContainerSize(this);\n                },\n\n                layoutRealizedRange: function UniformGroup_layoutRealizedRange() {\n                    // Explicitly set the items container size. This is required so that the\n                    // surface, which is a grid, will have its width sized to content.\n                    var sizes = this._layout._sizes;\n                    this._itemsContainer.style[this._layout._horizontal ? \"width\" : \"height\"] = this.getItemsContainerSize() - sizes.itemsContainerOuterSize + \"px\";\n                    this._itemsContainer.style[this._layout._horizontal ? \"height\" : \"width\"] = (this._layout._inListMode ? sizes.maxItemsContainerContentSize + \"px\" :\n                                                                                                 this._layout._itemsPerBar * sizes.containerCrossSize + \"px\");\n                },\n\n                layoutUnrealizedRange: function UniformGroup_layoutUnrealizedRange() {\n                    return Promise.wrap();\n                }\n            });\n        }),\n\n        UniformFlowGroup: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(Groups.UniformGroupBase, function UniformFlowGroup_ctor(layout, tree) {\n                this._layout = layout;\n                this._itemsContainer = tree.element;\n                _ElementUtilities.addClass(this._itemsContainer, layout._inListMode ? _Constants._uniformListLayoutClass : _Constants._uniformGridLayoutClass);\n            }, {\n                cleanUp: function UniformFlowGroup_cleanUp(skipDomCleanUp) {\n                    if (!skipDomCleanUp) {\n                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformListLayoutClass);\n                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformGridLayoutClass);\n                        this._itemsContainer.style.height = \"\";\n                    }\n                },\n                layout: function UniformFlowGroup_layout() {\n                    this._layout._site._writeProfilerMark(\"Layout:_UniformFlowGroup:setItemsContainerHeight,info\");\n                    this._itemsContainer.style.height = this.count * this._layout._sizes.containerHeight + \"px\";\n                }\n            });\n        }),\n\n        CellSpanningGroup: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function CellSpanningGroup_ctor(layout, itemsContainer) {\n                this._layout = layout;\n                this._itemsContainer = itemsContainer;\n                _ElementUtilities.addClass(this._itemsContainer, _Constants._cellSpanningGridLayoutClass);\n\n                this.resetMap();\n            }, {\n                cleanUp: function CellSpanningGroup_cleanUp(skipDomCleanUp) {\n                    if (!skipDomCleanUp) {\n                        this._cleanContainers();\n                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._cellSpanningGridLayoutClass);\n                        this._itemsContainer.style.cssText = \"\";\n                    }\n                    this._itemsContainer = null;\n\n                    if (this._layoutPromise) {\n                        this._layoutPromise.cancel();\n                        this._layoutPromise = null;\n                    }\n                    this.resetMap();\n                    this._slotsPerColumn = null;\n                    this._offScreenSlotsPerColumn = null;\n                    this._items = null;\n                    this._layout = null;\n                    this._containersToHide = null;\n                    this.groupInfo = null;\n                    this.startIndex = null;\n                    this.offset = null;\n                    this.count = null;\n                },\n\n                prepareLayoutWithCopyOfTree: function CellSpanningGroup_prepareLayoutWithCopyOfTree(tree, oldChangedRealizedRange, oldState, updatedProperties) {\n                    var that = this;\n                    var i;\n\n                    // Remember the items in the old realized item range that changed.\n                    // During layoutRealizedRange, they either need to be relaid out or hidden.\n                    this._containersToHide = {};\n                    if (oldChangedRealizedRange) {\n                        for (i = oldChangedRealizedRange.firstIndex; i <= oldChangedRealizedRange.lastIndex; i++) {\n                            this._containersToHide[uniqueID(oldState._items[i])] = oldState._items[i];\n                        }\n                    }\n\n                    // Update public properties\n                    this.groupInfo = updatedProperties.groupInfo;\n                    this.startIndex = updatedProperties.startIndex;\n                    this.count = tree.items.length;\n\n                    this._items = tree.items;\n                    this._slotsPerColumn = Math.floor(this._layout._sizes.maxItemsContainerContentSize / this.groupInfo.cellHeight);\n                    if (this._layout.maximumRowsOrColumns) {\n                        this._slotsPerColumn = Math.min(this._slotsPerColumn, this._layout.maximumRowsOrColumns);\n                    }\n                    this._slotsPerColumn = Math.max(this._slotsPerColumn, 1);\n\n                    this.resetMap();\n                    var itemInfoPromises = new Array(this.count);\n                    for (i = 0; i < this.count; i++) {\n                        itemInfoPromises[i] = this._layout._getItemInfo(this.startIndex + i);\n                    }\n                    return Promise.join(itemInfoPromises).then(function (itemInfos) {\n                        itemInfos.forEach(function (itemInfo, index) {\n                            that.addItemToMap(index, itemInfo);\n                        });\n                    });\n                },\n\n                layoutRealizedRange: function CellSpanningGroup_layoutRealizedRange(firstChangedIndex, realizedRange) {\n                    // Lay out the changed items within the realized range\n                    if (realizedRange) {\n                        var firstChangedRealizedIndex = Math.max(firstChangedIndex, realizedRange.firstIndex),\n                            i;\n                        for (i = firstChangedRealizedIndex; i <= realizedRange.lastIndex; i++) {\n                            this._layoutItem(i);\n                            delete this._containersToHide[uniqueID(this._items[i])];\n                        }\n                    }\n\n                    // Hide the old containers that are in the realized range but weren't relaid out\n                    Object.keys(this._containersToHide).forEach(function (id) {\n                        _ElementUtilities.removeClass(this._containersToHide[id], _Constants._laidOutClass);\n                    }.bind(this));\n                    this._containersToHide = {};\n\n                    // Explicitly set the items container height. This is required so that the\n                    // surface, which is a grid, will have its width sized to content.\n                    this._itemsContainer.style.cssText +=\n                        \";width:\" + (this.getItemsContainerSize() - this._layout._sizes.itemsContainerOuterSize) +\n                        \"px;height:\" + this._layout._sizes.maxItemsContainerContentSize +\n                        \"px;-ms-grid-columns: (\" + this.groupInfo.cellWidth + \"px)[\" + this.getColumnCount() +\n                        \"];-ms-grid-rows: (\" + this.groupInfo.cellHeight + \"px)[\" + (this._slotsPerColumn + this._offScreenSlotsPerColumn) + \"]\";\n                },\n\n                layoutUnrealizedRange: function CellSpanningGroup_layoutUnrealizedRange(firstChangedIndex, realizedRange, beforeRealizedRange) {\n                    var that = this;\n                    var layoutJob;\n\n                    that._layoutPromise = new Promise(function (complete) {\n                        function completeLayout() {\n                            layoutJob = null;\n                            complete();\n                        }\n\n                        function schedule(fn) {\n                            return Scheduler.schedule(fn, Scheduler.Priority.normal, null,\n                                \"WinJS.UI.GridLayout.CellSpanningGroup.LayoutUnrealizedRange\");\n                        }\n\n                        // These loops are built to lay out the items that are closest to\n                        // the realized range first.\n\n                        if (realizedRange) {\n                            var stop = false;\n                            // For laying out the changed items that are before the realized range\n                            var before = realizedRange.firstIndex - 1;\n                            // For laying out the changed items that are after the realized range\n                            var after = Math.max(firstChangedIndex, realizedRange.lastIndex + 1);\n                            after = Math.max(before + 1, after);\n\n                            // Alternate between laying out items before and after the realized range\n                            layoutJob = schedule(function unrealizedRangeWork(info) {\n                                while (!stop) {\n                                    if (info.shouldYield) {\n                                        info.setWork(unrealizedRangeWork);\n                                        return;\n                                    }\n\n                                    stop = true;\n\n                                    if (before >= firstChangedIndex) {\n                                        that._layoutItem(before);\n                                        before--;\n                                        stop = false;\n                                    }\n                                    if (after < that.count) {\n                                        that._layoutItem(after);\n                                        after++;\n                                        stop = false;\n                                    }\n                                }\n                                completeLayout();\n                            });\n                        } else if (beforeRealizedRange) {\n                            // The items we are laying out come before the realized range.\n                            // so lay them out in descending order.\n                            var i = that.count - 1;\n                            layoutJob = schedule(function beforeRealizedRangeWork(info) {\n                                for (; i >= firstChangedIndex; i--) {\n                                    if (info.shouldYield) {\n                                        info.setWork(beforeRealizedRangeWork);\n                                        return;\n                                    }\n                                    that._layoutItem(i);\n                                }\n                                completeLayout();\n                            });\n                        } else {\n                            // The items we are laying out come after the realized range\n                            // so lay them out in ascending order.\n                            var i = firstChangedIndex;\n                            layoutJob = schedule(function afterRealizedRangeWork(info) {\n                                for (; i < that.count; i++) {\n                                    if (info.shouldYield) {\n                                        info.setWork(afterRealizedRangeWork);\n                                        return;\n                                    }\n                                    that._layoutItem(i);\n                                }\n                                completeLayout();\n                            });\n                        }\n                    }, function () {\n                        // Cancellation handler for that._layoutPromise\n                        layoutJob && layoutJob.cancel();\n                        layoutJob = null;\n                    });\n\n                    return that._layoutPromise;\n                },\n\n                itemFromOffset: function CellSpanningGroup_itemFromOffset(offset, options) {\n                    // supported options are:\n                    // - wholeItem: when set to true the fully visible item is returned\n                    // - last: if 1 the last item is returned. if 0 the first\n                    options = options || {};\n\n                    var sizes = this._layout._sizes,\n                        margins = sizes.containerMargins;\n\n                    // Make offset relative to the items container's content box\n                    offset -= sizes.itemsContainerOuterX;\n\n                    offset -= ((options.last ? 1 : -1) * margins[options.last ? \"left\" : \"right\"]);\n\n                    var value = this.indexFromOffset(offset, options.wholeItem, options.last).item;\n                    return clampToRange(0, this.count - 1, value);\n                },\n\n                getAdjacent: function CellSpanningGroup_getAdjacent(currentItem, pressedKey) {\n                    var index,\n                        originalIndex;\n\n                    index = originalIndex = currentItem.index;\n\n                    var newIndex, inMap, inMapIndex;\n                    if (this.lastAdjacent === index) {\n                        inMapIndex = this.lastInMapIndex;\n                    } else {\n                        inMapIndex = this.findItem(index);\n                    }\n\n                    do {\n                        var column = Math.floor(inMapIndex / this._slotsPerColumn),\n                            row = inMapIndex - column * this._slotsPerColumn,\n                            lastColumn = Math.floor((this.occupancyMap.length - 1) / this._slotsPerColumn);\n\n                        switch (pressedKey) {\n                            case Key.upArrow:\n                                if (row > 0) {\n                                    inMapIndex--;\n                                } else {\n                                    return { type: _UI.ObjectType.item, index: originalIndex };\n                                }\n                                break;\n                            case Key.downArrow:\n                                if (row + 1 < this._slotsPerColumn) {\n                                    inMapIndex++;\n                                } else {\n                                    return { type: _UI.ObjectType.item, index: originalIndex };\n                                }\n                                break;\n                            case Key.leftArrow:\n                                inMapIndex = (column > 0 ? inMapIndex - this._slotsPerColumn : -1);\n                                break;\n                            case Key.rightArrow:\n                                inMapIndex = (column < lastColumn ? inMapIndex + this._slotsPerColumn : this.occupancyMap.length);\n                                break;\n                        }\n\n                        inMap = inMapIndex >= 0 && inMapIndex < this.occupancyMap.length;\n                        if (inMap) {\n                            newIndex = this.occupancyMap[inMapIndex] ? this.occupancyMap[inMapIndex].index : undefined;\n                        }\n\n                    } while (inMap && (index === newIndex || newIndex === undefined));\n\n                    this.lastAdjacent = newIndex;\n                    this.lastInMapIndex = inMapIndex;\n\n                    return (inMap ? { type: _UI.ObjectType.item, index: newIndex } : \"boundary\");\n                },\n\n                hitTest: function CellSpanningGroup_hitTest(x, y) {\n                    var sizes = this._layout._sizes,\n                        itemIndex = 0;\n\n                    // Make the coordinates relative to the items container's content box\n                    x -= sizes.itemsContainerOuterX;\n                    y -= sizes.itemsContainerOuterY;\n\n                    if (this.occupancyMap.length > 0) {\n                        var result = this.indexFromOffset(x, false, 0);\n\n                        var counter = Math.min(this._slotsPerColumn - 1, Math.floor(y / this.groupInfo.cellHeight)),\n                            curr = result.index,\n                            lastValidIndex = curr;\n                        while (counter-- > 0) {\n                            curr++;\n                            if (this.occupancyMap[curr]) {\n                                lastValidIndex = curr;\n                            }\n                        }\n                        if (!this.occupancyMap[lastValidIndex]) {\n                            lastValidIndex--;\n                        }\n                        itemIndex = this.occupancyMap[lastValidIndex].index;\n                    }\n\n                    var itemSize = this.getItemSize(itemIndex),\n                        itemLeft = itemSize.column * this.groupInfo.cellWidth,\n                        itemTop = itemSize.row * this.groupInfo.cellHeight,\n                        useListSemantics = this._slotsPerColumn === 1,\n                        insertAfterIndex = itemIndex;\n\n                    if ((useListSemantics && (x < (itemLeft + itemSize.contentWidth / 2))) ||\n                        (!useListSemantics && (y < (itemTop + itemSize.contentHeight / 2)))) {\n                        insertAfterIndex--;\n                    }\n\n                    return {\n                        type: _UI.ObjectType.item,\n                        index: clampToRange(0, this.count - 1, itemIndex),\n                        insertAfterIndex: clampToRange(-1, this.count - 1, insertAfterIndex)\n                    };\n                },\n\n                getItemsContainerSize: function CellSpanningGroup_getItemsContainerSize() {\n                    var sizes = this._layout._sizes;\n                    return this.getColumnCount() * this.groupInfo.cellWidth + sizes.itemsContainerOuterSize;\n                },\n\n                getItemsContainerCrossSize: function CellSpanningGroup_getItemsContainerCrossSize() {\n                    var sizes = this._layout._sizes;\n                    return sizes.maxItemsContainerContentSize + sizes.itemsContainerOuterCrossSize;\n                },\n\n                getItemPositionForAnimations: function CellSpanningGroup_getItemPositionForAnimations(itemIndex) {\n                    // Top/Left are used to know if the item has moved and also used to position the item if removed.\n                    // Row/Column are used to know if a reflow animation should occur\n                    // Height/Width are used when positioning a removed item without impacting layout.\n                    // The returned rectangle refers to the win-container's border/padding/content box. Coordinates\n                    // are relative to group's items container.\n\n                    var leftStr = this._layout._site.rtl ? \"right\" : \"left\";\n                    var containerMargins = this._layout._sizes.containerMargins;\n                    var coordinates = this.getItemSize(itemIndex);\n                    var groupInfo = this.groupInfo;\n                    var itemPosition = {\n                        row: coordinates.row,\n                        column: coordinates.column,\n                        top: containerMargins.top + coordinates.row * groupInfo.cellHeight,\n                        left: containerMargins[leftStr] + coordinates.column * groupInfo.cellWidth,\n                        height: coordinates.contentHeight,\n                        width: coordinates.contentWidth\n                    };\n\n                    return itemPosition;\n                },\n\n                _layoutItem: function CellSpanningGroup_layoutItem(index) {\n                    var entry = this.getItemSize(index);\n                    this._items[index].style.cssText +=\n                        \";-ms-grid-row:\" + (entry.row + 1) +\n                        \";-ms-grid-column:\" + (entry.column + 1) +\n                        \";-ms-grid-row-span:\" + entry.rows +\n                        \";-ms-grid-column-span:\" + entry.columns +\n                        \";height:\" + entry.contentHeight +\n                        \"px;width:\" + entry.contentWidth + \"px\";\n                    _ElementUtilities.addClass(this._items[index], _Constants._laidOutClass);\n\n                    return this._items[index];\n                },\n\n                _cleanContainers: function CellSpanningGroup_cleanContainers() {\n                    var items = this._items,\n                        len = items.length,\n                        i;\n                    for (i = 0; i < len; i++) {\n                        items[i].style.cssText = \"\";\n                        _ElementUtilities.removeClass(items[i], _Constants._laidOutClass);\n                    }\n                },\n\n                // Occupancy map\n\n                getColumnCount: function CellSpanningGroup_getColumnCount() {\n                    return Math.ceil(this.occupancyMap.length / this._slotsPerColumn);\n                },\n\n                getOccupancyMapItemCount: function CellSpanningGroup_getOccupancyMapItemCount() {\n                    var index = -1;\n\n                    // Use forEach as the map may be sparse\n                    this.occupancyMap.forEach(function (item) {\n                        if (item.index > index) {\n                            index = item.index;\n                        }\n                    });\n\n                    return index + 1;\n                },\n\n                coordinateToIndex: function CellSpanningGroup_coordinateToIndex(c, r) {\n                    return c * this._slotsPerColumn + r;\n                },\n\n                markSlotAsFull: function CellSpanningGroup_markSlotAsFull(index, itemEntry) {\n                    var coordinates = this._layout._indexToCoordinate(index, this._slotsPerColumn),\n                        toRow = coordinates.row + itemEntry.rows;\n                    for (var r = coordinates.row; r < toRow && r < this._slotsPerColumn; r++) {\n                        for (var c = coordinates.column, toColumn = coordinates.column + itemEntry.columns; c < toColumn; c++) {\n                            this.occupancyMap[this.coordinateToIndex(c, r)] = itemEntry;\n                        }\n                    }\n                    this._offScreenSlotsPerColumn = Math.max(this._offScreenSlotsPerColumn, toRow - this._slotsPerColumn);\n                },\n\n                isSlotEmpty: function CellSpanningGroup_isSlotEmpty(itemSize, row, column) {\n                    for (var r = row, toRow = row + itemSize.rows; r < toRow; r++) {\n                        for (var c = column, toColumn = column + itemSize.columns; c < toColumn; c++) {\n                            if ((r >= this._slotsPerColumn) || (this.occupancyMap[this.coordinateToIndex(c, r)] !== undefined)) {\n                                return false;\n                            }\n                        }\n                    }\n                    return true;\n                },\n\n                findEmptySlot: function CellSpanningGroup_findEmptySlot(startIndex, itemSize, newColumn) {\n                    var coordinates = this._layout._indexToCoordinate(startIndex, this._slotsPerColumn),\n                        startRow = coordinates.row,\n                        lastColumn = Math.floor((this.occupancyMap.length - 1) / this._slotsPerColumn);\n\n                    if (newColumn) {\n                        for (var c = coordinates.column + 1; c <= lastColumn; c++) {\n                            if (this.isSlotEmpty(itemSize, 0, c)) {\n                                return this.coordinateToIndex(c, 0);\n                            }\n                        }\n                    } else {\n                        for (var c = coordinates.column; c <= lastColumn; c++) {\n                            for (var r = startRow; r < this._slotsPerColumn; r++) {\n                                if (this.isSlotEmpty(itemSize, r, c)) {\n                                    return this.coordinateToIndex(c, r);\n                                }\n                            }\n                            startRow = 0;\n                        }\n                    }\n\n                    return (lastColumn + 1) * this._slotsPerColumn;\n                },\n\n                findItem: function CellSpanningGroup_findItem(index) {\n                    for (var inMapIndex = index, len = this.occupancyMap.length; inMapIndex < len; inMapIndex++) {\n                        var entry = this.occupancyMap[inMapIndex];\n                        if (entry && entry.index === index) {\n                            return inMapIndex;\n                        }\n                    }\n                    return inMapIndex;\n                },\n\n                getItemSize: function CellSpanningGroup_getItemSize(index) {\n                    var inMapIndex = this.findItem(index),\n                        entry = this.occupancyMap[inMapIndex],\n                        coords = this._layout._indexToCoordinate(inMapIndex, this._slotsPerColumn);\n\n                    if (index === entry.index) {\n                        return {\n                            row: coords.row,\n                            column: coords.column,\n                            contentWidth: entry.contentWidth,\n                            contentHeight: entry.contentHeight,\n                            columns: entry.columns,\n                            rows: entry.rows\n                        };\n                    } else {\n                        return null;\n                    }\n                },\n\n                resetMap: function CellSpanningGroup_resetMap() {\n                    this.occupancyMap = [];\n                    this.lastAdded = 0;\n                    this._offScreenSlotsPerColumn = 0;\n                },\n\n                addItemToMap: function CellSpanningGroup_addItemToMap(index, itemInfo) {\n                    var that = this;\n\n                    function add(mapEntry, newColumn) {\n                        var inMapIndex = that.findEmptySlot(that.lastAdded, mapEntry, newColumn);\n                        that.lastAdded = inMapIndex;\n                        that.markSlotAsFull(inMapIndex, mapEntry);\n                    }\n\n                    var groupInfo = that.groupInfo,\n                        margins = that._layout._sizes.containerMargins,\n                        mapEntry = {\n                            index: index,\n                            contentWidth: itemInfo.width,\n                            contentHeight: itemInfo.height,\n                            columns: Math.max(1, Math.ceil((itemInfo.width + margins.left + margins.right) / groupInfo.cellWidth)),\n                            rows: Math.max(1, Math.ceil((itemInfo.height + margins.top + margins.bottom) / groupInfo.cellHeight))\n                        };\n\n                    add(mapEntry, itemInfo.newColumn);\n                },\n\n                indexFromOffset: function CellSpanningGroup_indexFromOffset(adjustedOffset, wholeItem, last) {\n                    var measuredWidth = 0,\n                        lastItem = 0,\n                        groupInfo = this.groupInfo,\n                        index = 0;\n\n                    if (this.occupancyMap.length > 0) {\n                        lastItem = this.getOccupancyMapItemCount() - 1;\n                        measuredWidth = Math.ceil((this.occupancyMap.length - 1) / this._slotsPerColumn) * groupInfo.cellWidth;\n\n                        if (adjustedOffset < measuredWidth) {\n                            var counter = this._slotsPerColumn,\n                                index = (Math.max(0, Math.floor(adjustedOffset / groupInfo.cellWidth)) + last) * this._slotsPerColumn - last;\n                            while (!this.occupancyMap[index] && counter-- > 0) {\n                                index += (last > 0 ? -1 : 1);\n                            }\n                            return {\n                                index: index,\n                                item: this.occupancyMap[index].index\n                            };\n                        } else {\n                            index = this.occupancyMap.length - 1;\n                        }\n                    }\n\n                    return {\n                        index: index,\n                        item: lastItem + (Math.max(0, Math.floor((adjustedOffset - measuredWidth) / groupInfo.cellWidth)) + last) * this._slotsPerColumn - last\n                    };\n                }\n            });\n        })\n\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n\n        ListLayout: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports._LegacyLayout, function ListLayout_ctor(options) {\n                /// <signature helpKeyword=\"WinJS.UI.ListLayout\">\n                /// <summary locid=\"WinJS.UI.ListLayout\">\n                /// Creates a new ListLayout object.\n                /// </summary>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.ListLayout_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options\n                /// object corresponds to one of the object's properties or events. Event names must begin with \"on\".\n                /// </param>\n                /// <returns type=\"WinJS.UI.ListLayout\" locid=\"WinJS.UI.ListLayout_returnValue\">\n                /// The new ListLayout object.\n                /// </returns>\n                /// </signature>\n                options = options || {};\n                this._itemInfo = {};\n                this._groupInfo = {};\n                this._groupHeaderPosition = options.groupHeaderPosition || HeaderPosition.top;\n                this._inListMode = true;\n                this.orientation = options.orientation || \"vertical\";\n            }, {\n                initialize: function ListLayout_initialize(site, groupsEnabled) {\n                    _ElementUtilities.addClass(site.surface, _Constants._listLayoutClass);\n                    exports._LegacyLayout.prototype.initialize.call(this, site, groupsEnabled);\n                },\n\n                uninitialize: function ListLayout_uninitialize() {\n                    if (this._site) {\n                        _ElementUtilities.removeClass(this._site.surface, _Constants._listLayoutClass);\n                    }\n                    exports._LegacyLayout.prototype.uninitialize.call(this);\n                },\n\n                layout: function ListLayout_layout(tree, changedRange, modifiedItems, modifiedGroups) {\n                    if (!this._groupsEnabled && !this._horizontal) {\n                        return this._layoutNonGroupedVerticalList(tree, changedRange, modifiedItems, modifiedGroups);\n                    } else {\n                        return exports._LegacyLayout.prototype.layout.call(this, tree, changedRange, modifiedItems, modifiedGroups);\n                    }\n                },\n\n                _layoutNonGroupedVerticalList: function ListLayout_layoutNonGroupedVerticalList(tree, changedRange, modifiedItems, modifiedGroups) {\n                    var that = this;\n                    var perfId = \"Layout:_layoutNonGroupedVerticalList\";\n                    that._site._writeProfilerMark(perfId + \",StartTM\");\n                    this._layoutPromise = that._measureItem(0).then(function () {\n                        _ElementUtilities[(that._usingStructuralNodes) ? \"addClass\" : \"removeClass\"]\n                            (that._site.surface, _Constants._structuralNodesClass);\n                        _ElementUtilities[(that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) ? \"addClass\" : \"removeClass\"]\n                            (that._site.surface, _Constants._singleItemsBlockClass);\n\n\n                        if (that._sizes.viewportContentSize !== that._getViewportCrossSize()) {\n                            that._viewportSizeChanged(that._getViewportCrossSize());\n                        }\n\n                        that._cacheRemovedElements(modifiedItems, that._cachedItemRecords, that._cachedInsertedItemRecords, that._cachedRemovedItems, false);\n                        that._cacheRemovedElements(modifiedGroups, that._cachedHeaderRecords, that._cachedInsertedHeaderRecords, that._cachedRemovedHeaders, true);\n\n                        var itemsContainer = tree[0].itemsContainer,\n                            group = new Groups.UniformFlowGroup(that, itemsContainer);\n                        that._groups = [group];\n                        group.groupInfo = { enableCellSpanning: false };\n                        group.startIndex = 0;\n                        group.count = getItemsContainerLength(itemsContainer);\n                        group.offset = 0;\n                        group.layout();\n\n                        that._site._writeProfilerMark(perfId + \":setSurfaceWidth,info\");\n                        that._site.surface.style.width = that._sizes.surfaceContentSize + \"px\";\n\n                        that._layoutAnimations(modifiedItems, modifiedGroups);\n                        that._site._writeProfilerMark(perfId + \":complete,info\");\n                        that._site._writeProfilerMark(perfId + \",StopTM\");\n                    }, function (error) {\n                        that._site._writeProfilerMark(perfId + \":canceled,info\");\n                        that._site._writeProfilerMark(perfId + \",StopTM\");\n                        return Promise.wrapError(error);\n                    });\n                    return {\n                        realizedRangeComplete: this._layoutPromise,\n                        layoutComplete: this._layoutPromise\n                    };\n                },\n\n                numberOfItemsPerItemsBlock: {\n                    get: function ListLayout_getNumberOfItemsPerItemsBlock() {\n                        var that = this;\n                        // Measure when numberOfItemsPerItemsBlock is called so that we measure before ListView has created the full tree structure\n                        // which reduces the trident layout required by measure.\n                        return this._measureItem(0).then(function () {\n                            if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {\n                                // Store all items in a single itemsblock\n                                that._usingStructuralNodes = true;\n                                return Number.MAX_VALUE;\n                            } else {\n                                that._usingStructuralNodes = exports.ListLayout._numberOfItemsPerItemsBlock > 0;\n                                return exports.ListLayout._numberOfItemsPerItemsBlock;\n                            }\n                        });\n                    }\n                },\n            }, {\n                // The maximum number of win-containers to put into each items block. win-containers\n                // are grouped into items blocks in order to mitigate the costs of the platform doing\n                // a layout in response to insertions and removals of win-containers.\n                _numberOfItemsPerItemsBlock: 10\n            });\n        }),\n\n        CellSpanningLayout: _Base.Namespace._lazy(function () {\n            return _Base.Class.derive(exports._LayoutCommon, function CellSpanningLayout_ctor(options) {\n                /// <signature helpKeyword=\"WinJS.UI.CellSpanningLayout\">\n                /// <summary locid=\"WinJS.UI.CellSpanningLayout\">\n                /// Creates a new CellSpanningLayout object.\n                /// </summary>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.CellSpanningLayout_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new object. Each property of the options\n                /// object corresponds to one of the object's properties or events. Event names must begin with \"on\".\n                /// </param>\n                /// <returns type=\"WinJS.UI.CellSpanningLayout\" locid=\"WinJS.UI.CellSpanningLayout_returnValue\">\n                /// The new CellSpanningLayout object.\n                /// </returns>\n                /// </signature>\n                options = options || {};\n                this._itemInfo = options.itemInfo;\n                this._groupInfo = options.groupInfo;\n                this._groupHeaderPosition = options.groupHeaderPosition || HeaderPosition.top;\n                this._horizontal = true;\n                this._cellSpanning = true;\n            }, {\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.CellSpanningLayout.maximumRowsOrColumns\" helpKeyword=\"WinJS.UI.CellSpanningLayout.maximumRowsOrColumns\">\n                /// Gets or set the maximum number of rows or columns, depending on the orientation, to display before content begins to wrap.\n                /// A value of 0 indicates that there is no maximum.\n                /// </field>\n                maximumRowsOrColumns: {\n                    get: function () {\n                        return this._maxRowsOrColumns;\n                    },\n                    set: function (value) {\n                        this._setMaxRowsOrColumns(value);\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.CellSpanningLayout.itemInfo\" helpKeyword=\"WinJS.UI.CellSpanningLayout.itemInfo\">\n                /// Gets or sets a function that returns the width and height of an item, as well as whether\n                /// it should  appear in a new column. Setting this function improves performance because\n                /// the ListView can allocate space for an item without having to measure it first.\n                /// The function takes a single parameter: the index of the item to render.\n                /// The function returns an object that has three properties:\n                /// width: The  total width of the item.\n                /// height: The total height of the item.\n                /// newColumn: Set to true to create a column break; otherwise, false.\n                /// </field>\n                itemInfo: {\n                    enumerable: true,\n                    get: function () {\n                        return this._itemInfo;\n                    },\n                    set: function (itemInfo) {\n                        this._itemInfo = itemInfo;\n                        this._invalidateLayout();\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.CellSpanningLayout.groupInfo\" helpKeyword=\"WinJS.UI.CellSpanningLayout.groupInfo\">\n                /// Gets or sets a function that enables cell-spanning and establishes base cell dimensions.\n                /// The function returns an object that has these properties:\n                /// enableCellSpanning: Set to true to allow the ListView to contain items of multiple sizes.\n                /// cellWidth: The width of the base cell.\n                /// cellHeight: The height of the base cell.\n                /// </field>\n                groupInfo: {\n                    enumerable: true,\n                    get: function () {\n                        return this._groupInfo;\n                    },\n                    set: function (groupInfo) {\n                        this._groupInfo = groupInfo;\n                        this._invalidateLayout();\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Orientation\" locid=\"WinJS.UI.CellSpanningLayout.orientation\" helpKeyword=\"WinJS.UI.CellSpanningLayout.orientation\">\n                /// Gets the orientation of the layout. CellSpanning layout only supports horizontal orientation.\n                /// </field>\n                orientation: {\n                    enumerable: true,\n                    get: function () {\n                        return \"horizontal\";\n                    }\n                }\n            });\n        }),\n\n        _LayoutWrapper: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function LayoutWrapper_ctor(layout) {\n                this.defaultAnimations = true;\n\n                // Initialize and hitTest are required\n                this.initialize = function LayoutWrapper_initialize(site, groupsEnabled) {\n                    layout.initialize(site, groupsEnabled);\n                };\n                this.hitTest = function LayoutWrapper_hitTest(x, y) {\n                    return layout.hitTest(x, y);\n                };\n\n                // These methods are optional\n                layout.uninitialize && (this.uninitialize = function LayoutWrapper_uninitialize() {\n                    layout.uninitialize();\n                });\n\n                if (\"numberOfItemsPerItemsBlock\" in layout) {\n                    Object.defineProperty(this, \"numberOfItemsPerItemsBlock\", {\n                        get: function LayoutWrapper_getNumberOfItemsPerItemsBlock() {\n                            return layout.numberOfItemsPerItemsBlock;\n                        }\n                    });\n                }\n\n                layout._getItemPosition && (this._getItemPosition = function LayoutWrapper_getItemPosition(index) {\n                    return layout._getItemPosition(index);\n                });\n\n                layout.itemsFromRange && (this.itemsFromRange = function LayoutWrapper_itemsFromRange(start, end) {\n                    return layout.itemsFromRange(start, end);\n                });\n\n                layout.getAdjacent && (this.getAdjacent = function LayoutWrapper_getAdjacent(currentItem, pressedKey) {\n                    return layout.getAdjacent(currentItem, pressedKey);\n                });\n\n                layout.dragOver && (this.dragOver = function LayoutWrapper_dragOver(x, y, dragInfo) {\n                    return layout.dragOver(x, y, dragInfo);\n                });\n\n                layout.dragLeave && (this.dragLeave = function LayoutWrapper_dragLeave() {\n                    return layout.dragLeave();\n                });\n                var propertyDefinition = {\n                    enumerable: true,\n                    get: function () {\n                        return \"vertical\";\n                    }\n                };\n                if (layout.orientation !== undefined) {\n                    propertyDefinition.get = function () {\n                        return layout.orientation;\n                    };\n                    propertyDefinition.set = function (value) {\n                        layout.orientation = value;\n                    };\n                }\n                Object.defineProperty(this, \"orientation\", propertyDefinition);\n\n                if (layout.setupAnimations || layout.executeAnimations) {\n                    this.defaultAnimations = false;\n                    this.setupAnimations = function LayoutWrapper_setupAnimations() {\n                        return layout.setupAnimations();\n                    };\n                    this.executeAnimations = function LayoutWrapper_executeAnimations() {\n                        return layout.executeAnimations();\n                    };\n                }\n\n                if (layout.layout) {\n                    if (this.defaultAnimations) {\n                        var that = this;\n                        this.layout = function LayoutWrapper_layout(tree, changedRange, modifiedItems, modifiedGroups) {\n                            var promises = normalizeLayoutPromises(layout.layout(tree, changedRange, [], [])),\n                                synchronous;\n                            promises.realizedRangeComplete.then(function () {\n                                synchronous = true;\n                            });\n                            synchronous && that._layoutAnimations(modifiedItems, modifiedGroups);\n                            return promises;\n                        };\n                    } else {\n                        this.layout = function LayoutWrapper_layout(tree, changedRange, modifiedItems, modifiedGroups) {\n                            return normalizeLayoutPromises(layout.layout(tree, changedRange, modifiedItems, modifiedGroups));\n                        };\n                    }\n                }\n            }, {\n                uninitialize: function LayoutWrapper_uninitialize() {\n                },\n                numberOfItemsPerItemsBlock: {\n                    get: function LayoutWrapper_getNumberOfItemsPerItemsBlock() {\n                    }\n                },\n                layout: function LayoutWrapper_layout(tree, changedRange, modifiedItems, modifiedGroups) {\n                    if (this.defaultAnimations) {\n                        this._layoutAnimations(modifiedItems, modifiedGroups);\n                    }\n                    return normalizeLayoutPromises();\n                },\n                itemsFromRange: function LayoutWrapper_itemsFromRange() {\n                    return { firstIndex: 0, lastIndex: Number.MAX_VALUE };\n                },\n                getAdjacent: function LayoutWrapper_getAdjacent(currentItem, pressedKey) {\n\n                    switch (pressedKey) {\n                        case Key.pageUp:\n                        case Key.upArrow:\n                        case Key.leftArrow:\n                            return { type: currentItem.type, index: currentItem.index - 1 };\n                        case Key.downArrow:\n                        case Key.rightArrow:\n                        case Key.pageDown:\n                            return { type: currentItem.type, index: currentItem.index + 1 };\n                    }\n                },\n                dragOver: function LayoutWrapper_dragOver() {\n                },\n                dragLeave: function LayoutWrapper_dragLeaver() {\n                },\n                setupAnimations: function LayoutWrapper_setupAnimations() {\n                },\n                executeAnimations: function LayoutWrapper_executeAnimations() {\n                },\n                _getItemPosition: function LayoutWrapper_getItemPosition() {\n                },\n                _layoutAnimations: function LayoutWrapper_layoutAnimations() {\n                },\n            });\n        }),\n    });\n\n    function normalizeLayoutPromises(retVal) {\n        if (Promise.is(retVal)) {\n            return {\n                realizedRangeComplete: retVal,\n                layoutComplete: retVal\n            };\n        } else if (typeof retVal === \"object\" && retVal && retVal.layoutComplete) {\n            return retVal;\n        } else {\n            return {\n                realizedRangeComplete: Promise.wrap(),\n                layoutComplete: Promise.wrap()\n            };\n        }\n    }\n\n    var HeaderPosition = {\n        left: \"left\",\n        top: \"top\"\n    };\n\n    function getMargins(element) {\n        return {\n            left: getDimension(element, \"marginLeft\"),\n            right: getDimension(element, \"marginRight\"),\n            top: getDimension(element, \"marginTop\"),\n            bottom: getDimension(element, \"marginBottom\")\n        };\n    }\n\n    // Layout, _LayoutCommon, and _LegacyLayout are defined ealier so that their fully\n    // qualified names can be used in _Base.Class.derive. This is required by Blend.\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        HeaderPosition: HeaderPosition,\n        _getMargins: getMargins\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView/_VirtualizeContentsView',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Promise',\n    '../../_Signal',\n    '../../Scheduler',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_SafeHtml',\n    '../../Utilities/_UI',\n    '../ItemContainer/_Constants',\n    '../ItemContainer/_ItemEventsHandler',\n    './_Helpers',\n    './_ItemsContainer'\n], function virtualizeContentsViewInit(exports, _Global, _Base, _BaseUtils, Promise, _Signal, Scheduler, _Dispose, _ElementUtilities, _SafeHtml, _UI, _Constants, _ItemEventsHandler, _Helpers, _ItemsContainer) {\n    \"use strict\";\n\n    function setFlow(from, to) {\n        _ElementUtilities._setAttribute(from, \"aria-flowto\", to.id);\n        _ElementUtilities._setAttribute(to, \"x-ms-aria-flowfrom\", from.id);\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _VirtualizeContentsView: _Base.Namespace._lazy(function () {\n\n            function cooperativeQueueWorker(info) {\n                var workItems = info.job._workItems;\n                var work;\n                while (workItems.length && !info.shouldYield) {\n                    work = workItems.shift();\n                    work();\n                }\n\n                info.setWork(cooperativeQueueWorker);\n\n                if (!workItems.length) {\n                    info.job.pause();\n                }\n            }\n\n            function scheduleQueueJob(priority, name) {\n\n                var job = Scheduler.schedule(cooperativeQueueWorker, priority, null, name);\n\n                job._workItems = [];\n\n                job.addWork = function (work, head) {\n                    if (head) {\n                        this._workItems.unshift(work);\n                    } else {\n                        this._workItems.push(work);\n                    }\n                    this.resume();\n                };\n\n                job.clearWork = function () {\n                    this._workItems.length = 0;\n                };\n\n                job.dispose = function () {\n                    this.cancel();\n                    this._workItems.length = 0;\n                };\n\n                return job;\n            }\n\n            function shouldWaitForSeZo(listView) {\n                return listView._zooming || listView._pinching;\n            }\n\n            function waitForSeZo(listView, timeout) {\n                // waitForSeZo will block until sezo calls endZoom on listview, or a timeout duration has elapsed to\n                // unblock a potential deadlock between the sezo waiting on container creation, and container creation\n                // waiting on endZoom.\n\n                if (listView._isZombie()) { return Promise.wrap(); }\n                if (shouldWaitForSeZo(listView)) {\n                    if (+timeout !== timeout) {\n                        timeout = _VirtualizeContentsView._waitForSeZoTimeoutDuration;\n                    }\n                    //To improve SeZo's zoom animation and pinch detection perf, we want to ensure unimportant task\n                    //is only run while zooming or pinching is not in progress.\n                    return Promise.timeout(_VirtualizeContentsView._waitForSeZoIntervalDuration).then(function () {\n                        timeout -= _VirtualizeContentsView._waitForSeZoIntervalDuration;\n                        if (timeout <= 0) {\n                            return true;\n                        }\n                        return waitForSeZo(listView, timeout);\n                    });\n                } else {\n                    return Promise.wrap();\n                }\n            }\n\n            function makeFunctor(scrollToFunctor) {\n                if (typeof scrollToFunctor === \"number\") {\n                    var pos = scrollToFunctor;\n\n                    scrollToFunctor = function () {\n                        return {\n                            position: pos,\n                            direction: \"right\"\n                        };\n                    };\n                }\n                return scrollToFunctor;\n            }\n\n            var _VirtualizeContentsView = _Base.Class.define(function VirtualizeContentsView_ctor(listView) {\n\n                this._listView = listView;\n                this._forceRelayout = false;\n                this.maxLeadingPages = _BaseUtils._isiOS ? _VirtualizeContentsView._iOSMaxLeadingPages : _VirtualizeContentsView._defaultPagesToPrefetch;\n                this.maxTrailingPages = _BaseUtils._isiOS ? _VirtualizeContentsView._iOSMaxTrailingPages : _VirtualizeContentsView._defaultPagesToPrefetch;\n                this.items = new _ItemsContainer._ItemsContainer(listView);\n                this.firstIndexDisplayed = -1;\n                this.lastIndexDisplayed = -1;\n                this.begin = 0;\n                this.end = 0;\n                this._realizePass = 1;\n                this._firstLayoutPass = true;\n                this._runningAnimations = null;\n                this._renderCompletePromise = Promise.wrap();\n                this._state = new CreatedState(this);\n                this._createLayoutSignal();\n                this._createTreeBuildingSignal();\n                this._layoutWork = null;\n                this._onscreenJob = scheduleQueueJob(Scheduler.Priority.aboveNormal, \"on-screen items\");\n                this._frontOffscreenJob = scheduleQueueJob(Scheduler.Priority.normal, \"front off-screen items\");\n                this._backOffscreenJob = scheduleQueueJob(Scheduler.Priority.belowNormal, \"back off-screen items\");\n                this._scrollbarPos = 0;\n                this._direction = \"right\";\n                this._scrollToFunctor = makeFunctor(0);\n            },\n            {\n\n                _dispose: function VirtualizeContentsView_dispose() {\n                    this.cleanUp();\n                    this.items = null;\n                    this._renderCompletePromise && this._renderCompletePromise.cancel();\n                    this._renderCompletePromise = null;\n                    this._onscreenJob.dispose();\n                    this._frontOffscreenJob.dispose();\n                    this._backOffscreenJob.dispose();\n                },\n\n                _createItem: function VirtualizeContentsView_createItem(itemIndex, itemPromise, available, unavailable) {\n                    this._listView._writeProfilerMark(\"createItem(\" + itemIndex + \") \" + this._getBoundingRectString(itemIndex) + \",info\");\n\n                    var that = this;\n                    that._listView._itemsManager._itemFromItemPromiseThrottled(itemPromise).done(\n                        function (element) {\n                            if (element) {\n                                available(itemIndex, element, that._listView._itemsManager._recordFromElement(element));\n                            } else {\n                                unavailable(itemIndex);\n                            }\n                        },\n                        function (err) {\n                            unavailable(itemIndex);\n                            return Promise.wrapError(err);\n                        }\n                    );\n                },\n\n                _addItem: function VirtualizeContentsView_addItem(fragment, itemIndex, element, currentPass) {\n                    if (this._realizePass === currentPass) {\n                        var record = this._listView._itemsManager._recordFromElement(element);\n\n                        delete this._pendingItemPromises[record.itemPromise.handle];\n\n                        this.items.setItemAt(itemIndex, {\n                            itemBox: null,\n                            container: null,\n                            element: element,\n                            detached: true,\n                            itemsManagerRecord: record\n                        });\n                    }\n                },\n\n                lastItemIndex: function VirtualizeContentsView_lastItemIndex() {\n                    return (this.containers ? (this.containers.length - 1) : -1);\n                },\n\n                _setSkipRealizationForChange: function (skip) {\n                    if (skip) {\n                        if (this._realizationLevel !== _VirtualizeContentsView._realizationLevel.realize) {\n                            this._realizationLevel = _VirtualizeContentsView._realizationLevel.skip;\n                        }\n                    } else {\n                        this._realizationLevel = _VirtualizeContentsView._realizationLevel.realize;\n                    }\n                },\n\n                _realizeItems: function VirtualizeContentsView_realizeItems(fragment, begin, end, count, currentPass, scrollbarPos, direction, firstInView, lastInView, ignoreGaps) {\n                    var perfId = \"_realizeItems(\" + begin + \"-\" + (end - 1) + \") visible(\" + firstInView + \"-\" + lastInView + \")\";\n\n                    this._listView._writeProfilerMark(perfId + \",StartTM\");\n\n                    direction = direction || \"right\";\n\n                    var counter = end - begin;\n                    var inView = lastInView - firstInView + 1,\n                        inViewCounter = inView,\n                        rightOffscreenCount = end - lastInView - 1,\n                        leftOffscreenCount = firstInView - begin;\n                    var renderCompletePromises = [];\n                    var entranceAnimationSignal = new _Signal();\n                    var viewportItemsRealized = new _Signal();\n                    var frontItemsRealized = new _Signal();\n\n                    var that = this;\n\n                    function itemIsReady(itemIndex, itemsManagerRecord) {\n                        renderCompletePromises.push(Promise._cancelBlocker(itemsManagerRecord.renderComplete));\n\n                        delivered(itemIndex);\n                    }\n\n                    function appendItemsToDom(startIndex, endIndex) {\n                        that._listView._writeProfilerMark(\"_realizeItems_appendedItemsToDom,StartTM\");\n                        if (that._listView._isZombie()) { return; }\n\n                        function updateDraggable(itemData, element) {\n                            if (!itemData.updatedDraggableAttribute && (that._listView.itemsDraggable || that._listView.itemsReorderable)) {\n                                itemData.itemsManagerRecord.renderComplete.done(function () {\n                                    if (that._realizePass === currentPass) {\n                                        if (!_ElementUtilities.hasClass(element, _Constants._nonDraggableClass)) {\n                                            itemData.itemBox.draggable = true;\n                                        }\n                                        itemData.updatedDraggableAttribute = true;\n                                    }\n                                });\n                            }\n                        }\n\n                        var itemIndex;\n                        var appendItemsCount = 0;\n                        var firstIndex = -1;\n                        var lastIndex = -1;\n                        for (itemIndex = startIndex; itemIndex <= endIndex; itemIndex++) {\n                            var itemData = that.items.itemDataAt(itemIndex);\n                            if (itemData) {\n                                var element = itemData.element,\n                                    itemBox = itemData.itemBox;\n\n                                if (!itemBox) {\n                                    itemBox = that._listView._itemBoxTemplate.cloneNode(true);\n                                    itemData.itemBox = itemBox;\n\n                                    itemBox.appendChild(element);\n                                    _ElementUtilities.addClass(element, _Constants._itemClass);\n\n                                    that._listView._setupAriaSelectionObserver(element);\n\n                                    if (that._listView._isSelected(itemIndex)) {\n                                        _ItemEventsHandler._ItemEventsHandler.renderSelection(itemBox, element, true, true);\n                                    }\n\n                                    that._listView._currentMode().renderDragSourceOnRealizedItem(itemIndex, itemBox);\n                                }\n\n                                updateDraggable(itemData, element);\n\n                                var container = that.getContainer(itemIndex);\n                                if (itemBox.parentNode !== container) {\n                                    itemData.container = container;\n                                    that._appendAndRestoreFocus(container, itemBox);\n\n                                    appendItemsCount++;\n                                    if (firstIndex < 0) {\n                                        firstIndex = itemIndex;\n                                    }\n                                    lastIndex = itemIndex;\n\n                                    if (that._listView._isSelected(itemIndex)) {\n                                        _ElementUtilities.addClass(container, _Constants._selectedClass);\n                                    }\n\n                                    _ElementUtilities.removeClass(container, _Constants._backdropClass);\n\n                                    // elementAvailable needs to be called after fragment.appendChild. elementAvailable fulfills a promise for items requested\n                                    // by the keyboard focus handler. That handler will explicitly call .focus() on the element, so in order for\n                                    // the focus handler to work, the element needs to be in a tree prior to focusing.\n\n                                    that.items.elementAvailable(itemIndex);\n                                }\n                            }\n                        }\n\n                        that._listView._writeProfilerMark(\"_realizeItems_appendedItemsToDom,StopTM\");\n                        if (appendItemsCount > 0) {\n                            that._listView._writeProfilerMark(\"_realizeItems_appendedItemsToDom:\" + appendItemsCount + \" (\" + firstIndex + \"-\" + lastIndex + \"),info\");\n                            that._reportElementsLevel(direction);\n                        }\n                    }\n\n                    function removeGaps(first, last, begin, end) {\n                        if (ignoreGaps) {\n                            return;\n                        }\n                        // If we realized items 0 through 20 and then scrolled so that items 25 - 30 are on screen when we\n                        // append them to the dom we should remove items 0 - 20 from the dom so there are no gaps between the\n                        // two realized spots.\n\n                        // Walk backwards from the beginning and if we find an item which is missing remove the rest\n                        var foundMissing = false;\n                        while (first >= begin) {\n                            foundMissing = testGap(first, foundMissing);\n                            first--;\n                        }\n\n                        // Walk forwards from the end and if we find an item which is missing remove the rest\n                        foundMissing = false;\n                        while (last <= end) {\n                            foundMissing = testGap(last, foundMissing);\n                            last++;\n                        }\n\n                        function testGap(itemIndex, foundMissing) {\n                            // This helper method is called for each index and once an item is missing from the dom\n                            // it removes any future one it encounters.\n                            var itemData = that.items.itemDataAt(itemIndex);\n                            if (itemData) {\n                                var itemBox = itemData.itemBox;\n                                if (!itemBox || !itemBox.parentNode) {\n                                    return true;\n                                } else if (foundMissing) {\n                                    _ElementUtilities.addClass(itemBox.parentNode, _Constants._backdropClass);\n                                    itemBox.parentNode.removeChild(itemBox);\n                                    return true;\n                                } else {\n                                    return false;\n                                }\n                            } else {\n                                return true;\n                            }\n                        }\n                    }\n\n                    function scheduleReadySignal(first, last, job, dir, head) {\n                        var promises = [];\n\n                        for (var i = first; i <= last; i++) {\n                            var itemData = that.items.itemDataAt(i);\n                            if (itemData) {\n                                promises.push(itemData.itemsManagerRecord.itemPromise);\n                            }\n                        }\n\n                        function schedule(itemIndex) {\n                            var itemData = that.items.itemDataAt(itemIndex);\n                            if (itemData) {\n                                var record = itemData.itemsManagerRecord;\n                                if (!record.readyComplete && that._realizePass === currentPass) {\n                                    job.addWork(function () {\n                                        if (that._listView._isZombie()) {\n                                            return;\n                                        }\n                                        if (record.pendingReady && that._realizePass === currentPass) {\n                                            that._listView._writeProfilerMark(\"pendingReady(\" + itemIndex + \"),info\");\n                                            record.pendingReady();\n                                        }\n                                    }, head);\n                                }\n                            }\n                        }\n\n                        Promise.join(promises).then(function () {\n                            if (dir === \"right\") {\n                                for (var i = first; i <= last; i++) {\n                                    schedule(i);\n                                }\n                            } else {\n                                for (var i = last; i >= first; i--) {\n                                    schedule(i);\n                                }\n                            }\n                        });\n                    }\n\n                    function delivered(index) {\n                        if (that._realizePass !== currentPass) {\n                            return;\n                        }\n\n                        if (index >= firstInView && index <= lastInView) {\n                            if (--inViewCounter === 0) {\n                                appendItemsToDom(firstInView, lastInView);\n                                removeGaps(firstInView, lastInView, begin, end);\n\n                                if (that._firstLayoutPass) {\n                                    scheduleReadySignal(firstInView, lastInView, that._frontOffscreenJob, direction === \"right\" ? \"left\" : \"right\", true);\n\n                                    var entranceAnimation = Scheduler.schedulePromiseHigh(null, \"WinJS.UI.ListView.entranceAnimation\").then(function () {\n                                        if (that._listView._isZombie()) { return; }\n                                        that._listView._writeProfilerMark(\"entranceAnimation,StartTM\");\n                                        var promise = that._listView._animateListEntrance(!that._firstEntranceAnimated);\n                                        that._firstEntranceAnimated = true;\n                                        return promise;\n                                    });\n\n                                    that._runningAnimations = Promise.join([that._runningAnimations, entranceAnimation]);\n                                    that._runningAnimations.done(function () {\n                                        that._listView._writeProfilerMark(\"entranceAnimation,StopTM\");\n                                        if (that._realizePass === currentPass) {\n                                            that._runningAnimations = null;\n                                            entranceAnimationSignal.complete();\n                                        }\n                                    });\n                                    that._firstLayoutPass = false;\n\n                                    if (that._listView._isCurrentZoomView) {\n                                        Scheduler.requestDrain(that._onscreenJob.priority);\n                                    }\n                                } else {\n                                    // during scrolling ready for onscreen items after front off screen items\n                                    scheduleReadySignal(firstInView, lastInView, that._frontOffscreenJob, direction);\n                                    entranceAnimationSignal.complete();\n                                }\n\n                                that._updateHeaders(that._listView._canvas, firstInView, lastInView + 1).done(function () {\n                                    viewportItemsRealized.complete();\n                                });\n                            }\n                        } else if (index < firstInView) {\n                            --leftOffscreenCount;\n                            if (leftOffscreenCount % inView === 0) {\n                                appendItemsToDom(begin, firstInView - 1);\n                            }\n                            if (!leftOffscreenCount) {\n                                that._updateHeaders(that._listView._canvas, begin, firstInView).done(function () {\n                                    if (direction !== \"right\") {\n                                        frontItemsRealized.complete();\n                                    }\n                                });\n                                scheduleReadySignal(begin, firstInView - 1, direction !== \"right\" ? that._frontOffscreenJob : that._backOffscreenJob, \"left\");\n                            }\n                        } else if (index > lastInView) {\n                            --rightOffscreenCount;\n                            if (rightOffscreenCount % inView === 0) {\n                                appendItemsToDom(lastInView + 1, end - 1);\n                            }\n                            if (!rightOffscreenCount) {\n                                that._updateHeaders(that._listView._canvas, lastInView + 1, end).then(function () {\n                                    if (direction === \"right\") {\n                                        frontItemsRealized.complete();\n                                    }\n                                });\n                                scheduleReadySignal(lastInView + 1, end - 1, direction === \"right\" ? that._frontOffscreenJob : that._backOffscreenJob, \"right\");\n                            }\n                        }\n                        counter--;\n\n                        if (counter === 0) {\n                            that._renderCompletePromise = Promise.join(renderCompletePromises).then(null, function (e) {\n                                var error = Array.isArray(e) && e.some(function (item) { return item && !(item instanceof Error && item.name === \"Canceled\"); });\n                                if (error) {\n                                    // rethrow\n                                    return Promise.wrapError(e);\n                                }\n                            });\n\n                            (that._headerRenderPromises || Promise.wrap()).done(function () {\n                                Scheduler.schedule(function VirtualizeContentsView_async_delivered() {\n                                    if (that._listView._isZombie()) {\n                                        workCompleteSignal.cancel();\n                                    } else {\n                                        workCompleteSignal.complete();\n                                    }\n                                }, Math.min(that._onscreenJob.priority, that._backOffscreenJob.priority), null, \"WinJS.UI.ListView._allItemsRealized\");\n                            });\n                        }\n                    }\n\n                    function newItemIsReady(itemIndex, element, itemsManagerRecord) {\n                        if (that._realizePass === currentPass) {\n                            var element = itemsManagerRecord.element;\n                            that._addItem(fragment, itemIndex, element, currentPass);\n                            itemIsReady(itemIndex, itemsManagerRecord);\n                        }\n                    }\n\n                    if (counter > 0) {\n                        var createCount = 0;\n                        var updateCount = 0;\n                        var cleanCount = 0;\n                        that.firstIndexDisplayed = firstInView;\n                        that.lastIndexDisplayed = lastInView;\n\n                        var isCurrentZoomView = that._listView._isCurrentZoomView;\n                        if (that._highPriorityRealize && (that._firstLayoutPass || that._hasAnimationInViewportPending)) {\n                            // startup or edits that will animate items in the viewport\n                            that._highPriorityRealize = false;\n                            that._onscreenJob.priority = Scheduler.Priority.high;\n                            that._frontOffscreenJob.priority = Scheduler.Priority.normal;\n                            that._backOffscreenJob.priority = Scheduler.Priority.belowNormal;\n                        } else if (that._highPriorityRealize) {\n                            // edits that won't animate items in the viewport\n                            that._highPriorityRealize = false;\n                            that._onscreenJob.priority = Scheduler.Priority.high;\n                            that._frontOffscreenJob.priority = Scheduler.Priority.high - 1;\n                            that._backOffscreenJob.priority = Scheduler.Priority.high - 1;\n                        } else if (isCurrentZoomView) {\n                            // scrolling\n                            that._onscreenJob.priority = Scheduler.Priority.aboveNormal;\n                            that._frontOffscreenJob.priority = Scheduler.Priority.normal;\n                            that._backOffscreenJob.priority = Scheduler.Priority.belowNormal;\n                        } else {\n                            // hidden ListView in SeZo\n                            that._onscreenJob.priority = Scheduler.Priority.belowNormal;\n                            that._frontOffscreenJob.priority = Scheduler.Priority.idle;\n                            that._backOffscreenJob.priority = Scheduler.Priority.idle;\n                        }\n\n                        // Create a promise to wrap the work in the queue. When the queue gets to the last item we can mark\n                        // the work promise complete and if the work promise is canceled we cancel the queue.\n                        //\n                        var workCompleteSignal = new _Signal();\n\n                        // If the version manager recieves a notification we clear the work in the work queues\n                        //\n                        var cancelToken = that._listView._versionManager.cancelOnNotification(workCompleteSignal.promise);\n\n                        var queueStage1AfterStage0 = function (job, record) {\n                            if (record.startStage1) {\n                                record.stage0.then(function () {\n                                    if (that._realizePass === currentPass && record.startStage1) {\n                                        job.addWork(record.startStage1);\n                                    }\n                                });\n                            }\n                        };\n\n                        var queueWork = function (job, itemIndex) {\n                            var itemData = that.items.itemDataAt(itemIndex);\n                            if (!itemData) {\n                                var itemPromise = that._listView._itemsManager._itemPromiseAtIndex(itemIndex);\n\n                                // Remember this pending item promise and avoid canceling it from the previous realization pass.\n                                that._pendingItemPromises[itemPromise.handle] = itemPromise;\n                                delete that._previousRealizationPendingItemPromises[itemPromise.handle];\n\n                                job.addWork(function VirtualizeContentsView_realizeItemsWork() {\n                                    if (that._listView._isZombie()) {\n                                        return;\n                                    }\n\n                                    createCount++;\n                                    that._createItem(itemIndex, itemPromise, newItemIsReady, delivered);\n\n                                    // _createItem runs user code\n                                    if (that._listView._isZombie() || that._realizePass !== currentPass) {\n                                        return;\n                                    }\n\n                                    if (itemPromise.handle) {\n                                        var record = that._listView._itemsManager._recordFromHandle(itemPromise.handle);\n                                        queueStage1AfterStage0(job, record);\n                                    }\n                                });\n                            }\n\n                        };\n\n                        var queueRight = function (job, first, last) {\n                            for (var itemIndex = first; itemIndex <= last; itemIndex++) {\n                                queueWork(job, itemIndex);\n                            }\n                        };\n\n                        var queueLeft = function (job, first, last) {\n                            // Always build the left side in the direction away from the center.\n                            for (var itemIndex = last; itemIndex >= first; itemIndex--) {\n                                queueWork(job, itemIndex);\n                            }\n                        };\n\n                        var handleExistingRange = function (job, first, last) {\n                            for (var itemIndex = first; itemIndex <= last; itemIndex++) {\n                                var itemData = that.items.itemDataAt(itemIndex);\n                                if (itemData) {\n                                    var record = itemData.itemsManagerRecord;\n                                    itemIsReady(itemIndex, record);\n                                    updateCount++;\n                                    queueStage1AfterStage0(job, record);\n                                }\n                            }\n                        };\n\n                        // PendingItemPromises are the item promises which we have requested from the ItemsManager\n                        // which have not returned an element (placeholder or real). Since we only clean up items\n                        // which have an element in _unrealizeItems we need to remember these item promises. We cancel\n                        // the item promises from the previous realization iteration if those item promises are not\n                        // used for the current realization.\n                        this._previousRealizationPendingItemPromises = this._pendingItemPromises || {};\n                        this._pendingItemPromises = {};\n\n                        var emptyFront;\n                        if (direction === \"left\") {\n                            queueLeft(that._onscreenJob, firstInView, lastInView);\n                            queueLeft(that._frontOffscreenJob, begin, firstInView - 1);\n                            emptyFront = begin > (firstInView - 1);\n                        } else {\n                            queueRight(that._onscreenJob, firstInView, lastInView);\n                            queueRight(that._frontOffscreenJob, lastInView + 1, end - 1);\n                            emptyFront = lastInView + 1 > (end - 1);\n                        }\n\n                        // Anything left in _previousRealizationPendingItemPromises can be canceled here.\n                        // Note: we are doing this synchronously. If we didn't do it synchronously we would have had to merge\n                        // _previousRealizationPendingItemPromises and _pendingItemPromises together. This also has the great\n                        // benefit to cancel item promises in the backOffScreenArea which are much less important.\n                        for (var i = 0, handles = Object.keys(this._previousRealizationPendingItemPromises), len = handles.length; i < len; i++) {\n                            var handle = handles[i];\n                            that._listView._itemsManager.releaseItemPromise(this._previousRealizationPendingItemPromises[handle]);\n                        }\n                        this._previousRealizationPendingItemPromises = {};\n\n\n                        // Handle existing items in the second pass to make sure that raising ready signal is added to the queues after creating items\n                        handleExistingRange(that._onscreenJob, firstInView, lastInView);\n                        if (direction === \"left\") {\n                            handleExistingRange(that._frontOffscreenJob, begin, firstInView - 1);\n                        } else {\n                            handleExistingRange(that._frontOffscreenJob, lastInView + 1, end - 1);\n                        }\n\n                        var showProgress = (inViewCounter === lastInView - firstInView + 1);\n\n                        if (that._firstLayoutPass) {\n                            that._listView._canvas.style.opacity = 0;\n                        } else {\n                            if (showProgress) {\n                                that._listView._showProgressBar(that._listView._element, \"50%\", \"50%\");\n                            } else {\n                                that._listView._hideProgressBar();\n                            }\n                        }\n\n                        that._frontOffscreenJob.pause();\n                        that._backOffscreenJob.pause();\n\n                        viewportItemsRealized.promise.done(\n                            function () {\n                                that._frontOffscreenJob.resume();\n\n                                if (emptyFront) {\n                                    frontItemsRealized.complete();\n                                }\n                            },\n                            function () {\n                                workCompleteSignal.cancel();\n                            }\n                        );\n\n                        frontItemsRealized.promise.done(function () {\n                            that._listView._writeProfilerMark(\"frontItemsRealized,info\");\n\n                            if (direction === \"left\") {\n                                queueRight(that._backOffscreenJob, lastInView + 1, end - 1);\n                                handleExistingRange(that._backOffscreenJob, lastInView + 1, end - 1);\n                            } else {\n                                queueLeft(that._backOffscreenJob, begin, firstInView - 1);\n                                handleExistingRange(that._backOffscreenJob, begin, firstInView - 1);\n                            }\n\n                            that._backOffscreenJob.resume();\n                        });\n\n                        workCompleteSignal.promise.done(\n                            function () {\n                                that._listView._versionManager.clearCancelOnNotification(cancelToken);\n\n                                that._listView._writeProfilerMark(perfId + \" complete(created:\" + createCount + \" updated:\" + updateCount + \"),info\");\n                            },\n                            function (err) {\n                                that._listView._versionManager.clearCancelOnNotification(cancelToken);\n                                that._onscreenJob.clearWork();\n                                that._frontOffscreenJob.clearWork();\n                                that._backOffscreenJob.clearWork();\n\n                                entranceAnimationSignal.cancel();\n                                viewportItemsRealized.cancel();\n\n                                that._listView._writeProfilerMark(perfId + \" canceled(created:\" + createCount + \" updated:\" + updateCount + \" clean:\" + cleanCount + \"),info\");\n                                return Promise.wrapError(err);\n                            }\n                        );\n\n                        that._listView._writeProfilerMark(perfId + \",StopTM\");\n                        return {\n                            viewportItemsRealized: viewportItemsRealized.promise,\n                            allItemsRealized: workCompleteSignal.promise,\n                            loadingCompleted: Promise.join([workCompleteSignal.promise, entranceAnimationSignal.promise]).then(function () {\n                                var promises = [];\n\n                                for (var i = begin; i < end; i++) {\n                                    var itemData = that.items.itemDataAt(i);\n                                    if (itemData) {\n                                        promises.push(itemData.itemsManagerRecord.itemReadyPromise);\n                                    }\n                                }\n                                return Promise._cancelBlocker(Promise.join(promises));\n                            })\n                        };\n                    } else {\n                        that._listView._writeProfilerMark(perfId + \",StopTM\");\n                        return {\n                            viewportItemsRealized: Promise.wrap(),\n                            allItemsRealized: Promise.wrap(),\n                            loadingCompleted: Promise.wrap()\n                        };\n                    }\n                },\n\n                _setAnimationInViewportState: function VirtualizeContentsView_setAnimationInViewportState(modifiedElements) {\n                    this._hasAnimationInViewportPending = false;\n                    if (modifiedElements && modifiedElements.length > 0) {\n                        var viewportLength = this._listView._getViewportLength(),\n                            range = this._listView._layout.itemsFromRange(this._scrollbarPos, this._scrollbarPos + viewportLength - 1);\n                        for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                            var modifiedElement = modifiedElements[i];\n                            if (modifiedElement.newIndex >= range.firstIndex && modifiedElement.newIndex <= range.lastIndex && modifiedElement.newIndex !== modifiedElement.oldIndex) {\n                                this._hasAnimationInViewportPending = true;\n                                break;\n                            }\n                        }\n                    }\n                },\n\n                _addHeader: function VirtualizeContentsView_addHeader(fragment, groupIndex) {\n                    var that = this;\n                    return this._listView._groups.renderGroup(groupIndex).then(function (header) {\n                        if (header) {\n                            header.element.tabIndex = 0;\n                            var placeholder = that._getHeaderContainer(groupIndex);\n                            if (header.element.parentNode !== placeholder) {\n                                placeholder.appendChild(header.element);\n                                _ElementUtilities.addClass(header.element, _Constants._headerClass);\n                            }\n\n                            that._listView._groups.setDomElement(groupIndex, header.element);\n                        }\n                    });\n                },\n\n                _updateHeaders: function VirtualizeContentsView_updateHeaders(fragment, begin, end) {\n                    var that = this;\n\n                    function updateGroup(index) {\n                        var group = that._listView._groups.group(index);\n                        if (group && !group.header) {\n                            var headerPromise = group.headerPromise;\n                            if (!headerPromise) {\n                                headerPromise = group.headerPromise = that._addHeader(fragment, index);\n                                headerPromise.done(function () {\n                                    group.headerPromise = null;\n                                }, function () {\n                                    group.headerPromise = null;\n                                });\n                            }\n                            return headerPromise;\n                        }\n                        return Promise.wrap();\n                    }\n\n                    this._listView._groups.removeElements();\n\n                    var groupStart = this._listView._groups.groupFromItem(begin),\n                        groupIndex = groupStart,\n                        groupEnd = this._listView._groups.groupFromItem(end - 1),\n                        realizationPromises = [];\n\n                    if (groupIndex !== null) {\n                        for (; groupIndex <= groupEnd; groupIndex++) {\n                            realizationPromises.push(updateGroup(groupIndex));\n                        }\n                    }\n\n                    function done() {\n                        that._headerRenderPromises = null;\n                    }\n                    this._headerRenderPromises = Promise.join(realizationPromises, this._headerRenderPromises).then(done, done);\n                    return this._headerRenderPromises || Promise.wrap();\n                },\n\n                _unrealizeItem: function VirtualizeContentsView_unrealizeItem(itemIndex) {\n                    var listView = this._listView,\n                        focusedItemPurged;\n\n                    this._listView._writeProfilerMark(\"_unrealizeItem(\" + itemIndex + \"),info\");\n\n                    var focused = listView._selection._getFocused();\n                    if (focused.type === _UI.ObjectType.item && focused.index === itemIndex) {\n                        listView._unsetFocusOnItem();\n                        focusedItemPurged = true;\n                    }\n                    var itemData = this.items.itemDataAt(itemIndex),\n                        item = itemData.element,\n                        itemBox = itemData.itemBox;\n\n                    if (itemBox && itemBox.parentNode) {\n                        _ElementUtilities.removeClass(itemBox.parentNode, _Constants._selectedClass);\n                        _ElementUtilities.removeClass(itemBox.parentNode, _Constants._footprintClass);\n                        _ElementUtilities.addClass(itemBox.parentNode, _Constants._backdropClass);\n                        itemBox.parentNode.removeChild(itemBox);\n                    }\n                    itemData.container = null;\n\n                    if (listView._currentMode().itemUnrealized) {\n                        listView._currentMode().itemUnrealized(itemIndex, itemBox);\n                    }\n\n                    this.items.removeItem(itemIndex);\n\n                    // If this wasn't released by the itemsManager already, then\n                    // we remove it. This handles the special case of delete\n                    // occuring on an item that is outside of the current view, but\n                    // has not been cleaned up yet.\n                    //\n                    if (!itemData.removed) {\n                        listView._itemsManager.releaseItem(item);\n                    }\n\n\n                    _Dispose._disposeElement(item);\n\n                    if (focusedItemPurged) {\n                        // If the focused item was purged, we'll still want to focus on it if it comes into view sometime in the future.\n                        // calling _setFocusOnItem once the item is removed from this.items will set up a promise that will be fulfilled\n                        // if the item ever gets reloaded\n                        listView._setFocusOnItem(listView._selection._getFocused());\n                    }\n                },\n\n                _unrealizeGroup: function VirtualizeContentsView_unrealizeGroup(group) {\n                    var headerElement = group.header,\n                        focusedItemPurged;\n\n                    var focused = this._listView._selection._getFocused();\n                    if (focused.type === _UI.ObjectType.groupHeader && this._listView._groups.group(focused.index) === group) {\n                        this._listView._unsetFocusOnItem();\n                        focusedItemPurged = true;\n                    }\n\n                    if (headerElement.parentNode) {\n                        headerElement.parentNode.removeChild(headerElement);\n                    }\n\n                    _Dispose._disposeElement(headerElement);\n\n                    group.header = null;\n                    group.left = -1;\n                    group.top = -1;\n\n                    if (focusedItemPurged) {\n                        this._listView._setFocusOnItem(this._listView._selection._getFocused());\n                    }\n                },\n\n                _unrealizeItems: function VirtualizeContentsView_unrealizeItems(remove) {\n                    var that = this,\n                        removedCount = 0;\n\n                    this.items.eachIndex(function (index) {\n                        if (index < that.begin || index >= that.end) {\n                            that._unrealizeItem(index);\n                            return remove && ++removedCount >= remove;\n                        }\n                    });\n\n                    var groups = this._listView._groups,\n                        beginGroup = groups.groupFromItem(this.begin);\n\n                    if (beginGroup !== null) {\n                        var endGroup = groups.groupFromItem(this.end - 1);\n                        for (var i = 0, len = groups.length() ; i < len; i++) {\n                            var group = groups.group(i);\n                            if ((i < beginGroup || i > endGroup) && group.header) {\n                                this._unrealizeGroup(group);\n                            }\n                        }\n                    }\n                },\n\n                _unrealizeExcessiveItems: function VirtualizeContentsView_unrealizeExcessiveItems() {\n                    var realized = this.items.count(),\n                        needed = this.end - this.begin,\n                        approved = needed + this._listView._maxDeferredItemCleanup;\n\n                    this._listView._writeProfilerMark(\"_unrealizeExcessiveItems realized(\" + realized + \") approved(\" + approved + \"),info\");\n                    if (realized > approved) {\n                        this._unrealizeItems(realized - approved);\n                    }\n                },\n\n                _lazilyUnrealizeItems: function VirtualizeContentsView_lazilyUnrealizeItems() {\n                    this._listView._writeProfilerMark(\"_lazilyUnrealizeItems,StartTM\");\n                    var that = this;\n                    return waitForSeZo(this._listView).then(function () {\n\n                        function done() {\n                            that._listView._writeProfilerMark(\"_lazilyUnrealizeItems,StopTM\");\n                        }\n\n                        if (that._listView._isZombie()) {\n                            done();\n                            return;\n                        }\n\n                        var itemsToUnrealize = [];\n                        that.items.eachIndex(function (index) {\n                            if (index < that.begin || index >= that.end) {\n                                itemsToUnrealize.push(index);\n                            }\n                        });\n\n                        that._listView._writeProfilerMark(\"_lazilyUnrealizeItems itemsToUnrealize(\" + itemsToUnrealize.length + \"),info\");\n\n                        var groupsToUnrealize = [],\n                            groups = that._listView._groups,\n                            beginGroup = groups.groupFromItem(that.begin);\n\n                        if (beginGroup !== null) {\n                            var endGroup = groups.groupFromItem(that.end - 1);\n                            for (var i = 0, len = groups.length() ; i < len; i++) {\n                                var group = groups.group(i);\n                                if ((i < beginGroup || i > endGroup) && group.header) {\n                                    groupsToUnrealize.push(group);\n                                }\n                            }\n                        }\n\n                        if (itemsToUnrealize.length || groupsToUnrealize.length) {\n                            var job;\n\n                            var promise = new Promise(function (complete) {\n\n                                function unrealizeWorker(info) {\n                                    if (that._listView._isZombie()) { return; }\n\n                                    var firstIndex = -1,\n                                        lastIndex = -1,\n                                        removeCount = 0,\n                                        zooming = shouldWaitForSeZo(that._listView);\n\n                                    while (itemsToUnrealize.length && !zooming && !info.shouldYield) {\n                                        var itemIndex = itemsToUnrealize.shift();\n                                        that._unrealizeItem(itemIndex);\n\n                                        removeCount++;\n                                        if (firstIndex < 0) {\n                                            firstIndex = itemIndex;\n                                        }\n                                        lastIndex = itemIndex;\n                                    }\n                                    that._listView._writeProfilerMark(\"unrealizeWorker removeItems:\" + removeCount + \" (\" + firstIndex + \"-\" + lastIndex + \"),info\");\n\n                                    while (groupsToUnrealize.length && !zooming && !info.shouldYield) {\n                                        that._unrealizeGroup(groupsToUnrealize.shift());\n                                    }\n\n                                    if (itemsToUnrealize.length || groupsToUnrealize.length) {\n                                        if (zooming) {\n                                            info.setPromise(waitForSeZo(that._listView).then(function () {\n                                                return unrealizeWorker;\n                                            }));\n                                        } else {\n                                            info.setWork(unrealizeWorker);\n                                        }\n                                    } else {\n                                        complete();\n                                    }\n                                }\n\n                                job = Scheduler.schedule(unrealizeWorker, Scheduler.Priority.belowNormal, null, \"WinJS.UI.ListView._lazilyUnrealizeItems\");\n                            });\n\n                            return promise.then(done, function (error) {\n                                job.cancel();\n                                that._listView._writeProfilerMark(\"_lazilyUnrealizeItems canceled,info\");\n                                that._listView._writeProfilerMark(\"_lazilyUnrealizeItems,StopTM\");\n                                return Promise.wrapError(error);\n                            });\n\n                        } else {\n                            done();\n                            return Promise.wrap();\n                        }\n                    });\n                },\n\n                _getBoundingRectString: function VirtualizeContentsView_getBoundingRectString(itemIndex) {\n                    var result;\n                    if (itemIndex >= 0 && itemIndex < this.containers.length) {\n                        var itemPos = this._listView._layout._getItemPosition(itemIndex);\n                        if (itemPos) {\n                            result = \"[\" + itemPos.left + \"; \" + itemPos.top + \"; \" + itemPos.width + \"; \" + itemPos.height + \" ]\";\n                        }\n                    }\n                    return result || \"\";\n                },\n\n                _clearDeferTimeout: function VirtualizeContentsView_clearDeferTimeout() {\n                    if (this.deferTimeout) {\n                        this.deferTimeout.cancel();\n                        this.deferTimeout = null;\n                    }\n                    if (this.deferredActionCancelToken !== -1) {\n                        this._listView._versionManager.clearCancelOnNotification(this.deferredActionCancelToken);\n                        this.deferredActionCancelToken = -1;\n                    }\n                },\n\n                _setupAria: function VirtualizeContentsView_setupAria(timedOut) {\n                    if (this._listView._isZombie()) { return; }\n                    var that = this;\n\n                    function done() {\n                        that._listView._writeProfilerMark(\"aria work,StopTM\");\n                    }\n\n                    function calcLastRealizedIndexInGroup(groupIndex) {\n                        var groups = that._listView._groups,\n                            nextGroup = groups.group(groupIndex + 1);\n                        return (nextGroup ? Math.min(nextGroup.startIndex - 1, that.end - 1) : that.end - 1);\n                    }\n\n                    this._listView._createAriaMarkers();\n                    return this._listView._itemsCount().then(function (count) {\n                        if (count > 0 && that.firstIndexDisplayed !== -1 && that.lastIndexDisplayed !== -1) {\n                            that._listView._writeProfilerMark(\"aria work,StartTM\");\n                            var startMarker = that._listView._ariaStartMarker,\n                                endMarker = that._listView._ariaEndMarker,\n                                index = that.begin,\n                                item = that.items.itemAt(that.begin),\n                                job,\n                                // These are only used when the ListView is using groups\n                                groups,\n                                startGroup,\n                                currentGroup,\n                                group,\n                                lastRealizedIndexInGroup;\n\n                            if (item) {\n                                _ElementUtilities._ensureId(item);\n                                if (that._listView._groupsEnabled()) {\n                                    groups = that._listView._groups;\n                                    startGroup = currentGroup = groups.groupFromItem(that.begin);\n                                    group = groups.group(currentGroup);\n                                    lastRealizedIndexInGroup = calcLastRealizedIndexInGroup(currentGroup);\n                                    _ElementUtilities._ensureId(group.header);\n                                    _ElementUtilities._setAttribute(group.header, \"role\", that._listView._headerRole);\n                                    _ElementUtilities._setAttribute(group.header, \"x-ms-aria-flowfrom\", startMarker.id);\n                                    setFlow(group.header, item);\n                                    _ElementUtilities._setAttribute(group.header, \"tabindex\", that._listView._tabIndex);\n                                } else {\n                                    _ElementUtilities._setAttribute(item, \"x-ms-aria-flowfrom\", startMarker.id);\n                                }\n\n                                return new Promise(function (completeJobPromise) {\n                                    var skipWait = timedOut;\n                                    job = Scheduler.schedule(function ariaWorker(jobInfo) {\n                                        if (that._listView._isZombie()) {\n                                            done();\n                                            return;\n                                        }\n\n                                        for (; index < that.end; index++) {\n                                            if (!skipWait && shouldWaitForSeZo(that._listView)) {\n                                                jobInfo.setPromise(waitForSeZo(that._listView).then(function (timedOut) {\n                                                    skipWait = timedOut;\n                                                    return ariaWorker;\n                                                }));\n                                                return;\n                                            } else if (jobInfo.shouldYield) {\n                                                jobInfo.setWork(ariaWorker);\n                                                return;\n                                            }\n\n                                            item = that.items.itemAt(index);\n                                            var nextItem = that.items.itemAt(index + 1);\n\n                                            if (nextItem) {\n                                                _ElementUtilities._ensureId(nextItem);\n                                            }\n\n                                            _ElementUtilities._setAttribute(item, \"role\", that._listView._itemRole);\n                                            _ElementUtilities._setAttribute(item, \"aria-setsize\", count);\n                                            _ElementUtilities._setAttribute(item, \"aria-posinset\", index + 1);\n                                            _ElementUtilities._setAttribute(item, \"tabindex\", that._listView._tabIndex);\n\n                                            if (that._listView._groupsEnabled()) {\n                                                if (index === lastRealizedIndexInGroup || !nextItem) {\n                                                    var nextGroup = groups.group(currentGroup + 1);\n\n                                                    // If group is the last realized group, then nextGroup won't exist in the DOM.\n                                                    // When this is the case, nextItem shouldn't exist.\n                                                    if (nextGroup && nextGroup.header && nextItem) {\n                                                        _ElementUtilities._setAttribute(nextGroup.header, \"tabindex\", that._listView._tabIndex);\n                                                        _ElementUtilities._setAttribute(nextGroup.header, \"role\", that._listView._headerRole);\n                                                        _ElementUtilities._ensureId(nextGroup.header);\n                                                        setFlow(item, nextGroup.header);\n                                                        setFlow(nextGroup.header, nextItem);\n                                                    } else {\n                                                        // We're at the last group so flow to the end marker\n                                                        _ElementUtilities._setAttribute(item, \"aria-flowto\", endMarker.id);\n                                                    }\n\n                                                    currentGroup++;\n                                                    group = nextGroup;\n                                                    lastRealizedIndexInGroup = calcLastRealizedIndexInGroup(currentGroup);\n                                                } else {\n                                                    // This is not the last item in the group so flow to the next item\n                                                    setFlow(item, nextItem);\n                                                }\n                                            } else if (nextItem) {\n                                                // Groups are disabled so as long as we aren't at the last item, flow to the next one\n                                                setFlow(item, nextItem);\n                                            } else {\n                                                // Groups are disabled and we're at the last item, so flow to the end marker\n                                                _ElementUtilities._setAttribute(item, \"aria-flowto\", endMarker.id);\n                                            }\n                                            if (!nextItem) {\n                                                break;\n                                            }\n                                        }\n\n                                        that._listView._fireAccessibilityAnnotationCompleteEvent(that.begin, index, startGroup, currentGroup - 1);\n\n                                        done();\n                                        completeJobPromise();\n                                    }, Scheduler.Priority.belowNormal, null, \"WinJS.UI.ListView._setupAria\");\n                                }, function () {\n                                    // Cancellation handler for promise returned by setupAria\n                                    job.cancel();\n                                    done();\n                                });\n                            } else {\n                                // the first item is null\n                                done();\n                            }\n                        } else {\n                            // The count is 0\n                            return Promise.wrap();\n                        }\n                    });\n                },\n\n                _setupDeferredActions: function VirtualizeContentsView_setupDeferredActions() {\n                    this._listView._writeProfilerMark(\"_setupDeferredActions,StartTM\");\n                    var that = this;\n\n                    this._clearDeferTimeout();\n\n                    function cleanUp() {\n                        if (that._listView._isZombie()) { return; }\n                        that.deferTimeout = null;\n                        that._listView._versionManager.clearCancelOnNotification(that.deferredActionCancelToken);\n                        that.deferredActionCancelToken = -1;\n                    }\n\n                    this.deferTimeout = this._lazilyRemoveRedundantItemsBlocks().then(function () {\n                        return Promise.timeout(_Constants._DEFERRED_ACTION);\n                    }).\n                        then(function () {\n                            return waitForSeZo(that._listView);\n                        }).\n                        then(function (timedOut) {\n                            return that._setupAria(timedOut);\n                        }).\n                        then(cleanUp, function (error) {\n                            cleanUp();\n                            return Promise.wrapError(error);\n                        });\n\n                    this.deferredActionCancelToken = this._listView._versionManager.cancelOnNotification(this.deferTimeout);\n                    this._listView._writeProfilerMark(\"_setupDeferredActions,StopTM\");\n                },\n\n                // Sets aria-flowto on _ariaStartMarker and x-ms-aria-flowfrom on _ariaEndMarker. The former\n                // points to either the first visible group header or the first visible item. The latter points\n                // to the last visible item.\n                _updateAriaMarkers: function VirtualizeContentsView_updateAriaMarkers(listViewIsEmpty, firstIndexDisplayed, lastIndexDisplayed) {\n                    var that = this;\n                    if (this._listView._isZombie()) {\n                        return;\n                    }\n\n                    function getFirstVisibleItem() {\n                        return that.items.itemAt(firstIndexDisplayed);\n                    }\n\n                    // At a certain index, the VDS may return null for all items at that index and\n                    // higher. When this is the case, the end marker should point to the last\n                    // non-null item in the visible range.\n                    function getLastVisibleItem() {\n                        for (var i = lastIndexDisplayed; i >= firstIndexDisplayed; i--) {\n                            if (that.items.itemAt(i)) {\n                                return that.items.itemAt(i);\n                            }\n                        }\n                        return null;\n                    }\n\n                    this._listView._createAriaMarkers();\n                    var startMarker = this._listView._ariaStartMarker,\n                        endMarker = this._listView._ariaEndMarker,\n                        firstVisibleItem,\n                        lastVisibleItem;\n\n                    if (firstIndexDisplayed !== -1 && lastIndexDisplayed !== -1 && firstIndexDisplayed <= lastIndexDisplayed) {\n                        firstVisibleItem = getFirstVisibleItem();\n                        lastVisibleItem = getLastVisibleItem();\n                    }\n\n                    if (listViewIsEmpty || !firstVisibleItem || !lastVisibleItem) {\n                        setFlow(startMarker, endMarker);\n                        this._listView._fireAccessibilityAnnotationCompleteEvent(-1, -1);\n                    } else {\n                        _ElementUtilities._ensureId(firstVisibleItem);\n                        _ElementUtilities._ensureId(lastVisibleItem);\n\n                        // Set startMarker's flowto\n                        if (this._listView._groupsEnabled()) {\n                            var groups = this._listView._groups,\n                                firstVisibleGroup = groups.group(groups.groupFromItem(firstIndexDisplayed));\n\n                            if (firstVisibleGroup.header) {\n                                _ElementUtilities._ensureId(firstVisibleGroup.header);\n\n                                if (firstIndexDisplayed === firstVisibleGroup.startIndex) {\n                                    _ElementUtilities._setAttribute(startMarker, \"aria-flowto\", firstVisibleGroup.header.id);\n                                } else {\n                                    _ElementUtilities._setAttribute(startMarker, \"aria-flowto\", firstVisibleItem.id);\n                                }\n                            }\n                        } else {\n                            _ElementUtilities._setAttribute(startMarker, \"aria-flowto\", firstVisibleItem.id);\n                        }\n\n                        // Set endMarker's flowfrom\n                        _ElementUtilities._setAttribute(endMarker, \"x-ms-aria-flowfrom\", lastVisibleItem.id);\n                    }\n                },\n\n                // Update the ARIA attributes on item that are needed so that Narrator can announce it.\n                // item must be in the items container.\n                updateAriaForAnnouncement: function VirtualizeContentsView_updateAriaForAnnouncement(item, count) {\n                    if (item === this._listView.header || item === this._listView.footer) {\n                        return;\n                    }\n\n                    var index = -1;\n                    var type = _UI.ObjectType.item;\n                    if (_ElementUtilities.hasClass(item, _Constants._headerClass)) {\n                        index = this._listView._groups.index(item);\n                        type = _UI.ObjectType.groupHeader;\n                        _ElementUtilities._setAttribute(item, \"role\", this._listView._headerRole);\n                        _ElementUtilities._setAttribute(item, \"tabindex\", this._listView._tabIndex);\n                    } else {\n                        index = this.items.index(item);\n                        _ElementUtilities._setAttribute(item, \"aria-setsize\", count);\n                        _ElementUtilities._setAttribute(item, \"aria-posinset\", index + 1);\n                        _ElementUtilities._setAttribute(item, \"role\", this._listView._itemRole);\n                        _ElementUtilities._setAttribute(item, \"tabindex\", this._listView._tabIndex);\n                    }\n\n                    if (type === _UI.ObjectType.groupHeader) {\n                        this._listView._fireAccessibilityAnnotationCompleteEvent(-1, -1, index, index);\n                    } else {\n                        this._listView._fireAccessibilityAnnotationCompleteEvent(index, index, -1, -1);\n                    }\n                },\n\n                _reportElementsLevel: function VirtualizeContentsView_reportElementsLevel(direction) {\n                    var items = this.items;\n\n                    function elementsCount(first, last) {\n                        var count = 0;\n                        for (var itemIndex = first; itemIndex <= last; itemIndex++) {\n                            var itemData = items.itemDataAt(itemIndex);\n                            if (itemData && itemData.container) {\n                                count++;\n                            }\n                        }\n                        return count;\n                    }\n\n                    var level;\n                    if (direction === \"right\") {\n                        level = Math.floor(100 * elementsCount(this.firstIndexDisplayed, this.end - 1) / (this.end - this.firstIndexDisplayed));\n                    } else {\n                        level = Math.floor(100 * elementsCount(this.begin, this.lastIndexDisplayed) / (this.lastIndexDisplayed - this.begin + 1));\n                    }\n\n                    this._listView._writeProfilerMark(\"elementsLevel level(\" + level + \"),info\");\n                },\n\n                _createHeaderContainer: function VirtualizeContentsView_createHeaderContainer(insertAfter) {\n                    return this._createSurfaceChild(_Constants._headerContainerClass, insertAfter);\n                },\n\n                _createItemsContainer: function VirtualizeContentsView_createItemsContainer(insertAfter) {\n                    var itemsContainer = this._createSurfaceChild(_Constants._itemsContainerClass, insertAfter);\n                    var padder = _Global.document.createElement(\"div\");\n                    padder.className = _Constants._padderClass;\n                    itemsContainer.appendChild(padder);\n                    return itemsContainer;\n                },\n\n                _ensureContainerInDOM: function VirtualizeContentsView_ensureContainerInDOM(index) {\n                    var container = this.containers[index];\n                    if (container && !this._listView._canvas.contains(container)) {\n                        this._forceItemsBlocksInDOM(index, index + 1);\n                        return true;\n                    }\n                    return false;\n                },\n\n                _ensureItemsBlocksInDOM: function VirtualizeContentsView_ensureItemsBlocksInDOM(begin, end) {\n                    if (this._expandedRange) {\n                        var oldBegin = this._expandedRange.first.index,\n                            oldEnd = this._expandedRange.last.index + 1;\n\n                        if (begin <= oldBegin && end > oldBegin) {\n                            end = Math.max(end, oldEnd);\n                        } else if (begin < oldEnd && end >= oldEnd) {\n                            begin = Math.min(begin, oldBegin);\n                        }\n                    }\n                    this._forceItemsBlocksInDOM(begin, end);\n                },\n\n                _removeRedundantItemsBlocks: function VirtualizeContentsView_removeRedundantItemsBlocks() {\n                    if (this.begin !== -1 && this.end !== -1) {\n                        this._forceItemsBlocksInDOM(this.begin, this.end);\n                    }\n                },\n\n                _lazilyRemoveRedundantItemsBlocks: function VirtualizeContentsView_lazilyRemoveRedundantItemsBlocks() {\n                    this._listView._writeProfilerMark(\"_lazilyRemoveRedundantItemsBlocks,StartTM\");\n                    var that = this;\n                    return waitForSeZo(this._listView).then(function () {\n\n                        function done() {\n                            that._listView._writeProfilerMark(\"_lazilyRemoveRedundantItemsBlocks,StopTM\");\n                        }\n\n                        if (that._listView._isZombie()) {\n                            done();\n                            return;\n                        }\n\n                        if (that._expandedRange && that.begin !== -1 && that.end !== -1 && (that._expandedRange.first.index < that.begin || that._expandedRange.last.index + 1 > that.end)) {\n                            var job;\n\n                            var promise = new Promise(function (complete) {\n\n                                function blocksCleanupWorker(info) {\n                                    if (that._listView._isZombie()) { return; }\n\n                                    var zooming = shouldWaitForSeZo(that._listView);\n\n                                    while (that._expandedRange.first.index < that.begin && !zooming && !info.shouldYield) {\n                                        var begin = Math.min(that.begin, that._expandedRange.first.index + that._blockSize * _VirtualizeContentsView._blocksToRelease);\n                                        that._forceItemsBlocksInDOM(begin, that.end);\n                                    }\n\n                                    while (that._expandedRange.last.index + 1 > that.end && !zooming && !info.shouldYield) {\n                                        var end = Math.max(that.end, that._expandedRange.last.index - that._blockSize * _VirtualizeContentsView._blocksToRelease);\n                                        that._forceItemsBlocksInDOM(that.begin, end);\n                                    }\n\n                                    if (that._expandedRange.first.index < that.begin || that._expandedRange.last.index + 1 > that.end) {\n                                        if (zooming) {\n                                            info.setPromise(waitForSeZo(that._listView).then(function () {\n                                                return blocksCleanupWorker;\n                                            }));\n                                        } else {\n                                            info.setWork(blocksCleanupWorker);\n                                        }\n                                    } else {\n                                        complete();\n                                    }\n                                }\n\n                                job = Scheduler.schedule(blocksCleanupWorker, Scheduler.Priority.belowNormal, null, \"WinJS.UI.ListView._lazilyRemoveRedundantItemsBlocks\");\n                            });\n\n                            return promise.then(done, function (error) {\n                                job.cancel();\n                                that._listView._writeProfilerMark(\"_lazilyRemoveRedundantItemsBlocks canceled,info\");\n                                that._listView._writeProfilerMark(\"_lazilyRemoveRedundantItemsBlocks,StopTM\");\n                                return Promise.wrapError(error);\n                            });\n\n                        } else {\n                            done();\n                            return Promise.wrap();\n                        }\n                    });\n                },\n\n                _forceItemsBlocksInDOM: function VirtualizeContentsView_forceItemsBlocksInDOM(begin, end) {\n                    if (!this._blockSize) {\n                        return;\n                    }\n                    var perfId = \"_forceItemsBlocksInDOM begin(\" + begin + \") end(\" + end + \"),\";\n                    this._listView._writeProfilerMark(perfId + \"StartTM\");\n\n                    var that = this,\n                        added = 0,\n                        removed = 0,\n                        paddingProperty = \"padding\" + (this._listView._horizontal() ? \"Left\" : \"Top\");\n\n                    function setPadder(itemsContainer, padding) {\n                        var padder = itemsContainer.element.firstElementChild;\n                        padder.style[paddingProperty] = padding;\n                    }\n\n                    function forEachBlock(callback) {\n                        for (var g = 0; g < that.tree.length; g++) {\n                            var itemsContainer = that.tree[g].itemsContainer;\n                            for (var b = 0, len = itemsContainer.itemsBlocks.length; b < len; b++) {\n                                if (callback(itemsContainer, itemsContainer.itemsBlocks[b])) {\n                                    return;\n                                }\n                            }\n                        }\n                    }\n\n                    function measureItemsBlock(itemsBlock) {\n                        that._listView._writeProfilerMark(\"_itemsBlockExtent,StartTM\");\n                        that._listView._itemsBlockExtent = _ElementUtilities[that._listView._horizontal() ? \"getTotalWidth\" : \"getTotalHeight\"](itemsBlock.element);\n                        that._listView._writeProfilerMark(\"_itemsBlockExtent(\" + that._listView._itemsBlockExtent + \"),info\");\n                        that._listView._writeProfilerMark(\"_itemsBlockExtent,StopTM\");\n                    }\n\n                    function getItemsBlockExtent() {\n                        if (that._listView._itemsBlockExtent === -1) {\n                            // first try blocks already added to the DOM\n                            forEachBlock(function (itemsContainer, itemsBlock) {\n                                if (itemsBlock.items.length === that._blockSize && itemsBlock.element.parentNode === itemsContainer.element) {\n                                    measureItemsBlock(itemsBlock);\n                                    return true;\n                                }\n                                return false;\n                            });\n                        }\n\n                        if (that._listView._itemsBlockExtent === -1) {\n                            forEachBlock(function (itemsContainer, itemsBlock) {\n                                if (itemsBlock.items.length === that._blockSize) {\n                                    itemsContainer.element.appendChild(itemsBlock.element);\n                                    measureItemsBlock(itemsBlock);\n                                    itemsContainer.element.removeChild(itemsBlock.element);\n                                    return true;\n                                }\n                                return false;\n                            });\n                        }\n                        return that._listView._itemsBlockExtent;\n                    }\n\n                    function removeBlocks(itemsContainer, begin, end) {\n\n                        function remove(blockIndex) {\n                            var block = itemsContainer.itemsBlocks[blockIndex];\n                            if (block && block.element.parentNode === itemsContainer.element) {\n                                itemsContainer.element.removeChild(block.element);\n                                removed++;\n                            }\n                        }\n\n                        if (Array.isArray(begin)) {\n                            begin.forEach(remove);\n                        } else {\n                            for (var i = begin; i < end; i++) {\n                                remove(i);\n                            }\n                        }\n                    }\n\n                    function addBlocks(itemsContainer, begin, end) {\n                        var padder = itemsContainer.element.firstElementChild,\n                            previous = padder;\n\n                        for (var i = begin; i < end; i++) {\n                            var block = itemsContainer.itemsBlocks[i];\n                            if (block) {\n                                if (block.element.parentNode !== itemsContainer.element) {\n                                    itemsContainer.element.insertBefore(block.element, previous.nextElementSibling);\n                                    added++;\n                                }\n                                previous = block.element;\n                            }\n                        }\n                    }\n\n                    function collapseGroup(groupIndex) {\n                        if (groupIndex < that.tree.length) {\n                            that._listView._writeProfilerMark(\"collapseGroup(\" + groupIndex + \"),info\");\n                            var itemsContainer = that.tree[groupIndex].itemsContainer;\n                            removeBlocks(itemsContainer, 0, itemsContainer.itemsBlocks.length);\n                            setPadder(itemsContainer, \"\");\n                        }\n                    }\n\n                    function expandGroup(groupIndex) {\n                        if (groupIndex < that.tree.length) {\n                            that._listView._writeProfilerMark(\"expandGroup(\" + groupIndex + \"),info\");\n                            var itemsContainer = that.tree[groupIndex].itemsContainer;\n                            addBlocks(itemsContainer, 0, itemsContainer.itemsBlocks.length);\n                            setPadder(itemsContainer, \"\");\n                        }\n                    }\n\n                    function removedFromRange(oldRange, newRange) {\n                        function expand(first, last) {\n                            var array = [];\n                            for (var i = first; i <= last; i++) {\n                                array.push(i);\n                            }\n                            return array;\n                        }\n\n                        var newL = newRange[0];\n                        var newR = newRange[1];\n                        var oldL = oldRange[0];\n                        var oldR = oldRange[1];\n\n                        if (newR < oldL || newL > oldR) {\n                            return expand(oldL, oldR);\n                        } else if (newL > oldL && newR < oldR) {\n                            return expand(oldL, newL - 1).concat(expand(newR + 1, oldR));\n                        } else if (oldL < newL) {\n                            return expand(oldL, newL - 1);\n                        } else if (oldR > newR) {\n                            return expand(newR + 1, oldR);\n                        } else {\n                            return null;\n                        }\n                    }\n\n                    var firstGroupIndex = this._listView._groups.groupFromItem(begin),\n                        lastGroupIndex = this._listView._groups.groupFromItem(end - 1);\n\n                    var firstGroup = this._listView._groups.group(firstGroupIndex),\n                        firstItemsContainer = that.tree[firstGroupIndex].itemsContainer;\n\n                    var firstBlock = Math.floor((begin - firstGroup.startIndex) / this._blockSize);\n\n                    var lastGroup = this._listView._groups.group(lastGroupIndex),\n                        lastItemsContainer = that.tree[lastGroupIndex].itemsContainer;\n\n                    var lastBlock = Math.floor((end - 1 - lastGroup.startIndex) / this._blockSize);\n\n                    // if size of structure block is needed try to obtain it before modifying the tree to avoid a layout pass\n                    if (firstBlock && that._listView._itemsBlockExtent === -1) {\n                        forEachBlock(function (itemsContainer, itemsBlock) {\n                            if (itemsBlock.items.length === that._blockSize && itemsBlock.element.parentNode === itemsContainer.element) {\n                                measureItemsBlock(itemsBlock);\n                                return true;\n                            }\n                            return false;\n                        });\n                    }\n\n                    var groupsToCollapse = this._expandedRange ? removedFromRange([this._expandedRange.first.groupIndex, this._expandedRange.last.groupIndex], [firstGroupIndex, lastGroupIndex]) : null;\n                    if (groupsToCollapse) {\n                        groupsToCollapse.forEach(collapseGroup);\n                    }\n\n                    if (this._expandedRange && this._expandedRange.first.groupKey === firstGroup.key) {\n                        var blocksToRemove = removedFromRange([this._expandedRange.first.block, Number.MAX_VALUE], [firstBlock, Number.MAX_VALUE]);\n                        if (blocksToRemove) {\n                            removeBlocks(firstItemsContainer, blocksToRemove);\n                        }\n                    } else if (this._expandedRange && firstGroupIndex >= this._expandedRange.first.groupIndex && firstGroupIndex <= this._expandedRange.last.groupIndex) {\n                        removeBlocks(firstItemsContainer, 0, firstBlock);\n                    }\n\n                    if (firstGroupIndex !== lastGroupIndex) {\n                        addBlocks(firstItemsContainer, firstBlock, firstItemsContainer.itemsBlocks.length);\n                        addBlocks(lastItemsContainer, 0, lastBlock + 1);\n                    } else {\n                        addBlocks(firstItemsContainer, firstBlock, lastBlock + 1);\n                    }\n\n                    if (this._expandedRange && this._expandedRange.last.groupKey === lastGroup.key) {\n                        var blocksToRemove = removedFromRange([0, this._expandedRange.last.block], [0, lastBlock]);\n                        if (blocksToRemove) {\n                            removeBlocks(lastItemsContainer, blocksToRemove);\n                        }\n                    } else if (this._expandedRange && lastGroupIndex >= this._expandedRange.first.groupIndex && lastGroupIndex <= this._expandedRange.last.groupIndex) {\n                        removeBlocks(lastItemsContainer, lastBlock + 1, lastItemsContainer.itemsBlocks.length);\n                    }\n\n                    setPadder(firstItemsContainer, firstBlock ? firstBlock * getItemsBlockExtent() + \"px\" : \"\");\n\n                    if (firstGroupIndex !== lastGroupIndex) {\n                        setPadder(lastItemsContainer, \"\");\n                    }\n\n                    // groups between first and last\n                    for (var i = firstGroupIndex + 1; i < lastGroupIndex; i++) {\n                        expandGroup(i);\n                    }\n\n                    this._expandedRange = {\n                        first: {\n                            index: begin,\n                            groupIndex: firstGroupIndex,\n                            groupKey: firstGroup.key,\n                            block: firstBlock\n                        },\n                        last: {\n                            index: end - 1,\n                            groupIndex: lastGroupIndex,\n                            groupKey: lastGroup.key,\n                            block: lastBlock\n                        },\n                    };\n                    this._listView._writeProfilerMark(\"_forceItemsBlocksInDOM groups(\" + firstGroupIndex + \"-\" + lastGroupIndex + \") blocks(\" + firstBlock + \"-\" + lastBlock + \") added(\" + added + \") removed(\" + removed + \"),info\");\n                    this._listView._writeProfilerMark(perfId + \"StopTM\");\n                },\n\n                _realizePageImpl: function VirtualizeContentsView_realizePageImpl() {\n                    var that = this;\n\n                    var perfId = \"realizePage(scrollPosition:\" + this._scrollbarPos + \" forceLayout:\" + this._forceRelayout + \")\";\n                    this._listView._writeProfilerMark(perfId + \",StartTM\");\n\n                    // It's safe to skip realizePage, so we just queue up the last request to run when the version manager\n                    // get unlocked.\n                    //\n                    if (this._listView._versionManager.locked) {\n                        this._listView._versionManager.unlocked.done(function () {\n                            if (!that._listView._isZombie()) {\n                                that._listView._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.low, that._listView.scrollPosition);\n                            }\n                        });\n                        this._listView._writeProfilerMark(perfId + \",StopTM\");\n                        return Promise.cancel;\n                    }\n\n                    return new Promise(function (c) {\n                        var renderingCompleteSignal = new _Signal();\n\n                        function complete() {\n                            c();\n                            renderingCompleteSignal.complete();\n                        }\n\n                        function viewPortPageRealized() {\n                            that._listView._hideProgressBar();\n                            that._state.setLoadingState(that._listView._LoadingState.viewPortLoaded);\n                            if (that._executeAnimations) {\n                                that._setState(RealizingAnimatingState, renderingCompleteSignal.promise);\n                            }\n                        }\n\n                        function pageRealized(count) {\n                            that._updateAriaMarkers(count === 0, that.firstIndexDisplayed, that.lastIndexDisplayed);\n                            that._state.setLoadingState && that._state.setLoadingState(that._listView._LoadingState.itemsLoaded);\n                        }\n\n                        function finish(count) {\n                            that._listView._clearInsertedItems();\n                            that._listView._groups.removeElements();\n                            viewPortPageRealized();\n                            pageRealized(count);\n                            complete();\n                        }\n\n                        that._state.setLoadingState(that._listView._LoadingState.itemsLoading);\n                        if (that._firstLayoutPass) {\n                            that._listView._showProgressBar(that._listView._element, \"50%\", \"50%\");\n                        }\n\n                        var count = that.containers.length;\n\n                        if (count) {\n                            // While the zoom animation is played we want to minimize the # of pages\n                            // being fetched to improve TtFF for SeZo scenarios\n                            var pagesToPrefetch = that.maxLeadingPages;\n                            var pagesToRetain = that.maxTrailingPages;\n                            var viewportLength = that._listView._getViewportLength();\n                            var pagesBefore, pagesAfter;\n\n                            if (that._listView._zooming) {\n                                pagesBefore = pagesAfter = 0;\n                            } else if (_VirtualizeContentsView._disableCustomPagesPrefetch) {\n                                pagesBefore = pagesAfter = _VirtualizeContentsView._defaultPagesToPrefetch;\n                            } else {\n                                pagesBefore = (that._direction === \"left\" ? pagesToPrefetch : pagesToRetain);\n\n                                // Optimize the beginning of the list such that if you scroll, then change direction and start going back towards the beginning of the list,\n                                // we maintain a remainder of pages that can be added to pagesAfter. This ensures that at beginning of the list, which is the common case,\n                                // we always have pagesToPrefetch ahead, even when the scrolling direction is constantly changing.\n                                var pagesShortBehind = Math.max(0, (pagesBefore - (that._scrollbarPos / viewportLength)));\n                                pagesAfter = Math.min(pagesToPrefetch, pagesShortBehind + (that._direction === \"right\" ? pagesToPrefetch : pagesToRetain));\n                            }\n\n                            var beginningOffset = Math.max(0, that._scrollbarPos - pagesBefore * viewportLength),\n                                  endingOffset = that._scrollbarPos + (1 + pagesAfter) * viewportLength;\n\n                            var range = that._listView._layout.itemsFromRange(beginningOffset, endingOffset - 1);\n                            if ((range.firstIndex < 0 || range.firstIndex >= count) && (range.lastIndex < 0 || range.lastIndex >= count)) {\n                                that.begin = -1;\n                                that.end = -1;\n                                that.firstIndexDisplayed = -1;\n                                that.lastIndexDisplayed = -1;\n                                finish(count);\n                            } else {\n                                var begin = _ElementUtilities._clamp(range.firstIndex, 0, count - 1),\n                                    end = _ElementUtilities._clamp(range.lastIndex + 1, 0, count);\n\n                                var inView = that._listView._layout.itemsFromRange(that._scrollbarPos, that._scrollbarPos + viewportLength - 1),\n                                    firstInView = _ElementUtilities._clamp(inView.firstIndex, 0, count - 1),\n                                    lastInView = _ElementUtilities._clamp(inView.lastIndex, 0, count - 1);\n\n                                if (that._realizationLevel === _VirtualizeContentsView._realizationLevel.skip && !that.lastRealizePass && firstInView === that.firstIndexDisplayed && lastInView === that.lastIndexDisplayed) {\n                                    that.begin = begin;\n                                    that.end = begin + Object.keys(that.items._itemData).length;\n                                    that._updateHeaders(that._listView._canvas, that.begin, that.end).done(function () {\n                                        that.lastRealizePass = null;\n                                        finish(count);\n                                    });\n                                } else if ((that._forceRelayout || begin !== that.begin || end !== that.end || firstInView !== that.firstIndexDisplayed || lastInView !== that.lastIndexDisplayed) && (begin < end) && (beginningOffset < endingOffset)) {\n                                    that._listView._writeProfilerMark(\"realizePage currentInView(\" + firstInView + \"-\" + lastInView + \") previousInView(\" + that.firstIndexDisplayed + \"-\" + that.lastIndexDisplayed + \") change(\" + (firstInView - that.firstIndexDisplayed) + \"),info\");\n                                    that._cancelRealize();\n                                    // cancelRealize changes the realizePass and resets begin/end\n                                    var currentPass = that._realizePass;\n                                    that.begin = begin;\n                                    that.end = end;\n                                    that.firstIndexDisplayed = firstInView;\n                                    that.lastIndexDisplayed = lastInView;\n                                    that.deletesWithoutRealize = 0;\n\n                                    that._ensureItemsBlocksInDOM(that.begin, that.end);\n\n                                    var realizeWork = that._realizeItems(\n                                        that._listView._itemCanvas,\n                                        that.begin,\n                                        that.end,\n                                        count,\n                                        currentPass,\n                                        that._scrollbarPos,\n                                        that._direction,\n                                        firstInView,\n                                        lastInView,\n                                        that._forceRelayout);\n\n                                    that._forceRelayout = false;\n\n                                    var realizePassWork = realizeWork.viewportItemsRealized.then(function () {\n                                        viewPortPageRealized();\n                                        return realizeWork.allItemsRealized;\n                                    }).then(function () {\n                                        if (that._realizePass === currentPass) {\n                                            return that._updateHeaders(that._listView._canvas, that.begin, that.end).then(function () {\n                                                pageRealized(count);\n                                            });\n                                        }\n                                    }).then(function () {\n                                        return realizeWork.loadingCompleted;\n                                    }).then(\n                                        function () {\n                                            that._unrealizeExcessiveItems();\n                                            that.lastRealizePass = null;\n                                            complete();\n                                        },\n                                        function (e) {\n                                            if (that._realizePass === currentPass) {\n                                                that.lastRealizePass = null;\n                                                that.begin = -1;\n                                                that.end = -1;\n                                            }\n                                            return Promise.wrapError(e);\n                                        }\n                                    );\n\n                                    that.lastRealizePass = Promise.join([realizeWork.viewportItemsRealized, realizeWork.allItemsRealized, realizeWork.loadingCompleted, realizePassWork]);\n\n                                    that._unrealizeExcessiveItems();\n\n                                } else if (!that.lastRealizePass) {\n                                    // We are currently in the \"itemsLoading\" state and need to get back to \"complete\". The\n                                    // previous realize pass has been completed so proceed to the other states.\n                                    finish(count);\n                                } else {\n                                    that.lastRealizePass.then(complete);\n                                }\n                            }\n                        } else {\n                            that.begin = -1;\n                            that.end = -1;\n                            that.firstIndexDisplayed = -1;\n                            that.lastIndexDisplayed = -1;\n\n                            finish(count);\n                        }\n\n                        that._reportElementsLevel(that._direction);\n\n                        that._listView._writeProfilerMark(perfId + \",StopTM\");\n                    });\n                },\n\n                realizePage: function VirtualizeContentsView_realizePage(scrollToFunctor, forceRelayout, scrollEndPromise, StateType) {\n                    this._scrollToFunctor = makeFunctor(scrollToFunctor);\n                    this._forceRelayout = this._forceRelayout || forceRelayout;\n                    this._scrollEndPromise = scrollEndPromise;\n\n                    this._listView._writeProfilerMark(this._state.name + \"_realizePage,info\");\n                    this._state.realizePage(StateType || RealizingState);\n                },\n\n                onScroll: function VirtualizeContentsView_onScroll(scrollToFunctor, scrollEndPromise) {\n                    this.realizePage(scrollToFunctor, false, scrollEndPromise, ScrollingState);\n                },\n\n                reload: function VirtualizeContentsView_reload(scrollToFunctor, highPriority) {\n                    if (this._listView._isZombie()) { return; }\n\n                    this._scrollToFunctor = makeFunctor(scrollToFunctor);\n                    this._forceRelayout = true;\n                    this._highPriorityRealize = !!highPriority;\n\n                    this.stopWork(true);\n\n                    this._listView._writeProfilerMark(this._state.name + \"_rebuildTree,info\");\n                    this._state.rebuildTree();\n                },\n\n                refresh: function VirtualizeContentsView_refresh(scrollToFunctor) {\n                    if (this._listView._isZombie()) { return; }\n\n                    this._scrollToFunctor = makeFunctor(scrollToFunctor);\n                    this._forceRelayout = true;\n                    this._highPriorityRealize = true;\n\n                    this.stopWork();\n\n                    this._listView._writeProfilerMark(this._state.name + \"_relayout,info\");\n                    this._state.relayout();\n                },\n\n                waitForValidScrollPosition: function VirtualizeContentsView_waitForValidScrollPosition(newPosition) {\n                    var that = this;\n                    var currentMaxScroll = this._listView._viewport[this._listView._scrollLength] - this._listView._getViewportLength();\n                    if (newPosition > currentMaxScroll) {\n                        return that._listView._itemsCount().then(function (count) {\n                            // Wait until we have laid out enough containers to be able to set the scroll position to newPosition\n                            if (that.containers.length < count) {\n                                return Promise._cancelBlocker(that._creatingContainersWork && that._creatingContainersWork.promise).then(function () {\n                                    return that._getLayoutCompleted();\n                                }).then(function () {\n                                    return newPosition;\n                                });\n                            } else {\n                                return newPosition;\n                            }\n                        });\n                    } else {\n                        return Promise.wrap(newPosition);\n                    }\n                },\n\n                waitForEntityPosition: function VirtualizeContentsView_waitForEntityPosition(entity) {\n                    var that = this;\n                    if (entity.type === _UI.ObjectType.header || entity.type === _UI.ObjectType.footer) {\n                        // Headers and footers are always laid out by the ListView as soon as it gets them, so there's nothing to wait on\n                        return Promise.wrap();\n                    }\n                    this._listView._writeProfilerMark(this._state.name + \"_waitForEntityPosition\" + \"(\" + entity.type + \": \" + entity.index + \")\" + \",info\");\n                    return Promise._cancelBlocker(this._state.waitForEntityPosition(entity).then(function () {\n                        if ((entity.type !== _UI.ObjectType.groupHeader && entity.index >= that.containers.length) ||\n                            (entity.type === _UI.ObjectType.groupHeader && that._listView._groups.group(entity.index).startIndex >= that.containers.length)) {\n                            return that._creatingContainersWork && that._creatingContainersWork.promise;\n                        }\n                    }).then(function () {\n                        return that._getLayoutCompleted();\n                    }));\n                },\n\n                stopWork: function VirtualizeContentsView_stopWork(stopTreeCreation) {\n                    this._listView._writeProfilerMark(this._state.name + \"_stop,info\");\n                    this._state.stop(stopTreeCreation);\n\n                    if (this._layoutWork) {\n                        this._layoutWork.cancel();\n                    }\n\n                    if (stopTreeCreation && this._creatingContainersWork) {\n                        this._creatingContainersWork.cancel();\n                    }\n\n                    if (stopTreeCreation) {\n                        this._state = new CreatedState(this);\n                    }\n                },\n\n                _cancelRealize: function VirtualizeContentsView_cancelRealize() {\n                    this._listView._writeProfilerMark(\"_cancelRealize,StartTM\");\n\n                    if (this.lastRealizePass || this.deferTimeout) {\n                        this._forceRelayout = true;\n                    }\n\n                    this._clearDeferTimeout();\n                    this._realizePass++;\n\n                    if (this._headerRenderPromises) {\n                        this._headerRenderPromises.cancel();\n                        this._headerRenderPromises = null;\n                    }\n\n                    var last = this.lastRealizePass;\n                    if (last) {\n                        this.lastRealizePass = null;\n                        this.begin = -1;\n                        this.end = -1;\n                        last.cancel();\n                    }\n                    this._listView._writeProfilerMark(\"_cancelRealize,StopTM\");\n                },\n\n                resetItems: function VirtualizeContentsView_resetItems(unparent) {\n                    if (!this._listView._isZombie()) {\n                        this.firstIndexDisplayed = -1;\n                        this.lastIndexDisplayed = -1;\n                        this._runningAnimations = null;\n                        this._executeAnimations = false;\n\n                        var listView = this._listView;\n                        this._firstLayoutPass = true;\n                        listView._unsetFocusOnItem();\n                        if (listView._currentMode().onDataChanged) {\n                            listView._currentMode().onDataChanged();\n                        }\n\n                        this.items.each(function (index, item) {\n                            if (unparent && item.parentNode && item.parentNode.parentNode) {\n                                item.parentNode.parentNode.removeChild(item.parentNode);\n                            }\n                            listView._itemsManager.releaseItem(item);\n                            _Dispose._disposeElement(item);\n                        });\n\n                        this.items.removeItems();\n                        this._deferredReparenting = [];\n\n                        if (unparent) {\n                            listView._groups.removeElements();\n                        }\n\n                        listView._clearInsertedItems();\n                    }\n                },\n\n                reset: function VirtualizeContentsView_reset() {\n                    this.stopWork(true);\n                    this._state = new CreatedState(this);\n\n                    this.resetItems();\n\n                    // when in the zombie state, we let disposal cleanup the ScrollView state\n                    //\n                    if (!this._listView._isZombie()) {\n                        var listView = this._listView;\n                        listView._groups.resetGroups();\n                        listView._resetCanvas();\n\n                        this.tree = null;\n                        this.keyToGroupIndex = null;\n                        this.containers = null;\n                        this._expandedRange = null;\n                    }\n                },\n\n                cleanUp: function VirtualizeContentsView_cleanUp() {\n                    this.stopWork(true);\n\n                    this._runningAnimations && this._runningAnimations.cancel();\n                    var itemsManager = this._listView._itemsManager;\n                    this.items.each(function (index, item) {\n                        itemsManager.releaseItem(item);\n                        _Dispose._disposeElement(item);\n                    });\n                    this._listView._unsetFocusOnItem();\n                    this.items.removeItems();\n                    this._deferredReparenting = [];\n                    this._listView._groups.resetGroups();\n                    this._listView._resetCanvas();\n\n                    this.tree = null;\n                    this.keyToGroupIndex = null;\n                    this.containers = null;\n                    this._expandedRange = null;\n\n                    this.destroyed = true;\n                },\n\n                getContainer: function VirtualizeContentsView_getContainer(itemIndex) {\n                    return this.containers[itemIndex];\n                },\n\n                _getHeaderContainer: function VirtualizeContentsView_getHeaderContainer(groupIndex) {\n                    return this.tree[groupIndex].header;\n                },\n\n                _getGroups: function VirtualizeContentsView_getGroups(count) {\n                    if (this._listView._groupDataSource) {\n                        var groupsContainer = this._listView._groups.groups,\n                            groups = [];\n                        if (count) {\n                            for (var i = 0, len = groupsContainer.length; i < len; i++) {\n                                var group = groupsContainer[i],\n                                    nextStartIndex = i + 1 < len ? groupsContainer[i + 1].startIndex : count;\n                                groups.push({\n                                    key: group.key,\n                                    size: nextStartIndex - group.startIndex\n                                });\n                            }\n                        }\n                        return groups;\n                    } else {\n                        return [{ key: \"-1\", size: count }];\n                    }\n                },\n\n                // Overridden by tests.\n                // Tests should have _createChunk return true when they want _createContainers to stop creating containers.\n                _createChunk: function VirtualizeContentsView_createChunk(groups, count, chunkSize) {\n                    var that = this;\n\n                    this._listView._writeProfilerMark(\"createChunk,StartTM\");\n\n                    function addToGroup(itemsContainer, groupSize) {\n                        var children = itemsContainer.element.children,\n                            oldSize = children.length,\n                            toAdd = Math.min(groupSize - itemsContainer.items.length, chunkSize);\n\n                        _SafeHtml.insertAdjacentHTMLUnsafe(itemsContainer.element, \"beforeend\", _Helpers._repeat(\"<div class='win-container win-backdrop'></div>\", toAdd));\n\n                        for (var i = 0; i < toAdd; i++) {\n                            var container = children[oldSize + i];\n                            itemsContainer.items.push(container);\n                            that.containers.push(container);\n                        }\n                    }\n\n                    function newGroup(group) {\n                        var node = {\n                            header: that._listView._groupDataSource ? that._createHeaderContainer() : null,\n                            itemsContainer: {\n                                element: that._createItemsContainer(),\n                                items: []\n                            }\n                        };\n\n\n                        that.tree.push(node);\n                        that.keyToGroupIndex[group.key] = that.tree.length - 1;\n                        addToGroup(node.itemsContainer, group.size);\n                    }\n\n                    if (this.tree.length && this.tree.length <= groups.length) {\n                        var last = this.tree[this.tree.length - 1],\n                            finalSize = groups[this.tree.length - 1].size;\n\n                        // check if the last group in the tree already has all items. If not add items to this group\n                        if (last.itemsContainer.items.length < finalSize) {\n                            addToGroup(last.itemsContainer, finalSize);\n                            this._listView._writeProfilerMark(\"createChunk,StopTM\");\n                            return;\n                        }\n                    }\n\n                    if (this.tree.length < groups.length) {\n                        newGroup(groups[this.tree.length]);\n                    }\n\n                    this._listView._writeProfilerMark(\"createChunk,StopTM\");\n                },\n\n                // Overridden by tests.\n                // Tests should have _createChunkWithBlocks return true when they want _createContainers to stop creating containers.\n                _createChunkWithBlocks: function VirtualizeContentsView_createChunkWithBlocks(groups, count, blockSize, chunkSize) {\n                    var that = this;\n                    this._listView._writeProfilerMark(\"createChunk,StartTM\");\n\n                    function addToGroup(itemsContainer, toAdd) {\n                        var indexOfNextGroupItem;\n                        var lastExistingBlock = itemsContainer.itemsBlocks.length ? itemsContainer.itemsBlocks[itemsContainer.itemsBlocks.length - 1] : null;\n\n                        toAdd = Math.min(toAdd, chunkSize);\n\n                        // 1) Add missing containers to the latest itemsblock if it was only partially filled during the previous pass.\n                        if (lastExistingBlock && lastExistingBlock.items.length < blockSize) {\n                            var emptySpotsToFill = Math.min(toAdd, blockSize - lastExistingBlock.items.length),\n                                sizeOfOldLastBlock = lastExistingBlock.items.length,\n\n                            indexOfNextGroupItem = (itemsContainer.itemsBlocks.length - 1) * blockSize + sizeOfOldLastBlock;\n                            var containersMarkup = _Helpers._stripedContainers(emptySpotsToFill, indexOfNextGroupItem);\n\n                            _SafeHtml.insertAdjacentHTMLUnsafe(lastExistingBlock.element, \"beforeend\", containersMarkup);\n                            children = lastExistingBlock.element.children;\n\n                            for (var j = 0; j < emptySpotsToFill; j++) {\n                                var child = children[sizeOfOldLastBlock + j];\n                                lastExistingBlock.items.push(child);\n                                that.containers.push(child);\n                            }\n\n                            toAdd -= emptySpotsToFill;\n                        }\n                        indexOfNextGroupItem = itemsContainer.itemsBlocks.length * blockSize;\n\n                        // 2) Generate as many full itemblocks of containers as we can.\n                        var newBlocksCount = Math.floor(toAdd / blockSize),\n                            markup = \"\",\n                            firstBlockFirstItemIndex = indexOfNextGroupItem,\n                            secondBlockFirstItemIndex = indexOfNextGroupItem + blockSize;\n\n                        if (newBlocksCount > 0) {\n                            var pairOfItemBlocks = [\n                                // Use pairs to ensure that the container striping pattern is maintained regardless if blockSize is even or odd.\n                                \"<div class='win-itemsblock'>\" + _Helpers._stripedContainers(blockSize, firstBlockFirstItemIndex) + \"</div>\",\n                                \"<div class='win-itemsblock'>\" + _Helpers._stripedContainers(blockSize, secondBlockFirstItemIndex) + \"</div>\"\n                            ];\n                            markup = _Helpers._repeat(pairOfItemBlocks, newBlocksCount);\n                            indexOfNextGroupItem += (newBlocksCount * blockSize);\n                        }\n\n                        // 3) Generate and partially fill, one last itemblock if there are any remaining containers to add.\n                        var sizeOfNewLastBlock = toAdd % blockSize;\n                        if (sizeOfNewLastBlock > 0) {\n                            markup += \"<div class='win-itemsblock'>\" + _Helpers._stripedContainers(sizeOfNewLastBlock, indexOfNextGroupItem) + \"</div>\";\n                            indexOfNextGroupItem += sizeOfNewLastBlock;\n                            newBlocksCount++;\n                        }\n\n                        var blocksTemp = _Global.document.createElement(\"div\");\n                        _SafeHtml.setInnerHTMLUnsafe(blocksTemp, markup);\n                        var children = blocksTemp.children;\n\n                        for (var i = 0; i < newBlocksCount; i++) {\n                            var block = children[i],\n                                blockNode = {\n                                    element: block,\n                                    items: _Helpers._nodeListToArray(block.children)\n                                };\n                            itemsContainer.itemsBlocks.push(blockNode);\n                            for (var n = 0; n < blockNode.items.length; n++) {\n                                that.containers.push(blockNode.items[n]);\n                            }\n                        }\n                    }\n\n                    function newGroup(group) {\n                        var node = {\n                            header: that._listView._groupDataSource ? that._createHeaderContainer() : null,\n                            itemsContainer: {\n                                element: that._createItemsContainer(),\n                                itemsBlocks: []\n                            }\n                        };\n\n                        that.tree.push(node);\n                        that.keyToGroupIndex[group.key] = that.tree.length - 1;\n\n                        addToGroup(node.itemsContainer, group.size);\n                    }\n\n                    if (this.tree.length && this.tree.length <= groups.length) {\n                        var lastContainer = this.tree[this.tree.length - 1].itemsContainer,\n                            finalSize = groups[this.tree.length - 1].size,\n                            currentSize = 0;\n\n                        if (lastContainer.itemsBlocks.length) {\n                            currentSize = (lastContainer.itemsBlocks.length - 1) * blockSize + lastContainer.itemsBlocks[lastContainer.itemsBlocks.length - 1].items.length;\n                        }\n\n                        if (currentSize < finalSize) {\n                            addToGroup(lastContainer, finalSize - currentSize);\n                            this._listView._writeProfilerMark(\"createChunk,StopTM\");\n                            return;\n                        }\n                    }\n\n                    if (this.tree.length < groups.length) {\n                        newGroup(groups[this.tree.length]);\n                    }\n\n                    this._listView._writeProfilerMark(\"createChunk,StopTM\");\n                },\n\n                _generateCreateContainersWorker: function VirtualizeContentsView_generateCreateContainersWorker() {\n                    var that = this,\n                        counter = 0,\n                        skipWait = false;\n\n                    return function work(info) {\n                        if (!that._listView._versionManager.locked) {\n                            that._listView._itemsCount().then(function (count) {\n                                var zooming = !skipWait && shouldWaitForSeZo(that._listView);\n\n                                if (!zooming) {\n                                    if (that._listView._isZombie()) { return; }\n\n                                    skipWait = false;\n\n                                    var end = _BaseUtils._now() + _VirtualizeContentsView._createContainersJobTimeslice,\n                                        groups = that._getGroups(count),\n                                        startLength = that.containers.length,\n                                        realizedToEnd = that.end === that.containers.length,\n                                        chunkSize = _VirtualizeContentsView._chunkSize;\n\n                                    do {\n                                        that._blockSize ? that._createChunkWithBlocks(groups, count, that._blockSize, chunkSize) : that._createChunk(groups, count, chunkSize);\n                                        counter++;\n                                    } while (that.containers.length < count && _BaseUtils._now() < end);\n\n                                    that._listView._writeProfilerMark(\"createContainers yields containers(\" + that.containers.length + \"),info\");\n\n                                    that._listView._affectedRange.add({ start: startLength, end: that.containers.length }, count);\n\n                                    if (realizedToEnd) {\n                                        that.stopWork();\n                                        that._listView._writeProfilerMark(that._state.name + \"_relayout,info\");\n                                        that._state.relayout();\n                                    } else {\n                                        that._listView._writeProfilerMark(that._state.name + \"_layoutNewContainers,info\");\n                                        that._state.layoutNewContainers();\n                                    }\n\n                                    if (that.containers.length < count) {\n                                        info.setWork(work);\n                                    } else {\n                                        that._listView._writeProfilerMark(\"createContainers completed steps(\" + counter + \"),info\");\n                                        that._creatingContainersWork.complete();\n                                    }\n                                } else {\n                                    // Waiting on zooming\n                                    info.setPromise(waitForSeZo(that._listView).then(function (timedOut) {\n                                        skipWait = timedOut;\n                                        return work;\n                                    }));\n                                }\n                            });\n                        } else {\n                            // Version manager locked\n                            info.setPromise(that._listView._versionManager.unlocked.then(function () {\n                                return work;\n                            }));\n                        }\n                    };\n                },\n\n                _scheduleLazyTreeCreation: function VirtualizeContentsView_scheduleLazyTreeCreation() {\n                    return Scheduler.schedule(this._generateCreateContainersWorker(), Scheduler.Priority.idle, this, \"WinJS.UI.ListView.LazyTreeCreation\");\n                },\n\n                _createContainers: function VirtualizeContentsView_createContainers() {\n                    this.tree = null;\n                    this.keyToGroupIndex = null;\n                    this.containers = null;\n                    this._expandedRange = null;\n\n                    var that = this,\n                        count;\n\n                    return this._listView._itemsCount().then(function (c) {\n                        if (c === 0) {\n                            that._listView._hideProgressBar();\n                        }\n                        count = c;\n                        that._listView._writeProfilerMark(\"createContainers(\" + count + \"),StartTM\");\n                        if (that._listView._groupDataSource) {\n                            return that._listView._groups.initialize();\n                        }\n                    }).then(function () {\n                        that._listView._writeProfilerMark(\"numberOfItemsPerItemsBlock,StartTM\");\n                        return (count && that._listView._groups.length() ? that._listView._layout.numberOfItemsPerItemsBlock : null);\n                    }).then(function (blockSize) {\n                        that._listView._writeProfilerMark(\"numberOfItemsPerItemsBlock(\" + blockSize + \"),info\");\n                        that._listView._writeProfilerMark(\"numberOfItemsPerItemsBlock,StopTM\");\n\n                        that._listView._resetCanvas();\n\n                        that.tree = [];\n                        that.keyToGroupIndex = {};\n                        that.containers = [];\n                        that._blockSize = blockSize;\n\n                        var groups = that._getGroups(count);\n\n                        var end = _BaseUtils._now() + _VirtualizeContentsView._maxTimePerCreateContainers,\n                            chunkSize = Math.min(_VirtualizeContentsView._startupChunkSize, _VirtualizeContentsView._chunkSize);\n                        var stop;\n                        do {\n                            // Tests override _createChunk/_createChunkWithBlocks and take advantage of its boolean return value\n                            // to stop initial container creation after a certain number of containers have been created.\n                            stop = blockSize ? that._createChunkWithBlocks(groups, count, blockSize, chunkSize) : that._createChunk(groups, count, chunkSize);\n                        } while (_BaseUtils._now() < end && that.containers.length < count && !stop);\n\n                        that._listView._writeProfilerMark(\"createContainers created(\" + that.containers.length + \"),info\");\n\n                        that._listView._affectedRange.add({ start: 0, end: that.containers.length }, count);\n\n                        if (that.containers.length < count) {\n                            var jobNode = that._scheduleLazyTreeCreation();\n\n                            that._creatingContainersWork.promise.done(null, function () {\n                                jobNode.cancel();\n                            });\n                        } else {\n                            that._listView._writeProfilerMark(\"createContainers completed synchronously,info\");\n                            that._creatingContainersWork.complete();\n                        }\n\n                        that._listView._writeProfilerMark(\"createContainers(\" + count + \"),StopTM\");\n                    });\n                },\n\n                _updateItemsBlocks: function VirtualizeContentsView_updateItemsBlocks(blockSize) {\n                    var that = this;\n                    var usingStructuralNodes = !!blockSize;\n\n                    function createNewBlock() {\n                        var element = _Global.document.createElement(\"div\");\n                        element.className = _Constants._itemsBlockClass;\n                        return element;\n                    }\n\n                    function updateGroup(itemsContainer, startIndex) {\n                        var blockElements = [],\n                            itemsCount = 0,\n                            blocks = itemsContainer.itemsBlocks,\n                            b;\n\n                        function rebuildItemsContainer() {\n                            itemsContainer.itemsBlocks = null;\n                            itemsContainer.items = [];\n                            for (var i = 0; i < itemsCount; i++) {\n                                var container = that.containers[startIndex + i];\n                                itemsContainer.element.appendChild(container);\n                                itemsContainer.items.push(container);\n                            }\n                        }\n\n                        function rebuildItemsContainerWithBlocks() {\n                            itemsContainer.itemsBlocks = [{\n                                element: blockElements.length ? blockElements.shift() : createNewBlock(),\n                                items: []\n                            }];\n                            var currentBlock = itemsContainer.itemsBlocks[0];\n                            for (var i = 0; i < itemsCount; i++) {\n                                if (currentBlock.items.length === blockSize) {\n                                    var nextBlock = blockElements.length ? blockElements.shift() : createNewBlock();\n                                    itemsContainer.itemsBlocks.push({\n                                        element: nextBlock,\n                                        items: []\n                                    });\n                                    currentBlock = itemsContainer.itemsBlocks[itemsContainer.itemsBlocks.length - 1];\n                                }\n\n                                var container = that.containers[startIndex + i];\n                                currentBlock.element.appendChild(container);\n                                currentBlock.items.push(container);\n                            }\n                            itemsContainer.items = null;\n                        }\n\n                        if (blocks) {\n                            for (b = 0; b < blocks.length; b++) {\n                                itemsCount += blocks[b].items.length;\n                                blockElements.push(blocks[b].element);\n                            }\n                        } else {\n                            itemsCount = itemsContainer.items.length;\n                        }\n\n                        if (usingStructuralNodes) {\n                            rebuildItemsContainerWithBlocks();\n                        } else {\n                            rebuildItemsContainer();\n                        }\n\n                        for (b = 0; b < blockElements.length; b++) {\n                            var block = blockElements[b];\n                            if (block.parentNode === itemsContainer.element) {\n                                itemsContainer.element.removeChild(block);\n                            }\n                        }\n\n                        return itemsCount;\n                    }\n\n                    for (var g = 0, startIndex = 0; g < this.tree.length; g++) {\n                        startIndex += updateGroup(this.tree[g].itemsContainer, startIndex);\n                    }\n\n                    that._blockSize = blockSize;\n                },\n\n                _layoutItems: function VirtualizeContentsView_layoutItems() {\n                    var that = this;\n                    return this._listView._itemsCount().then(function () {\n                        return Promise.as(that._listView._layout.numberOfItemsPerItemsBlock).then(function (blockSize) {\n                            that._listView._writeProfilerMark(\"numberOfItemsPerItemsBlock(\" + blockSize + \"),info\");\n                            if (blockSize !== that._blockSize) {\n                                that._updateItemsBlocks(blockSize);\n                                that._listView._itemsBlockExtent = -1;\n                            }\n\n                            var affectedRange = that._listView._affectedRange.get();\n                            var changedRange;\n\n                            // We accumulate all changes that occur between layouts in _affectedRange. If layout is interrupted due to additional\n                            // modifications, _affectedRange will become the union of the previous range of changes and the new range of changes\n                            // and will be passed to layout again. _affectedRange is reset whenever layout completes.\n                            if (affectedRange) {\n                                changedRange = {\n                                    // _affectedRange is stored in the format [start, end), layout expects a range in the form of [firstIndex , lastIndex]\n                                    // To ensure that layout can successfully use the expected range to find all of the groups which need to be re-laid out\n                                    // we will pad an extra index at the front end such that layout receives [start - 1, end] in form of [lastIndex, firstIndex].\n                                    firstIndex: Math.max(affectedRange.start - 1, 0),\n                                    lastIndex: Math.min(that.containers.length - 1, affectedRange.end) // Account for any constrained upper limits from lazily loaded win-container's.\n                                };\n                                if (changedRange.firstIndex < that.containers.length || that.containers.length === 0) {\n                                    return that._listView._layout.layout(that.tree, changedRange,\n                                        that._modifiedElements || [], that._modifiedGroups || []);\n                                }\n                            }\n\n                            // There is nothing to layout.\n                            that._listView._affectedRange.clear();\n                            return {\n                                realizedRangeComplete: Promise.wrap(),\n                                layoutComplete: Promise.wrap()\n                            };\n                        });\n                    });\n                },\n\n                updateTree: function VirtualizeContentsView_updateTree(count, delta, modifiedElements) {\n                    this._listView._writeProfilerMark(this._state.name + \"_updateTree,info\");\n                    return this._state.updateTree(count, delta, modifiedElements);\n                },\n\n                _updateTreeImpl: function VirtualizeContentsView_updateTreeImpl(count, delta, modifiedElements, skipUnrealizeItems) {\n                    this._executeAnimations = true;\n                    this._modifiedElements = modifiedElements;\n\n                    if (modifiedElements.handled) {\n                        return;\n                    }\n                    modifiedElements.handled = true;\n\n                    this._listView._writeProfilerMark(\"_updateTreeImpl,StartTM\");\n\n                    var that = this,\n                        i;\n\n                    if (!skipUnrealizeItems) {\n                        // If we skip unrealize items, this work will eventually happen when we reach the UnrealizingState. Sometimes,\n                        // it is appropriate to defer the unrealize work in order to optimize scenarios (e.g, edits that happen when we are\n                        // in the CompletedState, that way the animation can start sooner).\n                        this._unrealizeItems();\n                    }\n\n                    function removeElements(array) {\n                        for (var i = 0, len = array.length; i < len; i++) {\n                            var itemBox = array[i];\n                            itemBox.parentNode.removeChild(itemBox);\n                        }\n                    }\n\n                    for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                        if (modifiedElements[i]._itemBox && modifiedElements[i]._itemBox.parentNode) {\n                            _ElementUtilities.removeClass(modifiedElements[i]._itemBox.parentNode, _Constants._selectedClass);\n                        }\n                    }\n\n                    this.items.each(function (index, item, itemData) {\n                        itemData.container && _ElementUtilities.removeClass(itemData.container, _Constants._selectedClass);\n                        itemData.container && _ElementUtilities.addClass(itemData.container, _Constants._backdropClass);\n                    });\n\n                    var removedGroups = this._listView._updateContainers(this._getGroups(count), count, delta, modifiedElements);\n\n                    removeElements(removedGroups.removedHeaders);\n                    removeElements(removedGroups.removedItemsContainers);\n\n                    for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                        var modifiedElement = modifiedElements[i];\n                        if (modifiedElement.newIndex !== -1) {\n                            modifiedElement.element = this.getContainer(modifiedElement.newIndex);\n                            if (!modifiedElement.element) {\n                                throw \"Container missing after updateContainers.\";\n                            }\n                        } else {\n                            _ElementUtilities.removeClass(modifiedElement.element, _Constants._backdropClass);\n                        }\n                    }\n\n                    // We only need to restore focus if the current focus is within surface\n                    var activeElement = _Global.document.activeElement;\n                    if (this._listView._canvas.contains(activeElement)) {\n                        this._requireFocusRestore = activeElement;\n                    }\n\n                    this._deferredReparenting = [];\n                    this.items.each(function (index, item, itemData) {\n                        var container = that.getContainer(index),\n                            itemBox = itemData.itemBox;\n\n                        if (itemBox && container) {\n                            itemData.container = container;\n                            if (itemBox.parentNode !== container) {\n                                if (index >= that.firstIndexDisplayed && index <= that.lastIndexDisplayed) {\n                                    that._appendAndRestoreFocus(container, itemBox);\n                                } else {\n                                    that._deferredReparenting.push({ itemBox: itemBox, container: container });\n                                }\n                            }\n                            _ElementUtilities.removeClass(container, _Constants._backdropClass);\n\n                            _ElementUtilities[that._listView.selection._isIncluded(index) ? \"addClass\" : \"removeClass\"](container, _Constants._selectedClass);\n                            if (!that._listView.selection._isIncluded(index) && _ElementUtilities.hasClass(itemBox, _Constants._selectedClass)) {\n                                _ItemEventsHandler._ItemEventsHandler.renderSelection(itemBox, itemData.element, false, true);\n                            }\n                        }\n                    });\n\n                    this._listView._writeProfilerMark(\"_updateTreeImpl,StopTM\");\n                },\n\n                _completeUpdateTree: function () {\n                    if (this._deferredReparenting) {\n                        var deferredCount = this._deferredReparenting.length;\n                        if (deferredCount > 0) {\n                            var perfId = \"_completeReparenting(\" + deferredCount + \")\";\n                            this._listView._writeProfilerMark(perfId + \",StartTM\");\n                            var deferredItem;\n                            for (var i = 0; i < deferredCount; i++) {\n                                deferredItem = this._deferredReparenting[i];\n                                this._appendAndRestoreFocus(deferredItem.container, deferredItem.itemBox);\n                            }\n                            this._deferredReparenting = [];\n                            this._listView._writeProfilerMark(perfId + \",StopTM\");\n                        }\n                    }\n                    this._requireFocusRestore = null;\n                },\n\n                _appendAndRestoreFocus: function VirtualizeContentsView_appendAndRestoreFocus(container, itemBox) {\n                    if (itemBox.parentNode !== container) {\n                        var activeElement;\n                        if (this._requireFocusRestore) {\n                            activeElement = _Global.document.activeElement;\n                        }\n\n                        if (this._requireFocusRestore && this._requireFocusRestore === activeElement && (container.contains(activeElement) || itemBox.contains(activeElement))) {\n                            this._listView._unsetFocusOnItem();\n                            activeElement = _Global.document.activeElement;\n                        }\n\n                        _ElementUtilities.empty(container);\n                        container.appendChild(itemBox);\n\n                        if (this._requireFocusRestore && activeElement === this._listView._keyboardEventsHelper) {\n                            var focused = this._listView._selection._getFocused();\n                            if (focused.type === _UI.ObjectType.item && this.items.itemBoxAt(focused.index) === itemBox) {\n                                _ElementUtilities._setActive(this._requireFocusRestore);\n                                this._requireFocusRestore = null;\n                            }\n                        }\n                    }\n                },\n\n                _startAnimations: function VirtualizeContentsView_startAnimations() {\n                    this._listView._writeProfilerMark(\"startAnimations,StartTM\");\n\n                    var that = this;\n                    this._hasAnimationInViewportPending = false;\n                    var animationPromise = Promise.as(this._listView._layout.executeAnimations()).then(function () {\n                        that._listView._writeProfilerMark(\"startAnimations,StopTM\");\n                    });\n                    return animationPromise;\n                },\n\n                _setState: function VirtualizeContentsView_setState(NewStateType, arg) {\n                    if (!this._listView._isZombie()) {\n                        var prevStateName = this._state.name;\n                        this._state = new NewStateType(this, arg);\n                        this._listView._writeProfilerMark(this._state.name + \"_enter from(\" + prevStateName + \"),info\");\n                        this._state.enter();\n                    }\n                },\n\n                getAdjacent: function VirtualizeContentsView_getAdjacent(currentFocus, direction) {\n                    var that = this;\n                    return this.waitForEntityPosition(currentFocus).then(function () {\n                        return that._listView._layout.getAdjacent(currentFocus, direction);\n                    });\n                },\n\n                hitTest: function VirtualizeContentsView_hitTest(x, y) {\n                    if (!this._realizedRangeLaidOut) {\n                        var retVal = this._listView._layout.hitTest(x, y);\n                        retVal.index = _ElementUtilities._clamp(retVal.index, -1, this._listView._cachedCount - 1, 0);\n                        retVal.insertAfterIndex = _ElementUtilities._clamp(retVal.insertAfterIndex, -1, this._listView._cachedCount - 1, 0);\n                        return retVal;\n                    } else {\n                        return {\n                            index: -1,\n                            insertAfterIndex: -1\n                        };\n                    }\n                },\n\n                _createTreeBuildingSignal: function VirtualizeContentsView__createTreeBuildingSignal() {\n                    if (!this._creatingContainersWork) {\n                        this._creatingContainersWork = new _Signal();\n\n                        var that = this;\n                        this._creatingContainersWork.promise.done(\n                            function () {\n                                that._creatingContainersWork = null;\n                            },\n                            function () {\n                                that._creatingContainersWork = null;\n                            }\n                        );\n                    }\n                },\n\n                _createLayoutSignal: function VirtualizeContentsView_createLayoutSignal() {\n                    var that = this;\n\n                    if (!this._layoutCompleted) {\n                        this._layoutCompleted = new _Signal();\n\n                        this._layoutCompleted.promise.done(\n                            function () {\n                                that._layoutCompleted = null;\n                            },\n                            function () {\n                                that._layoutCompleted = null;\n                            }\n                        );\n                    }\n\n                    if (!this._realizedRangeLaidOut) {\n                        this._realizedRangeLaidOut = new _Signal();\n                        this._realizedRangeLaidOut.promise.done(\n                            function () {\n                                that._realizedRangeLaidOut = null;\n                            },\n                            function () {\n                                that._realizedRangeLaidOut = null;\n                            }\n                        );\n                    }\n                },\n\n                _getLayoutCompleted: function VirtualizeContentsView_getLayoutCompleted() {\n                    return this._layoutCompleted ? Promise._cancelBlocker(this._layoutCompleted.promise) : Promise.wrap();\n                },\n\n                _createSurfaceChild: function VirtualizeContentsView_createSurfaceChild(className, insertAfter) {\n                    var element = _Global.document.createElement(\"div\");\n                    element.className = className;\n                    this._listView._canvas.insertBefore(element, insertAfter ? insertAfter.nextElementSibling : null);\n                    return element;\n                },\n\n                _executeScrollToFunctor: function VirtualizeContentsView_executeScrollToFunctor() {\n                    var that = this;\n                    return Promise.as(this._scrollToFunctor ? this._scrollToFunctor() : null).then(function (scroll) {\n                        that._scrollToFunctor = null;\n\n                        scroll = scroll || {};\n                        // _scrollbarPos is initialized to 0 in the constructor, and we only set it when a valid integer\n                        // value is passed in order to account for cases when there is not a _scrollToFunctor\n                        if (+scroll.position === scroll.position) {\n                            that._scrollbarPos = scroll.position;\n                        }\n                        that._direction = scroll.direction || \"right\";\n                    });\n                }\n            }, {\n                _defaultPagesToPrefetch: 2,\n                _iOSMaxLeadingPages: 6,\n                _iOSMaxTrailingPages: 2,\n                _disableCustomPagesPrefetch: false,\n                _waitForSeZoIntervalDuration: 100,\n                _waitForSeZoTimeoutDuration: 500,\n                _chunkSize: 500,\n                _startupChunkSize: 100,\n                _maxTimePerCreateContainers: 5,\n                _createContainersJobTimeslice: 15,\n                _blocksToRelease: 10,\n                _realizationLevel: {\n                    skip: \"skip\",\n                    realize: \"realize\",\n                    normal: \"normal\"\n                }\n            });\n\n\n            function nop() { }\n\n            /*\n            View is in this state before reload is called so during startup, after datasource change etc.\n            */\n\n            var CreatedState = _Base.Class.define(function CreatedState_ctor(view) {\n                this.view = view;\n                this.view._createTreeBuildingSignal();\n                this.view._createLayoutSignal();\n            }, {\n                name: 'CreatedState',\n                enter: function CreatedState_enter() {\n                    this.view._createTreeBuildingSignal();\n                    this.view._createLayoutSignal();\n                },\n                stop: nop,\n                realizePage: nop,\n                rebuildTree: function CreatedState_rebuildTree() {\n                    this.view._setState(BuildingState);\n                },\n                relayout: function CreatedState_relayout() {\n                    this.view._setState(BuildingState);\n                },\n                layoutNewContainers: nop,\n                waitForEntityPosition: function CreatedState_waitForEntityPosition() {\n                    this.view._setState(BuildingState);\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: nop\n            });\n\n            /*\n            In this state View is building its DOM tree with win-container element for each item in the data set.\n            To build the tree the view needs to know items count or for grouped case the count of groups and the\n            count of items in each group. The view enters this state when the tree needs to be built during\n            startup or rebuild after data source change and etc.\n\n            BuildingState => LayingoutState | CreatedState\n            */\n            var BuildingState = _Base.Class.define(function BuildingState_ctor(view) {\n                this.view = view;\n            }, {\n                name: 'BuildingState',\n                enter: function BuildingState_enter() {\n                    this.canceling = false;\n                    this.view._createTreeBuildingSignal();\n                    this.view._createLayoutSignal();\n\n                    var that = this;\n\n                    // Use a signal to guarantee that this.promise is set before the promise\n                    // handler is executed.\n                    var promiseStoredSignal = new _Signal();\n                    this.promise = promiseStoredSignal.promise.then(function () {\n                        return that.view._createContainers();\n                    }).then(\n                        function () {\n                            that.view._setState(LayingoutState);\n                        },\n                        function (error) {\n                            if (!that.canceling) {\n                                // this is coming from layout. ListView is hidden. We need to raise complete and wait in initial state for further actions\n                                that.view._setState(CreatedState);\n                                that.view._listView._raiseViewComplete();\n                            }\n                            return Promise.wrapError(error);\n                        }\n                    );\n                    promiseStoredSignal.complete();\n                },\n                stop: function BuildingState_stop() {\n                    this.canceling = true;\n                    this.promise.cancel();\n                    this.view._setState(CreatedState);\n                },\n                realizePage: nop,\n                rebuildTree: function BuildingState_rebuildTree() {\n                    this.canceling = true;\n                    this.promise.cancel();\n                    this.enter();\n                },\n                relayout: nop,\n                layoutNewContainers: nop,\n                waitForEntityPosition: function BuildingState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: nop\n            });\n\n            /*\n            In this state View waits for the layout to lay out win-container elements. The view enters this state\n            after edits or resize.\n\n            LayingoutState => RealizingState | BuildingState | CanceledState | CompletedState | LayoutCanceledState\n            */\n            var LayingoutState = _Base.Class.define(function LayingoutState_ctor(view, NextStateType) {\n                this.view = view;\n                this.nextStateType = NextStateType || RealizingState;\n            }, {\n                name: 'LayingoutState',\n                enter: function LayingoutState_enter() {\n                    var that = this;\n                    this.canceling = false;\n                    this.view._createLayoutSignal();\n\n                    this.view._listView._writeProfilerMark(this.name + \"_enter_layoutItems,StartTM\");\n\n                    // Use a signal to guarantee that this.promise is set before the promise\n                    // handler is executed.\n                    var promiseStoredSignal = new _Signal();\n                    this.promise = promiseStoredSignal.promise.then(function () {\n                        return that.view._layoutItems();\n                    }).then(function (layoutPromises) {\n\n                        // View is taking ownership of this promise and it will cancel it in stopWork\n                        that.view._layoutWork = layoutPromises.layoutComplete;\n\n                        return layoutPromises.realizedRangeComplete;\n                    }).then(\n                        function () {\n                            that.view._listView._writeProfilerMark(that.name + \"_enter_layoutItems,StopTM\");\n\n                            that.view._listView._clearInsertedItems();\n                            that.view._setAnimationInViewportState(that.view._modifiedElements);\n                            that.view._modifiedElements = [];\n                            that.view._modifiedGroups = [];\n\n                            that.view._realizedRangeLaidOut.complete();\n\n                            that.view._layoutWork.then(function () {\n                                that.view._listView._writeProfilerMark(that.name + \"_enter_layoutCompleted,info\");\n                                that.view._listView._affectedRange.clear();\n                                that.view._layoutCompleted.complete();\n                            });\n\n                            if (!that.canceling) {\n                                that.view._setState(that.nextStateType);\n                            }\n                        },\n                        function (error) {\n                            that.view._listView._writeProfilerMark(that.name + \"_enter_layoutCanceled,info\");\n\n                            if (!that.canceling) {\n                                // Cancel is coming from layout itself so ListView is hidden or empty. In this case we want to raise loadingStateChanged\n                                that.view.firstIndexDisplayed = that.view.lastIndexDisplayed = -1;\n                                that.view._updateAriaMarkers(true, that.view.firstIndexDisplayed, that.view.lastIndexDisplayed);\n                                that.view._setState(CompletedState);\n                            }\n\n                            return Promise.wrapError(error);\n                        }\n                    );\n                    promiseStoredSignal.complete();\n\n                    if (this.canceling) {\n                        this.promise.cancel();\n                    }\n                },\n                cancelLayout: function LayingoutState_cancelLayout(switchState) {\n                    this.view._listView._writeProfilerMark(this.name + \"_cancelLayout,info\");\n                    this.canceling = true;\n                    if (this.promise) {\n                        this.promise.cancel();\n                    }\n                    if (switchState) {\n                        this.view._setState(LayoutCanceledState);\n                    }\n                },\n                stop: function LayingoutState_stop() {\n                    this.cancelLayout(true);\n                },\n                realizePage: nop,\n                rebuildTree: function LayingoutState_rebuildTree() {\n                    this.cancelLayout(false);\n                    this.view._setState(BuildingState);\n                },\n                relayout: function LayingoutState_relayout() {\n                    this.cancelLayout(false);\n                    this.enter();\n                },\n                layoutNewContainers: function LayingoutState_layoutNewContainers() {\n                    this.relayout();\n                },\n                waitForEntityPosition: function LayingoutState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: function LayingoutState_updateTree(count, delta, modifiedElements) {\n                    return this.view._updateTreeImpl(count, delta, modifiedElements);\n                }\n            });\n\n\n            /*\n            View enters this state when layout is canceled.\n\n            LayoutCanceledState => LayingoutState | BuildingState\n            */\n            var LayoutCanceledState = _Base.Class.define(function LayoutCanceledState_ctor(view) {\n                this.view = view;\n            }, {\n                name: 'LayoutCanceledState',\n                enter: nop,\n                stop: nop,\n                realizePage: function LayoutCanceledState_realizePage() {\n                    this.relayout();\n                },\n                rebuildTree: function LayoutCanceledState_rebuildTree() {\n                    this.view._setState(BuildingState);\n                },\n                relayout: function LayoutCanceledState_relayout() {\n                    this.view._setState(LayingoutState);\n                },\n                layoutNewContainers: function LayoutCanceledState_layoutNewContainers() {\n                    this.relayout();\n                },\n                waitForEntityPosition: function LayoutCanceledState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: function LayoutCanceledState_updateTree(count, delta, modifiedElements) {\n                    return this.view._updateTreeImpl(count, delta, modifiedElements);\n                }\n            });\n\n            /*\n            Contents of items in the current viewport and prefetch area is realized during this stage.\n            The view enters this state when items needs to be realized for instance during initialization, edits and resize.\n\n            RealizingState => RealizingAnimatingState | UnrealizingState | LayingoutState | BuildingState | CanceledState\n            */\n            var RealizingState = _Base.Class.define(function RealizingState_ctor(view) {\n                this.view = view;\n                this.nextState = UnrealizingState;\n                this.relayoutNewContainers = true;\n            }, {\n                name: 'RealizingState',\n                enter: function RealizingState_enter() {\n                    var that = this;\n                    var promiseStoredSignal = new _Signal();\n                    this.promise = promiseStoredSignal.promise.then(function () {\n                        return that.view._executeScrollToFunctor();\n                    }).then(function () {\n                        that.relayoutNewContainers = false;\n                        return Promise._cancelBlocker(that.view._realizePageImpl());\n                    }).then(\n                        function () {\n                            if (that.view._state === that) {\n                                that.view._completeUpdateTree();\n                                that.view._listView._writeProfilerMark(\"RealizingState_to_UnrealizingState\");\n                                that.view._setState(that.nextState);\n                            }\n                        },\n                        function (error) {\n                            if (that.view._state === that && !that.canceling) {\n                                that.view._listView._writeProfilerMark(\"RealizingState_to_CanceledState\");\n                                that.view._setState(CanceledState);\n                            }\n                            return Promise.wrapError(error);\n                        }\n                    );\n                    promiseStoredSignal.complete();\n                },\n                stop: function RealizingState_stop() {\n                    this.canceling = true;\n                    this.promise.cancel();\n                    this.view._cancelRealize();\n                    this.view._setState(CanceledState);\n                },\n                realizePage: function RealizingState_realizePage() {\n                    this.canceling = true;\n                    this.promise.cancel();\n                    this.enter();\n                },\n                rebuildTree: function RealizingState_rebuildTree() {\n                    this.stop();\n                    this.view._setState(BuildingState);\n                },\n                relayout: function RealizingState_relayout() {\n                    this.stop();\n                    this.view._setState(LayingoutState);\n                },\n                layoutNewContainers: function RealizingState_layoutNewContainers() {\n                    if (this.relayoutNewContainers) {\n                        this.relayout();\n                    } else {\n                        this.view._createLayoutSignal();\n                        this.view._relayoutInComplete = true;\n                    }\n                },\n                waitForEntityPosition: function RealizingState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: function RealizingState_updateTree(count, delta, modifiedElements) {\n                    return this.view._updateTreeImpl(count, delta, modifiedElements);\n                },\n                setLoadingState: function RealizingState_setLoadingState(state) {\n                    this.view._listView._setViewState(state);\n                }\n            });\n\n            /*\n            The view enters this state when the realize pass, animations or unrealizing was canceled or after newContainers have been laid out.\n            In this state view waits for the next call from ListViewImpl. It can be scroll, edit etc.\n\n            CanceledState => RealizingState | ScrollingState | LayingoutState | BuildingState\n            */\n            var CanceledState = _Base.Class.define(function CanceledState_ctor(view) {\n                this.view = view;\n            }, {\n                name: 'CanceledState',\n                enter: nop,\n                stop: function CanceledState_stop() {\n                    // cancelRealize cancels ariaSetup which can still be in progress\n                    this.view._cancelRealize();\n                },\n                realizePage: function CanceledState_realizePage(NewStateType) {\n                    this.stop();\n                    this.view._setState(NewStateType);\n                },\n                rebuildTree: function CanceledState_rebuildTree() {\n                    this.stop();\n                    this.view._setState(BuildingState);\n                },\n                relayout: function CanceledState_relayout(NextStateType) {\n                    this.stop();\n                    this.view._setState(LayingoutState, NextStateType);\n                },\n                layoutNewContainers: function CanceledState_layoutNewContainers() {\n                    this.relayout(CanceledState);\n                },\n                waitForEntityPosition: function CanceledState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: function CanceledState_updateTree(count, delta, modifiedElements) {\n                    return this.view._updateTreeImpl(count, delta, modifiedElements);\n                }\n            });\n\n            /*\n            This state is almost identical with RealizingState. Currently the difference is that in this state loadingStateChanged events aren’t\n            raised and after complete the state is switched to ScrollingPausedState to wait until end of scrolling.\n\n            ScrollingState => RealizingAnimatingState | ScrollingPausedState | LayingoutState | BuildingState | CanceledState\n            */\n            var ScrollingState = _Base.Class.derive(RealizingState, function ScrollingState_ctor(view) {\n                this.view = view;\n                this.nextState = ScrollingPausedState;\n                this.relayoutNewContainers = true;\n            }, {\n                name: 'ScrollingState',\n                setLoadingState: function ScrollingState_setLoadingState() {\n                }\n            });\n\n            /*\n            The view waits in this state for end of scrolling which for touch is signaled by MSManipulationStateChanged event and for mouse it is timeout.\n\n            ScrollingPausedState => RealizingAnimatingState | ScrollingPausedState | LayingoutState | BuildingState | CanceledState\n            */\n            var ScrollingPausedState = _Base.Class.derive(CanceledState, function ScrollingPausedState_ctor(view) {\n                this.view = view;\n            }, {\n                name: 'ScrollingPausedState',\n                enter: function ScrollingPausedState_enter() {\n                    var that = this;\n                    this.promise = Promise._cancelBlocker(this.view._scrollEndPromise).then(function () {\n                        that.view._setState(UnrealizingState);\n                    });\n                },\n                stop: function ScrollingPausedState_stop() {\n                    this.promise.cancel();\n                    // cancelRealize cancels ariaSetup which can still be in progress\n                    this.view._cancelRealize();\n                },\n            });\n\n            /*\n            In this state, view unrealizes not needed items and then waits for all renderers to complete.\n\n            UnrealizingState => CompletedState | RealizingState | ScrollingState | LayingoutState | BuildingState | CanceledState\n            */\n            var UnrealizingState = _Base.Class.define(function UnrealizingState_ctor(view) {\n                this.view = view;\n            }, {\n                name: 'UnrealizingState',\n                enter: function UnrealizingState_enter() {\n                    var that = this;\n                    this.promise = this.view._lazilyUnrealizeItems().then(function () {\n                        that.view._listView._writeProfilerMark(\"_renderCompletePromise wait starts,info\");\n                        return that.view._renderCompletePromise;\n                    }).then(function () {\n                        that.view._setState(CompletedState);\n                    });\n                },\n                stop: function UnrealizingState_stop() {\n                    // cancelRealize cancels ariaSetup which can still be in progress\n                    this.view._cancelRealize();\n                    this.promise.cancel();\n                    this.view._setState(CanceledState);\n                },\n                realizePage: function UnrealizingState_realizePage(NewStateType) {\n                    this.promise.cancel();\n                    this.view._setState(NewStateType);\n                },\n                rebuildTree: function UnrealizingState_rebuildTree() {\n                    this.view._setState(BuildingState);\n                },\n                relayout: function UnrealizingState_relayout() {\n                    this.view._setState(LayingoutState);\n                },\n                layoutNewContainers: function UnrealizingState_layoutNewContainers() {\n                    this.view._createLayoutSignal();\n                    this.view._relayoutInComplete = true;\n                },\n                waitForEntityPosition: function UnrealizingState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: function UnrealizingState_updateTree(count, delta, modifiedElements) {\n                    return this.view._updateTreeImpl(count, delta, modifiedElements);\n                }\n            });\n\n            /*\n            We enter this state, when there are animations to execute, and we have already fired the viewportloaded event\n\n            RealizingAnimatingState => RealizingState | UnrealizingState | LayingoutState | BuildingState | CanceledState\n            */\n            var RealizingAnimatingState = _Base.Class.define(function RealizingStateAnimating_ctor(view, realizePromise) {\n                this.view = view;\n                this.realizePromise = realizePromise;\n                this.realizeId = 1;\n            }, {\n                name: 'RealizingAnimatingState',\n                enter: function RealizingAnimatingState_enter() {\n                    var that = this;\n\n\n                    this.animating = true;\n                    this.animatePromise = this.view._startAnimations();\n                    this.animateSignal = new _Signal();\n                    this.view._executeAnimations = false;\n\n                    this.animatePromise.done(\n                        function () {\n                            that.animating = false;\n                            if (that.modifiedElements) {\n                                that.view._updateTreeImpl(that.count, that.delta, that.modifiedElements);\n                                that.modifiedElements = null;\n                                that.view._setState(CanceledState);\n                            } else {\n                                that.animateSignal.complete();\n                            }\n                        }, function (error) {\n                            that.animating = false;\n                            return Promise.wrapError(error);\n                        }\n                    );\n\n                    this._waitForRealize();\n                },\n\n                _waitForRealize: function RealizingAnimatingState_waitForRealize() {\n                    var that = this;\n\n                    this.realizing = true;\n                    this.realizePromise.done(function () {\n                        that.realizing = false;\n                    });\n\n                    var currentRealizeId = ++this.realizeId;\n                    Promise.join([this.realizePromise, this.animateSignal.promise]).done(function () {\n                        if (currentRealizeId === that.realizeId) {\n                            that.view._completeUpdateTree();\n                            that.view._listView._writeProfilerMark(\"RealizingAnimatingState_to_UnrealizingState\");\n                            that.view._setState(UnrealizingState);\n                        }\n                    });\n                },\n\n                stop: function RealizingAnimatingState_stop(stopTreeCreation) {\n                    // always cancel realization\n                    this.realizePromise.cancel();\n                    this.view._cancelRealize();\n\n                    // animations are canceled only when tree needs to be rebuilt\n                    if (stopTreeCreation) {\n                        this.animatePromise.cancel();\n                        this.view._setState(CanceledState);\n                    }\n                },\n                realizePage: function RealizingAnimatingState_realizePage() {\n                    if (!this.modifiedElements) {\n                        var that = this;\n                        this.realizePromise = this.view._executeScrollToFunctor().then(function () {\n                            return Promise._cancelBlocker(that.view._realizePageImpl());\n                        });\n                        this._waitForRealize();\n                    }\n                },\n                rebuildTree: function RealizingAnimatingState_rebuildTree() {\n                    this.stop(true);\n                    this.view._setState(BuildingState);\n                },\n                relayout: function RealizingAnimatingState_relayout() {\n                    // Relayout caused by edits should be stopped by updateTree but relayout can be caused by resize or containers creation and in these cases we should stop animations\n                    this.stop(true);\n                    // if tree update was waiting for animations we should do it now\n                    if (this.modifiedElements) {\n                        this.view._updateTreeImpl(this.count, this.delta, this.modifiedElements);\n                        this.modifiedElements = null;\n                    }\n                    this.view._setState(LayingoutState);\n                },\n                layoutNewContainers: function RealizingAnimatingState_layoutNewContainers() {\n                    this.view._createLayoutSignal();\n                    this.view._relayoutInComplete = true;\n                },\n                waitForEntityPosition: function RealizingAnimatingState_waitForEntityPosition() {\n                    return this.view._getLayoutCompleted();\n                },\n                updateTree: function RealizingAnimatingState_updateTree(count, delta, modifiedElements) {\n                    if (this.animating) {\n                        var previousModifiedElements = this.modifiedElements;\n                        this.count = count;\n                        this.delta = delta;\n                        this.modifiedElements = modifiedElements;\n\n                        return previousModifiedElements ? Promise.cancel : this.animatePromise;\n                    } else {\n                        return this.view._updateTreeImpl(count, delta, modifiedElements);\n                    }\n                },\n                setLoadingState: function RealizingAnimatingState_setLoadingState(state) {\n                    this.view._listView._setViewState(state);\n                }\n            });\n\n            /*\n            The view enters this state when the tree is built, layout and realized after animations have\n            finished. The layout can still laying out items outside of realized view during this stage.\n\n            CompletedState => RealizingState | ScrollingState | LayingoutState | BuildingState | LayingoutNewContainersState\n            */\n            var CompletedState = _Base.Class.derive(CanceledState, function CompletedState_ctor(view) {\n                this.view = view;\n            }, {\n                name: 'CompletedState',\n                enter: function CompletedState_enter() {\n                    this._stopped = false;\n                    this.view._setupDeferredActions();\n\n                    this.view._realizationLevel = _VirtualizeContentsView._realizationLevel.normal;\n                    this.view._listView._raiseViewComplete();\n\n                    // _raiseViewComplete will cause user event listener code to run synchronously.\n                    // If any updates are made to the Listview, this state will be stopped by the updater.\n                    // We don't want to change state to LayingoutNewContainersState if that happens.\n                    if (this.view._state === this && this.view._relayoutInComplete && !this._stopped) {\n                        this.view._setState(LayingoutNewContainersState);\n                    }\n                },\n                stop: function CompletedState_stop() {\n                    this._stopped = true;\n                    // Call base class method.\n                    CanceledState.prototype.stop.call(this);\n                },\n                layoutNewContainers: function CompletedState_layoutNewContainers() {\n                    this.view._createLayoutSignal();\n                    this.view._setState(LayingoutNewContainersState);\n                },\n                updateTree: function CompletedState_updateTree(count, delta, modifiedElements) {\n                    return this.view._updateTreeImpl(count, delta, modifiedElements, true);\n                }\n            });\n\n            /*\n            The view waits in this state for previous layout pass to finish.\n\n            LayingoutNewContainersState => RealizingState | ScrollingState | LayingoutState | BuildingState\n            */\n            var LayingoutNewContainersState = _Base.Class.derive(CanceledState, function LayingoutNewContainersState(view) {\n                this.view = view;\n            }, {\n                name: 'LayingoutNewContainersState',\n                enter: function LayingoutNewContainersState_enter() {\n                    var that = this;\n\n                    // _layoutWork is completed when the previous layout pass is done. _getLayoutCompleted will be completed when these new containers are laid out\n                    this.promise = Promise.join([this.view.deferTimeout, this.view._layoutWork]);\n                    this.promise.then(function () {\n                        that.view._relayoutInComplete = false;\n                        that.relayout(CanceledState);\n                    });\n                },\n                stop: function LayingoutNewContainersState_stop() {\n                    // cancelRealize cancels ariaSetup which can still be in progress\n                    this.promise.cancel();\n                    this.view._cancelRealize();\n                },\n                realizePage: function LayingoutNewContainersState_realizePage(NewStateType) {\n                    // in this state realizePage needs to run layout before realizing items\n                    this.stop();\n                    this.view._setState(LayingoutState, NewStateType);\n                },\n                layoutNewContainers: function LayingoutNewContainersState_layoutNewContainers() {\n                    this.view._createLayoutSignal();\n                }\n            });\n\n            return _VirtualizeContentsView;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-listview',[],function(){});\n\ndefine('require-style!less/colors-listview',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ListView',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../_Accents',\n    '../Animations',\n    '../Animations/_TransitionAnimation',\n    '../BindingList',\n    '../Promise',\n    '../Scheduler',\n    '../_Signal',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_ItemsManager',\n    '../Utilities/_SafeHtml',\n    '../Utilities/_TabContainer',\n    '../Utilities/_UI',\n    '../Utilities/_VersionManager',\n    './ItemContainer/_Constants',\n    './ItemContainer/_ItemEventsHandler',\n    './ListView/_BrowseMode',\n    './ListView/_ErrorMessages',\n    './ListView/_GroupFocusCache',\n    './ListView/_GroupsContainer',\n    './ListView/_Helpers',\n    './ListView/_ItemsContainer',\n    './ListView/_Layouts',\n    './ListView/_SelectionManager',\n    './ListView/_VirtualizeContentsView',\n    'require-style!less/styles-listview',\n    'require-style!less/colors-listview'\n], function listViewImplInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, _Accents, Animations, _TransitionAnimation, BindingList, Promise, Scheduler, _Signal, _Control, _Dispose, _ElementUtilities, _Hoverable, _ItemsManager, _SafeHtml, _TabContainer, _UI, _VersionManager, _Constants, _ItemEventsHandler, _BrowseMode, _ErrorMessages, _GroupFocusCache, _GroupsContainer, _Helpers, _ItemsContainer, _Layouts, _SelectionManager, _VirtualizeContentsView) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\n        \".win-listview:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground,\\\n         .win-itemcontainer:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground\", [\n             { name: \"border-color\", value: _Accents.ColorTypes.accent },\n             { name: \"background-color\", value: _Accents.ColorTypes.accent },\n         ]);\n\n    _Accents.createAccentRule(\n        \".win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,\\\n         .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder\", [\n            { name: \"border-color\", value: _Accents.ColorTypes.accent },\n         ]);\n\n    _Accents.createAccentRule(\n        \".win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\\\n         .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground\", [\n             { name: \"background-color\", value: _Accents.ColorTypes.accent }\n         ]);\n\n    var transformNames = _BaseUtils._browserStyleEquivalents[\"transform\"];\n    var DISPOSE_TIMEOUT = 1000;\n    var controlsToDispose = [];\n    var disposeControlTimeout;\n    var uniqueID = _ElementUtilities._uniqueID;\n\n    function disposeControls() {\n        var temp = controlsToDispose;\n        controlsToDispose = [];\n        temp = temp.filter(function (c) {\n            if (c._isZombie()) {\n                c._dispose();\n                return false;\n            } else {\n                return true;\n            }\n        });\n        controlsToDispose = controlsToDispose.concat(temp);\n    }\n    function scheduleForDispose(lv) {\n        controlsToDispose.push(lv);\n        disposeControlTimeout && disposeControlTimeout.cancel();\n        disposeControlTimeout = Promise.timeout(DISPOSE_TIMEOUT).then(disposeControls);\n    }\n\n    function getOffsetRight(element) {\n        return element.offsetParent ? (element.offsetParent.offsetWidth - element.offsetLeft - element.offsetWidth) : 0;\n    }\n\n    var strings = {\n        get notCompatibleWithSemanticZoom() { return \"ListView can only be used with SemanticZoom if randomAccess loading behavior is specified.\"; },\n        get listViewInvalidItem() { return \"Item must provide index, key or description of corresponding item.\"; },\n        get listViewViewportAriaLabel() { return _Resources._getWinJSString(\"ui/listViewViewportAriaLabel\").value; }\n    };\n\n    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;\n\n    var ListViewAnimationType = {\n        /// <field locid=\"WinJS.UI.ListView.ListViewAnimationType.entrance\" helpKeyword=\"WinJS.UI.ListViewAnimationType.entrance\">\n        /// The animation plays when the ListView is first displayed.\n        /// </field>\n        entrance: \"entrance\",\n        /// <field locid=\"WinJS.UI.ListView.ListViewAnimationType.contentTransition\" helpKeyword=\"WinJS.UI.ListViewAnimationType.contentTransition\">\n        /// The animation plays when the ListView is changing its content.\n        /// </field>\n        contentTransition: \"contentTransition\"\n    };\n\n    // ListView implementation\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n\n        /// <field locid=\"WinJS.UI.ListView.ListViewAnimationType\" helpKeyword=\"WinJS.UI.ListViewAnimationType\">\n        /// Specifies whether the ListView animation is an entrance animation or a transition animation.\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        ListViewAnimationType: ListViewAnimationType,\n\n        /// <field>\n        /// <summary locid=\"WinJS.UI.ListView\">\n        /// Displays items in a customizable list or grid.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.listview.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.listview.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.ListView\"></div>]]></htmlSnippet>\n        /// <event name=\"contentanimating\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:contentanimating\">Raised when the ListView is about to play an entrance or a transition animation.</event>\n        /// <event name=\"iteminvoked\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:iteminvoked\">Raised when the user taps or clicks an item.</event>\n        /// <event name=\"groupheaderinvoked\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:groupheaderinvoked\">Raised when the user taps or clicks a group header.</event>\n        /// <event name=\"selectionchanging\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:selectionchanging\">Raised before items are selected or deselected.</event>\n        /// <event name=\"selectionchanged\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:selectionchanged\">Raised after items are selected or deselected.</event>\n        /// <event name=\"loadingstatechanged\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:loadingstatechanged\">Raised when the loading state changes.</event>\n        /// <event name=\"keyboardnavigating\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:keyboardnavigating\">Raised when the focused item changes.</event>\n        /// <event name=\"itemdragstart\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragstart\">Raised when the the user begins dragging ListView items.</event>\n        /// <event name=\"itemdragenter\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragenter\">Raised when the user drags into the ListView.</event>\n        /// <event name=\"itemdragend\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragend\">Raised when a drag operation begun in a ListView ends.</event>\n        /// <event name=\"itemdragbetween\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragbetween\">Raised when the user drags between two ListView items.</event>\n        /// <event name=\"itemdragleave\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragleave\">Raised when the user drags outside of the ListView region.</event>\n        /// <event name=\"itemdragchanged\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragchanged\">Raised when the items being dragged are changed due to a datasource modification.</event>\n        /// <event name=\"itemdragdrop\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:itemdragdrop\">Raised when the user drops items into the ListView.</event>\n        /// <event name=\"headervisibilitychanged\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:headervisibilitychanged\">Raised when the layout header becomes visible or invisible</event>\n        /// <event name=\"footervisibilitychanged\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:footervisibilitychanged\">Raised when the layout footer becomes visible or invisible</event>\n        /// <event name=\"accessibilityannotationcomplete\" bubbles=\"true\" locid=\"WinJS.UI.ListView_e:accessibilityannotationcomplete\">Raised when the accessibility attributes have been added to the ListView items.</event>\n        /// <part name=\"listView\" class=\"win-listview\" locid=\"WinJS.UI.ListView_part:listView\">The entire ListView control.</part>\n        /// <part name=\"viewport\" class=\"win-viewport\" locid=\"WinJS.UI.ListView_part:viewport\">The viewport of the ListView. </part>\n        /// <part name=\"surface\" class=\"win-surface\" locid=\"WinJS.UI.ListView_part:surface\">The scrollable region of the ListView.</part>\n        /// <part name=\"item\" class=\"win-item\" locid=\"WinJS.UI.ListView_part:item\">An item in the ListView.</part>\n        /// <part name=\"selectionbackground\" class=\"win-selectionbackground\" locid=\"WinJS.UI.ListView_part:selectionbackground\">The background of a selection checkmark.</part>\n        /// <part name=\"selectioncheckmark\" class=\"win-selectioncheckmark\" locid=\"WinJS.UI.ListView_part:selectioncheckmark\">A selection checkmark.</part>\n        /// <part name=\"groupHeader\" class=\"win-groupheader\" locid=\"WinJS.UI.ListView_part:groupHeader\">The header of a group.</part>\n        /// <part name=\"progressbar\" class=\"win-progress\" locid=\"WinJS.UI.ListView_part:progressbar\">The progress indicator of the ListView.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        ListView: _Base.Namespace._lazy(function () {\n            var AffectedRange = _Base.Class.define(function () {\n                this.clear();\n            }, {\n                // Marks the union of the current affected range and range as requiring layout\n                add: function (range, itemsCount) {\n                    range._lastKnownSizeOfData = itemsCount; // store this in order to make unions.\n                    if (!this._range) {\n                        this._range = range;\n                    } else {\n                        // Take the union of these two ranges.\n                        this._range.start = Math.min(this._range.start, range.start);\n                        // To accurately calculate the new unioned range 'end' value, we need to convert the current and new range end\n                        // positions into values that represent the remaining number of un-modified items in between the end of the range\n                        // and the end of the list of data.\n                        var previousUnmodifiedItemsFromEnd = (this._range._lastKnownSizeOfData - this._range.end);\n                        var newUnmodifiedItemsFromEnd = (range._lastKnownSizeOfData - range.end);\n                        var finalUnmodifiedItemsFromEnd = Math.min(previousUnmodifiedItemsFromEnd, newUnmodifiedItemsFromEnd);\n                        this._range._lastKnownSizeOfData = range._lastKnownSizeOfData;\n                        // Convert representation of the unioned end position back into a value which matches the above definition of _affecteRange.end\n                        this._range.end = this._range._lastKnownSizeOfData - finalUnmodifiedItemsFromEnd;\n                    }\n                },\n\n                // Marks everything as requiring layout\n                addAll: function () {\n                    this.add({ start: 0, end: Number.MAX_VALUE }, Number.MAX_VALUE);\n                },\n\n                // Marks nothing as requiring layout\n                clear: function () {\n                    this._range = null;\n                },\n\n                get: function () {\n                    return this._range;\n                }\n            });\n\n            var ZoomableView = _Base.Class.define(function ZoomableView_ctor(listView) {\n                // Constructor\n\n                this._listView = listView;\n            }, {\n                // Public methods\n\n                getPanAxis: function () {\n                    return this._listView._getPanAxis();\n                },\n\n                configureForZoom: function (isZoomedOut, isCurrentView, triggerZoom, prefetchedPages) {\n                    this._listView._configureForZoom(isZoomedOut, isCurrentView, triggerZoom, prefetchedPages);\n                },\n\n                setCurrentItem: function (x, y) {\n                    this._listView._setCurrentItem(x, y);\n                },\n\n                getCurrentItem: function () {\n                    return this._listView._getCurrentItem();\n                },\n\n                beginZoom: function () {\n                    return this._listView._beginZoom();\n                },\n\n                positionItem: function (item, position) {\n                    return this._listView._positionItem(item, position);\n                },\n\n                endZoom: function (isCurrentView) {\n                    this._listView._endZoom(isCurrentView);\n                },\n\n                pinching: {\n                    get: function () {\n                        return this._listView._pinching;\n                    },\n                    set: function (value) {\n                        this._listView._pinching = value;\n                    }\n                }\n            });\n\n            var ListView = _Base.Class.define(function ListView_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.ListView.ListView\">\n                /// <summary locid=\"WinJS.UI.ListView.constructor\">\n                /// Creates a new ListView.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.ListView.constructor_p:element\">\n                /// The DOM element that hosts the ListView control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.ListView.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the selectionchanged event,\n                /// add a property named \"onselectionchanged\" to the options object and set its value to the event handler.\n                /// </param>\n                /// <returns type=\"WinJS.UI.ListView\" locid=\"WinJS.UI.ListView.constructor_returnValue\">\n                /// The new ListView.\n                /// </returns>\n                /// </signature>\n                element = element || _Global.document.createElement(\"div\");\n\n                this._id = element.id || \"\";\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                options = options || {};\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                _ElementUtilities.addClass(element, \"win-disposable\");\n                this._affectedRange = new AffectedRange();\n                this._mutationObserver = new _ElementUtilities._MutationObserver(this._itemPropertyChange.bind(this));\n                this._versionManager = null;\n                this._insertedItems = {};\n                this._element = element;\n                this._startProperty = null;\n                this._scrollProperty = null;\n                this._scrollLength = null;\n                this._scrolling = false;\n                this._zooming = false;\n                this._pinching = false;\n                this._itemsManager = null;\n                this._canvas = null;\n                this._cachedCount = _Constants._UNINITIALIZED;\n                this._loadingState = this._LoadingState.complete;\n                this._firstTimeDisplayed = true;\n                this._currentScrollPosition = 0;\n                this._lastScrollPosition = 0;\n                this._notificationHandlers = [];\n                this._itemsBlockExtent = -1;\n                this._lastFocusedElementInGroupTrack = { type: _UI.ObjectType.item, index: -1 };\n                this._headerFooterVisibilityStatus = { headerVisible: false, footerVisible: false };\n                this._viewportWidth = _Constants._UNINITIALIZED;\n                this._viewportHeight = _Constants._UNINITIALIZED;\n                this._manipulationState = _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED;\n                this._maxDeferredItemCleanup = Number.MAX_VALUE;\n                this._groupsToRemove = {};\n                this._setupInternalTree();\n                this._isCurrentZoomView = true;\n                this._dragSource = false;\n                this._reorderable = false;\n                this._groupFocusCache = new _GroupFocusCache._UnsupportedGroupFocusCache();\n                this._viewChange = _Constants._ViewChange.rebuild;\n                this._scrollToFunctor = null;\n                this._setScrollbarPosition = false;\n                // The view needs to be initialized after the internal tree is setup, because the view uses the canvas node immediately to insert an element in its constructor\n                this._view = new _VirtualizeContentsView._VirtualizeContentsView(this);\n                this._selection = new _SelectionManager._SelectionManager(this);\n                this._createTemplates();\n                this._groupHeaderRenderer = _ItemsManager._trivialHtmlRenderer;\n                this._itemRenderer = _ItemsManager._trivialHtmlRenderer;\n                this._groupHeaderRelease = null;\n                this._itemRelease = null;\n                if (!options.itemDataSource) {\n                    var list = new BindingList.List();\n                    this._dataSource = list.dataSource;\n                } else {\n                    this._dataSource = options.itemDataSource;\n                }\n                this._selectionMode = _UI.SelectionMode.multi;\n                this._tap = _UI.TapBehavior.invokeOnly;\n                this._groupHeaderTap = _UI.GroupHeaderTapBehavior.invoke;\n                this._mode = new _BrowseMode._SelectionMode(this);\n\n                this._groups = new _GroupsContainer._NoGroups(this);\n                this._updateItemsAriaRoles();\n                this._updateGroupHeadersAriaRoles();\n                this._element.setAttribute(\"aria-multiselectable\", this._multiSelection());\n                this._element.tabIndex = -1;\n                this._tabManager.tabIndex = this._tabIndex;\n                if (this._element.style.position !== \"absolute\" && this._element.style.position !== \"relative\") {\n                    this._element.style.position = \"relative\";\n                }\n                this._updateItemsManager();\n                if (!options.layout) {\n                    this._updateLayout(new _Layouts.GridLayout());\n                }\n                this._attachEvents();\n\n                this._runningInit = true;\n                _Control.setOptions(this, options);\n                this._runningInit = false;\n\n                this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0);\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                // Public properties\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.ListView.element\" helpKeyword=\"WinJS.UI.ListView.element\">\n                /// Gets the DOM element that hosts the ListView.\n                /// </field>\n                element: {\n                    get: function () { return this._element; }\n                },\n\n                /// <field type=\"WinJS.UI.Layout\" locid=\"WinJS.UI.ListView.layout\" helpKeyword=\"WinJS.UI.ListView.layout\">\n                /// Gets or sets an object that controls the layout of the ListView.\n                /// </field>\n                layout: {\n                    get: function () {\n                        return this._layoutImpl;\n                    },\n                    set: function (layoutObject) {\n                        this._updateLayout(layoutObject);\n\n                        if (!this._runningInit) {\n                            this._view.reset();\n                            this._updateItemsManager();\n                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.maxLeadingPages\" helpKeyword=\"WinJS.UI.ListView.maxLeadingPages\" isAdvanced=\"true\">\n                /// Gets or sets the maximum number of pages to prefetch in the leading buffer for virtualization.\n                /// </field>\n                maxLeadingPages: {\n                    get: function ListView_getMaxLeadingPages() {\n                        return this._view.maxLeadingPages;\n                    },\n                    set: function ListView_setMaxLeadingPages(value) {\n                        this._view.maxLeadingPages = Math.max(0, Math.floor(value));\n                    },\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.maxTrailingPages\" helpKeyword=\"WinJS.UI.ListView.maxTrailingPages\" isAdvanced=\"true\">\n                /// Gets or sets the maximum number of pages to prefetch in the trailing buffer for virtualization.\n                /// </field>\n                maxTrailingPages: {\n                    get: function ListView_getMaxTrailingPages() {\n                        return this._view.maxTrailingPages;\n                    },\n                    set: function ListView_setMaxTrailingPages(value) {\n                        this._view.maxTrailingPages = Math.max(0, Math.floor(value));\n                    },\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.pagesToLoad\" helpKeyword=\"WinJS.UI.ListView.pagesToLoad\" isAdvanced=\"true\">\n                /// Gets or sets the number of pages to load when the user scrolls beyond the\n                /// threshold specified by the pagesToLoadThreshold property if\n                /// the loadingBehavior property is set to incremental.\n                /// <deprecated type=\"deprecate\">\n                /// pagesToLoad is deprecated. The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\n                /// </deprecated>\n                /// </field>\n                pagesToLoad: {\n                    get: function () {\n                        return (_VirtualizeContentsView._VirtualizeContentsView._defaultPagesToPrefetch * 2) + 1;\n                    },\n                    set: function () {\n                        _ElementUtilities._deprecated(_ErrorMessages.pagesToLoadIsDeprecated);\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.pagesToLoadThreshold\" helpKeyword=\"WinJS.UI.ListView.pagesToLoadThreshold\" isAdvanced=\"true\">\n                /// Gets or sets the threshold (in pages) for initiating an incremental load. When the last visible item is\n                /// within the specified number of pages from the end of the loaded portion of the list,\n                /// and if automaticallyLoadPages is true and loadingBehavior is set to \"incremental\",\n                /// the ListView initiates an incremental load.\n                /// <deprecated type=\"deprecate\">\n                /// pagesToLoadThreshold is deprecated.  The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\n                /// </deprecated>\n                /// </field>\n                pagesToLoadThreshold: {\n                    get: function () {\n                        return 0;\n                    },\n                    set: function () {\n                        _ElementUtilities._deprecated(_ErrorMessages.pagesToLoadThresholdIsDeprecated);\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.groupDataSource\" helpKeyword=\"WinJS.UI.ListView.groupDataSource\">\n                /// Gets or sets the data source that contains the groups for the items in the itemDataSource.\n                /// </field>\n                groupDataSource: {\n                    get: function () {\n                        return this._groupDataSource;\n                    },\n                    set: function (newValue) {\n                        this._writeProfilerMark(\"set_groupDataSource,info\");\n\n                        var that = this;\n\n                        function groupStatusChanged(eventObject) {\n                            if (eventObject.detail === _UI.DataSourceStatus.failure) {\n                                that.itemDataSource = null;\n                                that.groupDataSource = null;\n                            }\n                        }\n\n                        if (this._groupDataSource && this._groupDataSource.removeEventListener) {\n                            this._groupDataSource.removeEventListener(\"statuschanged\", groupStatusChanged, false);\n                        }\n\n                        this._groupDataSource = newValue;\n                        this._groupFocusCache = (newValue && this._supportsGroupHeaderKeyboarding) ? new _GroupFocusCache._GroupFocusCache(this) : new _GroupFocusCache._UnsupportedGroupFocusCache();\n\n                        if (this._groupDataSource && this._groupDataSource.addEventListener) {\n                            this._groupDataSource.addEventListener(\"statuschanged\", groupStatusChanged, false);\n                        }\n\n                        this._createGroupsContainer();\n\n                        if (!this._runningInit) {\n                            this._view.reset();\n                            this._pendingLayoutReset = true;\n                            this._pendingGroupWork = true;\n                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);\n                        } else {\n                            this._updateGroupWork();\n                            this._resetLayout();\n                        }\n                    }\n                },\n\n                _updateGroupWork: function () {\n                    this._pendingGroupWork = false;\n\n                    if (this._groupDataSource) {\n                        _ElementUtilities.addClass(this._element, _Constants._groupsClass);\n                    } else {\n                        _ElementUtilities.removeClass(this._element, _Constants._groupsClass);\n                    }\n                    this._resetLayout();\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ListView.automaticallyLoadPages\" helpKeyword=\"WinJS.UI.ListView.automaticallyLoadPages\">\n                /// Gets or sets a value that indicates whether the next set of pages is automatically loaded\n                /// when the user scrolls beyond the number of pages specified by the\n                /// pagesToLoadThreshold property.\n                /// <deprecated type=\"deprecate\">\n                /// automaticallyLoadPages is deprecated. The control will default this property to false. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\n                /// </deprecated>\n                /// </field>\n                automaticallyLoadPages: {\n                    get: function () {\n                        return false;\n                    },\n                    set: function () {\n                        _ElementUtilities._deprecated(_ErrorMessages.automaticallyLoadPagesIsDeprecated);\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.ListView.LoadingBehavior\" locid=\"WinJS.UI.ListView.loadingBehavior\" helpKeyword=\"WinJS.UI.ListView.loadingBehavior\">\n                /// Gets or sets a value that determines how many data items are loaded into the DOM.\n                /// <deprecated type=\"deprecate\">\n                /// pagesToLoadThreshold is deprecated. The control will default this property to 'randomAccess'. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\n                /// </deprecated>\n                /// </field>\n                loadingBehavior: {\n                    get: function () {\n                        return \"randomAccess\";\n                    },\n                    set: function () {\n                        _ElementUtilities._deprecated(_ErrorMessages.loadingBehaviorIsDeprecated);\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.ListView.SelectionMode\" locid=\"WinJS.UI.ListView.selectionMode\" helpKeyword=\"WinJS.UI.ListView.selectionMode\">\n                /// Gets or sets a value that specifies how many ListView items the user can select: \"none\", \"single\", or \"multi\".\n                /// </field>\n                selectionMode: {\n                    get: function () {\n                        return this._selectionMode;\n                    },\n                    set: function (newMode) {\n                        if (typeof newMode === \"string\") {\n                            if (newMode.match(/^(none|single|multi)$/)) {\n                                if (_BaseUtils.isPhone && newMode === _UI.SelectionMode.single) {\n                                    return;\n                                }\n                                this._selectionMode = newMode;\n                                this._element.setAttribute(\"aria-multiselectable\", this._multiSelection());\n                                this._updateItemsAriaRoles();\n                                this._configureSelectionMode();\n                                return;\n                            }\n                        }\n                        throw new _ErrorFromName(\"WinJS.UI.ListView.ModeIsInvalid\", _ErrorMessages.modeIsInvalid);\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.TapBehavior\" locid=\"WinJS.UI.ListView.tapBehavior\" helpKeyword=\"WinJS.UI.ListView.tapBehavior\">\n                /// Gets or sets how the ListView reacts when the user taps or clicks an item.\n                /// The tap or click can invoke the item, select it and invoke it, or have no\n                /// effect.\n                /// </field>\n                tapBehavior: {\n                    get: function () {\n                        return this._tap;\n                    },\n                    set: function (tap) {\n                        if (_BaseUtils.isPhone && tap === _UI.TapBehavior.directSelect) {\n                            return;\n                        }\n                        this._tap = tap;\n                        this._updateItemsAriaRoles();\n                        this._configureSelectionMode();\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.GroupHeaderTapBehavior\" locid=\"WinJS.UI.ListView.groupHeaderTapBehavior\" helpKeyword=\"WinJS.UI.ListView.groupHeaderTapBehavior\">\n                /// Gets or sets how the ListView reacts when the user taps or clicks a group header.\n                /// </field>\n                groupHeaderTapBehavior: {\n                    get: function () {\n                        return this._groupHeaderTap;\n                    },\n                    set: function (tap) {\n                        this._groupHeaderTap = tap;\n                        this._updateGroupHeadersAriaRoles();\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.SwipeBehavior\" locid=\"WinJS.UI.ListView.swipeBehavior\" helpKeyword=\"WinJS.UI.ListView.swipeBehavior\">\n                /// Gets or sets how the ListView reacts to the swipe interaction.\n                /// The swipe gesture can select the swiped items or it can\n                /// have no effect on the current selection.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// <deprecated type=\"deprecate\">\n                /// swipeBehavior is deprecated. The control will not use this property.\n                /// </deprecated>\n                /// </field>\n                swipeBehavior: {\n                    get: function () {\n                        return \"none\";\n                    },\n                    set: function (value) {\n                        _ElementUtilities._deprecated(_ErrorMessages.swipeBehaviorDeprecated);\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.itemDataSource\" helpKeyword=\"WinJS.UI.ListView.itemDataSource\">\n                /// Gets or sets the data source that provides items for the ListView.\n                /// </field>\n                itemDataSource: {\n                    get: function () {\n                        return this._itemsManager.dataSource;\n                    },\n                    set: function (newData) {\n                        this._writeProfilerMark(\"set_itemDataSource,info\");\n                        this._dataSource = newData || new BindingList.List().dataSource;\n                        this._groupFocusCache.clear();\n\n                        if (!this._runningInit) {\n                            this._selection._reset();\n                            this._cancelAsyncViewWork(true);\n                            this._updateItemsManager();\n                            this._pendingLayoutReset = true;\n                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);\n                        }\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.itemTemplate\" helpKeyword=\"WinJS.UI.ListView.itemTemplate\" potentialValueSelector=\"[data-win-control='WinJS.Binding.Template']\">\n                /// Gets or sets the templating function that creates the DOM elements\n                /// for each item in the itemDataSource. Each item can contain multiple\n                /// DOM elements, but we recommend that it have a single root element.\n                /// </field>\n                itemTemplate: {\n                    get: function () {\n                        return this._itemRenderer;\n                    },\n                    set: function (newRenderer) {\n                        this._setRenderer(newRenderer, false);\n\n                        if (!this._runningInit) {\n                            this._cancelAsyncViewWork(true);\n                            this._updateItemsManager();\n                            this._pendingLayoutReset = true;\n                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.ListView.resetItem\" helpKeyword=\"WinJS.UI.ListView.resetItem\">\n                /// Gets or sets the function that is called when the ListView recycles the\n                /// element representation of an item.\n                /// <deprecated type=\"deprecate\">\n                /// resetItem may be altered or unavailable in future versions. Instead, mark the element as disposable using WinJS.Utilities.markDisposable.\n                /// </deprecated>\n                /// </field>\n                resetItem: {\n                    get: function () {\n                        return this._itemRelease;\n                    },\n                    set: function (release) {\n                        _ElementUtilities._deprecated(_ErrorMessages.resetItemIsDeprecated);\n                        this._itemRelease = release;\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.groupHeaderTemplate\" helpKeyword=\"WinJS.UI.ListView.groupHeaderTemplate\" potentialValueSelector=\"[data-win-control='WinJS.Binding.Template']\">\n                /// Gets or sets the templating function that creates the DOM elements\n                /// for each group header in the groupDataSource. Each group header\n                /// can contain multiple elements, but it must have a single root element.\n                /// </field>\n                groupHeaderTemplate: {\n                    get: function () {\n                        return this._groupHeaderRenderer;\n                    },\n                    set: function (newRenderer) {\n                        this._setRenderer(newRenderer, true);\n\n                        if (!this._runningInit) {\n                            this._cancelAsyncViewWork(true);\n                            this._pendingLayoutReset = true;\n                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.ListView.resetGroupHeader\" helpKeyword=\"WinJS.UI.ListView.resetGroupHeader\" isAdvanced=\"true\">\n                /// Gets or sets the function that is called when the ListView recycles the DOM element representation\n                /// of a group header.\n                /// <deprecated type=\"deprecate\">\n                /// resetGroupHeader may be altered or unavailable in future versions. Instead, mark the header element as disposable using WinJS.Utilities.markDisposable.\n                /// </deprecated>\n                /// </field>\n                resetGroupHeader: {\n                    get: function () {\n                        return this._groupHeaderRelease;\n                    },\n                    set: function (release) {\n                        _ElementUtilities._deprecated(_ErrorMessages.resetGroupHeaderIsDeprecated);\n                        this._groupHeaderRelease = release;\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.ListView.header\" helpKeyword=\"WinJS.UI.ListView.header\">\n                /// Gets or sets the header to display at the start of the ListView.\n                /// </field>\n                header: {\n                    get: function () {\n                        return this._header;\n                    },\n                    set: function (newHeader) {\n                        _ElementUtilities.empty(this._headerContainer);\n                        this._header = newHeader;\n                        if (newHeader) {\n                            this._header.tabIndex = this._tabIndex;\n                            this._headerContainer.appendChild(newHeader);\n                        }\n\n                        var currentFocus = this._selection._getFocused();\n                        if (currentFocus.type === _UI.ObjectType.header) {\n                            var targetEntity = currentFocus;\n                            if (!newHeader) {\n                                targetEntity = { type: _UI.ObjectType.item, index: 0 };\n                            }\n\n                            if (this._hasKeyboardFocus) {\n                                this._changeFocus(targetEntity, true, false, true);\n                            } else {\n                                this._changeFocusPassively(targetEntity);\n                            }\n                        }\n                        this.recalculateItemPosition();\n                        this._raiseHeaderFooterVisibilityEvent();\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.ListView.footer\" helpKeyword=\"WinJS.UI.ListView.footer\">\n                /// Gets or sets the footer to display at the end of the ListView.\n                /// </field>\n                footer: {\n                    get: function () {\n                        return this._footer;\n                    },\n                    set: function (newFooter) {\n                        _ElementUtilities.empty(this._footerContainer);\n                        this._footer = newFooter;\n                        if (newFooter) {\n                            this._footer.tabIndex = this._tabIndex;\n                            this._footerContainer.appendChild(newFooter);\n                        }\n\n                        var currentFocus = this._selection._getFocused();\n                        if (currentFocus.type === _UI.ObjectType.footer) {\n                            var targetEntity = currentFocus;\n                            if (!newFooter) {\n                                targetEntity = { type: _UI.ObjectType.item, index: 0 };\n                            }\n\n                            if (this._hasKeyboardFocus) {\n                                this._changeFocus(targetEntity, true, false, true);\n                            } else {\n                                this._changeFocusPassively(targetEntity);\n                            }\n                        }\n                        this.recalculateItemPosition();\n                        this._raiseHeaderFooterVisibilityEvent();\n                    }\n                },\n\n                /// <field type=\"String\" hidden=\"true\" locid=\"WinJS.UI.ListView.loadingState\" helpKeyword=\"WinJS.UI.ListView.loadingState\">\n                /// Gets a value that indicates whether the ListView is still loading or whether\n                /// loading is complete.  This property can return one of these values:\n                /// \"itemsLoading\", \"viewPortLoaded\", \"itemsLoaded\", or \"complete\".\n                /// </field>\n                loadingState: {\n                    get: function () {\n                        return this._loadingState;\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.selection\" helpKeyword=\"WinJS.UI.ListView.selection\" isAdvanced=\"true\">\n                /// Gets an ISelection object that contains the currently selected items.\n                /// </field>\n                selection: {\n                    get: function () {\n                        return this._selection;\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.indexOfFirstVisible\" helpKeyword=\"WinJS.UI.ListView.indexOfFirstVisible\" isAdvanced=\"true\">\n                /// Gets or sets the first visible item. When setting this property, the ListView scrolls so that the\n                /// item with the specified index is at the top of the list.\n                /// </field>\n                indexOfFirstVisible: {\n                    get: function () {\n                        return this._view.firstIndexDisplayed;\n                    },\n\n                    set: function (itemIndex) {\n                        if (itemIndex < 0) {\n                            return;\n                        }\n\n                        this._writeProfilerMark(\"set_indexOfFirstVisible(\" + itemIndex + \"),info\");\n                        this._raiseViewLoading(true);\n\n                        var that = this;\n                        this._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {\n                            var range;\n                            return that._entityInRange({ type: _UI.ObjectType.item, index: itemIndex }).then(function (validated) {\n                                if (!validated.inRange) {\n                                    return {\n                                        position: 0,\n                                        direction: \"left\"\n                                    };\n                                } else {\n                                    return that._getItemOffset({ type: _UI.ObjectType.item, index: validated.index }).then(function (r) {\n                                        range = r;\n                                        return that._ensureFirstColumnRange(_UI.ObjectType.item);\n                                    }).then(function () {\n                                        range = that._correctRangeInFirstColumn(range, _UI.ObjectType.item);\n                                        range = that._convertFromCanvasCoordinates(range);\n\n                                        return that._view.waitForValidScrollPosition(range.begin);\n                                    }).then(function (begin) {\n                                        var direction = (begin < that._lastScrollPosition) ? \"left\" : \"right\";\n                                        var max = that._viewport[that._scrollLength] - that._getViewportLength();\n                                        begin = _ElementUtilities._clamp(begin, 0, max);\n\n                                        return {\n                                            position: begin,\n                                            direction: direction\n                                        };\n                                    });\n                                }\n                            });\n                        }, true);\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" readonly=\"true\" locid=\"WinJS.UI.ListView.indexOfLastVisible\" helpKeyword=\"WinJS.UI.ListView.indexOfLastVisible\" isAdvanced=\"true\">\n                /// Gets the index of the last visible item.\n                /// </field>\n                indexOfLastVisible: {\n                    get: function () {\n                        return this._view.lastIndexDisplayed;\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.currentItem\" helpKeyword=\"WinJS.UI.ListView.currentItem\" isAdvanced=\"true\">\n                /// Gets or sets an object that indicates which item should get keyboard focus and its focus status.\n                /// The object has these properties:\n                /// index: the index of the item in the itemDataSource.\n                /// key: the key of the item in the itemDataSource.\n                /// hasFocus: when getting this property, this value is true if the item already has focus; otherwise, it's false.\n                /// When setting this property, set this value to true if the item should get focus immediately; otherwise, set it to\n                /// false and the item will get focus eventually.\n                /// showFocus: true if the item displays the focus rectangle; otherwise, false.\n                /// </field>\n                currentItem: {\n                    get: function () {\n                        var focused = this._selection._getFocused();\n                        var retVal = {\n                            index: focused.index,\n                            type: focused.type,\n                            key: null,\n                            hasFocus: !!this._hasKeyboardFocus,\n                            showFocus: false\n                        };\n                        if (focused.type === _UI.ObjectType.groupHeader) {\n                            var group = this._groups.group(focused.index);\n                            if (group) {\n                                retVal.key = group.key;\n                                retVal.showFocus = !!(group.header && _ElementUtilities.hasClass(group.header, _Constants._itemFocusClass));\n                            }\n                        } else if (focused.type === _UI.ObjectType.item) {\n                            var item = this._view.items.itemAt(focused.index);\n                            if (item) {\n                                var record = this._itemsManager._recordFromElement(item);\n                                retVal.key = record.item && record.item.key;\n                                retVal.showFocus = !!item.parentNode.querySelector(\".\" + _Constants._itemFocusOutlineClass);\n                            }\n                        }\n                        return retVal;\n                    },\n\n                    set: function (data) {\n                        this._hasKeyboardFocus = data.hasFocus || this._hasKeyboardFocus;\n                        if (!data.type) {\n                            data.type = _UI.ObjectType.item;\n                        }\n                        var that = this;\n                        function setItemFocused(item, isInTree, entity) {\n                            var drawKeyboardFocus = !!data.showFocus && that._hasKeyboardFocus;\n                            that._unsetFocusOnItem(isInTree);\n                            that._selection._setFocused(entity, drawKeyboardFocus);\n                            if (that._hasKeyboardFocus) {\n                                that._keyboardFocusInbound = drawKeyboardFocus;\n                                that._setFocusOnItem(entity);\n                            } else {\n                                that._tabManager.childFocus = (isInTree ? item : null);\n                            }\n                            if (entity.type !== _UI.ObjectType.groupHeader) {\n                                that._updateFocusCache(entity.index);\n                                if (that._updater) {\n                                    that._updater.newSelectionPivot = entity.index;\n                                    that._updater.oldSelectionPivot = -1;\n                                }\n                                that._selection._pivot = entity.index;\n                            }\n                        }\n\n                        if (data.key &&\n                            ((data.type === _UI.ObjectType.item && this._dataSource.itemFromKey) ||\n                            (data.type === _UI.ObjectType.groupHeader && this._groupDataSource && this._groupDataSource.itemFromKey))) {\n                            if (this.oldCurrentItemKeyFetch) {\n                                this.oldCurrentItemKeyFetch.cancel();\n                            }\n                            var dataSource = (data.type === _UI.ObjectType.groupHeader ? this._groupDataSource : this._dataSource);\n                            this.oldCurrentItemKeyFetch = dataSource.itemFromKey(data.key).then(function (item) {\n                                that.oldCurrentItemKeyFetch = null;\n                                if (item) {\n                                    var element = (data.type === _UI.ObjectType.groupHeader ? that._groups.group(item.index).header : that._view.items.itemAt(item.index));\n                                    setItemFocused(element, !!element, { type: data.type, index: item.index });\n                                }\n                            });\n                        } else {\n                            var element;\n                            if (data.type === _UI.ObjectType.header || data.type === _UI.ObjectType.footer) {\n                                element = (data.type === _UI.ObjectType.header ? this._header : this._footer);\n                                setItemFocused(element, !!element, { type: data.type, index: data.index });\n                            } else if (data.index !== undefined) {\n                                if (data.type === _UI.ObjectType.groupHeader) {\n                                    var group = that._groups.group(data.index);\n                                    element = group && group.header;\n                                } else {\n                                    element = that._view.items.itemAt(data.index);\n                                }\n                                setItemFocused(element, !!element, { type: data.type, index: data.index });\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.ListView.zoomableView\" helpKeyword=\"WinJS.UI.ListView.zoomableView\" isAdvanced=\"true\">\n                /// Gets a ZoomableView. This API supports the SemanticZoom infrastructure\n                /// and is not intended to be used directly from your code.\n                /// </field>\n                zoomableView: {\n                    get: function () {\n                        if (!this._zoomableView) {\n                            this._zoomableView = new ZoomableView(this);\n                        }\n\n                        return this._zoomableView;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ListView.itemsDraggable\" helpKeyword=\"WinJS.UI.ListView.itemsDraggable\">\n                /// Gets or sets whether the ListView's items can be dragged via drag and drop.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                itemsDraggable: {\n                    get: function () {\n                        return this._dragSource;\n                    },\n\n                    set: function (value) {\n                        if (_BaseUtils.isPhone) {\n                            return;\n                        }\n                        if (this._dragSource !== value) {\n                            this._dragSource = value;\n                            this._setDraggable();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ListView.itemsReorderable\" helpKeyword=\"WinJS.UI.ListView.itemsReorderable\">\n                /// Gets or sets whether the ListView's items can be reordered within itself via drag and drop. When a ListView is marked as reorderable, its items can be dragged about inside itself, but it will not require the itemdrag events it fires to be handled.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                itemsReorderable: {\n                    get: function () {\n                        return this._reorderable;\n                    },\n\n                    set: function (value) {\n                        if (_BaseUtils.isPhone) {\n                            return;\n                        }\n                        if (this._reorderable !== value) {\n                            this._reorderable = value;\n                            this._setDraggable();\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.maxDeferredItemCleanup\" helpKeyword=\"WinJS.UI.ListView.maxDeferredItemCleanup\" isAdvanced=\"true\">\n                /// Gets or sets the maximum number of realized items.\n                /// </field>\n                maxDeferredItemCleanup: {\n                    get: function () {\n                        return this._maxDeferredItemCleanup;\n                    },\n\n                    set: function (value) {\n                        this._maxDeferredItemCleanup = Math.max(0, +value || 0);\n                    }\n                },\n\n                // Public methods\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.dispose\">\n                    /// <summary locid=\"WinJS.UI.ListView.dispose\">\n                    /// Disposes this ListView.\n                    /// </summary>\n                    /// </signature>\n                    this._dispose();\n                },\n\n                elementFromIndex: function (itemIndex) {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.elementFromIndex\">\n                    /// <summary locid=\"WinJS.UI.ListView.elementFromIndex\">\n                    /// Returns the DOM element that represents the item at the specified index.\n                    /// </summary>\n                    /// <param name=\"itemIndex\" type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.elementFromIndex_p:itemIndex\">\n                    /// The index of the item.\n                    /// </param>\n                    /// <returns type=\"Object\" domElement=\"true\" locid=\"WinJS.UI.ListView.elementFromIndex_returnValue\">\n                    /// The DOM element that represents the specified item.\n                    /// </returns>\n                    /// </signature>\n\n                    return this._view.items.itemAt(itemIndex);\n                },\n\n                indexOfElement: function (element) {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.indexOfElement\">\n                    /// <summary locid=\"WinJS.UI.ListView.indexOfElement\">\n                    /// Returns the index of the item that the specified DOM element displays.\n                    /// </summary>\n                    /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.ListView.indexOfElement_p:element\">\n                    /// The DOM element that displays the item.\n                    /// </param>\n                    /// <returns type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.indexOfElement_returnValue\">\n                    /// The index of item that the specified DOM element displays.\n                    /// </returns>\n                    /// </signature>\n\n                    return this._view.items.index(element);\n                },\n\n                ensureVisible: function ListView_ensureVisible(value) {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.ensureVisible\">\n                    /// <summary locid=\"WinJS.UI.ListView.ensureVisible\">\n                    /// Makes the specified item visible. The ListView scrolls to the item if needed.\n                    /// </summary>\n                    /// <param name=\"value\" type=\"Number|IListViewEntity\" integer=\"true\" locid=\"WinJS.UI.ListView.ensureVisible_p:value\">\n                    /// The index of the ListView item or IListViewEntity to bring into view.\n                    /// </param>\n                    /// </signature>\n                    var type = _UI.ObjectType.item,\n                        itemIndex = value;\n                    if (+value !== value) {\n                        type = value.type;\n                        itemIndex = value.index;\n                    }\n                    this._writeProfilerMark(\"ensureVisible(\" + type + \": \" + itemIndex + \"),info\");\n\n                    if (itemIndex < 0) {\n                        return;\n                    }\n\n                    this._raiseViewLoading(true);\n\n                    var that = this;\n                    this._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {\n                        var range;\n\n                        return that._entityInRange({ type: type, index: itemIndex }).then(function (validated) {\n                            if (!validated.inRange) {\n                                return {\n                                    position: 0,\n                                    direction: \"left\"\n                                };\n                            } else {\n                                return that._getItemOffset({ type: type, index: validated.index }).then(function (r) {\n                                    range = r;\n                                    return that._ensureFirstColumnRange(type);\n                                }).then(function () {\n                                    range = that._correctRangeInFirstColumn(range, type);\n\n                                    var viewportLength = that._getViewportLength(),\n                                        left = that._viewportScrollPosition,\n                                        right = left + viewportLength,\n                                        newPosition = that._viewportScrollPosition,\n                                        entityWidth = range.end - range.begin;\n\n                                    range = that._convertFromCanvasCoordinates(range);\n\n                                    var handled = false;\n                                    if (type === _UI.ObjectType.groupHeader && left <= range.begin) {\n                                        // EnsureVisible on a group where the entire header is fully visible does not\n                                        // scroll. This prevents tabbing from an item in a very large group to align\n                                        // the scroll to the header element.\n                                        var header = that._groups.group(validated.index).header;\n                                        if (header) {\n                                            var headerEnd;\n                                            var margins = _Layouts._getMargins(header);\n                                            if (that._horizontalLayout) {\n                                                var rtl = that._rtl();\n                                                var headerStart = (rtl ? getOffsetRight(header) - margins.right : header.offsetLeft - margins.left);\n                                                headerEnd = headerStart + header.offsetWidth + (rtl ? margins.left : margins.right);\n                                            } else {\n                                                headerEnd = header.offsetTop + header.offsetHeight + margins.top;\n                                            }\n                                            handled = headerEnd <= right;\n                                        }\n                                    }\n                                    if (!handled) {\n                                        if (entityWidth >= right - left) {\n                                            // This item is larger than the viewport so we will just set\n                                            // the scroll position to the beginning of the item.\n                                            newPosition = range.begin;\n                                        } else {\n                                            if (range.begin < left) {\n                                                newPosition = range.begin;\n                                            } else if (range.end > right) {\n                                                newPosition = range.end - viewportLength;\n                                            }\n                                        }\n                                    }\n\n                                    var direction = (newPosition < that._lastScrollPosition) ? \"left\" : \"right\";\n                                    var max = that._viewport[that._scrollLength] - viewportLength;\n                                    newPosition = _ElementUtilities._clamp(newPosition, 0, max);\n\n                                    return {\n                                        position: newPosition,\n                                        direction: direction\n                                    };\n                                });\n                            }\n                        });\n                    }, true);\n                },\n\n                loadMorePages: function ListView_loadMorePages() {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.loadMorePages\">\n                    /// <summary locid=\"WinJS.UI.ListView.loadMorePages\">\n                    /// Loads the next set of pages if the ListView object's loadingBehavior is set to incremental.\n                    /// <deprecated type=\"deprecate\">\n                    /// loadMorePages is deprecated. Invoking this function will not have any effect. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.\n                    /// </deprecated>\n                    /// </summary>\n                    /// </signature>\n                    _ElementUtilities._deprecated(_ErrorMessages.loadMorePagesIsDeprecated);\n                },\n\n                recalculateItemPosition: function ListView_recalculateItemPosition() {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.recalculateItemPosition\">\n                    /// <summary locid=\"WinJS.UI.ListView.recalculateItemPosition\">\n                    /// Repositions all the visible items in the ListView to adjust for items whose sizes have changed. Use this function or forceLayout when making the ListView visible again after you set its style.display property to \"none\" or after style changes have been made that affect the size or position of the ListView or its items. Unlike forceLayout, this method doesn’t recreate items and it doesn’t display entrance animation.\n                    /// </summary>\n                    /// </signature>\n                    this._writeProfilerMark(\"recalculateItemPosition,info\");\n                    this._forceLayoutImpl(_Constants._ViewChange.relayout);\n                },\n\n                forceLayout: function ListView_forceLayout() {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.forceLayout\">\n                    /// <summary locid=\"WinJS.UI.ListView.forceLayout\">\n                    /// Forces the ListView to update its layout. Use this function or relcaculateItemPosition when making the ListView visible again after you set its style.display property to \"none” or after style changes have been made that affect the size or position of the ListView or its items.\n                    /// after you set its style.display property to \"none\".\n                    /// </summary>\n                    /// </signature>\n                    this._writeProfilerMark(\"forceLayout,info\");\n                    this._forceLayoutImpl(_Constants._ViewChange.remeasure);\n                },\n\n                _entityInRange: function ListView_entityInRange(entity) {\n                    if (entity.type === _UI.ObjectType.item) {\n                        return this._itemsCount().then(function (itemsCount) {\n                            var index = _ElementUtilities._clamp(entity.index, 0, itemsCount - 1);\n                            return {\n                                inRange: index >= 0 && index < itemsCount,\n                                index: index\n                            };\n                        });\n                    } else if (entity.type === _UI.ObjectType.groupHeader) {\n                        var index = _ElementUtilities._clamp(entity.index, 0, this._groups.length() - 1);\n                        return Promise.wrap({\n                            inRange: index >= 0 && index < this._groups.length(),\n                            index: index\n                        });\n                    } else {\n                        return Promise.wrap({\n                            inRange: true,\n                            index: 0\n                        });\n                    }\n                },\n\n                _forceLayoutImpl: function ListView_forceLayoutImpl(viewChange) {\n                    var that = this;\n                    this._versionManager.unlocked.then(function () {\n                        that._writeProfilerMark(\"_forceLayoutImpl viewChange(\" + viewChange + \"),info\");\n\n                        that._cancelAsyncViewWork();\n                        that._pendingLayoutReset = true;\n                        that._resizeViewport();\n\n                        that._batchViewUpdates(viewChange, _Constants._ScrollToPriority.low, function () {\n                            return {\n                                position: that._lastScrollPosition,\n                                direction: \"right\"\n                            };\n                        }, true, true);\n                    });\n                },\n\n                _configureSelectionMode: function () {\n                    var selectionModeClass = _Constants._selectionModeClass,\n                        hidingSelectionModeClass = _Constants._hidingSelectionMode;\n                    if (this._isInSelectionMode()) {\n                        _ElementUtilities.addClass(this._canvas, selectionModeClass);\n                        _ElementUtilities.removeClass(this._canvas, hidingSelectionModeClass);\n                    } else {\n                        if (_ElementUtilities.hasClass(this._canvas, selectionModeClass)) {\n                            var that = this;\n                            _Global.setTimeout(function () {\n                                _Global.setTimeout(function () {\n                                    _ElementUtilities.removeClass(that._canvas, hidingSelectionModeClass);\n                                }, _Constants._hidingSelectionModeAnimationTimeout);\n                            }, 50);\n                            _ElementUtilities.addClass(this._canvas, hidingSelectionModeClass);\n                        }\n                        _ElementUtilities.removeClass(this._canvas, selectionModeClass);\n                    }\n                },\n\n                _lastScrollPosition: {\n                    get: function () {\n                        return this._lastScrollPositionValue;\n                    },\n                    set: function (position) {\n                        if (position === 0) {\n                            this._lastDirection = \"right\";\n                            this._direction = \"right\";\n                            this._lastScrollPositionValue = 0;\n                        } else {\n                            var currentDirection = position < this._lastScrollPositionValue ? \"left\" : \"right\";\n                            this._direction = this._scrollDirection(position);\n                            this._lastDirection = currentDirection;\n                            this._lastScrollPositionValue = position;\n                        }\n                    }\n                },\n\n                _hasHeaderOrFooter: {\n                    get: function () {\n                        return !!(this._header || this._footer);\n                    }\n                },\n\n                _getHeaderOrFooterFromElement: function (element) {\n                    if (this._header && this._header.contains(element)) {\n                        return this._header;\n                    } else if (this._footer && this._footer.contains(element)) {\n                        return this._footer;\n                    }\n\n                    return null;\n                },\n\n                _supportsGroupHeaderKeyboarding: {\n                    get: function () {\n                        return this._groupDataSource;\n                    }\n                },\n\n                _viewportScrollPosition: {\n                    get: function () {\n                        this._currentScrollPosition = _ElementUtilities.getScrollPosition(this._viewport)[this._scrollProperty];\n                        return this._currentScrollPosition;\n                    },\n                    set: function (value) {\n                        var newScrollPos = {};\n                        newScrollPos[this._scrollProperty] = value;\n                        _ElementUtilities.setScrollPosition(this._viewport, newScrollPos);\n                        this._currentScrollPosition = value;\n                    }\n                },\n\n                _canvasStart: {\n                    get: function () {\n                        return this._canvasStartValue || 0;\n                    },\n                    set: function (value) {\n                        var transformX = this._horizontal() ? (this._rtl() ? -value : value) : 0,\n                            transformY = this._horizontal() ? 0 : value;\n                        if (value !== 0) {\n                            this._canvas.style[transformNames.scriptName] = \"translate( \" + transformX + \"px, \" + transformY + \"px)\";\n                        } else {\n                            this._canvas.style[transformNames.scriptName] = \"\";\n                        }\n                        this._canvasStartValue = value;\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.ListView.scrollPosition\" helpKeyword=\"WinJS.UI.ListView.scrollPosition\">\n                /// Gets or sets the position of the ListView's scrollbar.\n                /// </field>\n                scrollPosition: {\n                    get: function () {\n                        return this._viewportScrollPosition;\n                    },\n                    set: function (newPosition) {\n                        var that = this;\n                        this._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {\n                            return that._view.waitForValidScrollPosition(newPosition).then(function () {\n                                var max = that._viewport[that._scrollLength] - that._getViewportLength();\n                                newPosition = _ElementUtilities._clamp(newPosition, 0, max);\n                                var direction = (newPosition < that._lastScrollPosition) ? \"left\" : \"right\";\n                                return {\n                                    position: newPosition,\n                                    direction: direction\n                                };\n                            });\n                        }, true);\n                    }\n                },\n\n                _setRenderer: function ListView_setRenderer(newRenderer, isGroupHeaderRenderer) {\n                    var renderer;\n                    if (!newRenderer) {\n                        if (_BaseUtils.validation) {\n                            throw new _ErrorFromName(\"WinJS.UI.ListView.invalidTemplate\", _ErrorMessages.invalidTemplate);\n                        }\n                        renderer = _ItemsManager.trivialHtmlRenderer;\n                    } else if (typeof newRenderer === \"function\") {\n                        renderer = newRenderer;\n                    } else if (typeof newRenderer === \"object\") {\n                        if (_BaseUtils.validation && !newRenderer.renderItem) {\n                            throw new _ErrorFromName(\"WinJS.UI.ListView.invalidTemplate\", _ErrorMessages.invalidTemplate);\n                        }\n                        renderer = newRenderer.renderItem;\n                    }\n\n                    if (renderer) {\n                        if (isGroupHeaderRenderer) {\n                            this._groupHeaderRenderer = renderer;\n                        } else {\n                            this._itemRenderer = renderer;\n                        }\n                    }\n                },\n\n                _renderWithoutReuse: function ListView_renderWithoutReuse(itemPromise, oldElement) {\n                    if (oldElement) {\n                        _Dispose._disposeElement(oldElement);\n                    }\n                    var templateResult = this._itemRenderer(itemPromise);\n                    if (templateResult.then) {\n                        return templateResult.then(function (element) {\n                            element.tabIndex = 0;\n                            return element;\n                        });\n                    } else {\n                        var element = templateResult.element || templateResult;\n                        element.tabIndex = 0;\n                        return templateResult;\n                    }\n                },\n\n                _isInsertedItem: function ListView_isInsertedItem(itemPromise) {\n                    return !!this._insertedItems[itemPromise.handle];\n                },\n\n                _clearInsertedItems: function ListView_clearInsertedItems() {\n                    var keys = Object.keys(this._insertedItems);\n                    for (var i = 0, len = keys.length; i < len; i++) {\n                        this._insertedItems[keys[i]].release();\n                    }\n                    this._insertedItems = {};\n                    this._modifiedElements = [];\n                    this._countDifference = 0;\n                },\n\n                // Private methods\n                _cancelAsyncViewWork: function (stopTreeCreation) {\n                    this._view.stopWork(stopTreeCreation);\n                },\n\n                _updateView: function ListView_updateView() {\n                    if (this._isZombie()) { return; }\n\n                    var that = this;\n                    function resetCache() {\n                        that._itemsBlockExtent = -1;\n                        that._firstItemRange = null;\n                        that._firstHeaderRange = null;\n                        that._itemMargins = null;\n                        that._headerMargins = null;\n                        that._canvasMargins = null;\n                        that._cachedRTL = null;\n                        // Retrieve the values before DOM modifications occur\n                        that._rtl();\n                    }\n\n                    var viewChange = this._viewChange;\n                    this._viewChange = _Constants._ViewChange.realize;\n\n                    function functorWrapper() {\n                        that._scrollToPriority = _Constants._ScrollToPriority.uninitialized;\n                        var setScrollbarPosition = that._setScrollbarPosition;\n                        that._setScrollbarPosition = false;\n\n                        var position = typeof that._scrollToFunctor === \"number\" ? { position: that._scrollToFunctor } : that._scrollToFunctor();\n                        return Promise.as(position).then(\n                            function (scroll) {\n                                scroll = scroll || {};\n                                if (setScrollbarPosition && +scroll.position === scroll.position) {\n                                    that._lastScrollPosition = scroll.position;\n                                    that._viewportScrollPosition = scroll.position;\n                                }\n                                return scroll;\n                            },\n                            function (error) {\n                                that._setScrollbarPosition |= setScrollbarPosition;\n                                return Promise.wrapError(error);\n                            }\n                        );\n                    }\n\n                    if (viewChange === _Constants._ViewChange.rebuild) {\n                        if (this._pendingGroupWork) {\n                            this._updateGroupWork();\n                        }\n                        if (this._pendingLayoutReset) {\n                            this._resetLayout();\n                        }\n                        resetCache();\n                        if (!this._firstTimeDisplayed) {\n                            this._view.reset();\n                        }\n                        this._view.reload(functorWrapper, true);\n                        this._setFocusOnItem(this._selection._getFocused());\n                        this._headerFooterVisibilityStatus = { headerVisible: false, footerVisible: false };\n                    } else if (viewChange === _Constants._ViewChange.remeasure) {\n                        this._view.resetItems(true);\n                        this._resetLayout();\n                        resetCache();\n                        this._view.refresh(functorWrapper);\n                        this._setFocusOnItem(this._selection._getFocused());\n                        this._headerFooterVisibilityStatus = { headerVisible: false, footerVisible: false };\n                    } else if (viewChange === _Constants._ViewChange.relayout) {\n                        if (this._pendingLayoutReset) {\n                            this._resetLayout();\n                            resetCache();\n                        }\n                        this._view.refresh(functorWrapper);\n                    } else {\n                        this._view.onScroll(functorWrapper);\n                        this._raiseHeaderFooterVisibilityEvent();\n                    }\n                },\n\n                _batchViewUpdates: function ListView_batchViewUpdates(viewChange, scrollToPriority, positionFunctor, setScrollbarPosition, skipFadeout) {\n                    this._viewChange = Math.min(this._viewChange, viewChange);\n\n                    if (this._scrollToFunctor === null || scrollToPriority >= this._scrollToPriority) {\n                        this._scrollToPriority = scrollToPriority;\n                        this._scrollToFunctor = positionFunctor;\n                    }\n\n                    this._setScrollbarPosition |= !!setScrollbarPosition;\n\n                    if (!this._batchingViewUpdates) {\n                        this._raiseViewLoading();\n\n                        var that = this;\n                        this._batchingViewUpdatesSignal = new _Signal();\n                        this._batchingViewUpdates = Promise.any([this._batchingViewUpdatesSignal.promise, Scheduler.schedulePromiseHigh(null, \"WinJS.UI.ListView._updateView\")]).then(function () {\n                            if (that._isZombie()) { return; }\n\n                            // If we're displaying for the first time, or there were no items visible in the view, we can skip the fade out animation\n                            // and go straight to the refresh. _view.items._itemData.length is the most trustworthy way to find how many items are visible.\n                            if (that._viewChange === _Constants._ViewChange.rebuild && !that._firstTimeDisplayed && Object.keys(that._view.items._itemData).length !== 0 && !skipFadeout) {\n                                return that._fadeOutViewport();\n                            }\n                        }).then(\n                            function () {\n                                that._batchingViewUpdates = null;\n                                that._batchingViewUpdatesSignal = null;\n                                that._updateView();\n                                that._firstTimeDisplayed = false;\n                            },\n                            function () {\n                                that._batchingViewUpdates = null;\n                                that._batchingViewUpdatesSignal = null;\n                            }\n                        );\n                    }\n\n                    return this._batchingViewUpdatesSignal;\n                },\n\n                _resetCanvas: function () {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // Layouts do not currently support saving the scroll position when forceLayout() is called.\n                    // Layouts need to recreate the canvas because the tabManager is there and you don't want to\n                    // construct 2 instances of WinJS.UI.TabContainer for the same element.\n                    var newCanvas = _Global.document.createElement('div');\n                    newCanvas.className = this._canvas.className;\n                    this._viewport.replaceChild(newCanvas, this._canvas);\n                    this._canvas = newCanvas;\n                    this._groupsToRemove = {};\n                    // We reset the itemCanvas on _resetCanvas in case a ListView client uses two separate custom layouts, and each layout\n                    // changes different styles on the itemCanvas without resetting it.\n                    this._canvas.appendChild(this._canvasProxy);\n                },\n\n                _setupInternalTree: function ListView_setupInternalTree() {\n                    _ElementUtilities.addClass(this._element, _Constants._listViewClass);\n                    _ElementUtilities[this._rtl() ? \"addClass\" : \"removeClass\"](this._element, _Constants._rtlListViewClass);\n\n                    this._element.innerHTML =\n                        '<div tabIndex=\"-1\" role=\"group\" class=\"' + _Constants._viewportClass + ' ' + _Constants._horizontalClass + '\">' +\n                            '<div></div>' +\n                            '<div class=\"' + _Constants._scrollableClass + '\">' +\n                                // Create a proxy element inside the canvas so that during an MSPointerDown event we can call\n                                // msSetPointerCapture on it. This allows hover to not be passed to it which saves a large invalidation.\n                                '<div class=\"' + _Constants._proxyClass + '\"></div>' +\n                            '</div>' +\n                            '<div></div>' +\n                            '<div></div>' +\n                        '</div>' +\n                        // The keyboard event helper is a dummy node that allows us to keep getting keyboard events when a virtualized element\n                        // gets discarded. It has to be positioned in the center of the viewport, though, otherwise calling .focus() on it\n                        // can move our viewport around when we don't want it moved.\n                        // The keyboard event helper element will be skipped in the tab order if it doesn't have width+height set on it.\n                       '<div aria-hidden=\"true\" style=\"position:absolute;left:50%;top:50%;width:0px;height:0px;\" tabindex=\"-1\"></div>';\n\n                    this._viewport = this._element.firstElementChild;\n                    this._headerContainer = this._viewport.firstElementChild;\n                    _ElementUtilities.addClass(this._headerContainer, _Constants._listHeaderContainerClass);\n                    this._canvas = this._headerContainer.nextElementSibling;\n                    this._footerContainer = this._canvas.nextElementSibling;\n                    _ElementUtilities.addClass(this._footerContainer, _Constants._listFooterContainerClass);\n                    this._canvasProxy = this._canvas.firstElementChild;\n                    // The deleteWrapper div is used to maintain the scroll width (after delete(s)) until the animation is done\n                    this._deleteWrapper = this._canvas.nextElementSibling;\n                    this._keyboardEventsHelper = this._viewport.nextElementSibling;\n                    this._tabIndex = _ElementUtilities.getTabIndex(this._element);\n                    if (this._tabIndex < 0) {\n                        this._tabIndex = 0;\n                    }\n                    this._tabManager = new _TabContainer.TabContainer(this._viewport);\n                    this._tabManager.tabIndex = this._tabIndex;\n\n                    this._progressBar = _Global.document.createElement(\"progress\");\n                    _ElementUtilities.addClass(this._progressBar, _Constants._progressClass);\n                    _ElementUtilities.addClass(this._progressBar, \"win-progress-ring\");\n                    this._progressBar.style.position = \"absolute\";\n                    this._progressBar.max = 100;\n                },\n\n                _unsetFocusOnItem: function ListView_unsetFocusOnItem(newFocusExists) {\n                    if (this._tabManager.childFocus) {\n                        this._clearFocusRectangle(this._tabManager.childFocus);\n                    }\n                    if (this._isZombie()) {\n                        return;\n                    }\n                    if (!newFocusExists) {\n                        // _setFocusOnItem may run asynchronously so prepare the keyboardEventsHelper\n                        // to receive focus.\n                        if (this._tabManager.childFocus) {\n                            this._tabManager.childFocus = null;\n                        }\n\n                        this._keyboardEventsHelper._shouldHaveFocus = false;\n                        // If the viewport has focus, leave it there. This will prevent focus from jumping\n                        // from the viewport to the keyboardEventsHelper when scrolling with Narrator Touch.\n                        if (_Global.document.activeElement !== this._viewport && this._hasKeyboardFocus) {\n                            this._keyboardEventsHelper._shouldHaveFocus = true;\n                            _ElementUtilities._setActive(this._keyboardEventsHelper);\n                        }\n                    }\n                    this._itemFocused = false;\n                },\n\n                _setFocusOnItem: function ListView_setFocusOnItem(entity) {\n                    this._writeProfilerMark(\"_setFocusOnItem,info\");\n                    if (this._focusRequest) {\n                        this._focusRequest.cancel();\n                    }\n                    if (this._isZombie()) {\n                        return;\n                    }\n                    var that = this;\n                    var setFocusOnItemImpl = function (item) {\n                        if (that._isZombie()) {\n                            return;\n                        }\n\n                        if (that._tabManager.childFocus !== item) {\n                            that._tabManager.childFocus = item;\n                        }\n                        that._focusRequest = null;\n                        if (that._hasKeyboardFocus && !that._itemFocused) {\n                            if (that._selection._keyboardFocused()) {\n                                that._drawFocusRectangle(item);\n                            }\n                            // The requestItem promise just completed so _cachedCount will\n                            // be initialized.\n                            if (entity.type === _UI.ObjectType.groupHeader || entity.type === _UI.ObjectType.item) {\n                                that._view.updateAriaForAnnouncement(item, (entity.type === _UI.ObjectType.groupHeader ? that._groups.length() : that._cachedCount));\n                            }\n\n                            // Some consumers of ListView listen for item invoked events and hide the listview when an item is clicked.\n                            // Since keyboard interactions rely on async operations, sometimes an invoke event can be received before we get\n                            // to WinJS.Utilities._setActive(item), and the listview will be made invisible. If that happens and we call item.setActive(), an exception\n                            // is raised for trying to focus on an invisible item. Checking visibility is non-trivial, so it's best\n                            // just to catch the exception and ignore it.\n                            that._itemFocused = true;\n                            _ElementUtilities._setActive(item);\n                        }\n                    };\n\n                    if (entity.type === _UI.ObjectType.item) {\n                        this._focusRequest = this._view.items.requestItem(entity.index);\n                    } else if (entity.type === _UI.ObjectType.groupHeader) {\n                        this._focusRequest = this._groups.requestHeader(entity.index);\n                    } else {\n                        this._focusRequest = Promise.wrap(entity.type === _UI.ObjectType.header ? this._header : this._footer);\n                    }\n                    this._focusRequest.then(setFocusOnItemImpl);\n                },\n\n                _attachEvents: function ListView_attachEvents() {\n                    var that = this;\n\n                    function listViewHandler(eventName, caseSensitive, capture) {\n                        return {\n                            name: (caseSensitive ? eventName : eventName.toLowerCase()),\n                            handler: function (eventObject) {\n                                that[\"_on\" + eventName](eventObject);\n                            },\n                            capture: capture\n                        };\n                    }\n\n                    function modeHandler(eventName, caseSensitive, capture) {\n                        return {\n                            capture: capture,\n                            name: (caseSensitive ? eventName : eventName.toLowerCase()),\n                            handler: function (eventObject) {\n                                var currentMode = that._mode,\n                                    name = \"on\" + eventName;\n                                if (!that._disposed && currentMode[name]) {\n                                    currentMode[name](eventObject);\n                                }\n                            }\n                        };\n                    }\n\n                    function observerHandler(handlerName, attributesFilter) {\n                        return {\n                            handler: function (listOfChanges) {\n                                that[\"_on\" + handlerName](listOfChanges);\n                            },\n                            filter: attributesFilter\n                        };\n                    }\n\n                    // Observers for specific element attribute changes\n                    var elementObservers = [\n                        observerHandler(\"PropertyChange\", [\"dir\", \"style\", \"tabindex\"])\n                    ];\n                    this._cachedStyleDir = this._element.style.direction;\n\n                    elementObservers.forEach(function (elementObserver) {\n                        new _ElementUtilities._MutationObserver(elementObserver.handler).observe(that._element, { attributes: true, attributeFilter: elementObserver.filter });\n                    });\n\n                    // KeyDown handler needs to be added explicitly via addEventListener instead of using attachEvent.\n                    // If it's not added via addEventListener, the eventObject given to us on event does not have the functions stopPropagation() and preventDefault().\n                    var events = [\n                        modeHandler(\"PointerDown\"),\n                        modeHandler(\"click\", false),\n                        modeHandler(\"PointerUp\"),\n                        modeHandler(\"LostPointerCapture\"),\n                        modeHandler(\"MSHoldVisual\", true),\n                        modeHandler(\"PointerCancel\", true),\n                        modeHandler(\"DragStart\"),\n                        modeHandler(\"DragOver\"),\n                        modeHandler(\"DragEnter\"),\n                        modeHandler(\"DragLeave\"),\n                        modeHandler(\"Drop\"),\n                        modeHandler(\"ContextMenu\")\n                    ];\n                    events.forEach(function (eventHandler) {\n                        _ElementUtilities._addEventListener(that._viewport, eventHandler.name, eventHandler.handler, !!eventHandler.capture);\n                    });\n\n                    var elementEvents = [\n                        listViewHandler(\"FocusIn\", false, false),\n                        listViewHandler(\"FocusOut\", false, false),\n                        modeHandler(\"KeyDown\"),\n                        modeHandler(\"KeyUp\"),\n                        listViewHandler(\"MSElementResize\", false, false)\n                    ];\n                    elementEvents.forEach(function (eventHandler) {\n                        _ElementUtilities._addEventListener(that._element, eventHandler.name, eventHandler.handler, !!eventHandler.capture);\n                    });\n                    this._onMSElementResizeBound = this._onMSElementResize.bind(this);\n                    _ElementUtilities._resizeNotifier.subscribe(this._element, this._onMSElementResizeBound);\n\n                    var initiallyParented = _Global.document.body.contains(this._element);\n                    _ElementUtilities._addInsertedNotifier(this._element);\n                    this._element.addEventListener(\"WinJSNodeInserted\", function (event) {\n                        // WinJSNodeInserted fires even if the element is already in the DOM\n                        if (initiallyParented) {\n                            initiallyParented = false;\n                            return;\n                        }\n                        that._onMSElementResizeBound(event);\n                    }, false);\n\n                    var viewportEvents = [\n                        listViewHandler(\"MSManipulationStateChanged\", true),\n                        listViewHandler(\"Scroll\")\n                    ];\n                    viewportEvents.forEach(function (viewportEvent) {\n                        that._viewport.addEventListener(viewportEvent.name, viewportEvent.handler, false);\n                    });\n                    this._viewport.addEventListener(\"onTabEnter\", this._onTabEnter.bind(this));\n                    this._viewport.addEventListener(\"onTabExit\", this._onTabExit.bind(this));\n                    this._viewport.addEventListener(\"onTabEntered\", function (e) {\n                        that._mode.onTabEntered(e);\n                    });\n                    this._viewport.addEventListener(\"onTabExiting\", function (e) {\n                        that._mode.onTabExiting(e);\n                    });\n                },\n\n                _updateItemsManager: function ListView_updateItemsManager() {\n                    var that = this,\n                        notificationHandler = {\n                            // Following methods are used by ItemsManager\n                            beginNotifications: function ListView_beginNotifications() {\n                            },\n\n                            changed: function ListView_changed(newItem, oldItem) {\n                                if (that._ifZombieDispose()) { return; }\n\n                                that._createUpdater();\n\n                                var elementInfo = that._updater.elements[uniqueID(oldItem)];\n                                if (elementInfo) {\n                                    var selected = that.selection._isIncluded(elementInfo.index);\n                                    if (selected) {\n                                        that._updater.updateDrag = true;\n                                    }\n\n                                    if (oldItem !== newItem) {\n                                        if (that._tabManager.childFocus === oldItem || that._updater.newFocusedItem === oldItem) {\n                                            that._updater.newFocusedItem = newItem;\n                                            that._tabManager.childFocus = null;\n                                        }\n\n                                        if (elementInfo.itemBox) {\n                                            _ElementUtilities.addClass(newItem, _Constants._itemClass);\n                                            that._setupAriaSelectionObserver(newItem);\n\n                                            var next = oldItem.nextElementSibling;\n                                            elementInfo.itemBox.removeChild(oldItem);\n                                            elementInfo.itemBox.insertBefore(newItem, next);\n                                        }\n\n                                        that._setAriaSelected(newItem, selected);\n                                        that._view.items.setItemAt(elementInfo.newIndex, {\n                                            element: newItem,\n                                            itemBox: elementInfo.itemBox,\n                                            container: elementInfo.container,\n                                            itemsManagerRecord: elementInfo.itemsManagerRecord\n                                        });\n                                        delete that._updater.elements[uniqueID(oldItem)];\n                                        _Dispose._disposeElement(oldItem);\n                                        that._updater.elements[uniqueID(newItem)] = {\n                                            item: newItem,\n                                            container: elementInfo.container,\n                                            itemBox: elementInfo.itemBox,\n                                            index: elementInfo.index,\n                                            newIndex: elementInfo.newIndex,\n                                            itemsManagerRecord: elementInfo.itemsManagerRecord\n                                        };\n                                    } else if (elementInfo.itemBox && elementInfo.container) {\n                                        _ItemEventsHandler._ItemEventsHandler.renderSelection(elementInfo.itemBox, newItem, selected, true);\n                                        _ElementUtilities[selected ? \"addClass\" : \"removeClass\"](elementInfo.container, _Constants._selectedClass);\n                                    }\n                                    that._updater.changed = true;\n                                }\n                                for (var i = 0, len = that._notificationHandlers.length; i < len; i++) {\n                                    that._notificationHandlers[i].changed(newItem, oldItem);\n                                }\n                                that._writeProfilerMark(\"changed,info\");\n                            },\n\n                            removed: function ListView_removed(item, mirage, handle) {\n                                if (that._ifZombieDispose()) { return; }\n\n                                that._createUpdater();\n\n                                function removeFromSelection(index) {\n                                    that._updater.updateDrag = true;\n                                    if (that._currentMode()._dragging && that._currentMode()._draggingUnselectedItem && that._currentMode()._dragInfo._isIncluded(index)) {\n                                        that._updater.newDragInfo = new _SelectionManager._Selection(that, []);\n                                    }\n\n                                    var firstRange = that._updater.selectionFirst[index],\n                                        lastRange = that._updater.selectionLast[index],\n                                        range = firstRange || lastRange;\n\n                                    if (range) {\n                                        delete that._updater.selectionFirst[range.oldFirstIndex];\n                                        delete that._updater.selectionLast[range.oldLastIndex];\n                                        that._updater.selectionChanged = true;\n                                    }\n                                }\n\n                                var insertedItem = that._insertedItems[handle];\n                                if (insertedItem) {\n                                    delete that._insertedItems[handle];\n                                }\n\n                                var index;\n                                if (item) {\n                                    var elementInfo = that._updater.elements[uniqueID(item)],\n                                        itemObject = that._itemsManager.itemObject(item);\n\n                                    if (itemObject) {\n                                        that._groupFocusCache.deleteItem(itemObject.key);\n                                    }\n\n                                    if (elementInfo) {\n                                        index = elementInfo.index;\n\n                                        // We track removed elements for animation purposes (layout\n                                        // component consumes this).\n                                        //\n                                        if (elementInfo.itemBox) {\n                                            var itemBox = elementInfo.itemBox,\n                                                oddStripe = _Constants._containerOddClass,\n                                                evenStripe = _Constants._containerEvenClass,\n                                                // Store the even/odd container class from the container the itemBox was in before being removed.\n                                                // We want to reapply that class on whichever container we use to perform the itemBox's exit animation.\n                                                containerStripe = _ElementUtilities.hasClass(itemBox.parentElement, evenStripe) ? evenStripe : oddStripe;\n\n                                            that._updater.removed.push({\n                                                index: index,\n                                                itemBox: itemBox,\n                                                containerStripe: containerStripe,\n                                            });\n                                        }\n                                        that._updater.deletesCount++;\n\n                                        // The view can't access the data from the itemsManager\n                                        // anymore, so we need to flag the itemData that it\n                                        // has been removed.\n                                        //\n                                        var itemData = that._view.items.itemDataAt(index);\n                                        itemData.removed = true;\n\n                                        delete that._updater.elements[uniqueID(item)];\n                                    } else {\n                                        index = itemObject && itemObject.index;\n                                    }\n\n                                    if (that._updater.oldFocus.type !== _UI.ObjectType.groupHeader && that._updater.oldFocus.index === index) {\n                                        that._updater.newFocus.index = index; // If index is too high, it'll be fixed in endNotifications\n                                        that._updater.focusedItemRemoved = true;\n                                    }\n\n                                    removeFromSelection(index);\n                                } else {\n                                    index = that._updater.selectionHandles[handle];\n                                    if (index === +index) {\n                                        removeFromSelection(index);\n                                    }\n                                }\n                                that._writeProfilerMark(\"removed(\" + index + \"),info\");\n\n                                that._updater.changed = true;\n                            },\n\n                            updateAffectedRange: function ListView_updateAffectedRange(newerRange) {\n                                that._itemsCount().then(function (count) {\n                                    // When we receive insertion notifications before all of the containers have\n                                    // been created and the affected range is beyond the container range, the\n                                    // affected range indices will not correspond to the indices of the containers\n                                    // created by updateContainers. In this case, start the affected range at the end\n                                    // of the containers so that the affected range includes any containers that get\n                                    // appended due to this batch of notifications.\n                                    var containerCount = that._view.containers ? that._view.containers.length : 0;\n                                    newerRange.start = Math.min(newerRange.start, containerCount);\n\n                                    that._affectedRange.add(newerRange, count);\n                                });\n                                that._createUpdater();\n                                that._updater.changed = true;\n                            },\n\n                            indexChanged: function ListView_indexChanged(item, newIndex, oldIndex) {\n                                // We should receive at most one indexChanged notification per oldIndex\n                                // per notification cycle.\n                                if (that._ifZombieDispose()) { return; }\n\n                                that._createUpdater();\n\n                                if (item) {\n                                    var itemObject = that._itemsManager.itemObject(item);\n                                    if (itemObject) {\n                                        that._groupFocusCache.updateItemIndex(itemObject.key, newIndex);\n                                    }\n\n                                    var elementInfo = that._updater.elements[uniqueID(item)];\n                                    if (elementInfo) {\n                                        elementInfo.newIndex = newIndex;\n                                        that._updater.changed = true;\n                                    }\n                                    that._updater.itemsMoved = true;\n                                }\n                                if (that._currentMode()._dragging && that._currentMode()._draggingUnselectedItem && that._currentMode()._dragInfo._isIncluded(oldIndex)) {\n                                    that._updater.newDragInfo = new _SelectionManager._Selection(that, [{ firstIndex: newIndex, lastIndex: newIndex }]);\n                                    that._updater.updateDrag = true;\n                                }\n\n                                if (that._updater.oldFocus.type !== _UI.ObjectType.groupHeader && that._updater.oldFocus.index === oldIndex) {\n                                    that._updater.newFocus.index = newIndex;\n                                    that._updater.changed = true;\n                                }\n\n                                if (that._updater.oldSelectionPivot === oldIndex) {\n                                    that._updater.newSelectionPivot = newIndex;\n                                    that._updater.changed = true;\n                                }\n\n                                var range = that._updater.selectionFirst[oldIndex];\n                                if (range) {\n                                    range.newFirstIndex = newIndex;\n                                    that._updater.changed = true;\n                                    that._updater.selectionChanged = true;\n                                    that._updater.updateDrag = true;\n                                }\n                                range = that._updater.selectionLast[oldIndex];\n                                if (range) {\n                                    range.newLastIndex = newIndex;\n                                    that._updater.changed = true;\n                                    that._updater.selectionChanged = true;\n                                    that._updater.updateDrag = true;\n                                }\n                            },\n\n                            endNotifications: function ListView_endNotifications() {\n                                that._update();\n                            },\n\n                            inserted: function ListView_inserted(itemPromise) {\n                                if (that._ifZombieDispose()) { return; }\n                                that._writeProfilerMark(\"inserted,info\");\n\n                                that._createUpdater();\n                                that._updater.changed = true;\n                                itemPromise.retain();\n                                that._updater.insertsCount++;\n                                that._insertedItems[itemPromise.handle] = itemPromise;\n                            },\n\n                            moved: function ListView_moved(item, previous, next, itemPromise) {\n                                if (that._ifZombieDispose()) { return; }\n\n                                that._createUpdater();\n\n                                that._updater.movesCount++;\n                                if (item) {\n                                    that._updater.itemsMoved = true;\n\n                                    var elementInfo = that._updater.elements[uniqueID(item)];\n                                    if (elementInfo) {\n                                        elementInfo.moved = true;\n                                    }\n                                }\n\n                                var index = that._updater.selectionHandles[itemPromise.handle];\n                                if (index === +index) {\n                                    that._updater.updateDrag = true;\n                                    that._updater.selectionChanged = true;\n\n                                    var firstRange = that._updater.selectionFirst[index],\n                                        lastRange = that._updater.selectionLast[index],\n                                        range = firstRange || lastRange;\n\n                                    if (range && range.oldFirstIndex !== range.oldLastIndex) {\n                                        delete that._updater.selectionFirst[range.oldFirstIndex];\n                                        delete that._updater.selectionLast[range.oldLastIndex];\n                                        that._updater.changed = true;\n                                    }\n                                }\n                                that._writeProfilerMark(\"moved(\" + index + \"),info\");\n                            },\n\n                            countChanged: function ListView_countChanged(newCount, oldCount) {\n                                if (that._ifZombieDispose()) { return; }\n                                that._writeProfilerMark(\"countChanged(\" + newCount + \"),info\");\n\n                                that._cachedCount = newCount;\n                                that._createUpdater();\n\n                                if ((that._view.lastIndexDisplayed + 1) === oldCount) {\n                                    that._updater.changed = true;\n                                }\n\n                                that._updater.countDifference += newCount - oldCount;\n                            },\n\n                            reload: function ListView_reload() {\n                                if (that._ifZombieDispose()) {\n                                    return;\n                                }\n                                that._writeProfilerMark(\"reload,info\");\n\n                                that._processReload();\n                            }\n                        };\n\n                    function statusChanged(eventObject) {\n                        if (eventObject.detail === _UI.DataSourceStatus.failure) {\n                            that.itemDataSource = null;\n                            that.groupDataSource = null;\n                        }\n                    }\n\n                    if (this._versionManager) {\n                        this._versionManager._dispose();\n                    }\n\n                    this._versionManager = new _VersionManager._VersionManager();\n                    this._updater = null;\n\n                    var ranges = this._selection.getRanges();\n                    this._selection._selected.clear();\n\n                    if (this._itemsManager) {\n\n                        if (this._itemsManager.dataSource && this._itemsManager.dataSource.removeEventListener) {\n                            this._itemsManager.dataSource.removeEventListener(\"statuschanged\", statusChanged, false);\n                        }\n\n                        this._clearInsertedItems();\n                        this._itemsManager.release();\n                    }\n\n                    if (this._itemsCountPromise) {\n                        this._itemsCountPromise.cancel();\n                        this._itemsCountPromise = null;\n                    }\n                    this._cachedCount = _Constants._UNINITIALIZED;\n\n                    this._itemsManager = _ItemsManager._createItemsManager(\n                        this._dataSource,\n                        this._renderWithoutReuse.bind(this),\n                        notificationHandler,\n                        {\n                            ownerElement: this._element,\n                            versionManager: this._versionManager,\n                            indexInView: function (index) {\n                                return (index >= that.indexOfFirstVisible && index <= that.indexOfLastVisible);\n                            },\n                            viewCallsReady: true,\n                            profilerId: this._id\n                        });\n\n                    if (this._dataSource.addEventListener) {\n                        this._dataSource.addEventListener(\"statuschanged\", statusChanged, false);\n                    }\n\n                    this._selection._selected.set(ranges);\n                },\n\n                _processReload: function () {\n                    this._affectedRange.addAll();\n\n                    // Inform scroll view that a realization pass is coming so that it doesn't restart the\n                    // realization pass itself.\n                    this._cancelAsyncViewWork(true);\n                    if (this._currentMode()._dragging) {\n                        this._currentMode()._clearDragProperties();\n                    }\n\n                    this._groupFocusCache.clear();\n                    this._selection._reset();\n                    this._updateItemsManager();\n                    this._pendingLayoutReset = true;\n                    this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.low, this.scrollPosition);\n                },\n\n                _createUpdater: function ListView_createUpdater() {\n                    if (!this._updater) {\n                        if (this.itemDataSource._isVirtualizedDataSource) {\n                            // VDS doesn't support the _updateAffectedRange notification so assume\n                            // that everything needs to be relaid out.\n                            this._affectedRange.addAll();\n                        }\n                        this._versionManager.beginUpdating();\n\n                        // Inform scroll view that a realization pass is coming so that it doesn't restart the\n                        // realization pass itself.\n                        this._cancelAsyncViewWork();\n\n                        var updater = {\n                            changed: false,\n                            elements: {},\n                            selectionFirst: {},\n                            selectionLast: {},\n                            selectionHandles: {},\n                            oldSelectionPivot: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },\n                            newSelectionPivot: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },\n                            removed: [],\n                            selectionChanged: false,\n                            oldFocus: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },\n                            newFocus: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },\n                            hadKeyboardFocus: this._hasKeyboardFocus,\n                            itemsMoved: false,\n                            lastVisible: this.indexOfLastVisible,\n                            updateDrag: false,\n                            movesCount: 0,\n                            insertsCount: 0,\n                            deletesCount: 0,\n                            countDifference: 0\n                        };\n\n                        this._view.items.each(function (index, item, itemData) {\n                            updater.elements[uniqueID(item)] = {\n                                item: item,\n                                container: itemData.container,\n                                itemBox: itemData.itemBox,\n                                index: index,\n                                newIndex: index,\n                                itemsManagerRecord: itemData.itemsManagerRecord,\n                                detached: itemData.detached\n                            };\n                        });\n\n                        var selection = this._selection._selected._ranges;\n                        for (var i = 0, len = selection.length; i < len; i++) {\n                            var range = selection[i];\n                            var newRange = {\n                                newFirstIndex: selection[i].firstIndex,\n                                oldFirstIndex: selection[i].firstIndex,\n                                newLastIndex: selection[i].lastIndex,\n                                oldLastIndex: selection[i].lastIndex\n                            };\n                            updater.selectionFirst[newRange.oldFirstIndex] = newRange;\n                            updater.selectionLast[newRange.oldLastIndex] = newRange;\n                            updater.selectionHandles[range.firstPromise.handle] = newRange.oldFirstIndex;\n                            updater.selectionHandles[range.lastPromise.handle] = newRange.oldLastIndex;\n                        }\n                        updater.oldSelectionPivot = this._selection._pivot;\n                        updater.newSelectionPivot = updater.oldSelectionPivot;\n                        updater.oldFocus = this._selection._getFocused();\n                        updater.newFocus = this._selection._getFocused();\n\n                        this._updater = updater;\n                    }\n                },\n\n                _synchronize: function ListView_synchronize() {\n                    var updater = this._updater;\n                    this._updater = null;\n                    this._groupsChanged = false;\n\n                    this._countDifference = this._countDifference || 0;\n\n                    if (updater && updater.changed) {\n                        if (updater.itemsMoved) {\n                            this._layout.itemsMoved && this._layout.itemsMoved();\n                        }\n                        if (updater.removed.length) {\n                            this._layout.itemsRemoved && this._layout.itemsRemoved(updater.removed.map(function (node) {\n                                return node.itemBox;\n                            }));\n                        }\n\n                        if (updater.itemsMoved || updater.removed.length || Object.keys(this._insertedItems).length) {\n                            this._layout.setupAnimations && this._layout.setupAnimations();\n                        }\n\n                        if (this._currentMode().onDataChanged) {\n                            this._currentMode().onDataChanged();\n                        }\n\n                        var newSelection = [];\n                        for (var i in updater.selectionFirst) {\n                            if (updater.selectionFirst.hasOwnProperty(i)) {\n                                var range = updater.selectionFirst[i];\n                                updater.selectionChanged = updater.selectionChanged || ((range.newLastIndex - range.newFirstIndex) !== (range.oldLastIndex - range.oldFirstIndex));\n                                if (range.newFirstIndex <= range.newLastIndex) {\n                                    newSelection.push({\n                                        firstIndex: range.newFirstIndex,\n                                        lastIndex: range.newLastIndex\n                                    });\n                                }\n                            }\n                        }\n\n                        if (updater.selectionChanged) {\n                            var newSelectionItems = new _SelectionManager._Selection(this, newSelection);\n\n                            // We do not allow listeners to cancel the selection\n                            // change because the cancellation would also have to\n                            // prevent the deletion.\n                            this._selection._fireSelectionChanging(newSelectionItems);\n                            this._selection._selected.set(newSelection);\n                            this._selection._fireSelectionChanged();\n                            newSelectionItems.clear();\n                        } else {\n                            this._selection._selected.set(newSelection);\n                        }\n                        this._selection._updateCount(this._cachedCount);\n                        updater.newSelectionPivot = Math.min(this._cachedCount - 1, updater.newSelectionPivot);\n                        this._selection._pivot = (updater.newSelectionPivot >= 0 ? updater.newSelectionPivot : _Constants._INVALID_INDEX);\n\n                        if (updater.newFocus.type !== _UI.ObjectType.groupHeader) {\n                            updater.newFocus.index = Math.max(0, Math.min(this._cachedCount - 1, updater.newFocus.index));\n                        }\n                        this._selection._setFocused(updater.newFocus, this._selection._keyboardFocused());\n\n                        // If there are 2 edits before layoutAnimations runs we need to merge the 2 groups of modified elements.\n                        // For example:\n                        // If you start with A, B, C and add item Z to the beginning you will have\n                        // [ -1 -> 0, 0 -> 1, 1 -> 2, 2 -> 3]\n                        // However before layout is called an insert of Y to the beginning also happens you should get\n                        // [ -1 -> 0, -1 -> 1, 0 -> 2, 1 -> 3, 2 -> 4]\n                        var previousModifiedElements = this._modifiedElements || [];\n                        var previousModifiedElementsHash = {};\n                        this._modifiedElements = [];\n                        this._countDifference += updater.countDifference;\n\n                        for (i = 0; i < previousModifiedElements.length; i++) {\n                            var modifiedElement = previousModifiedElements[i];\n                            if (modifiedElement.newIndex === -1) {\n                                this._modifiedElements.push(modifiedElement);\n                            } else {\n                                previousModifiedElementsHash[modifiedElement.newIndex] = modifiedElement;\n                            }\n                        }\n\n                        for (i = 0; i < updater.removed.length; i++) {\n                            var removed = updater.removed[i];\n                            var modifiedElement = previousModifiedElementsHash[removed.index];\n                            if (modifiedElement) {\n                                delete previousModifiedElementsHash[removed.index];\n                            } else {\n                                modifiedElement = {\n                                    oldIndex: removed.index\n                                };\n                            }\n                            modifiedElement.newIndex = -1;\n                            if (!modifiedElement._removalHandled) {\n                                modifiedElement._itemBox = removed.itemBox;\n                                modifiedElement._containerStripe = removed.containerStripe;\n                            }\n                            this._modifiedElements.push(modifiedElement);\n                        }\n\n                        var insertedKeys = Object.keys(this._insertedItems);\n                        for (i = 0; i < insertedKeys.length; i++) {\n                            this._modifiedElements.push({\n                                oldIndex: -1,\n                                newIndex: this._insertedItems[insertedKeys[i]].index\n                            });\n                        }\n\n                        this._writeProfilerMark(\"_synchronize:update_modifiedElements,StartTM\");\n                        var newItems = {};\n                        for (i in updater.elements) {\n                            if (updater.elements.hasOwnProperty(i)) {\n                                var elementInfo = updater.elements[i];\n                                newItems[elementInfo.newIndex] = {\n                                    element: elementInfo.item,\n                                    container: elementInfo.container,\n                                    itemBox: elementInfo.itemBox,\n                                    itemsManagerRecord: elementInfo.itemsManagerRecord,\n                                    detached: elementInfo.detached\n                                };\n\n                                var modifiedElement = previousModifiedElementsHash[elementInfo.index];\n                                if (modifiedElement) {\n                                    delete previousModifiedElementsHash[elementInfo.index];\n                                    modifiedElement.newIndex = elementInfo.newIndex;\n                                } else {\n                                    modifiedElement = {\n                                        oldIndex: elementInfo.index,\n                                        newIndex: elementInfo.newIndex\n                                    };\n                                }\n                                modifiedElement.moved = elementInfo.moved;\n                                this._modifiedElements.push(modifiedElement);\n                            }\n                        }\n                        this._writeProfilerMark(\"_synchronize:update_modifiedElements,StopTM\");\n\n                        var previousIndices = Object.keys(previousModifiedElementsHash);\n                        for (i = 0; i < previousIndices.length; i++) {\n                            var key = previousIndices[i];\n                            var modifiedElement = previousModifiedElementsHash[key];\n                            if (modifiedElement.oldIndex !== -1) {\n                                this._modifiedElements.push(modifiedElement);\n                            }\n                        }\n\n                        this._view.items._itemData = newItems;\n                        if (updater.updateDrag && this._currentMode()._dragging) {\n                            if (!this._currentMode()._draggingUnselectedItem) {\n                                this._currentMode()._dragInfo = this._selection;\n                            } else if (updater.newDragInfo) {\n                                this._currentMode()._dragInfo = updater.newDragInfo;\n                            }\n                            this._currentMode().fireDragUpdateEvent();\n                        }\n\n                        // If the focused item is removed, or the item we're trying to focus on has been moved before we can focus on it,\n                        // we need to update our focus request to get the item from the appropriate index.\n                        if (updater.focusedItemRemoved || (this._focusRequest && (updater.oldFocus.index !== updater.newFocus.index) || (updater.oldFocus.type !== updater.newFocus.type))) {\n                            this._itemFocused = false;\n                            this._setFocusOnItem(this._selection._getFocused());\n                        } else if (updater.newFocusedItem) {\n                            // We need to restore the value of _hasKeyboardFocus because a changed item\n                            // gets removed from the DOM at the time of the notification. If the item\n                            // had focus at that time, then our value of _hasKeyboardFocus will have changed.\n                            this._hasKeyboardFocus = updater.hadKeyboardFocus;\n                            this._itemFocused = false;\n                            this._setFocusOnItem(this._selection._getFocused());\n                        }\n\n                        var that = this;\n                        return this._groups.synchronizeGroups().then(function () {\n                            if (updater.newFocus.type === _UI.ObjectType.groupHeader) {\n                                updater.newFocus.index = Math.min(that._groups.length() - 1, updater.newFocus.index);\n\n                                if (updater.newFocus.index < 0) {\n                                    // An empty listview has currentFocus = item 0\n                                    updater.newFocus = { type: _UI.ObjectType.item, index: 0 };\n                                }\n                                that._selection._setFocused(updater.newFocus, that._selection._keyboardFocused());\n                            }\n\n                            that._versionManager.endUpdating();\n                            if (updater.deletesCount > 0) {\n                                that._updateDeleteWrapperSize();\n                            }\n\n                            return that._view.updateTree(that._cachedCount, that._countDifference, that._modifiedElements);\n                        }).then(function () {\n                            return that._lastScrollPosition;\n                        });\n                    } else {\n                        this._countDifference += updater ? updater.countDifference : 0;\n\n                        var that = this;\n                        return this._groups.synchronizeGroups().then(function ListView_synchronizeGroups_success_groupsChanged() {\n                            updater && that._versionManager.endUpdating();\n                            return that._view.updateTree(that._cachedCount, that._countDifference, that._modifiedElements);\n                        }).then(function () {\n                            return that.scrollPosition;\n                        });\n                    }\n                },\n\n                _updateDeleteWrapperSize: function ListView_updateDeleteWrapperSize(clear) {\n                    var sizeProperty = this._horizontal() ? \"width\" : \"height\";\n                    this._deleteWrapper.style[\"min-\" + sizeProperty] = (clear ? 0 : this.scrollPosition + this._getViewportSize()[sizeProperty]) + \"px\";\n                },\n\n                _verifyRealizationNeededForChange: function ListView_skipRealization() {\n                    // If the updater indicates that only deletes occurred, and we have not lost a viewport full of items,\n                    // we skip realizing all the items and appending new ones until other action causes a full realize (e.g. scrolling).\n                    //\n                    var skipRealization = false;\n                    var totalInViewport = (this._view.lastIndexDisplayed || 0) - (this._view.firstIndexDisplayed || 0);\n                    var deletesOnly = this._updater && this._updater.movesCount === 0 && this._updater.insertsCount === 0 && this._updater.deletesCount > 0 && (this._updater.deletesCount === Math.abs(this._updater.countDifference));\n                    if (deletesOnly && this._updater.elements) {\n                        // Verify that the indices of the elements in the updater are within the valid range\n                        var elementsKeys = Object.keys(this._updater.elements);\n                        for (var i = 0, len = elementsKeys.length; i < len; i++) {\n                            var element = this._updater.elements[elementsKeys[i]];\n                            var delta = element.index - element.newIndex;\n                            if (delta < 0 || delta > this._updater.deletesCount) {\n                                deletesOnly = false;\n                                break;\n                            }\n                        }\n                    }\n                    this._view.deletesWithoutRealize = this._view.deletesWithoutRealize || 0;\n\n                    if (deletesOnly &&\n                        (this._view.lastIndexDisplayed < this._view.end - totalInViewport) &&\n                        (this._updater.deletesCount + this._view.deletesWithoutRealize) < totalInViewport) {\n\n                        skipRealization = true;\n                        this._view.deletesWithoutRealize += Math.abs(this._updater.countDifference);\n                        this._writeProfilerMark(\"skipping realization on delete,info\");\n                    } else {\n                        this._view.deletesWithoutRealize = 0;\n                    }\n                    this._view._setSkipRealizationForChange(skipRealization);\n                },\n\n                _update: function ListView_update() {\n                    this._writeProfilerMark(\"update,StartTM\");\n                    if (this._ifZombieDispose()) { return; }\n\n                    this._updateJob = null;\n\n                    var that = this;\n                    if (this._versionManager.noOutstandingNotifications) {\n                        if (this._updater || this._groupsChanged) {\n                            this._cancelAsyncViewWork();\n                            this._verifyRealizationNeededForChange();\n                            this._synchronize().then(function (scrollbarPos) {\n                                that._writeProfilerMark(\"update,StopTM\");\n                                that._batchViewUpdates(_Constants._ViewChange.relayout, _Constants._ScrollToPriority.low, scrollbarPos).complete();\n                            });\n                        } else {\n                            // Even if nothing important changed we need to restart aria work if it was canceled.\n                            this._batchViewUpdates(_Constants._ViewChange.relayout, _Constants._ScrollToPriority.low, this._lastScrollPosition).complete();\n                        }\n                    }\n                },\n\n                _scheduleUpdate: function ListView_scheduleUpdate() {\n                    if (!this._updateJob) {\n                        var that = this;\n                        // Batch calls to _scheduleUpdate\n                        this._updateJob = Scheduler.schedulePromiseHigh(null, \"WinJS.UI.ListView._update\").then(function () {\n                            if (that._updateJob) {\n                                that._update();\n                            }\n                        });\n\n                        this._raiseViewLoading();\n                    }\n                },\n\n                _createGroupsContainer: function () {\n                    if (this._groups) {\n                        this._groups.cleanUp();\n                    }\n\n                    if (this._groupDataSource) {\n                        this._groups = new _GroupsContainer._UnvirtualizedGroupsContainer(this, this._groupDataSource);\n                    } else {\n                        this._groups = new _GroupsContainer._NoGroups(this);\n                    }\n                },\n\n                _createLayoutSite: function () {\n                    var that = this;\n                    return Object.create({\n                        invalidateLayout: function () {\n                            that._pendingLayoutReset = true;\n                            var orientationChanged = (that._layout.orientation === \"horizontal\") !== that._horizontalLayout;\n                            that._affectedRange.addAll();\n                            that._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.low, orientationChanged ? 0 : that.scrollPosition, false, true);\n                        },\n                        itemFromIndex: function (itemIndex) {\n                            return that._itemsManager._itemPromiseAtIndex(itemIndex);\n                        },\n                        groupFromIndex: function (groupIndex) {\n                            if (that._groupsEnabled()) {\n                                return groupIndex < that._groups.length() ? that._groups.group(groupIndex).userData : null;\n                            } else {\n                                return { key: \"-1\" };\n                            }\n                        },\n                        groupIndexFromItemIndex: function (itemIndex) {\n                            // If itemIndex < 0, returns 0. If itemIndex is larger than the\n                            // biggest item index, returns the last group index.\n                            itemIndex = Math.max(0, itemIndex);\n                            return that._groups.groupFromItem(itemIndex);\n                        },\n                        renderItem: function (itemPromise) {\n                            return Promise._cancelBlocker(that._itemsManager._itemFromItemPromise(itemPromise)).then(function (element) {\n                                if (element) {\n                                    var record = that._itemsManager._recordFromElement(element);\n                                    if (record.pendingReady) {\n                                        record.pendingReady();\n                                    }\n\n                                    element = element.cloneNode(true);\n\n                                    _ElementUtilities.addClass(element, _Constants._itemClass);\n\n                                    var itemBox = _Global.document.createElement(\"div\");\n                                    _ElementUtilities.addClass(itemBox, _Constants._itemBoxClass);\n                                    itemBox.appendChild(element);\n\n                                    var container = _Global.document.createElement(\"div\");\n                                    _ElementUtilities.addClass(container, _Constants._containerClass);\n                                    container.appendChild(itemBox);\n\n                                    return container;\n                                } else {\n                                    return Promise.cancel;\n                                }\n                            });\n                        },\n                        renderHeader: function (group) {\n                            var rendered = _ItemsManager._normalizeRendererReturn(that.groupHeaderTemplate(Promise.wrap(group)));\n                            return rendered.then(function (headerRecord) {\n                                _ElementUtilities.addClass(headerRecord.element, _Constants._headerClass);\n                                var container = _Global.document.createElement(\"div\");\n                                _ElementUtilities.addClass(container, _Constants._headerContainerClass);\n                                container.appendChild(headerRecord.element);\n                                return container;\n                            });\n                        },\n                        readyToMeasure: function () {\n                            that._getViewportLength();\n                            that._getCanvasMargins();\n                        },\n                        _isZombie: function () {\n                            return that._isZombie();\n                        },\n                        _writeProfilerMark: function (text) {\n                            that._writeProfilerMark(text);\n                        }\n                    }, {\n                        _itemsManager: {\n                            enumerable: true,\n                            get: function () {\n                                return that._itemsManager;\n                            }\n                        },\n                        rtl: {\n                            enumerable: true,\n                            get: function () {\n                                return that._rtl();\n                            }\n                        },\n                        surface: {\n                            enumerable: true,\n                            get: function () {\n                                return that._canvas;\n                            }\n                        },\n                        viewport: {\n                            enumerable: true,\n                            get: function () {\n                                return that._viewport;\n                            }\n                        },\n                        scrollbarPos: {\n                            enumerable: true,\n                            get: function () {\n                                return that.scrollPosition;\n                            }\n                        },\n                        viewportSize: {\n                            enumerable: true,\n                            get: function () {\n                                return that._getViewportSize();\n                            }\n                        },\n                        loadingBehavior: {\n                            enumerable: true,\n                            get: function () {\n                                return that.loadingBehavior;\n                            }\n                        },\n                        animationsDisabled: {\n                            enumerable: true,\n                            get: function () {\n                                return that._animationsDisabled();\n                            }\n                        },\n                        tree: {\n                            enumerable: true,\n                            get: function () {\n                                return that._view.tree;\n                            }\n                        },\n                        realizedRange: {\n                            enumerable: true,\n                            get: function () {\n                                return {\n                                    firstPixel: Math.max(0, that.scrollPosition - 2 * that._getViewportLength()),\n                                    lastPixel: that.scrollPosition + 3 * that._getViewportLength() - 1\n                                };\n                            }\n                        },\n                        visibleRange: {\n                            enumerable: true,\n                            get: function () {\n                                return {\n                                    firstPixel: that.scrollPosition,\n                                    lastPixel: that.scrollPosition + that._getViewportLength() - 1\n                                };\n                            }\n                        },\n                        itemCount: {\n                            enumerable: true,\n                            get: function () {\n                                return that._itemsCount();\n                            }\n                        },\n                        groupCount: {\n                            enumerable: true,\n                            get: function () {\n                                return that._groups.length();\n                            }\n                        },\n                        header: {\n                            enumerable: true,\n                            get: function () {\n                                return that.header;\n                            }\n                        },\n                        footer: {\n                            enumerable: true,\n                            get: function () {\n                                return that.footer;\n                            }\n                        }\n                    });\n                },\n\n                _initializeLayout: function () {\n                    this._affectedRange.addAll();\n                    var layoutSite = this._createLayoutSite();\n                    this._layout.initialize(layoutSite, this._groupsEnabled());\n                    return this._layout.orientation === \"horizontal\";\n                },\n\n                _resetLayoutOrientation: function ListView_resetLayoutOrientation(resetScrollPosition) {\n                    if (this._horizontalLayout) {\n                        this._startProperty = \"left\";\n                        this._scrollProperty = \"scrollLeft\";\n                        this._scrollLength = \"scrollWidth\";\n                        this._deleteWrapper.style.minHeight = \"\";\n                        _ElementUtilities.addClass(this._viewport, _Constants._horizontalClass);\n                        _ElementUtilities.removeClass(this._viewport, _Constants._verticalClass);\n                        if (resetScrollPosition) {\n                            this._viewport.scrollTop = 0;\n                        }\n                    } else {\n                        this._startProperty = \"top\";\n                        this._scrollProperty = \"scrollTop\";\n                        this._scrollLength = \"scrollHeight\";\n                        this._deleteWrapper.style.minWidth = \"\";\n                        _ElementUtilities.addClass(this._viewport, _Constants._verticalClass);\n                        _ElementUtilities.removeClass(this._viewport, _Constants._horizontalClass);\n                        if (resetScrollPosition) {\n                            _ElementUtilities.setScrollPosition(this._viewport, { scrollLeft: 0 });\n                        }\n                    }\n                },\n\n                _resetLayout: function ListView_resetLayout() {\n                    this._pendingLayoutReset = false;\n                    this._affectedRange.addAll();\n                    if (this._layout) {\n                        this._layout.uninitialize();\n                        this._horizontalLayout = this._initializeLayout();\n                        this._resetLayoutOrientation();\n                    }\n                },\n\n                _updateLayout: function ListView_updateLayout(layoutObject) {\n                    var hadPreviousLayout = false;\n                    if (this._layout) {\n                        // The old layout is reset here in case it was in the middle of animating when the layout got changed. Reset\n                        // will cancel out the animations.\n                        this._cancelAsyncViewWork(true);\n                        this._layout.uninitialize();\n                        hadPreviousLayout = true;\n                    }\n\n                    var layoutImpl;\n                    if (layoutObject && typeof layoutObject.type === \"function\") {\n                        var LayoutCtor = requireSupportedForProcessing(layoutObject.type);\n                        layoutImpl = new LayoutCtor(layoutObject);\n                    } else if (layoutObject && (layoutObject.initialize)) {\n                        layoutImpl = layoutObject;\n                    } else {\n                        layoutImpl = new _Layouts.GridLayout(layoutObject);\n                    }\n\n                    hadPreviousLayout && this._resetCanvas();\n\n                    this._layoutImpl = layoutImpl;\n                    this._layout = new _Layouts._LayoutWrapper(layoutImpl);\n\n                    hadPreviousLayout && this._unsetFocusOnItem();\n                    this._setFocusOnItem({ type: _UI.ObjectType.item, index: 0 });\n                    this._selection._setFocused({ type: _UI.ObjectType.item, index: 0 });\n                    this._lastFocusedElementInGroupTrack = { type: _UI.ObjectType.item, index: -1 };\n\n                    this._headerContainer.style.opacity = 0;\n                    this._footerContainer.style.opacity = 0;\n                    this._horizontalLayout = this._initializeLayout();\n                    this._resetLayoutOrientation(hadPreviousLayout);\n\n                    if (hadPreviousLayout) {\n                        this._canvas.style.width = this._canvas.style.height = \"\";\n                    }\n                },\n\n                _currentMode: function ListView_currentMode() {\n                    return this._mode;\n                },\n\n                _setDraggable: function ListView_setDraggable() {\n                    var dragEnabled = (this.itemsDraggable || this.itemsReorderable);\n                    this._view.items.each(function (index, item, itemData) {\n                        if (itemData.itemBox) {\n                            itemData.itemBox.draggable = (dragEnabled && !_ElementUtilities.hasClass(item, _Constants._nonDraggableClass));\n                        }\n                    });\n                },\n\n                _resizeViewport: function ListView_resizeViewport() {\n                    this._viewportWidth = _Constants._UNINITIALIZED;\n                    this._viewportHeight = _Constants._UNINITIALIZED;\n                },\n\n                _onMSElementResize: function ListView_onResize() {\n                    this._writeProfilerMark(\"_onMSElementResize,info\");\n                    Scheduler.schedule(function ListView_async_msElementResize() {\n                        if (this._isZombie()) { return; }\n                        // If these values are uninitialized there is already a realization pass pending.\n                        if (this._viewportWidth !== _Constants._UNINITIALIZED && this._viewportHeight !== _Constants._UNINITIALIZED) {\n                            var newWidth = this._element.offsetWidth,\n                                newHeight = this._element.offsetHeight;\n                            if ((this._previousWidth !== newWidth) || (this._previousHeight !== newHeight)) {\n\n                                this._writeProfilerMark(\"resize (\" + this._previousWidth + \"x\" + this._previousHeight + \") => (\" + newWidth + \"x\" + newHeight + \"),info\");\n\n                                this._previousWidth = newWidth;\n                                this._previousHeight = newHeight;\n\n                                this._resizeViewport();\n\n                                var that = this;\n                                this._affectedRange.addAll();\n                                this._batchViewUpdates(_Constants._ViewChange.relayout, _Constants._ScrollToPriority.low, function () {\n                                    return {\n                                        position: that.scrollPosition,\n                                        direction: \"right\"\n                                    };\n                                });\n                            }\n                        }\n                    }, Scheduler.Priority.max, this, \"WinJS.UI.ListView._onMSElementResize\");\n                },\n\n                _onFocusIn: function ListView_onFocusIn(event) {\n                    this._hasKeyboardFocus = true;\n                    var that = this;\n                    function moveFocusToItem(keyboardFocused) {\n                        that._changeFocus(that._selection._getFocused(), true, false, false, keyboardFocused);\n                    }\n                    // The keyboardEventsHelper object can get focus through three ways: We give it focus explicitly, in which case _shouldHaveFocus will be true,\n                    // or the item that should be focused isn't in the viewport, so keyboard focus could only go to our helper. The third way happens when\n                    // focus was already on the keyboard helper and someone alt tabbed away from and eventually back to the app. In the second case, we want to navigate\n                    // back to the focused item via changeFocus(). In the third case, we don't want to move focus to a real item. We differentiate between cases two and three\n                    // by checking if the flag _keyboardFocusInbound is true. It'll be set to true when the tab manager notifies us about the user pressing tab\n                    // to move focus into the listview.\n                    if (event.target === this._keyboardEventsHelper) {\n                        if (!this._keyboardEventsHelper._shouldHaveFocus && this._keyboardFocusInbound) {\n                            moveFocusToItem(true);\n                        } else {\n                            this._keyboardEventsHelper._shouldHaveFocus = false;\n                        }\n                    } else if (event.target === this._element) {\n                        // If someone explicitly calls .focus() on the listview element, we need to route focus to the item that should be focused\n                        moveFocusToItem();\n                    } else {\n                        if (this._mode.inboundFocusHandled) {\n                            this._mode.inboundFocusHandled = false;\n                            return;\n                        }\n\n                        // In the event that .focus() is explicitly called on an element, we need to figure out what item got focus and set our state appropriately.\n                        var items = this._view.items,\n                            entity = {},\n                            element = this._getHeaderOrFooterFromElement(event.target),\n                            winItem = null;\n                        if (element) {\n                            entity.index = 0;\n                            entity.type = (element === this._header ? _UI.ObjectType.header : _UI.ObjectType.footer);\n                            this._lastFocusedElementInGroupTrack = entity;\n                        } else {\n                            element = this._groups.headerFrom(event.target);\n                            if (element) {\n                                entity.type = _UI.ObjectType.groupHeader;\n                                entity.index = this._groups.index(element);\n                                this._lastFocusedElementInGroupTrack = entity;\n                            } else {\n                                entity.index = items.index(event.target);\n                                entity.type = _UI.ObjectType.item;\n                                element = items.itemBoxAt(entity.index);\n                                winItem = items.itemAt(entity.index);\n                            }\n                        }\n\n                        // In the old layouts, index will be -1 if a group header got focus\n                        if (entity.index !== _Constants._INVALID_INDEX) {\n                            if (this._keyboardFocusInbound || this._selection._keyboardFocused()) {\n                                if ((entity.type === _UI.ObjectType.groupHeader && event.target === element) ||\n                                        (entity.type === _UI.ObjectType.item && event.target.parentNode === element)) {\n                                    // For items we check the parentNode because the srcElement is win-item and element is win-itembox,\n                                    // for header, they should both be the win-groupheader\n                                    this._drawFocusRectangle(element);\n                                }\n                            }\n                            if (this._tabManager.childFocus !== element && this._tabManager.childFocus !== winItem) {\n                                this._selection._setFocused(entity, this._keyboardFocusInbound || this._selection._keyboardFocused());\n                                this._keyboardFocusInbound = false;\n                                if (entity.type === _UI.ObjectType.item) {\n                                    element = items.itemAt(entity.index);\n                                }\n                                this._tabManager.childFocus = element;\n\n                                if (that._updater) {\n                                    var elementInfo = that._updater.elements[uniqueID(element)],\n                                        focusIndex = entity.index;\n                                    if (elementInfo && elementInfo.newIndex) {\n                                        focusIndex = elementInfo.newIndex;\n                                    }\n\n                                    // Note to not set old and new focus to the same object\n                                    that._updater.oldFocus = { type: entity.type, index: focusIndex };\n                                    that._updater.newFocus = { type: entity.type, index: focusIndex };\n                                }\n                            }\n                        }\n                    }\n                },\n\n                _onFocusOut: function ListView_onFocusOut(event) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._hasKeyboardFocus = false;\n                    this._itemFocused = false;\n                    var element = this._view.items.itemBoxFrom(event.target) || this._groups.headerFrom(event.target);\n                    if (element) {\n                        this._clearFocusRectangle(element);\n                    }\n                },\n\n                _onMSManipulationStateChanged: function ListView_onMSManipulationStateChanged(ev) {\n                    var that = this;\n                    function done() {\n                        that._manipulationEndSignal = null;\n                    }\n\n                    this._manipulationState = ev.currentState;\n                    that._writeProfilerMark(\"_onMSManipulationStateChanged state(\" + ev.currentState + \"),info\");\n\n                    if (this._manipulationState !== _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED && !this._manipulationEndSignal) {\n                        this._manipulationEndSignal = new _Signal();\n                        this._manipulationEndSignal.promise.done(done, done);\n                    }\n\n                    if (this._manipulationState === _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED) {\n                        this._manipulationEndSignal.complete();\n                    }\n                },\n\n                _pendingScroll: false,\n\n                _onScroll: function ListView_onScroll() {\n                    if (!this._zooming && !this._pendingScroll) {\n                        this._checkScroller();\n                    }\n                },\n\n                _checkScroller: function ListView_checkScroller() {\n                    if (this._isZombie()) { return; }\n\n                    var currentScrollPosition = this._viewportScrollPosition;\n                    if (currentScrollPosition !== this._lastScrollPosition) {\n                        this._pendingScroll = _BaseUtils._requestAnimationFrame(this._checkScroller.bind(this));\n\n                        currentScrollPosition = Math.max(0, currentScrollPosition);\n                        var direction = this._scrollDirection(currentScrollPosition);\n\n                        this._lastScrollPosition = currentScrollPosition;\n                        this._raiseViewLoading(true);\n                        this._raiseHeaderFooterVisibilityEvent();\n                        var that = this;\n                        this._view.onScroll(function () {\n                            return {\n                                position: that._lastScrollPosition,\n                                direction: direction\n                            };\n                        },\n                            this._manipulationEndSignal ? this._manipulationEndSignal.promise : Promise.timeout(_Constants._DEFERRED_SCROLL_END));\n                    } else {\n                        this._pendingScroll = null;\n                    }\n                },\n\n                _scrollDirection: function ListView_scrollDirectionl(currentScrollPosition) {\n                    var currentDirection = currentScrollPosition < this._lastScrollPosition ? \"left\" : \"right\";\n\n                    // When receiving a sequence of scroll positions, the browser may give us one scroll position\n                    // which doesn't fit (e.g. the scroll positions were increasing but just this one is decreasing).\n                    // To filter out this noise, _scrollDirection and _direction are stubborn -- they only change\n                    // when we've received a sequence of 3 scroll position which all indicate the same direction.\n                    return currentDirection === this._lastDirection ? currentDirection : this._direction;\n                },\n\n                _onTabEnter: function ListView_onTabEnter() {\n                    this._keyboardFocusInbound = true;\n                },\n\n                _onTabExit: function ListView_onTabExit() {\n                    this._keyboardFocusInbound = false;\n                },\n\n                _onPropertyChange: function ListView_onPropertyChange(list) {\n                    var that = this;\n                    list.forEach(function (record) {\n                        var dirChanged = false;\n                        if (record.attributeName === \"dir\") {\n                            dirChanged = true;\n                        } else if (record.attributeName === \"style\") {\n                            dirChanged = (that._cachedStyleDir !== record.target.style.direction);\n                        }\n                        if (dirChanged) {\n                            that._cachedStyleDir = record.target.style.direction;\n                            that._cachedRTL = null;\n                            _ElementUtilities[that._rtl() ? \"addClass\" : \"removeClass\"](that._element, _Constants._rtlListViewClass);\n\n                            that._lastScrollPosition = 0;\n                            that._viewportScrollPosition = 0;\n\n                            that.forceLayout();\n                        }\n\n                        if (record.attributeName === \"tabIndex\") {\n                            var newTabIndex = that._element.tabIndex;\n                            if (newTabIndex >= 0) {\n                                that._view.items.each(function (index, item) {\n                                    item.tabIndex = newTabIndex;\n                                });\n                                that._header && (that._header.tabIndex = newTabIndex);\n                                that._footer && (that._footer.tabIndex = newTabIndex);\n                                that._tabIndex = newTabIndex;\n                                that._tabManager.tabIndex = newTabIndex;\n                                that._element.tabIndex = -1;\n                            }\n                        }\n                    });\n                },\n\n                _getCanvasMargins: function ListView_getCanvasMargins() {\n                    if (!this._canvasMargins) {\n                        this._canvasMargins = _Layouts._getMargins(this._canvas);\n                    }\n                    return this._canvasMargins;\n                },\n\n                // Convert between canvas coordinates and viewport coordinates\n                _convertCoordinatesByCanvasMargins: function ListView_convertCoordinatesByCanvasMargins(coordinates, conversionCallback) {\n                    function fix(field, offset) {\n                        if (coordinates[field] !== undefined) {\n                            coordinates[field] = conversionCallback(coordinates[field], offset);\n                        }\n                    }\n\n                    var offset;\n                    if (this._horizontal()) {\n                        offset = this._getCanvasMargins()[this._rtl() ? \"right\" : \"left\"];\n                        fix(\"left\", offset);\n                    } else {\n                        offset = this._getCanvasMargins().top;\n                        fix(\"top\", offset);\n                    }\n                    fix(\"begin\", offset);\n                    fix(\"end\", offset);\n\n                    return coordinates;\n                },\n                _convertFromCanvasCoordinates: function ListView_convertFromCanvasCoordinates(coordinates) {\n                    return this._convertCoordinatesByCanvasMargins(coordinates, function (coordinate, canvasMargin) {\n                        return coordinate + canvasMargin;\n                    });\n                },\n                _convertToCanvasCoordinates: function ListView_convertToCanvasCoordinates(coordinates) {\n                    return this._convertCoordinatesByCanvasMargins(coordinates, function (coordinate, canvasMargin) {\n                        return coordinate - canvasMargin;\n                    });\n                },\n\n                // Methods in the site interface used by ScrollView\n                _getViewportSize: function ListView_getViewportSize() {\n                    if (this._viewportWidth === _Constants._UNINITIALIZED || this._viewportHeight === _Constants._UNINITIALIZED) {\n                        this._viewportWidth = Math.max(0, _ElementUtilities.getContentWidth(this._element));\n                        this._viewportHeight = Math.max(0, _ElementUtilities.getContentHeight(this._element));\n                        this._writeProfilerMark(\"viewportSizeDetected width:\" + this._viewportWidth + \" height:\" + this._viewportHeight);\n\n                        this._previousWidth = this._element.offsetWidth;\n                        this._previousHeight = this._element.offsetHeight;\n                    }\n                    return {\n                        width: this._viewportWidth,\n                        height: this._viewportHeight\n                    };\n                },\n\n                _itemsCount: function ListView_itemsCount() {\n                    var that = this;\n                    function cleanUp() {\n                        that._itemsCountPromise = null;\n                    }\n\n                    if (this._cachedCount !== _Constants._UNINITIALIZED) {\n                        return Promise.wrap(this._cachedCount);\n                    } else {\n                        var retVal;\n                        if (!this._itemsCountPromise) {\n                            retVal = this._itemsCountPromise = this._itemsManager.dataSource.getCount().then(\n                                function (count) {\n                                    if (count === _UI.CountResult.unknown) {\n                                        count = 0;\n                                    }\n                                    that._cachedCount = count;\n                                    that._selection._updateCount(that._cachedCount);\n                                    return count;\n                                },\n                                function () {\n                                    return Promise.cancel;\n                                }\n                            );\n\n                            this._itemsCountPromise.then(cleanUp, cleanUp);\n                        } else {\n                            retVal = this._itemsCountPromise;\n                        }\n\n                        return retVal;\n                    }\n                },\n\n                _isSelected: function ListView_isSelected(index) {\n                    return this._selection._isIncluded(index);\n                },\n\n                _LoadingState: {\n                    itemsLoading: \"itemsLoading\",\n                    viewPortLoaded: \"viewPortLoaded\",\n                    itemsLoaded: \"itemsLoaded\",\n                    complete: \"complete\"\n                },\n\n                _raiseViewLoading: function ListView_raiseViewLoading(scrolling) {\n                    if (this._loadingState !== this._LoadingState.itemsLoading) {\n                        this._scrolling = !!scrolling;\n                    }\n                    this._setViewState(this._LoadingState.itemsLoading);\n                },\n\n                _raiseViewComplete: function ListView_raiseViewComplete() {\n                    if (!this._disposed && !this._view.animating) {\n                        this._setViewState(this._LoadingState.complete);\n                    }\n                },\n\n                _raiseHeaderFooterVisibilityEvent: function ListView_raiseHeaderFooterVisibilityEvent() {\n                    var that = this;\n                    var elementInViewport = function (element) {\n                        if (!element) {\n                            return false;\n                        }\n\n                        var scrollPosition = that._lastScrollPosition,\n                            elementPosition = element[(that._horizontal() ? \"offsetLeft\" : \"offsetTop\")],\n                            elementLength = element[(that._horizontal() ? \"offsetWidth\" : \"offsetHeight\")];\n\n                        return ((elementPosition + elementLength) > scrollPosition && elementPosition < (scrollPosition + that._getViewportLength()));\n                    },\n                    raiseVisibilityEvent = function (eventName, visible) {\n                        var visibilityEvent = _Global.document.createEvent(\"CustomEvent\");\n                        visibilityEvent.initCustomEvent(eventName, true, true, { visible: visible });\n                        that._element.dispatchEvent(visibilityEvent);\n                    };\n\n                    var headerInView = (!!this._header && elementInViewport(this._headerContainer));\n                    var footerInView = (!!this._footer && elementInViewport(this._footerContainer));\n\n                    if (this._headerFooterVisibilityStatus.headerVisible !== headerInView) {\n                        this._headerFooterVisibilityStatus.headerVisible = headerInView;\n                        raiseVisibilityEvent(\"headervisibilitychanged\", headerInView);\n                    }\n                    if (this._headerFooterVisibilityStatus.footerVisible !== footerInView) {\n                        this._headerFooterVisibilityStatus.footerVisible = footerInView;\n                        raiseVisibilityEvent(\"footervisibilitychanged\", footerInView);\n                    }\n                },\n\n                _setViewState: function ListView_setViewState(state) {\n                    if (state !== this._loadingState) {\n                        var detail = {\n                            scrolling: false\n                        };\n                        // We can go from any state to itemsLoading but the rest of the states transitions must follow this\n                        // order: itemsLoading -> viewPortLoaded -> itemsLoaded -> complete.\n                        // Recursively set the previous state until you hit the current state or itemsLoading.\n                        switch (state) {\n                            case this._LoadingState.viewPortLoaded:\n                                if (!this._scheduledForDispose) {\n                                    scheduleForDispose(this);\n                                    this._scheduledForDispose = true;\n                                }\n                                this._setViewState(this._LoadingState.itemsLoading);\n                                break;\n\n                            case this._LoadingState.itemsLoaded:\n                                detail = {\n                                    scrolling: this._scrolling\n                                };\n                                this._setViewState(this._LoadingState.viewPortLoaded);\n                                break;\n\n                            case this._LoadingState.complete:\n                                this._setViewState(this._LoadingState.itemsLoaded);\n                                this._updateDeleteWrapperSize(true);\n                                break;\n                        }\n\n                        this._writeProfilerMark(\"loadingStateChanged:\" + state + \",info\");\n                        this._loadingState = state;\n                        var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                        eventObject.initCustomEvent(\"loadingstatechanged\", true, false, detail);\n                        this._element.dispatchEvent(eventObject);\n                    }\n                },\n\n                _createTemplates: function ListView_createTemplates() {\n\n                    function createNodeWithClass(className, skipAriaHidden) {\n                        var element = _Global.document.createElement(\"div\");\n                        element.className = className;\n                        if (!skipAriaHidden) {\n                            element.setAttribute(\"aria-hidden\", true);\n                        }\n                        return element;\n                    }\n\n                    this._itemBoxTemplate = createNodeWithClass(_Constants._itemBoxClass, true);\n                },\n\n                // Methods used by SelectionManager\n                _updateSelection: function ListView_updateSelection() {\n                    var indices = this._selection.getIndices(),\n                        selectAll = this._selection.isEverything(),\n                        selectionMap = {};\n\n                    if (!selectAll) {\n                        for (var i = 0, len = indices.length ; i < len; i++) {\n                            var index = indices[i];\n                            selectionMap[index] = true;\n                        }\n                    }\n\n                    this._view.items.each(function (index, element, itemData) {\n                        if (itemData.itemBox) {\n                            var selected = selectAll || !!selectionMap[index];\n                            _ItemEventsHandler._ItemEventsHandler.renderSelection(itemData.itemBox, element, selected, true);\n                            if (itemData.container) {\n                                _ElementUtilities[selected ? \"addClass\" : \"removeClass\"](itemData.container, _Constants._selectedClass);\n                            }\n                        }\n                    });\n                },\n\n                _getViewportLength: function ListView_getViewportLength() {\n                    return this._getViewportSize()[this._horizontal() ? \"width\" : \"height\"];\n                },\n\n                _horizontal: function ListView_horizontal() {\n                    return this._horizontalLayout;\n                },\n\n                _rtl: function ListView_rtl() {\n                    if (typeof this._cachedRTL !== \"boolean\") {\n                        this._cachedRTL = _Global.getComputedStyle(this._element, null).direction === \"rtl\";\n                    }\n                    return this._cachedRTL;\n                },\n\n                _showProgressBar: function ListView_showProgressBar(parent, x, y) {\n                    var progressBar = this._progressBar,\n                        progressStyle = progressBar.style;\n\n                    if (!progressBar.parentNode) {\n                        this._fadingProgressBar = false;\n                        if (this._progressIndicatorDelayTimer) {\n                            this._progressIndicatorDelayTimer.cancel();\n                        }\n                        var that = this;\n                        this._progressIndicatorDelayTimer = Promise.timeout(_Constants._LISTVIEW_PROGRESS_DELAY).then(function () {\n                            if (!that._isZombie()) {\n                                parent.appendChild(progressBar);\n                                Animations.fadeIn(progressBar);\n                                that._progressIndicatorDelayTimer = null;\n                            }\n                        });\n                    }\n                    progressStyle[this._rtl() ? \"right\" : \"left\"] = x;\n                    progressStyle.top = y;\n                },\n\n                _hideProgressBar: function ListView_hideProgressBar() {\n                    if (this._progressIndicatorDelayTimer) {\n                        this._progressIndicatorDelayTimer.cancel();\n                        this._progressIndicatorDelayTimer = null;\n                    }\n\n                    var progressBar = this._progressBar;\n                    if (progressBar.parentNode && !this._fadingProgressBar) {\n                        this._fadingProgressBar = true;\n                        var that = this;\n                        Animations.fadeOut(progressBar).then(function () {\n                            if (progressBar.parentNode) {\n                                progressBar.parentNode.removeChild(progressBar);\n                            }\n                            that._fadingProgressBar = false;\n                        });\n                    }\n                },\n\n                _getPanAxis: function () {\n                    return this._horizontal() ? \"horizontal\" : \"vertical\";\n                },\n\n                _configureForZoom: function (isZoomedOut, isCurrentView, triggerZoom) {\n                    if (_BaseUtils.validation) {\n                        if (!this._view.realizePage || typeof this._view.begin !== \"number\") {\n                            throw new _ErrorFromName(\"WinJS.UI.ListView.NotCompatibleWithSemanticZoom\", strings.notCompatibleWithSemanticZoom);\n                        }\n                    }\n\n                    this._isZoomedOut = isZoomedOut;\n                    this._disableEntranceAnimation = !isCurrentView;\n\n                    this._isCurrentZoomView = isCurrentView;\n\n                    this._triggerZoom = triggerZoom;\n                },\n\n                _setCurrentItem: function (x, y) {\n                    // First, convert the position into canvas coordinates\n                    if (this._rtl()) {\n                        x = this._viewportWidth - x;\n                    }\n                    if (this._horizontal()) {\n                        x += this.scrollPosition;\n                    } else {\n                        y += this.scrollPosition;\n                    }\n\n                    var result = this._view.hitTest(x, y),\n                        entity = { type: result.type ? result.type : _UI.ObjectType.item, index: result.index };\n                    if (entity.index >= 0) {\n                        if (this._hasKeyboardFocus) {\n                            this._changeFocus(entity, true, false, true);\n                        } else {\n                            this._changeFocusPassively(entity);\n                        }\n                    }\n                },\n\n                _getCurrentItem: function () {\n                    var focused = this._selection._getFocused();\n\n                    if (focused.type === _UI.ObjectType.groupHeader) {\n                        focused = { type: _UI.ObjectType.item, index: this._groups.group(focused.index).startIndex };\n                    } else if (focused.type !== _UI.ObjectType.item) {\n                        focused = { type: _UI.ObjectType.item, index: (focused.type === _UI.ObjectType.header ? 0 : this._cachedCount) };\n                    }\n\n                    if (typeof focused.index !== \"number\") {\n                        // Do a hit-test in the viewport center\n                        this._setCurrentItem(0.5 * this._viewportWidth, 0.5 * this._viewportHeight);\n\n                        focused = this._selection._getFocused();\n                    }\n\n                    var that = this;\n                    var promisePosition = this._getItemOffsetPosition(focused.index).\n                            then(function (posCanvas) {\n                                var scrollOffset = that._canvasStart;\n\n                                posCanvas[that._startProperty] += scrollOffset;\n\n                                return posCanvas;\n                            });\n\n                    return Promise.join({\n                        item: this._dataSource.itemFromIndex(focused.index),\n                        position: promisePosition\n                    });\n                },\n\n                _animateItemsForPhoneZoom: function () {\n                    var containersOnScreen = [],\n                        itemRows = [],\n                        promises = [],\n                        minRow = Number.MAX_VALUE,\n                        that = this;\n\n                    for (var i = this._view.firstIndexDisplayed, len = Math.min(this._cachedCount, this._view.lastIndexDisplayed + 1) ; i < len; i++) {\n                        promises.push(this._view.waitForEntityPosition({ type: _UI.ObjectType.item, index: i }).then(function () {\n                            containersOnScreen.push(that._view.items.containerAt(i));\n                            var itemRow = 0;\n                            if (that.layout._getItemPosition) {\n                                var itemPosition = that.layout._getItemPosition(i);\n                                if (itemPosition.row) {\n                                    itemRow = itemPosition.row;\n                                }\n                            }\n                            itemRows.push(itemRow);\n                            minRow = Math.min(itemRow, minRow);\n                        }));\n                    }\n\n                    function rowStaggerDelay(minRow, rows, delayBetweenRows) {\n                        return function (index) {\n                            return ((rows[index] - minRow) * delayBetweenRows);\n                        };\n                    }\n\n                    function clearTransform() {\n                        for (var i = 0, len = containersOnScreen.length; i < len; i++) {\n                            containersOnScreen[i].style[transformNames.scriptName] = \"\";\n                        }\n                    }\n\n                    return Promise.join(promises).then(function () {\n                        return (containersOnScreen.length === 0 ? Promise.wrap() : _TransitionAnimation.executeTransition(\n                            containersOnScreen,\n                            {\n                                property: transformNames.cssName,\n                                delay: rowStaggerDelay(minRow, itemRows, 30),\n                                duration: 100,\n                                timing: \"ease-in-out\",\n                                from: (!that._isCurrentZoomView ? \"rotateX(-90deg)\" : \"rotateX(0deg)\"),\n                                to: (!that._isCurrentZoomView ? \"rotateX(0deg)\" : \"rotateX(90deg)\")\n                            })).then(clearTransform, clearTransform);\n                    }).then(clearTransform, clearTransform);\n                },\n\n                _beginZoom: function () {\n                    this._zooming = true;\n                    var zoomPromise = null;\n\n                    if (_BaseUtils.isPhone) {\n                        if (this._isZoomedOut) {\n                            this._zoomAnimationPromise && this._zoomAnimationPromise.cancel();\n                            // The phone's zoom animations need to be handled in two different spots.\n                            // When zooming out, we need to wait for _positionItem to be called so that we have the right items in view before trying to animate.\n                            // When zooming back in, the items we need to animate are already ready (and _positionItem won't be called on the zoomed out view, since it's\n                            // being dismissed), so we play the animation in _beginZoom.\n                            if (this._isCurrentZoomView) {\n                                var that = this;\n                                var animationComplete = function animationComplete() {\n                                    that._zoomAnimationPromise = null;\n                                };\n                                this._zoomAnimationPromise = zoomPromise = this._animateItemsForPhoneZoom().then(animationComplete, animationComplete);\n                            } else {\n                                this._zoomAnimationPromise = new _Signal();\n                                zoomPromise = this._zoomAnimationPromise.promise;\n                            }\n                        }\n                    } else {\n                        // Hide the scrollbar and extend the content beyond the ListView viewport\n                        var horizontal = this._horizontal(),\n                            scrollOffset = -this.scrollPosition;\n\n                        _ElementUtilities.addClass(this._viewport, horizontal ? _Constants._zoomingXClass : _Constants._zoomingYClass);\n                        this._canvasStart = scrollOffset;\n                        _ElementUtilities.addClass(this._viewport, horizontal ? _Constants._zoomingYClass : _Constants._zoomingXClass);\n                    }\n                    return zoomPromise;\n                },\n\n                _positionItem: function (item, position) {\n                    var that = this;\n                    function positionItemAtIndex(index) {\n                        return that._getItemOffsetPosition(index).then(function positionItemAtIndex_then_ItemOffsetPosition(posCanvas) {\n                            var horizontal = that._horizontal(),\n                                canvasSize = that._viewport[horizontal ? \"scrollWidth\" : \"scrollHeight\"],\n                                viewportSize = (horizontal ? that._viewportWidth : that._viewportHeight),\n                                headerSizeProp = (horizontal ? \"headerContainerWidth\" : \"headerContainerHeight\"),\n                                layoutSizes = that.layout._sizes,\n                                headerSize = 0,\n                                scrollPosition;\n\n                            if (layoutSizes && layoutSizes[headerSizeProp]) {\n                                headerSize = layoutSizes[headerSizeProp];\n                            }\n                            // Align the leading edge\n                            var start = (_BaseUtils.isPhone ? headerSize : position[that._startProperty]),\n                                startMax = viewportSize - (horizontal ? posCanvas.width : posCanvas.height);\n\n                            // Ensure the item ends up within the viewport\n                            start = Math.max(0, Math.min(startMax, start));\n\n                            scrollPosition = posCanvas[that._startProperty] - start;\n\n\n                            // Ensure the scroll position is valid\n                            var adjustedScrollPosition = Math.max(0, Math.min(canvasSize - viewportSize, scrollPosition)),\n                            scrollAdjustment = adjustedScrollPosition - scrollPosition;\n\n                            scrollPosition = adjustedScrollPosition;\n\n                            var entity = { type: _UI.ObjectType.item, index: index };\n                            if (that._hasKeyboardFocus) {\n                                that._changeFocus(entity, true);\n                            } else {\n                                that._changeFocusPassively(entity);\n                            }\n\n                            that._raiseViewLoading(true);\n                            // Since a zoom is in progress, adjust the div position\n                            if (!_BaseUtils.isPhone) {\n                                var scrollOffset = -scrollPosition;\n                                that._canvasStart = scrollOffset;\n                            } else {\n                                that._viewportScrollPosition = scrollPosition;\n                            }\n                            that._view.realizePage(scrollPosition, true);\n\n                            if (_BaseUtils.isPhone && that._isZoomedOut) {\n                                var animationComplete = function animationComplete() {\n                                    that._zoomAnimationPromise && that._zoomAnimationPromise.complete && that._zoomAnimationPromise.complete();\n                                    that._zoomAnimationPromise = null;\n                                };\n                                that._animateItemsForPhoneZoom().then(animationComplete, animationComplete);\n                            }\n                            return (\n                                horizontal ?\n                            { x: scrollAdjustment, y: 0 } :\n                            { x: 0, y: scrollAdjustment }\n                            );\n                        });\n                    }\n\n                    var itemIndex = 0;\n                    if (item) {\n                        itemIndex = (this._isZoomedOut ? item.groupIndexHint : item.firstItemIndexHint);\n                    }\n\n                    if (typeof itemIndex === \"number\") {\n                        return positionItemAtIndex(itemIndex);\n                    } else {\n                        // We'll need to obtain the index from the data source\n                        var itemPromise;\n\n                        var key = (this._isZoomedOut ? item.groupKey : item.firstItemKey);\n                        if (typeof key === \"string\" && this._dataSource.itemFromKey) {\n                            itemPromise = this._dataSource.itemFromKey(key, (this._isZoomedOut ? {\n                                groupMemberKey: item.key,\n                                groupMemberIndex: item.index\n                            } : null));\n                        } else {\n                            var description = (this._isZoomedOut ? item.groupDescription : item.firstItemDescription);\n\n                            if (_BaseUtils.validation) {\n                                if (description === undefined) {\n                                    throw new _ErrorFromName(\"WinJS.UI.ListView.InvalidItem\", strings.listViewInvalidItem);\n                                }\n                            }\n\n                            itemPromise = this._dataSource.itemFromDescription(description);\n                        }\n\n                        return itemPromise.then(function (item) {\n                            return positionItemAtIndex(item.index);\n                        });\n                    }\n                },\n\n                _endZoom: function (isCurrentView) {\n                    if (this._isZombie()) {\n                        return;\n                    }\n\n                    // Crop the content again and re-enable the scrollbar\n                    if (!_BaseUtils.isPhone) {\n                        var scrollOffset = this._canvasStart;\n\n                        _ElementUtilities.removeClass(this._viewport, _Constants._zoomingYClass);\n                        _ElementUtilities.removeClass(this._viewport, _Constants._zoomingXClass);\n                        this._canvasStart = 0;\n                        this._viewportScrollPosition = -scrollOffset;\n                    }\n                    this._disableEntranceAnimation = !isCurrentView;\n                    this._isCurrentZoomView = isCurrentView;\n                    this._zooming = false;\n                    this._view.realizePage(this.scrollPosition, false);\n                },\n\n                _getItemOffsetPosition: function (index) {\n                    var that = this;\n                    return this._getItemOffset({ type: _UI.ObjectType.item, index: index }).then(function (position) {\n                        return that._ensureFirstColumnRange(_UI.ObjectType.item).then(function () {\n                            position = that._correctRangeInFirstColumn(position, _UI.ObjectType.item);\n                            position = that._convertFromCanvasCoordinates(position);\n                            if (that._horizontal()) {\n                                position.left = position.begin;\n                                position.width = position.end - position.begin;\n                                position.height = position.totalHeight;\n                            } else {\n                                position.top = position.begin;\n                                position.height = position.end - position.begin;\n                                position.width = position.totalWidth;\n                            }\n                            return position;\n                        });\n                    });\n                },\n\n                _groupRemoved: function (key) {\n                    this._groupFocusCache.deleteGroup(key);\n                },\n\n                _updateFocusCache: function (itemIndex) {\n                    if (this._updateFocusCacheItemRequest) {\n                        this._updateFocusCacheItemRequest.cancel();\n                    }\n\n                    var that = this;\n                    this._updateFocusCacheItemRequest = this._view.items.requestItem(itemIndex).then(function () {\n                        that._updateFocusCacheItemRequest = null;\n                        var itemData = that._view.items.itemDataAt(itemIndex);\n                        var groupIndex = that._groups.groupFromItem(itemIndex);\n                        var groupKey = that._groups.group(groupIndex).key;\n                        if (itemData.itemsManagerRecord.item) {\n                            that._groupFocusCache.updateCache(groupKey, itemData.itemsManagerRecord.item.key, itemIndex);\n                        }\n                    });\n                },\n\n                _changeFocus: function (newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused) {\n                    if (this._isZombie()) {\n                        return;\n                    }\n                    var targetItem;\n\n                    if (newFocus.type === _UI.ObjectType.item) {\n                        targetItem = this._view.items.itemAt(newFocus.index);\n                        if (!skipSelection && targetItem && _ElementUtilities.hasClass(targetItem, _Constants._nonSelectableClass)) {\n                            skipSelection = true;\n                        }\n                        this._updateFocusCache(newFocus.index);\n                    } else if (newFocus.type === _UI.ObjectType.groupHeader) {\n                        this._lastFocusedElementInGroupTrack = newFocus;\n                        var group = this._groups.group(newFocus.index);\n                        targetItem = group && group.header;\n                    } else {\n                        this._lastFocusedElementInGroupTrack = newFocus;\n                        targetItem = (newFocus.type === _UI.ObjectType.footer ? this._footer : this._header);\n                    }\n                    this._unsetFocusOnItem(!!targetItem);\n                    this._hasKeyboardFocus = true;\n                    this._selection._setFocused(newFocus, keyboardFocused);\n                    if (!skipEnsureVisible) {\n                        this.ensureVisible(newFocus);\n                    }\n\n                    // _selection.set() needs to know which item has focus so we\n                    // must call it after _selection._setFocused() has been called.\n                    if (!skipSelection && this._selectFocused(ctrlKeyDown)) {\n                        this._selection.set(newFocus.index);\n                    }\n                    this._setFocusOnItem(newFocus);\n                },\n\n                // Updates ListView's internal focus state and, if ListView currently has focus, moves\n                // Trident's focus to the item at index newFocus.\n                // Similar to _changeFocus except _changeFocusPassively doesn't:\n                // - ensure the item is selected or visible\n                // - set Trident's focus to newFocus when ListView doesn't have focus\n                _changeFocusPassively: function (newFocus) {\n                    var targetItem;\n                    switch (newFocus.type) {\n                        case _UI.ObjectType.item:\n                            targetItem = this._view.items.itemAt(newFocus.index);\n                            this._updateFocusCache(newFocus.index);\n                            break;\n                        case _UI.ObjectType.groupHeader:\n                            this._lastFocusedElementInGroupTrack = newFocus;\n                            var group = this._groups.group(newFocus.index);\n                            targetItem = group && group.header;\n                            break;\n                        case _UI.ObjectType.header:\n                            this._lastFocusedElementInGroupTrack = newFocus;\n                            targetItem = this._header;\n                            break;\n                        case _UI.ObjectType.footer:\n                            this._lastFocusedElementInGroupTrack = newFocus;\n                            targetItem = this._footer;\n                            break;\n                    }\n                    this._unsetFocusOnItem(!!targetItem);\n                    this._selection._setFocused(newFocus);\n                    this._setFocusOnItem(newFocus);\n                },\n\n                _drawFocusRectangle: function (item) {\n                    if (item === this._header || item === this._footer) {\n                        return;\n                    }\n                    if (_ElementUtilities.hasClass(item, _Constants._headerClass)) {\n                        _ElementUtilities.addClass(item, _Constants._itemFocusClass);\n                    } else {\n                        var itemBox = this._view.items.itemBoxFrom(item);\n                        if (itemBox.querySelector(\".\" + _Constants._itemFocusOutlineClass)) {\n                            return;\n                        }\n                        _ElementUtilities.addClass(itemBox, _Constants._itemFocusClass);\n                        var outline = _Global.document.createElement(\"div\");\n                        outline.className = _Constants._itemFocusOutlineClass;\n                        itemBox.appendChild(outline);\n                    }\n                },\n\n                _clearFocusRectangle: function (item) {\n                    if (!item || this._isZombie() || item === this._header || item === this._footer) {\n                        return;\n                    }\n\n                    var itemBox = this._view.items.itemBoxFrom(item);\n                    if (itemBox) {\n                        _ElementUtilities.removeClass(itemBox, _Constants._itemFocusClass);\n                        var outline = itemBox.querySelector(\".\" + _Constants._itemFocusOutlineClass);\n                        if (outline) {\n                            outline.parentNode.removeChild(outline);\n                        }\n                    } else {\n                        var header = this._groups.headerFrom(item);\n                        if (header) {\n                            _ElementUtilities.removeClass(header, _Constants._itemFocusClass);\n                        }\n                    }\n                },\n\n                _defaultInvoke: function (entity) {\n                    if (this._isZoomedOut || (_BaseUtils.isPhone && this._triggerZoom && entity.type === _UI.ObjectType.groupHeader)) {\n                        this._changeFocusPassively(entity);\n                        this._triggerZoom();\n                    }\n                },\n\n                _selectionAllowed: function ListView_selectionAllowed(itemIndex) {\n                    var item = (itemIndex !== undefined ? this.elementFromIndex(itemIndex) : null),\n                        itemSelectable = !(item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass));\n                    return itemSelectable && this._selectionMode !== _UI.SelectionMode.none;\n                },\n\n                _multiSelection: function ListView_multiSelection() {\n                    return this._selectionMode === _UI.SelectionMode.multi;\n                },\n\n                _isInSelectionMode: function ListView_isInSelectionMode() {\n                    return (this.tapBehavior === _UI.TapBehavior.toggleSelect && this.selectionMode === _UI.SelectionMode.multi);\n                },\n\n                _selectOnTap: function ListView_selectOnTap() {\n                    return this._tap === _UI.TapBehavior.toggleSelect || this._tap === _UI.TapBehavior.directSelect;\n                },\n\n                _selectFocused: function ListView_selectFocused(ctrlKeyDown) {\n                    return this._tap === _UI.TapBehavior.directSelect && this._selectionMode === _UI.SelectionMode.multi && !ctrlKeyDown;\n                },\n\n                _dispose: function () {\n                    if (!this._disposed) {\n                        this._disposed = true;\n                        var clear = function clear(e) {\n                            e && (e.textContent = \"\");\n                        };\n\n                        _ElementUtilities._resizeNotifier.unsubscribe(this._element, this._onMSElementResizeBound);\n\n                        this._batchingViewUpdates && this._batchingViewUpdates.cancel();\n\n                        this._view && this._view._dispose && this._view._dispose();\n                        this._mode && this._mode._dispose && this._mode._dispose();\n                        this._groups && this._groups._dispose && this._groups._dispose();\n                        this._selection && this._selection._dispose && this._selection._dispose();\n                        this._layout && this._layout.uninitialize && this._layout.uninitialize();\n\n                        this._itemsCountPromise && this._itemsCountPromise.cancel();\n                        this._versionManager && this._versionManager._dispose();\n                        this._clearInsertedItems();\n                        this._itemsManager && this._itemsManager.release();\n                        this._zoomAnimationPromise && this._zoomAnimationPromise.cancel();\n\n                        clear(this._viewport);\n                        clear(this._canvas);\n                        clear(this._canvasProxy);\n\n                        this._versionManager = null;\n                        this._view = null;\n                        this._mode = null;\n                        this._element = null;\n                        this._viewport = null;\n                        this._itemsManager = null;\n                        this._canvas = null;\n                        this._canvasProxy = null;\n                        this._itemsCountPromise = null;\n                        this._scrollToFunctor = null;\n\n                        var index = controlsToDispose.indexOf(this);\n                        if (index >= 0) {\n                            controlsToDispose.splice(index, 1);\n                        }\n                    }\n                },\n\n                _isZombie: function () {\n                    // determines if this ListView is no longer in the DOM or has been cleared\n                    //\n                    return this._disposed || !(this.element.firstElementChild && _Global.document.body.contains(this.element));\n                },\n\n                _ifZombieDispose: function () {\n                    var zombie = this._isZombie();\n                    if (zombie && !this._disposed) {\n                        scheduleForDispose(this);\n                    }\n                    return zombie;\n                },\n\n                _animationsDisabled: function () {\n                    if (this._viewportWidth === 0 || this._viewportHeight === 0) {\n                        return true;\n                    }\n\n                    return !_TransitionAnimation.isAnimationEnabled();\n                },\n\n                _fadeOutViewport: function ListView_fadeOutViewport() {\n                    var that = this;\n                    return new Promise(function (complete) {\n                        if (that._animationsDisabled()) {\n                            complete();\n                            return;\n                        }\n\n                        if (!that._fadingViewportOut) {\n                            if (that._waitingEntranceAnimationPromise) {\n                                that._waitingEntranceAnimationPromise.cancel();\n                                that._waitingEntranceAnimationPromise = null;\n                            }\n                            var eventDetails = that._fireAnimationEvent(ListViewAnimationType.contentTransition);\n                            that._firedAnimationEvent = true;\n                            if (!eventDetails.prevented) {\n                                that._fadingViewportOut = true;\n                                that._viewport.style.overflow = \"hidden\";\n                                Animations.fadeOut(that._viewport).then(function () {\n                                    if (that._isZombie()) { return; }\n                                    that._fadingViewportOut = false;\n                                    that._viewport.style.opacity = 1.0;\n                                    complete();\n                                });\n                            } else {\n                                that._disableEntranceAnimation = true;\n                                that._viewport.style.opacity = 1.0;\n                                complete();\n                            }\n                        }\n                    });\n                },\n\n                _animateListEntrance: function (firstTime) {\n                    var eventDetails = {\n                        prevented: false,\n                        animationPromise: Promise.wrap()\n                    };\n                    var that = this;\n                    this._raiseHeaderFooterVisibilityEvent();\n                    function resetViewOpacity() {\n                        that._canvas.style.opacity = 1;\n                        that._headerContainer.style.opacity = 1;\n                        that._footerContainer.style.opacity = 1;\n                        that._viewport.style.overflow = \"\";\n                        that._raiseHeaderFooterVisibilityEvent();\n                    }\n\n                    if (this._disableEntranceAnimation || this._animationsDisabled()) {\n                        resetViewOpacity();\n                        if (this._waitingEntranceAnimationPromise) {\n                            this._waitingEntranceAnimationPromise.cancel();\n                            this._waitingEntranceAnimationPromise = null;\n                        }\n                        return Promise.wrap();\n                    }\n\n                    if (!this._firedAnimationEvent) {\n                        eventDetails = this._fireAnimationEvent(ListViewAnimationType.entrance);\n                    } else {\n                        this._firedAnimationEvent = false;\n                    }\n\n                    // The listview does not have an entrance animation on Phone\n                    if (eventDetails.prevented || _BaseUtils.isPhone) {\n                        resetViewOpacity();\n                        return Promise.wrap();\n                    } else {\n                        if (this._waitingEntranceAnimationPromise) {\n                            this._waitingEntranceAnimationPromise.cancel();\n                        }\n                        this._canvas.style.opacity = 0;\n                        this._viewport.style.overflow = \"hidden\";\n                        this._headerContainer.style.opacity = 1;\n                        this._footerContainer.style.opacity = 1;\n                        this._waitingEntranceAnimationPromise = eventDetails.animationPromise.then(function () {\n                            if (!that._isZombie()) {\n                                that._canvas.style.opacity = 1;\n\n                                return Animations.enterContent(that._viewport).then(function () {\n                                    if (!that._isZombie()) {\n                                        that._waitingEntranceAnimationPromise = null;\n                                        that._viewport.style.overflow = \"\";\n                                    }\n                                });\n                            }\n                        });\n                        return this._waitingEntranceAnimationPromise;\n                    }\n                },\n\n                _fireAnimationEvent: function (type) {\n                    var animationEvent = _Global.document.createEvent(\"CustomEvent\"),\n                        animationPromise = Promise.wrap();\n\n                    animationEvent.initCustomEvent(\"contentanimating\", true, true, {\n                        type: type\n                    });\n                    if (type === ListViewAnimationType.entrance) {\n                        animationEvent.detail.setPromise = function (delayPromise) {\n                            animationPromise = delayPromise;\n                        };\n                    }\n                    var prevented = !this._element.dispatchEvent(animationEvent);\n                    return {\n                        prevented: prevented,\n                        animationPromise: animationPromise\n                    };\n                },\n\n                // If they don't yet exist, create the start and end markers which are required\n                // by Narrator's aria-flowto/flowfrom implementation. They mark the start and end\n                // of ListView's set of out-of-order DOM elements and so they must surround the\n                // headers and groups in the DOM.\n                _createAriaMarkers: function ListView_createAriaMarkers() {\n                    if (!this._viewport.getAttribute(\"aria-label\")) {\n                        this._viewport.setAttribute(\"aria-label\", strings.listViewViewportAriaLabel);\n                    }\n\n                    if (!this._ariaStartMarker) {\n                        this._ariaStartMarker = _Global.document.createElement(\"div\");\n                        this._ariaStartMarker.id = uniqueID(this._ariaStartMarker);\n                        this._viewport.insertBefore(this._ariaStartMarker, this._viewport.firstElementChild);\n                    }\n                    if (!this._ariaEndMarker) {\n                        this._ariaEndMarker = _Global.document.createElement(\"div\");\n                        this._ariaEndMarker.id = uniqueID(this._ariaEndMarker);\n                        this._viewport.appendChild(this._ariaEndMarker);\n                    }\n                },\n\n                // If the ListView is in static mode, then the roles of the list and items should be \"list\" and \"listitem\", respectively.\n                // Otherwise, the roles should be \"listbox\" and \"option.\" If the ARIA roles are out of sync with the ListView's\n                // static/interactive state, update the role of the ListView and the role of each realized item.\n                _updateItemsAriaRoles: function ListView_updateItemsAriaRoles() {\n                    var that = this;\n                    var listRole = this._element.getAttribute(\"role\"),\n                        expectedListRole,\n                        expectedItemRole;\n\n                    if (this._currentMode().staticMode()) {\n                        expectedListRole = \"list\";\n                        expectedItemRole = \"listitem\";\n                    } else {\n                        expectedListRole = \"listbox\";\n                        expectedItemRole = \"option\";\n                    }\n\n                    if (listRole !== expectedListRole || this._itemRole !== expectedItemRole) {\n                        this._element.setAttribute(\"role\", expectedListRole);\n                        this._itemRole = expectedItemRole;\n                        this._view.items.each(function (index, itemElement) {\n                            itemElement.setAttribute(\"role\", that._itemRole);\n                        });\n                    }\n                },\n\n                _updateGroupHeadersAriaRoles: function ListView_updateGroupHeadersAriaRoles() {\n                    var headerRole = (this.groupHeaderTapBehavior === _UI.GroupHeaderTapBehavior.none ? \"separator\" : \"link\");\n                    if (this._headerRole !== headerRole) {\n                        this._headerRole = headerRole;\n                        for (var i = 0, len = this._groups.length() ; i < len; i++) {\n                            var header = this._groups.group(i).header;\n                            if (header) {\n                                header.setAttribute(\"role\", this._headerRole);\n                            }\n                        }\n                    }\n                },\n\n                // Avoids unnecessary UIA selection events by only updating aria-selected if it has changed\n                _setAriaSelected: function ListView_setAriaSelected(itemElement, isSelected) {\n                    var ariaSelected = (itemElement.getAttribute(\"aria-selected\") === \"true\");\n\n                    if (isSelected !== ariaSelected) {\n                        itemElement.setAttribute(\"aria-selected\", isSelected);\n                    }\n                },\n\n                _setupAriaSelectionObserver: function ListView_setupAriaSelectionObserver(item) {\n                    if (!item._mutationObserver) {\n                        this._mutationObserver.observe(item, { attributes: true, attributeFilter: [\"aria-selected\"] });\n                        item._mutationObserver = true;\n                    }\n                },\n\n                _itemPropertyChange: function ListView_itemPropertyChange(list) {\n                    if (this._isZombie()) { return; }\n\n                    var that = this;\n                    var singleSelection = that._selectionMode === _UI.SelectionMode.single;\n                    var changedItems = [];\n                    var unselectableItems = [];\n\n                    function revertAriaSelected(items) {\n                        items.forEach(function (entry) {\n                            entry.item.setAttribute(\"aria-selected\", !entry.selected);\n                        });\n                    }\n\n                    for (var i = 0, len = list.length; i < len; i++) {\n                        var item = list[i].target;\n                        var itemBox = that._view.items.itemBoxFrom(item);\n                        var selected = item.getAttribute(\"aria-selected\") === \"true\";\n\n                        // Only respond to aria-selected changes coming from UIA. This check\n                        // relies on the fact that, in renderSelection, we update the selection\n                        // visual before aria-selected.\n                        if (itemBox && (selected !== _ElementUtilities._isSelectionRendered(itemBox))) {\n                            var index = that._view.items.index(itemBox);\n                            var entry = { index: index, item: item, selected: selected };\n                            (that._selectionAllowed(index) ? changedItems : unselectableItems).push(entry);\n                        }\n                    }\n                    if (changedItems.length > 0) {\n                        var signal = new _Signal();\n                        that.selection._synchronize(signal).then(function () {\n                            var newSelection = that.selection._cloneSelection();\n\n                            changedItems.forEach(function (entry) {\n                                if (entry.selected) {\n                                    newSelection[singleSelection ? \"set\" : \"add\"](entry.index);\n                                } else {\n                                    newSelection.remove(entry.index);\n                                }\n                            });\n\n                            return that.selection._set(newSelection);\n                        }).then(function (approved) {\n                            if (!that._isZombie() && !approved) {\n                                // A selectionchanging event handler rejected the selection change\n                                revertAriaSelected(changedItems);\n                            }\n\n                            signal.complete();\n                        });\n                    }\n\n                    revertAriaSelected(unselectableItems);\n                },\n\n                _groupsEnabled: function () {\n                    return !!this._groups.groupDataSource;\n                },\n\n                _getItemPosition: function ListView_getItemPosition(entity, preserveItemsBlocks) {\n                    var that = this;\n                    return this._view.waitForEntityPosition(entity).then(function () {\n                        var container,\n                            alreadyCorrectedForCanvasMargins = (that._zooming && that._canvasStart !== 0);\n\n                        switch (entity.type) {\n                            case _UI.ObjectType.item:\n                                container = that._view.getContainer(entity.index);\n                                break;\n                            case _UI.ObjectType.groupHeader:\n                                container = that._view._getHeaderContainer(entity.index);\n                                break;\n                            case _UI.ObjectType.header:\n                                alreadyCorrectedForCanvasMargins = true;\n                                container = that._headerContainer;\n                                break;\n                            case _UI.ObjectType.footer:\n                                alreadyCorrectedForCanvasMargins = true;\n                                container = that._footerContainer;\n                                break;\n                        }\n\n                        if (container) {\n                            that._writeProfilerMark(\"WinJS.UI.ListView:getItemPosition,info\");\n                            var itemsBlockFrom;\n                            var itemsBlockTo;\n                            if (that._view._expandedRange) {\n                                itemsBlockFrom = that._view._expandedRange.first.index;\n                                itemsBlockTo = that._view._expandedRange.last.index;\n                            } else {\n                                preserveItemsBlocks = false;\n                            }\n\n                            if (entity.type === _UI.ObjectType.item) {\n                                preserveItemsBlocks = !!preserveItemsBlocks;\n                                preserveItemsBlocks &= that._view._ensureContainerInDOM(entity.index);\n                            } else {\n                                preserveItemsBlocks = false;\n                            }\n\n                            var margins = that._getItemMargins(entity.type),\n                                position = {\n                                    left: (that._rtl() ? getOffsetRight(container) - margins.right : container.offsetLeft - margins.left),\n                                    top: container.offsetTop - margins.top,\n                                    totalWidth: _ElementUtilities.getTotalWidth(container),\n                                    totalHeight: _ElementUtilities.getTotalHeight(container),\n                                    contentWidth: _ElementUtilities.getContentWidth(container),\n                                    contentHeight: _ElementUtilities.getContentHeight(container)\n                                };\n\n                            if (preserveItemsBlocks) {\n                                that._view._forceItemsBlocksInDOM(itemsBlockFrom, itemsBlockTo + 1);\n                            }\n\n                            // When a translation is applied to the surface during zooming, offsetLeft includes the canvas margins, so the left/top position will already be in canvas coordinates.\n                            // If we're not zooming, we need to convert the position to canvas coordinates before returning.\n                            // We also want to skip correcting for canvas margins when we're looking at the position of the layout header or footer, since they aren't parented under the canvas.\n                            return (alreadyCorrectedForCanvasMargins ? position : that._convertToCanvasCoordinates(position));\n                        } else {\n                            return Promise.cancel;\n                        }\n                    });\n                },\n\n                _getItemOffset: function ListView_getItemOffset(entity, preserveItemsBlocks) {\n                    var that = this;\n                    return this._getItemPosition(entity, preserveItemsBlocks).then(function (pos) {\n                        // _getItemOffset also includes the right/bottom margin of the previous row/column of items, so that ensureVisible/indexOfFirstVisible will jump such that\n                        // the previous row/column is directly offscreen of the target item.\n                        var margins = that._getItemMargins(entity.type);\n                        if (that._horizontal()) {\n                            var rtl = that._rtl();\n                            pos.begin = pos.left - margins[rtl ? \"left\" : \"right\"];\n                            pos.end = pos.left + pos.totalWidth + margins[rtl ? \"right\" : \"left\"];\n                        } else {\n                            pos.begin = pos.top - margins.bottom;\n                            pos.end = pos.top + pos.totalHeight + margins.top;\n                        }\n                        return pos;\n                    });\n                },\n\n                _getItemMargins: function ListView_getItemMargins(type) {\n                    type = type || _UI.ObjectType.item;\n                    var that = this;\n                    var calculateMargins = function (className) {\n                        var item = that._canvas.querySelector(\".\" + className),\n                                cleanup;\n\n                        if (!item) {\n                            item = _Global.document.createElement(\"div\"),\n                            _ElementUtilities.addClass(item, className);\n                            that._viewport.appendChild(item);\n\n                            cleanup = true;\n                        }\n\n                        var margins = _Layouts._getMargins(item);\n\n                        if (cleanup) {\n                            that._viewport.removeChild(item);\n                        }\n                        return margins;\n                    };\n\n                    if (type === _UI.ObjectType.item) {\n                        return (this._itemMargins ? this._itemMargins : (this._itemMargins = calculateMargins(_Constants._containerClass)));\n                    } else if (type === _UI.ObjectType.groupHeader) {\n                        return (this._headerMargins ? this._headerMargins : (this._headerMargins = calculateMargins(_Constants._headerContainerClass)));\n                    } else {\n                        if (!this._headerFooterMargins) {\n                            this._headerFooterMargins = {\n                                headerMargins: calculateMargins(_Constants._listHeaderContainerClass),\n                                footerMargins: calculateMargins(_Constants._listFooterContainerClass)\n                            };\n                        }\n                        return this._headerFooterMargins[(type === _UI.ObjectType.header ? \"headerMargins\" : \"footerMargins\")];\n                    }\n                },\n\n                _fireAccessibilityAnnotationCompleteEvent: function ListView_fireAccessibilityAnnotationCompleteEvent(firstIndex, lastIndex, firstHeaderIndex, lastHeaderIndex) {\n                    // This event is fired in these cases:\n                    // - When the data source count is 0, it is fired after the aria markers have been\n                    //   updated. The event detail will be { firstIndex: -1, lastIndex: -1 }.\n                    // - When the data source count is non-zero, it is fired after the aria markers\n                    //   have been updated and the deferred work for the aria properties on the items\n                    //   has completed.\n                    // - When an item gets focus. The event will be { firstIndex: indexOfItem, lastIndex: indexOfItem }.\n                    var detail = {\n                        firstIndex: firstIndex,\n                        lastIndex: lastIndex,\n                        firstHeaderIndex: (+firstHeaderIndex) || -1,\n                        lastHeaderIndex: (+lastHeaderIndex) || -1\n                    };\n                    var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                    eventObject.initCustomEvent(\"accessibilityannotationcomplete\", true, false, detail);\n                    this._element.dispatchEvent(eventObject);\n                },\n\n                _ensureFirstColumnRange: function ListView_ensureFirstColumnRange(type) {\n                    if (type === _UI.ObjectType.header || type === _UI.ObjectType.footer) {\n                        // No corrections are necessary for the layout header or footer, since they exist outside of the canvas\n                        return Promise.wrap();\n                    }\n                    var propName = (type === _UI.ObjectType.item ? \"_firstItemRange\" : \"_firstHeaderRange\");\n                    if (!this[propName]) {\n                        var that = this;\n                        return this._getItemOffset({ type: type, index: 0 }, true).then(function (firstRange) {\n                            that[propName] = firstRange;\n                        });\n                    } else {\n                        return Promise.wrap();\n                    }\n                },\n\n                _correctRangeInFirstColumn: function ListView_correctRangeInFirstColumn(range, type) {\n                    if (type === _UI.ObjectType.header || type === _UI.ObjectType.footer) {\n                        // No corrections are necessary for the layout header or footer, since they exist outside of the canvas\n                        return range;\n                    }\n                    var firstRange = (type === _UI.ObjectType.groupHeader ? this._firstHeaderRange : this._firstItemRange);\n                    if (firstRange.begin === range.begin) {\n                        if (this._horizontal()) {\n                            range.begin = -this._getCanvasMargins()[this._rtl() ? \"right\" : \"left\"];\n                        } else {\n                            range.begin = -this._getCanvasMargins().top;\n                        }\n                    }\n                    return range;\n                },\n\n                _updateContainers: function ListView_updateContainers(groups, count, containersDelta, modifiedElements) {\n                    var that = this;\n\n                    // If the ListView is still in the middle of asynchronously creating containers (i.e. createContainersWorker isn't done),\n                    // then we need to cap the number of containers we create here. Without the cap, we'll synchronously finish creating all\n                    // of the containers nullifying the responsiveness benefits of the asynchronous create containers worker. However, if\n                    // the worker has already finished, there's no need for the cap.\n                    var containerCountAfterEdits = this._view.containers.length + containersDelta;\n                    var asyncContainerCreationInProgress = containerCountAfterEdits < count;\n                    var maxContainers;\n                    if (asyncContainerCreationInProgress) {\n                        // Just create enough containers to handle the edits in the realized range. We need to create at least\n                        // this many containers so that we can play the edit animations.\n                        var countInsertedInRealizedRange = 0;\n                        for (var i = 0; i < modifiedElements.length; i++) {\n                            if (modifiedElements[i].oldIndex === -1) {\n                                countInsertedInRealizedRange++;\n                            }\n                        }\n                        maxContainers = this._view.containers.length + countInsertedInRealizedRange;\n                    } else {\n                        // Create enough containers for every item in the data source.\n                        maxContainers = count;\n                    }\n\n                    var newTree = [];\n                    var newKeyToGroupIndex = {};\n                    var newContainers = [];\n                    var removedContainers = [];\n\n                    function createContainer() {\n                        var element = _Global.document.createElement(\"div\");\n                        element.className = _Constants._containerClass;\n                        return element;\n                    }\n\n                    function updateExistingGroupWithBlocks(groupNode, firstItem, newSize) {\n                        if (firstItem + newSize > maxContainers) {\n                            newSize = maxContainers - firstItem;\n                        }\n\n                        var itemsContainer = groupNode.itemsContainer,\n                            blocks = itemsContainer.itemsBlocks,\n                            blockSize = that._view._blockSize,\n                            lastBlock = blocks.length ? blocks[blocks.length - 1] : null,\n                            indexOfNextGroupItem = blocks.length ? (blocks.length - 1) * blockSize + lastBlock.items.length : 0,\n                            delta = newSize - indexOfNextGroupItem,\n                            children;\n\n                        if (delta > 0) {\n                            // Insert new containers.\n                            var toAdd = delta,\n                                sizeOfOldLastBlock;\n\n                            // 1) Add containers to the last itemsblock in the group if it's not already full.\n                            if (lastBlock && lastBlock.items.length < blockSize) {\n                                var emptySpotsToFill = Math.min(toAdd, blockSize - lastBlock.items.length);\n                                sizeOfOldLastBlock = lastBlock.items.length;\n\n                                var containersMarkup = _Helpers._stripedContainers(emptySpotsToFill, indexOfNextGroupItem);\n\n                                _SafeHtml.insertAdjacentHTMLUnsafe(lastBlock.element, \"beforeend\", containersMarkup);\n                                children = lastBlock.element.children;\n\n                                for (var j = 0; j < emptySpotsToFill; j++) {\n                                    lastBlock.items.push(children[sizeOfOldLastBlock + j]);\n                                }\n\n                                toAdd -= emptySpotsToFill;\n                            }\n                            indexOfNextGroupItem = blocks.length * blockSize;\n\n                            // 2) Generate as many full itemblocks of containers as we can.\n                            var newBlocksCount = Math.floor(toAdd / blockSize),\n                                markup = \"\",\n                                firstBlockFirstItemIndex = indexOfNextGroupItem,\n                                secondBlockFirstItemIndex = indexOfNextGroupItem + blockSize;\n\n                            if (newBlocksCount > 0) {\n                                var pairOfItemBlocks = [\n                                    // Use pairs to ensure that the container striping pattern is maintained regardless if blockSize is even or odd.\n                                    \"<div class='win-itemsblock'>\" + _Helpers._stripedContainers(blockSize, firstBlockFirstItemIndex) + \"</div>\",\n                                    \"<div class='win-itemsblock'>\" + _Helpers._stripedContainers(blockSize, secondBlockFirstItemIndex) + \"</div>\"\n                                ];\n                                markup = _Helpers._repeat(pairOfItemBlocks, newBlocksCount);\n                                indexOfNextGroupItem += (newBlocksCount * blockSize);\n                            }\n\n                            // 3) Generate and partially fill, one last itemblock if there are any remaining containers to add.\n                            var sizeOfNewLastBlock = toAdd % blockSize;\n                            if (sizeOfNewLastBlock > 0) {\n                                markup += \"<div class='win-itemsblock'>\" + _Helpers._stripedContainers(sizeOfNewLastBlock, indexOfNextGroupItem) + \"</div>\";\n                                indexOfNextGroupItem += sizeOfNewLastBlock;\n                                newBlocksCount++;\n                            }\n\n                            var blocksTemp = _Global.document.createElement(\"div\");\n                            _SafeHtml.setInnerHTMLUnsafe(blocksTemp, markup);\n                            var children = blocksTemp.children;\n\n                            for (var j = 0; j < newBlocksCount; j++) {\n                                var block = children[j],\n                                    blockNode = {\n                                        element: block,\n                                        items: _Helpers._nodeListToArray(block.children)\n                                    };\n                                blocks.push(blockNode);\n                            }\n                        } else if (delta < 0) {\n                            // Remove Containers\n                            for (var n = delta; n < 0; n++) {\n\n                                var container = lastBlock.items.pop();\n\n                                if (!that._view._requireFocusRestore && container.contains(_Global.document.activeElement)) {\n                                    that._view._requireFocusRestore = _Global.document.activeElement;\n                                    that._unsetFocusOnItem();\n                                }\n\n                                lastBlock.element.removeChild(container);\n                                removedContainers.push(container);\n\n                                if (!lastBlock.items.length) {\n                                    if (itemsContainer.element === lastBlock.element.parentNode) {\n                                        itemsContainer.element.removeChild(lastBlock.element);\n                                    }\n\n                                    blocks.pop();\n                                    lastBlock = blocks[blocks.length - 1];\n                                }\n                            }\n                        }\n\n                        // Update references to containers.\n                        for (var j = 0, len = blocks.length; j < len; j++) {\n                            var block = blocks[j];\n                            for (var n = 0; n < block.items.length; n++) {\n                                newContainers.push(block.items[n]);\n                            }\n                        }\n                    }\n\n                    function addInserted(groupNode, firstItemIndex, newSize) {\n                        var added = modifiedElements.filter(function (entry) {\n                            return (entry.oldIndex === -1 && entry.newIndex >= firstItemIndex && entry.newIndex < (firstItemIndex + newSize));\n                        }).sort(function (left, right) {\n                            return left.newIndex - right.newIndex;\n                        });\n\n                        var itemsContainer = groupNode.itemsContainer;\n\n                        for (var i = 0, len = added.length; i < len; i++) {\n                            var entry = added[i],\n                                offset = entry.newIndex - firstItemIndex;\n\n                            var container = createContainer(),\n                                next = offset < itemsContainer.items.length ? itemsContainer.items[offset] : null;\n                            itemsContainer.items.splice(offset, 0, container);\n                            itemsContainer.element.insertBefore(container, next);\n                        }\n                    }\n\n                    function updateExistingGroup(groupNode, firstItem, newSize) {\n                        if (firstItem + newSize > maxContainers) {\n                            newSize = maxContainers - firstItem;\n                        }\n\n                        var itemsContainer = groupNode.itemsContainer,\n                            delta = newSize - itemsContainer.items.length;\n\n                        if (delta > 0) {\n                            var children = itemsContainer.element.children,\n                                oldSize = children.length;\n\n                            _SafeHtml.insertAdjacentHTMLUnsafe(itemsContainer.element, \"beforeend\", _Helpers._repeat(\"<div class='win-container win-backdrop'></div>\", delta));\n\n                            for (var n = 0; n < delta; n++) {\n                                var container = children[oldSize + n];\n                                itemsContainer.items.push(container);\n                            }\n                        }\n\n                        for (var n = delta; n < 0; n++) {\n                            var container = itemsContainer.items.pop();\n                            itemsContainer.element.removeChild(container);\n                            removedContainers.push(container);\n                        }\n\n                        for (var n = 0, len = itemsContainer.items.length; n < len; n++) {\n                            newContainers.push(itemsContainer.items[n]);\n                        }\n                    }\n\n                    function addNewGroup(groupInfo, firstItem) {\n                        var header = that._view._createHeaderContainer(prevElement);\n\n                        var groupNode = {\n                            header: header,\n                            itemsContainer: {\n                                element: that._view._createItemsContainer(header),\n                            }\n                        };\n\n                        groupNode.itemsContainer[that._view._blockSize ? \"itemsBlocks\" : \"items\"] = [];\n\n                        if (that._view._blockSize) {\n                            updateExistingGroupWithBlocks(groupNode, firstItem, groupInfo.size);\n                        } else {\n                            updateExistingGroup(groupNode, firstItem, groupInfo.size);\n                        }\n\n                        return groupNode;\n                    }\n\n                    function shift(groupNode, oldFirstItemIndex, currentFirstItemIndex, newSize) {\n                        var currentLast = currentFirstItemIndex + newSize - 1,\n                            firstShifted,\n                            delta;\n\n                        for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                            var entry = modifiedElements[i];\n                            if (entry.newIndex >= currentFirstItemIndex && entry.newIndex <= currentLast && entry.oldIndex !== -1) {\n                                if (firstShifted !== +firstShifted || entry.newIndex < firstShifted) {\n                                    firstShifted = entry.newIndex;\n                                    delta = entry.newIndex - entry.oldIndex;\n                                }\n                            }\n                        }\n\n                        if (firstShifted === +firstShifted) {\n                            var addedBeforeShift = 0;\n                            for (i = 0, len = modifiedElements.length; i < len; i++) {\n                                var entry = modifiedElements[i];\n                                if (entry.newIndex >= currentFirstItemIndex && entry.newIndex < firstShifted && entry.oldIndex === -1) {\n                                    addedBeforeShift++;\n                                }\n                            }\n                            var removedBeforeShift = 0,\n                                oldFirstShifted = firstShifted - delta;\n                            for (i = 0, len = modifiedElements.length; i < len; i++) {\n                                var entry = modifiedElements[i];\n                                if (entry.oldIndex >= oldFirstItemIndex && entry.oldIndex < oldFirstShifted && entry.newIndex === -1) {\n                                    removedBeforeShift++;\n                                }\n                            }\n\n                            delta += removedBeforeShift;\n                            delta -= addedBeforeShift;\n                            delta -= currentFirstItemIndex - oldFirstItemIndex;\n\n                            var itemsContainer = groupNode.itemsContainer;\n\n                            if (delta > 0) {\n                                var children = itemsContainer.element.children;\n\n                                _SafeHtml.insertAdjacentHTMLUnsafe(itemsContainer.element, \"afterBegin\", _Helpers._repeat(\"<div class='win-container win-backdrop'></div>\", delta));\n\n                                for (var n = 0; n < delta; n++) {\n                                    var container = children[n];\n                                    itemsContainer.items.splice(n, 0, container);\n                                }\n                            }\n\n                            for (var n = delta; n < 0; n++) {\n                                var container = itemsContainer.items.shift();\n                                itemsContainer.element.removeChild(container);\n                            }\n\n                            if (delta) {\n                                // Invalidate the layout of the entire group because we do not know the exact indices which were added/modified since they were before the realization range.\n                                that._affectedRange.add({\n                                    start: currentFirstItemIndex,\n                                    end: currentFirstItemIndex + newSize\n                                }, count);\n                            }\n                        }\n                    }\n\n                    function flatIndexToGroupIndex(index) {\n                        var firstItem = 0;\n                        for (var i = 0, len = that._view.tree.length; i < len; i++) {\n                            var group = that._view.tree[i],\n                                size = group.itemsContainer.items.length,\n                                lastItem = firstItem + size - 1;\n\n                            if (index >= firstItem && index <= lastItem) {\n                                return {\n                                    group: i,\n                                    item: index - firstItem\n                                };\n                            }\n\n                            firstItem += size;\n                        }\n                    }\n\n                    var oldFirstItem = [];\n                    var firstItem = 0;\n                    if (!that._view._blockSize) {\n                        for (var i = 0, len = this._view.tree.length; i < len; i++) {\n                            oldFirstItem.push(firstItem);\n                            firstItem += this._view.tree[i].itemsContainer.items.length;\n                        }\n                    }\n\n                    if (!that._view._blockSize) {\n                        var removed = modifiedElements.filter(function (entry) {\n                            return entry.newIndex === -1 && !entry._removalHandled;\n                        }).sort(function (left, right) {\n                            return right.oldIndex - left.oldIndex;\n                        });\n\n                        for (var i = 0, len = removed.length; i < len; i++) {\n                            var entry = removed[i];\n                            entry._removalHandled = true;\n                            var itemBox = entry._itemBox;\n                            entry._itemBox = null;\n\n                            var groupIndex = flatIndexToGroupIndex(entry.oldIndex);\n                            var group = this._view.tree[groupIndex.group];\n\n                            var container = group.itemsContainer.items[groupIndex.item];\n                            container.parentNode.removeChild(container);\n\n                            if (_ElementUtilities.hasClass(itemBox, _Constants._selectedClass)) {\n                                _ElementUtilities.addClass(container, _Constants._selectedClass);\n                            }\n\n                            group.itemsContainer.items.splice(groupIndex.item, 1);\n\n                            entry.element = container;\n                        }\n                    }\n\n                    this._view._modifiedGroups = [];\n\n                    var prevElement = this._canvasProxy;\n                    firstItem = 0;\n                    // When groups are disabled, loop thru all of the groups (there's only 1).\n                    // When groups are enabled, loop until either we exhaust all of the groups in the data source\n                    // or we exhaust all of the containers that have been created so far.\n                    for (var i = 0, len = groups.length; i < len && (!this._groupsEnabled() || firstItem < maxContainers) ; i++) {\n                        var groupInfo = groups[i],\n                            existingGroupIndex = this._view.keyToGroupIndex[groupInfo.key],\n                            existingGroup = this._view.tree[existingGroupIndex];\n\n                        if (existingGroup) {\n                            if (that._view._blockSize) {\n                                updateExistingGroupWithBlocks(existingGroup, firstItem, groupInfo.size);\n                            } else {\n                                shift(existingGroup, oldFirstItem[existingGroupIndex], firstItem, groupInfo.size);\n                                addInserted(existingGroup, firstItem, groupInfo.size);\n                                updateExistingGroup(existingGroup, firstItem, groupInfo.size);\n                            }\n                            newTree.push(existingGroup);\n                            newKeyToGroupIndex[groupInfo.key] = newTree.length - 1;\n                            delete this._view.keyToGroupIndex[groupInfo.key];\n\n                            prevElement = existingGroup.itemsContainer.element;\n\n                            this._view._modifiedGroups.push({\n                                oldIndex: existingGroupIndex,\n                                newIndex: newTree.length - 1,\n                                element: existingGroup.header\n                            });\n                        } else {\n                            var newGroup = addNewGroup(groupInfo, firstItem);\n                            newTree.push(newGroup);\n                            newKeyToGroupIndex[groupInfo.key] = newTree.length - 1;\n\n                            this._view._modifiedGroups.push({\n                                oldIndex: -1,\n                                newIndex: newTree.length - 1,\n                                element: newGroup.header\n                            });\n\n                            prevElement = newGroup.itemsContainer.element;\n                        }\n                        firstItem += groupInfo.size;\n                    }\n\n                    var removedItemsContainers = [],\n                        removedHeaders = [],\n                        removedGroups = this._view.keyToGroupIndex ? Object.keys(this._view.keyToGroupIndex) : [];\n\n                    for (var i = 0, len = removedGroups.length; i < len; i++) {\n                        var groupIndex = this._view.keyToGroupIndex[removedGroups[i]],\n                            groupNode = this._view.tree[groupIndex];\n\n                        removedHeaders.push(groupNode.header);\n                        removedItemsContainers.push(groupNode.itemsContainer.element);\n\n                        if (this._view._blockSize) {\n                            for (var b = 0; b < groupNode.itemsContainer.itemsBlocks.length; b++) {\n                                var block = groupNode.itemsContainer.itemsBlocks[b];\n                                for (var n = 0; n < block.items.length; n++) {\n                                    removedContainers.push(block.items[n]);\n                                }\n                            }\n                        } else {\n                            for (var n = 0; n < groupNode.itemsContainer.items.length; n++) {\n                                removedContainers.push(groupNode.itemsContainer.items[n]);\n                            }\n                        }\n\n                        this._view._modifiedGroups.push({\n                            oldIndex: groupIndex,\n                            newIndex: -1,\n                            element: groupNode.header\n                        });\n                    }\n\n                    for (var i = 0, len = modifiedElements.length; i < len; i++) {\n                        if (modifiedElements[i].newIndex === -1 && !modifiedElements[i]._removalHandled) {\n                            modifiedElements[i]._removalHandled = true;\n                            var itemBox = modifiedElements[i]._itemBox;\n                            modifiedElements[i]._itemBox = null;\n                            var container;\n                            if (removedContainers.length) {\n                                container = removedContainers.pop();\n                                _ElementUtilities.empty(container);\n                            } else {\n                                container = createContainer();\n                            }\n                            if (_ElementUtilities.hasClass(itemBox, _Constants._selectedClass)) {\n                                _ElementUtilities.addClass(container, _Constants._selectedClass);\n                            }\n                            if (modifiedElements._containerStripe === _Constants._containerEvenClass) {\n                                _ElementUtilities.addClass(container, _Constants._containerEvenClass);\n                                _ElementUtilities.removeClass(container, _Constants._containerOddClass);\n                            } else {\n                                _ElementUtilities.addClass(container, _Constants._containerOddClass);\n                                _ElementUtilities.removeClass(container, _Constants._containerEvenClass);\n                            }\n                            container.appendChild(itemBox);\n                            modifiedElements[i].element = container;\n                        }\n                    }\n\n                    this._view.tree = newTree;\n                    this._view.keyToGroupIndex = newKeyToGroupIndex;\n                    this._view.containers = newContainers;\n\n                    return {\n                        removedHeaders: removedHeaders,\n                        removedItemsContainers: removedItemsContainers\n                    };\n                },\n\n                _writeProfilerMark: function ListView_writeProfilerMark(text) {\n                    var message = \"WinJS.UI.ListView:\" + this._id + \":\" + text;\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, null, \"listviewprofiler\");\n                }\n            }, {\n                // Static members\n\n                triggerDispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.ListView.triggerDispose\">\n                    /// <summary locid=\"WinJS.UI.ListView.triggerDispose\">\n                    /// Triggers the ListView disposal service manually. In normal operation this is triggered\n                    /// at ListView instantiation. However in some scenarios it may be appropriate to run\n                    /// the disposal service manually.\n                    /// </summary>\n                    /// </signature>\n                    disposeControls();\n                }\n\n            });\n            _Base.Class.mix(ListView, _Events.createEventProperties(\n                \"iteminvoked\",\n                \"groupheaderinvoked\",\n                \"selectionchanging\",\n                \"selectionchanged\",\n                \"loadingstatechanged\",\n                \"keyboardnavigating\",\n                \"contentanimating\",\n                \"itemdragstart\",\n                \"itemdragenter\",\n                \"itemdragend\",\n                \"itemdragbetween\",\n                \"itemdragleave\",\n                \"itemdragchanged\",\n                \"itemdragdrop\",\n                \"headervisibilitychanged\",\n                \"footervisibilitychanged\",\n                \"accessibilityannotationcomplete\"));\n            _Base.Class.mix(ListView, _Control.DOMEventMixin);\n            return ListView;\n        })\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/FlipView/_Constants',[\n    ], function constantsInit() {\n    \"use strict\";\n\n    var members = {};\n\n    members.datasourceCountChangedEvent = \"datasourcecountchanged\";\n    members.pageVisibilityChangedEvent = \"pagevisibilitychanged\";\n    members.pageSelectedEvent = \"pageselected\";\n    members.pageCompletedEvent = \"pagecompleted\";\n\n    return members;\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n\ndefine('WinJS/Controls/FlipView/_PageManager',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Log',\n    '../../Core/_Resources',\n    '../../Core/_WriteProfilerMark',\n    '../../Animations',\n    '../../Promise',\n    '../../_Signal',\n    '../../Scheduler',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_TabContainer',\n    './_Constants'\n    ], function flipperPageManagerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, Animations, Promise, _Signal, Scheduler, _Dispose, _ElementUtilities, _TabContainer, _Constants) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n\n        // Definition of our private utility\n        _FlipPageManager: _Base.Namespace._lazy(function () {\n            var uniqueID = _ElementUtilities._uniqueID;\n            var styleEquivalents = _BaseUtils._browserStyleEquivalents;\n\n            var leftBufferAmount = 50,\n                itemSelectedEventDelay = 250;\n\n            var strings = {\n                get badCurrentPage() { return \"Invalid argument: currentPage must be a number greater than or equal to zero and be within the bounds of the datasource\"; }\n            };\n\n            function isFlipper(element) {\n                var control = element.winControl;\n                if (control && control._isFlipView) {\n                    return true;\n                }\n\n                return false;\n            }\n\n            function flipperPropertyChanged(list) {\n                list.forEach(function (record) {\n                    var element = record.target;\n                    if (element.winControl && element.tabIndex >= 0) {\n                        element.winControl._pageManager._updateTabIndex(element.tabIndex);\n                        element.tabIndex = -1;\n                    }\n                    var that = element.winControl;\n                    if (that && that._isFlipView) {\n                        var dirChanged = false;\n                        if (record.attributeName === \"dir\") {\n                            dirChanged = true;\n                        } else if (record.attributeName === \"style\") {\n                            dirChanged = (that._cachedStyleDir !== element.style.direction);\n                        }\n                        if (dirChanged) {\n                            that._cachedStyleDir = element.style.direction;\n                            that._pageManager._rtl = _Global.getComputedStyle(that._pageManager._flipperDiv, null).direction === \"rtl\";\n                            that._pageManager.resized();\n                        }\n                    }\n                });\n            }\n\n            var _FlipPageManager = _Base.Class.define(function _FlipPageManager_ctor(flipperDiv, panningDiv, panningDivContainer, itemsManager, itemSpacing, environmentSupportsTouch, buttonVisibilityHandler) {\n                // Construction\n                this._visibleElements = [];\n                this._flipperDiv = flipperDiv;\n                this._panningDiv = panningDiv;\n                this._panningDivContainer = panningDivContainer;\n                this._buttonVisibilityHandler = buttonVisibilityHandler;\n                this._currentPage = null;\n                this._rtl = _Global.getComputedStyle(this._flipperDiv, null).direction === \"rtl\";\n                this._itemsManager = itemsManager;\n                this._itemSpacing = itemSpacing;\n                this._tabIndex = _ElementUtilities.getTabIndex(flipperDiv);\n                if (this._tabIndex < 0) {\n                    this._tabIndex = 0;\n                }\n                panningDiv.tabIndex = -1;\n                flipperDiv.tabIndex = -1;\n                this._tabManager = new _TabContainer.TabContainer(this._panningDivContainer);\n                this._tabManager.tabIndex = this._tabIndex;\n                this._lastSelectedPage = null;\n                this._lastSelectedElement = null;\n                this._bufferSize = _FlipPageManager.flipPageBufferCount;\n                this._cachedSize = -1;\n                this._environmentSupportsTouch = environmentSupportsTouch;\n\n                var that = this;\n                this._panningDiv.addEventListener(\"keydown\", function (event) {\n                    if (that._blockTabs && event.keyCode === _ElementUtilities.Key.tab) {\n                        event.stopImmediatePropagation();\n                        event.preventDefault();\n                    }\n                }, true);\n                _ElementUtilities._addEventListener(this._flipperDiv, \"focusin\", function (event) {\n                    if (event.target === that._flipperDiv) {\n                        if (that._currentPage.element) {\n                            _ElementUtilities._setActive(that._currentPage.element);\n                        }\n                    }\n                }, false);\n                new _ElementUtilities._MutationObserver(flipperPropertyChanged).observe(this._flipperDiv, { attributes: true, attributeFilter: [\"dir\", \"style\", \"tabindex\"] });\n                this._cachedStyleDir = this._flipperDiv.style.direction;\n\n                this._handleManipulationStateChangedBound = this._handleManipulationStateChanged.bind(this);\n\n                if (this._environmentSupportsTouch) {\n                    this._panningDivContainer.addEventListener(_BaseUtils._browserEventEquivalents[\"manipulationStateChanged\"], this._handleManipulationStateChangedBound, true);\n                }\n            }, {\n                // Public Methods\n\n                initialize: function (initialIndex, isHorizontal) {\n                    var currPage = null;\n                    // Every call to offsetWidth/offsetHeight causes an switch from Script to Layout which affects\n                    // the performance of the control. The values will be cached and will be updated when a resize occurs.\n                    this._panningDivContainerOffsetWidth = this._panningDivContainer.offsetWidth;\n                    this._panningDivContainerOffsetHeight = this._panningDivContainer.offsetHeight;\n                    this._isHorizontal = isHorizontal;\n                    if (!this._currentPage) {\n                        this._bufferAriaStartMarker = _Global.document.createElement(\"div\");\n                        this._bufferAriaStartMarker.id = uniqueID(this._bufferAriaStartMarker);\n                        this._panningDiv.appendChild(this._bufferAriaStartMarker);\n\n                        this._currentPage = this._createFlipPage(null, this);\n                        currPage = this._currentPage;\n                        this._panningDiv.appendChild(currPage.pageRoot);\n\n                        // flipPageBufferCount is added here twice.\n                        // Once for the buffer prior to the current item, and once for the buffer ahead of the current item.\n                        var pagesToInit = 2 * this._bufferSize;\n                        for (var i = 0; i < pagesToInit; i++) {\n                            currPage = this._createFlipPage(currPage, this);\n                            this._panningDiv.appendChild(currPage.pageRoot);\n                        }\n\n                        this._bufferAriaEndMarker = _Global.document.createElement(\"div\");\n                        this._bufferAriaEndMarker.id = uniqueID(this._bufferAriaEndMarker);\n                        this._panningDiv.appendChild(this._bufferAriaEndMarker);\n                    }\n\n                    this._prevMarker = this._currentPage.prev.prev;\n\n                    if (this._itemsManager) {\n                        this.setNewItemsManager(this._itemsManager, initialIndex);\n                    }\n                },\n\n                dispose: function () {\n                    var curPage = this._currentPage;\n\n                    var tmpPage = curPage;\n                    do {\n                        _Dispose._disposeElement(tmpPage.element);\n                        tmpPage = tmpPage.next;\n                    } while (tmpPage !== curPage);\n                },\n\n                setOrientation: function (isHorizontal) {\n                    if (this._notificationsEndedSignal) {\n                        var that = this;\n                        this._notificationsEndedSignal.promise.done(function () {\n                            that._notificationsEndedSignal = null;\n                            that.setOrientation(isHorizontal);\n                        });\n                        return;\n                    }\n\n                    if (isHorizontal === this._isHorizontal) {\n                        return;\n                    }\n\n                    this._isOrientationChanging = true;\n\n                    if (this._isHorizontal) {\n                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollLeft: this._getItemStart(this._currentPage), scrollTop: 0 });\n                    } else {\n                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollLeft: 0, scrollTop: this._getItemStart(this._currentPage) });\n                    }\n                    this._isHorizontal = isHorizontal;\n\n                    var containerStyle = this._panningDivContainer.style;\n                    containerStyle.overflowX = \"hidden\";\n                    containerStyle.overflowY = \"hidden\";\n\n                    var that = this;\n                    _BaseUtils._requestAnimationFrame(function () {\n                        that._isOrientationChanging = false;\n                        that._forEachPage(function (curr) {\n                            var currStyle = curr.pageRoot.style;\n                            currStyle.left = \"0px\";\n                            currStyle.top = \"0px\";\n                        });\n                        containerStyle.overflowX = ((that._isHorizontal && that._environmentSupportsTouch) ? \"scroll\" : \"hidden\");\n                        containerStyle.overflowY = ((that._isHorizontal || !that._environmentSupportsTouch) ? \"hidden\" : \"scroll\");\n                        that._ensureCentered();\n                    });\n                },\n\n                resetState: function (initialIndex) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:resetState,info\");\n                    if (initialIndex !== 0) {\n                        var indexValid = this.jumpToIndex(initialIndex, true);\n                        if (!indexValid && _BaseUtils.validation) {\n                            throw new _ErrorFromName(\"WinJS.UI.FlipView.BadCurrentPage\", strings.badCurrentPage);\n                        }\n                        return indexValid;\n                    } else {\n                        _Dispose.disposeSubTree(this._flipperDiv);\n                        this._resetBuffer(null, true);\n                        var that = this;\n                        var work = Promise.wrap(true);\n                        if (this._itemsManager) {\n                            work = that._itemsManager._firstItem().then(function (e) {\n                                that._currentPage.setElement(e);\n                                return that._fetchPreviousItems(true).\n                                    then(function () {\n                                        return that._fetchNextItems();\n                                    }).then(function () {\n                                        that._setButtonStates();\n                                    });\n                            });\n                        }\n                        return work.then(function () {\n                            that._tabManager.childFocus = that._currentPage.element;\n                            that._ensureCentered();\n                            that._itemSettledOn();\n                        });\n                    }\n                },\n\n                setNewItemsManager: function (manager, initialIndex) {\n                    this._itemsManager = manager;\n                    var that = this;\n                    return this.resetState(initialIndex).then(function () {\n                        // resetState already configures the tabManager, calls _ensureCentered and _itemSettledOn when the initial index is 0\n                        if (initialIndex !== 0) {\n                            that._tabManager.childFocus = that._currentPage.element;\n                            that._ensureCentered();\n                            that._itemSettledOn();\n                        }\n                    });\n                },\n\n                currentIndex: function () {\n                    if (!this._itemsManager) {\n                        return 0;\n                    }\n                    var index = 0;\n                    var element = (this._navigationAnimationRecord ? this._navigationAnimationRecord.newCurrentElement : this._currentPage.element);\n                    if (element) {\n                        index = this._getElementIndex(element);\n                    }\n                    return index;\n                },\n\n                resetScrollPos: function () {\n                    this._ensureCentered();\n                },\n\n                scrollPosChanged: function () {\n\n                    if (this._hasFocus) {\n                        this._hadFocus = true;\n                    }\n\n                    if (!this._itemsManager || !this._currentPage.element || this._isOrientationChanging) {\n                        return;\n                    }\n\n                    var newPos = this._getViewportStart(),\n                        bufferEnd = (this._lastScrollPos > newPos ? this._getTailOfBuffer() : this._getHeadOfBuffer());\n\n                    if (newPos === this._lastScrollPos) {\n                        return;\n                    }\n\n                    while (this._currentPage.element && this._getItemStart(this._currentPage) > newPos && this._currentPage.prev.element) {\n                        this._currentPage = this._currentPage.prev;\n                        this._fetchOnePrevious(bufferEnd.prev);\n                        bufferEnd = bufferEnd.prev;\n                    }\n\n                    while (this._currentPage.element && this._itemEnd(this._currentPage) <= newPos && this._currentPage.next.element) {\n                        this._currentPage = this._currentPage.next;\n                        this._fetchOneNext(bufferEnd.next);\n                        bufferEnd = bufferEnd.next;\n                    }\n                    this._setButtonStates();\n                    this._checkElementVisibility(false);\n                    this._blockTabs = true;\n                    this._lastScrollPos = newPos;\n                    if (this._currentPage.element) {\n                        this._tabManager.childFocus = this._currentPage.element;\n                    }\n                    this._setListEnds();\n\n                    if (!this._manipulationState && this._viewportOnItemStart()) {\n                        // Setup a timeout to invoke _itemSettledOn in cases where the scroll position is changed, and the control\n                        // does not know when it has settled on an item (e.g. 1-finger swipe with narrator touch).\n                        this._currentPage.element.setAttribute(\"aria-setsize\", this._cachedSize);\n                        this._currentPage.element.setAttribute(\"aria-posinset\", this.currentIndex() + 1);\n                        this._timeoutPageSelection();\n                    }\n                },\n\n                itemRetrieved: function (real, placeholder) {\n                    var that = this;\n                    this._forEachPage(function (curr) {\n                        if (curr.element === placeholder) {\n                            if (curr === that._currentPage || curr === that._currentPage.next) {\n                                that._changeFlipPage(curr, placeholder, real);\n                            } else {\n                                curr.setElement(real, true);\n                            }\n                            return true;\n                        }\n                    });\n                    if (this._navigationAnimationRecord && this._navigationAnimationRecord.elementContainers) {\n                        var animatingElements = this._navigationAnimationRecord.elementContainers;\n                        for (var i = 0, len = animatingElements.length; i < len; i++) {\n                            if (animatingElements[i].element === placeholder) {\n                                that._changeFlipPage(animatingElements[i], placeholder, real);\n                                animatingElements[i].element = real;\n                            }\n                        }\n                    }\n                    this._checkElementVisibility(false);\n                },\n\n                resized: function () {\n                    this._panningDivContainerOffsetWidth = this._panningDivContainer.offsetWidth;\n                    this._panningDivContainerOffsetHeight = this._panningDivContainer.offsetHeight;\n                    var that = this;\n                    this._forEachPage(function (curr) {\n                        curr.pageRoot.style.width = that._panningDivContainerOffsetWidth + \"px\";\n                        curr.pageRoot.style.height = that._panningDivContainerOffsetHeight + \"px\";\n                    });\n\n                    // Call _ensureCentered to adjust all the width/height of the pages in the buffer\n                    this._ensureCentered();\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:resize,StopTM\");\n                },\n\n                jumpToIndex: function (index, forceJump) {\n                    // If we force jumping to an index, we are not interested in making sure that there is distance\n                    // between the current and the new index.\n                    if (!forceJump) {\n                        if (!this._itemsManager || !this._currentPage.element || index < 0) {\n                            return Promise.wrap(false);\n                        }\n\n                        // If we have to keep our pages in memory, we need to iterate through every single item from our current position to the desired target\n                        var currIndex = this._getElementIndex(this._currentPage.element),\n                            distance = Math.abs(index - currIndex);\n\n                        if (distance === 0) {\n                            return Promise.wrap(false);\n                        }\n                    }\n\n                    var tail = Promise.wrap(true);\n                    var that = this;\n\n                    tail = tail.then(function () {\n                        var itemPromise = that._itemsManager._itemPromiseAtIndex(index);\n                        return Promise.join({\n                            element: that._itemsManager._itemFromItemPromise(itemPromise),\n                            item: itemPromise\n                        }).then(function (v) {\n                            var elementAtIndex = v.element;\n\n                            // Reset the buffer regardless of whether we have elementAtIndex or not\n                            that._resetBuffer(elementAtIndex, forceJump);\n\n                            if (!elementAtIndex) {\n                                return false;\n                            }\n\n                            that._currentPage.setElement(elementAtIndex);\n                            return that._fetchNextItems().\n                                then(function () {\n                                    return that._fetchPreviousItems(true);\n                                }).\n                                then(function () {\n                                    return true;\n                                });\n                        });\n                    });\n                    tail = tail.then(function (v) {\n                        that._setButtonStates();\n                        return v;\n                    });\n\n                    return tail;\n                },\n\n                startAnimatedNavigation: function (goForward, cancelAnimationCallback, completionCallback) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:startAnimatedNavigation,info\");\n                    if (this._currentPage.element) {\n                        var outgoingPage = this._currentPage,\n                            incomingPage = (goForward ? this._currentPage.next : this._currentPage.prev);\n\n                        if (incomingPage.element) {\n                            if (this._hasFocus) {\n                                // Give focus to the panning div ONLY if anything inside the flipview control currently has\n                                // focus; otherwise, it will be lost when the current page is animated during the navigation.\n                                _ElementUtilities._setActive(this._panningDiv);\n                            }\n                            this._navigationAnimationRecord = {};\n                            this._navigationAnimationRecord.goForward = goForward;\n                            this._navigationAnimationRecord.cancelAnimationCallback = cancelAnimationCallback;\n                            this._navigationAnimationRecord.completionCallback = completionCallback;\n                            this._navigationAnimationRecord.oldCurrentPage = outgoingPage;\n                            this._navigationAnimationRecord.newCurrentPage = incomingPage;\n                            var outgoingElement = outgoingPage.element;\n                            var incomingElement = incomingPage.element;\n                            this._navigationAnimationRecord.newCurrentElement = incomingElement;\n\n                            // When a page element is animated during a navigation, it is temporarily appended on a different container during the animation (see _createDiscardablePage).\n                            // However, updates in the data source can happen (change, remove, insert, etc) during the animation affecting the element that is being animated.\n                            // Therefore, the page object also maintains the elementUniqueID, and the functions that deal with re-building the internal buffer (shifting/remove/etc)\n                            // do all the comparissons, based on the page.elementUniqueID that way even if the element of the page is being animated, we are able to restore/discard it\n                            // into the internal buffer back in the correct place.\n                            outgoingPage.setElement(null, true);\n                            outgoingPage.elementUniqueID = uniqueID(outgoingElement);\n                            incomingPage.setElement(null, true);\n                            incomingPage.elementUniqueID = uniqueID(incomingElement);\n\n                            var outgoingFlipPage = this._createDiscardablePage(outgoingElement),\n                                incomingFlipPage = this._createDiscardablePage(incomingElement);\n\n                            outgoingFlipPage.pageRoot.itemIndex = this._getElementIndex(outgoingElement);\n                            incomingFlipPage.pageRoot.itemIndex = outgoingFlipPage.pageRoot.itemIndex + (goForward ? 1 : -1);\n                            outgoingFlipPage.pageRoot.style.position = \"absolute\";\n                            incomingFlipPage.pageRoot.style.position = \"absolute\";\n                            outgoingFlipPage.pageRoot.style.zIndex = 1;\n                            incomingFlipPage.pageRoot.style.zIndex = 2;\n                            this._setItemStart(outgoingFlipPage, 0);\n                            this._setItemStart(incomingFlipPage, 0);\n                            this._blockTabs = true;\n                            this._visibleElements.push(incomingElement);\n                            this._announceElementVisible(incomingElement);\n                            this._navigationAnimationRecord.elementContainers = [outgoingFlipPage, incomingFlipPage];\n                            return {\n                                outgoing: outgoingFlipPage,\n                                incoming: incomingFlipPage\n                            };\n                        }\n                    }\n                    return null;\n                },\n\n                endAnimatedNavigation: function (goForward, outgoing, incoming) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:endAnimatedNavigation,info\");\n                    if (this._navigationAnimationRecord &&\n                        this._navigationAnimationRecord.oldCurrentPage &&\n                        this._navigationAnimationRecord.newCurrentPage) {\n                        var outgoingRemoved = this._restoreAnimatedElement(this._navigationAnimationRecord.oldCurrentPage, outgoing);\n                        this._restoreAnimatedElement(this._navigationAnimationRecord.newCurrentPage, incoming);\n                        if (!outgoingRemoved) {\n                            // Advance only when the element in the current page was not removed because if it did, all the pages\n                            // were shifted.\n                            this._setViewportStart(this._getItemStart(goForward ? this._currentPage.next : this._currentPage.prev));\n                        }\n                        this._navigationAnimationRecord = null;\n                        this._itemSettledOn();\n                    }\n                },\n\n                startAnimatedJump: function (index, cancelAnimationCallback, completionCallback) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:startAnimatedJump,info\");\n\n                    if (this._hasFocus) {\n                        this._hadFocus = true;\n                    }\n                    if (this._currentPage.element) {\n                        var oldElement = this._currentPage.element;\n                        var oldIndex = this._getElementIndex(oldElement);\n                        var that = this;\n\n                        return that.jumpToIndex(index).then(function (v) {\n                            if (!v) {\n                                return null;\n                            }\n                            that._navigationAnimationRecord = {};\n                            that._navigationAnimationRecord.cancelAnimationCallback = cancelAnimationCallback;\n                            that._navigationAnimationRecord.completionCallback = completionCallback;\n                            that._navigationAnimationRecord.oldCurrentPage = null;\n                            that._forEachPage(function (curr) {\n                                if (curr.element === oldElement) {\n                                    that._navigationAnimationRecord.oldCurrentPage = curr;\n                                    return true;\n                                }\n                            });\n                            that._navigationAnimationRecord.newCurrentPage = that._currentPage;\n                            if (that._navigationAnimationRecord.newCurrentPage === that._navigationAnimationRecord.oldCurrentPage) {\n                                return null;\n                            }\n                            var newElement = that._currentPage.element;\n                            that._navigationAnimationRecord.newCurrentElement = newElement;\n\n                            // When a page element is animated during a jump, it is temporarily appended on a different container during the animation (see _createDiscardablePage).\n                            // However, updates in the data source can happen (change, remove, insert, etc) during the animation affecting the element that is being animated.\n                            // Therefore, the page object also maintains the elementUniqueID, and the functions that deal with re-building the internal buffer (shifting/remove/etc)\n                            // do all the comparissons, based on the page.elementUniqueID that way even if the element of the page is being animated, we are able to restore/discard it\n                            // into the internal buffer back in the correct place.\n                            that._currentPage.setElement(null, true);\n                            that._currentPage.elementUniqueID = uniqueID(newElement);\n\n                            if (that._navigationAnimationRecord.oldCurrentPage) {\n                                that._navigationAnimationRecord.oldCurrentPage.setElement(null, true);\n                            }\n\n                            var oldFlipPage = that._createDiscardablePage(oldElement),\n                                newFlipPage = that._createDiscardablePage(newElement);\n                            oldFlipPage.pageRoot.itemIndex = oldIndex;\n                            newFlipPage.pageRoot.itemIndex = index;\n                            oldFlipPage.pageRoot.style.position = \"absolute\";\n                            newFlipPage.pageRoot.style.position = \"absolute\";\n                            oldFlipPage.pageRoot.style.zIndex = 1;\n                            newFlipPage.pageRoot.style.zIndex = 2;\n                            that._setItemStart(oldFlipPage, 0);\n                            that._setItemStart(newFlipPage, that._itemSize(that._currentPage));\n                            that._visibleElements.push(newElement);\n                            that._announceElementVisible(newElement);\n                            that._navigationAnimationRecord.elementContainers = [oldFlipPage, newFlipPage];\n                            that._blockTabs = true;\n                            return {\n                                oldPage: oldFlipPage,\n                                newPage: newFlipPage\n                            };\n                        });\n                    }\n\n                    return Promise.wrap(null);\n                },\n\n                simulateMouseWheelScroll: function (ev) {\n\n                    if (this._environmentSupportsTouch || this._waitingForMouseScroll) {\n                        return;\n                    }\n\n                    var wheelingForward;\n\n                    if (typeof ev.deltaY === 'number') {\n                        wheelingForward = (ev.deltaX || ev.deltaY) > 0;\n                    } else {\n                        wheelingForward = ev.wheelDelta < 0;\n                    }\n\n                    var targetPage = wheelingForward ? this._currentPage.next : this._currentPage.prev;\n\n                    if (!targetPage.element) {\n                        return;\n                    }\n\n                    var zoomToContent = { contentX: 0, contentY: 0, viewportX: 0, viewportY: 0 };\n                    zoomToContent[this._isHorizontal ? \"contentX\" : \"contentY\"] = this._getItemStart(targetPage);\n                    _ElementUtilities._zoomTo(this._panningDivContainer, zoomToContent);\n                    this._waitingForMouseScroll = true;\n\n                    // The 100ms is added to the zoom duration to give the snap feeling where the page sticks\n                    // while scrolling\n                    _Global.setTimeout(function () {\n                        this._waitingForMouseScroll = false;\n                    }.bind(this), _ElementUtilities._zoomToDuration + 100);\n                },\n\n                endAnimatedJump: function (oldCurr, newCurr) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:endAnimatedJump,info\");\n                    if (this._navigationAnimationRecord.oldCurrentPage) {\n                        this._navigationAnimationRecord.oldCurrentPage.setElement(oldCurr.element, true);\n                    } else {\n                        if (oldCurr.element.parentNode) {\n                            oldCurr.element.parentNode.removeChild(oldCurr.element);\n                        }\n                    }\n                    this._navigationAnimationRecord.newCurrentPage.setElement(newCurr.element, true);\n                    this._navigationAnimationRecord = null;\n                    this._ensureCentered();\n                    this._itemSettledOn();\n                },\n\n                inserted: function (element, prev, next, animateInsertion) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:inserted,info\");\n                    var curr = this._prevMarker,\n                        passedCurrent = false,\n                        elementSuccessfullyPlaced = false;\n\n                    if (animateInsertion) {\n                        this._createAnimationRecord(uniqueID(element), null);\n                        this._getAnimationRecord(element).inserted = true;\n                    }\n\n                    if (!prev) {\n                        if (!next) {\n                            this._currentPage.setElement(element);\n                        } else {\n                            while (curr.next !== this._prevMarker && curr.elementUniqueID !== uniqueID(next)) {\n                                if (curr === this._currentPage) {\n                                    passedCurrent = true;\n                                }\n                                curr = curr.next;\n                            }\n\n                            if (curr.elementUniqueID === uniqueID(next) && curr !== this._prevMarker) {\n                                curr.prev.setElement(element);\n                                elementSuccessfullyPlaced = true;\n                            } else {\n                                this._releaseElementIfNotAnimated(element);\n                            }\n                        }\n                    } else {\n                        do {\n                            if (curr === this._currentPage) {\n                                passedCurrent = true;\n                            }\n                            if (curr.elementUniqueID === uniqueID(prev)) {\n                                elementSuccessfullyPlaced = true;\n                                var pageShifted = curr,\n                                    lastElementMoved = element,\n                                    lastElementMovedUniqueID = uniqueID(element),\n                                    temp;\n                                if (passedCurrent) {\n                                    while (pageShifted.next !== this._prevMarker) {\n                                        temp = pageShifted.next.element;\n                                        lastElementMovedUniqueID = pageShifted.next.elementUniqueID;\n                                        pageShifted.next.setElement(lastElementMoved, true);\n                                        if (!lastElementMoved && lastElementMovedUniqueID) {\n                                            // Shift the uniqueID of the page manually since its element is being animated.\n                                            // This page  will not contain the element until the animation completes.\n                                            pageShifted.next.elementUniqueID = lastElementMovedUniqueID;\n                                        }\n                                        lastElementMoved = temp;\n                                        pageShifted = pageShifted.next;\n                                    }\n                                } else {\n                                    if (curr.elementUniqueID === curr.next.elementUniqueID && curr.elementUniqueID) {\n                                        pageShifted = curr.next;\n                                    }\n                                    while (pageShifted.next !== this._prevMarker) {\n                                        temp = pageShifted.element;\n                                        lastElementMovedUniqueID = pageShifted.elementUniqueID;\n                                        pageShifted.setElement(lastElementMoved, true);\n                                        if (!lastElementMoved && lastElementMovedUniqueID) {\n                                            // Shift the uniqueID of the page manually since its element is being animated.\n                                            // This page  will not contain the element until the animation completes.\n                                            pageShifted.elementUniqueID = lastElementMovedUniqueID;\n                                        }\n                                        lastElementMoved = temp;\n                                        pageShifted = pageShifted.prev;\n                                    }\n                                }\n                                if (lastElementMoved) {\n                                    var reused = false;\n                                    this._forEachPage(function (curr) {\n                                        if (uniqueID(lastElementMoved) === curr.elementUniqueID) {\n                                            reused = true;\n                                            return true;\n                                        }\n                                    });\n                                    if (!reused) {\n                                        this._releaseElementIfNotAnimated(lastElementMoved);\n                                    }\n                                }\n                                break;\n                            }\n                            curr = curr.next;\n                        } while (curr !== this._prevMarker);\n                    }\n\n                    this._getAnimationRecord(element).successfullyMoved = elementSuccessfullyPlaced;\n                    this._setButtonStates();\n                },\n\n                changed: function (newVal, element) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:changed,info\");\n                    var that = this;\n                    this._forEachPage(function (curr) {\n                        if (curr.elementUniqueID === uniqueID(element)) {\n                            var record = that._animationRecords[curr.elementUniqueID];\n                            record.changed = true;\n                            record.oldElement = element;\n                            record.newElement = newVal;\n                            curr.element = newVal; // We set curr's element field here so that next/prev works, but we won't update the visual until endNotifications\n                            curr.elementUniqueID = uniqueID(newVal);\n                            that._animationRecords[uniqueID(newVal)] = record;\n                            return true;\n                        }\n                    });\n\n                    if (this._navigationAnimationRecord && this._navigationAnimationRecord.elementContainers) {\n                        for (var i = 0, len = this._navigationAnimationRecord.elementContainers.length; i < len; i++) {\n                            var page = this._navigationAnimationRecord.elementContainers[i];\n                            if (page && page.elementUniqueID === uniqueID(element)) {\n                                page.element = newVal;\n                                page.elementUniqueID = uniqueID(newVal);\n                            }\n                        }\n\n                        var newElement = this._navigationAnimationRecord.newCurrentElement;\n                        if (newElement && uniqueID(newElement) === uniqueID(element)) {\n                            this._navigationAnimationRecord.newCurrentElement = newVal;\n                        }\n                    }\n                },\n\n                moved: function (element, prev, next) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:moved,info\");\n                    var record = this._getAnimationRecord(element);\n\n                    if (!record) {\n                        record = this._createAnimationRecord(uniqueID(element));\n                    }\n\n                    record.moved = true;\n                    this.removed(element, false, false);\n                    if (prev || next) {\n                        this.inserted(element, prev, next, false);\n                    } else {\n                        record.successfullyMoved = false;\n                    }\n                },\n\n                removed: function (element, mirage, animateRemoval) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:removed,info\");\n                    var that = this;\n                    var prevMarker = this._prevMarker;\n                    var work = Promise.wrap();\n\n                    if (mirage) {\n                        var clearNext = false;\n                        this._forEachPage(function (curr) {\n                            if (curr.elementUniqueID === uniqueID(element) || clearNext) {\n                                curr.setElement(null, true);\n                                clearNext = true;\n                            }\n                        });\n                        this._setButtonStates();\n                        return;\n                    }\n\n                    if (animateRemoval) {\n                        var record = this._getAnimationRecord(element);\n                        if (record) {\n                            record.removed = true;\n                        }\n                    }\n                    if (this._currentPage.elementUniqueID === uniqueID(element)) {\n                        if (this._currentPage.next.elementUniqueID) {\n                            this._shiftLeft(this._currentPage);\n                            this._ensureCentered();\n                        } else if (this._currentPage.prev.elementUniqueID) {\n                            this._shiftRight(this._currentPage);\n                        } else {\n                            this._currentPage.setElement(null, true);\n                        }\n                    } else if (prevMarker.elementUniqueID === uniqueID(element)) {\n                        if (prevMarker.next.element) {\n                            work = this._itemsManager._previousItem(prevMarker.next.element).\n                                then(function (e) {\n                                    if (e === element) {\n                                        // Because the VDS and Binding.List can send notifications in\n                                        // different states we accomodate this here by fixing the case\n                                        // where VDS hasn't yet removed an item when it sends a removed\n                                        // or moved notification.\n                                        //\n                                        e = that._itemsManager._previousItem(e);\n                                    }\n                                    return e;\n                                }).\n                                then(function (e) {\n                                    prevMarker.setElement(e, true);\n                                });\n                        } else {\n                            prevMarker.setElement(null, true);\n                        }\n                    } else if (prevMarker.prev.elementUniqueID === uniqueID(element)) {\n                        if (prevMarker.prev.prev && prevMarker.prev.prev.element) {\n                            work = this._itemsManager._nextItem(prevMarker.prev.prev.element).\n                                then(function (e) {\n                                    if (e === element) {\n                                        // Because the VDS and Binding.List can send notifications in\n                                        // different states we accomodate this here by fixing the case\n                                        // where VDS hasn't yet removed an item when it sends a removed\n                                        // or moved notification.\n                                        //\n                                        e = that._itemsManager._nextItem(e);\n                                    }\n                                    return e;\n                                }).\n                                then(function (e) {\n                                    prevMarker.prev.setElement(e, true);\n                                });\n                        } else {\n                            prevMarker.prev.setElement(null, true);\n                        }\n                    } else {\n                        var curr = this._currentPage.prev,\n                            handled = false;\n                        while (curr !== prevMarker && !handled) {\n                            if (curr.elementUniqueID === uniqueID(element)) {\n                                this._shiftRight(curr);\n                                handled = true;\n                            }\n\n                            curr = curr.prev;\n                        }\n\n                        curr = this._currentPage.next;\n                        while (curr !== prevMarker && !handled) {\n                            if (curr.elementUniqueID === uniqueID(element)) {\n                                this._shiftLeft(curr);\n                                handled = true;\n                            }\n\n                            curr = curr.next;\n                        }\n                    }\n\n                    return work.then(function () {\n                        that._setButtonStates();\n                    });\n                },\n\n                reload: function () {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:reload,info\");\n                    this.resetState(0);\n                },\n\n                getItemSpacing: function () {\n                    return this._itemSpacing;\n                },\n\n                setItemSpacing: function (space) {\n                    this._itemSpacing = space;\n                    this._ensureCentered();\n                },\n\n                notificationsStarted: function () {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:changeNotifications,StartTM\");\n                    this._logBuffer();\n                    this._notificationsStarted = this._notificationsStarted || 0;\n                    this._notificationsStarted++;\n                    // _notificationsEndedSignal is also used in the FlipView unit tests for coordination in the datasource tests\n                    this._notificationsEndedSignal = new _Signal();\n                    this._temporaryKeys = [];\n                    this._animationRecords = {};\n                    var that = this;\n                    this._forEachPage(function (curr) {\n                        that._createAnimationRecord(curr.elementUniqueID, curr);\n                    });\n\n                    // Since the current item is defined as the left-most item in the view, the only possible elements that can be in view at any time are\n                    // the current item and the item proceeding it. We'll save these two elements for animations during the notificationsEnded cycle\n                    this._animationRecords.currentPage = this._currentPage.element;\n                    this._animationRecords.nextPage = this._currentPage.next.element;\n                },\n\n                notificationsEnded: function () {\n                    // The animations are broken down into three parts.\n                    // First, we move everything back to where it was before the changes happened. Elements that were inserted between two pages won't have their flip pages moved.\n                    // Next, we figure out what happened to the two elements that used to be in view. If they were removed/moved, they get animated as appropriate in this order:\n                    // removed, moved\n                    // Finally, we figure out how the items that are now in view got there, and animate them as necessary, in this order: moved, inserted.\n                    // The moved animation of the last part is joined with the moved animation of the previous part, so in the end it is:\n                    // removed -> moved items in view + moved items not in view -> inserted.\n                    var that = this;\n                    this._endNotificationsWork && this._endNotificationsWork.cancel();\n                    this._endNotificationsWork = this._ensureBufferConsistency().then(function () {\n                        var animationPromises = [];\n                        that._forEachPage(function (curr) {\n                            var record = that._getAnimationRecord(curr.element);\n                            if (record) {\n                                if (record.changed) {\n                                    record.oldElement.removedFromChange = true;\n                                    animationPromises.push(that._changeFlipPage(curr, record.oldElement, record.newElement));\n                                }\n                                record.newLocation = curr.location;\n                                that._setItemStart(curr, record.originalLocation);\n                                if (record.inserted) {\n                                    curr.elementRoot.style.opacity = 0.0;\n                                }\n                            }\n                        });\n\n                        function flipPageFromElement(element) {\n                            var flipPage = null;\n                            that._forEachPage(function (curr) {\n                                if (curr.element === element) {\n                                    flipPage = curr;\n                                    return true;\n                                }\n                            });\n                            return flipPage;\n                        }\n\n                        function animateOldViewportItemRemoved(record, item) {\n                            that._writeProfilerMark(\"WinJS.UI.FlipView:_animateOldViewportItemRemoved,info\");\n                            var removedPage = that._createDiscardablePage(item);\n                            that._setItemStart(removedPage, record.originalLocation);\n                            animationPromises.push(that._deleteFlipPage(removedPage));\n                        }\n\n                        function animateOldViewportItemMoved(record, item) {\n                            that._writeProfilerMark(\"WinJS.UI.FlipView:_animateOldViewportItemMoved,info\");\n                            var newLocation = record.originalLocation,\n                                movedPage;\n                            if (!record.successfullyMoved) {\n                                // If the old visible item got moved, but the next/prev of that item don't match up with anything\n                                // currently in our flip page buffer, we need to figure out in which direction it moved.\n                                // The exact location doesn't matter since we'll be deleting it anyways, but we do need to\n                                // animate it going in the right direction.\n                                movedPage = that._createDiscardablePage(item);\n                                var indexMovedTo = that._getElementIndex(item);\n                                var newCurrentIndex = (that._currentPage.element ? that._getElementIndex(that._currentPage.element) : 0);\n                                newLocation += (newCurrentIndex > indexMovedTo ? -100 * that._bufferSize : 100 * that._bufferSize);\n                            } else {\n                                movedPage = flipPageFromElement(item);\n                                newLocation = record.newLocation;\n                            }\n                            if (movedPage) {\n                                that._setItemStart(movedPage, record.originalLocation);\n                                animationPromises.push(that._moveFlipPage(movedPage, function () {\n                                    that._setItemStart(movedPage, newLocation);\n                                }));\n                            }\n                        }\n\n                        var oldCurrent = that._animationRecords.currentPage,\n                            oldCurrentRecord = that._getAnimationRecord(oldCurrent),\n                            oldNext = that._animationRecords.nextPage,\n                            oldNextRecord = that._getAnimationRecord(oldNext);\n                        if (oldCurrentRecord && oldCurrentRecord.changed) {\n                            oldCurrent = oldCurrentRecord.newElement;\n                        }\n                        if (oldNextRecord && oldNextRecord.changed) {\n                            oldNext = oldNextRecord.newElement;\n                        }\n\n                        if (oldCurrent !== that._currentPage.element || oldNext !== that._currentPage.next.element) {\n                            if (oldCurrentRecord && oldCurrentRecord.removed) {\n                                animateOldViewportItemRemoved(oldCurrentRecord, oldCurrent);\n                            }\n                            if (oldNextRecord && oldNextRecord.removed) {\n                                animateOldViewportItemRemoved(oldNextRecord, oldNext);\n                            }\n                        }\n\n                        function joinAnimationPromises() {\n                            if (animationPromises.length === 0) {\n                                animationPromises.push(Promise.wrap());\n                            }\n\n                            return Promise.join(animationPromises);\n                        }\n                        that._blockTabs = true;\n                        joinAnimationPromises().then(function () {\n                            animationPromises = [];\n                            if (oldCurrentRecord && oldCurrentRecord.moved) {\n                                animateOldViewportItemMoved(oldCurrentRecord, oldCurrent);\n                            }\n                            if (oldNextRecord && oldNextRecord.moved) {\n                                animateOldViewportItemMoved(oldNextRecord, oldNext);\n                            }\n                            var newCurrRecord = that._getAnimationRecord(that._currentPage.element),\n                                newNextRecord = that._getAnimationRecord(that._currentPage.next.element);\n                            that._forEachPage(function (curr) {\n                                var record = that._getAnimationRecord(curr.element);\n                                if (record) {\n                                    if (!record.inserted) {\n                                        if (record.originalLocation !== record.newLocation) {\n                                            if ((record !== oldCurrentRecord && record !== oldNextRecord) ||\n                                                (record === oldCurrentRecord && !oldCurrentRecord.moved) ||\n                                                (record === oldNextRecord && !oldNextRecord.moved)) {\n                                                animationPromises.push(that._moveFlipPage(curr, function () {\n                                                    that._setItemStart(curr, record.newLocation);\n                                                }));\n                                            }\n                                        }\n                                    } else if (record !== newCurrRecord && record !== newNextRecord) {\n                                        curr.elementRoot.style.opacity = 1.0;\n                                    }\n                                }\n                            });\n                            joinAnimationPromises().then(function () {\n                                animationPromises = [];\n                                if (newCurrRecord && newCurrRecord.inserted) {\n                                    animationPromises.push(that._insertFlipPage(that._currentPage));\n                                }\n                                if (newNextRecord && newNextRecord.inserted) {\n                                    animationPromises.push(that._insertFlipPage(that._currentPage.next));\n                                }\n                                joinAnimationPromises().then(function () {\n                                    that._checkElementVisibility(false);\n                                    that._itemSettledOn();\n                                    that._setListEnds();\n                                    that._notificationsStarted--;\n                                    if (that._notificationsStarted === 0) {\n                                        that._notificationsEndedSignal.complete();\n                                    }\n                                    that._writeProfilerMark(\"WinJS.UI.FlipView:changeNotifications,StopTM\");\n                                    that._logBuffer();\n                                    that._endNotificationsWork = null;\n                                });\n                            });\n                        });\n                    });\n                },\n\n                disableTouchFeatures: function () {\n                    this._environmentSupportsTouch = false;\n                    var panningContainerStyle = this._panningDivContainer.style;\n                    this._panningDivContainer.removeEventListener(_BaseUtils._browserEventEquivalents[\"manipulationStateChanged\"], this._handleManipulationStateChangedBound, true);\n                    panningContainerStyle.overflowX = \"hidden\";\n                    panningContainerStyle.overflowY = \"hidden\";\n                    var panningContainerPropertiesToClear = [\n                        \"scroll-snap-type\",\n                        \"scroll-snap-points-x\",\n                        \"scroll-snap-points-y\",\n                        \"scroll-limit-x-min\",\n                        \"scroll-limit-x-max\",\n                        \"scroll-limit-y-min\",\n                        \"scroll-limit-y-max\"\n                    ];\n                    panningContainerPropertiesToClear.forEach(function (propertyName) {\n                        var platformPropertyName = styleEquivalents[propertyName];\n                        if (platformPropertyName) {\n                            panningContainerStyle[platformPropertyName.scriptName] = \"\";\n                        }\n                    });\n                },\n\n                // Private methods\n\n                _hasFocus: {\n                    get: function () {\n                        return this._flipperDiv.contains(_Global.document.activeElement);\n                    }\n                },\n\n                _timeoutPageSelection: function () {\n                    var that = this;\n                    if (this._lastTimeoutRequest) {\n                        this._lastTimeoutRequest.cancel();\n                    }\n                    this._lastTimeoutRequest = Promise.timeout(itemSelectedEventDelay).then(function () {\n                        that._itemSettledOn();\n                    });\n                },\n\n                _updateTabIndex: function (newIndex) {\n                    this._forEachPage(function (curr) {\n                        if (curr.element) {\n                            curr.element.tabIndex = newIndex;\n                        }\n                    });\n                    this._tabIndex = newIndex;\n                    this._tabManager.tabIndex = newIndex;\n                },\n\n                _releaseElementIfNotAnimated: function (element) {\n                    var animatedRecord = this._getAnimationRecord(element);\n                    if (!(animatedRecord && (animatedRecord.changed || animatedRecord.inserted || animatedRecord.moved || animatedRecord.removed))) {\n                        this._itemsManager.releaseItem(element);\n                    }\n                },\n\n                _getAnimationRecord: function (element) {\n                    return (element ? this._animationRecords[uniqueID(element)] : null);\n                },\n\n                _createAnimationRecord: function (elementUniqueID, flipPage) {\n                    if (elementUniqueID) {\n                        var record = this._animationRecords[elementUniqueID] = {\n                            removed: false,\n                            changed: false,\n                            inserted: false\n                        };\n\n                        if (flipPage) {\n                            record.originalLocation = flipPage.location;\n                        }\n\n                        return record;\n                    }\n                },\n\n                _writeProfilerMark: function (message) {\n                    _WriteProfilerMark(message);\n                    if (this._flipperDiv.winControl.constructor._enabledDebug) {\n                        _Log.log && _Log.log(message, null, \"flipviewdebug\");\n                    }\n                },\n\n                _getElementIndex: function (element) {\n                    var index = 0;\n                    try {\n                        index = this._itemsManager.itemObject(element).index;\n                    }\n                    catch (e) {\n                        // Failures are expected in cases where items are moved and then deleted. Animations will simply animate as if the item\n                        // moved to the beginning of the list.\n                    }\n                    return index;\n                },\n\n                _resetBuffer: function (elementToSave, skipReleases) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_resetBuffer,info\");\n                    var head = this._currentPage,\n                        curr = head;\n                    do {\n                        if ((curr.element && curr.element === elementToSave) || skipReleases) {\n                            curr.setElement(null, true);\n                        } else {\n                            curr.setElement(null);\n                        }\n                        curr = curr.next;\n                    } while (curr !== head);\n                },\n\n                _getHeadOfBuffer: function () {\n                    return this._prevMarker.prev;\n                },\n\n                _getTailOfBuffer: function () {\n                    return this._prevMarker;\n                },\n\n                _insertNewFlipPage: function (prevElement) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_insertNewFlipPage,info\");\n                    var newPage = this._createFlipPage(prevElement, this);\n                    this._panningDiv.appendChild(newPage.pageRoot);\n                    return newPage;\n                },\n\n                _fetchNextItems: function () {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_fetchNextItems,info\");\n                    var tail = Promise.wrap(this._currentPage);\n                    var that = this;\n\n                    for (var i = 0; i < this._bufferSize; i++) {\n                        tail = tail.then(function (curr) {\n                            if (curr.next === that._prevMarker) {\n                                that._insertNewFlipPage(curr);\n                            }\n                            if (curr.element) {\n                                return that._itemsManager._nextItem(curr.element).\n                                    then(function (element) {\n                                        curr.next.setElement(element);\n                                        return curr.next;\n                                    });\n                            } else {\n                                curr.next.setElement(null);\n                                return curr.next;\n                            }\n                        });\n                    }\n\n                    return tail;\n                },\n\n                _fetchOneNext: function (target) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_fetchOneNext,info\");\n                    var prevElement = target.prev.element;\n                    // If the target we want to fill with the next item is the end of the circular buffer but we want to keep everything in memory, we've got to increase the buffer size\n                    // so that we don't reuse prevMarker.\n                    if (this._prevMarker === target) {\n                        this._prevMarker = this._prevMarker.next;\n                    }\n                    if (!prevElement) {\n                        target.setElement(null);\n                        return;\n                    }\n                    var that = this;\n                    return this._itemsManager._nextItem(prevElement).\n                        then(function (element) {\n                            target.setElement(element);\n                            that._movePageAhead(target.prev, target);\n                        });\n                },\n\n                _fetchPreviousItems: function (setPrevMarker) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_fetchPreviousItems,info\");\n                    var that = this;\n\n                    var tail = Promise.wrap(this._currentPage);\n\n                    for (var i = 0; i < this._bufferSize; i++) {\n                        tail = tail.then(function (curr) {\n                            if (curr.element) {\n                                return that._itemsManager._previousItem(curr.element).\n                                    then(function (element) {\n                                        curr.prev.setElement(element);\n                                        return curr.prev;\n                                    });\n                            } else {\n                                curr.prev.setElement(null);\n                                return curr.prev;\n                            }\n                        });\n                    }\n\n                    return tail.then(function (curr) {\n                        if (setPrevMarker) {\n                            that._prevMarker = curr;\n                        }\n                    });\n                },\n\n                _fetchOnePrevious: function (target) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_fetchOnePrevious,info\");\n                    var nextElement = target.next.element;\n\n                    // If the target we want to fill with the previous item is the end of the circular buffer but we want to keep everything in memory, we've got to increase the buffer size\n                    // so that we don't reuse prevMarker. We'll add a new element to be prevMarker's prev, then set prevMarker to point to that new element.\n                    if (this._prevMarker === target.next) {\n                        this._prevMarker = this._prevMarker.prev;\n                    }\n                    if (!nextElement) {\n                        target.setElement(null);\n                        return Promise.wrap();\n                    }\n                    var that = this;\n                    return this._itemsManager._previousItem(nextElement).\n                        then(function (element) {\n                            target.setElement(element);\n                            that._movePageBehind(target.next, target);\n                        });\n                },\n\n                _setButtonStates: function () {\n                    if (this._currentPage.prev.element) {\n                        this._buttonVisibilityHandler.showPreviousButton();\n                    } else {\n                        this._buttonVisibilityHandler.hidePreviousButton();\n                    }\n\n                    if (this._currentPage.next.element) {\n                        this._buttonVisibilityHandler.showNextButton();\n                    } else {\n                        this._buttonVisibilityHandler.hideNextButton();\n                    }\n                },\n\n                _ensureCentered: function (delayBoundariesSet) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_ensureCentered,info\");\n                    this._setItemStart(this._currentPage, leftBufferAmount * this._viewportSize());\n                    var curr = this._currentPage;\n                    while (curr !== this._prevMarker) {\n                        this._movePageBehind(curr, curr.prev);\n                        curr = curr.prev;\n                    }\n\n                    curr = this._currentPage;\n                    while (curr.next !== this._prevMarker) {\n                        this._movePageAhead(curr, curr.next);\n                        curr = curr.next;\n                    }\n                    var boundariesSet = false;\n                    if (this._lastScrollPos && !delayBoundariesSet) {\n                        this._setListEnds();\n                        boundariesSet = true;\n                    }\n                    this._lastScrollPos = this._getItemStart(this._currentPage);\n                    this._setViewportStart(this._lastScrollPos);\n                    this._checkElementVisibility(true);\n                    this._setupSnapPoints();\n                    if (!boundariesSet) {\n                        this._setListEnds();\n                    }\n                },\n\n                _ensureBufferConsistency: function () {\n                    var that = this;\n                    var currentElement = this._currentPage.element;\n                    if (!currentElement) {\n                        return Promise.wrap();\n                    }\n\n                    var refreshBuffer = false;\n                    var seenUniqueIDs = {};\n                    var seenLocations = {};\n                    this._forEachPage(function (page) {\n                        if (page && page.elementUniqueID) {\n                            if (!seenUniqueIDs[page.elementUniqueID]) {\n                                seenUniqueIDs[page.elementUniqueID] = true;\n                            } else {\n                                refreshBuffer = true;\n                                return true;\n                            }\n\n                            if (page.location > 0) {\n                                if (!seenLocations[page.location]) {\n                                    seenLocations[page.location] = true;\n                                } else {\n                                    refreshBuffer = true;\n                                    return true;\n                                }\n                            }\n                        }\n                    });\n\n                    var animationKeys = Object.keys(this._animationRecords);\n                    animationKeys.forEach(function (key) {\n                        var record = that._animationRecords[key];\n                        if (record && (record.changed || record.inserted || record.moved || record.removed)) {\n                            refreshBuffer = true;\n                        }\n                    });\n\n                    if (refreshBuffer) {\n                        this._resetBuffer(null, true);\n                        this._currentPage.setElement(currentElement);\n                        return this._fetchNextItems().\n                            then(function () {\n                                return that._fetchPreviousItems(true);\n                            }).\n                            then(function () {\n                                that._ensureCentered();\n                            });\n                    } else {\n                        return Promise.wrap();\n                    }\n                },\n\n                _shiftLeft: function (startingPoint) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_shiftLeft,info\");\n                    var curr = startingPoint,\n                        nextEl = null;\n                    while (curr !== this._prevMarker && curr.next !== this._prevMarker) {\n                        nextEl = curr.next.element;\n                        if (!nextEl && curr.next.elementUniqueID) {\n                            // Shift the uniqueID of the page manually since its element is being animated.\n                            // This page  will not contain the element until the animation completes.\n                            curr.elementUniqueID = curr.next.elementUniqueID;\n                        }\n                        curr.next.setElement(null, true);\n                        curr.setElement(nextEl, true);\n                        curr = curr.next;\n                    }\n                    if (curr !== this._prevMarker && curr.prev.element) {\n                        var that = this;\n                        return this._itemsManager._nextItem(curr.prev.element).\n                            then(function (element) {\n                                curr.setElement(element);\n                                that._createAnimationRecord(curr.elementUniqueID, curr);\n                            });\n                    }\n                },\n\n                _logBuffer: function () {\n                    if (this._flipperDiv.winControl.constructor._enabledDebug) {\n                        _Log.log && _Log.log(this._currentPage.next.next.next.elementUniqueID + \"\\t@:\" + this._currentPage.next.next.next.location + (this._currentPage.next.next.next.element ? (\"\\t\" + this._currentPage.next.next.next.element.textContent) : \"\"), null, \"flipviewdebug\");\n                        _Log.log && _Log.log(this._currentPage.next.next.next.next.elementUniqueID + \"\\t@:\" + this._currentPage.next.next.next.next.location + (this._currentPage.next.next.next.next.element ? (\"\\t\" + this._currentPage.next.next.next.next.element.textContent) : \"\"), null, \"flipviewdebug\");\n                        _Log.log && _Log.log(\"> \" + this._currentPage.elementUniqueID + \"\\t@:\" + this._currentPage.location + (this._currentPage.element ? (\"\\t\" + this._currentPage.element.textContent) : \"\"), null, \"flipviewdebug\");\n                        _Log.log && _Log.log(this._currentPage.next.elementUniqueID + \"\\t@:\" + this._currentPage.next.location + (this._currentPage.next.element ? (\"\\t\" + this._currentPage.next.element.textContent) : \"\"), null, \"flipviewdebug\");\n                        _Log.log && _Log.log(this._currentPage.next.next.elementUniqueID + \"\\t@:\" + this._currentPage.next.next.location + (this._currentPage.next.next.element ? (\"\\t\" + this._currentPage.next.next.element.textContent) : \"\"), null, \"flipviewdebug\");\n\n                        var keys = Object.keys(this._itemsManager._elementMap);\n                        var bufferKeys = [];\n                        this._forEachPage(function (page) {\n                            if (page && page.elementUniqueID) {\n                                bufferKeys.push(page.elementUniqueID);\n                            }\n                        });\n                        _Log.log && _Log.log(\"itemsmanager  = [\" + keys.join(\" \") + \"] flipview [\" + bufferKeys.join(\" \") + \"]\", null, \"flipviewdebug\");\n                    }\n                },\n\n                _shiftRight: function (startingPoint) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_shiftRight,info\");\n                    var curr = startingPoint,\n                        prevEl = null;\n                    while (curr !== this._prevMarker) {\n                        prevEl = curr.prev.element;\n                        if (!prevEl && curr.prev.elementUniqueID) {\n                            // Shift the uniqueID of the page manually since its element is being animated.\n                            // This page  will not contain the element until the animation completes.\n                            curr.elementUniqueID = curr.prev.elementUniqueID;\n                        }\n                        curr.prev.setElement(null, true);\n                        curr.setElement(prevEl, true);\n                        curr = curr.prev;\n                    }\n                    if (curr.next.element) {\n                        var that = this;\n                        return this._itemsManager._previousItem(curr.next.element).\n                            then(function (element) {\n                                curr.setElement(element);\n                                that._createAnimationRecord(curr.elementUniqueID, curr);\n                            });\n                    }\n                },\n\n                _checkElementVisibility: function (viewWasReset) {\n                    var i,\n                        len;\n                    if (viewWasReset) {\n                        var currentElement = this._currentPage.element;\n                        for (i = 0, len = this._visibleElements.length; i < len; i++) {\n                            if (this._visibleElements[i] !== currentElement) {\n                                this._announceElementInvisible(this._visibleElements[i]);\n                            }\n                        }\n\n                        this._visibleElements = [];\n                        if (currentElement) {\n                            this._visibleElements.push(currentElement);\n                            this._announceElementVisible(currentElement);\n                        }\n                    } else {\n                        // Elements that have been removed completely from the flipper still need to raise pageVisibilityChangedEvents if they were visible prior to being removed,\n                        // so before going through all the elements we go through the ones that we knew were visible and see if they're missing a parentNode. If they are,\n                        // the elements were removed and we announce them as invisible.\n                        for (i = 0, len = this._visibleElements.length; i < len; i++) {\n                            if (!this._visibleElements[i].parentNode || this._visibleElements[i].removedFromChange) {\n                                this._announceElementInvisible(this._visibleElements[i]);\n                            }\n                        }\n                        this._visibleElements = [];\n                        var that = this;\n                        this._forEachPage(function (curr) {\n                            var element = curr.element;\n                            if (element) {\n                                if (that._itemInView(curr)) {\n                                    that._visibleElements.push(element);\n                                    that._announceElementVisible(element);\n                                } else {\n                                    that._announceElementInvisible(element);\n                                }\n                            }\n                        });\n                    }\n                },\n\n                _announceElementVisible: function (element) {\n                    if (element && !element.visible) {\n                        element.visible = true;\n\n                        var event = _Global.document.createEvent(\"CustomEvent\");\n                        this._writeProfilerMark(\"WinJS.UI.FlipView:pageVisibilityChangedEvent(visible:true),info\");\n                        event.initCustomEvent(_Constants.pageVisibilityChangedEvent, true, false, { source: this._flipperDiv, visible: true });\n\n                        element.dispatchEvent(event);\n                    }\n                },\n\n                _announceElementInvisible: function (element) {\n                    if (element && element.visible) {\n                        element.visible = false;\n\n                        // Elements that have been removed from the flipper still need to fire invisible events, but they can't do that without being in the DOM.\n                        // To fix that, we add the element back into the flipper, fire the event, then remove it.\n                        var addedToDomForEvent = false;\n                        if (!element.parentNode) {\n                            addedToDomForEvent = true;\n                            this._panningDivContainer.appendChild(element);\n                        }\n\n                        var event = _Global.document.createEvent(\"CustomEvent\");\n                        this._writeProfilerMark(\"WinJS.UI.FlipView:pageVisibilityChangedEvent(visible:false),info\");\n                        event.initCustomEvent(_Constants.pageVisibilityChangedEvent, true, false, { source: this._flipperDiv, visible: false });\n\n                        element.dispatchEvent(event);\n                        if (addedToDomForEvent) {\n                            this._panningDivContainer.removeChild(element);\n                        }\n                    }\n                },\n\n                _createDiscardablePage: function (content) {\n                    var pageDivs = this._createPageContainer(),\n                        page = {\n                            pageRoot: pageDivs.root,\n                            elementRoot: pageDivs.elementContainer,\n                            discardable: true,\n                            element: content,\n                            elementUniqueID: uniqueID(content),\n                            discard: function () {\n                                if (page.pageRoot.parentNode) {\n                                    page.pageRoot.parentNode.removeChild(page.pageRoot);\n                                }\n                                if (page.element.parentNode) {\n                                    page.element.parentNode.removeChild(page.element);\n                                }\n                            }\n                        };\n                    page.pageRoot.style.top = \"0px\";\n                    page.elementRoot.appendChild(content);\n                    this._panningDiv.appendChild(page.pageRoot);\n                    return page;\n                },\n\n                _createPageContainer: function () {\n                    var width = this._panningDivContainerOffsetWidth,\n                        height = this._panningDivContainerOffsetHeight,\n                        parentDiv = _Global.document.createElement(\"div\"),\n                        pageStyle = parentDiv.style,\n                        flexBox = _Global.document.createElement(\"div\");\n                    flexBox.className = \"win-item\";\n                    pageStyle.position = \"absolute\";\n                    pageStyle.overflow = \"hidden\";\n                    pageStyle.width = width + \"px\";\n                    pageStyle.height = height + \"px\";\n\n                    parentDiv.appendChild(flexBox);\n                    return {\n                        root: parentDiv,\n                        elementContainer: flexBox\n                    };\n                },\n\n                _createFlipPage: function (prev, manager) {\n                    var page = {};\n                    page.element = null;\n                    page.elementUniqueID = null;\n\n                    // The flip pages are managed as a circular doubly-linked list. this.currentItem should always refer to the current item in view, and this._prevMarker marks the point\n                    // in the list where the last previous item is stored. Why a circular linked list?\n                    // The virtualized flipper reuses its flip pages. When a new item is requested, the flipper needs to reuse an old item from the buffer. In the case of previous items,\n                    // the flipper has to go all the way back to the farthest next item in the buffer and recycle it (which is why having a .prev pointer on the farthest previous item is really useful),\n                    // and in the case of the next-most item, it needs to recycle next's next (ie, the this._prevMarker). The linked structure comes in really handy when iterating through the list\n                    // and separating out prev items from next items (like removed and ensureCentered do). If we were to use a structure like an array it would be pretty messy to do that and still\n                    // maintain a buffer of recyclable items.\n                    if (!prev) {\n                        page.next = page;\n                        page.prev = page;\n                    } else {\n                        page.prev = prev;\n                        page.next = prev.next;\n                        page.next.prev = page;\n                        prev.next = page;\n                    }\n                    var pageContainer = this._createPageContainer();\n                    page.elementRoot = pageContainer.elementContainer;\n                    page.elementRoot.style[\"msOverflowStyle\"] = \"auto\";\n                    page.pageRoot = pageContainer.root;\n\n                    // Sets the element to display in this flip page\n                    page.setElement = function (element, isReplacement) {\n                        if (element === undefined) {\n                            element = null;\n                        }\n                        if (element === page.element) {\n                            if (!element) {\n                                // If there are data source updates during the animation (e.g. item removed), a page element can be set to null when the shiftLeft/Right functions\n                                // call this function with a null element. However, since the element in the page is in the middle of an animation its page.elementUniqueID\n                                // is still set, so we need to explicitly clear its value so that when the animation completes, the animated element is not\n                                // restored back into the internal buffer.\n                                page.elementUniqueID = null;\n                            }\n                            return;\n                        }\n                        if (page.element) {\n                            if (!isReplacement) {\n                                manager._itemsManager.releaseItem(page.element);\n                                _Dispose._disposeElement(page.element);\n                            }\n                        }\n                        page.element = element;\n                        page.elementUniqueID = (element ? uniqueID(element) : null);\n                        _ElementUtilities.empty(page.elementRoot);\n\n                        if (page.element) {\n                            if (page === manager._currentPage) {\n                                manager._tabManager.childFocus = element;\n                            }\n                            if (!isFlipper(page.element)) {\n                                page.element.tabIndex = manager._tabIndex;\n                                page.element.setAttribute(\"role\", \"option\");\n                                page.element.setAttribute(\"aria-selected\", false);\n                                if (!page.element.id) {\n                                    page.element.id = uniqueID(page.element);\n                                }\n\n                                var setFlowAttribute = function (source, target, attributeName) {\n                                    source.setAttribute(attributeName, target.id);\n                                };\n\n                                var isEnd = !page.next.element || page === manager._prevMarker.prev;\n                                if (isEnd) {\n                                    setFlowAttribute(page.element, manager._bufferAriaEndMarker, \"aria-flowto\");\n                                    setFlowAttribute(manager._bufferAriaEndMarker, page.element, \"x-ms-aria-flowfrom\");\n                                }\n\n                                if (page !== manager._prevMarker && page.prev.element) {\n                                    setFlowAttribute(page.prev.element, page.element, \"aria-flowto\");\n                                    setFlowAttribute(page.element, page.prev.element, \"x-ms-aria-flowfrom\");\n                                }\n                                if (page.next !== manager._prevMarker && page.next.element) {\n                                    setFlowAttribute(page.element, page.next.element, \"aria-flowto\");\n                                    setFlowAttribute(page.next.element, page.element, \"x-ms-aria-flowfrom\");\n                                }\n\n                                if (!page.prev.element) {\n                                    setFlowAttribute(page.element, manager._bufferAriaStartMarker, \"x-ms-aria-flowfrom\");\n                                    // aria-flowto in the start marker is configured in itemSettledOn to point to the current page in view\n                                }\n                            }\n                            page.elementRoot.appendChild(page.element);\n                        }\n                    };\n\n                    return page;\n                },\n\n                _itemInView: function (flipPage) {\n                    return this._itemEnd(flipPage) > this._getViewportStart() && this._getItemStart(flipPage) < this._viewportEnd();\n                },\n\n                _getViewportStart: function () {\n                    if (!this._panningDivContainer.parentNode) {\n                        return;\n                    }\n                    if (this._isHorizontal) {\n                        return _ElementUtilities.getScrollPosition(this._panningDivContainer).scrollLeft;\n                    } else {\n                        return _ElementUtilities.getScrollPosition(this._panningDivContainer).scrollTop;\n                    }\n                },\n\n                _setViewportStart: function (newValue) {\n                    if (!this._panningDivContainer.parentNode) {\n                        return;\n                    }\n                    if (this._isHorizontal) {\n                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollLeft: newValue });\n                    } else {\n                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollTop: newValue });\n                    }\n                },\n\n                _viewportEnd: function () {\n                    var element = this._panningDivContainer;\n                    if (this._isHorizontal) {\n                        if (this._rtl) {\n                            return this._getViewportStart() + this._panningDivContainerOffsetWidth;\n                        } else {\n                            return _ElementUtilities.getScrollPosition(element).scrollLeft + this._panningDivContainerOffsetWidth;\n                        }\n                    } else {\n                        return element.scrollTop + this._panningDivContainerOffsetHeight;\n                    }\n                },\n\n                _viewportSize: function () {\n                    return this._isHorizontal ? this._panningDivContainerOffsetWidth : this._panningDivContainerOffsetHeight;\n                },\n\n                _getItemStart: function (flipPage) {\n                    return flipPage.location;\n                },\n\n                _setItemStart: function (flipPage, newValue) {\n                    if (newValue === undefined) {\n                        return;\n                    }\n\n                    if (this._isHorizontal) {\n                        flipPage.pageRoot.style.left = (this._rtl ? -newValue : newValue) + \"px\";\n                    } else {\n                        flipPage.pageRoot.style.top = newValue + \"px\";\n                    }\n                    flipPage.location = newValue;\n                },\n\n                _itemEnd: function (flipPage) {\n                    return (this._isHorizontal ? flipPage.location + this._panningDivContainerOffsetWidth : flipPage.location + this._panningDivContainerOffsetHeight) + this._itemSpacing;\n                },\n\n                _itemSize: function () {\n                    return this._isHorizontal ? this._panningDivContainerOffsetWidth : this._panningDivContainerOffsetHeight;\n                },\n\n                _movePageAhead: function (referencePage, pageToPlace) {\n                    var delta = this._itemSize(referencePage) + this._itemSpacing;\n                    this._setItemStart(pageToPlace, this._getItemStart(referencePage) + delta);\n                },\n\n                _movePageBehind: function (referencePage, pageToPlace) {\n                    var delta = this._itemSize(referencePage) + this._itemSpacing;\n                    this._setItemStart(pageToPlace, this._getItemStart(referencePage) - delta);\n                },\n\n                _setupSnapPoints: function () {\n                    if (!this._environmentSupportsTouch) {\n                        return;\n                    }\n                    var containerStyle = this._panningDivContainer.style;\n                    containerStyle[styleEquivalents[\"scroll-snap-type\"].scriptName] = \"mandatory\";\n                    var viewportSize = this._viewportSize();\n                    var snapInterval = viewportSize + this._itemSpacing;\n                    var propertyName = \"scroll-snap-points\";\n                    var startSnap = 0;\n                    var currPos = this._getItemStart(this._currentPage);\n                    startSnap = currPos % (viewportSize + this._itemSpacing);\n                    containerStyle[styleEquivalents[(this._isHorizontal ? propertyName + \"-x\" : propertyName + \"-y\")].scriptName] = \"snapInterval(\" + startSnap + \"px, \" + snapInterval + \"px)\";\n                },\n\n                _setListEnds: function () {\n                    if (!this._environmentSupportsTouch) {\n                        return;\n                    }\n\n                    if (this._currentPage.element) {\n                        var containerStyle = this._panningDivContainer.style,\n                            startScroll = 0,\n                            endScroll = 0,\n                            startNonEmptyPage = this._getTailOfBuffer(),\n                            endNonEmptyPage = this._getHeadOfBuffer(),\n                            startBoundaryStyle = styleEquivalents[\"scroll-limit-\" + (this._isHorizontal ? \"x-min\" : \"y-min\")].scriptName,\n                            endBoundaryStyle = styleEquivalents[\"scroll-limit-\" + (this._isHorizontal ? \"x-max\" : \"y-max\")].scriptName;\n\n                        while (!endNonEmptyPage.element) {\n                            endNonEmptyPage = endNonEmptyPage.prev;\n\n                            // We started at the item before prevMarker (going backwards), so we will exit if all\n                            // the pages in the buffer are empty.\n                            if (endNonEmptyPage === this._prevMarker.prev) {\n                                break;\n                            }\n                        }\n\n                        while (!startNonEmptyPage.element) {\n                            startNonEmptyPage = startNonEmptyPage.next;\n\n                            // We started at prevMarker (going forward), so we will exit if all the pages in the\n                            // buffer are empty.\n                            if (startNonEmptyPage === this._prevMarker) {\n                                break;\n                            }\n                        }\n\n                        endScroll = this._getItemStart(endNonEmptyPage);\n                        startScroll = this._getItemStart(startNonEmptyPage);\n                        containerStyle[startBoundaryStyle] = startScroll + \"px\";\n                        containerStyle[endBoundaryStyle] = endScroll + \"px\";\n                    }\n                },\n\n                _viewportOnItemStart: function () {\n                    return this._getItemStart(this._currentPage) === this._getViewportStart();\n                },\n\n                _restoreAnimatedElement: function (oldPage, discardablePage) {\n                    var removed = true;\n                    // Restore the element in the old page only if it still matches the uniqueID, and the page\n                    // does not have new updated content. If the element was removed, it won't be restore in the\n                    // old page.\n                    if (oldPage.elementUniqueID === uniqueID(discardablePage.element) && !oldPage.element) {\n                        oldPage.setElement(discardablePage.element, true);\n                        removed = false;\n                    } else {\n                        // Iterate through the pages to see if the element was moved\n                        this._forEachPage(function (curr) {\n                            if (curr.elementUniqueID === discardablePage.elementUniqueID && !curr.element) {\n                                curr.setElement(discardablePage.element, true);\n                                removed = false;\n                            }\n                        });\n                    }\n                    return removed;\n                },\n\n                _itemSettledOn: function () {\n                    if (this._lastTimeoutRequest) {\n                        this._lastTimeoutRequest.cancel();\n                        this._lastTimeoutRequest = null;\n                    }\n\n                    var that = this;\n                    // Need to yield to the host here\n                    _BaseUtils._setImmediate(function () {\n                        if (that._viewportOnItemStart()) {\n                            that._blockTabs = false;\n                            if (that._currentPage.element) {\n                                if (that._lastSelectedElement !== that._currentPage.element) {\n                                    if (that._lastSelectedPage && that._lastSelectedPage.element && !isFlipper(that._lastSelectedPage.element)) {\n                                        that._lastSelectedPage.element.setAttribute(\"aria-selected\", false);\n                                    }\n                                    that._lastSelectedPage = that._currentPage;\n                                    that._lastSelectedElement = that._currentPage.element;\n                                    if (!isFlipper(that._currentPage.element)) {\n                                        that._currentPage.element.setAttribute(\"aria-selected\", true);\n                                    }\n\n                                    // Need to schedule this:\n                                    // - to be able to register for the pageselected event after instantiating the control and still get the event\n                                    // - in case a FlipView navigation is triggered inside the pageselected listener (avoid reentering _itemSettledOn)\n                                    Scheduler.schedule(function FlipView_dispatchPageSelectedEvent() {\n                                        if (that._currentPage.element) {\n                                            if (that._hasFocus || that._hadFocus) {\n                                                that._hadFocus = false;\n                                                _ElementUtilities._setActive(that._currentPage.element);\n                                                that._tabManager.childFocus = that._currentPage.element;\n                                            }\n                                            var event = _Global.document.createEvent(\"CustomEvent\");\n                                            event.initCustomEvent(_Constants.pageSelectedEvent, true, false, { source: that._flipperDiv });\n                                            that._writeProfilerMark(\"WinJS.UI.FlipView:pageSelectedEvent,info\");\n                                            that._currentPage.element.dispatchEvent(event);\n\n                                            // Fire the pagecompleted event when the render completes if we are still looking  at the same element.\n                                            // Check that the current element is not null, since the app could've triggered a navigation inside the\n                                            // pageselected event handler.\n                                            var originalElement = that._currentPage.element;\n                                            if (originalElement) {\n                                                var record = that._itemsManager._recordFromElement(originalElement, true);\n                                                if (record) {\n                                                    record.renderComplete.then(function () {\n                                                        if (originalElement === that._currentPage.element) {\n                                                            that._currentPage.element.setAttribute(\"aria-setsize\", that._cachedSize);\n                                                            that._currentPage.element.setAttribute(\"aria-posinset\", that.currentIndex() + 1);\n                                                            that._bufferAriaStartMarker.setAttribute(\"aria-flowto\", that._currentPage.element.id);\n                                                            event = _Global.document.createEvent(\"CustomEvent\");\n                                                            event.initCustomEvent(_Constants.pageCompletedEvent, true, false, { source: that._flipperDiv });\n                                                            that._writeProfilerMark(\"WinJS.UI.FlipView:pageCompletedEvent,info\");\n                                                            that._currentPage.element.dispatchEvent(event);\n                                                        }\n                                                    });\n                                                }\n                                            }\n                                        }\n                                    }, Scheduler.Priority.normal, null, \"WinJS.UI.FlipView._dispatchPageSelectedEvent\");\n                                }\n                            }\n                        }\n                    });\n                },\n\n                _forEachPage: function (callback) {\n                    var curr = this._prevMarker;\n                    do {\n                        if (callback(curr)) {\n                            break;\n                        }\n                        curr = curr.next;\n                    } while (curr !== this._prevMarker);\n                },\n\n                _changeFlipPage: function (page, oldElement, newElement) {\n                    this._writeProfilerMark(\"WinJS.UI.FlipView:_changeFlipPage,info\");\n                    page.element = null;\n                    if (page.setElement) {\n                        page.setElement(newElement, true);\n                    } else {\n                        // Discardable pages that are created for animations aren't full fleged pages, and won't have some of the functions a normal page would.\n                        // changeFlipPage will be called on them when an item that's animating gets fetched. When that happens, we need to replace its element\n                        // manually, then center it.\n                        oldElement.parentNode.removeChild(oldElement);\n                        page.elementRoot.appendChild(newElement);\n                    }\n\n                    var style = oldElement.style;\n                    style.position = \"absolute\";\n                    style.left = \"0px\";\n                    style.top = \"0px\";\n                    style.opacity = 1.0;\n\n                    page.pageRoot.appendChild(oldElement);\n                    oldElement.style.left = Math.max(0, (page.pageRoot.offsetWidth - oldElement.offsetWidth) / 2) + \"px\";\n                    oldElement.style.top = Math.max(0, (page.pageRoot.offsetHeight - oldElement.offsetHeight) / 2) + \"px\";\n\n                    return Animations.fadeOut(oldElement).then(function () {\n                        oldElement.parentNode && oldElement.parentNode.removeChild(oldElement);\n                    });\n                },\n\n                _deleteFlipPage: function (page) {\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:_deleteFlipPage,info\");\n                    page.elementRoot.style.opacity = 0;\n                    var animation = Animations.createDeleteFromListAnimation([page.elementRoot]);\n\n                    var that = this;\n                    return animation.execute().then(function () {\n                        if (page.discardable) {\n                            page.discard();\n                            that._itemsManager.releaseItem(page.element);\n                        }\n                    });\n                },\n\n                _insertFlipPage: function (page) {\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:_insertFlipPage,info\");\n                    page.elementRoot.style.opacity = 1.0;\n                    var animation = Animations.createAddToListAnimation([page.elementRoot]);\n\n                    return animation.execute().then(function () {\n                        if (page.discardable) {\n                            page.discard();\n                        }\n                    });\n                },\n\n                _moveFlipPage: function (page, move) {\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:_moveFlipPage,info\");\n                    var animation = Animations.createRepositionAnimation(page.pageRoot);\n\n                    move();\n\n                    var that = this;\n                    return animation.execute().then(function () {\n                        if (page.discardable) {\n                            page.discard();\n                            var animationRecord = that._getAnimationRecord(page.element);\n                            if (animationRecord && !animationRecord.successfullyMoved) {\n                                // If the animationRecord was not succesfully moved, the item is now outside of the buffer,\n                                // and we can release it.\n                                that._itemsManager.releaseItem(page.element);\n                            }\n                        }\n                    });\n                },\n\n                _handleManipulationStateChanged: function (event) {\n                    this._manipulationState = event.currentState;\n                    if (event.currentState === 0 && event.target === this._panningDivContainer) {\n                        this._itemSettledOn();\n                        this._ensureCentered();\n                    }\n                }\n            }, {\n                supportedForProcessing: false,\n            });\n            _FlipPageManager.flipPageBufferCount = 2; // The number of items that should surround the current item as a buffer at any time\n            return _FlipPageManager;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-flipview',[],function(){});\n\ndefine('require-style!less/colors-flipview',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/FlipView',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../Animations/_TransitionAnimation',\n    '../BindingList',\n    '../Promise',\n    '../Scheduler',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_ItemsManager',\n    '../Utilities/_UI',\n    './FlipView/_Constants',\n    './FlipView/_PageManager',\n    'require-style!less/styles-flipview',\n    'require-style!less/colors-flipview'\n], function flipperInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, BindingList, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Hoverable, _ItemsManager, _UI, _Constants, _PageManager) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.FlipView\">\n        /// Displays a collection, such as a set of photos, one item at a time.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.flipview.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.flipview.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.FlipView\"></div>]]></htmlSnippet>\n        /// <event name=\"datasourcecountchanged\" bubbles=\"true\" locid=\"WinJS.UI.FlipView_e:datasourcecountchanged\">Raised when the number of items in the itemDataSource changes.</event>\n        /// <event name=\"pagevisibilitychanged\" bubbles=\"true\" locid=\"WinJS.UI.FlipView_e:pagevisibilitychanged\">Raised when a FlipView page becomes visible or invisible.</event>\n        /// <event name=\"pageselected\" bubbles=\"true\" locid=\"WinJS.UI.FlipView_e:pageselected\">Raised when the FlipView flips to a page.</event>\n        /// <event name=\"pagecompleted\" bubbles=\"true\" locid=\"WinJS.UI.FlipView_e:pagecompleted\">Raised when the FlipView flips to a page and its renderer function completes.</event>\n        /// <part name=\"flipView\" class=\"win-flipview\" locid=\"WinJS.UI.FlipView_part:flipView\">The entire FlipView control.</part>\n        /// <part name=\"navigationButton\" class=\"win-navbutton\" locid=\"WinJS.UI.FlipView_part:navigationButton\">The general class for all FlipView navigation buttons.</part>\n        /// <part name=\"leftNavigationButton\" class=\"win-navleft\" locid=\"WinJS.UI.FlipView_part:leftNavigationButton\">The left navigation button.</part>\n        /// <part name=\"rightNavigationButton\" class=\"win-navright\" locid=\"WinJS.UI.FlipView_part:rightNavigationButton\">The right navigation button.</part>\n        /// <part name=\"topNavigationButton\" class=\"win-navtop\" locid=\"WinJS.UI.FlipView_part:topNavigationButton\">The top navigation button.</part>\n        /// <part name=\"bottomNavigationButton\" class=\"win-navbottom\" locid=\"WinJS.UI.FlipView_part:bottomNavigationButton\">The bottom navigation button.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        FlipView: _Base.Namespace._lazy(function () {\n\n            // Class names\n            var navButtonClass = \"win-navbutton\",\n                flipViewClass = \"win-flipview\",\n                navButtonLeftClass = \"win-navleft\",\n                navButtonRightClass = \"win-navright\",\n                navButtonTopClass = \"win-navtop\",\n                navButtonBottomClass = \"win-navbottom\";\n\n            // Aria labels\n            var previousButtonLabel = \"Previous\",\n                nextButtonLabel = \"Next\";\n\n            var buttonFadeDelay = 3000,\n                avoidTrapDelay = 500,\n                leftArrowGlyph = \"&#57570;\",\n                rightArrowGlyph = \"&#57571;\",\n                topArrowGlyph = \"&#57572;\",\n                bottomArrowGlyph = \"&#57573;\",\n                animationMoveDelta = 40;\n\n            function flipViewPropertyChanged(list) {\n                var that = list[0].target.winControl;\n                if (that && that instanceof FlipView) {\n                    if (list.some(function (record) {\n                        if (record.attributeName === \"dir\") {\n                            return true;\n                    } else if (record.attributeName === \"style\") {\n                            return (that._cachedStyleDir !== record.target.style.direction);\n                    } else {\n                            return false;\n                    }\n                    })) {\n                        that._cachedStyleDir = that._flipviewDiv.style.direction;\n                        that._rtl = _Global.getComputedStyle(that._flipviewDiv, null).direction === \"rtl\";\n                        that._setupOrientation();\n                    }\n                }\n            }\n\n            function flipviewResized(e) {\n                var that = e.target && e.target.winControl;\n                if (that && that instanceof FlipView) {\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:resize,StartTM\");\n                    that._resize();\n                }\n            }\n\n            var strings = {\n                get badAxis() { return \"Invalid argument: orientation must be a string, either 'horizontal' or 'vertical'\"; },\n                get badCurrentPage() { return \"Invalid argument: currentPage must be a number greater than or equal to zero and be within the bounds of the datasource\"; },\n                get noitemsManagerForCount() { return \"Invalid operation: can't get count if no dataSource has been set\"; },\n                get badItemSpacingAmount() { return \"Invalid argument: itemSpacing must be a number greater than or equal to zero\"; },\n                get navigationDuringStateChange() { return \"Error: After changing itemDataSource or itemTemplate, any navigation in the FlipView control should be delayed until the pageselected event is fired.\"; },\n                get panningContainerAriaLabel() { return _Resources._getWinJSString(\"ui/flipViewPanningContainerAriaLabel\").value; }\n            };\n\n            var FlipView = _Base.Class.define(function FlipView_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.FlipView.FlipView\">\n                /// <summary locid=\"WinJS.UI.FlipView.constructor\">\n                /// Creates a new FlipView.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.FlipView.constructor_p:element\">\n                /// The DOM element that hosts the control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.FlipView.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the pageselected event,\n                /// add a property named \"onpageselected\" to the options object and set its value to the event handler.\n                /// This parameter is optional.\n                /// </param>\n                /// <returns type=\"WinJS.UI.FlipView\" locid=\"WinJS.UI.FlipView.constructor_returnValue\">\n                /// The new FlipView control.\n                /// </returns>\n                /// </signature>\n                _WriteProfilerMark(\"WinJS.UI.FlipView:constructor,StartTM\");\n\n                this._disposed = false;\n\n                element = element || _Global.document.createElement(\"div\");\n\n                var isHorizontal = true,\n                    dataSource = null,\n                    itemRenderer = _ItemsManager._trivialHtmlRenderer,\n                    initialIndex = 0,\n                    itemSpacing = 0;\n\n                if (options) {\n                    // flipAxis parameter checking. Must be a string, either \"horizontal\" or \"vertical\"\n                    if (options.orientation) {\n                        if (typeof options.orientation === \"string\") {\n                            switch (options.orientation.toLowerCase()) {\n                                case \"horizontal\":\n                                    isHorizontal = true;\n                                    break;\n\n                                case \"vertical\":\n                                    isHorizontal = false;\n                                    break;\n                            }\n                        }\n                    }\n\n                    if (options.currentPage) {\n                        initialIndex = options.currentPage >> 0;\n                        initialIndex = initialIndex < 0 ? 0 : initialIndex;\n                    }\n\n                    if (options.itemDataSource) {\n                        dataSource = options.itemDataSource;\n                    }\n\n                    if (options.itemTemplate) {\n                        itemRenderer = this._getItemRenderer(options.itemTemplate);\n                    }\n\n                    if (options.itemSpacing) {\n                        itemSpacing = options.itemSpacing >> 0;\n                        itemSpacing = itemSpacing < 0 ? 0 : itemSpacing;\n                    }\n                }\n\n                if (!dataSource) {\n                    var list = new BindingList.List();\n                    dataSource = list.dataSource;\n                }\n                _ElementUtilities.empty(element);\n\n                // Set _flipviewDiv so the element getter works correctly, then call _setOption with eventsOnly flag on before calling _initializeFlipView\n                // so that event listeners are added before page loading\n                this._flipviewDiv = element;\n                element.winControl = this;\n                _Control._setOptions(this, options, true);\n                this._initializeFlipView(element, isHorizontal, dataSource, itemRenderer, initialIndex, itemSpacing);\n                _ElementUtilities.addClass(element, \"win-disposable\");\n                this._avoidTrappingTime = 0;\n                this._windowWheelHandlerBound = this._windowWheelHandler.bind(this);\n                _ElementUtilities._globalListener.addEventListener(element, 'wheel', this._windowWheelHandlerBound);\n                _ElementUtilities._globalListener.addEventListener(element, 'mousewheel', this._windowWheelHandlerBound);\n\n                _WriteProfilerMark(\"WinJS.UI.FlipView:constructor,StopTM\");\n            }, {\n\n                // Public methods\n\n                dispose: function FlipView_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.FlipView.dispose\">\n                    /// <summary locid=\"WinJS.UI.FlipView.dispose\">\n                    /// Disposes this FlipView.\n                    /// </summary>\n                    /// </signature>\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:dispose,StopTM\");\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    _ElementUtilities._globalListener.removeEventListener(this._flipviewDiv, 'wheel', this._windowWheelHandlerBound);\n                    _ElementUtilities._globalListener.removeEventListener(this._flipviewDiv, 'mousewheel', this._windowWheelHandlerBound);\n                    _ElementUtilities._resizeNotifier.unsubscribe(this._flipviewDiv, flipviewResized);\n\n\n                    this._disposed = true;\n                    this._pageManager.dispose();\n                    this._itemsManager.release();\n                    this.itemDataSource = null;\n                },\n\n                next: function FlipView_next() {\n                    /// <signature helpKeyword=\"WinJS.UI.FlipView.next\">\n                    /// <summary locid=\"WinJS.UI.FlipView.next\">\n                    /// Navigates to the next item.\n                    /// </summary>\n                    /// <returns type=\"Boolean\" locid=\"WinJS.UI.FlipView.next_returnValue\">\n                    /// true if the FlipView begins navigating to the next page;\n                    /// false if the FlipView is at the last page or is in the middle of another navigation animation.\n                    /// </returns>\n                    /// </signature>\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:next,info\");\n                    var cancelAnimationCallback = this._nextAnimation ? null : this._cancelDefaultAnimation;\n                    return this._navigate(true, cancelAnimationCallback);\n                },\n\n                previous: function FlipView_previous() {\n                    /// <signature helpKeyword=\"WinJS.UI.FlipView.previous\">\n                    /// <summary locid=\"WinJS.UI.FlipView.previous\">\n                    /// Navigates to the previous item.\n                    /// </summary>\n                    /// <returns type=\"Boolean\" locid=\"WinJS.UI.FlipView.previous_returnValue\">\n                    /// true if FlipView begins navigating to the previous page;\n                    /// false if the FlipView is already at the first page or is in the middle of another navigation animation.\n                    /// </returns>\n                    /// </signature>\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:prev,info\");\n                    var cancelAnimationCallback = this._prevAnimation ? null : this._cancelDefaultAnimation;\n                    return this._navigate(false, cancelAnimationCallback);\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.FlipView.element\" helpKeyword=\"WinJS.UI.FlipView.element\">\n                /// The DOM element that hosts the FlipView control.\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._flipviewDiv;\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.FlipView.currentPage\" helpKeyword=\"WinJS.UI.FlipView.currentPage\" minimum=\"0\">\n                /// Gets or sets the index of the currently displayed page. The minimum value is 0 and the maximum value is one less than the total number of items returned by the data source.\n                /// </field>\n                currentPage: {\n                    get: function () {\n                        return this._getCurrentIndex();\n                    },\n                    set: function (index) {\n                        _WriteProfilerMark(\"WinJS.UI.FlipView:set_currentPage,info\");\n\n                        if (this._pageManager._notificationsEndedSignal) {\n                            var that = this;\n                            this._pageManager._notificationsEndedSignal.promise.done(function () {\n                                that._pageManager._notificationsEndedSignal = null;\n                                that.currentPage = index;\n                            });\n                            return;\n                        }\n\n                        if (this._animating && !this._cancelAnimation()) {\n                            return;\n                        }\n\n                        index = index >> 0;\n                        index = index < 0 ? 0 : index;\n\n                        if (this._refreshTimer) {\n                            this._indexAfterRefresh = index;\n                        } else {\n                            if (this._pageManager._cachedSize > 0) {\n                                index = Math.min(this._pageManager._cachedSize - 1, index);\n                            } else if (this._pageManager._cachedSize === 0) {\n                                index = 0;\n                            }\n\n                            var that = this;\n                            if (this._jumpingToIndex === index) {\n                                return;\n                            }\n                            var clearJumpToIndex = function () {\n                                that._jumpingToIndex = null;\n                            };\n                            this._jumpingToIndex = index;\n                            var jumpAnimation = (this._jumpAnimation ? this._jumpAnimation : this._defaultAnimation.bind(this)),\n                                cancelAnimationCallback = (this._jumpAnimation ? null : this._cancelDefaultAnimation),\n                                completionCallback = function () { that._completeJump(); };\n                            this._pageManager.startAnimatedJump(index, cancelAnimationCallback, completionCallback).\n                            then(function (elements) {\n                                if (elements) {\n                                    that._animationsStarted();\n                                    var currElement = elements.oldPage.pageRoot;\n                                    var newCurrElement = elements.newPage.pageRoot;\n                                    that._contentDiv.appendChild(currElement);\n                                    that._contentDiv.appendChild(newCurrElement);\n\n                                    that._completeJumpPending = true;\n                                    jumpAnimation(currElement, newCurrElement).\n                                        then(function () {\n                                            if (that._completeJumpPending) {\n                                                completionCallback();\n                                                _WriteProfilerMark(\"WinJS.UI.FlipView:set_currentPage.animationComplete,info\");\n                                            }\n                                        }).done(clearJumpToIndex, clearJumpToIndex);\n                                } else {\n                                    clearJumpToIndex();\n                                }\n                            }, clearJumpToIndex);\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Orientation\" locid=\"WinJS.UI.FlipView.orientation\" helpKeyword=\"WinJS.UI.FlipView.orientation\">\n                /// Gets or sets the layout orientation of the FlipView, horizontal or vertical.\n                /// </field>\n                orientation: {\n                    get: function () {\n                        return this._axisAsString();\n                    },\n                    set: function (orientation) {\n                        _WriteProfilerMark(\"WinJS.UI.FlipView:set_orientation,info\");\n                        var isHorizontal = orientation === \"horizontal\";\n                        if (isHorizontal !== this._isHorizontal) {\n                            this._isHorizontal = isHorizontal;\n                            this._setupOrientation();\n                            this._pageManager.setOrientation(this._isHorizontal);\n                        }\n                    }\n                },\n\n                /// <field type=\"object\" locid=\"WinJS.UI.FlipView.itemDataSource\" helpKeyword=\"WinJS.UI.FlipView.itemDataSource\">\n                /// Gets or sets the data source that provides the FlipView with items to display.\n                /// The FlipView displays one item at a time, each on its own page.\n                /// </field>\n                itemDataSource: {\n                    get: function () {\n                        return this._dataSource;\n                    },\n\n                    set: function (dataSource) {\n                        _WriteProfilerMark(\"WinJS.UI.FlipView:set_itemDataSource,info\");\n                        this._dataSourceAfterRefresh = dataSource || new BindingList.List().dataSource;\n                        this._refresh();\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.FlipView.itemTemplate\" helpKeyword=\"WinJS.UI.FlipView.itemTemplate\" potentialValueSelector=\"[data-win-control='WinJS.Binding.Template']\">\n                /// Gets or sets a WinJS.Binding.Template or a function that defines the HTML for each item's page.\n                /// </field>\n                itemTemplate: {\n                    get: function () {\n                        return this._itemRenderer;\n                    },\n\n                    set: function (itemTemplate) {\n                        _WriteProfilerMark(\"WinJS.UI.FlipView:set_itemTemplate,info\");\n                        this._itemRendererAfterRefresh = this._getItemRenderer(itemTemplate);\n                        this._refresh();\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.FlipView.itemSpacing\" helpKeyword=\"WinJS.UI.FlipView.itemSpacing\">\n                /// Gets or sets the spacing between items, in pixels.\n                /// </field>\n                itemSpacing: {\n                    get: function () {\n                        return this._pageManager.getItemSpacing();\n                    },\n\n                    set: function (spacing) {\n                        _WriteProfilerMark(\"WinJS.UI.FlipView:set_itemSpacing,info\");\n                        spacing = spacing >> 0;\n                        spacing = spacing < 0 ? 0 : spacing;\n                        this._pageManager.setItemSpacing(spacing);\n                    }\n                },\n\n                count: function FlipView_count() {\n                    /// <signature helpKeyword=\"WinJS.UI.FlipView.count\">\n                    /// <summary locid=\"WinJS.UI.FlipView.count\">\n                    /// Returns the number of items in the FlipView object's itemDataSource.\n                    /// </summary>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.FlipView.count_returnValue\">\n                    /// A Promise that contains the number of items in the list\n                    /// or WinJS.UI.CountResult.unknown if the count is unavailable.\n                    /// </returns>\n                    /// </signature>\n\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:count,info\");\n                    var that = this;\n                    return new Promise(function (complete, error) {\n                        if (that._itemsManager) {\n                            if (that._pageManager._cachedSize === _UI.CountResult.unknown || that._pageManager._cachedSize >= 0) {\n                                complete(that._pageManager._cachedSize);\n                            } else {\n                                that._dataSource.getCount().then(function (count) {\n                                    that._pageManager._cachedSize = count;\n                                    complete(count);\n                                });\n                            }\n                        } else {\n                            error(FlipView.noitemsManagerForCount);\n                        }\n                    });\n                },\n\n                setCustomAnimations: function FlipView_setCustomAnimations(animations) {\n                    /// <signature helpKeyword=\"WinJS.UI.FlipView.setCustomAnimations\">\n                    /// <summary locid=\"WinJS.UI.FlipView.setCustomAnimations\">\n                    /// Sets custom animations for the FlipView to use when navigating between pages.\n                    /// </summary>\n                    /// <param name=\"animations\" type=\"Object\" locid=\"WinJS.UI.FlipView.setCustomAnimations_p:animations\">\n                    /// An object containing up to three fields, one for each navigation action: next, previous, and jump\n                    /// Each of those fields must be a function with this signature: function (outgoingPage, incomingPage).\n                    /// This function returns a WinJS.Promise object that completes once the animations are finished.\n                    /// If a field is null or undefined, the FlipView reverts to its default animation for that action.\n                    /// </param>\n                    /// </signature>\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:setCustomAnimations,info\");\n\n                    if (animations.next !== undefined) {\n                        this._nextAnimation = animations.next;\n                    }\n                    if (animations.previous !== undefined) {\n                        this._prevAnimation = animations.previous;\n                    }\n                    if (animations.jump !== undefined) {\n                        this._jumpAnimation = animations.jump;\n                    }\n                },\n\n                forceLayout: function FlipView_forceLayout() {\n                    /// <signature helpKeyword=\"WinJS.UI.FlipView.forceLayout\">\n                    /// <summary locid=\"WinJS.UI.FlipView.forceLayout\">\n                    /// Forces the FlipView to update its layout.\n                    /// Use this function when making the FlipView visible again after its style.display property had been set to \"none\".\n                    /// </summary>\n                    /// </signature>\n                    _WriteProfilerMark(\"WinJS.UI.FlipView:forceLayout,info\");\n\n                    this._pageManager.resized();\n                },\n\n                // Private members\n\n                _initializeFlipView: function FlipView_initializeFlipView(element, isHorizontal, dataSource, itemRenderer, initialIndex, itemSpacing) {\n                    var that = this;\n                    var flipViewInitialized = false;\n                    this._flipviewDiv = element;\n                    _ElementUtilities.addClass(this._flipviewDiv, flipViewClass);\n                    this._contentDiv = _Global.document.createElement(\"div\");\n                    this._panningDivContainer = _Global.document.createElement(\"div\");\n                    this._panningDivContainer.className = \"win-surface\";\n                    this._panningDiv = _Global.document.createElement(\"div\");\n                    this._prevButton = _Global.document.createElement(\"button\");\n                    this._nextButton = _Global.document.createElement(\"button\");\n                    this._isHorizontal = isHorizontal;\n                    this._dataSource = dataSource;\n                    this._itemRenderer = itemRenderer;\n                    this._itemsManager = null;\n                    this._pageManager = null;\n\n                    var stylesRequiredForFullFeatureMode = [\n                        \"scroll-limit-x-max\",\n                        \"scroll-limit-x-min\",\n                        \"scroll-limit-y-max\",\n                        \"scroll-limit-y-min\",\n                        \"scroll-snap-type\",\n                        \"scroll-snap-x\",\n                        \"scroll-snap-y\",\n                        \"overflow-style\",\n                    ];\n\n                    var allFeaturesSupported = true,\n                        styleEquivalents = _BaseUtils._browserStyleEquivalents;\n                    for (var i = 0, len = stylesRequiredForFullFeatureMode.length; i < len; i++) {\n                        allFeaturesSupported = allFeaturesSupported && !!(styleEquivalents[stylesRequiredForFullFeatureMode[i]]);\n                    }\n                    allFeaturesSupported = allFeaturesSupported && !!_BaseUtils._browserEventEquivalents[\"manipulationStateChanged\"];\n                    allFeaturesSupported = allFeaturesSupported && _ElementUtilities._supportsSnapPoints;\n                    this._environmentSupportsTouch = allFeaturesSupported;\n\n                    var accName = this._flipviewDiv.getAttribute(\"aria-label\");\n                    if (!accName) {\n                        this._flipviewDiv.setAttribute(\"aria-label\", \"\");\n                    }\n\n                    this._flipviewDiv.setAttribute(\"role\", \"listbox\");\n                    if (!this._flipviewDiv.style.overflow) {\n                        this._flipviewDiv.style.overflow = \"hidden\";\n                    }\n                    this._contentDiv.style.position = \"relative\";\n                    this._contentDiv.style.zIndex = 0;\n                    this._contentDiv.style.width = \"100%\";\n                    this._contentDiv.style.height = \"100%\";\n                    this._panningDiv.style.position = \"relative\";\n                    this._panningDivContainer.style.position = \"relative\";\n                    this._panningDivContainer.style.width = \"100%\";\n                    this._panningDivContainer.style.height = \"100%\";\n                    this._panningDivContainer.setAttribute(\"role\", \"group\");\n                    this._panningDivContainer.setAttribute(\"aria-label\", strings.panningContainerAriaLabel);\n\n                    this._contentDiv.appendChild(this._panningDivContainer);\n                    this._flipviewDiv.appendChild(this._contentDiv);\n\n                    this._panningDiv.style.width = \"100%\";\n                    this._panningDiv.style.height = \"100%\";\n                    this._setupOrientation();\n                    function setUpButton(button) {\n                        button.setAttribute(\"aria-hidden\", true);\n                        button.style.visibility = \"hidden\";\n                        button.style.opacity = 0.0;\n                        button.tabIndex = -1;\n                        button.style.zIndex = 1000;\n                    }\n                    setUpButton(this._prevButton);\n                    setUpButton(this._nextButton);\n                    this._prevButton.setAttribute(\"aria-label\", previousButtonLabel);\n                    this._nextButton.setAttribute(\"aria-label\", nextButtonLabel);\n                    this._prevButton.setAttribute(\"type\", \"button\");\n                    this._nextButton.setAttribute(\"type\", \"button\");\n                    this._panningDivContainer.appendChild(this._panningDiv);\n                    this._contentDiv.appendChild(this._prevButton);\n                    this._contentDiv.appendChild(this._nextButton);\n\n                    this._itemsManagerCallback = {\n                        // Callbacks for itemsManager\n                        inserted: function FlipView_inserted(itemPromise, previousHandle, nextHandle) {\n                            that._itemsManager._itemFromPromise(itemPromise).then(function (element) {\n                                var previous = that._itemsManager._elementFromHandle(previousHandle);\n                                var next = that._itemsManager._elementFromHandle(nextHandle);\n                                that._pageManager.inserted(element, previous, next, true);\n                            });\n                        },\n\n                        countChanged: function FlipView_countChanged(newCount, oldCount) {\n                            that._pageManager._cachedSize = newCount;\n\n                            // Don't fire the datasourcecountchanged event when there is a state transition\n                            if (oldCount !== _UI.CountResult.unknown) {\n                                that._fireDatasourceCountChangedEvent();\n                            }\n                        },\n\n                        changed: function FlipView_changed(newElement, oldElement) {\n                            that._pageManager.changed(newElement, oldElement);\n                        },\n\n                        moved: function FlipView_moved(element, prev, next, itemPromise) {\n                            var elementReady = function (element) {\n                                that._pageManager.moved(element, prev, next);\n                            };\n\n                            // If we haven't instantiated this item yet, do so now\n                            if (!element) {\n                                that._itemsManager._itemFromPromise(itemPromise).then(elementReady);\n                            } else {\n                                elementReady(element);\n                            }\n\n                        },\n\n                        removed: function FlipView_removed(element, mirage) {\n                            if (element) {\n                                that._pageManager.removed(element, mirage, true);\n                            }\n                        },\n\n                        knownUpdatesComplete: function FlipView_knownUpdatesComplete() {\n                        },\n\n                        beginNotifications: function FlipView_beginNotifications() {\n                            that._cancelAnimation();\n                            that._pageManager.notificationsStarted();\n                        },\n\n                        endNotifications: function FlipView_endNotifications() {\n                            that._pageManager.notificationsEnded();\n                        },\n\n                        itemAvailable: function FlipView_itemAvailable(real, placeholder) {\n                            that._pageManager.itemRetrieved(real, placeholder);\n                        },\n\n                        reload: function FlipView_reload() {\n                            that._pageManager.reload();\n                        }\n                    };\n\n                    if (this._dataSource) {\n                        this._itemsManager = _ItemsManager._createItemsManager(this._dataSource, this._itemRenderer, this._itemsManagerCallback, {\n                            ownerElement: this._flipviewDiv\n                        });\n                    }\n\n                    this._pageManager = new _PageManager._FlipPageManager(this._flipviewDiv, this._panningDiv, this._panningDivContainer, this._itemsManager, itemSpacing, this._environmentSupportsTouch,\n                    {\n                        hidePreviousButton: function () {\n                            that._hasPrevContent = false;\n                            that._fadeOutButton(\"prev\");\n                            that._prevButton.setAttribute(\"aria-hidden\", true);\n                        },\n\n                        showPreviousButton: function () {\n                            that._hasPrevContent = true;\n                            that._fadeInButton(\"prev\");\n                            that._prevButton.setAttribute(\"aria-hidden\", false);\n                        },\n\n                        hideNextButton: function () {\n                            that._hasNextContent = false;\n                            that._fadeOutButton(\"next\");\n                            that._nextButton.setAttribute(\"aria-hidden\", true);\n                        },\n\n                        showNextButton: function () {\n                            that._hasNextContent = true;\n                            that._fadeInButton(\"next\");\n                            that._nextButton.setAttribute(\"aria-hidden\", false);\n                        }\n                    });\n\n                    this._pageManager.initialize(initialIndex, this._isHorizontal);\n\n                    this._dataSource.getCount().then(function (count) {\n                        that._pageManager._cachedSize = count;\n                    });\n\n                    this._prevButton.addEventListener(\"click\", function () {\n                        that.previous();\n                    }, false);\n\n                    this._nextButton.addEventListener(\"click\", function () {\n                        that.next();\n                    }, false);\n\n                    new _ElementUtilities._MutationObserver(flipViewPropertyChanged).observe(this._flipviewDiv, { attributes: true, attributeFilter: [\"dir\", \"style\"] });\n                    this._cachedStyleDir = this._flipviewDiv.style.direction;\n\n                    this._flipviewDiv.addEventListener(\"mselementresize\", flipviewResized);\n                    _ElementUtilities._resizeNotifier.subscribe(this._flipviewDiv, flipviewResized);\n\n                    this._contentDiv.addEventListener(\"mouseleave\", function () {\n                        that._mouseInViewport = false;\n                    }, false);\n\n                    var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\";\n                    function handleShowButtons(e) {\n                        if (e.pointerType !== PT_TOUCH) {\n                            that._touchInteraction = false;\n                            if (e.screenX === that._lastMouseX && e.screenY === that._lastMouseY) {\n                                return;\n                            }\n                            that._lastMouseX = e.screenX;\n                            that._lastMouseY = e.screenY;\n                            that._mouseInViewport = true;\n                            that._fadeInButton(\"prev\");\n                            that._fadeInButton(\"next\");\n                            that._fadeOutButtons();\n                        }\n                    }\n\n                    function handlePointerDown(e) {\n                        if (e.pointerType === PT_TOUCH) {\n                            that._mouseInViewport = false;\n                            that._touchInteraction = true;\n                            that._fadeOutButtons(true);\n                        } else {\n                            that._touchInteraction = false;\n                            if (!that._isInteractive(e.target)) {\n                                // Disable the default behavior of the mouse wheel button to avoid auto-scroll\n                                if ((e.buttons & 4) !== 0) {\n                                    e.stopPropagation();\n                                    e.preventDefault();\n                                }\n                            }\n                        }\n                    }\n\n                    function handlePointerUp(e) {\n                        if (e.pointerType !== PT_TOUCH) {\n                            that._touchInteraction = false;\n                        }\n                    }\n\n                    if (this._environmentSupportsTouch) {\n                        _ElementUtilities._addEventListener(this._contentDiv, \"pointerdown\", handlePointerDown, false);\n                        _ElementUtilities._addEventListener(this._contentDiv, \"pointermove\", handleShowButtons, false);\n                        _ElementUtilities._addEventListener(this._contentDiv, \"pointerup\", handlePointerUp, false);\n                    }\n\n                    this._panningDivContainer.addEventListener(\"scroll\", function () {\n                        that._scrollPosChanged();\n                    }, false);\n\n                    this._panningDiv.addEventListener(\"blur\", function () {\n                        if (!that._touchInteraction) {\n                            that._fadeOutButtons();\n                        }\n                    }, true);\n\n                    // Scroll position isn't maintained when an element is added/removed from\n                    // the DOM so every time we are placed back in, let the PageManager\n                    // fix the scroll position.\n                    var initiallyParented = _Global.document.body.contains(this._flipviewDiv);\n                    _ElementUtilities._addInsertedNotifier(this._flipviewDiv);\n                    this._flipviewDiv.addEventListener(\"WinJSNodeInserted\", function (event) {\n                        // WinJSNodeInserted fires even if the element is already in the DOM\n                        if (initiallyParented) {\n                            initiallyParented = false;\n                            return;\n                        }\n                        that._pageManager.resized();\n                    }, false);\n\n                    this._flipviewDiv.addEventListener(\"keydown\", function (event) {\n                        if (that._disposed) {\n                            return;\n                        }\n\n                        var cancelBubbleIfHandled = true;\n                        if (!that._isInteractive(event.target)) {\n                            var Key = _ElementUtilities.Key,\n                                handled = false;\n                            if (that._isHorizontal) {\n                                switch (event.keyCode) {\n                                    case Key.leftArrow:\n                                        if (!that._rtl && that.currentPage > 0) {\n                                            that.previous();\n                                            handled = true;\n                                        } else if (that._rtl && that.currentPage < that._pageManager._cachedSize - 1) {\n                                            that.next();\n                                            handled = true;\n                                        }\n                                        break;\n\n                                    case Key.pageUp:\n                                        if (that.currentPage > 0) {\n                                            that.previous();\n                                            handled = true;\n                                        }\n                                        break;\n\n                                    case Key.rightArrow:\n                                        if (!that._rtl && that.currentPage < that._pageManager._cachedSize - 1) {\n                                            that.next();\n                                            handled = true;\n                                        } else if (that._rtl && that.currentPage > 0) {\n                                            that.previous();\n                                            handled = true;\n                                        }\n                                        break;\n\n                                    case Key.pageDown:\n                                        if (that.currentPage < that._pageManager._cachedSize - 1) {\n                                            that.next();\n                                            handled = true;\n                                        }\n                                        break;\n\n                                        // Prevent scrolling pixel by pixel, but let the event bubble up\n                                    case Key.upArrow:\n                                    case Key.downArrow:\n                                        handled = true;\n                                        cancelBubbleIfHandled = false;\n                                        break;\n                                }\n                            } else {\n                                switch (event.keyCode) {\n                                    case Key.upArrow:\n                                    case Key.pageUp:\n                                        if (that.currentPage > 0) {\n                                            that.previous();\n                                            handled = true;\n                                        }\n                                        break;\n\n                                    case Key.downArrow:\n                                    case Key.pageDown:\n                                        if (that.currentPage < that._pageManager._cachedSize - 1) {\n                                            that.next();\n                                            handled = true;\n                                        }\n                                        break;\n\n                                    case Key.space:\n                                        handled = true;\n                                        break;\n                                }\n                            }\n\n                            switch (event.keyCode) {\n                                case Key.home:\n                                    that.currentPage = 0;\n                                    handled = true;\n                                    break;\n\n                                case Key.end:\n                                    if (that._pageManager._cachedSize > 0) {\n                                        that.currentPage = that._pageManager._cachedSize - 1;\n                                    }\n                                    handled = true;\n                                    break;\n                            }\n\n                            if (handled) {\n                                event.preventDefault();\n                                if (cancelBubbleIfHandled) {\n                                    event.stopPropagation();\n                                }\n                                return true;\n                            }\n                        }\n                    }, false);\n\n                    flipViewInitialized = true;\n                },\n\n                _windowWheelHandler: function FlipView_windowWheelHandler(ev) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // When you are using the mouse wheel to scroll a horizontal area such as a WinJS.UI.Hub and one of the sections\n                    // has a WinJS.UI.FlipView you may get stuck on that item. This logic is to allow a scroll event to skip the flipview's\n                    // overflow scroll div and instead go to the parent scroller. We only skip the scroll wheel event for a fixed amount of time\n                    ev = ev.detail.originalEvent;\n                    var wheelWithinFlipper = ev.target && (this._flipviewDiv.contains(ev.target) || this._flipviewDiv === ev.target);\n                    var that = this;\n                    var now = _BaseUtils._now();\n                    var withinAvoidTime = this._avoidTrappingTime > now;\n\n                    if (!wheelWithinFlipper || withinAvoidTime) {\n                        this._avoidTrappingTime = now + avoidTrapDelay;\n                    }\n\n                    if (wheelWithinFlipper && withinAvoidTime) {\n                        this._panningDivContainer.style[\"overflowX\"] = \"hidden\";\n                        this._panningDivContainer.style[\"overflowY\"] = \"hidden\";\n                        _BaseUtils._yieldForDomModification(function () {\n                            // Avoid being stuck between items\n                            that._pageManager._ensureCentered();\n\n                            if (that._isHorizontal) {\n                                that._panningDivContainer.style[\"overflowX\"] = (that._environmentSupportsTouch ? \"scroll\" : \"hidden\");\n                                that._panningDivContainer.style[\"overflowY\"] = \"hidden\";\n                            } else {\n                                that._panningDivContainer.style[\"overflowY\"] = (that._environmentSupportsTouch ? \"scroll\" : \"hidden\");\n                                that._panningDivContainer.style[\"overflowX\"] = \"hidden\";\n                            }\n                        });\n                    } else if (wheelWithinFlipper) {\n                        this._pageManager.simulateMouseWheelScroll(ev);\n                    }\n                },\n\n                _isInteractive: function FlipView_isInteractive(element) {\n                    if (element.parentNode) {\n                        var matches = element.parentNode.querySelectorAll(\".win-interactive, .win-interactive *\");\n                        for (var i = 0, len = matches.length; i < len; i++) {\n                            if (matches[i] === element) {\n                                return true;\n                            }\n                        }\n                    }\n                    return false;\n                },\n\n                _refreshHandler: function FlipView_refreshHandler() {\n                    var dataSource = this._dataSourceAfterRefresh || this._dataSource,\n                        renderer = this._itemRendererAfterRefresh || this._itemRenderer,\n                        initialIndex = this._indexAfterRefresh || 0;\n                    this._setDatasource(dataSource, renderer, initialIndex);\n                    this._dataSourceAfterRefresh = null;\n                    this._itemRendererAfterRefresh = null;\n                    this._indexAfterRefresh = 0;\n                    this._refreshTimer = false;\n                },\n\n                _refresh: function FlipView_refresh() {\n                    if (!this._refreshTimer) {\n                        var that = this;\n                        this._refreshTimer = true;\n                        // Batch calls to _refresh\n                        Scheduler.schedule(function FlipView_refreshHandler() {\n                            if (that._refreshTimer && !that._disposed) {\n                                that._refreshHandler();\n                            }\n                        }, Scheduler.Priority.high, null, \"WinJS.UI.FlipView._refreshHandler\");\n                    }\n                },\n\n                _getItemRenderer: function FlipView_getItemRenderer(itemTemplate) {\n                    var itemRenderer = null;\n                    if (typeof itemTemplate === \"function\") {\n                        var itemPromise = new Promise(function () { });\n                        var itemTemplateResult = itemTemplate(itemPromise);\n                        if (itemTemplateResult.element) {\n                            if (typeof itemTemplateResult.element === \"object\" && typeof itemTemplateResult.element.then === \"function\") {\n                                // This renderer returns a promise to an element\n                                itemRenderer = function (itemPromise) {\n                                    var elementRoot = _Global.document.createElement(\"div\");\n                                    elementRoot.className = \"win-template\";\n                                    _Dispose.markDisposable(elementRoot);\n                                    return {\n                                        element: elementRoot,\n                                        renderComplete: itemTemplate(itemPromise).element.then(function (element) {\n                                            elementRoot.appendChild(element);\n                                        })\n                                    };\n                                };\n                            } else {\n                                // This renderer already returns a placeholder\n                                itemRenderer = itemTemplate;\n                            }\n                        } else {\n                            // Return a renderer that has return a placeholder\n                            itemRenderer = function (itemPromise) {\n                                var elementRoot = _Global.document.createElement(\"div\");\n                                elementRoot.className = \"win-template\";\n                                _Dispose.markDisposable(elementRoot);\n                                // The pagecompleted event relies on this elementRoot\n                                // to ensure that we are still looking at the same\n                                // item after the render completes.\n                                return {\n                                    element: elementRoot,\n                                    renderComplete: itemPromise.then(function () {\n                                        return Promise.as(itemTemplate(itemPromise)).then(function (element) {\n                                            elementRoot.appendChild(element);\n                                        });\n                                    })\n                                };\n                            };\n                        }\n                    } else if (typeof itemTemplate === \"object\") {\n                        itemRenderer = itemTemplate.renderItem;\n                    }\n                    return itemRenderer;\n                },\n\n                _navigate: function FlipView_navigate(goForward, cancelAnimationCallback) {\n                    if (_BaseUtils.validation && this._refreshTimer) {\n                        throw new _ErrorFromName(\"WinJS.UI.FlipView.NavigationDuringStateChange\", strings.navigationDuringStateChange);\n                    }\n\n                    if (!this._animating) {\n                        this._animatingForward = goForward;\n                    }\n                    this._goForward = goForward;\n\n                    if (this._animating && !this._cancelAnimation()) {\n                        return false;\n                    }\n                    var that = this;\n                    var customAnimation = (goForward ? this._nextAnimation : this._prevAnimation),\n                        animation = (customAnimation ? customAnimation : this._defaultAnimation.bind(this)),\n                        completionCallback = function (goForward) { that._completeNavigation(goForward); },\n                        elements = this._pageManager.startAnimatedNavigation(goForward, cancelAnimationCallback, completionCallback);\n                    if (elements) {\n                        this._animationsStarted();\n                        var outgoingElement = elements.outgoing.pageRoot,\n                            incomingElement = elements.incoming.pageRoot;\n                        this._contentDiv.appendChild(outgoingElement);\n                        this._contentDiv.appendChild(incomingElement);\n\n                        this._completeNavigationPending = true;\n                        animation(outgoingElement, incomingElement).then(function () {\n                            if (that._completeNavigationPending) {\n                                completionCallback(that._goForward);\n                            }\n                        }).done();\n                        return true;\n                    } else {\n                        return false;\n                    }\n                },\n\n                _cancelDefaultAnimation: function FlipView_cancelDefaultAnimation(outgoingElement, incomingElement) {\n                    // Cancel the fadeOut animation\n                    outgoingElement.style.opacity = 0;\n\n                    // Cancel the enterContent animation\n                    incomingElement.style.animationName = \"\";\n                    incomingElement.style.opacity = 1;\n                },\n\n                _cancelAnimation: function FlipView_cancelAnimation() {\n                    if (this._pageManager._navigationAnimationRecord &&\n                        this._pageManager._navigationAnimationRecord.completionCallback) {\n\n                        var cancelCallback = this._pageManager._navigationAnimationRecord.cancelAnimationCallback;\n                        if (cancelCallback) {\n                            cancelCallback = cancelCallback.bind(this);\n                        }\n\n                        if (this._pageManager._navigationAnimationRecord && this._pageManager._navigationAnimationRecord.elementContainers) {\n                            var outgoingPage = this._pageManager._navigationAnimationRecord.elementContainers[0],\n                            incomingPage = this._pageManager._navigationAnimationRecord.elementContainers[1],\n                            outgoingElement = outgoingPage.pageRoot,\n                            incomingElement = incomingPage.pageRoot;\n\n                            // Invoke the function that will cancel the animation\n                            if (cancelCallback) {\n                                cancelCallback(outgoingElement, incomingElement);\n                            }\n\n                            // Invoke the completion function after cancelling the animation\n                            this._pageManager._navigationAnimationRecord.completionCallback(this._animatingForward);\n\n                            return true;\n                        }\n                    }\n                    return false;\n                },\n\n                _completeNavigation: function FlipView_completeNavigation(goForward) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._pageManager._resizing = false;\n                    if (this._pageManager._navigationAnimationRecord &&\n                        this._pageManager._navigationAnimationRecord.elementContainers) {\n\n                        var outgoingPage = this._pageManager._navigationAnimationRecord.elementContainers[0],\n                            incomingPage = this._pageManager._navigationAnimationRecord.elementContainers[1],\n                            outgoingElement = outgoingPage.pageRoot,\n                            incomingElement = incomingPage.pageRoot;\n\n                        if (outgoingElement.parentNode) {\n                            outgoingElement.parentNode.removeChild(outgoingElement);\n                        }\n                        if (incomingElement.parentNode) {\n                            incomingElement.parentNode.removeChild(incomingElement);\n                        }\n                        this._pageManager.endAnimatedNavigation(goForward, outgoingPage, incomingPage);\n                        this._fadeOutButtons();\n                        this._scrollPosChanged();\n                        this._pageManager._ensureCentered(true);\n                        this._animationsFinished();\n                    }\n                    this._completeNavigationPending = false;\n                },\n\n                _completeJump: function FlipView_completeJump() {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._pageManager._resizing = false;\n                    if (this._pageManager._navigationAnimationRecord &&\n                        this._pageManager._navigationAnimationRecord.elementContainers) {\n\n                        var outgoingPage = this._pageManager._navigationAnimationRecord.elementContainers[0],\n                            incomingPage = this._pageManager._navigationAnimationRecord.elementContainers[1],\n                            outgoingElement = outgoingPage.pageRoot,\n                            incomingElement = incomingPage.pageRoot;\n\n                        if (outgoingElement.parentNode) {\n                            outgoingElement.parentNode.removeChild(outgoingElement);\n                        }\n                        if (incomingElement.parentNode) {\n                            incomingElement.parentNode.removeChild(incomingElement);\n                        }\n\n                        this._pageManager.endAnimatedJump(outgoingPage, incomingPage);\n                        this._animationsFinished();\n                    }\n                    this._completeJumpPending = false;\n                },\n\n                _resize: function FlipView_resize() {\n                    this._pageManager.resized();\n                },\n\n                _setCurrentIndex: function FlipView_setCurrentIndex(index) {\n                    return this._pageManager.jumpToIndex(index);\n                },\n\n                _getCurrentIndex: function FlipView_getCurrentIndex() {\n                    return this._pageManager.currentIndex();\n                },\n\n                _setDatasource: function FlipView_setDatasource(source, template, index) {\n                    if (this._animating) {\n                        this._cancelAnimation();\n                    }\n\n                    var initialIndex = 0;\n                    if (index !== undefined) {\n                        initialIndex = index;\n                    }\n                    this._dataSource = source;\n                    this._itemRenderer = template;\n                    var oldItemsManager = this._itemsManager;\n                    this._itemsManager = _ItemsManager._createItemsManager(this._dataSource, this._itemRenderer, this._itemsManagerCallback, {\n                        ownerElement: this._flipviewDiv\n                    });\n                    this._dataSource = this._itemsManager.dataSource;\n\n                    var that = this;\n                    this._dataSource.getCount().then(function (count) {\n                        that._pageManager._cachedSize = count;\n                    });\n                    this._pageManager.setNewItemsManager(this._itemsManager, initialIndex);\n                    oldItemsManager && oldItemsManager.release();\n                },\n\n                _fireDatasourceCountChangedEvent: function FlipView_fireDatasourceCountChangedEvent() {\n                    var that = this;\n                    Scheduler.schedule(function FlipView_dispatchDataSourceCountChangedEvent() {\n                        var event = _Global.document.createEvent(\"Event\");\n                        event.initEvent(FlipView.datasourceCountChangedEvent, true, true);\n                        _WriteProfilerMark(\"WinJS.UI.FlipView:dataSourceCountChangedEvent,info\");\n                        that._flipviewDiv.dispatchEvent(event);\n                    }, Scheduler.Priority.normal, null, \"WinJS.UI.FlipView._dispatchDataSourceCountChangedEvent\");\n                },\n\n                _scrollPosChanged: function FlipView_scrollPosChanged() {\n                    if (!this._disposed) {\n                        this._pageManager.scrollPosChanged();\n                    }\n                },\n\n                _axisAsString: function FlipView_axisAsString() {\n                    return (this._isHorizontal ? \"horizontal\" : \"vertical\");\n                },\n\n                _setupOrientation: function FlipView_setupOrientation() {\n                    if (this._isHorizontal) {\n                        this._panningDivContainer.style[\"overflowX\"] = (this._environmentSupportsTouch ? \"scroll\" : \"hidden\");\n                        this._panningDivContainer.style[\"overflowY\"] = \"hidden\";\n                        var rtl = _Global.getComputedStyle(this._flipviewDiv, null).direction === \"rtl\";\n                        this._rtl = rtl;\n                        if (rtl) {\n                            this._prevButton.className = navButtonClass + \" \" + navButtonRightClass;\n                            this._nextButton.className = navButtonClass + \" \" + navButtonLeftClass;\n                        } else {\n                            this._prevButton.className = navButtonClass + \" \" + navButtonLeftClass;\n                            this._nextButton.className = navButtonClass + \" \" + navButtonRightClass;\n                        }\n                        this._prevButton.innerHTML = (rtl ? rightArrowGlyph : leftArrowGlyph);\n                        this._nextButton.innerHTML = (rtl ? leftArrowGlyph : rightArrowGlyph);\n                    } else {\n                        this._panningDivContainer.style[\"overflowY\"] = (this._environmentSupportsTouch ? \"scroll\" : \"hidden\");\n                        this._panningDivContainer.style[\"overflowX\"] = \"hidden\";\n                        this._prevButton.className = navButtonClass + \" \" + navButtonTopClass;\n                        this._nextButton.className = navButtonClass + \" \" + navButtonBottomClass;\n                        this._prevButton.innerHTML = topArrowGlyph;\n                        this._nextButton.innerHTML = bottomArrowGlyph;\n                    }\n                    this._panningDivContainer.style[\"msOverflowStyle\"] = \"none\";\n                },\n\n                _fadeInButton: function FlipView_fadeInButton(button, forceShow) {\n                    if (this._mouseInViewport || forceShow || !this._environmentSupportsTouch) {\n                        if (button === \"next\" && this._hasNextContent) {\n                            if (this._nextButtonAnimation) {\n                                this._nextButtonAnimation.cancel();\n                                this._nextButtonAnimation = null;\n                            }\n\n                            this._nextButton.style.visibility = \"visible\";\n                            this._nextButtonAnimation = this._fadeInFromCurrentValue(this._nextButton);\n                        } else if (button === \"prev\" && this._hasPrevContent) {\n                            if (this._prevButtonAnimation) {\n                                this._prevButtonAnimation.cancel();\n                                this._prevButtonAnimation = null;\n                            }\n\n                            this._prevButton.style.visibility = \"visible\";\n                            this._prevButtonAnimation = this._fadeInFromCurrentValue(this._prevButton);\n                        }\n                    }\n                },\n\n                _fadeOutButton: function FlipView_fadeOutButton(button) {\n                    var that = this;\n                    if (button === \"next\") {\n                        if (this._nextButtonAnimation) {\n                            this._nextButtonAnimation.cancel();\n                            this._nextButtonAnimation = null;\n                        }\n\n                        this._nextButtonAnimation = Animations.fadeOut(this._nextButton).\n                            then(function () {\n                                that._nextButton.style.visibility = \"hidden\";\n                            });\n                        return this._nextButtonAnimation;\n                    } else {\n                        if (this._prevButtonAnimation) {\n                            this._prevButtonAnimation.cancel();\n                            this._prevButtonAnimation = null;\n                        }\n\n                        this._prevButtonAnimation = Animations.fadeOut(this._prevButton).\n                            then(function () {\n                                that._prevButton.style.visibility = \"hidden\";\n                            });\n                        return this._prevButtonAnimation;\n                    }\n                },\n\n                _fadeOutButtons: function FlipView_fadeOutButtons(immediately) {\n                    if (!this._environmentSupportsTouch) {\n                        return;\n                    }\n\n                    if (this._buttonFadePromise) {\n                        this._buttonFadePromise.cancel();\n                        this._buttonFadePromise = null;\n                    }\n\n                    var that = this;\n                    this._buttonFadePromise = (immediately ? Promise.wrap() : Promise.timeout(_TransitionAnimation._animationTimeAdjustment(buttonFadeDelay))).then(function () {\n                        that._fadeOutButton(\"prev\");\n                        that._fadeOutButton(\"next\");\n                        that._buttonFadePromise = null;\n                    });\n                },\n\n                _animationsStarted: function FlipView_animationsStarted() {\n                    this._animating = true;\n                },\n\n                _animationsFinished: function FlipView_animationsFinished() {\n                    this._animating = false;\n                },\n\n                _defaultAnimation: function FlipView_defaultAnimation(curr, next) {\n                    var incomingPageMove = {};\n                    next.style.left = \"0px\";\n                    next.style.top = \"0px\";\n                    next.style.opacity = 0.0;\n                    var pageDirection = ((curr.itemIndex > next.itemIndex) ? -animationMoveDelta : animationMoveDelta);\n                    incomingPageMove.left = (this._isHorizontal ? (this._rtl ? -pageDirection : pageDirection) : 0) + \"px\";\n                    incomingPageMove.top = (this._isHorizontal ? 0 : pageDirection) + \"px\";\n                    var fadeOutPromise = Animations.fadeOut(curr),\n                        enterContentPromise = Animations.enterContent(next, [incomingPageMove], { mechanism: \"transition\" });\n                    return Promise.join([fadeOutPromise, enterContentPromise]);\n                },\n\n                _fadeInFromCurrentValue: function FlipView_fadeInFromCurrentValue(shown) {\n                    // Intentionally not using the PVL fadeIn animation because we don't want\n                    // to start always from 0 in some cases\n                    return _TransitionAnimation.executeTransition(\n                        shown,\n                        {\n                            property: \"opacity\",\n                            delay: 0,\n                            duration: 167,\n                            timing: \"linear\",\n                            to: 1\n                        });\n                }\n            }, _Constants);\n\n            _Base.Class.mix(FlipView, _Events.createEventProperties(\n                FlipView.datasourceCountChangedEvent,\n                FlipView.pageVisibilityChangedEvent,\n                FlipView.pageSelectedEvent,\n                FlipView.pageCompletedEvent));\n            _Base.Class.mix(FlipView, _Control.DOMEventMixin);\n\n            return FlipView;\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ItemContainer',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../Scheduler',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_KeyboardBehavior',\n    '../Utilities/_UI',\n    './ItemContainer/_Constants',\n    './ItemContainer/_ItemEventsHandler'\n    ], function itemContainerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Hoverable, _KeyboardBehavior, _UI, _Constants, _ItemEventsHandler) {\n    \"use strict\";\n\n    var createEvent = _Events._createEventProperty;\n    var eventNames = {\n        invoked: \"invoked\",\n        selectionchanging: \"selectionchanging\",\n        selectionchanged: \"selectionchanged\"\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.ItemContainer\">\n        /// Defines an item that can be pressed, selected, and dragged.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.itemcontainer.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.itemcontainer.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[\n        /// <div data-win-control=\"WinJS.UI.ItemContainer\" data-win-options=\"{selected: true}\">HTML content</div>\n        /// ]]></htmlSnippet>\n        /// <event name=\"invoked\" bubbles=\"true\" locid=\"WinJS.UI.ItemContainer_e:invoked\">Raised when the user taps or clicks the item.</event>\n        /// <event name=\"selectionchanging\" bubbles=\"true\" locid=\"WinJS.UI.ItemContainer_e:selectionchanging\">Raised before the item is selected or deselected.</event>\n        /// <event name=\"selectionchanged\" bubbles=\"true\" locid=\"WinJS.UI.ItemContainer_e:selectionchanged\">Raised after the item is selected or deselected.</event>\n        /// <part name=\"itemcontainer\" class=\"win-itemcontainer\" locid=\"WinJS.UI.ItemContainer_part:itemcontainer\">Main container for the selection item control.</part>\n        /// <part name=\"selectionbackground\" class=\"win-selectionbackground\" locid=\"WinJS.UI.ItemContainer_part:selectionbackground\">The background of a selection checkmark.</part>\n        /// <part name=\"selectioncheckmark\" class=\"win-selectioncheckmark\" locid=\"WinJS.UI.ItemContainer_part:selectioncheckmark\">A selection checkmark.</part>\n        /// <part name=\"focusedoutline\" class=\"win-focusedoutline\" locid=\"WinJS.UI.ItemContainer_part:focusedoutline\">Used to display an outline when the main container has keyboard focus.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        ItemContainer: _Base.Namespace._lazy(function () {\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get swipeOrientationDeprecated() { return \"Invalid configuration: swipeOrientation is deprecated. The control will default this property to 'none'\"; },\n                get swipeBehaviorDeprecated() { return \"Invalid configuration: swipeBehavior is deprecated. The control will default this property to 'none'\"; }\n            };\n\n            var ItemContainer = _Base.Class.define(function ItemContainer_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.ItemContainer.ItemContainer\">\n                /// <summary locid=\"WinJS.UI.ItemContainer.constructor\">\n                /// Creates a new ItemContainer control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.ItemContainer.constructor_p:element\">\n                /// The DOM element that hosts the ItemContainer control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.ItemContainer.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the selectionchanging event,\n                /// add a property named \"onselectionchanging\" to the options object and set its value to the event handler.\n                /// </param>\n                /// <returns type=\"WinJS.UI.ItemContainer\" locid=\"WinJS.UI.ItemContainer.constructor_returnValue\">\n                /// The new ItemContainer control.\n                /// </returns>\n                /// </signature>\n                element = element || _Global.document.createElement(\"DIV\");\n                this._id = element.id || _ElementUtilities._uniqueID(element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.ItemContainer.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n\n                this._element = element;\n                _ElementUtilities.addClass(element, \"win-disposable\");\n                this._selectionMode = _UI.SelectionMode.single;\n                this._draggable = false;\n                this._pressedEntity = { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };\n\n                this.tapBehavior = _UI.TapBehavior.invokeOnly;\n\n                _ElementUtilities.addClass(this.element, ItemContainer._ClassName.itemContainer + \" \" + _Constants._containerClass);\n\n                this._setupInternalTree();\n\n                this._selection = new exports._SingleItemSelectionManager(element, this._itemBox);\n                this._setTabIndex();\n\n                _Control.setOptions(this, options);\n\n                this._mutationObserver = new _ElementUtilities._MutationObserver(this._itemPropertyChange.bind(this));\n                this._mutationObserver.observe(element, { attributes: true, attributeFilter: [\"aria-selected\"] });\n                this._setAriaRole();\n\n                var that = this;\n                if (!this.selectionDisabled) {\n                    Scheduler.schedule(function ItemContainer_async_initialize() {\n                        that._setDirectionClass();\n                    }, Scheduler.Priority.normal, null, \"WinJS.UI.ItemContainer_async_initialize\");\n                }\n                this._itemEventsHandler = new _ItemEventsHandler._ItemEventsHandler(Object.create({\n                    containerFromElement: function () {\n                        return that.element;\n                    },\n                    indexForItemElement: function () {\n                        return 1;\n                    },\n                    indexForHeaderElement: function () {\n                        return _Constants._INVALID_INDEX;\n                    },\n                    itemBoxAtIndex: function () {\n                        return that._itemBox;\n                    },\n                    itemAtIndex: function () {\n                        return that.element;\n                    },\n                    headerAtIndex: function () {\n                        return null;\n                    },\n                    containerAtIndex: function () {\n                        return that.element;\n                    },\n                    isZombie: function () {\n                        return this._disposed;\n                    },\n                    getItemPosition: function () {\n                        return that._getItemPosition();\n                    },\n                    rtl: function () {\n                        return that._rtl();\n                    },\n                    fireInvokeEvent: function () {\n                        that._fireInvokeEvent();\n                    },\n                    verifySelectionAllowed: function () {\n                        return that._verifySelectionAllowed();\n                    },\n                    changeFocus: function () { },\n                    selectRange: function (firstIndex, lastIndex) {\n                        return that._selection.set({ firstIndex: firstIndex, lastIndex: lastIndex });\n                    }\n                }, {\n                    pressedEntity: {\n                        get: function () {\n                            return that._pressedEntity;\n                        },\n                        set: function (value) {\n                            that._pressedEntity = value;\n                        }\n                    },\n                    pressedElement: {\n                        enumerable: true,\n                        set: function (value) {\n                            that._pressedElement = value;\n                        }\n                    },\n                    eventHandlerRoot: {\n                        enumerable: true,\n                        get: function () {\n                            return that.element;\n                        }\n                    },\n                    selectionMode: {\n                        enumerable: true,\n                        get: function () {\n                            return that._selectionMode;\n                        }\n                    },\n                    accessibleItemClass: {\n                        enumerable: true,\n                        get: function () {\n                            // CSS class of the element with the aria role\n                            return _Constants._containerClass;\n                        }\n                    },\n                    canvasProxy: {\n                        enumerable: true,\n                        get: function () {\n                            return that._captureProxy;\n                        }\n                    },\n                    tapBehavior: {\n                        enumerable: true,\n                        get: function () {\n                            return that._tapBehavior;\n                        }\n                    },\n                    draggable: {\n                        enumerable: true,\n                        get: function () {\n                            return that._draggable;\n                        }\n                    },\n                    selection: {\n                        enumerable: true,\n                        get: function () {\n                            return that._selection;\n                        }\n                    },\n                    customFootprintParent: {\n                        enumerable: true,\n                        get: function () {\n                            // Use the main container as the footprint\n                            return null;\n                        }\n                    },\n                    skipPreventDefaultOnPointerDown: {\n                        enumerable: true,\n                        get: function () {\n                            return true;\n                        }\n                    }\n                }));\n\n                function eventHandler(eventName, caseSensitive, capture) {\n                    return {\n                        name: (caseSensitive ? eventName : eventName.toLowerCase()),\n                        handler: function (eventObject) {\n                            that[\"_on\" + eventName](eventObject);\n                        },\n                        capture: capture\n                    };\n                }\n                var events = [\n                    eventHandler(\"PointerDown\"),\n                    eventHandler(\"Click\"),\n                    eventHandler(\"PointerUp\"),\n                    eventHandler(\"PointerCancel\"),\n                    eventHandler(\"LostPointerCapture\"),\n                    eventHandler(\"ContextMenu\"),\n                    eventHandler(\"MSHoldVisual\", true),\n                    eventHandler(\"FocusIn\"),\n                    eventHandler(\"FocusOut\"),\n                    eventHandler(\"DragStart\"),\n                    eventHandler(\"DragEnd\"),\n                    eventHandler(\"KeyDown\")\n                ];\n                events.forEach(function (eventHandler) {\n                    _ElementUtilities._addEventListener(that.element, eventHandler.name, eventHandler.handler, !!eventHandler.capture);\n                });\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.ItemContainer.element\" helpKeyword=\"WinJS.UI.ItemContainer.element\">\n                /// Gets the DOM element that hosts the itemContainer control.\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ItemContainer.draggable\" helpKeyword=\"WinJS.UI.ItemContainer.draggable\">\n                /// Gets or sets a value that specifies whether the item can be dragged. The default value is false.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                draggable: {\n                    get: function () {\n                        return this._draggable;\n                    },\n\n                    set: function (value) {\n                        if (_BaseUtils.isPhone) {\n                            return;\n                        }\n                        if (this._draggable !== value) {\n                            this._draggable = value;\n                            this._updateDraggableAttribute();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ItemContainer.selected\" helpKeyword=\"WinJS.UI.ItemContainer.selected\">\n                /// Gets or sets a value that specifies whether the item is selected.\n                /// </field>\n                selected: {\n                    get: function () {\n                        return this._selection.selected;\n                    },\n\n                    set: function (value) {\n                        if (this._selection.selected !== value) {\n                            this._selection.selected = value;\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Orientation\" locid=\"WinJS.UI.ItemContainer.swipeOrientation\" helpKeyword=\"WinJS.UI.ItemContainer.swipeOrientation\">\n                /// Gets or sets the swipe orientation of the ItemContainer control.\n                /// The default value is \"none\".\n                /// <deprecated type=\"deprecate\">\n                /// swipeOrientation is deprecated. The control will not use this property.\n                /// </deprecated>\n                /// </field>\n                swipeOrientation: {\n                    get: function () {\n                        return \"none\";\n                    },\n                    set: function (value) {\n                        _ElementUtilities._deprecated(strings.swipeOrientationDeprecated);\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.TapBehavior\" locid=\"WinJS.UI.ItemContainer.tapBehavior\" helpKeyword=\"WinJS.UI.ItemContainer.tapBehavior\">\n                /// Gets or sets how the ItemContainer control reacts when the user taps or clicks an item.\n                /// The tap or click can invoke the item, select it and invoke it, or have no effect.\n                /// Possible values: \"toggleSelect\", \"invokeOnly\", and \"none\". The default value is \"invokeOnly\".\n                /// </field>\n                tapBehavior: {\n                    get: function () {\n                        return this._tapBehavior;\n                    },\n                    set: function (value) {\n                        if (_BaseUtils.isPhone && value === _UI.TapBehavior.directSelect) {\n                            return;\n                        }\n                        this._tapBehavior = value;\n                        this._setAriaRole();\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.SwipeBehavior\" locid=\"WinJS.UI.ItemContainer.swipeBehavior\" helpKeyword=\"WinJS.UI.ItemContainer.swipeBehavior\">\n                /// Gets or sets how the ItemContainer control reacts to the swipe interaction.\n                /// The swipe gesture can select the item or it can have no effect on the current selection.\n                /// Possible values: \"none\".\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// <deprecated type=\"deprecate\">\n                /// swipeBehavior is deprecated. The control will not use this property.\n                /// </deprecated>\n                /// </field>\n                swipeBehavior: {\n                    get: function () {\n                        return \"none\";\n                    },\n                    set: function (value) {\n                        _ElementUtilities._deprecated(strings.swipeBehaviorDeprecated);\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ItemContainer.selectionDisabled\" helpKeyword=\"WinJS.UI.ItemContainer.selectionDisabled\">\n                /// Gets or sets whether the item selection is disabled. The default value is false.\n                /// </field>\n                selectionDisabled: {\n                    get: function () {\n                        return this._selectionMode === _UI.SelectionMode.none;\n                    },\n\n                    set: function (value) {\n                        if (value) {\n                            this._selectionMode = _UI.SelectionMode.none;\n                        } else {\n                            this._setDirectionClass();\n                            this._selectionMode = _UI.SelectionMode.single;\n                        }\n                        this._setAriaRole();\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.ItemCotrol.oninvoked\" helpKeyword=\"WinJS.UI.ItemCotrol.oninvoked\">\n                /// Raised when the item is invoked. You can use the tapBehavior property to specify whether taps and clicks invoke the item.\n                /// </field>\n                oninvoked: createEvent(eventNames.invoked),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.ItemCotrol.onselectionchanging\" helpKeyword=\"WinJS.UI.ItemCotrol.onselectionchanging\">\n                /// Raised just before the item is selected or deselected.\n                /// </field>\n                onselectionchanging: createEvent(eventNames.selectionchanging),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.ItemCotrol.onselectionchanged\" helpKeyword=\"WinJS.UI.ItemCotrol.onselectionchanged\">\n                /// Raised after the item is selected or deselected.\n                /// </field>\n                onselectionchanged: createEvent(eventNames.selectionchanged),\n\n                forceLayout: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.ItemContainer.forceLayout\">\n                    /// <summary locid=\"WinJS.UI.ItemContainer.forceLayout\">\n                    /// Forces the ItemContainer control to update its layout.\n                    /// Use this function when the reading direction  of the app changes after the control has been initialized.\n                    /// </summary>\n                    /// </signature>\n                    this._forceLayout();\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.ItemContainer.dispose\">\n                    /// <summary locid=\"WinJS.UI.ItemContainer.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// </signature>\n\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    this._itemEventsHandler.dispose();\n                    _Dispose.disposeSubTree(this.element);\n                },\n\n                _onMSManipulationStateChanged: function ItemContainer_onMSManipulationStateChanged(eventObject) {\n                    this._itemEventsHandler.onMSManipulationStateChanged(eventObject);\n                },\n\n                _onPointerDown: function ItemContainer_onPointerDown(eventObject) {\n                    this._itemEventsHandler.onPointerDown(eventObject);\n                },\n\n                _onClick: function ItemContainer_onClick(eventObject) {\n                    this._itemEventsHandler.onClick(eventObject);\n                },\n\n                _onPointerUp: function ItemContainer_onPointerUp(eventObject) {\n                    if (_ElementUtilities.hasClass(this._itemBox, _Constants._itemFocusClass)) {\n                        this._onFocusOut(eventObject);\n                    }\n                    this._itemEventsHandler.onPointerUp(eventObject);\n                },\n\n                _onPointerCancel: function ItemContainer_onPointerCancel(eventObject) {\n                    this._itemEventsHandler.onPointerCancel(eventObject);\n                },\n\n                _onLostPointerCapture: function ItemContainer_onLostPointerCapture(eventObject) {\n                    this._itemEventsHandler.onLostPointerCapture(eventObject);\n                },\n\n                _onContextMenu: function ItemContainer_onContextMenu(eventObject) {\n                    this._itemEventsHandler.onContextMenu(eventObject);\n                },\n\n                _onMSHoldVisual: function ItemContainer_onMSHoldVisual(eventObject) {\n                    this._itemEventsHandler.onMSHoldVisual(eventObject);\n                },\n\n                _onFocusIn: function ItemContainer_onFocusIn() {\n                    if (this._itemBox.querySelector(\".\" + _Constants._itemFocusOutlineClass) || !_KeyboardBehavior._keyboardSeenLast) {\n                        return;\n                    }\n                    _ElementUtilities.addClass(this._itemBox, _Constants._itemFocusClass);\n                    var outline = _Global.document.createElement(\"div\");\n                    outline.className = _Constants._itemFocusOutlineClass;\n                    this._itemBox.appendChild(outline);\n                },\n\n                _onFocusOut: function ItemContainer_onFocusOut() {\n                    _ElementUtilities.removeClass(this._itemBox, _Constants._itemFocusClass);\n                    var outline = this._itemBox.querySelector(\".\" + _Constants._itemFocusOutlineClass);\n                    if (outline) {\n                        outline.parentNode.removeChild(outline);\n                    }\n                },\n\n                _onDragStart: function ItemContainer_onDragStart(eventObject) {\n                    // Drag shouldn't be initiated when the user holds down the mouse on a win-interactive element and moves.\n                    // The problem is that the dragstart event's srcElement+target will both be an itembox (which has draggable=true), so we can't check for win-interactive in the dragstart event handler.\n                    // The itemEventsHandler sets our _pressedElement field on PointerDown, so we use that instead when checking for interactive.\n                    if (this._pressedElement && this._itemEventsHandler._isInteractive(this._pressedElement)) {\n                        eventObject.preventDefault();\n                    } else {\n                        this._dragging = true;\n                        var that = this;\n\n                        // Firefox requires setData to be called on the dataTransfer object in order for DnD to continue.\n                        // Firefox also has an issue rendering the item's itemBox+element, so we need to use setDragImage, using the item's container, to get it to render.\n                        eventObject.dataTransfer.setData(\"text\", \"\");\n                        if (eventObject.dataTransfer.setDragImage) {\n                            var rect = this.element.getBoundingClientRect();\n                            eventObject.dataTransfer.setDragImage(this.element, eventObject.clientX - rect.left, eventObject.clientY - rect.top);\n                        }\n                        // We delay setting the win-dragsource CSS class so that IE has time to create a thumbnail before me make it opaque\n                        _BaseUtils._yieldForDomModification(function () {\n                            if (that._dragging) {\n                                _ElementUtilities.addClass(that._itemBox, _Constants._dragSourceClass);\n                            }\n                        });\n                    }\n                },\n\n                _onDragEnd: function ItemContainer_onDragEnd() {\n                    this._dragging = false;\n                    _ElementUtilities.removeClass(this._itemBox, _Constants._dragSourceClass);\n                    this._itemEventsHandler.resetPointerDownState();\n                },\n\n                _onKeyDown: function ItemContainer_onKeyDown(eventObject) {\n                    if (!this._itemEventsHandler._isInteractive(eventObject.target)) {\n                        var Key = _ElementUtilities.Key,\n                            keyCode = eventObject.keyCode;\n\n                        var handled = false;\n                        if (!eventObject.ctrlKey && keyCode === Key.enter) {\n                            var allowed = this._verifySelectionAllowed();\n                            if (allowed.canTapSelect) {\n                                this.selected = !this.selected;\n                            }\n                            this._fireInvokeEvent();\n                            handled = true;\n                        } else if (eventObject.ctrlKey && keyCode === Key.enter || keyCode === Key.space) {\n                            if (!this.selectionDisabled) {\n                                this.selected = !this.selected;\n                                handled = _ElementUtilities._setActive(this.element);\n                            }\n                        } else if (keyCode === Key.escape && this.selected) {\n                            this.selected = false;\n                            handled = true;\n                        }\n\n                        if (handled) {\n                            eventObject.stopPropagation();\n                            eventObject.preventDefault();\n                        }\n                    }\n                },\n\n                _setTabIndex: function ItemContainer_setTabIndex() {\n                    var currentTabIndex = this.element.getAttribute(\"tabindex\");\n                    if (!currentTabIndex) {\n                        // Set the tabindex to 0 only if the application did not already\n                        // provide a tabindex\n                        this.element.setAttribute(\"tabindex\", \"0\");\n                    }\n                },\n\n                _rtl: function ItemContainer_rtl() {\n                    if (typeof this._cachedRTL !== \"boolean\") {\n                        this._cachedRTL = _Global.getComputedStyle(this.element, null).direction === \"rtl\";\n                    }\n                    return this._cachedRTL;\n                },\n\n                _setDirectionClass: function ItemContainer_setDirectionClass() {\n                    _ElementUtilities[this._rtl() ? \"addClass\" : \"removeClass\"](this.element, _Constants._rtlListViewClass);\n                },\n\n                _forceLayout: function ItemContainer_forceLayout() {\n                    this._cachedRTL = _Global.getComputedStyle(this.element, null).direction === \"rtl\";\n                    this._setDirectionClass();\n                },\n\n                _getItemPosition: function ItemContainer_getItemPosition() {\n                    var container = this.element;\n                    if (container) {\n                        return Promise.wrap({\n                            left: (this._rtl() ?\n                                container.offsetParent.offsetWidth - container.offsetLeft - container.offsetWidth :\n                                container.offsetLeft),\n                            top: container.offsetTop,\n                            totalWidth: _ElementUtilities.getTotalWidth(container),\n                            totalHeight: _ElementUtilities.getTotalHeight(container),\n                            contentWidth: _ElementUtilities.getContentWidth(container),\n                            contentHeight: _ElementUtilities.getContentHeight(container)\n                        });\n                    } else {\n                        return Promise.cancel;\n                    }\n                },\n\n                _itemPropertyChange: function ItemContainer_itemPropertyChange(list) {\n                    if (this._disposed) { return; }\n\n                    var container = list[0].target;\n                    var ariaSelected = container.getAttribute(\"aria-selected\") === \"true\";\n\n                    // Only respond to aria-selected changes coming from UIA. This check\n                    // relies on the fact that, in renderSelection, we update the selection\n                    // visual before aria-selected.\n                    if (ariaSelected !== _ElementUtilities._isSelectionRendered(this._itemBox)) {\n                        if (this.selectionDisabled) {\n                            // Revert the change made by UIA since the control has selection disabled\n                            _ElementUtilities._setAttribute(container, \"aria-selected\", !ariaSelected);\n                        } else {\n                            this.selected = ariaSelected;\n                            // Revert the change because the update was prevented on the selectionchanging event\n                            if (ariaSelected !== this.selected) {\n                                _ElementUtilities._setAttribute(container, \"aria-selected\", !ariaSelected);\n                            }\n                        }\n                    }\n                },\n\n                _updateDraggableAttribute: function ItemContainer_updateDraggableAttribute() {\n                    this._itemBox.setAttribute(\"draggable\", this._draggable);\n                },\n\n                _verifySelectionAllowed: function ItemContainer_verifySelectionAllowed() {\n                    if (this._selectionMode !== _UI.SelectionMode.none && this._tapBehavior === _UI.TapBehavior.toggleSelect) {\n                        var canSelect = this._selection.fireSelectionChanging();\n                        return {\n                            canSelect: canSelect,\n                            canTapSelect: canSelect && this._tapBehavior === _UI.TapBehavior.toggleSelect\n                        };\n                    } else {\n                        return {\n                            canSelect: false,\n                            canTapSelect: false\n                        };\n                    }\n                },\n\n                _setupInternalTree: function ItemContainer_setupInternalTree() {\n                    var item = _Global.document.createElement(\"div\");\n                    item.className = _Constants._itemClass;\n                    this._captureProxy = _Global.document.createElement(\"div\");\n                    this._itemBox = _Global.document.createElement(\"div\");\n                    this._itemBox.className = _Constants._itemBoxClass;\n                    var child = this.element.firstChild;\n                    while (child) {\n                        var sibling = child.nextSibling;\n                        item.appendChild(child);\n                        child = sibling;\n                    }\n                    this.element.appendChild(this._itemBox);\n                    this._itemBox.appendChild(item);\n                    this.element.appendChild(this._captureProxy);\n                },\n\n                _fireInvokeEvent: function ItemContainer_fireInvokeEvent() {\n                    if (this.tapBehavior !== _UI.TapBehavior.none) {\n                        var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                        eventObject.initCustomEvent(eventNames.invoked, true, false, {});\n                        this.element.dispatchEvent(eventObject);\n                    }\n                },\n\n                _setAriaRole: function ItemContainer_setAriaRole() {\n                    if (!this.element.getAttribute(\"role\") || this._usingDefaultItemRole) {\n                        this._usingDefaultItemRole = true;\n                        var defaultItemRole;\n                        if (this.tapBehavior === _UI.TapBehavior.none && this.selectionDisabled) {\n                            defaultItemRole = \"listitem\";\n                        } else {\n                            defaultItemRole = \"option\";\n                        }\n                        _ElementUtilities._setAttribute(this.element, \"role\", defaultItemRole);\n                    }\n                },\n\n                _writeProfilerMark: function ItemContainer_writeProfilerMark(text) {\n                    var message = \"WinJS.UI.ItemContainer:\" + this._id + \":\" + text;\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, null, \"itemcontainerprofiler\");\n                }\n            }, {\n                // Names of classes used by the ItemContainer.\n                _ClassName: {\n                    itemContainer: \"win-itemcontainer\",\n                    vertical: \"win-vertical\",\n                    horizontal: \"win-horizontal\",\n                }\n            });\n            _Base.Class.mix(ItemContainer, _Control.DOMEventMixin);\n            return ItemContainer;\n        }),\n\n        _SingleItemSelectionManager: _Base.Namespace._lazy(function () {\n            return _Base.Class.define(function SingleItemSelectionManager_ctor(element, itemBox) {\n                this._selected = false;\n                this._element = element;\n                this._itemBox = itemBox;\n            }, {\n                selected: {\n                    get: function () {\n                        return this._selected;\n                    },\n                    set: function (value) {\n                        value = !!value;\n                        if (this._selected !== value) {\n                            if (this.fireSelectionChanging()) {\n                                this._selected = value;\n                                _ItemEventsHandler._ItemEventsHandler.renderSelection(this._itemBox, this._element, value, true, this._element);\n                                this.fireSelectionChanged();\n                            }\n                        }\n                    }\n                },\n\n                count: function SingleItemSelectionManager_count() {\n                    return this._selected ? 1 : 0;\n                },\n\n                getIndices: function SingleItemSelectionManager_getIndices() {\n                    // not used\n                },\n\n                getItems: function SingleItemSelectionManager_getItems() {\n                    // not used\n                },\n\n                getRanges: function SingleItemSelectionManager_getRanges() {\n                    // not used\n                },\n\n                isEverything: function SingleItemSelectionManager_isEverything() {\n                    return false;\n                },\n\n                set: function SingleItemSelectionManager_set() {\n                    this.selected = true;\n                },\n\n                clear: function SingleItemSelectionManager_clear() {\n                    this.selected = false;\n                },\n\n                add: function SingleItemSelectionManager_add() {\n                    this.selected = true;\n                },\n\n                remove: function SingleItemSelectionManager_remove() {\n                    this.selected = false;\n                },\n\n                selectAll: function SingleItemSelectionManager_selectAll() {\n                    // not used\n                },\n\n                fireSelectionChanging: function SingleItemSelectionManager_fireSelectionChanging() {\n                    var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                    eventObject.initCustomEvent(eventNames.selectionchanging, true, true, {});\n                    return this._element.dispatchEvent(eventObject);\n                },\n\n                fireSelectionChanged: function ItemContainer_fireSelectionChanged() {\n                    var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                    eventObject.initCustomEvent(eventNames.selectionchanged, true, false, {});\n                    this._element.dispatchEvent(eventObject);\n                },\n\n                _isIncluded: function SingleItemSelectionManager_isIncluded() {\n                    return this._selected;\n                },\n\n                _getFocused: function SingleItemSelectionManager_getFocused() {\n                    return { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };\n                }\n            });\n        })\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Repeater',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../BindingList',\n    '../BindingTemplate',\n    '../Promise',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    ], function repeaterInit(exports, _Global, _Base, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, BindingList, BindingTemplate, Promise, _Control, _Dispose, _ElementUtilities, _Hoverable) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Repeater\">\n        /// Uses templates to generate HTML from a set of data.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.repeater.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.repeater.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.Repeater\"></div>]]></htmlSnippet>\n        /// <part name=\"repeater\" class=\"win-repeater\" locid=\"WinJS.UI.Repeater_part:repeater\">The Repeater control itself</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Repeater: _Base.Namespace._lazy(function () {\n\n            // Constants\n            var ITEMSLOADED = \"itemsloaded\",\n                ITEMCHANGING = \"itemchanging\",\n                ITEMCHANGED = \"itemchanged\",\n                ITEMINSERTING = \"iteminserting\",\n                ITEMINSERTED = \"iteminserted\",\n                ITEMMOVING = \"itemmoving\",\n                ITEMMOVED = \"itemmoved\",\n                ITEMREMOVING = \"itemremoving\",\n                ITEMREMOVED = \"itemremoved\",\n                ITEMSRELOADING = \"itemsreloading\",\n                ITEMSRELOADED = \"itemsreloaded\";\n\n            var createEvent = _Events._createEventProperty;\n\n            function stringifyItem(dataItem) {\n                // Repeater uses this as its default renderer when no template is provided.\n                var itemElement = _Global.document.createElement(\"div\");\n                itemElement.textContent = JSON.stringify(dataItem);\n                return itemElement;\n            }\n\n            // Statics\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get asynchronousRender() { return \"Top level items must render synchronously\"; },\n                get repeaterReentrancy() { return \"Cannot modify Repeater data until Repeater has commited previous modification.\"; },\n            };\n\n            var Repeater = _Base.Class.define(function Repeater_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Repeater.Repeater\">\n                /// <summary locid=\"WinJS.UI.Repeater.constructor\">\n                /// Creates a new Repeater control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.Repeater.constructor_p:element\">\n                /// The DOM element that will host the new control. The Repeater will create an element if this value is null.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.Repeater.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the\n                /// new Repeater. Each property of the options object corresponds to one of the\n                /// object's properties or events. Event names must begin with \"on\".\n                /// </param>\n                /// <returns type=\"WinJS.UI.Repeater\" locid=\"WinJS.UI.Repeater.constructor_returnValue\">\n                /// The new Repeater control.\n                /// </returns>\n                /// </signature>\n\n                // Check to make sure we weren't duplicated\n                if (element && element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.Repeater.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                this._element = element || _Global.document.createElement(\"div\");\n                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n                options = options || {};\n                _ElementUtilities.addClass(this._element, \"win-repeater win-disposable\");\n\n                this._render = null;\n                this._modifying = false;\n                this._disposed = false;\n                this._element.winControl = this;\n                this._dataListeners = {\n                    itemchanged: this._dataItemChangedHandler.bind(this),\n                    iteminserted: this._dataItemInsertedHandler.bind(this),\n                    itemmoved: this._dataItemMovedHandler.bind(this),\n                    itemremoved: this._dataItemRemovedHandler.bind(this),\n                    reload: this._dataReloadHandler.bind(this),\n                };\n\n                // Consume Repeater innerHTML and return a template.\n                var inlineTemplate = this._extractInlineTemplate();\n                this._initializing = true;\n                // Use the inlinetemplate if a parameter was not given.\n                // Either way, Repeater's innerHTML has now been consumed.\n                this.template = options.template || inlineTemplate;\n\n                this.data = options.data;\n                this._initializing = false;\n\n                _Control._setOptions(this, options, true); // Events only\n\n                this._repeatedDOM = [];\n                this._renderAllItems();\n                this.dispatchEvent(ITEMSLOADED, {});\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.Repeater.element\" helpKeyword=\"WinJS.UI.Repeater.element\">\n                /// Gets the DOM element that hosts the Repeater.\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.UI.Repeater.data\" helpKeyword=\"WinJS.UI.Repeater.data\">\n                /// Gets or sets the WinJS.Binding.List that provides the Repeater control with items to display.\n                /// </field>\n                data: {\n                    get: function () { return this._data; },\n                    set: function (data) {\n                        this._writeProfilerMark(\"data.set,StartTM\");\n                        if (this._data) {\n                            this._removeDataListeners();\n                        }\n                        this._data = data || new BindingList.List();\n                        this._addDataListeners();\n                        if (!this._initializing) {\n                            this._reloadRepeater(true);\n                            this.dispatchEvent(ITEMSLOADED, {});\n                        }\n                        this._writeProfilerMark(\"data.set,StopTM\");\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.Repeater.template\" helpKeyword=\"WinJS.UI.Repeater.template\" potentialValueSelector=\"[data-win-control='WinJS.Binding.Template']\">\n                /// Gets or sets a Template or custom rendering function that defines the HTML of each item within the Repeater.\n                /// </field>\n                template: {\n                    get: function () { return this._template; },\n                    set: function (template) {\n                        this._writeProfilerMark(\"template.set,StartTM\");\n                        this._template = (template || stringifyItem);\n                        this._render = _ElementUtilities._syncRenderer(this._template, this.element.tagName);\n                        if (!this._initializing) {\n                            this._reloadRepeater(true);\n                            this.dispatchEvent(ITEMSLOADED, {});\n                        }\n                        this._writeProfilerMark(\"template.set,StopTM\");\n                    }\n                },\n\n                /// <field type=\"Number\" hidden=\"true\" locid=\"WinJS.UI.Repeater.length\" helpKeyword=\"WinJS.UI.Repeater.length\">\n                /// Gets the number of items in the Repeater control.\n                /// </field>\n                length: {\n                    get: function () { return this._repeatedDOM.length; },\n                },\n\n                elementFromIndex: function Repeater_elementFromIndex(index) {\n                    /// <signature helpKeyword=\"WinJS.UI.Repeater.elementFromIndex\">\n                    /// <summary locid=\"WinJS.UI.Repeater.elementFromIndex\">\n                    /// Returns the HTML element for the item with the specified index.\n                    /// </summary>\n                    /// <param name=\"index\" type=\"Number\" locid=\"WinJS.UI.Repeater.elementFromIndex _p:index\">\n                    /// The index of the item.\n                    /// </param>\n                    /// <returns type=\"HTMLElement\" domElement=\"true\" locid=\" WinJS.UI.Repeater.elementFromIndex_returnValue\">\n                    /// The DOM element for the specified item.\n                    /// </returns>\n                    /// </signature>\n                    return this._repeatedDOM[index];\n                },\n\n                dispose: function Repeater_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.Repeater.dispose\">\n                    /// <summary locid=\"WinJS.UI.Repeater.dispose\">\n                    /// Prepare this Repeater for garbage collection.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true; // Mark this control as disposed.\n                    this._removeDataListeners();\n                    this._data = null;\n                    this._template = null;\n                    for (var i = 0, len = this._repeatedDOM.length; i < len; i++) {\n                        _Dispose._disposeElement(this._repeatedDOM[i]);\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemsloaded\" helpKeyword=\"WinJS.UI.Repeater.onitemsloaded\">\n                /// Raised when the Repeater has finished loading a new set of data. This event is only fired on construction\n                /// or when the Repeater control's data source or template is replaced.\n                /// </field>\n                onitemsloaded: createEvent(ITEMSLOADED),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemchanging\" helpKeyword=\"WinJS.UI.Repeater.onitemchanging\">\n                /// Raised after an item in the Repeater control's data source changes but before the corresponding DOM element has been updated.\n                /// </field>\n                onitemchanging: createEvent(ITEMCHANGING),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemchanged\" helpKeyword=\"WinJS.UI.Repeater.onitemchanged\">\n                /// Raised after an item in the Repeater control's data source changes and after the corresponding DOM element has been updated.\n                /// </field>\n                onitemchanged: createEvent(ITEMCHANGED),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.oniteminserting\" helpKeyword=\"WinJS.UI.Repeater.oniteminserting\">\n                /// Raised after an item has been added to the Repeater control's data source but before the corresponding DOM element has been added.\n                /// </field>\n                oniteminserting: createEvent(ITEMINSERTING),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.oniteminserted\" helpKeyword=\"WinJS.UI.Repeater.oniteminserted\">\n                /// Raised after an item has been added to the Repeater control's data source and after the corresponding DOM element has been added.\n                /// </field>\n                oniteminserted: createEvent(ITEMINSERTED),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemmoving\" helpKeyword=\"WinJS.UI.Repeater.onitemmoving\">\n                /// Raised after an item has been moved from one index to another in the Repeater control's data source but before the corresponding DOM element has been moved.\n                /// </field>\n                onitemmoving: createEvent(ITEMMOVING),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemmoved\" helpKeyword=\"WinJS.UI.Repeater.onitemmoved\">\n                /// Raised after an item has been moved from one index to another in the Repeater control's data source and after the corresponding DOM element has been moved.\n                /// </field>\n                onitemmoved: createEvent(ITEMMOVED),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemremoving\" helpKeyword=\"WinJS.UI.Repeater.onitemremoving\">\n                /// Raised after an item has been removed from the Repeater control's data source but before the corresponding DOM element has been removed.\n                /// </field>\n                onitemremoving: createEvent(ITEMREMOVING),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemremoved\" helpKeyword=\"WinJS.UI.Repeater.onitemremoved\">\n                /// Raised after an item has been removed from one index to another in the Repeater control's data source and after the corresponding DOM element has been removed.\n                /// </field>\n                onitemremoved: createEvent(ITEMREMOVED),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemsreloading\" helpKeyword=\"WinJS.UI.Repeater.onitemsreloading\">\n                /// The list has been refreshed and any references to data in the list may be incorrect.\n                /// Raised after the Repeater control's underlying data has been updated but before the updated HTML has been reloaded.\n                /// </field>\n                onitemsreloading: createEvent(ITEMSRELOADING),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Repeater.onitemsreloaded\" helpKeyword=\"WinJS.UI.Repeater.onitemsreloaded\">\n                /// Raised after the Repeater control's underlying data has been updated and after the updated HTML has been reloaded.\n                /// </field>\n                onitemsreloaded: createEvent(ITEMSRELOADED),\n\n                _extractInlineTemplate: function Repeater_extractInlineTemplate() {\n                    // Creates and returns a WinJS.BindingTemplate from the Repeater innerHTML.\n                    if (this._element.firstElementChild) {\n                        var templateElement = _Global.document.createElement(this._element.tagName);\n                        while (this._element.firstElementChild) {\n                            // Move each child element from the Repeater to the Template Element\n                            templateElement.appendChild(this._element.firstElementChild);\n                        }\n                        return new BindingTemplate.Template(templateElement, { extractChild: true });\n                    }\n                },\n\n                _renderAllItems: function Repeater_renderAllItems() {\n                    var fragment = _Global.document.createDocumentFragment();\n                    for (var i = 0, len = this._data.length; i < len; i++) {\n                        var renderedItem = this._render(this._data.getAt(i));\n                        if (!renderedItem) {\n                            throw new _ErrorFromName(\"WinJS.UI.Repeater.AsynchronousRender\", strings.asynchronousRender);\n\n                        }\n                        fragment.appendChild(renderedItem);\n                        this._repeatedDOM.push(renderedItem);\n                    }\n                    this._element.appendChild(fragment);\n                },\n\n                _reloadRepeater: function Repeater_reloadRepeater(shouldDisposeElements) {\n                    this._unloadRepeatedDOM(shouldDisposeElements);\n                    this._repeatedDOM = [];\n                    this._renderAllItems();\n                },\n\n                _unloadRepeatedDOM: function Repeater_unloadRepeatedDOM(shouldDisposeElements) {\n                    for (var i = 0, len = this._repeatedDOM.length; i < len; i++) {\n                        var element = this._repeatedDOM[i];\n                        if (!!shouldDisposeElements) {\n                            // this_dataReloadHandler uses this to defer disposal until after animations have completed,\n                            // at which point it manually disposes each element.\n                            _Dispose._disposeElement(element);\n                        }\n                        if (element.parentElement === this._element) {\n                            this._element.removeChild(element);\n                        }\n                    }\n                },\n\n                _addDataListeners: function Repeater_addDataListeners() {\n                    Object.keys(this._dataListeners).forEach(function (eventName) {\n                        this._data.addEventListener(eventName, this._dataListeners[eventName], false);\n                    }.bind(this));\n                },\n\n                _beginModification: function Repeater_beginModification() {\n                    if (this._modifying) {\n                        throw new _ErrorFromName(\"WinJS.UI.Repeater.RepeaterModificationReentrancy\", strings.repeaterReentrancy);\n                    }\n                    this._modifying = true;\n                },\n\n                _endModification: function Repeater_endModification() {\n                    this._modifying = false;\n                },\n\n                _removeDataListeners: function Repeater_removeDataListeners() {\n                    Object.keys(this._dataListeners).forEach(function (eventName) {\n                        this._data.removeEventListener(eventName, this._dataListeners[eventName], false);\n                    }.bind(this));\n                },\n\n                _dataItemChangedHandler: function Repeater_dataItemChangedHandler(eventInfo) {\n                    // Handles the 'itemchanged' event fired by WinJS.Binding.List\n\n                    this._beginModification();\n                    var animationPromise;\n\n                    var root = this._element;\n                    var index = eventInfo.detail.index;\n                    var renderedItem = this._render(eventInfo.detail.newValue);\n                    if (!renderedItem) {\n                        throw new _ErrorFromName(\"WinJS.UI.Repeater.AsynchronousRender\", strings.asynchronousRender);\n                    }\n\n                    // Append to the event object\n                    if (this._repeatedDOM[index]) {\n                        eventInfo.detail.oldElement = this._repeatedDOM[index];\n                    }\n                    eventInfo.detail.newElement = renderedItem;\n                    eventInfo.detail.setPromise = function setPromise(delayPromise) {\n                        animationPromise = delayPromise;\n                    };\n\n                    this._writeProfilerMark(ITEMCHANGING + \",info\");\n                    this.dispatchEvent(ITEMCHANGING, eventInfo.detail);\n\n                    // Make the change\n                    var oldItem = null;\n                    if (index < this._repeatedDOM.length) {\n                        oldItem = this._repeatedDOM[index];\n                        root.replaceChild(renderedItem, oldItem);\n                        this._repeatedDOM[index] = renderedItem;\n                    } else {\n                        root.appendChild(renderedItem);\n                        this._repeatedDOM.push(renderedItem);\n                    }\n\n                    this._endModification();\n                    this._writeProfilerMark(ITEMCHANGED + \",info\");\n                    this.dispatchEvent(ITEMCHANGED, eventInfo.detail);\n\n                    if (oldItem) { // Give the option to delay element disposal.\n                        Promise.as(animationPromise).done(function () {\n                            _Dispose._disposeElement(oldItem);\n                        }.bind(this));\n                    }\n                },\n\n                _dataItemInsertedHandler: function Repeater_dataItemInsertedHandler(eventInfo) {\n                    // Handles the 'iteminserted' event fired by WinJS.Binding.List\n\n                    this._beginModification();\n                    var index = eventInfo.detail.index;\n                    var renderedItem = this._render(eventInfo.detail.value);\n                    if (!renderedItem) {\n                        throw new _ErrorFromName(\"WinJS.UI.Repeater.AsynchronousRender\", strings.asynchronousRender);\n                    }\n\n                    var root = this._element;\n\n                    eventInfo.detail.affectedElement = renderedItem;\n                    this._writeProfilerMark(ITEMINSERTING + \",info\");\n                    this.dispatchEvent(ITEMINSERTING, eventInfo.detail);\n\n                    if (index < this._repeatedDOM.length) {\n                        var nextSibling = this._repeatedDOM[index];\n                        root.insertBefore(renderedItem, nextSibling);\n                    } else {\n                        root.appendChild(renderedItem);\n                    }\n\n                    // Update collection of rendered elements\n                    this._repeatedDOM.splice(index, 0, renderedItem);\n\n                    this._endModification();\n                    this._writeProfilerMark(ITEMINSERTED + \",info\");\n                    this.dispatchEvent(ITEMINSERTED, eventInfo.detail);\n\n                },\n\n                _dataItemMovedHandler: function Repeater_dataItemMovedHandler(eventInfo) {\n                    // Handles the 'itemmoved' event fired by WinJS.Binding.List\n\n                    this._beginModification();\n\n                    var movingItem = this._repeatedDOM[eventInfo.detail.oldIndex];\n\n                    // Fire the event before we start the move.\n                    eventInfo.detail.affectedElement = movingItem;\n                    this._writeProfilerMark(ITEMMOVING + \",info\");\n                    this.dispatchEvent(ITEMMOVING, eventInfo.detail);\n\n                    // Remove\n                    this._repeatedDOM.splice(eventInfo.detail.oldIndex, 1)[0];\n                    movingItem.parentNode.removeChild(movingItem);\n\n                    // Insert\n                    if (eventInfo.detail.newIndex < (this._data.length) - 1) {\n                        var nextSibling = this._repeatedDOM[eventInfo.detail.newIndex];\n                        this._element.insertBefore(movingItem, nextSibling);\n                        this._repeatedDOM.splice(eventInfo.detail.newIndex, 0, movingItem);\n                    } else {\n                        this._repeatedDOM.push(movingItem);\n                        this._element.appendChild(movingItem);\n                    }\n\n                    this._endModification();\n                    this._writeProfilerMark(ITEMMOVED + \",info\");\n                    this.dispatchEvent(ITEMMOVED, eventInfo.detail);\n                },\n\n                _dataItemRemovedHandler: function Repeater_dataItemRemoveHandler(eventInfo) {\n                    // Handles the 'itemremoved' event fired by WinJS.Binding.List\n\n                    this._beginModification();\n                    var animationPromise;\n                    var oldItem = this._repeatedDOM[eventInfo.detail.index];\n\n                    // Trim 'value' and 'key' from the eventInfo.details that Binding.List gave for the removal case,\n                    // since both of those properties already exist inside of eventInfo.details.item.\n                    var eventDetail = { affectedElement: oldItem, index: eventInfo.detail.index, item: eventInfo.detail.item };\n                    eventDetail.setPromise = function setPromise(delayPromise) {\n                        animationPromise = delayPromise;\n                    };\n\n                    this._writeProfilerMark(ITEMREMOVING + \",info\");\n                    this.dispatchEvent(ITEMREMOVING, eventDetail);\n\n                    oldItem.parentNode.removeChild(oldItem);\n                    this._repeatedDOM.splice(eventInfo.detail.index, 1);\n\n                    this._endModification();\n                    this._writeProfilerMark(ITEMREMOVED + \",info\");\n                    this.dispatchEvent(ITEMREMOVED, eventDetail);\n\n                    Promise.as(animationPromise).done(function () {\n                        _Dispose._disposeElement(oldItem);\n                    }.bind(this));\n                },\n\n                _dataReloadHandler: function Repeater_dataReloadHandler() {\n                    // Handles the 'reload' event fired by WinJS.Binding.List whenever it performs operations such as reverse() or sort()\n\n                    this._beginModification();\n                    var animationPromise;\n\n                    var shallowCopyBefore = this._repeatedDOM.slice(0);\n                    var eventDetail = { affectedElements: shallowCopyBefore };\n                    eventDetail.setPromise = function (delayPromise) {\n                        animationPromise = delayPromise;\n                    };\n\n                    this._writeProfilerMark(ITEMSRELOADING + \",info\");\n                    this.dispatchEvent(ITEMSRELOADING, eventDetail);\n                    this._reloadRepeater(false /*shouldDisposeElements */);\n\n                    var shallowCopyAfter = this._repeatedDOM.slice(0);\n                    this._endModification();\n                    this._writeProfilerMark(ITEMSRELOADED + \",info\");\n                    this.dispatchEvent(ITEMSRELOADED, { affectedElements: shallowCopyAfter });\n\n                    Promise.as(animationPromise).done(function () { // Gives the option to defer disposal.\n                        for (var i = 0, len = shallowCopyBefore.length; i < len; i++) {\n                            _Dispose._disposeElement(shallowCopyBefore[i]);\n                        }\n                    }.bind(this));\n                },\n\n                _writeProfilerMark: function Repeater_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI.Repeater:\" + this._id + \":\" + text);\n                }\n            }, {\n                isDeclarativeControlContainer: true,\n            });\n            _Base.Class.mix(Repeater, _Control.DOMEventMixin);\n            return Repeater;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-datetimepicker',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/DatePicker',[\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_Select',\n    'require-style!less/styles-datetimepicker'\n    ], function datePickerInit(_Global, _WinRT, _Base, _BaseUtils, _Events, _Resources, _Control, _ElementUtilities, _Hoverable, _Select) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.DatePicker\">Allows users to pick a date value.</summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <name locid=\"WinJS.UI.DatePicker_name\">Date Picker</name>\n        /// <icon src=\"ui_winjs.ui.datepicker.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.datepicker.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.DatePicker\"></div>]]></htmlSnippet>\n        /// <event name=\"change\" locid=\"WinJS.UI.DatePicker_e:change\">Occurs when the current date changes.</event>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        DatePicker: _Base.Namespace._lazy(function () {\n            // Constants definition\n            var DEFAULT_DAY_PATTERN = 'day',\n                DEFAULT_MONTH_PATTERN = '{month.full}',\n                DEFAULT_YEAR_PATTERN = 'year.full';\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/datePicker\").value; },\n                get selectDay() { return _Resources._getWinJSString(\"ui/selectDay\").value; },\n                get selectMonth() { return _Resources._getWinJSString(\"ui/selectMonth\").value; },\n                get selectYear() { return _Resources._getWinJSString(\"ui/selectYear\").value; },\n            };\n\n            var yearFormatCache = {};\n\n            function newFormatter(pattern, calendar, defaultPattern) {\n                var dtf = _WinRT.Windows.Globalization.DateTimeFormatting;\n                pattern = !pattern ? defaultPattern : pattern;\n                var c = new dtf.DateTimeFormatter(pattern);\n                if (calendar) {\n                    return new dtf.DateTimeFormatter(pattern, c.languages, c.geographicRegion, calendar, c.clock);\n                }\n                return c;\n            }\n\n            function formatCacheLookup(pattern, calendar, defaultPattern) {\n                var pat = yearFormatCache[pattern];\n                if (!pat) {\n                    pat = yearFormatCache[pattern] = {};\n                }\n                var cal = pat[calendar];\n                if (!cal) {\n                    cal = pat[calendar] = {};\n                }\n                var def = cal[defaultPattern];\n                if (!def) {\n                    def = cal[defaultPattern] = {};\n                    def.formatter = newFormatter(pattern, calendar, defaultPattern);\n                    def.years = {};\n                }\n                return def;\n            }\n\n            function formatYear(pattern, calendar, defaultPattern, datePatterns, order, cal) {\n                var cache = formatCacheLookup(pattern, calendar, defaultPattern);\n                var y = cache.years[cal.year + \"-\" + cal.era];\n                if (!y) {\n                    y = cache.formatter.format(cal.getDateTime());\n                    cache.years[cal.year + \"-\" + cal.era] = y;\n                }\n                return y;\n            }\n\n            function formatMonth(pattern, calendar, defaultPattern, cal) {\n                var cache = formatCacheLookup(pattern, calendar, defaultPattern);\n                // can't cache actual month names because the hebrew calendar varies\n                // the month name depending on religious holidays and leap months.\n                //\n                return cache.formatter.format(cal.getDateTime());\n            }\n\n            function formatDay(pattern, calendar, defaultPattern, cal) {\n                var cache = formatCacheLookup(pattern, calendar, defaultPattern);\n                // can't cache actual day names because the format may include the day of the week,\n                // which, of course, varies from month to month.\n                //\n                return cache.formatter.format(cal.getDateTime());\n            }\n\n            function newCal(calendar) {\n                var glob = _WinRT.Windows.Globalization;\n                var c = new glob.Calendar();\n                if (calendar) {\n                    return new glob.Calendar(c.languages, calendar, c.getClock());\n                }\n                return c;\n            }\n\n            function yearDiff(start, end) {\n                var yearCount = 0;\n\n                if (start.era === end.era) {\n                    yearCount = end.year - start.year;\n                } else {\n                    while (start.era !== end.era || start.year !== end.year) {\n                        yearCount++;\n                        start.addYears(1);\n                    }\n                }\n                return yearCount;\n            }\n\n            var DatePicker = _Base.Class.define(function DatePicker_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.DatePicker.DatePicker\">\n                /// <summary locid=\"WinJS.UI.DatePicker.constructor\">Creates a new DatePicker control.</summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.DatePicker.constructor_p:element\">\n                /// The DOM element that will host the DatePicker control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.DatePicker.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds\n                /// to one of the control's properties or events.\n                /// </param>\n                /// <returns type=\"WinJS.UI.DatePicker\" locid=\"WinJS.UI.DatePicker.constructor_returnValue\">A constructed DatePicker control.</returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n\n                // Default to current date\n                this._currentDate = new Date();\n\n                // Default to +/- 100 years\n                this._minYear = this._currentDate.getFullYear() - 100;\n                this._maxYear = this._currentDate.getFullYear() + 100;\n                this._datePatterns = {\n                    date: null,\n                    month: null,\n                    year: null\n                };\n\n                element = element || _Global.document.createElement(\"div\");\n                _ElementUtilities.addClass(element, \"win-disposable\");\n                element.winControl = this;\n\n                var label = element.getAttribute(\"aria-label\");\n                if (!label) {\n                    element.setAttribute(\"aria-label\", strings.ariaLabel);\n                }\n\n                // Options should be set after the element is initialized which is\n                // the same order of operation as imperatively setting options.\n                this._init(element);\n                _Control.setOptions(this, options);\n            }, {\n                _information: null,\n                _currentDate: null,\n                _calendar: null,\n                _disabled: false,\n                _dateElement: null,\n                _dateControl: null,\n                _monthElement: null,\n                _monthControl: null,\n                _minYear: null,\n                _maxYear: null,\n                _yearElement: null,\n                _yearControl: null,\n                _datePatterns: {\n                    date: null,\n                    month: null,\n                    year: null\n                },\n\n                _addAccessibilityAttributes: function () {\n                    //see http://www.w3.org/TR/wai-aria/rdf_model.png for details\n                    this._domElement.setAttribute(\"role\", \"group\");\n\n                    this._dateElement.setAttribute(\"aria-label\", strings.selectDay);\n                    this._monthElement.setAttribute(\"aria-label\", strings.selectMonth);\n                    this._yearElement.setAttribute(\"aria-label\", strings.selectYear);\n                },\n\n                _addControlsInOrder: function () {\n                    var e = this._domElement;\n                    var that = this;\n                    var orderIndex = 0; // don't use forEach's index, because \"era\" is in the list\n                    that._information.order.forEach(function (s) {\n                        switch (s) {\n                            case \"month\":\n                                e.appendChild(that._monthElement);\n                                _ElementUtilities.addClass(that._monthElement, \"win-order\" + (orderIndex++));\n                                break;\n                            case \"date\":\n                                e.appendChild(that._dateElement);\n                                _ElementUtilities.addClass(that._dateElement, \"win-order\" + (orderIndex++));\n                                break;\n                            case \"year\":\n                                e.appendChild(that._yearElement);\n                                _ElementUtilities.addClass(that._yearElement, \"win-order\" + (orderIndex++));\n                                break;\n                        }\n                    });\n                },\n\n                _createControlElements: function () {\n                    this._monthElement = _Global.document.createElement(\"select\");\n                    this._monthElement.className = \"win-datepicker-month win-dropdown\";\n                    this._dateElement = _Global.document.createElement(\"select\");\n                    this._dateElement.className = \"win-datepicker-date win-dropdown\";\n                    this._yearElement = _Global.document.createElement(\"select\");\n                    this._yearElement.className = \"win-datepicker-year win-dropdown\";\n                },\n\n                _createControls: function () {\n                    var info = this._information;\n                    var index = info.getIndex(this.current);\n\n                    if (info.forceLanguage) {\n                        this._domElement.setAttribute(\"lang\", info.forceLanguage);\n                        this._domElement.setAttribute(\"dir\", info.isRTL ? \"rtl\" : \"ltr\");\n                    }\n\n\n                    this._yearControl = new _Select._Select(this._yearElement, {\n                        dataSource: this._information.years,\n                        disabled: this.disabled,\n                        index: index.year\n                    });\n\n                    this._monthControl = new _Select._Select(this._monthElement, {\n                        dataSource: this._information.months(index.year),\n                        disabled: this.disabled,\n                        index: index.month\n                    });\n\n                    this._dateControl = new _Select._Select(this._dateElement, {\n                        dataSource: this._information.dates(index.year, index.month),\n                        disabled: this.disabled,\n                        index: index.date\n                    });\n\n                    this._wireupEvents();\n                },\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.DatePicker.dispose\">\n                    /// <summary locid=\"WinJS.UI.DatePicker.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.DatePicker.calendar\" helpKeyword=\"WinJS.UI.DatePicker.calendar\">\n                /// Gets or sets the calendar to use.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                calendar: {\n                    get: function () {\n                        return this._calendar;\n                    },\n                    set: function (value) {\n                        this._calendar = value;\n                        this._setElement(this._domElement);\n                    }\n                },\n\n                /// <field type=\"Date\" locid=\"WinJS.UI.DatePicker.current\" helpKeyword=\"WinJS.UI.DatePicker.current\">\n                /// Gets or sets the current date of the DatePicker.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                current: {\n                    get: function () {\n                        var d = this._currentDate;\n                        var y = d.getFullYear();\n                        return new Date(Math.max(Math.min(this.maxYear, y), this.minYear), d.getMonth(), d.getDate(), 12, 0, 0, 0);\n                    },\n                    set: function (value) {\n                        var newDate;\n                        if (typeof (value) === \"string\") {\n                            newDate = new Date(Date.parse(value));\n                            newDate.setHours(12, 0, 0, 0);\n                        } else {\n                            newDate = value;\n                        }\n\n                        var oldDate = this._currentDate;\n                        if (oldDate !== newDate) {\n                            this._currentDate = newDate;\n                            this._updateDisplay();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.DatePicker.disabled\" helpKeyword=\"WinJS.UI.DatePicker.disabled\">\n                /// Gets or sets a value that specifies whether the DatePicker is disabled. A value of true indicates that the DatePicker is disabled.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                disabled: {\n                    get: function () { return this._disabled; },\n                    set: function (value) {\n                        if (this._disabled !== value) {\n                            this._disabled = value;\n                            // all controls get populated at the same time, so any check is OK\n                            //\n                            if (this._yearControl) {\n                                this._monthControl.setDisabled(value);\n                                this._dateControl.setDisabled(value);\n                                this._yearControl.setDisabled(value);\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.DatePicker.datePattern\" helpKeyword=\"WinJS.UI.DatePicker.datePattern\">\n                /// Gets or sets the display pattern for the date.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                datePattern: {\n                    get: function () { return this._datePatterns.date; },\n                    set: function (value) {\n                        if (this._datePatterns.date !== value) {\n                            this._datePatterns.date = value;\n                            this._init();\n                        }\n                    }\n                },\n\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.DatePicker.element\" helpKeyword=\"WinJS.UI.DatePicker.element\">\n                /// Gets the DOM element for the DatePicker.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                element: {\n                    get: function () { return this._domElement; }\n                },\n\n                _setElement: function (element) {\n                    this._domElement = this._domElement || element;\n                    if (!this._domElement) { return; }\n\n                    _ElementUtilities.empty(this._domElement);\n                    _ElementUtilities.addClass(this._domElement, \"win-datepicker\");\n\n                    this._updateInformation();\n\n                    this._createControlElements();\n                    this._addControlsInOrder();\n                    this._createControls();\n                    this._addAccessibilityAttributes();\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.DatePicker.minYear\" helpKeyword=\"WinJS.UI.DatePicker.minYear\">\n                /// Gets or sets the minimum Gregorian year available for picking.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                minYear: {\n                    get: function () {\n                        return this._information.getDate({ year: 0, month: 0, date: 0 }).getFullYear();\n                    },\n                    set: function (value) {\n                        if (this._minYear !== value) {\n                            this._minYear = value;\n                            if (value > this._maxYear) {\n                                this._maxYear = value;\n                            }\n                            this._updateInformation();\n                            if (this._yearControl) {\n                                this._yearControl.dataSource = this._information.years;\n                            }\n\n                            this._updateDisplay();\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.DatePicker.maxYear\" helpKeyword=\"WinJS.UI.DatePicker.maxYear\">\n                /// Gets or sets the maximum Gregorian year available for picking.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                maxYear: {\n                    get: function () {\n                        var index = {\n                            year: this._information.years.getLength() - 1\n                        };\n                        index.month = this._information.months(index.year).getLength() - 1;\n                        index.date = this._information.dates(index.year, index.month).getLength() - 1;\n                        return this._information.getDate(index).getFullYear();\n                    },\n                    set: function (value) {\n                        if (this._maxYear !== value) {\n                            this._maxYear = value;\n                            if (value < this._minYear) {\n                                this._minYear = value;\n                            }\n                            this._updateInformation();\n                            if (this._yearControl) {\n                                this._yearControl.dataSource = this._information.years;\n                            }\n\n                            this._updateDisplay();\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.DatePicker.monthPattern\" helpKeyword=\"WinJS.UI.DatePicker.monthPattern\">\n                /// Gets or sets the display pattern for the month.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                monthPattern: {\n                    get: function () { return this._datePatterns.month; },\n                    set: function (value) {\n                        if (this._datePatterns.month !== value) {\n                            this._datePatterns.month = value;\n                            this._init();\n                        }\n                    }\n                },\n\n                _updateInformation: function () {\n                    // since \"year\" in the date ctor can be two digit (85 == 1985), we need\n                    // to force \"full year\" to capture dates < 100 a.d.\n                    //\n                    var min = new Date(this._minYear, 0, 1, 12, 0, 0);\n                    var max = new Date(this._maxYear, 11, 31, 12, 0, 0);\n                    min.setFullYear(this._minYear);\n                    max.setFullYear(this._maxYear);\n\n                    this._information = DatePicker.getInformation(min, max, this._calendar, this._datePatterns);\n                },\n\n                _init: function (element) {\n                    this._setElement(element);\n                },\n\n                _updateDisplay: function () {\n                    if (!this._domElement) {\n                        return;\n                    }\n\n                    // all controls get populated at the same time, so any check is OK\n                    //\n                    if (this._yearControl) {\n                        //Render display index based on constraints (minYear and maxYear constraints)\n                        //Will not modify current date\n                        var index = this._information.getIndex(this.current);\n\n                        this._yearControl.index = index.year;\n                        this._monthControl.dataSource = this._information.months(index.year);\n                        this._monthControl.index = index.month;\n                        this._dateControl.dataSource = this._information.dates(index.year, index.month);\n                        this._dateControl.index = index.date;\n                    }\n                },\n\n                _wireupEvents: function () {\n                    var that = this;\n                    function changed() {\n                        that._currentDate = that._information.getDate({ year: that._yearControl.index, month: that._monthControl.index, date: that._dateControl.index }, that._currentDate);\n                        var index = that._information.getIndex(that._currentDate);\n\n                        // Changing the month (or year, if the current date is 2/29) changes the day range, and could have made the day selection invalid\n                        that._monthControl.dataSource = that._information.months(index.year);\n                        that._monthControl.index = index.month;\n                        that._dateControl.dataSource = that._information.dates(index.year, index.month);\n                        that._dateControl.index = index.date;\n                    }\n\n                    this._dateElement.addEventListener(\"change\", changed, false);\n                    this._monthElement.addEventListener(\"change\", changed, false);\n                    this._yearElement.addEventListener(\"change\", changed, false);\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.DatePicker.yearPattern\" helpKeyword=\"WinJS.UI.DatePicker.yearPattern\">\n                /// Gets or sets the display pattern for year.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                yearPattern: {\n                    get: function () { return this._datePatterns.year; },\n                    set: function (value) {\n                        if (this._datePatterns.year !== value) {\n                            this._datePatterns.year = value;\n                            this._init();\n                        }\n                    }\n                },\n            }, {\n                _getInformationWinRT: function (startDate, endDate, calendar, datePatterns) {\n                    datePatterns = datePatterns || { date: DEFAULT_DAY_PATTERN, month: DEFAULT_MONTH_PATTERN, year: DEFAULT_YEAR_PATTERN };\n\n                    var tempCal = newCal(calendar);\n                    var monthCal = newCal(calendar);\n                    var dayCal = newCal(calendar);\n\n                    tempCal.setToMin();\n                    var minDateTime = tempCal.getDateTime();\n                    tempCal.setToMax();\n                    var maxDateTime = tempCal.getDateTime();\n\n                    function clamp(date) {\n                        return new Date(Math.min(new Date(Math.max(minDateTime, date)), maxDateTime));\n                    }\n\n                    tempCal.hour = 12;\n\n                    startDate = clamp(startDate);\n                    endDate = clamp(endDate);\n\n                    tempCal.setDateTime(endDate);\n                    var end = { year: tempCal.year, era: tempCal.era };\n\n                    tempCal.setDateTime(startDate);\n                    var yearLen = 0;\n\n                    yearLen = yearDiff(tempCal, end) + 1;\n\n                    // Explicity use a template that's equivalent to a longdate template\n                    // as longdate/shortdate can be overriden by the user\n                    var dateformat = formatCacheLookup(\"day month.full year\", calendar).formatter;\n                    var localdatepattern = dateformat.patterns[0];\n                    var isRTL = localdatepattern.charCodeAt(0) === 8207;\n                    var order = [\"date\", \"month\", \"year\"];\n\n                    var indexes = {\n                        month: localdatepattern.indexOf(\"{month\"),\n                        date: localdatepattern.indexOf(\"{day\"),\n                        year: localdatepattern.indexOf(\"{year\")\n                    };\n                    order.sort(function (a, b) {\n                        if (indexes[a] < indexes[b]) {\n                            return -1;\n                        } else if (indexes[a] > indexes[b]) {\n                            return 1;\n                        } else {\n                            return 0;\n                        }\n                    });\n\n                    var yearSource = (function () {\n                        return {\n                            getLength: function () { return yearLen; },\n                            getValue: function (index) {\n                                tempCal.setDateTime(startDate);\n                                tempCal.addYears(index);\n\n                                return formatYear(datePatterns.year, calendar, DEFAULT_YEAR_PATTERN, datePatterns, order, tempCal);\n                            }\n                        };\n                    })();\n\n                    var monthSource = function (yearIndex) {\n                        monthCal.setDateTime(startDate);\n                        monthCal.addYears(yearIndex);\n\n                        return {\n                            getLength: function () { return monthCal.numberOfMonthsInThisYear; },\n                            getValue: function (index) {\n                                monthCal.month = monthCal.firstMonthInThisYear;\n                                monthCal.addMonths(index);\n                                return formatMonth(datePatterns.month, calendar, DEFAULT_MONTH_PATTERN, monthCal);\n                            }\n                        };\n                    };\n\n                    var dateSource = function (yearIndex, monthIndex) {\n                        dayCal.setDateTime(startDate);\n                        dayCal.addYears(yearIndex);\n                        dayCal.month = dayCal.firstMonthInThisYear;\n                        dayCal.addMonths(monthIndex);\n                        dayCal.day = dayCal.firstDayInThisMonth;\n\n                        return {\n                            getLength: function () { return dayCal.numberOfDaysInThisMonth; },\n                            getValue: function (index) {\n                                dayCal.day = dayCal.firstDayInThisMonth;\n                                dayCal.addDays(index);\n                                return formatDay(datePatterns.date, calendar, DEFAULT_DAY_PATTERN, dayCal);\n                            }\n                        };\n                    };\n\n                    return {\n                        isRTL: isRTL,\n                        forceLanguage: dateformat.resolvedLanguage,\n\n                        order: order,\n\n                        getDate: function (index, lastDate) {\n                            var lastCal;\n\n                            if (lastDate) {\n                                tempCal.setDateTime(lastDate);\n                                lastCal = { year: tempCal.year, month: tempCal.month, day: tempCal.day };\n                            }\n\n                            var c = tempCal;\n                            c.setDateTime(startDate);\n                            c.addYears(index.year);\n\n                            var guessMonth;\n                            if (c.firstMonthInThisYear > c.lastMonthInThisYear) {\n                                if (index.month + c.firstMonthInThisYear > c.numberOfMonthsInThisYear) {\n                                    guessMonth = index.month + c.firstMonthInThisYear - c.numberOfMonthsInThisYear;\n                                } else {\n                                    guessMonth = index.month + c.firstMonthInThisYear;\n                                }\n                                if (lastCal && lastCal.year !== c.year) {\n                                    // Year has changed in some transitions in Thai Calendar, this will change the first month, and last month indices of the year.\n                                    guessMonth = Math.max(Math.min(lastCal.month, c.numberOfMonthsInThisYear), 1);\n                                }\n                            } else {\n                                if (lastCal && lastCal.year !== c.year) {\n                                    // Year has changed in some transitions in Thai Calendar, this will change the first month, and last month indices of the year.\n                                    guessMonth = Math.max(Math.min(lastCal.month, c.firstMonthInThisYear + c.numberOfMonthsInThisYear - 1), c.firstMonthInThisYear);\n                                } else {\n                                    guessMonth = Math.max(Math.min(index.month + c.firstMonthInThisYear, c.firstMonthInThisYear + c.numberOfMonthsInThisYear - 1), c.firstMonthInThisYear);\n                                }\n                            }\n                            c.month = guessMonth;\n\n                            var guessDay = Math.max(Math.min(index.date + c.firstDayInThisMonth, c.firstDayInThisMonth + c.numberOfDaysInThisMonth - 1), c.firstDayInThisMonth);\n                            if (lastCal && (lastCal.year !== c.year || lastCal.month !== c.month)) {\n                                guessDay = Math.max(Math.min(lastCal.day, c.firstDayInThisMonth + c.numberOfDaysInThisMonth - 1), c.firstDayInThisMonth);\n                            }\n                            c.day = c.firstDayInThisMonth;\n                            c.addDays(guessDay - c.firstDayInThisMonth);\n                            return c.getDateTime();\n                        },\n                        getIndex: function (date) {\n                            var curDate = clamp(date);\n                            tempCal.setDateTime(curDate);\n                            var cur = { year: tempCal.year, era: tempCal.era };\n\n                            var yearIndex = 0;\n\n                            tempCal.setDateTime(startDate);\n                            tempCal.month = 1;\n                            yearIndex = yearDiff(tempCal, cur);\n\n                            tempCal.setDateTime(curDate);\n                            var monthIndex = tempCal.month - tempCal.firstMonthInThisYear;\n                            if (monthIndex < 0) {\n                                // A special case is in some ThaiCalendar years first month\n                                // of the year is April, last month is March and month flow is wrap-around\n                                // style; April, March .... November, December, January, February, March. So the first index\n                                // will be 4 and last index will be 3. We are handling the case to convert this wraparound behavior\n                                // into selected index.\n                                monthIndex = tempCal.month - tempCal.firstMonthInThisYear + tempCal.numberOfMonthsInThisYear;\n                            }\n                            var dateIndex = tempCal.day - tempCal.firstDayInThisMonth;\n\n                            var index = {\n                                year: yearIndex,\n                                month: monthIndex,\n                                date: dateIndex\n                            };\n\n                            return index;\n                        },\n                        years: yearSource,\n                        months: monthSource,\n                        dates: dateSource\n                    };\n\n                },\n\n                _getInformationJS: function (startDate, endDate) {\n                    var minYear = startDate.getFullYear();\n                    var maxYear = endDate.getFullYear();\n                    var yearSource = {\n                        getLength: function () { return Math.max(0, maxYear - minYear + 1); },\n                        getValue: function (index) { return minYear + index; }\n                    };\n\n                    var months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n                    var monthSource = function () {\n                        return {\n                            getLength: function () { return months.length; },\n                            getValue: function (index) { return months[index]; },\n                            getMonthNumber: function (index) { return Math.min(index, months.length - 1); }\n                        };\n                    };\n\n                    var dateSource = function (yearIndex, monthIndex) {\n                        var temp = new Date();\n                        var year = yearSource.getValue(yearIndex);\n                        // The +1 is needed to make using a day of 0 work correctly\n                        var month = monthIndex + 1; // index is always correct, unlike getMonth which changes when the date is invalid\n                        temp.setFullYear(year, month, 0);\n\n                        var maxValue = temp.getDate();\n\n                        return {\n                            getLength: function () { return maxValue; },\n                            getValue: function (index) { return \"\" + (index + 1); },\n                            getDateNumber: function (index) { return Math.min(index + 1, maxValue); }\n                        };\n                    };\n\n                    return {\n                        order: [\"month\", \"date\", \"year\"],\n\n                        getDate: function (index) {\n                            return new Date(\n                                yearSource.getValue(index.year),\n                                monthSource(index.year).getMonthNumber(index.month),\n                                dateSource(index.year, index.month).getDateNumber(index.date),\n                                12, 0\n                            );\n                        },\n                        getIndex: function (date) {\n                            var yearIndex = 0;\n                            var year = date.getFullYear();\n                            if (year < minYear) {\n                                yearIndex = 0;\n                            } else if (year > this.maxYear) {\n                                yearIndex = yearSource.getLength() - 1;\n                            } else {\n                                yearIndex = date.getFullYear() - minYear;\n                            }\n\n                            var monthIndex = Math.min(date.getMonth(), monthSource(yearIndex).getLength());\n\n                            var dateIndex = Math.min(date.getDate() - 1, dateSource(yearIndex, monthIndex).getLength());\n\n                            return {\n                                year: yearIndex,\n                                month: monthIndex,\n                                date: dateIndex\n                            };\n                        },\n                        years: yearSource,\n                        months: monthSource,\n                        dates: dateSource\n                    };\n                }\n            });\n            if (_WinRT.Windows.Globalization.Calendar && _WinRT.Windows.Globalization.DateTimeFormatting) {\n                DatePicker.getInformation = DatePicker._getInformationWinRT;\n            } else {\n                DatePicker.getInformation = DatePicker._getInformationJS;\n            }\n            _Base.Class.mix(DatePicker, _Events.createEventProperties(\"change\"));\n            _Base.Class.mix(DatePicker, _Control.DOMEventMixin);\n            return DatePicker;\n        })\n    });\n\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n\ndefine('WinJS/Controls/TimePicker',[\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_Select',\n    'require-style!less/styles-datetimepicker'\n    ], function timePickerInit(_Global, _WinRT, _Base, _BaseUtils, _Events, _Resources, _Control, _ElementUtilities, _Hoverable, _Select) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.TimePicker\">Allows users to select time values.</summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <name locid=\"WinJS.UI.TimePicker_name\">Time Picker</name>\n        /// <icon src=\"ui_winjs.ui.timepicker.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.timepicker.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.TimePicker\"></div>]]></htmlSnippet>\n        /// <event name=\"change\" locid=\"WinJS.UI.TimePicker_e:change\">Occurs when the time changes.</event>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        TimePicker: _Base.Namespace._lazy(function () {\n            // Constants definition\n            var DEFAULT_MINUTE_PATTERN = \"{minute.integer(2)}\",\n                DEFAULT_HOUR_PATTERN = \"{hour.integer(1)}\",\n                DEFAULT_PERIOD_PATTERN = \"{period.abbreviated(2)}\";\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/timePicker\").value; },\n                get selectHour() { return _Resources._getWinJSString(\"ui/selectHour\").value; },\n                get selectMinute() { return _Resources._getWinJSString(\"ui/selectMinute\").value; },\n                get selectAMPM() { return _Resources._getWinJSString(\"ui/selectAMPM\").value; },\n            };\n\n            // date1 and date2 must be Date objects with their date portions set to the\n            // sentinel date.\n            var areTimesEqual = function (date1, date2) {\n                return date1.getHours() === date2.getHours() &&\n                    date1.getMinutes() === date2.getMinutes();\n            };\n\n            var TimePicker = _Base.Class.define(function TimePicker_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.TimePicker.TimePicker\">\n                /// <summary locid=\"WinJS.UI.TimePicker.constructor\">Initializes a new instance of the TimePicker control</summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.TimePicker.constructor_p:element\">\n                /// The DOM element associated with the TimePicker control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.TimePicker.constructor_p:options\">\n                /// The set of options to be applied initially to the TimePicker control.\n                /// </param>\n                /// <returns type=\"WinJS.UI.TimePicker\" locid=\"WinJS.UI.TimePicker.constructor_returnValue\">A constructed TimePicker control.</returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n\n                // Default to current time\n                this._currentTime = TimePicker._sentinelDate();\n\n                element = element || _Global.document.createElement(\"div\");\n                _ElementUtilities.addClass(element, \"win-disposable\");\n                element.winControl = this;\n\n                var label = element.getAttribute(\"aria-label\");\n                if (!label) {\n                    element.setAttribute(\"aria-label\", strings.ariaLabel);\n                }\n\n                this._timePatterns = {\n                    minute: null,\n                    hour: null,\n                    period: null\n                };\n\n                // Options should be set after the element is initialized which is\n                // the same order of operation as imperatively setting options.\n                this._init(element);\n                _Control.setOptions(this, options);\n            }, {\n                _currentTime: null,\n                _clock: null,\n                _disabled: false,\n                _hourElement: null,\n                _hourControl: null,\n                _minuteElement: null,\n                _minuteControl: null,\n                _ampmElement: null,\n                _ampmControl: null,\n                _minuteIncrement: 1,\n                _timePatterns: {\n                    minute: null,\n                    hour: null,\n                    period: null\n                },\n                _information: null,\n\n                _addAccessibilityAttributes: function () {\n                    //see http://www.w3.org/TR/wai-aria/rdf_model.png for details\n                    this._domElement.setAttribute(\"role\", \"group\");\n\n                    this._hourElement.setAttribute(\"aria-label\", strings.selectHour);\n                    this._minuteElement.setAttribute(\"aria-label\", strings.selectMinute);\n                    if (this._ampmElement) {\n                        this._ampmElement.setAttribute(\"aria-label\", strings.selectAMPM);\n                    }\n                },\n\n                _addControlsInOrder: function (info) {\n                    var that = this;\n                    info.order.forEach(function (s, index) {\n                        switch (s) {\n                            case \"hour\":\n                                that._domElement.appendChild(that._hourElement);\n                                _ElementUtilities.addClass(that._hourElement, \"win-order\" + index);\n                                break;\n                            case \"minute\":\n                                that._domElement.appendChild(that._minuteElement);\n                                _ElementUtilities.addClass(that._minuteElement, \"win-order\" + index);\n                                break;\n                            case \"period\":\n                                if (that._ampmElement) {\n                                    that._domElement.appendChild(that._ampmElement);\n                                    _ElementUtilities.addClass(that._ampmElement, \"win-order\" + index);\n                                }\n                                break;\n                        }\n                    });\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.TimePicker.dispose\">\n                    /// <summary locid=\"WinJS.UI.TimePicker.dispose\">\n                    /// Disposes this TimePicker.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.TimePicker.clock\" helpKeyword=\"WinJS.UI.TimePicker.clock\">\n                /// Gets or sets the type of clock to display (12HourClock or 24HourClock). It defaults to the user setting.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                clock: {\n                    get: function () {\n                        return this._clock;\n                    },\n                    set: function (value) {\n                        if (this._clock !== value) {\n                            this._clock = value;\n                            this._init();\n                        }\n                    }\n                },\n\n                /// <field type=\"Date\" locid=\"WinJS.UI.TimePicker.current\" helpKeyword=\"WinJS.UI.TimePicker.current\">\n                /// Gets or sets the current date (and time) of the TimePicker.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                current: {\n                    get: function () {\n                        var cur = this._currentTime;\n                        if (cur) {\n                            var time = TimePicker._sentinelDate();\n                            time.setHours(cur.getHours()); // accounts for AM/PM\n                            time.setMinutes(this._getMinutesIndex(cur) * this.minuteIncrement);\n                            time.setSeconds(0);\n                            time.setMilliseconds(0);\n                            return time;\n                        } else {\n                            return cur;\n                        }\n                    },\n                    set: function (value) {\n                        var newTime;\n                        if (typeof (value) === \"string\") {\n                            newTime = TimePicker._sentinelDate();\n                            newTime.setTime(Date.parse(newTime.toDateString() + \" \" + value));\n                        } else {\n                            newTime = TimePicker._sentinelDate();\n                            newTime.setHours(value.getHours());\n                            newTime.setMinutes(value.getMinutes());\n                        }\n\n                        var oldTime = this._currentTime;\n                        if (!areTimesEqual(oldTime, newTime)) {\n                            this._currentTime = newTime;\n\n                            this._updateDisplay();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.TimePicker.disabled\" helpKeyword=\"WinJS.UI.TimePicker.disabled\">\n                /// Specifies whether the TimePicker is disabled.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                disabled: {\n                    get: function () { return this._disabled; },\n                    set: function (value) {\n                        if (this._disabled !== value) {\n                            this._disabled = value;\n                            if (this._hourControl) {\n                                this._hourControl.setDisabled(value);\n                                this._minuteControl.setDisabled(value);\n                            }\n                            if (this._ampmControl) {\n                                this._ampmControl.setDisabled(value);\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.TimePicker.element\" helpKeyword=\"WinJS.UI.TimePicker.element\">\n                /// Gets the DOM element for the TimePicker.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                element: {\n                    get: function () { return this._domElement; }\n                },\n\n\n                _init: function (element) {\n                    this._setElement(element);\n                    this._updateDisplay();\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.TimePicker.hourPattern\" helpKeyword=\"WinJS.UI.TimePicker.hourPattern\">\n                /// Gets or sets the display pattern for the hour.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                hourPattern: {\n                    get: function () { return this._timePatterns.hour.pattern; },\n                    set: function (value) {\n                        if (this._timePatterns.hour !== value) {\n                            this._timePatterns.hour = value;\n                            this._init();\n                        }\n                    }\n\n                },\n\n                _getHoursAmpm: function (time) {\n                    var hours24 = time.getHours();\n                    if (this._ampmElement) {\n                        if (hours24 === 0) {\n                            return { hours: 12, ampm: 0 };\n                        } else if (hours24 < 12) {\n                            return { hours: hours24, ampm: 0 };\n                        }\n                        return { hours: hours24 - 12, ampm: 1 };\n                    }\n\n                    return { hours: hours24 };\n                },\n\n                _getHoursIndex: function (hours) {\n                    if (this._ampmElement && hours === 12) {\n                        return 0;\n                    }\n                    return hours;\n                },\n\n                _getMinutesIndex: function (time) {\n                    return parseInt(time.getMinutes() / this.minuteIncrement);\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.TimePicker.minuteIncrement\" helpKeyword=\"WinJS.UI.TimePicker.minuteIncrement\">\n                /// Gets or sets the minute increment. For example, \"15\" specifies that the TimePicker minute control should display only the choices 00, 15, 30, 45.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                minuteIncrement: {\n                    //prevent divide by 0, and leave user's input intact\n                    get: function () { return Math.max(1, Math.abs(this._minuteIncrement | 0) % 60); },\n                    set: function (value) {\n                        if (this._minuteIncrement !== value) {\n                            this._minuteIncrement = value;\n                            this._init();\n                        }\n                    }\n\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.TimePicker.minutePattern\" helpKeyword=\"WinJS.UI.TimePicker.minutePattern\">\n                /// Gets or sets the display pattern for the minute.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                minutePattern: {\n                    get: function () { return this._timePatterns.minute.pattern; },\n                    set: function (value) {\n                        if (this._timePatterns.minute !== value) {\n                            this._timePatterns.minute = value;\n                            this._init();\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.TimePicker.periodPattern\" helpKeyword=\"WinJS.UI.TimePicker.periodPattern\">\n                /// Gets or sets the display pattern for the period.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                periodPattern: {\n                    get: function () { return this._timePatterns.period.pattern; },\n                    set: function (value) {\n\n                        if (this._timePatterns.period !== value) {\n                            this._timePatterns.period = value;\n                            this._init();\n                        }\n                    }\n                },\n\n                _setElement: function (element) {\n                    this._domElement = this._domElement || element;\n                    if (!this._domElement) { return; }\n\n                    var info = TimePicker.getInformation(this.clock, this.minuteIncrement, this._timePatterns);\n                    this._information = info;\n\n                    if (info.forceLanguage) {\n                        this._domElement.setAttribute(\"lang\", info.forceLanguage);\n                        this._domElement.setAttribute(\"dir\", info.isRTL ? \"rtl\" : \"ltr\");\n                    }\n\n                    _ElementUtilities.empty(this._domElement);\n                    _ElementUtilities.addClass(this._domElement, \"win-timepicker\");\n\n                    this._hourElement = _Global.document.createElement(\"select\");\n                    _ElementUtilities.addClass(this._hourElement, \"win-timepicker-hour win-dropdown\");\n\n                    this._minuteElement = _Global.document.createElement(\"select\");\n                    _ElementUtilities.addClass(this._minuteElement, \"win-timepicker-minute win-dropdown\");\n\n                    this._ampmElement = null;\n                    if (info.clock === \"12HourClock\") {\n                        this._ampmElement = _Global.document.createElement(\"select\");\n                        _ElementUtilities.addClass(this._ampmElement, \"win-timepicker-period win-dropdown\");\n                    }\n\n                    this._addControlsInOrder(info);\n\n                    var hoursAmpm = this._getHoursAmpm(this.current);\n                    this._hourControl = new _Select._Select(this._hourElement, {\n                        dataSource: this._getInfoHours(),\n                        disabled: this.disabled,\n                        index: this._getHoursIndex(hoursAmpm.hours)\n                    });\n                    this._minuteControl = new _Select._Select(this._minuteElement, {\n                        dataSource: info.minutes,\n                        disabled: this.disabled,\n                        index: this._getMinutesIndex(this.current)\n                    });\n                    this._ampmControl = null;\n                    if (this._ampmElement) {\n                        this._ampmControl = new _Select._Select(this._ampmElement, {\n                            dataSource: info.periods,\n                            disabled: this.disabled,\n                            index: hoursAmpm.ampm\n                        });\n                    }\n\n                    this._wireupEvents();\n                    this._updateValues();\n                    this._addAccessibilityAttributes();\n                },\n\n                _getInfoHours: function () {\n                    return this._information.hours;\n                },\n\n                _updateLayout: function () {\n                    if (!this._domElement) {\n                        return;\n                    }\n                    this._updateValues();\n                },\n\n                _updateValues: function () {\n                    if (this._hourControl) {\n                        var hoursAmpm = this._getHoursAmpm(this.current);\n                        if (this._ampmControl) {\n                            this._ampmControl.index = hoursAmpm.ampm;\n                        }\n                        this._hourControl.index = this._getHoursIndex(hoursAmpm.hours);\n                        this._minuteControl.index = this._getMinutesIndex(this.current);\n                    }\n                },\n\n                _updateDisplay: function () {\n                    //Render display index based on constraints (minuteIncrement)\n                    //Will not modify current time\n\n                    var hoursAmpm = this._getHoursAmpm(this.current);\n\n                    if (this._ampmControl) {\n                        this._ampmControl.index = hoursAmpm.ampm;\n                    }\n\n                    if (this._hourControl) {\n                        this._hourControl.index = this._getHoursIndex(hoursAmpm.hours);\n                        this._minuteControl.index = this._getMinutesIndex(this.current);\n                    }\n                },\n\n                _wireupEvents: function () {\n                    var that = this;\n\n                    var fixupHour = function () {\n                        var hour = that._hourControl.index;\n                        if (that._ampmElement) {\n                            if (that._ampmControl.index === 1) {\n                                if (hour !== 12) {\n                                    hour += 12;\n                                }\n                            }\n                        }\n                        return hour;\n                    };\n\n                    var changed = function () {\n                        var hour = fixupHour();\n                        that._currentTime.setHours(hour);\n\n                        that._currentTime.setMinutes(that._minuteControl.index * that.minuteIncrement);\n                    };\n\n                    this._hourElement.addEventListener(\"change\", changed, false);\n                    this._minuteElement.addEventListener(\"change\", changed, false);\n                    if (this._ampmElement) {\n                        this._ampmElement.addEventListener(\"change\", changed, false);\n                    }\n                }\n            }, {\n                _sentinelDate: function () {\n                    // This is July 15th, 2011 as our sentinel date. There are no known\n                    //  daylight savings transitions that happened on that date.\n                    var current = new Date();\n                    return new Date(2011, 6, 15, current.getHours(), current.getMinutes());\n                },\n                _getInformationWinRT: function (clock, minuteIncrement, timePatterns) {\n                    var newFormatter = function (pattern, defaultPattern) {\n                        var dtf = _WinRT.Windows.Globalization.DateTimeFormatting;\n                        pattern = !pattern ? defaultPattern : pattern;\n                        var formatter = new dtf.DateTimeFormatter(pattern);\n                        if (clock) {\n                            formatter = dtf.DateTimeFormatter(pattern, formatter.languages, formatter.geographicRegion, formatter.calendar, clock);\n                        }\n                        return formatter;\n                    };\n\n                    var glob = _WinRT.Windows.Globalization;\n                    var calendar = new glob.Calendar();\n                    if (clock) {\n                        calendar = new glob.Calendar(calendar.languages, calendar.getCalendarSystem(), clock);\n                    }\n                    calendar.setDateTime(TimePicker._sentinelDate());\n\n                    var computedClock = calendar.getClock();\n                    var numberOfHours = 24;\n                    numberOfHours = calendar.numberOfHoursInThisPeriod;\n\n                    var periods = (function () {\n                        var periodFormatter = newFormatter(timePatterns.period, DEFAULT_PERIOD_PATTERN);\n                        return {\n                            getLength: function () { return 2; },\n                            getValue: function (index) {\n                                var date = TimePicker._sentinelDate();\n                                if (index === 0) {\n                                    date.setHours(1);\n                                    var am = periodFormatter.format(date);\n                                    return am;\n                                }\n                                if (index === 1) {\n                                    date.setHours(13);\n                                    var pm = periodFormatter.format(date);\n                                    return pm;\n                                }\n                                return null;\n                            }\n                        };\n                    })();\n\n                    // Determine minute format from the DateTimeFormatter\n                    var minutes = (function () {\n                        var minuteFormatter = newFormatter(timePatterns.minute, DEFAULT_MINUTE_PATTERN);\n                        var now = TimePicker._sentinelDate();\n                        return {\n                            getLength: function () { return 60 / minuteIncrement; },\n                            getValue: function (index) {\n                                var display = index * minuteIncrement;\n                                now.setMinutes(display);\n                                return minuteFormatter.format(now);\n                            }\n                        };\n                    })();\n\n\n                    // Determine hour format from the DateTimeFormatter\n                    var hours = (function () {\n                        var hourFormatter = newFormatter(timePatterns.hour, DEFAULT_HOUR_PATTERN);\n                        var now = TimePicker._sentinelDate();\n                        return {\n                            getLength: function () { return numberOfHours; },\n                            getValue: function (index) {\n                                now.setHours(index);\n                                return hourFormatter.format(now);\n                            }\n                        };\n                    })();\n\n                    // Determine the order of the items from the DateTimeFormatter.\n                    // \"hour minute\" also returns the period (if needed).\n                    //\n                    var hourMinuteFormatter = newFormatter(\"hour minute\");\n                    var pattern = hourMinuteFormatter.patterns[0];\n                    var order = [\"hour\", \"minute\"];\n\n                    var indexes = {\n                        period: pattern.indexOf(\"{period\"),\n                        hour: pattern.indexOf(\"{hour\"),\n                        minute: pattern.indexOf(\"{minute\")\n                    };\n                    if (indexes.period > -1) {\n                        order.push(\"period\");\n                    }\n\n\n                    var DateTimeFormatter = _WinRT.Windows.Globalization.DateTimeFormatting.DateTimeFormatter;\n                    var dtf = new DateTimeFormatter(\"month.full\", _WinRT.Windows.Globalization.ApplicationLanguages.languages, \"ZZ\", \"GregorianCalendar\", \"24HourClock\");\n                    var pat = dtf.patterns[0];\n                    var isRTL = pat.charCodeAt(0) === 8207;\n\n                    if (isRTL) {\n                        var temp = indexes.hour;\n                        indexes.hour = indexes.minute;\n                        indexes.minute = temp;\n                    }\n\n                    order.sort(function (a, b) {\n                        if (indexes[a] < indexes[b]) {\n                            return -1;\n                        } else if (indexes[a] > indexes[b]) {\n                            return 1;\n                        } else {\n                            return 0;\n                        }\n                    });\n\n                    return { minutes: minutes, hours: hours, clock: computedClock, periods: periods, order: order, forceLanguage: hourMinuteFormatter.resolvedLanguage, isRTL: isRTL };\n                },\n                _getInformationJS: function (clock, minuteIncrement) {\n                    var hours = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\n\n                    var minutes = {};\n                    minutes.getLength = function () { return 60 / minuteIncrement; };\n                    minutes.getValue = function (index) {\n                        var display = index * minuteIncrement;\n                        if (display < 10) {\n                            return \"0\" + display.toString();\n                        } else {\n                            return display.toString();\n                        }\n                    };\n\n                    var order = [\"hour\", \"minute\", \"period\"];\n                    if (clock === \"24HourClock\") {\n                        hours = [\"00\", \"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];\n                        order = [\"hour\", \"minute\"];\n                    }\n                    return { minutes: minutes, hours: hours, clock: clock || \"12HourClock\", periods: [\"AM\", \"PM\"], order: order };\n                }\n            });\n            if (_WinRT.Windows.Globalization.DateTimeFormatting && _WinRT.Windows.Globalization.Calendar && _WinRT.Windows.Globalization.ApplicationLanguages) {\n                TimePicker.getInformation = TimePicker._getInformationWinRT;\n            } else {\n                TimePicker.getInformation = TimePicker._getInformationJS;\n            }\n            _Base.Class.mix(TimePicker, _Events.createEventProperties(\"change\"));\n            _Base.Class.mix(TimePicker, _Control.DOMEventMixin);\n            return TimePicker;\n        })\n    });\n\n\n});\n\n\ndefine('require-style!less/styles-backbutton',[],function(){});\n\ndefine('require-style!less/colors-backbutton',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Back Button\ndefine('WinJS/Controls/BackButton',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources',\n    '../Navigation',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    'require-style!less/styles-backbutton',\n    'require-style!less/colors-backbutton'\n    ], function backButtonInit(exports, _Global, _Base, _ErrorFromName, _Resources, Navigation, _Control, _ElementUtilities, _Hoverable) {\n    \"use strict\";\n\n    var Key = _ElementUtilities.Key;\n\n    // Class Names\n    var navigationBackButtonClass = 'win-navigation-backbutton';\n    var glyphClass = \"win-back\";\n\n    // CONSTANTS\n    var MOUSE_BACK_BUTTON = 3;\n\n    // Create Singleton for global event registering/unregistering. This Singleton should only be created once.\n    // Here the function 'returnBackButtonSingelton' is called immediateley and its result is the singleton object.\n    var singleton = (function createBackButtonSingleton() {\n\n        /* Step 1: Build JavaScript closure */\n\n        function hookUpBackButtonGlobalEventHandlers() {\n            // Subscribes to global events on the window object\n            _Global.addEventListener('keyup', backButtonGlobalKeyUpHandler, false);\n            _ElementUtilities._addEventListener(_Global, 'pointerup', backButtonGlobalMSPointerUpHandler, false);\n        }\n\n        function unHookBackButtonGlobalEventHandlers() {\n            // Unsubscribes from global events on the window object\n            _Global.removeEventListener('keyup', backButtonGlobalKeyUpHandler, false);\n            _ElementUtilities._removeEventListener(_Global, 'pointerup', backButtonGlobalMSPointerUpHandler, false);\n        }\n\n        function backButtonGlobalKeyUpHandler(event) {\n            // Navigates back when (alt + left) or BrowserBack keys are released.\n            if ((event.keyCode === Key.leftArrow && event.altKey && !event.shiftKey && !event.ctrlKey) || (event.keyCode === Key.browserBack)) {\n                Navigation.back();\n                event.preventDefault();\n            }\n        }\n\n        function backButtonGlobalMSPointerUpHandler(event) {\n            // Responds to clicks to enable navigation using 'back' mouse buttons.\n            if (event.button === MOUSE_BACK_BUTTON) {\n                Navigation.back();\n            }\n        }\n\n        // Singleton reference count for registering and unregistering global event handlers.\n        var backButtonReferenceCount = 0; //\n\n        /* Step 2: Return Singleton object literal */\n        return {\n            addRef: function () {\n                if (backButtonReferenceCount === 0) {\n                    hookUpBackButtonGlobalEventHandlers();\n                }\n                backButtonReferenceCount++;\n            },\n            release: function () {\n                if (backButtonReferenceCount > 0) { // Ensure count won't become negative.\n                    backButtonReferenceCount--;\n                    if (backButtonReferenceCount === 0) {\n                        unHookBackButtonGlobalEventHandlers();\n                    }\n                }\n            },\n            getCount: function () { // Return the value of the reference count. Useful for unit testing.\n                return backButtonReferenceCount;\n            }\n        };\n    }()); // Immediate invoke creates and returns the Singleton\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.BackButton\">\n        /// Provides backwards navigation functionality.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.backbutton.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.backbutton.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<button data-win-control=\"WinJS.UI.BackButton\"></button>]]></htmlSnippet>\n        /// <part name=\"BackButton\" class=\"win-navigation-backbutton\" locid=\"WinJS.UI.BackButton_part:BackButton\">The BackButton control itself</part>\n        /// <part name=\"BackArrowGlyph\" class=\"win-back\" locid=\"WinJS.UI.BackButton_part:BackArrowGlyph\">The Back Arrow glyph</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        BackButton: _Base.Namespace._lazy(function () {\n            // Statics\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/backbuttonarialabel\").value; },\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get badButtonElement() { return \"Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element\"; }\n            };\n\n            var BackButton = _Base.Class.define(function BackButton_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.BackButton.BackButton\">\n                /// <summary locid=\"WinJS.UI.BackButton.constructor\">\n                /// Creates a new BackButton control\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.BackButton.constructor_p:element\">\n                /// The DOM element that will host the control. If this parameter is null, this constructor creates one for you.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.MenuBackButtonCommand.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds to\n                /// one of the control's properties or events.\n                /// </param>\n                /// <returns type=\"WinJS.UI.BackButton\" locid=\"WinJS.UI.BackButton.constructor_returnValue\">\n                /// A BackButton control.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n\n                // Check to make sure we weren't duplicated\n                if (element && element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.BackButton.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                this._element = element || _Global.document.createElement(\"button\");\n                options = options || {};\n\n                this._initializeButton(); // This will also set the aria-label and tooltip\n\n                this._disposed = false;\n\n                // Remember ourselves\n                this._element.winControl = this;\n\n                _Control.setOptions(this, options);\n\n                // Add event handlers for this back button instance\n                this._buttonClickHandler = this._handleBackButtonClick.bind(this);\n                this._element.addEventListener('click', this._buttonClickHandler, false);\n                this._navigatedHandler = this._handleNavigatedEvent.bind(this);\n                Navigation.addEventListener('navigated', this._navigatedHandler, false);\n\n                // Increment reference count / manage add global event handlers\n                singleton.addRef();\n            }, {\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.BackButton.element\" helpKeyword=\"WinJS.UI.BackButton.element\">\n                /// Gets the DOM element that hosts the BackButton control.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.BackButton.dispose\">\n                    /// <summary locid=\"WinJS.UI.BackButton.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true; // Mark this control as disposed.\n\n                    // Remove 'navigated' eventhandler for this BackButton\n                    Navigation.removeEventListener('navigated', this._navigatedHandler, false);\n\n                    singleton.release(); // Decrement reference count.\n\n                },\n\n                refresh: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.BackButton.refresh\">\n                    /// <summary locid=\"WinJS.UI.BackButton.refresh\">\n                    /// Sets the 'disabled' attribute to correct the value based on the current navigation history stack.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (Navigation.canGoBack) {\n                        this._element.disabled = false;\n                    } else {\n                        this._element.disabled = true;\n                    }\n                },\n\n                _initializeButton: function () {\n                    //Final EN-US HTML should be:\n                    //<button class=\"win-navigation-backbutton\" aria-label=\"Back\" title=\"Back\" type=\"button\"><span class=\"win-back\"></span></button>\n                    //Button will automatically be disabled if WinJS.Navigation.history.canGoBack is false.\n\n                    // Verify the HTML is a button\n                    if (this._element.tagName !== \"BUTTON\") {\n                        throw new _ErrorFromName(\"WinJS.UI.BackButton.BadButtonElement\", strings.badButtonElement);\n                    }\n\n                    // Attach our css classes\n                    _ElementUtilities.addClass(this._element, navigationBackButtonClass);\n\n                    // Attach disposable class.\n                    _ElementUtilities.addClass(this._element, \"win-disposable\");\n\n                    // Create inner glyph element\n                    this._element.innerHTML = '<span class=\"' + glyphClass + '\"></span>';\n\n                    // Set the 'disabled' property to the correct value based on the current navigation history stack.\n                    this.refresh();\n\n                    // Set Aria-label and native tooltip to the same localized string equivalent of \"Back\"\n                    this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                    this._element.setAttribute(\"title\", strings.ariaLabel);\n\n                    // Explicitly set type attribute to avoid the default <button> \"submit\" type.\n                    this._element.setAttribute(\"type\", \"button\");\n                },\n\n                _handleNavigatedEvent: function () {\n                    // Handles WinJS.Navigation 'navigated' behavior\n                    this.refresh();\n                },\n\n                _handleBackButtonClick: function () {\n                    // Handles BackButton 'click' behavior\n                    Navigation.back();\n                }\n\n            });\n            // Private Static Method.\n            BackButton._getReferenceCount = function () {\n                return singleton.getCount(); // Expose this for Unit testing.\n            };\n            _Base.Class.mix(BackButton, _Control.DOMEventMixin);\n            return BackButton;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-tooltip',[],function(){});\n\ndefine('require-style!less/colors-tooltip',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Tooltip',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_Events',\n    '../Animations',\n    '../Animations/_TransitionAnimation',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    'require-style!less/styles-tooltip',\n    'require-style!less/colors-tooltip'\n    ], function tooltipInit(exports, _Global, _WinRT, _Base, _BaseUtils, _Events, Animations, _TransitionAnimation, _Control, _Dispose, _ElementUtilities, _Hoverable) {\n    \"use strict\";\n\n    // Tooltip control implementation\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Tooltip\">\n        /// Displays a tooltip that can contain images and formatting.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.tooltip.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.tooltip.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div style=\"display:inline-block;\" data-win-control=\"WinJS.UI.Tooltip\" data-win-options=\"{innerHTML:'Tooltip content goes here'}\"></div>]]></htmlSnippet>\n        /// <event name=\"beforeopen\" bubbles=\"false\" locid=\"WinJS.UI.Tooltip_e:beforeopen\">Raised when the tooltip is about to appear.</event>\n        /// <event name=\"opened\" bubbles=\"false\" locid=\"WinJS.UI.Tooltip_e:opened\">Raised when the tooltip is showing.</event>\n        /// <event name=\"beforeclose\" bubbles=\"false\" locid=\"WinJS.UI.Tooltip_e:beforeclose\">Raised when the tooltip is about to become hidden.</event>\n        /// <event name=\"closed\" bubbles=\"false\" locid=\"WinJS.UI.Tooltip_e:close\">Raised when the tooltip is hidden.</event>\n        /// <part name=\"tooltip\" class=\"win-tooltip\" locid=\"WinJS.UI.Tooltip_e:tooltip\">The entire Tooltip control.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Tooltip: _Base.Namespace._lazy(function () {\n            var lastCloseTime = 0;\n            var Key = _ElementUtilities.Key;\n\n            // Constants definition\n            var DEFAULT_PLACEMENT = \"top\";\n            var DELAY_INITIAL_TOUCH_SHORT = _TransitionAnimation._animationTimeAdjustment(400);\n            var DELAY_INITIAL_TOUCH_LONG = _TransitionAnimation._animationTimeAdjustment(1200);\n            var DEFAULT_MOUSE_HOVER_TIME = _TransitionAnimation._animationTimeAdjustment(400); // 0.4 second\n            var DEFAULT_MESSAGE_DURATION = _TransitionAnimation._animationTimeAdjustment(5000); // 5 secs\n            var DELAY_RESHOW_NONINFOTIP_TOUCH = _TransitionAnimation._animationTimeAdjustment(0);\n            var DELAY_RESHOW_NONINFOTIP_NONTOUCH = _TransitionAnimation._animationTimeAdjustment(600);\n            var DELAY_RESHOW_INFOTIP_TOUCH = _TransitionAnimation._animationTimeAdjustment(400);\n            var DELAY_RESHOW_INFOTIP_NONTOUCH = _TransitionAnimation._animationTimeAdjustment(600);\n            var RESHOW_THRESHOLD = _TransitionAnimation._animationTimeAdjustment(200);\n            var HIDE_DELAY_MAX = _TransitionAnimation._animationTimeAdjustment(300000); // 5 mins\n            var OFFSET_KEYBOARD = 12;\n            var OFFSET_MOUSE = 20;\n            var OFFSET_TOUCH = 45;\n            var OFFSET_PROGRAMMATIC_TOUCH = 20;\n            var OFFSET_PROGRAMMATIC_NONTOUCH = 12;\n            var SAFETY_NET_GAP = 1; // We set a 1-pixel gap between the right or bottom edge of the tooltip and the viewport to avoid possible re-layout\n            var PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || \"mouse\"; // pointer type to indicate a mouse event\n            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\"; // pointer type to indicate a touch event\n\n            var EVENTS_INVOKE = { \"keyup\": \"\", \"pointerover\": \"\", \"pointerdown\": \"\" },\n                EVENTS_UPDATE = { \"pointermove\": \"\" },\n                EVENTS_DISMISS = { \"pointerdown\": \"\", \"keydown\": \"\", \"focusout\": \"\", \"pointerout\": \"\", \"pointercancel\": \"\", \"pointerup\": \"\" },\n                EVENTS_BY_CHILD = { \"pointerover\": \"\", \"pointerout\": \"\" };\n\n            function isInvokeEvent(eventType, pointerType) {\n                if (eventType === \"pointerdown\") {\n                    return pointerType === PT_TOUCH;\n                } else {\n                    return eventType in EVENTS_INVOKE;\n                }\n            }\n\n            function isDismissEvent(eventType, pointerType) {\n                if (eventType === \"pointerdown\") {\n                    return pointerType !== PT_TOUCH;\n                } else {\n                    return eventType in EVENTS_DISMISS;\n                }\n            }\n\n            // CSS class names\n            var msTooltip = \"win-tooltip\",\n            msTooltipPhantom = \"win-tooltip-phantom\";\n\n            // Global attributes\n            var mouseHoverTime = DEFAULT_MOUSE_HOVER_TIME,\n                nonInfoTooltipNonTouchShowDelay = 2 * mouseHoverTime,\n                infoTooltipNonTouchShowDelay = 2.5 * mouseHoverTime,\n                messageDuration = DEFAULT_MESSAGE_DURATION,\n                isLeftHanded = false;\n\n            var hasInitWinRTSettings = false;\n\n            var createEvent = _Events._createEventProperty;\n\n            return _Base.Class.define(function Tooltip_ctor(anchorElement, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Tooltip.Tooltip\">\n                /// <summary locid=\"WinJS.UI.Tooltip.constructor\">\n                /// Creates a new Tooltip.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.Tooltip.constructor_p:element\">\n                /// The DOM element that hosts the Tooltip.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.Tooltip.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the opened event,\n                /// add a property named \"onopened\" to the options object and set its value to the event handler.\n                /// This parameter is optional.\n                /// </param>\n                /// <returns type=\"WinJS.UI.Tooltip\" locid=\"WinJS.UI.Tooltip.constructor_returnValue\">\n                /// The new Tooltip.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n                anchorElement = anchorElement || _Global.document.createElement(\"div\");\n\n                var tooltip = _ElementUtilities.data(anchorElement).tooltip;\n                if (tooltip) {\n                    return tooltip;\n                }\n\n                // Set system attributes if it is in WWA, otherwise, use the default values\n                if (!hasInitWinRTSettings && _WinRT.Windows.UI.ViewManagement.UISettings) { // in WWA\n                    var uiSettings = new _WinRT.Windows.UI.ViewManagement.UISettings();\n                    mouseHoverTime = _TransitionAnimation._animationTimeAdjustment(uiSettings.mouseHoverTime);\n                    nonInfoTooltipNonTouchShowDelay = 2 * mouseHoverTime;\n                    infoTooltipNonTouchShowDelay = 2.5 * mouseHoverTime;\n                    messageDuration = _TransitionAnimation._animationTimeAdjustment(uiSettings.messageDuration * 1000);  // uiSettings.messageDuration is in seconds.\n                    var handedness = uiSettings.handPreference;\n                    isLeftHanded = (handedness === _WinRT.Windows.UI.ViewManagement.HandPreference.leftHanded);\n                }\n                hasInitWinRTSettings = true;\n\n                // Need to initialize properties\n                this._disposed = false;\n                this._placement = DEFAULT_PLACEMENT;\n                this._infotip = false;\n                this._innerHTML = null;\n                this._contentElement = null;\n                this._extraClass = null;\n                this._lastContentType = \"html\";\n                this._anchorElement = anchorElement;\n                this._domElement = null;\n                this._phantomDiv = null;\n                this._triggerByOpen = false;\n                this._eventListenerRemoveStack = [];\n\n                // To handle keyboard navigation\n                this._lastKeyOrBlurEvent = null;\n                this._currentKeyOrBlurEvent = null;\n\n                // Remember ourselves\n                anchorElement.winControl = this;\n                _ElementUtilities.addClass(anchorElement, \"win-disposable\");\n\n                // If anchor element's title is defined, set as the default tooltip content\n                if (anchorElement.title) {\n                    this._innerHTML = this._anchorElement.title;\n                    this._anchorElement.removeAttribute(\"title\");\n                }\n\n                _Control.setOptions(this, options);\n                this._events();\n                _ElementUtilities.data(anchorElement).tooltip = this;\n            }, {\n                /// <field type=\"String\" locid=\"WinJS.UI.Tooltip.innerHTML\" helpKeyword=\"WinJS.UI.Tooltip.innerHTML\">\n                /// Gets or sets the HTML content of the Tooltip.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                innerHTML: {\n                    get: function () {\n                        return this._innerHTML;\n                    },\n                    set: function (value) {\n                        this._innerHTML = value;\n                        if (this._domElement) {\n                            // If we set the innerHTML to null or \"\" while tooltip is up, we should close it\n                            if (!this._innerHTML || this._innerHTML === \"\") {\n                                this._onDismiss();\n                                return;\n                            }\n                            this._domElement.innerHTML = value;\n                            this._position();\n                        }\n                        this._lastContentType = \"html\";\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" hidden=\"true\" locid=\"WinJS.UI.Tooltip.element\" helpKeyword=\"WinJS.UI.Tooltip.element\">\n                /// Gets or sets the DOM element that hosts the Tooltip.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._anchorElement;\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" locid=\"WinJS.UI.Tooltip.contentElement\" helpKeyword=\"WinJS.UI.Tooltip.contentElement\" potentialValueSelector=\"div[style='display: none;']>div[id], div[style='display: none;']>div[class]\">\n                /// Gets or sets the DOM element that is the content for the ToolTip.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                contentElement: {\n                    get: function () {\n                        return this._contentElement;\n                    },\n                    set: function (value) {\n                        this._contentElement = value;\n                        if (this._domElement) {\n                            // If we set the contentElement to null while tooltip is up, we should close it\n                            if (!this._contentElement) {\n                                this._onDismiss();\n                                return;\n                            }\n                            this._domElement.innerHTML = \"\";\n                            this._domElement.appendChild(this._contentElement);\n                            this._position();\n                        }\n                        this._lastContentType = \"element\";\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Tooltip.placement\" locid=\"WinJS.UI.Tooltip.placement\" helpKeyword=\"WinJS.UI.Tooltip.placement\">\n                /// Gets or sets the position for the Tooltip relative to its target element: top, bottom, left or right.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                placement: {\n                    get: function () {\n                        return this._placement;\n                    },\n                    set: function (value) {\n                        if (value !== \"top\" && value !== \"bottom\" && value !== \"left\" && value !== \"right\") {\n                            value = DEFAULT_PLACEMENT;\n                        }\n                        this._placement = value;\n                        if (this._domElement) {\n                            this._position();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.Tooltip.infotip\" helpKeyword=\"WinJS.UI.Tooltip.infotip\">\n                /// Gets or sets a value that specifies whether the Tooltip is an infotip, a tooltip that contains\n                /// a lot of info and should be displayed for longer than a typical Tooltip.\n                /// The default value is false.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                infotip: {\n                    get: function () {\n                        return this._infotip;\n                    },\n                    set: function (value) {\n                        this._infotip = !!value; //convert the value to boolean\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.Tooltip.extraClass\" helpKeyword=\"WinJS.UI.Tooltip.extraClass\" isAdvanced=\"true\">\n                /// Gets or sets additional CSS classes to apply to the Tooltip control's host element.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                extraClass: {\n                    get: function () {\n                        return this._extraClass;\n                    },\n                    set: function (value) {\n                        this._extraClass = value;\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Tooltip.onbeforeopen\" helpKeyword=\"WinJS.UI.Tooltip.onbeforeopen\">\n                /// Raised just before the Tooltip appears.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onbeforeopen: createEvent(\"beforeopen\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Tooltip.onopened\" helpKeyword=\"WinJS.UI.Tooltip.onopened\">\n                /// Raised when the Tooltip is shown.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onopened: createEvent(\"opened\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Tooltip.onbeforeclose\" helpKeyword=\"WinJS.UI.Tooltip.onbeforeclose\">\n                /// Raised just before the Tooltip is hidden.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onbeforeclose: createEvent(\"beforeclose\"),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Tooltip.onclosed\" helpKeyword=\"WinJS.UI.Tooltip.onclosed\">\n                /// Raised when the Tooltip is no longer displayed.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onclosed: createEvent(\"closed\"),\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.Tooltip.dispose\">\n                    /// <summary locid=\"WinJS.UI.Tooltip.dispose\">\n                    /// Disposes this Tooltip.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._disposed = true;\n                    _Dispose.disposeSubTree(this.element);\n                    for (var i = 0, len = this._eventListenerRemoveStack.length; i < len; i++) {\n                        this._eventListenerRemoveStack[i]();\n                    }\n                    this._onDismiss();\n                    var data = _ElementUtilities.data(this._anchorElement);\n                    if (data) {\n                        delete data.tooltip;\n                    }\n                },\n\n                addEventListener: function (eventName, eventCallBack, capture) {\n                    /// <signature helpKeyword=\"WinJS.UI.Tooltip.addEventListener\">\n                    /// <summary locid=\"WinJS.UI.Tooltip.addEventListener\">\n                    /// Registers an event handler for the specified event.\n                    /// </summary>\n                    /// <param name=\"eventName\" type=\"String\" locid=\"WinJS.UI.Tooltip.addEventListener_p:eventName\">The name of the event.</param>\n                    /// <param name=\"eventCallback\" type=\"Function\" locid=\"WinJS.UI.Tooltip.addEventListener_p:eventCallback\">The event handler function to associate with this event.</param>\n                    /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.UI.Tooltip.addEventListener_p:capture\">Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase.</param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n\n                    if (this._anchorElement) {\n                        this._anchorElement.addEventListener(eventName, eventCallBack, capture);\n\n                        var that = this;\n                        this._eventListenerRemoveStack.push(function () {\n                            that._anchorElement.removeEventListener(eventName, eventCallBack, capture);\n                        });\n                    }\n                },\n\n                removeEventListener: function (eventName, eventCallBack, capture) {\n                    /// <signature helpKeyword=\"WinJS.UI.Tooltip.removeEventListener\">\n                    /// <summary locid=\"WinJS.UI.Tooltip.removeEventListener\">\n                    /// Unregisters an event handler for the specified event.\n                    /// </summary>\n                    /// <param name=\"eventName\" type=\"String\" locid=\"WinJS.UI.Tooltip.removeEventListener:eventName\">The name of the event.</param>\n                    /// <param name=\"eventCallback\" type=\"Function\" locid=\"WinJS.UI.Tooltip.removeEventListener:eventCallback\">The event handler function to remove.</param>\n                    /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.UI.Tooltip.removeEventListener:capture\">Set to true to unregister the event handler for the capturing phase; otherwise, set to false to unregister the event handler for the bubbling phase.</param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n\n                    if (this._anchorElement) {\n                        this._anchorElement.removeEventListener(eventName, eventCallBack, capture);\n                    }\n                },\n\n                open: function (type) {\n                    /// <signature helpKeyword=\"WinJS.UI.Tooltip.open\">\n                    /// <summary locid=\"WinJS.UI.Tooltip.open\">\n                    /// Shows the Tooltip.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.Tooltip.open_p:type\">The type of tooltip to show: \"touch\", \"mouseover\", \"mousedown\", or \"keyboard\". The default value is \"mousedown\".</param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n\n                    // Open takes precedence over other triggering events\n                    // Once tooltip is opened using open(), it can only be closed by time out(mouseover or keyboard) or explicitly by close().\n                    this._triggerByOpen = true;\n\n                    if (type !== \"touch\" && type !== \"mouseover\" && type !== \"mousedown\" && type !== \"keyboard\") {\n                        type = \"default\";\n                    }\n\n                    switch (type) {\n                        case \"touch\":\n                            this._onInvoke(\"touch\", \"never\");\n                            break;\n                        case \"mouseover\":\n                            this._onInvoke(\"mouse\", \"auto\");\n                            break;\n                        case \"keyboard\":\n                            this._onInvoke(\"keyboard\", \"auto\");\n                            break;\n                        case \"mousedown\":\n                        case \"default\":\n                            this._onInvoke(\"nodelay\", \"never\");\n                            break;\n                    }\n\n                },\n\n                close: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.Tooltip.close\">\n                    /// <summary locid=\"WinJS.UI.Tooltip.close\">\n                    /// Hids the Tooltip.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n\n                    this._onDismiss();\n                },\n\n                _cleanUpDOM: function () {\n                    if (this._domElement) {\n                        _Dispose.disposeSubTree(this._domElement);\n                        _Global.document.body.removeChild(this._domElement);\n                        this._domElement = null;\n\n                        _Global.document.body.removeChild(this._phantomDiv);\n                        this._phantomDiv = null;\n                    }\n                },\n\n                _createTooltipDOM: function () {\n                    this._cleanUpDOM();\n\n                    this._domElement = _Global.document.createElement(\"div\");\n\n                    var id = _ElementUtilities._uniqueID(this._domElement);\n                    this._domElement.setAttribute(\"id\", id);\n\n                    // Set the direction of tooltip according to anchor element's\n                    var computedStyle = _Global.document.defaultView.getComputedStyle(this._anchorElement, null);\n                    var elemStyle = this._domElement.style;\n                    elemStyle.direction = computedStyle.direction;\n                    elemStyle.writingMode = computedStyle[\"writing-mode\"]; // must use CSS name, not JS name\n\n                    // Make the tooltip non-focusable\n                    this._domElement.setAttribute(\"tabindex\", -1);\n\n                    // Set the aria tags for accessibility\n                    this._domElement.setAttribute(\"role\", \"tooltip\");\n                    this._anchorElement.setAttribute(\"aria-describedby\", id);\n\n                    // Set the tooltip content\n                    if (this._lastContentType === \"element\") { // Last update through contentElement option\n                        this._domElement.appendChild(this._contentElement);\n                    } else { // Last update through innerHTML option\n                        this._domElement.innerHTML = this._innerHTML;\n                    }\n\n                    _Global.document.body.appendChild(this._domElement);\n                    _ElementUtilities.addClass(this._domElement, msTooltip);\n\n                    // In the event of user-assigned classes, add those too\n                    if (this._extraClass) {\n                        _ElementUtilities.addClass(this._domElement, this._extraClass);\n                    }\n\n                    // Create a phantom div on top of the tooltip div to block all interactions\n                    this._phantomDiv = _Global.document.createElement(\"div\");\n                    this._phantomDiv.setAttribute(\"tabindex\", -1);\n                    _Global.document.body.appendChild(this._phantomDiv);\n                    _ElementUtilities.addClass(this._phantomDiv, msTooltipPhantom);\n                    var zIndex = _Global.document.defaultView.getComputedStyle(this._domElement, null).zIndex + 1;\n                    this._phantomDiv.style.zIndex = zIndex;\n                },\n\n                _raiseEvent: function (type, eventProperties) {\n                    if (this._anchorElement) {\n                        var customEvent = _Global.document.createEvent(\"CustomEvent\");\n                        customEvent.initCustomEvent(type, false, false, eventProperties);\n                        this._anchorElement.dispatchEvent(customEvent);\n                    }\n                },\n\n                // Support for keyboard navigation\n                _captureLastKeyBlurOrPointerOverEvent: function (event) {\n                    this._lastKeyOrBlurEvent = this._currentKeyOrBlurEvent;\n                    switch (event.type) {\n                        case \"keyup\":\n                            if (event.keyCode === Key.shift) {\n                                this._currentKeyOrBlurEvent = null;\n                            } else {\n                                this._currentKeyOrBlurEvent = \"keyboard\";\n                            }\n                            break;\n                        case \"focusout\":\n                            //anchor element no longer in focus, clear up the stack\n                            this._currentKeyOrBlurEvent = null;\n                            break;\n                        default:\n                            break;\n\n                    }\n                },\n\n                _registerEventToListener: function (element, eventType) {\n                    var that = this;\n                    var handler = function (event) {\n                        that._captureLastKeyBlurOrPointerOverEvent(event);\n                        that._handleEvent(event);\n                    };\n                    _ElementUtilities._addEventListener(element, eventType, handler, false);\n\n                    this._eventListenerRemoveStack.push(function () {\n                        _ElementUtilities._removeEventListener(element, eventType, handler, false);\n                    });\n                },\n\n                _events: function () {\n                    for (var eventType in EVENTS_INVOKE) {\n                        this._registerEventToListener(this._anchorElement, eventType);\n                    }\n                    for (var eventType in EVENTS_UPDATE) {\n                        this._registerEventToListener(this._anchorElement, eventType);\n                    }\n                    for (eventType in EVENTS_DISMISS) {\n                        this._registerEventToListener(this._anchorElement, eventType);\n                    }\n                    this._registerEventToListener(this._anchorElement, \"contextmenu\");\n                    this._registerEventToListener(this._anchorElement, \"MSHoldVisual\");\n                },\n\n                _handleEvent: function (event) {\n                    var eventType = event._normalizedType || event.type;\n                    if (!this._triggerByOpen) {\n                        // If the anchor element has children, we should ignore events that are caused within the anchor element\n                        // Please note that we are not using event.target here as in bubbling phases from the child, the event target\n                        // is usually the child\n                        if (eventType in EVENTS_BY_CHILD && _ElementUtilities.eventWithinElement(this._anchorElement, event)) {\n                            return;\n                        } else if (isInvokeEvent(eventType, event.pointerType)) {\n                            if (event.pointerType === PT_TOUCH) {\n                                if (!this._isShown) {\n                                    this._showTrigger = \"touch\";\n                                }\n                                this._onInvoke(\"touch\", \"never\", event);\n                            } else if (this._skipMouseOver && event.pointerType === PT_MOUSE && eventType === \"pointerover\") {\n                                // In browsers which use touch (instead of pointer) events, when the user taps their finger on\n                                // an element which has a tooltip, we receive the following sequence of events:\n                                //   - pointerdown (from touchstart; causes the Tooltip to show)\n                                //   - pointerup (from touchend; causes the Tooltip to hide)\n                                //   - pointerover (from mouseover; causes the Tooltip to show)\n                                // At the end, the Tooltip should be hidden but instead it'll be shown due to mouseover coming\n                                // after touchend. To avoid this problem, we use the _skipMouseOver flag to ignore the mouseover\n                                // that follows touchend.\n                                this._skipMouseOver = false;\n                                return;\n                            } else {\n                                var type = eventType.substring(0, 3) === \"key\" ? \"keyboard\" : \"mouse\";\n                                if (!this._isShown) {\n                                    this._showTrigger = type;\n                                }\n                                this._onInvoke(type, \"auto\", event);\n                            }\n                        } else if (eventType in EVENTS_UPDATE) {\n                            this._contactPoint = { x: event.clientX, y: event.clientY };\n                        } else if (isDismissEvent(eventType, event.pointerType)) {\n                            var eventTrigger;\n                            if (event.pointerType === PT_TOUCH) {\n                                if (eventType === \"pointerup\") {\n                                    this._skipMouseOver = true;\n                                    var that = this;\n                                    _BaseUtils._yieldForEvents(function () {\n                                        that._skipMouseOver = false;\n                                    });\n                                }\n                                eventTrigger = \"touch\";\n                            } else {\n                                eventTrigger = eventType.substring(0, 3) === \"key\" ? \"keyboard\" : \"mouse\";\n                            }\n                            if (eventType !== \"focusout\" && eventTrigger !== this._showTrigger) {\n                                return;\n                            }\n                            this._onDismiss();\n                        } else if (eventType === \"contextmenu\" || eventType === \"MSHoldVisual\") {\n                            event.preventDefault();\n                        }\n                    }\n                },\n\n                _onShowAnimationEnd: function () {\n                    if (this._shouldDismiss || this._disposed) {\n                        return;\n                    }\n                    this._raiseEvent(\"opened\");\n                    if (this._domElement) {\n                        if (this._hideDelay !== \"never\") {\n                            var that = this;\n                            var delay = this._infotip ? Math.min(3 * messageDuration, HIDE_DELAY_MAX) : messageDuration;\n                            this._hideDelayTimer = this._setTimeout(function () {\n                                that._onDismiss();\n                            }, delay);\n                        }\n                    }\n                },\n\n                _onHideAnimationEnd: function () {\n                    _Global.document.body.removeEventListener(\"DOMNodeRemoved\", this._removeTooltip, false);\n                    this._cleanUpDOM();\n                    // Once we remove the tooltip from the DOM, we should remove the aria tag from the anchor\n                    if (this._anchorElement) {\n                        this._anchorElement.removeAttribute(\"aria-describedby\");\n                    }\n                    lastCloseTime = (new Date()).getTime();\n                    this._triggerByOpen = false;\n                    if (!this._disposed) {\n                        this._raiseEvent(\"closed\");\n                    }\n                },\n\n                _decideOnDelay: function (type) {\n                    var value;\n                    this._useAnimation = true;\n\n                    if (type === \"nodelay\") {\n                        value = 0;\n                        this._useAnimation = false;\n                    } else {\n                        var curTime = (new Date()).getTime();\n                        // If the mouse is moved immediately from another anchor that has\n                        // tooltip open, we should use a shorter delay\n                        if (curTime - lastCloseTime <= RESHOW_THRESHOLD) {\n                            if (type === \"touch\") {\n                                value = this._infotip ? DELAY_RESHOW_INFOTIP_TOUCH : DELAY_RESHOW_NONINFOTIP_TOUCH;\n                            } else {\n                                value = this._infotip ? DELAY_RESHOW_INFOTIP_NONTOUCH : DELAY_RESHOW_NONINFOTIP_NONTOUCH;\n                            }\n                            this._useAnimation = false;\n                        } else if (type === \"touch\") {\n                            value = this._infotip ? DELAY_INITIAL_TOUCH_LONG : DELAY_INITIAL_TOUCH_SHORT;\n                        } else {\n                            value = this._infotip ? infoTooltipNonTouchShowDelay : nonInfoTooltipNonTouchShowDelay;\n                        }\n                    }\n                    return value;\n                },\n\n                // This function returns the anchor element's position in the Window coordinates.\n                _getAnchorPositionFromElementWindowCoord: function () {\n                    var rect = this._anchorElement.getBoundingClientRect();\n\n                    return {\n                        x: rect.left,\n                        y: rect.top,\n                        width: rect.width,\n                        height: rect.height\n                    };\n                },\n\n                _getAnchorPositionFromPointerWindowCoord: function (contactPoint) {\n                    return {\n                        x: contactPoint.x,\n                        y: contactPoint.y,\n                        width: 1,\n                        height: 1\n                    };\n                },\n\n                _canPositionOnSide: function (placement, viewport, anchor, tip) {\n                    var availWidth = 0, availHeight = 0;\n\n                    switch (placement) {\n                        case \"top\":\n                            availWidth = tip.width + this._offset;\n                            availHeight = anchor.y;\n                            break;\n                        case \"bottom\":\n                            availWidth = tip.width + this._offset;\n                            availHeight = viewport.height - anchor.y - anchor.height;\n                            break;\n                        case \"left\":\n                            availWidth = anchor.x;\n                            availHeight = tip.height + this._offset;\n                            break;\n                        case \"right\":\n                            availWidth = viewport.width - anchor.x - anchor.width;\n                            availHeight = tip.height + this._offset;\n                            break;\n                    }\n                    return ((availWidth >= tip.width + this._offset) && (availHeight >= tip.height + this._offset));\n                },\n\n                _positionOnSide: function (placement, viewport, anchor, tip) {\n                    var left = 0, top = 0;\n\n                    switch (placement) {\n                        case \"top\":\n                        case \"bottom\":\n                            // Align the tooltip to the anchor's center horizontally\n                            left = anchor.x + anchor.width / 2 - tip.width / 2;\n\n                            // If the left boundary is outside the window, set it to 0\n                            // If the right boundary is outside the window, set it to align with the window right boundary\n                            left = Math.min(Math.max(left, 0), viewport.width - tip.width - SAFETY_NET_GAP);\n\n                            top = (placement === \"top\") ? anchor.y - tip.height - this._offset : anchor.y + anchor.height + this._offset;\n                            break;\n                        case \"left\":\n                        case \"right\":\n                            // Align the tooltip to the anchor's center vertically\n                            top = anchor.y + anchor.height / 2 - tip.height / 2;\n\n                            // If the top boundary is outside the window, set it to 0\n                            // If the bottom boundary is outside the window, set it to align with the window bottom boundary\n                            top = Math.min(Math.max(top, 0), viewport.height - tip.height - SAFETY_NET_GAP);\n\n                            left = (placement === \"left\") ? anchor.x - tip.width - this._offset : anchor.x + anchor.width + this._offset;\n                            break;\n                    }\n\n                    // Actually set the position\n                    this._domElement.style.left = left + \"px\";\n                    this._domElement.style.top = top + \"px\";\n\n                    // Set the phantom's position and size\n                    this._phantomDiv.style.left = left + \"px\";\n                    this._phantomDiv.style.top = top + \"px\";\n                    this._phantomDiv.style.width = tip.width + \"px\";\n                    this._phantomDiv.style.height = tip.height + \"px\";\n                },\n\n                _position: function (contactType) {\n                    var viewport = { width: 0, height: 0 };\n                    var anchor = { x: 0, y: 0, width: 0, height: 0 };\n                    var tip = { width: 0, height: 0 };\n\n                    viewport.width = _Global.document.documentElement.clientWidth;\n                    viewport.height = _Global.document.documentElement.clientHeight;\n                    if (_Global.document.defaultView.getComputedStyle(_Global.document.body, null)[\"writing-mode\"] === \"tb-rl\") {\n                        viewport.width = _Global.document.documentElement.clientHeight;\n                        viewport.height = _Global.document.documentElement.clientWidth;\n                    }\n\n                    if (this._contactPoint && (contactType === \"touch\" || contactType === \"mouse\")) {\n                        anchor = this._getAnchorPositionFromPointerWindowCoord(this._contactPoint);\n                    } else {\n                        // keyboard or programmatic is relative to element\n                        anchor = this._getAnchorPositionFromElementWindowCoord();\n                    }\n                    tip.width = this._domElement.offsetWidth;\n                    tip.height = this._domElement.offsetHeight;\n                    var fallback_order = {\n                        \"top\": [\"top\", \"bottom\", \"left\", \"right\"],\n                        \"bottom\": [\"bottom\", \"top\", \"left\", \"right\"],\n                        \"left\": [\"left\", \"right\", \"top\", \"bottom\"],\n                        \"right\": [\"right\", \"left\", \"top\", \"bottom\"]\n                    };\n                    if (isLeftHanded) {\n                        fallback_order.top[2] = \"right\";\n                        fallback_order.top[3] = \"left\";\n                        fallback_order.bottom[2] = \"right\";\n                        fallback_order.bottom[3] = \"left\";\n                    }\n\n                    // Try to position the tooltip according to the placement preference\n                    // We use this order:\n                    // 1. Try the preferred placement\n                    // 2. Try the opposite placement\n                    // 3. If the preferred placement is top or bottom, we should try left\n                    // and right (or right and left if left handed)\n                    // If the preferred placement is left or right, we should try top and bottom\n                    var order = fallback_order[this._placement];\n                    var length = order.length;\n                    for (var i = 0; i < length; i++) {\n                        if (i === length - 1 || this._canPositionOnSide(order[i], viewport, anchor, tip)) {\n                            this._positionOnSide(order[i], viewport, anchor, tip);\n                            break;\n                        }\n                    }\n                    return order[i];\n                },\n\n                _showTooltip: function (contactType) {\n                    // Give a chance to dismiss the tooltip before it starts to show\n                    if (this._shouldDismiss) {\n                        return;\n                    }\n                    this._isShown = true;\n                    this._raiseEvent(\"beforeopen\");\n\n                    // If the anchor is not in the DOM tree, we don't create the tooltip\n                    if (!_Global.document.body.contains(this._anchorElement)) {\n                        return;\n                    }\n                    if (this._shouldDismiss) {\n                        return;\n                    }\n\n                    // If the contentElement is set to null or innerHTML set to null or \"\", we should NOT show the tooltip\n                    if (this._lastContentType === \"element\") { // Last update through contentElement option\n                        if (!this._contentElement) {\n                            this._isShown = false;\n                            return;\n                        }\n                    } else { // Last update through innerHTML option\n                        if (!this._innerHTML || this._innerHTML === \"\") {\n                            this._isShown = false;\n                            return;\n                        }\n                    }\n\n                    var that = this;\n                    this._removeTooltip = function (event) {\n                        var current = that._anchorElement;\n                        while (current) {\n                            if (event.target === current) {\n                                _Global.document.body.removeEventListener(\"DOMNodeRemoved\", that._removeTooltip, false);\n                                that._cleanUpDOM();\n                                break;\n                            }\n                            current = current.parentNode;\n                        }\n                    };\n\n                    _Global.document.body.addEventListener(\"DOMNodeRemoved\", this._removeTooltip, false);\n                    this._createTooltipDOM();\n                    this._position(contactType);\n                    if (this._useAnimation) {\n                        Animations.fadeIn(this._domElement)\n                            .then(this._onShowAnimationEnd.bind(this));\n                    } else {\n                        this._onShowAnimationEnd();\n                    }\n                },\n\n                _onInvoke: function (type, hide, event) {\n                    // Reset the dismiss flag\n                    this._shouldDismiss = false;\n\n                    // If the tooltip is already shown, ignore the current event\n                    if (this._isShown) {\n                        return;\n                    }\n\n                    // To handle keyboard support, we only want to display tooltip on the first tab key event only\n                    if (event && event.type === \"keyup\") {\n                        if (this._lastKeyOrBlurEvent === \"keyboard\" ||\n                            !this._lastKeyOrBlurEvent && event.keyCode !== Key.tab) {\n                            return;\n                        }\n                    }\n\n                    // Set the hide delay,\n                    this._hideDelay = hide;\n\n                    this._contactPoint = null;\n                    if (event) { // Open through interaction\n                        this._contactPoint = { x: event.clientX, y: event.clientY };\n                        // Tooltip display offset differently for touch events and non-touch events\n                        if (type === \"touch\") {\n                            this._offset = OFFSET_TOUCH;\n                        } else if (type === \"keyboard\") {\n                            this._offset = OFFSET_KEYBOARD;\n                        } else {\n                            this._offset = OFFSET_MOUSE;\n                        }\n                    } else { // Open Programmatically\n                        if (type === \"touch\") {\n                            this._offset = OFFSET_PROGRAMMATIC_TOUCH;\n                        } else {\n                            this._offset = OFFSET_PROGRAMMATIC_NONTOUCH;\n                        }\n                    }\n\n                    this._clearTimeout(this._delayTimer);\n                    this._clearTimeout(this._hideDelayTimer);\n\n                    // Set the delay time\n                    var delay = this._decideOnDelay(type);\n                    if (delay > 0) {\n                        var that = this;\n                        this._delayTimer = this._setTimeout(function () {\n                            that._showTooltip(type);\n                        }, delay);\n                    } else {\n                        this._showTooltip(type);\n                    }\n                },\n\n                _onDismiss: function () {\n                    // Set the dismiss flag so that we don't miss dismiss events\n                    this._shouldDismiss = true;\n\n                    // If the tooltip is already dismissed, ignore the current event\n                    if (!this._isShown) {\n                        return;\n                    }\n\n                    this._isShown = false;\n\n                    // Reset tooltip state\n                    this._showTrigger = \"mouse\";\n\n                    if (this._domElement) {\n                        this._raiseEvent(\"beforeclose\");\n                        if (this._useAnimation) {\n                            Animations.fadeOut(this._domElement)\n                                .then(this._onHideAnimationEnd.bind(this));\n                        } else {\n                            this._onHideAnimationEnd();\n                        }\n                    } else {\n                        this._raiseEvent(\"beforeclose\");\n                        this._raiseEvent(\"closed\");\n                    }\n                },\n\n                _setTimeout: function (callback, delay) {\n                    return _Global.setTimeout(callback, delay);\n                },\n\n                _clearTimeout: function (id) {\n                    _Global.clearTimeout(id);\n                }\n            }, {\n\n                _DELAY_INITIAL_TOUCH_SHORT: {\n                    get: function () { return DELAY_INITIAL_TOUCH_SHORT; },\n                },\n\n                _DELAY_INITIAL_TOUCH_LONG: {\n                    get: function () { return DELAY_INITIAL_TOUCH_LONG ; }\n                },\n\n                _DEFAULT_MOUSE_HOVER_TIME: {\n                    get: function () { return DEFAULT_MOUSE_HOVER_TIME; }\n                },\n\n                _DEFAULT_MESSAGE_DURATION: {\n                    get: function () { return DEFAULT_MESSAGE_DURATION; }\n                },\n\n                _DELAY_RESHOW_NONINFOTIP_TOUCH: {\n                    get: function () { return DELAY_RESHOW_NONINFOTIP_TOUCH; }\n                },\n\n                _DELAY_RESHOW_NONINFOTIP_NONTOUCH: {\n                    get: function () { return DELAY_RESHOW_NONINFOTIP_NONTOUCH; }\n                },\n\n                _DELAY_RESHOW_INFOTIP_TOUCH: {\n                    get: function () { return DELAY_RESHOW_INFOTIP_TOUCH; }\n                },\n\n                _DELAY_RESHOW_INFOTIP_NONTOUCH: {\n                    get: function () { return DELAY_RESHOW_INFOTIP_NONTOUCH; }\n                },\n\n                _RESHOW_THRESHOLD: {\n                    get: function () { return RESHOW_THRESHOLD; }\n                },\n\n                _HIDE_DELAY_MAX: {\n                    get: function () { return HIDE_DELAY_MAX; }\n                },\n            });\n        })\n    });\n\n});\n\ndefine('require-style!less/styles-rating',[],function(){});\n\ndefine('require-style!less/colors-rating',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Rating',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../_Accents',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_SafeHtml',\n    './Tooltip',\n    'require-style!less/styles-rating',\n    'require-style!less/colors-rating'\n], function ratingInit(_Global, _Base, _ErrorFromName, _Events, _Resources, _Accents, _Control, _ElementUtilities, _Hoverable, _SafeHtml, Tooltip) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\".win-rating .win-star.win-user.win-full, .win-rating .win-star.win-user.win-full.win-disabled\", [{ name: \"color\", value: _Accents.ColorTypes.accent }]);\n\n    // Rating control implementation\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Rating\">\n        /// The Rating control allows users to give a number on a scale of 1 to maxRating (5 is the default).\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.rating.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.rating.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.Rating\"></div>]]></htmlSnippet>\n        /// <event name=\"previewchange\" bubbles=\"false\" locid=\"WinJS.UI.Rating_e:previewchange\">Raised when the user chooses a new tentative rating but hasn't commited the change.</event>\n        /// <event name=\"cancel\" bubbles=\"false\" locid=\"WinJS.UI.Rating_e:cancel\">Raised when the user finishes interacting with the rating control without committing a tentative rating.</event>\n        /// <event name=\"change\" bubbles=\"false\" locid=\"WinJS.UI.Rating_e:change\">Raised when the user commits a change to the userRating.</event>\n        /// <part name=\"rating\" class=\"win-rating\" locid=\"WinJS.UI.Rating_part:rating\">The entire Rating control.</part>\n        /// <part name=\"average-empty\" class=\"win-star win-average win-empty\" locid=\"WinJS.UI.Rating_part:average-empty\">The empty star when the Rating control shows the average rating.</part>\n        /// <part name=\"average-full\" class=\"win-star win-average win-full\" locid=\"WinJS.UI.Rating_part:average-full\">The full star when the Rating control shows the average rating.</part>\n        /// <part name=\"user-empty\" class=\"win-star win-user win-empty\" locid=\"WinJS.UI.Rating_part:user-empty\">The empty star when the Rating control shows the user rating.</part>\n        /// <part name=\"user-full\" class=\"win-star win-user win-full\" locid=\"WinJS.UI.Rating_part:user-full\">The full star when the Rating control shows the user rating.</part>\n        /// <part name=\"tentative-empty\" class=\"win-star win-tentative win-empty\" locid=\"WinJS.UI.Rating_part:tentative-empty\">The empty star when the Rating control shows the tentative rating.</part>\n        /// <part name=\"tentative-full\" class=\"win-star win-tentative win-full\" locid=\"WinJS.UI.Rating_part:tentative-full\">The full star when the Rating control shows the tentative rating.</part>\n        /// <part name=\"disabled-empty\" class=\"win-star win-disabled win-empty\" locid=\"WinJS.UI.Rating_part:disabled-empty\">The empty star when the control is disabled.</part>\n        /// <part name=\"disabled-full\" class=\"win-star win-disabled win-full\" locid=\"WinJS.UI.Rating_part:disabled-full\">The full star when the control is disabled.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Rating: _Base.Namespace._lazy(function () {\n            var createEvent = _Events._createEventProperty;\n\n            var strings = {\n                get averageRating() { return _Resources._getWinJSString(\"ui/averageRating\").value; },\n                get clearYourRating() { return _Resources._getWinJSString(\"ui/clearYourRating\").value; },\n                get tentativeRating() { return _Resources._getWinJSString(\"ui/tentativeRating\").value; },\n                get tooltipStringsIsInvalid() { return \"Invalid argument: tooltipStrings must be null or an array of strings.\"; },\n                get unrated() { return _Resources._getWinJSString(\"ui/unrated\").value; },\n                get userRating() { return _Resources._getWinJSString(\"ui/userRating\").value; },\n            };\n\n            // Constants definition\n            var DEFAULT_MAX_RATING = 5,\n                DEFAULT_DISABLED = false,\n                CANCEL = \"cancel\",\n                CHANGE = \"change\",\n                PREVIEW_CHANGE = \"previewchange\",\n                MOUSE_LBUTTON = 0, // Event attribute to indicate a mouse left click\n                PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\", // Pointer type to indicate a touch event\n                PT_PEN = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_PEN || \"pen\", // Pointer type to indicate a pen event\n                PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || \"mouse\"; // Pointer type to indicate a mouse event\n\n            var hiddenAverageRatingCss = \"padding-left: 0px; padding-right: 0px; border-left: 0px; border-right: 0px; -ms-flex: none; -webkit-flex: none; flex: none; display: none\";\n\n            // CSS class names\n            var msRating = \"win-rating\",\n                msRatingEmpty = \"win-star win-empty\",\n                msRatingAverageEmpty = \"win-star win-average win-empty\",\n                msRatingAverageFull = \"win-star win-average win-full\",\n                msRatingUserEmpty = \"win-star win-user win-empty\",\n                msRatingUserFull = \"win-star win-user win-full\",\n                msRatingTentativeEmpty = \"win-star win-tentative win-empty\",\n                msRatingTentativeFull = \"win-star win-tentative win-full\",\n                msRatingDisabled = \"win-disabled\",\n                msAverage = \"win-average\",\n                msUser = \"win-user\";\n\n            return _Base.Class.define(function Rating_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Rating.Rating\">\n                /// <summary locid=\"WinJS.UI.Rating.constructor\">\n                /// Creates a new Rating.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.Rating.constructor_p:element\">\n                /// The DOM element that hosts the new Rating.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.Rating.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the cancel event,\n                /// add a property named \"oncancel\" to the options object and set its value to the event handler.\n                /// This parameter is optional.\n                /// </param>\n                /// <returns type=\"WinJS.UI.Rating\" locid=\"WinJS.UI.Rating.constructor_returnValue\">\n                /// The new Rating.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n                this._disposed = false;\n\n                element = element || _Global.document.createElement(\"div\");\n                options = options || {};\n                this._element = element;\n                _ElementUtilities.addClass(this._element, \"win-disposable\");\n\n                //initialize properties with default value\n                this._userRating = 0;\n                this._averageRating = 0;\n                this._disabled = DEFAULT_DISABLED;\n                this._enableClear = true;\n                this._tooltipStrings = [];\n\n                this._controlUpdateNeeded = false;\n                this._setControlSize(options.maxRating);\n                if (!options.tooltipStrings) {\n                    this._updateTooltips(null);\n                }\n                _Control.setOptions(this, options);\n                this._controlUpdateNeeded = true;\n                this._forceLayout();\n\n                // Register for notification when we are added to DOM\n                _ElementUtilities._addInsertedNotifier(this._element);\n\n                // Remember ourselves\n                element.winControl = this;\n                this._events();\n            }, {\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.Rating.maxRating\" helpKeyword=\"WinJS.UI.Rating.maxRating\">\n                /// Gets or sets the maximum possible rating value. The default is 5.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                maxRating: {\n                    get: function () {\n                        return this._maxRating;\n                    },\n                    set: function (value) {\n                        this._setControlSize(value);\n                        this._forceLayout();\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.Rating.userRating\" helpKeyword=\"WinJS.UI.Rating.userRating\">\n                /// Gets or sets the user's rating. This value must be between greater than or equal to zero and less than or equal to the maxRating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                userRating: {\n                    get: function () {\n                        return this._userRating;\n                    },\n                    set: function (value) {\n                        // Coerce value to a positive integer between 0 and maxRating\n                        this._userRating = Math.max(0, Math.min(Number(value) >> 0, this._maxRating));\n                        this._updateControl();\n                    }\n                },\n\n                /// <field type=\"Number\" locid=\"WinJS.UI.Rating.averageRating\" helpKeyword=\"WinJS.UI.Rating.averageRating\">\n                /// Gets or sets the average rating as a float value. This value must be [equal to zero] OR [greater than or equal to 1 AND less than or equal to the maxRating].\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                averageRating: {\n                    get: function () {\n                        return this._averageRating;\n                    },\n                    set: function (value) {\n                        // Coerce value to either 0 or a positive float between 1 and maxRating\n                        this._averageRating = (Number(value) < 1) ? 0 : Math.min(Number(value) || 0, this._maxRating);\n                        if (this._averageRatingElement) { // After the control has been created..\n                            this._ensureAverageMSStarRating(); // ..ensure correct msStarRating is given to 'average-rating' star.\n                        }\n                        this._updateControl();\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.Rating.disabled\" helpKeyword=\"WinJS.UI.Rating.disabled\">\n                /// Gets or sets a value that specifies whether the control is disabled. When the control is disabled, the user can't specify a\n                /// new rating or modify an existing rating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                disabled: {\n                    get: function () {\n                        return this._disabled;\n                    },\n                    set: function (value) {\n                        this._disabled = !!value;\n                        if (this._disabled) {\n                            this._clearTooltips();\n                        }\n                        this._updateTabIndex();\n                        this._updateControl();\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.Rating.enableClear\" helpKeyword=\"WinJS.UI.Rating.enableClear\">\n                /// Gets or sets whether the control lets the user clear the rating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                enableClear: {\n                    get: function () {\n                        return this._enableClear;\n                    },\n                    set: function (value) {\n                        this._enableClear = !!value;\n                        this._setAriaValueMin();\n                        this._updateControl();\n                    }\n                },\n\n                /// <field type=\"Array\" locid=\"WinJS.UI.Rating.tooltipStrings\" helpKeyword=\"WinJS.UI.Rating.tooltipStrings\">\n                /// Gets or sets a set of descriptions to show for rating values in the tooltip. The array must\n                /// contain a string for each available rating value, and it can contain an optional string\n                /// (at the end of the array) for the clear rating option.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                tooltipStrings: {\n                    get: function () {\n                        return this._tooltipStrings;\n                    },\n                    set: function (value) {\n                        if (typeof value !== \"object\") {\n                            throw new _ErrorFromName(\"WinJS.UI.Rating.TooltipStringsIsInvalid\", strings.tooltipStringsIsInvalid);\n                        }\n                        this._updateTooltips(value);\n                        this._updateAccessibilityRestState();\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.Rating.element\" helpKeyword=\"WinJS.UI.Rating.element\">\n                /// Gets the DOM element that hosts the Rating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Rating.oncancel\" helpKeyword=\"WinJS.UI.Rating.oncancel\">\n                /// Raised when the user finishes interacting with the rating control without committing a tentative rating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                oncancel: createEvent(CANCEL),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Rating.onchange\" helpKeyword=\"WinJS.UI.Rating.onchange\">\n                /// Raised when the user commits a change to the userRating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onchange: createEvent(CHANGE),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Rating.onpreviewchange\" helpKeyword=\"WinJS.UI.Rating.onpreviewchange\">\n                /// Raised when the user is choosing a new tentative Rating.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onpreviewchange: createEvent(PREVIEW_CHANGE),\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.Rating.dispose\">\n                    /// <summary locid=\"WinJS.UI.Rating.dispose\">\n                    /// Disposes this Rating.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    for (var i = 0; i < this._toolTips.length; i++) {\n                        this._toolTips[i].dispose();\n                    }\n                    this._toolTips = null;\n                },\n\n                addEventListener: function (eventName, eventCallBack, capture) {\n                    /// <signature helpKeyword=\"WinJS.UI.Rating.addEventListener\">\n                    /// <summary locid=\"WinJS.UI.Rating.addEventListener\">\n                    /// Registers an event handler for the specified event.\n                    /// </summary>\n                    /// <param name=\"eventName\" type=\"String\" locid=\"WinJS.UI.Rating.addEventListener_p:eventName\">The name of the event.</param>\n                    /// <param name=\"eventCallback\" type=\"Function\" locid=\"WinJS.UI.Rating.addEventListener_p:eventCallback\">The event handler function to associate with this event.</param>\n                    /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.UI.Rating.addEventListener_p:capture\">Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase.</param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n\n                    this._element.addEventListener(eventName, eventCallBack, capture);\n                },\n\n                removeEventListener: function (eventName, eventCallBack, capture) {\n                    /// <signature helpKeyword=\"WinJS.UI.Rating.removeEventListener\">\n                    /// <summary locid=\"WinJS.UI.Rating.removeEventListener\">\n                    /// Unregisters an event handler for the specified event.\n                    /// </summary>\n                    /// <param name=\"eventName\" type=\"String\" locid=\"WinJS.UI.Rating.removeEventListener_p:eventName\">The name of the event.</param>\n                    /// <param name=\"eventCallback\" type=\"Function\" locid=\"WinJS.UI.Rating.removeEventListener_p:eventCallback\">The event handler function to remove.</param>\n                    /// <param name=\"capture\" type=\"Boolean\" locid=\"WinJS.UI.Rating.removeEventListener_p:capture\">Set to true to unregister the event handler for the capturing phase; otherwise, set to false to unregister the event handler for the bubbling phase.</param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n\n                    return this._element.removeEventListener(eventName, eventCallBack, capture);\n                },\n\n                _forceLayout: function () {\n                    if (!this._controlUpdateNeeded) {\n                        return;\n                    }\n\n                    // Disable incremental update during redraw, postpone till all properties set\n                    var updateNeeded = false;\n                    this._updateControl = function () {\n                        updateNeeded = true;\n                    };\n\n                    // Coerce userRating and averageRating to conform to maxRating\n                    this.userRating = this._userRating;\n                    this.averageRating = this._averageRating;\n\n                    // Reset properties\n                    this._lastEventWasChange = false;\n                    this._lastEventWasCancel = false;\n                    this._tentativeRating = -1;\n                    this._captured = false;\n                    this._pointerDownFocus = false;\n                    this._elements = [];\n                    this._toolTips = [];\n                    this._clearElement = null;\n\n                    // Element that is used for showing average rating\n                    this._averageRatingElement = null;\n                    this._elementWidth = null;\n                    this._elementPadding = null;\n                    this._elementBorder = null;\n                    this._floatingValue = 0;\n\n                    this._createControl();\n                    this._setAccessibilityProperties();\n\n                    delete this._updateControl;\n                    if (updateNeeded) {\n                        this._updateControl();\n                    }\n\n                },\n\n                // Hide the help star if the control is not showing average rating\n                _hideAverageRating: function () {\n                    if (!this._averageRatingHidden) {\n                        this._averageRatingHidden = true;\n                        this._averageRatingElement.style.cssText = hiddenAverageRatingCss;\n                    }\n                },\n\n                _createControl: function () {\n                    // rating control could have more than one class name\n                    _ElementUtilities.addClass(this._element, msRating);\n\n                    var html = \"\";\n                    this._averageRatingHidden = true;\n                    // create control\n                    for (var i = 0; i <= this._maxRating; i++) {\n                        if (i === this._maxRating) {\n                            html = html + \"<div class='\" + msRatingAverageFull + \"' style='\" + hiddenAverageRatingCss + \"'></div>\";\n                        } else {\n                            html = html + \"<div class='\" + msRatingUserEmpty + \"'></div>\";\n                        }\n                    }\n                    _SafeHtml.setInnerHTMLUnsafe(this._element, html);\n                    var oneStar = this._element.firstElementChild;\n                    var i = 0;\n                    while (oneStar) {\n                        this._elements[i] = oneStar;\n                        if (i < this._maxRating) {\n                            _ElementUtilities.data(oneStar).msStarRating = i + 1;\n                        }\n                        oneStar = oneStar.nextElementSibling;\n                        i++;\n                    }\n                    this._averageRatingElement = this._elements[this._maxRating];\n                    this._ensureAverageMSStarRating();\n\n                    // add focus capability relative to element's position in the document\n                    this._updateTabIndex();\n                },\n\n                _setAriaValueMin: function () {\n                    this._element.setAttribute(\"aria-valuemin\", this._enableClear ? 0 : 1);\n                },\n\n                _setAccessibilityProperties: function () {\n                    this._element.setAttribute(\"role\", \"slider\");\n                    this._element.setAttribute(\"aria-valuemax\", this._maxRating);\n                    this._setAriaValueMin();\n                    this._updateAccessibilityRestState();\n                },\n\n                _getText: function (number) {\n                    var string = this._tooltipStrings[number];\n                    if (string) {\n                        var tempDiv = _Global.document.createElement(\"div\");\n                        tempDiv.innerHTML = string;\n                        return tempDiv.textContent;\n                    } else if (number === this._maxRating) {\n                        return strings.clearYourRating;\n                    } else {\n                        return number + 1;\n                    }\n                },\n\n                _updateAccessibilityRestState: function () {\n                    var element = this._element;\n                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.disconnect();\n                    element.setAttribute(\"aria-readOnly\", this._disabled);\n\n                    if (this._userRating !== 0) {\n                        element.setAttribute(\"aria-valuenow\", this._userRating);\n                        element.setAttribute(\"aria-label\", strings.userRating);\n                        element.setAttribute(\"aria-valuetext\", this._getText(this._userRating - 1));\n                    } else if (this._averageRating !== 0) {\n                        element.setAttribute(\"aria-valuenow\", this._averageRating);\n                        element.setAttribute(\"aria-label\", strings.averageRating);\n                        element.setAttribute(\"aria-valuetext\", this._averageRating);\n                    } else {\n                        element.setAttribute(\"aria-valuenow\", strings.unrated);\n                        element.setAttribute(\"aria-label\", strings.userRating);\n                        element.setAttribute(\"aria-valuetext\", strings.unrated);\n                    }\n\n                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.observe(this._element, { attributes: true, attributeFilter: [\"aria-valuenow\"] });\n                },\n\n                _updateAccessibilityHoverState: function () {\n                    var element = this._element;\n                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.disconnect();\n                    element.setAttribute(\"aria-readOnly\", this._disabled);\n\n                    if (this._tentativeRating > 0) {\n                        element.setAttribute(\"aria-label\", strings.tentativeRating);\n                        element.setAttribute(\"aria-valuenow\", this._tentativeRating);\n                        element.setAttribute(\"aria-valuetext\", this._getText(this._tentativeRating - 1));\n                    } else if (this._tentativeRating === 0) {\n                        element.setAttribute(\"aria-valuenow\", strings.unrated);\n                        element.setAttribute(\"aria-label\", strings.tentativeRating);\n                        element.setAttribute(\"aria-valuetext\", this._getText(this._maxRating));\n                    } else {\n                        //shouldn't get here\n                        element.setAttribute(\"aria-valuenow\", strings.unrated);\n                        element.setAttribute(\"aria-label\", strings.tentativeRating);\n                        element.setAttribute(\"aria-valuetext\", strings.unrated);\n                    }\n\n                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.observe(this._element, { attributes: true, attributeFilter: [\"aria-valuenow\"] });\n                },\n\n                _ensureTooltips: function () {\n                    if (this.disabled) {\n                        return;\n                    }\n\n                    if (this._toolTips.length === 0) {\n                        for (var i = 0; i < this._maxRating; i++) {\n                            this._toolTips[i] = new Tooltip.Tooltip(this._elements[i]);\n                        }\n                    }\n                },\n\n                // decrement tentative rating by one\n                _decrementRating: function () {\n                    this._closeTooltip();\n                    var firePreviewChange = true;\n                    if ((this._tentativeRating === 0) || ((this._tentativeRating === -1) && (this._userRating === 0))) {\n                        firePreviewChange = false;\n                    } else {\n                        if (this._tentativeRating > 0) {\n                            this._tentativeRating--;\n                        } else if (this._tentativeRating === -1) {\n                            if (this._userRating !== 0) {\n                                if (this._userRating > 0) {\n                                    this._tentativeRating = this._userRating - 1;\n                                } else {\n                                    this._tentativeRating = 0;\n                                }\n                            } else {\n                                this._tentativeRating = 0;\n                            }\n                        }\n\n                        if ((this._tentativeRating === 0) && !this._enableClear) {\n                            this._tentativeRating = 1;\n                            firePreviewChange = false;\n                        }\n                    }\n\n                    this._showTentativeRating(firePreviewChange, \"keyboard\");\n                },\n\n                _events: function () {\n                    var that = this;\n                    function ratingHandler(eventName) {\n                        return {\n                            name: eventName,\n                            lowerCaseName: eventName.toLowerCase(),\n                            handler: function (event) {\n                                var fn = that[\"_on\" + eventName];\n                                if (fn) {\n                                    fn.apply(that, [event]);\n                                }\n                            }\n                        };\n                    }\n\n                    var eventsRegisteredInLowerCase = [\n                            ratingHandler(\"KeyDown\"),\n                            ratingHandler(\"FocusOut\"),\n                            ratingHandler(\"FocusIn\"),\n                            ratingHandler(\"PointerCancel\"),\n                            ratingHandler(\"PointerDown\"),\n                            ratingHandler(\"PointerMove\"),\n                            ratingHandler(\"PointerOver\"),\n                            ratingHandler(\"PointerUp\"),\n                            ratingHandler(\"PointerOut\")\n                    ];\n                    var events = [\n                        ratingHandler(\"WinJSNodeInserted\")\n                    ];\n\n                    var i;\n                    for (i = 0; i < eventsRegisteredInLowerCase.length; ++i) {\n                        _ElementUtilities._addEventListener(this._element, eventsRegisteredInLowerCase[i].lowerCaseName, eventsRegisteredInLowerCase[i].handler, false);\n                    }\n                    for (i = 0; i < events.length; ++i) {\n                        this._element.addEventListener(events[i].name, events[i].handler, false);\n                    }\n\n                    this._ariaValueNowMutationObserver = new _ElementUtilities._MutationObserver(this._ariaValueNowChanged.bind(this));\n                    this._ariaValueNowMutationObserver.observe(this._element, { attributes: true, attributeFilter: [\"aria-valuenow\"] });\n                },\n\n                _onWinJSNodeInserted: function () {\n                    this._recalculateStarProperties();\n                    this._updateControl();\n                },\n\n                _recalculateStarProperties: function () {\n                    var j = 0;\n                    // If the average rating is 1 we do not have correct padding on the first star so we are reading it from the second star\n                    // When we create average rating star we are creating it from 2 divs - stars. The first one is the average rating star the second one is the regular rating star.\n                    // If the average rating is 1 we are creating that rating on the following way - The first part of star\n                    // (without right padding, right border) is average rating star - the second part is regular star that does not have left padding and left border anymore\n                    // (we set on 0 to create average rating star). In that situation the average rating star has correct left padding and left border.\n                    if (this._averageRating === 1) {\n                        j = 1;\n                    }\n                    var style = _Global.getComputedStyle(this._elements[j]);\n                    this._elementWidth = style.width;\n                    if (_Global.getComputedStyle(this._element).direction === \"rtl\") {\n                        this._elementPadding = style.paddingRight;\n                        this._elementBorder = style.borderRight;\n                    } else {\n                        this._elementPadding = style.paddingLeft;\n                        this._elementBorder = style.borderLeft;\n                    }\n                },\n\n                // Hide the help star if the control is not showing average rating\n                _hideAverageStar: function () {\n                    // check if this average rating control\n                    if (this._averageRating !== 0) {\n                        // hide the empty star\n                        this._resetAverageStar(false);\n                    }\n                },\n\n                // increase tentative rating by one\n                _incrementRating: function () {\n                    this._closeTooltip();\n                    var firePreviewChange = true;\n                    if ((this._tentativeRating === this._maxRating) || ((this._tentativeRating === -1) && (this._userRating === this._maxRating))) {\n                        firePreviewChange = false;\n                    }\n\n                    if (this._tentativeRating !== -1) {\n                        if (this._tentativeRating < this._maxRating) {\n                            this._tentativeRating++;\n                        }\n                    } else {\n                        if (this._userRating !== 0) {\n                            if (this._userRating < this._maxRating) {\n                                this._tentativeRating = this._userRating + 1;\n                            } else {\n                                this._tentativeRating = this._maxRating;\n                            }\n                        } else {\n                            this._tentativeRating = 1;\n                        }\n                    }\n                    this._showTentativeRating(firePreviewChange, \"keyboard\");\n                },\n\n                _ariaValueNowChanged: function () {\n                    if (!this._disabled) {\n                        var attrNode = this._element.getAttributeNode(\"aria-valuenow\");\n                        if (attrNode !== null) {\n                            var value = Number(attrNode.nodeValue);\n                            if (this.userRating !== value) {\n                                this.userRating = value;\n                                this._tentativeRating = this._userRating;\n                                this._raiseEvent(CHANGE, this._userRating);\n                            }\n                        }\n                    }\n                },\n\n                _onPointerCancel: function () {\n                    this._showCurrentRating();\n                    if (!this._lastEventWasChange) {\n                        this._raiseEvent(CANCEL, null);\n                    }\n                    this._captured = false;\n                },\n\n                _onPointerDown: function (eventObject) {\n                    if (eventObject.pointerType === PT_MOUSE && eventObject.button !== MOUSE_LBUTTON) {\n                        return; // Ignore any mouse clicks that are not left clicks.\n                    }\n                    if (!this._captured) { // Rating Control does not support multi-touch, ignore mspointerdown messages if the control already has capture.\n                        this._pointerDownAt = { x: eventObject.clientX, y: eventObject.clientY };\n                        this._pointerDownFocus = true;\n                        if (!this._disabled) {\n                            // Only capture the event when active to support block panning\n                            _ElementUtilities._setPointerCapture(this._element, eventObject.pointerId);\n                            this._captured = true;\n\n                            if (eventObject.pointerType === PT_TOUCH) {\n                                this._tentativeRating = _ElementUtilities.data(eventObject.target).msStarRating || 0;\n                                // change states for all stars\n                                this._setStarClasses(msRatingTentativeFull, this._tentativeRating, msRatingTentativeEmpty);\n                                this._hideAverageStar();\n                                this._updateAccessibilityHoverState();\n                                this._openTooltip(\"touch\");\n                                this._raiseEvent(PREVIEW_CHANGE, this._tentativeRating);\n                            } else {\n                                this._openTooltip(\"mousedown\");\n                            }\n                        }\n                    }\n                },\n\n                _onCapturedPointerMove: function (eventObject, tooltipType) {\n                    // Manual hit-test because we capture the pointer\n                    // If the pointer is already down, we use its information.\n                    var pointerAt = this._pointerDownAt || { x: eventObject.clientX, y: eventObject.clientY };\n\n                    var star;\n                    var hit = _ElementUtilities._elementsFromPoint(eventObject.clientX, pointerAt.y);\n                    if (hit) {\n                        for (var i = 0, len = hit.length; i < len; i++) {\n                            var item = hit[i];\n                            if (item.getAttribute(\"role\") === \"tooltip\") {\n                                return;\n                            }\n                            if (_ElementUtilities.hasClass(item, \"win-star\")) {\n                                star = item;\n                                break;\n                            }\n                        }\n                    }\n                    var starNum;\n                    if (star && (star.parentElement === this._element)) {\n                        starNum = _ElementUtilities.data(star).msStarRating || 0;\n                    } else {\n                        var left = 0, right = this.maxRating;\n                        if (_Global.getComputedStyle(this._element).direction === \"rtl\") {\n                            left = right;\n                            right = 0;\n                        }\n                        if (eventObject.clientX < pointerAt.x) {\n                            starNum = left;\n                        } else {\n                            starNum = right;\n                        }\n                    }\n\n                    var firePreviewChange = false;\n                    var newTentativeRating = Math.min(Math.ceil(starNum), this._maxRating);\n                    if ((newTentativeRating === 0) && !this._enableClear) {\n                        newTentativeRating = 1;\n                    }\n                    if (newTentativeRating !== this._tentativeRating) {\n                        this._closeTooltip();\n                        firePreviewChange = true;\n                    }\n\n                    this._tentativeRating = newTentativeRating;\n                    this._showTentativeRating(firePreviewChange, tooltipType);\n                    eventObject.preventDefault();\n                },\n\n                _onPointerMove: function (eventObject) {\n                    if (this._captured) {\n                        if (eventObject.pointerType === PT_TOUCH) {\n                            this._onCapturedPointerMove(eventObject, \"touch\");\n                        } else {\n                            this._onCapturedPointerMove(eventObject, \"mousedown\");\n                        }\n                    }\n                },\n\n                _onPointerOver: function (eventObject) {\n                    if (!this._disabled && (eventObject.pointerType === PT_PEN || eventObject.pointerType === PT_MOUSE)) {\n                        this._onCapturedPointerMove(eventObject, \"mouseover\");\n                    }\n                },\n\n                _onPointerUp: function (eventObject) {\n                    if (this._captured) {\n                        _ElementUtilities._releasePointerCapture(this._element, eventObject.pointerId);\n                        this._captured = false;\n                        this._onUserRatingChanged();\n                    }\n                    this._pointerDownAt = null;\n                },\n\n                _onFocusOut: function () {\n                    if (!this._captured) {\n                        this._onUserRatingChanged();\n                        if (!this._lastEventWasChange && !this._lastEventWasCancel) {\n                            this._raiseEvent(CANCEL, null);\n                        }\n                    }\n                },\n\n                _onFocusIn: function () {\n                    if (!this._pointerDownFocus) {\n                        // if the control is read only don't hover stars\n                        if (!this._disabled) {\n                            // change states for all previous stars\n                            // but only if user didnt vote\n                            if (this._userRating === 0) {\n                                for (var i = 0; i < this._maxRating; i++) {\n                                    this._elements[i].className = msRatingTentativeEmpty;\n                                }\n                            }\n                            // hide the help star\n                            this._hideAverageStar();\n                        }\n\n                        if (this._userRating !== 0) {\n                            this._raiseEvent(PREVIEW_CHANGE, this._userRating);\n                        } else {\n                            this._raiseEvent(PREVIEW_CHANGE, 0);\n                        }\n                        this._tentativeRating = this._userRating;\n                    }\n                    this._pointerDownFocus = false;\n                },\n\n                _onKeyDown: function (eventObject) {\n                    var Key = _ElementUtilities.Key;\n                    var keyCode = eventObject.keyCode;\n                    var rtlString = _Global.getComputedStyle(this._element).direction;\n                    var handled = true;\n                    switch (keyCode) {\n                        case Key.enter: // Enter\n                            this._onUserRatingChanged();\n                            break;\n                        case Key.tab: //Tab\n                            this._onUserRatingChanged();\n                            handled = false;\n                            break;\n                        case Key.escape: // escape\n                            this._showCurrentRating();\n\n                            if (!this._lastEventWasChange) {\n                                this._raiseEvent(CANCEL, null);\n                            }\n\n                            break;\n                        case Key.leftArrow: // Arrow Left\n                            if (rtlString === \"rtl\" && this.userRating < this.maxRating - 1) {\n                                this._incrementRating();\n                            } else if (rtlString !== \"rtl\" && this.userRating > 0) {\n                                this._decrementRating();\n                            } else {\n                                handled = false;\n                            }\n                            break;\n                        case Key.upArrow: // Arrow Up\n                            if (this.userRating < this.maxRating - 1) {\n                                this._incrementRating();\n                            } else {\n                                handled = false;\n                            }\n                            break;\n                        case Key.rightArrow: // Arrow Right\n                            if (rtlString === \"rtl\" && this.userRating > 0) {\n                                this._decrementRating();\n                            } else if (rtlString !== \"rtl\" && this.userRating < this.maxRating - 1) {\n                                this._incrementRating();\n                            } else {\n                                handled = false;\n                            }\n                            break;\n                        case Key.downArrow: // Arrow Down\n                            if (this.userRating > 0) {\n                                this._decrementRating();\n                            } else {\n                                handled = false;\n                            }\n                            break;\n                        default:\n                            var number = 0;\n                            if ((keyCode >= Key.num0) && (keyCode <= Key.num9)) {\n                                number = Key.num0;\n                            } else if ((keyCode >= Key.numPad0) && (keyCode <= Key.numPad9)) {\n                                number = Key.numPad0;\n                            }\n\n                            if (number > 0) {\n                                var firePreviewChange = false;\n                                var newTentativeRating = Math.min(keyCode - number, this._maxRating);\n                                if ((newTentativeRating === 0) && !this._enableClear) {\n                                    newTentativeRating = 1;\n                                }\n                                if (newTentativeRating !== this._tentativeRating) {\n                                    this._closeTooltip();\n                                    firePreviewChange = true;\n                                }\n                                this._tentativeRating = newTentativeRating;\n                                this._showTentativeRating(firePreviewChange, \"keyboard\");\n                            } else {\n                                handled = false;\n                            }\n                            break;\n                    }\n\n                    if (handled) {\n                        eventObject.stopPropagation();\n                        eventObject.preventDefault();\n                    }\n                },\n\n                _onPointerOut: function (eventObject) {\n                    if (!this._captured && !_ElementUtilities.eventWithinElement(this._element, eventObject)) {\n                        this._showCurrentRating();\n                        if (!this._lastEventWasChange) {\n                            // only fire cancel event if we move out of the rating control, and if\n                            // user did not change rating on the control\n                            this._raiseEvent(CANCEL, null);\n                        }\n                    }\n                },\n\n                _onUserRatingChanged: function () {\n                    if (!this._disabled) {\n                        this._closeTooltip();\n                        // Only submit a change event if the user has altered the rating control value via PREVIEWCHANGE event.\n                        if (this._userRating !== this._tentativeRating && !this._lastEventWasCancel && !this._lastEventWasChange) {\n                            this.userRating = this._tentativeRating;\n                            this._raiseEvent(CHANGE, this._userRating);\n                        } else {\n                            this._updateControl();\n                        }\n                    }\n                },\n\n                _raiseEvent: function (eventName, tentativeRating) {\n                    if (!this._disabled) {\n                        this._lastEventWasChange = (eventName === CHANGE);\n                        this._lastEventWasCancel = (eventName === CANCEL);\n                        if (_Global.document.createEvent) {\n                            var event = _Global.document.createEvent(\"CustomEvent\");\n                            event.initCustomEvent(eventName, false, false, { tentativeRating: tentativeRating });\n                            this._element.dispatchEvent(event);\n                        }\n                    }\n                },\n\n                _resetNextElement: function (prevState) {\n                    if (this._averageRatingElement.nextSibling !== null) {\n                        _ElementUtilities._setFlexStyle(this._averageRatingElement.nextSibling, { grow: 1, shrink: 1 });\n                        var style = this._averageRatingElement.nextSibling.style;\n                        var direction = _Global.getComputedStyle(this._element).direction;\n                        if (prevState) {\n                            if (direction === \"rtl\") {\n                                direction = \"ltr\";\n                            } else {\n                                direction = \"rtl\";\n                            }\n                        }\n                        if (direction === \"rtl\") {\n                            style.paddingRight = this._elementPadding;\n                            style.borderRight = this._elementBorder;\n                            style.direction = \"rtl\";\n                        } else {\n                            style.paddingLeft = this._elementPadding;\n                            style.borderLeft = this._elementBorder;\n                            style.direction = \"ltr\";\n                        }\n                        style.backgroundPosition = \"left\";\n                        style.backgroundSize = \"100% 100%\";\n                        style.width = this._resizeStringValue(this._elementWidth, 1, style.width);\n                    }\n                },\n\n                _resetAverageStar: function (prevState) {\n                    this._resetNextElement(prevState);\n                    this._hideAverageRating();\n                },\n\n                _resizeStringValue: function (string, factor, curString) {\n                    var number = parseFloat(string);\n                    if (isNaN(number)) {\n                        if (curString !== null) {\n                            return curString;\n                        } else {\n                            return string;\n                        }\n                    }\n                    var unit = string.substring(number.toString(10).length);\n                    number = number * factor;\n                    return (number + unit);\n                },\n\n                _setControlSize: function (value) {\n                    // Coerce value to a positive integer between 0 and maxRating\n                    // if negative default to DEFAULT_MAX_RATING\n                    var maxRating = (Number(value) || DEFAULT_MAX_RATING) >> 0;\n                    this._maxRating = maxRating > 0 ? maxRating : DEFAULT_MAX_RATING;\n                },\n\n                _updateTooltips: function (value) {\n                    var i, max = 0;\n                    if (value !== null) {\n                        max = ((value.length <= this._maxRating + 1) ? value.length : this._maxRating + 1);\n                        for (i = 0; i < max; i++) {\n                            this._tooltipStrings[i] = value[i];\n                        }\n                    } else {\n                        for (i = 0; i < this._maxRating; i++) {\n                            this._tooltipStrings[i] = i + 1;\n                        }\n                        this._tooltipStrings[this._maxRating] = strings.clearYourRating;\n                    }\n                },\n\n                _updateTabIndex: function () {\n                    this._element.tabIndex = (this._disabled ? \"-1\" : \"0\");\n                },\n\n                _setStarClasses: function (classNameBeforeThreshold, threshold, classNameAfterThreshold) {\n                    for (var i = 0; i < this._maxRating; i++) {\n                        if (i < threshold) {\n                            this._elements[i].className = classNameBeforeThreshold;\n                        } else {\n                            this._elements[i].className = classNameAfterThreshold;\n                        }\n                    }\n                },\n\n                // Average rating star is created from 2 divs:\n                // In the first div the glyph starts from the beginning in the direction of the control\n                // In the second div the glyph starts from the beginning in the opposite direction\n                // That way we are making the average star look like one glyph\n                _updateAverageStar: function () {\n                    var style = this._averageRatingElement.style;\n                    var nextStyle = this._averageRatingElement.nextSibling.style;\n                    if (_Global.getComputedStyle(this._element).direction === \"rtl\") {\n                        style.backgroundPosition = \"right\";\n                        style.paddingRight = this._elementPadding;\n                        style.borderRight = this._elementBorder;\n                        nextStyle.paddingRight = \"0px\";\n                        nextStyle.borderRight = \"0px\";\n                        nextStyle.direction = \"ltr\";\n                    } else {\n                        style.backgroundPosition = \"left\";\n                        nextStyle.backgroundPosition = \"right\";\n                        style.paddingLeft = this._elementPadding;\n                        style.borderLeft = this._elementBorder;\n                        nextStyle.paddingLeft = \"0px\";\n                        nextStyle.borderLeft = \"0px\";\n                        nextStyle.direction = \"rtl\";\n                    }\n                    _ElementUtilities._setFlexStyle(this._averageRatingElement, { grow: this._floatingValue, shrink: this._floatingValue });\n                    style.width = this._resizeStringValue(this._elementWidth, this._floatingValue, style.width);\n                    style.backgroundSize = (100 / this._floatingValue) + \"% 100%\";\n                    style.display = _Global.getComputedStyle(this._averageRatingElement.nextSibling).display;\n                    this._averageRatingHidden = false;\n                    _ElementUtilities._setFlexStyle(this._averageRatingElement.nextSibling, { grow: 1 - this._floatingValue, shrink: 1 - this._floatingValue });\n                    nextStyle.width = this._resizeStringValue(this._elementWidth, 1 - this._floatingValue, nextStyle.width);\n                    nextStyle.backgroundSize = (100 / (1 - this._floatingValue)) + \"% 100%\";\n                },\n\n                // show current rating\n                _showCurrentRating: function () {\n                    this._closeTooltip();\n                    // reset tentative rating\n                    this._tentativeRating = -1;\n                    // if the control is read only then we didn't change anything on hover\n                    if (!this._disabled) {\n                        this._updateControl();\n                    }\n                    this._updateAccessibilityRestState();\n                },\n\n                _showTentativeRating: function (firePreviewChange, tooltipType) {\n                    // if the control is read only don't hover stars\n                    if ((!this._disabled) && (this._tentativeRating >= 0)) {\n                        this._setStarClasses(msRatingTentativeFull, this._tentativeRating, msRatingTentativeEmpty);\n\n                        // hide the empty star\n                        this._hideAverageStar();\n                    }\n\n                    this._updateAccessibilityHoverState();\n\n                    if (firePreviewChange) {\n                        this._openTooltip(tooltipType);\n                        this._raiseEvent(PREVIEW_CHANGE, this._tentativeRating);\n                    }\n                },\n\n                _openTooltip: function (tooltipType) {\n                    if (this.disabled) {\n                        return;\n                    }\n\n                    this._ensureTooltips();\n                    if (this._tentativeRating > 0) {\n                        this._toolTips[this._tentativeRating - 1].innerHTML = this._tooltipStrings[this._tentativeRating - 1];\n                        this._toolTips[this._tentativeRating - 1].open(tooltipType);\n                    } else if (this._tentativeRating === 0) {\n                        this._clearElement = _Global.document.createElement(\"div\");\n                        var distance = this._elements[0].offsetWidth + parseInt(this._elementPadding, 10);\n                        if (_Global.getComputedStyle(this._element).direction === \"ltr\") {\n                            distance *= -1;\n                        }\n                        this._clearElement.style.cssText = \"visiblity:hidden; position:absolute; width:0px; height:100%; left:\" + distance + \"px; top:0px;\";\n                        this._elements[0].appendChild(this._clearElement);\n                        this._toolTips[this._maxRating] = new Tooltip.Tooltip(this._clearElement);\n                        this._toolTips[this._maxRating].innerHTML = this._tooltipStrings[this._maxRating];\n                        this._toolTips[this._maxRating].open(tooltipType);\n                    }\n                },\n\n                _closeTooltip: function () {\n                    if (this._toolTips.length !== 0) {\n                        if (this._tentativeRating > 0) {\n                            this._toolTips[this._tentativeRating - 1].close();\n                        } else if (this._tentativeRating === 0) {\n                            if (this._clearElement !== null) {\n                                this._toolTips[this._maxRating].close();\n                                this._elements[0].removeChild(this._clearElement);\n                                this._clearElement = null;\n                            }\n                        }\n                    }\n                },\n\n                _clearTooltips: function () {\n                    if (this._toolTips && this._toolTips.length !== 0) {\n                        for (var i = 0; i < this._maxRating; i++) {\n                            this._toolTips[i].innerHTML = null;\n                        }\n                    }\n                },\n\n                _appendClass: function (classNameToBeAdded) {\n                    for (var i = 0; i <= this._maxRating; i++) {\n                        _ElementUtilities.addClass(this._elements[i], classNameToBeAdded);\n                    }\n                },\n\n                _setClasses: function (classNameBeforeThreshold, threshold, classNameAfterThreshold) {\n                    for (var i = 0; i < this._maxRating; i++) {\n                        if (i < threshold) {\n                            this._elements[i].className = classNameBeforeThreshold;\n                        } else {\n                            this._elements[i].className = classNameAfterThreshold;\n                        }\n                    }\n                },\n\n                _ensureAverageMSStarRating: function () {\n                    _ElementUtilities.data(this._averageRatingElement).msStarRating = Math.ceil(this._averageRating);\n                },\n\n                _updateControl: function () {\n                    if (!this._controlUpdateNeeded) {\n                        return;\n                    }\n\n                    // check for average rating (if user rating is specified then we are not showing average rating)\n                    if ((this._averageRating !== 0) && (this._userRating === 0)) {\n                        if ((this._averageRating >= 1) && (this._averageRating <= this._maxRating)) { // Display average rating\n                            this._setClasses(msRatingAverageFull, this._averageRating - 1, msRatingAverageEmpty);\n                            this._averageRatingElement.className = msRatingAverageFull;\n\n                            for (var i = 0; i < this._maxRating; i++) {\n                                // check if it is average star\n                                if ((i < this._averageRating) && ((i + 1) >= this._averageRating)) {\n                                    this._resetNextElement(false);\n\n                                    this._element.insertBefore(this._averageRatingElement, this._elements[i]);\n\n                                    this._floatingValue = this._averageRating - i;\n                                    var elementStyle = _Global.getComputedStyle(this._elements[i]);\n                                    this._elementWidth = elementStyle.width;\n\n                                    if (_Global.getComputedStyle(this._element).direction === \"rtl\") {\n                                        this._elementPadding = elementStyle.paddingRight;\n                                        this._elementBorder = elementStyle.borderRight;\n                                    } else {\n                                        this._elementPadding = elementStyle.paddingLeft;\n                                        this._elementBorder = elementStyle.borderLeft;\n                                    }\n\n                                    this._updateAverageStar();\n                                }\n                            }\n                        }\n                    }\n\n                    // check if it is user rating control\n                    if (this._userRating !== 0) {\n                        if ((this._userRating >= 1) && (this._userRating <= this._maxRating)) { // Display user rating.\n                            this._setClasses(msRatingUserFull, this._userRating, msRatingUserEmpty);\n\n                            // hide average star\n                            this._resetAverageStar(false);\n                        }\n                    }\n\n                    // update stars if the rating is not set\n                    if ((this._userRating === 0) && (this._averageRating === 0)) { // Display empty rating\n                        this._setClasses(msRatingEmpty, this._maxRating);\n\n                        // hide average star\n                        this._resetAverageStar(false);\n                    }\n\n                    if (this.disabled) { // Display disabled rating.\n                        this._appendClass(msRatingDisabled);\n                    }\n\n                    // update classes to differentiate average rating vs user rating\n                    // If the userRating is 0 and averageRating is 0 we would like to treat that rating control as user rating control (not as average rating control).\n                    if ((this._averageRating !== 0) && (this._userRating === 0)) {\n                        this._appendClass(msAverage);\n                    } else {\n                        this._appendClass(msUser);\n                    }\n\n                    this._updateAccessibilityRestState();\n                }\n            });\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-toggleswitch',[],function(){});\n\ndefine('require-style!less/colors-toggleswitch',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ToggleSwitch',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../_Accents',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    'require-style!less/styles-toggleswitch',\n    'require-style!less/colors-toggleswitch'\n    ],\n    function toggleInit(_Global, _Base, _BaseUtils, _Events, _Resources, _Accents, _Control, _ElementUtilities) {\n        \"use strict\";\n\n        _Accents.createAccentRule(\".win-toggleswitch-on .win-toggleswitch-track\", [{ name: \"border-color\", value: _Accents.ColorTypes.accent }]);\n\n        _Base.Namespace.define(\"WinJS.UI\", {\n            /// <field>\n            /// <summary locid=\"WinJS.UI.ToggleSwitch\">\n            /// A control that lets the user switch an option on or off.\n            /// </summary>\n            /// </field>\n            /// <icon src=\"ui_winjs.ui.toggleswitch.12x12.png\" width=\"12\" height=\"12\" />\n            /// <icon src=\"ui_winjs.ui.toggleswitch.16x16.png\" width=\"16\" height=\"16\" />\n            /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.ToggleSwitch\"></div>]]></htmlSnippet>\n            /// <event name=\"change\" bubbles=\"true\" locid=\"WinJS.UI.ToggleSwitch_e:change\">Raised when the switch is flipped to on (checked is set to true) or off (checked is set to false). </event>\n            /// <part name=\"toggle\" class=\"win-toggleswitch\" locid=\"WinJS.UI.ToggleSwitch_part:toggle\">The entire ToggleSwitch control.</part>\n            /// <part name=\"track\" class=\"win-toggleswitch-track\" locid=\"WinJS.UI.ToggleSwitch_part:track\">The slider portion of the toggle.</part>\n            /// <part name=\"thumb\" class=\"win-toggleswitch-thumb\" locid=\"WinJS.UI.ToggleSwitch_part:thumb\">The thumb of the slider.</part>\n            /// <part name=\"title\" class=\"win-toggleswitch-header\" locid=\"WinJS.UI.ToggleSwitch_part:title\">The main text for the ToggleSwitch control.</part>\n            /// <part name=\"label-on\" class=\"win-toggleswitch-value\" locid=\"WinJS.UI.ToggleSwitch_part:label-on\">The text for when the switch is on.</part>\n            /// <part name=\"label-off\" class=\"win-toggleswitch-value\" locid=\"WinJS.UI.ToggleSwitch_part:label-off:\">The text for when the switch is off.</part>\n            /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n            /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n            ToggleSwitch: _Base.Namespace._lazy(function () {\n\n                // Store some class names\n                var classContainer = 'win-toggleswitch';\n                var classHeader = 'win-toggleswitch-header';\n                var classClick = 'win-toggleswitch-clickregion';\n                var classTrack = 'win-toggleswitch-track';\n                var classThumb = 'win-toggleswitch-thumb';\n                var classValues = 'win-toggleswitch-values';\n                var classValue = 'win-toggleswitch-value';\n                var classValueOn = 'win-toggleswitch-value-on';\n                var classValueOff = 'win-toggleswitch-value-off';\n                var classDescription = 'win-toggleswitch-description';\n                var classOn = 'win-toggleswitch-on';\n                var classOff = 'win-toggleswitch-off';\n                var classDisabled = 'win-toggleswitch-disabled';\n                var classEnabled = 'win-toggleswitch-enabled';\n                var classDragging = 'win-toggleswitch-dragging';\n                var classPressed = 'win-toggleswitch-pressed';\n\n                // Localized  strings\n                var strings = {\n                    get on() {\n                        return _Resources._getWinJSString(\"ui/on\").value;\n                    },\n                    get off() {\n                        return _Resources._getWinJSString(\"ui/off\").value;\n                    },\n                };\n\n                // Define the ToggleSwitch class\n                var Toggle = _Base.Class.define(function ToggleSwitch_ctor(element, options) {\n                    /// <signature helpKeyword=\"WinJS.UI.ToggleSwitch.ToggleSwitch\">\n                    /// <summary locid=\"WinJS.UI.ToggleSwitch.constructor\">\n                    /// Creates a new ToggleSwitch.\n                    /// </summary>\n                    /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.ToggleSwitch.constructor_p:element\">\n                    /// The DOM element that hosts the ToggleSwitch.\n                    /// </param>\n                    /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.ToggleSwitch.constructor_p:options\">\n                    /// An object that contains one or more property/value pairs to apply to the new control.\n                    /// Each property of the options object corresponds to one of the control's properties or events.\n                    /// Event names must begin with \"on\". For example, to provide a handler for the change event,\n                    /// add a property named \"onchange\" to the options object and set its value to the event handler.\n                    /// This parameter is optional.\n                    /// </param>\n                    /// <returns type=\"WinJS.UI.ToggleSwitch\" locid=\"WinJS.UI.ToggleSwitch.constructor_returnValue\">\n                    /// The new ToggleSwitch.\n                    /// </returns>\n                    /// </signature>\n\n                    // Main container\n                    element = element || _Global.document.createElement('div');\n                    this._domElement = element;\n                    _ElementUtilities.addClass(this._domElement, classContainer);\n\n                    // Set up DOM elements\n                    this._domElement.innerHTML = [\n                        '<div class=\"' + classHeader + '\"></div>',\n                        '<div class=\"' + classClick + '\">',\n                        '   <div class=\"' + classTrack + '\">',\n                        '       <div class=\"' + classThumb + '\"></div>',\n                        '   </div>',\n                        '   <div class=\"' + classValues + '\">',\n                        '      <div class=\"' + classValue + ' ' + classValueOn + '\"></div>',\n                        '      <div class=\"' + classValue + ' ' + classValueOff + '\"></div>',\n                        '   </div>',\n                        '</div>',\n                        '<div class=\"' + classDescription + '\"></div>'\n                    ].join('\\n');\n\n                    // Get references to elements\n                    this._headerElement = this._domElement.firstElementChild;\n                    this._clickElement = this._headerElement.nextElementSibling;\n                    this._trackElement = this._clickElement.firstElementChild;\n                    this._thumbElement = this._trackElement.firstElementChild;\n                    this._labelsElement = this._trackElement.nextElementSibling;\n                    this._labelOnElement = this._labelsElement.firstElementChild;\n                    this._labelOffElement = this._labelOnElement.nextElementSibling;\n                    this._descriptionElement = this._clickElement.nextElementSibling;\n\n                    // Set aria label info\n                    this._headerElement.setAttribute('aria-hidden', true);\n                    this._labelsElement.setAttribute('aria-hidden', true);\n                    this._headerElement.setAttribute('id', _ElementUtilities._uniqueID(this._headerElement));\n                    this._domElement.setAttribute('aria-labelledby', this._headerElement.id);\n                    this._domElement.setAttribute('role', 'checkbox');\n\n                    // Some initialization of main element\n                    this._domElement.winControl = this;\n                    _ElementUtilities.addClass(this._domElement, 'win-disposable');\n\n                    // Add listeners\n                    this._domElement.addEventListener('keydown', this._keyDownHandler.bind(this));\n                    _ElementUtilities._addEventListener(this._clickElement, 'pointerdown', this._pointerDownHandler.bind(this));\n                    _ElementUtilities._addEventListener(this._clickElement, 'pointercancel', this._pointerCancelHandler.bind(this));\n                    this._boundPointerMove = this._pointerMoveHandler.bind(this);\n                    this._boundPointerUp = this._pointerUpHandler.bind(this);\n\n                    // Need mutation observer to listen for aria checked change\n                    this._mutationObserver = new _ElementUtilities._MutationObserver(this._ariaChangedHandler.bind(this));\n                    this._mutationObserver.observe(this._domElement, {attributes: true, attributeFilter: ['aria-checked']});\n\n                    // Current x coord while being dragged\n                    this._dragX = 0;\n                    this._dragging = false;\n\n                    // Default state\n                    this.checked = false;\n                    this.disabled = false;\n                    this.labelOn = strings.on;\n                    this.labelOff = strings.off;\n\n                    // Apply options\n                    _Control.setOptions(this, options);\n                }, {\n                    // Properties\n\n                    /// <field type='HTMLElement' domElement='true' hidden='true' locid=\"WinJS.UI.ToggleSwitch.element\" helpKeyword=\"WinJS.UI.ToggleSwitch.element\">\n                    /// The DOM element that hosts the ToggleSwitch control.\n                    /// </field>\n                    element: {\n                        get: function () {\n                            return this._domElement;\n                        }\n                    },\n                    /// <field type=\"Boolean\" locid=\"WinJS.UI.ToggleSwitch.checked\" helpKeyword=\"WinJS.UI.ToggleSwitch.checked\">\n                    /// Gets or sets whether the control is on (checked is set to true) or off (checked is set to false).\n                    /// </field>\n                    checked: {\n                        get: function () {\n                            return this._checked;\n                        },\n                        set: function (value) {\n                            value = !!value;\n                            if (value === this.checked) {\n                                return;\n                            }\n\n                            this._checked = value;\n                            this._domElement.setAttribute('aria-checked', value);\n                            if (value) {\n                                _ElementUtilities.addClass(this._domElement, classOn);\n                                _ElementUtilities.removeClass(this._domElement, classOff);\n                            } else {\n                                _ElementUtilities.addClass(this._domElement, classOff);\n                                _ElementUtilities.removeClass(this._domElement, classOn);\n                            }\n                            this.dispatchEvent(\"change\");\n                        }\n                    },\n                    /// <field type=\"Boolean\" locid=\"WinJS.UI.ToggleSwitch.disabled\" helpKeyword=\"WinJS.UI.ToggleSwitch.disabled\">\n                    /// Gets or sets a value that specifies whether the control is disabled.\n                    /// </field>\n                    disabled: {\n                        get: function () {\n                            return this._disabled;\n                        },\n                        set: function (value) {\n                            value = !!value;\n                            if (value === this._disabled) {\n                                return;\n                            }\n\n                            if (value) {\n                                _ElementUtilities.addClass(this._domElement, classDisabled);\n                                _ElementUtilities.removeClass(this._domElement, classEnabled);\n                            } else {\n                                _ElementUtilities.removeClass(this._domElement, classDisabled);\n                                _ElementUtilities.addClass(this._domElement, classEnabled);\n                            }\n\n                            this._disabled = value;\n                            this._domElement.setAttribute('aria-disabled', value);\n                            this._domElement.setAttribute('tabIndex', value ? -1 : 0);\n                        }\n                    },\n                    /// <field type=\"String\" locid=\"WinJS.UI.ToggleSwitch.labelOn\" helpKeyword=\"WinJS.UI.ToggleSwitch.labelOn\">\n                    /// Gets or sets the text that displays when the control is on (checked is set to true). The default value is \"On\".\n                    /// </field>\n                    labelOn: {\n                        get: function () {\n                            return this._labelOnElement.innerHTML;\n                        },\n                        set: function (value) {\n                            this._labelOnElement.innerHTML = value;\n                        }\n                    },\n                    /// <field type=\"String\" locid=\"WinJS.UI.ToggleSwitch.labelOff\" helpKeyword=\"WinJS.UI.ToggleSwitch.labelOff\">\n                    /// Gets or sets the text that displays when the control is off (checked is set to false). The default value is \"Off\".\n                    /// </field>\n                    labelOff: {\n                        get: function () {\n                            return this._labelOffElement.innerHTML;\n                        },\n                        set: function (value) {\n                            this._labelOffElement.innerHTML = value;\n                        }\n                    },\n                    /// <field type='String' locid=\"WinJS.UI.ToggleSwitch.title\" helpKeyword=\"WinJS.UI.ToggleSwitch.title\">\n                    /// Gets or sets the main text for the ToggleSwitch control. This text is always displayed, regardless of whether\n                    /// the control is switched on or off.\n                    /// </field>\n                    title: {\n                        get: function () {\n                            return this._headerElement.innerHTML;\n                        },\n                        set: function (value) {\n                            this._headerElement.innerHTML = value;\n                        }\n                    },\n\n                    // Events\n\n                    /// <field type=\"Function\" locid=\"WinJS.UI.ToggleSwitch.onchange\" helpKeyword=\"WinJS.UI.ToggleSwitch.onchange\">\n                    /// Occurs when the ToggleSwitch control is flipped to on (checked == true) or off (checked == false).\n                    /// </field>\n                    onchange: _Events._createEventProperty('change'),\n\n                    // Public methods\n                    dispose: function ToggleSwitch_dispose() {\n                        if (this._disposed) {\n                            return;\n                        }\n\n                        this._disposed = true;\n                    },\n\n                    // Private event handlers\n                    _ariaChangedHandler: function ToggleSwitch_ariaChanged() {\n                        var value = this._domElement.getAttribute('aria-checked');\n                        value = (value === 'true') ? true : false;\n                        this.checked = value;\n                    },\n                    _keyDownHandler: function ToggleSwitch_keyDown(e) {\n                        if (this.disabled) {\n                            return;\n                        }\n\n                        // Toggle checked on spacebar\n                        if (e.keyCode === _ElementUtilities.Key.space) {\n                            e.preventDefault();\n                            this.checked = !this.checked;\n                        }\n\n                        // Arrow keys set value\n                        if (e.keyCode === _ElementUtilities.Key.rightArrow ||\n                            e.keyCode === _ElementUtilities.Key.upArrow) {\n                            e.preventDefault();\n                            this.checked = true;\n                        }\n                        if (e.keyCode === _ElementUtilities.Key.leftArrow ||\n                            e.keyCode === _ElementUtilities.Key.downArrow) {\n                            e.preventDefault();\n                            this.checked = false;\n                        }\n\n                    },\n                    _pointerDownHandler: function ToggleSwitch_pointerDown(e) {\n                        if (this.disabled || this._mousedown) {\n                            return;\n                        }\n\n                        e.preventDefault();\n\n                        this._mousedown = true;\n                        this._dragXStart = e.pageX - this._trackElement.getBoundingClientRect().left;\n                        this._dragX = this._dragXStart;\n                        this._dragging = false;\n                        _ElementUtilities.addClass(this._domElement, classPressed);\n\n                        _ElementUtilities._globalListener.addEventListener(this._domElement, 'pointermove', this._boundPointerMove, true);\n                        _ElementUtilities._globalListener.addEventListener(this._domElement, 'pointerup', this._boundPointerUp, true);\n                        if (e.pointerType === _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH) {\n                            _ElementUtilities._setPointerCapture(this._domElement, e.pointerId);\n                        }\n                    },\n                    _pointerCancelHandler: function ToggleSwitch_pointerCancel(e) {\n                        this._resetPressedState();\n                        if (e.pointerType === _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH) {\n                            _ElementUtilities._releasePointerCapture(this._domElement, e.pointerId);\n                        }\n                    },\n                    _pointerUpHandler: function ToggleSwitch_pointerUp(e) {\n                        if (this.disabled) {\n                            return;\n                        }\n\n                        // Since up is a global event we should only take action\n                        // if a mousedown was registered on us initially\n                        if (!this._mousedown) {\n                            return;\n                        }\n\n                        e = e.detail.originalEvent;\n                        e.preventDefault();\n\n                        // If the thumb is being dragged, pick a new value based on what the thumb\n                        // was closest to\n                        var trackRect = this._trackElement.getBoundingClientRect();\n                        var thumbRect = this._thumbElement.getBoundingClientRect();\n                        var isRTL = _Global.getComputedStyle(this._domElement).direction === 'rtl';\n                        if (this._dragging) {\n                            var maxX = trackRect.width - thumbRect.width;\n                            this.checked = isRTL ? this._dragX < maxX / 2 : this._dragX >= maxX / 2;\n                            this._dragging = false;\n                            _ElementUtilities.removeClass(this._domElement, classDragging);\n                        } else {\n                            // Otherwise, just toggle the value as the up constitutes a\n                            // click event\n                            this.checked = !this.checked;\n                        }\n\n                        // Reset tracking variables and intermediate styles\n                        this._resetPressedState();\n                    },\n                    _pointerMoveHandler: function ToggleSwitch_pointerMove(e) {\n                        if (this.disabled) {\n                            return;\n                        }\n\n                        // Not dragging if mouse isn't down\n                        if (!this._mousedown) {\n                            return;\n                        }\n\n                        e = e.detail.originalEvent;\n                        e.preventDefault();\n\n                        // Get pointer x coord relative to control\n                        var trackRect = this._trackElement.getBoundingClientRect();\n                        var localMouseX = e.pageX - trackRect.left;\n\n                        // Not dragging if mouse is outside track\n                        if (localMouseX > trackRect.width) {\n                            return;\n                        }\n\n                        // Calculate a position for the thumb\n                        var thumbRect = this._thumbElement.getBoundingClientRect();\n                        var maxX = trackRect.width - thumbRect.width - 6;\n                        this._dragX = Math.min(maxX, localMouseX - thumbRect.width / 2);\n                        this._dragX = Math.max(2, this._dragX);\n\n                        // Calculate if this pointermove constitutes switching to drag mode\n                        if (!this._dragging && Math.abs(localMouseX - this._dragXStart) > 3) {\n                            this._dragging = true;\n                            _ElementUtilities.addClass(this._domElement, classDragging);\n                        }\n\n                        this._thumbElement.style.left = this._dragX + 'px';\n                    },\n                    _resetPressedState: function ToggleSwitch_resetPressedState() {\n                        this._mousedown = false;\n                        this._thumbElement.style.left = '';\n                        _ElementUtilities.removeClass(this._domElement, classPressed);\n                        _ElementUtilities._globalListener.removeEventListener(this._domElement, 'pointermove', this._boundPointerMove, true);\n                        _ElementUtilities._globalListener.removeEventListener(this._domElement, 'pointerup', this._boundPointerUp, true);\n                    }\n                });\n\n                // addEventListener, removeEventListener, dispatchEvent\n                _Base.Class.mix(Toggle, _Control.DOMEventMixin);\n\n                return Toggle;\n            })\n        });\n    }\n);\n\n\ndefine('require-style!less/styles-semanticzoom',[],function(){});\n\ndefine('require-style!less/colors-semanticzoom',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Semantic Zoom control\ndefine('WinJS/Controls/SemanticZoom',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../Animations/_TransitionAnimation',\n    '../ControlProcessor',\n    '../Promise',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_ElementListUtilities',\n    '../Utilities/_Hoverable',\n    'require-style!less/styles-semanticzoom',\n    'require-style!less/colors-semanticzoom'\n    ], function semanticZoomInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, ControlProcessor, Promise, _Control, _Dispose, _ElementUtilities, _ElementListUtilities, _Hoverable) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.SemanticZoom\">\n        /// Enables the user to zoom between two different views supplied by two child controls.\n        /// One child control supplies the zoomed-out view and the other provides the zoomed-in view.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.semanticzoom.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.semanticzoom.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.SemanticZoom\"><div class=\"zoomedInContainer\" data-win-control=\"WinJS.UI.ListView\"></div><div class=\"zoomedOutContainer\" data-win-control=\"WinJS.UI.ListView\"></div></div>]]></htmlSnippet>\n        /// <part name=\"semanticZoom\" class=\"win-semanticzoom\" locid=\"WinJS.UI.SemanticZoom_part:semanticZoom\">The entire SemanticZoom control.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        SemanticZoom: _Base.Namespace._lazy(function () {\n            var browserStyleEquivalents = _BaseUtils._browserStyleEquivalents;\n\n            var strings = {\n                get invalidZoomFactor() { return \"Invalid zoomFactor\"; },\n            };\n\n            function identity(item) {\n                return item;\n            }\n\n            // Private statics\n\n            var sezoButtonClass = \"win-semanticzoom-button\";\n            var sezoButtonLocationClass = \"win-semanticzoom-button-location\";\n            var sezoButtonShowDuration = 3000;\n            var sezoButtonMouseMoveThreshold = 8;\n\n            var semanticZoomClass = \"win-semanticzoom\";\n            var zoomedInElementClass = \"win-semanticzoom-zoomedinview\";\n            var zoomedOutElementClass = \"win-semanticzoom-zoomedoutview\";\n\n            var zoomChangedEvent = \"zoomchanged\";\n\n            var bounceFactor = 1.05;\n            var defaultZoomFactor = 0.65; // Value used by the shell\n            // If we change these we need to update the metadata for the zoomFactor property as well.\n            var maxZoomFactor = 0.8;\n            var minZoomFactor = 0.2;\n\n            var canvasSizeMax = 4096;\n\n            var outgoingOpacityTransitionDuration = 0.333;\n            var incomingOpacityTransitionDuration = 0.333;\n            var outgoingScaleTransitionDuration = 0.333;\n            var incomingScaleTransitionDuration = 0.333;\n            var zoomAnimationDuration = outgoingOpacityTransitionDuration * 1000;\n            var zoomAnimationTTFFBuffer = 50;\n            // PS 846107 - TransitionEnd event not being fired occassionally if duration is not same\n            var bounceInDuration = 0.333;\n            var bounceBackDuration = 0.333;\n            var easeOutBezier = \"cubic-bezier(0.1,0.9,0.2,1)\";\n            var transformNames = browserStyleEquivalents[\"transform\"];\n            var transitionScriptName = browserStyleEquivalents[\"transition\"].scriptName;\n\n            function buildTransition(prop, duration, timing) {\n                return prop + \" \" + _TransitionAnimation._animationTimeAdjustment(duration) + \"s \" + timing + \" \" + _TransitionAnimation._libraryDelay + \"ms\";\n            }\n            function outgoingElementTransition() {\n                return buildTransition(transformNames.cssName, outgoingScaleTransitionDuration, \"ease-in-out\") + \", \" +\n                       buildTransition(\"opacity\", outgoingOpacityTransitionDuration, \"ease-in-out\");\n            }\n\n            function incomingElementTransition() {\n                return buildTransition(transformNames.cssName, incomingScaleTransitionDuration, \"ease-in-out\") + \", \" +\n                       buildTransition(\"opacity\", incomingOpacityTransitionDuration, \"ease-in-out\");\n            }\n\n            function bounceInTransition() {\n                return buildTransition(transformNames.cssName, bounceInDuration, easeOutBezier);\n            }\n\n            function bounceBackTransition() {\n                return buildTransition(transformNames.cssName, bounceBackDuration, easeOutBezier);\n            }\n\n            var pinchDistanceCount = 2;\n            var zoomOutGestureDistanceChangeFactor = 0.2;\n            var zoomInGestureDistanceChangeFactor = 0.45;\n\n            var zoomAnimationTimeout = 1000;\n\n            // The semantic zoom has to piece together information from a variety of separate events to get an understanding of the current\n            // manipulation state. Since these events are altogether separate entities, we have to put a delay between the end of one event\n            // to allow time for another event to come around. For example, when we handle MSLostPointerCapture events, we need\n            // to wait because DManip might be taking over. If it is, we'll receive an MSManipulationStateChanged event soon,\n            // and so we don't want to reset our state back, and need give that event a chance to fire.\n            var eventTimeoutDelay = 50;\n\n            var PinchDirection = {\n                none: 0,\n                zoomedIn: 1,\n                zoomedOut: 2\n            };\n\n            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\";\n            var PT_PEN = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_PEN || \"pen\";\n            var PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || \"mouse\";\n\n            function getDimension(element, property) {\n                return _ElementUtilities.convertToPixels(element, property);\n            }\n\n            function scaleElement(element, scale) {\n                if (_TransitionAnimation.isAnimationEnabled()) {\n                    element.style[transformNames.scriptName] = \"scale(\" + scale + \")\";\n                }\n            }\n\n            var origin = { x: 0, y: 0 };\n\n            function onSemanticZoomResize(ev) {\n                var control = ev.target && ev.target.winControl;\n                if (control && !control._resizing) {\n                    control._onResize();\n                }\n            }\n\n            function onSemanticZoomPropertyChanged(list) {\n                // This will only be called for \"aria-checked\" changes\n                var control = list[0].target && list[0].target.winControl;\n                if (control && control instanceof SemanticZoom) {\n                    control._onPropertyChanged();\n                }\n            }\n\n            var SemanticZoom = _Base.Class.define(function SemanticZoom_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.SemanticZoom.SemanticZoom\">\n                /// <summary locid=\"WinJS.UI.SemanticZoom.constructor\">\n                /// Creates a new SemanticZoom.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.SemanticZoom.constructor_p:element\">\n                /// The DOM element that hosts the SemanticZoom.\n                /// </param>\n                /// <param name=\"options\" type=\"object\" locid=\"WinJS.UI.SemanticZoom.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events. This parameter is optional.\n                /// </param>\n                /// <returns type=\"WinJS.UI.SemanticZoom\" locid=\"WinJS.UI.SemanticZoom.constructor_returnValue\">\n                /// The new SemanticZoom control.\n                /// </returns>\n                /// </signature>\n\n                this._disposed = false;\n\n                var that = this;\n                var isPhone = _BaseUtils.isPhone;\n\n                this._element = element;\n                this._element.winControl = this;\n                _ElementUtilities.addClass(this._element, \"win-disposable\");\n                _ElementUtilities.addClass(this._element, semanticZoomClass);\n                this._element.setAttribute(\"role\", \"ms-semanticzoomcontainer\");\n                var ariaLabel = this._element.getAttribute(\"aria-label\");\n                if (!ariaLabel) {\n                    this._element.setAttribute(\"aria-label\", \"\");\n                }\n\n                options = options || {};\n                this._zoomedOut = !!options.zoomedOut || !!options.initiallyZoomedOut || false;\n                this._enableButton = !isPhone;\n                if (!isPhone && options.enableButton !== undefined) {\n                    this._enableButton = !!options.enableButton;\n                }\n\n                this._element.setAttribute(\"aria-checked\", this._zoomedOut.toString());\n                this._zoomFactor = _ElementUtilities._clamp(options.zoomFactor, minZoomFactor, maxZoomFactor, defaultZoomFactor);\n\n                this.zoomedInItem = options.zoomedInItem;\n                this.zoomedOutItem = options.zoomedOutItem;\n\n                if (_BaseUtils.validation) {\n                    if (options._zoomFactor && options._zoomFactor !== this._zoomFactor) {\n                        throw new _ErrorFromName(\"WinJS.UI.SemanticZoom.InvalidZoomFactor\", strings.invalidZoomFactor);\n                    }\n                }\n\n                this._locked = !!options.locked;\n\n                this._zoomInProgress = false;\n                this._isBouncingIn = false;\n                this._isBouncing = false;\n                this._zooming = false;\n                this._aligning = false;\n                this._gesturing = false;\n                this._gestureEnding = false;\n                this._buttonShown = false;\n                this._shouldFakeTouchCancel = (\"TouchEvent\" in _Global);\n\n                // Initialize the control\n\n                this._initialize();\n                this._configure();\n\n                // Register event handlers\n\n                var initiallyParented = _Global.document.body.contains(this._element);\n                _ElementUtilities._addInsertedNotifier(this._element);\n                this._element.addEventListener(\"WinJSNodeInserted\", function (event) {\n                    // WinJSNodeInserted fires even if the element is already in the DOM\n                    if (initiallyParented) {\n                        initiallyParented = false;\n                        return;\n                    }\n                    onSemanticZoomResize(event);\n                }, false);\n                this._element.addEventListener(\"mselementresize\", onSemanticZoomResize);\n                _ElementUtilities._resizeNotifier.subscribe(this._element, onSemanticZoomResize);\n                new _ElementUtilities._MutationObserver(onSemanticZoomPropertyChanged).observe(this._element, { attributes: true, attributeFilter: [\"aria-checked\"] });\n\n                if (!isPhone) {\n                    this._element.addEventListener(\"wheel\", this._onWheel.bind(this), true);\n                    this._element.addEventListener(\"mousewheel\", this._onMouseWheel.bind(this), true);\n                    this._element.addEventListener(\"keydown\", this._onKeyDown.bind(this), true);\n\n                    _ElementUtilities._addEventListener(this._element, \"pointerdown\", this._onPointerDown.bind(this), true);\n                    _ElementUtilities._addEventListener(this._element, \"pointermove\", this._onPointerMove.bind(this), true);\n                    _ElementUtilities._addEventListener(this._element, \"pointerout\", this._onPointerOut.bind(this), true);\n                    _ElementUtilities._addEventListener(this._element, \"pointercancel\", this._onPointerCancel.bind(this), true);\n                    _ElementUtilities._addEventListener(this._element, \"pointerup\", this._onPointerUp.bind(this), false);\n                    this._hiddenElement.addEventListener(\"gotpointercapture\", this._onGotPointerCapture.bind(this), false);\n                    this._hiddenElement.addEventListener(\"lostpointercapture\", this._onLostPointerCapture.bind(this), false);\n                    this._element.addEventListener(\"click\", this._onClick.bind(this), true);\n                    this._canvasIn.addEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], this._onCanvasTransitionEnd.bind(this), false);\n                    this._canvasOut.addEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], this._onCanvasTransitionEnd.bind(this), false);\n                    this._element.addEventListener(\"MSContentZoom\", this._onMSContentZoom.bind(this), true);\n                    this._resetPointerRecords();\n                }\n\n                // Get going\n                this._onResizeImpl();\n\n                _Control._setOptions(this, options, true);\n\n                // Present the initial view\n                that._setVisibility();\n            }, {\n                // Public members\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.SemanticZoom.element\" helpKeyword=\"WinJS.UI.SemanticZoom.element\">\n                /// The DOM element that hosts the SemanticZoom control.\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.SemanticZoom.enableButton\" helpKeyword=\"WinJS.UI.SemanticZoom.enableButton\">\n                /// Gets or sets a value that specifies whether the semantic zoom button should be displayed or not\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                enableButton: {\n                    get: function () {\n                        return this._enableButton;\n                    },\n                    set: function (value) {\n                        var newValue = !!value;\n                        if (this._enableButton !== newValue && !_BaseUtils.isPhone) {\n                            this._enableButton = newValue;\n                            if (newValue) {\n                                this._createSemanticZoomButton();\n                            } else {\n                                this._removeSemanticZoomButton();\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.SemanticZoom.zoomedOut\" helpKeyword=\"WinJS.UI.SemanticZoom.zoomedOut\">\n                /// Gets or sets a value that specifies whether the zoomed out view is currently displayed.\n                /// </field>\n                zoomedOut: {\n                    get: function () {\n                        return this._zoomedOut;\n                    },\n                    set: function (value) {\n                        this._zoom(!!value, { x: 0.5 * this._sezoClientWidth, y: 0.5 * this._sezoClientHeight }, false, false, (this._zoomedOut && _BaseUtils.isPhone));\n                    }\n                },\n\n                /// <field type=\"Number\" locid=\"WinJS.UI.SemanticZoom.zoomFactor\" helpKeyword=\"WinJS.UI.SemanticZoom.zoomFactor\" minimum=\"0.2\" maximum=\"0.8\">\n                /// Gets or sets a value between 0.2 and 0.85 that specifies the scale of the zoomed out view. The default is 0.65.\n                /// </field>\n                zoomFactor: {\n                    get: function () {\n                        return this._zoomFactor;\n                    },\n                    set: function (value) {\n                        var oldValue = this._zoomFactor;\n                        var newValue = _ElementUtilities._clamp(value, minZoomFactor, maxZoomFactor, defaultZoomFactor);\n                        if (oldValue !== newValue) {\n                            this._zoomFactor = newValue;\n                            this._onResize();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.SemanticZoom.locked\" helpKeyword=\"WinJS.UI.SemanticZoom.locked\">\n                /// Gets or sets a value that indicates whether SemanticZoom is locked and zooming between views is disabled.\n                /// </field>\n                locked: {\n                    get: function () {\n                        return this._locked;\n                    },\n                    set: function (value) {\n                        this._locked = !!value;\n                        if (value) {\n                            this._hideSemanticZoomButton();\n                        } else {\n                            this._displayButton();\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.SemanticZoom.zoomedInItem\" helpKeyword=\"WinJS.UI.SemanticZoom.zoomedInItem\">\n                /// Gets or sets a mapping function which can be used to change the item which is targeted on zoom in.\n                /// </field>\n                zoomedInItem: {\n                    get: function () { return this._zoomedInItem; },\n                    set: function (value) {\n                        this._zoomedInItem = value || identity;\n                    },\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.SemanticZoom.zoomedOutItem\" helpKeyword=\"WinJS.UI.SemanticZoom.zoomedOutItem\">\n                /// Gets or sets a mapping function which can be used to change the item which is targeted on zoom out.\n                /// </field>\n                zoomedOutItem: {\n                    get: function () { return this._zoomedOutItem; },\n                    set: function (value) {\n                        this._zoomedOutItem = value || identity;\n                    },\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.SemanticZoom.dispose\">\n                    /// <summary locid=\"WinJS.UI.SemanticZoom.dispose\">\n                    /// Disposes this SemanticZoom.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._disposed = true;\n                    _ElementUtilities._resizeNotifier.unsubscribe(this._element, onSemanticZoomResize);\n                    _Dispose._disposeElement(this._elementIn);\n                    _Dispose._disposeElement(this._elementOut);\n\n                    this._clearTimeout(this._completeZoomTimer);\n                    this._clearTimeout(this._TTFFTimer);\n                },\n\n                forceLayout: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.SemanticZoom.forceLayout\">\n                    /// <summary locid=\"WinJS.UI.SemanticZoom.forceLayout\">\n                    /// Forces the SemanticZoom to update its layout. Use this function when making the SemanticZoom visible again\n                    /// after its style.display property had been set to \"none\".\n                    /// </summary>\n                    /// </signature>\n                    this._onResizeImpl();\n                },\n\n                // Private members\n\n                _initialize: function () {\n                    // initialize the semantic zoom, parent the child controls\n\n                    // Zoomed in and zoomed out controls must be on the first two child elements\n\n                    var children = _ElementListUtilities.children(this._element);\n                    this._elementIn = children[0];\n                    this._elementOut = children[1];\n\n                    // Ensure the child controls have the same height as the SemanticZoom element\n\n                    this._elementIn.style.height = this._elementOut.style.height = this._element.offsetHeight + \"px\";\n\n                    // Create the child controls if they haven't been created already\n\n                    ControlProcessor.processAll(this._elementIn);\n                    ControlProcessor.processAll(this._elementOut);\n\n                    this._viewIn = this._elementIn.winControl.zoomableView;\n                    this._viewOut = this._elementOut.winControl.zoomableView;\n\n                    // Remove the children and place them beneath new divs that will serve as canvases and viewports\n                    this._element.removeChild(this._elementOut);\n                    this._element.removeChild(this._elementIn);\n                    this._element.innerHTML = \"\";\n                    this._cropViewport = _Global.document.createElement(\"div\");\n                    this._element.appendChild(this._cropViewport);\n                    this._viewportIn = _Global.document.createElement(\"div\");\n                    this._opticalViewportIn = _Global.document.createElement(\"div\");\n                    this._viewportOut = _Global.document.createElement(\"div\");\n                    this._opticalViewportOut = _Global.document.createElement(\"div\");\n                    this._opticalViewportIn.appendChild(this._viewportIn);\n                    this._opticalViewportOut.appendChild(this._viewportOut);\n                    this._cropViewport.appendChild(this._opticalViewportIn);\n                    this._cropViewport.appendChild(this._opticalViewportOut);\n\n                    this._canvasIn = _Global.document.createElement(\"div\");\n                    this._canvasOut = _Global.document.createElement(\"div\");\n                    this._viewportIn.appendChild(this._canvasIn);\n                    this._viewportOut.appendChild(this._canvasOut);\n                    this._canvasIn.appendChild(this._elementIn);\n                    this._canvasOut.appendChild(this._elementOut);\n\n                    if (this._enableButton) {\n                        this._createSemanticZoomButton();\n                    }\n\n                    this._hiddenElement = _Global.document.createElement(\"div\");\n                    this._hiddenElement.tabIndex = -1;\n                    this._hiddenElement.visibility = \"hidden\";\n                    this._hiddenElement.setAttribute(\"aria-hidden\", \"true\");\n                    this._element.appendChild(this._hiddenElement);\n\n                    _ElementUtilities.addClass(this._elementIn, zoomedInElementClass);\n                    _ElementUtilities.addClass(this._elementOut, zoomedOutElementClass);\n                    this._setLayout(this._element, \"relative\", \"hidden\");\n                    this._setLayout(this._cropViewport, \"absolute\", \"hidden\");\n                    this._setLayout(this._opticalViewportIn, \"absolute\", \"auto\");\n                    this._setLayout(this._opticalViewportOut, \"absolute\", \"auto\");\n                    this._setLayout(this._viewportIn, \"absolute\", \"hidden\");\n                    this._setLayout(this._viewportOut, \"absolute\", \"hidden\");\n                    this._setLayout(this._canvasIn, \"absolute\", \"hidden\");\n                    this._setLayout(this._canvasOut, \"absolute\", \"hidden\");\n                    // Pinch zoom on a precision touchpad doesn't send PointerMove etc. events like ordinary touch actions. PTP has to be handled specially.\n                    // PTP ignores the -ms-touch-action styles that are applied to elements, which means it ignores the style we apply to disable\n                    // optical zooming. An element can be optically zoomed via PTP but not with touch. SemanticZoom takes advantage of this fact to\n                    // implement zoom for PTPs. The _opticalViewportIn/Out elements have optical zoom properties attached to them to enable\n                    // optical zoom, and we attach an MSContentZoom event handler to our root element. When we receive that event on an optical viewport,\n                    // and it's in the direction for triggering a zoom, we'll trigger a zoom just like we would for scroll wheel/keyboard.\n                    // A nice side effect of this is that we don't need to play the overbounce animation in the PTP code, since optical zoom will\n                    // zoom out a small percentage then hit the min/max zoom value for us, then automatically return to 100% once the user stops manipulating.\n                    this._setupOpticalViewport(this._opticalViewportIn);\n                    this._setupOpticalViewport(this._opticalViewportOut);\n\n                    // Optical zoom can only work on elements with overflow = scroll. The opticalViewportIn/Out elements have overflow=scroll applied to them to enable this,\n                    // but we don't want those scrollbars to be visible, so they also have -ms-overflow-style=none.\n                    // The -ms-overflow-style on the optical viewport is inherited by its children. We don't want that, so we'll set the immediate children to have the\n                    // default overflow style.\n                    this._viewportIn.style[\"-ms-overflow-style\"] = \"-ms-autohiding-scrollbar\";\n                    this._viewportOut.style[\"-ms-overflow-style\"] = \"-ms-autohiding-scrollbar\";\n\n                    this._elementIn.style.position = \"absolute\";\n                    this._elementOut.style.position = \"absolute\";\n                },\n\n                _createSemanticZoomButton: function () {\n                    this._sezoButton = _Global.document.createElement(\"button\");\n                    this._sezoButton.setAttribute(\"type\", \"button\");\n                    this._sezoButton.className = sezoButtonClass + \" \" + sezoButtonLocationClass + \" win-button\";\n                    this._sezoButton.tabIndex = -1;\n                    this._sezoButton.style.visibility = \"hidden\";\n                    this._sezoButton.setAttribute(\"aria-hidden\", true);\n                    this._element.appendChild(this._sezoButton);\n\n                    //register the appropriate events for display the sezo button\n                    this._sezoButton.addEventListener(\"click\", this._onSeZoButtonZoomOutClick.bind(this), false);\n                    this._element.addEventListener(\"scroll\", this._onSeZoChildrenScroll.bind(this), true);\n                    _ElementUtilities._addEventListener(this._element, \"pointermove\", this._onPenHover.bind(this), false);\n                },\n\n                _removeSemanticZoomButton: function () {\n                    if (this._sezoButton) {\n                        this._element.removeChild(this._sezoButton);\n                        this._sezoButton = null;\n                    }\n                },\n\n                _configure: function () {\n                    // Configure the controls for zooming\n                    var axisIn = this._viewIn.getPanAxis(),\n                        axisOut = this._viewOut.getPanAxis(),\n                        isPhone = _BaseUtils.isPhone;\n                    this._pansHorizontallyIn = (axisIn === \"horizontal\" || axisIn === \"both\");\n                    this._pansVerticallyIn = (axisIn === \"vertical\" || axisIn === \"both\");\n                    this._pansHorizontallyOut = (axisOut === \"horizontal\" || axisOut === \"both\");\n                    this._pansVerticallyOut = (axisOut === \"vertical\" || axisOut === \"both\");\n\n                    if (this._zoomInProgress) {\n                        return;\n                    }\n\n                    var pagesToPrefetchIn = 1 / this._zoomFactor - 1,\n                        pagesToPrefetchOut = bounceFactor - 1;\n\n                    this._setLayout(this._elementIn, \"absolute\", \"visible\");\n                    this._setLayout(this._elementOut, \"absolute\", \"visible\");\n                    this._viewIn.configureForZoom(false, !this._zoomedOut, this._zoomFromCurrent.bind(this, true), pagesToPrefetchIn);\n                    this._viewOut.configureForZoom(true, this._zoomedOut, this._zoomFromCurrent.bind(this, false), pagesToPrefetchOut);\n                    this._pinching = false;\n                    this._pinchGesture = 0;\n                    this._canvasLeftIn = 0;\n                    this._canvasTopIn = 0;\n                    this._canvasLeftOut = 0;\n                    this._canvasTopOut = 0;\n\n                    // Set scales and opacity when not on the phone\n                    if (!isPhone) {\n                        if (this._zoomedOut) {\n                            scaleElement(this._canvasIn, this._zoomFactor);\n                        } else {\n                            scaleElement(this._canvasOut, 1 / this._zoomFactor);\n                        }\n                    }\n                    var styleViewportIn = this._opticalViewportIn.style,\n                        styleViewportOut = this._opticalViewportOut.style,\n                        styleCanvasIn = this._canvasIn.style,\n                        styleCanvasOut = this._canvasOut.style;\n\n                    styleCanvasIn.opacity = (this._zoomedOut && !isPhone ? 0 : 1);\n                    styleCanvasOut.opacity = (this._zoomedOut ? 1 : 0);\n                    // Set the zoomed out canvas to have a higher zIndex than the zoomedIn canvas, so that when hosted on the phone\n                    // the SeZo will display both views properly.\n                    if (isPhone) {\n                        styleCanvasIn.zIndex = 1;\n                        styleCanvasOut.zIndex = 2;\n                    }\n\n                    // Enable animation\n                    if (_TransitionAnimation.isAnimationEnabled() && !isPhone) {\n                        styleViewportIn[browserStyleEquivalents[\"transition-property\"].scriptName] = transformNames.cssName;\n                        styleViewportIn[browserStyleEquivalents[\"transition-duration\"].scriptName] = \"0s\";\n                        styleViewportIn[browserStyleEquivalents[\"transition-timing-function\"].scriptName] = \"linear\";\n\n                        styleViewportOut[browserStyleEquivalents[\"transition-property\"].scriptName] = transformNames.cssName;\n                        styleViewportOut[browserStyleEquivalents[\"transition-duration\"].scriptName] = \"0s\";\n                        styleViewportOut[browserStyleEquivalents[\"transition-timing-function\"].scriptName] = \"linear\";\n                    }\n                },\n\n                _onPropertyChanged: function () {\n                    // This will only be called for \"aria-checked\" changes...also, the list is not important.\n                    var newValue = this._element.getAttribute(\"aria-checked\");\n                    var zoomedOut = newValue === \"true\";\n                    if (this._zoomedOut !== zoomedOut) {\n                        this.zoomedOut = zoomedOut;\n                    }\n                },\n\n                _onResizeImpl: function () {\n                    this._resizing = this._resizing || 0;\n                    this._resizing++;\n                    try {\n                        var positionElement = function (element, left, top, width, height) {\n                            var style = element.style;\n                            style.left = left + \"px\";\n                            style.top = top + \"px\";\n                            style.width = width + \"px\";\n                            style.height = height + \"px\";\n                        };\n\n                        var sezoComputedStyle = _Global.getComputedStyle(this._element, null),\n                            computedWidth = parseFloat(sezoComputedStyle.width),\n                            computedHeight = parseFloat(sezoComputedStyle.height),\n                            sezoPaddingLeft = getDimension(this._element, sezoComputedStyle[\"paddingLeft\"]),\n                            sezoPaddingRight = getDimension(this._element, sezoComputedStyle[\"paddingRight\"]),\n                            sezoPaddingTop = getDimension(this._element, sezoComputedStyle[\"paddingTop\"]),\n                            sezoPaddingBottom = getDimension(this._element, sezoComputedStyle[\"paddingBottom\"]),\n                            viewportWidth = computedWidth - sezoPaddingLeft - sezoPaddingRight,\n                            viewportHeight = computedHeight - sezoPaddingTop - sezoPaddingBottom,\n                            scaleFactor = 1 / this._zoomFactor;\n\n\n                        if (this._viewportWidth === viewportWidth && this._viewportHeight === viewportHeight) {\n                            return;\n                        }\n                        this._sezoClientHeight = computedHeight;\n                        this._sezoClientWidth = computedWidth;\n                        this._viewportWidth = viewportWidth;\n                        this._viewportHeight = viewportHeight;\n\n                        this._configure();\n\n                        var multiplierIn = 2 * scaleFactor - 1,\n                            canvasInWidth = Math.min(canvasSizeMax, (this._pansHorizontallyIn ? multiplierIn : 1) * viewportWidth),\n                            canvasInHeight = Math.min(canvasSizeMax, (this._pansVerticallyIn ? multiplierIn : 1) * viewportHeight);\n\n                        this._canvasLeftIn = 0.5 * (canvasInWidth - viewportWidth);\n                        this._canvasTopIn = 0.5 * (canvasInHeight - viewportHeight);\n                        positionElement(this._cropViewport, sezoPaddingLeft, sezoPaddingTop, viewportWidth, viewportHeight);\n                        positionElement(this._viewportIn, 0, 0, viewportWidth, viewportHeight);\n                        positionElement(this._opticalViewportIn, 0, 0, viewportWidth, viewportHeight);\n                        positionElement(this._canvasIn, -this._canvasLeftIn, -this._canvasTopIn, canvasInWidth, canvasInHeight);\n                        positionElement(this._elementIn, this._canvasLeftIn, this._canvasTopIn, viewportWidth, viewportHeight);\n\n                        var multiplierOut = 2 * bounceFactor - 1,\n                            canvasOutWidth = (this._pansHorizontallyOut ? multiplierOut : 1) * viewportWidth,\n                            canvasOutHeight = (this._pansVerticallyOut ? multiplierOut : 1) * viewportHeight;\n\n                        this._canvasLeftOut = 0.5 * (canvasOutWidth - viewportWidth);\n                        this._canvasTopOut = 0.5 * (canvasOutHeight - viewportHeight);\n                        positionElement(this._viewportOut, 0, 0, viewportWidth, viewportHeight);\n                        positionElement(this._opticalViewportOut, 0, 0, viewportWidth, viewportHeight);\n                        positionElement(this._canvasOut, -this._canvasLeftOut, -this._canvasTopOut, canvasOutWidth, canvasOutHeight);\n                        positionElement(this._elementOut, this._canvasLeftOut, this._canvasTopOut, viewportWidth, viewportHeight);\n                    } finally {\n                        this._resizing--;\n                    }\n                },\n\n                _onResize: function () {\n                    this._onResizeImpl();\n                },\n\n                _onMouseMove: function (ev) {\n                    if (this._zooming ||\n                         (!this._lastMouseX && !this._lastMouseY) ||\n                         (ev.screenX === this._lastMouseX && ev.screenY === this._lastMouseY)) {\n                        this._lastMouseX = ev.screenX;\n                        this._lastMouseY = ev.screenY;\n                        return;\n                    }\n\n                    if (Math.abs(ev.screenX - this._lastMouseX) <= sezoButtonMouseMoveThreshold &&\n                        Math.abs(ev.screenY - this._lastMouseY) <= sezoButtonMouseMoveThreshold) {\n                        return;\n                    }\n\n                    this._lastMouseX = ev.screenX;\n                    this._lastMouseY = ev.screenY;\n\n                    this._displayButton();\n                },\n\n                _displayButton: function () {\n                    if (!_Hoverable.isHoverable) {\n                        return;\n                    }\n\n                    _Global.clearTimeout(this._dismissButtonTimer);\n                    this._showSemanticZoomButton();\n\n                    var that = this;\n                    this._dismissButtonTimer = _Global.setTimeout(function () {\n                        that._hideSemanticZoomButton();\n                    }, _TransitionAnimation._animationTimeAdjustment(sezoButtonShowDuration));\n                },\n\n                _showSemanticZoomButton: function () {\n                    if (this._disposed || this._buttonShown) {\n                        return;\n                    }\n\n                    if (this._sezoButton && !this._zoomedOut && !this._locked) {\n                        Animations.fadeIn(this._sezoButton);\n                        this._sezoButton.style.visibility = \"visible\";\n                        this._buttonShown = true;\n                    }\n                },\n\n                _hideSemanticZoomButton: function (immediately) {\n                    if (this._disposed || !this._buttonShown) {\n                        return;\n                    }\n\n                    if (this._sezoButton) {\n                        if (!immediately) {\n                            var that = this;\n                            Animations.fadeOut(this._sezoButton).then(function () {\n                                that._sezoButton.style.visibility = \"hidden\";\n                            });\n                        } else {\n                            this._sezoButton.style.visibility = \"hidden\";\n                        }\n                        this._buttonShown = false;\n                    }\n                },\n\n                _onSeZoChildrenScroll: function (ev) {\n                    if (ev.target !== this.element) {\n                        this._hideSemanticZoomButton(true);\n                    }\n                },\n\n                _onWheel: function (ev) {\n                    if (ev.ctrlKey) {\n                        this._zoom(ev.deltaY > 0, this._getPointerLocation(ev));\n\n                        ev.stopPropagation();\n                        ev.preventDefault();\n                    }\n                },\n\n                _onMouseWheel: function (ev) {\n                    if (ev.ctrlKey) {\n                        this._zoom(ev.wheelDelta < 0, this._getPointerLocation(ev));\n\n                        ev.stopPropagation();\n                        ev.preventDefault();\n                    }\n                },\n\n                _onPenHover: function (ev) {\n                    if (ev.pointerType === PT_PEN && ev.buttons === 0) {\n                        this._displayButton();\n                    }\n                },\n\n                _onSeZoButtonZoomOutClick: function () {\n                    this._hideSemanticZoomButton();\n                    this._zoom(true, { x: 0.5 * this._sezoClientWidth, y: 0.5 * this._sezoClientHeight }, false);\n                },\n\n                _onKeyDown: function (ev) {\n                    var handled = false;\n\n                    if (ev.ctrlKey) {\n                        var Key = _ElementUtilities.Key;\n\n                        switch (ev.keyCode) {\n                            case Key.add:\n                            case Key.equal:\n                            case 61: //Firefox uses a different keycode\n                                this._zoom(false);\n                                handled = true;\n                                break;\n\n                            case Key.subtract:\n                            case Key.dash:\n                            case 173: //Firefox uses a different keycode\n                                this._zoom(true);\n                                handled = true;\n                                break;\n                        }\n                    }\n\n                    if (handled) {\n                        ev.stopPropagation();\n                        ev.preventDefault();\n                    }\n                },\n\n                _createPointerRecord: function (ev, fireCancelOnPinch) {\n                    var location = this._getPointerLocation(ev);\n\n                    var newRecord = {};\n                    newRecord.startX = newRecord.currentX = location.x;\n                    newRecord.startY = newRecord.currentY = location.y;\n                    newRecord.fireCancelOnPinch = fireCancelOnPinch;\n\n                    this._pointerRecords[ev.pointerId] = newRecord;\n                    this._pointerCount = Object.keys(this._pointerRecords).length;\n\n                    return newRecord;\n                },\n\n                _deletePointerRecord: function (id) {\n                    var record = this._pointerRecords[id];\n\n                    delete this._pointerRecords[id];\n                    this._pointerCount = Object.keys(this._pointerRecords).length;\n\n                    if (this._pointerCount !== 2) {\n                        this._pinching = false;\n                    }\n\n                    return record;\n                },\n\n                _fakeCancelOnPointer: function (ev) {\n                    var touchEvent = _Global.document.createEvent(\"UIEvent\");\n                    touchEvent.initUIEvent(\"touchcancel\", true, true, _Global, 0);\n                    touchEvent.touches = ev.touches;\n                    touchEvent.targetTouches = ev.targetTouches;\n                    touchEvent.changedTouches = [ev._currentTouch];\n                    touchEvent._fakedBySemanticZoom = true;\n                    ev.target.dispatchEvent(touchEvent);\n                },\n\n                _handlePointerDown: function (ev) {\n                    this._createPointerRecord(ev, false);\n\n                    // When we get more than one pointer, we need to explicitly set PointerCapture on every pointer we've got to the SemanticZoom.\n                    // This will fire lostCapture events on any descendant elements that had called setCapture earlier (for example, ListView items),\n                    // and let the hosted control know that the pointer is no longer under its control.\n                    var contactKeys = Object.keys(this._pointerRecords);\n\n                    for (var i = 0, len = contactKeys.length; i < len; i++) {\n                        try {\n                            _ElementUtilities._setPointerCapture(this._hiddenElement, contactKeys[i] || 0);\n                        } catch (e) {\n                            this._resetPointerRecords();\n                            return;\n                        }\n                    }\n\n\n                    ev.stopImmediatePropagation();\n                    ev.preventDefault();\n                },\n\n                _handleFirstPointerDown: function (ev) {\n                    this._resetPointerRecords();\n                    this._createPointerRecord(ev, this._shouldFakeTouchCancel);\n                    this._startedZoomedOut = this._zoomedOut;\n                },\n\n                // SeZo wants to prevent clicks while it is playing the bounce animation\n                // This can happen when user try to pinch out on the zoomed out view\n                // and lift the finger up on the same item\n                _onClick: function (ev) {\n                    if (ev.target !== this._element) {\n                        if (this._isBouncing) {\n                            ev.stopImmediatePropagation();\n                        }\n                    }\n                },\n\n                // To optimize perf for ListView and to support more than 2 contact points\n                // for custom control, we wire up pointerDown routine for listview during capture\n                // but during bubbling phase for everythign else\n                _onPointerDown: function (ev) {\n                    if (ev.pointerType !== PT_TOUCH) {\n                        return;\n                    }\n\n                    if (this._pointerCount === 0) {\n                        this._handleFirstPointerDown(ev);\n                    } else {\n                        this._handlePointerDown(ev);\n                    }\n                },\n\n                // SemanticZoom uses MSPointerMove messages to recognize a pinch. It has to use pointer messages instead of GestureUpdate for a few reasons:\n                // 1 - MSGestureUpdate events' scale property (the property that determines pinches) is based on a scalar value. We want our pinch threshold to be pixel based\n                // 2 - MSGestureUpdate events' scale property doesn't work when multiple contacts are on multiple surfaces. When that happens .scale will always stay 1.0.\n                _onPointerMove: function (ev) {\n                    if (ev.pointerType === PT_MOUSE || ev.pointerType === PT_PEN) {\n                        this._onMouseMove(ev);\n                        return;\n                    }\n\n                    if (ev.pointerType !== PT_TOUCH) {\n                        return;\n                    }\n\n                    function distance(startX, startY, endX, endY) {\n                        return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY));\n                    }\n\n                    function midpoint(point1, point2) {\n                        return {\n                            x: (0.5 * (point1.currentX + point2.currentX)) | 0,\n                            y: (0.5 * (point1.currentY + point2.currentY)) | 0\n                        };\n                    }\n\n                    var pointerRecord = this._pointerRecords[ev.pointerId],\n                        location = this._getPointerLocation(ev);\n\n                    // We listen to MSPointerDown on the bubbling phase of its event, but listen to MSPointerMove on the capture phase.\n                    // MSPointerDown can be stopped from bubbling if the underlying control doesn't want the SemanticZoom to interfere for whatever reason.\n                    // When that happens, we won't have a pointer record for the event we just got, so there's no sense in doing additional processing.\n                    if (!pointerRecord) {\n                        return;\n                    }\n                    pointerRecord.currentX = location.x;\n                    pointerRecord.currentY = location.y;\n\n                    if (this._pointerCount === 2) {\n                        this._pinching = true;\n\n                        // The order in which these contacts are stored and retrieved from contactKeys is unimportant.  Any two points will suffice.\"\n                        var contactKeys = Object.keys(this._pointerRecords),\n                            point1 = this._pointerRecords[contactKeys[0]],\n                            point2 = this._pointerRecords[contactKeys[1]];\n                        this._currentMidPoint = midpoint(point1, point2);\n                        var contactDistance = distance(point1.currentX, point1.currentY, point2.currentX, point2.currentY);\n                        var that = this;\n                        var processPinchGesture = function (zoomingOut) {\n                            var pinchDirection = (zoomingOut ? PinchDirection.zoomedOut : PinchDirection.zoomedIn),\n                                gestureReversed = (zoomingOut ? (that._pinchedDirection === PinchDirection.zoomedIn && !that._zoomingOut) : (that._pinchedDirection === PinchDirection.zoomedOut && that._zoomingOut)),\n                                canZoomInGesturedDirection = (zoomingOut ? !that._zoomedOut : that._zoomedOut);\n                            if (that._pinchedDirection === PinchDirection.none) {\n                                if (canZoomInGesturedDirection) {\n                                    that._isBouncingIn = false;\n                                    that._zoom(zoomingOut, midpoint(point1, point2), true);\n                                    that._pinchedDirection = pinchDirection;\n                                } else if (!that._isBouncingIn) {\n                                    that._playBounce(true, midpoint(point1, point2));\n                                }\n                            } else if (gestureReversed) {\n                                var deltaFromStart = that._lastPinchDistance / that._lastPinchStartDistance;\n                                var deltaFromLast = that._lastLastPinchDistance / that._lastPinchDistance;\n                                if ((zoomingOut && deltaFromStart > zoomOutGestureDistanceChangeFactor) ||\n                                    (!zoomingOut && deltaFromLast > zoomInGestureDistanceChangeFactor)) {\n                                    that._zoom(zoomingOut, midpoint(point1, point2), true);\n                                    that._pinchedDirection = pinchDirection;\n                                }\n                            }\n                        };\n                        this._updatePinchDistanceRecords(contactDistance);\n                        if (this._pinchDistanceCount >= pinchDistanceCount) {\n                            if (!this._zooming && !this._isBouncing) {\n                                _WriteProfilerMark(\"WinJS.UI.SemanticZoom:EndPinchDetection,info\");\n                                processPinchGesture(this._lastPinchDirection === PinchDirection.zoomedOut);\n                            }\n                        }\n                    } else if (this._pointerCount > 2) {\n                        // When more than two pointers are down, we're not going to interpret that as a pinch, so we reset the distance we'd recorded when it was\n                        // just two pointers down.\n                        this._resetPinchDistanceRecords();\n                    }\n\n                    if (this._pointerCount >= 2) {\n                        // When two or more pointers are down, we want to hide all of their move events from the underlying view.\n                        // If the pointer we're looking at needs to have a touch cancel event fired for it, we'll fake that now.\n                        if (pointerRecord.fireCancelOnPinch) {\n                            this._fakeCancelOnPointer(ev, pointerRecord);\n                            pointerRecord.fireCancelOnPinch = false;\n                        }\n                        ev.stopImmediatePropagation();\n                        ev.preventDefault();\n                    }\n                    // If the pointerCount isn't 2, we're no longer making a pinch. This generally happens if you try pinching, find you can't zoom in the pinched direction,\n                    // then release one finger. When that happens we need to animate back to normal state.\n                    if (this._pointerCount !== 2 && this._isBouncingIn) {\n                        this._playBounce(false);\n                    }\n                },\n\n                _onPointerOut: function (ev) {\n                    if (ev.pointerType !== PT_TOUCH || ev.target !== this._element) {\n                        return;\n                    }\n\n                    this._completePointerUp(ev, false);\n                },\n\n                _onPointerUp: function (ev) {\n                    this._releasePointerCapture(ev);\n                    this._completePointerUp(ev, true);\n                    this._completeZoomingIfTimeout();\n                },\n\n                _onPointerCancel: function (ev) {\n                    if (!ev._fakedBySemanticZoom) {\n                        this._releasePointerCapture(ev);\n                        this._completePointerUp(ev, false);\n                        this._completeZoomingIfTimeout();\n                    }\n                },\n\n                _onGotPointerCapture: function (ev) {\n                    var pointerRecord = this._pointerRecords[ev.pointerId];\n                    if (pointerRecord) {\n                        pointerRecord.dirty = false;\n                    }\n                },\n\n                _onLostPointerCapture: function (ev) {\n                    var pointerRecord = this._pointerRecords[ev.pointerId];\n                    if (pointerRecord) {\n                        // If we lose capture on an element, there are three things that could be happening:\n                        // 1 - Independent Manipulations are taking over. If that's the case, we should be getting an MSManipulationStateChanged event soon.\n                        // 2 - Capture is just moving around inside of the semantic zoom region. We should get a got capture event soon, so we'll want to preserve this record.\n                        // 3 - Capture got moved outside of the semantic zoom region. We'll destroy the pointer record if this happens.\n                        pointerRecord.dirty = true;\n                        var that = this;\n                        Promise.timeout(eventTimeoutDelay).then(function () {\n                            if (pointerRecord.dirty) {\n                                // If the timeout completed and the record is still dirty, we can discard it\n                                that._completePointerUp(ev, false);\n                            }\n                        });\n                    }\n                },\n\n                _onMSContentZoom: function (ev) {\n                    var sourceElement = ev.target;\n                    if (sourceElement === this._opticalViewportIn || sourceElement === this._opticalViewportOut) {\n                        // msZoomFactor is a floating point, and sometimes it'll won't be exactly 1.0 when at rest. We'll give a 5/1000ths margin above/below 1.0 as the start points for a zoomIn or out gesture.\n                        var zoomingOut = (sourceElement.msContentZoomFactor < 0.995),\n                            zoomingIn = (sourceElement.msContentZoomFactor > 1.005);\n                        if (zoomingOut && !(this._zoomedOut || this._zoomingOut)) {\n                            this.zoomedOut = true;\n                        } else if (zoomingIn && (this._zoomedOut || this._zoomingOut)) {\n                            this.zoomedOut = false;\n                        }\n                    }\n                },\n\n                _updatePinchDistanceRecords: function (contactDistance) {\n                    var that = this;\n                    function updatePinchDirection(direction) {\n                        if (that._lastPinchDirection === direction) {\n                            that._pinchDistanceCount++;\n                        } else {\n                            that._pinchGesture++;\n                            that._pinchDistanceCount = 0;\n                            that._lastPinchStartDistance = contactDistance;\n                        }\n                        that._lastPinchDirection = direction;\n                        that._lastPinchDistance = contactDistance;\n                        that._lastLastPinchDistance = that._lastPinchDistance;\n                    }\n\n                    if (this._lastPinchDistance === -1) {\n                        _WriteProfilerMark(\"WinJS.UI.SemanticZoom:StartPinchDetection,info\");\n                        this._lastPinchDistance = contactDistance;\n                    } else {\n                        if (this._lastPinchDistance !== contactDistance) {\n                            if (this._lastPinchDistance > contactDistance) {\n                                updatePinchDirection(PinchDirection.zoomedOut);\n                            } else {\n                                updatePinchDirection(PinchDirection.zoomedIn);\n                            }\n                        }\n                    }\n                },\n\n                _zoomFromCurrent: function (zoomOut) {\n                    this._zoom(zoomOut, null, false, true);\n                },\n\n                _zoom: function (zoomOut, zoomCenter, gesture, centerOnCurrent, skipAlignment) {\n                    _WriteProfilerMark(\"WinJS.UI.SemanticZoom:StartZoom(zoomOut=\" + zoomOut + \"),info\");\n\n                    this._clearTimeout(this._completeZoomTimer);\n                    this._clearTimeout(this._TTFFTimer);\n\n                    this._hideSemanticZoomButton();\n                    this._resetPinchDistanceRecords();\n\n                    if (this._locked || this._gestureEnding) {\n                        return;\n                    }\n\n                    if (this._zoomInProgress) {\n                        if (this._gesturing === !gesture) {\n                            return;\n                        }\n\n                        if (zoomOut !== this._zoomingOut) {\n                            // Reverse the zoom that's currently in progress\n                            this._startAnimations(zoomOut);\n                        }\n                    } else if (zoomOut !== this._zoomedOut) {\n                        this._zooming = true;\n                        this._aligning = true;\n                        this._gesturing = !!gesture;\n\n                        if (zoomCenter) {\n                            (zoomOut ? this._viewIn : this._viewOut).setCurrentItem(zoomCenter.x, zoomCenter.y);\n                        }\n\n                        this._zoomInProgress = true;\n\n                        (zoomOut ? this._opticalViewportOut : this._opticalViewportIn).style.visibility = \"visible\";\n                        if (zoomOut && _BaseUtils.isPhone) {\n                            // When on the phone, we need to make sure the zoomed out canvas is visible before calling beginZoom(), otherwise\n                            // beginZoom will start up animations on an invisible element, and those animations will be animated dependently.\n                            this._canvasOut.style.opacity = 1;\n                        }\n\n                        var promiseIn = this._viewIn.beginZoom(),\n                            promiseOut = this._viewOut.beginZoom(),\n                            beginZoomPromises = null;\n\n                        if ((promiseIn || promiseOut) && _BaseUtils.isPhone) {\n                            beginZoomPromises = Promise.join([promiseIn, promiseOut]);\n                        }\n                        // To simplify zoomableView implementations, only call getCurrentItem between beginZoom and endZoom\n                        if (centerOnCurrent && !skipAlignment) {\n                            var that = this;\n                            (zoomOut ? this._viewIn : this._viewOut).getCurrentItem().then(function (current) {\n                                var position = current.position;\n\n                                // Pass in current item to avoid calling getCurrentItem again\n                                that._prepareForZoom(zoomOut, {\n                                    x: that._rtl() ? (that._sezoClientWidth - position.left - 0.5 * position.width) : position.left + 0.5 * position.width,\n                                    y: position.top + 0.5 * position.height\n                                }, Promise.wrap(current), beginZoomPromises);\n                            });\n                        } else {\n                            this._prepareForZoom(zoomOut, zoomCenter || {}, null, beginZoomPromises, skipAlignment);\n                        }\n                    }\n                },\n\n                _prepareForZoom: function (zoomOut, zoomCenter, completedCurrentItem, customViewAnimationPromise, skipAlignment) {\n                    _WriteProfilerMark(\"WinJS.UI.SemanticZoom:prepareForZoom,StartTM\");\n                    var that = this;\n                    var centerX = zoomCenter.x,\n                        centerY = zoomCenter.y;\n\n\n                    if (typeof centerX !== \"number\" || !this._pansHorizontallyIn || !this._pansHorizontallyOut) {\n                        centerX = 0.5 * this._sezoClientWidth;\n                    }\n\n                    if (typeof centerY !== \"number\" || !this._pansVerticallyIn || !this._pansVerticallyOut) {\n                        centerY = 0.5 * this._sezoClientHeight;\n                    }\n\n                    function setZoomCenters(adjustmentIn, adjustmentOut) {\n                        that._canvasIn.style[browserStyleEquivalents[\"transform-origin\"].scriptName] = (that._canvasLeftIn + centerX - adjustmentIn.x) + \"px \" + (that._canvasTopIn + centerY - adjustmentIn.y) + \"px\";\n                        that._canvasOut.style[browserStyleEquivalents[\"transform-origin\"].scriptName] = (that._canvasLeftOut + centerX - adjustmentOut.x) + \"px \" + (that._canvasTopOut + centerY - adjustmentOut.y) + \"px\";\n                    }\n\n                    setZoomCenters(origin, origin);\n\n                    if (!skipAlignment) {\n                        this._alignViewsPromise = this._alignViews(zoomOut, centerX, centerY, completedCurrentItem).then(function () {\n                            that._aligning = false;\n                            that._gestureEnding = false;\n                            that._alignViewsPromise = null;\n                            if (!that._zooming && !that._gesturing) {\n                                that._completeZoom();\n                            }\n                        });\n                    } else {\n                        this._aligning = false;\n                    }\n                    this._zoomingOut = zoomOut;\n                    // Force style resolution\n                    _Global.getComputedStyle(this._canvasIn).opacity;\n                    _Global.getComputedStyle(this._canvasOut).opacity;\n                    _WriteProfilerMark(\"WinJS.UI.SemanticZoom:prepareForZoom,StopTM\");\n                    this._startAnimations(zoomOut, customViewAnimationPromise);\n                },\n\n                _alignViews: function (zoomOut, centerX, centerY, completedCurrentItem) {\n                    var multiplier = (1 - this._zoomFactor),\n                        rtl = this._rtl(),\n                        offsetLeft = multiplier * (rtl ? this._viewportWidth - centerX : centerX),\n                        offsetTop = multiplier * centerY;\n\n                    var that = this;\n                    if (zoomOut) {\n                        var item = completedCurrentItem || this._viewIn.getCurrentItem();\n                        if (item) {\n                            return item.then(function (current) {\n                                var positionIn = current.position,\n                                positionOut = {\n                                    left: positionIn.left * that._zoomFactor + offsetLeft,\n                                    top: positionIn.top * that._zoomFactor + offsetTop,\n                                    width: positionIn.width * that._zoomFactor,\n                                    height: positionIn.height * that._zoomFactor\n                                };\n\n                                return that._viewOut.positionItem(that._zoomedOutItem(current.item), positionOut);\n                            });\n                        }\n                    } else {\n                        var item2 = completedCurrentItem || this._viewOut.getCurrentItem();\n                        if (item2) {\n                            return item2.then(function (current) {\n                                var positionOut = current.position,\n                                positionIn = {\n                                    left: (positionOut.left - offsetLeft) / that._zoomFactor,\n                                    top: (positionOut.top - offsetTop) / that._zoomFactor,\n                                    width: positionOut.width / that._zoomFactor,\n                                    height: positionOut.height / that._zoomFactor\n                                };\n\n                                return that._viewIn.positionItem(that._zoomedInItem(current.item), positionIn);\n                            });\n                        }\n                    }\n\n                    return new Promise(function (c) { c({ x: 0, y: 0 }); });\n                },\n\n                _startAnimations: function (zoomOut, customViewAnimationPromise) {\n                    this._zoomingOut = zoomOut;\n\n                    var isPhone = _BaseUtils.isPhone;\n                    if (_TransitionAnimation.isAnimationEnabled() && !isPhone) {\n                        _WriteProfilerMark(\"WinJS.UI.SemanticZoom:ZoomAnimation,StartTM\");\n                        this._canvasIn.style[transitionScriptName] = (zoomOut ? outgoingElementTransition() : incomingElementTransition());\n                        this._canvasOut.style[transitionScriptName] = (zoomOut ? incomingElementTransition() : outgoingElementTransition());\n                    }\n\n                    if (!isPhone) {\n                        scaleElement(this._canvasIn, (zoomOut ? this._zoomFactor : 1));\n                        scaleElement(this._canvasOut, (zoomOut ? 1 : 1 / this._zoomFactor));\n                    }\n                    this._canvasIn.style.opacity = (zoomOut && !isPhone ? 0 : 1);\n                    if (!isPhone || zoomOut) {\n                        this._canvasOut.style.opacity = (zoomOut ? 1 : 0);\n                    }\n\n                    if (!_TransitionAnimation.isAnimationEnabled()) {\n                        this._zooming = false;\n                        this._canvasIn.style[transformNames.scriptName] = \"\";\n                        this._canvasOut.style[transformNames.scriptName] = \"\";\n                        this._completeZoom();\n                    } else if (!customViewAnimationPromise) {\n                        this.setTimeoutAfterTTFF(this._onZoomAnimationComplete.bind(this), _TransitionAnimation._animationTimeAdjustment(zoomAnimationDuration));\n                    } else {\n                        var that = this;\n                        var onComplete = function onComplete() {\n                            that._canvasIn.style[transformNames.scriptName] = \"\";\n                            that._canvasOut.style[transformNames.scriptName] = \"\";\n                            that._onZoomAnimationComplete();\n                        };\n                        customViewAnimationPromise.then(onComplete, onComplete);\n                    }\n                },\n\n                _onBounceAnimationComplete: function () {\n                    if (!this._isBouncingIn && !this._disposed) {\n                        this._completeZoom();\n                    }\n                },\n\n                _onZoomAnimationComplete: function () {\n                    _WriteProfilerMark(\"WinJS.UI.SemanticZoom:ZoomAnimation,StopTM\");\n\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._zooming = false;\n                    if (!this._aligning && !this._gesturing && !this._gestureEnding) {\n                        this._completeZoom();\n                    }\n                },\n\n                _onCanvasTransitionEnd: function (ev) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    if ((ev.target === this._canvasOut || ev.target === this._canvasIn) && this._isBouncing) {\n                        this._onBounceAnimationComplete();\n                        return;\n                    }\n\n                    if (ev.target === this._canvasIn && ev.propertyName === transformNames.cssName) {\n                        this._onZoomAnimationComplete();\n                    }\n                },\n\n                _clearTimeout: function (timer) {\n                    if (timer) {\n                        _Global.clearTimeout(timer);\n                    }\n                },\n\n                _completePointerUp: function (ev, stopPropagation) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    var id = ev.pointerId;\n                    var pointerRecord = this._pointerRecords[id];\n                    if (pointerRecord) {\n                        this._deletePointerRecord(id);\n                        if (this._isBouncingIn) {\n                            this._playBounce(false);\n                        }\n\n                        if (stopPropagation && this._pinchedDirection !== PinchDirection.none) {\n                            ev.stopImmediatePropagation();\n                        }\n\n                        if (this._pointerCount === 0) {\n                            // if we are not zooming and if there's any single pending pinch gesture detected that's not being triggered (fast pinch), process them now\n                            if (this._pinchGesture === 1 && !this._zooming && this._lastPinchDirection !== PinchDirection.none && this._pinchDistanceCount < pinchDistanceCount) {\n                                this._zoom(this._lastPinchDirection === PinchDirection.zoomedOut, this._currentMidPoint, false);\n                                this._pinchGesture = 0;\n                                this._attemptRecordReset();\n                                return;\n                            }\n\n                            if (this._pinchedDirection !== PinchDirection.none) {\n                                this._gesturing = false;\n                                if (!this._aligning && !this._zooming) {\n                                    this._completeZoom();\n                                }\n                            }\n                            this._pinchGesture = 0;\n                            this._attemptRecordReset();\n                        }\n                    }\n                },\n\n                setTimeoutAfterTTFF: function (callback, delay) {\n                    var that = this;\n                    that._TTFFTimer = _Global.setTimeout(function () {\n                        if (this._disposed) {\n                            return;\n                        }\n                        that._TTFFTimer = _Global.setTimeout(callback, delay);\n                    }, zoomAnimationTTFFBuffer);\n                },\n\n                _completeZoomingIfTimeout: function () {\n                    if (this._pointerCount !== 0) {\n                        return;\n                    }\n\n                    var that = this;\n                    if (this._zoomInProgress || this._isBouncing) {\n                        that._completeZoomTimer = _Global.setTimeout(function () {\n                            that._completeZoom();\n                        }, _TransitionAnimation._animationTimeAdjustment(zoomAnimationTimeout));\n                    }\n                },\n\n                _completeZoom: function () {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    if (this._isBouncing) {\n                        if (this._zoomedOut) {\n                            this._viewOut.endZoom(true);\n                        } else {\n                            this._viewIn.endZoom(true);\n                        }\n                        this._isBouncing = false;\n                        return;\n                    }\n\n\n                    if (!this._zoomInProgress) {\n                        return;\n                    }\n\n                    _WriteProfilerMark(\"WinJS.UI.SemanticZoom:CompleteZoom,info\");\n                    this._aligning = false;\n                    this._alignViewsPromise && this._alignViewsPromise.cancel();\n\n                    this._clearTimeout(this._completeZoomTimer);\n                    this._clearTimeout(this._TTFFTimer);\n\n                    this._gestureEnding = false;\n                    this[this._zoomingOut ? \"_opticalViewportOut\" : \"_opticalViewportIn\"].msContentZoomFactor = 1.0;\n                    this._viewIn.endZoom(!this._zoomingOut);\n                    this._viewOut.endZoom(this._zoomingOut);\n                    this._canvasIn.style.opacity = (this._zoomingOut && !_BaseUtils.isPhone ? 0 : 1);\n                    this._canvasOut.style.opacity = (this._zoomingOut ? 1 : 0);\n\n                    this._zoomInProgress = false;\n\n                    var zoomChanged = false;\n                    if (this._zoomingOut !== this._zoomedOut) {\n                        this._zoomedOut = !!this._zoomingOut;\n                        this._element.setAttribute(\"aria-checked\", this._zoomedOut.toString());\n                        zoomChanged = true;\n                    }\n\n                    this._setVisibility();\n\n                    if (zoomChanged) {\n                        // Dispatch the zoomChanged event\n                        var ev = _Global.document.createEvent(\"CustomEvent\");\n                        ev.initCustomEvent(zoomChangedEvent, true, true, this._zoomedOut);\n                        this._element.dispatchEvent(ev);\n\n                        if (this._isActive) {\n                            // If the element is no longer a valid focus target, it will throw, we\n                            // simply won't do anything in this case\n                            _ElementUtilities._setActive(this._zoomedOut ? this._elementOut : this._elementIn);\n                        }\n                    }\n\n                    _WriteProfilerMark(\"WinJS.UI.SemanticZoom:CompleteZoom_Custom,info\");\n                },\n\n                _isActive: function () {\n                    var active = _Global.document.activeElement;\n                    return this._element === active || this._element.contains(active);\n                },\n\n                _setLayout: function (element, position, overflow) {\n                    var style = element.style;\n                    style.position = position;\n                    style.overflow = overflow;\n                },\n\n                _setupOpticalViewport: function (viewport) {\n                    viewport.style[\"-ms-overflow-style\"] = \"none\";\n                    if (!_BaseUtils.isPhone) {\n                        viewport.style[\"-ms-content-zooming\"] = \"zoom\";\n                        // We don't want the optical zoom to be too obvious with PTP (we're mostly just using it to get MSContentZoom events).\n                        // We'll use a +/-1% margin around 100% so that we can still optically zoom, but not too far.\n                        viewport.style[\"-ms-content-zoom-limit-min\"] = \"99%\";\n                        viewport.style[\"-ms-content-zoom-limit-max\"] = \"101%\";\n                        viewport.style[\"-ms-content-zoom-snap-points\"] = \"snapList(100%)\";\n                        viewport.style[\"-ms-content-zoom-snap-type\"] = \"mandatory\";\n                    }\n                },\n\n                _setVisibility: function () {\n                    function setVisibility(element, isVisible) {\n                        element.style.visibility = (isVisible ? \"visible\" : \"hidden\");\n                    }\n                    setVisibility(this._opticalViewportIn, !this._zoomedOut || _BaseUtils.isPhone);\n                    setVisibility(this._opticalViewportOut, this._zoomedOut);\n                    this._opticalViewportIn.setAttribute(\"aria-hidden\", !!this._zoomedOut);\n                    this._opticalViewportOut.setAttribute(\"aria-hidden\", !this._zoomedOut);\n                },\n\n                _resetPointerRecords: function () {\n                    this._pinchedDirection = PinchDirection.none;\n                    this._pointerCount = 0;\n                    this._pointerRecords = {};\n                    this._resetPinchDistanceRecords();\n                },\n\n                _releasePointerCapture: function (ev) {\n                    var id = ev.pointerId;\n                    try {\n                        // Release the pointer capture since they are going away, to allow in air touch pointers\n                        // to be reused for multiple interactions\n                        _ElementUtilities._releasePointerCapture(this._hiddenElement, id);\n                    } catch (e) {\n                        // This can throw if the pointer was not already captured\n                    }\n                },\n\n                _attemptRecordReset: function () {\n                    if (this._recordResetPromise) {\n                        this._recordResetPromise.cancel();\n                    }\n\n                    var that = this;\n                    this._recordResetPromise = Promise.timeout(eventTimeoutDelay).then(function () {\n                        if (that._pointerCount === 0) {\n                            that._resetPointerRecords();\n                            that._recordResetPromise = null;\n                        }\n                    });\n                },\n\n                _resetPinchDistanceRecords: function () {\n                    this._lastPinchDirection = PinchDirection.none;\n                    this._lastPinchDistance = -1;\n                    this._lastLastPinchDistance = -1;\n                    this._pinchDistanceCount = 0;\n                    this._currentMidPoint = null;\n                },\n\n                _getPointerLocation: function (ev) {\n                    // Get pointer location returns co-ordinate in the sezo control co-ordinate space\n                    var sezoBox = { left: 0, top: 0 };\n                    try {\n                        sezoBox = this._element.getBoundingClientRect();\n                    }\n                    catch (err) { }  // an exception can be thrown if SeZoDiv is no longer available\n\n                    var sezoComputedStyle = _Global.getComputedStyle(this._element, null),\n                        sezoPaddingLeft = getDimension(this._element, sezoComputedStyle[\"paddingLeft\"]),\n                        sezoPaddingTop = getDimension(this._element, sezoComputedStyle[\"paddingTop\"]),\n                        sezoBorderLeft = getDimension(this._element, sezoComputedStyle[\"borderLeftWidth\"]);\n\n                    return {\n                        x: +ev.clientX === ev.clientX ? (ev.clientX - sezoBox.left - sezoPaddingLeft - sezoBorderLeft) : 0,\n                        y: +ev.clientY === ev.clientY ? (ev.clientY - sezoBox.top - sezoPaddingTop - sezoPaddingTop) : 0\n                    };\n                },\n\n                _playBounce: function (beginBounce, center) {\n                    if (!_TransitionAnimation.isAnimationEnabled()) {\n                        return;\n                    }\n\n                    if (this._isBouncingIn === beginBounce) {\n                        return;\n                    }\n\n                    this._clearTimeout(this._completeZoomTimer);\n                    this._clearTimeout(this._TTFFTimer);\n                    this._isBouncing = true;\n                    this._isBouncingIn = beginBounce;\n                    if (beginBounce) {\n                        this._bounceCenter = center;\n                    } else {\n                        this._aligned = true;\n                    }\n\n                    var targetElement = (this._zoomedOut ? this._canvasOut : this._canvasIn);\n                    var adjustmentX = (this._zoomedOut ? this._canvasLeftOut : this._canvasLeftIn);\n                    var adjustmentY = (this._zoomedOut ? this._canvasTopOut : this._canvasTopIn);\n                    targetElement.style[browserStyleEquivalents[\"transform-origin\"].scriptName] = (adjustmentX + this._bounceCenter.x) + \"px \" + (adjustmentY + this._bounceCenter.y) + \"px\";\n                    targetElement.style[transitionScriptName] = beginBounce ? bounceInTransition() : bounceBackTransition();\n\n                    if (!this._zoomedOut) {\n                        this._viewIn.beginZoom();\n                    } else {\n                        this._viewOut.beginZoom();\n                    }\n\n                    var scale = (beginBounce ? (this._zoomedOut ? 2 - bounceFactor : bounceFactor) : 1);\n\n                    scaleElement(targetElement, scale);\n\n                    this.setTimeoutAfterTTFF(this._onBounceAnimationComplete.bind(this), _TransitionAnimation._animationTimeAdjustment(zoomAnimationDuration));\n                },\n\n                _rtl: function () {\n                    return _Global.getComputedStyle(this._element, null).direction === \"rtl\";\n                },\n\n                _pinching: {\n                    set: function (value) {\n                        this._viewIn.pinching = value;\n                        this._viewOut.pinching = value;\n                    }\n                }\n            });\n            _Base.Class.mix(SemanticZoom, _Events.createEventProperties(\"zoomchanged\"));\n            _Base.Class.mix(SemanticZoom, _Control.DOMEventMixin);\n            return SemanticZoom;\n        })\n\n    });\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Pivot/_Constants',[\n    ], function pivotConstantsInit() {\n    \"use strict\";\n\n    var members = {\n        // Names of classes used by the Pivot.\n        _ClassName: {\n            pivot: \"win-pivot\",\n            pivotLocked: \"win-pivot-locked\",\n            pivotTitle: \"win-pivot-title\",\n            pivotHeaderArea: \"win-pivot-header-area\",\n            pivotHeaderLeftCustom: \"win-pivot-header-leftcustom\",\n            pivotHeaderRightCustom: \"win-pivot-header-rightcustom\",\n            pivotHeaderItems: \"win-pivot-header-items\",\n            pivotHeaders: \"win-pivot-headers\",\n            pivotHeader: \"win-pivot-header\",\n            pivotHeaderSelected: \"win-pivot-header-selected\",\n            pivotViewport: \"win-pivot-viewport\",\n            pivotSurface: \"win-pivot-surface\",\n            pivotNoSnap: \"win-pivot-nosnap\",\n            pivotNavButton: \"win-pivot-navbutton\",\n            pivotNavButtonPrev: \"win-pivot-navbutton-prev\",\n            pivotNavButtonNext: \"win-pivot-navbutton-next\",\n            pivotShowNavButtons: \"win-pivot-shownavbuttons\",\n            pivotInputTypeMouse: \"win-pivot-mouse\",\n            pivotInputTypeTouch: \"win-pivot-touch\",\n            pivotDisableContentSwipeNavigation: \"win-pivot-disablecontentswipenavigation\"\n        }\n    };\n\n    return members;\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Pivot/_Item',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Resources',\n    '../../ControlProcessor',\n    '../../Promise',\n    '../../Scheduler',\n    '../../Utilities/_Control',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    './_Constants'\n    ], function pivotItemInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, ControlProcessor, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Constants) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.PivotItem\">\n        /// Defines a Item of a Pivot control.\n        /// </summary>\n        /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.pivotitem.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.pivotitem.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.PivotItem\" data-win-options=\"{header: 'PivotItem Header'}\">PivotItem Content</div>]]></htmlSnippet>\n        /// <part name=\"pivotitem\" class=\"win-pivot-item\" locid=\"WinJS.UI.PivotItem_part:pivotitem\">The entire PivotItem control.</part>\n        /// <part name=\"content\" class=\"win-pivot-item-content\" locid=\"WinJS.UI.PivotItem_part:content\">The content region of the PivotItem.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        PivotItem: _Base.Namespace._lazy(function () {\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; }\n            };\n\n            var PivotItem = _Base.Class.define(function PivotItem_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.PivotItem.PivotItem\">\n                /// <summary locid=\"WinJS.UI.PivotItem.constructor\">\n                /// Creates a new PivotItem.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.PivotItem.constructor_p:element\">\n                /// The DOM element that hosts the PivotItem control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.PivotItem.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// </param>\n                /// <returns type=\"WinJS.UI.PivotItem\" locid=\"WinJS.UI.PivotItem.constructor_returnValue\">\n                /// The new PivotItem.\n                /// </returns>\n                /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\"/>\n                /// </signature>\n                element = element || _Global.document.createElement(\"DIV\");\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.PivotItem.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                this._element = element;\n                _ElementUtilities.addClass(this.element, PivotItem._ClassName.pivotItem);\n                _ElementUtilities.addClass(this.element, \"win-disposable\");\n                this._element.setAttribute('role', 'tabpanel');\n\n                this._contentElement = _Global.document.createElement(\"DIV\");\n                this._contentElement.className = PivotItem._ClassName.pivotItemContent;\n                element.appendChild(this._contentElement);\n\n                // Reparent any existing elements inside the new pivot item content element.\n                var elementToMove = this.element.firstChild;\n                while (elementToMove !== this._contentElement) {\n                    var nextElement = elementToMove.nextSibling;\n                    this._contentElement.appendChild(elementToMove);\n                    elementToMove = nextElement;\n                }\n\n                this._processors = [ControlProcessor.processAll];\n\n                _Control.setOptions(this, options);\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.PivotItem.element\" helpKeyword=\"WinJS.UI.PivotItem.element\">\n                /// Gets the DOM element that hosts the PivotItem.\n                /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n                /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.PivotItem.contentElement\" helpKeyword=\"WinJS.UI.PivotItem.contentElement\">\n                /// Gets the DOM element that hosts the PivotItem's content.\n                /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\"/>\n                /// </field>\n                contentElement: {\n                    get: function () {\n                        return this._contentElement;\n                    }\n                },\n                /// <field type=\"Object\" locid=\"WinJS.UI.PivotItem.header\" helpKeyword=\"WinJS.UI.PivotItem.header\">\n                /// Get or set the PivotItem's header. After you set this property, the Pivot renders the header again.\n                /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\"/>\n                /// </field>\n                header: {\n                    get: function () {\n                        return this._header;\n                    },\n                    set: function (value) {\n                        // Render again even if it is equal to itself.\n                        this._header = value;\n                        this._parentPivot && this._parentPivot._headersState.handleHeaderChanged(this);\n                    }\n                },\n                _parentPivot: {\n                    get: function () {\n                        var el = this._element;\n                        while (el && !_ElementUtilities.hasClass(el, _Constants._ClassName.pivot)) {\n                            el = el.parentNode;\n                        }\n                        return el && el.winControl;\n                    }\n                },\n                _process: function PivotItem_process() {\n                    var that = this;\n\n                    if (this._processors) {\n                        this._processors.push(function () {\n                            return Scheduler.schedulePromiseAboveNormal();\n                        });\n                    }\n\n                    this._processed = (this._processors || []).reduce(function (promise, processor) {\n                        return promise.then(function () {\n                            return processor(that.contentElement);\n                        });\n                    }, this._processed || Promise.as());\n                    this._processors = null;\n\n                    return this._processed;\n                },\n                dispose: function PivotItem_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.PivotItem.dispose\">\n                    /// <summary locid=\"WinJS.UI.PivotItem.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n                    this._processors = null;\n\n                    _Dispose.disposeSubTree(this.contentElement);\n                }\n            }, {\n                // Names of classes used by the PivotItem.\n                _ClassName: {\n                    pivotItem: \"win-pivot-item\",\n                    pivotItemContent: \"win-pivot-item-content\"\n                },\n                isDeclarativeControlContainer: _BaseUtils.markSupportedForProcessing(function (item, callback) {\n                    if (callback === ControlProcessor.processAll) {\n                        return;\n                    }\n\n                    item._processors = item._processors || [];\n                    item._processors.push(callback);\n\n                    // Once processed the first time synchronously queue up new processors as they come in\n                    if (item._processed) {\n                        item._process();\n                    }\n                })\n            });\n\n            return PivotItem;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-pivot',[],function(){});\n\ndefine('require-style!less/colors-pivot',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Pivot',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../Animations/_TransitionAnimation',\n    '../BindingList',\n    '../ControlProcessor',\n    '../Promise',\n    '../Scheduler',\n    '../_Signal',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_TabContainer',\n    '../Utilities/_KeyboardBehavior',\n    './Pivot/_Constants',\n    './Pivot/_Item',\n    'require-style!less/styles-pivot',\n    'require-style!less/colors-pivot'\n], function pivotInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, BindingList, ControlProcessor, Promise, Scheduler, _Signal, _Control, _Dispose, _ElementUtilities, _Hoverable, _TabContainer, _KeyboardBehavior, _Constants, _Item) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Pivot\">\n        /// Tab control which displays a item of content.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.pivot.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.pivot.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.Pivot\">\n        /// <div data-win-control=\"WinJS.UI.PivotItem\" data-win-options=\"{header: 'PivotItem Header'}\">PivotItem Content</div>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"selectionchanged\" bubbles=\"true\" locid=\"WinJS.UI.Pivot_e:selectionchanged\">Raised when the item on screen has changed.</event>\n        /// <event name=\"itemanimationstart\" bubbles=\"true\" locid=\"WinJS.UI.Pivot_e:itemloaded\">Raised when the item's animation starts.</event>\n        /// <event name=\"itemanimationend\" bubbles=\"true\" locid=\"WinJS.UI.Pivot_e:itemanimationend\">Raised when the item's animation ends.</event>\n        /// <part name=\"pivot\" class=\"win-pivot\" locid=\"WinJS.UI.Pivot_part:pivot\">The entire Pivot control.</part>\n        /// <part name=\"title\" class=\"win-pivot-title\" locid=\"WinJS.UI.Pivot_part:title\">The title for the Pivot control.</part>\n        /// <part name=\"header\" class=\"win-pivot-header\" locid=\"WinJS.UI.Pivot_part:header\">A header of a Pivot Item.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Pivot: _Base.Namespace._lazy(function () {\n            var PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || \"mouse\";\n            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\";\n            var Keys = _ElementUtilities.Key;\n\n            function pivotDefaultHeaderTemplate(item) {\n                var element = _Global.document.createTextNode(typeof item.header === \"object\" ? JSON.stringify(item.header) : ('' + item.header));\n                return element;\n            }\n\n            var createEvent = _Events._createEventProperty;\n            var eventNames = {\n                selectionChanged: \"selectionchanged\",\n                itemAnimationStart: \"itemanimationstart\",\n                itemAnimationEnd: \"itemanimationend\",\n            };\n            var MSManipulationEventStates = _ElementUtilities._MSManipulationEvent;\n\n            var supportsSnap = !!(_ElementUtilities._supportsSnapPoints && _Global.HTMLElement.prototype.msZoomTo);\n\n            function _nop() { }\n            var headersStates = {\n                nop: {\n                    // Called when transitioning away from this state\n                    exit: _nop,\n\n                    // Render headers\n                    render: _nop,\n\n                    // Called when a header is activated, i.e. tapped, clicked, arrow keyed to\n                    activateHeader: _nop,\n\n                    // Called when the selectedIndex changed\n                    handleNavigation: _nop,\n\n                    // Called when the control size changed\n                    handleResize: _nop,\n\n                    // Called when the header string of the specified pivotItem changed\n                    handleHeaderChanged: _nop\n                },\n\n                common: {\n                    // This object contains a set of static helper functions for other states to use\n\n                    headersContainerLeadingMargin: 12,\n\n                    headerHorizontalMargin: 12,\n\n                    getCumulativeHeaderWidth: function headersState_getCumulativeHeaderWidth(pivot, index) {\n                        // Computes the total width of headers from 0 up to the specified index\n                        if (index === 0) {\n                            return 0;\n                        }\n\n                        var originalLength = pivot._headersContainerElement.children.length;\n                        for (var i = 0; i < index; i++) {\n                            var header = headersStates.common.renderHeader(pivot, i, false);\n                            pivot._headersContainerElement.appendChild(header);\n                        }\n\n                        var width = 0;\n                        var leftElement = pivot._rtl ? pivot._headersContainerElement.lastElementChild : pivot._headersContainerElement.children[originalLength];\n                        var rightElement = pivot._rtl ? pivot._headersContainerElement.children[originalLength] : pivot._headersContainerElement.lastElementChild;\n                        width = (rightElement.offsetLeft + rightElement.offsetWidth) - leftElement.offsetLeft;\n                        width += 2 * headersStates.common.headerHorizontalMargin;\n\n                        for (var i = 0; i < index; i++) {\n                            pivot._headersContainerElement.removeChild(pivot._headersContainerElement.lastElementChild);\n                        }\n                        return width;\n                    },\n\n                    refreshHeadersState: function headersState_refreshHeadersState(pivot, invalidateCache) {\n                        // Measures the cumulative header length and switches headers states if necessary\n                        if (invalidateCache) {\n                            this._cachedWidth = 0;\n                        }\n                        var width = this._cachedWidth || this.getCumulativeHeaderWidth(pivot, pivot.items.length);\n                        this._cachedWidth = width;\n\n                        if (width > pivot._headerItemsWidth && !(pivot._headersState instanceof headersStates.overflowState)) {\n                            pivot._headersState.exit();\n                            pivot._headersState = new headersStates.overflowState(pivot);\n                        } else if (width <= pivot._headerItemsWidth && !(pivot._headersState instanceof headersStates.staticState)) {\n                            pivot._headersState.exit();\n                            pivot._headersState = new headersStates.staticState(pivot);\n                        }\n                    },\n\n                    renderHeader: function headersState_renderHeader(pivot, index, aria) {\n                        // Renders a single header\n                        var template = _ElementUtilities._syncRenderer(pivotDefaultHeaderTemplate);\n\n                        var item = pivot._items.getAt(index);\n\n                        var headerContainerEl = _Global.document.createElement(\"BUTTON\");\n                        headerContainerEl.setAttribute(\"type\", \"button\");\n                        headerContainerEl.style.marginLeft = headerContainerEl.style.marginRight = headersStates.common.headerHorizontalMargin + \"px\";\n                        _ElementUtilities.addClass(headerContainerEl, Pivot._ClassName.pivotHeader);\n                        headerContainerEl._item = item;\n                        headerContainerEl._pivotItemIndex = index;\n                        template(item, headerContainerEl);\n\n                        function ariaSelectedMutated() {\n                            if (pivot._disposed) {\n                                return;\n                            }\n\n                            if (pivot._headersContainerElement.contains(headerContainerEl) &&\n                                index !== pivot.selectedIndex &&\n                                headerContainerEl.getAttribute('aria-selected') === \"true\") {\n                                // Ignore aria selected changes on selected item.\n                                // By selecting another tab we change to it.\n                                pivot.selectedIndex = index;\n                            }\n                        }\n                        if (aria) {\n                            headerContainerEl.setAttribute('aria-selected', index === pivot.selectedIndex);\n                            headerContainerEl.setAttribute('role', 'tab');\n                            new _ElementUtilities._MutationObserver(ariaSelectedMutated).observe(headerContainerEl, { attributes: true, attributeFilter: [\"aria-selected\"] });\n                        }\n\n                        return headerContainerEl;\n                    },\n\n                    updateHeader: function headersState_updateHeader(pivot, item) {\n                        // Updates the label of a header\n                        var index = pivot.items.indexOf(item);\n                        var headerElement = pivot._headersContainerElement.children[index];\n                        headerElement.innerHTML = \"\";\n\n                        var template = _ElementUtilities._syncRenderer(pivotDefaultHeaderTemplate);\n                        template(item, headerElement);\n                    },\n\n                    setActiveHeader: function headersState_setActiveHeader(pivot, newSelectedHeader, currentSelectedHeader) {\n                        // Updates the selected header and clears the previously selected header if applicable\n                        var focusWasInHeaders = false;\n                        if (currentSelectedHeader) {\n                            currentSelectedHeader.classList.remove(Pivot._ClassName.pivotHeaderSelected);\n                            currentSelectedHeader.setAttribute(\"aria-selected\", false);\n                            focusWasInHeaders = pivot._headersContainerElement.contains(_Global.document.activeElement);\n                        }\n\n                        newSelectedHeader.classList.add(Pivot._ClassName.pivotHeaderSelected);\n                        newSelectedHeader.setAttribute(\"aria-selected\", true);\n                        focusWasInHeaders && pivot._headersContainerElement.focus();\n                    }\n                },\n\n                staticState: _Base.Class.define(function staticState_ctor(pivot) {\n                    // This state renders headers statically in the order they appear in the binding list.\n                    // There is no animation when the selectedIndex changes, only the highlighted header changes.\n\n                    this.pivot = pivot;\n                    this._firstRender = true;\n                    this._transitionAnimation = Promise.wrap();\n\n                    if (pivot._headersContainerElement.children.length && _TransitionAnimation.isAnimationEnabled()) {\n                        // We transitioned from another headers state, do transition animation\n\n                        // Calculate the offset from the selected header to where the selected header should be in static layout\n                        var selectedHeader = pivot._headersContainerElement.querySelector(\".\" + Pivot._ClassName.pivotHeaderSelected);\n                        var start = 0;\n                        var end = 0;\n                        if (pivot._rtl) {\n                            start = selectedHeader.offsetLeft + selectedHeader.offsetWidth + headersStates.common.headerHorizontalMargin;\n                            end = pivot._headerItemsWidth - headersStates.common.getCumulativeHeaderWidth(pivot, pivot.selectedIndex) - headersStates.common.headersContainerLeadingMargin;\n                            end += parseFloat(pivot._headersContainerElement.style.marginLeft);\n                        } else {\n                            start = selectedHeader.offsetLeft;\n                            start += parseFloat(pivot._headersContainerElement.style.marginLeft); // overflow state has a hidden first element that we need to account for\n                            end = headersStates.common.getCumulativeHeaderWidth(pivot, pivot.selectedIndex) + headersStates.common.headersContainerLeadingMargin + headersStates.common.headerHorizontalMargin;\n                        }\n                        var offset = start - end;\n\n                        this.render();\n\n                        // Offset every header by the calculated offset so there is no visual difference after the render call\n                        var transformProperty = _BaseUtils._browserStyleEquivalents[\"transform\"].cssName;\n                        var transformValue = \"translateX(\" + offset + \"px)\";\n                        for (var i = 0, l = pivot._headersContainerElement.children.length; i < l; i++) {\n                            pivot._headersContainerElement.children[i].style[transformProperty] = transformValue;\n                        }\n\n                        // Transition headers back to their original location\n                        this._transitionAnimation = _TransitionAnimation.executeTransition(\n                            pivot._headersContainerElement.querySelectorAll(\".\" + Pivot._ClassName.pivotHeader), {\n                                property: transformProperty,\n                                delay: 0,\n                                duration: Pivot._headerSlideAnimationDuration,\n                                timing: \"ease-out\",\n                                to: \"\"\n                            }\n                        );\n                    }\n                }, {\n                    exit: function staticState_exit() {\n                        this._transitionAnimation.cancel();\n                    },\n\n                    render: function staticState_render() {\n                        var pivot = this.pivot;\n                        if (pivot._pendingRefresh || !pivot._items) {\n                            return;\n                        }\n\n                        _Dispose._disposeElement(pivot._headersContainerElement);\n                        _ElementUtilities.empty(pivot._headersContainerElement);\n\n                        if (pivot._rtl) {\n                            pivot._headersContainerElement.style.marginLeft = \"0px\";\n                            pivot._headersContainerElement.style.marginRight = headersStates.common.headersContainerLeadingMargin + \"px\";\n                        } else {\n                            pivot._headersContainerElement.style.marginLeft = headersStates.common.headersContainerLeadingMargin + \"px\";\n                            pivot._headersContainerElement.style.marginRight = \"0px\";\n                        }\n                        pivot._viewportElement.style.overflow = pivot.items.length === 1 ? \"hidden\" : \"\";\n\n                        if (pivot.items.length) {\n                            for (var i = 0; i < pivot.items.length; i++) {\n                                var header = headersStates.common.renderHeader(pivot, i, true);\n                                pivot._headersContainerElement.appendChild(header);\n\n                                if (i === pivot.selectedIndex) {\n                                    header.classList.add(Pivot._ClassName.pivotHeaderSelected);\n                                }\n                            }\n\n                            pivot._tabContainer.childFocus = pivot._headersContainerElement.children[pivot.selectedIndex];\n                        }\n                        this._firstRender = false;\n                    },\n\n                    activateHeader: function staticState_activateHeader(headerElement) {\n                        var currentActiveHeader = this.pivot._headersContainerElement.children[this.pivot.selectedIndex];\n                        headersStates.common.setActiveHeader(this.pivot, headerElement, currentActiveHeader);\n                        this.pivot._animateToPrevious = headerElement._pivotItemIndex < this.pivot.selectedIndex;\n                        this.pivot.selectedIndex = headerElement._pivotItemIndex;\n                    },\n\n                    handleNavigation: function staticState_handleNavigation(goPrevious, index, oldIndex) {\n                        if (this._firstRender) {\n                            this.render();\n                        }\n                        headersStates.common.setActiveHeader(this.pivot, this.pivot._headersContainerElement.children[index], this.pivot._headersContainerElement.children[oldIndex]);\n                        this.pivot._tabContainer.childFocus = this.pivot._headersContainerElement.children[index];\n                    },\n\n                    handleResize: function staticState_handleResize() {\n                        headersStates.common.refreshHeadersState(this.pivot);\n                    },\n\n                    handleHeaderChanged: function staticState_handleHeaderChanged(pivotItem) {\n                        headersStates.common.updateHeader(this.pivot, pivotItem);\n                        headersStates.common.refreshHeadersState(this.pivot, true);\n                    }\n                }),\n\n                overflowState: _Base.Class.define(function overflowState_ctor(pivot) {\n                    // This state renders the selected header always left-aligned (in ltr) and\n                    // animates the headers when the selectedIndex changes.\n\n                    this.pivot = pivot;\n                    this._blocked = false;\n                    this._firstRender = true;\n                    this._transitionAnimation = Promise.wrap();\n                    pivot._slideHeadersAnimation = Promise.wrap();\n\n                    if (pivot._headersContainerElement.children.length && _TransitionAnimation.isAnimationEnabled()) {\n                        // We transitioned from another headers state, do transition animation\n                        var that = this;\n                        var done = function () {\n                            that._blocked = false;\n                            that.render();\n                        };\n                        this._blocked = true;\n\n                        // Calculate the offset from the selected header to the leading edge of the container\n                        var selectedHeader = pivot._headersContainerElement.querySelector(\".\" + Pivot._ClassName.pivotHeaderSelected);\n                        var start = 0;\n                        var end = 0;\n                        if (pivot._rtl) {\n                            start = pivot._headerItemsWidth - headersStates.common.headersContainerLeadingMargin;\n                            end = selectedHeader.offsetLeft;\n                            end += headersStates.common.headerHorizontalMargin;\n                            end += selectedHeader.offsetWidth;\n                            end += parseFloat(pivot._headersContainerElement.style.marginLeft);\n                        } else {\n                            start = headersStates.common.headersContainerLeadingMargin;\n                            end = selectedHeader.offsetLeft;\n                            end -= headersStates.common.headerHorizontalMargin;\n                            end += parseFloat(pivot._headersContainerElement.style.marginLeft);\n                        }\n                        var offset = start - end;\n\n                        // Duplicate all the headers up to the selected header so when the transition occurs there will be\n                        // headers on the trailing end of the container to replace the ones that are being transitioned off-screen\n                        for (var i = 0; i < pivot.selectedIndex; i++) {\n                            pivot._headersContainerElement.appendChild(pivot._headersContainerElement.children[i].cloneNode(true));\n                        }\n\n                        // Transition headers to the leading edge of the container, then render the container as usual\n                        var transformProperty = _BaseUtils._browserStyleEquivalents[\"transform\"].cssName;\n                        this._transitionAnimation = _TransitionAnimation.executeTransition(\n                            pivot._headersContainerElement.querySelectorAll(\".\" + Pivot._ClassName.pivotHeader), {\n                                property: transformProperty,\n                                delay: 0,\n                                duration: Pivot._headerSlideAnimationDuration,\n                                timing: \"ease-out\",\n                                to: \"translateX(\" + offset + \"px)\"\n                            }).then(done, done);\n                    }\n                }, {\n                    exit: function overflowState_exit() {\n                        this._transitionAnimation.cancel();\n                        this.pivot._slideHeadersAnimation.cancel();\n                    },\n\n                    render: function overflowState_render(goPrevious) {\n                        var pivot = this.pivot;\n                        if (this._blocked || pivot._pendingRefresh || !pivot._items) {\n                            return;\n                        }\n\n                        var restoreFocus = pivot._headersContainerElement.contains(_Global.document.activeElement);\n\n                        _Dispose._disposeElement(pivot._headersContainerElement);\n                        _ElementUtilities.empty(pivot._headersContainerElement);\n\n\n                        if (pivot._items.length === 1) {\n                            var header = headersStates.common.renderHeader(pivot, 0, true);\n                            header.classList.add(Pivot._ClassName.pivotHeaderSelected);\n                            pivot._headersContainerElement.appendChild(header);\n\n                            pivot._viewportElement.style.overflow = \"hidden\";\n                            pivot._headersContainerElement.style.marginLeft = \"0px\";\n                            pivot._headersContainerElement.style.marginRight = \"0px\";\n                        } else if (pivot._items.length > 1) {\n                            // We always render 1 additional header before the current item.\n                            // When going backwards, we render 2 additional headers, the first one as usual, and the second one for\n                            // fading out the previous last header.\n                            var numberOfHeadersToRender = pivot._items.length + (goPrevious ? 2 : 1);\n                            var maxHeaderWidth = pivot._headerItemsWidth * 0.8;\n                            var indexToRender = pivot.selectedIndex - 1;\n\n                            if (pivot._viewportElement.style.overflow) {\n                                pivot._viewportElement.style.overflow = \"\";\n                            }\n\n                            for (var i = 0; i < numberOfHeadersToRender; i++) {\n                                if (indexToRender === -1) {\n                                    indexToRender = pivot._items.length - 1;\n                                } else if (indexToRender === pivot._items.length) {\n                                    indexToRender = 0;\n                                }\n\n                                var header = headersStates.common.renderHeader(pivot, indexToRender, true);\n                                pivot._headersContainerElement.appendChild(header);\n\n                                if (header.offsetWidth > maxHeaderWidth) {\n                                    header.style.textOverflow = \"ellipsis\";\n                                    header.style.width = maxHeaderWidth + \"px\";\n                                }\n\n                                if (indexToRender === pivot.selectedIndex) {\n                                    header.classList.add(Pivot._ClassName.pivotHeaderSelected);\n                                }\n                                indexToRender++;\n                            }\n                            if (!pivot._firstLoad && !this._firstRender) {\n                                var start, end;\n                                if (goPrevious) {\n                                    start = \"\";\n                                    end = \"0\";\n                                } else {\n                                    start = \"0\";\n                                    end = \"\";\n                                }\n\n                                var lastHeader = pivot._headersContainerElement.children[numberOfHeadersToRender - 1];\n                                lastHeader.style.opacity = start;\n                                var lastHeaderFadeInDuration = 0.167;\n                                lastHeader.style[_BaseUtils._browserStyleEquivalents[\"transition\"].scriptName] = \"opacity \" + _TransitionAnimation._animationTimeAdjustment(lastHeaderFadeInDuration) + \"s\";\n                                _Global.getComputedStyle(lastHeader).opacity;\n                                lastHeader.style.opacity = end;\n                            }\n\n                            pivot._headersContainerElement.children[0].setAttribute(\"aria-hidden\", \"true\");\n                            pivot._headersContainerElement.style.marginLeft = \"0px\";\n                            pivot._headersContainerElement.style.marginRight = \"0px\";\n                            var leadingMargin = pivot._rtl ? \"marginRight\" : \"marginLeft\";\n                            var firstHeader = pivot._headersContainerElement.children[0];\n                            var leadingSpace = _ElementUtilities.getTotalWidth(firstHeader) - headersStates.common.headersContainerLeadingMargin;\n                            if (firstHeader !== pivot._headersContainerElement.children[0]) {\n                                // Calling getTotalWidth caused a layout which can trigger a synchronous resize which in turn\n                                // calls renderHeaders. We can ignore this one since its the old headers which are not in the DOM.\n                                return;\n                            }\n                            pivot._headersContainerElement.style[leadingMargin] = (-1 * leadingSpace) + \"px\";\n\n                            // Create header track nav button elements\n                            pivot._prevButton = _Global.document.createElement(\"button\");\n                            pivot._prevButton.setAttribute(\"type\", \"button\");\n                            _ElementUtilities.addClass(pivot._prevButton, Pivot._ClassName.pivotNavButton);\n                            _ElementUtilities.addClass(pivot._prevButton, Pivot._ClassName.pivotNavButtonPrev);\n                            pivot._prevButton.addEventListener(\"click\", function () {\n                                if (pivot.locked) {\n                                    return;\n                                }\n                                pivot._rtl ? pivot._goNext() : pivot._goPrevious();\n                            });\n                            pivot._headersContainerElement.appendChild(pivot._prevButton);\n                            pivot._prevButton.style.left = pivot._rtl ? \"0px\" : leadingSpace + \"px\";\n\n                            pivot._nextButton = _Global.document.createElement(\"button\");\n                            pivot._nextButton.setAttribute(\"type\", \"button\");\n                            _ElementUtilities.addClass(pivot._nextButton, Pivot._ClassName.pivotNavButton);\n                            _ElementUtilities.addClass(pivot._nextButton, Pivot._ClassName.pivotNavButtonNext);\n                            pivot._nextButton.addEventListener(\"click\", function () {\n                                if (pivot.locked) {\n                                    return;\n                                }\n                                pivot._rtl ? pivot._goPrevious() : pivot._goNext();\n                            });\n                            pivot._headersContainerElement.appendChild(pivot._nextButton);\n                            pivot._nextButton.style.right = pivot._rtl ? leadingSpace + \"px\" : \"0px\";\n                        }\n                        var firstHeaderIndex = pivot._headersContainerElement.children.length > 1 ? 1 : 0;\n                        pivot._tabContainer.childFocus = pivot._headersContainerElement.children[firstHeaderIndex];\n                        if (restoreFocus) {\n                            pivot._headersContainerElement.focus();\n                        }\n                        this._firstRender = false;\n                    },\n\n                    activateHeader: function overflowState_activateHeader(headerElement) {\n                        if (!headerElement.previousSibling) {\n                            // prevent clicking the previous header\n                            return;\n                        }\n                        this.pivot.selectedIndex = headerElement._pivotItemIndex;\n                    },\n\n                    handleNavigation: function overflowState_handleNavigation(goPrevious, index, oldIndex) {\n                        var pivot = this.pivot;\n                        if (this._blocked || index < 0 || pivot._firstLoad) {\n                            this.render(goPrevious);\n                            return;\n                        }\n\n                        var targetHeader;\n\n                        if (goPrevious) {\n                            targetHeader = pivot._headersContainerElement.children[0];\n                        } else {\n                            if (index < oldIndex) {\n                                index += pivot._items.length;\n                            }\n                            targetHeader = pivot._headersContainerElement.children[1 + index - oldIndex];\n                        }\n\n                        if (!targetHeader) {\n                            this.render(goPrevious);\n                            return;\n                        }\n\n                        // Update the selected one:\n                        _ElementUtilities.removeClass(pivot._headersContainerElement.children[1], Pivot._ClassName.pivotHeaderSelected);\n                        _ElementUtilities.addClass(targetHeader, Pivot._ClassName.pivotHeaderSelected);\n\n                        var rtl = pivot._rtl;\n\n                        function offset(element) {\n                            if (rtl) {\n                                return element.offsetParent.offsetWidth - element.offsetLeft - element.offsetWidth;\n                            } else {\n                                return element.offsetLeft;\n                            }\n                        }\n\n                        var endPosition = offset(pivot._headersContainerElement.children[1]) - offset(targetHeader);\n                        if (rtl) {\n                            endPosition *= -1;\n                        }\n\n                        function headerCleanup() {\n                            if (pivot._disposed) {\n                                return;\n                            }\n\n                            pivot._headersState.render(goPrevious);\n                            pivot._slideHeadersAnimation = Promise.wrap();\n                        }\n\n                        var headerAnimation;\n                        if (_TransitionAnimation.isAnimationEnabled()) {\n                            headerAnimation = _TransitionAnimation.executeTransition(\n                            pivot._headersContainerElement.querySelectorAll(\".\" + Pivot._ClassName.pivotHeader),\n                            {\n                                property: _BaseUtils._browserStyleEquivalents[\"transform\"].cssName,\n                                delay: 0,\n                                duration: Pivot._headerSlideAnimationDuration,\n                                timing: \"ease-out\",\n                                to: \"translateX(\" + endPosition + \"px)\"\n                            });\n                        } else {\n                            headerAnimation = Promise.wrap();\n                        }\n\n                        pivot._slideHeadersAnimation = headerAnimation.then(headerCleanup, headerCleanup);\n                    },\n\n                    handleResize: function overflowState_handleResize() {\n                        headersStates.common.refreshHeadersState(this.pivot);\n                    },\n\n                    handleHeaderChanged: function overflowState_handleHeaderChanged(pivotItem) {\n                        this.render();\n                        headersStates.common.refreshHeadersState(this.pivot, true);\n                    }\n                })\n            };\n\n            var Pivot = _Base.Class.define(function Pivot_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Pivot.Pivot\">\n                /// <summary locid=\"WinJS.UI.Pivot.constructor\">\n                /// Creates a new Pivot control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.Pivot.constructor_p:element\">\n                /// The DOM element that hosts the Pivot control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.Pivot.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the index changed event,\n                /// add a property named \"onselectionchanged\" to the options object and set its value to the event handler.\n                /// </param>\n                /// <returns type=\"WinJS.UI.Pivot\" locid=\"WinJS.UI.Pivot.constructor_returnValue\">\n                /// The new Pivot.\n                /// </returns>\n                /// </signature>\n                element = element || _Global.document.createElement(\"DIV\");\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.Pivot.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                this._handleItemChangedBound = this._handleItemChanged.bind(this);\n                this._handleItemInsertedBound = this._handleItemInserted.bind(this);\n                this._handleItemMovedBound = this._handleItemMoved.bind(this);\n                this._handleItemRemovedBound = this._handleItemRemoved.bind(this);\n                this._handleItemReloadBound = this._handleItemReload.bind(this);\n\n                this._id = element.id || _ElementUtilities._uniqueID(element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                this._element = element;\n                if (!supportsSnap) {\n                    _ElementUtilities.addClass(this.element, Pivot._ClassName.pivotNoSnap);\n                }\n                this._element.setAttribute('role', 'tablist');\n                if (!this._element.getAttribute(\"aria-label\")) {\n                    this._element.setAttribute('aria-label', strings.pivotAriaLabel);\n                }\n                _ElementUtilities.addClass(this.element, Pivot._ClassName.pivot);\n                _ElementUtilities.addClass(this.element, \"win-disposable\");\n                _ElementUtilities._addEventListener(this.element, \"pointerenter\", this._updatePointerType.bind(this));\n                _ElementUtilities._addEventListener(this.element, \"pointerout\", this._updatePointerType.bind(this));\n                this._pointerType = PT_MOUSE;\n\n                // Title element\n                this._titleElement = _Global.document.createElement(\"DIV\");\n                this._titleElement.style.display = \"none\";\n                _ElementUtilities.addClass(this._titleElement, Pivot._ClassName.pivotTitle);\n                this._element.appendChild(this._titleElement);\n\n                // Header Area\n                this._headerAreaElement = _Global.document.createElement(\"DIV\");\n                _ElementUtilities.addClass(this._headerAreaElement, Pivot._ClassName.pivotHeaderArea);\n                this._element.appendChild(this._headerAreaElement);\n\n                // Header Items\n                this._headerItemsElement = _Global.document.createElement(\"DIV\");\n                _ElementUtilities.addClass(this._headerItemsElement, Pivot._ClassName.pivotHeaderItems);\n                this._headerAreaElement.appendChild(this._headerItemsElement);\n                this._headerItemsElWidth = null;\n\n                // Headers Container\n                this._headersContainerElement = _Global.document.createElement(\"DIV\");\n                this._headersContainerElement.tabindex = 0;\n                _ElementUtilities.addClass(this._headersContainerElement, Pivot._ClassName.pivotHeaders);\n                this._headersContainerElement.addEventListener(\"keydown\", this._headersKeyDown.bind(this));\n                this._headerItemsElement.appendChild(this._headersContainerElement);\n                this._element.addEventListener('click', this._elementClickedHandler.bind(this));\n                _ElementUtilities._addEventListener(this._element, \"pointerdown\", this._elementPointerDownHandler.bind(this));\n                _ElementUtilities._addEventListener(this._element, \"pointerup\", this._elementPointerUpHandler.bind(this));\n                _ElementUtilities._addEventListener(this._headersContainerElement, \"pointerenter\", this._showNavButtons.bind(this));\n                _ElementUtilities._addEventListener(this._headersContainerElement, \"pointerout\", this._hideNavButtons.bind(this));\n                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._headersContainerElement);\n                this._tabContainer = new _TabContainer.TabContainer(this._headersContainerElement);\n\n                // Custom Headers\n                this._customLeftHeader = _Global.document.createElement(\"DIV\");\n                _ElementUtilities.addClass(this._customLeftHeader, Pivot._ClassName.pivotHeaderLeftCustom);\n                this._headerAreaElement.insertBefore(this._customLeftHeader, this._headerAreaElement.children[0]);\n                this._customRightHeader = _Global.document.createElement(\"DIV\");\n                _ElementUtilities.addClass(this._customRightHeader, Pivot._ClassName.pivotHeaderRightCustom);\n                this._headerAreaElement.appendChild(this._customRightHeader);\n\n                // Viewport\n                this._viewportElement = _Global.document.createElement(\"DIV\");\n                this._viewportElement.className = Pivot._ClassName.pivotViewport;\n                this._element.appendChild(this._viewportElement);\n                this._viewportElement.setAttribute(\"role\", \"group\");\n                this._viewportElement.setAttribute(\"aria-label\", strings.pivotViewportAriaLabel);\n                this._resizeHandlerBound = this._resizeHandler.bind(this);\n                this.element.addEventListener(\"mselementresize\", this._resizeHandlerBound);\n                _ElementUtilities._resizeNotifier.subscribe(this.element, this._resizeHandlerBound);\n                this._viewportElWidth = null;\n                this._viewportElement.addEventListener(\"scroll\", this._scrollHandler.bind(this));\n                this._viewportElement.addEventListener(\"MSManipulationStateChanged\", this._MSManipulationStateChangedHandler.bind(this));\n                _ElementUtilities._addEventListener(this._viewportElement, \"pointerdown\", this._pointerDownHandler.bind(this));\n\n                // Surface\n                this._surfaceElement = _Global.document.createElement(\"DIV\");\n                this._surfaceElement.className = Pivot._ClassName.pivotSurface;\n                this._viewportElement.appendChild(this._surfaceElement);\n\n                this._offsetFromCenter = 0;\n                this._currentIndexOnScreen = 0;\n                this._loadId = 0;\n                this._navMode = Pivot._NavigationModes.none;\n                this._currentManipulationState = MSManipulationEventStates.MS_MANIPULATION_STATE_STOPPED;\n                this._headersState = headersStates.nop;\n\n                // This internally assigns this.items which causes item to be used (even from options) before selectedIndex\n                this._parse();\n\n                options = _BaseUtils._shallowCopy(options);\n                if (options.items) {\n                    // Set this first so selectedIndex and selectedItem can work against the new items.\n                    this.items = options.items;\n                    delete options.items;\n                }\n\n                _Control.setOptions(this, options);\n\n                this._refresh();\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.Pivot.element\" helpKeyword=\"WinJS.UI.Pivot.element\">\n                /// Gets the DOM element that hosts the Pivot.\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.Pivot.customLeftHeader\" helpKeyword=\"WinJS.UI.Pivot.customLeftHeader\">\n                /// Gets or sets the left custom header.\n                /// </field>\n                customLeftHeader: {\n                    get: function () {\n                        return this._customLeftHeader.firstElementChild;\n                    },\n                    set: function (value) {\n                        _ElementUtilities.empty(this._customLeftHeader);\n                        this._customLeftHeader.appendChild(value);\n                        this.forceLayout();\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.Pivot.customRightHeader\" helpKeyword=\"WinJS.UI.Pivot.customRightHeader\">\n                /// Gets or sets the right custom header.\n                /// </field>\n                customRightHeader: {\n                    get: function () {\n                        return this._customRightHeader.firstElementChild;\n                    },\n                    set: function (value) {\n                        _ElementUtilities.empty(this._customRightHeader);\n                        this._customRightHeader.appendChild(value);\n                        this.forceLayout();\n                        \n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.Pivot.locked\" helpKeyword=\"WinJS.UI.Pivot.locked\">\n                /// Gets or sets a value that specifies whether the Pivot is locked to the current item.\n                /// </field>\n                locked: {\n                    get: function () {\n                        return _ElementUtilities.hasClass(this.element, Pivot._ClassName.pivotLocked);\n                    },\n                    set: function (value) {\n                        _ElementUtilities[value ? 'addClass' : 'removeClass'](this.element, Pivot._ClassName.pivotLocked);\n                        if (value) {\n                            this._hideNavButtons();\n                        }\n                    }\n                },\n\n                /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.UI.Pivot.items\" helpKeyword=\"WinJS.UI.Pivot.items\">\n                /// Gets or sets the WinJS.Binding.List of PivotItem objects that belong to this Pivot.\n                /// </field>\n                items: {\n                    get: function () {\n                        if (this._pendingItems) {\n                            return this._pendingItems;\n                        }\n                        return this._items;\n                    },\n                    set: function (value) {\n                        var resetScrollPosition = !this._pendingItems;\n                        this._pendingItems = value;\n                        this._refresh();\n                        if (resetScrollPosition) {\n                            this._pendingIndexOnScreen = 0;\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.Pivot.title\" helpKeyword=\"WinJS.UI.Pivot.title\">\n                /// Gets or sets the title of the Pivot.\n                /// </field>\n                title: {\n                    get: function () {\n                        return this._titleElement.textContent;\n                    },\n                    set: function (value) {\n                        if (value) {\n                            this._titleElement.style.display = \"block\";\n                            this._titleElement.textContent = value;\n                        } else {\n                            this._titleElement.style.display = \"none\";\n                            this._titleElement.textContent = \"\";\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.Pivot.selectedIndex\" helpKeyword=\"WinJS.UI.Pivot.selectedIndex\">\n                /// Gets or sets the index of the item in view. This property is useful for restoring a previous view when your app launches or resumes.\n                /// </field>\n                selectedIndex: {\n                    get: function () {\n                        if (this.items.length === 0) {\n                            return -1;\n                        }\n\n                        if (+this._pendingIndexOnScreen === this._pendingIndexOnScreen) {\n                            return this._pendingIndexOnScreen;\n                        }\n\n                        return this._currentIndexOnScreen;\n                    },\n                    set: function (value) {\n                        if (value >= 0 && value < this.items.length) {\n                            if (this._pendingRefresh) {\n                                this._pendingIndexOnScreen = value;\n                            } else {\n                                this._navMode = this._navMode || Pivot._NavigationModes.api;\n                                this._loadItem(value);\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"WinJS.UI.PivotItem\" locid=\"WinJS.UI.Pivot.selectedItem\" helpKeyword=\"WinJS.UI.Pivot.selectedItem\">\n                /// Gets or sets the item in view. This property is useful for restoring a previous view when your app launches or resumes.\n                /// </field>\n                selectedItem: {\n                    get: function () {\n                        return this.items.getAt(this.selectedIndex);\n                    },\n                    set: function (value) {\n                        var index = this.items.indexOf(value);\n                        if (index !== -1) {\n                            this.selectedIndex = index;\n                        }\n                    }\n                },\n\n                dispose: function pivot_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.Pivot.dispose\">\n                    /// <summary locid=\"WinJS.UI.Pivot.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    this._updateEvents(this._items);\n                    _ElementUtilities._resizeNotifier.unsubscribe(this.element, this._resizeHandlerBound);\n                    this._headersState.exit();\n\n                    _Dispose._disposeElement(this._headersContainerElement);\n\n                    for (var i = 0, len = this.items.length; i < len; i++) {\n                        this.items.getAt(i).dispose();\n                    }\n                },\n\n                forceLayout: function pivot_forceLayout() {\n                    /// <signature helpKeyword=\"WinJS.UI.Pivot.forceLayout\">\n                    /// <summary locid=\"WinJS.UI.Pivot.forceLayout\">\n                    /// Forces the control to relayout its content. This function is expected to be called\n                    /// when the pivot element is manually resized.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._resizeHandler();\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Pivot.onselectionchanged\" helpKeyword=\"WinJS.UI.Pivot.onselectionchanged\">\n                /// Raised when the user changes to a different item.\n                /// </field>\n                onselectionchanged: createEvent(eventNames.selectionChanged),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Pivot.onitemanimationstart\" helpKeyword=\"WinJS.UI.Pivot.onitemanimationstart\">\n                /// Raised when the item's animation starts.\n                /// </field>\n                onitemanimationstart: createEvent(eventNames.itemAnimationStart),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Pivot.onitemanimationend\" helpKeyword=\"WinJS.UI.Pivot.onitemanimationend\">\n                /// Raised when the item's animation ends.\n                /// </field>\n                onitemanimationend: createEvent(eventNames.itemAnimationEnd),\n\n                _currentScrollTargetLocation: {\n                    get: function () {\n                        if (this._viewportWidth === Pivot._invalidViewportWidth) {\n                            // ViewportWidth is invalid, this means that the pivot has not been measured yet. This is either because\n                            // the pivot is not in the DOM, or there is a pending refresh operation.\n                            return 0;\n                        }\n\n                        // 49 pages before + current one is 50. There are also 50 afterwards.\n                        return (50 + this._offsetFromCenter) * Math.ceil(this._viewportWidth);\n                    }\n                },\n\n                _pointerType: {\n                    get: function () {\n                        return this._pointerTypeValue;\n                    },\n                    set: function (value) {\n                        if (this._pointerTypeValue === value) {\n                            return;\n                        }\n\n                        this._pointerTypeValue = value;\n                        if (value === PT_TOUCH) {\n                            _ElementUtilities.removeClass(this.element, Pivot._ClassName.pivotInputTypeMouse);\n                            _ElementUtilities.addClass(this.element, Pivot._ClassName.pivotInputTypeTouch);\n                            this._hideNavButtons();\n                        } else {\n                            _ElementUtilities.removeClass(this.element, Pivot._ClassName.pivotInputTypeTouch);\n                            _ElementUtilities.addClass(this.element, Pivot._ClassName.pivotInputTypeMouse);\n                        }\n                    }\n                },\n\n                _rtl: {\n                    get: function () {\n                        return this._cachedRTL;\n                    }\n                },\n\n                _headerItemsWidth: {\n                    get: function () {\n                        if (!this._headerItemsElWidth) {\n                            this._headerItemsElWidth = parseFloat(_Global.getComputedStyle(this._headerItemsElement).width);\n                        }\n                        return this._headerItemsElWidth || Pivot._invalidViewportWidth;\n                    },\n                },\n\n                _viewportWidth: {\n                    get: function () {\n                        if (!this._viewportElWidth) {\n                            this._viewportElWidth = parseFloat(_Global.getComputedStyle(this._viewportElement).width);\n                            if (supportsSnap) {\n                                this._viewportElement.style[_BaseUtils._browserStyleEquivalents[\"scroll-snap-points-x\"].scriptName] = \"snapInterval(0%, \" + Math.ceil(this._viewportElWidth) + \"px)\";\n                            }\n                        }\n                        return this._viewportElWidth || Pivot._invalidViewportWidth;\n                    },\n                },\n\n                _invalidateMeasures: function pivot_invalidateMeasures() {\n                    this._viewportElWidth = this._headerItemsElWidth = null;\n                },\n\n                // Lifecycle\n                _applyProperties: function pivot_applyProperties() {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    if (this._pendingItems) {\n                        this._updateEvents(this._items, this._pendingItems);\n                        this._items = this._pendingItems;\n                        this._pendingItems = null;\n                        // Remove any declaratively specified pivot items before attachItems.\n                        while (this.element.firstElementChild !== this._titleElement) {\n                            var toRemove = this.element.firstElementChild;\n                            toRemove.parentNode.removeChild(toRemove);\n                        }\n                        _ElementUtilities.empty(this._surfaceElement);\n                    }\n\n                    this._attachItems();\n\n                    var pendingIndexOnScreen = this._pendingIndexOnScreen;\n                    this._pendingIndexOnScreen = null;\n                    this._currentIndexOnScreen = 0;\n                    this._firstLoad = true;\n                    this._cachedRTL = _Global.getComputedStyle(this._element, null).direction === \"rtl\";\n                    headersStates.common.refreshHeadersState(this, true);\n                    this._pendingRefresh = false;\n\n                    this.selectedIndex = Math.min(pendingIndexOnScreen, this.items.length - 1);\n                    this._firstLoad = false;\n                    this._recenterUI();\n                },\n\n                _attachItems: function pivot_attachItems() {\n                    this._measured = false;\n                    for (var i = 0, len = this.items.length; i < len; i++) {\n                        var item = this._items.getAt(i);\n\n                        if (item.element.parentNode === this._surfaceElement) {\n                            throw new _ErrorFromName(\"WinJS.UI.Pivot.DuplicateItem\", strings.duplicateItem);\n                        }\n\n                        item.element.style.visibility = \"hidden\";\n                        item.element.style.opacity = 0;\n\n                        this._surfaceElement.appendChild(item.element);\n                    }\n                },\n\n                _parse: function pivot_parse() {\n                    var pivotItems = [];\n                    var pivotItemEl = this.element.firstElementChild;\n\n                    while (pivotItemEl !== this._titleElement) {\n                        ControlProcessor.processAll(pivotItemEl);\n\n                        var pivotItemContent = pivotItemEl.winControl;\n                        if (pivotItemContent) {\n                            pivotItems.push(pivotItemContent);\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.UI.Pivot.InvalidContent\", strings.invalidContent);\n                        }\n\n                        var nextItemEl = pivotItemEl.nextElementSibling;\n                        pivotItemEl = nextItemEl;\n                    }\n\n                    this.items = new BindingList.List(pivotItems);\n                },\n\n                _refresh: function pivot_refresh() {\n                    if (this._pendingRefresh) {\n                        return;\n                    }\n\n                    // This is to coalesce property setting operations such as items and scrollPosition.\n                    this._pendingRefresh = true;\n\n                    Scheduler.schedule(this._applyProperties.bind(this), Scheduler.Priority.high);\n                },\n\n                _resizeHandler: function pivot_resizeHandler() {\n                    if (this._disposed || this._pendingRefresh) {\n                        return;\n                    }\n\n                    var oldViewportWidth = this._viewportWidth;\n                    var oldHeaderItemsWidth = this._headerItemsWidth;\n                    // Invalidate the viewportWidth and header items width, note that _viewportWidth and _headerItemsWidth are\n                    // private properties that remeasure their values on access when their current value is null\n                    this._invalidateMeasures();\n                    if (oldViewportWidth !== this._viewportWidth || oldHeaderItemsWidth !== this._headerItemsWidth) {\n                        _Log.log && _Log.log('_resizeHandler from:' + oldViewportWidth + \" to: \" + this._viewportWidth);\n\n                        this._hidePivotItemAnimation && this._hidePivotItemAnimation.cancel();\n                        this._showPivotItemAnimation && this._showPivotItemAnimation.cancel();\n                        this._slideHeadersAnimation && this._slideHeadersAnimation.cancel();\n\n                        this._recenterUI();\n                        this._headersState.handleResize();\n                    } else {\n                        _Log.log && _Log.log('_resizeHandler worthless resize');\n                    }\n                },\n\n\n                // Navigation\n                _activateHeader: function pivot_activateHeader(headerElement) {\n                    if (this.locked) {\n                        return;\n                    }\n\n                    var index = this._items.indexOf(headerElement._item);\n                    if (index !== this.selectedIndex) {\n                        this._headersState.activateHeader(headerElement);\n                    } else {\n                        // Move focus into content for Narrator.\n                        _ElementUtilities._setActiveFirstFocusableElement(this.selectedItem.element);\n                    }\n                },\n\n                _goNext: function pivot_goNext() {\n                    if (this.selectedIndex < this._items.length - 1) {\n                        this.selectedIndex++;\n                    } else {\n                        this.selectedIndex = 0;\n                    }\n                },\n\n                _goPrevious: function pivot_goPrevious() {\n                    this._animateToPrevious = true;\n                    if (this.selectedIndex > 0) {\n                        this.selectedIndex--;\n                    } else {\n                        this.selectedIndex = this._items.length - 1;\n                    }\n                    this._animateToPrevious = false;\n                },\n\n                _loadItem: function pivot_loadItem(index) {\n                    var goPrevious = this._animateToPrevious;\n                    this._cachedRTL = _Global.getComputedStyle(this._element, null).direction === \"rtl\";\n                    this._loadId++;\n                    var loadId = this._loadId;\n\n                    this._hidePivotItemAnimation && this._hidePivotItemAnimation.cancel();\n                    this._showPivotItemAnimation && this._showPivotItemAnimation.cancel();\n                    this._slideHeadersAnimation && this._slideHeadersAnimation.cancel();\n\n                    if (this._currentItem) {\n                        // Hide existing item\n                        this._hidePivotItem(this._currentItem.element, goPrevious);\n                    }\n\n                    var oldIndex = this._currentIndexOnScreen;\n                    this._currentIndexOnScreen = index;\n                    this._headersState.handleNavigation(goPrevious, index, oldIndex);\n\n                    if (index < 0) {\n                        return;\n                    }\n\n                    // Get next item\n                    var item = this._items.getAt(index);\n                    this._currentItem = item;\n\n                    if (goPrevious) {\n                        this._offsetFromCenter--;\n                    } else if (index !== oldIndex) {\n                        this._offsetFromCenter++;\n                    }\n\n                    var zooming = false;\n                    if (supportsSnap && this._currentManipulationState !== MSManipulationEventStates.MS_MANIPULATION_STATE_INERTIA) {\n                        if (this._firstLoad) {\n                            _Log.log && _Log.log('_firstLoad index:' + this.selectedIndex + ' offset: ' + this._offsetFromCenter + ' scrollLeft: ' + this._currentScrollTargetLocation, \"winjs pivot\", \"log\");\n                            _ElementUtilities.setScrollPosition(this._viewportElement, { scrollLeft: this._currentScrollTargetLocation });\n                        } else {\n                            _Log.log && _Log.log('zoomTo index:' + this.selectedIndex + ' offset: ' + this._offsetFromCenter + ' scrollLeft: ' + this._currentScrollTargetLocation, \"winjs pivot\", \"log\");\n                            this._viewportElement.msZoomTo({ contentX: this._currentScrollTargetLocation, contentY: 0, viewportX: 0, viewportY: 0 });\n                            zooming = this._offsetFromCenter !== 0 && this.items.length > 1;\n                        }\n                    }\n\n                    var that = this;\n                    var selectionChangedDetail = {\n                        index: index,\n                        direction: goPrevious ? \"backwards\" : \"forward\",\n                        item: item\n                    };\n                    this._writeProfilerMark(\"selectionChanged,info\");\n                    this._fireEvent(Pivot._EventName.selectionChanged, true, false, selectionChangedDetail);\n\n                    // Start it hidden until it is loaded\n                    item._process().then(function () {\n                        if (that._disposed || loadId !== that._loadId) {\n                            return;\n                        }\n                        if (supportsSnap) {\n                            // Position item:\n                            item.element.style[that._getDirectionAccessor()] = that._currentScrollTargetLocation + \"px\";\n                            that._showPivotItem(item.element, goPrevious);\n                        } else {\n                            // Since we aren't msZoomTo'ing when snap points aren't supported, both the show and hide animations would be\n                            // executing on top of each other which produces undesirable visuals. Here we wait for the hide to finish before showing.\n                            if (that._hidePivotItemAnimation) {\n                                that._showPivotItemAnimation = that._hidePivotItemAnimation.then(function () {\n                                    if (that._disposed || loadId !== that._loadId) {\n                                        return;\n                                    }\n                                    return that._showPivotItem(item.element, goPrevious);\n                                });\n                            } else {\n                                // During the very first load or when the hide animation is canceled, we just show the pivot item immediately.\n                                that._showPivotItem(item.element, goPrevious);\n                            }\n                        }\n\n                        var recenterPromise;\n                        if (zooming) {\n                            if (!that._stoppedAndRecenteredSignal) {\n                                that._stoppedAndRecenteredSignal = new _Signal();\n                            }\n                            recenterPromise = that._stoppedAndRecenteredSignal.promise;\n                        } else {\n                            recenterPromise = (that._stoppedAndRecenteredSignal && that._stoppedAndRecenteredSignal.promise) || Promise.wrap();\n                        }\n                        Promise.join([that._slideHeadersAnimation, that._showPivotItemAnimation, that._hidePivotItemAnimation]).then(function () {\n                            recenterPromise.then(function () {\n                                Promise.timeout(50).then(function () {\n                                    if (that._disposed || loadId !== that._loadId) {\n                                        return;\n                                    }\n                                    that._navMode = Pivot._NavigationModes.none;\n\n                                    // Fire event even if animation didn't occur:\n                                    that._writeProfilerMark(\"itemAnimationStop,info\");\n                                    that._fireEvent(Pivot._EventName.itemAnimationEnd, true);\n                                });\n                            });\n                        });\n                    });\n                },\n\n                _MSManipulationStateChangedHandler: function pivot_MSManipulationStateChangedHandler(ev) {\n                    this._currentManipulationState = ev.currentState;\n                    if (!supportsSnap || ev.target !== this._viewportElement) {\n                        // Ignore sub scroller manipulations.\n                        return;\n                    }\n                    if (this._currentManipulationState === MSManipulationEventStates.MS_MANIPULATION_STATE_STOPPED) {\n                        _Log.log && _Log.log('MSManipulation: Stopped', \"winjs pivot\", \"log\");\n                    } else if (this._currentManipulationState === MSManipulationEventStates.MS_MANIPULATION_STATE_INERTIA) {\n                        _Log.log && _Log.log('MSManipulation: Inertia', \"winjs pivot\", \"log\");\n                    } else {\n                        _Log.log && _Log.log('MSManipulation: Active', \"winjs pivot\", \"log\");\n                    }\n\n                    if (!this._stoppedAndRecenteredSignal) {\n                        this._stoppedAndRecenteredSignal = new _Signal();\n                    }\n\n                    this._manipulationRecenterPromise && this._manipulationRecenterPromise.cancel();\n\n                    if (this._currentManipulationState === MSManipulationEventStates.MS_MANIPULATION_STATE_STOPPED) {\n                        if (this._navMode === Pivot._NavigationModes.scroll) {\n                            this._scrollHandler();\n                        }\n                        this._navMode = Pivot._NavigationModes.none;\n\n                        var that = this;\n                        this._manipulationRecenterPromise = Promise._cancelBlocker(\n                            Promise.join([\n                                Scheduler.schedulePromiseNormal(null, \"WinJS.UI.Pivot._MSManipulationStateChangedHandler_animationPlaceholder\"),\n                                this._hidePivotItemAnimation,\n                                this._showPivotItemAnimation,\n                                this._slideHeadersAnimation\n                            ])\n                        ).then(function () {\n                            if (that._disposed) {\n                                return;\n                            }\n                            if (that._currentManipulationState === MSManipulationEventStates.MS_MANIPULATION_STATE_STOPPED) {\n                                // If we are still \"stopped\" we should recenter.\n                                _Log.log && _Log.log('Still in Stopped state: calling _recenterUI', \"winjs pivot\", \"log\");\n                                that._recenterUI();\n                            } else {\n                                this._stoppedAndRecenteredSignal.complete();\n                                this._stoppedAndRecenteredSignal = null;\n                            }\n                        });\n                    } else if (this._navMode !== Pivot._NavigationModes.api && this._currentManipulationState === MSManipulationEventStates.MS_MANIPULATION_STATE_INERTIA) {\n                        var destinationX = ev.inertiaDestinationX;\n                        if (+destinationX === destinationX) {\n                            _Log.log && _Log.log('MSManipulation: inertiaDestinationX: ' + destinationX);\n                            var diff = destinationX - this._currentScrollTargetLocation;\n                            if (diff > 0) {\n                                _Log.log && _Log.log('MSManipulation: Inertia diff > 1', \"winjs pivot\", \"log\");\n                                this._navMode = Pivot._NavigationModes.inertia;\n                                this._goNext();\n                            } else if (diff < 0) {\n                                _Log.log && _Log.log('MSManipulation: Stopped diff < -1', \"winjs pivot\", \"log\");\n                                this._navMode = Pivot._NavigationModes.inertia;\n                                this._goPrevious();\n                            }\n                        }\n                    }\n                },\n\n                _scrollHandler: function pivot_scrollHandler() {\n                    if (!supportsSnap || this._disposed) {\n                        return;\n                    }\n\n                    if (this._recentering && this._stoppedAndRecenteredSignal) {\n                        this._stoppedAndRecenteredSignal.complete();\n                        this._stoppedAndRecenteredSignal = null;\n                        this._recentering = false;\n                        return;\n                    }\n\n                    if (this._navMode === Pivot._NavigationModes.none || this._navMode === Pivot._NavigationModes.scroll) {\n                        this._navMode = Pivot._NavigationModes.scroll;\n                        if (this._currentManipulationState === MSManipulationEventStates.MS_MANIPULATION_STATE_STOPPED) {\n                            _Log.log && _Log.log('_scrollHandler ScrollPosition: ' + _ElementUtilities.getScrollPosition(this._viewportElement).scrollLeft, \"winjs pivot\", \"log\");\n                            // Check if narrator user panned/scrolled the Pivot and we are now at an unsupported location.\n                            var diff = _ElementUtilities.getScrollPosition(this._viewportElement).scrollLeft - this._currentScrollTargetLocation;\n                            this._cachedRTL = _Global.getComputedStyle(this._element, null).direction === \"rtl\";\n                            if (diff > 0) {\n                                _Log.log && _Log.log('_scrollHandler diff > 1: ' + diff, \"winjs pivot\", \"log\");\n                                this._goNext();\n                            } else if (diff < 0) {\n                                _Log.log && _Log.log('_scrollHandler diff < -1: ' + diff, \"winjs pivot\", \"log\");\n                                this._goPrevious();\n                            }\n                        }\n                    }\n                },\n\n                _recenterUI: function pivot_recenterUI() {\n                    if (!supportsSnap) {\n                        return;\n                    }\n\n                    this._offsetFromCenter = 0;\n\n                    if (_ElementUtilities.getScrollPosition(this._viewportElement).scrollLeft !== this._currentScrollTargetLocation) {\n                        // If recentering causes a scroll, then we need to make sure that the next\n                        // scroll event event doesn't trigger another navigation\n                        this._recentering = true;\n                        this._stoppedAndRecenteredSignal = this._stoppedAndRecenteredSignal || new _Signal();\n                    } else if (this._stoppedAndRecenteredSignal) {\n                        this._stoppedAndRecenteredSignal.complete();\n                        this._stoppedAndRecenteredSignal = null;\n                    }\n                    if (this.selectedItem) {\n                        this.selectedItem.element.style[this._getDirectionAccessor()] = this._currentScrollTargetLocation + 'px';\n                    }\n                    _Log.log && _Log.log('_recenterUI index:' + this.selectedIndex + ' offset: ' + this._offsetFromCenter + ' scrollLeft: ' + this._currentScrollTargetLocation);\n                    _ElementUtilities.setScrollPosition(this._viewportElement, { scrollLeft: this._currentScrollTargetLocation });\n                },\n\n                _hidePivotItem: function pivot_hidePivotItem(element, goPrevious) {\n                    var that = this;\n                    function cleanup() {\n                        if (that._disposed) {\n                            return;\n                        }\n\n                        that._hidePivotItemAnimation = null;\n\n                        element.style.visibility = \"hidden\";\n                        element.style.opacity = 0;\n                    }\n\n                    var negativeTransform = (this._rtl && !goPrevious) || (goPrevious && !this._rtl);\n\n                    if (_TransitionAnimation.isAnimationEnabled()) {\n                        this._hidePivotItemAnimation = Animations[negativeTransform ? \"slideRightOut\" : \"slideLeftOut\"](element);\n                    } else {\n                        this._hidePivotItemAnimation = Scheduler.schedulePromiseNormal(null, \"WinJS.UI.Pivot._hidePivotItem_animationPlaceholder\");\n                    }\n\n                    this._hidePivotItemAnimation.then(cleanup, cleanup);\n                },\n\n                _showPivotItem: function pivot_showPivotItem(element, goPrevious) {\n                    // Fire the event even if animations are disabled to enable apps to know what is happening\n                    this._writeProfilerMark(\"itemAnimationStart,info\");\n                    this._fireEvent(Pivot._EventName.itemAnimationStart, true);\n\n                    if (!_TransitionAnimation.isAnimationEnabled()) {\n                        element.style.visibility = \"\";\n                        element.style.opacity = \"\";\n                        this._showPivotItemAnimation = null;\n                        return;\n                    }\n\n                    // Find the elements to slide in\n                    var slideGroup1Els = element.querySelectorAll(\".win-pivot-slide1\");\n                    var slideGroup2Els = element.querySelectorAll(\".win-pivot-slide2\");\n                    var slideGroup3Els = element.querySelectorAll(\".win-pivot-slide3\");\n\n                    var viewportBoundingClientRect = this._viewportElement.getBoundingClientRect();\n                    function filterOnScreen(element) {\n                        var elementBoundingClientRect = element.getBoundingClientRect();\n                        // Can't check left/right since it might be scrolled off.\n                        return elementBoundingClientRect.top < viewportBoundingClientRect.bottom &&\n                            elementBoundingClientRect.bottom > viewportBoundingClientRect.top;\n                    }\n\n                    //Filter the slide groups to the elements actually on screen to avoid animating extra elements\n                    slideGroup1Els = Array.prototype.filter.call(slideGroup1Els, filterOnScreen);\n                    slideGroup2Els = Array.prototype.filter.call(slideGroup2Els, filterOnScreen);\n                    slideGroup3Els = Array.prototype.filter.call(slideGroup3Els, filterOnScreen);\n\n                    var negativeTransform = (this._rtl && !goPrevious) || (goPrevious && !this._rtl);\n\n                    element.style.visibility = \"\";\n\n                    this._showPivotItemAnimation = Animations[negativeTransform ? \"slideRightIn\" : \"slideLeftIn\"](element, slideGroup1Els, slideGroup2Els, slideGroup3Els);\n\n                    var that = this;\n                    function showCleanup() {\n                        if (that._disposed) {\n                            return;\n                        }\n\n                        that._showPivotItemAnimation = null;\n                    }\n\n                    this._showPivotItemAnimation.then(showCleanup, showCleanup);\n                    return this._showPivotItemAnimation;\n                },\n\n\n                // Input Handlers\n                _elementClickedHandler: function pivot_elementClickedHandler(ev) {\n                    if (this.locked || this._navigationHandled) {\n                        this._navigationHandled = false;\n                        return;\n                    }\n\n                    var header;\n                    var src = ev.target;\n                    if (_ElementUtilities.hasClass(src, Pivot._ClassName.pivotHeader)) {\n                        // UIA invoke clicks on the real header elements.\n                        header = src;\n                    } else {\n                        var hitSrcElement = false;\n                        var hitTargets = _ElementUtilities._elementsFromPoint(ev.clientX, ev.clientY);\n                        if (hitTargets &&\n                            // Make sure there aren't any elements obscuring the Pivot headers.\n                            // WinJS.Utilities._elementsFromPoint sorts by z order.\n                                hitTargets[0] === this._viewportElement) {\n                            for (var i = 0, len = hitTargets.length; i < len; i++) {\n                                if (hitTargets[i] === src) {\n                                    hitSrcElement = true;\n                                }\n                                if (_ElementUtilities.hasClass(hitTargets[i], Pivot._ClassName.pivotHeader)) {\n                                    header = hitTargets[i];\n                                }\n                            }\n                        }\n\n                        if (!hitSrcElement) {\n                            // The click's coordinates and source element do not correspond so we\n                            // can't trust the coordinates. Ignore the click. This case happens in\n                            // clicks triggered by UIA invoke because UIA invoke uses the top left\n                            // of the window as the coordinates of every click.\n                            header = null;\n                        }\n                    }\n\n                    if (header) {\n                        this._activateHeader(header);\n                    }\n                },\n\n                _headersKeyDown: function pivot_headersKeydown(e) {\n                    if (this.locked) {\n                        return;\n                    }\n\n                    if (e.keyCode === Keys.leftArrow || e.keyCode === Keys.pageUp) {\n                        this._rtl ? this._goNext() : this._goPrevious();\n                        e.preventDefault();\n                    } else if (e.keyCode === Keys.rightArrow || e.keyCode === Keys.pageDown) {\n                        this._rtl ? this._goPrevious() : this._goNext();\n                        e.preventDefault();\n                    }\n                },\n\n                _elementPointerDownHandler: function pivot_elementPointerDownHandler(e) {\n                    if (supportsSnap) {\n                        return;\n                    }\n                    this._elementPointerDownPoint = { x: e.clientX, y: e.clientY, type: e.pointerType || \"mouse\", time: Date.now(), inHeaders: this._headersContainerElement.contains(e.target) };\n                },\n\n                _elementPointerUpHandler: function pivot_elementPointerUpHandler(e) {\n                    if (!this._elementPointerDownPoint || this.locked) {\n                        this._elementPointerDownPoint = null;\n                        return;\n                    }\n\n                    var filterDistance = 32;\n                    var dyDxThresholdRatio = 0.4;\n\n                    var dy = Math.abs(e.clientY - this._elementPointerDownPoint.y);\n                    var dx = e.clientX - this._elementPointerDownPoint.x;\n                    var thresholdY = Math.abs(dx * dyDxThresholdRatio);\n\n                    var doSwipeDetection =\n                        // Check vertical threshold to prevent accidental swipe detection during vertical pan\n                        dy < thresholdY\n                        // Check horizontal threshold to prevent accidental swipe detection when tapping\n                        && Math.abs(dx) > filterDistance\n                        // Check that input type is Touch, however, if touch detection is not supported then we do detection for any input type\n                        && (!_ElementUtilities._supportsTouchDetection || (this._elementPointerDownPoint.type === e.pointerType && e.pointerType === PT_TOUCH))\n                        // Check if content swipe navigation is disabled, if it is we still run swipe detection if both the up and down points are in the headers container element\n                        && (!this.element.classList.contains(_Constants._ClassName.pivotDisableContentSwipeNavigation) || (this._elementPointerDownPoint.inHeaders && this._headersContainerElement.contains(e.target)));\n\n                    this._navigationHandled = false;\n                    if (doSwipeDetection) {\n                        // Swipe navigation detection\n\n                        // Simulate inertia by multiplying dx by a polynomial function of dt\n                        var dt = Date.now() - this._elementPointerDownPoint.time;\n                        dx *= Math.max(1, Math.pow(350 / dt, 2));\n                        dx = this._rtl ? -dx : dx;\n\n                        var vwDiv4 = this._viewportWidth / 4;\n                        if (dx < -vwDiv4) {\n                            this._goNext();\n                            this._navigationHandled = true;\n                        } else if (dx > vwDiv4) {\n                            this._goPrevious();\n                            this._navigationHandled = true;\n                        }\n                    }\n                    if (!this._navigationHandled) {\n                        // Detect header click\n                        var element = e.target;\n                        while (element !== null && !_ElementUtilities.hasClass(element, Pivot._ClassName.pivotHeader)) {\n                            element = element.parentElement;\n                        }\n                        if (element !== null) {\n                            this._activateHeader(element);\n                            this._navigationHandled = true;\n                        }\n                    }\n                    this._elementPointerDownPoint = null;\n                },\n\n                _hideNavButtons: function pivot_hideNavButtons(e) {\n                    if (e && this._headersContainerElement.contains(e.relatedTarget)) {\n                        // Don't hide the nav button if the pointerout event is being fired from going\n                        // from one element to another within the header track.\n                        return;\n                    }\n                    _ElementUtilities.removeClass(this._headersContainerElement, Pivot._ClassName.pivotShowNavButtons);\n                },\n\n                _pointerDownHandler: function pivot_pointerDownHandler() {\n                    _Log.log && _Log.log('_pointerDown', \"winjs pivot\", \"log\");\n                    // Don't do recentering if a finger is down.\n                    this._manipulationRecenterPromise && this._manipulationRecenterPromise.cancel();\n                    // If another finger comes down stop animations.\n                    this._slideHeadersAnimation && this._slideHeadersAnimation.cancel();\n                    this._hidePivotItemAnimation && this._hidePivotItemAnimation.cancel();\n                },\n\n                _showNavButtons: function pivot_showNavButtons(e) {\n                    if (this.locked || (e && e.pointerType === PT_TOUCH)) {\n                        return;\n                    }\n                    _ElementUtilities.addClass(this._headersContainerElement, Pivot._ClassName.pivotShowNavButtons);\n                },\n\n\n                // Datasource Mutation Handlers\n                _handleItemChanged: function pivot_handleItemChanged(ev) {\n                    // Change is triggered by binding list setAt() API.\n                    if (this._pendingItems) {\n                        return;\n                    }\n\n                    var index = ev.detail.index;\n                    var newItem = ev.detail.newValue;\n                    var oldItem = ev.detail.oldValue;\n                    if (newItem.element !== oldItem.element) {\n                        if (newItem.element.parentNode === this._surfaceElement) {\n                            throw new _ErrorFromName(\"WinJS.UI.Pivot.DuplicateItem\", strings.duplicateItem);\n                        }\n\n                        newItem.element.style.visibility = \"hidden\";\n                        newItem.element.style.opacity = 0;\n\n                        this._surfaceElement.insertBefore(newItem.element, oldItem.element);\n                        this._surfaceElement.removeChild(oldItem.element);\n\n                        if (index === this._currentIndexOnScreen) {\n                            this.selectedIndex = this._currentIndexOnScreen;\n                        }\n                    }\n\n                    this._headersState.render();\n                    headersStates.common.refreshHeadersState(this, true);\n                },\n\n                _handleItemInserted: function pivot_handleItemInserted(ev) {\n                    // Insert is triggered by binding list insert APIs such as splice(), push(), and unshift().\n                    if (this._pendingItems) {\n                        return;\n                    }\n\n                    var index = ev.detail.index;\n                    var item = ev.detail.value;\n\n                    if (item.element.parentNode === this._surfaceElement) {\n                        throw new _ErrorFromName(\"WinJS.UI.Pivot.DuplicateItem\", strings.duplicateItem);\n                    }\n\n                    item.element.style.visibility = \"hidden\";\n                    item.element.style.opacity = 0;\n\n                    if (index < this.items.length - 1) {\n                        this._surfaceElement.insertBefore(item.element, this.items.getAt(index + 1).element);\n                    } else {\n                        this._surfaceElement.appendChild(item.element);\n                    }\n\n                    if (index <= this._currentIndexOnScreen) {\n                        this._currentIndexOnScreen++;\n                    }\n\n                    if (this._items.length === 1) {\n                        this.selectedIndex = 0;\n                    }\n\n                    this._headersState.render();\n                    headersStates.common.refreshHeadersState(this, true);\n                },\n\n                _handleItemMoved: function pivot_handleItemMoved(ev) {\n                    // Move is triggered by binding list move() API.\n                    if (this._pendingItems) {\n                        return;\n                    }\n\n                    var oldIndex = ev.detail.oldIndex;\n                    var newIndex = ev.detail.newIndex;\n                    var item = ev.detail.value;\n\n                    if (newIndex < this.items.length - 1) {\n                        this._surfaceElement.insertBefore(item.element, this.items.getAt(newIndex + 1).element);\n                    } else {\n                        this._surfaceElement.appendChild(item.element);\n                    }\n\n                    if (oldIndex < this._currentIndexOnScreen && newIndex >= this._currentIndexOnScreen) {\n                        this._currentIndexOnScreen--;\n                    } else if (newIndex > this._currentIndexOnScreen && oldIndex <= this._currentIndexOnScreen) {\n                        this._currentIndexOnScreen++;\n                    } else if (oldIndex === this._currentIndexOnScreen) {\n                        this.selectedIndex = newIndex;\n                    }\n\n                    this._headersState.render();\n                    headersStates.common.refreshHeadersState(this, true);\n                },\n\n                _handleItemReload: function pivot_handleItemReload() {\n                    // Reload is triggered by large operations on the binding list such as reverse(). This causes\n                    // _pendingItems to be true which ignores future insert/remove/modified/moved events until the new\n                    // items list is applied.\n                    this.items = this.items;\n                },\n\n                _handleItemRemoved: function pivot_handleItemRemoved(ev) {\n                    // Removed is triggered by binding list removal APIs such as splice(), pop(), and shift().\n                    if (this._pendingItems) {\n                        return;\n                    }\n\n                    var item = ev.detail.value;\n                    var index = ev.detail.index;\n\n                    this._surfaceElement.removeChild(item.element);\n\n                    if (index < this._currentIndexOnScreen) {\n                        this._currentIndexOnScreen--;\n                    } else if (index === this._currentIndexOnScreen) {\n                        this.selectedIndex = Math.min(this.items.length - 1, this._currentIndexOnScreen);\n                    }\n\n                    this._headersState.render();\n                    headersStates.common.refreshHeadersState(this, true);\n                },\n\n\n                // Misc helpers\n                _fireEvent: function pivot_fireEvent(type, canBubble, cancelable, detail) {\n                    // Returns true if ev.preventDefault() was not called\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, !!canBubble, !!cancelable, detail);\n                    return this.element.dispatchEvent(event);\n                },\n\n                _getDirectionAccessor: function () {\n                    return this._rtl ? \"right\" : \"left\";\n                },\n\n                _updateEvents: function pivot_updateEvents(oldItems, newItems) {\n                    if (oldItems) {\n                        oldItems.removeEventListener(\"itemchanged\", this._handleItemChangedBound);\n                        oldItems.removeEventListener(\"iteminserted\", this._handleItemInsertedBound);\n                        oldItems.removeEventListener(\"itemmoved\", this._handleItemMovedBound);\n                        oldItems.removeEventListener(\"itemremoved\", this._handleItemRemovedBound);\n                        oldItems.removeEventListener(\"reload\", this._handleItemReloadBound);\n                    }\n\n                    if (newItems) {\n                        newItems.addEventListener(\"itemchanged\", this._handleItemChangedBound);\n                        newItems.addEventListener(\"iteminserted\", this._handleItemInsertedBound);\n                        newItems.addEventListener(\"itemmoved\", this._handleItemMovedBound);\n                        newItems.addEventListener(\"itemremoved\", this._handleItemRemovedBound);\n                        newItems.addEventListener(\"reload\", this._handleItemReloadBound);\n                    }\n                },\n\n                _updatePointerType: function pivot_updatePointerType(e) {\n                    this._pointerType = e.pointerType || PT_MOUSE;\n                },\n\n                _writeProfilerMark: function pivot_writeProfilerMark(text) {\n                    var message = \"WinJS.UI.Pivot:\" + this._id + \":\" + text;\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, null, \"pivotprofiler\");\n                },\n            }, {\n                _invalidViewportWidth: -1,\n\n                _headerSlideAnimationDuration: 250,\n\n                // Names of classes used by the Pivot.\n                _ClassName: _Constants._ClassName,\n                // Names of events fired by the Pivot.\n                _EventName: {\n                    selectionChanged: eventNames.selectionChanged,\n                    itemAnimationStart: eventNames.itemAnimationStart,\n                    itemAnimationEnd: eventNames.itemAnimationEnd,\n                },\n                // These modes keep track of what initiated a scroll/item navigation.\n                // The precedence for these modes is inertia > api = scroll, meaning\n                // if there is an ongoing pan (inertia), scroll and api calls are\n                // ignored. If there is an api call, then scrolling is ignored, and\n                // only if there is neither a pan nor api call, scrolling code will\n                // execute.\n                _NavigationModes: {\n                    api: \"api\",\n                    inertia: \"inertia\",\n                    none: \"\",\n                    scroll: \"scroll\",\n                }\n            });\n            _Base.Class.mix(Pivot, _Control.DOMEventMixin);\n\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get duplicateItem() { return _Resources._getWinJSString(\"ui/duplicateItem\").value; },\n                get invalidContent() { return \"Invalid content: Pivot content must be made up of PivotItems.\"; },\n                get pivotAriaLabel() { return _Resources._getWinJSString(\"ui/pivotAriaLabel\").value; },\n                get pivotViewportAriaLabel() { return _Resources._getWinJSString(\"ui/pivotViewportAriaLabel\").value; }\n            };\n\n            return Pivot;\n        }),\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Hub/_Section',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Resources',\n    '../../ControlProcessor',\n    '../../Promise',\n    '../../Utilities/_Control',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_KeyboardBehavior'\n    ], function hubSectionInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, ControlProcessor, Promise, _Control, _Dispose, _ElementUtilities, _KeyboardBehavior) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.HubSection\">\n        /// Defines a section of a Hub control.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.hubsection.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.hubsection.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.HubSection\" data-win-options=\"{header: 'HubSection Header'}\">HubSection Content</div>]]></htmlSnippet>\n        /// <part name=\"hubsection\" class=\"win-hub-section\" locid=\"WinJS.UI.HubSection_part:hubsection\">The entire HubSection control.</part>\n        /// <part name=\"header\" class=\"win-hub-section-header\" locid=\"WinJS.UI.HubSection_part:header\">The header region of the HubSection.</part>\n        /// <part name=\"headertabstop\" class=\"win-hub-section-header-tabstop\" locid=\"WinJS.UI.HubSection_part:headertabstop\">The tab stop region of the header region of the HubSection.</part>\n        /// <part name=\"headercontent\" class=\"win-hub-section-header-content\" locid=\"WinJS.UI.HubSection_part:headercontent\">The content region of the header region of the HubSection.</part>\n        /// <part name=\"headerchevron\" class=\"win-hub-section-header-chevron\" locid=\"WinJS.UI.HubSection_part:headerchevron\">The chevron region of the header region of the HubSection.</part>\n        /// <part name=\"content\" class=\"win-hub-section-content\" locid=\"WinJS.UI.HubSection_part:content\">The content region of the HubSection.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        HubSection: _Base.Namespace._lazy(function () {\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get seeMore() { return _Resources._getWinJSString(\"ui/seeMore\").value; }\n            };\n\n            var HubSection = _Base.Class.define(function HubSection_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.HubSection.HubSection\">\n                /// <summary locid=\"WinJS.UI.HubSection.constructor\">\n                /// Creates a new HubSection.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.HubSection.constructor_p:element\">\n                /// The DOM element that hosts the HubSection control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.HubSection.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// </param>\n                /// <returns type=\"WinJS.UI.HubSection\" locid=\"WinJS.UI.HubSection.constructor_returnValue\">\n                /// The new HubSection.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n                element = element || _Global.document.createElement(\"DIV\");\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.HubSection.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                this._element = element;\n                _ElementUtilities.addClass(this.element, HubSection._ClassName.hubSection);\n                _ElementUtilities.addClass(this.element, \"win-disposable\");\n\n                // Not using innerHTML here because there could have been some children already.\n                this._headerElement = _Global.document.createElement(\"DIV\");\n                this._headerElement.className = HubSection._ClassName.hubSectionHeader;\n                this._headerElement.innerHTML =\n                    '<button type=\"button\" role=\"link\" class=\"' + HubSection._ClassName.hubSectionInteractive + ' ' + HubSection._ClassName.hubSectionHeaderTabStop + '\">' +\n                        '<div class=\"' +  HubSection._ClassName.hubSectionHeaderWrapper + '\" tabindex=\"-1\">' +\n                            '<h2 class=\"win-type-subheader ' + HubSection._ClassName.hubSectionHeaderContent + '\"></h2>' +\n                            '<span class=\"' + HubSection._ClassName.hubSectionHeaderChevron + ' win-type-body\">' + strings.seeMore + '</span>' +\n                        '</div>' +\n                    '</button>';\n                this._headerTabStopElement = this._headerElement.firstElementChild;\n                // The purpose of headerWrapperElement is to lay out its children in a flexbox. Ideally, this flexbox would\n                // be on headerTabStopElement. However, firefox lays out flexboxes with display:flex differently.\n                // Firefox bug 1014285 (Button with display:inline-flex doesn't layout properly)\n                // https://bugzilla.mozilla.org/show_bug.cgi?id=1014285\n                this._headerWrapperElement = this._headerTabStopElement.firstElementChild;\n                this._headerContentElement = this._headerWrapperElement.firstElementChild;\n                this._headerChevronElement = this._headerWrapperElement.lastElementChild;\n                element.appendChild(this._headerElement);\n\n                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._headerElement);\n\n                this._contentElement = _Global.document.createElement(\"DIV\");\n                this._contentElement.className = HubSection._ClassName.hubSectionContent;\n                this._contentElement.style.visibility = \"hidden\";\n                element.appendChild(this._contentElement);\n\n                // Reparent any existing elements inside the new hub section content element.\n                var elementToMove = this.element.firstChild;\n                while (elementToMove !== this._headerElement) {\n                    var nextElement = elementToMove.nextSibling;\n                    this._contentElement.appendChild(elementToMove);\n                    elementToMove = nextElement;\n                }\n\n                this._processors = [ControlProcessor.processAll];\n\n                _Control.setOptions(this, options);\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.HubSection.element\" helpKeyword=\"WinJS.UI.HubSection.element\">\n                /// Gets the DOM element that hosts the HubSection.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.HubSection.isHeaderStatic\" helpKeyword=\"WinJS.UI.HubSection.isHeaderStatic\">\n                /// Gets or sets a value that specifies whether the header is static. Set this value to true to disable clicks and other interactions.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                isHeaderStatic: {\n                    get: function () {\n                        return this._isHeaderStatic;\n                    },\n                    set: function (value) {\n                        this._isHeaderStatic = value;\n                        if (!this._isHeaderStatic) {\n                            this._headerTabStopElement.setAttribute(\"role\", \"link\");\n                            _ElementUtilities.addClass(this._headerTabStopElement, HubSection._ClassName.hubSectionInteractive);\n                        } else {\n                            this._headerTabStopElement.setAttribute(\"role\", \"heading\");\n                            _ElementUtilities.removeClass(this._headerTabStopElement, HubSection._ClassName.hubSectionInteractive);\n                        }\n                    }\n                },\n                /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.HubSection.contentElement\" helpKeyword=\"WinJS.UI.HubSection.contentElement\">\n                /// Gets the DOM element that hosts the HubSection's content.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                contentElement: {\n                    get: function () {\n                        return this._contentElement;\n                    }\n                },\n                /// <field type=\"Object\" locid=\"WinJS.UI.HubSection.header\" helpKeyword=\"WinJS.UI.HubSection.header\">\n                /// Get or set the HubSection's header. After you set this property, the Hub renders the header again.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                header: {\n                    get: function () {\n                        return this._header;\n                    },\n                    set: function (value) {\n                        // Render again even if it is equal to itself.\n                        this._header = value;\n                        this._renderHeader();\n                    }\n                },\n                _setHeaderTemplate: function HubSection_setHeaderTemplate(template) {\n                    this._template = _ElementUtilities._syncRenderer(template);\n                    this._renderHeader();\n                },\n                _renderHeader: function HubSection_renderHeader() {\n                    if (this._template) {\n                        _Dispose._disposeElement(this._headerContentElement);\n                        _ElementUtilities.empty(this._headerContentElement);\n                        this._template(this, this._headerContentElement);\n                    }\n                },\n                _process: function HubSection_process() {\n                    var that = this;\n\n                    this._processed = (this._processors || []).reduce(function (promise, processor) {\n                        return promise.then(function () {\n                            return processor(that.contentElement);\n                        });\n                    }, this._processed || Promise.as());\n                    this._processors = null;\n\n                    return this._processed;\n                },\n                dispose: function HubSection_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.HubSection.dispose\">\n                    /// <summary locid=\"WinJS.UI.HubSection.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n                    this._processors = null;\n\n                    _Dispose._disposeElement(this._headerContentElement);\n                    _Dispose.disposeSubTree(this.contentElement);\n                }\n            }, {\n                // Names of classes used by the HubSection.\n                _ClassName: {\n                    hubSection: \"win-hub-section\",\n                    hubSectionHeader: \"win-hub-section-header\",\n                    hubSectionHeaderTabStop: \"win-hub-section-header-tabstop\",\n                    hubSectionHeaderWrapper: \"win-hub-section-header-wrapper\",\n                    hubSectionInteractive: \"win-hub-section-header-interactive\",\n                    hubSectionHeaderContent: \"win-hub-section-header-content\",\n                    hubSectionHeaderChevron: \"win-hub-section-header-chevron\",\n                    hubSectionContent: \"win-hub-section-content\"\n                },\n                isDeclarativeControlContainer: _BaseUtils.markSupportedForProcessing(function (section, callback) {\n                    if (callback === ControlProcessor.processAll) {\n                        return;\n                    }\n\n                    section._processors = section._processors || [];\n                    section._processors.push(callback);\n\n                    // Once processed the first time synchronously queue up new processors as they come in\n                    if (section._processed) {\n                        section._process();\n                    }\n                })\n            });\n\n            return HubSection;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-hub',[],function(){});\n\ndefine('require-style!less/colors-hub',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/Hub',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../_Accents',\n    '../Animations',\n    '../Animations/_TransitionAnimation',\n    '../BindingList',\n    '../ControlProcessor',\n    '../Promise',\n    '../_Signal',\n    '../Scheduler',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_UI',\n    './Hub/_Section',\n    'require-style!less/styles-hub',\n    'require-style!less/colors-hub'\n], function hubInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, _Accents, Animations, _TransitionAnimation, BindingList, ControlProcessor, Promise, _Signal, Scheduler, _Control, _ElementUtilities, _Hoverable, _UI, _Section) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\n            \".win-semanticzoom-zoomedoutview .win-hub-section-header-interactive .win-hub-section-header-content,\\\n             .win-hub-section-header-interactive .win-hub-section-header-chevron\",\n        [{ name: \"color\", value: _Accents.ColorTypes.accent }]);\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Hub\">\n        /// Displays sections of content.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.hub.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.hub.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.Hub\">\n        /// <div data-win-control=\"WinJS.UI.HubSection\" data-win-options=\"{header: 'HubSection Header'}\">HubSection Content</div>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"contentanimating\" bubbles=\"true\" locid=\"WinJS.UI.Hub_e:contentanimating\">Raised when the Hub is about to play an entrance or a transition animation.</event>\n        /// <event name=\"headerinvoked\" bubbles=\"true\" locid=\"WinJS.UI.Hub_e:headerinvoked\">Raised when a header is invoked.</event>\n        /// <event name=\"loadingstatechanged\" bubbles=\"true\" locid=\"WinJS.UI.Hub_e:loadingstatechanged\">Raised when the loading state changes.</event>\n        /// <part name=\"hub\" class=\"win-hub\" locid=\"WinJS.UI.Hub_part:hub\">The entire Hub control.</part>\n        /// <part name=\"progress\" class=\"win-hub-progress\" locid=\"WinJS.UI.Hub_part:progress\">The progress indicator for the Hub.</part>\n        /// <part name=\"viewport\" class=\"win-hub-viewport\" locid=\"WinJS.UI.Hub_part:viewport\">The viewport of the Hub.</part>\n        /// <part name=\"surface\" class=\"win-hub-surface\" locid=\"WinJS.UI.Hub_part:surface\">The scrollable region of the Hub.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Hub: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            function hubDefaultHeaderTemplate(section) {\n                var element = _Global.document.createTextNode(typeof section.header === \"object\" ? JSON.stringify(section.header) : ('' + section.header));\n                return element;\n            }\n\n            var createEvent = _Events._createEventProperty;\n            var eventNames = {\n                contentAnimating: \"contentanimating\",\n                headerInvoked: \"headerinvoked\",\n                loadingStateChanged: \"loadingstatechanged\"\n            };\n\n            // Delay time before progress dots are shown when loading hub section(s) on screen.\n            var progressDelay = 500;\n\n            var verticalNames = {\n                scrollPos: \"scrollTop\",\n                scrollSize: \"scrollHeight\",\n                offsetPos: \"offsetTop\",\n                offsetSize: \"offsetHeight\",\n                oppositeOffsetSize: \"offsetWidth\",\n                marginStart: \"marginTop\",\n                marginEnd: \"marginBottom\",\n                borderStart: \"borderTopWidth\",\n                borderEnd: \"borderBottomWidth\",\n                paddingStart: \"paddingTop\",\n                paddingEnd: \"paddingBottom\"\n            };\n            var rtlHorizontalNames = {\n                scrollPos: \"scrollLeft\",\n                scrollSize: \"scrollWidth\",\n                offsetPos: \"offsetLeft\",\n                offsetSize: \"offsetWidth\",\n                oppositeOffsetSize: \"offsetHeight\",\n                marginStart: \"marginRight\",\n                marginEnd: \"marginLeft\",\n                borderStart: \"borderRightWidth\",\n                borderEnd: \"borderLeftWidth\",\n                paddingStart: \"paddingRight\",\n                paddingEnd: \"paddingLeft\"\n            };\n            var ltrHorizontalNames = {\n                scrollPos: \"scrollLeft\",\n                scrollSize: \"scrollWidth\",\n                offsetPos: \"offsetLeft\",\n                offsetSize: \"offsetWidth\",\n                oppositeOffsetSize: \"offsetHeight\",\n                marginStart: \"marginLeft\",\n                marginEnd: \"marginRight\",\n                borderStart: \"borderLeftWidth\",\n                borderEnd: \"borderRightWidth\",\n                paddingStart: \"paddingLeft\",\n                paddingEnd: \"paddingRight\"\n            };\n\n            var Hub = _Base.Class.define(function Hub_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Hub.Hub\">\n                /// <summary locid=\"WinJS.UI.Hub.constructor\">\n                /// Creates a new Hub control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.Hub.constructor_p:element\">\n                /// The DOM element that hosts the Hub control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.Hub.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the contentanimating event,\n                /// add a property named \"oncontentanimating\" to the options object and set its value to the event handler.\n                /// </param>\n                /// <returns type=\"WinJS.UI.Hub\" locid=\"WinJS.UI.Hub.constructor_returnValue\">\n                /// The new Hub.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n                element = element || _Global.document.createElement(\"DIV\");\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.Hub.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                this._id = element.id || _ElementUtilities._uniqueID(element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                this._windowKeyDownHandlerBound = this._windowKeyDownHandler.bind(this);\n                _Global.addEventListener('keydown', this._windowKeyDownHandlerBound);\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                this._element = element;\n                _ElementUtilities.addClass(this.element, Hub._ClassName.hub);\n                _ElementUtilities.addClass(this.element, \"win-disposable\");\n\n                this._viewportElement = _Global.document.createElement(\"DIV\");\n                this._viewportElement.className = Hub._ClassName.hubViewport;\n                this._element.appendChild(this._viewportElement);\n                this._viewportElement.setAttribute(\"role\", \"group\");\n                this._viewportElement.setAttribute(\"aria-label\", strings.hubViewportAriaLabel);\n\n                this._surfaceElement = _Global.document.createElement(\"DIV\");\n                this._surfaceElement.className = Hub._ClassName.hubSurface;\n                this._viewportElement.appendChild(this._surfaceElement);\n\n                // Start invisible so that you do not see the content loading until the sections are ready.\n                this._visible = false;\n                this._viewportElement.style.opacity = 0;\n\n                if (!options.orientation) {\n                    this._orientation = _UI.Orientation.horizontal;\n                    _ElementUtilities.addClass(this.element, Hub._ClassName.hubHorizontal);\n                }\n\n                this._fireEntrance = true;\n                this._animateEntrance = true;\n                this._loadId = 0;\n                this.runningAnimations = new Promise.wrap();\n                this._currentIndexForSezo = 0;\n\n                // This internally assigns this.sections which causes section to be used (even from options) before\n                // scrollPosition or sectionOnScreen.\n                this._parse();\n\n                _Control.setOptions(this, options);\n\n                _ElementUtilities._addEventListener(this.element, \"focusin\", this._focusin.bind(this), false);\n                this.element.addEventListener(\"keydown\", this._keyDownHandler.bind(this));\n                this.element.addEventListener(\"click\", this._clickHandler.bind(this));\n                this._resizeHandlerBound = this._resizeHandler.bind(this);\n                this.element.addEventListener(\"mselementresize\", this._resizeHandlerBound);\n                _ElementUtilities._resizeNotifier.subscribe(this.element, this._resizeHandlerBound);\n                this._viewportElement.addEventListener(\"scroll\", this._scrollHandler.bind(this));\n                this._surfaceElement.addEventListener(\"mselementresize\", this._contentResizeHandler.bind(this));\n\n                this._handleSectionChangedBind = this._handleSectionChanged.bind(this);\n                this._handleSectionInsertedBind = this._handleSectionInserted.bind(this);\n                this._handleSectionMovedBind = this._handleSectionMoved.bind(this);\n                this._handleSectionRemovedBind = this._handleSectionRemoved.bind(this);\n                this._handleSectionReloadBind = this._handleSectionReload.bind(this);\n\n                this._refresh();\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.Hub.element\" helpKeyword=\"WinJS.UI.Hub.element\">\n                /// Gets the DOM element that hosts the Hub.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Orientation\" locid=\"WinJS.UI.Hub.orientation\" helpKeyword=\"WinJS.UI.Hub.orientation\">\n                /// Gets or sets the orientation of sections within the Hub.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                orientation: {\n                    get: function () {\n                        return this._orientation;\n                    },\n                    set: function (value) {\n                        if (value === this._orientation) {\n                            return;\n                        }\n                        this._measured = false;\n                        // clear existing scroll before we switch orientation\n                        if (this._names) { // handle setting orientation before we measure\n                            var newScrollPos = {};\n                            newScrollPos[this._names.scrollPos] = 0;\n                            _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);\n                        }\n                        if (value === _UI.Orientation.vertical) {\n                            _ElementUtilities.removeClass(this.element, Hub._ClassName.hubHorizontal);\n                            _ElementUtilities.addClass(this.element, Hub._ClassName.hubVertical);\n                        } else {\n                            value = _UI.Orientation.horizontal;\n                            _ElementUtilities.removeClass(this.element, Hub._ClassName.hubVertical);\n                            _ElementUtilities.addClass(this.element, Hub._ClassName.hubHorizontal);\n                        }\n                        this._orientation = value;\n                        Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);\n                    }\n                },\n                /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.UI.Hub.sections\" helpKeyword=\"WinJS.UI.Hub.sections\">\n                /// Gets or sets the WinJS.Binding.List of HubSection objects that belong to this Hub.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                sections: {\n                    get: function () {\n                        if (this._pendingSections) {\n                            return this._pendingSections;\n                        }\n                        return this._sections;\n                    },\n                    set: function (value) {\n                        var resetScrollPosition = !this._pendingSections;\n                        this._pendingSections = value;\n                        this._refresh();\n                        if (resetScrollPosition) {\n                            this.scrollPosition = 0;\n                        }\n                    }\n                },\n                /// <field type=\"Object\" locid=\"WinJS.UI.Hub.headerTemplate\" helpKeyword=\"WinJS.UI.Hub.headerTemplate\" potentialValueSelector=\"[data-win-control='WinJS.Binding.Template']\">\n                /// Gets or sets the WinJS.Binding.Template or template function that creates the DOM elements\n                /// which represent the header for each HubSection. Each header can\n                /// contain multiple DOM elements, but we recommend that it have a single\n                /// root element.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                headerTemplate: {\n                    get: function () {\n                        if (this._pendingHeaderTemplate) {\n                            return this._pendingHeaderTemplate;\n                        }\n\n                        if (!this._headerTemplate) {\n                            this._headerTemplate = hubDefaultHeaderTemplate;\n                        }\n\n                        return this._headerTemplate;\n                    },\n                    set: function (value) {\n                        this._pendingHeaderTemplate = value || hubDefaultHeaderTemplate;\n                        this._refresh();\n                    }\n                },\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.Hub.scrollPosition\" helpKeyword=\"WinJS.UI.Hub.scrollPosition\">\n                /// Gets or sets the position of the Hub's scrollbar.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                scrollPosition: {\n                    get: function () {\n                        if (+this._pendingScrollLocation === this._pendingScrollLocation) {\n                            return this._pendingScrollLocation;\n                        }\n\n                        this._measure();\n                        return this._scrollPosition;\n                    },\n                    set: function (value) {\n                        value = Math.max(0, value);\n                        if (this._pendingRefresh) {\n                            // Unable to constrain length because sections may have changed.\n                            this._pendingScrollLocation = value;\n                            this._pendingSectionOnScreen = null;\n                        } else {\n                            this._measure();\n                            var targetScrollPos = Math.max(0, Math.min(this._scrollLength - this._viewportSize, value));\n                            this._scrollPosition = targetScrollPos;\n                            var newScrollPos = {};\n                            newScrollPos[this._names.scrollPos] = targetScrollPos;\n                            _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.Hub.sectionOnScreen\" helpKeyword=\"WinJS.UI.Hub.sectionOnScreen\">\n                /// Gets or sets the index of first section in view. This property is useful for restoring a previous view when your app launches or resumes.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                sectionOnScreen: {\n                    get: function () {\n                        if (+this._pendingSectionOnScreen === this._pendingSectionOnScreen) {\n                            return this._pendingSectionOnScreen;\n                        }\n\n                        this._measure();\n                        for (var i = 0; i < this._sectionSizes.length; i++) {\n                            var sectionSize = this._sectionSizes[i];\n                            if ((sectionSize.offset + sectionSize.size - sectionSize.borderEnd - sectionSize.paddingEnd) > (this._scrollPosition + this._startSpacer + sectionSize.borderStart + sectionSize.paddingStart)) {\n                                return i;\n                            }\n                        }\n                        return -1;\n                    },\n                    set: function (value) {\n                        value = Math.max(0, value);\n                        if (this._pendingRefresh) {\n                            this._pendingSectionOnScreen = value;\n                            this._pendingScrollLocation = null;\n                        } else {\n                            this._measure();\n                            if (value >= 0 && value < this._sectionSizes.length) {\n                                this._scrollToSection(value);\n                            }\n                        }\n                    }\n                },\n                /// <field type=\"Number\" integer=\"true\" isAdvanced=\"true\" locid=\"WinJS.UI.Hub.indexOfFirstVisible\" helpKeyword=\"WinJS.UI.Hub.indexOfFirstVisible\">\n                /// Gets or sets the index of first section at least partially in view. Use for animations.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                indexOfFirstVisible: {\n                    get: function () {\n                        this._measure();\n                        for (var i = 0; i < this._sectionSizes.length; i++) {\n                            var sectionSize = this._sectionSizes[i];\n                            if ((sectionSize.offset + sectionSize.size - sectionSize.borderEnd - sectionSize.paddingEnd) > this._scrollPosition) {\n                                return i;\n                            }\n                        }\n                        return -1;\n                    }\n                },\n                /// <field type=\"Number\" integer=\"true\" isAdvanced=\"true\" locid=\"WinJS.UI.Hub.indexOfLastVisible\" helpKeyword=\"WinJS.UI.Hub.indexOfLastVisible\">\n                /// Gets or sets the index of last section at least partially in view. Use for animations.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                indexOfLastVisible: {\n                    get: function () {\n                        this._measure();\n                        for (var i = this._sectionSizes.length - 1; i >= 0; i--) {\n                            var sectionSize = this._sectionSizes[i];\n                            if ((sectionSize.offset + sectionSize.paddingStart + sectionSize.borderStart) < (this._scrollPosition + this._viewportSize)) {\n                                return i;\n                            }\n                        }\n                        return -1;\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Hub.onheaderinvoked\" helpKeyword=\"WinJS.UI.Hub.onheaderinvoked\">\n                /// Raised  when the user clicks on an interactive header.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onheaderinvoked: createEvent(eventNames.headerInvoked),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Hub.onloadingstatechanged\" helpKeyword=\"WinJS.UI.Hub.onloadingstatechanged\">\n                /// Raised when the loadingState of the Hub changes.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onloadingstatechanged: createEvent(eventNames.loadingStateChanged),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Hub.oncontentanimating\" helpKeyword=\"WinJS.UI.Hub.oncontentanimating\">\n                /// Raised when Hub is about to play entrance, contentTransition, insert, or remove animations.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                oncontentanimating: createEvent(eventNames.contentAnimating),\n\n                _refresh: function hub_refresh() {\n                    if (this._pendingRefresh) {\n                        return;\n                    }\n\n                    this._loadId++;\n                    this._setState(Hub.LoadingState.loading);\n                    // This is to coalesce property setting operations such as sections and scrollPosition.\n                    this._pendingRefresh = true;\n\n                    Scheduler.schedule(this._refreshImpl.bind(this), Scheduler.Priority.high);\n                },\n                _refreshImpl: function hub_refreshImpl() {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    var fadeOutAnimation = Promise.wrap();\n                    if (this._pendingSections) {\n                        this._animateEntrance = true;\n                        this._fireEntrance = !this._visible;\n                        if (!this._fireEntrance) {\n                            this._visible = false;\n                            this._viewportElement.style.opacity = 0;\n\n                            if (_TransitionAnimation.isAnimationEnabled()) {\n                                var animateTransition = this._fireEvent(Hub._EventName.contentAnimating, {\n                                    type: Hub.AnimationType.contentTransition\n                                });\n\n                                if (animateTransition) {\n                                    this._viewportElement.style[\"-ms-overflow-style\"] = \"none\";\n                                    fadeOutAnimation = Animations.fadeOut(this._viewportElement).then(function () {\n                                        this._viewportElement.style[\"-ms-overflow-style\"] = \"\";\n                                    }.bind(this));\n                                }\n                                this._animateEntrance = animateTransition;\n                            }\n                        }\n                    }\n\n                    fadeOutAnimation.done(this._applyProperties.bind(this));\n                },\n                _applyProperties: function hub_applyProperties() {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._pendingRefresh = false;\n\n                    var needsToLoadSections = false;\n                    if (this._pendingSections) {\n                        needsToLoadSections = true;\n                        this._updateEvents(this._sections, this._pendingSections);\n                        this._sections = this._pendingSections;\n                        this._pendingSections = null;\n                        // Remove any declaratively specified hub sections before attachSections.\n                        while (this.element.firstElementChild !== this._viewportElement) {\n                            var toRemove = this.element.firstElementChild;\n                            toRemove.parentNode.removeChild(toRemove);\n                        }\n                        _ElementUtilities.empty(this._surfaceElement);\n                    }\n\n                    if (this._pendingHeaderTemplate) {\n                        this._headerTemplate = this._pendingHeaderTemplate;\n                        this._pendingHeaderTemplate = null;\n                    }\n\n                    this._assignHeaderTemplate();\n\n                    if (needsToLoadSections) {\n                        this._attachSections();\n                    }\n\n                    // Scroll after headers are rendered and sections are attached so the scroll thumb is correct.\n                    if (+this._pendingSectionOnScreen === this._pendingSectionOnScreen) {\n                        // If there are both pending section on screen and scroll location use section on screen.\n                        this.sectionOnScreen = this._pendingSectionOnScreen;\n                    } else if (+this._pendingScrollLocation === this._pendingScrollLocation) {\n                        this.scrollPosition = this._pendingScrollLocation;\n                    } else {\n                        // Sections reset without sectionOnScreen or scrollPosition APIs.\n                        this.scrollPosition = 0;\n                    }\n\n                    this._pendingSectionOnScreen = null;\n                    this._pendingScrollLocation = null;\n\n                    // Using current (or new) scroll location load the sections\n                    this._setState(Hub.LoadingState.loading);\n                    this._loadSections();\n                },\n                _handleSectionChanged: function hub_handleSectionChanged(ev) {\n                    // Change is triggered by binding list setAt() API.\n                    if (this._pendingSections) {\n                        return;\n                    }\n\n                    var newSection = ev.detail.newValue;\n                    var oldSection = ev.detail.oldValue;\n                    newSection._setHeaderTemplate(this.headerTemplate);\n                    if (newSection.element !== oldSection.element) {\n                        if (newSection.element.parentNode === this._surfaceElement) {\n                            throw new _ErrorFromName(\"WinJS.UI.Hub.DuplicateSection\", strings.duplicateSection);\n                        }\n\n                        this._surfaceElement.insertBefore(newSection.element, oldSection.element);\n                        this._surfaceElement.removeChild(oldSection.element);\n                        this._measured = false;\n\n                        this._setState(Hub.LoadingState.loading);\n                        this._loadSections();\n                    }\n                },\n                _handleSectionInserted: function hub_handleSectionInserted(ev) {\n                    // Insert is triggered by binding list insert APIs such as splice(), push(), and unshift().\n                    if (this._pendingSections) {\n                        return;\n                    }\n\n                    var index = ev.detail.index;\n                    var section = ev.detail.value;\n\n                    if (section._animation) {\n                        section._animation.cancel();\n                    }\n\n                    var animation;\n                    var result = this._fireEvent(Hub._EventName.contentAnimating, {\n                        type: Hub.AnimationType.insert,\n                        index: index,\n                        section: section\n                    });\n\n                    if (result) {\n\n                        var affectedElements = [];\n\n                        for (var i = index + 1; i < this.sections.length; i++) {\n                            affectedElements.push(this.sections.getAt(i).element);\n                        }\n\n                        animation = new Animations._createUpdateListAnimation([section.element], [], affectedElements);\n                    }\n\n                    if (section.element.parentNode === this._surfaceElement) {\n                        throw new _ErrorFromName(\"WinJS.UI.Hub.DuplicateSection\", strings.duplicateSection);\n                    }\n\n                    section._setHeaderTemplate(this.headerTemplate);\n                    if (index < this.sections.length - 1) {\n                        this._surfaceElement.insertBefore(section.element, this.sections.getAt(index + 1).element);\n                    } else {\n                        this._surfaceElement.appendChild(section.element);\n                    }\n                    this._measured = false;\n\n                    if (animation) {\n                        var insertAnimation = animation.execute();\n                        this.runningAnimations = Promise.join([this.runningAnimations, insertAnimation]);\n                    }\n\n                    this._setState(Hub.LoadingState.loading);\n                    this._loadSections();\n                },\n                _handleSectionMoved: function hub_handleSectionMoved(ev) {\n                    // Move is triggered by binding list move() API.\n                    if (this._pendingSections) {\n                        return;\n                    }\n\n                    var newIndex = ev.detail.newIndex;\n                    var section = ev.detail.value;\n\n                    if (newIndex < this.sections.length - 1) {\n                        this._surfaceElement.insertBefore(section.element, this.sections.getAt(newIndex + 1).element);\n                    } else {\n                        this._surfaceElement.appendChild(section.element);\n                    }\n                    this._measured = false;\n\n                    this._setState(Hub.LoadingState.loading);\n                    this._loadSections();\n                },\n                _handleSectionRemoved: function hub_handleSectionRemoved(ev) {\n                    // Removed is triggered by binding list removal APIs such as splice(), pop(), and shift().\n                    if (this._pendingSections) {\n                        return;\n                    }\n\n                    var section = ev.detail.value;\n                    var index = ev.detail.index;\n\n                    var animationPromise = Promise.wrap();\n                    var result = this._fireEvent(Hub._EventName.contentAnimating, {\n                        type: Hub.AnimationType.remove,\n                        index: index,\n                        section: section\n                    });\n\n                    if (result) {\n                        var affectedElements = [];\n\n                        for (var i = index; i < this.sections.length; i++) {\n                            affectedElements.push(this.sections.getAt(i).element);\n                        }\n\n                        var animation = new Animations._createUpdateListAnimation([], [section.element], affectedElements);\n\n                        this._measure();\n                        var offsetTop = section.element.offsetTop;\n                        var offsetLeft = section.element.offsetLeft;\n                        section.element.style.position = \"absolute\";\n                        section.element.style.top = offsetTop;\n                        section.element.style.left = offsetLeft;\n                        section.element.style.opacity = 0;\n                        this._measured = false;\n\n                        animationPromise = animation.execute().then(function () {\n                            section.element.style.position = \"\";\n                            section.element.style.top = \"\";\n                            section.element.style.left = \"\";\n                            section.element.style.opacity = 1;\n                        }.bind(this));\n                    }\n\n                    animationPromise.done(function () {\n                        if (!this._disposed) {\n                            this._surfaceElement.removeChild(section.element);\n                            this._measured = false;\n                        }\n                    }.bind(this));\n\n                    // Store animation promise in case it is inserted before remove animation finishes.\n                    section._animation = animationPromise;\n                    this.runningAnimations = Promise.join([this.runningAnimations, animationPromise]);\n\n                    this._setState(Hub.LoadingState.loading);\n                    this._loadSections();\n                },\n                _handleSectionReload: function hub_handleSectionReload() {\n                    // Reload is triggered by large operations on the binding list such as reverse(). This causes\n                    // _pendingSections to be true which ignores future insert/remove/modified/moved events until the new\n                    // sections list is applied.\n                    this.sections = this.sections;\n                },\n                _updateEvents: function hub_updateEvents(oldSections, newSections) {\n                    if (oldSections) {\n                        oldSections.removeEventListener(\"itemchanged\", this._handleSectionChangedBind);\n                        oldSections.removeEventListener(\"iteminserted\", this._handleSectionInsertedBind);\n                        oldSections.removeEventListener(\"itemmoved\", this._handleSectionMovedBind);\n                        oldSections.removeEventListener(\"itemremoved\", this._handleSectionRemovedBind);\n                        oldSections.removeEventListener(\"reload\", this._handleSectionReloadBind);\n                    }\n\n                    if (newSections) {\n                        newSections.addEventListener(\"itemchanged\", this._handleSectionChangedBind);\n                        newSections.addEventListener(\"iteminserted\", this._handleSectionInsertedBind);\n                        newSections.addEventListener(\"itemmoved\", this._handleSectionMovedBind);\n                        newSections.addEventListener(\"itemremoved\", this._handleSectionRemovedBind);\n                        newSections.addEventListener(\"reload\", this._handleSectionReloadBind);\n                    }\n                },\n                _attachSections: function hub_attachSections() {\n                    this._measured = false;\n                    for (var i = 0; i < this.sections.length; i++) {\n                        var section = this._sections.getAt(i);\n                        if (section._animation) {\n                            section._animation.cancel();\n                        }\n                        if (section.element.parentNode === this._surfaceElement) {\n                            throw new _ErrorFromName(\"WinJS.UI.Hub.DuplicateSection\", strings.duplicateSection);\n                        }\n                        this._surfaceElement.appendChild(section.element);\n                    }\n                },\n                _assignHeaderTemplate: function hub_assignHeaderTemplate() {\n                    this._measured = false;\n                    for (var i = 0; i < this.sections.length; i++) {\n                        var section = this._sections.getAt(i);\n                        section._setHeaderTemplate(this.headerTemplate);\n                    }\n                },\n                _loadSection: function hub_loadSection(index) {\n                    var section = this._sections.getAt(index);\n                    return section._process().then(function resetVisibility() {\n                        var style = section.contentElement.style;\n                        if (style.visibility !== \"\") {\n                            style.visibility = \"\";\n                        }\n                    });\n                },\n                _loadSections: function hub_loadSections() {\n                    // Used to know if another load has interrupted this one.\n                    this._loadId++;\n                    var loadId = this._loadId;\n                    var that = this;\n                    var onScreenItemsAnimatedPromise = Promise.wrap();\n                    var sectionIndicesToLoad = [];\n                    var allSectionsLoadedPromise = Promise.wrap();\n\n                    function loadNextSectionAfterPromise(promise) {\n                        promise.then(function () {\n                            Scheduler.schedule(loadNextSection, Scheduler.Priority.idle);\n                        });\n                    }\n\n                    function loadNextSection() {\n                        if (loadId === that._loadId && !that._disposed) {\n                            if (sectionIndicesToLoad.length) {\n                                var index = sectionIndicesToLoad.shift();\n                                var loadedPromise = that._loadSection(index);\n                                loadNextSectionAfterPromise(loadedPromise);\n                            } else {\n                                allSectionsLoadedSignal.complete();\n                            }\n                        }\n                    }\n\n                    if (!this._showProgressPromise) {\n                        this._showProgressPromise = Promise.timeout(progressDelay).then(function () {\n                            if (this._disposed) {\n                                return;\n                            }\n\n                            if (!this._progressBar) {\n                                this._progressBar = _Global.document.createElement(\"progress\");\n                                _ElementUtilities.addClass(this._progressBar, Hub._ClassName.hubProgress);\n                                this._progressBar.max = 100;\n                            }\n                            if (!this._progressBar.parentNode) {\n                                this.element.insertBefore(this._progressBar, this._viewportElement);\n                            }\n                            this._showProgressPromise = null;\n                        }.bind(this), function () {\n                            this._showProgressPromise = null;\n                        }.bind(this));\n                    }\n\n                    if (this.sections.length) {\n                        var allSectionsLoadedSignal = new _Signal();\n                        allSectionsLoadedPromise = allSectionsLoadedSignal.promise;\n                        // Synchronously load the sections on screen.\n                        var synchronousProcessPromises = [];\n                        var start = Math.max(0, this.indexOfFirstVisible);\n                        var end = Math.max(0, this.indexOfLastVisible);\n                        for (var i = start; i <= end; i++) {\n                            synchronousProcessPromises.push(this._loadSection(i));\n                        }\n\n                        // Determine the order to load the rest of the sections.\n                        start--;\n                        end++;\n                        while (start >= 0 || end < this.sections.length) {\n                            if (end < this.sections.length) {\n                                sectionIndicesToLoad.push(end);\n                                end++;\n                            }\n                            if (start >= 0) {\n                                sectionIndicesToLoad.push(start);\n                                start--;\n                            }\n                        }\n\n                        var onScreenSectionsLoadedPromise = Promise.join(synchronousProcessPromises);\n\n                        // In case there are overlapping load calls\n                        onScreenSectionsLoadedPromise.done(function () {\n                            if (loadId === this._loadId && !that._disposed) {\n                                if (this._showProgressPromise) {\n                                    this._showProgressPromise.cancel();\n                                }\n\n                                if (this._progressBar && this._progressBar.parentNode) {\n                                    this._progressBar.parentNode.removeChild(this._progressBar);\n                                }\n\n                                Scheduler.schedule(function Hub_entranceAnimation() {\n                                    if (loadId === this._loadId && !that._disposed) {\n                                        if (!this._visible) {\n                                            this._visible = true;\n                                            this._viewportElement.style.opacity = 1;\n\n                                            if (this._animateEntrance && _TransitionAnimation.isAnimationEnabled()) {\n                                                var eventDetail = {\n                                                    type: Hub.AnimationType.entrance\n                                                };\n\n                                                if (!this._fireEntrance || this._fireEvent(Hub._EventName.contentAnimating, eventDetail)) {\n                                                    this._viewportElement.style[\"-ms-overflow-style\"] = \"none\";\n                                                    onScreenItemsAnimatedPromise = Animations.enterContent(this._viewportElement).then(function () {\n                                                        this._viewportElement.style[\"-ms-overflow-style\"] = \"\";\n                                                    }.bind(this));\n                                                }\n                                            }\n                                            if (this._element === _Global.document.activeElement) {\n                                                this._moveFocusIn(this.sectionOnScreen);\n                                            }\n                                        }\n                                    }\n                                }, Scheduler.Priority.high, this, \"WinJS.UI.Hub.entranceAnimation\");\n                            }\n                        }.bind(this));\n\n                        loadNextSectionAfterPromise(onScreenSectionsLoadedPromise);\n                    } else {\n                        if (this._showProgressPromise) {\n                            this._showProgressPromise.cancel();\n                        }\n\n                        if (this._progressBar && this._progressBar.parentNode) {\n                            this._progressBar.parentNode.removeChild(this._progressBar);\n                        }\n                    }\n\n                    Promise.join([this.runningAnimations, onScreenItemsAnimatedPromise, allSectionsLoadedPromise]).done(function () {\n                        if (loadId === this._loadId && !that._disposed) {\n                            this.runningAnimations = Promise.wrap();\n                            if (this._measured && this._scrollLength !== this._viewportElement[this._names.scrollSize]) {\n                                // A section changed size during processing. Invalidate the Hub's measurements so that its\n                                // API's work correctly within the loadingState=complete handler.\n                                this._measured = false;\n                            }\n                            this._setState(Hub.LoadingState.complete);\n                            Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);\n                        }\n                    }.bind(this));\n                },\n                /// <field type=\"String\" hidden=\"true\" locid=\"WinJS.UI.Hub.loadingState\" helpKeyword=\"WinJS.UI.Hub.loadingState\">\n                /// Gets a value that indicates whether the Hub is still loading or whether\n                /// loading is complete.  This property can return one of these values:\n                /// \"loading\" or \"complete\".\n                /// </field>\n                loadingState: {\n                    get: function () {\n                        return this._loadingState;\n                    }\n                },\n                _setState: function Hub_setState(state) {\n                    if (state !== this._loadingState) {\n                        this._writeProfilerMark(\"loadingStateChanged:\" + state + \",info\");\n                        this._loadingState = state;\n                        var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                        eventObject.initCustomEvent(Hub._EventName.loadingStateChanged, true, false, { loadingState: state });\n                        this._element.dispatchEvent(eventObject);\n                    }\n                },\n                _parse: function hub_parse() {\n                    var hubSections = [];\n                    var hubSectionEl = this.element.firstElementChild;\n\n                    while (hubSectionEl !== this._viewportElement) {\n                        ControlProcessor.processAll(hubSectionEl);\n\n                        var hubSectionContent = hubSectionEl.winControl;\n                        if (hubSectionContent) {\n                            hubSections.push(hubSectionContent);\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.UI.Hub.InvalidContent\", strings.invalidContent);\n                        }\n\n                        var nextSectionEl = hubSectionEl.nextElementSibling;\n                        hubSectionEl = nextSectionEl;\n                    }\n\n                    this.sections = new BindingList.List(hubSections);\n                },\n                _fireEvent: function hub_fireEvent(type, detail) {\n                    // Returns true if ev.preventDefault() was not called\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, true, true, detail);\n                    return this.element.dispatchEvent(event);\n                },\n\n                _findHeaderTabStop: function hub_findHeaderTabStop(element) {\n                    if (element.parentNode) {\n                        if (_ElementUtilities._matchesSelector(element, \".win-hub-section-header-tabstop, .win-hub-section-header-tabstop *\")) {\n                            while (!_ElementUtilities.hasClass(element, \"win-hub-section-header-tabstop\")) {\n                                element = element.parentElement;\n                            }\n                            return element;\n                        }\n                    }\n                    return null;\n                },\n                _isInteractive: function hub_isInteractive(element) {\n                    // Helper method to skip keyboarding and clicks\n\n                    while (element && element !== _Global.document.body) {\n                        if (element.classList.contains(\"win-interactive\")) {\n                            return true;\n                        }\n                        element = element.parentElement;\n                    }\n                    return false;\n                },\n                _clickHandler: function hub_clickHandler(ev) {\n                    var headerTabStopElement = this._findHeaderTabStop(ev.target);\n                    if (headerTabStopElement && !this._isInteractive(ev.target)) {\n                        var section = headerTabStopElement.parentElement.parentElement.winControl;\n                        if (!section.isHeaderStatic) {\n                            var sectionIndex = this.sections.indexOf(section);\n                            this._fireEvent(Hub._EventName.headerInvoked, {\n                                index: sectionIndex,\n                                section: section\n                            });\n                        }\n                    }\n                },\n                _resizeHandler: function hub_resizeHandler() {\n                    // Viewport needs to be measured\n                    this._measured = false;\n                    Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);\n                },\n                _contentResizeHandler: function hub_contentResizeHandler() {\n                    // Sections and scroll length need to be measured\n                    this._measured = false;\n                    Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);\n                },\n                _scrollHandler: function hub_scrollHandler() {\n                    // Scroll location needs to be retrieved\n                    this._measured = false;\n\n                    if (this._pendingSections) {\n                        return;\n                    }\n\n                    // Scroll events caused by users overwrite pending API modifications to scrollposition.\n                    this._pendingScrollLocation = null;\n                    this._pendingSectionOnScreen = null;\n\n                    if (!this._pendingScrollHandler) {\n                        this._pendingScrollHandler = _BaseUtils._requestAnimationFrame(function () {\n                            this._pendingScrollHandler = null;\n\n                            if (this._pendingSections) {\n                                return;\n                            }\n\n                            if (this.loadingState !== Hub.LoadingState.complete) {\n                                this._loadSections();\n                            }\n                        }.bind(this));\n                    }\n                },\n                _measure: function hub_measure() {\n                    // Any time a size changes (section growing, window resizing, etc) cachedSizes should be set to false\n                    // and any time the variables need to be read again we should measure the variables. To avoid a lot of\n                    // seperate layouts we measure the variables in a single batch.\n                    if (!this._measured || this._scrollLength === 0) {\n                        this._writeProfilerMark(\"measure,StartTM\");\n                        this._measured = true;\n\n                        this._rtl = _Global.getComputedStyle(this._element, null).direction === \"rtl\";\n\n                        if (this.orientation === _UI.Orientation.vertical) {\n                            this._names = verticalNames;\n                        } else {\n                            if (this._rtl) {\n                                this._names = rtlHorizontalNames;\n                            } else {\n                                this._names = ltrHorizontalNames;\n                            }\n                        }\n\n                        this._viewportSize = this._viewportElement[this._names.offsetSize];\n                        this._viewportOppositeSize = this._viewportElement[this._names.oppositeOffsetSize];\n                        this._scrollPosition = _ElementUtilities.getScrollPosition(this._viewportElement)[this._names.scrollPos];\n                        this._scrollLength = this._viewportElement[this._names.scrollSize];\n\n                        var surfaceElementComputedStyle = _Global.getComputedStyle(this._surfaceElement);\n                        this._startSpacer = parseFloat(surfaceElementComputedStyle[this._names.marginStart]) + parseFloat(surfaceElementComputedStyle[this._names.borderStart]) + parseFloat(surfaceElementComputedStyle[this._names.paddingStart]);\n                        this._endSpacer = parseFloat(surfaceElementComputedStyle[this._names.marginEnd]) + parseFloat(surfaceElementComputedStyle[this._names.borderEnd]) + parseFloat(surfaceElementComputedStyle[this._names.paddingEnd]);\n\n                        this._sectionSizes = [];\n                        for (var i = 0; i < this.sections.length; i++) {\n                            var section = this.sections.getAt(i);\n                            var computedSectionStyle = _Global.getComputedStyle(section.element);\n                            this._sectionSizes[i] = {\n                                offset: section.element[this._names.offsetPos],\n                                // Reminder: offsetWidth doesn't include margins and also rounds.\n                                size: section.element[this._names.offsetSize],\n                                marginStart: parseFloat(computedSectionStyle[this._names.marginStart]),\n                                marginEnd: parseFloat(computedSectionStyle[this._names.marginEnd]),\n                                borderStart: parseFloat(computedSectionStyle[this._names.borderStart]),\n                                borderEnd: parseFloat(computedSectionStyle[this._names.borderEnd]),\n                                paddingStart: parseFloat(computedSectionStyle[this._names.paddingStart]),\n                                paddingEnd: parseFloat(computedSectionStyle[this._names.paddingEnd])\n                            };\n\n                            if (this._rtl && this.orientation === _UI.Orientation.horizontal) {\n                                this._sectionSizes[i].offset = this._viewportSize - (this._sectionSizes[i].offset + this._sectionSizes[i].size);\n                            }\n                        }\n\n                        this._writeProfilerMark(\"measure,StopTM\");\n                    }\n                },\n                _updateSnapList: function hub_updateSnapList() {\n                    this._writeProfilerMark(\"updateSnapList,StartTM\");\n                    this._measure();\n\n                    var snapList = \"snapList(\";\n                    for (var i = 0; i < this._sectionSizes.length; i++) {\n                        if (i > 0) {\n                            snapList += \",\";\n                        }\n                        var sectionSize = this._sectionSizes[i];\n                        snapList += (sectionSize.offset - sectionSize.marginStart - this._startSpacer) + \"px\";\n                    }\n                    snapList += \")\";\n\n                    var snapListY = \"\";\n                    var snapListX = \"\";\n                    if (this.orientation === _UI.Orientation.vertical) {\n                        snapListY = snapList;\n                    } else {\n                        snapListX = snapList;\n                    }\n\n                    if (this._lastSnapPointY !== snapListY) {\n                        this._lastSnapPointY = snapListY;\n                        this._viewportElement.style['-ms-scroll-snap-points-y'] = snapListY;\n                    }\n\n                    if (this._lastSnapPointX !== snapListX) {\n                        this._lastSnapPointX = snapListX;\n                        this._viewportElement.style['-ms-scroll-snap-points-x'] = snapListX;\n                    }\n\n                    this._writeProfilerMark(\"updateSnapList,StopTM\");\n                },\n                _scrollToSection: function Hub_scrollToSection(index, withAnimation) {\n                    this._measure();\n                    var sectionSize = this._sectionSizes[index];\n                    var scrollPositionToShowStartMargin = Math.min(this._scrollLength - this._viewportSize, sectionSize.offset - sectionSize.marginStart - this._startSpacer);\n\n                    this._scrollTo(scrollPositionToShowStartMargin, withAnimation);\n                },\n                _ensureVisible: function hub_ensureVisible(index, withAnimation) {\n                    this._measure();\n                    var targetScrollPos = this._ensureVisibleMath(index, this._scrollPosition);\n                    this._scrollTo(targetScrollPos, withAnimation);\n                },\n                _ensureVisibleMath: function hub_ensureVisibleMath(index, targetScrollPos) {\n                    this._measure();\n                    var sectionSize = this._sectionSizes[index];\n\n                    var scrollPositionToShowStartMargin = Math.min(this._scrollLength - this._viewportSize, sectionSize.offset - sectionSize.marginStart - this._startSpacer);\n                    var scrollPositionToShowEndMargin = Math.max(0, sectionSize.offset + sectionSize.size + sectionSize.marginEnd + this._endSpacer - this._viewportSize + 1);\n                    if (targetScrollPos > scrollPositionToShowStartMargin) {\n                        targetScrollPos = scrollPositionToShowStartMargin;\n                    } else if (targetScrollPos < scrollPositionToShowEndMargin) {\n                        targetScrollPos = Math.min(scrollPositionToShowStartMargin, scrollPositionToShowEndMargin);\n                    }\n\n                    return targetScrollPos;\n                },\n                _scrollTo: function hub_scrollTo(scrollPos, withAnimation) {\n                    this._scrollPosition = scrollPos;\n                    if (withAnimation) {\n                        if (this.orientation === _UI.Orientation.vertical) {\n                            _ElementUtilities._zoomTo(this._viewportElement, { contentX: 0, contentY: this._scrollPosition, viewportX: 0, viewportY: 0 });\n                        } else {\n                            _ElementUtilities._zoomTo(this._viewportElement, { contentX: this._scrollPosition, contentY: 0, viewportX: 0, viewportY: 0 });\n                        }\n                    } else {\n                        var newScrollPos = {};\n                        newScrollPos[this._names.scrollPos] = this._scrollPosition;\n                        _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);\n                    }\n                },\n                _windowKeyDownHandler: function hub_windowKeyDownHandler(ev) {\n                    // Include tab and shift tab. Note: Alt Key + Tab and Windows Key + Tab do not fire keydown with ev.key === \"Tab\".\n                    if (ev.keyCode === Key.tab) {\n                        this._tabSeenLast = true;\n\n                        var that = this;\n                        _BaseUtils._yieldForEvents(function () {\n                            that._tabSeenLast = false;\n                        });\n                    }\n                },\n                _focusin: function hub_focusin(ev) {\n                    // On focus we call ensureVisible to handle the tab or shift/tab to header. However if the\n                    // focus was caused by a pointer down event we skip the focus.\n                    if (this._tabSeenLast) {\n                        var headerTabStopElement = this._findHeaderTabStop(ev.target);\n                        if (headerTabStopElement && !this._isInteractive(ev.target)) {\n                            var sectionIndex = this.sections.indexOf(headerTabStopElement.parentElement.parentElement.winControl);\n                            if (sectionIndex > -1) {\n                                this._ensureVisible(sectionIndex, true);\n                            }\n                        }\n                    }\n\n                    // Always remember the focused section for SemanticZoom.\n                    var sectionElement = ev.target;\n                    while (sectionElement && !_ElementUtilities.hasClass(sectionElement, _Section.HubSection._ClassName.hubSection)) {\n                        sectionElement = sectionElement.parentElement;\n                    }\n                    if (sectionElement) {\n                        var sectionIndex = this.sections.indexOf(sectionElement.winControl);\n                        if (sectionIndex > -1) {\n                            this._currentIndexForSezo = sectionIndex;\n                        }\n                    }\n\n                    if (ev.target === this.element) {\n                        var indexToFocus;\n                        if (+this._sectionToFocus === this._sectionToFocus && this._sectionToFocus >= 0 && this._sectionToFocus < this.sections.length) {\n                            indexToFocus = this._sectionToFocus;\n                            this._sectionToFocus = null;\n                        } else {\n                            indexToFocus = this.sectionOnScreen;\n                        }\n\n                        this._moveFocusIn(indexToFocus);\n                    }\n                },\n                _moveFocusIn: function hub_moveFocusIn(indexToFocus) {\n                    if (indexToFocus >= 0) {\n                        for (var i = indexToFocus; i < this.sections.length; i++) {\n                            var section = this.sections.getAt(i);\n\n                            var focusAttempt = _ElementUtilities._trySetActive(section._headerTabStopElement, this._viewportElement);\n\n                            if (focusAttempt) {\n                                return;\n                            }\n\n                            if (_ElementUtilities._setActiveFirstFocusableElement(section.contentElement, this._viewportElement)) {\n                                return;\n                            }\n                        }\n\n                        for (var i = indexToFocus - 1; i >= 0; i--) {\n                            var section = this.sections.getAt(i);\n\n                            if (_ElementUtilities._setActiveFirstFocusableElement(section.contentElement, this._viewportElement)) {\n                                return;\n                            }\n\n                            var focusAttempt = _ElementUtilities._trySetActive(section._headerTabStopElement, this._viewportElement);\n\n                            if (focusAttempt) {\n                                return;\n                            }\n                        }\n                    }\n                },\n                _keyDownHandler: function hub_keyDownHandler(ev) {\n                    if (this._isInteractive(ev.target) || _ElementUtilities._hasCursorKeysBehaviors(ev.target)) {\n                        return;\n                    }\n\n                    var leftKey = this._rtl ? Key.rightArrow : Key.leftArrow;\n                    var rightKey = this._rtl ? Key.leftArrow : Key.rightArrow;\n\n                    if (ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow || ev.keyCode === Key.leftArrow || ev.keyCode === Key.rightArrow || ev.keyCode === Key.pageUp || ev.keyCode === Key.pageDown) {\n                        var headerTabStopElement = this._findHeaderTabStop(ev.target);\n                        if (headerTabStopElement) {\n                            var currentSection = this.sections.indexOf(headerTabStopElement.parentElement.parentElement.winControl);\n                            var targetSectionIndex;\n                            var useEnsureVisible = false;\n                            // Page up/down go to the next/previous header and line it up with the app header. Up/Right/Down/Left\n                            // move focus to the next/previous header and move it on screen (app header distance from either edge).\n                            if (ev.keyCode === Key.pageDown ||\n                                (this.orientation === _UI.Orientation.horizontal && ev.keyCode === rightKey) ||\n                                (this.orientation === _UI.Orientation.vertical && ev.keyCode === Key.downArrow)) {\n                                // Do not include hidden headers.\n                                for (var i = currentSection + 1; i < this.sections.length; i++) {\n                                    if (this._tryFocus(i)) {\n                                        targetSectionIndex = i;\n                                        break;\n                                    }\n                                }\n                            } else if (ev.keyCode === Key.pageUp ||\n                                (this.orientation === _UI.Orientation.horizontal && ev.keyCode === leftKey) ||\n                                (this.orientation === _UI.Orientation.vertical && ev.keyCode === Key.upArrow)) {\n                                // Do not include hidden headers.\n                                for (var i = currentSection - 1; i >= 0; i--) {\n                                    if (this._tryFocus(i)) {\n                                        targetSectionIndex = i;\n                                        break;\n                                    }\n                                }\n                            }\n                            if (ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow || ev.keyCode === Key.leftArrow || ev.keyCode === Key.rightArrow) {\n                                useEnsureVisible = true;\n                            }\n\n                            if (+targetSectionIndex === targetSectionIndex) {\n                                if (useEnsureVisible) {\n                                    this._ensureVisible(targetSectionIndex, true);\n                                } else {\n                                    this._scrollToSection(targetSectionIndex, true);\n                                }\n                                ev.preventDefault();\n                            }\n                        }\n                    } else if (ev.keyCode === Key.home || ev.keyCode === Key.end) {\n                        // Home/End scroll to start/end and leave focus where it is.\n                        this._measure();\n                        var maxScrollPos = Math.max(0, this._scrollLength - this._viewportSize);\n                        this._scrollTo(ev.keyCode === Key.home ? 0 : maxScrollPos, true);\n                        ev.preventDefault();\n                    }\n                },\n                _tryFocus: function hub_tryFocus(index) {\n                    var targetSection = this.sections.getAt(index);\n\n                    _ElementUtilities._setActive(targetSection._headerTabStopElement, this._viewportElement);\n\n                    return _Global.document.activeElement === targetSection._headerTabStopElement;\n                },\n                /// <field type=\"Object\" locid=\"WinJS.UI.Hub.zoomableView\" helpKeyword=\"WinJS.UI.Hub.zoomableView\" isAdvanced=\"true\">\n                /// Gets a ZoomableView. This API supports the SemanticZoom infrastructure\n                /// and is not intended to be used directly from your code.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                zoomableView: {\n                    get: function zoomableView_get() {\n                        if (!this._zoomableView) {\n                            this._zoomableView = new ZoomableView(this);\n                        }\n\n                        return this._zoomableView;\n                    }\n                },\n                _getPanAxis: function hub_getPanAxis() {\n                    return this.orientation === _UI.Orientation.horizontal ? \"horizontal\" : \"vertical\";\n                },\n                _configureForZoom: function hub_configureForZoom() {\n                    // Nothing to configure.\n                },\n                _setCurrentItem: function hub_setCurrentItem(x, y) {\n                    var offset;\n                    if (this.orientation === _UI.Orientation.horizontal) {\n                        offset = x;\n                    } else {\n                        offset = y;\n                    }\n\n                    this._measure();\n                    offset = offset + this._scrollPosition;\n                    this._currentIndexForSezo = this._sectionSizes.length - 1;\n                    for (var i = 1; i < this._sectionSizes.length; i++) {\n                        var sectionSize = this._sectionSizes[i];\n                        if (sectionSize.offset - sectionSize.marginStart > offset) {\n                            this._currentIndexForSezo = i - 1;\n                            break;\n                        }\n                    }\n                },\n                _getCurrentItem: function hub_getCurrentItem() {\n                    var itemPosition;\n                    if (this._sectionSizes.length > 0) {\n                        this._measure();\n                        var index = Math.max(0, Math.min(this._currentIndexForSezo, this._sectionSizes.length));\n                        var sectionSize = this._sectionSizes[index];\n                        if (this.orientation === _UI.Orientation.horizontal) {\n                            itemPosition = {\n                                left: Math.max(0, sectionSize.offset - sectionSize.marginStart - this._scrollPosition),\n                                top: 0,\n                                width: sectionSize.size,\n                                height: this._viewportOppositeSize\n                            };\n                        } else {\n                            itemPosition = {\n                                left: 0,\n                                top: Math.max(0, sectionSize.offset - sectionSize.marginStart - this._scrollPosition),\n                                width: this._viewportOppositeSize,\n                                height: sectionSize.size,\n                            };\n                        }\n\n                        var section = this.sections.getAt(index);\n                        // BUGBUG: 53301 ListView and Hub should document what they expect to be returned from the\n                        // getCurrentItem so that positionItem apis line up. ListView zoomed out expects an object with\n                        // groupIndexHint, groupKey, or groupDescription. Hub expects an object with index.\n                        return Promise.wrap({ item: { data: section, index: index, groupIndexHint: index }, position: itemPosition });\n                    }\n                },\n                _beginZoom: function hub_beginZoom() {\n                    // Hide scroll thumb.\n                    this._viewportElement.style[\"-ms-overflow-style\"] = \"none\";\n                },\n                _positionItem: function hub_positionItem(item, position) {\n                    if (item.index >= 0 && item.index < this._sectionSizes.length) {\n                        this._measure();\n                        var sectionSize = this._sectionSizes[item.index];\n\n                        var offsetFromViewport;\n                        if (this.orientation === _UI.Orientation.horizontal) {\n                            offsetFromViewport = position.left;\n                        } else {\n                            offsetFromViewport = position.top;\n                        }\n\n                        this._sectionToFocus = item.index;\n\n                        var targetScrollPosition = sectionSize.offset - offsetFromViewport;\n                        // clamp section:\n                        var targetScrollPosition = this._ensureVisibleMath(item.index, targetScrollPosition);\n\n                        this._scrollPosition = targetScrollPosition;\n                        var newScrollPos = {};\n                        newScrollPos[this._names.scrollPos] = this._scrollPosition;\n                        _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);\n                    }\n                },\n                _endZoom: function hub_endZoom() {\n                    // Show scroll thumb.\n                    this._viewportElement.style[\"-ms-overflow-style\"] = \"\";\n                },\n                _writeProfilerMark: function hub_writeProfilerMark(text) {\n                    var message = \"WinJS.UI.Hub:\" + this._id + \":\" + text;\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, null, \"hubprofiler\");\n                },\n                dispose: function hub_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.Hub.dispose\">\n                    /// <summary locid=\"WinJS.UI.Hub.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    _Global.removeEventListener('keydown', this._windowKeyDownHandlerBound);\n                    _ElementUtilities._resizeNotifier.unsubscribe(this.element, this._resizeHandlerBound);\n\n                    this._updateEvents(this._sections);\n\n                    for (var i = 0; i < this.sections.length; i++) {\n                        this.sections.getAt(i).dispose();\n                    }\n                }\n            }, {\n                /// <field locid=\"WinJS.UI.Hub.AnimationType\" helpKeyword=\"WinJS.UI.Hub.AnimationType\">\n                /// Specifies whether the Hub animation is an entrance animation or a transition animation.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                AnimationType: {\n                    /// <field locid=\"WinJS.UI.Hub.AnimationType.entrance\" helpKeyword=\"WinJS.UI.Hub.AnimationType.entrance\">\n                    /// The animation plays when the Hub is first displayed.\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </field>\n                    entrance: \"entrance\",\n                    /// <field locid=\"WinJS.UI.Hub.AnimationType.contentTransition\" helpKeyword=\"WinJS.UI.Hub.AnimationType.contentTransition\">\n                    /// The animation plays when the Hub is changing its content.\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </field>\n                    contentTransition: \"contentTransition\",\n                    /// <field locid=\"WinJS.UI.Hub.AnimationType.insert\" helpKeyword=\"WinJS.UI.Hub.AnimationType.insert\">\n                    /// The animation plays when a section is inserted into the Hub.\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </field>\n                    insert: \"insert\",\n                    /// <field locid=\"WinJS.UI.Hub.AnimationType.remove\" helpKeyword=\"WinJS.UI.Hub.AnimationType.remove\">\n                    /// The animation plays when a section is removed into the Hub.\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </field>\n                    remove: \"remove\",\n                },\n                /// <field locid=\"WinJS.UI.Hub.LoadingState\" helpKeyword=\"WinJS.UI.Hub.LoadingState\">\n                /// Gets the current loading state of the Hub.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                LoadingState: {\n                    /// <field locid=\"WinJS.UI.Hub.LoadingState.loading\" helpKeyword=\"WinJS.UI.Hub.LoadingState.loading\">\n                    /// The Hub is loading sections.\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </field>\n                    loading: \"loading\",\n                    /// <field locid=\"WinJS.UI.Hub.LoadingState.complete\" helpKeyword=\"WinJS.UI.Hub.LoadingState.complete\">\n                    /// All sections are loaded and animations are complete.\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </field>\n                    complete: \"complete\"\n                },\n                // Names of classes used by the Hub.\n                _ClassName: {\n                    hub: \"win-hub\",\n                    hubSurface: \"win-hub-surface\",\n                    hubProgress: \"win-hub-progress\",\n                    hubViewport: \"win-hub-viewport\",\n                    hubVertical: \"win-hub-vertical\",\n                    hubHorizontal: \"win-hub-horizontal\",\n                },\n                // Names of events fired by the Hub.\n                _EventName: {\n                    contentAnimating: eventNames.contentAnimating,\n                    headerInvoked: eventNames.headerInvoked,\n                    loadingStateChanged: eventNames.loadingStateChanged\n                },\n            });\n\n            _Base.Class.mix(Hub, _Control.DOMEventMixin);\n\n            var ZoomableView = _Base.Class.define(function ZoomableView_ctor(hub) {\n                this._hub = hub;\n            }, {\n                getPanAxis: function () {\n                    return this._hub._getPanAxis();\n                },\n                configureForZoom: function (isZoomedOut, isCurrentView, triggerZoom, prefetchedPages) {\n                    this._hub._configureForZoom(isZoomedOut, isCurrentView, triggerZoom, prefetchedPages);\n                },\n                setCurrentItem: function (x, y) {\n                    this._hub._setCurrentItem(x, y);\n                },\n                getCurrentItem: function () {\n                    return this._hub._getCurrentItem();\n                },\n                beginZoom: function () {\n                    this._hub._beginZoom();\n                },\n                positionItem: function (item, position) {\n                    return this._hub._positionItem(item, position);\n                },\n                endZoom: function (isCurrentView) {\n                    this._hub._endZoom(isCurrentView);\n                }\n            });\n\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get duplicateSection() { return \"Hub duplicate sections: Each HubSection must be unique\"; },\n                get invalidContent() { return \"Invalid content: Hub content must be made up of HubSections.\"; },\n                get hubViewportAriaLabel() { return _Resources._getWinJSString(\"ui/hubViewportAriaLabel\").value; }\n            };\n\n            return Hub;\n        })\n    });\n\n});\n\ndefine('require-style!less/styles-lightdismissservice',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\nvar __extends = this.__extends || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    __.prototype = b.prototype;\n    d.prototype = new __();\n};\ndefine('WinJS/_LightDismissService',[\"require\", \"exports\", './Application', './Core/_Base', './Core/_BaseUtils', './Utilities/_ElementUtilities', './Core/_Global', './Utilities/_KeyboardBehavior', './Core/_Log', './Core/_Resources'], function (require, exports, Application, _Base, _BaseUtils, _ElementUtilities, _Global, _KeyboardBehavior, _Log, _Resources) {\n    require([\"require-style!less/styles-lightdismissservice\"]);\n    \"use strict\";\n    var baseZIndex = 1000;\n    var Strings = {\n        get closeOverlay() {\n            return _Resources._getWinJSString(\"ui/closeOverlay\").value;\n        }\n    };\n    exports._ClassNames = {\n        _clickEater: \"win-clickeater\"\n    };\n    var EventNames = {\n        requestingFocusOnKeyboardInput: \"requestingfocusonkeyboardinput\"\n    };\n    exports.LightDismissalReasons = {\n        tap: \"tap\",\n        lostFocus: \"lostFocus\",\n        escape: \"escape\",\n        hardwareBackButton: \"hardwareBackButton\",\n        windowResize: \"windowResize\",\n        windowBlur: \"windowBlur\"\n    };\n    // Built-in implementations of ILightDismissable's onShouldLightDismiss.\n    exports.DismissalPolicies = {\n        light: function LightDismissalPolicies_light_onShouldLightDismiss(info) {\n            switch (info.reason) {\n                case exports.LightDismissalReasons.tap:\n                case exports.LightDismissalReasons.escape:\n                    if (info.active) {\n                        return true;\n                    }\n                    else {\n                        info.stopPropagation();\n                        return false;\n                    }\n                    break;\n                case exports.LightDismissalReasons.hardwareBackButton:\n                    if (info.active) {\n                        info.preventDefault(); // prevent backwards navigation in the app\n                        return true;\n                    }\n                    else {\n                        info.stopPropagation();\n                        return false;\n                    }\n                    break;\n                case exports.LightDismissalReasons.lostFocus:\n                case exports.LightDismissalReasons.windowResize:\n                case exports.LightDismissalReasons.windowBlur:\n                    return true;\n            }\n        },\n        modal: function LightDismissalPolicies_modal_onShouldLightDismiss(info) {\n            // Light dismiss cues should not be seen by dismissables behind the modal\n            info.stopPropagation();\n            switch (info.reason) {\n                case exports.LightDismissalReasons.tap:\n                case exports.LightDismissalReasons.lostFocus:\n                case exports.LightDismissalReasons.windowResize:\n                case exports.LightDismissalReasons.windowBlur:\n                    return false;\n                    break;\n                case exports.LightDismissalReasons.escape:\n                    return info.active;\n                    break;\n                case exports.LightDismissalReasons.hardwareBackButton:\n                    info.preventDefault(); // prevent backwards navigation in the app\n                    return info.active;\n                    break;\n            }\n        },\n        sticky: function LightDismissalPolicies_sticky_onShouldLightDismiss(info) {\n            info.stopPropagation();\n            return false;\n        }\n    };\n    var KeyboardInfoType = {\n        keyDown: \"keyDown\",\n        keyUp: \"keyUp\",\n        keyPress: \"keyPress\"\n    };\n    var AbstractDismissableElement = (function () {\n        function AbstractDismissableElement(args) {\n            this.element = args.element;\n            this.element.tabIndex = args.tabIndex;\n            this.onLightDismiss = args.onLightDismiss;\n            // Allow the caller to override the default implementations of our ILightDismissable methods.\n            if (args.onTakeFocus) {\n                this.onTakeFocus = args.onTakeFocus;\n            }\n            if (args.onShouldLightDismiss) {\n                this.onShouldLightDismiss = args.onShouldLightDismiss;\n            }\n            this._ldeOnKeyDownBound = this._ldeOnKeyDown.bind(this);\n            this._ldeOnKeyUpBound = this._ldeOnKeyUp.bind(this);\n            this._ldeOnKeyPressBound = this._ldeOnKeyPress.bind(this);\n        }\n        AbstractDismissableElement.prototype.restoreFocus = function () {\n            var activeElement = _Global.document.activeElement;\n            if (activeElement && this.containsElement(activeElement)) {\n                this._ldeCurrentFocus = activeElement;\n                return true;\n            }\n            else {\n                // If the last input type was keyboard, use focus() so a keyboard focus visual is drawn.\n                // Otherwise, use setActive() so no focus visual is drawn.\n                var useSetActive = !_KeyboardBehavior._keyboardSeenLast;\n                return this._ldeCurrentFocus && this.containsElement(this._ldeCurrentFocus) && _ElementUtilities._tryFocusOnAnyElement(this._ldeCurrentFocus, useSetActive);\n            }\n        };\n        AbstractDismissableElement.prototype._ldeOnKeyDown = function (eventObject) {\n            this._ldeService.keyDown(this, eventObject);\n        };\n        AbstractDismissableElement.prototype._ldeOnKeyUp = function (eventObject) {\n            this._ldeService.keyUp(this, eventObject);\n        };\n        AbstractDismissableElement.prototype._ldeOnKeyPress = function (eventObject) {\n            this._ldeService.keyPress(this, eventObject);\n        };\n        // ILightDismissable\n        //\n        AbstractDismissableElement.prototype.setZIndex = function (zIndex) {\n            this.element.style.zIndex = zIndex;\n        };\n        AbstractDismissableElement.prototype.getZIndexCount = function () {\n            return 1;\n        };\n        AbstractDismissableElement.prototype.containsElement = function (element) {\n            return this.element.contains(element);\n        };\n        AbstractDismissableElement.prototype.onTakeFocus = function (useSetActive) {\n            this.restoreFocus() || _ElementUtilities._focusFirstFocusableElement(this.element, useSetActive) || _ElementUtilities._tryFocusOnAnyElement(this.element, useSetActive);\n        };\n        AbstractDismissableElement.prototype.onFocus = function (element) {\n            this._ldeCurrentFocus = element;\n        };\n        AbstractDismissableElement.prototype.onShow = function (service) {\n            this._ldeService = service;\n            this.element.addEventListener(\"keydown\", this._ldeOnKeyDownBound);\n            this.element.addEventListener(\"keyup\", this._ldeOnKeyUpBound);\n            this.element.addEventListener(\"keypress\", this._ldeOnKeyPressBound);\n        };\n        AbstractDismissableElement.prototype.onHide = function () {\n            this._ldeCurrentFocus = null;\n            this._ldeService = null;\n            this.element.removeEventListener(\"keydown\", this._ldeOnKeyDownBound);\n            this.element.removeEventListener(\"keyup\", this._ldeOnKeyUpBound);\n            this.element.removeEventListener(\"keypress\", this._ldeOnKeyPressBound);\n        };\n        // Concrete subclasses are expected to implement these.\n        AbstractDismissableElement.prototype.onKeyInStack = function (info) {\n        };\n        AbstractDismissableElement.prototype.onShouldLightDismiss = function (info) {\n            return false;\n        };\n        // Consumers of concrete subclasses of AbstractDismissableElement are expected to\n        // provide these as parameters to the constructor.\n        AbstractDismissableElement.prototype.onLightDismiss = function (info) {\n        };\n        return AbstractDismissableElement;\n    })();\n    var LightDismissableElement = (function (_super) {\n        __extends(LightDismissableElement, _super);\n        function LightDismissableElement() {\n            _super.apply(this, arguments);\n        }\n        LightDismissableElement.prototype.onKeyInStack = function (info) {\n        };\n        LightDismissableElement.prototype.onShouldLightDismiss = function (info) {\n            return exports.DismissalPolicies.light(info);\n        };\n        return LightDismissableElement;\n    })(AbstractDismissableElement);\n    exports.LightDismissableElement = LightDismissableElement;\n    var ModalElement = (function (_super) {\n        __extends(ModalElement, _super);\n        function ModalElement() {\n            _super.apply(this, arguments);\n        }\n        ModalElement.prototype.onKeyInStack = function (info) {\n            // stopPropagation so that none of the app's other event handlers will see the event.\n            // Don't preventDefault so that the browser's hotkeys will still work.\n            info.stopPropagation();\n        };\n        ModalElement.prototype.onShouldLightDismiss = function (info) {\n            return exports.DismissalPolicies.modal(info);\n        };\n        return ModalElement;\n    })(AbstractDismissableElement);\n    exports.ModalElement = ModalElement;\n    // An implementation of ILightDismissable that represents the HTML body element. It can never be dismissed. The\n    // service should instantiate one of these to act as the bottommost light dismissable at all times (it isn't expected\n    // for anybody else to instantiate one). It takes care of restoring focus when the last dismissable is dismissed.\n    var LightDismissableBody = (function () {\n        function LightDismissableBody() {\n        }\n        LightDismissableBody.prototype.setZIndex = function (zIndex) {\n        };\n        LightDismissableBody.prototype.getZIndexCount = function () {\n            return 1;\n        };\n        LightDismissableBody.prototype.containsElement = function (element) {\n            return _Global.document.body.contains(element);\n        };\n        LightDismissableBody.prototype.onTakeFocus = function (useSetActive) {\n            this.currentFocus && this.containsElement(this.currentFocus) && _ElementUtilities._tryFocusOnAnyElement(this.currentFocus, useSetActive);\n        };\n        LightDismissableBody.prototype.onFocus = function (element) {\n            this.currentFocus = element;\n        };\n        LightDismissableBody.prototype.onShow = function (service) {\n        };\n        LightDismissableBody.prototype.onHide = function () {\n            this.currentFocus = null;\n        };\n        LightDismissableBody.prototype.onKeyInStack = function (info) {\n        };\n        LightDismissableBody.prototype.onShouldLightDismiss = function (info) {\n            return false;\n        };\n        LightDismissableBody.prototype.onLightDismiss = function (info) {\n        };\n        return LightDismissableBody;\n    })();\n    ;\n    var LightDismissService = (function () {\n        function LightDismissService() {\n            this._debug = false; // Disables dismiss due to window blur. Useful during debugging.\n            this._clients = [];\n            this._notifying = false;\n            this._bodyClient = new LightDismissableBody();\n            // State private to _updateDom. No other method should make use of it.\n            this._updateDom_rendered = {\n                serviceActive: false\n            };\n            this._clickEaterEl = this._createClickEater();\n            this._onBeforeRequestingFocusOnKeyboardInputBound = this._onBeforeRequestingFocusOnKeyboardInput.bind(this);\n            this._onFocusInBound = this._onFocusIn.bind(this);\n            this._onKeyDownBound = this._onKeyDown.bind(this);\n            this._onWindowResizeBound = this._onWindowResize.bind(this);\n            this._onClickEaterPointerUpBound = this._onClickEaterPointerUp.bind(this);\n            this._onClickEaterPointerCancelBound = this._onClickEaterPointerCancel.bind(this);\n            // Register for infrequent events.\n            Application.addEventListener(\"backclick\", this._onBackClick.bind(this));\n            // Focus handlers generally use _ElementUtilities._addEventListener with focusout/focusin. This\n            // uses the browser's blur event directly beacuse _addEventListener doesn't support focusout/focusin\n            // on window.\n            _Global.window.addEventListener(\"blur\", this._onWindowBlur.bind(this));\n            this.shown(this._bodyClient);\n        }\n        // Dismissables should call this as soon as they are ready to be shown. More specifically, they should call this:\n        //   - After they are in the DOM and ready to receive focus (e.g. style.display cannot = \"none\")\n        //   - Before their entrance animation is played\n        LightDismissService.prototype.shown = function (client) {\n            var index = this._clients.indexOf(client);\n            if (index === -1) {\n                this._clients.push(client);\n                client.onShow(this);\n                this._updateDom();\n            }\n        };\n        // Dismissables should call this when they are done being dismissed (i.e. after their exit animation has finished)\n        LightDismissService.prototype.hidden = function (client) {\n            var index = this._clients.indexOf(client);\n            if (index !== -1) {\n                this._clients.splice(index, 1);\n                client.setZIndex(\"\");\n                client.onHide();\n                this._updateDom();\n            }\n        };\n        // Dismissables should call this when their state has changed such that it'll affect the behavior of some method\n        // in its ILightDismissable interface. For example, if the dismissable was altered such that getZIndexCount will\n        // now return 2 instead of 1, that dismissable should call *updated* so the LightDismissService can find out about\n        // this change.\n        LightDismissService.prototype.updated = function (client) {\n            this._updateDom();\n        };\n        LightDismissService.prototype.keyDown = function (client, eventObject) {\n            if (eventObject.keyCode === _ElementUtilities.Key.escape) {\n                this._escapePressed(eventObject);\n            }\n            else {\n                this._dispatchKeyboardEvent(client, KeyboardInfoType.keyDown, eventObject);\n            }\n        };\n        LightDismissService.prototype.keyUp = function (client, eventObject) {\n            this._dispatchKeyboardEvent(client, KeyboardInfoType.keyUp, eventObject);\n        };\n        LightDismissService.prototype.keyPress = function (client, eventObject) {\n            this._dispatchKeyboardEvent(client, KeyboardInfoType.keyPress, eventObject);\n        };\n        LightDismissService.prototype.isShown = function (client) {\n            return this._clients.indexOf(client) !== -1;\n        };\n        LightDismissService.prototype.isTopmost = function (client) {\n            return client === this._clients[this._clients.length - 1];\n        };\n        // Disables dismiss due to window blur. Useful during debugging.\n        LightDismissService.prototype._setDebug = function (debug) {\n            this._debug = debug;\n        };\n        LightDismissService.prototype._updateDom = function (options) {\n            options = options || {};\n            var activeDismissableNeedsFocus = !!options.activeDismissableNeedsFocus;\n            var rendered = this._updateDom_rendered;\n            if (this._notifying) {\n                return;\n            }\n            var serviceActive = this._clients.length > 1;\n            if (serviceActive !== rendered.serviceActive) {\n                // Unregister/register for events that occur frequently.\n                if (serviceActive) {\n                    Application.addEventListener(\"beforerequestingfocusonkeyboardinput\", this._onBeforeRequestingFocusOnKeyboardInputBound);\n                    _ElementUtilities._addEventListener(_Global.document.documentElement, \"focusin\", this._onFocusInBound);\n                    _Global.document.documentElement.addEventListener(\"keydown\", this._onKeyDownBound);\n                    _Global.window.addEventListener(\"resize\", this._onWindowResizeBound);\n                    this._bodyClient.currentFocus = _Global.document.activeElement;\n                    _Global.document.body.appendChild(this._clickEaterEl);\n                }\n                else {\n                    Application.removeEventListener(\"beforerequestingfocusonkeyboardinput\", this._onBeforeRequestingFocusOnKeyboardInputBound);\n                    _ElementUtilities._removeEventListener(_Global.document.documentElement, \"focusin\", this._onFocusInBound);\n                    _Global.document.documentElement.removeEventListener(\"keydown\", this._onKeyDownBound);\n                    _Global.window.removeEventListener(\"resize\", this._onWindowResizeBound);\n                    var parent = this._clickEaterEl.parentNode;\n                    parent && parent.removeChild(this._clickEaterEl);\n                }\n                rendered.serviceActive = serviceActive;\n            }\n            var zIndexGap = 0;\n            var lastUsedZIndex = baseZIndex + 1;\n            this._clients.forEach(function (c, i) {\n                var currentZIndex = lastUsedZIndex + zIndexGap;\n                c.setZIndex(\"\" + currentZIndex);\n                lastUsedZIndex = currentZIndex;\n                // count + 1 so that there's an unused zIndex between each pair of\n                // dismissables that can be used by the click eater.\n                zIndexGap = c.getZIndexCount() + 1;\n            });\n            if (serviceActive) {\n                this._clickEaterEl.style.zIndex = \"\" + (lastUsedZIndex - 1);\n            }\n            var activeDismissable = this._clients.length > 0 ? this._clients[this._clients.length - 1] : null;\n            if (this._activeDismissable !== activeDismissable) {\n                this._activeDismissable = activeDismissable;\n                activeDismissableNeedsFocus = true;\n            }\n            if (activeDismissableNeedsFocus) {\n                // If the last input type was keyboard, use focus() so a keyboard focus visual is drawn.\n                // Otherwise, use setActive() so no focus visual is drawn.\n                var useSetActive = !_KeyboardBehavior._keyboardSeenLast;\n                this._activeDismissable && this._activeDismissable.onTakeFocus(useSetActive);\n            }\n        };\n        LightDismissService.prototype._dispatchKeyboardEvent = function (client, keyboardInfoType, eventObject) {\n            var index = this._clients.indexOf(client);\n            if (index !== -1) {\n                var info = {\n                    type: keyboardInfoType,\n                    keyCode: eventObject.keyCode,\n                    propagationStopped: false,\n                    stopPropagation: function () {\n                        this.propagationStopped = true;\n                        eventObject.stopPropagation();\n                    }\n                };\n                var clients = this._clients.slice(0, index + 1);\n                for (var i = clients.length - 1; i >= 0 && !info.propagationStopped; i--) {\n                    clients[i].onKeyInStack(info);\n                }\n            }\n        };\n        LightDismissService.prototype._dispatchLightDismiss = function (reason, clients, options) {\n            if (this._notifying) {\n                _Log.log && _Log.log('_LightDismissService ignored dismiss trigger to avoid re-entrancy: \"' + reason + '\"', \"winjs _LightDismissService\", \"warning\");\n                return;\n            }\n            clients = clients || this._clients.slice(0);\n            if (clients.length === 0) {\n                return;\n            }\n            this._notifying = true;\n            var lightDismissInfo = {\n                // Which of the LightDismissalReasons caused this event to fire?\n                reason: reason,\n                // Is this dismissable currently the active dismissable?\n                active: false,\n                _stop: false,\n                stopPropagation: function () {\n                    this._stop = true;\n                },\n                _doDefault: true,\n                preventDefault: function () {\n                    this._doDefault = false;\n                }\n            };\n            for (var i = clients.length - 1; i >= 0 && !lightDismissInfo._stop; i--) {\n                lightDismissInfo.active = this._activeDismissable === clients[i];\n                if (clients[i].onShouldLightDismiss(lightDismissInfo)) {\n                    clients[i].onLightDismiss(lightDismissInfo);\n                }\n            }\n            this._notifying = false;\n            this._updateDom(options);\n            return lightDismissInfo._doDefault;\n        };\n        LightDismissService.prototype._onBeforeRequestingFocusOnKeyboardInput = function (eventObject) {\n            // Suppress the requestingFocusOnKeyboardInput event.\n            return true;\n        };\n        //\n        // Light dismiss triggers\n        //\n        // Called by tests.\n        LightDismissService.prototype._clickEaterTapped = function () {\n            this._dispatchLightDismiss(exports.LightDismissalReasons.tap);\n        };\n        LightDismissService.prototype._onFocusIn = function (eventObject) {\n            var target = eventObject.target;\n            for (var i = this._clients.length - 1; i >= 0; i--) {\n                if (this._clients[i].containsElement(target)) {\n                    break;\n                }\n            }\n            if (i !== -1) {\n                this._clients[i].onFocus(target);\n            }\n            if (i + 1 < this._clients.length) {\n                this._dispatchLightDismiss(exports.LightDismissalReasons.lostFocus, this._clients.slice(i + 1), {\n                    activeDismissableNeedsFocus: true\n                });\n            }\n        };\n        LightDismissService.prototype._onKeyDown = function (eventObject) {\n            if (eventObject.keyCode === _ElementUtilities.Key.escape) {\n                this._escapePressed(eventObject);\n            }\n        };\n        LightDismissService.prototype._escapePressed = function (eventObject) {\n            eventObject.preventDefault();\n            eventObject.stopPropagation();\n            this._dispatchLightDismiss(exports.LightDismissalReasons.escape);\n        };\n        // Called by tests.\n        LightDismissService.prototype._onBackClick = function (eventObject) {\n            var doDefault = this._dispatchLightDismiss(exports.LightDismissalReasons.hardwareBackButton);\n            return !doDefault; // Returns whether or not the event was handled.\n        };\n        LightDismissService.prototype._onWindowResize = function (eventObject) {\n            this._dispatchLightDismiss(exports.LightDismissalReasons.windowResize);\n        };\n        LightDismissService.prototype._onWindowBlur = function (eventObject) {\n            if (this._debug) {\n                return;\n            }\n            // Want to trigger a light dismiss on window blur.\n            // We get blur if we click off the window, including into an iframe within our window.\n            // Both blurs call this function, but fortunately document.hasFocus is true if either\n            // the document window or our iframe window has focus.\n            if (!_Global.document.hasFocus()) {\n                // The document doesn't have focus, so they clicked off the app, so light dismiss.\n                this._dispatchLightDismiss(exports.LightDismissalReasons.windowBlur);\n            }\n            else {\n                // We were trying to unfocus the window, but document still has focus,\n                // so make sure the iframe that took the focus will check for blur next time.\n                var active = _Global.document.activeElement;\n                if (active && active.tagName === \"IFRAME\" && !active[\"msLightDismissBlur\"]) {\n                    // - This will go away when the IFRAME goes away, and we only create one.\n                    // - This only works in IE because other browsers don't fire focus events on iframe elements.\n                    // - Can't use _ElementUtilities._addEventListener's focusout because it doesn't fire when an\n                    //   iframe loses focus due to changing windows.\n                    active.addEventListener(\"blur\", this._onWindowBlur.bind(this), false);\n                    active[\"msLightDismissBlur\"] = true;\n                }\n            }\n        };\n        LightDismissService.prototype._createClickEater = function () {\n            var clickEater = _Global.document.createElement(\"section\");\n            clickEater.className = exports._ClassNames._clickEater;\n            _ElementUtilities._addEventListener(clickEater, \"pointerdown\", this._onClickEaterPointerDown.bind(this), true);\n            clickEater.addEventListener(\"click\", this._onClickEaterClick.bind(this), true);\n            // Tell Aria that it's clickable\n            clickEater.setAttribute(\"role\", \"menuitem\");\n            clickEater.setAttribute(\"aria-label\", Strings.closeOverlay);\n            // Prevent CED from removing any current selection\n            clickEater.setAttribute(\"unselectable\", \"on\");\n            return clickEater;\n        };\n        LightDismissService.prototype._onClickEaterPointerDown = function (eventObject) {\n            eventObject.stopPropagation();\n            eventObject.preventDefault();\n            this._clickEaterPointerId = eventObject.pointerId;\n            if (!this._registeredClickEaterCleanUp) {\n                _ElementUtilities._addEventListener(_Global.window, \"pointerup\", this._onClickEaterPointerUpBound);\n                _ElementUtilities._addEventListener(_Global.window, \"pointercancel\", this._onClickEaterPointerCancelBound);\n                this._registeredClickEaterCleanUp = true;\n            }\n        };\n        LightDismissService.prototype._onClickEaterPointerUp = function (eventObject) {\n            var _this = this;\n            eventObject.stopPropagation();\n            eventObject.preventDefault();\n            if (eventObject.pointerId === this._clickEaterPointerId) {\n                this._resetClickEaterPointerState();\n                var element = _Global.document.elementFromPoint(eventObject.clientX, eventObject.clientY);\n                if (element === this._clickEaterEl) {\n                    this._skipClickEaterClick = true;\n                    _BaseUtils._yieldForEvents(function () {\n                        _this._skipClickEaterClick = false;\n                    });\n                    this._clickEaterTapped();\n                }\n            }\n        };\n        LightDismissService.prototype._onClickEaterClick = function (eventObject) {\n            eventObject.stopPropagation();\n            eventObject.preventDefault();\n            if (!this._skipClickEaterClick) {\n                // Handle the UIA invoke action on the click eater. this._skipClickEaterClick is false which tells\n                // us that we received a click event without an associated PointerUp event. This means that the click\n                // event was triggered thru UIA rather than thru the GUI.\n                this._clickEaterTapped();\n            }\n        };\n        LightDismissService.prototype._onClickEaterPointerCancel = function (eventObject) {\n            if (eventObject.pointerId === this._clickEaterPointerId) {\n                this._resetClickEaterPointerState();\n            }\n        };\n        LightDismissService.prototype._resetClickEaterPointerState = function () {\n            if (this._registeredClickEaterCleanUp) {\n                _ElementUtilities._removeEventListener(_Global.window, \"pointerup\", this._onClickEaterPointerUpBound);\n                _ElementUtilities._removeEventListener(_Global.window, \"pointercancel\", this._onClickEaterPointerCancelBound);\n            }\n            this._clickEaterPointerId = null;\n            this._registeredClickEaterCleanUp = false;\n        };\n        return LightDismissService;\n    })();\n    var service = new LightDismissService();\n    exports.shown = service.shown.bind(service);\n    exports.hidden = service.hidden.bind(service);\n    exports.updated = service.updated.bind(service);\n    exports.isShown = service.isShown.bind(service);\n    exports.isTopmost = service.isTopmost.bind(service);\n    exports.keyDown = service.keyDown.bind(service);\n    exports.keyUp = service.keyUp.bind(service);\n    exports.keyPress = service.keyPress.bind(service);\n    exports._clickEaterTapped = service._clickEaterTapped.bind(service);\n    exports._onBackClick = service._onBackClick.bind(service);\n    exports._setDebug = service._setDebug.bind(service);\n    _Base.Namespace.define(\"WinJS.UI._LightDismissService\", {\n        shown: exports.shown,\n        hidden: exports.hidden,\n        updated: exports.updated,\n        isShown: exports.isShown,\n        isTopmost: exports.isTopmost,\n        keyDown: exports.keyDown,\n        keyUp: exports.keyUp,\n        keyPress: exports.keyPress,\n        _clickEaterTapped: exports._clickEaterTapped,\n        _onBackClick: exports._onBackClick,\n        _setDebug: exports._setDebug,\n        LightDismissableElement: LightDismissableElement,\n        DismissalPolicies: exports.DismissalPolicies,\n        LightDismissalReasons: exports.LightDismissalReasons,\n        _ClassNames: exports._ClassNames,\n        _service: service\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/_LegacyAppBar/_Constants',[\n     'exports',\n     '../../Core/_Base',\n], function appBarConstantsInit(exports, _Base) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, null, {\n        // AppBar class names.\n        appBarClass: \"win-navbar\",\n        firstDivClass: \"win-firstdiv\",\n        finalDivClass: \"win-finaldiv\",\n        invokeButtonClass: \"win-navbar-invokebutton\",\n        ellipsisClass: \"win-navbar-ellipsis\",\n        primaryCommandsClass: \"win-primarygroup\",\n        secondaryCommandsClass: \"win-secondarygroup\",\n        commandLayoutClass: \"win-commandlayout\",\n        menuLayoutClass: \"win-menulayout\",\n        topClass: \"win-top\",\n        bottomClass: \"win-bottom\",\n        showingClass : \"win-navbar-opening\",\n        shownClass : \"win-navbar-opened\",\n        hidingClass : \"win-navbar-closing\",\n        hiddenClass: \"win-navbar-closed\",\n        compactClass: \"win-navbar-compact\",\n        minimalClass: \"win-navbar-minimal\",\n        menuContainerClass: \"win-navbar-menu\",\n\n        // Constants for AppBar placement\n        appBarPlacementTop: \"top\",\n        appBarPlacementBottom: \"bottom\",\n\n        // Constants for AppBar layouts\n        appBarLayoutCustom: \"custom\",\n        appBarLayoutCommands: \"commands\",\n        appBarLayoutMenu: \"menu\",\n\n        // Constant for AppBar invokebutton width\n        appBarInvokeButtonWidth: 32,\n\n        // Constants for Commands\n        typeSeparator: \"separator\",\n        typeContent: \"content\",\n        typeButton: \"button\",\n        typeToggle: \"toggle\",\n        typeFlyout: \"flyout\",\n        appBarCommandClass: \"win-command\",\n        appBarCommandGlobalClass: \"win-global\",\n        appBarCommandSelectionClass: \"win-selection\",\n        sectionSelection: \"selection\", /* deprecated, use sectionSecondary */\n        sectionGlobal: \"global\", /* deprecated, use sectionPrimary */\n        sectionPrimary: \"primary\",\n        sectionSecondary: \"secondary\",\n\n        // Constants for Menus\n        menuCommandClass: \"win-command\",\n        menuCommandButtonClass: \"win-command-button\",\n        menuCommandToggleClass: \"win-command-toggle\",\n        menuCommandFlyoutClass: \"win-command-flyout\",\n        menuCommandFlyoutActivatedClass: \"win-command-flyout-activated\",\n        menuCommandSeparatorClass: \"win-command-separator\",\n        _menuCommandInvokedEvent: \"_invoked\", // Private event\n        menuClass: \"win-menu\",\n        menuContainsToggleCommandClass: \"win-menu-containstogglecommand\",\n        menuContainsFlyoutCommandClass: \"win-menu-containsflyoutcommand\",\n        menuMouseSpacingClass: \"win-menu-mousespacing\",\n        menuTouchSpacingClass: \"win-menu-touchspacing\",\n        menuCommandHoverDelay: 400,\n\n        // Other class names\n        overlayClass: \"win-overlay\",\n        flyoutClass: \"win-flyout\",\n        flyoutLightClass: \"win-ui-light\",\n        settingsFlyoutClass: \"win-settingsflyout\",\n        scrollsClass: \"win-scrolls\",\n        pinToRightEdge: -1,\n        pinToBottomEdge: -1,\n\n        // Constants for AppBarCommand full-size widths.\n        separatorWidth: 34,\n        buttonWidth: 68,\n\n        narrowClass: \"win-narrow\",\n        wideClass: \"win-wide\",\n        _visualViewportClass: \"win-visualviewport-space\",\n\n        // Event names\n        commandPropertyMutated: \"_commandpropertymutated\",\n        commandVisibilityChanged: \"commandvisibilitychanged\",\n    });\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Utilities/_KeyboardInfo',[\"require\", \"exports\", '../Core/_BaseCoreUtils', '../Core/_Global', '../Core/_WinRT'], function (require, exports, _BaseCoreUtils, _Global, _WinRT) {\n    \"use strict\";\n    var _Constants = {\n        visualViewportClass: \"win-visualviewport-space\",\n        scrollTimeout: 150,\n    };\n    // This private module provides accurate metrics for the Visual Viewport and WWA's IHM offsets in Win10 WWA \n    // where \"-ms-device-fixed\" CSS positioning is supported. WinJS controls will also use this module for\n    // positoning themselves relative to the viewport in a web browser outside of WWA. Their preference is still \n    // to rely on \"-ms-device-fixed\" positioning, but currently fallback to \"fixed\" positioning in enviornments where\n    // \"-ms-device-fixed\" is not supported.\n    exports._KeyboardInfo;\n    // WWA Soft Keyboard offsets\n    exports._KeyboardInfo = {\n        // Determine if the keyboard is visible or not.\n        get _visible() {\n            try {\n                return (_WinRT.Windows.UI.ViewManagement.InputPane && _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height > 0);\n            }\n            catch (e) {\n                return false;\n            }\n        },\n        // See if we have to reserve extra space for the IHM\n        get _extraOccluded() {\n            var occluded = 0;\n            // Controls using -ms-device-fixed positioning only need to reposition themselves to remain visible\n            // If the IHM has not resized the viewport.  \n            if (!exports._KeyboardInfo._isResized && _WinRT.Windows.UI.ViewManagement.InputPane) {\n                occluded = _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height;\n            }\n            return occluded;\n        },\n        // See if the view has been resized to fit a keyboard\n        get _isResized() {\n            // Compare ratios.  Very different includes IHM space.\n            var heightRatio = _Global.document.documentElement.clientHeight / _Global.innerHeight, widthRatio = _Global.document.documentElement.clientWidth / _Global.innerWidth;\n            // If they're nearly identical, then the view hasn't been resized for the IHM\n            // Only check one bound because we know the IHM will make it shorter, not skinnier.\n            return (widthRatio / heightRatio < 0.99);\n        },\n        // Get the bottom of the visible area, relative to the top edge of the visible area.\n        get _visibleDocBottom() {\n            return exports._KeyboardInfo._visibleDocTop + exports._KeyboardInfo._visibleDocHeight;\n        },\n        // Get the height of the visible area, e.g. the height of the visual viewport minus any IHM occlusion.\n        get _visibleDocHeight() {\n            return exports._KeyboardInfo._visualViewportHeight - exports._KeyboardInfo._extraOccluded;\n        },\n        // Get the top offset of our visible area, aka the top of the visual viewport.\n        // This is always 0 when elements use -ms-device-fixed positioning.\n        get _visibleDocTop() {\n            return 0;\n        },\n        // Get the offset for, and relative to, the bottom edge of the visual viewport plus any IHM occlusion.\n        get _visibleDocBottomOffset() {\n            // For -ms-device-fixed positioned elements, the bottom is just 0 when there's no IHM.\n            // When the IHM appears, the text input that invoked it may be in a position on the page that is occluded by the IHM.\n            // In that instance, the default browser behavior is to resize the visual viewport and scroll the input back into view.\n            // However, if the viewport resize is prevented by an IHM event listener, the keyboard will still occlude\n            // -ms-device-fixed elements, so we adjust the bottom offset of the appbar by the height of the occluded rect of the IHM.\n            return exports._KeyboardInfo._extraOccluded;\n        },\n        // Get the visual viewport height. window.innerHeight doesn't return floating point values which are present with high DPI.\n        get _visualViewportHeight() {\n            var boundingRect = exports._KeyboardInfo._visualViewportSpace;\n            return boundingRect.height;\n        },\n        // Get the visual viewport width. window.innerWidth doesn't return floating point values which are present with high DPI.\n        get _visualViewportWidth() {\n            var boundingRect = exports._KeyboardInfo._visualViewportSpace;\n            return boundingRect.width;\n        },\n        // The visual viewport space element is hidden given -ms-device-fixed positioning and used to calculate\n        // the 4 edges of the visual viewport with floating point precision. \n        get _visualViewportSpace() {\n            var visualViewportSpace = _Global.document.body.querySelector(\".\" + _Constants.visualViewportClass);\n            if (!visualViewportSpace) {\n                visualViewportSpace = _Global.document.createElement(\"DIV\");\n                visualViewportSpace.className = _Constants.visualViewportClass;\n                _Global.document.body.appendChild(visualViewportSpace);\n            }\n            return visualViewportSpace.getBoundingClientRect();\n        },\n        // Get total length of the IHM showPanel animation\n        get _animationShowLength() {\n            if (_BaseCoreUtils.hasWinRT) {\n                if (_WinRT.Windows.UI.Core.AnimationMetrics) {\n                    // Desktop exposes the AnimationMetrics API that allows us to look up the relevant IHM animation metrics.\n                    var a = _WinRT.Windows.UI.Core.AnimationMetrics, animationDescription = new a.AnimationDescription(a.AnimationEffect.showPanel, a.AnimationEffectTarget.primary);\n                    var animations = animationDescription.animations;\n                    var max = 0;\n                    for (var i = 0; i < animations.size; i++) {\n                        var animation = animations[i];\n                        max = Math.max(max, animation.delay + animation.duration);\n                    }\n                    return max;\n                }\n                else {\n                    // Phone platform does not yet expose the Animation Metrics API. \n                    // Hard code the correct values for the time being.\n                    // https://github.com/winjs/winjs/issues/1060\n                    var animationDuration = 300;\n                    var animationDelay = 50;\n                    return animationDelay + animationDuration;\n                }\n            }\n            else {\n                return 0;\n            }\n        },\n        // Padding for IHM timer to allow for first scroll event. Tpyically used in conjunction with the\n        // _animationShowLength to determine the length of time in which a showing IHM would have triggered\n        // a window resize to occur.\n        get _scrollTimeout() {\n            return _Constants.scrollTimeout;\n        },\n        // _layoutViewportCoords is used with elements that use position:fixed instead of position:-ms-device-fixed\n        get _layoutViewportCoords() {\n            var topOffset = _Global.window.pageYOffset - _Global.document.documentElement.scrollTop;\n            var bottomOffset = _Global.document.documentElement.clientHeight - (topOffset + this._visibleDocHeight);\n            return {\n                visibleDocTop: topOffset,\n                visibleDocBottom: bottomOffset\n            };\n        }\n    };\n});\n\n\ndefine('require-style!less/styles-overlay',[],function(){});\n\ndefine('require-style!less/colors-overlay',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <dictionary>animatable,appbar,appbars,divs,Flyout,Flyouts,iframe,Statics,unfocus,unselectable</dictionary>\ndefine('WinJS/Controls/Flyout/_Overlay',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_WinRT',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Events',\n    '../../Core/_Resources',\n    '../../Core/_WriteProfilerMark',\n    '../../_Accents',\n    '../../Animations',\n    '../../Application',\n    '../../ControlProcessor',\n    '../../Promise',\n    '../../Scheduler',\n    '../../Utilities/_Control',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_KeyboardInfo',\n    '../_LegacyAppBar/_Constants',\n    'require-style!less/styles-overlay',\n    'require-style!less/colors-overlay'\n], function overlayInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, _Accents, Animations, Application, ControlProcessor, Promise, Scheduler, _Control, _ElementUtilities, _KeyboardInfo, _Constants) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\n        \"button[aria-checked=true].win-command:before,\\\n         .win-menu-containsflyoutcommand button.win-command-flyout-activated:before\", [\n        { name: \"background-color\", value: _Accents.ColorTypes.accent },\n        { name: \"border-color\", value: _Accents.ColorTypes.accent },\n    ]);\n\n    _Accents.createAccentRule(\".win-flyout, .win-settingsflyout\", [{ name: \"border-color\", value: _Accents.ColorTypes.accent }]);\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _Overlay: _Base.Namespace._lazy(function () {\n\n            // Helper for Global Event listeners. Invokes the specified callback member function on each _Overlay in the DOM.\n            function _allOverlaysCallback(event, nameOfFunctionCall, stopImmediatePropagationWhenHandled) {\n                var elements = _Global.document.querySelectorAll(\".\" + _Constants.overlayClass);\n                if (elements) {\n                    var len = elements.length;\n                    for (var i = 0; i < len; i++) {\n                        var element = elements[i];\n                        var overlay = element.winControl;\n                        if (!overlay._disposed) {\n                            if (overlay) {\n                                var handled = overlay[nameOfFunctionCall](event);\n                                if (stopImmediatePropagationWhenHandled && handled) {\n                                    // The caller has indicated we should exit as soon as the event is handled.\n                                    return handled;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            // _Overlay Global Events Listener Class. We hang a singleton instance of this class off of a static _Overlay property.\n            var _GlobalListener = _Base.Class.define(function _GlobalListener_ctor() {\n                this._currentState = _GlobalListener.states.off;\n\n                this._inputPaneShowing = this._inputPaneShowing.bind(this);\n                this._inputPaneHiding = this._inputPaneHiding.bind(this);\n                this._documentScroll = this._documentScroll.bind(this);\n                this._windowResized = this._windowResized.bind(this);\n            }, {\n                initialize: function _GlobalListener_initialize() {\n                    this._toggleListeners(_GlobalListener.states.on);\n                },\n                // Expose this for unit tests.\n                reset: function _GlobalListener_reset() {\n                    this._toggleListeners(_GlobalListener.states.off);\n                    this._toggleListeners(_GlobalListener.states.on);\n                },\n                _inputPaneShowing: function _GlobalListener_inputePaneShowing(event) {\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_showingKeyboard,StartTM\");\n                    _allOverlaysCallback(event, \"_showingKeyboard\");\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_showingKeyboard,StopTM\");\n                },\n                _inputPaneHiding: function _GlobalListener_inputPaneHiding(event) {\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_hidingKeyboard,StartTM\");\n                    _allOverlaysCallback(event, \"_hidingKeyboard\");\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_hidingKeyboard,StopTM\");\n                },\n                _documentScroll: function _GlobalListener_documentScroll(event) {\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_checkScrollPosition,StartTM\");\n                    _allOverlaysCallback(event, \"_checkScrollPosition\");\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_checkScrollPosition,StopTM\");\n                },\n                _windowResized: function _GlobalListener_windowResized(event) {\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_baseResize,StartTM\");\n                    _allOverlaysCallback(event, \"_baseResize\");\n                    _WriteProfilerMark(_GlobalListener.profilerString + \"_baseResize,StopTM\");\n                },\n                _toggleListeners: function _GlobalListener_toggleListeners(newState) {\n                    // Add/Remove global event listeners for all _Overlays\n                    var listenerOperation;\n                    if (this._currentState !== newState) {\n                        if (newState === _GlobalListener.states.on) {\n                            listenerOperation = \"addEventListener\";\n                        } else if (newState === _GlobalListener.states.off) {\n                            listenerOperation = \"removeEventListener\";\n                        }\n\n                        if (_WinRT.Windows.UI.ViewManagement.InputPane) {\n                            // React to Soft Keyboard events\n                            var inputPane = _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView();\n                            inputPane[listenerOperation](\"showing\", this._inputPaneShowing, false);\n                            inputPane[listenerOperation](\"hiding\", this._inputPaneHiding, false);\n\n                            _Global.document[listenerOperation](\"scroll\", this._documentScroll, false);\n                        }\n\n                        // Window resize event\n                        _Global.addEventListener(\"resize\", this._windowResized, false);\n\n                        this._currentState = newState;\n                    }\n                },\n            }, {\n                // Statics\n                profilerString: {\n                    get: function () {\n                        return \"WinJS.UI._Overlay Global Listener:\";\n                    }\n                },\n                states: {\n                    get: function () {\n                        return {\n                            off: 0,\n                            on: 1,\n                        };\n                    },\n                },\n            });\n\n            // Helper to get DOM elements from input single object or array or IDs/toolkit/dom elements\n            function _resolveElements(elements) {\n                // No input is just an empty array\n                if (!elements) {\n                    return [];\n                }\n\n                // Make sure it's in array form.\n                if (typeof elements === \"string\" || !elements || !elements.length) {\n                    elements = [elements];\n                }\n\n                // Make sure we have a DOM element for each one, (could be string id name or toolkit object)\n                var i,\n                    realElements = [];\n                for (i = 0; i < elements.length; i++) {\n                    if (elements[i]) {\n                        if (typeof elements[i] === \"string\") {\n                            var element = _Global.document.getElementById(elements[i]);\n                            if (element) {\n                                realElements.push(element);\n                            }\n                        } else if (elements[i].element) {\n                            realElements.push(elements[i].element);\n                        } else {\n                            realElements.push(elements[i]);\n                        }\n                    }\n                }\n\n                return realElements;\n            }\n\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get mustContainCommands() { return \"Invalid HTML: AppBars/Menus must contain only AppBarCommands/MenuCommands\"; },\n                get closeOverlay() { return _Resources._getWinJSString(\"ui/closeOverlay\").value; },\n            };\n\n            var _Overlay = _Base.Class.define(function _Overlay_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI._Overlay\">\n                /// <summary locid=\"WinJS.UI._Overlay\">\n                /// Constructs the Overlay control and associates it with the underlying DOM element.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI._Overlay_p:element\">\n                /// The DOM element to be associated with the Overlay control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI._Overlay_p:options\">\n                /// The set of options to be applied initially to the Overlay control.\n                /// </param>\n                /// <returns type=\"WinJS.UI._Overlay\" locid=\"WinJS.UI._Overlay_returnValue\">A fully constructed Overlay control.</returns>\n                /// </signature>\n                this._baseOverlayConstructor(element, options);\n            }, {\n                // Functions/properties\n                _baseOverlayConstructor: function _Overlay_baseOverlayConstructor(element, options) {\n\n                    this._disposed = false;\n\n                    // Make sure there's an input element\n                    if (!element) {\n                        element = _Global.document.createElement(\"div\");\n                    }\n\n                    // Check to make sure we weren't duplicated\n                    var overlay = element.winControl;\n                    if (overlay) {\n                        throw new _ErrorFromName(\"WinJS.UI._Overlay.DuplicateConstruction\", strings.duplicateConstruction);\n                    }\n\n                    if (!this._element) {\n                        this._element = element;\n                    }\n\n                    if (!this._element.hasAttribute(\"tabIndex\")) {\n                        this._element.tabIndex = -1;\n                    }\n\n                    this._sticky = false;\n                    this._doNext = \"\";\n\n                    this._element.style.visibility = \"hidden\";\n                    this._element.style.opacity = 0;\n\n                    // Remember ourselves\n                    element.winControl = this;\n\n                    // Attach our css class\n                    _ElementUtilities.addClass(this._element, _Constants.overlayClass);\n                    _ElementUtilities.addClass(this._element, \"win-disposable\");\n\n                    // We don't want to be selectable, set UNSELECTABLE\n                    var unselectable = this._element.getAttribute(\"unselectable\");\n                    if (unselectable === null || unselectable === undefined) {\n                        this._element.setAttribute(\"unselectable\", \"on\");\n                    }\n\n                    // Base animation is popIn/popOut\n                    this._currentAnimateIn = this._baseAnimateIn;\n                    this._currentAnimateOut = this._baseAnimateOut;\n                    this._animationPromise = Promise.as();\n\n                    // Command Animations to Queue\n                    this._queuedToShow = [];\n                    this._queuedToHide = [];\n                    this._queuedCommandAnimation = false;\n\n                    if (options) {\n                        _Control.setOptions(this, options);\n                    }\n\n                    // Make sure _Overlay event handlers are hooked up (this aids light dismiss)\n                    _Overlay._globalEventListeners.initialize();\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI._Overlay.element\" helpKeyword=\"WinJS.UI._Overlay.element\">The DOM element the Overlay is attached to</field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.Overlay.dispose\">\n                    /// <summary locid=\"WinJS.UI.Overlay.dispose\">\n                    /// Disposes this Overlay.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    this._disposed = true;\n                    this._dispose();\n                },\n\n                _dispose: function _Overlay_dispose() {\n                    // To be overridden by subclasses\n                },\n\n                _show: function _Overlay_show() {\n                    // We call our base _baseShow because AppBar may need to override show\n                    this._baseShow();\n                },\n\n                _hide: function _Overlay_hide() {\n                    // We call our base _baseHide because AppBar may need to override hide\n                    this._baseHide();\n                },\n\n                // Is the overlay \"hidden\"?\n                /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI._Overlay.hidden\" helpKeyword=\"WinJS.UI._Overlay.hidden\">Gets or sets Overlay's visibility.</field>\n                hidden: {\n                    get: function () {\n                        return (this._element.style.visibility === \"hidden\" ||\n                                this._element.winAnimating === \"hiding\" ||\n                                this._doNext === \"hide\");\n                    },\n                    set: function (hidden) {\n                        var currentlyHidden = this.hidden;\n                        if (!hidden && currentlyHidden) {\n                            this._show();\n                        } else if (hidden && !currentlyHidden) {\n                            this._hide();\n                        }\n                    }\n                },\n\n                addEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI._Overlay.addEventListener\">\n                    /// <summary locid=\"WinJS.UI._Overlay.addEventListener\">\n                    /// Add an event listener to the DOM element for this Overlay\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI._Overlay.addEventListener_p:type\">Required. Event type to add, \"beforehide\", \"afterhide\", \"beforeshow\", or \"aftershow\"</param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI._Overlay.addEventListener_p:listener\">Required. The event handler function to associate with this event.</param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI._Overlay.addEventListener_p:useCapture\">Optional. True, register for the event capturing phase.  False for the event bubbling phase.</param>\n                    /// </signature>\n                    return this._element.addEventListener(type, listener, useCapture);\n                },\n\n                removeEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI._Overlay.removeEventListener\">\n                    /// <summary locid=\"WinJS.UI._Overlay.removeEventListener\">\n                    /// Remove an event listener to the DOM element for this Overlay\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI._Overlay.removeEventListener_p:type\">Required. Event type to remove, \"beforehide\", \"afterhide\", \"beforeshow\", or \"aftershow\"</param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI._Overlay.removeEventListener_p:listener\">Required. The event handler function to associate with this event.</param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI._Overlay.removeEventListener_p:useCapture\">Optional. True, register for the event capturing phase.  False for the event bubbling phase.</param>\n                    /// </signature>\n                    return this._element.removeEventListener(type, listener, useCapture);\n                },\n\n                _baseShow: function _Overlay_baseShow() {\n                    // If we are already animating, just remember this for later\n                    if (this._animating || this._needToHandleHidingKeyboard) {\n                        this._doNext = \"show\";\n                        return false;\n                    }\n\n                    if (this._element.style.visibility !== \"visible\") {\n                        // Let us know we're showing.\n                        this._element.winAnimating = \"showing\";\n\n                        // Hiding, but not none\n                        this._element.style.display = \"\";\n                        this._element.style.visibility = \"hidden\";\n\n                        // In case their event is going to manipulate commands, see if there are\n                        // any queued command animations we can handle while we're still hidden.\n                        if (this._queuedCommandAnimation) {\n                            this._showAndHideFast(this._queuedToShow, this._queuedToHide);\n                            this._queuedToShow = [];\n                            this._queuedToHide = [];\n                        }\n\n                        // Send our \"beforeShow\" event\n                        this._sendEvent(_Overlay.beforeShow);\n\n                        // Need to measure\n                        this._findPosition();\n\n                        // Make sure it's visible, and fully opaque.\n                        // Do the popup thing, sending event afterward.\n                        var that = this;\n                        this._animationPromise = this._currentAnimateIn().\n                        then(function () {\n                            that._baseEndShow();\n                        }, function () {\n                            that._baseEndShow();\n                        });\n                        return true;\n                    }\n                    return false;\n                },\n\n                // Flyout in particular will need to measure our positioning.\n                _findPosition: function _Overlay_findPosition() {\n                },\n\n                _baseEndShow: function _Overlay_baseEndShow() {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // Make sure it's visible after showing\n                    this._element.setAttribute(\"aria-hidden\", \"false\");\n\n                    this._element.winAnimating = \"\";\n\n                    // Do our derived classes show stuff\n                    this._endShow();\n\n                    // We're shown now\n                    if (this._doNext === \"show\") {\n                        this._doNext = \"\";\n                    }\n\n                    // After showing, send the after showing event\n                    this._sendEvent(_Overlay.afterShow);\n                    this._writeProfilerMark(\"show,StopTM\"); // Overlay writes the stop profiler mark for all of its derived classes.\n\n                    // If we had something queued, do that\n                    Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, \"WinJS.UI._Overlay._checkDoNext\");\n\n                },\n\n                _endShow: function _Overlay_endShow() {\n                    // Nothing by default\n                },\n\n                _baseHide: function _Overlay_baseHide() {\n                    // If we are already animating, just remember this for later\n                    if (this._animating) {\n                        this._doNext = \"hide\";\n                        return false;\n                    }\n\n                    // In the unlikely event we're between the hiding keyboard and the resize events, just snap it away:\n                    if (this._needToHandleHidingKeyboard) {\n                        // use the \"uninitialized\" flag\n                        this._element.style.visibility = \"\";\n                    }\n\n                    if (this._element.style.visibility !== \"hidden\") {\n                        // Let us know we're hiding, accessibility as well.\n                        this._element.winAnimating = \"hiding\";\n                        this._element.setAttribute(\"aria-hidden\", \"true\");\n\n                        // Send our \"beforeHide\" event\n                        this._sendEvent(_Overlay.beforeHide);\n\n                        // If our visibility is empty, then this is the first time, just hide it\n                        if (this._element.style.visibility === \"\") {\n                            // Initial hiding, just hide it\n                            this._element.style.opacity = 0;\n                            this._baseEndHide();\n                        } else {\n                            // Make sure it's hidden, and fully transparent.\n                            var that = this;\n                            this._animationPromise = this._currentAnimateOut().\n                            then(function () {\n                                that._baseEndHide();\n                            }, function () {\n                                that._baseEndHide();\n                            });\n                        }\n                        return true;\n                    }\n\n                    return false;\n                },\n\n                _baseEndHide: function _Overlay_baseEndHide() {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // Do our derived classes hide stuff\n                    this._beforeEndHide();\n\n                    // Make sure animation is finished.\n                    this._element.style.visibility = \"hidden\";\n                    this._element.style.display = \"none\";\n                    this._element.winAnimating = \"\";\n\n                    // In case their event is going to manipulate commands, see if there\n                    // are any queued command animations we can handle now we're hidden.\n                    if (this._queuedCommandAnimation) {\n                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);\n                        this._queuedToShow = [];\n                        this._queuedToHide = [];\n                    }\n\n                    // We're hidden now\n                    if (this._doNext === \"hide\") {\n                        this._doNext = \"\";\n                    }\n\n                    // After hiding, send our \"afterHide\" event\n                    this._sendEvent(_Overlay.afterHide);\n                    this._writeProfilerMark(\"hide,StopTM\"); // Overlay writes the stop profiler mark for all of its derived classes.\n\n\n                    // If we had something queued, do that.  This has to be after\n                    // the afterHide event in case it triggers a show() and they\n                    // have something to do in beforeShow that requires afterHide first.\n                    Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, \"WinJS.UI._Overlay._checkDoNext\");\n                },\n\n                // Called after the animation but while the Overlay is still visible. It's\n                // important that this runs while the Overlay is visible because hiding\n                // a DOM element (e.g. visibility=\"hidden\", display=\"none\") while it contains\n                // focus has the side effect of moving focus to the body or null and triggering\n                // focus move events. _beforeEndHide is a good hook for the Overlay to move focus\n                // elsewhere before its DOM element gets hidden.\n                _beforeEndHide: function _Overlay_beforeEndHide() {\n                    // Nothing by default\n                },\n\n                _checkDoNext: function _Overlay_checkDoNext() {\n                    // Do nothing if we're still animating\n                    if (this._animating || this._needToHandleHidingKeyboard || this._disposed) {\n                        return;\n                    }\n\n                    if (this._doNext === \"hide\") {\n                        // Do hide first because animating commands would be easier\n                        this._hide();\n                        this._doNext = \"\";\n                    } else if (this._queuedCommandAnimation) {\n                        // Do queued commands before showing if possible\n                        this._showAndHideQueue();\n                    } else if (this._doNext === \"show\") {\n                        // Show last so that we don't unnecessarily animate commands\n                        this._show();\n                        this._doNext = \"\";\n                    }\n                },\n\n                // Default animations\n                _baseAnimateIn: function _Overlay_baseAnimateIn() {\n                    this._element.style.opacity = 0;\n                    this._element.style.visibility = \"visible\";\n                    // touch opacity so that IE fades from the 0 we just set to 1\n                    _Global.getComputedStyle(this._element, null).opacity;\n                    return Animations.fadeIn(this._element);\n                },\n\n                _baseAnimateOut: function _Overlay_baseAnimateOut() {\n                    this._element.style.opacity = 1;\n                    // touch opacity so that IE fades from the 1 we just set to 0\n                    _Global.getComputedStyle(this._element, null).opacity;\n                    return Animations.fadeOut(this._element);\n                },\n\n                _animating: {\n                    get: function _Overlay_animating_get() {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return !!this._element.winAnimating;\n                    }\n                },\n\n                // Send one of our events\n                _sendEvent: function _Overlay_sendEvent(eventName, detail) {\n                    if (this._disposed) {\n                        return;\n                    }\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initEvent(eventName, true, true, (detail || {}));\n                    this._element.dispatchEvent(event);\n                },\n\n                // Show commands\n                _showCommands: function _Overlay_showCommands(commands, immediate) {\n                    var showHide = this._resolveCommands(commands);\n                    this._showAndHideCommands(showHide.commands, [], immediate);\n                },\n\n                // Hide commands\n                _hideCommands: function _Overlay_hideCommands(commands, immediate) {\n                    var showHide = this._resolveCommands(commands);\n                    this._showAndHideCommands([], showHide.commands, immediate);\n                },\n\n                // Hide commands\n                _showOnlyCommands: function _Overlay_showOnlyCommands(commands, immediate) {\n                    var showHide = this._resolveCommands(commands);\n                    this._showAndHideCommands(showHide.commands, showHide.others, immediate);\n                },\n\n                _showAndHideCommands: function _Overlay_showAndHideCommands(showCommands, hideCommands, immediate) {\n                    // Immediate is \"easy\"\n                    if (immediate || (this.hidden && !this._animating)) {\n                        // Immediate mode (not animated)\n                        this._showAndHideFast(showCommands, hideCommands);\n                        // Need to remove them from queues, but others could be queued\n                        this._removeFromQueue(showCommands, this._queuedToShow);\n                        this._removeFromQueue(hideCommands, this._queuedToHide);\n                    } else {\n\n                        // Queue Commands\n                        this._updateAnimateQueue(showCommands, this._queuedToShow, this._queuedToHide);\n                        this._updateAnimateQueue(hideCommands, this._queuedToHide, this._queuedToShow);\n                    }\n                },\n\n                _removeFromQueue: function _Overlay_removeFromQueue(commands, queue) {\n                    // remove commands from queue.\n                    var count;\n                    for (count = 0; count < commands.length; count++) {\n                        // Remove if it was in queue\n                        var countQ;\n                        for (countQ = 0; countQ < queue.length; countQ++) {\n                            if (queue[countQ] === commands[count]) {\n                                queue.splice(countQ, 1);\n                                break;\n                            }\n                        }\n                    }\n                },\n\n                _updateAnimateQueue: function _Overlay_updateAnimateQueue(addCommands, toQueue, fromQueue) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // Add addCommands to toQueue and remove addCommands from fromQueue.\n                    var count;\n                    for (count = 0; count < addCommands.length; count++) {\n                        // See if it's already in toQueue\n                        var countQ;\n                        for (countQ = 0; countQ < toQueue.length; countQ++) {\n                            if (toQueue[countQ] === addCommands[count]) {\n                                break;\n                            }\n                        }\n                        if (countQ === toQueue.length) {\n                            // Not found, add it\n                            toQueue[countQ] = addCommands[count];\n                        }\n                        // Remove if it was in fromQueue\n                        for (countQ = 0; countQ < fromQueue.length; countQ++) {\n                            if (fromQueue[countQ] === addCommands[count]) {\n                                fromQueue.splice(countQ, 1);\n                                break;\n                            }\n                        }\n                    }\n                    // If we haven't queued the actual animation\n                    if (!this._queuedCommandAnimation) {\n                        // If not already animating, we'll need to call _checkDoNext\n                        if (!this._animating) {\n                            Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, \"WinJS.UI._Overlay._checkDoNext\");\n                        }\n                        this._queuedCommandAnimation = true;\n                    }\n                },\n\n                // show/hide commands without doing any animation.\n                _showAndHideFast: function _Overlay_showAndHideFast(showCommands, hideCommands) {\n                    var count;\n                    var command;\n                    for (count = 0; count < showCommands.length; count++) {\n                        command = showCommands[count];\n                        if (command && command.style) {\n                            command.style.visibility = \"\";\n                            command.style.display = \"\";\n                        }\n                    }\n                    for (count = 0; count < hideCommands.length; count++) {\n                        command = hideCommands[count];\n                        if (command && command.style) {\n                            command.style.visibility = \"hidden\";\n                            command.style.display = \"none\";\n                        }\n                    }\n\n                    this._commandsUpdated();\n\n                },\n\n                // show and hide the queued commands, perhaps animating if overlay isn't hidden.\n                _showAndHideQueue: function _Overlay_showAndHideQueue() {\n                    // Only called if not currently animating.\n                    // We'll be done with the queued stuff when we return.\n                    this._queuedCommandAnimation = false;\n\n                    // Shortcut if hidden\n                    if (this.hidden) {\n                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);\n                        // Might be something else to do\n                        Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, \"WinJS.UI._Overlay._checkDoNext\");\n                    } else {\n                        // Animation has 3 parts:  \"hiding\", \"showing\", and \"moving\"\n                        // PVL has \"addToList\" and \"deleteFromList\", both of which allow moving parts.\n                        // So we'll set up \"add\" for showing, and use \"delete\" for \"hiding\" + moving,\n                        // then trigger both at the same time.\n                        var showCommands = this._queuedToShow;\n                        var hideCommands = this._queuedToHide;\n                        var siblings = this._findSiblings(showCommands.concat(hideCommands));\n\n                        // Filter out the commands queued for animation that don't need to be animated.\n                        var count;\n                        for (count = 0; count < showCommands.length; count++) {\n                            // If this one's not real or not attached, skip it\n                            if (!showCommands[count] ||\n                                !showCommands[count].style ||\n                                !_Global.document.body.contains(showCommands[count])) {\n                                // Not real, skip it\n                                showCommands.splice(count, 1);\n                                count--;\n                            } else if (showCommands[count].style.visibility !== \"hidden\" && showCommands[count].style.opacity !== \"0\") {\n                                // Don't need to animate showing this one, already visible, so now it's a sibling\n                                siblings.push(showCommands[count]);\n                                showCommands.splice(count, 1);\n                                count--;\n                            }\n                        }\n                        for (count = 0; count < hideCommands.length; count++) {\n                            // If this one's not real or not attached, skip it\n                            if (!hideCommands[count] ||\n                                !hideCommands[count].style ||\n                                !_Global.document.body.contains(hideCommands[count]) ||\n                                hideCommands[count].style.visibility === \"hidden\" ||\n                                hideCommands[count].style.opacity === \"0\") {\n                                // Don't need to animate hiding this one, not real, or it's hidden,\n                                // so don't even need it as a sibling.\n                                hideCommands.splice(count, 1);\n                                count--;\n                            }\n                        }\n\n                        // Start command animations.\n                        var commandsAnimationPromise = this._baseBeginAnimateCommands(showCommands, hideCommands, siblings);\n\n                        // Hook end animations\n                        var that = this;\n                        if (commandsAnimationPromise) {\n                            // Needed to animate\n                            commandsAnimationPromise.done(\n                                function () { that._baseEndAnimateCommands(hideCommands); },\n                                function () { that._baseEndAnimateCommands(hideCommands); }\n                                );\n                        } else {\n                            // Already positioned correctly\n                            Scheduler.schedule(function Overlay_async_baseEndAnimationCommands() { that._baseEndAnimateCommands([]); },\n                                Scheduler.Priority.normal, null,\n                                \"WinJS.UI._Overlay._endAnimateCommandsWithoutAnimation\");\n                        }\n                    }\n\n                    // Done, clear queues\n                    this._queuedToShow = [];\n                    this._queuedToHide = [];\n                },\n\n                _baseBeginAnimateCommands: function _Overlay_baseBeginAnimateCommands(showCommands, hideCommands, siblings) {\n                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.\n                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.\n                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE shceduled to hide.\n                    // 3) siblings[]: i. All VISIBLE win-command elements that ARE NOT scheduled to hide.\n                    //               ii. All HIDDEN win-command elements that ARE NOT scheduled to hide OR show.\n                    this._beginAnimateCommands(showCommands, hideCommands, this._getVisibleCommands(siblings));\n\n                    var showAnimated = null,\n                        hideAnimated = null;\n\n                    // Hide commands first, with siblings if necessary,\n                    // so that the showing commands don't disrupt the hiding commands position.\n                    if (hideCommands.length > 0) {\n                        hideAnimated = Animations.createDeleteFromListAnimation(hideCommands, showCommands.length === 0 ? siblings : undefined);\n                    }\n                    if (showCommands.length > 0) {\n                        showAnimated = Animations.createAddToListAnimation(showCommands, siblings);\n                    }\n\n                    // Update hiding commands\n                    for (var count = 0, len = hideCommands.length; count < len; count++) {\n                        // Need to fix our position\n                        var rectangle = hideCommands[count].getBoundingClientRect(),\n                            style = _Global.getComputedStyle(hideCommands[count]);\n\n                        // Use the bounding box, adjusting for margins\n                        hideCommands[count].style.top = (rectangle.top - parseFloat(style.marginTop)) + \"px\";\n                        hideCommands[count].style.left = (rectangle.left - parseFloat(style.marginLeft)) + \"px\";\n                        hideCommands[count].style.opacity = 0;\n                        hideCommands[count].style.position = \"fixed\";\n                    }\n\n                    // Mark as animating\n                    this._element.winAnimating = \"rearranging\";\n\n                    // Start hiding animations\n                    // Hide needs extra cleanup when done\n                    var promise = null;\n                    if (hideAnimated) {\n                        promise = hideAnimated.execute();\n                    }\n\n                    // Update showing commands,\n                    // After hiding commands so that the hiding ones fade in the right place.\n                    for (count = 0; count < showCommands.length; count++) {\n                        showCommands[count].style.visibility = \"\";\n                        showCommands[count].style.display = \"\";\n                        showCommands[count].style.opacity = 1;\n                    }\n\n                    // Start showing animations\n                    if (showAnimated) {\n                        var newPromise = showAnimated.execute();\n                        if (promise) {\n                            promise = Promise.join([promise, newPromise]);\n                        } else {\n                            promise = newPromise;\n                        }\n                    }\n\n                    return promise;\n                },\n\n                _beginAnimateCommands: function _Overlay_beginAnimateCommands() {\n                    // Nothing by default\n                },\n\n                _getVisibleCommands: function _Overlay_getVisibleCommands(commandSubSet) {\n                    var command,\n                        commands = commandSubSet,\n                        visibleCommands = [];\n\n                    if (!commands) {\n                        // Crawl the inner HTML for the commands.\n                        commands = this.element.querySelectorAll(\".win-command\");\n                    }\n\n                    for (var i = 0, len = commands.length; i < len; i++) {\n                        command = commands[i].winControl || commands[i];\n                        if (!command.hidden) {\n                            visibleCommands.push(command);\n                        }\n                    }\n\n                    return visibleCommands;\n                },\n\n                // Once animation is complete, ensure that the commands are display:none\n                // and check if there's another animation to start.\n                _baseEndAnimateCommands: function _Overlay_baseEndAnimateCommands(hideCommands) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // Update us\n                    var count;\n                    for (count = 0; count < hideCommands.length; count++) {\n                        // Force us back into our appbar so that we can show again correctly\n                        hideCommands[count].style.position = \"\";\n                        hideCommands[count].style.top = \"\";\n                        hideCommands[count].style.left = \"\";\n                        hideCommands[count].getBoundingClientRect();\n                        // Now make us really hidden\n                        hideCommands[count].style.visibility = \"hidden\";\n                        hideCommands[count].style.display = \"none\";\n                        hideCommands[count].style.opacity = 1;\n                    }\n                    // Done animating\n                    this._element.winAnimating = \"\";\n\n                    this._endAnimateCommands();\n\n                    // Might be something else to do\n                    this._checkDoNext();\n                },\n\n                _endAnimateCommands: function _Overlay_endAnimateCommands() {\n                    // Nothing by default\n                },\n\n                // Resolves our commands\n                _resolveCommands: function _Overlay_resolveCommands(commands) {\n                    // First make sure they're all DOM elements.\n                    commands = _resolveElements(commands);\n\n                    // Now make sure they're all in this container\n                    var result = {};\n                    result.commands = [];\n                    result.others = [];\n                    var allCommands = this.element.querySelectorAll(\".win-command\");\n                    var countAll, countIn;\n                    for (countAll = 0; countAll < allCommands.length; countAll++) {\n                        var found = false;\n                        for (countIn = 0; countIn < commands.length; countIn++) {\n                            if (commands[countIn] === allCommands[countAll]) {\n                                result.commands.push(allCommands[countAll]);\n                                commands.splice(countIn, 1);\n                                found = true;\n                                break;\n                            }\n                        }\n                        if (!found) {\n                            result.others.push(allCommands[countAll]);\n                        }\n                    }\n                    return result;\n                },\n\n                // Find siblings, all DOM elements now.\n                // Returns all .win-commands in this Overlay that are NOT in the passed in 'commands' array.\n                _findSiblings: function _Overlay_findSiblings(commands) {\n                    // Now make sure they're all in this container\n                    var siblings = [];\n                    var allCommands = this.element.querySelectorAll(\".win-command\");\n                    var countAll, countIn;\n                    for (countAll = 0; countAll < allCommands.length; countAll++) {\n                        var found = false;\n                        for (countIn = 0; countIn < commands.length; countIn++) {\n                            if (commands[countIn] === allCommands[countAll]) {\n                                commands.splice(countIn, 1);\n                                found = true;\n                                break;\n                            }\n                        }\n                        if (!found) {\n                            siblings.push(allCommands[countAll]);\n                        }\n                    }\n                    return siblings;\n                },\n\n                _baseResize: function _Overlay_baseResize(event) {\n                    // Call specific resize\n                    this._resize(event);\n                },\n\n                _hideOrDismiss: function _Overlay_hideOrDismiss() {\n                    var element = this._element;\n                    if (element && _ElementUtilities.hasClass(element, _Constants.settingsFlyoutClass)) {\n                        this._dismiss();\n                    } else if (element && _ElementUtilities.hasClass(element, _Constants.appBarClass)) {\n                        this.close();\n                    } else {\n                        this.hide();\n                    }\n                },\n\n                _resize: function _Overlay_resize() {\n                    // Nothing by default\n                },\n\n                _commandsUpdated: function _Overlay_commandsUpdated() {\n                    // Nothing by default\n                },\n\n                _checkScrollPosition: function _Overlay_checkScrollPosition() {\n                    // Nothing by default\n                },\n\n                _showingKeyboard: function _Overlay_showingKeyboard() {\n                    // Nothing by default\n                },\n\n                _hidingKeyboard: function _Overlay_hidingKeyboard() {\n                    // Nothing by default\n                },\n\n                // Verify that this HTML AppBar only has AppBar/MenuCommands.\n                _verifyCommandsOnly: function _Overlay_verifyCommandsOnly(element, type) {\n                    var children = element.children;\n                    var commands = new Array(children.length);\n                    for (var i = 0; i < children.length; i++) {\n                        // If constructed they have win-command class, otherwise they have data-win-control\n                        if (!_ElementUtilities.hasClass(children[i], \"win-command\") &&\n                        children[i].getAttribute(\"data-win-control\") !== type) {\n                            // Wasn't tagged with class or AppBar/MenuCommand, not an AppBar/MenuCommand\n                            throw new _ErrorFromName(\"WinJS.UI._Overlay.MustContainCommands\", strings.mustContainCommands);\n                        } else {\n                            // Instantiate the commands.\n                            ControlProcessor.processAll(children[i]);\n                            commands[i] = children[i].winControl;\n                        }\n                    }\n                    return commands;\n                },\n\n                // Sets focus on what we think is the last tab stop. If nothing is focusable will\n                // try to set focus on itself.\n                _focusOnLastFocusableElementOrThis: function _Overlay_focusOnLastFocusableElementOrThis() {\n                    if (!this._focusOnLastFocusableElement()) {\n                        // Nothing is focusable.  Set focus to this.\n                        _Overlay._trySetActive(this._element);\n                    }\n                },\n\n                // Sets focus to what we think is the last tab stop. This element must have\n                // a firstDiv with tabIndex equal to the lowest tabIndex in the element\n                // and a finalDiv with tabIndex equal to the highest tabIndex in the element.\n                // Also the firstDiv must be its first child and finalDiv be its last child.\n                // Returns true if successful, false otherwise.\n                _focusOnLastFocusableElement: function _Overlay_focusOnLastFocusableElement() {\n                    if (this._element.firstElementChild) {\n                        var oldFirstTabIndex = this._element.firstElementChild.tabIndex;\n                        var oldLastTabIndex = this._element.lastElementChild.tabIndex;\n                        this._element.firstElementChild.tabIndex = -1;\n                        this._element.lastElementChild.tabIndex = -1;\n\n                        var tabResult = _ElementUtilities._focusLastFocusableElement(this._element);\n\n                        if (tabResult) {\n                            _Overlay._trySelect(_Global.document.activeElement);\n                        }\n\n                        this._element.firstElementChild.tabIndex = oldFirstTabIndex;\n                        this._element.lastElementChild.tabIndex = oldLastTabIndex;\n\n                        return tabResult;\n                    } else {\n                        return false;\n                    }\n                },\n\n\n                // Sets focus on what we think is the first tab stop. If nothing is focusable will\n                // try to set focus on itself.\n                _focusOnFirstFocusableElementOrThis: function _Overlay_focusOnFirstFocusableElementOrThis() {\n                    if (!this._focusOnFirstFocusableElement()) {\n                        // Nothing is focusable.  Set focus to this.\n                        _Overlay._trySetActive(this._element);\n                    }\n                },\n\n                // Sets focus to what we think is the first tab stop. This element must have\n                // a firstDiv with tabIndex equal to the lowest tabIndex in the element\n                // and a finalDiv with tabIndex equal to the highest tabIndex in the element.\n                // Also the firstDiv must be its first child and finalDiv be its last child.\n                // Returns true if successful, false otherwise.\n                _focusOnFirstFocusableElement: function _Overlay__focusOnFirstFocusableElement(useSetActive, scroller) {\n                    if (this._element.firstElementChild) {\n                        var oldFirstTabIndex = this._element.firstElementChild.tabIndex;\n                        var oldLastTabIndex = this._element.lastElementChild.tabIndex;\n                        this._element.firstElementChild.tabIndex = -1;\n                        this._element.lastElementChild.tabIndex = -1;\n\n                        var tabResult = _ElementUtilities._focusFirstFocusableElement(this._element, useSetActive, scroller);\n\n                        if (tabResult) {\n                            _Overlay._trySelect(_Global.document.activeElement);\n                        }\n\n                        this._element.firstElementChild.tabIndex = oldFirstTabIndex;\n                        this._element.lastElementChild.tabIndex = oldLastTabIndex;\n\n                        return tabResult;\n                    } else {\n                        return false;\n                    }\n                },\n\n                _writeProfilerMark: function _Overlay_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI._Overlay:\" + this._id + \":\" + text);\n                }\n            },\n            {\n                // Statics\n\n                _isFlyoutVisible: function () {\n                    var flyouts = _Global.document.querySelectorAll(\".\" + _Constants.flyoutClass);\n                    for (var i = 0; i < flyouts.length; i++) {\n                        var flyoutControl = flyouts[i].winControl;\n                        if (flyoutControl && !flyoutControl.hidden) {\n                            return true;\n                        }\n                    }\n\n                    return false;\n                },\n\n                // Try to set us as active\n                _trySetActive: function (element, scroller) {\n                    if (!element || !_Global.document.body || !_Global.document.body.contains(element)) {\n                        return false;\n                    }\n                    if (!_ElementUtilities._setActive(element, scroller)) {\n                        return false;\n                    }\n                    return (element === _Global.document.activeElement);\n                },\n\n                // Try to select the text so keyboard can be used.\n                _trySelect: function (element) {\n                    try {\n                        if (element && element.select) {\n                            element.select();\n                        }\n                    } catch (e) { }\n                },\n\n                _sizeOfDocument: function () {\n                    return {\n                        width: _Global.document.documentElement.offsetWidth,\n                        height: _Global.document.documentElement.offsetHeight,\n                    };\n                },\n\n                _getParentControlUsingClassName: function (element, className) {\n                    while (element && element !== _Global.document.body) {\n                        if (_ElementUtilities.hasClass(element, className)) {\n                            return element.winControl;\n                        }\n                        element = element.parentNode;\n                    }\n                    return null;\n                },\n\n                // Static controller for _Overlay global events registering/unregistering.\n                _globalEventListeners: new _GlobalListener(),\n\n                // Show/Hide all bars\n                _hideAppBars: function _Overlay_hideAppBars(bars, keyboardInvoked) {\n                    var allBarsAnimationPromises = bars.map(function (bar) {\n                        bar.close();\n                        return bar._animationPromise;\n                    });\n                    return Promise.join(allBarsAnimationPromises);\n                },\n\n                _showAppBars: function _Overlay_showAppBars(bars, keyboardInvoked) {\n                    var allBarsAnimationPromises = bars.map(function (bar) {\n                        bar._show();\n                        return bar._animationPromise;\n                    });\n                    return Promise.join(allBarsAnimationPromises);\n                },\n\n                // WWA Soft Keyboard offsets\n                _keyboardInfo: _KeyboardInfo._KeyboardInfo,\n\n                // Padding for IHM timer to allow for first scroll event\n                _scrollTimeout: _KeyboardInfo._KeyboardInfo._scrollTimeout,\n\n                // Events\n                beforeShow: \"beforeshow\",\n                beforeHide: \"beforehide\",\n                afterShow: \"aftershow\",\n                afterHide: \"afterhide\",\n\n                commonstrings: {\n                    get cannotChangeCommandsWhenVisible() { return \"Invalid argument: You must call hide() before changing {0} commands\"; },\n                    get cannotChangeHiddenProperty() { return \"Unable to set hidden property while parent {0} is visible.\"; }\n                },\n            });\n\n            _Base.Class.mix(_Overlay, _Control.DOMEventMixin);\n\n            return _Overlay;\n        })\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <dictionary>appbar,Flyout,Flyouts,Statics</dictionary>\ndefine('WinJS/Controls/Flyout',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Log',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../_Signal',\n    '../_LightDismissService',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_KeyboardBehavior',\n    '../Utilities/_Hoverable',\n    './_LegacyAppBar/_Constants',\n    './Flyout/_Overlay'\n], function flyoutInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Animations, _Signal, _LightDismissService, _Dispose, _ElementUtilities, _KeyboardBehavior, _Hoverable, _Constants, _Overlay) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Flyout\">\n        /// Displays lightweight UI that is either informational, or requires user interaction.\n        /// Unlike a dialog, a Flyout can be light dismissed by clicking or tapping off of it.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <name locid=\"WinJS.UI.Flyout_name\">Flyout</name>\n        /// <icon src=\"ui_winjs.ui.flyout.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.flyout.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.Flyout\"></div>]]></htmlSnippet>\n        /// <event name=\"beforeshow\" locid=\"WinJS.UI.Flyout_e:beforeshow\">Raised just before showing a flyout.</event>\n        /// <event name=\"aftershow\" locid=\"WinJS.UI.Flyout_e:aftershow\">Raised immediately after a flyout is fully shown.</event>\n        /// <event name=\"beforehide\" locid=\"WinJS.UI.Flyout_e:beforehide\">Raised just before hiding a flyout.</event>\n        /// <event name=\"afterhide\" locid=\"WinJS.UI.Flyout_e:afterhide\">Raised immediately after a flyout is fully hidden.</event>\n        /// <part name=\"flyout\" class=\"win-flyout\" locid=\"WinJS.UI.Flyout_part:flyout\">The Flyout control itself.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Flyout: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            function getDimension(element, property) {\n                return _ElementUtilities.convertToPixels(element, _Global.getComputedStyle(element, null)[property]);\n            }\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/flyoutAriaLabel\").value; },\n                get noAnchor() { return \"Invalid argument: Flyout anchor element not found in DOM.\"; },\n                get badPlacement() { return \"Invalid argument: Flyout placement should be 'top' (default), 'bottom', 'left', 'right', 'auto', 'autohorizontal', or 'autovertical'.\"; },\n                get badAlignment() { return \"Invalid argument: Flyout alignment should be 'center' (default), 'left', or 'right'.\"; }\n            };\n\n            var createEvent = _Events._createEventProperty;\n\n            // _LightDismissableLayer is an ILightDismissable which manages a set of ILightDismissables.\n            // It acts as a proxy between the LightDismissService and the light dismissables it manages.\n            // It enables multiple dismissables to be above the click eater at the same time.\n            var _LightDismissableLayer = _Base.Class.define(function _LightDismissableLayer_ctor(onLightDismiss) {\n                this._onLightDismiss = onLightDismiss;\n                this._currentlyFocusedClient = null;\n                this._clients = []; // Array of ILightDismissables\n            }, {\n                // Dismissables should call this as soon as they are ready to be shown. More specifically, they should call this:\n                //   - After they are in the DOM and ready to receive focus (e.g. style.display cannot be \"none\")\n                //   - Before their entrance animation is played\n                shown: function _LightDismissableLayer_shown(client /*: ILightDismissable */) {\n                    client._focusable = true;\n                    var index = this._clients.indexOf(client);\n                    if (index === -1) {\n                        this._clients.push(client);\n                        client.onShow(this);\n                        if (!_LightDismissService.isShown(this)) {\n                            _LightDismissService.shown(this);\n                        } else {\n                            _LightDismissService.updated(this);\n                            this._activateTopFocusableClientIfNeeded();\n                        }\n                    }\n                },\n\n                // Dismissables should call this at the start of their exit animation. A \"hiding\",\n                // dismissable will still be rendered with the proper z-index but it will no\n                // longer be given focus. Also, focus is synchronously moved out of this dismissable.\n                hiding: function _LightDismissableLayer_hiding(client /*: ILightDismissable */) {\n                    var index = this._clients.indexOf(client);\n                    if (index !== -1) {\n                        this._clients[index]._focusable = false;\n                        this._activateTopFocusableClientIfNeeded();\n                    }\n                },\n\n                // Dismissables should call this when they are done being dismissed (i.e. after their exit animation has finished)\n                hidden: function _LightDismissableLayer_hidden(client /*: ILightDismissable */) {\n                    var index = this._clients.indexOf(client);\n                    if (index !== -1) {\n                        this._clients.splice(index, 1);\n                        client.setZIndex(\"\");\n                        client.onHide();\n                        if (this._clients.length === 0) {\n                            _LightDismissService.hidden(this);\n                        } else {\n                            _LightDismissService.updated(this);\n                            this._activateTopFocusableClientIfNeeded();\n                        }\n                    }\n                },\n                \n                keyDown: function _LightDismissableLayer_keyDown(client /*: ILightDismissable */, eventObject) {\n                    _LightDismissService.keyDown(this, eventObject);\n                },\n                keyUp: function _LightDismissableLayer_keyUp(client /*: ILightDismissable */, eventObject) {\n                    _LightDismissService.keyUp(this, eventObject);\n                },\n                keyPress: function _LightDismissableLayer_keyPress(client /*: ILightDismissable */, eventObject) {\n                    _LightDismissService.keyPress(this, eventObject);\n                },\n\n                // Used by tests.\n                clients: {\n                    get: function _LightDismissableLayer_clients_get() {\n                        return this._clients;\n                    }\n                },\n\n                _clientForElement: function _LightDismissableLayer_clientForElement(element) {\n                    for (var i = this._clients.length - 1; i >= 0; i--) {\n                        if (this._clients[i].containsElement(element)) {\n                            return this._clients[i];\n                        }\n                    }\n                    return null;\n                },\n\n                _focusableClientForElement: function _LightDismissableLayer_focusableClientForElement(element) {\n                    for (var i = this._clients.length - 1; i >= 0; i--) {\n                        if (this._clients[i]._focusable && this._clients[i].containsElement(element)) {\n                            return this._clients[i];\n                        }\n                    }\n                    return null;\n                },\n\n                _getTopmostFocusableClient: function _LightDismissableLayer_getTopmostFocusableClient() {\n                    for (var i = this._clients.length - 1; i >= 0; i--) {\n                        var client = this._clients[i];\n                        if (client && client._focusable) {\n                            return client;\n                        }\n                    }\n                    return null;\n                },\n\n                _activateTopFocusableClientIfNeeded: function _LightDismissableLayer_activateTopFocusableClientIfNeeded() {\n                    var topClient = this._getTopmostFocusableClient();\n                    if (topClient && _LightDismissService.isTopmost(this)) {\n                        // If the last input type was keyboard, use focus() so a keyboard focus visual is drawn.\n                        // Otherwise, use setActive() so no focus visual is drawn.\n                        var useSetActive = !_KeyboardBehavior._keyboardSeenLast;\n                        topClient.onTakeFocus(useSetActive);\n                    }\n                },\n\n                // ILightDismissable\n                //\n\n                setZIndex: function _LightDismissableLayer_setZIndex(zIndex) {\n                    this._clients.forEach(function (client, index) {\n                        client.setZIndex(zIndex + index);\n                    }, this);\n                },\n                getZIndexCount: function _LightDismissableLayer_getZIndexCount() {\n                    return this._clients.length;\n                },\n                containsElement: function _LightDismissableLayer_containsElement(element) {\n                    return !!this._clientForElement(element);\n                },\n                onTakeFocus: function _LightDismissableLayer_onTakeFocus(useSetActive) {\n                    // Prefer the client that has focus\n                    var client = this._focusableClientForElement(_Global.document.activeElement);\n\n                    if (!client && this._clients.indexOf(this._currentlyFocusedClient) !== -1 && this._currentlyFocusedClient._focusable) {\n                        // Next try the client that had focus most recently\n                        client = this._currentlyFocusedClient;\n                    }\n\n                    if (!client) {\n                        // Finally try the client at the top of the stack\n                        client = this._getTopmostFocusableClient();\n                    }\n\n                    this._currentlyFocusedClient = client;\n                    client && client.onTakeFocus(useSetActive);\n                },\n                onFocus: function _LightDismissableLayer_onFocus(element) {\n                    this._currentlyFocusedClient = this._clientForElement(element);\n                    this._currentlyFocusedClient && this._currentlyFocusedClient.onFocus(element);\n                },\n                onShow: function _LightDismissableLayer_onShow(service /*: ILightDismissService */) { },\n                onHide: function _LightDismissableLayer_onHide() {\n                    this._currentlyFocusedClient = null;\n                },\n                onKeyInStack: function _LightDismissableLayer_onKeyInStack(info /*: IKeyboardInfo*/) {\n                    // A keyboard event occurred in the light dismiss stack. Notify the flyouts to\n                    // give them the opportunity to handle this evnet.\n                    var index = this._clients.indexOf(this._currentlyFocusedClient);\n                    if (index !== -1) {\n                        var clients = this._clients.slice(0, index + 1);\n                        for (var i = clients.length - 1; i >= 0 && !info.propagationStopped; i--) {\n                            if (clients[i]._focusable) {\n                                clients[i].onKeyInStack(info);\n                            }\n                        }\n                    }\n                },\n                onShouldLightDismiss: function _LightDismissableLayer_onShouldLightDismiss(info) {\n                    return _LightDismissService.DismissalPolicies.light(info);\n                },\n                onLightDismiss: function _LightDismissableLayer_onLightDismiss(info) {\n                    this._onLightDismiss(info);\n                }\n            });\n\n            // Singleton class for managing cascading flyouts\n            var _CascadeManager = _Base.Class.define(function _CascadeManager_ctor() {\n                var that = this;\n                this._dismissableLayer = new _LightDismissableLayer(function _CascadeManager_onLightDismiss(info) {\n                    if (info.reason === _LightDismissService.LightDismissalReasons.escape) {\n                        that.collapseFlyout(that.getAt(that.length - 1));\n                    } else {\n                        that.collapseAll();\n                    }\n                });\n                this._cascadingStack = [];\n                this._handleKeyDownInCascade_bound = this._handleKeyDownInCascade.bind(this);\n                this._inputType = null;\n            },\n            {\n                appendFlyout: function _CascadeManager_appendFlyout(flyoutToAdd) {\n                    // PRECONDITION: flyoutToAdd must not already be in the cascade.\n                    _Log.log && this.indexOf(flyoutToAdd) >= 0 && _Log.log('_CascadeManager is attempting to append a Flyout that is already in the cascade.', \"winjs _CascadeManager\", \"error\");\n                    // PRECONDITION: this.reentrancyLock must be false. appendFlyout should only be called from baseFlyoutShow() which is the function responsible for preventing reentrancy.\n                    _Log.log && this.reentrancyLock && _Log.log('_CascadeManager is attempting to append a Flyout through reentrancy.', \"winjs _CascadeManager\", \"error\");\n\n                    // IF the anchor element for flyoutToAdd is contained within another flyout,\n                    // && that flyout is currently in the cascadingStack, consider that flyout to be the parent of flyoutToAdd:\n                    //  Remove from the cascadingStack, any subflyout descendants of the parent flyout.\n                    // ELSE flyoutToAdd isn't anchored to any of the Flyouts in the existing cascade\n                    //  Collapse the entire cascadingStack to start a new cascade.\n                    // FINALLY:\n                    //  add flyoutToAdd to the end of the cascading stack. Monitor it for events.\n                    var indexOfParentFlyout = this.indexOfElement(flyoutToAdd._currentAnchor);\n                    if (indexOfParentFlyout >= 0) {\n                        this.collapseFlyout(this.getAt(indexOfParentFlyout + 1));\n                    } else {\n                        this.collapseAll();\n                    }\n\n                    flyoutToAdd.element.addEventListener(\"keydown\", this._handleKeyDownInCascade_bound, false);\n                    this._cascadingStack.push(flyoutToAdd);\n                    this._dismissableLayer.shown(flyoutToAdd._dismissable);\n                },\n                collapseFlyout: function _CascadeManager_collapseFlyout(flyout) {\n                    // Removes flyout param and its subflyout descendants from the _cascadingStack.\n                    if (!this.reentrancyLock && flyout && this.indexOf(flyout) >= 0) {\n                        this.reentrancyLock = true;\n                        var signal = new _Signal();\n                        this.unlocked = signal.promise;\n\n                        var subFlyout;\n                        while (this.length && flyout !== subFlyout) {\n                            subFlyout = this._cascadingStack.pop();\n                            subFlyout.element.removeEventListener(\"keydown\", this._handleKeyDownInCascade_bound, false);\n                            subFlyout._hide(); // We use the reentrancyLock to prevent reentrancy here.\n                        }\n\n                        if (this._cascadingStack.length === 0) {\n                            // The cascade is empty so clear the input type. This gives us the opportunity\n                            // to recalculate the input type when the next cascade starts.\n                            this._inputType = null;\n                        }\n\n                        this.reentrancyLock = false;\n                        this.unlocked = null;\n                        signal.complete();\n                    }\n                },\n                flyoutHiding: function _CascadeManager_flyoutHiding(flyout) {\n                    this._dismissableLayer.hiding(flyout._dismissable);\n                },\n                flyoutHidden: function _CascadeManager_flyoutHidden(flyout) {\n                    this._dismissableLayer.hidden(flyout._dismissable);\n                },\n                collapseAll: function _CascadeManager_collapseAll() {\n                    // Empties the _cascadingStack and hides all flyouts.\n                    var headFlyout = this.getAt(0);\n                    if (headFlyout) {\n                        this.collapseFlyout(headFlyout);\n                    }\n                },\n                indexOf: function _CascadeManager_indexOf(flyout) {\n                    return this._cascadingStack.indexOf(flyout);\n                },\n                indexOfElement: function _CascadeManager_indexOfElement(el) {\n                    // Returns an index cooresponding to the Flyout in the cascade whose element contains the element in question.\n                    // Returns -1 if the element is not contained by any Flyouts in the cascade.\n                    var indexOfAssociatedFlyout = -1;\n                    for (var i = 0, len = this.length; i < len; i++) {\n                        var currentFlyout = this.getAt(i);\n                        if (currentFlyout.element.contains(el)) {\n                            indexOfAssociatedFlyout = i;\n                            break;\n                        }\n                    }\n                    return indexOfAssociatedFlyout;\n                },\n                length: {\n                    get: function _CascadeManager_getLength() {\n                        return this._cascadingStack.length;\n                    }\n                },\n                getAt: function _CascadeManager_getAt(index) {\n                    return this._cascadingStack[index];\n                },\n                handleFocusIntoFlyout: function _CascadeManager_handleFocusIntoFlyout(event) {\n                    // When a flyout in the cascade recieves focus, we close all subflyouts beneath it.\n                    var index = this.indexOfElement(event.target);\n                    if (index >= 0) {\n                        var subFlyout = this.getAt(index + 1);\n                        this.collapseFlyout(subFlyout);\n                    }\n                },\n                // Compute the input type that is associated with the cascading stack on demand. Allows\n                // each Flyout in the cascade to adjust its sizing based on the current input type\n                // and to do it in a way that is consistent with the rest of the Flyouts in the cascade.\n                inputType: {\n                    get: function _CascadeManager_inputType_get() {\n                        if (!this._inputType) {\n                            this._inputType = _KeyboardBehavior._lastInputType;\n                        }\n                        return this._inputType;\n                    }\n                },\n                // Used by tests.\n                dismissableLayer: {\n                    get: function _CascadeManager_dismissableLayer_get() {\n                        return this._dismissableLayer;\n                    }\n                },\n                _handleKeyDownInCascade: function _CascadeManager_handleKeyDownInCascade(event) {\n                    var rtl = _Global.getComputedStyle(event.target).direction === \"rtl\",\n                        leftKey = rtl ? Key.rightArrow : Key.leftArrow,\n                        target = event.target;\n\n                    if (event.keyCode === leftKey) {\n                        // Left key press in a SubFlyout will close that subFlyout and any subFlyouts cascading from it.\n                        var index = this.indexOfElement(target);\n                        if (index >= 1) {\n                            var subFlyout = this.getAt(index);\n                            this.collapseFlyout(subFlyout);\n                            // Prevent document scrolling\n                            event.preventDefault();\n                        }\n                    } else if (event.keyCode === Key.alt || event.keyCode === Key.F10) {\n                        this.collapseAll();\n                    }\n                }\n            });\n\n            var AnimationOffsets = {\n                top: { top: \"50px\", left: \"0px\", keyframe: \"WinJS-showFlyoutTop\" },\n                bottom: { top: \"-50px\", left: \"0px\", keyframe: \"WinJS-showFlyoutBottom\" },\n                left: { top: \"0px\", left: \"50px\", keyframe: \"WinJS-showFlyoutLeft\" },\n                right: { top: \"0px\", left: \"-50px\", keyframe: \"WinJS-showFlyoutRight\" },\n            };\n\n            var Flyout = _Base.Class.derive(_Overlay._Overlay, function Flyout_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Flyout.Flyout\">\n                /// <summary locid=\"WinJS.UI.Flyout.constructor\">\n                /// Creates a new Flyout control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.Flyout.constructor_p:element\">\n                /// The DOM element that hosts the control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI.Flyout.constructor_p:options\">\n                /// The set of properties and values to apply to the new Flyout.\n                /// </param>\n                /// <returns type=\"WinJS.UI.Flyout\" locid=\"WinJS.UI.Flyout.constructor_returnValue\">The new Flyout control.</returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n\n                // Simplify checking later\n                options = options || {};\n\n                // Make sure there's an input element\n                this._element = element || _Global.document.createElement(\"div\");\n                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                this._baseFlyoutConstructor(this._element, options);\n\n                var _elms = this._element.getElementsByTagName(\"*\");\n                var firstDiv = this._addFirstDiv();\n                firstDiv.tabIndex = _ElementUtilities._getLowestTabIndexInList(_elms);\n                var finalDiv = this._addFinalDiv();\n                finalDiv.tabIndex = _ElementUtilities._getHighestTabIndexInList(_elms);\n\n                // Handle \"esc\" & \"tab\" key presses\n                this._element.addEventListener(\"keydown\", this._handleKeyDown, true);\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n                return this;\n            }, {\n                _lastMaxHeight: null,\n\n                _baseFlyoutConstructor: function Flyout_baseFlyoutContstructor(element, options) {\n                    // Flyout constructor\n\n                    // We have some options with defaults\n                    this._placement = \"auto\";\n                    this._alignment = \"center\";\n\n                    // Call the base overlay constructor helper\n                    this._baseOverlayConstructor(element, options);\n\n                    // Start flyouts hidden\n                    this._element.style.visibilty = \"hidden\";\n                    this._element.style.display = \"none\";\n\n                    // Attach our css class\n                    _ElementUtilities.addClass(this._element, _Constants.flyoutClass);\n\n                    var that = this;\n                    // Each flyout has an ILightDismissable that is managed through the\n                    // CascasdeManager rather than by the _LightDismissService directly.\n                    this._dismissable = new _LightDismissService.LightDismissableElement({\n                        element: this._element,\n                        tabIndex: this._element.hasAttribute(\"tabIndex\") ? this._element.tabIndex : -1,\n                        onLightDismiss: function () {\n                            that.hide();\n                        },\n                        onTakeFocus: function (useSetActive) {\n                            if (!that._dismissable.restoreFocus()) {\n                                if (!_ElementUtilities.hasClass(that.element, _Constants.menuClass)) {\n                                    // Put focus on the first child in the Flyout\n                                    that._focusOnFirstFocusableElementOrThis();\n                                } else {\n                                    // Make sure the menu has focus, but don't show a focus rect\n                                    _Overlay._Overlay._trySetActive(that._element);\n                                }\n                            }\n                        }\n                    });\n\n                    // Make sure we have an ARIA role\n                    var role = this._element.getAttribute(\"role\");\n                    if (role === null || role === \"\" || role === undefined) {\n                        if (_ElementUtilities.hasClass(this._element, _Constants.menuClass)) {\n                            this._element.setAttribute(\"role\", \"menu\");\n                        } else {\n                            this._element.setAttribute(\"role\", \"dialog\");\n                        }\n                    }\n                    var label = this._element.getAttribute(\"aria-label\");\n                    if (label === null || label === \"\" || label === undefined) {\n                        this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                    }\n\n                    // Base animation is popIn, but our flyout has different arguments\n                    this._currentAnimateIn = this._flyoutAnimateIn;\n                    this._currentAnimateOut = this._flyoutAnimateOut;\n\n                    _ElementUtilities._addEventListener(this.element, \"focusin\", this._handleFocusIn.bind(this), false);\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.Flyout.anchor\" helpKeyword=\"WinJS.UI.Flyout.anchor\">\n                /// Gets or sets the Flyout control's anchor. The anchor element is the HTML element which the Flyout originates from and is positioned relative to.\n                /// (This setting can be overridden when you call the show method.)\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                anchor: {\n                    get: function () {\n                        return this._anchor;\n                    },\n                    set: function (value) {\n                        this._anchor = value;\n                    }\n                },\n\n                /// <field type=\"String\" defaultValue=\"auto\" oamOptionsDatatype=\"WinJS.UI.Flyout.placement\" locid=\"WinJS.UI.Flyout.placement\" helpKeyword=\"WinJS.UI.Flyout.placement\">\n                /// Gets or sets the default placement of this Flyout. (This setting can be overridden when you call the show method.)\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                placement: {\n                    get: function () {\n                        return this._placement;\n                    },\n                    set: function (value) {\n                        if (value !== \"top\" && value !== \"bottom\" && value !== \"left\" && value !== \"right\" && value !== \"auto\" && value !== \"autohorizontal\" && value !== \"autovertical\") {\n                            // Not a legal placement value\n                            throw new _ErrorFromName(\"WinJS.UI.Flyout.BadPlacement\", strings.badPlacement);\n                        }\n                        this._placement = value;\n                    }\n                },\n\n                /// <field type=\"String\" defaultValue=\"center\" oamOptionsDatatype=\"WinJS.UI.Flyout.alignment\" locid=\"WinJS.UI.Flyout.alignment\" helpKeyword=\"WinJS.UI.Flyout.alignment\">\n                /// Gets or sets the default alignment for this Flyout. (This setting can be overridden when you call the show method.)\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                alignment: {\n                    get: function () {\n                        return this._alignment;\n                    },\n                    set: function (value) {\n                        if (value !== \"right\" && value !== \"left\" && value !== \"center\") {\n                            // Not a legal alignment value\n                            throw new _ErrorFromName(\"WinJS.UI.Flyout.BadAlignment\", strings.badAlignment);\n                        }\n                        this._alignment = value;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.Flyout.disabled\" helpKeyword=\"WinJS.UI.Flyout.disabled\">Disable a Flyout, setting or getting the HTML disabled attribute.  When disabled the Flyout will no longer display with show(), and will hide if currently visible.</field>\n                disabled: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return !!this._element.disabled;\n                    },\n                    set: function (value) {\n                        // Force this check into a boolean because our current state could be a bit confused since we tie to the DOM element\n                        value = !!value;\n                        var oldValue = !!this._element.disabled;\n                        if (oldValue !== value) {\n                            this._element.disabled = value;\n                            if (!this.hidden && this._element.disabled) {\n                                this.hide();\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Flyout.onbeforeshow\" helpKeyword=\"WinJS.UI.Flyout.onbeforeshow\">\n                /// Occurs immediately before the control is shown.\n                /// </field>\n                onbeforeshow: createEvent(_Overlay._Overlay.beforeShow),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Flyout.onaftershow\" helpKeyword=\"WinJS.UI.Flyout.onaftershow\">\n                /// Occurs immediately after the control is shown.\n                /// </field>\n                onaftershow: createEvent(_Overlay._Overlay.afterShow),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Flyout.onbeforehide\" helpKeyword=\"WinJS.UI.Flyout.onbeforehide\">\n                /// Occurs immediately before the control is hidden.\n                /// </field>\n                onbeforehide: createEvent(_Overlay._Overlay.beforeHide),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.Flyout.onafterhide\" helpKeyword=\"WinJS.UI.Flyout.onafterhide\">\n                /// Occurs immediately after the control is hidden.\n                /// </field>\n                onafterhide: createEvent(_Overlay._Overlay.afterHide),\n\n                _dispose: function Flyout_dispose() {\n                    _Dispose.disposeSubTree(this.element);\n                    this._hide();\n                    Flyout._cascadeManager.flyoutHidden(this);\n                    this.anchor = null;\n                },\n\n                show: function (anchor, placement, alignment) {\n                    /// <signature helpKeyword=\"WinJS.UI.Flyout.show\">\n                    /// <summary locid=\"WinJS.UI.Flyout.show\">\n                    /// Shows the Flyout, if hidden, regardless of other states.\n                    /// </summary>\n                    /// <param name=\"anchor\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.Flyout.show_p:anchor\">\n                    /// The DOM element, or ID of a DOM element to anchor the Flyout, overriding the anchor property for this time only.\n                    /// </param>\n                    /// <param name=\"placement\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI.Flyout.show_p:placement\">\n                    /// The placement of the Flyout to the anchor: 'auto' (default), 'top', 'bottom', 'left', or 'right'.  This parameter overrides the placement property for this show only.\n                    /// </param>\n                    /// <param name=\"alignment\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI.Flyout.show:alignment\">\n                    /// For 'top' or 'bottom' placement, the alignment of the Flyout to the anchor's edge: 'center' (default), 'left', or 'right'.\n                    /// This parameter overrides the alignment property for this show only.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    this._writeProfilerMark(\"show,StartTM\"); // The corresponding \"stop\" profiler mark is handled in _Overlay._baseEndShow().\n                    this._show(anchor, placement, alignment);\n                },\n\n                _show: function Flyout_show(anchor, placement, alignment) {\n                    this._baseFlyoutShow(anchor, placement, alignment);\n                },\n\n                hide: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.Flyout.hide\">\n                    /// <summary locid=\"WinJS.UI.Flyout.hide\">\n                    /// Hides the Flyout, if visible, regardless of other states.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    // Just wrap the private one, turning off keyboard invoked flag\n                    this._writeProfilerMark(\"hide,StartTM\"); // The corresponding \"stop\" profiler mark is handled in _Overlay._baseEndHide().\n                    this._hide();\n                },\n\n                _hide: function Flyout_hide() {\n\n                    // First close all subflyout descendants in the cascade.\n                    // Any calls to collapseFlyout through reentrancy should nop.\n                    Flyout._cascadeManager.collapseFlyout(this);\n\n                    if (this._baseHide()) {\n                        Flyout._cascadeManager.flyoutHiding(this);\n                    }\n                },\n\n                _beforeEndHide: function Flyout_beforeEndHide() {\n                    Flyout._cascadeManager.flyoutHidden(this);\n                },\n\n                _baseFlyoutShow: function Flyout_baseFlyoutShow(anchor, placement, alignment) {\n                    if (this.disabled || this._disposed) {\n                        // Don't do anything.\n                        return;\n                    }\n\n                    // Pick up defaults\n                    if (!anchor) {\n                        anchor = this._anchor;\n                    }\n                    if (!placement) {\n                        placement = this._placement;\n                    }\n                    if (!alignment) {\n                        alignment = this._alignment;\n                    }\n\n                    // Dereference the anchor if necessary\n                    if (typeof anchor === \"string\") {\n                        anchor = _Global.document.getElementById(anchor);\n                    } else if (anchor && anchor.element) {\n                        anchor = anchor.element;\n                    }\n\n                    // We expect an anchor\n                    if (!anchor) {\n                        // If we have _nextLeft, etc., then we were continuing an old animation, so that's OK\n                        if (!this._reuseCurrent) {\n                            throw new _ErrorFromName(\"WinJS.UI.Flyout.NoAnchor\", strings.noAnchor);\n                        }\n                        // Last call was incomplete, so reuse the previous _current values.\n                        this._reuseCurrent = null;\n                    } else {\n                        // Remember the anchor so that if we lose focus we can go back\n                        this._currentAnchor = anchor;\n                        // Remember current values\n                        this._currentPlacement = placement;\n                        this._currentAlignment = alignment;\n                    }\n\n                    // If we're animating (eg baseShow is going to fail), or the cascadeManager is in the middle of a updating the cascade,\n                    // then don't mess up our current state.\n                    if (this._element.winAnimating) {\n                        this._reuseCurrent = true;\n                        // Queue us up to wait for the current animation to finish.\n                        // _checkDoNext() is always scheduled after the current animation completes.\n                        this._doNext = \"show\";\n                    } else if (Flyout._cascadeManager.reentrancyLock) {\n                        this._reuseCurrent = true;\n                        // Queue us up to wait for the current animation to finish.\n                        // Schedule a call to _checkDoNext() for when the cascadeManager unlocks.\n                        this._doNext = \"show\";\n                        var that = this;\n                        Flyout._cascadeManager.unlocked.then(function () { that._checkDoNext(); });\n                    } else {\n                        // We call our base _baseShow to handle the actual animation\n                        if (this._baseShow()) {\n                            // (_baseShow shouldn't ever fail because we tested winAnimating above).\n                            if (!_ElementUtilities.hasClass(this.element, \"win-menu\")) {\n                                // Verify that the firstDiv is in the correct location.\n                                // Move it to the correct location or add it if not.\n                                var _elms = this._element.getElementsByTagName(\"*\");\n                                var firstDiv = this.element.querySelectorAll(\".win-first\");\n                                if (this.element.children.length && !_ElementUtilities.hasClass(this.element.children[0], _Constants.firstDivClass)) {\n                                    if (firstDiv && firstDiv.length > 0) {\n                                        firstDiv.item(0).parentNode.removeChild(firstDiv.item(0));\n                                    }\n\n                                    firstDiv = this._addFirstDiv();\n                                }\n                                firstDiv.tabIndex = _ElementUtilities._getLowestTabIndexInList(_elms);\n\n                                // Verify that the finalDiv is in the correct location.\n                                // Move it to the correct location or add it if not.\n                                var finalDiv = this.element.querySelectorAll(\".win-final\");\n                                if (!_ElementUtilities.hasClass(this.element.children[this.element.children.length - 1], _Constants.finalDivClass)) {\n                                    if (finalDiv && finalDiv.length > 0) {\n                                        finalDiv.item(0).parentNode.removeChild(finalDiv.item(0));\n                                    }\n\n                                    finalDiv = this._addFinalDiv();\n                                }\n                                finalDiv.tabIndex = _ElementUtilities._getHighestTabIndexInList(_elms);\n                            }\n\n                            Flyout._cascadeManager.appendFlyout(this);\n                        }\n                    }\n                },\n\n                _lightDismiss: function Flyout_lightDismiss() {\n                    Flyout._cascadeManager.collapseAll();\n                },\n\n                // Find our new flyout position.\n                _findPosition: function Flyout_findPosition() {\n                    this._adjustedHeight = 0;\n                    this._nextTop = 0;\n                    this._nextLeft = 0;\n                    this._keyboardMovedUs = false;\n                    this._doesScroll = false;\n\n                    // Make sure menu commands display correctly\n                    if (this._checkMenuCommands) {\n                        this._checkMenuCommands();\n                    }\n\n                    // Remove old height restrictions and scrolling.\n                    this._clearAdjustedStyles();\n\n                    this._setAlignment(this._currentAlignment);\n\n                    // Set up the new position, and prep the offset for showPopup.\n                    this._getTopLeft();\n\n                    // Adjust position\n                    if (this._nextTop < 0) {\n                        // Overran bottom, attach to bottom.\n                        this._element.style.bottom = _Overlay._Overlay._keyboardInfo._visibleDocBottomOffset + \"px\";\n                        this._element.style.top = \"auto\";\n                    } else {\n                        // Normal, set top\n                        this._element.style.top = this._nextTop + \"px\";\n                        this._element.style.bottom = \"auto\";\n                    }\n                    if (this._nextLeft < 0) {\n                        // Overran right, attach to right\n                        this._element.style.right = \"0px\";\n                        this._element.style.left = \"auto\";\n                    } else {\n                        // Normal, set left\n                        this._element.style.left = this._nextLeft + \"px\";\n                        this._element.style.right = \"auto\";\n                    }\n\n                    // Adjust height/scrollbar\n                    if (this._doesScroll) {\n                        _ElementUtilities.addClass(this._element, _Constants.scrollsClass);\n                        this._lastMaxHeight = this._element.style.maxHeight;\n                        this._element.style.maxHeight = this._adjustedHeight + \"px\";\n                    }\n\n                    // May need to adjust if the IHM is showing.\n                    if (_Overlay._Overlay._keyboardInfo._visible) {\n                        // Use keyboard logic\n                        this._checkKeyboardFit();\n\n                        if (this._keyboardMovedUs) {\n                            this._adjustForKeyboard();\n                        }\n                    }\n                },\n\n                // This determines our positioning.  We have 8 modes, the 1st four are explicit, the last 4 are automatic:\n                // * top - position explicitly on the top of the anchor, shrinking and adding scrollbar as needed.\n                // * bottom - position explicitly below the anchor, shrinking and adding scrollbar as needed.\n                // * left - position left of the anchor, shrinking and adding a vertical scrollbar as needed.\n                // * right - position right of the anchor, shrinking and adding a vertical scroolbar as needed.\n                // * auto - Automatic placement.\n                // * autohorizontal - Automatic placement (only left or right).\n                // * autovertical - Automatic placement (only top or bottom).\n                // * _cascasde - Private placement used by MenuCommand._activateFlyoutCommand\n                // Auto tests the height of the anchor and the flyout.  For consistency in orientation, we imagine\n                // that the anchor is placed in the vertical center of the display.  If the flyout would fit above\n                // that centered anchor, then we will place the flyout vertically in relation to the anchor, otherwise\n                // placement will be horizontal.\n                // Vertical auto or autovertical placement will be positioned on top of the anchor if room, otherwise below the anchor.\n                //   - this is because touch users would be more likely to obscure flyouts below the anchor.\n                // Horizontal auto or autohorizontal placement will be positioned to the left of the anchor if room, otherwise to the right.\n                //   - this is because right handed users would be more likely to obscure a flyout on the right of the anchor.\n                // All three auto placements will add a vertical scrollbar if necessary.\n                // \n                _getTopLeft: function Flyout_getTopLeft() {\n\n                    var that = this;\n\n                    function configureVerticalWithScroll(anchor) {\n                        // Won't fit top or bottom. Pick the one with the most space and add a scrollbar.\n                        if (topHasMoreRoom(anchor)) {\n                            // Top\n                            that._adjustedHeight = spaceAbove(anchor) - that._verticalMarginBorderPadding;\n                            that._nextTop = _Overlay._Overlay._keyboardInfo._visibleDocTop;\n                            that._nextAnimOffset = AnimationOffsets.top;\n                        } else {\n                            // Bottom\n                            that._adjustedHeight = spaceBelow(anchor) - that._verticalMarginBorderPadding;\n                            that._nextTop = _Constants.pinToBottomEdge;\n                            that._nextAnimOffset = AnimationOffsets.bottom;\n                        }\n                        that._doesScroll = true;\n                    }\n\n                    // If the anchor is centered vertically, would the flyout fit above it?\n                    function fitsVerticallyWithCenteredAnchor(anchor, flyout) {\n                        // Returns true if the flyout would always fit at least top \n                        // or bottom of its anchor, regardless of the position of the anchor, \n                        // as long as the anchor never changed its height, nor did the height of \n                        // the visualViewport change.\n                        return ((_Overlay._Overlay._keyboardInfo._visibleDocHeight - anchor.height) / 2) >= flyout.totalHeight;\n                    }\n\n                    function spaceAbove(anchor) {\n                        return anchor.top - _Overlay._Overlay._keyboardInfo._visibleDocTop;\n                    }\n\n                    function spaceBelow(anchor) {\n                        return _Overlay._Overlay._keyboardInfo._visibleDocBottom - anchor.bottom;\n                    }\n\n                    function topHasMoreRoom(anchor) {\n                        return spaceAbove(anchor) > spaceBelow(anchor);\n                    }\n\n                    // See if we can fit in various places, fitting in the main view,\n                    // ignoring viewport changes, like for the IHM.\n                    function fitTop(bottomConstraint, flyout) {\n                        that._nextTop = bottomConstraint - flyout.totalHeight;\n                        that._nextAnimOffset = AnimationOffsets.top;\n                        return (that._nextTop >= _Overlay._Overlay._keyboardInfo._visibleDocTop &&\n                                that._nextTop + flyout.totalHeight <= _Overlay._Overlay._keyboardInfo._visibleDocBottom);\n                    }\n\n                    function fitBottom(topConstraint, flyout) {\n                        that._nextTop = topConstraint;\n                        that._nextAnimOffset = AnimationOffsets.bottom;\n                        return (that._nextTop >= _Overlay._Overlay._keyboardInfo._visibleDocTop &&\n                                that._nextTop + flyout.totalHeight <= _Overlay._Overlay._keyboardInfo._visibleDocBottom);\n                    }\n\n                    function fitLeft(leftConstraint, flyout) {\n                        that._nextLeft = leftConstraint - flyout.totalWidth;\n                        that._nextAnimOffset = AnimationOffsets.left;\n                        return (that._nextLeft >= 0 && that._nextLeft + flyout.totalWidth <= _Overlay._Overlay._keyboardInfo._visualViewportWidth);\n                    }\n\n                    function fitRight(rightConstraint, flyout) {\n                        that._nextLeft = rightConstraint;\n                        that._nextAnimOffset = AnimationOffsets.right;\n                        return (that._nextLeft >= 0 && that._nextLeft + flyout.totalWidth <= _Overlay._Overlay._keyboardInfo._visualViewportWidth);\n                    }\n\n                    function centerVertically(anchor, flyout) {\n                        that._nextTop = anchor.top + anchor.height / 2 - flyout.totalHeight / 2;\n                        if (that._nextTop < _Overlay._Overlay._keyboardInfo._visibleDocTop) {\n                            that._nextTop = _Overlay._Overlay._keyboardInfo._visibleDocTop;\n                        } else if (that._nextTop + flyout.totalHeight >= _Overlay._Overlay._keyboardInfo._visibleDocBottom) {\n                            // Flag to pin to bottom edge of visual document.\n                            that._nextTop = _Constants.pinToBottomEdge;\n                        }\n                    }\n\n                    function alignHorizontally(anchor, flyout, alignment) {\n                        if (alignment === \"center\") {\n                            that._nextLeft = anchor.left + anchor.width / 2 - flyout.totalWidth / 2;\n                        } else if (alignment === \"left\") {\n                            that._nextLeft = anchor.left;\n                        } else if (alignment === \"right\") {\n                            that._nextLeft = anchor.right - flyout.totalWidth;\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.UI.Flyout.BadAlignment\", strings.badAlignment);\n                        }\n                        if (that._nextLeft < 0) {\n                            that._nextLeft = 0;\n                        } else if (that._nextLeft + flyout.totalWidth >= _Overlay._Overlay._keyboardInfo._visualViewportWidth) {\n                            // Flag to pin to right edge of visible document.\n                            that._nextLeft = _Constants.pinToRightEdge;\n                        }\n                    }\n\n                    var anchorRawRectangle,\n                        flyout = {},\n                        anchor = {};\n\n                    try {\n                        anchorRawRectangle = this._currentAnchor.getBoundingClientRect();\n                    }\n                    catch (e) {\n                        throw new _ErrorFromName(\"WinJS.UI.Flyout.NoAnchor\", strings.noAnchor);\n                    }\n\n                    // Adjust for the anchor's margins.\n                    anchor.top = anchorRawRectangle.top;\n                    anchor.bottom = anchorRawRectangle.bottom;\n                    anchor.left = anchorRawRectangle.left;\n                    anchor.right = anchorRawRectangle.right;\n                    anchor.height = anchor.bottom - anchor.top;\n                    anchor.width = anchor.right - anchor.left;\n\n                    // Get our flyout and margins, note that getDimension calls\n                    // window.getComputedStyle, which ensures layout is updated.\n                    flyout.marginTop = getDimension(this._element, \"marginTop\");\n                    flyout.marginBottom = getDimension(this._element, \"marginBottom\");\n                    flyout.marginLeft = getDimension(this._element, \"marginLeft\");\n                    flyout.marginRight = getDimension(this._element, \"marginRight\");\n                    flyout.totalWidth = _ElementUtilities.getTotalWidth(this._element);\n                    flyout.totalHeight = _ElementUtilities.getTotalHeight(this._element);\n                    flyout.contentWidth = _ElementUtilities.getContentWidth(this._element);\n                    flyout.contentHeight = _ElementUtilities.getContentHeight(this._element);\n                    this._verticalMarginBorderPadding = (flyout.totalHeight - flyout.contentHeight);\n                    this._adjustedHeight = flyout.contentHeight;\n\n                    // Check fit for requested this._currentPlacement, doing fallback if necessary\n                    switch (this._currentPlacement) {\n                        case \"top\":\n                            if (!fitTop(anchor.top, flyout)) {\n                                // Didn't fit, needs scrollbar\n                                this._nextTop = _Overlay._Overlay._keyboardInfo._visibleDocTop;\n                                this._doesScroll = true;\n                                this._adjustedHeight = spaceAbove(anchor) - this._verticalMarginBorderPadding;\n                            }\n                            alignHorizontally(anchor, flyout, this._currentAlignment);\n                            break;\n                        case \"bottom\":\n                            if (!fitBottom(anchor.bottom, flyout)) {\n                                // Didn't fit, needs scrollbar\n                                this._nextTop = _Constants.pinToBottomEdge;\n                                this._doesScroll = true;\n                                this._adjustedHeight = spaceBelow(anchor) - this._verticalMarginBorderPadding;\n                            }\n                            alignHorizontally(anchor, flyout, this._currentAlignment);\n                            break;\n                        case \"left\":\n                            if (!fitLeft(anchor.left, flyout)) {\n                                // Didn't fit, just shove it to edge\n                                this._nextLeft = 0;\n                            }\n                            centerVertically(anchor, flyout);\n                            break;\n                        case \"right\":\n                            if (!fitRight(anchor.right, flyout)) {\n                                // Didn't fit, just shove it to edge\n                                this._nextLeft = _Constants.pinToRightEdge;\n                            }\n                            centerVertically(anchor, flyout);\n                            break;\n                        case \"autovertical\":\n                            if (!fitTop(anchor.top, flyout)) {\n                                // Didn't fit above (preferred), so go below.\n                                if (!fitBottom(anchor.bottom, flyout)) {\n                                    // Didn't fit, needs scrollbar\n                                    configureVerticalWithScroll(anchor);\n                                }\n                            }\n                            alignHorizontally(anchor, flyout, this._currentAlignment);\n                            break;\n                        case \"autohorizontal\":\n                            if (!fitLeft(anchor.left, flyout)) {\n                                // Didn't fit left (preferred), so go right.\n                                if (!fitRight(anchor.right, flyout)) {\n                                    // Didn't fit,just shove it to edge\n                                    this._nextLeft = _Constants.pinToRightEdge;\n                                }\n                            }\n                            centerVertically(anchor, flyout);\n                            break;\n                        case \"auto\":\n                            // Auto, if the anchor was in the vertical center of the display would we fit above it?\n                            if (fitsVerticallyWithCenteredAnchor(anchor, flyout)) {\n                                // It will fit above or below the anchor\n                                if (!fitTop(anchor.top, flyout)) {\n                                    // Didn't fit above (preferred), so go below.\n                                    fitBottom(anchor.bottom, flyout);\n                                }\n                                alignHorizontally(anchor, flyout, this._currentAlignment);\n                            } else {\n                                // Won't fit above or below, try a side\n                                if (!fitLeft(anchor.left, flyout) &&\n                                    !fitRight(anchor.right, flyout)) {\n                                    // Didn't fit left or right either\n                                    configureVerticalWithScroll(anchor);\n                                    alignHorizontally(anchor, flyout, this._currentAlignment);\n                                } else {\n                                    centerVertically(anchor, flyout);\n                                }\n                            }\n                            break;\n                        case \"_cascade\": \n                            // Align vertically\n                            // PREFERRED: When there is enough room to align a subMenu to either the top or the bottom of its\n                            // anchor element, the subMenu prefers to be top aligned.\n                            // FALLBACK: When there is enough room to bottom align a subMenu but not enough room to top align it, \n                            // then the subMenu will align to the bottom of its anchor element.\n                            // LASTRESORT: When there is not enough room to top align or bottom align the subMenu to its anchor,\n                            // then the subMenu will be center aligned to it's anchor's vertical midpoint.\n                            if (!fitBottom(anchor.top - flyout.marginTop, flyout) && !fitTop(anchor.bottom + flyout.marginBottom, flyout)) {\n                                centerVertically(anchor, flyout);\n                            }\n                            // Determine horizontal direction\n                            // PREFERRED: When there is enough room to fit a subMenu on either side of the anchor,\n                            // the subMenu prefers to go on the right hand side.\n                            // FALLBACK: When there is only enough room to fit a subMenu on the left side of the anchor,\n                            // the subMenu is placed to the left of the parent menu.\n                            // LASTRESORT: When there is not enough room to fit a subMenu on either side of the anchor,\n                            // the subMenu is pinned to the right edge of the window.\n                            var rtl = _Global.getComputedStyle(this._element).direction === \"rtl\";\n\n                            // Cascading Menus should overlap their ancestor menu by 4 pixels and we have a unit test to \n                            // verify that behavior. Because we don't have access to the ancestor flyout we need to specify\n                            // the overlap in terms of our anchor element. There is a 1px border around the menu that \n                            // contains our anchor we need to overlap our anchor by 3px to ensure that we overlap the containing \n                            // Menu by 4px.\n                            var pixelsToOverlapAnchor = 3;\n\n                            var beginRight = anchor.right - flyout.marginLeft - pixelsToOverlapAnchor;\n                            var beginLeft = anchor.left + flyout.marginRight + pixelsToOverlapAnchor;\n\n                            if (rtl) {\n                                if (!fitLeft(beginLeft, flyout) && !fitRight(beginRight, flyout)) {\n                                    // Doesn't fit on either side, pin to the left edge.\n                                    that._nextLeft = 0;\n                                    that._nextAnimOffset = AnimationOffsets.left;\n                                }\n                            } else {\n                                if (!fitRight(beginRight, flyout) && !fitLeft(beginLeft, flyout)) {\n                                    // Doesn't fit on either side, pin to the right edge of the visible document.\n                                    that._nextLeft = _Constants.pinToRightEdge;\n                                    that._nextAnimOffset = AnimationOffsets.right;\n                                }\n                            }\n\n                            break;\n                        default:\n                            // Not a legal this._currentPlacement value\n                            throw new _ErrorFromName(\"WinJS.UI.Flyout.BadPlacement\", strings.badPlacement);\n                    }\n                },\n\n                _clearAdjustedStyles: function Flyout_clearAdjustedStyles() {\n                    // Move to 0,0 in case it is off screen, so that it lays out at a reasonable size\n                    this._element.style.top = \"0px\";\n                    this._element.style.bottom = \"auto\";\n                    this._element.style.left = \"0px\";\n                    this._element.style.right = \"auto\";\n\n                    // Clear height restrictons and scrollbar class\n                    _ElementUtilities.removeClass(this._element, _Constants.scrollsClass);\n                    if (this._lastMaxHeight !== null) {\n                        this._element.style.maxHeight = this._lastMaxHeight;\n                        this._lastMaxHeight = null;\n                    }\n\n                    // Clear Alignment\n                    _ElementUtilities.removeClass(this._element, \"win-rightalign\");\n                    _ElementUtilities.removeClass(this._element, \"win-leftalign\");\n                },\n\n                _setAlignment: function Flyout_setAlignment(alignment) {\n                    // Alignment\n                    switch (alignment) {\n                        case \"left\":\n                            _ElementUtilities.addClass(this._element, \"win-leftalign\");\n                            break;\n                        case \"right\":\n                            _ElementUtilities.addClass(this._element, \"win-rightalign\");\n                            break;\n                        case \"center\":\n                        case \"none\":\n                            break;\n                    }\n                },\n\n                _showingKeyboard: function Flyout_showingKeyboard(event) {\n                    if (this.hidden) {\n                        return;\n                    }\n\n                    // The only way that we can be showing a keyboard when a flyout is up is because the input was\n                    // in the flyout itself, in which case we'll be moving ourselves.  There is no practical way\n                    // for the application to override this as the focused element is in our flyout.\n                    event.ensuredFocusedElementInView = true;\n\n                    // See if the keyboard is going to force us to move\n                    this._checkKeyboardFit();\n\n                    if (this._keyboardMovedUs) {\n                        // Pop out immediately, then move to new spot\n                        this._element.style.opacity = 0;\n                        var that = this;\n                        _Global.setTimeout(function () { that._adjustForKeyboard(); that._baseAnimateIn(); }, _Overlay._Overlay._keyboardInfo._animationShowLength);\n                    }\n                },\n\n                _resize: function Flyout_resize() {\n                    // If hidden and not busy animating, then nothing to do\n                    if (!this.hidden || this._animating) {\n\n                        // This should only happen if the IHM is dismissing,\n                        // the only other way is for viewstate changes, which\n                        // would dismiss any flyout.\n                        if (this._needToHandleHidingKeyboard) {\n                            // Hiding keyboard, update our position, giving the anchor a chance to update first.\n                            var that = this;\n                            _BaseUtils._setImmediate(function () {\n                                if (!that.hidden || that._animating) {\n                                    that._findPosition();\n                                }\n                            });\n                            this._needToHandleHidingKeyboard = false;\n                        }\n                    }\n                },\n\n                // If you were not pinned to the bottom, you might have to be now.\n                _checkKeyboardFit: function Flyout_checkKeyboardFit() {\n                    // Special Flyout positioning rules to determine if the Flyout needs to adjust its\n                    // position because of the IHM. If the Flyout needs to adjust for the IHM, it will reposition\n                    // itself to be pinned to either the top or bottom edge of the visual viewport.\n                    // - Too Tall, above top, or below bottom.\n\n                    var keyboardMovedUs = false;\n                    var viewportHeight = _Overlay._Overlay._keyboardInfo._visibleDocHeight;\n                    var adjustedMarginBoxHeight = this._adjustedHeight + this._verticalMarginBorderPadding;\n                    if (adjustedMarginBoxHeight > viewportHeight) {\n                        // The Flyout is now too tall to fit in the viewport, pin to top and adjust height.\n                        keyboardMovedUs = true;\n                        this._nextTop = _Constants.pinToBottomEdge;\n                        this._adjustedHeight = viewportHeight - this._verticalMarginBorderPadding;\n                        this._doesScroll = true;\n                    } else if (this._nextTop >= 0 &&\n                        this._nextTop + adjustedMarginBoxHeight > _Overlay._Overlay._keyboardInfo._visibleDocBottom) {\n                        // Flyout clips the bottom of the viewport. Pin to bottom.\n                        this._nextTop = _Constants.pinToBottomEdge;\n                        keyboardMovedUs = true;\n                    } else if (this._nextTop === _Constants.pinToBottomEdge) {\n                        // We were already pinned to the bottom, so our position on screen will change\n                        keyboardMovedUs = true;\n                    }\n\n                    // Signals use of basic fadein animation\n                    this._keyboardMovedUs = keyboardMovedUs;\n                },\n\n                _adjustForKeyboard: function Flyout_adjustForKeyboard() {\n                    // Keyboard moved us, update our metrics as needed\n                    if (this._doesScroll) {\n                        // Add scrollbar if we didn't already have scrollsClass\n                        if (!this._lastMaxHeight) {\n                            _ElementUtilities.addClass(this._element, _Constants.scrollsClass);\n                            this._lastMaxHeight = this._element.style.maxHeight;\n                        }\n                        // Adjust height\n                        this._element.style.maxHeight = this._adjustedHeight + \"px\";\n                    }\n\n                    // Update top/bottom\n                    this._checkScrollPosition(true);\n                },\n\n                _hidingKeyboard: function Flyout_hidingKeyboard() {\n                    // If we aren't visible and not animating, or haven't been repositioned, then nothing to do\n                    // We don't know if the keyboard moved the anchor, so _keyboardMovedUs doesn't help here\n                    if (!this.hidden || this._animating) {\n\n                        // Snap to the final position\n                        // We'll either just reveal the current space or resize the window\n                        if (_Overlay._Overlay._keyboardInfo._isResized) {\n                            // Flag resize that we'll need an updated position\n                            this._needToHandleHidingKeyboard = true;\n                        } else {\n                            // Not resized, update our final position, giving the anchor a chance to update first.\n                            var that = this;\n                            _BaseUtils._setImmediate(function () {\n                                if (!that.hidden || that._animating) {\n                                    that._findPosition();\n                                }\n                            });\n                        }\n                    }\n                },\n\n                _checkScrollPosition: function Flyout_checkScrollPosition(showing) {\n                    if (this.hidden && !showing) {\n                        return;\n                    }\n\n                    // May need to adjust top by viewport offset\n                    if (this._nextTop < 0) {\n                        // Need to attach to bottom\n                        this._element.style.bottom = _Overlay._Overlay._keyboardInfo._visibleDocBottomOffset + \"px\";\n                        this._element.style.top = \"auto\";\n                    } else {\n                        // Normal, attach to top\n                        this._element.style.top = this._nextTop + \"px\";\n                        this._element.style.bottom = \"auto\";\n                    }\n                },\n\n                // AppBar flyout animations\n                _flyoutAnimateIn: function Flyout_flyoutAnimateIn() {\n                    if (this._keyboardMovedUs) {\n                        return this._baseAnimateIn();\n                    } else {\n                        this._element.style.opacity = 1;\n                        this._element.style.visibility = \"visible\";\n                        return Animations.showPopup(this._element, this._nextAnimOffset);\n                    }\n                },\n\n                _flyoutAnimateOut: function Flyout_flyoutAnimateOut() {\n                    if (this._keyboardMovedUs) {\n                        return this._baseAnimateOut();\n                    } else {\n                        this._element.style.opacity = 0;\n                        return Animations.hidePopup(this._element, this._nextAnimOffset);\n                    }\n                },\n\n                // Hide all other flyouts besides this one\n                _hideAllOtherFlyouts: function Flyout_hideAllOtherFlyouts(thisFlyout) {\n                    var flyouts = _Global.document.querySelectorAll(\".\" + _Constants.flyoutClass);\n                    for (var i = 0; i < flyouts.length; i++) {\n                        var flyoutControl = flyouts[i].winControl;\n                        if (flyoutControl && !flyoutControl.hidden && (flyoutControl !== thisFlyout)) {\n                            flyoutControl.hide();\n                        }\n                    }\n                },\n\n                _handleKeyDown: function Flyout_handleKeyDown(event) {\n                    if ((event.keyCode === Key.space || event.keyCode === Key.enter)\n                         && (this === _Global.document.activeElement)) {\n                        event.preventDefault();\n                        event.stopPropagation();\n                        this.winControl.hide();\n                    } else if (event.shiftKey && event.keyCode === Key.tab\n                          && this === _Global.document.activeElement\n                          && !event.altKey && !event.ctrlKey && !event.metaKey) {\n                        event.preventDefault();\n                        event.stopPropagation();\n                        this.winControl._focusOnLastFocusableElementOrThis();\n                    }\n                },\n\n                _handleFocusIn: function Flyout_handleFocusIn(event) {\n                    if (!this.element.contains(event.relatedTarget)) {\n                        Flyout._cascadeManager.handleFocusIntoFlyout(event);\n                    }\n                    // Else focus is only moving between elements in the flyout.\n                    // Doesn't need to be handled by cascadeManager.\n                },\n\n                // Create and add a new first div as the first child\n                _addFirstDiv: function Flyout_addFirstDiv() {\n                    var firstDiv = _Global.document.createElement(\"div\");\n                    firstDiv.className = _Constants.firstDivClass;\n                    firstDiv.style.display = \"inline\";\n                    firstDiv.setAttribute(\"role\", \"menuitem\");\n                    firstDiv.setAttribute(\"aria-hidden\", \"true\");\n\n                    // add to beginning\n                    if (this._element.children[0]) {\n                        this._element.insertBefore(firstDiv, this._element.children[0]);\n                    } else {\n                        this._element.appendChild(firstDiv);\n                    }\n\n                    var that = this;\n                    _ElementUtilities._addEventListener(firstDiv, \"focusin\", function () { that._focusOnLastFocusableElementOrThis(); }, false);\n\n                    return firstDiv;\n                },\n\n                // Create and add a new final div as the last child\n                _addFinalDiv: function Flyout_addFinalDiv() {\n                    var finalDiv = _Global.document.createElement(\"div\");\n                    finalDiv.className = _Constants.finalDivClass;\n                    finalDiv.style.display = \"inline\";\n                    finalDiv.setAttribute(\"role\", \"menuitem\");\n                    finalDiv.setAttribute(\"aria-hidden\", \"true\");\n\n                    this._element.appendChild(finalDiv);\n                    var that = this;\n                    _ElementUtilities._addEventListener(finalDiv, \"focusin\", function () { that._focusOnFirstFocusableElementOrThis(); }, false);\n\n                    return finalDiv;\n                },\n\n                _writeProfilerMark: function Flyout_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI.Flyout:\" + this._id + \":\" + text);\n                }\n            },\n            {\n                _cascadeManager: new _CascadeManager(),\n            });\n            return Flyout;\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/CommandingSurface/_Constants',[\"require\", \"exports\"], function (require, exports) {\n    // CommandingSurface class names\n    exports.ClassNames = {\n        controlCssClass: \"win-commandingsurface\",\n        disposableCssClass: \"win-disposable\",\n        actionAreaCssClass: \"win-commandingsurface-actionarea\",\n        actionAreaContainerCssClass: \"win-commandingsurface-actionareacontainer\",\n        overflowButtonCssClass: \"win-commandingsurface-overflowbutton\",\n        spacerCssClass: \"win-commandingsurface-spacer\",\n        ellipsisCssClass: \"win-commandingsurface-ellipsis\",\n        overflowAreaCssClass: \"win-commandingsurface-overflowarea\",\n        overflowAreaContainerCssClass: \"win-commandingsurface-overflowareacontainer\",\n        contentFlyoutCssClass: \"win-commandingsurface-contentflyout\",\n        emptyCommandingSurfaceCssClass: \"win-commandingsurface-empty\",\n        menuCssClass: \"win-menu\",\n        menuContainsToggleCommandClass: \"win-menu-containstogglecommand\",\n        openedClass: \"win-commandingsurface-opened\",\n        closingClass: \"win-commandingsurface-closing\",\n        closedClass: \"win-commandingsurface-closed\",\n        noneClass: \"win-commandingsurface-closeddisplaynone\",\n        minimalClass: \"win-commandingsurface-closeddisplayminimal\",\n        compactClass: \"win-commandingsurface-closeddisplaycompact\",\n        fullClass: \"win-commandingsurface-closeddisplayfull\",\n        overflowTopClass: \"win-commandingsurface-overflowtop\",\n        overflowBottomClass: \"win-commandingsurface-overflowbottom\",\n    };\n    exports.EventNames = {\n        beforeOpen: \"beforeopen\",\n        afterOpen: \"afteropen\",\n        beforeClose: \"beforeclose\",\n        afterClose: \"afterclose\",\n        commandPropertyMutated: \"_commandpropertymutated\",\n    };\n    exports.actionAreaCommandWidth = 68;\n    exports.actionAreaSeparatorWidth = 34;\n    exports.actionAreaOverflowButtonWidth = 32;\n    exports.overflowCommandHeight = 44;\n    exports.overflowSeparatorHeight = 12;\n    exports.controlMinWidth = exports.actionAreaOverflowButtonWidth;\n    exports.overflowAreaMaxWidth = 480;\n    exports.heightOfMinimal = 24;\n    exports.heightOfCompact = 48;\n    exports.contentMenuCommandDefaultLabel = \"Custom content\";\n    exports.defaultClosedDisplayMode = \"compact\";\n    exports.defaultOpened = false;\n    exports.defaultOverflowDirection = \"bottom\";\n    // Constants for commands\n    exports.typeSeparator = \"separator\";\n    exports.typeContent = \"content\";\n    exports.typeButton = \"button\";\n    exports.typeToggle = \"toggle\";\n    exports.typeFlyout = \"flyout\";\n    exports.commandSelector = \".win-command\";\n    exports.primaryCommandSection = \"primary\";\n    exports.secondaryCommandSection = \"secondary\";\n});\n\ndefine('WinJS/Controls/ToolBar/_Constants',[\"require\", \"exports\", \"../CommandingSurface/_Constants\"], function (require, exports, _CommandingSurfaceConstants) {\n    // toolbar class names\n    exports.ClassNames = {\n        controlCssClass: \"win-toolbar\",\n        disposableCssClass: \"win-disposable\",\n        actionAreaCssClass: \"win-toolbar-actionarea\",\n        overflowButtonCssClass: \"win-toolbar-overflowbutton\",\n        spacerCssClass: \"win-toolbar-spacer\",\n        ellipsisCssClass: \"win-toolbar-ellipsis\",\n        overflowAreaCssClass: \"win-toolbar-overflowarea\",\n        contentFlyoutCssClass: \"win-toolbar-contentflyout\",\n        emptytoolbarCssClass: \"win-toolbar-empty\",\n        menuCssClass: \"win-menu\",\n        menuContainsToggleCommandClass: \"win-menu-containstogglecommand\",\n        openedClass: \"win-toolbar-opened\",\n        closedClass: \"win-toolbar-closed\",\n        compactClass: \"win-toolbar-closeddisplaycompact\",\n        fullClass: \"win-toolbar-closeddisplayfull\",\n        overflowTopClass: \"win-toolbar-overflowtop\",\n        overflowBottomClass: \"win-toolbar-overflowbottom\",\n        placeHolderCssClass: \"win-toolbar-placeholder\",\n    };\n    exports.EventNames = {\n        beforeOpen: \"beforeopen\",\n        afterOpen: \"afteropen\",\n        beforeClose: \"beforeclose\",\n        afterClose: \"afterclose\"\n    };\n    exports.OverflowDirection = {\n        top: \"top\",\n        bottom: \"bottom\",\n    };\n    exports.overflowAreaMaxWidth = _CommandingSurfaceConstants.overflowAreaMaxWidth;\n    exports.controlMinWidth = _CommandingSurfaceConstants.controlMinWidth;\n    exports.defaultClosedDisplayMode = \"compact\";\n    exports.defaultOpened = false;\n    // Constants for commands\n    exports.typeSeparator = \"separator\";\n    exports.typeContent = \"content\";\n    exports.typeButton = \"button\";\n    exports.typeToggle = \"toggle\";\n    exports.typeFlyout = \"flyout\";\n    exports.commandSelector = \".win-command\";\n    exports.primaryCommandSection = \"primary\";\n    exports.secondaryCommandSection = \"secondary\";\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Glyph Enumeration\n/// <dictionary>Segoe</dictionary>\ndefine('WinJS/Controls/AppBar/_Icon',[\n     'exports',\n     '../../Core/_Base',\n     '../../Core/_Resources'\n     ], function appBarIconInit(exports, _Base, _Resources) {\n    \"use strict\";\n\n    var glyphs = [\"previous\",\n                    \"next\",\n                    \"play\",\n                    \"pause\",\n                    \"edit\",\n                    \"save\",\n                    \"clear\",\n                    \"delete\",\n                    \"remove\",\n                    \"add\",\n                    \"cancel\",\n                    \"accept\",\n                    \"more\",\n                    \"redo\",\n                    \"undo\",\n                    \"home\",\n                    \"up\",\n                    \"forward\",\n                    \"right\",\n                    \"back\",\n                    \"left\",\n                    \"favorite\",\n                    \"camera\",\n                    \"settings\",\n                    \"video\",\n                    \"sync\",\n                    \"download\",\n                    \"mail\",\n                    \"find\",\n                    \"help\",\n                    \"upload\",\n                    \"emoji\",\n                    \"twopage\",\n                    \"leavechat\",\n                    \"mailforward\",\n                    \"clock\",\n                    \"send\",\n                    \"crop\",\n                    \"rotatecamera\",\n                    \"people\",\n                    \"closepane\",\n                    \"openpane\",\n                    \"world\",\n                    \"flag\",\n                    \"previewlink\",\n                    \"globe\",\n                    \"trim\",\n                    \"attachcamera\",\n                    \"zoomin\",\n                    \"bookmarks\",\n                    \"document\",\n                    \"protecteddocument\",\n                    \"page\",\n                    \"bullets\",\n                    \"comment\",\n                    \"mail2\",\n                    \"contactinfo\",\n                    \"hangup\",\n                    \"viewall\",\n                    \"mappin\",\n                    \"phone\",\n                    \"videochat\",\n                    \"switch\",\n                    \"contact\",\n                    \"rename\",\n                    \"pin\",\n                    \"musicinfo\",\n                    \"go\",\n                    \"keyboard\",\n                    \"dockleft\",\n                    \"dockright\",\n                    \"dockbottom\",\n                    \"remote\",\n                    \"refresh\",\n                    \"rotate\",\n                    \"shuffle\",\n                    \"list\",\n                    \"shop\",\n                    \"selectall\",\n                    \"orientation\",\n                    \"import\",\n                    \"importall\",\n                    \"browsephotos\",\n                    \"webcam\",\n                    \"pictures\",\n                    \"savelocal\",\n                    \"caption\",\n                    \"stop\",\n                    \"showresults\",\n                    \"volume\",\n                    \"repair\",\n                    \"message\",\n                    \"page2\",\n                    \"calendarday\",\n                    \"calendarweek\",\n                    \"calendar\",\n                    \"characters\",\n                    \"mailreplyall\",\n                    \"read\",\n                    \"link\",\n                    \"accounts\",\n                    \"showbcc\",\n                    \"hidebcc\",\n                    \"cut\",\n                    \"attach\",\n                    \"paste\",\n                    \"filter\",\n                    \"copy\",\n                    \"emoji2\",\n                    \"important\",\n                    \"mailreply\",\n                    \"slideshow\",\n                    \"sort\",\n                    \"manage\",\n                    \"allapps\",\n                    \"disconnectdrive\",\n                    \"mapdrive\",\n                    \"newwindow\",\n                    \"openwith\",\n                    \"contactpresence\",\n                    \"priority\",\n                    \"uploadskydrive\",\n                    \"gototoday\",\n                    \"font\",\n                    \"fontcolor\",\n                    \"contact2\",\n                    \"folder\",\n                    \"audio\",\n                    \"placeholder\",\n                    \"view\",\n                    \"setlockscreen\",\n                    \"settile\",\n                    \"cc\",\n                    \"stopslideshow\",\n                    \"permissions\",\n                    \"highlight\",\n                    \"disableupdates\",\n                    \"unfavorite\",\n                    \"unpin\",\n                    \"openlocal\",\n                    \"mute\",\n                    \"italic\",\n                    \"underline\",\n                    \"bold\",\n                    \"movetofolder\",\n                    \"likedislike\",\n                    \"dislike\",\n                    \"like\",\n                    \"alignright\",\n                    \"aligncenter\",\n                    \"alignleft\",\n                    \"zoom\",\n                    \"zoomout\",\n                    \"openfile\",\n                    \"otheruser\",\n                    \"admin\",\n                    \"street\",\n                    \"map\",\n                    \"clearselection\",\n                    \"fontdecrease\",\n                    \"fontincrease\",\n                    \"fontsize\",\n                    \"cellphone\",\n                    \"reshare\",\n                    \"tag\",\n                    \"repeatone\",\n                    \"repeatall\",\n                    \"outlinestar\",\n                    \"solidstar\",\n                    \"calculator\",\n                    \"directions\",\n                    \"target\",\n                    \"library\",\n                    \"phonebook\",\n                    \"memo\",\n                    \"microphone\",\n                    \"postupdate\",\n                    \"backtowindow\",\n                    \"fullscreen\",\n                    \"newfolder\",\n                    \"calendarreply\",\n                    \"unsyncfolder\",\n                    \"reporthacked\",\n                    \"syncfolder\",\n                    \"blockcontact\",\n                    \"switchapps\",\n                    \"addfriend\",\n                    \"touchpointer\",\n                    \"gotostart\",\n                    \"zerobars\",\n                    \"onebar\",\n                    \"twobars\",\n                    \"threebars\",\n                    \"fourbars\",\n                    \"scan\",\n                    \"preview\",\n                    \"hamburger\"];\n\n    // Provide properties to grab resources for each of the icons\n    /// <summary locid=\"WinJS.UI.AppBarIcon\">\n    /// The AppBarIcon enumeration provides a set of glyphs for use with the AppBarCommand icon property.\n    /// </summary>\n    var icons = glyphs.reduce(function (fixedIcons, item) {\n       fixedIcons[item] = { get: function () { return _Resources._getWinJSString(\"ui/appBarIcons/\" + item).value; } };\n       return fixedIcons;\n     }, {});\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI.AppBarIcon\", icons);\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// AppBarCommand\n/// <dictionary>appbar,appbars,Flyout,Flyouts,onclick,Statics</dictionary>\ndefine('WinJS/Controls/AppBar/_Command',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_WinRT',\n    '../../Core/_Base',\n    \"../../Core/_BaseUtils\",\n    '../../Core/_ErrorFromName',\n    \"../../Core/_Events\",\n    '../../Core/_Resources',\n    '../../Utilities/_Control',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../Flyout/_Overlay',\n    '../Tooltip',\n    '../_LegacyAppBar/_Constants',\n    './_Icon'\n], function appBarCommandInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _Control, _Dispose, _ElementUtilities, _Overlay, Tooltip, _Constants, _Icon) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.AppBarCommand\">\n        /// Represents a command to display in an AppBar.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.appbarcommand.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.appbarcommand.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<button data-win-control=\"WinJS.UI.AppBarCommand\" data-win-options=\"{type:'button',label:'Button'}\"></button>]]></htmlSnippet>\n        /// <event name=\"commandvisibilitychanged\" locid=\"WinJS.UI.AppBarCommand_e:commandvisibilitychanged\">Raised after the hidden property has been programmatically changed.</event>\n        /// <part name=\"appBarCommand\" class=\"win-command\" locid=\"WinJS.UI.AppBarCommand_part:appBarCommand\">The AppBarCommand control itself.</part>\n        /// <part name=\"appBarCommandIcon\" class=\"win-commandicon\" locid=\"WinJS.UI.AppBarCommand_part:appBarCommandIcon\">The AppBarCommand's icon box.</part>\n        /// <part name=\"appBarCommandImage\" class=\"win-commandimage\" locid=\"WinJS.UI.AppBarCommand_part:appBarCommandImage\">The AppBarCommand's icon's image formatting.</part>\n        /// <part name=\"appBarCommandLabel\" class=\"win-label\" locid=\"WinJS.UI.AppBarCommand_part:appBarCommandLabel\">The AppBarCommand's label</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        AppBarCommand: _Base.Namespace._lazy(function () {\n\n            function _handleClick(event) {\n                /*jshint validthis: true */\n                var command = this.winControl;\n                if (command) {\n                    if (command._type === _Constants.typeToggle) {\n                        command.selected = !command.selected;\n                    } else if (command._type === _Constants.typeFlyout && command._flyout) {\n                        var flyout = command._flyout;\n                        // Flyout may not have processAll'd, so this may be a DOM object\n                        if (typeof flyout === \"string\") {\n                            flyout = _Global.document.getElementById(flyout);\n                        }\n                        if (!flyout.show) {\n                            flyout = flyout.winControl;\n                        }\n                        if (flyout && flyout.show) {\n                            flyout.show(this, \"autovertical\");\n                        }\n                    }\n                    if (command.onclick) {\n                        command.onclick(event);\n                    }\n                }\n            }\n\n            // Used by AppBarCommands to notify listeners that a property has changed.\n            var PropertyMutations = _Base.Class.define(function PropertyMutations_ctor() {\n                this._observer = _BaseUtils._merge({}, _Events.eventMixin);\n            }, {\n                bind: function (callback) {\n                    this._observer.addEventListener(_Constants.commandPropertyMutated, callback);\n                },\n                unbind: function (callback) {\n                    this._observer.removeEventListener(_Constants.commandPropertyMutated, callback);\n                },\n                dispatchEvent: function (type, detail) {\n                    this._observer.dispatchEvent(type, detail);\n                },\n            });\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/appBarCommandAriaLabel\").value; },\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get badClick() { return \"Invalid argument: The onclick property for an {0} must be a function\"; },\n                get badDivElement() { return \"Invalid argument: For a content command, the element must be null or a div element\"; },\n                get badHrElement() { return \"Invalid argument: For a separator, the element must be null or an hr element\"; },\n                get badButtonElement() { return \"Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element\"; },\n                get badPriority() { return \"Invalid argument: the priority of an {0} must be a non-negative integer\"; }\n            };\n\n            var AppBarCommand = _Base.Class.define(function AppBarCommand_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.AppBarCommand.AppBarCommand\">\n                /// <summary locid=\"WinJS.UI.AppBarCommand.constructor\">\n                /// Creates a new AppBarCommand control.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.AppBarCommand.constructor_p:element\">\n                /// The DOM element that will host the control. AppBarCommand will create one if null.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.AppBarCommand.constructor_p:options\">\n                /// The set of properties and values to apply to the new AppBarCommand.\n                /// </param>\n                /// <returns type=\"WinJS.UI.AppBarCommand\" locid=\"WinJS.UI.AppBarCommand.constructor_returnValue\">\n                /// The new AppBarCommand control.\n                /// </returns>\n                /// </signature>\n\n                // Check to make sure we weren't duplicated\n                if (element && element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.AppBarCommand.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                this._disposed = false;\n\n                // Don't blow up if they didn't pass options\n                if (!options) {\n                    options = {};\n                }\n\n                // Need a type before we can create our element\n                if (!options.type) {\n                    this._type = _Constants.typeButton;\n                }\n\n                options.section = options.section || _Constants.sectionPrimary;\n\n                // Go ahead and create it, separator and content types look different than buttons\n                // Don't forget to use passed in element if one was provided.\n                this._element = element;\n\n                if (options.type === _Constants.typeContent) {\n                    this._createContent();\n                } else if (options.type === _Constants.typeSeparator) {\n                    this._createSeparator();\n                } else {\n                    // This will also set the icon & label\n                    this._createButton();\n                }\n                _ElementUtilities.addClass(this._element, \"win-disposable\");\n\n                // Remember ourselves\n                this._element.winControl = this;\n\n                // Attach our css class\n                _ElementUtilities.addClass(this._element, _Constants.appBarCommandClass);\n\n                if (options.onclick) {\n                    this.onclick = options.onclick;\n                }\n                // We want to handle some clicks\n                options.onclick = _handleClick;\n\n                _Control.setOptions(this, options);\n\n                if (this._type === _Constants.typeToggle && !options.selected) {\n                    this.selected = false;\n                }\n\n                // Set up pointerdown handler and clean up ARIA if needed\n                if (this._type !== _Constants.typeSeparator) {\n\n                    // Make sure we have an ARIA role\n                    var role = this._element.getAttribute(\"role\");\n                    if (role === null || role === \"\" || role === undefined) {\n                        if (this._type === _Constants.typeToggle) {\n                            role = \"menuitemcheckbox\";\n                        } else if (this._type === _Constants.typeContent) {\n                            role = \"group\";\n                        } else {\n                            role = \"menuitem\";\n                        }\n                        this._element.setAttribute(\"role\", role);\n                        if (this._type === _Constants.typeFlyout) {\n                            this._element.setAttribute(\"aria-haspopup\", true);\n                        }\n                    }\n                    // Label should've been set by label, but if it was missed for some reason:\n                    var label = this._element.getAttribute(\"aria-label\");\n                    if (label === null || label === \"\" || label === undefined) {\n                        this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                    }\n                }\n\n                this._propertyMutations = new PropertyMutations();\n                var that = this;\n                ObservablePropertyWhiteList.forEach(function (propertyName) {\n                    makeObservable(that, propertyName);\n                });\n            }, {\n                /// <field type=\"String\" locid=\"WinJS.UI.AppBarCommand.id\" helpKeyword=\"WinJS.UI.AppBarCommand.id\" isAdvanced=\"true\">\n                /// Gets or sets the ID of the AppBarCommand.\n                /// </field>\n                id: {\n                    get: function () {\n                        return this._element.id;\n                    },\n\n                    set: function (value) {\n                        // we allow setting first time only. otherwise we ignore it.\n                        if (value && !this._element.id) {\n                            this._element.id = value;\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" defaultValue=\"button\" readonly=\"true\" oamOptionsDatatype=\"WinJS.UI.AppBarCommand.type\" locid=\"WinJS.UI.AppBarCommand.type\" helpKeyword=\"WinJS.UI.AppBarCommand.type\" isAdvanced=\"true\">\n                /// Gets or sets the type of the AppBarCommand. Possible values are \"button\", \"toggle\", \"flyout\", \"content\" or \"separator\".\n                /// </field>\n                type: {\n                    get: function () {\n                        return this._type;\n                    },\n                    set: function (value) {\n                        // we allow setting first time only. otherwise we ignore it.\n                        if (!this._type) {\n                            if (value !== _Constants.typeContent && value !== _Constants.typeFlyout && value !== _Constants.typeToggle && value !== _Constants.typeSeparator) {\n                                this._type = _Constants.typeButton;\n                            } else {\n                                this._type = value;\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.AppBarCommand.label\" helpKeyword=\"WinJS.UI.AppBarCommand.label\">\n                /// Gets or sets the label of the AppBarCommand.\n                /// </field>\n                label: {\n                    get: function () {\n                        return this._label;\n                    },\n                    set: function (value) {\n                        this._label = value;\n                        if (this._labelSpan) {\n                            this._labelSpan.textContent = this.label;\n                        }\n\n                        // Ensure that we have a tooltip, by updating already-constructed tooltips.  Separators won't have these:\n                        if (!this.tooltip && this._tooltipControl) {\n                            this._tooltip = this.label;\n                            this._tooltipControl.innerHTML = this.label;\n                        }\n\n                        // Update aria-label\n                        this._element.setAttribute(\"aria-label\", this.label);\n\n                        // Check if we need to suppress the tooltip\n                        this._testIdenticalTooltip();\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.AppBarCommand.icon\" helpKeyword=\"WinJS.UI.AppBarCommand.icon\">\n                /// Gets or sets the icon of the AppBarCommand.\n                /// </field>\n                icon: {\n                    get: function () {\n                        return this._icon;\n                    },\n                    set: function (value) {\n\n                        this._icon = _Icon[value] || value;\n\n                        if (this._imageSpan) {\n                            // If the icon's a single character, presume a glyph\n                            if (this._icon && this._icon.length === 1) {\n                                // Set the glyph\n                                this._imageSpan.textContent = this._icon;\n                                this._imageSpan.style.backgroundImage = \"\";\n                                this._imageSpan.style.msHighContrastAdjust = \"\";\n                                _ElementUtilities.addClass(this._imageSpan, \"win-commandglyph\");\n                            } else {\n                                // Must be an image, set that\n                                this._imageSpan.textContent = \"\";\n                                this._imageSpan.style.backgroundImage = this._icon;\n                                this._imageSpan.style.msHighContrastAdjust = \"none\";\n                                _ElementUtilities.removeClass(this._imageSpan, \"win-commandglyph\");\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.AppBarCommand.onclick\" helpKeyword=\"WinJS.UI.AppBarCommand.onclick\">\n                /// Gets or sets the function to invoke when the command is clicked.\n                /// </field>\n                onclick: {\n                    get: function () {\n                        return this._onclick;\n                    },\n                    set: function (value) {\n                        if (value && typeof value !== \"function\") {\n                            throw new _ErrorFromName(\"WinJS.UI.AppBarCommand.BadClick\", _Resources._formatString(strings.badClick, \"AppBarCommand\"));\n                        }\n                        this._onclick = value;\n                    }\n                },\n\n                /// <field type=\"Number\" locid=\"WinJS.UI.AppBarCommand.priority\" helpKeyword=\"WinJS.UI.AppBarCommand.priority\">\n                /// Gets or sets the priority of the command\n                /// </field>\n                priority: {\n                    get: function () {\n                        return this._priority;\n                    },\n                    set: function (value) {\n                        if (value === undefined || (typeof value === \"number\" && value >= 0)) {\n                            this._priority = value;\n                        } else {\n                            throw new _ErrorFromName(\"WinJS.UI.AppBarCommand.BadPriority\", _Resources._formatString(strings.badPriority, \"AppBarCommand\"));\n                        }\n\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.AppBarCommand.flyout\" helpKeyword=\"WinJS.UI.AppBarCommand.flyout\">\n                /// For flyout-type AppBarCommands, this property returns the WinJS.UI.Flyout that this command invokes.\n                /// When setting this property, you may also use the String ID of the flyout to invoke, the DOM object\n                /// for the flyout, or the WinJS.UI.Flyout object itself.\n                /// If the value is set to the String ID of the flyout to invoke, or the DOM object for the flyout, but this\n                /// has not been processed yet, the getter will return the DOM object until it is processed, and\n                /// subsequently return a flyout.\n                /// </field>\n                flyout: {\n                    get: function () {\n                        // Resolve it to the flyout\n                        var flyout = this._flyout;\n                        if (typeof flyout === \"string\") {\n                            flyout = _Global.document.getElementById(flyout);\n                        }\n                        // If it doesn't have a .element, then we need to getControl on it\n                        if (flyout && !flyout.element && flyout.winControl) {\n                            flyout = flyout.winControl;\n                        }\n\n                        return flyout;\n                    },\n                    set: function (value) {\n                        // Need to update aria-owns with the new ID.\n                        var id = value;\n                        if (id && typeof id !== \"string\") {\n                            // Our controls have .element properties\n                            if (id.element) {\n                                id = id.element;\n                            }\n                            // Hope it's a DOM element, get ID from DOM element\n                            if (id) {\n                                if (id.id) {\n                                    id = id.id;\n                                } else {\n                                    // No id, have to fake one\n                                    id.id = _ElementUtilities._uniqueID(id);\n                                    id = id.id;\n                                }\n                            }\n                        }\n                        if (typeof id === \"string\") {\n                            this._element.setAttribute(\"aria-owns\", id);\n                        }\n\n                        // Remember it\n                        this._flyout = value;\n                    }\n                },\n\n                /// <field type=\"String\" defaultValue=\"global\" oamOptionsDatatype=\"WinJS.UI.AppBarCommand.section\" locid=\"WinJS.UI.AppBarCommand.section\" helpKeyword=\"WinJS.UI.AppBarCommand.section\">\n                /// Gets or sets the section that the AppBarCommand is in. Possible values are \"secondary\" and \"primary\".\n                /// </field>\n                section: {\n                    get: function () {\n                        return this._section;\n                    },\n                    set: function (value) {\n                        // we allow settings section only one time\n                        if (!this._section || _WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {\n                            this._setSection(value);\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.AppBarCommand.tooltip\" helpKeyword=\"WinJS.UI.AppBarCommand.tooltip\">Gets or sets the tooltip text of the AppBarCommand.</field>\n                tooltip: {\n                    get: function () {\n                        return this._tooltip;\n                    },\n                    set: function (value) {\n                        this._tooltip = value;\n\n                        // Update already-constructed tooltips. Separators and content commands won't have these:\n                        if (this._tooltipControl) {\n                            this._tooltipControl.innerHTML = this._tooltip;\n                        }\n\n                        // Check if we need to suppress the tooltip\n                        this._testIdenticalTooltip();\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.AppBarCommand.selected\" helpKeyword=\"WinJS.UI.AppBarCommand.selected\">Set or get the selected state of a toggle button.</field>\n                selected: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return this._element.getAttribute(\"aria-checked\") === \"true\";\n                    },\n                    set: function (value) {\n                        this._element.setAttribute(\"aria-checked\", value);\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.AppBarCommand.element\" helpKeyword=\"WinJS.UI.AppBarCommand.element\">\n                /// The DOM element that hosts the AppBarCommad.\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.AppBarCommand.disabled\" helpKeyword=\"WinJS.UI.AppBarCommand.disabled\">\n                /// Gets or sets a value that indicates whether the AppBarCommand is disabled. A value of true disables the AppBarCommand, and a value of false enables it.\n                /// </field>\n                disabled: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return !!this._element.disabled;\n                    },\n                    set: function (value) {\n                        this._element.disabled = value;\n                    }\n                },\n\n                /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI.AppBarCommand.hidden\" helpKeyword=\"WinJS.UI.AppBarCommand.hidden\">\n                /// Gets a value that indicates whether the AppBarCommand is hiding or in the process of becoming hidden.\n                /// A value of true indicates that the AppBarCommand is hiding or in the process of becoming hidden.\n                /// </field>\n                hidden: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return this._element.style.visibility === \"hidden\";\n                    },\n                    set: function (value) {\n                        if (value === this.hidden) {\n                            // No changes to make.\n                            return;\n                        }\n\n                        var style = this._element.style;\n                        var originalVisibility = style.visibility;\n                        var originalDisplay = style.display;\n\n                        if (value) {\n                            style.visibility = \"hidden\";\n                            style.display = \"none\";\n                        } else {\n                            style.visibility = \"\";\n                            style.display = \"inline-block\";\n                        }\n\n                        if (!this._sendEvent(_Constants.commandVisibilityChanged)) {\n                            style.visibility = originalVisibility;\n                            style.display = originalDisplay;\n                        }\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.AppBarCommand.firstElementFocus\" helpKeyword=\"WinJS.UI.AppBarCommand.firstElementFocus\">\n                /// Gets or sets the HTMLElement within a \"content\" type AppBarCommand that should receive focus whenever focus moves via Home or the arrow keys,\n                /// from the previous AppBarCommand to the this AppBarCommand. Returns the AppBarCommand object's host element by default.\n                /// </field>\n                firstElementFocus: {\n                    get: function () {\n                        return this._firstElementFocus || this._lastElementFocus || this._element;\n                    },\n                    set: function (element) {\n                        // Arguments of null and this.element should treated the same to ensure that this.element is never a tabstop when either focus property has been set.\n                        this._firstElementFocus = (element === this.element) ? null : element;\n                        this._updateTabStop();\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.AppBarCommand.lastElementFocus\" helpKeyword=\"WinJS.UI.AppBarCommand.lastElementFocus\">\n                /// Gets or sets the HTMLElement within a \"content\" type AppBarCommand that should receive focus whenever focus would move, via End or arrow keys,\n                /// from the next AppBarCommand to this AppBarCommand. Returns this AppBarCommand object's host element by default.\n                /// </field>\n                lastElementFocus: {\n                    get: function () {\n                        return this._lastElementFocus || this._firstElementFocus || this._element;\n                    },\n                    set: function (element) {\n                        // Arguments of null and this.element should treated the same to ensure that this.element is never a tabstop when either focus property has been set.\n                        this._lastElementFocus = (element === this.element) ? null : element;\n                        this._updateTabStop();\n                    }\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.AppBarCommand.dispose\">\n                    /// <summary locid=\"WinJS.UI.AppBarCommand.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    if (this._tooltipControl) {\n                        this._tooltipControl.dispose();\n                    }\n\n                    if (this._type === _Constants.typeContent) {\n                        _Dispose.disposeSubTree(this.element);\n                    }\n                },\n\n                addEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI.AppBarCommand.addEventListener\">\n                    /// <summary locid=\"WinJS.UI.AppBarCommand.addEventListener\">\n                    /// Registers an event handler for the specified event.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.AppBarCommand.addEventListener_p:type\">\n                    /// Required. The name of the event to register.\n                    /// </param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI.AppBarCommand.addEventListener_p:listener\">Required. The event handler function to associate with this event.</param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI.AppBarCommand.addEventListener_p:useCapture\">\n                    /// Optional. Set to true to register the event handler for the capturing phase; otherwise, set to false to register the event handler for the bubbling phase.\n                    /// </param>\n                    /// </signature>\n                    return this._element.addEventListener(type, listener, useCapture);\n                },\n\n                removeEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI.AppBarCommand.removeEventListener\">\n                    /// <summary locid=\"WinJS.UI.AppBarCommand.removeEventListener\">\n                    /// Removes an event handler that the addEventListener method registered.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.AppBarCommand.removeEventListener_p:type\">Required. The name of the event to remove.</param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI.AppBarCommand.removeEventListener_p:listener\">Required. The event handler function to remove.</param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI.AppBarCommand.removeEventListener_p:useCapture\">\n                    /// Optional. Set to true to remove the capturing phase event handler; otherwise, set to false to remove the bubbling phase event handler.\n                    /// </param>\n                    /// </signature>\n                    return this._element.removeEventListener(type, listener, useCapture);\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.AppBarCommand.extraClass\" helpKeyword=\"WinJS.UI.AppBarCommand.extraClass\" isAdvanced=\"true\">Adds an extra CSS class during construction.</field>\n                extraClass: {\n                    get: function () {\n                        return this._extraClass;\n                    },\n                    set: function (value) {\n                        if (this._extraClass) {\n                            _ElementUtilities.removeClass(this._element, this._extraClass);\n                        }\n                        this._extraClass = value;\n                        _ElementUtilities.addClass(this._element, this._extraClass);\n                    }\n                },\n\n                // Private\n                _testIdenticalTooltip: function AppBarCommand_testIdenticalToolTip() {\n                    this._hideIfFullSize = (this._label === this._tooltip);\n                },\n\n                _createContent: function AppBarCommand_createContent() {\n                    // Make sure there's an element\n                    if (!this._element) {\n                        this._element = _Global.document.createElement(\"div\");\n                    } else {\n                        // Verify the element was a div\n                        if (this._element.tagName !== \"DIV\") {\n                            throw new _ErrorFromName(\"WinJS.UI.AppBarCommand.BadDivElement\", strings.badDivElement);\n                        }\n                    }\n\n                    // If a tabIndex isnt set, default to 0;\n                    if (parseInt(this._element.getAttribute(\"tabIndex\"), 10) !== this._element.tabIndex) {\n                        this._element.tabIndex = 0;\n                    }\n                },\n\n                _createSeparator: function AppBarCommand_createSeparator() {\n                    // Make sure there's an element\n                    if (!this._element) {\n                        this._element = _Global.document.createElement(\"hr\");\n                    } else {\n                        // Verify the element was an hr\n                        if (this._element.tagName !== \"HR\") {\n                            throw new _ErrorFromName(\"WinJS.UI.AppBarCommand.BadHrElement\", strings.badHrElement);\n                        }\n                    }\n                },\n\n                _createButton: function AppBarCommand_createButton() {\n                    // Make sure there's an element\n                    if (!this._element) {\n                        this._element = _Global.document.createElement(\"button\");\n                    } else {\n                        // Verify the element was a button\n                        if (this._element.tagName !== \"BUTTON\") {\n                            throw new _ErrorFromName(\"WinJS.UI.AppBarCommand.BadButtonElement\", strings.badButtonElement);\n                        }\n                        // Make sure it has a type=\"button\"\n                        var type = this._element.getAttribute(\"type\");\n                        if (type === null || type === \"\" || type === undefined) {\n                            this._element.setAttribute(\"type\", \"button\");\n                        }\n                        this._element.innerHTML = \"\";\n                    }\n\n                    // AppBarCommand buttons need to look like this:\n                    //// <button type=\"button\" onclick=\"\" class=\"win-command win-global\">\n                    ////      <span class=\"win-commandicon\"><span class=\"win-commandimage\">&#xE0D5;</span></span><span class=\"win-label\">Command 1</span>\n                    //// Or This:\n                    ////      <span class=\"win-commandicon\"><span class=\"win-commandimage\" style=\"background-image:url('customimage.png')\"></span></span><span class=\"win-label\">Command 1</span>\n                    //// </button>\n                    this._element.type = \"button\";\n                    this._iconSpan = _Global.document.createElement(\"span\");\n                    this._iconSpan.setAttribute(\"aria-hidden\", \"true\");\n                    this._iconSpan.className = \"win-commandicon\";\n                    this._iconSpan.tabIndex = -1;\n                    this._element.appendChild(this._iconSpan);\n                    this._imageSpan = _Global.document.createElement(\"span\");\n                    this._imageSpan.setAttribute(\"aria-hidden\", \"true\");\n                    this._imageSpan.className = \"win-commandimage\";\n                    this._imageSpan.tabIndex = -1;\n                    this._iconSpan.appendChild(this._imageSpan);\n                    this._labelSpan = _Global.document.createElement(\"span\");\n                    this._labelSpan.setAttribute(\"aria-hidden\", \"true\");\n                    this._labelSpan.className = \"win-label\";\n                    this._labelSpan.tabIndex = -1;\n                    this._element.appendChild(this._labelSpan);\n                    // 'win-global' or 'win-selection' are added later by caller.\n                    // Label and icon are added later by caller.\n\n                    // Attach a tooltip - Note: we're going to stomp on it's setControl so we don't have to make another DOM element to hang it off of.\n                    // This private _tooltipControl attribute is used by other pieces, changing the name could break them.\n                    this._tooltipControl = new Tooltip.Tooltip(this._element);\n                    var that = this;\n                    this._tooltipControl.addEventListener(\"beforeopen\", function () {\n                        if (that._hideIfFullSize && !_Overlay._Overlay._getParentControlUsingClassName(that._element.parentElement, _Constants.reducedClass)) {\n                            that._tooltipControl.close();\n                        }\n                    }, false);\n                },\n\n                _setSection: function AppBarCommand_setSection(section) {\n                    if (!section) {\n                        section = _Constants.sectionPrimary;\n                    }\n\n                    // _Constants.sectionSelection and _Constants.sectionGlobal are deprecated, so we will continue\n                    //  adding/removing its corresponding CSS class for app compat.\n                    // _Constants.sectionPrimary and _Constants.sectionSecondary no longer apply CSS classes to the\n                    // commands.\n\n                    if (this._section) {\n                        // Remove the old section class\n                        if (this._section === _Constants.sectionGlobal) {\n                            _ElementUtilities.removeClass(this._element, _Constants.appBarCommandGlobalClass);\n                        } else if (this.section === _Constants.sectionSelection) {\n                            _ElementUtilities.removeClass(this._element, _Constants.appBarCommandSelectionClass);\n                        }\n                    }\n                    // Add the new section class\n                    this._section = section;\n                    if (section === _Constants.sectionGlobal) {\n                        _ElementUtilities.addClass(this._element, _Constants.appBarCommandGlobalClass);\n                    } else if (section === _Constants.sectionSelection) {\n                        _ElementUtilities.addClass(this._element, _Constants.appBarCommandSelectionClass);\n                    }\n                },\n\n                _updateTabStop: function AppBarCommand_updateTabStop() {\n                    // Whenever the firstElementFocus or lastElementFocus properties are set for content type AppBarCommands,\n                    // the containing command element is no longer a tabstop.\n\n                    if (this._firstElementFocus || this._lastElementFocus) {\n                        this.element.tabIndex = -1;\n                    } else {\n                        this.element.tabIndex = 0;\n                    }\n                },\n\n                _isFocusable: function AppBarCommand_isFocusable() {\n                    return (!this.hidden && this._type !== _Constants.typeSeparator && !this.element.disabled &&\n                        (this.firstElementFocus.tabIndex >= 0 || this.lastElementFocus.tabIndex >= 0));\n                },\n\n                _sendEvent: function AppBarCommand_sendEvent(eventName, detail) {\n                    if (this._disposed) {\n                        return;\n                    }\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(eventName, true, true, (detail || {}));\n                    return this._element.dispatchEvent(event);\n                },\n            });\n\n\n            // The list of AppBarCommand properties that we care about firing an event \n            // for, whenever they are changed after initial construction.\n            var ObservablePropertyWhiteList = [\n                \"label\",\n                \"disabled\",\n                \"flyout\",\n                \"extraClass\",\n                \"selected\",\n                \"onclick\",\n                \"hidden\",\n            ];\n\n            function makeObservable(command, propertyName) {\n                // Make a pre-existing AppBarCommand property observable by firing the \"_commandpropertymutated\"\n                // event whenever its value changes.\n\n                // Preserve initial value in JS closure variable\n                var _value = command[propertyName];\n\n                // Preserve original getter/setter if they exist, else use inline proxy functions.\n                var proto = command.constructor.prototype;\n                var originalDesc = getPropertyDescriptor(proto, propertyName) || {};\n                var getter = originalDesc.get.bind(command) || function getterProxy() {\n                    return _value;\n                };\n                var setter = originalDesc.set.bind(command) || function setterProxy(value) {\n                    _value = value;\n                };\n\n                // Define new observable Get/Set for propertyName on the command instance\n                Object.defineProperty(command, propertyName, {\n                    get: function observable_get() {\n                        return getter();\n                    },\n                    set: function observable_set(value) {\n\n                        var oldValue = getter();\n\n                        // Process value through the original setter & getter before deciding to send an event.\n                        setter(value);\n                        var newValue = getter();\n                        if (!this._disposed && oldValue !== value && oldValue !== newValue && !command._disposed) {\n\n                            command._propertyMutations.dispatchEvent(\n                                _Constants.commandPropertyMutated,\n                                {\n                                    command: command,\n                                    propertyName: propertyName,\n                                    oldValue: oldValue,\n                                    newValue: newValue,\n                                });\n                        }\n                    }\n                });\n            }\n\n            function getPropertyDescriptor(obj, propertyName) {\n                // Returns a matching property descriptor, or null, \n                // if no matching descriptor is found.\n                var desc = null;\n                while (obj && !desc) {\n                    desc = Object.getOwnPropertyDescriptor(obj, propertyName);\n                    obj = Object.getPrototypeOf(obj);\n                    // Walk obj's prototype chain until we find a match.\n                }\n                return desc;\n            }\n\n            return AppBarCommand;\n        })\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        Command: _Base.Namespace._lazy(function () { return exports.AppBarCommand; })\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Menu Command\n/// <dictionary>appbar,appbars,Flyout,Flyouts,onclick,Statics</dictionary>\ndefine('WinJS/Controls/Menu/_Command',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Resources',\n    '../../Promise',\n    '../../Utilities/_Control',\n    '../../Utilities/_ElementUtilities',\n    '../_LegacyAppBar/_Constants',\n    '../Flyout/_Overlay'\n], function menuCommandInit(exports, _Global, _Base, _ErrorFromName, _Resources, Promise, _Control, _ElementUtilities, _Constants, _Overlay) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.MenuCommand\">\n        /// Represents a command to be displayed in a Menu. MenuCommand objects provide button, toggle button, flyout button,\n        /// or separator functionality for Menu controls.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.menucommand.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.menucommand.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<button data-win-control=\"WinJS.UI.MenuCommand\" data-win-options=\"{type:'button',label:'Button'}\"></button>]]></htmlSnippet>\n        /// <part name=\"MenuCommand\" class=\"win-command\" locid=\"WinJS.UI.MenuCommand_name\">The MenuCommand control itself</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        MenuCommand: _Base.Namespace._lazy(function () {\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/menuCommandAriaLabel\").value; },\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get badClick() { return \"Invalid argument: The onclick property for an {0} must be a function\"; },\n                get badHrElement() { return \"Invalid argument: For a separator, the element must be null or an hr element\"; },\n                get badButtonElement() { return \"Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element\"; }\n            };\n\n            var MenuCommand = _Base.Class.define(function MenuCommand_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.MenuCommand.MenuCommand\">\n                /// <summary locid=\"WinJS.UI.MenuCommand.constructor\">\n                /// Creates a new MenuCommand object.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.MenuCommand.constructor_p:element\">\n                /// The DOM element that will host the control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.MenuCommand.constructor_p:options\">\n                /// The set of properties and values to apply to the new MenuCommand.\n                /// </param>\n                /// <returns type=\"WinJS.UI.MenuCommand\" locid=\"WinJS.UI.MenuCommand.constructor_returnValue\">\n                /// A MenuCommand control.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n\n                // Check to make sure we weren't duplicated\n                if (element && element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.MenuCommand.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                this._disposed = false;\n\n                // Don't blow up if they didn't pass options\n                if (!options) {\n                    options = {};\n                }\n\n                // Need a type before we can create our element\n                if (!options.type) {\n                    this._type = _Constants.typeButton;\n                }\n\n                // Go ahead and create it, separator types look different than buttons\n                // Don't forget to use passed in element if one was provided.\n                this._element = element;\n                if (options.type === _Constants.typeSeparator) {\n                    this._createSeparator();\n                } else {\n                    // This will also set the icon & label\n                    this._createButton();\n                }\n                _ElementUtilities.addClass(this._element, \"win-disposable\");\n\n                // Remember ourselves\n                this._element.winControl = this;\n\n                // Attach our css class\n                _ElementUtilities.addClass(this._element, _Constants.menuCommandClass);\n\n                if (!options.selected && options.type === _Constants.typeToggle) {\n                    // Make sure toggle's have selected false for CSS\n                    this.selected = false;\n                }\n\n                if (options.onclick) {\n                    this.onclick = options.onclick;\n                }\n                options.onclick = this._handleClick.bind(this);\n\n                _Control.setOptions(this, options);\n\n                // Set our options\n                if (this._type !== _Constants.typeSeparator) {\n                    // Make sure we have an ARIA role\n                    var role = this._element.getAttribute(\"role\");\n                    if (role === null || role === \"\" || role === undefined) {\n                        role = \"menuitem\";\n                        if (this._type === _Constants.typeToggle) {\n                            role = \"menuitemcheckbox\";\n                        }\n                        this._element.setAttribute(\"role\", role);\n                        if (this._type === _Constants.typeFlyout) {\n                            this._element.setAttribute(\"aria-haspopup\", true);\n                        }\n                    }\n                    var label = this._element.getAttribute(\"aria-label\");\n                    if (label === null || label === \"\" || label === undefined) {\n                        this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                    }\n                }\n\n            }, {\n                /// <field type=\"String\" locid=\"WinJS.UI.MenuCommand.id\" helpKeyword=\"WinJS.UI.MenuCommand.id\" isAdvanced=\"true\">\n                /// Gets the  ID of the MenuCommand.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                id: {\n                    get: function () {\n                        return this._element.id;\n                    },\n                    set: function (value) {\n                        // we allow setting first time only. otherwise we ignore it.\n                        if (!this._element.id) {\n                            this._element.id = value;\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" readonly=\"true\" defaultValue=\"button\" oamOptionsDatatype=\"WinJS.UI.MenuCommand.type\" locid=\"WinJS.UI.MenuCommand.type\" helpKeyword=\"WinJS.UI.MenuCommand.type\" isAdvanced=\"true\">\n                /// Gets the type of the MenuCommand. Possible values are \"button\", \"toggle\", \"flyout\", or \"separator\".\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                type: {\n                    get: function () {\n                        return this._type;\n                    },\n                    set: function (value) {\n                        // we allow setting first time only. otherwise we ignore it.\n                        if (!this._type) {\n                            if (value !== _Constants.typeButton && value !== _Constants.typeFlyout && value !== _Constants.typeToggle && value !== _Constants.typeSeparator) {\n                                value = _Constants.typeButton;\n                            }\n\n                            this._type = value;\n\n                            if (value === _Constants.typeButton) {\n                                _ElementUtilities.addClass(this.element, _Constants.menuCommandButtonClass);\n                            } else if (value === _Constants.typeFlyout) {\n                                _ElementUtilities.addClass(this.element, _Constants.menuCommandFlyoutClass);\n                                this.element.addEventListener(\"keydown\", this._handleKeyDown.bind(this), false);\n                            } else if (value === _Constants.typeSeparator) {\n                                _ElementUtilities.addClass(this.element, _Constants.menuCommandSeparatorClass);\n                            } else if (value === _Constants.typeToggle) {\n                                _ElementUtilities.addClass(this.element, _Constants.menuCommandToggleClass);\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.MenuCommand.label\" helpKeyword=\"WinJS.UI.MenuCommand.label\">\n                /// The label of the MenuCommand\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                label: {\n                    get: function () {\n                        return this._label;\n                    },\n                    set: function (value) {\n                        this._label = value || \"\";\n                        if (this._labelSpan) {\n                            this._labelSpan.textContent = this.label;\n                        }\n\n                        // Update aria-label\n                        this._element.setAttribute(\"aria-label\", this.label);\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.MenuCommand.onclick\" helpKeyword=\"WinJS.UI.MenuCommand.onclick\">\n                /// Gets or sets the function to invoke when the command is clicked.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                onclick: {\n                    get: function () {\n                        return this._onclick;\n                    },\n                    set: function (value) {\n                        if (value && typeof value !== \"function\") {\n                            throw new _ErrorFromName(\"WinJS.UI.MenuCommand.BadClick\", _Resources._formatString(strings.badClick, \"MenuCommand\"));\n                        }\n                        this._onclick = value;\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.MenuCommand.flyout\" helpKeyword=\"WinJS.UI.MenuCommand.flyout\">\n                /// For flyout type MenuCommands, this property  returns the WinJS.UI.Flyout that this command invokes. When setting this property, you can set\n                /// it to the string ID of the Flyout, the DOM object that hosts the Flyout, or the Flyout object itself.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                flyout: {\n                    get: function () {\n                        // Resolve it to the flyout\n                        var flyout = this._flyout;\n                        if (typeof flyout === \"string\") {\n                            flyout = _Global.document.getElementById(flyout);\n                        }\n                        // If it doesn't have a .element, then we need to getControl on it\n                        if (flyout && !flyout.element) {\n                            flyout = flyout.winControl;\n                        }\n\n                        return flyout;\n                    },\n                    set: function (value) {\n\n                        // Need to update aria-owns with the new ID.\n                        var id = value;\n                        if (id && typeof id !== \"string\") {\n                            // Our controls have .element properties\n                            if (id.element) {\n                                id = id.element;\n                            }\n                            // Hope it's a DOM element, get ID from DOM element\n                            if (id) {\n                                if (id.id) {\n                                    id = id.id;\n                                } else {\n                                    // No id, have to fake one\n                                    id.id = _ElementUtilities._uniqueID(id);\n                                    id = id.id;\n                                }\n                            }\n                        }\n                        if (typeof id === \"string\") {\n                            this._element.setAttribute(\"aria-owns\", id);\n                        }\n\n                        if (this._flyout !== value) {\n                            MenuCommand._deactivateFlyoutCommand(this);\n                        }\n\n                        // Remember it\n                        this._flyout = value;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.MenuCommand.selected\" helpKeyword=\"WinJS.UI.MenuCommand.selected\">\n                /// Gets or sets the selected state of a toggle button. This property is true if the toggle button is selected; otherwise, it's false.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                selected: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return this._element.getAttribute(\"aria-checked\") === \"true\";\n                    },\n                    set: function (value) {\n                        this._element.setAttribute(\"aria-checked\", !!value);\n                    }\n                },\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.MenuCommand.element\" helpKeyword=\"WinJS.UI.MenuCommand.element\">\n                /// Gets the DOM element that hosts this MenuCommand.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.MenuCommand.disabled\" helpKeyword=\"WinJS.UI.MenuCommand.disabled\">\n                /// Gets or sets a value that indicates whether the MenuCommand is disabled. This value is true if the MenuCommand is disabled; otherwise, false.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                disabled: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return !!this._element.disabled;\n                    },\n                    set: function (value) {\n                        value = !!value;\n                        if (value && this.type === _Constants.typeFlyout) {\n                            MenuCommand._deactivateFlyoutCommand(this);\n                        }\n                        this._element.disabled = value;\n                    }\n                },\n\n                /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI.MenuCommand.hidden\" helpKeyword=\"WinJS.UI.MenuCommand.hidden\">\n                /// Determine if a command is currently hidden.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                hidden: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return this._element.style.visibility === \"hidden\";\n                    },\n                    set: function (value) {\n                        var menuControl = _Overlay._Overlay._getParentControlUsingClassName(this._element, _Constants.menuClass);\n                        if (menuControl && !menuControl.hidden) {\n                            throw new _ErrorFromName(\"WinJS.UI.MenuCommand.CannotChangeHiddenProperty\", _Resources._formatString(_Overlay._Overlay.commonstrings.cannotChangeHiddenProperty, \"Menu\"));\n                        }\n\n                        var style = this._element.style;\n                        if (value) {\n                            if (this.type === _Constants.typeFlyout) {\n                                MenuCommand._deactivateFlyoutCommand(this);\n                            }\n                            style.visibility = \"hidden\";\n                            style.display = \"none\";\n                        } else {\n                            style.visibility = \"\";\n                            style.display = \"block\";\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.MenuCommand.extraClass\" isAdvanced=\"true\" helpKeyword=\"WinJS.UI.MenuCommand.extraClass\">\n                /// Gets or sets the extra CSS class that is applied to the host DOM element.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                extraClass: {\n                    get: function () {\n                        return this._extraClass;\n                    },\n                    set: function (value) {\n                        if (this._extraClass) {\n                            _ElementUtilities.removeClass(this._element, this._extraClass);\n                        }\n                        this._extraClass = value;\n                        _ElementUtilities.addClass(this._element, this._extraClass);\n                    }\n                },\n\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.MenuCommand.dispose\">\n                    /// <summary locid=\"WinJS.UI.MenuCommand.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n                },\n\n                addEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI.MenuCommand.addEventListener\">\n                    /// <summary locid=\"WinJS.UI.MenuCommand.addEventListener\">\n                    /// Registers an event handler for the specified event.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.MenuCommand.addEventListener_p:type\">The name of the event to register.</param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI.MenuCommand.addEventListener_p:listener\">The function that handles the event.</param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI.MenuCommand.addEventListener_p:useCapture\">\n                    /// Set to true to register the event handler for the capturing phase; otherwise, set to false to register the  event handler for the bubbling phase.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    return this._element.addEventListener(type, listener, useCapture);\n                },\n\n                removeEventListener: function (type, listener, useCapture) {\n                    /// <signature helpKeyword=\"WinJS.UI.MenuCommand.removeEventListener\">\n                    /// <summary locid=\"WinJS.UI.MenuCommand.removeEventListener\">\n                    /// Removes the specified event handler that the addEventListener method registered.\n                    /// </summary>\n                    /// <param name=\"type\" type=\"String\" locid=\"WinJS.UI.MenuCommand.removeEventListener_p:type\">The name of the event to remove.</param>\n                    /// <param name=\"listener\" type=\"Function\" locid=\"WinJS.UI.MenuCommand.removeEventListener_p:listener\">The event handler function to remove.</param>\n                    /// <param name=\"useCapture\" type=\"Boolean\" locid=\"WinJS.UI.MenuCommand.removeEventListener_p:useCapture\">\n                    /// Set to true to remove the capturing phase event handler; set to false to remove the bubbling phase event handler.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    return this._element.removeEventListener(type, listener, useCapture);\n                },\n\n                // Private properties\n                _createSeparator: function MenuCommand_createSeparator() {\n                    // Make sure there's an input element\n                    if (!this._element) {\n                        this._element = _Global.document.createElement(\"hr\");\n                    } else {\n                        // Verify the input was an hr\n                        if (this._element.tagName !== \"HR\") {\n                            throw new _ErrorFromName(\"WinJS.UI.MenuCommand.BadHrElement\", strings.badHrElement);\n                        }\n                    }\n                },\n\n                _createButton: function MenuCommand_createButton() {\n                    // Make sure there's an element\n                    if (!this._element) {\n                        this._element = _Global.document.createElement(\"button\");\n                    } else {\n                        // Verify the input was a button\n                        if (this._element.tagName !== \"BUTTON\") {\n                            throw new _ErrorFromName(\"WinJS.UI.MenuCommand.BadButtonElement\", strings.badButtonElement);\n                        }\n                    }\n\n                    // Create our inner HTML. We will set aria values on the button itself further down in the constructor.\n                    this._element.innerHTML =\n                        '<div class=\"win-menucommand-liner\">' +\n                            '<span class=\"win-toggleicon\" aria-hidden=\"true\"></span>' +\n                            '<span class=\"win-label\" aria-hidden=\"true\"></span>' +\n                            '<span class=\"win-flyouticon\" aria-hidden=\"true\"></span>' +\n                        '</div>';\n                    this._element.type = \"button\";\n\n                    // The purpose of menuCommandLiner is to lay out the MenuCommand's children in a flexbox. Ideally, this flexbox would\n                    // be on MenuCommand.element. However, firefox lays out buttons with display:flex differently.\n                    // Firefox bug 1014285 (Button with display:inline-flex doesn't layout properly)\n                    // https://bugzilla.mozilla.org/show_bug.cgi?id=1014285\n                    this._menuCommandLiner = this._element.firstElementChild;\n                    this._toggleSpan = this._menuCommandLiner.firstElementChild;\n                    this._labelSpan = this._toggleSpan.nextElementSibling;\n                    this._flyoutSpan = this._labelSpan.nextElementSibling;\n\n                },\n                _sendEvent: function MenuCommand_sendEvent(eventName, detail) {\n                    if (!this._disposed) {\n                        var event = _Global.document.createEvent(\"CustomEvent\");\n                        event.initCustomEvent(eventName, true, true, (detail || {}));\n                        this._element.dispatchEvent(event);\n                    }\n                },\n\n                _invoke: function MenuCommand_invoke(event) {\n                    if (!this.hidden && !this.disabled && !this._disposed) {\n                        if (this._type === _Constants.typeToggle) {\n                            this.selected = !this.selected;\n                        } else if (this._type === _Constants.typeFlyout) {\n                            MenuCommand._activateFlyoutCommand(this);\n                        }\n\n                        if (event && event.type === \"click\" && this.onclick) {\n                            this.onclick(event);\n                        }\n\n                        // Bubble private 'invoked' event to Menu\n                        this._sendEvent(_Constants._menuCommandInvokedEvent, { command: this });\n                    }\n                },\n\n                _handleClick: function MenuCommand_handleClick(event) {\n                    this._invoke(event);\n                },\n\n                _handleKeyDown: function MenuCommand_handleKeyDown(event) {\n                    var Key = _ElementUtilities.Key,\n                        rtl = _Global.getComputedStyle(this.element).direction === \"rtl\",\n                        rightKey = rtl ? Key.leftArrow : Key.rightArrow;\n\n                    if (event.keyCode === rightKey && this.type === _Constants.typeFlyout) {\n                        this._invoke(event);\n\n                        // Prevent the page from scrolling\n                        event.preventDefault();\n                    }\n                },\n            }, {\n                // Statics\n                _activateFlyoutCommand: function MenuCommand_activateFlyoutCommand(menuCommand) {\n                    // Activates the associated Flyout command and returns a promise once complete.\n                    // A command is considered to be activated once the proper CSS class has been applied and its associated flyout has finished showing.\n                    return new Promise(function (c, e) {\n                        menuCommand = menuCommand.winControl || menuCommand;\n                        var subFlyout = menuCommand.flyout;\n                        // Flyout may not have processAll'd, so this may be a DOM object\n                        if (subFlyout && subFlyout.hidden && subFlyout.show) {\n                            _ElementUtilities.addClass(menuCommand.element, _Constants.menuCommandFlyoutActivatedClass);\n\n                            // Remove activation class from the command if the flyout is ever hidden.\n                            subFlyout.addEventListener(\"beforehide\", function beforeHide() {\n                                subFlyout.removeEventListener(\"beforehide\", beforeHide, false);\n                                _ElementUtilities.removeClass(menuCommand.element, _Constants.menuCommandFlyoutActivatedClass);\n                            }, false);\n\n                            subFlyout.addEventListener(\"aftershow\", function afterShow() {\n                                subFlyout.removeEventListener(\"aftershow\", afterShow, false);\n                                // We are considered activated once we start showing the flyout.\n                                c();\n                            }, false);\n\n                            subFlyout.show(menuCommand, \"_cascade\");\n                        } else {\n                            // Could not change command to activated state.\n                            e();\n                        }\n                    });\n                },\n\n                _deactivateFlyoutCommand: function MenuCommand_deactivateFlyoutCommand(menuCommand) {\n                    // Deactivates the associated Flyout command and returns a promise once complete.\n                    // A command is considered to be deactivated once the proper CSS class has been applied and its associated flyout has finished hiding.\n                    return new Promise(function (c) {\n                        menuCommand = menuCommand.winControl || menuCommand;\n                        _ElementUtilities.removeClass(menuCommand.element, _Constants.menuCommandFlyoutActivatedClass);\n\n                        var subFlyout = menuCommand.flyout;\n                        // Flyout may not have processAll'd, so this may be a DOM object\n                        if (subFlyout && !subFlyout.hidden && subFlyout.hide) {\n\n                            subFlyout.addEventListener(\"afterhide\", function afterHide() {\n                                subFlyout.removeEventListener(\"afterhide\", afterHide, false);\n                                c();\n                            }, false);\n\n                            subFlyout.hide();\n                        } else {\n                            // subFlyout does not need to be hidden.\n                            c();\n                        }\n                    });\n                },\n            });\n            return MenuCommand;\n        })\n    });\n\n});\n\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\nvar __extends = this.__extends || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    __.prototype = b.prototype;\n    d.prototype = new __();\n};\ndefine('WinJS/Controls/CommandingSurface/_MenuCommand',[\"require\", \"exports\", \"../Menu/_Command\"], function (require, exports, _MenuCommandBase) {\n    var _MenuCommand = (function (_super) {\n        __extends(_MenuCommand, _super);\n        function _MenuCommand(element, options) {\n            if (options && options.beforeInvoke) {\n                this._beforeInvoke = options.beforeInvoke;\n            }\n            _super.call(this, element, options);\n        }\n        _MenuCommand.prototype._invoke = function (event) {\n            this._beforeInvoke && this._beforeInvoke(event);\n            _super.prototype._invoke.call(this, event);\n        };\n        return _MenuCommand;\n    })(_MenuCommandBase.MenuCommand);\n    exports._MenuCommand = _MenuCommand;\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Utilities/_OpenCloseMachine',[\"require\", \"exports\", '../Core/_Global', '../Promise', '../_Signal'], function (require, exports, _Global, Promise, _Signal) {\n    \"use strict\";\n    // This module provides a state machine which is designed to be used by controls which need to\n    // open, close, and fire related events (e.g. beforeopen, afterclose). The state machine handles\n    // many edge cases. For example, what happens if:\n    //  - open is called when we're already opened?\n    //  - close is called while we're in the middle of opening?\n    //  - dispose is called while we're in the middle of firing beforeopen?\n    // The state machine takes care of all of these edge cases so that the control doesn't have to.\n    // The control is responible for knowing how to play its open/close animations and update its DOM.\n    // The state machine is responsible for ensuring that these things happen at the appropriate times.\n    // This module is broken up into 3 major pieces:\n    //   - OpenCloseMachine: Controls should instantiate one of these. The machine keeps track of the\n    //     current state and has methods for forwarding calls to the current state.\n    //   - IOpenCloseControl: Controls must provide an object which implements this interface. The\n    //     interface gives the machine hooks for invoking the control's open and close animations.\n    //   - States: The various states (e.g. Closed, Opened, Opening) that the machine can be in. Each\n    //     implements IOpenCloseState.\n    // Example usage:\n    //   class MyControl {\n    //       element: HTMLElement;\n    //       private _machine: OpenCloseMachine;\n    //\n    //       constructor(element?: HTMLElement, options: any = {}) {\n    //           this.element = element || document.createElement(\"div\");\n    //\n    //           // Create the machine.\n    //           this._machine = new OpenCloseMachine({\n    //               eventElement: this.element,\n    //               onOpen: (): Promise<any> => {\n    //                   // Do the work to render the contol in its opened state with an animation.\n    //                   // Return the animation promise.\n    //               },\n    //               onClose: (): Promise<any> => {\n    //                   // Do the work to render the contol in its closed state with an animation.\n    //                   // Return the animation promise.\n    //               },\n    //               onUpdateDom() {\n    //                   // Do the work to render the internal state of the control to the DOM. If a\n    //                   // control restricts all its DOM modifications to onUpdateDom, the state machine\n    //                   // can guarantee that the control won't modify its DOM while it is animating.\n    //               },\n    //               onUpdateDomWithIsOpened: (isOpened: boolean ) => {\n    //                   // Do the same work as onUpdateDom but ensure that the DOM is rendered with either\n    //                   // the opened or closed visual as dictacted by isOpened. The control should have some\n    //                   // internal state to track whether it is currently opened or closed. Treat this as a\n    //                   // cue to mutate that internal state to reflect the value of isOpened.\n    //               },\n    //           });\n    //\n    //           // Initialize the control. During this time, the machine will not ask the control to\n    //           // play any animations or update its DOM.\n    //           this.opened = true;\n    //           _Control.setOptions(this, options);\n    //\n    //           // Tell the machine the control is initialized. After this, the machine will start asking\n    //           // the control to play animations and update its DOM as appropriate.\n    //           this._machine.exitInit();\n    //       }\n    //\n    //       get opened() {\n    //           return this._machine.opened;\n    //       }\n    //       set opened(value: boolean) {\n    //           this._machine.opened = value;\n    //       }\n    //       open() {\n    //           this._machine.open();\n    //       }\n    //       close() {\n    //           this._machine.close();\n    //       }\n    //       forceLayout() {\n    //           this._machine.updateDom();\n    //       }\n    //       dispose() {\n    //           this._machine.dispose();\n    //       }\n    //   }\n    var EventNames = {\n        beforeOpen: \"beforeopen\",\n        afterOpen: \"afteropen\",\n        beforeClose: \"beforeclose\",\n        afterClose: \"afterclose\",\n        // Private events\n        // Indicates that the OpenCloseMachine has settled either into the Opened state\n        // or Closed state. This is more comprehensive than the \"afteropen\" and \"afterclose\"\n        // events because it fires even if the machine has reached the state due to:\n        //   - Exiting the Init state\n        //   - The beforeopen/beforeclose events being canceled\n        _openCloseStateSettled: \"_openCloseStateSettled\"\n    };\n    //\n    // OpenCloseMachine\n    //\n    var OpenCloseMachine = (function () {\n        //\n        // Methods called by the control\n        //\n        // When the machine is created, it sits in the Init state. When in the Init state, calls to\n        // updateDom will be postponed until the machine exits the Init state. Consequently, while in\n        // this state, the control can feel free to call updateDom as many times as it wants without\n        // worrying about it being expensive due to updating the DOM many times. The control should call\n        // *exitInit* to move the machine out of the Init state.\n        function OpenCloseMachine(args) {\n            this._control = args;\n            this._initializedSignal = new _Signal();\n            this._disposed = false;\n            this._setState(States.Init);\n        }\n        // Moves the machine out of the Init state and into the Opened or Closed state depending on whether\n        // open or close was called more recently.\n        OpenCloseMachine.prototype.exitInit = function () {\n            this._initializedSignal.complete();\n        };\n        // These method calls are forwarded to the current state.\n        OpenCloseMachine.prototype.updateDom = function () {\n            this._state.updateDom();\n        };\n        OpenCloseMachine.prototype.open = function () {\n            this._state.open();\n        };\n        OpenCloseMachine.prototype.close = function () {\n            this._state.close();\n        };\n        Object.defineProperty(OpenCloseMachine.prototype, \"opened\", {\n            get: function () {\n                return this._state.opened;\n            },\n            set: function (value) {\n                if (value) {\n                    this.open();\n                }\n                else {\n                    this.close();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        // Puts the machine into the Disposed state.\n        OpenCloseMachine.prototype.dispose = function () {\n            this._setState(States.Disposed);\n            this._disposed = true;\n            this._control = null;\n        };\n        //\n        // Methods called by states\n        //\n        OpenCloseMachine.prototype._setState = function (NewState, arg0) {\n            if (!this._disposed) {\n                this._state && this._state.exit();\n                this._state = new NewState();\n                this._state.machine = this;\n                this._state.enter(arg0);\n            }\n        };\n        // Triggers arbitrary app code\n        OpenCloseMachine.prototype._fireEvent = function (eventName, options) {\n            options = options || {};\n            var detail = options.detail || null;\n            var cancelable = !!options.cancelable;\n            var eventObject = _Global.document.createEvent(\"CustomEvent\");\n            eventObject.initCustomEvent(eventName, true, cancelable, detail);\n            return this._control.eventElement.dispatchEvent(eventObject);\n        };\n        // Triggers arbitrary app code\n        OpenCloseMachine.prototype._fireBeforeOpen = function () {\n            return this._fireEvent(EventNames.beforeOpen, {\n                cancelable: true\n            });\n        };\n        // Triggers arbitrary app code\n        OpenCloseMachine.prototype._fireBeforeClose = function () {\n            return this._fireEvent(EventNames.beforeClose, {\n                cancelable: true\n            });\n        };\n        return OpenCloseMachine;\n    })();\n    exports.OpenCloseMachine = OpenCloseMachine;\n    //\n    // States (each implements IOpenCloseState)\n    //\n    // WinJS animation promises always complete successfully. This\n    // helper allows an animation promise to complete in the canceled state\n    // so that the success handler can be skipped when the animation is\n    // interrupted.\n    function cancelablePromise(animationPromise) {\n        return Promise._cancelBlocker(animationPromise, function () {\n            animationPromise.cancel();\n        });\n    }\n    // Noop function, used in the various states to indicate that they don't support a given\n    // message. Named with the somewhat cute name '_' because it reads really well in the states.\n    function _() {\n    }\n    // Implementing the control as a state machine helps us correctly handle:\n    //   - re-entrancy while firing events\n    //   - calls into the control during asynchronous operations (e.g. animations)\n    //\n    // Many of the states do their \"enter\" work within a promise chain. The idea is that if\n    // the state is interrupted and exits, the rest of its work can be skipped by canceling\n    // the promise chain.\n    // An interesting detail is that anytime the state may trigger app code (e.g. due to\n    // firing an event), the current promise must end and a new promise must be chained off of it.\n    // This is necessary because the app code may interact with the control and cause it to\n    // change states. If we didn't create a new promise, then the very next line of code that runs\n    // after triggering app code may not be valid because the state may have exited. Starting a\n    // new promise after each triggering of app code prevents us from having to worry about this\n    // problem. In this configuration, when a promise's success handler runs, it guarantees that\n    // the state hasn't exited.\n    // For similar reasons, each of the promise chains created in \"enter\" starts off with a _Signal\n    // which is completed at the end of the \"enter\" function (this boilerplate is abstracted away by\n    // the \"interruptible\" function). The reason is that we don't want any of the code in \"enter\"\n    // to run until the promise chain has been stored in a variable. If we didn't do this (e.g. instead,\n    // started the promise chain with Promise.wrap()), then the \"enter\" code could trigger the \"exit\"\n    // function (via app code) before the promise chain had been stored in a variable. Under these\n    // circumstances, the promise chain would be uncancelable and so the \"enter\" work would be\n    // unskippable. This wouldn't be good when we needed the state to exit early.\n    // These two functions manage interruptible work promises (one creates them the other cancels\n    // them). They communicate with each other thru the _interruptibleWorkPromises property which\n    //  \"interruptible\" creates on your object.\n    function interruptible(object, workFn) {\n        object[\"_interruptibleWorkPromises\"] = object[\"_interruptibleWorkPromises\"] || [];\n        var workStoredSignal = new _Signal();\n        object[\"_interruptibleWorkPromises\"].push(workFn(workStoredSignal.promise));\n        workStoredSignal.complete();\n    }\n    function cancelInterruptibles() {\n        (this[\"_interruptibleWorkPromises\"] || []).forEach(function (workPromise) {\n            workPromise.cancel();\n        });\n    }\n    // Transitions:\n    //   When created, the state machine will take one of the following initialization\n    //   transitions depending on how the machines's APIs have been used by the time\n    //   exitInit() is called on it:\n    //     Init -> Closed\n    //     Init -> Opened\n    //   Following that, the life of the machine will be dominated by the following\n    //   sequences of transitions. In geneneral, these sequences are uninterruptible.\n    //     Closed -> BeforeOpen -> Closed (when preventDefault is called on beforeopen event)\n    //     Closed -> BeforeOpen -> Opening -> Opened\n    //     Opened -> BeforeClose -> Opened (when preventDefault is called on beforeclose event)\n    //     Opened -> BeforeClose -> Closing -> Closed\n    //   However, any state can be interrupted to go to the Disposed state:\n    //     * -> Disposed\n    var States;\n    (function (States) {\n        function updateDomImpl() {\n            this.machine._control.onUpdateDom();\n        }\n        // Initial state. Gives the control the opportunity to initialize itself without\n        // triggering any animations or DOM modifications. When done, the control should\n        // call *exitInit* to move the machine to the next state.\n        var Init = (function () {\n            function Init() {\n                this.name = \"Init\";\n                this.exit = cancelInterruptibles;\n                this.updateDom = _; // Postponed until immediately before we switch to another state\n            }\n            Init.prototype.enter = function () {\n                var _this = this;\n                interruptible(this, function (ready) {\n                    return ready.then(function () {\n                        return _this.machine._initializedSignal.promise;\n                    }).then(function () {\n                        _this.machine._control.onUpdateDomWithIsOpened(_this._opened);\n                        _this.machine._setState(_this._opened ? Opened : Closed);\n                    });\n                });\n            };\n            Object.defineProperty(Init.prototype, \"opened\", {\n                get: function () {\n                    return this._opened;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Init.prototype.open = function () {\n                this._opened = true;\n            };\n            Init.prototype.close = function () {\n                this._opened = false;\n            };\n            return Init;\n        })();\n        States.Init = Init;\n        // A rest state. The control is closed and is waiting for the app to call open.\n        var Closed = (function () {\n            function Closed() {\n                this.name = \"Closed\";\n                this.exit = _;\n                this.opened = false;\n                this.close = _;\n                this.updateDom = updateDomImpl;\n            }\n            Closed.prototype.enter = function (args) {\n                args = args || {};\n                if (args.openIsPending) {\n                    this.open();\n                }\n                this.machine._fireEvent(EventNames._openCloseStateSettled);\n            };\n            Closed.prototype.open = function () {\n                this.machine._setState(BeforeOpen);\n            };\n            return Closed;\n        })();\n        // An event state. The control fires the beforeopen event.\n        var BeforeOpen = (function () {\n            function BeforeOpen() {\n                this.name = \"BeforeOpen\";\n                this.exit = cancelInterruptibles;\n                this.opened = false;\n                this.open = _;\n                this.close = _;\n                this.updateDom = updateDomImpl;\n            }\n            BeforeOpen.prototype.enter = function () {\n                var _this = this;\n                interruptible(this, function (ready) {\n                    return ready.then(function () {\n                        return _this.machine._fireBeforeOpen(); // Give opportunity for chain to be canceled when triggering app code\n                    }).then(function (shouldOpen) {\n                        if (shouldOpen) {\n                            _this.machine._setState(Opening);\n                        }\n                        else {\n                            _this.machine._setState(Closed);\n                        }\n                    });\n                });\n            };\n            return BeforeOpen;\n        })();\n        // An animation/event state. The control plays its open animation and fires afteropen.\n        var Opening = (function () {\n            function Opening() {\n                this.name = \"Opening\";\n                this.exit = cancelInterruptibles;\n                this.updateDom = _; // Postponed until immediately before we switch to another state\n            }\n            Opening.prototype.enter = function () {\n                var _this = this;\n                interruptible(this, function (ready) {\n                    return ready.then(function () {\n                        _this._closeIsPending = false;\n                        return cancelablePromise(_this.machine._control.onOpen());\n                    }).then(function () {\n                        _this.machine._fireEvent(EventNames.afterOpen); // Give opportunity for chain to be canceled when triggering app code\n                    }).then(function () {\n                        _this.machine._control.onUpdateDom();\n                        _this.machine._setState(Opened, { closeIsPending: _this._closeIsPending });\n                    });\n                });\n            };\n            Object.defineProperty(Opening.prototype, \"opened\", {\n                get: function () {\n                    return !this._closeIsPending;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Opening.prototype.open = function () {\n                this._closeIsPending = false;\n            };\n            Opening.prototype.close = function () {\n                this._closeIsPending = true;\n            };\n            return Opening;\n        })();\n        // A rest state. The control is opened and is waiting for the app to call close.\n        var Opened = (function () {\n            function Opened() {\n                this.name = \"Opened\";\n                this.exit = _;\n                this.opened = true;\n                this.open = _;\n                this.updateDom = updateDomImpl;\n            }\n            Opened.prototype.enter = function (args) {\n                args = args || {};\n                if (args.closeIsPending) {\n                    this.close();\n                }\n                this.machine._fireEvent(EventNames._openCloseStateSettled);\n            };\n            Opened.prototype.close = function () {\n                this.machine._setState(BeforeClose);\n            };\n            return Opened;\n        })();\n        // An event state. The control fires the beforeclose event.\n        var BeforeClose = (function () {\n            function BeforeClose() {\n                this.name = \"BeforeClose\";\n                this.exit = cancelInterruptibles;\n                this.opened = true;\n                this.open = _;\n                this.close = _;\n                this.updateDom = updateDomImpl;\n            }\n            BeforeClose.prototype.enter = function () {\n                var _this = this;\n                interruptible(this, function (ready) {\n                    return ready.then(function () {\n                        return _this.machine._fireBeforeClose(); // Give opportunity for chain to be canceled when triggering app code\n                    }).then(function (shouldClose) {\n                        if (shouldClose) {\n                            _this.machine._setState(Closing);\n                        }\n                        else {\n                            _this.machine._setState(Opened);\n                        }\n                    });\n                });\n            };\n            return BeforeClose;\n        })();\n        // An animation/event state. The control plays the close animation and fires the afterclose event.\n        var Closing = (function () {\n            function Closing() {\n                this.name = \"Closing\";\n                this.exit = cancelInterruptibles;\n                this.updateDom = _; // Postponed until immediately before we switch to another state\n            }\n            Closing.prototype.enter = function () {\n                var _this = this;\n                interruptible(this, function (ready) {\n                    return ready.then(function () {\n                        _this._openIsPending = false;\n                        return cancelablePromise(_this.machine._control.onClose());\n                    }).then(function () {\n                        _this.machine._fireEvent(EventNames.afterClose); // Give opportunity for chain to be canceled when triggering app code\n                    }).then(function () {\n                        _this.machine._control.onUpdateDom();\n                        _this.machine._setState(Closed, { openIsPending: _this._openIsPending });\n                    });\n                });\n            };\n            Object.defineProperty(Closing.prototype, \"opened\", {\n                get: function () {\n                    return this._openIsPending;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Closing.prototype.open = function () {\n                this._openIsPending = true;\n            };\n            Closing.prototype.close = function () {\n                this._openIsPending = false;\n            };\n            return Closing;\n        })();\n        var Disposed = (function () {\n            function Disposed() {\n                this.name = \"Disposed\";\n                this.enter = _;\n                this.exit = _;\n                this.opened = false;\n                this.open = _;\n                this.close = _;\n                this.updateDom = _;\n            }\n            return Disposed;\n        })();\n        States.Disposed = Disposed;\n    })(States || (States = {}));\n});\n\n\ndefine('require-style!less/styles-commandingsurface',[],function(){});\n\ndefine('require-style!less/colors-commandingsurface',[],function(){});\ndefine('WinJS/Controls/CommandingSurface/_CommandingSurface',[\"require\", \"exports\", \"../../Animations\", \"../../Core/_Base\", \"../../Core/_BaseUtils\", \"../../BindingList\", \"../../ControlProcessor\", \"../CommandingSurface/_Constants\", \"../AppBar/_Command\", \"../CommandingSurface/_MenuCommand\", \"../../Utilities/_Control\", \"../../Utilities/_Dispose\", \"../../Utilities/_ElementUtilities\", \"../../Core/_ErrorFromName\", '../../Core/_Events', \"../../Controls/Flyout\", \"../../Core/_Global\", \"../../Utilities/_Hoverable\", \"../../Utilities/_KeyboardBehavior\", '../../Core/_Log', '../../Promise', \"../../Core/_Resources\", \"../../Scheduler\", '../../Utilities/_OpenCloseMachine', '../../_Signal', \"../../Core/_WriteProfilerMark\"], function (require, exports, Animations, _Base, _BaseUtils, BindingList, ControlProcessor, _Constants, _Command, _CommandingSurfaceMenuCommand, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Flyout, _Global, _Hoverable, _KeyboardBehavior, _Log, Promise, _Resources, Scheduler, _OpenCloseMachine, _Signal, _WriteProfilerMark) {\n    require([\"require-style!less/styles-commandingsurface\"]);\n    require([\"require-style!less/colors-commandingsurface\"]);\n    \"use strict\";\n    var strings = {\n        get overflowButtonAriaLabel() {\n            return _Resources._getWinJSString(\"ui/commandingSurfaceOverflowButtonAriaLabel\").value;\n        },\n        get badData() {\n            return \"Invalid argument: The data property must an instance of a WinJS.Binding.List\";\n        },\n        get mustContainCommands() {\n            return \"The commandingSurface can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls\";\n        },\n        get duplicateConstruction() {\n            return \"Invalid argument: Controls may only be instantiated one time for each DOM element\";\n        }\n    };\n    var CommandLayoutPipeline = {\n        newDataStage: 3,\n        measuringStage: 2,\n        layoutStage: 1,\n        idle: 0,\n    };\n    var OverflowDirection = {\n        /// The _CommandingSurface expands towards the bottom of the screen when opened and the overflow area renders below the actionarea.\n        bottom: \"bottom\",\n        /// The _CommandingSurface expands towards the top of the screen when opened and the overflow area renders above the actionarea.\n        top: \"top\",\n    };\n    var overflowDirectionClassMap = {};\n    overflowDirectionClassMap[OverflowDirection.top] = _Constants.ClassNames.overflowTopClass;\n    overflowDirectionClassMap[OverflowDirection.bottom] = _Constants.ClassNames.overflowBottomClass;\n    var ClosedDisplayMode = {\n        /// When the _CommandingSurface is closed, the actionarea is not visible and doesn't take up any space.\n        none: \"none\",\n        /// When the _CommandingSurface is closed, the height of the actionarea is reduced to the minimal height required to display only the actionarea overflowbutton. All other content in the actionarea is not displayed.\n        minimal: \"minimal\",\n        /// When the _CommandingSurface is closed, the height of the actionarea is reduced such that button commands are still visible, but their labels are hidden.\n        compact: \"compact\",\n        /// When the _CommandingSurface is closed, the height of the actionarea is always sized to content and does not change between opened and closed states.\n        full: \"full\",\n    };\n    var closedDisplayModeClassMap = {};\n    closedDisplayModeClassMap[ClosedDisplayMode.none] = _Constants.ClassNames.noneClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.minimal] = _Constants.ClassNames.minimalClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.compact] = _Constants.ClassNames.compactClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.full] = _Constants.ClassNames.fullClass;\n    // Versions of add/removeClass that are no ops when called with falsy class names.\n    function addClass(element, className) {\n        className && _ElementUtilities.addClass(element, className);\n    }\n    function removeClass(element, className) {\n        className && _ElementUtilities.removeClass(element, className);\n    }\n    function diffElements(lhs, rhs) {\n        // Subtract array rhs from array lhs.\n        // Returns a new Array containing the subset of elements in lhs that are not also in rhs.\n        return lhs.filter(function (commandElement) {\n            return rhs.indexOf(commandElement) < 0;\n        });\n    }\n    /// Represents an apaptive surface for displaying commands.\n    var _CommandingSurface = (function () {\n        function _CommandingSurface(element, options) {\n            /// Creates a new CommandingSurface control.\n            /// @param element: The DOM element that will host the control.\n            /// @param options: The set of properties and values to apply to the new CommandingSurface control.\n            /// @return: The new CommandingSurface control.\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            this._hoverable = _Hoverable.isHoverable; /* force dependency on hoverable module */\n            this._dataChangedEvents = [\"itemchanged\", \"iteminserted\", \"itemmoved\", \"itemremoved\", \"reload\"];\n            // State private to _updateDomImpl_renderDisplayMode. No other method should make use of it.\n            //\n            // Nothing has been rendered yet so these are all initialized to undefined. Because\n            // they are undefined, the first time _updateDomImpl is called, they will all be\n            // rendered.\n            this._updateDomImpl_renderedState = {\n                closedDisplayMode: undefined,\n                isOpenedMode: undefined,\n                overflowDirection: undefined,\n                overflowAlignmentOffset: undefined,\n            };\n            this._writeProfilerMark(\"constructor,StartTM\");\n            // Check to make sure we weren't duplicated\n            if (element && element[\"winControl\"]) {\n                throw new _ErrorFromName(\"WinJS.UI._CommandingSurface.DuplicateConstruction\", strings.duplicateConstruction);\n            }\n            this._initializeDom(element || _Global.document.createElement(\"div\"));\n            this._machine = options.openCloseMachine || new _OpenCloseMachine.OpenCloseMachine({\n                eventElement: this._dom.root,\n                onOpen: function () {\n                    _this.synchronousOpen();\n                    return Promise.wrap();\n                },\n                onClose: function () {\n                    _this.synchronousClose();\n                    return Promise.wrap();\n                },\n                onUpdateDom: function () {\n                    _this.updateDomImpl();\n                },\n                onUpdateDomWithIsOpened: function (isOpened) {\n                    if (isOpened) {\n                        _this.synchronousOpen();\n                    }\n                    else {\n                        _this.synchronousClose();\n                    }\n                }\n            });\n            // Initialize private state.\n            this._disposed = false;\n            this._primaryCommands = [];\n            this._secondaryCommands = [];\n            this._refreshBound = this._refresh.bind(this);\n            this._resizeHandlerBound = this._resizeHandler.bind(this);\n            this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._dom.root);\n            this._refreshPending = false;\n            this._rtl = false;\n            this._initializedSignal = new _Signal();\n            this._nextLayoutStage = CommandLayoutPipeline.idle;\n            this._isOpenedMode = _Constants.defaultOpened;\n            this._menuCommandProjections = [];\n            // Initialize public properties.\n            this.overflowDirection = _Constants.defaultOverflowDirection;\n            this.closedDisplayMode = _Constants.defaultClosedDisplayMode;\n            this.opened = this._isOpenedMode;\n            if (!options.data) {\n                // Shallow copy object so we can modify it.\n                options = _BaseUtils._shallowCopy(options);\n                // Set default data\n                options.data = options.data || this._getDataFromDOMElements();\n            }\n            _Control.setOptions(this, options);\n            // Event handlers\n            _ElementUtilities._resizeNotifier.subscribe(this._dom.root, this._resizeHandlerBound);\n            this._dom.root.addEventListener('keydown', this._keyDownHandler.bind(this));\n            // Exit the Init state.\n            _ElementUtilities._inDom(this._dom.root).then(function () {\n                _this._rtl = _Global.getComputedStyle(_this._dom.root).direction === 'rtl';\n                if (!options.openCloseMachine) {\n                    // We should only call exitInit on the machine when we own the machine.\n                    _this._machine.exitInit();\n                }\n                _this._initializedSignal.complete();\n                _this._writeProfilerMark(\"constructor,StopTM\");\n            });\n        }\n        Object.defineProperty(_CommandingSurface.prototype, \"element\", {\n            /// Gets the DOM element that hosts the CommandingSurface.\n            get: function () {\n                return this._dom.root;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(_CommandingSurface.prototype, \"data\", {\n            /// Gets or sets the Binding List of WinJS.UI.Command for the CommandingSurface.\n            get: function () {\n                return this._data;\n            },\n            set: function (value) {\n                this._writeProfilerMark(\"set_data,info\");\n                if (value !== this.data) {\n                    if (!(value instanceof BindingList.List)) {\n                        throw new _ErrorFromName(\"WinJS.UI._CommandingSurface.BadData\", strings.badData);\n                    }\n                    if (this._data) {\n                        this._removeDataListeners();\n                    }\n                    this._data = value;\n                    this._addDataListeners();\n                    this._dataUpdated();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(_CommandingSurface.prototype, \"closedDisplayMode\", {\n            /// Gets or sets the closedDisplayMode for the CommandingSurface. Values are \"none\", \"minimal\", \"compact\", and \"full\".\n            get: function () {\n                return this._closedDisplayMode;\n            },\n            set: function (value) {\n                this._writeProfilerMark(\"set_closedDisplayMode,info\");\n                var isChangingState = (value !== this._closedDisplayMode);\n                if (ClosedDisplayMode[value] && isChangingState) {\n                    this._closedDisplayMode = value;\n                    this._machine.updateDom();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(_CommandingSurface.prototype, \"overflowDirection\", {\n            /// Gets or sets which direction the commandingSurface overflows when opened. Values are \"top\" and \"bottom\" for.\n            get: function () {\n                return this._overflowDirection;\n            },\n            set: function (value) {\n                var isChangingState = (value !== this._overflowDirection);\n                if (OverflowDirection[value] && isChangingState) {\n                    this._overflowDirection = value;\n                    this._machine.updateDom();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(_CommandingSurface.prototype, \"opened\", {\n            /// Gets or sets whether the _CommandingSurface is currently opened.\n            get: function () {\n                return this._machine.opened;\n            },\n            set: function (value) {\n                this._machine.opened = value;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        _CommandingSurface.prototype.open = function () {\n            /// Opens the _CommandingSurface's actionarea and overflowarea\n            this._machine.open();\n        };\n        _CommandingSurface.prototype.close = function () {\n            /// Closes the _CommandingSurface's actionarea and overflowarea\n            this._machine.close();\n        };\n        _CommandingSurface.prototype.dispose = function () {\n            /// Disposes this CommandingSurface.\n            if (this._disposed) {\n                return;\n            }\n            this._disposed = true;\n            this._machine.dispose();\n            _ElementUtilities._resizeNotifier.unsubscribe(this._dom.root, this._resizeHandlerBound);\n            if (this._contentFlyout) {\n                this._contentFlyout.dispose();\n                this._contentFlyout.element.parentNode.removeChild(this._contentFlyout.element);\n            }\n            _Dispose.disposeSubTree(this._dom.root);\n        };\n        _CommandingSurface.prototype.forceLayout = function () {\n            /// Forces the CommandingSurface to update its layout. Use this function when the window did not change \n            /// size, but the container of the CommandingSurface changed size.\n            this._meaurementsDirty();\n            this._machine.updateDom();\n        };\n        _CommandingSurface.prototype.getBoundingRects = function () {\n            return {\n                commandingSurface: this._dom.root.getBoundingClientRect(),\n                overflowArea: this._dom.overflowArea.getBoundingClientRect(),\n            };\n        };\n        _CommandingSurface.prototype.getCommandById = function (id) {\n            if (this._data) {\n                for (var i = 0, len = this._data.length; i < len; i++) {\n                    var command = this._data.getAt(i);\n                    if (command.id === id) {\n                        return command;\n                    }\n                }\n            }\n            return null;\n        };\n        _CommandingSurface.prototype.showOnlyCommands = function (commands) {\n            if (this._data) {\n                for (var i = 0, len = this._data.length; i < len; i++) {\n                    this._data.getAt(i).hidden = true;\n                }\n                for (var i = 0, len = commands.length; i < len; i++) {\n                    // The array passed to showOnlyCommands can contain either command ids, or the commands themselves.\n                    var command = (typeof commands[i] === \"string\" ? this.getCommandById(commands[i]) : commands[i]);\n                    if (command) {\n                        command.hidden = false;\n                    }\n                }\n            }\n        };\n        _CommandingSurface.prototype.deferredDomUpate = function () {\n            // Notify the machine that an update has been requested.\n            this._machine.updateDom();\n        };\n        _CommandingSurface.prototype.createOpenAnimation = function (closedHeight) {\n            // createOpenAnimation should only be called when the commanding surface is in a closed state. The control using the commanding surface is expected\n            // to call createOpenAnimation() before it opens the surface, then open the commanding surface, then call .execute() to start the animation.\n            // This function is overridden by our unit tests.\n            if (_Log.log) {\n                this._updateDomImpl_renderedState.isOpenedMode && _Log.log(\"The CommandingSurface should only attempt to create an open animation when it's not already opened\");\n            }\n            var that = this;\n            return {\n                execute: function () {\n                    var boundingRects = that.getBoundingRects();\n                    // The overflowAreaContainer has no size by default. Measure the overflowArea's size and apply it to the overflowAreaContainer before animating\n                    that._dom.overflowAreaContainer.style.width = boundingRects.overflowArea.width + \"px\";\n                    that._dom.overflowAreaContainer.style.height = boundingRects.overflowArea.height + \"px\";\n                    return Animations._commandingSurfaceOpenAnimation({\n                        actionAreaClipper: that._dom.actionAreaContainer,\n                        actionArea: that._dom.actionArea,\n                        overflowAreaClipper: that._dom.overflowAreaContainer,\n                        overflowArea: that._dom.overflowArea,\n                        oldHeight: closedHeight,\n                        newHeight: boundingRects.commandingSurface.height,\n                        overflowAreaHeight: boundingRects.overflowArea.height,\n                        menuPositionedAbove: (that.overflowDirection === OverflowDirection.top),\n                    }).then(function () {\n                        that._clearAnimation();\n                    });\n                }\n            };\n        };\n        _CommandingSurface.prototype.createCloseAnimation = function (closedHeight) {\n            // createCloseAnimation should only be called when the commanding surface is in an opened state. The control using the commanding surface is expected\n            // to call createCloseAnimation() before it closes the surface, then call execute() to let the animation run. Once the animation finishes, the control\n            // should close the commanding surface.\n            // This function is overridden by our unit tests.\n            if (_Log.log) {\n                !this._updateDomImpl_renderedState.isOpenedMode && _Log.log(\"The CommandingSurface should only attempt to create an closed animation when it's not already closed\");\n            }\n            var openedHeight = this.getBoundingRects().commandingSurface.height, overflowAreaOpenedHeight = this._dom.overflowArea.offsetHeight, oldOverflowTop = this._dom.overflowArea.offsetTop, that = this;\n            return {\n                execute: function () {\n                    _ElementUtilities.addClass(that.element, _Constants.ClassNames.closingClass);\n                    return Animations._commandingSurfaceCloseAnimation({\n                        actionAreaClipper: that._dom.actionAreaContainer,\n                        actionArea: that._dom.actionArea,\n                        overflowAreaClipper: that._dom.overflowAreaContainer,\n                        overflowArea: that._dom.overflowArea,\n                        oldHeight: openedHeight,\n                        newHeight: closedHeight,\n                        overflowAreaHeight: overflowAreaOpenedHeight,\n                        menuPositionedAbove: (that.overflowDirection === OverflowDirection.top),\n                    }).then(function () {\n                        _ElementUtilities.removeClass(that.element, _Constants.ClassNames.closingClass);\n                        that._clearAnimation();\n                    });\n                }\n            };\n        };\n        Object.defineProperty(_CommandingSurface.prototype, \"initialized\", {\n            get: function () {\n                return this._initializedSignal.promise;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        _CommandingSurface.prototype._writeProfilerMark = function (text) {\n            _WriteProfilerMark(\"WinJS.UI._CommandingSurface:\" + this._id + \":\" + text);\n        };\n        _CommandingSurface.prototype._initializeDom = function (root) {\n            var _this = this;\n            this._writeProfilerMark(\"_intializeDom,info\");\n            // Attaching JS control to DOM element\n            root[\"winControl\"] = this;\n            this._id = root.id || _ElementUtilities._uniqueID(root);\n            if (!root.hasAttribute(\"tabIndex\")) {\n                root.tabIndex = -1;\n            }\n            _ElementUtilities.addClass(root, _Constants.ClassNames.controlCssClass);\n            _ElementUtilities.addClass(root, _Constants.ClassNames.disposableCssClass);\n            var actionArea = _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(actionArea, _Constants.ClassNames.actionAreaCssClass);\n            _ElementUtilities._reparentChildren(root, actionArea);\n            var actionAreaContainer = _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(actionAreaContainer, _Constants.ClassNames.actionAreaContainerCssClass);\n            actionAreaContainer.appendChild(actionArea);\n            root.appendChild(actionAreaContainer);\n            var spacer = _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(spacer, _Constants.ClassNames.spacerCssClass);\n            actionArea.appendChild(spacer);\n            var overflowButton = _Global.document.createElement(\"button\");\n            overflowButton.tabIndex = 0;\n            overflowButton.innerHTML = \"<span class='\" + _Constants.ClassNames.ellipsisCssClass + \"'></span>\";\n            _ElementUtilities.addClass(overflowButton, _Constants.ClassNames.overflowButtonCssClass);\n            actionArea.appendChild(overflowButton);\n            overflowButton.addEventListener(\"click\", function () {\n                _this.opened = !_this.opened;\n            });\n            var overflowArea = _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(overflowArea, _Constants.ClassNames.overflowAreaCssClass);\n            _ElementUtilities.addClass(overflowArea, _Constants.ClassNames.menuCssClass);\n            var overflowAreaContainer = _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(overflowAreaContainer, _Constants.ClassNames.overflowAreaContainerCssClass);\n            overflowAreaContainer.appendChild(overflowArea);\n            root.appendChild(overflowAreaContainer);\n            this._dom = {\n                root: root,\n                actionArea: actionArea,\n                actionAreaContainer: actionAreaContainer,\n                spacer: spacer,\n                overflowButton: overflowButton,\n                overflowArea: overflowArea,\n                overflowAreaContainer: overflowAreaContainer\n            };\n        };\n        _CommandingSurface.prototype._getFocusableElementsInfo = function () {\n            var _this = this;\n            var focusableCommandsInfo = {\n                elements: [],\n                focusedIndex: -1\n            };\n            var elementsInReach = Array.prototype.slice.call(this._dom.actionArea.children);\n            var elementsInReach = Array.prototype.slice.call(this._dom.actionArea.children);\n            if (this._dom.overflowArea.style.display !== \"none\") {\n                elementsInReach = elementsInReach.concat(Array.prototype.slice.call(this._dom.overflowArea.children));\n            }\n            elementsInReach.forEach(function (element) {\n                if (_this._isElementFocusable(element)) {\n                    focusableCommandsInfo.elements.push(element);\n                    if (element.contains(_Global.document.activeElement)) {\n                        focusableCommandsInfo.focusedIndex = focusableCommandsInfo.elements.length - 1;\n                    }\n                }\n            });\n            return focusableCommandsInfo;\n        };\n        _CommandingSurface.prototype._dataUpdated = function () {\n            var _this = this;\n            this._primaryCommands = [];\n            this._secondaryCommands = [];\n            if (this.data.length > 0) {\n                this.data.forEach(function (command) {\n                    if (command.section === \"secondary\") {\n                        _this._secondaryCommands.push(command);\n                    }\n                    else {\n                        _this._primaryCommands.push(command);\n                    }\n                });\n            }\n            this._dataDirty();\n            this._machine.updateDom();\n        };\n        _CommandingSurface.prototype._refresh = function () {\n            var _this = this;\n            if (!this._refreshPending) {\n                this._refreshPending = true;\n                // Batch calls to _dataUpdated\n                Scheduler.schedule(function () {\n                    if (_this._refreshPending && !_this._disposed) {\n                        _this._refreshPending = false;\n                        _this._dataUpdated();\n                    }\n                }, Scheduler.Priority.high, null, \"WinJS.UI._CommandingSurface._refresh\");\n            }\n        };\n        _CommandingSurface.prototype._addDataListeners = function () {\n            var _this = this;\n            this._dataChangedEvents.forEach(function (eventName) {\n                _this._data.addEventListener(eventName, _this._refreshBound, false);\n            });\n        };\n        _CommandingSurface.prototype._removeDataListeners = function () {\n            var _this = this;\n            this._dataChangedEvents.forEach(function (eventName) {\n                _this._data.removeEventListener(eventName, _this._refreshBound, false);\n            });\n        };\n        _CommandingSurface.prototype._isElementFocusable = function (element) {\n            var focusable = false;\n            if (element) {\n                var command = element[\"winControl\"];\n                if (command) {\n                    focusable = command.element.style.display !== \"none\" && command.type !== _Constants.typeSeparator && !command.hidden && !command.disabled && (!command.firstElementFocus || command.firstElementFocus.tabIndex >= 0 || command.lastElementFocus.tabIndex >= 0);\n                }\n                else {\n                    // e.g. the overflow button\n                    focusable = element.style.display !== \"none\" && getComputedStyle(element).visibility !== \"hidden\" && element.tabIndex >= 0;\n                }\n            }\n            return focusable;\n        };\n        _CommandingSurface.prototype._isCommandInActionArea = function (element) {\n            // Returns true if the element is a command in the actionarea, false otherwise\n            return element && element[\"winControl\"] && element.parentElement === this._dom.actionArea;\n        };\n        _CommandingSurface.prototype._getLastElementFocus = function (element) {\n            if (this._isCommandInActionArea(element)) {\n                // Only commands in the actionarea support lastElementFocus\n                return element[\"winControl\"].lastElementFocus;\n            }\n            else {\n                return element;\n            }\n        };\n        _CommandingSurface.prototype._getFirstElementFocus = function (element) {\n            if (this._isCommandInActionArea(element)) {\n                // Only commands in the actionarea support firstElementFocus\n                return element[\"winControl\"].firstElementFocus;\n            }\n            else {\n                return element;\n            }\n        };\n        _CommandingSurface.prototype._keyDownHandler = function (ev) {\n            if (!ev.altKey) {\n                if (_ElementUtilities._matchesSelector(ev.target, \".win-interactive, .win-interactive *\")) {\n                    return;\n                }\n                var Key = _ElementUtilities.Key;\n                var focusableElementsInfo = this._getFocusableElementsInfo();\n                var targetCommand;\n                if (focusableElementsInfo.elements.length) {\n                    switch (ev.keyCode) {\n                        case (this._rtl ? Key.rightArrow : Key.leftArrow):\n                        case Key.upArrow:\n                            var index = Math.max(0, focusableElementsInfo.focusedIndex - 1);\n                            targetCommand = this._getLastElementFocus(focusableElementsInfo.elements[index % focusableElementsInfo.elements.length]);\n                            break;\n                        case (this._rtl ? Key.leftArrow : Key.rightArrow):\n                        case Key.downArrow:\n                            var index = Math.min(focusableElementsInfo.focusedIndex + 1, focusableElementsInfo.elements.length - 1);\n                            targetCommand = this._getFirstElementFocus(focusableElementsInfo.elements[index]);\n                            break;\n                        case Key.home:\n                            var index = 0;\n                            targetCommand = this._getFirstElementFocus(focusableElementsInfo.elements[index]);\n                            break;\n                        case Key.end:\n                            var index = focusableElementsInfo.elements.length - 1;\n                            targetCommand = this._getLastElementFocus(focusableElementsInfo.elements[index]);\n                            break;\n                    }\n                }\n                if (targetCommand && targetCommand !== _Global.document.activeElement) {\n                    targetCommand.focus();\n                    ev.preventDefault();\n                }\n            }\n        };\n        _CommandingSurface.prototype._getDataFromDOMElements = function () {\n            this._writeProfilerMark(\"_getDataFromDOMElements,info\");\n            ControlProcessor.processAll(this._dom.actionArea, true);\n            var commands = [];\n            var childrenLength = this._dom.actionArea.children.length;\n            var child;\n            for (var i = 0; i < childrenLength; i++) {\n                child = this._dom.actionArea.children[i];\n                if (child[\"winControl\"] && child[\"winControl\"] instanceof _Command.AppBarCommand) {\n                    commands.push(child[\"winControl\"]);\n                }\n                else if (child !== this._dom.overflowButton && child !== this._dom.spacer) {\n                    throw new _ErrorFromName(\"WinJS.UI._CommandingSurface.MustContainCommands\", strings.mustContainCommands);\n                }\n            }\n            return new BindingList.List(commands);\n        };\n        _CommandingSurface.prototype._resizeHandler = function () {\n            if (this._dom.root.offsetWidth) {\n                var currentActionAreaWidth = _ElementUtilities._getPreciseContentWidth(this._dom.actionArea);\n                if (this._cachedMeasurements && this._cachedMeasurements.actionAreaContentBoxWidth !== currentActionAreaWidth) {\n                    this._cachedMeasurements.actionAreaContentBoxWidth = currentActionAreaWidth;\n                    this._layoutDirty();\n                    this._machine.updateDom();\n                }\n            }\n        };\n        _CommandingSurface.prototype._dataDirty = function () {\n            this._nextLayoutStage = Math.max(CommandLayoutPipeline.newDataStage, this._nextLayoutStage);\n        };\n        _CommandingSurface.prototype._meaurementsDirty = function () {\n            this._nextLayoutStage = Math.max(CommandLayoutPipeline.measuringStage, this._nextLayoutStage);\n        };\n        _CommandingSurface.prototype._layoutDirty = function () {\n            this._nextLayoutStage = Math.max(CommandLayoutPipeline.layoutStage, this._nextLayoutStage);\n        };\n        _CommandingSurface.prototype.synchronousOpen = function () {\n            this._overflowAlignmentOffset = 0;\n            this._isOpenedMode = true;\n            this.updateDomImpl();\n            this._overflowAlignmentOffset = this._computeAdjustedOverflowAreaOffset();\n            this.updateDomImpl();\n        };\n        _CommandingSurface.prototype._computeAdjustedOverflowAreaOffset = function () {\n            // Returns any negative offset needed to prevent the shown overflowarea from clipping outside of the viewport.\n            // This function should only be called when CommandingSurface has been rendered in the opened state with\n            // an overflowAlignmentOffset of 0.\n            if (_Log.log) {\n                !this._updateDomImpl_renderedState.isOpenedMode && _Log.log(\"The CommandingSurface should only attempt to compute adjusted overflowArea offset \" + \" when it has been rendered opened\");\n                this._updateDomImpl_renderedState.overflowAlignmentOffset !== 0 && _Log.log(\"The CommandingSurface should only attempt to compute adjusted overflowArea offset \" + \" when it has been rendered with an overflowAlignementOffset of 0\");\n            }\n            var overflowArea = this._dom.overflowArea, boundingClientRects = this.getBoundingRects(), adjustedOffset = 0;\n            if (this._rtl) {\n                // In RTL the left edge of overflowarea prefers to align to the LEFT edge of the commandingSurface. \n                // Make sure we avoid clipping through the RIGHT edge of the viewport\n                var viewportRight = window.innerWidth, rightOffsetFromViewport = boundingClientRects.overflowArea.right;\n                adjustedOffset = Math.min(viewportRight - rightOffsetFromViewport, 0);\n            }\n            else {\n                // In LTR the right edge of overflowarea prefers to align to the RIGHT edge of the commandingSurface.\n                // Make sure we avoid clipping through the LEFT edge of the viewport.\n                var leftOffsetFromViewport = boundingClientRects.overflowArea.left;\n                adjustedOffset = Math.min(0, leftOffsetFromViewport);\n            }\n            return adjustedOffset;\n        };\n        _CommandingSurface.prototype.synchronousClose = function () {\n            this._isOpenedMode = false;\n            this.updateDomImpl();\n        };\n        _CommandingSurface.prototype.updateDomImpl = function () {\n            this._updateDomImpl_renderDisplayMode();\n            this._updateDomImpl_updateCommands();\n        };\n        _CommandingSurface.prototype._updateDomImpl_renderDisplayMode = function () {\n            var rendered = this._updateDomImpl_renderedState;\n            if (rendered.isOpenedMode !== this._isOpenedMode) {\n                if (this._isOpenedMode) {\n                    // Render opened\n                    removeClass(this._dom.root, _Constants.ClassNames.closedClass);\n                    addClass(this._dom.root, _Constants.ClassNames.openedClass);\n                }\n                else {\n                    // Render closed\n                    removeClass(this._dom.root, _Constants.ClassNames.openedClass);\n                    addClass(this._dom.root, _Constants.ClassNames.closedClass);\n                }\n                rendered.isOpenedMode = this._isOpenedMode;\n            }\n            if (rendered.closedDisplayMode !== this.closedDisplayMode) {\n                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);\n                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);\n                rendered.closedDisplayMode = this.closedDisplayMode;\n            }\n            if (rendered.overflowDirection !== this.overflowDirection) {\n                removeClass(this._dom.root, overflowDirectionClassMap[rendered.overflowDirection]);\n                addClass(this._dom.root, overflowDirectionClassMap[this.overflowDirection]);\n                rendered.overflowDirection = this.overflowDirection;\n            }\n            if (this._overflowAlignmentOffset !== rendered.overflowAlignmentOffset) {\n                var offsetProperty = (this._rtl ? \"left\" : \"right\");\n                var offsetTextValue = this._overflowAlignmentOffset + \"px\";\n                this._dom.overflowAreaContainer.style[offsetProperty] = offsetTextValue;\n            }\n        };\n        _CommandingSurface.prototype._updateDomImpl_updateCommands = function () {\n            this._writeProfilerMark(\"_updateDomImpl_updateCommands,info\");\n            var nextStage = this._nextLayoutStage;\n            while (nextStage !== CommandLayoutPipeline.idle) {\n                var currentStage = nextStage;\n                var okToProceed = false;\n                switch (currentStage) {\n                    case CommandLayoutPipeline.newDataStage:\n                        nextStage = CommandLayoutPipeline.measuringStage;\n                        okToProceed = this._processNewData();\n                        break;\n                    case CommandLayoutPipeline.measuringStage:\n                        nextStage = CommandLayoutPipeline.layoutStage;\n                        okToProceed = this._measure();\n                        break;\n                    case CommandLayoutPipeline.layoutStage:\n                        nextStage = CommandLayoutPipeline.idle;\n                        okToProceed = this._layoutCommands();\n                        break;\n                }\n                if (!okToProceed) {\n                    // If a stage fails, exit the loop and track that stage\n                    // to be restarted the next time _updateCommands is run.\n                    nextStage = currentStage;\n                    break;\n                }\n            }\n            this._nextLayoutStage = nextStage;\n            if (nextStage === CommandLayoutPipeline.idle) {\n                // Callback for unit tests.\n                this._layoutCompleteCallback && this._layoutCompleteCallback();\n            }\n        };\n        _CommandingSurface.prototype._getDataChangeInfo = function () {\n            var i = 0, len = 0;\n            var added = [];\n            var deleted = [];\n            var affected = [];\n            var currentShown = [];\n            var currentElements = [];\n            var newShown = [];\n            var newHidden = [];\n            var newElements = [];\n            Array.prototype.forEach.call(this._dom.actionArea.querySelectorAll(_Constants.commandSelector), function (commandElement) {\n                if (commandElement.style.display !== \"none\") {\n                    currentShown.push(commandElement);\n                }\n                currentElements.push(commandElement);\n            });\n            this.data.forEach(function (command) {\n                if (command.element.style.display !== \"none\") {\n                    newShown.push(command.element);\n                }\n                else {\n                    newHidden.push(command.element);\n                }\n                newElements.push(command.element);\n            });\n            deleted = diffElements(currentShown, newShown);\n            affected = diffElements(currentShown, deleted);\n            // \"added\" must also include the elements from \"newHidden\" to ensure that we continue\n            // to animate any command elements that have underflowed back into the actionarea\n            // as a part of this data change.\n            added = diffElements(newShown, currentShown).concat(newHidden);\n            return {\n                newElements: newElements,\n                currentElements: currentElements,\n                added: added,\n                deleted: deleted,\n                affected: affected,\n            };\n        };\n        _CommandingSurface.prototype._processNewData = function () {\n            var _this = this;\n            this._writeProfilerMark(\"_processNewData,info\");\n            var changeInfo = this._getDataChangeInfo();\n            // Take a snapshot of the current state\n            var updateCommandAnimation = Animations._createUpdateListAnimation(changeInfo.added, changeInfo.deleted, changeInfo.affected);\n            // Unbind property mutation event listener from deleted IObservableCommands\n            changeInfo.deleted.forEach(function (deletedElement) {\n                var command = (deletedElement['winControl']);\n                if (command && command['_propertyMutations']) {\n                    command._propertyMutations.unbind(_this._refreshBound);\n                }\n            });\n            // Bind property mutation event listener to added IObservable commands.\n            changeInfo.added.forEach(function (deletedElement) {\n                var command = (deletedElement['winControl']);\n                if (command && command['_propertyMutations']) {\n                    command._propertyMutations.bind(_this._refreshBound);\n                }\n            });\n            // Remove current ICommand elements\n            changeInfo.currentElements.forEach(function (element) {\n                if (element.parentElement) {\n                    element.parentElement.removeChild(element);\n                }\n            });\n            // Add new ICommand elements in the right order.\n            changeInfo.newElements.forEach(function (element) {\n                _this._dom.actionArea.appendChild(element);\n            });\n            // Ensure that the overflow button is always the last element in the actionarea\n            this._dom.actionArea.appendChild(this._dom.overflowButton);\n            if (this.data.length > 0) {\n                _ElementUtilities.removeClass(this._dom.root, _Constants.ClassNames.emptyCommandingSurfaceCssClass);\n            }\n            else {\n                _ElementUtilities.addClass(this._dom.root, _Constants.ClassNames.emptyCommandingSurfaceCssClass);\n            }\n            // Execute the animation.\n            updateCommandAnimation.execute();\n            // Indicate processing was successful.\n            return true;\n        };\n        _CommandingSurface.prototype._measure = function () {\n            var _this = this;\n            this._writeProfilerMark(\"_measure,info\");\n            var canMeasure = (_Global.document.body.contains(this._dom.root) && this._dom.actionArea.offsetWidth > 0);\n            if (canMeasure) {\n                var overflowButtonWidth = _ElementUtilities._getPreciseTotalWidth(this._dom.overflowButton), actionAreaContentBoxWidth = _ElementUtilities._getPreciseContentWidth(this._dom.actionArea), separatorWidth = 0, standardCommandWidth = 0, contentCommandWidths = {};\n                this._primaryCommands.forEach(function (command) {\n                    // Ensure that the element we are measuring does not have display: none (e.g. it was just added, and it\n                    // will be animated in)\n                    var originalDisplayStyle = command.element.style.display;\n                    command.element.style.display = \"\";\n                    if (command.type === _Constants.typeContent) {\n                        // Measure each 'content' command type that we find\n                        contentCommandWidths[_this._commandUniqueId(command)] = _ElementUtilities._getPreciseTotalWidth(command.element);\n                    }\n                    else if (command.type === _Constants.typeSeparator) {\n                        // Measure the first 'separator' command type we find.\n                        if (!separatorWidth) {\n                            separatorWidth = _ElementUtilities._getPreciseTotalWidth(command.element);\n                        }\n                    }\n                    else {\n                        // Button, toggle, 'flyout' command types have the same width. Measure the first one we find.\n                        if (!standardCommandWidth) {\n                            standardCommandWidth = _ElementUtilities._getPreciseTotalWidth(command.element);\n                        }\n                    }\n                    // Restore the original display style\n                    command.element.style.display = originalDisplayStyle;\n                });\n                this._cachedMeasurements = {\n                    contentCommandWidths: contentCommandWidths,\n                    separatorWidth: separatorWidth,\n                    standardCommandWidth: standardCommandWidth,\n                    overflowButtonWidth: overflowButtonWidth,\n                    actionAreaContentBoxWidth: actionAreaContentBoxWidth,\n                };\n                // Indicate measure was successful\n                return true;\n            }\n            else {\n                // Indicate measure was unsuccessful\n                return false;\n            }\n        };\n        _CommandingSurface.prototype._layoutCommands = function () {\n            var _this = this;\n            this._writeProfilerMark(\"_layoutCommands,StartTM\");\n            //\n            // Filter commands that will not be visible in the actionarea\n            //\n            this._primaryCommands.forEach(function (command) {\n                command.element.style.display = (command.hidden ? \"none\" : \"\");\n            });\n            var primaryCommandsLocation = this._getVisiblePrimaryCommandsLocation();\n            this._hideSeparatorsIfNeeded(primaryCommandsLocation.actionArea);\n            // Primary commands that will be mirrored in the overflow area should be hidden so\n            // that they are not visible in the actionarea.\n            primaryCommandsLocation.overflowArea.forEach(function (command) {\n                command.element.style.display = \"none\";\n            });\n            // The secondary commands in the actionarea should be hidden since they are always\n            // mirrored as new elements in the overflow area.\n            this._secondaryCommands.forEach(function (command) {\n                command.element.style.display = \"none\";\n            });\n            var overflowCommands = primaryCommandsLocation.overflowArea;\n            var showOverflowButton = (overflowCommands.length > 0 || this._secondaryCommands.length > 0);\n            this._dom.overflowButton.style.display = showOverflowButton ? \"\" : \"none\";\n            // Set up a custom content flyout if there will be \"content\" typed commands in the overflowarea.\n            var isCustomContent = function (command) {\n                return command.type === _Constants.typeContent;\n            };\n            var hasCustomContent = overflowCommands.some(isCustomContent) || this._secondaryCommands.some(isCustomContent);\n            if (hasCustomContent && !this._contentFlyout) {\n                this._contentFlyoutInterior = _Global.document.createElement(\"div\");\n                _ElementUtilities.addClass(this._contentFlyoutInterior, _Constants.ClassNames.contentFlyoutCssClass);\n                this._contentFlyout = new _Flyout.Flyout();\n                this._contentFlyout.element.appendChild(this._contentFlyoutInterior);\n                _Global.document.body.appendChild(this._contentFlyout.element);\n                this._contentFlyout.onbeforeshow = function () {\n                    _ElementUtilities.empty(_this._contentFlyoutInterior);\n                    _ElementUtilities._reparentChildren(_this._chosenCommand.element, _this._contentFlyoutInterior);\n                };\n                this._contentFlyout.onafterhide = function () {\n                    _ElementUtilities._reparentChildren(_this._contentFlyoutInterior, _this._chosenCommand.element);\n                };\n            }\n            //\n            // Project overflowing and secondary commands into the overflowArea as MenuCommands\n            //\n            // Clean up previous MenuCommand projections\n            _ElementUtilities.empty(this._dom.overflowArea);\n            this._menuCommandProjections.map(function (menuCommand) {\n                if (_this._contentFlyout && menuCommand.flyout === _this._contentFlyout) {\n                    // Prevent our _contentFlyout from being disposed with the MenuCommand.\n                    menuCommand.flyout = null;\n                }\n                menuCommand.dispose();\n            });\n            var hasToggleCommands = false, menuCommandProjections = [];\n            // Add primary commands that have overflowed.\n            overflowCommands.forEach(function (command) {\n                if (command.type === _Constants.typeToggle) {\n                    hasToggleCommands = true;\n                }\n                menuCommandProjections.push(_this._projectAsMenuCommand(command));\n            });\n            // Add separator between primary and secondary command if applicable\n            var secondaryCommandsLength = this._secondaryCommands.length;\n            if (overflowCommands.length > 0 && secondaryCommandsLength > 0) {\n                var separator = new _CommandingSurfaceMenuCommand._MenuCommand(null, {\n                    type: _Constants.typeSeparator\n                });\n                menuCommandProjections.push(separator);\n            }\n            // Add secondary commands\n            this._secondaryCommands.forEach(function (command) {\n                if (!command.hidden) {\n                    if (command.type === _Constants.typeToggle) {\n                        hasToggleCommands = true;\n                    }\n                    menuCommandProjections.push(_this._projectAsMenuCommand(command));\n                }\n            });\n            this._hideSeparatorsIfNeeded(menuCommandProjections);\n            menuCommandProjections.forEach(function (command) {\n                _this._dom.overflowArea.appendChild(command.element);\n            });\n            this._menuCommandProjections = menuCommandProjections;\n            _ElementUtilities[hasToggleCommands ? \"addClass\" : \"removeClass\"](this._dom.overflowArea, _Constants.ClassNames.menuContainsToggleCommandClass);\n            this._writeProfilerMark(\"_layoutCommands,StopTM\");\n            // Indicate layout was successful.\n            return true;\n        };\n        _CommandingSurface.prototype._commandUniqueId = function (command) {\n            return _ElementUtilities._uniqueID(command.element);\n        };\n        _CommandingSurface.prototype._getVisiblePrimaryCommandsInfo = function () {\n            var width = 0;\n            var commands = [];\n            var priority = 0;\n            var currentAssignedPriority = 0;\n            for (var i = this._primaryCommands.length - 1; i >= 0; i--) {\n                var command = this._primaryCommands[i];\n                if (!command.hidden) {\n                    if (command.priority === undefined) {\n                        priority = currentAssignedPriority--;\n                    }\n                    else {\n                        priority = command.priority;\n                    }\n                    width = (command.element.style.display === \"none\" ? 0 : this._getCommandWidth(command));\n                    commands.unshift({\n                        command: command,\n                        width: width,\n                        priority: priority\n                    });\n                }\n            }\n            return commands;\n        };\n        _CommandingSurface.prototype._getVisiblePrimaryCommandsLocation = function () {\n            this._writeProfilerMark(\"_getVisiblePrimaryCommandsLocation,info\");\n            var actionAreaCommands = [];\n            var overflowAreaCommands = [];\n            var overflowButtonSpace = 0;\n            var hasSecondaryCommands = this._secondaryCommands.length > 0;\n            var commandsInfo = this._getVisiblePrimaryCommandsInfo();\n            var sortedCommandsInfo = commandsInfo.slice(0).sort(function (commandInfo1, commandInfo2) {\n                return commandInfo1.priority - commandInfo2.priority;\n            });\n            var maxPriority = Number.MAX_VALUE;\n            var availableWidth = this._cachedMeasurements.actionAreaContentBoxWidth;\n            for (var i = 0, len = sortedCommandsInfo.length; i < len; i++) {\n                availableWidth -= sortedCommandsInfo[i].width;\n                // The overflow button needs space if there are secondary commands, or we are not evaluating the last command.\n                overflowButtonSpace = (hasSecondaryCommands || (i < len - 1) ? this._cachedMeasurements.overflowButtonWidth : 0);\n                if (availableWidth - overflowButtonSpace < 0) {\n                    maxPriority = sortedCommandsInfo[i].priority - 1;\n                    break;\n                }\n            }\n            commandsInfo.forEach(function (commandInfo) {\n                if (commandInfo.priority <= maxPriority) {\n                    actionAreaCommands.push(commandInfo.command);\n                }\n                else {\n                    overflowAreaCommands.push(commandInfo.command);\n                }\n            });\n            return {\n                actionArea: actionAreaCommands,\n                overflowArea: overflowAreaCommands\n            };\n        };\n        _CommandingSurface.prototype._getCommandWidth = function (command) {\n            if (command.type === _Constants.typeContent) {\n                return this._cachedMeasurements.contentCommandWidths[this._commandUniqueId(command)];\n            }\n            else if (command.type === _Constants.typeSeparator) {\n                return this._cachedMeasurements.separatorWidth;\n            }\n            else {\n                return this._cachedMeasurements.standardCommandWidth;\n            }\n        };\n        _CommandingSurface.prototype._projectAsMenuCommand = function (originalCommand) {\n            var _this = this;\n            var menuCommand = new _CommandingSurfaceMenuCommand._MenuCommand(null, {\n                label: originalCommand.label,\n                type: (originalCommand.type === _Constants.typeContent ? _Constants.typeFlyout : originalCommand.type) || _Constants.typeButton,\n                disabled: originalCommand.disabled,\n                flyout: originalCommand.flyout,\n                beforeInvoke: function () {\n                    // Save the command that was selected\n                    _this._chosenCommand = (menuCommand[\"_originalICommand\"]);\n                    // If this WinJS.UI.MenuCommand has type: toggle, we should also toggle the value of the original WinJS.UI.Command\n                    if (_this._chosenCommand.type === _Constants.typeToggle) {\n                        _this._chosenCommand.selected = !_this._chosenCommand.selected;\n                    }\n                }\n            });\n            if (originalCommand.selected) {\n                menuCommand.selected = true;\n            }\n            if (originalCommand.extraClass) {\n                menuCommand.extraClass = originalCommand.extraClass;\n            }\n            if (originalCommand.type === _Constants.typeContent) {\n                if (!menuCommand.label) {\n                    menuCommand.label = _Constants.contentMenuCommandDefaultLabel;\n                }\n                menuCommand.flyout = this._contentFlyout;\n            }\n            else {\n                menuCommand.onclick = originalCommand.onclick;\n            }\n            menuCommand[\"_originalICommand\"] = originalCommand;\n            return menuCommand;\n        };\n        _CommandingSurface.prototype._hideSeparatorsIfNeeded = function (commands) {\n            var prevType = _Constants.typeSeparator;\n            var command;\n            // Hide all leading or consecutive separators\n            var commandsLength = commands.length;\n            commands.forEach(function (command) {\n                if (command.type === _Constants.typeSeparator && prevType === _Constants.typeSeparator) {\n                    command.element.style.display = \"none\";\n                }\n                prevType = command.type;\n            });\n            for (var i = commandsLength - 1; i >= 0; i--) {\n                command = commands[i];\n                if (command.type === _Constants.typeSeparator) {\n                    command.element.style.display = \"none\";\n                }\n                else {\n                    break;\n                }\n            }\n        };\n        _CommandingSurface.prototype._clearAnimation = function () {\n            var transformScriptName = _BaseUtils._browserStyleEquivalents[\"transform\"].scriptName;\n            this._dom.actionAreaContainer.style[transformScriptName] = \"\";\n            this._dom.actionArea.style[transformScriptName] = \"\";\n            this._dom.overflowAreaContainer.style[transformScriptName] = \"\";\n            this._dom.overflowArea.style[transformScriptName] = \"\";\n        };\n        /// Display options for the actionarea when the _CommandingSurface is closed.\n        _CommandingSurface.ClosedDisplayMode = ClosedDisplayMode;\n        /// Display options used by the _Commandingsurface to determine which direction it should expand when opening.\n        _CommandingSurface.OverflowDirection = OverflowDirection;\n        _CommandingSurface.supportedForProcessing = true;\n        return _CommandingSurface;\n    })();\n    exports._CommandingSurface = _CommandingSurface;\n    _Base.Class.mix(_CommandingSurface, _Events.createEventProperties(_Constants.EventNames.beforeOpen, _Constants.EventNames.afterOpen, _Constants.EventNames.beforeClose, _Constants.EventNames.afterClose));\n    // addEventListener, removeEventListener, dispatchEvent\n    _Base.Class.mix(_CommandingSurface, _Control.DOMEventMixin);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/CommandingSurface',[\"require\", \"exports\"], function (require, exports) {\n    var module = null;\n    function getModule() {\n        if (!module) {\n            require([\"./CommandingSurface/_CommandingSurface\"], function (m) {\n                module = m;\n            });\n        }\n        return module._CommandingSurface;\n    }\n    var publicMembers = Object.create({}, {\n        _CommandingSurface: {\n            get: function () {\n                return getModule();\n            }\n        }\n    });\n    return publicMembers;\n});\n\n\ndefine('require-style!less/styles-toolbar',[],function(){});\ndefine('WinJS/Controls/ToolBar/_ToolBar',[\"require\", \"exports\", \"../../Core/_Base\", \"../ToolBar/_Constants\", \"../CommandingSurface\", \"../../Utilities/_Control\", \"../../Utilities/_Dispose\", \"../../Utilities/_ElementUtilities\", \"../../Core/_ErrorFromName\", '../../Core/_Events', \"../../Core/_Global\", '../../_LightDismissService', \"../../Core/_Resources\", '../../Utilities/_OpenCloseMachine', \"../../Core/_WriteProfilerMark\"], function (require, exports, _Base, _Constants, _CommandingSurface, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Global, _LightDismissService, _Resources, _OpenCloseMachine, _WriteProfilerMark) {\n    require([\"require-style!less/styles-toolbar\"]);\n    \"use strict\";\n    var strings = {\n        get ariaLabel() {\n            return _Resources._getWinJSString(\"ui/toolbarAriaLabel\").value;\n        },\n        get overflowButtonAriaLabel() {\n            return _Resources._getWinJSString(\"ui/toolbarOverflowButtonAriaLabel\").value;\n        },\n        get mustContainCommands() {\n            return \"The toolbar can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls\";\n        },\n        get duplicateConstruction() {\n            return \"Invalid argument: Controls may only be instantiated one time for each DOM element\";\n        }\n    };\n    var ClosedDisplayMode = {\n        /// <field locid=\"WinJS.UI.ToolBar.ClosedDisplayMode.compact\" helpKeyword=\"WinJS.UI.ToolBar.ClosedDisplayMode.compact\">\n        /// When the ToolBar is closed, the height of the ToolBar is reduced such that button commands are still visible, but their labels are hidden.\n        /// </field>\n        compact: \"compact\",\n        /// <field locid=\"WinJS.UI.ToolBar.ClosedDisplayMode.full\" helpKeyword=\"WinJS.UI.ToolBar.ClosedDisplayMode.full\">\n        /// When the ToolBar is closed, the height of the ToolBar is always sized to content.\n        /// </field>\n        full: \"full\",\n    };\n    var closedDisplayModeClassMap = {};\n    closedDisplayModeClassMap[ClosedDisplayMode.compact] = _Constants.ClassNames.compactClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.full] = _Constants.ClassNames.fullClass;\n    // Versions of add/removeClass that are no ops when called with falsy class names.\n    function addClass(element, className) {\n        className && _ElementUtilities.addClass(element, className);\n    }\n    function removeClass(element, className) {\n        className && _ElementUtilities.removeClass(element, className);\n    }\n    /// <field>\n    /// <summary locid=\"WinJS.UI.ToolBar\">\n    /// Displays ICommands within the flow of the app. Use the ToolBar around other statically positioned app content.\n    /// </summary>\n    /// </field>\n    /// <icon src=\"ui_winjs.ui.toolbar.12x12.png\" width=\"12\" height=\"12\" />\n    /// <icon src=\"ui_winjs.ui.toolbar.16x16.png\" width=\"16\" height=\"16\" />\n    /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.ToolBar\">\n    /// <button data-win-control=\"WinJS.UI.Command\" data-win-options=\"{id:'',label:'example',icon:'back',type:'button',onclick:null,section:'primary'}\"></button>\n    /// </div>]]></htmlSnippet>\n    /// <part name=\"toolbar\" class=\"win-toolbar\" locid=\"WinJS.UI.ToolBar_part:toolbar\">The entire ToolBar control.</part>\n    /// <part name=\"toolbar-overflowbutton\" class=\"win-toolbar-overflowbutton\" locid=\"WinJS.UI.ToolBar_part:ToolBar-overflowbutton\">The toolbar overflow button.</part>\n    /// <part name=\"toolbar-overflowarea\" class=\"win-toolbar-overflowarea\" locid=\"WinJS.UI.ToolBar_part:ToolBar-overflowarea\">The container for toolbar commands that overflow.</part>\n    /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n    /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n    var ToolBar = (function () {\n        function ToolBar(element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.ToolBar\">\n            /// <summary locid=\"WinJS.UI.ToolBar.constructor\">\n            /// Creates a new ToolBar control.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.ToolBar.constructor_p:element\">\n            /// The DOM element that will host the control.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.ToolBar.constructor_p:options\">\n            /// The set of properties and values to apply to the new ToolBar control.\n            /// </param>\n            /// <returns type=\"WinJS.UI.ToolBar\" locid=\"WinJS.UI.ToolBar.constructor_returnValue\">\n            /// The new ToolBar control.\n            /// </returns>\n            /// </signature>\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            // State private to the _updateDomImpl family of method. No other methods should make use of it.\n            //\n            // Nothing has been rendered yet so these are all initialized to undefined. Because\n            // they are undefined, the first time _updateDomImpl is called, they will all be\n            // rendered.\n            this._updateDomImpl_renderedState = {\n                isOpenedMode: undefined,\n                closedDisplayMode: undefined,\n                prevInlineWidth: undefined,\n            };\n            this._writeProfilerMark(\"constructor,StartTM\");\n            // Check to make sure we weren't duplicated\n            if (element && element[\"winControl\"]) {\n                throw new _ErrorFromName(\"WinJS.UI.ToolBar.DuplicateConstruction\", strings.duplicateConstruction);\n            }\n            this._initializeDom(element || _Global.document.createElement(\"div\"));\n            var stateMachine = new _OpenCloseMachine.OpenCloseMachine({\n                eventElement: this.element,\n                onOpen: function () {\n                    var openAnimation = _this._commandingSurface.createOpenAnimation(_this._getClosedHeight());\n                    _this._synchronousOpen();\n                    return openAnimation.execute();\n                },\n                onClose: function () {\n                    var closeAnimation = _this._commandingSurface.createCloseAnimation(_this._getClosedHeight());\n                    return closeAnimation.execute().then(function () {\n                        _this._synchronousClose();\n                    });\n                },\n                onUpdateDom: function () {\n                    _this._updateDomImpl();\n                },\n                onUpdateDomWithIsOpened: function (isOpened) {\n                    _this._isOpenedMode = isOpened;\n                    _this._updateDomImpl();\n                }\n            });\n            // Events\n            this._handleShowingKeyboardBound = this._handleShowingKeyboard.bind(this);\n            _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, \"showing\", this._handleShowingKeyboardBound);\n            // Initialize private state.\n            this._disposed = false;\n            this._cachedClosedHeight = null;\n            this._commandingSurface = new _CommandingSurface._CommandingSurface(this._dom.commandingSurfaceEl, { openCloseMachine: stateMachine });\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-actionarea\"), _Constants.ClassNames.actionAreaCssClass);\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-overflowarea\"), _Constants.ClassNames.overflowAreaCssClass);\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-overflowbutton\"), _Constants.ClassNames.overflowButtonCssClass);\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-ellipsis\"), _Constants.ClassNames.ellipsisCssClass);\n            this._isOpenedMode = _Constants.defaultOpened;\n            this._dismissable = new _LightDismissService.LightDismissableElement({\n                element: this._dom.root,\n                tabIndex: this._dom.root.hasAttribute(\"tabIndex\") ? this._dom.root.tabIndex : -1,\n                onLightDismiss: function () {\n                    _this.close();\n                }\n            });\n            // Initialize public properties.\n            this.closedDisplayMode = _Constants.defaultClosedDisplayMode;\n            this.opened = this._isOpenedMode;\n            _Control.setOptions(this, options);\n            // Exit the Init state.\n            _ElementUtilities._inDom(this.element).then(function () {\n                return _this._commandingSurface.initialized;\n            }).then(function () {\n                stateMachine.exitInit();\n                _this._writeProfilerMark(\"constructor,StopTM\");\n            });\n        }\n        Object.defineProperty(ToolBar.prototype, \"element\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.ToolBar.element\" helpKeyword=\"WinJS.UI.ToolBar.element\">\n            /// Gets the DOM element that hosts the ToolBar.\n            /// </field>\n            get: function () {\n                return this._dom.root;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ToolBar.prototype, \"data\", {\n            /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.UI.ToolBar.data\" helpKeyword=\"WinJS.UI.ToolBar.data\">\n            /// Gets or sets the Binding List of WinJS.UI.Command for the ToolBar.\n            /// </field>\n            get: function () {\n                return this._commandingSurface.data;\n            },\n            set: function (value) {\n                this._commandingSurface.data = value;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ToolBar.prototype, \"closedDisplayMode\", {\n            /// <field type=\"String\" locid=\"WinJS.UI.ToolBar.closedDisplayMode\" helpKeyword=\"WinJS.UI.ToolBar.closedDisplayMode\">\n            /// Gets or sets the closedDisplayMode for the ToolBar. Values are \"compact\" and \"full\".\n            /// </field>\n            get: function () {\n                return this._commandingSurface.closedDisplayMode;\n            },\n            set: function (value) {\n                if (ClosedDisplayMode[value]) {\n                    this._commandingSurface.closedDisplayMode = value;\n                    this._cachedClosedHeight = null;\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ToolBar.prototype, \"opened\", {\n            /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI.ToolBar.opened\" helpKeyword=\"WinJS.UI.ToolBar.opened\">\n            /// Gets or sets whether the ToolBar is currently opened.\n            /// </field>\n            get: function () {\n                return this._commandingSurface.opened;\n            },\n            set: function (value) {\n                this._commandingSurface.opened = value;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ToolBar.prototype.open = function () {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.open\">\n            /// <summary locid=\"WinJS.UI.ToolBar.open\">\n            /// Opens the ToolBar\n            /// </summary>\n            /// </signature>\n            this._commandingSurface.open();\n        };\n        ToolBar.prototype.close = function () {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.close\">\n            /// <summary locid=\"WinJS.UI.ToolBar.close\">\n            /// Closes the ToolBar\n            /// </summary>\n            /// </signature>\n            this._commandingSurface.close();\n        };\n        ToolBar.prototype.dispose = function () {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.dispose\">\n            /// <summary locid=\"WinJS.UI.ToolBar.dispose\">\n            /// Disposes this ToolBar.\n            /// </summary>\n            /// </signature>\n            if (this._disposed) {\n                return;\n            }\n            this._disposed = true;\n            _LightDismissService.hidden(this._dismissable);\n            // Disposing the _commandingSurface will trigger dispose on its OpenCloseMachine and synchronously complete any animations that might have been running.\n            this._commandingSurface.dispose();\n            // If page navigation is happening, we don't want the ToolBar left behind in the body.\n            // Synchronoulsy close the ToolBar to force it out of the body and back into its parent element.\n            this._synchronousClose();\n            _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, \"showing\", this._handleShowingKeyboardBound);\n            _Dispose.disposeSubTree(this.element);\n        };\n        ToolBar.prototype.forceLayout = function () {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.forceLayout\">\n            /// <summary locid=\"WinJS.UI.ToolBar.forceLayout\">\n            /// Forces the ToolBar to update its layout. Use this function when the window did not change size, but the container of the ToolBar changed size.\n            /// </summary>\n            /// </signature>\n            this._commandingSurface.forceLayout();\n        };\n        ToolBar.prototype.getCommandById = function (id) {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.getCommandById\">\n            /// <summary locid=\"WinJS.UI.ToolBar.getCommandById\">\n            /// Retrieves the command with the specified ID from this ToolBar.\n            /// If more than one command is found, this method returns the first command found.\n            /// </summary>\n            /// <param name=\"id\" type=\"String\" locid=\"WinJS.UI.ToolBar.getCommandById_p:id\">Id of the command to return.</param>\n            /// <returns type=\"object\" locid=\"WinJS.UI.ToolBar.getCommandById_returnValue\">\n            /// The command found, or null if no command is found.\n            /// </returns>\n            /// </signature>\n            return this._commandingSurface.getCommandById(id);\n        };\n        ToolBar.prototype.showOnlyCommands = function (commands) {\n            /// <signature helpKeyword=\"WinJS.UI.ToolBar.showOnlyCommands\">\n            /// <summary locid=\"WinJS.UI.ToolBar.showOnlyCommands\">\n            /// Show the specified commands, hiding all of the others in the ToolBar.\n            /// </summary>\n            /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI.ToolBar.showOnlyCommands_p:commands\">\n            /// An array of the commands to show. The array elements may be Command objects, or the string identifiers (IDs) of commands.\n            /// </param>\n            /// </signature>\n            return this._commandingSurface.showOnlyCommands(commands);\n        };\n        ToolBar.prototype._writeProfilerMark = function (text) {\n            _WriteProfilerMark(\"WinJS.UI.ToolBar:\" + this._id + \":\" + text);\n        };\n        ToolBar.prototype._initializeDom = function (root) {\n            this._writeProfilerMark(\"_intializeDom,info\");\n            // Attaching JS control to DOM element\n            root[\"winControl\"] = this;\n            this._id = root.id || _ElementUtilities._uniqueID(root);\n            _ElementUtilities.addClass(root, _Constants.ClassNames.controlCssClass);\n            _ElementUtilities.addClass(root, _Constants.ClassNames.disposableCssClass);\n            // Make sure we have an ARIA role\n            var role = root.getAttribute(\"role\");\n            if (!role) {\n                root.setAttribute(\"role\", \"menubar\");\n            }\n            var label = root.getAttribute(\"aria-label\");\n            if (!label) {\n                root.setAttribute(\"aria-label\", strings.ariaLabel);\n            }\n            // Create element for commandingSurface and reparent any declarative Commands.\n            // The CommandingSurface constructor will parse child elements as AppBarCommands.\n            var commandingSurfaceEl = document.createElement(\"DIV\");\n            _ElementUtilities._reparentChildren(root, commandingSurfaceEl);\n            root.appendChild(commandingSurfaceEl);\n            // While the ToolBar is open, it will place itself in the <body> so it can become a light dismissible\n            // overlay. It leaves the placeHolder element behind as stand in at the ToolBar's original DOM location\n            // to avoid reflowing surrounding app content and create the illusion that the ToolBar hasn't moved along\n            // the x or y planes.\n            var placeHolder = _Global.document.createElement(\"DIV\");\n            _ElementUtilities.addClass(placeHolder, _Constants.ClassNames.placeHolderCssClass);\n            // If the ToolBar's original HTML parent node is disposed while the ToolBar is open and repositioned as \n            // a temporary child of the <body>, make sure that calling dispose on the placeHolder element will trigger \n            // dispose on the ToolBar as well.\n            _Dispose.markDisposable(placeHolder, this.dispose.bind(this));\n            this._dom = {\n                root: root,\n                commandingSurfaceEl: commandingSurfaceEl,\n                placeHolder: placeHolder,\n            };\n        };\n        ToolBar.prototype._handleShowingKeyboard = function (event) {\n            // Because the ToolBar takes up layout space and is not an overlay, it doesn't have the same expectation \n            // to move itself to get out of the way of a showing IHM. Instsead we just close the ToolBar to avoid \n            // scenarios where the ToolBar is occluded, but the click-eating-div is still present since it may seem \n            // strange to end users that an occluded ToolBar (out of sight, out of mind) is still eating their first \n            // click.\n            // Mitigation:\n            // Because (1) custom content in a ToolBar can only be included as a 'content' type command, because (2)\n            // the ToolBar only supports closedDisplayModes 'compact' and 'full', and because (3) 'content' type\n            // commands in the overflowarea use a separate contentflyout to display their contents:\n            // Interactable custom content contained within the ToolBar actionarea or overflowarea, will remain\n            // visible and interactable even when showing the IHM closes the ToolBar.\n            this.close();\n        };\n        ToolBar.prototype._synchronousOpen = function () {\n            this._isOpenedMode = true;\n            this._updateDomImpl();\n        };\n        ToolBar.prototype._synchronousClose = function () {\n            this._isOpenedMode = false;\n            this._updateDomImpl();\n        };\n        ToolBar.prototype._updateDomImpl = function () {\n            var rendered = this._updateDomImpl_renderedState;\n            if (rendered.isOpenedMode !== this._isOpenedMode) {\n                if (this._isOpenedMode) {\n                    this._updateDomImpl_renderOpened();\n                }\n                else {\n                    this._updateDomImpl_renderClosed();\n                }\n                rendered.isOpenedMode = this._isOpenedMode;\n            }\n            if (rendered.closedDisplayMode !== this.closedDisplayMode) {\n                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);\n                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);\n                rendered.closedDisplayMode = this.closedDisplayMode;\n            }\n            this._commandingSurface.updateDomImpl();\n        };\n        ToolBar.prototype._getClosedHeight = function () {\n            if (this._cachedClosedHeight === null) {\n                var wasOpen = this._isOpenedMode;\n                if (this._isOpenedMode) {\n                    this._synchronousClose();\n                }\n                this._cachedClosedHeight = this._commandingSurface.getBoundingRects().commandingSurface.height;\n                if (wasOpen) {\n                    this._synchronousOpen();\n                }\n            }\n            return this._cachedClosedHeight;\n        };\n        ToolBar.prototype._updateDomImpl_renderOpened = function () {\n            var _this = this;\n            // Measure closed state.\n            this._updateDomImpl_renderedState.prevInlineWidth = this._dom.root.style.width;\n            var closedBorderBox = this._dom.root.getBoundingClientRect();\n            var closedContentWidth = _ElementUtilities._getPreciseContentWidth(this._dom.root);\n            var closedContentHeight = _ElementUtilities._getPreciseContentHeight(this._dom.root);\n            var closedStyle = getComputedStyle(this._dom.root);\n            var closedPaddingTop = _ElementUtilities._convertToPrecisePixels(closedStyle.paddingTop);\n            var closedBorderTop = _ElementUtilities._convertToPrecisePixels(closedStyle.borderTopWidth);\n            var closedMargins = _ElementUtilities._getPreciseMargins(this._dom.root);\n            var closedContentBoxTop = closedBorderBox.top + closedBorderTop + closedPaddingTop;\n            var closedContentBoxBottom = closedContentBoxTop + closedContentHeight;\n            // Size our placeHolder. Set height and width to match borderbox of the closed ToolBar.\n            // Copy ToolBar margins to the placeholder.\n            var placeHolder = this._dom.placeHolder;\n            var placeHolderStyle = placeHolder.style;\n            placeHolderStyle.width = closedBorderBox.width + \"px\";\n            placeHolderStyle.height = closedBorderBox.height + \"px\";\n            placeHolderStyle.marginTop = closedMargins.top + \"px\";\n            placeHolderStyle.marginRight = closedMargins.right + \"px\";\n            placeHolderStyle.marginBottom = closedMargins.bottom + \"px\";\n            placeHolderStyle.marginLeft = closedMargins.left + \"px\";\n            _ElementUtilities._maintainFocus(function () {\n                // Move ToolBar element to the body in preparation of becoming a light dismissible. Leave an equal sized placeHolder element \n                // at our original DOM location to avoid reflowing surrounding app content.\n                _this._dom.root.parentElement.insertBefore(placeHolder, _this._dom.root);\n                _Global.document.body.appendChild(_this._dom.root);\n                // Position the ToolBar to completely cover the same region as the placeholder element.\n                _this._dom.root.style.width = closedContentWidth + \"px\";\n                _this._dom.root.style.left = closedBorderBox.left - closedMargins.left + \"px\";\n                // Determine which direction to expand the CommandingSurface elements when opened. The overflow area will be rendered at the corresponding edge of \n                // the ToolBar's content box, so we choose the direction that offers the most space between that edge and the corresponding edge of the viewport. \n                // This is to reduce the chance that the overflow area might clip through the edge of the viewport.\n                var topOfViewport = 0;\n                var bottomOfViewport = _Global.innerHeight;\n                var distanceFromTop = closedContentBoxTop - topOfViewport;\n                var distanceFromBottom = bottomOfViewport - closedContentBoxBottom;\n                if (distanceFromTop > distanceFromBottom) {\n                    // CommandingSurface is going to expand updwards.\n                    _this._commandingSurface.overflowDirection = _Constants.OverflowDirection.top;\n                    // Position the bottom edge of the ToolBar marginbox over the bottom edge of the placeholder marginbox.\n                    _this._dom.root.style.bottom = (bottomOfViewport - closedBorderBox.bottom) - closedMargins.bottom + \"px\";\n                }\n                else {\n                    // CommandingSurface is going to expand downwards.\n                    _this._commandingSurface.overflowDirection = _Constants.OverflowDirection.bottom;\n                    // Position the top edge of the ToolBar marginbox over the top edge of the placeholder marginbox.\n                    _this._dom.root.style.top = (topOfViewport + closedBorderBox.top) - closedMargins.top + \"px\";\n                }\n                // Render opened state\n                _ElementUtilities.addClass(_this._dom.root, _Constants.ClassNames.openedClass);\n                _ElementUtilities.removeClass(_this._dom.root, _Constants.ClassNames.closedClass);\n            });\n            this._commandingSurface.synchronousOpen();\n            _LightDismissService.shown(this._dismissable); // Call at the start of the open animation\n        };\n        ToolBar.prototype._updateDomImpl_renderClosed = function () {\n            var _this = this;\n            _ElementUtilities._maintainFocus(function () {\n                if (_this._dom.placeHolder.parentElement) {\n                    // Restore our placement in the DOM\n                    var placeHolder = _this._dom.placeHolder;\n                    placeHolder.parentElement.insertBefore(_this._dom.root, placeHolder);\n                    placeHolder.parentElement.removeChild(placeHolder);\n                }\n                // Render Closed\n                _this._dom.root.style.top = \"\";\n                _this._dom.root.style.right = \"\";\n                _this._dom.root.style.bottom = \"\";\n                _this._dom.root.style.left = \"\";\n                _this._dom.root.style.width = _this._updateDomImpl_renderedState.prevInlineWidth;\n                _ElementUtilities.addClass(_this._dom.root, _Constants.ClassNames.closedClass);\n                _ElementUtilities.removeClass(_this._dom.root, _Constants.ClassNames.openedClass);\n            });\n            this._commandingSurface.synchronousClose();\n            _LightDismissService.hidden(this._dismissable); // Call after the close animation\n        };\n        /// <field locid=\"WinJS.UI.ToolBar.ClosedDisplayMode\" helpKeyword=\"WinJS.UI.ToolBar.ClosedDisplayMode\">\n        /// Display options for the actionarea when the ToolBar is closed.\n        /// </field>\n        ToolBar.ClosedDisplayMode = ClosedDisplayMode;\n        ToolBar.supportedForProcessing = true;\n        return ToolBar;\n    })();\n    exports.ToolBar = ToolBar;\n    _Base.Class.mix(ToolBar, _Events.createEventProperties(_Constants.EventNames.beforeOpen, _Constants.EventNames.afterOpen, _Constants.EventNames.beforeClose, _Constants.EventNames.afterClose));\n    // addEventListener, removeEventListener, dispatchEvent\n    _Base.Class.mix(ToolBar, _Control.DOMEventMixin);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/ToolBar',[\"require\", \"exports\", '../Core/_Base'], function (require, exports, _Base) {\n    var module = null;\n    _Base.Namespace.define(\"WinJS.UI\", {\n        ToolBar: {\n            get: function () {\n                if (!module) {\n                    require([\"./ToolBar/_ToolBar\"], function (m) {\n                        module = m;\n                    });\n                }\n                return module.ToolBar;\n            }\n        }\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/_LegacyAppBar/_Layouts',[\n    'exports',\n    '../../Animations/_TransitionAnimation',\n    '../../BindingList',\n    '../../Core/_BaseUtils',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Resources',\n    '../../Core/_WriteProfilerMark',\n    '../../Controls/ToolBar',\n    '../../Controls/ToolBar/_Constants',\n    '../../Promise',\n    '../../Scheduler',\n    '../../Utilities/_Control',\n    '../../Utilities/_Dispose',\n    '../../Utilities/_ElementUtilities',\n    '../AppBar/_Command',\n    './_Constants'\n], function appBarLayoutsInit(exports, _TransitionAnimation, BindingList, _BaseUtils, _Global, _Base, _ErrorFromName, _Resources, _WriteProfilerMark, ToolBar, _ToolBarConstants, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Command, _Constants) {\n    \"use strict\";\n\n    // AppBar will use this when AppBar.layout property is set to \"custom\"\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _AppBarBaseLayout: _Base.Namespace._lazy(function () {\n            var baseType = _Constants.appBarLayoutCustom;\n\n            var strings = {\n                get nullCommand() { return \"Invalid argument: command must not be null\"; }\n            };\n\n            var _AppBarBaseLayout = _Base.Class.define(function _AppBarBaseLayout_ctor(appBarEl, options) {\n                this._disposed = false;\n\n                options = options || {};\n                _Control.setOptions(this, options);\n\n                if (appBarEl) {\n                    this.connect(appBarEl);\n                }\n            }, {\n                // Members\n                className: {\n                    get: function _AppBarBaseLayout_get_className() {\n                        return this._className;\n                    },\n                },\n                type: {\n                    get: function _AppBarBaseLayout_get_className() {\n                        return this._type || baseType;\n                    },\n                },\n                commandsInOrder: {\n                    get: function _AppBarBaseLayout_get_commandsInOrder() {\n                        // Get a DOM ordered collection of the AppBarCommand elements in the AppBar.\n                        var commandElements = this.appBarEl.querySelectorAll(\".\" + _Constants.appBarCommandClass);\n\n                        // Return an array of AppBarCommand objects.\n                        return Array.prototype.map.call(commandElements, function (commandElement) {\n                            return commandElement.winControl;\n                        });\n                    }\n                },\n                connect: function _AppBarBaseLayout_connect(appBarEl) {\n                    if (this.className) {\n                        _ElementUtilities.addClass(appBarEl, this.className);\n                    }\n                    this.appBarEl = appBarEl;\n                },\n                disconnect: function _AppBarBaseLayout_disconnect() {\n                    if (this.className) {\n                        _ElementUtilities.removeClass(this.appBarEl, this.className);\n                    }\n                    this.appBarEl = null;\n                    this.dispose();\n                },\n                layout: function _AppBarBaseLayout_layout(commands) {\n                    // Append commands to the DOM.\n                    var len = commands.length;\n                    for (var i = 0; i < len; i++) {\n                        var command = this.sanitizeCommand(commands[i]);\n                        this.appBarEl.appendChild(command._element);\n                    }\n                },\n                showCommands: function _AppBarBaseLayout_showCommands(commands) {\n                    // Use the default overlay showCommands implementation\n                    this.appBarEl.winControl._showCommands(commands);\n                },\n                showOnlyCommands: function _AppBarBaseLayout_showOnlyCommands(commands) {\n                    // Use the default overlay _showOnlyCommands implementation\n                    this.appBarEl.winControl._showOnlyCommands(commands);\n                },\n                hideCommands: function _AppBarBaseLayout_hideCommands(commands) {\n                    // Use the default overlay _hideCommands implementation\n                    this.appBarEl.winControl._hideCommands(commands);\n                },\n                sanitizeCommand: function _AppBarBaseLayout_sanitizeCommand(command) {\n                    if (!command) {\n                        throw new _ErrorFromName(\"WinJS.UI.AppBar.NullCommand\", strings.nullCommand);\n                    }\n                    // See if it's a command already\n                    command = command.winControl || command;\n                    if (!command._element) {\n                        // Not a command, so assume it is options for the command's constructor.\n                        command = new _Command.AppBarCommand(null, command);\n                    }\n                    // If we were attached somewhere else, detach us\n                    if (command._element.parentElement) {\n                        command._element.parentElement.removeChild(command._element);\n                    }\n\n                    return command;\n                },\n                dispose: function _AppBarBaseLayout_dispose() {\n                    this._disposed = true;\n                },\n                disposeChildren: function _AppBarBaseLayout_disposeChildren() {\n                    var appBarFirstDiv = this.appBarEl.querySelectorAll(\".\" + _Constants.firstDivClass);\n                    appBarFirstDiv = appBarFirstDiv.length >= 1 ? appBarFirstDiv[0] : null;\n                    var appBarFinalDiv = this.appBarEl.querySelectorAll(\".\" + _Constants.finalDivClass);\n                    appBarFinalDiv = appBarFinalDiv.length >= 1 ? appBarFinalDiv[0] : null;\n\n                    var children = this.appBarEl.children;\n                    var length = children.length;\n                    for (var i = 0; i < length; i++) {\n                        var element = children[i];\n                        if (element === appBarFirstDiv || element === appBarFinalDiv) {\n                            continue;\n                        } else {\n                            _Dispose.disposeSubTree(element);\n                        }\n                    }\n                },\n                handleKeyDown: function _AppBarBaseLayout_handleKeyDown() {\n                    // NOP\n                },\n                commandsUpdated: function _AppBarBaseLayout_commandsUpdated() {\n                    // NOP\n                },\n                beginAnimateCommands: function _AppBarBaseLayout_beginAnimateCommands() {\n                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.\n                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.\n                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide.\n                    // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide.\n\n                    // NOP\n                },\n                endAnimateCommands: function _AppBarBaseLayout_endAnimateCommands() {\n                    // NOP\n                },\n                scale: function _AppBarBaseLayout_scale() {\n                    // NOP\n                },\n                resize: function _AppBarBaseLayout_resize() {\n                    // NOP\n                },\n                positionChanging: function _AppBarBaseLayout_positionChanging(fromPosition, toPosition) {\n                    // NOP\n                    return Promise.wrap();\n                },\n                setFocusOnShow: function _AppBarBaseLayout_setFocusOnShow() {\n                    this.appBarEl.winControl._setFocusToAppBar();\n                }\n            });\n            return _AppBarBaseLayout;\n        }),\n    });\n\n    // AppBar will use this when AppBar.layout property is set to \"commands\"\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _AppBarCommandsLayout: _Base.Namespace._lazy(function () {\n            var layoutClassName = _Constants.commandLayoutClass;\n            var layoutType = _Constants.appBarLayoutCommands;\n\n            var _AppBarCommandsLayout = _Base.Class.derive(exports._AppBarBaseLayout, function _AppBarCommandsLayout_ctor(appBarEl) {\n                exports._AppBarBaseLayout.call(this, appBarEl, { _className: layoutClassName, _type: layoutType });\n                this._commandLayoutsInit(appBarEl);\n            }, {\n                commandsInOrder: {\n                    get: function _AppBarCommandsLayout_get_commandsInOrder() {\n                        return this._originalCommands.filter(function (command) {\n                            // Make sure the element is still in the AppBar.\n                            return this.appBarEl.contains(command.element);\n                        }, this);\n                    }\n                },\n                layout: function _AppBarCommandsLayout_layout(commands) {\n                    // Insert commands and other layout specific DOM into the AppBar element.\n\n                    // Empty our tree.\n                    _ElementUtilities.empty(this._primaryCommands);\n                    _ElementUtilities.empty(this._secondaryCommands);\n\n                    // Keep track of the order we receive the commands in.\n                    this._originalCommands = [];\n\n                    // Layout commands\n                    for (var i = 0, len = commands.length; i < len; i++) {\n                        var command = this.sanitizeCommand(commands[i]);\n\n                        this._originalCommands.push(command);\n\n                        if (\"primary\" === command.section || \"global\" === command.section) {\n                            this._primaryCommands.appendChild(command._element);\n                        } else {\n                            this._secondaryCommands.appendChild(command._element);\n                        }\n                    }\n\n                    // Append layout containers to AppBar element.\n                    // Secondary Commands should come first in Tab Order.\n                    this.appBarEl.appendChild(this._secondaryCommands);\n                    this.appBarEl.appendChild(this._primaryCommands);\n\n\n                    // Need to measure all content commands after they have been added to the AppBar to make sure we allow\n                    // user defined CSS rules based on the ancestor of the content command to take affect.\n                    this._needToMeasureNewCommands = true;\n\n                    // In case this is called from the constructor before the AppBar element has been appended to the DOM,\n                    // we schedule the initial scaling of commands, with the expectation that the element will be added\n                    // synchronously, in the same block of code that called the constructor.\n                    Scheduler.schedule(function () {\n                        if (this._needToMeasureNewCommands && !this._disposed) {\n                            this.scale();\n                        }\n                    }.bind(this), Scheduler.Priority.idle, this, \"WinJS._commandLayoutsMixin._scaleNewCommands\");\n\n                },\n                disposeChildren: function _AppBarCommandsLayout_disposeChildren() {\n                    _Dispose.disposeSubTree(this._primaryCommands);\n                    _Dispose.disposeSubTree(this._secondaryCommands);\n                },\n                handleKeyDown: function _AppBarCommandsLayout_handleKeyDown(event) {\n                    var Key = _ElementUtilities.Key;\n\n                    if (_ElementUtilities._matchesSelector(event.target, \".win-interactive, .win-interactive *\")) {\n                        return; // Ignore left, right, home & end keys if focused element has win-interactive class.\n                    }\n                    var rtl = _Global.getComputedStyle(this.appBarEl).direction === \"rtl\";\n                    var leftKey = rtl ? Key.rightArrow : Key.leftArrow;\n                    var rightKey = rtl ? Key.leftArrow : Key.rightArrow;\n\n                    if (event.keyCode === leftKey || event.keyCode === rightKey || event.keyCode === Key.home || event.keyCode === Key.end) {\n\n                        var globalCommandHasFocus = this._primaryCommands.contains(_Global.document.activeElement);\n                        var focusableCommands = this._getFocusableCommandsInLogicalOrder(globalCommandHasFocus);\n                        var targetCommand;\n\n                        if (focusableCommands.length) {\n                            switch (event.keyCode) {\n                                case leftKey:\n                                    // Arrowing past the last command wraps back around to the first command.\n                                    var index = Math.max(-1, focusableCommands.focusedIndex - 1) + focusableCommands.length;\n                                    targetCommand = focusableCommands[index % focusableCommands.length].winControl.lastElementFocus;\n                                    break;\n\n                                case rightKey:\n                                    // Arrowing previous to the first command wraps back around to the last command.\n                                    var index = focusableCommands.focusedIndex + 1 + focusableCommands.length;\n                                    targetCommand = focusableCommands[index % focusableCommands.length].winControl.firstElementFocus;\n                                    break;\n\n                                case Key.home:\n                                    var index = 0;\n                                    targetCommand = focusableCommands[index].winControl.firstElementFocus;\n                                    break;\n\n                                case Key.end:\n                                    var index = focusableCommands.length - 1;\n                                    targetCommand = focusableCommands[index].winControl.lastElementFocus;\n                                    break;\n                            }\n                        }\n\n                        if (targetCommand && targetCommand !== _Global.document.activeElement) {\n                            targetCommand.focus();\n                            // Prevent default so that the browser doesn't also evaluate the keydown event on the newly focused element.\n                            event.preventDefault();\n                        }\n                    }\n                },\n                commandsUpdated: function _AppBarCommandsLayout_commandsUpdated(newSetOfVisibleCommands) {\n                    // Whenever new commands are set or existing commands are hiding/showing in the AppBar, this\n                    // function is called to update the cached width measurement of all visible AppBarCommands.\n\n                    var visibleCommands = (newSetOfVisibleCommands) ? newSetOfVisibleCommands : this.commandsInOrder.filter(function (command) {\n                        return !command.hidden;\n                    });\n                    this._fullSizeWidthOfLastKnownVisibleCommands = this._getWidthOfFullSizeCommands(visibleCommands);\n                },\n                beginAnimateCommands: function _AppBarCommandsLayout_beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands) {\n                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.\n                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.\n                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide.\n                    // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide.\n\n                    this._scaleAfterAnimations = false;\n\n                    // Determine if the overall width of visible commands in the primary row will be increasing OR decreasing.\n                    var changeInWidth = this._getWidthOfFullSizeCommands(showCommands) - this._getWidthOfFullSizeCommands(hideCommands);\n                    if (changeInWidth > 0) {\n                        // Width of contents is going to increase, update our command counts now, to what they will be after we complete the animations.\n                        var visibleCommandsAfterAnimations = otherVisibleCommands.concat(showCommands);\n                        this.commandsUpdated(visibleCommandsAfterAnimations);\n                        // Make sure we will have enough room to fit everything on a single row.\n                        this.scale();\n                    } else if (changeInWidth < 0) {\n                        // Width of contents is going to decrease. Once animations are complete, check if\n                        // there is enough available space to make the remaining commands full size.\n                        this._scaleAfterAnimations = true;\n                    }\n                },\n                endAnimateCommands: function _AppBarCommandsLayout_endAnimateCommands() {\n                    if (this._scaleAfterAnimations) {\n                        this.commandsUpdated();\n                        this.scale();\n                    }\n                },\n                resize: function _AppBarCommandsLayout_resize() {\n                    if (!this._disposed) {\n                        // Check for horizontal window resizes.\n                        this._appBarTotalKnownWidth = null;\n                        if (this.appBarEl.winControl.opened) {\n                            this.scale();\n                        }\n                    }\n                },\n                disconnect: function _AppBarCommandsLayout_disconnect() {\n                    exports._AppBarBaseLayout.prototype.disconnect.call(this);\n                },\n                _getWidthOfFullSizeCommands: function _AppBarCommandsLayout_getWidthOfFullSizeCommands(commands) {\n                    // Commands layout puts primary commands and secondary commands into the primary row.\n                    // Return the total width of all visible primary and secondary commands as if they were full-size.\n\n                    // Perform any pending measurements on \"content\" type AppBarCommands.\n                    if (this._needToMeasureNewCommands) {\n                        this._measureContentCommands();\n                    }\n                    var accumulatedWidth = 0;\n                    var separatorsCount = 0;\n                    var buttonsCount = 0;\n\n                    if (!commands) {\n                        // Return the cached full size width of the last known visible commands in the AppBar.\n                        return this._fullSizeWidthOfLastKnownVisibleCommands;\n                    } else {\n                        // Return the width of the specified commands.\n                        var command;\n                        for (var i = 0, len = commands.length; i < len; i++) {\n                            command = commands[i].winControl || commands[i];\n                            if (command._type === _Constants.typeSeparator) {\n                                separatorsCount++;\n                            } else if (command._type !== _Constants.typeContent) {\n                                // button, toggle, and flyout types all have the same width.\n                                buttonsCount++;\n                            } else {\n                                accumulatedWidth += command._fullSizeWidth;\n                            }\n                        }\n                    }\n                    return accumulatedWidth += (separatorsCount * _Constants.separatorWidth) + (buttonsCount * _Constants.buttonWidth);\n                },\n                _getFocusableCommandsInLogicalOrder: function _AppBarCommandsLayout_getCommandsInLogicalOrder() {\n                    // Function returns an array of all the contained AppBarCommands which are reachable by left/right arrows.\n\n                    var secondaryCommands = this._secondaryCommands.children,\n                        primaryCommands = this._primaryCommands.children,\n                        focusedIndex = -1;\n\n                    var getFocusableCommandsHelper = function (commandsInReach) {\n                        var focusableCommands = [];\n                        for (var i = 0, len = commandsInReach.length; i < len; i++) {\n                            var element = commandsInReach[i];\n                            if (_ElementUtilities.hasClass(element, _Constants.appBarCommandClass) && element.winControl) {\n                                var containsFocus = element.contains(_Global.document.activeElement);\n                                // With the inclusion of content type commands, it may be possible to tab to elements in AppBarCommands that are not reachable by arrow keys.\n                                // Regardless, when an AppBarCommand contains the element with focus, we just include the whole command so that we can determine which\n                                // commands are adjacent to it when looking for the next focus destination.\n                                if (element.winControl._isFocusable() || containsFocus) {\n                                    focusableCommands.push(element);\n                                    if (containsFocus) {\n                                        focusedIndex = focusableCommands.length - 1;\n                                    }\n                                }\n                            }\n                        }\n                        return focusableCommands;\n                    };\n\n                    // Determines which set of commands the user could potentially reach through Home, End, and arrow keys.\n                    // All commands in the commands layout AppBar, from left to right are in reach. Secondary (previously known as Selection)\n                    // then Primary (previously known as Global).\n                    var commandsInReach = Array.prototype.slice.call(secondaryCommands).concat(Array.prototype.slice.call(primaryCommands));\n\n                    var focusableCommands = getFocusableCommandsHelper(commandsInReach);\n                    focusableCommands.focusedIndex = focusedIndex;\n                    return focusableCommands;\n                },\n                _commandLayoutsInit: function _AppBarCommandsLayout_commandLayoutsInit() {\n                    // Create layout infrastructure\n                    this._primaryCommands = _Global.document.createElement(\"DIV\");\n                    this._secondaryCommands = _Global.document.createElement(\"DIV\");\n                    _ElementUtilities.addClass(this._primaryCommands, _Constants.primaryCommandsClass);\n                    _ElementUtilities.addClass(this._secondaryCommands, _Constants.secondaryCommandsClass);\n                },\n                _scaleHelper: function _AppBarCommandsLayout_scaleHelper() {\n                    // This exists as a single line function so that unit tests can\n                    // overwrite it since they can't resize the WWA window.\n\n                    // It is expected that AppBar is an immediate child of the <body> and will have 100% width.\n                    // We measure the clientWidth of the documentElement so that we can scale the AppBar lazily\n                    // even while its element is display: 'none'\n                    var extraPadding = this.appBarEl.winControl.closedDisplayMode === \"minimal\" ? _Constants.appBarInvokeButtonWidth : 0;\n                    return _Global.document.documentElement.clientWidth - extraPadding;\n                },\n                _measureContentCommands: function _AppBarCommandsLayout_measureContentCommands() {\n                    // AppBar measures the width of content commands when they are first added\n                    // and then caches that value to avoid additional layouts in the future.\n\n                    // Can't measure unless We're in the document body\n                    if (_Global.document.body.contains(this.appBarEl)) {\n                        this._needToMeasureNewCommands = false;\n\n                        var hadHiddenClass = _ElementUtilities.hasClass(this.appBarEl, \"win-navbar-closed\");\n                        _ElementUtilities.removeClass(this.appBarEl, \"win-navbar-closed\");\n\n                        // Make sure AppBar and children have width dimensions.\n                        var prevAppBarDisplay = this.appBarEl.style.display;\n                        this.appBarEl.style.display = \"\";\n                        var prevCommandDisplay;\n\n                        var contentElements = this.appBarEl.querySelectorAll(\"div.\" + _Constants.appBarCommandClass);\n                        var element;\n                        for (var i = 0, len = contentElements.length; i < len; i++) {\n                            element = contentElements[i];\n                            if (element.winControl && element.winControl._type === _Constants.typeContent) {\n                                // Make sure command has width dimensions before we measure.\n                                prevCommandDisplay = element.style.display;\n                                element.style.display = \"\";\n                                element.winControl._fullSizeWidth = _ElementUtilities.getTotalWidth(element) || 0;\n                                element.style.display = prevCommandDisplay;\n                            }\n                        }\n\n                        // Restore state to AppBar.\n                        this.appBarEl.style.display = prevAppBarDisplay;\n                        if (hadHiddenClass) {\n                            _ElementUtilities.addClass(this.appBarEl, \"win-navbar-closed\");\n                        }\n\n                        this.commandsUpdated();\n                    }\n                },\n            });\n            return _AppBarCommandsLayout;\n        }),\n    });\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _AppBarMenuLayout: _Base.Namespace._lazy(function () {\n            var layoutClassName = _Constants.menuLayoutClass;\n            var layoutType = _Constants.appBarLayoutMenu;\n\n            //\n            // Resize animation\n            //  The resize animation requires 2 animations to run simultaneously in sync with each other. It's implemented\n            //  without PVL because PVL doesn't provide a way to guarantee that 2 animations will start at the same time.\n            //\n            var transformNames = _BaseUtils._browserStyleEquivalents[\"transform\"];\n            function transformWithTransition(element, transition) {\n                // transition's properties:\n                // - duration: Number representing the duration of the animation in milliseconds.\n                // - timing: String representing the CSS timing function that controls the progress of the animation.\n                // - to: The value of *element*'s transform property after the animation.\n                var duration = transition.duration * _TransitionAnimation._animationFactor;\n                var transitionProperty = _BaseUtils._browserStyleEquivalents[\"transition\"].scriptName;\n                element.style[transitionProperty] = duration + \"ms \" + transformNames.cssName + \" \" + transition.timing;\n                element.style[transformNames.scriptName] = transition.to;\n\n                var finish;\n                return new Promise(function (c) {\n                    var onTransitionEnd = function (eventObject) {\n                        if (eventObject.target === element && eventObject.propertyName === transformNames.cssName) {\n                            finish();\n                        }\n                    };\n\n                    var didFinish = false;\n                    finish = function () {\n                        if (!didFinish) {\n                            _Global.clearTimeout(timeoutId);\n                            element.removeEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], onTransitionEnd);\n                            element.style[transitionProperty] = \"\";\n                            didFinish = true;\n                        }\n                        c();\n                    };\n\n                    // Watch dog timeout\n                    var timeoutId = _Global.setTimeout(function () {\n                        timeoutId = _Global.setTimeout(finish, duration);\n                    }, 50);\n\n                    element.addEventListener(_BaseUtils._browserEventEquivalents[\"transitionEnd\"], onTransitionEnd);\n                }, function () {\n                    finish(); // On cancelation, complete the promise successfully to match PVL\n                });\n            }\n            // See resizeTransition's comment for documentation on *args*.\n            function growTransition(elementClipper, element, args) {\n                var diff = args.anchorTrailingEdge ? args.to.total - args.from.total : args.from.total - args.to.total;\n                var translate = args.dimension === \"width\" ? \"translateX\" : \"translateY\";\n                var size = args.dimension;\n                var duration = args.duration || 367;\n                var timing = args.timing || \"cubic-bezier(0.1, 0.9, 0.2, 1)\";\n\n                // Set up\n                elementClipper.style[size] = args.to.total + \"px\";\n                elementClipper.style[transformNames.scriptName] = translate + \"(\" + diff + \"px)\";\n                element.style[size] = args.to.content + \"px\";\n                element.style[transformNames.scriptName] = translate + \"(\" + -diff + \"px)\";\n\n                // Resolve styles\n                _Global.getComputedStyle(elementClipper).opacity;\n                _Global.getComputedStyle(element).opacity;\n\n                // Animate\n                var transition = {\n                    duration: duration,\n                    timing: timing,\n                    to: \"\"\n                };\n                return Promise.join([\n                    transformWithTransition(elementClipper,  transition),\n                    transformWithTransition(element, transition)\n                ]);\n            }\n            // See resizeTransition's comment for documentation on *args*.\n            function shrinkTransition(elementClipper, element, args) {\n                var diff = args.anchorTrailingEdge ? args.from.total - args.to.total : args.to.total - args.from.total;\n                var translate = args.dimension === \"width\" ? \"translateX\" : \"translateY\";\n                var duration = args.duration || 367;\n                var timing = args.timing || \"cubic-bezier(0.1, 0.9, 0.2, 1)\";\n\n                // Set up\n                elementClipper.style[transformNames.scriptName] = \"\";\n                element.style[transformNames.scriptName] = \"\";\n\n                // Resolve styles\n                _Global.getComputedStyle(elementClipper).opacity;\n                _Global.getComputedStyle(element).opacity;\n\n                // Animate\n                var transition = {\n                    duration: duration,\n                    timing: timing\n                };\n                var clipperTransition = _BaseUtils._merge(transition, { to: translate + \"(\" + diff + \"px)\" });\n                var elementTransition = _BaseUtils._merge(transition, { to: translate + \"(\" + -diff + \"px)\" });\n                return Promise.join([\n                    transformWithTransition(elementClipper, clipperTransition),\n                    transformWithTransition(element, elementTransition)\n                ]);\n            }\n            // Plays an animation which makes an element look like it is resizing in 1 dimension. Arguments:\n            // - elementClipper: The parent of *element*. It shouldn't have any margin, border, or padding and its\n            //   size should match element's size. Its purpose is to clip *element* during the animation to give\n            //   it the illusion that it is resizing.\n            // - element: The element that should look like it's resizing.\n            // - args: An object with the following required properties:\n            //   - from: An object representing the old width/height of the element.\n            //   - to: An object representing the new width/height of the element.\n            //     from/to are objects of the form { content: number; total: number; }. \"content\" is the\n            //     width/height of *element*'s content box (e.g. getContentWidth). \"total\" is the width/height\n            //     of *element*'s margin box (e.g. getTotalWidth).\n            //   - duration: The CSS transition duration property.\n            //   - timing: The CSS transition timing property.\n            //   - dimension: The dimension on which *element* is resizing. Either \"width\" or \"height\".\n            //   - anchorTrailingEdge: During the resize animation, one edge will move and the other edge will\n            //     remain where it is. This flag specifies which edge is anchored (i.e. won't move).\n            //\n            function resizeTransition(elementClipper, element, args) {\n                if (args.to.total > args.from.total) {\n                    return growTransition(elementClipper, element, args);\n                } else if (args.to.total < args.from.total) {\n                    return shrinkTransition(elementClipper, element, args);\n                } else {\n                    return Promise.as();\n                }\n            }\n\n            var _AppBarMenuLayout = _Base.Class.derive(exports._AppBarBaseLayout, function _AppBarMenuLayout_ctor(appBarEl) {\n                exports._AppBarBaseLayout.call(this, appBarEl, { _className: layoutClassName, _type: layoutType });\n                this._tranformNames = _BaseUtils._browserStyleEquivalents[\"transform\"];\n                this._animationCompleteBound = this._animationComplete.bind(this);\n                this._positionToolBarBound = this._positionToolBar.bind(this);\n            }, {\n                commandsInOrder: {\n                    get: function _AppBarMenuLayout_get_commandsInOrder() {\n                        return this._originalCommands;\n                    }\n                },\n                layout: function _AppBarMenuLayout_layout(commands) {\n                    this._writeProfilerMark(\"layout,info\");\n\n                    commands = commands || [];\n                    this._originalCommands = [];\n\n                    var that = this;\n                    commands.forEach(function (command) {\n                        that._originalCommands.push(that.sanitizeCommand(command));\n                    });\n                    this._displayedCommands = this._originalCommands.slice(0);\n\n                    if (this._menu) {\n                        _ElementUtilities.empty(this._menu);\n                    } else {\n                        this._menu = _Global.document.createElement(\"div\");\n                        _ElementUtilities.addClass(this._menu, _Constants.menuContainerClass);\n                    }\n                    this.appBarEl.appendChild(this._menu);\n\n                    this._toolbarEl = _Global.document.createElement(\"div\");\n                    this._menu.appendChild(this._toolbarEl);\n\n                    this._createToolBar(commands);\n                },\n\n                showCommands: function _AppBarMenuLayout_showCommands(commands) {\n                    var elements = this._getCommandsElements(commands);\n                    var data = [];\n                    var newDisplayedCommands = [];\n                    var that = this;\n                    this._originalCommands.forEach(function (command) {\n                        if (elements.indexOf(command.element) >= 0 || that._displayedCommands.indexOf(command) >= 0) {\n                            newDisplayedCommands.push(command);\n                            data.push(command);\n                        }\n                    });\n                    this._displayedCommands = newDisplayedCommands;\n                    this._updateData(data);\n                },\n\n                showOnlyCommands: function _AppBarMenuLayout_showOnlyCommands(commands) {\n                    this._displayedCommands = [];\n                    this.showCommands(commands);\n                },\n\n                hideCommands: function _AppBarMenuLayout_hideCommands(commands) {\n                    var elements = this._getCommandsElements(commands);\n                    var data = [];\n                    var newDisplayedCommands = [];\n                    var that = this;\n                    this._originalCommands.forEach(function (command) {\n                        if (elements.indexOf(command.element) === -1 && that._displayedCommands.indexOf(command) >= 0) {\n                            newDisplayedCommands.push(command);\n                            data.push(command);\n                        }\n                    });\n                    this._displayedCommands = newDisplayedCommands;\n                    this._updateData(data);\n                },\n\n                connect: function _AppBarMenuLayout_connect(appBarEl) {\n                    this._writeProfilerMark(\"connect,info\");\n\n                    exports._AppBarBaseLayout.prototype.connect.call(this, appBarEl);\n                    this._id = _ElementUtilities._uniqueID(appBarEl);\n                },\n\n                resize: function _AppBarMenuLayout_resize() {\n                    this._writeProfilerMark(\"resize,info\");\n\n                    if (this._initialized) {\n                        this._forceLayoutPending = true;\n                    }\n                },\n\n                positionChanging: function _AppBarMenuLayout_positionChanging(fromPosition, toPosition) {\n                    this._writeProfilerMark(\"positionChanging from:\" + fromPosition + \" to: \" + toPosition + \",info\");\n\n                    this._animationPromise = this._animationPromise || Promise.wrap();\n\n                    if (this._animating) {\n                        this._animationPromise.cancel();\n                    }\n\n                    this._animating = true;\n                    if (toPosition === \"shown\" || (fromPosition !== \"shown\" && toPosition === \"compact\")) {\n                        this._positionToolBar();\n                        this._animationPromise = this._animateToolBarEntrance();\n                    } else {\n                        if (fromPosition === \"minimal\" || fromPosition === \"compact\" || fromPosition === \"hidden\") {\n                            this._animationPromise = Promise.wrap();\n                        } else {\n                            this._animationPromise = this._animateToolBarExit();\n                        }\n                    }\n                    this._animationPromise.then(this._animationCompleteBound, this._animationCompleteBound);\n                    return this._animationPromise;\n                },\n\n                disposeChildren: function _AppBarMenuLayout_disposeChildren() {\n                    this._writeProfilerMark(\"disposeChildren,info\");\n\n                    if (this._toolbar) {\n                        _Dispose.disposeSubTree(this._toolbarEl);\n                    }\n                    this._originalCommands = [];\n                    this._displayedCommands = [];\n                },\n\n                setFocusOnShow: function _AppBarMenuLayout_setFocusOnShow() {\n                    // Make sure the menu (used for clipping during the resize animation)\n                    // doesn't scroll when we give focus to the AppBar.\n                    this.appBarEl.winControl._setFocusToAppBar(true, this._menu);\n                },\n\n                _updateData: function _AppBarMenuLayout_updateData(data) {\n                    var hadHiddenClass = _ElementUtilities.hasClass(this.appBarEl, \"win-navbar-closed\");\n                    var hadShownClass = _ElementUtilities.hasClass(this.appBarEl, \"win-navbar-opened\");\n                    _ElementUtilities.removeClass(this.appBarEl, \"win-navbar-closed\");\n\n                    // Make sure AppBar and children have width dimensions.\n                    var prevAppBarDisplay = this.appBarEl.style.display;\n                    this.appBarEl.style.display = \"\";\n\n\n                    this._toolbar.data = new BindingList.List(data);\n                    if (hadHiddenClass) {\n                        this._positionToolBar();\n                    }\n\n                    // Restore state to AppBar.\n                    this.appBarEl.style.display = prevAppBarDisplay;\n                    if (hadHiddenClass) {\n                        _ElementUtilities.addClass(this.appBarEl, \"win-navbar-closed\");\n                    }\n\n                    if (hadShownClass) {\n                        this._positionToolBar();\n                        this._animateToolBarEntrance();\n                    }\n                },\n\n                _getCommandsElements: function _AppBarMenuLayout_getCommandsElements(commands) {\n                    if (!commands) {\n                        return [];\n                    }\n\n                    if (typeof commands === \"string\" || !commands || !commands.length) {\n                        commands = [commands];\n                    }\n\n                    var elements = [];\n                    for (var i = 0, len = commands.length; i < len; i++) {\n                        if (commands[i]) {\n                            if (typeof commands[i] === \"string\") {\n                                var element = _Global.document.getElementById(commands[i]);\n                                if (element) {\n                                    elements.push(element);\n                                } else {\n                                    // Check in the list we are tracking, since it might not be in the DOM yet\n                                    for (var j = 0, len2 = this._originalCommands.length; j < len2; j++) {\n                                        var element = this._originalCommands[j].element;\n                                        if (element.id === commands[i]) {\n                                            elements.push(element);\n                                        }\n                                    }\n                                }\n                            } else if (commands[i].element) {\n                                elements.push(commands[i].element);\n                            } else {\n                                elements.push(commands[i]);\n                            }\n                        }\n                    }\n\n                    return elements;\n                },\n\n                _animationComplete: function _AppBarMenuLayout_animationComplete() {\n                    if (!this._disposed) {\n                        this._animating = false;\n                    }\n                },\n\n                _createToolBar: function _AppBarMenuLayout_createToolBar(commands) {\n                    this._writeProfilerMark(\"_createToolBar,info\");\n\n                    var hadHiddenClass = _ElementUtilities.hasClass(this.appBarEl, \"win-navbar-closed\");\n                    _ElementUtilities.removeClass(this.appBarEl, \"win-navbar-closed\");\n\n                    // Make sure AppBar and children have width dimensions.\n                    var prevAppBarDisplay = this.appBarEl.style.display;\n                    this.appBarEl.style.display = \"\";\n\n                    this._toolbar = new ToolBar.ToolBar(this._toolbarEl, {\n                        data: new BindingList.List(this._originalCommands),\n                        shownDisplayMode: 'full',\n                    });\n\n                    var that = this;\n                    this._appbarInvokeButton = this.appBarEl.querySelector(\".\" + _Constants.invokeButtonClass);\n                    this._overflowButton = this._toolbarEl.querySelector(\".\" + _ToolBarConstants.overflowButtonCssClass);\n                    this._overflowButton.addEventListener(\"click\", function () {\n                        that._appbarInvokeButton.click();\n                    });\n\n                    this._positionToolBar();\n\n                    // Restore state to AppBar.\n                    this.appBarEl.style.display = prevAppBarDisplay;\n                    if (hadHiddenClass) {\n                        _ElementUtilities.addClass(this.appBarEl, \"win-navbar-closed\");\n                    }\n                },\n\n                _positionToolBar: function _AppBarMenuLayout_positionToolBar() {\n                    if (!this._disposed) {\n                        this._writeProfilerMark(\"_positionToolBar,info\");\n                        this._initialized = true;\n                    }\n                },\n\n                _animateToolBarEntrance: function _AppBarMenuLayout_animateToolBarEntrance() {\n                    this._writeProfilerMark(\"_animateToolBarEntrance,info\");\n\n                    if (this._forceLayoutPending) {\n                        this._forceLayoutPending = false;\n                        this._toolbar.forceLayout();\n                        this._positionToolBar();\n                    }\n                    var heightVisible = this._isMinimal() ? 0 : this.appBarEl.offsetHeight;\n                    if (this._isBottom()) {\n                        // Bottom AppBar Animation\n                        var offsetTop = this._menu.offsetHeight - heightVisible;\n                        return this._executeTranslate(this._menu, \"translateY(\" + -offsetTop + \"px)\");\n                    } else {\n                        // Top AppBar Animation\n                        return resizeTransition(this._menu, this._toolbarEl, {\n                            from: { content: heightVisible, total: heightVisible },\n                            to: { content: this._menu.offsetHeight, total: this._menu.offsetHeight },\n                            dimension: \"height\",\n                            duration: 400,\n                            timing: \"ease-in\",\n                        });\n                    }\n                },\n\n                _animateToolBarExit: function _AppBarMenuLayout_animateToolBarExit() {\n                    this._writeProfilerMark(\"_animateToolBarExit,info\");\n\n                    var heightVisible = this._isMinimal() ? 0 : this.appBarEl.offsetHeight;\n                    if (this._isBottom()) {\n                        return this._executeTranslate(this._menu, \"none\");\n                    } else {\n                        // Top AppBar Animation\n                        return resizeTransition(this._menu, this._toolbarEl, {\n                            from: { content: this._menu.offsetHeight, total: this._menu.offsetHeight },\n                            to: { content: heightVisible, total: heightVisible },\n                            dimension: \"height\",\n                            duration: 400,\n                            timing: \"ease-in\",\n                        });\n                    }\n                },\n\n                _executeTranslate: function _AppBarMenuLayout_executeTranslate(element, value) {\n                    return _TransitionAnimation.executeTransition(element,\n                        {\n                            property: this._tranformNames.cssName,\n                            delay: 0,\n                            duration: 400,\n                            timing: \"ease-in\",\n                            to: value\n                        });\n                },\n\n                _isMinimal: function _AppBarMenuLayout_isMinimal() {\n                    return this.appBarEl.winControl.closedDisplayMode === \"minimal\";\n                },\n\n                _isBottom: function _AppBarMenuLayout_isBottom() {\n                    return this.appBarEl.winControl.placement === \"bottom\";\n                },\n\n                _writeProfilerMark: function _AppBarMenuLayout_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI._AppBarMenuLayout:\" + this._id + \":\" + text);\n                }\n            });\n\n            return _AppBarMenuLayout;\n        }),\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// _LegacyAppBar\n/// <dictionary>appbar,appBars,Flyout,Flyouts,iframe,Statics,unfocus,WinJS</dictionary>\ndefine('WinJS/Controls/_LegacyAppBar',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../Promise',\n    '../Scheduler',\n    '../_LightDismissService',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_KeyboardBehavior',\n    './_LegacyAppBar/_Constants',\n    './_LegacyAppBar/_Layouts',\n    './AppBar/_Command',\n    './AppBar/_Icon',\n    './Flyout/_Overlay',\n    '../Application'\n], function appBarInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, Promise, Scheduler, _LightDismissService, _Control, _Dispose, _ElementUtilities, _Hoverable, _KeyboardBehavior, _Constants, _Layouts, _Command, _Icon, _Overlay, Application) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI._LegacyAppBar\">\n        /// Represents an application toolbar for display commands.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.appbar.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.appbar.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI._LegacyAppBar\">\n        /// <button data-win-control=\"WinJS.UI.AppBarCommand\" data-win-options=\"{id:'',label:'example',icon:'back',type:'button',onclick:null,section:'primary'}\"></button>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"beforeopen\" locid=\"WinJS.UI._LegacyAppBar_e:beforeopen\">Raised just before showing the _LegacyAppBar.</event>\n        /// <event name=\"afteropen\" locid=\"WinJS.UI._LegacyAppBar_e:afteropen\">Raised immediately after the _LegacyAppBar is fully shown.</event>\n        /// <event name=\"beforeclose\" locid=\"WinJS.UI._LegacyAppBar_e:beforeclose\">Raised just before hiding the _LegacyAppBar.</event>\n        /// <event name=\"afterclose\" locid=\"WinJS.UI._LegacyAppBar_e:afterclose\">Raised immediately after the _LegacyAppBar is fully hidden.</event>\n        /// <part name=\"appbar\" class=\"win-commandlayout\" locid=\"WinJS.UI._LegacyAppBar_part:appbar\">The _LegacyAppBar control itself.</part>\n        /// <part name=\"appBarCustom\" class=\"win-navbar\" locid=\"WinJS.UI._LegacyAppBar_part:appBarCustom\">Style for a custom layout _LegacyAppBar.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        _LegacyAppBar: _Base.Namespace._lazy(function () {\n            var EVENTS = {\n                beforeOpen: \"beforeopen\",\n                afterOpen: \"afteropen\",\n                beforeClose: \"beforeclose\",\n                afterClose: \"afterclose\",\n            };\n\n            var createEvent = _Events._createEventProperty;\n\n            // Enum of known constant pixel values for display modes.\n            var knownVisibleHeights = {\n                none: 0,\n                hidden: 0,\n                minimal: 25,\n                compact: 48\n            };\n\n            // Maps each notion of a display modes to the corresponding visible position\n            var displayModeVisiblePositions = {\n                none: \"hidden\",\n                hidden: \"hidden\",\n                minimal: \"minimal\",\n                shown: \"shown\",\n                compact: \"compact\"\n            };\n\n            // Enum of closedDisplayMode constants\n            var closedDisplayModes = {\n                none: \"none\",\n                minimal: \"minimal\",\n                compact: \"compact\"\n            };\n\n            // Constants shown/hidden states\n            var appbarShownState = \"shown\",\n                appbarHiddenState = \"hidden\";\n\n            // Hook into event\n            var globalEventsInitialized = false;\n\n            function _allManipulationChanged(event) {\n                var elements = _Global.document.querySelectorAll(\".\" + _Constants.appBarClass);\n                if (elements) {\n                    var len = elements.length;\n                    for (var i = 0; i < len; i++) {\n                        var element = elements[i];\n                        var appbar = element.winControl;\n                        if (appbar && !element.disabled) {\n                            appbar._manipulationChanged(event);\n                        }\n                    }\n                }\n            }\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/appBarAriaLabel\").value; },\n                get requiresCommands() { return \"Invalid argument: commands must not be empty\"; },\n                get cannotChangePlacementWhenVisible() { return \"Invalid argument: The placement property cannot be set when the AppBar is visible, call hide() first\"; },\n                get cannotChangeLayoutWhenVisible() { return \"Invalid argument: The layout property cannot be set when the AppBar is visible, call hide() first\"; }\n            };\n\n            var _LegacyAppBar = _Base.Class.derive(_Overlay._Overlay, function _LegacyAppBar_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar._LegacyAppBar\">\n                /// <summary locid=\"WinJS.UI._LegacyAppBar.constructor\">\n                /// Creates a new _LegacyAppBar control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI._LegacyAppBar.constructor_p:element\">\n                /// The DOM element that will host the control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI._LegacyAppBar.constructor_p:options\">\n                /// The set of properties and values to apply to the new _LegacyAppBar control.\n                /// </param>\n                /// <returns type=\"WinJS.UI._LegacyAppBar\" locid=\"WinJS.UI._LegacyAppBar.constructor_returnValue\">\n                /// The new _LegacyAppBar control.\n                /// </returns>\n                /// </signature>\n\n                this._initializing = true;\n\n                // Simplify checking later\n                options = options || {};\n\n                // Make sure there's an element\n                this._element = element || _Global.document.createElement(\"div\");\n                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                // Attach our css class.\n                _ElementUtilities.addClass(this._element, _Constants.appBarClass);\n                \n                var that = this;\n                this._dismissable = new _LightDismissService.LightDismissableElement({\n                    element: this._element,\n                    tabIndex: this._element.hasAttribute(\"tabIndex\") ? this._element.tabIndex : -1,\n                    onLightDismiss: function () {\n                        that.close();\n                    },\n                    onTakeFocus: function (useSetActive) {\n                        if (!that._dismissable.restoreFocus()) {\n                            that._layoutImpl.setFocusOnShow();\n                        }\n                    },\n                });\n\n                // Make sure we have an ARIA role\n                var role = this._element.getAttribute(\"role\");\n                if (!role) {\n                    this._element.setAttribute(\"role\", \"menubar\");\n                }\n                var label = this._element.getAttribute(\"aria-label\");\n                if (!label) {\n                    this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                }\n\n                // Call the _Overlay constructor helper to finish setting up our element.\n                // Don't pass constructor options, _LegacyAppBar needs to set those itself specific order.\n                this._baseOverlayConstructor(this._element);\n\n                // Start off hidden\n                this._lastPositionVisited = displayModeVisiblePositions.none;\n                _ElementUtilities.addClass(this._element, _Constants.hiddenClass);\n\n                // Add Invoke button.\n                this._invokeButton = _Global.document.createElement(\"button\");\n                this._invokeButton.tabIndex = 0;\n                this._invokeButton.setAttribute(\"type\", \"button\");\n                this._invokeButton.innerHTML = \"<span class='\" + _Constants.ellipsisClass + \"'></span>\";\n                _ElementUtilities.addClass(this._invokeButton, _Constants.invokeButtonClass);\n                this._element.appendChild(this._invokeButton);\n                this._invokeButton.addEventListener(\"click\", function () {\n                    if (that.opened) {\n                        that._hide();\n                    } else {\n                        that._show();\n                    }\n                }, false);\n\n                // Run layout setter immediately. We need to know our layout in order to correctly\n                // position any commands that may be getting set through the constructor.\n                this._layout = _Constants.appBarLayoutCustom;\n                delete options._layout;\n\n                // Need to set placement before closedDisplayMode, closedDisplayMode sets our starting position, which is dependant on placement.\n                this.placement = options.placement || _Constants.appBarPlacementBottom;\n                this.closedDisplayMode = options.closedDisplayMode || closedDisplayModes.compact;\n\n                _Control.setOptions(this, options);\n\n                var commandsUpdatedBound = this._commandsUpdated.bind(this);\n                this._element.addEventListener(_Constants.commandVisibilityChanged, function (ev) {\n                    if (that._disposed) {\n                        return;\n                    }\n                    if (that.opened) {\n                        ev.preventDefault();\n                    }\n                    commandsUpdatedBound();\n                });\n\n                this._initializing = false;\n\n                this._setFocusToAppBarBound = this._setFocusToAppBar.bind(this);\n\n                // Handle key down (left & right)\n                this._element.addEventListener(\"keydown\", this._handleKeyDown.bind(this), false);\n\n                // Attach global event handlers\n                if (!globalEventsInitialized) {\n                    // Need to know if the IHM is done scrolling\n                    _Global.document.addEventListener(\"MSManipulationStateChanged\", _allManipulationChanged, false);\n\n                    globalEventsInitialized = true;\n                }\n\n                if (this.closedDisplayMode === closedDisplayModes.none && this.layout === _Constants.appBarLayoutCommands) {\n                    // Remove the commands layout _LegacyAppBar from the layout tree at this point so we don't cause unnecessary layout costs whenever\n                    // the window resizes or when CSS changes are applied to the commands layout _LegacyAppBar's parent element.\n                    this._element.style.display = \"none\";\n                }\n\n                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._element);\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n\n                return this;\n            }, {\n                // Public Properties\n\n                /// <field type=\"String\" defaultValue=\"bottom\" oamOptionsDatatype=\"WinJS.UI._LegacyAppBar.placement\" locid=\"WinJS.UI._LegacyAppBar.placement\" helpKeyword=\"WinJS.UI._LegacyAppBar.placement\">The placement of the _LegacyAppBar on the display.  Values are \"top\" or \"bottom\".</field>\n                placement: {\n                    get: function _LegacyAppBar_get_placement() {\n                        return this._placement;\n                    },\n                    set: function _LegacyAppBar_set_placement(value) {\n                        // In designer we may have to move it\n                        var wasShown = false;\n                        if (_WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {\n                            this._hide();\n                            wasShown = true;\n                        }\n\n                        if (this.opened) {\n                            throw new _ErrorFromName(\"WinJS.UI._LegacyAppBar.CannotChangePlacementWhenVisible\", strings.cannotChangePlacementWhenVisible);\n                        }\n\n                        // Set placement, coerce invalid values to 'bottom'\n                        this._placement = (value === _Constants.appBarPlacementTop) ? _Constants.appBarPlacementTop : _Constants.appBarPlacementBottom;\n\n                        // Clean up win-top, win-bottom styles\n                        if (this._placement === _Constants.appBarPlacementTop) {\n                            _ElementUtilities.addClass(this._element, _Constants.topClass);\n                            _ElementUtilities.removeClass(this._element, _Constants.bottomClass);\n                        } else if (this._placement === _Constants.appBarPlacementBottom) {\n                            _ElementUtilities.removeClass(this._element, _Constants.topClass);\n                            _ElementUtilities.addClass(this._element, _Constants.bottomClass);\n                        }\n\n                        // Update our position on screen.\n                        this._ensurePosition();\n                        if (wasShown) {\n                            // Show again if we hid ourselves for the designer\n                            this._show();\n                        }\n                    }\n                },\n\n                _layout: {\n                    get: function _LegacyAppBar_get_layout() {\n                        return this._layoutImpl.type;\n                    },\n                    set: function (layout) {\n                        if (layout !== _Constants.appBarLayoutCommands &&\n                            layout !== _Constants.appBarLayoutCustom &&\n                            layout !== _Constants.appBarLayoutMenu) {\n                        }\n\n                        // In designer we may have to redraw it\n                        var wasShown = false;\n                        if (_WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {\n                            this._hide();\n                            wasShown = true;\n                        }\n\n                        if (this.opened) {\n                            throw new _ErrorFromName(\"WinJS.UI._LegacyAppBar.CannotChangeLayoutWhenVisible\", strings.cannotChangeLayoutWhenVisible);\n                        }\n\n                        var commands;\n                        if (!this._initializing) {\n                            // Gather commands in preparation for hand off to new layout.\n                            // We expect prev layout to return commands in the order they were set in,\n                            // not necessarily the current DOM order the layout is using.\n                            commands = this._layoutImpl.commandsInOrder;\n                            this._layoutImpl.disconnect();\n                        }\n\n                        // Set layout\n                        if (layout === _Constants.appBarLayoutCommands) {\n                            this._layoutImpl = new _Layouts._AppBarCommandsLayout();\n                        } else if (layout === _Constants.appBarLayoutMenu) {\n                            this._layoutImpl = new _Layouts._AppBarMenuLayout();\n                        } else {\n                            // Custom layout uses Base _LegacyAppBar Layout class.\n                            this._layoutImpl = new _Layouts._AppBarBaseLayout();\n                        }\n                        this._layoutImpl.connect(this._element);\n\n                        if (commands && commands.length) {\n                            // Reset _LegacyAppBar since layout changed.\n                            this._layoutCommands(commands);\n                        }\n\n                        // Show again if we hid ourselves for the designer\n                        if (wasShown) {\n                            this._show();\n                        }\n                    },\n                    configurable: true\n                },\n\n                /// <field type=\"Array\" locid=\"WinJS.UI._LegacyAppBar.commands\" helpKeyword=\"WinJS.UI._LegacyAppBar.commands\" isAdvanced=\"true\">\n                /// Sets the AppBarCommands in the _LegacyAppBar. This property accepts an array of AppBarCommand objects.\n                /// </field>\n                commands: {\n                    set: function _LegacyAppBar_set_commands(commands) {\n                        // Fail if trying to set when shown\n                        if (this.opened) {\n                            throw new _ErrorFromName(\"WinJS.UI._LegacyAppBar.CannotChangeCommandsWhenVisible\", _Resources._formatString(_Overlay._Overlay.commonstrings.cannotChangeCommandsWhenVisible, \"_LegacyAppBar\"));\n                        }\n\n                        // Dispose old commands before tossing them out.\n                        if (!this._initializing) {\n                            // AppBarCommands defined in markup don't want to be disposed during initialization.\n                            this._disposeChildren();\n                        }\n                        this._layoutCommands(commands);\n                    }\n                },\n\n                _layoutCommands: function _LegacyAppBar_layoutCommands(commands) {\n                    // Function precondition: _LegacyAppBar must not be shown.\n\n                    // Empties _LegacyAppBar HTML and repopulates with passed in commands.\n                    _ElementUtilities.empty(this._element);\n                    this._element.appendChild(this._invokeButton); // Keep our Show/Hide button.\n\n                    // In case they had only one command to set...\n                    if (!Array.isArray(commands)) {\n                        commands = [commands];\n                    }\n\n                    this._layoutImpl.layout(commands);\n                },\n\n                /// <field type=\"String\" defaultValue=\"compact\" locid=\"WinJS.UI._LegacyAppBar.closedDisplayMode\" helpKeyword=\"WinJS.UI._LegacyAppBar.closedDisplayMode\" isAdvanced=\"true\">\n                /// Gets/Sets how _LegacyAppBar will display itself while hidden. Values are \"none\", \"minimal\" and '\"compact\".\n                /// </field>\n                closedDisplayMode: {\n                    get: function _LegacyAppBar_get_closedDisplayMode() {\n                        return this._closedDisplayMode;\n                    },\n                    set: function _LegacyAppBar_set_closedDisplayMode(value) {\n                        var oldValue = this._closedDisplayMode;\n\n                        if (oldValue !== value) {\n\n                            // Determine if the visible position is changing. This can be used to determine if we need to delay updating closedDisplayMode related CSS classes\n                            // to avoid affecting the animation.\n                            var changeVisiblePosition = _ElementUtilities.hasClass(this._element, _Constants.hiddenClass) || _ElementUtilities.hasClass(this._element, _Constants.hidingClass);\n\n                            if (value === closedDisplayModes.none) {\n                                this._closedDisplayMode = closedDisplayModes.none;\n                                if (!changeVisiblePosition || !oldValue) {\n                                    _ElementUtilities.removeClass(this._element, _Constants.minimalClass);\n                                    _ElementUtilities.removeClass(this._element, _Constants.compactClass);\n                                }\n                            } else if (value === closedDisplayModes.minimal) {\n                                this._closedDisplayMode = closedDisplayModes.minimal;\n                                if (!changeVisiblePosition || !oldValue || oldValue === closedDisplayModes.none) {\n                                    _ElementUtilities.addClass(this._element, _Constants.minimalClass);\n                                    _ElementUtilities.removeClass(this._element, _Constants.compactClass);\n                                }\n                            } else {\n                                // Compact is default fallback.\n                                this._closedDisplayMode = closedDisplayModes.compact;\n                                _ElementUtilities.addClass(this._element, _Constants.compactClass);\n                                _ElementUtilities.removeClass(this._element, _Constants.minimalClass);\n                            }\n\n                            // The invoke button has changed the amount of available space in the _LegacyAppBar. Layout might need to scale.\n                            this._layoutImpl.resize();\n\n                            if (changeVisiblePosition) {\n                                // If the value is being set while we are not showing, change to our new position.\n                                this._changeVisiblePosition(displayModeVisiblePositions[this._closedDisplayMode]);\n                            }\n                        }\n                    },\n                },\n\n                /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI._LegacyAppBar.opened\" helpKeyword=\"WinJS.UI._LegacyAppBar.opened\">Gets or sets _LegacyAppBar's visibility.</field>\n                opened: {\n                    get: function () {\n                        // Returns true if _LegacyAppBar is not 'hidden'.\n                        return !_ElementUtilities.hasClass(this._element, _Constants.hiddenClass) &&\n                            !_ElementUtilities.hasClass(this._element, _Constants.hidingClass) &&\n                            this._doNext !== displayModeVisiblePositions.minimal &&\n                            this._doNext !== displayModeVisiblePositions.compact &&\n                            this._doNext !== displayModeVisiblePositions.none;\n                    },\n                    set: function (opened) {\n                        var currentlyOpen = this.opened;\n                        if (opened && !currentlyOpen) {\n                            this._show();\n                        } else if (!opened && currentlyOpen) {\n                            this._hide();\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI._LegacyAppBar.onbeforeopen\" helpKeyword=\"WinJS.UI._LegacyAppBar.onbeforeopen\">\n                /// Occurs immediately before the control is opened.\n                /// </field>\n                onbeforeopen: createEvent(EVENTS.beforeOpen),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI._LegacyAppBar.onafteropen\" helpKeyword=\"WinJS.UI._LegacyAppBar.onafteropen\">\n                /// Occurs immediately after the control is opened.\n                /// </field>\n                onafteropen: createEvent(EVENTS.afterOpen),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI._LegacyAppBar.onbeforeclose\" helpKeyword=\"WinJS.UI._LegacyAppBar.onbeforeclose\">\n                /// Occurs immediately before the control is closed.\n                /// </field>\n                onbeforeclose: createEvent(EVENTS.beforeClose),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI._LegacyAppBar.onafterclose\" helpKeyword=\"WinJS.UI._LegacyAppBar.onafterclose\">\n                /// Occurs immediately after the control is closed.\n                /// </field>\n                onafterclose: createEvent(EVENTS.afterClose),\n\n                getCommandById: function (id) {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar.getCommandById\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar.getCommandById\">\n                    /// Retrieves the command with the specified ID from this _LegacyAppBar.\n                    /// If more than one command is found, this method returns them all.\n                    /// </summary>\n                    /// <param name=\"id\" type=\"String\" locid=\"WinJS.UI._LegacyAppBar.getCommandById_p:id\">Id of the command to return.</param>\n                    /// <returns type=\"object\" locid=\"WinJS.UI._LegacyAppBar.getCommandById_returnValue\">\n                    /// The command found, an array of commands if more than one have the same ID, or null if no command is found.\n                    /// </returns>\n                    /// </signature>\n                    var commands = this._layoutImpl.commandsInOrder.filter(function (command) {\n                        return command.id === id || command.element.id === id;\n                    });\n\n                    if (commands.length === 1) {\n                        return commands[0];\n                    } else if (commands.length === 0) {\n                        return null;\n                    }\n\n                    return commands;\n                },\n\n                showCommands: function (commands) {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar.showCommands\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar.showCommands\">\n                    /// Show the specified commands of the _LegacyAppBar.\n                    /// </summary>\n                    /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI._LegacyAppBar.showCommands_p:commands\">\n                    /// An array of the commands to show. The array elements may be AppBarCommand objects, or the string identifiers (IDs) of commands.\n                    /// </param>\n                    /// </signature>\n                    if (!commands) {\n                        throw new _ErrorFromName(\"WinJS.UI._LegacyAppBar.RequiresCommands\", strings.requiresCommands);\n                    }\n\n                    this._layoutImpl.showCommands(commands);\n                },\n\n                hideCommands: function (commands) {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar.hideCommands\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar.hideCommands\">\n                    /// Hides the specified commands of the _LegacyAppBar.\n                    /// </summary>\n                    /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI._LegacyAppBar.hideCommands_p:commands\">Required. Command or Commands to hide, either String, DOM elements, or WinJS objects.</param>\n                    /// </signature>\n                    if (!commands) {\n                        throw new _ErrorFromName(\"WinJS.UI._LegacyAppBar.RequiresCommands\", strings.requiresCommands);\n                    }\n\n                    this._layoutImpl.hideCommands(commands);\n                },\n\n                showOnlyCommands: function (commands) {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar.showOnlyCommands\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar.showOnlyCommands\">\n                    /// Show the specified commands, hiding all of the others in the _LegacyAppBar.\n                    /// </summary>\n                    /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI._LegacyAppBar.showOnlyCommands_p:commands\">\n                    /// An array of the commands to show. The array elements may be AppBarCommand objects, or the string identifiers (IDs) of commands.\n                    /// </param>\n                    /// </signature>\n                    if (!commands) {\n                        throw new _ErrorFromName(\"WinJS.UI._LegacyAppBar.RequiresCommands\", strings.requiresCommands);\n                    }\n\n                    this._layoutImpl.showOnlyCommands(commands);\n                },\n\n                open: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar.open\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar.open\">\n                    /// Opens the _LegacyAppBar, if closed and not disabled, regardless of other state.\n                    /// </summary>\n                    /// </signature>\n                    // Just wrap the private one, turning off keyboard invoked flag\n                    this._writeProfilerMark(\"show,StartTM\");\n                    this._show();\n                },\n\n                _show: function _LegacyAppBar_show() {\n\n                    var toPosition = displayModeVisiblePositions.shown;\n                    var showing = null;\n\n                    // If we're already shown, we are just going to animate our position, not fire events or manage focus.\n                    if (!this.disabled && (_ElementUtilities.hasClass(this._element, _Constants.hiddenClass) || _ElementUtilities.hasClass(this._element, _Constants.hidingClass))) {\n                        showing = appbarShownState;\n                    }\n\n                    this._changeVisiblePosition(toPosition, showing);\n\n                    if (showing) {\n                        // Clean up tabbing behavior by making sure first and final divs are correct after showing.\n                        this._updateFirstAndFinalDiv();\n                        \n                        _LightDismissService.shown(this._dismissable);\n                    }\n                },\n\n                close: function () {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar.close\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar.close\">\n                    /// Closes the _LegacyAppBar.\n                    /// </summary>\n                    /// </signature>\n                    // Just wrap the private one\n                    this._writeProfilerMark(\"hide,StartTM\");\n                    this._hide();\n                },\n\n                _hide: function _LegacyAppBar_hide(toPosition) {\n\n                    var toPosition = toPosition || displayModeVisiblePositions[this.closedDisplayMode];\n                    var hiding = null;\n\n                    // If were already hidden, we are just going to animate our position, not fire events or manage focus again.\n                    if (!_ElementUtilities.hasClass(this._element, _Constants.hiddenClass) && !_ElementUtilities.hasClass(this._element, _Constants.hidingClass)) {\n                        hiding = appbarHiddenState;\n                    }\n\n                    this._changeVisiblePosition(toPosition, hiding);\n                },\n\n                _dispose: function _LegacyAppBar_dispose() {\n                    _Dispose.disposeSubTree(this.element);\n                    _LightDismissService.hidden(this._dismissable);\n                    this._layoutImpl.dispose();\n                    this.disabled = true;\n                    this.close();\n                },\n\n                _disposeChildren: function _LegacyAppBar_disposeChildren() {\n                    // Be purposeful about what we dispose.\n                    this._layoutImpl.disposeChildren();\n                },\n\n                _handleKeyDown: function _LegacyAppBar_handleKeyDown(event) {\n                    // On Left/Right arrow keys, moves focus to previous/next AppbarCommand element.\n\n                    // If the current active element isn't an intrinsic part of the _LegacyAppBar,\n                    // Layout might want to handle additional keys.\n                    if (!this._invokeButton.contains(_Global.document.activeElement)) {\n                        this._layoutImpl.handleKeyDown(event);\n                    }\n                },\n\n                _visiblePixels: {\n                    get: function () {\n                        // Returns object containing pixel height of each visible position\n                        return {\n                            hidden: knownVisibleHeights.hidden,\n                            minimal: knownVisibleHeights.minimal,\n                            compact: Math.max(this._heightWithoutLabels || 0, knownVisibleHeights.compact),\n                            // Element can change size as content gets added or removed or if it\n                            // experinces style changes. We have to look this up at run time.\n                            shown: this._element.offsetHeight,\n                        };\n                    }\n                },\n\n                _visiblePosition: {\n                    // Returns string value of our nearest, stationary, visible position.\n                    get: function () {\n                        // If we're animating into a new posistion, return the position we're animating into.\n                        if (this._animating && displayModeVisiblePositions[this._element.winAnimating]) {\n                            return this._element.winAnimating;\n                        } else {\n                            return this._lastPositionVisited;\n                        }\n                    }\n                },\n\n                _visible: {\n                    // Returns true if our visible position is not completely hidden, else false.\n                    get: function () {\n                        return (this._visiblePosition !== displayModeVisiblePositions.none);\n                    }\n                },\n\n                _changeVisiblePosition: function (toPosition, newState) {\n                    /// <signature helpKeyword=\"WinJS.UI._LegacyAppBar._changeVisiblePosition\">\n                    /// <summary locid=\"WinJS.UI._LegacyAppBar._changeVisiblePosition\">\n                    /// Changes the visible position of the _LegacyAppBar.\n                    /// </summary>\n                    /// <param name=\"toPosition\" type=\"String\" locid=\"WinJS.UI._LegacyAppBar._changeVisiblePosition_p:toPosition\">\n                    /// Name of the visible position we want to move to.\n                    /// </param>\n                    /// <param name=\"newState\" type=\"String\" locid=\"WinJS.UI._LegacyAppBar._changeVisiblePosition_p:newState\">\n                    /// Name of the state we are entering. Values can be \"showing\", \"hiding\" or null.\n                    /// If the value is null, then we are not changing states, only changing visible position.\n                    /// </param>\n                    /// </signature>\n\n                    if ((this._visiblePosition === toPosition && !this._keyboardObscured) ||\n                        (this.disabled && toPosition !== displayModeVisiblePositions.disabled)) {\n                        // If we want to go where we already are, or we're disabled, return false.\n                        this._afterPositionChange(null);\n                    } else if (this._animating || this._needToHandleShowingKeyboard || this._needToHandleHidingKeyboard) {\n                        // Only do one thing at a time. If we are already animating,\n                        // or the IHM is animating, schedule this for later.\n                        this._doNext = toPosition;\n                        this._afterPositionChange(null);\n                    } else {\n                        // Begin position changing sequence.\n\n                        // Set the animating flag to block any queued position changes until we're done.\n                        this._element.winAnimating = toPosition;\n                        var performAnimation = this._initializing ? false : true;\n\n                        // Assume we are animating from the last position visited.\n                        var fromPosition = this._lastPositionVisited;\n\n                        // We'll need to measure our element to determine how far we need to animate.\n                        // Make sure we have accurate dimensions.\n                        this._element.style.display = \"\";\n\n                        // Are we hiding completely, or about to become visible?\n                        var hidingCompletely = (toPosition === displayModeVisiblePositions.hidden);\n\n                        if (this._keyboardObscured) {\n                            // We're changing position while covered by the IHM.\n                            if (hidingCompletely) {\n                                // If we're covered by the IHM we already look hidden.\n                                // We can skip our animation and just hide.\n                                performAnimation = false;\n                            } else {\n                                // Some portion of the _LegacyAppBar should be visible to users after its position changes.\n\n                                // Un-obscure ourselves and become visible to the user again.\n                                // Need to animate to our desired position as if we were coming up from behind the keyboard.\n                                fromPosition = displayModeVisiblePositions.hidden;\n                            }\n                            this._keyboardObscured = false;\n                        }\n\n                        // Fire \"before\" event if we are changing state.\n                        if (newState === appbarShownState) {\n                            this._beforeShow();\n                        } else if (newState === appbarHiddenState) {\n                            this._beforeHide();\n                        }\n\n                        // Position our element into the correct \"end of animation\" position,\n                        // also accounting for any viewport scrolling or soft keyboard positioning.\n                        this._ensurePosition();\n\n                        this._element.style.opacity = 1;\n                        this._element.style.visibility = \"visible\";\n\n                        this._animationPromise = (performAnimation) ? this._animatePositionChange(fromPosition, toPosition) : Promise.wrap();\n                        this._animationPromise.then(\n                            function () { this._afterPositionChange(toPosition, newState); }.bind(this),\n                            function () { this._afterPositionChange(toPosition, newState); }.bind(this)\n                        );\n                    }\n                },\n\n                _afterPositionChange: function _LegacyAppBar_afterPositionChange(newPosition, newState) {\n                    // Defines body of work to perform after changing positions.\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    if (newPosition) {\n\n                        // Update closedDisplayMode related CSS classes, which were delayed from the closedDisplayMode setter to avoid affecting the animation\n                        if (newPosition === displayModeVisiblePositions.minimal) {\n                            _ElementUtilities.addClass(this._element, _Constants.minimalClass);\n                            _ElementUtilities.removeClass(this._element, _Constants.compactClass);\n                        }\n\n                        if (newPosition === displayModeVisiblePositions.hidden && this.closedDisplayMode === closedDisplayModes.none) {\n                            _ElementUtilities.removeClass(this._element, _Constants.minimalClass);\n                            _ElementUtilities.removeClass(this._element, _Constants.compactClass);\n                        }\n\n                        // Clear animation flag and record having visited this position.\n                        this._element.winAnimating = \"\";\n                        this._lastPositionVisited = newPosition;\n\n                        if (this._doNext === this._lastPositionVisited) {\n                            this._doNext = \"\";\n                        }\n                        \n                        if (newState === appbarHiddenState) {\n                            _LightDismissService.hidden(this._dismissable);\n                        }\n                        \n                        if (newPosition === displayModeVisiblePositions.hidden) {\n                            // Make sure animation is finished.\n                            this._element.style.visibility = \"hidden\";\n                            this._element.style.display = \"none\";\n                        }\n\n                        // Clean up animation transforms.\n                        var transformProperty = _BaseUtils._browserStyleEquivalents[\"transform\"].scriptName;\n                        this._element.style[transformProperty] = \"\";\n\n                        // Fire \"after\" event if we changed state.\n                        if (newState === appbarShownState) {\n                            this._afterShow();\n                        } else if (newState === appbarHiddenState) {\n                            this._afterHide();\n                        }\n\n                        // If we had something queued, do that\n                        Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, \"WinJS.UI._LegacyAppBar._checkDoNext\");\n                    }\n\n                    this._afterPositionChangeCallBack();\n                },\n\n                _afterPositionChangeCallBack: function () {\n                    // Leave this blank for unit tests to overwrite.\n                },\n\n                _beforeShow: function _LegacyAppBar_beforeShow() {\n                    // In case their event 'beforeopen' event listener is going to manipulate commands,\n                    // first see if there are any queued command animations we can handle while we're still hidden.\n                    if (this._queuedCommandAnimation) {\n                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);\n                        this._queuedToShow = [];\n                        this._queuedToHide = [];\n                    }\n\n                    // Make sure everything fits before showing\n                    this._layoutImpl.scale();\n\n                    if (this.closedDisplayMode === closedDisplayModes.compact) {\n                        this._heightWithoutLabels = this._element.offsetHeight;\n                    }\n\n                    _ElementUtilities.removeClass(this._element, _Constants.hiddenClass);\n                    _ElementUtilities.addClass(this._element, _Constants.showingClass);\n\n                    // Send our \"beforeopen\" event\n                    this._sendEvent(EVENTS.beforeOpen);\n                },\n\n                _afterShow: function _LegacyAppBar_afterShow() {\n                    _ElementUtilities.removeClass(this._element, _Constants.showingClass);\n                    _ElementUtilities.addClass(this._element, _Constants.shownClass);\n\n                    // Send our \"afteropen\" event\n                    this._sendEvent(EVENTS.afterOpen);\n                    this._writeProfilerMark(\"show,StopTM\");\n                },\n\n                _beforeHide: function _LegacyAppBar_beforeHide() {\n\n                    _ElementUtilities.removeClass(this._element, _Constants.shownClass);\n                    _ElementUtilities.addClass(this._element, _Constants.hidingClass);\n\n                    // Send our \"beforeclose\" event\n                    this._sendEvent(EVENTS.beforeClose);\n                },\n\n                _afterHide: function _LegacyAppBar_afterHide() {\n\n                    // In case their 'afterclose' event handler is going to manipulate commands,\n                    // first see if there are any queued command animations we can handle now we're hidden.\n                    if (this._queuedCommandAnimation) {\n                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);\n                        this._queuedToShow = [];\n                        this._queuedToHide = [];\n                    }\n\n                    _ElementUtilities.removeClass(this._element, _Constants.hidingClass);\n                    _ElementUtilities.addClass(this._element, _Constants.hiddenClass);\n\n                    // Send our \"afterclose\" event\n                    this._sendEvent(EVENTS.afterClose);\n                    this._writeProfilerMark(\"hide,StopTM\");\n                },\n\n                _animatePositionChange: function _LegacyAppBar_animatePositionChange(fromPosition, toPosition) {\n                    // Determines and executes the proper transition between visible positions\n\n                    var layoutElementsAnimationPromise = this._layoutImpl.positionChanging(fromPosition, toPosition),\n                        appBarElementAnimationPromise;\n\n                    // Get values in terms of pixels to perform animation.\n                    var beginningVisiblePixelHeight = this._visiblePixels[fromPosition],\n                        endingVisiblePixelHeight = this._visiblePixels[toPosition],\n                        distance = Math.abs(endingVisiblePixelHeight - beginningVisiblePixelHeight),\n                        offsetTop = (this._placement === _Constants.appBarPlacementTop) ? -distance : distance;\n\n                    if ((this._placement === _Constants.appBarPlacementTop) &&\n                        ((fromPosition === displayModeVisiblePositions.shown &&\n                        toPosition === displayModeVisiblePositions.compact) ||\n                        (fromPosition === displayModeVisiblePositions.compact &&\n                        toPosition === displayModeVisiblePositions.shown))) {\n                        // Command icons remain in the same location on a top appbar\n                        // when going from compact > shown or shown > compact.\n                        offsetTop = 0;\n                    }\n\n                    // Animate\n                    if (endingVisiblePixelHeight > beginningVisiblePixelHeight) {\n                        var fromOffset = { top: offsetTop + \"px\", left: \"0px\" };\n                        appBarElementAnimationPromise = Animations.showEdgeUI(this._element, fromOffset, { mechanism: \"transition\" });\n                    } else {\n                        var toOffset = { top: offsetTop + \"px\", left: \"0px\" };\n                        appBarElementAnimationPromise = Animations.hideEdgeUI(this._element, toOffset, { mechanism: \"transition\" });\n                    }\n\n                    return Promise.join([layoutElementsAnimationPromise, appBarElementAnimationPromise]);\n                },\n\n                _checkDoNext: function _LegacyAppBar_checkDoNext() {\n                    // Do nothing if we're still animating\n                    if (this._animating || this._needToHandleShowingKeyboard || this._needToHandleHidingKeyboard || this._disposed) {\n                        return;\n                    }\n\n                    if (this._doNext === displayModeVisiblePositions.disabled ||\n                        this._doNext === displayModeVisiblePositions.hidden ||\n                        this._doNext === displayModeVisiblePositions.minimal ||\n                        this._doNext === displayModeVisiblePositions.compact) {\n                        // Do hide first because animating commands would be easier\n                        this._hide(this._doNext);\n                        this._doNext = \"\";\n                    } else if (this._queuedCommandAnimation) {\n                        // Do queued commands before showing if possible\n                        this._showAndHideQueue();\n                    } else if (this._doNext === displayModeVisiblePositions.shown) {\n                        // Show last so that we don't unnecessarily animate commands\n                        this._show();\n                        this._doNext = \"\";\n                    }\n                },\n\n                // Set focus to the passed in _LegacyAppBar\n                _setFocusToAppBar: function _LegacyAppBar_setFocusToAppBar(useSetActive, scroller) {\n                    if (!this._focusOnFirstFocusableElement(useSetActive, scroller)) {\n                        // No first element, set it to appbar itself\n                        _Overlay._Overlay._trySetActive(this._element, scroller);\n                    }\n                },\n\n                _commandsUpdated: function _LegacyAppBar_commandsUpdated() {\n                    // If we are still initializing then we don't have a layout yet so it doesn't need updating.\n                    if (!this._initializing) {\n                        this._layoutImpl.commandsUpdated();\n                        this._layoutImpl.scale();\n                    }\n                },\n\n                _beginAnimateCommands: function _LegacyAppBar_beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands) {\n                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.\n                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.\n                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide.\n                    // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide.\n                    this._layoutImpl.beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands);\n                },\n\n                _endAnimateCommands: function _LegacyAppBar_endAnimateCommands() {\n                    this._layoutImpl.endAnimateCommands();\n                    this._endAnimateCommandsCallBack();\n                },\n\n                _endAnimateCommandsCallBack: function _LegacyAppBar_endAnimateCommandsCallBack() {\n                    // Leave this blank for unit tests to overwrite.\n                },\n\n                // Get the top offset for top appbars.\n                _getTopOfVisualViewport: function _LegacyAppBar_getTopOfVisualViewPort() {\n                    return _Overlay._Overlay._keyboardInfo._visibleDocTop;\n                },\n\n                // Get the bottom offset for bottom appbars.\n                _getAdjustedBottom: function _LegacyAppBar_getAdjustedBottom() {\n                    // Need the distance the IHM moved as well.\n                    return _Overlay._Overlay._keyboardInfo._visibleDocBottomOffset;\n                },\n\n                _showingKeyboard: function _LegacyAppBar_showingKeyboard(event) {\n                    // Remember keyboard showing state.\n                    this._keyboardObscured = false;\n                    this._needToHandleHidingKeyboard = false;\n\n                    // If we're already moved, then ignore the whole thing\n                    if (_Overlay._Overlay._keyboardInfo._visible && this._alreadyInPlace()) {\n                        return;\n                    }\n\n                    this._needToHandleShowingKeyboard = true;\n                    // If focus is in the appbar, don't cause scrolling.\n                    if (this.opened && this._element.contains(_Global.document.activeElement)) {\n                        event.ensuredFocusedElementInView = true;\n                    }\n\n                    // Check if appbar moves or if we're ok leaving it obscured instead.\n                    if (this._visible && this._placement !== _Constants.appBarPlacementTop && _Overlay._Overlay._isFlyoutVisible()) {\n                        // Remember that we're obscured\n                        this._keyboardObscured = true;\n                    } else {\n                        // Don't be obscured, clear _scrollHappened flag to give us inference later on when to re-show ourselves.\n                        this._scrollHappened = false;\n                    }\n\n                    // Also set timeout regardless, so we can clean up our _keyboardShowing flag.\n                    var that = this;\n                    _Global.setTimeout(function (e) { that._checkKeyboardTimer(e); }, _Overlay._Overlay._keyboardInfo._animationShowLength + _Overlay._Overlay._scrollTimeout);\n                },\n\n                _hidingKeyboard: function _LegacyAppBar_hidingKeyboard() {\n                    // We'll either just reveal the current space under the IHM or restore the window height.\n\n                    // We won't be obscured\n                    this._keyboardObscured = false;\n                    this._needToHandleShowingKeyboard = false;\n                    this._needToHandleHidingKeyboard = true;\n\n                    // We'll either just reveal the current space or resize the window\n                    if (!_Overlay._Overlay._keyboardInfo._isResized) {\n                        // If we're not completely hidden, only fake hiding under keyboard, or already animating,\n                        // then snap us to our final position.\n                        if (this._visible || this._animating) {\n                            // Not resized, update our final position immediately\n                            this._checkScrollPosition();\n                            this._element.style.display = \"\";\n                        }\n                        this._needToHandleHidingKeyboard = false;\n                    }\n                    // Else resize should clear keyboardHiding.\n                },\n\n                _resize: function _LegacyAppBar_resize(event) {\n                    // If we're hidden by the keyboard, then hide bottom appbar so it doesn't pop up twice when it scrolls\n                    if (this._needToHandleShowingKeyboard) {\n                        // Top is allowed to scroll off the top, but we don't want bottom to peek up when\n                        // scrolled into view since we'll show it ourselves and don't want a stutter effect.\n                        if (this._visible) {\n                            if (this._placement !== _Constants.appBarPlacementTop && !this._keyboardObscured) {\n                                // If viewport doesn't match window, need to vanish momentarily so it doesn't scroll into view,\n                                // however we don't want to toggle the visibility=\"hidden\" hidden flag.\n                                this._element.style.display = \"none\";\n                            }\n                        }\n                        // else if we're top we stay, and if there's a flyout, stay obscured by the keyboard.\n                    } else if (this._needToHandleHidingKeyboard) {\n                        this._needToHandleHidingKeyboard = false;\n                        if (this._visible || this._animating) {\n                            // Snap to final position\n                            this._checkScrollPosition();\n                            this._element.style.display = \"\";\n                        }\n                    }\n\n                    // Make sure everything still fits.\n                    if (!this._initializing) {\n                        this._layoutImpl.resize(event);\n                    }\n                },\n\n                _checkKeyboardTimer: function _LegacyAppBar_checkKeyboardTimer() {\n                    if (!this._scrollHappened) {\n                        this._mayEdgeBackIn();\n                    }\n                },\n\n                _manipulationChanged: function _LegacyAppBar_manipulationChanged(event) {\n                    // See if we're at the not manipulating state, and we had a scroll happen,\n                    // which is implicitly after the keyboard animated.\n                    if (event.currentState === 0 && this._scrollHappened) {\n                        this._mayEdgeBackIn();\n                    }\n                },\n\n                _mayEdgeBackIn: function _LegacyAppBar_mayEdgeBackIn() {\n                    // May need to react to IHM being resized event\n                    if (this._needToHandleShowingKeyboard) {\n                        // If not top appbar or viewport isn't still at top, then need to show again\n                        this._needToHandleShowingKeyboard = false;\n                        // If obscured (IHM + flyout showing), it's ok to stay obscured.\n                        // If bottom we have to move, or if top scrolled off screen.\n                        if (!this._keyboardObscured &&\n                            (this._placement !== _Constants.appBarPlacementTop || _Overlay._Overlay._keyboardInfo._visibleDocTop !== 0)) {\n                            var toPosition = this._visiblePosition;\n                            this._lastPositionVisited = displayModeVisiblePositions.hidden;\n                            this._changeVisiblePosition(toPosition, false);\n                        } else {\n                            // Ensure any animations dropped during the showing keyboard are caught up.\n                            this._checkDoNext();\n                        }\n                    }\n                    this._scrollHappened = false;\n                },\n\n                _ensurePosition: function _LegacyAppBar_ensurePosition() {\n                    // Position the _LegacyAppBar element relative to the top or bottom edge of the visible\n                    // document, based on the the visible position we think we need to be in.\n                    var offSet = this._computePositionOffset();\n                    this._element.style.bottom = offSet.bottom;\n                    this._element.style.top = offSet.top;\n\n                },\n\n                _computePositionOffset: function _LegacyAppBar_computePositionOffset() {\n                    // Calculates and returns top and bottom offsets for the _LegacyAppBar element, relative to the top or bottom edge of the visible\n                    // document.\n                    var positionOffSet = {};\n\n                    if (this._placement === _Constants.appBarPlacementBottom) {\n                        // If the IHM is open, the bottom of the visual viewport may or may not be obscured\n                        // Use _getAdjustedBottom to account for the IHM if it is covering the bottom edge.\n                        positionOffSet.bottom = this._getAdjustedBottom() + \"px\";\n                        positionOffSet.top = \"\";\n                    } else if (this._placement === _Constants.appBarPlacementTop) {\n                        positionOffSet.bottom = \"\";\n                        positionOffSet.top = this._getTopOfVisualViewport() + \"px\";\n                    }\n\n                    return positionOffSet;\n                },\n\n                _checkScrollPosition: function _LegacyAppBar_checkScrollPosition() {\n                    // If IHM has appeared, then remember we may come in\n                    if (this._needToHandleShowingKeyboard) {\n                        // Tag that it's OK to edge back in.\n                        this._scrollHappened = true;\n                        return;\n                    }\n\n                    // We only need to update if we're not completely hidden.\n                    if (this._visible || this._animating) {\n                        this._ensurePosition();\n                        // Ensure any animations dropped during the showing keyboard are caught up.\n                        this._checkDoNext();\n                    }\n                },\n\n                _alreadyInPlace: function _LegacyAppBar_alreadyInPlace() {\n                    // See if we're already where we're supposed to be.\n                    var offSet = this._computePositionOffset();\n                    return (offSet.top === this._element.style.top && offSet.bottom === this._element.style.bottom);\n                },\n\n                // If there is a shown non-sticky _LegacyAppBar then it sets the firstDiv tabIndex to\n                //   the minimum tabIndex found in the _LegacyAppBars and finalDiv to the max found.\n                // Otherwise sets their tabIndex to -1 so they are not tab stops.\n                _updateFirstAndFinalDiv: function _LegacyAppBar_updateFirstAndFinalDiv() {\n                    var appBarFirstDiv = this._element.querySelectorAll(\".\" + _Constants.firstDivClass);\n                    appBarFirstDiv = appBarFirstDiv.length >= 1 ? appBarFirstDiv[0] : null;\n\n                    var appBarFinalDiv = this._element.querySelectorAll(\".\" + _Constants.finalDivClass);\n                    appBarFinalDiv = appBarFinalDiv.length >= 1 ? appBarFinalDiv[0] : null;\n\n                    // Remove the firstDiv & finalDiv if they are not at the appropriate locations\n                    if (appBarFirstDiv && (this._element.children[0] !== appBarFirstDiv)) {\n                        appBarFirstDiv.parentNode.removeChild(appBarFirstDiv);\n                        appBarFirstDiv = null;\n                    }\n                    if (appBarFinalDiv && (this._element.children[this._element.children.length - 1] !== appBarFinalDiv)) {\n                        appBarFinalDiv.parentNode.removeChild(appBarFinalDiv);\n                        appBarFinalDiv = null;\n                    }\n\n                    // Create and add the firstDiv & finalDiv if they don't already exist\n                    if (!appBarFirstDiv) {\n                        // Add a firstDiv that will be the first child of the appBar.\n                        // On focus set focus to the last element of the AppBar.\n                        appBarFirstDiv = _Global.document.createElement(\"div\");\n                        // display: inline is needed so that the div doesn't take up space and cause the page to scroll on focus\n                        appBarFirstDiv.style.display = \"inline\";\n                        appBarFirstDiv.className = _Constants.firstDivClass;\n                        appBarFirstDiv.tabIndex = -1;\n                        appBarFirstDiv.setAttribute(\"aria-hidden\", \"true\");\n                        _ElementUtilities._addEventListener(appBarFirstDiv, \"focusin\", this._focusOnLastFocusableElementOrThis.bind(this), false);\n                        // add to beginning\n                        if (this._element.children[0]) {\n                            this._element.insertBefore(appBarFirstDiv, this._element.children[0]);\n                        } else {\n                            this._element.appendChild(appBarFirstDiv);\n                        }\n                    }\n                    if (!appBarFinalDiv) {\n                        // Add a finalDiv that will be the last child of the appBar.\n                        // On focus set focus to the first element of the AppBar.\n                        appBarFinalDiv = _Global.document.createElement(\"div\");\n                        // display: inline is needed so that the div doesn't take up space and cause the page to scroll on focus\n                        appBarFinalDiv.style.display = \"inline\";\n                        appBarFinalDiv.className = _Constants.finalDivClass;\n                        appBarFinalDiv.tabIndex = -1;\n                        appBarFinalDiv.setAttribute(\"aria-hidden\", \"true\");\n                        _ElementUtilities._addEventListener(appBarFinalDiv, \"focusin\", this._focusOnFirstFocusableElementOrThis.bind(this), false);\n                        this._element.appendChild(appBarFinalDiv);\n                    }\n\n\n                    // invokeButton should be the second to last element in the _LegacyAppBar's tab order. Second to the finalDiv.\n                    if (this._element.children[this._element.children.length - 2] !== this._invokeButton) {\n                        this._element.insertBefore(this._invokeButton, appBarFinalDiv);\n                    }\n                    var elms = this._element.getElementsByTagName(\"*\");\n                    var highestTabIndex = _ElementUtilities._getHighestTabIndexInList(elms);\n                    this._invokeButton.tabIndex = highestTabIndex;\n\n                    // Update the tabIndex of the firstDiv & finalDiv\n                    if (appBarFirstDiv) {\n                        appBarFirstDiv.tabIndex = _ElementUtilities._getLowestTabIndexInList(elms);\n                    }\n                    if (appBarFinalDiv) {\n                        appBarFinalDiv.tabIndex = highestTabIndex;\n                    }\n                },\n\n                _writeProfilerMark: function _LegacyAppBar_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI._LegacyAppBar:\" + this._id + \":\" + text);\n                }\n            }, {\n                // Statics\n                _Events: EVENTS,\n            });\n\n            return _LegacyAppBar;\n        })\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// Menu\n/// <dictionary>Menu,Menus,Flyout,Flyouts,Statics</dictionary>\ndefine('WinJS/Controls/Menu',[\n    'exports',\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Utilities/_KeyboardBehavior',\n    './_LegacyAppBar/_Constants',\n    './Flyout',\n    './Flyout/_Overlay',\n    './Menu/_Command'\n], function menuInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, Promise, _ElementUtilities, _Hoverable, _KeyboardBehavior, _Constants, Flyout, _Overlay, _Command) {\n    \"use strict\";\n    \n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.Menu\">Represents a menu flyout for displaying commands.</summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <name locid=\"WinJS.UI.Menu_name\">Menu</name>\n        /// <icon src=\"ui_winjs.ui.menu.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.menu.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.Menu\">\n        /// <button data-win-control=\"WinJS.UI.MenuCommand\" data-win-options=\"{id:'',label:'example',type:'button',onclick:null}\"></button>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"beforeshow\" locid=\"WinJS.UI.Menu_e:beforeshow\">Raised just before showing a menu.</event>\n        /// <event name=\"aftershow\" locid=\"WinJS.UI.Menu_e:aftershow\">Raised immediately after a menu is fully shown.</event>\n        /// <event name=\"beforehide\" locid=\"WinJS.UI.Menu_e:beforehide\">Raised just before hiding a menu.</event>\n        /// <event name=\"afterhide\" locid=\"WinJS.UI.Menu_e:afterhide\">Raised immediately after a menu is fully hidden.</event>\n        /// <part name=\"menu\" class=\"win-menu\" locid=\"WinJS.UI.Menu_part:menu\">The Menu control itself</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        Menu: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/menuAriaLabel\").value; },\n                get requiresCommands() { return \"Invalid argument: commands must not be empty\"; },\n                get nullCommand() { return \"Invalid argument: command must not be null\"; },\n            };\n\n            function isCommandInMenu(object) {\n                // Verifies that we have a menuCommand element and that it is in a Menu.\n                var element = object.element || object;\n                return _ElementUtilities._matchesSelector(element, \".\" + _Constants.menuClass + \" \" + \".\" + _Constants.menuCommandClass);\n            }\n\n            var Menu = _Base.Class.derive(Flyout.Flyout, function Menu_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.Menu.Menu\">\n                /// <summary locid=\"WinJS.UI.Menu.constructor\">\n                /// Creates a new Menu control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.Menu.constructor_p:element\">\n                /// The DOM element that will host the control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" domElement=\"false\" locid=\"WinJS.UI.Menu.constructor_p:options\">\n                /// The set of properties and values to apply to the control.\n                /// </param>\n                /// <returns type=\"WinJS.UI.Menu\" locid=\"WinJS.UI.Menu.constructor_returnValue\">The new Menu control.</returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n\n                // We need to be built on top of a Flyout, so stomp on the user's input\n                options = options || {};\n\n                // Make sure there's an input element\n                this._element = element || _Global.document.createElement(\"div\");\n                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                // validate that if they didn't set commands, in which\n                // case any HTML only contains commands.  Do this first\n                // so that we don't leave partial Menus in the DOM.\n                if (!options.commands && this._element) {\n                    // Shallow copy object so we can modify it.\n                    options = _BaseUtils._shallowCopy(options);\n                    options.commands = this._verifyCommandsOnly(this._element, \"WinJS.UI.MenuCommand\");\n                }\n\n                // Remember aria role in case base constructor changes it\n                var role = this._element ? this._element.getAttribute(\"role\") : null;\n                var label = this._element ? this._element.getAttribute(\"aria-label\") : null;\n\n                // Call the base overlay constructor helper\n                this._baseFlyoutConstructor(this._element, options);\n\n                // Make sure we have an ARIA role\n                if (role === null || role === \"\" || role === undefined) {\n                    this._element.setAttribute(\"role\", \"menu\");\n                }\n                if (label === null || label === \"\" || label === undefined) {\n                    this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                }\n\n                // Handle \"esc\" & \"up/down\" key presses\n                this._element.addEventListener(\"keydown\", this._handleKeyDown.bind(this), true);\n                this._element.addEventListener(_Constants._menuCommandInvokedEvent, this._handleCommandInvoked.bind(this), false);\n                this._element.addEventListener(\"mouseover\", this._handleMouseOver.bind(this), false);\n                this._element.addEventListener(\"mouseout\", this._handleMouseOut.bind(this), false);\n\n                // Attach our css class\n                _ElementUtilities.addClass(this._element, _Constants.menuClass);\n\n                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._element);\n\n                // Need to set our commands, making sure we're hidden first\n                this.hide();\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                // Public Properties\n\n                /// <field type=\"Array\" locid=\"WinJS.UI.Menu.commands\" helpKeyword=\"WinJS.UI.Menu.commands\" isAdvanced=\"true\">\n                /// Sets the MenuCommand objects that appear in the Menu. You can set this to a single MenuCommand or an array of MenuCommand objects.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                commands: {\n                    set: function (value) {\n                        // Fail if trying to set when visible\n                        if (!this.hidden) {\n                            throw new _ErrorFromName(\"WinJS.UI.Menu.CannotChangeCommandsWhenVisible\", _Resources._formatString(_Overlay._Overlay.commonstrings.cannotChangeCommandsWhenVisible, \"Menu\"));\n                        }\n\n                        // Start from scratch\n                        _ElementUtilities.empty(this._element);\n\n                        // In case they had only one...\n                        if (!Array.isArray(value)) {\n                            value = [value];\n                        }\n\n                        // Add commands\n                        var len = value.length;\n                        for (var i = 0; i < len; i++) {\n                            this._addCommand(value[i]);\n                        }\n                    }\n                },\n\n                getCommandById: function (id) {\n                    /// <signature helpKeyword=\"WinJS.UI.Menu.getCommandById\">\n                    /// <summary locid=\"WinJS.UI.Menu.getCommandById\">\n                    /// Retrieve the command with the specified ID from this Menu.  If more than one command is found, all are returned.\n                    /// </summary>\n                    /// <param name=\"id\" type=\"String\" locid=\"WinJS.UI.Menu.getCommandById_p:id\">The ID of the command to find.</param>\n                    /// <returns type=\"object\" locid=\"WinJS.UI.Menu.getCommandById_returnValue\">\n                    /// The command found, an array of commands if more than one have the same ID, or null if no command is found.\n                    /// </returns>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    var commands = this.element.querySelectorAll(\"#\" + id);\n                    var newCommands = [];\n                    for (var count = 0, len = commands.length; count < len; count++) {\n                        if (commands[count].winControl) {\n                            newCommands.push(commands[count].winControl);\n                        }\n                    }\n\n                    if (newCommands.length === 1) {\n                        return newCommands[0];\n                    } else if (newCommands.length === 0) {\n                        return null;\n                    }\n\n                    return newCommands;\n                },\n\n\n                showCommands: function (commands) {\n                    /// <signature helpKeyword=\"WinJS.UI.Menu.showCommands\">\n                    /// <summary locid=\"WinJS.UI.Menu.showCommands\">\n                    /// Shows the specified commands of the Menu.\n                    /// </summary>\n                    /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI.Menu.showCommands_p:commands\">\n                    /// The commands to show. The array elements may be Menu objects, or the string identifiers (IDs) of commands.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    if (!commands) {\n                        throw new _ErrorFromName(\"WinJS.UI.Menu.RequiresCommands\", strings.requiresCommands);\n                    }\n\n                    this._showCommands(commands, true);\n                },\n\n                hideCommands: function (commands) {\n                    /// <signature helpKeyword=\"WinJS.UI.Menu.hideCommands\">\n                    /// <summary locid=\"WinJS.UI.Menu.hideCommands\">\n                    /// Hides the Menu.\n                    /// </summary>\n                    /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI.Menu.hideCommands_p:commands\">\n                    /// Required. Command or Commands to hide, either String, DOM elements, or WinJS objects.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    if (!commands) {\n                        throw new _ErrorFromName(\"WinJS.UI.Menu.RequiresCommands\", strings.requiresCommands);\n                    }\n\n                    this._hideCommands(commands, true);\n                },\n\n                showOnlyCommands: function (commands) {\n                    /// <signature helpKeyword=\"WinJS.UI.Menu.showOnlyCommands\">\n                    /// <summary locid=\"WinJS.UI.Menu.showOnlyCommands\">\n                    /// Shows the specified commands of the Menu while hiding all other commands.\n                    /// </summary>\n                    /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI.Menu.showOnlyCommands_p:commands\">\n                    /// The commands to show. The array elements may be MenuCommand objects, or the string identifiers (IDs) of commands.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    if (!commands) {\n                        throw new _ErrorFromName(\"WinJS.UI.Menu.RequiresCommands\", strings.requiresCommands);\n                    }\n\n                    this._showOnlyCommands(commands, true);\n                },\n\n                show: function (anchor, placement, alignment) {\n                    /// <signature helpKeyword=\"WinJS.UI.Menu.show\">\n                    /// <summary locid=\"WinJS.UI.Menu.show\">\n                    /// Shows the Menu, if hidden, regardless of other states.\n                    /// </summary>\n                    /// <param name=\"anchor\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.Menu.show_p:anchor\">\n                    /// The DOM element, or ID of a DOM element,  to anchor the Menu. This parameter overrides the anchor property for this method call only.\n                    /// </param>\n                    /// <param name=\"placement\" type=\"object\" domElement=\"false\" locid=\"WinJS.UI.Menu.show_p:placement\">\n                    /// The placement of the Menu to the anchor: 'auto' (default), 'autohorizontal', 'autovertical', 'top', 'bottom', 'left', or 'right'. This parameter overrides the placement\n                    /// property for this method call only.\n                    /// </param>\n                    /// <param name=\"alignment\" type=\"object\" domElement=\"false\" locid=\"WinJS.UI.Menu.show_p:alignment\">\n                    /// For 'top' or 'bottom' placement, the alignment of the Menu to the anchor's edge: 'center' (default), 'left', or 'right'. This parameter\n                    /// overrides the alignment property for this method call only.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    // Just call private version to make appbar flags happy\n                    this._writeProfilerMark(\"show,StartTM\"); // The corresponding \"stop\" profiler mark is handled in _Overlay._baseEndShow().\n                    this._show(anchor, placement, alignment);\n                },\n\n                _show: function Menu_show(anchor, placement, alignment) {\n                    if (!_ElementUtilities.hasClass(this.element, _Constants.menuMouseSpacingClass) && !_ElementUtilities.hasClass(this.element, _Constants.menuTouchSpacingClass)) {\n                        // The Menu's spacing shouldn't change while it is already shown. Only\n                        // add a spacing class if it doesn't already have one. It will get\n                        // removed after the Menu hides.\n                        _ElementUtilities.addClass(\n                            this.element,\n                            Flyout.Flyout._cascadeManager.inputType === _KeyboardBehavior._InputTypes.mouse || Flyout.Flyout._cascadeManager.inputType === _KeyboardBehavior._InputTypes.keyboard ?\n                                _Constants.menuMouseSpacingClass :\n                                _Constants.menuTouchSpacingClass\n                        );\n                    }\n                    // Call flyout show \n                    this._baseFlyoutShow(anchor, placement, alignment);\n\n                    // Menu will need to adjust MenuCommand layouts based on the various \n                    // types of commands visible in our Menu, but only after we send the beforeshow\n                    // event, so the developer has a chance to show or hide more commands.\n                    // Flyout's _findPosition will make that call.\n                },\n\n                _hide: function Menu_hide() {\n                    if (this._hoverPromise) {\n                        this._hoverPromise.cancel();\n                    }\n                    Flyout.Flyout.prototype._hide.call(this);\n                },\n                \n                _beforeEndHide: function Menu_beforeEndHide() {\n                    _ElementUtilities.removeClass(this.element, _Constants.menuMouseSpacingClass);\n                    _ElementUtilities.removeClass(this.element, _Constants.menuTouchSpacingClass);\n                    Flyout.Flyout.prototype._beforeEndHide.call(this);\n                },\n\n                _addCommand: function Menu_addCommand(command) {\n                    if (!command) {\n                        throw new _ErrorFromName(\"WinJS.UI.Menu.NullCommand\", strings.nullCommand);\n                    }\n                    // See if it's a command already\n                    if (!command._element) {\n                        // Not a command, so assume it's options for a command\n                        command = new _Command.MenuCommand(null, command);\n                    }\n                    // If we were attached somewhere else, detach us\n                    if (command._element.parentElement) {\n                        command._element.parentElement.removeChild(command._element);\n                    }\n\n                    // Reattach us\n                    this._element.appendChild(command._element);\n                },\n\n                _dispose: function Menu_dispose() {\n                    if (this._hoverPromise) {\n                        this._hoverPromise.cancel();\n                    }\n                    Flyout.Flyout.prototype._dispose.call(this);\n\n                },\n\n                _commandsUpdated: function Menu_commandsUpdated() {\n                    if (!this.hidden) {\n                        this._checkMenuCommands();\n                    }\n                },\n\n                // Called when we show/hide commands or by flyout's _findPosition when the Menu is showing.\n                _checkMenuCommands: function Menu_checkMenuCommands() {\n                    var menuCommands = this._element.querySelectorAll(\".win-command\"),\n                        hasToggleCommands = false,\n                        hasFlyoutCommands = false;\n                    if (menuCommands) {\n                        for (var i = 0, len = menuCommands.length; i < len; i++) {\n                            var menuCommand = menuCommands[i].winControl;\n                            if (menuCommand && !menuCommand.hidden) {\n                                if (!hasToggleCommands && menuCommand.type === _Constants.typeToggle) {\n                                    hasToggleCommands = true;\n                                }\n                                if (!hasFlyoutCommands && menuCommand.type === _Constants.typeFlyout) {\n                                    hasFlyoutCommands = true;\n                                }\n                            }\n                        }\n                    }\n\n                    _ElementUtilities[hasToggleCommands ? 'addClass' : 'removeClass'](this._element, _Constants.menuContainsToggleCommandClass);\n                    _ElementUtilities[hasFlyoutCommands ? 'addClass' : 'removeClass'](this._element, _Constants.menuContainsFlyoutCommandClass);\n                },\n\n                _handleKeyDown: function Menu_handleKeyDown(event) {\n                    if (event.keyCode === Key.upArrow) {\n                        Menu._focusOnPreviousElement(this.element);\n\n                        // Prevent the page from scrolling\n                        event.preventDefault();\n                    } else if (event.keyCode === Key.downArrow) {\n                        Menu._focusOnNextElement(this.element);\n\n                        // Prevent the page from scrolling\n                        event.preventDefault();\n                    } else if ((event.keyCode === Key.space || event.keyCode === Key.enter)\n                           && (this.element === _Global.document.activeElement)) {\n                        event.preventDefault();\n                        this.hide();\n                    } else if (event.keyCode === Key.tab) {\n                        event.preventDefault();\n                    }\n                },\n\n                _handleFocusIn: function Menu_handleFocusIn(event) {\n                    // Menu focuses commands on mouseover. We need to handle cases involving activated flyout commands\n                    // to ensure that mousing over different commands in a menu closes that command's sub flyout.\n                    var target = event.target;\n                    if (isCommandInMenu(target)) {\n                        var command = target.winControl;\n                        if (_ElementUtilities.hasClass(command.element, _Constants.menuCommandFlyoutActivatedClass)) {\n                            // If it's an activated 'flyout' typed command, move focus onto the command's subFlyout.\n                            // We expect this will collapse all decendant Flyouts of the subFlyout from the cascade.\n                            command.flyout.element.focus();\n                        } else {\n                            // Deactivate any currently activated command in the Menu to subsequently trigger all subFlyouts descendants to collapse.\n                            var activatedSiblingCommand = this.element.querySelector(\".\" + _Constants.menuCommandFlyoutActivatedClass);\n                            if (activatedSiblingCommand) {\n                                _Command.MenuCommand._deactivateFlyoutCommand(activatedSiblingCommand);\n                            }\n                        }\n                    } else if (target === this.element) {\n                        // The Menu itself is receiving focus. Rely on the Flyout base implementation to notify the cascadeManager.\n                        // We expect this will only happen when other Menu event handling code causes the Menu to focus itself.\n                        Flyout.Flyout.prototype._handleFocusIn.call(this, event);\n                    }\n                },\n\n                _handleCommandInvoked: function Menu_handleCommandInvoked(event) {\n                    // Cascading Menus hide when invoking a command commits an action, not when invoking a command opens a subFlyout.\n                    if (this._hoverPromise) {\n                        // Prevent pending duplicate invoke triggered via hover.\n                        this._hoverPromise.cancel();\n                    }\n                    var command = event.detail.command;\n                    if (command._type !== _Constants.typeFlyout && command._type !== _Constants.typeSeparator) {\n                        this._lightDismiss(); // Collapse all Menus/Flyouts.\n                    }\n                },\n\n                _hoverPromise: null,\n                _handleMouseOver: function Menu_handleMouseOver(event) {\n                    var target = event.target;\n                    if (isCommandInMenu(target)) {\n                        var command = target.winControl,\n                            that = this;\n\n                        if (target.focus) {\n                            target.focus();\n                            // remove keyboard focus rect since focus has been triggered by mouse over.\n                            _ElementUtilities.removeClass(target, \"win-keyboard\");\n\n                            if (command.type === _Constants.typeFlyout && command.flyout && command.flyout.hidden) {\n                                this._hoverPromise = this._hoverPromise || Promise.timeout(_Constants.menuCommandHoverDelay).then(\n                                    function () {\n                                        if (!that.hidden && !that._disposed) {\n                                            command._invoke(event);\n                                        }\n                                        that._hoverPromise = null;\n                                    },\n                                    function () {\n                                        that._hoverPromise = null;\n                                    });\n                            }\n                        }\n                    }\n                },\n\n                _handleMouseOut: function Menu_handleMouseOut(event) {\n                    var target = event.target;\n                    if (isCommandInMenu(target) && !target.contains(event.relatedTarget)) {\n                        if (target === _Global.document.activeElement) {\n                            // Menu gives focus to the menu itself\n                            this.element.focus();\n                        }\n                        if (this._hoverPromise) {\n                            this._hoverPromise.cancel();\n                        }\n                    }\n                },\n\n                _writeProfilerMark: function Menu_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI.Menu:\" + this._id + \":\" + text);\n                }\n            });\n\n            // Statics\n\n            // Set focus to next focusable element in the menu (loop if necessary).\n            //   Note: The loop works by first setting focus to the menu itself.  If the menu is\n            //         what had focus before, then we break.  Otherwise we try the first child next.\n            // Focus remains on the menu if nothing is focusable.\n            Menu._focusOnNextElement = function (menu) {\n                var _currentElement = _Global.document.activeElement;\n\n                do {\n                    if (_currentElement === menu) {\n                        _currentElement = _currentElement.firstElementChild;\n                    } else {\n                        _currentElement = _currentElement.nextElementSibling;\n                    }\n\n                    if (_currentElement) {\n                        _currentElement.focus();\n                    } else {\n                        _currentElement = menu;\n                    }\n\n                } while (_currentElement !== _Global.document.activeElement);\n            };\n\n            // Set focus to previous focusable element in the menu (loop if necessary).\n            //   Note: The loop works by first setting focus to the menu itself.  If the menu is\n            //         what had focus before, then we break.  Otherwise we try the last child next.\n            // Focus remains on the menu if nothing is focusable.\n            Menu._focusOnPreviousElement = function (menu) {\n                var _currentElement = _Global.document.activeElement;\n\n                do {\n                    if (_currentElement === menu) {\n                        _currentElement = _currentElement.lastElementChild;\n                    } else {\n                        _currentElement = _currentElement.previousElementSibling;\n                    }\n\n                    if (_currentElement) {\n                        _currentElement.focus();\n                    } else {\n                        _currentElement = menu;\n                    }\n\n                } while (_currentElement !== _Global.document.activeElement);\n            };\n\n            return Menu;\n        })\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/AutoSuggestBox/_SearchSuggestionManagerShim',[\n    'exports',\n    '../../_Signal',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_Events',\n    '../../BindingList',\n], function SearchSuggestionManagerShimInit(exports, _Signal, _Base, _BaseUtils, _Events, BindingList) {\n    \"use strict\";\n\n    var CollectionChange = {\n        reset: 0,\n        itemInserted: 1,\n        itemRemoved: 2,\n        itemChanged: 3\n    };\n    var SearchSuggestionKind = {\n        Query: 0,\n        Result: 1,\n        Separator: 2\n    };\n\n    var SuggestionVectorShim = _Base.Class.derive(Array, function SuggestionVectorShim_ctor() {\n    }, {\n        reset: function () {\n            this.length = 0;\n            this.dispatchEvent(\"vectorchanged\", { collectionChange: CollectionChange.reset, index: 0 });\n        },\n\n        insert: function (index, data) {\n            this.splice(index, 0, data);\n            this.dispatchEvent(\"vectorchanged\", { collectionChange: CollectionChange.itemInserted, index: index });\n        },\n\n        remove: function (index) {\n            this.splice(index, 1);\n            this.dispatchEvent(\"vectorchanged\", { collectionChange: CollectionChange.itemRemoved, index: index });\n        },\n    });\n    _Base.Class.mix(SuggestionVectorShim, _Events.eventMixin);\n\n    var SearchSuggestionCollectionShim = _Base.Class.define(function SearchSuggestionCollectionShim_ctor() {\n        this._data = [];\n    }, {\n        size: {\n            get: function () {\n                return this._data.length;\n            }\n        },\n\n        appendQuerySuggestion: function (text) {\n            this._data.push({ kind: SearchSuggestionKind.Query, text: text });\n        },\n        appendQuerySuggestions: function (suggestions) {\n            suggestions.forEach(this.appendQuerySuggestion.bind(this));\n        },\n        appendResultSuggestion: function (text, detailText, tag, imageUrl, imageAlternateText) {\n            // 'image' must be null (not undefined) for SearchBox to fallback to use imageUrl instead\n            this._data.push({ kind: SearchSuggestionKind.Result, text: text, detailText: detailText, tag: tag, imageUrl: imageUrl, imageAlternateText: imageAlternateText, image: null });\n        },\n        appendSearchSeparator: function (label) {\n            this._data.push({ kind: SearchSuggestionKind.Separator, text: label });\n        }\n    });\n\n    var SuggestionsRequestedEventArgShim = _Base.Class.define(function SuggestionsRequestedEventArgShim_ctor(queryText, language, linguisticDetails) {\n        this._queryText = queryText;\n        this._language = language;\n        this._linguisticDetails = linguisticDetails;\n        this._searchSuggestionCollection = new SearchSuggestionCollectionShim();\n    }, {\n        language: {\n            get: function () {\n                return this._language;\n            }\n        },\n        linguisticDetails: {\n            get: function () {\n                return this._linguisticDetails;\n            }\n        },\n        queryText: {\n            get: function () {\n                return this._queryText;\n            }\n        },\n        searchSuggestionCollection: {\n            get: function () {\n                return this._searchSuggestionCollection;\n            }\n        },\n        getDeferral: function () {\n            return this._deferralSignal || (this._deferralSignal = new _Signal());\n        },\n\n        _deferralSignal: null,\n    });\n\n    var SearchSuggestionManagerShim = _Base.Class.define(function SearchSuggestionManagerShim_ctor() {\n        this._updateVector = this._updateVector.bind(this);\n\n        this._suggestionVector = new SuggestionVectorShim();\n        this._query = \"\";\n        this._history = { \"\": [] };\n\n        this._dataSource = [];\n\n        this.searchHistoryContext = \"\";\n        this.searchHistoryEnabled = true;\n    }, {\n        addToHistory: function (queryText /*, language */) {\n            if (!queryText || !queryText.trim()) {\n                return;\n            }\n\n            var history = this._history[this.searchHistoryContext];\n            var dupeIndex = -1;\n            for (var i = 0, l = history.length; i < l; i++) {\n                var item = history[i];\n                if (item.text.toLowerCase() === queryText.toLowerCase()) {\n                    dupeIndex = i;\n                    break;\n                }\n            }\n            if (dupeIndex >= 0) {\n                history.splice(dupeIndex, 1);\n            }\n\n            history.splice(0, 0, { text: queryText, kind: SearchSuggestionKind.Query });\n            this._updateVector();\n        },\n\n        clearHistory: function () {\n            this._history[this.searchHistoryContext] = [];\n            this._updateVector();\n        },\n\n        setLocalContentSuggestionSettings: function (settings) {\n        },\n\n        setQuery: function (queryText) {\n            var that = this;\n            function update(arr) {\n                that._dataSource = arr;\n                that._updateVector();\n            }\n\n            this._query = queryText;\n            var arg = new SuggestionsRequestedEventArgShim(queryText);\n            this.dispatchEvent(\"suggestionsrequested\", { request: arg });\n            if (arg._deferralSignal) {\n                arg._deferralSignal.promise.then(update.bind(this, arg.searchSuggestionCollection._data));\n            } else {\n                update(arg.searchSuggestionCollection._data);\n            }\n        },\n\n        searchHistoryContext: {\n            get: function () {\n                return \"\" + this._searchHistoryContext;\n            },\n            set: function (value) {\n                value = \"\" + value;\n                if (!this._history[value]) {\n                    this._history[value] = [];\n                }\n                this._searchHistoryContext = value;\n            }\n        },\n\n        searchHistoryEnabled: {\n            get: function () {\n                return this._searchHistoryEnabled;\n            },\n            set: function (value) {\n                this._searchHistoryEnabled = value;\n            }\n        },\n\n        suggestions: {\n            get: function () {\n                return this._suggestionVector;\n            }\n        },\n\n        _updateVector: function () {\n            // Can never clear the entire suggestions list or it will cause a visual flash because\n            // the SearchBox control removes the suggestions list UI when the SSM fires vectorChanged\n            // with size === 0, then re-renders it when the first suggestion is added.\n            // Workaround is to insert a dummy entry, remove all old entries, add the new set of\n            // eligible suggestions, then remove the dummy entry.\n            this.suggestions.insert(this.suggestions.length, { text: \"\", kind: SearchSuggestionKind.Query });\n\n            while (this.suggestions.length > 1) {\n                this.suggestions.remove(0);\n            }\n\n            var index = 0;\n            var added = {};\n            if (this.searchHistoryEnabled) {\n                var q = this._query.toLowerCase();\n                this._history[this.searchHistoryContext].forEach(function (item) {\n                    var text = item.text.toLowerCase();\n                    if (text.indexOf(q) === 0) {\n                        this.suggestions.insert(index, item);\n                        added[text] = true;\n                        index++;\n                    }\n                }, this);\n            }\n            this._dataSource.forEach(function (item) {\n                if (item.kind === SearchSuggestionKind.Query) {\n                    if (!added[item.text.toLowerCase()]) {\n                        this.suggestions.insert(index, item);\n                        index++;\n                    }\n                } else {\n                    this.suggestions.insert(index, item);\n                    index++;\n                }\n            }, this);\n\n            this.suggestions.remove(this.suggestions.length - 1);\n        },\n    });\n    _Base.Class.mix(SearchSuggestionManagerShim, _Events.eventMixin);\n\n    _Base.Namespace._moduleDefine(exports, null, {\n        _CollectionChange: CollectionChange,\n        _SearchSuggestionKind: SearchSuggestionKind,\n        _SearchSuggestionManagerShim: SearchSuggestionManagerShim,\n    });\n});\n\ndefine('require-style!less/styles-autosuggestbox',[],function(){});\n\ndefine('require-style!less/colors-autosuggestbox',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/AutoSuggestBox',[\n    \"exports\",\n    \"../Core/_Global\",\n    \"../Core/_WinRT\",\n    \"../Core/_Base\",\n    \"../Core/_ErrorFromName\",\n    \"../Core/_Events\",\n    \"../Core/_Resources\",\n    \"../Utilities/_Control\",\n    \"../Utilities/_ElementListUtilities\",\n    \"../Utilities/_ElementUtilities\",\n    '../Utilities/_Hoverable',\n    \"../_Accents\",\n    \"../Animations\",\n    \"../BindingList\",\n    \"../Promise\",\n    \"./Repeater\",\n    \"./AutoSuggestBox/_SearchSuggestionManagerShim\",\n    \"require-style!less/styles-autosuggestbox\",\n    \"require-style!less/colors-autosuggestbox\"\n], function autoSuggestBoxInit(exports, _Global, _WinRT, _Base, _ErrorFromName, _Events, _Resources, _Control, _ElementListUtilities, _ElementUtilities, _Hoverable, _Accents, Animations, BindingList, Promise, Repeater, _SuggestionManagerShim) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\"html.win-hoverable .win-autosuggestbox .win-autosuggestbox-suggestion-selected:hover\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectHover }]);\n    _Accents.createAccentRule(\".win-autosuggestbox .win-autosuggestbox-suggestion-selected\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectRest }]);\n    _Accents.createAccentRule(\".win-autosuggestbox .win-autosuggestbox-suggestion-selected.win-autosuggestbox-suggestion-selected:hover:active\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectPress }]);\n\n    var ClassNames = {\n        asb: \"win-autosuggestbox\",\n        asbDisabled: \"win-autosuggestbox-disabled\",\n        asbFlyout: \"win-autosuggestbox-flyout\",\n        asbFlyoutAbove: \"win-autosuggestbox-flyout-above\",\n        asbBoxFlyoutHighlightText: \"win-autosuggestbox-flyout-highlighttext\",\n        asbHitHighlightSpan: \"win-autosuggestbox-hithighlight-span\",\n        asbInput: \"win-autosuggestbox-input\",\n        asbInputFocus: \"win-autosuggestbox-input-focus\",\n        asbSuggestionQuery: \"win-autosuggestbox-suggestion-query\",\n        asbSuggestionResult: \"win-autosuggestbox-suggestion-result\",\n        asbSuggestionResultText: \"win-autosuggestbox-suggestion-result-text\",\n        asbSuggestionResultDetailedText: \"win-autosuggestbox-suggestion-result-detailed-text\",\n        asbSuggestionSelected: \"win-autosuggestbox-suggestion-selected\",\n        asbSuggestionSeparator: \"win-autosuggestbox-suggestion-separator\",\n    };\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.AutoSuggestBox\">\n        /// A rich input box that provides suggestions as the user types.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.autosuggest.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.autosuggest.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.AutoSuggestBox\"></div>]]></htmlSnippet>\n        /// <event name=\"querychanged\" bubbles=\"true\" locid=\"WinJS.UI.AutoSuggestBox:querychanged\">Raised when user or app changes the query text.</event>\n        /// <event name=\"querysubmitted\" bubbles=\"true\" locid=\"WinJS.UI.AutoSuggestBox:querysubmitted\">Raised when user presses Enter.</event>\n        /// <event name=\"resultsuggestionchosen\" bubbles=\"true\" locid=\"WinJS.UI.AutoSuggestBox:resultsuggestionchosen\">Raised when user clicks  one of the displayed suggestions.</event>\n        /// <event name=\"suggestionsrequested\" bubbles=\"true\" locid=\"WinJS.UI.AutoSuggestBox:suggestionsrequested\">Raised when the system requests suggestions from this app.</event>\n        /// <part name=\"autosuggestbox\" class=\"win-autosuggestbox\" locid=\"WinJS.UI.AutoSuggestBox:autosuggest\">Styles the entire Auto Suggest Box control.</part>\n        /// <part name=\"autosuggestbox-input\" class=\"win-autosuggestbox-input\" locid=\"WinJS.UI.AutoSuggestBox_part:Input\">Styles the query input box.</part>\n        /// <part name=\"autosuggestbox-flyout\" class=\"win-autosuggestbox-flyout\" locid=\"WinJS.UI.AutoSuggestBox_part:Flyout\">Styles the result suggestions flyout.</part>\n        /// <part name=\"autosuggestbox-suggestion-query\" class=\"win-autosuggestbox-suggestion-query\" locid=\"WinJS.UI.AutoSuggestBox_part:Suggestion_Query\">Styles the query type suggestion.</part>\n        /// <part name=\"autosuggestbox-suggestion-result\" class=\"win-autosuggestbox-suggestion-result\" locid=\"WinJS.UI.AutoSuggestBox_part:Suggestion_Result\">Styles the result type suggestion.</part>\n        /// <part name=\"autosuggestbox-suggestion-selected\" class=\"win-autosuggestbox-suggestion-selected\" locid=\"WinJS.UI.AutoSuggestBox_part:Suggestion_Selected\">Styles the currently selected suggestion.</part>\n        /// <part name=\"autosuggestbox-suggestion-separator\" class=\"win-autosuggestbox-suggestion-separator\" locid=\"WinJS.UI.AutoSuggestBox_part:Suggestion_Separator\">Styles the separator type suggestion.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        AutoSuggestBox: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            var EventNames = {\n                querychanged: \"querychanged\",\n                querysubmitted: \"querysubmitted\",\n                resultsuggestionchosen: \"resultsuggestionchosen\",\n                suggestionsrequested: \"suggestionsrequested\"\n            };\n\n            var Strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get invalidSuggestionKind() { return \"Error: Invalid suggestion kind.\"; },\n\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/autoSuggestBoxAriaLabel\").value; },\n                get ariaLabelInputNoPlaceHolder() { return _Resources._getWinJSString(\"ui/autoSuggestBoxAriaLabelInputNoPlaceHolder\").value; },\n                get ariaLabelInputPlaceHolder() { return _Resources._getWinJSString(\"ui/autoSuggestBoxAriaLabelInputPlaceHolder\").value; },\n                get ariaLabelQuery() { return _Resources._getWinJSString(\"ui/autoSuggestBoxAriaLabelQuery\").value; },\n                get ariaLabelResult() { return _Resources._getWinJSString(\"ui/autoSuggestBoxAriaLabelResult\").value; },\n                get ariaLabelSeparator() { return _Resources._getWinJSString(\"ui/autoSuggestBoxAriaLabelSeparator\").value; },\n            };\n\n            var AutoSuggestBox = _Base.Class.define(function asb_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.AutoSuggestBox.AutoSuggestBox\">\n                /// <summary locid=\"WinJS.UI.AutoSuggestBox.constructor\">\n                /// Creates a new AutoSuggestBox.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.AutoSuggestBox.constructor_p:element\">\n                /// The DOM element that hosts the AutoSuggestBox.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.AutoSuggestBox.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the querychanged event,\n                /// add a property named \"onquerychanged\" to the options object and set its value to the event handler.\n                /// This parameter is optional.\n                /// </param>\n                /// <returns type=\"WinJS.UI.AutoSuggestBox\" locid=\"WinJS.UI.AutoSuggestBox.constructor_returnValue\">\n                /// The new AutoSuggestBox.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n                element = element || _Global.document.createElement(\"div\");\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.AutoSuggestBox.DuplicateConstruction\", Strings.duplicateConstruction);\n                }\n\n                this._suggestionsChangedHandler = this._suggestionsChangedHandler.bind(this);\n                this._suggestionsRequestedHandler = this._suggestionsRequestedHandler.bind(this);\n\n                this._element = element;\n                element.winControl = this;\n                element.classList.add(ClassNames.asb);\n                element.classList.add(\"win-disposable\");\n\n                this._setupDOM();\n                this._setupSSM();\n\n                this._chooseSuggestionOnEnter = false;\n                this._currentFocusedIndex = -1;\n                this._currentSelectedIndex = -1;\n                this._flyoutOpenPromise = Promise.wrap();\n                this._lastKeyPressLanguage = \"\";\n                this._prevLinguisticDetails = this._getLinguisticDetails();\n                this._prevQueryText = \"\";\n\n                _Control.setOptions(this, options);\n\n                this._hideFlyout();\n            }, {\n                /// <field type=\"Function\" locid=\"WinJS.UI.AutoSuggestBox.onresultsuggestionchosen\" helpKeyword=\"WinJS.UI.AutoSuggestBox.onresultsuggestionchosen\">\n                /// Raised when user clicks on one of the suggestions displayed.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onresultsuggestionchosen: _Events._createEventProperty(EventNames.resultsuggestionchosen),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.AutoSuggestBox.onquerychanged\" helpKeyword=\"WinJS.UI.AutoSuggestBox.onquerychanged\">\n                /// Raised when user or app changes the query text.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onquerychanged: _Events._createEventProperty(EventNames.querychanged),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.AutoSuggestBox.onquerysubmitted\" helpKeyword=\"WinJS.UI.AutoSuggestBox.onquerysubmitted\">\n                /// Raised when user submits the current query.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onquerysubmitted: _Events._createEventProperty(EventNames.querysubmitted),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.AutoSuggestBox.onsuggestionsrequested\" helpKeyword=\"WinJS.UI.AutoSuggestBox.onsuggestionsrequested\">\n                /// Raised when Windows requests search suggestions from the app.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onsuggestionsrequested: _Events._createEventProperty(EventNames.suggestionsrequested),\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.AutoSuggestBox.element\" helpKeyword=\"WinJS.UI.AutoSuggestBox.element\">\n                /// Gets the DOM element that hosts the AutoSuggestBox.\n                /// <compatibleWith platform=\"WindowsPhoneApp\" minVersion=\"8.1\" />\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type='String' locid=\"WinJS.UI.AutoSuggestBox.chooseSuggestionOnEnter\" helpKeyword=\"WinJS.UI.AutoSuggestBox.chooseSuggestionOnEnter\">\n                /// Gets or sets whether the first suggestion is chosen when the user presses Enter. When set to true, as the user types in the input box, a\n                /// focus rectangle is drawn on the first suggestion (if present and no IME composition in progress). Pressing enter will behave the same as\n                /// if clicked on the focused suggestion, and the down arrow key press will put real focus to the second suggestion and the up arrow key will\n                /// remove focus.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                chooseSuggestionOnEnter: {\n                    get: function () {\n                        return this._chooseSuggestionOnEnter;\n                    },\n                    set: function (value) {\n                        this._chooseSuggestionOnEnter = !!value;\n                    }\n                },\n\n                /// <field type='bool' locid=\"WinJS.UI.AutoSuggestBox.disabled\" helpKeyword=\"WinJS.UI.AutoSuggestBox.disabled\">\n                /// Gets or sets a value that specifies whether the AutoSuggestBox is disabled.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                disabled: {\n                    get: function () {\n                        return this._inputElement.disabled;\n                    },\n                    set: function (value) {\n                        if (this._inputElement.disabled === !!value) {\n                            return;\n                        }\n\n                        if (!value) {\n                            this._enableControl();\n                        } else {\n                            this._disableControl();\n                        }\n                    }\n                },\n\n                /// <field type='String' locid=\"WinJS.UI.AutoSuggestBox.placeholderText\" helpKeyword=\"WinJS.UI.AutoSuggestBox.placeholderText\">\n                /// Gets or sets the placeholder text for the AutoSuggestBox. This text is displayed if there is no other text in the input box.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                placeholderText: {\n                    get: function () {\n                        return this._inputElement.placeholder;\n                    },\n                    set: function (value) {\n                        this._inputElement.placeholder = value;\n                        this._updateInputElementAriaLabel();\n                    }\n                },\n\n                /// <field type='String' locid=\"WinJS.UI.AutoSuggestBox.queryText\" helpKeyword=\"WinJS.UI.AutoSuggestBox.queryText\">\n                /// Gets or sets the query text for the AutoSuggestBox.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                queryText: {\n                    get: function () {\n                        return this._inputElement.value;\n                    },\n                    set: function (value) {\n                        this._inputElement.value = \"\"; // This finalizes the IME composition\n                        this._inputElement.value = value;\n                    }\n                },\n\n                /// <field type='bool' locid=\"WinJS.UI.AutoSuggestBox.searchHistoryDisabled\" helpKeyword=\"WinJS.UI.AutoSuggestBox.searchHistoryDisabled\">\n                /// Gets or sets a value that specifies whether history is disabled for the AutoSuggestBox. The default value is false.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                searchHistoryDisabled: {\n                    get: function () {\n                        return !this._suggestionManager.searchHistoryEnabled;\n                    },\n                    set: function (value) {\n                        this._suggestionManager.searchHistoryEnabled = !value;\n                    }\n                },\n\n                /// <field type='String' locid=\"WinJS.UI.AutoSuggestBox.searchHistoryContext\" helpKeyword=\"WinJS.UI.AutoSuggestBox.searchHistoryContext\">\n                /// Gets or sets the search history context for the AutoSuggestBox. The search history context string is used as a secondary key for storing search history.\n                /// (The primary key is the AppId.) An app can use the search history context string to store different search histories based on the context of the application.\n                /// If you don't set this property, the system assumes that all searches in your app occur in the same context.\n                /// If you update this property while the search pane is open with suggestions showing, the changes won't take effect until the user enters the next character.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                searchHistoryContext: {\n                    get: function () {\n                        return this._suggestionManager.searchHistoryContext;\n                    },\n                    set: function (value) {\n                        this._suggestionManager.searchHistoryContext = value;\n                    }\n                },\n\n                dispose: function asb_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.AutoSuggestBox.dispose\">\n                    /// <summary locid=\"WinJS.UI.AutoSuggestBox.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // Cancel pending promises.\n                    this._flyoutOpenPromise.cancel();\n\n                    this._suggestions.removeEventListener(\"vectorchanged\", this._suggestionsChangedHandler);\n                    this._suggestionManager.removeEventListener(\"suggestionsrequested\", this._suggestionsRequestedHandler);\n\n                    this._suggestionManager = null;\n                    this._suggestions = null;\n                    this._hitFinder = null;\n\n                    this._disposed = true;\n                },\n\n                setLocalContentSuggestionSettings: function asb_setLocalContentSuggestionSettings(settings) {\n                    /// <signature helpKeyword=\"WinJS.UI.AutoSuggestBox.SetLocalContentSuggestionSettings\">\n                    /// <summary locid=\"WinJS.UI.AutoSuggestBox.SetLocalContentSuggestionSettings\">\n                    /// Specifies whether suggestions based on local files are automatically displayed in the input field, and defines the criteria that\n                    /// the system uses to locate and filter these suggestions.\n                    /// </summary>\n                    /// <param name=\"eventName\" type=\"Windows.ApplicationModel.Search.LocalContentSuggestionSettings\" locid=\"WinJS.UI.AutoSuggestBox.setLocalContentSuggestionSettings_p:settings\">\n                    /// The new settings for local content suggestions.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    this._suggestionManager.setLocalContentSuggestionSettings(settings);\n                },\n\n                // Constructor Helpers\n                _setupDOM: function asb_setupDOM() {\n                    var flyoutPointerReleasedHandler = this._flyoutPointerReleasedHandler.bind(this);\n                    var inputOrImeChangeHandler = this._inputOrImeChangeHandler.bind(this);\n\n                    // Root element\n                    if (!this._element.getAttribute(\"aria-label\")) {\n                        this._element.setAttribute(\"aria-label\", Strings.ariaLabel);\n                    }\n                    this._element.setAttribute(\"role\", \"group\");\n\n                    // Input element\n                    this._inputElement = _Global.document.createElement(\"input\");\n                    this._inputElement.autocorrect = \"off\";\n                    this._inputElement.type = \"search\";\n                    this._inputElement.classList.add(ClassNames.asbInput);\n                    this._inputElement.classList.add(\"win-textbox\");\n                    this._inputElement.setAttribute(\"role\", \"textbox\");\n                    this._inputElement.addEventListener(\"keydown\", this._keyDownHandler.bind(this));\n                    this._inputElement.addEventListener(\"keypress\", this._keyPressHandler.bind(this));\n                    this._inputElement.addEventListener(\"keyup\", this._keyUpHandler.bind(this));\n                    this._inputElement.addEventListener(\"focus\", this._inputFocusHandler.bind(this));\n                    this._inputElement.addEventListener(\"blur\", this._inputBlurHandler.bind(this));\n                    this._inputElement.addEventListener(\"input\", inputOrImeChangeHandler);\n                    this._inputElement.addEventListener(\"compositionstart\", inputOrImeChangeHandler);\n                    this._inputElement.addEventListener(\"compositionupdate\", inputOrImeChangeHandler);\n                    this._inputElement.addEventListener(\"compositionend\", inputOrImeChangeHandler);\n                    _ElementUtilities._addEventListener(this._inputElement, \"pointerdown\", this._inputPointerDownHandler.bind(this));\n                    this._updateInputElementAriaLabel();\n                    this._element.appendChild(this._inputElement);\n                    var context = this._tryGetInputContext();\n                    if (context) {\n                        context.addEventListener(\"MSCandidateWindowShow\", this._msCandidateWindowShowHandler.bind(this));\n                        context.addEventListener(\"MSCandidateWindowHide\", this._msCandidateWindowHideHandler.bind(this));\n                    }\n\n                    // Flyout element\n                    this._flyoutElement = _Global.document.createElement(\"div\");\n                    this._flyoutElement.classList.add(ClassNames.asbFlyout);\n                    this._flyoutElement.addEventListener(\"blur\", this._flyoutBlurHandler.bind(this));\n                    _ElementUtilities._addEventListener(this._flyoutElement, \"pointerup\", flyoutPointerReleasedHandler);\n                    _ElementUtilities._addEventListener(this._flyoutElement, \"pointercancel\", flyoutPointerReleasedHandler);\n                    _ElementUtilities._addEventListener(this._flyoutElement, \"pointerout\", flyoutPointerReleasedHandler);\n                    _ElementUtilities._addEventListener(this._flyoutElement, \"pointerdown\", this._flyoutPointerDownHandler.bind(this));\n                    this._element.appendChild(this._flyoutElement);\n\n                    // Repeater\n                    var that = this;\n                    function repeaterTemplate(suggestion) {\n                        return that._renderSuggestion(suggestion);\n                    }\n                    this._suggestionsData = new BindingList.List();\n                    this._repeaterElement = _Global.document.createElement(\"div\");\n                    this._repeater = new Repeater.Repeater(this._repeaterElement, {\n                        data: this._suggestionsData,\n                        template: repeaterTemplate,\n                    });\n                    _ElementUtilities._ensureId(this._repeaterElement);\n                    this._repeaterElement.setAttribute(\"role\", \"listbox\");\n                    this._repeaterElement.setAttribute(\"aria-live\", \"polite\");\n                    this._flyoutElement.appendChild(this._repeaterElement);\n                },\n\n                _setupSSM: function asb_setupSSM() {\n                    // Get the search suggestion provider if it is available\n                    this._suggestionManager = new _SuggestionManagerShim._SearchSuggestionManagerShim();\n                    this._suggestions = this._suggestionManager.suggestions;\n\n                    this._suggestions.addEventListener(\"vectorchanged\", this._suggestionsChangedHandler);\n                    this._suggestionManager.addEventListener(\"suggestionsrequested\", this._suggestionsRequestedHandler);\n                },\n\n                // Flyout functions\n                _hideFlyout: function asb_hideFlyout() {\n                    if (this._isFlyoutShown()) {\n                        this._flyoutElement.style.display = \"none\";\n                    }\n                },\n\n                _showFlyout: function asb_showFlyout() {\n                    var prevNumSuggestions = this._prevNumSuggestions || 0;\n                    this._prevNumSuggestions = this._suggestionsData.length;\n\n                    if (this._isFlyoutShown() && prevNumSuggestions === this._suggestionsData.length) {\n                        return;\n                    }\n\n                    if (this._suggestionsData.length === 0) {\n                        return;\n                    }\n\n                    this._flyoutElement.style.display = \"block\";\n\n                    var inputRect = this._inputElement.getBoundingClientRect();\n                    var flyoutRect = this._flyoutElement.getBoundingClientRect();\n                    var documentClientWidth = _Global.document.documentElement.clientWidth;\n\n                    // Display above vs below - the ASB flyout always opens in the direction where there is more space\n                    var spaceAbove = inputRect.top;\n                    var spaceBelow = _Global.document.documentElement.clientHeight - inputRect.bottom;\n                    this._flyoutBelowInput = spaceBelow >= spaceAbove;\n                    if (this._flyoutBelowInput) {\n                        this._flyoutElement.classList.remove(ClassNames.asbFlyoutAbove);\n                        this._flyoutElement.scrollTop = 0;\n                    } else {\n                        this._flyoutElement.classList.add(ClassNames.asbFlyoutAbove);\n                        this._flyoutElement.scrollTop = this._flyoutElement.scrollHeight - this._flyoutElement.clientHeight;\n                    }\n\n                    this._addFlyoutIMEPaddingIfRequired();\n\n                    // Align left vs right edge\n                    var alignRight;\n                    if (_Global.getComputedStyle(this._flyoutElement).direction === \"rtl\") {\n                        // RTL: Align to the right edge if there is enough space to the left of the control's\n                        // right edge, or if there is not enough space to fit the flyout aligned to either edge.\n                        alignRight = ((inputRect.right - flyoutRect.width) >= 0) || ((inputRect.left + flyoutRect.width) > documentClientWidth);\n\n                    } else {\n                        // LTR: Align to the right edge if there isn't enough space to the right of the control's\n                        // left edge, but there is enough space to the left of the control's right edge.\n                        alignRight = ((inputRect.left + flyoutRect.width) > documentClientWidth) && ((inputRect.right - flyoutRect.width) >= 0);\n                    }\n\n                    if (alignRight) {\n                        this._flyoutElement.style.left = (inputRect.width - flyoutRect.width - this._element.clientLeft) + \"px\";\n                    } else {\n                        this._flyoutElement.style.left = \"-\" + this._element.clientLeft + \"px\";\n                    }\n\n                    // ms-scroll-chaining:none will still chain scroll parent element if child div does\n                    // not have a scroll bar. Prevent this by setting and updating touch action\n                    this._flyoutElement.style.touchAction = this._flyoutElement.scrollHeight > flyoutRect.height ? \"pan-y\" : \"none\";\n\n                    this._flyoutOpenPromise.cancel();\n                    var animationKeyframe = this._flyoutBelowInput ? \"WinJS-flyoutBelowASB-showPopup\" : \"WinJS-flyoutAboveASB-showPopup\";\n                    this._flyoutOpenPromise = Animations.showPopup(this._flyoutElement, { top: \"0px\", left: \"0px\", keyframe: animationKeyframe });\n                },\n\n                _addFlyoutIMEPaddingIfRequired: function asb_addFlyoutIMEPaddingIfRequired() {\n                    // Check if we have InputContext APIs\n                    var context = this._tryGetInputContext();\n                    if (!context) {\n                        return;\n                    }\n\n                    // Check if flyout is visible and below input\n                    if (!this._isFlyoutShown() || !this._flyoutBelowInput) {\n                        return;\n                    }\n\n                    // Check if IME is occluding flyout\n                    var flyoutRect = this._flyoutElement.getBoundingClientRect();\n                    var imeRect = context.getCandidateWindowClientRect();\n                    var inputRect = this._inputElement.getBoundingClientRect();\n                    var flyoutTop = inputRect.bottom;\n                    var flyoutBottom = inputRect.bottom + flyoutRect.height;\n                    if (imeRect.top > flyoutBottom || imeRect.bottom < flyoutTop) {\n                        return;\n                    }\n\n                    // Shift the flyout down or to the right depending on IME/ASB width ratio.\n                    // When the IME width is less than 45% of the ASB's width, the flyout gets\n                    // shifted right, otherwise shifted down.\n                    var animation = Animations.createRepositionAnimation(this._flyoutElement);\n                    if (imeRect.width < (inputRect.width * 0.45)) {\n                        this._flyoutElement.style.marginLeft = imeRect.width + \"px\";\n                    } else {\n                        this._flyoutElement.style.marginTop = (imeRect.bottom - imeRect.top + 4) + \"px\";\n                    }\n                    animation.execute();\n                },\n\n                _findNextSuggestionElementIndex: function asb_findNextSuggestionElementIndex(curIndex) {\n                    // Returns -1 if there are no focusable elements after curIndex\n                    // Returns first element if curIndex < 0\n                    var startIndex = curIndex < 0 ? 0 : curIndex + 1;\n                    for (var i = startIndex; i < this._suggestionsData.length; i++) {\n                        if ((this._repeater.elementFromIndex(i)) && (this._isSuggestionSelectable(this._suggestionsData.getAt(i)))) {\n                            return i;\n                        }\n                    }\n                    return -1;\n                },\n\n                _findPreviousSuggestionElementIndex: function asb_findPreviousSuggestionElementIndex(curIndex) {\n                    // Returns -1 if there are no focusable elements before curIndex\n                    // Returns last element if curIndex >= suggestionsdata.length\n                    var startIndex = curIndex >= this._suggestionsData.length ? this._suggestionsData.length - 1 : curIndex - 1;\n                    for (var i = startIndex; i >= 0; i--) {\n                        if ((this._repeater.elementFromIndex(i)) && (this._isSuggestionSelectable(this._suggestionsData.getAt(i)))) {\n                            return i;\n                        }\n                    }\n                    return -1;\n                },\n\n                _isFlyoutShown: function asb_isFlyoutShown() {\n                    return (this._flyoutElement.style.display !== \"none\");\n                },\n\n                _isSuggestionSelectable: function asb_isSuggestionSelectable(suggestion) {\n                    return ((suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) ||\n                            (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Result));\n                },\n\n                _processSuggestionChosen: function asb_processSuggestionChosen(item, event) {\n                    this.queryText = item.text;\n                    if (item.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) {\n                        this._submitQuery(item.text, false /*fillLinguisticDetails*/, event); // force empty linguistic details since explicitly chosen suggestion from list\n                    } else if (item.kind === _SuggestionManagerShim._SearchSuggestionKind.Result) {\n                        this._fireEvent(EventNames.resultsuggestionchosen, {\n                            tag: item.tag,\n                            keyModifiers: getKeyModifiers(event),\n                            storageFile: null\n                        });\n                    }\n                    this._hideFlyout();\n                },\n\n                _selectSuggestionAtIndex: function asb_selectSuggestionAtIndex(indexToSelect) {\n                    var that = this;\n                    function scrollToView(targetElement) {\n                        var popupHeight = that._flyoutElement.getBoundingClientRect().bottom - that._flyoutElement.getBoundingClientRect().top;\n                        if ((targetElement.offsetTop + targetElement.offsetHeight) > (that._flyoutElement.scrollTop + popupHeight)) {\n                            // Element to scroll is below popup visible area\n                            var scrollDifference = (targetElement.offsetTop + targetElement.offsetHeight) - (that._flyoutElement.scrollTop + popupHeight);\n                            _ElementUtilities._zoomTo(that._flyoutElement, { contentX: 0, contentY: (that._flyoutElement.scrollTop + scrollDifference), viewportX: 0, viewportY: 0 });\n                        } else if (targetElement.offsetTop < that._flyoutElement.scrollTop) {\n                            // Element to scroll is above popup visible area\n                            _ElementUtilities._zoomTo(that._flyoutElement, { contentX: 0, contentY: targetElement.offsetTop, viewportX: 0, viewportY: 0 });\n                        }\n                    }\n\n                    // Sets focus on the specified element and removes focus from others.\n                    // Clears selection if index is outside of suggestiondata index range.\n                    var curElement = null;\n                    for (var i = 0; i < this._suggestionsData.length; i++) {\n                        curElement = this._repeater.elementFromIndex(i);\n                        if (i !== indexToSelect) {\n                            curElement.classList.remove(ClassNames.asbSuggestionSelected);\n                            curElement.setAttribute(\"aria-selected\", \"false\");\n                        } else {\n                            curElement.classList.add(ClassNames.asbSuggestionSelected);\n                            scrollToView(curElement);\n                            curElement.setAttribute(\"aria-selected\", \"true\");\n                        }\n                    }\n                    this._currentSelectedIndex = indexToSelect;\n                    if (curElement) {\n                        this._inputElement.setAttribute(\"aria-activedescendant\", this._repeaterElement.id + indexToSelect);\n                    } else if (this._inputElement.hasAttribute(\"aria-activedescendant\")) {\n                        this._inputElement.removeAttribute(\"aria-activedescendant\");\n                    }\n                },\n\n                _updateFakeFocus: function asb_updateFakeFocus() {\n                    var firstElementIndex;\n                    if (this._isFlyoutShown() && (this._chooseSuggestionOnEnter)) {\n                        firstElementIndex = this._findNextSuggestionElementIndex(-1);\n                    } else {\n                        // This will clear the fake focus.\n                        firstElementIndex = -1;\n                    }\n\n                    this._selectSuggestionAtIndex(firstElementIndex);\n                },\n\n                _updateQueryTextWithSuggestionText: function asb_updateQueryTextWithSuggestionText(suggestionIndex) {\n                    if ((suggestionIndex >= 0) && (suggestionIndex < this._suggestionsData.length)) {\n                        this.queryText = this._suggestionsData.getAt(suggestionIndex).text;\n                    }\n                },\n\n                // Helpers\n                _disableControl: function asb_disableControl() {\n                    if (this._isFlyoutShown()) {\n                        this._hideFlyout();\n                    }\n                    this._element.disabled = true;\n                    this._element.classList.add(ClassNames.asbDisabled);\n                    this._inputElement.disabled = true;\n                },\n\n                _enableControl: function asb_enableControl() {\n                    this._element.disabled = false;\n                    this._element.classList.remove(ClassNames.asbDisabled);\n                    this._inputElement.disabled = false;\n                    if (_Global.document.activeElement === this._element) {\n                        _ElementUtilities._setActive(this._inputElement);\n                    }\n                },\n\n                _fireEvent: function asb_fireEvent(type, detail) {\n                    // Returns true if ev.preventDefault() was not called\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, true, true, detail);\n                    return this._element.dispatchEvent(event);\n                },\n\n                _getLinguisticDetails: function asb_getLinguisticDetails(useCache, createFilled) { // createFilled=false always creates an empty linguistic details object, otherwise generate it or use the cache\n                    function createQueryLinguisticDetails(compositionAlternatives, compositionStartOffset, compositionLength, queryTextPrefix, queryTextSuffix) {\n                        var linguisticDetails = null;\n\n                        // The linguistic alternatives we receive are only for the composition string being composed. We need to provide the linguistic alternatives\n                        // in the form of the full query text with alternatives embedded.\n                        var fullCompositionAlternatives = [];\n                        for (var i = 0; i < compositionAlternatives.length; i++) {\n                            fullCompositionAlternatives[i] = queryTextPrefix + compositionAlternatives[i] + queryTextSuffix;\n                        }\n\n                        if (_WinRT.Windows.ApplicationModel.Search.SearchQueryLinguisticDetails) {\n                            try {\n                                linguisticDetails = new _WinRT.Windows.ApplicationModel.Search.SearchQueryLinguisticDetails(fullCompositionAlternatives, compositionStartOffset, compositionLength);\n                            } catch (e) {\n                                // WP10 currently exposes SQLD API but throws on instantiation.\n                            }\n                        }\n\n                        if (!linguisticDetails) {\n                            // If we're in web compartment, create a script version of the WinRT SearchQueryLinguisticDetails object\n                            linguisticDetails = {\n                                queryTextAlternatives: fullCompositionAlternatives,\n                                queryTextCompositionStart: compositionStartOffset,\n                                queryTextCompositionLength: compositionLength\n                            };\n                        }\n                        return linguisticDetails;\n                    }\n\n                    var linguisticDetails = null;\n                    if ((this._inputElement.value === this._prevQueryText) && useCache && this._prevLinguisticDetails && createFilled) {\n                        linguisticDetails = this._prevLinguisticDetails;\n                    } else {\n                        var compositionAlternatives = [];\n                        var compositionStartOffset = 0;\n                        var compositionLength = 0;\n                        var queryTextPrefix = \"\";\n                        var queryTextSuffix = \"\";\n                        if (createFilled) {\n                            var context = this._tryGetInputContext();\n                            if (context && context.getCompositionAlternatives) {\n                                compositionAlternatives = context.getCompositionAlternatives();\n                                compositionStartOffset = context.compositionStartOffset;\n                                compositionLength = context.compositionEndOffset - context.compositionStartOffset;\n\n                                if ((this._inputElement.value !== this._prevQueryText) || (this._prevCompositionLength === 0) || (compositionLength > 0)) {\n                                    queryTextPrefix = this._inputElement.value.substring(0, compositionStartOffset);\n                                    queryTextSuffix = this._inputElement.value.substring(compositionStartOffset + compositionLength);\n                                } else {\n                                    // composition ended, but alternatives have been kept, need to reuse the previous query prefix/suffix, but still report to the client that the composition has ended (start & length of composition of 0)\n                                    queryTextPrefix = this._inputElement.value.substring(0, this._prevCompositionStart);\n                                    queryTextSuffix = this._inputElement.value.substring(this._prevCompositionStart + this._prevCompositionLength);\n                                }\n                            }\n                        }\n                        linguisticDetails = createQueryLinguisticDetails(compositionAlternatives, compositionStartOffset, compositionLength, queryTextPrefix, queryTextSuffix);\n                    }\n                    return linguisticDetails;\n                },\n\n                _isElementInSearchControl: function asb_isElementInSearchControl(targetElement) {\n                    return this.element.contains(targetElement) || (this.element === targetElement);\n                },\n\n                _renderSuggestion: function asb_renderSuggestion(suggestion) {\n                    var root = null;\n                    if (!suggestion) {\n                        return root;\n                    }\n                    if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) {\n                        root = querySuggestionRenderer(this, suggestion);\n                    } else if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Separator) {\n                        root = separatorSuggestionRenderer(suggestion);\n                    } else if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Result) {\n                        root = resultSuggestionRenderer(this, suggestion);\n                    } else {\n                        throw new _ErrorFromName(\"WinJS.UI.AutoSuggestBox.invalidSuggestionKind\", Strings.invalidSuggestionKind);\n                    }\n                    return root;\n                },\n\n                _shouldIgnoreInput: function asb_shouldIgnoreInput() {\n                    var processingIMEFocusLossKey = this._isProcessingDownKey || this._isProcessingUpKey || this._isProcessingTabKey || this._isProcessingEnterKey;\n                    return processingIMEFocusLossKey || this._isFlyoutPointerDown;\n                },\n\n                _submitQuery: function asb_submitQuery(queryText, fillLinguisticDetails, event) {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    // get the most up to date value of the input langauge from WinRT if available\n                    if (_WinRT.Windows.Globalization.Language) {\n                        this._lastKeyPressLanguage = _WinRT.Windows.Globalization.Language.currentInputMethodLanguageTag;\n                    }\n\n                    this._fireEvent(EventNames.querysubmitted, {\n                        language: this._lastKeyPressLanguage,\n                        linguisticDetails: this._getLinguisticDetails(true /*useCache*/, fillLinguisticDetails), // allow caching, but generate empty linguistic details if suggestion is used\n                        queryText: queryText,\n                        keyModifiers: getKeyModifiers(event)\n                    });\n\n                    if (this._suggestionManager) {\n                        this._suggestionManager.addToHistory(this._inputElement.value, this._lastKeyPressLanguage);\n                    }\n                },\n\n                _tryGetInputContext: function asb_tryGetInputContext() {\n                    // On WP, msGetInputContext is defined but throws when invoked\n                    if (this._inputElement.msGetInputContext) {\n                        try {\n                            return this._inputElement.msGetInputContext();\n                        } catch (e) {\n                            return null;\n                        }\n                    }\n                    return null;\n                },\n\n                _updateInputElementAriaLabel: function asb_updateInputElementAriaLabel() {\n                    this._inputElement.setAttribute(\"aria-label\",\n                        this._inputElement.placeholder ? _Resources._formatString(Strings.ariaLabelInputPlaceHolder, this._inputElement.placeholder) : Strings.ariaLabelInputNoPlaceHolder\n                    );\n                },\n\n                // Event Handlers\n                _flyoutBlurHandler: function asb_flyoutBlurHandler(event) {\n                    if (this._isElementInSearchControl(_Global.document.activeElement)) {\n                        this._internalFocusMove = true;\n                    } else {\n                        this._element.classList.remove(ClassNames.asbInputFocus);\n                        this._hideFlyout();\n                    }\n                },\n\n                _flyoutPointerDownHandler: function asb_flyoutPointerDownHandler(ev) {\n                    var that = this;\n                    var srcElement = ev.target;\n                    function findSuggestionElementIndex() {\n                        if (srcElement) {\n                            for (var i = 0; i < that._suggestionsData.length; i++) {\n                                if (that._repeater.elementFromIndex(i) === srcElement) {\n                                    return i;\n                                }\n                            }\n                        }\n                        return -1;\n                    }\n\n                    this._isFlyoutPointerDown = true;\n                    while (srcElement && (srcElement.parentNode !== this._repeaterElement)) {\n                        srcElement = srcElement.parentNode;\n                    }\n                    var index = findSuggestionElementIndex();\n                    if ((index >= 0) && (index < this._suggestionsData.length) && (this._currentFocusedIndex !== index)) {\n                        if (this._isSuggestionSelectable(this._suggestionsData.getAt(index))) {\n                            this._currentFocusedIndex = index;\n                            this._selectSuggestionAtIndex(index);\n                            this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);\n                        }\n                    }\n                    // Prevent default so focus does not leave input element.\n                    ev.preventDefault();\n                },\n\n                _flyoutPointerReleasedHandler: function asb_flyoutPointerReleasedHandler() {\n                    this._isFlyoutPointerDown = false;\n\n                    if (this._reflowImeOnPointerRelease) {\n                        this._reflowImeOnPointerRelease = false;\n                        var animation = Animations.createRepositionAnimation(this._flyoutElement);\n                        this._flyoutElement.style.marginTop = \"\";\n                        this._flyoutElement.style.marginLeft = \"\";\n                        animation.execute();\n                    }\n                },\n\n                _inputBlurHandler: function asb_inputBlurHandler(event) {\n                    // Hide flyout if focus is leaving the control\n                    if (!this._isElementInSearchControl(_Global.document.activeElement)) {\n                        this._element.classList.remove(ClassNames.asbInputFocus);\n                        this._hideFlyout();\n                    }\n                    this.queryText = this._prevQueryText; // Finalize IME composition\n                    this._isProcessingDownKey = false;\n                    this._isProcessingUpKey = false;\n                    this._isProcessingTabKey = false;\n                    this._isProcessingEnterKey = false;\n                },\n\n                _inputFocusHandler: function asb_inputFocusHandler(event) {\n                    // Refresh hit highlighting if text has changed since focus was present\n                    // This can happen if the user committed a suggestion previously.\n                    if (this._inputElement.value !== this._prevQueryText) {\n                        if (_WinRT.Windows.Data.Text.SemanticTextQuery) {\n                            if (this._inputElement.value !== \"\") {\n                                this._hitFinder = new _WinRT.Windows.Data.Text.SemanticTextQuery(this._inputElement.value, this._inputElement.lang);\n                            } else {\n                                this._hitFinder = null;\n                            }\n                        }\n                    }\n\n                    // If focus is returning to the input box from outside the control, show the flyout and refresh the suggestions\n                    if (event.target === this._inputElement && !this._internalFocusMove) {\n                        this._showFlyout();\n                        if (this._currentFocusedIndex !== -1) {\n                            // Focus is not in input\n                            this._selectSuggestionAtIndex(this._currentFocusedIndex);\n                        } else {\n                            this._updateFakeFocus();\n                        }\n\n                        this._suggestionManager.setQuery(\n                            this._inputElement.value,\n                            this._lastKeyPressLanguage,\n                            this._getLinguisticDetails(true /*useCache*/, true /*createFilled*/)\n                        );\n                    }\n\n                    this._internalFocusMove = false;\n                    this._element.classList.add(ClassNames.asbInputFocus);\n                },\n\n                _inputOrImeChangeHandler: function asb_inputImeChangeHandler() {\n                    var that = this;\n                    function hasLinguisticDetailsChanged(newLinguisticDetails) {\n                        var hasLinguisticDetailsChanged = false;\n                        if ((that._prevLinguisticDetails.queryTextCompositionStart !== newLinguisticDetails.queryTextCompositionStart) ||\n                            (that._prevLinguisticDetails.queryTextCompositionLength !== newLinguisticDetails.queryTextCompositionLength) ||\n                            (that._prevLinguisticDetails.queryTextAlternatives.length !== newLinguisticDetails.queryTextAlternatives.length)) {\n                            hasLinguisticDetailsChanged = true;\n                        }\n                        that._prevLinguisticDetails = newLinguisticDetails;\n                        return hasLinguisticDetailsChanged;\n                    }\n\n                    // swallow the IME change event that gets fired when composition is ended due to keyboarding down to the suggestion list & mouse down on the button\n                    if (!this._shouldIgnoreInput()) {\n                        var linguisticDetails = this._getLinguisticDetails(false /*useCache*/, true /*createFilled*/); // never cache on explicit user changes\n                        var hasLinguisticDetailsChanged = hasLinguisticDetailsChanged(linguisticDetails); // updates this._prevLinguisticDetails\n\n                        // Keep the previous composition cache up to date, execpt when composition ended with no text change and alternatives are kept.\n                        // In that case, we need to use the cached values to correctly generate the query prefix/suffix for substituting alternatives, but still report to the client that the composition has ended (via start & length of composition of 0)\n                        if ((this._inputElement.value !== this._prevQueryText) || (this._prevCompositionLength === 0) || (linguisticDetails.queryTextCompositionLength > 0)) {\n                            this._prevCompositionStart = linguisticDetails.queryTextCompositionStart;\n                            this._prevCompositionLength = linguisticDetails.queryTextCompositionLength;\n                        }\n\n                        if ((this._prevQueryText === this._inputElement.value) && !hasLinguisticDetailsChanged) {\n                            // Sometimes the input change is fired even if there is no change in input.\n                            // Swallow event in those cases.\n                            return;\n                        }\n                        this._prevQueryText = this._inputElement.value;\n\n                        // get the most up to date value of the input langauge from WinRT if available\n                        if (_WinRT.Windows.Globalization.Language) {\n                            this._lastKeyPressLanguage = _WinRT.Windows.Globalization.Language.currentInputMethodLanguageTag;\n                        }\n\n                        if (_WinRT.Windows.Data.Text.SemanticTextQuery) {\n                            if (this._inputElement.value !== \"\") {\n                                this._hitFinder = new _WinRT.Windows.Data.Text.SemanticTextQuery(this._inputElement.value, this._lastKeyPressLanguage);\n                            } else {\n                                this._hitFinder = null;\n                            }\n                        }\n\n                        this._fireEvent(EventNames.querychanged, {\n                            language: this._lastKeyPressLanguage,\n                            queryText: this._inputElement.value,\n                            linguisticDetails: linguisticDetails\n                        });\n\n                        this._suggestionManager.setQuery(\n                            this._inputElement.value,\n                            this._lastKeyPressLanguage,\n                            linguisticDetails\n                        );\n                    }\n                },\n\n                _inputPointerDownHandler: function asb_inputPointerDownHandler() {\n                    if ((_Global.document.activeElement === this._inputElement) && (this._currentSelectedIndex !== -1)) {\n                        this._currentFocusedIndex = -1;\n                        this._selectSuggestionAtIndex(this._currentFocusedIndex);\n                    }\n                },\n\n                _keyDownHandler: function asb_keyDownHandler(event) {\n                    var that = this;\n                    function setSelection(index) {\n                        that._currentFocusedIndex = index;\n                        that._selectSuggestionAtIndex(index);\n                        event.preventDefault();\n                        event.stopPropagation();\n                    }\n\n                    this._lastKeyPressLanguage = event.locale;\n                    if (event.keyCode === Key.tab) {\n                        this._isProcessingTabKey = true;\n                    } else if (event.keyCode === Key.upArrow) {\n                        this._isProcessingUpKey = true;\n                    } else if (event.keyCode === Key.downArrow) {\n                        this._isProcessingDownKey = true;\n                    } else if ((event.keyCode === Key.enter) && (event.locale === \"ko\")) {\n                        this._isProcessingEnterKey = true;\n                    }\n                    // Ignore keys handled by ime.\n                    if (event.keyCode !== Key.IME) {\n                        if (event.keyCode === Key.tab) {\n                            var closeFlyout = true;\n                            if (event.shiftKey) {\n                                if (this._currentFocusedIndex !== -1) {\n                                    // Focus is not in input\n                                    setSelection(-1);\n                                    closeFlyout = false;\n                                }\n                            } else if (this._currentFocusedIndex === -1) {\n                                this._currentFocusedIndex =\n                                    this._flyoutBelowInput\n                                    ? this._findNextSuggestionElementIndex(this._currentFocusedIndex)\n                                    : this._findPreviousSuggestionElementIndex(this._suggestionsData.length);\n                                if (this._currentFocusedIndex !== -1) {\n                                    // Found a selectable element\n                                    setSelection(this._currentFocusedIndex);\n                                    this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);\n                                    closeFlyout = false;\n                                }\n                            }\n\n                            if (closeFlyout) {\n                                this._hideFlyout();\n                            }\n                        } else if (event.keyCode === Key.escape) {\n                            if (this._currentFocusedIndex !== -1) {\n                                // Focus is not in input\n                                this.queryText = this._prevQueryText;\n                                setSelection(-1);\n                            } else if (this.queryText !== \"\") {\n                                this.queryText = \"\";\n                                this._inputOrImeChangeHandler(null);\n                                event.preventDefault();\n                                event.stopPropagation();\n                            }\n                        } else if ((this._flyoutBelowInput && event.keyCode === Key.upArrow) || (!this._flyoutBelowInput && event.keyCode === Key.downArrow)) {\n                            var prevIndex;\n                            if (this._currentSelectedIndex !== -1) {\n                                prevIndex = this._findPreviousSuggestionElementIndex(this._currentSelectedIndex);\n                                // Restore user entered query when user navigates back to input.\n                                if (prevIndex === -1) {\n                                    this.queryText = this._prevQueryText;\n                                }\n                            } else {\n                                prevIndex = this._findPreviousSuggestionElementIndex(this._suggestionsData.length);\n                            }\n                            setSelection(prevIndex);\n                            this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);\n                        } else if ((this._flyoutBelowInput && event.keyCode === Key.downArrow) || (!this._flyoutBelowInput && event.keyCode === Key.upArrow)) {\n                            var nextIndex = this._findNextSuggestionElementIndex(this._currentSelectedIndex);\n                            // Restore user entered query when user navigates back to input.\n                            if ((this._currentSelectedIndex !== -1) && (nextIndex === -1)) {\n                                this.queryText = this._prevQueryText;\n                            }\n                            setSelection(nextIndex);\n                            this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);\n                        } else if (event.keyCode === Key.enter) {\n                            if (this._currentSelectedIndex === -1) {\n                                this._submitQuery(this._inputElement.value, true /*fillLinguisticDetails*/, event);\n                            } else {\n                                this._processSuggestionChosen(this._suggestionsData.getAt(this._currentSelectedIndex), event);\n                            }\n                            this._hideFlyout();\n                        }\n                    }\n                },\n\n                _keyUpHandler: function asb_keyUpHandler(event) {\n                    if (event.keyCode === Key.tab) {\n                        this._isProcessingTabKey = false;\n                    } else if (event.keyCode === Key.upArrow) {\n                        this._isProcessingUpKey = false;\n                    } else if (event.keyCode === Key.downArrow) {\n                        this._isProcessingDownKey = false;\n                    } else if (event.keyCode === Key.enter) {\n                        this._isProcessingEnterKey = false;\n                    }\n                },\n\n                _keyPressHandler: function asb_keyPressHandler(event) {\n                    this._lastKeyPressLanguage = event.locale;\n                },\n\n                _msCandidateWindowHideHandler: function asb_msCandidateWindowHideHandler() {\n                    if (!this._isFlyoutPointerDown) {\n                        var animation = Animations.createRepositionAnimation(this._flyoutElement);\n                        this._flyoutElement.style.marginTop = \"\";\n                        this._flyoutElement.style.marginLeft = \"\";\n                        animation.execute();\n                    } else {\n                        this._reflowImeOnPointerRelease = true;\n                    }\n                },\n\n                _msCandidateWindowShowHandler: function asb_msCandidateWindowShowHandler() {\n                    this._addFlyoutIMEPaddingIfRequired();\n                    this._reflowImeOnPointerRelease = false;\n                },\n\n                _suggestionsChangedHandler: function asb_suggestionsChangedHandler(event) {\n                    var collectionChange = event.collectionChange || event.detail.collectionChange;\n                    var changeIndex = (+event.index === event.index) ? event.index : event.detail.index;\n                    var ChangeEnum = _SuggestionManagerShim._CollectionChange;\n                    if (collectionChange === ChangeEnum.reset) {\n                        if (this._isFlyoutShown()) {\n                            this._hideFlyout();\n                        }\n                        this._suggestionsData.splice(0, this._suggestionsData.length);\n                    } else if (collectionChange === ChangeEnum.itemInserted) {\n                        var suggestion = this._suggestions[changeIndex];\n                        this._suggestionsData.splice(changeIndex, 0, suggestion);\n\n                        this._showFlyout();\n\n                    } else if (collectionChange === ChangeEnum.itemRemoved) {\n                        if ((this._suggestionsData.length === 1)) {\n                            _ElementUtilities._setActive(this._inputElement);\n\n                            this._hideFlyout();\n                        }\n                        this._suggestionsData.splice(changeIndex, 1);\n                    } else if (collectionChange === ChangeEnum.itemChanged) {\n                        var suggestion = this._suggestions[changeIndex];\n                        if (suggestion !== this._suggestionsData.getAt(changeIndex)) {\n                            this._suggestionsData.setAt(changeIndex, suggestion);\n                        } else {\n                            // If the suggestions manager gives us an identical item, it means that only the hit highlighted text has changed.\n                            var existingElement = this._repeater.elementFromIndex(changeIndex);\n                            if (_ElementUtilities.hasClass(existingElement, ClassNames.asbSuggestionQuery)) {\n                                addHitHighlightedText(existingElement, suggestion, suggestion.text);\n                            } else {\n                                var resultSuggestionDiv = existingElement.querySelector(\".\" + ClassNames.asbSuggestionResultText);\n                                if (resultSuggestionDiv) {\n                                    addHitHighlightedText(resultSuggestionDiv, suggestion, suggestion.text);\n                                    var resultSuggestionDetailDiv = existingElement.querySelector(\".\" + ClassNames.asbSuggestionResultDetailedText);\n                                    if (resultSuggestionDetailDiv) {\n                                        addHitHighlightedText(resultSuggestionDetailDiv, suggestion, suggestion.detailText);\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    if (_Global.document.activeElement === this._inputElement) {\n                        this._updateFakeFocus();\n                    }\n                },\n\n                _suggestionsRequestedHandler: function asb_suggestionsRequestedHandler(event) {\n                    // get the most up to date value of the input langauge from WinRT if available\n                    if (_WinRT.Windows.Globalization.Language) {\n                        this._lastKeyPressLanguage = _WinRT.Windows.Globalization.Language.currentInputMethodLanguageTag;\n                    }\n\n                    var request = event.request || event.detail.request;\n                    var deferral;\n                    this._fireEvent(EventNames.suggestionsrequested, {\n                        setPromise: function (promise) {\n                            deferral = request.getDeferral();\n                            promise.then(function () {\n                                deferral.complete();\n                            });\n                        },\n                        searchSuggestionCollection: request.searchSuggestionCollection,\n                        language: this._lastKeyPressLanguage,\n                        linguisticDetails: this._getLinguisticDetails(true /*useCache*/, true /*createFilled*/),\n                        queryText: this._inputElement.value\n                    });\n                },\n            }, {\n                createResultSuggestionImage: function asb_createResultSuggestionImage(url) {\n                    /// <signature helpKeyword=\"WinJS.UI.AutoSuggestBox.createResultSuggestionImage\">\n                    /// <summary locid=\"WinJS.UI.AutoSuggestBox.createResultSuggestionImage\">\n                    /// Creates the image argument for SearchSuggestionCollection.appendResultSuggestion.\n                    /// </summary>\n                    /// <param name=\"url\" type=\"string\" locid=\"WinJS.UI.AutoSuggestBox.asb_createResultSuggestionImage_p:url\">\n                    /// The url of the image.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (_WinRT.Windows.Foundation.Uri && _WinRT.Windows.Storage.Streams.RandomAccessStreamReference) {\n                        return _WinRT.Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(new _WinRT.Windows.Foundation.Uri(url));\n                    }\n                    return url;\n                },\n\n                _EventNames: EventNames,\n\n                _sortAndMergeHits: function asb_sortAndMergeHits(hitsProvided) {\n                    function hitStartPositionAscendingSorter(firstHit, secondHit) {\n                        var returnValue = 0;\n                        if (firstHit.startPosition < secondHit.startPosition) {\n                            returnValue = -1;\n                        } else if (firstHit.startPosition > secondHit.startPosition) {\n                            returnValue = 1;\n                        }\n                        return returnValue;\n                    }\n                    function hitIntersectionReducer(reducedHits, nextHit, currentIndex) {\n                        if (currentIndex === 0) {\n                            reducedHits.push(nextHit);\n                        } else {\n                            var curHit = reducedHits[reducedHits.length - 1];\n                            var curHitEndPosition = curHit.startPosition + curHit.length;\n                            if (nextHit.startPosition <= curHitEndPosition) {\n                                // The next hit intersects or is next to current hit. Merge it.\n                                var nextHitEndPosition = nextHit.startPosition + nextHit.length;\n                                if (nextHitEndPosition > curHitEndPosition) {\n                                    curHit.length = nextHitEndPosition - curHit.startPosition;\n                                }\n                            } else {\n                                // No intersection, simply add to reduced list.\n                                reducedHits.push(nextHit);\n                            }\n                        }\n                        return reducedHits;\n                    }\n\n                    var reducedHits = [];\n                    if (hitsProvided) {\n                        // Copy hitsprovided array as winrt objects are immutable.\n                        var hits = new Array(hitsProvided.length);\n                        for (var i = 0; i < hitsProvided.length; i++) {\n                            hits.push({ startPosition: hitsProvided[i].startPosition, length: hitsProvided[i].length });\n                        }\n                        hits.sort(hitStartPositionAscendingSorter);\n                        hits.reduce(hitIntersectionReducer, reducedHits);\n                    }\n                    return reducedHits;\n                }\n            });\n\n            function addHitHighlightedText(element, item, text, hitFinder) {\n                function addNewSpan(element, textContent, insertBefore) {\n                    // Adds new span element with specified inner text as child to element, placed before insertBefore\n                    var spanElement = _Global.document.createElement(\"span\");\n                    spanElement.textContent = textContent;\n                    spanElement.setAttribute(\"aria-hidden\", \"true\");\n                    spanElement.classList.add(ClassNames.asbHitHighlightSpan);\n                    element.insertBefore(spanElement, insertBefore);\n                    return spanElement;\n                }\n\n                if (text) {\n                    // Remove any existing hit highlighted text spans\n                    _ElementListUtilities.query(\".\" + ClassNames.asbHitHighlightSpan, element).forEach(function (childElement) {\n                        childElement.parentNode.removeChild(childElement);\n                    });\n\n                    // Insert spans at the front of element\n                    var firstChild = element.firstChild;\n\n                    var hitsProvided = item.hits;\n                    if ((!hitsProvided) && (hitFinder) && (item.kind !== _SuggestionManagerShim._SearchSuggestionKind.Separator)) {\n                        hitsProvided = hitFinder.find(text);\n                    }\n\n                    var hits = AutoSuggestBox._sortAndMergeHits(hitsProvided);\n\n                    var lastPosition = 0;\n                    for (var i = 0; i < hits.length; i++) {\n                        var hit = hits[i];\n\n                        // Add previous normal text\n                        addNewSpan(element, text.substring(lastPosition, hit.startPosition), firstChild);\n\n                        lastPosition = hit.startPosition + hit.length;\n\n                        // Add hit highlighted text\n                        var spanHitHighlightedText = addNewSpan(element, text.substring(hit.startPosition, lastPosition), firstChild);\n                        _ElementUtilities.addClass(spanHitHighlightedText, ClassNames.asbBoxFlyoutHighlightText);\n                    }\n\n                    // Add final normal text\n                    if (lastPosition < text.length) {\n                        addNewSpan(element, text.substring(lastPosition), firstChild);\n                    }\n                }\n            }\n\n            function getKeyModifiers(ev) {\n                // Returns the same value as https://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.system.virtualkeymodifiers\n                var VirtualKeys = {\n                    ctrlKey: 1,\n                    altKey: 2,\n                    shiftKey: 4\n                };\n\n                var keyModifiers = 0;\n                if (ev.ctrlKey) {\n                    keyModifiers |= VirtualKeys.ctrlKey;\n                }\n                if (ev.altKey) {\n                    keyModifiers |= VirtualKeys.altKey;\n                }\n                if (ev.shiftKey) {\n                    keyModifiers |= VirtualKeys.shiftKey;\n                }\n                return keyModifiers;\n            }\n\n            function resultSuggestionRenderer(asb, item) {\n                function handleInvoke(e) {\n                    asb._internalFocusMove = true;\n                    asb._inputElement.focus();\n                    asb._processSuggestionChosen(item, e);\n                }\n\n                var root = _Global.document.createElement(\"div\");\n                var image = new _Global.Image();\n                image.style.opacity = 0;\n                var loadImage = function (url) {\n                    function onload() {\n                        image.removeEventListener(\"load\", onload, false);\n                        Animations.fadeIn(image);\n                    }\n                    image.addEventListener(\"load\", onload, false);\n                    image.src = url;\n                };\n\n                if (item.image !== null) {\n                    item.image.openReadAsync().then(function (streamWithContentType) {\n                        if (streamWithContentType !== null) {\n                            loadImage(_Global.URL.createObjectURL(streamWithContentType, { oneTimeOnly: true }));\n                        }\n                    });\n                } else if (item.imageUrl !== null) {\n                    loadImage(item.imageUrl);\n                }\n                image.setAttribute(\"aria-hidden\", \"true\");\n                root.appendChild(image);\n\n                var divElement = _Global.document.createElement(\"div\");\n                _ElementUtilities.addClass(divElement, ClassNames.asbSuggestionResultText);\n                addHitHighlightedText(divElement, item, item.text);\n                divElement.title = item.text;\n                divElement.setAttribute(\"aria-hidden\", \"true\");\n                root.appendChild(divElement);\n\n                var brElement = _Global.document.createElement(\"br\");\n                divElement.appendChild(brElement);\n\n                var divDetailElement = _Global.document.createElement(\"span\");\n                _ElementUtilities.addClass(divDetailElement, ClassNames.asbSuggestionResultDetailedText);\n                addHitHighlightedText(divDetailElement, item, item.detailText);\n                divDetailElement.title = item.detailText;\n                divDetailElement.setAttribute(\"aria-hidden\", \"true\");\n                divElement.appendChild(divDetailElement);\n\n                _ElementUtilities.addClass(root, ClassNames.asbSuggestionResult);\n\n                _ElementUtilities._addEventListener(root, \"click\", function (e) {\n                    if (!asb._isFlyoutPointerDown) {\n                        handleInvoke(e);\n                    }\n                });\n                _ElementUtilities._addEventListener(root, \"pointerup\", handleInvoke);\n\n                root.setAttribute(\"role\", \"option\");\n                var ariaLabel = _Resources._formatString(Strings.ariaLabelResult, item.text, item.detailText);\n                root.setAttribute(\"aria-label\", ariaLabel);\n                return root;\n            }\n\n            function querySuggestionRenderer(asb, item) {\n                function handleInvoke(e) {\n                    asb._internalFocusMove = true;\n                    asb._inputElement.focus();\n                    asb._processSuggestionChosen(item, e);\n                }\n\n                var root = _Global.document.createElement(\"div\");\n\n                addHitHighlightedText(root, item, item.text);\n                root.title = item.text;\n\n                root.classList.add(ClassNames.asbSuggestionQuery);\n\n                _ElementUtilities._addEventListener(root, \"click\", function (e) {\n                    if (!asb._isFlyoutPointerDown) {\n                        handleInvoke(e);\n                    }\n                });\n                _ElementUtilities._addEventListener(root, \"pointerup\", handleInvoke);\n\n                var ariaLabel = _Resources._formatString(Strings.ariaLabelQuery, item.text);\n                root.setAttribute(\"role\", \"option\");\n                root.setAttribute(\"aria-label\", ariaLabel);\n\n                return root;\n            }\n\n            function separatorSuggestionRenderer(item) {\n                var root = _Global.document.createElement(\"div\");\n                if (item.text.length > 0) {\n                    var textElement = _Global.document.createElement(\"div\");\n                    textElement.textContent = item.text;\n                    textElement.title = item.text;\n                    textElement.setAttribute(\"aria-hidden\", \"true\");\n                    root.appendChild(textElement);\n                }\n                root.insertAdjacentHTML(\"beforeend\", \"<hr/>\");\n                _ElementUtilities.addClass(root, ClassNames.asbSuggestionSeparator);\n                root.setAttribute(\"role\", \"separator\");\n                var ariaLabel = _Resources._formatString(Strings.ariaLabelSeparator, item.text);\n                root.setAttribute(\"aria-label\", ariaLabel);\n                return root;\n            }\n\n            _Base.Class.mix(AutoSuggestBox, _Control.DOMEventMixin);\n            return AutoSuggestBox;\n        })\n    });\n    exports.ClassNames = ClassNames;\n});\n\n\ndefine('require-style!less/styles-searchbox',[],function(){});\n\ndefine('require-style!less/colors-searchbox',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/SearchBox',[\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    './AutoSuggestBox',\n    '../_Accents',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    './AutoSuggestBox/_SearchSuggestionManagerShim',\n    '../Application',\n    'require-style!less/styles-searchbox',\n    'require-style!less/colors-searchbox'\n], function searchboxInit(_Global, _WinRT, _Base, _ErrorFromName, _Events, _Resources, AutoSuggestBox, _Accents, _Control, _ElementUtilities, _SuggestionManagerShim, Application) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\"html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover\", [{ name: \"color\", value: _Accents.ColorTypes.accent }, ]);\n    _Accents.createAccentRule(\".win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active\", [{ name: \"background-color\", value: _Accents.ColorTypes.accent }, ]);\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.SearchBox\">\n        /// Enables the user to perform search queries and select suggestions.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.search.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.search.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.SearchBox\"></div>]]></htmlSnippet>\n        /// <event name=\"receivingfocusonkeyboardinput\" bubbles=\"true\" locid=\"WinJS.UI.SearchBox_e:receivingfocusonkeyboardinput\">\n        /// Raised when the app automatically redirects focus to the search box. This event can only be raised when the focusOnKeyboardInput property is set to true.\n        /// </event>\n        /// <part name=\"searchbox\" class=\"win-searchbox\" locid=\"WinJS.UI.SearchBox:search\">Styles the entire Search box control.</part>\n        /// <part name=\"searchbox-input\" class=\"win-searchbox-input\" locid=\"WinJS.UI.SearchBox_part:Input\">Styles the query input box.</part>\n        /// <part name=\"searchbox-button\" class=\"win-searchbox-button\" locid=\"WinJS.UI.SearchBox_part:Button\">Styles the search button.</part>\n        /// <part name=\"searchbox-flyout\" class=\"win-searchbox-flyout\" locid=\"WinJS.UI.SearchBox_part:Flyout\">Styles the result suggestions flyout.</part>\n        /// <part name=\"searchbox-suggestion-result\" class=\"win-searchbox-suggestion-result\" locid=\"WinJS.UI.SearchBox_part:Suggestion_Result\">Styles the result type suggestion.</part>\n        /// <part name=\"searchbox-suggestion-query\" class=\"win-searchbox-suggestion-query\" locid=\"WinJS.UI.SearchBox_part:Suggestion_Query\">Styles the query type suggestion.</part>\n        /// <part name=\"searchbox-suggestion-separator\" class=\"win-searchbox-suggestion-separator\" locid=\"WinJS.UI.SearchBox_part:Suggestion_Separator\">\n        /// Styles the separator type suggestion.\n        /// </part>\n        /// <part name=\"searchbox-suggestion-selected\" class=\"win-searchbox-suggestion-selected\" locid=\"WinJS.UI.SearchBox_part:Suggestion_Selected\">\n        /// Styles the currently selected suggestion.\n        /// </part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        SearchBox: _Base.Namespace._lazy(function () {\n\n            // Enums\n            var ClassName = {\n                searchBox: \"win-searchbox\",\n                searchBoxDisabled: \"win-searchbox-disabled\",\n                searchBoxInput: \"win-searchbox-input\",\n                searchBoxInputFocus: \"win-searchbox-input-focus\",\n                searchBoxButton: \"win-searchbox-button\",\n                searchBoxFlyout: \"win-searchbox-flyout\",\n                searchBoxFlyoutHighlightText: \"win-searchbox-flyout-highlighttext\",\n                searchBoxHitHighlightSpan: \"win-searchbox-hithighlight-span\",\n                searchBoxSuggestionResult: \"win-searchbox-suggestion-result\",\n                searchBoxSuggestionResultText: \"win-searchbox-suggestion-result-text\",\n                searchBoxSuggestionResultDetailedText: \"win-searchbox-suggestion-result-detailed-text\",\n                searchBoxSuggestionSelected: \"win-searchbox-suggestion-selected\",\n                searchBoxSuggestionQuery: \"win-searchbox-suggestion-query\",\n                searchBoxSuggestionSeparator: \"win-searchbox-suggestion-separator\",\n                searchBoxButtonInputFocus: \"win-searchbox-button-input-focus\",\n                searchBoxButtonDisabled: \"win-searchbox-button-disabled\"\n            };\n\n            var EventName = {\n                receivingfocusonkeyboardinput: \"receivingfocusonkeyboardinput\"\n            };\n\n            var strings = {\n                get invalidSearchBoxSuggestionKind() { return \"Error: Invalid search suggestion kind.\"; },\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/searchBoxAriaLabel\").value; },\n                get ariaLabelInputNoPlaceHolder() { return _Resources._getWinJSString(\"ui/searchBoxAriaLabelInputNoPlaceHolder\").value; },\n                get ariaLabelInputPlaceHolder() { return _Resources._getWinJSString(\"ui/searchBoxAriaLabelInputPlaceHolder\").value; },\n                get searchBoxDeprecated() { return \"SearchBox is deprecated and may not be available in future releases. Instead use AutoSuggestBox.\"; }\n            };\n\n            var SearchBox = _Base.Class.derive(AutoSuggestBox.AutoSuggestBox, function SearchBox_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.SearchBox.SearchBox\">\n                /// <summary locid=\"WinJS.UI.SearchBox.constructor\">\n                /// Creates a new SearchBox.\n                /// </summary>\n                /// <param name=\"element\" domElement=\"true\" locid=\"WinJS.UI.SearchBox.constructor_p:element\">\n                /// The DOM element that hosts the SearchBox.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.SearchControl.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the querychanged event,\n                /// add a property named \"onquerychanged\" to the options object and set its value to the event handler.\n                /// This parameter is optional.\n                /// </param>\n                /// <returns type=\"WinJS.UI.SearchBox\" locid=\"WinJS.UI.SearchBox.constructor_returnValue\">\n                /// The new SearchBox.\n                /// </returns>\n                /// <deprecated type=\"deprecate\">\n                /// SearchBox is deprecated and may not be available in future releases. Instead use AutoSuggestBox.\n                /// </deprecated>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n                \n                _ElementUtilities._deprecated(strings.searchBoxDeprecated);\n                \n                this._requestingFocusOnKeyboardInputHandlerBind = this._requestingFocusOnKeyboardInputHandler.bind(this);\n\n                // Elements\n                this._buttonElement = _Global.document.createElement(\"div\");\n\n                // Variables\n                this._focusOnKeyboardInput = false;\n\n                // Calling the super constructor - since the super constructor processes the options,\n                // any property setter at this point must be functional.\n                AutoSuggestBox.AutoSuggestBox.call(this, element, options);\n\n                // Add SearchBox classes to DOM elements\n                this.element.classList.add(ClassName.searchBox);\n                this._flyoutElement.classList.add(ClassName.searchBoxFlyout);\n\n                this._inputElement.classList.add(ClassName.searchBoxInput);\n                this._inputElement.addEventListener(\"blur\", this._searchboxInputBlurHandler.bind(this));\n                this._inputElement.addEventListener(\"focus\", this._searchboxInputFocusHandler.bind(this));\n\n                this._buttonElement.tabIndex = -1;\n                this._buttonElement.classList.add(ClassName.searchBoxButton);\n                this._buttonElement.addEventListener(\"click\", this._buttonClickHandler.bind(this));\n                _ElementUtilities._addEventListener(this._buttonElement, \"pointerdown\", this._buttonPointerDownHandler.bind(this));\n                this.element.appendChild(this._buttonElement);\n            }, {\n                /// <field type='String' locid=\"WinJS.UI.SearchBox.focusOnKeyboardInput\" helpKeyword=\"WinJS.UI.SearchBox.focusOnKeyboardInput\">\n                /// Enable automatically focusing the search box when the user types into the app window (off by default) While this is enabled,\n                /// input on the current thread will be intercepted and redirected to the search box. Only textual input will trigger the search box to focus.\n                /// The caller will continue to receive non-text keys (such as arrows, tab, etc\n                /// This will also not affect WIN/CTRL/ALT key combinations (except for Ctrl-V for paste).\n                /// If the client needs more to happen than just set focus in the box (make control visible, etc.), they will need to handle the event.\n                /// If enabled, the app must be sure to disable this if the user puts focus in some other edit field.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                focusOnKeyboardInput: {\n                    get: function () {\n                        return this._focusOnKeyboardInput;\n                    },\n                    set: function (value) {\n                        if (this._focusOnKeyboardInput && !value) {\n                            Application._applicationListener.removeEventListener(this.element, \"requestingfocusonkeyboardinput\", this._requestingFocusOnKeyboardInputHandlerBind);\n                        } else if (!this._focusOnKeyboardInput && !!value) {\n                            Application._applicationListener.addEventListener(this.element, \"requestingfocusonkeyboardinput\", this._requestingFocusOnKeyboardInputHandlerBind);\n                        }\n                        this._focusOnKeyboardInput = !!value;\n                    }\n                },\n\n                // Methods\n                dispose: function SearchBox() {\n                    /// <signature helpKeyword=\"WinJS.UI.SearchBox.dispose\">\n                    /// <summary locid=\"WinJS.UI.SearchBox.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    AutoSuggestBox.AutoSuggestBox.prototype.dispose.call(this);\n\n                    if (this._focusOnKeyboardInput) {\n                        Application._applicationListener.removeEventListener(this.element, \"requestingfocusonkeyboardinput\", this._requestingFocusOnKeyboardInputHandlerBind);\n                    }\n                },\n\n                // Private methods \n                _disableControl: function SearchBox_disableControl() {\n                    AutoSuggestBox.AutoSuggestBox.prototype._disableControl.call(this);\n                    this._buttonElement.disabled = true;\n                    this._buttonElement.classList.add(ClassName.searchBoxButtonDisabled);\n                    this.element.classList.add(ClassName.searchBoxDisabled);\n                },\n\n                _enableControl: function SearchBox_enableControl() {\n                    AutoSuggestBox.AutoSuggestBox.prototype._enableControl.call(this);\n                    this._buttonElement.disabled = false;\n                    this._buttonElement.classList.remove(ClassName.searchBoxButtonDisabled);\n                    this.element.classList.remove(ClassName.searchBoxDisabled);\n                },\n\n                _renderSuggestion: function SearchBox_renderSuggestion(suggestion) {\n                    // Overrides base class\n                    var render = AutoSuggestBox.AutoSuggestBox.prototype._renderSuggestion.call(this, suggestion);\n                    if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) {\n                        render.classList.add(ClassName.searchBoxSuggestionQuery);\n                    } else if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Separator) {\n                        render.classList.add(ClassName.searchBoxSuggestionSeparator);\n                    } else {\n                        render.classList.add(ClassName.searchBoxSuggestionResult);\n\n                        var resultText = render.querySelector(\".\" + AutoSuggestBox.ClassNames.asbSuggestionResultText);\n                        resultText.classList.add(ClassName.searchBoxSuggestionResultText);\n\n                        var resultDetailText = render.querySelector(\".\" + AutoSuggestBox.ClassNames.asbSuggestionResultDetailedText);\n                        resultDetailText.classList.add(ClassName.searchBoxSuggestionResultDetailedText);\n\n                        var spans = render.querySelectorAll(\".\" + AutoSuggestBox.ClassNames.asbHitHighlightSpan);\n                        for (var i = 0, len = spans.length; i < len; i++) {\n                            spans[i].classList.add(ClassName.searchBoxHitHighlightSpan);\n                        }\n                        var highlightTexts = render.querySelectorAll(\".\" + AutoSuggestBox.ClassNames.asbBoxFlyoutHighlightText);\n                        for (var i = 0, len = highlightTexts.length; i < len; i++) {\n                            highlightTexts[i].classList.add(ClassName.searchBoxFlyoutHighlightText);\n                        }\n                    }\n                    return render;\n                },\n\n                _selectSuggestionAtIndex: function SearchBox_selectSuggestionAtIndex(indexToSelect) {\n                    // Overrides base class\n                    AutoSuggestBox.AutoSuggestBox.prototype._selectSuggestionAtIndex.call(this, indexToSelect);\n\n                    var currentSelected = this.element.querySelector(\".\" + ClassName.searchBoxSuggestionSelected);\n                    currentSelected && currentSelected.classList.remove(ClassName.searchBoxSuggestionSelected);\n                    var newSelected = this.element.querySelector(\".\" + AutoSuggestBox.ClassNames.asbSuggestionSelected);\n                    newSelected && newSelected.classList.add(ClassName.searchBoxSuggestionSelected);\n                },\n\n                _shouldIgnoreInput: function SearchBox_shouldIgnoreInput() {\n                    // Overrides base class\n                    var shouldIgnore = AutoSuggestBox.AutoSuggestBox.prototype._shouldIgnoreInput();\n                    var isButtonDown = _ElementUtilities._matchesSelector(this._buttonElement, \":active\");\n\n                    return shouldIgnore || isButtonDown;\n                },\n\n                _updateInputElementAriaLabel: function SearchBox_updateInputElementAriaLabel() {\n                    // Override base class\n                    this._inputElement.setAttribute(\"aria-label\",\n                        this._inputElement.placeholder ? _Resources._formatString(strings.ariaLabelInputPlaceHolder, this._inputElement.placeholder) : strings.ariaLabelInputNoPlaceHolder\n                    );\n                },\n\n                // Event Handlers\n                _buttonPointerDownHandler: function SearchBox_buttonPointerDownHandler(e) {\n                    this._inputElement.focus();\n                    e.preventDefault();\n                },\n\n                _buttonClickHandler: function SearchBox_buttonClickHandler(event) {\n                    this._inputElement.focus();\n                    this._submitQuery(this._inputElement.value, true /*fillLinguisticDetails*/, event);\n                    this._hideFlyout();\n                },\n\n                _searchboxInputBlurHandler: function SearchBox_inputBlurHandler() {\n                    _ElementUtilities.removeClass(this.element, ClassName.searchBoxInputFocus);\n                    _ElementUtilities.removeClass(this._buttonElement, ClassName.searchBoxButtonInputFocus);\n                },\n\n                _searchboxInputFocusHandler: function SearchBox_inputFocusHandler() {\n                    _ElementUtilities.addClass(this.element, ClassName.searchBoxInputFocus);\n                    _ElementUtilities.addClass(this._buttonElement, ClassName.searchBoxButtonInputFocus);\n                },\n\n                // Type to search helpers\n                _requestingFocusOnKeyboardInputHandler: function SearchBox_requestingFocusOnKeyboardInputHandler() {\n                    this._fireEvent(EventName.receivingfocusonkeyboardinput, null);\n                    if (_Global.document.activeElement !== this._inputElement) {\n                        try {\n                            this._inputElement.focus();\n                        } catch (e) {\n                        }\n                    }\n                }\n\n            }, {\n                createResultSuggestionImage: function SearchBox_createResultSuggestionImage(url) {\n                    /// <signature helpKeyword=\"WinJS.UI.SearchBox.createResultSuggestionImage\">\n                    /// <summary locid=\"WinJS.UI.SearchBox.createResultSuggestionImage\">\n                    /// Creates the image argument for SearchSuggestionCollection.appendResultSuggestion.\n                    /// </summary>\n                    /// <param name=\"url\" type=\"string\" locid=\"WinJS.UI.SearchBox.SearchBox_createResultSuggestionImage_p:url\">\n                    /// The url of the image.\n                    /// </param>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (_WinRT.Windows.Foundation.Uri && _WinRT.Windows.Storage.Streams.RandomAccessStreamReference) {\n                        return _WinRT.Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(new _WinRT.Windows.Foundation.Uri(url));\n                    }\n                    return url;\n                },\n\n                _getKeyModifiers: function SearchBox_getKeyModifiers(ev) {\n                    // Returns the same value as https://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.system.virtualkeymodifiers\n                    var VirtualKeys = {\n                        ctrlKey: 1,\n                        altKey: 2,\n                        shiftKey: 4\n                    };\n\n                    var keyModifiers = 0;\n                    if (ev.ctrlKey) {\n                        keyModifiers |= VirtualKeys.ctrlKey;\n                    }\n                    if (ev.altKey) {\n                        keyModifiers |= VirtualKeys.altKey;\n                    }\n                    if (ev.shiftKey) {\n                        keyModifiers |= VirtualKeys.shiftKey;\n                    }\n                    return keyModifiers;\n                },\n\n                _isTypeToSearchKey: function searchBox__isTypeToSearchKey(event) {\n                    if (event.shiftKey || event.ctrlKey || event.altKey) {\n                        return false;\n                    }\n                    return true;\n                }\n            });\n            _Base.Class.mix(SearchBox, _Control.DOMEventMixin);\n            return SearchBox;\n        })\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <dictionary>appbar,Flyout,Flyouts,registeredforsettings,SettingsFlyout,Statics,Syriac</dictionary>\ndefine('WinJS/Controls/SettingsFlyout',[\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Events',\n    '../Core/_Resources',\n    '../Core/_WriteProfilerMark',\n    '../Animations',\n    '../Pages',\n    '../Promise',\n    '../_LightDismissService',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_ElementListUtilities',\n    '../Utilities/_Hoverable',\n    './_LegacyAppBar/_Constants',\n    './Flyout/_Overlay'\n    ], function settingsFlyoutInit(_Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, Pages, Promise, _LightDismissService, _Dispose, _ElementUtilities, _ElementListUtilities, _Hoverable, _Constants, _Overlay) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.SettingsFlyout\">Provides users with fast, in-context access to settings that affect the current app.</summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n        /// </field>\n        /// <name locid=\"WinJS.UI.SettingsFlyout_name\">Settings Flyout</name>\n        /// <icon src=\"ui_winjs.ui.settingsflyout.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.settingsflyout.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.SettingsFlyout\">\n        /// <div class=\"win-header\">\n        /// <button type=\"button\" onclick=\"WinJS.UI.SettingsFlyout.show()\" class=\"win-backbutton\"></button>\n        /// <div class=\"win-label\">Custom Settings</div>\n        /// </div>\n        /// <div class=\"win-content\">\n        /// {Your Content Here}\n        /// </div>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"beforeshow\" locid=\"WinJS.UI.SettingsFlyout_e:beforeshow\">Raised just before showing a SettingsFlyout.</event>\n        /// <event name=\"aftershow\" locid=\"WinJS.UI.SettingsFlyout_e:aftershow\">Raised immediately after a SettingsFlyout is fully shown.</event>\n        /// <event name=\"beforehide\" locid=\"WinJS.UI.SettingsFlyout_e:beforehide\">Raised just before hiding a SettingsFlyout.</event>\n        /// <event name=\"afterhide\" locid=\"WinJS.UI.SettingsFlyout_e:afterhide\">Raised immediately after a SettingsFlyout is fully hidden.</event>\n        /// <part name=\"settings\" class=\"win-settingsflyout\" locid=\"WinJS.UI.SettingsFlyout_part:settings\">The SettingsFlyout control itself.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        SettingsFlyout: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            var createEvent = _Events._createEventProperty;\n\n            var settingsPageIsFocusedOnce;\n\n            // Constants for width\n            var settingsNarrow = \"narrow\",\n                settingsWide = \"wide\";\n\n            // Determine if the settings pane (system language) is RTL or not.\n            function _shouldAnimateFromLeft() {\n                if (_WinRT.Windows.UI.ApplicationSettings.SettingsEdgeLocation) {\n                    var appSettings = _WinRT.Windows.UI.ApplicationSettings;\n                    return (appSettings.SettingsPane.edge === appSettings.SettingsEdgeLocation.left);\n                } else {\n                    return false;\n                }\n            }\n\n            // Get the settings control by matching the settingsCommandId\n            // if no match we'll try to match element id\n            function _getChildSettingsControl(parentElement, id) {\n                var settingElements = parentElement.querySelectorAll(\".\" + _Constants.settingsFlyoutClass);\n                var retValue,\n                    control;\n                for (var i = 0; i < settingElements.length; i++) {\n                    control = settingElements[i].winControl;\n                    if (control) {\n                        if (control.settingsCommandId === id) {\n                            retValue = control;\n                            break;\n                        }\n                        if (settingElements[i].id === id) {\n                            retValue = retValue || control;\n                        }\n                    }\n                }\n\n                return retValue;\n            }\n\n            var SettingsFlyout = _Base.Class.derive(_Overlay._Overlay, function SettingsFlyout_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.SettingsFlyout.SettingsFlyout\">\n                /// <summary locid=\"WinJS.UI.SettingsFlyout.constructor\">Creates a new SettingsFlyout control.</summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.SettingsFlyout.constructor_p:element\">\n                /// The DOM element that will host the control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.SettingsFlyout.constructor_p:options\">\n                /// The set of properties and values to apply to the new SettingsFlyout.\n                /// </param>\n                /// <returns type=\"WinJS.UI.SettingsFlyout\" locid=\"WinJS.UI.SettingsFlyout.constructor_returnValue\">The new SettingsFlyout control.</returns>\n                /// <deprecated type=\"deprecate\">\n                /// SettingsFlyout is deprecated and may not be available in future releases. Instead, put\n                /// settings on their own page within the app.\n                /// </deprecated>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n                \n                _ElementUtilities._deprecated(strings.settingsFlyoutIsDeprecated);\n\n                // Make sure there's an input element\n                this._element = element || _Global.document.createElement(\"div\");\n                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                // Call the base overlay constructor helper\n                this._baseOverlayConstructor(this._element, options);\n\n                this._addFirstDiv();\n                this._addFinalDiv();\n\n                // Handle \"esc\" & \"tab\" key presses\n                this._element.addEventListener(\"keydown\", this._handleKeyDown, true);\n\n                // Start settings hidden\n                this._element.style.visibilty = \"hidden\";\n                this._element.style.display = \"none\";\n\n                // Attach our css class\n                _ElementUtilities.addClass(this._element, _Constants.settingsFlyoutClass);\n                \n                var that = this;\n                this._dismissable = new _LightDismissService.LightDismissableElement({\n                    element: this._element,\n                    tabIndex: this._element.hasAttribute(\"tabIndex\") ? this._element.tabIndex : -1,\n                    onLightDismiss: function () {\n                        that.hide();\n                    },\n                    onTakeFocus: function (useSetActive) {\n                        if (!that._dismissable.restoreFocus()) {\n                            var firstDiv = that.element.querySelector(\".\" + _Constants.firstDivClass);\n                            if (firstDiv) {\n                                if (!firstDiv.msSettingsFlyoutFocusOut) {\n                                    _ElementUtilities._addEventListener(firstDiv, \"focusout\", function () { settingsPageIsFocusedOnce = 1; }, false);\n                                    firstDiv.msSettingsFlyoutFocusOut = true;\n                                }\n                                \n                                settingsPageIsFocusedOnce = 0;\n                                _ElementUtilities._tryFocus(firstDiv, useSetActive);\n                            }\n                        }\n                    },\n                });\n\n                // apply the light theme styling to the win-content elements inside the SettingsFlyout\n                _ElementListUtilities.query(\"div.win-content\", this._element).\n                    forEach(function (e) {\n                        if (!_ElementUtilities._matchesSelector(e, '.win-ui-dark, .win-ui-dark *')){\n                            _ElementUtilities.addClass(e, _Constants.flyoutLightClass);\n                        }\n                    });\n\n                // Make sure we have an ARIA role\n                var role = this._element.getAttribute(\"role\");\n                if (role === null || role === \"\" || role === undefined) {\n                    this._element.setAttribute(\"role\", \"dialog\");\n                }\n                var label = this._element.getAttribute(\"aria-label\");\n                if (label === null || label === \"\" || label === undefined) {\n                    this._element.setAttribute(\"aria-label\", strings.ariaLabel);\n                }\n\n                // Make sure animations are hooked up\n                this._currentAnimateIn = this._animateSlideIn;\n                this._currentAnimateOut = this._animateSlideOut;\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                // Public Properties\n\n                /// <field type=\"String\" defaultValue=\"narrow\" oamOptionsDatatype=\"WinJS.UI.SettingsFlyout.width\" locid=\"WinJS.UI.SettingsFlyout.width\" helpKeyword=\"WinJS.UI.SettingsFlyout.width\">\n                /// Width of the SettingsFlyout, \"narrow\", or \"wide\".\n                /// <deprecated type=\"deprecate\">\n                /// SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class.\n                /// </deprecated>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                width: {\n                    get: function () {\n                        return this._width;\n                    },\n\n                    set: function (value) {\n                        _ElementUtilities._deprecated(strings.widthDeprecationMessage);\n                        if (value === this._width) {\n                            return;\n                        }\n                        // Get rid of old class\n                        if (this._width === settingsNarrow) {\n                            _ElementUtilities.removeClass(this._element, _Constants.narrowClass);\n                        } else if (this._width === settingsWide) {\n                            _ElementUtilities.removeClass(this._element, _Constants.wideClass);\n                        }\n                        this._width = value;\n\n                        // Attach our new css class\n                        if (this._width === settingsNarrow) {\n                            _ElementUtilities.addClass(this._element, _Constants.narrowClass);\n                        } else if (this._width === settingsWide) {\n                            _ElementUtilities.addClass(this._element, _Constants.wideClass);\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.SettingsFlyout.settingsCommandId\" helpKeyword=\"WinJS.UI.SettingsFlyout.settingsCommandId\">\n                /// Define the settings command Id for the SettingsFlyout control.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </field>\n                settingsCommandId: {\n                    get: function () {\n                        return this._settingsCommandId;\n                    },\n\n                    set: function (value) {\n                        this._settingsCommandId = value;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.SettingsFlyout.disabled\" helpKeyword=\"WinJS.UI.SettingsFlyout.disabled\">Disable SettingsFlyout, setting or getting the HTML disabled attribute.  When disabled the SettingsFlyout will no longer display with show(), and will hide if currently visible.</field>\n                disabled: {\n                    get: function () {\n                        // Ensure it's a boolean because we're using the DOM element to keep in-sync\n                        return !!this._element.disabled;\n                    },\n                    set: function (value) {\n                        // Force this check into a boolean because our current state could be a bit confused since we tie to the DOM element\n                        value = !!value;\n                        var oldValue = !!this._element.disabled;\n                        if (oldValue !== value) {\n                            this._element.disabled = value;\n                            if (!this.hidden && this._element.disabled) {\n                                this._dismiss();\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.SettingsFlyout.onbeforeshow\" helpKeyword=\"WinJS.UI.SettingsFlyout.onbeforeshow\">\n                /// Occurs immediately before the control is shown.\n                /// </field>\n                onbeforeshow: createEvent(_Overlay._Overlay.beforeShow),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.SettingsFlyout.onaftershow\" helpKeyword=\"WinJS.UI.SettingsFlyout.onaftershow\">\n                /// Occurs immediately after the control is shown.\n                /// </field>\n                onaftershow: createEvent(_Overlay._Overlay.afterShow),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.SettingsFlyout.onbeforehide\" helpKeyword=\"WinJS.UI.SettingsFlyout.onbeforehide\">\n                /// Occurs immediately before the control is hidden.\n                /// </field>\n                onbeforehide: createEvent(_Overlay._Overlay.beforeHide),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.SettingsFlyout.onafterhide\" helpKeyword=\"WinJS.UI.SettingsFlyout.onafterhide\">\n                /// Occurs immediately after the control is hidden.\n                /// </field>\n                onafterhide: createEvent(_Overlay._Overlay.afterHide),\n\n                show: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.SettingsFlyout.show\">\n                    /// <summary locid=\"WinJS.UI.SettingsFlyout.show\">\n                    /// Shows the SettingsFlyout, if hidden.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    // Just call private version to make appbar flags happy\n\n                    // Don't do anything if disabled\n                    if (this.disabled) {\n                        return;\n                    }\n                    this._writeProfilerMark(\"show,StartTM\"); // The corresponding \"stop\" profiler mark is handled in _Overlay._baseEndShow().\n                    this._show();\n                },\n\n                _dispose: function SettingsFlyout_dispose() {\n                    _LightDismissService.hidden(this._dismissable);\n                    _Dispose.disposeSubTree(this.element);\n                    this._dismiss();\n                },\n\n                _show: function SettingsFlyout_show() {\n                    // We call our base \"_baseShow\" because SettingsFlyout overrides show\n                    if (this._baseShow()) {\n                        // Verify that the firstDiv and finalDiv are in the correct location.\n                        // Move them to the correct location or add them if they are not.\n                        if (!_ElementUtilities.hasClass(this.element.children[0], _Constants.firstDivClass)) {\n                            var firstDiv = this.element.querySelectorAll(\".\" + _Constants.firstDivClass);\n                            if (firstDiv && firstDiv.length > 0) {\n                                firstDiv.item(0).parentNode.removeChild(firstDiv.item(0));\n                            }\n    \n                            this._addFirstDiv();\n                        }\n    \n                        if (!_ElementUtilities.hasClass(this.element.children[this.element.children.length - 1], _Constants.finalDivClass)) {\n                            var finalDiv = this.element.querySelectorAll(\".\" + _Constants.finalDivClass);\n                            if (finalDiv && finalDiv.length > 0) {\n                                finalDiv.item(0).parentNode.removeChild(finalDiv.item(0));\n                            }\n    \n                            this._addFinalDiv();\n                        }\n                        \n                        this._setBackButtonsAriaLabel();\n                        \n                        _LightDismissService.shown(this._dismissable);\n                    }\n                },\n\n                _setBackButtonsAriaLabel: function SettingsFlyout_setBackButtonsAriaLabel() {\n                    var backbuttons = this.element.querySelectorAll(\".win-backbutton\");\n                    var label;\n                    for (var i = 0; i < backbuttons.length; i++) {\n                        label = backbuttons[i].getAttribute(\"aria-label\");\n                        if (label === null || label === \"\" || label === undefined) {\n                            backbuttons[i].setAttribute(\"aria-label\", strings.backbuttonAriaLabel);\n                        }\n                    }\n                },\n\n                hide: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.SettingsFlyout.hide\">\n                    /// <summary locid=\"WinJS.UI.SettingsFlyout.hide\">\n                    /// Hides the SettingsFlyout, if visible, regardless of other state.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                    /// </signature>\n                    // Just call private version to make appbar flags happy\n                    this._writeProfilerMark(\"hide,StartTM\"); // The corresponding \"stop\" profiler mark is handled in _Overlay._baseEndHide().\n                    this._hide();\n                },\n\n                _hide: function SettingsFlyout_hide() {\n                    this._baseHide();\n                },\n                \n                _beforeEndHide: function SettingsFlyout_beforeEndHide() {\n                    _LightDismissService.hidden(this._dismissable);\n                },\n\n                // SettingsFlyout animations\n                _animateSlideIn: function SettingsFlyout_animateSlideIn() {\n                    var animateFromLeft = _shouldAnimateFromLeft();\n                    var offset = animateFromLeft ? \"-100px\" : \"100px\";\n                    _ElementListUtilities.query(\"div.win-content\", this._element).\n                        forEach(function (e) { Animations.enterPage(e, { left: offset }); });\n\n                    var where,\n                        width = this._element.offsetWidth;\n                    // Slide in from right side or left side?\n                    if (animateFromLeft) {\n                        // RTL\n                        where = { top: \"0px\", left: \"-\" + width + \"px\" };\n                        this._element.style.right = \"auto\";\n                        this._element.style.left = \"0px\";\n                    } else {\n                        // From right side\n                        where = { top: \"0px\", left: width + \"px\" };\n                        this._element.style.right = \"0px\";\n                        this._element.style.left = \"auto\";\n                    }\n\n                    this._element.style.opacity = 1;\n                    this._element.style.visibility = \"visible\";\n\n                    return Animations.showPanel(this._element, where);\n                },\n\n                _animateSlideOut: function SettingsFlyout_animateSlideOut() {\n                    var where,\n                        width = this._element.offsetWidth;\n                    if (_shouldAnimateFromLeft()) {\n                        // RTL\n                        where = { top: \"0px\", left: width + \"px\" };\n                        this._element.style.right = \"auto\";\n                        this._element.style.left = \"-\" + width + \"px\";\n                    } else {\n                        // From right side\n                        where = { top: \"0px\", left: \"-\" + width + \"px\" };\n                        this._element.style.right = \"-\" + width + \"px\";\n                        this._element.style.left = \"auto\";\n                    }\n\n                    return Animations.showPanel(this._element, where);\n                },\n\n                _fragmentDiv: {\n                    get: function SettingsFlyout_fragmentDiv_get() {\n                        return this._fragDiv;\n                    },\n\n                    set: function SettingsFlyout_fragmentDiv_set(value) {\n                        this._fragDiv = value;\n                    }\n                },\n\n                _unloadPage: function SettingsFlyout_unloadPage(event) {\n                    var settingsControl = event.currentTarget.winControl;\n                    settingsControl.removeEventListener(_Overlay._Overlay.afterHide, this._unloadPage, false);\n\n                    Promise.as().then(function () {\n                        if (settingsControl._fragmentDiv) {\n                            _Global.document.body.removeChild(settingsControl._fragmentDiv);\n                            settingsControl._fragmentDiv = null;\n                        }\n                    });\n                },\n\n                _dismiss: function SettingsFlyout_dismiss() {\n                    this.addEventListener(_Overlay._Overlay.afterHide, this._unloadPage, false);\n                    this._hide();\n                },\n\n                _handleKeyDown: function SettingsFlyout_handleKeyDown(event) {\n                    if ((event.keyCode === Key.space || event.keyCode === Key.enter)\n                           && (this.children[0] === _Global.document.activeElement)) {\n                        event.preventDefault();\n                        event.stopPropagation();\n                        this.winControl._dismiss();\n                    } else if (event.shiftKey && event.keyCode === Key.tab\n                    && this.children[0] === _Global.document.activeElement) {\n                        event.preventDefault();\n                        event.stopPropagation();\n                        var _elms = this.getElementsByTagName(\"*\");\n\n                        for (var i = _elms.length - 2; i >= 0; i--) {\n                            _elms[i].focus();\n\n                            if (_elms[i] === _Global.document.activeElement) {\n                                break;\n                            }\n                        }\n                    }\n                },\n\n                _focusOnLastFocusableElementFromParent: function SettingsFlyout_focusOnLastFocusableElementFromParent() {\n                    var active = _Global.document.activeElement;\n                    if (!settingsPageIsFocusedOnce || !active || !_ElementUtilities.hasClass(active, _Constants.firstDivClass)) {\n                        return;\n                    }\n\n                    var _elms = this.parentElement.getElementsByTagName(\"*\");\n\n                    // There should be at least 1 element in addition to the firstDiv & finalDiv\n                    if (_elms.length <= 2) {\n                        return;\n                    }\n\n                    // Get the tabIndex set to the finalDiv (which is the highest)\n                    var _highestTabIndex = _elms[_elms.length - 1].tabIndex;\n\n                    // If there are positive tabIndices, set focus to the element with the highest tabIndex.\n                    // Otherwise set focus to the last focusable element in DOM order.\n                    var i;\n                    if (_highestTabIndex) {\n                        for (i = _elms.length - 2; i > 0; i--) {\n                            if (_elms[i].tabIndex === _highestTabIndex) {\n                                _elms[i].focus();\n                                break;\n                            }\n                        }\n                    } else {\n                        for (i = _elms.length - 2; i > 0; i--) {\n                            // Skip <div> with undefined tabIndex (To work around Win8 bug #622245)\n                            if ((_elms[i].tagName !== \"DIV\") || (_elms[i].getAttribute(\"tabIndex\") !== null)) {\n                                _elms[i].focus();\n\n                                if (_elms[i] === _Global.document.activeElement) {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                },\n\n                _focusOnFirstFocusableElementFromParent: function SettingsFlyout_focusOnFirstFocusableElementFromParent() {\n                    var active = _Global.document.activeElement;\n                    if (!active || !_ElementUtilities.hasClass(active, _Constants.finalDivClass)) {\n                        return;\n                    }\n                    var _elms = this.parentElement.getElementsByTagName(\"*\");\n\n                    // There should be at least 1 element in addition to the firstDiv & finalDiv\n                    if (_elms.length <= 2) {\n                        return;\n                    }\n\n                    // Get the tabIndex set to the firstDiv (which is the lowest)\n                    var _lowestTabIndex = _elms[0].tabIndex;\n\n                    // If there are positive tabIndices, set focus to the element with the lowest tabIndex.\n                    // Otherwise set focus to the first focusable element in DOM order.\n                    var i;\n                    if (_lowestTabIndex) {\n                        for (i = 1; i < _elms.length - 1; i++) {\n                            if (_elms[i].tabIndex === _lowestTabIndex) {\n                                _elms[i].focus();\n                                break;\n                            }\n                        }\n                    } else {\n                        for (i = 1; i < _elms.length - 1; i++) {\n                            // Skip <div> with undefined tabIndex (To work around Win8 bug #622245)\n                            if ((_elms[i].tagName !== \"DIV\") || (_elms[i].getAttribute(\"tabIndex\") !== null)) {\n                                _elms[i].focus();\n\n                                if (_elms[i] === _Global.document.activeElement) {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                },\n\n                // Create and add a new first div to the beginning of the list\n                _addFirstDiv: function SettingsFlyout_addFirstDiv() {\n                    var _elms = this._element.getElementsByTagName(\"*\");\n                    var _minTab = 0;\n                    for (var i = 0; i < _elms.length; i++) {\n                        if ((0 < _elms[i].tabIndex) && (_minTab === 0 || _elms[i].tabIndex < _minTab)) {\n                            _minTab = _elms[i].tabIndex;\n                        }\n                    }\n                    var firstDiv = _Global.document.createElement(\"div\");\n                    firstDiv.className = _Constants.firstDivClass;\n                    firstDiv.style.display = \"inline\";\n                    firstDiv.setAttribute(\"role\", \"menuitem\");\n                    firstDiv.setAttribute(\"aria-hidden\", \"true\");\n                    firstDiv.tabIndex = _minTab;\n                    _ElementUtilities._addEventListener(firstDiv, \"focusin\", this._focusOnLastFocusableElementFromParent, false);\n\n                    // add to beginning\n                    if (this._element.children[0]) {\n                        this._element.insertBefore(firstDiv, this._element.children[0]);\n                    } else {\n                        this._element.appendChild(firstDiv);\n                    }\n                },\n\n                // Create and add a new final div to the end of the list\n                _addFinalDiv: function SettingsFlyout_addFinalDiv() {\n                    var _elms = this._element.getElementsByTagName(\"*\");\n                    var _maxTab = 0;\n                    for (var i = 0; i < _elms.length; i++) {\n                        if (_elms[i].tabIndex > _maxTab) {\n                            _maxTab = _elms[i].tabIndex;\n                        }\n                    }\n                    var finalDiv = _Global.document.createElement(\"div\");\n                    finalDiv.className = _Constants.finalDivClass;\n                    finalDiv.style.display = \"inline\";\n                    finalDiv.setAttribute(\"role\", \"menuitem\");\n                    finalDiv.setAttribute(\"aria-hidden\", \"true\");\n                    finalDiv.tabIndex = _maxTab;\n                    _ElementUtilities._addEventListener(finalDiv, \"focusin\", this._focusOnFirstFocusableElementFromParent, false);\n\n                    this._element.appendChild(finalDiv);\n                },\n\n                _writeProfilerMark: function SettingsFlyout_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI.SettingsFlyout:\" + this._id + \":\" + text);\n                }\n            });\n\n            // Statics\n            SettingsFlyout.show = function () {\n                /// <signature helpKeyword=\"WinJS.UI.SettingsFlyout.show\">\n                /// <summary locid=\"WinJS.UI.SettingsFlyout.show_static\">\n                /// Shows the SettingsPane UI, if hidden, regardless of other states.\n                /// </summary>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n                /// Show the main settings pane\n                if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {\n                    _WinRT.Windows.UI.ApplicationSettings.SettingsPane.show();\n                }\n                // And hide the WWA one\n                var elements = _Global.document.querySelectorAll('div[data-win-control=\"WinJS.UI.SettingsFlyout\"]');\n                var len = elements.length;\n                for (var i = 0; i < len; i++) {\n                    var settingsFlyout = elements[i].winControl;\n                    if (settingsFlyout) {\n                        settingsFlyout._dismiss();\n                    }\n                }\n            };\n\n            var _settingsEvent = { event: undefined };\n            SettingsFlyout.populateSettings = function (e) {\n                /// <signature helpKeyword=\"WinJS.UI.SettingsFlyout.populateSettings\">\n                /// <summary locid=\"WinJS.UI.SettingsFlyout.populateSettings\">\n                /// Loads a portion of the SettingsFlyout. Your app calls this when the user invokes a settings command and the WinJS.Application.onsettings event occurs.\n                /// </summary>\n                /// <param name=\"e\" type=\"Object\" locid=\"WinJS.UI.SettingsFlyout.populateSettings_p:e\">\n                /// An object that contains information about the event, received from the WinJS.Application.onsettings event. The detail property of this object contains\n                /// the applicationcommands sub-property that you set to an array of settings commands.\n                /// </param>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n                _settingsEvent.event = e.detail;\n\n                if (_settingsEvent.event.applicationcommands) {\n                    var n = _WinRT.Windows.UI.ApplicationSettings;\n                    Object.keys(_settingsEvent.event.applicationcommands).forEach(function (name) {\n                        var setting = _settingsEvent.event.applicationcommands[name];\n                        if (!setting.title) { setting.title = name; }\n                        var command = new n.SettingsCommand(name, setting.title, SettingsFlyout._onSettingsCommand);\n                        _settingsEvent.event.e.request.applicationCommands.append(command);\n                    });\n                }\n            };\n\n            SettingsFlyout._onSettingsCommand = function (command) {\n                var id = command.id;\n                if (_settingsEvent.event.applicationcommands && _settingsEvent.event.applicationcommands[id]) {\n                    SettingsFlyout.showSettings(id, _settingsEvent.event.applicationcommands[id].href);\n                }\n            };\n\n            SettingsFlyout.showSettings = function (id, path) {\n                /// <signature helpKeyword=\"WinJS.UI.SettingsFlyout.showSettings\">\n                /// <summary locid=\"WinJS.UI.SettingsFlyout.showSettings\">\n                /// Show the SettingsFlyout using the settings element identifier (ID) and the path of the page that contains the settings element.\n                /// </summary>\n                /// <param name=\"id\" type=\"String\" locid=\"WinJS.UI.SettingsFlyout.showSettings_p:id\">\n                /// The ID of the settings element.\n                /// </param>\n                /// <param name=\"path\" type=\"Object\" locid=\"WinJS.UI.SettingsFlyout.showSettings_p:path\">\n                ///  The path of the page that contains the settings element.\n                /// </param>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.0\"/>\n                /// </signature>\n                var control = _getChildSettingsControl(_Global.document, id);\n                if (control) {\n                    control.show();\n                } else if (path) {\n                    var divElement = _Global.document.createElement(\"div\");\n                    divElement = _Global.document.body.appendChild(divElement);\n                    Pages.render(path, divElement).then(function () {\n                        control = _getChildSettingsControl(divElement, id);\n                        if (control) {\n                            control._fragmentDiv = divElement;\n                            control.show();\n                        } else {\n                            _Global.document.body.removeChild(divElement);\n                        }\n                    });\n                } else {\n                    throw new _ErrorFromName(\"WinJS.UI.SettingsFlyout.BadReference\", strings.badReference);\n                }\n            };\n\n            var strings = {\n                get ariaLabel() { return _Resources._getWinJSString(\"ui/settingsFlyoutAriaLabel\").value; },\n                get badReference() { return \"Invalid argument: Invalid href to settings flyout fragment\"; },\n                get backbuttonAriaLabel() { return _Resources._getWinJSString(\"ui/backbuttonarialabel\").value; },\n                get widthDeprecationMessage() { return \"SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class.\"; },\n                get settingsFlyoutIsDeprecated() { return \"SettingsFlyout is deprecated and may not be available in future releases. Instead, put settings on their own page within the app.\"; }\n            };\n\n            return SettingsFlyout;\n        })\n    });\n\n\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/NavBar/_Command',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Resources',\n    '../../ControlProcessor',\n    '../../Navigation',\n    '../../Utilities/_Control',\n    '../../Utilities/_ElementUtilities',\n    '../AppBar/_Icon'\n    ], function NavBarCommandInit(exports, _Global, _Base, _ErrorFromName, _Resources, ControlProcessor, Navigation, _Control, _ElementUtilities, _Icon) {\n    \"use strict\";\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        _WinPressed: _Base.Namespace._lazy(function () {\n            var WinPressed = _Base.Class.define(function _WinPressed_ctor(element) {\n                // WinPressed is the combination of :hover:active\n                // :hover is delayed by trident for touch by 300ms so if you want :hover:active to work quickly you need to\n                // use this behavior.\n                // :active does not bubble to its parent like :hover does so this is also useful for that scenario.\n                this._element = element;\n                _ElementUtilities._addEventListener(this._element, \"pointerdown\", this._MSPointerDownButtonHandler.bind(this));\n            }, {\n                _MSPointerDownButtonHandler: function _WinPressed_MSPointerDownButtonHandler(ev) {\n                    if (!this._pointerUpBound) {\n                        this._pointerUpBound = this._MSPointerUpHandler.bind(this);\n                        this._pointerCancelBound = this._MSPointerCancelHandler.bind(this);\n                        this._pointerOverBound = this._MSPointerOverHandler.bind(this);\n                        this._pointerOutBound = this._MSPointerOutHandler.bind(this);\n                    }\n\n                    if (ev.isPrimary) {\n                        if (this._pointerId) {\n                            this._resetPointer();\n                        }\n\n                        if (!_ElementUtilities._matchesSelector(ev.target, \".win-interactive, .win-interactive *\")) {\n                            this._pointerId = ev.pointerId;\n\n                            _ElementUtilities._addEventListener(_Global, \"pointerup\", this._pointerUpBound, true);\n                            _ElementUtilities._addEventListener(_Global, \"pointercancel\", this._pointerCancelBound), true;\n                            _ElementUtilities._addEventListener(this._element, \"pointerover\", this._pointerOverBound, true);\n                            _ElementUtilities._addEventListener(this._element, \"pointerout\", this._pointerOutBound, true);\n\n                            _ElementUtilities.addClass(this._element, WinPressed.winPressed);\n                        }\n                    }\n                },\n\n                _MSPointerOverHandler: function _WinPressed_MSPointerOverHandler(ev) {\n                    if (this._pointerId === ev.pointerId) {\n                        _ElementUtilities.addClass(this._element, WinPressed.winPressed);\n                    }\n                },\n\n                _MSPointerOutHandler: function _WinPressed_MSPointerOutHandler(ev) {\n                    if (this._pointerId === ev.pointerId) {\n                        _ElementUtilities.removeClass(this._element, WinPressed.winPressed);\n                    }\n                },\n\n                _MSPointerCancelHandler: function _WinPressed_MSPointerCancelHandler(ev) {\n                    if (this._pointerId === ev.pointerId) {\n                        this._resetPointer();\n                    }\n                },\n\n                _MSPointerUpHandler: function _WinPressed_MSPointerUpHandler(ev) {\n                    if (this._pointerId === ev.pointerId) {\n                        this._resetPointer();\n                    }\n                },\n\n                _resetPointer: function _WinPressed_resetPointer() {\n                    this._pointerId = null;\n\n                    _ElementUtilities._removeEventListener(_Global, \"pointerup\", this._pointerUpBound, true);\n                    _ElementUtilities._removeEventListener(_Global, \"pointercancel\", this._pointerCancelBound, true);\n                    _ElementUtilities._removeEventListener(this._element, \"pointerover\", this._pointerOverBound, true);\n                    _ElementUtilities._removeEventListener(this._element, \"pointerout\", this._pointerOutBound, true);\n\n                    _ElementUtilities.removeClass(this._element, WinPressed.winPressed);\n                },\n\n                dispose: function _WinPressed_dispose() {\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    this._resetPointer();\n                }\n            }, {\n                winPressed: \"win-pressed\"\n            });\n\n            return WinPressed;\n        }),\n        /// <field>\n        /// <summary locid=\"WinJS.UI.NavBarCommand\">\n        /// Represents a navigation command in an NavBarContainer.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.navbarcommand.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.navbarcommand.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet><![CDATA[<div data-win-control=\"WinJS.UI.NavBarCommand\" data-win-options=\"{location:'/pages/home/home.html',label:'Home',icon:WinJS.UI.AppBarIcon.home}\"></div>]]></htmlSnippet>\n        /// <part name=\"navbarcommand\" class=\"win-navbarcommand\" locid=\"WinJS.UI.NavBarCommand_part:navbarcommand\">Styles the entire NavBarCommand control.</part>\n        /// <part name=\"button\" class=\"win-navbarcommand-button\" locid=\"WinJS.UI.NavBarCommand_part:button\">Styles the main button in a NavBarCommand.</part>\n        /// <part name=\"splitbutton\" class=\"win-navbarcommand-splitbutton\" locid=\"WinJS.UI.NavBarCommand_part:splitbutton\">Styles the split button in a NavBarCommand</part>\n        /// <part name=\"icon\" class=\"win-navbarcommand-icon\" locid=\"WinJS.UI.NavBarCommand_part:icon\">Styles the icon in the main button of a NavBarCommand.</part>\n        /// <part name=\"label\" class=\"win-navbarcommand-label\" locid=\"WinJS.UI.NavBarCommand_part:label\">Styles the label in the main button of a NavBarCommand.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        NavBarCommand: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; }\n            };\n\n            var NavBarCommand = _Base.Class.define(function NavBarCommand_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.NavBarCommand.NavBarCommand\">\n                /// <summary locid=\"WinJS.UI.NavBarCommand.constructor\">\n                /// Creates a new NavBarCommand.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.NavBarCommand.constructor_p:element\">\n                /// The DOM element that will host the new  NavBarCommand control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.NavBarCommand.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\".\n                /// </param>\n                /// <returns type=\"WinJS.UI.NavBarCommand\" locid=\"WinJS.UI.NavBarCommand.constructor_returnValue\">\n                /// The new NavBarCommand.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n                element = element || _Global.document.createElement(\"DIV\");\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.NavBarCommand.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                this._element = element;\n                _ElementUtilities.addClass(this.element, NavBarCommand._ClassName.navbarcommand);\n                _ElementUtilities.addClass(this.element, \"win-disposable\");\n\n                this._tooltip = null;\n                this._splitOpened = false;\n                this._buildDom();\n                element.addEventListener('keydown', this._keydownHandler.bind(this));\n\n                _Control.setOptions(this, options);\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.NavBarCommand.element\" helpKeyword=\"WinJS.UI.NavBarCommand.element\">\n                /// Gets the DOM element that hosts the NavBarCommand.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.NavBarCommand.label\" helpKeyword=\"WinJS.UI.NavBarCommand.label\">\n                /// Gets or sets the label of the NavBarCommand.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                label: {\n                    get: function () {\n                        return this._label;\n                    },\n                    set: function (value) {\n                        this._label = value;\n                        this._labelEl.textContent = value;\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.NavBarCommand.tooltip\" helpKeyword=\"WinJS.UI.NavBarCommand.tooltip\">\n                /// Gets or sets the tooltip of the NavBarCommand.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                tooltip: {\n                    get: function () {\n                        return this._tooltip;\n                    },\n                    set: function (value) {\n                        this._tooltip = value;\n                        if (this._tooltip || this._tooltip === \"\") {\n                            this._element.setAttribute('title', this._tooltip);\n                        } else {\n                            this._element.removeAttribute('title');\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.NavBarCommand.icon\" helpKeyword=\"WinJS.UI.NavBarCommand.icon\">\n                /// Gets or sets the icon of the NavBarCommand. This value is either one of the values of the AppBarIcon enumeration or the path of a custom PNG file.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                icon: {\n                    get: function () {\n                        return this._icon;\n                    },\n                    set: function (value) {\n                        this._icon = (_Icon[value] || value);\n\n                        // If the icon's a single character, presume a glyph\n                        if (this._icon && this._icon.length === 1) {\n                            // Set the glyph\n                            this._imageSpan.textContent = this._icon;\n                            this._imageSpan.style.backgroundImage = \"\";\n                            this._imageSpan.style.msHighContrastAdjust = \"\";\n                            this._imageSpan.style.display = \"\";\n                        } else if (this._icon && this._icon.length > 1) {\n                            // Must be an image, set that\n                            this._imageSpan.textContent = \"\";\n                            this._imageSpan.style.backgroundImage = this._icon;\n                            this._imageSpan.style.msHighContrastAdjust = \"none\";\n                            this._imageSpan.style.display = \"\";\n                        } else {\n                            this._imageSpan.textContent = \"\";\n                            this._imageSpan.style.backgroundImage = \"\";\n                            this._imageSpan.style.msHighContrastAdjust = \"\";\n                            this._imageSpan.style.display = \"none\";\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.NavBarCommand.location\" helpKeyword=\"WinJS.UI.NavBarCommand.location\">\n                /// Gets or sets the command's target location.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                location: {\n                    get: function () {\n                        return this._location;\n                    },\n                    set: function (value) {\n                        this._location = value;\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.NavBarCommand.state\" helpKeyword=\"WinJS.UI.NavBarCommand.state\">\n                /// Gets or sets the state value used for navigation. The command passes this object to the WinJS.Navigation.navigate function.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                state: {\n                    get: function () {\n                        return this._state;\n                    },\n                    set: function (value) {\n                        this._state = value;\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.NavBarCommand.splitButton\" helpKeyword=\"WinJS.UI.NavBarCommand.splitButton\">\n                /// Gets or sets a value that specifies whether the NavBarCommand has a split button.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                splitButton: {\n                    get: function () {\n                        return this._split;\n                    },\n                    set: function (value) {\n                        this._split = value;\n                        if (this._split) {\n                            this._splitButtonEl.style.display = \"\";\n                        } else {\n                            this._splitButtonEl.style.display = \"none\";\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.NavBarCommand.splitOpened\" hidden=\"true\" helpKeyword=\"WinJS.UI.NavBarCommand.splitOpened\">\n                /// Gets or sets a value that specifies whether the split button is open.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                splitOpened: {\n                    get: function () {\n                        return this._splitOpened;\n                    },\n                    set: function (value) {\n                        if (this._splitOpened !== !!value) {\n                            this._toggleSplit();\n                        }\n                    }\n                },\n\n                _toggleSplit: function NavBarCommand_toggleSplit() {\n                    this._splitOpened = !this._splitOpened;\n                    if (this._splitOpened) {\n                        _ElementUtilities.addClass(this._splitButtonEl, NavBarCommand._ClassName.navbarcommandsplitbuttonopened);\n                        this._splitButtonEl.setAttribute(\"aria-expanded\", \"true\");\n                    } else {\n                        _ElementUtilities.removeClass(this._splitButtonEl, NavBarCommand._ClassName.navbarcommandsplitbuttonopened);\n                        this._splitButtonEl.setAttribute(\"aria-expanded\", \"false\");\n                    }\n                    this._fireEvent(NavBarCommand._EventName._splitToggle);\n                },\n\n                _rtl: {\n                    get: function () {\n                        return _Global.getComputedStyle(this.element).direction === \"rtl\";\n                    }\n                },\n\n                _keydownHandler: function NavBarCommand_keydownHandler(ev) {\n                    if (_ElementUtilities._matchesSelector(ev.target, \".win-interactive, .win-interactive *\")) {\n                        return;\n                    }\n\n                    var leftStr = this._rtl ? Key.rightArrow : Key.leftArrow;\n                    var rightStr = this._rtl ? Key.leftArrow : Key.rightArrow;\n\n                    if (!ev.altKey && (ev.keyCode === leftStr || ev.keyCode === Key.home || ev.keyCode === Key.end) && ev.target === this._splitButtonEl) {\n                        _ElementUtilities._setActive(this._buttonEl);\n                        if (ev.keyCode === leftStr) {\n                            ev.stopPropagation();\n                        }\n                        ev.preventDefault();\n                    } else if (!ev.altKey && ev.keyCode === rightStr && this.splitButton && (ev.target === this._buttonEl || this._buttonEl.contains(ev.target))) {\n                        _ElementUtilities._setActive(this._splitButtonEl);\n                        if (ev.keyCode === rightStr) {\n                            ev.stopPropagation();\n                        }\n                        ev.preventDefault();\n                    } else if ((ev.keyCode === Key.space || ev.keyCode === Key.enter) && (ev.target === this._buttonEl || this._buttonEl.contains(ev.target))) {\n                        if (this.location) {\n                            Navigation.navigate(this.location, this.state);\n                        }\n                        this._fireEvent(NavBarCommand._EventName._invoked);\n                    } else if ((ev.keyCode === Key.space || ev.keyCode === Key.enter) && ev.target === this._splitButtonEl) {\n                        this._toggleSplit();\n                    }\n                },\n\n                _getFocusInto: function NavBarCommand_getFocusInto(keyCode) {\n                    var leftStr = this._rtl ? Key.rightArrow : Key.leftArrow;\n                    if ((keyCode === leftStr) && this.splitButton) {\n                        return this._splitButtonEl;\n                    } else {\n                        return this._buttonEl;\n                    }\n                },\n\n                _buildDom: function NavBarCommand_buildDom() {\n                    var markup =\n                        '<div tabindex=\"0\" role=\"button\" class=\"' + NavBarCommand._ClassName.navbarcommandbutton + '\">' +\n                            '<div class=\"' + NavBarCommand._ClassName.navbarcommandbuttoncontent + '\">' +\n                                '<div class=\"' + NavBarCommand._ClassName.navbarcommandicon + '\"></div>' +\n                                '<div class=\"' + NavBarCommand._ClassName.navbarcommandlabel + '\"></div>' +\n                            '</div>' +\n                        '</div>' +\n                        '<div tabindex=\"-1\" aria-expanded=\"false\" class=\"' + NavBarCommand._ClassName.navbarcommandsplitbutton + '\"></div>';\n                    this.element.insertAdjacentHTML(\"afterBegin\", markup);\n\n                    this._buttonEl = this.element.firstElementChild;\n                    this._buttonPressedBehavior = new exports._WinPressed(this._buttonEl);\n                    this._contentEl = this._buttonEl.firstElementChild;\n                    this._imageSpan = this._contentEl.firstElementChild;\n                    this._imageSpan.style.display = \"none\";\n                    this._labelEl = this._imageSpan.nextElementSibling;\n                    this._splitButtonEl = this._buttonEl.nextElementSibling;\n                    this._splitButtonPressedBehavior = new exports._WinPressed(this._splitButtonEl);\n                    this._splitButtonEl.style.display = \"none\";\n\n                    _ElementUtilities._ensureId(this._buttonEl);\n                    this._splitButtonEl.setAttribute(\"aria-labelledby\", this._buttonEl.id);\n\n                    this._buttonEl.addEventListener(\"click\", this._handleButtonClick.bind(this));\n\n                    var mutationObserver = new _ElementUtilities._MutationObserver(this._splitButtonAriaExpandedPropertyChangeHandler.bind(this));\n                    mutationObserver.observe(this._splitButtonEl, { attributes: true, attributeFilter: [\"aria-expanded\"] });\n                    this._splitButtonEl.addEventListener(\"click\", this._handleSplitButtonClick.bind(this));\n\n                    // reparent any other elements.\n                    var tempEl = this._splitButtonEl.nextSibling;\n                    while (tempEl) {\n                        this._buttonEl.insertBefore(tempEl, this._contentEl);\n                        if (tempEl.nodeName !== \"#text\") {\n                            ControlProcessor.processAll(tempEl);\n                        }\n                        tempEl = this._splitButtonEl.nextSibling;\n                    }\n                },\n\n                _handleButtonClick: function NavBarCommand_handleButtonClick(ev) {\n                    var srcElement = ev.target;\n                    if (!_ElementUtilities._matchesSelector(srcElement, \".win-interactive, .win-interactive *\")) {\n                        if (this.location) {\n                            Navigation.navigate(this.location, this.state);\n                        }\n                        this._fireEvent(NavBarCommand._EventName._invoked);\n                    }\n                },\n\n                _splitButtonAriaExpandedPropertyChangeHandler: function NavBarCommand_splitButtonAriaExpandedPropertyChangeHandler() {\n                    if ((this._splitButtonEl.getAttribute(\"aria-expanded\") === \"true\") !== this._splitOpened) {\n                        this._toggleSplit();\n                    }\n                },\n\n                _handleSplitButtonClick: function NavBarCommand_handleSplitButtonClick() {\n                    this._toggleSplit();\n                },\n\n                _fireEvent: function NavBarCommand_fireEvent(type, detail) {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, true, false, detail);\n                    this.element.dispatchEvent(event);\n                },\n\n                dispose: function NavBarCommand_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.NavBarCommand.dispose\">\n                    /// <summary locid=\"WinJS.UI.NavBarCommand.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    this._buttonPressedBehavior.dispose();\n                    this._splitButtonPressedBehavior.dispose();\n                }\n            }, {\n                _ClassName: {\n                    navbarcommand: \"win-navbarcommand\",\n                    navbarcommandbutton: \"win-navbarcommand-button\",\n                    navbarcommandbuttoncontent: \"win-navbarcommand-button-content\",\n                    navbarcommandsplitbutton: \"win-navbarcommand-splitbutton\",\n                    navbarcommandsplitbuttonopened: \"win-navbarcommand-splitbutton-opened\",\n                    navbarcommandicon: \"win-navbarcommand-icon\",\n                    navbarcommandlabel: \"win-navbarcommand-label\"\n                },\n                _EventName: {\n                    _invoked: \"_invoked\",\n                    _splitToggle: \"_splittoggle\"\n                }\n            });\n            _Base.Class.mix(NavBarCommand, _Control.DOMEventMixin);\n            return NavBarCommand;\n        })\n    });\n\n});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/NavBar/_Container',[\n    'exports',\n    '../../Core/_Global',\n    '../../Core/_Base',\n    '../../Core/_BaseUtils',\n    '../../Core/_ErrorFromName',\n    '../../Core/_Events',\n    '../../Core/_Log',\n    '../../Core/_Resources',\n    '../../Core/_WriteProfilerMark',\n    '../../Animations',\n    '../../Animations/_TransitionAnimation',\n    '../../BindingList',\n    '../../ControlProcessor',\n    '../../Navigation',\n    '../../Promise',\n    '../../Scheduler',\n    '../../Utilities/_Control',\n    '../../Utilities/_ElementUtilities',\n    '../../Utilities/_KeyboardBehavior',\n    '../../Utilities/_UI',\n    '../_LegacyAppBar/_Constants',\n    '../Repeater',\n    './_Command'\n], function NavBarContainerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, BindingList, ControlProcessor, Navigation, Promise, Scheduler, _Control, _ElementUtilities, _KeyboardBehavior, _UI, _Constants, Repeater, _Command) {\n    \"use strict\";\n\n    function nobodyHasFocus() {\n        return _Global.document.activeElement === null || _Global.document.activeElement === _Global.document.body;\n    }\n\n    _Base.Namespace._moduleDefine(exports, \"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.NavBarContainer\">\n        /// Contains a group of NavBarCommand objects in a NavBar.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.navbarcontainer.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.navbarcontainer.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.NavBarContainer\">\n        /// <div data-win-control=\"WinJS.UI.NavBarCommand\" data-win-options=\"{location:'/pages/home/home.html',label:'Home',icon:WinJS.UI.AppBarIcon.home}\"></div>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"invoked\" locid=\"WinJS.UI.NavBarContainer_e:invoked\">Raised when a NavBarCommand is invoked.</event>\n        /// <event name=\"splittoggle\" locid=\"WinJS.UI.NavBarContainer_e:splittoggle\">Raised when the split button on a NavBarCommand is toggled.</event>\n        /// <part name=\"navbarcontainer\" class=\"win-navbarcontainer\" locid=\"WinJS.UI.NavBarContainer_part:navbarcontainer\">Styles the entire NavBarContainer control.</part>\n        /// <part name=\"pageindicators\" class=\"win-navbarcontainer-pageindicator-box\" locid=\"WinJS.UI.NavBarContainer_part:pageindicators\">\n        /// Styles the page indication for the NavBarContainer.\n        /// </part>\n        /// <part name=\"indicator\" class=\"win-navbarcontainer-pagination-indicator\" locid=\"WinJS.UI.NavBarContainer_part:indicator\">Styles the page indication for each page.</part>\n        /// <part name=\"currentindicator\" class=\"win-navbarcontainer-pagination-indicator-current\" locid=\"WinJS.UI.NavBarContainer_part:currentindicator\">\n        /// Styles the indication of the current page.\n        /// </part>\n        /// <part name=\"items\" class=\"win-navbarcontainer-surface\" locid=\"WinJS.UI.NavBarContainer_part:items\">Styles the area that contains items for the NavBarContainer.</part>\n        /// <part name=\"navigationArrow\" class=\"win-navbarcontainer-navarrow\" locid=\"WinJS.UI.NavBarContainer_part:navigationArrow\">Styles left and right navigation arrows.</part>\n        /// <part name=\"leftNavigationArrow\" class=\"win-navbarcontainer-navleft\" locid=\"WinJS.UI.NavBarContainer_part:leftNavigationArrow\">Styles the left navigation arrow.</part>\n        /// <part name=\"rightNavigationArrow\" class=\"win-navbarcontainer-navright\" locid=\"WinJS.UI.NavBarContainer_part:rightNavigationArrow\">Styles the right navigation arrow.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        NavBarContainer: _Base.Namespace._lazy(function () {\n            var Key = _ElementUtilities.Key;\n\n            var buttonFadeDelay = 3000;\n            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || \"touch\";\n            var MS_MANIPULATION_STATE_STOPPED = 0;\n\n            var createEvent = _Events._createEventProperty;\n            var eventNames = {\n                invoked: \"invoked\",\n                splittoggle: \"splittoggle\"\n            };\n\n            var strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get navBarContainerViewportAriaLabel() { return _Resources._getWinJSString(\"ui/navBarContainerViewportAriaLabel\").value; }\n            };\n\n            var NavBarContainer = _Base.Class.define(function NavBarContainer_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.NavBarContainer.NavBarContainer\">\n                /// <summary locid=\"WinJS.UI.NavBarContainer.constructor\">\n                /// Creates a new NavBarContainer.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.NavBarContainer.constructor_p:element\">\n                /// The DOM element that will host the NavBarContainer control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.NavBarContainer.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\".\n                /// </param>\n                /// <returns type=\"WinJS.UI.NavBarContainer\" locid=\"WinJS.UI.NavBarContainer.constructor_returnValue\">\n                /// The new NavBarContainer.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n\n                element = element || _Global.document.createElement(\"DIV\");\n                this._id = element.id || _ElementUtilities._uniqueID(element);\n                this._writeProfilerMark(\"constructor,StartTM\");\n\n                options = options || {};\n\n                if (element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.NavBarContainer.DuplicateConstruction\", strings.duplicateConstruction);\n                }\n\n                // Attaching JS control to DOM element\n                element.winControl = this;\n                this._element = element;\n                _ElementUtilities.addClass(this.element, NavBarContainer._ClassName.navbarcontainer);\n                _ElementUtilities.addClass(this.element, \"win-disposable\");\n                if (!element.getAttribute(\"tabIndex\")) {\n                    element.tabIndex = -1;\n                }\n\n                this._focusCurrentItemPassivelyBound = this._focusCurrentItemPassively.bind(this);\n                this._closeSplitAndResetBound = this._closeSplitAndReset.bind(this);\n                this._currentManipulationState = MS_MANIPULATION_STATE_STOPPED;\n\n                this._panningDisabled = !_ElementUtilities._supportsSnapPoints;\n                this._fixedSize = false;\n                this._maxRows = 1;\n                this._sizes = {};\n\n                this._setupTree();\n\n                this._duringConstructor = true;\n\n                this._dataChangingBound = this._dataChanging.bind(this);\n                this._dataChangedBound = this._dataChanged.bind(this);\n\n                Navigation.addEventListener('navigated', this._closeSplitAndResetBound);\n\n                // Don't use set options for the properties so we can control the ordering to avoid rendering multiple times.\n                this.layout = options.layout || _UI.Orientation.horizontal;\n                if (options.maxRows) {\n                    this.maxRows = options.maxRows;\n                }\n                if (options.template) {\n                    this.template = options.template;\n                }\n                if (options.data) {\n                    this.data = options.data;\n                }\n                if (options.fixedSize) {\n                    this.fixedSize = options.fixedSize;\n                }\n\n                // Events only\n                _Control._setOptions(this, options, true);\n\n                this._duringConstructor = false;\n\n                if (options.currentIndex) {\n                    this.currentIndex = options.currentIndex;\n                }\n\n                this._updatePageUI();\n\n                Scheduler.schedule(function NavBarContainer_async_initialize() {\n                    this._updateAppBarReference();\n                }, Scheduler.Priority.normal, this, \"WinJS.UI.NavBarContainer_async_initialize\");\n\n                this._writeProfilerMark(\"constructor,StopTM\");\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.NavBarContainer.element\" helpKeyword=\"WinJS.UI.NavBarContainer.element\">\n                /// Gets the DOM element that hosts the NavBarContainer.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                element: {\n                    get: function () {\n                        return this._element;\n                    }\n                },\n\n                /// <field type=\"Object\" locid=\"WinJS.UI.NavBarContainer.template\" helpKeyword=\"WinJS.UI.NavBarContainer.template\" potentialValueSelector=\"[data-win-control='WinJS.Binding.Template']\">\n                /// Gets or sets a Template or custom rendering function that defines the HTML of each item within the NavBarContainer.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                template: {\n                    get: function () {\n                        return this._template;\n                    },\n                    set: function (value) {\n                        this._template = value;\n                        if (this._repeater) {\n                            var hadFocus = this.element.contains(_Global.document.activeElement);\n\n                            if (!this._duringConstructor) {\n                                this._closeSplitIfOpen();\n                            }\n\n                            // the repeater's template is wired up to this._render() so just resetting it will rebuild the tree.\n                            this._repeater.template = this._repeater.template;\n\n                            if (!this._duringConstructor) {\n                                this._measured = false;\n                                this._sizes.itemMeasured = false;\n                                this._reset();\n                                if (hadFocus) {\n                                    this._keyboardBehavior._focus(0);\n                                }\n                            }\n                        }\n                    }\n                },\n\n                _render: function NavBarContainer_render(item) {\n                    var navbarCommandEl = _Global.document.createElement('div');\n\n                    var template = this._template;\n                    if (template) {\n                        if (template.render) {\n                            template.render(item, navbarCommandEl);\n                        } else if (template.winControl && template.winControl.render) {\n                            template.winControl.render(item, navbarCommandEl);\n                        } else {\n                            navbarCommandEl.appendChild(template(item));\n                        }\n                    }\n\n                    // Create the NavBarCommand after calling render so that the reparenting in navbarCommand works.\n                    var navbarCommand = new _Command.NavBarCommand(navbarCommandEl, item);\n                    return navbarCommand._element;\n                },\n\n                /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.UI.NavBarContainer.data\" helpKeyword=\"WinJS.UI.NavBarContainer.data\">\n                /// Gets or sets the WinJS.Binding.List that provides the NavBarContainer with items to display.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                data: {\n                    get: function () {\n                        return this._repeater && this._repeater.data;\n                    },\n                    set: function (value) {\n                        if (!value) {\n                            value = new BindingList.List();\n                        }\n\n                        if (!this._duringConstructor) {\n                            this._closeSplitIfOpen();\n                        }\n\n                        this._removeDataChangingEvents();\n                        this._removeDataChangedEvents();\n\n                        var hadFocus = this.element.contains(_Global.document.activeElement);\n\n                        if (!this._repeater) {\n                            this._surfaceEl.innerHTML = \"\";\n                            this._repeater = new Repeater.Repeater(this._surfaceEl, {\n                                template: this._render.bind(this)\n                            });\n                        }\n\n                        this._addDataChangingEvents(value);\n                        this._repeater.data = value;\n                        this._addDataChangedEvents(value);\n\n                        if (!this._duringConstructor) {\n                            this._measured = false;\n                            this._sizes.itemMeasured = false;\n                            this._reset();\n                            if (hadFocus) {\n                                this._keyboardBehavior._focus(0);\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.NavBarContainer.maxRows\" helpKeyword=\"WinJS.UI.NavBarContainer.maxRows\">\n                /// Gets or sets the number of rows allowed to be used before items are placed on additional pages.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                maxRows: {\n                    get: function () {\n                        return this._maxRows;\n                    },\n                    set: function (value) {\n                        value = (+value === value) ? value : 1;\n                        this._maxRows = Math.max(1, value);\n\n                        if (!this._duringConstructor) {\n                            this._closeSplitIfOpen();\n\n                            this._measured = false;\n                            this._reset();\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.Orientation\" locid=\"WinJS.UI.NavBarContainer.layout\" helpKeyword=\"WinJS.UI.NavBarContainer.layout\">\n                /// Gets or sets a value that specifies whether the NavBarContainer has a horizontal or vertical layout. The default is \"horizontal\".\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                layout: {\n                    get: function () {\n                        return this._layout;\n                    },\n                    set: function (value) {\n                        if (value === _UI.Orientation.vertical) {\n                            this._layout = _UI.Orientation.vertical;\n                            _ElementUtilities.removeClass(this.element, NavBarContainer._ClassName.horizontal);\n                            _ElementUtilities.addClass(this.element, NavBarContainer._ClassName.vertical);\n                        } else {\n                            this._layout = _UI.Orientation.horizontal;\n                            _ElementUtilities.removeClass(this.element, NavBarContainer._ClassName.vertical);\n                            _ElementUtilities.addClass(this.element, NavBarContainer._ClassName.horizontal);\n                        }\n\n                        this._viewportEl.style.msScrollSnapType = \"\";\n                        this._zooming = false;\n\n                        if (!this._duringConstructor) {\n                            this._measured = false;\n                            this._sizes.itemMeasured = false;\n                            this._ensureVisible(this._keyboardBehavior.currentIndex, true);\n                            this._updatePageUI();\n                            this._closeSplitIfOpen();\n                        }\n                    }\n                },\n\n                /// <field type=\"Number\" integer=\"true\" locid=\"WinJS.UI.NavBarContainer.currentIndex\" hidden=\"true\" helpKeyword=\"WinJS.UI.NavBarContainer.currentIndex\">\n                /// Gets or sets the index of the current NavBarCommand.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                currentIndex: {\n                    get: function () {\n                        return this._keyboardBehavior.currentIndex;\n                    },\n                    set: function (value) {\n                        if (value === +value) {\n                            var hadFocus = this.element.contains(_Global.document.activeElement);\n\n                            this._keyboardBehavior.currentIndex = value;\n\n                            this._ensureVisible(this._keyboardBehavior.currentIndex, true);\n\n                            if (hadFocus) {\n                                this._keyboardBehavior._focus();\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.NavBarContainer.fixedSize\" helpKeyword=\"WinJS.UI.NavBarContainer.fixedSize\">\n                /// Gets or sets a value that specifies whether child NavBarCommand  objects should be a fixed width when there are multiple pages. A value of true indicates\n                /// that the NavBarCommand objects use a fixed width; a value of false indicates that they use a dynamic width.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                fixedSize: {\n                    get: function () {\n                        return this._fixedSize;\n                    },\n                    set: function (value) {\n                        this._fixedSize = !!value;\n\n                        if (!this._duringConstructor) {\n                            this._closeSplitIfOpen();\n\n                            if (!this._measured) {\n                                this._measure();\n                            } else if (this._surfaceEl.children.length > 0) {\n                                this._updateGridStyles();\n                            }\n                        }\n                    }\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.NavBarContainer.oninvoked\" helpKeyword=\"WinJS.UI.NavBarContainer.oninvoked\">\n                /// Raised when a NavBarCommand has been invoked.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                oninvoked: createEvent(eventNames.invoked),\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.NavBarContainer.onsplittoggle\" helpKeyword=\"WinJS.UI.NavBarContainer.onsplittoggle\">\n                /// Raised when the split button on a NavBarCommand is toggled.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onsplittoggle: createEvent(eventNames.splittoggle),\n\n                forceLayout: function NavBarContainer_forceLayout() {\n                    /// <signature helpKeyword=\"WinJS.UI.NavBarContainer.forceLayout\">\n                    /// <summary locid=\"WinJS.UI.NavBarContainer.forceLayout\">\n                    /// Forces the NavBarContainer to update scroll positions and if the NavBar has changed size, it will also re-measure.\n                    /// Use this function when making the NavBarContainer visible again after you set its style.display property to \"none\".\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    this._resizeHandler();\n                    if (this._measured) {\n                        this._scrollPosition = _ElementUtilities.getScrollPosition(this._viewportEl)[(this.layout === _UI.Orientation.horizontal ? \"scrollLeft\" : \"scrollTop\")];\n                    }\n\n                    this._duringForceLayout = true;\n                    this._ensureVisible(this._keyboardBehavior.currentIndex, true);\n                    this._updatePageUI();\n                    this._duringForceLayout = false;\n                },\n\n                _updateAppBarReference: function NavBarContainer_updateAppBarReference() {\n                    if (!this._appBarEl || !this._appBarEl.contains(this.element)) {\n                        if (this._appBarEl) {\n                            this._appBarEl.removeEventListener('beforeopen', this._closeSplitAndResetBound);\n                            this._appBarEl.removeEventListener('beforeopen', this._resizeImplBound);\n                            this._appBarEl.removeEventListener('afteropen', this._focusCurrentItemPassivelyBound);\n                        }\n\n                        var appBarEl = this.element.parentNode;\n                        while (appBarEl && !_ElementUtilities.hasClass(appBarEl, _Constants.appBarClass)) {\n                            appBarEl = appBarEl.parentNode;\n                        }\n                        this._appBarEl = appBarEl;\n\n                        if (this._appBarEl) {\n                            this._appBarEl.addEventListener('beforeopen', this._closeSplitAndResetBound);\n                            this._appBarEl.addEventListener('afteropen', this._focusCurrentItemPassivelyBound);\n                        }\n                    }\n                },\n\n                _closeSplitAndReset: function NavBarContainer_closeSplitAndReset() {\n                    this._closeSplitIfOpen();\n                    this._reset();\n                },\n\n                _dataChanging: function NavBarContainer_dataChanging(ev) {\n                    // Store the element that was active so that we can detect\n                    // if the focus went away because of the data change.\n                    this._elementHadFocus = _Global.document.activeElement;\n\n                    if (this._currentSplitNavItem && this._currentSplitNavItem.splitOpened) {\n                        if (ev.type === \"itemremoved\") {\n                            if (this._surfaceEl.children[ev.detail.index].winControl === this._currentSplitNavItem) {\n                                this._closeSplitIfOpen();\n                            }\n                        } else if (ev.type === \"itemchanged\") {\n                            if (this._surfaceEl.children[ev.detail.index].winControl === this._currentSplitNavItem) {\n                                this._closeSplitIfOpen();\n                            }\n                        } else if (ev.type === \"itemmoved\") {\n                            if (this._surfaceEl.children[ev.detail.oldIndex].winControl === this._currentSplitNavItem) {\n                                this._closeSplitIfOpen();\n                            }\n                        } else if (ev.type === \"reload\") {\n                            this._closeSplitIfOpen();\n                        }\n                    }\n                },\n\n                _dataChanged: function NavBarContainer_dataChanged(ev) {\n                    this._measured = false;\n\n                    if (ev.type === \"itemremoved\") {\n                        if (ev.detail.index < this._keyboardBehavior.currentIndex) {\n                            this._keyboardBehavior.currentIndex--;\n                        } else if (ev.detail.index === this._keyboardBehavior.currentIndex) {\n                            // This clamps if the item being removed was the last item in the list\n                            this._keyboardBehavior.currentIndex = this._keyboardBehavior.currentIndex;\n                            if (nobodyHasFocus() && this._elementHadFocus) {\n                                this._keyboardBehavior._focus();\n                            }\n                        }\n                    } else if (ev.type === \"itemchanged\") {\n                        if (ev.detail.index === this._keyboardBehavior.currentIndex) {\n                            if (nobodyHasFocus() && this._elementHadFocus) {\n                                this._keyboardBehavior._focus();\n                            }\n                        }\n                    } else if (ev.type === \"iteminserted\") {\n                        if (ev.detail.index <= this._keyboardBehavior.currentIndex) {\n                            this._keyboardBehavior.currentIndex++;\n                        }\n                    } else if (ev.type === \"itemmoved\") {\n                        if (ev.detail.oldIndex === this._keyboardBehavior.currentIndex) {\n                            this._keyboardBehavior.currentIndex = ev.detail.newIndex;\n                            if (nobodyHasFocus() && this._elementHadFocus) {\n                                this._keyboardBehavior._focus();\n                            }\n                        }\n                    } else if (ev.type === \"reload\") {\n                        this._keyboardBehavior.currentIndex = 0;\n                        if (nobodyHasFocus() && this._elementHadFocus) {\n                            this._keyboardBehavior._focus();\n                        }\n                    }\n\n                    this._ensureVisible(this._keyboardBehavior.currentIndex, true);\n                    this._updatePageUI();\n                },\n\n                _focusCurrentItemPassively: function NavBarContainer_focusCurrentItemPassively() {\n                    if (this.element.contains(_Global.document.activeElement)) {\n                        this._keyboardBehavior._focus();\n                    }\n                },\n\n                _reset: function NavBarContainer_reset() {\n                    this._keyboardBehavior.currentIndex = 0;\n\n                    if (this.element.contains(_Global.document.activeElement)) {\n                        this._keyboardBehavior._focus(0);\n                    }\n\n                    this._viewportEl.style.msScrollSnapType = \"\";\n                    this._zooming = false;\n\n                    this._ensureVisible(0, true);\n                    this._updatePageUI();\n                },\n\n                _removeDataChangedEvents: function NavBarContainer_removeDataChangedEvents() {\n                    if (this._repeater) {\n                        this._repeater.data.removeEventListener(\"itemchanged\", this._dataChangedBound);\n                        this._repeater.data.removeEventListener(\"iteminserted\", this._dataChangedBound);\n                        this._repeater.data.removeEventListener(\"itemmoved\", this._dataChangedBound);\n                        this._repeater.data.removeEventListener(\"itemremoved\", this._dataChangedBound);\n                        this._repeater.data.removeEventListener(\"reload\", this._dataChangedBound);\n                    }\n                },\n\n                _addDataChangedEvents: function NavBarContainer_addDataChangedEvents() {\n                    if (this._repeater) {\n                        this._repeater.data.addEventListener(\"itemchanged\", this._dataChangedBound);\n                        this._repeater.data.addEventListener(\"iteminserted\", this._dataChangedBound);\n                        this._repeater.data.addEventListener(\"itemmoved\", this._dataChangedBound);\n                        this._repeater.data.addEventListener(\"itemremoved\", this._dataChangedBound);\n                        this._repeater.data.addEventListener(\"reload\", this._dataChangedBound);\n                    }\n                },\n\n                _removeDataChangingEvents: function NavBarContainer_removeDataChangingEvents() {\n                    if (this._repeater) {\n                        this._repeater.data.removeEventListener(\"itemchanged\", this._dataChangingBound);\n                        this._repeater.data.removeEventListener(\"iteminserted\", this._dataChangingBound);\n                        this._repeater.data.removeEventListener(\"itemmoved\", this._dataChangingBound);\n                        this._repeater.data.removeEventListener(\"itemremoved\", this._dataChangingBound);\n                        this._repeater.data.removeEventListener(\"reload\", this._dataChangingBound);\n                    }\n                },\n\n                _addDataChangingEvents: function NavBarContainer_addDataChangingEvents(bindingList) {\n                    bindingList.addEventListener(\"itemchanged\", this._dataChangingBound);\n                    bindingList.addEventListener(\"iteminserted\", this._dataChangingBound);\n                    bindingList.addEventListener(\"itemmoved\", this._dataChangingBound);\n                    bindingList.addEventListener(\"itemremoved\", this._dataChangingBound);\n                    bindingList.addEventListener(\"reload\", this._dataChangingBound);\n                },\n\n                _mouseleave: function NavBarContainer_mouseleave() {\n                    if (this._mouseInViewport) {\n                        this._mouseInViewport = false;\n                        this._updateArrows();\n                    }\n                },\n\n                _MSPointerDown: function NavBarContainer_MSPointerDown(ev) {\n                    if (ev.pointerType === PT_TOUCH) {\n                        if (this._mouseInViewport) {\n                            this._mouseInViewport = false;\n                            this._updateArrows();\n                        }\n                    }\n                },\n\n                _MSPointerMove: function NavBarContainer_MSPointerMove(ev) {\n                    if (ev.pointerType !== PT_TOUCH) {\n                        if (!this._mouseInViewport) {\n                            this._mouseInViewport = true;\n                            this._updateArrows();\n                        }\n                    }\n                },\n\n                _setupTree: function NavBarContainer_setupTree() {\n                    this._animateNextPreviousButtons = Promise.wrap();\n                    this._element.addEventListener('mouseleave', this._mouseleave.bind(this));\n                    _ElementUtilities._addEventListener(this._element, 'pointerdown', this._MSPointerDown.bind(this));\n                    _ElementUtilities._addEventListener(this._element, 'pointermove', this._MSPointerMove.bind(this));\n                    _ElementUtilities._addEventListener(this._element, \"focusin\", this._focusHandler.bind(this), false);\n\n                    this._pageindicatorsEl = _Global.document.createElement('div');\n                    _ElementUtilities.addClass(this._pageindicatorsEl, NavBarContainer._ClassName.pageindicators);\n                    this._element.appendChild(this._pageindicatorsEl);\n\n                    this._ariaStartMarker = _Global.document.createElement(\"div\");\n                    this._element.appendChild(this._ariaStartMarker);\n\n                    this._viewportEl = _Global.document.createElement('div');\n                    _ElementUtilities.addClass(this._viewportEl, NavBarContainer._ClassName.viewport);\n                    this._element.appendChild(this._viewportEl);\n                    this._viewportEl.setAttribute(\"role\", \"group\");\n                    this._viewportEl.setAttribute(\"aria-label\", strings.navBarContainerViewportAriaLabel);\n\n                    this._boundResizeHandler = this._resizeHandler.bind(this);\n                    _ElementUtilities._resizeNotifier.subscribe(this._element, this._boundResizeHandler);\n                    this._viewportEl.addEventListener(\"mselementresize\", this._resizeHandler.bind(this));\n                    this._viewportEl.addEventListener(\"scroll\", this._scrollHandler.bind(this));\n                    this._viewportEl.addEventListener(\"MSManipulationStateChanged\", this._MSManipulationStateChangedHandler.bind(this));\n\n                    this._ariaEndMarker = _Global.document.createElement(\"div\");\n                    this._element.appendChild(this._ariaEndMarker);\n\n                    this._surfaceEl = _Global.document.createElement('div');\n                    _ElementUtilities.addClass(this._surfaceEl, NavBarContainer._ClassName.surface);\n                    this._viewportEl.appendChild(this._surfaceEl);\n\n                    this._surfaceEl.addEventListener(\"_invoked\", this._navbarCommandInvokedHandler.bind(this));\n                    this._surfaceEl.addEventListener(\"_splittoggle\", this._navbarCommandSplitToggleHandler.bind(this));\n                    _ElementUtilities._addEventListener(this._surfaceEl, \"focusin\", this._itemsFocusHandler.bind(this), false);\n                    this._surfaceEl.addEventListener(\"keydown\", this._keyDownHandler.bind(this));\n\n                    // Reparent NavBarCommands which were in declarative markup\n                    var tempEl = this.element.firstElementChild;\n                    while (tempEl !== this._pageindicatorsEl) {\n                        this._surfaceEl.appendChild(tempEl);\n                        ControlProcessor.process(tempEl);\n                        tempEl = this.element.firstElementChild;\n                    }\n\n                    this._leftArrowEl = _Global.document.createElement('div');\n                    _ElementUtilities.addClass(this._leftArrowEl, NavBarContainer._ClassName.navleftarrow);\n                    _ElementUtilities.addClass(this._leftArrowEl, NavBarContainer._ClassName.navarrow);\n                    this._element.appendChild(this._leftArrowEl);\n                    this._leftArrowEl.addEventListener('click', this._goLeft.bind(this));\n                    this._leftArrowEl.style.opacity = 0;\n                    this._leftArrowEl.style.visibility = 'hidden';\n                    this._leftArrowFadeOut = Promise.wrap();\n\n                    this._rightArrowEl = _Global.document.createElement('div');\n                    _ElementUtilities.addClass(this._rightArrowEl, NavBarContainer._ClassName.navrightarrow);\n                    _ElementUtilities.addClass(this._rightArrowEl, NavBarContainer._ClassName.navarrow);\n                    this._element.appendChild(this._rightArrowEl);\n                    this._rightArrowEl.addEventListener('click', this._goRight.bind(this));\n                    this._rightArrowEl.style.opacity = 0;\n                    this._rightArrowEl.style.visibility = 'hidden';\n                    this._rightArrowFadeOut = Promise.wrap();\n\n                    this._keyboardBehavior = new _KeyboardBehavior._KeyboardBehavior(this._surfaceEl, {\n                        scroller: this._viewportEl\n                    });\n                    this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._surfaceEl);\n                },\n\n                _goRight: function NavBarContainer_goRight() {\n                    if (this._sizes.rtl) {\n                        this._goPrev();\n                    } else {\n                        this._goNext();\n                    }\n                },\n\n                _goLeft: function NavBarContainer_goLeft() {\n                    if (this._sizes.rtl) {\n                        this._goNext();\n                    } else {\n                        this._goPrev();\n                    }\n                },\n\n                _goNext: function NavBarContainer_goNext() {\n                    this._measure();\n                    var itemsPerPage = this._sizes.rowsPerPage * this._sizes.columnsPerPage;\n                    var targetPage = Math.min(Math.floor(this._keyboardBehavior.currentIndex / itemsPerPage) + 1, this._sizes.pages - 1);\n                    this._keyboardBehavior.currentIndex = Math.min(itemsPerPage * targetPage, this._surfaceEl.children.length);\n                    this._keyboardBehavior._focus();\n                },\n\n                _goPrev: function NavBarContainer_goPrev() {\n                    this._measure();\n                    var itemsPerPage = this._sizes.rowsPerPage * this._sizes.columnsPerPage;\n                    var targetPage = Math.max(0, Math.floor(this._keyboardBehavior.currentIndex / itemsPerPage) - 1);\n                    this._keyboardBehavior.currentIndex = Math.max(itemsPerPage * targetPage, 0);\n                    this._keyboardBehavior._focus();\n                },\n\n                _currentPage: {\n                    get: function () {\n                        if (this.layout === _UI.Orientation.horizontal) {\n                            this._measure();\n                            if (this._sizes.viewportOffsetWidth > 0) {\n                                return Math.min(this._sizes.pages - 1, Math.round(this._scrollPosition / this._sizes.viewportOffsetWidth));\n                            }\n                        }\n                        return 0;\n                    }\n                },\n\n                _resizeHandler: function NavBarContainer_resizeHandler() {\n                    if (this._disposed) { return; }\n                    if (!this._measured) { return; }\n                    var viewportResized = this.layout === _UI.Orientation.horizontal\n                            ? this._sizes.viewportOffsetWidth !== parseFloat(_Global.getComputedStyle(this._viewportEl).width)\n                            : this._sizes.viewportOffsetHeight !== parseFloat(_Global.getComputedStyle(this._viewportEl).height);\n                    if (!viewportResized) { return; }\n\n                    this._measured = false;\n\n                    if (!this._pendingResize) {\n                        this._pendingResize = true;\n\n                        this._resizeImplBound = this._resizeImplBound || this._resizeImpl.bind(this);\n\n                        this._updateAppBarReference();\n\n                        if (this._appBarEl && this._appBarEl.winControl && !this._appBarEl.winControl.opened) {\n                            // Do resize lazily.\n                            Scheduler.schedule(this._resizeImplBound, Scheduler.Priority.idle, null, \"WinJS.UI.NavBarContainer._resizeImpl\");\n                            this._appBarEl.addEventListener('beforeopen', this._resizeImplBound);\n                        } else {\n                            // Do resize now\n                            this._resizeImpl();\n                        }\n                    }\n                },\n\n                _resizeImpl: function NavBarContainer_resizeImpl() {\n                    if (!this._disposed && this._pendingResize) {\n                        this._pendingResize = false;\n                        if (this._appBarEl) {\n                            this._appBarEl.removeEventListener('beforeopen', this._resizeImplBound);\n                        }\n\n                        this._keyboardBehavior.currentIndex = 0;\n                        if (this.element.contains(_Global.document.activeElement)) {\n                            this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex);\n                        }\n                        this._closeSplitIfOpen();\n                        this._ensureVisible(this._keyboardBehavior.currentIndex, true);\n                        this._updatePageUI();\n                    }\n                },\n\n                _keyDownHandler: function NavBarContainer_keyDownHandler(ev) {\n                    var keyCode = ev.keyCode;\n                    if (!ev.altKey && (keyCode === Key.pageUp || keyCode === Key.pageDown)) {\n                        var srcElement = ev.target;\n                        if (_ElementUtilities._matchesSelector(srcElement, \".win-interactive, .win-interactive *\")) {\n                            return;\n                        }\n\n                        var index = this._keyboardBehavior.currentIndex;\n                        this._measure();\n\n                        var sizes = this._sizes;\n                        var page = Math.floor(index / (sizes.columnsPerPage * sizes.rowsPerPage));\n\n                        var scrollPositionTarget = null;\n                        if (keyCode === Key.pageUp) {\n                            if (this.layout === _UI.Orientation.horizontal) {\n                                var indexOfFirstItemOnPage = page * sizes.columnsPerPage * sizes.rowsPerPage;\n                                if (index === indexOfFirstItemOnPage && this._surfaceEl.children[index].winControl._buttonEl === _Global.document.activeElement) {\n                                    // First item on page so go back 1 page.\n                                    index = index - sizes.columnsPerPage * sizes.rowsPerPage;\n                                } else {\n                                    // Not first item on page so go to the first item on page.\n                                    index = indexOfFirstItemOnPage;\n                                }\n                            } else {\n                                var currentItem = this._surfaceEl.children[index];\n                                var top = currentItem.offsetTop;\n                                var bottom = top + currentItem.offsetHeight;\n                                var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;\n\n                                if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) {\n                                    // current item is fully on screen.\n                                    while (index > 0 &&\n                                        this._surfaceEl.children[index - 1].offsetTop > scrollPosition) {\n                                        index--;\n                                    }\n                                }\n\n                                if (this._keyboardBehavior.currentIndex === index) {\n                                    var scrollPositionForOnePageAboveItem = bottom - sizes.viewportOffsetHeight;\n                                    index = Math.max(0, index - 1);\n                                    while (index > 0 &&\n                                        this._surfaceEl.children[index - 1].offsetTop > scrollPositionForOnePageAboveItem) {\n                                        index--;\n                                    }\n                                    if (index > 0) {\n                                        scrollPositionTarget = this._surfaceEl.children[index].offsetTop - this._sizes.itemMarginTop;\n                                    } else {\n                                        scrollPositionTarget = 0;\n                                    }\n                                }\n                            }\n\n                            index = Math.max(index, 0);\n                            this._keyboardBehavior.currentIndex = index;\n\n                            var element = this._surfaceEl.children[index].winControl._buttonEl;\n\n                            if (scrollPositionTarget !== null) {\n                                this._scrollTo(scrollPositionTarget);\n                            }\n\n                            _ElementUtilities._setActive(element, this._viewportEl);\n                        } else {\n                            if (this.layout === _UI.Orientation.horizontal) {\n                                var indexOfLastItemOnPage = (page + 1) * sizes.columnsPerPage * sizes.rowsPerPage - 1;\n\n                                if (index === indexOfLastItemOnPage) {\n                                    // Last item on page so go forward 1 page.\n                                    index = index + sizes.columnsPerPage * sizes.rowsPerPage;\n                                } else {\n                                    // Not Last item on page so go to last item on page.\n                                    index = indexOfLastItemOnPage;\n                                }\n                            } else {\n                                var currentItem = this._surfaceEl.children[this._keyboardBehavior.currentIndex];\n                                var top = currentItem.offsetTop;\n                                var bottom = top + currentItem.offsetHeight;\n                                var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;\n\n                                if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) {\n                                    // current item is fully on screen.\n                                    while (index < this._surfaceEl.children.length - 1 &&\n                                        this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPosition + sizes.viewportOffsetHeight) {\n                                        index++;\n                                    }\n                                }\n\n                                if (index === this._keyboardBehavior.currentIndex) {\n                                    var scrollPositionForOnePageBelowItem = top + sizes.viewportOffsetHeight;\n                                    index = Math.min(this._surfaceEl.children.length - 1, index + 1);\n                                    while (index < this._surfaceEl.children.length - 1 &&\n                                        this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPositionForOnePageBelowItem) {\n                                        index++;\n                                    }\n\n                                    if (index < this._surfaceEl.children.length - 1) {\n                                        scrollPositionTarget = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight;\n                                    } else {\n                                        scrollPositionTarget = this._scrollLength - this._sizes.viewportOffsetHeight;\n                                    }\n                                }\n                            }\n\n                            index = Math.min(index, this._surfaceEl.children.length - 1);\n                            this._keyboardBehavior.currentIndex = index;\n\n                            var element = this._surfaceEl.children[index].winControl._buttonEl;\n\n                            if (scrollPositionTarget !== null) {\n                                this._scrollTo(scrollPositionTarget);\n                            }\n\n                            try {\n                                _ElementUtilities._setActive(element, this._viewportEl);\n                            } catch (e) {\n                            }\n                        }\n                    }\n                },\n\n                _focusHandler: function NavBarContainer_focusHandler(ev) {\n                    var srcElement = ev.target;\n                    if (!this._surfaceEl.contains(srcElement)) {\n                        // Forward focus from NavBarContainer, viewport or surface to the currentIndex.\n                        this._skipEnsureVisible = true;\n                        this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex);\n                    }\n                },\n\n                _itemsFocusHandler: function NavBarContainer_itemsFocusHandler(ev) {\n                    // Find the item which is being focused and scroll it to view.\n                    var srcElement = ev.target;\n                    if (srcElement === this._surfaceEl) {\n                        return;\n                    }\n\n                    while (srcElement.parentNode !== this._surfaceEl) {\n                        srcElement = srcElement.parentNode;\n                    }\n\n                    var index = -1;\n                    while (srcElement) {\n                        index++;\n                        srcElement = srcElement.previousSibling;\n                    }\n\n                    if (this._skipEnsureVisible) {\n                        this._skipEnsureVisible = false;\n                    } else {\n                        this._ensureVisible(index);\n                    }\n                },\n\n                _ensureVisible: function NavBarContainer_ensureVisible(index, withoutAnimation) {\n                    this._measure();\n\n                    if (this.layout === _UI.Orientation.horizontal) {\n                        var page = Math.floor(index / (this._sizes.rowsPerPage * this._sizes.columnsPerPage));\n                        this._scrollTo(page * this._sizes.viewportOffsetWidth, withoutAnimation);\n                    } else {\n                        var element = this._surfaceEl.children[index];\n                        var maxScrollPosition;\n                        if (index > 0) {\n                            maxScrollPosition = element.offsetTop - this._sizes.itemMarginTop;\n                        } else {\n                            maxScrollPosition = 0;\n                        }\n                        var minScrollPosition;\n                        if (index < this._surfaceEl.children.length - 1) {\n                            minScrollPosition = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight;\n                        } else {\n                            minScrollPosition = this._scrollLength - this._sizes.viewportOffsetHeight;\n                        }\n\n                        var newScrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;\n                        newScrollPosition = Math.max(newScrollPosition, minScrollPosition);\n                        newScrollPosition = Math.min(newScrollPosition, maxScrollPosition);\n                        this._scrollTo(newScrollPosition, withoutAnimation);\n                    }\n                },\n\n                _scrollTo: function NavBarContainer_scrollTo(targetScrollPosition, withoutAnimation) {\n                    this._measure();\n                    if (this.layout === _UI.Orientation.horizontal) {\n                        targetScrollPosition = Math.max(0, Math.min(this._scrollLength - this._sizes.viewportOffsetWidth, targetScrollPosition));\n                    } else {\n                        targetScrollPosition = Math.max(0, Math.min(this._scrollLength - this._sizes.viewportOffsetHeight, targetScrollPosition));\n                    }\n\n                    if (withoutAnimation) {\n                        if (Math.abs(this._scrollPosition - targetScrollPosition) > 1) {\n                            this._zooming = false;\n\n                            this._scrollPosition = targetScrollPosition;\n                            this._updatePageUI();\n                            if (!this._duringForceLayout) {\n                                this._closeSplitIfOpen();\n                            }\n\n                            var newScrollPos = {};\n                            newScrollPos[(this.layout === _UI.Orientation.horizontal ? \"scrollLeft\" : \"scrollTop\")] = targetScrollPosition;\n                            _ElementUtilities.setScrollPosition(this._viewportEl, newScrollPos);\n                        }\n                    } else {\n                        if ((!this._zooming && Math.abs(this._scrollPosition - targetScrollPosition) > 1) || (this._zooming && Math.abs(this._zoomPosition - targetScrollPosition) > 1)) {\n                            this._zoomPosition = targetScrollPosition;\n\n                            this._zooming = true;\n\n                            if (this.layout === _UI.Orientation.horizontal) {\n                                this._viewportEl.style.msScrollSnapType = \"none\";\n                                _ElementUtilities._zoomTo(this._viewportEl, { contentX: targetScrollPosition, contentY: 0, viewportX: 0, viewportY: 0 });\n                            } else {\n                                _ElementUtilities._zoomTo(this._viewportEl, { contentX: 0, contentY: targetScrollPosition, viewportX: 0, viewportY: 0 });\n                            }\n\n                            this._closeSplitIfOpen();\n                        }\n                    }\n                },\n\n                _MSManipulationStateChangedHandler: function NavBarContainer_MSManipulationStateChangedHandler(e) {\n                    this._currentManipulationState = e.currentState;\n\n                    if (e.currentState === e.MS_MANIPULATION_STATE_ACTIVE) {\n                        this._viewportEl.style.msScrollSnapType = \"\";\n                        this._zooming = false;\n                    }\n\n                    _Global.clearTimeout(this._manipulationStateTimeoutId);\n                    // The extra stop event is firing when an zoomTo is called during another zoomTo and\n                    // also the first zoomTo after a resize.\n                    if (e.currentState === e.MS_MANIPULATION_STATE_STOPPED) {\n                        this._manipulationStateTimeoutId = _Global.setTimeout(function () {\n                            this._viewportEl.style.msScrollSnapType = \"\";\n                            this._zooming = false;\n                            this._updateCurrentIndexIfPageChanged();\n                        }.bind(this), 100);\n                    }\n                },\n\n                _scrollHandler: function NavBarContainer_scrollHandler() {\n                    if (this._disposed) { return; }\n\n                    this._measured = false;\n                    if (!this._checkingScroll) {\n                        var that = this;\n                        this._checkingScroll = _BaseUtils._requestAnimationFrame(function () {\n                            if (that._disposed) { return; }\n                            that._checkingScroll = null;\n\n                            var newScrollPosition = _ElementUtilities.getScrollPosition(that._viewportEl)[(that.layout === _UI.Orientation.horizontal ? \"scrollLeft\" : \"scrollTop\")];\n                            if (newScrollPosition !== that._scrollPosition) {\n                                that._scrollPosition = newScrollPosition;\n                                that._closeSplitIfOpen();\n                            }\n                            that._updatePageUI();\n\n                            if (!that._zooming && that._currentManipulationState === MS_MANIPULATION_STATE_STOPPED) {\n                                that._updateCurrentIndexIfPageChanged();\n                            }\n                        });\n                    }\n                },\n\n                _updateCurrentIndexIfPageChanged: function NavBarContainer_updateCurrentIndexIfPageChanged() {\n                    // If you change pages via pagination arrows, mouse wheel, or panning we need to update the current\n                    // item to be the first item on the new page.\n                    if (this.layout === _UI.Orientation.horizontal) {\n                        this._measure();\n                        var currentPage = this._currentPage;\n                        var firstIndexOnPage = currentPage * this._sizes.rowsPerPage * this._sizes.columnsPerPage;\n                        var lastIndexOnPage = (currentPage + 1) * this._sizes.rowsPerPage * this._sizes.columnsPerPage - 1;\n\n                        if (this._keyboardBehavior.currentIndex < firstIndexOnPage || this._keyboardBehavior.currentIndex > lastIndexOnPage) {\n                            // Page change occurred.\n                            this._keyboardBehavior.currentIndex = firstIndexOnPage;\n\n                            if (this.element.contains(_Global.document.activeElement)) {\n                                this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex);\n                            }\n                        }\n                    }\n                },\n\n                _measure: function NavBarContainer_measure() {\n                    if (!this._measured) {\n                        this._resizeImpl();\n                        this._writeProfilerMark(\"measure,StartTM\");\n\n                        var sizes = this._sizes;\n\n                        sizes.rtl = _Global.getComputedStyle(this._element).direction === \"rtl\";\n\n                        var itemCount = this._surfaceEl.children.length;\n                        if (itemCount > 0) {\n                            if (!this._sizes.itemMeasured) {\n                                this._writeProfilerMark(\"measureItem,StartTM\");\n\n                                var elementToMeasure = this._surfaceEl.firstElementChild;\n                                // Clear inline margins set by NavBarContainer before measuring.\n                                elementToMeasure.style.margin = \"\";\n                                elementToMeasure.style.width = \"\";\n                                var elementComputedStyle = _Global.getComputedStyle(elementToMeasure);\n                                sizes.itemOffsetWidth = parseFloat(_Global.getComputedStyle(elementToMeasure).width);\n                                if (elementToMeasure.offsetWidth === 0) {\n                                    sizes.itemOffsetWidth = 0;\n                                }\n                                sizes.itemMarginLeft = parseFloat(elementComputedStyle.marginLeft);\n                                sizes.itemMarginRight = parseFloat(elementComputedStyle.marginRight);\n                                sizes.itemWidth = sizes.itemOffsetWidth + sizes.itemMarginLeft + sizes.itemMarginRight;\n                                sizes.itemOffsetHeight = parseFloat(_Global.getComputedStyle(elementToMeasure).height);\n                                if (elementToMeasure.offsetHeight === 0) {\n                                    sizes.itemOffsetHeight = 0;\n                                }\n                                sizes.itemMarginTop = parseFloat(elementComputedStyle.marginTop);\n                                sizes.itemMarginBottom = parseFloat(elementComputedStyle.marginBottom);\n                                sizes.itemHeight = sizes.itemOffsetHeight + sizes.itemMarginTop + sizes.itemMarginBottom;\n                                if (sizes.itemOffsetWidth > 0 && sizes.itemOffsetHeight > 0) {\n                                    sizes.itemMeasured = true;\n                                }\n                                this._writeProfilerMark(\"measureItem,StopTM\");\n                            }\n\n                            sizes.viewportOffsetWidth = parseFloat(_Global.getComputedStyle(this._viewportEl).width);\n                            if (this._viewportEl.offsetWidth === 0) {\n                                sizes.viewportOffsetWidth = 0;\n                            }\n                            sizes.viewportOffsetHeight = parseFloat(_Global.getComputedStyle(this._viewportEl).height);\n                            if (this._viewportEl.offsetHeight === 0) {\n                                sizes.viewportOffsetHeight = 0;\n                            }\n\n                            if (sizes.viewportOffsetWidth === 0 || sizes.itemOffsetHeight === 0) {\n                                this._measured = false;\n                            } else {\n                                this._measured = true;\n                            }\n\n                            if (this.layout === _UI.Orientation.horizontal) {\n                                this._scrollPosition = _ElementUtilities.getScrollPosition(this._viewportEl).scrollLeft;\n\n                                sizes.leadingEdge = this._leftArrowEl.offsetWidth + parseInt(_Global.getComputedStyle(this._leftArrowEl).marginLeft) + parseInt(_Global.getComputedStyle(this._leftArrowEl).marginRight);\n                                var usableSpace = sizes.viewportOffsetWidth - sizes.leadingEdge * 2;\n                                sizes.maxColumns = sizes.itemWidth ? Math.max(1, Math.floor(usableSpace / sizes.itemWidth)) : 1;\n                                sizes.rowsPerPage = Math.min(this.maxRows, Math.ceil(itemCount / sizes.maxColumns));\n                                sizes.columnsPerPage = Math.min(sizes.maxColumns, itemCount);\n                                sizes.pages = Math.ceil(itemCount / (sizes.columnsPerPage * sizes.rowsPerPage));\n                                sizes.trailingEdge = sizes.leadingEdge;\n                                sizes.extraSpace = usableSpace - (sizes.columnsPerPage * sizes.itemWidth);\n\n                                this._scrollLength = sizes.viewportOffsetWidth * sizes.pages;\n\n                                this._keyboardBehavior.fixedSize = sizes.rowsPerPage;\n                                this._keyboardBehavior.fixedDirection = _KeyboardBehavior._KeyboardBehavior.FixedDirection.height;\n\n                                this._surfaceEl.style.height = (sizes.itemHeight * sizes.rowsPerPage) + \"px\";\n                                this._surfaceEl.style.width = this._scrollLength + \"px\";\n                            } else {\n                                this._scrollPosition = this._viewportEl.scrollTop;\n\n                                sizes.leadingEdge = 0;\n                                sizes.rowsPerPage = itemCount;\n                                sizes.columnsPerPage = 1;\n                                sizes.pages = 1;\n                                sizes.trailingEdge = 0;\n\n                                // Reminder there is margin collapsing so just use scrollHeight instead of itemHeight * itemCount\n                                this._scrollLength = this._viewportEl.scrollHeight;\n\n                                this._keyboardBehavior.fixedSize = sizes.columnsPerPage;\n                                this._keyboardBehavior.fixedDirection = _KeyboardBehavior._KeyboardBehavior.FixedDirection.width;\n\n                                this._surfaceEl.style.height = \"\";\n                                this._surfaceEl.style.width = \"\";\n                            }\n\n                            this._updateGridStyles();\n                        } else {\n                            sizes.pages = 1;\n                            this._hasPreviousContent = false;\n                            this._hasNextContent = false;\n                            this._surfaceEl.style.height = \"\";\n                            this._surfaceEl.style.width = \"\";\n                        }\n\n                        this._writeProfilerMark(\"measure,StopTM\");\n                    }\n                },\n\n                _updateGridStyles: function NavBarContainer_updateGridStyles() {\n                    var sizes = this._sizes;\n                    var itemCount = this._surfaceEl.children.length;\n\n                    for (var index = 0; index < itemCount; index++) {\n                        var itemEl = this._surfaceEl.children[index];\n\n                        var marginRight;\n                        var marginLeft;\n                        var width = \"\";\n\n                        if (this.layout === _UI.Orientation.horizontal) {\n                            var column = Math.floor(index / sizes.rowsPerPage);\n                            var isFirstColumnOnPage = column % sizes.columnsPerPage === 0;\n                            var isLastColumnOnPage = column % sizes.columnsPerPage === sizes.columnsPerPage - 1;\n\n                            var extraTrailingMargin = sizes.trailingEdge;\n                            if (this.fixedSize) {\n                                extraTrailingMargin += sizes.extraSpace;\n                            } else {\n                                var spaceToDistribute = sizes.extraSpace - (sizes.maxColumns - sizes.columnsPerPage) * sizes.itemWidth;\n                                width = (sizes.itemOffsetWidth + (spaceToDistribute / sizes.maxColumns)) + \"px\";\n                            }\n\n                            var extraMarginRight;\n                            var extraMarginLeft;\n\n                            if (sizes.rtl) {\n                                extraMarginRight = (isFirstColumnOnPage ? sizes.leadingEdge : 0);\n                                extraMarginLeft = (isLastColumnOnPage ? extraTrailingMargin : 0);\n                            } else {\n                                extraMarginRight = (isLastColumnOnPage ? extraTrailingMargin : 0);\n                                extraMarginLeft = (isFirstColumnOnPage ? sizes.leadingEdge : 0);\n                            }\n\n                            marginRight = extraMarginRight + sizes.itemMarginRight + \"px\";\n                            marginLeft = extraMarginLeft + sizes.itemMarginLeft + \"px\";\n                        } else {\n                            marginRight = \"\";\n                            marginLeft = \"\";\n                        }\n\n                        if (itemEl.style.marginRight !== marginRight) {\n                            itemEl.style.marginRight = marginRight;\n                        }\n                        if (itemEl.style.marginLeft !== marginLeft) {\n                            itemEl.style.marginLeft = marginLeft;\n                        }\n                        if (itemEl.style.width !== width) {\n                            itemEl.style.width = width;\n                        }\n                    }\n                },\n\n                _updatePageUI: function NavBarContainer_updatePageUI() {\n                    this._measure();\n                    var currentPage = this._currentPage;\n\n                    this._hasPreviousContent = (currentPage !== 0);\n                    this._hasNextContent = (currentPage < this._sizes.pages - 1);\n                    this._updateArrows();\n\n                    // Always output the pagination indicators so they reserves up space.\n                    if (this._indicatorCount !== this._sizes.pages) {\n                        this._indicatorCount = this._sizes.pages;\n                        this._pageindicatorsEl.innerHTML = new Array(this._sizes.pages + 1).join('<span class=\"' + NavBarContainer._ClassName.indicator + '\"></span>');\n                    }\n\n                    for (var i = 0; i < this._pageindicatorsEl.children.length; i++) {\n                        if (i === currentPage) {\n                            _ElementUtilities.addClass(this._pageindicatorsEl.children[i], NavBarContainer._ClassName.currentindicator);\n                        } else {\n                            _ElementUtilities.removeClass(this._pageindicatorsEl.children[i], NavBarContainer._ClassName.currentindicator);\n                        }\n                    }\n\n                    if (this._sizes.pages > 1) {\n                        this._viewportEl.style.overflowX = this._panningDisabled ? \"hidden\" : \"\";\n                        this._pageindicatorsEl.style.visibility = \"\";\n                    } else {\n                        this._viewportEl.style.overflowX = \"hidden\";\n                        this._pageindicatorsEl.style.visibility = \"hidden\";\n                    }\n\n                    if (this._sizes.pages <= 1 || this._layout !== _UI.Orientation.horizontal) {\n                        this._ariaStartMarker.removeAttribute(\"aria-flowto\");\n                        this._ariaEndMarker.removeAttribute(\"x-ms-aria-flowfrom\");\n                    } else {\n                        var firstIndexOnCurrentPage = currentPage * this._sizes.rowsPerPage * this._sizes.columnsPerPage;\n                        var firstItem = this._surfaceEl.children[firstIndexOnCurrentPage].winControl._buttonEl;\n                        _ElementUtilities._ensureId(firstItem);\n                        this._ariaStartMarker.setAttribute(\"aria-flowto\", firstItem.id);\n\n                        var lastIndexOnCurrentPage = Math.min(this._surfaceEl.children.length - 1, (currentPage + 1) * this._sizes.rowsPerPage * this._sizes.columnsPerPage - 1);\n                        var lastItem = this._surfaceEl.children[lastIndexOnCurrentPage].winControl._buttonEl;\n                        _ElementUtilities._ensureId(lastItem);\n                        this._ariaEndMarker.setAttribute(\"x-ms-aria-flowfrom\", lastItem.id);\n                    }\n                },\n\n                _closeSplitIfOpen: function NavBarContainer_closeSplitIfOpen() {\n                    if (this._currentSplitNavItem) {\n                        if (this._currentSplitNavItem.splitOpened) {\n                            this._currentSplitNavItem._toggleSplit();\n                        }\n                        this._currentSplitNavItem = null;\n                    }\n                },\n\n                _updateArrows: function NavBarContainer_updateArrows() {\n                    var hasLeftContent = this._sizes.rtl ? this._hasNextContent : this._hasPreviousContent;\n                    var hasRightContent = this._sizes.rtl ? this._hasPreviousContent : this._hasNextContent;\n\n                    var that = this;\n                    // Previous and next are the arrows, not states. On mouse hover the arrows fade in immediately. If you\n                    // mouse out the arrows fade out after a delay. When you reach the last/first page, the corresponding\n                    // arrow fades out immediately as well.\n                    if ((this._mouseInViewport || this._panningDisabled) && hasLeftContent) {\n                        this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel();\n                        this._leftArrowWaitingToFadeOut = null;\n                        this._leftArrowFadeOut && this._leftArrowFadeOut.cancel();\n                        this._leftArrowFadeOut = null;\n                        this._leftArrowEl.style.visibility = '';\n                        this._leftArrowFadeIn = this._leftArrowFadeIn || Animations.fadeIn(this._leftArrowEl);\n                    } else {\n                        if (hasLeftContent) {\n                            // If we need a delayed fade out and we are already running a delayed fade out just use that one, don't extend it.\n                            // Otherwise create a delayed fade out.\n                            this._leftArrowWaitingToFadeOut = this._leftArrowWaitingToFadeOut || Promise.timeout(_TransitionAnimation._animationTimeAdjustment(buttonFadeDelay));\n                        } else {\n                            // If we need a immediate fade out and already have a delayed fade out cancel that one and create an immediate one.\n                            this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel();\n                            this._leftArrowWaitingToFadeOut = Promise.wrap();\n                        }\n                        this._leftArrowWaitingToFadeOut.then(function () {\n                            // After the delay cancel any fade in if running. If we already were fading out continue it otherwise start the fade out.\n                            this._leftArrowFadeIn && this._leftArrowFadeIn.cancel();\n                            this._leftArrowFadeIn = null;\n                            this._leftArrowFadeOut = this._leftArrowFadeOut || Animations.fadeOut(this._leftArrowEl).then(function () {\n                                that._leftArrowEl.style.visibility = 'hidden';\n                            });\n                        }.bind(this));\n                    }\n\n                    // Same pattern for Next arrow.\n                    if ((this._mouseInViewport || this._panningDisabled) && hasRightContent) {\n                        this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel();\n                        this._rightArrowWaitingToFadeOut = null;\n                        this._rightArrowFadeOut && this._rightArrowFadeOut.cancel();\n                        this._rightArrowFadeOut = null;\n                        this._rightArrowEl.style.visibility = '';\n                        this._rightArrowFadeIn = this._rightArrowFadeIn || Animations.fadeIn(this._rightArrowEl);\n                    } else {\n                        if (hasRightContent) {\n                            this._rightArrowWaitingToFadeOut = this._rightArrowWaitingToFadeOut || Promise.timeout(_TransitionAnimation._animationTimeAdjustment(buttonFadeDelay));\n                        } else {\n                            this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel();\n                            this._rightArrowWaitingToFadeOut = Promise.wrap();\n                        }\n                        this._rightArrowWaitingToFadeOut.then(function () {\n                            this._rightArrowFadeIn && this._rightArrowFadeIn.cancel();\n                            this._rightArrowFadeIn = null;\n                            this._rightArrowFadeOut = this._rightArrowFadeOut || Animations.fadeOut(this._rightArrowEl).then(function () {\n                                that._rightArrowEl.style.visibility = 'hidden';\n                            });\n                        }.bind(this));\n                    }\n                },\n\n                _navbarCommandInvokedHandler: function NavBarContainer_navbarCommandInvokedHandler(ev) {\n                    var srcElement = ev.target;\n                    var index = -1;\n                    while (srcElement) {\n                        index++;\n                        srcElement = srcElement.previousSibling;\n                    }\n\n                    this._fireEvent(NavBarContainer._EventName.invoked, {\n                        index: index,\n                        navbarCommand: ev.target.winControl,\n                        data: this._repeater ? this._repeater.data.getAt(index) : null\n                    });\n                },\n\n                _navbarCommandSplitToggleHandler: function NavBarContainer_navbarCommandSplitToggleHandler(ev) {\n                    var srcElement = ev.target;\n                    var index = -1;\n                    while (srcElement) {\n                        index++;\n                        srcElement = srcElement.previousSibling;\n                    }\n\n                    var navbarCommand = ev.target.winControl;\n\n                    this._closeSplitIfOpen();\n\n                    if (navbarCommand.splitOpened) {\n                        this._currentSplitNavItem = navbarCommand;\n                    }\n\n                    this._fireEvent(NavBarContainer._EventName.splitToggle, {\n                        opened: navbarCommand.splitOpened,\n                        index: index,\n                        navbarCommand: navbarCommand,\n                        data: this._repeater ? this._repeater.data.getAt(index) : null\n                    });\n                },\n\n                _fireEvent: function NavBarContainer_fireEvent(type, detail) {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, true, false, detail);\n                    this.element.dispatchEvent(event);\n                },\n\n                _writeProfilerMark: function NavBarContainer_writeProfilerMark(text) {\n                    var message = \"WinJS.UI.NavBarContainer:\" + this._id + \":\" + text;\n                    _WriteProfilerMark(message);\n                    _Log.log && _Log.log(message, null, \"navbarcontainerprofiler\");\n                },\n\n                dispose: function NavBarContainer_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.NavBarContainer.dispose\">\n                    /// <summary locid=\"WinJS.UI.NavBarContainer.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._disposed = true;\n\n                    if (this._appBarEl) {\n                        this._appBarEl.removeEventListener('beforeopen', this._closeSplitAndResetBound);\n                        this._appBarEl.removeEventListener('beforeopen', this._resizeImplBound);\n                    }\n\n                    Navigation.removeEventListener('navigated', this._closeSplitAndResetBound);\n\n                    this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel();\n                    this._leftArrowFadeOut && this._leftArrowFadeOut.cancel();\n                    this._leftArrowFadeIn && this._leftArrowFadeIn.cancel();\n                    this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel();\n                    this._rightArrowFadeOut && this._rightArrowFadeOut.cancel();\n                    this._rightArrowFadeIn && this._rightArrowFadeIn.cancel();\n\n                    _ElementUtilities._resizeNotifier.unsubscribe(this._element, this._boundResizeHandler);\n\n                    this._removeDataChangingEvents();\n                    this._removeDataChangedEvents();\n                }\n            }, {\n                // Names of classes used by the NavBarContainer.\n                _ClassName: {\n                    navbarcontainer: \"win-navbarcontainer\",\n                    pageindicators: \"win-navbarcontainer-pageindicator-box\",\n                    indicator: \"win-navbarcontainer-pageindicator\",\n                    currentindicator: \"win-navbarcontainer-pageindicator-current\",\n                    vertical: \"win-navbarcontainer-vertical\",\n                    horizontal: \"win-navbarcontainer-horizontal\",\n                    viewport: \"win-navbarcontainer-viewport\",\n                    surface: \"win-navbarcontainer-surface\",\n                    navarrow: \"win-navbarcontainer-navarrow\",\n                    navleftarrow: \"win-navbarcontainer-navleft\",\n                    navrightarrow: \"win-navbarcontainer-navright\"\n                },\n                _EventName: {\n                    invoked: eventNames.invoked,\n                    splitToggle: eventNames.splittoggle\n                }\n            });\n            _Base.Class.mix(NavBarContainer, _Control.DOMEventMixin);\n            return NavBarContainer;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-navbar',[],function(){});\n\ndefine('require-style!less/colors-navbar',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/NavBar',[\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_Events',\n    '../Core/_WriteProfilerMark',\n    '../Promise',\n    '../Scheduler',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    \"../_Accents\",\n    './_LegacyAppBar',\n    './NavBar/_Command',\n    './NavBar/_Container',\n    'require-style!less/styles-navbar',\n    'require-style!less/colors-navbar'\n], function NavBarInit(_Global,_WinRT, _Base, _BaseUtils, _Events, _WriteProfilerMark, Promise, Scheduler, _ElementUtilities, _Hoverable, _Accents, _LegacyAppBar, _Command, _Container) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\"html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectHover }]);\n    _Accents.createAccentRule(\"html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover.win-pressed\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectPress }]);\n    _Accents.createAccentRule(\".win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectRest }]);\n    _Accents.createAccentRule(\".win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened.win-pressed\", [{ name: \"background-color\", value: _Accents.ColorTypes.listSelectPress }]);\n\n    var customLayout = \"custom\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.NavBar\">\n        /// Displays navigation commands in a toolbar that the user can open or close.\n        /// </summary>\n        /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.navbar.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.navbar.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.NavBar\">\n        /// <div data-win-control=\"WinJS.UI.NavBarContainer\">\n        /// <div data-win-control=\"WinJS.UI.NavBarCommand\" data-win-options=\"{location:'/pages/home/home.html',label:'Home',icon:WinJS.UI.AppBarIcon.home}\"></div>\n        /// </div>\n        /// </div>]]></htmlSnippet>\n        /// <event name=\"beforeopen\" locid=\"WinJS.UI.NavBar_e:beforeopen\">Raised just before opening the NavBar.</event>\n        /// <event name=\"afteropen\" locid=\"WinJS.UI.NavBar_e:afteropen\">Raised immediately after an NavBar is fully opened.</event>\n        /// <event name=\"beforeclose\" locid=\"WinJS.UI.NavBar_e:beforeclose\">Raised just before closing the  NavBar.</event>\n        /// <event name=\"afterclose\" locid=\"WinJS.UI.NavBar_e:afterclose\">Raised immediately after the NavBar is fully closed.</event>\n        /// <event name=\"childrenprocessed\" locid=\"WinJS.UI.NavBar_e:childrenprocessed\">Fired when children of NavBar control have been processed from a WinJS.UI.processAll call.</event>\n        /// <part name=\"navbar\" class=\"win-navbar\" locid=\"WinJS.UI.NavBar_part:navbar\">Styles the entire NavBar.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        NavBar: _Base.Namespace._lazy(function () {\n            var childrenProcessedEventName = \"childrenprocessed\";\n            var createEvent = _Events._createEventProperty;\n\n            var NavBar = _Base.Class.derive(_LegacyAppBar._LegacyAppBar, function NavBar_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.NavBar.NavBar\">\n                /// <summary locid=\"WinJS.UI.NavBar.constructor\">\n                /// Creates a new NavBar.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.NavBar.constructor_p:element\">\n                /// The DOM element that will host the new NavBar control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.NavBar.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds to one of the control's\n                /// properties or events.\n                /// </param>\n                /// <returns type=\"WinJS.UI.NavBar\" locid=\"WinJS.UI.NavBar.constructor_returnValue\">\n                /// The new NavBar control.\n                /// </returns>\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </signature>\n\n                options = options || {};\n\n                // Shallow copy object so we can modify it.\n                options = _BaseUtils._shallowCopy(options);\n\n                // Default to Placement = Top and Layout = Custom\n                options.placement = options.placement || \"top\";\n                options.layout = customLayout;\n                options.closedDisplayMode = options.closedDisplayMode || \"minimal\";\n\n                _LegacyAppBar._LegacyAppBar.call(this, element, options);\n\n                this._element.addEventListener(\"beforeopen\", this._handleBeforeShow.bind(this));\n\n                _ElementUtilities.addClass(this.element, NavBar._ClassName.navbar);\n\n                if (_WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {\n                    this._processChildren();\n                } else {\n                    Scheduler.schedule(this._processChildren.bind(this), Scheduler.Priority.idle, null, \"WinJS.UI.NavBar.processChildren\");\n                }\n            }, {\n\n                // Restrict values of closedDisplayMode to 'none' or 'minimal'\n\n                /// <field type=\"String\" defaultValue=\"minimal\" locid=\"WinJS.UI.NavBar.closedDisplayMode\" helpKeyword=\"WinJS.UI.NavBar.closedDisplayMode\" isAdvanced=\"true\">\n                /// Gets/Sets how NavBar will display itself while hidden. Values are \"none\" and \"minimal\".\n                /// </field>\n                closedDisplayMode: {\n                    get: function () {\n                        return this._closedDisplayMode;\n                    },\n                    set: function (value) {\n                        var newValue = (value  === \"none\" ? \"none\" : \"minimal\");\n                        Object.getOwnPropertyDescriptor(_LegacyAppBar._LegacyAppBar.prototype, \"closedDisplayMode\").set.call(this, newValue);\n                        this._closedDisplayMode = newValue;\n                    },\n                },\n\n                /// <field type=\"Function\" locid=\"WinJS.UI.NavBar.onchildrenprocessed\" helpKeyword=\"WinJS.UI.NavBar.onchildrenprocessed\">\n                /// Raised when children of NavBar control have been processed by a WinJS.UI.processAll call.\n                /// <compatibleWith platform=\"Windows\" minVersion=\"8.1\"/>\n                /// </field>\n                onchildrenprocessed: createEvent(childrenProcessedEventName),\n\n                _processChildren: function NavBar_processChildren() {\n                    // The NavBar control schedules processAll on its children at idle priority to avoid hurting startup\n                    // performance. If the NavBar is shown before the scheduler gets to the idle job, the NavBar will\n                    // immediately call processAll on its children. If your app needs the children to be processed before\n                    // the scheduled job executes, you may call processChildren to force the processAll call.\n                    if (!this._processed) {\n                        this._processed = true;\n\n                        this._writeProfilerMark(\"processChildren,StartTM\");\n                        var that = this;\n                        var processed = Promise.as();\n                        if (this._processors) {\n                            this._processors.forEach(function (processAll) {\n                                for (var i = 0, len = that.element.children.length; i < len; i++) {\n                                    (function (child) {\n                                        processed = processed.then(function () {\n                                            processAll(child);\n                                        });\n                                    }(that.element.children[i]));\n                                }\n                            });\n                        }\n                        return processed.then(\n                            function () {\n                                that._writeProfilerMark(\"processChildren,StopTM\");\n                                that._fireEvent(NavBar._EventName.childrenProcessed);\n                            },\n                            function () {\n                                that._writeProfilerMark(\"processChildren,StopTM\");\n                                that._fireEvent(NavBar._EventName.childrenProcessed);\n                            }\n                        );\n                    }\n                    return Promise.wrap();\n                },\n\n                _show: function NavBar_show() {\n                    // Override _show to call processChildren first.\n                    //\n                    if (this.disabled) {\n                        return;\n                    }\n                    var that = this;\n                    this._processChildren().then(function () {\n                        _LegacyAppBar._LegacyAppBar.prototype._show.call(that);\n                    });\n                },\n\n                _handleBeforeShow: function NavBar_handleBeforeShow() {\n                    // Navbar needs to ensure its elements to have their correct height and width after _LegacyAppBar changes display=\"none\"\n                    // to  display=\"\" and _LegacyAppBar needs the elements to have their final height before it measures its own element height\n                    // to do the slide in animation over the correct amount of pixels.\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    var navbarcontainerEls = this.element.querySelectorAll('.win-navbarcontainer');\n                    for (var i = 0; i < navbarcontainerEls.length; i++) {\n                        navbarcontainerEls[i].winControl.forceLayout();\n                    }\n                },\n\n                _fireEvent: function NavBar_fireEvent(type, detail) {\n                    var event = _Global.document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, true, false, detail || {});\n                    this.element.dispatchEvent(event);\n                },\n\n                _writeProfilerMark: function NavBar_writeProfilerMark(text) {\n                    _WriteProfilerMark(\"WinJS.UI.NavBar:\" + this._id + \":\" + text);\n                }\n            }, {\n                _ClassName: {\n                    navbar: \"win-navbar\"\n                },\n                _EventName: {\n                    childrenProcessed: childrenProcessedEventName\n                },\n                isDeclarativeControlContainer: _BaseUtils.markSupportedForProcessing(function (navbar, callback) {\n                    if (navbar._processed) {\n                        for (var i = 0, len = navbar.element.children.length; i < len; i++) {\n                            callback(navbar.element.children[i]);\n                        }\n                    } else {\n                        navbar._processors = navbar._processors || [];\n                        navbar._processors.push(callback);\n                    }\n                })\n            });\n\n            return NavBar;\n        })\n    });\n\n});\n\ndefine('require-style!less/styles-viewbox',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n// ViewBox control\ndefine('WinJS/Controls/ViewBox',[\n    '../Core/_Global',\n    '../Core/_Base',\n    '../Core/_BaseUtils',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources',\n    '../Scheduler',\n    '../Utilities/_Control',\n    '../Utilities/_Dispose',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    'require-style!less/styles-viewbox'\n    ], function viewboxInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Resources, Scheduler, _Control, _Dispose, _ElementUtilities, _Hoverable) {\n    \"use strict\";\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.ViewBox\">\n        /// Scales a single child element to fill the available space without\n        /// resizing it. This control reacts to changes in the size of the container as well as\n        /// changes in size of the child element. For example, a media query may result in\n        /// a change in aspect ratio.\n        /// </summary>\n        /// </field>\n        /// <name locid=\"WinJS.UI.ViewBox_name\">View Box</name>\n        /// <icon src=\"ui_winjs.ui.viewbox.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.viewbox.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.ViewBox\"><div>ViewBox</div></div>]]></htmlSnippet>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        ViewBox: _Base.Namespace._lazy(function () {\n\n            var strings = {\n                get invalidViewBoxChildren() { return \"ViewBox expects to only have one child element\"; },\n            };\n\n            function onresize(control) {\n                if (control && !control._resizing) {\n                    control._resizing = control._resizing || 0;\n                    control._resizing++;\n                    try {\n                        control._updateLayout();\n                    } finally {\n                        control._resizing--;\n                    }\n                }\n            }\n\n            function onresizeBox(ev) {\n                if (ev.target) {\n                    onresize(ev.target.winControl);\n                }\n            }\n\n            function onresizeSizer(ev) {\n                if (ev.target) {\n                    onresize(ev.target.parentElement.winControl);\n                }\n            }\n\n            var ViewBox = _Base.Class.define(function ViewBox_ctor(element) {\n                /// <signature helpKeyword=\"WinJS.UI.ViewBox.ViewBox\">\n                /// <summary locid=\"WinJS.UI.ViewBox.constructor\">Initializes a new instance of the ViewBox control</summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" mayBeNull=\"true\" locid=\"WinJS.UI.ViewBox.constructor_p:element\">\n                /// The DOM element that functions as the scaling box. This element fills 100% of the width and height allotted to it.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" optional=\"true\" locid=\"WinJS.UI.ViewBox.constructor_p:options\">\n                /// The set of options to be applied initially to the ViewBox control.\n                /// </param>\n                /// <returns type=\"WinJS.UI.ViewBox\" locid=\"WinJS.UI.ViewBox.constructor_returnValue\">A constructed ViewBox control.</returns>\n                /// </signature>\n                this._disposed = false;\n\n                this._element = element || _Global.document.createElement(\"div\");\n                var box = this.element;\n                box.winControl = this;\n                _ElementUtilities.addClass(box, \"win-disposable\");\n                _ElementUtilities.addClass(box, \"win-viewbox\");\n                this.forceLayout();\n            }, {\n                _sizer: null,\n                _element: null,\n\n                /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.ViewBox.element\" helpKeyword=\"WinJS.UI.ViewBox.element\">\n                /// Gets the DOM element that functions as the scaling box.\n                /// </field>\n                element: {\n                    get: function () { return this._element; }\n                },\n\n                _rtl: {\n                    get: function () {\n                        return _Global.getComputedStyle(this.element).direction === \"rtl\";\n                    }\n                },\n\n                _initialize: function () {\n                    var box = this.element;\n                    if (box.firstElementChild !== this._sizer) {\n                        if (_BaseUtils.validation) {\n                            if (box.childElementCount !== 1) {\n                                throw new _ErrorFromName(\"WinJS.UI.ViewBox.InvalidChildren\", strings.invalidViewBoxChildren);\n                            }\n                        }\n                        if (this._sizer) {\n                            this._sizer.onresize = null;\n                        }\n                        var sizer = box.firstElementChild;\n                        this._sizer = sizer;\n                        if (sizer) {\n                            _ElementUtilities._resizeNotifier.subscribe(box, onresizeBox);\n                            box.addEventListener(\"mselementresize\", onresizeBox);\n                            _ElementUtilities._resizeNotifier.subscribe(sizer, onresizeSizer);\n                            sizer.addEventListener(\"mselementresize\", onresizeSizer);\n                        }\n                        if (box.clientWidth === 0 && box.clientHeight === 0) {\n                            var that = this;\n                            // Wait for the viewbox to get added to the DOM. It should be added\n                            // in the synchronous block in which _initialize was called.\n                            Scheduler.schedule(function ViewBox_async_initialize() {\n                                that._updateLayout();\n                            }, Scheduler.Priority.normal, null, \"WinJS.UI.ViewBox._updateLayout\");\n                        }\n                    }\n                },\n                _updateLayout: function () {\n                    var sizer = this._sizer;\n                    if (sizer) {\n                        var box = this.element;\n                        var w = sizer.clientWidth;\n                        var h = sizer.clientHeight;\n                        var bw = box.clientWidth;\n                        var bh = box.clientHeight;\n                        var wRatio = bw / w;\n                        var hRatio = bh / h;\n                        var mRatio = Math.min(wRatio, hRatio);\n                        var transX = Math.abs(bw - (w * mRatio)) / 2;\n                        var transY = Math.abs(bh - (h * mRatio)) / 2;\n                        var rtl = this._rtl;\n                        this._sizer.style[_BaseUtils._browserStyleEquivalents[\"transform\"].scriptName] = \"translate(\" + (rtl ? \"-\" : \"\") + transX + \"px,\" + transY + \"px) scale(\" + mRatio + \")\";\n                        this._sizer.style[_BaseUtils._browserStyleEquivalents[\"transform-origin\"].scriptName] = rtl ? \"top right\" : \"top left\";\n                    }\n                },\n\n                dispose: function () {\n                    /// <signature helpKeyword=\"WinJS.UI.ViewBox.dispose\">\n                    /// <summary locid=\"WinJS.UI.ViewBox.dispose\">\n                    /// Disposes this ViewBox.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    if (this.element) {\n                        _ElementUtilities._resizeNotifier.unsubscribe(this.element, onresizeBox);\n                    }\n                    if (this._sizer) {\n                        _ElementUtilities._resizeNotifier.unsubscribe(this._sizer, onresizeSizer);\n                    }\n\n                    this._disposed = true;\n                    _Dispose.disposeSubTree(this._element);\n                },\n\n                forceLayout: function () {\n                    this._initialize();\n                    this._updateLayout();\n                }\n            });\n            _Base.Class.mix(ViewBox, _Control.DOMEventMixin);\n            return ViewBox;\n        })\n    });\n\n});\n\n\ndefine('require-style!less/styles-contentdialog',[],function(){});\n\ndefine('require-style!less/colors-contentdialog',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('WinJS/Controls/ContentDialog',[\n    '../Application',\n    '../Utilities/_Dispose',\n    '../_Accents',\n    '../Promise',\n    '../_Signal',\n    '../_LightDismissService',\n    '../Core/_BaseUtils',\n    '../Core/_Global',\n    '../Core/_WinRT',\n    '../Core/_Base',\n    '../Core/_Events',\n    '../Core/_ErrorFromName',\n    '../Core/_Resources',\n    '../Utilities/_Control',\n    '../Utilities/_ElementUtilities',\n    '../Utilities/_Hoverable',\n    '../Animations',\n    'require-style!less/styles-contentdialog',\n    'require-style!less/colors-contentdialog'\n], function contentDialogInit(Application, _Dispose, _Accents, Promise, _Signal, _LightDismissService, _BaseUtils, _Global, _WinRT, _Base, _Events, _ErrorFromName, _Resources, _Control, _ElementUtilities, _Hoverable, _Animations) {\n    \"use strict\";\n\n    _Accents.createAccentRule(\".win-contentdialog-dialog\", [{ name: \"outline-color\", value: _Accents.ColorTypes.accent }]);\n\n    _Base.Namespace.define(\"WinJS.UI\", {\n        /// <field>\n        /// <summary locid=\"WinJS.UI.ContentDialog\">\n        /// Displays a modal dialog which can display arbitrary HTML content.\n        /// </summary>\n        /// </field>\n        /// <icon src=\"ui_winjs.ui.contentdialog.12x12.png\" width=\"12\" height=\"12\" />\n        /// <icon src=\"ui_winjs.ui.contentdialog.16x16.png\" width=\"16\" height=\"16\" />\n        /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.ContentDialog\"></div>]]></htmlSnippet>\n        /// <event name=\"beforeshow\" locid=\"WinJS.UI.ContentDialog_e:beforeshow\">Raised just before showing a dialog. Call preventDefault on this event to stop the dialog from being shown.</event>\n        /// <event name=\"aftershow\" locid=\"WinJS.UI.ContentDialog_e:aftershow\">Raised immediately after a dialog is fully shown.</event>\n        /// <event name=\"beforehide\" locid=\"WinJS.UI.ContentDialog_e:beforehide\">Raised just before hiding a dialog. Call preventDefault on this event to stop the dialog from being hidden.</event>\n        /// <event name=\"afterhide\" locid=\"WinJS.UI.ContentDialog_e:afterhide\">Raised immediately after a dialog is fully hidden.</event>\n        /// <part name=\"contentdialog\" class=\"win-contentdialog\" locid=\"WinJS.UI.ContentDialog_part:contentdialog\">The entire ContentDialog control.</part>\n        /// <part name=\"contentdialog-backgroundoverlay\" class=\"win-contentdialog-backgroundoverlay\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-backgroundoverlay\">The full screen element which dims the content that is behind the dialog.</part>\n        /// <part name=\"contentdialog-dialog\" class=\"win-contentdialog-dialog\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-dialog\">The main element of the dialog which holds the dialog's title, content, and commands.</part>\n        /// <part name=\"contentdialog-title\" class=\"win-contentdialog-title\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-title\">The element which displays the dialog's title.</part>\n        /// <part name=\"contentdialog-content\" class=\"win-contentdialog-content\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-content\">The element which contains the dialog's custom content.</part>\n        /// <part name=\"contentdialog-commands\" class=\"win-contentdialog-commands\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-commands\">The element which contains the dialog's primary and secondary commands.</part>\n        /// <part name=\"contentdialog-primarycommand\" class=\"win-contentdialog-primarycommand\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-primarycommand\">The dialog's primary button.</part>\n        /// <part name=\"contentdialog-secondarycommand\" class=\"win-contentdialog-secondarycommand\" locid=\"WinJS.UI.ContentDialog_part:contentdialog-secondarycommand\">The dialog's secondary button.</part>\n        /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n        /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n        ContentDialog: _Base.Namespace._lazy(function () {\n            var Strings = {\n                get duplicateConstruction() { return \"Invalid argument: Controls may only be instantiated one time for each DOM element\"; },\n                get controlDisposed() { return \"Cannot interact with the control after it has been disposed\"; },\n                get contentDialogAlreadyShowing() { return \"Cannot show a ContentDialog if there is already a ContentDialog that is showing\"; }\n            };\n            var DismissalResult = {\n                /// <field locid=\"WinJS.UI.ContentDialog.DismissalResult.none\" helpKeyword=\"WinJS.UI.ContentDialog.DismissalResult.none\">\n                /// The dialog was dismissed without the user selecting any of the commands. The user may have\n                /// dismissed the dialog by hitting the escape key or pressing the hardware back button.\n                /// </field>\n                none: \"none\",\n                /// <field locid=\"WinJS.UI.ContentDialog.DismissalResult.primary\" helpKeyword=\"WinJS.UI.ContentDialog.DismissalResult.primary\">\n                /// The user dismissed the dialog by pressing the primary command.\n                /// </field>\n                primary: \"primary\",\n                /// <field locid=\"WinJS.UI.ContentDialog.DismissalResult.secondary\" helpKeyword=\"WinJS.UI.ContentDialog.DismissalResult.secondary\">\n                /// The user dismissed the dialog by pressing the secondary command.\n                /// </field>\n                secondary: \"secondary\"\n            };\n            var ClassNames = {\n                contentDialog: \"win-contentdialog\",\n                backgroundOverlay: \"win-contentdialog-backgroundoverlay\",\n                dialog: \"win-contentdialog-dialog\",\n                title: \"win-contentdialog-title\",\n                content: \"win-contentdialog-content\",\n                commands: \"win-contentdialog-commands\",\n                primaryCommand: \"win-contentdialog-primarycommand\",\n                secondaryCommand: \"win-contentdialog-secondarycommand\",\n\n                _verticalAlignment: \"win-contentdialog-verticalalignment\",\n                _scroller: \"win-contentdialog-scroller\",\n                _column0or1: \"win-contentdialog-column0or1\",\n                _visible: \"win-contentdialog-visible\",\n                _tabStop: \"win-contentdialog-tabstop\",\n                _commandSpacer: \"win-contentdialog-commandspacer\"\n            };\n            var EventNames = {\n                beforeShow: \"beforeshow\",\n                afterShow: \"aftershow\",\n                beforeHide: \"beforehide\",\n                afterHide: \"afterhide\",\n            };\n            var minContentHeightWithInputPane = 96;\n\n            // WinJS animation promises always complete successfully. This\n            // helper allows an animation promise to complete in the canceled state\n            // so that the success handler can be skipped when the animation is\n            // interrupted.\n            function cancelablePromise(animationPromise) {\n                return Promise._cancelBlocker(animationPromise, function () {\n                    animationPromise.cancel();\n                });\n            }\n\n            function onInputPaneShown(eventObject) {\n                /*jshint validthis: true */\n                eventObject.ensuredFocusedElementInView = true;\n                this.dialog._renderForInputPane(eventObject.occludedRect.height);\n            }\n\n            function onInputPaneHidden() {\n                /*jshint validthis: true */\n                this.dialog._clearInputPaneRendering();\n            }\n\n            // Noop function, used in the various states to indicate that they don't support a given\n            // message. Named with the somewhat cute name '_' because it reads really well in the states.\n\n            function _() { }\n\n            // Implementing the control as a state machine helps us correctly handle:\n            //   - re-entrancy while firing events\n            //   - calls into the control during asynchronous operations (e.g. animations)\n            //\n            // Many of the states do their \"enter\" work within a promise chain. The idea is that if\n            // the state is interrupted and exits, the rest of its work can be skipped by canceling\n            // the promise chain.\n            // An interesting detail is that anytime the state may call into app code (e.g. due to\n            // firing an event), the current promise must end and a new promise must be chained off of it.\n            // This is necessary because the app code may interact with the ContentDialog and cause it to\n            // change states. If we didn't create a new promise, then the very next line of code that runs\n            // after calling into app code may not be valid because the state may have exited. Starting a\n            // new promise after each call into app code prevents us from having to worry about this\n            // problem. In this configuration, when a promise's success handler runs, it guarantees that\n            // the state hasn't exited.\n            // For similar reasons, each of the promise chains created in \"enter\" starts off with a _Signal\n            // which is completed at the end of the \"enter\" function (this boilerplate is abstracted away by\n            // the \"interruptible\" function). The reason is that we don't want any of the code in \"enter\"\n            // to run until the promise chain has been stored in a variable. If we didn't do this (e.g. instead,\n            // started the promise chain with Promise.wrap()), then the \"enter\" code could trigger the \"exit\"\n            // function (via app code) before the promise chain had been stored in a variable. Under these\n            // circumstances, the promise chain would be uncancelable and so the \"enter\" work would be\n            // unskippable. This wouldn't be good when we needed the state to exit early.\n\n            // These two functions manage interruptible work promises (one creates them the other cancels\n            // them). They communicate with each other thru the _interruptibleWorkPromises property which\n            //  \"interruptible\" creates on your object.\n\n            function interruptible(object, workFn) {\n                object._interruptibleWorkPromises = object._interruptibleWorkPromises || [];\n                var workStoredSignal = new _Signal();\n                object._interruptibleWorkPromises.push(workFn(object, workStoredSignal.promise));\n                workStoredSignal.complete();\n            }\n\n            function cancelInterruptibles() {\n                /*jshint validthis: true */\n                (this._interruptibleWorkPromises || []).forEach(function (workPromise) {\n                    workPromise.cancel();\n                });\n            }\n\n            // Transitions:\n            //   When created, the control will take the following initialization transition:\n            //     Init -> Hidden\n            //   Following that, the life of the dialog will be dominated by the following 3\n            //   sequences of transitions. In geneneral, these sequences are uninterruptible.\n            //     Hidden -> BeforeShow -> Hidden (when preventDefault is called on beforeshow event)\n            //     Hidden -> BeforeShow -> Showing -> Shown\n            //     Shown -> BeforeHide -> Hiding -> Hidden\n            //     Shown -> BeforeHide -> Shown (when preventDefault is called on beforehide event)\n            //   However, any state can be interrupted to go to the Disposed state:\n            //     * -> Disposed\n            //\n            // interface IContentDialogState {\n            //     // Debugging\n            //     name: string;\n            //     // State lifecycle\n            //     enter(arg0);\n            //     exit();\n            //     // ContentDialog's public API surface\n            //     hidden: boolean;\n            //     show();\n            //     hide(dismissalResult);\n            //     // Events\n            //     onCommandClicked(dismissalResult);\n            //     onInputPaneShown(eventObject);\n            //     onInputPaneHidden();\n            //     // Provided by _setState for use within the state\n            //     dialog: WinJS.UI.ContentDialog;\n            // }\n\n            var States = {\n                // Initial state. Initializes state on the dialog shared by the various states.\n                Init: _Base.Class.define(null, {\n                    name: \"Init\",\n                    hidden: true,\n                    enter: function ContentDialog_InitState_enter() {\n                        var dialog = this.dialog;\n                        dialog._dismissable = new _LightDismissService.ModalElement({\n                            element: dialog._dom.root,\n                            tabIndex: dialog._dom.root.hasAttribute(\"tabIndex\") ? dialog._dom.root.tabIndex : -1,\n                            onLightDismiss: function () {\n                                dialog.hide(DismissalResult.none);\n                            },\n                            onTakeFocus: function (useSetActive) {\n                                dialog._dismissable.restoreFocus() ||\n                                    _ElementUtilities._focusFirstFocusableElement(dialog._dom.content) ||\n                                    _ElementUtilities._tryFocusOnAnyElement(dialog._dom.dialog, useSetActive);\n                            }\n                        });\n                        this.dialog._dismissedSignal = null; // The signal will be created on demand when show() is called\n                        this.dialog._setState(States.Hidden, false);\n                    },\n                    exit: _,\n                    show: function ContentDialog_InitState_show() {\n                        throw \"It's illegal to call show on the Init state\";\n                    },\n                    hide: _,\n                    onCommandClicked: _,\n                    onInputPaneShown: _,\n                    onInputPaneHidden: _\n                }),\n                // A rest state. The dialog is hidden and is waiting for the app to call show.\n                Hidden: _Base.Class.define(null, {\n                    name: \"Hidden\",\n                    hidden: true,\n                    enter: function ContentDialog_HiddenState_enter(showIsPending) {\n                        if (showIsPending) {\n                            this.show();\n                        }\n                    },\n                    exit: _,\n                    show: function ContentDialog_HiddenState_show() {\n                        var dismissedSignal = this.dialog._dismissedSignal = new _Signal(); // save the signal in case it changes when switching states\n                        this.dialog._setState(States.BeforeShow);\n                        return dismissedSignal.promise;\n                    },\n                    hide: _,\n                    onCommandClicked: _,\n                    onInputPaneShown: _,\n                    onInputPaneHidden: _\n                }),\n                // An event state. The dialog fires the beforeshow event.\n                BeforeShow: _Base.Class.define(null, {\n                    name: \"BeforeShow\",\n                    hidden: true,\n                    enter: function ContentDialog_BeforeShowState_enter() {\n                        interruptible(this, function (that, ready) {\n                            return ready.then(function () {\n                                return that.dialog._fireBeforeShow(); // Give opportunity for chain to be canceled when calling into app code\n                            }).then(function (shouldShow) {\n                                if (!shouldShow) {\n                                    that.dialog._cancelDismissalPromise(null); // Give opportunity for chain to be canceled when calling into app code\n                                }\n                                return shouldShow;\n                            }).then(function (shouldShow) {\n                                if (shouldShow) {\n                                    that.dialog._setState(States.Showing);\n                                } else {\n                                    that.dialog._setState(States.Hidden, false);\n                                }\n                            });\n                        });\n                    },\n                    exit: cancelInterruptibles,\n                    show: function ContentDialog_BeforeShowState_show() {\n                        return Promise.wrapError(new _ErrorFromName(\"WinJS.UI.ContentDialog.ContentDialogAlreadyShowing\", Strings.contentDialogAlreadyShowing));\n                    },\n                    hide: _,\n                    onCommandClicked: _,\n                    onInputPaneShown: _,\n                    onInputPaneHidden: _\n                }),\n                // An animation/event state. The dialog plays its entrance animation and fires aftershow.\n                Showing: _Base.Class.define(null, {\n                    name: \"Showing\",\n                    hidden: {\n                        get: function ContentDialog_ShowingState_hidden_get() {\n                            return !!this._pendingHide;\n                        }\n                    },\n                    enter: function ContentDialog_ShowingState_enter() {\n                        interruptible(this, function (that, ready) {\n                            return ready.then(function () {\n                                that._pendingHide = null;\n                                _ElementUtilities.addClass(that.dialog._dom.root, ClassNames._visible);\n                                that.dialog._addExternalListeners();\n                                if (_WinRT.Windows.UI.ViewManagement.InputPane) {\n                                    var inputPaneHeight = _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height;\n                                    if (inputPaneHeight > 0) {\n                                        that.dialog._renderForInputPane(inputPaneHeight);\n                                    }\n                                }\n                                _LightDismissService.shown(that.dialog._dismissable);\n                                return that.dialog._playEntranceAnimation();\n                            }).then(function () {\n                                that.dialog._fireEvent(EventNames.afterShow); // Give opportunity for chain to be canceled when calling into app code\n                            }).then(function () {\n                                that.dialog._setState(States.Shown, that._pendingHide);\n                            });\n                        });\n                    },\n                    exit: cancelInterruptibles,\n                    show: function ContentDialog_ShowingState_show() {\n                        if (this._pendingHide) {\n                            var dismissalResult = this._pendingHide.dismissalResult;\n                            this._pendingHide = null;\n                            return this.dialog._resetDismissalPromise(dismissalResult, new _Signal()).promise;\n                        } else {\n                            return Promise.wrapError(new _ErrorFromName(\"WinJS.UI.ContentDialog.ContentDialogAlreadyShowing\", Strings.contentDialogAlreadyShowing));\n                        }\n                    },\n                    hide: function ContentDialog_ShowingState_hide(dismissalResult) {\n                        this._pendingHide = { dismissalResult: dismissalResult };\n                    },\n                    onCommandClicked: _,\n                    onInputPaneShown: onInputPaneShown,\n                    onInputPaneHidden: onInputPaneHidden\n                }),\n                // A rest state. The dialog is shown and is waiting for the user or the app to trigger hide.\n                Shown: _Base.Class.define(null, {\n                    name: \"Shown\",\n                    hidden: false,\n                    enter: function ContentDialog_ShownState_enter(pendingHide) {\n                         if (pendingHide) {\n                             this.hide(pendingHide.dismissalResult);\n                         }\n                    },\n                    exit: _,\n                    show: function ContentDialog_ShownState_show() {\n                        return Promise.wrapError(new _ErrorFromName(\"WinJS.UI.ContentDialog.ContentDialogAlreadyShowing\", Strings.contentDialogAlreadyShowing));\n                    },\n                    hide: function ContentDialog_ShownState_hide(dismissalResult) {\n                        this.dialog._setState(States.BeforeHide, dismissalResult);\n                    },\n                    onCommandClicked: function ContentDialog_ShownState_onCommandClicked(dismissalResult) {\n                        this.hide(dismissalResult);\n                    },\n                    onInputPaneShown: onInputPaneShown,\n                    onInputPaneHidden: onInputPaneHidden\n                }),\n                // An event state. The dialog fires the beforehide event.\n                BeforeHide: _Base.Class.define(null, {\n                    name: \"BeforeHide\",\n                    hidden: false,\n                    enter: function ContentDialog_BeforeHideState_enter(dismissalResult) {\n                        interruptible(this, function (that, ready) {\n                            return ready.then(function () {\n                                return that.dialog._fireBeforeHide(dismissalResult); // Give opportunity for chain to be canceled when calling into app code\n                            }).then(function (shouldHide) {\n                                if (shouldHide) {\n                                    that.dialog._setState(States.Hiding, dismissalResult);\n                                } else {\n                                    that.dialog._setState(States.Shown, null);\n                                }\n                            });\n                        });\n                    },\n                    exit: cancelInterruptibles,\n                    show: function ContentDialog_BeforeHideState_show() {\n                        return Promise.wrapError(new _ErrorFromName(\"WinJS.UI.ContentDialog.ContentDialogAlreadyShowing\", Strings.contentDialogAlreadyShowing));\n                    },\n                    hide: _,\n                    onCommandClicked: _,\n                    onInputPaneShown: onInputPaneShown,\n                    onInputPaneHidden: onInputPaneHidden\n                }),\n                // An animation/event state. The dialog plays the exit animation and fires the afterhide event.\n                Hiding: _Base.Class.define(null, {\n                    name: \"Hiding\",\n                    hidden: {\n                        get: function ContentDialog_HidingState_hidden_get() {\n                            return !this._showIsPending;\n                        }\n                    },\n                    enter: function ContentDialog_HidingState_enter(dismissalResult) {\n                        interruptible(this, function (that, ready) {\n                            return ready.then(function () {\n                                that._showIsPending = false;\n                                that.dialog._resetDismissalPromise(dismissalResult, null); // Give opportunity for chain to be canceled when calling into app code\n                            }).then(function () {\n                                return that.dialog._playExitAnimation();\n                            }).then(function () {\n                                that.dialog._removeExternalListeners();\n                                _LightDismissService.hidden(that.dialog._dismissable);\n                                _ElementUtilities.removeClass(that.dialog._dom.root, ClassNames._visible);\n                                that.dialog._clearInputPaneRendering();\n                                that.dialog._fireAfterHide(dismissalResult); // Give opportunity for chain to be canceled when calling into app code\n                            }).then(function () {\n                                that.dialog._setState(States.Hidden, that._showIsPending);\n                            });\n                        });\n                    },\n                    exit: cancelInterruptibles,\n                    show: function ContentDialog_HidingState_show() {\n                        if (this._showIsPending) {\n                            return Promise.wrapError(new _ErrorFromName(\"WinJS.UI.ContentDialog.ContentDialogAlreadyShowing\", Strings.contentDialogAlreadyShowing));\n                        } else {\n                            this._showIsPending = true;\n                            this.dialog._dismissedSignal = new _Signal();\n                            return this.dialog._dismissedSignal.promise;\n                        }\n                    },\n                    hide: function ContentDialog_HidingState_hide(dismissalResult) {\n                        if (this._showIsPending) {\n                            this._showIsPending = false;\n                            this.dialog._resetDismissalPromise(dismissalResult, null);\n                        }\n                    },\n                    onCommandClicked: _,\n                    onInputPaneShown: _,\n                    onInputPaneHidden: _\n                }),\n                Disposed: _Base.Class.define(null, {\n                    name: \"Disposed\",\n                    hidden: true,\n                    enter: function ContentDialog_DisposedState_enter() {\n                        _LightDismissService.hidden(this.dialog._dismissable);\n                        this.dialog._removeExternalListeners();\n                        if (this.dialog._dismissedSignal) {\n                            this.dialog._dismissedSignal.error(new _ErrorFromName(\"WinJS.UI.ContentDialog.ControlDisposed\", Strings.controlDisposed));\n                        }\n                    },\n                    exit: _,\n                    show: function ContentDialog_DisposedState_show() {\n                        return Promise.wrapError(new _ErrorFromName(\"WinJS.UI.ContentDialog.ControlDisposed\", Strings.controlDisposed));\n                    },\n                    hide: _,\n                    onCommandClicked: _,\n                    onInputPaneShown: _,\n                    onInputPaneHidden: _\n                }),\n            };\n\n            var ContentDialog = _Base.Class.define(function ContentDialog_ctor(element, options) {\n                /// <signature helpKeyword=\"WinJS.UI.ContentDialog.ContentDialog\">\n                /// <summary locid=\"WinJS.UI.ContentDialog.constructor\">\n                /// Creates a new ContentDialog control.\n                /// </summary>\n                /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.ContentDialog.constructor_p:element\">\n                /// The DOM element that hosts the ContentDialog control.\n                /// </param>\n                /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.ContentDialog.constructor_p:options\">\n                /// An object that contains one or more property/value pairs to apply to the new control.\n                /// Each property of the options object corresponds to one of the control's properties or events.\n                /// Event names must begin with \"on\". For example, to provide a handler for the beforehide event,\n                /// add a property named \"onbeforehide\" to the options object and set its value to the event handler.\n                /// </param>\n                /// <returns type=\"WinJS.UI.ContentDialog\" locid=\"WinJS.UI.ContentDialog.constructor_returnValue\">\n                /// The new ContentDialog.\n                /// </returns>\n                /// </signature>\n\n                // Check to make sure we weren't duplicated\n                if (element && element.winControl) {\n                    throw new _ErrorFromName(\"WinJS.UI.ContentDialog.DuplicateConstruction\", Strings.duplicateConstruction);\n                }\n                options = options || {};\n                \n                this._onInputPaneShownBound = this._onInputPaneShown.bind(this);\n                this._onInputPaneHiddenBound = this._onInputPaneHidden.bind(this);\n\n                this._disposed = false;\n                this._resizedForInputPane = false;\n                this._currentFocus = null;\n\n                this._initializeDom(element || _Global.document.createElement(\"div\"));\n                this._setState(States.Init);\n\n                this.title = \"\";\n                this.primaryCommandText = \"\";\n                this.primaryCommandDisabled = false;\n                this.secondaryCommandText = \"\";\n                this.secondaryCommandDisabled = false;\n\n                _Control.setOptions(this, options);\n            }, {\n                /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.ContentDialog.element\" helpKeyword=\"WinJS.UI.ContentDialog.element\">\n                /// Gets the DOM element that hosts the ContentDialog control.\n                /// </field>\n                element: {\n                    get: function ContentDialog_element_get() {\n                        return this._dom.root;\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.ContentDialog.title\" helpKeyword=\"WinJS.UI.ContentDialog.title\">\n                /// The text displayed as the title of the dialog.\n                /// </field>\n                title: {\n                    get: function ContentDialog_title_get() {\n                        return this._title;\n                    },\n                    set: function ContentDialog_title_set(value) {\n                        value = value || \"\";\n                        if (this._title !== value) {\n                            this._title = value;\n                            this._dom.title.textContent = value;\n                            this._dom.title.style.display = value ? \"\" : \"none\";\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.ContentDialog.primaryCommandText\" helpKeyword=\"WinJS.UI.ContentDialog.primaryCommandText\">\n                /// The text displayed on the primary command's button.\n                /// </field>\n                primaryCommandText: {\n                    get: function ContentDialog_primaryCommandText_get() {\n                        return this._primaryCommandText;\n                    },\n                    set: function ContentDialog_primaryCommandText_set(value) {\n                        value = value || \"\";\n                        if (this._primaryCommandText !== value) {\n                            this._primaryCommandText = value;\n                            this._dom.commands[0].textContent = value;\n                            this._updateCommandsUI();\n                        }\n                    }\n                },\n\n                /// <field type=\"String\" locid=\"WinJS.UI.ContentDialog.secondaryCommandText\" helpKeyword=\"WinJS.UI.ContentDialog.secondaryCommandText\">\n                /// The text displayed on the secondary command's button.\n                /// </field>\n                secondaryCommandText: {\n                    get: function ContentDialog_secondaryCommandText_get() {\n                        return this._secondaryCommandText;\n                    },\n                    set: function ContentDialog_secondaryCommandText_set(value) {\n                        value = value || \"\";\n                        if (this._secondaryCommandText !== value) {\n                            this._secondaryCommandText = value;\n                            this._dom.commands[1].textContent = value;\n                            this._updateCommandsUI();\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ContentDialog.primaryCommandDisabled\" helpKeyword=\"WinJS.UI.ContentDialog.primaryCommandDisabled\">\n                /// Indicates whether the button representing the primary command is currently disabled.\n                /// </field>\n                primaryCommandDisabled: {\n                    get: function ContentDialog_primaryCommandDisabled_get() {\n                        return this._primaryCommandDisabled;\n                    },\n                    set: function ContentDialog_primaryCommandDisabled_set(value) {\n                        value = !!value;\n                        if (this._primaryCommandDisabled !== value) {\n                            this._primaryCommandDisabled = value;\n                            this._dom.commands[0].disabled = value;\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" locid=\"WinJS.UI.ContentDialog.secondaryCommandDisabled\" helpKeyword=\"WinJS.UI.ContentDialog.secondaryCommandDisabled\">\n                /// Indicates whether the button representing the secondary command is currently disabled.\n                /// </field>\n                secondaryCommandDisabled: {\n                    get: function ContentDialog_secondaryCommandDisabled_get() {\n                        return this._secondaryCommandDisabled;\n                    },\n                    set: function ContentDialog_secondaryCommandDisabled_set(value) {\n                        value = !!value;\n                        if (this._secondaryCommandDisabled !== value) {\n                            this._secondaryCommandDisabled = value;\n                            this._dom.commands[1].disabled = value;\n                        }\n                    }\n                },\n\n                /// <field type=\"Boolean\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.ContentDialog.hidden\" helpKeyword=\"WinJS.UI.ContentDialog.hidden\">\n                /// Gets or sets ContentDialog's visibility.\n                /// </field>\n                hidden: {\n                    get: function ContentDialog_hidden_get() {\n                        return this._state.hidden;\n                    },\n                    set: function ContentDialog_hidden_set(hidden) {\n                        if (!hidden && this._state.hidden) {\n                            var nop = function () {\n                            };\n                            // Show returns a promise. If hidden is set while the ContentDialog is disposed, show will return a promise\n                            // error which will be impossible to handle and it'll cause the app to terminate. We'll eat the promise returned by show \n                            // to stop that from happening.\n                            this.show().done(nop, nop); \n                        } else if (hidden && !this._state.hidden) {\n                            this.hide(DismissalResult.none);\n                        }\n                    }\n                },\n\n                dispose: function ContentDialog_dispose() {\n                    /// <signature helpKeyword=\"WinJS.UI.ContentDialog.dispose\">\n                    /// <summary locid=\"WinJS.UI.ContentDialog.dispose\">\n                    /// Disposes this control.\n                    /// </summary>\n                    /// </signature>\n                    if (this._disposed) {\n                        return;\n                    }\n                    this._setState(States.Disposed);\n                    this._disposed = true;\n                    _Dispose._disposeElement(this._dom.content);\n                },\n\n                show: function ContentDialog_show() {\n                    /// <signature helpKeyword=\"WinJS.UI.ContentDialog.show\">\n                    /// <summary locid=\"WinJS.UI.ContentDialog.show\">\n                    /// Shows the ContentDialog. Only one ContentDialog may be shown at a time. If another\n                    /// ContentDialog is already shown, this ContentDialog will remain hidden.\n                    /// </summary>\n                    /// <returns type=\"WinJS.Promise\" locid=\"WinJS.UI.ContentDialog.show_returnValue\">\n                    /// A promise which is successfully fulfilled when the dialog is dismissed. The\n                    /// completion value indicates the dialog's dismissal result. This may\n                    /// be 'primary', 'secondary', 'none', or whatever custom value was passed to hide.\n                    /// If this ContentDialog cannot be shown because a ContentDialog is already showing\n                    /// or the ContentDialog is disposed, then the return value is a promise which is in\n                    /// an error state. If preventDefault() is called on the beforeshow event, then this\n                    /// promise will be canceled.\n                    /// </returns>\n                    /// </signature>\n                    return this._state.show();\n                },\n\n                hide: function ContentDialog_hide(result) {\n                    /// <signature helpKeyword=\"WinJS.UI.ContentDialog.hide\">\n                    /// <summary locid=\"WinJS.UI.ContentDialog.hide\">\n                    /// Hides the ContentDialog.\n                    /// </summary>\n                    /// <param name=\"result\" locid=\"WinJS.UI.ContentDialog.hide_p:result\">\n                    /// A value indicating why the dialog is being hidden. The promise returned\n                    /// by show will be fulfilled with this value.\n                    /// </param>\n                    /// </signature>\n                    this._state.hide(result === undefined ? DismissalResult.none : result);\n                },\n\n                _initializeDom: function ContentDialog_initializeDom(root) {\n                    // Reparent the children of the root element into the content element.\n                    var contentEl = _Global.document.createElement(\"div\");\n                    contentEl.className = ClassNames.content;\n                    _ElementUtilities._reparentChildren(root, contentEl);\n\n                    root.winControl = this;\n                    _ElementUtilities.addClass(root, ClassNames.contentDialog);\n                    _ElementUtilities.addClass(root, ClassNames._verticalAlignment);\n                    _ElementUtilities.addClass(root, \"win-disposable\");\n                    root.innerHTML =\n                        '<div class=\"' + ClassNames.backgroundOverlay + '\"></div>' +\n                        '<div class=\"' + ClassNames._tabStop + '\"></div>' +\n                        '<div tabindex=\"-1\" role=\"dialog\" class=\"' + ClassNames.dialog + '\">' +\n                            '<div class=\"' + ClassNames.title + '\"></div>' +\n                            '<div class=\"' + ClassNames._scroller + '\"></div>' +\n                            '<div class=\"' + ClassNames.commands + '\">' +\n                                '<button type=\"button\" class=\"' + ClassNames._commandSpacer + ' win-button\"></button>' +\n                                '<button type=\"button\" class=\"' + ClassNames.primaryCommand + ' win-button\"></button>' +\n                                '<button type=\"button\" class=\"' + ClassNames.secondaryCommand + ' win-button\"></button>' +\n                            '</div>' +\n                        '</div>' +\n                        '<div class=\"' + ClassNames._tabStop + '\"></div>' +\n                        '<div class=\"' + ClassNames._column0or1 + '\"></div>';\n\n                    var dom = {};\n                    dom.root = root;\n                    dom.backgroundOverlay = dom.root.firstElementChild;\n                    dom.startBodyTab = dom.backgroundOverlay.nextElementSibling;\n                    dom.dialog = dom.startBodyTab.nextElementSibling;\n                    dom.title = dom.dialog.firstElementChild;\n                    dom.scroller = dom.title.nextElementSibling;\n                    dom.commandContainer = dom.scroller.nextElementSibling;\n                    dom.commandSpacer = dom.commandContainer.firstElementChild;\n                    dom.commands = [];\n                    dom.commands.push(dom.commandSpacer.nextElementSibling);\n                    dom.commands.push(dom.commands[0].nextElementSibling);\n                    dom.endBodyTab = dom.dialog.nextElementSibling;\n                    dom.content = contentEl;\n                    this._dom = dom;\n\n                    // Put the developer's content into the scroller\n                    dom.scroller.appendChild(dom.content);\n\n                    _ElementUtilities._ensureId(dom.title);\n                    _ElementUtilities._ensureId(dom.startBodyTab);\n                    _ElementUtilities._ensureId(dom.endBodyTab);\n                    dom.dialog.setAttribute(\"aria-labelledby\", dom.title.id);\n                    dom.startBodyTab.setAttribute(\"x-ms-aria-flowfrom\", dom.endBodyTab.id);\n                    dom.endBodyTab.setAttribute(\"aria-flowto\", dom.startBodyTab.id);\n                    this._updateTabIndices();\n                    \n                    dom.root.addEventListener(\"keydown\", this._onKeyDownEnteringElement.bind(this), true);\n                    _ElementUtilities._addEventListener(dom.root, \"pointerdown\", this._onPointerDown.bind(this));\n                    _ElementUtilities._addEventListener(dom.root, \"pointerup\", this._onPointerUp.bind(this));\n                    dom.root.addEventListener(\"click\", this._onClick.bind(this));\n                    _ElementUtilities._addEventListener(dom.startBodyTab, \"focusin\", this._onStartBodyTabFocusIn.bind(this));\n                    _ElementUtilities._addEventListener(dom.endBodyTab, \"focusin\", this._onEndBodyTabFocusIn.bind(this));\n                    dom.commands[0].addEventListener(\"click\", this._onCommandClicked.bind(this, DismissalResult.primary));\n                    dom.commands[1].addEventListener(\"click\", this._onCommandClicked.bind(this, DismissalResult.secondary));\n                },\n\n                _updateCommandsUI: function ContentDialog_updateCommandsUI() {\n                    this._dom.commands[0].style.display = this.primaryCommandText ? \"\" : \"none\";\n                    this._dom.commands[1].style.display = this.secondaryCommandText ? \"\" : \"none\";\n\n                    // commandSpacer's purpose is to ensure that when only 1 button is shown, that button takes up half\n                    // the width of the dialog and is right-aligned. It works by:\n                    // - When only one command is shown:\n                    //   - Coming before the other command in the DOM (so the other command will look right-aligned)\n                    //   - Having the same flex-grow as the other command (so it occupies half of the space)\n                    //   - Having visibility: hidden (so it's invisible but it takes up space)\n                    // - When both commands are shown:\n                    //   - Having display: none (so it doesn't occupy any space and the two shown commands each take up half the dialog)\n                    // - When 0 commands are shown:\n                    //   - Having display: none (so the commands area takes up no space)\n                    this._dom.commandSpacer.style.display = this.primaryCommandText && !this.secondaryCommandText || !this.primaryCommandText && this.secondaryCommandText ? \"\" : \"none\";\n                },\n\n                // _updateTabIndices and _updateTabIndicesImpl are used in tests\n                _updateTabIndices: function ContentDialog_updateTabIndices() {\n                    if (!this._updateTabIndicesThrottled) {\n                        this._updateTabIndicesThrottled = _BaseUtils._throttledFunction(100, this._updateTabIndicesImpl.bind(this));\n                    }\n                    this._updateTabIndicesThrottled();\n                },\n                _updateTabIndicesImpl: function ContentDialog_updateTabIndicesImpl() {\n                    var tabIndex = _ElementUtilities._getHighAndLowTabIndices(this._dom.content);\n                    this._dom.startBodyTab.tabIndex = tabIndex.lowest;\n                    this._dom.commands[0].tabIndex = tabIndex.highest;\n                    this._dom.commands[1].tabIndex = tabIndex.highest;\n                    this._dom.endBodyTab.tabIndex = tabIndex.highest;\n                },\n\n                _elementInDialog: function ContentDialog_elementInDialog(element) {\n                    return this._dom.dialog.contains(element) || element === this._dom.startBodyTab || element === this._dom.endBodyTab;\n                },\n\n                _onCommandClicked: function ContentDialog_onCommandClicked(dismissalResult) {\n                    this._state.onCommandClicked(dismissalResult);\n                },\n\n                _onPointerDown: function ContentDialog_onPointerDown(eventObject) {\n                    eventObject.stopPropagation();\n                    if (!this._elementInDialog(eventObject.target)) {\n                        eventObject.preventDefault();\n                    }\n                },\n\n                _onPointerUp: function ContentDialog_onPointerUp(eventObject) {\n                    eventObject.stopPropagation();\n                    if (!this._elementInDialog(eventObject.target)) {\n                        eventObject.preventDefault();\n                    }\n                },\n\n                _onClick: function ContentDialog_onClick(eventObject) {\n                    eventObject.stopPropagation();\n                    if (!this._elementInDialog(eventObject.target)) {\n                        eventObject.preventDefault();\n                    }\n                },\n                \n                _onKeyDownEnteringElement: function ContentDialog_onKeyDownEnteringElement(eventObject) {\n                    if (eventObject.keyCode === _ElementUtilities.Key.tab) {\n                        this._updateTabIndices();\n                    }\n                },\n\n                _onStartBodyTabFocusIn: function ContentDialog_onStartBodyTabFocusIn() {\n                    _ElementUtilities._focusLastFocusableElement(this._dom.dialog);\n                },\n\n                _onEndBodyTabFocusIn: function ContentDialog_onEndBodyTabFocusIn() {\n                    _ElementUtilities._focusFirstFocusableElement(this._dom.dialog);\n                },\n\n                _onInputPaneShown: function ContentDialog_onInputPaneShown(eventObject) {\n                    this._state.onInputPaneShown(eventObject.detail.originalEvent);\n                },\n\n                _onInputPaneHidden: function ContentDialog_onInputPaneHidden() {\n                    this._state.onInputPaneHidden();\n                },\n\n                //\n                // Methods called by states\n                //\n\n                _setState: function ContentDialog_setState(NewState, arg0) {\n                    if (!this._disposed) {\n                        this._state && this._state.exit();\n                        this._state = new NewState();\n                        this._state.dialog = this;\n                        this._state.enter(arg0);\n                    }\n                },\n\n                // Calls into arbitrary app code\n                _resetDismissalPromise: function ContentDialog_resetDismissalPromise(dismissalResult, newSignal) {\n                    var dismissedSignal = this._dismissedSignal;\n                    var newDismissedSignal = this._dismissedSignal = newSignal;\n                    dismissedSignal.complete({ result: dismissalResult });\n                    return newDismissedSignal;\n                },\n\n                // Calls into arbitrary app code\n                _cancelDismissalPromise: function ContentDialog_cancelDismissalPromise(newSignal) {\n                    var dismissedSignal = this._dismissedSignal;\n                    var newDismissedSignal = this._dismissedSignal = newSignal;\n                    dismissedSignal.cancel();\n                    return newDismissedSignal;\n                },\n\n                // Calls into arbitrary app code\n                _fireEvent: function ContentDialog_fireEvent(eventName, options) {\n                    options = options || {};\n                    var detail = options.detail || null;\n                    var cancelable = !!options.cancelable;\n\n                    var eventObject = _Global.document.createEvent(\"CustomEvent\");\n                    eventObject.initCustomEvent(eventName, true, cancelable, detail);\n                    return this._dom.root.dispatchEvent(eventObject);\n                },\n\n                // Calls into arbitrary app code\n                _fireBeforeShow: function ContentDialog_fireBeforeShow() {\n                    return this._fireEvent(EventNames.beforeShow, {\n                        cancelable: true\n                    });\n                },\n\n                // Calls into arbitrary app code\n                _fireBeforeHide: function ContentDialog_fireBeforeHide(dismissalResult) {\n                    return this._fireEvent(EventNames.beforeHide, {\n                        detail: { result: dismissalResult },\n                        cancelable: true\n                    });\n                },\n\n                // Calls into arbitrary app code\n                _fireAfterHide: function ContentDialog_fireAfterHide(dismissalResult) {\n                    this._fireEvent(EventNames.afterHide, {\n                        detail: { result: dismissalResult }\n                    });\n                },\n\n                _playEntranceAnimation: function ContentDialog_playEntranceAnimation() {\n                    return cancelablePromise(_Animations.fadeIn(this._dom.root));\n                },\n\n                _playExitAnimation: function ContentDialog_playExitAnimation() {\n                    return cancelablePromise(_Animations.fadeOut(this._dom.root));\n                },\n\n                _addExternalListeners: function ContentDialog_addExternalListeners() {\n                    _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, \"showing\", this._onInputPaneShownBound);\n                    _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, \"hiding\", this._onInputPaneShownBound);\n                },\n\n                _removeExternalListeners: function ContentDialog_removeExternalListeners() {\n                    _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, \"showing\", this._onInputPaneShownBound);\n                    _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, \"hiding\", this._onInputPaneShownBound);\n                },\n\n                _renderForInputPane: function ContentDialog_renderForInputPane(inputPaneHeight) {\n                    this._clearInputPaneRendering();\n\n                    var dialog = this._dom.dialog;\n                    var style = dialog.style;\n                    var left = dialog.offsetLeft;\n                    var top = dialog.offsetTop;\n                    var height = dialog.offsetHeight;\n                    var bottom = top + height;\n                    var visibleBottom = this._dom.root.offsetHeight - inputPaneHeight;\n                    var titleHeight = _ElementUtilities.getTotalHeight(this._dom.title);\n                    var commandsHeight = _ElementUtilities.getTotalHeight(this._dom.commandContainer);\n\n                    if (bottom > visibleBottom) {\n                        var newHeight = height - (bottom - visibleBottom);\n                        if (newHeight - titleHeight - commandsHeight < minContentHeightWithInputPane) {\n                            // Put title into scroller so there's more screen real estate for the content\n                            this._dom.scroller.insertBefore(this._dom.title, this._dom.content);\n                        }\n\n                        this._dom.root.style.display = \"block\";\n                        style.height = newHeight + \"px\";\n                        style.position = \"absolute\";\n                        style.left = left + \"px\";\n                        style.top = top + \"px\";\n                        style.minHeight = 0;\n\n                        this._resizedForInputPane = true;\n                        _Global.document.activeElement.focus(); // Ensure activeElement is scrolled into view\n                    }\n                },\n\n                _clearInputPaneRendering: function ContentDialog_clearInputPaneRendering() {\n                    if (this._resizedForInputPane) {\n                        if (this._dom.title.parentNode !== this._dom.dialog) {\n                            // Make sure the title isn't in the scroller\n                            this._dom.dialog.insertBefore(this._dom.title, this._dom.scroller);\n                        }\n\n                        var style = this._dom.dialog.style;\n                        this._dom.root.style.display = \"\";\n                        style.height = \"\";\n                        style.position = \"\";\n                        style.left = \"\";\n                        style.top = \"\";\n                        style.minHeight = \"\";\n                        this._resizedForInputPane = false;\n                    }\n                }\n            }, {\n                /// <field locid=\"WinJS.UI.ContentDialog.DismissalResult\" helpKeyword=\"WinJS.UI.ContentDialog.DismissalResult\">\n                /// Specifies the result of dismissing the ContentDialog.\n                /// </field>\n                DismissalResult: DismissalResult,\n\n                _ClassNames: ClassNames\n            });\n            _Base.Class.mix(ContentDialog, _Events.createEventProperties(\n                \"beforeshow\",\n                \"aftershow\",\n                \"beforehide\",\n                \"afterhide\"\n            ));\n            _Base.Class.mix(ContentDialog, _Control.DOMEventMixin);\n            return ContentDialog;\n        })\n    });\n});\n\n\ndefine('require-style!less/styles-splitview',[],function(){});\n\ndefine('require-style!less/colors-splitview',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/SplitView/_SplitView',[\"require\", \"exports\", '../../Animations', '../../Core/_Base', '../../Core/_BaseUtils', '../../Utilities/_Control', '../../Utilities/_Dispose', '../../Utilities/_ElementUtilities', '../../Core/_ErrorFromName', '../../Core/_Events', '../../Core/_Global', '../../_LightDismissService', '../../Utilities/_OpenCloseMachine'], function (require, exports, Animations, _Base, _BaseUtils, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Global, _LightDismissService, _OpenCloseMachine) {\n    require([\"require-style!less/styles-splitview\"]);\n    require([\"require-style!less/colors-splitview\"]);\n    \"use strict\";\n    var transformNames = _BaseUtils._browserStyleEquivalents[\"transform\"];\n    var Strings = {\n        get duplicateConstruction() {\n            return \"Invalid argument: Controls may only be instantiated one time for each DOM element\";\n        }\n    };\n    var ClassNames = {\n        splitView: \"win-splitview\",\n        pane: \"win-splitview-pane\",\n        content: \"win-splitview-content\",\n        // closed/opened\n        paneClosed: \"win-splitview-pane-closed\",\n        paneOpened: \"win-splitview-pane-opened\",\n        _panePlaceholder: \"win-splitview-paneplaceholder\",\n        _paneWrapper: \"win-splitview-panewrapper\",\n        _contentWrapper: \"win-splitview-contentwrapper\",\n        // placement\n        _placementLeft: \"win-splitview-placementleft\",\n        _placementRight: \"win-splitview-placementright\",\n        _placementTop: \"win-splitview-placementtop\",\n        _placementBottom: \"win-splitview-placementbottom\",\n        // closed display mode\n        _closedDisplayNone: \"win-splitview-closeddisplaynone\",\n        _closedDisplayInline: \"win-splitview-closeddisplayinline\",\n        // opened display mode\n        _openedDisplayInline: \"win-splitview-openeddisplayinline\",\n        _openedDisplayOverlay: \"win-splitview-openeddisplayoverlay\"\n    };\n    var EventNames = {\n        beforeOpen: \"beforeopen\",\n        afterOpen: \"afteropen\",\n        beforeClose: \"beforeclose\",\n        afterClose: \"afterclose\"\n    };\n    var Dimension = {\n        width: \"width\",\n        height: \"height\"\n    };\n    var ClosedDisplayMode = {\n        /// <field locid=\"WinJS.UI.SplitView.ClosedDisplayMode.none\" helpKeyword=\"WinJS.UI.SplitView.ClosedDisplayMode.none\">\n        /// When the pane is closed, it is not visible and doesn't take up any space.\n        /// </field>\n        none: \"none\",\n        /// <field locid=\"WinJS.UI.SplitView.ClosedDisplayMode.inline\" helpKeyword=\"WinJS.UI.SplitView.ClosedDisplayMode.inline\">\n        /// When the pane is closed, it occupies space leaving less room for the SplitView's content.\n        /// </field>\n        inline: \"inline\"\n    };\n    var OpenedDisplayMode = {\n        /// <field locid=\"WinJS.UI.SplitView.OpenedDisplayMode.inline\" helpKeyword=\"WinJS.UI.SplitView.OpenedDisplayMode.inline\">\n        /// When the pane is open, it occupies space leaving less room for the SplitView's content.\n        /// </field>\n        inline: \"inline\",\n        /// <field locid=\"WinJS.UI.SplitView.OpenedDisplayMode.overlay\" helpKeyword=\"WinJS.UI.SplitView.OpenedDisplayMode.overlay\">\n        /// When the pane is open, it doesn't take up any space and it is light dismissable.\n        /// </field>\n        overlay: \"overlay\"\n    };\n    var PanePlacement = {\n        /// <field locid=\"WinJS.UI.SplitView.PanePlacement.left\" helpKeyword=\"WinJS.UI.SplitView.PanePlacement.left\">\n        /// Pane is positioned left of the SplitView's content.\n        /// </field>\n        left: \"left\",\n        /// <field locid=\"WinJS.UI.SplitView.PanePlacement.right\" helpKeyword=\"WinJS.UI.SplitView.PanePlacement.right\">\n        /// Pane is positioned right of the SplitView's content.\n        /// </field>\n        right: \"right\",\n        /// <field locid=\"WinJS.UI.SplitView.PanePlacement.top\" helpKeyword=\"WinJS.UI.SplitView.PanePlacement.top\">\n        /// Pane is positioned above the SplitView's content.\n        /// </field>\n        top: \"top\",\n        /// <field locid=\"WinJS.UI.SplitView.PanePlacement.bottom\" helpKeyword=\"WinJS.UI.SplitView.PanePlacement.bottom\">\n        /// Pane is positioned below the SplitView's content.\n        /// </field>\n        bottom: \"bottom\"\n    };\n    var closedDisplayModeClassMap = {};\n    closedDisplayModeClassMap[ClosedDisplayMode.none] = ClassNames._closedDisplayNone;\n    closedDisplayModeClassMap[ClosedDisplayMode.inline] = ClassNames._closedDisplayInline;\n    var openedDisplayModeClassMap = {};\n    openedDisplayModeClassMap[OpenedDisplayMode.overlay] = ClassNames._openedDisplayOverlay;\n    openedDisplayModeClassMap[OpenedDisplayMode.inline] = ClassNames._openedDisplayInline;\n    var panePlacementClassMap = {};\n    panePlacementClassMap[PanePlacement.left] = ClassNames._placementLeft;\n    panePlacementClassMap[PanePlacement.right] = ClassNames._placementRight;\n    panePlacementClassMap[PanePlacement.top] = ClassNames._placementTop;\n    panePlacementClassMap[PanePlacement.bottom] = ClassNames._placementBottom;\n    // Versions of add/removeClass that are no ops when called with falsy class names.\n    function addClass(element, className) {\n        className && _ElementUtilities.addClass(element, className);\n    }\n    function removeClass(element, className) {\n        className && _ElementUtilities.removeClass(element, className);\n    }\n    function rectToThickness(rect, dimension) {\n        return (dimension === Dimension.width) ? {\n            content: rect.contentWidth,\n            total: rect.totalWidth\n        } : {\n            content: rect.contentHeight,\n            total: rect.totalHeight\n        };\n    }\n    /// <field>\n    /// <summary locid=\"WinJS.UI.SplitView\">\n    /// Displays a SplitView which renders a collapsable pane next to arbitrary HTML content.\n    /// </summary>\n    /// </field>\n    /// <icon src=\"ui_winjs.ui.splitview.12x12.png\" width=\"12\" height=\"12\" />\n    /// <icon src=\"ui_winjs.ui.splitview.16x16.png\" width=\"16\" height=\"16\" />\n    /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.SplitView\"></div>]]></htmlSnippet>\n    /// <event name=\"beforeopen\" locid=\"WinJS.UI.SplitView_e:beforeopen\">Raised just before opening the pane. Call preventDefault on this event to stop the pane from opening.</event>\n    /// <event name=\"afteropen\" locid=\"WinJS.UI.SplitView_e:afteropen\">Raised immediately after the pane is fully opened.</event>\n    /// <event name=\"beforeclose\" locid=\"WinJS.UI.SplitView_e:beforeclose\">Raised just before closing the pane. Call preventDefault on this event to stop the pane from closing.</event>\n    /// <event name=\"afterclose\" locid=\"WinJS.UI.SplitView_e:afterclose\">Raised immediately after the pane is fully closed.</event>\n    /// <part name=\"splitview\" class=\"win-splitview\" locid=\"WinJS.UI.SplitView_part:splitview\">The entire SplitView control.</part>\n    /// <part name=\"splitview-pane\" class=\"win-splitview-pane\" locid=\"WinJS.UI.SplitView_part:splitview-pane\">The element which hosts the SplitView's pane.</part>\n    /// <part name=\"splitview-content\" class=\"win-splitview-content\" locid=\"WinJS.UI.SplitView_part:splitview-content\">The element which hosts the SplitView's content.</part>\n    /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n    /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n    var SplitView = (function () {\n        function SplitView(element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.SplitView.SplitView\">\n            /// <summary locid=\"WinJS.UI.SplitView.constructor\">\n            /// Creates a new SplitView control.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.SplitView.constructor_p:element\">\n            /// The DOM element that hosts the SplitView control.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.SplitView.constructor_p:options\">\n            /// An object that contains one or more property/value pairs to apply to the new control.\n            /// Each property of the options object corresponds to one of the control's properties or events.\n            /// Event names must begin with \"on\". For example, to provide a handler for the beforeclose event,\n            /// add a property named \"onbeforeclose\" to the options object and set its value to the event handler.\n            /// </param>\n            /// <returns type=\"WinJS.UI.SplitView\" locid=\"WinJS.UI.SplitView.constructor_returnValue\">\n            /// The new SplitView.\n            /// </returns>\n            /// </signature>\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            // State private to _updateDomImpl. No other method should make use of it.\n            //\n            // Nothing has been rendered yet so these are all initialized to undefined. Because\n            // they are undefined, the first time _updateDomImpl is called, they will all be\n            // rendered.\n            this._updateDomImpl_rendered = {\n                paneIsFirst: undefined,\n                isOpenedMode: undefined,\n                closedDisplayMode: undefined,\n                openedDisplayMode: undefined,\n                panePlacement: undefined,\n                panePlaceholderWidth: undefined,\n                panePlaceholderHeight: undefined,\n                isOverlayShown: undefined\n            };\n            // Check to make sure we weren't duplicated\n            if (element && element[\"winControl\"]) {\n                throw new _ErrorFromName(\"WinJS.UI.SplitView.DuplicateConstruction\", Strings.duplicateConstruction);\n            }\n            this._initializeDom(element || _Global.document.createElement(\"div\"));\n            this._machine = new _OpenCloseMachine.OpenCloseMachine({\n                eventElement: this._dom.root,\n                onOpen: function () {\n                    _this._cachedHiddenPaneThickness = null;\n                    var hiddenPaneThickness = _this._getHiddenPaneThickness();\n                    _this._isOpenedMode = true;\n                    _this._updateDomImpl();\n                    return _this._playShowAnimation(hiddenPaneThickness);\n                },\n                onClose: function () {\n                    return _this._playHideAnimation(_this._getHiddenPaneThickness()).then(function () {\n                        _this._isOpenedMode = false;\n                        _this._updateDomImpl();\n                    });\n                },\n                onUpdateDom: function () {\n                    _this._updateDomImpl();\n                },\n                onUpdateDomWithIsOpened: function (isOpened) {\n                    _this._isOpenedMode = isOpened;\n                    _this._updateDomImpl();\n                }\n            });\n            // Initialize private state.\n            this._disposed = false;\n            this._dismissable = new _LightDismissService.LightDismissableElement({\n                element: this._dom.paneWrapper,\n                tabIndex: -1,\n                onLightDismiss: function () {\n                    _this.closePane();\n                },\n                onTakeFocus: function (useSetActive) {\n                    _this._dismissable.restoreFocus() || _ElementUtilities._tryFocusOnAnyElement(_this._dom.pane, useSetActive);\n                }\n            });\n            this._cachedHiddenPaneThickness = null;\n            // Initialize public properties.\n            this.paneOpened = false;\n            this.closedDisplayMode = ClosedDisplayMode.inline;\n            this.openedDisplayMode = OpenedDisplayMode.overlay;\n            this.panePlacement = PanePlacement.left;\n            _Control.setOptions(this, options);\n            // Exit the Init state.\n            _ElementUtilities._inDom(this._dom.root).then(function () {\n                _this._rtl = _Global.getComputedStyle(_this._dom.root).direction === 'rtl';\n                _this._machine.exitInit();\n            });\n        }\n        Object.defineProperty(SplitView.prototype, \"element\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.SplitView.element\" helpKeyword=\"WinJS.UI.SplitView.element\">\n            /// Gets the DOM element that hosts the SplitView control.\n            /// </field>\n            get: function () {\n                return this._dom.root;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitView.prototype, \"paneElement\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.SplitView.paneElement\" helpKeyword=\"WinJS.UI.SplitView.paneElement\">\n            /// Gets the DOM element that hosts the SplitView pane.\n            /// </field>\n            get: function () {\n                return this._dom.pane;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitView.prototype, \"contentElement\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.SplitView.contentElement\" helpKeyword=\"WinJS.UI.SplitView.contentElement\">\n            /// Gets the DOM element that hosts the SplitView's content.\n            /// </field>\n            get: function () {\n                return this._dom.content;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitView.prototype, \"closedDisplayMode\", {\n            /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.SplitView.ClosedDisplayMode\" locid=\"WinJS.UI.SplitView.closedDisplayMode\" helpKeyword=\"WinJS.UI.SplitView.closedDisplayMode\">\n            /// Gets or sets the display mode of the SplitView's pane when it is hidden.\n            /// </field>\n            get: function () {\n                return this._closedDisplayMode;\n            },\n            set: function (value) {\n                if (ClosedDisplayMode[value] && this._closedDisplayMode !== value) {\n                    this._closedDisplayMode = value;\n                    this._cachedHiddenPaneThickness = null;\n                    this._machine.updateDom();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitView.prototype, \"openedDisplayMode\", {\n            /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.SplitView.OpenedDisplayMode\" locid=\"WinJS.UI.SplitView.openedDisplayMode\" helpKeyword=\"WinJS.UI.SplitView.openedDisplayMode\">\n            /// Gets or sets the display mode of the SplitView's pane when it is open.\n            /// </field>\n            get: function () {\n                return this._openedDisplayMode;\n            },\n            set: function (value) {\n                if (OpenedDisplayMode[value] && this._openedDisplayMode !== value) {\n                    this._openedDisplayMode = value;\n                    this._cachedHiddenPaneThickness = null;\n                    this._machine.updateDom();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitView.prototype, \"panePlacement\", {\n            /// <field type=\"String\" oamOptionsDatatype=\"WinJS.UI.SplitView.PanePlacement\" locid=\"WinJS.UI.SplitView.panePlacement\" helpKeyword=\"WinJS.UI.SplitView.panePlacement\">\n            /// Gets or sets the placement of the SplitView's pane.\n            /// </field>\n            get: function () {\n                return this._panePlacement;\n            },\n            set: function (value) {\n                if (PanePlacement[value] && this._panePlacement !== value) {\n                    this._panePlacement = value;\n                    this._cachedHiddenPaneThickness = null;\n                    this._machine.updateDom();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitView.prototype, \"paneOpened\", {\n            /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI.SplitView.paneOpened\" helpKeyword=\"WinJS.UI.SplitView.paneOpened\">\n            /// Gets or sets whether the SpitView's pane is currently opened.\n            /// </field>\n            get: function () {\n                return this._machine.opened;\n            },\n            set: function (value) {\n                this._machine.opened = value;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        SplitView.prototype.dispose = function () {\n            /// <signature helpKeyword=\"WinJS.UI.SplitView.dispose\">\n            /// <summary locid=\"WinJS.UI.SplitView.dispose\">\n            /// Disposes this control.\n            /// </summary>\n            /// </signature>\n            if (this._disposed) {\n                return;\n            }\n            this._disposed = true;\n            this._machine.dispose();\n            _LightDismissService.hidden(this._dismissable);\n            _Dispose._disposeElement(this._dom.pane);\n            _Dispose._disposeElement(this._dom.content);\n        };\n        SplitView.prototype.openPane = function () {\n            /// <signature helpKeyword=\"WinJS.UI.SplitView.openPane\">\n            /// <summary locid=\"WinJS.UI.SplitView.openPane\">\n            /// Opens the SplitView's pane.\n            /// </summary>\n            /// </signature>\n            this._machine.open();\n        };\n        SplitView.prototype.closePane = function () {\n            /// <signature helpKeyword=\"WinJS.UI.SplitView.closePane\">\n            /// <summary locid=\"WinJS.UI.SplitView.closePane\">\n            /// Closes the SplitView's pane.\n            /// </summary>\n            /// </signature>\n            this._machine.close();\n        };\n        SplitView.prototype._initializeDom = function (root) {\n            // The first child is the pane\n            var paneEl = root.firstElementChild || _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(paneEl, ClassNames.pane);\n            if (!paneEl.hasAttribute(\"tabIndex\")) {\n                paneEl.tabIndex = -1;\n            }\n            // All other children are members of the content\n            var contentEl = _Global.document.createElement(\"div\");\n            _ElementUtilities.addClass(contentEl, ClassNames.content);\n            var child = paneEl.nextSibling;\n            while (child) {\n                var sibling = child.nextSibling;\n                contentEl.appendChild(child);\n                child = sibling;\n            }\n            // paneWrapper's purpose is to clip the pane during the pane resize animation\n            var paneWrapperEl = _Global.document.createElement(\"div\");\n            paneWrapperEl.className = ClassNames._paneWrapper;\n            paneWrapperEl.appendChild(paneEl);\n            var panePlaceholderEl = _Global.document.createElement(\"div\");\n            panePlaceholderEl.className = ClassNames._panePlaceholder;\n            // contentWrapper is an extra element we need to allow heights to be specified as percentages (e.g. height: 100%)\n            // for elements within the content area. It works around this Chrome bug:\n            //   Issue 428049: 100% height doesn't work on child of a definite-flex-basis flex item (in vertical flex container)\n            //   https://code.google.com/p/chromium/issues/detail?id=428049\n            // The workaround is that putting a position: absolute element (_dom.content) within the flex item (_dom.contentWrapper)\n            // allows percentage heights to work within the absolutely positioned element (_dom.content).\n            var contentWrapperEl = _Global.document.createElement(\"div\");\n            contentWrapperEl.className = ClassNames._contentWrapper;\n            contentWrapperEl.appendChild(contentEl);\n            root[\"winControl\"] = this;\n            _ElementUtilities.addClass(root, ClassNames.splitView);\n            _ElementUtilities.addClass(root, \"win-disposable\");\n            this._dom = {\n                root: root,\n                pane: paneEl,\n                paneWrapper: paneWrapperEl,\n                panePlaceholder: panePlaceholderEl,\n                content: contentEl,\n                contentWrapper: contentWrapperEl\n            };\n        };\n        SplitView.prototype._measureElement = function (element) {\n            var style = getComputedStyle(element);\n            var position = _ElementUtilities._getPositionRelativeTo(element, this._dom.root);\n            var marginLeft = parseInt(style.marginLeft, 10);\n            var marginTop = parseInt(style.marginTop, 10);\n            return {\n                left: position.left - marginLeft,\n                top: position.top - marginTop,\n                contentWidth: _ElementUtilities.getContentWidth(element),\n                contentHeight: _ElementUtilities.getContentHeight(element),\n                totalWidth: _ElementUtilities.getTotalWidth(element),\n                totalHeight: _ElementUtilities.getTotalHeight(element)\n            };\n        };\n        SplitView.prototype._setContentRect = function (contentRect) {\n            var contentWrapperStyle = this._dom.contentWrapper.style;\n            contentWrapperStyle.left = contentRect.left + \"px\";\n            contentWrapperStyle.top = contentRect.top + \"px\";\n            contentWrapperStyle.height = contentRect.contentHeight + \"px\";\n            contentWrapperStyle.width = contentRect.contentWidth + \"px\";\n        };\n        // Overridden by tests.\n        SplitView.prototype._prepareAnimation = function (paneRect, contentRect) {\n            var paneWrapperStyle = this._dom.paneWrapper.style;\n            paneWrapperStyle.position = \"absolute\";\n            paneWrapperStyle.left = paneRect.left + \"px\";\n            paneWrapperStyle.top = paneRect.top + \"px\";\n            paneWrapperStyle.height = paneRect.totalHeight + \"px\";\n            paneWrapperStyle.width = paneRect.totalWidth + \"px\";\n            var contentWrapperStyle = this._dom.contentWrapper.style;\n            contentWrapperStyle.position = \"absolute\";\n            this._setContentRect(contentRect);\n        };\n        // Overridden by tests.\n        SplitView.prototype._clearAnimation = function () {\n            var paneWrapperStyle = this._dom.paneWrapper.style;\n            paneWrapperStyle.position = \"\";\n            paneWrapperStyle.left = \"\";\n            paneWrapperStyle.top = \"\";\n            paneWrapperStyle.height = \"\";\n            paneWrapperStyle.width = \"\";\n            paneWrapperStyle[transformNames.scriptName] = \"\";\n            var contentWrapperStyle = this._dom.contentWrapper.style;\n            contentWrapperStyle.position = \"\";\n            contentWrapperStyle.left = \"\";\n            contentWrapperStyle.top = \"\";\n            contentWrapperStyle.height = \"\";\n            contentWrapperStyle.width = \"\";\n            contentWrapperStyle[transformNames.scriptName] = \"\";\n            var paneStyle = this._dom.pane.style;\n            paneStyle.height = \"\";\n            paneStyle.width = \"\";\n            paneStyle[transformNames.scriptName] = \"\";\n        };\n        SplitView.prototype._getHiddenContentRect = function (shownContentRect, hiddenPaneThickness, shownPaneThickness) {\n            if (this.openedDisplayMode === OpenedDisplayMode.overlay) {\n                return shownContentRect;\n            }\n            else {\n                var placementRight = this._rtl ? PanePlacement.left : PanePlacement.right;\n                var multiplier = this.panePlacement === placementRight || this.panePlacement === PanePlacement.bottom ? 0 : 1;\n                var paneDiff = {\n                    content: shownPaneThickness.content - hiddenPaneThickness.content,\n                    total: shownPaneThickness.total - hiddenPaneThickness.total\n                };\n                return this._horizontal ? {\n                    left: shownContentRect.left - multiplier * paneDiff.total,\n                    top: shownContentRect.top,\n                    contentWidth: shownContentRect.contentWidth + paneDiff.content,\n                    contentHeight: shownContentRect.contentHeight,\n                    totalWidth: shownContentRect.totalWidth + paneDiff.total,\n                    totalHeight: shownContentRect.totalHeight\n                } : {\n                    left: shownContentRect.left,\n                    top: shownContentRect.top - multiplier * paneDiff.total,\n                    contentWidth: shownContentRect.contentWidth,\n                    contentHeight: shownContentRect.contentHeight + paneDiff.content,\n                    totalWidth: shownContentRect.totalWidth,\n                    totalHeight: shownContentRect.totalHeight + paneDiff.total\n                };\n            }\n        };\n        Object.defineProperty(SplitView.prototype, \"_horizontal\", {\n            get: function () {\n                return this.panePlacement === PanePlacement.left || this.panePlacement === PanePlacement.right;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        SplitView.prototype._getHiddenPaneThickness = function () {\n            if (this._cachedHiddenPaneThickness === null) {\n                if (this._closedDisplayMode === ClosedDisplayMode.none) {\n                    this._cachedHiddenPaneThickness = { content: 0, total: 0 };\n                }\n                else {\n                    if (this._isOpenedMode) {\n                        _ElementUtilities.removeClass(this._dom.root, ClassNames.paneOpened);\n                        _ElementUtilities.addClass(this._dom.root, ClassNames.paneClosed);\n                    }\n                    var size = this._measureElement(this._dom.pane);\n                    this._cachedHiddenPaneThickness = rectToThickness(size, this._horizontal ? Dimension.width : Dimension.height);\n                    if (this._isOpenedMode) {\n                        _ElementUtilities.removeClass(this._dom.root, ClassNames.paneClosed);\n                        _ElementUtilities.addClass(this._dom.root, ClassNames.paneOpened);\n                    }\n                }\n            }\n            return this._cachedHiddenPaneThickness;\n        };\n        // Should be called while SplitView is rendered in its opened mode\n        // Overridden by tests.\n        SplitView.prototype._playShowAnimation = function (hiddenPaneThickness) {\n            var _this = this;\n            var dim = this._horizontal ? Dimension.width : Dimension.height;\n            var shownPaneRect = this._measureElement(this._dom.pane);\n            var shownContentRect = this._measureElement(this._dom.content);\n            var shownPaneThickness = rectToThickness(shownPaneRect, dim);\n            var hiddenContentRect = this._getHiddenContentRect(shownContentRect, hiddenPaneThickness, shownPaneThickness);\n            this._prepareAnimation(shownPaneRect, hiddenContentRect);\n            var playPaneAnimation = function () {\n                var placementRight = _this._rtl ? PanePlacement.left : PanePlacement.right;\n                // What percentage of the size change should be skipped? (e.g. let's do the first\n                // 30% of the size change instantly and then animate the other 70%)\n                var animationOffsetFactor = 0.3;\n                var from = hiddenPaneThickness.total + animationOffsetFactor * (shownPaneThickness.total - hiddenPaneThickness.total);\n                return Animations._resizeTransition(_this._dom.paneWrapper, _this._dom.pane, {\n                    from: from,\n                    to: shownPaneThickness.total,\n                    actualSize: shownPaneThickness.total,\n                    dimension: dim,\n                    anchorTrailingEdge: _this.panePlacement === placementRight || _this.panePlacement === PanePlacement.bottom\n                });\n            };\n            var playShowAnimation = function () {\n                if (_this.openedDisplayMode === OpenedDisplayMode.inline) {\n                    _this._setContentRect(shownContentRect);\n                }\n                return playPaneAnimation();\n            };\n            return playShowAnimation().then(function () {\n                _this._clearAnimation();\n            });\n        };\n        // Should be called while SplitView is rendered in its opened mode\n        // Overridden by tests.\n        SplitView.prototype._playHideAnimation = function (hiddenPaneThickness) {\n            var _this = this;\n            var dim = this._horizontal ? Dimension.width : Dimension.height;\n            var shownPaneRect = this._measureElement(this._dom.pane);\n            var shownContentRect = this._measureElement(this._dom.content);\n            var shownPaneThickness = rectToThickness(shownPaneRect, dim);\n            var hiddenContentRect = this._getHiddenContentRect(shownContentRect, hiddenPaneThickness, shownPaneThickness);\n            this._prepareAnimation(shownPaneRect, shownContentRect);\n            var playPaneAnimation = function () {\n                var placementRight = _this._rtl ? PanePlacement.left : PanePlacement.right;\n                // What percentage of the size change should be skipped? (e.g. let's do the first\n                // 30% of the size change instantly and then animate the other 70%)\n                var animationOffsetFactor = 0.3;\n                var from = shownPaneThickness.total - animationOffsetFactor * (shownPaneThickness.total - hiddenPaneThickness.total);\n                return Animations._resizeTransition(_this._dom.paneWrapper, _this._dom.pane, {\n                    from: from,\n                    to: hiddenPaneThickness.total,\n                    actualSize: shownPaneThickness.total,\n                    dimension: dim,\n                    anchorTrailingEdge: _this.panePlacement === placementRight || _this.panePlacement === PanePlacement.bottom\n                });\n            };\n            var playHideAnimation = function () {\n                if (_this.openedDisplayMode === OpenedDisplayMode.inline) {\n                    _this._setContentRect(hiddenContentRect);\n                }\n                return playPaneAnimation();\n            };\n            return playHideAnimation().then(function () {\n                _this._clearAnimation();\n            });\n        };\n        SplitView.prototype._updateDomImpl = function () {\n            var rendered = this._updateDomImpl_rendered;\n            var paneShouldBeFirst = this.panePlacement === PanePlacement.left || this.panePlacement === PanePlacement.top;\n            if (paneShouldBeFirst !== rendered.paneIsFirst) {\n                // TODO: restore focus\n                if (paneShouldBeFirst) {\n                    this._dom.root.appendChild(this._dom.panePlaceholder);\n                    this._dom.root.appendChild(this._dom.paneWrapper);\n                    this._dom.root.appendChild(this._dom.contentWrapper);\n                }\n                else {\n                    this._dom.root.appendChild(this._dom.contentWrapper);\n                    this._dom.root.appendChild(this._dom.paneWrapper);\n                    this._dom.root.appendChild(this._dom.panePlaceholder);\n                }\n            }\n            rendered.paneIsFirst = paneShouldBeFirst;\n            if (rendered.isOpenedMode !== this._isOpenedMode) {\n                if (this._isOpenedMode) {\n                    _ElementUtilities.removeClass(this._dom.root, ClassNames.paneClosed);\n                    _ElementUtilities.addClass(this._dom.root, ClassNames.paneOpened);\n                }\n                else {\n                    _ElementUtilities.removeClass(this._dom.root, ClassNames.paneOpened);\n                    _ElementUtilities.addClass(this._dom.root, ClassNames.paneClosed);\n                }\n            }\n            rendered.isOpenedMode = this._isOpenedMode;\n            if (rendered.panePlacement !== this.panePlacement) {\n                removeClass(this._dom.root, panePlacementClassMap[rendered.panePlacement]);\n                addClass(this._dom.root, panePlacementClassMap[this.panePlacement]);\n                rendered.panePlacement = this.panePlacement;\n            }\n            if (rendered.closedDisplayMode !== this.closedDisplayMode) {\n                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);\n                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);\n                rendered.closedDisplayMode = this.closedDisplayMode;\n            }\n            if (rendered.openedDisplayMode !== this.openedDisplayMode) {\n                removeClass(this._dom.root, openedDisplayModeClassMap[rendered.openedDisplayMode]);\n                addClass(this._dom.root, openedDisplayModeClassMap[this.openedDisplayMode]);\n                rendered.openedDisplayMode = this.openedDisplayMode;\n            }\n            var isOverlayShown = this._isOpenedMode && this.openedDisplayMode === OpenedDisplayMode.overlay;\n            // panePlaceholder's purpose is to take up the amount of space occupied by the\n            // hidden pane while the pane is shown in overlay mode. Without this, the content\n            // would shift as the pane shows and hides in overlay mode.\n            var width, height;\n            if (isOverlayShown) {\n                var hiddenPaneThickness = this._getHiddenPaneThickness();\n                if (this._horizontal) {\n                    width = hiddenPaneThickness.total + \"px\";\n                    height = \"\";\n                }\n                else {\n                    width = \"\";\n                    height = hiddenPaneThickness.total + \"px\";\n                }\n            }\n            else {\n                width = \"\";\n                height = \"\";\n            }\n            if (rendered.panePlaceholderWidth !== width || rendered.panePlaceholderHeight !== height) {\n                var style = this._dom.panePlaceholder.style;\n                style.width = width;\n                style.height = height;\n                rendered.panePlaceholderWidth = width;\n                rendered.panePlaceholderHeight = height;\n            }\n            if (rendered.isOverlayShown !== isOverlayShown) {\n                if (isOverlayShown) {\n                    _LightDismissService.shown(this._dismissable);\n                }\n                else {\n                    _LightDismissService.hidden(this._dismissable);\n                }\n                rendered.isOverlayShown = isOverlayShown;\n            }\n        };\n        /// <field locid=\"WinJS.UI.SplitView.ClosedDisplayMode\" helpKeyword=\"WinJS.UI.SplitView.ClosedDisplayMode\">\n        /// Display options for a SplitView's pane when it is closed.\n        /// </field>\n        SplitView.ClosedDisplayMode = ClosedDisplayMode;\n        /// <field locid=\"WinJS.UI.SplitView.OpenedDisplayMode\" helpKeyword=\"WinJS.UI.SplitView.OpenedDisplayMode\">\n        /// Display options for a SplitView's pane when it is open.\n        /// </field>\n        SplitView.OpenedDisplayMode = OpenedDisplayMode;\n        /// <field locid=\"WinJS.UI.SplitView.PanePlacement\" helpKeyword=\"WinJS.UI.SplitView.PanePlacement\">\n        /// Placement options for a SplitView's pane.\n        /// </field>\n        SplitView.PanePlacement = PanePlacement;\n        SplitView.supportedForProcessing = true;\n        SplitView._ClassNames = ClassNames;\n        return SplitView;\n    })();\n    exports.SplitView = SplitView;\n    _Base.Class.mix(SplitView, _Events.createEventProperties(EventNames.beforeOpen, EventNames.afterOpen, EventNames.beforeClose, EventNames.afterClose));\n    _Base.Class.mix(SplitView, _Control.DOMEventMixin);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/SplitView',[\"require\", \"exports\", '../Core/_Base'], function (require, exports, _Base) {\n    var module = null;\n    _Base.Namespace.define(\"WinJS.UI\", {\n        SplitView: {\n            get: function () {\n                if (!module) {\n                    require([\"./SplitView/_SplitView\"], function (m) {\n                        module = m;\n                    });\n                }\n                return module.SplitView;\n            }\n        }\n    });\n});\n\n\ndefine('require-style!less/styles-splitviewpanetoggle',[],function(){});\n\ndefine('require-style!less/colors-splitviewpanetoggle',[],function(){});\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/SplitViewPaneToggle/_SplitViewPaneToggle',[\"require\", \"exports\", '../../Core/_Base', '../../Utilities/_Control', '../../Utilities/_ElementUtilities', '../../Core/_ErrorFromName', '../../Core/_Events', '../../Core/_Global', '../../Utilities/_KeyboardBehavior', '../../Utilities/_Hoverable'], function (require, exports, _Base, _Control, _ElementUtilities, _ErrorFromName, _Events, _Global, _KeyboardBehavior, _Hoverable) {\n    _Hoverable.isHoverable; // Force dependency on the hoverable module\n    require([\"require-style!less/styles-splitviewpanetoggle\"]);\n    require([\"require-style!less/colors-splitviewpanetoggle\"]);\n    \"use strict\";\n    // This control has 2 modes depending on whether or not the app has provided a SplitView:\n    //   - SplitView not provided\n    //     SplitViewPaneToggle provides button visuals and fires the invoked event. The app\n    //     intends to do everything else:\n    //       - Handle the invoked event\n    //       - Handle the SplitView opening and closing\n    //       - Handle aria-expanded being mutated by UIA (i.e. screen readers)\n    //       - Keep the aria-controls attribute, aria-expanded attribute, and SplitView in sync\n    //   - SplitView is provided via splitView property\n    //     SplitViewPaneToggle keeps the SplitView, the aria-controls attribute, and the\n    //     aria-expands attribute in sync. In this use case, apps typically won't listen\n    //     to the invoked event (but it's still fired).\n    var ClassNames = {\n        splitViewPaneToggle: \"win-splitviewpanetoggle\"\n    };\n    var EventNames = {\n        // Fires when the user invokes the button with mouse/keyboard/touch. Does not\n        // fire if the SplitViewPaneToggle's state changes due to UIA (i.e. aria-expanded\n        // being set) or due to the SplitView pane opening/closing.\n        invoked: \"invoked\"\n    };\n    var Strings = {\n        get duplicateConstruction() {\n            return \"Invalid argument: Controls may only be instantiated one time for each DOM element\";\n        },\n        get badButtonElement() {\n            return \"Invalid argument: The SplitViewPaneToggle's element must be a button element\";\n        }\n    };\n    // The splitViewElement may not have a winControl associated with it yet in the case\n    // that the SplitViewPaneToggle was constructed before the SplitView. This may happen\n    // when WinJS.UI.processAll is used to construct the controls because the order of construction\n    // depends on the order in which the SplitView and SplitViewPaneToggle appear in the DOM.\n    function getSplitViewControl(splitViewElement) {\n        return (splitViewElement && splitViewElement[\"winControl\"]);\n    }\n    function getPaneOpened(splitViewElement) {\n        var splitViewControl = getSplitViewControl(splitViewElement);\n        return splitViewControl ? splitViewControl.paneOpened : false;\n    }\n    /// <field>\n    /// <summary locid=\"WinJS.UI.SplitViewPaneToggle\">\n    /// Displays a button which is used for opening and closing a SplitView's pane.\n    /// </summary>\n    /// </field>\n    /// <icon src=\"ui_winjs.ui.splitviewpanetoggle.12x12.png\" width=\"12\" height=\"12\" />\n    /// <icon src=\"ui_winjs.ui.splitviewpanetoggle.16x16.png\" width=\"16\" height=\"16\" />\n    /// <htmlSnippet><![CDATA[<button data-win-control=\"WinJS.UI.SplitViewPaneToggle\"></button>]]></htmlSnippet>\n    /// <part name=\"splitviewpanetoggle\" class=\"win-splitviewpanetoggle\" locid=\"WinJS.UI.SplitViewPaneToggle_part:splitviewpanetoggle\">The SplitViewPaneToggle control itself.</part>\n    /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n    /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n    var SplitViewPaneToggle = (function () {\n        function SplitViewPaneToggle(element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.SplitViewPaneToggle.SplitViewPaneToggle\">\n            /// <summary locid=\"WinJS.UI.SplitViewPaneToggle.constructor\">\n            /// Creates a new SplitViewPaneToggle control.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" isOptional=\"true\" locid=\"WinJS.UI.SplitViewPaneToggle.constructor_p:element\">\n            /// The DOM element that hosts the SplitViewPaneToggle control.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" isOptional=\"true\" locid=\"WinJS.UI.SplitViewPaneToggle.constructor_p:options\">\n            /// An object that contains one or more property/value pairs to apply to the new control.\n            /// Each property of the options object corresponds to one of the control's properties or events.\n            /// Event names must begin with \"on\". For example, to provide a handler for the invoked event,\n            /// add a property named \"oninvoked\" to the options object and set its value to the event handler.\n            /// </param>\n            /// <returns type=\"WinJS.UI.SplitViewPaneToggle\" locid=\"WinJS.UI.SplitViewPaneToggle.constructor_returnValue\">\n            /// The new SplitViewPaneToggle.\n            /// </returns>\n            /// </signature>\n            if (options === void 0) { options = {}; }\n            // State private to _updateDom. No other method should make use of it.\n            //\n            // Nothing has been rendered yet so these are all initialized to undefined. Because\n            // they are undefined, the first time _updateDom is called, they will all be\n            // rendered.\n            this._updateDom_rendered = {\n                splitView: undefined\n            };\n            // Check to make sure we weren't duplicated\n            if (element && element[\"winControl\"]) {\n                throw new _ErrorFromName(\"WinJS.UI.SplitViewPaneToggle.DuplicateConstruction\", Strings.duplicateConstruction);\n            }\n            this._onPaneStateSettledBound = this._onPaneStateSettled.bind(this);\n            this._ariaExpandedMutationObserver = new _ElementUtilities._MutationObserver(this._onAriaExpandedPropertyChanged.bind(this));\n            this._initializeDom(element || _Global.document.createElement(\"button\"));\n            // Private state\n            this._disposed = false;\n            // Default values\n            this.splitView = null;\n            _Control.setOptions(this, options);\n            this._initialized = true;\n            this._updateDom();\n        }\n        Object.defineProperty(SplitViewPaneToggle.prototype, \"element\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" readonly=\"true\" hidden=\"true\" locid=\"WinJS.UI.SplitViewPaneToggle.element\" helpKeyword=\"WinJS.UI.SplitViewPaneToggle.element\">\n            /// Gets the DOM element that hosts the SplitViewPaneToggle control.\n            /// </field>\n            get: function () {\n                return this._dom.root;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(SplitViewPaneToggle.prototype, \"splitView\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.SplitViewPaneToggle.splitView\" helpKeyword=\"WinJS.UI.SplitViewPaneToggle.splitView\">\n            /// Gets or sets the DOM element of the SplitView that is associated with the SplitViewPaneToggle control.\n            /// When the SplitViewPaneToggle is invoked, it'll toggle this SplitView's pane.\n            /// </field>\n            get: function () {\n                return this._splitView;\n            },\n            set: function (splitView) {\n                this._splitView = splitView;\n                if (splitView) {\n                    this._opened = getPaneOpened(splitView);\n                }\n                this._updateDom();\n            },\n            enumerable: true,\n            configurable: true\n        });\n        SplitViewPaneToggle.prototype.dispose = function () {\n            /// <signature helpKeyword=\"WinJS.UI.SplitViewPaneToggle.dispose\">\n            /// <summary locid=\"WinJS.UI.SplitViewPaneToggle.dispose\">\n            /// Disposes this control.\n            /// </summary>\n            /// </signature>\n            if (this._disposed) {\n                return;\n            }\n            this._disposed = true;\n            this._splitView && this._removeListeners(this._splitView);\n        };\n        SplitViewPaneToggle.prototype._initializeDom = function (root) {\n            if (root.tagName !== \"BUTTON\") {\n                throw new _ErrorFromName(\"WinJS.UI.SplitViewPaneToggle.BadButtonElement\", Strings.badButtonElement);\n            }\n            root[\"winControl\"] = this;\n            _ElementUtilities.addClass(root, ClassNames.splitViewPaneToggle);\n            _ElementUtilities.addClass(root, \"win-disposable\");\n            if (!root.hasAttribute(\"type\")) {\n                root.type = \"button\";\n            }\n            new _KeyboardBehavior._WinKeyboard(root);\n            root.addEventListener(\"click\", this._onClick.bind(this));\n            this._dom = {\n                root: root\n            };\n        };\n        SplitViewPaneToggle.prototype._updateDom = function () {\n            if (!this._initialized || this._disposed) {\n                return;\n            }\n            var rendered = this._updateDom_rendered;\n            if (this._splitView !== rendered.splitView) {\n                if (rendered.splitView) {\n                    this._dom.root.removeAttribute(\"aria-controls\");\n                    this._removeListeners(rendered.splitView);\n                }\n                if (this._splitView) {\n                    _ElementUtilities._ensureId(this._splitView);\n                    this._dom.root.setAttribute(\"aria-controls\", this._splitView.id);\n                    this._addListeners(this._splitView);\n                }\n                rendered.splitView = this._splitView;\n            }\n            // When no SplitView is provided, it's up to the app to manage aria-expanded.\n            if (this._splitView) {\n                // Always update aria-expanded and don't cache its most recently rendered value\n                // in _updateDom_rendered. The reason is that we're not the only ones that update\n                // aria-expanded. aria-expanded may be changed thru UIA APIs. Consequently, if we\n                // cached the last value we set in _updateDom_rendered, it may not reflect the current\n                // value in the DOM.\n                var expanded = this._opened ? \"true\" : \"false\";\n                _ElementUtilities._setAttribute(this._dom.root, \"aria-expanded\", expanded);\n                // The splitView element may not have a winControl associated with it yet in the case\n                // that the SplitViewPaneToggle was constructed before the SplitView. This may happen\n                // when WinJS.UI.processAll is used to construct the controls because the order of construction\n                // depends on the order in which the SplitView and SplitViewPaneToggle appear in the DOM.\n                var splitViewControl = getSplitViewControl(this._splitView);\n                if (splitViewControl) {\n                    splitViewControl.paneOpened = this._opened;\n                }\n            }\n        };\n        SplitViewPaneToggle.prototype._addListeners = function (splitViewElement) {\n            splitViewElement.addEventListener(\"_openCloseStateSettled\", this._onPaneStateSettledBound);\n            this._ariaExpandedMutationObserver.observe(this._dom.root, {\n                attributes: true,\n                attributeFilter: [\"aria-expanded\"]\n            });\n        };\n        SplitViewPaneToggle.prototype._removeListeners = function (splitViewElement) {\n            splitViewElement.removeEventListener(\"_openCloseStateSettled\", this._onPaneStateSettledBound);\n            this._ariaExpandedMutationObserver.disconnect();\n        };\n        SplitViewPaneToggle.prototype._fireEvent = function (eventName) {\n            var eventObject = _Global.document.createEvent(\"CustomEvent\");\n            eventObject.initCustomEvent(eventName, true, false, null);\n            return this._dom.root.dispatchEvent(eventObject);\n        };\n        // Inputs that change the SplitViewPaneToggle's state\n        //\n        SplitViewPaneToggle.prototype._onPaneStateSettled = function (eventObject) {\n            if (eventObject.target === this._splitView) {\n                this._opened = getPaneOpened(this._splitView);\n                this._updateDom();\n            }\n        };\n        // Called by tests.\n        SplitViewPaneToggle.prototype._onAriaExpandedPropertyChanged = function (mutations) {\n            var ariaExpanded = this._dom.root.getAttribute(\"aria-expanded\") === \"true\";\n            this._opened = ariaExpanded;\n            this._updateDom();\n        };\n        SplitViewPaneToggle.prototype._onClick = function (eventObject) {\n            this._invoked();\n        };\n        // Called by tests.\n        SplitViewPaneToggle.prototype._invoked = function () {\n            if (this._disposed) {\n                return;\n            }\n            if (this._splitView) {\n                this._opened = !this._opened;\n                this._updateDom();\n            }\n            this._fireEvent(EventNames.invoked);\n        };\n        SplitViewPaneToggle._ClassNames = ClassNames;\n        SplitViewPaneToggle.supportedForProcessing = true;\n        return SplitViewPaneToggle;\n    })();\n    exports.SplitViewPaneToggle = SplitViewPaneToggle;\n    _Base.Class.mix(SplitViewPaneToggle, _Events.createEventProperties(EventNames.invoked));\n    _Base.Class.mix(SplitViewPaneToggle, _Control.DOMEventMixin);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/SplitViewPaneToggle',[\"require\", \"exports\", '../Core/_Base'], function (require, exports, _Base) {\n    var module = null;\n    _Base.Namespace.define(\"WinJS.UI\", {\n        SplitViewPaneToggle: {\n            get: function () {\n                if (!module) {\n                    require([\"./SplitViewPaneToggle/_SplitViewPaneToggle\"], function (m) {\n                        module = m;\n                    });\n                }\n                return module.SplitViewPaneToggle;\n            }\n        }\n    });\n});\n\ndefine('WinJS/Controls/AppBar/_Constants',[\"require\", \"exports\", \"../CommandingSurface/_Constants\"], function (require, exports, _CommandingSurfaceConstants) {\n    // appbar class names\n    exports.ClassNames = {\n        controlCssClass: \"win-appbar\",\n        disposableCssClass: \"win-disposable\",\n        actionAreaCssClass: \"win-appbar-actionarea\",\n        overflowButtonCssClass: \"win-appbar-overflowbutton\",\n        spacerCssClass: \"win-appbar-spacer\",\n        ellipsisCssClass: \"win-appbar-ellipsis\",\n        overflowAreaCssClass: \"win-appbar-overflowarea\",\n        contentFlyoutCssClass: \"win-appbar-contentflyout\",\n        emptyappbarCssClass: \"win-appbar-empty\",\n        menuCssClass: \"win-menu\",\n        menuContainsToggleCommandClass: \"win-menu-containstogglecommand\",\n        openedClass: \"win-appbar-opened\",\n        closedClass: \"win-appbar-closed\",\n        noneClass: \"win-appbar-closeddisplaynone\",\n        minimalClass: \"win-appbar-closeddisplayminimal\",\n        compactClass: \"win-appbar-closeddisplaycompact\",\n        fullClass: \"win-appbar-closeddisplayfull\",\n        placementTopClass: \"win-appbar-top\",\n        placementBottomClass: \"win-appbar-bottom\",\n    };\n    exports.EventNames = {\n        // AppBar\n        beforeOpen: \"beforeopen\",\n        afterOpen: \"afteropen\",\n        beforeClose: \"beforeclose\",\n        afterClose: \"afterclose\",\n        // AppBarCommand\n        commandPropertyMutated: \"_commandpropertymutated\",\n    };\n    exports.controlMinWidth = _CommandingSurfaceConstants.controlMinWidth;\n    exports.defaultClosedDisplayMode = \"compact\";\n    exports.defaultOpened = false;\n    exports.defaultPlacement = \"bottom\";\n    // Constants for commands\n    exports.typeSeparator = \"separator\";\n    exports.typeContent = \"content\";\n    exports.typeButton = \"button\";\n    exports.typeToggle = \"toggle\";\n    exports.typeFlyout = \"flyout\";\n    exports.commandSelector = \".win-command\";\n    exports.primaryCommandSection = \"primary\";\n    exports.secondaryCommandSection = \"secondary\";\n});\n\n\ndefine('require-style!less/styles-appbar',[],function(){});\ndefine('WinJS/Controls/AppBar/_AppBar',[\"require\", \"exports\", \"../../Core/_Base\", \"../AppBar/_Constants\", \"../CommandingSurface\", \"../../Utilities/_Control\", \"../../Utilities/_Dispose\", \"../../Utilities/_ElementUtilities\", \"../../Core/_ErrorFromName\", '../../Core/_Events', \"../../Core/_Global\", '../../Utilities/_KeyboardInfo', '../../_LightDismissService', '../../Promise', \"../../Core/_Resources\", '../../Utilities/_OpenCloseMachine', \"../../Core/_WriteProfilerMark\"], function (require, exports, _Base, _Constants, _CommandingSurface, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Global, _KeyboardInfo, _LightDismissService, Promise, _Resources, _OpenCloseMachine, _WriteProfilerMark) {\n    require([\"require-style!less/styles-appbar\"]);\n    \"use strict\";\n    var keyboardInfo = _KeyboardInfo._KeyboardInfo;\n    var strings = {\n        get ariaLabel() {\n            return _Resources._getWinJSString(\"ui/appBarAriaLabel\").value;\n        },\n        get overflowButtonAriaLabel() {\n            return _Resources._getWinJSString(\"ui/appBarOverflowButtonAriaLabel\").value;\n        },\n        get mustContainCommands() {\n            return \"The AppBar can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls\";\n        },\n        get duplicateConstruction() {\n            return \"Invalid argument: Controls may only be instantiated one time for each DOM element\";\n        }\n    };\n    var ClosedDisplayMode = {\n        /// <field locid=\"WinJS.UI.AppBar.ClosedDisplayMode.none\" helpKeyword=\"WinJS.UI.AppBar.ClosedDisplayMode.none\">\n        /// When the AppBar is closed, it is not visible and doesn't take up any space.\n        /// </field>\n        none: \"none\",\n        /// <field locid=\"WinJS.UI.AppBar.ClosedDisplayMode.minimal\" helpKeyword=\"WinJS.UI.AppBar.ClosedDisplayMode.minimal\">\n        /// When the AppBar is closed, its height is reduced to the minimal height required to display only its overflowbutton. All other content in the AppBar is not displayed.\n        /// </field>\n        minimal: \"minimal\",\n        /// <field locid=\"WinJS.UI.AppBar.ClosedDisplayMode.compact\" helpKeyword=\"WinJS.UI.AppBar.ClosedDisplayMode.compact\">\n        /// When the AppBar is closed, its height is reduced such that button commands are still visible, but their labels are hidden.\n        /// </field>\n        compact: \"compact\",\n        /// <field locid=\"WinJS.UI.AppBar.ClosedDisplayMode.full\" helpKeyword=\"WinJS.UI.AppBar.ClosedDisplayMode.full\">\n        /// When the AppBar is closed, its height is always sized to content.\n        /// </field>\n        full: \"full\",\n    };\n    var closedDisplayModeClassMap = {};\n    closedDisplayModeClassMap[ClosedDisplayMode.none] = _Constants.ClassNames.noneClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.minimal] = _Constants.ClassNames.minimalClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.compact] = _Constants.ClassNames.compactClass;\n    closedDisplayModeClassMap[ClosedDisplayMode.full] = _Constants.ClassNames.fullClass;\n    var Placement = {\n        /// <field locid=\"WinJS.UI.AppBar.Placement.top\" helpKeyword=\"WinJS.UI.AppBar.Placement.top\">\n        /// The AppBar appears at the top of the main view\n        /// </field>\n        top: \"top\",\n        /// <field locid=\"WinJS.UI.AppBar.Placement.bottom\" helpKeyword=\"WinJS.UI.AppBar.Placement.bottom\">\n        /// The AppBar appears at the bottom of the main view\n        /// </field>\n        bottom: \"bottom\",\n    };\n    var placementClassMap = {};\n    placementClassMap[Placement.top] = _Constants.ClassNames.placementTopClass;\n    placementClassMap[Placement.bottom] = _Constants.ClassNames.placementBottomClass;\n    // Versions of add/removeClass that are no ops when called with falsy class names.\n    function addClass(element, className) {\n        className && _ElementUtilities.addClass(element, className);\n    }\n    function removeClass(element, className) {\n        className && _ElementUtilities.removeClass(element, className);\n    }\n    /// <field>\n    /// <summary locid=\"WinJS.UI.AppBar\">\n    /// Represents an appbar for displaying commands.\n    /// </summary>\n    /// </field>\n    /// <icon src=\"ui_winjs.ui.appbar.12x12.png\" width=\"12\" height=\"12\" />\n    /// <icon src=\"ui_winjs.ui.appbar.16x16.png\" width=\"16\" height=\"16\" />\n    /// <htmlSnippet supportsContent=\"true\"><![CDATA[<div data-win-control=\"WinJS.UI.AppBar\">\n    /// <button data-win-control=\"WinJS.UI.Command\" data-win-options=\"{id:'',label:'example',icon:'back',type:'button',onclick:null,section:'primary'}\"></button>\n    /// </div>]]></htmlSnippet>\n    /// <part name=\"appbar\" class=\"win-appbar\" locid=\"WinJS.UI.AppBar_part:appbar\">The entire AppBar control.</part>\n    /// <part name=\"appbar-overflowbutton\" class=\"win-appbar-overflowbutton\" locid=\"WinJS.UI.AppBar_part:AppBar-overflowbutton\">The appbar overflow button.</part>\n    /// <part name=\"appbar-overflowarea\" class=\"win-appbar-overflowarea\" locid=\"WinJS.UI.AppBar_part:AppBar-overflowarea\">The container for appbar commands that overflow.</part>\n    /// <resource type=\"javascript\" src=\"//WinJS.4.0/js/WinJS.js\" shared=\"true\" />\n    /// <resource type=\"css\" src=\"//WinJS.4.0/css/ui-dark.css\" shared=\"true\" />\n    var AppBar = (function () {\n        function AppBar(element, options) {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.AppBar\">\n            /// <summary locid=\"WinJS.UI.AppBar.constructor\">\n            /// Creates a new AppBar control.\n            /// </summary>\n            /// <param name=\"element\" type=\"HTMLElement\" domElement=\"true\" locid=\"WinJS.UI.AppBar.constructor_p:element\">\n            /// The DOM element that will host the control.\n            /// </param>\n            /// <param name=\"options\" type=\"Object\" locid=\"WinJS.UI.AppBar.constructor_p:options\">\n            /// The set of properties and values to apply to the new AppBar control.\n            /// </param>\n            /// <returns type=\"WinJS.UI.AppBar\" locid=\"WinJS.UI.AppBar.constructor_returnValue\">\n            /// The new AppBar control.\n            /// </returns>\n            /// </signature>\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            // State private to the _updateDomImpl family of method. No other methods should make use of it.\n            //\n            // Nothing has been rendered yet so these are all initialized to undefined. Because\n            // they are undefined, the first time _updateDomImpl is called, they will all be\n            // rendered.\n            this._updateDomImpl_renderedState = {\n                isOpenedMode: undefined,\n                placement: undefined,\n                closedDisplayMode: undefined,\n                adjustedOffsets: { top: undefined, bottom: undefined },\n            };\n            this._writeProfilerMark(\"constructor,StartTM\");\n            // Check to make sure we weren't duplicated\n            if (element && element[\"winControl\"]) {\n                throw new _ErrorFromName(\"WinJS.UI.AppBar.DuplicateConstruction\", strings.duplicateConstruction);\n            }\n            this._initializeDom(element || _Global.document.createElement(\"div\"));\n            var stateMachine = new _OpenCloseMachine.OpenCloseMachine({\n                eventElement: this.element,\n                onOpen: function () {\n                    var openAnimation = _this._commandingSurface.createOpenAnimation(_this._getClosedHeight());\n                    // We're temporarily setting the AppBar's style from position=-ms-device-fixed to fixed to work around an animations bug in IE, \n                    // where two AppBars will end up being rendered when animating instead of one.\n                    // We need to recalculate our offsets relative to the top and bottom of the visible document because position fixed elements use layout viewport coordinates \n                    // while position -ms-device-fixed use visual viewport coordinates.This difference in coordinate systems is especially pronounced if the IHM has caused the visual viewport to resize.\n                    _this.element.style.position = \"fixed\";\n                    if (_this._placement === AppBar.Placement.top) {\n                        _this.element.style.top = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocTop + \"px\";\n                    }\n                    else {\n                        _this.element.style.bottom = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocBottom + \"px\";\n                    }\n                    _this._synchronousOpen();\n                    return openAnimation.execute().then(function () {\n                        _this.element.style.position = \"\";\n                        _this.element.style.top = _this._adjustedOffsets.top;\n                        _this.element.style.bottom = _this._adjustedOffsets.bottom;\n                    });\n                },\n                onClose: function () {\n                    var closeAnimation = _this._commandingSurface.createCloseAnimation(_this._getClosedHeight());\n                    // We're temporarily setting the AppBar's style from position=-ms-device-fixed to fixed to work around an animations bug in IE, \n                    // where two AppBars will end up being rendered when animating instead of one.\n                    // We need to recalculate our offsets relative to the top and bottom of the visible document because position fixed elements use layout viewport coordinates \n                    // while position -ms-device-fixed use visual viewport coordinates.This difference in coordinate systems is especially pronounced if the IHM has caused the visual viewport to resize.\n                    _this.element.style.position = \"fixed\";\n                    if (_this._placement === AppBar.Placement.top) {\n                        _this.element.style.top = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocTop + \"px\";\n                    }\n                    else {\n                        _this.element.style.bottom = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocBottom + \"px\";\n                    }\n                    return closeAnimation.execute().then(function () {\n                        _this._synchronousClose();\n                        _this.element.style.position = \"\";\n                        _this.element.style.top = _this._adjustedOffsets.top;\n                        _this.element.style.bottom = _this._adjustedOffsets.bottom;\n                    });\n                },\n                onUpdateDom: function () {\n                    _this._updateDomImpl();\n                },\n                onUpdateDomWithIsOpened: function (isOpened) {\n                    _this._isOpenedMode = isOpened;\n                    _this._updateDomImpl();\n                }\n            });\n            // Events\n            this._handleShowingKeyboardBound = this._handleShowingKeyboard.bind(this);\n            this._handleHidingKeyboardBound = this._handleHidingKeyboard.bind(this);\n            _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, \"showing\", this._handleShowingKeyboardBound);\n            _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, \"hiding\", this._handleHidingKeyboardBound);\n            // Initialize private state.\n            this._disposed = false;\n            this._cachedClosedHeight = null;\n            this._commandingSurface = new _CommandingSurface._CommandingSurface(this._dom.commandingSurfaceEl, { openCloseMachine: stateMachine });\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-actionarea\"), _Constants.ClassNames.actionAreaCssClass);\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-overflowarea\"), _Constants.ClassNames.overflowAreaCssClass);\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-overflowbutton\"), _Constants.ClassNames.overflowButtonCssClass);\n            addClass(this._dom.commandingSurfaceEl.querySelector(\".win-commandingsurface-ellipsis\"), _Constants.ClassNames.ellipsisCssClass);\n            this._isOpenedMode = _Constants.defaultOpened;\n            this._dismissable = new _LightDismissService.LightDismissableElement({\n                element: this._dom.root,\n                tabIndex: this._dom.root.hasAttribute(\"tabIndex\") ? this._dom.root.tabIndex : -1,\n                onLightDismiss: function () {\n                    _this.close();\n                }\n            });\n            // Initialize public properties.\n            this.closedDisplayMode = _Constants.defaultClosedDisplayMode;\n            this.placement = _Constants.defaultPlacement;\n            this.opened = this._isOpenedMode;\n            _Control.setOptions(this, options);\n            // Exit the Init state.\n            _ElementUtilities._inDom(this.element).then(function () {\n                return _this._commandingSurface.initialized;\n            }).then(function () {\n                stateMachine.exitInit();\n                _this._writeProfilerMark(\"constructor,StopTM\");\n            });\n        }\n        Object.defineProperty(AppBar.prototype, \"element\", {\n            /// <field type=\"HTMLElement\" domElement=\"true\" hidden=\"true\" locid=\"WinJS.UI.AppBar.element\" helpKeyword=\"WinJS.UI.AppBar.element\">\n            /// Gets the DOM element that hosts the AppBar.\n            /// </field>\n            get: function () {\n                return this._dom.root;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(AppBar.prototype, \"data\", {\n            /// <field type=\"WinJS.Binding.List\" locid=\"WinJS.UI.AppBar.data\" helpKeyword=\"WinJS.UI.AppBar.data\">\n            /// Gets or sets the Binding List of WinJS.UI.Command for the AppBar.\n            /// </field>\n            get: function () {\n                return this._commandingSurface.data;\n            },\n            set: function (value) {\n                this._commandingSurface.data = value;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(AppBar.prototype, \"closedDisplayMode\", {\n            /// <field type=\"String\" locid=\"WinJS.UI.AppBar.closedDisplayMode\" helpKeyword=\"WinJS.UI.AppBar.closedDisplayMode\">\n            /// Gets or sets the closedDisplayMode for the AppBar. Values are \"none\", \"minimal\", \"compact\" and \"full\".\n            /// </field>\n            get: function () {\n                return this._commandingSurface.closedDisplayMode;\n            },\n            set: function (value) {\n                if (ClosedDisplayMode[value]) {\n                    this._commandingSurface.closedDisplayMode = value;\n                    this._cachedClosedHeight = null;\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(AppBar.prototype, \"placement\", {\n            /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI.AppBar.placement\" helpKeyword=\"WinJS.UI.AppBar.placement\">\n            /// Gets or sets a value that specifies whether the AppBar appears at the top or bottom of the main view.\n            /// </field>\n            get: function () {\n                return this._placement;\n            },\n            set: function (value) {\n                if (Placement[value] && this._placement !== value) {\n                    this._placement = value;\n                    switch (value) {\n                        case Placement.top:\n                            this._commandingSurface.overflowDirection = \"bottom\";\n                            break;\n                        case Placement.bottom:\n                            this._commandingSurface.overflowDirection = \"top\";\n                            break;\n                    }\n                    this._adjustedOffsets = this._computeAdjustedOffsets();\n                    this._commandingSurface.deferredDomUpate();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(AppBar.prototype, \"opened\", {\n            /// <field type=\"Boolean\" hidden=\"true\" locid=\"WinJS.UI.AppBar.opened\" helpKeyword=\"WinJS.UI.AppBar.opened\">\n            /// Gets or sets whether the AppBar is currently opened.\n            /// </field>\n            get: function () {\n                return this._commandingSurface.opened;\n            },\n            set: function (value) {\n                this._commandingSurface.opened = value;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        AppBar.prototype.open = function () {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.open\">\n            /// <summary locid=\"WinJS.UI.AppBar.open\">\n            /// Opens the AppBar\n            /// </summary>\n            /// </signature>\n            this._commandingSurface.open();\n        };\n        AppBar.prototype.close = function () {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.close\">\n            /// <summary locid=\"WinJS.UI.AppBar.close\">\n            /// Closes the AppBar\n            /// </summary>\n            /// </signature>\n            this._commandingSurface.close();\n        };\n        AppBar.prototype.dispose = function () {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.dispose\">\n            /// <summary locid=\"WinJS.UI.AppBar.dispose\">\n            /// Disposes this AppBar.\n            /// </summary>\n            /// </signature>\n            if (this._disposed) {\n                return;\n            }\n            this._disposed = true;\n            _LightDismissService.hidden(this._dismissable);\n            // Disposing the _commandingSurface will trigger dispose on its OpenCloseMachine\n            // and synchronously complete any animations that might have been running.\n            this._commandingSurface.dispose();\n            _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, \"showing\", this._handleShowingKeyboardBound);\n            _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, \"hiding\", this._handleHidingKeyboardBound);\n            _Dispose.disposeSubTree(this.element);\n        };\n        AppBar.prototype.forceLayout = function () {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.forceLayout\">\n            /// <summary locid=\"WinJS.UI.AppBar.forceLayout\">\n            /// Forces the AppBar to update its layout. Use this function when the window did not change size, but the container of the AppBar changed size.\n            /// </summary>\n            /// </signature>\n            this._commandingSurface.forceLayout();\n        };\n        AppBar.prototype.getCommandById = function (id) {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.getCommandById\">\n            /// <summary locid=\"WinJS.UI.AppBar.getCommandById\">\n            /// Retrieves the command with the specified ID from this AppBar.\n            /// If more than one command is found, this method returns the first command found.\n            /// </summary>\n            /// <param name=\"id\" type=\"String\" locid=\"WinJS.UI.AppBar.getCommandById_p:id\">Id of the command to return.</param>\n            /// <returns type=\"object\" locid=\"WinJS.UI.AppBar.getCommandById_returnValue\">\n            /// The command found, or null if no command is found.\n            /// </returns>\n            /// </signature>\n            return this._commandingSurface.getCommandById(id);\n        };\n        AppBar.prototype.showOnlyCommands = function (commands) {\n            /// <signature helpKeyword=\"WinJS.UI.AppBar.showOnlyCommands\">\n            /// <summary locid=\"WinJS.UI.AppBar.showOnlyCommands\">\n            /// Show the specified commands, hiding all of the others in the AppBar.\n            /// </summary>\n            /// <param name=\"commands\" type=\"Array\" locid=\"WinJS.UI.AppBar.showOnlyCommands_p:commands\">\n            /// An array of the commands to show. The array elements may be Command objects, or the string identifiers (IDs) of commands.\n            /// </param>\n            /// </signature>\n            return this._commandingSurface.showOnlyCommands(commands);\n        };\n        AppBar.prototype._writeProfilerMark = function (text) {\n            _WriteProfilerMark(\"WinJS.UI.AppBar:\" + this._id + \":\" + text);\n        };\n        AppBar.prototype._initializeDom = function (root) {\n            this._writeProfilerMark(\"_intializeDom,info\");\n            // Attaching JS control to DOM element\n            root[\"winControl\"] = this;\n            this._id = root.id || _ElementUtilities._uniqueID(root);\n            _ElementUtilities.addClass(root, _Constants.ClassNames.controlCssClass);\n            _ElementUtilities.addClass(root, _Constants.ClassNames.disposableCssClass);\n            // Make sure we have an ARIA role\n            var role = root.getAttribute(\"role\");\n            if (!role) {\n                root.setAttribute(\"role\", \"menubar\");\n            }\n            var label = root.getAttribute(\"aria-label\");\n            if (!label) {\n                root.setAttribute(\"aria-label\", strings.ariaLabel);\n            }\n            // Create element for commandingSurface and reparent any declarative Commands.\n            // commandingSurface will parse child elements as AppBarCommands.\n            var commandingSurfaceEl = document.createElement(\"DIV\");\n            _ElementUtilities._reparentChildren(root, commandingSurfaceEl);\n            root.appendChild(commandingSurfaceEl);\n            this._dom = {\n                root: root,\n                commandingSurfaceEl: commandingSurfaceEl,\n            };\n        };\n        AppBar.prototype._handleShowingKeyboard = function (event) {\n            // If the IHM resized the window, we can rely on -ms-device-fixed positioning to remain visible.\n            // If the IHM does not resize the window we will need to adjust our offsets to avoid being occluded\n            // The IHM does not cause a window resize to happen right away, set a timeout to check if the viewport\n            // has been resized after enough time has passed for both the IHM animation, and scroll-into-view, to\n            // complete.\n            var _this = this;\n            // If focus is in the AppBar, tell the platform we will move ourselves.\n            if (this._dom.root.contains(_Global.document.activeElement)) {\n                var inputPaneEvent = event.detail.originalEvent;\n                inputPaneEvent.ensuredFocusedElementInView = true;\n            }\n            var duration = keyboardInfo._animationShowLength + keyboardInfo._scrollTimeout;\n            // Returns a promise for unit tests to verify the correct behavior after the timeout.\n            return Promise.timeout(duration).then(function () {\n                if (_this._shouldAdjustForShowingKeyboard() && !_this._disposed) {\n                    _this._adjustedOffsets = _this._computeAdjustedOffsets();\n                    _this._commandingSurface.deferredDomUpate();\n                }\n            });\n        };\n        AppBar.prototype._shouldAdjustForShowingKeyboard = function () {\n            // Overwriteable for unit tests\n            // Determines if an AppBar needs to adjust its position to move in response to a shown IHM, or if it can\n            // just ride the bottom of the visual viewport to remain visible. The latter requires that the IHM has\n            // caused the viewport to resize.\n            return keyboardInfo._visible && !keyboardInfo._isResized;\n        };\n        AppBar.prototype._handleHidingKeyboard = function () {\n            // Make sure AppBar has the correct offsets since it could have been displaced by the IHM.\n            this._adjustedOffsets = this._computeAdjustedOffsets();\n            this._commandingSurface.deferredDomUpate();\n        };\n        AppBar.prototype._computeAdjustedOffsets = function () {\n            // Position the AppBar element relative to the top or bottom edge of the visible\n            // document.\n            var offsets = { top: \"\", bottom: \"\" };\n            if (this._placement === Placement.bottom) {\n                // If the IHM is open, the bottom of the visual viewport may or may not be occluded\n                offsets.bottom = keyboardInfo._visibleDocBottomOffset + \"px\";\n            }\n            else if (this._placement === Placement.top) {\n                offsets.top = keyboardInfo._visibleDocTop + \"px\";\n            }\n            return offsets;\n        };\n        AppBar.prototype._synchronousOpen = function () {\n            this._isOpenedMode = true;\n            this._updateDomImpl();\n        };\n        AppBar.prototype._synchronousClose = function () {\n            this._isOpenedMode = false;\n            this._updateDomImpl();\n        };\n        AppBar.prototype._updateDomImpl = function () {\n            var rendered = this._updateDomImpl_renderedState;\n            if (rendered.isOpenedMode !== this._isOpenedMode) {\n                if (this._isOpenedMode) {\n                    this._updateDomImpl_renderOpened();\n                }\n                else {\n                    this._updateDomImpl_renderClosed();\n                }\n                rendered.isOpenedMode = this._isOpenedMode;\n            }\n            if (rendered.placement !== this.placement) {\n                removeClass(this._dom.root, placementClassMap[rendered.placement]);\n                addClass(this._dom.root, placementClassMap[this.placement]);\n                rendered.placement = this.placement;\n            }\n            if (rendered.closedDisplayMode !== this.closedDisplayMode) {\n                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);\n                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);\n                rendered.closedDisplayMode = this.closedDisplayMode;\n            }\n            if (rendered.adjustedOffsets.top !== this._adjustedOffsets.top) {\n                this._dom.root.style.top = this._adjustedOffsets.top;\n                rendered.adjustedOffsets.top = this._adjustedOffsets.top;\n            }\n            if (rendered.adjustedOffsets.bottom !== this._adjustedOffsets.bottom) {\n                this._dom.root.style.bottom = this._adjustedOffsets.bottom;\n                rendered.adjustedOffsets.bottom = this._adjustedOffsets.bottom;\n            }\n            this._commandingSurface.updateDomImpl();\n        };\n        AppBar.prototype._getClosedHeight = function () {\n            if (this._cachedClosedHeight === null) {\n                var wasOpen = this._isOpenedMode;\n                if (this._isOpenedMode) {\n                    this._synchronousClose();\n                }\n                this._cachedClosedHeight = this._commandingSurface.getBoundingRects().commandingSurface.height;\n                if (wasOpen) {\n                    this._synchronousOpen();\n                }\n            }\n            return this._cachedClosedHeight;\n        };\n        AppBar.prototype._updateDomImpl_renderOpened = function () {\n            addClass(this._dom.root, _Constants.ClassNames.openedClass);\n            removeClass(this._dom.root, _Constants.ClassNames.closedClass);\n            this._commandingSurface.synchronousOpen();\n            _LightDismissService.shown(this._dismissable); // Call at the start of the open animation\n        };\n        AppBar.prototype._updateDomImpl_renderClosed = function () {\n            addClass(this._dom.root, _Constants.ClassNames.closedClass);\n            removeClass(this._dom.root, _Constants.ClassNames.openedClass);\n            this._commandingSurface.synchronousClose();\n            _LightDismissService.hidden(this._dismissable); // Call after the close animation\n        };\n        /// <field locid=\"WinJS.UI.AppBar.ClosedDisplayMode\" helpKeyword=\"WinJS.UI.AppBar.ClosedDisplayMode\">\n        /// Display options for the AppBar when closed.\n        /// </field>\n        AppBar.ClosedDisplayMode = ClosedDisplayMode;\n        /// <field locid=\"WinJS.UI.AppBar.Placement\" helpKeyword=\"WinJS.UI.AppBar.Placement\">\n        /// Display options for AppBar placement in relation to the main view.\n        /// </field>\n        AppBar.Placement = Placement;\n        AppBar.supportedForProcessing = true;\n        return AppBar;\n    })();\n    exports.AppBar = AppBar;\n    _Base.Class.mix(AppBar, _Events.createEventProperties(_Constants.EventNames.beforeOpen, _Constants.EventNames.afterOpen, _Constants.EventNames.beforeClose, _Constants.EventNames.afterClose));\n    // addEventListener, removeEventListener, dispatchEvent\n    _Base.Class.mix(AppBar, _Control.DOMEventMixin);\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\n/// <reference path=\"../../../../typings/require.d.ts\" />\ndefine('WinJS/Controls/AppBar',[\"require\", \"exports\", '../Core/_Base'], function (require, exports, _Base) {\n    var module = null;\n    _Base.Namespace.define(\"WinJS.UI\", {\n        AppBar: {\n            get: function () {\n                if (!module) {\n                    require([\"./AppBar/_AppBar\"], function (m) {\n                        module = m;\n                    });\n                }\n                return module.AppBar;\n            }\n        }\n    });\n});\n\n// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.\ndefine('ui',[\n    'WinJS/Core/_WinJS',\n    'WinJS/VirtualizedDataSource',\n    'WinJS/Controls/IntrinsicControls',\n    'WinJS/Controls/ListView',\n    'WinJS/Controls/FlipView',\n    'WinJS/Controls/ItemContainer',\n    'WinJS/Controls/Repeater',\n    'WinJS/Controls/DatePicker',\n    'WinJS/Controls/TimePicker',\n    'WinJS/Controls/BackButton',\n    'WinJS/Controls/Rating',\n    'WinJS/Controls/ToggleSwitch',\n    'WinJS/Controls/SemanticZoom',\n    'WinJS/Controls/Pivot',\n    'WinJS/Controls/Hub',\n    'WinJS/Controls/Flyout',\n    'WinJS/Controls/_LegacyAppBar',\n    'WinJS/Controls/Menu',\n    'WinJS/Controls/SearchBox',\n    'WinJS/Controls/SettingsFlyout',\n    'WinJS/Controls/NavBar',\n    'WinJS/Controls/Tooltip',\n    'WinJS/Controls/ViewBox',\n    'WinJS/Controls/ContentDialog',\n    'WinJS/Controls/SplitView',\n    'WinJS/Controls/SplitViewPaneToggle',\n    'WinJS/Controls/ToolBar',\n    'WinJS/Controls/AppBar',\n    ], function (_WinJS) {\n    \"use strict\";\n\n    return _WinJS;\n});\n\n        require(['WinJS/Core/_WinJS', 'ui'], function (_WinJS) {\n            // WinJS always publishes itself to global\n            globalObject.WinJS = _WinJS;\n            if (typeof module !== 'undefined') {\n                // This is a CommonJS context so publish to exports\n                module.exports = _WinJS;\n            }\n        });\n        return globalObject.WinJS;\n    }));\n}());\n\n"
  },
  {
    "path": "templates/winjs/template/source/package.appxmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"e9d48192-1008-49be-8a59-932a3ef1a1ca\"\n    Version=\"::APP_VERSION::.::APP_BUILD_NUMBER::\"\n    Publisher=\"CN=Braden\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"e9d48192-1008-49be-8a59-932a3ef1a1ca\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\" />\n\n  <Properties>\n    <DisplayName>::APP_TITLE::</DisplayName>\n    <PublisherDisplayName>::APP_COMPANY::</PublisherDisplayName>\n    <Logo>images\\storelogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\" />\n  </Resources>\n\n  <Applications>\n    <Application \n      Id=\"App\"\n      StartPage=\"index.html\">\n\n      <uap:VisualElements\n        DisplayName=\"::APP_TITLE::\"\n        Description=\"::APP_DESCRIPTION::\"\n        BackgroundColor=\"transparent\"\n        Square150x150Logo=\"images\\Square150x150Logo.png\"\n        Square44x44Logo=\"images\\Square44x44Logo.png\">\n\n        <uap:DefaultTile Wide310x150Logo=\"images\\Wide310x150Logo.png\" />\n        <uap:SplashScreen Image=\"images\\splashscreen.png\" />\n\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n\n</Package>\n"
  },
  {
    "path": "templates/winjs/template/source/uwp-project.jsproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|AnyCPU\">\n      <Configuration>Debug</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x86\">\n      <Configuration>Debug</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|AnyCPU\">\n      <Configuration>Release</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM</Platform>\n      <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n      <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x86\">\n      <Configuration>Release</Configuration>\n      <Platform>x86</Platform>\n      <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>e9d48192-1008-49be-8a59-932a3ef1a1ca</ProjectGuid>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup Condition=\"'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0'\">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\$(WMSJSProjectDirectory)\\Microsoft.VisualStudio.$(WMSJSProject).Default.props\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\$(WMSJSProjectDirectory)\\Microsoft.VisualStudio.$(WMSJSProject).props\" />\n  <PropertyGroup>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.15063.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.10586.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>$(VersionNumberMajor).$(VersionNumberMinor)</MinimumVisualStudioVersion>\n    <DefaultLanguage>en-US</DefaultLanguage>\n\n    <PackageCertificateKeyFile>::APP_FILE::_TemporaryKey.pfx</PackageCertificateKeyFile>\n\n  </PropertyGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <Content Include=\"index.html\" />\n    <Content Include=\"*.js\" />\n    <Content Include=\"images\\**\\*.*\" />\n    <Content Include=\"js\\**\\*.*\" />\n    <Content Include=\"fonts\\**\\*.*\" />\n    <Content Include=\"sounds\\**\\*.*\" />\n    <Content Include=\"images\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"images\\SplashScreen.scale-200.png\" />\n    <Content Include=\"images\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"images\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"images\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"images\\StoreLogo.png\" />\n    <Content Include=\"images\\Wide310x150Logo.scale-200.png\" />\n    <Content Include=\"js\\main.js\" />\n    <Content Include=\"css\\default.css\" />\n    <Content Include=\"lib\\winjs-4.0.1\\js\\base.js\" />\n    <Content Include=\"lib\\winjs-4.0.1\\js\\ui.js\" />\n    <Content Include=\"lib\\winjs-4.0.1\\css\\ui-light.css\" />\n    <Content Include=\"lib\\winjs-4.0.1\\css\\ui-dark.css\" />\n    <Content Include=\"lib\\winjs-4.0.1\\fonts\\Symbols.ttf\" />\n\n    <None Include=\"::APP_FILE::_TemporaryKey.pfx\" />\n\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\$(WMSJSProjectDirectory)\\Microsoft.VisualStudio.$(WMSJSProject).targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below then uncomment\n       that target and the DisableFastUpToDateCheck PropertyGroup.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n\n  <PropertyGroup>\n    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>\n  </PropertyGroup>\n  -->\n</Project>"
  },
  {
    "path": "templates/winjs/template/uwp-project.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26430.16\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{262852C6-CD72-467D-83FE-5EEB1973A190}\") = \"::APP_FILE::\", \"source\\::APP_FILE::.jsproj\", \"{E9D48192-1008-49BE-8A59-932A3EF1A1CA}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|x64.Build.0 = Debug|x64\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|x86.Build.0 = Debug|x86\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|Any CPU.Deploy.0 = Release|Any CPU\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|ARM.Build.0 = Release|ARM\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|x64.ActiveCfg = Release|x64\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|x64.Build.0 = Release|x64\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|x64.Deploy.0 = Release|x64\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|x86.ActiveCfg = Release|x86\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|x86.Build.0 = Release|x86\n\t\t{E9D48192-1008-49BE-8A59-932A3EF1A1CA}.Release|x86.Deploy.0 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "templates/winrt/appx/AppxManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\" xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\" IgnorableNamespaces=\"uap mp build\" xmlns:build=\"http://schemas.microsoft.com/developer/appx/2015/build\">\n  <Identity Name=\"::meta.packageName::\" Publisher=\"CN=::meta.company::\" Version=\"::meta.version::.0\" ProcessorArchitecture=\"x64\" />\n  <!--<mp:PhoneIdentity PhoneProductId=\"3b8b2495-3f10-49e7-8eaa-23a7f45cd13d\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\" />-->\n  <Properties>\n    <DisplayName>::meta.title::</DisplayName>\n    <PublisherDisplayName>::meta.company::</PublisherDisplayName>\n    <Logo>assetspkg\\StoreLogo.png</Logo>\n  </Properties>\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.14393.0\" MaxVersionTested=\"10.0.15063.400\" />\n    <PackageDependency Name=\"Microsoft.VCLibs.140.00\" MinVersion=\"10.0.14393.0\" Publisher=\"CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US\" />\n    \n  </Dependencies>\n  <Resources>\n    <Resource Language=\"EN-US\" />\n  </Resources>\n  <Applications>\n    <Application Id=\"App\" Executable=\"::APP_FILE::.exe\" EntryPoint=\"::APP_FILE::.App\">\n      <uap:VisualElements DisplayName=\"::meta.title::\" Square150x150Logo=\"assetspkg\\Square150x150Logo.scale-200.png\" Square44x44Logo=\"assetspkg\\Square44x44Logo.scale-200.png\" Description=\"Displaying a Bitmap\" BackgroundColor=\"transparent\">\n        <uap:DefaultTile Wide310x150Logo=\"assetspkg\\Wide310x150Logo.scale-200.png\" />\n        <uap:SplashScreen Image=\"assetspkg\\SplashScreen.scale-200.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n  <Capabilities>\n    \n  </Capabilities>\n</Package>\n"
  },
  {
    "path": "templates/winrt/hxml/debug.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cpp ::CPP_DIR::\n-cp ::OUTPUT_DIR::/haxe\n--macro keep(\"::APP_MAIN::\")\n-D winrt\n-debug\n"
  },
  {
    "path": "templates/winrt/hxml/final.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D winrt\n-D final\n"
  },
  {
    "path": "templates/winrt/hxml/release.hxml",
    "content": "-main ApplicationMain ::HAXE_FLAGS::\n-cp ::OUTPUT_DIR::/haxe\n-cpp ::CPP_DIR::\n--macro keep(\"::APP_MAIN::\")\n-D winrt\n"
  },
  {
    "path": "templates/winrt/scripts/newcertificate.ps1",
    "content": "Get-ChildItem cert:\\LocalMachine\\My | Where-Object { $_.Subject -match \"CN=::if APP_COMPANYID::APP_COMPANYID::else::OpenFL_Example::end::\" } | Remove-Item\nNew-SelfSignedCertificate -Type Custom -Subject \"CN=::if APP_COMPANYID::APP_COMPANYID::else::OpenFL_Example::end::\" -KeyUsage DigitalSignature -FriendlyName OpenFLDisplayingCert -CertStoreLocation \"Cert:\\LocalMachine\\My\"\n#Get-ChildItem cert:\\LocalMachine\\My | Where-Object { $_.Subject -match \"CN=::if APP_COMPANYID::APP_COMPANYID::else::OpenFL_Example::end::\" }\n$pwd = ConvertTo-SecureString -String ::if APP_CERTIFICATE_PWD::APP_CERTIFICATE_PWD::else::\"openflexample\"::end:: -Force -AsPlainText \n$thumbprint=(dir cert:\\localmachine\\My -recurse | where {$_.Subject -match \"CN=::if APP_COMPANYID::APP_COMPANYID::else::OpenFL_Example::end::\"} ).Thumbprint;\nExport-PfxCertificate -cert \"Cert:\\LocalMachine\\My\\$thumbprint\" -FilePath ::APP_FILE::.pfx -Password $pwd\n"
  },
  {
    "path": "templates/winrt/static/BuildMain.xml",
    "content": "<xml>\n\n\t<include name=\"${HXCPP}/build-tool/BuildCommon.xml\" />\n\n\t<files id=\"main\">\n\n\t\t<file name=\"Main.cpp\" />\n\n\t</files>\n\n\t<target id=\"main\" output=\"Main${DBG}\" tool=\"linker\" toolid=\"exe\">\n\n\t\t<files id=\"main\" />\n\n\t\t::foreach ndlls::\n\t\t<lib name=\"::path::\" />::end::\n\n\t\t<section if=\"winrt\">\n\t\t        <lib name=\"kernel32.lib\" />\n\t\t        <lib name=\"d3d11.lib\" />\n\t\t        <lib name=\"Xaudio2.lib\" />\n\t\t        <lib name=\"Xinput.lib\" />\n\t\t        <lib name=\"DXGI.lib\" />\n\t\t        <lib name=\"Dwrite.lib\" />\n\t\t        <lib name=\"D3dcompiler.lib\" />\n\n\t\t</section>\n\n\n\t\t<lib name=\"libApplicationMain${DBG}${LIBEXT}\" />\n\n\t</target>\n\n\t<target id=\"default\">\n\n\t\t<target id=\"main\" />\n\n\t</target>\n\n</xml>\n"
  },
  {
    "path": "templates/winrt/static/Main.cpp",
    "content": "#include <stdbool.h>\n\n#define DECLSPEC __declspec(dllexport)\n#define SDLCALL __cdecl\n#ifdef _MSC_VER\n#pragma warning(disable:4103)\n#pragma warning(disable:4447)\n#endif\n#pragma pack(push,8)\nextern \"C\" {\nextern DECLSPEC int SDLCALL SDL_WinRTRunApp(int (*mainFunction)(int, char **), void * reserved);\n}\n#pragma pack(pop)\n\n#include <hxcpp.h>\n#include <wrl.h>\n\n#ifdef main\n#undef main\n#endif\n#ifndef __WINRT__\n#define __WINRT__\n#endif\n#ifndef SDL_BUILDING_WINRT\n#define SDL_BUILDING_WINRT 1\n#endif\n\n#define LIME_SDL\n#define LIME_OPENGL\n#define LIME_CAIRO\n#define NATIVE_TOOLKIT_SDL_ANGLE\n\n#ifndef SDL_WINRT_METADATA_FILE_AVAILABLE\n#ifndef __cplusplus_winrt\n#error Main.cpp must be compiled with /ZW, otherwise build errors due to missing .winmd files can occur.\n#endif\n#endif\n\n#ifdef _MSC_VER\n#pragma comment(lib, \"runtimeobject.lib\")\n#endif\n\n#define DEBUG_PRINTF\n#ifdef DEBUG_PRINTF\n# ifdef UNICODE\n#  define DLOG(fmt, ...) {wchar_t buf[1024];swprintf(buf,L\"****LOG: %s(%d): %s \\n    [\" fmt \"]\\n\",__FILE__,__LINE__,__FUNCTION__, __VA_ARGS__);OutputDebugString(buf);}\n# else\n#  define DLOG(fmt, ...) {char buf[1024];sprintf(buf,\"****LOG: %s(%d): %s \\n    [\" fmt \"]\\n\",__FILE__,__LINE__,__FUNCTION__, __VA_ARGS__);OutputDebugString(buf);}\n# endif\n#else\n# define DLOG(fmt, ...) {}\n#endif\n\nextern \"C\" const char *hxRunLibrary ();\nextern \"C\" void hxcpp_set_top_of_stack ();\nextern \"C\" int zlib_register_prims ();\nextern \"C\" int lime_cairo_register_prims ();\n::foreach ndlls::::if (registerStatics)::\nextern \"C\" int ::nameSafe::_register_prims ();::end::::end::\n\n\t\t\t\t\t\t\t\t\t\t\nint _main(int argc, char *argv[])\n{\n   //DLOG(\"HELLO WORLD\");\n   //Sleep(10000);  //uncomment to attach here in debugger\n   //DLOG(\"HELLO WORLD2\");\n\n   try\n   {\n        hxcpp_set_top_of_stack ();  \n        zlib_register_prims ();\n        lime_cairo_register_prims ();\n        ::foreach ndlls::::if (registerStatics)::\n        ::nameSafe::_register_prims ();::end::::end::\n        \n        const char *err = NULL;\n        err = hxRunLibrary ();\n        if (err) {            \n            DLOG(\"Error: %s\\n\", err);\n        }\n   }\n   catch (Dynamic e)\n   {\n       DLOG(\"Main Error\\n\",);\n//      __hx_dump_stack();\n       return -1;\n   }\n   return 0;\n}\n\nint CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)\n{ \n   SDL_WinRTRunApp(_main, NULL);\n   return 0;\n}\n\n"
  },
  {
    "path": "templates/winrt/temp/embed.resfiles",
    "content": ""
  },
  {
    "path": "templates/winrt/temp/layout.resfiles",
    "content": "//generate this file\n"
  },
  {
    "path": "templates/winrt/temp/pri.resfiles",
    "content": ""
  },
  {
    "path": "templates/winrt/temp/priconfig.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources targetOsVersion=\"10.0.0\" majorVersion=\"1\">\n  <index root=\"\\\" startIndexAt=\"layout.resfiles\">\n    <default>\n      <qualifier name=\"Language\" value=\"en-US\" />\n      <qualifier name=\"Contrast\" value=\"standard\" />\n      <qualifier name=\"Scale\" value=\"200\" />\n      <qualifier name=\"HomeRegion\" value=\"001\" />\n      <qualifier name=\"TargetSize\" value=\"256\" />\n      <qualifier name=\"LayoutDirection\" value=\"LTR\" />\n      <qualifier name=\"DXFeatureLevel\" value=\"DX9\" />\n      <qualifier name=\"Configuration\" value=\"\" />\n      <qualifier name=\"AlternateForm\" value=\"\" />\n      <qualifier name=\"Platform\" value=\"UAP\" />\n    </default>\n    <indexer-config type=\"RESFILES\" qualifierDelimiter=\".\" />\n  </index>\n  <index root=\"\\\" startIndexAt=\"resources.resfiles\">\n    <default>\n      <qualifier name=\"Language\" value=\"en-US\" />\n      <qualifier name=\"Contrast\" value=\"standard\" />\n      <qualifier name=\"Scale\" value=\"200\" />\n      <qualifier name=\"HomeRegion\" value=\"001\" />\n      <qualifier name=\"TargetSize\" value=\"256\" />\n      <qualifier name=\"LayoutDirection\" value=\"LTR\" />\n      <qualifier name=\"DXFeatureLevel\" value=\"DX9\" />\n      <qualifier name=\"Configuration\" value=\"\" />\n      <qualifier name=\"AlternateForm\" value=\"\" />\n      <qualifier name=\"Platform\" value=\"UAP\" />\n    </default>\n    <indexer-config type=\"RESW\" convertDotsToSlashes=\"true\" />\n    <indexer-config type=\"RESJSON\" />\n    <indexer-config type=\"RESFILES\" qualifierDelimiter=\".\" />\n  </index>\n  <index root=\"\\\" startIndexAt=\"pri.resfiles\">\n    <default>\n      <qualifier name=\"Language\" value=\"en-US\" />\n      <qualifier name=\"Contrast\" value=\"standard\" />\n      <qualifier name=\"Scale\" value=\"200\" />\n      <qualifier name=\"HomeRegion\" value=\"001\" />\n      <qualifier name=\"TargetSize\" value=\"256\" />\n      <qualifier name=\"LayoutDirection\" value=\"LTR\" />\n      <qualifier name=\"DXFeatureLevel\" value=\"DX9\" />\n      <qualifier name=\"Configuration\" value=\"\" />\n      <qualifier name=\"AlternateForm\" value=\"\" />\n      <qualifier name=\"Platform\" value=\"UAP\" />\n    </default>\n    <indexer-config type=\"PRI\" />\n    <indexer-config type=\"RESFILES\" qualifierDelimiter=\".\" />\n  </index>\n  <index root=\"\\\" startIndexAt=\"embed.resfiles\">\n    <default>\n      <qualifier name=\"Language\" value=\"en-US\" />\n      <qualifier name=\"Contrast\" value=\"standard\" />\n      <qualifier name=\"Scale\" value=\"200\" />\n      <qualifier name=\"HomeRegion\" value=\"001\" />\n      <qualifier name=\"TargetSize\" value=\"256\" />\n      <qualifier name=\"LayoutDirection\" value=\"LTR\" />\n      <qualifier name=\"DXFeatureLevel\" value=\"DX9\" />\n      <qualifier name=\"Configuration\" value=\"\" />\n      <qualifier name=\"AlternateForm\" value=\"\" />\n      <qualifier name=\"Platform\" value=\"UAP\" />\n    </default>\n    <indexer-config type=\"RESFILES\" qualifierDelimiter=\".\" />\n    <indexer-config type=\"EMBEDFILES\" />\n  </index>\n</resources>\n"
  },
  {
    "path": "templates/winrt/temp/resources.resfiles",
    "content": ""
  },
  {
    "path": "tests/runtime/.gitignore",
    "content": "build\nreport\nsrc\ntest/ExampleTest.hx\ntest/TestMain.hx\ntest/TestSuite.hx\n"
  },
  {
    "path": "tests/runtime/.munit",
    "content": "version=src\nsrc=test\nbin=build\nreport=report\nhxml=test.hxml\nclassPaths=src\n"
  },
  {
    "path": "tests/runtime/README.md",
    "content": "Install\n-------\n\n    git clone https://github.com/openfl/openfl-validation\n    haxelib dev openfl-validation openfl-validation\n    haxelib install munit\n    \nTesting\n-------------\n\nFirst, change to the openfl-validation directory:\n\n    cd openfl-validation\n\nNext, you can test HTML5 and Flash using munit:\n\n    haxelib run munit test\n    \nOther targets can be tested using the normal OpenFL test commands:\n\n    lime test windows\n    lime test windows -neko\n    lime test mac\n    lime test mac -neko\n    lime test linux\n    lime test linux -neko\n    lime test ios\n    lime test ios -simulator\n    lime test android\n    lime test blackberry\n    lime test blackberry -simulator\n\nContributing\n-------------\n\nIf you would like to contribute a test, create a fork of the repository, then make a pull request with your addition.\n\nTests are organized based upon the class, then the method or property which has been tested. This will help us validate across the full API, and when there are problems, will help identify exactly which property or method needs to be improved for the specific target. Remember to remove @Ignore when you finish a test.\n"
  },
  {
    "path": "tests/runtime/project.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project>\n\t\n\t<meta title=\"Validation\" package=\"org.openfl.lime.validation\" version=\"1.0.0\" company=\"OpenFL\" />\n\t<app file=\"TestMain\" main=\"TestMain\" path=\"build\" />\n\t\n\t<source path=\"test\" />\n\t\n\t<haxelib name=\"lime\" />\n\t<haxelib name=\"munit\" />\n\t<haxelib name=\"mlib\" />\n\t<haxelib name=\"hamcrest\" />\n\t<haxelib name=\"format\" />\n\t\n\t<!-- <template path=\"src/index.html\" rename=\"index.html\" if=\"html5\" />\n\t-->\n</project>\n"
  },
  {
    "path": "tests/runtime/run.sh",
    "content": "#!/bin/sh\nhaxelib run munit gen\nlime test neko\nlime test cpp\nhaxelib run munit test\n"
  },
  {
    "path": "tests/runtime/test/lime/WindowTest.hx",
    "content": "package lime;\n\nimport lime.app.Application;\nimport lime.ui.Window;\nimport massive.munit.Assert;\n\nclass WindowTest\n{\n\tprivate var app:Application;\n\n\t@BeforeClass public function beforeClass():Void\n\t{\n\t\tapp = new Application();\n\t\tapp.create(null);\n\t}\n\n\t@Test public function createEmptyWindow():Void\n\t{\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\n\t\tvar window = new Window();\n\n\t\tAssert.isNull(window.renderer);\n\t\tAssert.isNull(window.config);\n\t\tAssert.isFalse(window.fullscreen);\n\t\tAssert.areEqual(0, window.height);\n\t\tAssert.areEqual(0, window.width);\n\t\tAssert.areEqual(0, window.x);\n\t\tAssert.areEqual(0, window.y);\n\n\t\tapp.createWindow(window);\n\n\t\tAssert.isNotNull(window.renderer);\n\t\tAssert.isNull(window.config);\n\n\t\t#if !html5\n\t\t// TODO: standardize the behavior of a 0 x 0 window\n\n\t\tAssert.isFalse(window.fullscreen);\n\t\t// Assert.areEqual (0, window.height);\n\t\t// Assert.areEqual (0, window.width);\n\t\t// Assert.areEqual (0, window.x);\n\t\t// Assert.areEqual (0, window.y);\n\t\t#end\n\n\t\twindow.close();\n\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\t}\n\n\t@Test public function createBasicWindow():Void\n\t{\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\n\t\tvar window = new Window();\n\n\t\twindow.width = 400;\n\t\twindow.height = 300;\n\n\t\tAssert.isNull(window.renderer);\n\t\tAssert.isNull(window.config);\n\t\tAssert.isFalse(window.fullscreen);\n\t\tAssert.areEqual(300, window.height);\n\t\tAssert.areEqual(400, window.width);\n\t\tAssert.areEqual(0, window.x);\n\t\tAssert.areEqual(0, window.y);\n\n\t\tapp.createWindow(window);\n\n\t\tAssert.isNotNull(window.renderer);\n\t\tAssert.isNull(window.config);\n\t\tAssert.isFalse(window.fullscreen);\n\t\tAssert.areEqual(300, window.height);\n\t\tAssert.areEqual(400, window.width);\n\t\t// Assert.areEqual (0, window.x);\n\t\t// Assert.areEqual (0, window.y);\n\n\t\twindow.close();\n\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\t}\n\n\t@Test public function createEmptyWindowFromConfig():Void\n\t{\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\n\t\tvar config = {};\n\t\tvar window = new Window(config);\n\n\t\tAssert.isNull(window.renderer);\n\t\tAssert.areEqual(config, window.config);\n\t\tAssert.isFalse(window.fullscreen);\n\t\tAssert.areEqual(0, window.height);\n\t\tAssert.areEqual(0, window.width);\n\t\tAssert.areEqual(0, window.x);\n\t\tAssert.areEqual(0, window.y);\n\n\t\tapp.createWindow(window);\n\n\t\tAssert.isNotNull(window.renderer);\n\t\tAssert.areEqual(config, window.config);\n\n\t\t#if !html5\n\t\tAssert.isFalse(window.fullscreen);\n\t\t// Assert.areEqual (0, window.height);\n\t\t// Assert.areEqual (0, window.width);\n\t\t// Assert.areEqual (0, window.x);\n\t\t// Assert.areEqual (0, window.y);\n\t\t#end\n\n\t\twindow.close();\n\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\t}\n\n\t@Test public function createBasicWindowFromConfig():Void\n\t{\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\n\t\tvar config = {width: 400, height: 300};\n\t\tvar window = new Window(config);\n\n\t\tAssert.isNull(window.renderer);\n\t\tAssert.areEqual(config, window.config);\n\t\tAssert.isFalse(window.fullscreen);\n\t\tAssert.areEqual(300, window.height);\n\t\tAssert.areEqual(400, window.width);\n\t\tAssert.areEqual(0, window.x);\n\t\tAssert.areEqual(0, window.y);\n\n\t\tapp.createWindow(window);\n\n\t\tAssert.isNotNull(window.renderer);\n\t\tAssert.areEqual(config, window.config);\n\t\tAssert.isFalse(window.fullscreen);\n\t\tAssert.areEqual(300, window.height);\n\t\tAssert.areEqual(400, window.width);\n\t\t// Assert.areEqual (0, window.x);\n\t\t// Assert.areEqual (0, window.y);\n\n\t\twindow.close();\n\n\t\tAssert.isNull(app.window);\n\t\tAssert.areEqual(0, app.windows.length);\n\t}\n\n\t@AfterClass public function afterClass():Void\n\t{\n\t\tapp = null;\n\t}\n}\n"
  },
  {
    "path": "tests/runtime/test.hxml",
    "content": "\n## Flash 9+\n-main TestMain\n-lib munit\n-lib hamcrest\n-lib mlib\n-lib lime\n-D web\n-cp test\n-swf-version 11.3\n-swf build/as3_test.swf\n\n# Trick munit into building our app\n\n-cmd haxelib run lime build html5\n#-cmd openfl build neko\n#-cmd mv build/linux64/neko/obj/ApplicationMain.n build/linux64/neko/bin/Validation.n\n#-cmd lime update linux\n\n--next\n\n## JavaScript\n\n-js build/html5/bin/TestMain.js\n--no-output\n\n--next\n\n## Neko\n\n#-neko build/linux64/neko/bin/Validation.n\n#--no-output\n\n#--next\n\n## C++\n\n#-main ApplicationMain\n\n#-cp build/linux64/cpp/haxe\n#-cp test\n\n#-lib openfl\n#-lib munit\n#-lib hamcrest\n#-lib mlib\n#-lib openfl-native\n\n#-D linux\n#-D desktop\n#-D HXCPP_M64\n#-D display\n\n#-cpp build/linux64/cpp/bin\n#--remap flash:flash\n#--no-output\n\n\n"
  },
  {
    "path": "tests/unit/project.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project>\n\n\t<meta title=\"Lime Tests\" package=\"org.openfl.lime.tests\" version=\"1.0.0\" company=\"OpenFL\" />\n\t<app file=\"TestMain\" main=\"TestMain\" />\n\n\t<source path=\"src\" />\n\n\t<haxelib name=\"lime\" />\n\t<haxelib name=\"utest\" />\n\n\t<template path=\"templates\" if=\"html5\"/>\n</project>\n"
  },
  {
    "path": "tests/unit/src/TestMain.hx",
    "content": "import utest.Runner;\nimport utest.ui.Report;\nimport lime.app.Application;\n\nclass TestMain extends Application {\n\tpublic function new() {\n\t\tsuper();\n\n\t\tvar runner = new Runner();\n\t\trunner.addCase(new utils.ArrayBufferTest());\n\t\trunner.addCase(new utils.UInt8ArrayTest());\n\t\trunner.addCase(new utils.UInt16ArrayTest());\n\t\trunner.addCase(new utils.UInt32ArrayTest());\n\t\trunner.addCase(new utils.DataViewTest());\n\t\tReport.create(runner);\n\t\trunner.run();\n\t}\n}"
  },
  {
    "path": "tests/unit/src/utils/ArrayBufferTest.hx",
    "content": "package utils;\n\nimport lime.utils.UInt8Array;\nimport lime.utils.DataView;\nimport lime.utils.ArrayBuffer;\nimport utest.Assert;\nimport utest.Test;\n\nclass ArrayBufferTest extends Test {\n\tpublic function new() {\n\t\tsuper();\n\t}\n\n\tpublic function testByteLength():Void {\n\t\tvar buffer = new ArrayBuffer(4);\n\t\tAssert.equals(4, buffer.byteLength);\n\t}\n\n\tpublic function testSubarray():Void {\n\t\tvar buffer = new ArrayBuffer(4);\n\t\tvar array = new UInt8Array(buffer);\n\t\tarray[0] = 0xca;\n\t\tarray[1] = 0xfe;\n\t\tarray[2] = 0xba;\n\t\tarray[3] = 0xbe;\n\n\t\tvar fourBuffer = buffer.slice(0, 4);\n\t\tAssert.equals(4, fourBuffer.byteLength);\n\t\tvar fourArray = new UInt8Array(fourBuffer);\n\t\tAssert.equals(4, fourArray.byteLength);\n\t\tAssert.equals(0xca, fourArray[0]);\n\t\tAssert.equals(0xfe, fourArray[1]);\n\t\tAssert.equals(0xba, fourArray[2]);\n\t\tAssert.equals(0xbe, fourArray[3]);\n\n\t\tvar twoStartBuffer = buffer.slice(0, 2);\n\t\tAssert.equals(2, twoStartBuffer.byteLength);\n\t\tvar twoStartArray = new UInt8Array(twoStartBuffer);\n\t\tAssert.equals(2, twoStartArray.byteLength);\n\t\tAssert.equals(0xca, twoStartArray[0]);\n\t\tAssert.equals(0xfe, twoStartArray[1]);\n\n\t\tvar twoEndBuffer = buffer.slice(2, 4);\n\t\tAssert.equals(2, twoEndBuffer.byteLength);\n\t\tvar twoEndArray = new UInt8Array(twoEndBuffer);\n\t\tAssert.equals(2, twoEndArray.byteLength);\n\t\tAssert.equals(0xba, twoEndArray[0]);\n\t\tAssert.equals(0xbe, twoEndArray[1]);\n\n\t\tvar endBeforeStartBuffer = buffer.slice(2, 1);\n\t\tAssert.equals(0, endBeforeStartBuffer.byteLength);\n\t\tvar endBeforeStartArray = new UInt8Array(endBeforeStartBuffer);\n\t\tAssert.equals(0, endBeforeStartArray.byteLength);\n\n\t\tvar endEqualsStartBuffer = buffer.slice(2, 2);\n\t\tAssert.equals(0, endEqualsStartBuffer.byteLength);\n\t\tvar endEqualsStartArray = new UInt8Array(endEqualsStartBuffer);\n\t\tAssert.equals(0, endEqualsStartArray.byteLength);\n\n\t\tvar beyondLengthBuffer = buffer.slice(0, 400);\n\t\tAssert.equals(4, beyondLengthBuffer.byteLength);\n\t\tvar beyondLengthArray = new UInt8Array(beyondLengthBuffer);\n\t\tAssert.equals(4, beyondLengthArray.byteLength);\n\t\tAssert.equals(0xca, beyondLengthArray[0]);\n\t\tAssert.equals(0xfe, beyondLengthArray[1]);\n\t\tAssert.equals(0xba, beyondLengthArray[2]);\n\t\tAssert.equals(0xbe, beyondLengthArray[3]);\n\t}\n}"
  },
  {
    "path": "tests/unit/src/utils/DataViewTest.hx",
    "content": "package utils;\n\nimport haxe.Int64;\nimport lime.utils.DataView;\nimport lime.utils.ArrayBuffer;\nimport utest.Assert;\nimport utest.Test;\n\nclass DataViewTest extends Test {\n\tpublic function new() {\n\t\tsuper();\n\t}\n\n\tpublic function testInt8():Void {\n\t\tvar values:Array<Int> = [0, 1, 2, 127,  128, 255, -1, -2, -128, -129];\n\t\tvar result:Array<Int> = [0, 1, 2, 127, -128,  -1, -1, -2, -128,  127];\n\t\tAssert.equals(values.length, result.length);\n\t\tvar count = values.length;\n\t\tvar buffer = new ArrayBuffer(count);\n\t\tvar dataView = new DataView(buffer);\n\t\tfor (i in 0...count) {\n\t\t\tvar value = values[i];\n\t\t\tdataView.setInt8(i, value);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar value = dataView.getInt8(i);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Int8: expected $expected but got $value at index $i');\n\t\t}\n\t}\n\n\tpublic function testUint8():Void {\n\t\tvar values:Array<Int> = [0, 1, 2, 255, 256,  -1,  -2, -255];\n\t\tvar result:Array<Int> = [0, 1, 2, 255,   0, 255, 254,    1];\n\t\tAssert.equals(values.length, result.length);\n\t\tvar count = values.length;\n\t\tvar buffer = new ArrayBuffer(count);\n\t\tvar dataView = new DataView(buffer);\n\t\tfor (i in 0...count) {\n\t\t\tvar value = values[i];\n\t\t\tdataView.setUint8(i, value);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar value = dataView.getUint8(i);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Uint8: expected $expected but got $value at index $i');\n\t\t}\n\t}\n\n\tpublic function testInt16():Void {\n\t\tvar values:Array<Int> = [0, 1, 2, 32767,  32768, 65535, -1, -2, -32768, -32769];\n\t\tvar result:Array<Int> = [0, 1, 2, 32767, -32768,    -1, -1, -2, -32768,  32767];\n\t\tvar resultBytesLE:Array<Array<Int>> = [\n\t\t\t[0x00, 0x00],\n\t\t\t[0x01, 0x00],\n\t\t\t[0x02, 0x00],\n\t\t\t[0xff, 0x7f],\n\t\t\t[0x00, 0x80],\n\t\t\t[0xff, 0xff],\n\t\t\t[0xff, 0xff],\n\t\t\t[0xfe, 0xff],\n\t\t\t[0x00, 0x80],\n\t\t\t[0xff, 0x7f]\n\t\t];\n\t\tAssert.equals(values.length, result.length);\n\t\tAssert.equals(values.length, resultBytesLE.length);\n\t\tvar count = values.length;\n\t\tvar buffer = new ArrayBuffer(count * 2);\n\t\tvar dataView = new DataView(buffer);\n\n\t\t// little endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setInt16(byteIndex, value);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = dataView.getInt16(byteIndex);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Int16 little endian: expected $expected but got $value at index $i');\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1)\n\t\t\t];\n\t\t\tvar expectedBytesLE = resultBytesLE[i];\n\t\t\tAssert.equals(2, expectedBytesLE.length);\n\t\t\tAssert.equals(expectedBytesLE[0], valueBytes[0], 'Int16 little endian: expected byte 0 to be ${StringTools.hex(expectedBytesLE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[1], valueBytes[1], 'Int16 little endian: expected byte 1 to be ${StringTools.hex(expectedBytesLE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t}\n\n\t\t// big endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setInt16(byteIndex, value, false);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = dataView.getInt16(byteIndex, false);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Int16 big endian: expected $expected but got $value at index $i');\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1)\n\t\t\t];\n\t\t\tvar expectedBytesBE = resultBytesLE[i].copy();\n\t\t\texpectedBytesBE.reverse(); // big endian is little endian reversed\n\t\t\tAssert.equals(2, expectedBytesBE.length);\n\t\t\tAssert.equals(expectedBytesBE[0], valueBytes[0], 'Int16 big endian: expected byte 0 to be ${StringTools.hex(expectedBytesBE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[1], valueBytes[1], 'Int16 big endian: expected byte 1 to be ${StringTools.hex(expectedBytesBE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t}\n\t}\n\n\tpublic function testUint16():Void {\n\t\tvar values:Array<Int> = [0, 1, 2, 65535, 65536,    -1,    -2, -65535];\n\t\tvar result:Array<Int> = [0, 1, 2, 65535,     0, 65535, 65534,      1];\n\t\tvar resultBytesLE:Array<Array<Int>> = [\n\t\t\t[0x00, 0x00],\n\t\t\t[0x01, 0x00],\n\t\t\t[0x02, 0x00],\n\t\t\t[0xff, 0xff],\n\t\t\t[0x00, 0x00],\n\t\t\t[0xff, 0xff],\n\t\t\t[0xfe, 0xff],\n\t\t\t[0x01, 0x00]\n\t\t];\n\t\tAssert.equals(values.length, result.length);\n\t\tAssert.equals(values.length, resultBytesLE.length);\n\t\tvar count = values.length;\n\t\tvar buffer = new ArrayBuffer(count * 2);\n\t\tvar dataView = new DataView(buffer);\n\n\t\t// little endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setUint16(byteIndex, value);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = dataView.getUint16(byteIndex);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Uint16 little endian: expected $expected but got $value at index $i');\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1)\n\t\t\t];\n\t\t\tvar expectedBytesLE = resultBytesLE[i];\n\t\t\tAssert.equals(2, expectedBytesLE.length);\n\t\t\tAssert.equals(expectedBytesLE[0], valueBytes[0], 'Uint16 little endian: expected byte 0 to be ${StringTools.hex(expectedBytesLE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[1], valueBytes[1], 'Uint16 little endian: expected byte 1 to be ${StringTools.hex(expectedBytesLE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t}\n\n\t\t// big endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setUint16(byteIndex, value, false);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 2;\n\t\t\tvar value = dataView.getUint16(byteIndex, false);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Uint16 big endian: expected $expected but got $value at index $i');\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1)\n\t\t\t];\n\t\t\tvar expectedBytesBE = resultBytesLE[i].copy();\n\t\t\texpectedBytesBE.reverse(); // big endian is little endian reversed\n\t\t\tAssert.equals(2, expectedBytesBE.length);\n\t\t\tAssert.equals(expectedBytesBE[0], valueBytes[0], 'Uint16 big endian: expected byte 0 to be ${StringTools.hex(expectedBytesBE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[1], valueBytes[1], 'Uint16 big endian: expected byte 1 to be ${StringTools.hex(expectedBytesBE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t}\n\t}\n\n\tpublic function testInt32():Void {\n\t\tvar values:Array<Int> = [0, 1, 2, 2147483647, -1, -2, -2147483648];\n\t\tvar result:Array<Int> = [0, 1, 2, 2147483647, -1, -2, -2147483648];\n\t\tvar resultBytesLE:Array<Array<Int>> = [\n\t\t\t[0x00, 0x00, 0x00, 0x00],\n\t\t\t[0x01, 0x00, 0x00, 0x00],\n\t\t\t[0x02, 0x00, 0x00, 0x00],\n\t\t\t[0xff, 0xff, 0xff, 0x7f],\n\t\t\t[0xff, 0xff, 0xff, 0xff],\n\t\t\t[0xfe, 0xff, 0xff, 0xff],\n\t\t\t[0x00, 0x00, 0x00, 0x80]\n\t\t];\n\t\tAssert.equals(values.length, result.length);\n\t\tAssert.equals(values.length, resultBytesLE.length);\n\t\tvar count = values.length;\n\t\tvar buffer = new ArrayBuffer(count * 4);\n\t\tvar dataView = new DataView(buffer);\n\n\t\t// little endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setInt32(byteIndex, value);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar value = dataView.getInt32(byteIndex);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Int32 little endian: expected $expected but got $value at index $i');\n\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1),\n\t\t\t\tdataView.getUint8(byteIndex + 2),\n\t\t\t\tdataView.getUint8(byteIndex + 3)\n\t\t\t];\n\t\t\tvar expectedBytesLE = resultBytesLE[i];\n\t\t\tAssert.equals(4, expectedBytesLE.length);\n\t\t\tAssert.equals(expectedBytesLE[0], valueBytes[0], 'Int32 little endian: expected byte 0 to be ${StringTools.hex(expectedBytesLE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[1], valueBytes[1], 'Int32 little endian: expected byte 1 to be ${StringTools.hex(expectedBytesLE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[2], valueBytes[2], 'Int32 little endian: expected byte 2 to be ${StringTools.hex(expectedBytesLE[2])} but got ${StringTools.hex(valueBytes[2])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[3], valueBytes[3], 'Int32 little endian: expected byte 3 to be ${StringTools.hex(expectedBytesLE[3])} but got ${StringTools.hex(valueBytes[3])} at index $i');\n\t\t}\n\n\t\t// big endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setInt32(byteIndex, value, false);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar value = dataView.getInt32(byteIndex, false);\n\t\t\tvar expected = result[i];\n\t\t\tAssert.equals(expected, value, 'Int32 big endian: expected $expected but got $value at index $i');\n\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1),\n\t\t\t\tdataView.getUint8(byteIndex + 2),\n\t\t\t\tdataView.getUint8(byteIndex + 3)\n\t\t\t];\n\t\t\tvar expectedBytesBE = resultBytesLE[i].copy();\n\t\t\texpectedBytesBE.reverse(); // big endian is little endian reversed\n\t\t\tAssert.equals(4, expectedBytesBE.length);\n\t\t\tAssert.equals(expectedBytesBE[0], valueBytes[0], 'Int32 big endian: expected byte 0 to be ${StringTools.hex(expectedBytesBE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[1], valueBytes[1], 'Int32 big endian: expected byte 1 to be ${StringTools.hex(expectedBytesBE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[2], valueBytes[2], 'Int32 big endian: expected byte 2 to be ${StringTools.hex(expectedBytesBE[2])} but got ${StringTools.hex(valueBytes[2])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[3], valueBytes[3], 'Int32 big endian: expected byte 3 to be ${StringTools.hex(expectedBytesBE[3])} but got ${StringTools.hex(valueBytes[3])} at index $i');\n\t\t}\n\t}\n\n\tpublic function testUint32():Void {\n\t\tvar values:Array<UInt> = [0, 1, 2, 0xffffffff, 0xdeadbeef, 0xcafebabe, 0xdecafbad];\n\t\tvar resultBytesLE:Array<Array<Int>> = [\n\t\t\t[0x00, 0x00, 0x00, 0x00],\n\t\t\t[0x01, 0x00, 0x00, 0x00],\n\t\t\t[0x02, 0x00, 0x00, 0x00],\n\t\t\t[0xff, 0xff, 0xff, 0xff],\n\t\t\t[0xef, 0xbe, 0xad, 0xde],\n\t\t\t[0xbe, 0xba, 0xfe, 0xca],\n\t\t\t[0xad, 0xfb, 0xca, 0xde]\n\t\t];\n\t\tAssert.equals(values.length, resultBytesLE.length);\n\t\tvar count = values.length;\n\t\tvar buffer = new ArrayBuffer(count * 4);\n\t\tvar dataView = new DataView(buffer);\n\n\t\t// little endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setUint32(byteIndex, value);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1),\n\t\t\t\tdataView.getUint8(byteIndex + 2),\n\t\t\t\tdataView.getUint8(byteIndex + 3)\n\t\t\t];\n\t\t\tvar expectedBytesLE = resultBytesLE[i];\n\t\t\tAssert.equals(4, expectedBytesLE.length);\n\t\t\tAssert.equals(expectedBytesLE[0], valueBytes[0], 'Uint32 little endian: expected byte 0 to be ${StringTools.hex(expectedBytesLE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[1], valueBytes[1], 'Uint32 little endian: expected byte 1 to be ${StringTools.hex(expectedBytesLE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[2], valueBytes[2], 'Uint32 little endian: expected byte 2 to be ${StringTools.hex(expectedBytesLE[2])} but got ${StringTools.hex(valueBytes[2])} at index $i');\n\t\t\tAssert.equals(expectedBytesLE[3], valueBytes[3], 'Uint32 little endian: expected byte 3 to be ${StringTools.hex(expectedBytesLE[3])} but got ${StringTools.hex(valueBytes[3])} at index $i');\n\t\t}\n\n\t\t// big endian\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar value = values[i];\n\t\t\tdataView.setUint32(byteIndex, value, false);\n\t\t}\n\t\tfor (i in 0...count) {\n\t\t\tvar byteIndex = i * 4;\n\t\t\tvar valueBytes = [\n\t\t\t\tdataView.getUint8(byteIndex),\n\t\t\t\tdataView.getUint8(byteIndex + 1),\n\t\t\t\tdataView.getUint8(byteIndex + 2),\n\t\t\t\tdataView.getUint8(byteIndex + 3)\n\t\t\t];\n\t\t\tvar expectedBytesBE = resultBytesLE[i].copy();\n\t\t\texpectedBytesBE.reverse(); // big endian is little endian reversed\n\t\t\tAssert.equals(4, expectedBytesBE.length);\n\t\t\tAssert.equals(expectedBytesBE[0], valueBytes[0], 'Uint32 big endian: expected byte 0 to be ${StringTools.hex(expectedBytesBE[0])} but got ${StringTools.hex(valueBytes[0])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[1], valueBytes[1], 'Uint32 big endian: expected byte 1 to be ${StringTools.hex(expectedBytesBE[1])} but got ${StringTools.hex(valueBytes[1])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[2], valueBytes[2], 'Uint32 big endian: expected byte 2 to be ${StringTools.hex(expectedBytesBE[2])} but got ${StringTools.hex(valueBytes[2])} at index $i');\n\t\t\tAssert.equals(expectedBytesBE[3], valueBytes[3], 'Uint32 big endian: expected byte 3 to be ${StringTools.hex(expectedBytesBE[3])} but got ${StringTools.hex(valueBytes[3])} at index $i');\n\t\t}\n\t}\n}"
  },
  {
    "path": "tests/unit/src/utils/UInt16ArrayTest.hx",
    "content": "package utils;\n\nimport lime.utils.UInt16Array;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\nimport lime.utils.ArrayBuffer;\nimport utest.Assert;\nimport utest.Test;\n\nclass UInt16ArrayTest extends Test {\n\tpublic function new() {\n\t\tsuper();\n\t}\n\n\tpublic function testByteLength():Void {\n\t\tvar buffer = new ArrayBuffer(8);\n\t\tvar array = new UInt16Array(buffer);\n\t\tAssert.equals(4, array.length);\n\t\tAssert.equals(8, array.byteLength);\n\t}\n\n\tpublic function testValues():Void {\n\t\tvar buffer = new ArrayBuffer(8);\n\t\tvar array = new UInt16Array(buffer);\n\t\tAssert.equals(0x0, array[0]);\n\t\tAssert.equals(0x0, array[1]);\n\t\tAssert.equals(0x0, array[2]);\n\t\tAssert.equals(0x0, array[3]);\n\t\tarray[0] = 0xcafe;\n\t\tarray[1] = 0xbabe;\n\t\tarray[2] = 0xdeca;\n\t\tarray[3] = 0xfbad;\n\t\tAssert.equals(0xcafe, array[0]);\n\t\tAssert.equals(0xbabe, array[1]);\n\t\tAssert.equals(0xdeca, array[2]);\n\t\tAssert.equals(0xfbad, array[3]);\n\t}\n\n\tpublic function testSubarray():Void {\n\t\tvar buffer = new ArrayBuffer(8);\n\t\tvar array = new UInt16Array(buffer);\n\t\tarray[0] = 0xcafe;\n\t\tarray[1] = 0xbabe;\n\t\tarray[2] = 0xdeca;\n\t\tarray[3] = 0xfbad;\n\n\t\tvar four = array.subarray(0, 4);\n\t\tAssert.equals(4, four.length);\n\t\tAssert.equals(8, four.byteLength);\n\t\tAssert.equals(0xcafe, four[0]);\n\t\tAssert.equals(0xbabe, four[1]);\n\t\tAssert.equals(0xdeca, four[2]);\n\t\tAssert.equals(0xfbad, four[3]);\n\n\t\tvar twoStart = array.subarray(0, 2);\n\t\tAssert.equals(2, twoStart.length);\n\t\tAssert.equals(4, twoStart.byteLength);\n\t\tAssert.equals(0xcafe, twoStart[0]);\n\t\tAssert.equals(0xbabe, twoStart[1]);\n\n\t\tvar twoEnd = array.subarray(2, 4);\n\t\tAssert.equals(2, twoEnd.length);\n\t\tAssert.equals(4, twoEnd.byteLength);\n\t\tAssert.equals(0xdeca, twoEnd[0]);\n\t\tAssert.equals(0xfbad, twoEnd[1]);\n\n\t\tvar endBeforeStart = array.subarray(2, 1);\n\t\tAssert.equals(0, endBeforeStart.length);\n\t\tAssert.equals(0, endBeforeStart.byteLength);\n\n\t\tvar endEqualsStart = array.subarray(2, 2);\n\t\tAssert.equals(0, endEqualsStart.length);\n\t\tAssert.equals(0, endEqualsStart.byteLength);\n\n\t\tvar beyondLength = array.subarray(0, 400);\n\t\tAssert.equals(4, beyondLength.length);\n\t\tAssert.equals(8, beyondLength.byteLength);\n\t\tAssert.equals(0xcafe, beyondLength[0]);\n\t\tAssert.equals(0xbabe, beyondLength[1]);\n\t\tAssert.equals(0xdeca, beyondLength[2]);\n\t\tAssert.equals(0xfbad, beyondLength[3]);\n\t}\n\n\tpublic function testSetArrayOfInts():Void {\n\t\tvar array1:Array<Int> = [0xcafe, 0xbabe, 0xdeca, 0xfbad];\n\n\t\tvar buffer2 = new ArrayBuffer(16);\n\t\tvar array2 = new UInt16Array(buffer2);\n\t\t\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xcafe, array2[0]);\n\t\tAssert.equals(0xbabe, array2[1]);\n\t\tAssert.equals(0xdeca, array2[2]);\n\t\tAssert.equals(0xfbad, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xcafe, array2[1]);\n\t\tAssert.equals(0xbabe, array2[2]);\n\t\tAssert.equals(0xdeca, array2[3]);\n\t\tAssert.equals(0xfbad, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt8Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(4);\n\t\tvar array1 = new UInt8Array(buffer1);\n\t\tarray1[0] = 0xca;\n\t\tarray1[1] = 0xfe;\n\t\tarray1[2] = 0xba;\n\t\tarray1[3] = 0xbe;\n\n\t\tvar buffer2 = new ArrayBuffer(16);\n\t\tvar array2 = new UInt16Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xca, array2[0]);\n\t\tAssert.equals(0xfe, array2[1]);\n\t\tAssert.equals(0xba, array2[2]);\n\t\tAssert.equals(0xbe, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xca, array2[1]);\n\t\tAssert.equals(0xfe, array2[2]);\n\t\tAssert.equals(0xba, array2[3]);\n\t\tAssert.equals(0xbe, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt16Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(8);\n\t\tvar array1 = new UInt16Array(buffer1);\n\t\tarray1[0] = 0xcafe;\n\t\tarray1[1] = 0xbabe;\n\t\tarray1[2] = 0xdeca;\n\t\tarray1[3] = 0xfbad;\n\n\t\tvar buffer2 = new ArrayBuffer(16);\n\t\tvar array2 = new UInt16Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xcafe, array2[0]);\n\t\tAssert.equals(0xbabe, array2[1]);\n\t\tAssert.equals(0xdeca, array2[2]);\n\t\tAssert.equals(0xfbad, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xcafe, array2[1]);\n\t\tAssert.equals(0xbabe, array2[2]);\n\t\tAssert.equals(0xdeca, array2[3]);\n\t\tAssert.equals(0xfbad, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt32Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(16);\n\t\tvar array1 = new UInt32Array(buffer1);\n\t\tarray1[0] = 0xcafebabe;\n\t\tarray1[1] = 0xdecafbad;\n\t\tarray1[2] = 0xffffffff;\n\t\tarray1[3] = 0xdeadbeef;\n\n\t\tvar buffer2 = new ArrayBuffer(16);\n\t\tvar array2 = new UInt16Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xbabe, array2[0]);\n\t\tAssert.equals(0xfbad, array2[1]);\n\t\tAssert.equals(0xffff, array2[2]);\n\t\tAssert.equals(0xbeef, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xbabe, array2[1]);\n\t\tAssert.equals(0xfbad, array2[2]);\n\t\tAssert.equals(0xffff, array2[3]);\n\t\tAssert.equals(0xbeef, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n}"
  },
  {
    "path": "tests/unit/src/utils/UInt32ArrayTest.hx",
    "content": "package utils;\n\nimport lime.utils.UInt16Array;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\nimport lime.utils.ArrayBuffer;\nimport utest.Assert;\nimport utest.Test;\n\nclass UInt32ArrayTest extends Test {\n\tpublic function new() {\n\t\tsuper();\n\t}\n\n\tpublic function testByteLength():Void {\n\t\tvar buffer = new ArrayBuffer(16);\n\t\tvar array = new UInt32Array(buffer);\n\t\tAssert.equals(4, array.length);\n\t\tAssert.equals(16, array.byteLength);\n\t}\n\n\tpublic function testValues():Void {\n\t\tvar buffer = new ArrayBuffer(16);\n\t\tvar array = new UInt32Array(buffer);\n\t\tAssert.equals(0x0, array[0]);\n\t\tAssert.equals(0x0, array[1]);\n\t\tAssert.equals(0x0, array[2]);\n\t\tAssert.equals(0x0, array[3]);\n\n\t\tarray[0] = 0xcafebabe;\n\t\tarray[1] = 0xdecafbad;\n\t\tarray[2] = 0xffffffff;\n\t\tarray[3] = 0xdeadbeef;\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array[3]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, array[0]);\n\t\tAssert.equals(0xdecafbad, array[1]);\n\t\tAssert.equals(0xffffffff, array[2]);\n\t\tAssert.equals(0xdeadbeef, array[3]);\n\t\t#end\n\t}\n\n\tpublic function testSubarray():Void {\n\t\tvar buffer = new ArrayBuffer(16);\n\t\tvar array = new UInt32Array(buffer);\n\t\tarray[0] = 0xcafebabe;\n\t\tarray[1] = 0xdecafbad;\n\t\tarray[2] = 0xffffffff;\n\t\tarray[3] = 0xdeadbeef;\n\n\t\tvar four = array.subarray(0, 4);\n\t\tAssert.equals(4, four.length);\n\t\tAssert.equals(16, four.byteLength);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array[3]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, four[0]);\n\t\tAssert.equals(0xdecafbad, four[1]);\n\t\tAssert.equals(0xffffffff, four[2]);\n\t\tAssert.equals(0xdeadbeef, four[3]);\n\t\t#end\n\n\t\tvar twoStart = array.subarray(0, 2);\n\t\tAssert.equals(2, twoStart.length);\n\t\tAssert.equals(8, twoStart.byteLength);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), twoStart[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), twoStart[1]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, twoStart[0]);\n\t\tAssert.equals(0xdecafbad, twoStart[1]);\n\t\t#end\n\n\t\tvar twoEnd = array.subarray(2, 4);\n\t\tAssert.equals(2, twoEnd.length);\n\t\tAssert.equals(8, twoEnd.byteLength);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), twoEnd[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), twoEnd[1]);\n\t\t#else\n\t\tAssert.equals(0xffffffff, twoEnd[0]);\n\t\tAssert.equals(0xdeadbeef, twoEnd[1]);\n\t\t#end\n\n\t\tvar endBeforeStart = array.subarray(2, 1);\n\t\tAssert.equals(0, endBeforeStart.length);\n\t\tAssert.equals(0, endBeforeStart.byteLength);\n\n\t\tvar endEqualsStart = array.subarray(2, 2);\n\t\tAssert.equals(0, endEqualsStart.length);\n\t\tAssert.equals(0, endEqualsStart.byteLength);\n\n\t\tvar beyondLength = array.subarray(0, 400);\n\t\tAssert.equals(4, beyondLength.length);\n\t\tAssert.equals(16, beyondLength.byteLength);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array[3]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, beyondLength[0]);\n\t\tAssert.equals(0xdecafbad, beyondLength[1]);\n\t\tAssert.equals(0xffffffff, beyondLength[2]);\n\t\tAssert.equals(0xdeadbeef, beyondLength[3]);\n\t\t#end\n\t}\n\n\tpublic function testSetArrayOfInts():Void {\n\t\tvar array1:Array<Int> = [0xcafebabe, 0xdecafbad, 0xffffffff, 0xdeadbeef];\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\t\t\n\t\tarray2.set(array1);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array2[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array2[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array2[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array2[3]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, array2[0]);\n\t\tAssert.equals(0xdecafbad, array2[1]);\n\t\tAssert.equals(0xffffffff, array2[2]);\n\t\tAssert.equals(0xdeadbeef, array2[3]);\n\t\t#end\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array2[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array2[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array2[3]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array2[4]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, array2[1]);\n\t\tAssert.equals(0xdecafbad, array2[2]);\n\t\tAssert.equals(0xffffffff, array2[3]);\n\t\tAssert.equals(0xdeadbeef, array2[4]);\n\t\t#end\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tprivate function testSetArrayOfIntsRangeError():Void\n\t{\n\t\tvar array1:Array<Int> = [0xcafebabe, 0xdecafbad, 0xffffffff, 0xdeadbeef];\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt8Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(4);\n\t\tvar array1 = new UInt8Array(buffer1);\n\t\tarray1[0] = 0xca;\n\t\tarray1[1] = 0xfe;\n\t\tarray1[2] = 0xba;\n\t\tarray1[3] = 0xbe;\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xca, array2[0]);\n\t\tAssert.equals(0xfe, array2[1]);\n\t\tAssert.equals(0xba, array2[2]);\n\t\tAssert.equals(0xbe, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xca, array2[1]);\n\t\tAssert.equals(0xfe, array2[2]);\n\t\tAssert.equals(0xba, array2[3]);\n\t\tAssert.equals(0xbe, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt8ArrayRangeError():Void {\n\t\tvar buffer1 = new ArrayBuffer(4);\n\t\tvar array1 = new UInt8Array(buffer1);\n\t\tarray1[0] = 0xca;\n\t\tarray1[1] = 0xfe;\n\t\tarray1[2] = 0xba;\n\t\tarray1[3] = 0xbe;\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt16Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(8);\n\t\tvar array1 = new UInt16Array(buffer1);\n\t\tarray1[0] = 0xcafe;\n\t\tarray1[1] = 0xbabe;\n\t\tarray1[2] = 0xdeca;\n\t\tarray1[3] = 0xfbad;\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xcafe, array2[0]);\n\t\tAssert.equals(0xbabe, array2[1]);\n\t\tAssert.equals(0xdeca, array2[2]);\n\t\tAssert.equals(0xfbad, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xcafe, array2[1]);\n\t\tAssert.equals(0xbabe, array2[2]);\n\t\tAssert.equals(0xdeca, array2[3]);\n\t\tAssert.equals(0xfbad, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt16ArrayRangeError():Void {\n\t\tvar buffer1 = new ArrayBuffer(8);\n\t\tvar array1 = new UInt16Array(buffer1);\n\t\tarray1[0] = 0xcafe;\n\t\tarray1[1] = 0xbabe;\n\t\tarray1[2] = 0xdeca;\n\t\tarray1[3] = 0xfbad;\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt32Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(16);\n\t\tvar array1 = new UInt32Array(buffer1);\n\t\tarray1[0] = 0xcafebabe;\n\t\tarray1[1] = 0xdecafbad;\n\t\tarray1[2] = 0xffffffff;\n\t\tarray1[3] = 0xdeadbeef;\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array2[0]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array2[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array2[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array2[3]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, array2[0]);\n\t\tAssert.equals(0xdecafbad, array2[1]);\n\t\tAssert.equals(0xffffffff, array2[2]);\n\t\tAssert.equals(0xdeadbeef, array2[3]);\n\t\t#end\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\t#if js\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xcafebabe'), array2[1]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdecafbad'), array2[2]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xffffffff'), array2[3]);\n\t\tAssert.equals(untyped #if haxe4 js.Syntax.code #else __js__ #end ('0xdeadbeef'), array2[4]);\n\t\t#else\n\t\tAssert.equals(0xcafebabe, array2[1]);\n\t\tAssert.equals(0xdecafbad, array2[2]);\n\t\tAssert.equals(0xffffffff, array2[3]);\n\t\tAssert.equals(0xdeadbeef, array2[4]);\n\t\t#end\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt32ArrayRangeError():Void {\n\t\tvar buffer1 = new ArrayBuffer(16);\n\t\tvar array1 = new UInt32Array(buffer1);\n\t\tarray1[0] = 0xcafebabe;\n\t\tarray1[1] = 0xdecafbad;\n\t\tarray1[2] = 0xffffffff;\n\t\tarray1[3] = 0xdeadbeef;\n\n\t\tvar buffer2 = new ArrayBuffer(32);\n\t\tvar array2 = new UInt32Array(buffer2);\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n}"
  },
  {
    "path": "tests/unit/src/utils/UInt8ArrayTest.hx",
    "content": "package utils;\n\nimport lime.utils.ArrayBuffer;\nimport lime.utils.UInt16Array;\nimport lime.utils.UInt32Array;\nimport lime.utils.UInt8Array;\nimport utest.Assert;\nimport utest.Test;\n\nclass UInt8ArrayTest extends Test {\n\tpublic function new() {\n\t\tsuper();\n\t}\n\n\tpublic function testByteLength():Void {\n\t\tvar buffer = new ArrayBuffer(4);\n\t\tvar array = new UInt8Array(buffer);\n\t\tAssert.equals(4, array.length);\n\t\tAssert.equals(4, array.byteLength);\n\t}\n\n\tpublic function testValues():Void {\n\t\tvar buffer = new ArrayBuffer(4);\n\t\tvar array = new UInt8Array(buffer);\n\t\tAssert.equals(0x0, array[0]);\n\t\tAssert.equals(0x0, array[1]);\n\t\tAssert.equals(0x0, array[2]);\n\t\tAssert.equals(0x0, array[3]);\n\t\tarray[0] = 0xca;\n\t\tarray[1] = 0xfe;\n\t\tarray[2] = 0xba;\n\t\tarray[3] = 0xbe;\n\t\tAssert.equals(0xca, array[0]);\n\t\tAssert.equals(0xfe, array[1]);\n\t\tAssert.equals(0xba, array[2]);\n\t\tAssert.equals(0xbe, array[3]);\n\t}\n\n\tpublic function testSubarray():Void {\n\t\tvar buffer = new ArrayBuffer(4);\n\t\tvar array = new UInt8Array(buffer);\n\t\tarray[0] = 0xca;\n\t\tarray[1] = 0xfe;\n\t\tarray[2] = 0xba;\n\t\tarray[3] = 0xbe;\n\n\t\tvar four = array.subarray(0, 4);\n\t\tAssert.equals(4, four.length);\n\t\tAssert.equals(4, four.byteLength);\n\t\tAssert.equals(0xca, four[0]);\n\t\tAssert.equals(0xfe, four[1]);\n\t\tAssert.equals(0xba, four[2]);\n\t\tAssert.equals(0xbe, four[3]);\n\n\t\tvar twoStart = array.subarray(0, 2);\n\t\tAssert.equals(2, twoStart.length);\n\t\tAssert.equals(2, twoStart.byteLength);\n\t\tAssert.equals(0xca, twoStart[0]);\n\t\tAssert.equals(0xfe, twoStart[1]);\n\n\t\tvar twoEnd = array.subarray(2, 4);\n\t\tAssert.equals(2, twoEnd.length);\n\t\tAssert.equals(2, twoEnd.byteLength);\n\t\tAssert.equals(0xba, twoEnd[0]);\n\t\tAssert.equals(0xbe, twoEnd[1]);\n\n\t\tvar endBeforeStart = array.subarray(2, 1);\n\t\tAssert.equals(0, endBeforeStart.length);\n\t\tAssert.equals(0, endBeforeStart.byteLength);\n\n\t\tvar endEqualsStart = array.subarray(2, 2);\n\t\tAssert.equals(0, endEqualsStart.length);\n\t\tAssert.equals(0, endEqualsStart.byteLength);\n\n\t\tvar beyondLength = array.subarray(0, 400);\n\t\tAssert.equals(4, beyondLength.length);\n\t\tAssert.equals(4, beyondLength.byteLength);\n\t\tAssert.equals(0xca, beyondLength[0]);\n\t\tAssert.equals(0xfe, beyondLength[1]);\n\t\tAssert.equals(0xba, beyondLength[2]);\n\t\tAssert.equals(0xbe, beyondLength[3]);\n\t}\n\n\tpublic function testSetArrayOfInts():Void {\n\t\tvar array1:Array<Int> = [0xca, 0xfe, 0xba, 0xbe];\n\n\t\tvar buffer2 = new ArrayBuffer(8);\n\t\tvar array2 = new UInt8Array(buffer2);\n\t\t\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xca, array2[0]);\n\t\tAssert.equals(0xfe, array2[1]);\n\t\tAssert.equals(0xba, array2[2]);\n\t\tAssert.equals(0xbe, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xca, array2[1]);\n\t\tAssert.equals(0xfe, array2[2]);\n\t\tAssert.equals(0xba, array2[3]);\n\t\tAssert.equals(0xbe, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt8Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(4);\n\t\tvar array1 = new UInt8Array(buffer1);\n\t\tarray1[0] = 0xca;\n\t\tarray1[1] = 0xfe;\n\t\tarray1[2] = 0xba;\n\t\tarray1[3] = 0xbe;\n\n\t\tvar buffer2 = new ArrayBuffer(8);\n\t\tvar array2 = new UInt8Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xca, array2[0]);\n\t\tAssert.equals(0xfe, array2[1]);\n\t\tAssert.equals(0xba, array2[2]);\n\t\tAssert.equals(0xbe, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xca, array2[1]);\n\t\tAssert.equals(0xfe, array2[2]);\n\t\tAssert.equals(0xba, array2[3]);\n\t\tAssert.equals(0xbe, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt16Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(8);\n\t\tvar array1 = new UInt16Array(buffer1);\n\t\tarray1[0] = 0xcafe;\n\t\tarray1[1] = 0xbabe;\n\t\tarray1[2] = 0xdeca;\n\t\tarray1[3] = 0xfbad;\n\n\t\tvar buffer2 = new ArrayBuffer(8);\n\t\tvar array2 = new UInt8Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xfe, array2[0]);\n\t\tAssert.equals(0xbe, array2[1]);\n\t\tAssert.equals(0xca, array2[2]);\n\t\tAssert.equals(0xad, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xfe, array2[1]);\n\t\tAssert.equals(0xbe, array2[2]);\n\t\tAssert.equals(0xca, array2[3]);\n\t\tAssert.equals(0xad, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n\n\tpublic function testSetUInt32Array():Void {\n\t\tvar buffer1 = new ArrayBuffer(16);\n\t\tvar array1 = new UInt32Array(buffer1);\n\t\tarray1[0] = 0xcafebabe;\n\t\tarray1[1] = 0xdecafbad;\n\t\tarray1[2] = 0xffffffff;\n\t\tarray1[3] = 0xdeadbeef;\n\n\t\tvar buffer2 = new ArrayBuffer(8);\n\t\tvar array2 = new UInt8Array(buffer2);\n\n\t\tarray2.set(array1);\n\t\tAssert.equals(0xbe, array2[0]);\n\t\tAssert.equals(0xad, array2[1]);\n\t\tAssert.equals(0xff, array2[2]);\n\t\tAssert.equals(0xef, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\t// reset the array to all zeros\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\tarray2.set(array1, 1);\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0xbe, array2[1]);\n\t\tAssert.equals(0xad, array2[2]);\n\t\tAssert.equals(0xff, array2[3]);\n\t\tAssert.equals(0xef, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\n\t\tfor (i in 0...array2.length) {\n\t\t\tarray2[i] = 0x0;\n\t\t}\n\n\t\t// if the array can't fit, it throws\n\t\tAssert.raises(function():Void {\n\t\t\tarray2.set(array1, 6);\n\t\t});\n\t\t// in that case, none of the values should have been updated\n\t\tAssert.equals(0x0, array2[0]);\n\t\tAssert.equals(0x0, array2[1]);\n\t\tAssert.equals(0x0, array2[2]);\n\t\tAssert.equals(0x0, array2[3]);\n\t\tAssert.equals(0x0, array2[4]);\n\t\tAssert.equals(0x0, array2[5]);\n\t\tAssert.equals(0x0, array2[6]);\n\t\tAssert.equals(0x0, array2[7]);\n\t}\n}"
  },
  {
    "path": "tests/unit/templates/html5/template/index.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n\t<meta charset=\"utf-8\">\n\n\t<title>::APP_TITLE::</title>\n\n\t<meta id=\"viewport\" name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\n\t<meta name=\"mobile-web-app-capable\" content=\"yes\">\n\n\t::if favicons::::foreach (favicons)::\n\t<link rel=\"::__current__.rel::\" type=\"::__current__.type::\" href=\"::__current__.href::\">::end::::end::\n\n\t::if linkedLibraries::::foreach (linkedLibraries)::\n\t<script type=\"text/javascript\" src=\"::__current__::\"></script>::end::::end::\n\t<script type=\"text/javascript\" src=\"./::APP_FILE::.js\"></script>\n\n\t<script>\n\t\twindow.addEventListener (\"touchmove\", function (event) { event.preventDefault (); }, { capture: false, passive: false });\n\t\tif (typeof window.devicePixelRatio != 'undefined' && window.devicePixelRatio > 2) {\n\t\t\tvar meta = document.getElementById (\"viewport\");\n\t\t\tmeta.setAttribute ('content', 'width=device-width, initial-scale=' + (2 / window.devicePixelRatio) + ', user-scalable=no');\n\t\t}\n\t</script>\n\n\t<style>\n\t\thtml,body { margin: 0; padding: 0; height: 100%; overflow: hidden; }\n\t\t#content { position:absolute;top:-100%; ::if (WIN_BACKGROUND)::background: #000000; ::end::width: ::if (WIN_RESIZABLE)::100%::elseif (WIN_WIDTH > 0)::::WIN_WIDTH::px::else::100%::end::; height: ::if (WIN_RESIZABLE)::100%::elseif (WIN_WIDTH > 0)::::WIN_HEIGHT::px::else::100%::end::; }\n::foreach assets::::if (type == \"font\")::::if (cssFontFace)::::cssFontFace::::end::::end::::end::\n\t</style>\n\n</head>\n<body>\n\t::foreach assets::::if (type == \"font\")::\n\t<span style=\"font-family: ::id::\"> </span>::end::::end::\n\n\t<div id=\"content\"></div>\n\n\t<script type=\"text/javascript\">\n\t\tlime.embed (\"::APP_FILE::\", \"content\", ::WIN_WIDTH::, ::WIN_HEIGHT::);\n\t</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "tools/AliasScript.hx",
    "content": "package;\n\nimport haxe.macro.Compiler;\n\nclass AliasScript\n{\n\tpublic static function main()\n\t{\n\t\tvar args = [\"run\", Compiler.getDefine(\"command\")].concat(Sys.args());\n\t\tSys.exit(Sys.command(\"haxelib\", args));\n\t}\n}\n"
  },
  {
    "path": "tools/CommandLineTools.hx",
    "content": "package;\n\n// import openfl.text.Font;\n// import openfl.utils.ByteArray;\n// import openfl.utils.CompressionAlgorithm;\nimport haxe.Serializer;\nimport haxe.Unserializer;\nimport haxe.rtti.Meta;\nimport hxp.*;\nimport lime.system.CFFI;\nimport lime.tools.HXProject;\nimport lime.tools.*;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\nimport utils.publish.*;\nimport utils.CreateTemplate;\nimport utils.JavaExternGenerator;\nimport utils.PlatformSetup;\n\n@:access(lime.tools.HXProject)\nclass CommandLineTools\n{\n\tpublic static var commandName = \"lime\";\n\tpublic static var defaultLibrary = \"lime\";\n\tpublic static var defaultLibraryName = \"Lime\";\n\n\tprivate var additionalArguments:Array<String>;\n\tprivate var command:String;\n\tprivate var debug:Bool;\n\tprivate var environment:Map<String, String>;\n\tprivate var includePaths:Array<String>;\n\tprivate var overrides:HXProject;\n\tprivate var project:HXProject;\n\tprivate var projectDefines:Map<String, String>;\n\tprivate var runFromHaxelib:Bool;\n\tprivate var targetFlags:Map<String, String>;\n\tprivate var traceEnabled:Bool;\n\tprivate var userDefines:Map<String, Dynamic>;\n\tprivate var version:String;\n\tprivate var words:Array<String>;\n\n\tpublic function new()\n\t{\n\t\tadditionalArguments = new Array<String>();\n\t\tcommand = \"\";\n\t\tdebug = false;\n\t\tenvironment = Sys.environment();\n\t\tincludePaths = new Array<String>();\n\t\tprojectDefines = new Map<String, String>();\n\t\ttargetFlags = new Map<String, String>();\n\t\ttraceEnabled = true;\n\t\tuserDefines = new Map<String, Dynamic>();\n\t\twords = new Array<String>();\n\n\t\toverrides = new HXProject();\n\n\t\t// Haxelib.setOverridePath (new Haxelib (\"lime-tools\"), Path.combine (Haxelib.getPath (new Haxelib (\"lime\")), \"tools\"));\n\n\t\tprocessArguments();\n\t\tversion = Haxelib.getVersion();\n\n\t\tif (targetFlags.exists(\"openfl\"))\n\t\t{\n\t\t\tLog.accentColor = \"\\x1b[36;1m\";\n\t\t\tcommandName = \"openfl\";\n\t\t\tdefaultLibrary = \"openfl\";\n\t\t\tdefaultLibraryName = \"OpenFL\";\n\t\t}\n\n\t\tif (command == \"\" && targetFlags.exists(\"help\"))\n\t\t{\n\t\t\tcommand = \"help\";\n\t\t}\n\n\t\tif (Log.verbose && command != \"help\" && command != \"\")\n\t\t{\n\t\t\tdisplayInfo();\n\t\t\tSys.println(\"\");\n\t\t}\n\n\t\tswitch (command)\n\t\t{\n\t\t\tcase \"\":\n\t\t\t\tif (targetFlags.exists(\"version\"))\n\t\t\t\t{\n\t\t\t\t\tSys.println(getToolsVersion());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdisplayInfo(true);\n\n\t\t\tcase \"help\":\n\t\t\t\tdisplayHelp();\n\n\t\t\tcase \"config\":\n\t\t\t\tdisplayConfig();\n\n\t\t\tcase \"setup\":\n\t\t\t\tplatformSetup();\n\n\t\t\tcase \"document\":\n\t\t\t\tdocument();\n\n\t\t\tcase \"generate\":\n\t\t\t\tgenerate();\n\n\t\t\tcase \"compress\":\n\t\t\t\tcompress();\n\n\t\t\tcase \"create\":\n\t\t\t\tcreateTemplate();\n\n\t\t\tcase \"install\", \"remove\", \"upgrade\":\n\t\t\t\tupdateLibrary();\n\n\t\t\tcase \"clean\", \"update\", \"display\", \"build\", \"run\", \"rerun\", /*\"install\",*/ \"uninstall\", \"trace\", \"test\", \"deploy\":\n\t\t\t\tif (words.length < 1 || words.length > 2)\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"Incorrect number of arguments for command '\" + command + \"'\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar project = initializeProject();\n\t\t\t\tbuildProject(project);\n\n\t\t\tcase \"rebuild\":\n\t\t\t\tif (words.length < 1 || words.length > 2)\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"Incorrect number of arguments for command '\" + command + \"'\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (words.length == 1)\n\t\t\t\t{\n\t\t\t\t\tvar haxelibPath = Haxelib.getPath(new Haxelib(words[0]), false);\n\n\t\t\t\t\tif (haxelibPath != \"\" && haxelibPath != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Log.verbose)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.println('Rebuilding tools for haxelib: ${words[0]}');\n\t\t\t\t\t\t}\n\t\t\t\t\t\twords.push(\"tools\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (words.length < 2)\n\t\t\t\t{\n\t\t\t\t\tif (targetFlags.exists(\"openfl\"))\n\t\t\t\t\t{\n\t\t\t\t\t\twords.unshift(\"openfl\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twords.unshift(\"lime\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar targets = words[1].split(\",\");\n\n\t\t\t\tvar haxelib:Haxelib = null;\n\t\t\t\tvar path:String = null;\n\t\t\t\tvar hxmlPath:String = null;\n\n\t\t\t\tif (!FileSystem.exists(words[0]))\n\t\t\t\t{\n\t\t\t\t\tvar fullPath = Path.tryFullPath(words[0]);\n\n\t\t\t\t\tif (FileSystem.exists(fullPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = Path.combine(fullPath, \"project\");\n\t\t\t\t\t\thxmlPath = Path.combine(fullPath, \"rebuild.hxml\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thaxelib = new Haxelib(words[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (FileSystem.isDirectory(words[0]))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (FileSystem.exists(Path.combine(words[0], \"Build.xml\")))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = words[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath = Path.combine(words[0], \"project/Build.xml\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thxmlPath = Path.combine(words[0], \"rebuild.hxml\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = words[0];\n\n\t\t\t\t\t\tif (Path.extension(words[0]) == \"hxml\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thxmlPath = words[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar haxelibPath = Haxelib.getPath(new Haxelib(words[0]));\n\n\t\t\t\t\tif (!FileSystem.exists(path) && haxelibPath != null)\n\t\t\t\t\t{\n\t\t\t\t\t\thaxelib = new Haxelib(words[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (haxelib != null)\n\t\t\t\t{\n\t\t\t\t\tvar haxelibPath = Haxelib.getPath(haxelib, true);\n\n\t\t\t\t\tswitch (haxelib.name)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"hxcpp\":\n\t\t\t\t\t\t\thxmlPath = Path.combine(haxelibPath, \"tools/hxcpp/compile.hxml\");\n\n\t\t\t\t\t\tcase \"haxelib\":\n\t\t\t\t\t\t\thxmlPath = Path.combine(haxelibPath, \"../client.hxml\");\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\thxmlPath = Path.combine(haxelibPath, \"rebuild.hxml\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (targetName in targets)\n\t\t\t\t{\n\t\t\t\t\tvar target:Platform = null;\n\n\t\t\t\t\tswitch (targetName)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"cpp\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"cpp\", \"\");\n\n\t\t\t\t\t\tcase \"neko\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"neko\", \"\");\n\n\t\t\t\t\t\tcase \"hl\", \"hashlink\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"hl\", \"\");\n\n\t\t\t\t\t\tcase \"cppia\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"cppia\", \"\");\n\n\t\t\t\t\t\tcase \"java\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"java\", \"\");\n\n\t\t\t\t\t\tcase \"nodejs\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"nodejs\", \"\");\n\n\t\t\t\t\t\tcase \"cs\":\n\t\t\t\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\t\t\t\ttargetFlags.set(\"cs\", \"\");\n\n\t\t\t\t\t\tcase \"iphone\", \"iphoneos\":\n\t\t\t\t\t\t\ttarget = Platform.IOS;\n\n\t\t\t\t\t\tcase \"iphonesim\":\n\t\t\t\t\t\t\ttarget = Platform.IOS;\n\t\t\t\t\t\t\ttargetFlags.set(\"simulator\", \"\");\n\n\t\t\t\t\t\tcase \"electron\":\n\t\t\t\t\t\t\ttarget = Platform.HTML5;\n\t\t\t\t\t\t\ttargetFlags.set(\"electron\", \"\");\n\n\t\t\t\t\t\tcase \"firefox\", \"firefoxos\":\n\t\t\t\t\t\t\ttarget = Platform.FIREFOX;\n\t\t\t\t\t\t\toverrides.haxedefs.set(\"firefoxos\", \"\");\n\n\t\t\t\t\t\tcase \"appletv\", \"appletvos\":\n\t\t\t\t\t\t\ttarget = Platform.TVOS;\n\n\t\t\t\t\t\tcase \"appletvsim\":\n\t\t\t\t\t\t\ttarget = Platform.TVOS;\n\t\t\t\t\t\t\ttargetFlags.set(\"simulator\", \"\");\n\n\t\t\t\t\t\tcase \"mac\", \"macos\":\n\t\t\t\t\t\t\ttarget = Platform.MAC;\n\n\t\t\t\t\t\tcase \"rpi\", \"raspberrypi\":\n\t\t\t\t\t\t\ttarget = Platform.LINUX;\n\t\t\t\t\t\t\ttargetFlags.set(\"rpi\", \"\");\n\n\t\t\t\t\t\tcase \"webassembly\", \"wasm\", \"emscripten\":\n\t\t\t\t\t\t\ttarget = Platform.WEB_ASSEMBLY;\n\t\t\t\t\t\t\ttargetFlags.set(\"webassembly\", \"\");\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\ttarget = cast targetName.toLowerCase();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (target == cast \"tools\")\n\t\t\t\t\t{\n\t\t\t\t\t\tif (hxmlPath != null && FileSystem.exists(hxmlPath))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar cacheValue = Sys.getEnv(\"HAXELIB_PATH\");\n\t\t\t\t\t\t\tSys.putEnv(\"HAXELIB_PATH\", Haxelib.getRepositoryPath());\n\n\t\t\t\t\t\t\tSystem.runCommand(Path.directory(hxmlPath), \"haxe\", [Path.withoutDirectory(hxmlPath)]);\n\n\t\t\t\t\t\t\tif (cacheValue != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.putEnv(\"HAXELIB_PATH\", cacheValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (haxelib != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLog.warn('No rebuild script found for haxelib \"${haxelib.name}\"');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLog.warn('No rebuild script found at \"${words[0]}\"');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tHXProject._command = command;\n\t\t\t\t\t\tHXProject._environment = environment;\n\t\t\t\t\t\tHXProject._debug = debug;\n\t\t\t\t\t\tHXProject._target = target;\n\t\t\t\t\t\tHXProject._targetFlags = targetFlags;\n\t\t\t\t\t\tHXProject._userDefines = userDefines;\n\n\t\t\t\t\t\tvar project:HXProject = null;\n\n\t\t\t\t\t\tif (haxelib != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserDefines.set(\"rebuild\", 1);\n\t\t\t\t\t\t\tproject = HXProject.fromHaxelib(haxelib, userDefines);\n\n\t\t\t\t\t\t\tif (project == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tproject = new HXProject();\n\t\t\t\t\t\t\t\tproject.config.set(\"project.rebuild.path\", Path.combine(Haxelib.getPath(haxelib), \"project\"));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tproject.config.set(\"project.rebuild.path\", Path.combine(Haxelib.getPath(haxelib), project.config.get(\"project.rebuild.path\")));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// project =  HXProject.fromPath (path);\n\n\t\t\t\t\t\t\tif (project == null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tproject = new HXProject();\n\n\t\t\t\t\t\t\t\tif (FileSystem.isDirectory(path))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tproject.config.set(\"project.rebuild.path\", path);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tproject.config.set(\"project.rebuild.path\", Path.directory(path));\n\t\t\t\t\t\t\t\t\tproject.config.set(\"project.rebuild.file\", Path.withoutDirectory(path));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// this needs to be improved\n\n\t\t\t\t\t\tvar rebuildPath = project.config.get(\"project.rebuild.path\");\n\t\t\t\t\t\tvar rebuildFile = project.config.get(\"project.rebuild.file\");\n\n\t\t\t\t\t\tproject.merge(overrides);\n\n\t\t\t\t\t\tfor (haxelib in overrides.haxelibs)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar includeProject = HXProject.fromHaxelib(haxelib, project.defines);\n\n\t\t\t\t\t\t\tif (includeProject != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfor (ndll in includeProject.ndlls)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (ndll.haxelib == null)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tndll.haxelib = haxelib;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tproject.merge(includeProject);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tproject.config.set(\"project.rebuild.path\", rebuildPath);\n\t\t\t\t\t\tproject.config.set(\"project.rebuild.file\", rebuildFile);\n\n\t\t\t\t\t\t// TODO: Fix use of initialize without resetting reference?\n\n\t\t\t\t\t\tproject = initializeProject(project, targetName);\n\t\t\t\t\t\tbuildProject(project);\n\n\t\t\t\t\t\tif (Log.verbose)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.println(\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tcase \"publish\":\n\t\t\t\tif (words.length < 1 || words.length > 2)\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"Incorrect number of arguments for command '\" + command + \"'\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpublishProject();\n\n\t\t\tcase \"installer\", \"copy-if-newer\":\n\n\t\t\t// deprecated?\n\n\t\t\tdefault:\n\t\t\t\tLog.error(\"'\" + command + \"' is not a valid command\");\n\t\t}\n\t}\n\n\t#if neko\n\tpublic static function __init__():Void\n\t{\n\t\tvar args = Sys.args();\n\n\t\tif (args.length > 0 && args[0].toLowerCase() == \"rebuild\")\n\t\t{\n\t\t\tCFFI.enabled = false;\n\t\t}\n\n\t\tfor (arg in args)\n\t\t{\n\t\t\t// TODO: Allow -rebuild without locking native binary?\n\n\t\t\tif (arg == \"-nocffi\" || arg == \"-rebuild\")\n\t\t\t{\n\t\t\t\tCFFI.enabled = false;\n\t\t\t}\n\t\t}\n\n\t\tvar path = \"\";\n\n\t\tif (FileSystem.exists(\"tools.n\"))\n\t\t{\n\t\t\tpath = Path.combine(Sys.getCwd(), \"../ndll/\");\n\t\t}\n\t\telse if (FileSystem.exists(\"run.n\"))\n\t\t{\n\t\t\tpath = Sys.getCwd() + \"/ndll/\";\n\t\t}\n\n\t\tif (path == \"\")\n\t\t{\n\t\t\tvar process = new Process(\"haxelib\", [\"path\", \"lime\"]);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\tvar line = StringTools.trim(process.stdout.readLine());\n\n\t\t\t\t\tif (StringTools.startsWith(line, \"-L \"))\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = StringTools.trim(line.substr(2));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tprocess.close();\n\t\t}\n\n\t\tswitch (System.hostPlatform)\n\t\t{\n\t\t\tcase WINDOWS:\n\t\t\t\t// var is64 = neko.Lib.load(\"std\", \"sys_is64\", 0)();\n\t\t\t\tuntyped $loader.path = $array(path + \"Windows/\", $loader.path);\n\t\t\t\tif (CFFI.enabled)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tneko.Lib.load(\"lime\", \"lime_application_create\", 0);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t{\n\t\t\t\t\t\tuntyped $loader.path = $array(path + \"Windows64/\", $loader.path);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tcase MAC:\n\t\t\t\tif (System.hostArchitecture == X64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Mac64/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse if (System.hostArchitecture == ARM64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"MacArm64/\", $loader.path);\n\t\t\t\t}\n\n\t\t\tcase LINUX:\n\t\t\t\tvar arguments = Sys.args();\n\n\t\t\t\tif (System.hostArchitecture == ARMV7 )\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"LinuxArm/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse if (System.hostArchitecture == ARM64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"LinuxArm64/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse if (System.hostArchitecture == X64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Linux64/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Linux/\", $loader.path);\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t}\n\t}\n\t#end\n\n\tprivate function buildProject(project:HXProject, command:String = \"\")\n\t{\n\t\tif (command == \"\")\n\t\t{\n\t\t\tcommand = project.command.toLowerCase();\n\t\t}\n\n\t\tif (project.targetHandlers.exists(Std.string(project.target)))\n\t\t{\n\t\t\tif (command == \"build\" || command == \"test\")\n\t\t\t{\n\t\t\t\tCommandHelper.executeCommands(project.preBuildCallbacks);\n\t\t\t}\n\n\t\t\tLog.info(\"\", Log.accentColor + \"Using target platform: \" + Std.string(project.target).toUpperCase() + \"\\x1b[0m\");\n\n\t\t\tvar handler = project.targetHandlers.get(Std.string(project.target));\n\t\t\tvar projectData = Serializer.run(project);\n\t\t\tvar temporaryFile = System.getTemporaryFile();\n\t\t\tFile.saveContent(temporaryFile, projectData);\n\n\t\t\tvar targetDir = Haxelib.getPath(new Haxelib(handler));\n\t\t\tvar exePath = Path.join([targetDir, \"run.exe\"]);\n\t\t\tvar exeExists = FileSystem.exists(exePath);\n\n\t\t\tvar args = [command, temporaryFile];\n\n\t\t\tif (Log.verbose) args.push(\"-verbose\");\n\t\t\tif (!Log.enableColor) args.push(\"-nocolor\");\n\t\t\tif (!traceEnabled) args.push(\"-notrace\");\n\n\t\t\tif (additionalArguments.length > 0)\n\t\t\t{\n\t\t\t\targs.push(\"-args\");\n\t\t\t\targs = args.concat(additionalArguments);\n\t\t\t}\n\n\t\t\tif (exeExists)\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", exePath, args);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tHaxelib.runCommand(\"\", [\"run\", handler].concat(args));\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFileSystem.deleteFile(temporaryFile);\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tif (command == \"build\" || command == \"test\")\n\t\t\t{\n\t\t\t\tCommandHelper.executeCommands(project.postBuildCallbacks);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar platform:PlatformTarget = null;\n\n\t\t\tswitch (project.target)\n\t\t\t{\n\t\t\t\tcase ANDROID:\n\t\t\t\t\tplatform = new AndroidPlatform(command, project, targetFlags);\n\n\t\t\t\tcase BLACKBERRY:\n\n\t\t\t\t// platform = new BlackBerryPlatform (command, project, targetFlags);\n\n\t\t\t\tcase IOS:\n\t\t\t\t\tplatform = new IOSPlatform(command, project, targetFlags);\n\n\t\t\t\tcase TIZEN:\n\n\t\t\t\t// platform = new TizenPlatform (command, project, targetFlags);\n\n\t\t\t\tcase WEBOS:\n\n\t\t\t\t// platform = new WebOSPlatform (command, project, targetFlags);\n\n\t\t\t\tcase WINDOWS:\n\t\t\t\t\tplatform = new WindowsPlatform(command, project, targetFlags);\n\n\t\t\t\tcase MAC:\n\t\t\t\t\tplatform = new MacPlatform(command, project, targetFlags);\n\n\t\t\t\tcase LINUX:\n\t\t\t\t\tplatform = new LinuxPlatform(command, project, targetFlags);\n\n\t\t\t\tcase FLASH:\n\t\t\t\t\tplatform = new FlashPlatform(command, project, targetFlags);\n\n\t\t\t\tcase HTML5:\n\t\t\t\t\tplatform = new HTML5Platform(command, project, targetFlags);\n\n\t\t\t\t// case FIREFOX:\n\n\t\t\t\t// \tplatform = new FirefoxPlatform (command, project, targetFlags);\n\n\t\t\t\tcase WEB_ASSEMBLY:\n\t\t\t\t\tplatform = new WebAssemblyPlatform(command, project, targetFlags);\n\n\t\t\t\tcase TVOS:\n\t\t\t\t\tplatform = new TVOSPlatform(command, project, targetFlags);\n\n\t\t\t\tcase AIR:\n\t\t\t\t\tplatform = new AIRPlatform(command, project, targetFlags);\n\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tif (platform != null)\n\t\t\t{\n\t\t\t\tplatform.traceEnabled = traceEnabled;\n\t\t\t\tplatform.execute(additionalArguments);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error(\"\\\"\" + Std.string(project.target) + \"\\\" is an unknown target\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function compress()\n\t{\n\t\tif (words.length > 0)\n\t\t{\n\t\t\t// var bytes = new ByteArray ();\n\t\t\t// bytes.writeUTFBytes (words[0]);\n\t\t\t// bytes.compress (CompressionAlgorithm.LZMA);\n\t\t\t// Sys.print (bytes.toString ());\n\t\t\t// File.saveBytes (words[0] + \".compress\", bytes);\n\t\t}\n\t}\n\n\tprivate function createTemplate()\n\t{\n\t\tLog.info(\"\", Log.accentColor + \"Running command: CREATE\\x1b[0m\");\n\n\t\tif (words.length > 0)\n\t\t{\n\t\t\tvar colonIndex = words[0].indexOf(\":\");\n\n\t\t\tvar projectName:String = null;\n\t\t\tvar sampleName:String = null;\n\n\t\t\tif (colonIndex == -1)\n\t\t\t{\n\t\t\t\tprojectName = words[0];\n\n\t\t\t\tif (words.length > 1)\n\t\t\t\t{\n\t\t\t\t\tsampleName = words[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprojectName = words[0].substring(0, colonIndex);\n\t\t\t\tsampleName = words[0].substr(colonIndex + 1);\n\t\t\t}\n\n\t\t\tif (projectName == \"project\" || sampleName == \"project\")\n\t\t\t{\n\t\t\t\tCreateTemplate.createProject(words, userDefines, overrides);\n\t\t\t}\n\t\t\telse if (projectName == \"extension\" || sampleName == \"extension\")\n\t\t\t{\n\t\t\t\tCreateTemplate.createExtension(words, userDefines);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sampleName == null)\n\t\t\t\t{\n\t\t\t\t\tvar sampleExists = false;\n\t\t\t\t\tvar defines = new Map<String, Dynamic>();\n\t\t\t\t\tdefines.set(\"create\", 1);\n\t\t\t\t\tvar project = HXProject.fromHaxelib(new Haxelib(defaultLibrary), defines);\n\n\t\t\t\t\tfor (samplePath in project.samplePaths)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (FileSystem.exists(Path.combine(samplePath, projectName)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsampleExists = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (sampleExists)\n\t\t\t\t\t{\n\t\t\t\t\t\tCreateTemplate.createSample(words, userDefines);\n\t\t\t\t\t}\n\t\t\t\t\telse if (Haxelib.getPath(new Haxelib(projectName)) != \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tCreateTemplate.listSamples(projectName, userDefines);\n\t\t\t\t\t}\n\t\t\t\t\telse if (projectName == \"\" || projectName == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tCreateTemplate.listSamples(defaultLibrary, userDefines);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tCreateTemplate.listSamples(null, userDefines);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCreateTemplate.createSample(words, userDefines);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCreateTemplate.listSamples(defaultLibrary, userDefines);\n\t\t}\n\t}\n\n\tprivate function displayConfig():Void\n\t{\n\t\tif (words.length == 0)\n\t\t{\n\t\t\tLog.println(File.getContent(ConfigHelper.getConfigPath()));\n\t\t}\n\t\telse if (words.length == 1)\n\t\t{\n\t\t\tvar value = ConfigHelper.getConfigValue(words[0]);\n\n\t\t\tif (value != null)\n\t\t\t{\n\t\t\t\tLog.println(value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error(\"\\\"\" + words[0] + \"\\\" is undefined\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar name = words.shift();\n\t\t\tvar value = words.join(\" \");\n\n\t\t\tif (name == \"remove\")\n\t\t\t{\n\t\t\t\tConfigHelper.removeConfigValue(value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tConfigHelper.writeConfigValue(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function displayHelp():Void\n\t{\n\t\tvar commands = [\n\n\t\t\t         \"config\" => \"Display or set command-line configuration values\",    \"create\" => \"Create a new project or extension using templates\",\n\t\t\t                    \"clean\" => \"Clean the specified project and target\",     \"update\" => \"Copy assets for the specified project and target\",\n\t\t\t  \"build\" => \"Compile and package for the specified project and target\",    \"run\" => \"Install and run for the specified project and target\",\n\t\t\t                       \"test\" => \"Update, build and run in one command\",                                  \"help\" => \"Show this information\",\n\t\t\t          \"trace\" => \"Trace output for the specifed project and target\",                            \"deploy\" => \"Archive and upload builds\",\n\t\t\t\"display\" => \"Display information for the specified project and target\",             \"rebuild\" => \"Recompile native binaries for libraries\",\n\t\t\t       \"install\" => \"Install a library from haxelib, plus dependencies\",                        \"remove\" => \"Remove a library from haxelib\",\n\t\t\t                          \"upgrade\" => \"Upgrade a library from haxelib\", \"setup\" => \"Setup \" + defaultLibraryName + \" or a specific platform\"\n\n\t\t];\n\n\t\tvar basicCommands = [\"config\", \"create\", \"clean\", \"update\", \"build\", \"run\", \"test\", \"help\"];\n\t\tvar additionalCommands = [\"trace\", \"deploy\", \"display\", \"rebuild\", \"install\", \"remove\", \"upgrade\", \"setup\"];\n\n\t\tif (targetFlags.exists(\"openfl\"))\n\t\t{\n\t\t\tcommands.set(\"process\", \"Process a SWF asset for use with \" + defaultLibraryName);\n\t\t\tadditionalCommands.push(\"process\");\n\t\t}\n\n\t\tvar command = (words.length > 0 ? words[0] : \"\");\n\t\tvar isProjectCommand = false, isBuildCommand = false;\n\n\t\tif (commands.exists(command))\n\t\t{\n\t\t\tLog.println(\"\\x1b[1m\" + commands.get(command) + \"\\x1b[0m\");\n\t\t\tLog.println(\"\");\n\t\t}\n\n\t\tswitch (command)\n\t\t{\n\t\t\tcase \"setup\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" setup\\x1b[0m \\x1b[3;37m(target)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\n\t\t\tcase \"clean\", \"update\", \"build\", \"run\", \"test\", \"display\", \"deploy\", \"trace\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" \"\n\t\t\t\t\t+ command\n\t\t\t\t\t+ \"\\x1b[0m \\x1b[3;37m(project)\\x1b[0m \\x1b[1m<target>\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\t\t\t\tisProjectCommand = true;\n\t\t\t\tisBuildCommand = true;\n\n\t\t\tcase \"create\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" create\\x1b[0m \\x1b[3;37m(library)\\x1b[0m \\x1b[1mproject\\x1b[0m \\x1b[3;37m(directory)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" create\\x1b[0m \\x1b[3;37m(library)\\x1b[0m \\x1b[1mextension\\x1b[0m \\x1b[3;37m(directory)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" create\\x1b[0m \\x1b[3;37m(library)\\x1b[0m \\x1b[1m<sample>\\x1b[0m \\x1b[3;37m(directory)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\n\t\t\tcase \"rebuild\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" rebuild\\x1b[0m \\x1b[3;37m(library)\\x1b[0m \\x1b[3;37m(target)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\t\t\t\tisBuildCommand = true;\n\n\t\t\tcase \"config\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" config\\x1b[0m \\x1b[3;37m(name)\\x1b[0m \\x1b[3;37m(value)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" config remove <name>\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\n\t\t\tcase \"install\", \"remove\", \"upgrade\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" \"\n\t\t\t\t\t+ command\n\t\t\t\t\t+ \"\\x1b[0m \\x1b[3;37m(library)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\n\t\t\tcase \"process\":\n\t\t\t\tLog.println(\" \"\n\t\t\t\t\t+ Log.accentColor\n\t\t\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t\t\t+ commandName\n\t\t\t\t\t+ \" process <file>\\x1b[0m \\x1b[3;37m(directory)\\x1b[0m \\x1b[3;37m[options]\\x1b[0m\");\n\n\t\t\tdefault:\n\t\t\t\tdisplayInfo();\n\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\" \" + Log.accentColor + \"Usage:\\x1b[0m \\x1b[1m\" + commandName + \" <command>\\x1b[0m \\x1b[3;37m[arguments]\\x1b[0m\");\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\" \" + Log.accentColor + \"Basic Commands:\" + Log.resetColor);\n\t\t\t\tLog.println(\"\");\n\n\t\t\t\tfor (command in basicCommands)\n\t\t\t\t{\n\t\t\t\t\tLog.println(\"  \\x1b[1m\" + command + \"\\x1b[0m -- \" + commands.get(command));\n\t\t\t\t}\n\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\" \" + Log.accentColor + \"Additional Commands:\" + Log.resetColor);\n\t\t\t\tLog.println(\"\");\n\n\t\t\t\tfor (command in additionalCommands)\n\t\t\t\t{\n\t\t\t\t\tLog.println(\"  \\x1b[1m\" + command + \"\\x1b[0m -- \" + commands.get(command));\n\t\t\t\t}\n\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\"For additional help, run \\x1b[1m\" + commandName + \" help <command>\\x1b[0m\");\n\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (isBuildCommand || command == \"setup\")\n\t\t{\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\" \" + Log.accentColor + \"Targets:\" + Log.resetColor);\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"  \\x1b[1mair\\x1b[0m -- Create an AIR application\");\n\t\t\tLog.println(\"  \\x1b[1mandroid\\x1b[0m -- Create an Android application\");\n\t\t\t// Log.println (\"  \\x1b[1mblackberry\\x1b[0m -- Create a BlackBerry application\");\n\t\t\tLog.println(\"  \\x1b[1mflash\\x1b[0m -- Create a Flash SWF application\");\n\t\t\tLog.println(\"  \\x1b[1mhtml5\\x1b[0m -- Create an HTML5 application\");\n\t\t\tLog.println(\"  \\x1b[1mios\\x1b[0m -- Create an iOS application\");\n\t\t\tLog.println(\"  \\x1b[1mlinux\\x1b[0m -- Create a Linux application\");\n\t\t\tLog.println(\"  \\x1b[1mmac\\x1b[0m -- Create a macOS application\");\n\t\t\t// Log.println (\"  \\x1b[1mtizen\\x1b[0m -- Create a Tizen application\");\n\t\t\tLog.println(\"  \\x1b[1mtvos\\x1b[0m -- Create a tvOS application\");\n\t\t\t// Log.println (\"  \\x1b[1mwebos\\x1b[0m -- Create a webOS application\");\n\t\t\tLog.println(\"  \\x1b[1mwebassembly\\x1b[0m -- Create a WebAssembly application\");\n\t\t\tLog.println(\"  \\x1b[1mwindows\\x1b[0m -- Create a Windows application\");\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\" \" + Log.accentColor + \"Target Aliases:\" + Log.resetColor);\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"  \\x1b[1mcpp\\x1b[0m -- Alias for host platform (using \\x1b[1m-cpp\\x1b[0m)\");\n\t\t\tLog.println(\"  \\x1b[1mneko\\x1b[0m -- Alias for host platform (using \\x1b[1m-neko\\x1b[0m)\");\n\t\t\tLog.println(\"  \\x1b[1mmacos\\x1b[0m -- Alias for \\x1b[1mmac\\x1b[0m\");\n\t\t\tLog.println(\"  \\x1b[1mnodejs\\x1b[0m -- Alias for host platform (using \\x1b[1m-nodejs\\x1b[0m)\");\n\t\t\tLog.println(\"  \\x1b[1mjava\\x1b[0m -- Alias for host platform (using \\x1b[1m-java\\x1b[0m)\");\n\t\t\tLog.println(\"  \\x1b[1mcs\\x1b[0m -- Alias for host platform (using \\x1b[1m-cs\\x1b[0m)\");\n\t\t\tLog.println(\"  \\x1b[1mhl/hashlink\\x1b[0m -- Alias for host platform (using \\x1b[1m-hl\\x1b[0m)\");\n\t\t\tLog.println(\"  \\x1b[1mhlc\\x1b[0m -- Alias for host platform (using \\x1b[1m-hlc\\x1b[0m)\");\n\t\t\t#if (lime >= \"7.6.0\")\n\t\t\t// Log.println(\"  \\x1b[1mcppia\\x1b[0m -- Alias for host platform (using \\x1b[1m-cppia\\x1b[0m)\");\n\t\t\t#end\n\t\t\tLog.println(\"  \\x1b[1muwp\\x1b[0;3m/\\x1b[0m\\x1b[1mwinjs\\x1b[0m -- Alias for \\x1b[1mwindows -uwp\\x1b[0m\");\n\t\t\t// Log.println (\"  \\x1b[1miphone\\x1b[0;3m/\\x1b[0m\\x1b[1miphoneos\\x1b[0m -- \\x1b[1mios\\x1b[0m\");\n\t\t\t// Log.println (\"  \\x1b[1miphonesim\\x1b[0m -- Alias for \\x1b[1mios -simulator\\x1b[0m\");\n\t\t\t// Log.println (\"  \\x1b[1mappletv\\x1b[0;3m/\\x1b[0m\\x1b[1mappletvos\\x1b[0m -- Alias for \\x1b[1mtvos\\x1b[0m\");\n\t\t\t// Log.println (\"  \\x1b[1mappletvsim\\x1b[0m -- Alias for \\x1b[1mtvos -simulator\\x1b[0m\");\n\t\t\tLog.println(\"  \\x1b[1mrpi\\x1b[0;3m/\\x1b[0m\\x1b[1mraspberrypi\\x1b[0m -- Alias for \\x1b[1mlinux -rpi\\x1b[0m\");\n\t\t\tLog.println(\"  \\x1b[1melectron\\x1b[0m -- Alias for \\x1b[1mhtml5 -electron\\x1b[0m\");\n\t\t\tLog.println(\"  \\x1b[1mwasm/emscripten\\x1b[0m -- Alias for \\x1b[1mwebassembly\\x1b[0m\");\n\t\t}\n\n\t\tLog.println(\"\");\n\t\tLog.println(\" \" + Log.accentColor + \"Options:\" + Log.resetColor);\n\t\tLog.println(\"\");\n\n\t\tif (command == \"setup\")\n\t\t{\n\t\t\tLog.println(\"  \\x1b[1m-cli\\x1b[0;3m/\\x1b[0m\\x1b[1m-alias\\x1b[0m -- Set up \" + defaultLibraryName + \" alias only, skipping haxelib installs\");\n\t\t\tLog.println(\"  \\x1b[1m-noalias\\x1b[0m -- Do not set up \" + defaultLibraryName + \" alias\");\n\t\t}\n\n\t\tif (isBuildCommand)\n\t\t{\n\t\t\tLog.println(\"  \\x1b[1m-D\\x1b[0;3mvalue\\x1b[0m -- Specify a define to use when processing other commands\");\n\t\t\tLog.println(\"  \\x1b[1m-debug\\x1b[0m -- Use debug configuration instead of release\");\n\t\t\tLog.println(\"  \\x1b[1m-final\\x1b[0m -- Use final configuration instead of release\");\n\t\t}\n\n\t\tLog.println(\"  \\x1b[1m-v\\x1b[0;3m/\\x1b[0m\\x1b[1m-verbose\\x1b[0m -- Print additional information (when available)\");\n\n\t\tif (isBuildCommand && command != \"run\" && command != \"trace\")\n\t\t{\n\t\t\tLog.println(\"  \\x1b[1m-clean\\x1b[0m -- Add a \\\"clean\\\" action before running the current command\");\n\t\t}\n\n\t\tLog.println(\"  \\x1b[1m-nocolor\\x1b[0m -- Disable ANSI format codes in output\");\n\n\t\tif (command == \"run\" || command == \"test\")\n\t\t{\n\t\t\tLog.println(\"  \\x1b[1m-notrace\\x1b[0m -- Disable trace output during run or test command\");\n\t\t}\n\n\t\tLog.println(\"  \\x1b[1m-dryrun\\x1b[0m -- Execute the requested command without making changes\");\n\n\t\tif (isProjectCommand && command != \"run\" && command != \"trace\")\n\t\t{\n\t\t\tLog.println(\"  \\x1b[1m-xml\\x1b[0m -- Generate XML type information, useful for documentation\");\n\t\t}\n\n\t\tif (command == \"run\" || command == \"test\")\n\t\t{\n\t\t\tLog.println(\"  \\x1b[1m--\\x1b[0;3m/\\x1b[0m\\x1b[1m-args\\x1b[0m ... -- Pass additional arguments at launch\");\n\t\t}\n\n\t\tif (isProjectCommand)\n\t\t{\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-cpp\\x1b[0m -- Build with C++ (default behavior)\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-neko\\x1b[0m -- Build with Neko instead of C++\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|ios|android)\\x1b[0m \\x1b[1m-air\\x1b[0m -- Build with AIR instead of C++\");\n\t\t}\n\n\t\tif (isBuildCommand)\n\t\t{\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux|android)\\x1b[0m \\x1b[1m-static\\x1b[0m -- Compile as a static C++ executable\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-x86_32\\x1b[0m -- Compile for x86_32 instead of the OS default\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-x86_64\\x1b[0m -- Compile for x86_64 instead of the OS default\");\n\t\t\tLog.println(\"  \\x1b[3m(ios|android)\\x1b[0m \\x1b[1m-armv6\\x1b[0m -- Compile for ARMv6 instead of the OS defaults\");\n\t\t\tLog.println(\"  \\x1b[3m(ios|android)\\x1b[0m \\x1b[1m-armv7\\x1b[0m -- Compile for ARMv7 instead of the OS defaults\");\n\t\t\tLog.println(\"  \\x1b[3m(ios|android)\\x1b[0m \\x1b[1m-armv7s\\x1b[0m -- Compile for ARMv7s instead of the OS defaults\");\n\t\t\tLog.println(\"  \\x1b[3m(mac|ios|android)\\x1b[0m \\x1b[1m-arm64\\x1b[0m -- Compile for ARM64 instead of the OS defaults\");\n\t\t\tLog.println(\"  \\x1b[3m(ios)\\x1b[0m \\x1b[1m-nosign\\x1b[0m -- Compile executable, but skip codesigning\");\n\t\t}\n\n\t\tif (isProjectCommand)\n\t\t{\n\t\t\tLog.println(\"  \\x1b[3m(ios)\\x1b[0m \\x1b[1m-archive\\x1b[0m -- Generate iOS archive during build\");\n\t\t}\n\n\t\tif (isProjectCommand)\n\t\t{\n\t\t\tif (command != \"run\" && command != \"trace\")\n\t\t\t{\n\t\t\t\tLog.println(\"  \\x1b[3m(ios)\\x1b[0m \\x1b[1m-xcode\\x1b[0m -- Launch the generated Xcode project\");\n\t\t\t}\n\n\t\t\t// Log.println (\"  \\x1b[3m(ios|blackberry|tizen|tvos|webos)\\x1b[0m \\x1b[1m-simulator\\x1b[0m -- Target the device simulator\");\n\t\t\tLog.println(\"  \\x1b[3m(ios|tvos)\\x1b[0m \\x1b[1m-simulator\\x1b[0m -- Target the device simulator\");\n\t\t\tLog.println(\"  \\x1b[3m(ios)\\x1b[0m \\x1b[1m-simulator -ipad\\x1b[0m -- Build/test for the iPad Simulator\");\n\t\t\tLog.println(\"  \\x1b[3m(android)\\x1b[0m \\x1b[1m-emulator\\x1b[0m -- Target the device emulator\");\n\t\t\tLog.println(\"  \\x1b[3m(html5)\\x1b[0m \\x1b[1m-npm\\x1b[0m -- Target HTML5 using an NPM project structure\");\n\t\t\tLog.println(\"  \\x1b[3m(flash)\\x1b[0m \\x1b[1m-web\\x1b[0m -- Test Flash target using a web template\");\n\t\t\tLog.println(\"  \\x1b[3m(air)\\x1b[0m \\x1b[1m-ios\\x1b[0m -- Target iOS instead of AIR desktop\");\n\t\t\tLog.println(\"  \\x1b[3m(air)\\x1b[0m \\x1b[1m-android\\x1b[0m -- Target Android instead of AIR desktop\");\n\t\t\tLog.println(\"  \\x1b[3m(air)\\x1b[0m \\x1b[1m-ios -air-simulator\\x1b[0m -- Target AIR simulator as iOS\");\n\t\t\tLog.println(\"  \\x1b[3m(air)\\x1b[0m \\x1b[1m-android -air-simulator\\x1b[0m -- Target AIR simulator as Android\");\n\n\t\t\tif (command != \"run\" && command != \"trace\")\n\t\t\t{\n\t\t\t\tLog.println(\"  \\x1b[3m(html5|webassembly)\\x1b[0m \\x1b[1m-minify\\x1b[0m -- Minify application file\");\n\t\t\t}\n\n\t\t\tif (command == \"run\" || command == \"test\")\n\t\t\t{\n\t\t\t\tLog.println(\"  \\x1b[3m(html5|flash|webassembly)\\x1b[0m \\x1b[1m-nolaunch\\x1b[0m -- Begin test server without launching\");\n\t\t\t\t// Log.println (\"  \\x1b[3m(html5)\\x1b[0m \\x1b[1m-minify\\x1b[0m -- Minify output using the Google Closure compiler\");\n\t\t\t\t// Log.println (\"  \\x1b[3m(html5)\\x1b[0m \\x1b[1m-minify -yui\\x1b[0m -- Minify output using the YUI compressor\");\n\t\t\t\tLog.println(\"  \\x1b[3m(html5|flash|webassembly)\\x1b[0m \\x1b[1m--port=\\x1b[0;3mvalue\\x1b[0m -- Set port for test server\");\n\t\t\t}\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\" \" + Log.accentColor + \"Experimental Options:\" + Log.resetColor);\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"  \\x1b[1m-watch\\x1b[0m -- Execute the current command when the source changes\");\n\t\t\tLog.println(\"  \\x1b[3m(linux)\\x1b[0m \\x1b[1m-rpi\\x1b[0m -- Build for Raspberry Pi\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-java\\x1b[0m -- Build for Java instead of C++\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-nodejs\\x1b[0m -- Build for Node.js instead of C++\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-cs\\x1b[0m -- Build for C# instead of C++\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-hl\\x1b[0m -- Build for HashLink/JIT instead of C++\");\n\t\t\tLog.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-hlc\\x1b[0m -- Build for HashLink/C instead of C++\");\n\t\t\t#if (lime >= \"7.6.0\")\n\t\t\t// Log.println(\"  \\x1b[3m(windows|mac|linux)\\x1b[0m \\x1b[1m-cppia\\x1b[0m -- Build for CPPIA instead of C++\");\n\t\t\t#end\n\t\t\tLog.println(\"  \\x1b[3m(windows)\\x1b[0m \\x1b[1m-winjs\\x1b[0m -- Build for WinJS instead of C++ (implies UWP)\");\n\t\t\tLog.println(\"  \\x1b[3m(windows)\\x1b[0m \\x1b[1m-uwp\\x1b[0m -- Build for Universal Windows Platform\");\n\t\t\tLog.println(\"  \\x1b[3m(html5)\\x1b[0m \\x1b[1m-electron\\x1b[0m -- Target Electron instead of the browser\");\n\n\t\t\tif (command != \"run\" && command != \"trace\")\n\t\t\t{\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\" \" + Log.accentColor + \"Project Overrides:\" + Log.resetColor);\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\"  \\x1b[1m--app-\\x1b[0;3moption=value\\x1b[0m -- Override a project <app/> setting\");\n\t\t\t\tLog.println(\"  \\x1b[1m--meta-\\x1b[0;3moption=value\\x1b[0m -- Override a project <meta/> setting\");\n\t\t\t\tLog.println(\"  \\x1b[1m--window-\\x1b[0;3moption=value\\x1b[0m -- Override a project <window/> setting\");\n\t\t\t\tLog.println(\"  \\x1b[1m--dependency\\x1b[0;3m=value\\x1b[0m -- Add an additional <dependency/> value\");\n\t\t\t\tLog.println(\"  \\x1b[1m--haxedef\\x1b[0;3m=value\\x1b[0m -- Add an additional <haxedef/> value\");\n\t\t\t\tLog.println(\"  \\x1b[1m--haxeflag\\x1b[0;3m=value\\x1b[0m -- Add an additional <haxeflag/> value\");\n\t\t\t\tLog.println(\"  \\x1b[1m--haxelib\\x1b[0;3m=value\\x1b[0m -- Add an additional <haxelib/> value\");\n\t\t\t\tLog.println(\"  \\x1b[1m--haxelib-\\x1b[0;3mname=value\\x1b[0m -- Override the path to a haxelib\");\n\t\t\t\tLog.println(\"  \\x1b[1m--source\\x1b[0;3m=value\\x1b[0m -- Add an additional <source/> value\");\n\t\t\t\tLog.println(\"  \\x1b[1m--template\\x1b[0;3m=value\\x1b[0m -- Add an additional <template/> value\");\n\t\t\t\tLog.println(\"  \\x1b[1m--certificate-\\x1b[0;3moption=value\\x1b[0m -- Override a project <certificate/> setting\");\n\t\t\t}\n\n\t\t\tif (command == \"display\")\n\t\t\t{\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\" \" + Log.accentColor + \"Display Options:\" + Log.resetColor);\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.println(\"  \\x1b[3m(no option)\\x1b[0m -- Display HXML build arguments\");\n\t\t\t\tLog.println(\"  \\x1b[1m--output-file\\x1b[0m -- Display the output file for the project\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function displayInfo(showHint:Bool = false):Void\n\t{\n\t\t// var out = \"\";\n\t\t// for (i in 0...80) out += \"-\";\n\t\t// Log.println (out);\n\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tLog.println(\"\");\n\t\t}\n\n\t\tif (targetFlags.exists(\"openfl\"))\n\t\t{\n\t\t\tLog.println(\"\\x1b[37m .d88 88b.                             \\x1b[0m\\x1b[1;36m888888b 888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37md88P\\\" \\\"Y88b                            \\x1b[0m\\x1b[1;36m888     888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37m888     888                            \\x1b[0m\\x1b[1;36m888     888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37m888     888 88888b.   .d88b.  88888b.  \\x1b[0m\\x1b[1;36m8888888 888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37m888     888 888 \\\"88b d8P  Y8b 888 \\\"88b \\x1b[0m\\x1b[1;36m888     888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37m888     888 888  888 88888888 888  888 \\x1b[0m\\x1b[1;36m888     888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37mY88b. .d88P 888 d88P Y8b.     888  888 \\x1b[0m\\x1b[1;36m888     888 \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37m \\\"Y88 88P\\\"  88888P\\\"   \\\"Y8888  888  888 \\x1b[0m\\x1b[1;36m888     \\\"Y888P \\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[37m            888                                   \");\n\t\t\tLog.println(\"\\x1b[37m            888                                   \\x1b[0m\");\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"\\x1b[1mOpenFL Command-Line Tools\\x1b[0;1m (\" + getToolsVersion() + \")\\x1b[0m\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.println(\"\\x1b[32m_\\x1b[1m/\\\\\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m______________________________________________\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m_\\x1b[1m\\\\////\\\\\\\\\\\\\\x1b[0m\\x1b[32m______________________________________________\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m_____\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_____\\x1b[1m/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_____________________________________\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m______\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m____\\x1b[1m\\\\///\\x1b[0m\\x1b[32m_____\\x1b[1m/\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m/\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m_______\\x1b[1m/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m___\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m_______\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_____\\x1b[1m/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m/\\\\\\\\\\\\///\\\\\\\\\\\\\\\\\\\\///\\\\\\\\\\\\\\x1b[0m\\x1b[32m___\\x1b[1m/\\\\\\\\\\\\/////\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m________\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m____\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_\\x1b[1m\\\\//\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m___\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m_________\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m____\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_\\x1b[1m\\\\//\\\\\\\\///////\\x1b[0m\\x1b[32m____\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m________\\x1b[1m/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m_\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m_\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m\\\\/\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[1m\\\\//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\x1b[0m\\x1b[32m__\\x1b[0m\");\n\t\t\tLog.println(\"\\x1b[32m________\\x1b[1m\\\\/////////\\x1b[0m\\x1b[32m__\\x1b[1m\\\\///\\x1b[0m\\x1b[32m__\\x1b[1m\\\\///\\x1b[0m\\x1b[32m___\\x1b[1m\\\\///\\x1b[0m\\x1b[32m___\\x1b[1m\\\\///\\x1b[0m\\x1b[32m____\\x1b[1m\\\\//////////\\x1b[0m\\x1b[32m___\\x1b[0m\");\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"\\x1b[1mLime Command-Line Tools\\x1b[0;1m (\" + getToolsVersion() + \")\\x1b[0m\");\n\t\t}\n\n\t\tif (showHint)\n\t\t{\n\t\t\tLog.println(\"Use \\x1b[3m\"\n\t\t\t\t+ commandName\n\t\t\t\t+ \" setup\\x1b[0m to configure platforms or \\x1b[3m\"\n\t\t\t\t+ commandName\n\t\t\t\t+ \" help\\x1b[0m for more commands\");\n\t\t}\n\t}\n\n\tprivate function document():Void {}\n\n\tprivate function findProjectFile(path:String):String\n\t{\n\t\tif (FileSystem.exists(Path.combine(path, \"project.hxp\")))\n\t\t{\n\t\t\treturn Path.combine(path, \"project.hxp\");\n\t\t}\n\t\telse if (FileSystem.exists(Path.combine(path, \"project.lime\")))\n\t\t{\n\t\t\treturn Path.combine(path, \"project.lime\");\n\t\t}\n\t\telse if (FileSystem.exists(Path.combine(path, \"project.xml\")))\n\t\t{\n\t\t\treturn Path.combine(path, \"project.xml\");\n\t\t}\n\t\telse if (FileSystem.exists(Path.combine(path, \"project.nmml\")))\n\t\t{\n\t\t\treturn Path.combine(path, \"project.nmml\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar files = FileSystem.readDirectory(path);\n\t\t\tvar matches = new Map<String, Array<String>>();\n\t\t\tmatches.set(\"hxp\", []);\n\t\t\tmatches.set(\"lime\", []);\n\t\t\tmatches.set(\"nmml\", []);\n\t\t\tmatches.set(\"xml\", []);\n\n\t\t\tfor (file in files)\n\t\t\t{\n\t\t\t\tvar path = Path.combine(path, file);\n\n\t\t\t\tif (FileSystem.exists(path) && !FileSystem.isDirectory(path))\n\t\t\t\t{\n\t\t\t\t\tvar extension = Path.extension(file);\n\n\t\t\t\t\tif ((extension == \"lime\" && file != \"include.lime\")\n\t\t\t\t\t\t|| (extension == \"nmml\" && file != \"include.nmml\")\n\t\t\t\t\t\t|| (extension == \"xml\" && file != \"include.xml\")\n\t\t\t\t\t\t|| (extension == \"hxp\" && file != \"include.hxp\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tmatches.get(extension).push(path);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matches.get(\"hxp\").length > 0)\n\t\t\t{\n\t\t\t\treturn matches.get(\"hxp\")[0];\n\t\t\t}\n\n\t\t\tif (matches.get(\"lime\").length > 0)\n\t\t\t{\n\t\t\t\treturn matches.get(\"lime\")[0];\n\t\t\t}\n\n\t\t\tif (matches.get(\"nmml\").length > 0)\n\t\t\t{\n\t\t\t\treturn matches.get(\"nmml\")[0];\n\t\t\t}\n\n\t\t\tif (matches.get(\"xml\").length > 0)\n\t\t\t{\n\t\t\t\treturn matches.get(\"xml\")[0];\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\tprivate function generate():Void\n\t{\n\t\tif (targetFlags.exists(\"font-hash\"))\n\t\t{\n\t\t\tvar sourcePath = words[0];\n\t\t\tvar glyphs = \"32-255\";\n\n\t\t\tSystem.runCommand(Path.directory(sourcePath), \"neko\", [\n\t\t\t\tHaxelib.getPath(new Haxelib(\"lime\")) + \"/templates/bin/hxswfml.n\",\n\t\t\t\t\"ttf2hash2\",\n\t\t\t\tPath.withoutDirectory(sourcePath),\n\t\t\t\tPath.withoutDirectory(sourcePath) + \".hash\",\n\t\t\t\t\"-glyphs\",\n\t\t\t\tglyphs\n\t\t\t]);\n\t\t}\n\t\telse if (targetFlags.exists(\"font-details\"))\n\t\t{\n\t\t\t// var sourcePath = words[0];\n\n\t\t\t// var details = Font.load (sourcePath);\n\t\t\t// var json = Json.stringify (details);\n\t\t\t// Sys.print (json);\n\t\t}\n\t\telse if (targetFlags.exists(\"java-externs\"))\n\t\t{\n\t\t\tvar config = ConfigHelper.getConfig();\n\t\t\tvar sourcePath = words[0];\n\t\t\tvar targetPath = words[1];\n\n\t\t\tnew JavaExternGenerator(config, sourcePath, targetPath);\n\t\t}\n\t}\n\n\tprivate function getBuildNumber(project:HXProject, increment:Bool = true):Void\n\t{\n\t\tvar buildNumber = project.meta.buildNumber;\n\n\t\tif (buildNumber == null || StringTools.startsWith(buildNumber, \"git\"))\n\t\t{\n\t\t\tbuildNumber = getBuildNumber_GIT(project, increment);\n\t\t}\n\n\t\tif (buildNumber == null || StringTools.startsWith(buildNumber, \"svn\"))\n\t\t{\n\t\t\tbuildNumber = getBuildNumber_SVN(project, increment);\n\t\t}\n\n\t\tif (buildNumber == null || buildNumber == \".build\")\n\t\t{\n\t\t\tvar versionFile = Path.combine(project.app.path, \".build\");\n\t\t\tvar version = 1;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (FileSystem.exists(versionFile))\n\t\t\t\t{\n\t\t\t\t\tvar previousVersion = Std.parseInt(File.getBytes(versionFile).toString());\n\n\t\t\t\t\tif (previousVersion != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tversion = previousVersion;\n\n\t\t\t\t\t\tif (increment)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tversion++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tproject.meta.buildNumber = Std.string(version);\n\n\t\t\tif (increment)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(project.app.path);\n\n\t\t\t\t\tvar output = File.write(versionFile, false);\n\t\t\t\t\toutput.writeString(Std.string(version));\n\t\t\t\t\toutput.close();\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function getBuildNumber_GIT(project:HXProject, increment:Bool = true):String\n\t{\n\t\tvar cache = Log.mute;\n\t\tLog.mute = true;\n\n\t\tvar output = System.runProcess(\"\", \"git\", [\"rev-list\", \"HEAD\", \"--count\"], true, true, true);\n\n\t\tLog.mute = cache;\n\n\t\tif (output != null)\n\t\t{\n\t\t\tvar value = Std.parseInt(output);\n\n\t\t\tif (value != null)\n\t\t\t{\n\t\t\t\tvar buildNumber = project.meta.buildNumber;\n\n\t\t\t\tif (buildNumber != null && buildNumber.indexOf(\"+\") > -1)\n\t\t\t\t{\n\t\t\t\t\tvar modifier = Std.parseInt(buildNumber.substr(buildNumber.indexOf(\"+\") + 1));\n\n\t\t\t\t\tif (modifier != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue += modifier;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn project.meta.buildNumber = Std.string(value);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate function getBuildNumber_SVN(project:HXProject, increment:Bool = true):String\n\t{\n\t\tvar cache = Log.mute;\n\t\tLog.mute = true;\n\n\t\tvar output = System.runProcess(\"\", \"svn\", [\"info\"], true, true, true);\n\n\t\tLog.mute = cache;\n\n\t\tif (output != null)\n\t\t{\n\t\t\tvar searchString = \"Revision: \";\n\t\t\tvar index = output.indexOf(searchString);\n\n\t\t\tif (index > -1)\n\t\t\t{\n\t\t\t\tvar value = Std.parseInt(output.substring(index + searchString.length, output.indexOf(\"\\n\", index)));\n\n\t\t\t\tif (value != null)\n\t\t\t\t{\n\t\t\t\t\tvar buildNumber = project.meta.buildNumber;\n\n\t\t\t\t\tif (buildNumber != null && buildNumber.indexOf(\"+\") > -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar modifier = Std.parseInt(buildNumber.substr(buildNumber.indexOf(\"+\") + 1));\n\n\t\t\t\t\t\tif (modifier != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue += modifier;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn project.meta.buildNumber = Std.string(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate function getToolsVersion(version:String = null):String\n\t{\n\t\tif (version == null) version = this.version;\n\n\t\tif (targetFlags.exists(\"openfl\"))\n\t\t{\n\t\t\treturn Haxelib.getVersion(new Haxelib(\"openfl\")) + \"-L\" + StringTools.generateUUID(5, null, StringTools.generateHashCode(version));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn version;\n\t\t}\n\t}\n\n\tprivate function initializeProject(project:HXProject = null, targetName:String = \"\"):HXProject\n\t{\n\t\tLog.info(\"\", Log.accentColor + \"Initializing project...\" + Log.resetColor);\n\n\t\tvar projectFile = \"\";\n\n\t\tif (project == null)\n\t\t{\n\t\t\tif (words.length == 2)\n\t\t\t{\n\t\t\t\tif (FileSystem.exists(words[0]))\n\t\t\t\t{\n\t\t\t\t\tif (FileSystem.isDirectory(words[0]))\n\t\t\t\t\t{\n\t\t\t\t\t\tprojectFile = findProjectFile(words[0]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tprojectFile = words[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (targetName == \"\")\n\t\t\t\t{\n\t\t\t\t\ttargetName = words[1].toLowerCase();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprojectFile = findProjectFile(Sys.getCwd());\n\n\t\t\t\tif (targetName == \"\")\n\t\t\t\t{\n\t\t\t\t\ttargetName = words[0].toLowerCase();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (projectFile == \"\")\n\t\t\t{\n\t\t\t\tLog.error(\"You must have a \\\"project.xml\\\" file or specify another valid project file when using the '\" + command + \"' command\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.info(\"\", Log.accentColor + \"Using project file: \" + projectFile + Log.resetColor);\n\t\t\t}\n\t\t}\n\n\t\tif (runFromHaxelib && !targetFlags.exists(\"nolocalrepocheck\"))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar forceGlobal = (overrides.haxeflags.indexOf(\"--global\") > -1);\n\t\t\t\tvar projectDirectory = Path.directory(projectFile);\n\t\t\t\tvar localRepository = Path.combine(projectDirectory, \".haxelib\");\n\n\t\t\t\tif (!forceGlobal && FileSystem.exists(localRepository) && FileSystem.isDirectory(localRepository))\n\t\t\t\t{\n\t\t\t\t\tvar overrideExists = Haxelib.pathOverrides.exists(\"lime\");\n\t\t\t\t\tvar cacheOverride = Haxelib.pathOverrides.get(\"lime\");\n\t\t\t\t\tHaxelib.pathOverrides.remove(\"lime\");\n\n\t\t\t\t\tvar workingDirectory = Sys.getCwd();\n\t\t\t\t\tSys.setCwd(projectDirectory);\n\n\t\t\t\t\tvar limePath = Haxelib.getPath(new Haxelib(\"lime\"), true, true);\n\t\t\t\t\tvar toolsPath = Haxelib.getPath(new Haxelib(\"lime-tools\"));\n\n\t\t\t\t\tSys.setCwd(workingDirectory);\n\n\t\t\t\t\tif (!StringTools.startsWith(toolsPath, limePath))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.info(\"\", Log.accentColor + \"Requesting alternate tools from .haxelib repository...\\x1b[0m\\n\\n\");\n\n\t\t\t\t\t\tvar args = Sys.args();\n\t\t\t\t\t\targs.pop();\n\n\t\t\t\t\t\tSys.setCwd(limePath);\n\n\t\t\t\t\t\targs = [Path.combine(limePath, \"run.n\")].concat(args);\n\t\t\t\t\t\targs.push(\"--haxelib-lime=\" + limePath);\n\t\t\t\t\t\targs.push(\"-nolocalrepocheck\");\n\t\t\t\t\t\targs.push(workingDirectory);\n\n\t\t\t\t\t\tSys.exit(Sys.command(\"neko\", args));\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (overrideExists)\n\t\t\t\t\t{\n\t\t\t\t\t\tHaxelib.pathOverrides.set(\"lime\", cacheOverride);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\tif (targetFlags.exists(\"air\"))\n\t\t{\n\t\t\tswitch (targetName)\n\t\t\t{\n\t\t\t\tcase \"android\":\n\t\t\t\t\ttargetName = \"air\";\n\t\t\t\t\ttargetFlags.set(\"android\", \"\");\n\n\t\t\t\tcase \"ios\":\n\t\t\t\t\ttargetName = \"air\";\n\t\t\t\t\ttargetFlags.set(\"ios\", \"\");\n\n\t\t\t\tcase \"windows\":\n\t\t\t\t\ttargetName = \"air\";\n\t\t\t\t\ttargetFlags.set(\"windows\", \"\");\n\n\t\t\t\tcase \"mac\", \"macos\":\n\t\t\t\t\ttargetName = \"air\";\n\t\t\t\t\ttargetFlags.set(\"mac\", \"\");\n\t\t\t}\n\t\t}\n\n\t\tvar target:Platform = null;\n\n\t\tswitch (targetName)\n\t\t{\n\t\t\tcase \"cpp\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"cpp\", \"\");\n\n\t\t\t\tif (target == Platform.MAC)\n\t\t\t\t{\n\t\t\t\t\toverrides.haxedefs.set(\"macos\", \"\");\n\t\t\t\t}\n\n\t\t\tcase \"neko\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"neko\", \"\");\n\n\t\t\tcase \"hl\", \"hashlink\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"hl\", \"\");\n\n\t\t\tcase \"hlc\":\n\t\t\t\ttarget = cast System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"hl\", \"\");\n\t\t\t\ttargetFlags.set(\"hlc\", \"\");\n\n\t\t\tcase \"cppia\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"cppia\", \"\");\n\n\t\t\tcase \"java\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"java\", \"\");\n\n\t\t\tcase \"nodejs\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"nodejs\", \"\");\n\n\t\t\tcase \"cs\":\n\t\t\t\ttarget = System.hostPlatform;\n\t\t\t\ttargetFlags.set(\"cs\", \"\");\n\n\t\t\tcase \"iphone\", \"iphoneos\":\n\t\t\t\ttarget = Platform.IOS;\n\n\t\t\tcase \"iphonesim\":\n\t\t\t\ttarget = Platform.IOS;\n\t\t\t\ttargetFlags.set(\"simulator\", \"\");\n\n\t\t\tcase \"electron\":\n\t\t\t\ttarget = Platform.HTML5;\n\t\t\t\ttargetFlags.set(\"electron\", \"\");\n\n\t\t\tcase \"firefox\", \"firefoxos\":\n\t\t\t\ttarget = Platform.FIREFOX;\n\t\t\t\toverrides.haxedefs.set(\"firefoxos\", \"\");\n\n\t\t\tcase \"mac\", \"macos\":\n\t\t\t\ttarget = Platform.MAC;\n\t\t\t\toverrides.haxedefs.set(\"macos\", \"\");\n\n\t\t\tcase \"rpi\", \"raspberrypi\":\n\t\t\t\ttarget = Platform.LINUX;\n\t\t\t\ttargetFlags.set(\"rpi\", \"\");\n\n\t\t\tcase \"webassembly\", \"wasm\", \"emscripten\":\n\t\t\t\ttarget = Platform.WEB_ASSEMBLY;\n\t\t\t\ttargetFlags.set(\"webassembly\", \"\");\n\n\t\t\tcase \"winjs\", \"uwp\":\n\t\t\t\ttarget = Platform.WINDOWS;\n\t\t\t\ttargetFlags.set(\"uwp\", \"\");\n\t\t\t\ttargetFlags.set(\"winjs\", \"\");\n\n\t\t\tcase \"winrt\":\n\t\t\t\ttarget = Platform.WINDOWS;\n\t\t\t\ttargetFlags.set(\"winrt\", \"\");\n\n\t\t\tdefault:\n\t\t\t\ttarget = cast targetName.toLowerCase();\n\t\t}\n\n\t\tHXProject._command = command;\n\t\tHXProject._debug = debug;\n\t\tHXProject._environment = environment;\n\t\tHXProject._target = target;\n\t\tHXProject._targetFlags = targetFlags;\n\t\tHXProject._userDefines = userDefines;\n\n\t\tvar config = ConfigHelper.getConfig();\n\n\t\tif (config != null)\n\t\t{\n\t\t\tfor (define in config.defines.keys())\n\t\t\t{\n\t\t\t\tif (define == define.toUpperCase())\n\t\t\t\t{\n\t\t\t\t\tvar value = config.defines.get(define);\n\n\t\t\t\t\tswitch (define)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"ANT_HOME\":\n\t\t\t\t\t\t\tif (value == \"/usr\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue = \"/usr/share/ant\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (FileSystem.exists(value))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.putEnv(define, value);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"JAVA_HOME\":\n\t\t\t\t\t\t\tif (FileSystem.exists(value))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSys.putEnv(define, value);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tSys.putEnv(define, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tif (environment.get(\"JAVA_HOME\") != null)\n\t\t\t{\n\t\t\t\tvar javaPath = Path.combine(environment.get(\"JAVA_HOME\"), \"bin\");\n\t\t\t\tvar value:String;\n\n\t\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t\t{\n\t\t\t\t\tvalue = javaPath + \";\" + Sys.getEnv(\"PATH\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvalue = javaPath + \":\" + Sys.getEnv(\"PATH\");\n\t\t\t\t}\n\n\t\t\t\tenvironment.set(\"PATH\", value);\n\t\t\t\tSys.putEnv(\"PATH\", value);\n\t\t\t}\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tvar process = new Process(\"haxe\", [\"-version\"]);\n\t\t\tvar haxeVersion = StringTools.trim(process.stderr.readAll().toString());\n\n\t\t\tif (haxeVersion == \"\")\n\t\t\t{\n\t\t\t\thaxeVersion = StringTools.trim(process.stdout.readAll().toString());\n\t\t\t}\n\n\t\t\tprocess.close();\n\n\t\t\tenvironment.set(\"haxe\", haxeVersion);\n\t\t\tenvironment.set(\"haxe_ver\", haxeVersion);\n\n\t\t\tenvironment.set(\"haxe\" + haxeVersion.split(\".\")[0], \"1\");\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\tif (!environment.exists(\"HAXE_STD_PATH\"))\n\t\t{\n\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t{\n\t\t\t\tenvironment.set(\"HAXE_STD_PATH\", \"C:\\\\HaxeToolkit\\\\haxe\\\\std\\\\\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (FileSystem.exists(\"/usr/lib/haxe\"))\n\t\t\t\t{\n\t\t\t\t\tenvironment.set(\"HAXE_STD_PATH\", \"/usr/lib/haxe/std\");\n\t\t\t\t}\n\t\t\t\telse if (FileSystem.exists(\"/usr/share/haxe\"))\n\t\t\t\t{\n\t\t\t\t\tenvironment.set(\"HAXE_STD_PATH\", \"/usr/share/haxe/std\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tenvironment.set(\"HAXE_STD_PATH\", \"/usr/local/lib/haxe/std\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (project == null)\n\t\t{\n\t\t\tHXProject._command = command;\n\t\t\tHXProject._debug = debug;\n\t\t\tHXProject._environment = environment;\n\t\t\tHXProject._target = target;\n\t\t\tHXProject._targetFlags = targetFlags;\n\t\t\tHXProject._userDefines = userDefines;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSys.setCwd(Path.directory(projectFile));\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tif (Path.extension(projectFile) == \"lime\" || Path.extension(projectFile) == \"nmml\" || Path.extension(projectFile) == \"xml\")\n\t\t\t{\n\t\t\t\tproject = new ProjectXMLParser(Path.withoutDirectory(projectFile), userDefines, includePaths);\n\t\t\t}\n\t\t\telse if (Path.extension(projectFile) == \"hxp\")\n\t\t\t{\n\t\t\t\tproject = HXProject.fromFile(projectFile, userDefines, includePaths);\n\n\t\t\t\tif (project != null)\n\t\t\t\t{\n\t\t\t\t\tproject.command = command;\n\t\t\t\t\tproject.debug = debug;\n\t\t\t\t\tproject.target = target;\n\t\t\t\t\tproject.targetFlags = targetFlags;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLog.error(\"Could not process \\\"\" + projectFile + \"\\\"\");\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (project != null)\n\t\t\t{\n\t\t\t\tproject.projectFilePath = projectFile;\n\t\t\t}\n\t\t}\n\n\t\tif (project != null && project.needRerun && !project.targetFlags.exists(\"norerun\"))\n\t\t{\n\t\t\tHaxelib.pathOverrides.remove(\"lime\");\n\t\t\tvar workingDirectory = Sys.getCwd();\n\t\t\tvar limePath = Haxelib.getPath(new Haxelib(\"lime\"), true, true);\n\t\t\tSys.setCwd(workingDirectory);\n\n\t\t\tLog.info(\"\", Log.accentColor + \"Requesting alternate tools from custom haxelib path...\\x1b[0m\\n\\n\");\n\n\t\t\tvar args = Sys.args();\n\t\t\targs.pop();\n\n\t\t\tSys.setCwd(limePath);\n\n\t\t\targs = [Path.combine(limePath, \"run.n\")].concat(args);\n\t\t\targs.push(\"--haxelib-lime=\" + limePath);\n\t\t\targs.push(\"-norerun\");\n\t\t\targs.push(workingDirectory);\n\n\t\t\tSys.exit(Sys.command(\"neko\", args));\n\t\t\treturn null;\n\t\t}\n\n\t\tif (project == null || (command != \"rebuild\" && project.sources.length == 0 && !FileSystem.exists(project.app.main + \".hx\")))\n\t\t{\n\t\t\tLog.error(\"You must have a \\\"project.xml\\\" file or specify another valid project file when using the '\" + command + \"' command\");\n\t\t\treturn null;\n\t\t}\n\n\t\tif (config != null)\n\t\t{\n\t\t\tconfig.merge(project);\n\t\t\tproject = config;\n\t\t}\n\n\t\tproject.haxedefs.set(\"tools\", version);\n\n\t\t/*if (userDefines.exists (\"nme\")) {\n\n\t\t\tproject.haxedefs.set (\"nme_install_tool\", 1);\n\t\t\tproject.haxedefs.set (\"nme_ver\", version);\n\t\t\tproject.haxedefs.set (\"nme\" + version.split (\".\")[0], 1);\n\n\t\t\tproject.config.cpp.buildLibrary = \"hxcpp\";\n\t\t\tproject.config.cpp.requireBuild = false;\n\n\t\t}*/\n\n\t\tproject.merge(overrides);\n\n\t\tfor (haxelib in project.haxelibs)\n\t\t{\n\t\t\tif (haxelib.name == \"lime\" && haxelib.version != null && haxelib.version != \"\" && haxelib.version != \"dev\" && !haxelib.versionMatches(version))\n\t\t\t{\n\t\t\t\tif (!project.targetFlags.exists(\"notoolscheck\"))\n\t\t\t\t{\n\t\t\t\t\tif (targetFlags.exists(\"openfl\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (haxelib in project.haxelibs)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (haxelib.name == \"openfl\")\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tHaxelib.setOverridePath(haxelib, Haxelib.getPath(haxelib));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tLog.info(\"\", Log.accentColor + \"Requesting tools version \" + getToolsVersion(haxelib.version) + \"...\\x1b[0m\\n\\n\");\n\n\t\t\t\t\tHaxelib.pathOverrides.remove(\"lime\");\n\t\t\t\t\tvar path = Haxelib.getPath(haxelib);\n\n\t\t\t\t\tvar args = Sys.args();\n\t\t\t\t\tvar workingDirectory = args.pop();\n\n\t\t\t\t\tfor (haxelib in project.haxelibs)\n\t\t\t\t\t{\n\t\t\t\t\t\targs.push(\"--haxelib-\" + haxelib.name + \"=\" + Haxelib.getPath(haxelib));\n\t\t\t\t\t}\n\n\t\t\t\t\targs.push(\"-notoolscheck\");\n\n\t\t\t\t\tvar projectDirectory = Path.directory(projectFile);\n\t\t\t\t\tvar localRepository = Path.combine(projectDirectory, \".haxelib\");\n\t\t\t\t\tif (FileSystem.exists(localRepository) && FileSystem.isDirectory(localRepository) && StringTools.startsWith(path, localRepository))\n\t\t\t\t\t{\n\t\t\t\t\t\targs.push(\"-nolocalrepocheck\");\n\t\t\t\t\t}\n\n\t\t\t\t\tSys.setCwd(path);\n\t\t\t\t\tvar args = [Path.combine(path, \"run.n\")].concat(args);\n\t\t\t\t\targs.push(workingDirectory);\n\n\t\t\t\t\tSys.exit(Sys.command(\"neko\", args));\n\t\t\t\t\treturn null;\n\n\t\t\t\t\t// var args = [ \"run\", \"lime:\" + haxelib.version ].concat (args);\n\t\t\t\t\t// Sys.exit (Sys.command (\"haxelib\", args));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (Std.string(version) != Std.string(Haxelib.getVersion(haxelib)))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.warn(\"\", Log.accentColor + \"Could not switch to requested tools version\\x1b[0m\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (overrides.architectures.length > 0)\n\t\t{\n\t\t\tproject.architectures = overrides.architectures;\n\t\t}\n\n\t\tfor (key in projectDefines.keys())\n\t\t{\n\t\t\tvar components = key.split(\"-\");\n\t\t\tvar field = components.shift().toLowerCase();\n\t\t\tvar attribute = \"\";\n\n\t\t\tif (components.length > 0)\n\t\t\t{\n\t\t\t\tfor (i in 1...components.length)\n\t\t\t\t{\n\t\t\t\t\tcomponents[i] = components[i].substr(0, 1).toUpperCase() + components[i].substr(1).toLowerCase();\n\t\t\t\t}\n\n\t\t\t\tattribute = components.join(\"\");\n\t\t\t}\n\n\t\t\tif (field == \"template\" && attribute == \"path\")\n\t\t\t{\n\t\t\t\tproject.templatePaths.push(projectDefines.get(key));\n\t\t\t}\n\t\t\telse if (field == \"config\")\n\t\t\t{\n\t\t\t\tproject.config.set(attribute, projectDefines.get(key));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (Reflect.hasField(project, field))\n\t\t\t\t{\n\t\t\t\t\tvar fieldValue = Reflect.field(project, field);\n\t\t\t\t\tvar typeValue:Dynamic = switch (field)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"app\": ApplicationData.expectedFields;\n\t\t\t\t\t\tcase \"meta\": MetaData.expectedFields;\n\t\t\t\t\t\tcase \"window\": WindowData.expectedFields;\n\t\t\t\t\t\tdefault: fieldValue;\n\t\t\t\t\t};\n\n\t\t\t\t\tif (Reflect.hasField(typeValue, attribute))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((Reflect.field(typeValue, attribute) is String))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tReflect.setField(fieldValue, attribute, projectDefines.get(key));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((Reflect.field(typeValue, attribute) is Float))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tReflect.setField(fieldValue, attribute, Std.parseFloat(projectDefines.get(key)));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((Reflect.field(typeValue, attribute) is Bool))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tReflect.setField(fieldValue, attribute, (projectDefines.get(key).toLowerCase() == \"true\"\n\t\t\t\t\t\t\t\t|| projectDefines.get(key) == \"1\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tproject.targetFlags.set(key, projectDefines.get(key));\n\t\t\t\t\ttargetFlags.set(key, projectDefines.get(key));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tMapTools.copyKeysDynamic(userDefines, project.haxedefs);\n\n\t\tgetBuildNumber(project, (project.command == \"build\" || project.command == \"test\"));\n\n\t\treturn project;\n\t}\n\n\tpublic static function main():Void\n\t{\n\t\tnew CommandLineTools();\n\t}\n\n\tprivate function platformSetup():Void\n\t{\n\t\tLog.info(\"\", Log.accentColor + \"Running command: SETUP\" + Log.resetColor);\n\n\t\tif (words.length == 0)\n\t\t{\n\t\t\tPlatformSetup.run(\"\", userDefines, targetFlags);\n\t\t}\n\t\telse if (words.length == 1)\n\t\t{\n\t\t\tPlatformSetup.run(words[0], userDefines, targetFlags);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.error(\"Incorrect number of arguments for command 'setup'\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate function processArguments():Void\n\t{\n\t\tvar arguments = Sys.args();\n\n\t\tif (arguments.length > 0)\n\t\t{\n\t\t\t// When the command-line tools are called from haxelib,\n\t\t\t// the last argument is the project directory and the\n\t\t\t// path to Lime is the current working directory\n\n\t\t\tvar lastArgument = \"\";\n\n\t\t\tfor (i in 0...arguments.length)\n\t\t\t{\n\t\t\t\tlastArgument = arguments.pop();\n\t\t\t\tif (lastArgument.length > 0) break;\n\t\t\t}\n\n\t\t\tlastArgument = new Path(lastArgument).toString();\n\t\t\tvar isRootDirectory = false;\n\n\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t{\n\t\t\t\tisRootDirectory = (lastArgument.length == 3\n\t\t\t\t\t&& lastArgument.charAt(1) == \":\"\n\t\t\t\t\t&& (lastArgument.charAt(2) == \"/\" || lastArgument.charAt(2) == \"\\\\\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tisRootDirectory = (lastArgument == \"/\");\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(lastArgument) && FileSystem.isDirectory(lastArgument))\n\t\t\t{\n\t\t\t\tHaxelib.setOverridePath(new Haxelib(\"lime-tools\"), Path.combine(Sys.getCwd(), \"tools\"));\n\n\t\t\t\tSys.setCwd(lastArgument);\n\t\t\t\trunFromHaxelib = true;\n\t\t\t}\n\t\t\telse if (!isRootDirectory)\n\t\t\t{\n\t\t\t\targuments.push(lastArgument);\n\t\t\t}\n\n\t\t\tHaxelib.workingDirectory = Sys.getCwd();\n\t\t}\n\n\t\tif (!runFromHaxelib)\n\t\t{\n\t\t\tvar path:String = null;\n\n\t\t\tif (FileSystem.exists(\"tools.n\"))\n\t\t\t{\n\t\t\t\tpath = Path.combine(Sys.getCwd(), \"../\");\n\t\t\t}\n\t\t\telse if (FileSystem.exists(\"run.n\"))\n\t\t\t{\n\t\t\t\tpath = Sys.getCwd();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error(\"Could not run Lime tools from this directory\");\n\t\t\t}\n\n\t\t\tHaxelib.setOverridePath(new Haxelib(\"lime\"), path);\n\t\t\tHaxelib.setOverridePath(new Haxelib(\"lime-tools\"), Path.combine(path, \"tools\"));\n\t\t}\n\n\t\tvar catchArguments = false;\n\t\tvar catchHaxeFlag = false;\n\t\tvar catchDefine = false;\n\n\t\tfor (argument in arguments)\n\t\t{\n\t\t\tvar equals = argument.indexOf(\"=\");\n\n\t\t\tif (catchHaxeFlag)\n\t\t\t{\n\t\t\t\toverrides.haxeflags.push(argument);\n\t\t\t\tcatchHaxeFlag = false;\n\t\t\t}\n\t\t\telse if (argument == \"-args\" || argument == \"--\")\n\t\t\t{\n\t\t\t\tcatchArguments = true;\n\t\t\t}\n\t\t\telse if (catchArguments)\n\t\t\t{\n\t\t\t\tadditionalArguments.push(argument);\n\t\t\t}\n\t\t\telse if (argument == \"-D\")\n\t\t\t{\n\t\t\t\tcatchDefine = true;\n\t\t\t}\n\t\t\telse if (equals > 0)\n\t\t\t{\n\t\t\t\tvar argValue = argument.substr(equals + 1);\n\t\t\t\t// if quotes remain on the argValue we need to strip them off\n\t\t\t\t// otherwise the compiler really dislikes the result!\n\t\t\t\tvar r = ~/^['\"](.*)['\"]$/;\n\t\t\t\tif (r.match(argValue))\n\t\t\t\t{\n\t\t\t\t\targValue = r.matched(1);\n\t\t\t\t}\n\n\t\t\t\tif (catchDefine)\n\t\t\t\t{\n\t\t\t\t\tuserDefines.set(argument, argValue);\n\t\t\t\t\tcatchDefine = false;\n\t\t\t\t}\n\t\t\t\telse if (argument.substr(0, 2) == \"-D\")\n\t\t\t\t{\n\t\t\t\t\tuserDefines.set(argument.substr(2, equals - 2), argValue);\n\t\t\t\t}\n\t\t\t\telse if (argument.substr(0, 2) == \"--\")\n\t\t\t\t{\n\t\t\t\t\t// this won't work because it assumes there is only ever one of these.\n\t\t\t\t\t// projectDefines.set (argument.substr (2, equals - 2), argValue);\n\n\t\t\t\t\tvar field = argument.substr(2, equals - 2);\n\n\t\t\t\t\tif (field == \"haxedef\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.haxedefs.set(argValue, 1);\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"haxeflag\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.haxeflags.push(argValue);\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"haxelib\")\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = argValue;\n\t\t\t\t\t\tvar version = \"\";\n\n\t\t\t\t\t\tif (name.indexOf(\":\") > -1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tversion = name.substr(name.indexOf(\":\") + 1);\n\t\t\t\t\t\t\tname = name.substr(0, name.indexOf(\":\"));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\toverrides.haxelibs.push(new Haxelib(name, version));\n\t\t\t\t\t}\n\t\t\t\t\telse if (StringTools.startsWith(field, \"haxelib-\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = field.substr(8);\n\t\t\t\t\t\tHaxelib.setOverridePath(new Haxelib(name), Path.tryFullPath(argValue));\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"source\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.sources.push(argValue);\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"dependency\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.dependencies.push(new Dependency(argValue, \"\"));\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"template\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.templatePaths.push(argValue);\n\t\t\t\t\t}\n\t\t\t\t\telse if (StringTools.startsWith(field, \"certificate-\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (overrides.keystore == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toverrides.keystore = new Keystore();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfield = StringTools.replace(field, \"certificate-\", \"\");\n\n\t\t\t\t\t\tif (field == \"alias-password\") field = \"aliasPassword\";\n\n\t\t\t\t\t\tif (Reflect.hasField(overrides.keystore, field))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tReflect.setField(overrides.keystore, field, argValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (field == \"identity\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toverrides.config.set(\"ios.identity\", argValue);\n\t\t\t\t\t\t\toverrides.config.set(\"tvos.identity\", argValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (field == \"team-id\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toverrides.config.set(\"ios.team-id\", argValue);\n\t\t\t\t\t\t\toverrides.config.set(\"tvos.team-id\", argValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (StringTools.startsWith(field, \"app-\")\n\t\t\t\t\t\t|| StringTools.startsWith(field, \"meta-\")\n\t\t\t\t\t\t|| StringTools.startsWith(field, \"window-\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar split = field.split(\"-\");\n\n\t\t\t\t\t\tvar fieldName = split[0];\n\t\t\t\t\t\tvar property = split[1];\n\n\t\t\t\t\t\tfor (i in 2...split.length)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty += split[i].substr(0, 1).toUpperCase() + split[i].substr(1, split[i].length - 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (field == \"window-allow-high-dpi\") property = \"allowHighDPI\";\n\t\t\t\t\t\tif (field == \"window-color-depth\") property = \"colorDepth\";\n\t\t\t\t\t\tif (field == \"meta-build-number\") property = \"buildNumber\";\n\n\t\t\t\t\t\tvar fieldReference = Reflect.field(overrides, fieldName);\n\t\t\t\t\t\tvar typeValue:Dynamic = switch (fieldName)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"app\": ApplicationData.expectedFields;\n\t\t\t\t\t\t\tcase \"meta\": MetaData.expectedFields;\n\t\t\t\t\t\t\tcase \"window\": WindowData.expectedFields;\n\t\t\t\t\t\t\tdefault: fieldReference;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (Reflect.hasField(typeValue, property))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar propertyReference = Reflect.field(typeValue, property);\n\n\t\t\t\t\t\t\tif ((propertyReference is Bool))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tReflect.setField(fieldReference, property, argValue == \"true\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((propertyReference is Int))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tReflect.setField(fieldReference, property, Std.parseInt(argValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((propertyReference is Float))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tReflect.setField(fieldReference, property, Std.parseFloat(argValue));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((propertyReference is String))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tReflect.setField(fieldReference, property, argValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// TODO: Only certain properties?\n\t\t\t\t\t\t\t\tReflect.setField(fieldReference, property, argValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"build-library\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.config.set(\"cpp.buildLibrary\", argValue);\n\t\t\t\t\t}\n\t\t\t\t\telse if (field == \"device\")\n\t\t\t\t\t{\n\t\t\t\t\t\ttargetFlags.set(\"device\", argValue);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tprojectDefines.set(field, argValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tuserDefines.set(argument.substr(0, equals), argValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (catchDefine)\n\t\t\t{\n\t\t\t\tuserDefines.set(argument, \"\");\n\t\t\t\tcatchDefine = false;\n\t\t\t}\n\t\t\telse if (argument.substr(0, 2) == \"-D\")\n\t\t\t{\n\t\t\t\tuserDefines.set(argument.substr(2), \"\");\n\t\t\t}\n\t\t\telse if (argument.substr(0, 2) == \"-I\")\n\t\t\t{\n\t\t\t\tincludePaths.push(argument.substr(2));\n\t\t\t}\n\t\t\telse if (argument == \"-haxelib-debug\")\n\t\t\t{\n\t\t\t\tHaxelib.debug = true;\n\t\t\t}\n\t\t\telse if (argument == \"--help\" || argument == \"-help\" || argument == \"-h\")\n\t\t\t{\n\t\t\t\ttargetFlags.set(\"help\", \"\");\n\t\t\t}\n\t\t\telse if (argument == \"--output-file\")\n\t\t\t{\n\t\t\t\ttargetFlags.set(\"output-file\", \"\");\n\t\t\t}\n\t\t\telse if (argument.substr(0, 1) == \"-\")\n\t\t\t{\n\t\t\t\tif (argument == \"-dce\" || argument.substr(1, 1) == \"-\")\n\t\t\t\t{\n\t\t\t\t\toverrides.haxeflags.push(argument);\n\n\t\t\t\t\tif (argument == \"--remap\" || argument == \"--connect\" || argument == \"-dce\")\n\t\t\t\t\t{\n\t\t\t\t\t\tcatchHaxeFlag = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (argument.substr(0, 4) == \"-arm\")\n\t\t\t\t\t{\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar name = argument.substr(1).toUpperCase();\n\t\t\t\t\t\t\tvar value = Type.createEnum(Architecture, name);\n\n\t\t\t\t\t\t\tif (value != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toverrides.architectures.push(value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-64\" || argument == \"-x86_64\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.architectures.push(Architecture.X64);\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-32\" || argument == \"-x86_32\")\n\t\t\t\t\t{\n\t\t\t\t\t\toverrides.architectures.push(Architecture.X86);\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-v\" || argument == \"-verbose\")\n\t\t\t\t\t{\n\t\t\t\t\t\targument = \"-verbose\";\n\n\t\t\t\t\t\tif (command != \"display\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.verbose = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-force-verbose\")\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.verbose = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-dryrun\")\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.dryRun = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-notrace\")\n\t\t\t\t\t{\n\t\t\t\t\t\ttraceEnabled = false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-debug\")\n\t\t\t\t\t{\n\t\t\t\t\t\tdebug = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argument == \"-nocolor\")\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.enableColor = false;\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetFlags.set(argument.substr(1), \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (command.length == 0)\n\t\t\t{\n\t\t\t\tcommand = argument;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twords.push(argument);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function publishProject()\n\t{\n\t\tswitch (words[words.length - 1])\n\t\t{\n\t\t\tcase \"firefox\":\n\t\t\t\tvar project = initializeProject(null, \"firefox\");\n\n\t\t\t\tLog.info(\"\", Log.accentColor + \"Using publishing target: FIREFOX MARKETPLACE\" + Log.resetColor);\n\n\t\t\t\t// if (FirefoxMarketplace.isValid (project)) {\n\t\t\t\t//\n\t\t\t\t// buildProject (project, \"build\");\n\t\t\t\t//\n\t\t\t\t// Log.info (\"\", \"\\n\" + Log.accentColor + \"Running command: PUBLISH\" + Log.resetColor);\n\t\t\t\t//\n\t\t\t\t// FirefoxMarketplace.publish (project);\n\t\t\t\t//\n\t\t\t\t// }\n\t\t}\n\t}\n\n\tprivate function updateLibrary():Void\n\t{\n\t\tif ((words.length < 1 && command != \"upgrade\") || words.length > 1)\n\t\t{\n\t\t\tLog.error(\"Incorrect number of arguments for command '\" + command + \"'\");\n\t\t\treturn;\n\t\t}\n\n\t\tLog.info(\"\", Log.accentColor + \"Running command: \" + command.toUpperCase() + Log.resetColor);\n\n\t\tvar name = defaultLibrary;\n\n\t\tif (words.length > 0)\n\t\t{\n\t\t\tname = words[0];\n\t\t}\n\n\t\tvar haxelib = new Haxelib(name);\n\t\tvar path = Haxelib.getPath(haxelib);\n\n\t\tswitch (command)\n\t\t{\n\t\t\tcase \"install\":\n\t\t\t\tif (path == null || path == \"\")\n\t\t\t\t{\n\t\t\t\t\tPlatformSetup.installHaxelib(haxelib);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPlatformSetup.updateHaxelib(haxelib);\n\t\t\t\t}\n\n\t\t\t\tPlatformSetup.setupHaxelib(haxelib);\n\n\t\t\tcase \"remove\":\n\t\t\t\tif (path != null && path != \"\")\n\t\t\t\t{\n\t\t\t\t\tHaxelib.runCommand(\"\", [\"remove\", name]);\n\t\t\t\t}\n\n\t\t\tcase \"upgrade\":\n\t\t\t\tif (path != null && path != \"\")\n\t\t\t\t{\n\t\t\t\t\tPlatformSetup.updateHaxelib(haxelib);\n\t\t\t\t\tPlatformSetup.setupHaxelib(haxelib);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLog.warn(\"\\\"\" + haxelib.name + \"\\\" is not a valid haxelib, or has not been installed\");\n\t\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tools/RunScript.hx",
    "content": "package;\n\nimport hxp.*;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass RunScript\n{\n\tprivate static function rebuildTools(limeDirectory:String, toolsDirectory:String, rebuildBinaries = true):Void\n\t{\n\t\t/*var extendedToolsDirectory = Haxelib.getPath (new Haxelib (\"lime-extended\"), false);\n\n\t\t\tif (extendedToolsDirectory != null && extendedToolsDirectory != \"\") {\n\n\t\t\t\tvar buildScript = File.getContent (Path.combine (extendedToolsDirectory, \"tools.hxml\"));\n\t\t\t\tbuildScript = StringTools.replace (buildScript, \"\\r\\n\", \"\\n\");\n\t\t\t\tbuildScript = StringTools.replace (buildScript, \"\\n\", \" \");\n\n\t\t\t\tSystem.runCommand (toolsDirectory, \"haxe\", buildScript.split (\" \"));\n\n\t\t} else {*/\n\n\t\tSystem.runCommand(toolsDirectory, \"haxe\", [\"tools.hxml\"]);\n\n\t\t// }\n\n\t\tif (!rebuildBinaries) return;\n\n\t\tvar platforms = [\"Windows\", \"Mac\", \"Mac64\", \"MacArm64\", \"Linux\", \"Linux64\", \"LinuxArm\", \"LinuxArm64\"];\n\n\t\tfor (platform in platforms)\n\t\t{\n\t\t\tvar source = Path.combine(limeDirectory, \"ndll/\" + platform + \"/lime.ndll\");\n\t\t\t// var target = Path.combine (toolsDirectory, \"ndll/\" + platform + \"/lime.ndll\");\n\n\t\t\tif (!FileSystem.exists(source))\n\t\t\t{\n\t\t\t\tvar args = [\"tools/tools.n\", \"rebuild\", \"lime\", \"-release\", \"-nocffi\"];\n\n\t\t\t\tif (Log.verbose)\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-verbose\");\n\t\t\t\t}\n\n\t\t\t\tif (!Log.enableColor)\n\t\t\t\t{\n\t\t\t\t\targs.push(\"-nocolor\");\n\t\t\t\t}\n\n\t\t\t\tswitch (platform)\n\t\t\t\t{\n\t\t\t\t\tcase \"Windows\":\n\t\t\t\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.runCommand(limeDirectory, \"neko\", args.concat([\"windows\", toolsDirectory]));\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"Mac\", \"Mac64\", \"MacArm64\":\n\t\t\t\t\t\tif (System.hostPlatform == MAC)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.runCommand(limeDirectory, \"neko\", args.concat([\"mac\", toolsDirectory]));\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"Linux\", \"LinuxArm\":\n\t\t\t\t\t\tif (System.hostPlatform == LINUX && System.hostArchitecture != X64 && System.hostArchitecture != ARM64)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.runCommand(limeDirectory, \"neko\", args.concat([\"linux\", \"-32\", toolsDirectory]));\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"Linux64\", \"LinuxArm64\":\n\t\t\t\t\t\tif (System.hostPlatform == LINUX && (System.hostArchitecture == X64 || System.hostArchitecture == ARM64))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.runCommand(limeDirectory, \"neko\", args.concat([\"linux\", \"-64\", toolsDirectory]));\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!FileSystem.exists(source))\n\t\t\t{\n\t\t\t\tif (Log.verbose)\n\t\t\t\t{\n\t\t\t\t\tLog.warn(\"\", \"Source path \\\"\" + source + \"\\\" does not exist\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// System.copyIfNewer (source, target);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function runCommand(path:String, command:String, args:Array<String>, throwErrors:Bool = true):Int\n\t{\n\t\tvar oldPath:String = \"\";\n\n\t\tif (path != null && path != \"\")\n\t\t{\n\t\t\toldPath = Sys.getCwd();\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSys.setCwd(path);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tLog.error(\"Cannot set current working directory to \\\"\" + path + \"\\\"\");\n\t\t\t}\n\t\t}\n\n\t\tvar result:Dynamic = Sys.command(command, args);\n\n\t\tif (oldPath != \"\")\n\t\t{\n\t\t\tSys.setCwd(oldPath);\n\t\t}\n\n\t\tif (throwErrors && result != 0)\n\t\t{\n\t\t\tSys.exit(1);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic static function main()\n\t{\n\t\tvar args = Sys.args();\n\n\t\tvar limeDirectory = Haxelib.getPath(new Haxelib(\"lime\"), true);\n\t\tvar toolsDirectory = Path.combine(limeDirectory, \"tools\");\n\n\t\tif (!FileSystem.exists(toolsDirectory))\n\t\t{\n\t\t\tlimeDirectory = Path.combine(limeDirectory, \"..\");\n\t\t\ttoolsDirectory = Path.combine(limeDirectory, \"tools\");\n\t\t}\n\n\t\tif (args.length > 2 && args[0] == \"rebuild\" && args[1] == \"tools\")\n\t\t{\n\t\t\tvar lastArgument = new Path(args[args.length - 1]).toString();\n\t\t\tvar cacheDirectory = Sys.getCwd();\n\n\t\t\tif (((StringTools.endsWith(lastArgument, \"/\") && lastArgument != \"/\") || StringTools.endsWith(lastArgument, \"\\\\\"))\n\t\t\t\t&& !StringTools.endsWith(lastArgument, \":\\\\\"))\n\t\t\t{\n\t\t\t\tlastArgument = lastArgument.substr(0, lastArgument.length - 1);\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(lastArgument) && FileSystem.isDirectory(lastArgument))\n\t\t\t{\n\t\t\t\tSys.setCwd(lastArgument);\n\t\t\t}\n\n\t\t\tHaxelib.workingDirectory = Sys.getCwd();\n\t\t\tvar rebuildBinaries = true;\n\n\t\t\tfor (arg in args)\n\t\t\t{\n\t\t\t\tvar equals = arg.indexOf(\"=\");\n\n\t\t\t\tif (equals > -1 && StringTools.startsWith(arg, \"--\"))\n\t\t\t\t{\n\t\t\t\t\tvar argValue = arg.substr(equals + 1);\n\t\t\t\t\tvar field = arg.substr(2, equals - 2);\n\n\t\t\t\t\tif (StringTools.startsWith(field, \"haxelib-\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = field.substr(8);\n\t\t\t\t\t\tHaxelib.pathOverrides.set(name, Path.tryFullPath(argValue));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (StringTools.startsWith(arg, \"-\"))\n\t\t\t\t{\n\t\t\t\t\tswitch (arg)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"-v\", \"-verbose\":\n\t\t\t\t\t\t\tLog.verbose = true;\n\n\t\t\t\t\t\tcase \"-nocolor\":\n\t\t\t\t\t\t\tLog.enableColor = false;\n\n\t\t\t\t\t\tcase \"-nocffi\":\n\t\t\t\t\t\t\trebuildBinaries = false;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trebuildTools(limeDirectory, toolsDirectory, rebuildBinaries);\n\n\t\t\tif (args.indexOf(\"-openfl\") > -1)\n\t\t\t{\n\t\t\t\tSys.setCwd(cacheDirectory);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSys.exit(0);\n\t\t\t}\n\t\t}\n\n\t\tif (args.indexOf(\"-eval\") >= 0)\n\t\t{\n\t\t\targs.remove(\"-eval\");\n\t\t\tLog.info(\"Experimental: executing `lime \" + args.slice(0, args.length - 1).join(\" \")\n\t\t\t\t+ \"` using Eval (https://haxe.org/blog/eval/)\");\n\n\t\t\tvar args = [\n\t\t\t\t\"-D\", \"lime\",\n\t\t\t\t\"-cp\", toolsDirectory,\n\t\t\t\t\"-cp\", Path.combine(toolsDirectory, \"platforms\"),\n\t\t\t\t\"-cp\", \"src\",\n\t\t\t\t\"-lib\", \"format\",\n\t\t\t\t\"-lib\", \"hxp\",\n\t\t\t\t\"--run\", \"CommandLineTools\"].concat(args);\n\t\t\tSys.exit(runCommand(\"\", \"haxe\", args));\n\t\t}\n\n\t\tvar tools_n = Path.combine(toolsDirectory, \"tools.n\");\n\t\tif (!FileSystem.exists(tools_n) || args.indexOf(\"-rebuild\") > -1)\n\t\t{\n\t\t\trebuildTools(limeDirectory, toolsDirectory);\n\t\t}\n\n\t\tvar args = [tools_n].concat(args);\n\t\tSys.exit(runCommand(\"\", \"neko\", args));\n\t}\n}\n"
  },
  {
    "path": "tools/SVGExport.hx",
    "content": "package;\n\nimport format.SVG;\nimport hxp.*;\nimport lime.tools.Architecture;\nimport openfl.display.Bitmap;\nimport openfl.display.BitmapData;\nimport openfl.display.PNGEncoderOptions;\nimport openfl.display.Shape;\nimport openfl.geom.Matrix;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass SVGExport\n{\n\t#if (neko && (haxe_210 || haxe3))\n\tpublic static function __init__()\n\t{\n\t\tvar haxePath = Sys.getEnv(\"HAXEPATH\");\n\t\tvar command = (haxePath != null && haxePath != \"\") ? haxePath + \"/haxelib\" : \"haxelib\";\n\n\t\tvar path = \"\";\n\n\t\tif (FileSystem.exists(\"svg.n\"))\n\t\t{\n\t\t\tpath = Path.combine(Sys.getCwd(), \"../ndll/\");\n\t\t}\n\n\t\tif (path == \"\")\n\t\t{\n\t\t\tvar process = new Process(\"haxelib\", [\"path\", \"lime\"]);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\tvar line = StringTools.trim(process.stdout.readLine());\n\n\t\t\t\t\tif (StringTools.startsWith(line, \"-L \"))\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = StringTools.trim(line.substr(2));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\tprocess.close();\n\t\t}\n\n\t\tswitch (System.hostPlatform)\n\t\t{\n\t\t\tcase WINDOWS:\n\t\t\t\t// var is64 = neko.Lib.load(\"std\", \"sys_is64\", 0)();\n\t\t\t\tuntyped $loader.path = $array(path + \"Windows/\", $loader.path);\n\t\t\t\t// if (CFFI.enabled)\n\t\t\t\t// {\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tneko.Lib.load(\"lime\", \"lime_application_create\", 0);\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Windows64/\", $loader.path);\n\t\t\t\t}\n\t\t\t// }\n\n\t\t\tcase MAC:\n\t\t\t\tif (System.hostArchitecture == X64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Mac64/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse if (System.hostArchitecture == ARM64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"MacArm64/\", $loader.path);\n\t\t\t\t}\n\n\t\t\tcase LINUX:\n\t\t\t\tvar arguments = Sys.args();\n\n\t\t\t\tif ( System.hostArchitecture == ARMV7 )\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"LinuxArm/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse if (System.hostArchitecture == ARM64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"LinuxArm64/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse if (System.hostArchitecture == X64)\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Linux64/\", $loader.path);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tuntyped $loader.path = $array(path + \"Linux/\", $loader.path);\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t}\n\t}\n\t#end\n\n\tpublic static function main()\n\t{\n\t\tvar arguments = Sys.args();\n\n\t\t/*if (arguments.length > 0) {\n\n\t\t\t// When the command-line tools are called from haxelib,\n\t\t\t// the last argument is the project directory and the\n\t\t\t// path SWF is the current working directory\n\n\t\t\tvar lastArgument = \"\";\n\n\t\t\tfor (i in 0...arguments.length) {\n\n\t\t\t\tlastArgument = arguments.pop ();\n\t\t\t\tif (lastArgument.length > 0) break;\n\n\t\t\t}\n\n\t\t\tlastArgument = new Path (lastArgument).toString ();\n\n\t\t\tif (((StringTools.endsWith (lastArgument, \"/\") && lastArgument != \"/\") || StringTools.endsWith (lastArgument, \"\\\\\")) && !StringTools.endsWith (lastArgument, \":\\\\\")) {\n\n\t\t\t\tlastArgument = lastArgument.substr (0, lastArgument.length - 1);\n\n\t\t\t}\n\n\t\t\tif (FileSystem.exists (lastArgument) && FileSystem.isDirectory (lastArgument)) {\n\n\t\t\t\tSys.setCwd (lastArgument);\n\n\t\t\t}\n\n\t\t}*/\n\n\t\tvar words = new Array<String>();\n\n\t\tfor (arg in arguments)\n\t\t{\n\t\t\tif (arg == \"-verbose\")\n\t\t\t{\n\t\t\t\tLog.verbose = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twords.push(arg);\n\t\t\t}\n\t\t}\n\n\t\tif (words.length > 4 && words[0] == \"process\")\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar inputPath = words[1];\n\t\t\t\tvar width = Std.parseInt(words[2]);\n\t\t\t\tvar height = Std.parseInt(words[3]);\n\t\t\t\tvar outputPath = words[4];\n\n\t\t\t\tvar svg = new SVG(File.getContent(inputPath));\n\t\t\t\tvar backgroundColor = 0x00FFFFFF;\n\n\t\t\t\tvar shape = new Shape();\n\t\t\t\tsvg.render(shape.graphics, 0, 0, width, height);\n\n\t\t\t\tvar bitmapData = new BitmapData(width, height, true, backgroundColor);\n\t\t\t\tbitmapData.draw(shape);\n\n\t\t\t\tFile.saveBytes(outputPath, bitmapData.encode(bitmapData.rect, new PNGEncoderOptions()));\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tLog.error(e);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tools/alias.hxml",
    "content": "#-main AliasScript\n#-D command=lime\n#-neko lime.n\n#-cmd nekotools boot lime.n\n\n#--next\n\n#-main AliasScript\n#-D command=openfl\n#-neko openfl.n\n#-cmd nekotools boot openfl.n\n\n-main AliasScript\n-D command=lime\n-D HXCPP_M32\n-cpp obj/lime\n\n--next\n\n-main AliasScript\n-D command=openfl\n-D HXCPP_M32\n-cpp obj/openfl"
  },
  {
    "path": "tools/include.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<extension>\n\t\n\t<haxedef name=\"display\" if=\"display\" />\n\t<haxeflag name=\"--no-output\" if=\"display\" />\n\t\n\t<template path=\"templates\" />\n\t\n</extension>"
  },
  {
    "path": "tools/mpeg/audio/Element.hx",
    "content": "package mpeg.audio;\n\nimport haxe.io.Bytes;\n\nenum Element\n{\n\tFrame(frame:Frame);\n\tInfo(info:Info);\n\tGaplessInfo(encoderDelay:Int, endPadding:Int);\n\tUnknown(bytes:Bytes);\n\tEnd;\n}\n"
  },
  {
    "path": "tools/mpeg/audio/Emphasis.hx",
    "content": "package mpeg.audio;\n\nenum Emphasis\n{\n\tNone;\n\tRedBook;\n\tJ17;\n}\n"
  },
  {
    "path": "tools/mpeg/audio/Frame.hx",
    "content": "package mpeg.audio;\n\nimport haxe.io.Bytes;\n\nclass Frame\n{\n\tpublic var header(default, null):FrameHeader;\n\tpublic var frameData(default, null):Bytes;\n\n\tpublic function new(header:FrameHeader, frameData:Bytes)\n\t{\n\t\tthis.header = header;\n\t\tthis.frameData = frameData;\n\t}\n}\n"
  },
  {
    "path": "tools/mpeg/audio/FrameHeader.hx",
    "content": "package mpeg.audio;\n\nimport haxe.io.Bytes;\n\nclass FrameHeader\n{\n\tpublic var version(default, null):MpegVersion;\n\tpublic var layer(default, null):Layer;\n\tpublic var hasCrc(default, null):Bool;\n\tpublic var bitrate(default, null):Int;\n\tpublic var samplingFrequency(default, null):Int;\n\tpublic var hasPadding(default, null):Bool;\n\tpublic var privateBit(default, null):Bool;\n\tpublic var mode(default, null):Mode;\n\tpublic var modeExtension(default, null):Int;\n\tpublic var copyright(default, null):Bool;\n\tpublic var original(default, null):Bool;\n\tpublic var emphasis(default, null):Emphasis;\n\n\tpublic function new(version:MpegVersion, layer:Layer, hasCrc:Bool, bitrate:Int, samplingFrequency:Int, hasPadding:Bool, privateBit:Bool, mode:Mode,\n\t\t\tmodeExtension:Int, copyright:Bool, original:Bool, emphasis:Emphasis)\n\t{\n\t\tthis.version = version;\n\t\tthis.layer = layer;\n\t\tthis.hasCrc = hasCrc;\n\t\tthis.bitrate = bitrate;\n\t\tthis.samplingFrequency = samplingFrequency;\n\t\tthis.hasPadding = hasPadding;\n\t\tthis.privateBit = privateBit;\n\t\tthis.mode = mode;\n\t\tthis.modeExtension = modeExtension;\n\t\tthis.copyright = copyright;\n\t\tthis.original = original;\n\t\tthis.emphasis = emphasis;\n\t}\n}\n"
  },
  {
    "path": "tools/mpeg/audio/Info.hx",
    "content": "package mpeg.audio;\n\nimport haxe.io.Bytes;\n\nclass Info\n{\n\tpublic var header(default, null):FrameHeader;\n\tpublic var infoStartIndex(default, null):Int;\n\tpublic var frameData(default, null):Bytes;\n\n\tpublic function new(header:FrameHeader, startIndex:Int, frameData:Bytes)\n\t{\n\t\tthis.header = header;\n\t\tthis.infoStartIndex = startIndex;\n\t\tthis.frameData = frameData;\n\t}\n}\n"
  },
  {
    "path": "tools/mpeg/audio/Layer.hx",
    "content": "package mpeg.audio;\n\nenum Layer\n{\n\tLayer1;\n\tLayer2;\n\tLayer3;\n}\n"
  },
  {
    "path": "tools/mpeg/audio/Mode.hx",
    "content": "package mpeg.audio;\n\nenum Mode\n{\n\tStereo;\n\tJointStereo;\n\tDualChannel;\n\tSingleChannel;\n}\n"
  },
  {
    "path": "tools/mpeg/audio/MpegAudio.hx",
    "content": "package mpeg.audio;\n\nclass MpegAudio\n{\n\tpublic var frames(default, null):Iterable<Frame>;\n\tpublic var encoderDelay:Int;\n\tpublic var endPadding:Int;\n\n\tpublic function new(frames:Array<Frame>, encoderDelay:Int, endPadding:Int)\n\t{\n\t\tthis.frames = frames;\n\t\tthis.encoderDelay = encoderDelay;\n\t\tthis.endPadding = endPadding;\n\t}\n}\n"
  },
  {
    "path": "tools/mpeg/audio/MpegAudioReader.hx",
    "content": "package mpeg.audio;\n\nimport haxe.io.Bytes;\nimport haxe.io.Eof;\nimport haxe.io.Input;\n\nclass MpegAudioReader\n{\n\t// The theoretical absolute maximum frame size is 2881 bytes\n\t// (MPEG 2.5 Layer II 160Kb/s, with a padding slot).\n\t//\n\t// This is the next-largest power-of-two.\n\tstatic inline var BUFFER_SIZE = 4096;\n\tstatic inline var HEADER_SIZE = 4;\n\tstatic inline var CRC_SIZE = 4;\n\tstatic var infoTagSignature = Bytes.ofString(\"Info\");\n\tstatic var xingTagSignature = Bytes.ofString(\"Xing\");\n\tstatic var versions = [MpegVersion.Version25, null, MpegVersion.Version2, MpegVersion.Version1];\n\tstatic var layers = [null, Layer.Layer3, Layer.Layer2, Layer.Layer1];\n\tstatic var version1Bitrates = [\n\t\t[\n\t\t\tnull, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null\n\t\t],\n\t\t[\n\t\t\t0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, null\n\t\t],\n\t\t[\n\t\t\t0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000, null\n\t\t],\n\t\t[\n\t\t\t0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000, null\n\t\t]\n\t];\n\tstatic var version2Bitrates = [\n\t\t[\n\t\t\tnull, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null\n\t\t],\n\t\t[\n\t\t\t0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, null\n\t\t],\n\t\t[\n\t\t\t0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, null\n\t\t],\n\t\t[\n\t\t\t0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000, null\n\t\t]\n\t];\n\tstatic var samplingFrequenciesByVersionIndex = [\n\t\t[11025, 12000, 8000, null],\n\t\t[null, null, null, null],\n\t\t[22050, 24000, 16000, null],\n\t\t[44100, 48000, 32000, null]\n\t];\n\tstatic var modes = [Mode.Stereo, Mode.JointStereo, Mode.DualChannel, Mode.SingleChannel];\n\tstatic var emphases = [Emphasis.None, Emphasis.RedBook, null, Emphasis.J17];\n\tstatic var slotSizeByLayerIndex = [0, 1, 1, 4];\n\tstatic var slotsPerBitPerSampleByLayerIndexByVersionIndex = [[null, 72, 144, 12], null, [null, 72, 144, 12], [null, 144, 144, 12]];\n\n\tvar input:Input;\n\tvar state:MpegAudioReaderState;\n\tvar seenFirstFrame:Bool;\n\tvar buffer:Bytes;\n\tvar bufferCursor:Int;\n\tvar bufferLength:Int;\n\n\tpublic function new(input:Input)\n\t{\n\t\tif (input == null)\n\t\t{\n\t\t\tthrow \"input must not be null\";\n\t\t}\n\n\t\tthis.input = input;\n\t\tthis.state = MpegAudioReaderState.Start;\n\n\t\tseenFirstFrame = false;\n\n\t\tbuffer = Bytes.alloc(BUFFER_SIZE);\n\t\tbufferCursor = 0;\n\t\tbufferLength = 0;\n\t}\n\n\tpublic function readAll()\n\t{\n\t\tif (state != MpegAudioReaderState.Start)\n\t\t{\n\t\t\tthrow \"Cannot combine calls to readNext and readAll\";\n\t\t}\n\n\t\tvar frames:Array<Frame> = [];\n\n\t\tvar encoderDelay:Int = 0;\n\t\tvar endPadding:Int = 0;\n\n\t\twhile (true)\n\t\t{\n\t\t\tvar element = readNext();\n\n\t\t\tswitch (element)\n\t\t\t{\n\t\t\t\tcase Frame(frame):\n\t\t\t\t\tframes.push(frame);\n\n\t\t\t\tcase Info(_):\n\t\t\t\t// Discard info tag.\n\n\t\t\t\tcase GaplessInfo(giEncoderDelay, giEndPadding):\n\t\t\t\t\tencoderDelay = giEncoderDelay;\n\t\t\t\t\tendPadding = giEndPadding;\n\n\t\t\t\tcase Unknown(_):\n\t\t\t\t// Discard unknown bytes\n\n\t\t\t\tcase End:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar audio = new MpegAudio(frames, encoderDelay, endPadding);\n\n\t\treturn audio;\n\t}\n\n\tpublic function readNext()\n\t{\n\t\tswitch (state)\n\t\t{\n\t\t\tcase Start, Seeking:\n\t\t\t\treturn seek();\n\n\t\t\tcase Info(info):\n\t\t\t\treturn infoTagGaplessInfo(info);\n\n\t\t\tcase Frame:\n\t\t\t\treturn frame();\n\n\t\t\tcase End:\n\t\t\t\treturn end();\n\n\t\t\tcase Ended:\n\t\t\t\tthrow new Eof();\n\t\t}\n\t}\n\n\tfunction seek()\n\t{\n\t\tbufferCursor = 0;\n\n\t\ttry\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (!bufferSpace(2))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn yieldUnknown();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twhile (readByte() != 0xff);\n\t\t\t}\n\t\t\twhile ((readByte() & 0x80) != 0x80);\n\t\t}\n\t\tcatch (eof:Eof)\n\t\t{\n\t\t\treturn end();\n\t\t}\n\n\t\tif (bufferCursor > 2)\n\t\t{\n\t\t\tstate = MpegAudioReaderState.Frame;\n\t\t\treturn yieldUnknown(bufferCursor - 2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn frame();\n\t\t}\n\t}\n\n\tfunction frame()\n\t{\n\t\tvar b:Int;\n\t\ttry\n\t\t{\n\t\t\tb = readByte(1);\n\t\t}\n\t\tcatch (eof:Eof)\n\t\t{\n\t\t\treturn end();\n\t\t}\n\t\tvar versionIndex = (b >> 3) & 0x3;\n\t\tvar layerIndex = (b >> 1) & 0x3;\n\t\tvar hasCrc = b & 1 == 0;\n\n\t\ttry\n\t\t{\n\t\t\tb = readByte(2);\n\t\t}\n\t\tcatch (eof:Eof)\n\t\t{\n\t\t\treturn end();\n\t\t}\n\t\tvar bitrateIndex = (b >> 4) & 0xf;\n\t\tvar samplingFrequencyIndex = (b >> 2) & 0x3;\n\t\tvar hasPadding = (b >> 1) & 1 == 1;\n\t\tvar privateBit = b & 1 == 1;\n\n\t\ttry\n\t\t{\n\t\t\tb = readByte(3);\n\t\t}\n\t\tcatch (eof:Eof)\n\t\t{\n\t\t\treturn end();\n\t\t}\n\t\tvar modeIndex = (b >> 6) & 0x3;\n\t\tvar modeExtension = (b >> 4) & 0x3;\n\t\tvar copyright = (b >> 3) & 1 == 1;\n\t\tvar original = (b >> 2) & 1 == 1;\n\t\tvar emphasisIndex = b & 0x3;\n\n\t\tvar version = versions[versionIndex];\n\t\tvar layer = layers[layerIndex];\n\t\tvar bitrate = switch (version)\n\t\t{\n\t\t\tcase Version1: version1Bitrates[layerIndex][bitrateIndex];\n\t\t\tcase Version2, Version25: version2Bitrates[layerIndex][bitrateIndex];\n\t\t}\n\t\tvar samplingFrequency = samplingFrequenciesByVersionIndex[versionIndex][samplingFrequencyIndex];\n\t\tvar mode = modes[modeIndex];\n\t\tvar emphasis = emphases[emphasisIndex];\n\n\t\tif (version == null || layer == null || bitrate == null || samplingFrequency == null || emphasis == null)\n\t\t{\n\t\t\t// This isn't a valid frame.\n\t\t\t// Seek for another frame starting from the byte after the bogus syncword.\n\t\t\tstate = MpegAudioReaderState.Seeking;\n\t\t\treturn yieldUnknown(1);\n\t\t}\n\n\t\tvar frameData:Bytes;\n\n\t\tif (bitrate == 0)\n\t\t{\n\t\t\t// free-format bitrate\n\n\t\t\tvar end = false;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tdo\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!bufferSpace(2))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn yieldUnknown();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\twhile (readByte() != 0xff);\n\t\t\t\t}\n\t\t\t\twhile ((readByte() & 0xf8) != 0xf8);\n\t\t\t}\n\t\t\tcatch (eof:Eof)\n\t\t\t{\n\t\t\t\tend = true;\n\t\t\t}\n\n\t\t\tvar frameLengthBytes = if (end) bufferCursor else bufferCursor - 2;\n\t\t\tframeLengthBytes -= (frameLengthBytes % slotSizeByLayerIndex[layerIndex]);\n\n\t\t\tvar frameLengthSlots = Math.floor(frameLengthBytes / slotSizeByLayerIndex[layerIndex]);\n\n\t\t\tbitrate = Math.floor(samplingFrequency * frameLengthSlots / slotsPerBitPerSampleByLayerIndexByVersionIndex[versionIndex][layerIndex]); // TODO should bitrate be Float?\n\n\t\t\tframeData = yieldBytes(frameLengthBytes);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar frameLengthSlots = Math.floor(slotsPerBitPerSampleByLayerIndexByVersionIndex[versionIndex][layerIndex] * bitrate / samplingFrequency);\n\n\t\t\tif (hasPadding)\n\t\t\t{\n\t\t\t\tframeLengthSlots += 1;\n\t\t\t}\n\n\t\t\tvar frameLengthBytes = frameLengthSlots * slotSizeByLayerIndex[layerIndex];\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\treadBytesTo(frameLengthBytes - 1);\n\t\t\t}\n\t\t\tcatch (eof:Eof)\n\t\t\t{\n\t\t\t\treturn end();\n\t\t\t}\n\n\t\t\tframeData = yieldBytes();\n\t\t}\n\n\t\tvar header = new FrameHeader(version, layer, hasCrc, bitrate, samplingFrequency, hasPadding, privateBit, mode, modeExtension, copyright, original,\n\t\t\temphasis);\n\n\t\tif (!seenFirstFrame)\n\t\t{\n\t\t\tseenFirstFrame = true;\n\n\t\t\tif (layer == Layer.Layer3)\n\t\t\t{\n\t\t\t\tvar info = readInfo(header, frameData);\n\t\t\t\tif (info != null)\n\t\t\t\t{\n\t\t\t\t\tstate = MpegAudioReaderState.Info(info);\n\t\t\t\t\treturn Element.Info(info);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar frame = new Frame(header, frameData);\n\n\t\tstate = MpegAudioReaderState.Seeking;\n\t\treturn Element.Frame(frame);\n\t}\n\n\tfunction readInfo(header:FrameHeader, frameData:Bytes)\n\t{\n\t\tvar sideInformationSize = switch (header.version)\n\t\t{\n\t\t\tcase Version1: switch (header.mode)\n\t\t\t\t{\n\t\t\t\t\tcase Stereo, JointStereo, DualChannel: 32;\n\t\t\t\t\tcase SingleChannel: 17;\n\t\t\t\t};\n\t\t\tcase Version2, Version25: switch (header.mode)\n\t\t\t\t{\n\t\t\t\t\tcase Stereo, JointStereo, DualChannel: 17;\n\t\t\t\t\tcase SingleChannel: 9;\n\t\t\t\t}\n\t\t};\n\n\t\tvar sideInformationStartIndex = HEADER_SIZE + (if (header.hasCrc) CRC_SIZE else 0);\n\n\t\tvar infoStartIndex = sideInformationStartIndex + sideInformationSize;\n\n\t\tfor (i in sideInformationStartIndex...infoStartIndex)\n\t\t{\n\t\t\tif (frameData.get(i) != 0)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (frameData.sub(infoStartIndex, infoTagSignature.length).compare(infoTagSignature) == 0\n\t\t\t|| frameData.sub(infoStartIndex, xingTagSignature.length).compare(xingTagSignature) == 0)\n\t\t{\n\t\t\treturn new Info(header, infoStartIndex, frameData);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction infoTagGaplessInfo(info:Info)\n\t{\n\t\tvar b0 = info.frameData.get(info.infoStartIndex + 0x8d);\n\t\tvar b1 = info.frameData.get(info.infoStartIndex + 0x8e);\n\t\tvar b2 = info.frameData.get(info.infoStartIndex + 0x8f);\n\n\t\tvar encoderDelay = ((b0 << 4) & 0xff0) | ((b1 >> 4) & 0xf);\n\t\tvar endPadding = ((b1 << 8) & 0xf00) | (b2 & 0xff);\n\n\t\tstate = MpegAudioReaderState.Seeking;\n\t\treturn Element.GaplessInfo(encoderDelay, endPadding);\n\t}\n\n\tfunction end()\n\t{\n\t\tvar unknownElement = yieldUnknown(bufferLength);\n\n\t\tif (unknownElement == null)\n\t\t{\n\t\t\tstate = MpegAudioReaderState.Ended;\n\t\t\treturn Element.End;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstate = MpegAudioReaderState.End;\n\t\t\treturn unknownElement;\n\t\t}\n\t}\n\n\tfunction yieldUnknown(length = -1)\n\t{\n\t\tif (length == -1)\n\t\t{\n\t\t\tlength = bufferCursor;\n\t\t}\n\n\t\tif (length == 0)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\treturn Element.Unknown(yieldBytes(length));\n\t}\n\n\tfunction yieldBytes(length = -1)\n\t{\n\t\tif (length == -1)\n\t\t{\n\t\t\tlength = bufferCursor;\n\t\t}\n\t\telse if (length == 0)\n\t\t{\n\t\t\treturn Bytes.alloc(0);\n\t\t}\n\n\t\tassert(length > 0 && length <= bufferLength);\n\n\t\tvar bytes:Bytes = Bytes.alloc(length);\n\t\tbytes.blit(0, buffer, 0, length);\n\n\t\tbuffer.blit(0, buffer, length, bufferLength - length);\n\n\t\tbufferLength -= length;\n\t\tbufferCursor -= length;\n\n\t\treturn bytes;\n\t}\n\n\tinline function assert(condition:Bool)\n\t{\n\t\tif (!condition)\n\t\t{\n\t\t\tthrow \"MpegAudioReader internal error\";\n\t\t}\n\t}\n\n\tinline function bufferSpace(bytes = 1)\n\t{\n\t\treturn bufferCursor + bytes <= BUFFER_SIZE;\n\t}\n\n\tinline function readByte(position:Int = -1)\n\t{\n\t\tif (position == -1)\n\t\t{\n\t\t\tposition = bufferCursor;\n\t\t}\n\n\t\treadBytesTo(position);\n\n\t\treturn buffer.get(position);\n\t}\n\n\tinline function readBytes(count:Int)\n\t{\n\t\treadBytesTo(bufferCursor + count);\n\t}\n\n\tinline function readBytesTo(position:Int)\n\t{\n\t\tassert(position >= 0 && position < BUFFER_SIZE);\n\n\t\twhile (bufferLength <= position)\n\t\t{\n\t\t\tbuffer.set(bufferLength, input.readByte());\n\t\t\tbufferCursor = ++bufferLength;\n\t\t}\n\n\t\tbufferCursor = position + 1;\n\t}\n}\n\nprivate enum MpegAudioReaderState\n{\n\tStart;\n\tSeeking;\n\tFrame;\n\tInfo(info:Info);\n\tEnd;\n\tEnded;\n}\n"
  },
  {
    "path": "tools/mpeg/audio/MpegVersion.hx",
    "content": "package mpeg.audio;\n\nenum MpegVersion\n{\n\tVersion1;\n\tVersion2;\n\tVersion25;\n}\n"
  },
  {
    "path": "tools/mpeg/audio/Utils.hx",
    "content": "package mpeg.audio;\n\nusing Lambda;\n\nclass Utils\n{\n\tpublic static function calculateAudioLengthSamples(mpegAudio:MpegAudio)\n\t{\n\t\treturn mpegAudio.frames.map(function(frame)\n\t\t{\n\t\t\treturn lookupSamplesPerFrame(frame.header.version, frame.header.layer);\n\t\t}).fold(function(frameSampleCount, totalSampleCount)\n\t\t{\n\t\t\treturn frameSampleCount + totalSampleCount;\n\t\t}, -mpegAudio.encoderDelay - mpegAudio.endPadding);\n\t}\n\n\tpublic static function lookupSamplesPerFrame(mpegVersion:MpegVersion, layer:Layer)\n\t{\n\t\treturn switch (layer)\n\t\t{\n\t\t\tcase Layer1: 384;\n\t\t\tcase Layer2: 1152;\n\t\t\tcase Layer3: switch (mpegVersion)\n\t\t\t\t{\n\t\t\t\t\tcase Version1: 1152;\n\t\t\t\t\tcase Version2, Version25: 576;\n\t\t\t\t};\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "tools/platforms/AIRPlatform.hx",
    "content": "package;\n\nimport hxp.Log;\nimport hxp.Path;\nimport hxp.System;\nimport lime.tools.AIRHelper;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.FlashHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformType;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass AIRPlatform extends FlashPlatform\n{\n\tprivate var iconData:Array<Dynamic>;\n\tprivate var splashScreenData:Array<Dynamic>;\n\tprivate var targetPlatform:Platform;\n\tprivate var targetPlatformType:PlatformType;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tif (project.targetFlags.exists(\"ios\") || project.targetFlags.exists(\"android\"))\n\t\t{\n\t\t\tdefaults.window.width = 0;\n\t\t\tdefaults.window.height = 0;\n\t\t}\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"air.output-directory\", \"air\"));\n\n\t\tif (targetFlags.exists(\"android\"))\n\t\t{\n\t\t\ttargetPlatform = Platform.ANDROID;\n\t\t\ttargetPlatformType = MOBILE;\n\t\t}\n\t\telse if (targetFlags.exists(\"ios\"))\n\t\t{\n\t\t\ttargetPlatform = Platform.IOS;\n\t\t\ttargetPlatformType = MOBILE;\n\t\t}\n\t\telse if (targetFlags.exists(\"windows\"))\n\t\t{\n\t\t\ttargetPlatform = Platform.WINDOWS;\n\t\t\ttargetPlatformType = DESKTOP;\n\t\t}\n\t\telse if (targetFlags.exists(\"mac\"))\n\t\t{\n\t\t\ttargetPlatform = Platform.MAC;\n\t\t\ttargetPlatformType = DESKTOP;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetPlatform = System.hostPlatform;\n\t\t\ttargetPlatformType = DESKTOP;\n\t\t}\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tsuper.build();\n\n\t\tif (!project.defines.exists(\"AIR_SDK\"))\n\t\t{\n\t\t\tLog.error(\"You must define AIR_SDK with the path to your AIR SDK\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar airSdk = project.environment.get(\"AIR_SDK\");\n\t\t\tif (!FileSystem.exists(airSdk))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for AIR_SDK does not exist: \" + airSdk);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t\tif (!FileSystem.isDirectory(airSdk))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for AIR_SDK must be a directory: \" + airSdk);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Should we package on desktop in \"deploy\" command instead?\n\n\t\tif (targetPlatformType != DESKTOP && !project.targetFlags.exists(\"air-simulator\"))\n\t\t{\n\t\t\tvar files = [project.app.file + \".swf\"];\n\t\t\tfor (asset in project.assets)\n\t\t\t{\n\t\t\t\tif (asset.embed == false && asset.type != TEMPLATE)\n\t\t\t\t{\n\t\t\t\t\tfiles.push(asset.targetPath);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (icon in iconData)\n\t\t\t{\n\t\t\t\tfiles.push(icon.path);\n\t\t\t}\n\n\t\t\tfor (splashScreen in splashScreenData)\n\t\t\t{\n\t\t\t\tfiles.push(splashScreen.path);\n\t\t\t}\n\n\t\t\tvar targetPath = switch (targetPlatform)\n\t\t\t{\n\t\t\t\tcase ANDROID: \"bin/\" + project.app.file + \".apk\";\n\t\t\t\tcase IOS: \"bin/\" + project.app.file + \".ipa\";\n\t\t\t\tdefault: \"bin/\" + project.app.file + \".air\";\n\t\t\t}\n\n\t\t\tAIRHelper.build(project, targetDirectory, targetPlatform, targetPath, \"application.xml\", files, \"bin\");\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tif (targetFlags.exists(\"gdrive\") || targetFlags.exists(\"zip\"))\n\t\t{\n\t\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"AIR\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar rootDirectory = targetDirectory + \"/bin\";\n\t\t\tvar paths = System.readDirectory(rootDirectory, [project.app.file + \".apk\", project.app.file + \".ipa\", project.app.file + \".air\"]);\n\t\t\tvar files:Array<String> = [];\n\n\t\t\tfor (path in paths)\n\t\t\t{\n\t\t\t\tfiles.push(path.substr(rootDirectory.length + 1));\n\t\t\t}\n\n\t\t\tvar name = project.meta.title + \" (\" + project.meta.version + \" build \" + project.meta.buildNumber + \")\";\n\n\t\t\tswitch (targetPlatform)\n\t\t\t{\n\t\t\t\tcase WINDOWS:\n\t\t\t\t\tname += \" (Windows)\";\n\n\t\t\t\tcase MAC:\n\t\t\t\t\tname += \" (macOS)\";\n\n\t\t\t\tcase IOS:\n\t\t\t\t\tname += \" (iOS).ipa\";\n\n\t\t\t\tcase ANDROID:\n\t\t\t\t\tname += \" (Android).apk\";\n\n\t\t\t\tdefault:\n\t\t\t}\n\n\t\t\tvar outputPath = \"dist/\" + name;\n\n\t\t\tSystem.mkdir(targetDirectory + \"/dist\");\n\n\t\t\toutputPath = AIRHelper.build(project, targetDirectory, targetPlatform, outputPath, \"application.xml\", files, \"bin\");\n\n\t\t\tif (targetPlatformType == DESKTOP)\n\t\t\t{\n\t\t\t\tSystem.compress(Path.combine(targetDirectory, outputPath), Path.combine(targetDirectory, \"dist/\" + name + \".zip\"));\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function install():Void\n\t{\n\t\t// TODO: Make separate install step\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tAIRHelper.run(project, targetDirectory, targetPlatform, \"application.xml\", \"bin\");\n\t}\n\n\tpublic override function trace():Void\n\t{\n\t\tAIRHelper.trace(project, targetDirectory, targetPlatform, \"application.xml\", \"bin\");\n\t}\n\n\tpublic override function uninstall():Void\n\t{\n\t\tAIRHelper.uninstall(project, targetDirectory, targetPlatform, \"application.xml\", \"bin\");\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\tvar destination = targetDirectory + \"/bin/\";\n\t\tSystem.mkdir(destination);\n\n\t\t// project = project.clone ();\n\n\t\tembedded = FlashHelper.embedAssets(project, targetDirectory);\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\t\tcontext.AIR_SDK_VERSION = project.config.getString(\"air.sdk-version\", \"32.0\");\n\n\t\tvar buildNumber = Std.string(context.APP_BUILD_NUMBER);\n\n\t\tif (buildNumber.length <= 3)\n\t\t{\n\t\t\tcontext.APP_BUILD_NUMBER_SPLIT = buildNumber;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar major:String = null;\n\n\t\t\tvar patch = buildNumber.substr(-3);\n\t\t\tbuildNumber = buildNumber.substr(0, -3);\n\n\t\t\tvar minor = buildNumber.substr(-Std.int(Math.min(buildNumber.length, 3)));\n\t\t\tbuildNumber = buildNumber.substr(0, -minor.length);\n\n\t\t\tif (buildNumber.length > 0)\n\t\t\t{\n\t\t\t\tmajor = buildNumber.substr(-Std.int(Math.min(buildNumber.length, 3)));\n\t\t\t\tbuildNumber = buildNumber.substr(0, -major.length);\n\t\t\t}\n\n\t\t\tvar buildNumberSplit = minor + \".\" + patch;\n\t\t\tif (major != null) buildNumberSplit = major + \".\" + buildNumberSplit;\n\n\t\t\tcontext.APP_BUILD_NUMBER_SPLIT = buildNumberSplit;\n\n\t\t\tif (buildNumber.length > 0)\n\t\t\t{\n\t\t\t\tLog.warn(\"Application build number \" + buildNumber + buildNumberSplit + \" exceeds 9 digits\");\n\t\t\t}\n\t\t}\n\n\t\tvar targetDevice = project.config.getString(\"ios.device\", \"universal\");\n\t\tvar targetDevices:Array<Int> = [];\n\n\t\tif (targetDevice != \"ipad\") targetDevices.push(1); // iphone\n\t\tif (targetDevice != \"iphone\") targetDevices.push(2); // ipad\n\n\t\tcontext.IOS_TARGET_DEVICES = targetDevices;\n\n\t\tvar iconSizes = [\n\t\t\t16, 29, 32, 36, 40, 48, 50, 57, 58, 60, 72, 75, 76, 80, 87, 96, 100, 114, 120, 128, 144, 152, 167, 180, 192, 512, 1024\n\t\t];\n\t\tvar icons = project.icons;\n\t\ticonData = [];\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\tfor (size in iconSizes)\n\t\t{\n\t\t\tif (IconHelper.createIcon(icons, size, size, targetDirectory + \"/bin/_res/icon-\" + size + \".png\"))\n\t\t\t{\n\t\t\t\ticonData.push({size: size, path: \"_res/icon-\" + size + \".png\"});\n\t\t\t}\n\t\t}\n\n\t\tif (iconData.length > 0) context.icons = iconData;\n\n\t\tcontext.extensions = new Array<String>();\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (StringTools.endsWith(dependency.path, \".ane\"))\n\t\t\t{\n\t\t\t\tvar extension:Dynamic = {name: dependency.name};\n\t\t\t\tcontext.extensions.push(extension);\n\t\t\t\tcontext.HAXE_FLAGS += \"\\n-swf-lib \" + dependency.path;\n\t\t\t}\n\t\t}\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"air/hxml\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"air/template\", targetDirectory, context);\n\n\t\tif (embedded)\n\t\t{\n\t\t\tvar files = [\"debug.hxml\", \"release.hxml\", \"final.hxml\"];\n\t\t\tvar path:String;\n\t\t\tvar hxml:String;\n\t\t\tvar lines:Array<String>;\n\t\t\tvar output:Array<String>;\n\n\t\t\tfor (file in files)\n\t\t\t{\n\t\t\t\tpath = targetDirectory + \"/haxe/\" + file;\n\t\t\t\thxml = File.getContent(path);\n\n\t\t\t\tif (hxml.indexOf(\"-swf-header\") > -1)\n\t\t\t\t{\n\t\t\t\t\tlines = ~/[\\r\\n]+/g.split(hxml);\n\t\t\t\t\toutput = [];\n\n\t\t\t\t\tfor (line in lines)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (line.indexOf(\"-swf-header\") > -1) continue;\n\t\t\t\t\t\toutput.push(line);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (output.length < lines.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tFile.saveContent(path, output.join(\"\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type == AssetType.TEMPLATE || asset.embed == false /*|| !usesLime*/)\n\t\t\t{\n\t\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t}\n\t\t}\n\n\t\tsplashScreenData = [];\n\n\t\tif (project.splashScreens != null)\n\t\t{\n\t\t\tfor (splashScreen in project.splashScreens)\n\t\t\t{\n\t\t\t\tvar path = Path.withoutDirectory(splashScreen.path);\n\t\t\t\tSystem.copyFile(splashScreen.path, Path.combine(destination, path), context);\n\t\t\t\tsplashScreenData.push({path: path});\n\t\t\t}\n\t\t}\n\t}\n\n\t@ignore public override function rebuild():Void {}\n}\n"
  },
  {
    "path": "tools/platforms/AndroidPlatform.hx",
    "content": "package;\n\nimport hxp.ArrayTools;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.Path;\nimport hxp.System;\nimport lime.tools.AndroidHelper;\nimport lime.tools.Architecture;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.Orientation;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass AndroidPlatform extends PlatformTarget\n{\n\tprivate var deviceID:String;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tif (project.targetFlags.exists(\"simulator\") || project.targetFlags.exists(\"emulator\"))\n\t\t{\n\t\t\tdefaults.architectures = [Architecture.X64, Architecture.ARM64];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdefaults.architectures = [Architecture.ARMV7, Architecture.ARM64];\n\t\t}\n\n\t\tdefaults.window.width = 0;\n\t\tdefaults.window.height = 0;\n\t\tdefaults.window.fullscreen = true;\n\t\tdefaults.window.requireShaders = true;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\tif (command != \"display\" && command != \"clean\")\n\t\t{\n\t\t\t// project = project.clone ();\n\n\t\t\tif (!project.environment.exists(\"ANDROID_SETUP\"))\n\t\t\t{\n\t\t\t\tLog.error(\"You need to run \\\"lime setup android\\\" before you can use the Android target\");\n\t\t\t}\n\n\t\t\tAndroidHelper.initialize(project);\n\n\t\t\tif (deviceID == null && project.targetFlags.exists(\"device\"))\n\t\t\t{\n\t\t\t\tdeviceID = project.targetFlags.get(\"device\") + \":5555\";\n\t\t\t}\n\t\t}\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"android.output-directory\", \"android\"));\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tvar destination = targetDirectory + \"/bin\";\n\t\tvar hxml = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\t\tvar sourceSet = destination + \"/app/src/main\";\n\n\t\tvar hasARMV5 = (ArrayTools.containsValue(project.architectures, Architecture.ARMV5)\n\t\t\t|| ArrayTools.containsValue(project.architectures, Architecture.ARMV6));\n\t\tvar hasARMV7 = ArrayTools.containsValue(project.architectures, Architecture.ARMV7);\n\t\tvar hasARM64 = ArrayTools.containsValue(project.architectures, Architecture.ARM64);\n\t\tvar hasX86 = ArrayTools.containsValue(project.architectures, Architecture.X86);\n\t\tvar hasX64 = ArrayTools.containsValue(project.architectures, Architecture.X64);\n\n\t\tvar architectures:Array<Architecture> = [];\n\n\t\tif (hasARMV5) architectures.push(Architecture.ARMV5);\n\t\tif (hasARMV7) architectures.push(Architecture.ARMV7);\n\t\tif (hasARM64) architectures.push(Architecture.ARM64);\n\t\tif (hasX86) architectures.push(Architecture.X86);\n\t\tif (hasX64) architectures.push(Architecture.X64);\n\n\t\tif (architectures.length == 0)\n\t\t{\n\t\t\tLog.warn(\"No architecture selected, defaulting to ARM64.\");\n\n\t\t\thasARM64 = true;\n\n\t\t\tarchitectures.push(Architecture.ARM64);\n\t\t}\n\n\t\tfor (architecture in architectures)\n\t\t{\n\t\t\tvar minSDKVer = project.config.getInt(\"android.minimum-sdk-version\", 21);\n\t\t\t//PLATFORM define needed for older ndk and gcc toolchain\n\t\t\tvar haxeParams = [hxml, \"-D\", \"android\", \"-D\", 'PLATFORM_NUMBER=$minSDKVer', \"-D\", 'PLATFORM=android-$minSDKVer'];\n\t\t\tvar cppParams = [\"-Dandroid\", '-DPLATFORM_NUMBER=$minSDKVer', '-DPLATFORM=android-$minSDKVer'];\n\t\t\tvar path = sourceSet + \"/jniLibs/armeabi\";\n\t\t\tvar suffix = \".so\";\n\n\t\t\tif (architecture == Architecture.ARMV7)\n\t\t\t{\n\t\t\t\thaxeParams.push(\"-D\");\n\t\t\t\thaxeParams.push(\"HXCPP_ARMV7\");\n\t\t\t\tcppParams.push(\"-DHXCPP_ARMV7\");\n\t\t\t\tpath = sourceSet + \"/jniLibs/armeabi-v7a\";\n\t\t\t\tsuffix = \"-v7.so\";\n\t\t\t}\n\t\t\telse if (architecture == Architecture.ARM64)\n\t\t\t{\n\t\t\t\thaxeParams.push(\"-D\");\n\t\t\t\thaxeParams.push(\"HXCPP_ARM64\");\n\t\t\t\tcppParams.push(\"-DHXCPP_ARM64\");\n\t\t\t\tpath = sourceSet + \"/jniLibs/arm64-v8a\";\n\t\t\t\tsuffix = \"-64.so\";\n\t\t\t}\n\t\t\telse if (architecture == Architecture.X86)\n\t\t\t{\n\t\t\t\thaxeParams.push(\"-D\");\n\t\t\t\thaxeParams.push(\"HXCPP_X86\");\n\t\t\t\tcppParams.push(\"-DHXCPP_X86\");\n\t\t\t\tpath = sourceSet + \"/jniLibs/x86\";\n\t\t\t\tsuffix = \"-x86.so\";\n\t\t\t}\n\t\t\telse if (architecture == Architecture.X64)\n\t\t\t{\n\t\t\t\thaxeParams.push(\"-D\");\n\t\t\t\thaxeParams.push(\"HXCPP_X86_64\");\n\t\t\t\tcppParams.push(\"-DHXCPP_X86_64\");\n\t\t\t\tpath = sourceSet + \"/jniLibs/x86_64\";\n\t\t\t\tsuffix = \"-x86_64.so\";\n\t\t\t}\n\n\t\t\tfor (ndll in project.ndlls)\n\t\t\t{\n\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Android\", \"lib\", suffix, path, project.debug, \".so\");\n\t\t\t}\n\n\t\t\tSystem.runCommand(\"\", \"haxe\", haxeParams);\n\n\t\t\tif (noOutput) continue;\n\n\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", cppParams);\n\n\t\t\tSystem.copyIfNewer(targetDirectory + \"/obj/libApplicationMain\" + (project.debug ? \"-debug\" : \"\") + suffix, path + \"/libApplicationMain.so\");\n\t\t}\n\n\t\tif (!hasARMV5)\n\t\t{\n\t\t\tif (FileSystem.exists(sourceSet + \"/jniLibs/armeabi\"))\n\t\t\t{\n\t\t\t\tSystem.removeDirectory(sourceSet + \"/jniLibs/armeabi\");\n\t\t\t}\n\t\t}\n\n\t\tif (!hasARMV7)\n\t\t{\n\t\t\tif (FileSystem.exists(sourceSet + \"/jniLibs/armeabi-v7a\"))\n\t\t\t{\n\t\t\t\tSystem.removeDirectory(sourceSet + \"/jniLibs/armeabi-v7a\");\n\t\t\t}\n\t\t}\n\n\t\tif (!hasARM64)\n\t\t{\n\t\t\tif (FileSystem.exists(sourceSet + \"/jniLibs/arm64-v8a\"))\n\t\t\t{\n\t\t\t\tSystem.removeDirectory(sourceSet + \"/jniLibs/arm64-v8a\");\n\t\t\t}\n\t\t}\n\n\t\tif (!hasX86)\n\t\t{\n\t\t\tif (FileSystem.exists(sourceSet + \"/jniLibs/x86\"))\n\t\t\t{\n\t\t\t\tSystem.removeDirectory(sourceSet + \"/jniLibs/x86\");\n\t\t\t}\n\t\t}\n\n\t\tif (!hasX64)\n\t\t{\n\t\t\tif (FileSystem.exists(sourceSet + \"/jniLibs/x86_64\"))\n\t\t\t{\n\t\t\t\tSystem.removeDirectory(sourceSet + \"/jniLibs/x86_64\");\n\t\t\t}\n\t\t}\n\n\t\tif (noOutput) return;\n\n\t\tAndroidHelper.build(project, destination);\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"Android\");\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tvar build = \"-debug\";\n\t\t\tif (project.keystore != null)\n\t\t\t{\n\t\t\t\tbuild = \"-release\";\n\t\t\t}\n\n\t\t\tvar outputDirectory:String = null;\n\t\t\tif (project.config.exists(\"android.gradle-build-directory\"))\n\t\t\t{\n\t\t\t\toutputDirectory = Path.combine(project.config.getString(\"android.gradle-build-directory\"), project.app.file + \"/app/outputs/apk\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\toutputDirectory = Path.combine(FileSystem.fullPath(targetDirectory), \"bin/app/build/outputs/apk\");\n\t\t\t}\n\n\t\t\tSys.println(Path.combine(outputDirectory, project.app.file + build + \".apk\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\thxml.cpp = \"_\";\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function install():Void\n\t{\n\t\tvar build = \"debug\";\n\n\t\tif (project.keystore != null)\n\t\t{\n\t\t\tbuild = \"release\";\n\t\t}\n\n\t\tif (project.environment.exists(\"ANDROID_GRADLE_TASK\"))\n\t\t{\n\t\t\tvar task = project.environment.get(\"ANDROID_GRADLE_TASK\");\n\t\t\tif (task == \"assembleDebug\")\n\t\t\t{\n\t\t\t\tbuild = \"debug\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbuild = \"release\";\n\t\t\t}\n\t\t}\n\n\t\tvar outputDirectory:String = null;\n\n\t\tif (project.config.exists(\"android.gradle-build-directory\"))\n\t\t{\n\t\t\toutputDirectory = Path.combine(project.config.getString(\"android.gradle-build-directory\"), project.app.file + \"/app/outputs/apk/\" + build);\n\t\t}\n\t\telse\n\t\t{\n\t\t\toutputDirectory = Path.combine(FileSystem.fullPath(targetDirectory), \"bin/app/build/outputs/apk/\" + build);\n\t\t}\n\n\t\tvar apkPath = Path.combine(outputDirectory, project.app.file + \"-\" + build + \".apk\");\n\n\t\tdeviceID = AndroidHelper.install(project, apkPath, deviceID);\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tvar armv5 = (/*command == \"rebuild\" ||*/\n\t\t\tArrayTools.containsValue(project.architectures, Architecture.ARMV5)\n\t\t\t|| ArrayTools.containsValue(project.architectures, Architecture.ARMV6));\n\t\tvar armv7 = (command == \"rebuild\" || ArrayTools.containsValue(project.architectures, Architecture.ARMV7));\n\t\tvar arm64 = (command == \"rebuild\" || ArrayTools.containsValue(project.architectures, Architecture.ARM64));\n\t\tvar x86 = (ArrayTools.containsValue(project.architectures, Architecture.X86));\n\t\tvar x64 = (command == \"rebuild\" || ArrayTools.containsValue(project.architectures, Architecture.X64));\n\n\t\tvar commands:Array<Array<String>> = [];\n\t\tvar minSDKVer = 21;\n\t\tvar platformNumberDefine = '-DPLATFORM_NUMBER=$minSDKVer';\n\t\t// Required for older ndk and gcc toolchain\n\t\tvar platformDefine = '-DPLATFORM=android-$minSDKVer';\n\n\t\tif (armv5) commands.push([\"-Dandroid\", platformDefine]);\n\t\tif (armv7) commands.push([\"-Dandroid\", \"-DHXCPP_ARMV7\", platformDefine, platformNumberDefine]);\n\t\tif (arm64) commands.push([\"-Dandroid\", \"-DHXCPP_ARM64\", platformDefine, platformNumberDefine]);\n\t\tif (x86) commands.push([\"-Dandroid\", \"-DHXCPP_X86\", platformDefine, platformNumberDefine]);\n\t\tif (x64) commands.push([\"-Dandroid\", \"-DHXCPP_X86_64\", platformDefine, platformNumberDefine]);\n\n\t\tCPPHelper.rebuild(project, commands);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tAndroidHelper.run(project.meta.packageName + \"/\" + project.meta.packageName + \".MainActivity\", deviceID);\n\t}\n\n\tpublic override function trace():Void\n\t{\n\t\tAndroidHelper.trace(project, project.debug, deviceID);\n\t}\n\n\tpublic override function uninstall():Void\n\t{\n\t\tAndroidHelper.uninstall(project.meta.packageName, deviceID);\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\t// initialize (project);\n\n\t\tvar destination = targetDirectory + \"/bin\";\n\t\tvar sourceSet = destination + \"/app/src/main\";\n\t\tSystem.mkdir(sourceSet);\n\t\tSystem.mkdir(sourceSet + \"/res/drawable-ldpi/\");\n\t\tSystem.mkdir(sourceSet + \"/res/drawable-mdpi/\");\n\t\tSystem.mkdir(sourceSet + \"/res/drawable-hdpi/\");\n\t\tSystem.mkdir(sourceSet + \"/res/drawable-xhdpi/\");\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tvar targetPath = \"\";\n\n\t\t\t\tswitch (asset.type)\n\t\t\t\t{\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// case SOUND, MUSIC:\n\n\t\t\t\t\t\t// var extension = Path.extension (asset.sourcePath);\n\t\t\t\t\t\t// asset.flatName += ((extension != \"\") ? \".\" + extension : \"\");\n\n\t\t\t\t\t\t// asset.resourceName = asset.flatName;\n\t\t\t\t\t\ttargetPath = Path.combine(sourceSet + \"/assets/\", asset.resourceName);\n\n\t\t\t\t\t\t// asset.resourceName = asset.id;\n\t\t\t\t\t\t// targetPath = sourceSet + \"/res/raw/\" + asset.flatName + \".\" + Path.extension (asset.targetPath);\n\n\t\t\t\t\t\t// default:\n\n\t\t\t\t\t\t// asset.resourceName = asset.flatName;\n\t\t\t\t\t\t// targetPath = sourceSet + \"/assets/\" + asset.resourceName;\n\t\t\t\t}\n\n\t\t\t\tAssetHelper.copyAssetIfNewer(asset, targetPath);\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tvar context = project.templateContext;\n\n\t\tcontext.CPP_DIR = targetDirectory + \"/obj\";\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\t\tcontext.ANDROID_INSTALL_LOCATION = project.config.getString(\"android.install-location\", \"auto\");\n\t\tcontext.ANDROID_MINIMUM_SDK_VERSION = project.config.getInt(\"android.minimum-sdk-version\", 21);\n\t\tcontext.ANDROID_TARGET_SDK_VERSION = project.config.getInt(\"android.target-sdk-version\", 35);\n\t\tcontext.ANDROID_EXTENSIONS = project.config.getArrayString(\"android.extension\");\n\t\tcontext.ANDROID_PERMISSIONS = project.config.getArrayString(\"android.permission\", [\n\t\t\t\"android.permission.WAKE_LOCK\",\n\t\t\t\"android.permission.INTERNET\",\n\t\t\t\"android.permission.VIBRATE\",\n\t\t\t\"android.permission.ACCESS_NETWORK_STATE\"\n\t\t]);\n\t\tcontext.ANDROID_GRADLE_VERSION = project.config.getString(\"android.gradle-version\", \"8.9\");\n\t\tcontext.ANDROID_GRADLE_PLUGIN = project.config.getString(\"android.gradle-plugin\", \"8.7.3\");\n\t\tcontext.ANDROID_USE_ANDROIDX = project.config.getString(\"android.useAndroidX\", \"true\");\n\t\tcontext.ANDROID_ENABLE_JETIFIER = project.config.getString(\"android.enableJetifier\", \"false\");\n\t\tcontext.ANDROID_GRADLE_PROPERTIES = project.config.getKeyValueArray(\"android.gradle-properties\");\n\t\tcontext.ANDROID_DISPLAY_CUTOUT = project.config.getString(\"android.layoutInDisplayCutoutMode\", \"default\");\n\n\t\tcontext.ANDROID_APPLICATION = project.config.getKeyValueArray(\"android.application\", {\n\t\t\t\"android:label\": project.meta.title,\n\t\t\t\"android:allowBackup\": \"true\",\n\t\t\t\"android:theme\": \"@android:style/Theme.NoTitleBar\" + (project.window.fullscreen ? \".Fullscreen\" : \"\"),\n\t\t\t\"android:hardwareAccelerated\": \"true\",\n\t\t\t\"android:allowNativeHeapPointerTagging\": context.ANDROID_TARGET_SDK_VERSION >= 30 ? \"false\" : null\n\t\t});\n\t\tcontext.ANDROID_ACTIVITY = project.config.getKeyValueArray(\"android.activity\", {\n\t\t\t\"android:name\": \"MainActivity\",\n\t\t\t\"android:exported\": \"true\",\n\t\t\t\"android:launchMode\": \"singleTask\",\n\t\t\t\"android:label\": project.meta.title,\n\t\t\t\"android:configChanges\": project.config.getArrayString(\"android.configChanges\",\n\t\t\t\t[\"layoutDirection\", \"locale\", \"orientation\", \"uiMode\", \"screenLayout\", \"screenSize\", \"smallestScreenSize\", \"keyboard\", \"keyboardHidden\", \"navigation\"])\n\t\t\t\t.join(\"|\"),\n\t\t\t\"android:screenOrientation\": project.window.orientation == PORTRAIT ? \"sensorPortrait\" : (project.window.orientation == LANDSCAPE ? \"sensorLandscape\" : null)\n\t\t});\n\t\tcontext.ANDROID_ACCEPT_FILE_INTENT = project.config.getArrayString(\"android.accept-file-intent\", []);\n\n\t\tif (!project.environment.exists(\"ANDROID_SDK\") || !project.environment.exists(\"ANDROID_NDK_ROOT\"))\n\t\t{\n\t\t\tvar command = #if lime \"lime\" #else \"hxp\" #end;\n\t\t\tvar toolsBase = Type.resolveClass(\"CommandLineTools\");\n\t\t\tif (toolsBase != null) command = Reflect.field(toolsBase, \"commandName\");\n\n\t\t\tLog.error(\"You must define ANDROID_SDK and ANDROID_NDK_ROOT to target Android, please run '\" + command + \" setup android' first\");\n\t\t\tSys.exit(1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar sdkPath = project.environment.get(\"ANDROID_SDK\");\n\t\t\tif (!FileSystem.exists(sdkPath))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for ANDROID_SDK does not exist: \" + sdkPath);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t\tif (!FileSystem.isDirectory(sdkPath))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for ANDROID_SDK must be a directory: \" + sdkPath);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t\tvar ndkPath = project.environment.get(\"ANDROID_NDK_ROOT\");\n\t\t\tif (!FileSystem.exists(ndkPath))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for ANDROID_NDK_ROOT does not exist: \" + ndkPath);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t\tif (!FileSystem.isDirectory(ndkPath))\n\t\t\t{\n\t\t\t\tLog.error(\"The path specified for ANDROID_NDK_ROOT must be a directory: \" + ndkPath);\n\t\t\t\tSys.exit(1);\n\t\t\t}\n\t\t}\n\n\t\tif (project.config.exists(\"android.gradle-build-directory\"))\n\t\t{\n\t\t\tcontext.ANDROID_GRADLE_BUILD_DIRECTORY = project.config.getString(\"android.gradle-build-directory\");\n\t\t}\n\n\t\tif (project.config.exists(\"android.build-tools-version\"))\n\t\t{\n\t\t\tcontext.ANDROID_BUILD_TOOLS_VERSION = project.config.getString(\"android.build-tools-version\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcontext.ANDROID_BUILD_TOOLS_VERSION = AndroidHelper.getBuildToolsVersion(project);\n\t\t}\n\n\t\tcontext.ANDROID_SDK_ESCAPED = StringTools.replace(context.ENV_ANDROID_SDK, \"\\\\\", \"\\\\\\\\\");\n\t\tcontext.ANDROID_NDK_ROOT_ESCAPED = StringTools.replace(context.ENV_ANDROID_NDK_ROOT, \"\\\\\", \"\\\\\\\\\");\n\n\t\t// we need to specify ndkVersion in build.gradle, and the value can be\n\t\t// found in the NDK's source.properties file\n\t\tvar ndkSrcPropsPath = Path.join([context.ENV_ANDROID_NDK_ROOT, \"source.properties\"]);\n\t\tif (FileSystem.exists(ndkSrcPropsPath))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar srcProps = File.getContent(ndkSrcPropsPath);\n\t\t\t\tvar lines = srcProps.split(\"\\n\");\n\t\t\t\tfor (line in lines)\n\t\t\t\t{\n\t\t\t\t\tvar parts = ~/\\s+=\\s+/.split(StringTools.trim(line));\n\t\t\t\t\tif (parts.length == 2 && parts[0] == \"Pkg.Revision\")\n\t\t\t\t\t{\n\t\t\t\t\t\tcontext.ANDROID_NDK_VERSION = parts[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t}\n\t\t}\n\n\t\tif (Reflect.hasField(context, \"KEY_STORE\")) context.KEY_STORE = StringTools.replace(context.KEY_STORE, \"\\\\\", \"\\\\\\\\\");\n\t\tif (Reflect.hasField(context, \"KEY_STORE_ALIAS\")) context.KEY_STORE_ALIAS = StringTools.replace(context.KEY_STORE_ALIAS, \"\\\\\", \"\\\\\\\\\");\n\t\tif (Reflect.hasField(context, \"KEY_STORE_PASSWORD\")) context.KEY_STORE_PASSWORD = StringTools.replace(context.KEY_STORE_PASSWORD, \"\\\\\", \"\\\\\\\\\");\n\t\tif (Reflect.hasField(context,\n\t\t\t\"KEY_STORE_ALIAS_PASSWORD\")) context.KEY_STORE_ALIAS_PASSWORD = StringTools.replace(context.KEY_STORE_ALIAS_PASSWORD, \"\\\\\", \"\\\\\\\\\");\n\n\t\tvar index = 1;\n\t\tcontext.ANDROID_LIBRARY_PROJECTS = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (dependency.path != \"\"\n\t\t\t\t&& FileSystem.exists(dependency.path)\n\t\t\t\t&& FileSystem.isDirectory(dependency.path)\n\t\t\t\t&& (FileSystem.exists(Path.combine(dependency.path, \"project.properties\"))\n\t\t\t\t\t|| FileSystem.exists(Path.combine(dependency.path, \"build.gradle\"))))\n\t\t\t{\n\t\t\t\tvar name = dependency.name;\n\t\t\t\tif (name == \"\") name = \"project\" + index;\n\n\t\t\t\tcontext.ANDROID_LIBRARY_PROJECTS.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\tpath: \"deps/\" + name,\n\t\t\t\t\t\tsource: dependency.path\n\t\t\t\t\t});\n\t\t\t\tindex++;\n\t\t\t}\n\t\t}\n\n\t\tfor (attribute in context.ANDROID_APPLICATION)\n\t\t{\n\t\t\tif (attribute.key == \"android:icon\")\n\t\t\t{\n\t\t\t\tcontext.HAS_ICON = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (context.HAS_ICON == null)\n\t\t{\n\t\t\tvar iconTypes = [\"ldpi\", \"mdpi\", \"hdpi\", \"xhdpi\", \"xxhdpi\", \"xxxhdpi\"];\n\t\t\tvar iconSizes = [36, 48, 72, 96, 144, 192];\n\t\t\tvar icons = project.icons;\n\n\t\t\tif (icons.length == 0)\n\t\t\t{\n\t\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t\t}\n\t\t\tfor (i in 0...iconTypes.length)\n\t\t\t{\n\t\t\t\t// create multiple icons, only set \"android:icon\" once\n\t\t\t\tif (IconHelper.createIcon(icons, iconSizes[i], iconSizes[i], sourceSet + \"/res/drawable-\" + iconTypes[i] + \"/icon.png\")\n\t\t\t\t\t&& !context.HAS_ICON)\n\t\t\t\t{\n\t\t\t\t\tcontext.HAS_ICON = true;\n\t\t\t\t\tcontext.ANDROID_APPLICATION.push({ key: \"android:icon\", value: \"@drawable/icon\" });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tIconHelper.createIcon(icons, 732, 412, sourceSet + \"/res/drawable-xhdpi/ouya_icon.png\");\n\t\t}\n\n\t\tvar packageDirectory = project.meta.packageName;\n\t\tpackageDirectory = sourceSet + \"/java/\" + packageDirectory.split(\".\").join(\"/\");\n\t\tSystem.mkdir(packageDirectory);\n\n\t\tfor (javaPath in project.javaPaths)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (FileSystem.isDirectory(javaPath))\n\t\t\t\t{\n\t\t\t\t\trecursiveCopy(javaPath, sourceSet + \"/java\", context, true);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (Path.extension(javaPath) == \"jar\")\n\t\t\t\t\t{\n\t\t\t\t\t\tcopyIfNewer(javaPath, destination + \"/app/libs/\" + Path.withoutDirectory(javaPath));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcopyIfNewer(javaPath, sourceSet + \"/java/\" + Path.withoutDirectory(javaPath));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\t//\tthrow\"Could not find javaPath \" + javaPath +\" required by extension.\";\n\n\t\t\t// }\n\t\t}\n\n\t\tfor (library in cast(context.ANDROID_LIBRARY_PROJECTS, Array<Dynamic>))\n\t\t{\n\t\t\trecursiveCopy(library.source, destination + \"/deps/\" + library.name, context, true);\n\t\t}\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"android/template\", destination, context);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"android/MainActivity.java\", packageDirectory + \"/MainActivity.java\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"android/hxml\", targetDirectory + \"/haxe\", context);\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type == AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tvar targetPath = Path.combine(destination, asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\t\tAssetHelper.copyAsset(asset, targetPath, context);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n}\n"
  },
  {
    "path": "tools/platforms/FlashPlatform.hx",
    "content": "package;\n\nimport haxe.Json;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.Path;\nimport hxp.System;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HXProject;\nimport lime.tools.ProjectHelper;\nimport lime.tools.FlashHelper;\nimport lime.tools.HTML5Helper;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformTarget;\nimport sys.io.File;\nimport sys.FileSystem;\n#if neko\n#if haxe4\nimport sys.thread.Thread;\n#else\nimport neko.vm.Thread;\n#end\n#end\nclass FlashPlatform extends PlatformTarget\n{\n\tprivate var embedded:Bool;\n\tprivate var logLength:Int = 0;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"flash.output-directory\", \"flash\"));\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tSystem.runCommand(\"\", \"haxe\", [targetDirectory + \"/haxe/\" + buildType + \".hxml\"]);\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tvar targetPath = targetDirectory + \"\";\n\n\t\tif (FileSystem.exists(targetPath))\n\t\t{\n\t\t\tSystem.removeDirectory(targetPath);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"Flash\");\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(Path.combine(targetDirectory, \"bin/\" + project.app.file + \".swf\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function generateContext():Dynamic\n\t{\n\t\t// project = project.clone ();\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\tproject.haxedefs.set(\"verbose\", 1);\n\t\t}\n\n\t\tvar context = project.templateContext;\n\t\tcontext.WIN_FLASHBACKGROUND = project.window.background != null ? StringTools.hex(project.window.background, 6) : \"0xFFFFFF\";\n\t\tvar assets:Array<Dynamic> = cast context.assets;\n\n\t\tfor (asset in assets)\n\t\t{\n\t\t\tvar assetType:AssetType = Reflect.field(AssetType, asset.type.toUpperCase());\n\n\t\t\tswitch (assetType)\n\t\t\t{\n\t\t\t\tcase MUSIC:\n\t\t\t\t\tasset.flashClass = \"flash.media.Sound\";\n\t\t\t\tcase SOUND:\n\t\t\t\t\tasset.flashClass = \"flash.media.Sound\";\n\t\t\t\tcase IMAGE:\n\t\t\t\t\tasset.flashClass = \"flash.display.BitmapData\";\n\t\t\t\tcase FONT:\n\t\t\t\t\tasset.flashClass = \"flash.text.Font\";\n\t\t\t\tdefault:\n\t\t\t\t\tasset.flashClass = \"flash.utils.ByteArray\";\n\t\t\t}\n\t\t}\n\n\t\treturn context;\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\thxml.swf = \"_.swf\";\n\t\t\thxml.swfVersion = context.SWF_VERSION;\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tif (traceEnabled)\n\t\t{\n\t\t\tFlashHelper.enableLogging();\n\t\t\tlogLength = FlashHelper.getLogLength();\n\t\t}\n\n\t\tif (project.app.url != null && project.app.url != \"\")\n\t\t{\n\t\t\tSystem.openURL(project.app.url);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar destination = targetDirectory + \"/bin\";\n\t\t\tvar targetPath = project.app.file + \".swf\";\n\n\t\t\tif (project.targetFlags.exists(\"web\"))\n\t\t\t{\n\t\t\t\tHTML5Helper.launch(project, targetDirectory + \"/bin\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (traceEnabled)\n\t\t\t\t{\n\t\t\t\t\t#if neko\n\t\t\t\t\tThread.create(function()\n\t\t\t\t\t{\n\t\t\t\t\t#end\n\n\t\t\t\t\t\tFlashHelper.run(project, destination, targetPath);\n\t\t\t\t\t\t// Sys.exit (0);\n\n\t\t\t\t\t#if neko\n\t\t\t\t\t});\n\t\t\t\t\t#end\n\n\t\t\t\t\tSys.sleep(0.1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tFlashHelper.run(project, destination, targetPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function trace():Void\n\t{\n\t\tFlashHelper.enableLogging();\n\t\tFlashHelper.tailLog(logLength);\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\tvar destination = targetDirectory + \"/bin/\";\n\t\tSystem.mkdir(destination);\n\n\t\t// project = project.clone ();\n\n\t\tembedded = FlashHelper.embedAssets(project, targetDirectory);\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"flash/hxml\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"flash/haxe\", targetDirectory + \"/haxe\", context, true, false);\n\n\t\tif (project.targetFlags.exists(\"web\") || project.app.url != \"\")\n\t\t{\n\t\t\tSystem.mkdir(destination);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"flash/templates/web\", destination, generateContext());\n\t\t}\n\n\t\tif (embedded)\n\t\t{\n\t\t\tvar files = [\"debug.hxml\", \"release.hxml\", \"final.hxml\"];\n\t\t\tvar path:String;\n\t\t\tvar hxml:String;\n\t\t\tvar lines:Array<String>;\n\t\t\tvar output:Array<String>;\n\n\t\t\tfor (file in files)\n\t\t\t{\n\t\t\t\tpath = targetDirectory + \"/haxe/\" + file;\n\t\t\t\thxml = File.getContent(path);\n\n\t\t\t\tif (hxml.indexOf(\"-swf-header\") > -1)\n\t\t\t\t{\n\t\t\t\t\tlines = ~/[\\r\\n]+/g.split(hxml);\n\t\t\t\t\toutput = [];\n\n\t\t\t\t\tfor (line in lines)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (line.indexOf(\"-swf-header\") > -1) continue;\n\t\t\t\t\t\toutput.push(line);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (output.length < lines.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tFile.saveContent(path, output.join(\"\\n\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type == AssetType.TEMPLATE || asset.embed == false /*|| !usesLime*/)\n\t\t\t{\n\t\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t}\n\t\t}\n\t}\n\n\t/*private function getIcon (size:Int, targetPath:String):Void {\n\n\t\tvar icon = icons.findIcon (size, size);\n\n\t\tif (icon != \"\") {\n\n\t\t\tSystem.copyIfNewer (icon, targetPath);\n\n\t\t} else {\n\n\t\t\ticons.updateIcon (size, size, targetPath);\n\n\t\t}\n\n\t}*/\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function rebuild():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n"
  },
  {
    "path": "tools/platforms/HTML5Platform.hx",
    "content": "package;\n\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.Path;\nimport hxp.System;\nimport haxe.Template;\n#if lime\nimport lime.text.Font;\n#end\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.ElectronHelper;\nimport lime.tools.HTML5Helper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.ModuleHelper;\nimport lime.tools.Orientation;\nimport lime.tools.ProjectHelper;\nimport lime.tools.PlatformTarget;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass HTML5Platform extends PlatformTarget\n{\n\tprivate var dependencyPath:String;\n\tprivate var npm:Bool;\n\tprivate var outputFile:String;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tdefaults.window.width = 0;\n\t\tdefaults.window.height = 0;\n\t\tdefaults.window.fps = 60;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tinitialize(command, project);\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tif (npm)\n\t\t{\n\t\t\tif (command == \"build\")\n\t\t\t{\n\t\t\t\tvar buildCommand = \"build:\" + (project.targetFlags.exists(\"final\") ? \"prod\" : \"dev\");\n\t\t\t\tSystem.runCommand(targetDirectory + \"/bin\", \"npm\", [\"run\", buildCommand, \"-s\"]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tModuleHelper.buildModules(project, targetDirectory + \"/obj\", targetDirectory + \"/bin\");\n\n\t\tif (project.app.main != null)\n\t\t{\n\t\t\tvar type = \"release\";\n\n\t\t\tif (project.debug)\n\t\t\t{\n\t\t\t\ttype = \"debug\";\n\t\t\t}\n\t\t\telse if (project.targetFlags.exists(\"final\"))\n\t\t\t{\n\t\t\t\ttype = \"final\";\n\t\t\t}\n\n\t\t\tvar hxml = targetDirectory + \"/haxe/\" + type + \".hxml\";\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tHTML5Helper.encodeSourceMappingURL(targetDirectory + \"/bin/\" + project.app.file + \".js\");\n\n\t\t\tif (project.targetFlags.exists(\"webgl\"))\n\t\t\t{\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain.js\", outputFile);\n\t\t\t}\n\n\t\t\tif (project.modules.iterator().hasNext())\n\t\t\t{\n\t\t\t\tModuleHelper.patchFile(outputFile);\n\t\t\t}\n\n\t\t\tif (FileSystem.exists(outputFile))\n\t\t\t{\n\t\t\t\tvar context = project.templateContext;\n\t\t\t\tcontext.SOURCE_FILE = File.getContent(outputFile);\n\t\t\t\tcontext.embeddedLibraries = [];\n\n\t\t\t\tfor (dependency in project.dependencies)\n\t\t\t\t{\n\t\t\t\t\tif (dependency.embed && StringTools.endsWith(dependency.path, \".js\") && FileSystem.exists(dependency.path))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar script = File.getContent(dependency.path);\n\t\t\t\t\t\tif (!dependency.allowWebWorkers)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tscript = 'if(typeof self === \"undefined\" || !self.constructor.name.includes(\"Worker\")) { $script }';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontext.embeddedLibraries.push(script);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tSystem.copyFileTemplate(project.templatePaths, \"html5/output.js\", outputFile, context);\n\t\t\t}\n\n\t\t\tif (project.targetFlags.exists(\"minify\") || type == \"final\")\n\t\t\t{\n\t\t\t\tHTML5Helper.minify(project, targetDirectory + \"/bin/\" + project.app.file + \".js\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tvar name = \"HTML5\";\n\n\t\tif (targetFlags.exists(\"electron\"))\n\t\t{\n\t\t\tname = \"Electron\";\n\t\t}\n\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, name);\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(outputFile);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\thxml.js = \"_\";\n\t\t\thxml.define(\"html\");\n\t\t\tif (targetFlags.exists(\"electron\"))\n\t\t\t{\n\t\t\t\thxml.define(\"electron\");\n\t\t\t}\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tprivate function initialize(command:String, project:HXProject):Void\n\t{\n\t\tif (targetFlags.exists(\"electron\"))\n\t\t{\n\t\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"electron.output-directory\", \"electron\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"html5.output-directory\", \"html5\"));\n\t\t}\n\n\t\tdependencyPath = project.config.getString(\"html5.dependency-path\", \"lib\");\n\t\toutputFile = targetDirectory + \"/bin/\" + project.app.file + \".js\";\n\n\t\ttry\n\t\t{\n\t\t\tif (targetFlags.exists(\"npm\") || (FileSystem.exists(targetDirectory + \"/bin/package.json\") && !targetFlags.exists(\"electron\")))\n\t\t\t{\n\t\t\t\tnpm = true;\n\t\t\t\toutputFile = project.app.file + \".js\";\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tif (npm)\n\t\t{\n\t\t\tvar runCommand = \"start:\" + (project.targetFlags.exists(\"final\") ? \"prod\" : \"dev\");\n\t\t\tSystem.runCommand(targetDirectory + \"/bin\", \"npm\", [\"run\", runCommand, \"-s\"]);\n\t\t}\n\t\telse if (targetFlags.exists(\"electron\"))\n\t\t{\n\t\t\tvar npx = targetFlags.exists(\"npx\");\n\t\t\tElectronHelper.launch(project, targetDirectory + \"/bin\", npx);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tHTML5Helper.launch(project, targetDirectory + \"/bin\");\n\t\t}\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tvar destination = targetDirectory + \"/bin/\";\n\t\tif (npm) destination += \"dist/\";\n\t\tSystem.mkdir(destination);\n\n\t\tvar webfontDirectory = targetDirectory + \"/obj/webfont\";\n\t\tvar useWebfonts = true;\n\n\t\tfor (haxelib in project.haxelibs)\n\t\t{\n\t\t\tif (haxelib.name == \"openfl-html5-dom\" || haxelib.name == \"openfl-bitfive\")\n\t\t\t{\n\t\t\t\tuseWebfonts = false;\n\t\t\t}\n\t\t}\n\n\t\tvar fontPath:String;\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type == AssetType.FONT && asset.targetPath != null)\n\t\t\t{\n\t\t\t\tif (useWebfonts)\n\t\t\t\t{\n\t\t\t\t\tfontPath = Path.combine(webfontDirectory, Path.withoutDirectory(asset.targetPath));\n\n\t\t\t\t\tif (!FileSystem.exists(fontPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.mkdir(webfontDirectory);\n\t\t\t\t\t\tSystem.copyFile(asset.sourcePath, fontPath);\n\n\t\t\t\t\t\tvar originalPath = asset.sourcePath;\n\t\t\t\t\t\tasset.sourcePath = fontPath;\n\n\t\t\t\t\t\tHTML5Helper.generateWebfonts(project, asset);\n\n\t\t\t\t\t\tvar ext = \".\" + Path.extension(asset.sourcePath);\n\t\t\t\t\t\tvar source = Path.withoutExtension(asset.sourcePath);\n\t\t\t\t\t\tvar extensions = [ext, \".eot\", \".woff\", \".svg\"];\n\n\t\t\t\t\t\tfor (extension in extensions)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!FileSystem.exists(source + extension))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (extension != \".eot\" && extension != \".svg\")\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tLog.warn(\"Could not generate *\" + extension + \" web font for \\\"\" + originalPath + \"\\\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tasset.sourcePath = fontPath;\n\t\t\t\t\tasset.targetPath = Path.withoutExtension(asset.targetPath);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// project.haxeflags.push (HTML5Helper.generateFontData (project, asset));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\tproject.haxedefs.set(\"verbose\", 1);\n\t\t}\n\n\t\tModuleHelper.updateProject(project);\n\n\t\tvar libraryNames = new Map<String, Bool>();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.library != null && !libraryNames.exists(asset.library))\n\t\t\t{\n\t\t\t\tlibraryNames[asset.library] = true;\n\t\t\t}\n\t\t}\n\n\t\tif (npm)\n\t\t{\n\t\t\tvar path:String;\n\t\t\tfor (i in 0...project.sources.length)\n\t\t\t{\n\t\t\t\tpath = project.sources[i];\n\t\t\t\tif (StringTools.startsWith(path, targetDirectory) && !FileSystem.exists(Path.directory(path)))\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t}\n\t\t\t\tproject.sources[i] = Path.tryFullPath(path);\n\t\t\t}\n\t\t}\n\n\t\t// for (library in libraryNames.keys ()) {\n\t\t//\n\t\t// project.haxeflags.push (\"-resource \" + targetDirectory + \"/obj/manifest/\" + library + \".json@__ASSET_MANIFEST__\" + library);\n\t\t//\n\t\t// }\n\n\t\t// project.haxeflags.push (\"-resource \" + targetDirectory + \"/obj/manifest/default.json@__ASSET_MANIFEST__default\");\n\n\t\tvar context = project.templateContext;\n\n\t\tcontext.WIN_FLASHBACKGROUND = project.window.background != null ? StringTools.hex(project.window.background, 6) : \"\";\n\t\tcontext.OUTPUT_DIR = npm ? Path.tryFullPath(targetDirectory) : targetDirectory;\n\t\tcontext.OUTPUT_FILE = outputFile;\n\n\t\tif (project.targetFlags.exists(\"webgl\"))\n\t\t{\n\t\t\tcontext.CPP_DIR = targetDirectory + \"/obj\";\n\t\t}\n\n\t\tcontext.favicons = [];\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\t// if (IconHelper.createWindowsIcon (icons, Path.combine (destination, \"favicon.ico\"))) {\n\t\t//\n\t\t// context.favicons.push ({ rel: \"icon\", type: \"image/x-icon\", href: \"./favicon.ico\" });\n\t\t//\n\t\t// }\n\n\t\tif (IconHelper.createIcon(icons, 192, 192, Path.combine(destination, \"favicon.png\")))\n\t\t{\n\t\t\tcontext.favicons.push({rel: \"shortcut icon\", type: \"image/png\", href: \"./favicon.png\"});\n\t\t}\n\n\t\tcontext.linkedLibraries = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (!dependency.embed || npm)\n\t\t\t{\n\t\t\t\tif (StringTools.endsWith(dependency.name, \".js\"))\n\t\t\t\t{\n\t\t\t\t\tcontext.linkedLibraries.push(dependency.name);\n\t\t\t\t}\n\t\t\t\telse if (StringTools.endsWith(dependency.path, \".js\") && FileSystem.exists(dependency.path))\n\t\t\t\t{\n\t\t\t\t\tvar name = Path.withoutDirectory(dependency.path);\n\n\t\t\t\t\tcontext.linkedLibraries.push(\"./\" + dependencyPath + \"/\" + name);\n\t\t\t\t\tcopyIfNewer(dependency.path, Path.combine(destination, Path.combine(dependencyPath, name)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar createdDirectories = new Map<String, Bool>();\n\t\tvar dir:String = null;\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tif (/*asset.embed != true &&*/ asset.type != AssetType.FONT)\n\t\t\t\t{\n\t\t\t\t\tdir = Path.directory(path);\n\t\t\t\t\tif (!createdDirectories.exists(dir))\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.mkdir(dir);\n\t\t\t\t\t\tcreatedDirectories.set(dir, true);\n\t\t\t\t\t}\n\t\t\t\t\tAssetHelper.copyAssetIfNewer(asset, path);\n\t\t\t\t}\n\t\t\t\telse if (asset.type == AssetType.FONT && useWebfonts)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tvar ext = \".\" + Path.extension(asset.sourcePath);\n\t\t\t\t\tvar source = Path.withoutExtension(asset.sourcePath);\n\n\t\t\t\t\tvar hasFormat = [false, false, false, false];\n\t\t\t\t\tvar extensions = [ext, \".eot\", \".svg\", \".woff\"];\n\t\t\t\t\tvar extension:String;\n\n\t\t\t\t\tfor (i in 0...extensions.length)\n\t\t\t\t\t{\n\t\t\t\t\t\textension = extensions[i];\n\n\t\t\t\t\t\tif (FileSystem.exists(source + extension))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.copyIfNewer(source + extension, path + extension);\n\t\t\t\t\t\t\thasFormat[i] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar shouldEmbedFont = false;\n\n\t\t\t\t\tfor (embedded in hasFormat)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (embedded) shouldEmbedFont = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar embeddedAssets:Array<Dynamic> = cast context.assets;\n\t\t\t\t\tfor (embeddedAsset in embeddedAssets)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (embeddedAsset.type == \"font\" && embeddedAsset.sourcePath == asset.sourcePath)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t#if lime\n\t\t\t\t\t\t\tvar font = Font.fromFile(asset.sourcePath);\n\n\t\t\t\t\t\t\tembeddedAsset.ascender = font.ascender;\n\t\t\t\t\t\t\tembeddedAsset.descender = font.descender;\n\t\t\t\t\t\t\tembeddedAsset.height = font.height;\n\t\t\t\t\t\t\tembeddedAsset.numGlyphs = font.numGlyphs;\n\t\t\t\t\t\t\tembeddedAsset.underlinePosition = font.underlinePosition;\n\t\t\t\t\t\t\tembeddedAsset.underlineThickness = font.underlineThickness;\n\t\t\t\t\t\t\tembeddedAsset.unitsPerEM = font.unitsPerEM;\n\n\t\t\t\t\t\t\tif (shouldEmbedFont)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar urls:Array<String> = [];\n\t\t\t\t\t\t\t\tif (hasFormat[1]) urls.push(\"url('\" + embeddedAsset.targetPath + \".eot?#iefix') format('embedded-opentype')\");\n\t\t\t\t\t\t\t\tif (hasFormat[3]) urls.push(\"url('\" + embeddedAsset.targetPath + \".woff') format('woff')\");\n\t\t\t\t\t\t\t\turls.push(\"url('\" + embeddedAsset.targetPath + ext + \"') format('truetype')\");\n\t\t\t\t\t\t\t\tif (hasFormat[2]) urls.push(\"url('\" + embeddedAsset.targetPath + \".svg#\" + StringTools.urlEncode(embeddedAsset.fontName)\n\t\t\t\t\t\t\t\t\t+ \"') format('svg')\");\n\n\t\t\t\t\t\t\t\tvar fontFace = \"\\t\\t@font-face {\\n\";\n\t\t\t\t\t\t\t\tfontFace += \"\\t\\t\\tfont-family: '\" + embeddedAsset.fontName + \"';\\n\";\n\t\t\t\t\t\t\t\t// if (hasFormat[1]) fontFace += \"\\t\\t\\tsrc: url('\" + embeddedAsset.targetPath + \".eot');\\n\";\n\t\t\t\t\t\t\t\tfontFace += \"\\t\\t\\tsrc: \" + urls.join(\",\\n\\t\\t\\t\") + \";\\n\";\n\t\t\t\t\t\t\t\tfontFace += \"\\t\\t\\tfont-weight: normal;\\n\";\n\t\t\t\t\t\t\t\tfontFace += \"\\t\\t\\tfont-style: normal;\\n\";\n\t\t\t\t\t\t\t\tfontFace += \"\\t\\t}\\n\";\n\n\t\t\t\t\t\t\t\tembeddedAsset.cssFontFace = fontFace;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t#end\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"html5/template\", destination, context);\n\n\t\tif (project.app.main != null)\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"html5/haxe\", targetDirectory + \"/haxe\", context, true, false);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"html5/hxml\", targetDirectory + \"/haxe\", context);\n\t\t}\n\n\t\tif (npm)\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"html5/npm\", targetDirectory + \"/bin\", context);\n\t\t\tif (!FileSystem.exists(targetDirectory + \"/bin/node_modules\"))\n\t\t\t{\n\t\t\t\tSystem.runCommand(targetDirectory + \"/bin\", \"npm\", [\"install\", \"-s\"]);\n\t\t\t}\n\t\t}\n\n\t\tif (targetFlags.exists(\"electron\"))\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"electron/template\", destination, context);\n\n\t\t\tif (project.app.main != null)\n\t\t\t{\n\t\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"electron/haxe\", targetDirectory + \"/haxe\", context, true, false);\n\t\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"electron/hxml\", targetDirectory + \"/haxe\", context);\n\t\t\t}\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\tif (asset.type == AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function watch():Void\n\t{\n\t\t// TODO: Use a custom live reload HTTP server for test/run instead\n\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function rebuild():Void {}\n\n\t@ignore public override function trace():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n"
  },
  {
    "path": "tools/platforms/IOSPlatform.hx",
    "content": "package;\n\nimport haxe.Json;\nimport hxp.ArrayTools;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.NDLL;\nimport hxp.Path;\nimport hxp.StringTools;\nimport hxp.System;\n#if lime\nimport lime.graphics.Image;\n#end\nimport lime.tools.Architecture;\nimport lime.tools.Asset;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.ImageHelper;\nimport lime.tools.IOSHelper;\nimport lime.tools.Keystore;\nimport lime.tools.LaunchStoryboard;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass IOSPlatform extends PlatformTarget\n{\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tdefaults.architectures = [Architecture.ARM64];\n\t\tdefaults.window.width = 0;\n\t\tdefaults.window.height = 0;\n\t\tdefaults.window.fullscreen = true;\n\t\tdefaults.window.requireShaders = true;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"ios.output-directory\", \"ios\"));\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tif (project.targetFlags.exists(\"xcode\") && System.hostPlatform == MAC)\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"open\", [targetDirectory + \"/\" + project.app.file + \".xcodeproj\"]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIOSHelper.build(project, targetDirectory);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tif (!project.targetFlags.exists(\"simulator\"))\n\t\t\t{\n\t\t\t\tIOSHelper.sign(project, targetDirectory + \"/bin\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tIOSHelper.deploy(project, targetDirectory);\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(Path.combine(targetDirectory, project.app.file + \".xcodeproj\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function generateContext():Dynamic\n\t{\n\t\t// project = project.clone ();\n\n\t\tproject.sources.unshift(\"\");\n\t\tproject.sources = Path.relocatePaths(project.sources, Path.combine(targetDirectory, project.app.file + \"/haxe\"));\n\t\t// project.dependencies.push (\"stdc++\");\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"final\"))\n\t\t{\n\t\t\tproject.haxedefs.set(\"final\", \"\");\n\t\t}\n\n\t\tif (!project.config.exists(\"ios.identity\"))\n\t\t{\n\t\t\tproject.config.set(\"ios.identity\", \"iPhone Developer\");\n\t\t}\n\n\t\tIOSHelper.getIOSVersion(project);\n\t\tproject.haxedefs.set(\"IPHONE_VER\", project.environment.get(\"IPHONE_VER\"));\n\n\t\tproject.haxedefs.set(\"HXCPP_CPP11\", \"1\");\n\n\t\tif (project.config.getString(\"ios.compiler\") == \"llvm\" || project.config.getString(\"ios.compiler\", \"clang\") == \"clang\")\n\t\t{\n\t\t\tproject.haxedefs.set(\"HXCPP_CLANG\", \"1\");\n\t\t\tproject.haxedefs.set(\"OBJC_ARC\", \"1\");\n\t\t}\n\n\t\tvar context = project.templateContext;\n\n\t\tcontext.HAS_ICON = false;\n\t\tcontext.HAS_LAUNCH_IMAGE = false;\n\t\tcontext.OBJC_ARC = false;\n\t\tcontext.KEY_STORE_IDENTITY = project.config.getString(\"ios.identity\");\n\n\t\tif (project.config.exists(\"ios.provisioning-profile\"))\n\t\t{\n\t\t\tcontext.IOS_PROVISIONING_PROFILE = Path.tryFullPath(project.config.getString(\"ios.provisioning-profile\"));\n\t\t}\n\n\t\tif (project.config.exists(\"ios.team-id\"))\n\t\t{\n\t\t\tcontext.DEVELOPMENT_TEAM_ID = project.config.getString(\"ios.team-id\");\n\t\t}\n\n\t\tcontext.linkedLibraries = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (!StringTools.endsWith(dependency.name, \".framework\")\n\t\t\t\t&& !StringTools.endsWith(dependency.name, \".tbd\")\n\t\t\t\t&& !StringTools.endsWith(dependency.path, \".framework\")\n\t\t\t\t&& !StringTools.endsWith(dependency.path, \".xcframework\"))\n\t\t\t{\n\t\t\t\tif (dependency.path != \"\")\n\t\t\t\t{\n\t\t\t\t\tvar name = Path.withoutDirectory(Path.withoutExtension(dependency.path));\n\n\t\t\t\t\tif (dependency.forceLoad)\n\t\t\t\t\t{\n\t\t\t\t\t\tproject.config.push(\"ios.linker-flags\",\n\t\t\t\t\t\t\t\"-force_load $SRCROOT/$PRODUCT_NAME/lib/$CURRENT_ARCH/\" + Path.withoutDirectory(dependency.path));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (StringTools.startsWith(name, \"lib\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tname = name.substring(3, name.length);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.linkedLibraries.push(name);\n\t\t\t\t}\n\t\t\t\telse if (dependency.name != \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.linkedLibraries.push(dependency.name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar valid_archs = new Array<String>();\n\t\tvar armv6 = false;\n\t\tvar armv7 = false;\n\t\tvar armv7s = false;\n\t\tvar arm64 = false;\n\t\tvar i386 = false;\n\t\tvar architectures = project.architectures;\n\n\t\tif (architectures == null || architectures.length == 0)\n\t\t{\n\t\t\tarchitectures = [Architecture.ARM64];\n\t\t}\n\n\t\tif (project.config.getString(\"ios.device\", \"universal\") == \"universal\" || project.config.getString(\"ios.device\") == \"iphone\")\n\t\t{\n\t\t\tif (project.config.getFloat(\"ios.deployment\", 13) < 5)\n\t\t\t{\n\t\t\t\tArrayTools.addUnique(architectures, Architecture.ARMV6);\n\t\t\t}\n\t\t}\n\n\t\tfor (architecture in project.architectures)\n\t\t{\n\t\t\tswitch (architecture)\n\t\t\t{\n\t\t\t\tcase ARMV6:\n\t\t\t\t\tvalid_archs.push(\"armv6\");\n\t\t\t\t\tarmv6 = true;\n\t\t\t\tcase ARMV7:\n\t\t\t\t\tvalid_archs.push(\"armv7\");\n\t\t\t\t\tarmv7 = true;\n\t\t\t\tcase ARMV7S:\n\t\t\t\t\tvalid_archs.push(\"armv7s\");\n\t\t\t\t\tarmv7s = true;\n\t\t\t\tcase ARM64:\n\t\t\t\t\tvalid_archs.push(\"arm64\");\n\t\t\t\t\tarm64 = true;\n\t\t\t\tcase X86:\n\t\t\t\t\tvalid_archs.push(\"i386\");\n\t\t\t\t\ti386 = true;\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tcontext.CURRENT_ARCHS = \"( \" + valid_archs.join(\",\") + \") \";\n\n\t\tvalid_archs.push(\"x86_64\");\n\n\t\tcontext.VALID_ARCHS = valid_archs.join(\" \");\n\t\tcontext.THUMB_SUPPORT = armv6 ? \"GCC_THUMB_SUPPORT = NO;\" : \"\";\n\n\t\tvar requiredCapabilities:Array<{name:String, value:Bool}> = [];\n\n\t\tif (!armv6 && armv7)\n\t\t{\n\t\t\trequiredCapabilities.push({name: \"armv7\", value: true});\n\t\t}\n\t\telse if (!armv6 && !armv7 && armv7s)\n\t\t{\n\t\t\trequiredCapabilities.push({name: \"armv7s\", value: true});\n\t\t}\n\t\telse if (!armv6 && !armv7 && !armv7s && arm64)\n\t\t{\n\t\t\trequiredCapabilities.push({name: \"arm64\", value: true});\n\t\t}\n\n\t\tcontext.REQUIRED_CAPABILITY = requiredCapabilities;\n\t\tcontext.ARMV6 = armv6;\n\t\tcontext.ARMV7 = armv7;\n\t\tcontext.ARMV7S = armv7s;\n\t\tcontext.ARM64 = arm64;\n\t\tcontext.I386 = i386;\n\t\tcontext.TARGET_DEVICES = switch (project.config.getString(\"ios.device\", \"universal\"))\n\t\t{\n\t\t\tcase \"iphone\": \"1\";\n\t\t\tcase \"ipad\": \"2\";\n\t\t\tdefault: \"1,2\";\n\t\t}\n\t\tcontext.DEPLOYMENT = project.config.getString(\"ios.deployment\", \"13.6\");\n\n\t\tif (project.config.getString(\"ios.compiler\") == \"llvm\" || project.config.getString(\"ios.compiler\", \"clang\") == \"clang\")\n\t\t{\n\t\t\tcontext.OBJC_ARC = true;\n\t\t}\n\n\t\t// context.ENABLE_BITCODE = (project.config.getFloat (\"ios.deployment\", 13) >= 6);\n\t\tcontext.ENABLE_BITCODE = project.config.getBool(\"ios.enable-bitcode\", false);\n\t\tcontext.IOS_COMPILER = project.config.getString(\"ios.compiler\", \"clang\");\n\t\tcontext.CPP_BUILD_LIBRARY = project.config.getString(\"cpp.buildLibrary\", \"hxcpp\");\n\n\t\tcontext.CPP_CACHE_WORKAROUND = \"unset HXCPP_COMPILE_CACHE;\";\n\n\t\tcontext.IOS_LINKER_FLAGS = [\"-stdlib=libc++\"].concat(project.config.getArrayString(\"ios.linker-flags\"));\n\t\tcontext.IOS_NON_EXEMPT_ENCRYPTION = project.config.getBool(\"ios.non-exempt-encryption\", false);\n\n\t\tswitch (project.window.orientation)\n\t\t{\n\t\t\tcase PORTRAIT:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string></array>\";\n\t\t\tcase LANDSCAPE:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string></array>\";\n\t\t\tcase ALL:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string></array>\";\n\t\t\t// case \"allButUpsideDown\":\n\t\t\t// context.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string><string>UIInterfaceOrientationPortrait</string></array>\";\n\t\t\tdefault:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string></array>\";\n\t\t}\n\n\t\tcontext.ADDL_PBX_BUILD_FILE = \"\";\n\t\tcontext.ADDL_PBX_FILE_REFERENCE = \"\";\n\t\tcontext.ADDL_PBX_FRAMEWORKS_BUILD_PHASE = \"\";\n\t\tcontext.ADDL_PBX_FRAMEWORK_GROUP = \"\";\n\n\t\tcontext.frameworkSearchPaths = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tvar name:String = null;\n\t\t\tvar path:String = null;\n\t\t\tvar fileType:String = null;\n\n\t\t\tif (Path.extension(dependency.name) == \"framework\")\n\t\t\t{\n\t\t\t\tname = dependency.name;\n\t\t\t\tpath = \"/System/Library/Frameworks/\" + dependency.name;\n\t\t\t\tfileType = \"wrapper.framework\";\n\t\t\t}\n\t\t\telse if (Path.extension(dependency.name) == \"tbd\")\n\t\t\t{\n\t\t\t\tname = dependency.name;\n\t\t\t\tpath = \"/usr/lib/\" + dependency.name;\n\t\t\t\tfileType = \"sourcecode.text-based-dylib-definition\";\n\t\t\t}\n\t\t\telse if (Path.extension(dependency.path) == \"framework\")\n\t\t\t{\n\t\t\t\tname = Path.withoutDirectory(dependency.path);\n\t\t\t\tpath = Path.tryFullPath(dependency.path);\n\t\t\t\tfileType = \"wrapper.framework\";\n\t\t\t}\n\t\t\telse if (Path.extension(dependency.path) == \"xcframework\")\n\t\t\t{\n\t\t\t\tname = Path.withoutDirectory(dependency.path);\n\t\t\t\tpath = Path.tryFullPath(dependency.path);\n\t\t\t\tfileType = \"wrapper.xcframework\";\n\t\t\t}\n\n\t\t\tif (name != null)\n\t\t\t{\n\t\t\t\tvar frameworkID = \"11C0000000000018\" + StringTools.getUniqueID();\n\t\t\t\tvar fileID = \"11C0000000000018\" + StringTools.getUniqueID();\n\n\t\t\t\tArrayTools.addUnique(context.frameworkSearchPaths, Path.directory(path));\n\n\t\t\t\tcontext.ADDL_PBX_BUILD_FILE += \"\t\t\" + frameworkID + \" /* \" + name + \" in Frameworks */ = {isa = PBXBuildFile; fileRef = \" + fileID + \" /* \"\n\t\t\t\t\t+ name + \" */; };\\n\";\n\t\t\t\tcontext.ADDL_PBX_FILE_REFERENCE += \"\t\t\" + fileID + \" /* \" + name + \" */ = {isa = PBXFileReference; lastKnownFileType = \\\"\" + fileType\n\t\t\t\t\t+ \"\\\"; name = \\\"\" + name + \"\\\"; path = \\\"\" + path + \"\\\"; sourceTree = SDKROOT; };\\n\";\n\t\t\t\tcontext.ADDL_PBX_FRAMEWORKS_BUILD_PHASE += \"\t\t\t\t\" + frameworkID + \" /* \" + name + \" in Frameworks */,\\n\";\n\t\t\t\tcontext.ADDL_PBX_FRAMEWORK_GROUP += \"\t\t\t\t\" + fileID + \" /* \" + name + \" */,\\n\";\n\t\t\t}\n\t\t}\n\n\t\tcontext.HXML_PATH = System.findTemplate(project.templatePaths, \"iphone/PROJ/haxe/Build.hxml\", false);\n\t\tif (context.HXML_PATH == null) context.HXML_PATH = System.findTemplate(project.templatePaths, \"ios/template/{{app.file}}/haxe/Build.hxml\");\n\t\tcontext.PRERENDERED_ICON = project.config.getBool(\"ios.prerenderedIcon\", false);\n\n\t\tvar allowInsecureHTTP = project.config.getString(\"ios.allow-insecure-http\", \"*\");\n\n\t\tif (allowInsecureHTTP != \"*\" && allowInsecureHTTP != \"true\")\n\t\t{\n\t\t\tvar sites:Array<{domain: String}> = [];\n\n\t\t\tif (allowInsecureHTTP != \"false\")\n\t\t\t{\n\t\t\t\tvar domains = project.config.getArrayString(\"ios.allow-insecure-http\");\n\n\t\t\t\tfor (domain in domains)\n\t\t\t\t{\n\t\t\t\t\tsites.push({domain: domain});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontext.IOS_ALLOW_INSECURE_HTTP = sites;\n\t\t}\n\n\t\tvar haxelibPath = project.environment.get(\"HAXELIB_PATH\");\n\n\t\tif (haxelibPath != null)\n\t\t{\n\t\t\tcontext.HAXELIB_PATH = 'export HAXELIB_PATH=\"$haxelibPath\";';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcontext.HAXELIB_PATH = '';\n\t\t}\n\n\t\treturn context;\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/\" + project.app.file + \"/haxe/Build.hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\thxml.cpp = \"_\";\n\t\t\thxml.define(\"iphone\");\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tvar armv6 = (project.architectures.indexOf(Architecture.ARMV6) > -1 && !project.targetFlags.exists(\"simulator\"));\n\t\tvar armv7 = (project.architectures.indexOf(Architecture.ARMV7) > -1 && !project.targetFlags.exists(\"simulator\"));\n\t\tvar armv7s = (project.architectures.indexOf(Architecture.ARMV7S) > -1 && !project.targetFlags.exists(\"simulator\"));\n\t\tvar arm64 = (command == \"rebuild\"\n\t\t\t|| (project.architectures.indexOf(Architecture.ARM64) > -1 && !project.targetFlags.exists(\"simulator\")));\n\t\tvar i386 = (project.architectures.indexOf(Architecture.X86) > -1 && project.targetFlags.exists(\"simulator\"));\n\t\tvar x86_64 = (command == \"rebuild\" || project.targetFlags.exists(\"simulator\"));\n\n\t\tvar arc = (project.targetFlags.exists(\"arc\"));\n\n\t\tvar commands:Array<Array<String>> = [];\n\n\t\tif (armv6) commands.push([\"-Dios\", \"-DHXCPP_CPP11\", \"-DHXCPP_ARMV6\"]);\n\t\tif (armv7) commands.push([\"-Dios\", \"-DHXCPP_CPP11\", \"-DHXCPP_ARMV7\"]);\n\t\tif (armv7s) commands.push([\"-Dios\", \"-DHXCPP_CPP11\", \"-DHXCPP_ARMV7S\"]);\n\t\tif (arm64) commands.push([\"-Dios\", \"-DHXCPP_CPP11\", \"-DHXCPP_ARM64\"]);\n\t\tif (i386) commands.push([\"-Dios\", \"-Dsimulator\", \"-DHXCPP_M32\", \"-DHXCPP_CPP11\"]);\n\t\tif (x86_64) commands.push([\"-Dios\", \"-Dsimulator\", \"-DHXCPP_M64\", \"-DHXCPP_CPP11\"]);\n\n\t\tif (arc)\n\t\t{\n\t\t\tfor (command in commands)\n\t\t\t{\n\t\t\t\tcommand.push(\"-DOBJC_ARC\");\n\t\t\t}\n\t\t}\n\n\t\tIOSHelper.getIOSVersion(project);\n\t\tvar iphoneVer = project.environment.get(\"IPHONE_VER\");\n\n\t\tfor (command in commands)\n\t\t{\n\t\t\tcommand.push(\"-DIPHONE_VER=\" + iphoneVer);\n\t\t}\n\n\t\tCPPHelper.rebuild(project, commands);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tif (project.targetFlags.exists(\"xcode\")) return;\n\n\t\tIOSHelper.launch(project, targetDirectory);\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/\" + project.app.file + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\t// var manifest = new Asset ();\n\t\t// manifest.id = \"__manifest__\";\n\t\t// manifest.data = AssetHelper.createManifest (project).serialize ();\n\t\t// manifest.resourceName = manifest.flatName = manifest.targetPath = \"manifest\";\n\t\t// manifest.type = AssetType.TEXT;\n\t\t// project.assets.push (manifest);\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tvar projectDirectory = targetDirectory + \"/\" + project.app.file + \"/\";\n\n\t\tSystem.mkdir(targetDirectory);\n\t\tSystem.mkdir(projectDirectory);\n\t\tSystem.mkdir(projectDirectory + \"/haxe\");\n\t\tSystem.mkdir(projectDirectory + \"/haxe/lime/installer\");\n\n\t\tvar iconSizes:Array<IconSize> = [\n\t\t\t{name: \"Icon-20.png\", size: 20},\n\t\t\t{name: \"Icon-Small.png\", size: 29},\n\t\t\t{name: \"Icon-Small-40.png\", size: 40},\n\t\t\t{name: \"Icon-20@2x.png\", size: 40},\n\t\t\t{name: \"Icon-Small-50.png\", size: 50},\n\t\t\t{name: \"Icon.png\", size: 57},\n\t\t\t{name: \"Icon-Small@2x.png\", size: 58},\n\t\t\t{name: \"Icon-20@3x.png\", size: 60},\n\t\t\t{name: \"Icon-72.png\", size: 72},\n\t\t\t{name: \"Icon-76.png\", size: 76},\n\t\t\t{name: \"Icon-Small-40@2x.png\", size: 80},\n\t\t\t{name: \"Icon-Small@3x.png\", size: 87},\n\t\t\t{name: \"Icon-Small-50@2x.png\", size: 100},\n\t\t\t{name: \"Icon@2x.png\", size: 114},\n\t\t\t{name: \"Icon-60@2x.png\", size: 120},\n\t\t\t{name: \"Icon-Small-40@3x.png\", size: 120},\n\t\t\t{name: \"Icon-72@2x.png\", size: 144},\n\t\t\t{name: \"Icon-76@2x.png\", size: 152},\n\t\t\t{name: \"Icon-83.5@2x.png\", size: 167},\n\t\t\t{name: \"Icon-60@3x.png\", size: 180},\n\t\t\t{name: \"Icon-Marketing.png\", size: 1024}\n\t\t];\n\n\t\tcontext.HAS_ICON = true;\n\n\t\tvar iconPath = Path.combine(projectDirectory, \"Images.xcassets/AppIcon.appiconset\");\n\t\tSystem.mkdir(iconPath);\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\tfor (iconSize in iconSizes)\n\t\t{\n\t\t\tif (!IconHelper.createIcon(icons, iconSize.size, iconSize.size, Path.combine(iconPath, iconSize.name)))\n\t\t\t{\n\t\t\t\tcontext.HAS_ICON = false;\n\t\t\t}\n\t\t}\n\n\t\tif (project.launchStoryboard != null)\n\t\t{\n\t\t\tvar sb = project.launchStoryboard;\n\n\t\t\tvar assetsPath = sb.assetsPath;\n\t\t\tvar imagesets:Array<ImageSet> = [];\n\n\t\t\tfor (asset in sb.assets)\n\t\t\t{\n\t\t\t\tswitch (asset.type)\n\t\t\t\t{\n\t\t\t\t\tcase \"imageset\":\n\t\t\t\t\t\tvar imageset = cast(asset, ImageSet);\n\t\t\t\t\t\timagesets.push(imageset);\n\n\t\t\t\t\t\tvar imagesetPath = Path.combine(projectDirectory, \"Images.xcassets/\" + imageset.name + \".imageset\");\n\t\t\t\t\t\tSystem.mkdir(imagesetPath);\n\n\t\t\t\t\t\tvar baseImageName = Path.withoutExtension(imageset.name);\n\n\t\t\t\t\t\tvar imageScales = [\"1x\", \"2x\", \"3x\"];\n\t\t\t\t\t\tvar images:Array<{idiom:String, filename:String, scale:String}> = [];\n\t\t\t\t\t\tfor (scale in imageScales)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar filename = baseImageName + (scale == \"1x\" ? \"\" : \"@\" + scale) + \".png\";\n\t\t\t\t\t\t\tif (FileSystem.exists(Path.combine(assetsPath, filename)))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\timages.push({idiom: \"universal\", filename: filename, scale: scale});\n\t\t\t\t\t\t\t\tSystem.copyFile(Path.combine(assetsPath, filename), Path.combine(imagesetPath, filename));\n\n\t\t\t\t\t\t\t\tif (imageset.width == 0 || imageset.height == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tvar dim = ImageHelper.readPNGImageSize(Path.combine(assetsPath, filename));\n\t\t\t\t\t\t\t\t\tvar scaleValue = Std.parseInt(scale.charAt(0));\n\t\t\t\t\t\t\t\t\timageset.width = Std.int(dim.width / scaleValue);\n\t\t\t\t\t\t\t\t\timageset.height = Std.int(dim.height / scaleValue);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar contents =\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\timages: images,\n\t\t\t\t\t\t\t\tinfo:\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tversion: \"1\",\n\t\t\t\t\t\t\t\t\t\tauthor: \"xcode\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\tFile.saveContent(Path.combine(imagesetPath, \"Contents.json\"), Json.stringify(contents));\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sb.template != null)\n\t\t\t{\n\t\t\t\tsb.templateContext.imagesets = [];\n\n\t\t\t\tfor (imageset in imagesets)\n\t\t\t\t{\n\t\t\t\t\tsb.templateContext.imagesets.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: imageset.name,\n\t\t\t\t\t\t\twidth: imageset.width,\n\t\t\t\t\t\t\theight: imageset.height,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tvar deployment:String = context.DEPLOYMENT;\n\t\t\t\tvar parts = deployment.split(\".\");\n\t\t\t\tvar major = Std.parseInt(parts[0]);\n\t\t\t\tvar minor = parts.length >= 2 ? Std.parseInt(parts[1]) : 0;\n\t\t\t\tvar patch = parts.length >= 3 ? Std.parseInt(parts[2]) : 0;\n\n\t\t\t\tReflect.setField(sb.templateContext, \"deploymentVersion\",\n\t\t\t\t\t{\n\t\t\t\t\t\tmajor: major,\n\t\t\t\t\t\tminor: minor,\n\t\t\t\t\t\tpatch: patch,\n\t\t\t\t\t\tcode: Std.parseInt(\"0x\" + major + minor + patch)\n\t\t\t\t\t});\n\n\t\t\t\tSystem.copyFileTemplate(project.templatePaths, \"ios/storyboards/\" + sb.template, projectDirectory + sb.template, sb.templateContext, true,\n\t\t\t\t\ttrue);\n\t\t\t\tcontext.IOS_LAUNCH_STORYBOARD = Path.withoutExtension(sb.template);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.copyFile(sb.path, projectDirectory + Path.withoutDirectory(sb.path));\n\t\t\t\tcontext.IOS_LAUNCH_STORYBOARD = Path.withoutDirectory(Path.withoutExtension(sb.path));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar splashSizes:Array<SplashSize> = [\n\t\t\t\t{name: \"Default.png\", w: 320, h: 480}, // iPhone, portrait\n\t\t\t\t{name: \"Default@2x.png\", w: 640, h: 960}, // iPhone Retina, portrait\n\t\t\t\t{name: \"Default-568h@2x.png\", w: 640, h: 1136}, // iPhone 5, portrait\n\t\t\t\t{name: \"Default-667h@2x.png\", w: 750, h: 1334}, // iPhone 6, portrait\n\t\t\t\t{name: \"Default-736h@3x.png\", w: 1242, h: 2208}, // iPhone 6 Plus, portrait\n\t\t\t\t{name: \"Default-Landscape.png\", w: 1024, h: 768}, // iPad, landscape\n\t\t\t\t{name: \"Default-Landscape@2x.png\", w: 2048, h: 1536}, // iPad Retina, landscape\n\t\t\t\t{name: \"Default-736h-Landscape@3x.png\", w: 2208, h: 1242}, // iPhone 6 Plus, landscape\n\t\t\t\t{name: \"Default-Portrait.png\", w: 768, h: 1024}, // iPad, portrait\n\t\t\t\t{name: \"Default-Portrait@2x.png\", w: 1536, h: 2048}, // iPad Retina, portrait\n\t\t\t\t{name: \"Default-812h@3x.png\", w: 1125, h: 2436}, // iPhone X, portrait\n\t\t\t\t{name: \"Default-Landscape-812h@3x.png\", w: 2436, h: 1125} // iPhone X, landscape\n\t\t\t];\n\n\t\t\tvar splashScreenPath = Path.combine(projectDirectory, \"Images.xcassets/LaunchImage.launchimage\");\n\t\t\tSystem.mkdir(splashScreenPath);\n\n\t\t\tfor (size in splashSizes)\n\t\t\t{\n\t\t\t\tvar match = false;\n\n\t\t\t\tfor (splashScreen in project.splashScreens)\n\t\t\t\t{\n\t\t\t\t\tif (splashScreen.width == size.w && splashScreen.height == size.h && Path.extension(splashScreen.path) == \"png\")\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.copyFile(splashScreen.path, Path.combine(splashScreenPath, size.name));\n\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!match)\n\t\t\t\t{\n\t\t\t\t\tvar imagePath = Path.combine(splashScreenPath, size.name);\n\n\t\t\t\t\tif (!FileSystem.exists(imagePath))\n\t\t\t\t\t{\n\t\t\t\t\t\t#if (lime && lime_cffi && !macro)\n\t\t\t\t\t\tLog.info(\"\", \" - \\x1b[1mGenerating image:\\x1b[0m \" + imagePath);\n\n\t\t\t\t\t\tvar background = project.window.background != null ? project.window.background & 0xFFFFFF : 0x000000;\n\t\t\t\t\t\tvar image = new Image(null, 0, 0, size.w, size.h, (0xFF << 24) | background);\n\t\t\t\t\t\tvar bytes = image.encode(PNG);\n\n\t\t\t\t\t\tFile.saveBytes(imagePath, bytes);\n\t\t\t\t\t\t#end\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontext.HAS_LAUNCH_IMAGE = true;\n\t\t}\n\n\t\tSystem.mkdir(projectDirectory + \"/resources\");\n\t\tSystem.mkdir(projectDirectory + \"/haxe/build\");\n\n\t\t// Long deprecated template path\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"iphone/resources\", projectDirectory + \"/resources\", context, true, false);\n\n\t\t// New template path\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"ios/template\", targetDirectory, context);\n\n\t\t// Recently deprecated template paths\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"iphone/PROJ/haxe\", projectDirectory + \"/haxe\", context, true, false);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", projectDirectory + \"/haxe\", context, true, false);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"iphone/PROJ/Classes\", projectDirectory + \"/Classes\", context, true, false);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"iphone/PROJ/Images.xcassets\", projectDirectory + \"/Images.xcassets\", context, true, false);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"iphone/PROJ/PROJ-Info.plist\", projectDirectory + \"/\" + project.app.file + \"-Info.plist\", context,\n\t\t\ttrue, false);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"iphone/PROJ/PROJ-Prefix.pch\", projectDirectory + \"/\" + project.app.file + \"-Prefix.pch\", context,\n\t\t\ttrue, false);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"iphone/PROJ.xcodeproj\", targetDirectory + \"/\" + project.app.file + \".xcodeproj\", context, true,\n\t\t\tfalse);\n\n\t\t// Merge plist files\n\t\tvar plistFiles = System.readDirectory(projectDirectory).filter(function(fileName:String)\n\t\t{\n\t\t\treturn fileName.substr(-11) == \"-Info.plist\" && fileName != projectDirectory + \"/\" + project.app.file + \"-Info.plist\";\n\t\t});\n\t\tfor (plist in plistFiles)\n\t\t{\n\t\t\tSystem.runCommand(project.workingDirectory, \"/usr/libexec/PlistBuddy\", [\n\t\t\t\t\"-x\",\n\t\t\t\t\"-c\",\n\t\t\t\t\"Merge '\" + plist + \"'\",\n\t\t\t\tprojectDirectory + \"/\" + project.app.file + \"-Info.plist\"\n\t\t\t]);\n\t\t}\n\n\t\tSystem.mkdir(projectDirectory + \"/lib\");\n\n\t\tfor (archID in 0...6)\n\t\t{\n\t\t\tvar arch = [\"armv6\", \"armv7\", \"armv7s\", \"arm64\", \"i386\", \"x86_64\"][archID];\n\n\t\t\tif (arch == \"armv6\" && !context.ARMV6) continue;\n\n\t\t\tif (arch == \"armv7\" && !context.ARMV7) continue;\n\n\t\t\tif (arch == \"armv7s\" && !context.ARMV7S) continue;\n\n\t\t\tif (arch == \"arm64\" && !context.ARM64) continue;\n\n\t\t\tif (arch == \"i386\" && !context.I386) continue;\n\n\t\t\tvar libExt = [\n\t\t\t\t\".iphoneos.a\",\n\t\t\t\t\".iphoneos-v7.a\",\n\t\t\t\t\".iphoneos-v7s.a\",\n\t\t\t\t\".iphoneos-64.a\",\n\t\t\t\t\".iphonesim.a\",\n\t\t\t\t\".iphonesim-64.a\"\n\t\t\t][archID];\n\n\t\t\tSystem.mkdir(projectDirectory + \"/lib/\" + arch);\n\t\t\tSystem.mkdir(projectDirectory + \"/lib/\" + arch + \"-debug\");\n\n\t\t\tfor (ndll in project.ndlls)\n\t\t\t{\n\t\t\t\t// if (ndll.haxelib != null) {\n\n\t\t\t\tvar releaseLib = NDLL.getLibraryPath(ndll, \"iPhone\", \"lib\", libExt);\n\t\t\t\tvar debugLib = NDLL.getLibraryPath(ndll, \"iPhone\", \"lib\", libExt, true);\n\t\t\t\tvar releaseDest = projectDirectory + \"/lib/\" + arch + \"/lib\" + ndll.name + \".a\";\n\t\t\t\tvar debugDest = projectDirectory + \"/lib/\" + arch + \"-debug/lib\" + ndll.name + \".a\";\n\n\t\t\t\tif (!FileSystem.exists(releaseLib))\n\t\t\t\t{\n\t\t\t\t\treleaseLib = NDLL.getLibraryPath(ndll, \"iPhone\", \"lib\", \".iphoneos.a\");\n\t\t\t\t\tdebugLib = NDLL.getLibraryPath(ndll, \"iPhone\", \"lib\", \".iphoneos.a\", true);\n\t\t\t\t}\n\n\t\t\t\tSystem.copyIfNewer(releaseLib, releaseDest);\n\n\t\t\t\tif (FileSystem.exists(debugLib) && debugLib != releaseLib)\n\t\t\t\t{\n\t\t\t\t\tSystem.copyIfNewer(debugLib, debugDest);\n\t\t\t\t}\n\t\t\t\telse if (FileSystem.exists(debugDest))\n\t\t\t\t{\n\t\t\t\t\tFileSystem.deleteFile(debugDest);\n\t\t\t\t}\n\n\t\t\t\t// }\n\t\t\t}\n\n\t\t\tfor (dependency in project.dependencies)\n\t\t\t{\n\t\t\t\tif (StringTools.endsWith(dependency.path, \".a\"))\n\t\t\t\t{\n\t\t\t\t\tvar fileName = Path.withoutDirectory(dependency.path);\n\n\t\t\t\t\tif (!StringTools.startsWith(fileName, \"lib\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tfileName = \"lib\" + fileName;\n\t\t\t\t\t}\n\n\t\t\t\t\tcopyIfNewer(dependency.path, projectDirectory + \"/lib/\" + arch + \"/\" + fileName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSystem.mkdir(projectDirectory + \"/assets\");\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tvar targetPath = Path.combine(projectDirectory + \"/assets/\", asset.resourceName);\n\n\t\t\t\t// var sourceAssetPath:String = projectDirectory + \"haxe/\" + asset.sourcePath;\n\n\t\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\t\tAssetHelper.copyAssetIfNewer(asset, targetPath);\n\n\t\t\t\t// System.mkdir (Path.directory (sourceAssetPath));\n\t\t\t\t// System.linkFile (flatAssetPath, sourceAssetPath, true, true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar targetPath = Path.combine(projectDirectory, asset.targetPath);\n\n\t\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\t\tAssetHelper.copyAsset(asset, targetPath, context);\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xcode\") && System.hostPlatform == MAC && command == \"update\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"open\", [targetDirectory + \"/\" + project.app.file + \".xcodeproj\"]);\n\t\t}\n\t}\n\n\t/*private function updateLaunchImage () {\n\n\t\tvar destination = buildDirectory + \"/ios\";\n\t\tSystem.mkdir (destination);\n\n\t\tvar has_launch_image = false;\n\t\tif (launchImages.length > 0) has_launch_image = true;\n\n\t\tfor (launchImage in launchImages) {\n\n\t\t\tvar splitPath = launchImage.name.split (\"/\");\n\t\t\tvar path = destination + \"/\" + splitPath[splitPath.length - 1];\n\t\t\tSystem.copyFile (launchImage.name, path, context, false);\n\n\t\t}\n\n\t\tcontext.HAS_LAUNCH_IMAGE = has_launch_image;\n\n\t}*/\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function trace():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n\nprivate typedef IconSize =\n{\n\tname:String,\n\tsize:Int,\n}\n\nprivate typedef SplashSize =\n{\n\tname:String,\n\tw:Int,\n\th:Int,\n}\n"
  },
  {
    "path": "tools/platforms/LinuxPlatform.hx",
    "content": "package;\n\nimport lime.tools.HashlinkHelper;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Path;\nimport hxp.Log;\nimport hxp.NDLL;\nimport hxp.System;\nimport lime.tools.Architecture;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HXProject;\nimport lime.tools.JavaHelper;\nimport lime.tools.NekoHelper;\nimport lime.tools.NodeJSHelper;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass LinuxPlatform extends PlatformTarget\n{\n\tprivate var applicationDirectory:String;\n\tprivate var executablePath:String;\n\tprivate var is64:Bool;\n\tprivate var isRaspberryPi:Bool;\n\tprivate var targetType:String;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tswitch (System.hostArchitecture)\n\t\t{\n\t\t\tcase ARMV6:\n\t\t\t\tdefaults.architectures = [ARMV6];\n\t\t\tcase ARMV7:\n\t\t\t\tdefaults.architectures = [ARMV7];\n\t\t\tcase ARM64:\n\t\t\t\tdefaults.architectures = [ARM64];\n\t\t\tcase X86:\n\t\t\t\tdefaults.architectures = [X86];\n\t\t\tcase X64:\n\t\t\t\tdefaults.architectures = [X64];\n\t\t\tdefault:\n\t\t\t\tdefaults.architectures = [];\n\t\t}\n\n\t\tdefaults.window.allowHighDPI = false;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\tfor (architecture in project.architectures)\n\t\t{\n\t\t\tif (!targetFlags.exists(\"32\") && !targetFlags.exists(\"x86_32\") && (architecture == Architecture.X64 || architecture == Architecture.ARM64))\n\t\t\t{\n\t\t\t\tis64 = true;\n\t\t\t}\n\t\t\telse if (architecture == Architecture.ARMV7)\n\t\t\t{\n\t\t\t\tis64 = false;\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"neko\"))\n\t\t{\n\t\t\ttargetType = \"neko\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"hl\") || targetFlags.exists(\"hlc\"))\n\t\t{\n\t\t\ttargetType = \"hl\";\n\t\t\tis64 = true;\n\t\t\tvar hlVer = project.haxedefs.get(\"hl-ver\");\n\t\t\tif (hlVer == null)\n\t\t\t{\n\t\t\t\tvar hlPath = project.defines.get(\"HL_PATH\");\n\t\t\t\tif (hlPath == null)\n\t\t\t\t{\n\t\t\t\t\t// Haxe's default target version for HashLink may be\n\t\t\t\t\t// different (newer even) than the build of HashLink that\n\t\t\t\t\t// is bundled with Lime. if using Lime's bundled HashLink,\n\t\t\t\t\t// set hl-ver to the correct version\n\t\t\t\t\tproject.haxedefs.set(\"hl-ver\", HashlinkHelper.BUNDLED_HL_VER);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (project.targetFlags.exists(\"nodejs\"))\n\t\t{\n\t\t\ttargetType = \"nodejs\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"java\"))\n\t\t{\n\t\t\ttargetType = \"java\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetType = \"cpp\";\n\t\t}\n\n\t\tvar defaultTargetDirectory = switch (targetType)\n\t\t{\n\t\t\tcase \"cpp\": \"linux\";\n\t\t\tcase \"hl\": project.targetFlags.exists(\"hlc\") ? \"hlc\" : targetType;\n\t\t\tdefault: targetType;\n\t\t}\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"linux.output-directory\", defaultTargetDirectory));\n\t\ttargetDirectory = StringTools.replace(targetDirectory, \"arch64\", is64 ? \"64\" : \"\");\n\t\tapplicationDirectory = targetDirectory + \"/bin/\";\n\t\texecutablePath = Path.combine(applicationDirectory, project.app.file);\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tvar hxml = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\tSystem.mkdir(targetDirectory);\n\n\t\tif (!project.targetFlags.exists(\"static\") || targetType != \"cpp\")\n\t\t{\n\t\t\tvar targetSuffix = (targetType == \"hl\") ? \".hdll\" : null;\n\n\t\t\tfor (ndll in project.ndlls)\n\t\t\t{\n\t\t\t\t// TODO: Support single binary for HashLink\n\t\t\t\tif (targetType == \"hl\")\n\t\t\t\t{\n\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Linux\" + (is64 ? \"64\" : \"\"), \"\", \".hdll\", applicationDirectory, project.debug, targetSuffix);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Linux\" + (( System.hostArchitecture == ARMV7 || System.hostArchitecture == ARM64)?\"Arm\":\"\") + (is64 ? \"64\" : \"\"), \"\",\n\t\t\t\t\t\t(ndll.haxelib != null\n\t\t\t\t\t\t\t&& (ndll.haxelib.name == \"hxcpp\" || ndll.haxelib.name == \"hxlibc\")) ? \".dll\" : \".ndll\", applicationDirectory,\n\t\t\t\t\t\tproject.debug, targetSuffix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (targetType == \"neko\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tNekoHelper.createExecutable(project.templatePaths, \"linux\" + (( System.hostArchitecture == ARMV7 || System.hostArchitecture == ARM64)?\"Arm\":\"\") + (is64 ? \"64\" : \"\"), targetDirectory + \"/obj/ApplicationMain.n\", executablePath);\n\t\t\tNekoHelper.copyLibraries(project.templatePaths, \"linux\" + (is64 ? \"64\" : \"\"), applicationDirectory);\n\n\t\t}\n\t\telse if (targetType == \"hl\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tHashlinkHelper.copyHashlink(project, targetDirectory, applicationDirectory, executablePath, is64);\n\n\t\t\tif (project.targetFlags.exists(\"hlc\"))\n\t\t\t{\n\t\t\t\tvar compiler = project.targetFlags.exists(\"clang\") ? \"clang\" : \"gcc\";\n\t\t\t\tvar command = [compiler, \"-O3\", \"-o\", executablePath, \"-std=c11\", \"-Wl,-rpath,$ORIGIN\", \"-I\", Path.combine(targetDirectory, \"obj\"), Path.combine(targetDirectory, \"obj/ApplicationMain.c\"), \"-L\", applicationDirectory];\n\t\t\t\tfor (file in System.readDirectory(applicationDirectory))\n\t\t\t\t{\n\t\t\t\t\tswitch Path.extension(file)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"so\", \"hdll\":\n\t\t\t\t\t\t\t// ensure the executable knows about every library\n\t\t\t\t\t\t\tcommand.push(\"-l:\" + Path.withoutDirectory(file));\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcommand.push(\"-lm\");\n\t\t\t\tSystem.runCommand(\"\", command.shift(), command);\n\t\t\t}\n\t\t}\n\t\telse if (targetType == \"nodejs\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\t\t\t// NekoHelper.createExecutable (project.templatePaths, \"linux\" + (is64 ? \"64\" : \"\"), targetDirectory + \"/obj/ApplicationMain.n\", executablePath);\n\t\t\t// NekoHelper.copyLibraries (project.templatePaths, \"linux\" + (is64 ? \"64\" : \"\"), applicationDirectory);\n\t\t}\n\t\telse if (targetType == \"java\")\n\t\t{\n\t\t\tvar libPath = Path.combine(Haxelib.getPath(new Haxelib(\"lime\")), \"templates/java/lib/\");\n\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml, \"-java-lib\", libPath + \"disruptor.jar\", \"-java-lib\", libPath + \"lwjgl.jar\"]);\n\t\t\t// System.runCommand (\"\", \"haxe\", [ hxml ]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tvar haxeVersion = project.environment.get(\"haxe_ver\");\n\t\t\tvar haxeVersionString = \"3404\";\n\n\t\t\tif (haxeVersion.length > 4)\n\t\t\t{\n\t\t\t\thaxeVersionString = haxeVersion.charAt(0)\n\t\t\t\t\t+ haxeVersion.charAt(2)\n\t\t\t\t\t+ (haxeVersion.length == 5 ? \"0\" + haxeVersion.charAt(4) : haxeVersion.charAt(4) + haxeVersion.charAt(5));\n\t\t\t}\n\n\t\t\tSystem.runCommand(targetDirectory + \"/obj\", \"haxelib\", [\"run\", \"hxjava\", \"hxjava_build.txt\", \"--haxe-version\", haxeVersionString]);\n\t\t\tSystem.recursiveCopy(targetDirectory + \"/obj/lib\", Path.combine(applicationDirectory, \"lib\"));\n\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-Debug\" : \"\") + \".jar\",\n\t\t\t\tPath.combine(applicationDirectory, project.app.file + \".jar\"));\n\t\t\tJavaHelper.copyLibraries(project.templatePaths, \"Linux\" + (is64 ? \"64\" : \"\"), applicationDirectory);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar haxeArgs:Array<String> = [hxml];\n\t\t\tvar flags:Array<String> = [];\n\n\t\t\tif (is64)\n\t\t\t{\n\t\t\t\tif (System.hostArchitecture == ARM64)\n\t\t\t\t{\n\t\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\t\thaxeArgs.push(\"HXCPP_ARM64\");\n\t\t\t\t\tflags.push(\"-DHXCPP_ARM64\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\t\thaxeArgs.push(\"HXCPP_M64\");\n\t\t\t\t\tflags.push(\"-DHXCPP_M64\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\thaxeArgs.push(\"HXCPP_M32\");\n\t\t\t\tflags.push(\"-DHXCPP_M32\");\n\t\t\t}\n\n\t\t\tif (project.target != System.hostPlatform)\n\t\t\t{\n\t\t\t\tvar hxcpp_xlinux64_cxx = project.defines.get(\"HXCPP_XLINUX64_CXX\");\n\t\t\t\tif (hxcpp_xlinux64_cxx == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux64_cxx = \"x86_64-unknown-linux-gnu-g++\";\n\t\t\t\t}\n\t\t\t\tvar hxcpp_xlinux64_strip = project.defines.get(\"HXCPP_XLINUX64_STRIP\");\n\t\t\t\tif (hxcpp_xlinux64_strip == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux64_strip = \"x86_64-unknown-linux-gnu-strip\";\n\t\t\t\t}\n\t\t\t\tvar hxcpp_xlinux64_ranlib = project.defines.get(\"HXCPP_XLINUX64_RANLIB\");\n\t\t\t\tif (hxcpp_xlinux64_ranlib == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux64_ranlib = \"x86_64-unknown-linux-gnu-ranlib\";\n\t\t\t\t}\n\t\t\t\tvar hxcpp_xlinux64_ar = project.defines.get(\"HXCPP_XLINUX64_AR\");\n\t\t\t\tif (hxcpp_xlinux64_ar == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux64_ar = \"x86_64-unknown-linux-gnu-ar\";\n\t\t\t\t}\n\t\t\t\tflags.push('-DHXCPP_XLINUX64_CXX=$hxcpp_xlinux64_cxx');\n\t\t\t\tflags.push('-DHXCPP_XLINUX64_STRIP=$hxcpp_xlinux64_strip');\n\t\t\t\tflags.push('-DHXCPP_XLINUX64_RANLIB=$hxcpp_xlinux64_ranlib');\n\t\t\t\tflags.push('-DHXCPP_XLINUX64_AR=$hxcpp_xlinux64_ar');\n\n\t\t\t\tvar hxcpp_xlinux32_cxx = project.defines.get(\"HXCPP_XLINUX32_CXX\");\n\t\t\t\tif (hxcpp_xlinux32_cxx == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux32_cxx = \"i686-unknown-linux-gnu-g++\";\n\t\t\t\t}\n\t\t\t\tvar hxcpp_xlinux32_strip = project.defines.get(\"HXCPP_XLINUX32_STRIP\");\n\t\t\t\tif (hxcpp_xlinux32_strip == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux32_strip = \"i686-unknown-linux-gnu-strip\";\n\t\t\t\t}\n\t\t\t\tvar hxcpp_xlinux32_ranlib = project.defines.get(\"HXCPP_XLINUX32_RANLIB\");\n\t\t\t\tif (hxcpp_xlinux32_ranlib == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux32_ranlib = \"i686-unknown-linux-gnu-ranlib\";\n\t\t\t\t}\n\t\t\t\tvar hxcpp_xlinux32_ar = project.defines.get(\"HXCPP_XLINUX32AR\");\n\t\t\t\tif (hxcpp_xlinux32_ar == null)\n\t\t\t\t{\n\t\t\t\t\thxcpp_xlinux32_ar = \"i686-unknown-linux-gnu-ar\";\n\t\t\t\t}\n\t\t\t\tflags.push('-DHXCPP_XLINUX32_CXX=$hxcpp_xlinux32_cxx');\n\t\t\t\tflags.push('-DHXCPP_XLINUX32_STRIP=$hxcpp_xlinux32_strip');\n\t\t\t\tflags.push('-DHXCPP_XLINUX32_RANLIB=$hxcpp_xlinux32_ranlib');\n\t\t\t\tflags.push('-DHXCPP_XLINUX32_AR=$hxcpp_xlinux32_ar');\n\t\t\t}\n\n\t\t\tif (!project.targetFlags.exists(\"static\"))\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags);\n\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-debug\" : \"\"), executablePath);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs.concat([\"-D\", \"static_link\"]));\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags.concat([\"-Dstatic_link\"]));\n\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags, \"BuildMain.xml\");\n\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/Main\" + (project.debug ? \"-debug\" : \"\"), executablePath);\n\t\t\t}\n\t\t}\n\n\t\tif (System.hostPlatform != WINDOWS && (targetType != \"nodejs\" && targetType != \"java\"))\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", executablePath]);\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"Linux \" + (is64 ? \"64\" : \"32\") + \"-bit\");\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(executablePath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function generateContext():Dynamic\n\t{\n\t\t// var project = project.clone ();\n\n\t\tif(targetFlags.exists('rpi'))\n\t\t{\n\t\t\tproject.haxedefs.set(\"rpi\", 1);\n\t\t}\n\n\t\tvar context = project.templateContext;\n\n\t\tcontext.NEKO_FILE = targetDirectory + \"/obj/ApplicationMain.n\";\n\t\tcontext.NODE_FILE = targetDirectory + \"/bin/ApplicationMain.js\";\n\t\tcontext.HL_FILE = targetDirectory + \"/obj/ApplicationMain\" + (project.defines.exists(\"hlc\") ? \".c\" : \".hl\");\n\t\tcontext.CPP_DIR = targetDirectory + \"/obj/\";\n\t\tcontext.BUILD_DIR = project.app.path + \"/linux\" + (is64 ? \"64\" : \"\") + (isRaspberryPi ? \"-rpi\" : \"\");\n\t\tcontext.WIN_ALLOW_SHADERS = false;\n\n\t\treturn context;\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\tswitch (targetType)\n\t\t\t{\n\t\t\t\tcase \"hl\":\n\t\t\t\t\thxml.hl = \"_.hl\";\n\t\t\t\tcase \"neko\":\n\t\t\t\t\thxml.neko = \"_.n\";\n\t\t\t\tcase \"java\":\n\t\t\t\t\thxml.java = \"_\";\n\t\t\t\tcase \"nodejs\":\n\t\t\t\t\thxml.js = \"_.js\";\n\t\t\t\tdefault:\n\t\t\t\t\thxml.cpp = \"_\";\n\t\t\t}\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tvar commands:Array<Array<String>> = [];\n\n\t\tif (targetFlags.exists('rpi') && System.hostArchitecture == ARM64 )\n\t\t{\n\t\t\tcommands.push([\n\t\t\t\t\"-Dlinux\",\n\t\t\t\t\"-Drpi\",\n\t\t\t\t\"-Dtoolchain=linux\",\n\t\t\t\t\"-DBINDIR=LinuxArm64\",\n\t\t\t\t\"-DHXCPP_ARM64\",\n\t\t\t\t\"-DCXX=aarch64-linux-gnu-g++\",\n\t\t\t\t\"-DHXCPP_STRIP=aarch64-linux-gnu-strip\",\n\t\t\t\t\"-DHXCPP_AR=aarch64-linux-gnu-ar\",\n\t\t\t\t\"-DHXCPP_RANLIB=aarch64-linux-gnu-ranlib\"\n\t\t\t]);\n\t\t}\n\t\telse if (targetFlags.exists('rpi') && System.hostArchitecture == ARMV7)\n\t\t{\n\t\t\tcommands.push([\n\t\t\t\t\"-Dlinux\",\n\t\t\t\t\"-Drpi\",\n\t\t\t\t\"-Dtoolchain=linux\",\n\t\t\t\t\"-DBINDIR=LinuxArm\",\n\t\t\t\t\"-DHXCPP_M32\",\n\t\t\t\t\"-DCXX=arm-linux-gnueabihf-g++\",\n\t\t\t\t\"-DHXCPP_STRIP=arm-linux-gnueabihf-strip\",\n\t\t\t\t\"-DHXCPP_AR=arm-linux-gnueabihf-ar\",\n\t\t\t\t\"-DHXCPP_RANLIB=arm-linux-gnueabihf-ranlib\"\n\t\t\t]);\n\t\t}\n\t\telse if (targetFlags.exists(\"hl\") && System.hostArchitecture == X64)\n\t\t{\n\t\t\t// TODO: Support single binary\n\t\t\tcommands.push([\"-Dlinux\", \"-DHXCPP_M64\", \"-Dhashlink\"]);\n\t\t}\n\t\telse if (System.hostArchitecture == ARM64 )\n\t\t{\n\t\t\tcommands.push([\n\t\t\t\t\"-Dlinux\",\n\t\t\t\t\"-Dtoolchain=linux\",\n\t\t\t\t\"-DBINDIR=LinuxArm64\",\n\t\t\t\t\"-DHXCPP_ARM64\",\n\t\t\t]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!targetFlags.exists(\"32\") && !targetFlags.exists(\"x86_32\") && System.hostArchitecture == X64)\n\t\t\t{\n\t\t\t\tcommands.push([\"-Dlinux\", \"-DHXCPP_M64\"]);\n\t\t\t}\n\n\t\t\tif (!targetFlags.exists(\"64\") && !targetFlags.exists(\"x86_64\") && (command == \"rebuild\" || System.hostArchitecture == X86))\n\t\t\t{\n\t\t\t\tcommands.push([\"-Dlinux\", \"-DHXCPP_M32\"]);\n\t\t\t}\n\t\t}\n\n\t\tif (targetFlags.exists(\"hl\"))\n\t\t{\n\t\t\tCPPHelper.rebuild(project, commands, null, \"BuildHashlink.xml\");\n\t\t}\n\n\t\tCPPHelper.rebuild(project, commands);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tvar arguments = additionalArguments.copy();\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targuments.push(\"-verbose\");\n\t\t}\n\n\t\tif (targetType == \"nodejs\")\n\t\t{\n\t\t\tNodeJSHelper.run(project, targetDirectory + \"/bin/ApplicationMain.js\", arguments);\n\t\t}\n\t\telse if (targetType == \"java\")\n\t\t{\n\t\t\tSystem.runCommand(applicationDirectory, \"java\", [\"-jar\", project.app.file + \".jar\"].concat(arguments));\n\t\t}\n\t\telse if (project.target == System.hostPlatform)\n\t\t{\n\t\t\targuments = arguments.concat([\"-livereload\"]);\n\t\t\tSystem.runCommand(applicationDirectory, \"./\" + Path.withoutDirectory(executablePath), arguments);\n\t\t}\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\t\t// initialize (project);\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tif (targetType == \"cpp\" && project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tfor (i in 0...project.ndlls.length)\n\t\t\t{\n\t\t\t\tvar ndll = project.ndlls[i];\n\n\t\t\t\tif (ndll.path == null || ndll.path == \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.ndlls[i].path = NDLL.getLibraryPath(ndll, \"Linux\" + (( System.hostArchitecture == ARMV7 || System.hostArchitecture == ARM64) ? \"Arm\" : \"\") + (is64 ? \"64\" : \"\"), \"lib\", \".a\", project.debug);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSystem.mkdir(targetDirectory);\n\t\tSystem.mkdir(targetDirectory + \"/obj\");\n\t\tSystem.mkdir(targetDirectory + \"/haxe\");\n\t\tSystem.mkdir(applicationDirectory);\n\n\t\t// SWFHelper.generateSWFClasses (project, targetDirectory + \"/haxe\");\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, targetType + \"/hxml\", targetDirectory + \"/haxe\", context);\n\n\t\tif (targetType == \"cpp\" && project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"cpp/static\", targetDirectory + \"/obj\", context);\n\t\t}\n\n\t\t// context.HAS_ICON = IconHelper.createIcon (project.icons, 256, 256, Path.combine (applicationDirectory, \"icon.png\"));\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(applicationDirectory, asset.targetPath);\n\n\t\t\tif (asset.embed != true)\n\t\t\t{\n\t\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tAssetHelper.copyAssetIfNewer(asset, path);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function trace():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n"
  },
  {
    "path": "tools/platforms/MacPlatform.hx",
    "content": "package;\n\nimport haxe.io.Eof;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.Path;\nimport hxp.NDLL;\nimport hxp.System;\nimport lime.tools.Architecture;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.CSHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.GUID;\nimport lime.tools.HashlinkHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.JavaHelper;\nimport lime.tools.NekoHelper;\nimport lime.tools.NodeJSHelper;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass MacPlatform extends PlatformTarget\n{\n\tprivate var applicationDirectory:String;\n\tprivate var contentDirectory:String;\n\tprivate var executableDirectory:String;\n\tprivate var executablePath:String;\n\tprivate var targetArchitecture:Architecture;\n\tprivate var targetType:String;\n\n\tprivate var dirSuffix(get, never):String;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tdefaults.window.allowHighDPI = false;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\ttargetArchitecture = Type.createEnum(Architecture, Type.enumConstructor(System.hostArchitecture));\n\t\tfor (architecture in project.architectures)\n\t\t{\n\t\t\tif (architecture.match(X86 | X64 | ARMV6 | ARMV7 | ARM64))\n\t\t\t{\n\t\t\t\ttargetArchitecture = architecture;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"neko\") || project.target != System.hostPlatform)\n\t\t{\n\t\t\ttargetType = \"neko\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"hl\") || project.targetFlags.exists(\"hlc\"))\n\t\t{\n\t\t\ttargetType = \"hl\";\n\t\t\tvar hlVer = project.haxedefs.get(\"hl-ver\");\n\t\t\tif (hlVer == null)\n\t\t\t{\n\t\t\t\tvar hlPath = project.defines.get(\"HL_PATH\");\n\t\t\t\tif (hlPath == null)\n\t\t\t\t{\n\t\t\t\t\t// Haxe's default target version for HashLink may be\n\t\t\t\t\t// different (newer even) than the build of HashLink that\n\t\t\t\t\t// is bundled with Lime. if using Lime's bundled HashLink,\n\t\t\t\t\t// set hl-ver to the correct version\n\t\t\t\t\tproject.haxedefs.set(\"hl-ver\", HashlinkHelper.BUNDLED_HL_VER);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (project.targetFlags.exists(\"java\"))\n\t\t{\n\t\t\ttargetType = \"java\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"nodejs\"))\n\t\t{\n\t\t\ttargetType = \"nodejs\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"cs\"))\n\t\t{\n\t\t\ttargetType = \"cs\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetType = \"cpp\";\n\t\t}\n\n\t\tvar defaultTargetDirectory = switch (targetType)\n\t\t{\n\t\t\tcase \"cpp\": \"macos\";\n\t\t\tcase \"hl\": project.targetFlags.exists(\"hlc\") ? \"hlc\" : targetType;\n\t\t\tdefault: targetType;\n\t\t}\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"mac.output-directory\", defaultTargetDirectory));\n\t\ttargetDirectory = StringTools.replace(targetDirectory, \"arch64\", dirSuffix);\n\t\tapplicationDirectory = targetDirectory + \"/bin/\" + project.app.file + \".app\";\n\t\tcontentDirectory = applicationDirectory + \"/Contents/Resources\";\n\t\texecutableDirectory = applicationDirectory + \"/Contents/MacOS\";\n\t\texecutablePath = executableDirectory + \"/\" + project.app.file;\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tvar hxml = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\tSystem.mkdir(targetDirectory);\n\n\t\tif (!project.targetFlags.exists(\"static\") || targetType != \"cpp\")\n\t\t{\n\t\t\tvar targetSuffix = (targetType == \"hl\") ? \".hdll\" : null;\n\n\t\t\tfor (ndll in project.ndlls)\n\t\t\t{\n\t\t\t\t// TODO: Support single binary for HashLink\n\t\t\t\tif (targetType == \"hl\")\n\t\t\t\t{\n\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Mac\" + dirSuffix, \"\", \".hdll\", executableDirectory, project.debug, targetSuffix);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Mac\" + dirSuffix, \"\",\n\t\t\t\t\t\t(ndll.haxelib != null\n\t\t\t\t\t\t\t&& (ndll.haxelib.name == \"hxcpp\" || ndll.haxelib.name == \"hxlibc\")) ? \".dll\" : \".ndll\", executableDirectory,\n\t\t\t\t\t\tproject.debug, targetSuffix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (targetType == \"neko\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tNekoHelper.createExecutable(project.templatePaths, \"mac\" + dirSuffix.toLowerCase(), targetDirectory + \"/obj/ApplicationMain.n\", executablePath);\n\t\t\tNekoHelper.copyLibraries(project.templatePaths, \"mac\" + dirSuffix.toLowerCase(), executableDirectory);\n\t\t}\n\t\telse if (targetType == \"hl\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\t// ensure that the shell script is replaced by the template executable\n\t\t\tSystem.deleteFile(executablePath);\n\n\t\t\tHashlinkHelper.copyHashlink(project, targetDirectory, executableDirectory, executablePath, true);\n\n\t\t\tif (project.targetFlags.exists(\"hlc\"))\n\t\t\t{\n\t\t\t\tvar compiler = project.targetFlags.exists(\"clang\") ? \"clang\" : \"gcc\";\n\t\t\t\t// the libraries were compiled as x86_64, so if the build is\n\t\t\t\t// happening on ARM64 instead, we need to ensure that the\n\t\t\t\t// same architecture is used for the executable, so we wrap our\n\t\t\t\t// compiler command with the `arch -x86_64` command.\n\t\t\t\t// if we ever support ARM or Universal binaries, this will\n\t\t\t\t// need to be handled differently.\n\t\t\t\tvar command = [\"arch\", \"-x86_64\", compiler, \"-O3\", \"-o\", executablePath, \"-std=c11\", \"-Wl,-rpath,@executable_path\", \"-I\", Path.combine(targetDirectory, \"obj\"), Path.combine(targetDirectory, \"obj/ApplicationMain.c\")];\n\t\t\t\tfor (file in System.readDirectory(executableDirectory))\n\t\t\t\t{\n\t\t\t\t\tswitch Path.extension(file)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"dylib\", \"hdll\":\n\t\t\t\t\t\t\t// ensure the executable knows about every library\n\t\t\t\t\t\t\tcommand.push(file);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tSystem.runCommand(\"\", command.shift(), command);\n\n\t\t\t\tfor (file in System.readDirectory(executableDirectory))\n\t\t\t\t{\n\t\t\t\t\tswitch Path.extension(file)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"dylib\", \"hdll\":\n\t\t\t\t\t\t\t// when launched inside an .app file, the executable\n\t\t\t\t\t\t\t// can't find the library files unless we tell\n\t\t\t\t\t\t\t// it to search specifically from @executable_path\n\t\t\t\t\t\t\tSystem.runCommand(\"\", \"install_name_tool\", [\"-change\", Path.withoutDirectory(file), \"@executable_path/\" + Path.withoutDirectory(file), executablePath]);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// HashLink JIT looks for hlboot.dat and libraries in the current\n\t\t\t\t// working directory, so the .app file won't work properly if it\n\t\t\t\t// tries to run the HashLink executable directly.\n\t\t\t\t// when the .app file is launched, we can tell it to run a shell\n\t\t\t\t// script instead of the HashLink executable. the shell script\n\t\t\t\t// tells the HL where to find everything.\n\n\t\t\t\t// we want to keep the original \"hl\" file name because our\n\t\t\t\t// shell script will use the app name\n\t\t\t\tvar hlExecutablePath = Path.combine(executableDirectory, \"hl\");\n\t\t\t\tSystem.renameFile(executablePath, hlExecutablePath);\n\t\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", hlExecutablePath]);\n\n\t\t\t\t// then we can use the executable name for the shell script\n\t\t\t\tSystem.copyFileTemplate(project.templatePaths, 'hl/mac-launch.sh', executablePath);\n\t\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", executablePath]);\n\t\t\t}\n\t\t}\n\t\telse if (targetType == \"java\")\n\t\t{\n\t\t\tvar libPath = Path.combine(Haxelib.getPath(new Haxelib(\"lime\")), \"templates/java/lib/\");\n\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml, \"-java-lib\", libPath + \"disruptor.jar\", \"-java-lib\", libPath + \"lwjgl.jar\"]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tHaxelib.runCommand(targetDirectory + \"/obj\", [\"run\", \"hxjava\", \"hxjava_build.txt\", \"--haxe-version\", \"3103\"]);\n\t\t\tSystem.recursiveCopy(targetDirectory + \"/obj/lib\", Path.combine(executableDirectory, \"lib\"));\n\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-Debug\" : \"\") + \".jar\",\n\t\t\t\tPath.combine(executableDirectory, project.app.file + \".jar\"));\n\t\t\tJavaHelper.copyLibraries(project.templatePaths, \"Mac\" + dirSuffix, executableDirectory);\n\t\t}\n\t\telse if (targetType == \"nodejs\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\t// NekoHelper.createExecutable (project.templatePaths, \"Mac\" + dirSuffix, targetDirectory + \"/obj/ApplicationMain.n\", executablePath);\n\t\t\t// NekoHelper.copyLibraries (project.templatePaths, \"Mac\" + dirSuffix, executableDirectory);\n\t\t}\n\t\telse if (targetType == \"cs\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tCSHelper.copySourceFiles(project.templatePaths, targetDirectory + \"/obj/src\");\n\t\t\tvar txtPath = targetDirectory + \"/obj/hxcs_build.txt\";\n\t\t\tCSHelper.addSourceFiles(txtPath, CSHelper.ndllSourceFiles);\n\t\t\tCSHelper.addGUID(txtPath, GUID.uuid());\n\t\t\tCSHelper.compile(project, targetDirectory + \"/obj\", targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-debug\" : \"\"), \"x64\", \"desktop\");\n\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-debug\" : \"\") + \".exe\", executablePath + \".exe\");\n\t\t\tFile.saveContent(executablePath, \"#!/bin/sh\\nmono ${PWD}/\" + project.app.file + \".exe\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar haxeArgs = [hxml, \"-D\", \"HXCPP_CLANG\"];\n\t\t\tvar flags = [\"-DHXCPP_CLANG\"];\n\n\t\t\tif (targetArchitecture == X64)\n\t\t\t{\n\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\thaxeArgs.push(\"HXCPP_M64\");\n\t\t\t\tflags.push(\"-DHXCPP_M64\");\n\t\t\t}\n\t\t\telse if (targetArchitecture == ARM64)\n\t\t\t{\n\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\thaxeArgs.push(\"HXCPP_ARM64\");\n\t\t\t\tflags.push(\"-DHXCPP_ARM64\");\n\t\t\t}\n\n\t\t\tif (!project.targetFlags.exists(\"static\"))\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags);\n\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-debug\" : \"\"), executablePath);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs.concat([\"-D\", \"static_link\"]));\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags.concat([\"-Dstatic_link\"]));\n\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags, \"BuildMain.xml\");\n\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/Main\" + (project.debug ? \"-debug\" : \"\"), executablePath);\n\t\t\t}\n\t\t}\n\n\t\tif (System.hostPlatform != WINDOWS && targetType != \"nodejs\" && targetType != \"java\" && sys.FileSystem.exists(executablePath))\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", executablePath]);\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"Mac\");\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(executablePath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function generateContext():Dynamic\n\t{\n\t\tvar context = project.templateContext;\n\t\tcontext.NEKO_FILE = targetDirectory + \"/obj/ApplicationMain.n\";\n\t\tcontext.NODE_FILE = executableDirectory + \"/ApplicationMain.js\";\n\t\tcontext.HL_FILE = targetDirectory + \"/obj/ApplicationMain\" + (project.defines.exists(\"hlc\") ? \".c\" : \".hl\");\n\t\tcontext.CPP_DIR = targetDirectory + \"/obj/\";\n\t\tcontext.BUILD_DIR = project.app.path + \"/mac\" + dirSuffix.toLowerCase();\n\n\t\treturn context;\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\tswitch (targetType)\n\t\t\t{\n\t\t\t\tcase \"hl\":\n\t\t\t\t\thxml.hl = \"_.hl\";\n\t\t\t\tcase \"neko\":\n\t\t\t\t\thxml.neko = \"_.n\";\n\t\t\t\tcase \"java\":\n\t\t\t\t\thxml.java = \"_\";\n\t\t\t\tcase \"nodejs\":\n\t\t\t\t\thxml.js = \"_.js\";\n\t\t\t\tdefault:\n\t\t\t\t\thxml.cpp = \"_\";\n\t\t\t}\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tvar commands:Array<Array<String>> = [];\n\n\t\tswitch (System.hostArchitecture)\n\t\t{\n\t\t\tcase X64:\n\t\t\t\tif (targetFlags.exists(\"hl\"))\n\t\t\t\t{\n\t\t\t\t\t// TODO: Support single binary\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_M64\", \"-Dhashlink\"]);\n\t\t\t\t}\n\t\t\t\telse if (targetFlags.exists(\"arm64\"))\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_ARM64\"]);\n\t\t\t\t}\n\t\t\t\telse if (!targetFlags.exists(\"32\") && !targetFlags.exists(\"x86_32\"))\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_M64\"]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_M32\"]);\n\t\t\t\t}\n\t\t\tcase X86:\n\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_M32\"]);\n\t\t\tcase ARM64:\n\t\t\t\tif (targetFlags.exists(\"hl\"))\n\t\t\t\t{\n\t\t\t\t\t// hashlink doesn't support arm64 macs yet\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_ARCH=x86_64\", \"-Dhashlink\"]);\n\t\t\t\t}\n\t\t\t\telse if (targetFlags.exists(\"64\") || targetFlags.exists(\"x86_64\"))\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_ARCH=x86_64\"]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dmac\", \"-DHXCPP_CLANG\", \"-DHXCPP_ARM64\"]);\n\t\t\t\t}\n\t\t\tdefault:\n\t\t}\n\n\t\tif (targetFlags.exists(\"hl\"))\n\t\t{\n\t\t\tCPPHelper.rebuild(project, commands, null, \"BuildHashlink.xml\");\n\t\t\tcopyAndFixHashLinkHomebrewDependencies();\n\t\t}\n\n\t\tCPPHelper.rebuild(project, commands);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tvar arguments = additionalArguments.copy();\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targuments.push(\"-verbose\");\n\t\t}\n\n\t\tif (targetType == \"nodejs\")\n\t\t{\n\t\t\tNodeJSHelper.run(project, executableDirectory + \"/ApplicationMain.js\", arguments);\n\t\t}\n\t\telse if (targetType == \"java\")\n\t\t{\n\t\t\tSystem.runCommand(executableDirectory, \"java\", [\"-jar\", project.app.file + \".jar\"].concat(arguments));\n\t\t}\n\t\telse if (project.target == System.hostPlatform)\n\t\t{\n\t\t\targuments = arguments.concat([\"-livereload\"]);\n\t\t\tSystem.runCommand(executableDirectory, \"./\" + Path.withoutDirectory(executablePath), arguments);\n\t\t}\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tif (targetType == \"cpp\" && project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tfor (i in 0...project.ndlls.length)\n\t\t\t{\n\t\t\t\tvar ndll = project.ndlls[i];\n\n\t\t\t\tif (ndll.path == null || ndll.path == \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.ndlls[i].path = NDLL.getLibraryPath(ndll, \"Mac\" + dirSuffix, \"lib\", \".a\", project.debug);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSystem.mkdir(targetDirectory);\n\t\tSystem.mkdir(targetDirectory + \"/obj\");\n\t\tSystem.mkdir(targetDirectory + \"/haxe\");\n\t\tSystem.mkdir(applicationDirectory);\n\t\tSystem.mkdir(contentDirectory);\n\n\t\t// SWFHelper.generateSWFClasses (project, targetDirectory + \"/haxe\");\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, targetType + \"/hxml\", targetDirectory + \"/haxe\", context);\n\n\t\tif (targetType == \"cpp\" && project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"cpp/static\", targetDirectory + \"/obj\", context);\n\t\t}\n\n\t\tSystem.copyFileTemplate(project.templatePaths, \"mac/Info.plist\", targetDirectory + \"/bin/\" + project.app.file + \".app/Contents/Info.plist\", context);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"mac/Entitlements.plist\",\n\t\t\ttargetDirectory\n\t\t\t+ \"/bin/\"\n\t\t\t+ project.app.file\n\t\t\t+ \".app/Contents/Entitlements.plist\", context);\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\tcontext.HAS_ICON = IconHelper.createMacIcon(icons, Path.combine(contentDirectory, \"icon.icns\"));\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed != true)\n\t\t\t{\n\t\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(Path.combine(contentDirectory, asset.targetPath)));\n\t\t\t\t\tAssetHelper.copyAssetIfNewer(asset, Path.combine(contentDirectory, asset.targetPath));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(Path.combine(targetDirectory, asset.targetPath)));\n\t\t\t\t\tAssetHelper.copyAsset(asset, Path.combine(targetDirectory, asset.targetPath), context);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function trace():Void {}\n\n\t@ignore public override function uninstall():Void {}\n\n\t// Getters & Setters\n\n\tprivate inline function get_dirSuffix():String\n\t{\n\t\tif (targetFlags.exists(\"hl\"))\n\t\t{\n\t\t\t// hashlink doesn't support arm64 macs yet\n\t\t\treturn \"64\";\n\t\t}\n\t\treturn targetArchitecture == X64 ? \"64\" : targetArchitecture == ARM64 ? \"Arm64\" : \"\";\n\t}\n\n\t/**\n\t\tFinds and copies all Homebrew dependencies of the HashLink executable,\n\t\tits .hdll files, and its .dylib files. We need to bundle these\n\t\tdependencies, or the resulting .app file won't launch on systems that\n\t\tdon't have them installed. We also don't want to have to ask random\n\t\tusers to install Homebrew and the dependencies manually.\n\n\t\tThis process involves copying the dependencies to the same directory as\n\t\tour bundled HashLink executable. Then, we use install_name_tool to\n\t\tupdate the paths to those dependencies. We change the paths to use\n\t\t@executable_path so that they can be found in the .app bundle and not at\n\t\ttheir original locations.\n\t**/\n\tprivate function copyAndFixHashLinkHomebrewDependencies():Void\n\t{\n\t\tvar limeDirectory = Haxelib.getPath(new Haxelib(\"lime\"), true);\n\t\tvar bindir = \"Mac64\";\n\t\tvar bundledHLDirectory = Path.combine(limeDirectory, 'templates/bin/hl/$bindir');\n\t\tif (!FileSystem.exists(bundledHLDirectory))\n\t\t{\n\t\t\tLog.error('Directory does not exist: $bundledHLDirectory');\n\t\t\treturn;\n\t\t}\n\t\tif (!FileSystem.isDirectory(bundledHLDirectory))\n\t\t{\n\t\t\tLog.error('Not a directory: $bundledHLDirectory');\n\t\t\treturn;\n\t\t}\n\n\t\t// these are the known directories where Homebrew installs its dependencies\n\t\t// we may need to add more in the future, but this seems to be enough for now\n\t\tvar homebrewDirs = [\n\t\t\t\"/usr/local/opt/\",\n\t\t\t\"/usr/local/Cellar/\"\n\t\t];\n\n\t\t// first, collect all executables, hdlls, and dylibs that were built\n\t\t// by BuildHashlink.xml\n\t\tvar bundledPaths:Array<String> = [];\n\t\tfor (fileName in FileSystem.readDirectory(bundledHLDirectory))\n\t\t{\n\t\t\tvar ext = Path.extension(fileName);\n\t\t\tif (ext != \"dylib\" && ext != \"hdll\" && fileName != \"hl\")\n\t\t\t{\n\t\t\t\t// ignore files that aren't executables or libraries\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar srcPath = Path.join([bundledHLDirectory, fileName]);\n\t\t\tbundledPaths.push(srcPath);\n\t\t}\n\n\t\tvar homebrewDependencyPaths:Array<String> = [];\n\n\t\t// then find and copy all dependencies of those executables/libraries\n\t\t// that come from Homebrew. keep searching all newly found Homebrew\n\t\t// libraries for additional Homebrew dependendencies too.\n\t\tvar pathsToSearchForHomebrewDependencies = bundledPaths.copy();\n\t\twhile (pathsToSearchForHomebrewDependencies.length > 0)\n\t\t{\n\t\t\tvar srcPath = pathsToSearchForHomebrewDependencies.shift();\n\t\t\tvar destPath = Path.join([bundledHLDirectory, Path.withoutDirectory(srcPath)]);\n\t\t\tif (bundledPaths.indexOf(srcPath) == -1)\n\t\t\t{\n\t\t\t\t// copy files that don't exist yet\n\t\t\t\tFile.copy(srcPath, destPath);\n\t\t\t}\n\n\t\t\tvar process = new Process(\"otool\", [\"-L\", destPath]);\n\t\t\tvar exitCode = process.exitCode(true);\n\t\t\tif (exitCode != 0)\n\t\t\t{\n\t\t\t\tLog.error('otool -L process exited with code: <${exitCode}> for file <${destPath}>');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar line = process.stdout.readLine();\n\t\t\t\t\tvar ereg = ~/^\\s+(.+?\\.\\w+?)\\s\\(/;\n\t\t\t\t\tif (ereg.match(line))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar libPath = StringTools.trim(ereg.matched(1));\n\t\t\t\t\t\tif (homebrewDependencyPaths.indexOf(libPath) != -1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// already processed this file\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar resolvedLibPath = libPath;\n\t\t\t\t\t\tif (StringTools.startsWith(libPath, \"@rpath/\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresolvedLibPath = Path.join([Path.directory(srcPath), Path.withoutDirectory(libPath)]);\n\t\t\t\t\t\t\tif (!FileSystem.exists(resolvedLibPath))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLog.error(\"Failed to resolve library to real path: \" + libPath);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Lambda.exists(homebrewDirs, function(dirPath:String):Bool { return StringTools.startsWith(resolvedLibPath, dirPath); }))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thomebrewDependencyPaths.push(libPath);\n\t\t\t\t\t\t\tpathsToSearchForHomebrewDependencies.push(resolvedLibPath);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (e:Eof)\n\t\t\t\t{\n\t\t\t\t\t// no more output\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// finally, go through all executables and libraries that were either\n\t\t// built by BuildHashlink.xml or were copied in the previous step,\n\t\t// and replace any Homebrew library paths with @executable_path.\n\t\tfor (fileName in FileSystem.readDirectory(bundledHLDirectory))\n\t\t{\n\t\t\tvar ext = Path.extension(fileName);\n\t\t\tvar isLibrary = ext == \"dylib\" || ext == \"hdll\";\n\n\t\t\tif (fileName != \"hl\" && !isLibrary)\n\t\t\t{\n\t\t\t\t// ignore files that aren't executables or libraries\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar absoluteFilePath = Path.join([bundledHLDirectory, fileName]);\n\n\t\t\tif (isLibrary)\n\t\t\t{\n\t\t\t\tvar newId = \"@executable_path/\" + fileName;\n\t\t\t\tSystem.runCommand(\"\", \"install_name_tool\", [\"-id\", newId, absoluteFilePath]);\n\t\t\t}\n\n\t\t\tfor (homebrewPath in homebrewDependencyPaths)\n\t\t\t{\n\t\t\t\tvar newPath = \"@executable_path/\" + Path.withoutDirectory(homebrewPath);\n\t\t\t\tSystem.runCommand(\"\", \"install_name_tool\", [\"-change\", homebrewPath, newPath, absoluteFilePath]);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tools/platforms/TVOSPlatform.hx",
    "content": "package;\n\nimport haxe.Json;\nimport hxp.ArrayTools;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.NDLL;\nimport hxp.Path;\nimport hxp.StringTools;\nimport hxp.System;\n#if lime\nimport lime.graphics.Image;\n#end\nimport lime.tools.Architecture;\nimport lime.tools.Asset;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.Keystore;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport lime.tools.TVOSHelper;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass TVOSPlatform extends PlatformTarget\n{\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tdefaults.architectures = [Architecture.ARM64];\n\t\tdefaults.window.width = 0;\n\t\tdefaults.window.height = 0;\n\t\tdefaults.window.fullscreen = true;\n\t\tdefaults.window.requireShaders = true;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"tvos.output-directory\", \"tvos\"));\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tif (project.targetFlags.exists(\"xcode\") && System.hostPlatform == MAC)\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"open\", [targetDirectory + \"/\" + project.app.file + \".xcodeproj\"]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTVOSHelper.build(project, targetDirectory);\n\n\t\t\tif (noOutput) return;\n\n\t\t\tif (!project.targetFlags.exists(\"simulator\"))\n\t\t\t{\n\t\t\t\tTVOSHelper.sign(project, targetDirectory + \"/bin\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tTVOSHelper.deploy(project, targetDirectory);\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(Path.combine(targetDirectory, project.app.file + \".xcodeproj\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function generateContext():Dynamic\n\t{\n\t\t// project = project.clone ();\n\n\t\tproject.sources.unshift(\"\");\n\t\tproject.sources = Path.relocatePaths(project.sources, Path.combine(targetDirectory, project.app.file + \"/haxe\"));\n\t\t// project.dependencies.push (\"stdc++\");\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"final\"))\n\t\t{\n\t\t\tproject.haxedefs.set(\"final\", \"\");\n\t\t}\n\n\t\tif (!project.config.exists(\"tvos.identity\"))\n\t\t{\n\t\t\tproject.config.set(\"tvos.identity\", \"tvOS Developer\");\n\t\t}\n\n\t\tvar context = project.templateContext;\n\n\t\tcontext.HAS_ICON = false;\n\t\tcontext.HAS_LAUNCH_IMAGE = false;\n\t\tcontext.OBJC_ARC = false;\n\t\tcontext.KEY_STORE_IDENTITY = project.config.getString(\"tvos.identity\");\n\n\t\tcontext.linkedLibraries = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (!StringTools.endsWith(dependency.name, \".framework\")\n\t\t\t\t&& !StringTools.endsWith(dependency.name, \".tbd\")\n\t\t\t\t&& !StringTools.endsWith(dependency.path, \".framework\")\n\t\t\t\t&& !StringTools.endsWith(dependency.path, \".xcframework\"))\n\t\t\t{\n\t\t\t\tif (dependency.path != \"\")\n\t\t\t\t{\n\t\t\t\t\tvar name = Path.withoutDirectory(Path.withoutExtension(dependency.path));\n\n\t\t\t\t\tproject.config.push(\"tvos.linker-flags\", \"-force_load $SRCROOT/$PRODUCT_NAME/lib/$CURRENT_ARCH/\" + Path.withoutDirectory(dependency.path));\n\n\t\t\t\t\tif (StringTools.startsWith(name, \"lib\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tname = name.substring(3, name.length);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.linkedLibraries.push(name);\n\t\t\t\t}\n\t\t\t\telse if (dependency.name != \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.linkedLibraries.push(dependency.name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar valid_archs = new Array<String>();\n\t\tvar arm64 = false;\n\t\tvar architectures = project.architectures;\n\n\t\tif (architectures == null || architectures.length == 0)\n\t\t{\n\t\t\tarchitectures = [Architecture.ARM64];\n\t\t}\n\n\t\tfor (architecture in project.architectures)\n\t\t{\n\t\t\tswitch (architecture)\n\t\t\t{\n\t\t\t\tcase ARM64:\n\t\t\t\t\tvalid_archs.push(\"arm64\");\n\t\t\t\t\tarm64 = true;\n\t\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tcontext.CURRENT_ARCHS = \"( \" + valid_archs.join(\",\") + \") \";\n\n\t\tvalid_archs.push(\"i386\");\n\n\t\tcontext.VALID_ARCHS = valid_archs.join(\" \");\n\t\tcontext.THUMB_SUPPORT = \"\";\n\n\t\tvar requiredCapabilities:Array<{name:String, value:Bool}> = [];\n\n\t\trequiredCapabilities.push({name: \"arm64\", value: true});\n\n\t\tcontext.REQUIRED_CAPABILITY = requiredCapabilities;\n\t\tcontext.ARM64 = arm64;\n\t\tcontext.TARGET_DEVICES = switch (project.config.getString(\"tvos.device\", \"appletv\"))\n\t\t{\n\t\t\tcase \"appletv\": \"3\";\n\t\t\tdefault: \"3\";\n\t\t}\n\t\tcontext.DEPLOYMENT = project.config.getString(\"tvos.deployment\", \"9.0\");\n\n\t\tif (project.config.getString(\"tvos.compiler\") == \"llvm\" || project.config.getString(\"tvos.compiler\", \"clang\") == \"clang\")\n\t\t{\n\t\t\tcontext.OBJC_ARC = true;\n\t\t}\n\n\t\tcontext.IOS_COMPILER = project.config.getString(\"tvos.compiler\", \"clang\");\n\t\tcontext.CPP_BUILD_LIBRARY = project.config.getString(\"cpp.buildLibrary\", \"hxcpp\");\n\n\t\tcontext.CPP_CACHE_WORKAROUND = \"unset HXCPP_COMPILE_CACHE;\";\n\n\t\tcontext.IOS_LINKER_FLAGS = [\"-stdlib=libc++\"].concat(project.config.getArrayString(\"tvos.linker-flags\"));\n\t\tcontext.IOS_NON_EXEMPT_ENCRYPTION = project.config.getBool(\"tvos.non-exempt-encryption\", true);\n\n\t\tswitch (project.window.orientation)\n\t\t{\n\t\t\tcase PORTRAIT:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string></array>\";\n\t\t\tcase LANDSCAPE:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string></array>\";\n\t\t\tcase ALL:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string></array>\";\n\t\t\t// case \"allButUpsideDown\":\n\t\t\t// context.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string><string>UIInterfaceOrientationPortrait</string></array>\";\n\t\t\tdefault:\n\t\t\t\tcontext.IOS_APP_ORIENTATION = \"<array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string></array>\";\n\t\t}\n\n\t\tcontext.ADDL_PBX_BUILD_FILE = \"\";\n\t\tcontext.ADDL_PBX_FILE_REFERENCE = \"\";\n\t\tcontext.ADDL_PBX_FRAMEWORKS_BUILD_PHASE = \"\";\n\t\tcontext.ADDL_PBX_FRAMEWORK_GROUP = \"\";\n\n\t\tcontext.frameworkSearchPaths = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tvar name:String = null;\n\t\t\tvar path:String = null;\n\t\t\tvar fileType:String = null;\n\n\t\t\tif (Path.extension(dependency.name) == \"framework\")\n\t\t\t{\n\t\t\t\tname = dependency.name;\n\t\t\t\tpath = \"/System/Library/Frameworks/\" + dependency.name;\n\t\t\t\tfileType = \"wrapper.framework\";\n\t\t\t}\n\t\t\telse if (Path.extension(dependency.name) == \"tbd\")\n\t\t\t{\n\t\t\t\tname = dependency.name;\n\t\t\t\tpath = \"usr/lib/\" + dependency.name;\n\t\t\t\tfileType = \"sourcecode.text-based-dylib-definition\";\n\t\t\t}\n\t\t\telse if (Path.extension(dependency.path) == \"framework\")\n\t\t\t{\n\t\t\t\tname = Path.withoutDirectory(dependency.path);\n\t\t\t\tpath = Path.tryFullPath(dependency.path);\n\t\t\t\tfileType = \"wrapper.framework\";\n\t\t\t}\n\t\t\telse if (Path.extension(dependency.path) == \"xcframework\")\n\t\t\t{\n\t\t\t\tname = Path.withoutDirectory(dependency.path);\n\t\t\t\tpath = Path.tryFullPath(dependency.path);\n\t\t\t\tfileType = \"wrapper.xcframework\";\n\t\t\t}\n\n\t\t\tif (name != null)\n\t\t\t{\n\t\t\t\tvar frameworkID = \"11C0000000000018\" + StringTools.getUniqueID();\n\t\t\t\tvar fileID = \"11C0000000000018\" + StringTools.getUniqueID();\n\n\t\t\t\tArrayTools.addUnique(context.frameworkSearchPaths, Path.directory(path));\n\n\t\t\t\tcontext.ADDL_PBX_BUILD_FILE += \"\t\t\" + frameworkID + \" /* \" + name + \" in Frameworks */ = {isa = PBXBuildFile; fileRef = \" + fileID + \" /* \"\n\t\t\t\t\t+ name + \" */; };\\n\";\n\t\t\t\tcontext.ADDL_PBX_FILE_REFERENCE += \"\t\t\" + fileID + \" /* \" + name + \" */ = {isa = PBXFileReference; lastKnownFileType = \\\"\" + fileType\n\t\t\t\t\t+ \"\\\"; name = \\\"\" + name + \"\\\"; path = \\\"\" + path + \"\\\"; sourceTree = SDKROOT; };\\n\";\n\t\t\t\tcontext.ADDL_PBX_FRAMEWORKS_BUILD_PHASE += \"\t\t\t\t\" + frameworkID + \" /* \" + name + \" in Frameworks */,\\n\";\n\t\t\t\tcontext.ADDL_PBX_FRAMEWORK_GROUP += \"\t\t\t\t\" + fileID + \" /* \" + name + \" */,\\n\";\n\t\t\t}\n\t\t}\n\n\t\tcontext.HXML_PATH = System.findTemplate(project.templatePaths, \"tvos/PROJ/haxe/Build.hxml\");\n\t\tcontext.PRERENDERED_ICON = project.config.getBool(\"tvos.prerenderedIcon\", false);\n\n\t\tvar haxelibPath = project.environment.get(\"HAXELIB_PATH\");\n\n\t\tif (haxelibPath != null)\n\t\t{\n\t\t\tcontext.HAXELIB_PATH = 'export HAXELIB_PATH=$haxelibPath;';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcontext.HAXELIB_PATH = '';\n\t\t}\n\n\t\treturn context;\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/\" + project.app.file + \"/haxe/Build.hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\thxml.cpp = \"_\";\n\t\t\thxml.define(\"tvos\");\n\t\t\thxml.define(\"appletv\");\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tvar arm64 = (command == \"rebuild\"\n\t\t\t|| (project.architectures.indexOf(Architecture.ARM64) > -1 && !project.targetFlags.exists(\"simulator\")));\n\t\tvar i386 = (command == \"rebuild\" || project.targetFlags.exists(\"simulator\"));\n\t\tvar x86_64 = (command == \"rebuild\" || project.targetFlags.exists(\"simulator\"));\n\n\t\tvar commands:Array<Array<String>> = [];\n\n\t\tif (arm64) commands.push([\n\t\t\t\"-Dtvos\",\n\t\t\t\"-Dappletvos\",\n\t\t\t\"-DHXCPP_CPP11\",\n\t\t\t\"-DHXCPP_ARM64\",\n\t\t\t\"-DOBJC_ARC\",\n\t\t\t\"-DENABLE_BITCODE\"\n\t\t]);\n\t\tif (i386) commands.push([\n\t\t\t\"-Dtvos\",\n\t\t\t\"-Dappletvsim\",\n\t\t\t\"-Dsimulator\",\n\t\t\t\"-DHXCPP_CPP11\",\n\t\t\t\"-DOBJC_ARC\",\n\t\t\t\"-DENABLE_BITCODE\"\n\t\t]);\n\t\tif (x86_64) commands.push([\n\t\t\t\"-Dtvos\",\n\t\t\t\"-Dappletvsim\",\n\t\t\t\"-Dsimulator\",\n\t\t\t\"-DHXCPP_M64\",\n\t\t\t\"-DHXCPP_CPP11\",\n\t\t\t\"-DOBJC_ARC\",\n\t\t\t\"-DENABLE_BITCODE\"\n\t\t]);\n\n\t\tCPPHelper.rebuild(project, commands);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tif (project.targetFlags.exists(\"xcode\")) return;\n\n\t\tTVOSHelper.launch(project, targetDirectory);\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/\" + project.app.file + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\t// var manifest = new Asset ();\n\t\t// manifest.id = \"__manifest__\";\n\t\t// manifest.data = AssetHelper.createManifest (project).serialize ();\n\t\t// manifest.resourceName = manifest.flatName = manifest.targetPath = \"manifest\";\n\t\t// manifest.type = AssetType.TEXT;\n\t\t// project.assets.push (manifest);\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tvar projectDirectory = targetDirectory + \"/\" + project.app.file + \"/\";\n\n\t\tSystem.mkdir(targetDirectory);\n\t\tSystem.mkdir(projectDirectory);\n\t\tSystem.mkdir(projectDirectory + \"/haxe\");\n\t\tSystem.mkdir(projectDirectory + \"/haxe/lime/installer\");\n\n\t\tvar iconSizes:Array<IconSize> = [\n\t\t\t{name: \"Icon-Small.png\", size: 29},\n\t\t\t{name: \"Icon-Small-40.png\", size: 40},\n\t\t\t{name: \"Icon-Small-50.png\", size: 50},\n\t\t\t{name: \"Icon.png\", size: 57},\n\t\t\t{name: \"Icon-Small@2x.png\", size: 58},\n\t\t\t{name: \"Icon-72.png\", size: 72},\n\t\t\t{name: \"Icon-76.png\", size: 76},\n\t\t\t{name: \"Icon-Small-40@2x.png\", size: 80},\n\t\t\t{name: \"Icon-Small-50@2x.png\", size: 100},\n\t\t\t{name: \"Icon@2x.png\", size: 114},\n\t\t\t{name: \"Icon-60@2x.png\", size: 120},\n\t\t\t{name: \"Icon-72@2x.png\", size: 144},\n\t\t\t{name: \"Icon-76@2x.png\", size: 152},\n\t\t\t{name: \"Icon-60@3x.png\", size: 180},\n\t\t];\n\n\t\tcontext.HAS_ICON = true;\n\n\t\tvar iconPath = Path.combine(projectDirectory, \"Images.xcassets/AppIcon.appiconset\");\n\t\tSystem.mkdir(iconPath);\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\tfor (iconSize in iconSizes)\n\t\t{\n\t\t\tif (!IconHelper.createIcon(icons, iconSize.size, iconSize.size, Path.combine(iconPath, iconSize.name)))\n\t\t\t{\n\t\t\t\tcontext.HAS_ICON = false;\n\t\t\t}\n\t\t}\n\n\t\tvar splashSizes:Array<SplashSize> = [\n\t\t\t{name: \"Default.png\", w: 320, h: 480}, // iPhone, portrait\n\t\t\t{name: \"Default@2x.png\", w: 640, h: 960}, // iPhone Retina, portrait\n\t\t\t{name: \"Default-568h@2x.png\", w: 640, h: 1136}, // iPhone 5, portrait\n\t\t\t{name: \"Default-Portrait.png\", w: 768, h: 1024}, // iPad, portrait\n\t\t\t{name: \"Default-Landscape.png\", w: 1024, h: 768}, // iPad, landscape\n\t\t\t{name: \"Default-Portrait@2x.png\", w: 1536, h: 2048}, // iPad Retina, portrait\n\t\t\t{name: \"Default-Landscape@2x.png\", w: 2048, h: 1536}, // iPad Retina, landscape\n\t\t\t{name: \"Default-667h@2x.png\", w: 750, h: 1334}, // iPhone 6, portrait\n\t\t\t{name: \"Default-736h@3x.png\", w: 1242, h: 2208}, // iPhone 6 Plus, portrait\n\t\t\t{name: \"Default-736h-Landscape@3x.png\", w: 2208, h: 1242}, // iPhone 6 Plus, landscape\n\t\t];\n\n\t\tvar splashScreenPath = Path.combine(projectDirectory, \"Images.xcassets/LaunchImage.launchimage\");\n\t\tSystem.mkdir(splashScreenPath);\n\n\t\tfor (size in splashSizes)\n\t\t{\n\t\t\tvar match = false;\n\n\t\t\tfor (splashScreen in project.splashScreens)\n\t\t\t{\n\t\t\t\tif (splashScreen.width == size.w && splashScreen.height == size.h && Path.extension(splashScreen.path) == \"png\")\n\t\t\t\t{\n\t\t\t\t\tSystem.copyFile(splashScreen.path, Path.combine(splashScreenPath, size.name));\n\t\t\t\t\tmatch = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!match)\n\t\t\t{\n\t\t\t\tvar imagePath = Path.combine(splashScreenPath, size.name);\n\n\t\t\t\tif (!FileSystem.exists(imagePath))\n\t\t\t\t{\n\t\t\t\t\t#if (lime && lime_cffi && !macro)\n\t\t\t\t\tLog.info(\"\", \" - \\x1b[1mGenerating image:\\x1b[0m \" + imagePath);\n\n\t\t\t\t\tvar image = new Image(null, 0, 0, size.w, size.h, (0xFF << 24) | (project.window.background & 0xFFFFFF));\n\t\t\t\t\tvar bytes = image.encode(PNG);\n\n\t\t\t\t\tFile.saveBytes(imagePath, bytes);\n\t\t\t\t\t#end\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcontext.HAS_LAUNCH_IMAGE = true;\n\n\t\tSystem.mkdir(projectDirectory + \"/resources\");\n\t\tSystem.mkdir(projectDirectory + \"/haxe/build\");\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tvos/resources\", projectDirectory + \"/resources\", context, true, false);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tvos/PROJ/haxe\", projectDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", projectDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tvos/PROJ/Classes\", projectDirectory + \"/Classes\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tvos/PROJ/Images.xcassets\", projectDirectory + \"/Images.xcassets\", context);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"tvos/PROJ/PROJ-Entitlements.plist\", projectDirectory\n\t\t\t+ \"/\"\n\t\t\t+ project.app.file\n\t\t\t+ \"-Entitlements.plist\",\n\t\t\tcontext);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"tvos/PROJ/PROJ-Info.plist\", projectDirectory + \"/\" + project.app.file + \"-Info.plist\", context);\n\t\tSystem.copyFileTemplate(project.templatePaths, \"tvos/PROJ/PROJ-Prefix.pch\", projectDirectory + \"/\" + project.app.file + \"-Prefix.pch\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tvos/PROJ.xcodeproj\", targetDirectory + \"/\" + project.app.file + \".xcodeproj\", context);\n\n\t\t// SWFHelper.generateSWFClasses (project, projectDirectory + \"/haxe\");\n\n\t\tSystem.mkdir(projectDirectory + \"/lib\");\n\n\t\tfor (archID in 0...3)\n\t\t{\n\t\t\tvar arch = [\"arm64\", \"i386\", \"x86_64\"][archID];\n\n\t\t\tif (arch == \"arm64\" && !context.ARM64) continue;\n\n\t\t\tvar libExt = [\".appletvos-64.a\", \".appletvsim.a\", \".appletvsim-64.a\"][archID];\n\n\t\t\tSystem.mkdir(projectDirectory + \"/lib/\" + arch);\n\t\t\tSystem.mkdir(projectDirectory + \"/lib/\" + arch + \"-debug\");\n\n\t\t\tfor (ndll in project.ndlls)\n\t\t\t{\n\t\t\t\t// if (ndll.haxelib != null) {\n\n\t\t\t\tvar releaseLib = NDLL.getLibraryPath(ndll, \"AppleTV\", \"lib\", libExt);\n\t\t\t\tLog.info(\"releaseLib: \" + releaseLib);\n\t\t\t\tvar debugLib = NDLL.getLibraryPath(ndll, \"AppleTV\", \"lib\", libExt, true);\n\t\t\t\tvar releaseDest = projectDirectory + \"/lib/\" + arch + \"/lib\" + ndll.name + \".a\";\n\t\t\t\tLog.info(\"releaseDest: \" + releaseDest);\n\t\t\t\tvar debugDest = projectDirectory + \"/lib/\" + arch + \"-debug/lib\" + ndll.name + \".a\";\n\n\t\t\t\tif (!FileSystem.exists(releaseLib))\n\t\t\t\t{\n\t\t\t\t\treleaseLib = NDLL.getLibraryPath(ndll, \"AppleTV\", \"lib\", \".appletvos-64.a\");\n\t\t\t\t\tLog.info(\"alternative releaseLib: \" + releaseLib);\n\t\t\t\t\tdebugLib = NDLL.getLibraryPath(ndll, \"AppleTV\", \"lib\", \".appletvos-64.a\", true);\n\t\t\t\t}\n\n\t\t\t\tSystem.copyIfNewer(releaseLib, releaseDest);\n\n\t\t\t\tif (FileSystem.exists(debugLib) && debugLib != releaseLib)\n\t\t\t\t{\n\t\t\t\t\tSystem.copyIfNewer(debugLib, debugDest);\n\t\t\t\t}\n\t\t\t\telse if (FileSystem.exists(debugDest))\n\t\t\t\t{\n\t\t\t\t\tFileSystem.deleteFile(debugDest);\n\t\t\t\t}\n\n\t\t\t\t// }\n\t\t\t}\n\n\t\t\tfor (dependency in project.dependencies)\n\t\t\t{\n\t\t\t\tif (StringTools.endsWith(dependency.path, \".a\"))\n\t\t\t\t{\n\t\t\t\t\tvar fileName = Path.withoutDirectory(dependency.path);\n\n\t\t\t\t\tif (!StringTools.startsWith(fileName, \"lib\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tfileName = \"lib\" + fileName;\n\t\t\t\t\t}\n\n\t\t\t\t\tcopyIfNewer(dependency.path, projectDirectory + \"/lib/\" + arch + \"/\" + fileName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSystem.mkdir(projectDirectory + \"/assets\");\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tvar targetPath = Path.combine(projectDirectory + \"/assets/\", asset.resourceName);\n\n\t\t\t\t// var sourceAssetPath:String = projectDirectory + \"haxe/\" + asset.sourcePath;\n\n\t\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\t\tAssetHelper.copyAssetIfNewer(asset, targetPath);\n\n\t\t\t\t// System.mkdir (Path.directory (sourceAssetPath));\n\t\t\t\t// System.linkFile (flatAssetPath, sourceAssetPath, true, true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar targetPath = Path.combine(projectDirectory, asset.targetPath);\n\n\t\t\t\tSystem.mkdir(Path.directory(targetPath));\n\t\t\t\tAssetHelper.copyAsset(asset, targetPath, context);\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xcode\") && System.hostPlatform == MAC && command == \"update\")\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"open\", [targetDirectory + \"/\" + project.app.file + \".xcodeproj\"]);\n\t\t}\n\t}\n\n\t/*private function updateLaunchImage () {\n\n\t\tvar destination = buildDirectory + \"/ios\";\n\t\tSystem.mkdir (destination);\n\n\t\tvar has_launch_image = false;\n\t\tif (launchImages.length > 0) has_launch_image = true;\n\n\t\tfor (launchImage in launchImages) {\n\n\t\t\tvar splitPath = launchImage.name.split (\"/\");\n\t\t\tvar path = destination + \"/\" + splitPath[splitPath.length - 1];\n\t\t\tSystem.copyFile (launchImage.name, path, context, false);\n\n\t\t}\n\n\t\tcontext.HAS_LAUNCH_IMAGE = has_launch_image;\n\n\t}*/\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function trace():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n\nprivate typedef IconSize =\n{\n\tname:String,\n\tsize:Int,\n}\n\nprivate typedef SplashSize =\n{\n\tname:String,\n\tw:Int,\n\th:Int,\n}\n"
  },
  {
    "path": "tools/platforms/TizenPlatform.hx",
    "content": "package;\n\nimport hxp.HXML;\nimport hxp.Path;\nimport hxp.System;\nimport lime.tools.Architecture;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport lime.tools.TizenHelper;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass TizenPlatform extends PlatformTarget\n{\n\tprivate static var uuid:String = null;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tdefaults.architectures = [Architecture.ARMV6];\n\t\tdefaults.window.width = 0;\n\t\tdefaults.window.height = 0;\n\t\tdefaults.window.fullscreen = true;\n\t\tdefaults.window.requireShaders = true;\n\t\t= defaults.window.allowHighDPI = false;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"tizen.output-directory\", \"tizen\"));\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tvar destination = targetDirectory + \"/bin/\";\n\n\t\tvar arch = \"\";\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\tarch = \"-x86\";\n\t\t}\n\n\t\tfor (ndll in project.ndlls)\n\t\t{\n\t\t\tProjectHelper.copyLibrary(project, ndll, \"Tizen\", \"\", arch + \".so\", destination + \"lib/\", project.debug, \".so\");\n\t\t}\n\n\t\tvar hxml = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\tSystem.runCommand(\"\", \"haxe\", [hxml, \"-D\", \"tizen\"]);\n\n\t\tif (noOutput) return;\n\n\t\tvar args = [\"-Dtizen\", \"-DAPP_ID=\" + TizenHelper.getUUID(project)];\n\n\t\tif (project.targetFlags.exists(\"simulator\"))\n\t\t{\n\t\t\targs.push(\"-Dsimulator\");\n\t\t}\n\n\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", args);\n\t\tSystem.copyIfNewer(targetDirectory\n\t\t\t+ \"/obj/ApplicationMain\"\n\t\t\t+ (project.debug ? \"-debug\" : \"\")\n\t\t\t+ \".exe\",\n\t\t\ttargetDirectory\n\t\t\t+ \"/bin/CommandLineBuild/\"\n\t\t\t+ project.app.file\n\t\t\t+ \".exe\");\n\t\tTizenHelper.createPackage(project, targetDirectory + \"/bin/CommandLineBuild\", \"\");\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"Tizen\");\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = new HXML();\n\t\t\thxml.noOutput = true;\n\t\t\thxml.cpp = \"_\";\n\t\t\treturn context.HAXE_FLAGS + \"\\n\" + hxml.toString();\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tvar device = (command == \"rebuild\" || !targetFlags.exists(\"simulator\"));\n\t\tvar simulator = (command == \"rebuild\" || targetFlags.exists(\"simulator\"));\n\n\t\tvar commands:Array<Array<String>> = [];\n\n\t\tif (device) commands.push([\"-Dtizen\"]);\n\t\tif (simulator) commands.push([\"-Dtizen\", \"-Dsimulator\"]);\n\n\t\tCPPHelper.rebuild(project, commands);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tTizenHelper.install(project, targetDirectory + \"/bin/CommandLineBuild\");\n\t\tTizenHelper.launch(project);\n\t}\n\n\tpublic override function trace():Void\n\t{\n\t\tTizenHelper.trace(project);\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\tvar destination = targetDirectory + \"/bin/\";\n\t\tSystem.mkdir(destination);\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tasset.resourceName = \"../res/\" + asset.resourceName;\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tvar context = project.templateContext;\n\t\tcontext.CPP_DIR = targetDirectory + \"/obj\";\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\t\tcontext.APP_PACKAGE = TizenHelper.getUUID(project);\n\t\tcontext.SIMULATOR = project.targetFlags.exists(\"simulator\");\n\n\t\tSystem.mkdir(destination + \"shared/res/screen-density-xhigh\");\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\tif (IconHelper.createIcon(icons, 117, 117, Path.combine(destination + \"shared/res/screen-density-xhigh\", \"mainmenu.png\")))\n\t\t{\n\t\t\tcontext.APP_ICON = \"mainmenu.png\";\n\t\t}\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tizen/template\", destination, context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"tizen/hxml\", targetDirectory + \"/haxe\", context);\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(destination + \"res/\", asset.targetPath);\n\n\t\t\tSystem.mkdir(Path.directory(path));\n\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tif (asset.targetPath == \"/appinfo.json\")\n\t\t\t\t{\n\t\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// going to root directory now, but should it be a forced \"assets\" folder later?\n\n\t\t\t\t\tAssetHelper.copyAssetIfNewer(asset, path);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t}\n\t\t}\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n"
  },
  {
    "path": "tools/platforms/WebAssemblyPlatform.hx",
    "content": "package;\n\nimport haxe.Json;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.NDLL;\nimport hxp.Path;\nimport hxp.System;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.HTML5Helper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.Orientation;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.FileSystem;\n\nclass WebAssemblyPlatform extends PlatformTarget\n{\n\tprivate var dependencyPath:String;\n\tprivate var outputFile:String;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tdefaults.window.fps = 60;\n\t\tdefaults.window.allowHighDPI = false;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"webassembly.output-directory\", \"webassembly\"));\n\t\tdependencyPath = project.config.getString(\"webassembly.dependency-path\", \"lib\");\n\t\toutputFile = targetDirectory + \"/bin/\" + project.app.file + \".js\";\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tvar sdkPath:String = null;\n\n\t\tif (project.defines.exists(\"EMSCRIPTEN_SDK\"))\n\t\t{\n\t\t\tsdkPath = project.defines.get(\"EMSCRIPTEN_SDK\");\n\t\t}\n\t\telse if (project.environment.exists(\"EMSCRIPTEN_SDK\"))\n\t\t{\n\t\t\tsdkPath = project.environment.get(\"EMSCRIPTEN_SDK\");\n\t\t}\n\n\t\tif (sdkPath == null)\n\t\t{\n\t\t\tLog.error(\"You must define EMSCRIPTEN_SDK with the path to your Emscripten SDK.\");\n\t\t}\n\n\t\tvar hxml = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\t\tvar args = [hxml, \"-D\", \"webassembly\", \"-D\", \"wasm\", \"-D\", \"emscripten\", \"-D\", \"webgl\", \"-D\", \"static_link\"];\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targs.push(\"-D\");\n\t\t\targs.push(\"verbose\");\n\t\t}\n\n\t\tSystem.runCommand(\"\", \"haxe\", args);\n\n\t\tif (noOutput) return;\n\n\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", [\"-Dwebassembly\", \"-Dwasm\", \"-Demscripten\", \"-Dwebgl\", \"-Dstatic_link\"]);\n\t\t// CPPHelper.compile(project, targetDirectory + \"/obj\", [\"-Demscripten\", \"-Dwebgl\", \"-Dstatic_link\"], \"BuildMain.xml\");\n\n\t\tproject.path(sdkPath);\n\n\t\tSystem.runCommand(\"\", \"emcc\", [\"-c\", targetDirectory + \"/obj/Main.cpp\", \"-o\", targetDirectory + \"/obj/Main.o\"], true, false, true);\n\n\t\targs = [\"Main.o\"];\n\n\t\tfor (ndll in project.ndlls)\n\t\t{\n\t\t\tvar path = NDLL.getLibraryPath(ndll, \"Emscripten\", \"lib\", \".a\", project.debug);\n\t\t\targs.push(path);\n\t\t}\n\n\t\tvar json = Json.parse(File.getContent(Haxelib.getPath(new Haxelib(\"hxcpp\"), true) + \"/haxelib.json\"));\n\t\tvar prefix = \"\";\n\n\t\tvar version = Std.string(json.version);\n\t\tvar versionSplit = version.split(\".\");\n\n\t\twhile (versionSplit.length > 2)\n\t\t\tversionSplit.pop();\n\n\t\tif (Std.parseFloat(versionSplit.join(\".\")) > 3.1)\n\t\t{\n\t\t\tprefix = \"lib\";\n\t\t}\n\n\t\targs = args.concat([\n\t\t\tprefix + \"ApplicationMain\" + (project.debug ? \"-debug\" : \"\") + \".a\",\n\t\t\t\"-o\",\n\t\t\t\"ApplicationMain.o\"\n\t\t]);\n\n\t\tif (!project.targetFlags.exists(\"asmjs\"))\n\t\t{\n\t\t\targs.push(\"-s\");\n\t\t\targs.push(\"WASM=1\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\targs.push(\"-s\");\n\t\t\targs.push(\"ASM_JS=1\");\n\t\t}\n\n\t\targs.push(\"-s\");\n\t\targs.push(\"NO_EXIT_RUNTIME=1\");\n\n\t\targs.push(\"-s\");\n\t\targs.push(\"USE_SDL=2\");\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (dependency.name != \"\")\n\t\t\t{\n\t\t\t\targs.push(\"-l\" + dependency.name);\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"final\") || project.defines.exists(\"disable-exception-catching\") || project.targetFlags.exists(\"disable-exception-catching\"))\n\t\t{\n\t\t\targs.push(\"-s\");\n\t\t\targs.push(\"DISABLE_EXCEPTION_CATCHING=1\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\targs.push(\"-gsource-map\");\n\t\t\targs.push(\"-s\");\n\t\t\targs.push(\"DISABLE_EXCEPTION_CATCHING=0\");\n\t\t\targs.push(\"-s\");\n\t\t\targs.push(\"NO_DISABLE_EXCEPTION_CATCHING=1\");\n\t\t\targs.push(\"-s\");\n\t\t\targs.push(\"ASSERTIONS=1\");\n\t\t\t// args.push(\"-s\");\n\t\t\t// args.push(\"ASSERTIONS=2\");\n\t\t\t// args.push(\"-s\");\n\t\t\t// args.push(\"STACK_OVERFLOW_CHECK=2\");\n\t\t\t// args.push(\"-s\");\n\t\t\t// args.push(\"DEMANGLE_SUPPORT=1\");\n\t\t}\n\n\t\t// set initial size\n\t\t// args.push(\"-s\");\n\t\t// args.push(\"INITIAL_MEMORY=32MB\");\n\n\t\targs.push(\"-s\");\n\t\targs.push(\"STACK_SIZE=1MB\");\n\n\t\t// args.push(\"-s\");\n\t\t// args.push(\"SAFE_HEAP=1\");\n\n\t\t// if (project.targetFlags.exists(\"final\"))\n\t\t// {\n\t\t// \targs.push(\"-O3\");\n\t\t// }\n\t\t// else if (!project.debug)\n\t\t// {\n\t\t// \t// args.push (\"-s\");\n\t\t// \t// args.push (\"OUTLINING_LIMIT=70000\");\n\t\t// \targs.push(\"-O2\");\n\t\t// }\n\t\t// else\n\t\t// {\n\t\t// \targs.push(\"-O1\");\n\t\t// }\n\n\t\t// https://github.com/HaxeFoundation/hxcpp/issues/987\n\t\targs.push(\"-O0\");\n\n\t\targs.push(\"-s\");\n\t\targs.push(\"ALLOW_MEMORY_GROWTH=1\");\n\n\t\tif (project.targetFlags.exists(\"minify\"))\n\t\t{\n\t\t\t// 02 enables minification\n\n\t\t\t// args.push (\"--minify\");\n\t\t\t// args.push (\"1\");\n\t\t\t// args.push (\"--closure\");\n\t\t\t// args.push (\"1\");\n\t\t}\n\n\t\t// args.push (\"--memory-init-file\");\n\t\t// args.push (\"1\");\n\t\t// args.push (\"--jcache\");\n\t\t// args.push (\"-g\");\n\n\t\tif (FileSystem.exists(targetDirectory + \"/obj/assets\"))\n\t\t{\n\t\t\targs.push(\"--preload-file\");\n\t\t\targs.push(\"assets\");\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targs.push(\"-v\");\n\t\t}\n\n\t\t// if (project.targetFlags.exists (\"compress\")) {\n\t\t//\n\t\t// args.push (\"--compression\");\n\t\t// args.push (System.findTemplate (project.templatePaths, \"bin/utils/lzma/compress.exe\") + \",\" + System.findTemplate (project.templatePaths, \"resources/lzma-decoder.js\") + \",LZMA.decompress\");\n\t\t// args.push (\"haxelib run openfl compress,\" + System.findTemplate (project.templatePaths, \"resources/lzma-decoder.js\") + \",LZMA.decompress\");\n\t\t// args.push (\"-o\");\n\t\t// args.push (\"../bin/index.html\");\n\t\t//\n\t\t// } else {\n\n\t\targs.push(\"-o\");\n\t\targs.push(\"../bin/\" + project.app.file + \".js\");\n\n\t\t// }\n\n\t\t// args.push (\"../bin/index.html\");\n\n\t\tSystem.runCommand(targetDirectory + \"/obj\", \"emcc\", args, true, false, true);\n\n\t\tif (FileSystem.exists(outputFile))\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tcontext.SOURCE_FILE = File.getContent(outputFile);\n\t\t\tcontext.embeddedLibraries = [];\n\n\t\t\tfor (dependency in project.dependencies)\n\t\t\t{\n\t\t\t\tif (dependency.embed && StringTools.endsWith(dependency.path, \".js\") && FileSystem.exists(dependency.path))\n\t\t\t\t{\n\t\t\t\t\tvar script = File.getContent(dependency.path);\n\t\t\t\t\tcontext.embeddedLibraries.push(script);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSystem.copyFileTemplate(project.templatePaths, \"webassembly/output.js\", outputFile, context);\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"minify\"))\n\t\t{\n\t\t\tHTML5Helper.minify(project, targetDirectory + \"/bin/\" + project.app.file + \".js\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"compress\"))\n\t\t{\n\t\t\tif (FileSystem.exists(targetDirectory + \"/bin/\" + project.app.file + \".data\"))\n\t\t\t{\n\t\t\t\t// var byteArray = ByteArray.readFile (targetDirectory + \"/bin/\" + project.app.file + \".data\");\n\t\t\t\t// byteArray.compress (CompressionAlgorithm.GZIP);\n\t\t\t\t// File.saveBytes (targetDirectory + \"/bin/\" + project.app.file + \".data.compress\", byteArray);\n\t\t\t}\n\n\t\t\t// var byteArray = ByteArray.readFile (targetDirectory + \"/bin/\" + project.app.file + \".js\");\n\t\t\t// byteArray.compress (CompressionAlgorithm.GZIP);\n\t\t\t// File.saveBytes (targetDirectory + \"/bin/\" + project.app.file + \".js.compress\", byteArray);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFile.saveContent(targetDirectory + \"/bin/.htaccess\", \"SetOutputFilter DEFLATE\");\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"WebAssembly\");\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(outputFile);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\thxml.cpp = \"_\";\n\t\t\thxml.define(\"webgl\");\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tCPPHelper.rebuild(project, [[\"-Dwebassembly\", \"-Dwasm\", \"-Demscripten\", \"-Dstatic_link\"]]);\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tHTML5Helper.launch(project, targetDirectory + \"/bin\");\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\t// project = project.clone ();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\t// for (asset in project.assets)\n\t\t// {\n\t\t// \tasset.resourceName = \"assets/\" + asset.resourceName;\n\t\t// }\n\n\t\tvar destination = targetDirectory + \"/bin/\";\n\t\tSystem.mkdir(destination);\n\n\t\t// for (asset in project.assets) {\n\t\t//\n\t\t// if (asset.type == AssetType.FONT) {\n\t\t//\n\t\t// project.haxeflags.push (HTML5Helper.generateFontData (project, asset));\n\t\t//\n\t\t// }\n\t\t//\n\t\t// }\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tvar context = project.templateContext;\n\n\t\tcontext.WIN_FLASHBACKGROUND = StringTools.hex(project.window.background, 6);\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\t\tcontext.OUTPUT_FILE = outputFile;\n\t\tcontext.CPP_DIR = targetDirectory + \"/obj\";\n\t\tcontext.USE_COMPRESSION = project.targetFlags.exists(\"compress\");\n\n\t\tcontext.favicons = [];\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\t// if (IconHelper.createWindowsIcon (icons, Path.combine (destination, \"favicon.ico\"))) {\n\t\t//\n\t\t// context.favicons.push ({ rel: \"icon\", type: \"image/x-icon\", href: \"./favicon.ico\" });\n\t\t//\n\t\t// }\n\n\t\tif (IconHelper.createIcon(icons, 192, 192, Path.combine(destination, \"favicon.png\")))\n\t\t{\n\t\t\tcontext.favicons.push({rel: \"shortcut icon\", type: \"image/png\", href: \"./favicon.png\"});\n\t\t}\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (!dependency.embed)\n\t\t\t{\n\t\t\t\tif (StringTools.endsWith(dependency.name, \".js\"))\n\t\t\t\t{\n\t\t\t\t\tcontext.linkedLibraries.push(dependency.name);\n\t\t\t\t}\n\t\t\t\telse if (StringTools.endsWith(dependency.path, \".js\") && FileSystem.exists(dependency.path))\n\t\t\t\t{\n\t\t\t\t\tvar name = Path.withoutDirectory(dependency.path);\n\n\t\t\t\t\tcontext.linkedLibraries.push(\"./\" + dependencyPath + \"/\" + name);\n\t\t\t\t\tcopyIfNewer(dependency.path, Path.combine(destination, Path.combine(dependencyPath, name)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(targetDirectory + \"/obj/assets\", asset.targetPath);\n\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\t// if (asset.type != AssetType.FONT) {\n\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAssetIfNewer(asset, path);\n\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"webassembly/template\", destination, context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"webassembly/hxml\", targetDirectory + \"/haxe\", context);\n\t\t// ProjectHelper.recursiveSmartCopyTemplate(project, \"webassembly/cpp\", targetDirectory + \"/obj\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"cpp/static\", targetDirectory + \"/obj\", context);\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\tif (asset.type == AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t}\n\t\t}\n\t}\n\n\t@ignore public override function install():Void {}\n\n\t@ignore public override function trace():Void {}\n\n\t@ignore public override function uninstall():Void {}\n}\n"
  },
  {
    "path": "tools/platforms/WindowsPlatform.hx",
    "content": "package;\n\nimport lime.tools.HashlinkHelper;\nimport hxp.Haxelib;\nimport hxp.HXML;\nimport hxp.Log;\nimport hxp.Path;\nimport hxp.NDLL;\nimport hxp.System;\nimport lime.tools.Architecture;\nimport lime.tools.Asset;\nimport lime.tools.AssetHelper;\nimport lime.tools.AssetType;\nimport lime.tools.CPPHelper;\nimport lime.tools.CSHelper;\nimport lime.tools.DeploymentHelper;\nimport lime.tools.GUID;\nimport lime.tools.HTML5Helper;\nimport lime.tools.HXProject;\nimport lime.tools.Icon;\nimport lime.tools.IconHelper;\nimport lime.tools.JavaHelper;\nimport lime.tools.ModuleHelper;\nimport lime.tools.NekoHelper;\nimport lime.tools.NodeJSHelper;\nimport lime.tools.Orientation;\nimport lime.tools.Platform;\nimport lime.tools.PlatformTarget;\nimport lime.tools.ProjectHelper;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass WindowsPlatform extends PlatformTarget\n{\n\tprivate var applicationDirectory:String;\n\tprivate var executablePath:String;\n\tprivate var is64:Bool;\n\tprivate var targetType:String;\n\tprivate var outputFile:String;\n\n\tpublic function new(command:String, _project:HXProject, targetFlags:Map<String, String>)\n\t{\n\t\tsuper(command, _project, targetFlags);\n\n\t\tvar defaults = new HXProject();\n\n\t\tdefaults.meta =\n\t\t\t{\n\t\t\t\ttitle: \"MyApplication\",\n\t\t\t\tdescription: \"\",\n\t\t\t\tpackageName: \"com.example.myapp\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t\tcompany: \"\",\n\t\t\t\tcompanyUrl: \"\",\n\t\t\t\tbuildNumber: null,\n\t\t\t\tcompanyId: \"\"\n\t\t\t};\n\n\t\tdefaults.app =\n\t\t\t{\n\t\t\t\tmain: \"Main\",\n\t\t\t\tfile: \"MyApplication\",\n\t\t\t\tpath: \"bin\",\n\t\t\t\tpreloader: \"\",\n\t\t\t\tswfVersion: 17,\n\t\t\t\turl: \"\",\n\t\t\t\tinit: null\n\t\t\t};\n\n\t\tdefaults.window =\n\t\t\t{\n\t\t\t\twidth: 800,\n\t\t\t\theight: 600,\n\t\t\t\tparameters: \"{}\",\n\t\t\t\tbackground: 0xFFFFFF,\n\t\t\t\tfps: 30,\n\t\t\t\thardware: true,\n\t\t\t\tdisplay: 0,\n\t\t\t\tresizable: true,\n\t\t\t\tborderless: false,\n\t\t\t\torientation: Orientation.AUTO,\n\t\t\t\tvsync: false,\n\t\t\t\tfullscreen: false,\n\t\t\t\tallowHighDPI: true,\n\t\t\t\talwaysOnTop: false,\n\t\t\t\tantialiasing: 0,\n\t\t\t\tallowShaders: true,\n\t\t\t\trequireShaders: false,\n\t\t\t\tdepthBuffer: true,\n\t\t\t\tstencilBuffer: true,\n\t\t\t\tcolorDepth: 32,\n\t\t\t\tmaximized: false,\n\t\t\t\tminimized: false,\n\t\t\t\thidden: false,\n\t\t\t\ttitle: \"\"\n\t\t\t};\n\n\t\tif (project.targetFlags.exists(\"uwp\") || project.targetFlags.exists(\"winjs\"))\n\t\t{\n\t\t\tdefaults.window.width = 0;\n\t\t\tdefaults.window.height = 0;\n\t\t\tdefaults.window.fps = 60;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch (System.hostArchitecture)\n\t\t\t{\n\t\t\t\tcase ARMV6:\n\t\t\t\t\tdefaults.architectures = [ARMV6];\n\t\t\t\tcase ARMV7:\n\t\t\t\t\tdefaults.architectures = [ARMV7];\n\t\t\t\tcase X86:\n\t\t\t\t\tdefaults.architectures = [X86];\n\t\t\t\tcase X64:\n\t\t\t\t\tdefaults.architectures = [X64];\n\t\t\t\tdefault:\n\t\t\t\t\tdefaults.architectures = [];\n\t\t\t}\n\t\t}\n\n\t\tdefaults.window.allowHighDPI = false;\n\n\t\tfor (i in 1...project.windows.length)\n\t\t{\n\t\t\tdefaults.windows.push(defaults.window);\n\t\t}\n\n\t\tdefaults.merge(project);\n\t\tproject = defaults;\n\n\t\tfor (excludeArchitecture in project.excludeArchitectures)\n\t\t{\n\t\t\tproject.architectures.remove(excludeArchitecture);\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"uwp\") || project.targetFlags.exists(\"winjs\"))\n\t\t{\n\t\t\ttargetType = \"winjs\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"neko\"))\n\t\t{\n\t\t\ttargetType = \"neko\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"hl\") || targetFlags.exists(\"hlc\"))\n\t\t{\n\t\t\ttargetType = \"hl\";\n\t\t\tis64 = !project.flags.exists(\"32\") && !project.flags.exists(\"x86_32\");\n\t\t\tvar hlVer = project.haxedefs.get(\"hl-ver\");\n\t\t\tif (hlVer == null)\n\t\t\t{\n\t\t\t\tvar hlPath = project.defines.get(\"HL_PATH\");\n\t\t\t\tif (hlPath == null)\n\t\t\t\t{\n\t\t\t\t\t// Haxe's default target version for HashLink may be\n\t\t\t\t\t// different (newer even) than the build of HashLink that\n\t\t\t\t\t// is bundled with Lime. if using Lime's bundled HashLink,\n\t\t\t\t\t// set hl-ver to the correct version\n\t\t\t\t\tproject.haxedefs.set(\"hl-ver\", HashlinkHelper.BUNDLED_HL_VER);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (project.targetFlags.exists(\"cppia\"))\n\t\t{\n\t\t\ttargetType = \"cppia\";\n\t\t\tis64 = true;\n\t\t}\n\t\telse if (project.targetFlags.exists(\"nodejs\"))\n\t\t{\n\t\t\ttargetType = \"nodejs\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"cs\"))\n\t\t{\n\t\t\ttargetType = \"cs\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"java\"))\n\t\t{\n\t\t\ttargetType = \"java\";\n\t\t}\n\t\telse if (project.targetFlags.exists(\"winrt\"))\n\t\t{\n\t\t\ttargetType = \"winrt\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttargetType = \"cpp\";\n\t\t}\n\n\t\tfor (architecture in project.architectures)\n\t\t{\n\t\t\tif (architecture == Architecture.X64)\n\t\t\t{\n\t\t\t\tif ((targetType == \"cpp\" || targetType == \"winrt\"))\n\t\t\t\t{\n\t\t\t\t\tis64 = true;\n\t\t\t\t}\n\t\t\t\telse if (targetType == \"neko\")\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvar process = new Process(\"haxe\", [\"-version\"]);\n\t\t\t\t\t\tvar haxeVersion = StringTools.trim(process.stderr.readAll().toString());\n\t\t\t\t\t\tif (haxeVersion == \"\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thaxeVersion = StringTools.trim(process.stdout.readAll().toString());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocess.close();\n\n\t\t\t\t\t\tif (Std.parseInt(haxeVersion.split(\".\")[0]) >= 4)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tis64 = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar defaultTargetDirectory = switch (targetType)\n\t\t{\n\t\t\tcase \"cpp\": \"windows\";\n\t\t\tcase \"hl\": project.targetFlags.exists(\"hlc\") ? \"hlc\" : targetType;\n\t\t\tdefault: targetType;\n\t\t}\n\t\ttargetDirectory = Path.combine(project.app.path, project.config.getString(\"windows.output-directory\", defaultTargetDirectory));\n\t\ttargetDirectory = StringTools.replace(targetDirectory, \"arch64\", is64 ? \"64\" : \"\");\n\n\t\tif (targetType == \"winjs\")\n\t\t{\n\t\t\toutputFile = targetDirectory + \"/source/js/\" + project.app.file + \".js\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tapplicationDirectory = targetDirectory + \"/bin/\";\n\t\t\texecutablePath = applicationDirectory + project.app.file + \".exe\";\n\t\t}\n\t}\n\n\tpublic override function build():Void\n\t{\n\t\tvar hxml = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\tSystem.mkdir(targetDirectory);\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\tif (targetType == \"winjs\")\n\t\t{\n\t\t\tModuleHelper.buildModules(project, targetDirectory, targetDirectory);\n\n\t\t\tif (project.app.main != null)\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\t\t// start by finding visual studio\n\t\t\t\tvar programFilesX86 = Sys.getEnv(\"ProgramFiles(x86)\");\n\t\t\t\tvar vswhereCommand = programFilesX86 + \"\\\\Microsoft Visual Studio\\\\Installer\\\\vswhere.exe\";\n\t\t\t\tvar vswhereOutput = System.runProcess(\"\", vswhereCommand, [\"-latest\", \"-products\", \"*\", \"-requires\", \"Microsoft.Component.MSBuild\", \"-property\", \"installationPath\"]);\n\t\t\t\tvar visualStudioPath = StringTools.trim(vswhereOutput);\n\t\t\t\t// then, find MSBuild inside visual studio\n\t\t\t\tvar msBuildPath = visualStudioPath + \"\\\\MSBuild\\\\Current\\\\Bin\\\\MSBuild.exe\";\n\t\t\t\tif (!FileSystem.exists(msBuildPath))\n\t\t\t\t{\n\t\t\t\t\t// fallback for VS 2017, which didn't use Current\n\t\t\t\t\tmsBuildPath = visualStudioPath + \"\\\\MSBuild\\\\15.0\\\\Bin\\\\MSBuild.exe\";\n\t\t\t\t\tif (!FileSystem.exists(msBuildPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(\"MSBuild not found\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar args = [\n\t\t\t\t\tPath.tryFullPath(targetDirectory + \"/source/\" + project.app.file + \".jsproj\"),\n\t\t\t\t\t\"/p:Configuration=Release\"\n\t\t\t\t];\n\n\t\t\t\tSystem.runCommand(\"\", msBuildPath, args);\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tif (project.targetFlags.exists(\"webgl\"))\n\t\t\t\t{\n\t\t\t\t\tSystem.copyFile(targetDirectory + \"/source/ApplicationMain.js\", outputFile);\n\t\t\t\t}\n\n\t\t\t\tif (project.modules.iterator().hasNext())\n\t\t\t\t{\n\t\t\t\t\tModuleHelper.patchFile(outputFile);\n\t\t\t\t}\n\n\t\t\t\tif (project.targetFlags.exists(\"minify\") || buildType == \"final\")\n\t\t\t\t{\n\t\t\t\t\tHTML5Helper.minify(project, targetDirectory + outputFile);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (dependency in project.dependencies)\n\t\t\t{\n\t\t\t\tif (StringTools.endsWith(dependency.path, \".dll\"))\n\t\t\t\t{\n\t\t\t\t\tvar fileName = Path.withoutDirectory(dependency.path);\n\t\t\t\t\tcopyIfNewer(dependency.path, applicationDirectory + \"/\" + fileName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetType == \"winrt\")\n\t\t\t{\n\t\t\t\tif (!project.targetFlags.exists(\"static\"))\n\t\t\t\t{\n\t\t\t\t\tfor (ndll in project.ndlls)\n\t\t\t\t\t{\n\t\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"WinRT\" + (is64 ? \"64\" : \"\"), \"\",\n\t\t\t\t\t\t\t(ndll.haxelib != null && (ndll.haxelib.name == \"hxcpp\" || ndll.haxelib.name == \"hxlibc\")) ? \".dll\" : \".ndll\",\n\t\t\t\t\t\t\tapplicationDirectory, project.debug, null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!project.targetFlags.exists(\"static\") || targetType != \"cpp\")\n\t\t\t{\n\t\t\t\tvar targetSuffix = (targetType == \"hl\") ? \".hdll\" : null;\n\n\t\t\t\tfor (ndll in project.ndlls)\n\t\t\t\t{\n\t\t\t\t\t// TODO: Support single binary for HashLink\n\t\t\t\t\tif (targetType == \"hl\")\n\t\t\t\t\t{\n\t\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Windows\" + (is64 ? \"64\" : \"\"), \"\", \".hdll\", applicationDirectory, project.debug,\n\t\t\t\t\t\t\ttargetSuffix);\n\t\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Windows\" + (is64 ? \"64\" : \"\"), \"\", \".lib\", applicationDirectory, project.debug,\n\t\t\t\t\t\t\t\".lib\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tProjectHelper.copyLibrary(project, ndll, \"Windows\" + (is64 ? \"64\" : \"\"), \"\",\n\t\t\t\t\t\t\t(ndll.haxelib != null && (ndll.haxelib.name == \"hxcpp\" || ndll.haxelib.name == \"hxlibc\")) ? \".dll\" : \".ndll\",\n\t\t\t\t\t\t\tapplicationDirectory, project.debug, targetSuffix);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// IconHelper.createIcon (project.icons, 32, 32, Path.combine (applicationDirectory, \"icon.png\"));\n\n\t\t\tif (targetType == \"neko\")\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tvar iconPath = Path.combine(applicationDirectory, \"icon.ico\");\n\n\t\t\t\tif (!IconHelper.createWindowsIcon(icons, iconPath))\n\t\t\t\t{\n\t\t\t\t\ticonPath = null;\n\t\t\t\t}\n\n\t\t\t\tNekoHelper.createWindowsExecutable(project.templatePaths, targetDirectory + \"/obj/ApplicationMain.n\", executablePath, iconPath);\n\t\t\t\tNekoHelper.copyLibraries(project.templatePaths, \"windows\" + (is64 ? \"64\" : \"\"), applicationDirectory);\n\t\t\t}\n\t\t\telse if (targetType == \"hl\")\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tHashlinkHelper.copyHashlink(project, targetDirectory, applicationDirectory, executablePath, is64);\n\n\t\t\t\tif (project.targetFlags.exists(\"hlc\"))\n\t\t\t\t{\n\t\t\t\t\tvar command:Array<String> = null;\n\t\t\t\t\tif (project.targetFlags.exists(\"gcc\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tcommand = [\"gcc\", \"-O3\", \"-o\", executablePath, \"-std=c11\", \"-Wl,-subsystem,windows\", \"-I\", Path.combine(targetDirectory, \"obj\"), Path.combine(targetDirectory, \"obj/ApplicationMain.c\"), \"C:/Windows/System32/dbghelp.dll\"];\n\t\t\t\t\t\tfor (file in System.readDirectory(applicationDirectory))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch Path.extension(file)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase \"dll\", \"hdll\":\n\t\t\t\t\t\t\t\t\t// ensure the executable knows about every library\n\t\t\t\t\t\t\t\t\tcommand.push(file);\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// start by finding visual studio\n\t\t\t\t\t\tvar programFilesX86 = Sys.getEnv(\"ProgramFiles(x86)\");\n\t\t\t\t\t\tvar vswhereCommand = programFilesX86 + \"\\\\Microsoft Visual Studio\\\\Installer\\\\vswhere.exe\";\n\t\t\t\t\t\tvar vswhereOutput = System.runProcess(\"\", vswhereCommand, [\"-latest\", \"-products\", \"*\", \"-requires\", \"Microsoft.VisualStudio.Component.VC.Tools.x86.x64\", \"-property\", \"installationPath\"]);\n\t\t\t\t\t\tvar visualStudioPath = StringTools.trim(vswhereOutput);\n\t\t\t\t\t\tvar vcvarsallPath = visualStudioPath + \"\\\\VC\\\\Auxiliary\\\\Build\\\\vcvarsall.bat\";\n\t\t\t\t\t\t// this command sets up the environment variables and things that visual studio requires\n\t\t\t\t\t\tvar vcvarsallCommand = [vcvarsallPath, \"x64\"].map(function(arg:String):String { return ~/([&|\\(\\)<>\\^ ])/g.replace(arg, \"^$1\"); });\n\t\t\t\t\t\t// this command runs the cl.exe c compiler from visual studio\n\t\t\t\t\t\tvar clCommand = [\"cl.exe\", \"/Ox\", \"/Fe:\" + executablePath, \"-I\", Path.combine(targetDirectory, \"obj\"), Path.combine(targetDirectory, \"obj/ApplicationMain.c\")];\n\t\t\t\t\t\tfor (file in System.readDirectory(applicationDirectory))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch Path.extension(file)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase \"lib\":\n\t\t\t\t\t\t\t\t\t// ensure the executable knows about every library\n\t\t\t\t\t\t\t\t\tclCommand.push(file);\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclCommand.push(\"/link\");\n\t\t\t\t\t\tclCommand.push(\"/subsystem:windows\");\n\t\t\t\t\t\tclCommand = clCommand.map(function(arg:String):String { return ~/([&|\\(\\)<>\\^ ])/g.replace(arg, \"^$1\"); });\n\t\t\t\t\t\t// combine both commands into one\n\t\t\t\t\t\tcommand = [\"cmd.exe\", \"/s\", \"/c\", vcvarsallCommand.join(\" \") + \" && \" + clCommand.join(\" \")];\n\t\t\t\t\t}\n\t\t\t\t\tSystem.runCommand(\"\", command.shift(), command);\n\t\t\t\t}\n\n\t\t\t\tfor (file in System.readDirectory(applicationDirectory))\n\t\t\t\t{\n\t\t\t\t\tswitch Path.extension(file)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"lib\":\n\t\t\t\t\t\t\t// lib files required only for hlc compilation\n\t\t\t\t\t\t\tSystem.deleteFile(file);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar iconPath = Path.combine(applicationDirectory, \"icon.ico\");\n\n\t\t\t\tif (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS)\n\t\t\t\t{\n\t\t\t\t\tvar templates = [Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)) + \"/templates\"].concat(project.templatePaths);\n\t\t\t\t\tSystem.runCommand(\"\", System.findTemplate(templates, \"bin/ReplaceVistaIcon.exe\"), [executablePath, iconPath, \"1\"], true, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (targetType == \"cppia\")\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tSystem.copyFile(Path.combine(Haxelib.getPath(new Haxelib(\"hxcpp\")), \"bin/Windows64/Cppia.exe\"), executablePath);\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain.cppia\", Path.combine(applicationDirectory, \"script.cppia\"));\n\n\t\t\t\tvar iconPath = Path.combine(applicationDirectory, \"icon.ico\");\n\n\t\t\t\tif (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS)\n\t\t\t\t{\n\t\t\t\t\tvar templates = [Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)) + \"/templates\"].concat(project.templatePaths);\n\t\t\t\t\tSystem.runCommand(\"\", System.findTemplate(templates, \"bin/ReplaceVistaIcon.exe\"), [executablePath, iconPath, \"1\"], true, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (targetType == \"nodejs\")\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\t// NekoHelper.createExecutable (project.templatePaths, \"windows\" + (is64 ? \"64\" : \"\"), targetDirectory + \"/obj/ApplicationMain.n\", executablePath);\n\t\t\t\t// NekoHelper.copyLibraries (project.templatePaths, \"windows\" + (is64 ? \"64\" : \"\"), applicationDirectory);\n\t\t\t}\n\t\t\telse if (targetType == \"cs\")\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml]);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tCSHelper.copySourceFiles(project.templatePaths, targetDirectory + \"/obj/src\");\n\t\t\t\tvar txtPath = targetDirectory + \"/obj/hxcs_build.txt\";\n\t\t\t\tCSHelper.addSourceFiles(txtPath, CSHelper.ndllSourceFiles);\n\t\t\t\tCSHelper.addGUID(txtPath, GUID.uuid());\n\t\t\t\tCSHelper.compile(project, targetDirectory + \"/obj\", applicationDirectory + project.app.file, \"x86\", \"desktop\");\n\t\t\t}\n\t\t\telse if (targetType == \"java\")\n\t\t\t{\n\t\t\t\tvar libPath = Path.combine(Haxelib.getPath(new Haxelib(\"lime\")), \"templates/java/lib/\");\n\n\t\t\t\tSystem.runCommand(\"\", \"haxe\", [hxml, \"-java-lib\", libPath + \"disruptor.jar\", \"-java-lib\", libPath + \"lwjgl.jar\"]);\n\t\t\t\t// System.runCommand (\"\", \"haxe\", [ hxml ]);\n\n\t\t\t\tif (noOutput) return;\n\n\t\t\t\tvar haxeVersion = project.environment.get(\"haxe_ver\");\n\t\t\t\tvar haxeVersionString = \"3404\";\n\n\t\t\t\tif (haxeVersion.length > 4)\n\t\t\t\t{\n\t\t\t\t\thaxeVersionString = haxeVersion.charAt(0)\n\t\t\t\t\t\t+ haxeVersion.charAt(2)\n\t\t\t\t\t\t+ (haxeVersion.length == 5 ? \"0\" + haxeVersion.charAt(4) : haxeVersion.charAt(4) + haxeVersion.charAt(5));\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(targetDirectory + \"/obj\", \"haxelib\", [\"run\", \"hxjava\", \"hxjava_build.txt\", \"--haxe-version\", haxeVersionString]);\n\t\t\t\tSystem.recursiveCopy(targetDirectory + \"/obj/lib\", Path.combine(applicationDirectory, \"lib\"));\n\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-Debug\" : \"\") + \".jar\",\n\t\t\t\t\tPath.combine(applicationDirectory, project.app.file + \".jar\"));\n\t\t\t\tJavaHelper.copyLibraries(project.templatePaths, \"Windows\" + (is64 ? \"64\" : \"\"), applicationDirectory);\n\t\t\t}\n\t\t\telse if (targetType == \"winrt\")\n\t\t\t{\n\t\t\t\tvar haxeArgs:Array<String> = [hxml];\n\t\t\t\tvar flags:Array<String> = [];\n\n\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\thaxeArgs.push(\"winrt\");\n\t\t\t\tflags.push(\"-Dwinrt\");\n\n\t\t\t\t// TODO: ARM support\n\n\t\t\t\tif (is64)\n\t\t\t\t{\n\t\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\t\thaxeArgs.push(\"HXCPP_M64\");\n\t\t\t\t\tflags.push(\"-DHXCPP_M64\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tflags.push(\"-DHXCPP_M32\");\n\t\t\t\t}\n\n\t\t\t\tif (!project.environment.exists(\"SHOW_CONSOLE\"))\n\t\t\t\t{\n\t\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\t\thaxeArgs.push(\"no_console\");\n\t\t\t\t\tflags.push(\"-Dno_console\");\n\t\t\t\t}\n\n\t\t\t\tif (!project.targetFlags.exists(\"static\"))\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs);\n\n\t\t\t\t\tif (noOutput) return;\n\n\t\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags);\n\n\t\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-debug\" : \"\") + \".exe\", executablePath);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs.concat([\"-D\", \"static_link\"]));\n\n\t\t\t\t\tif (noOutput) return;\n\n\t\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags.concat([\"-Dstatic_link\"]));\n\t\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags, \"BuildMain.xml\");\n\n\t\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/Main\" + (project.debug ? \"-debug\" : \"\") + \".exe\", executablePath);\n\t\t\t\t}\n\n\t\t\t\t// TODO createWinrtIcons\n\t\t\t\t// var iconPath = Path.combine(applicationDirectory, \"icon.ico\");\n\n\t\t\t\t// if (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS)\n\t\t\t\t// {\n\t\t\t\t//\tvar templates = [Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)) + \"/templates\"].concat(project.templatePaths);\n\t\t\t\t//\tSystem.runCommand(\"\", System.findTemplate(templates, \"bin/ReplaceVistaIcon.exe\"), [executablePath, iconPath, \"1\"], true, true);\n\t\t\t\t// }\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar haxeArgs = [hxml, \"-D\", \"resourceFile=ApplicationMain.rc\"];\n\t\t\t\tvar flags = [\"-DresourceFile=ApplicationMain.rc\"];\n\n\t\t\t\tif (is64)\n\t\t\t\t{\n\t\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\t\thaxeArgs.push(\"HXCPP_M64\");\n\t\t\t\t\tflags.push(\"-DHXCPP_M64\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tflags.push(\"-DHXCPP_M32\");\n\t\t\t\t}\n\n\t\t\t\tif (!project.environment.exists(\"SHOW_CONSOLE\"))\n\t\t\t\t{\n\t\t\t\t\thaxeArgs.push(\"-D\");\n\t\t\t\t\thaxeArgs.push(\"no_console\");\n\t\t\t\t\tflags.push(\"-Dno_console\");\n\t\t\t\t}\n\n\t\t\t\tif (!project.targetFlags.exists(\"static\"))\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs);\n\n\t\t\t\t\tif (noOutput) return;\n\n\t\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags);\n\n\t\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/ApplicationMain\" + (project.debug ? \"-debug\" : \"\") + \".exe\", executablePath);\n\n\t\t\t\t\tif (project.defines.exists(\"mingw\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar libraries = [\"libwinpthread-1.dll\", \"libstdc++-6.dll\"];\n\t\t\t\t\t\tif (is64)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlibraries.push(\"libgcc_s_seh-1.dll\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlibraries.push(\"libgcc_s_dw2-1.dll\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (library in libraries)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.copyIfNewer(targetDirectory + \"/obj/\" + library, Path.combine(applicationDirectory, library));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", \"haxe\", haxeArgs.concat([\"-D\", \"static_link\"]));\n\n\t\t\t\t\tif (noOutput) return;\n\n\t\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags.concat([\"-Dstatic_link\"]));\n\t\t\t\t\tCPPHelper.compile(project, targetDirectory + \"/obj\", flags, \"BuildMain.xml\");\n\n\t\t\t\t\tSystem.copyFile(targetDirectory + \"/obj/Main\" + (project.debug ? \"-debug\" : \"\") + \".exe\", executablePath);\n\t\t\t\t}\n\n\t\t\t\tvar iconPath = Path.combine(applicationDirectory, \"icon.ico\");\n\n\t\t\t\tif (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS)\n\t\t\t\t{\n\t\t\t\t\tvar templates = [Haxelib.getPath(new Haxelib(#if lime \"lime\" #else \"hxp\" #end)) + \"/templates\"].concat(project.templatePaths);\n\t\t\t\t\tSystem.runCommand(\"\", System.findTemplate(templates, \"bin/ReplaceVistaIcon.exe\"), [executablePath, iconPath, \"1\"], true, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function clean():Void\n\t{\n\t\tif (FileSystem.exists(targetDirectory))\n\t\t{\n\t\t\tSystem.removeDirectory(targetDirectory);\n\t\t}\n\t}\n\n\tpublic override function deploy():Void\n\t{\n\t\tDeploymentHelper.deploy(project, targetFlags, targetDirectory, \"Windows\" + (is64 ? \"64\" : \"\"));\n\t}\n\n\tpublic override function display():Void\n\t{\n\t\tif (project.targetFlags.exists(\"output-file\"))\n\t\t{\n\t\t\tSys.println(executablePath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSys.println(getDisplayHXML().toString());\n\t\t}\n\t}\n\n\tprivate function generateContext():Dynamic\n\t{\n\t\tvar context = project.templateContext;\n\n\t\tif (targetType == \"winjs\")\n\t\t{\n\t\t\tcontext.WIN_FLASHBACKGROUND = project.window.background != null ? StringTools.hex(project.window.background, 6) : \"\";\n\t\t\tcontext.OUTPUT_FILE = outputFile;\n\n\t\t\tif (project.targetFlags.exists(\"webgl\"))\n\t\t\t{\n\t\t\t\tcontext.CPP_DIR = targetDirectory;\n\t\t\t}\n\n\t\t\tvar guid = GUID.seededUuid(project.meta.packageName);\n\t\t\tcontext.APP_GUID = guid;\n\n\t\t\tvar guidNoBrackets = guid.split(\"{\").join(\"\").split(\"}\").join(\"\");\n\t\t\tcontext.APP_GUID_NOBRACKETS = guidNoBrackets;\n\n\t\t\tif (context.APP_DESCRIPTION == null || context.APP_DESCRIPTION == \"\")\n\t\t\t{\n\t\t\t\tcontext.APP_DESCRIPTION = project.meta.title;\n\t\t\t}\n\t\t}\n\t\telse if (targetType == \"winrt\")\n\t\t{\n\t\t\tcontext.CPP_DIR = targetDirectory + \"/obj\";\n\t\t\tcontext.BUILD_DIR = project.app.path + \"/winrt\" + (is64 ? \"64\" : \"\");\n\t\t\tcontext.DC = \"::\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (targetType == \"cpp\")\n\t\t\t{\n\t\t\t\tif (context.APP_DESCRIPTION == null || context.APP_DESCRIPTION == \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.APP_DESCRIPTION = project.meta.title;\n\t\t\t\t}\n\n\t\t\t\tif (context.APP_COPYRIGHT_YEARS == null || context.APP_COPYRIGHT_YEARS == \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.APP_COPYRIGHT_YEARS = Std.string(Date.now().getFullYear());\n\t\t\t\t}\n\n\t\t\t\tvar versionParts = project.meta.version.split(\".\");\n\n\t\t\t\tif (versionParts.length == 3)\n\t\t\t\t{\n\t\t\t\t\tversionParts.push(\"0\");\n\t\t\t\t}\n\n\t\t\t\tcontext.FILE_VERSION = versionParts.join(\".\");\n\t\t\t\tcontext.VERSION_NUMBER = versionParts.join(\",\");\n\t\t\t}\n\n\t\t\tcontext.NEKO_FILE = targetDirectory + \"/obj/ApplicationMain.n\";\n\t\t\tcontext.NODE_FILE = targetDirectory + \"/bin/ApplicationMain.js\";\n\t\t\tcontext.HL_FILE = targetDirectory + \"/obj/ApplicationMain\" + (project.defines.exists(\"hlc\") ? \".c\" : \".hl\");\n\t\t\tcontext.CPPIA_FILE = targetDirectory + \"/obj/ApplicationMain.cppia\";\n\t\t\tcontext.CPP_DIR = targetDirectory + \"/obj\";\n\t\t\tcontext.BUILD_DIR = project.app.path + \"/windows\" + (is64 ? \"64\" : \"\");\n\t\t}\n\n\t\treturn context;\n\t}\n\n\tprivate function getDisplayHXML():HXML\n\t{\n\t\tvar path = targetDirectory + \"/haxe/\" + buildType + \".hxml\";\n\n\t\t// try to use the existing .hxml file. however, if the project file was\n\t\t// modified more recently than the .hxml, then the .hxml cannot be\n\t\t// considered valid anymore. it may cause errors in editors like vscode.\n\t\tif (FileSystem.exists(path)\n\t\t\t&& (project.projectFilePath == null || !FileSystem.exists(project.projectFilePath)\n\t\t\t\t|| (FileSystem.stat(path).mtime.getTime() > FileSystem.stat(project.projectFilePath).mtime.getTime())))\n\t\t{\n\t\t\treturn File.getContent(path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar context = project.templateContext;\n\t\t\tvar hxml = HXML.fromString(context.HAXE_FLAGS);\n\t\t\thxml.addClassName(context.APP_MAIN);\n\t\t\tswitch (targetType)\n\t\t\t{\n\t\t\t\tcase \"hl\":\n\t\t\t\t\thxml.hl = \"_.hl\";\n\t\t\t\tcase \"neko\":\n\t\t\t\t\thxml.neko = \"_.n\";\n\t\t\t\tcase \"cppia\":\n\t\t\t\t\thxml.cppia = \"_.cppia\";\n\t\t\t\tcase \"java\":\n\t\t\t\t\thxml.java = \"_\";\n\t\t\t\tcase \"nodejs\", \"winjs\":\n\t\t\t\t\thxml.js = \"_.js\";\n\t\t\t\tdefault:\n\t\t\t\t\thxml.cpp = \"_\";\n\t\t\t}\n\t\t\thxml.noOutput = true;\n\t\t\treturn hxml;\n\t\t}\n\t}\n\n\tpublic override function rebuild():Void\n\t{\n\t\tif (targetType != \"winjs\")\n\t\t{\n\t\t\t// if (project.environment.exists (\"VS110COMNTOOLS\") && project.environment.exists (\"VS100COMNTOOLS\")) {\n\n\t\t\t// project.environment.set (\"HXCPP_MSVC\", project.environment.get (\"VS100COMNTOOLS\"));\n\t\t\t// Sys.putEnv (\"HXCPP_MSVC\", project.environment.get (\"VS100COMNTOOLS\"));\n\n\t\t\t// }\n\n\t\t\tvar commands:Array<Array<String>> = [];\n\t\t\tif (targetType == \"hl\")\n\t\t\t{\n\t\t\t\t// default to 64 bit, just like upstream Hashlink releases\n\t\t\t\tif (!targetFlags.exists(\"32\") && !targetFlags.exists(\"x86_32\")\n\t\t\t\t\t&& (System.hostArchitecture == X64 || targetFlags.exists(\"64\") || targetFlags.exists(\"x86_64\")))\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dwindows\", \"-DHXCPP_M64\", \"-Dhashlink\"]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcommands.push([\"-Dwindows\", \"-DHXCPP_M32\", \"-Dhashlink\"]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!targetFlags.exists(\"64\") && !targetFlags.exists(\"x86_64\")\n\t\t\t\t\t&& (command == \"rebuild\" || System.hostArchitecture == X86 || (targetType != \"cpp\" && targetType != \"winrt\")))\n\t\t\t\t{\n\t\t\t\t\tif (targetType == \"winrt\")\n\t\t\t\t\t{\n\t\t\t\t\t\tcommands.push([\"-Dwinrt\", \"-DHXCPP_M32\"]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcommands.push([\"-Dwindows\", \"-DHXCPP_M32\"]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// TODO: Compiling with -Dfulldebug overwrites the same \"-debug.pdb\"\n\t\t\t\t// as previous Windows builds. For now, force -64 to be done last\n\t\t\t\t// so that it can be debugged in a default \"rebuild\"\n\n\t\t\t\tif (!targetFlags.exists(\"32\") && !targetFlags.exists(\"x86_32\")\n\t\t\t\t\t&& System.hostArchitecture == X64\n\t\t\t\t\t&& (command != \"rebuild\" || targetType == \"cpp\" || targetType == \"neko\" || targetType == \"winrt\"))\n\t\t\t\t{\n\t\t\t\t\tif (targetType == \"winrt\")\n\t\t\t\t\t{\n\t\t\t\t\t\tcommands.push([\"-Dwinrt\", \"-DHXCPP_M64\"]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcommands.push([\"-Dwindows\", \"-DHXCPP_M64\"]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetFlags.exists(\"hl\"))\n\t\t\t{\n\t\t\t\tCPPHelper.rebuild(project, commands, null, \"BuildHashlink.xml\");\n\t\t\t}\n\n\t\t\tCPPHelper.rebuild(project, commands);\n\t\t}\n\t}\n\n\tpublic override function run():Void\n\t{\n\t\tvar arguments = additionalArguments.copy();\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\targuments.push(\"-verbose\");\n\t\t}\n\n\t\tif (targetType == \"nodejs\")\n\t\t{\n\t\t\tNodeJSHelper.run(project, targetDirectory + \"/bin/ApplicationMain.js\", arguments);\n\t\t}\n\t\telse if (targetType == \"cppia\")\n\t\t{\n\t\t\t// arguments = arguments.concat([\"-livereload\"]);\n\t\t\targuments = [\"script.cppia\"]; // .concat(arguments);\n\t\t\tSystem.runCommand(applicationDirectory, Path.withoutDirectory(executablePath), arguments);\n\t\t}\n\t\telse if (targetType == \"winjs\")\n\t\t{\n\t\t\t/*\n\n\t\t\t\tThe 'test' target is problematic for UWP applications.  UWP applications are bundled in appx packages and\n\t\t\t\trequire app certs to properly install.\n\n\t\t\t\tThere are two options to trigger an appx install from the command line.\n\n\t\t\t\tA. Use the WinAppDeployCmd.exe utility to deploy to local and remote devices\n\n\t\t\t\tB. Execute the Add-AppDevPackage.ps1 powershell script that is an\n\t\t\t\t\tartifact of the UWP msbuild\n\n\t\t\t\tA: WinAppDeployCmd.exe\n\t\t\t\thttps://docs.microsoft.com/en-us/windows/uwp/packaging/install-universal-windows-apps-with-the-winappdeploycmd-tool\n\t\t\t\thttps://msdn.microsoft.com/en-us/windows/desktop/mt627714\n\t\t\t\tWindows 10 SDK: https://developer.microsoft.com/windows/downloads/windows-10-sdk\n\n\t\t\t\tI've never actually got this to work, but I feel like I was close.  The WinAppDeployCmd.exe is a part of the\n\t\t\t\tWindows 10 SDK and not a part of the Visual Studio 2017 community edition.  It will appear magically if you\n\t\t\t\tcheck enough boxes when installing various project templates for Visual Studio.  It appeared for me, and I\n\t\t\t\thave no clue how it got there.\n\n\t\t\t\tA developer must take a few steps in order for this command to work.\n\t\t\t\t1. Install Visual Studio 2017 Community Edition\n\t\t\t\t2. Install the Windows 10 SDK\n\t\t\t\t3. Modify Windows 10 Settings to enable side loading and device discovery\n\t\t\t\t3. Enabling device discovery generates a pin number that is displayed to the user\n\t\t\t\t4. Open the \"Developer Command Promp for VS 2017\" from the Start menu\n\t\t\t\t5. run:\n\t\t\t\t\t> WinAppDeployCmd devices\n\t\t\t\t6. Make sure your device shows up in the list (if it does not appear try step 3 again, toggling things on/off)\n\t\t\t\t7. run: (replase file, ip and pin with your values)\n\t\t\t\t\t> WinAppDeployCmd install -file \"uwp-project_1.0.0.0_AnyCPU.appx\" -ip 192.168.27.167 -pin 326185\n\n\t\t\t\tB: Add-AppDevPackage.ps1 + PowerShell_Set_Unrestricted.reg\n\t\t\t\tThe UWP build generates a powershell script by default. This script is usually executed by the user\n\t\t\t\tby right clicking the file and choosing \"run with powershell\". Executing this script directly from the cmd\n\t\t\t\tprompt results in a security error: \"Add-AppDevPackage.ps1 cannot be loaded because running scripts is\n\t\t\t\tdisabled on this system.\"\n\n\t\t\t\tWe must edit the registry if we want to run this script directly from a shell.\n\t\t\t\tSee lime/templates/windows/template/PowerShell_Set_Unrestricted.reg\n\n\t\t\t\t1. run:\n\t\t\t\t\t> regedit /s PowerShell_Set_Unrestricted.reg\n\t\t\t\t2. run:\n\t\t\t\t\t \t\t\t> powershell \"& \"\"./Add-AppDevPackage.ps1\"\"\"\n\n\t\t\t\t\t \t\tnote: the nonsensical double quotes are required.\n\n\t\t\t */\n\n\t\t\t// Using option B because obtaining the device pin programatically does not seem possible.\n\t\t\t// System.runCommand (\"\", \"regedit\", [ '/s', '\"' + targetDirectory + '/bin/PowerShell_Set_Unrestricted.reg\"' ]);\n\t\t\t// var test = '\"& \"\"' + targetDirectory + '/bin/PowerShell_Set_Unrestricted.reg\"\"\"';\n\t\t\t// Sys.command ('powershell & \"\"' + targetDirectory + '/bin/source/AppPackages/' + project.app.file + '_1.0.0.0_AnyCPU_Test/Add-AppDevPackage.ps1\"\"');\n\t\t\tvar version = project.meta.version + \".\" + project.meta.buildNumber;\n\t\t\tSystem.openFile(targetDirectory\n\t\t\t\t+ \"/source/AppPackages/\"\n\t\t\t\t+ project.app.file\n\t\t\t\t+ \"_\"\n\t\t\t\t+ version\n\t\t\t\t+ \"_AnyCPU_Test\",\n\t\t\t\tproject.app.file\n\t\t\t\t+ \"_\"\n\t\t\t\t+ version\n\t\t\t\t+ \"_AnyCPU.appx\");\n\n\t\t\t// source/AppPackages/uwp-project_1.0.0.0_AnyCPU_Test/Add-AppDevPackage.ps1\n\n\t\t\t// HTML5Helper.launch (project, targetDirectory + \"/bin\");\n\t\t}\n\t\telse if (targetType == \"java\")\n\t\t{\n\t\t\tSystem.runCommand(applicationDirectory, \"java\", [\"-jar\", project.app.file + \".jar\"].concat(arguments));\n\t\t}\n\t\telse if (targetType == \"winrt\")\n\t\t{\n\t\t\twinrtRun(arguments);\n\t\t}\n\t\telse if (project.target == System.hostPlatform)\n\t\t{\n\t\t\targuments = arguments.concat([\"-livereload\"]);\n\t\t\tSystem.runCommand(applicationDirectory, Path.withoutDirectory(executablePath), arguments);\n\t\t}\n\t}\n\n\tpublic override function update():Void\n\t{\n\t\tAssetHelper.processLibraries(project, targetDirectory);\n\n\t\tif (targetType == \"winjs\")\n\t\t{\n\t\t\tupdateUWP();\n\t\t\treturn;\n\t\t}\n\n\t\t// project = project.clone ();\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed && asset.sourcePath == \"\")\n\t\t\t{\n\t\t\t\tvar path = Path.combine(targetDirectory + \"/obj/tmp\", asset.targetPath);\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path);\n\t\t\t\tasset.sourcePath = path;\n\t\t\t}\n\t\t}\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tif ((targetType == \"cpp\" || targetType == \"winrt\") && project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tvar programFiles = project.environment.get(\"ProgramFiles(x86)\");\n\t\t\tvar hasVSCommunity = (programFiles != null\n\t\t\t\t&& FileSystem.exists(Path.combine(programFiles, \"Microsoft Visual Studio/Installer/vswhere.exe\")));\n\t\t\tvar hxcppMSVC = project.environment.get(\"HXCPP_MSVC\");\n\t\t\tvar vs140 = project.environment.get(\"VS140COMNTOOLS\");\n\n\t\t\tvar msvc19 = true;\n\n\t\t\tif (project.defines.exists(\"mingw\") || (!hasVSCommunity && vs140 == null) || (hxcppMSVC != null && hxcppMSVC != vs140))\n\t\t\t{\n\t\t\t\tmsvc19 = false;\n\t\t\t}\n\n\t\t\tvar suffix = (msvc19 ? \"-19\" : \"\") + \"${LIBEXT}\";\n\n\t\t\tfor (i in 0...project.ndlls.length)\n\t\t\t{\n\t\t\t\tvar ndll = project.ndlls[i];\n\n\t\t\t\tif (ndll.path == null || ndll.path == \"\")\n\t\t\t\t{\n\t\t\t\t\tcontext.ndlls[i].path = NDLL.getLibraryPath(ndll, (targetType == \"winrt\" ? \"WinRT\" : \"Windows\") + (is64 ? \"64\" : \"\"), \"lib\", suffix,\n\t\t\t\t\t\tproject.debug);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSystem.mkdir(targetDirectory);\n\t\tSystem.mkdir(targetDirectory + \"/obj\");\n\t\tSystem.mkdir(targetDirectory + \"/haxe\");\n\t\tSystem.mkdir(applicationDirectory);\n\n\t\t// SWFHelper.generateSWFClasses (project, targetDirectory + \"/haxe\");\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, targetType + \"/hxml\", targetDirectory + \"/haxe\", context);\n\n\t\tif (targetType == \"winrt\" && project.targetFlags.exists(\"static\"))\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winrt/assetspkg\", targetDirectory + \"/bin/assetspkg\", context, false, true);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winrt/appx\", targetDirectory + \"/bin\", context, true, true);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winrt/static\", targetDirectory + \"/obj\", context, true, true);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winrt/temp\", targetDirectory + \"/haxe/temp\", context, false, true);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winrt/scripts\", targetDirectory + \"/scripts\", context, true, true);\n\t\t}\n\t\telse if (targetType == \"cpp\")\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"windows/resource\", targetDirectory + \"/obj\", context);\n\n\t\t\tif (project.targetFlags.exists(\"static\"))\n\t\t\t{\n\t\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"cpp/static\", targetDirectory + \"/obj\", context);\n\t\t\t}\n\t\t}\n\n\t\t/*if (IconHelper.createIcon (project.icons, 32, 32, Path.combine (applicationDirectory, \"icon.png\"))) {\n\n\t\t\tcontext.HAS_ICON = true;\n\t\t\tcontext.WIN_ICON = \"icon.png\";\n\n\t\t}*/\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.embed != true)\n\t\t\t{\n\t\t\t\tvar path = Path.combine(applicationDirectory, asset.targetPath);\n\n\t\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tAssetHelper.copyAssetIfNewer(asset, path);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function updateUWP():Void\n\t{\n\t\tproject = project.clone();\n\n\t\tvar destination = targetDirectory + \"/source/\";\n\t\tSystem.mkdir(destination);\n\n\t\tvar webfontDirectory = targetDirectory + \"/obj/webfont\";\n\t\tvar useWebfonts = true;\n\n\t\tfor (haxelib in project.haxelibs)\n\t\t{\n\t\t\tif (haxelib.name == \"openfl-html5-dom\" || haxelib.name == \"openfl-bitfive\")\n\t\t\t{\n\t\t\t\tuseWebfonts = false;\n\t\t\t}\n\t\t}\n\n\t\tvar fontPath:String;\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.type == AssetType.FONT)\n\t\t\t{\n\t\t\t\tif (useWebfonts)\n\t\t\t\t{\n\t\t\t\t\tfontPath = Path.combine(webfontDirectory, Path.withoutDirectory(asset.targetPath));\n\n\t\t\t\t\tif (!FileSystem.exists(fontPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.mkdir(webfontDirectory);\n\t\t\t\t\t\tSystem.copyFile(asset.sourcePath, fontPath);\n\n\t\t\t\t\t\tasset.sourcePath = fontPath;\n\n\t\t\t\t\t\tHTML5Helper.generateWebfonts(project, asset);\n\t\t\t\t\t}\n\n\t\t\t\t\tasset.sourcePath = fontPath;\n\t\t\t\t\tasset.targetPath = Path.withoutExtension(asset.targetPath);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// project.haxeflags.push (HTML5Helper.generateFontData (project, asset));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"xml\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"-xml \" + targetDirectory + \"/types.xml\");\n\t\t}\n\n\t\tif (project.targetFlags.exists(\"json\"))\n\t\t{\n\t\t\tproject.haxeflags.push(\"--json \" + targetDirectory + \"/types.json\");\n\t\t}\n\n\t\tif (Log.verbose)\n\t\t{\n\t\t\tproject.haxedefs.set(\"verbose\", 1);\n\t\t}\n\n\t\tModuleHelper.updateProject(project);\n\n\t\tvar libraryNames = new Map<String, Bool>();\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tif (asset.library != null && !libraryNames.exists(asset.library))\n\t\t\t{\n\t\t\t\tlibraryNames[asset.library] = true;\n\t\t\t}\n\t\t}\n\n\t\t// for (library in libraryNames.keys ()) {\n\t\t//\n\t\t// project.haxeflags.push (\"-resource \" + targetDirectory + \"/obj/manifest/\" + library + \".json@__ASSET_MANIFEST__\" + library);\n\t\t//\n\t\t// }\n\n\t\t// project.haxeflags.push (\"-resource \" + targetDirectory + \"/obj/manifest/default.json@__ASSET_MANIFEST__default\");\n\n\t\tvar context = generateContext();\n\t\tcontext.OUTPUT_DIR = targetDirectory;\n\n\t\tcontext.favicons = [];\n\n\t\tvar icons = project.icons;\n\n\t\tif (icons.length == 0)\n\t\t{\n\t\t\ticons = [new Icon(System.findTemplate(project.templatePaths, \"default/icon.svg\"))];\n\t\t}\n\n\t\t// if (IconHelper.createWindowsIcon (icons, Path.combine (destination, \"favicon.ico\"))) {\n\t\t//\n\t\t// context.favicons.push ({ rel: \"icon\", type: \"image/x-icon\", href: \"./favicon.ico\" });\n\t\t//\n\t\t// }\n\n\t\tif (IconHelper.createIcon(icons, 192, 192, Path.combine(destination, \"favicon.png\")))\n\t\t{\n\t\t\tcontext.favicons.push({rel: \"shortcut icon\", type: \"image/png\", href: \"./favicon.png\"});\n\t\t}\n\n\t\tcontext.linkedLibraries = [];\n\n\t\tfor (dependency in project.dependencies)\n\t\t{\n\t\t\tif (StringTools.endsWith(dependency.name, \".js\"))\n\t\t\t{\n\t\t\t\tcontext.linkedLibraries.push(dependency.name);\n\t\t\t}\n\t\t\telse if (StringTools.endsWith(dependency.path, \".js\") && FileSystem.exists(dependency.path))\n\t\t\t{\n\t\t\t\tvar name = Path.withoutDirectory(dependency.path);\n\n\t\t\t\tcontext.linkedLibraries.push(\"./js/lib/\" + name);\n\t\t\t\tcopyIfNewer(dependency.path, Path.combine(destination, Path.combine(\"js/lib\", name)));\n\t\t\t}\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\tif (asset.type != AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tif (asset.type != AssetType.FONT)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tAssetHelper.copyAssetIfNewer(asset, path);\n\t\t\t\t}\n\t\t\t\telse if (useWebfonts)\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\t\tvar ext = \".\" + Path.extension(asset.sourcePath);\n\t\t\t\t\tvar source = Path.withoutExtension(asset.sourcePath);\n\n\t\t\t\t\tfor (extension in [ext, \".eot\", \".woff\", \".svg\"])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (FileSystem.exists(source + extension))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.copyIfNewer(source + extension, path + extension);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Could not find generated font file \\\"\" + source + extension + \"\\\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winjs/template\", targetDirectory, context);\n\n\t\tvar renamePaths = [\n\t\t\t\"uwp-project.sln\",\n\t\t\t\"source/uwp-project.jsproj\",\n\t\t\t\"source/uwp-project_TemporaryKey.pfx\"\n\t\t];\n\t\tvar fullPath:String;\n\n\t\tfor (path in renamePaths)\n\t\t{\n\t\t\tfullPath = targetDirectory + \"/\" + path;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (FileSystem.exists(fullPath))\n\t\t\t\t{\n\t\t\t\t\tFile.copy(fullPath, targetDirectory + \"/\" + StringTools.replace(path, \"uwp-project\", project.app.file));\n\t\t\t\t\tFileSystem.deleteFile(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\n\t\tif (project.app.main != null)\n\t\t{\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"haxe\", targetDirectory + \"/haxe\", context);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winjs/haxe\", targetDirectory + \"/haxe\", context, true, false);\n\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"winjs/hxml\", targetDirectory + \"/haxe\", context);\n\n\t\t\tif (project.targetFlags.exists(\"webgl\"))\n\t\t\t{\n\t\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"webgl/hxml\", targetDirectory + \"/haxe\", context, true, false);\n\t\t\t}\n\t\t}\n\n\t\tfor (asset in project.assets)\n\t\t{\n\t\t\tvar path = Path.combine(destination, asset.targetPath);\n\n\t\t\tif (asset.type == AssetType.TEMPLATE)\n\t\t\t{\n\t\t\t\tSystem.mkdir(Path.directory(path));\n\t\t\t\tAssetHelper.copyAsset(asset, path, context);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override function watch():Void\n\t{\n\t\tvar hxml = getDisplayHXML();\n\t\tvar dirs = hxml.getClassPaths(true);\n\n\t\tvar outputPath = Path.combine(Sys.getCwd(), project.app.path);\n\t\tdirs = dirs.filter(function(dir)\n\t\t{\n\t\t\treturn (!Path.startsWith(dir, outputPath));\n\t\t});\n\n\t\tvar command = ProjectHelper.getCurrentCommand();\n\t\tSystem.watch(command, dirs);\n\t}\n\n\t//\t@ignore public override function install ():Void {}\n\toverride public function install():Void\n\t{\n\t\tsuper.install();\n\t\tif (targetType == \"winrt\")\n\t\t{\n\t\t\tif (project.targetFlags.exists(\"appx\"))\n\t\t\t{\n\t\t\t\tvar context = project.templateContext;\n\t\t\t\tbuildWinrtPackage(context.KEY_STORE, context.KEY_STORE_PASSWORD);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuninstall();\n\t\t\t\tLog.info(\"run: Register app\");\n\t\t\t\tvar process = new sys.io.Process('powershell', [\n\t\t\t\t\t\"-noprofile\",\n\t\t\t\t\t\"-command\",\n\t\t\t\t\t'Add-AppxPackage -Path ' + applicationDirectory + \"/\" + 'AppxManifest.xml -Register'\n\t\t\t\t]);\n\t\t\t\tif (process.exitCode() != 0)\n\t\t\t\t{\n\t\t\t\t\tvar message = process.stderr.readAll().toString();\n\t\t\t\t\tLog.error(\"Cannot register. \" + message);\n\t\t\t\t}\n\t\t\t\tprocess.close();\n\t\t\t}\n\t\t}\n\t}\n\n\t@ignore public override function trace():Void {}\n\n\t// @ignore public override function uninstall ():Void {}\n\toverride public function uninstall():Void\n\t{\n\t\tsuper.uninstall();\n\t\tif (targetType == \"winrt\" && !project.targetFlags.exists(\"appx\"))\n\t\t{\n\t\t\tvar appxName = project.meta.packageName;\n\t\t\tLog.info(\"run: Remove previous registered app\");\n\t\t\tvar process = new sys.io.Process('powershell', [\n\t\t\t\t\"-noprofile\",\n\t\t\t\t\"-command\",\n\t\t\t\t'Get-AppxPackage ' + appxName + ' | Remove-AppxPackage'\n\t\t\t]);\n\t\t\tif (process.exitCode() != 0)\n\t\t\t{\n\t\t\t\tvar message = process.stderr.readAll().toString();\n\t\t\t\tLog.error(\"Cannot remove. \" + message);\n\t\t\t}\n\t\t\tprocess.close();\n\t\t}\n\t\t// TODO \t\tif (targetType == \"winrt\" && project.targetFlags.exists(\"appx\"))\n\t}\n\n\tpublic function winrtRun(arguments:Array<String>):Void\n\t{\n\t\tvar dir = applicationDirectory;\n\t\tvar haxeDir = targetDirectory + \"/haxe\";\n\t\tif (project.targetFlags.exists(\"appx\"))\n\t\t{\n\t\t\tLog.info(\"\\n***Double click on \" + project.app.file + \".Appx to install Appx\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar appxName = project.meta.packageName;\n\t\t\tvar appxId = \"App\";\n\t\t\tvar appxAUMID:String = null;\n\t\t\tvar appxInfoFile = haxeDir + \"/appxinfo.txt\";\n\t\t\tvar kitsRoot10 = \"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\\"; // %WindowsSdkDir%\n\n\t\t\t// get PackageFamilyappxName and set appxAUMID\n\t\t\t//\twrite app info in a file\n\t\t\tvar cmd = 'Get-AppxPackage ' + appxName + ' | Out-File ' + appxInfoFile + ' -Encoding ASCII';\n\t\t\tLog.info(\"powershell \" + cmd);\n\t\t\tvar process3 = new sys.io.Process('powershell', [cmd]);\n\t\t\tif (process3.exitCode() != 0)\n\t\t\t{\n\t\t\t\tvar message = process3.stderr.readAll().toString();\n\t\t\t\tLog.error(\"Cannot get PackageFamilyName. \" + message);\n\t\t\t}\n\t\t\tprocess3.close();\n\t\t\t//\tparse file\n\t\t\tif (sys.FileSystem.exists(appxInfoFile))\n\t\t\t{\n\t\t\t\tvar fin = sys.io.File.read(appxInfoFile, false);\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\twhile (true)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar str = fin.readLine();\n\t\t\t\t\t\tvar split = str.split(\":\");\n\t\t\t\t\t\tvar name = StringTools.trim(split[0]);\n\t\t\t\t\t\tif (name == \"PackageFamilyName\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar appxPackageFamilyName = StringTools.trim(split[1]);\n\t\t\t\t\t\t\tif (appxPackageFamilyName != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tappxAUMID = appxPackageFamilyName + \"!\" + appxId;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (e:haxe.io.Eof)\n\t\t\t\t{\n\t\t\t\t\tLog.error('Could not get PackageFamilyName from ' + appxInfoFile);\n\t\t\t\t}\n\t\t\t\tfin.close();\n\t\t\t}\n\n\t\t\tLog.info(\"run: \" + appxAUMID);\n\t\t\tLog.info(kitsRoot10 + 'App Certification Kit\\\\microsoft.windows.softwarelogo.appxlauncher.exe ' + appxAUMID);\n\t\t\tvar process4 = new sys.io.Process(kitsRoot10 + 'App Certification Kit\\\\microsoft.windows.softwarelogo.appxlauncher.exe', [appxAUMID]);\n\t\t}\n\t}\n\n\tpublic function buildWinrtPackage(pfxPath:String, certificatePwd:String):Void\n\t{\n\t\tif (project.targetFlags.exists(\"appx\"))\n\t\t{\n\t\t\tvar kitsRoot10 = \"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\\"; // %WindowsSdkDir%\n\t\t\tvar haxeDir = targetDirectory + \"/haxe\";\n\n\t\t\tvar binDir:String = kitsRoot10 + \"\\\\bin\";\n\t\t\tif (sys.FileSystem.exists(binDir))\n\t\t\t{\n\t\t\t\tvar maxSDK:Int = 0;\n\t\t\t\tfor (file in sys.FileSystem.readDirectory(binDir))\n\t\t\t\t{\n\t\t\t\t\tif (StringTools.startsWith(file, \"10.0\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar file2 = file.split(\"10.0.\")[1];\n\t\t\t\t\t\tfile2 = file2.split(\".0\")[0];\n\t\t\t\t\t\tvar fileSDK:Int = Std.parseInt(file2);\n\t\t\t\t\t\tmaxSDK = (maxSDK > fileSDK ? maxSDK : fileSDK);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (maxSDK > 0)\n\t\t\t\t{\n\t\t\t\t\tLog.info(\"Found max SDK 10.0.\" + maxSDK + \".0\");\n\t\t\t\t\tbinDir += \"\\\\10.0.\" + maxSDK + \".0\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error('\"$binDir\" does not exists');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar makepriPath = binDir + '\\\\x86\\\\MakePri.exe';\n\t\t\tvar makeappxPath = binDir + '\\\\x86\\\\MakeAppx.exe';\n\t\t\tvar signToolPath = binDir + '\\\\x64\\\\SignTool.exe';\n\n\t\t\tvar resultFilePath = haxeDir + \"\\\\temp\";\n\t\t\tvar resultFileName = resultFilePath + \"/layout.resfiles\";\n\t\t\tLog.info(\"make pri\");\n\n\t\t\tvar outputDirectory = Path.combine(FileSystem.fullPath(targetDirectory), \"appx\");\n\t\t\tvar binPath = Path.combine(FileSystem.fullPath(targetDirectory), \"bin\");\n\n\t\t\tpfxPath = Path.combine(outputDirectory, pfxPath);\n\t\t\t// prepare file to make pri\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar from = outputDirectory;\n\t\t\t\tvar buf = new StringBuf();\n\n\t\t\t\t// todo\n\t\t\t\tvar outputFiles = FileSystem.readDirectory(binPath);\n\n\t\t\t\tfor (filename in outputFiles)\n\t\t\t\t{\n\t\t\t\t\tif (!(StringTools.endsWith(filename, \".exe\") || StringTools.endsWith(filename, \".pri\"))\n\t\t\t\t\t\t&& filename != \"AppxManifest.xml\")\n\t\t\t\t\t{\n\t\t\t\t\t\tbuf.add(filename);\n\t\t\t\t\t\tbuf.addChar(10);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (sys.FileSystem.exists(resultFileName)) sys.FileSystem.deleteFile(sys.FileSystem.absolutePath(resultFileName));\n\n\t\t\t\tsys.io.File.saveContent(resultFileName, buf.toString());\n\t\t\t\tLog.info(\"Created layout.resfiles : \" + resultFileName);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tLog.error(\"Error creating layout.resfiles \" + e);\n\t\t\t}\n\n\t\t\tvar makepriParams = [\n\t\t\t\t\"new\",\n\t\t\t\t\"/ProjectRoot\",\n\t\t\t\tresultFilePath,\n\t\t\t\t\"/ConfigXml\",\n\t\t\t\tresultFilePath + \"\\\\priconfig.xml\",\n\t\t\t\t\"/Manifest\",\n\t\t\t\tapplicationDirectory + \"/\" + 'AppxManifest.xml',\n\t\t\t\t\"/OutputFile\",\n\t\t\t\tapplicationDirectory + \"resources.pri\"\n\t\t\t];\n\t\t\tLog.info(makepriPath + \" \" + makepriParams);\n\t\t\tvar process = new sys.io.Process(makepriPath, makepriParams);\n\n\t\t\t// needs to wait make pri\n\t\t\tvar retry:Int = 10;\n\t\t\twhile (retry > 0 && !sys.FileSystem.exists(applicationDirectory + \"/\" + \"resources.pri\"))\n\t\t\t{\n\t\t\t\tSys.sleep(1);\n\t\t\t\tLog.info(\"waiting pri..\");\n\t\t\t\tretry--;\n\t\t\t}\n\t\t\tif (retry <= 0) Log.error(\"Error on MakePri\");\n\n\t\t\tvar appxDir = applicationDirectory + \"../\";\n\n\t\t\tLog.info(\"make \" + project.app.file + \".Appx\");\n\t\t\tvar makeappParams = [\"pack\", \"/d\", applicationDirectory, \"/p\", appxDir + project.app.file + \".Appx\"];\n\t\t\tvar process2 = new sys.io.Process(makeappxPath, makeappParams);\n\t\t\tLog.info(makeappParams.toString());\n\t\t\tprocess.close();\n\t\t\tprocess2.close();\n\n\t\t\tvar pfxFileName = project.app.file + \".pfx\";\n\n\t\t\tif (pfxPath != null && pfxPath.length > 0)\n\t\t\t{\n\t\t\t\tif (sys.FileSystem.exists(appxDir + \"scripts/\" + pfxFileName))\n\t\t\t\t{\n\t\t\t\t\t// apply certificate\n\t\t\t\t\tLog.info(\"Pfx cert found: path: \" + appxDir + \"scripts/\" + pfxFileName + \", pwd:\" + certificatePwd);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// create certificate\n\t\t\t\t\tLog.warn(\"Warn: certificate \" + pfxPath + \" not found, run the following command to create a new one:\");\n\t\t\t\t\t// copyTemplateDir( \"winrt/scripts\", applicationDirectory+\"/..\" );\n\n\t\t\t\t\t// New certificate, calls powershell script on elevated mode\n\t\t\t\t\t//\t\t\t\t\tvar cmd = \"Start-Process powershell \\\"-ExecutionPolicy Bypass -Command `\\\"cd `\\\"\"+sys.FileSystem.absolutePath(applicationDirectory)+\"/..\"+\"`\\\"; & `\\\".\\\\newcertificate.ps1`\\\"`\\\"\\\" -Verb RunAs\";\n\t\t\t\t\t//\t\t\t\t\tvar cmd = \"Start-Process powershell \\\"-Command `\\\"cd `\\\"\"+sys.FileSystem.absolutePath(applicationDirectory)+\"/..\"+\"`\\\"; & `\\\".\\\\newcertificate.ps1`\\\"`\\\"\\\" -Verb RunAs\";\n\n\t\t\t\t\t// var cmd = \"\\\"cd \"+sys.FileSystem.absolutePath(applicationDirectory)+\"/../scripts;Start-Process powershell -verb runas -ArgumentList \\'-file .\\\\newcertificate.ps1\\'\\\"\";\n\n\t\t\t\t\tvar cmd = \"-Command \\\"Start-Process powershell \\\\\\\"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\\\\\\\"cd \\\\`\\\\\\\"E:/openfl/BunnyMark/Export/winrt/bin/../scripts\\\\`\\\\\\\"; & \\\\`\\\\\\\".\\\\newcertificate.ps1\\\\`\\\\\\\"`\\\\\\\"\\\\\\\" -Verb RunAs\\\"\";\n\t\t\t\t\tLog.info(\"powershell \" + cmd);\n\n\t\t\t\t\t#if 0\n\t\t\t\t\tvar process3 = new sys.io.Process(\"powershell\", [cmd]);\n\t\t\t\t\tif (process3.exitCode() != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar message = process3.stderr.readAll().toString();\n\t\t\t\t\t\tLog.error(\"Error newcertificate. \" + message);\n\t\t\t\t\t}\n\t\t\t\t\tprocess3.close();\n\n\t\t\t\t\t// check pfx\n\t\t\t\t\tretry = 10;\n\t\t\t\t\twhile (retry > 0 && !sys.FileSystem.exists(appxDir + \"scripts/\" + pfxFileName))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.info(\"waiting \" + appxDir + \"scripts/\" + pfxFileName);\n\t\t\t\t\t\tSys.sleep(6);\n\t\t\t\t\t\tretry--;\n\t\t\t\t\t}\n\t\t\t\t\tif (retry <= 0) Log.error(\"Error creating certificate\");\n\t\t\t\t\t#else\n\t\t\t\t\treturn;\n\t\t\t\t\t#end\n\t\t\t\t}\n\n\t\t\t\tif (appxDir + \"scripts/\" + pfxFileName != pfxPath)\n\t\t\t\t{\n\t\t\t\t\tSystem.copyFile(appxDir + \"scripts/\" + pfxFileName, pfxPath);\n\t\t\t\t\tif (!sys.FileSystem.exists(pfxPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(\"could not copy \" + appxDir + pfxFileName + \" to \" + pfxPath);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pfxPath != null && certificatePwd != null && pfxPath.length > 0 && certificatePwd.length > 0)\n\t\t\t{\n\t\t\t\tLog.info(\"signing \" + project.app.file + \".Appx with \" + pfxPath);\n\n\t\t\t\tvar signParams = [\n\t\t\t\t\t\"sign\",\n\t\t\t\t\t\"/fd\",\n\t\t\t\t\t\"SHA256\",\n\t\t\t\t\t\"/a\",\n\t\t\t\t\t\"/f\",\n\t\t\t\t\tpfxPath,\n\t\t\t\t\t\"/p\",\n\t\t\t\t\tcertificatePwd,\n\t\t\t\t\tappxDir + project.app.file + \".Appx\"\n\t\t\t\t];\n\n\t\t\t\tLog.info(signToolPath + \" \" + signParams);\n\t\t\t\tvar process4 = new sys.io.Process(signToolPath, signParams);\n\t\t\t\tif (process4.exitCode() != 0)\n\t\t\t\t{\n\t\t\t\t\tvar message = process4.stderr.readAll().toString();\n\t\t\t\t\tLog.error(\"Error signing appx. \" + message);\n\t\t\t\t}\n\t\t\t\tLog.info(\"\\n\\n***Double click \"\n\t\t\t\t\t+ pfxPath\n\t\t\t\t\t+ \" to setup certificate (Local machine, Place all certificates in the following store->Trusted People)\\n\");\n\t\t\t\tprocess4.close();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tools/platforms/extraParams.hxml",
    "content": "-lib lime"
  },
  {
    "path": "tools/resources/cacert.pem",
    "content": "##\n## ca-bundle.crt -- Bundle of CA Root Certificates\n##\n## Certificate data from Mozilla as of: Thu Nov  3 19:04:19 2011\n##\n## This is a bundle of X.509 certificates of public Certificate Authorities\n## (CA). These were automatically extracted from Mozilla's root certificates\n## file (certdata.txt).  This file can be found in the mozilla source tree:\n## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1\n##\n## It contains the certificates in PEM format and therefore\n## can be directly used with curl / libcurl / php_curl, or with\n## an Apache+mod_ssl webserver for SSL client authentication.\n## Just configure this file as the SSLCACertificateFile.\n##\n\n# ***** BEGIN LICENSE BLOCK *****\n# Version: MPL 1.1/GPL 2.0/LGPL 2.1\n#\n# The contents of this file are subject to the Mozilla Public License Version\n# 1.1 (the \"License\"); you may not use this file except in compliance with\n# the License. You may obtain a copy of the License at\n# http://www.mozilla.org/MPL/\n#\n# Software distributed under the License is distributed on an \"AS IS\" basis,\n# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\n# for the specific language governing rights and limitations under the\n# License.\n#\n# The Original Code is the Netscape security libraries.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1994-2000\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#\n# Alternatively, the contents of this file may be used under the terms of\n# either the GNU General Public License Version 2 or later (the \"GPL\"), or\n# the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"),\n# in which case the provisions of the GPL or the LGPL are applicable instead\n# of those above. If you wish to allow use of your version of this file only\n# under the terms of either the GPL or the LGPL, and not to allow others to\n# use your version of this file under the terms of the MPL, indicate your\n# decision by deleting the provisions above and replace them with the notice\n# and other provisions required by the GPL or the LGPL. If you do not delete\n# the provisions above, a recipient may use your version of this file under\n# the terms of any one of the MPL, the GPL or the LGPL.\n#\n# ***** END LICENSE BLOCK *****\n# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $\n\nGTE CyberTrust Global Root\n==========================\n-----BEGIN CERTIFICATE-----\nMIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg\nQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG\nA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz\nMjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL\nEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0\nIEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u\nsJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql\nHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID\nAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW\nM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF\nNMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\n-----END CERTIFICATE-----\n\nThawte Server CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs\ndGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE\nAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j\nb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV\nBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u\nc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG\nA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0\nZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl\n/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7\n1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR\nMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J\nGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ\nGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=\n-----END CERTIFICATE-----\n\nThawte Premium Server CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs\ndGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE\nAxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl\nckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT\nAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU\nVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2\naXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ\ncHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2\naovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh\nUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/\nqgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm\nSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf\n8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t\nUCemDaYj+bvLpgcUQg==\n-----END CERTIFICATE-----\n\nEquifax Secure CA\n=================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE\nChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5\nMB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT\nB0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR\nfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW\n8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG\nA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE\nCxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG\nA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS\nspXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB\nAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961\nzgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB\nBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95\n70+sB3c4\n-----END CERTIFICATE-----\n\nDigital Signature Trust Co. Global CA 1\n=======================================\n-----BEGIN CERTIFICATE-----\nMIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE\nChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy\nMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs\nIFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA\nA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE\nNySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i\no74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo\nBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0\ndXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw\nIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY\nMBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM\nBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB\nACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq\nkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4\nRbyhkwS7hp86W0N6w4pl\n-----END CERTIFICATE-----\n\nDigital Signature Trust Co. Global CA 3\n=======================================\n-----BEGIN CERTIFICATE-----\nMIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE\nChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy\nMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs\nIFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA\nA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD\nVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS\nxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo\nBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0\ndXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw\nIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY\nMBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM\nBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB\nAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi\nup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1\nmPnHfxsb1gYgAlihw6ID\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow\nXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz\nIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94\nf56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol\nhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA\nTxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah\nWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf\nTqj/ZA1k\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority - G2\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO\nFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71\nlSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB\nMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT\n1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD\nOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9\n-----END CERTIFICATE-----\n\nVerisign Class 4 Public Primary Certification Authority - G2\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4\nxBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH\nqGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB\nMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF\nWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB\nZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp\n-----END CERTIFICATE-----\n\nGlobalSign Root CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\nGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\nb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\nBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\nVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\nDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\nTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\nKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\nc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ngzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\nAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\nY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\nj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\nhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\nX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\nErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ns6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\nS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\nTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\nygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\nYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\nBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\n9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\n01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\n9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\nTBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n-----END CERTIFICATE-----\n\nValiCert Class 1 VA\n===================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy\nMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi\nGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm\nDuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG\nlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX\nicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP\nOrf1LXLI\n-----END CERTIFICATE-----\n\nValiCert Class 2 VA\n===================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw\nMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC\nCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf\nZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ\nSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV\nUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8\nW9ViH0Pd\n-----END CERTIFICATE-----\n\nRSA Root Certificate 1\n======================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw\nMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td\n3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H\nBFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs\n3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF\nV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r\non+jjBXu\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority - G3\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\nEUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ncLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\nEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\n055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\nj267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\n/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\nxuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\nt20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\n-----END CERTIFICATE-----\n\nVerisign Class 4 Public Primary Certification Authority - G3\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS\ntBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM\n8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW\nLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX\nRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nj/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt\nmhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\nfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd\nRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG\nUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\n-----END CERTIFICATE-----\n\nEntrust.net Secure Server CA\n============================\n-----BEGIN CERTIFICATE-----\nMIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV\nBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg\ncmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl\nZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG\nA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi\neSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p\ndGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ\naO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5\ngXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw\nggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw\nCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l\ndC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\nbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\ndHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw\nNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow\nHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA\nBAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN\nEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9\nn9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n-----END CERTIFICATE-----\n\nEntrust.net Premium 2048 Secure Server CA\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\nZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\nbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\nBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\nNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\nd3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\nMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\nZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\nGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\nhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\nnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\nVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC\nAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER\ngL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B\nAQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo\noPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS\no8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z\n2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX\nOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==\n-----END CERTIFICATE-----\n\nBaltimore CyberTrust Root\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\nChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\nZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\nSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ndGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\nuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\nUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\nG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\nXbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\nl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\nVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\nBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ncL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\nhbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\nY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\nRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n\nEquifax Secure Global eBusiness CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp\nbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx\nHDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds\nb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV\nPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN\nqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn\nhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j\nBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs\nMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN\nI7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY\nNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\n-----END CERTIFICATE-----\n\nEquifax Secure eBusiness CA 1\n=============================\n-----BEGIN CERTIFICATE-----\nMIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB\nLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE\nChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz\nIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ\n1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a\nIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk\nMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW\nNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF\nAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5\nlSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+\nKpYrtWKmpj29f5JZzVoqgrI3eQ==\n-----END CERTIFICATE-----\n\nEquifax Secure eBusiness CA 2\n=============================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE\nChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y\nMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT\nDkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn\n2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5\nBxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG\nA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx\nJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG\nA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e\nuSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB\nAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1\njokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia\n78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm\nV+GRMOrN\n-----END CERTIFICATE-----\n\nAddTrust Low-Value Services Root\n================================\n-----BEGIN CERTIFICATE-----\nMIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU\ncnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw\nCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO\nZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6\n54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr\noulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1\nZmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui\nGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w\nHQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD\nAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT\nRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw\nHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt\nZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph\niVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\neDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr\nmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj\nccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\n-----END CERTIFICATE-----\n\nAddTrust External Root\n======================\n-----BEGIN CERTIFICATE-----\nMIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\nVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\nNDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ncnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\nUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\n+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\nTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\naSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\n2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\n7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\nVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\nVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\nIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\nj7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ne6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\nG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n-----END CERTIFICATE-----\n\nAddTrust Public Services Root\n=============================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU\ncnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ\nBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l\ndHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu\nnyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i\nd9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG\nAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw\nHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G\nA1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux\nFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G\nA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4\nJNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL\n+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\nGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9\nYjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H\nEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\n-----END CERTIFICATE-----\n\nAddTrust Qualified Certificates Root\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU\ncnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx\nCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ\nIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx\n64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3\nKP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o\nL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR\nwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU\nMIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE\nBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y\nazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD\nggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG\nGuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\ndgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze\nRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB\niFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\nb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\nA1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\nMloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\nMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\nY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ndCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\nA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\nCj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\nj6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\nrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\nMzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\nhmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\nY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\nv52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\nW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ntHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n\nRSA Security 2048 v3\n====================\n-----BEGIN CERTIFICATE-----\nMIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK\nExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy\nMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb\nBgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7\nJylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb\nWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH\nKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP\n+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/\nMA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E\nFgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY\nv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj\n0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj\nVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395\nnzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA\npKnXwiJPZ9d37CAFYd4=\n-----END CERTIFICATE-----\n\nGeoTrust Global CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\nEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\nMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\nBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\n8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\nT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\nvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\nDBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\nzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\nd0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\nmqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\nXE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\nMw==\n-----END CERTIFICATE-----\n\nGeoTrust Global CA 2\n====================\n-----BEGIN CERTIFICATE-----\nMIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw\nMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/\nNTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k\nLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA\nVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b\nHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH\nK266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7\nsrJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh\nZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL\nOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC\nx1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF\nH4z1Ir+rzoPz4iIprn2DQKi6bA==\n-----END CERTIFICATE-----\n\nGeoTrust Universal CA\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\nMDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\nYy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\nJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\nRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\n7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\n8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\nqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\nRr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\nZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\nKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\nni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\nXG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\naanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\nqaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\noJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\nxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\nKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\nDFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\nxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\np8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\nP/rmMuGNG2+k5o7Y+SlIis5z/iw=\n-----END CERTIFICATE-----\n\nGeoTrust Universal CA 2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\nMDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\nSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\nDE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\nj1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\nJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\nQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\nWP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\n20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\nZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\nSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\n8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\n+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\nBAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ndXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\n4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\nmbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\nA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\nY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\npm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\nFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ngn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\nX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\n-----END CERTIFICATE-----\n\nAmerica Online Root Certification Authority 1\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG\nA1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg\nT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG\nv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z\nDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh\nsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP\n8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z\no/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf\nGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF\nVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft\n3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g\nKd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds\nsPmuujz9dLQR6FgNgLzTqIA6me11zEZ7\n-----END CERTIFICATE-----\n\nAmerica Online Root Certification Authority 2\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG\nA1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg\nT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en\nfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8\nf3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO\nqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN\nRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0\ngBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn\n6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid\nFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6\nKc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj\nB453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op\naaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY\nT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p\n+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg\nJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy\nzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO\nZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh\n1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf\nGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff\nZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP\ncX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=\n-----END CERTIFICATE-----\n\nVisa eCommerce Root\n===================\n-----BEGIN CERTIFICATE-----\nMIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\nEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\nQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\nWhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\nVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\nbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\nF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\nRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\nTP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\n/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\nGHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\nMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\nCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\nYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\nzkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\nYQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\n398znM/jra6O1I7mT1GvFpLgXPYHDw==\n-----END CERTIFICATE-----\n\nTC TrustCenter, Germany, Class 2 CA\n===================================\n-----BEGIN CERTIFICATE-----\nMIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI\nEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig\nU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD\nbGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05\nODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt\nYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy\naXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg\nMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI\nhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs\nqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N\nu6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB\nAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy\nLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf\n/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2\n9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac\nASZ4smZHcFFk\n-----END CERTIFICATE-----\n\nTC TrustCenter, Germany, Class 3 CA\n===================================\n-----BEGIN CERTIFICATE-----\nMIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI\nEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig\nU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD\nbGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05\nODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt\nYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy\naXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg\nMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI\nhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN\n2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7\n7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB\nAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy\nLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B\nu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm\n5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS\nCdS7kjXvD9s0\n-----END CERTIFICATE-----\n\nCertum Root CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK\nExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla\nFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u\nby4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x\nwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL\nkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ\n89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K\nUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P\nNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq\nhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+\nGXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg\nGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/\n0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS\nqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==\n-----END CERTIFICATE-----\n\nComodo AAA Services root\n========================\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\nMFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\nc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\nBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\nC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ni14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\nY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\nYpy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\nIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\nBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ncy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\nLmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\n7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\n8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\n12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n\nComodo Secure Services root\n===========================\n-----BEGIN CERTIFICATE-----\nMIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw\nMDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu\nY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi\nBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP\n9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc\nrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC\noznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V\np6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E\nFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ngYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj\nYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm\naWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm\n4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\nZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL\nDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw\npCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H\nRR3B7Hzs/Sk=\n-----END CERTIFICATE-----\n\nComodo Trusted Services root\n============================\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw\nMDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h\nbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw\nIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7\n3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y\n/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6\njuljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS\nivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud\nDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp\nZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl\ncnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw\nuleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\npSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA\nBHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l\nR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O\n9y5Xt5hwXsjEeLBi\n-----END CERTIFICATE-----\n\nQuoVadis Root CA\n================\n-----BEGIN CERTIFICATE-----\nMIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\nChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\nMTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ncyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\nEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\nJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\nF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\nYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\nAScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\nPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\nZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\nMIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\nYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\nZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\nY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\nFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\nBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\nFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ntlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\nfFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\nLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ngI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\n5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\n5nrQNiOKSnQ2+Q==\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 2\n==================\n-----BEGIN CERTIFICATE-----\nMIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\nODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\nXJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\nlvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\nlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\nlZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\n66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\nwQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\nD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\nBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\nJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\nDgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\na6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\nElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\nZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\nUIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\nVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\n+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\nIozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\nWVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\nf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\n4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\nVCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 3\n==================\n-----BEGIN CERTIFICATE-----\nMIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\nOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\nDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\nKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\nDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\nBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\np5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\nnT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\nMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\nGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\nuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\nBgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\nYXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\naWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\nBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\nVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\nywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\nAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\nqyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\nhvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\nPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\nPb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\n8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\nbjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ng/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\nvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\nqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\n-----END CERTIFICATE-----\n\nSecurity Communication Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\n8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\nDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\n5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\nDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\nJChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\n0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\nmCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ns58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\n6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\nFL39vmwLAw==\n-----END CERTIFICATE-----\n\nSonera Class 2 Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\nU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\nNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\nIENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\n/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ndXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\nf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ntOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\nnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\nXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\n0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ncbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\nOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\nEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\nllpwrN9M\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA\n=============================\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE\nChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w\nHAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh\nbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt\nvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P\njLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca\nC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth\nvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6\n22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV\nHSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v\ndC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN\nBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR\nEytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw\nMVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y\nnGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR\niJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==\n-----END CERTIFICATE-----\n\nTDC Internet Root CA\n====================\n-----BEGIN CERTIFICATE-----\nMIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE\nChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx\nNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu\nZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j\nxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL\nznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc\n5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6\notZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI\nAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM\nVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM\nMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC\nAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe\nUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G\nCSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m\ngwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+\n2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb\nO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU\nCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l\n-----END CERTIFICATE-----\n\nTDC OCES Root CA\n================\n-----BEGIN CERTIFICATE-----\nMIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE\nChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5\nMzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH\nnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0\nzY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV\niGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde\ndObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO\n3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB\n5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k\nay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm\ncmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp\nY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x\nLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM\nMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm\naHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy\nMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647\n+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6\nNC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4\nA9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc\nA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9\nAOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1\nAoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==\n-----END CERTIFICATE-----\n\nUTN DATACorp SGC Root CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ\nBgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa\nMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w\nHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy\ndXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys\nraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo\nwHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA\n9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv\n33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud\nDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9\nBgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD\nLmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3\nDQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft\nGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0\nI3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx\nEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP\nDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI\n-----END CERTIFICATE-----\n\nUTN USERFirst Hardware Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd\nBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx\nOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0\neTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz\nZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI\nwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd\ntqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8\ni4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf\nPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw\ngbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF\nlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF\nUkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF\nBwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\n//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW\nXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2\nlzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn\niCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67\nnfhmqA==\n-----END CERTIFICATE-----\n\nCamerfirma Chambers of Commerce Root\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx\nNjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp\ncm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn\nMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC\nAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU\nxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH\nNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW\nDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV\nd9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud\nEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v\ncmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P\nAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh\nbWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD\nVR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\naWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi\nfJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD\nL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN\nUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n\nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1\nerfutGWaIZDgqtCYvDi1czyL+Nw=\n-----END CERTIFICATE-----\n\nCamerfirma Global Chambersign Root\n==================================\n-----BEGIN CERTIFICATE-----\nMIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx\nNDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt\nYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg\nMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw\nggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J\n1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O\nby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl\n6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c\n8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/\nBAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j\naGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B\nAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj\naGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y\nZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\nbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA\nPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y\ngOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ\nPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4\nIBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes\nt2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\n-----END CERTIFICATE-----\n\nNetLock Notary (Class A) Root\n=============================\n-----BEGIN CERTIFICATE-----\nMIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI\nEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ndG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j\nayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX\nDTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH\nEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD\nVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz\ncyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM\nD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ\nz+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC\n/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7\ntqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6\n4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG\nA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC\nAk1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv\nbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu\nIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn\nLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0\nZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz\nIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh\nIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu\nb3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh\nbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg\nQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp\nbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5\nayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP\nytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB\nCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr\nKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM\n8CgHrTwXZoi1/baI\n-----END CERTIFICATE-----\n\nNetLock Business (Class B) Root\n===============================\n-----BEGIN CERTIFICATE-----\nMIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT\nCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV\nBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg\nVGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD\nVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv\nbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg\nVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\niQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S\no/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr\n1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV\nHQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ\nRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh\ndGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0\nZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv\nc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg\nYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh\nc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz\nOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA\nbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl\nIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2\nYWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj\ncHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM\n43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR\nstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI\n-----END CERTIFICATE-----\n\nNetLock Express (Class C) Root\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT\nCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV\nBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD\nKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ\nBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ndG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j\nayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB\njQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z\nW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63\neuyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw\nDgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN\nRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn\nYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB\nIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i\naXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0\nZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs\nZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo\ndHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y\nemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k\nIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ\nUyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg\nYXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2\nxJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW\ngyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==\n-----END CERTIFICATE-----\n\nXRamp Global CA Root\n====================\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\nBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ndXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\nHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\nU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\nIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\nfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\nzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\nAxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\nxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\noCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\nAQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\n/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\n8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n\nGo Daddy Class 2 CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\nVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\nA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\nRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\nggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\nqRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\nYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\nvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\nBBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\natTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\nMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\nA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\nPQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\nI3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\nLs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\nvZ8=\n-----END CERTIFICATE-----\n\nStarfield Class 2 CA\n====================\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\nU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\nMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\nA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\nSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\nbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\nJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\nepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\nF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\nMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\nhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\nbm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\nQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\nafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\nPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\nKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\nQBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n\nStartCom Certification Authority\n================================\n-----BEGIN CERTIFICATE-----\nMIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\nZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\nNjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\nLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\nU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\no4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\nHo/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\neMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\n2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\n6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\nosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\nuntp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\nUjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\n37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\nFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0\nY29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj\nYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH\nAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw\nOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg\nU3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5\nLCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh\ncnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT\ndGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC\nAgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh\n3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm\nvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk\nfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3\nfsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ\nEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\nyvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl\n1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/\nlwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro\ng14=\n-----END CERTIFICATE-----\n\nTaiwan GRCA\n===========\n-----BEGIN CERTIFICATE-----\nMIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\nEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\nDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ndmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\nw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\nBtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\n1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\nhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\nJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\nQ3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\nB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\nO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\nlSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\nHRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\n09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\nTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\nZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\nNe//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\nD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\nDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\nZ6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\n7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\nCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\n+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\n-----END CERTIFICATE-----\n\nFirmaprofesional Root CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT\nGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp\nY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA\nZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL\nMAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT\nOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2\nODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V\nj1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH\nlShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf\n3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8\nNeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww\nKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG\nAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud\nDwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD\nggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq\nu00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf\nwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm\n7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG\nVM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=\n-----END CERTIFICATE-----\n\nWells Fargo Root CA\n===================\n-----BEGIN CERTIFICATE-----\nMIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV\nBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl\nbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv\nMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX\nx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3\nE48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5\nOEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j\nsNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj\nYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF\nBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD\nggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv\nm+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R\nOhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx\nx32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023\ntqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=\n-----END CERTIFICATE-----\n\nSwisscom Root CA 1\n==================\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG\nEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ndmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4\nMTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\naXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM\nMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF\nNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe\nAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC\nb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn\n7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN\ncA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp\nWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5\nhaa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY\nMUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\nHQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\nBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9\nMA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn\njgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ\nMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H\nVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl\nvrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl\nOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3\n1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq\nnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy\nx/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW\nNY6E0F/6MBr1mmz0DlP5OlvRHA==\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\nMTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\n9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\nUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\n/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\noeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\nGHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\n66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\nhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\nEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\nSbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\n8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n\nDigiCert Global Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\nMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\nTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\nBmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\n4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\n7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\no2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\n8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\nBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\nEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ntep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\nUAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\nDigiCert High Assurance EV Root CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\nKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\nMFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\nMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\nY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\nMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\nOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\nMRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\nNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\nh10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\nJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\nV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\nmyPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\nmNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\n-----END CERTIFICATE-----\n\nCertplus Class 2 Primary CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\nBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\nOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ndHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\n5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\nVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\nYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ne++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\nCDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\nYIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\nL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\nP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\nTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\n7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\n//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\nl7+ijrRU\n-----END CERTIFICATE-----\n\nDST Root CA X3\n==============\n-----BEGIN CERTIFICATE-----\nMIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\nExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\nDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ncmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\nrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\nUL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\nxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\nutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\nMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ndB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\nGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\nRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\nfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n-----END CERTIFICATE-----\n\nDST ACES CA X6\n==============\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT\nMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha\nMFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE\nCxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI\nDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa\npCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow\nGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy\nMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu\nY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy\ndXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU\nCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2\n5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t\nFr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq\nnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs\nvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3\noKfN5XozNmr6mis=\n-----END CERTIFICATE-----\n\nTURKTRUST Certificate Services Provider Root 1\n==============================================\n-----BEGIN CERTIFICATE-----\nMIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP\nMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0\nacWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx\nMDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg\nU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB\nTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC\naWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX\nyGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i\nSi9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ\n8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4\nW09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME\nBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46\nsWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE\nq8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy\nB0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY\nnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H\n-----END CERTIFICATE-----\n\nTURKTRUST Certificate Services Provider Root 2\n==============================================\n-----BEGIN CERTIFICATE-----\nMIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP\nMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg\nQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN\nMDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr\ndHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G\nA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls\nacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe\nLCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI\nx+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g\nQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr\n5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB\nAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G\nA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt\nRbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4\nJl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+\nhGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P\n9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5\nUrbnBEI=\n-----END CERTIFICATE-----\n\nSwissSign Gold CA - G2\n======================\n-----BEGIN CERTIFICATE-----\nMIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\nEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\nMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\nc3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\nt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\njCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\nvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\nylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\nAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\njIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\npeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\n7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\nGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\nOfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\nL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\n5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\n44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\nMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\nGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\nmo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\nvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\nKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\nNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\nviOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\n-----END CERTIFICATE-----\n\nSwissSign Silver CA - G2\n========================\n-----BEGIN CERTIFICATE-----\nMIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\nBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\nDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\naXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\n9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\nN0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\n+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\n6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\nMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\nqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\nFZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\nROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ncelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\nCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ntjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ncDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\n4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\nkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\n3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\n/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\nDGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ne97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\nWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\nDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\nDgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\nCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ncmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\nb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\nnceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\nRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ntm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\nhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\nTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\nNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\nFloxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\n1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\n-----END CERTIFICATE-----\n\nthawte Primary Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\nMDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\nSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\nKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\nFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\noPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\n1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\nq/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\naAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\nafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\nAAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\nuzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\nxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\njxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\nz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\n-----END CERTIFICATE-----\n\nVeriSign Class 3 Public Primary Certification Authority - G5\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\nbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ndXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\nYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\nj/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\nY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\nArr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\nfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\nBAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\nZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\naXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\nSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\nX6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\nKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\nKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\nZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n-----END CERTIFICATE-----\n\nSecureTrust CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ndXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\nBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\nOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\nDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\nGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\n01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\nursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\naHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\nSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\nmbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\nnMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n\nSecure Global CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\nbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\nMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\nQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\nYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\nbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\n8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\nHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\n0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\noCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\nMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\nOYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\nCDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\n3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n\nCOMODO Certification Authority\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\nMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\nT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\n+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\nxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\n4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\n1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\nrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\nb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\nAQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\nOGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\nIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\n+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\n-----END CERTIFICATE-----\n\nNetwork Solutions Certificate Authority\n=======================================\n-----BEGIN CERTIFICATE-----\nMIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\nEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\nIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\nMjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\nMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\njOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\naaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ncrA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\n/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\nAAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\nbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\nA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\n4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\nGGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\nwKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\nydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\n-----END CERTIFICATE-----\n\nWellsSecure Public Root Certificate Authority\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM\nF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw\nNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl\nbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD\nVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1\niGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13\ni0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8\nbJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB\nK0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB\nAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu\ncGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm\nlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB\ni6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww\nGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI\nK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0\nbh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj\nqHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es\nE2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ\ntylv2G0xffX8oRAHh84vWdw+WNs=\n-----END CERTIFICATE-----\n\nCOMODO ECC Certification Authority\n==================================\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\nGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\nQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\nb3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\n4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\nwz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\nFAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\nU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n\nIGC/A\n=====\n-----BEGIN CERTIFICATE-----\nMIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD\nVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE\nQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy\nMB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI\nEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT\nSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2\nTqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW\nSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy\nHF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd\nfrGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ\ntQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB\negF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC\niQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK\nq89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q\nMZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg\nCrpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI\nlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF\n0mBWWg==\n-----END CERTIFICATE-----\n\nSecurity Communication EV RootCA1\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE\nBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl\nY3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO\n/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX\nWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z\nZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4\nbepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK\n9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\nSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm\niEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG\nAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW\nmHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW\nT1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490\n-----END CERTIFICATE-----\n\nOISTE WISeKey Global Root GA CA\n===============================\n-----BEGIN CERTIFICATE-----\nMIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\nBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\nA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\nbG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\nVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\nIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\nIEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\nNt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\nAsj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\nd50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\n/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\nLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\nMMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\n+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\nhNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\nokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE\nBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL\nEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0\nMDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz\ndDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT\nGU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG\nd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N\noqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc\nQR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ\nPqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb\nMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG\nIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD\nVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3\nLmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A\ndAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn\nAGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA\n4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg\nAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA\negBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6\nLy93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO\nPU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv\nc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h\ncnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw\nIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT\nWjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV\nMIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER\nMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp\nZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal\nHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT\nnGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE\naGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a\n86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK\nyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB\nS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=\n-----END CERTIFICATE-----\n\nCertigna\n========\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\nEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\nMDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\nQ2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\nXOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\nGxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\nogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\nDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\nIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ntCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\nBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\nSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\nhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\nImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\nPBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\n1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n\nAC Ra\\xC3\\xADz Certic\\xC3\\xA1mara S.A.\n======================================\n-----BEGIN CERTIFICATE-----\nMIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT\nAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg\nLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w\nHhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+\nU29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh\nIFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN\nyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU\n2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3\n4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP\n2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm\n8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf\nHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa\nMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK\n5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b\nczwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\nAwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g\nADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF\nBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug\ncHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf\nAygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX\nEpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v\n/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3\nMGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4\n3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk\neZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f\n/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h\nRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU\nIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==\n-----END CERTIFICATE-----\n\nTC TrustCenter Class 2 CA II\n============================\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy\nIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw\nMTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1\nc3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE\nAxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw\nIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2\nxgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ\nXa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u\nSNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB\n7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90\nY19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU\ncnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i\nSCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G\ndXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ\nKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj\nTYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP\nJOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk\nvQ==\n-----END CERTIFICATE-----\n\nTC TrustCenter Class 3 CA II\n============================\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy\nIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw\nMTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1\nc3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE\nAxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W\nyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo\n6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ\nuV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk\n2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB\n7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90\nY19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU\ncnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i\nSCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE\nO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8\nyRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9\nIJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal\n092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc\n5A==\n-----END CERTIFICATE-----\n\nTC TrustCenter Universal CA I\n=============================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy\nIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN\nMDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg\nVHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw\nJAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC\nqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv\nxrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw\nag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O\ngdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j\nBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG\n1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy\nvwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3\nghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT\nujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a\n7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY\n-----END CERTIFICATE-----\n\nDeutsche Telekom Root CA 2\n==========================\n-----BEGIN CERTIFICATE-----\nMIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\nRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\nA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\nMjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\nA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\nb290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\nbzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\nKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\nAUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\nSe5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\njlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\nHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\nE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\nzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\nrZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ndyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\nCm26OWMohpLzGITY+9HPBVZkVw==\n-----END CERTIFICATE-----\n\nComSign Secured CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE\nAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w\nNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD\nQTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs\n49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH\n7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB\nkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1\n9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw\nAwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t\nU2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA\nj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC\nAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a\nBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp\nFhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP\n51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz\nOjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==\n-----END CERTIFICATE-----\n\nCybertrust Global Root\n======================\n-----BEGIN CERTIFICATE-----\nMIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\nZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\nMDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\nExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\n0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\nAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\n89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\n8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\nMDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\nA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\nlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\n5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\nhO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\nX3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\nWL1WMRJOEcgh4LMRkWXbtKaIOM5V\n-----END CERTIFICATE-----\n\nePKI Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\nEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\nUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\nMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\nMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\nIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\nlTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\nqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\n12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\nWQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\nETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\nlQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\nvv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\nZo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\nMAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\n1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\nKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\nxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\nNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\nGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\nxJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ngMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\nsP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\nBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n\nT\\xc3\\x9c\\x42\\xC4\\xB0TAK UEKAE K\\xC3\\xB6k Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1 - S\\xC3\\xBCr\\xC3\\xBCm 3\n=============================================================================================================================\n-----BEGIN CERTIFICATE-----\nMIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH\nDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q\naWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry\nb25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV\nBAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg\nS8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4\nMjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl\nIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF\nn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl\nIEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft\ndSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl\ncnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO\nEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1\nxnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR\n6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL\nhmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd\nBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4\nN5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT\ny9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh\nLBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M\ndqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=\n-----END CERTIFICATE-----\n\nBuypass Class 2 CA 1\n====================\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2\nMTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\nc3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M\ncXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83\n0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4\n0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R\nuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P\nAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV\n1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt\n7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2\nfZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w\nwDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho\n-----END CERTIFICATE-----\n\nBuypass Class 3 CA 1\n====================\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1\nMDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\nc3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx\nifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0\nn6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia\nAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c\n1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P\nAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7\npYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA\nEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5\nhtOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj\nel/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915\n-----END CERTIFICATE-----\n\nEBG Elektronik Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1\n==========================================================================\n-----BEGIN CERTIFICATE-----\nMIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg\nQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe\nFw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p\nayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt\nIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by\nX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b\ngmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr\neYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ\nTqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy\nY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn\nuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI\nqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm\nExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0\nNokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW\nZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t\nFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm\nzJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k\nXPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT\nbCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU\nRT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK\n1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt\n2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ\nY9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9\nAahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT\n-----END CERTIFICATE-----\n\ncertSIGN ROOT CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\nVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\nFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\nCxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\nJUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\nrfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\nssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\n0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\nAAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\nAf8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\nAQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\nSG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\nx2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\nvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\nTogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n\nCNNIC ROOT\n==========\n-----BEGIN CERTIFICATE-----\nMIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE\nChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw\nOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD\no+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz\nVHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT\nVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or\nczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK\ny5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC\nwQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S\nlgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5\nGv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM\nO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8\nBS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2\nG8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m\nmxE=\n-----END CERTIFICATE-----\n\nApplicationCA - Japanese Government\n===================================\n-----BEGIN CERTIFICATE-----\nMIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT\nSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw\nMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl\ncm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4\nfl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN\nwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE\njP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu\nnyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU\nWssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV\nBAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD\nvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs\no2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g\n/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD\nio+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW\ndupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL\nrosot4LKGAfmt1t06SAZf7IbiVQ=\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority - G3\n=============================================\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\nBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\nIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\nNTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\nYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\nLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\nK/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\nc5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\nIShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ndlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\n2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ncr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\nAp7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\nAWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\nt/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\n-----END CERTIFICATE-----\n\nthawte Primary Root CA - G2\n===========================\n-----BEGIN CERTIFICATE-----\nMIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\nVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\nIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\nQ0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\nMBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\nb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\nIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\nLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\n8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\nmtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\nG4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\nrr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\n-----END CERTIFICATE-----\n\nthawte Primary Root CA - G3\n===========================\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\nODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\nd3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\nVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\nA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\nP0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\n+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\n7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\nvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\nKoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\nA3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\nt8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\n8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ner/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority - G2\n=============================================\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\nYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\nOVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\nMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\nb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\nBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\nKiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\nVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\nEVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\nndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\nnpaqBA+K\n-----END CERTIFICATE-----\n\nVeriSign Universal Root Certification Authority\n===============================================\n-----BEGIN CERTIFICATE-----\nMIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\nIEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\n1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\nMiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\n9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\nAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ntPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\nCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\na8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\nDgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\nY8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\nY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\nP/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\nwGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\nmJO37M2CYfE45k+XmCpajQ==\n-----END CERTIFICATE-----\n\nVeriSign Class 3 Public Primary Certification Authority - G4\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\nVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\nb3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\nZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ncnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\nb3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\nUtpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\nrl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\nHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\nY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\nA2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\nAJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\n-----END CERTIFICATE-----\n\nNetLock Arany (Class Gold) Főtanúsítvány\n============================================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\nA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ndsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ncmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\nMjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\nZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\nc8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\n0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\n/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\nH3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\nfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\nneWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\nqZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\nYtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\nNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ndZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA - G2\n==================================\n-----BEGIN CERTIFICATE-----\nMIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\nTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\nZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\n5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\nvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\nCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ne7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\nOME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\nCT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\n48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ntrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\nqWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\nAAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\nARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\nA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\n+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\nf/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\nkqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\nCpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\nURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\nCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\noKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\nIPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\n66+KAQ==\n-----END CERTIFICATE-----\n\nCA Disig\n========\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK\nQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw\nMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz\nbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm\nGErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD\nPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo\nhwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt\nymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w\ngfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P\nAQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz\naWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff\nZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa\nBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t\nWDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3\nmkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/\nCBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K\nezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA\n4Z7CRneC9VkGjCFMhwnN5ag=\n-----END CERTIFICATE-----\n\nJuur-SK\n=======\n-----BEGIN CERTIFICATE-----\nMIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA\nc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw\nDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG\nSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy\naW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf\nTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC\n+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw\nUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa\nTpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF\nMAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD\nHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh\nAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA\ncwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr\nAGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw\ncy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE\nFASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G\nA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo\nERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL\nabVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678\nIIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh\nMp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2\nyyqcjg==\n-----END CERTIFICATE-----\n\nHongkong Post Root CA 1\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\nDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\nNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\nApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\nauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\nqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\nV18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\nHRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\nh9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\nl7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\nIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\nT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\nc4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\n-----END CERTIFICATE-----\n\nSecureSign RootCA11\n===================\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\nSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\nb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\nKQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ncmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\nTJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\nwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ng6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\nO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\nbpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\nt94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\nOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\nbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\nOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ny8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\nlgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n\nACEDICOM Root\n=============\n-----BEGIN CERTIFICATE-----\nMIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD\nT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4\nMDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG\nA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk\nWLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD\nYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew\nMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb\nm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk\nHQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT\nxKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2\n3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9\n2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq\nTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz\n4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU\n9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv\nbS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg\naHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP\neGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk\nzQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1\nThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI\nKiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq\nnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE\nI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp\nMCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o\ntkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow\nXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz\nIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94\nf56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol\nhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky\nCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX\nbj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/\nD/xwzoiQ\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA 2009\n==============================\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\nMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\nc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\nBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\nU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\nfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\n0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\npxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\n1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\nAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\nQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\nFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\nlZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\nI/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\nyULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\nLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n\nE-Guven Kok Elektronik Sertifika Hizmet Saglayicisi\n===================================================\n-----BEGIN CERTIFICATE-----\nMIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\nEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz\nZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3\nMDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0\ncm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u\naWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY\n8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y\njfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI\nJjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk\n9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD\nAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG\nSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d\nF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq\nD2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4\nVwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq\nfJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R3\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\niHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\n0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\nrHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\nOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\nxmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\nlgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\nEpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\nbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\nYIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\nkpeDMdmztcpHWD9f\n-----END CERTIFICATE-----\n\nTC TrustCenter Universal CA III\n===============================\n-----BEGIN CERTIFICATE-----\nMIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy\nIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe\nFw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU\nQyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex\nKDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt\nQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO\njuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut\nCHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1\nM4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G\nA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\nBAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA\ng8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+\nKGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK\nBgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV\nCIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq\nwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==\n-----END CERTIFICATE-----\n\nAutoridad de Certificacion Firmaprofesional CIF A62634068\n=========================================================\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\nBgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\nQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\nNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\nUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\nB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\n7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\nECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\nplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\nMbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\nLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\nbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\nvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\nEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\nDhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ncm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\nbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\nADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\n51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\nR71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\nT481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\nJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\nosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ncrHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\nsaS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\nKCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\n6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n-----END CERTIFICATE-----\n\nIzenpe.com\n==========\n-----BEGIN CERTIFICATE-----\nMIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\nEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\nMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\nQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\n03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\nClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\n+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\nPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\nOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\nF7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\n0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\n0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\nleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\nAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\nSVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\nNjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\nMCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\nBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\nFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\nkEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\nhT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ng1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\naTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\nnXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\nClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\nQ0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\nWrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\n-----END CERTIFICATE-----\n\nChambers of Commerce Root - 2008\n================================\n-----BEGIN CERTIFICATE-----\nMIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\nMjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\nZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\nEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ncnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\nAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\nXuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\nh40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\nikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\nNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\nD2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\nlubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\n0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\nya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\nEQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\nG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\nBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\nbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\nbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\nCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\nAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\nwqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\n3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\nRWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\nM6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\nYJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\n9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\nzBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\nnrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\nOGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\n-----END CERTIFICATE-----\n\nGlobal Chambersign Root - 2008\n==============================\n-----BEGIN CERTIFICATE-----\nMIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\nNDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\nY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\nQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\naGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\nVtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\nXjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\nZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\n/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\nTH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\nH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\nOx2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\nHTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\nwZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\nAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\nBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\nBhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\naXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\naXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\n1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ndHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\n/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\nReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ndZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\n9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\nfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\nqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\nP3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\nc5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\n09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\n-----END CERTIFICATE-----\n\nGo Daddy Root Certificate Authority - G2\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\nMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\nA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\nfMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\nNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\nBUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\nvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\nN8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n-----END CERTIFICATE-----\n\nStarfield Root Certificate Authority - G2\n=========================================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\neSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\nDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\nVGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ndXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\nW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\nbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\nN3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\nZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\nJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\nTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\n4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\nF5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\nc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n\nStarfield Services Root Certificate Authority - G2\n==================================================\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\nIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\nBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ndGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\nh/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\nhHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\nLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\nrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\nSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\nE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\nxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\nYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\n-----END CERTIFICATE-----\n\nAffirmTrust Commercial\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\nMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\nDuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\nC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\nBfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\nMmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\nHQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\nhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\nqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\n0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\nsUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n\nAffirmTrust Networking\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\nMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\nHi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ndIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\n/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\nh+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\nHQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\nUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\n12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\nWJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\n/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n\nAffirmTrust Premium\n===================\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\nOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ndXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\nBKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\n5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\n+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\nGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\np9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\nS+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\n6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\n/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\n+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\nMiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\n6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\nL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\n+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\nBtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\nIxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ng2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\nzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n\nAffirmTrust Premium ECC\n=======================\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\nBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\nMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ncnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\nN8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\nBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\nBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\n57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\neQ==\n-----END CERTIFICATE-----\n\nCertum Trusted Network CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\nExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\nMTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\nZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\nl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\nJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\nfOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ncvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\nDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\njSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\nmS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\nZt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n\nCertinomis - Autorité Racine\n=============================\n-----BEGIN CERTIFICATE-----\nMIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\nQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg\nLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG\nA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw\nJAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa\nwE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly\nLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw\n2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N\njMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q\nc1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC\nlrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb\nxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g\n530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna\n4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ\nKoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x\nWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva\nR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40\nnJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B\nCxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv\nJL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE\nqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b\nWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE\nwk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/\nvgt2Fl43N+bYdJeimUV5\n-----END CERTIFICATE-----\n\nRoot CA Generalitat Valenciana\n==============================\n-----BEGIN CERTIFICATE-----\nMIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE\nChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290\nIENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3\nWjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE\nCxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2\nF0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B\nZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ\nD0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte\nJajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB\nAAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n\ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB\nADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl\nAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA\nYQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy\nAGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA\naQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt\nAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA\nYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu\nAHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA\nOgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0\ndHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV\nBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G\nA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S\nb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh\nTvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz\nCkj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63\nNI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH\niJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt\n+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=\n-----END CERTIFICATE-----\n\nA-Trust-nQual-03\n================\n-----BEGIN CERTIFICATE-----\nMIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE\nCgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy\na2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R\ndWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw\nRgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0\nZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1\nc3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA\nzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n\nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE\nSU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4\niHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V\ncuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV\neRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40\nozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr\nsQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd\nJXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS\nmYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6\nahq97BvIxYSazQ==\n-----END CERTIFICATE-----\n\nTWCA Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\nVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\nEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\nIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\nQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\noi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\n4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ny+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\nBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\n9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\nmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\nQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\nT0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\nYh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "tools/run.hxml",
    "content": "-main RunScript\n-neko ../run.n\n-lib hxp"
  },
  {
    "path": "tools/svg.hxml",
    "content": "-main SVGExport\n-neko ../svg.n\n-D lime=7.0.0\n-cp ../src\n-lib hxp\n-lib openfl\n-lib svg\n-D lime-cairo\n-D lime-cffi\n--remap flash:openfl\n"
  },
  {
    "path": "tools/tools.hxml",
    "content": "-main CommandLineTools\n-neko tools.n\n-D lime-curl\n-D lime-cffi\n-D lime\n-cp platforms\n-cp ../src\n-lib format\n-lib hxp\n#-lib svg\n-D optional-cffi\n"
  },
  {
    "path": "tools/utils/CreateTemplate.hx",
    "content": "package utils;\n\nimport hxp.*;\nimport lime.tools.HXProject;\nimport lime.tools.ProjectHelper;\nimport sys.FileSystem;\n\n@:access(lime.tools.HXProject)\nclass CreateTemplate\n{\n\tpublic static function createExtension(words:Array<String>, userDefines:Map<String, Dynamic>):Void\n\t{\n\t\tvar title = \"SampleExtension\";\n\n\t\tif (words.length > 1)\n\t\t{\n\t\t\ttitle = words[1];\n\t\t}\n\n\t\tvar file = StringTools.replace(title, \" \", \"\");\n\t\tvar extension = StringTools.replace(file, \"-\", \"_\");\n\t\tvar className = extension.substr(0, 1).toUpperCase() + extension.substr(1);\n\n\t\tvar context:Dynamic = {};\n\t\tcontext.file = file;\n\t\tcontext.extension = extension;\n\t\tcontext.className = className;\n\t\tcontext.extensionLowerCase = extension.toLowerCase();\n\t\tcontext.extensionUpperCase = extension.toUpperCase();\n\t\tcontext.ANDROID_TARGET_SDK_VERSION = \"::ANDROID_TARGET_SDK_VERSION::\";\n\t\tcontext.ANDROID_MINIMUM_SDK_VERSION = \"::ANDROID_MINIMUM_SDK_VERSION::\";\n\t\tcontext.META_BUILD_NUMBER = \"::META_BUILD_NUMBER::\";\n\t\tcontext.META_VERSION = \"::META_VERSION::\";\n\t\tcontext.ANDROID_GRADLE_PLUGIN = \"::ANDROID_GRADLE_PLUGIN::\";\n\n\t\tSystem.mkdir(title);\n\t\tSystem.recursiveCopyTemplate([Haxelib.getPath(new Haxelib(\"lime\"), true) + \"/templates\"], \"extension\", title, context);\n\n\t\tif (FileSystem.exists(title + \"/Extension.hx\"))\n\t\t{\n\t\t\tFileSystem.rename(title + \"/Extension.hx\", title + \"/\" + className + \".hx\");\n\t\t}\n\n\t\tif (FileSystem.exists(title + \"/project/common/Extension.cpp\"))\n\t\t{\n\t\t\tFileSystem.rename(title + \"/project/common/Extension.cpp\", title + \"/project/common/\" + file + \".cpp\");\n\t\t}\n\n\t\tif (FileSystem.exists(title + \"/project/include/Extension.h\"))\n\t\t{\n\t\t\tFileSystem.rename(title + \"/project/include/Extension.h\", title + \"/project/include/\" + file + \".h\");\n\t\t}\n\n\t\tif (FileSystem.exists(title + \"/dependencies/android/src/main/java/org/haxe/extension/Extension.java\"))\n\t\t{\n\t\t\tFileSystem.rename(title\n\t\t\t\t+ \"/dependencies/android/src/main/java/org/haxe/extension/Extension.java\",\n\t\t\t\ttitle\n\t\t\t\t+ \"/dependencies/android/src/main/java/org/haxe/extension/\"\n\t\t\t\t+ file\n\t\t\t\t+ \".java\");\n\t\t}\n\n\t\tif (FileSystem.exists(title))\n\t\t{\n\t\t\tSystem.mkdir(title + \"/ndll\");\n\t\t\tSystem.mkdir(title + \"/ndll/Linux\");\n\t\t\tSystem.mkdir(title + \"/ndll/Linux64\");\n\t\t\tSystem.mkdir(title + \"/ndll/Mac\");\n\t\t\tSystem.mkdir(title + \"/ndll/Mac64\");\n\t\t\tSystem.mkdir(title + \"/ndll/Windows\");\n\t\t}\n\t}\n\n\tpublic static function createProject(words:Array<String>, userDefines:Map<String, Dynamic>, overrides:HXProject):Void\n\t{\n\t\tvar colonIndex = words[0].indexOf(\":\");\n\n\t\tvar projectName:String = null;\n\t\tvar sampleName:String = null;\n\t\tvar outputName:String = \"SampleProject\";\n\n\t\tif (colonIndex == -1)\n\t\t{\n\t\t\tprojectName = words[0];\n\n\t\t\tif (words.length > 1)\n\t\t\t{\n\t\t\t\tsampleName = words[1];\n\t\t\t}\n\n\t\t\tif (words.length > 2)\n\t\t\t{\n\t\t\t\toutputName = words[2];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprojectName = words[0].substring(0, colonIndex);\n\t\t\tsampleName = words[0].substr(colonIndex + 1);\n\n\t\t\tif (words.length > 1)\n\t\t\t{\n\t\t\t\toutputName = words[1];\n\t\t\t}\n\t\t}\n\n\t\tif (projectName == \"project\")\n\t\t{\n\t\t\tprojectName = CommandLineTools.defaultLibrary;\n\n\t\t\tif (sampleName != null)\n\t\t\t{\n\t\t\t\toutputName = sampleName;\n\t\t\t}\n\t\t}\n\n\t\tif (projectName == null || projectName == \"\")\n\t\t{\n\t\t\tprojectName = CommandLineTools.defaultLibrary;\n\t\t}\n\n\t\tif (projectName != null && projectName != \"\")\n\t\t{\n\t\t\tvar defines = new Map<String, Dynamic>();\n\t\t\tvar project = HXProject.fromHaxelib(new Haxelib(projectName), defines);\n\n\t\t\tif (project != null)\n\t\t\t{\n\t\t\t\tvar company = \"Company Name\";\n\n\t\t\t\t/*if (words.length > 2) {\n\n\t\t\t\t\tcompany = words[2];\n\n\t\t\t\t}*/\n\n\t\t\t\tvar context:Dynamic = {};\n\n\t\t\t\tvar name = outputName;\n\t\t\t\t// var name = words[1].split (\".\").pop ();\n\t\t\t\tvar alphaNumeric = new EReg(\"[a-zA-Z0-9]\", \"g\");\n\t\t\t\tvar title = \"\";\n\t\t\t\tvar capitalizeNext = true;\n\n\t\t\t\tfor (i in 0...name.length)\n\t\t\t\t{\n\t\t\t\t\tif (alphaNumeric.match(name.charAt(i)))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (capitalizeNext)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle += name.charAt(i).toUpperCase();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle += name.charAt(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcapitalizeNext = false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tcapitalizeNext = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar file = StringTools.replace(title, \" \", \"\");\n\n\t\t\t\tvar id = [\"com\", \"sample\", file.toLowerCase()];\n\n\t\t\t\t/*if (colonIndex != -1 && words.length > 1 || ) {\n\n\t\t\t\t\tvar name = words[1];\n\t\t\t\t\tname = new EReg (\"[^a-zA-Z0-9.]\", \"g\").replace (name, \"\");\n\t\t\t\t\tid = name.split (\".\");\n\n\t\t\t\t\tif (id.length < 3) {\n\n\t\t\t\t\t\tid = [ \"com\", \"example\" ].concat (id);\n\n\t\t\t\t\t}\n\n\t\t\t\t}*/\n\n\t\t\t\tvar packageName = id.join(\".\").toLowerCase();\n\t\t\t\tvar version = \"1.0.0\";\n\n\t\t\t\tif (overrides != null)\n\t\t\t\t{\n\t\t\t\t\tif (Reflect.hasField(overrides.meta, \"packageName\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tpackageName = overrides.meta.packageName;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Reflect.hasField(overrides.meta, \"title\"))\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle = overrides.meta.title;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Reflect.hasField(overrides.meta, \"version\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tversion = overrides.meta.version;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Reflect.hasField(overrides.meta, \"company\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tcompany = overrides.meta.company;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Reflect.hasField(overrides.app, \"file\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tfile = overrides.app.file;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tproject.meta.title = title;\n\t\t\t\tproject.meta.packageName = packageName;\n\t\t\t\tproject.meta.version = version;\n\t\t\t\tproject.meta.company = company;\n\t\t\t\tproject.app.file = file;\n\n\t\t\t\tcontext.title = title;\n\t\t\t\tcontext.packageName = packageName;\n\t\t\t\tcontext.version = version;\n\t\t\t\tcontext.company = company;\n\t\t\t\tcontext.file = file;\n\n\t\t\t\tfor (define in userDefines.keys())\n\t\t\t\t{\n\t\t\t\t\tReflect.setField(context, define, userDefines.get(define));\n\t\t\t\t}\n\n\t\t\t\tvar folder = name;\n\n\t\t\t\tif (colonIndex > -1)\n\t\t\t\t{\n\t\t\t\t\tif (words.length > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfolder = Path.tryFullPath(words[1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (words.length > 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tfolder = Path.tryFullPath(words[2]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/*if (words.length > 2) {\n\n\t\t\t\t\tfolder = Path.tryFullPath (words[2]);\n\n\t\t\t\t}*/\n\n\t\t\t\tSystem.mkdir(folder);\n\t\t\t\tProjectHelper.recursiveSmartCopyTemplate(project, \"project\", folder, context);\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (FileSystem.exists(folder + \"/Project.hxproj\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (FileSystem.exists(folder + \"/\" + title + \".hxproj\"))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFileSystem.deleteFile(folder + \"/\" + title + \".hxproj\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tFileSystem.rename(folder + \"/Project.hxproj\", folder + \"/\" + title + \".hxproj\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (e:Dynamic) {}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tLog.error(\"Could not find project \\\"\" + projectName + \"\\\"\");\n\t}\n\n\tpublic static function createSample(words:Array<String>, userDefines:Map<String, Dynamic>)\n\t{\n\t\tvar colonIndex = words[0].indexOf(\":\");\n\n\t\tvar projectName:String = null;\n\t\tvar sampleName:String = null;\n\t\tvar outputPath:String = null;\n\n\t\tif (colonIndex == -1 && words.length > 1)\n\t\t{\n\t\t\tprojectName = words[0];\n\t\t\tsampleName = words[1];\n\n\t\t\tif (words.length > 2)\n\t\t\t{\n\t\t\t\toutputPath = words[2];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprojectName = words[0].substring(0, colonIndex);\n\t\t\tsampleName = words[0].substr(colonIndex + 1);\n\n\t\t\tif (words.length > 1)\n\t\t\t{\n\t\t\t\toutputPath = words[1];\n\t\t\t}\n\t\t}\n\n\t\tif (projectName == null || projectName == \"\")\n\t\t{\n\t\t\tprojectName = CommandLineTools.defaultLibrary;\n\t\t}\n\n\t\tif (sampleName == null || sampleName == \"\")\n\t\t{\n\t\t\tLog.error(\"You must specify a sample name to copy when using \\\"\" + CommandLineTools.commandName + \" create\\\"\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar defines = new Map<String, Dynamic>();\n\t\tdefines.set(\"create\", 1);\n\t\tvar project = HXProject.fromHaxelib(new Haxelib(projectName), defines);\n\n\t\tif (project == null && outputPath == null)\n\t\t{\n\t\t\toutputPath = sampleName;\n\t\t\tsampleName = projectName;\n\t\t\tprojectName = CommandLineTools.defaultLibrary;\n\t\t\tproject = HXProject.fromHaxelib(new Haxelib(projectName), defines);\n\t\t}\n\n\t\tif (project != null)\n\t\t{\n\t\t\tif (outputPath == null)\n\t\t\t{\n\t\t\t\toutputPath = sampleName;\n\t\t\t}\n\n\t\t\tvar samplePaths = project.samplePaths.copy();\n\t\t\tsamplePaths.reverse();\n\n\t\t\tfor (samplePath in samplePaths)\n\t\t\t{\n\t\t\t\tvar sourcePath = Path.combine(samplePath, sampleName);\n\n\t\t\t\tif (FileSystem.exists(sourcePath))\n\t\t\t\t{\n\t\t\t\t\tSystem.mkdir(outputPath);\n\t\t\t\t\tSystem.recursiveCopy(sourcePath, Path.tryFullPath(outputPath));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tLog.error(\"Could not find sample \\\"\" + sampleName + \"\\\" in project \\\"\" + projectName + \"\\\"\");\n\t}\n\n\tpublic static function listSamples(projectName:String, userDefines:Map<String, Dynamic>)\n\t{\n\t\tvar templates:Array<String> = [];\n\n\t\tif (projectName != null && projectName != \"\")\n\t\t{\n\t\t\tvar defines = new Map<String, Dynamic>();\n\t\t\tdefines.set(\"create\", 1);\n\t\t\tvar project = HXProject.fromHaxelib(new Haxelib(projectName), defines);\n\n\t\t\tif (project != null)\n\t\t\t{\n\t\t\t\tvar samplePaths = project.samplePaths.copy();\n\n\t\t\t\tif (samplePaths.length > 0)\n\t\t\t\t{\n\t\t\t\t\tsamplePaths.reverse();\n\n\t\t\t\t\tfor (samplePath in samplePaths)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar path = Path.tryFullPath(samplePath);\n\t\t\t\t\t\tif (!FileSystem.exists(path)) continue;\n\n\t\t\t\t\t\tfor (name in FileSystem.readDirectory(path))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!StringTools.startsWith(name, \".\") && FileSystem.isDirectory(path + \"/\" + name))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttemplates.push(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/*templates.push (\"extension\");\n\n\t\t\t\t\tvar projectTemplate = System.findTemplate (project.templatePaths, \"project\", false);\n\n\t\t\t\t\tif (projectTemplate != null) {\n\n\t\t\t\t\t\ttemplates.push (\"project\");\n\n\t\t\t\t}*/\n\t\t\t}\n\t\t}\n\n\t\tif (templates.length == 0)\n\t\t{\n\t\t\tprojectName = CommandLineTools.defaultLibrary;\n\t\t}\n\n\t\tLog.println(\"\\x1b[1mYou must specify a template when using the 'create' command.\\x1b[0m\");\n\t\tLog.println(\"\");\n\n\t\tif (projectName == CommandLineTools.commandName)\n\t\t{\n\t\t\tLog.println(\" \" + Log.accentColor + \"Usage:\\x1b[0m \\x1b[1m\" + CommandLineTools.commandName + \"\\x1b[0m create project (directory)\");\n\t\t\tLog.println(\" \" + Log.accentColor + \"Usage:\\x1b[0m \\x1b[1m\" + CommandLineTools.commandName + \"\\x1b[0m create extension (directory)\");\n\t\t}\n\n\t\tLog.println(\" \"\n\t\t\t+ Log.accentColor\n\t\t\t+ \"Usage:\\x1b[0m \\x1b[1m\"\n\t\t\t+ CommandLineTools.commandName\n\t\t\t+ \"\\x1b[0m create \"\n\t\t\t+ (projectName != CommandLineTools.commandName ? projectName + \" \" : \"\")\n\t\t\t+ \"<sample> (directory)\");\n\n\t\tif (templates.length > 0)\n\t\t{\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\" \" + Log.accentColor + \"Available samples:\\x1b[0m\");\n\t\t\tLog.println(\"\");\n\n\t\t\tfor (template in templates)\n\t\t\t{\n\t\t\t\tSys.println(\"  * \" + template);\n\t\t\t}\n\t\t}\n\n\t\tSys.println(\"\");\n\t}\n}\n"
  },
  {
    "path": "tools/utils/JavaExternGenerator.hx",
    "content": "package utils;\n\nimport haxe.crypto.BaseCode;\nimport haxe.io.Bytes;\nimport haxe.io.Input;\nimport haxe.io.Output;\nimport haxe.zip.Compress;\nimport haxe.zip.Reader;\nimport hxp.*;\nimport lime.tools.HXProject;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass JavaExternGenerator\n{\n\tprivate static inline var ACC_PUBLIC = 0x0001;\n\tprivate static inline var ACC_PRIVATE = 0x0002;\n\tprivate static inline var ACC_PROTECTED = 0x0004;\n\tprivate static inline var ACC_STATIC = 0x0008;\n\tprivate static inline var ACC_FINAL = 0x0010;\n\tprivate static inline var ACC_SUPER = 0x0020;\n\tprivate static inline var ACC_INTERFACE = 0x0200;\n\tprivate static inline var ACC_ABSTRACT = 0x0400;\n\tprivate static inline var dollars = \"___\";\n\tprivate static var base64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\tprivate static var fmatch = ~/^\\((.*)\\)(.*)/;\n\n\tprivate var config:HXProject;\n\tprivate var externPath:String;\n\tprivate var extractedAndroidClasses:Bool;\n\tprivate var extractedAndroidPaths:Array<String>;\n\tprivate var javaPath:String;\n\tprivate var mConstants:Array<Dynamic>;\n\tprivate var mProcessed:Map<String, Bool>;\n\tprivate var mStack:Array<String>;\n\tprivate var mOutput:Output;\n\tprivate var mCurrentType:String;\n\tprivate var mExactTypes:Map<String, Bool>;\n\tprivate var parsedTypes:Array<JNIType>;\n\tprivate var parsedIsObj:Array<Bool>;\n\tprivate var retType:JNIType;\n\n\tpublic function new(config:HXProject, javaPath:String, externPath:String)\n\t{\n\t\tthis.config = config;\n\t\tthis.javaPath = javaPath;\n\t\tthis.externPath = externPath;\n\n\t\tmProcessed = new Map<String, Bool>();\n\t\tmExactTypes = new Map<String, Bool>();\n\t\tmProcessed.set(\"java/lang/Object\", true);\n\n\t\tvar paths = new Array<String>();\n\n\t\tif (FileSystem.isDirectory(javaPath))\n\t\t{\n\t\t\tthis.javaPath += \"/\";\n\t\t\tgetPaths(javaPath, \"\", paths);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar path = Path.withoutExtension(javaPath);\n\n\t\t\tif (Path.extension(javaPath) == \"jar\")\n\t\t\t{\n\t\t\t\tthis.javaPath = path + \"/\";\n\t\t\t\tSystem.mkdir(path);\n\t\t\t\tSystem.runCommand(path, \"jar\", [\"-xvf\", FileSystem.fullPath(javaPath)], false);\n\t\t\t\tgetPaths(path, \"\", paths);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.javaPath = \"\";\n\t\t\t\tpaths = [path];\n\t\t\t}\n\t\t}\n\n\t\tfor (path in paths)\n\t\t{\n\t\t\tvar type = Path.withoutExtension(path);\n\t\t\tmProcessed.set(type, true);\n\t\t\tmExactTypes.set(type, true);\n\t\t}\n\n\t\tmStack = paths;\n\n\t\twhile (mStack.length > 0)\n\t\t{\n\t\t\tvar clazz = mStack.pop();\n\t\t\tvar members = new Map<String, String>();\n\t\t\tgenerate(clazz, members);\n\t\t}\n\n\t\tfor (path in extractedAndroidPaths)\n\t\t{\n\t\t\tif (FileSystem.exists(path))\n\t\t\t{\n\t\t\t\tremoveRecursive(path);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function addType(inName:String, inJavaType:String, inArrayCount:Int)\n\t{\n\t\tparsedTypes.push({name: inName, java: inJavaType, arrayCount: inArrayCount});\n\t}\n\n\tprivate static function debug(s:String) {}\n\n\tprivate function extractAndroidClasses()\n\t{\n\t\tif (!extractedAndroidClasses)\n\t\t{\n\t\t\textractedAndroidPaths = [];\n\t\t\tvar platformsDirectory = config.environment.get(\"ANDROID_SDK\") + \"/platforms\";\n\n\t\t\tif (FileSystem.exists(platformsDirectory))\n\t\t\t{\n\t\t\t\tfor (path in FileSystem.readDirectory(platformsDirectory))\n\t\t\t\t{\n\t\t\t\t\tvar directory = platformsDirectory + \"/\" + path;\n\n\t\t\t\t\tif (path.indexOf(\"android-\") > -1 && FileSystem.isDirectory(directory))\n\t\t\t\t\t{\n\t\t\t\t\t\tvar androidJAR = directory + \"/android.jar\";\n\n\t\t\t\t\t\tif (FileSystem.exists(androidJAR))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSystem.mkdir(path);\n\t\t\t\t\t\t\textractedAndroidPaths.push(path);\n\t\t\t\t\t\t\tSystem.runCommand(path, \"jar\", [\"-xvf\", androidJAR], false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow \"Could not find Android SDK directory. Check that ANDROID_SDK is defined in ~/.lime/config.xml\";\n\t\t\t}\n\t\t}\n\t\textractedAndroidClasses = true;\n\t}\n\n\tprivate function generate(inClass:String, inMembers:Map<String, String>)\n\t{\n\t\tSys.println(inClass);\n\n\t\tvar parts = Path.withoutExtension(inClass).split(\"/\");\n\t\tvar old_type = mCurrentType;\n\t\tmCurrentType = parts.join(\".\");\n\t\tmExactTypes.set(mCurrentType, true);\n\t\tvar dir_parts = parts.slice(0, parts.length - 1);\n\t\tvar outputBase = externPath;\n\t\tvar dir = outputBase;\n\t\tSystem.mkdir(dir);\n\n\t\tfor (d in dir_parts)\n\t\t{\n\t\t\tdir += \"/\" + d;\n\t\t\tSystem.mkdir(dir);\n\t\t}\n\n\t\tvar filename = javaPath + inClass + \".class\";\n\n\t\tif (!FileSystem.exists(filename))\n\t\t{\n\t\t\textractAndroidClasses();\n\t\t\tvar foundFile = false;\n\n\t\t\tfor (path in extractedAndroidPaths)\n\t\t\t{\n\t\t\t\tif (!foundFile)\n\t\t\t\t{\n\t\t\t\t\tfilename = path + \"/\" + inClass + \".class\";\n\n\t\t\t\t\tif (FileSystem.exists(filename))\n\t\t\t\t\t{\n\t\t\t\t\t\tfoundFile = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!foundFile)\n\t\t\t{\n\t\t\t\tthrow \"Could not find class file: \\\"\" + inClass + \"\\\"\";\n\t\t\t}\n\t\t}\n\n\t\tvar source = File.read(filename, true);\n\t\tvar class_name = parts[parts.length - 1].split(\"$\").join(dollars);\n\t\tvar old_output = mOutput;\n\t\tmOutput = File.write(dir + \"/\" + class_name + \".hx\", true);\n\t\tvar old_constants = mConstants;\n\t\tmConstants = new Array<Dynamic>();\n\n\t\tparse(source, inMembers);\n\n\t\tsource.close();\n\t\tmOutput.close();\n\t\tmOutput = old_output;\n\t\tmCurrentType = old_type;\n\t\tmConstants = old_constants;\n\t}\n\n\tpublic static function getHaxelib(library:String):String\n\t{\n\t\tvar proc = new Process(\"haxelib\", [\"path\", library]);\n\t\tvar result = \"\";\n\n\t\ttry\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tvar line = proc.stdout.readLine();\n\t\t\t\tif (line.substr(0, 1) != \"-\") result = line;\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic) {};\n\t\tproc.close();\n\t\tif (result == \"\") throw(\"Could not find haxelib path  \" + library + \" - perhaps you need to install it?\");\n\n\t\treturn result;\n\t}\n\n\tprivate function getPaths(basePath:String, source:String, paths:Array<String>)\n\t{\n\t\tvar files = FileSystem.readDirectory(basePath + \"/\" + source);\n\n\t\tfor (file in files)\n\t\t{\n\t\t\tif (file.substr(0, 1) != \".\")\n\t\t\t{\n\t\t\t\tvar itemSource:String = source + \"/\" + file;\n\n\t\t\t\tif (source == \"\")\n\t\t\t\t{\n\t\t\t\t\titemSource = file;\n\t\t\t\t}\n\n\t\t\t\tif (FileSystem.isDirectory(basePath + \"/\" + itemSource))\n\t\t\t\t{\n\t\t\t\t\tgetPaths(basePath, itemSource, paths);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (Path.extension(itemSource) == \"class\")\n\t\t\t\t\t{\n\t\t\t\t\t\tpaths.push(Path.withoutExtension(itemSource));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function isJavaObject(inType)\n\t{\n\t\tif (inType.arrayCount > 0) return false;\n\t\treturn switch (inType.name)\n\t\t{\n\t\t\tcase \"Int\", \"Void\", \"Bool\", \"Float\": false;\n\t\t\tdefault: true;\n\t\t}\n\t}\n\n\tprivate function isPOD(inName:String)\n\t{\n\t\tswitch (inName)\n\t\t{\n\t\t\tcase \"Int\", \"Void\", \"Bool\", \"Float\", \"String\":\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate function javaType(inType)\n\t{\n\t\tvar result = inType.java;\n\t\tresult = StringTools.replace(result, \"/\", \".\");\n\t\tfor (i in 0...inType.arrayCount)\n\t\t\tresult += \"[]\";\n\t\treturn result;\n\t}\n\n\tprivate function mkdir(inName:String)\n\t{\n\t\tif (!FileSystem.exists(inName)) FileSystem.createDirectory(inName);\n\t}\n\n\tprivate function nmeCallType(inType)\n\t{\n\t\tif (isJavaObject(inType)) return \"callObjectFunction\";\n\t\treturn \"callNumericFunction\";\n\t}\n\n\tprivate function output(str:String)\n\t{\n\t\tmOutput.writeString(str);\n\t}\n\n\tprivate function outputClass(cid:Int, lastOnly:Bool)\n\t{\n\t\tvar name:String = mConstants[mConstants[cid]];\n\t\t// pushClass(name);\n\t\tname = name.split(\"$\").join(dollars);\n\t\tvar parts = name.split(\"/\");\n\t\tif (lastOnly) output(parts.pop());\n\t\telse\n\t\t\toutput(parts.join(\".\"));\n\t}\n\n\tprivate function outputFunctionArgs()\n\t{\n\t\toutput(\"(\");\n\t\tfor (i in 0...parsedTypes.length)\n\t\t{\n\t\t\tif (i > 0) output(\", \");\n\t\t\toutput(\"arg\" + i + \":\");\n\t\t\toutputType(parsedTypes[i]);\n\t\t}\n\t\toutput(\")\");\n\t}\n\n\tprivate function outputPackage(cid:Int)\n\t{\n\t\tvar name = (mConstants[mConstants[cid]]);\n\t\tvar parts = name.split(\"/\");\n\t\tparts.pop();\n\t\toutput(\"package \" + parts.join(\".\") + \";\\n\\n\\n\");\n\t}\n\n\tprivate function outputType(inType:JNIType)\n\t{\n\t\tfor (i in 0...inType.arrayCount)\n\t\t\toutput(\"Array<\");\n\t\toutput(inType.name);\n\t\tfor (i in 0...inType.arrayCount)\n\t\t\toutput(\">\");\n\t}\n\n\tprivate function parse(src:Input, inMembers:Map<String, String>)\n\t{\n\t\tsrc.bigEndian = true;\n\n\t\tvar m0 = src.readByte();\n\t\tvar m1 = src.readByte();\n\t\tvar m2 = src.readByte();\n\t\tvar m3 = src.readByte();\n\n\t\tdebug(StringTools.hex(m0, 2) + StringTools.hex(m1, 2) + StringTools.hex(m2, 2) + StringTools.hex(m3, 2));\n\t\tdebug(\"Version (min):\" + src.readUInt16());\n\t\tdebug(\"Version (maj):\" + StringTools.hex(src.readUInt16(), 4));\n\n\t\tvar ccount = src.readUInt16();\n\n\t\tdebug(\"mConstants : \" + ccount);\n\n\t\tvar cid = 1;\n\t\twhile (cid < ccount)\n\t\t{\n\t\t\tvar tag = src.readByte();\n\t\t\tswitch (tag)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\tvar len = src.readUInt16();\n\t\t\t\t\tvar str = src.readString(len);\n\t\t\t\t\t// debug(\"Str:\"+str);\n\t\t\t\t\tmConstants[cid] = str;\n\n\t\t\t\tcase 3:\n\t\t\t\t\tvar i = src.readInt32();\n\t\t\t\t\t// debug(\"Int32:\"+i);\n\t\t\t\t\tmConstants[cid] = i;\n\n\t\t\t\tcase 4:\n\t\t\t\t\tvar f = src.readFloat();\n\t\t\t\t\t// debug(\"Float32:\"+f);\n\t\t\t\t\tmConstants[cid] = f;\n\n\t\t\t\tcase 5:\n\t\t\t\t\tvar hi = src.readInt32();\n\t\t\t\t\tvar lo = src.readInt32();\n\t\t\t\t\t// debug(\"Long - ignore\");\n\t\t\t\t\tmConstants[cid] = {lo: lo, hi: hi};\n\t\t\t\t\tcid++;\n\n\t\t\t\tcase 6:\n\t\t\t\t\tvar f = src.readDouble();\n\t\t\t\t\t// debug(\"Float64:\"+f);\n\t\t\t\t\tmConstants[cid] = f;\n\t\t\t\t\tcid++;\n\n\t\t\t\tcase 7:\n\t\t\t\t\tvar cref = src.readUInt16();\n\t\t\t\t\t// debug(\"Class ref:\" + cref);\n\t\t\t\t\tmConstants[cid] = cref;\n\n\t\t\t\tcase 8:\n\t\t\t\t\tvar sref = src.readUInt16();\n\t\t\t\t\t// debug(\"String ref:\" + sref);\n\t\t\t\t\tmConstants[cid] = sref;\n\n\t\t\t\tcase 9, 10, 11, 12:\n\t\t\t\t\tvar cref = src.readUInt16();\n\t\t\t\t\tvar type = src.readUInt16();\n\t\t\t\t\t// debug(\"Member ref:\" + cref + \",\" + type);\n\t\t\t\t\tmConstants[cid] = {cref: cref, type: type};\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow(\"Unknown constant tag:\" + tag);\n\t\t\t}\n\t\t\tcid++;\n\t\t}\n\n\t\tvar access = src.readUInt16();\n\n\t\tdebug(\"Access: \" + access);\n\n\t\tvar is_interface = (access & ACC_INTERFACE) > 0;\n\t\tvar java_out:Output = null;\n\n\t\tvar this_ref = src.readUInt16();\n\n\t\tdebug(\"This : \" + mConstants[mConstants[this_ref]]);\n\n\t\toutputPackage(this_ref);\n\t\toutput(\"class \");\n\t\toutputClass(this_ref, true);\n\n\t\tvar super_ref = src.readUInt16();\n\t\tif (super_ref > 0)\n\t\t{\n\t\t\tdebug(\"Super : \" + mConstants[mConstants[super_ref]]);\n\n\t\t\tvar name = mConstants[mConstants[super_ref]];\n\t\t\tif (name == \"java/lang/Object\")\n\t\t\t{\n\t\t\t\tdebug(\" -> ignore super\");\n\t\t\t\tsuper_ref = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\toutput(\" extends \");\n\t\t\t\toutputClass(super_ref, false);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tdebug(\"Super : None.\");\n\n\t\tif (super_ref > 0) generate(mConstants[mConstants[super_ref]], inMembers);\n\n\t\tvar intf_count = src.readUInt16();\n\n\t\tdebug(\"Interfaces:\" + intf_count);\n\n\t\tfor (i in 0...intf_count)\n\t\t{\n\t\t\tvar i_ref = src.readUInt16();\n\t\t\t/*\n\t\t\t\tNo need to expose these to haxe?\n\t\t\t\tif (i>0 || super_ref>0)\n\t\t\t\toutput(\",\");\n\t\t\t\toutput(\" implements \");\n\t\t\t\toutputClass(i_ref,false);\n\t\t\t\tdebug(\"Implements : \" + mConstants[mConstants[i_ref]]);\n\t\t\t */\n\t\t}\n\n\t\toutput(\"\\n{\\n\");\n\n\t\tif (super_ref == 0) output(\"\tvar __jobject:Dynamic;\\n\t\\n\");\n\n\t\tvar java_name = \"\";\n\n\t\tif (is_interface)\n\t\t{\n\t\t\tvar dir = \"stubs\";\n\t\t\tvar parts = mCurrentType.split(\".\");\n\t\t\tvar dir_parts = parts.slice(0, parts.length - 1);\n\t\t\tSystem.mkdir(dir);\n\n\t\t\tfor (d in dir_parts)\n\t\t\t{\n\t\t\t\tdir += \"/\" + d;\n\t\t\t\tSystem.mkdir(dir);\n\t\t\t}\n\n\t\t\tvar interface_name = parts[parts.length - 1];\n\t\t\tvar impl_name = \"Haxe\" + parts[parts.length - 1].split(\"$\").join(\"\");\n\t\t\tjava_name = dir_parts.join(\"/\") + \"/\" + impl_name + \".java\";\n\n\t\t\tjava_out = File.write(\"stubs/\" + java_name, true);\n\t\t\tjava_out.writeString(\"package \" + dir_parts.join(\".\") + \";\\n\");\n\t\t\tjava_out.writeString(\"import org.haxe.lime.Value;\\n\");\n\t\t\tjava_out.writeString(\"import org.haxe.lime.Lime;\\n\\n\");\n\t\t\tjava_out.writeString(\"import \" + StringTools.replace(parts.join(\".\"), \"$\", \".\") + \";\\n\\n\");\n\t\t\tjava_out.writeString(\"class \" + impl_name + \" implements \" + interface_name.split(\"$\").join(\".\") + \" {\\n\");\n\t\t\tjava_out.writeString(\"   long __haxeHandle;\\n\");\n\t\t\tjava_out.writeString(\"   public \" + impl_name + \"(long inHandle) { __haxeHandle=inHandle; }\\n\");\n\n\t\t\toutput(\"   public function new() { __jobject = openfl.utils.JNI.createInterface(this,\\\"\"\n\t\t\t\t+ dir_parts.join(\".\")\n\t\t\t\t+ \".\"\n\t\t\t\t+ impl_name\n\t\t\t\t+ \"\\\", classDef ); }\\n\t\\n\");\n\t\t}\n\n\t\tvar field_count = src.readUInt16();\n\n\t\tdebug(\"Fields:\" + field_count);\n\n\t\tvar seen = new Map<String, Bool>();\n\n\t\tfor (i in 0...field_count)\n\t\t{\n\t\t\tvar access = src.readUInt16();\n\t\t\tvar name_ref = src.readUInt16();\n\n\t\t\tdebug(\" field : \" + mConstants[name_ref]);\n\n\t\t\tvar desc_ref = src.readUInt16();\n\n\t\t\tdebug(\"  desc : \" + mConstants[desc_ref]);\n\n\t\t\tvar expose = access == (ACC_PUBLIC | ACC_FINAL | ACC_STATIC);\n\t\t\tvar as_string = false;\n\n\t\t\tif (expose)\n\t\t\t{\n\t\t\t\tvar type = toHaxeType(mConstants[desc_ref]).name;\n\t\t\t\tif (isPOD(type))\n\t\t\t\t{\n\t\t\t\t\toutput(\"\tstatic inline public var \" + mConstants[name_ref] + \":\" + type);\n\t\t\t\t\tas_string = type == \"String\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\texpose = false;\n\t\t\t}\n\n\t\t\tvar att_count = src.readUInt16();\n\n\t\t\tfor (a in 0...att_count)\n\t\t\t{\n\t\t\t\treadAttribute(src, expose, as_string);\n\t\t\t}\n\n\t\t\tif (expose) output(\";\\n\");\n\t\t}\n\n\t\tvar method_count = src.readUInt16();\n\t\tdebug(\"Method:\" + method_count);\n\n\t\toutput(\"\t\\n\");\n\t\tvar constructed = false;\n\n\t\tfor (i in 0...method_count)\n\t\t{\n\t\t\tvar access = src.readUInt16();\n\t\t\tvar expose = (access & ACC_PUBLIC) > 0;\n\t\t\tvar is_static = (access & ACC_STATIC) > 0;\n\t\t\tvar name_ref = src.readUInt16();\n\t\t\tdebug(\" method: \" + mConstants[name_ref]);\n\t\t\tvar desc_ref = src.readUInt16();\n\n\t\t\tvar func_name = mConstants[name_ref];\n\t\t\tvar constructor = func_name == \"<init>\";\n\n\t\t\tif (expose)\n\t\t\t{\n\t\t\t\tdebug(\"  desc : \" + mConstants[desc_ref]);\n\t\t\t\tsplitFunctionType(mConstants[desc_ref]);\n\n\t\t\t\tvar func_key = func_name + \" \" + mConstants[desc_ref];\n\t\t\t\tif (constructor)\n\t\t\t\t{\n\t\t\t\t\tfunc_name = \"_create\";\n\t\t\t\t}\n\n\t\t\t\t// Method overloading ...\n\t\t\t\tvar uniq_name = func_name;\n\t\t\t\tvar do_override = \"\";\n\t\t\t\tif (inMembers.exists(func_key))\n\t\t\t\t{\n\t\t\t\t\tuniq_name = inMembers.get(func_key);\n\t\t\t\t\tif (!constructor && !is_static) do_override = \"override \";\n\t\t\t\t\tseen.set(uniq_name, true);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (seen.exists(func_name))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (i in 1...100000)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuniq_name = func_name + i;\n\t\t\t\t\t\t\tif (!seen.exists(uniq_name)) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tseen.set(uniq_name, true);\n\t\t\t\t\tinMembers.set(func_key, uniq_name);\n\t\t\t\t}\n\n\t\t\t\tif (constructor) is_static = true;\n\n\t\t\t\tvar ret_full_class = constructor || ((mExactTypes.exists(retType.name) || isPOD(retType.name)) && retType.arrayCount == 0);\n\n\t\t\t\tif (constructor) retType = {name: mCurrentType, java: mCurrentType, arrayCount: 0};\n\n\t\t\t\tvar ret_void = (retType.name == \"Void\" && retType.arrayCount == 0);\n\n\t\t\t\tif (is_interface)\n\t\t\t\t{\n\t\t\t\t\tjava_out.writeString(\"\t@Override public \" + javaType(retType) + \" \" + func_name + \"(\");\n\n\t\t\t\t\tfor (i in 0...parsedTypes.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (i > 0) java_out.writeString(\",\");\n\t\t\t\t\t\tjava_out.writeString(javaType(parsedTypes[i]) + \" arg\" + i);\n\t\t\t\t\t}\n\n\t\t\t\t\tjava_out.writeString(\") {\\n\");\n\n\t\t\t\t\tif (parsedTypes.length > 0) java_out.writeString(\"\t\tObject [] args = new Object[\" + parsedTypes.length + \"];\\n\");\n\t\t\t\t\telse\n\t\t\t\t\t\tjava_out.writeString(\"\t\tObject [] args = null;\\n\");\n\n\t\t\t\t\tfor (i in 0...parsedTypes.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (isJavaObject(parsedTypes[i])) java_out.writeString(\"\t\targs[\" + i + \"] = arg\" + i + \";\\n\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjava_out.writeString(\"\t\targs[\" + i + \"] = new Value(arg\" + i + \");\\n\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!ret_void) java_out.writeString(\"\t\treturn (\" + javaType(retType) + \")\");\n\n\t\t\t\t\tjava_out.writeString(\"\t\tLime.\" + nmeCallType(retType) + \"(__haxeHandle,\\\"\" + uniq_name + \"\\\",args)\");\n\n\t\t\t\t\tif (!ret_void) java_out.writeString(\")\");\n\t\t\t\t\tjava_out.writeString(\";\\n\t}\\n\");\n\n\t\t\t\t\toutput(\"\tpublic function \" + uniq_name);\n\t\t\t\t\toutputFunctionArgs();\n\t\t\t\t\toutput(\":\");\n\n\t\t\t\t\tif (ret_full_class) outputType(retType);\n\t\t\t\t\telse\n\t\t\t\t\t\toutput(\"Dynamic\");\n\t\t\t\t\toutput(\"\\n\t{\\n\t\treturn null;\\n\t}\\n\t\\n\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toutput(\"\tprivate static var _\" + uniq_name + \"_func:Dynamic;\\n\\n\");\n\t\t\t\t\toutput(\"\tpublic \");\n\n\t\t\t\t\tif (is_static || constructor) output(\"static \");\n\n\t\t\t\t\toutput(do_override + \"function \" + uniq_name);\n\t\t\t\t\toutputFunctionArgs();\n\t\t\t\t\toutput(\":\");\n\n\t\t\t\t\tif (ret_full_class) outputType(retType);\n\t\t\t\t\telse\n\t\t\t\t\t\toutput(\"Dynamic\");\n\n\t\t\t\t\toutput(\"\\n\");\n\t\t\t\t\toutput(\"\t{\\n\");\n\t\t\t\t\tfunc_name = \"_\" + uniq_name + \"_func\";\n\t\t\t\t\toutput(\"\t\tif (\" + func_name + \" == null)\\n\");\n\t\t\t\t\toutput(\"\t\t\t\" + func_name + \" = openfl.utils.JNI.\" + (is_static ? \"createStaticMethod\" : \"createMemberMethod\"));\n\t\t\t\t\toutput(\"(\\\"\" + StringTools.replace(mCurrentType, \".\", \"/\") + \"\\\", \\\"\" + mConstants[name_ref] + \"\\\", \\\"\" + mConstants[desc_ref]\n\t\t\t\t\t\t+ \"\\\", true);\\n\");\n\n\t\t\t\t\toutput(\"\t\tvar a = new Array<Dynamic>();\\n\");\n\n\t\t\t\t\tif (!is_static) output(\"\t\ta.push (__jobject);\\n\");\n\n\t\t\t\t\tfor (i in 0...parsedTypes.length)\n\t\t\t\t\t\toutput(\"\t\ta.push(arg\" + i + \");\\n\");\n\n\t\t\t\t\tif (ret_void) output(\"\t\t\");\n\t\t\t\t\telse if (ret_full_class && !isPOD(retType.name)) output(\"\t\treturn new \" + retType.name + \"(\");\n\t\t\t\t\telse\n\t\t\t\t\t\toutput(\"\t\treturn \");\n\n\t\t\t\t\toutput(func_name + \"(a)\");\n\n\t\t\t\t\tif (ret_full_class && !isPOD(retType.name)) output(\");\\n\");\n\t\t\t\t\telse\n\t\t\t\t\t\toutput(\";\\n\");\n\n\t\t\t\t\toutput(\"\t}\\n\t\\n\t\\n\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (constructor && !constructed)\n\t\t\t{\n\t\t\t\tconstructed = true;\n\t\t\t\toutput(\"\tpublic function new(handle:Dynamic)\\n\t{\\n\");\n\t\t\t\tif (super_ref > 0) output(\"\t\tsuper(handle);\");\n\t\t\t\telse\n\t\t\t\t\toutput(\"\t\t__jobject = handle;\");\n\t\t\t\toutput(\"\\n\t}\\n\t\\n\t\\n\");\n\t\t\t}\n\n\t\t\tvar att_count = src.readUInt16();\n\t\t\tfor (a in 0...att_count)\n\t\t\t\treadAttribute(src, false, false);\n\t\t}\n\n\t\tif (java_out != null)\n\t\t{\n\t\t\tjava_out.writeString(\"}\\n\");\n\t\t\tjava_out.close();\n\n\t\t\tSystem.mkdir(\"compiled\");\n\t\t\tvar nme_path = getHaxelib(\"openfl\") + \"/__backends/native/templates/android/template/src\";\n\t\t\tSystem.runCommand(\"\", \"javac\", [\n\t\t\t\t\"-classpath\",\n\t\t\t\t\"\\\"classes/android.jar\\\";\\\"\" + javaPath.substr(0, javaPath.length - 1) + \"\\\"\",\n\t\t\t\t\"-sourcepath\",\n\t\t\t\tnme_path,\n\t\t\t\t\"-d\",\n\t\t\t\t\"compiled\",\n\t\t\t\t\"stubs/\" + java_name\n\t\t\t], true, true, true);\n\n\t\t\t// Sys.setCwd(\"compiled\");\n\n\t\t\tvar class_name = java_name.substr(0, java_name.length - 4) + \"class\";\n\n\t\t\tvar dx = Sys.getEnv(\"ANDROID_SDK\") + \"/platforms/\" + extractedAndroidPaths[0] + \"/tools/dx\";\n\t\t\tSystem.runCommand(\"compiled\", dx, [\"--dex\", \"--output=classes.jar\", class_name], true, true, true);\n\n\t\t\tif (FileSystem.exists(\"classes.jar\"))\n\t\t\t{\n\t\t\t\tvar class_def = File.getBytes(\"classes.jar\");\n\t\t\t\tclass_def = Compress.run(class_def, 9);\n\t\t\t\tvar class_str = BaseCode.encode(class_def.toString(), base64);\n\n\t\t\t\toutput(\"\\n   static var classDef = \\\"\" + class_str + \"\\\";\\n\");\n\t\t\t}\n\t\t}\n\n\t\toutput(\"}\");\n\t}\n\n\tprivate function parseTypes(type:String, inArrayCount:Int)\n\t{\n\t\tif (type == \"\") return;\n\t\tvar is_obj = false;\n\t\tswitch (type.substr(0, 1))\n\t\t{\n\t\t\tcase \"[\":\n\t\t\t\tparseTypes(type.substr(1), inArrayCount + 1);\n\t\t\tcase \"I\":\n\t\t\t\taddType(\"Int\", \"int\", inArrayCount);\n\t\t\tcase \"C\":\n\t\t\t\taddType(\"Int\", \"char\", inArrayCount);\n\t\t\tcase \"S\":\n\t\t\t\taddType(\"Int\", \"short\", inArrayCount);\n\t\t\tcase \"B\":\n\t\t\t\taddType(\"Int\", \"byte\", inArrayCount);\n\t\t\tcase \"V\":\n\t\t\t\taddType(\"Void\", \"void\", inArrayCount);\n\t\t\tcase \"Z\":\n\t\t\t\taddType(\"Bool\", \"boolean\", inArrayCount);\n\t\t\tcase \"J\":\n\t\t\t\taddType(\"Float\", \"long\", inArrayCount);\n\t\t\tcase \"F\":\n\t\t\t\taddType(\"Float\", \"float\", inArrayCount);\n\t\t\tcase \"D\":\n\t\t\t\taddType(\"Float\", \"double\", inArrayCount);\n\t\t\tcase \"L\":\n\t\t\t\tis_obj = true;\n\t\t\t\tvar end = type.indexOf(\";\");\n\t\t\t\tif (end < 1) throw(\"Bad object string: \" + type);\n\t\t\t\tvar name = type.substr(1, end - 1);\n\t\t\t\taddType(processObjectArg(name.split(\"/\").join(\".\"), inArrayCount), name, inArrayCount);\n\t\t\t\ttype = type.substr(end);\n\t\t\tdefault:\n\t\t\t\tthrow(\"Unknown java type: \" + type);\n\t\t}\n\t\tparsedIsObj.push(is_obj);\n\t\tif (type.length > 1) parseTypes(type.substr(1), 0);\n\t}\n\n\tprivate function processObjectArg(inObj:String, inArrayCount:Int)\n\t{\n\t\tif (inObj == \"java.lang.CharSequence\" || inObj == \"java.lang.String\") return \"String\";\n\t\tif (mExactTypes.exists(inObj) && inArrayCount == 0) return inObj;\n\t\treturn \"Dynamic /*\" + inObj + \"*/\";\n\t}\n\n\tprivate function pushClass(inName:String)\n\t{\n\t\tif (!mProcessed.get(inName))\n\t\t{\n\t\t\tmProcessed.set(inName, true);\n\t\t\tmStack.push(inName);\n\t\t}\n\t}\n\n\tprivate function readAttribute(src:Input, inOutputConst:Bool, asString:Bool)\n\t{\n\t\tvar name_ref = src.readUInt16();\n\t\tdebug(\"   attr:\" + mConstants[name_ref]);\n\t\tvar len = src.readInt32();\n\t\tvar bytes = Bytes.alloc(len);\n\t\tsrc.readBytes(bytes, 0, len);\n\n\t\tif (inOutputConst && mConstants[name_ref] == \"ConstantValue\")\n\t\t{\n\t\t\tvar ref = (bytes.get(0) << 8) + bytes.get(1);\n\t\t\tif (asString) output(\" = \\\"\" + mConstants[mConstants[ref]] + \"\\\"\");\n\t\t\telse\n\t\t\t\toutput(\" = \" + mConstants[ref]);\n\t\t}\n\t}\n\n\tprivate function removeRecursive(file)\n\t{\n\t\tif (!FileSystem.isDirectory(file))\n\t\t{\n\t\t\tFileSystem.deleteFile(file);\n\t\t\treturn;\n\t\t}\n\t\tfor (f in FileSystem.readDirectory(file))\n\t\t\tremoveRecursive(file + \"/\" + f);\n\t\tFileSystem.deleteDirectory(file);\n\t}\n\n\tprivate function splitFunctionType(type:String)\n\t{\n\t\tif (!fmatch.match(type)) throw(\"Not a function : \" + type);\n\t\tvar args = fmatch.matched(1);\n\t\tretType = toHaxeType(fmatch.matched(2));\n\t\tparsedTypes = [];\n\t\tparsedIsObj = [];\n\t\tparseTypes(args, 0);\n\t}\n\n\tprivate function toHaxeType(inStr:String)\n\t{\n\t\tparsedTypes = [];\n\t\tparsedIsObj = [];\n\t\tparseTypes(inStr, 0);\n\t\treturn parsedTypes[0];\n\t}\n\t/*public static function main()\n\t\t{\n\t\t\tvar args = Sys.args();\n\t\t\tdebug(args.toString());\n\n\t\t\tnew JavaExternGenerator(args[0], \"gen\");\n\t}*/\n}\n\ntypedef JNIType =\n{\n\tname:String,\n\tjava:String,\n\tarrayCount:Int\n};\n"
  },
  {
    "path": "tools/utils/PlatformSetup.hx",
    "content": "package utils;\n\nimport haxe.Http;\nimport haxe.io.Eof;\nimport haxe.zip.Reader;\nimport hxp.*;\nimport lime.tools.CLIHelper;\nimport lime.tools.ConfigHelper;\nimport lime.tools.Platform;\nimport lime.tools.HXProject;\nimport sys.io.File;\nimport sys.io.Process;\nimport sys.FileSystem;\n\nclass PlatformSetup\n{\n\tprivate static var appleXcodeURL = \"https://developer.apple.com/xcode/download/\";\n\tprivate static var linuxAptPackages = \"gcc-multilib g++-multilib\";\n\tprivate static var linuxUbuntuSaucyPackages = \"gcc-multilib g++-multilib libxext-dev\";\n\tprivate static var linuxYumPackages = \"gcc gcc-c++\";\n\tprivate static var linuxDnfPackages = \"gcc gcc-c++\";\n\tprivate static var linuxEquoPackages = \"media-libs/mesa sys-devel/gcc\";\n\tprivate static var linuxEmergePackages = \"media-libs/mesa sys-devel/gcc\";\n\tprivate static var linuxPacman32Packages = \"multilib-devel mesa mesa-libgl glu\";\n\tprivate static var linuxPacman64Packages = \"multilib-devel lib32-mesa lib32-mesa-libgl lib32-glu\";\n\tprivate static var visualStudioURL = \"https://www.visualstudio.com/downloads/\";\n\tprivate static var hashlinkURL = \"https://github.com/HaxeFoundation/hashlink/releases\";\n\tprivate static var triedSudo:Bool = false;\n\tprivate static var userDefines:Map<String, Dynamic>;\n\tprivate static var targetFlags:Map<String, Dynamic>;\n\tprivate static var setupHaxelibs = new Map<String, Bool>();\n\n\tprivate static function createPath(path:String, defaultPath:String = \"\"):String\n\t{\n\t\ttry\n\t\t{\n\t\t\tif (path == \"\")\n\t\t\t{\n\t\t\t\tSystem.mkdir(defaultPath);\n\t\t\t\treturn defaultPath;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.mkdir(path);\n\t\t\t\treturn path;\n\t\t\t}\n\t\t}\n\t\tcatch (e:Dynamic)\n\t\t{\n\t\t\tthrowPermissionsError();\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate static function downloadFile(remotePath:String, localPath:String = \"\", followingLocation:Bool = false):Void\n\t{\n\t\tif (localPath == \"\")\n\t\t{\n\t\t\tlocalPath = Path.withoutDirectory(remotePath);\n\t\t}\n\n\t\tif (!followingLocation && FileSystem.exists(localPath))\n\t\t{\n\t\t\tvar answer = CLIHelper.ask(\"File found. Install existing file?\");\n\n\t\t\tif (answer != NO)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tvar out = File.write(localPath, true);\n\t\tvar progress = new Progress(out);\n\t\tvar h = new Http(remotePath);\n\n\t\th.cnxTimeout = 30;\n\n\t\th.onError = function(e)\n\t\t{\n\t\t\tprogress.close();\n\t\t\tFileSystem.deleteFile(localPath);\n\t\t\tthrow e;\n\t\t};\n\n\t\tif (!followingLocation)\n\t\t{\n\t\t\tLog.println(\"Downloading \" + localPath + \"...\");\n\t\t}\n\n\t\th.customRequest(false, progress);\n\n\t\tif (h.responseHeaders != null && h.responseHeaders.exists(\"Location\"))\n\t\t{\n\t\t\tvar location = h.responseHeaders.get(\"Location\");\n\n\t\t\tif (location != remotePath)\n\t\t\t{\n\t\t\t\tdownloadFile(location, localPath, true);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function extractFile(sourceZIP:String, targetPath:String, ignoreRootFolder:String = \"\"):Void\n\t{\n\t\tvar extension = Path.extension(sourceZIP);\n\n\t\tif (extension != \"zip\")\n\t\t{\n\t\t\tvar arguments = \"xvzf\";\n\n\t\t\tif (extension == \"bz2\" || extension == \"tbz2\")\n\t\t\t{\n\t\t\t\targuments = \"xvjf\";\n\t\t\t}\n\n\t\t\tif (ignoreRootFolder != \"\")\n\t\t\t{\n\t\t\t\tif (ignoreRootFolder == \"*\")\n\t\t\t\t{\n\t\t\t\t\tfor (file in FileSystem.readDirectory(targetPath))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (FileSystem.isDirectory(targetPath + \"/\" + file))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tignoreRootFolder = file;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(\"\", \"tar\", [arguments, sourceZIP], false);\n\t\t\t\tSystem.runCommand(\"\", \"cp\", [\"-R\", ignoreRootFolder + \"/.\", targetPath], false);\n\t\t\t\tSys.command(\"rm\", [\"-r\", ignoreRootFolder]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"tar\", [arguments, sourceZIP, \"-C\", targetPath], false);\n\n\t\t\t\t// InstallTool.runCommand (targetPath, \"tar\", [ arguments, FileSystem.fullPath (sourceZIP) ]);\n\t\t\t}\n\n\t\t\tSys.command(\"chmod\", [\"-R\", \"755\", targetPath]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar file = File.read(sourceZIP, true);\n\t\t\tvar entries = Reader.readZip(file);\n\t\t\tfile.close();\n\n\t\t\tfor (entry in entries)\n\t\t\t{\n\t\t\t\tvar fileName = entry.fileName;\n\n\t\t\t\tif (fileName.charAt(0) != \"/\" && fileName.charAt(0) != \"\\\\\" && fileName.split(\"..\").length <= 1)\n\t\t\t\t{\n\t\t\t\t\tvar dirs = ~/[\\/\\\\]/g.split(fileName);\n\n\t\t\t\t\tif ((ignoreRootFolder != \"\" && dirs.length > 1) || ignoreRootFolder == \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ignoreRootFolder != \"\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdirs.shift();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar path = \"\";\n\t\t\t\t\t\tvar file = dirs.pop();\n\n\t\t\t\t\t\tfor (d in dirs)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath += d;\n\t\t\t\t\t\t\tSystem.mkdir(targetPath + \"/\" + path);\n\t\t\t\t\t\t\tpath += \"/\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (file == \"\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (path != \"\") Log.println(\"  Created \" + path);\n\t\t\t\t\t\t\tcontinue; // was just a directory\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpath += file;\n\t\t\t\t\t\tLog.println(\"  Install \" + path);\n\n\t\t\t\t\t\tvar data = Reader.unzip(entry);\n\t\t\t\t\t\tvar f = File.write(targetPath + \"/\" + path, true);\n\t\t\t\t\t\tf.write(data);\n\t\t\t\t\t\tf.close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tLog.println(\"Done\");\n\t}\n\n\tpublic static function getDefineValue(name:String, description:String):Void\n\t{\n\t\tvar value = ConfigHelper.getConfigValue(name);\n\n\t\tif (value == null && Sys.getEnv(name) != null)\n\t\t{\n\t\t\tvalue = Sys.getEnv(name);\n\t\t}\n\n\t\tvar inputValue = unescapePath(CLIHelper.param(Log.accentColor + description + \"\\x1b[0m \\x1b[37;3m[\" + (value != null ? value : \"\") + \"]\\x1b[0m\"));\n\n\t\tif (inputValue != \"\" && inputValue != value)\n\t\t{\n\t\t\tConfigHelper.writeConfigValue(name, inputValue);\n\t\t}\n\t\telse if (inputValue == Sys.getEnv(inputValue))\n\t\t{\n\t\t\tConfigHelper.removeConfigValue(name);\n\t\t}\n\t}\n\n\t// public static function getDefines (names:Array<String> = null, descriptions:Array<String> = null, ignored:Array<String> = null):Map<String, String> {\n\t// var config = CommandLineTools.getLimeConfig ();\n\t// var defines = null;\n\t// var env = Sys.environment ();\n\t// var path = \"\";\n\t// if (config != null) {\n\t// \tdefines = config.environment;\n\t// \tfor (key in defines.keys ()) {\n\t// \t\tif (defines.get (key) == env.get (key)) {\n\t// \t\t\tdefines.remove (key);\n\t// \t\t}\n\t// \t}\n\t// } else {\n\t// \tdefines = new Map<String, String> ();\n\t// }\n\t// if (!defines.exists (\"LIME_CONFIG\")) {\n\t// \tvar home = \"\";\n\t// \tif (env.exists (\"HOME\")) {\n\t// \t\thome = env.get (\"HOME\");\n\t// \t} else if (env.exists (\"USERPROFILE\")) {\n\t// \t\thome = env.get (\"USERPROFILE\");\n\t// \t} else {\n\t// \t\tLog.println (\"Warning : No 'HOME' variable set - ~/.lime/config.xml might be missing.\");\n\t// \t\treturn null;\n\t// \t}\n\t// \tdefines.set (\"LIME_CONFIG\", home + \"/.lime/config.xml\");\n\t// }\n\t// if (names == null) {\n\t// \treturn defines;\n\t// }\n\t// var values = new Array<String> ();\n\t// for (i in 0...names.length) {\n\t// \tvar name = names[i];\n\t// \tvar description = descriptions[i];\n\t// \tvar ignore = \"\";\n\t// \tif (ignored != null && ignored.length > i) {\n\t// \t\tignore = ignored[i];\n\t// \t}\n\t// \tvar value = \"\";\n\t// \tif (defines.exists (name) && defines.get (name) != ignore) {\n\t// \t\tvalue = defines.get (name);\n\t// \t} else if (env.exists (name)) {\n\t// \t\tvalue = Sys.getEnv (name);\n\t// \t}\n\t// \tvalue = unescapePath (CLIHelper.param (\"\\x1b[1m\" + description + \"\\x1b[0m \\x1b[37;3m[\" + value + \"]\\x1b[0m\"));\n\t// \tif (value != \"\") {\n\t// \t\tdefines.set (name, value);\n\t// \t} else if (value == Sys.getEnv (name)) {\n\t// \t\tdefines.remove (name);\n\t// \t}\n\t// }\n\t// return defines;\n\t// }\n\tpublic static function installHaxelib(haxelib:Haxelib):Void\n\t{\n\t\tvar name = haxelib.name;\n\t\tvar version = haxelib.version;\n\n\t\tif (version != null && version.indexOf(\"*\") > -1)\n\t\t{\n\t\t\tvar regexp = new EReg(\"^.+[0-9]+-[0-9]+-[0-9]+ +[0-9]+:[0-9]+:[0-9]+ +([a-z0-9.-]+) +\", \"gi\");\n\t\t\tvar output = Haxelib.runProcess(\"\", [\"info\", haxelib.name]);\n\t\t\tvar lines = output.split(\"\\n\");\n\n\t\t\tvar versions = new Array<Version>();\n\t\t\tvar ver:Version;\n\n\t\t\tfor (line in lines)\n\t\t\t{\n\t\t\t\tif (regexp.match(line))\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tver = regexp.matched(1);\n\t\t\t\t\t\tversions.push(ver);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar match = Haxelib.findMatch(haxelib, versions);\n\n\t\t\tif (match != null)\n\t\t\t{\n\t\t\t\tversion = match;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.error(\"Could not find version \\\"\" + haxelib.version + \"\\\" for haxelib \\\"\" + haxelib.name + \"\\\"\");\n\t\t\t}\n\t\t}\n\n\t\tvar args = [\"install\", name];\n\n\t\tif (version != null && version != \"\" && version.indexOf(\"*\") == -1)\n\t\t{\n\t\t\targs.push(version);\n\t\t}\n\n\t\tHaxelib.runCommand(\"\", args);\n\t}\n\n\tprivate static function link(dir:String, file:String, dest:String):Void\n\t{\n\t\tSys.command(\"rm -rf \" + dest + \"/\" + file);\n\t\tSys.command(\"ln -s \" + \"/usr/lib\" + \"/\" + dir + \"/\" + file + \" \" + dest + \"/\" + file);\n\t}\n\n\tprivate static function openURL(url:String):Void\n\t{\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tSys.command(\"explorer\", [url]);\n\t\t}\n\t\telse if (System.hostPlatform == LINUX)\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"xdg-open\", [url], false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.runCommand(\"\", \"open\", [url], false);\n\t\t}\n\t}\n\n\tpublic static function run(target:String = \"\", userDefines:Map<String, Dynamic> = null, targetFlags:Map<String, Dynamic> = null)\n\t{\n\t\tPlatformSetup.userDefines = userDefines;\n\t\tPlatformSetup.targetFlags = targetFlags;\n\n\t\ttry\n\t\t{\n\t\t\tif (target == \"cpp\")\n\t\t\t{\n\t\t\t\tswitch (System.hostPlatform)\n\t\t\t\t{\n\t\t\t\t\tcase WINDOWS:\n\t\t\t\t\t\ttarget = \"windows\";\n\t\t\t\t\tcase MAC:\n\t\t\t\t\t\ttarget = \"mac\";\n\t\t\t\t\tcase LINUX:\n\t\t\t\t\t\ttarget = \"linux\";\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (target)\n\t\t\t{\n\t\t\t\tcase \"air\":\n\t\t\t\t\tsetupAIR();\n\n\t\t\t\tcase \"android\":\n\t\t\t\t\tsetupAndroid();\n\n\t\t\t\tcase \"blackberry\":\n\n\t\t\t\t// setupBlackBerry ();\n\n\t\t\t\tcase \"html5\":\n\t\t\t\t\tLog.println(\"\\x1b[0;3mNo additional configuration is required.\\x1b[0m\");\n\t\t\t\t// setupHTML5 ();\n\n\t\t\t\tcase \"ios\", \"iphoneos\", \"iphonesim\":\n\t\t\t\t\tif (System.hostPlatform == MAC)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetupIOS();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"linux\":\n\t\t\t\t\tif (System.hostPlatform == LINUX)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetupLinux();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"mac\", \"macos\":\n\t\t\t\t\tif (System.hostPlatform == MAC)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetupMac();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"tizen\":\n\n\t\t\t\t// setupTizen ();\n\n\t\t\t\tcase \"webassembly\", \"wasm\", \"emscripten\":\n\t\t\t\t\tsetupWebAssembly();\n\n\t\t\t\tcase \"webos\":\n\n\t\t\t\t// setupWebOS ();\n\n\t\t\t\tcase \"electron\":\n\t\t\t\t\tsetupElectron();\n\n\t\t\t\tcase \"windows\", \"winrt\":\n\t\t\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetupWindows();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"neko\", \"cs\", \"uwp\", \"winjs\", \"nodejs\", \"java\":\n\t\t\t\t\tLog.println(\"\\x1b[0;3mNo additional configuration is required.\\x1b[0m\");\n\n\t\t\t\tcase \"hl\", \"hashlink\":\n\t\t\t\t\tsetupHL();\n\n\t\t\t\tcase \"lime\":\n\t\t\t\t\tsetupLime();\n\n\t\t\t\tcase \"openfl\":\n\t\t\t\t\tsetupOpenFL();\n\n\t\t\t\tcase \"tvos\", \"tvsim\":\n\t\t\t\t\tif (System.hostPlatform == MAC)\n\t\t\t\t\t{\n\t\t\t\t\t\tsetupIOS();\n\t\t\t\t\t}\n\n\t\t\t\tcase \"\":\n\t\t\t\t\tswitch (CommandLineTools.defaultLibrary)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"lime\": setupLime();\n\t\t\t\t\t\tcase \"openfl\": setupOpenFL();\n\t\t\t\t\t\tdefault: setupHaxelib(new Haxelib(CommandLineTools.defaultLibrary));\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tsetupHaxelib(new Haxelib(target));\n\t\t\t}\n\t\t}\n\t\tcatch (e:Eof) {}\n\t}\n\n\tprivate static function runInstaller(path:String, message:String = \"Waiting for process to complete...\"):Void\n\t{\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tLog.println(message);\n\t\t\t\tSystem.runCommand(\"\", \"call\", [path], false);\n\t\t\t\tLog.println(\"Done\");\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\telse if (System.hostPlatform == LINUX)\n\t\t{\n\t\t\tif (Path.extension(path) == \"deb\")\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\"dpkg\", \"-i\", \"--force-architecture\", path], false);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.println(message);\n\t\t\t\tSys.command(\"chmod\", [\"755\", path]);\n\n\t\t\t\tif (path.substr(0, 1) == \"/\")\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", path, [], false);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", \"./\" + path, [], false);\n\t\t\t\t}\n\n\t\t\t\tLog.println(\"Done\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (Path.extension(path) == \"\")\n\t\t\t{\n\t\t\t\tLog.println(message);\n\t\t\t\tSys.command(\"chmod\", [\"755\", path]);\n\t\t\t\tSystem.runCommand(\"\", path, [], false);\n\t\t\t\tLog.println(\"Done\");\n\t\t\t}\n\t\t\telse if (Path.extension(path) == \"dmg\")\n\t\t\t{\n\t\t\t\tvar process = new Process(\"hdiutil\", [\"mount\", path]);\n\t\t\t\tvar ret = process.stdout.readAll().toString();\n\t\t\t\tprocess.exitCode(); // you need this to wait till the process is closed!\n\t\t\t\tprocess.close();\n\n\t\t\t\tvar volumePath = \"\";\n\n\t\t\t\tif (ret != null && ret != \"\")\n\t\t\t\t{\n\t\t\t\t\tvolumePath = StringTools.trim(ret.substr(ret.indexOf(\"/Volumes\")));\n\t\t\t\t}\n\n\t\t\t\tif (volumePath != \"\" && FileSystem.exists(volumePath))\n\t\t\t\t{\n\t\t\t\t\tvar apps:Array<String> = [];\n\t\t\t\t\tvar packages:Array<String> = [];\n\t\t\t\t\tvar executables:Array<String> = [];\n\n\t\t\t\t\tvar files:Array<String> = FileSystem.readDirectory(volumePath);\n\n\t\t\t\t\tfor (file in files)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (Path.extension(file))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"app\":\n\t\t\t\t\t\t\t\tapps.push(file);\n\n\t\t\t\t\t\t\tcase \"pkg\", \"mpkg\":\n\t\t\t\t\t\t\t\tpackages.push(file);\n\n\t\t\t\t\t\t\tcase \"bin\":\n\t\t\t\t\t\t\t\texecutables.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar file = \"\";\n\n\t\t\t\t\tif (apps.length == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfile = apps[0];\n\t\t\t\t\t}\n\t\t\t\t\telse if (packages.length == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfile = packages[0];\n\t\t\t\t\t}\n\t\t\t\t\telse if (executables.length == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfile = executables[0];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (file != \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.println(message);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"open\", [\"-W\", volumePath + \"/\" + file], false);\n\t\t\t\t\t\tLog.println(\"Done\");\n\t\t\t\t\t}\n\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvar process = new Process(\"hdiutil\", [\"unmount\", path]);\n\t\t\t\t\t\tprocess.exitCode(); // you need this to wait till the process is closed!\n\t\t\t\t\t\tprocess.close();\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\n\t\t\t\t\tif (file == \"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.runCommand(\"\", \"open\", [path], false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSystem.runCommand(\"\", \"open\", [path], false);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSystem.runCommand(\"\", \"open\", [path], false);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function setupAIR():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to package SWF applications using Adobe AIR, you must\");\n\t\tLog.println(\"download and extract the Adobe AIR SDK.\");\n\t\tLog.println(\"\");\n\n\t\tgetDefineValue(\"AIR_SDK\", \"Absolute path to AIR SDK\");\n\n\t\tLog.println(\"\");\n\t\tLog.println(\"Setup complete.\");\n\t}\n\n\tpublic static function setupAndroid():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to build applications for Android, you must have recent\");\n\t\tLog.println(\"versions of the Android SDK, Android NDK and Java JDK installed.\");\n\t\tLog.println(\"\");\n\t\tLog.println(\"You must also install the Android SDK Platform-tools and API 30 using\");\n\t\tLog.println(\"the SDK manager from Android Studio.\\x1b[0m\");\n\t\tLog.println(\"\");\n\n\t\tgetDefineValue(\"ANDROID_SDK\", \"Absolute path to Android SDK\");\n\t\tgetDefineValue(\"ANDROID_NDK_ROOT\", \"Absolute path to Android NDK\");\n\n\t\tif (System.hostPlatform != MAC)\n\t\t{\n\t\t\tgetDefineValue(\"JAVA_HOME\", \"Absolute path to Java JDK\");\n\t\t}\n\n\t\tif (ConfigHelper.getConfigValue(\"ANDROID_SETUP\") == null)\n\t\t{\n\t\t\tConfigHelper.writeConfigValue(\"ANDROID_SETUP\", \"true\");\n\t\t}\n\n\t\tLog.println(\"\");\n\t\tLog.println(\"Setup complete.\");\n\t}\n\n\tpublic static function setupElectron():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to run Electron applications, you must download\");\n\t\tLog.println(\"and extract the Electron runtime on your system.\");\n\t\tLog.println(\"\");\n\n\t\tgetDefineValue(\"ELECTRON_PATH\", \"Absolute path to Electron runtime\");\n\n\t\tLog.println(\"\");\n\t\tHaxelib.runCommand(\"\", [\"install\", \"electron\"], true, true);\n\n\t\tLog.println(\"\");\n\t\tLog.println(\"Setup complete.\");\n\t}\n\n\tpublic static function setupHaxelib(haxelib:Haxelib, dependency:Bool = false):Void\n\t{\n\t\tsetupHaxelibs.set(haxelib.name, true);\n\n\t\tvar defines = new Map<String, Dynamic>();\n\t\tdefines.set(\"setup\", 1);\n\n\t\tvar basePath = Haxelib.runProcess(\"\", [\"config\"]);\n\t\tif (basePath != null)\n\t\t{\n\t\t\tbasePath = StringTools.trim(basePath.split(\"\\n\")[0]);\n\t\t}\n\t\tvar lib = Haxelib.getPath(haxelib, false, true);\n\t\tif (lib != null && !StringTools.startsWith(Path.standardize(lib), Path.standardize(basePath)))\n\t\t{\n\t\t\tdefines.set(\"dev\", 1);\n\t\t}\n\n\t\tvar project = HXProject.fromHaxelib(haxelib, defines, true);\n\n\t\tif (project != null && project.haxelibs.length > 0)\n\t\t{\n\t\t\tfor (lib in project.haxelibs)\n\t\t\t{\n\t\t\t\tif (setupHaxelibs.exists(lib.name)) continue;\n\n\t\t\t\tvar path = Haxelib.getPath(lib, false, true);\n\n\t\t\t\tif (path == null || path == \"\" || (lib.version != null && lib.version != \"\"))\n\t\t\t\t{\n\t\t\t\t\tif (defines.exists(\"dev\"))\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.error(\"Could not find dependency \\\"\" + lib.name + \"\\\" for library \\\"\" + haxelib.name + \"\\\"\");\n\t\t\t\t\t}\n\n\t\t\t\t\tinstallHaxelib(lib);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t/*if (userDefines.exists (\"upgrade\"))*/\n\t\t\t\t{\n\t\t\t\t\tupdateHaxelib(lib);\n\t\t\t\t}\n\n\t\t\t\tsetupHaxelib(lib, true);\n\t\t\t}\n\t\t}\n\t\telse if (!dependency)\n\t\t{\n\t\t\t// Log.warn (\"No setup is required for \" + haxelib.name + \", or it is not a valid target\");\n\t\t}\n\t}\n\n\tpublic static function setupHTML5():Void\n\t{\n\t\t// var setApacheCordova = false;\n\n\t\t// var defines = getDefines ();\n\t\t// var answer = CLIHelper.ask (\"Download and install Apache Cordova?\");\n\n\t\t// if (answer == YES || answer == ALWAYS) {\n\n\t\t// \tvar downloadPath = \"\";\n\t\t// \tvar defaultInstallPath = \"\";\n\n\t\t// \tif (System.hostPlatform == WINDOWS) {\n\n\t\t// \t\tdefaultInstallPath = \"C:\\\\Development\\\\Apache Cordova\";\n\n\t\t// \t} else {\n\n\t\t// \t\tdefaultInstallPath = \"/opt/cordova\";\n\n\t\t// \t}\n\n\t\t// \tvar path = unescapePath (CLIHelper.param (\"Output directory [\" + defaultInstallPath + \"]\"));\n\t\t// \tpath = createPath (path, defaultInstallPath);\n\n\t\t// \tdownloadFile (apacheCordovaPath);\n\t\t// \textractFile (Path.withoutDirectory (apacheCordovaPath), path, \"*\");\n\n\t\t// \tvar childArchives = [];\n\n\t\t// \tfor (file in FileSystem.readDirectory (path)) {\n\n\t\t// \t\tif (Path.extension (file) == \"zip\") {\n\n\t\t// \t\t\tchildArchives.push (file);\n\n\t\t// \t\t}\n\n\t\t// \t}\n\n\t\t// \tcreatePath (path + \"/lib\");\n\t\t// \tvar libs = [ \"android\", \"bada-wac\", \"bada\", \"blackberry\", \"ios\", \"mac\", \"qt\", \"tizen\", \"tvos\", \"webos\", \"wp7\" ];\n\n\t\t// \tfor (archive in childArchives) {\n\n\t\t// \t\tvar name = Path.withoutExtension (archive);\n\t\t// \t\tname = StringTools.replace (name, \"incubator-\", \"\");\n\t\t// \t\tname = StringTools.replace (name, \"cordova-\", \"\");\n\n\t\t// \t\tif (name == \"blackberry-webworks\") {\n\n\t\t// \t\t\tname = \"blackberry\";\n\n\t\t// \t\t}\n\n\t\t// \t\tvar basePath = path + \"/\";\n\n\t\t// \t\tfor (lib in libs) {\n\n\t\t// \t\t\tif (name == lib) {\n\n\t\t// \t\t\t\tbasePath += \"lib/\";\n\n\t\t// \t\t\t}\n\n\t\t// \t\t}\n\n\t\t// \t\tcreatePath (basePath + name);\n\t\t// \t\textractFile (path + \"/\" + archive, basePath + name);\n\n\t\t// \t}\n\n\t\t// \tif (System.hostPlatform != WINDOWS) {\n\n\t\t// \t\tSystem.runCommand (\"\", \"chmod\", [ \"-R\", \"777\", path ], false);\n\n\t\t// \t}\n\n\t\t// \tsetApacheCordova = true;\n\t\t// \tdefines.set (\"CORDOVA_PATH\", path);\n\t\t// \twriteConfig (defines.get (\"LIME_CONFIG\"), defines);\n\t\t// \tLog.println (\"\");\n\n\t\t// }\n\n\t\t// var requiredVariables = [];\n\t\t// var requiredVariableDescriptions = [];\n\n\t\t// if (!setApacheCordova) {\n\n\t\t// \trequiredVariables.push (\"CORDOVA_PATH\");\n\t\t// \trequiredVariableDescriptions.push (\"Path to Apache Cordova\");\n\n\t\t// }\n\n\t\t// requiredVariables = requiredVariables.concat ([ \"WEBWORKS_SDK\", \"WEBWORKS_SDK_BBOS\", \"WEBWORKS_SDK_PLAYBOOK\" ]);\n\t\t// requiredVariableDescriptions = requiredVariableDescriptions.concat ([ \"Path to WebWorks SDK for BlackBerry 10\", \"Path to WebWorks SDK for BBOS\", \"Path to WebWorks SDK for PlayBook\" ]);\n\n\t\t// defines = getDefines (requiredVariables, requiredVariableDescriptions);\n\n\t\t// defines.set (\"CORDOVA_PATH\", unescapePath (defines.get (\"CORDOVA_PATH\")));\n\t\t// defines.set (\"WEBWORKS_SDK_BBOS\", unescapePath (defines.get (\"WEBWORKS_SDK_BBOS\")));\n\t\t// defines.set (\"WEBWORKS_SDK_PLAYBOOK\", unescapePath (defines.get (\"WEBWORKS_SDK_PLAYBOOK\")));\n\n\t\t// // temporary hack\n\n\t\t// /*Sys.println (\"\");\n\t\t// Sys.println (\"Setting Apache Cordova install path...\");\n\t\t// System.runCommand (defines.get (\"CORDOVA_PATH\") + \"/lib/ios\", \"make\", [ \"install\" ], true, true);\n\t\t// Sys.println (\"Done.\");*/\n\n\t\t// writeConfig (defines.get (\"LIME_CONFIG\"), defines);\n\n\t\t// Haxelib.runCommand (\"\", [ \"install\", \"cordova\" ], true, true);\n\t}\n\n\tpublic static function setupIOS():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to build applications for iOS and tvOS, you must have\");\n\t\tLog.println(\"Xcode installed. Xcode is available from Apple as a free download.\\x1b[0m\");\n\t\tLog.println(\"\");\n\t\tLog.println(\"\\x1b[0;3mNo additional configuration is required.\\x1b[0m\");\n\t\tLog.println(\"\");\n\n\t\tvar answer = CLIHelper.ask(\"Would you like to visit the download page now?\");\n\n\t\tif (answer == YES || answer == ALWAYS)\n\t\t{\n\t\t\tSystem.openURL(appleXcodeURL);\n\t\t}\n\t}\n\n\tpublic static function setupLime():Void\n\t{\n\t\tif (!targetFlags.exists(\"alias\") && !targetFlags.exists(\"cli\"))\n\t\t{\n\t\t\tsetupHaxelib(new Haxelib(\"lime\"));\n\t\t}\n\n\t\tif (targetFlags.exists(\"noalias\"))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar haxePathEnv = Sys.getEnv(\"HAXEPATH\");\n\t\tvar haxePath = haxePathEnv;\n\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tvar usingDefaultHaxePath = false;\n\t\t\tif (haxePath == null || haxePath == \"\")\n\t\t\t{\n\t\t\t\tusingDefaultHaxePath = true;\n\t\t\t\thaxePath = \"C:\\\\HaxeToolkit\\\\haxe\\\\\";\n\t\t\t}\n\n\t\t\tvar copyFailure = false;\n\t\t\tvar exeDestPath = haxePath + \"\\\\lime.exe\";\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFile.copy(Haxelib.getPath(new Haxelib(\"lime\")) + \"\\\\templates\\\\\\\\bin\\\\lime.exe\", exeDestPath);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tcopyFailure = true;\n\t\t\t\tif (Log.verbose)\n\t\t\t\t{\n\t\t\t\t\tLog.warn(\"Failed to copy lime.exe alias to destination: \" + exeDestPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar shDestPath = haxePath + \"\\\\lime\";\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFile.copy(Haxelib.getPath(new Haxelib(\"lime\")) + \"\\\\templates\\\\\\\\bin\\\\lime.sh\", shDestPath);\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tcopyFailure = true;\n\t\t\t\tif (Log.verbose)\n\t\t\t\t{\n\t\t\t\t\tLog.warn(\"Failed to copy lime.sh alias to destination: \" + shDestPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Log.verbose && copyFailure && usingDefaultHaxePath && !FileSystem.exists(haxePath))\n\t\t\t{\n\t\t\t\tLog.warn(\"Did you install Haxe to a custom location? Set the HAXEPATH environment variable, and run Lime setup again.\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (haxePath == null || haxePath == \"\")\n\t\t\t{\n\t\t\t\thaxePath = \"/usr/lib/haxe\";\n\t\t\t}\n\n\t\t\tvar installedCommand = false;\n\t\t\tvar answer = YES;\n\n\t\t\tif (!(targetFlags.exists(\"alias\") || targetFlags.exists(\"cli\")))\n\t\t\t{\n\t\t\t\tif (targetFlags.exists(\"y\"))\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Do you want to install the \\\"lime\\\" command? [y/n/a] y\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tanswer = CLIHelper.ask(\"Do you want to install the \\\"lime\\\" command?\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (answer == YES || answer == ALWAYS)\n\t\t\t{\n\t\t\t\tif (System.hostPlatform == MAC)\n\t\t\t\t{\n\t\t\t\t\tvar aliasDestPath = \"/usr/local/bin/lime\";\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.runCommand(\"\", \"cp\", [\n\t\t\t\t\t\t\t\"-f\",\n\t\t\t\t\t\t\tHaxelib.getPath(new Haxelib(\"lime\")) + \"/templates/bin/lime.sh\",\n\t\t\t\t\t\t\taliasDestPath\n\t\t\t\t\t\t], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", aliasDestPath], false);\n\t\t\t\t\t\tinstalledCommand = true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Log.verbose)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Failed to copy Lime alias to destination: \" + aliasDestPath);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar aliasDestPath = \"/usr/local/bin/lime\";\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\n\t\t\t\t\t\t\t\"cp\",\n\t\t\t\t\t\t\t\"-f\",\n\t\t\t\t\t\t\tHaxelib.getPath(new Haxelib(\"lime\")) + \"/templates/bin/lime.sh\",\n\t\t\t\t\t\t\taliasDestPath\n\t\t\t\t\t\t], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\"chmod\", \"755\", aliasDestPath], false);\n\t\t\t\t\t\tinstalledCommand = true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Log.verbose)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.warn(\"Failed to copy Lime alias to destination: \" + aliasDestPath);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!installedCommand)\n\t\t\t{\n\t\t\t\tSys.println(\"\");\n\t\t\t\tSys.println(\"To finish setup, we recommend you either...\");\n\t\t\t\tSys.println(\"\");\n\t\t\t\tSys.println(\" a) Manually add an alias called \\\"lime\\\" to run \\\"haxelib run lime\\\"\");\n\t\t\t\tSys.println(\" b) Run the following commands:\");\n\t\t\t\tSys.println(\"\");\n\t\t\t\tSys.println(\"sudo cp \\\"\" + Path.combine(Haxelib.getPath(new Haxelib(\"lime\")), \"templates/bin/lime.sh\") + \"\\\" /usr/local/bin/lime\");\n\t\t\t\tSys.println(\"sudo chmod 755 /usr/local/bin/lime\");\n\t\t\t\tSys.println(\"\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function setupLinux():Void\n\t{\n\t\tvar whichAptGet = System.runProcess(\"\", \"which\", [\"apt-get\"], true, true, true);\n\t\tvar hasApt = whichAptGet != null && whichAptGet != \"\";\n\n\t\tif (hasApt)\n\t\t{\n\t\t\t// check if this is ubuntu saucy 64bit, which uses different packages.\n\t\t\tvar lsbId = System.runProcess(\"\", \"lsb_release\", [\"-si\"], true, true, true);\n\t\t\tvar lsbRelease = System.runProcess(\"\", \"lsb_release\", [\"-sr\"], true, true, true);\n\t\t\tvar arch = System.runProcess(\"\", \"uname\", [\"-m\"], true, true, true);\n\t\t\tvar isSaucy = lsbId == \"Ubuntu\\n\" && lsbRelease >= \"13.10\\n\" && arch == \"x86_64\\n\";\n\n\t\t\tvar packages = isSaucy ? linuxUbuntuSaucyPackages : linuxAptPackages;\n\n\t\t\tvar parameters = [\"apt-get\", \"install\"].concat(packages.split(\" \"));\n\t\t\tSystem.runCommand(\"\", \"sudo\", parameters, false);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"Setup complete.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar whichYum = System.runProcess(\"\", \"which\", [\"yum\"], true, true, true);\n\t\tvar hasYum = whichYum != null && whichYum != \"\";\n\n\t\tif (hasYum)\n\t\t{\n\t\t\tvar parameters = [\"yum\", \"install\"].concat(linuxYumPackages.split(\" \"));\n\t\t\tSystem.runCommand(\"\", \"sudo\", parameters, false);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"Setup complete.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar whichDnf = System.runProcess(\"\", \"which\", [\"dnf\"], true, true, true);\n\t\tvar hasDnf = whichDnf != null && whichDnf != \"\";\n\n\t\tif (hasDnf)\n\t\t{\n\t\t\tvar parameters = [\"dnf\", \"install\"].concat(linuxDnfPackages.split(\" \"));\n\t\t\tSystem.runCommand(\"\", \"sudo\", parameters, false);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"Setup complete.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar whichEquo = System.runProcess(\"\", \"which\", [\"equo\"], true, true, true);\n\t\tvar hasEquo = whichEquo != null && whichEquo != \"\";\n\n\t\tif (hasEquo)\n\t\t{\n\t\t\t// Sabayon docs recommend not using sudo with equo, and instead using a root login shell\n\t\t\tvar parameters = [\"-l\", \"-c\", \"equo\", \"i\", \"-av\"].concat(linuxEquoPackages.split(\" \"));\n\t\t\tSystem.runCommand(\"\", \"su\", parameters, false);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"Setup complete.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar whichEmerge = System.runProcess(\"\", \"which\", [\"emerge\"], true, true, true);\n\t\tvar hasEmerge = whichEmerge != null && whichEmerge != \"\";\n\n\t\tif (hasEmerge)\n\t\t{\n\t\t\tvar parameters = [\"emerge\", \"-av\"].concat(linuxEmergePackages.split(\" \"));\n\t\t\tSystem.runCommand(\"\", \"sudo\", parameters, false);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"Setup complete.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar whichPacman = System.runProcess(\"\", \"which\", [\"pacman\"], true, true, true);\n\t\tvar hasPacman = whichPacman != null && whichPacman != \"\";\n\n\t\tif (hasPacman)\n\t\t{\n\t\t\tvar parameters = [\"pacman\", \"-S\", \"--needed\"];\n\n\t\t\tif (System.hostArchitecture == X64)\n\t\t\t{\n\t\t\t\tparameters = parameters.concat(linuxPacman64Packages.split(\" \"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparameters = parameters.concat(linuxPacman32Packages.split(\" \"));\n\t\t\t}\n\n\t\t\tSystem.runCommand(\"\", \"sudo\", parameters, false);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.println(\"Setup complete.\");\n\t\t\treturn;\n\t\t}\n\n\t\tLog.println(\"Unable to find a supported package manager on your Linux distribution.\");\n\t\tLog.println(\"Currently apt-get, yum, dnf, equo, emerge, and pacman are supported.\");\n\n\t\tSys.exit(1);\n\t}\n\n\tpublic static function setupMac():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to build native executables for macOS, you must have\");\n\t\tLog.println(\"Xcode installed. Xcode is available from Apple as a free download.\\x1b[0m\");\n\t\tLog.println(\"\");\n\t\tLog.println(\"\\x1b[0;3mNo additional configuration is required.\\x1b[0m\");\n\t\tLog.println(\"\");\n\n\t\tvar answer = CLIHelper.ask(\"Would you like to visit the download page now?\");\n\n\t\tif (answer == YES || answer == ALWAYS)\n\t\t{\n\t\t\tSystem.openURL(appleXcodeURL);\n\t\t}\n\t}\n\n\tpublic static function setupOpenFL():Void\n\t{\n\t\tif (!targetFlags.exists(\"alias\") && !targetFlags.exists(\"cli\"))\n\t\t{\n\t\t\tsetupHaxelib(new Haxelib(\"openfl\"));\n\t\t}\n\n\t\tif (targetFlags.exists(\"noalias\"))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar haxePath = Sys.getEnv(\"HAXEPATH\");\n\t\tvar project:HXProject = null;\n\n\t\ttry\n\t\t{\n\t\t\tproject = HXProject.fromHaxelib(new Haxelib(\"openfl\"));\n\t\t}\n\t\tcatch (e:Dynamic) {}\n\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tif (haxePath == null || haxePath == \"\")\n\t\t\t{\n\t\t\t\thaxePath = \"C:\\\\HaxeToolkit\\\\haxe\\\\\";\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFile.copy(Haxelib.getPath(new Haxelib(\"lime\")) + \"\\\\templates\\\\\\\\bin\\\\lime.exe\", haxePath + \"\\\\lime.exe\");\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t\ttry\n\t\t\t{\n\t\t\t\tFile.copy(Haxelib.getPath(new Haxelib(\"lime\")) + \"\\\\templates\\\\\\\\bin\\\\lime.sh\", haxePath + \"\\\\lime\");\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSystem.copyFileTemplate(project.templatePaths, \"bin/openfl.exe\", haxePath + \"\\\\openfl.exe\");\n\t\t\t\tSystem.copyFileTemplate(project.templatePaths, \"bin/openfl.sh\", haxePath + \"\\\\openfl\");\n\t\t\t}\n\t\t\tcatch (e:Dynamic) {}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (haxePath == null || haxePath == \"\")\n\t\t\t{\n\t\t\t\thaxePath = \"/usr/lib/haxe\";\n\t\t\t}\n\n\t\t\tvar installedCommand = false;\n\t\t\tvar answer = YES;\n\n\t\t\tif (!(targetFlags.exists(\"alias\") || targetFlags.exists(\"cli\")))\n\t\t\t{\n\t\t\t\tif (targetFlags.exists(\"y\"))\n\t\t\t\t{\n\t\t\t\t\tSys.println(\"Do you want to install the \\\"openfl\\\" command? [y/n/a] y\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tanswer = CLIHelper.ask(\"Do you want to install the \\\"openfl\\\" command?\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (answer == YES || answer == ALWAYS)\n\t\t\t{\n\t\t\t\tif (System.hostPlatform == MAC)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.runCommand(\"\", \"cp\", [\n\t\t\t\t\t\t\t\"-f\",\n\t\t\t\t\t\t\tHaxelib.getPath(new Haxelib(\"lime\")) + \"/templates/bin/lime.sh\",\n\t\t\t\t\t\t\t\"/usr/local/bin/lime\"\n\t\t\t\t\t\t], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", \"/usr/local/bin/lime\"], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"cp\", [\n\t\t\t\t\t\t\t\"-f\",\n\t\t\t\t\t\t\tSystem.findTemplate(project.templatePaths, \"bin/openfl.sh\"),\n\t\t\t\t\t\t\t\"/usr/local/bin/openfl\"\n\t\t\t\t\t\t], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"chmod\", [\"755\", \"/usr/local/bin/openfl\"], false);\n\t\t\t\t\t\tinstalledCommand = true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\n\t\t\t\t\t\t\t\"cp\",\n\t\t\t\t\t\t\t\"-f\",\n\t\t\t\t\t\t\tHaxelib.getPath(new Haxelib(\"lime\")) + \"/templates/bin/lime.sh\",\n\t\t\t\t\t\t\t\"/usr/local/bin/lime\"\n\t\t\t\t\t\t], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\"chmod\", \"755\", \"/usr/local/bin/lime\"], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\n\t\t\t\t\t\t\t\"cp\",\n\t\t\t\t\t\t\t\"-f\",\n\t\t\t\t\t\t\tSystem.findTemplate(project.templatePaths, \"bin/openfl.sh\"),\n\t\t\t\t\t\t\t\"/usr/local/bin/openfl\"\n\t\t\t\t\t\t], false);\n\t\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\"chmod\", \"755\", \"/usr/local/bin/openfl\"], false);\n\t\t\t\t\t\tinstalledCommand = true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e:Dynamic) {}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!installedCommand)\n\t\t\t{\n\t\t\t\tSys.println(\"\");\n\t\t\t\tSys.println(\"To finish setup, we recommend you either...\");\n\t\t\t\tSys.println(\"\");\n\t\t\t\tSys.println(\" a) Manually add an alias called \\\"openfl\\\" to run \\\"haxelib run openfl\\\"\");\n\t\t\t\tSys.println(\" b) Run the following commands:\");\n\t\t\t\tSys.println(\"\");\n\t\t\t\tSys.println(\"sudo cp \\\"\" + Path.combine(Haxelib.getPath(new Haxelib(\"lime\")), \"templates/bin/lime.sh\") + \"\\\" /usr/local/bin/lime\");\n\t\t\t\tSys.println(\"sudo chmod 755 /usr/local/bin/lime\");\n\t\t\t\tSys.println(\"sudo cp \\\"\" + System.findTemplate(project.templatePaths, \"bin/openfl.sh\") + \"\\\" /usr/local/bin/openfl\");\n\t\t\t\tSys.println(\"sudo chmod 755 /usr/local/bin/openfl\");\n\t\t\t\tSys.println(\"\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function setupWebAssembly():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to build for WebAssembly or asm.js, you must download\");\n\t\tLog.println(\"and install the Emscripten SDK.\");\n\t\tLog.println(\"\");\n\t\tLog.println(\"After install, the SDK path may be at \\\"emsdk/upstream/emscripten\\\"\");\n\t\tLog.println(\"\");\n\n\t\tgetDefineValue(\"EMSCRIPTEN_SDK\", \"Absolute path to Emscripten SDK\");\n\n\t\tLog.println(\"\");\n\t\tLog.println(\"Setup complete.\");\n\t}\n\n\tpublic static function setupWindows():Void\n\t{\n\t\tLog.println(\"\\x1b[1mIn order to build native executables for Windows, you must have a\");\n\t\tLog.println(\"Visual Studio C++ compiler with \\\"Windows Desktop\\\" (Win32) support\");\n\t\tLog.println(\"installed. We recommend using Visual Studio Community, which is\");\n\t\tLog.println(\"available as a free download from Microsoft.\\x1b[0m\");\n\t\tLog.println(\"\");\n\t\tLog.println(\"\\x1b[0;3mNo additional configuration is required.\\x1b[0m\");\n\t\tLog.println(\"\");\n\n\t\tvar answer = CLIHelper.ask(\"Would you like to visit the download page now?\");\n\n\t\tif (answer == YES || answer == ALWAYS)\n\t\t{\n\t\t\tSystem.openURL(visualStudioURL);\n\t\t}\n\t}\n\n\tpublic static function setupHL():Void\n\t{\n\t\tvar message = \"Absolute path to a custom version of HashLink.\";\n\t\tif (ConfigHelper.getConfigValue(\"HL_PATH\") == null) {\n\t\t\tmessage += \" Leave empty to use Lime's default bundled version.\";\n\t\t} else {\n\t\t\tmessage += \" Leave empty to keep the currently configured version. To restore Lime's default bundled version, run the command: lime config remove HL_PATH\";\n\t\t}\n\t\tgetDefineValue(\"HL_PATH\", message);\n\t\tif (System.hostPlatform == MAC)\n\t\t{\n\t\t\tLog.println(\"To use the HashLink debugger on macOS, the hl executable needs to be signed.\");\n\t\t\tif (ConfigHelper.getConfigValue(\"HL_PATH\") != null)\n\t\t\t{\n\t\t\t\tLog.println(\"When building HashLink from source, you must run `make codesign_osx` before installing.\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar answer = CLIHelper.ask(\"Would you like to do this now? (Requires sudo.)\");\n\n\t\t\t\tif (answer == YES || answer == ALWAYS)\n\t\t\t\t{\n\t\t\t\t\tvar openSSLConf = System.getTemporaryFile(\"cnf\");\n\t\t\t\t\tvar key = System.getTemporaryFile(\"pem\");\n\t\t\t\t\tvar cert = System.getTemporaryFile(\"cer\");\n\t\t\t\t\tvar limePath = Haxelib.getPath(new Haxelib(\"lime\"));\n\t\t\t\t\tvar hlPath = limePath + \"/templates/bin/hl/mac/hl\";\n\t\t\t\t\tvar entitlementsPath = sys.FileSystem.exists(limePath + \"/project\") ? (limePath +\n\t\t\t\t\t\t\"/project/lib/hashlink/other/osx/entitlements.xml\") : (limePath\n\t\t\t\t\t\t+ \"/templates/bin/hl/entitlements.xml\");\n\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\"security\", \"delete-identity\", \"-c\", \"hl-cert\"], true, true, true);\n\t\t\t\t\tsys.io.File.saveContent(openSSLConf, [\n\t\t\t\t\t\t\"[req]\",\n\t\t\t\t\t\t\"distinguished_name=codesign_dn\",\n\t\t\t\t\t\t\"[codesign_dn]\",\n\t\t\t\t\t\t\"commonName=hl-cert\",\n\t\t\t\t\t\t\"[v3_req]\",\n\t\t\t\t\t\t\"keyUsage=critical,digitalSignature\",\n\t\t\t\t\t\t\"extendedKeyUsage=critical,codeSigning\",\n\t\t\t\t\t].join(\"\\n\"));\n\t\t\t\t\tSystem.runCommand(\"\", \"openssl\", [\n\t\t\t\t\t\t\"req\", \"-x509\", \"-newkey\", \"rsa:4096\", \"-keyout\", key, \"-nodes\", \"-days\", \"365\", \"-subj\", \"/CN=hl-cert\", \"-outform\", \"der\", \"-out\",\n\t\t\t\t\t\tcert, \"-extensions\", \"v3_req\", \"-config\", openSSLConf\n\t\t\t\t\t], true, false, true);\n\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\n\t\t\t\t\t\t\"security\",\n\t\t\t\t\t\t\"add-trusted-cert\",\n\t\t\t\t\t\t\"-d\",\n\t\t\t\t\t\t\"-k /Library/Keychains/System.keychain\",\n\t\t\t\t\t\tcert\n\t\t\t\t\t], true, false, true);\n\t\t\t\t\tSystem.runCommand(\"\", \"sudo\", [\"security\", \"import\", key, \"-k\", \"/Library/Keychains/System.keychain\", \"-A\"], true, false, true);\n\t\t\t\t\tSystem.runCommand(\"\", \"codesign\", [\"--entitlements\", entitlementsPath, \"-fs\", \"hl-cert\", hlPath], true, false, true);\n\t\t\t\t\tfor (f in [key, cert, openSSLConf])\n\t\t\t\t\t\tsys.FileSystem.deleteFile(f);\n\t\t\t\t\tLog.println(\"\\nIf you update lime, you will have to run this again to sign the new hl executable\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static function throwPermissionsError()\n\t{\n\t\tif (System.hostPlatform == WINDOWS)\n\t\t{\n\t\t\tLog.println(\"Unable to access directory. Perhaps you need to run \\\"setup\\\" with administrative privileges?\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLog.println(\"Unable to access directory. Perhaps you should run \\\"setup\\\" again using \\\"sudo\\\"\");\n\t\t}\n\n\t\tSys.exit(1);\n\t}\n\n\tprivate static function unescapePath(path:String):String\n\t{\n\t\tif (path == null)\n\t\t{\n\t\t\tpath = \"\";\n\t\t}\n\n\t\tpath = StringTools.replace(path, \"\\\\ \", \" \");\n\n\t\tif (System.hostPlatform != WINDOWS && StringTools.startsWith(path, \"~/\"))\n\t\t{\n\t\t\tpath = Sys.getEnv(\"HOME\") + \"/\" + path.substr(2);\n\t\t}\n\n\t\treturn path;\n\t}\n\n\tpublic static function updateHaxelib(haxelib:Haxelib):Void\n\t{\n\t\tvar basePath = Haxelib.runProcess(\"\", [\"config\"]);\n\n\t\tif (basePath != null)\n\t\t{\n\t\t\tbasePath = StringTools.trim(basePath.split(\"\\n\")[0]);\n\t\t}\n\n\t\tvar lib = Haxelib.getPath(haxelib, false, true);\n\n\t\tif (StringTools.startsWith(Path.standardize(lib), Path.standardize(basePath)))\n\t\t{\n\t\t\tHaxelib.runCommand(\"\", [\"update\", haxelib.name]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar git = Path.combine(lib, \".git\");\n\n\t\t\tif (FileSystem.exists(git))\n\t\t\t{\n\t\t\t\tLog.info(Log.accentColor + \"Updating \\\"\" + haxelib.name + \"\\\"\" + Log.resetColor);\n\n\t\t\t\tif (System.hostPlatform == WINDOWS)\n\t\t\t\t{\n\t\t\t\t\tvar path = Sys.getEnv(\"PATH\");\n\n\t\t\t\t\tif (path.indexOf(\"Git\") == -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tSys.putEnv(\"PATH\", \"C:\\\\Program Files (x86)\\\\Git\\\\bin;\" + path);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tSystem.runCommand(lib, \"git\", [\"pull\"]);\n\t\t\t\tSystem.runCommand(lib, \"git\", [\"submodule\", \"init\"]);\n\t\t\t\tSystem.runCommand(lib, \"git\", [\"submodule\", \"update\"]);\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass Progress extends haxe.io.Output\n{\n\tvar o:haxe.io.Output;\n\tvar cur:Int;\n\tvar max:Null<Int>;\n\tvar start:Float;\n\n\tpublic function new(o)\n\t{\n\t\tthis.o = o;\n\t\tcur = 0;\n\t\tstart = haxe.Timer.stamp();\n\t}\n\n\tfunction bytes(n)\n\t{\n\t\tcur += n;\n\t\tif (max == null) Sys.print(cur + \" bytes\\r\");\n\t\telse\n\t\t\tSys.print(cur + \"/\" + max + \" (\" + Std.int((cur * 100.0) / max) + \"%)\\r\");\n\t}\n\n\tpublic override function writeByte(c)\n\t{\n\t\to.writeByte(c);\n\t\tbytes(1);\n\t}\n\n\tpublic override function writeBytes(s, p, l)\n\t{\n\t\tvar r = o.writeBytes(s, p, l);\n\t\tbytes(r);\n\t\treturn r;\n\t}\n\n\tpublic override function close()\n\t{\n\t\tsuper.close();\n\t\to.close();\n\t\tvar time = haxe.Timer.stamp() - start;\n\t\tvar speed = (cur / time) / 1024;\n\t\ttime = Std.int(time * 10) / 10;\n\t\tspeed = Std.int(speed * 10) / 10;\n\n\t\t// When the path is a redirect, we don't want to display that the download completed\n\n\t\tif (cur > 400)\n\t\t{\n\t\t\tSys.print(\"Download complete : \" + cur + \" bytes in \" + time + \"s (\" + speed + \"KB/s)\\n\");\n\t\t}\n\t}\n\n\tpublic override function prepare(m:Int)\n\t{\n\t\tmax = m;\n\t}\n}\n"
  },
  {
    "path": "tools/utils/publish/FirefoxMarketplace.hx",
    "content": "package utils.publish;\n\nimport haxe.crypto.Base64;\nimport hxp.Path;\nimport haxe.Json;\nimport lime.tools.helpers.CLIHelper;\nimport lime.tools.helpers.Log;\nimport lime.tools.helpers.ZipHelper;\nimport lime.tools.helpers.ProcessHelper;\nimport lime.graphics.Image;\nimport lime.net.oauth.*;\nimport lime.net.*;\nimport lime.project.HXProject;\nimport utils.PlatformSetup;\nimport sys.FileSystem;\nimport sys.io.File;\n\nclass FirefoxMarketplace\n{\n\tprivate static function compress(project:HXProject):String\n\t{\n\t\tvar outputDirectory = project.app.path + \"/firefox\";\n\t\tvar source = outputDirectory + \"/bin/\";\n\t\tvar packagedFile = project.app.file + \".zip\";\n\t\tvar destination = outputDirectory + \"/dist/\" + packagedFile;\n\n\t\tSystem.compress(source, destination);\n\n\t\treturn destination;\n\t}\n\n\tpublic static function isValid(project:HXProject):Bool\n\t{\n\t\tvar result = FirefoxHelper.validate(project);\n\n\t\tif (result.errors.length != 0)\n\t\t{\n\t\t\tvar errorMsg = \"The application cannot be published\\n\";\n\n\t\t\tfor (error in result.errors)\n\t\t\t{\n\t\t\t\terrorMsg += '\\n * ' + error;\n\t\t\t}\n\n\t\t\tif (Log.verbose) Log.println(\"\");\n\t\t\tLog.error(errorMsg);\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static function publish(project:HXProject):Void\n\t{\n\t\tvar devServer = project.targetFlags.exists(\"dev\");\n\t\tvar forceUpload = project.targetFlags.exists(\"force\");\n\t\tvar answer:Answer;\n\n\t\t/*if (!devServer) {\n\n\t\t\tLog.println (\"In which server do you want to publish your application?\");\n\t\t\tLog.println (\"\\t1. Production server.\");\n\t\t\tLog.println (\"\\t2. Development server.\");\n\t\t\tLog.println (\"\\tq. Quit.\");\n\n\t\t\tanswer = CLIHelper.ask (\"Which server?\", [\"1\", \"2\", \"q\"]);\n\n\t\t\tswitch (answer) {\n\n\t\t\t\tcase CUSTOM (x):\n\n\t\t\t\t\tswitch (x) {\n\n\t\t\t\t\t\tcase \"2\": devServer = true;\n\t\t\t\t\t\tcase \"q\": Sys.exit (0);\n\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\n\n\t\t\t}\n\n\t\t}*/\n\n\t\tLog.info(\"Checking account...\");\n\n\t\tvar defines = project.defines;\n\t\tvar existsProd = defines.exists(\"FIREFOX_MARKETPLACE_KEY\") && defines.exists(\"FIREFOX_MARKETPLACE_SECRET\");\n\t\tvar existsDev = defines.exists(\"FIREFOX_MARKETPLACE_DEV_KEY\") && defines.exists(\"FIREFOX_MARKETPLACE_DEV_SECRET\");\n\n\t\tif ((!existsProd && !devServer) || (!existsDev && devServer))\n\t\t{\n\t\t\tsetup(false, devServer, cast defines);\n\n\t\t\t// we need to get all the defines after configuring the account\n\t\t\tLog.mute = true;\n\t\t\tdefines = PlatformSetup.getDefines();\n\t\t\tLog.mute = false;\n\t\t}\n\n\t\tvar baseUrl = devServer ? FirefoxHelper.DEVELOPMENT_SERVER_URL : FirefoxHelper.PRODUCTION_SERVER_URL;\n\t\tvar appID:Int = -1;\n\t\tvar appSlug:String = \"\";\n\t\tvar appName = project.meta.title;\n\n\t\tvar key = defines.get(\"FIREFOX_MARKETPLACE\" + (devServer ? \"_DEV_\" : \"_\") + \"KEY\");\n\t\tvar secret = defines.get(\"FIREFOX_MARKETPLACE\" + (devServer ? \"_DEV_\" : \"_\") + \"SECRET\");\n\n\t\tvar marketplace = new MarketplaceAPI(key, secret, devServer);\n\n\t\tvar error = function(r:Dynamic)\n\t\t{\n\t\t\tReflect.deleteField(r, \"error\");\n\t\t\t// Log.println (\"\");\n\t\t\tLog.error((r.customError != null ? r.customError : 'There was an error:\\n\\n$r'));\n\t\t};\n\n\t\tvar response:Dynamic = marketplace.getUserAccount();\n\n\t\tif (response.error)\n\t\t{\n\t\t\tresponse.customError = \"Could not validate your account, please verify your account information\";\n\t\t\terror(response);\n\t\t}\n\n\t\t// Log.println (\"OK\");\n\n\t\tvar apps:List<Dynamic> = Lambda.filter(marketplace.getUserApps(), function(obj) return appName == Reflect.field(obj.name, \"en-US\"));\n\n\t\tif (!forceUpload && apps.length > 0)\n\t\t{\n\t\t\tvar app = apps.first();\n\n\t\t\tLog.println(\"This application has already been submitted to the Firefox Marketplace.\");\n\t\t\tanswer = CLIHelper.ask(\"Do you want to open the edit page?\", [\"y\", \"n\"]);\n\n\t\t\tif (answer == YES)\n\t\t\t{\n\t\t\t\tSystem.openURL(baseUrl + '/developers/app/${app.slug}/edit');\n\t\t\t}\n\n\t\t\tSys.exit(0);\n\t\t}\n\n\t\t// Log.println (\"Submitting \\\"\" + appName + \"\\\" to the Firefox \" + (devServer ? \"development\" : \"production\") + \" server\");\n\n\t\tvar packagedFile = compress(project);\n\n\t\tresponse = marketplace.submitForValidation(packagedFile);\n\n\t\tif (response.error || response.id == null)\n\t\t{\n\t\t\terror(response);\n\t\t}\n\n\t\tvar uploadID = response.id;\n\n\t\tLog.println(\"\");\n\t\t// Log.print ('Server validation ($uploadID)');\n\t\tLog.print(\"Waiting for server\");\n\n\t\tdo\n\t\t{\n\t\t\tLog.print(\".\");\n\t\t\tresponse = marketplace.checkValidationStatus(uploadID);\n\t\t\tSys.sleep(1);\n\t\t}\n\t\twhile (!response.processed);\n\n\t\tLog.println(\"\");\n\n\t\tif (response.valid)\n\t\t{\n\t\t\t// Log.println (\" VALID\");\n\t\t\tLog.info(\"Sending application details...\");\n\t\t\tresponse = marketplace.createApp(uploadID);\n\n\t\t\tif (response.error || response.id == null)\n\t\t\t{\n\t\t\t\t// Log.println (\"ERROR\");\n\t\t\t\terror(response);\n\t\t\t}\n\n\t\t\tappID = response.id;\n\t\t\tappSlug = response.slug;\n\n\t\t\t// Log.println (\"OK\");\n\t\t\t// Log.print (\"Updating application information... \");\n\t\t\tresponse = marketplace.updateAppInformation(appID, project);\n\n\t\t\tif (response.error)\n\t\t\t{\n\t\t\t\t// Log.println (\"ERROR\");\n\t\t\t\terror(response);\n\t\t\t}\n\n\t\t\t// Log.println (\"OK\");\n\t\t\t// Log.println (\"Updating screenshots:\");\n\n\t\t\tvar screenshots:Array<String> = project.config.getArrayString(\"firefox-marketplace.screenshots.screenshot\", \"path\");\n\n\t\t\tfor (i in 0...screenshots.length)\n\t\t\t{\n\t\t\t\tresponse = marketplace.uploadScreenshot(appID, i, screenshots[i]);\n\t\t\t\tLog.println(\"\");\n\n\t\t\t\tif (response.error)\n\t\t\t\t{\n\t\t\t\t\terror(response);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar urlApp = baseUrl + '/app/$appSlug/';\n\t\t\tvar devUrlApp = baseUrl + '/developers/app/$appSlug/';\n\t\t\tvar urlContentRatings = devUrlApp + \"content_ratings/edit\";\n\n\t\t\tvar havePayments = project.config.getString(\"firefox-marketplace.premium-type\", \"free\") != cast PremiumType.FREE;\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.info(\"Application submitted!\");\n\t\t\tSys.sleep(1);\n\t\t\tLog.println(\"\");\n\t\t\tLog.info(\"Before the application is fully published, you will need to fill out a content\");\n\t\t\tLog.info(\"rating questionnaire, and send the application for review\");\n\t\t\tLog.println(\"\");\n\t\t\tvar answer = CLIHelper.ask(\"Would you like to complete your submission now?\");\n\n\t\t\tif (answer == YES || answer == ALWAYS)\n\t\t\t{\n\t\t\t\tif (Log.verbose) Log.println(\"\");\n\t\t\t\tSystem.openURL(urlContentRatings);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.println(\"\");\n\t\t\t\tLog.info(\"You can complete your submission later by going to \" + devUrlApp);\n\t\t\t}\n\n\t\t\t/*\n\t\t\t\tLog.println (\"\");\n\t\t\t\tLog.warn (\"Before this application can be reviewed & published:\");\n\t\t\t\tLog.warn (\"* You will need to fill the contents rating questionnaire *\");\n\n\t\t\t\tif (havePayments) Log.warn (\"* You will need to add or link a payment account *\");\n\n\t\t\t\tLog.println (\"\");\n\t\t\t\tLog.println (\"1. Open the contents rating questionnaire page.\");\n\t\t\t\tLog.println (\"2. Open the application edit page.\");\n\t\t\t\tLog.println (\"3. Open the application listing page.\");\n\t\t\t\tLog.println (\"q. I'm fine, thanks.\");\n\n\t\t\t\tanswer = CLIHelper.ask (\"Open the questionnaire now?\", [\"1\", \"2\", \"3\", \"q\"]);\n\n\t\t\t\tswitch (answer) {\n\n\t\t\t\t\tcase CUSTOM (x):\n\n\t\t\t\t\t\tswitch (x) {\n\n\t\t\t\t\t\t\tcase \"1\": System.openURL (urlContentRatings);\n\t\t\t\t\t\t\tcase \"2\": System.openURL (devUrlApp);\n\t\t\t\t\t\t\tcase \"3\": System.openURL (urlApp);\n\t\t\t\t\t\t\tcase _:\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\n\n\t\t\t\t}\n\n\t\t\t\tLog.println (\"\");\n\t\t\t\tLog.println (\"Your application listing page is:\");\n\t\t\t\tLog.println ('$urlApp');\n\t\t\t\tLog.println (\"\");\n\t\t\t\tLog.println (\"Goodbye!\"); */\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Log.println (\" FAILED\");\n\t\t\tLog.println(\"\");\n\n\t\t\tvar errorMsg = \"Application failed server validation\";\n\n\t\t\tvar errors:List<Dynamic> = Lambda.filter(response.validation.messages, function(m) return m.type == \"error\");\n\t\t\tvar n = 1;\n\n\t\t\tfor (error in errors)\n\t\t\t{\n\t\t\t\terrorMsg += ('\\n * ${error.description.join(\" \")}');\n\t\t\t}\n\n\t\t\t// errorMsg += \"\\nPlease refer to the documentation to fix the issues.\";\n\t\t\tmarketplace.close();\n\t\t\tLog.error(errorMsg);\n\t\t}\n\n\t\tmarketplace.close();\n\t}\n\n\tpublic static function setup(askServer:Bool = true, devServer:Bool = false, defines:Map<String, String> = null):Void\n\t{\n\t\tif (defines == null)\n\t\t{\n\t\t\tdefines = PlatformSetup.getDefines();\n\t\t}\n\n\t\tvar existsProd = defines.exists(\"FIREFOX_MARKETPLACE_KEY\") && defines.exists(\"FIREFOX_MARKETPLACE_SECRET\");\n\t\tvar existsDev = defines.exists(\"FIREFOX_MARKETPLACE_DEV_KEY\") && defines.exists(\"FIREFOX_MARKETPLACE_DEV_SECRET\");\n\n\t\t// TODO warning about the override of the account\n\n\t\tLog.println(\"You need to link your developer account to publish to the Firefox Marketplace\");\n\t\tvar answer = CLIHelper.ask(\"Would you like to open the developer site now?\");\n\n\t\tif (answer == YES || answer == ALWAYS)\n\t\t{\n\t\t\tvar server = \"\";\n\n\t\t\t/*if (askServer) {\n\n\t\t\t\tLog.println (\"\");\n\t\t\t\tLog.println (\"First of all you need to select the server you want to setup your account.\");\n\t\t\t\tLog.println (\"Each server has its own configuration and can't be shared.\");\n\t\t\t\tLog.println (\"\\t1. Production server (\" + FirefoxHelper.PRODUCTION_SERVER_URL + \")\");\n\t\t\t\tLog.println (\"\\t2. Development server (\" + FirefoxHelper.DEVELOPMENT_SERVER_URL + \")\");\n\t\t\t\tLog.println(\"\\tq. Cancel\");\n\t\t\t\tanswer = CLIHelper.ask (\"Choose the server to setup your Firefox Marketplace account.\", [\"1\", \"2\", \"q\"]);\n\n\t\t\t} else {*/\n\n\t\t\tanswer = devServer ? CUSTOM(\"2\") : CUSTOM(\"1\");\n\n\t\t\t// }\n\n\t\t\tswitch (answer)\n\t\t\t{\n\t\t\t\tcase CUSTOM(\"1\"):\n\t\t\t\t\tserver = FirefoxHelper.PRODUCTION_SERVER_URL;\n\t\t\t\t\tdevServer = false;\n\n\t\t\t\tcase CUSTOM(\"2\"):\n\t\t\t\t\tserver = FirefoxHelper.DEVELOPMENT_SERVER_URL;\n\t\t\t\t\tdevServer = true;\n\n\t\t\t\tdefault:\n\t\t\t\t\tSys.exit(0);\n\t\t\t}\n\n\t\t\t/*if ((existsProd && !devServer) || (existsDev && devServer)) {\n\n\t\t\t\tLog.info (\"\");\n\t\t\t\tLog.warn (\"You will override your account settings!\");\n\t\t\t\tanswer = CLIHelper.ask (\"Are you sure?\", [\"y\", \"n\"]);\n\n\t\t\t\tif (answer == NO) {\n\n\t\t\t\t\tSys.exit (0);\n\n\t\t\t\t}\n\n\t\t\t}*/\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.info(\"Opening \\\"\" + server + \"/developers/api\\\"...\");\n\t\t\tLog.println(\"\");\n\t\t\tLog.info(\" * Create a new account or login\");\n\t\t\tLog.info(\" * Choose \\\"Command line\\\" as the client type then press \\\"Create\\\"\");\n\n\t\t\tSys.sleep(3);\n\t\t\tif (Log.verbose) Log.println(\"\");\n\t\t\tSystem.openURL(server + \"/developers/api\");\n\t\t\tSys.sleep(2);\n\n\t\t\tLog.println(\"\");\n\t\t\tLog.info(\"\\x1b[1mPress any key to continue\\x1b[0m\");\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSys.stdin().readLine();\n\t\t\t}\n\t\t\tcatch (e:Dynamic)\n\t\t\t{\n\t\t\t\tSys.exit(0);\n\t\t\t}\n\t\t}\n\n\t\tvar key = StringTools.trim(CLIHelper.param(\"OAuth Key\"));\n\t\tvar secret = StringTools.trim(CLIHelper.param(\"OAuth Secret\"));\n\n\t\tLog.println(\"\");\n\n\t\tvar marketplace = new MarketplaceAPI(key, secret, devServer);\n\t\tvar name:String = \"\";\n\t\tvar account:Dynamic;\n\t\tvar valid = false;\n\n\t\tdo\n\t\t{\n\t\t\tLog.println(\"Checking account...\");\n\t\t\taccount = marketplace.getUserAccount();\n\n\t\t\tif (account != null && account.display_name != null)\n\t\t\t{\n\t\t\t\tname = account.display_name;\n\t\t\t\tvalid = true;\n\t\t\t}\n\n\t\t\tif (!valid)\n\t\t\t{\n\t\t\t\tLog.println(\"There was a problem connecting to your developer account\");\n\t\t\t\tanswer = CLIHelper.ask(\"Would you like to try again?\");\n\n\t\t\t\tif (answer == YES)\n\t\t\t\t{\n\t\t\t\t\tLog.println(\"\");\n\t\t\t\t\tkey = StringTools.trim(CLIHelper.param(\"OAuth Key\"));\n\t\t\t\t\tsecret = StringTools.trim(CLIHelper.param(\"OAuth Secret\"));\n\t\t\t\t\tLog.println(\"\");\n\n\t\t\t\t\tmarketplace.client.consumer.key = key;\n\t\t\t\t\tmarketplace.client.consumer.secret = secret;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmarketplace.close();\n\t\t\t\t\tSys.exit(0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\twhile (!valid);\n\n\t\tLog.println(\"Hello \" + name + \"!\");\n\n\t\tLog.mute = true;\n\t\tdefines = PlatformSetup.getDefines();\n\t\tLog.mute = false;\n\n\t\tdefines.set(\"FIREFOX_MARKETPLACE\" + (devServer ? \"_DEV_\" : \"_\") + \"KEY\", key);\n\t\tdefines.set(\"FIREFOX_MARKETPLACE\" + (devServer ? \"_DEV_\" : \"_\") + \"SECRET\", secret);\n\n\t\tPlatformSetup.writeConfig(defines.get(\"LIME_CONFIG\"), defines);\n\t\tLog.println(\"\");\n\t}\n}\n\nclass FirefoxHelper\n{\n\tpublic static inline var PRODUCTION_SERVER_URL = \"https://marketplace.firefox.com\";\n\tpublic static inline var DEVELOPMENT_SERVER_URL = \"https://marketplace-dev.allizom.org\";\n\tprivate static inline var TITLE_MAX_CHARS = 127;\n\tprivate static inline var MAX_CATEGORIES = 2;\n\tprivate static var MIN_WH_SCREENSHOT = {width: 320, height: 480};\n\n\tprivate static function isScreenshotValid(path:String):Bool\n\t{\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\tvar img = Image.fromFile(path);\n\t\t\tvar portrait = img.width >= MIN_WH_SCREENSHOT.width && img.height >= MIN_WH_SCREENSHOT.height;\n\t\t\tvar landscape = img.width >= MIN_WH_SCREENSHOT.height && img.height >= MIN_WH_SCREENSHOT.width;\n\t\t\treturn portrait || landscape;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic static function validate(project:HXProject):{errors:Array<String>, warnings:Array<String>}\n\t{\n\t\tvar errors:Array<String> = [];\n\t\tvar warnings:Array<String> = [];\n\n\t\t// We will check if the project has the minimal required fields for publishing to the Firefox Marketplace\n\n\t\tif (project.meta.title == \"\")\n\t\t{\n\t\t\terrors.push(\"You need to have a title\\n\\n\\t<meta title=\\\"Hello World\\\"/>\\n\");\n\t\t}\n\n\t\tif (project.meta.title.length > TITLE_MAX_CHARS)\n\t\t{\n\t\t\terrors.push(\"Your title is too long (max \" + TITLE_MAX_CHARS + \" characters)\\n\");\n\t\t}\n\n\t\tif (project.config.getString(\"firefox-marketplace.description\", project.meta.description) == \"\")\n\t\t{\n\t\t\terrors.push(\"You need to have a description\\n\\n\\t<meta description=\\\"My description\\\"/>\\n\");\n\t\t}\n\n\t\tif (project.meta.company == \"\")\n\t\t{\n\t\t\terrors.push(\"You need to have a company name\\n\\n\\t<meta company=\\\"Company Name\\\"/>\\n\");\n\t\t}\n\n\t\tif (project.meta.companyUrl == \"\")\n\t\t{\n\t\t\terrors.push(\"You need to have a company URL\\n\\n\\t<meta company-url=\\\"http://www.company.com\\\"/>\\n\");\n\t\t}\n\n\t\tvar categories = project.config.getArrayString(\"firefox-marketplace.categories.category\", \"name\");\n\n\t\tif (categories.length == 0)\n\t\t{\n\t\t\terrors.push(\"You need to have at least one category\\n\\n\\t<config type=\\\"firefox-marketplace\\\">\\n\\t   <categories>\\n\\t      <category name=\\\"games\\\"/>\\n\\t   </categories>\\n\\t</config>\\n\");\n\t\t}\n\t\telse if (categories.length > MAX_CATEGORIES)\n\t\t{\n\t\t\terrors.push(\"You cannot have more than two categories\");\n\t\t}\n\n\t\tif (project.config.getString(\"firefox-marketplace.privacyPolicy\") == \"\")\n\t\t{\n\t\t\terrors.push(\"You need to have a privacy policy\\n\\n\\t<config type=\\\"firefox-marketplace\\\">\\n\\t   <privacyPolicy>Policy detail</privacyPolicy>\\n\\t</config>\\n\");\n\t\t}\n\n\t\tif (project.config.getString(\"firefox-marketplace.support.email\") == \"\")\n\t\t{\n\t\t\terrors.push(\"You need to have a support email address\\n\\n\\t<config type=\\\"firefox-marketplace\\\">\\n\\t   <support email=\\\"support@company.com\\\"/>\\n\\t</config>\\n\");\n\t\t}\n\n\t\tvar screenshots = project.config.getArrayString(\"firefox-marketplace.screenshots.screenshot\", \"path\");\n\n\t\tif (screenshots.length == 0)\n\t\t{\n\t\t\terrors.push(\"You need to have at least one screenshot\\n\\n\\t<config type=\\\"firefox-marketplace\\\">\\n\\t   <screenshots>\\n\\t      <screenshot path=\\\"screenshot.png\\\"/>\\n\\t   </screenshots>\\n\\t</config>\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (path in screenshots)\n\t\t\t{\n\t\t\t\tif (!isScreenshotValid(path))\n\t\t\t\t{\n\t\t\t\t\tif (!FileSystem.exists(path))\n\t\t\t\t\t{\n\t\t\t\t\t\terrors.push(\"Screenshot \\\"\" + Path.withoutDirectory(path) + \"\\\" does not exist\\n\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\terrors.push(\"Screenshot \\\"\" + Path.withoutDirectory(path) + \"\\\" must be at least 320 x 480 in size\\n\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {errors: errors, warnings: warnings};\n\t}\n}\n\nclass MarketplaceAPI\n{\n\tprivate static inline var API_PATH = \"/api/v1/\";\n\n\tpublic var client:OAuthClient;\n\n\tprivate var loader:URLLoader;\n\tprivate var entryPoint:String;\n\n\tpublic function new(key:String = null, secret:String = null, devServer:Bool = false)\n\t{\n\t\tloader = new URLLoader();\n\n\t\tif (key != null && secret != null)\n\t\t{\n\t\t\tclient = new OAuthClient(OAuthVersion.V1, new OAuthConsumer(key, secret));\n\t\t}\n\n\t\tentryPoint = (devServer ? FirefoxHelper.DEVELOPMENT_SERVER_URL : FirefoxHelper.PRODUCTION_SERVER_URL) + API_PATH;\n\t}\n\n\tpublic function checkValidationStatus(uploadID:String):Dynamic\n\t{\n\t\tvar response = load(GET, 'apps/validation/$uploadID/', null);\n\t\treturn response;\n\t}\n\n\tpublic function close():Void\n\t{\n\t\tloader.close();\n\t}\n\n\tpublic function createApp(uploadID:String):Dynamic\n\t{\n\t\tvar response = load(POST, 'apps/app/', Json.stringify({upload: uploadID}));\n\t\treturn response;\n\t}\n\n\tpublic function customRequest(method:URLRequestMethod, path:String, ?data:Dynamic):URLRequest\n\t{\n\t\tvar request:URLRequest;\n\n\t\tif (client == null)\n\t\t{\n\t\t\trequest = new URLRequest(entryPoint + path);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trequest = client.createRequest(method, entryPoint + path);\n\t\t}\n\n\t\trequest.method = method;\n\t\trequest.data = data;\n\t\trequest.contentType = \"application/json\";\n\n\t\treturn request;\n\t}\n\n\tpublic function getUserAccount():Dynamic\n\t{\n\t\tvar response = load(GET, \"account/settings/mine/\", null);\n\t\treturn response;\n\t}\n\n\tpublic function getUserApps():Array<Dynamic>\n\t{\n\t\tvar result:Array<Dynamic> = [];\n\t\tvar response = load(GET, 'apps/app/', null);\n\n\t\tif (!response.error && response.objects != null)\n\t\t{\n\t\t\tfor (obj in cast(response.objects, Array<Dynamic>))\n\t\t\t{\n\t\t\t\tresult.push(obj);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate function load(method:URLRequestMethod, path:String, data:String = null, progressMsg:String = null):Dynamic\n\t{\n\t\tvar response:Dynamic = {};\n\t\tvar status = 0;\n\t\tvar request = customRequest(method, path, data);\n\t\tvar withProgress = progressMsg != null && progressMsg.length > 0 && data != null;\n\n\t\tvar uploadingFunc:URLLoader->Int->Int->Void = null;\n\n\t\tif (withProgress)\n\t\t{\n\t\t\tuploadingFunc = function(l, up, dl) CLIHelper.progress('$progressMsg', up, data.length);\n\t\t\tloader.onProgress.add(uploadingFunc);\n\t\t}\n\n\t\tloader.onHTTPStatus.add(function(_, s) status = s, true);\n\n\t\tloader.onComplete.add(function(l)\n\t\t{\n\t\t\tresponse = Json.parse(l.data);\n\n\t\t\tif (withProgress) l.onProgress.remove(uploadingFunc);\n\t\t}, true);\n\n\t\tloader.load(request);\n\n\t\tresponse.error = false;\n\n\t\tif (status >= 400)\n\t\t{\n\t\t\tresponse.error = true;\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tpublic function submitForValidation(path:String, type:String = \"application/zip\"):Dynamic\n\t{\n\t\tvar p = new Path(path);\n\t\tvar response:Dynamic = {};\n\n\t\tif (FileSystem.exists(path) && p.ext == \"zip\")\n\t\t{\n\t\t\tvar base = Base64.encode(File.getBytes(path));\n\t\t\tvar filename = p.file + \".\" + p.ext;\n\n\t\t\tvar upload =\n\t\t\t\t{\n\t\t\t\t\tupload:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\t\tname: filename,\n\t\t\t\t\t\t\tdata: base\n\t\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\tresponse = load(POST, \"apps/validation/\", Json.stringify(upload), \"Uploading:\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresponse.error = true;\n\t\t\tresponse.customError = 'File $path doesn\\'t exist';\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tpublic function updateAppInformation(appID:Int, project:HXProject):Dynamic\n\t{\n\t\tvar object =\n\t\t\t{\n\t\t\t\tname: project.meta.title,\n\t\t\t\tcategories: project.config.getArrayString(\"firefox-marketplace.categories.category\", \"name\"),\n\t\t\t\tdescription: project.config.getString(\"firefox-marketplace.description\", project.meta.description),\n\t\t\t\tprivacy_policy: project.config.getString(\"firefox-marketplace.privacyPolicy\"),\n\t\t\t\thomepage: project.config.getString(\"firefox-marketplace.homepage\"),\n\t\t\t\tsupport_url: project.config.getString(\"firefox-marketplace.support.url\"),\n\t\t\t\tsupport_email: project.config.getString(\"firefox-marketplace.support.email\"),\n\t\t\t\tdevice_types: project.config.getArrayString(\"firefox-marketplace.devices.device\", \"type\", [\"firefoxos\", \"desktop\"]),\n\t\t\t\tpremium_type: project.config.getString(\"firefox-marketplace.premium-type\", \"free\"),\n\t\t\t\tprice: project.config.getString(\"firefox-marketplace.config.price\", \"0.99\"),\n\t\t\t};\n\n\t\tvar response = load(PUT, 'apps/app/$appID/', Json.stringify(object));\n\t\treturn response;\n\t}\n\n\tpublic function uploadScreenshot(appID:Int, position:Int, path:String):Dynamic\n\t{\n\t\tvar response:Dynamic = {};\n\n\t\tif (FileSystem.exists(path))\n\t\t{\n\t\t\tvar p = new Path(path);\n\t\t\tvar type = p.ext == \"png\" ? \"image/png\" : \"image/jpeg\";\n\t\t\tvar base = Base64.encode(File.getBytes(path));\n\t\t\tvar filename = p.file + \".\" + p.ext;\n\n\t\t\tvar screenshot =\n\t\t\t\t{\n\t\t\t\t\tposition: position,\n\t\t\t\t\tfile:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\t\tname: filename,\n\t\t\t\t\t\t\tdata: base,\n\t\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\tresponse = load(POST, 'apps/app/$appID/preview/', Json.stringify(screenshot), 'Uploading screenshot:');\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresponse.error = true;\n\t\t\tresponse.customError = 'File \"$path\" does not exist';\n\t\t}\n\n\t\treturn response;\n\t}\n}\n\n@:enum abstract DeviceType(String)\n{\n\tvar FIREFOXOS = \"firefoxos\";\n\tvar DESKTOP = \"desktop\";\n\tvar MOBILE = \"mobile\";\n\tvar TABLET = \"tablet\";\n}\n\n@:enum abstract PremiumType(String)\n{\n\tvar FREE = \"free\";\n\tvar FREE_INAPP = \"free-inapp\";\n\tvar PREMIUM = \"premium\";\n\tvar PREMIUM_INAPP = \"premium-inapp\";\n\tvar OTHER = \"other\";\n}\n"
  }
]